summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/3rdparty/CMakeLists.txt26
-rw-r--r--src/3rdparty/freetype/CMakeLists.txt101
-rw-r--r--src/3rdparty/freetype/freetype.pro12
-rw-r--r--src/3rdparty/gradle/CMakeLists.txt21
-rw-r--r--src/3rdparty/harfbuzz-ng/.prev_CMakeLists.txt154
-rw-r--r--src/3rdparty/harfbuzz-ng/AUTHORS15
-rw-r--r--src/3rdparty/harfbuzz-ng/CMakeLists.txt155
-rw-r--r--src/3rdparty/harfbuzz-ng/COPYING3
-rw-r--r--src/3rdparty/harfbuzz-ng/NEWS523
-rw-r--r--src/3rdparty/harfbuzz-ng/README15
-rw-r--r--src/3rdparty/harfbuzz-ng/README.md34
-rw-r--r--src/3rdparty/harfbuzz-ng/THANKS2
-rw-r--r--src/3rdparty/harfbuzz-ng/TODO43
-rw-r--r--src/3rdparty/harfbuzz-ng/config.h13
-rw-r--r--src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro132
-rw-r--r--src/3rdparty/harfbuzz-ng/hb-dummy.cc8
-rw-r--r--src/3rdparty/harfbuzz-ng/patches/0001-Qt-specific-workaround-for-AAT-shaper.patch58
-rw-r--r--src/3rdparty/harfbuzz-ng/qt_attribution.json5
-rw-r--r--src/3rdparty/harfbuzz-ng/src/dump-indic-data.cc43
-rw-r--r--src/3rdparty/harfbuzz-ng/src/dump-khmer-data.cc41
-rw-r--r--src/3rdparty/harfbuzz-ng/src/dump-myanmar-data.cc43
-rw-r--r--src/3rdparty/harfbuzz-ng/src/dump-use-data.cc38
-rw-r--r--src/3rdparty/harfbuzz-ng/src/harfbuzz-config.cmake.in86
-rw-r--r--src/3rdparty/harfbuzz-ng/src/harfbuzz-gobject.pc.in12
-rw-r--r--src/3rdparty/harfbuzz-ng/src/harfbuzz-icu.pc.in13
-rw-r--r--src/3rdparty/harfbuzz-ng/src/harfbuzz-subset.pc.in12
-rw-r--r--src/3rdparty/harfbuzz-ng/src/harfbuzz.cc53
-rw-r--r--src/3rdparty/harfbuzz-ng/src/harfbuzz.pc.in13
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-fdsc-table.hh126
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout-ankr-table.hh98
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout-bsln-table.hh158
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout-common.hh841
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout-feat-table.hh214
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout-just-table.hh417
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout-kerx-table.hh1001
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout-lcar-table.hh162
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout-morx-table.hh1153
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout-opbd-table.hh173
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh230
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc388
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout.h486
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-layout.hh81
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-ltag-table.hh92
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-map.cc75
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat-map.hh91
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-aat.h38
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-algs.hh1059
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-array.hh382
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-atomic-private.hh189
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-atomic.hh295
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-bimap.hh166
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-blob.cc392
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-blob.h9
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-blob.hh97
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh20
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.rl132
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text.hh26
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text.rl126
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer-private.hh388
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer-serialize.cc132
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer.cc335
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer.h81
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-buffer.hh451
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-cache-private.hh74
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-cache.hh80
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh691
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh906
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-cff-interp-dict-common.hh216
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-cff1-interp-cs.hh161
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-cff2-interp-cs.hh271
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-common.cc469
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-common.h124
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-config.hh162
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-coretext.cc574
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-debug.hh143
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-deprecated.h134
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-directwrite.cc979
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-directwrite.h40
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-dispatch.hh58
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-dsalgs.hh167
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-face-private.hh111
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-face.cc419
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-face.h54
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-face.hh109
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-fallback-shape.cc48
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-font-private.hh555
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-font.cc994
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-font.h151
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-font.hh631
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ft.cc884
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ft.h132
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-gdi.cc73
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-gdi.h39
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-glib.cc411
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-glib.h56
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-gobject-enums.cc.tmpl80
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-gobject-enums.h.tmpl56
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc101
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.h142
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-gobject.h40
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc430
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-graphite2.h52
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-icu.cc363
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-icu.h52
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-iter.hh939
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-kern.hh139
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-machinery.hh323
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-map.cc268
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-map.h104
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-map.hh328
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-meta.hh400
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-mutex-private.hh141
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-mutex.hh134
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-null.hh184
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-number-parser.hh240
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-number-parser.rl139
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-number.cc147
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-number.hh41
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-object-private.hh196
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-object.hh342
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-open-file-private.hh280
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-open-file.hh526
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh1184
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-open-type.hh1065
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-cbdt-table.hh471
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh653
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc396
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh1320
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.cc146
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh570
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh1230
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-color-cbdt-table.hh535
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-color-colr-table.hh138
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-color-cpal-table.hh193
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-color-sbix-table.hh293
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-color-svg-table.hh124
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-color.cc321
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-color.h139
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-deprecated.h111
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-face-table-list.hh139
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-face.cc58
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-face.hh74
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc345
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-gasp-table.hh84
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-glyf-table.hh1070
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh178
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-head-table.hh63
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh47
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh293
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-kern-table.hh474
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh509
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common-private.hh1772
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh2635
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gdef-table.hh243
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh1098
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh1361
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh2373
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos.hh3009
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-jstf-table.hh53
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-math-table.hh722
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout-private.hh635
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc1728
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h181
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-layout.hh627
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-map-private.hh251
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-map.cc153
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-map.hh284
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-math-table.hh284
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-math.cc218
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-math.h23
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-maxp-table.hh93
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-meta-table.hh126
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-meta.cc77
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-meta.h71
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.cc231
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.h122
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.hh35
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-name-language-static.hh465
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-name-language.hh40
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-name-table.hh323
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-name.cc228
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-name.h129
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-os2-table.hh294
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-os2-unicode-ranges.hh247
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-post-macroman.hh2
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-post-table.hh197
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-fallback.hh94
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-private.hh50
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-table.hh47
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-win1256.hh2
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc144
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.hh50
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-default.cc11
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc60
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc29
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh1656
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.rl126
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-private.hh190
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-table.cc161
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc827
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.hh435
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer-machine.hh372
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer-machine.rl113
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer.cc461
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer.hh113
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh304
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.rl127
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc344
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.hh171
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh396
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc27
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc63
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-machine.hh629
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-machine.rl195
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-private.hh97
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-table.cc267
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use.cc328
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use.hh105
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-vowel-constraints.cc449
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-vowel-constraints.hh39
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex.hh397
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback-private.hh53
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc240
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.hh54
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize-private.hh69
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc257
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.hh70
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape-private.hh108
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc835
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-shape.hh169
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-stat-table.hh344
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-tag-table.hh2065
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-tag.cc1199
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-tag.h59
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-var-avar-table.hh93
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-var-fvar-table.hh290
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-var-gvar-table.hh717
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-var-hvar-table.hh58
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-var-mvar-table.hh41
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-var.cc131
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-var.h89
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot-vorg-table.hh135
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ot.h6
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-pool.hh102
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-private.hh899
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-sanitize.hh401
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-serialize.hh466
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-set-digest-private.hh179
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-set-digest.hh174
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-set-private.hh577
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-set.cc109
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-set.h25
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-set.hh764
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shape-plan-private.hh67
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc493
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shape-plan.hh76
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shape.cc93
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shaper-impl-private.hh43
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shaper-impl.hh38
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh14
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shaper-private.hh124
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shaper.cc81
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-shaper.hh134
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-static.cc76
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-string-array.hh12
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc227
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.hh1025
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.cc1127
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.hh38
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.cc632
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.hh38
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset-input.cc208
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh59
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset-plan.cc266
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset-plan.hh165
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset.cc309
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset.h88
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-subset.hh69
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ucd-table.hh6696
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-ucd.cc246
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-unicode-emoji-table.hh78
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-unicode-private.hh371
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-unicode.cc169
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-unicode.h103
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-unicode.hh398
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-uniscribe.cc1027
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-uniscribe.h46
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-utf-private.hh282
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-utf.hh453
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-vector.hh310
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-version.h6
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-version.h.in66
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-warning.cc39
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb.h5
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb.hh616
-rw-r--r--src/3rdparty/harfbuzz-ng/src/main.cc207
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-algs.cc95
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-bimap.cc76
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-buffer-serialize.cc98
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-gpos-size-params.cc63
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-gsub-would-substitute.cc68
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-iter.cc286
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-meta.cc128
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-number.cc253
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-ot-color.cc348
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-ot-meta.cc70
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-ot-name.cc76
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test-unicode-ranges.cc66
-rw-r--r--src/3rdparty/harfbuzz-ng/src/test.cc98
-rw-r--r--src/3rdparty/harfbuzz/.gitignore20
-rw-r--r--src/3rdparty/harfbuzz/AUTHORS6
-rw-r--r--src/3rdparty/harfbuzz/COPYING24
-rw-r--r--src/3rdparty/harfbuzz/Makefile.am2
-rw-r--r--src/3rdparty/harfbuzz/README7
-rwxr-xr-xsrc/3rdparty/harfbuzz/autogen.sh116
-rw-r--r--src/3rdparty/harfbuzz/configure.ac54
-rw-r--r--src/3rdparty/harfbuzz/qt_attribution.json15
-rw-r--r--src/3rdparty/harfbuzz/src/.gitignore7
-rw-r--r--src/3rdparty/harfbuzz/src/Makefile.am69
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-arabic.c1153
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-buffer-private.h107
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-buffer.c383
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-buffer.h94
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-dump-main.c97
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-dump.c767
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-dump.h41
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-external.h86
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h126
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gdef.c1163
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gdef.h132
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-global.h118
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h733
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gpos.c6275
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gpos.h155
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-greek.c451
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h475
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gsub.c4329
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gsub.h139
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-hangul.c268
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-hebrew.c187
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-impl.c84
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-impl.h131
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp1899
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-khmer.c667
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-myanmar.c538
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-open-private.h102
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-open.c1433
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-open.h280
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-shape.h199
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-shaper-all.cpp37
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-shaper-private.h174
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp1111
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-shaper.h277
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-stream-private.h81
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-stream.c114
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-stream.h43
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-thai.c460
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-tibetan.c277
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz.c32
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz.h38
-rw-r--r--src/3rdparty/harfbuzz/tests/Makefile.am7
-rw-r--r--src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc124
-rw-r--r--src/3rdparty/harfbuzz/tests/shaping/.gitignore2
-rw-r--r--src/3rdparty/harfbuzz/tests/shaping/Makefile.am14
-rw-r--r--src/3rdparty/harfbuzz/tests/shaping/README9
-rw-r--r--src/3rdparty/harfbuzz/tests/shaping/harfbuzz-qt.cpp57
-rw-r--r--src/3rdparty/harfbuzz/tests/shaping/main.cpp1317
-rw-r--r--src/3rdparty/libpng/CMakeLists.txt54
-rw-r--r--src/3rdparty/pcre2/CMakeLists.txt72
-rw-r--r--src/3rdparty/pcre2/pcre2.pri41
-rw-r--r--src/3rdparty/pcre2/pcre2.pro44
-rw-r--r--src/CMakeLists.txt70
-rw-r--r--src/android/CMakeLists.txt14
-rw-r--r--src/android/jar/.prev_CMakeLists.txt30
-rw-r--r--src/android/jar/CMakeLists.txt31
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java6
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java63
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtLayout.java31
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtNative.java51
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java2
-rw-r--r--src/android/java/CMakeLists.txt12
-rw-r--r--src/android/java/res/layout/splash.xml4
-rw-r--r--src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java9
-rw-r--r--src/android/templates/CMakeLists.txt19
-rw-r--r--src/angle/src/config.pri8
-rw-r--r--src/concurrent/CMakeLists.txt50
-rw-r--r--src/concurrent/concurrent.pro6
-rw-r--r--src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentfilter.cpp56
-rw-r--r--src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentmap.cpp37
-rw-r--r--src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentrun.cpp36
-rw-r--r--src/concurrent/doc/snippets/code/src_concurrent_qtconcurrenttask.cpp131
-rw-r--r--src/concurrent/doc/src/qtconcurrent-index.qdoc9
-rw-r--r--src/concurrent/qtaskbuilder.h172
-rw-r--r--src/concurrent/qtaskbuilder.qdoc101
-rw-r--r--src/concurrent/qtconcurrentcompilertest.h28
-rw-r--r--src/concurrent/qtconcurrentfilter.cpp123
-rw-r--r--src/concurrent/qtconcurrentfilter.h162
-rw-r--r--src/concurrent/qtconcurrentfilterkernel.h64
-rw-r--r--src/concurrent/qtconcurrentfunctionwrappers.h302
-rw-r--r--src/concurrent/qtconcurrentiteratekernel.cpp74
-rw-r--r--src/concurrent/qtconcurrentiteratekernel.h38
-rw-r--r--src/concurrent/qtconcurrentmap.cpp130
-rw-r--r--src/concurrent/qtconcurrentmap.h216
-rw-r--r--src/concurrent/qtconcurrentmapkernel.h74
-rw-r--r--src/concurrent/qtconcurrentmedian.h83
-rw-r--r--src/concurrent/qtconcurrentreducekernel.h12
-rw-r--r--src/concurrent/qtconcurrentrun.cpp8
-rw-r--r--src/concurrent/qtconcurrentrun.h847
-rw-r--r--src/concurrent/qtconcurrentrunbase.h26
-rw-r--r--src/concurrent/qtconcurrentstoredfunctioncall.h2208
-rw-r--r--src/concurrent/qtconcurrenttask.h75
-rw-r--r--src/concurrent/qtconcurrenttask.qdoc161
-rw-r--r--src/concurrent/qtconcurrentthreadengine.cpp9
-rw-r--r--src/concurrent/qtconcurrentthreadengine.h1
-rw-r--r--src/corelib/.prev_CMakeLists.txt1124
-rw-r--r--src/corelib/CMakeLists.txt1316
-rw-r--r--src/corelib/Qt5AndroidSupport.cmake2
-rw-r--r--src/corelib/Qt5CoreConfigExtras.cmake.in203
-rw-r--r--src/corelib/Qt6CTestMacros.cmake (renamed from src/corelib/Qt5CTestMacros.cmake)0
-rw-r--r--src/corelib/Qt6Config.cmake.in (renamed from src/corelib/Qt5Config.cmake.in)0
-rw-r--r--src/corelib/Qt6CoreConfigExtras.cmake.in44
-rw-r--r--src/corelib/Qt6CoreConfigExtrasMkspecDir.cmake.in (renamed from src/corelib/Qt5CoreConfigExtrasMkspecDir.cmake.in)0
-rw-r--r--src/corelib/Qt6CoreConfigExtrasMkspecDirForInstall.cmake.in (renamed from src/corelib/Qt5CoreConfigExtrasMkspecDirForInstall.cmake.in)0
-rw-r--r--src/corelib/Qt6CoreMacros.cmake1137
-rw-r--r--src/corelib/Qt6ModuleLocation.cmake.in (renamed from src/corelib/Qt5ModuleLocation.cmake.in)0
-rw-r--r--src/corelib/Qt6ModuleLocationForInstall.cmake.in (renamed from src/corelib/Qt5ModuleLocationForInstall.cmake.in)0
-rw-r--r--src/corelib/codecs/qutfcodec.cpp19
-rw-r--r--src/corelib/codecs/qutfcodec_p.h8
-rw-r--r--src/corelib/configure.cmake1048
-rw-r--r--src/corelib/configure.json59
-rw-r--r--src/corelib/doc/snippets/code/doc_src_containers.cpp16
-rw-r--r--src/corelib/doc/snippets/code/doc_src_properties.cpp2
-rw-r--r--src/corelib/doc/snippets/code/doc_src_qiterator.cpp71
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qdebug.cpp5
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_serialization_qcborstream.cpp8
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp103
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp8
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp16
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qlinkedlist.cpp214
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qregexp.cpp9
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp9
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qvector.cpp23
-rw-r--r--src/corelib/doc/snippets/qmetaobject-revision/window.h4
-rw-r--r--src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp3
-rw-r--r--src/corelib/doc/snippets/qstring/main.cpp8
-rw-r--r--src/corelib/doc/src/containers.qdoc159
-rw-r--r--src/corelib/doc/src/datastreamformat.qdoc3
-rw-r--r--src/corelib/doc/src/dontdocument.qdoc4
-rw-r--r--src/corelib/doc/src/includes/qdebug-toString.qdocinc9
-rw-r--r--src/corelib/doc/src/objectmodel/properties.qdoc4
-rw-r--r--src/corelib/global/global.pri3
-rw-r--r--src/corelib/global/qcompilerdetection.h22
-rw-r--r--src/corelib/global/qconfig-bootstrapped.h6
-rw-r--r--src/corelib/global/qconfig.cpp.in32
-rw-r--r--src/corelib/global/qendian.cpp2
-rw-r--r--src/corelib/global/qglobal.cpp16
-rw-r--r--src/corelib/global/qglobal.h70
-rw-r--r--src/corelib/global/qlibraryinfo.cpp6
-rw-r--r--src/corelib/global/qlibraryinfo.h1
-rw-r--r--src/corelib/global/qlogging.cpp12
-rw-r--r--src/corelib/global/qnamespace.h206
-rw-r--r--src/corelib/global/qnamespace.qdoc11
-rw-r--r--src/corelib/global/qnumeric_p.h6
-rw-r--r--src/corelib/global/qrandom.cpp4
-rw-r--r--src/corelib/global/qrandom.h2
-rw-r--r--src/corelib/global/qsimd.cpp (renamed from src/corelib/tools/qsimd.cpp)0
-rw-r--r--src/corelib/global/qsimd.h157
-rw-r--r--src/corelib/global/qsimd_p.h377
-rw-r--r--src/corelib/global/qsimd_x86.cpp155
-rw-r--r--src/corelib/global/qsimd_x86_p.h261
-rw-r--r--src/corelib/global/qtypeinfo.h1
-rw-r--r--src/corelib/io/io.pri5
-rw-r--r--src/corelib/io/qdebug.cpp14
-rw-r--r--src/corelib/io/qdebug.h42
-rw-r--r--src/corelib/io/qdir.cpp66
-rw-r--r--src/corelib/io/qdir.h44
-rw-r--r--src/corelib/io/qdiriterator.cpp2
-rw-r--r--src/corelib/io/qfile.cpp50
-rw-r--r--src/corelib/io/qfile.h107
-rw-r--r--src/corelib/io/qfileinfo.cpp81
-rw-r--r--src/corelib/io/qfileinfo.h38
-rw-r--r--src/corelib/io/qfileselector.cpp7
-rw-r--r--src/corelib/io/qfilesystemengine_win.cpp15
-rw-r--r--src/corelib/io/qfilesystemiterator_unix.cpp4
-rw-r--r--src/corelib/io/qfilesystemwatcher_polling.cpp25
-rw-r--r--src/corelib/io/qfilesystemwatcher_win.cpp39
-rw-r--r--src/corelib/io/qfilesystemwatcher_win_p.h2
-rw-r--r--src/corelib/io/qipaddress.cpp2
-rw-r--r--src/corelib/io/qprocess.cpp56
-rw-r--r--src/corelib/io/qprocess.h18
-rw-r--r--src/corelib/io/qresource.cpp10
-rw-r--r--src/corelib/io/qsettings.cpp8
-rw-r--r--src/corelib/io/qstandardpaths.cpp2
-rw-r--r--src/corelib/io/qtldurl.cpp137
-rw-r--r--src/corelib/io/qtldurl_p.h71
-rw-r--r--src/corelib/io/qurl.cpp47
-rw-r--r--src/corelib/io/qurl.h9
-rw-r--r--src/corelib/io/qurlquery.cpp2
-rw-r--r--src/corelib/io/qurlquery.h4
-rw-r--r--src/corelib/io/qurltlds_p.h14467
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.cpp61
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.h11
-rw-r--r--src/corelib/itemmodels/qabstractproxymodel.h6
-rw-r--r--src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp2
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel.cpp2
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel.h5
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.cpp351
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.h8
-rw-r--r--src/corelib/itemmodels/qtransposeproxymodel.cpp2
-rw-r--r--src/corelib/kernel/kernel.pri10
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp9
-rw-r--r--src/corelib/kernel/qeventdispatcher_win.cpp2
-rw-r--r--src/corelib/kernel/qmath.h55
-rw-r--r--src/corelib/kernel/qmetaobject.cpp236
-rw-r--r--src/corelib/kernel/qmetaobject.h5
-rw-r--r--src/corelib/kernel/qmetaobject_moc_p.h164
-rw-r--r--src/corelib/kernel/qmetaobject_p.h1
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp37
-rw-r--r--src/corelib/kernel/qmetatype.cpp1300
-rw-r--r--src/corelib/kernel/qmetatype.h873
-rw-r--r--src/corelib/kernel/qmetatype_p.h103
-rw-r--r--src/corelib/kernel/qobject.cpp149
-rw-r--r--src/corelib/kernel/qobject.h58
-rw-r--r--src/corelib/kernel/qobject_p.h12
-rw-r--r--src/corelib/kernel/qobjectdefs.h201
-rw-r--r--src/corelib/kernel/qobjectdefs_impl.h77
-rw-r--r--src/corelib/kernel/qproperty.cpp693
-rw-r--r--src/corelib/kernel/qproperty.h499
-rw-r--r--src/corelib/kernel/qproperty_p.h117
-rw-r--r--src/corelib/kernel/qpropertybinding.cpp175
-rw-r--r--src/corelib/kernel/qpropertybinding_p.h139
-rw-r--r--src/corelib/kernel/qpropertyprivate.h215
-rw-r--r--src/corelib/kernel/qsignalmapper.cpp101
-rw-r--r--src/corelib/kernel/qsignalmapper.h13
-rw-r--r--src/corelib/kernel/qtestsupport_core.h4
-rw-r--r--src/corelib/kernel/qtmetamacros.h234
-rw-r--r--src/corelib/kernel/qtranslator.cpp8
-rw-r--r--src/corelib/kernel/qvariant.cpp589
-rw-r--r--src/corelib/kernel/qvariant.h104
-rw-r--r--src/corelib/kernel/qvariant_p.h109
-rw-r--r--src/corelib/mimetypes/mimetypes_resources.cmake21
-rw-r--r--src/corelib/mimetypes/qmimedatabase.cpp4
-rw-r--r--src/corelib/mimetypes/qmimedatabase_p.h1
-rw-r--r--src/corelib/mimetypes/qmimetype.cpp2
-rw-r--r--src/corelib/mimetypes/qmimetype.h4
-rw-r--r--src/corelib/plugin/qfactoryinterface.cpp1
-rw-r--r--src/corelib/plugin/qlibrary.cpp4
-rw-r--r--src/corelib/plugin/quuid.cpp2
-rw-r--r--src/corelib/plugin/quuid.h2
-rw-r--r--src/corelib/serialization/qbinaryjsonvalue.cpp18
-rw-r--r--src/corelib/serialization/qbinaryjsonvalue_p.h4
-rw-r--r--src/corelib/serialization/qcborarray.cpp2
-rw-r--r--src/corelib/serialization/qcborarray.h2
-rw-r--r--src/corelib/serialization/qcborcommon.h4
-rw-r--r--src/corelib/serialization/qcbormap.cpp2
-rw-r--r--src/corelib/serialization/qcbormap.h2
-rw-r--r--src/corelib/serialization/qcborstreamwriter.cpp4
-rw-r--r--src/corelib/serialization/qcborvalue.cpp6
-rw-r--r--src/corelib/serialization/qcborvalue.h6
-rw-r--r--src/corelib/serialization/qcborvalue_p.h17
-rw-r--r--src/corelib/serialization/qdatastream.cpp2
-rw-r--r--src/corelib/serialization/qdatastream.h86
-rw-r--r--src/corelib/serialization/qjsonarray.cpp2
-rw-r--r--src/corelib/serialization/qjsonarray.h3
-rw-r--r--src/corelib/serialization/qjsoncbor.cpp24
-rw-r--r--src/corelib/serialization/qjsonobject.cpp2
-rw-r--r--src/corelib/serialization/qjsonobject.h2
-rw-r--r--src/corelib/serialization/qjsonparser.cpp12
-rw-r--r--src/corelib/serialization/qjsonvalue.cpp96
-rw-r--r--src/corelib/serialization/qjsonvalue.h3
-rw-r--r--src/corelib/serialization/qjsonwriter.cpp14
-rw-r--r--src/corelib/statemachine/qabstracttransition.h2
-rw-r--r--src/corelib/statemachine/qsignaleventgenerator_p.h7
-rw-r--r--src/corelib/statemachine/qstatemachine.cpp92
-rw-r--r--src/corelib/statemachine/qstatemachine_p.h5
-rw-r--r--src/corelib/text/qbytearray.cpp608
-rw-r--r--src/corelib/text/qbytearray.h242
-rw-r--r--src/corelib/text/qbytearray_p.h4
-rw-r--r--src/corelib/text/qbytearraylist.h19
-rw-r--r--src/corelib/text/qbytearraymatcher.h2
-rw-r--r--src/corelib/text/qchar.h1
-rw-r--r--src/corelib/text/qharfbuzz.cpp109
-rw-r--r--src/corelib/text/qharfbuzz_p.h357
-rw-r--r--src/corelib/text/qlocale.cpp692
-rw-r--r--src/corelib/text/qlocale.h38
-rw-r--r--src/corelib/text/qlocale_data_p.h6166
-rw-r--r--src/corelib/text/qlocale_p.h189
-rw-r--r--src/corelib/text/qlocale_tools.cpp120
-rw-r--r--src/corelib/text/qlocale_tools_p.h8
-rw-r--r--src/corelib/text/qlocale_win.cpp36
-rw-r--r--src/corelib/text/qregexp.cpp143
-rw-r--r--src/corelib/text/qregexp.h4
-rw-r--r--src/corelib/text/qregularexpression.cpp180
-rw-r--r--src/corelib/text/qregularexpression.h29
-rw-r--r--src/corelib/text/qstring.cpp579
-rw-r--r--src/corelib/text/qstring.h289
-rw-r--r--src/corelib/text/qstringbuilder.cpp4
-rw-r--r--src/corelib/text/qstringbuilder.h12
-rw-r--r--src/corelib/text/qstringlist.h74
-rw-r--r--src/corelib/text/qstringliteral.h44
-rw-r--r--src/corelib/text/qtextboundaryfinder.cpp19
-rw-r--r--src/corelib/text/qunicodetools.cpp1535
-rw-r--r--src/corelib/text/qunicodetools_p.h10
-rw-r--r--src/corelib/text/text.pri13
-rw-r--r--src/corelib/thread/qexception.cpp55
-rw-r--r--src/corelib/thread/qexception.h18
-rw-r--r--src/corelib/thread/qfuture.h198
-rw-r--r--src/corelib/thread/qfuture.qdoc279
-rw-r--r--src/corelib/thread/qfuture_impl.h567
-rw-r--r--src/corelib/thread/qfutureinterface.cpp85
-rw-r--r--src/corelib/thread/qfutureinterface.h137
-rw-r--r--src/corelib/thread/qfutureinterface_p.h7
-rw-r--r--src/corelib/thread/qfuturewatcher.h39
-rw-r--r--src/corelib/thread/qresultstore.h29
-rw-r--r--src/corelib/thread/qrunnable.cpp1
-rw-r--r--src/corelib/thread/qthread.cpp2
-rw-r--r--src/corelib/thread/qthread.h33
-rw-r--r--src/corelib/thread/qthread_unix.cpp28
-rw-r--r--src/corelib/thread/qthread_win.cpp2
-rw-r--r--src/corelib/thread/thread.pri1
-rw-r--r--src/corelib/time/qcalendar.cpp6
-rw-r--r--src/corelib/time/qcalendar.h4
-rw-r--r--src/corelib/time/qcalendarbackend_p.h34
-rw-r--r--src/corelib/time/qdatetime.cpp240
-rw-r--r--src/corelib/time/qdatetime.h62
-rw-r--r--src/corelib/time/qdatetime_p.h4
-rw-r--r--src/corelib/time/qdatetimeparser_p.h4
-rw-r--r--src/corelib/time/qhijricalendar.cpp4
-rw-r--r--src/corelib/time/qhijricalendar_data_p.h2206
-rw-r--r--src/corelib/time/qhijricalendar_p.h4
-rw-r--r--src/corelib/time/qjalalicalendar.cpp4
-rw-r--r--src/corelib/time/qjalalicalendar_data_p.h1627
-rw-r--r--src/corelib/time/qjalalicalendar_p.h4
-rw-r--r--src/corelib/time/qromancalendar.cpp4
-rw-r--r--src/corelib/time/qromancalendar_data_p.h5069
-rw-r--r--src/corelib/time/qromancalendar_p.h4
-rw-r--r--src/corelib/time/qtimezoneprivate_icu.cpp4
-rw-r--r--src/corelib/tools/LICENSE.siphash116
-rw-r--r--src/corelib/tools/qalgorithms.h65
-rw-r--r--src/corelib/tools/qalgorithms.qdoc2
-rw-r--r--src/corelib/tools/qarraydata.cpp111
-rw-r--r--src/corelib/tools/qarraydata.h304
-rw-r--r--src/corelib/tools/qarraydataops.h423
-rw-r--r--src/corelib/tools/qarraydatapointer.h169
-rw-r--r--src/corelib/tools/qbitarray.cpp32
-rw-r--r--src/corelib/tools/qbitarray.h6
-rw-r--r--src/corelib/tools/qcache.h337
-rw-r--r--src/corelib/tools/qcontainerfwd.h7
-rw-r--r--src/corelib/tools/qcontiguouscache.cpp4
-rw-r--r--src/corelib/tools/qcontiguouscache.h314
-rw-r--r--src/corelib/tools/qcryptographichash.cpp100
-rw-r--r--src/corelib/tools/qcryptographichash.h2
-rw-r--r--src/corelib/tools/qeasingcurve.cpp5
-rw-r--r--src/corelib/tools/qeasingcurve.h7
-rw-r--r--src/corelib/tools/qflatmap_p.h983
-rw-r--r--src/corelib/tools/qhash.cpp1963
-rw-r--r--src/corelib/tools/qhash.h2597
-rw-r--r--src/corelib/tools/qhashfunctions.h123
-rw-r--r--src/corelib/tools/qiterator.qdoc163
-rw-r--r--src/corelib/tools/qlinkedlist.cpp1238
-rw-r--r--src/corelib/tools/qlinkedlist.h615
-rw-r--r--src/corelib/tools/qlist.cpp2025
-rw-r--r--src/corelib/tools/qlist.h1154
-rw-r--r--src/corelib/tools/qmap.cpp40
-rw-r--r--src/corelib/tools/qmap.h102
-rw-r--r--src/corelib/tools/qpoint.h1
-rw-r--r--src/corelib/tools/qrefcount.h25
-rw-r--r--src/corelib/tools/qset.h119
-rw-r--r--src/corelib/tools/qset.qdoc2
-rw-r--r--src/corelib/tools/qshareddata.h4
-rw-r--r--src/corelib/tools/qsharedpointer.cpp2
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h2
-rw-r--r--src/corelib/tools/qsimd_p.h396
-rw-r--r--src/corelib/tools/qsimd_x86.cpp116
-rw-r--r--src/corelib/tools/qsimd_x86_p.h222
-rw-r--r--src/corelib/tools/qt_attribution.json15
-rw-r--r--src/corelib/tools/qtaggedpointer.h205
-rw-r--r--src/corelib/tools/qtaggedpointer.qdoc206
-rw-r--r--src/corelib/tools/qvarlengtharray.h177
-rw-r--r--src/corelib/tools/qvarlengtharray.qdoc171
-rw-r--r--src/corelib/tools/qvector.h1260
-rw-r--r--src/corelib/tools/qvector.qdoc72
-rw-r--r--src/corelib/tools/qvector_msvc.cpp7
-rw-r--r--src/corelib/tools/qversionnumber.cpp200
-rw-r--r--src/corelib/tools/qversionnumber.h157
-rw-r--r--src/corelib/tools/tools.pri7
-rw-r--r--src/dbus/.prev_CMakeLists.txt76
-rw-r--r--src/dbus/CMakeLists.txt79
-rw-r--r--src/dbus/Qt5DBusConfigExtras.cmake.in44
-rw-r--r--src/dbus/Qt5DBusMacros.cmake197
-rw-r--r--src/dbus/Qt6DBusMacros.cmake202
-rw-r--r--src/dbus/doc/snippets/code/doc_src_qdbusadaptors.cpp1
-rw-r--r--src/dbus/doc/src/dbus-adaptors.qdoc3
-rw-r--r--src/dbus/qdbusabstractadaptor.cpp118
-rw-r--r--src/dbus/qdbusabstractadaptor_p.h9
-rw-r--r--src/dbus/qdbusargument.cpp7
-rw-r--r--src/dbus/qdbusargument.h106
-rw-r--r--src/dbus/qdbusextratypes.h4
-rw-r--r--src/dbus/qdbusmetaobject.cpp52
-rw-r--r--src/dbus/qdbusmetaobject_p.h1
-rw-r--r--src/dbus/qdbusmisc.cpp5
-rw-r--r--src/gui/.prev_CMakeLists.txt628
-rw-r--r--src/gui/CMakeLists.txt789
-rw-r--r--src/gui/Qt5GuiConfigExtras.cmake.in193
-rw-r--r--src/gui/accessible/qaccessible.cpp17
-rw-r--r--src/gui/configure.cmake1307
-rw-r--r--src/gui/configure.json99
-rw-r--r--src/gui/doc/snippets/code/src_gui_util_qvalidator.cpp45
-rw-r--r--src/gui/doc/snippets/picture/picture.cpp79
-rw-r--r--src/gui/doc/src/dontdocument.qdoc32
-rw-r--r--src/gui/image/image.pri5
-rw-r--r--src/gui/image/qbitmap.cpp14
-rw-r--r--src/gui/image/qbitmap.h4
-rw-r--r--src/gui/image/qbmphandler.cpp8
-rw-r--r--src/gui/image/qimage.cpp245
-rw-r--r--src/gui/image/qimage.h168
-rw-r--r--src/gui/image/qimage_compat.cpp66
-rw-r--r--src/gui/image/qimage_p.h4
-rw-r--r--src/gui/image/qimageiohandler.cpp13
-rw-r--r--src/gui/image/qimageiohandler.h3
-rw-r--r--src/gui/image/qpicture.cpp843
-rw-r--r--src/gui/image/qpicture.h78
-rw-r--r--src/gui/image/qpictureformatplugin.cpp135
-rw-r--r--src/gui/image/qpictureformatplugin.h76
-rw-r--r--src/gui/image/qpixmap.cpp41
-rw-r--r--src/gui/image/qpixmap.h6
-rw-r--r--src/gui/image/qpixmap_win.cpp2
-rw-r--r--src/gui/image/qpixmapcache.cpp4
-rw-r--r--src/gui/image/qpixmapcache_p.h2
-rw-r--r--src/gui/image/qplatformpixmap.cpp4
-rw-r--r--src/gui/image/qplatformpixmap.h2
-rw-r--r--src/gui/image/qpnghandler.cpp4
-rw-r--r--src/gui/image/qppmhandler.cpp18
-rw-r--r--src/gui/image/qxbmhandler.cpp51
-rw-r--r--src/gui/image/qxpmhandler.cpp28
-rw-r--r--src/gui/itemmodels/qstandarditemmodel.cpp2
-rw-r--r--src/gui/itemmodels/qstandarditemmodel.h13
-rw-r--r--src/gui/kernel/kernel.pri36
-rw-r--r--src/gui/kernel/qaction.cpp1378
-rw-r--r--src/gui/kernel/qaction.h276
-rw-r--r--src/gui/kernel/qaction_p.h137
-rw-r--r--src/gui/kernel/qactiongroup.cpp366
-rw-r--r--src/gui/kernel/qactiongroup.h110
-rw-r--r--src/gui/kernel/qactiongroup_p.h91
-rw-r--r--src/gui/kernel/qclipboard.cpp11
-rw-r--r--src/gui/kernel/qevent.cpp110
-rw-r--r--src/gui/kernel/qevent.h106
-rw-r--r--src/gui/kernel/qguiapplication.cpp19
-rw-r--r--src/gui/kernel/qguiapplication_p.h22
-rw-r--r--src/gui/kernel/qguivariant.cpp99
-rw-r--r--src/gui/kernel/qkeymapper_p.h1
-rw-r--r--src/gui/kernel/qkeysequence.cpp7
-rw-r--r--src/gui/kernel/qkeysequence.h20
-rw-r--r--src/gui/kernel/qkeysequence_p.h4
-rw-r--r--src/gui/kernel/qopenglcontext.cpp393
-rw-r--r--src/gui/kernel/qopenglcontext.h72
-rw-r--r--src/gui/kernel/qopenglcontext_p.h22
-rw-r--r--src/gui/kernel/qopenglwindow.cpp698
-rw-r--r--src/gui/kernel/qopenglwindow.h107
-rw-r--r--src/gui/kernel/qpalette.cpp204
-rw-r--r--src/gui/kernel/qpalette.h27
-rw-r--r--src/gui/kernel/qplatformcursor.cpp2
-rw-r--r--src/gui/kernel/qplatformdialoghelper.cpp1
-rw-r--r--src/gui/kernel/qplatformgraphicsbufferhelper.cpp2
-rw-r--r--src/gui/kernel/qplatformgraphicsbufferhelper.h2
-rw-r--r--src/gui/kernel/qplatformmenu.h6
-rw-r--r--src/gui/kernel/qplatformtheme.cpp8
-rw-r--r--src/gui/kernel/qplatformtheme.h8
-rw-r--r--src/gui/kernel/qplatformtheme_p.h6
-rw-r--r--src/gui/kernel/qshortcut.cpp483
-rw-r--r--src/gui/kernel/qshortcut.h168
-rw-r--r--src/gui/kernel/qshortcut_p.h93
-rw-r--r--src/gui/kernel/qshortcutmap.cpp4
-rw-r--r--src/gui/kernel/qshortcutmap_p.h6
-rw-r--r--src/gui/kernel/qwindow.cpp9
-rw-r--r--src/gui/kernel/qwindow.h24
-rw-r--r--src/gui/kernel/qwindowdefs.h3
-rw-r--r--src/gui/kernel/qwindowsysteminterface.cpp4
-rw-r--r--src/gui/math3d/qmatrix4x4.cpp57
-rw-r--r--src/gui/math3d/qmatrix4x4.h12
-rw-r--r--src/gui/opengl/opengl.pri111
-rw-r--r--src/gui/opengl/qopengl.h18
-rw-r--r--src/gui/opengl/qopengl2pexvertexarray.cpp173
-rw-r--r--src/gui/opengl/qopengl2pexvertexarray_p.h168
-rw-r--r--src/gui/opengl/qopengl_p.h4
-rw-r--r--src/gui/opengl/qopenglbuffer.cpp618
-rw-r--r--src/gui/opengl/qopenglbuffer.h145
-rw-r--r--src/gui/opengl/qopenglcustomshaderstage.cpp137
-rw-r--r--src/gui/opengl/qopenglcustomshaderstage_p.h90
-rw-r--r--src/gui/opengl/qopengldebug.cpp1826
-rw-r--r--src/gui/opengl/qopengldebug.h221
-rw-r--r--src/gui/opengl/qopenglengineshadermanager.cpp898
-rw-r--r--src/gui/opengl/qopenglengineshadermanager_p.h507
-rw-r--r--src/gui/opengl/qopenglengineshadersource_p.h970
-rw-r--r--src/gui/opengl/qopenglextrafunctions.h2
-rw-r--r--src/gui/opengl/qopenglframebufferobject.cpp1857
-rw-r--r--src/gui/opengl/qopenglframebufferobject.h200
-rw-r--r--src/gui/opengl/qopenglframebufferobject_p.h153
-rw-r--r--src/gui/opengl/qopenglfunctions.cpp6
-rw-r--r--src/gui/opengl/qopenglfunctions.h286
-rw-r--r--src/gui/opengl/qopenglfunctions_1_0.cpp136
-rw-r--r--src/gui/opengl/qopenglfunctions_1_0.h1929
-rw-r--r--src/gui/opengl/qopenglfunctions_1_1.cpp154
-rw-r--r--src/gui/opengl/qopenglfunctions_1_1.h2119
-rw-r--r--src/gui/opengl/qopenglfunctions_1_2.cpp172
-rw-r--r--src/gui/opengl/qopenglfunctions_1_2.h2357
-rw-r--r--src/gui/opengl/qopenglfunctions_1_3.cpp190
-rw-r--r--src/gui/opengl/qopenglfunctions_1_3.h2643
-rw-r--r--src/gui/opengl/qopenglfunctions_1_4.cpp208
-rw-r--r--src/gui/opengl/qopenglfunctions_1_4.h2923
-rw-r--r--src/gui/opengl/qopenglfunctions_1_5.cpp217
-rw-r--r--src/gui/opengl/qopenglfunctions_1_5.h3046
-rw-r--r--src/gui/opengl/qopenglfunctions_2_0.cpp227
-rw-r--r--src/gui/opengl/qopenglfunctions_2_0.h3614
-rw-r--r--src/gui/opengl/qopenglfunctions_2_1.cpp236
-rw-r--r--src/gui/opengl/qopenglfunctions_2_1.h3659
-rw-r--r--src/gui/opengl/qopenglfunctions_3_0.cpp246
-rw-r--r--src/gui/opengl/qopenglfunctions_3_0.h4173
-rw-r--r--src/gui/opengl/qopenglfunctions_3_1.cpp205
-rw-r--r--src/gui/opengl/qopenglfunctions_3_1.h1601
-rw-r--r--src/gui/opengl/qopenglfunctions_3_2_compatibility.cpp265
-rw-r--r--src/gui/opengl/qopenglfunctions_3_2_compatibility.h4377
-rw-r--r--src/gui/opengl/qopenglfunctions_3_2_core.cpp215
-rw-r--r--src/gui/opengl/qopenglfunctions_3_2_core.h1720
-rw-r--r--src/gui/opengl/qopenglfunctions_3_3_compatibility.cpp282
-rw-r--r--src/gui/opengl/qopenglfunctions_3_3_compatibility.h4734
-rw-r--r--src/gui/opengl/qopenglfunctions_3_3_core.cpp224
-rw-r--r--src/gui/opengl/qopenglfunctions_3_3_core.h2141
-rw-r--r--src/gui/opengl/qopenglfunctions_4_0_compatibility.cpp291
-rw-r--r--src/gui/opengl/qopenglfunctions_4_0_compatibility.h5019
-rw-r--r--src/gui/opengl/qopenglfunctions_4_0_core.cpp233
-rw-r--r--src/gui/opengl/qopenglfunctions_4_0_core.h2422
-rw-r--r--src/gui/opengl/qopenglfunctions_4_1_compatibility.cpp300
-rw-r--r--src/gui/opengl/qopenglfunctions_4_1_compatibility.h5556
-rw-r--r--src/gui/opengl/qopenglfunctions_4_1_core.cpp242
-rw-r--r--src/gui/opengl/qopenglfunctions_4_1_core.h2955
-rw-r--r--src/gui/opengl/qopenglfunctions_4_2_compatibility.cpp309
-rw-r--r--src/gui/opengl/qopenglfunctions_4_2_compatibility.h5647
-rw-r--r--src/gui/opengl/qopenglfunctions_4_2_core.cpp251
-rw-r--r--src/gui/opengl/qopenglfunctions_4_2_core.h3042
-rw-r--r--src/gui/opengl/qopenglfunctions_4_3_compatibility.cpp318
-rw-r--r--src/gui/opengl/qopenglfunctions_4_3_compatibility.h5854
-rw-r--r--src/gui/opengl/qopenglfunctions_4_3_core.cpp260
-rw-r--r--src/gui/opengl/qopenglfunctions_4_3_core.h3246
-rw-r--r--src/gui/opengl/qopenglfunctions_4_4_compatibility.cpp326
-rw-r--r--src/gui/opengl/qopenglfunctions_4_4_compatibility.h5976
-rw-r--r--src/gui/opengl/qopenglfunctions_4_4_core.cpp269
-rw-r--r--src/gui/opengl/qopenglfunctions_4_4_core.h3430
-rw-r--r--src/gui/opengl/qopenglfunctions_4_5_compatibility.cpp344
-rw-r--r--src/gui/opengl/qopenglfunctions_4_5_compatibility.h6694
-rw-r--r--src/gui/opengl/qopenglfunctions_4_5_core.cpp278
-rw-r--r--src/gui/opengl/qopenglfunctions_4_5_core.h4072
-rw-r--r--src/gui/opengl/qopenglfunctions_es2.cpp106
-rw-r--r--src/gui/opengl/qopenglfunctions_es2.h931
-rw-r--r--src/gui/opengl/qopenglgradientcache.cpp276
-rw-r--r--src/gui/opengl/qopenglgradientcache_p.h108
-rw-r--r--src/gui/opengl/qopenglpaintdevice.cpp372
-rw-r--r--src/gui/opengl/qopenglpaintdevice.h95
-rw-r--r--src/gui/opengl/qopenglpaintdevice_p.h88
-rw-r--r--src/gui/opengl/qopenglpaintengine.cpp2702
-rw-r--r--src/gui/opengl/qopenglpaintengine_p.h396
-rw-r--r--src/gui/opengl/qopenglpixeltransferoptions.cpp263
-rw-r--r--src/gui/opengl/qopenglpixeltransferoptions.h100
-rw-r--r--src/gui/opengl/qopenglprogrambinarycache.cpp7
-rw-r--r--src/gui/opengl/qopenglprogrambinarycache_p.h13
-rw-r--r--src/gui/opengl/qopenglqueryhelper_p.h186
-rw-r--r--src/gui/opengl/qopenglshadercache_p.h86
-rw-r--r--src/gui/opengl/qopenglshaderprogram.cpp3812
-rw-r--r--src/gui/opengl/qopenglshaderprogram.h318
-rw-r--r--src/gui/opengl/qopengltexture.cpp4988
-rw-r--r--src/gui/opengl/qopengltexture.h663
-rw-r--r--src/gui/opengl/qopengltexture_p.h184
-rw-r--r--src/gui/opengl/qopengltextureblitter.cpp682
-rw-r--r--src/gui/opengl/qopengltextureblitter.h94
-rw-r--r--src/gui/opengl/qopengltexturecache.cpp198
-rw-r--r--src/gui/opengl/qopengltexturecache_p.h108
-rw-r--r--src/gui/opengl/qopengltextureglyphcache.cpp485
-rw-r--r--src/gui/opengl/qopengltextureglyphcache_p.h181
-rw-r--r--src/gui/opengl/qopengltexturehelper.cpp589
-rw-r--r--src/gui/opengl/qopengltexturehelper_p.h797
-rw-r--r--src/gui/opengl/qopengltextureuploader.cpp381
-rw-r--r--src/gui/opengl/qopengltextureuploader_p.h84
-rw-r--r--src/gui/opengl/qopengltimerquery.cpp880
-rw-r--r--src/gui/opengl/qopengltimerquery.h116
-rw-r--r--src/gui/opengl/qopenglversionfunctions.cpp353
-rw-r--r--src/gui/opengl/qopenglversionfunctions.h1912
-rw-r--r--src/gui/opengl/qopenglversionfunctionsfactory.cpp163
-rw-r--r--src/gui/opengl/qopenglversionfunctionsfactory_p.h83
-rw-r--r--src/gui/opengl/qopenglvertexarrayobject.cpp531
-rw-r--r--src/gui/opengl/qopenglvertexarrayobject.h111
-rw-r--r--src/gui/opengl/qopenglvertexarrayobject_p.h125
-rw-r--r--src/gui/painting/painting.pri5
-rw-r--r--src/gui/painting/qbackingstore.cpp2
-rw-r--r--src/gui/painting/qbrush.cpp20
-rw-r--r--src/gui/painting/qbrush.h10
-rw-r--r--src/gui/painting/qcolor.cpp52
-rw-r--r--src/gui/painting/qcolor.h19
-rw-r--r--src/gui/painting/qcolormatrix_p.h2
-rw-r--r--src/gui/painting/qcoregraphics.mm43
-rw-r--r--src/gui/painting/qdatabuffer_p.h4
-rw-r--r--src/gui/painting/qdrawhelper.cpp20
-rw-r--r--src/gui/painting/qdrawhelper_ssse3.cpp2
-rw-r--r--src/gui/painting/qicc.cpp2
-rw-r--r--src/gui/painting/qmatrix.cpp1191
-rw-r--r--src/gui/painting/qmatrix.h194
-rw-r--r--src/gui/painting/qpagedpaintdevice.cpp1
-rw-r--r--src/gui/painting/qpagedpaintdevice_p.h7
-rw-r--r--src/gui/painting/qpaintdevice.qdoc3
-rw-r--r--src/gui/painting/qpaintengine.cpp2
-rw-r--r--src/gui/painting/qpaintengine.h3
-rw-r--r--src/gui/painting/qpaintengine_raster_p.h8
-rw-r--r--src/gui/painting/qpainter.cpp384
-rw-r--r--src/gui/painting/qpainter.h25
-rw-r--r--src/gui/painting/qpainter_p.h2
-rw-r--r--src/gui/painting/qpainterpath.cpp41
-rw-r--r--src/gui/painting/qpainterpath.h11
-rw-r--r--src/gui/painting/qpainterpath_p.h1
-rw-r--r--src/gui/painting/qplatformbackingstore.cpp439
-rw-r--r--src/gui/painting/qplatformbackingstore.h16
-rw-r--r--src/gui/painting/qpolygon.cpp12
-rw-r--r--src/gui/painting/qpolygon.h2
-rw-r--r--src/gui/painting/qrangecollection.cpp281
-rw-r--r--src/gui/painting/qrangecollection.h78
-rw-r--r--src/gui/painting/qrangecollection_p.h76
-rw-r--r--src/gui/painting/qregion.cpp6
-rw-r--r--src/gui/painting/qtextureglyphcache.cpp4
-rw-r--r--src/gui/painting/qtextureglyphcache_p.h2
-rw-r--r--src/gui/painting/qtransform.cpp637
-rw-r--r--src/gui/painting/qtransform.h114
-rw-r--r--src/gui/rhi/qrhi.cpp18
-rw-r--r--src/gui/rhi/qrhi_p.h18
-rw-r--r--src/gui/rhi/qrhid3d11.cpp2
-rw-r--r--src/gui/rhi/qrhigles2.cpp2
-rw-r--r--src/gui/rhi/qrhivulkan.cpp26
-rw-r--r--src/gui/rhi/qrhivulkan_p_p.h5
-rw-r--r--src/gui/rhi/qshader.cpp6
-rw-r--r--src/gui/rhi/qshader_p.h6
-rw-r--r--src/gui/text/qabstracttextdocumentlayout.cpp7
-rw-r--r--src/gui/text/qabstracttextdocumentlayout_p.h3
-rw-r--r--src/gui/text/qfont.cpp2
-rw-r--r--src/gui/text/qfont.h2
-rw-r--r--src/gui/text/qfont_p.h2
-rw-r--r--src/gui/text/qfontdatabase.cpp279
-rw-r--r--src/gui/text/qfontdatabase.h1
-rw-r--r--src/gui/text/qfontdatabase_p.h279
-rw-r--r--src/gui/text/qfontengine.cpp184
-rw-r--r--src/gui/text/qfontengine_p.h2
-rw-r--r--src/gui/text/qfontengine_qpf2.cpp2
-rw-r--r--src/gui/text/qfontmetrics.h4
-rw-r--r--src/gui/text/qharfbuzzng.cpp94
-rw-r--r--src/gui/text/qharfbuzzng_p.h21
-rw-r--r--src/gui/text/qplatformfontdatabase.cpp40
-rw-r--r--src/gui/text/qplatformfontdatabase.h4
-rw-r--r--src/gui/text/qrawfont.cpp2
-rw-r--r--src/gui/text/qrawfont.h2
-rw-r--r--src/gui/text/qsyntaxhighlighter.cpp2
-rw-r--r--src/gui/text/qtextcursor.cpp8
-rw-r--r--src/gui/text/qtextdocument.cpp262
-rw-r--r--src/gui/text/qtextdocument.h9
-rw-r--r--src/gui/text/qtextdocument_p.h33
-rw-r--r--src/gui/text/qtextdocumentfragment.cpp24
-rw-r--r--src/gui/text/qtextdocumentfragment.h5
-rw-r--r--src/gui/text/qtextdocumentlayout.cpp4
-rw-r--r--src/gui/text/qtextdocumentwriter.cpp46
-rw-r--r--src/gui/text/qtextdocumentwriter.h5
-rw-r--r--src/gui/text/qtextengine.cpp275
-rw-r--r--src/gui/text/qtextengine_p.h15
-rw-r--r--src/gui/text/qtextformat.cpp38
-rw-r--r--src/gui/text/qtextformat.h12
-rw-r--r--src/gui/text/qtexthtmlparser.cpp6
-rw-r--r--src/gui/text/qtextlayout.cpp14
-rw-r--r--src/gui/text/qtextlist.cpp4
-rw-r--r--src/gui/text/qtextobject.cpp28
-rw-r--r--src/gui/text/qtextobject.h3
-rw-r--r--src/gui/text/qtextodfwriter.cpp11
-rw-r--r--src/gui/text/qtextodfwriter_p.h2
-rw-r--r--src/gui/text/qtextoption.h6
-rw-r--r--src/gui/text/qtexttable.cpp16
-rw-r--r--src/gui/text/text.pri1
-rw-r--r--src/gui/util/qgridlayoutengine.cpp4
-rw-r--r--src/gui/util/qgridlayoutengine_p.h2
-rw-r--r--src/gui/util/qtexturefiledata.cpp12
-rw-r--r--src/gui/util/qundogroup.cpp515
-rw-r--r--src/gui/util/qundogroup.h100
-rw-r--r--src/gui/util/qundostack.cpp1390
-rw-r--r--src/gui/util/qundostack.h157
-rw-r--r--src/gui/util/qundostack_p.h104
-rw-r--r--src/gui/util/qvalidator.cpp141
-rw-r--r--src/gui/util/qvalidator.h36
-rw-r--r--src/gui/util/util.pri13
-rw-r--r--src/gui/vulkan/qvulkaninstance.cpp4
-rw-r--r--src/gui/vulkan/qvulkaninstance.h4
-rw-r--r--src/network/.prev_CMakeLists.txt436
-rw-r--r--src/network/CMakeLists.txt437
-rw-r--r--src/network/access/access.pri7
-rw-r--r--src/network/access/qabstractnetworkcache.h1
-rw-r--r--src/network/access/qftp.cpp44
-rw-r--r--src/network/access/qhsts_p.h1
-rw-r--r--src/network/access/qhttp2protocolhandler.cpp12
-rw-r--r--src/network/access/qhttpnetworkconnection.cpp103
-rw-r--r--src/network/access/qhttpnetworkconnection_p.h18
-rw-r--r--src/network/access/qhttpnetworkconnectionchannel.cpp85
-rw-r--r--src/network/access/qhttpnetworkconnectionchannel_p.h10
-rw-r--r--src/network/access/qhttpnetworkreply.cpp15
-rw-r--r--src/network/access/qhttpnetworkreply_p.h13
-rw-r--r--src/network/access/qhttpnetworkrequest.cpp14
-rw-r--r--src/network/access/qhttpnetworkrequest_p.h4
-rw-r--r--src/network/access/qhttpthreaddelegate.cpp33
-rw-r--r--src/network/access/qhttpthreaddelegate_p.h5
-rw-r--r--src/network/access/qnetworkaccessbackend.cpp26
-rw-r--r--src/network/access/qnetworkaccesscache.cpp83
-rw-r--r--src/network/access/qnetworkaccesscache_p.h2
-rw-r--r--src/network/access/qnetworkaccessftpbackend.cpp4
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp487
-rw-r--r--src/network/access/qnetworkaccessmanager.h50
-rw-r--r--src/network/access/qnetworkaccessmanager_p.h60
-rw-r--r--src/network/access/qnetworkcookie.cpp24
-rw-r--r--src/network/access/qnetworkreplyhttpimpl.cpp243
-rw-r--r--src/network/access/qnetworkreplyhttpimpl_p.h17
-rw-r--r--src/network/access/qnetworkreplyimpl.cpp150
-rw-r--r--src/network/access/qnetworkreplyimpl_p.h13
-rw-r--r--src/network/access/qnetworkrequest.cpp20
-rw-r--r--src/network/access/qnetworkrequest.h8
-rw-r--r--src/network/access/qspdyprotocolhandler.cpp1304
-rw-r--r--src/network/access/qspdyprotocolhandler_p.h232
-rw-r--r--src/network/bearer/bearer.pri19
-rw-r--r--src/network/bearer/qbearerengine.cpp101
-rw-r--r--src/network/bearer/qbearerengine_p.h115
-rw-r--r--src/network/bearer/qbearerplugin.cpp57
-rw-r--r--src/network/bearer/qbearerplugin_p.h81
-rw-r--r--src/network/bearer/qnetworkconfigmanager.cpp389
-rw-r--r--src/network/bearer/qnetworkconfigmanager.h109
-rw-r--r--src/network/bearer/qnetworkconfigmanager_p.cpp517
-rw-r--r--src/network/bearer/qnetworkconfigmanager_p.h141
-rw-r--r--src/network/bearer/qnetworkconfiguration.cpp596
-rw-r--r--src/network/bearer/qnetworkconfiguration.h147
-rw-r--r--src/network/bearer/qnetworkconfiguration_p.h99
-rw-r--r--src/network/bearer/qnetworksession.cpp743
-rw-r--r--src/network/bearer/qnetworksession.h159
-rw-r--r--src/network/bearer/qnetworksession_p.h157
-rw-r--r--src/network/bearer/qsharednetworksession.cpp102
-rw-r--r--src/network/bearer/qsharednetworksession_p.h92
-rw-r--r--src/network/configure.cmake445
-rw-r--r--src/network/configure.json31
-rw-r--r--src/network/doc/snippets/code/src_network_access_qnetworkaccessmanager.cpp9
-rw-r--r--src/network/doc/snippets/code/src_network_bearer_qnetworkconfigmanager.cpp58
-rw-r--r--src/network/doc/snippets/code/src_network_bearer_qnetworksession.cpp60
-rw-r--r--src/network/doc/snippets/code/src_network_ssl_qsslcertificate.cpp8
-rw-r--r--src/network/doc/src/bearermanagement.qdoc242
-rw-r--r--src/network/doc/src/network-programming.qdoc3
-rw-r--r--src/network/kernel/kernel.pri7
-rw-r--r--src/network/kernel/qhostaddress.cpp2
-rw-r--r--src/network/kernel/qhostaddress.h4
-rw-r--r--src/network/kernel/qhostinfo.cpp1
-rw-r--r--src/network/kernel/qhostinfo_p.h1
-rw-r--r--src/network/kernel/qnetworkinterface.h1
-rw-r--r--src/network/kernel/qnetworkproxy.cpp98
-rw-r--r--src/network/kernel/qnetworkproxy.h27
-rw-r--r--src/network/kernel/qnetworkproxy_mac.cpp7
-rw-r--r--src/network/kernel/qnetworkproxy_win.cpp7
-rw-r--r--src/network/kernel/qtldurl.cpp139
-rw-r--r--src/network/kernel/qtldurl_p.h71
-rw-r--r--src/network/kernel/qurltlds_p.h14467
-rw-r--r--src/network/kernel/qurltlds_p.h.INFO (renamed from src/corelib/io/qurltlds_p.h.INFO)0
-rw-r--r--src/network/network.pro14
-rw-r--r--src/network/socket/qabstractsocket.cpp35
-rw-r--r--src/network/socket/qabstractsocketengine.cpp2
-rw-r--r--src/network/socket/qhttpsocketengine.cpp5
-rw-r--r--src/network/socket/qlocalserver_p.h9
-rw-r--r--src/network/socket/qlocalserver_win.cpp38
-rw-r--r--src/network/socket/qnativesocketengine.cpp2
-rw-r--r--src/network/socket/qsocks5socketengine.cpp8
-rw-r--r--src/network/socket/qtcpserver.cpp8
-rw-r--r--src/network/ssl/qocspresponse.cpp6
-rw-r--r--src/network/ssl/qocspresponse.h4
-rw-r--r--src/network/ssl/qssl.cpp14
-rw-r--r--src/network/ssl/qssl.h14
-rw-r--r--src/network/ssl/qsslcertificate.cpp93
-rw-r--r--src/network/ssl/qsslcertificate.h16
-rw-r--r--src/network/ssl/qsslcertificate_openssl.cpp2
-rw-r--r--src/network/ssl/qsslcertificate_qt.cpp2
-rw-r--r--src/network/ssl/qsslconfiguration.cpp104
-rw-r--r--src/network/ssl/qsslconfiguration.h8
-rw-r--r--src/network/ssl/qsslconfiguration_p.h8
-rw-r--r--src/network/ssl/qsslcontext_openssl.cpp78
-rw-r--r--src/network/ssl/qssldiffiehellmanparameters.cpp2
-rw-r--r--src/network/ssl/qssldiffiehellmanparameters.h4
-rw-r--r--src/network/ssl/qsslellipticcurve.cpp2
-rw-r--r--src/network/ssl/qsslellipticcurve.h6
-rw-r--r--src/network/ssl/qsslerror.cpp2
-rw-r--r--src/network/ssl/qsslerror.h2
-rw-r--r--src/network/ssl/qsslsocket.cpp237
-rw-r--r--src/network/ssl/qsslsocket.h52
-rw-r--r--src/network/ssl/qsslsocket_mac.cpp54
-rw-r--r--src/network/ssl/qsslsocket_openssl.cpp290
-rw-r--r--src/network/ssl/qsslsocket_openssl_p.h13
-rw-r--r--src/network/ssl/qsslsocket_openssl_symbols.cpp8
-rw-r--r--src/network/ssl/qsslsocket_openssl_symbols_p.h4
-rw-r--r--src/network/ssl/qsslsocket_p.h3
-rw-r--r--src/network/ssl/qsslsocket_schannel.cpp6
-rw-r--r--src/network/ssl/qsslsocket_winrt.cpp12
-rw-r--r--src/opengl/.prev_CMakeLists.txt90
-rw-r--r--src/opengl/CMakeLists.txt90
-rw-r--r--src/opengl/doc/snippets/code/src_opengl_qgl.cpp182
-rw-r--r--src/opengl/doc/snippets/code/src_opengl_qglbuffer.cpp60
-rw-r--r--src/opengl/doc/snippets/code/src_opengl_qglcolormap.cpp71
-rw-r--r--src/opengl/doc/snippets/code/src_opengl_qglfunctions.cpp86
-rw-r--r--src/opengl/doc/snippets/code/src_opengl_qglpixelbuffer.cpp69
-rw-r--r--src/opengl/doc/snippets/code/src_opengl_qglshaderprogram.cpp104
-rw-r--r--src/opengl/doc/snippets/code/src_opengl_qgraphicsshadereffect.cpp95
-rw-r--r--src/opengl/doc/src/dontdocument.qdoc59
-rw-r--r--src/opengl/doc/src/qtopengl-examples.qdoc9
-rw-r--r--src/opengl/doc/src/qtopengl-module.qdoc13
-rw-r--r--src/opengl/gl2paintengineex/qgl2pexvertexarray.cpp173
-rw-r--r--src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h167
-rw-r--r--src/opengl/gl2paintengineex/qglcustomshaderstage.cpp137
-rw-r--r--src/opengl/gl2paintengineex/qglcustomshaderstage_p.h86
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadermanager.cpp875
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadermanager_p.h508
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadersource_p.h523
-rw-r--r--src/opengl/gl2paintengineex/qglgradientcache.cpp225
-rw-r--r--src/opengl/gl2paintengineex/qglgradientcache_p.h103
-rw-r--r--src/opengl/gl2paintengineex/qglshadercache_p.h86
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp2515
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h334
-rw-r--r--src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp414
-rw-r--r--src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h171
-rw-r--r--src/opengl/opengl.pro165
-rw-r--r--src/opengl/qgl.cpp5558
-rw-r--r--src/opengl/qgl.h524
-rw-r--r--src/opengl/qgl_p.h556
-rw-r--r--src/opengl/qglbuffer.cpp568
-rw-r--r--src/opengl/qglbuffer.h125
-rw-r--r--src/opengl/qglcolormap.cpp296
-rw-r--r--src/opengl/qglcolormap.h99
-rw-r--r--src/opengl/qglframebufferobject.cpp1466
-rw-r--r--src/opengl/qglframebufferobject.h149
-rw-r--r--src/opengl/qglframebufferobject_p.h157
-rw-r--r--src/opengl/qglfunctions.cpp1330
-rw-r--r--src/opengl/qglfunctions.h1688
-rw-r--r--src/opengl/qglpaintdevice.cpp239
-rw-r--r--src/opengl/qglpaintdevice_p.h113
-rw-r--r--src/opengl/qglpixelbuffer.cpp654
-rw-r--r--src/opengl/qglpixelbuffer.h104
-rw-r--r--src/opengl/qglpixelbuffer_p.h107
-rw-r--r--src/opengl/qglshaderprogram.cpp3237
-rw-r--r--src/opengl/qglshaderprogram.h303
-rw-r--r--src/opengl/qgraphicsshadereffect.cpp272
-rw-r--r--src/opengl/qgraphicsshadereffect_p.h90
-rw-r--r--src/opengl/qopengl2pexvertexarray.cpp173
-rw-r--r--src/opengl/qopengl2pexvertexarray_p.h167
-rw-r--r--src/opengl/qopenglbuffer.cpp618
-rw-r--r--src/opengl/qopenglbuffer.h145
-rw-r--r--src/opengl/qopenglcustomshaderstage.cpp137
-rw-r--r--src/opengl/qopenglcustomshaderstage_p.h90
-rw-r--r--src/opengl/qopengldebug.cpp1826
-rw-r--r--src/opengl/qopengldebug.h221
-rw-r--r--src/opengl/qopenglengineshadermanager.cpp898
-rw-r--r--src/opengl/qopenglengineshadermanager_p.h506
-rw-r--r--src/opengl/qopenglengineshadersource_p.h969
-rw-r--r--src/opengl/qopenglframebufferobject.cpp1857
-rw-r--r--src/opengl/qopenglframebufferobject.h196
-rw-r--r--src/opengl/qopenglframebufferobject_p.h153
-rw-r--r--src/opengl/qopenglfunctions_1_0.cpp136
-rw-r--r--src/opengl/qopenglfunctions_1_0.h1930
-rw-r--r--src/opengl/qopenglfunctions_1_1.cpp154
-rw-r--r--src/opengl/qopenglfunctions_1_1.h2120
-rw-r--r--src/opengl/qopenglfunctions_1_2.cpp172
-rw-r--r--src/opengl/qopenglfunctions_1_2.h2359
-rw-r--r--src/opengl/qopenglfunctions_1_3.cpp190
-rw-r--r--src/opengl/qopenglfunctions_1_3.h2644
-rw-r--r--src/opengl/qopenglfunctions_1_4.cpp208
-rw-r--r--src/opengl/qopenglfunctions_1_4.h2924
-rw-r--r--src/opengl/qopenglfunctions_1_5.cpp217
-rw-r--r--src/opengl/qopenglfunctions_1_5.h3047
-rw-r--r--src/opengl/qopenglfunctions_2_0.cpp227
-rw-r--r--src/opengl/qopenglfunctions_2_0.h3615
-rw-r--r--src/opengl/qopenglfunctions_2_1.cpp236
-rw-r--r--src/opengl/qopenglfunctions_2_1.h3660
-rw-r--r--src/opengl/qopenglfunctions_3_0.cpp246
-rw-r--r--src/opengl/qopenglfunctions_3_0.h4174
-rw-r--r--src/opengl/qopenglfunctions_3_1.cpp205
-rw-r--r--src/opengl/qopenglfunctions_3_1.h1602
-rw-r--r--src/opengl/qopenglfunctions_3_2_compatibility.cpp265
-rw-r--r--src/opengl/qopenglfunctions_3_2_compatibility.h4378
-rw-r--r--src/opengl/qopenglfunctions_3_2_core.cpp215
-rw-r--r--src/opengl/qopenglfunctions_3_2_core.h1721
-rw-r--r--src/opengl/qopenglfunctions_3_3_compatibility.cpp282
-rw-r--r--src/opengl/qopenglfunctions_3_3_compatibility.h4735
-rw-r--r--src/opengl/qopenglfunctions_3_3_core.cpp224
-rw-r--r--src/opengl/qopenglfunctions_3_3_core.h2142
-rw-r--r--src/opengl/qopenglfunctions_4_0_compatibility.cpp291
-rw-r--r--src/opengl/qopenglfunctions_4_0_compatibility.h5020
-rw-r--r--src/opengl/qopenglfunctions_4_0_core.cpp233
-rw-r--r--src/opengl/qopenglfunctions_4_0_core.h2423
-rw-r--r--src/opengl/qopenglfunctions_4_1_compatibility.cpp300
-rw-r--r--src/opengl/qopenglfunctions_4_1_compatibility.h5557
-rw-r--r--src/opengl/qopenglfunctions_4_1_core.cpp242
-rw-r--r--src/opengl/qopenglfunctions_4_1_core.h2956
-rw-r--r--src/opengl/qopenglfunctions_4_2_compatibility.cpp309
-rw-r--r--src/opengl/qopenglfunctions_4_2_compatibility.h5648
-rw-r--r--src/opengl/qopenglfunctions_4_2_core.cpp251
-rw-r--r--src/opengl/qopenglfunctions_4_2_core.h3043
-rw-r--r--src/opengl/qopenglfunctions_4_3_compatibility.cpp318
-rw-r--r--src/opengl/qopenglfunctions_4_3_compatibility.h5855
-rw-r--r--src/opengl/qopenglfunctions_4_3_core.cpp260
-rw-r--r--src/opengl/qopenglfunctions_4_3_core.h3247
-rw-r--r--src/opengl/qopenglfunctions_4_4_compatibility.cpp326
-rw-r--r--src/opengl/qopenglfunctions_4_4_compatibility.h5977
-rw-r--r--src/opengl/qopenglfunctions_4_4_core.cpp269
-rw-r--r--src/opengl/qopenglfunctions_4_4_core.h3431
-rw-r--r--src/opengl/qopenglfunctions_4_5_compatibility.cpp344
-rw-r--r--src/opengl/qopenglfunctions_4_5_compatibility.h6695
-rw-r--r--src/opengl/qopenglfunctions_4_5_core.cpp278
-rw-r--r--src/opengl/qopenglfunctions_4_5_core.h4073
-rw-r--r--src/opengl/qopenglfunctions_es2.cpp106
-rw-r--r--src/opengl/qopenglfunctions_es2.h932
-rw-r--r--src/opengl/qopenglgradientcache.cpp276
-rw-r--r--src/opengl/qopenglgradientcache_p.h107
-rw-r--r--src/opengl/qopenglpaintdevice.cpp372
-rw-r--r--src/opengl/qopenglpaintdevice.h95
-rw-r--r--src/opengl/qopenglpaintdevice_p.h87
-rw-r--r--src/opengl/qopenglpaintengine.cpp2702
-rw-r--r--src/opengl/qopenglpaintengine_p.h395
-rw-r--r--src/opengl/qopenglpixeltransferoptions.cpp263
-rw-r--r--src/opengl/qopenglpixeltransferoptions.h100
-rw-r--r--src/opengl/qopenglqueryhelper_p.h186
-rw-r--r--src/opengl/qopenglshadercache_p.h86
-rw-r--r--src/opengl/qopenglshaderprogram.cpp3811
-rw-r--r--src/opengl/qopenglshaderprogram.h314
-rw-r--r--src/opengl/qopengltexture.cpp4989
-rw-r--r--src/opengl/qopengltexture.h663
-rw-r--r--src/opengl/qopengltexture_p.h184
-rw-r--r--src/opengl/qopengltextureblitter.cpp682
-rw-r--r--src/opengl/qopengltextureblitter.h90
-rw-r--r--src/opengl/qopengltexturecache.cpp198
-rw-r--r--src/opengl/qopengltexturecache_p.h108
-rw-r--r--src/opengl/qopengltextureglyphcache.cpp485
-rw-r--r--src/opengl/qopengltextureglyphcache_p.h181
-rw-r--r--src/opengl/qopengltexturehelper.cpp589
-rw-r--r--src/opengl/qopengltexturehelper_p.h797
-rw-r--r--src/opengl/qopengltextureuploader.cpp381
-rw-r--r--src/opengl/qopengltextureuploader_p.h84
-rw-r--r--src/opengl/qopengltimerquery.cpp880
-rw-r--r--src/opengl/qopengltimerquery.h116
-rw-r--r--src/opengl/qopenglversionfunctions.cpp374
-rw-r--r--src/opengl/qopenglversionfunctions.h1912
-rw-r--r--src/opengl/qopenglversionfunctions_p.h87
-rw-r--r--src/opengl/qopenglversionfunctionsfactory.cpp280
-rw-r--r--src/opengl/qopenglversionfunctionsfactory.h74
-rw-r--r--src/opengl/qopenglversionprofile.cpp214
-rw-r--r--src/opengl/qopenglversionprofile.h106
-rw-r--r--src/opengl/qopenglvertexarrayobject.cpp536
-rw-r--r--src/opengl/qopenglvertexarrayobject.h111
-rw-r--r--src/opengl/qopenglvertexarrayobject_p.h121
-rw-r--r--src/opengl/qopenglwindow.cpp698
-rw-r--r--src/opengl/qopenglwindow.h107
-rw-r--r--src/opengl/qtopenglglobal.h1
-rw-r--r--src/openglextensions/CMakeLists.txt20
-rw-r--r--src/openglextensions/qopenglextensions.cpp2
-rw-r--r--src/openglextensions/qopenglextensions.h2
-rw-r--r--src/openglwidgets/CMakeLists.txt19
-rw-r--r--src/openglwidgets/openglwidgets.pro13
-rw-r--r--src/openglwidgets/qopenglwidget.cpp1416
-rw-r--r--src/openglwidgets/qopenglwidget.h111
-rw-r--r--src/openglwidgets/qtopenglwidgetsglobal.h59
-rw-r--r--src/platformheaders/.prev_CMakeLists.txt2
-rw-r--r--src/platformheaders/CMakeLists.txt13
-rw-r--r--src/platformheaders/fake.cpp (renamed from src/3rdparty/harfbuzz/ChangeLog)0
-rw-r--r--src/platformheaders/windowsfunctions/qwindowswindowfunctions.h8
-rw-r--r--src/platformheaders/windowsfunctions/qwindowswindowfunctions.qdoc27
-rw-r--r--src/platformsupport/.prev_CMakeLists.txt45
-rw-r--r--src/platformsupport/CMakeLists.txt49
-rw-r--r--src/platformsupport/accessibility/CMakeLists.txt20
-rw-r--r--src/platformsupport/clipboard/CMakeLists.txt29
-rw-r--r--src/platformsupport/devicediscovery/CMakeLists.txt40
-rw-r--r--src/platformsupport/edid/CMakeLists.txt21
-rw-r--r--src/platformsupport/eglconvenience/.prev_CMakeLists.txt50
-rw-r--r--src/platformsupport/eglconvenience/CMakeLists.txt53
-rw-r--r--src/platformsupport/eglconvenience/qeglplatformcontext.cpp16
-rw-r--r--src/platformsupport/eventdispatchers/.prev_CMakeLists.txt42
-rw-r--r--src/platformsupport/eventdispatchers/CMakeLists.txt44
-rw-r--r--src/platformsupport/fbconvenience/CMakeLists.txt26
-rw-r--r--src/platformsupport/fontdatabases/.prev_CMakeLists.txt136
-rw-r--r--src/platformsupport/fontdatabases/CMakeLists.txt139
-rw-r--r--src/platformsupport/fontdatabases/fake.cpp (renamed from src/3rdparty/harfbuzz/NEWS)0
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp31
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h2
-rw-r--r--src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp77
-rw-r--r--src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h21
-rw-r--r--src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp19
-rw-r--r--src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase_p.h4
-rw-r--r--src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm29
-rw-r--r--src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h4
-rw-r--r--src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm5
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsdirectwritefontdatabase.cpp478
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsdirectwritefontdatabase_p.h96
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp937
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp12
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h42
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase.cpp988
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase_p.h136
-rw-r--r--src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp51
-rw-r--r--src/platformsupport/fontdatabases/windows/windows.pri10
-rw-r--r--src/platformsupport/glxconvenience/.prev_CMakeLists.txt21
-rw-r--r--src/platformsupport/glxconvenience/CMakeLists.txt23
-rw-r--r--src/platformsupport/graphics/CMakeLists.txt20
-rw-r--r--src/platformsupport/input/.prev_CMakeLists.txt102
-rw-r--r--src/platformsupport/input/CMakeLists.txt107
-rw-r--r--src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp20
-rw-r--r--src/platformsupport/input/libinput/qlibinputtouch.cpp1
-rw-r--r--src/platformsupport/input/xkbcommon/CMakeLists.txt32
-rw-r--r--src/platformsupport/kmsconvenience/.prev_CMakeLists.txt21
-rw-r--r--src/platformsupport/kmsconvenience/CMakeLists.txt23
-rw-r--r--src/platformsupport/linuxaccessibility/.prev_CMakeLists.txt41
-rw-r--r--src/platformsupport/linuxaccessibility/CMakeLists.txt43
-rw-r--r--src/platformsupport/linuxaccessibility/constant_mappings_p.h2
-rw-r--r--src/platformsupport/linuxofono/CMakeLists.txt20
-rw-r--r--src/platformsupport/linuxofono/linuxofono.pro15
-rw-r--r--src/platformsupport/linuxofono/qofonoservice_linux.cpp384
-rw-r--r--src/platformsupport/linuxofono/qofonoservice_linux_p.h (renamed from src/plugins/bearer/linux_common/qofonoservice_linux_p.h)0
-rw-r--r--src/platformsupport/platformcompositor/CMakeLists.txt23
-rw-r--r--src/platformsupport/platformcompositor/platformcompositor.pro4
-rw-r--r--src/platformsupport/platformcompositor/qopenglcompositor.cpp2
-rw-r--r--src/platformsupport/platformcompositor/qopenglcompositor_p.h2
-rw-r--r--src/platformsupport/platformcompositor/qplatformbackingstoreopenglsupport.cpp455
-rw-r--r--src/platformsupport/platformcompositor/qplatformbackingstoreopenglsupport.h87
-rw-r--r--src/platformsupport/platformsupport.pro4
-rw-r--r--src/platformsupport/services/CMakeLists.txt30
-rw-r--r--src/platformsupport/themes/CMakeLists.txt54
-rw-r--r--src/platformsupport/themes/genericunix/dbusmenu/qdbusmenutypes.cpp4
-rw-r--r--src/platformsupport/themes/genericunix/dbusmenu/qdbusplatformmenu_p.h4
-rw-r--r--src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h1
-rw-r--r--src/platformsupport/vkconvenience/.prev_CMakeLists.txt31
-rw-r--r--src/platformsupport/vkconvenience/CMakeLists.txt33
-rw-r--r--src/platformsupport/vkconvenience/qvkconvenience.cpp4
-rw-r--r--src/platformsupport/vkconvenience/vkconvenience.pro2
-rw-r--r--src/platformsupport/windowsuiautomation/CMakeLists.txt28
-rw-r--r--src/plugins/CMakeLists.txt22
-rw-r--r--src/plugins/bearer/android/android.pro4
-rw-r--r--src/plugins/bearer/android/jar/jar.pro15
-rw-r--r--src/plugins/bearer/android/jar/src/org/qtproject/qt5/android/bearer/QtNetworkReceiver.java92
-rw-r--r--src/plugins/bearer/android/src/android.json3
-rw-r--r--src/plugins/bearer/android/src/main.cpp63
-rw-r--r--src/plugins/bearer/android/src/qandroidbearerengine.cpp391
-rw-r--r--src/plugins/bearer/android/src/qandroidbearerengine.h95
-rw-r--r--src/plugins/bearer/android/src/src.pro17
-rw-r--r--src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.cpp387
-rw-r--r--src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.h168
-rw-r--r--src/plugins/bearer/android/src/wrappers/wrappers.pri6
-rw-r--r--src/plugins/bearer/bearer.pro11
-rw-r--r--src/plugins/bearer/connman/connman.json3
-rw-r--r--src/plugins/bearer/connman/connman.pro21
-rw-r--r--src/plugins/bearer/connman/main.cpp85
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.cpp570
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.h145
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux.cpp516
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux_p.h230
-rw-r--r--src/plugins/bearer/corewlan/corewlan.json3
-rw-r--r--src/plugins/bearer/corewlan/corewlan.pro23
-rw-r--r--src/plugins/bearer/corewlan/main.cpp82
-rw-r--r--src/plugins/bearer/corewlan/qcorewlanengine.h147
-rw-r--r--src/plugins/bearer/corewlan/qcorewlanengine.mm862
-rw-r--r--src/plugins/bearer/generic/generic.json3
-rw-r--r--src/plugins/bearer/generic/generic.pro19
-rw-r--r--src/plugins/bearer/generic/main.cpp78
-rw-r--r--src/plugins/bearer/generic/qgenericengine.cpp446
-rw-r--r--src/plugins/bearer/generic/qgenericengine.h90
-rw-r--r--src/plugins/bearer/linux_common/qofonoservice_linux.cpp384
-rw-r--r--src/plugins/bearer/nativewifi/main.cpp127
-rw-r--r--src/plugins/bearer/nativewifi/nativewifi.json3
-rw-r--r--src/plugins/bearer/nativewifi/nativewifi.pro18
-rw-r--r--src/plugins/bearer/nativewifi/platformdefs.h327
-rw-r--r--src/plugins/bearer/nativewifi/qnativewifiengine.cpp622
-rw-r--r--src/plugins/bearer/nativewifi/qnativewifiengine.h106
-rw-r--r--src/plugins/bearer/networkmanager/main.cpp84
-rw-r--r--src/plugins/bearer/networkmanager/networkmanager.json3
-rw-r--r--src/plugins/bearer/networkmanager/networkmanager.pro21
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp936
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerengine.h153
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp1019
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerservice.h500
-rw-r--r--src/plugins/bearer/nla/main.cpp78
-rw-r--r--src/plugins/bearer/nla/nla.json3
-rw-r--r--src/plugins/bearer/nla/nla.pro20
-rw-r--r--src/plugins/bearer/nla/qnlaengine.cpp639
-rw-r--r--src/plugins/bearer/nla/qnlaengine.h110
-rw-r--r--src/plugins/bearer/platformdefs_win.h142
-rw-r--r--src/plugins/bearer/qbearerengine_impl.h81
-rw-r--r--src/plugins/bearer/qnetworksession_impl.cpp435
-rw-r--r--src/plugins/bearer/qnetworksession_impl.h130
-rw-r--r--src/plugins/generic/.prev_CMakeLists.txt23
-rw-r--r--src/plugins/generic/CMakeLists.txt23
-rw-r--r--src/plugins/generic/evdevkeyboard/CMakeLists.txt22
-rw-r--r--src/plugins/generic/evdevmouse/CMakeLists.txt22
-rw-r--r--src/plugins/generic/evdevtablet/CMakeLists.txt22
-rw-r--r--src/plugins/generic/evdevtouch/CMakeLists.txt22
-rw-r--r--src/plugins/generic/libinput/CMakeLists.txt22
-rw-r--r--src/plugins/generic/tslib/.prev_CMakeLists.txt23
-rw-r--r--src/plugins/generic/tslib/CMakeLists.txt25
-rw-r--r--src/plugins/generic/tuiotouch/CMakeLists.txt29
-rw-r--r--src/plugins/imageformats/CMakeLists.txt11
-rw-r--r--src/plugins/imageformats/gif/.prev_CMakeLists.txt19
-rw-r--r--src/plugins/imageformats/gif/CMakeLists.txt20
-rw-r--r--src/plugins/imageformats/gif/qgifhandler.cpp4
-rw-r--r--src/plugins/imageformats/ico/.prev_CMakeLists.txt21
-rw-r--r--src/plugins/imageformats/ico/CMakeLists.txt20
-rw-r--r--src/plugins/imageformats/ico/qicohandler.cpp6
-rw-r--r--src/plugins/imageformats/jpeg/.prev_CMakeLists.txt94
-rw-r--r--src/plugins/imageformats/jpeg/CMakeLists.txt96
-rw-r--r--src/plugins/platforminputcontexts/CMakeLists.txt8
-rw-r--r--src/plugins/platforminputcontexts/compose/.prev_CMakeLists.txt24
-rw-r--r--src/plugins/platforminputcontexts/compose/CMakeLists.txt26
-rw-r--r--src/plugins/platforminputcontexts/ibus/CMakeLists.txt27
-rw-r--r--src/plugins/platforms/.prev_CMakeLists.txt57
-rw-r--r--src/plugins/platforms/CMakeLists.txt57
-rw-r--r--src/plugins/platforms/android/.prev_CMakeLists.txt85
-rw-r--r--src/plugins/platforms/android/CMakeLists.txt94
-rw-r--r--src/plugins/platforms/android/android.pro3
-rw-r--r--src/plugins/platforms/android/androidjniinput.cpp5
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp69
-rw-r--r--src/plugins/platforms/android/androidjnimain.h13
-rw-r--r--src/plugins/platforms/android/androidplatformplugin.cpp64
-rw-r--r--src/plugins/platforms/android/main.cpp1
-rw-r--r--src/plugins/platforms/android/qandroidplatformintegration.cpp67
-rw-r--r--src/plugins/platforms/android/qandroidplatformintegration.h28
-rw-r--r--src/plugins/platforms/android/qandroidplatformscreen.cpp11
-rw-r--r--src/plugins/platforms/android/qandroidplatformwindow.cpp32
-rw-r--r--src/plugins/platforms/android/qandroidplatformwindow.h4
-rw-r--r--src/plugins/platforms/cocoa/.prev_CMakeLists.txt151
-rw-r--r--src/plugins/platforms/cocoa/CMakeLists.txt155
-rw-r--r--src/plugins/platforms/cocoa/cocoa.pro2
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.mm7
-rw-r--r--src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm29
-rw-r--r--src/plugins/platforms/cocoa/qcocoadrag.mm25
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.mm28
-rw-r--r--src/plugins/platforms/cocoa/qcocoahelpers.h8
-rw-r--r--src/plugins/platforms/cocoa/qcocoahelpers.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.mm27
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuitem.mm3
-rw-r--r--src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm17
-rw-r--r--src/plugins/platforms/cocoa/qmacclipboard.mm2
-rw-r--r--src/plugins/platforms/cocoa/qmultitouch_mac_p.h1
-rw-r--r--src/plugins/platforms/cocoa/qnsview_dragging.mm17
-rw-r--r--src/plugins/platforms/cocoa/qnswindowdelegate.mm12
-rw-r--r--src/plugins/platforms/cocoa/qpaintengine_mac.mm2
-rw-r--r--src/plugins/platforms/directfb/.prev_CMakeLists.txt61
-rw-r--r--src/plugins/platforms/directfb/CMakeLists.txt65
-rw-r--r--src/plugins/platforms/eglfs/.prev_CMakeLists.txt115
-rw-r--r--src/plugins/platforms/eglfs/CMakeLists.txt114
-rw-r--r--src/plugins/platforms/eglfs/api/api.pri1
-rw-r--r--src/plugins/platforms/eglfs/api/qeglfscursor.cpp2
-rw-r--r--src/plugins/platforms/eglfs/api/qeglfscursor_p.h2
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/.prev_CMakeLists.txt38
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/CMakeLists.txt38
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_emu/CMakeLists.txt28
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/CMakeLists.txt36
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor.cpp1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/CMakeLists.txt33
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/CMakeLists.txt29
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/CMakeLists.txt29
-rw-r--r--src/plugins/platforms/ios/.prev_CMakeLists.txt66
-rw-r--r--src/plugins/platforms/ios/CMakeLists.txt67
-rw-r--r--src/plugins/platforms/ios/kernel.pro2
-rw-r--r--src/plugins/platforms/ios/optional/CMakeLists.txt5
-rw-r--r--src/plugins/platforms/ios/optional/nsphotolibrarysupport/CMakeLists.txt29
-rw-r--r--src/plugins/platforms/ios/qiosintegration.mm11
-rw-r--r--src/plugins/platforms/ios/qiosscreen.mm1
-rw-r--r--src/plugins/platforms/ios/quiview.mm1
-rw-r--r--src/plugins/platforms/linuxfb/.prev_CMakeLists.txt46
-rw-r--r--src/plugins/platforms/linuxfb/CMakeLists.txt47
-rw-r--r--src/plugins/platforms/minimal/.prev_CMakeLists.txt37
-rw-r--r--src/plugins/platforms/minimal/CMakeLists.txt40
-rw-r--r--src/plugins/platforms/minimalegl/.prev_CMakeLists.txt41
-rw-r--r--src/plugins/platforms/minimalegl/CMakeLists.txt42
-rw-r--r--src/plugins/platforms/minimalegl/minimalegl.pro1
-rw-r--r--src/plugins/platforms/minimalegl/qminimaleglbackingstore.cpp2
-rw-r--r--src/plugins/platforms/offscreen/.prev_CMakeLists.txt40
-rw-r--r--src/plugins/platforms/offscreen/CMakeLists.txt41
-rw-r--r--src/plugins/platforms/vnc/.prev_CMakeLists.txt43
-rw-r--r--src/plugins/platforms/vnc/CMakeLists.txt44
-rw-r--r--src/plugins/platforms/vnc/qvnc.cpp2
-rw-r--r--src/plugins/platforms/wasm/qwasmbackingstore.cpp2
-rw-r--r--src/plugins/platforms/wasm/qwasmcompositor.cpp3
-rw-r--r--src/plugins/platforms/wasm/qwasmcompositor.h5
-rw-r--r--src/plugins/platforms/wasm/qwasmfontdatabase.cpp6
-rw-r--r--src/plugins/platforms/wasm/qwasmfontdatabase.h1
-rw-r--r--src/plugins/platforms/wasm/qwasmintegration.cpp2
-rw-r--r--src/plugins/platforms/wasm/wasm.pro3
-rw-r--r--src/plugins/platforms/windows/.prev_CMakeLists.txt246
-rw-r--r--src/plugins/platforms/windows/CMakeLists.txt240
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp13
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.h1
-rw-r--r--src/plugins/platforms/windows/qwindowscursor.h4
-rw-r--r--src/plugins/platforms/windows/qwindowsdialoghelpers.cpp11
-rw-r--r--src/plugins/platforms/windows/qwindowseglcontext.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowsgdiintegration.cpp10
-rw-r--r--src/plugins/platforms/windows/qwindowsglcontext.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp56
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.h5
-rw-r--r--src/plugins/platforms/windows/qwindowsmime.cpp9
-rw-r--r--src/plugins/platforms/windows/qwindowsnativeinterface.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowsopengltester.cpp19
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp4
-rw-r--r--src/plugins/platforms/windows/windows.pro4
-rw-r--r--src/plugins/platforms/winrt/qwinrtintegration.cpp11
-rw-r--r--src/plugins/platforms/winrt/qwinrtscreen.cpp8
-rw-r--r--src/plugins/platforms/winrt/winrt.pro2
-rw-r--r--src/plugins/platforms/xcb/.prev_CMakeLists.txt167
-rw-r--r--src/plugins/platforms/xcb/CMakeLists.txt193
-rw-r--r--src/plugins/platforms/xcb/gl_integrations/CMakeLists.txt8
-rw-r--r--src/plugins/platforms/xcb/gl_integrations/xcb_egl/CMakeLists.txt28
-rw-r--r--src/plugins/platforms/xcb/gl_integrations/xcb_glx/CMakeLists.txt41
-rw-r--r--src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp2
-rw-r--r--src/plugins/platforms/xcb/nativepainting/qpaintengine_x11.cpp2
-rw-r--r--src/plugins/platforms/xcb/nativepainting/qpixmap_x11.cpp8
-rw-r--r--src/plugins/platforms/xcb/qxcbbackingstore.cpp4
-rw-r--r--src/plugins/platforms/xcb/qxcbcursor.h4
-rw-r--r--src/plugins/platforms/xcb/qxcbeventqueue.cpp4
-rw-r--r--src/plugins/platforms/xcb/qxcbeventqueue.h3
-rw-r--r--src/plugins/platforms/xcb/qxcbimage.cpp2
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp24
-rw-r--r--src/plugins/platforms/xcb/xcb_qpa_lib.pro3
-rw-r--r--src/plugins/platformthemes/CMakeLists.txt8
-rw-r--r--src/plugins/platformthemes/gtk3/.prev_CMakeLists.txt27
-rw-r--r--src/plugins/platformthemes/gtk3/CMakeLists.txt32
-rw-r--r--src/plugins/platformthemes/xdgdesktopportal/CMakeLists.txt24
-rw-r--r--src/plugins/plugins.pro1
-rw-r--r--src/plugins/printsupport/.prev_CMakeLists.txt11
-rw-r--r--src/plugins/printsupport/CMakeLists.txt11
-rw-r--r--src/plugins/printsupport/cocoa/CMakeLists.txt22
-rw-r--r--src/plugins/printsupport/cups/.prev_CMakeLists.txt30
-rw-r--r--src/plugins/printsupport/cups/CMakeLists.txt32
-rw-r--r--src/plugins/sqldrivers/.prev_CMakeLists.txt15
-rw-r--r--src/plugins/sqldrivers/CMakeLists.txt55
-rw-r--r--src/plugins/sqldrivers/README2
-rw-r--r--src/plugins/sqldrivers/configure.cmake74
-rw-r--r--src/plugins/sqldrivers/configure.json43
-rw-r--r--src/plugins/sqldrivers/db2/CMakeLists.txt32
-rw-r--r--src/plugins/sqldrivers/ibase/qsql_ibase.cpp9
-rw-r--r--src/plugins/sqldrivers/mysql/CMakeLists.txt24
-rw-r--r--src/plugins/sqldrivers/mysql/main.cpp1
-rw-r--r--src/plugins/sqldrivers/mysql/mysql.json2
-rw-r--r--src/plugins/sqldrivers/mysql/qsql_mysql.cpp2
-rw-r--r--src/plugins/sqldrivers/oci/CMakeLists.txt32
-rw-r--r--src/plugins/sqldrivers/oci/main.cpp2
-rw-r--r--src/plugins/sqldrivers/oci/oci.json2
-rw-r--r--src/plugins/sqldrivers/oci/qsql_oci.cpp12
-rw-r--r--src/plugins/sqldrivers/odbc/.prev_CMakeLists.txt32
-rw-r--r--src/plugins/sqldrivers/odbc/CMakeLists.txt33
-rw-r--r--src/plugins/sqldrivers/odbc/main.cpp2
-rw-r--r--src/plugins/sqldrivers/odbc/odbc.json2
-rw-r--r--src/plugins/sqldrivers/odbc/qsql_odbc.cpp12
-rw-r--r--src/plugins/sqldrivers/psql/.prev_CMakeLists.txt24
-rw-r--r--src/plugins/sqldrivers/psql/CMakeLists.txt29
-rw-r--r--src/plugins/sqldrivers/psql/main.cpp2
-rw-r--r--src/plugins/sqldrivers/psql/psql.json2
-rw-r--r--src/plugins/sqldrivers/psql/qsql_psql.cpp6
-rw-r--r--src/plugins/sqldrivers/sqldrivers.pro2
-rw-r--r--src/plugins/sqldrivers/sqlite/.prev_CMakeLists.txt93
-rw-r--r--src/plugins/sqldrivers/sqlite/CMakeLists.txt103
-rw-r--r--src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp9
-rw-r--r--src/plugins/sqldrivers/sqlite2/README6
-rw-r--r--src/plugins/sqldrivers/sqlite2/qsql_sqlite2.cpp615
-rw-r--r--src/plugins/sqldrivers/sqlite2/qsql_sqlite2_p.h109
-rw-r--r--src/plugins/sqldrivers/sqlite2/smain.cpp74
-rw-r--r--src/plugins/sqldrivers/sqlite2/sqlite2.json3
-rw-r--r--src/plugins/sqldrivers/sqlite2/sqlite2.pro11
-rw-r--r--src/plugins/sqldrivers/tds/README6
-rw-r--r--src/plugins/sqldrivers/tds/main.cpp81
-rw-r--r--src/plugins/sqldrivers/tds/qsql_tds.cpp881
-rw-r--r--src/plugins/sqldrivers/tds/qsql_tds_p.h120
-rw-r--r--src/plugins/sqldrivers/tds/tds.json3
-rw-r--r--src/plugins/sqldrivers/tds/tds.pro11
-rw-r--r--src/plugins/styles/.prev_CMakeLists.txt11
-rw-r--r--src/plugins/styles/CMakeLists.txt11
-rw-r--r--src/plugins/styles/android/qandroidstyle.cpp2
-rw-r--r--src/plugins/styles/mac/CMakeLists.txt23
-rw-r--r--src/plugins/styles/mac/qmacstyle_mac.mm127
-rw-r--r--src/plugins/styles/windowsvista/CMakeLists.txt27
-rw-r--r--src/plugins/styles/windowsvista/qwindowsxpstyle.cpp7
-rw-r--r--src/plugins/styles/windowsvista/qwindowsxpstyle_p_p.h2
-rw-r--r--src/printsupport/CMakeLists.txt180
-rw-r--r--src/printsupport/configure.cmake61
-rw-r--r--src/printsupport/dialogs/qpagesetupdialog_unix.cpp18
-rw-r--r--src/printsupport/dialogs/qprintdialog_unix.cpp105
-rw-r--r--src/printsupport/dialogs/qprintpreviewdialog.cpp3
-rw-r--r--src/printsupport/kernel/qcups.cpp2
-rw-r--r--src/printsupport/kernel/qcups_p.h4
-rw-r--r--src/printsupport/kernel/qprinter.cpp31
-rw-r--r--src/printsupport/kernel/qprinter.h3
-rw-r--r--src/printsupport/widgets/qcupsjobwidget.cpp4
-rw-r--r--src/printsupport/widgets/qcupsjobwidget_p.h2
-rw-r--r--src/sql/CMakeLists.txt57
-rw-r--r--src/sql/configure.cmake24
-rw-r--r--src/sql/doc/snippets/code/doc_src_sql-driver.cpp2
-rw-r--r--src/sql/doc/snippets/code/doc_src_sql-driver.qdoc23
-rw-r--r--src/sql/doc/src/qsqldatatype-table.qdoc63
-rw-r--r--src/sql/doc/src/sql-driver.qdoc52
-rw-r--r--src/sql/kernel/qsqlcachedresult.cpp8
-rw-r--r--src/sql/kernel/qsqlcachedresult_p.h9
-rw-r--r--src/sql/kernel/qsqldatabase.cpp17
-rw-r--r--src/sql/kernel/qsqldriver.cpp19
-rw-r--r--src/sql/kernel/qsqldriver.h16
-rw-r--r--src/sql/kernel/qsqlerror.cpp114
-rw-r--r--src/sql/kernel/qsqlerror.h14
-rw-r--r--src/sql/kernel/qsqlindex.cpp3
-rw-r--r--src/sql/kernel/qsqlquery.cpp6
-rw-r--r--src/sql/kernel/qsqlquery.h4
-rw-r--r--src/sql/kernel/qsqlresult_p.h25
-rw-r--r--src/sql/models/qsqlrelationaltablemodel.cpp6
-rw-r--r--src/sql/models/qsqlrelationaltablemodel.h2
-rw-r--r--src/sql/models/qsqltablemodel.cpp4
-rw-r--r--src/sql/models/qsqltablemodel.h4
-rw-r--r--src/src.pro16
-rw-r--r--src/testlib/.prev_CMakeLists.txt139
-rw-r--r--src/testlib/CMakeLists.txt135
-rw-r--r--src/testlib/Qt5TestConfigExtras.cmake.in5
-rw-r--r--src/testlib/configure.cmake34
-rw-r--r--src/testlib/qtest.h2
-rw-r--r--src/testlib/qtestblacklist.cpp10
-rw-r--r--src/testlib/qtestcase.cpp22
-rw-r--r--src/testlib/qtestcase.h11
-rw-r--r--src/testlib/qtestkeyboard.h4
-rw-r--r--src/testlib/qtesttouch.h1
-rw-r--r--src/testlib/selfcover.cmake40
-rw-r--r--src/tools/CMakeLists.txt13
-rw-r--r--src/tools/androiddeployqt/.prev_CMakeLists.txt27
-rw-r--r--src/tools/androiddeployqt/CMakeLists.txt27
-rw-r--r--src/tools/androiddeployqt/main.cpp73
-rw-r--r--src/tools/androidtestrunner/CMakeLists.txt27
-rw-r--r--src/tools/androidtestrunner/main.cpp41
-rw-r--r--src/tools/bootstrap/.prev_CMakeLists.txt262
-rw-r--r--src/tools/bootstrap/CMakeLists.txt268
-rw-r--r--src/tools/bootstrap/bootstrap.pro8
-rw-r--r--src/tools/cmake_automoc_parser/CMakeLists.txt18
-rw-r--r--src/tools/cmake_automoc_parser/main.cpp399
-rw-r--r--src/tools/moc/.prev_CMakeLists.txt35
-rw-r--r--src/tools/moc/CMakeLists.txt36
-rw-r--r--src/tools/moc/collectjson.cpp4
-rw-r--r--src/tools/moc/generator.cpp138
-rw-r--r--src/tools/moc/keywords.cpp25
-rw-r--r--src/tools/moc/moc.cpp203
-rw-r--r--src/tools/moc/moc.h9
-rw-r--r--src/tools/moc/symbols.h2
-rw-r--r--src/tools/moc/token.h1
-rw-r--r--src/tools/moc/util/generate_keywords.cpp1
-rw-r--r--src/tools/qdbuscpp2xml/.prev_CMakeLists.txt45
-rw-r--r--src/tools/qdbuscpp2xml/CMakeLists.txt48
-rw-r--r--src/tools/qdbusxml2cpp/.prev_CMakeLists.txt32
-rw-r--r--src/tools/qdbusxml2cpp/CMakeLists.txt35
-rw-r--r--src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp3
-rw-r--r--src/tools/qlalr/.prev_CMakeLists.txt26
-rw-r--r--src/tools/qlalr/CMakeLists.txt27
-rw-r--r--src/tools/qlalr/lalr.h1
-rw-r--r--src/tools/qvkgen/.prev_CMakeLists.txt16
-rw-r--r--src/tools/qvkgen/CMakeLists.txt17
-rw-r--r--src/tools/rcc/.prev_CMakeLists.txt37
-rw-r--r--src/tools/rcc/CMakeLists.txt38
-rw-r--r--src/tools/rcc/main.cpp8
-rw-r--r--src/tools/rcc/rcc.cpp54
-rw-r--r--src/tools/rcc/rcc.h4
-rw-r--r--src/tools/tracegen/.prev_CMakeLists.txt20
-rw-r--r--src/tools/tracegen/CMakeLists.txt21
-rw-r--r--src/tools/tracegen/provider.cpp42
-rw-r--r--src/tools/uic/.prev_CMakeLists.txt44
-rw-r--r--src/tools/uic/CMakeLists.txt45
-rw-r--r--src/tools/uic/cpp/cppwriteincludes.cpp2
-rw-r--r--src/tools/uic/cpp/cppwriteinitialization.h2
-rw-r--r--src/tools/uic/main.cpp7
-rw-r--r--src/tools/uic/qclass_lib_map.h44
-rw-r--r--src/tools/uic/ui4.cpp30
-rw-r--r--src/tools/uic/ui4.h90
-rw-r--r--src/tools/uic/utils.h2
-rw-r--r--src/widgets/.prev_CMakeLists.txt830
-rw-r--r--src/widgets/CMakeLists.txt832
-rw-r--r--src/widgets/Qt5WidgetsMacros.cmake80
-rw-r--r--src/widgets/Qt6WidgetsMacros.cmake81
-rw-r--r--src/widgets/accessible/complexwidgets.cpp2
-rw-r--r--src/widgets/accessible/qaccessiblemenu.cpp19
-rw-r--r--src/widgets/accessible/qaccessiblewidget.cpp5
-rw-r--r--src/widgets/accessible/rangecontrols.cpp2
-rw-r--r--src/widgets/accessible/simplewidgets.cpp2
-rw-r--r--src/widgets/configure.cmake551
-rw-r--r--src/widgets/configure.json30
-rw-r--r--src/widgets/dialogs/qcolordialog.cpp34
-rw-r--r--src/widgets/dialogs/qcolordialog.h4
-rw-r--r--src/widgets/dialogs/qdialog.cpp153
-rw-r--r--src/widgets/dialogs/qdialog.h11
-rw-r--r--src/widgets/dialogs/qfiledialog.cpp132
-rw-r--r--src/widgets/dialogs/qfiledialog.h42
-rw-r--r--src/widgets/dialogs/qfilesystemmodel.cpp4
-rw-r--r--src/widgets/dialogs/qfilesystemmodel_p.h2
-rw-r--r--src/widgets/dialogs/qinputdialog.cpp38
-rw-r--r--src/widgets/dialogs/qinputdialog.h21
-rw-r--r--src/widgets/dialogs/qmessagebox.cpp8
-rw-r--r--src/widgets/dialogs/qprogressdialog.cpp4
-rw-r--r--src/widgets/dialogs/qwizard.cpp10
-rw-r--r--src/widgets/dialogs/qwizard.h3
-rw-r--r--src/widgets/doc/snippets/javastyle.cpp2
-rw-r--r--src/widgets/doc/snippets/qstackedlayout/main.cpp2
-rw-r--r--src/widgets/doc/snippets/qstackedwidget/main.cpp2
-rw-r--r--src/widgets/doc/src/graphicsview.qdoc2
-rw-r--r--src/widgets/doc/src/widgets-and-layouts/styles.qdoc2
-rw-r--r--src/widgets/effects/qpixmapfilter.cpp18
-rw-r--r--src/widgets/effects/qpixmapfilter_p.h4
-rw-r--r--src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp3
-rw-r--r--src/widgets/graphicsview/qgraphicsgridlayoutengine.cpp30
-rw-r--r--src/widgets/graphicsview/qgraphicsgridlayoutengine_p.h6
-rw-r--r--src/widgets/graphicsview/qgraphicsitem.cpp238
-rw-r--r--src/widgets/graphicsview/qgraphicsitem.h33
-rw-r--r--src/widgets/graphicsview/qgraphicsitemanimation.cpp31
-rw-r--r--src/widgets/graphicsview/qgraphicsitemanimation.h9
-rw-r--r--src/widgets/graphicsview/qgraphicslayoutitem.cpp17
-rw-r--r--src/widgets/graphicsview/qgraphicslayoutitem.h1
-rw-r--r--src/widgets/graphicsview/qgraphicsproxywidget.cpp6
-rw-r--r--src/widgets/graphicsview/qgraphicsscene.cpp362
-rw-r--r--src/widgets/graphicsview/qgraphicsscene.h35
-rw-r--r--src/widgets/graphicsview/qgraphicssceneevent.h3
-rw-r--r--src/widgets/graphicsview/qgraphicssceneindex_p.h1
-rw-r--r--src/widgets/graphicsview/qgraphicsview.cpp98
-rw-r--r--src/widgets/graphicsview/qgraphicsview.h14
-rw-r--r--src/widgets/graphicsview/qgraphicsview_p.h1
-rw-r--r--src/widgets/graphicsview/qgraphicswidget.cpp10
-rw-r--r--src/widgets/graphicsview/qgraphicswidget.h3
-rw-r--r--src/widgets/itemviews/qabstractitemdelegate.cpp26
-rw-r--r--src/widgets/itemviews/qabstractitemdelegate.h6
-rw-r--r--src/widgets/itemviews/qabstractitemview.cpp88
-rw-r--r--src/widgets/itemviews/qabstractitemview.h7
-rw-r--r--src/widgets/itemviews/qabstractitemview_p.h1
-rw-r--r--src/widgets/itemviews/qdatawidgetmapper.cpp3
-rw-r--r--src/widgets/itemviews/qheaderview.cpp12
-rw-r--r--src/widgets/itemviews/qheaderview.h17
-rw-r--r--src/widgets/itemviews/qitemdelegate.cpp14
-rw-r--r--src/widgets/itemviews/qitemdelegate.h4
-rw-r--r--src/widgets/itemviews/qitemeditorfactory.cpp3
-rw-r--r--src/widgets/itemviews/qlistwidget.cpp112
-rw-r--r--src/widgets/itemviews/qlistwidget.h59
-rw-r--r--src/widgets/itemviews/qtableview.cpp62
-rw-r--r--src/widgets/itemviews/qtableview.h4
-rw-r--r--src/widgets/itemviews/qtableview_p.h1
-rw-r--r--src/widgets/itemviews/qtablewidget.cpp60
-rw-r--r--src/widgets/itemviews/qtablewidget.h28
-rw-r--r--src/widgets/itemviews/qtreeview.cpp34
-rw-r--r--src/widgets/itemviews/qtreeview.h4
-rw-r--r--src/widgets/itemviews/qtreeview_p.h1
-rw-r--r--src/widgets/itemviews/qtreewidget.cpp158
-rw-r--r--src/widgets/itemviews/qtreewidget.h45
-rw-r--r--src/widgets/kernel/kernel.pri25
-rw-r--r--src/widgets/kernel/qaction.cpp1367
-rw-r--r--src/widgets/kernel/qaction.h228
-rw-r--r--src/widgets/kernel/qaction_p.h135
-rw-r--r--src/widgets/kernel/qaction_widgets.cpp103
-rw-r--r--src/widgets/kernel/qaction_widgets_p.h84
-rw-r--r--src/widgets/kernel/qactiongroup.cpp445
-rw-r--r--src/widgets/kernel/qactiongroup.h108
-rw-r--r--src/widgets/kernel/qapplication.cpp220
-rw-r--r--src/widgets/kernel/qapplication.h38
-rw-r--r--src/widgets/kernel/qapplication_p.h7
-rw-r--r--src/widgets/kernel/qlayout.cpp34
-rw-r--r--src/widgets/kernel/qlayout.h8
-rw-r--r--src/widgets/kernel/qopenglwidget.cpp1471
-rw-r--r--src/widgets/kernel/qopenglwidget.h115
-rw-r--r--src/widgets/kernel/qshortcut.cpp753
-rw-r--r--src/widgets/kernel/qshortcut.h161
-rw-r--r--src/widgets/kernel/qshortcut_widgets.cpp358
-rw-r--r--src/widgets/kernel/qsizepolicy.cpp2
-rw-r--r--src/widgets/kernel/qsizepolicy.h4
-rw-r--r--src/widgets/kernel/qt_widgets_pch.h4
-rw-r--r--src/widgets/kernel/qtestsupport_widgets.cpp22
-rw-r--r--src/widgets/kernel/qtestsupport_widgets.h5
-rw-r--r--src/widgets/kernel/qtooltip.cpp2
-rw-r--r--src/widgets/kernel/qtooltip.h6
-rw-r--r--src/widgets/kernel/qwidget.cpp106
-rw-r--r--src/widgets/kernel/qwidget.h25
-rw-r--r--src/widgets/kernel/qwidget_p.h7
-rw-r--r--src/widgets/kernel/qwidgetaction.cpp4
-rw-r--r--src/widgets/kernel/qwidgetaction.h9
-rw-r--r--src/widgets/kernel/qwidgetaction_p.h6
-rw-r--r--src/widgets/kernel/qwidgetsvariant.cpp73
-rw-r--r--src/widgets/styles/qcommonstyle.cpp29
-rw-r--r--src/widgets/styles/qfusionstyle.cpp2
-rw-r--r--src/widgets/styles/qstyle.cpp25
-rw-r--r--src/widgets/styles/qstyle.h29
-rw-r--r--src/widgets/styles/qstyleanimation.cpp6
-rw-r--r--src/widgets/styles/qstyleanimation_p.h4
-rw-r--r--src/widgets/styles/qstyleoption.cpp4
-rw-r--r--src/widgets/styles/qstyleoption.h4
-rw-r--r--src/widgets/styles/qstylesheetstyle.cpp10
-rw-r--r--src/widgets/styles/qstylesheetstyle_p.h4
-rw-r--r--src/widgets/styles/qwindowsstyle.cpp2
-rw-r--r--src/widgets/util/qcompleter.cpp2
-rw-r--r--src/widgets/util/qsystemtrayicon.cpp1
-rw-r--r--src/widgets/util/qsystemtrayicon_x11.cpp2
-rw-r--r--src/widgets/util/qundogroup.cpp502
-rw-r--r--src/widgets/util/qundogroup.h101
-rw-r--r--src/widgets/util/qundostack.cpp1388
-rw-r--r--src/widgets/util/qundostack.h159
-rw-r--r--src/widgets/util/qundostack_p.h113
-rw-r--r--src/widgets/util/qundoview.cpp4
-rw-r--r--src/widgets/util/util.pri13
-rw-r--r--src/widgets/widgets/qabstractbutton.cpp43
-rw-r--r--src/widgets/widgets/qabstractbutton.h4
-rw-r--r--src/widgets/widgets/qabstractscrollarea.cpp21
-rw-r--r--src/widgets/widgets/qabstractscrollarea_p.h3
-rw-r--r--src/widgets/widgets/qabstractspinbox.cpp6
-rw-r--r--src/widgets/widgets/qbuttongroup.cpp45
-rw-r--r--src/widgets/widgets/qbuttongroup.h12
-rw-r--r--src/widgets/widgets/qcalendarwidget.cpp22
-rw-r--r--src/widgets/widgets/qcalendarwidget.h28
-rw-r--r--src/widgets/widgets/qcheckbox.cpp3
-rw-r--r--src/widgets/widgets/qcombobox.cpp58
-rw-r--r--src/widgets/widgets/qcombobox.h15
-rw-r--r--src/widgets/widgets/qdatetimeedit.cpp101
-rw-r--r--src/widgets/widgets/qdatetimeedit.h34
-rw-r--r--src/widgets/widgets/qdatetimeedit_p.h2
-rw-r--r--src/widgets/widgets/qdial.cpp2
-rw-r--r--src/widgets/widgets/qdialogbuttonbox.cpp2
-rw-r--r--src/widgets/widgets/qdockarealayout.cpp6
-rw-r--r--src/widgets/widgets/qdockwidget.cpp11
-rw-r--r--src/widgets/widgets/qdockwidget.h4
-rw-r--r--src/widgets/widgets/qeffects.cpp2
-rw-r--r--src/widgets/widgets/qfontcombobox.cpp2
-rw-r--r--src/widgets/widgets/qlabel.cpp98
-rw-r--r--src/widgets/widgets/qlabel.h25
-rw-r--r--src/widgets/widgets/qlineedit.cpp38
-rw-r--r--src/widgets/widgets/qlineedit.h4
-rw-r--r--src/widgets/widgets/qlineedit_p.cpp14
-rw-r--r--src/widgets/widgets/qlineedit_p.h4
-rw-r--r--src/widgets/widgets/qmainwindow.cpp2
-rw-r--r--src/widgets/widgets/qmainwindowlayout.cpp3
-rw-r--r--src/widgets/widgets/qmdiarea.cpp4
-rw-r--r--src/widgets/widgets/qmdisubwindow.cpp24
-rw-r--r--src/widgets/widgets/qmenu.cpp57
-rw-r--r--src/widgets/widgets/qmenu.h63
-rw-r--r--src/widgets/widgets/qmenubar.cpp25
-rw-r--r--src/widgets/widgets/qplaintextedit.cpp43
-rw-r--r--src/widgets/widgets/qplaintextedit.h11
-rw-r--r--src/widgets/widgets/qpushbutton.cpp3
-rw-r--r--src/widgets/widgets/qradiobutton.cpp3
-rw-r--r--src/widgets/widgets/qscrollbar.cpp3
-rw-r--r--src/widgets/widgets/qsizegrip.cpp3
-rw-r--r--src/widgets/widgets/qslider.cpp2
-rw-r--r--src/widgets/widgets/qspinbox.cpp34
-rw-r--r--src/widgets/widgets/qspinbox.h8
-rw-r--r--src/widgets/widgets/qsplashscreen.cpp21
-rw-r--r--src/widgets/widgets/qsplashscreen.h4
-rw-r--r--src/widgets/widgets/qsplitter.cpp37
-rw-r--r--src/widgets/widgets/qsplitter.h7
-rw-r--r--src/widgets/widgets/qtabbar.cpp79
-rw-r--r--src/widgets/widgets/qtabbar.h9
-rw-r--r--src/widgets/widgets/qtabbar_p.h2
-rw-r--r--src/widgets/widgets/qtabwidget.cpp15
-rw-r--r--src/widgets/widgets/qtabwidget.h2
-rw-r--r--src/widgets/widgets/qtextbrowser.cpp15
-rw-r--r--src/widgets/widgets/qtextbrowser.h4
-rw-r--r--src/widgets/widgets/qtextedit.cpp42
-rw-r--r--src/widgets/widgets/qtextedit.h11
-rw-r--r--src/widgets/widgets/qtoolbar.cpp13
-rw-r--r--src/widgets/widgets/qtoolbar.h2
-rw-r--r--src/widgets/widgets/qtoolbar_p.h2
-rw-r--r--src/widgets/widgets/qtoolbarlayout.cpp2
-rw-r--r--src/widgets/widgets/qtoolbarlayout_p.h2
-rw-r--r--src/widgets/widgets/qtoolbox.cpp15
-rw-r--r--src/widgets/widgets/qtoolbox.h2
-rw-r--r--src/widgets/widgets/qtoolbutton.cpp9
-rw-r--r--src/widgets/widgets/qwidgetlinecontrol_p.h7
-rw-r--r--src/widgets/widgets/qwidgetresizehandler.cpp106
-rw-r--r--src/widgets/widgets/qwidgetresizehandler_p.h34
-rw-r--r--src/widgets/widgets/qwidgettextcontrol.cpp29
-rw-r--r--src/widgets/widgets/qwidgettextcontrol_p.h3
-rw-r--r--src/widgets/widgets/qwidgettextcontrol_p_p.h2
-rw-r--r--src/winmain/.prev_CMakeLists.txt48
-rw-r--r--src/winmain/CMakeLists.txt28
-rw-r--r--src/xml/CMakeLists.txt34
-rw-r--r--src/xml/configure.cmake22
-rw-r--r--src/xml/dom/qdom.cpp26
-rw-r--r--src/xml/dom/qdom.h14
1881 files changed, 286420 insertions, 292034 deletions
diff --git a/src/3rdparty/CMakeLists.txt b/src/3rdparty/CMakeLists.txt
new file mode 100644
index 0000000000..d6ef4f3a56
--- /dev/null
+++ b/src/3rdparty/CMakeLists.txt
@@ -0,0 +1,26 @@
+# special case skip regeneration
+# The file is maintained manually
+
+if(QT_FEATURE_png AND NOT QT_FEATURE_system_png)
+ add_subdirectory(libpng)
+endif()
+qt_install_3rdparty_library_wrap_config_extra_file(BundledLibpng)
+
+if(QT_FEATURE_freetype AND NOT QT_FEATURE_system_freetype)
+ add_subdirectory(freetype)
+endif()
+qt_install_3rdparty_library_wrap_config_extra_file(BundledFreetype)
+
+if(QT_FEATURE_harfbuzz AND NOT QT_FEATURE_system_harfbuzz)
+ add_subdirectory(harfbuzz-ng)
+endif()
+qt_install_3rdparty_library_wrap_config_extra_file(BundledHarfbuzz)
+
+if(QT_FEATURE_regularexpression AND NOT QT_FEATURE_system_pcre2)
+ add_subdirectory(pcre2)
+endif()
+qt_install_3rdparty_library_wrap_config_extra_file(BundledPcre2)
+
+if (ANDROID)
+ add_subdirectory(gradle)
+endif()
diff --git a/src/3rdparty/freetype/CMakeLists.txt b/src/3rdparty/freetype/CMakeLists.txt
new file mode 100644
index 0000000000..622b488c34
--- /dev/null
+++ b/src/3rdparty/freetype/CMakeLists.txt
@@ -0,0 +1,101 @@
+# Generated from freetype.pro.
+
+#####################################################################
+## BundledFreetype Generic Library:
+#####################################################################
+
+qt_add_3rdparty_library(BundledFreetype
+ STATIC
+ INSTALL
+ SOURCES
+ src/autofit/afdummy.c
+ src/autofit/afhints.c
+ src/autofit/aflatin.c
+ src/autofit/autofit.c
+ src/base/ftbase.c
+ src/base/ftbbox.c
+ src/base/ftbitmap.c
+ src/base/ftdebug.c
+ src/base/ftfntfmt.c
+ src/base/ftglyph.c
+ src/base/ftinit.c
+ src/base/ftlcdfil.c
+ src/base/ftmm.c
+ src/base/ftsynth.c
+ src/base/fttype1.c
+ src/bdf/bdf.c
+ src/cache/ftcache.c
+ src/cff/cff.c
+ src/cid/type1cid.c
+ src/gzip/ftgzip.c
+ src/lzw/ftlzw.c
+ src/otvalid/otvalid.c
+ src/otvalid/otvbase.c
+ src/otvalid/otvcommn.c
+ src/otvalid/otvgdef.c
+ src/otvalid/otvgpos.c
+ src/otvalid/otvgsub.c
+ src/otvalid/otvjstf.c
+ src/otvalid/otvmod.c
+ src/pcf/pcf.c
+ src/pfr/pfr.c
+ src/psaux/psaux.c
+ src/pshinter/pshinter.c
+ src/psnames/psmodule.c
+ src/raster/raster.c
+ src/sfnt/sfnt.c
+ src/smooth/smooth.c
+ src/truetype/truetype.c
+ src/type1/type1.c
+ src/type42/type42.c
+ src/winfonts/winfnt.c
+ DEFINES
+ FT2_BUILD_LIBRARY
+ FT_CONFIG_OPTION_SYSTEM_ZLIB
+ TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ PUBLIC_INCLUDE_DIRECTORIES
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+)
+qt_disable_warnings(BundledFreetype)
+qt_set_symbol_visibility_hidden(BundledFreetype)
+
+#### Keys ignored in scope 1:.:.:freetype.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/src/autofit/afangles.c" "$$PWD/src/autofit/afglobal.c" "$$PWD/src/autofit/afloader.c" "$$PWD/src/autofit/afmodule.c"
+# QT_FOR_CONFIG = "gui-private"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(BundledFreetype CONDITION WIN32
+ SOURCES
+ src/base/ftsystem.c
+)
+
+qt_extend_target(BundledFreetype CONDITION UNIX
+ SOURCES
+ builds/unix/ftsystem.c
+ INCLUDE_DIRECTORIES
+ builds/unix
+)
+
+qt_extend_target(BundledFreetype CONDITION QT_FEATURE_png
+ DEFINES
+ FT_CONFIG_OPTION_USE_PNG
+ LIBRARIES
+ WrapPNG::WrapPNG
+)
+
+qt_extend_target(BundledFreetype CONDITION QT_FEATURE_system_zlib
+ LIBRARIES
+ ZLIB::ZLIB
+)
+
+qt_extend_target(BundledFreetype CONDITION NOT QT_FEATURE_system_zlib
+ INCLUDE_DIRECTORIES
+ ../zlib/src
+)
+
+qt_extend_target(BundledFreetype CONDITION NOT QT_FEATURE_system_zlib AND NOT no_core_dep
+ LIBRARIES
+ Qt::Core
+)
diff --git a/src/3rdparty/freetype/freetype.pro b/src/3rdparty/freetype/freetype.pro
index 4034815158..0665de521b 100644
--- a/src/3rdparty/freetype/freetype.pro
+++ b/src/3rdparty/freetype/freetype.pro
@@ -11,13 +11,9 @@ MODULE_INCLUDEPATH += $$PWD/include
load(qt_helper_lib)
SOURCES += \
- $$PWD/src/autofit/afangles.c \
$$PWD/src/autofit/afdummy.c \
- $$PWD/src/autofit/afglobal.c \
$$PWD/src/autofit/afhints.c \
$$PWD/src/autofit/aflatin.c \
- $$PWD/src/autofit/afloader.c \
- $$PWD/src/autofit/afmodule.c \
$$PWD/src/autofit/autofit.c \
$$PWD/src/base/ftbase.c \
$$PWD/src/base/ftbitmap.c \
@@ -57,6 +53,14 @@ SOURCES += \
$$PWD/src/type42/type42.c \
$$PWD/src/winfonts/winfnt.c
+# These source files are included by one of the sources above
+# which means they should not be compiled as separate object files.
+OTHER_FILES += \
+ $$PWD/src/autofit/afangles.c \
+ $$PWD/src/autofit/afglobal.c \
+ $$PWD/src/autofit/afloader.c \
+ $$PWD/src/autofit/afmodule.c
+
win32 {
SOURCES += $$PWD/src/base/ftsystem.c
} else {
diff --git a/src/3rdparty/gradle/CMakeLists.txt b/src/3rdparty/gradle/CMakeLists.txt
new file mode 100644
index 0000000000..d4eaa60838
--- /dev/null
+++ b/src/3rdparty/gradle/CMakeLists.txt
@@ -0,0 +1,21 @@
+# special case begin
+# special case skip regeneration
+
+install(
+ FILES
+ gradlew
+ gradlew.bat
+ DESTINATION
+ src/3rdparty/gradle
+ COMPONENT
+ Devel)
+
+install(
+ DIRECTORY
+ gradle
+ DESTINATION
+ src/3rdparty/gradle
+ COMPONENT
+ Devel)
+
+# special case end
diff --git a/src/3rdparty/harfbuzz-ng/.prev_CMakeLists.txt b/src/3rdparty/harfbuzz-ng/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..c2b1b6c9ae
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/.prev_CMakeLists.txt
@@ -0,0 +1,154 @@
+# Generated from harfbuzz-ng.pro.
+
+#####################################################################
+## BundledHarfbuzz Generic Library:
+#####################################################################
+
+qt_add_3rdparty_library(BundledHarfbuzz
+ STATIC
+ SOURCES
+ hb-dummy.cc
+ src/hb.h
+ src/hb-aat-layout.cc
+ src/hb-aat-map.cc
+ src/hb-algs.hh
+ src/hb-atomic.hh
+ src/hb-blob.cc src/hb-blob.h
+ src/hb-buffer.cc src/hb-buffer.h src/hb-buffer.hh
+ src/hb-buffer-deserialize-json.hh
+ src/hb-buffer-deserialize-text.hh
+ src/hb-buffer-serialize.cc
+ src/hb-cache.hh
+ src/hb-common.h
+ src/hb-debug.hh
+ src/hb-deprecated.h
+ src/hb-face.cc src/hb-face.h src/hb-face.hh
+ src/hb-fallback-shape.cc
+ src/hb-font.cc src/hb-font.h src/hb-font.hh
+ src/hb-map.cc
+ src/hb-mutex.hh
+ src/hb-number.cc
+ src/hb-object.hh
+ src/hb-open-file.hh
+ src/hb-open-type.hh
+ src/hb-set.cc src/hb-set.h src/hb-set.hh
+ src/hb-set-digest.hh
+ src/hb-shape.cc src/hb-shape.h
+ src/hb-shape-plan.cc src/hb-shape-plan.h src/hb-shape-plan.hh
+ src/hb-shaper.cc src/hb-shaper.hh
+ src/hb-shaper-impl.hh
+ src/hb-shaper-list.hh
+ src/hb-string-array.hh
+ src/hb-subset.cc
+ src/hb-subset-cff-common.cc
+ src/hb-subset-cff1.cc
+ src/hb-subset-cff2.cc
+ src/hb-subset-input.cc
+ src/hb-subset-plan.cc
+ src/hb-unicode.cc src/hb-unicode.h src/hb-unicode.hh
+ src/hb-utf.hh
+ src/hb-version.h
+ DEFINES
+ HAVE_ATEXIT
+ HAVE_CONFIG_H
+ HB_EXTERN=
+ HB_NDEBUG
+ HB_NO_UNICODE_FUNCS
+ QT_NO_VERSION_TAGGING
+ INCLUDE_DIRECTORIES
+ .core.includes
+ PUBLIC_INCLUDE_DIRECTORIES
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+)
+qt_disable_warnings(BundledHarfbuzz)
+qt_set_symbol_visibility_hidden(BundledHarfbuzz)
+
+#### Keys ignored in scope 1:.:.:harfbuzz-ng.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/src/harfbuzz.cc"
+# SHAPERS = "opentype"
+
+## Scopes:
+#####################################################################
+
+#### Keys ignored in scope 2:.:.:harfbuzz-ng.pro:APPLE:
+# SHAPERS = "coretext"
+
+qt_extend_target(BundledHarfbuzz CONDITION UNIX
+ DEFINES
+ HAVE_PTHREAD
+ HAVE_SCHED_H
+ HAVE_SCHED_YIELD
+)
+
+qt_extend_target(BundledHarfbuzz CONDITION WIN32
+ DEFINES
+ HB_NO_WIN1256
+)
+
+qt_extend_target(BundledHarfbuzz CONDITION SHAPERS___contains___opentype
+ SOURCES
+ src/hb-ot.h
+ src/hb-ot-cff1-table.cc
+ src/hb-ot-cff2-table.cc
+ src/hb-ot-cmap-table.hh
+ src/hb-ot-color.cc
+ src/hb-ot-color-cbdt-table.hh
+ src/hb-ot-face.cc
+ src/hb-ot-font.cc src/hb-ot-font.h
+ src/hb-ot-glyf-table.hh
+ src/hb-ot-head-table.hh
+ src/hb-ot-hhea-table.hh
+ src/hb-ot-hmtx-table.hh
+ src/hb-ot-kern-table.hh
+ src/hb-ot-layout.cc src/hb-ot-layout.h src/hb-ot-layout.hh
+ src/hb-ot-layout-gdef-table.hh
+ src/hb-ot-layout-gpos-table.hh
+ src/hb-ot-layout-gsub-table.hh
+ src/hb-ot-layout-jstf-table.hh
+ src/hb-ot-map.cc src/hb-ot-map.hh
+ src/hb-ot-math.cc src/hb-ot-math.h
+ src/hb-ot-math-table.hh
+ src/hb-ot-maxp-table.hh
+ src/hb-ot-meta.cc
+ src/hb-ot-metrics.cc
+ src/hb-ot-name.cc
+ src/hb-ot-name-table.hh
+ src/hb-ot-os2-table.hh
+ src/hb-ot-post-macroman.hh
+ src/hb-ot-post-table.hh
+ src/hb-ot-shape.cc src/hb-ot-shape.h src/hb-ot-shape.hh
+ src/hb-ot-shape-complex-arabic.cc src/hb-ot-shape-complex-arabic.hh
+ src/hb-ot-shape-complex-arabic-fallback.hh
+ src/hb-ot-shape-complex-arabic-table.hh
+ src/hb-ot-shape-complex-default.cc
+ src/hb-ot-shape-complex-hangul.cc
+ src/hb-ot-shape-complex-hebrew.cc
+ src/hb-ot-shape-complex-indic.cc src/hb-ot-shape-complex-indic.hh
+ src/hb-ot-shape-complex-indic-machine.hh
+ src/hb-ot-shape-complex-indic-table.cc
+ src/hb-ot-shape-complex-khmer.cc
+ src/hb-ot-shape-complex-myanmar.cc
+ src/hb-ot-shape-complex-myanmar-machine.hh
+ src/hb-ot-shape-complex-thai.cc
+ src/hb-ot-shape-complex-use.cc src/hb-ot-shape-complex-use.hh
+ src/hb-ot-shape-complex-use-machine.hh
+ src/hb-ot-shape-complex-use-table.cc
+ src/hb-ot-shape-complex-vowel-constraints.cc
+ src/hb-ot-shape-fallback.cc src/hb-ot-shape-fallback.hh
+ src/hb-ot-shape-normalize.cc src/hb-ot-shape-normalize.hh
+ src/hb-ot-tag.cc
+ src/hb-ot-var.cc src/hb-ot-var.h
+ src/hb-ot-var-avar-table.hh
+ src/hb-ot-var-fvar-table.hh
+ src/hb-ot-var-hvar-table.hh
+ src/hb-ot-var-mvar-table.hh
+ DEFINES
+ HAVE_OT
+)
+
+qt_extend_target(BundledHarfbuzz CONDITION SHAPERS_ISEMPTY OR SHAPERS___contains___fallback
+ SOURCES
+ src/hb-fallback-shape.cc
+ DEFINES
+ HAVE_FALLBACK
+)
diff --git a/src/3rdparty/harfbuzz-ng/AUTHORS b/src/3rdparty/harfbuzz-ng/AUTHORS
index 81cdc4cf37..83c0c66f99 100644
--- a/src/3rdparty/harfbuzz-ng/AUTHORS
+++ b/src/3rdparty/harfbuzz-ng/AUTHORS
@@ -1,9 +1,14 @@
Behdad Esfahbod
-Simon Hausmann
-Martin Hosken
+David Corbett
+David Turner
+Ebrahim Byagowi
+Garret Rieger
Jonathan Kew
+Khaled Hosny
Lars Knoll
-Werner Lemberg
-Roozbeh Pournader
+Martin Hosken
Owen Taylor
-David Turner
+Roderick Sheeter
+Roozbeh Pournader
+Simon Hausmann
+Werner Lemberg
diff --git a/src/3rdparty/harfbuzz-ng/CMakeLists.txt b/src/3rdparty/harfbuzz-ng/CMakeLists.txt
new file mode 100644
index 0000000000..38381f747d
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/CMakeLists.txt
@@ -0,0 +1,155 @@
+# Generated from harfbuzz-ng.pro.
+
+#####################################################################
+## BundledHarfbuzz Generic Library:
+#####################################################################
+
+qt_add_3rdparty_library(BundledHarfbuzz
+ STATIC
+ SOURCES
+ hb-dummy.cc
+ src/hb.h
+ src/hb-aat-layout.cc
+ src/hb-aat-map.cc
+ src/hb-algs.hh
+ src/hb-atomic.hh
+ src/hb-blob.cc src/hb-blob.h
+ src/hb-buffer.cc src/hb-buffer.h src/hb-buffer.hh
+ src/hb-buffer-deserialize-json.hh
+ src/hb-buffer-deserialize-text.hh
+ src/hb-buffer-serialize.cc
+ src/hb-cache.hh
+ src/hb-common.h
+ src/hb-debug.hh
+ src/hb-deprecated.h
+ src/hb-face.cc src/hb-face.h src/hb-face.hh
+ src/hb-fallback-shape.cc
+ src/hb-font.cc src/hb-font.h src/hb-font.hh
+ src/hb-map.cc
+ src/hb-mutex.hh
+ src/hb-number.cc
+ src/hb-object.hh
+ src/hb-open-file.hh
+ src/hb-open-type.hh
+ src/hb-set.cc src/hb-set.h src/hb-set.hh
+ src/hb-set-digest.hh
+ src/hb-shape.cc src/hb-shape.h
+ src/hb-shape-plan.cc src/hb-shape-plan.h src/hb-shape-plan.hh
+ src/hb-shaper.cc src/hb-shaper.hh
+ src/hb-shaper-impl.hh
+ src/hb-shaper-list.hh
+ src/hb-string-array.hh
+ src/hb-subset.cc
+ src/hb-subset-cff-common.cc
+ src/hb-subset-cff1.cc
+ src/hb-subset-cff2.cc
+ src/hb-subset-input.cc
+ src/hb-subset-plan.cc
+ src/hb-unicode.cc src/hb-unicode.h src/hb-unicode.hh
+ src/hb-utf.hh
+ src/hb-version.h
+ DEFINES
+ HAVE_ATEXIT
+ HAVE_CONFIG_H
+ HB_EXTERN=
+ HB_NDEBUG
+ HB_NO_UNICODE_FUNCS
+ QT_NO_VERSION_TAGGING
+ INCLUDE_DIRECTORIES
+ $<TARGET_PROPERTY:Core,INCLUDE_DIRECTORIES> # special case
+ "${CMAKE_CURRENT_SOURCE_DIR}" # special case
+ PUBLIC_INCLUDE_DIRECTORIES
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+)
+qt_disable_warnings(BundledHarfbuzz)
+qt_set_symbol_visibility_hidden(BundledHarfbuzz)
+
+#### Keys ignored in scope 1:.:.:harfbuzz-ng.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/src/harfbuzz.cc"
+# SHAPERS = "opentype"
+
+## Scopes:
+#####################################################################
+
+#### Keys ignored in scope 2:.:.:harfbuzz-ng.pro:APPLE:
+# SHAPERS = "coretext"
+
+qt_extend_target(BundledHarfbuzz CONDITION UNIX
+ DEFINES
+ HAVE_PTHREAD
+ HAVE_SCHED_H
+ HAVE_SCHED_YIELD
+)
+
+qt_extend_target(BundledHarfbuzz CONDITION WIN32
+ DEFINES
+ HB_NO_WIN1256
+)
+
+qt_extend_target(BundledHarfbuzz CONDITION TRUE # special case
+ SOURCES
+ src/hb-ot.h
+ src/hb-ot-cff1-table.cc
+ src/hb-ot-cff2-table.cc
+ src/hb-ot-cmap-table.hh
+ src/hb-ot-color.cc
+ src/hb-ot-color-cbdt-table.hh
+ src/hb-ot-face.cc
+ src/hb-ot-font.cc src/hb-ot-font.h
+ src/hb-ot-glyf-table.hh
+ src/hb-ot-head-table.hh
+ src/hb-ot-hhea-table.hh
+ src/hb-ot-hmtx-table.hh
+ src/hb-ot-kern-table.hh
+ src/hb-ot-layout.cc src/hb-ot-layout.h src/hb-ot-layout.hh
+ src/hb-ot-layout-gdef-table.hh
+ src/hb-ot-layout-gpos-table.hh
+ src/hb-ot-layout-gsub-table.hh
+ src/hb-ot-layout-jstf-table.hh
+ src/hb-ot-map.cc src/hb-ot-map.hh
+ src/hb-ot-math.cc src/hb-ot-math.h
+ src/hb-ot-math-table.hh
+ src/hb-ot-maxp-table.hh
+ src/hb-ot-meta.cc
+ src/hb-ot-metrics.cc
+ src/hb-ot-name.cc
+ src/hb-ot-name-table.hh
+ src/hb-ot-os2-table.hh
+ src/hb-ot-post-macroman.hh
+ src/hb-ot-post-table.hh
+ src/hb-ot-shape.cc src/hb-ot-shape.h src/hb-ot-shape.hh
+ src/hb-ot-shape-complex-arabic.cc src/hb-ot-shape-complex-arabic.hh
+ src/hb-ot-shape-complex-arabic-fallback.hh
+ src/hb-ot-shape-complex-arabic-table.hh
+ src/hb-ot-shape-complex-default.cc
+ src/hb-ot-shape-complex-hangul.cc
+ src/hb-ot-shape-complex-hebrew.cc
+ src/hb-ot-shape-complex-indic.cc src/hb-ot-shape-complex-indic.hh
+ src/hb-ot-shape-complex-indic-machine.hh
+ src/hb-ot-shape-complex-indic-table.cc
+ src/hb-ot-shape-complex-khmer.cc
+ src/hb-ot-shape-complex-myanmar.cc
+ src/hb-ot-shape-complex-myanmar-machine.hh
+ src/hb-ot-shape-complex-thai.cc
+ src/hb-ot-shape-complex-use.cc src/hb-ot-shape-complex-use.hh
+ src/hb-ot-shape-complex-use-machine.hh
+ src/hb-ot-shape-complex-use-table.cc
+ src/hb-ot-shape-complex-vowel-constraints.cc
+ src/hb-ot-shape-fallback.cc src/hb-ot-shape-fallback.hh
+ src/hb-ot-shape-normalize.cc src/hb-ot-shape-normalize.hh
+ src/hb-ot-tag.cc
+ src/hb-ot-var.cc src/hb-ot-var.h
+ src/hb-ot-var-avar-table.hh
+ src/hb-ot-var-fvar-table.hh
+ src/hb-ot-var-hvar-table.hh
+ src/hb-ot-var-mvar-table.hh
+ DEFINES
+ HAVE_OT
+)
+
+qt_extend_target(BundledHarfbuzz CONDITION SHAPERS_ISEMPTY OR SHAPERS___contains___fallback
+ SOURCES
+ src/hb-fallback-shape.cc
+ DEFINES
+ HAVE_FALLBACK
+)
diff --git a/src/3rdparty/harfbuzz-ng/COPYING b/src/3rdparty/harfbuzz-ng/COPYING
index 9d1056f40b..0278e60a5c 100644
--- a/src/3rdparty/harfbuzz-ng/COPYING
+++ b/src/3rdparty/harfbuzz-ng/COPYING
@@ -2,7 +2,8 @@ HarfBuzz is licensed under the so-called "Old MIT" license. Details follow.
For parts of HarfBuzz that are licensed under different licenses see individual
files names COPYING in subdirectories where applicable.
-Copyright © 2010,2011,2012 Google, Inc.
+Copyright © 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019 Google, Inc.
+Copyright © 2019 Facebook, Inc.
Copyright © 2012 Mozilla Foundation
Copyright © 2011 Codethink Limited
Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies)
diff --git a/src/3rdparty/harfbuzz-ng/NEWS b/src/3rdparty/harfbuzz-ng/NEWS
index 7434bcada0..7dde1193f3 100644
--- a/src/3rdparty/harfbuzz-ng/NEWS
+++ b/src/3rdparty/harfbuzz-ng/NEWS
@@ -1,3 +1,526 @@
+Overview of changes leading to 2.6.4
+Monday, October 29, 2019
+====================================
+- Small bug fix.
+- Build fixes.
+
+
+Overview of changes leading to 2.6.3
+Monday, October 28, 2019
+====================================
+- Misc small fixes, mostly to build-related issues.
+- New API:
++hb_font_get_nominal_glyphs()
+
+
+Overview of changes leading to 2.6.2
+Monday, September 30, 2019
+====================================
+- Misc small fixes, mostly to build-related issues.
+
+
+Overview of changes leading to 2.6.1
+Thursday, August 22, 2019
+====================================
+- Fix regression with hb_font_create_sub_font scaling introduced in 2.6.0.
+- Change interpretation of font PTEM size / CoreText font size handling.
+ See https://github.com/harfbuzz/harfbuzz/pull/1484
+- hb-ot-font: Prefer symbol cmap subtable if present.
+- Apply 'dist'/'abvm'/'blwm' features to all scripts.
+- Drop experimental DirectWrite API.
+
+
+Overview of changes leading to 2.6.0
+Tuesday, August 13, 2019
+====================================
+- New OpenType metrics, baseline, and metadata table access APIs.
+- New API to set font variations to a named-instance.
+- New hb-gdi.h header and API for creating hb_face_t from HFONT.
+- Amalgam: Provide a single-file harfbuzz.cc file for easier alternate building.
+- More size-reduction configurable options, enabled by HB_TINY.
+- New API:
++hb_font_set_var_named_instance()
++hb_gdi_face_create()
++hb_ot_layout_baseline_tag_t
++hb_ot_layout_get_baseline()
++hb_ot_meta_tag_t
++hb_ot_meta_get_entry_tags()
++hb_ot_meta_reference_entry()
++hb_ot_metrics_tag_t
++hb_ot_metrics_get_position()
++hb_ot_metrics_get_variation()
++hb_ot_metrics_get_x_variation()
++hb_ot_metrics_get_y_variation()
+
+
+Overview of changes leading to 2.5.3
+Wednesday, June 26, 2019
+====================================
+- Fix UCD script data for Unicode 10+ scripts. This was broken since 2.5.0.
+- More optimizations for HB_TINY.
+
+
+Overview of changes leading to 2.5.2
+Thursday, June 20, 2019
+====================================
+- More hb-config.hh facilities to shrink library size, namely when built as
+ HB_TINY.
+- New documentation of custom configurations in CONFIG.md.
+- Fix build on gcc 4.8. That's supported again.
+- Universal Shaping Engine improvements thanks to David Corbett.
+- API Changes: Undeprecate some horizontal-kerning API and re-enable in hb-ft,
+ such that Type1 fonts will continue kerning.
+
+
+Overview of changes leading to 2.5.1
+Friday, May 31, 2019
+====================================
+- Fix build with various versions of Visual Studio.
+- Improved documentation, thanks to Nathan Willis.
+- Bugfix in subsetting glyf table.
+- Improved scripts for cross-compiling for Windows using mingw.
+- Rename HB_MATH_GLYPH_PART_FLAG_EXTENDER to HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER.
+ A deprecated macro is added for backwards-compatibility.
+
+
+Overview of changes leading to 2.5.0
+Friday, May 24, 2019
+====================================
+- This release does not include much functional changes, but includes major internal
+ code-base changes. We now require C++11. Support for gcc 4.8 and earlier has been
+ dropped.
+- New hb-config.hh facility for compiling smaller library for embedded and web usecases.
+- New Unicode Character Databse implementation that is half the size of previously-used
+ UCDN.
+- Subsetter improvements.
+- Improved documentation, thanks to Nathan Willis.
+- Misc shaping fixes.
+
+
+Overview of changes leading to 2.4.0
+Monday, March 25, 2019
+====================================
+- Unicode 12.
+- Misc fixes.
+- Subsetter improvements.
+- New API:
+HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE
+hb_directwrite_face_create()
+
+
+Overview of changes leading to 2.3.1
+Wednesday, January 30, 2019
+====================================
+- AAT bug fixes.
+- Misc internal housekeeping cleanup.
+
+
+Overview of changes leading to 2.3.0
+Thursday, December 20, 2018
+====================================
+- Fix regression on big-endian architectures. Ouch!
+- Misc bug and build fixes.
+- Fix subsetting of simple GSUB/GDEF.
+- Merge CFF / CFF2 support contributed by Adobe. This mostly involves
+ the subsetter, but also get_glyph_extents on CFF fonts.
+
+New API in hb-aat.h:
++hb_aat_layout_has_substitution()
++hb_aat_layout_has_positioning()
++hb_aat_layout_has_tracking()
+
+
+Overview of changes leading to 2.2.0
+Thursday, November 29, 2018
+====================================
+- Misc shaping bug fixes.
+- Add font variations named-instance API.
+- Deprecate font variations axis enumeration API and add replacement.
+- AAT shaping improvements:
+ o Fixed 'kern' table Format 2 implementation.
+ o Implement 'feat' table API for feature detection.
+ o Blacklist 'GSUB' table of fonts from 'MUTF' foundry that also have 'morx'.
+
+New API:
++hb_aat_layout_feature_type_t
++hb_aat_layout_feature_selector_t
++hb_aat_layout_get_feature_types()
++hb_aat_layout_feature_type_get_name_id
++hb_aat_layout_feature_selector_info_t
++HB_AAT_LAYOUT_NO_SELECTOR_INDEX
++hb_aat_layout_feature_type_get_selector_infos()
++hb_ot_var_axis_flags_t
++hb_ot_var_axis_info_t
++hb_ot_var_get_axis_infos()
++hb_ot_var_find_axis_info()
++hb_ot_var_get_named_instance_count()
++hb_ot_var_named_instance_get_subfamily_name_id()
++hb_ot_var_named_instance_get_postscript_name_id()
++hb_ot_var_named_instance_get_design_coords()
+
+Deprecated API:
++HB_OT_VAR_NO_AXIS_INDEX
++hb_ot_var_axis_t
++hb_ot_var_get_axes()
++hb_ot_var_find_axis()
+
+
+Overview of changes leading to 2.1.3
+Friday, November 16, 2018
+====================================
+- Fix AAT 'mort' shaping, which was broken in 2.1.2
+
+
+Overview of changes leading to 2.1.2
+Friday, November 16, 2018
+====================================
+- Various internal changes.
+- AAT shaping improvements:
+ o Implement kern table Format 1 state-machine-based kerning.
+ o Implement cross-stream kerning (cursive positioning, etc).
+ o Ignore emptyish GSUB tables (zero scripts) if morx present.
+ o Don't apply GPOS if morx is being applied. Matches Apple.
+
+
+-Overview of changes leading to 2.1.1
+Monday, November 5, 2018
+====================================
+- AAT improvements:
+ o Implement 'mort' table.
+ o Implement 'kern' subtables Format 1 and Format 3.
+
+
+Overview of changes leading to 2.1.0
+Tuesday, October 30, 2018
+====================================
+- AAT shaping improvements:
+ o Allow user controlling AAT features, for whole buffer only currently.
+ o Several 'morx' fixes.
+ o Implement tuple-kerns in 'kerx'; Fixes kerning with Apple default
+ San Francisco fonts.
+- Support for color fonts:
+ o COLR/CPAL API to fetch color layers.
+ o SVG table to fetch SVG documents.
+ o CBDT/sbix API to fetch PNG images.
+- New 'name' table API.
+- hb-ot-font now uses 'VORG' table to correctly position CFF glyphs
+ in vertical layout.
+- Various fuzzer-found bug fixes.
+
+Changed API:
+
+A type and a macro added in 2.0.0 were renamed:
+
+hb_name_id_t -> hb_ot_name_id_t
+HB_NAME_ID_INVALID -> HB_OT_NAME_ID_INVALID
+
+New API:
+
++hb_color_t
++HB_COLOR
++hb_color_get_alpha()
++hb_color_get_red()
++hb_color_get_green()
++hb_color_get_blue()
++hb_ot_color_has_palettes()
++hb_ot_color_palette_get_count()
++hb_ot_color_palette_get_name_id()
++hb_ot_color_palette_color_get_name_id()
++hb_ot_color_palette_flags_t
++hb_ot_color_palette_get_flags()
++hb_ot_color_palette_get_colors()
++hb_ot_color_has_layers()
++hb_ot_color_layer_t
++hb_ot_color_glyph_get_layers()
++hb_ot_color_has_svg()
++hb_ot_color_glyph_reference_svg()
++hb_ot_color_has_png()
++hb_ot_color_glyph_reference_png()
+
++hb_ot_name_id_t
++HB_OT_NAME_ID_INVALID
++HB_OT_NAME_ID_COPYRIGHT
++HB_OT_NAME_ID_FONT_FAMILY
++HB_OT_NAME_ID_FONT_SUBFAMILY
++HB_OT_NAME_ID_UNIQUE_ID
++HB_OT_NAME_ID_FULL_NAME
++HB_OT_NAME_ID_VERSION_STRING
++HB_OT_NAME_ID_POSTSCRIPT_NAME
++HB_OT_NAME_ID_TRADEMARK
++HB_OT_NAME_ID_MANUFACTURER
++HB_OT_NAME_ID_DESIGNER
++HB_OT_NAME_ID_DESCRIPTION
++HB_OT_NAME_ID_VENDOR_URL
++HB_OT_NAME_ID_DESIGNER_URL
++HB_OT_NAME_ID_LICENSE
++HB_OT_NAME_ID_LICENSE_URL
++HB_OT_NAME_ID_TYPOGRAPHIC_FAMILY
++HB_OT_NAME_ID_TYPOGRAPHIC_SUBFAMILY
++HB_OT_NAME_ID_MAC_FULL_NAME
++HB_OT_NAME_ID_SAMPLE_TEXT
++HB_OT_NAME_ID_CID_FINDFONT_NAME
++HB_OT_NAME_ID_WWS_FAMILY
++HB_OT_NAME_ID_WWS_SUBFAMILY
++HB_OT_NAME_ID_LIGHT_BACKGROUND
++HB_OT_NAME_ID_DARK_BACKGROUND
++HB_OT_NAME_ID_VARIATIONS_PS_PREFIX
++hb_ot_name_entry_t
++hb_ot_name_list_names()
++hb_ot_name_get_utf8()
++hb_ot_name_get_utf16()
++hb_ot_name_get_utf32()
+
+
+Overview of changes leading to 2.0.2
+Saturday, October 20, 2018
+====================================
+- Fix two minor memory access issues in AAT tables.
+
+
+Overview of changes leading to 2.0.1
+Friday, October 19, 2018
+====================================
+- Fix hb-version.h reported release version that went wrong (1.8.0)
+ with previous release.
+- Fix extrapolation in 'trak' table.
+- Fix hb-font infinite-recursion issue with some font funcs and
+ subclassed fonts.
+- Implement variation-kerning format in kerx table, although without
+ variation.
+- Fix return value of hb_map_is_empty().
+
+
+Overview of changes leading to 2.0.0
+Thursday, October 18, 2018
+====================================
+- Added AAT shaping support (morx/kerx/trak).
+ Automatically used if GSUB/GPOS are not available respectively.
+ Set HB_OPTIONS=aat env var to have morx/kerx preferred over
+ GSUB/GPOS.
+- Apply TrueType kern table internally, instead of relying on
+ hb_font_t callbacks.
+- Khmer shaper significantly rewritten to better match Uniscribe.
+- Indic3 tags ('dev3', etc) are passed to USE shaper.
+- .dfont Mac font containers implemented.
+- Script- and language-mapping revamped to better use BCP 47.
+- Misc USE and Indic fixes.
+- Misc everything fixes.
+- Too many things to list. Biggest release since 0.9.1, with
+ over 500 commits in just over 5 weeks! Didn't intend it to
+ be a big release. Just happened to become.
+- hb-ft now locks underlying FT_Face during use.
+
+API changes:
+
+- Newly-created hb_font_t's now have our internal "hb-ot-font"
+ callbacks set on them, so they should work out of the box
+ without any callbacks set. If callbacks are set, everything
+ is back to what it was before, the fallback callbacks are
+ null. If you to get the internal implementation modified,
+ sub_font it.
+
+- New hb_font_funcs_set_nominal_glyphs_func() allows speeding
+ up character to glyph mapping.
+
+New API:
++HB_FEATURE_GLOBAL_START
++HB_FEATURE_GLOBAL_END
++hb_buffer_set_invisible_glyph()
++hb_buffer_get_invisible_glyph()
++hb_font_funcs_set_nominal_glyphs_func()
++hb_ot_layout_table_select_script()
++hb_ot_layout_script_select_language()
++hb_ot_layout_feature_get_name_ids()
++hb_ot_layout_feature_get_characters()
++hb_name_id_t
++HB_NAME_ID_INVALID
++HB_OT_MAX_TAGS_PER_SCRIPT
++hb_ot_tags_from_script_and_language()
++hb_ot_tags_to_script_and_language()
+
+Deprecated API:
+-hb_font_funcs_set_glyph_func()
+-hb_unicode_eastasian_width_func_t
+-hb_unicode_funcs_set_eastasian_width_func()
+-hb_unicode_eastasian_width()
+-hb_unicode_decompose_compatibility_func_t
+-HB_UNICODE_MAX_DECOMPOSITION_LEN
+-hb_unicode_funcs_set_decompose_compatibility_func()
+-hb_unicode_decompose_compatibility()
+-hb_font_funcs_set_glyph_h_kerning_func()
+-hb_font_funcs_set_glyph_v_kerning_func()
+-hb_font_get_glyph_h_kerning()
+-hb_font_get_glyph_v_kerning()
+-hb_font_get_glyph_kerning_for_direction()
+-hb_ot_layout_table_choose_script()
+-hb_ot_layout_script_find_language()
+-hb_ot_tags_from_script()
+-hb_ot_tag_from_language()
+
+
+Overview of changes leading to 1.9.0
+Monday, September 10, 2018
+====================================
+- Added 'cmap' API to hb_face_t.
+- Face-builder API.
+- hb-ot-font re-creation should be much leaner now, as the
+ font tables it uses are cached on hb_face_t now.
+- Internal source header file name changes:
+ hb-*-private.hh is renamed to hb-*.hh.
+
+New API:
++HB_UNICODE_MAX
++hb_face_collect_unicodes()
++hb_face_collect_variation_selectors()
++hb_face_collect_variation_unicodes()
++hb_face_builder_create()
++hb_face_builder_add_table()
+
+
+Overview of changes leading to 1.8.8
+Tuesday, August 14, 2018
+====================================
+- Fix hb-icu crash on architectures where compare_exchange_weak() can
+ fail falsely. This bug was introduced in 1.8.4.
+ https://bugs.chromium.org/p/chromium/issues/detail?id=873568
+- More internal refactoring of atomic operations and singletons.
+- API changes:
+ The following functions do NOT reference their return value before
+ returning:
+ * hb_unicode_funcs_get_default()
+ * hb_glib_get_unicode_funcs()
+ * hb_icu_get_unicode_funcs()
+ This is consistent with their naming ("get", instead of "reference")
+ as well as how they are used in the wild (ie. no one calls destroy()
+ on their return value.)
+
+
+Overview of changes leading to 1.8.7
+Wednesday, August 8, 2018
+====================================
+- Fix assertion failure with GDEF-blacklisted fonts.
+
+
+Overview of changes leading to 1.8.6
+Tuesday, August 7, 2018
+====================================
+- Internal code shuffling.
+- New API to speed up getting advance widths for implementations
+ that have heavy overhead in get_h_advance callback:
++hb_font_funcs_set_glyph_h_advances_func
++hb_font_funcs_set_glyph_v_advances_func
++hb_font_get_glyph_advances_for_direction
++hb_font_get_glyph_h_advances
++hb_font_get_glyph_h_advances_func_t
++hb_font_get_glyph_v_advances
++hb_font_get_glyph_v_advances_func_t
+
+
+Overview of changes leading to 1.8.5
+Wednesday, August 1, 2018
+====================================
+- Major Khmer shaper improvements to better match Microsoft.
+- Indic bug fixes.
+- Internal improvements to atomic operations.
+
+
+Overview of changes leading to 1.8.4
+Tuesday, July 17, 2018
+====================================
+- Fix build on non-C++11.
+- Use C++-style GCC atomics and C++11 atomics.
+
+
+Overview of changes leading to 1.8.3
+Wednesday, July 11, 2018
+====================================
+- A couple of Indic / USE bug fixes.
+- Disable vectorization, as it was causing unaligned access bus error on
+ certain 32bit architectures.
+
+
+Overview of changes leading to 1.8.2
+Tuesday, July 3, 2018
+====================================
+- Fix infinite loop in Khmer shaper.
+- Improve hb_blob_create_from_file() for streams.
+
+
+Overview of changes leading to 1.8.1
+Tuesday, June 12, 2018
+====================================
+- Fix hb-version.h file generation; last two releases went out with wrong ones.
+- Add correctness bug in hb_set_t operations, introduced in 1.7.7.
+- Remove HB_SUBSET_BUILTIN build option. Not necessary.
+
+
+Overview of changes leading to 1.8.0
+Tuesday, June 5, 2018
+====================================
+- Update to Unicode 11.0.0.
+
+
+Overview of changes leading to 1.7.7
+Tuesday, June 5, 2018
+====================================
+- Lots of internal changes, but not yet exposed externally.
+- All HarfBuzz objects are significantly smaller in size now.
+- Sinhala: Position repha on top of post-consonant, not base.
+ This better matches Windows 10 behavior, which was changed
+ from previous Windows versions.
+- New build options:
+ o New cpp macro HB_NO_ATEXIT
+ o New cpp macro HB_SUBSET_BUILTIN
+- Significant libharfbuzz-subset changes. API subject to change.
+- New API in libharfbuzz:
+
++hb_blob_create_from_file()
++hb_face_count()
+
+A hashmap implementation:
++hb-map.h
++HB_MAP_VALUE_INVALID
++hb_map_t
++hb_map_create()
++hb_map_get_empty()
++hb_map_reference()
++hb_map_destroy()
++hb_map_set_user_data()
++hb_map_get_user_data()
++hb_map_allocation_successful()
++hb_map_clear()
++hb_map_is_empty()
++hb_map_get_population()
++hb_map_set()
++hb_map_get()
++hb_map_del()
++hb_map_has()
+
+
+Overview of changes leading to 1.7.6
+Wednesday, March 7, 2018
+====================================
+
+- Fix to hb_set_t binary operations. Ouch.
+- New experimental harfbuzz-subset library. All of hb-subset.h
+ is experimental right now and API WILL change.
+
+- New API:
+hb_blob_copy_writable_or_fail()
+HB_OT_TAG_BASE
+hb_set_previous()
+hb_set_previous_range()
+
+
+Overview of changes leading to 1.7.5
+Tuesday, January 30, 2018
+====================================
+
+- Separate Khmer shaper from Indic.
+- First stab at AAT morx. Not hooked up.
+- Misc bug fixes.
+
+
Overview of changes leading to 1.7.4
Wednesday, December 20, 2017
====================================
diff --git a/src/3rdparty/harfbuzz-ng/README b/src/3rdparty/harfbuzz-ng/README
deleted file mode 100644
index aa055169d5..0000000000
--- a/src/3rdparty/harfbuzz-ng/README
+++ /dev/null
@@ -1,15 +0,0 @@
-[![Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg)](https://travis-ci.org/harfbuzz/harfbuzz)
-[![Build status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true)](https://ci.appveyor.com/project/harfbuzz/harfbuzz)
-[![CircleCI](https://circleci.com/gh/harfbuzz/harfbuzz.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz)
-[![Coverage Status](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz)
-[ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/)
-
-This is HarfBuzz, a text shaping library.
-
-For bug reports, mailing list, and other information please visit:
-
- http://harfbuzz.org/
-
-For license information, see the file COPYING.
-
-Documentation: https://harfbuzz.github.io
diff --git a/src/3rdparty/harfbuzz-ng/README.md b/src/3rdparty/harfbuzz-ng/README.md
new file mode 100644
index 0000000000..e0ef93576b
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/README.md
@@ -0,0 +1,34 @@
+[![Travis Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg?branch=master)](https://travis-ci.org/harfbuzz/harfbuzz)
+[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true&branch=master)](https://ci.appveyor.com/project/harfbuzz/harfbuzz)
+[![CircleCI Build Status](https://circleci.com/gh/harfbuzz/harfbuzz/tree/master.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz/tree/master)
+[![OSS-Fuzz Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/harfbuzz.svg)](https://oss-fuzz-build-logs.storage.googleapis.com/index.html)
+[![Coverity Code Health](https://img.shields.io/coverity/scan/5450.svg)](https://scan.coverity.com/projects/behdad-harfbuzz)
+[![Codacy Code Health](https://api.codacy.com/project/badge/Grade/f17f1708783c447488bc8dd317150eaa)](https://app.codacy.com/app/behdad/harfbuzz)
+[![Codecov Code Coverage](https://codecov.io/gh/harfbuzz/harfbuzz/branch/master/graph/badge.svg)](https://codecov.io/gh/harfbuzz/harfbuzz)
+[![Coverals Code Coverage](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz)
+[![Packaging status](https://repology.org/badge/tiny-repos/harfbuzz.svg)](https://repology.org/project/harfbuzz/versions)
+[ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/)
+
+This is HarfBuzz, a text shaping library.
+
+For bug reports, mailing list, and other information please visit:
+
+ http://harfbuzz.org/
+
+For license information, see [COPYING](COPYING).
+
+For build information, see [BUILD.md](BUILD.md).
+
+For custom configurations, see [CONFIG.md](CONFIG.md).
+
+For test execution, see [TESTING.md](TESTING.md).
+
+Documentation: https://harfbuzz.github.io
+
+
+<details>
+ <summary>Packaging status of HarfBuzz</summary
+
+[![Packaging status](https://repology.org/badge/vertical-allrepos/harfbuzz.svg?header=harfbuzz)](https://repology.org/project/harfbuzz/versions)
+
+</details>
diff --git a/src/3rdparty/harfbuzz-ng/THANKS b/src/3rdparty/harfbuzz-ng/THANKS
index 940cfde5c3..88cb7e9ea1 100644
--- a/src/3rdparty/harfbuzz-ng/THANKS
+++ b/src/3rdparty/harfbuzz-ng/THANKS
@@ -1,6 +1,6 @@
Bradley Grainger
-Khaled Hosny
Kenichi Ishibashi
+Ivan Kuckir <https://photopea.com/>
Ryan Lortie
Jeff Muizelaar
suzuki toshiya
diff --git a/src/3rdparty/harfbuzz-ng/TODO b/src/3rdparty/harfbuzz-ng/TODO
index 4f37f605b1..d8e41050ec 100644
--- a/src/3rdparty/harfbuzz-ng/TODO
+++ b/src/3rdparty/harfbuzz-ng/TODO
@@ -1,24 +1,8 @@
-General fixes:
-=============
-
-- AAT 'morx' implementation.
-
-- Return "safe-to-break" bit from shaping.
-
-- Implement 'rand' feature.
-
-- mask propagation? (when ligation, "or" the masks).
-
-
API issues:
===========
- API to accept a list of languages?
-- Add init_func to font_funcs. Adjust ft.
-
-- 'const' for getter APIs? (use mutable internally)
-
- Remove hb_ot_shape_glyphs_closure()?
@@ -27,20 +11,12 @@ API additions
- Language to/from script.
-- blob_from_file?
-
- Add hb-cairo glue
-- Add sanitize API (and a cached version, that saves result on blob user-data)
-
-- BCP 47 language handling / API (language_matches?)
-
-- Add hb_font_create_unscaled()?
+- Add sanitize API.
- Add query / enumeration API for aalt-like features?
-- SFNT api? get_num_faces? get_table_tags? (there's something in stash)
-
- Add segmentation API
- Add hb-fribidi glue?
@@ -50,20 +26,3 @@ hb-view / hb-shape enhancements:
===============================
- Add --width, --height, --auto-size, --ink-box, --align, etc?
-
-
-Tests to write:
-==============
-
-- ot-layout enumeration API (needs font)
-
-- Finish test-shape.c, grep for TODO
-
-- Finish test-unicode.c, grep for TODO
-
-- GObject, FreeType, etc
-
-- hb_cache_t and relatives
-
-- hb_feature_to/from_string
-- hb_buffer_[sg]et_contents
diff --git a/src/3rdparty/harfbuzz-ng/config.h b/src/3rdparty/harfbuzz-ng/config.h
index b8b6b3c0fe..38087a71ef 100644
--- a/src/3rdparty/harfbuzz-ng/config.h
+++ b/src/3rdparty/harfbuzz-ng/config.h
@@ -22,6 +22,9 @@
*
*/
+#ifndef QHARFBUZZ_CONFIG_H
+#define QHARFBUZZ_CONFIG_H
+
#include <QtCore/qatomic.h>
QT_USE_NAMESPACE
@@ -37,11 +40,19 @@ inline QAtomicPointer<T> *makeAtomicPointer(T * const &ptr)
return reinterpret_cast<QAtomicPointer<T> *>(const_cast<T **>(&ptr));
}
+static inline void _hb_memory_barrier ()
+{
+ QAtomicInt a;
+ a.ref(); // Ordered memory semantics, so imposes a memory barrier at this point
+}
+
} // namespace
typedef int hb_atomic_int_impl_t;
#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V) reinterpret_cast<QAtomicInt &>(AI).fetchAndAddOrdered(V)
+#define hb_atomic_int_impl_add(AI, V) reinterpret_cast<QAtomicInt *>(AI)->fetchAndAddOrdered(V)
#define hb_atomic_ptr_impl_get(P) makeAtomicPointer(*(P))->loadAcquire()
#define hb_atomic_ptr_impl_cmpexch(P,O,N) makeAtomicPointer(*(P))->testAndSetOrdered((O), (N))
+
+#endif // QHARFBUZZ_CONFIG_H
diff --git a/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro b/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro
index ad40b98753..1c6eb992f0 100644
--- a/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro
+++ b/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro
@@ -19,7 +19,7 @@ darwin: SHAPERS += coretext
#SHAPERS += fallback
DEFINES += HAVE_CONFIG_H
-DEFINES += HB_NO_UNICODE_FUNCS HB_DISABLE_DEPRECATED
+DEFINES += HB_NO_UNICODE_FUNCS
DEFINES += HB_NDEBUG
DEFINES += HB_EXTERN=
@@ -28,62 +28,60 @@ DEFINES += HAVE_ATEXIT
unix: DEFINES += HAVE_PTHREAD HAVE_SCHED_H HAVE_SCHED_YIELD
win32: DEFINES += HB_NO_WIN1256
-#Workaround https://code.google.com/p/android/issues/detail?id=194631
-android: DEFINES += _POSIX_C_SOURCE=200112L
-
# Harfbuzz-NG inside Qt uses the Qt atomics (inline code only)
INCLUDEPATH += $$QT.core.includes
DEFINES += QT_NO_VERSION_TAGGING
SOURCES += \
+ $$PWD/src/hb-aat-layout.cc \
+ $$PWD/src/hb-aat-map.cc \
$$PWD/src/hb-blob.cc \
$$PWD/src/hb-buffer.cc \
$$PWD/src/hb-buffer-serialize.cc \
- $$PWD/src/hb-common.cc \
$$PWD/src/hb-face.cc \
+ $$PWD/src/hb-fallback-shape.cc \
$$PWD/src/hb-font.cc \
- $$PWD/src/hb-ot-tag.cc \
+ $$PWD/src/hb-map.cc \
+ $$PWD/src/hb-number.cc \
$$PWD/src/hb-set.cc \
$$PWD/src/hb-shape.cc \
$$PWD/src/hb-shape-plan.cc \
$$PWD/src/hb-shaper.cc \
+ $$PWD/src/hb-subset.cc \
+ $$PWD/src/hb-subset-cff-common.cc \
+ $$PWD/src/hb-subset-cff1.cc \
+ $$PWD/src/hb-subset-cff2.cc \
+ $$PWD/src/hb-subset-input.cc \
+ $$PWD/src/hb-subset-plan.cc \
$$PWD/src/hb-unicode.cc \
- $$PWD/src/hb-warning.cc
+ $$PWD/hb-dummy.cc
+
+OTHER_FILES += \
+ $$PWD/src/harfbuzz.cc
HEADERS += \
- $$PWD/src/hb-atomic-private.hh \
- $$PWD/src/hb-buffer-private.hh \
+ $$PWD/src/hb-atomic.hh \
+ $$PWD/src/hb-algs.hh \
+ $$PWD/src/hb-buffer.hh \
$$PWD/src/hb-buffer-deserialize-json.hh \
$$PWD/src/hb-buffer-deserialize-text.hh \
- $$PWD/src/hb-cache-private.hh \
+ $$PWD/src/hb-cache.hh \
$$PWD/src/hb-debug.hh \
- $$PWD/src/hb-dsalgs.hh \
- $$PWD/src/hb-face-private.hh \
- $$PWD/src/hb-font-private.hh \
- $$PWD/src/hb-mutex-private.hh \
- $$PWD/src/hb-object-private.hh \
- $$PWD/src/hb-open-file-private.hh \
- $$PWD/src/hb-open-type-private.hh \
- $$PWD/src/hb-ot-cbdt-table.hh \
- $$PWD/src/hb-ot-cmap-table.hh \
- $$PWD/src/hb-ot-glyf-table.hh \
- $$PWD/src/hb-ot-head-table.hh \
- $$PWD/src/hb-ot-hhea-table.hh \
- $$PWD/src/hb-ot-hmtx-table.hh \
- $$PWD/src/hb-ot-maxp-table.hh \
- $$PWD/src/hb-ot-name-table.hh \
- $$PWD/src/hb-ot-os2-table.hh \
- $$PWD/src/hb-ot-post-table.hh \
- $$PWD/src/hb-private.hh \
- $$PWD/src/hb-set-digest-private.hh \
- $$PWD/src/hb-set-private.hh \
- $$PWD/src/hb-shape-plan-private.hh \
- $$PWD/src/hb-shaper-impl-private.hh \
+ $$PWD/src/hb-face.hh \
+ $$PWD/src/hb-font.hh \
+ $$PWD/src/hb-mutex.hh \
+ $$PWD/src/hb-object.hh \
+ $$PWD/src/hb-open-file.hh \
+ $$PWD/src/hb-open-type.hh \
+ $$PWD/src/hb-set-digest.hh \
+ $$PWD/src/hb-set.hh \
+ $$PWD/src/hb-shape-plan.hh \
+ $$PWD/src/hb-shaper-impl.hh \
$$PWD/src/hb-shaper-list.hh \
- $$PWD/src/hb-shaper-private.hh \
+ $$PWD/src/hb-shaper.hh \
$$PWD/src/hb-string-array.hh \
- $$PWD/src/hb-unicode-private.hh \
- $$PWD/src/hb-utf-private.hh
+ $$PWD/src/hb-unicode.hh \
+ $$PWD/src/hb-utf.hh
HEADERS += \
$$PWD/src/hb.h \
@@ -103,52 +101,67 @@ contains(SHAPERS, opentype) {
DEFINES += HAVE_OT
SOURCES += \
+ $$PWD/src/hb-ot-cff1-table.cc \
+ $$PWD/src/hb-ot-cff2-table.cc \
+ $$PWD/src/hb-ot-color.cc \
+ $$PWD/src/hb-ot-face.cc \
$$PWD/src/hb-ot-font.cc \
$$PWD/src/hb-ot-layout.cc \
$$PWD/src/hb-ot-map.cc \
$$PWD/src/hb-ot-math.cc \
+ $$PWD/src/hb-ot-meta.cc \
+ $$PWD/src/hb-ot-metrics.cc \
+ $$PWD/src/hb-ot-name.cc \
$$PWD/src/hb-ot-shape.cc \
+ $$PWD/src/hb-ot-tag.cc \
$$PWD/src/hb-ot-shape-complex-arabic.cc \
$$PWD/src/hb-ot-shape-complex-default.cc \
$$PWD/src/hb-ot-shape-complex-hangul.cc \
$$PWD/src/hb-ot-shape-complex-hebrew.cc \
$$PWD/src/hb-ot-shape-complex-indic.cc \
$$PWD/src/hb-ot-shape-complex-indic-table.cc \
+ $$PWD/src/hb-ot-shape-complex-khmer.cc \
$$PWD/src/hb-ot-shape-complex-myanmar.cc \
$$PWD/src/hb-ot-shape-complex-thai.cc \
- $$PWD/src/hb-ot-shape-complex-tibetan.cc \
$$PWD/src/hb-ot-shape-complex-use.cc \
$$PWD/src/hb-ot-shape-complex-use-table.cc \
+ $$PWD/src/hb-ot-shape-complex-vowel-constraints.cc \
$$PWD/src/hb-ot-shape-fallback.cc \
$$PWD/src/hb-ot-shape-normalize.cc \
- $$PWD/src/hb-ot-var.cc
+ $$PWD/src/hb-ot-var.cc
HEADERS += \
+ $$PWD/src/hb-ot-cmap-table.hh \
+ $$PWD/src/hb-ot-color-cbdt-table.hh \
+ $$PWD/src/hb-ot-glyf-table.hh \
+ $$PWD/src/hb-ot-head-table.hh \
+ $$PWD/src/hb-ot-hhea-table.hh \
+ $$PWD/src/hb-ot-hmtx-table.hh \
$$PWD/src/hb-ot-kern-table.hh \
- $$PWD/src/hb-ot-layout-common-private.hh \
+ $$PWD/src/hb-ot-layout.hh \
$$PWD/src/hb-ot-layout-gdef-table.hh \
$$PWD/src/hb-ot-layout-gpos-table.hh \
- $$PWD/src/hb-ot-layout-gsubgpos-private.hh \
$$PWD/src/hb-ot-layout-gsub-table.hh \
$$PWD/src/hb-ot-layout-jstf-table.hh \
- $$PWD/src/hb-ot-layout-math-table.hh \
- $$PWD/src/hb-ot-layout-private.hh \
- $$PWD/src/hb-ot-map-private.hh \
+ $$PWD/src/hb-ot-map.hh \
$$PWD/src/hb-ot-math-table.hh \
+ $$PWD/src/hb-ot-maxp-table.hh \
+ $$PWD/src/hb-ot-name-table.hh \
+ $$PWD/src/hb-ot-os2-table.hh \
+ $$PWD/src/hb-ot-post-table.hh \
$$PWD/src/hb-ot-post-macroman.hh \
+ $$PWD/src/hb-ot-shape.hh \
+ $$PWD/src/hb-ot-shape-complex-arabic.hh \
$$PWD/src/hb-ot-shape-complex-arabic-fallback.hh \
- $$PWD/src/hb-ot-shape-complex-arabic-private.hh \
$$PWD/src/hb-ot-shape-complex-arabic-table.hh \
# $$PWD/src/hb-ot-shape-complex-arabic-win1256.hh \ # disabled with HB_NO_WIN1256
+ $$PWD/src/hb-ot-shape-complex-indic.hh \
$$PWD/src/hb-ot-shape-complex-indic-machine.hh \
- $$PWD/src/hb-ot-shape-complex-indic-private.hh \
$$PWD/src/hb-ot-shape-complex-myanmar-machine.hh \
- $$PWD/src/hb-ot-shape-complex-private.hh \
+ $$PWD/src/hb-ot-shape-complex-use.hh \
$$PWD/src/hb-ot-shape-complex-use-machine.hh \
- $$PWD/src/hb-ot-shape-complex-use-private.hh \
- $$PWD/src/hb-ot-shape-fallback-private.hh \
- $$PWD/src/hb-ot-shape-normalize-private.hh \
- $$PWD/src/hb-ot-shape-private.hh \
+ $$PWD/src/hb-ot-shape-fallback.hh \
+ $$PWD/src/hb-ot-shape-normalize.hh \
$$PWD/src/hb-ot-var-avar-table.hh \
$$PWD/src/hb-ot-var-fvar-table.hh \
$$PWD/src/hb-ot-var-hvar-table.hh \
@@ -160,30 +173,9 @@ contains(SHAPERS, opentype) {
$$PWD/src/hb-ot-layout.h \
$$PWD/src/hb-ot-math.h \
$$PWD/src/hb-ot-shape.h \
- $$PWD/src/hb-ot-tag.h \
$$PWD/src/hb-ot-var.h
}
-contains(SHAPERS, coretext) {
- DEFINES += HAVE_CORETEXT
-
- SOURCES += \
- $$PWD/src/hb-coretext.cc
-
- HEADERS += \
- $$PWD/src/hb-coretext.h
-
- uikit: \
- # On iOS/tvOS/watchOS CoreText and CoreGraphics are stand-alone frameworks
- LIBS_PRIVATE += -framework CoreText -framework CoreGraphics
- else: \
- # On Mac OS they are part of the ApplicationServices umbrella framework,
- # even in 10.8 where they were also made available stand-alone.
- LIBS_PRIVATE += -framework ApplicationServices
-
- CONFIG += watchos_coretext
-}
-
contains(SHAPERS, fallback)|isEmpty(SHAPERS) {
DEFINES += HAVE_FALLBACK
diff --git a/src/3rdparty/harfbuzz-ng/hb-dummy.cc b/src/3rdparty/harfbuzz-ng/hb-dummy.cc
new file mode 100644
index 0000000000..490b8ae35c
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/hb-dummy.cc
@@ -0,0 +1,8 @@
+// Work-around for issue with qmake: Since hb-common.cc has #include "hb-static.cc" in it,
+// qmake will assume it is included and ignore it in the SOURCES list. But the #include
+// is protected inside an #ifdef and will not be used, so hb-static.cc ends up not being
+// linked at all and we get missing symbols. We work around this by including both in
+// the same compilation unit.
+
+#include "src/hb-common.cc"
+#include "src/hb-static.cc"
diff --git a/src/3rdparty/harfbuzz-ng/patches/0001-Qt-specific-workaround-for-AAT-shaper.patch b/src/3rdparty/harfbuzz-ng/patches/0001-Qt-specific-workaround-for-AAT-shaper.patch
deleted file mode 100644
index 470e0ffe5a..0000000000
--- a/src/3rdparty/harfbuzz-ng/patches/0001-Qt-specific-workaround-for-AAT-shaper.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From: Konstantin Ritt <ritt.ks@gmail.com>
-Date: Sun, 17 Dec 2017 07:46:20 +0400
-Subject: Qt-specific workaround for AAT shaper
-
-CoreText API doesn't give us a fontdata to reconstruct the original font,
-so we have to store the CTFont and CGFont of interest in context object
-passed to HB from native font engine
----
- src/3rdparty/harfbuzz-ng/src/hb-coretext.cc | 20 ++++++++++++++++++++
- 1 file changed, 20 insertions(+)
-
-diff --git a/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc b/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc
-index 2dd10d2..c993ec0 100644
---- a/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc
-+++ b/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc
-@@ -35,6 +35,20 @@
- #include "hb-coretext.h"
- #include <math.h>
-
-+
-+typedef bool (*qt_get_font_table_func_t) (void *user_data, unsigned int tag, unsigned char *buffer, unsigned int *length);
-+
-+struct FontEngineFaceData {
-+ void *user_data;
-+ qt_get_font_table_func_t get_font_table;
-+};
-+
-+struct CoreTextFontEngineData {
-+ CTFontRef ctFont;
-+ CGFontRef cgFont;
-+};
-+
-+
- /* https://developer.apple.com/documentation/coretext/1508745-ctfontcreatewithgraphicsfont */
- #define HB_CORETEXT_DEFAULT_FONT_SIZE 12.f
-
-@@ -129,6 +143,7 @@ create_cg_font (hb_face_t *face)
- }
- else
- {
-+#if 0
- hb_blob_t *blob = hb_face_reference_blob (face);
- unsigned int blob_length;
- const char *blob_data = hb_blob_get_data (blob, &blob_length);
-@@ -143,6 +158,11 @@ create_cg_font (hb_face_t *face)
- DEBUG_MSG (CORETEXT, face, "Face CGFontCreateWithDataProvider() failed");
- CGDataProviderRelease (provider);
- }
-+#else
-+ FontEngineFaceData *fontEngineFaceData = (FontEngineFaceData *) face->user_data;
-+ CoreTextFontEngineData *coreTextFontEngineData = (CoreTextFontEngineData *) fontEngineFaceData->user_data;
-+ cg_font = CGFontRetain (coreTextFontEngineData->cgFont);
-+#endif
- }
- return cg_font;
- }
---
-
diff --git a/src/3rdparty/harfbuzz-ng/qt_attribution.json b/src/3rdparty/harfbuzz-ng/qt_attribution.json
index 2f1aed8a87..8614e3a17c 100644
--- a/src/3rdparty/harfbuzz-ng/qt_attribution.json
+++ b/src/3rdparty/harfbuzz-ng/qt_attribution.json
@@ -6,12 +6,13 @@
"Description": "HarfBuzz is an OpenType text shaping engine.",
"Homepage": "http://harfbuzz.org",
- "Version": "1.7.4",
+ "Version": "2.6.4",
"License": "MIT License",
"LicenseId": "MIT",
"LicenseFile": "COPYING",
- "Copyright": "Copyright © 2010,2011,2012 Google, Inc.
+ "Copyright": "Copyright © 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019 Google, Inc.
+Copyright © 2019 Facebook, Inc.
Copyright © 2012 Mozilla Foundation
Copyright © 2011 Codethink Limited
Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies)
diff --git a/src/3rdparty/harfbuzz-ng/src/dump-indic-data.cc b/src/3rdparty/harfbuzz-ng/src/dump-indic-data.cc
new file mode 100644
index 0000000000..8ddc9d5a4e
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/dump-indic-data.cc
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-complex-indic.hh"
+
+int
+main ()
+{
+ for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+ {
+ hb_glyph_info_t info;
+ info.codepoint = u;
+ set_indic_properties (info);
+ if (info.indic_category() != INDIC_SYLLABIC_CATEGORY_OTHER ||
+ info.indic_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE)
+ printf("U+%04X %u %u\n", u,
+ info.indic_category(),
+ info.indic_position());
+ }
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/dump-khmer-data.cc b/src/3rdparty/harfbuzz-ng/src/dump-khmer-data.cc
new file mode 100644
index 0000000000..cffbb92df7
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/dump-khmer-data.cc
@@ -0,0 +1,41 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-complex-khmer.hh"
+
+int
+main ()
+{
+ for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+ {
+ hb_glyph_info_t info;
+ info.codepoint = u;
+ set_khmer_properties (info);
+ if (info.khmer_category() != INDIC_SYLLABIC_CATEGORY_OTHER)
+ printf("U+%04X %u\n", u,
+ info.khmer_category());
+ }
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/dump-myanmar-data.cc b/src/3rdparty/harfbuzz-ng/src/dump-myanmar-data.cc
new file mode 100644
index 0000000000..c1a303f8f1
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/dump-myanmar-data.cc
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-complex-myanmar.hh"
+
+int
+main ()
+{
+ for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+ {
+ hb_glyph_info_t info;
+ info.codepoint = u;
+ set_myanmar_properties (info);
+ if (info.myanmar_category() != INDIC_SYLLABIC_CATEGORY_OTHER ||
+ info.myanmar_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE)
+ printf("U+%04X %u %u\n", u,
+ info.myanmar_category(),
+ info.myanmar_position());
+ }
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/dump-use-data.cc b/src/3rdparty/harfbuzz-ng/src/dump-use-data.cc
new file mode 100644
index 0000000000..d639426b73
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/dump-use-data.cc
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-complex-use.hh"
+
+int
+main ()
+{
+ for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+ {
+ unsigned int category = hb_use_get_category (u);
+ if (category != USE_O)
+ printf("U+%04X %u\n", u, category);
+ }
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/harfbuzz-config.cmake.in b/src/3rdparty/harfbuzz-ng/src/harfbuzz-config.cmake.in
new file mode 100644
index 0000000000..304410d9ba
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/harfbuzz-config.cmake.in
@@ -0,0 +1,86 @@
+# Set these variables so that the `${prefix}/lib` expands to something we can
+# remove.
+set(_harfbuzz_remove_string "REMOVE_ME")
+set(exec_prefix "${_harfbuzz_remove_string}")
+set(prefix "${_harfbuzz_remove_string}")
+
+# Compute the installation prefix by stripping components from our current
+# location.
+get_filename_component(_harfbuzz_prefix "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY)
+get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY)
+set(_harfbuzz_libdir "@libdir@")
+string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_libdir "${_harfbuzz_libdir}")
+set(_harfbuzz_libdir_iter "${_harfbuzz_libdir}")
+while (_harfbuzz_libdir_iter)
+ set(_harfbuzz_libdir_prev_iter "${_harfbuzz_libdir_iter}")
+ get_filename_component(_harfbuzz_libdir_iter "${_harfbuzz_libdir_iter}" DIRECTORY)
+ if (_harfbuzz_libdir_prev_iter STREQUAL _harfbuzz_libdir_iter)
+ break()
+ endif ()
+ get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY)
+endwhile ()
+unset(_harfbuzz_libdir_iter)
+
+# Get the include subdir.
+set(_harfbuzz_includedir "@includedir@")
+string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_includedir "${_harfbuzz_includedir}")
+
+# Extract version information from libtool.
+set(_harfbuzz_version_info "@HB_LIBTOOL_VERSION_INFO@")
+string(REPLACE ":" ";" _harfbuzz_version_info "${_harfbuzz_version_info}")
+list(GET _harfbuzz_version_info 0
+ _harfbuzz_current)
+list(GET _harfbuzz_version_info 1
+ _harfbuzz_revision)
+list(GET _harfbuzz_version_info 2
+ _harfbuzz_age)
+unset(_harfbuzz_version_info)
+
+if (APPLE)
+ set(_harfbuzz_lib_suffix ".0${CMAKE_SHARED_LIBRARY_SUFFIX}")
+elseif (UNIX)
+ set(_harfbuzz_lib_suffix "${CMAKE_SHARED_LIBRARY_SUFFIX}.0.${_harfbuzz_current}.${_harfbuzz_revision}")
+else ()
+ # Unsupported.
+ set(harfbuzz_FOUND 0)
+endif ()
+
+# Add the libraries.
+add_library(harfbuzz::harfbuzz SHARED IMPORTED)
+set_target_properties(harfbuzz::harfbuzz PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+ IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz${_harfbuzz_lib_suffix}")
+
+add_library(harfbuzz::icu SHARED IMPORTED)
+set_target_properties(harfbuzz::icu PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+ INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+ IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-icu${_harfbuzz_lib_suffix}")
+
+add_library(harfbuzz::subset SHARED IMPORTED)
+set_target_properties(harfbuzz::subset PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+ INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+ IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-subset${_harfbuzz_lib_suffix}")
+
+# Only add the gobject library if it was built.
+set(_harfbuzz_have_gobject "@have_gobject@")
+if (_harfbuzz_have_gobject)
+ add_library(harfbuzz::gobject SHARED IMPORTED)
+ set_target_properties(harfbuzz::gobject PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+ INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+ IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-gobject${_harfbuzz_lib_suffix}")
+endif ()
+
+# Clean out variables we used in our scope.
+unset(_harfbuzz_lib_suffix)
+unset(_harfbuzz_current)
+unset(_harfbuzz_revision)
+unset(_harfbuzz_age)
+unset(_harfbuzz_includedir)
+unset(_harfbuzz_libdir)
+unset(_harfbuzz_prefix)
+unset(exec_prefix)
+unset(prefix)
+unset(_harfbuzz_remove_string)
diff --git a/src/3rdparty/harfbuzz-ng/src/harfbuzz-gobject.pc.in b/src/3rdparty/harfbuzz-ng/src/harfbuzz-gobject.pc.in
new file mode 100644
index 0000000000..7008360190
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/harfbuzz-gobject.pc.in
@@ -0,0 +1,12 @@
+prefix=%prefix%
+exec_prefix=%exec_prefix%
+libdir=%libdir%
+includedir=%includedir%
+
+Name: harfbuzz
+Description: HarfBuzz text shaping library GObject integration
+Version: %VERSION%
+
+Requires: harfbuzz gobject-2.0 glib-2.0
+Libs: -L${libdir} -lharfbuzz-gobject
+Cflags: -I${includedir}/harfbuzz
diff --git a/src/3rdparty/harfbuzz-ng/src/harfbuzz-icu.pc.in b/src/3rdparty/harfbuzz-ng/src/harfbuzz-icu.pc.in
new file mode 100644
index 0000000000..949869a356
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/harfbuzz-icu.pc.in
@@ -0,0 +1,13 @@
+prefix=%prefix%
+exec_prefix=%exec_prefix%
+libdir=%libdir%
+includedir=%includedir%
+
+Name: harfbuzz
+Description: HarfBuzz text shaping library ICU integration
+Version: %VERSION%
+
+Requires: harfbuzz
+Requires.private: icu-uc
+Libs: -L${libdir} -lharfbuzz-icu
+Cflags: -I${includedir}/harfbuzz
diff --git a/src/3rdparty/harfbuzz-ng/src/harfbuzz-subset.pc.in b/src/3rdparty/harfbuzz-ng/src/harfbuzz-subset.pc.in
new file mode 100644
index 0000000000..5da64b3f12
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/harfbuzz-subset.pc.in
@@ -0,0 +1,12 @@
+prefix=%prefix%
+exec_prefix=%exec_prefix%
+libdir=%libdir%
+includedir=%includedir%
+
+Name: harfbuzz
+Description: HarfBuzz font subsetter
+Version: %VERSION%
+
+Requires: harfbuzz
+Libs: -L${libdir} -lharfbuzz-subset
+Cflags: -I${includedir}/harfbuzz
diff --git a/src/3rdparty/harfbuzz-ng/src/harfbuzz.cc b/src/3rdparty/harfbuzz-ng/src/harfbuzz.cc
new file mode 100644
index 0000000000..251a0654dc
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/harfbuzz.cc
@@ -0,0 +1,53 @@
+#include "hb-aat-layout.cc"
+#include "hb-aat-map.cc"
+#include "hb-blob.cc"
+#include "hb-buffer-serialize.cc"
+#include "hb-buffer.cc"
+#include "hb-common.cc"
+#include "hb-face.cc"
+#include "hb-fallback-shape.cc"
+#include "hb-font.cc"
+#include "hb-map.cc"
+#include "hb-number.cc"
+#include "hb-ot-cff1-table.cc"
+#include "hb-ot-cff2-table.cc"
+#include "hb-ot-color.cc"
+#include "hb-ot-face.cc"
+#include "hb-ot-font.cc"
+#include "hb-ot-layout.cc"
+#include "hb-ot-map.cc"
+#include "hb-ot-math.cc"
+#include "hb-ot-meta.cc"
+#include "hb-ot-metrics.cc"
+#include "hb-ot-name.cc"
+#include "hb-ot-shape-complex-arabic.cc"
+#include "hb-ot-shape-complex-default.cc"
+#include "hb-ot-shape-complex-hangul.cc"
+#include "hb-ot-shape-complex-hebrew.cc"
+#include "hb-ot-shape-complex-indic-table.cc"
+#include "hb-ot-shape-complex-indic.cc"
+#include "hb-ot-shape-complex-khmer.cc"
+#include "hb-ot-shape-complex-myanmar.cc"
+#include "hb-ot-shape-complex-thai.cc"
+#include "hb-ot-shape-complex-use-table.cc"
+#include "hb-ot-shape-complex-use.cc"
+#include "hb-ot-shape-complex-vowel-constraints.cc"
+#include "hb-ot-shape-fallback.cc"
+#include "hb-ot-shape-normalize.cc"
+#include "hb-ot-shape.cc"
+#include "hb-ot-tag.cc"
+#include "hb-ot-var.cc"
+#include "hb-set.cc"
+#include "hb-shape-plan.cc"
+#include "hb-shape.cc"
+#include "hb-shaper.cc"
+#include "hb-static.cc"
+#include "hb-ucd.cc"
+#include "hb-unicode.cc"
+#include "hb-glib.cc"
+#include "hb-ft.cc"
+#include "hb-graphite2.cc"
+#include "hb-uniscribe.cc"
+#include "hb-gdi.cc"
+#include "hb-directwrite.cc"
+#include "hb-coretext.cc"
diff --git a/src/3rdparty/harfbuzz-ng/src/harfbuzz.pc.in b/src/3rdparty/harfbuzz-ng/src/harfbuzz.pc.in
new file mode 100644
index 0000000000..661251c2d4
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/harfbuzz.pc.in
@@ -0,0 +1,13 @@
+prefix=%prefix%
+exec_prefix=%exec_prefix%
+libdir=%libdir%
+includedir=%includedir%
+
+Name: harfbuzz
+Description: HarfBuzz text shaping library
+Version: %VERSION%
+
+Libs: -L${libdir} -lharfbuzz
+Libs.private: -lm %libs_private%
+Requires.private: %requires_private%
+Cflags: -I${includedir}/harfbuzz
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-fdsc-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-fdsc-table.hh
new file mode 100644
index 0000000000..604d5bcf05
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-fdsc-table.hh
@@ -0,0 +1,126 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_AAT_FDSC_TABLE_HH
+#define HB_AAT_FDSC_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+#include "hb-open-type.hh"
+
+/*
+ * fdsc -- Font descriptors
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6fdsc.html
+ */
+#define HB_AAT_TAG_fdsc HB_TAG('f','d','s','c')
+
+
+namespace AAT {
+
+
+struct FontDescriptor
+{
+ bool has_data () const { return tag; }
+
+ int cmp (hb_tag_t a) const { return tag.cmp (a); }
+
+ float get_value () const { return u.value.to_float (); }
+
+ enum non_alphabetic_value_t {
+ Alphabetic = 0,
+ Dingbats = 1,
+ PiCharacters = 2,
+ Fleurons = 3,
+ DecorativeBorders = 4,
+ InternationalSymbols= 5,
+ MathSymbols = 6
+ };
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ protected:
+ Tag tag; /* The 4-byte table tag name. */
+ union {
+ HBFixed value; /* The value for the descriptor tag. */
+ HBUINT32 nalfType; /* If the tag is `nalf`, see non_alphabetic_value_t */
+ } u;
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+struct fdsc
+{
+ static constexpr hb_tag_t tableTag = HB_AAT_TAG_fdsc;
+
+ enum {
+ Weight = HB_TAG ('w','g','h','t'),
+ /* Percent weight relative to regular weight.
+ * (defaul value: 1.0) */
+ Width = HB_TAG ('w','d','t','h'),
+ /* Percent width relative to regular width.
+ * (default value: 1.0) */
+ Slant = HB_TAG ('s','l','n','t'),
+ /* Angle of slant in degrees, where positive
+ * is clockwise from straight up.
+ * (default value: 0.0) */
+ OpticalSize = HB_TAG ('o','p','s','z'),
+ /* Point size the font was designed for.
+ * (default value: 12.0) */
+ NonAlphabetic= HB_TAG ('n','a','l','f')
+ /* These values are treated as integers,
+ * not fixed32s. 0 means alphabetic, and greater
+ * integers mean the font is non-alphabetic (e.g. symbols).
+ * (default value: 0) */
+ };
+
+ const FontDescriptor &get_descriptor (hb_tag_t style) const
+ { return descriptors.lsearch (style); }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ descriptors.sanitize (c));
+ }
+
+ protected:
+ HBFixed version; /* Version number of the font descriptors
+ * table (0x00010000 for the current version). */
+ LArrayOf<FontDescriptor>
+ descriptors; /* List of tagged-coordinate pairs style descriptors
+ * that will be included to characterize this font.
+ * Each descriptor consists of a <tag, value> pair.
+ * These pairs are located in the gxFontDescriptor
+ * array that follows. */
+ public:
+ DEFINE_SIZE_ARRAY (8, descriptors);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_FDSC_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-ankr-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-ankr-table.hh
new file mode 100644
index 0000000000..ef988841a9
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-ankr-table.hh
@@ -0,0 +1,98 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_AAT_LAYOUT_ANKR_TABLE_HH
+#define HB_AAT_LAYOUT_ANKR_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+
+/*
+ * ankr -- Anchor Point
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6ankr.html
+ */
+#define HB_AAT_TAG_ankr HB_TAG('a','n','k','r')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+struct Anchor
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ public:
+ FWORD xCoordinate;
+ FWORD yCoordinate;
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+typedef LArrayOf<Anchor> GlyphAnchors;
+
+struct ankr
+{
+ static constexpr hb_tag_t tableTag = HB_AAT_TAG_ankr;
+
+ const Anchor &get_anchor (hb_codepoint_t glyph_id,
+ unsigned int i,
+ unsigned int num_glyphs) const
+ {
+ const NNOffsetTo<GlyphAnchors> *offset = (this+lookupTable).get_value (glyph_id, num_glyphs);
+ if (!offset)
+ return Null(Anchor);
+ const GlyphAnchors &anchors = &(this+anchorData) + *offset;
+ return anchors[i];
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ version == 0 &&
+ c->check_range (this, anchorData) &&
+ lookupTable.sanitize (c, this, &(this+anchorData))));
+ }
+
+ protected:
+ HBUINT16 version; /* Version number (set to zero) */
+ HBUINT16 flags; /* Flags (currently unused; set to zero) */
+ LOffsetTo<Lookup<NNOffsetTo<GlyphAnchors>>>
+ lookupTable; /* Offset to the table's lookup table */
+ LNNOffsetTo<HBUINT8>
+ anchorData; /* Offset to the glyph data table */
+
+ public:
+ DEFINE_SIZE_STATIC (12);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_ANKR_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-bsln-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-bsln-table.hh
new file mode 100644
index 0000000000..15ef2da657
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-bsln-table.hh
@@ -0,0 +1,158 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_AAT_LAYOUT_BSLN_TABLE_HH
+#define HB_AAT_LAYOUT_BSLN_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+
+/*
+ * bsln -- Baseline
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bsln.html
+ */
+#define HB_AAT_TAG_bsln HB_TAG('b','s','l','n')
+
+
+namespace AAT {
+
+
+struct BaselineTableFormat0Part
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ // Roman, Ideographic centered, Ideographic low, Hanging and Math
+ // are the default defined ones, but any other maybe accessed also.
+ HBINT16 deltas[32]; /* These are the FUnit distance deltas from
+ * the font's natural baseline to the other
+ * baselines used in the font. */
+ public:
+ DEFINE_SIZE_STATIC (64);
+};
+
+struct BaselineTableFormat1Part
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ lookupTable.sanitize (c)));
+ }
+
+ protected:
+ HBINT16 deltas[32]; /* ditto */
+ Lookup<HBUINT16>
+ lookupTable; /* Lookup table that maps glyphs to their
+ * baseline values. */
+ public:
+ DEFINE_SIZE_MIN (66);
+};
+
+struct BaselineTableFormat2Part
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ HBGlyphID stdGlyph; /* The specific glyph index number in this
+ * font that is used to set the baseline values.
+ * This is the standard glyph.
+ * This glyph must contain a set of control points
+ * (whose numbers are contained in the ctlPoints field)
+ * that are used to determine baseline distances. */
+ HBUINT16 ctlPoints[32]; /* Set of control point numbers,
+ * associated with the standard glyph.
+ * A value of 0xFFFF means there is no corresponding
+ * control point in the standard glyph. */
+ public:
+ DEFINE_SIZE_STATIC (66);
+};
+
+struct BaselineTableFormat3Part
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && lookupTable.sanitize (c));
+ }
+
+ protected:
+ HBGlyphID stdGlyph; /* ditto */
+ HBUINT16 ctlPoints[32]; /* ditto */
+ Lookup<HBUINT16>
+ lookupTable; /* Lookup table that maps glyphs to their
+ * baseline values. */
+ public:
+ DEFINE_SIZE_MIN (68);
+};
+
+struct bsln
+{
+ static constexpr hb_tag_t tableTag = HB_AAT_TAG_bsln;
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!(c->check_struct (this) && defaultBaseline < 32)))
+ return_trace (false);
+
+ switch (format)
+ {
+ case 0: return_trace (parts.format0.sanitize (c));
+ case 1: return_trace (parts.format1.sanitize (c));
+ case 2: return_trace (parts.format2.sanitize (c));
+ case 3: return_trace (parts.format3.sanitize (c));
+ default:return_trace (true);
+ }
+ }
+
+ protected:
+ FixedVersion<>version; /* Version number of the Baseline table. */
+ HBUINT16 format; /* Format of the baseline table. Only one baseline
+ * format may be selected for the font. */
+ HBUINT16 defaultBaseline;/* Default baseline value for all glyphs.
+ * This value can be from 0 through 31. */
+ union {
+ // Distance-Based Formats
+ BaselineTableFormat0Part format0;
+ BaselineTableFormat1Part format1;
+ // Control Point-based Formats
+ BaselineTableFormat2Part format2;
+ BaselineTableFormat3Part format3;
+ } parts;
+ public:
+ DEFINE_SIZE_MIN (8);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_BSLN_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-common.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-common.hh
new file mode 100644
index 0000000000..473f2cdcd2
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-common.hh
@@ -0,0 +1,841 @@
+/*
+ * Copyright © 2017 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_AAT_LAYOUT_COMMON_HH
+#define HB_AAT_LAYOUT_COMMON_HH
+
+#include "hb-aat-layout.hh"
+#include "hb-open-type.hh"
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+/*
+ * Lookup Table
+ */
+
+template <typename T> struct Lookup;
+
+template <typename T>
+struct LookupFormat0
+{
+ friend struct Lookup<T>;
+
+ private:
+ const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+ {
+ if (unlikely (glyph_id >= num_glyphs)) return nullptr;
+ return &arrayZ[glyph_id];
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (arrayZ.sanitize (c, c->get_num_glyphs ()));
+ }
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (arrayZ.sanitize (c, c->get_num_glyphs (), base));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 0 */
+ UnsizedArrayOf<T>
+ arrayZ; /* Array of lookup values, indexed by glyph index. */
+ public:
+ DEFINE_SIZE_UNBOUNDED (2);
+};
+
+
+template <typename T>
+struct LookupSegmentSingle
+{
+ static constexpr unsigned TerminationWordCount = 2u;
+
+ int cmp (hb_codepoint_t g) const
+ { return g < first ? -1 : g <= last ? 0 : +1 ; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && value.sanitize (c));
+ }
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && value.sanitize (c, base));
+ }
+
+ HBGlyphID last; /* Last GlyphID in this segment */
+ HBGlyphID first; /* First GlyphID in this segment */
+ T value; /* The lookup value (only one) */
+ public:
+ DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <typename T>
+struct LookupFormat2
+{
+ friend struct Lookup<T>;
+
+ private:
+ const T* get_value (hb_codepoint_t glyph_id) const
+ {
+ const LookupSegmentSingle<T> *v = segments.bsearch (glyph_id);
+ return v ? &v->value : nullptr;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (segments.sanitize (c));
+ }
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (segments.sanitize (c, base));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 2 */
+ VarSizedBinSearchArrayOf<LookupSegmentSingle<T>>
+ segments; /* The actual segments. These must already be sorted,
+ * according to the first word in each one (the last
+ * glyph in each segment). */
+ public:
+ DEFINE_SIZE_ARRAY (8, segments);
+};
+
+template <typename T>
+struct LookupSegmentArray
+{
+ static constexpr unsigned TerminationWordCount = 2u;
+
+ const T* get_value (hb_codepoint_t glyph_id, const void *base) const
+ {
+ return first <= glyph_id && glyph_id <= last ? &(base+valuesZ)[glyph_id - first] : nullptr;
+ }
+
+ int cmp (hb_codepoint_t g) const
+ { return g < first ? -1 : g <= last ? 0 : +1; }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ first <= last &&
+ valuesZ.sanitize (c, base, last - first + 1));
+ }
+ template <typename ...Ts>
+ bool sanitize (hb_sanitize_context_t *c, const void *base, Ts&&... ds) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ first <= last &&
+ valuesZ.sanitize (c, base, last - first + 1, hb_forward<Ts> (ds)...));
+ }
+
+ HBGlyphID last; /* Last GlyphID in this segment */
+ HBGlyphID first; /* First GlyphID in this segment */
+ NNOffsetTo<UnsizedArrayOf<T>>
+ valuesZ; /* A 16-bit offset from the start of
+ * the table to the data. */
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+template <typename T>
+struct LookupFormat4
+{
+ friend struct Lookup<T>;
+
+ private:
+ const T* get_value (hb_codepoint_t glyph_id) const
+ {
+ const LookupSegmentArray<T> *v = segments.bsearch (glyph_id);
+ return v ? v->get_value (glyph_id, this) : nullptr;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (segments.sanitize (c, this));
+ }
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (segments.sanitize (c, this, base));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 4 */
+ VarSizedBinSearchArrayOf<LookupSegmentArray<T>>
+ segments; /* The actual segments. These must already be sorted,
+ * according to the first word in each one (the last
+ * glyph in each segment). */
+ public:
+ DEFINE_SIZE_ARRAY (8, segments);
+};
+
+template <typename T>
+struct LookupSingle
+{
+ static constexpr unsigned TerminationWordCount = 1u;
+
+ int cmp (hb_codepoint_t g) const { return glyph.cmp (g); }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && value.sanitize (c));
+ }
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && value.sanitize (c, base));
+ }
+
+ HBGlyphID glyph; /* Last GlyphID */
+ T value; /* The lookup value (only one) */
+ public:
+ DEFINE_SIZE_STATIC (2 + T::static_size);
+};
+
+template <typename T>
+struct LookupFormat6
+{
+ friend struct Lookup<T>;
+
+ private:
+ const T* get_value (hb_codepoint_t glyph_id) const
+ {
+ const LookupSingle<T> *v = entries.bsearch (glyph_id);
+ return v ? &v->value : nullptr;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (entries.sanitize (c));
+ }
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (entries.sanitize (c, base));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 6 */
+ VarSizedBinSearchArrayOf<LookupSingle<T>>
+ entries; /* The actual entries, sorted by glyph index. */
+ public:
+ DEFINE_SIZE_ARRAY (8, entries);
+};
+
+template <typename T>
+struct LookupFormat8
+{
+ friend struct Lookup<T>;
+
+ private:
+ const T* get_value (hb_codepoint_t glyph_id) const
+ {
+ return firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount ?
+ &valueArrayZ[glyph_id - firstGlyph] : nullptr;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && valueArrayZ.sanitize (c, glyphCount));
+ }
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && valueArrayZ.sanitize (c, glyphCount, base));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 8 */
+ HBGlyphID firstGlyph; /* First glyph index included in the trimmed array. */
+ HBUINT16 glyphCount; /* Total number of glyphs (equivalent to the last
+ * glyph minus the value of firstGlyph plus 1). */
+ UnsizedArrayOf<T>
+ valueArrayZ; /* The lookup values (indexed by the glyph index
+ * minus the value of firstGlyph). */
+ public:
+ DEFINE_SIZE_ARRAY (6, valueArrayZ);
+};
+
+template <typename T>
+struct LookupFormat10
+{
+ friend struct Lookup<T>;
+
+ private:
+ const typename T::type get_value_or_null (hb_codepoint_t glyph_id) const
+ {
+ if (!(firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount))
+ return Null(T);
+
+ const HBUINT8 *p = &valueArrayZ[(glyph_id - firstGlyph) * valueSize];
+
+ unsigned int v = 0;
+ unsigned int count = valueSize;
+ for (unsigned int i = 0; i < count; i++)
+ v = (v << 8) | *p++;
+
+ return v;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ valueSize <= 4 &&
+ valueArrayZ.sanitize (c, glyphCount * valueSize));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 8 */
+ HBUINT16 valueSize; /* Byte size of each value. */
+ HBGlyphID firstGlyph; /* First glyph index included in the trimmed array. */
+ HBUINT16 glyphCount; /* Total number of glyphs (equivalent to the last
+ * glyph minus the value of firstGlyph plus 1). */
+ UnsizedArrayOf<HBUINT8>
+ valueArrayZ; /* The lookup values (indexed by the glyph index
+ * minus the value of firstGlyph). */
+ public:
+ DEFINE_SIZE_ARRAY (8, valueArrayZ);
+};
+
+template <typename T>
+struct Lookup
+{
+ const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+ {
+ switch (u.format) {
+ case 0: return u.format0.get_value (glyph_id, num_glyphs);
+ case 2: return u.format2.get_value (glyph_id);
+ case 4: return u.format4.get_value (glyph_id);
+ case 6: return u.format6.get_value (glyph_id);
+ case 8: return u.format8.get_value (glyph_id);
+ default:return nullptr;
+ }
+ }
+
+ const typename T::type get_value_or_null (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+ {
+ switch (u.format) {
+ /* Format 10 cannot return a pointer. */
+ case 10: return u.format10.get_value_or_null (glyph_id);
+ default:
+ const T *v = get_value (glyph_id, num_glyphs);
+ return v ? *v : Null(T);
+ }
+ }
+
+ typename T::type get_class (hb_codepoint_t glyph_id,
+ unsigned int num_glyphs,
+ unsigned int outOfRange) const
+ {
+ const T *v = get_value (glyph_id, num_glyphs);
+ return v ? *v : outOfRange;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!u.format.sanitize (c)) return_trace (false);
+ switch (u.format) {
+ case 0: return_trace (u.format0.sanitize (c));
+ case 2: return_trace (u.format2.sanitize (c));
+ case 4: return_trace (u.format4.sanitize (c));
+ case 6: return_trace (u.format6.sanitize (c));
+ case 8: return_trace (u.format8.sanitize (c));
+ case 10: return_trace (u.format10.sanitize (c));
+ default:return_trace (true);
+ }
+ }
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ if (!u.format.sanitize (c)) return_trace (false);
+ switch (u.format) {
+ case 0: return_trace (u.format0.sanitize (c, base));
+ case 2: return_trace (u.format2.sanitize (c, base));
+ case 4: return_trace (u.format4.sanitize (c, base));
+ case 6: return_trace (u.format6.sanitize (c, base));
+ case 8: return_trace (u.format8.sanitize (c, base));
+ case 10: return_trace (false); /* We don't support format10 here currently. */
+ default:return_trace (true);
+ }
+ }
+
+ protected:
+ union {
+ HBUINT16 format; /* Format identifier */
+ LookupFormat0<T> format0;
+ LookupFormat2<T> format2;
+ LookupFormat4<T> format4;
+ LookupFormat6<T> format6;
+ LookupFormat8<T> format8;
+ LookupFormat10<T> format10;
+ } u;
+ public:
+ DEFINE_SIZE_UNION (2, format);
+};
+/* Lookup 0 has unbounded size (dependant on num_glyphs). So we need to defined
+ * special NULL objects for Lookup<> objects, but since it's template our macros
+ * don't work. So we have to hand-code them here. UGLY. */
+} /* Close namespace. */
+/* Ugly hand-coded null objects for template Lookup<> :(. */
+extern HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2];
+template <typename T>
+struct Null<AAT::Lookup<T>> {
+ static AAT::Lookup<T> const & get_null ()
+ { return *reinterpret_cast<const AAT::Lookup<T> *> (_hb_Null_AAT_Lookup); }
+};
+namespace AAT {
+
+enum { DELETED_GLYPH = 0xFFFF };
+
+/*
+ * (Extended) State Table
+ */
+
+template <typename T>
+struct Entry
+{
+ bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+ {
+ TRACE_SANITIZE (this);
+ /* Note, we don't recurse-sanitize data because we don't access it.
+ * That said, in our DEFINE_SIZE_STATIC we access T::static_size,
+ * which ensures that data has a simple sanitize(). To be determined
+ * if I need to remove that as well.
+ *
+ * HOWEVER! Because we are a template, our DEFINE_SIZE_STATIC
+ * assertion wouldn't be checked, hence the line below. */
+ static_assert (T::static_size, "");
+
+ return_trace (c->check_struct (this));
+ }
+
+ public:
+ HBUINT16 newState; /* Byte offset from beginning of state table
+ * to the new state. Really?!?! Or just state
+ * number? The latter in morx for sure. */
+ HBUINT16 flags; /* Table specific. */
+ T data; /* Optional offsets to per-glyph tables. */
+ public:
+ DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <>
+struct Entry<void>
+{
+ bool sanitize (hb_sanitize_context_t *c, unsigned int count /*XXX Unused?*/) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ public:
+ HBUINT16 newState; /* Byte offset from beginning of state table to the new state. */
+ HBUINT16 flags; /* Table specific. */
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+template <typename Types, typename Extra>
+struct StateTable
+{
+ typedef typename Types::HBUINT HBUINT;
+ typedef typename Types::HBUSHORT HBUSHORT;
+ typedef typename Types::ClassTypeNarrow ClassType;
+
+ enum State
+ {
+ STATE_START_OF_TEXT = 0,
+ STATE_START_OF_LINE = 1,
+ };
+ enum Class
+ {
+ CLASS_END_OF_TEXT = 0,
+ CLASS_OUT_OF_BOUNDS = 1,
+ CLASS_DELETED_GLYPH = 2,
+ CLASS_END_OF_LINE = 3,
+ };
+
+ int new_state (unsigned int newState) const
+ { return Types::extended ? newState : ((int) newState - (int) stateArrayTable) / (int) nClasses; }
+
+ unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+ {
+ if (unlikely (glyph_id == DELETED_GLYPH)) return CLASS_DELETED_GLYPH;
+ return (this+classTable).get_class (glyph_id, num_glyphs, 1);
+ }
+
+ const Entry<Extra> *get_entries () const
+ { return (this+entryTable).arrayZ; }
+
+ const Entry<Extra> &get_entry (int state, unsigned int klass) const
+ {
+ if (unlikely (klass >= nClasses))
+ klass = StateTable<Types, Entry<Extra>>::CLASS_OUT_OF_BOUNDS;
+
+ const HBUSHORT *states = (this+stateArrayTable).arrayZ;
+ const Entry<Extra> *entries = (this+entryTable).arrayZ;
+
+ unsigned int entry = states[state * nClasses + klass];
+ DEBUG_MSG (APPLY, nullptr, "e%u", entry);
+
+ return entries[entry];
+ }
+
+ bool sanitize (hb_sanitize_context_t *c,
+ unsigned int *num_entries_out = nullptr) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!(c->check_struct (this) &&
+ nClasses >= 4 /* Ensure pre-defined classes fit. */ &&
+ classTable.sanitize (c, this)))) return_trace (false);
+
+ const HBUSHORT *states = (this+stateArrayTable).arrayZ;
+ const Entry<Extra> *entries = (this+entryTable).arrayZ;
+
+ unsigned int num_classes = nClasses;
+ if (unlikely (hb_unsigned_mul_overflows (num_classes, states[0].static_size)))
+ return_trace (false);
+ unsigned int row_stride = num_classes * states[0].static_size;
+
+ /* Apple 'kern' table has this peculiarity:
+ *
+ * "Because the stateTableOffset in the state table header is (strictly
+ * speaking) redundant, some 'kern' tables use it to record an initial
+ * state where that should not be StartOfText. To determine if this is
+ * done, calculate what the stateTableOffset should be. If it's different
+ * from the actual stateTableOffset, use it as the initial state."
+ *
+ * We implement this by calling the initial state zero, but allow *negative*
+ * states if the start state indeed was not the first state. Since the code
+ * is shared, this will also apply to 'mort' table. The 'kerx' / 'morx'
+ * tables are not affected since those address states by index, not offset.
+ */
+
+ int min_state = 0;
+ int max_state = 0;
+ unsigned int num_entries = 0;
+
+ int state_pos = 0;
+ int state_neg = 0;
+ unsigned int entry = 0;
+ while (min_state < state_neg || state_pos <= max_state)
+ {
+ if (min_state < state_neg)
+ {
+ /* Negative states. */
+ if (unlikely (hb_unsigned_mul_overflows (min_state, num_classes)))
+ return_trace (false);
+ if (unlikely (!c->check_range (&states[min_state * num_classes],
+ -min_state,
+ row_stride)))
+ return_trace (false);
+ if ((c->max_ops -= state_neg - min_state) <= 0)
+ return_trace (false);
+ { /* Sweep new states. */
+ const HBUSHORT *stop = &states[min_state * num_classes];
+ if (unlikely (stop > states))
+ return_trace (false);
+ for (const HBUSHORT *p = states; stop < p; p--)
+ num_entries = hb_max (num_entries, *(p - 1) + 1);
+ state_neg = min_state;
+ }
+ }
+
+ if (state_pos <= max_state)
+ {
+ /* Positive states. */
+ if (unlikely (!c->check_range (states,
+ max_state + 1,
+ row_stride)))
+ return_trace (false);
+ if ((c->max_ops -= max_state - state_pos + 1) <= 0)
+ return_trace (false);
+ { /* Sweep new states. */
+ if (unlikely (hb_unsigned_mul_overflows ((max_state + 1), num_classes)))
+ return_trace (false);
+ const HBUSHORT *stop = &states[(max_state + 1) * num_classes];
+ if (unlikely (stop < states))
+ return_trace (false);
+ for (const HBUSHORT *p = &states[state_pos * num_classes]; p < stop; p++)
+ num_entries = hb_max (num_entries, *p + 1);
+ state_pos = max_state + 1;
+ }
+ }
+
+ if (unlikely (!c->check_array (entries, num_entries)))
+ return_trace (false);
+ if ((c->max_ops -= num_entries - entry) <= 0)
+ return_trace (false);
+ { /* Sweep new entries. */
+ const Entry<Extra> *stop = &entries[num_entries];
+ for (const Entry<Extra> *p = &entries[entry]; p < stop; p++)
+ {
+ int newState = new_state (p->newState);
+ min_state = hb_min (min_state, newState);
+ max_state = hb_max (max_state, newState);
+ }
+ entry = num_entries;
+ }
+ }
+
+ if (num_entries_out)
+ *num_entries_out = num_entries;
+
+ return_trace (true);
+ }
+
+ protected:
+ HBUINT nClasses; /* Number of classes, which is the number of indices
+ * in a single line in the state array. */
+ NNOffsetTo<ClassType, HBUINT>
+ classTable; /* Offset to the class table. */
+ NNOffsetTo<UnsizedArrayOf<HBUSHORT>, HBUINT>
+ stateArrayTable;/* Offset to the state array. */
+ NNOffsetTo<UnsizedArrayOf<Entry<Extra>>, HBUINT>
+ entryTable; /* Offset to the entry array. */
+
+ public:
+ DEFINE_SIZE_STATIC (4 * sizeof (HBUINT));
+};
+
+template <typename HBUCHAR>
+struct ClassTable
+{
+ unsigned int get_class (hb_codepoint_t glyph_id, unsigned int outOfRange) const
+ {
+ unsigned int i = glyph_id - firstGlyph;
+ return i >= classArray.len ? outOfRange : classArray.arrayZ[i];
+ }
+ unsigned int get_class (hb_codepoint_t glyph_id,
+ unsigned int num_glyphs HB_UNUSED,
+ unsigned int outOfRange) const
+ {
+ return get_class (glyph_id, outOfRange);
+ }
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && classArray.sanitize (c));
+ }
+ protected:
+ HBGlyphID firstGlyph; /* First glyph index included in the trimmed array. */
+ ArrayOf<HBUCHAR> classArray; /* The class codes (indexed by glyph index minus
+ * firstGlyph). */
+ public:
+ DEFINE_SIZE_ARRAY (4, classArray);
+};
+
+struct ObsoleteTypes
+{
+ static constexpr bool extended = false;
+ typedef HBUINT16 HBUINT;
+ typedef HBUINT8 HBUSHORT;
+ typedef ClassTable<HBUINT8> ClassTypeNarrow;
+ typedef ClassTable<HBUINT16> ClassTypeWide;
+
+ template <typename T>
+ static unsigned int offsetToIndex (unsigned int offset,
+ const void *base,
+ const T *array)
+ {
+ return (offset - ((const char *) array - (const char *) base)) / T::static_size;
+ }
+ template <typename T>
+ static unsigned int byteOffsetToIndex (unsigned int offset,
+ const void *base,
+ const T *array)
+ {
+ return offsetToIndex (offset, base, array);
+ }
+ template <typename T>
+ static unsigned int wordOffsetToIndex (unsigned int offset,
+ const void *base,
+ const T *array)
+ {
+ return offsetToIndex (2 * offset, base, array);
+ }
+};
+struct ExtendedTypes
+{
+ static constexpr bool extended = true;
+ typedef HBUINT32 HBUINT;
+ typedef HBUINT16 HBUSHORT;
+ typedef Lookup<HBUINT16> ClassTypeNarrow;
+ typedef Lookup<HBUINT16> ClassTypeWide;
+
+ template <typename T>
+ static unsigned int offsetToIndex (unsigned int offset,
+ const void *base HB_UNUSED,
+ const T *array HB_UNUSED)
+ {
+ return offset;
+ }
+ template <typename T>
+ static unsigned int byteOffsetToIndex (unsigned int offset,
+ const void *base HB_UNUSED,
+ const T *array HB_UNUSED)
+ {
+ return offset / 2;
+ }
+ template <typename T>
+ static unsigned int wordOffsetToIndex (unsigned int offset,
+ const void *base HB_UNUSED,
+ const T *array HB_UNUSED)
+ {
+ return offset;
+ }
+};
+
+template <typename Types, typename EntryData>
+struct StateTableDriver
+{
+ StateTableDriver (const StateTable<Types, EntryData> &machine_,
+ hb_buffer_t *buffer_,
+ hb_face_t *face_) :
+ machine (machine_),
+ buffer (buffer_),
+ num_glyphs (face_->get_num_glyphs ()) {}
+
+ template <typename context_t>
+ void drive (context_t *c)
+ {
+ if (!c->in_place)
+ buffer->clear_output ();
+
+ int state = StateTable<Types, EntryData>::STATE_START_OF_TEXT;
+ for (buffer->idx = 0; buffer->successful;)
+ {
+ unsigned int klass = buffer->idx < buffer->len ?
+ machine.get_class (buffer->info[buffer->idx].codepoint, num_glyphs) :
+ (unsigned) StateTable<Types, EntryData>::CLASS_END_OF_TEXT;
+ DEBUG_MSG (APPLY, nullptr, "c%u at %u", klass, buffer->idx);
+ const Entry<EntryData> &entry = machine.get_entry (state, klass);
+
+ /* Unsafe-to-break before this if not in state 0, as things might
+ * go differently if we start from state 0 here.
+ *
+ * Ugh. The indexing here is ugly... */
+ if (state && buffer->backtrack_len () && buffer->idx < buffer->len)
+ {
+ /* If there's no action and we're just epsilon-transitioning to state 0,
+ * safe to break. */
+ if (c->is_actionable (this, entry) ||
+ !(entry.newState == StateTable<Types, EntryData>::STATE_START_OF_TEXT &&
+ entry.flags == context_t::DontAdvance))
+ buffer->unsafe_to_break_from_outbuffer (buffer->backtrack_len () - 1, buffer->idx + 1);
+ }
+
+ /* Unsafe-to-break if end-of-text would kick in here. */
+ if (buffer->idx + 2 <= buffer->len)
+ {
+ const Entry<EntryData> &end_entry = machine.get_entry (state, StateTable<Types, EntryData>::CLASS_END_OF_TEXT);
+ if (c->is_actionable (this, end_entry))
+ buffer->unsafe_to_break (buffer->idx, buffer->idx + 2);
+ }
+
+ c->transition (this, entry);
+
+ state = machine.new_state (entry.newState);
+ DEBUG_MSG (APPLY, nullptr, "s%d", state);
+
+ if (buffer->idx == buffer->len)
+ break;
+
+ if (!(entry.flags & context_t::DontAdvance) || buffer->max_ops-- <= 0)
+ buffer->next_glyph ();
+ }
+
+ if (!c->in_place)
+ {
+ for (; buffer->successful && buffer->idx < buffer->len;)
+ buffer->next_glyph ();
+ buffer->swap_buffers ();
+ }
+ }
+
+ public:
+ const StateTable<Types, EntryData> &machine;
+ hb_buffer_t *buffer;
+ unsigned int num_glyphs;
+};
+
+
+struct ankr;
+
+struct hb_aat_apply_context_t :
+ hb_dispatch_context_t<hb_aat_apply_context_t, bool, HB_DEBUG_APPLY>
+{
+ const char *get_name () { return "APPLY"; }
+ template <typename T>
+ return_t dispatch (const T &obj) { return obj.apply (this); }
+ static return_t default_return_value () { return false; }
+ bool stop_sublookup_iteration (return_t r) const { return r; }
+
+ const hb_ot_shape_plan_t *plan;
+ hb_font_t *font;
+ hb_face_t *face;
+ hb_buffer_t *buffer;
+ hb_sanitize_context_t sanitizer;
+ const ankr *ankr_table;
+
+ /* Unused. For debug tracing only. */
+ unsigned int lookup_index;
+ unsigned int debug_depth;
+
+ HB_INTERNAL hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_,
+ hb_font_t *font_,
+ hb_buffer_t *buffer_,
+ hb_blob_t *blob = const_cast<hb_blob_t *> (&Null(hb_blob_t)));
+
+ HB_INTERNAL ~hb_aat_apply_context_t ();
+
+ HB_INTERNAL void set_ankr_table (const AAT::ankr *ankr_table_);
+
+ void set_lookup_index (unsigned int i) { lookup_index = i; }
+};
+
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_COMMON_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-feat-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-feat-table.hh
new file mode 100644
index 0000000000..788d4084a1
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-feat-table.hh
@@ -0,0 +1,214 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_AAT_LAYOUT_FEAT_TABLE_HH
+#define HB_AAT_LAYOUT_FEAT_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+
+/*
+ * feat -- Feature Name
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6feat.html
+ */
+#define HB_AAT_TAG_feat HB_TAG('f','e','a','t')
+
+
+namespace AAT {
+
+
+struct SettingName
+{
+ friend struct FeatureName;
+
+ int cmp (hb_aat_layout_feature_selector_t key) const
+ { return (int) key - (int) setting; }
+
+ hb_aat_layout_feature_selector_t get_selector () const
+ { return (hb_aat_layout_feature_selector_t) (unsigned) setting; }
+
+ hb_aat_layout_feature_selector_info_t get_info (hb_aat_layout_feature_selector_t default_selector) const
+ {
+ return {
+ nameIndex,
+ (hb_aat_layout_feature_selector_t) (unsigned int) setting,
+ default_selector == HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID
+ ? (hb_aat_layout_feature_selector_t) (setting + 1)
+ : default_selector,
+ 0
+ };
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ HBUINT16 setting; /* The setting. */
+ NameID nameIndex; /* The name table index for the setting's name. */
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+DECLARE_NULL_NAMESPACE_BYTES (AAT, SettingName);
+
+struct feat;
+
+struct FeatureName
+{
+ int cmp (hb_aat_layout_feature_type_t key) const
+ { return (int) key - (int) feature; }
+
+ enum {
+ Exclusive = 0x8000, /* If set, the feature settings are mutually exclusive. */
+ NotDefault = 0x4000, /* If clear, then the setting with an index of 0 in
+ * the setting name array for this feature should
+ * be taken as the default for the feature
+ * (if one is required). If set, then bits 0-15 of this
+ * featureFlags field contain the index of the setting
+ * which is to be taken as the default. */
+ IndexMask = 0x00FF /* If bits 30 and 31 are set, then these sixteen bits
+ * indicate the index of the setting in the setting name
+ * array for this feature which should be taken
+ * as the default. */
+ };
+
+ unsigned int get_selector_infos (unsigned int start_offset,
+ unsigned int *selectors_count, /* IN/OUT. May be NULL. */
+ hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */
+ unsigned int *pdefault_index, /* OUT. May be NULL. */
+ const void *base) const
+ {
+ hb_array_t< const SettingName> settings_table = (base+settingTableZ).as_array (nSettings);
+
+ static_assert (Index::NOT_FOUND_INDEX == HB_AAT_LAYOUT_NO_SELECTOR_INDEX, "");
+
+ hb_aat_layout_feature_selector_t default_selector = HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID;
+ unsigned int default_index = Index::NOT_FOUND_INDEX;
+ if (featureFlags & Exclusive)
+ {
+ default_index = (featureFlags & NotDefault) ? featureFlags & IndexMask : 0;
+ default_selector = settings_table[default_index].get_selector ();
+ }
+ if (pdefault_index)
+ *pdefault_index = default_index;
+
+ if (selectors_count)
+ {
+ + settings_table.sub_array (start_offset, selectors_count)
+ | hb_map ([=] (const SettingName& setting) { return setting.get_info (default_selector); })
+ | hb_sink (hb_array (selectors, *selectors_count))
+ ;
+ }
+ return settings_table.length;
+ }
+
+ hb_aat_layout_feature_type_t get_feature_type () const
+ { return (hb_aat_layout_feature_type_t) (unsigned int) feature; }
+
+ hb_ot_name_id_t get_feature_name_id () const { return nameIndex; }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ (base+settingTableZ).sanitize (c, nSettings)));
+ }
+
+ protected:
+ HBUINT16 feature; /* Feature type. */
+ HBUINT16 nSettings; /* The number of records in the setting name array. */
+ LOffsetTo<UnsizedArrayOf<SettingName>, false>
+ settingTableZ; /* Offset in bytes from the beginning of this table to
+ * this feature's setting name array. The actual type of
+ * record this offset refers to will depend on the
+ * exclusivity value, as described below. */
+ HBUINT16 featureFlags; /* Single-bit flags associated with the feature type. */
+ HBINT16 nameIndex; /* The name table index for the feature's name.
+ * This index has values greater than 255 and
+ * less than 32768. */
+ public:
+ DEFINE_SIZE_STATIC (12);
+};
+
+struct feat
+{
+ static constexpr hb_tag_t tableTag = HB_AAT_TAG_feat;
+
+ bool has_data () const { return version.to_int (); }
+
+ unsigned int get_feature_types (unsigned int start_offset,
+ unsigned int *count,
+ hb_aat_layout_feature_type_t *features) const
+ {
+ if (count)
+ {
+ + namesZ.as_array (featureNameCount).sub_array (start_offset, count)
+ | hb_map (&FeatureName::get_feature_type)
+ | hb_sink (hb_array (features, *count))
+ ;
+ }
+ return featureNameCount;
+ }
+
+ const FeatureName& get_feature (hb_aat_layout_feature_type_t feature_type) const
+ { return namesZ.bsearch (featureNameCount, feature_type); }
+
+ hb_ot_name_id_t get_feature_name_id (hb_aat_layout_feature_type_t feature) const
+ { return get_feature (feature).get_feature_name_id (); }
+
+ unsigned int get_selector_infos (hb_aat_layout_feature_type_t feature_type,
+ unsigned int start_offset,
+ unsigned int *selectors_count, /* IN/OUT. May be NULL. */
+ hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */
+ unsigned int *default_index /* OUT. May be NULL. */) const
+ {
+ return get_feature (feature_type).get_selector_infos (start_offset, selectors_count, selectors,
+ default_index, this);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ version.major == 1 &&
+ namesZ.sanitize (c, featureNameCount, this)));
+ }
+
+ protected:
+ FixedVersion<>version; /* Version number of the feature name table
+ * (0x00010000 for the current version). */
+ HBUINT16 featureNameCount;
+ /* The number of entries in the feature name array. */
+ HBUINT16 reserved1; /* Reserved (set to zero). */
+ HBUINT32 reserved2; /* Reserved (set to zero). */
+ SortedUnsizedArrayOf<FeatureName>
+ namesZ; /* The feature name array. */
+ public:
+ DEFINE_SIZE_ARRAY (12, namesZ);
+};
+
+} /* namespace AAT */
+
+#endif /* HB_AAT_LAYOUT_FEAT_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-just-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-just-table.hh
new file mode 100644
index 0000000000..e1787d10c6
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-just-table.hh
@@ -0,0 +1,417 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_AAT_LAYOUT_JUST_TABLE_HH
+#define HB_AAT_LAYOUT_JUST_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+#include "hb-ot-layout.hh"
+#include "hb-open-type.hh"
+
+#include "hb-aat-layout-morx-table.hh"
+
+/*
+ * just -- Justification
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6just.html
+ */
+#define HB_AAT_TAG_just HB_TAG('j','u','s','t')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+struct ActionSubrecordHeader
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ HBUINT16 actionClass; /* The JustClass value associated with this
+ * ActionSubrecord. */
+ HBUINT16 actionType; /* The type of postcompensation action. */
+ HBUINT16 actionLength; /* Length of this ActionSubrecord record, which
+ * must be a multiple of 4. */
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+struct DecompositionAction
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ ActionSubrecordHeader
+ header;
+ HBFixed lowerLimit; /* If the distance factor is less than this value,
+ * then the ligature is decomposed. */
+ HBFixed upperLimit; /* If the distance factor is greater than this value,
+ * then the ligature is decomposed. */
+ HBUINT16 order; /* Numerical order in which this ligature will
+ * be decomposed; you may want infrequent ligatures
+ * to decompose before more frequent ones. The ligatures
+ * on the line of text will decompose in increasing
+ * value of this field. */
+ ArrayOf<HBUINT16>
+ decomposedglyphs;
+ /* Number of 16-bit glyph indexes that follow;
+ * the ligature will be decomposed into these glyphs.
+ *
+ * Array of decomposed glyphs. */
+ public:
+ DEFINE_SIZE_ARRAY (18, decomposedglyphs);
+};
+
+struct UnconditionalAddGlyphAction
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ protected:
+ ActionSubrecordHeader
+ header;
+ HBGlyphID addGlyph; /* Glyph that should be added if the distance factor
+ * is growing. */
+
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+struct ConditionalAddGlyphAction
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ ActionSubrecordHeader
+ header;
+ HBFixed substThreshold; /* Distance growth factor (in ems) at which
+ * this glyph is replaced and the growth factor
+ * recalculated. */
+ HBGlyphID addGlyph; /* Glyph to be added as kashida. If this value is
+ * 0xFFFF, no extra glyph will be added. Note that
+ * generally when a glyph is added, justification
+ * will need to be redone. */
+ HBGlyphID substGlyph; /* Glyph to be substituted for this glyph if the
+ * growth factor equals or exceeds the value of
+ * substThreshold. */
+ public:
+ DEFINE_SIZE_STATIC (14);
+};
+
+struct DuctileGlyphAction
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ ActionSubrecordHeader
+ header;
+ HBUINT32 variationAxis; /* The 4-byte tag identifying the ductile axis.
+ * This would normally be 0x64756374 ('duct'),
+ * but you may use any axis the font contains. */
+ HBFixed minimumLimit; /* The lowest value for the ductility axis tha
+ * still yields an acceptable appearance. Normally
+ * this will be 1.0. */
+ HBFixed noStretchValue; /* This is the default value that corresponds to
+ * no change in appearance. Normally, this will
+ * be 1.0. */
+ HBFixed maximumLimit; /* The highest value for the ductility axis that
+ * still yields an acceptable appearance. */
+ public:
+ DEFINE_SIZE_STATIC (22);
+};
+
+struct RepeatedAddGlyphAction
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ ActionSubrecordHeader
+ header;
+ HBUINT16 flags; /* Currently unused; set to 0. */
+ HBGlyphID glyph; /* Glyph that should be added if the distance factor
+ * is growing. */
+ public:
+ DEFINE_SIZE_STATIC (10);
+};
+
+struct ActionSubrecord
+{
+ unsigned int get_length () const { return u.header.actionLength; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this)))
+ return_trace (false);
+
+ switch (u.header.actionType)
+ {
+ case 0: return_trace (u.decompositionAction.sanitize (c));
+ case 1: return_trace (u.unconditionalAddGlyphAction.sanitize (c));
+ case 2: return_trace (u.conditionalAddGlyphAction.sanitize (c));
+ // case 3: return_trace (u.stretchGlyphAction.sanitize (c));
+ case 4: return_trace (u.decompositionAction.sanitize (c));
+ case 5: return_trace (u.decompositionAction.sanitize (c));
+ default: return_trace (true);
+ }
+ }
+
+ protected:
+ union {
+ ActionSubrecordHeader header;
+ DecompositionAction decompositionAction;
+ UnconditionalAddGlyphAction unconditionalAddGlyphAction;
+ ConditionalAddGlyphAction conditionalAddGlyphAction;
+ /* StretchGlyphAction stretchGlyphAction; -- Not supported by CoreText */
+ DuctileGlyphAction ductileGlyphAction;
+ RepeatedAddGlyphAction repeatedAddGlyphAction;
+ } u; /* Data. The format of this data depends on
+ * the value of the actionType field. */
+ public:
+ DEFINE_SIZE_UNION (6, header);
+};
+
+struct PostcompensationActionChain
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this)))
+ return_trace (false);
+
+ unsigned int offset = min_size;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ const ActionSubrecord& subrecord = StructAtOffset<ActionSubrecord> (this, offset);
+ if (unlikely (!subrecord.sanitize (c))) return_trace (false);
+ offset += subrecord.get_length ();
+ }
+
+ return_trace (true);
+ }
+
+ protected:
+ HBUINT32 count;
+
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+struct JustWidthDeltaEntry
+{
+ enum Flags
+ {
+ Reserved1 =0xE000,/* Reserved. You should set these bits to zero. */
+ UnlimiteGap =0x1000,/* The glyph can take unlimited gap. When this
+ * glyph participates in the justification process,
+ * it and any other glyphs on the line having this
+ * bit set absorb all the remaining gap. */
+ Reserved2 =0x0FF0,/* Reserved. You should set these bits to zero. */
+ Priority =0x000F /* The justification priority of the glyph. */
+ };
+
+ enum Priority
+ {
+ Kashida = 0, /* Kashida priority. This is the highest priority
+ * during justification. */
+ Whitespace = 1, /* Whitespace priority. Any whitespace glyphs (as
+ * identified in the glyph properties table) will
+ * get this priority. */
+ InterCharacter = 2, /* Inter-character priority. Give this to any
+ * remaining glyphs. */
+ NullPriority = 3 /* Null priority. You should set this priority for
+ * glyphs that only participate in justification
+ * after the above priorities. Normally all glyphs
+ * have one of the previous three values. If you
+ * don't want a glyph to participate in justification,
+ * and you don't want to set its factors to zero,
+ * you may instead assign it to the null priority. */
+ };
+
+ protected:
+ HBFixed beforeGrowLimit;/* The ratio by which the advance width of the
+ * glyph is permitted to grow on the left or top side. */
+ HBFixed beforeShrinkLimit;
+ /* The ratio by which the advance width of the
+ * glyph is permitted to shrink on the left or top side. */
+ HBFixed afterGrowLimit; /* The ratio by which the advance width of the glyph
+ * is permitted to shrink on the left or top side. */
+ HBFixed afterShrinkLimit;
+ /* The ratio by which the advance width of the glyph
+ * is at most permitted to shrink on the right or
+ * bottom side. */
+ HBUINT16 growFlags; /* Flags controlling the grow case. */
+ HBUINT16 shrinkFlags; /* Flags controlling the shrink case. */
+
+ public:
+ DEFINE_SIZE_STATIC (20);
+};
+
+struct WidthDeltaPair
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ HBUINT32 justClass; /* The justification category associated
+ * with the wdRecord field. Only 7 bits of
+ * this field are used. (The other bits are
+ * used as padding to guarantee longword
+ * alignment of the following record). */
+ JustWidthDeltaEntry
+ wdRecord; /* The actual width delta record. */
+
+ public:
+ DEFINE_SIZE_STATIC (24);
+};
+
+typedef OT::LArrayOf<WidthDeltaPair> WidthDeltaCluster;
+
+struct JustificationCategory
+{
+ typedef void EntryData;
+
+ enum Flags
+ {
+ SetMark =0x8000,/* If set, make the current glyph the marked
+ * glyph. */
+ DontAdvance =0x4000,/* If set, don't advance to the next glyph before
+ * going to the new state. */
+ MarkCategory =0x3F80,/* The justification category for the marked
+ * glyph if nonzero. */
+ CurrentCategory =0x007F /* The justification category for the current
+ * glyph if nonzero. */
+ };
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ morphHeader.sanitize (c) &&
+ stHeader.sanitize (c)));
+ }
+
+ protected:
+ ChainSubtable<ObsoleteTypes>
+ morphHeader; /* Metamorphosis-style subtable header. */
+ StateTable<ObsoleteTypes, EntryData>
+ stHeader; /* The justification insertion state table header */
+ public:
+ DEFINE_SIZE_STATIC (30);
+};
+
+struct JustificationHeader
+{
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ justClassTable.sanitize (c, base, base) &&
+ wdcTable.sanitize (c, base) &&
+ pcTable.sanitize (c, base) &&
+ lookupTable.sanitize (c, base)));
+ }
+
+ protected:
+ OffsetTo<JustificationCategory>
+ justClassTable; /* Offset to the justification category state table. */
+ OffsetTo<WidthDeltaCluster>
+ wdcTable; /* Offset from start of justification table to start
+ * of the subtable containing the width delta factors
+ * for the glyphs in your font.
+ *
+ * The width delta clusters table. */
+ OffsetTo<PostcompensationActionChain>
+ pcTable; /* Offset from start of justification table to start
+ * of postcompensation subtable (set to zero if none).
+ *
+ * The postcompensation subtable, if present in the font. */
+ Lookup<OffsetTo<WidthDeltaCluster>>
+ lookupTable; /* Lookup table associating glyphs with width delta
+ * clusters. See the description of Width Delta Clusters
+ * table for details on how to interpret the lookup values. */
+
+ public:
+ DEFINE_SIZE_MIN (8);
+};
+
+struct just
+{
+ static constexpr hb_tag_t tableTag = HB_AAT_TAG_just;
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+
+ return_trace (likely (c->check_struct (this) &&
+ version.major == 1 &&
+ horizData.sanitize (c, this, this) &&
+ vertData.sanitize (c, this, this)));
+ }
+
+ protected:
+ FixedVersion<>version; /* Version of the justification table
+ * (0x00010000u for version 1.0). */
+ HBUINT16 format; /* Format of the justification table (set to 0). */
+ OffsetTo<JustificationHeader>
+ horizData; /* Byte offset from the start of the justification table
+ * to the header for tables that contain justification
+ * information for horizontal text.
+ * If you are not including this information,
+ * store 0. */
+ OffsetTo<JustificationHeader>
+ vertData; /* ditto, vertical */
+
+ public:
+ DEFINE_SIZE_STATIC (10);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_JUST_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-kerx-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-kerx-table.hh
new file mode 100644
index 0000000000..be1b339aa3
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-kerx-table.hh
@@ -0,0 +1,1001 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_AAT_LAYOUT_KERX_TABLE_HH
+#define HB_AAT_LAYOUT_KERX_TABLE_HH
+
+#include "hb-kern.hh"
+#include "hb-aat-layout-ankr-table.hh"
+
+/*
+ * kerx -- Extended Kerning
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6kerx.html
+ */
+#define HB_AAT_TAG_kerx HB_TAG('k','e','r','x')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+static inline int
+kerxTupleKern (int value,
+ unsigned int tupleCount,
+ const void *base,
+ hb_aat_apply_context_t *c)
+{
+ if (likely (!tupleCount || !c)) return value;
+
+ unsigned int offset = value;
+ const FWORD *pv = &StructAtOffset<FWORD> (base, offset);
+ if (unlikely (!c->sanitizer.check_array (pv, tupleCount))) return 0;
+ return *pv;
+}
+
+
+struct hb_glyph_pair_t
+{
+ hb_codepoint_t left;
+ hb_codepoint_t right;
+};
+
+struct KernPair
+{
+ int get_kerning () const { return value; }
+
+ int cmp (const hb_glyph_pair_t &o) const
+ {
+ int ret = left.cmp (o.left);
+ if (ret) return ret;
+ return right.cmp (o.right);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ protected:
+ HBGlyphID left;
+ HBGlyphID right;
+ FWORD value;
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+template <typename KernSubTableHeader>
+struct KerxSubTableFormat0
+{
+ int get_kerning (hb_codepoint_t left, hb_codepoint_t right,
+ hb_aat_apply_context_t *c = nullptr) const
+ {
+ hb_glyph_pair_t pair = {left, right};
+ int v = pairs.bsearch (pair).get_kerning ();
+ return kerxTupleKern (v, header.tuple_count (), this, c);
+ }
+
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+
+ if (!c->plan->requested_kerning)
+ return false;
+
+ if (header.coverage & header.Backwards)
+ return false;
+
+ accelerator_t accel (*this, c);
+ hb_kern_machine_t<accelerator_t> machine (accel, header.coverage & header.CrossStream);
+ machine.kern (c->font, c->buffer, c->plan->kern_mask);
+
+ return_trace (true);
+ }
+
+ struct accelerator_t
+ {
+ const KerxSubTableFormat0 &table;
+ hb_aat_apply_context_t *c;
+
+ accelerator_t (const KerxSubTableFormat0 &table_,
+ hb_aat_apply_context_t *c_) :
+ table (table_), c (c_) {}
+
+ int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+ { return table.get_kerning (left, right, c); }
+ };
+
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (pairs.sanitize (c)));
+ }
+
+ protected:
+ KernSubTableHeader header;
+ BinSearchArrayOf<KernPair, typename KernSubTableHeader::Types::HBUINT>
+ pairs; /* Sorted kern records. */
+ public:
+ DEFINE_SIZE_ARRAY (KernSubTableHeader::static_size + 16, pairs);
+};
+
+
+template <bool extended>
+struct Format1Entry;
+
+template <>
+struct Format1Entry<true>
+{
+ enum Flags
+ {
+ Push = 0x8000, /* If set, push this glyph on the kerning stack. */
+ DontAdvance = 0x4000, /* If set, don't advance to the next glyph
+ * before going to the new state. */
+ Reset = 0x2000, /* If set, reset the kerning data (clear the stack) */
+ Reserved = 0x1FFF, /* Not used; set to 0. */
+ };
+
+ struct EntryData
+ {
+ HBUINT16 kernActionIndex;/* Index into the kerning value array. If
+ * this index is 0xFFFF, then no kerning
+ * is to be performed. */
+ public:
+ DEFINE_SIZE_STATIC (2);
+ };
+
+ static bool performAction (const Entry<EntryData> &entry)
+ { return entry.data.kernActionIndex != 0xFFFF; }
+
+ static unsigned int kernActionIndex (const Entry<EntryData> &entry)
+ { return entry.data.kernActionIndex; }
+};
+template <>
+struct Format1Entry<false>
+{
+ enum Flags
+ {
+ Push = 0x8000, /* If set, push this glyph on the kerning stack. */
+ DontAdvance = 0x4000, /* If set, don't advance to the next glyph
+ * before going to the new state. */
+ Offset = 0x3FFF, /* Byte offset from beginning of subtable to the
+ * value table for the glyphs on the kerning stack. */
+
+ Reset = 0x0000, /* Not supported? */
+ };
+
+ typedef void EntryData;
+
+ static bool performAction (const Entry<EntryData> &entry)
+ { return entry.flags & Offset; }
+
+ static unsigned int kernActionIndex (const Entry<EntryData> &entry)
+ { return entry.flags & Offset; }
+};
+
+template <typename KernSubTableHeader>
+struct KerxSubTableFormat1
+{
+ typedef typename KernSubTableHeader::Types Types;
+ typedef typename Types::HBUINT HBUINT;
+
+ typedef Format1Entry<Types::extended> Format1EntryT;
+ typedef typename Format1EntryT::EntryData EntryData;
+
+ struct driver_context_t
+ {
+ static constexpr bool in_place = true;
+ enum
+ {
+ DontAdvance = Format1EntryT::DontAdvance,
+ };
+
+ driver_context_t (const KerxSubTableFormat1 *table_,
+ hb_aat_apply_context_t *c_) :
+ c (c_),
+ table (table_),
+ /* Apparently the offset kernAction is from the beginning of the state-machine,
+ * similar to offsets in morx table, NOT from beginning of this table, like
+ * other subtables in kerx. Discovered via testing. */
+ kernAction (&table->machine + table->kernAction),
+ depth (0),
+ crossStream (table->header.coverage & table->header.CrossStream) {}
+
+ bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
+ const Entry<EntryData> &entry)
+ {
+ return Format1EntryT::performAction (entry);
+ }
+ void transition (StateTableDriver<Types, EntryData> *driver,
+ const Entry<EntryData> &entry)
+ {
+ hb_buffer_t *buffer = driver->buffer;
+ unsigned int flags = entry.flags;
+
+ if (flags & Format1EntryT::Reset)
+ depth = 0;
+
+ if (flags & Format1EntryT::Push)
+ {
+ if (likely (depth < ARRAY_LENGTH (stack)))
+ stack[depth++] = buffer->idx;
+ else
+ depth = 0; /* Probably not what CoreText does, but better? */
+ }
+
+ if (Format1EntryT::performAction (entry) && depth)
+ {
+ unsigned int tuple_count = hb_max (1u, table->header.tuple_count ());
+
+ unsigned int kern_idx = Format1EntryT::kernActionIndex (entry);
+ kern_idx = Types::byteOffsetToIndex (kern_idx, &table->machine, kernAction.arrayZ);
+ const FWORD *actions = &kernAction[kern_idx];
+ if (!c->sanitizer.check_array (actions, depth, tuple_count))
+ {
+ depth = 0;
+ return;
+ }
+
+ hb_mask_t kern_mask = c->plan->kern_mask;
+
+ /* From Apple 'kern' spec:
+ * "Each pops one glyph from the kerning stack and applies the kerning value to it.
+ * The end of the list is marked by an odd value... */
+ bool last = false;
+ while (!last && depth)
+ {
+ unsigned int idx = stack[--depth];
+ int v = *actions;
+ actions += tuple_count;
+ if (idx >= buffer->len) continue;
+
+ /* "The end of the list is marked by an odd value..." */
+ last = v & 1;
+ v &= ~1;
+
+ hb_glyph_position_t &o = buffer->pos[idx];
+
+ /* Testing shows that CoreText only applies kern (cross-stream or not)
+ * if none has been applied by previous subtables. That is, it does
+ * NOT seem to accumulate as otherwise implied by specs. */
+
+ /* The following flag is undocumented in the spec, but described
+ * in the 'kern' table example. */
+ if (v == -0x8000)
+ {
+ o.attach_type() = ATTACH_TYPE_NONE;
+ o.attach_chain() = 0;
+ o.x_offset = o.y_offset = 0;
+ }
+ else if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+ {
+ if (crossStream)
+ {
+ if (buffer->pos[idx].attach_type() && !buffer->pos[idx].y_offset)
+ {
+ o.y_offset = c->font->em_scale_y (v);
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+ }
+ }
+ else if (buffer->info[idx].mask & kern_mask)
+ {
+ if (!buffer->pos[idx].x_offset)
+ {
+ buffer->pos[idx].x_advance += c->font->em_scale_x (v);
+ buffer->pos[idx].x_offset += c->font->em_scale_x (v);
+ }
+ }
+ }
+ else
+ {
+ if (crossStream)
+ {
+ /* CoreText doesn't do crossStream kerning in vertical. We do. */
+ if (buffer->pos[idx].attach_type() && !buffer->pos[idx].x_offset)
+ {
+ o.x_offset = c->font->em_scale_x (v);
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+ }
+ }
+ else if (buffer->info[idx].mask & kern_mask)
+ {
+ if (!buffer->pos[idx].y_offset)
+ {
+ buffer->pos[idx].y_advance += c->font->em_scale_y (v);
+ buffer->pos[idx].y_offset += c->font->em_scale_y (v);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private:
+ hb_aat_apply_context_t *c;
+ const KerxSubTableFormat1 *table;
+ const UnsizedArrayOf<FWORD> &kernAction;
+ unsigned int stack[8];
+ unsigned int depth;
+ bool crossStream;
+ };
+
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+
+ if (!c->plan->requested_kerning &&
+ !(header.coverage & header.CrossStream))
+ return false;
+
+ driver_context_t dc (this, c);
+
+ StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->font->face);
+ driver.drive (&dc);
+
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ /* The rest of array sanitizations are done at run-time. */
+ return_trace (likely (c->check_struct (this) &&
+ machine.sanitize (c)));
+ }
+
+ protected:
+ KernSubTableHeader header;
+ StateTable<Types, EntryData> machine;
+ NNOffsetTo<UnsizedArrayOf<FWORD>, HBUINT> kernAction;
+ public:
+ DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 5 * sizeof (HBUINT));
+};
+
+template <typename KernSubTableHeader>
+struct KerxSubTableFormat2
+{
+ typedef typename KernSubTableHeader::Types Types;
+ typedef typename Types::HBUINT HBUINT;
+
+ int get_kerning (hb_codepoint_t left, hb_codepoint_t right,
+ hb_aat_apply_context_t *c) const
+ {
+ unsigned int num_glyphs = c->sanitizer.get_num_glyphs ();
+ unsigned int l = (this+leftClassTable).get_class (left, num_glyphs, 0);
+ unsigned int r = (this+rightClassTable).get_class (right, num_glyphs, 0);
+
+ const UnsizedArrayOf<FWORD> &arrayZ = this+array;
+ unsigned int kern_idx = l + r;
+ kern_idx = Types::offsetToIndex (kern_idx, this, arrayZ.arrayZ);
+ const FWORD *v = &arrayZ[kern_idx];
+ if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
+
+ return kerxTupleKern (*v, header.tuple_count (), this, c);
+ }
+
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+
+ if (!c->plan->requested_kerning)
+ return false;
+
+ if (header.coverage & header.Backwards)
+ return false;
+
+ accelerator_t accel (*this, c);
+ hb_kern_machine_t<accelerator_t> machine (accel, header.coverage & header.CrossStream);
+ machine.kern (c->font, c->buffer, c->plan->kern_mask);
+
+ return_trace (true);
+ }
+
+ struct accelerator_t
+ {
+ const KerxSubTableFormat2 &table;
+ hb_aat_apply_context_t *c;
+
+ accelerator_t (const KerxSubTableFormat2 &table_,
+ hb_aat_apply_context_t *c_) :
+ table (table_), c (c_) {}
+
+ int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+ { return table.get_kerning (left, right, c); }
+ };
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ leftClassTable.sanitize (c, this) &&
+ rightClassTable.sanitize (c, this) &&
+ c->check_range (this, array)));
+ }
+
+ protected:
+ KernSubTableHeader header;
+ HBUINT rowWidth; /* The width, in bytes, of a row in the table. */
+ NNOffsetTo<typename Types::ClassTypeWide, HBUINT>
+ leftClassTable; /* Offset from beginning of this subtable to
+ * left-hand class table. */
+ NNOffsetTo<typename Types::ClassTypeWide, HBUINT>
+ rightClassTable;/* Offset from beginning of this subtable to
+ * right-hand class table. */
+ NNOffsetTo<UnsizedArrayOf<FWORD>, HBUINT>
+ array; /* Offset from beginning of this subtable to
+ * the start of the kerning array. */
+ public:
+ DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 4 * sizeof (HBUINT));
+};
+
+template <typename KernSubTableHeader>
+struct KerxSubTableFormat4
+{
+ typedef ExtendedTypes Types;
+
+ struct EntryData
+ {
+ HBUINT16 ankrActionIndex;/* Either 0xFFFF (for no action) or the index of
+ * the action to perform. */
+ public:
+ DEFINE_SIZE_STATIC (2);
+ };
+
+ struct driver_context_t
+ {
+ static constexpr bool in_place = true;
+ enum Flags
+ {
+ Mark = 0x8000, /* If set, remember this glyph as the marked glyph. */
+ DontAdvance = 0x4000, /* If set, don't advance to the next glyph before
+ * going to the new state. */
+ Reserved = 0x3FFF, /* Not used; set to 0. */
+ };
+
+ enum SubTableFlags
+ {
+ ActionType = 0xC0000000, /* A two-bit field containing the action type. */
+ Unused = 0x3F000000, /* Unused - must be zero. */
+ Offset = 0x00FFFFFF, /* Masks the offset in bytes from the beginning
+ * of the subtable to the beginning of the control
+ * point table. */
+ };
+
+ driver_context_t (const KerxSubTableFormat4 *table,
+ hb_aat_apply_context_t *c_) :
+ c (c_),
+ action_type ((table->flags & ActionType) >> 30),
+ ankrData ((HBUINT16 *) ((const char *) &table->machine + (table->flags & Offset))),
+ mark_set (false),
+ mark (0) {}
+
+ bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
+ const Entry<EntryData> &entry)
+ {
+ return entry.data.ankrActionIndex != 0xFFFF;
+ }
+ void transition (StateTableDriver<Types, EntryData> *driver,
+ const Entry<EntryData> &entry)
+ {
+ hb_buffer_t *buffer = driver->buffer;
+
+ if (mark_set && entry.data.ankrActionIndex != 0xFFFF && buffer->idx < buffer->len)
+ {
+ hb_glyph_position_t &o = buffer->cur_pos();
+ switch (action_type)
+ {
+ case 0: /* Control Point Actions.*/
+ {
+ /* indexed into glyph outline. */
+ const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex];
+ if (!c->sanitizer.check_array (data, 2)) return;
+ HB_UNUSED unsigned int markControlPoint = *data++;
+ HB_UNUSED unsigned int currControlPoint = *data++;
+ hb_position_t markX = 0;
+ hb_position_t markY = 0;
+ hb_position_t currX = 0;
+ hb_position_t currY = 0;
+ if (!c->font->get_glyph_contour_point_for_origin (c->buffer->info[mark].codepoint,
+ markControlPoint,
+ HB_DIRECTION_LTR /*XXX*/,
+ &markX, &markY) ||
+ !c->font->get_glyph_contour_point_for_origin (c->buffer->cur ().codepoint,
+ currControlPoint,
+ HB_DIRECTION_LTR /*XXX*/,
+ &currX, &currY))
+ return;
+
+ o.x_offset = markX - currX;
+ o.y_offset = markY - currY;
+ }
+ break;
+
+ case 1: /* Anchor Point Actions. */
+ {
+ /* Indexed into 'ankr' table. */
+ const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex];
+ if (!c->sanitizer.check_array (data, 2)) return;
+ unsigned int markAnchorPoint = *data++;
+ unsigned int currAnchorPoint = *data++;
+ const Anchor &markAnchor = c->ankr_table->get_anchor (c->buffer->info[mark].codepoint,
+ markAnchorPoint,
+ c->sanitizer.get_num_glyphs ());
+ const Anchor &currAnchor = c->ankr_table->get_anchor (c->buffer->cur ().codepoint,
+ currAnchorPoint,
+ c->sanitizer.get_num_glyphs ());
+
+ o.x_offset = c->font->em_scale_x (markAnchor.xCoordinate) - c->font->em_scale_x (currAnchor.xCoordinate);
+ o.y_offset = c->font->em_scale_y (markAnchor.yCoordinate) - c->font->em_scale_y (currAnchor.yCoordinate);
+ }
+ break;
+
+ case 2: /* Control Point Coordinate Actions. */
+ {
+ const FWORD *data = (const FWORD *) &ankrData[entry.data.ankrActionIndex];
+ if (!c->sanitizer.check_array (data, 4)) return;
+ int markX = *data++;
+ int markY = *data++;
+ int currX = *data++;
+ int currY = *data++;
+
+ o.x_offset = c->font->em_scale_x (markX) - c->font->em_scale_x (currX);
+ o.y_offset = c->font->em_scale_y (markY) - c->font->em_scale_y (currY);
+ }
+ break;
+ }
+ o.attach_type() = ATTACH_TYPE_MARK;
+ o.attach_chain() = (int) mark - (int) buffer->idx;
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+ }
+
+ if (entry.flags & Mark)
+ {
+ mark_set = true;
+ mark = buffer->idx;
+ }
+ }
+
+ private:
+ hb_aat_apply_context_t *c;
+ unsigned int action_type;
+ const HBUINT16 *ankrData;
+ bool mark_set;
+ unsigned int mark;
+ };
+
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+
+ driver_context_t dc (this, c);
+
+ StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->font->face);
+ driver.drive (&dc);
+
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ /* The rest of array sanitizations are done at run-time. */
+ return_trace (likely (c->check_struct (this) &&
+ machine.sanitize (c)));
+ }
+
+ protected:
+ KernSubTableHeader header;
+ StateTable<Types, EntryData> machine;
+ HBUINT32 flags;
+ public:
+ DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 20);
+};
+
+template <typename KernSubTableHeader>
+struct KerxSubTableFormat6
+{
+ enum Flags
+ {
+ ValuesAreLong = 0x00000001,
+ };
+
+ bool is_long () const { return flags & ValuesAreLong; }
+
+ int get_kerning (hb_codepoint_t left, hb_codepoint_t right,
+ hb_aat_apply_context_t *c) const
+ {
+ unsigned int num_glyphs = c->sanitizer.get_num_glyphs ();
+ if (is_long ())
+ {
+ const typename U::Long &t = u.l;
+ unsigned int l = (this+t.rowIndexTable).get_value_or_null (left, num_glyphs);
+ unsigned int r = (this+t.columnIndexTable).get_value_or_null (right, num_glyphs);
+ unsigned int offset = l + r;
+ if (unlikely (offset < l)) return 0; /* Addition overflow. */
+ if (unlikely (hb_unsigned_mul_overflows (offset, sizeof (FWORD32)))) return 0;
+ const FWORD32 *v = &StructAtOffset<FWORD32> (&(this+t.array), offset * sizeof (FWORD32));
+ if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
+ return kerxTupleKern (*v, header.tuple_count (), &(this+vector), c);
+ }
+ else
+ {
+ const typename U::Short &t = u.s;
+ unsigned int l = (this+t.rowIndexTable).get_value_or_null (left, num_glyphs);
+ unsigned int r = (this+t.columnIndexTable).get_value_or_null (right, num_glyphs);
+ unsigned int offset = l + r;
+ const FWORD *v = &StructAtOffset<FWORD> (&(this+t.array), offset * sizeof (FWORD));
+ if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
+ return kerxTupleKern (*v, header.tuple_count (), &(this+vector), c);
+ }
+ }
+
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+
+ if (!c->plan->requested_kerning)
+ return false;
+
+ if (header.coverage & header.Backwards)
+ return false;
+
+ accelerator_t accel (*this, c);
+ hb_kern_machine_t<accelerator_t> machine (accel, header.coverage & header.CrossStream);
+ machine.kern (c->font, c->buffer, c->plan->kern_mask);
+
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ (is_long () ?
+ (
+ u.l.rowIndexTable.sanitize (c, this) &&
+ u.l.columnIndexTable.sanitize (c, this) &&
+ c->check_range (this, u.l.array)
+ ) : (
+ u.s.rowIndexTable.sanitize (c, this) &&
+ u.s.columnIndexTable.sanitize (c, this) &&
+ c->check_range (this, u.s.array)
+ )) &&
+ (header.tuple_count () == 0 ||
+ c->check_range (this, vector))));
+ }
+
+ struct accelerator_t
+ {
+ const KerxSubTableFormat6 &table;
+ hb_aat_apply_context_t *c;
+
+ accelerator_t (const KerxSubTableFormat6 &table_,
+ hb_aat_apply_context_t *c_) :
+ table (table_), c (c_) {}
+
+ int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+ { return table.get_kerning (left, right, c); }
+ };
+
+ protected:
+ KernSubTableHeader header;
+ HBUINT32 flags;
+ HBUINT16 rowCount;
+ HBUINT16 columnCount;
+ union U
+ {
+ struct Long
+ {
+ LNNOffsetTo<Lookup<HBUINT32>> rowIndexTable;
+ LNNOffsetTo<Lookup<HBUINT32>> columnIndexTable;
+ LNNOffsetTo<UnsizedArrayOf<FWORD32>> array;
+ } l;
+ struct Short
+ {
+ LNNOffsetTo<Lookup<HBUINT16>> rowIndexTable;
+ LNNOffsetTo<Lookup<HBUINT16>> columnIndexTable;
+ LNNOffsetTo<UnsizedArrayOf<FWORD>> array;
+ } s;
+ } u;
+ LNNOffsetTo<UnsizedArrayOf<FWORD>> vector;
+ public:
+ DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 24);
+};
+
+
+struct KerxSubTableHeader
+{
+ typedef ExtendedTypes Types;
+
+ unsigned tuple_count () const { return tupleCount; }
+ bool is_horizontal () const { return !(coverage & Vertical); }
+
+ enum Coverage
+ {
+ Vertical = 0x80000000u, /* Set if table has vertical kerning values. */
+ CrossStream = 0x40000000u, /* Set if table has cross-stream kerning values. */
+ Variation = 0x20000000u, /* Set if table has variation kerning values. */
+ Backwards = 0x10000000u, /* If clear, process the glyphs forwards, that
+ * is, from first to last in the glyph stream.
+ * If we, process them from last to first.
+ * This flag only applies to state-table based
+ * 'kerx' subtables (types 1 and 4). */
+ Reserved = 0x0FFFFF00u, /* Reserved, set to zero. */
+ SubtableType= 0x000000FFu, /* Subtable type. */
+ };
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ public:
+ HBUINT32 length;
+ HBUINT32 coverage;
+ HBUINT32 tupleCount;
+ public:
+ DEFINE_SIZE_STATIC (12);
+};
+
+struct KerxSubTable
+{
+ friend struct kerx;
+
+ unsigned int get_size () const { return u.header.length; }
+ unsigned int get_type () const { return u.header.coverage & u.header.SubtableType; }
+
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+ {
+ unsigned int subtable_type = get_type ();
+ TRACE_DISPATCH (this, subtable_type);
+ switch (subtable_type) {
+ case 0: return_trace (c->dispatch (u.format0, hb_forward<Ts> (ds)...));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+ case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
+ case 4: return_trace (c->dispatch (u.format4, hb_forward<Ts> (ds)...));
+ case 6: return_trace (c->dispatch (u.format6, hb_forward<Ts> (ds)...));
+ default: return_trace (c->default_return_value ());
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!u.header.sanitize (c) ||
+ u.header.length <= u.header.static_size ||
+ !c->check_range (this, u.header.length))
+ return_trace (false);
+
+ return_trace (dispatch (c));
+ }
+
+ public:
+ union {
+ KerxSubTableHeader header;
+ KerxSubTableFormat0<KerxSubTableHeader> format0;
+ KerxSubTableFormat1<KerxSubTableHeader> format1;
+ KerxSubTableFormat2<KerxSubTableHeader> format2;
+ KerxSubTableFormat4<KerxSubTableHeader> format4;
+ KerxSubTableFormat6<KerxSubTableHeader> format6;
+ } u;
+ public:
+ DEFINE_SIZE_MIN (12);
+};
+
+
+/*
+ * The 'kerx' Table
+ */
+
+template <typename T>
+struct KerxTable
+{
+ /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
+ const T* thiz () const { return static_cast<const T *> (this); }
+
+ bool has_state_machine () const
+ {
+ typedef typename T::SubTable SubTable;
+
+ const SubTable *st = &thiz()->firstSubTable;
+ unsigned int count = thiz()->tableCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (st->get_type () == 1)
+ return true;
+ st = &StructAfter<SubTable> (*st);
+ }
+ return false;
+ }
+
+ bool has_cross_stream () const
+ {
+ typedef typename T::SubTable SubTable;
+
+ const SubTable *st = &thiz()->firstSubTable;
+ unsigned int count = thiz()->tableCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (st->u.header.coverage & st->u.header.CrossStream)
+ return true;
+ st = &StructAfter<SubTable> (*st);
+ }
+ return false;
+ }
+
+ int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+ {
+ typedef typename T::SubTable SubTable;
+
+ int v = 0;
+ const SubTable *st = &thiz()->firstSubTable;
+ unsigned int count = thiz()->tableCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if ((st->u.header.coverage & (st->u.header.Variation | st->u.header.CrossStream)) ||
+ !st->u.header.is_horizontal ())
+ continue;
+ v += st->get_kerning (left, right);
+ st = &StructAfter<SubTable> (*st);
+ }
+ return v;
+ }
+
+ bool apply (AAT::hb_aat_apply_context_t *c) const
+ {
+ typedef typename T::SubTable SubTable;
+
+ bool ret = false;
+ bool seenCrossStream = false;
+ c->set_lookup_index (0);
+ const SubTable *st = &thiz()->firstSubTable;
+ unsigned int count = thiz()->tableCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ bool reverse;
+
+ if (!T::Types::extended && (st->u.header.coverage & st->u.header.Variation))
+ goto skip;
+
+ if (HB_DIRECTION_IS_HORIZONTAL (c->buffer->props.direction) != st->u.header.is_horizontal ())
+ goto skip;
+
+ reverse = bool (st->u.header.coverage & st->u.header.Backwards) !=
+ HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction);
+
+ if (!c->buffer->message (c->font, "start %c%c%c%c subtable %d", HB_UNTAG (thiz()->tableTag), c->lookup_index))
+ goto skip;
+
+ if (!seenCrossStream &&
+ (st->u.header.coverage & st->u.header.CrossStream))
+ {
+ /* Attach all glyphs into a chain. */
+ seenCrossStream = true;
+ hb_glyph_position_t *pos = c->buffer->pos;
+ unsigned int count = c->buffer->len;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ pos[i].attach_type() = ATTACH_TYPE_CURSIVE;
+ pos[i].attach_chain() = HB_DIRECTION_IS_FORWARD (c->buffer->props.direction) ? -1 : +1;
+ /* We intentionally don't set HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT,
+ * since there needs to be a non-zero attachment for post-positioning to
+ * be needed. */
+ }
+ }
+
+ if (reverse)
+ c->buffer->reverse ();
+
+ {
+ /* See comment in sanitize() for conditional here. */
+ hb_sanitize_with_object_t with (&c->sanitizer, i < count - 1 ? st : (const SubTable *) nullptr);
+ ret |= st->dispatch (c);
+ }
+
+ if (reverse)
+ c->buffer->reverse ();
+
+ (void) c->buffer->message (c->font, "end %c%c%c%c subtable %d", HB_UNTAG (thiz()->tableTag), c->lookup_index);
+
+ skip:
+ st = &StructAfter<SubTable> (*st);
+ c->set_lookup_index (c->lookup_index + 1);
+ }
+
+ return ret;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!thiz()->version.sanitize (c) ||
+ (unsigned) thiz()->version < (unsigned) T::minVersion ||
+ !thiz()->tableCount.sanitize (c)))
+ return_trace (false);
+
+ typedef typename T::SubTable SubTable;
+
+ const SubTable *st = &thiz()->firstSubTable;
+ unsigned int count = thiz()->tableCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (unlikely (!st->u.header.sanitize (c)))
+ return_trace (false);
+ /* OpenType kern table has 2-byte subtable lengths. That's limiting.
+ * MS implementation also only supports one subtable, of format 0,
+ * anyway. Certain versions of some fonts, like Calibry, contain
+ * kern subtable that exceeds 64kb. Looks like, the subtable length
+ * is simply ignored. Which makes sense. It's only needed if you
+ * have multiple subtables. To handle such fonts, we just ignore
+ * the length for the last subtable. */
+ hb_sanitize_with_object_t with (c, i < count - 1 ? st : (const SubTable *) nullptr);
+
+ if (unlikely (!st->sanitize (c)))
+ return_trace (false);
+
+ st = &StructAfter<SubTable> (*st);
+ }
+
+ return_trace (true);
+ }
+};
+
+struct kerx : KerxTable<kerx>
+{
+ friend struct KerxTable<kerx>;
+
+ static constexpr hb_tag_t tableTag = HB_AAT_TAG_kerx;
+ static constexpr unsigned minVersion = 2u;
+
+ typedef KerxSubTableHeader SubTableHeader;
+ typedef SubTableHeader::Types Types;
+ typedef KerxSubTable SubTable;
+
+ bool has_data () const { return version; }
+
+ protected:
+ HBUINT16 version; /* The version number of the extended kerning table
+ * (currently 2, 3, or 4). */
+ HBUINT16 unused; /* Set to 0. */
+ HBUINT32 tableCount; /* The number of subtables included in the extended kerning
+ * table. */
+ SubTable firstSubTable; /* Subtables. */
+/*subtableGlyphCoverageArray*/ /* Only if version >= 3. We don't use. */
+
+ public:
+ DEFINE_SIZE_MIN (8);
+};
+
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_KERX_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-lcar-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-lcar-table.hh
new file mode 100644
index 0000000000..7063b386c2
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-lcar-table.hh
@@ -0,0 +1,162 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+#ifndef HB_AAT_LAYOUT_LCAR_TABLE_HH
+#define HB_AAT_LAYOUT_LCAR_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-aat-layout-common.hh"
+
+/*
+ * lcar -- Ligature caret
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6lcar.html
+ */
+#define HB_AAT_TAG_lcar HB_TAG('l','c','a','r')
+
+
+namespace AAT {
+
+typedef ArrayOf<HBINT16> LigCaretClassEntry;
+
+struct lcarFormat0
+{
+ unsigned int get_lig_carets (hb_font_t *font,
+ hb_direction_t direction,
+ hb_codepoint_t glyph,
+ unsigned int start_offset,
+ unsigned int *caret_count /* IN/OUT */,
+ hb_position_t *caret_array /* OUT */,
+ const void *base) const
+ {
+ const OffsetTo<LigCaretClassEntry>* entry_offset = lookupTable.get_value (glyph,
+ font->face->get_num_glyphs ());
+ const LigCaretClassEntry& array = entry_offset ? base+*entry_offset : Null (LigCaretClassEntry);
+ if (caret_count)
+ {
+ hb_array_t<const HBINT16> arr = array.sub_array (start_offset, caret_count);
+ for (unsigned int i = 0; i < arr.length; ++i)
+ caret_array[i] = font->em_scale_dir (arr[i], direction);
+ }
+ return array.len;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) && lookupTable.sanitize (c, base)));
+ }
+
+ protected:
+ Lookup<OffsetTo<LigCaretClassEntry>>
+ lookupTable; /* data Lookup table associating glyphs */
+ public:
+ DEFINE_SIZE_MIN (2);
+};
+
+struct lcarFormat1
+{
+ unsigned int get_lig_carets (hb_font_t *font,
+ hb_direction_t direction,
+ hb_codepoint_t glyph,
+ unsigned int start_offset,
+ unsigned int *caret_count /* IN/OUT */,
+ hb_position_t *caret_array /* OUT */,
+ const void *base) const
+ {
+ const OffsetTo<LigCaretClassEntry>* entry_offset = lookupTable.get_value (glyph,
+ font->face->get_num_glyphs ());
+ const LigCaretClassEntry& array = entry_offset ? base+*entry_offset : Null (LigCaretClassEntry);
+ if (caret_count)
+ {
+ hb_array_t<const HBINT16> arr = array.sub_array (start_offset, caret_count);
+ for (unsigned int i = 0; i < arr.length; ++i)
+ {
+ hb_position_t x = 0, y = 0;
+ font->get_glyph_contour_point_for_origin (glyph, arr[i], direction, &x, &y);
+ caret_array[i] = HB_DIRECTION_IS_HORIZONTAL (direction) ? x : y;
+ }
+ }
+ return array.len;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) && lookupTable.sanitize (c, base)));
+ }
+
+ protected:
+ Lookup<OffsetTo<LigCaretClassEntry>>
+ lookupTable; /* data Lookup table associating glyphs */
+ public:
+ DEFINE_SIZE_MIN (2);
+};
+
+struct lcar
+{
+ static constexpr hb_tag_t tableTag = HB_AAT_TAG_lcar;
+
+ unsigned int get_lig_carets (hb_font_t *font,
+ hb_direction_t direction,
+ hb_codepoint_t glyph,
+ unsigned int start_offset,
+ unsigned int *caret_count /* IN/OUT */,
+ hb_position_t *caret_array /* OUT */) const
+ {
+ switch (format)
+ {
+ case 0: return u.format0.get_lig_carets (font, direction, glyph, start_offset,
+ caret_count, caret_array, this);
+ case 1: return u.format1.get_lig_carets (font, direction, glyph, start_offset,
+ caret_count, caret_array, this);
+ default:if (caret_count) *caret_count = 0; return 0;
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this) || version.major != 1))
+ return_trace (false);
+
+ switch (format) {
+ case 0: return_trace (u.format0.sanitize (c, this));
+ case 1: return_trace (u.format1.sanitize (c, this));
+ default:return_trace (true);
+ }
+ }
+
+ protected:
+ FixedVersion<>version; /* Version number of the ligature caret table */
+ HBUINT16 format; /* Format of the ligature caret table. */
+ union {
+ lcarFormat0 format0;
+ lcarFormat0 format1;
+ } u;
+ public:
+ DEFINE_SIZE_MIN (8);
+};
+
+} /* namespace AAT */
+
+#endif /* HB_AAT_LAYOUT_LCAR_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-morx-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-morx-table.hh
new file mode 100644
index 0000000000..d8df579f50
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-morx-table.hh
@@ -0,0 +1,1153 @@
+/*
+ * Copyright © 2017 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_AAT_LAYOUT_MORX_TABLE_HH
+#define HB_AAT_LAYOUT_MORX_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-aat-layout-common.hh"
+#include "hb-ot-layout-common.hh"
+#include "hb-aat-map.hh"
+
+/*
+ * morx -- Extended Glyph Metamorphosis
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6morx.html
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6mort.html
+ */
+#define HB_AAT_TAG_morx HB_TAG('m','o','r','x')
+#define HB_AAT_TAG_mort HB_TAG('m','o','r','t')
+
+
+namespace AAT {
+
+using namespace OT;
+
+template <typename Types>
+struct RearrangementSubtable
+{
+ typedef typename Types::HBUINT HBUINT;
+
+ typedef void EntryData;
+
+ struct driver_context_t
+ {
+ static constexpr bool in_place = true;
+ enum Flags
+ {
+ MarkFirst = 0x8000, /* If set, make the current glyph the first
+ * glyph to be rearranged. */
+ DontAdvance = 0x4000, /* If set, don't advance to the next glyph
+ * before going to the new state. This means
+ * that the glyph index doesn't change, even
+ * if the glyph at that index has changed. */
+ MarkLast = 0x2000, /* If set, make the current glyph the last
+ * glyph to be rearranged. */
+ Reserved = 0x1FF0, /* These bits are reserved and should be set to 0. */
+ Verb = 0x000F, /* The type of rearrangement specified. */
+ };
+
+ driver_context_t (const RearrangementSubtable *table HB_UNUSED) :
+ ret (false),
+ start (0), end (0) {}
+
+ bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
+ const Entry<EntryData> &entry)
+ {
+ return (entry.flags & Verb) && start < end;
+ }
+ void transition (StateTableDriver<Types, EntryData> *driver,
+ const Entry<EntryData> &entry)
+ {
+ hb_buffer_t *buffer = driver->buffer;
+ unsigned int flags = entry.flags;
+
+ if (flags & MarkFirst)
+ start = buffer->idx;
+
+ if (flags & MarkLast)
+ end = hb_min (buffer->idx + 1, buffer->len);
+
+ if ((flags & Verb) && start < end)
+ {
+ /* The following map has two nibbles, for start-side
+ * and end-side. Values of 0,1,2 mean move that many
+ * to the other side. Value of 3 means move 2 and
+ * flip them. */
+ const unsigned char map[16] =
+ {
+ 0x00, /* 0 no change */
+ 0x10, /* 1 Ax => xA */
+ 0x01, /* 2 xD => Dx */
+ 0x11, /* 3 AxD => DxA */
+ 0x20, /* 4 ABx => xAB */
+ 0x30, /* 5 ABx => xBA */
+ 0x02, /* 6 xCD => CDx */
+ 0x03, /* 7 xCD => DCx */
+ 0x12, /* 8 AxCD => CDxA */
+ 0x13, /* 9 AxCD => DCxA */
+ 0x21, /* 10 ABxD => DxAB */
+ 0x31, /* 11 ABxD => DxBA */
+ 0x22, /* 12 ABxCD => CDxAB */
+ 0x32, /* 13 ABxCD => CDxBA */
+ 0x23, /* 14 ABxCD => DCxAB */
+ 0x33, /* 15 ABxCD => DCxBA */
+ };
+
+ unsigned int m = map[flags & Verb];
+ unsigned int l = hb_min (2u, m >> 4);
+ unsigned int r = hb_min (2u, m & 0x0F);
+ bool reverse_l = 3 == (m >> 4);
+ bool reverse_r = 3 == (m & 0x0F);
+
+ if (end - start >= l + r)
+ {
+ buffer->merge_clusters (start, hb_min (buffer->idx + 1, buffer->len));
+ buffer->merge_clusters (start, end);
+
+ hb_glyph_info_t *info = buffer->info;
+ hb_glyph_info_t buf[4];
+
+ memcpy (buf, info + start, l * sizeof (buf[0]));
+ memcpy (buf + 2, info + end - r, r * sizeof (buf[0]));
+
+ if (l != r)
+ memmove (info + start + r, info + start + l, (end - start - l - r) * sizeof (buf[0]));
+
+ memcpy (info + start, buf + 2, r * sizeof (buf[0]));
+ memcpy (info + end - l, buf, l * sizeof (buf[0]));
+ if (reverse_l)
+ {
+ buf[0] = info[end - 1];
+ info[end - 1] = info[end - 2];
+ info[end - 2] = buf[0];
+ }
+ if (reverse_r)
+ {
+ buf[0] = info[start];
+ info[start] = info[start + 1];
+ info[start + 1] = buf[0];
+ }
+ }
+ }
+ }
+
+ public:
+ bool ret;
+ private:
+ unsigned int start;
+ unsigned int end;
+ };
+
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+
+ driver_context_t dc (this);
+
+ StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->face);
+ driver.drive (&dc);
+
+ return_trace (dc.ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (machine.sanitize (c));
+ }
+
+ protected:
+ StateTable<Types, EntryData> machine;
+ public:
+ DEFINE_SIZE_STATIC (16);
+};
+
+template <typename Types>
+struct ContextualSubtable
+{
+ typedef typename Types::HBUINT HBUINT;
+
+ struct EntryData
+ {
+ HBUINT16 markIndex; /* Index of the substitution table for the
+ * marked glyph (use 0xFFFF for none). */
+ HBUINT16 currentIndex; /* Index of the substitution table for the
+ * current glyph (use 0xFFFF for none). */
+ public:
+ DEFINE_SIZE_STATIC (4);
+ };
+
+ struct driver_context_t
+ {
+ static constexpr bool in_place = true;
+ enum Flags
+ {
+ SetMark = 0x8000, /* If set, make the current glyph the marked glyph. */
+ DontAdvance = 0x4000, /* If set, don't advance to the next glyph before
+ * going to the new state. */
+ Reserved = 0x3FFF, /* These bits are reserved and should be set to 0. */
+ };
+
+ driver_context_t (const ContextualSubtable *table_,
+ hb_aat_apply_context_t *c_) :
+ ret (false),
+ c (c_),
+ mark_set (false),
+ mark (0),
+ table (table_),
+ subs (table+table->substitutionTables) {}
+
+ bool is_actionable (StateTableDriver<Types, EntryData> *driver,
+ const Entry<EntryData> &entry)
+ {
+ hb_buffer_t *buffer = driver->buffer;
+
+ if (buffer->idx == buffer->len && !mark_set)
+ return false;
+
+ return entry.data.markIndex != 0xFFFF || entry.data.currentIndex != 0xFFFF;
+ }
+ void transition (StateTableDriver<Types, EntryData> *driver,
+ const Entry<EntryData> &entry)
+ {
+ hb_buffer_t *buffer = driver->buffer;
+
+ /* Looks like CoreText applies neither mark nor current substitution for
+ * end-of-text if mark was not explicitly set. */
+ if (buffer->idx == buffer->len && !mark_set)
+ return;
+
+ const HBGlyphID *replacement;
+
+ replacement = nullptr;
+ if (Types::extended)
+ {
+ if (entry.data.markIndex != 0xFFFF)
+ {
+ const Lookup<HBGlyphID> &lookup = subs[entry.data.markIndex];
+ replacement = lookup.get_value (buffer->info[mark].codepoint, driver->num_glyphs);
+ }
+ }
+ else
+ {
+ unsigned int offset = entry.data.markIndex + buffer->info[mark].codepoint;
+ const UnsizedArrayOf<HBGlyphID> &subs_old = (const UnsizedArrayOf<HBGlyphID> &) subs;
+ replacement = &subs_old[Types::wordOffsetToIndex (offset, table, subs_old.arrayZ)];
+ if (!replacement->sanitize (&c->sanitizer) || !*replacement)
+ replacement = nullptr;
+ }
+ if (replacement)
+ {
+ buffer->unsafe_to_break (mark, hb_min (buffer->idx + 1, buffer->len));
+ buffer->info[mark].codepoint = *replacement;
+ ret = true;
+ }
+
+ replacement = nullptr;
+ unsigned int idx = hb_min (buffer->idx, buffer->len - 1);
+ if (Types::extended)
+ {
+ if (entry.data.currentIndex != 0xFFFF)
+ {
+ const Lookup<HBGlyphID> &lookup = subs[entry.data.currentIndex];
+ replacement = lookup.get_value (buffer->info[idx].codepoint, driver->num_glyphs);
+ }
+ }
+ else
+ {
+ unsigned int offset = entry.data.currentIndex + buffer->info[idx].codepoint;
+ const UnsizedArrayOf<HBGlyphID> &subs_old = (const UnsizedArrayOf<HBGlyphID> &) subs;
+ replacement = &subs_old[Types::wordOffsetToIndex (offset, table, subs_old.arrayZ)];
+ if (!replacement->sanitize (&c->sanitizer) || !*replacement)
+ replacement = nullptr;
+ }
+ if (replacement)
+ {
+ buffer->info[idx].codepoint = *replacement;
+ ret = true;
+ }
+
+ if (entry.flags & SetMark)
+ {
+ mark_set = true;
+ mark = buffer->idx;
+ }
+ }
+
+ public:
+ bool ret;
+ private:
+ hb_aat_apply_context_t *c;
+ bool mark_set;
+ unsigned int mark;
+ const ContextualSubtable *table;
+ const UnsizedOffsetListOf<Lookup<HBGlyphID>, HBUINT, false> &subs;
+ };
+
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+
+ driver_context_t dc (this, c);
+
+ StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->face);
+ driver.drive (&dc);
+
+ return_trace (dc.ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+
+ unsigned int num_entries = 0;
+ if (unlikely (!machine.sanitize (c, &num_entries))) return_trace (false);
+
+ if (!Types::extended)
+ return_trace (substitutionTables.sanitize (c, this, 0));
+
+ unsigned int num_lookups = 0;
+
+ const Entry<EntryData> *entries = machine.get_entries ();
+ for (unsigned int i = 0; i < num_entries; i++)
+ {
+ const EntryData &data = entries[i].data;
+
+ if (data.markIndex != 0xFFFF)
+ num_lookups = hb_max (num_lookups, 1 + data.markIndex);
+ if (data.currentIndex != 0xFFFF)
+ num_lookups = hb_max (num_lookups, 1 + data.currentIndex);
+ }
+
+ return_trace (substitutionTables.sanitize (c, this, num_lookups));
+ }
+
+ protected:
+ StateTable<Types, EntryData>
+ machine;
+ NNOffsetTo<UnsizedOffsetListOf<Lookup<HBGlyphID>, HBUINT, false>, HBUINT>
+ substitutionTables;
+ public:
+ DEFINE_SIZE_STATIC (20);
+};
+
+
+template <bool extended>
+struct LigatureEntry;
+
+template <>
+struct LigatureEntry<true>
+{
+ enum Flags
+ {
+ SetComponent = 0x8000, /* Push this glyph onto the component stack for
+ * eventual processing. */
+ DontAdvance = 0x4000, /* Leave the glyph pointer at this glyph for the
+ next iteration. */
+ PerformAction = 0x2000, /* Use the ligActionIndex to process a ligature
+ * group. */
+ Reserved = 0x1FFF, /* These bits are reserved and should be set to 0. */
+ };
+
+ struct EntryData
+ {
+ HBUINT16 ligActionIndex; /* Index to the first ligActionTable entry
+ * for processing this group, if indicated
+ * by the flags. */
+ public:
+ DEFINE_SIZE_STATIC (2);
+ };
+
+ static bool performAction (const Entry<EntryData> &entry)
+ { return entry.flags & PerformAction; }
+
+ static unsigned int ligActionIndex (const Entry<EntryData> &entry)
+ { return entry.data.ligActionIndex; }
+};
+template <>
+struct LigatureEntry<false>
+{
+ enum Flags
+ {
+ SetComponent = 0x8000, /* Push this glyph onto the component stack for
+ * eventual processing. */
+ DontAdvance = 0x4000, /* Leave the glyph pointer at this glyph for the
+ next iteration. */
+ Offset = 0x3FFF, /* Byte offset from beginning of subtable to the
+ * ligature action list. This value must be a
+ * multiple of 4. */
+ };
+
+ typedef void EntryData;
+
+ static bool performAction (const Entry<EntryData> &entry)
+ { return entry.flags & Offset; }
+
+ static unsigned int ligActionIndex (const Entry<EntryData> &entry)
+ { return entry.flags & Offset; }
+};
+
+
+template <typename Types>
+struct LigatureSubtable
+{
+ typedef typename Types::HBUINT HBUINT;
+
+ typedef LigatureEntry<Types::extended> LigatureEntryT;
+ typedef typename LigatureEntryT::EntryData EntryData;
+
+ struct driver_context_t
+ {
+ static constexpr bool in_place = false;
+ enum
+ {
+ DontAdvance = LigatureEntryT::DontAdvance,
+ };
+ enum LigActionFlags
+ {
+ LigActionLast = 0x80000000, /* This is the last action in the list. This also
+ * implies storage. */
+ LigActionStore = 0x40000000, /* Store the ligature at the current cumulated index
+ * in the ligature table in place of the marked
+ * (i.e. currently-popped) glyph. */
+ LigActionOffset = 0x3FFFFFFF, /* A 30-bit value which is sign-extended to 32-bits
+ * and added to the glyph ID, resulting in an index
+ * into the component table. */
+ };
+
+ driver_context_t (const LigatureSubtable *table_,
+ hb_aat_apply_context_t *c_) :
+ ret (false),
+ c (c_),
+ table (table_),
+ ligAction (table+table->ligAction),
+ component (table+table->component),
+ ligature (table+table->ligature),
+ match_length (0) {}
+
+ bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
+ const Entry<EntryData> &entry)
+ {
+ return LigatureEntryT::performAction (entry);
+ }
+ void transition (StateTableDriver<Types, EntryData> *driver,
+ const Entry<EntryData> &entry)
+ {
+ hb_buffer_t *buffer = driver->buffer;
+
+ DEBUG_MSG (APPLY, nullptr, "Ligature transition at %u", buffer->idx);
+ if (entry.flags & LigatureEntryT::SetComponent)
+ {
+ /* Never mark same index twice, in case DontAdvance was used... */
+ if (match_length && match_positions[(match_length - 1u) % ARRAY_LENGTH (match_positions)] == buffer->out_len)
+ match_length--;
+
+ match_positions[match_length++ % ARRAY_LENGTH (match_positions)] = buffer->out_len;
+ DEBUG_MSG (APPLY, nullptr, "Set component at %u", buffer->out_len);
+ }
+
+ if (LigatureEntryT::performAction (entry))
+ {
+ DEBUG_MSG (APPLY, nullptr, "Perform action with %u", match_length);
+ unsigned int end = buffer->out_len;
+
+ if (unlikely (!match_length))
+ return;
+
+ if (buffer->idx >= buffer->len)
+ return; /* TODO Work on previous instead? */
+
+ unsigned int cursor = match_length;
+
+ unsigned int action_idx = LigatureEntryT::ligActionIndex (entry);
+ action_idx = Types::offsetToIndex (action_idx, table, ligAction.arrayZ);
+ const HBUINT32 *actionData = &ligAction[action_idx];
+
+ unsigned int ligature_idx = 0;
+ unsigned int action;
+ do
+ {
+ if (unlikely (!cursor))
+ {
+ /* Stack underflow. Clear the stack. */
+ DEBUG_MSG (APPLY, nullptr, "Stack underflow");
+ match_length = 0;
+ break;
+ }
+
+ DEBUG_MSG (APPLY, nullptr, "Moving to stack position %u", cursor - 1);
+ buffer->move_to (match_positions[--cursor % ARRAY_LENGTH (match_positions)]);
+
+ if (unlikely (!actionData->sanitize (&c->sanitizer))) break;
+ action = *actionData;
+
+ uint32_t uoffset = action & LigActionOffset;
+ if (uoffset & 0x20000000)
+ uoffset |= 0xC0000000; /* Sign-extend. */
+ int32_t offset = (int32_t) uoffset;
+ unsigned int component_idx = buffer->cur().codepoint + offset;
+ component_idx = Types::wordOffsetToIndex (component_idx, table, component.arrayZ);
+ const HBUINT16 &componentData = component[component_idx];
+ if (unlikely (!componentData.sanitize (&c->sanitizer))) break;
+ ligature_idx += componentData;
+
+ DEBUG_MSG (APPLY, nullptr, "Action store %u last %u",
+ bool (action & LigActionStore),
+ bool (action & LigActionLast));
+ if (action & (LigActionStore | LigActionLast))
+ {
+ ligature_idx = Types::offsetToIndex (ligature_idx, table, ligature.arrayZ);
+ const HBGlyphID &ligatureData = ligature[ligature_idx];
+ if (unlikely (!ligatureData.sanitize (&c->sanitizer))) break;
+ hb_codepoint_t lig = ligatureData;
+
+ DEBUG_MSG (APPLY, nullptr, "Produced ligature %u", lig);
+ buffer->replace_glyph (lig);
+
+ unsigned int lig_end = match_positions[(match_length - 1u) % ARRAY_LENGTH (match_positions)] + 1u;
+ /* Now go and delete all subsequent components. */
+ while (match_length - 1u > cursor)
+ {
+ DEBUG_MSG (APPLY, nullptr, "Skipping ligature component");
+ buffer->move_to (match_positions[--match_length % ARRAY_LENGTH (match_positions)]);
+ buffer->replace_glyph (DELETED_GLYPH);
+ }
+
+ buffer->move_to (lig_end);
+ buffer->merge_out_clusters (match_positions[cursor % ARRAY_LENGTH (match_positions)], buffer->out_len);
+ }
+
+ actionData++;
+ }
+ while (!(action & LigActionLast));
+ buffer->move_to (end);
+ }
+ }
+
+ public:
+ bool ret;
+ private:
+ hb_aat_apply_context_t *c;
+ const LigatureSubtable *table;
+ const UnsizedArrayOf<HBUINT32> &ligAction;
+ const UnsizedArrayOf<HBUINT16> &component;
+ const UnsizedArrayOf<HBGlyphID> &ligature;
+ unsigned int match_length;
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
+ };
+
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+
+ driver_context_t dc (this, c);
+
+ StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->face);
+ driver.drive (&dc);
+
+ return_trace (dc.ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ /* The rest of array sanitizations are done at run-time. */
+ return_trace (c->check_struct (this) && machine.sanitize (c) &&
+ ligAction && component && ligature);
+ }
+
+ protected:
+ StateTable<Types, EntryData>
+ machine;
+ NNOffsetTo<UnsizedArrayOf<HBUINT32>, HBUINT>
+ ligAction; /* Offset to the ligature action table. */
+ NNOffsetTo<UnsizedArrayOf<HBUINT16>, HBUINT>
+ component; /* Offset to the component table. */
+ NNOffsetTo<UnsizedArrayOf<HBGlyphID>, HBUINT>
+ ligature; /* Offset to the actual ligature lists. */
+ public:
+ DEFINE_SIZE_STATIC (28);
+};
+
+template <typename Types>
+struct NoncontextualSubtable
+{
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+
+ bool ret = false;
+ unsigned int num_glyphs = c->face->get_num_glyphs ();
+
+ hb_glyph_info_t *info = c->buffer->info;
+ unsigned int count = c->buffer->len;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ const HBGlyphID *replacement = substitute.get_value (info[i].codepoint, num_glyphs);
+ if (replacement)
+ {
+ info[i].codepoint = *replacement;
+ ret = true;
+ }
+ }
+
+ return_trace (ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (substitute.sanitize (c));
+ }
+
+ protected:
+ Lookup<HBGlyphID> substitute;
+ public:
+ DEFINE_SIZE_MIN (2);
+};
+
+template <typename Types>
+struct InsertionSubtable
+{
+ typedef typename Types::HBUINT HBUINT;
+
+ struct EntryData
+ {
+ HBUINT16 currentInsertIndex; /* Zero-based index into the insertion glyph table.
+ * The number of glyphs to be inserted is contained
+ * in the currentInsertCount field in the flags.
+ * A value of 0xFFFF indicates no insertion is to
+ * be done. */
+ HBUINT16 markedInsertIndex; /* Zero-based index into the insertion glyph table.
+ * The number of glyphs to be inserted is contained
+ * in the markedInsertCount field in the flags.
+ * A value of 0xFFFF indicates no insertion is to
+ * be done. */
+ public:
+ DEFINE_SIZE_STATIC (4);
+ };
+
+ struct driver_context_t
+ {
+ static constexpr bool in_place = false;
+ enum Flags
+ {
+ SetMark = 0x8000, /* If set, mark the current glyph. */
+ DontAdvance = 0x4000, /* If set, don't advance to the next glyph before
+ * going to the new state. This does not mean
+ * that the glyph pointed to is the same one as
+ * before. If you've made insertions immediately
+ * downstream of the current glyph, the next glyph
+ * processed would in fact be the first one
+ * inserted. */
+ CurrentIsKashidaLike= 0x2000, /* If set, and the currentInsertList is nonzero,
+ * then the specified glyph list will be inserted
+ * as a kashida-like insertion, either before or
+ * after the current glyph (depending on the state
+ * of the currentInsertBefore flag). If clear, and
+ * the currentInsertList is nonzero, then the
+ * specified glyph list will be inserted as a
+ * split-vowel-like insertion, either before or
+ * after the current glyph (depending on the state
+ * of the currentInsertBefore flag). */
+ MarkedIsKashidaLike= 0x1000, /* If set, and the markedInsertList is nonzero,
+ * then the specified glyph list will be inserted
+ * as a kashida-like insertion, either before or
+ * after the marked glyph (depending on the state
+ * of the markedInsertBefore flag). If clear, and
+ * the markedInsertList is nonzero, then the
+ * specified glyph list will be inserted as a
+ * split-vowel-like insertion, either before or
+ * after the marked glyph (depending on the state
+ * of the markedInsertBefore flag). */
+ CurrentInsertBefore= 0x0800, /* If set, specifies that insertions are to be made
+ * to the left of the current glyph. If clear,
+ * they're made to the right of the current glyph. */
+ MarkedInsertBefore= 0x0400, /* If set, specifies that insertions are to be
+ * made to the left of the marked glyph. If clear,
+ * they're made to the right of the marked glyph. */
+ CurrentInsertCount= 0x3E0, /* This 5-bit field is treated as a count of the
+ * number of glyphs to insert at the current
+ * position. Since zero means no insertions, the
+ * largest number of insertions at any given
+ * current location is 31 glyphs. */
+ MarkedInsertCount= 0x001F, /* This 5-bit field is treated as a count of the
+ * number of glyphs to insert at the marked
+ * position. Since zero means no insertions, the
+ * largest number of insertions at any given
+ * marked location is 31 glyphs. */
+ };
+
+ driver_context_t (const InsertionSubtable *table,
+ hb_aat_apply_context_t *c_) :
+ ret (false),
+ c (c_),
+ mark (0),
+ insertionAction (table+table->insertionAction) {}
+
+ bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
+ const Entry<EntryData> &entry)
+ {
+ return (entry.flags & (CurrentInsertCount | MarkedInsertCount)) &&
+ (entry.data.currentInsertIndex != 0xFFFF ||entry.data.markedInsertIndex != 0xFFFF);
+ }
+ void transition (StateTableDriver<Types, EntryData> *driver,
+ const Entry<EntryData> &entry)
+ {
+ hb_buffer_t *buffer = driver->buffer;
+ unsigned int flags = entry.flags;
+
+ unsigned mark_loc = buffer->out_len;
+
+ if (entry.data.markedInsertIndex != 0xFFFF)
+ {
+ unsigned int count = (flags & MarkedInsertCount);
+ unsigned int start = entry.data.markedInsertIndex;
+ const HBGlyphID *glyphs = &insertionAction[start];
+ if (unlikely (!c->sanitizer.check_array (glyphs, count))) count = 0;
+
+ bool before = flags & MarkedInsertBefore;
+
+ unsigned int end = buffer->out_len;
+ buffer->move_to (mark);
+
+ if (buffer->idx < buffer->len && !before)
+ buffer->copy_glyph ();
+ /* TODO We ignore KashidaLike setting. */
+ for (unsigned int i = 0; i < count; i++)
+ buffer->output_glyph (glyphs[i]);
+ if (buffer->idx < buffer->len && !before)
+ buffer->skip_glyph ();
+
+ buffer->move_to (end + count);
+
+ buffer->unsafe_to_break_from_outbuffer (mark, hb_min (buffer->idx + 1, buffer->len));
+ }
+
+ if (flags & SetMark)
+ mark = mark_loc;
+
+ if (entry.data.currentInsertIndex != 0xFFFF)
+ {
+ unsigned int count = (flags & CurrentInsertCount) >> 5;
+ unsigned int start = entry.data.currentInsertIndex;
+ const HBGlyphID *glyphs = &insertionAction[start];
+ if (unlikely (!c->sanitizer.check_array (glyphs, count))) count = 0;
+
+ bool before = flags & CurrentInsertBefore;
+
+ unsigned int end = buffer->out_len;
+
+ if (buffer->idx < buffer->len && !before)
+ buffer->copy_glyph ();
+ /* TODO We ignore KashidaLike setting. */
+ for (unsigned int i = 0; i < count; i++)
+ buffer->output_glyph (glyphs[i]);
+ if (buffer->idx < buffer->len && !before)
+ buffer->skip_glyph ();
+
+ /* Humm. Not sure where to move to. There's this wording under
+ * DontAdvance flag:
+ *
+ * "If set, don't update the glyph index before going to the new state.
+ * This does not mean that the glyph pointed to is the same one as
+ * before. If you've made insertions immediately downstream of the
+ * current glyph, the next glyph processed would in fact be the first
+ * one inserted."
+ *
+ * This suggests that if DontAdvance is NOT set, we should move to
+ * end+count. If it *was*, then move to end, such that newly inserted
+ * glyphs are now visible.
+ *
+ * https://github.com/harfbuzz/harfbuzz/issues/1224#issuecomment-427691417
+ */
+ buffer->move_to ((flags & DontAdvance) ? end : end + count);
+ }
+ }
+
+ public:
+ bool ret;
+ private:
+ hb_aat_apply_context_t *c;
+ unsigned int mark;
+ const UnsizedArrayOf<HBGlyphID> &insertionAction;
+ };
+
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+
+ driver_context_t dc (this, c);
+
+ StateTableDriver<Types, EntryData> driver (machine, c->buffer, c->face);
+ driver.drive (&dc);
+
+ return_trace (dc.ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ /* The rest of array sanitizations are done at run-time. */
+ return_trace (c->check_struct (this) && machine.sanitize (c) &&
+ insertionAction);
+ }
+
+ protected:
+ StateTable<Types, EntryData>
+ machine;
+ NNOffsetTo<UnsizedArrayOf<HBGlyphID>, HBUINT>
+ insertionAction; /* Byte offset from stateHeader to the start of
+ * the insertion glyph table. */
+ public:
+ DEFINE_SIZE_STATIC (20);
+};
+
+
+struct Feature
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ public:
+ HBUINT16 featureType; /* The type of feature. */
+ HBUINT16 featureSetting; /* The feature's setting (aka selector). */
+ HBUINT32 enableFlags; /* Flags for the settings that this feature
+ * and setting enables. */
+ HBUINT32 disableFlags; /* Complement of flags for the settings that this
+ * feature and setting disable. */
+
+ public:
+ DEFINE_SIZE_STATIC (12);
+};
+
+template <typename Types>
+struct ChainSubtable
+{
+ typedef typename Types::HBUINT HBUINT;
+
+ template <typename T>
+ friend struct Chain;
+
+ unsigned int get_size () const { return length; }
+ unsigned int get_type () const { return coverage & 0xFF; }
+ unsigned int get_coverage () const { return coverage >> (sizeof (HBUINT) * 8 - 8); }
+
+ enum Coverage
+ {
+ Vertical = 0x80, /* If set, this subtable will only be applied
+ * to vertical text. If clear, this subtable
+ * will only be applied to horizontal text. */
+ Backwards = 0x40, /* If set, this subtable will process glyphs
+ * in descending order. If clear, it will
+ * process the glyphs in ascending order. */
+ AllDirections = 0x20, /* If set, this subtable will be applied to
+ * both horizontal and vertical text (i.e.
+ * the state of bit 0x80000000 is ignored). */
+ Logical = 0x10, /* If set, this subtable will process glyphs
+ * in logical order (or reverse logical order,
+ * depending on the value of bit 0x80000000). */
+ };
+ enum Type
+ {
+ Rearrangement = 0,
+ Contextual = 1,
+ Ligature = 2,
+ Noncontextual = 4,
+ Insertion = 5
+ };
+
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+ {
+ unsigned int subtable_type = get_type ();
+ TRACE_DISPATCH (this, subtable_type);
+ switch (subtable_type) {
+ case Rearrangement: return_trace (c->dispatch (u.rearrangement, hb_forward<Ts> (ds)...));
+ case Contextual: return_trace (c->dispatch (u.contextual, hb_forward<Ts> (ds)...));
+ case Ligature: return_trace (c->dispatch (u.ligature, hb_forward<Ts> (ds)...));
+ case Noncontextual: return_trace (c->dispatch (u.noncontextual, hb_forward<Ts> (ds)...));
+ case Insertion: return_trace (c->dispatch (u.insertion, hb_forward<Ts> (ds)...));
+ default: return_trace (c->default_return_value ());
+ }
+ }
+
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+ hb_sanitize_with_object_t with (&c->sanitizer, this);
+ return_trace (dispatch (c));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!length.sanitize (c) ||
+ length <= min_size ||
+ !c->check_range (this, length))
+ return_trace (false);
+
+ hb_sanitize_with_object_t with (c, this);
+ return_trace (dispatch (c));
+ }
+
+ protected:
+ HBUINT length; /* Total subtable length, including this header. */
+ HBUINT coverage; /* Coverage flags and subtable type. */
+ HBUINT32 subFeatureFlags;/* The 32-bit mask identifying which subtable this is. */
+ union {
+ RearrangementSubtable<Types> rearrangement;
+ ContextualSubtable<Types> contextual;
+ LigatureSubtable<Types> ligature;
+ NoncontextualSubtable<Types> noncontextual;
+ InsertionSubtable<Types> insertion;
+ } u;
+ public:
+ DEFINE_SIZE_MIN (2 * sizeof (HBUINT) + 4);
+};
+
+template <typename Types>
+struct Chain
+{
+ typedef typename Types::HBUINT HBUINT;
+
+ hb_mask_t compile_flags (const hb_aat_map_builder_t *map) const
+ {
+ hb_mask_t flags = defaultFlags;
+ {
+ unsigned int count = featureCount;
+ for (unsigned i = 0; i < count; i++)
+ {
+ const Feature &feature = featureZ[i];
+ hb_aat_layout_feature_type_t type = (hb_aat_layout_feature_type_t) (unsigned int) feature.featureType;
+ hb_aat_layout_feature_selector_t setting = (hb_aat_layout_feature_selector_t) (unsigned int) feature.featureSetting;
+ retry:
+ const hb_aat_map_builder_t::feature_info_t *info = map->features.bsearch (type);
+ if (info && info->setting == setting)
+ {
+ flags &= feature.disableFlags;
+ flags |= feature.enableFlags;
+ }
+ else if (type == HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE && setting == HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS)
+ {
+ /* Deprecated. https://github.com/harfbuzz/harfbuzz/issues/1342 */
+ type = HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE;
+ setting = HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS;
+ goto retry;
+ }
+ }
+ }
+ return flags;
+ }
+
+ void apply (hb_aat_apply_context_t *c,
+ hb_mask_t flags) const
+ {
+ const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types>> (featureZ.as_array (featureCount));
+ unsigned int count = subtableCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ bool reverse;
+
+ if (!(subtable->subFeatureFlags & flags))
+ goto skip;
+
+ if (!(subtable->get_coverage() & ChainSubtable<Types>::AllDirections) &&
+ HB_DIRECTION_IS_VERTICAL (c->buffer->props.direction) !=
+ bool (subtable->get_coverage() & ChainSubtable<Types>::Vertical))
+ goto skip;
+
+ /* Buffer contents is always in logical direction. Determine if
+ * we need to reverse before applying this subtable. We reverse
+ * back after if we did reverse indeed.
+ *
+ * Quoting the spac:
+ * """
+ * Bits 28 and 30 of the coverage field control the order in which
+ * glyphs are processed when the subtable is run by the layout engine.
+ * Bit 28 is used to indicate if the glyph processing direction is
+ * the same as logical order or layout order. Bit 30 is used to
+ * indicate whether glyphs are processed forwards or backwards within
+ * that order.
+
+ Bit 30 Bit 28 Interpretation for Horizontal Text
+ 0 0 The subtable is processed in layout order
+ (the same order as the glyphs, which is
+ always left-to-right).
+ 1 0 The subtable is processed in reverse layout order
+ (the order opposite that of the glyphs, which is
+ always right-to-left).
+ 0 1 The subtable is processed in logical order
+ (the same order as the characters, which may be
+ left-to-right or right-to-left).
+ 1 1 The subtable is processed in reverse logical order
+ (the order opposite that of the characters, which
+ may be right-to-left or left-to-right).
+ */
+ reverse = subtable->get_coverage () & ChainSubtable<Types>::Logical ?
+ bool (subtable->get_coverage () & ChainSubtable<Types>::Backwards) :
+ bool (subtable->get_coverage () & ChainSubtable<Types>::Backwards) !=
+ HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction);
+
+ if (!c->buffer->message (c->font, "start chain subtable %d", c->lookup_index))
+ goto skip;
+
+ if (reverse)
+ c->buffer->reverse ();
+
+ subtable->apply (c);
+
+ if (reverse)
+ c->buffer->reverse ();
+
+ (void) c->buffer->message (c->font, "end chain subtable %d", c->lookup_index);
+
+ if (unlikely (!c->buffer->successful)) return;
+
+ skip:
+ subtable = &StructAfter<ChainSubtable<Types>> (*subtable);
+ c->set_lookup_index (c->lookup_index + 1);
+ }
+ }
+
+ unsigned int get_size () const { return length; }
+
+ bool sanitize (hb_sanitize_context_t *c, unsigned int version HB_UNUSED) const
+ {
+ TRACE_SANITIZE (this);
+ if (!length.sanitize (c) ||
+ length < min_size ||
+ !c->check_range (this, length))
+ return_trace (false);
+
+ if (!c->check_array (featureZ.arrayZ, featureCount))
+ return_trace (false);
+
+ const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types>> (featureZ.as_array (featureCount));
+ unsigned int count = subtableCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (!subtable->sanitize (c))
+ return_trace (false);
+ subtable = &StructAfter<ChainSubtable<Types>> (*subtable);
+ }
+
+ return_trace (true);
+ }
+
+ protected:
+ HBUINT32 defaultFlags; /* The default specification for subtables. */
+ HBUINT32 length; /* Total byte count, including this header. */
+ HBUINT featureCount; /* Number of feature subtable entries. */
+ HBUINT subtableCount; /* The number of subtables in the chain. */
+
+ UnsizedArrayOf<Feature> featureZ; /* Features. */
+/*ChainSubtable firstSubtable;*//* Subtables. */
+/*subtableGlyphCoverageArray*/ /* Only if version >= 3. We don't use. */
+
+ public:
+ DEFINE_SIZE_MIN (8 + 2 * sizeof (HBUINT));
+};
+
+
+/*
+ * The 'mort'/'morx' Table
+ */
+
+template <typename Types, hb_tag_t TAG>
+struct mortmorx
+{
+ static constexpr hb_tag_t tableTag = TAG;
+
+ bool has_data () const { return version != 0; }
+
+ void compile_flags (const hb_aat_map_builder_t *mapper,
+ hb_aat_map_t *map) const
+ {
+ const Chain<Types> *chain = &firstChain;
+ unsigned int count = chainCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ map->chain_flags.push (chain->compile_flags (mapper));
+ chain = &StructAfter<Chain<Types>> (*chain);
+ }
+ }
+
+ void apply (hb_aat_apply_context_t *c) const
+ {
+ if (unlikely (!c->buffer->successful)) return;
+ c->set_lookup_index (0);
+ const Chain<Types> *chain = &firstChain;
+ unsigned int count = chainCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ chain->apply (c, c->plan->aat_map.chain_flags[i]);
+ if (unlikely (!c->buffer->successful)) return;
+ chain = &StructAfter<Chain<Types>> (*chain);
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!version.sanitize (c) || !version || !chainCount.sanitize (c))
+ return_trace (false);
+
+ const Chain<Types> *chain = &firstChain;
+ unsigned int count = chainCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (!chain->sanitize (c, version))
+ return_trace (false);
+ chain = &StructAfter<Chain<Types>> (*chain);
+ }
+
+ return_trace (true);
+ }
+
+ protected:
+ HBUINT16 version; /* Version number of the glyph metamorphosis table.
+ * 1, 2, or 3. */
+ HBUINT16 unused; /* Set to 0. */
+ HBUINT32 chainCount; /* Number of metamorphosis chains contained in this
+ * table. */
+ Chain<Types> firstChain; /* Chains. */
+
+ public:
+ DEFINE_SIZE_MIN (8);
+};
+
+struct morx : mortmorx<ExtendedTypes, HB_AAT_TAG_morx> {};
+struct mort : mortmorx<ObsoleteTypes, HB_AAT_TAG_mort> {};
+
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_MORX_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-opbd-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-opbd-table.hh
new file mode 100644
index 0000000000..4e0234074f
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-opbd-table.hh
@@ -0,0 +1,173 @@
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_AAT_LAYOUT_OPBD_TABLE_HH
+#define HB_AAT_LAYOUT_OPBD_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+#include "hb-open-type.hh"
+
+/*
+ * opbd -- Optical Bounds
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6opbd.html
+ */
+#define HB_AAT_TAG_opbd HB_TAG('o','p','b','d')
+
+
+namespace AAT {
+
+struct OpticalBounds
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ FWORD leftSide;
+ FWORD topSide;
+ FWORD rightSide;
+ FWORD bottomSide;
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+struct opbdFormat0
+{
+ bool get_bounds (hb_font_t *font, hb_codepoint_t glyph_id,
+ hb_glyph_extents_t *extents, const void *base) const
+ {
+ const OffsetTo<OpticalBounds> *bounds_offset = lookupTable.get_value (glyph_id, font->face->get_num_glyphs ());
+ if (!bounds_offset) return false;
+ const OpticalBounds &bounds = base+*bounds_offset;
+
+ if (extents)
+ *extents = {
+ font->em_scale_x (bounds.leftSide),
+ font->em_scale_y (bounds.topSide),
+ font->em_scale_x (bounds.rightSide),
+ font->em_scale_y (bounds.bottomSide)
+ };
+ return true;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) && lookupTable.sanitize (c, base)));
+ }
+
+ protected:
+ Lookup<OffsetTo<OpticalBounds>>
+ lookupTable; /* Lookup table associating glyphs with the four
+ * int16 values for the left-side, top-side,
+ * right-side, and bottom-side optical bounds. */
+ public:
+ DEFINE_SIZE_MIN (2);
+};
+
+struct opbdFormat1
+{
+ bool get_bounds (hb_font_t *font, hb_codepoint_t glyph_id,
+ hb_glyph_extents_t *extents, const void *base) const
+ {
+ const OffsetTo<OpticalBounds> *bounds_offset = lookupTable.get_value (glyph_id, font->face->get_num_glyphs ());
+ if (!bounds_offset) return false;
+ const OpticalBounds &bounds = base+*bounds_offset;
+
+ hb_position_t left = 0, top = 0, right = 0, bottom = 0, ignore;
+ if (font->get_glyph_contour_point (glyph_id, bounds.leftSide, &left, &ignore) ||
+ font->get_glyph_contour_point (glyph_id, bounds.topSide, &ignore, &top) ||
+ font->get_glyph_contour_point (glyph_id, bounds.rightSide, &right, &ignore) ||
+ font->get_glyph_contour_point (glyph_id, bounds.bottomSide, &ignore, &bottom))
+ {
+ if (extents)
+ *extents = {left, top, right, bottom};
+ return true;
+ }
+ return false;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) && lookupTable.sanitize (c, base)));
+ }
+
+ protected:
+ Lookup<OffsetTo<OpticalBounds>>
+ lookupTable; /* Lookup table associating glyphs with the four
+ * int16 values for the left-side, top-side,
+ * right-side, and bottom-side optical bounds. */
+ public:
+ DEFINE_SIZE_MIN (2);
+};
+
+struct opbd
+{
+ static constexpr hb_tag_t tableTag = HB_AAT_TAG_opbd;
+
+ bool get_bounds (hb_font_t *font, hb_codepoint_t glyph_id,
+ hb_glyph_extents_t *extents) const
+ {
+ switch (format)
+ {
+ case 0: return u.format0.get_bounds (font, glyph_id, extents, this);
+ case 1: return u.format1.get_bounds (font, glyph_id, extents, this);
+ default:return false;
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this) || version.major != 1))
+ return_trace (false);
+
+ switch (format)
+ {
+ case 0: return_trace (u.format0.sanitize (c, this));
+ case 1: return_trace (u.format1.sanitize (c, this));
+ default:return_trace (true);
+ }
+ }
+
+ protected:
+ FixedVersion<>version; /* Version number of the optical bounds
+ * table (0x00010000 for the current version). */
+ HBUINT16 format; /* Format of the optical bounds table.
+ * Format 0 indicates distance and Format 1 indicates
+ * control point. */
+ union {
+ opbdFormat0 format0;
+ opbdFormat1 format1;
+ } u;
+ public:
+ DEFINE_SIZE_MIN (8);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_OPBD_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh
new file mode 100644
index 0000000000..99dddd8826
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh
@@ -0,0 +1,230 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_AAT_LAYOUT_TRAK_TABLE_HH
+#define HB_AAT_LAYOUT_TRAK_TABLE_HH
+
+#include "hb-aat-layout-common.hh"
+#include "hb-ot-layout.hh"
+#include "hb-open-type.hh"
+
+/*
+ * trak -- Tracking
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6trak.html
+ */
+#define HB_AAT_TAG_trak HB_TAG('t','r','a','k')
+
+
+namespace AAT {
+
+
+struct TrackTableEntry
+{
+ friend struct TrackData;
+
+ float get_track_value () const { return track.to_float (); }
+
+ int get_value (const void *base, unsigned int index,
+ unsigned int table_size) const
+ { return (base+valuesZ).as_array (table_size)[index]; }
+
+ public:
+ bool sanitize (hb_sanitize_context_t *c, const void *base,
+ unsigned int table_size) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ (valuesZ.sanitize (c, base, table_size))));
+ }
+
+ protected:
+ HBFixed track; /* Track value for this record. */
+ NameID trackNameID; /* The 'name' table index for this track.
+ * (a short word or phrase like "loose"
+ * or "very tight") */
+ NNOffsetTo<UnsizedArrayOf<FWORD>>
+ valuesZ; /* Offset from start of tracking table to
+ * per-size tracking values for this track. */
+
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+struct TrackData
+{
+ float interpolate_at (unsigned int idx,
+ float target_size,
+ const TrackTableEntry &trackTableEntry,
+ const void *base) const
+ {
+ unsigned int sizes = nSizes;
+ hb_array_t<const HBFixed> size_table ((base+sizeTable).arrayZ, sizes);
+
+ float s0 = size_table[idx].to_float ();
+ float s1 = size_table[idx + 1].to_float ();
+ float t = unlikely (s0 == s1) ? 0.f : (target_size - s0) / (s1 - s0);
+ return t * trackTableEntry.get_value (base, idx + 1, sizes) +
+ (1.f - t) * trackTableEntry.get_value (base, idx, sizes);
+ }
+
+ int get_tracking (const void *base, float ptem) const
+ {
+ /*
+ * Choose track.
+ */
+ const TrackTableEntry *trackTableEntry = nullptr;
+ unsigned int count = nTracks;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ /* Note: Seems like the track entries are sorted by values. But the
+ * spec doesn't explicitly say that. It just mentions it in the example. */
+
+ /* For now we only seek for track entries with zero tracking value */
+
+ if (trackTable[i].get_track_value () == 0.f)
+ {
+ trackTableEntry = &trackTable[i];
+ break;
+ }
+ }
+ if (!trackTableEntry) return 0.;
+
+ /*
+ * Choose size.
+ */
+ unsigned int sizes = nSizes;
+ if (!sizes) return 0.;
+ if (sizes == 1) return trackTableEntry->get_value (base, 0, sizes);
+
+ hb_array_t<const HBFixed> size_table ((base+sizeTable).arrayZ, sizes);
+ unsigned int size_index;
+ for (size_index = 0; size_index < sizes - 1; size_index++)
+ if (size_table[size_index].to_float () >= ptem)
+ break;
+
+ return roundf (interpolate_at (size_index ? size_index - 1 : 0, ptem,
+ *trackTableEntry, base));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ sizeTable.sanitize (c, base, nSizes) &&
+ trackTable.sanitize (c, nTracks, base, nSizes)));
+ }
+
+ protected:
+ HBUINT16 nTracks; /* Number of separate tracks included in this table. */
+ HBUINT16 nSizes; /* Number of point sizes included in this table. */
+ LOffsetTo<UnsizedArrayOf<HBFixed>, false>
+ sizeTable; /* Offset from start of the tracking table to
+ * Array[nSizes] of size values.. */
+ UnsizedArrayOf<TrackTableEntry>
+ trackTable; /* Array[nTracks] of TrackTableEntry records. */
+
+ public:
+ DEFINE_SIZE_ARRAY (8, trackTable);
+};
+
+struct trak
+{
+ static constexpr hb_tag_t tableTag = HB_AAT_TAG_trak;
+
+ bool has_data () const { return version.to_int (); }
+
+ bool apply (hb_aat_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+
+ hb_mask_t trak_mask = c->plan->trak_mask;
+
+ const float ptem = c->font->ptem;
+ if (unlikely (ptem <= 0.f))
+ return_trace (false);
+
+ hb_buffer_t *buffer = c->buffer;
+ if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+ {
+ const TrackData &trackData = this+horizData;
+ int tracking = trackData.get_tracking (this, ptem);
+ hb_position_t offset_to_add = c->font->em_scalef_x (tracking / 2);
+ hb_position_t advance_to_add = c->font->em_scalef_x (tracking);
+ foreach_grapheme (buffer, start, end)
+ {
+ if (!(buffer->info[start].mask & trak_mask)) continue;
+ buffer->pos[start].x_advance += advance_to_add;
+ buffer->pos[start].x_offset += offset_to_add;
+ }
+ }
+ else
+ {
+ const TrackData &trackData = this+vertData;
+ int tracking = trackData.get_tracking (this, ptem);
+ hb_position_t offset_to_add = c->font->em_scalef_y (tracking / 2);
+ hb_position_t advance_to_add = c->font->em_scalef_y (tracking);
+ foreach_grapheme (buffer, start, end)
+ {
+ if (!(buffer->info[start].mask & trak_mask)) continue;
+ buffer->pos[start].y_advance += advance_to_add;
+ buffer->pos[start].y_offset += offset_to_add;
+ }
+ }
+
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+
+ return_trace (likely (c->check_struct (this) &&
+ version.major == 1 &&
+ horizData.sanitize (c, this, this) &&
+ vertData.sanitize (c, this, this)));
+ }
+
+ protected:
+ FixedVersion<>version; /* Version of the tracking table
+ * (0x00010000u for version 1.0). */
+ HBUINT16 format; /* Format of the tracking table (set to 0). */
+ OffsetTo<TrackData>
+ horizData; /* Offset from start of tracking table to TrackData
+ * for horizontal text (or 0 if none). */
+ OffsetTo<TrackData>
+ vertData; /* Offset from start of tracking table to TrackData
+ * for vertical text (or 0 if none). */
+ HBUINT16 reserved; /* Reserved. Set to 0. */
+
+ public:
+ DEFINE_SIZE_STATIC (12);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_TRAK_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc
new file mode 100644
index 0000000000..4e506de16e
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc
@@ -0,0 +1,388 @@
+/*
+ * Copyright © 2017 Google, Inc.
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb-aat-layout.hh"
+#include "hb-aat-fdsc-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-aat-layout-ankr-table.hh"
+#include "hb-aat-layout-bsln-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-aat-layout-feat-table.hh"
+#include "hb-aat-layout-just-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-aat-layout-kerx-table.hh"
+#include "hb-aat-layout-morx-table.hh"
+#include "hb-aat-layout-trak-table.hh"
+#include "hb-aat-ltag-table.hh"
+
+
+/*
+ * hb_aat_apply_context_t
+ */
+
+/* Note: This context is used for kerning, even without AAT, hence the condition. */
+#if !defined(HB_NO_AAT) || !defined(HB_NO_OT_KERN)
+
+AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_,
+ hb_font_t *font_,
+ hb_buffer_t *buffer_,
+ hb_blob_t *blob) :
+ plan (plan_),
+ font (font_),
+ face (font->face),
+ buffer (buffer_),
+ sanitizer (),
+ ankr_table (&Null(AAT::ankr)),
+ lookup_index (0),
+ debug_depth (0)
+{
+ sanitizer.init (blob);
+ sanitizer.set_num_glyphs (face->get_num_glyphs ());
+ sanitizer.start_processing ();
+ sanitizer.set_max_ops (HB_SANITIZE_MAX_OPS_MAX);
+}
+
+AAT::hb_aat_apply_context_t::~hb_aat_apply_context_t ()
+{ sanitizer.end_processing (); }
+
+void
+AAT::hb_aat_apply_context_t::set_ankr_table (const AAT::ankr *ankr_table_)
+{ ankr_table = ankr_table_; }
+
+#endif
+
+
+/**
+ * SECTION:hb-aat-layout
+ * @title: hb-aat-layout
+ * @short_description: Apple Advanced Typography Layout
+ * @include: hb-aat.h
+ *
+ * Functions for querying OpenType Layout features in the font face.
+ **/
+
+
+#if !defined(HB_NO_AAT) || defined(HAVE_CORETEXT)
+
+/* Table data courtesy of Apple. Converted from mnemonics to integers
+ * when moving to this file. */
+static const hb_aat_feature_mapping_t feature_mappings[] =
+{
+ {HB_TAG ('a','f','r','c'), HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS},
+ {HB_TAG ('c','2','p','c'), HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE},
+ {HB_TAG ('c','2','s','c'), HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE},
+ {HB_TAG ('c','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF},
+ {HB_TAG ('c','a','s','e'), HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF},
+ {HB_TAG ('c','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF},
+ {HB_TAG ('c','p','s','p'), HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF},
+ {HB_TAG ('c','s','w','h'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF},
+ {HB_TAG ('d','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF},
+ {HB_TAG ('e','x','p','t'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS, (hb_aat_layout_feature_selector_t) 16},
+ {HB_TAG ('f','r','a','c'), HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS},
+ {HB_TAG ('f','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT, (hb_aat_layout_feature_selector_t) 7},
+ {HB_TAG ('h','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7},
+ {HB_TAG ('h','i','s','t'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF},
+ {HB_TAG ('h','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF},
+ {HB_TAG ('h','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF},
+ {HB_TAG ('h','n','g','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION, HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION},
+ {HB_TAG ('h','o','j','o'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS, (hb_aat_layout_feature_selector_t) 16},
+ {HB_TAG ('h','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7},
+ {HB_TAG ('i','t','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN, HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF},
+ {HB_TAG ('j','p','0','4'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS, (hb_aat_layout_feature_selector_t) 16},
+ {HB_TAG ('j','p','7','8'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS, (hb_aat_layout_feature_selector_t) 16},
+ {HB_TAG ('j','p','8','3'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS, (hb_aat_layout_feature_selector_t) 16},
+ {HB_TAG ('j','p','9','0'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS, (hb_aat_layout_feature_selector_t) 16},
+ {HB_TAG ('l','i','g','a'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF},
+ {HB_TAG ('l','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS, (hb_aat_layout_feature_selector_t) 2},
+ {HB_TAG ('m','g','r','k'), HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS, HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF},
+ {HB_TAG ('n','l','c','k'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS, (hb_aat_layout_feature_selector_t) 16},
+ {HB_TAG ('o','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS, (hb_aat_layout_feature_selector_t) 2},
+ {HB_TAG ('o','r','d','n'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+ {HB_TAG ('p','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7},
+ {HB_TAG ('p','c','a','p'), HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE},
+ {HB_TAG ('p','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7},
+ {HB_TAG ('p','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS, (hb_aat_layout_feature_selector_t) 4},
+ {HB_TAG ('p','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7},
+ {HB_TAG ('q','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7},
+ {HB_TAG ('r','u','b','y'), HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA, HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF},
+ {HB_TAG ('s','i','n','f'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+ {HB_TAG ('s','m','c','p'), HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE},
+ {HB_TAG ('s','m','p','l'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS, (hb_aat_layout_feature_selector_t) 16},
+ {HB_TAG ('s','s','0','1'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF},
+ {HB_TAG ('s','s','0','2'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF},
+ {HB_TAG ('s','s','0','3'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF},
+ {HB_TAG ('s','s','0','4'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF},
+ {HB_TAG ('s','s','0','5'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF},
+ {HB_TAG ('s','s','0','6'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF},
+ {HB_TAG ('s','s','0','7'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF},
+ {HB_TAG ('s','s','0','8'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF},
+ {HB_TAG ('s','s','0','9'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF},
+ {HB_TAG ('s','s','1','0'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF},
+ {HB_TAG ('s','s','1','1'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF},
+ {HB_TAG ('s','s','1','2'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF},
+ {HB_TAG ('s','s','1','3'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF},
+ {HB_TAG ('s','s','1','4'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF},
+ {HB_TAG ('s','s','1','5'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF},
+ {HB_TAG ('s','s','1','6'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF},
+ {HB_TAG ('s','s','1','7'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF},
+ {HB_TAG ('s','s','1','8'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF},
+ {HB_TAG ('s','s','1','9'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF},
+ {HB_TAG ('s','s','2','0'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF},
+ {HB_TAG ('s','u','b','s'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+ {HB_TAG ('s','u','p','s'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+ {HB_TAG ('s','w','s','h'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF},
+ {HB_TAG ('t','i','t','l'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS},
+ {HB_TAG ('t','n','a','m'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS, (hb_aat_layout_feature_selector_t) 16},
+ {HB_TAG ('t','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS, (hb_aat_layout_feature_selector_t) 4},
+ {HB_TAG ('t','r','a','d'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS, (hb_aat_layout_feature_selector_t) 16},
+ {HB_TAG ('t','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7},
+ {HB_TAG ('u','n','i','c'), HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE, (hb_aat_layout_feature_selector_t) 14, (hb_aat_layout_feature_selector_t) 15},
+ {HB_TAG ('v','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7},
+ {HB_TAG ('v','e','r','t'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF},
+ {HB_TAG ('v','h','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7},
+ {HB_TAG ('v','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF},
+ {HB_TAG ('v','p','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7},
+ {HB_TAG ('v','r','t','2'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF},
+ {HB_TAG ('z','e','r','o'), HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS, HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF},
+};
+
+const hb_aat_feature_mapping_t *
+hb_aat_layout_find_feature_mapping (hb_tag_t tag)
+{
+ return (const hb_aat_feature_mapping_t *) hb_bsearch (&tag,
+ feature_mappings,
+ ARRAY_LENGTH (feature_mappings),
+ sizeof (feature_mappings[0]),
+ hb_aat_feature_mapping_t::cmp);
+}
+#endif
+
+
+#ifndef HB_NO_AAT
+
+/*
+ * mort/morx/kerx/trak
+ */
+
+
+void
+hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper,
+ hb_aat_map_t *map)
+{
+ const AAT::morx& morx = *mapper->face->table.morx;
+ if (morx.has_data ())
+ {
+ morx.compile_flags (mapper, map);
+ return;
+ }
+
+ const AAT::mort& mort = *mapper->face->table.mort;
+ if (mort.has_data ())
+ {
+ mort.compile_flags (mapper, map);
+ return;
+ }
+}
+
+
+/*
+ * hb_aat_layout_has_substitution:
+ * @face:
+ *
+ * Returns:
+ * Since: 2.3.0
+ */
+hb_bool_t
+hb_aat_layout_has_substitution (hb_face_t *face)
+{
+ return face->table.morx->has_data () ||
+ face->table.mort->has_data ();
+}
+
+void
+hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
+{
+ hb_blob_t *morx_blob = font->face->table.morx.get_blob ();
+ const AAT::morx& morx = *morx_blob->as<AAT::morx> ();
+ if (morx.has_data ())
+ {
+ AAT::hb_aat_apply_context_t c (plan, font, buffer, morx_blob);
+ morx.apply (&c);
+ return;
+ }
+
+ hb_blob_t *mort_blob = font->face->table.mort.get_blob ();
+ const AAT::mort& mort = *mort_blob->as<AAT::mort> ();
+ if (mort.has_data ())
+ {
+ AAT::hb_aat_apply_context_t c (plan, font, buffer, mort_blob);
+ mort.apply (&c);
+ return;
+ }
+}
+
+void
+hb_aat_layout_zero_width_deleted_glyphs (hb_buffer_t *buffer)
+{
+ unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
+ hb_glyph_position_t *pos = buffer->pos;
+ for (unsigned int i = 0; i < count; i++)
+ if (unlikely (info[i].codepoint == AAT::DELETED_GLYPH))
+ pos[i].x_advance = pos[i].y_advance = pos[i].x_offset = pos[i].y_offset = 0;
+}
+
+static bool
+is_deleted_glyph (const hb_glyph_info_t *info)
+{
+ return info->codepoint == AAT::DELETED_GLYPH;
+}
+
+void
+hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer)
+{
+ hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph);
+}
+
+/*
+ * hb_aat_layout_has_positioning:
+ * @face:
+ *
+ * Returns:
+ * Since: 2.3.0
+ */
+hb_bool_t
+hb_aat_layout_has_positioning (hb_face_t *face)
+{
+ return face->table.kerx->has_data ();
+}
+
+void
+hb_aat_layout_position (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
+{
+ hb_blob_t *kerx_blob = font->face->table.kerx.get_blob ();
+ const AAT::kerx& kerx = *kerx_blob->as<AAT::kerx> ();
+
+ AAT::hb_aat_apply_context_t c (plan, font, buffer, kerx_blob);
+ c.set_ankr_table (font->face->table.ankr.get ());
+ kerx.apply (&c);
+}
+
+
+/*
+ * hb_aat_layout_has_tracking:
+ * @face:
+ *
+ * Returns:
+ * Since: 2.3.0
+ */
+hb_bool_t
+hb_aat_layout_has_tracking (hb_face_t *face)
+{
+ return face->table.trak->has_data ();
+}
+
+void
+hb_aat_layout_track (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
+{
+ const AAT::trak& trak = *font->face->table.trak;
+
+ AAT::hb_aat_apply_context_t c (plan, font, buffer);
+ trak.apply (&c);
+}
+
+/**
+ * hb_aat_layout_get_feature_types:
+ * @face: a face object
+ * @start_offset: iteration's start offset
+ * @feature_count:(inout) (allow-none): buffer size as input, filled size as output
+ * @features: (out caller-allocates) (array length=feature_count): features buffer
+ *
+ * Return value: Number of all available feature types.
+ *
+ * Since: 2.2.0
+ */
+unsigned int
+hb_aat_layout_get_feature_types (hb_face_t *face,
+ unsigned int start_offset,
+ unsigned int *feature_count, /* IN/OUT. May be NULL. */
+ hb_aat_layout_feature_type_t *features /* OUT. May be NULL. */)
+{
+ return face->table.feat->get_feature_types (start_offset, feature_count, features);
+}
+
+/**
+ * hb_aat_layout_feature_type_get_name_id:
+ * @face: a face object
+ * @feature_type: feature id
+ *
+ * Return value: Name ID index
+ *
+ * Since: 2.2.0
+ */
+hb_ot_name_id_t
+hb_aat_layout_feature_type_get_name_id (hb_face_t *face,
+ hb_aat_layout_feature_type_t feature_type)
+{
+ return face->table.feat->get_feature_name_id (feature_type);
+}
+
+/**
+ * hb_aat_layout_feature_type_get_selectors:
+ * @face: a face object
+ * @feature_type: feature id
+ * @start_offset: iteration's start offset
+ * @selector_count: (inout) (allow-none): buffer size as input, filled size as output
+ * @selectors: (out caller-allocates) (array length=selector_count): settings buffer
+ * @default_index: (out) (allow-none): index of default selector if any
+ *
+ * If upon return, @default_index is set to #HB_AAT_LAYOUT_NO_SELECTOR_INDEX, then
+ * the feature type is non-exclusive. Otherwise, @default_index is the index of
+ * the selector that is selected by default.
+ *
+ * Return value: Number of all available feature selectors.
+ *
+ * Since: 2.2.0
+ */
+unsigned int
+hb_aat_layout_feature_type_get_selector_infos (hb_face_t *face,
+ hb_aat_layout_feature_type_t feature_type,
+ unsigned int start_offset,
+ unsigned int *selector_count, /* IN/OUT. May be NULL. */
+ hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */
+ unsigned int *default_index /* OUT. May be NULL. */)
+{
+ return face->table.feat->get_selector_infos (feature_type, start_offset, selector_count, selectors, default_index);
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.h b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.h
new file mode 100644
index 0000000000..b617e8b703
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.h
@@ -0,0 +1,486 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_AAT_H_IN
+#error "Include <hb-aat.h> instead."
+#endif
+
+#ifndef HB_AAT_LAYOUT_H
+#define HB_AAT_LAYOUT_H
+
+#include "hb.h"
+
+#include "hb-ot.h"
+
+HB_BEGIN_DECLS
+
+/**
+ * hb_aat_layout_feature_type_t:
+ *
+ *
+ * Since: 2.2.0
+ */
+typedef enum
+{
+ HB_AAT_LAYOUT_FEATURE_TYPE_INVALID = 0xFFFF,
+
+ HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC = 0,
+ HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES = 1,
+ HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION = 2,
+ HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE = 3,
+ HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION = 4,
+ HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT = 5,
+ HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING = 6,
+ HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE = 8,
+ HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE = 9,
+ HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION = 10,
+ HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS = 11,
+ HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE = 13,
+ HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS = 14,
+ HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS = 15,
+ HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE = 16,
+ HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES = 17,
+ HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE = 18,
+ HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS = 19,
+ HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE = 20,
+ HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE = 21,
+ HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING = 22,
+ HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION = 23,
+ HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE = 24,
+ HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE = 25,
+ HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE = 26,
+ HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE = 27,
+ HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA = 28,
+ HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE = 29,
+ HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE = 30,
+ HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE = 31,
+ HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN = 32,
+ HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT = 33,
+ HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA = 34,
+ HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES = 35,
+ HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES = 36,
+ HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE = 37,
+ HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE = 38,
+ HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE = 39,
+ HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE = 103,
+
+ _HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
+} hb_aat_layout_feature_type_t;
+
+/**
+ * hb_aat_layout_feature_selector_t:
+ *
+ *
+ * Since: 2.2.0
+ */
+typedef enum
+{
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID = 0xFFFF,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF = 1,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_OFF = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF = 5,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_ON = 6,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_OFF = 7,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_ON = 8,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_OFF = 9,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_ON = 10,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_OFF = 11,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_ON = 12,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_OFF = 13,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_ON = 14,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_OFF = 15,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_ON = 16,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_OFF = 17,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON = 18,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF = 19,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON = 20,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF = 21,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_UNCONNECTED = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PARTIALLY_CONNECTED = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CURSIVE = 2,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_AND_LOWER_CASE = 0, /* deprecated */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_CAPS = 1, /* deprecated */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_LOWER_CASE = 2, /* deprecated */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS = 3, /* deprecated */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS = 4, /* deprecated */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS_AND_SMALL_CAPS = 5, /* deprecated */
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF = 1,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_OFF = 1,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_NUMBERS = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_NUMBERS = 3,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_OFF = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_ON = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_OFF = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_ON = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_OFF = 5,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_ON = 6,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_OFF = 7,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_ON = 8,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_OFF = 9,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SHOW_DIACRITICS = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HIDE_DIACRITICS = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DECOMPOSE_DIACRITICS = 2,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS = 4,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS = 2,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_OFF = 1,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_OFF = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_ON = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_OFF = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF = 5,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_ON = 6,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_OFF = 7,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_ON = 8,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_OFF = 9,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_ON = 10,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_OFF = 11,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_OFF = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_ON = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_OFF = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_ON = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_OFF = 5,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_ON = 6,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_OFF = 7,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_ON = 8,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_OFF = 9,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON = 10,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF = 11,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ORNAMENTS = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DINGBATS = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PI_CHARACTERS = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_FLEURONS = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DECORATIVE_BORDERS = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_INTERNATIONAL_SYMBOLS = 5,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_MATH_SYMBOLS = 6,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ALTERNATES = 0,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL1 = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL2 = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL3 = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL4 = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL5 = 4,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DISPLAY_TEXT = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ENGRAVED_TEXT = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ILLUMINATED_CAPS = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_TALL_CAPS = 5,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_ONE = 5,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_TWO = 6,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_THREE = 7,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FOUR = 8,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FIVE = 9,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS = 10,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS = 11,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS = 12,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS = 13,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS = 14,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS = 1,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT = 5,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT = 6,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HIRAGANA_TO_KATAKANA = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_KATAKANA_TO_HIRAGANA = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_KANA_TO_ROMANIZATION = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_HIRAGANA = 5,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_KATAKANA = 6,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_ONE = 7,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_TWO = 8,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_THREE = 9,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ANNOTATION = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_BOX_ANNOTATION = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ROUNDED_BOX_ANNOTATION = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CIRCLE_ANNOTATION = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_CIRCLE_ANNOTATION = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PARENTHESIS_ANNOTATION = 5,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIOD_ANNOTATION = 6,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMAN_NUMERAL_ANNOTATION = 7,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAMOND_ANNOTATION = 8,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_BOX_ANNOTATION = 9,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_ROUNDED_BOX_ANNOTATION= 10,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_KANA = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_KANA = 1,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_IDEOGRAPHS = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_IDEOGRAPHS = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_IDEOGRAPHS = 2,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_OFF = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_ON = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_OFF = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_ON = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_OFF = 5,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_RUBY_KANA = 0, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF instead */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA = 1, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON instead */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF = 3,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_SYMBOL_ALTERNATIVES = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_ONE = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_TWO = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_THREE = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FOUR = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FIVE = 5,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_IDEOGRAPHIC_ALTERNATIVES = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_ONE = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_TWO = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_THREE = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FOUR = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FIVE = 5,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_CENTERED = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_HBASELINE = 1,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_ITALIC_ROMAN = 0, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF instead */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN = 1, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON instead */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF = 3,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF = 3,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF = 3,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLISTIC_ALTERNATES = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF = 5,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON = 6,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF = 7,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON = 8,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF = 9,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON = 10,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF = 11,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON = 12,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF = 13,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON = 14,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF = 15,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON = 16,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF = 17,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON = 18,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF = 19,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON = 20,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF = 21,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON = 22,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF = 23,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON = 24,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF = 25,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON = 26,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF = 27,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON = 28,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF = 29,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON = 30,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF = 31,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON = 32,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF = 33,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON = 34,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF = 35,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON = 36,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF = 37,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON = 38,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF = 39,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON = 40,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF = 41,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF = 3,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON = 4,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF= 5,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS = 2,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS = 2,
+
+ /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE */
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_CJK_ROMAN = 0,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN = 1,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN = 2,
+ HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN = 3,
+
+ _HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
+} hb_aat_layout_feature_selector_t;
+
+HB_EXTERN unsigned int
+hb_aat_layout_get_feature_types (hb_face_t *face,
+ unsigned int start_offset,
+ unsigned int *feature_count, /* IN/OUT. May be NULL. */
+ hb_aat_layout_feature_type_t *features /* OUT. May be NULL. */);
+
+HB_EXTERN hb_ot_name_id_t
+hb_aat_layout_feature_type_get_name_id (hb_face_t *face,
+ hb_aat_layout_feature_type_t feature_type);
+
+typedef struct hb_aat_layout_feature_selector_info_t
+{
+ hb_ot_name_id_t name_id;
+ hb_aat_layout_feature_selector_t enable;
+ hb_aat_layout_feature_selector_t disable;
+ /*< private >*/
+ unsigned int reserved;
+} hb_aat_layout_feature_selector_info_t;
+
+#define HB_AAT_LAYOUT_NO_SELECTOR_INDEX 0xFFFFu
+
+HB_EXTERN unsigned int
+hb_aat_layout_feature_type_get_selector_infos (hb_face_t *face,
+ hb_aat_layout_feature_type_t feature_type,
+ unsigned int start_offset,
+ unsigned int *selector_count, /* IN/OUT. May be NULL. */
+ hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */
+ unsigned int *default_index /* OUT. May be NULL. */);
+
+
+/*
+ * morx/mort
+ */
+
+HB_EXTERN hb_bool_t
+hb_aat_layout_has_substitution (hb_face_t *face);
+
+
+/*
+ * kerx
+ */
+
+HB_EXTERN hb_bool_t
+hb_aat_layout_has_positioning (hb_face_t *face);
+
+
+/*
+ * trak
+ */
+
+HB_EXTERN hb_bool_t
+hb_aat_layout_has_tracking (hb_face_t *face);
+
+
+HB_END_DECLS
+
+#endif /* HB_AAT_LAYOUT_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.hh
new file mode 100644
index 0000000000..8310bfcc2d
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.hh
@@ -0,0 +1,81 @@
+/*
+ * Copyright © 2017 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_AAT_LAYOUT_HH
+#define HB_AAT_LAYOUT_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape.hh"
+#include "hb-aat-ltag-table.hh"
+
+struct hb_aat_feature_mapping_t
+{
+ hb_tag_t otFeatureTag;
+ hb_aat_layout_feature_type_t aatFeatureType;
+ hb_aat_layout_feature_selector_t selectorToEnable;
+ hb_aat_layout_feature_selector_t selectorToDisable;
+
+ HB_INTERNAL static int cmp (const void *key_, const void *entry_)
+ {
+ hb_tag_t key = * (unsigned int *) key_;
+ const hb_aat_feature_mapping_t * entry = (const hb_aat_feature_mapping_t *) entry_;
+ return key < entry->otFeatureTag ? -1 :
+ key > entry->otFeatureTag ? 1 :
+ 0;
+ }
+};
+
+HB_INTERNAL const hb_aat_feature_mapping_t *
+hb_aat_layout_find_feature_mapping (hb_tag_t tag);
+
+HB_INTERNAL void
+hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper,
+ hb_aat_map_t *map);
+
+HB_INTERNAL void
+hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
+HB_INTERNAL void
+hb_aat_layout_zero_width_deleted_glyphs (hb_buffer_t *buffer);
+
+HB_INTERNAL void
+hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer);
+
+HB_INTERNAL void
+hb_aat_layout_position (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
+HB_INTERNAL void
+hb_aat_layout_track (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
+
+#endif /* HB_AAT_LAYOUT_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-ltag-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-ltag-table.hh
new file mode 100644
index 0000000000..711f9aa6c1
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-ltag-table.hh
@@ -0,0 +1,92 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_AAT_LTAG_TABLE_HH
+#define HB_AAT_LTAG_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * ltag -- Language Tag
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6ltag.html
+ */
+#define HB_AAT_TAG_ltag HB_TAG('l','t','a','g')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+struct FTStringRange
+{
+ friend struct ltag;
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && (base+tag).sanitize (c, length));
+ }
+
+ protected:
+ NNOffsetTo<UnsizedArrayOf<HBUINT8>>
+ tag; /* Offset from the start of the table to
+ * the beginning of the string */
+ HBUINT16 length; /* String length (in bytes) */
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+struct ltag
+{
+ static constexpr hb_tag_t tableTag = HB_AAT_TAG_ltag;
+
+ hb_language_t get_language (unsigned int i) const
+ {
+ const FTStringRange &range = tagRanges[i];
+ return hb_language_from_string ((const char *) (this+range.tag).arrayZ,
+ range.length);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ version >= 1 &&
+ tagRanges.sanitize (c, this)));
+ }
+
+ protected:
+ HBUINT32 version; /* Table version; currently 1 */
+ HBUINT32 flags; /* Table flags; currently none defined */
+ LArrayOf<FTStringRange>
+ tagRanges; /* Range for each tag's string */
+ public:
+ DEFINE_SIZE_ARRAY (12, tagRanges);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LTAG_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-map.cc b/src/3rdparty/harfbuzz-ng/src/hb-aat-map.cc
new file mode 100644
index 0000000000..bc879359aa
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-map.cc
@@ -0,0 +1,75 @@
+/*
+ * Copyright © 2009,2010 Red Hat, Inc.
+ * Copyright © 2010,2011,2013 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_AAT_SHAPE
+
+#include "hb-aat-map.hh"
+
+#include "hb-aat-layout.hh"
+
+
+void hb_aat_map_builder_t::add_feature (hb_tag_t tag,
+ unsigned int value)
+{
+ if (tag == HB_TAG ('a','a','l','t'))
+ {
+ feature_info_t *info = features.push();
+ info->type = HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES;
+ info->setting = (hb_aat_layout_feature_selector_t) value;
+ return;
+ }
+
+ const hb_aat_feature_mapping_t *mapping = hb_aat_layout_find_feature_mapping (tag);
+ if (!mapping) return;
+
+ feature_info_t *info = features.push();
+ info->type = mapping->aatFeatureType;
+ info->setting = value ? mapping->selectorToEnable : mapping->selectorToDisable;
+}
+
+void
+hb_aat_map_builder_t::compile (hb_aat_map_t &m)
+{
+ /* Sort features and merge duplicates */
+ if (features.length)
+ {
+ features.qsort ();
+ unsigned int j = 0;
+ for (unsigned int i = 1; i < features.length; i++)
+ if (features[i].type != features[j].type)
+ features[++j] = features[i];
+ features.shrink (j + 1);
+ }
+
+ hb_aat_layout_compile_map (this, &m);
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-map.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-map.hh
new file mode 100644
index 0000000000..984a59cca5
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-map.hh
@@ -0,0 +1,91 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_AAT_MAP_HH
+#define HB_AAT_MAP_HH
+
+#include "hb.hh"
+
+
+struct hb_aat_map_t
+{
+ friend struct hb_aat_map_builder_t;
+
+ public:
+
+ void init ()
+ {
+ memset (this, 0, sizeof (*this));
+ chain_flags.init ();
+ }
+ void fini () { chain_flags.fini (); }
+
+ public:
+ hb_vector_t<hb_mask_t> chain_flags;
+};
+
+struct hb_aat_map_builder_t
+{
+ public:
+
+ HB_INTERNAL hb_aat_map_builder_t (hb_face_t *face_,
+ const hb_segment_properties_t *props_ HB_UNUSED) :
+ face (face_) {}
+
+ HB_INTERNAL void add_feature (hb_tag_t tag, unsigned int value=1);
+
+ HB_INTERNAL void compile (hb_aat_map_t &m);
+
+ public:
+ struct feature_info_t
+ {
+ hb_aat_layout_feature_type_t type;
+ hb_aat_layout_feature_selector_t setting;
+ unsigned seq; /* For stable sorting only. */
+
+ HB_INTERNAL static int cmp (const void *pa, const void *pb)
+ {
+ const feature_info_t *a = (const feature_info_t *) pa;
+ const feature_info_t *b = (const feature_info_t *) pb;
+ return (a->type != b->type) ? (a->type < b->type ? -1 : 1) :
+ (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
+ }
+
+ int cmp (hb_aat_layout_feature_type_t ty) const
+ {
+ return (type != ty) ? (type < ty ? -1 : 1) : 0;
+ }
+ };
+
+ public:
+ hb_face_t *face;
+
+ public:
+ hb_sorted_vector_t<feature_info_t> features;
+};
+
+
+#endif /* HB_AAT_MAP_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat.h b/src/3rdparty/harfbuzz-ng/src/hb-aat.h
new file mode 100644
index 0000000000..c14313d1e2
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-aat.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_AAT_H
+#define HB_AAT_H
+#define HB_AAT_H_IN
+
+#include "hb.h"
+
+#include "hb-aat-layout.h"
+
+HB_BEGIN_DECLS
+
+HB_END_DECLS
+
+#undef HB_AAT_H_IN
+#endif /* HB_AAT_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-algs.hh b/src/3rdparty/harfbuzz-ng/src/hb-algs.hh
new file mode 100644
index 0000000000..042e1c20d5
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-algs.hh
@@ -0,0 +1,1059 @@
+/*
+ * Copyright © 2017 Google, Inc.
+ * Copyright © 2019 Facebook, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ * Facebook Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_ALGS_HH
+#define HB_ALGS_HH
+
+#include "hb.hh"
+#include "hb-meta.hh"
+#include "hb-null.hh"
+#include "hb-number.hh"
+
+
+/* Encodes three unsigned integers in one 64-bit number. If the inputs have more than 21 bits,
+ * values will be truncated / overlap, and might not decode exactly. */
+#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
+#define HB_CODEPOINT_DECODE3_1(v) ((hb_codepoint_t) ((v) >> 42))
+#define HB_CODEPOINT_DECODE3_2(v) ((hb_codepoint_t) ((v) >> 21) & 0x1FFFFFu)
+#define HB_CODEPOINT_DECODE3_3(v) ((hb_codepoint_t) (v) & 0x1FFFFFu)
+
+/* Custom encoding used by hb-ucd. */
+#define HB_CODEPOINT_ENCODE3_11_7_14(x,y,z) (((uint32_t) ((x) & 0x07FFu) << 21) | (((uint32_t) (y) & 0x007Fu) << 14) | (uint32_t) ((z) & 0x3FFFu))
+#define HB_CODEPOINT_DECODE3_11_7_14_1(v) ((hb_codepoint_t) ((v) >> 21))
+#define HB_CODEPOINT_DECODE3_11_7_14_2(v) ((hb_codepoint_t) (((v) >> 14) & 0x007Fu) | 0x0300)
+#define HB_CODEPOINT_DECODE3_11_7_14_3(v) ((hb_codepoint_t) (v) & 0x3FFFu)
+
+struct
+{
+ /* Note. This is dangerous in that if it's passed an rvalue, it returns rvalue-reference. */
+ template <typename T> constexpr auto
+ operator () (T&& v) const HB_AUTO_RETURN ( hb_forward<T> (v) )
+}
+HB_FUNCOBJ (hb_identity);
+struct
+{
+ /* Like identity(), but only retains lvalue-references. Rvalues are returned as rvalues. */
+ template <typename T> constexpr T&
+ operator () (T& v) const { return v; }
+
+ template <typename T> constexpr hb_remove_reference<T>
+ operator () (T&& v) const { return v; }
+}
+HB_FUNCOBJ (hb_lidentity);
+struct
+{
+ /* Like identity(), but always returns rvalue. */
+ template <typename T> constexpr hb_remove_reference<T>
+ operator () (T&& v) const { return v; }
+}
+HB_FUNCOBJ (hb_ridentity);
+
+struct
+{
+ template <typename T> constexpr bool
+ operator () (T&& v) const { return bool (hb_forward<T> (v)); }
+}
+HB_FUNCOBJ (hb_bool);
+
+struct
+{
+ private:
+
+ template <typename T> constexpr auto
+ impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref (v).hash ())
+
+ template <typename T,
+ hb_enable_if (hb_is_integral (T))> constexpr auto
+ impl (const T& v, hb_priority<0>) const HB_AUTO_RETURN
+ (
+ /* Knuth's multiplicative method: */
+ (uint32_t) v * 2654435761u
+ )
+
+ public:
+
+ template <typename T> constexpr auto
+ operator () (const T& v) const HB_RETURN (uint32_t, impl (v, hb_prioritize))
+}
+HB_FUNCOBJ (hb_hash);
+
+
+struct
+{
+ private:
+
+ /* Pointer-to-member-function. */
+ template <typename Appl, typename T, typename ...Ts> auto
+ impl (Appl&& a, hb_priority<2>, T &&v, Ts&&... ds) const HB_AUTO_RETURN
+ ((hb_deref (hb_forward<T> (v)).*hb_forward<Appl> (a)) (hb_forward<Ts> (ds)...))
+
+ /* Pointer-to-member. */
+ template <typename Appl, typename T> auto
+ impl (Appl&& a, hb_priority<1>, T &&v) const HB_AUTO_RETURN
+ ((hb_deref (hb_forward<T> (v))).*hb_forward<Appl> (a))
+
+ /* Operator(). */
+ template <typename Appl, typename ...Ts> auto
+ impl (Appl&& a, hb_priority<0>, Ts&&... ds) const HB_AUTO_RETURN
+ (hb_deref (hb_forward<Appl> (a)) (hb_forward<Ts> (ds)...))
+
+ public:
+
+ template <typename Appl, typename ...Ts> auto
+ operator () (Appl&& a, Ts&&... ds) const HB_AUTO_RETURN
+ (
+ impl (hb_forward<Appl> (a),
+ hb_prioritize,
+ hb_forward<Ts> (ds)...)
+ )
+}
+HB_FUNCOBJ (hb_invoke);
+
+template <unsigned Pos, typename Appl, typename V>
+struct hb_partial_t
+{
+ hb_partial_t (Appl a, V v) : a (a), v (v) {}
+
+ static_assert (Pos > 0, "");
+
+ template <typename ...Ts,
+ unsigned P = Pos,
+ hb_enable_if (P == 1)> auto
+ operator () (Ts&& ...ds) -> decltype (hb_invoke (hb_declval (Appl),
+ hb_declval (V),
+ hb_declval (Ts)...))
+ {
+ return hb_invoke (hb_forward<Appl> (a),
+ hb_forward<V> (v),
+ hb_forward<Ts> (ds)...);
+ }
+ template <typename T0, typename ...Ts,
+ unsigned P = Pos,
+ hb_enable_if (P == 2)> auto
+ operator () (T0&& d0, Ts&& ...ds) -> decltype (hb_invoke (hb_declval (Appl),
+ hb_declval (T0),
+ hb_declval (V),
+ hb_declval (Ts)...))
+ {
+ return hb_invoke (hb_forward<Appl> (a),
+ hb_forward<T0> (d0),
+ hb_forward<V> (v),
+ hb_forward<Ts> (ds)...);
+ }
+
+ private:
+ hb_reference_wrapper<Appl> a;
+ V v;
+};
+template <unsigned Pos=1, typename Appl, typename V>
+auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN
+(( hb_partial_t<Pos, Appl, V> (a, v) ))
+
+/* The following, HB_PARTIALIZE, macro uses a particular corner-case
+ * of C++11 that is not particularly well-supported by all compilers.
+ * What's happening is that it's using "this" in a trailing return-type
+ * via decltype(). Broken compilers deduce the type of "this" pointer
+ * in that context differently from what it resolves to in the body
+ * of the function.
+ *
+ * One probable cause of this is that at the time of trailing return
+ * type declaration, "this" points to an incomplete type, whereas in
+ * the function body the type is complete. That doesn't justify the
+ * error in any way, but is probably what's happening.
+ *
+ * In the case of MSVC, we get around this by using C++14 "decltype(auto)"
+ * which deduces the type from the actual return statement. For gcc 4.8
+ * we use "+this" instead of "this" which produces an rvalue that seems
+ * to be deduced as the same type with this particular compiler, and seem
+ * to be fine as default code path as well.
+ */
+#ifdef _MSC_VER
+/* https://github.com/harfbuzz/harfbuzz/issues/1730 */ \
+#define HB_PARTIALIZE(Pos) \
+ template <typename _T> \
+ decltype(auto) operator () (_T&& _v) const \
+ { return hb_partial<Pos> (this, hb_forward<_T> (_v)); } \
+ static_assert (true, "")
+#else
+/* https://github.com/harfbuzz/harfbuzz/issues/1724 */
+#define HB_PARTIALIZE(Pos) \
+ template <typename _T> \
+ auto operator () (_T&& _v) const HB_AUTO_RETURN \
+ (hb_partial<Pos> (+this, hb_forward<_T> (_v))) \
+ static_assert (true, "")
+#endif
+
+
+struct
+{
+ private:
+
+ template <typename Pred, typename Val> auto
+ impl (Pred&& p, Val &&v, hb_priority<1>) const HB_AUTO_RETURN
+ (hb_deref (hb_forward<Pred> (p)).has (hb_forward<Val> (v)))
+
+ template <typename Pred, typename Val> auto
+ impl (Pred&& p, Val &&v, hb_priority<0>) const HB_AUTO_RETURN
+ (
+ hb_invoke (hb_forward<Pred> (p),
+ hb_forward<Val> (v))
+ )
+
+ public:
+
+ template <typename Pred, typename Val> auto
+ operator () (Pred&& p, Val &&v) const HB_RETURN (bool,
+ impl (hb_forward<Pred> (p),
+ hb_forward<Val> (v),
+ hb_prioritize)
+ )
+}
+HB_FUNCOBJ (hb_has);
+
+struct
+{
+ private:
+
+ template <typename Pred, typename Val> auto
+ impl (Pred&& p, Val &&v, hb_priority<1>) const HB_AUTO_RETURN
+ (
+ hb_has (hb_forward<Pred> (p),
+ hb_forward<Val> (v))
+ )
+
+ template <typename Pred, typename Val> auto
+ impl (Pred&& p, Val &&v, hb_priority<0>) const HB_AUTO_RETURN
+ (
+ hb_forward<Pred> (p) == hb_forward<Val> (v)
+ )
+
+ public:
+
+ template <typename Pred, typename Val> auto
+ operator () (Pred&& p, Val &&v) const HB_RETURN (bool,
+ impl (hb_forward<Pred> (p),
+ hb_forward<Val> (v),
+ hb_prioritize)
+ )
+}
+HB_FUNCOBJ (hb_match);
+
+struct
+{
+ private:
+
+ template <typename Proj, typename Val> auto
+ impl (Proj&& f, Val &&v, hb_priority<2>) const HB_AUTO_RETURN
+ (hb_deref (hb_forward<Proj> (f)).get (hb_forward<Val> (v)))
+
+ template <typename Proj, typename Val> auto
+ impl (Proj&& f, Val &&v, hb_priority<1>) const HB_AUTO_RETURN
+ (
+ hb_invoke (hb_forward<Proj> (f),
+ hb_forward<Val> (v))
+ )
+
+ template <typename Proj, typename Val> auto
+ impl (Proj&& f, Val &&v, hb_priority<0>) const HB_AUTO_RETURN
+ (
+ hb_forward<Proj> (f)[hb_forward<Val> (v)]
+ )
+
+ public:
+
+ template <typename Proj, typename Val> auto
+ operator () (Proj&& f, Val &&v) const HB_AUTO_RETURN
+ (
+ impl (hb_forward<Proj> (f),
+ hb_forward<Val> (v),
+ hb_prioritize)
+ )
+}
+HB_FUNCOBJ (hb_get);
+
+
+template <typename T1, typename T2>
+struct hb_pair_t
+{
+ typedef T1 first_t;
+ typedef T2 second_t;
+ typedef hb_pair_t<T1, T2> pair_t;
+
+ hb_pair_t (T1 a, T2 b) : first (a), second (b) {}
+
+ template <typename Q1, typename Q2,
+ hb_enable_if (hb_is_convertible (T1, Q1) &&
+ hb_is_convertible (T2, T2))>
+ operator hb_pair_t<Q1, Q2> () { return hb_pair_t<Q1, Q2> (first, second); }
+
+ hb_pair_t<T1, T2> reverse () const
+ { return hb_pair_t<T1, T2> (second, first); }
+
+ bool operator == (const pair_t& o) const { return first == o.first && second == o.second; }
+ bool operator != (const pair_t& o) const { return !(*this == o); }
+ bool operator < (const pair_t& o) const { return first < o.first || (first == o.first && second < o.second); }
+ bool operator >= (const pair_t& o) const { return !(*this < o); }
+ bool operator > (const pair_t& o) const { return first > o.first || (first == o.first && second > o.second); }
+ bool operator <= (const pair_t& o) const { return !(*this > o); }
+
+ T1 first;
+ T2 second;
+};
+#define hb_pair_t(T1,T2) hb_pair_t<T1, T2>
+template <typename T1, typename T2> static inline hb_pair_t<T1, T2>
+hb_pair (T1&& a, T2&& b) { return hb_pair_t<T1, T2> (a, b); }
+
+struct
+{
+ template <typename Pair> constexpr typename Pair::first_t
+ operator () (const Pair& pair) const { return pair.first; }
+}
+HB_FUNCOBJ (hb_first);
+
+struct
+{
+ template <typename Pair> constexpr typename Pair::second_t
+ operator () (const Pair& pair) const { return pair.second; }
+}
+HB_FUNCOBJ (hb_second);
+
+/* Note. In min/max impl, we can use hb_type_identity<T> for second argument.
+ * However, that would silently convert between different-signedness integers.
+ * Instead we accept two different types, such that compiler can err if
+ * comparing integers of different signedness. */
+struct
+{
+ template <typename T, typename T2> constexpr auto
+ operator () (T&& a, T2&& b) const HB_AUTO_RETURN
+ (hb_forward<T> (a) <= hb_forward<T2> (b) ? hb_forward<T> (a) : hb_forward<T2> (b))
+}
+HB_FUNCOBJ (hb_min);
+struct
+{
+ template <typename T, typename T2> constexpr auto
+ operator () (T&& a, T2&& b) const HB_AUTO_RETURN
+ (hb_forward<T> (a) >= hb_forward<T2> (b) ? hb_forward<T> (a) : hb_forward<T2> (b))
+}
+HB_FUNCOBJ (hb_max);
+
+
+/*
+ * Bithacks.
+ */
+
+/* Return the number of 1 bits in v. */
+template <typename T>
+static inline HB_CONST_FUNC unsigned int
+hb_popcount (T v)
+{
+#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
+ if (sizeof (T) <= sizeof (unsigned int))
+ return __builtin_popcount (v);
+
+ if (sizeof (T) <= sizeof (unsigned long))
+ return __builtin_popcountl (v);
+
+ if (sizeof (T) <= sizeof (unsigned long long))
+ return __builtin_popcountll (v);
+#endif
+
+ if (sizeof (T) <= 4)
+ {
+ /* "HACKMEM 169" */
+ uint32_t y;
+ y = (v >> 1) &033333333333;
+ y = v - y - ((y >>1) & 033333333333);
+ return (((y + (y >> 3)) & 030707070707) % 077);
+ }
+
+ if (sizeof (T) == 8)
+ {
+ unsigned int shift = 32;
+ return hb_popcount<uint32_t> ((uint32_t) v) + hb_popcount ((uint32_t) (v >> shift));
+ }
+
+ if (sizeof (T) == 16)
+ {
+ unsigned int shift = 64;
+ return hb_popcount<uint64_t> ((uint64_t) v) + hb_popcount ((uint64_t) (v >> shift));
+ }
+
+ assert (0);
+ return 0; /* Shut up stupid compiler. */
+}
+
+/* Returns the number of bits needed to store number */
+template <typename T>
+static inline HB_CONST_FUNC unsigned int
+hb_bit_storage (T v)
+{
+ if (unlikely (!v)) return 0;
+
+#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
+ if (sizeof (T) <= sizeof (unsigned int))
+ return sizeof (unsigned int) * 8 - __builtin_clz (v);
+
+ if (sizeof (T) <= sizeof (unsigned long))
+ return sizeof (unsigned long) * 8 - __builtin_clzl (v);
+
+ if (sizeof (T) <= sizeof (unsigned long long))
+ return sizeof (unsigned long long) * 8 - __builtin_clzll (v);
+#endif
+
+#if (defined(_MSC_VER) && _MSC_VER >= 1500) || (defined(__MINGW32__) && (__GNUC__ < 4))
+ if (sizeof (T) <= sizeof (unsigned int))
+ {
+ unsigned long where;
+ _BitScanReverse (&where, v);
+ return 1 + where;
+ }
+# if defined(_WIN64)
+ if (sizeof (T) <= 8)
+ {
+ unsigned long where;
+ _BitScanReverse64 (&where, v);
+ return 1 + where;
+ }
+# endif
+#endif
+
+ if (sizeof (T) <= 4)
+ {
+ /* "bithacks" */
+ const unsigned int b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
+ const unsigned int S[] = {1, 2, 4, 8, 16};
+ unsigned int r = 0;
+ for (int i = 4; i >= 0; i--)
+ if (v & b[i])
+ {
+ v >>= S[i];
+ r |= S[i];
+ }
+ return r + 1;
+ }
+ if (sizeof (T) <= 8)
+ {
+ /* "bithacks" */
+ const uint64_t b[] = {0x2ULL, 0xCULL, 0xF0ULL, 0xFF00ULL, 0xFFFF0000ULL, 0xFFFFFFFF00000000ULL};
+ const unsigned int S[] = {1, 2, 4, 8, 16, 32};
+ unsigned int r = 0;
+ for (int i = 5; i >= 0; i--)
+ if (v & b[i])
+ {
+ v >>= S[i];
+ r |= S[i];
+ }
+ return r + 1;
+ }
+ if (sizeof (T) == 16)
+ {
+ unsigned int shift = 64;
+ return (v >> shift) ? hb_bit_storage<uint64_t> ((uint64_t) (v >> shift)) + shift :
+ hb_bit_storage<uint64_t> ((uint64_t) v);
+ }
+
+ assert (0);
+ return 0; /* Shut up stupid compiler. */
+}
+
+/* Returns the number of zero bits in the least significant side of v */
+template <typename T>
+static inline HB_CONST_FUNC unsigned int
+hb_ctz (T v)
+{
+ if (unlikely (!v)) return 0;
+
+#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
+ if (sizeof (T) <= sizeof (unsigned int))
+ return __builtin_ctz (v);
+
+ if (sizeof (T) <= sizeof (unsigned long))
+ return __builtin_ctzl (v);
+
+ if (sizeof (T) <= sizeof (unsigned long long))
+ return __builtin_ctzll (v);
+#endif
+
+#if (defined(_MSC_VER) && _MSC_VER >= 1500) || (defined(__MINGW32__) && (__GNUC__ < 4))
+ if (sizeof (T) <= sizeof (unsigned int))
+ {
+ unsigned long where;
+ _BitScanForward (&where, v);
+ return where;
+ }
+# if defined(_WIN64)
+ if (sizeof (T) <= 8)
+ {
+ unsigned long where;
+ _BitScanForward64 (&where, v);
+ return where;
+ }
+# endif
+#endif
+
+ if (sizeof (T) <= 4)
+ {
+ /* "bithacks" */
+ unsigned int c = 32;
+ v &= - (int32_t) v;
+ if (v) c--;
+ if (v & 0x0000FFFF) c -= 16;
+ if (v & 0x00FF00FF) c -= 8;
+ if (v & 0x0F0F0F0F) c -= 4;
+ if (v & 0x33333333) c -= 2;
+ if (v & 0x55555555) c -= 1;
+ return c;
+ }
+ if (sizeof (T) <= 8)
+ {
+ /* "bithacks" */
+ unsigned int c = 64;
+ v &= - (int64_t) (v);
+ if (v) c--;
+ if (v & 0x00000000FFFFFFFFULL) c -= 32;
+ if (v & 0x0000FFFF0000FFFFULL) c -= 16;
+ if (v & 0x00FF00FF00FF00FFULL) c -= 8;
+ if (v & 0x0F0F0F0F0F0F0F0FULL) c -= 4;
+ if (v & 0x3333333333333333ULL) c -= 2;
+ if (v & 0x5555555555555555ULL) c -= 1;
+ return c;
+ }
+ if (sizeof (T) == 16)
+ {
+ unsigned int shift = 64;
+ return (uint64_t) v ? hb_bit_storage<uint64_t> ((uint64_t) v) :
+ hb_bit_storage<uint64_t> ((uint64_t) (v >> shift)) + shift;
+ }
+
+ assert (0);
+ return 0; /* Shut up stupid compiler. */
+}
+
+
+/*
+ * Tiny stuff.
+ */
+
+/* ASCII tag/character handling */
+static inline bool ISALPHA (unsigned char c)
+{ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); }
+static inline bool ISALNUM (unsigned char c)
+{ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'); }
+static inline bool ISSPACE (unsigned char c)
+{ return c == ' ' || c =='\f'|| c =='\n'|| c =='\r'|| c =='\t'|| c =='\v'; }
+static inline unsigned char TOUPPER (unsigned char c)
+{ return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c; }
+static inline unsigned char TOLOWER (unsigned char c)
+{ return (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c; }
+
+static inline unsigned int DIV_CEIL (const unsigned int a, unsigned int b)
+{ return (a + (b - 1)) / b; }
+
+
+#undef ARRAY_LENGTH
+template <typename Type, unsigned int n>
+static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
+/* A const version, but does not detect erratically being called on pointers. */
+#define ARRAY_LENGTH_CONST(__array) ((signed int) (sizeof (__array) / sizeof (__array[0])))
+
+
+static inline int
+hb_memcmp (const void *a, const void *b, unsigned int len)
+{
+ /* It's illegal to pass NULL to memcmp(), even if len is zero.
+ * So, wrap it.
+ * https://sourceware.org/bugzilla/show_bug.cgi?id=23878 */
+ if (unlikely (!len)) return 0;
+ return memcmp (a, b, len);
+}
+
+static inline void *
+hb_memset (void *s, int c, unsigned int n)
+{
+ /* It's illegal to pass NULL to memset(), even if n is zero. */
+ if (unlikely (!n)) return 0;
+ return memset (s, c, n);
+}
+
+static inline bool
+hb_unsigned_mul_overflows (unsigned int count, unsigned int size)
+{
+ return (size > 0) && (count >= ((unsigned int) -1) / size);
+}
+
+static inline unsigned int
+hb_ceil_to_4 (unsigned int v)
+{
+ return ((v - 1) | 3) + 1;
+}
+
+template <typename T> static inline bool
+hb_in_range (T u, T lo, T hi)
+{
+ static_assert (!hb_is_signed<T>::value, "");
+
+ /* The casts below are important as if T is smaller than int,
+ * the subtract results will become a signed int! */
+ return (T)(u - lo) <= (T)(hi - lo);
+}
+template <typename T> static inline bool
+hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2)
+{
+ return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2);
+}
+template <typename T> static inline bool
+hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3)
+{
+ return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2) || hb_in_range (u, lo3, hi3);
+}
+
+
+/*
+ * Sort and search.
+ */
+template <typename ...Ts>
+static inline void *
+hb_bsearch (const void *key, const void *base,
+ size_t nmemb, size_t size,
+ int (*compar)(const void *_key, const void *_item, Ts... _ds),
+ Ts... ds)
+{
+ int min = 0, max = (int) nmemb - 1;
+ while (min <= max)
+ {
+ int mid = ((unsigned int) min + (unsigned int) max) / 2;
+ const void *p = (const void *) (((const char *) base) + (mid * size));
+ int c = compar (key, p, ds...);
+ if (c < 0)
+ max = mid - 1;
+ else if (c > 0)
+ min = mid + 1;
+ else
+ return (void *) p;
+ }
+ return nullptr;
+}
+
+
+/* From https://github.com/noporpoise/sort_r
+ Feb 5, 2019 (c8c65c1e)
+ Modified to support optional argument using templates */
+
+/* Isaac Turner 29 April 2014 Public Domain */
+
+/*
+hb_qsort function to be exported.
+Parameters:
+ base is the array to be sorted
+ nel is the number of elements in the array
+ width is the size in bytes of each element of the array
+ compar is the comparison function
+ arg (optional) is a pointer to be passed to the comparison function
+
+void hb_qsort(void *base, size_t nel, size_t width,
+ int (*compar)(const void *_a, const void *_b, [void *_arg]),
+ [void *arg]);
+*/
+
+#define SORT_R_SWAP(a,b,tmp) ((tmp) = (a), (a) = (b), (b) = (tmp))
+
+/* swap a and b */
+/* a and b must not be equal! */
+static inline void sort_r_swap(char *__restrict a, char *__restrict b,
+ size_t w)
+{
+ char tmp, *end = a+w;
+ for(; a < end; a++, b++) { SORT_R_SWAP(*a, *b, tmp); }
+}
+
+/* swap a, b iff a>b */
+/* a and b must not be equal! */
+/* __restrict is same as restrict but better support on old machines */
+template <typename ...Ts>
+static inline int sort_r_cmpswap(char *__restrict a,
+ char *__restrict b, size_t w,
+ int (*compar)(const void *_a,
+ const void *_b,
+ Ts... _ds),
+ Ts... ds)
+{
+ if(compar(a, b, ds...) > 0) {
+ sort_r_swap(a, b, w);
+ return 1;
+ }
+ return 0;
+}
+
+/*
+Swap consecutive blocks of bytes of size na and nb starting at memory addr ptr,
+with the smallest swap so that the blocks are in the opposite order. Blocks may
+be internally re-ordered e.g.
+ 12345ab -> ab34512
+ 123abc -> abc123
+ 12abcde -> deabc12
+*/
+static inline void sort_r_swap_blocks(char *ptr, size_t na, size_t nb)
+{
+ if(na > 0 && nb > 0) {
+ if(na > nb) { sort_r_swap(ptr, ptr+na, nb); }
+ else { sort_r_swap(ptr, ptr+nb, na); }
+ }
+}
+
+/* Implement recursive quicksort ourselves */
+/* Note: quicksort is not stable, equivalent values may be swapped */
+template <typename ...Ts>
+static inline void sort_r_simple(void *base, size_t nel, size_t w,
+ int (*compar)(const void *_a,
+ const void *_b,
+ Ts... _ds),
+ Ts... ds)
+{
+ char *b = (char *)base, *end = b + nel*w;
+
+ /* for(size_t i=0; i<nel; i++) {printf("%4i", *(int*)(b + i*sizeof(int)));}
+ printf("\n"); */
+
+ if(nel < 10) {
+ /* Insertion sort for arbitrarily small inputs */
+ char *pi, *pj;
+ for(pi = b+w; pi < end; pi += w) {
+ for(pj = pi; pj > b && sort_r_cmpswap(pj-w,pj,w,compar,ds...); pj -= w) {}
+ }
+ }
+ else
+ {
+ /* nel > 9; Quicksort */
+
+ int cmp;
+ char *pl, *ple, *pr, *pre, *pivot;
+ char *last = b+w*(nel-1), *tmp;
+
+ /*
+ Use median of second, middle and second-last items as pivot.
+ First and last may have been swapped with pivot and therefore be extreme
+ */
+ char *l[3];
+ l[0] = b + w;
+ l[1] = b+w*(nel/2);
+ l[2] = last - w;
+
+ /* printf("pivots: %i, %i, %i\n", *(int*)l[0], *(int*)l[1], *(int*)l[2]); */
+
+ if(compar(l[0],l[1],ds...) > 0) { SORT_R_SWAP(l[0], l[1], tmp); }
+ if(compar(l[1],l[2],ds...) > 0) {
+ SORT_R_SWAP(l[1], l[2], tmp);
+ if(compar(l[0],l[1],ds...) > 0) { SORT_R_SWAP(l[0], l[1], tmp); }
+ }
+
+ /* swap mid value (l[1]), and last element to put pivot as last element */
+ if(l[1] != last) { sort_r_swap(l[1], last, w); }
+
+ /*
+ pl is the next item on the left to be compared to the pivot
+ pr is the last item on the right that was compared to the pivot
+ ple is the left position to put the next item that equals the pivot
+ ple is the last right position where we put an item that equals the pivot
+ v- end (beyond the array)
+ EEEEEELLLLLLLLuuuuuuuuGGGGGGGEEEEEEEE.
+ ^- b ^- ple ^- pl ^- pr ^- pre ^- last (where the pivot is)
+ Pivot comparison key:
+ E = equal, L = less than, u = unknown, G = greater than, E = equal
+ */
+ pivot = last;
+ ple = pl = b;
+ pre = pr = last;
+
+ /*
+ Strategy:
+ Loop into the list from the left and right at the same time to find:
+ - an item on the left that is greater than the pivot
+ - an item on the right that is less than the pivot
+ Once found, they are swapped and the loop continues.
+ Meanwhile items that are equal to the pivot are moved to the edges of the
+ array.
+ */
+ while(pl < pr) {
+ /* Move left hand items which are equal to the pivot to the far left.
+ break when we find an item that is greater than the pivot */
+ for(; pl < pr; pl += w) {
+ cmp = compar(pl, pivot, ds...);
+ if(cmp > 0) { break; }
+ else if(cmp == 0) {
+ if(ple < pl) { sort_r_swap(ple, pl, w); }
+ ple += w;
+ }
+ }
+ /* break if last batch of left hand items were equal to pivot */
+ if(pl >= pr) { break; }
+ /* Move right hand items which are equal to the pivot to the far right.
+ break when we find an item that is less than the pivot */
+ for(; pl < pr; ) {
+ pr -= w; /* Move right pointer onto an unprocessed item */
+ cmp = compar(pr, pivot, ds...);
+ if(cmp == 0) {
+ pre -= w;
+ if(pr < pre) { sort_r_swap(pr, pre, w); }
+ }
+ else if(cmp < 0) {
+ if(pl < pr) { sort_r_swap(pl, pr, w); }
+ pl += w;
+ break;
+ }
+ }
+ }
+
+ pl = pr; /* pr may have gone below pl */
+
+ /*
+ Now we need to go from: EEELLLGGGGEEEE
+ to: LLLEEEEEEEGGGG
+ Pivot comparison key:
+ E = equal, L = less than, u = unknown, G = greater than, E = equal
+ */
+ sort_r_swap_blocks(b, ple-b, pl-ple);
+ sort_r_swap_blocks(pr, pre-pr, end-pre);
+
+ /*for(size_t i=0; i<nel; i++) {printf("%4i", *(int*)(b + i*sizeof(int)));}
+ printf("\n");*/
+
+ sort_r_simple(b, (pl-ple)/w, w, compar, ds...);
+ sort_r_simple(end-(pre-pr), (pre-pr)/w, w, compar, ds...);
+ }
+}
+
+static inline void
+hb_qsort (void *base, size_t nel, size_t width,
+ int (*compar)(const void *_a, const void *_b))
+{
+#if defined(__OPTIMIZE_SIZE__) && !defined(HB_USE_INTERNAL_QSORT)
+ qsort (base, nel, width, compar);
+#else
+ sort_r_simple (base, nel, width, compar);
+#endif
+}
+
+static inline void
+hb_qsort (void *base, size_t nel, size_t width,
+ int (*compar)(const void *_a, const void *_b, void *_arg),
+ void *arg)
+{
+#ifdef HAVE_GNU_QSORT_R
+ qsort_r (base, nel, width, compar, arg);
+#else
+ sort_r_simple (base, nel, width, compar, arg);
+#endif
+}
+
+
+template <typename T, typename T2, typename T3> static inline void
+hb_stable_sort (T *array, unsigned int len, int(*compar)(const T2 *, const T2 *), T3 *array2)
+{
+ for (unsigned int i = 1; i < len; i++)
+ {
+ unsigned int j = i;
+ while (j && compar (&array[j - 1], &array[i]) > 0)
+ j--;
+ if (i == j)
+ continue;
+ /* Move item i to occupy place for item j, shift what's in between. */
+ {
+ T t = array[i];
+ memmove (&array[j + 1], &array[j], (i - j) * sizeof (T));
+ array[j] = t;
+ }
+ if (array2)
+ {
+ T3 t = array2[i];
+ memmove (&array2[j + 1], &array2[j], (i - j) * sizeof (T3));
+ array2[j] = t;
+ }
+ }
+}
+
+template <typename T> static inline void
+hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *))
+{
+ hb_stable_sort (array, len, compar, (int *) nullptr);
+}
+
+static inline hb_bool_t
+hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *out)
+{
+ unsigned int v;
+ const char *p = s;
+ const char *end = p + len;
+ if (unlikely (!hb_parse_uint (&p, end, &v, true/* whole buffer */, base)))
+ return false;
+
+ *out = v;
+ return true;
+}
+
+
+/* Operators. */
+
+struct hb_bitwise_and
+{ HB_PARTIALIZE(2);
+ static constexpr bool passthru_left = false;
+ static constexpr bool passthru_right = false;
+ template <typename T> constexpr auto
+ operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b)
+}
+HB_FUNCOBJ (hb_bitwise_and);
+struct hb_bitwise_or
+{ HB_PARTIALIZE(2);
+ static constexpr bool passthru_left = true;
+ static constexpr bool passthru_right = true;
+ template <typename T> constexpr auto
+ operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b)
+}
+HB_FUNCOBJ (hb_bitwise_or);
+struct hb_bitwise_xor
+{ HB_PARTIALIZE(2);
+ static constexpr bool passthru_left = true;
+ static constexpr bool passthru_right = true;
+ template <typename T> constexpr auto
+ operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b)
+}
+HB_FUNCOBJ (hb_bitwise_xor);
+struct hb_bitwise_sub
+{ HB_PARTIALIZE(2);
+ static constexpr bool passthru_left = true;
+ static constexpr bool passthru_right = false;
+ template <typename T> constexpr auto
+ operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b)
+}
+HB_FUNCOBJ (hb_bitwise_sub);
+struct
+{
+ template <typename T> constexpr auto
+ operator () (const T &a) const HB_AUTO_RETURN (~a)
+}
+HB_FUNCOBJ (hb_bitwise_neg);
+
+struct
+{ HB_PARTIALIZE(2);
+ template <typename T, typename T2> constexpr auto
+ operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a + b)
+}
+HB_FUNCOBJ (hb_add);
+struct
+{ HB_PARTIALIZE(2);
+ template <typename T, typename T2> constexpr auto
+ operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a - b)
+}
+HB_FUNCOBJ (hb_sub);
+struct
+{ HB_PARTIALIZE(2);
+ template <typename T, typename T2> constexpr auto
+ operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a * b)
+}
+HB_FUNCOBJ (hb_mul);
+struct
+{ HB_PARTIALIZE(2);
+ template <typename T, typename T2> constexpr auto
+ operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a / b)
+}
+HB_FUNCOBJ (hb_div);
+struct
+{ HB_PARTIALIZE(2);
+ template <typename T, typename T2> constexpr auto
+ operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a % b)
+}
+HB_FUNCOBJ (hb_mod);
+struct
+{
+ template <typename T> constexpr auto
+ operator () (const T &a) const HB_AUTO_RETURN (+a)
+}
+HB_FUNCOBJ (hb_pos);
+struct
+{
+ template <typename T> constexpr auto
+ operator () (const T &a) const HB_AUTO_RETURN (-a)
+}
+HB_FUNCOBJ (hb_neg);
+struct
+{
+ template <typename T> constexpr auto
+ operator () (T &a) const HB_AUTO_RETURN (++a)
+}
+HB_FUNCOBJ (hb_inc);
+struct
+{
+ template <typename T> constexpr auto
+ operator () (T &a) const HB_AUTO_RETURN (--a)
+}
+HB_FUNCOBJ (hb_dec);
+
+
+/* Compiler-assisted vectorization. */
+
+/* Type behaving similar to vectorized vars defined using __attribute__((vector_size(...))),
+ * basically a fixed-size bitset. */
+template <typename elt_t, unsigned int byte_size>
+struct hb_vector_size_t
+{
+ elt_t& operator [] (unsigned int i) { return v[i]; }
+ const elt_t& operator [] (unsigned int i) const { return v[i]; }
+
+ void clear (unsigned char v = 0) { memset (this, v, sizeof (*this)); }
+
+ template <typename Op>
+ hb_vector_size_t process (const Op& op) const
+ {
+ hb_vector_size_t r;
+ for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
+ r.v[i] = op (v[i]);
+ return r;
+ }
+ template <typename Op>
+ hb_vector_size_t process (const Op& op, const hb_vector_size_t &o) const
+ {
+ hb_vector_size_t r;
+ for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
+ r.v[i] = op (v[i], o.v[i]);
+ return r;
+ }
+ hb_vector_size_t operator | (const hb_vector_size_t &o) const
+ { return process (hb_bitwise_or, o); }
+ hb_vector_size_t operator & (const hb_vector_size_t &o) const
+ { return process (hb_bitwise_and, o); }
+ hb_vector_size_t operator ^ (const hb_vector_size_t &o) const
+ { return process (hb_bitwise_xor, o); }
+ hb_vector_size_t operator ~ () const
+ { return process (hb_bitwise_neg); }
+
+ private:
+ static_assert (0 == byte_size % sizeof (elt_t), "");
+ elt_t v[byte_size / sizeof (elt_t)];
+};
+
+
+#endif /* HB_ALGS_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-array.hh b/src/3rdparty/harfbuzz-ng/src/hb-array.hh
new file mode 100644
index 0000000000..d9adf2c728
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-array.hh
@@ -0,0 +1,382 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_ARRAY_HH
+#define HB_ARRAY_HH
+
+#include "hb.hh"
+#include "hb-algs.hh"
+#include "hb-iter.hh"
+#include "hb-null.hh"
+
+
+template <typename Type>
+struct hb_sorted_array_t;
+
+template <typename Type>
+struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
+{
+ /*
+ * Constructors.
+ */
+ hb_array_t () : arrayZ (nullptr), length (0), backwards_length (0) {}
+ hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_), backwards_length (0) {}
+ template <unsigned int length_>
+ hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_), backwards_length (0) {}
+
+ template <typename U,
+ hb_enable_if (hb_is_cr_convertible(U, Type))>
+ hb_array_t (const hb_array_t<U> &o) :
+ hb_iter_with_fallback_t<hb_array_t, Type&> (),
+ arrayZ (o.arrayZ), length (o.length), backwards_length (o.backwards_length) {}
+ template <typename U,
+ hb_enable_if (hb_is_cr_convertible(U, Type))>
+ hb_array_t& operator = (const hb_array_t<U> &o)
+ { arrayZ = o.arrayZ; length = o.length; backwards_length = o.backwards_length; return *this; }
+
+ /*
+ * Iterator implementation.
+ */
+ typedef Type& __item_t__;
+ static constexpr bool is_random_access_iterator = true;
+ Type& __item_at__ (unsigned i) const
+ {
+ if (unlikely (i >= length)) return CrapOrNull (Type);
+ return arrayZ[i];
+ }
+ void __forward__ (unsigned n)
+ {
+ if (unlikely (n > length))
+ n = length;
+ length -= n;
+ backwards_length += n;
+ arrayZ += n;
+ }
+ void __rewind__ (unsigned n)
+ {
+ if (unlikely (n > backwards_length))
+ n = backwards_length;
+ length += n;
+ backwards_length -= n;
+ arrayZ -= n;
+ }
+ unsigned __len__ () const { return length; }
+ /* Ouch. The operator== compares the contents of the array. For range-based for loops,
+ * it's best if we can just compare arrayZ, though comparing contents is still fast,
+ * but also would require that Type has operator==. As such, we optimize this operator
+ * for range-based for loop and just compare arrayZ. No need to compare length, as we
+ * assume we're only compared to .end(). */
+ bool operator != (const hb_array_t& o) const
+ { return arrayZ != o.arrayZ; }
+
+ /* Extra operators.
+ */
+ Type * operator & () const { return arrayZ; }
+ operator hb_array_t<const Type> () { return hb_array_t<const Type> (arrayZ, length); }
+ template <typename T> operator T * () const { return arrayZ; }
+
+ HB_INTERNAL bool operator == (const hb_array_t &o) const;
+
+ uint32_t hash () const {
+ uint32_t current = 0;
+ for (unsigned int i = 0; i < this->length; i++) {
+ current = current * 31 + hb_hash (this->arrayZ[i]);
+ }
+ return current;
+ }
+
+ /*
+ * Compare, Sort, and Search.
+ */
+
+ /* Note: our compare is NOT lexicographic; it also does NOT call Type::cmp. */
+ int cmp (const hb_array_t &a) const
+ {
+ if (length != a.length)
+ return (int) a.length - (int) length;
+ return hb_memcmp (a.arrayZ, arrayZ, get_size ());
+ }
+ HB_INTERNAL static int cmp (const void *pa, const void *pb)
+ {
+ hb_array_t *a = (hb_array_t *) pa;
+ hb_array_t *b = (hb_array_t *) pb;
+ return b->cmp (*a);
+ }
+
+ template <typename T>
+ Type *lsearch (const T &x, Type *not_found = nullptr)
+ {
+ unsigned int count = length;
+ for (unsigned int i = 0; i < count; i++)
+ if (!this->arrayZ[i].cmp (x))
+ return &this->arrayZ[i];
+ return not_found;
+ }
+ template <typename T>
+ const Type *lsearch (const T &x, const Type *not_found = nullptr) const
+ {
+ unsigned int count = length;
+ for (unsigned int i = 0; i < count; i++)
+ if (!this->arrayZ[i].cmp (x))
+ return &this->arrayZ[i];
+ return not_found;
+ }
+
+ hb_sorted_array_t<Type> qsort (int (*cmp_)(const void*, const void*))
+ {
+ if (likely (length))
+ hb_qsort (arrayZ, length, this->get_item_size (), cmp_);
+ return hb_sorted_array_t<Type> (*this);
+ }
+ hb_sorted_array_t<Type> qsort ()
+ {
+ if (likely (length))
+ hb_qsort (arrayZ, length, this->get_item_size (), Type::cmp);
+ return hb_sorted_array_t<Type> (*this);
+ }
+ void qsort (unsigned int start, unsigned int end)
+ {
+ end = hb_min (end, length);
+ assert (start <= end);
+ if (likely (start < end))
+ hb_qsort (arrayZ + start, end - start, this->get_item_size (), Type::cmp);
+ }
+
+ /*
+ * Other methods.
+ */
+
+ unsigned int get_size () const { return length * this->get_item_size (); }
+
+ hb_array_t sub_array (unsigned int start_offset = 0, unsigned int *seg_count = nullptr /* IN/OUT */) const
+ {
+ if (!start_offset && !seg_count)
+ return *this;
+
+ unsigned int count = length;
+ if (unlikely (start_offset > count))
+ count = 0;
+ else
+ count -= start_offset;
+ if (seg_count)
+ count = *seg_count = hb_min (count, *seg_count);
+ return hb_array_t (arrayZ + start_offset, count);
+ }
+ hb_array_t sub_array (unsigned int start_offset, unsigned int seg_count) const
+ { return sub_array (start_offset, &seg_count); }
+
+ hb_array_t truncate (unsigned length) const { return sub_array (0, length); }
+
+ template <typename T,
+ unsigned P = sizeof (Type),
+ hb_enable_if (P == 1)>
+ const T *as () const
+ { return length < hb_null_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
+
+ template <typename T,
+ unsigned P = sizeof (Type),
+ hb_enable_if (P == 1)>
+ bool in_range (const T *p, unsigned int size = T::static_size) const
+ {
+ return ((const char *) p) >= arrayZ
+ && ((const char *) p + size) <= arrayZ + length;
+ }
+
+ /* Only call if you allocated the underlying array using malloc() or similar. */
+ void free ()
+ { ::free ((void *) arrayZ); arrayZ = nullptr; length = 0; }
+
+ template <typename hb_serialize_context_t>
+ hb_array_t copy (hb_serialize_context_t *c) const
+ {
+ TRACE_SERIALIZE (this);
+ auto* out = c->start_embed (arrayZ);
+ if (unlikely (!c->extend_size (out, get_size ()))) return_trace (hb_array_t ());
+ for (unsigned i = 0; i < length; i++)
+ out[i] = arrayZ[i]; /* TODO: add version that calls c->copy() */
+ return_trace (hb_array_t (out, length));
+ }
+
+ template <typename hb_sanitize_context_t>
+ bool sanitize (hb_sanitize_context_t *c) const
+ { return c->check_array (arrayZ, length); }
+
+ /*
+ * Members
+ */
+
+ public:
+ Type *arrayZ;
+ unsigned int length;
+ unsigned int backwards_length;
+};
+template <typename T> inline hb_array_t<T>
+hb_array (T *array, unsigned int length)
+{ return hb_array_t<T> (array, length); }
+template <typename T, unsigned int length_> inline hb_array_t<T>
+hb_array (T (&array_)[length_])
+{ return hb_array_t<T> (array_); }
+
+enum hb_bfind_not_found_t
+{
+ HB_BFIND_NOT_FOUND_DONT_STORE,
+ HB_BFIND_NOT_FOUND_STORE,
+ HB_BFIND_NOT_FOUND_STORE_CLOSEST,
+};
+
+template <typename Type>
+struct hb_sorted_array_t :
+ hb_iter_t<hb_sorted_array_t<Type>, Type&>,
+ hb_array_t<Type>
+{
+ typedef hb_iter_t<hb_sorted_array_t, Type&> iter_base_t;
+ HB_ITER_USING (iter_base_t);
+ static constexpr bool is_random_access_iterator = true;
+ static constexpr bool is_sorted_iterator = true;
+
+ hb_sorted_array_t () : hb_array_t<Type> () {}
+ hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {}
+ template <unsigned int length_>
+ hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t<Type> (array_) {}
+
+ template <typename U,
+ hb_enable_if (hb_is_cr_convertible(U, Type))>
+ hb_sorted_array_t (const hb_array_t<U> &o) :
+ hb_iter_t<hb_sorted_array_t, Type&> (),
+ hb_array_t<Type> (o) {}
+ template <typename U,
+ hb_enable_if (hb_is_cr_convertible(U, Type))>
+ hb_sorted_array_t& operator = (const hb_array_t<U> &o)
+ { hb_array_t<Type> (*this) = o; return *this; }
+
+ /* Iterator implementation. */
+ bool operator != (const hb_sorted_array_t& o) const
+ { return this->arrayZ != o.arrayZ || this->length != o.length; }
+
+ hb_sorted_array_t sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const
+ { return hb_sorted_array_t (((const hb_array_t<Type> *) (this))->sub_array (start_offset, seg_count)); }
+ hb_sorted_array_t sub_array (unsigned int start_offset, unsigned int seg_count) const
+ { return sub_array (start_offset, &seg_count); }
+
+ hb_sorted_array_t truncate (unsigned length) const { return sub_array (0, length); }
+
+ template <typename T>
+ Type *bsearch (const T &x, Type *not_found = nullptr)
+ {
+ unsigned int i;
+ return bfind (x, &i) ? &this->arrayZ[i] : not_found;
+ }
+ template <typename T>
+ const Type *bsearch (const T &x, const Type *not_found = nullptr) const
+ {
+ unsigned int i;
+ return bfind (x, &i) ? &this->arrayZ[i] : not_found;
+ }
+ template <typename T>
+ bool bfind (const T &x, unsigned int *i = nullptr,
+ hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+ unsigned int to_store = (unsigned int) -1) const
+ {
+ int min = 0, max = (int) this->length - 1;
+ const Type *array = this->arrayZ;
+ while (min <= max)
+ {
+ int mid = ((unsigned int) min + (unsigned int) max) / 2;
+ int c = array[mid].cmp (x);
+ if (c < 0)
+ max = mid - 1;
+ else if (c > 0)
+ min = mid + 1;
+ else
+ {
+ if (i)
+ *i = mid;
+ return true;
+ }
+ }
+ if (i)
+ {
+ switch (not_found)
+ {
+ case HB_BFIND_NOT_FOUND_DONT_STORE:
+ break;
+
+ case HB_BFIND_NOT_FOUND_STORE:
+ *i = to_store;
+ break;
+
+ case HB_BFIND_NOT_FOUND_STORE_CLOSEST:
+ if (max < 0 || (max < (int) this->length && array[max].cmp (x) > 0))
+ max++;
+ *i = max;
+ break;
+ }
+ }
+ return false;
+ }
+};
+template <typename T> inline hb_sorted_array_t<T>
+hb_sorted_array (T *array, unsigned int length)
+{ return hb_sorted_array_t<T> (array, length); }
+template <typename T, unsigned int length_> inline hb_sorted_array_t<T>
+hb_sorted_array (T (&array_)[length_])
+{ return hb_sorted_array_t<T> (array_); }
+
+template <typename T>
+bool hb_array_t<T>::operator == (const hb_array_t<T> &o) const
+{
+ if (o.length != this->length) return false;
+ for (unsigned int i = 0; i < this->length; i++) {
+ if (this->arrayZ[i] != o.arrayZ[i]) return false;
+ }
+ return true;
+}
+
+/* TODO Specialize opeator== for hb_bytes_t and hb_ubytes_t. */
+
+template <>
+inline uint32_t hb_array_t<const char>::hash () const {
+ uint32_t current = 0;
+ for (unsigned int i = 0; i < this->length; i++)
+ current = current * 31 + (uint32_t) (this->arrayZ[i] * 2654435761u);
+ return current;
+}
+
+template <>
+inline uint32_t hb_array_t<const unsigned char>::hash () const {
+ uint32_t current = 0;
+ for (unsigned int i = 0; i < this->length; i++)
+ current = current * 31 + (uint32_t) (this->arrayZ[i] * 2654435761u);
+ return current;
+}
+
+
+typedef hb_array_t<const char> hb_bytes_t;
+typedef hb_array_t<const unsigned char> hb_ubytes_t;
+
+
+
+#endif /* HB_ARRAY_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-atomic-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-atomic-private.hh
deleted file mode 100644
index 9343840140..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-atomic-private.hh
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright © 2007 Chris Wilson
- * Copyright © 2009,2010 Red Hat, Inc.
- * Copyright © 2011,2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Contributor(s):
- * Chris Wilson <chris@chris-wilson.co.uk>
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_ATOMIC_PRIVATE_HH
-#define HB_ATOMIC_PRIVATE_HH
-
-#include "hb-private.hh"
-
-
-/* atomic_int */
-
-/* We need external help for these */
-
-#if defined(hb_atomic_int_impl_add) \
- && defined(hb_atomic_ptr_impl_get) \
- && defined(hb_atomic_ptr_impl_cmpexch)
-
-/* Defined externally, i.e. in config.h; must have typedef'ed hb_atomic_int_impl_t as well. */
-
-
-#elif !defined(HB_NO_MT) && (defined(_WIN32) || defined(__CYGWIN__))
-
-#include <windows.h>
-
-/* MinGW has a convoluted history of supporting MemoryBarrier
- * properly. As such, define a function to wrap the whole
- * thing. */
-static inline void _HBMemoryBarrier (void) {
-#if !defined(MemoryBarrier)
- long dummy = 0;
- InterlockedExchange (&dummy, 1);
-#else
- MemoryBarrier ();
-#endif
-}
-
-typedef LONG hb_atomic_int_impl_t;
-#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V) InterlockedExchangeAdd (&(AI), (V))
-
-#define hb_atomic_ptr_impl_get(P) (_HBMemoryBarrier (), (void *) *(P))
-#define hb_atomic_ptr_impl_cmpexch(P,O,N) (InterlockedCompareExchangePointer ((void **) (P), (void *) (N), (void *) (O)) == (void *) (O))
-
-
-#elif !defined(HB_NO_MT) && defined(__APPLE__)
-
-#include <libkern/OSAtomic.h>
-#ifdef __MAC_OS_X_MIN_REQUIRED
-#include <AvailabilityMacros.h>
-#elif defined(__IPHONE_OS_MIN_REQUIRED)
-#include <Availability.h>
-#endif
-
-
-typedef int32_t hb_atomic_int_impl_t;
-#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V) (OSAtomicAdd32Barrier ((V), &(AI)) - (V))
-
-#define hb_atomic_ptr_impl_get(P) (OSMemoryBarrier (), (void *) *(P))
-#if (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 || __IPHONE_VERSION_MIN_REQUIRED >= 20100)
-#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwapPtrBarrier ((void *) (O), (void *) (N), (void **) (P))
-#else
-#if __ppc64__ || __x86_64__ || __aarch64__
-#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwap64Barrier ((int64_t) (void *) (O), (int64_t) (void *) (N), (int64_t*) (P))
-#else
-#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwap32Barrier ((int32_t) (void *) (O), (int32_t) (void *) (N), (int32_t*) (P))
-#endif
-#endif
-
-
-#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
-
-typedef int hb_atomic_int_impl_t;
-#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V) __sync_fetch_and_add (&(AI), (V))
-
-#define hb_atomic_ptr_impl_get(P) (void *) (__sync_synchronize (), *(P))
-#define hb_atomic_ptr_impl_cmpexch(P,O,N) __sync_bool_compare_and_swap ((P), (O), (N))
-
-
-#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS)
-
-#include <atomic.h>
-#include <mbarrier.h>
-
-typedef unsigned int hb_atomic_int_impl_t;
-#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V) ( ({__machine_rw_barrier ();}), atomic_add_int_nv (&(AI), (V)) - (V))
-
-#define hb_atomic_ptr_impl_get(P) ( ({__machine_rw_barrier ();}), (void *) *(P))
-#define hb_atomic_ptr_impl_cmpexch(P,O,N) ( ({__machine_rw_barrier ();}), atomic_cas_ptr ((void **) (P), (void *) (O), (void *) (N)) == (void *) (O) ? true : false)
-
-
-#elif !defined(HB_NO_MT) && defined(_AIX) && defined(__IBMCPP__)
-
-#include <builtins.h>
-
-
-static inline int _hb_fetch_and_add(volatile int* AI, unsigned int V) {
- __lwsync();
- int result = __fetch_and_add(AI, V);
- __isync();
- return result;
-}
-static inline int _hb_compare_and_swaplp(volatile long* P, long O, long N) {
- __sync();
- int result = __compare_and_swaplp (P, &O, N);
- __sync();
- return result;
-}
-
-typedef int hb_atomic_int_impl_t;
-#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V) _hb_fetch_and_add (&(AI), (V))
-
-#define hb_atomic_ptr_impl_get(P) (__sync(), (void *) *(P))
-#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_compare_and_swaplp ((long*)(P), (long)(O), (long)(N))
-
-#elif !defined(HB_NO_MT)
-
-#define HB_ATOMIC_INT_NIL 1 /* Warn that fallback implementation is in use. */
-
-typedef volatile int hb_atomic_int_impl_t;
-#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V) (((AI) += (V)) - (V))
-
-#define hb_atomic_ptr_impl_get(P) ((void *) *(P))
-#define hb_atomic_ptr_impl_cmpexch(P,O,N) (* (void * volatile *) (P) == (void *) (O) ? (* (void * volatile *) (P) = (void *) (N), true) : false)
-
-
-#else /* HB_NO_MT */
-
-typedef int hb_atomic_int_impl_t;
-#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V) (((AI) += (V)) - (V))
-
-#define hb_atomic_ptr_impl_get(P) ((void *) *(P))
-#define hb_atomic_ptr_impl_cmpexch(P,O,N) (* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false)
-
-
-#endif
-
-
-#define HB_ATOMIC_INT_INIT(V) {HB_ATOMIC_INT_IMPL_INIT(V)}
-
-struct hb_atomic_int_t
-{
- hb_atomic_int_impl_t v;
-
- inline void set_unsafe (int v_) { v = v_; }
- inline int get_unsafe (void) const { return v; }
- inline int inc (void) { return hb_atomic_int_impl_add (const_cast<hb_atomic_int_impl_t &> (v), 1); }
- inline int dec (void) { return hb_atomic_int_impl_add (const_cast<hb_atomic_int_impl_t &> (v), -1); }
-};
-
-
-#define hb_atomic_ptr_get(P) hb_atomic_ptr_impl_get(P)
-#define hb_atomic_ptr_cmpexch(P,O,N) hb_atomic_ptr_impl_cmpexch((P),(O),(N))
-
-
-#endif /* HB_ATOMIC_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-atomic.hh b/src/3rdparty/harfbuzz-ng/src/hb-atomic.hh
new file mode 100644
index 0000000000..b3fb296b4e
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-atomic.hh
@@ -0,0 +1,295 @@
+/*
+ * Copyright © 2007 Chris Wilson
+ * Copyright © 2009,2010 Red Hat, Inc.
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Contributor(s):
+ * Chris Wilson <chris@chris-wilson.co.uk>
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_ATOMIC_HH
+#define HB_ATOMIC_HH
+
+#include "hb.hh"
+#include "hb-meta.hh"
+
+
+/*
+ * Atomic integers and pointers.
+ */
+
+
+/* We need external help for these */
+
+#if defined(hb_atomic_int_impl_add) \
+ && defined(hb_atomic_ptr_impl_get) \
+ && defined(hb_atomic_ptr_impl_cmpexch)
+
+/* Defined externally, i.e. in config.h. */
+
+
+#elif !defined(HB_NO_MT) && defined(__ATOMIC_ACQUIRE)
+
+/* C++11-style GCC primitives. */
+
+#define _hb_memory_barrier() __sync_synchronize ()
+
+#define hb_atomic_int_impl_add(AI, V) __atomic_fetch_add ((AI), (V), __ATOMIC_ACQ_REL)
+#define hb_atomic_int_impl_set_relaxed(AI, V) __atomic_store_n ((AI), (V), __ATOMIC_RELAXED)
+#define hb_atomic_int_impl_set(AI, V) __atomic_store_n ((AI), (V), __ATOMIC_RELEASE)
+#define hb_atomic_int_impl_get_relaxed(AI) __atomic_load_n ((AI), __ATOMIC_RELAXED)
+#define hb_atomic_int_impl_get(AI) __atomic_load_n ((AI), __ATOMIC_ACQUIRE)
+
+#define hb_atomic_ptr_impl_set_relaxed(P, V) __atomic_store_n ((P), (V), __ATOMIC_RELAXED)
+#define hb_atomic_ptr_impl_get_relaxed(P) __atomic_load_n ((P), __ATOMIC_RELAXED)
+#define hb_atomic_ptr_impl_get(P) __atomic_load_n ((P), __ATOMIC_ACQUIRE)
+static inline bool
+_hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)
+{
+ const void *O = O_; // Need lvalue
+ return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
+}
+#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
+
+#elif !defined(HB_NO_MT) && __cplusplus >= 201103L
+
+/* C++11 atomics. */
+
+#include <atomic>
+
+#define _hb_memory_barrier() std::atomic_thread_fence(std::memory_order_ack_rel)
+#define _hb_memory_r_barrier() std::atomic_thread_fence(std::memory_order_acquire)
+#define _hb_memory_w_barrier() std::atomic_thread_fence(std::memory_order_release)
+
+#define hb_atomic_int_impl_add(AI, V) (reinterpret_cast<std::atomic<int> *> (AI)->fetch_add ((V), std::memory_order_acq_rel))
+#define hb_atomic_int_impl_set_relaxed(AI, V) (reinterpret_cast<std::atomic<int> *> (AI)->store ((V), std::memory_order_relaxed))
+#define hb_atomic_int_impl_set(AI, V) (reinterpret_cast<std::atomic<int> *> (AI)->store ((V), std::memory_order_release))
+#define hb_atomic_int_impl_get_relaxed(AI) (reinterpret_cast<std::atomic<int> const *> (AI)->load (std::memory_order_relaxed))
+#define hb_atomic_int_impl_get(AI) (reinterpret_cast<std::atomic<int> const *> (AI)->load (std::memory_order_acquire))
+
+#define hb_atomic_ptr_impl_set_relaxed(P, V) (reinterpret_cast<std::atomic<void*> *> (P)->store ((V), std::memory_order_relaxed))
+#define hb_atomic_ptr_impl_get_relaxed(P) (reinterpret_cast<std::atomic<void*> const *> (P)->load (std::memory_order_relaxed))
+#define hb_atomic_ptr_impl_get(P) (reinterpret_cast<std::atomic<void*> *> (P)->load (std::memory_order_acquire))
+static inline bool
+_hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)
+{
+ const void *O = O_; // Need lvalue
+ return reinterpret_cast<std::atomic<const void*> *> (P)->compare_exchange_weak (O, N, std::memory_order_acq_rel, std::memory_order_relaxed);
+}
+#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
+
+
+#elif !defined(HB_NO_MT) && defined(_WIN32)
+
+#include <windows.h>
+
+static inline void _hb_memory_barrier ()
+{
+#if !defined(MemoryBarrier) && !defined(__MINGW32_VERSION)
+ /* MinGW has a convoluted history of supporting MemoryBarrier. */
+ LONG dummy = 0;
+ InterlockedExchange (&dummy, 1);
+#else
+ MemoryBarrier ();
+#endif
+}
+#define _hb_memory_barrier() _hb_memory_barrier ()
+
+#define hb_atomic_int_impl_add(AI, V) InterlockedExchangeAdd ((LONG *) (AI), (V))
+static_assert ((sizeof (LONG) == sizeof (int)), "");
+
+#define hb_atomic_ptr_impl_cmpexch(P,O,N) (InterlockedCompareExchangePointer ((P), (N), (O)) == (O))
+
+
+#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
+
+#define _hb_memory_barrier() __sync_synchronize ()
+
+#define hb_atomic_int_impl_add(AI, V) __sync_fetch_and_add ((AI), (V))
+
+#define hb_atomic_ptr_impl_cmpexch(P,O,N) __sync_bool_compare_and_swap ((P), (O), (N))
+
+
+#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS)
+
+#include <atomic.h>
+#include <mbarrier.h>
+
+#define _hb_memory_r_barrier() __machine_r_barrier ()
+#define _hb_memory_w_barrier() __machine_w_barrier ()
+#define _hb_memory_barrier() __machine_rw_barrier ()
+
+static inline int _hb_fetch_and_add (int *AI, int V)
+{
+ _hb_memory_w_barrier ();
+ int result = atomic_add_int_nv ((uint_t *) AI, V) - V;
+ _hb_memory_r_barrier ();
+ return result;
+}
+static inline bool _hb_compare_and_swap_ptr (void **P, void *O, void *N)
+{
+ _hb_memory_w_barrier ();
+ bool result = atomic_cas_ptr (P, O, N) == O;
+ _hb_memory_r_barrier ();
+ return result;
+}
+
+#define hb_atomic_int_impl_add(AI, V) _hb_fetch_and_add ((AI), (V))
+
+#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_compare_and_swap_ptr ((P), (O), (N))
+
+
+#elif !defined(HB_NO_MT) && defined(__APPLE__)
+
+#include <libkern/OSAtomic.h>
+#ifdef __MAC_OS_X_MIN_REQUIRED
+#include <AvailabilityMacros.h>
+#elif defined(__IPHONE_OS_MIN_REQUIRED)
+#include <Availability.h>
+#endif
+
+#define _hb_memory_barrier() OSMemoryBarrier ()
+
+#define hb_atomic_int_impl_add(AI, V) (OSAtomicAdd32Barrier ((V), (AI)) - (V))
+
+#if (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 || __IPHONE_VERSION_MIN_REQUIRED >= 20100)
+#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwapPtrBarrier ((O), (N), (P))
+#else
+#if __ppc64__ || __x86_64__ || __aarch64__
+#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwap64Barrier ((int64_t) (O), (int64_t) (N), (int64_t*) (P))
+#else
+#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwap32Barrier ((int32_t) (O), (int32_t) (N), (int32_t*) (P))
+#endif
+#endif
+
+
+#elif !defined(HB_NO_MT) && defined(_AIX) && (defined(__IBMCPP__) || defined(__ibmxl__))
+
+#include <builtins.h>
+
+#define _hb_memory_barrier() __lwsync ()
+
+static inline int _hb_fetch_and_add (int *AI, int V)
+{
+ _hb_memory_barrier ();
+ int result = __fetch_and_add (AI, V);
+ _hb_memory_barrier ();
+ return result;
+}
+static inline bool _hb_compare_and_swaplp (long *P, long O, long N)
+{
+ _hb_memory_barrier ();
+ bool result = __compare_and_swaplp (P, &O, N);
+ _hb_memory_barrier ();
+ return result;
+}
+
+#define hb_atomic_int_impl_add(AI, V) _hb_fetch_and_add ((AI), (V))
+
+#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_compare_and_swaplp ((long *) (P), (long) (O), (long) (N))
+static_assert ((sizeof (long) == sizeof (void *)), "");
+
+
+#elif defined(HB_NO_MT)
+
+#define hb_atomic_int_impl_add(AI, V) ((*(AI) += (V)) - (V))
+
+#define _hb_memory_barrier() do {} while (0)
+
+#define hb_atomic_ptr_impl_cmpexch(P,O,N) (* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false)
+
+
+#else
+
+#error "Could not find any system to define atomic_int macros."
+#error "Check hb-atomic.hh for possible resolutions."
+
+#endif
+
+
+#ifndef _hb_memory_r_barrier
+#define _hb_memory_r_barrier() _hb_memory_barrier ()
+#endif
+#ifndef _hb_memory_w_barrier
+#define _hb_memory_w_barrier() _hb_memory_barrier ()
+#endif
+#ifndef hb_atomic_int_impl_set_relaxed
+#define hb_atomic_int_impl_set_relaxed(AI, V) (*(AI) = (V))
+#endif
+#ifndef hb_atomic_int_impl_get_relaxed
+#define hb_atomic_int_impl_get_relaxed(AI) (*(AI))
+#endif
+
+#ifndef hb_atomic_ptr_impl_set_relaxed
+#define hb_atomic_ptr_impl_set_relaxed(P, V) (*(P) = (V))
+#endif
+#ifndef hb_atomic_ptr_impl_get_relaxed
+#define hb_atomic_ptr_impl_get_relaxed(P) (*(P))
+#endif
+#ifndef hb_atomic_int_impl_set
+inline void hb_atomic_int_impl_set (int *AI, int v) { _hb_memory_w_barrier (); *AI = v; }
+#endif
+#ifndef hb_atomic_int_impl_get
+inline int hb_atomic_int_impl_get (const int *AI) { int v = *AI; _hb_memory_r_barrier (); return v; }
+#endif
+#ifndef hb_atomic_ptr_impl_get
+inline void *hb_atomic_ptr_impl_get (void ** const P) { void *v = *P; _hb_memory_r_barrier (); return v; }
+#endif
+
+
+#define HB_ATOMIC_INT_INIT(V) {V}
+struct hb_atomic_int_t
+{
+ void set_relaxed (int v_) { hb_atomic_int_impl_set_relaxed (&v, v_); }
+ void set (int v_) { hb_atomic_int_impl_set (&v, v_); }
+ int get_relaxed () const { return hb_atomic_int_impl_get_relaxed (&v); }
+ int get () const { return hb_atomic_int_impl_get (&v); }
+ int inc () { return hb_atomic_int_impl_add (&v, 1); }
+ int dec () { return hb_atomic_int_impl_add (&v, -1); }
+
+ int v;
+};
+
+
+#define HB_ATOMIC_PTR_INIT(V) {V}
+template <typename P>
+struct hb_atomic_ptr_t
+{
+ typedef hb_remove_pointer<P> T;
+
+ void init (T* v_ = nullptr) { set_relaxed (v_); }
+ void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
+ T *get_relaxed () const { return (T *) hb_atomic_ptr_impl_get_relaxed (&v); }
+ T *get () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
+ bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
+
+ T * operator -> () const { return get (); }
+ template <typename C> operator C * () const { return get (); }
+
+ T *v;
+};
+
+
+#endif /* HB_ATOMIC_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-bimap.hh b/src/3rdparty/harfbuzz-ng/src/hb-bimap.hh
new file mode 100644
index 0000000000..cae0a4dea4
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-bimap.hh
@@ -0,0 +1,166 @@
+/*
+ * Copyright © 2019 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_BIMAP_HH
+#define HB_BIMAP_HH
+
+#include "hb.hh"
+#include "hb-map.hh"
+
+/* Bi-directional map */
+struct hb_bimap_t
+{
+ hb_bimap_t () { init (); }
+ ~hb_bimap_t () { fini (); }
+
+ void init ()
+ {
+ forw_map.init ();
+ back_map.init ();
+ }
+
+ void fini ()
+ {
+ forw_map.fini ();
+ back_map.fini ();
+ }
+
+ void reset ()
+ {
+ forw_map.reset ();
+ back_map.reset ();
+ }
+
+ bool in_error () const { return forw_map.in_error () || back_map.in_error (); }
+
+ void set (hb_codepoint_t lhs, hb_codepoint_t rhs)
+ {
+ if (unlikely (lhs == HB_MAP_VALUE_INVALID)) return;
+ if (unlikely (rhs == HB_MAP_VALUE_INVALID)) { del (lhs); return; }
+ forw_map.set (lhs, rhs);
+ back_map.set (rhs, lhs);
+ }
+
+ hb_codepoint_t get (hb_codepoint_t lhs) const { return forw_map.get (lhs); }
+ hb_codepoint_t backward (hb_codepoint_t rhs) const { return back_map.get (rhs); }
+
+ hb_codepoint_t operator [] (hb_codepoint_t lhs) const { return get (lhs); }
+ bool has (hb_codepoint_t lhs, hb_codepoint_t *vp = nullptr) const { return forw_map.has (lhs, vp); }
+
+ void del (hb_codepoint_t lhs)
+ {
+ back_map.del (get (lhs));
+ forw_map.del (lhs);
+ }
+
+ void clear ()
+ {
+ forw_map.clear ();
+ back_map.clear ();
+ }
+
+ bool is_empty () const { return get_population () == 0; }
+
+ unsigned int get_population () const { return forw_map.get_population (); }
+
+ protected:
+ hb_map_t forw_map;
+ hb_map_t back_map;
+};
+
+/* Inremental bimap: only lhs is given, rhs is incrementally assigned */
+struct hb_inc_bimap_t : hb_bimap_t
+{
+ hb_inc_bimap_t () { init (); }
+
+ void init ()
+ {
+ hb_bimap_t::init ();
+ next_value = 0;
+ }
+
+ /* Add a mapping from lhs to rhs with a unique value if lhs is unknown.
+ * Return the rhs value as the result.
+ */
+ hb_codepoint_t add (hb_codepoint_t lhs)
+ {
+ hb_codepoint_t rhs = forw_map[lhs];
+ if (rhs == HB_MAP_VALUE_INVALID)
+ {
+ rhs = next_value++;
+ set (lhs, rhs);
+ }
+ return rhs;
+ }
+
+ hb_codepoint_t skip ()
+ { return next_value++; }
+
+ hb_codepoint_t get_next_value () const
+ { return next_value; }
+
+ void add_set (const hb_set_t *set)
+ {
+ hb_codepoint_t i = HB_SET_VALUE_INVALID;
+ while (hb_set_next (set, &i)) add (i);
+ }
+
+ /* Create an identity map. */
+ bool identity (unsigned int size)
+ {
+ clear ();
+ for (hb_codepoint_t i = 0; i < size; i++) set (i, i);
+ return !in_error ();
+ }
+
+ protected:
+ static int cmp_id (const void* a, const void* b)
+ { return (int)*(const hb_codepoint_t *)a - (int)*(const hb_codepoint_t *)b; }
+
+ public:
+ /* Optional: after finished adding all mappings in a random order,
+ * reassign rhs to lhs so that they are in the same order. */
+ void sort ()
+ {
+ hb_codepoint_t count = get_population ();
+ hb_vector_t <hb_codepoint_t> work;
+ work.resize (count);
+
+ for (hb_codepoint_t rhs = 0; rhs < count; rhs++)
+ work[rhs] = back_map[rhs];
+
+ work.qsort (cmp_id);
+
+ clear ();
+ for (hb_codepoint_t rhs = 0; rhs < count; rhs++)
+ set (work[rhs], rhs);
+ }
+
+ protected:
+ unsigned int next_value;
+};
+
+#endif /* HB_BIMAP_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-blob.cc b/src/3rdparty/harfbuzz-ng/src/hb-blob.cc
index 59c8333637..2e72683c8b 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-blob.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-blob.cc
@@ -1,5 +1,6 @@
/*
* Copyright © 2009 Red Hat, Inc.
+ * Copyright © 2018 Ebrahim Byagowi
*
* This is part of HarfBuzz, a text shaping library.
*
@@ -24,15 +25,20 @@
* Red Hat Author(s): Behdad Esfahbod
*/
-/* http://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html */
-#ifndef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 199309L
-#endif
-#include "hb-private.hh"
-#include "hb-debug.hh"
+/* https://github.com/harfbuzz/harfbuzz/issues/1308
+ * http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html
+ * https://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html
+ */
+#if !defined(_POSIX_C_SOURCE) && !defined(_MSC_VER) && !defined(__NetBSD__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-macros"
+#define _POSIX_C_SOURCE 200809L
+#pragma GCC diagnostic pop
+#endif
-#include "hb-object-private.hh"
+#include "hb.hh"
+#include "hb-blob.hh"
#ifdef HAVE_SYS_MMAN_H
#ifdef HAVE_UNISTD_H
@@ -42,35 +48,21 @@
#endif /* HAVE_SYS_MMAN_H */
#include <stdio.h>
-#include <errno.h>
-
-
-struct hb_blob_t {
- hb_object_header_t header;
- ASSERT_POD ();
-
- bool immutable;
+#include <stdlib.h>
- const char *data;
- unsigned int length;
- hb_memory_mode_t mode;
-
- void *user_data;
- hb_destroy_func_t destroy;
-};
+/**
+ * SECTION: hb-blob
+ * @title: hb-blob
+ * @short_description: Binary data containers
+ * @include: hb.h
+ *
+ * Blobs wrap a chunk of binary data to handle lifecycle management of data
+ * while it is passed between client and HarfBuzz. Blobs are primarily used
+ * to create font faces, but also to access font face tables, as well as
+ * pass around other binary data.
+ **/
-static bool _try_writable (hb_blob_t *blob);
-
-static void
-_hb_blob_destroy_user_data (hb_blob_t *blob)
-{
- if (blob->destroy) {
- blob->destroy (blob->user_data);
- blob->user_data = nullptr;
- blob->destroy = nullptr;
- }
-}
/**
* hb_blob_create: (skip)
@@ -114,7 +106,7 @@ hb_blob_create (const char *data,
if (blob->mode == HB_MEMORY_MODE_DUPLICATE) {
blob->mode = HB_MEMORY_MODE_READONLY;
- if (!_try_writable (blob)) {
+ if (!blob->try_make_writable ()) {
hb_blob_destroy (blob);
return hb_blob_get_empty ();
}
@@ -156,13 +148,13 @@ hb_blob_create_sub_blob (hb_blob_t *parent,
{
hb_blob_t *blob;
- if (!length || offset >= parent->length)
+ if (!length || !parent || offset >= parent->length)
return hb_blob_get_empty ();
hb_blob_make_immutable (parent);
blob = hb_blob_create (parent->data + offset,
- MIN (length, parent->length - offset),
+ hb_min (length, parent->length - offset),
HB_MEMORY_MODE_READONLY,
hb_blob_reference (parent),
_hb_blob_destroy);
@@ -171,6 +163,31 @@ hb_blob_create_sub_blob (hb_blob_t *parent,
}
/**
+ * hb_blob_copy_writable_or_fail:
+ * @blob: A blob.
+ *
+ * Makes a writable copy of @blob.
+ *
+ * Return value: New blob, or nullptr if allocation failed.
+ *
+ * Since: 1.8.0
+ **/
+hb_blob_t *
+hb_blob_copy_writable_or_fail (hb_blob_t *blob)
+{
+ blob = hb_blob_create (blob->data,
+ blob->length,
+ HB_MEMORY_MODE_DUPLICATE,
+ nullptr,
+ nullptr);
+
+ if (unlikely (blob == hb_blob_get_empty ()))
+ blob = nullptr;
+
+ return blob;
+}
+
+/**
* hb_blob_get_empty:
*
* Returns the singleton empty blob.
@@ -182,22 +199,9 @@ hb_blob_create_sub_blob (hb_blob_t *parent,
* Since: 0.9.2
**/
hb_blob_t *
-hb_blob_get_empty (void)
+hb_blob_get_empty ()
{
- static const hb_blob_t _hb_blob_nil = {
- HB_OBJECT_HEADER_STATIC,
-
- true, /* immutable */
-
- nullptr, /* data */
- 0, /* length */
- HB_MEMORY_MODE_READONLY, /* mode */
-
- nullptr, /* user_data */
- nullptr /* destroy */
- };
-
- return const_cast<hb_blob_t *> (&_hb_blob_nil);
+ return const_cast<hb_blob_t *> (&Null(hb_blob_t));
}
/**
@@ -222,7 +226,7 @@ hb_blob_reference (hb_blob_t *blob)
* hb_blob_destroy: (skip)
* @blob: a blob.
*
- * Descreases the reference count on @blob, and if it reaches zero, destroys
+ * Decreases the reference count on @blob, and if it reaches zero, destroys
* @blob, freeing all memory, possibly calling the destroy-callback the blob
* was created for if it has not been called already.
*
@@ -235,7 +239,7 @@ hb_blob_destroy (hb_blob_t *blob)
{
if (!hb_object_destroy (blob)) return;
- _hb_blob_destroy_user_data (blob);
+ blob->fini_shallow ();
free (blob);
}
@@ -248,7 +252,7 @@ hb_blob_destroy (hb_blob_t *blob)
* @destroy: callback to call when @data is not needed anymore.
* @replace: whether to replace an existing data with the same key.
*
- * Return value:
+ * Return value:
*
* Since: 0.9.2
**/
@@ -267,9 +271,9 @@ hb_blob_set_user_data (hb_blob_t *blob,
* @blob: a blob.
* @key: key for data to get.
*
- *
*
- * Return value: (transfer none):
+ *
+ * Return value: (transfer none):
*
* Since: 0.9.2
**/
@@ -285,24 +289,24 @@ hb_blob_get_user_data (hb_blob_t *blob,
* hb_blob_make_immutable:
* @blob: a blob.
*
- *
+ *
*
* Since: 0.9.2
**/
void
hb_blob_make_immutable (hb_blob_t *blob)
{
- if (hb_object_is_inert (blob))
+ if (hb_object_is_immutable (blob))
return;
- blob->immutable = true;
+ hb_object_make_immutable (blob);
}
/**
* hb_blob_is_immutable:
* @blob: a blob.
*
- *
+ *
*
* Return value: TODO
*
@@ -311,7 +315,7 @@ hb_blob_make_immutable (hb_blob_t *blob)
hb_bool_t
hb_blob_is_immutable (hb_blob_t *blob)
{
- return blob->immutable;
+ return hb_object_is_immutable (blob);
}
@@ -319,7 +323,7 @@ hb_blob_is_immutable (hb_blob_t *blob)
* hb_blob_get_length:
* @blob: a blob.
*
- *
+ *
*
* Return value: the length of blob data in bytes.
*
@@ -336,9 +340,9 @@ hb_blob_get_length (hb_blob_t *blob)
* @blob: a blob.
* @length: (out):
*
- *
*
- * Returns: (transfer none) (array length=length):
+ *
+ * Returns: (transfer none) (array length=length):
*
* Since: 0.9.2
**/
@@ -370,7 +374,7 @@ hb_blob_get_data (hb_blob_t *blob, unsigned int *length)
char *
hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length)
{
- if (!_try_writable (blob)) {
+ if (!blob->try_make_writable ()) {
if (length)
*length = 0;
@@ -384,8 +388,8 @@ hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length)
}
-static hb_bool_t
-_try_make_writable_inplace_unix (hb_blob_t *blob)
+bool
+hb_blob_t::try_make_writable_inplace_unix ()
{
#if defined(HAVE_SYS_MMAN_H) && defined(HAVE_MPROTECT)
uintptr_t pagesize = -1, mask, length;
@@ -400,25 +404,25 @@ _try_make_writable_inplace_unix (hb_blob_t *blob)
#endif
if ((uintptr_t) -1L == pagesize) {
- DEBUG_MSG_FUNC (BLOB, blob, "failed to get pagesize: %s", strerror (errno));
+ DEBUG_MSG_FUNC (BLOB, this, "failed to get pagesize: %s", strerror (errno));
return false;
}
- DEBUG_MSG_FUNC (BLOB, blob, "pagesize is %lu", (unsigned long) pagesize);
+ DEBUG_MSG_FUNC (BLOB, this, "pagesize is %lu", (unsigned long) pagesize);
mask = ~(pagesize-1);
- addr = (const char *) (((uintptr_t) blob->data) & mask);
- length = (const char *) (((uintptr_t) blob->data + blob->length + pagesize-1) & mask) - addr;
- DEBUG_MSG_FUNC (BLOB, blob,
+ addr = (const char *) (((uintptr_t) this->data) & mask);
+ length = (const char *) (((uintptr_t) this->data + this->length + pagesize-1) & mask) - addr;
+ DEBUG_MSG_FUNC (BLOB, this,
"calling mprotect on [%p..%p] (%lu bytes)",
addr, addr+length, (unsigned long) length);
if (-1 == mprotect ((void *) addr, length, PROT_READ | PROT_WRITE)) {
- DEBUG_MSG_FUNC (BLOB, blob, "mprotect failed: %s", strerror (errno));
+ DEBUG_MSG_FUNC (BLOB, this, "mprotect failed: %s", strerror (errno));
return false;
}
- blob->mode = HB_MEMORY_MODE_WRITABLE;
+ this->mode = HB_MEMORY_MODE_WRITABLE;
- DEBUG_MSG_FUNC (BLOB, blob,
+ DEBUG_MSG_FUNC (BLOB, this,
"successfully made [%p..%p] (%lu bytes) writable\n",
addr, addr+length, (unsigned long) length);
return true;
@@ -427,53 +431,249 @@ _try_make_writable_inplace_unix (hb_blob_t *blob)
#endif
}
-static bool
-_try_writable_inplace (hb_blob_t *blob)
+bool
+hb_blob_t::try_make_writable_inplace ()
{
- DEBUG_MSG_FUNC (BLOB, blob, "making writable inplace\n");
+ DEBUG_MSG_FUNC (BLOB, this, "making writable inplace\n");
- if (_try_make_writable_inplace_unix (blob))
+ if (this->try_make_writable_inplace_unix ())
return true;
- DEBUG_MSG_FUNC (BLOB, blob, "making writable -> FAILED\n");
+ DEBUG_MSG_FUNC (BLOB, this, "making writable -> FAILED\n");
/* Failed to make writable inplace, mark that */
- blob->mode = HB_MEMORY_MODE_READONLY;
+ this->mode = HB_MEMORY_MODE_READONLY;
return false;
}
-static bool
-_try_writable (hb_blob_t *blob)
+bool
+hb_blob_t::try_make_writable ()
{
- if (blob->immutable)
+ if (hb_object_is_immutable (this))
return false;
- if (blob->mode == HB_MEMORY_MODE_WRITABLE)
+ if (this->mode == HB_MEMORY_MODE_WRITABLE)
return true;
- if (blob->mode == HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE && _try_writable_inplace (blob))
+ if (this->mode == HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE && this->try_make_writable_inplace ())
return true;
- if (blob->mode == HB_MEMORY_MODE_WRITABLE)
+ if (this->mode == HB_MEMORY_MODE_WRITABLE)
return true;
- DEBUG_MSG_FUNC (BLOB, blob, "current data is -> %p\n", blob->data);
+ DEBUG_MSG_FUNC (BLOB, this, "current data is -> %p\n", this->data);
char *new_data;
- new_data = (char *) malloc (blob->length);
+ new_data = (char *) malloc (this->length);
if (unlikely (!new_data))
return false;
- DEBUG_MSG_FUNC (BLOB, blob, "dupped successfully -> %p\n", blob->data);
+ DEBUG_MSG_FUNC (BLOB, this, "dupped successfully -> %p\n", this->data);
- memcpy (new_data, blob->data, blob->length);
- _hb_blob_destroy_user_data (blob);
- blob->mode = HB_MEMORY_MODE_WRITABLE;
- blob->data = new_data;
- blob->user_data = new_data;
- blob->destroy = free;
+ memcpy (new_data, this->data, this->length);
+ this->destroy_user_data ();
+ this->mode = HB_MEMORY_MODE_WRITABLE;
+ this->data = new_data;
+ this->user_data = new_data;
+ this->destroy = free;
return true;
}
+
+/*
+ * Mmap
+ */
+
+#ifndef HB_NO_OPEN
+#ifdef HAVE_MMAP
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <fcntl.h>
+#endif
+
+#ifdef _WIN32
+# include <windows.h>
+#else
+# ifndef O_BINARY
+# define O_BINARY 0
+# endif
+#endif
+
+#ifndef MAP_NORESERVE
+# define MAP_NORESERVE 0
+#endif
+
+struct hb_mapped_file_t
+{
+ char *contents;
+ unsigned long length;
+#ifdef _WIN32
+ HANDLE mapping;
+#endif
+};
+
+#if (defined(HAVE_MMAP) || defined(_WIN32)) && !defined(HB_NO_MMAP)
+static void
+_hb_mapped_file_destroy (void *file_)
+{
+ hb_mapped_file_t *file = (hb_mapped_file_t *) file_;
+#ifdef HAVE_MMAP
+ munmap (file->contents, file->length);
+#elif defined(_WIN32)
+ UnmapViewOfFile (file->contents);
+ CloseHandle (file->mapping);
+#else
+ assert (0); // If we don't have mmap we shouldn't reach here
+#endif
+
+ free (file);
+}
+#endif
+
+/**
+ * hb_blob_create_from_file:
+ * @file_name: font filename.
+ *
+ * Returns: A hb_blob_t pointer with the content of the file
+ *
+ * Since: 1.7.7
+ **/
+hb_blob_t *
+hb_blob_create_from_file (const char *file_name)
+{
+ /* Adopted from glib's gmappedfile.c with Matthias Clasen and
+ Allison Lortie permission but changed a lot to suit our need. */
+#if defined(HAVE_MMAP) && !defined(HB_NO_MMAP)
+ hb_mapped_file_t *file = (hb_mapped_file_t *) calloc (1, sizeof (hb_mapped_file_t));
+ if (unlikely (!file)) return hb_blob_get_empty ();
+
+ int fd = open (file_name, O_RDONLY | O_BINARY, 0);
+ if (unlikely (fd == -1)) goto fail_without_close;
+
+ struct stat st;
+ if (unlikely (fstat (fd, &st) == -1)) goto fail;
+
+ file->length = (unsigned long) st.st_size;
+ file->contents = (char *) mmap (nullptr, file->length, PROT_READ,
+ MAP_PRIVATE | MAP_NORESERVE, fd, 0);
+
+ if (unlikely (file->contents == MAP_FAILED)) goto fail;
+
+ close (fd);
+
+ return hb_blob_create (file->contents, file->length,
+ HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file,
+ (hb_destroy_func_t) _hb_mapped_file_destroy);
+
+fail:
+ close (fd);
+fail_without_close:
+ free (file);
+
+#elif defined(_WIN32) && !defined(HB_NO_MMAP)
+ hb_mapped_file_t *file = (hb_mapped_file_t *) calloc (1, sizeof (hb_mapped_file_t));
+ if (unlikely (!file)) return hb_blob_get_empty ();
+
+ HANDLE fd;
+ unsigned int size = strlen (file_name) + 1;
+ wchar_t * wchar_file_name = (wchar_t *) malloc (sizeof (wchar_t) * size);
+ if (unlikely (wchar_file_name == nullptr)) goto fail_without_close;
+ mbstowcs (wchar_file_name, file_name, size);
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+ {
+ CREATEFILE2_EXTENDED_PARAMETERS ceparams = { 0 };
+ ceparams.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
+ ceparams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED & 0xFFFF;
+ ceparams.dwFileFlags = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED & 0xFFF00000;
+ ceparams.dwSecurityQosFlags = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED & 0x000F0000;
+ ceparams.lpSecurityAttributes = nullptr;
+ ceparams.hTemplateFile = nullptr;
+ fd = CreateFile2 (wchar_file_name, GENERIC_READ, FILE_SHARE_READ,
+ OPEN_EXISTING, &ceparams);
+ }
+#else
+ fd = CreateFileW (wchar_file_name, GENERIC_READ, FILE_SHARE_READ, nullptr,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
+ nullptr);
+#endif
+ free (wchar_file_name);
+
+ if (unlikely (fd == INVALID_HANDLE_VALUE)) goto fail_without_close;
+
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+ {
+ LARGE_INTEGER length;
+ GetFileSizeEx (fd, &length);
+ file->length = length.LowPart;
+ file->mapping = CreateFileMappingFromApp (fd, nullptr, PAGE_READONLY, length.QuadPart, nullptr);
+ }
+#else
+ file->length = (unsigned long) GetFileSize (fd, nullptr);
+ file->mapping = CreateFileMapping (fd, nullptr, PAGE_READONLY, 0, 0, nullptr);
+#endif
+ if (unlikely (file->mapping == nullptr)) goto fail;
+
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+ file->contents = (char *) MapViewOfFileFromApp (file->mapping, FILE_MAP_READ, 0, 0);
+#else
+ file->contents = (char *) MapViewOfFile (file->mapping, FILE_MAP_READ, 0, 0, 0);
+#endif
+ if (unlikely (file->contents == nullptr)) goto fail;
+
+ CloseHandle (fd);
+ return hb_blob_create (file->contents, file->length,
+ HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file,
+ (hb_destroy_func_t) _hb_mapped_file_destroy);
+
+fail:
+ CloseHandle (fd);
+fail_without_close:
+ free (file);
+
+#endif
+
+ /* The following tries to read a file without knowing its size beforehand
+ It's used as a fallback for systems without mmap or to read from pipes */
+ unsigned long len = 0, allocated = BUFSIZ * 16;
+ char *data = (char *) malloc (allocated);
+ if (unlikely (data == nullptr)) return hb_blob_get_empty ();
+
+ FILE *fp = fopen (file_name, "rb");
+ if (unlikely (fp == nullptr)) goto fread_fail_without_close;
+
+ while (!feof (fp))
+ {
+ if (allocated - len < BUFSIZ)
+ {
+ allocated *= 2;
+ /* Don't allocate and go more than ~536MB, our mmap reader still
+ can cover files like that but lets limit our fallback reader */
+ if (unlikely (allocated > (2 << 28))) goto fread_fail;
+ char *new_data = (char *) realloc (data, allocated);
+ if (unlikely (new_data == nullptr)) goto fread_fail;
+ data = new_data;
+ }
+
+ unsigned long addition = fread (data + len, 1, allocated - len, fp);
+
+ int err = ferror (fp);
+#ifdef EINTR // armcc doesn't have it
+ if (unlikely (err == EINTR)) continue;
+#endif
+ if (unlikely (err)) goto fread_fail;
+
+ len += addition;
+ }
+
+ return hb_blob_create (data, len, HB_MEMORY_MODE_WRITABLE, data,
+ (hb_destroy_func_t) free);
+
+fread_fail:
+ fclose (fp);
+fread_fail_without_close:
+ free (data);
+ return hb_blob_get_empty ();
+}
+#endif /* !HB_NO_OPEN */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-blob.h b/src/3rdparty/harfbuzz-ng/src/hb-blob.h
index ef3fc98c05..f80e9af2d9 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-blob.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-blob.h
@@ -44,7 +44,7 @@ HB_BEGIN_DECLS
* any such possibility, MODE_DUPLICATE should be used
* such that HarfBuzz makes a copy immediately,
*
- * - Use MODE_READONLY otherse, unless you really really
+ * - Use MODE_READONLY otherwise, unless you really really
* really know what you are doing,
*
* - MODE_WRITABLE is appropriate if you really made a
@@ -71,6 +71,9 @@ hb_blob_create (const char *data,
void *user_data,
hb_destroy_func_t destroy);
+HB_EXTERN hb_blob_t *
+hb_blob_create_from_file (const char *file_name);
+
/* Always creates with MEMORY_MODE_READONLY.
* Even if the parent blob is writable, we don't
* want the user of the sub-blob to be able to
@@ -83,6 +86,9 @@ hb_blob_create_sub_blob (hb_blob_t *parent,
unsigned int length);
HB_EXTERN hb_blob_t *
+hb_blob_copy_writable_or_fail (hb_blob_t *blob);
+
+HB_EXTERN hb_blob_t *
hb_blob_get_empty (void);
HB_EXTERN hb_blob_t *
@@ -120,7 +126,6 @@ hb_blob_get_data (hb_blob_t *blob, unsigned int *length);
HB_EXTERN char *
hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length);
-
HB_END_DECLS
#endif /* HB_BLOB_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-blob.hh b/src/3rdparty/harfbuzz-ng/src/hb-blob.hh
new file mode 100644
index 0000000000..d85bd823b0
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-blob.hh
@@ -0,0 +1,97 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_BLOB_HH
+#define HB_BLOB_HH
+
+#include "hb.hh"
+
+
+/*
+ * hb_blob_t
+ */
+
+struct hb_blob_t
+{
+ void fini_shallow () { destroy_user_data (); }
+
+ void destroy_user_data ()
+ {
+ if (destroy)
+ {
+ destroy (user_data);
+ user_data = nullptr;
+ destroy = nullptr;
+ }
+ }
+
+ HB_INTERNAL bool try_make_writable ();
+ HB_INTERNAL bool try_make_writable_inplace ();
+ HB_INTERNAL bool try_make_writable_inplace_unix ();
+
+ hb_bytes_t as_bytes () const { return hb_bytes_t (data, length); }
+ template <typename Type>
+ const Type* as () const { return as_bytes ().as<Type> (); }
+
+ public:
+ hb_object_header_t header;
+
+ const char *data;
+ unsigned int length;
+ hb_memory_mode_t mode;
+
+ void *user_data;
+ hb_destroy_func_t destroy;
+};
+
+
+/*
+ * hb_blob_ptr_t
+ */
+
+template <typename P>
+struct hb_blob_ptr_t
+{
+ typedef hb_remove_pointer<P> T;
+
+ hb_blob_ptr_t (hb_blob_t *b_ = nullptr) : b (b_) {}
+ hb_blob_t * operator = (hb_blob_t *b_) { return b = b_; }
+ const T * operator -> () const { return get (); }
+ const T & operator * () const { return *get (); }
+ template <typename C> operator const C * () const { return get (); }
+ operator const char * () const { return (const char *) get (); }
+ const T * get () const { return b->as<T> (); }
+ hb_blob_t * get_blob () const { return b.get_raw (); }
+ unsigned int get_length () const { return b.get ()->length; }
+ void destroy () { hb_blob_destroy (b.get ()); b = nullptr; }
+
+ hb_nonnull_ptr_t<hb_blob_t> b;
+};
+
+
+#endif /* HB_BLOB_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh b/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh
index 3f626bda40..1f9e2e91db 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh
@@ -29,7 +29,7 @@
#ifndef HB_BUFFER_DESERIALIZE_JSON_HH
#define HB_BUFFER_DESERIALIZE_JSON_HH
-#include "hb-private.hh"
+#include "hb.hh"
#line 36 "hb-buffer-deserialize-json.hh"
@@ -448,7 +448,7 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
const char *p = buf, *pe = buf + buf_len;
/* Ensure we have positions. */
- (void) hb_buffer_get_glyph_positions (buffer, NULL);
+ (void) hb_buffer_get_glyph_positions (buffer, nullptr);
while (p < pe && ISSPACE (*p))
p++;
@@ -457,7 +457,7 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
*end_ptr = ++p;
}
- const char *tok = NULL;
+ const char *tok = nullptr;
int cs;
hb_glyph_info_t info = {0};
hb_glyph_position_t pos = {0};
@@ -503,7 +503,7 @@ _resume:
#line 43 "hb-buffer-deserialize-json.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -554,7 +554,7 @@ _resume:
#line 43 "hb-buffer-deserialize-json.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -566,7 +566,7 @@ _resume:
#line 43 "hb-buffer-deserialize-json.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -578,7 +578,7 @@ _resume:
#line 43 "hb-buffer-deserialize-json.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -590,7 +590,7 @@ _resume:
#line 43 "hb-buffer-deserialize-json.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -602,7 +602,7 @@ _resume:
#line 43 "hb-buffer-deserialize-json.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -614,7 +614,7 @@ _resume:
#line 43 "hb-buffer-deserialize-json.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.rl b/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.rl
new file mode 100644
index 0000000000..f3abb027b2
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.rl
@@ -0,0 +1,132 @@
+/*
+ * Copyright © 2013 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_BUFFER_DESERIALIZE_JSON_HH
+#define HB_BUFFER_DESERIALIZE_JSON_HH
+
+#include "hb.hh"
+
+%%{
+
+machine deserialize_json;
+alphtype unsigned char;
+write data;
+
+action clear_item {
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
+}
+
+action add_item {
+ buffer->add_info (info);
+ if (unlikely (!buffer->successful))
+ return false;
+ buffer->pos[buffer->len - 1] = pos;
+ *end_ptr = p;
+}
+
+action tok {
+ tok = p;
+}
+
+action parse_glyph {
+ if (!hb_font_glyph_from_string (font,
+ tok, p - tok,
+ &info.codepoint))
+ return false;
+}
+
+action parse_gid { if (!parse_uint (tok, p, &info.codepoint)) return false; }
+action parse_cluster { if (!parse_uint (tok, p, &info.cluster )) return false; }
+action parse_x_offset { if (!parse_int (tok, p, &pos.x_offset )) return false; }
+action parse_y_offset { if (!parse_int (tok, p, &pos.y_offset )) return false; }
+action parse_x_advance { if (!parse_int (tok, p, &pos.x_advance)) return false; }
+action parse_y_advance { if (!parse_int (tok, p, &pos.y_advance)) return false; }
+
+unum = '0' | [1-9] digit*;
+num = '-'? unum;
+
+comma = space* ',' space*;
+colon = space* ':' space*;
+
+glyph_id = unum;
+glyph_name = alpha (alnum|'_'|'.'|'-')*;
+
+glyph_string = '"' (glyph_name >tok %parse_glyph) '"';
+glyph_number = (glyph_id >tok %parse_gid);
+
+glyph = "\"g\"" colon (glyph_string | glyph_number);
+cluster = "\"cl\"" colon (unum >tok %parse_cluster);
+xoffset = "\"dx\"" colon (num >tok %parse_x_offset);
+yoffset = "\"dy\"" colon (num >tok %parse_y_offset);
+xadvance= "\"ax\"" colon (num >tok %parse_x_advance);
+yadvance= "\"ay\"" colon (num >tok %parse_y_advance);
+
+element = glyph | cluster | xoffset | yoffset | xadvance | yadvance;
+item =
+ ( '{' space* element (comma element)* space* '}')
+ >clear_item
+ @add_item
+ ;
+
+main := space* item (comma item)* space* (','|']')?;
+
+}%%
+
+static hb_bool_t
+_hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
+ const char *buf,
+ unsigned int buf_len,
+ const char **end_ptr,
+ hb_font_t *font)
+{
+ const char *p = buf, *pe = buf + buf_len;
+
+ /* Ensure we have positions. */
+ (void) hb_buffer_get_glyph_positions (buffer, nullptr);
+
+ while (p < pe && ISSPACE (*p))
+ p++;
+ if (p < pe && *p == (buffer->len ? ',' : '['))
+ {
+ *end_ptr = ++p;
+ }
+
+ const char *tok = nullptr;
+ int cs;
+ hb_glyph_info_t info = {0};
+ hb_glyph_position_t pos = {0};
+ %%{
+ write init;
+ write exec;
+ }%%
+
+ *end_ptr = p;
+
+ return p == pe && *(p-1) != ']';
+}
+
+#endif /* HB_BUFFER_DESERIALIZE_JSON_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text.hh b/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text.hh
index d2d8daae7e..67f0a1252f 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text.hh
@@ -29,7 +29,7 @@
#ifndef HB_BUFFER_DESERIALIZE_TEXT_HH
#define HB_BUFFER_DESERIALIZE_TEXT_HH
-#include "hb-private.hh"
+#include "hb.hh"
#line 36 "hb-buffer-deserialize-text.hh"
@@ -325,7 +325,7 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
const char *p = buf, *pe = buf + buf_len;
/* Ensure we have positions. */
- (void) hb_buffer_get_glyph_positions (buffer, NULL);
+ (void) hb_buffer_get_glyph_positions (buffer, nullptr);
while (p < pe && ISSPACE (*p))
p++;
@@ -334,7 +334,7 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
*end_ptr = ++p;
}
- const char *eof = pe, *tok = NULL;
+ const char *eof = pe, *tok = nullptr;
int cs;
hb_glyph_info_t info = {0};
hb_glyph_position_t pos = {0};
@@ -422,7 +422,7 @@ _resume:
#line 43 "hb-buffer-deserialize-text.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -434,7 +434,7 @@ _resume:
#line 43 "hb-buffer-deserialize-text.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -446,7 +446,7 @@ _resume:
#line 43 "hb-buffer-deserialize-text.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -458,7 +458,7 @@ _resume:
#line 43 "hb-buffer-deserialize-text.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -470,7 +470,7 @@ _resume:
#line 43 "hb-buffer-deserialize-text.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -499,7 +499,7 @@ _again:
#line 43 "hb-buffer-deserialize-text.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -511,7 +511,7 @@ _again:
#line 43 "hb-buffer-deserialize-text.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -523,7 +523,7 @@ _again:
#line 43 "hb-buffer-deserialize-text.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -535,7 +535,7 @@ _again:
#line 43 "hb-buffer-deserialize-text.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
@@ -547,7 +547,7 @@ _again:
#line 43 "hb-buffer-deserialize-text.rl"
{
buffer->add_info (info);
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return false;
buffer->pos[buffer->len - 1] = pos;
*end_ptr = p;
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text.rl b/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text.rl
new file mode 100644
index 0000000000..6268a6c503
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text.rl
@@ -0,0 +1,126 @@
+/*
+ * Copyright © 2013 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_BUFFER_DESERIALIZE_TEXT_HH
+#define HB_BUFFER_DESERIALIZE_TEXT_HH
+
+#include "hb.hh"
+
+%%{
+
+machine deserialize_text;
+alphtype unsigned char;
+write data;
+
+action clear_item {
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
+}
+
+action add_item {
+ buffer->add_info (info);
+ if (unlikely (!buffer->successful))
+ return false;
+ buffer->pos[buffer->len - 1] = pos;
+ *end_ptr = p;
+}
+
+action tok {
+ tok = p;
+}
+
+action parse_glyph {
+ if (!hb_font_glyph_from_string (font,
+ tok, p - tok,
+ &info.codepoint))
+ return false;
+}
+
+action parse_cluster { if (!parse_uint (tok, p, &info.cluster )) return false; }
+action parse_x_offset { if (!parse_int (tok, p, &pos.x_offset )) return false; }
+action parse_y_offset { if (!parse_int (tok, p, &pos.y_offset )) return false; }
+action parse_x_advance { if (!parse_int (tok, p, &pos.x_advance)) return false; }
+action parse_y_advance { if (!parse_int (tok, p, &pos.y_advance)) return false; }
+
+unum = '0' | [1-9] digit*;
+num = '-'? unum;
+
+glyph_id = unum;
+glyph_name = alpha (alnum|'_'|'.'|'-')*;
+
+glyph = (glyph_id | glyph_name) >tok %parse_glyph;
+cluster = '=' (unum >tok %parse_cluster);
+offsets = '@' (num >tok %parse_x_offset) ',' (num >tok %parse_y_offset );
+advances= '+' (num >tok %parse_x_advance) (',' (num >tok %parse_y_advance))?;
+item =
+ (
+ glyph
+ cluster?
+ offsets?
+ advances?
+ )
+ >clear_item
+ %add_item
+ ;
+
+main := space* item (space* '|' space* item)* space* ('|'|']')?;
+
+}%%
+
+static hb_bool_t
+_hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
+ const char *buf,
+ unsigned int buf_len,
+ const char **end_ptr,
+ hb_font_t *font)
+{
+ const char *p = buf, *pe = buf + buf_len;
+
+ /* Ensure we have positions. */
+ (void) hb_buffer_get_glyph_positions (buffer, nullptr);
+
+ while (p < pe && ISSPACE (*p))
+ p++;
+ if (p < pe && *p == (buffer->len ? '|' : '['))
+ {
+ *end_ptr = ++p;
+ }
+
+ const char *eof = pe, *tok = nullptr;
+ int cs;
+ hb_glyph_info_t info = {0};
+ hb_glyph_position_t pos = {0};
+ %%{
+ write init;
+ write exec;
+ }%%
+
+ *end_ptr = p;
+
+ return p == pe && *(p-1) != ']';
+}
+
+#endif /* HB_BUFFER_DESERIALIZE_TEXT_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-buffer-private.hh
deleted file mode 100644
index 97bdc1be30..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-buffer-private.hh
+++ /dev/null
@@ -1,388 +0,0 @@
-/*
- * Copyright © 1998-2004 David Turner and Werner Lemberg
- * Copyright © 2004,2007,2009,2010 Red Hat, Inc.
- * Copyright © 2011,2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_BUFFER_PRIVATE_HH
-#define HB_BUFFER_PRIVATE_HH
-
-#include "hb-private.hh"
-#include "hb-object-private.hh"
-#include "hb-unicode-private.hh"
-
-
-#ifndef HB_BUFFER_MAX_LEN_FACTOR
-#define HB_BUFFER_MAX_LEN_FACTOR 32
-#endif
-#ifndef HB_BUFFER_MAX_LEN_MIN
-#define HB_BUFFER_MAX_LEN_MIN 8192
-#endif
-#ifndef HB_BUFFER_MAX_LEN_DEFAULT
-#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
-#endif
-
-#ifndef HB_BUFFER_MAX_OPS_FACTOR
-#define HB_BUFFER_MAX_OPS_FACTOR 64
-#endif
-#ifndef HB_BUFFER_MAX_OPS_MIN
-#define HB_BUFFER_MAX_OPS_MIN 1024
-#endif
-#ifndef HB_BUFFER_MAX_OPS_DEFAULT
-#define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */
-#endif
-
-static_assert ((sizeof (hb_glyph_info_t) == 20), "");
-static_assert ((sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t)), "");
-
-HB_MARK_AS_FLAG_T (hb_buffer_flags_t);
-HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t);
-HB_MARK_AS_FLAG_T (hb_buffer_diff_flags_t);
-
-enum hb_buffer_scratch_flags_t {
- HB_BUFFER_SCRATCH_FLAG_DEFAULT = 0x00000000u,
- HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII = 0x00000001u,
- HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES = 0x00000002u,
- HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK = 0x00000004u,
- HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT = 0x00000008u,
- HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK = 0x00000010u,
-
- /* Reserved for complex shapers' internal use. */
- HB_BUFFER_SCRATCH_FLAG_COMPLEX0 = 0x01000000u,
- HB_BUFFER_SCRATCH_FLAG_COMPLEX1 = 0x02000000u,
- HB_BUFFER_SCRATCH_FLAG_COMPLEX2 = 0x04000000u,
- HB_BUFFER_SCRATCH_FLAG_COMPLEX3 = 0x08000000u,
-};
-HB_MARK_AS_FLAG_T (hb_buffer_scratch_flags_t);
-
-
-/*
- * hb_buffer_t
- */
-
-struct hb_buffer_t {
- hb_object_header_t header;
- ASSERT_POD ();
-
- /* Information about how the text in the buffer should be treated */
- hb_unicode_funcs_t *unicode; /* Unicode functions */
- hb_buffer_flags_t flags; /* BOT / EOT / etc. */
- hb_buffer_cluster_level_t cluster_level;
- hb_codepoint_t replacement; /* U+FFFD or something else. */
- hb_buffer_scratch_flags_t scratch_flags; /* Have space-flallback, etc. */
- unsigned int max_len; /* Maximum allowed len. */
- int max_ops; /* Maximum allowed operations. */
-
- /* Buffer contents */
- hb_buffer_content_type_t content_type;
- hb_segment_properties_t props; /* Script, language, direction */
-
- bool in_error; /* Allocation failed */
- bool have_output; /* Whether we have an output buffer going on */
- bool have_positions; /* Whether we have positions */
-
- unsigned int idx; /* Cursor into ->info and ->pos arrays */
- unsigned int len; /* Length of ->info and ->pos arrays */
- unsigned int out_len; /* Length of ->out array if have_output */
-
- unsigned int allocated; /* Length of allocated arrays */
- hb_glyph_info_t *info;
- hb_glyph_info_t *out_info;
- hb_glyph_position_t *pos;
-
- unsigned int serial;
-
- /* Text before / after the main buffer contents.
- * Always in Unicode, and ordered outward.
- * Index 0 is for "pre-context", 1 for "post-context". */
- static const unsigned int CONTEXT_LENGTH = 5;
- hb_codepoint_t context[2][CONTEXT_LENGTH];
- unsigned int context_len[2];
-
- /* Debugging API */
- hb_buffer_message_func_t message_func;
- void *message_data;
- hb_destroy_func_t message_destroy;
-
- /* Internal debugging. */
- /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */
-#ifndef HB_NDEBUG
- uint8_t allocated_var_bits;
-#endif
-
-
- /* Methods */
-
- inline void allocate_var (unsigned int start, unsigned int count)
- {
-#ifndef HB_NDEBUG
- unsigned int end = start + count;
- assert (end <= 8);
- unsigned int bits = (1u<<end) - (1u<<start);
- assert (0 == (allocated_var_bits & bits));
- allocated_var_bits |= bits;
-#endif
- }
- inline void deallocate_var (unsigned int start, unsigned int count)
- {
-#ifndef HB_NDEBUG
- unsigned int end = start + count;
- assert (end <= 8);
- unsigned int bits = (1u<<end) - (1u<<start);
- assert (bits == (allocated_var_bits & bits));
- allocated_var_bits &= ~bits;
-#endif
- }
- inline void assert_var (unsigned int start, unsigned int count)
- {
-#ifndef HB_NDEBUG
- unsigned int end = start + count;
- assert (end <= 8);
- unsigned int bits = (1u<<end) - (1u<<start);
- assert (bits == (allocated_var_bits & bits));
-#endif
- }
- inline void deallocate_var_all (void)
- {
-#ifndef HB_NDEBUG
- allocated_var_bits = 0;
-#endif
- }
-
- inline hb_glyph_info_t &cur (unsigned int i = 0) { return info[idx + i]; }
- inline hb_glyph_info_t cur (unsigned int i = 0) const { return info[idx + i]; }
-
- inline hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; }
- inline hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; }
-
- inline hb_glyph_info_t &prev (void) { return out_info[out_len ? out_len - 1 : 0]; }
- inline hb_glyph_info_t prev (void) const { return out_info[out_len ? out_len - 1 : 0]; }
-
- inline bool has_separate_output (void) const { return info != out_info; }
-
-
- HB_INTERNAL void reset (void);
- HB_INTERNAL void clear (void);
-
- inline unsigned int backtrack_len (void) const
- { return have_output? out_len : idx; }
- inline unsigned int lookahead_len (void) const
- { return len - idx; }
- inline unsigned int next_serial (void) { return serial++; }
-
- HB_INTERNAL void add (hb_codepoint_t codepoint,
- unsigned int cluster);
- HB_INTERNAL void add_info (const hb_glyph_info_t &glyph_info);
-
- HB_INTERNAL void reverse_range (unsigned int start, unsigned int end);
- HB_INTERNAL void reverse (void);
- HB_INTERNAL void reverse_clusters (void);
- HB_INTERNAL void guess_segment_properties (void);
-
- HB_INTERNAL void swap_buffers (void);
- HB_INTERNAL void remove_output (void);
- HB_INTERNAL void clear_output (void);
- HB_INTERNAL void clear_positions (void);
-
- HB_INTERNAL void replace_glyphs (unsigned int num_in,
- unsigned int num_out,
- const hb_codepoint_t *glyph_data);
-
- HB_INTERNAL void replace_glyph (hb_codepoint_t glyph_index);
- /* Makes a copy of the glyph at idx to output and replace glyph_index */
- HB_INTERNAL void output_glyph (hb_codepoint_t glyph_index);
- HB_INTERNAL void output_info (const hb_glyph_info_t &glyph_info);
- /* Copies glyph at idx to output but doesn't advance idx */
- HB_INTERNAL void copy_glyph (void);
- HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */
- /* Copies glyph at idx to output and advance idx.
- * If there's no output, just advance idx. */
- inline void
- next_glyph (void)
- {
- if (have_output)
- {
- if (unlikely (out_info != info || out_len != idx)) {
- if (unlikely (!make_room_for (1, 1))) return;
- out_info[out_len] = info[idx];
- }
- out_len++;
- }
-
- idx++;
- }
-
- /* Advance idx without copying to output. */
- inline void skip_glyph (void) { idx++; }
-
- inline void reset_masks (hb_mask_t mask)
- {
- for (unsigned int j = 0; j < len; j++)
- info[j].mask = mask;
- }
- inline void add_masks (hb_mask_t mask)
- {
- for (unsigned int j = 0; j < len; j++)
- info[j].mask |= mask;
- }
- HB_INTERNAL void set_masks (hb_mask_t value, hb_mask_t mask,
- unsigned int cluster_start, unsigned int cluster_end);
-
- inline void merge_clusters (unsigned int start, unsigned int end)
- {
- if (end - start < 2)
- return;
- merge_clusters_impl (start, end);
- }
- HB_INTERNAL void merge_clusters_impl (unsigned int start, unsigned int end);
- HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end);
- /* Merge clusters for deleting current glyph, and skip it. */
- HB_INTERNAL void delete_glyph (void);
-
- inline void unsafe_to_break (unsigned int start,
- unsigned int end)
- {
- if (end - start < 2)
- return;
- unsafe_to_break_impl (start, end);
- }
- HB_INTERNAL void unsafe_to_break_impl (unsigned int start, unsigned int end);
- HB_INTERNAL void unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end);
-
-
- /* Internal methods */
- HB_INTERNAL bool enlarge (unsigned int size);
-
- inline bool ensure (unsigned int size)
- { return likely (!size || size < allocated) ? true : enlarge (size); }
-
- inline bool ensure_inplace (unsigned int size)
- { return likely (!size || size < allocated); }
-
- HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out);
- HB_INTERNAL bool shift_forward (unsigned int count);
-
- typedef long scratch_buffer_t;
- HB_INTERNAL scratch_buffer_t *get_scratch_buffer (unsigned int *size);
-
- inline void clear_context (unsigned int side) { context_len[side] = 0; }
-
- HB_INTERNAL void sort (unsigned int start, unsigned int end, int(*compar)(const hb_glyph_info_t *, const hb_glyph_info_t *));
-
- inline bool messaging (void) { return unlikely (message_func); }
- inline bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4)
- {
- if (!messaging ())
- return true;
- va_list ap;
- va_start (ap, fmt);
- bool ret = message_impl (font, fmt, ap);
- va_end (ap);
- return ret;
- }
- HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0);
-
- static inline void
- set_cluster (hb_glyph_info_t &info, unsigned int cluster, unsigned int mask = 0)
- {
- if (info.cluster != cluster)
- {
- if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
- info.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
- else
- info.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
- }
- info.cluster = cluster;
- }
-
- inline int
- _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *info,
- unsigned int start, unsigned int end,
- unsigned int cluster) const
- {
- for (unsigned int i = start; i < end; i++)
- cluster = MIN<unsigned int> (cluster, info[i].cluster);
- return cluster;
- }
- inline void
- _unsafe_to_break_set_mask (hb_glyph_info_t *info,
- unsigned int start, unsigned int end,
- unsigned int cluster)
- {
- for (unsigned int i = start; i < end; i++)
- if (cluster != info[i].cluster)
- {
- scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK;
- info[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
- }
- }
-
- inline void
- unsafe_to_break_all (void)
- {
- for (unsigned int i = 0; i < len; i++)
- info[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
- }
- inline void
- safe_to_break_all (void)
- {
- for (unsigned int i = 0; i < len; i++)
- info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
- }
-};
-
-
-/* Loop over clusters. Duplicated in foreach_syllable(). */
-#define foreach_cluster(buffer, start, end) \
- for (unsigned int \
- _count = buffer->len, \
- start = 0, end = _count ? _next_cluster (buffer, 0) : 0; \
- start < _count; \
- start = end, end = _next_cluster (buffer, start))
-
-static inline unsigned int
-_next_cluster (hb_buffer_t *buffer, unsigned int start)
-{
- hb_glyph_info_t *info = buffer->info;
- unsigned int count = buffer->len;
-
- unsigned int cluster = info[start].cluster;
- while (++start < count && cluster == info[start].cluster)
- ;
-
- return start;
-}
-
-
-#define HB_BUFFER_XALLOCATE_VAR(b, func, var) \
- b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
- sizeof (b->info[0].var))
-#define HB_BUFFER_ALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var ())
-#define HB_BUFFER_DEALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var ())
-#define HB_BUFFER_ASSERT_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, assert_var, var ())
-
-
-#endif /* HB_BUFFER_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer-serialize.cc b/src/3rdparty/harfbuzz-ng/src/hb-buffer-serialize.cc
index ea62e9ffdb..e64eb0ee65 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-buffer-serialize.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer-serialize.cc
@@ -24,7 +24,11 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-buffer-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_BUFFER_SERIALIZE
+
+#include "hb-buffer.hh"
static const char *serialize_formats[] = {
@@ -44,7 +48,7 @@ static const char *serialize_formats[] = {
* Since: 0.9.7
**/
const char **
-hb_buffer_serialize_list_formats (void)
+hb_buffer_serialize_list_formats ()
{
return serialize_formats;
}
@@ -58,7 +62,7 @@ hb_buffer_serialize_list_formats (void)
* @str is a valid buffer serialization format, use
* hb_buffer_serialize_list_formats() to get the list of supported formats.
*
- * Return value:
+ * Return value:
* The parsed #hb_buffer_serialize_format_t.
*
* Since: 0.9.7
@@ -85,7 +89,7 @@ hb_buffer_serialize_format_from_string (const char *str, int len)
const char *
hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format)
{
- switch (format)
+ switch ((unsigned) format)
{
case HB_BUFFER_SERIALIZE_FORMAT_TEXT: return serialize_formats[0];
case HB_BUFFER_SERIALIZE_FORMAT_JSON: return serialize_formats[1];
@@ -109,6 +113,7 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
*buf_consumed = 0;
+ hb_position_t x = 0, y = 0;
for (unsigned int i = start; i < end; i++)
{
char b[1024];
@@ -130,40 +135,41 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
hb_font_glyph_to_string (font, info[i].codepoint, g, sizeof (g));
*p++ = '"';
for (char *q = g; *q; q++) {
- if (*q == '"')
+ if (*q == '"')
*p++ = '\\';
*p++ = *q;
}
*p++ = '"';
}
else
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint));
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint));
if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) {
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster));
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster));
}
if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
{
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d",
- pos[i].x_offset, pos[i].y_offset));
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d",
- pos[i].x_advance, pos[i].y_advance));
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d",
+ x+pos[i].x_offset, y+pos[i].y_offset));
+ if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d",
+ pos[i].x_advance, pos[i].y_advance));
}
if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
{
if (info[i].mask & HB_GLYPH_FLAG_DEFINED)
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED));
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED));
}
if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
{
hb_glyph_extents_t extents;
hb_font_get_glyph_extents(font, info[i].codepoint, &extents);
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d",
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d",
extents.x_bearing, extents.y_bearing));
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d",
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d",
extents.width, extents.height));
}
@@ -179,6 +185,12 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
*buf = '\0';
} else
return i - start;
+
+ if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+ {
+ x += pos[i].x_advance;
+ y += pos[i].y_advance;
+ }
}
return end - start;
@@ -199,6 +211,7 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
*buf_consumed = 0;
+ hb_position_t x = 0, y = 0;
for (unsigned int i = start; i < end; i++)
{
char b[1024];
@@ -215,34 +228,37 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
p += strlen (p);
}
else
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint));
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint));
if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) {
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster));
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster));
}
if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
{
- if (pos[i].x_offset || pos[i].y_offset)
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", pos[i].x_offset, pos[i].y_offset));
-
- *p++ = '+';
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance));
- if (pos[i].y_advance)
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance));
+ if (x+pos[i].x_offset || y+pos[i].y_offset)
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset));
+
+ if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+ {
+ *p++ = '+';
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance));
+ if (pos[i].y_advance)
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance));
+ }
}
if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
{
- if (info[i].mask &HB_GLYPH_FLAG_DEFINED)
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED));
+ if (info[i].mask & HB_GLYPH_FLAG_DEFINED)
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED));
}
if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
{
hb_glyph_extents_t extents;
hb_font_get_glyph_extents(font, info[i].codepoint, &extents);
- p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "<%d,%d,%d,%d>", extents.x_bearing, extents.y_bearing, extents.width, extents.height));
+ p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "<%d,%d,%d,%d>", extents.x_bearing, extents.y_bearing, extents.width, extents.height));
}
unsigned int l = p - b;
@@ -255,6 +271,12 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
*buf = '\0';
} else
return i - start;
+
+ if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+ {
+ x += pos[i].x_advance;
+ y += pos[i].y_advance;
+ }
}
return end - start;
@@ -301,7 +323,7 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
* ## json
* TODO.
*
- * Return value:
+ * Return value:
* The number of serialized items.
*
* Since: 0.9.7
@@ -357,43 +379,24 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
}
}
-
-static hb_bool_t
-parse_uint (const char *pp, const char *end, uint32_t *pv)
+static bool
+parse_int (const char *pp, const char *end, int32_t *pv)
{
- char buf[32];
- unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp));
- strncpy (buf, pp, len);
- buf[len] = '\0';
-
- char *p = buf;
- char *pend = p;
- uint32_t v;
-
- errno = 0;
- v = strtol (p, &pend, 10);
- if (errno || p == pend || pend - p != end - pp)
+ int v;
+ const char *p = pp;
+ if (unlikely (!hb_parse_int (&p, end, &v, true/* whole buffer */)))
return false;
*pv = v;
return true;
}
-static hb_bool_t
-parse_int (const char *pp, const char *end, int32_t *pv)
+static bool
+parse_uint (const char *pp, const char *end, uint32_t *pv)
{
- char buf[32];
- unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp));
- strncpy (buf, pp, len);
- buf[len] = '\0';
-
- char *p = buf;
- char *pend = p;
- int32_t v;
-
- errno = 0;
- v = strtol (p, &pend, 10);
- if (errno || p == pend || pend - p != end - pp)
+ unsigned int v;
+ const char *p = pp;
+ if (unlikely (!hb_parse_uint (&p, end, &v, true/* whole buffer */)))
return false;
*pv = v;
@@ -407,14 +410,14 @@ parse_int (const char *pp, const char *end, int32_t *pv)
* hb_buffer_deserialize_glyphs:
* @buffer: an #hb_buffer_t buffer.
* @buf: (array length=buf_len):
- * @buf_len:
+ * @buf_len:
* @end_ptr: (out):
- * @font:
- * @format:
+ * @font:
+ * @format:
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.7
**/
@@ -422,8 +425,8 @@ hb_bool_t
hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
const char *buf,
int buf_len, /* -1 means nul-terminated */
- const char **end_ptr, /* May be nullptr */
- hb_font_t *font, /* May be nullptr */
+ const char **end_ptr, /* May be NULL */
+ hb_font_t *font, /* May be NULL */
hb_buffer_serialize_format_t format)
{
const char *end;
@@ -466,3 +469,6 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
}
}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc b/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc
index 7ead43b018..6131c86177 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc
@@ -27,20 +27,21 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-buffer-private.hh"
-#include "hb-utf-private.hh"
+#include "hb-buffer.hh"
+#include "hb-utf.hh"
/**
* SECTION: hb-buffer
- * @title: Buffers
+ * @title: hb-buffer
* @short_description: Input and output buffers
* @include: hb.h
*
* Buffers serve dual role in HarfBuzz; they hold the input characters that are
- * passed hb_shape(), and after shaping they hold the output glyphs.
+ * passed to hb_shape(), and after shaping they hold the output glyphs.
**/
+
/**
* hb_segment_properties_equal:
* @a: first #hb_segment_properties_t to compare.
@@ -111,11 +112,11 @@ hb_segment_properties_hash (const hb_segment_properties_t *p)
bool
hb_buffer_t::enlarge (unsigned int size)
{
- if (unlikely (in_error))
+ if (unlikely (!successful))
return false;
if (unlikely (size > max_len))
{
- in_error = true;
+ successful = false;
return false;
}
@@ -124,14 +125,14 @@ hb_buffer_t::enlarge (unsigned int size)
hb_glyph_info_t *new_info = nullptr;
bool separate_out = out_info != info;
- if (unlikely (_hb_unsigned_int_mul_overflows (size, sizeof (info[0]))))
+ if (unlikely (hb_unsigned_mul_overflows (size, sizeof (info[0]))))
goto done;
while (size >= new_allocated)
new_allocated += (new_allocated >> 1) + 32;
static_assert ((sizeof (info[0]) == sizeof (pos[0])), "");
- if (unlikely (_hb_unsigned_int_mul_overflows (new_allocated, sizeof (info[0]))))
+ if (unlikely (hb_unsigned_mul_overflows (new_allocated, sizeof (info[0]))))
goto done;
new_pos = (hb_glyph_position_t *) realloc (pos, new_allocated * sizeof (pos[0]));
@@ -139,7 +140,7 @@ hb_buffer_t::enlarge (unsigned int size)
done:
if (unlikely (!new_pos || !new_info))
- in_error = true;
+ successful = false;
if (likely (new_pos))
pos = new_pos;
@@ -148,10 +149,10 @@ done:
info = new_info;
out_info = separate_out ? (hb_glyph_info_t *) pos : info;
- if (likely (!in_error))
+ if (likely (successful))
allocated = new_allocated;
- return likely (!in_error);
+ return likely (successful);
}
bool
@@ -182,7 +183,11 @@ hb_buffer_t::shift_forward (unsigned int count)
if (idx + count > len)
{
/* Under memory failure we might expose this area. At least
- * clean it up. Oh well... */
+ * clean it up. Oh well...
+ *
+ * Ideally, we should at least set Default_Ignorable bits on
+ * these, as well as consistent cluster values. But the former
+ * is layering violation... */
memset (info + len, 0, (idx + count - len) * sizeof (info[0]));
}
len += count;
@@ -210,23 +215,24 @@ hb_buffer_t::get_scratch_buffer (unsigned int *size)
/* HarfBuzz-Internal API */
void
-hb_buffer_t::reset (void)
+hb_buffer_t::reset ()
{
- if (unlikely (hb_object_is_inert (this)))
+ if (unlikely (hb_object_is_immutable (this)))
return;
hb_unicode_funcs_destroy (unicode);
- unicode = hb_unicode_funcs_get_default ();
+ unicode = hb_unicode_funcs_reference (hb_unicode_funcs_get_default ());
flags = HB_BUFFER_FLAG_DEFAULT;
replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT;
+ invisible = 0;
clear ();
}
void
-hb_buffer_t::clear (void)
+hb_buffer_t::clear ()
{
- if (unlikely (hb_object_is_inert (this)))
+ if (unlikely (hb_object_is_immutable (this)))
return;
hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT;
@@ -234,7 +240,7 @@ hb_buffer_t::clear (void)
scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
content_type = HB_BUFFER_CONTENT_TYPE_INVALID;
- in_error = false;
+ successful = true;
have_output = false;
have_positions = false;
@@ -281,9 +287,9 @@ hb_buffer_t::add_info (const hb_glyph_info_t &glyph_info)
void
-hb_buffer_t::remove_output (void)
+hb_buffer_t::remove_output ()
{
- if (unlikely (hb_object_is_inert (this)))
+ if (unlikely (hb_object_is_immutable (this)))
return;
have_output = false;
@@ -294,9 +300,9 @@ hb_buffer_t::remove_output (void)
}
void
-hb_buffer_t::clear_output (void)
+hb_buffer_t::clear_output ()
{
- if (unlikely (hb_object_is_inert (this)))
+ if (unlikely (hb_object_is_immutable (this)))
return;
have_output = true;
@@ -307,9 +313,9 @@ hb_buffer_t::clear_output (void)
}
void
-hb_buffer_t::clear_positions (void)
+hb_buffer_t::clear_positions ()
{
- if (unlikely (hb_object_is_inert (this)))
+ if (unlikely (hb_object_is_immutable (this)))
return;
have_output = false;
@@ -318,13 +324,13 @@ hb_buffer_t::clear_positions (void)
out_len = 0;
out_info = info;
- memset (pos, 0, sizeof (pos[0]) * len);
+ hb_memset (pos, 0, sizeof (pos[0]) * len);
}
void
-hb_buffer_t::swap_buffers (void)
+hb_buffer_t::swap_buffers ()
{
- if (unlikely (in_error)) return;
+ if (unlikely (!successful)) return;
assert (have_output);
have_output = false;
@@ -354,6 +360,8 @@ hb_buffer_t::replace_glyphs (unsigned int num_in,
{
if (unlikely (!make_room_for (num_in, num_out))) return;
+ assert (idx + num_in <= len);
+
merge_clusters (idx, idx + num_in);
hb_glyph_info_t orig_info = info[idx];
@@ -369,37 +377,6 @@ hb_buffer_t::replace_glyphs (unsigned int num_in,
out_len += num_out;
}
-void
-hb_buffer_t::output_glyph (hb_codepoint_t glyph_index)
-{
- if (unlikely (!make_room_for (0, 1))) return;
-
- out_info[out_len] = info[idx];
- out_info[out_len].codepoint = glyph_index;
-
- out_len++;
-}
-
-void
-hb_buffer_t::output_info (const hb_glyph_info_t &glyph_info)
-{
- if (unlikely (!make_room_for (0, 1))) return;
-
- out_info[out_len] = glyph_info;
-
- out_len++;
-}
-
-void
-hb_buffer_t::copy_glyph (void)
-{
- if (unlikely (!make_room_for (0, 1))) return;
-
- out_info[out_len] = info[idx];
-
- out_len++;
-}
-
bool
hb_buffer_t::move_to (unsigned int i)
{
@@ -409,7 +386,7 @@ hb_buffer_t::move_to (unsigned int i)
idx = i;
return true;
}
- if (unlikely (in_error))
+ if (unlikely (!successful))
return false;
assert (i <= out_len + (len - idx));
@@ -429,8 +406,14 @@ hb_buffer_t::move_to (unsigned int i)
unsigned int count = out_len - i;
/* This will blow in our face if memory allocation fails later
- * in this same lookup... */
- if (unlikely (idx < count && !shift_forward (count + 32))) return false;
+ * in this same lookup...
+ *
+ * We used to shift with extra 32 items, instead of the 0 below.
+ * But that would leave empty slots in the buffer in case of allocation
+ * failures. Setting to zero for now to avoid other problems (see
+ * comments in shift_forward(). This can cause O(N^2) behavior more
+ * severely than adding 32 empty slots can... */
+ if (unlikely (idx < count && !shift_forward (count + 0))) return false;
assert (idx >= count);
@@ -442,19 +425,6 @@ hb_buffer_t::move_to (unsigned int i)
return true;
}
-void
-hb_buffer_t::replace_glyph (hb_codepoint_t glyph_index)
-{
- if (unlikely (out_info != info || out_len != idx)) {
- if (unlikely (!make_room_for (1, 1))) return;
- out_info[out_len] = info[idx];
- }
- out_info[out_len].codepoint = glyph_index;
-
- idx++;
- out_len++;
-}
-
void
hb_buffer_t::set_masks (hb_mask_t value,
@@ -510,7 +480,7 @@ hb_buffer_t::reverse_range (unsigned int start,
}
void
-hb_buffer_t::reverse (void)
+hb_buffer_t::reverse ()
{
if (unlikely (!len))
return;
@@ -519,7 +489,7 @@ hb_buffer_t::reverse (void)
}
void
-hb_buffer_t::reverse_clusters (void)
+hb_buffer_t::reverse_clusters ()
{
unsigned int i, start, count, last_cluster;
@@ -554,7 +524,7 @@ hb_buffer_t::merge_clusters_impl (unsigned int start,
unsigned int cluster = info[start].cluster;
for (unsigned int i = start + 1; i < end; i++)
- cluster = MIN<unsigned int> (cluster, info[i].cluster);
+ cluster = hb_min (cluster, info[i].cluster);
/* Extend end */
while (end < len && info[end - 1].cluster == info[end].cluster)
@@ -585,7 +555,7 @@ hb_buffer_t::merge_out_clusters (unsigned int start,
unsigned int cluster = out_info[start].cluster;
for (unsigned int i = start + 1; i < end; i++)
- cluster = MIN<unsigned int> (cluster, out_info[i].cluster);
+ cluster = hb_min (cluster, out_info[i].cluster);
/* Extend start */
while (start && out_info[start - 1].cluster == out_info[start].cluster)
@@ -666,7 +636,7 @@ hb_buffer_t::unsafe_to_break_from_outbuffer (unsigned int start, unsigned int en
}
void
-hb_buffer_t::guess_segment_properties (void)
+hb_buffer_t::guess_segment_properties ()
{
assert (content_type == HB_BUFFER_CONTENT_TYPE_UNICODE ||
(!len && content_type == HB_BUFFER_CONTENT_TYPE_INVALID));
@@ -678,8 +648,8 @@ hb_buffer_t::guess_segment_properties (void)
if (likely (script != HB_SCRIPT_COMMON &&
script != HB_SCRIPT_INHERITED &&
script != HB_SCRIPT_UNKNOWN)) {
- props.script = script;
- break;
+ props.script = script;
+ break;
}
}
}
@@ -687,6 +657,8 @@ hb_buffer_t::guess_segment_properties (void)
/* If direction is set to INVALID, guess from script */
if (props.direction == HB_DIRECTION_INVALID) {
props.direction = hb_script_get_horizontal_direction (props.script);
+ if (props.direction == HB_DIRECTION_INVALID)
+ props.direction = HB_DIRECTION_LTR;
}
/* If language is not set, use default language from locale */
@@ -699,6 +671,29 @@ hb_buffer_t::guess_segment_properties (void)
/* Public API */
+DEFINE_NULL_INSTANCE (hb_buffer_t) =
+{
+ HB_OBJECT_HEADER_STATIC,
+
+ const_cast<hb_unicode_funcs_t *> (&_hb_Null_hb_unicode_funcs_t),
+ HB_BUFFER_FLAG_DEFAULT,
+ HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
+ HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
+ 0, /* invisible */
+ HB_BUFFER_SCRATCH_FLAG_DEFAULT,
+ HB_BUFFER_MAX_LEN_DEFAULT,
+ HB_BUFFER_MAX_OPS_DEFAULT,
+
+ HB_BUFFER_CONTENT_TYPE_INVALID,
+ HB_SEGMENT_PROPERTIES_DEFAULT,
+ false, /* successful */
+ true, /* have_output */
+ true /* have_positions */
+
+ /* Zero is good enough for everything else. */
+};
+
+
/**
* hb_buffer_create: (Xconstructor)
*
@@ -714,7 +709,7 @@ hb_buffer_t::guess_segment_properties (void)
* Since: 0.9.2
**/
hb_buffer_t *
-hb_buffer_create (void)
+hb_buffer_create ()
{
hb_buffer_t *buffer;
@@ -732,36 +727,16 @@ hb_buffer_create (void)
/**
* hb_buffer_get_empty:
*
- *
+ *
*
* Return value: (transfer full):
*
* Since: 0.9.2
**/
hb_buffer_t *
-hb_buffer_get_empty (void)
+hb_buffer_get_empty ()
{
- static const hb_buffer_t _hb_buffer_nil = {
- HB_OBJECT_HEADER_STATIC,
-
- const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil),
- HB_BUFFER_FLAG_DEFAULT,
- HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
- HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
- HB_BUFFER_SCRATCH_FLAG_DEFAULT,
- HB_BUFFER_MAX_LEN_DEFAULT,
- HB_BUFFER_MAX_OPS_DEFAULT,
-
- HB_BUFFER_CONTENT_TYPE_INVALID,
- HB_SEGMENT_PROPERTIES_DEFAULT,
- true, /* in_error */
- true, /* have_output */
- true /* have_positions */
-
- /* Zero is good enough for everything else. */
- };
-
- return const_cast<hb_buffer_t *> (&_hb_buffer_nil);
+ return const_cast<hb_buffer_t *> (&Null(hb_buffer_t));
}
/**
@@ -801,8 +776,10 @@ hb_buffer_destroy (hb_buffer_t *buffer)
free (buffer->info);
free (buffer->pos);
+#ifndef HB_NO_BUFFER_MESSAGE
if (buffer->message_destroy)
buffer->message_destroy (buffer->message_data);
+#endif
free (buffer);
}
@@ -810,14 +787,14 @@ hb_buffer_destroy (hb_buffer_t *buffer)
/**
* hb_buffer_set_user_data: (skip)
* @buffer: an #hb_buffer_t.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -834,11 +811,11 @@ hb_buffer_set_user_data (hb_buffer_t *buffer,
/**
* hb_buffer_get_user_data: (skip)
* @buffer: an #hb_buffer_t.
- * @key:
+ * @key:
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.2
**/
@@ -888,9 +865,9 @@ hb_buffer_get_content_type (hb_buffer_t *buffer)
/**
* hb_buffer_set_unicode_funcs:
* @buffer: an #hb_buffer_t.
- * @unicode_funcs:
+ * @unicode_funcs:
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -898,13 +875,12 @@ void
hb_buffer_set_unicode_funcs (hb_buffer_t *buffer,
hb_unicode_funcs_t *unicode_funcs)
{
- if (unlikely (hb_object_is_inert (buffer)))
+ if (unlikely (hb_object_is_immutable (buffer)))
return;
if (!unicode_funcs)
unicode_funcs = hb_unicode_funcs_get_default ();
-
hb_unicode_funcs_reference (unicode_funcs);
hb_unicode_funcs_destroy (buffer->unicode);
buffer->unicode = unicode_funcs;
@@ -914,9 +890,9 @@ hb_buffer_set_unicode_funcs (hb_buffer_t *buffer,
* hb_buffer_get_unicode_funcs:
* @buffer: an #hb_buffer_t.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -946,7 +922,7 @@ hb_buffer_set_direction (hb_buffer_t *buffer,
hb_direction_t direction)
{
- if (unlikely (hb_object_is_inert (buffer)))
+ if (unlikely (hb_object_is_immutable (buffer)))
return;
buffer->props.direction = direction;
@@ -990,7 +966,7 @@ void
hb_buffer_set_script (hb_buffer_t *buffer,
hb_script_t script)
{
- if (unlikely (hb_object_is_inert (buffer)))
+ if (unlikely (hb_object_is_immutable (buffer)))
return;
buffer->props.script = script;
@@ -1025,7 +1001,7 @@ hb_buffer_get_script (hb_buffer_t *buffer)
* are orthogonal to the scripts, and though they are related, they are
* different concepts and should not be confused with each other.
*
- * Use hb_language_from_string() to convert from ISO 639 language codes to
+ * Use hb_language_from_string() to convert from BCP 47 language tags to
* #hb_language_t.
*
* Since: 0.9.2
@@ -1034,7 +1010,7 @@ void
hb_buffer_set_language (hb_buffer_t *buffer,
hb_language_t language)
{
- if (unlikely (hb_object_is_inert (buffer)))
+ if (unlikely (hb_object_is_immutable (buffer)))
return;
buffer->props.language = language;
@@ -1072,7 +1048,7 @@ void
hb_buffer_set_segment_properties (hb_buffer_t *buffer,
const hb_segment_properties_t *props)
{
- if (unlikely (hb_object_is_inert (buffer)))
+ if (unlikely (hb_object_is_immutable (buffer)))
return;
buffer->props = *props;
@@ -1108,7 +1084,7 @@ void
hb_buffer_set_flags (hb_buffer_t *buffer,
hb_buffer_flags_t flags)
{
- if (unlikely (hb_object_is_inert (buffer)))
+ if (unlikely (hb_object_is_immutable (buffer)))
return;
buffer->flags = flags;
@@ -1120,7 +1096,7 @@ hb_buffer_set_flags (hb_buffer_t *buffer,
*
* See hb_buffer_set_flags().
*
- * Return value:
+ * Return value:
* The @buffer flags.
*
* Since: 0.9.7
@@ -1134,9 +1110,9 @@ hb_buffer_get_flags (hb_buffer_t *buffer)
/**
* hb_buffer_set_cluster_level:
* @buffer: an #hb_buffer_t.
- * @cluster_level:
+ * @cluster_level:
+ *
*
- *
*
* Since: 0.9.42
**/
@@ -1144,7 +1120,7 @@ void
hb_buffer_set_cluster_level (hb_buffer_t *buffer,
hb_buffer_cluster_level_t cluster_level)
{
- if (unlikely (hb_object_is_inert (buffer)))
+ if (unlikely (hb_object_is_immutable (buffer)))
return;
buffer->cluster_level = cluster_level;
@@ -1154,9 +1130,9 @@ hb_buffer_set_cluster_level (hb_buffer_t *buffer,
* hb_buffer_get_cluster_level:
* @buffer: an #hb_buffer_t.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.42
**/
@@ -1183,7 +1159,7 @@ void
hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer,
hb_codepoint_t replacement)
{
- if (unlikely (hb_object_is_inert (buffer)))
+ if (unlikely (hb_object_is_immutable (buffer)))
return;
buffer->replacement = replacement;
@@ -1195,7 +1171,7 @@ hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer,
*
* See hb_buffer_set_replacement_codepoint().
*
- * Return value:
+ * Return value:
* The @buffer replacement #hb_codepoint_t.
*
* Since: 0.9.31
@@ -1208,6 +1184,46 @@ hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer)
/**
+ * hb_buffer_set_invisible_glyph:
+ * @buffer: an #hb_buffer_t.
+ * @invisible: the invisible #hb_codepoint_t
+ *
+ * Sets the #hb_codepoint_t that replaces invisible characters in
+ * the shaping result. If set to zero (default), the glyph for the
+ * U+0020 SPACE character is used. Otherwise, this value is used
+ * verbatim.
+ *
+ * Since: 2.0.0
+ **/
+void
+hb_buffer_set_invisible_glyph (hb_buffer_t *buffer,
+ hb_codepoint_t invisible)
+{
+ if (unlikely (hb_object_is_immutable (buffer)))
+ return;
+
+ buffer->invisible = invisible;
+}
+
+/**
+ * hb_buffer_get_invisible_glyph:
+ * @buffer: an #hb_buffer_t.
+ *
+ * See hb_buffer_set_invisible_glyph().
+ *
+ * Return value:
+ * The @buffer invisible #hb_codepoint_t.
+ *
+ * Since: 2.0.0
+ **/
+hb_codepoint_t
+hb_buffer_get_invisible_glyph (hb_buffer_t *buffer)
+{
+ return buffer->invisible;
+}
+
+
+/**
* hb_buffer_reset:
* @buffer: an #hb_buffer_t.
*
@@ -1269,7 +1285,7 @@ hb_buffer_pre_allocate (hb_buffer_t *buffer, unsigned int size)
hb_bool_t
hb_buffer_allocation_successful (hb_buffer_t *buffer)
{
- return !buffer->in_error;
+ return buffer->successful;
}
/**
@@ -1306,7 +1322,7 @@ hb_buffer_add (hb_buffer_t *buffer,
* Similar to hb_buffer_pre_allocate(), but clears any new items added at the
* end.
*
- * Return value:
+ * Return value:
* %true if @buffer memory allocation succeeded, %false otherwise.
*
* Since: 0.9.2
@@ -1315,7 +1331,7 @@ hb_bool_t
hb_buffer_set_length (hb_buffer_t *buffer,
unsigned int length)
{
- if (unlikely (hb_object_is_inert (buffer)))
+ if (unlikely (hb_object_is_immutable (buffer)))
return length == 0;
if (!buffer->ensure (length))
@@ -1374,7 +1390,7 @@ hb_buffer_get_length (hb_buffer_t *buffer)
**/
hb_glyph_info_t *
hb_buffer_get_glyph_infos (hb_buffer_t *buffer,
- unsigned int *length)
+ unsigned int *length)
{
if (length)
*length = buffer->len;
@@ -1398,7 +1414,7 @@ hb_buffer_get_glyph_infos (hb_buffer_t *buffer,
**/
hb_glyph_position_t *
hb_buffer_get_glyph_positions (hb_buffer_t *buffer,
- unsigned int *length)
+ unsigned int *length)
{
if (!buffer->have_positions)
buffer->clear_positions ();
@@ -1489,11 +1505,15 @@ hb_buffer_reverse_clusters (hb_buffer_t *buffer)
* Next, if buffer direction is not set (ie. is %HB_DIRECTION_INVALID),
* it will be set to the natural horizontal direction of the
* buffer script as returned by hb_script_get_horizontal_direction().
+ * If hb_script_get_horizontal_direction() returns %HB_DIRECTION_INVALID,
+ * then %HB_DIRECTION_LTR is used.
*
* Finally, if buffer language is not set (ie. is %HB_LANGUAGE_INVALID),
* it will be set to the process's default language as returned by
* hb_language_get_default(). This may change in the future by
* taking buffer script into consideration when choosing a language.
+ * Note that hb_language_get_default() is NOT threadsafe the first time
+ * it is called. See documentation for that function for details.
*
* Since: 0.9.7
**/
@@ -1517,7 +1537,7 @@ hb_buffer_add_utf (hb_buffer_t *buffer,
assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE ||
(!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID));
- if (unlikely (hb_object_is_inert (buffer)))
+ if (unlikely (hb_object_is_immutable (buffer)))
return;
if (text_length == -1)
@@ -1648,7 +1668,7 @@ hb_buffer_add_utf32 (hb_buffer_t *buffer,
unsigned int item_offset,
int item_length)
{
- hb_buffer_add_utf<hb_utf32_t<> > (buffer, text, text_length, item_offset, item_length);
+ hb_buffer_add_utf<hb_utf32_t> (buffer, text, text_length, item_offset, item_length);
}
/**
@@ -1709,7 +1729,7 @@ hb_buffer_add_codepoints (hb_buffer_t *buffer,
unsigned int item_offset,
int item_length)
{
- hb_buffer_add_utf<hb_utf32_t<false> > (buffer, text, text_length, item_offset, item_length);
+ hb_buffer_add_utf<hb_utf32_novalidate_t> (buffer, text, text_length, item_offset, item_length);
}
@@ -1750,13 +1770,13 @@ hb_buffer_append (hb_buffer_t *buffer,
if (buffer->len + (end - start) < buffer->len) /* Overflows. */
{
- buffer->in_error = true;
+ buffer->successful = false;
return;
}
unsigned int orig_len = buffer->len;
hb_buffer_set_length (buffer, buffer->len + (end - start));
- if (buffer->in_error)
+ if (unlikely (!buffer->successful))
return;
memcpy (buffer->info + orig_len, source->info + start, (end - start) * sizeof (buffer->info[0]));
@@ -1882,6 +1902,10 @@ hb_buffer_t::sort (unsigned int start, unsigned int end, int(*compar)(const hb_g
/**
* hb_buffer_diff:
+ * @buffer: a buffer.
+ * @reference: other buffer to compare to.
+ * @dottedcircle_glyph: glyph id of U+25CC DOTTED CIRCLE, or (hb_codepont_t) -1.
+ * @position_fuzz: allowed absolute difference in position values.
*
* If dottedcircle_glyph is (hb_codepoint_t) -1 then %HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT
* and %HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT are never returned. This should be used by most
@@ -1914,9 +1938,9 @@ hb_buffer_diff (hb_buffer_t *buffer,
for (i = 0; i < count; i++)
{
if (contains && info[i].codepoint == dottedcircle_glyph)
- result |= HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT;
+ result |= HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT;
if (contains && info[i].codepoint == 0)
- result |= HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT;
+ result |= HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT;
}
result |= HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH;
return hb_buffer_diff_flags_t (result);
@@ -1933,7 +1957,7 @@ hb_buffer_diff (hb_buffer_t *buffer,
result |= HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH;
if (buf_info->cluster != ref_info->cluster)
result |= HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH;
- if ((buf_info->mask & HB_GLYPH_FLAG_DEFINED) != (ref_info->mask & HB_GLYPH_FLAG_DEFINED))
+ if ((buf_info->mask & ~ref_info->mask & HB_GLYPH_FLAG_DEFINED))
result |= HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH;
if (contains && ref_info->codepoint == dottedcircle_glyph)
result |= HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT;
@@ -1951,12 +1975,12 @@ hb_buffer_diff (hb_buffer_t *buffer,
for (unsigned int i = 0; i < count; i++)
{
if ((unsigned int) abs (buf_pos->x_advance - ref_pos->x_advance) > position_fuzz ||
- (unsigned int) abs (buf_pos->y_advance - ref_pos->y_advance) > position_fuzz ||
- (unsigned int) abs (buf_pos->x_offset - ref_pos->x_offset) > position_fuzz ||
- (unsigned int) abs (buf_pos->y_offset - ref_pos->y_offset) > position_fuzz)
+ (unsigned int) abs (buf_pos->y_advance - ref_pos->y_advance) > position_fuzz ||
+ (unsigned int) abs (buf_pos->x_offset - ref_pos->x_offset) > position_fuzz ||
+ (unsigned int) abs (buf_pos->y_offset - ref_pos->y_offset) > position_fuzz)
{
- result |= HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH;
- break;
+ result |= HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH;
+ break;
}
buf_pos++;
ref_pos++;
@@ -1971,6 +1995,7 @@ hb_buffer_diff (hb_buffer_t *buffer,
* Debugging.
*/
+#ifndef HB_NO_BUFFER_MESSAGE
/**
* hb_buffer_set_message_func:
* @buffer: an #hb_buffer_t.
@@ -1978,7 +2003,7 @@ hb_buffer_diff (hb_buffer_t *buffer,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 1.1.3
**/
@@ -2000,11 +2025,11 @@ hb_buffer_set_message_func (hb_buffer_t *buffer,
buffer->message_destroy = nullptr;
}
}
-
bool
hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap)
{
char buf[100];
- vsnprintf (buf, sizeof (buf), fmt, ap);
+ vsnprintf (buf, sizeof (buf), fmt, ap);
return (bool) this->message_func (this, font, buf, this->message_data);
}
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer.h b/src/3rdparty/harfbuzz-ng/src/hb-buffer.h
index a8a4b84e97..d5cb746861 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-buffer.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer.h
@@ -44,7 +44,6 @@ HB_BEGIN_DECLS
* hb_glyph_info_t:
* @codepoint: either a Unicode code point (before shaping) or a glyph index
* (after shaping).
- * @mask:
* @cluster: the index of the character in the original text that corresponds
* to this #hb_glyph_info_t, or whatever the client passes to
* hb_buffer_add(). More than one #hb_glyph_info_t can have the same
@@ -59,11 +58,13 @@ HB_BEGIN_DECLS
*
* The #hb_glyph_info_t is the structure that holds information about the
* glyphs and their relation to input text.
- *
*/
-typedef struct hb_glyph_info_t {
+typedef struct hb_glyph_info_t
+{
hb_codepoint_t codepoint;
- hb_mask_t mask; /* Holds hb_glyph_flags_t after hb_shape(), plus other things. */
+ /*< private >*/
+ hb_mask_t mask;
+ /*< public >*/
uint32_t cluster;
/*< private >*/
@@ -71,6 +72,27 @@ typedef struct hb_glyph_info_t {
hb_var_int_t var2;
} hb_glyph_info_t;
+/**
+ * hb_glyph_flags_t:
+ * @HB_GLYPH_FLAG_UNSAFE_TO_BREAK: Indicates that if input text is broken at the
+ * beginning of the cluster this glyph is part of,
+ * then both sides need to be re-shaped, as the
+ * result might be different. On the flip side,
+ * it means that when this flag is not present,
+ * then it's safe to break the glyph-run at the
+ * beginning of this cluster, and the two sides
+ * represent the exact same result one would get
+ * if breaking input text at the beginning of
+ * this cluster and shaping the two sides
+ * separately. This can be used to optimize
+ * paragraph layout, by avoiding re-shaping
+ * of each line after line-breaking, or limiting
+ * the reshaping to a small piece around the
+ * breaking point only.
+ * @HB_GLYPH_FLAG_DEFINED: All the currently defined flags.
+ *
+ * Since: 1.5.0
+ */
typedef enum { /*< flags >*/
HB_GLYPH_FLAG_UNSAFE_TO_BREAK = 0x00000001,
@@ -247,13 +269,25 @@ hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
* of the text without the full context.
* @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text
* paragraph can be applied to this buffer, similar to
- * @HB_BUFFER_FLAG_EOT.
+ * @HB_BUFFER_FLAG_BOT.
* @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES:
* flag indication that character with Default_Ignorable
* Unicode property should use the corresponding glyph
- * from the font, instead of hiding them (currently done
- * by replacing them with the space glyph and zeroing the
- * advance width.)
+ * from the font, instead of hiding them (done by
+ * replacing them with the space glyph and zeroing the
+ * advance width.) This flag takes precedence over
+ * @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES.
+ * @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES:
+ * flag indication that character with Default_Ignorable
+ * Unicode property should be removed from glyph string
+ * instead of hiding them (done by replacing them with the
+ * space glyph and zeroing the advance width.)
+ * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes
+ * precedence over this flag. Since: 1.8.0
+ * @HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE:
+ * flag indicating that a dotted circle should
+ * not be inserted in the rendering of incorrect
+ * character sequences (such at <0905 093E>). Since: 2.4
*
* Since: 0.9.20
*/
@@ -261,7 +295,9 @@ typedef enum { /*< flags >*/
HB_BUFFER_FLAG_DEFAULT = 0x00000000u,
HB_BUFFER_FLAG_BOT = 0x00000001u, /* Beginning-of-text */
HB_BUFFER_FLAG_EOT = 0x00000002u, /* End-of-text */
- HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u
+ HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u,
+ HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES = 0x00000008u,
+ HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE = 0x00000010u
} hb_buffer_flags_t;
HB_EXTERN void
@@ -271,7 +307,15 @@ hb_buffer_set_flags (hb_buffer_t *buffer,
HB_EXTERN hb_buffer_flags_t
hb_buffer_get_flags (hb_buffer_t *buffer);
-/*
+/**
+ * hb_buffer_cluster_level_t:
+ * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES: Return cluster values grouped by graphemes into
+ * monotone order.
+ * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS: Return cluster values grouped into monotone order.
+ * @HB_BUFFER_CLUSTER_LEVEL_CHARACTERS: Don't group cluster values.
+ * @HB_BUFFER_CLUSTER_LEVEL_DEFAULT: Default cluster level,
+ * equal to @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES.
+ *
* Since: 0.9.42
*/
typedef enum {
@@ -305,6 +349,13 @@ hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer,
HB_EXTERN hb_codepoint_t
hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer);
+HB_EXTERN void
+hb_buffer_set_invisible_glyph (hb_buffer_t *buffer,
+ hb_codepoint_t invisible);
+
+HB_EXTERN hb_codepoint_t
+hb_buffer_get_invisible_glyph (hb_buffer_t *buffer);
+
HB_EXTERN void
hb_buffer_reset (hb_buffer_t *buffer);
@@ -390,11 +441,11 @@ hb_buffer_get_length (hb_buffer_t *buffer);
HB_EXTERN hb_glyph_info_t *
hb_buffer_get_glyph_infos (hb_buffer_t *buffer,
- unsigned int *length);
+ unsigned int *length);
HB_EXTERN hb_glyph_position_t *
hb_buffer_get_glyph_positions (hb_buffer_t *buffer,
- unsigned int *length);
+ unsigned int *length);
HB_EXTERN void
@@ -412,6 +463,9 @@ hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
* @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
* @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
* @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
+ * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS: serialize glyph flags. Since: 1.5.0
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES: do not serialize glyph advances,
+ * glyph offsets will reflect absolute glyph positions. Since: 1.8.0
*
* Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
*
@@ -423,7 +477,8 @@ typedef enum { /*< flags >*/
HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS = 0x00000002u,
HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES = 0x00000004u,
HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS = 0x00000008u,
- HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS = 0x00000010u
+ HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS = 0x00000010u,
+ HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES = 0x00000020u
} hb_buffer_serialize_flags_t;
/**
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer.hh b/src/3rdparty/harfbuzz-ng/src/hb-buffer.hh
new file mode 100644
index 0000000000..b5596d9457
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer.hh
@@ -0,0 +1,451 @@
+/*
+ * Copyright © 1998-2004 David Turner and Werner Lemberg
+ * Copyright © 2004,2007,2009,2010 Red Hat, Inc.
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_BUFFER_HH
+#define HB_BUFFER_HH
+
+#include "hb.hh"
+#include "hb-unicode.hh"
+
+
+#ifndef HB_BUFFER_MAX_LEN_FACTOR
+#define HB_BUFFER_MAX_LEN_FACTOR 32
+#endif
+#ifndef HB_BUFFER_MAX_LEN_MIN
+#define HB_BUFFER_MAX_LEN_MIN 8192
+#endif
+#ifndef HB_BUFFER_MAX_LEN_DEFAULT
+#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
+#endif
+
+#ifndef HB_BUFFER_MAX_OPS_FACTOR
+#define HB_BUFFER_MAX_OPS_FACTOR 64
+#endif
+#ifndef HB_BUFFER_MAX_OPS_MIN
+#define HB_BUFFER_MAX_OPS_MIN 1024
+#endif
+#ifndef HB_BUFFER_MAX_OPS_DEFAULT
+#define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */
+#endif
+
+static_assert ((sizeof (hb_glyph_info_t) == 20), "");
+static_assert ((sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t)), "");
+
+HB_MARK_AS_FLAG_T (hb_buffer_flags_t);
+HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t);
+HB_MARK_AS_FLAG_T (hb_buffer_diff_flags_t);
+
+enum hb_buffer_scratch_flags_t {
+ HB_BUFFER_SCRATCH_FLAG_DEFAULT = 0x00000000u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII = 0x00000001u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES = 0x00000002u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK = 0x00000004u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT = 0x00000008u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK = 0x00000010u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_CGJ = 0x00000020u,
+
+ /* Reserved for complex shapers' internal use. */
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX0 = 0x01000000u,
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX1 = 0x02000000u,
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX2 = 0x04000000u,
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX3 = 0x08000000u,
+};
+HB_MARK_AS_FLAG_T (hb_buffer_scratch_flags_t);
+
+
+/*
+ * hb_buffer_t
+ */
+
+struct hb_buffer_t
+{
+ hb_object_header_t header;
+
+ /* Information about how the text in the buffer should be treated */
+ hb_unicode_funcs_t *unicode; /* Unicode functions */
+ hb_buffer_flags_t flags; /* BOT / EOT / etc. */
+ hb_buffer_cluster_level_t cluster_level;
+ hb_codepoint_t replacement; /* U+FFFD or something else. */
+ hb_codepoint_t invisible; /* 0 or something else. */
+ hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */
+ unsigned int max_len; /* Maximum allowed len. */
+ int max_ops; /* Maximum allowed operations. */
+
+ /* Buffer contents */
+ hb_buffer_content_type_t content_type;
+ hb_segment_properties_t props; /* Script, language, direction */
+
+ bool successful; /* Allocations successful */
+ bool have_output; /* Whether we have an output buffer going on */
+ bool have_positions; /* Whether we have positions */
+
+ unsigned int idx; /* Cursor into ->info and ->pos arrays */
+ unsigned int len; /* Length of ->info and ->pos arrays */
+ unsigned int out_len; /* Length of ->out array if have_output */
+
+ unsigned int allocated; /* Length of allocated arrays */
+ hb_glyph_info_t *info;
+ hb_glyph_info_t *out_info;
+ hb_glyph_position_t *pos;
+
+ unsigned int serial;
+
+ /* Text before / after the main buffer contents.
+ * Always in Unicode, and ordered outward.
+ * Index 0 is for "pre-context", 1 for "post-context". */
+ static constexpr unsigned CONTEXT_LENGTH = 5u;
+ hb_codepoint_t context[2][CONTEXT_LENGTH];
+ unsigned int context_len[2];
+
+ /* Debugging API */
+#ifndef HB_NO_BUFFER_MESSAGE
+ hb_buffer_message_func_t message_func;
+ void *message_data;
+ hb_destroy_func_t message_destroy;
+#endif
+
+ /* Internal debugging. */
+ /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */
+#ifndef HB_NDEBUG
+ uint8_t allocated_var_bits;
+#endif
+
+
+ /* Methods */
+
+ bool in_error () const { return !successful; }
+
+ void allocate_var (unsigned int start, unsigned int count)
+ {
+#ifndef HB_NDEBUG
+ unsigned int end = start + count;
+ assert (end <= 8);
+ unsigned int bits = (1u<<end) - (1u<<start);
+ assert (0 == (allocated_var_bits & bits));
+ allocated_var_bits |= bits;
+#endif
+ }
+ void deallocate_var (unsigned int start, unsigned int count)
+ {
+#ifndef HB_NDEBUG
+ unsigned int end = start + count;
+ assert (end <= 8);
+ unsigned int bits = (1u<<end) - (1u<<start);
+ assert (bits == (allocated_var_bits & bits));
+ allocated_var_bits &= ~bits;
+#endif
+ }
+ void assert_var (unsigned int start, unsigned int count)
+ {
+#ifndef HB_NDEBUG
+ unsigned int end = start + count;
+ assert (end <= 8);
+ unsigned int bits = (1u<<end) - (1u<<start);
+ assert (bits == (allocated_var_bits & bits));
+#endif
+ }
+ void deallocate_var_all ()
+ {
+#ifndef HB_NDEBUG
+ allocated_var_bits = 0;
+#endif
+ }
+
+ hb_glyph_info_t &cur (unsigned int i = 0) { return info[idx + i]; }
+ hb_glyph_info_t cur (unsigned int i = 0) const { return info[idx + i]; }
+
+ hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; }
+ hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; }
+
+ hb_glyph_info_t &prev () { return out_info[out_len ? out_len - 1 : 0]; }
+ hb_glyph_info_t prev () const { return out_info[out_len ? out_len - 1 : 0]; }
+
+ bool has_separate_output () const { return info != out_info; }
+
+
+ HB_INTERNAL void reset ();
+ HB_INTERNAL void clear ();
+
+ unsigned int backtrack_len () const { return have_output? out_len : idx; }
+ unsigned int lookahead_len () const { return len - idx; }
+ unsigned int next_serial () { return serial++; }
+
+ HB_INTERNAL void add (hb_codepoint_t codepoint,
+ unsigned int cluster);
+ HB_INTERNAL void add_info (const hb_glyph_info_t &glyph_info);
+
+ HB_INTERNAL void reverse_range (unsigned int start, unsigned int end);
+ HB_INTERNAL void reverse ();
+ HB_INTERNAL void reverse_clusters ();
+ HB_INTERNAL void guess_segment_properties ();
+
+ HB_INTERNAL void swap_buffers ();
+ HB_INTERNAL void remove_output ();
+ HB_INTERNAL void clear_output ();
+ HB_INTERNAL void clear_positions ();
+
+ HB_INTERNAL void replace_glyphs (unsigned int num_in,
+ unsigned int num_out,
+ const hb_codepoint_t *glyph_data);
+
+ void replace_glyph (hb_codepoint_t glyph_index)
+ {
+ if (unlikely (out_info != info || out_len != idx)) {
+ if (unlikely (!make_room_for (1, 1))) return;
+ out_info[out_len] = info[idx];
+ }
+ out_info[out_len].codepoint = glyph_index;
+
+ idx++;
+ out_len++;
+ }
+ /* Makes a copy of the glyph at idx to output and replace glyph_index */
+ hb_glyph_info_t & output_glyph (hb_codepoint_t glyph_index)
+ {
+ if (unlikely (!make_room_for (0, 1))) return Crap(hb_glyph_info_t);
+
+ if (unlikely (idx == len && !out_len))
+ return Crap(hb_glyph_info_t);
+
+ out_info[out_len] = idx < len ? info[idx] : out_info[out_len - 1];
+ out_info[out_len].codepoint = glyph_index;
+
+ out_len++;
+
+ return out_info[out_len - 1];
+ }
+ void output_info (const hb_glyph_info_t &glyph_info)
+ {
+ if (unlikely (!make_room_for (0, 1))) return;
+
+ out_info[out_len] = glyph_info;
+
+ out_len++;
+ }
+ /* Copies glyph at idx to output but doesn't advance idx */
+ void copy_glyph ()
+ {
+ if (unlikely (!make_room_for (0, 1))) return;
+
+ out_info[out_len] = info[idx];
+
+ out_len++;
+ }
+ /* Copies glyph at idx to output and advance idx.
+ * If there's no output, just advance idx. */
+ void
+ next_glyph ()
+ {
+ if (have_output)
+ {
+ if (out_info != info || out_len != idx)
+ {
+ if (unlikely (!make_room_for (1, 1))) return;
+ out_info[out_len] = info[idx];
+ }
+ out_len++;
+ }
+
+ idx++;
+ }
+ /* Copies n glyphs at idx to output and advance idx.
+ * If there's no output, just advance idx. */
+ void
+ next_glyphs (unsigned int n)
+ {
+ if (have_output)
+ {
+ if (out_info != info || out_len != idx)
+ {
+ if (unlikely (!make_room_for (n, n))) return;
+ memmove (out_info + out_len, info + idx, n * sizeof (out_info[0]));
+ }
+ out_len += n;
+ }
+
+ idx += n;
+ }
+ /* Advance idx without copying to output. */
+ void skip_glyph () { idx++; }
+ void reset_masks (hb_mask_t mask)
+ {
+ for (unsigned int j = 0; j < len; j++)
+ info[j].mask = mask;
+ }
+ void add_masks (hb_mask_t mask)
+ {
+ for (unsigned int j = 0; j < len; j++)
+ info[j].mask |= mask;
+ }
+ HB_INTERNAL void set_masks (hb_mask_t value, hb_mask_t mask,
+ unsigned int cluster_start, unsigned int cluster_end);
+
+ void merge_clusters (unsigned int start, unsigned int end)
+ {
+ if (end - start < 2)
+ return;
+ merge_clusters_impl (start, end);
+ }
+ HB_INTERNAL void merge_clusters_impl (unsigned int start, unsigned int end);
+ HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end);
+ /* Merge clusters for deleting current glyph, and skip it. */
+ HB_INTERNAL void delete_glyph ();
+
+ void unsafe_to_break (unsigned int start,
+ unsigned int end)
+ {
+ if (end - start < 2)
+ return;
+ unsafe_to_break_impl (start, end);
+ }
+ HB_INTERNAL void unsafe_to_break_impl (unsigned int start, unsigned int end);
+ HB_INTERNAL void unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end);
+
+
+ /* Internal methods */
+ HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */
+
+ HB_INTERNAL bool enlarge (unsigned int size);
+
+ bool ensure (unsigned int size)
+ { return likely (!size || size < allocated) ? true : enlarge (size); }
+
+ bool ensure_inplace (unsigned int size)
+ { return likely (!size || size < allocated); }
+
+ HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out);
+ HB_INTERNAL bool shift_forward (unsigned int count);
+
+ typedef long scratch_buffer_t;
+ HB_INTERNAL scratch_buffer_t *get_scratch_buffer (unsigned int *size);
+
+ void clear_context (unsigned int side) { context_len[side] = 0; }
+
+ HB_INTERNAL void sort (unsigned int start, unsigned int end, int(*compar)(const hb_glyph_info_t *, const hb_glyph_info_t *));
+
+ bool messaging ()
+ {
+#ifdef HB_NO_BUFFER_MESSAGE
+ return false;
+#else
+ return unlikely (message_func);
+#endif
+ }
+ bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4)
+ {
+#ifdef HB_NO_BUFFER_MESSAGE
+ return true;
+#else
+ if (!messaging ())
+ return true;
+ va_list ap;
+ va_start (ap, fmt);
+ bool ret = message_impl (font, fmt, ap);
+ va_end (ap);
+ return ret;
+#endif
+ }
+ HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0);
+
+ static void
+ set_cluster (hb_glyph_info_t &inf, unsigned int cluster, unsigned int mask = 0)
+ {
+ if (inf.cluster != cluster)
+ {
+ if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
+ inf.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+ else
+ inf.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+ }
+ inf.cluster = cluster;
+ }
+
+ int
+ _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *infos,
+ unsigned int start, unsigned int end,
+ unsigned int cluster) const
+ {
+ for (unsigned int i = start; i < end; i++)
+ cluster = hb_min (cluster, infos[i].cluster);
+ return cluster;
+ }
+ void
+ _unsafe_to_break_set_mask (hb_glyph_info_t *infos,
+ unsigned int start, unsigned int end,
+ unsigned int cluster)
+ {
+ for (unsigned int i = start; i < end; i++)
+ if (cluster != infos[i].cluster)
+ {
+ scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK;
+ infos[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+ }
+ }
+
+ void unsafe_to_break_all () { unsafe_to_break_impl (0, len); }
+ void safe_to_break_all ()
+ {
+ for (unsigned int i = 0; i < len; i++)
+ info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+ }
+};
+DECLARE_NULL_INSTANCE (hb_buffer_t);
+
+
+/* Loop over clusters. Duplicated in foreach_syllable(). */
+#define foreach_cluster(buffer, start, end) \
+ for (unsigned int \
+ _count = buffer->len, \
+ start = 0, end = _count ? _next_cluster (buffer, 0) : 0; \
+ start < _count; \
+ start = end, end = _next_cluster (buffer, start))
+
+static inline unsigned int
+_next_cluster (hb_buffer_t *buffer, unsigned int start)
+{
+ hb_glyph_info_t *info = buffer->info;
+ unsigned int count = buffer->len;
+
+ unsigned int cluster = info[start].cluster;
+ while (++start < count && cluster == info[start].cluster)
+ ;
+
+ return start;
+}
+
+
+#define HB_BUFFER_XALLOCATE_VAR(b, func, var) \
+ b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
+ sizeof (b->info[0].var))
+#define HB_BUFFER_ALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var ())
+#define HB_BUFFER_DEALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var ())
+#define HB_BUFFER_ASSERT_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, assert_var, var ())
+
+
+#endif /* HB_BUFFER_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cache-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-cache-private.hh
deleted file mode 100644
index 24957e1e96..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-cache-private.hh
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright © 2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_CACHE_PRIVATE_HH
-#define HB_CACHE_PRIVATE_HH
-
-#include "hb-private.hh"
-
-
-/* Implements a lock-free cache for int->int functions. */
-
-template <unsigned int key_bits, unsigned int value_bits, unsigned int cache_bits>
-struct hb_cache_t
-{
- ASSERT_STATIC (key_bits >= cache_bits);
- ASSERT_STATIC (key_bits + value_bits - cache_bits < 8 * sizeof (unsigned int));
-
- inline void clear (void)
- {
- memset (values, 255, sizeof (values));
- }
-
- inline bool get (unsigned int key, unsigned int *value)
- {
- unsigned int k = key & ((1u<<cache_bits)-1);
- unsigned int v = values[k];
- if ((v >> value_bits) != (key >> cache_bits))
- return false;
- *value = v & ((1u<<value_bits)-1);
- return true;
- }
-
- inline bool set (unsigned int key, unsigned int value)
- {
- if (unlikely ((key >> key_bits) || (value >> value_bits)))
- return false; /* Overflows */
- unsigned int k = key & ((1u<<cache_bits)-1);
- unsigned int v = ((key>>cache_bits)<<value_bits) | value;
- values[k] = v;
- return true;
- }
-
- private:
- unsigned int values[1u<<cache_bits];
-};
-
-typedef hb_cache_t<21, 16, 8> hb_cmap_cache_t;
-typedef hb_cache_t<16, 24, 8> hb_advance_cache_t;
-
-
-#endif /* HB_CACHE_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cache.hh b/src/3rdparty/harfbuzz-ng/src/hb-cache.hh
new file mode 100644
index 0000000000..bf26d96be4
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-cache.hh
@@ -0,0 +1,80 @@
+/*
+ * Copyright © 2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_CACHE_HH
+#define HB_CACHE_HH
+
+#include "hb.hh"
+
+
+/* Implements a lock-free cache for int->int functions. */
+
+template <unsigned int key_bits, unsigned int value_bits, unsigned int cache_bits>
+struct hb_cache_t
+{
+ static_assert ((key_bits >= cache_bits), "");
+ static_assert ((key_bits + value_bits - cache_bits <= 8 * sizeof (hb_atomic_int_t)), "");
+ static_assert (sizeof (hb_atomic_int_t) == sizeof (unsigned int), "");
+
+ void init () { clear (); }
+ void fini () {}
+
+ void clear ()
+ {
+ for (unsigned i = 0; i < ARRAY_LENGTH (values); i++)
+ values[i].set_relaxed (-1);
+ }
+
+ bool get (unsigned int key, unsigned int *value) const
+ {
+ unsigned int k = key & ((1u<<cache_bits)-1);
+ unsigned int v = values[k].get_relaxed ();
+ if ((key_bits + value_bits - cache_bits == 8 * sizeof (hb_atomic_int_t) && v == (unsigned int) -1) ||
+ (v >> value_bits) != (key >> cache_bits))
+ return false;
+ *value = v & ((1u<<value_bits)-1);
+ return true;
+ }
+
+ bool set (unsigned int key, unsigned int value)
+ {
+ if (unlikely ((key >> key_bits) || (value >> value_bits)))
+ return false; /* Overflows */
+ unsigned int k = key & ((1u<<cache_bits)-1);
+ unsigned int v = ((key>>cache_bits)<<value_bits) | value;
+ values[k].set_relaxed (v);
+ return true;
+ }
+
+ private:
+ hb_atomic_int_t values[1u<<cache_bits];
+};
+
+typedef hb_cache_t<21, 16, 8> hb_cmap_cache_t;
+typedef hb_cache_t<16, 24, 8> hb_advance_cache_t;
+
+
+#endif /* HB_CACHE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh b/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh
new file mode 100644
index 0000000000..780f61892d
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh
@@ -0,0 +1,691 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_CFF_INTERP_COMMON_HH
+#define HB_CFF_INTERP_COMMON_HH
+
+namespace CFF {
+
+using namespace OT;
+
+typedef unsigned int op_code_t;
+
+
+/* === Dict operators === */
+
+/* One byte operators (0-31) */
+#define OpCode_version 0 /* CFF Top */
+#define OpCode_Notice 1 /* CFF Top */
+#define OpCode_FullName 2 /* CFF Top */
+#define OpCode_FamilyName 3 /* CFF Top */
+#define OpCode_Weight 4 /* CFF Top */
+#define OpCode_FontBBox 5 /* CFF Top */
+#define OpCode_BlueValues 6 /* CFF Private, CFF2 Private */
+#define OpCode_OtherBlues 7 /* CFF Private, CFF2 Private */
+#define OpCode_FamilyBlues 8 /* CFF Private, CFF2 Private */
+#define OpCode_FamilyOtherBlues 9 /* CFF Private, CFF2 Private */
+#define OpCode_StdHW 10 /* CFF Private, CFF2 Private */
+#define OpCode_StdVW 11 /* CFF Private, CFF2 Private */
+#define OpCode_escape 12 /* All. Shared with CS */
+#define OpCode_UniqueID 13 /* CFF Top */
+#define OpCode_XUID 14 /* CFF Top */
+#define OpCode_charset 15 /* CFF Top (0) */
+#define OpCode_Encoding 16 /* CFF Top (0) */
+#define OpCode_CharStrings 17 /* CFF Top, CFF2 Top */
+#define OpCode_Private 18 /* CFF Top, CFF2 FD */
+#define OpCode_Subrs 19 /* CFF Private, CFF2 Private */
+#define OpCode_defaultWidthX 20 /* CFF Private (0) */
+#define OpCode_nominalWidthX 21 /* CFF Private (0) */
+#define OpCode_vsindexdict 22 /* CFF2 Private/CS */
+#define OpCode_blenddict 23 /* CFF2 Private/CS */
+#define OpCode_vstore 24 /* CFF2 Top */
+#define OpCode_reserved25 25
+#define OpCode_reserved26 26
+#define OpCode_reserved27 27
+
+/* Numbers */
+#define OpCode_shortint 28 /* 16-bit integer, All */
+#define OpCode_longintdict 29 /* 32-bit integer, All */
+#define OpCode_BCD 30 /* Real number, CFF2 Top/FD */
+#define OpCode_reserved31 31
+
+/* 1-byte integers */
+#define OpCode_OneByteIntFirst 32 /* All. beginning of the range of first byte ints */
+#define OpCode_OneByteIntLast 246 /* All. ending of the range of first byte int */
+
+/* 2-byte integers */
+#define OpCode_TwoBytePosInt0 247 /* All. first byte of two byte positive int (+108 to +1131) */
+#define OpCode_TwoBytePosInt1 248
+#define OpCode_TwoBytePosInt2 249
+#define OpCode_TwoBytePosInt3 250
+
+#define OpCode_TwoByteNegInt0 251 /* All. first byte of two byte negative int (-1131 to -108) */
+#define OpCode_TwoByteNegInt1 252
+#define OpCode_TwoByteNegInt2 253
+#define OpCode_TwoByteNegInt3 254
+
+/* Two byte escape operators 12, (0-41) */
+#define OpCode_ESC_Base 256
+#define Make_OpCode_ESC(byte2) ((op_code_t)(OpCode_ESC_Base + (byte2)))
+
+inline op_code_t Unmake_OpCode_ESC (op_code_t op) { return (op_code_t)(op - OpCode_ESC_Base); }
+inline bool Is_OpCode_ESC (op_code_t op) { return op >= OpCode_ESC_Base; }
+inline unsigned int OpCode_Size (op_code_t op) { return Is_OpCode_ESC (op) ? 2: 1; }
+
+#define OpCode_Copyright Make_OpCode_ESC(0) /* CFF Top */
+#define OpCode_isFixedPitch Make_OpCode_ESC(1) /* CFF Top (false) */
+#define OpCode_ItalicAngle Make_OpCode_ESC(2) /* CFF Top (0) */
+#define OpCode_UnderlinePosition Make_OpCode_ESC(3) /* CFF Top (-100) */
+#define OpCode_UnderlineThickness Make_OpCode_ESC(4) /* CFF Top (50) */
+#define OpCode_PaintType Make_OpCode_ESC(5) /* CFF Top (0) */
+#define OpCode_CharstringType Make_OpCode_ESC(6) /* CFF Top (2) */
+#define OpCode_FontMatrix Make_OpCode_ESC(7) /* CFF Top, CFF2 Top (.001 0 0 .001 0 0)*/
+#define OpCode_StrokeWidth Make_OpCode_ESC(8) /* CFF Top (0) */
+#define OpCode_BlueScale Make_OpCode_ESC(9) /* CFF Private, CFF2 Private (0.039625) */
+#define OpCode_BlueShift Make_OpCode_ESC(10) /* CFF Private, CFF2 Private (7) */
+#define OpCode_BlueFuzz Make_OpCode_ESC(11) /* CFF Private, CFF2 Private (1) */
+#define OpCode_StemSnapH Make_OpCode_ESC(12) /* CFF Private, CFF2 Private */
+#define OpCode_StemSnapV Make_OpCode_ESC(13) /* CFF Private, CFF2 Private */
+#define OpCode_ForceBold Make_OpCode_ESC(14) /* CFF Private (false) */
+#define OpCode_reservedESC15 Make_OpCode_ESC(15)
+#define OpCode_reservedESC16 Make_OpCode_ESC(16)
+#define OpCode_LanguageGroup Make_OpCode_ESC(17) /* CFF Private, CFF2 Private (0) */
+#define OpCode_ExpansionFactor Make_OpCode_ESC(18) /* CFF Private, CFF2 Private (0.06) */
+#define OpCode_initialRandomSeed Make_OpCode_ESC(19) /* CFF Private (0) */
+#define OpCode_SyntheticBase Make_OpCode_ESC(20) /* CFF Top */
+#define OpCode_PostScript Make_OpCode_ESC(21) /* CFF Top */
+#define OpCode_BaseFontName Make_OpCode_ESC(22) /* CFF Top */
+#define OpCode_BaseFontBlend Make_OpCode_ESC(23) /* CFF Top */
+#define OpCode_reservedESC24 Make_OpCode_ESC(24)
+#define OpCode_reservedESC25 Make_OpCode_ESC(25)
+#define OpCode_reservedESC26 Make_OpCode_ESC(26)
+#define OpCode_reservedESC27 Make_OpCode_ESC(27)
+#define OpCode_reservedESC28 Make_OpCode_ESC(28)
+#define OpCode_reservedESC29 Make_OpCode_ESC(29)
+#define OpCode_ROS Make_OpCode_ESC(30) /* CFF Top_CID */
+#define OpCode_CIDFontVersion Make_OpCode_ESC(31) /* CFF Top_CID (0) */
+#define OpCode_CIDFontRevision Make_OpCode_ESC(32) /* CFF Top_CID (0) */
+#define OpCode_CIDFontType Make_OpCode_ESC(33) /* CFF Top_CID (0) */
+#define OpCode_CIDCount Make_OpCode_ESC(34) /* CFF Top_CID (8720) */
+#define OpCode_UIDBase Make_OpCode_ESC(35) /* CFF Top_CID */
+#define OpCode_FDArray Make_OpCode_ESC(36) /* CFF Top_CID, CFF2 Top */
+#define OpCode_FDSelect Make_OpCode_ESC(37) /* CFF Top_CID, CFF2 Top */
+#define OpCode_FontName Make_OpCode_ESC(38) /* CFF Top_CID */
+
+
+/* === CharString operators === */
+
+#define OpCode_hstem 1 /* CFF, CFF2 */
+#define OpCode_Reserved2 2
+#define OpCode_vstem 3 /* CFF, CFF2 */
+#define OpCode_vmoveto 4 /* CFF, CFF2 */
+#define OpCode_rlineto 5 /* CFF, CFF2 */
+#define OpCode_hlineto 6 /* CFF, CFF2 */
+#define OpCode_vlineto 7 /* CFF, CFF2 */
+#define OpCode_rrcurveto 8 /* CFF, CFF2 */
+#define OpCode_Reserved9 9
+#define OpCode_callsubr 10 /* CFF, CFF2 */
+#define OpCode_return 11 /* CFF */
+//#define OpCode_escape 12 /* CFF, CFF2 */
+#define OpCode_Reserved13 13
+#define OpCode_endchar 14 /* CFF */
+#define OpCode_vsindexcs 15 /* CFF2 */
+#define OpCode_blendcs 16 /* CFF2 */
+#define OpCode_Reserved17 17
+#define OpCode_hstemhm 18 /* CFF, CFF2 */
+#define OpCode_hintmask 19 /* CFF, CFF2 */
+#define OpCode_cntrmask 20 /* CFF, CFF2 */
+#define OpCode_rmoveto 21 /* CFF, CFF2 */
+#define OpCode_hmoveto 22 /* CFF, CFF2 */
+#define OpCode_vstemhm 23 /* CFF, CFF2 */
+#define OpCode_rcurveline 24 /* CFF, CFF2 */
+#define OpCode_rlinecurve 25 /* CFF, CFF2 */
+#define OpCode_vvcurveto 26 /* CFF, CFF2 */
+#define OpCode_hhcurveto 27 /* CFF, CFF2 */
+//#define OpCode_shortint 28 /* CFF, CFF2 */
+#define OpCode_callgsubr 29 /* CFF, CFF2 */
+#define OpCode_vhcurveto 30 /* CFF, CFF2 */
+#define OpCode_hvcurveto 31 /* CFF, CFF2 */
+
+#define OpCode_fixedcs 255 /* 32-bit fixed */
+
+/* Two byte escape operators 12, (0-41) */
+#define OpCode_dotsection Make_OpCode_ESC(0) /* CFF (obsoleted) */
+#define OpCode_ReservedESC1 Make_OpCode_ESC(1)
+#define OpCode_ReservedESC2 Make_OpCode_ESC(2)
+#define OpCode_and Make_OpCode_ESC(3) /* CFF */
+#define OpCode_or Make_OpCode_ESC(4) /* CFF */
+#define OpCode_not Make_OpCode_ESC(5) /* CFF */
+#define OpCode_ReservedESC6 Make_OpCode_ESC(6)
+#define OpCode_ReservedESC7 Make_OpCode_ESC(7)
+#define OpCode_ReservedESC8 Make_OpCode_ESC(8)
+#define OpCode_abs Make_OpCode_ESC(9) /* CFF */
+#define OpCode_add Make_OpCode_ESC(10) /* CFF */
+#define OpCode_sub Make_OpCode_ESC(11) /* CFF */
+#define OpCode_div Make_OpCode_ESC(12) /* CFF */
+#define OpCode_ReservedESC13 Make_OpCode_ESC(13)
+#define OpCode_neg Make_OpCode_ESC(14) /* CFF */
+#define OpCode_eq Make_OpCode_ESC(15) /* CFF */
+#define OpCode_ReservedESC16 Make_OpCode_ESC(16)
+#define OpCode_ReservedESC17 Make_OpCode_ESC(17)
+#define OpCode_drop Make_OpCode_ESC(18) /* CFF */
+#define OpCode_ReservedESC19 Make_OpCode_ESC(19)
+#define OpCode_put Make_OpCode_ESC(20) /* CFF */
+#define OpCode_get Make_OpCode_ESC(21) /* CFF */
+#define OpCode_ifelse Make_OpCode_ESC(22) /* CFF */
+#define OpCode_random Make_OpCode_ESC(23) /* CFF */
+#define OpCode_mul Make_OpCode_ESC(24) /* CFF */
+//#define OpCode_reservedESC25 Make_OpCode_ESC(25)
+#define OpCode_sqrt Make_OpCode_ESC(26) /* CFF */
+#define OpCode_dup Make_OpCode_ESC(27) /* CFF */
+#define OpCode_exch Make_OpCode_ESC(28) /* CFF */
+#define OpCode_index Make_OpCode_ESC(29) /* CFF */
+#define OpCode_roll Make_OpCode_ESC(30) /* CFF */
+#define OpCode_reservedESC31 Make_OpCode_ESC(31)
+#define OpCode_reservedESC32 Make_OpCode_ESC(32)
+#define OpCode_reservedESC33 Make_OpCode_ESC(33)
+#define OpCode_hflex Make_OpCode_ESC(34) /* CFF, CFF2 */
+#define OpCode_flex Make_OpCode_ESC(35) /* CFF, CFF2 */
+#define OpCode_hflex1 Make_OpCode_ESC(36) /* CFF, CFF2 */
+#define OpCode_flex1 Make_OpCode_ESC(37) /* CFF, CFF2 */
+
+
+#define OpCode_Invalid 0xFFFFu
+
+
+struct number_t
+{
+ void init () { set_real (0.0); }
+ void fini () {}
+
+ void set_int (int v) { value = v; }
+ int to_int () const { return value; }
+
+ void set_fixed (int32_t v) { value = v / 65536.0; }
+ int32_t to_fixed () const { return value * 65536.0; }
+
+ void set_real (double v) { value = v; }
+ double to_real () const { return value; }
+
+ bool in_int_range () const
+ { return ((double) (int16_t) to_int () == value); }
+
+ bool operator > (const number_t &n) const { return value > n.to_real (); }
+ bool operator < (const number_t &n) const { return n > *this; }
+ bool operator >= (const number_t &n) const { return !(*this < n); }
+ bool operator <= (const number_t &n) const { return !(*this > n); }
+
+ const number_t &operator += (const number_t &n)
+ {
+ set_real (to_real () + n.to_real ());
+
+ return *this;
+ }
+
+ protected:
+ double value;
+};
+
+/* byte string */
+struct UnsizedByteStr : UnsizedArrayOf <HBUINT8>
+{
+ // encode 2-byte int (Dict/CharString) or 4-byte int (Dict)
+ template <typename INTTYPE, int minVal, int maxVal>
+ static bool serialize_int (hb_serialize_context_t *c, op_code_t intOp, int value)
+ {
+ TRACE_SERIALIZE (this);
+
+ if (unlikely ((value < minVal || value > maxVal)))
+ return_trace (false);
+
+ HBUINT8 *p = c->allocate_size<HBUINT8> (1);
+ if (unlikely (p == nullptr)) return_trace (false);
+ *p = intOp;
+
+ INTTYPE *ip = c->allocate_size<INTTYPE> (INTTYPE::static_size);
+ if (unlikely (ip == nullptr)) return_trace (false);
+ *ip = (unsigned int) value;
+
+ return_trace (true);
+ }
+
+ static bool serialize_int4 (hb_serialize_context_t *c, int value)
+ { return serialize_int<HBUINT32, 0, 0x7FFFFFFF> (c, OpCode_longintdict, value); }
+
+ static bool serialize_int2 (hb_serialize_context_t *c, int value)
+ { return serialize_int<HBUINT16, 0, 0x7FFF> (c, OpCode_shortint, value); }
+
+ /* Defining null_size allows a Null object may be created. Should be safe because:
+ * A descendent struct Dict uses a Null pointer to indicate a missing table,
+ * checked before access.
+ * byte_str_t, a wrapper struct pairing a byte pointer along with its length, always
+ * checks the length before access. A Null pointer is used as the initial pointer
+ * along with zero length by the default ctor.
+ */
+ DEFINE_SIZE_MIN(0);
+};
+
+/* Holder of a section of byte string within a CFFIndex entry */
+struct byte_str_t : hb_ubytes_t
+{
+ byte_str_t ()
+ : hb_ubytes_t () {}
+ byte_str_t (const UnsizedByteStr& s, unsigned int l)
+ : hb_ubytes_t ((const unsigned char*)&s, l) {}
+ byte_str_t (const unsigned char *s, unsigned int l)
+ : hb_ubytes_t (s, l) {}
+ byte_str_t (const hb_ubytes_t &ub) /* conversion from hb_ubytes_t */
+ : hb_ubytes_t (ub) {}
+
+ /* sub-string */
+ byte_str_t sub_str (unsigned int offset, unsigned int len_) const
+ { return byte_str_t (hb_ubytes_t::sub_array (offset, len_)); }
+
+ bool check_limit (unsigned int offset, unsigned int count) const
+ { return (offset + count <= length); }
+};
+
+/* A byte string associated with the current offset and an error condition */
+struct byte_str_ref_t
+{
+ byte_str_ref_t () { init (); }
+
+ void init ()
+ {
+ str = byte_str_t ();
+ offset = 0;
+ error = false;
+ }
+
+ void fini () {}
+
+ byte_str_ref_t (const byte_str_t &str_, unsigned int offset_ = 0)
+ : str (str_), offset (offset_), error (false) {}
+
+ void reset (const byte_str_t &str_, unsigned int offset_ = 0)
+ {
+ str = str_;
+ offset = offset_;
+ error = false;
+ }
+
+ const unsigned char& operator [] (int i) {
+ if (unlikely ((unsigned int) (offset + i) >= str.length))
+ {
+ set_error ();
+ return Null (unsigned char);
+ }
+ return str[offset + i];
+ }
+
+ /* Conversion to byte_str_t */
+ operator byte_str_t () const { return str.sub_str (offset, str.length - offset); }
+
+ byte_str_t sub_str (unsigned int offset_, unsigned int len_) const
+ { return str.sub_str (offset_, len_); }
+
+ bool avail (unsigned int count=1) const
+ { return (!in_error () && str.check_limit (offset, count)); }
+ void inc (unsigned int count=1)
+ {
+ if (likely (!in_error () && (offset <= str.length) && (offset + count <= str.length)))
+ {
+ offset += count;
+ }
+ else
+ {
+ offset = str.length;
+ set_error ();
+ }
+ }
+
+ void set_error () { error = true; }
+ bool in_error () const { return error; }
+
+ byte_str_t str;
+ unsigned int offset; /* beginning of the sub-string within str */
+
+ protected:
+ bool error;
+};
+
+typedef hb_vector_t<byte_str_t> byte_str_array_t;
+
+/* stack */
+template <typename ELEM, int LIMIT>
+struct cff_stack_t
+{
+ void init ()
+ {
+ error = false;
+ count = 0;
+ elements.init ();
+ elements.resize (kSizeLimit);
+ for (unsigned int i = 0; i < elements.length; i++)
+ elements[i].init ();
+ }
+ void fini () { elements.fini_deep (); }
+
+ ELEM& operator [] (unsigned int i)
+ {
+ if (unlikely (i >= count)) set_error ();
+ return elements[i];
+ }
+
+ void push (const ELEM &v)
+ {
+ if (likely (count < elements.length))
+ elements[count++] = v;
+ else
+ set_error ();
+ }
+ ELEM &push ()
+ {
+ if (likely (count < elements.length))
+ return elements[count++];
+ else
+ {
+ set_error ();
+ return Crap(ELEM);
+ }
+ }
+
+ ELEM& pop ()
+ {
+ if (likely (count > 0))
+ return elements[--count];
+ else
+ {
+ set_error ();
+ return Crap(ELEM);
+ }
+ }
+ void pop (unsigned int n)
+ {
+ if (likely (count >= n))
+ count -= n;
+ else
+ set_error ();
+ }
+
+ const ELEM& peek ()
+ {
+ if (unlikely (count < 0))
+ {
+ set_error ();
+ return Null(ELEM);
+ }
+ return elements[count - 1];
+ }
+
+ void unpop ()
+ {
+ if (likely (count < elements.length))
+ count++;
+ else
+ set_error ();
+ }
+
+ void clear () { count = 0; }
+
+ bool in_error () const { return (error || elements.in_error ()); }
+ void set_error () { error = true; }
+
+ unsigned int get_count () const { return count; }
+ bool is_empty () const { return !count; }
+
+ static constexpr unsigned kSizeLimit = LIMIT;
+
+ protected:
+ bool error;
+ unsigned int count;
+ hb_vector_t<ELEM> elements;
+};
+
+/* argument stack */
+template <typename ARG=number_t>
+struct arg_stack_t : cff_stack_t<ARG, 513>
+{
+ void push_int (int v)
+ {
+ ARG &n = S::push ();
+ n.set_int (v);
+ }
+
+ void push_fixed (int32_t v)
+ {
+ ARG &n = S::push ();
+ n.set_fixed (v);
+ }
+
+ void push_real (double v)
+ {
+ ARG &n = S::push ();
+ n.set_real (v);
+ }
+
+ ARG& pop_num () { return this->pop (); }
+
+ int pop_int () { return this->pop ().to_int (); }
+
+ unsigned int pop_uint ()
+ {
+ int i = pop_int ();
+ if (unlikely (i < 0))
+ {
+ i = 0;
+ S::set_error ();
+ }
+ return (unsigned) i;
+ }
+
+ void push_longint_from_substr (byte_str_ref_t& str_ref)
+ {
+ push_int ((str_ref[0] << 24) | (str_ref[1] << 16) | (str_ref[2] << 8) | (str_ref[3]));
+ str_ref.inc (4);
+ }
+
+ bool push_fixed_from_substr (byte_str_ref_t& str_ref)
+ {
+ if (unlikely (!str_ref.avail (4)))
+ return false;
+ push_fixed ((int32_t)*(const HBUINT32*)&str_ref[0]);
+ str_ref.inc (4);
+ return true;
+ }
+
+ hb_array_t<const ARG> get_subarray (unsigned int start) const
+ { return S::elements.sub_array (start); }
+
+ private:
+ typedef cff_stack_t<ARG, 513> S;
+};
+
+/* an operator prefixed by its operands in a byte string */
+struct op_str_t
+{
+ void init () {}
+ void fini () {}
+
+ op_code_t op;
+ byte_str_t str;
+};
+
+/* base of OP_SERIALIZER */
+struct op_serializer_t
+{
+ protected:
+ bool copy_opstr (hb_serialize_context_t *c, const op_str_t& opstr) const
+ {
+ TRACE_SERIALIZE (this);
+
+ HBUINT8 *d = c->allocate_size<HBUINT8> (opstr.str.length);
+ if (unlikely (d == nullptr)) return_trace (false);
+ memcpy (d, &opstr.str[0], opstr.str.length);
+ return_trace (true);
+ }
+};
+
+template <typename VAL>
+struct parsed_values_t
+{
+ void init ()
+ {
+ opStart = 0;
+ values.init ();
+ }
+ void fini () { values.fini_deep (); }
+
+ void add_op (op_code_t op, const byte_str_ref_t& str_ref = byte_str_ref_t ())
+ {
+ VAL *val = values.push ();
+ val->op = op;
+ val->str = str_ref.str.sub_str (opStart, str_ref.offset - opStart);
+ opStart = str_ref.offset;
+ }
+
+ void add_op (op_code_t op, const byte_str_ref_t& str_ref, const VAL &v)
+ {
+ VAL *val = values.push (v);
+ val->op = op;
+ val->str = str_ref.sub_str ( opStart, str_ref.offset - opStart);
+ opStart = str_ref.offset;
+ }
+
+ bool has_op (op_code_t op) const
+ {
+ for (unsigned int i = 0; i < get_count (); i++)
+ if (get_value (i).op == op) return true;
+ return false;
+ }
+
+ unsigned get_count () const { return values.length; }
+ const VAL &get_value (unsigned int i) const { return values[i]; }
+ const VAL &operator [] (unsigned int i) const { return get_value (i); }
+
+ unsigned int opStart;
+ hb_vector_t<VAL> values;
+};
+
+template <typename ARG=number_t>
+struct interp_env_t
+{
+ void init (const byte_str_t &str_)
+ {
+ str_ref.reset (str_);
+ argStack.init ();
+ error = false;
+ }
+ void fini () { argStack.fini (); }
+
+ bool in_error () const
+ { return error || str_ref.in_error () || argStack.in_error (); }
+
+ void set_error () { error = true; }
+
+ op_code_t fetch_op ()
+ {
+ op_code_t op = OpCode_Invalid;
+ if (unlikely (!str_ref.avail ()))
+ return OpCode_Invalid;
+ op = (op_code_t)(unsigned char)str_ref[0];
+ if (op == OpCode_escape) {
+ if (unlikely (!str_ref.avail ()))
+ return OpCode_Invalid;
+ op = Make_OpCode_ESC(str_ref[1]);
+ str_ref.inc ();
+ }
+ str_ref.inc ();
+ return op;
+ }
+
+ const ARG& eval_arg (unsigned int i) { return argStack[i]; }
+
+ ARG& pop_arg () { return argStack.pop (); }
+ void pop_n_args (unsigned int n) { argStack.pop (n); }
+
+ void clear_args () { pop_n_args (argStack.get_count ()); }
+
+ byte_str_ref_t
+ str_ref;
+ arg_stack_t<ARG>
+ argStack;
+ protected:
+ bool error;
+};
+
+typedef interp_env_t<> num_interp_env_t;
+
+template <typename ARG=number_t>
+struct opset_t
+{
+ static void process_op (op_code_t op, interp_env_t<ARG>& env)
+ {
+ switch (op) {
+ case OpCode_shortint:
+ env.argStack.push_int ((int16_t)((env.str_ref[0] << 8) | env.str_ref[1]));
+ env.str_ref.inc (2);
+ break;
+
+ case OpCode_TwoBytePosInt0: case OpCode_TwoBytePosInt1:
+ case OpCode_TwoBytePosInt2: case OpCode_TwoBytePosInt3:
+ env.argStack.push_int ((int16_t)((op - OpCode_TwoBytePosInt0) * 256 + env.str_ref[0] + 108));
+ env.str_ref.inc ();
+ break;
+
+ case OpCode_TwoByteNegInt0: case OpCode_TwoByteNegInt1:
+ case OpCode_TwoByteNegInt2: case OpCode_TwoByteNegInt3:
+ env.argStack.push_int ((-(int16_t)(op - OpCode_TwoByteNegInt0) * 256 - env.str_ref[0] - 108));
+ env.str_ref.inc ();
+ break;
+
+ default:
+ /* 1-byte integer */
+ if (likely ((OpCode_OneByteIntFirst <= op) && (op <= OpCode_OneByteIntLast)))
+ {
+ env.argStack.push_int ((int)op - 139);
+ } else {
+ /* invalid unknown operator */
+ env.clear_args ();
+ env.set_error ();
+ }
+ break;
+ }
+ }
+};
+
+template <typename ENV>
+struct interpreter_t
+{
+ ~interpreter_t() { fini (); }
+
+ void fini () { env.fini (); }
+
+ ENV env;
+};
+
+} /* namespace CFF */
+
+#endif /* HB_CFF_INTERP_COMMON_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh b/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh
new file mode 100644
index 0000000000..d9ad4d0d69
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh
@@ -0,0 +1,906 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_CFF_INTERP_CS_COMMON_HH
+#define HB_CFF_INTERP_CS_COMMON_HH
+
+#include "hb.hh"
+#include "hb-cff-interp-common.hh"
+
+namespace CFF {
+
+using namespace OT;
+
+enum cs_type_t {
+ CSType_CharString,
+ CSType_GlobalSubr,
+ CSType_LocalSubr
+};
+
+struct call_context_t
+{
+ void init (const byte_str_ref_t substr_=byte_str_ref_t (), cs_type_t type_=CSType_CharString, unsigned int subr_num_=0)
+ {
+ str_ref = substr_;
+ type = type_;
+ subr_num = subr_num_;
+ }
+
+ void fini () {}
+
+ byte_str_ref_t str_ref;
+ cs_type_t type;
+ unsigned int subr_num;
+};
+
+/* call stack */
+const unsigned int kMaxCallLimit = 10;
+struct call_stack_t : cff_stack_t<call_context_t, kMaxCallLimit> {};
+
+template <typename SUBRS>
+struct biased_subrs_t
+{
+ void init (const SUBRS *subrs_)
+ {
+ subrs = subrs_;
+ unsigned int nSubrs = get_count ();
+ if (nSubrs < 1240)
+ bias = 107;
+ else if (nSubrs < 33900)
+ bias = 1131;
+ else
+ bias = 32768;
+ }
+
+ void fini () {}
+
+ unsigned int get_count () const { return (subrs == nullptr) ? 0 : subrs->count; }
+ unsigned int get_bias () const { return bias; }
+
+ byte_str_t operator [] (unsigned int index) const
+ {
+ if (unlikely ((subrs == nullptr) || index >= subrs->count))
+ return Null(byte_str_t);
+ else
+ return (*subrs)[index];
+ }
+
+ protected:
+ unsigned int bias;
+ const SUBRS *subrs;
+};
+
+struct point_t
+{
+ void init ()
+ {
+ x.init ();
+ y.init ();
+ }
+
+ void set_int (int _x, int _y)
+ {
+ x.set_int (_x);
+ y.set_int (_y);
+ }
+
+ void move_x (const number_t &dx) { x += dx; }
+ void move_y (const number_t &dy) { y += dy; }
+ void move (const number_t &dx, const number_t &dy) { move_x (dx); move_y (dy); }
+ void move (const point_t &d) { move_x (d.x); move_y (d.y); }
+
+ number_t x;
+ number_t y;
+};
+
+template <typename ARG, typename SUBRS>
+struct cs_interp_env_t : interp_env_t<ARG>
+{
+ void init (const byte_str_t &str, const SUBRS *globalSubrs_, const SUBRS *localSubrs_)
+ {
+ interp_env_t<ARG>::init (str);
+
+ context.init (str, CSType_CharString);
+ seen_moveto = true;
+ seen_hintmask = false;
+ hstem_count = 0;
+ vstem_count = 0;
+ hintmask_size = 0;
+ pt.init ();
+ callStack.init ();
+ globalSubrs.init (globalSubrs_);
+ localSubrs.init (localSubrs_);
+ }
+ void fini ()
+ {
+ interp_env_t<ARG>::fini ();
+
+ callStack.fini ();
+ globalSubrs.fini ();
+ localSubrs.fini ();
+ }
+
+ bool in_error () const
+ {
+ return callStack.in_error () || SUPER::in_error ();
+ }
+
+ bool pop_subr_num (const biased_subrs_t<SUBRS>& biasedSubrs, unsigned int &subr_num)
+ {
+ subr_num = 0;
+ int n = SUPER::argStack.pop_int ();
+ n += biasedSubrs.get_bias ();
+ if (unlikely ((n < 0) || ((unsigned int)n >= biasedSubrs.get_count ())))
+ return false;
+
+ subr_num = (unsigned int)n;
+ return true;
+ }
+
+ void call_subr (const biased_subrs_t<SUBRS>& biasedSubrs, cs_type_t type)
+ {
+ unsigned int subr_num = 0;
+
+ if (unlikely (!pop_subr_num (biasedSubrs, subr_num)
+ || callStack.get_count () >= kMaxCallLimit))
+ {
+ SUPER::set_error ();
+ return;
+ }
+ context.str_ref = SUPER::str_ref;
+ callStack.push (context);
+
+ context.init ( biasedSubrs[subr_num], type, subr_num);
+ SUPER::str_ref = context.str_ref;
+ }
+
+ void return_from_subr ()
+ {
+ if (unlikely (SUPER::str_ref.in_error ()))
+ SUPER::set_error ();
+ context = callStack.pop ();
+ SUPER::str_ref = context.str_ref;
+ }
+
+ void determine_hintmask_size ()
+ {
+ if (!seen_hintmask)
+ {
+ vstem_count += SUPER::argStack.get_count() / 2;
+ hintmask_size = (hstem_count + vstem_count + 7) >> 3;
+ seen_hintmask = true;
+ }
+ }
+
+ void set_endchar (bool endchar_flag_) { endchar_flag = endchar_flag_; }
+ bool is_endchar () const { return endchar_flag; }
+
+ const number_t &get_x () const { return pt.x; }
+ const number_t &get_y () const { return pt.y; }
+ const point_t &get_pt () const { return pt; }
+
+ void moveto (const point_t &pt_ ) { pt = pt_; }
+
+ public:
+ call_context_t context;
+ bool endchar_flag;
+ bool seen_moveto;
+ bool seen_hintmask;
+
+ unsigned int hstem_count;
+ unsigned int vstem_count;
+ unsigned int hintmask_size;
+ call_stack_t callStack;
+ biased_subrs_t<SUBRS> globalSubrs;
+ biased_subrs_t<SUBRS> localSubrs;
+
+ private:
+ point_t pt;
+
+ typedef interp_env_t<ARG> SUPER;
+};
+
+template <typename ENV, typename PARAM>
+struct path_procs_null_t
+{
+ static void rmoveto (ENV &env, PARAM& param) {}
+ static void hmoveto (ENV &env, PARAM& param) {}
+ static void vmoveto (ENV &env, PARAM& param) {}
+ static void rlineto (ENV &env, PARAM& param) {}
+ static void hlineto (ENV &env, PARAM& param) {}
+ static void vlineto (ENV &env, PARAM& param) {}
+ static void rrcurveto (ENV &env, PARAM& param) {}
+ static void rcurveline (ENV &env, PARAM& param) {}
+ static void rlinecurve (ENV &env, PARAM& param) {}
+ static void vvcurveto (ENV &env, PARAM& param) {}
+ static void hhcurveto (ENV &env, PARAM& param) {}
+ static void vhcurveto (ENV &env, PARAM& param) {}
+ static void hvcurveto (ENV &env, PARAM& param) {}
+ static void moveto (ENV &env, PARAM& param, const point_t &pt) {}
+ static void line (ENV &env, PARAM& param, const point_t &pt1) {}
+ static void curve (ENV &env, PARAM& param, const point_t &pt1, const point_t &pt2, const point_t &pt3) {}
+ static void hflex (ENV &env, PARAM& param) {}
+ static void flex (ENV &env, PARAM& param) {}
+ static void hflex1 (ENV &env, PARAM& param) {}
+ static void flex1 (ENV &env, PARAM& param) {}
+};
+
+template <typename ARG, typename OPSET, typename ENV, typename PARAM, typename PATH=path_procs_null_t<ENV, PARAM>>
+struct cs_opset_t : opset_t<ARG>
+{
+ static void process_op (op_code_t op, ENV &env, PARAM& param)
+ {
+ switch (op) {
+
+ case OpCode_return:
+ env.return_from_subr ();
+ break;
+ case OpCode_endchar:
+ OPSET::check_width (op, env, param);
+ env.set_endchar (true);
+ OPSET::flush_args_and_op (op, env, param);
+ break;
+
+ case OpCode_fixedcs:
+ env.argStack.push_fixed_from_substr (env.str_ref);
+ break;
+
+ case OpCode_callsubr:
+ env.call_subr (env.localSubrs, CSType_LocalSubr);
+ break;
+
+ case OpCode_callgsubr:
+ env.call_subr (env.globalSubrs, CSType_GlobalSubr);
+ break;
+
+ case OpCode_hstem:
+ case OpCode_hstemhm:
+ OPSET::check_width (op, env, param);
+ OPSET::process_hstem (op, env, param);
+ break;
+ case OpCode_vstem:
+ case OpCode_vstemhm:
+ OPSET::check_width (op, env, param);
+ OPSET::process_vstem (op, env, param);
+ break;
+ case OpCode_hintmask:
+ case OpCode_cntrmask:
+ OPSET::check_width (op, env, param);
+ OPSET::process_hintmask (op, env, param);
+ break;
+ case OpCode_rmoveto:
+ OPSET::check_width (op, env, param);
+ PATH::rmoveto (env, param);
+ OPSET::process_post_move (op, env, param);
+ break;
+ case OpCode_hmoveto:
+ OPSET::check_width (op, env, param);
+ PATH::hmoveto (env, param);
+ OPSET::process_post_move (op, env, param);
+ break;
+ case OpCode_vmoveto:
+ OPSET::check_width (op, env, param);
+ PATH::vmoveto (env, param);
+ OPSET::process_post_move (op, env, param);
+ break;
+ case OpCode_rlineto:
+ PATH::rlineto (env, param);
+ process_post_path (op, env, param);
+ break;
+ case OpCode_hlineto:
+ PATH::hlineto (env, param);
+ process_post_path (op, env, param);
+ break;
+ case OpCode_vlineto:
+ PATH::vlineto (env, param);
+ process_post_path (op, env, param);
+ break;
+ case OpCode_rrcurveto:
+ PATH::rrcurveto (env, param);
+ process_post_path (op, env, param);
+ break;
+ case OpCode_rcurveline:
+ PATH::rcurveline (env, param);
+ process_post_path (op, env, param);
+ break;
+ case OpCode_rlinecurve:
+ PATH::rlinecurve (env, param);
+ process_post_path (op, env, param);
+ break;
+ case OpCode_vvcurveto:
+ PATH::vvcurveto (env, param);
+ process_post_path (op, env, param);
+ break;
+ case OpCode_hhcurveto:
+ PATH::hhcurveto (env, param);
+ process_post_path (op, env, param);
+ break;
+ case OpCode_vhcurveto:
+ PATH::vhcurveto (env, param);
+ process_post_path (op, env, param);
+ break;
+ case OpCode_hvcurveto:
+ PATH::hvcurveto (env, param);
+ process_post_path (op, env, param);
+ break;
+
+ case OpCode_hflex:
+ PATH::hflex (env, param);
+ OPSET::process_post_flex (op, env, param);
+ break;
+
+ case OpCode_flex:
+ PATH::flex (env, param);
+ OPSET::process_post_flex (op, env, param);
+ break;
+
+ case OpCode_hflex1:
+ PATH::hflex1 (env, param);
+ OPSET::process_post_flex (op, env, param);
+ break;
+
+ case OpCode_flex1:
+ PATH::flex1 (env, param);
+ OPSET::process_post_flex (op, env, param);
+ break;
+
+ default:
+ SUPER::process_op (op, env);
+ break;
+ }
+ }
+
+ static void process_hstem (op_code_t op, ENV &env, PARAM& param)
+ {
+ env.hstem_count += env.argStack.get_count () / 2;
+ OPSET::flush_args_and_op (op, env, param);
+ }
+
+ static void process_vstem (op_code_t op, ENV &env, PARAM& param)
+ {
+ env.vstem_count += env.argStack.get_count () / 2;
+ OPSET::flush_args_and_op (op, env, param);
+ }
+
+ static void process_hintmask (op_code_t op, ENV &env, PARAM& param)
+ {
+ env.determine_hintmask_size ();
+ if (likely (env.str_ref.avail (env.hintmask_size)))
+ {
+ OPSET::flush_hintmask (op, env, param);
+ env.str_ref.inc (env.hintmask_size);
+ }
+ }
+
+ static void process_post_flex (op_code_t op, ENV &env, PARAM& param)
+ {
+ OPSET::flush_args_and_op (op, env, param);
+ }
+
+ static void check_width (op_code_t op, ENV &env, PARAM& param)
+ {}
+
+ static void process_post_move (op_code_t op, ENV &env, PARAM& param)
+ {
+ if (!env.seen_moveto)
+ {
+ env.determine_hintmask_size ();
+ env.seen_moveto = true;
+ }
+ OPSET::flush_args_and_op (op, env, param);
+ }
+
+ static void process_post_path (op_code_t op, ENV &env, PARAM& param)
+ {
+ OPSET::flush_args_and_op (op, env, param);
+ }
+
+ static void flush_args_and_op (op_code_t op, ENV &env, PARAM& param)
+ {
+ OPSET::flush_args (env, param);
+ OPSET::flush_op (op, env, param);
+ }
+
+ static void flush_args (ENV &env, PARAM& param)
+ {
+ env.pop_n_args (env.argStack.get_count ());
+ }
+
+ static void flush_op (op_code_t op, ENV &env, PARAM& param)
+ {
+ }
+
+ static void flush_hintmask (op_code_t op, ENV &env, PARAM& param)
+ {
+ OPSET::flush_args_and_op (op, env, param);
+ }
+
+ static bool is_number_op (op_code_t op)
+ {
+ switch (op)
+ {
+ case OpCode_shortint:
+ case OpCode_fixedcs:
+ case OpCode_TwoBytePosInt0: case OpCode_TwoBytePosInt1:
+ case OpCode_TwoBytePosInt2: case OpCode_TwoBytePosInt3:
+ case OpCode_TwoByteNegInt0: case OpCode_TwoByteNegInt1:
+ case OpCode_TwoByteNegInt2: case OpCode_TwoByteNegInt3:
+ return true;
+
+ default:
+ /* 1-byte integer */
+ return (OpCode_OneByteIntFirst <= op) && (op <= OpCode_OneByteIntLast);
+ }
+ }
+
+ protected:
+ typedef opset_t<ARG> SUPER;
+};
+
+template <typename PATH, typename ENV, typename PARAM>
+struct path_procs_t
+{
+ static void rmoveto (ENV &env, PARAM& param)
+ {
+ point_t pt1 = env.get_pt ();
+ const number_t &dy = env.pop_arg ();
+ const number_t &dx = env.pop_arg ();
+ pt1.move (dx, dy);
+ PATH::moveto (env, param, pt1);
+ }
+
+ static void hmoveto (ENV &env, PARAM& param)
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move_x (env.pop_arg ());
+ PATH::moveto (env, param, pt1);
+ }
+
+ static void vmoveto (ENV &env, PARAM& param)
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move_y (env.pop_arg ());
+ PATH::moveto (env, param, pt1);
+ }
+
+ static void rlineto (ENV &env, PARAM& param)
+ {
+ for (unsigned int i = 0; i + 2 <= env.argStack.get_count (); i += 2)
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+ PATH::line (env, param, pt1);
+ }
+ }
+
+ static void hlineto (ENV &env, PARAM& param)
+ {
+ point_t pt1;
+ unsigned int i = 0;
+ for (; i + 2 <= env.argStack.get_count (); i += 2)
+ {
+ pt1 = env.get_pt ();
+ pt1.move_x (env.eval_arg (i));
+ PATH::line (env, param, pt1);
+ pt1.move_y (env.eval_arg (i+1));
+ PATH::line (env, param, pt1);
+ }
+ if (i < env.argStack.get_count ())
+ {
+ pt1 = env.get_pt ();
+ pt1.move_x (env.eval_arg (i));
+ PATH::line (env, param, pt1);
+ }
+ }
+
+ static void vlineto (ENV &env, PARAM& param)
+ {
+ point_t pt1;
+ unsigned int i = 0;
+ for (; i + 2 <= env.argStack.get_count (); i += 2)
+ {
+ pt1 = env.get_pt ();
+ pt1.move_y (env.eval_arg (i));
+ PATH::line (env, param, pt1);
+ pt1.move_x (env.eval_arg (i+1));
+ PATH::line (env, param, pt1);
+ }
+ if (i < env.argStack.get_count ())
+ {
+ pt1 = env.get_pt ();
+ pt1.move_y (env.eval_arg (i));
+ PATH::line (env, param, pt1);
+ }
+ }
+
+ static void rrcurveto (ENV &env, PARAM& param)
+ {
+ for (unsigned int i = 0; i + 6 <= env.argStack.get_count (); i += 6)
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+ point_t pt2 = pt1;
+ pt2.move (env.eval_arg (i+2), env.eval_arg (i+3));
+ point_t pt3 = pt2;
+ pt3.move (env.eval_arg (i+4), env.eval_arg (i+5));
+ PATH::curve (env, param, pt1, pt2, pt3);
+ }
+ }
+
+ static void rcurveline (ENV &env, PARAM& param)
+ {
+ unsigned int i = 0;
+ for (; i + 6 <= env.argStack.get_count (); i += 6)
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+ point_t pt2 = pt1;
+ pt2.move (env.eval_arg (i+2), env.eval_arg (i+3));
+ point_t pt3 = pt2;
+ pt3.move (env.eval_arg (i+4), env.eval_arg (i+5));
+ PATH::curve (env, param, pt1, pt2, pt3);
+ }
+ for (; i + 2 <= env.argStack.get_count (); i += 2)
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+ PATH::line (env, param, pt1);
+ }
+ }
+
+ static void rlinecurve (ENV &env, PARAM& param)
+ {
+ unsigned int i = 0;
+ unsigned int line_limit = (env.argStack.get_count () % 6);
+ for (; i + 2 <= line_limit; i += 2)
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+ PATH::line (env, param, pt1);
+ }
+ for (; i + 6 <= env.argStack.get_count (); i += 6)
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+ point_t pt2 = pt1;
+ pt2.move (env.eval_arg (i+2), env.eval_arg (i+3));
+ point_t pt3 = pt2;
+ pt3.move (env.eval_arg (i+4), env.eval_arg (i+5));
+ PATH::curve (env, param, pt1, pt2, pt3);
+ }
+ }
+
+ static void vvcurveto (ENV &env, PARAM& param)
+ {
+ unsigned int i = 0;
+ point_t pt1 = env.get_pt ();
+ if ((env.argStack.get_count () & 1) != 0)
+ pt1.move_x (env.eval_arg (i++));
+ for (; i + 4 <= env.argStack.get_count (); i += 4)
+ {
+ pt1.move_y (env.eval_arg (i));
+ point_t pt2 = pt1;
+ pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+ point_t pt3 = pt2;
+ pt3.move_y (env.eval_arg (i+3));
+ PATH::curve (env, param, pt1, pt2, pt3);
+ pt1 = env.get_pt ();
+ }
+ }
+
+ static void hhcurveto (ENV &env, PARAM& param)
+ {
+ unsigned int i = 0;
+ point_t pt1 = env.get_pt ();
+ if ((env.argStack.get_count () & 1) != 0)
+ pt1.move_y (env.eval_arg (i++));
+ for (; i + 4 <= env.argStack.get_count (); i += 4)
+ {
+ pt1.move_x (env.eval_arg (i));
+ point_t pt2 = pt1;
+ pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+ point_t pt3 = pt2;
+ pt3.move_x (env.eval_arg (i+3));
+ PATH::curve (env, param, pt1, pt2, pt3);
+ pt1 = env.get_pt ();
+ }
+ }
+
+ static void vhcurveto (ENV &env, PARAM& param)
+ {
+ point_t pt1, pt2, pt3;
+ unsigned int i = 0;
+ if ((env.argStack.get_count () % 8) >= 4)
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move_y (env.eval_arg (i));
+ point_t pt2 = pt1;
+ pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+ point_t pt3 = pt2;
+ pt3.move_x (env.eval_arg (i+3));
+ i += 4;
+
+ for (; i + 8 <= env.argStack.get_count (); i += 8)
+ {
+ PATH::curve (env, param, pt1, pt2, pt3);
+ pt1 = env.get_pt ();
+ pt1.move_x (env.eval_arg (i));
+ pt2 = pt1;
+ pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+ pt3 = pt2;
+ pt3.move_y (env.eval_arg (i+3));
+ PATH::curve (env, param, pt1, pt2, pt3);
+
+ pt1 = pt3;
+ pt1.move_y (env.eval_arg (i+4));
+ pt2 = pt1;
+ pt2.move (env.eval_arg (i+5), env.eval_arg (i+6));
+ pt3 = pt2;
+ pt3.move_x (env.eval_arg (i+7));
+ }
+ if (i < env.argStack.get_count ())
+ pt3.move_y (env.eval_arg (i));
+ PATH::curve (env, param, pt1, pt2, pt3);
+ }
+ else
+ {
+ for (; i + 8 <= env.argStack.get_count (); i += 8)
+ {
+ pt1 = env.get_pt ();
+ pt1.move_y (env.eval_arg (i));
+ pt2 = pt1;
+ pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+ pt3 = pt2;
+ pt3.move_x (env.eval_arg (i+3));
+ PATH::curve (env, param, pt1, pt2, pt3);
+
+ pt1 = pt3;
+ pt1.move_x (env.eval_arg (i+4));
+ pt2 = pt1;
+ pt2.move (env.eval_arg (i+5), env.eval_arg (i+6));
+ pt3 = pt2;
+ pt3.move_y (env.eval_arg (i+7));
+ if ((env.argStack.get_count () - i < 16) && ((env.argStack.get_count () & 1) != 0))
+ pt3.move_x (env.eval_arg (i+8));
+ PATH::curve (env, param, pt1, pt2, pt3);
+ }
+ }
+ }
+
+ static void hvcurveto (ENV &env, PARAM& param)
+ {
+ point_t pt1, pt2, pt3;
+ unsigned int i = 0;
+ if ((env.argStack.get_count () % 8) >= 4)
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move_x (env.eval_arg (i));
+ point_t pt2 = pt1;
+ pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+ point_t pt3 = pt2;
+ pt3.move_y (env.eval_arg (i+3));
+ i += 4;
+
+ for (; i + 8 <= env.argStack.get_count (); i += 8)
+ {
+ PATH::curve (env, param, pt1, pt2, pt3);
+ pt1 = env.get_pt ();
+ pt1.move_y (env.eval_arg (i));
+ pt2 = pt1;
+ pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+ pt3 = pt2;
+ pt3.move_x (env.eval_arg (i+3));
+ PATH::curve (env, param, pt1, pt2, pt3);
+
+ pt1 = pt3;
+ pt1.move_x (env.eval_arg (i+4));
+ pt2 = pt1;
+ pt2.move (env.eval_arg (i+5), env.eval_arg (i+6));
+ pt3 = pt2;
+ pt3.move_y (env.eval_arg (i+7));
+ }
+ if (i < env.argStack.get_count ())
+ pt3.move_x (env.eval_arg (i));
+ PATH::curve (env, param, pt1, pt2, pt3);
+ }
+ else
+ {
+ for (; i + 8 <= env.argStack.get_count (); i += 8)
+ {
+ pt1 = env.get_pt ();
+ pt1.move_x (env.eval_arg (i));
+ pt2 = pt1;
+ pt2.move (env.eval_arg (i+1), env.eval_arg (i+2));
+ pt3 = pt2;
+ pt3.move_y (env.eval_arg (i+3));
+ PATH::curve (env, param, pt1, pt2, pt3);
+
+ pt1 = pt3;
+ pt1.move_y (env.eval_arg (i+4));
+ pt2 = pt1;
+ pt2.move (env.eval_arg (i+5), env.eval_arg (i+6));
+ pt3 = pt2;
+ pt3.move_x (env.eval_arg (i+7));
+ if ((env.argStack.get_count () - i < 16) && ((env.argStack.get_count () & 1) != 0))
+ pt3.move_y (env.eval_arg (i+8));
+ PATH::curve (env, param, pt1, pt2, pt3);
+ }
+ }
+ }
+
+ /* default actions to be overridden */
+ static void moveto (ENV &env, PARAM& param, const point_t &pt)
+ { env.moveto (pt); }
+
+ static void line (ENV &env, PARAM& param, const point_t &pt1)
+ { PATH::moveto (env, param, pt1); }
+
+ static void curve (ENV &env, PARAM& param, const point_t &pt1, const point_t &pt2, const point_t &pt3)
+ { PATH::moveto (env, param, pt3); }
+
+ static void hflex (ENV &env, PARAM& param)
+ {
+ if (likely (env.argStack.get_count () == 7))
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move_x (env.eval_arg (0));
+ point_t pt2 = pt1;
+ pt2.move (env.eval_arg (1), env.eval_arg (2));
+ point_t pt3 = pt2;
+ pt3.move_x (env.eval_arg (3));
+ point_t pt4 = pt3;
+ pt4.move_x (env.eval_arg (4));
+ point_t pt5 = pt4;
+ pt5.move_x (env.eval_arg (5));
+ pt5.y = pt1.y;
+ point_t pt6 = pt5;
+ pt6.move_x (env.eval_arg (6));
+
+ curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6);
+ }
+ else
+ env.set_error ();
+ }
+
+ static void flex (ENV &env, PARAM& param)
+ {
+ if (likely (env.argStack.get_count () == 13))
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move (env.eval_arg (0), env.eval_arg (1));
+ point_t pt2 = pt1;
+ pt2.move (env.eval_arg (2), env.eval_arg (3));
+ point_t pt3 = pt2;
+ pt3.move (env.eval_arg (4), env.eval_arg (5));
+ point_t pt4 = pt3;
+ pt4.move (env.eval_arg (6), env.eval_arg (7));
+ point_t pt5 = pt4;
+ pt5.move (env.eval_arg (8), env.eval_arg (9));
+ point_t pt6 = pt5;
+ pt6.move (env.eval_arg (10), env.eval_arg (11));
+
+ curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6);
+ }
+ else
+ env.set_error ();
+ }
+
+ static void hflex1 (ENV &env, PARAM& param)
+ {
+ if (likely (env.argStack.get_count () == 9))
+ {
+ point_t pt1 = env.get_pt ();
+ pt1.move (env.eval_arg (0), env.eval_arg (1));
+ point_t pt2 = pt1;
+ pt2.move (env.eval_arg (2), env.eval_arg (3));
+ point_t pt3 = pt2;
+ pt3.move_x (env.eval_arg (4));
+ point_t pt4 = pt3;
+ pt4.move_x (env.eval_arg (5));
+ point_t pt5 = pt4;
+ pt5.move (env.eval_arg (6), env.eval_arg (7));
+ point_t pt6 = pt5;
+ pt6.move_x (env.eval_arg (8));
+ pt6.y = env.get_pt ().y;
+
+ curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6);
+ }
+ else
+ env.set_error ();
+ }
+
+ static void flex1 (ENV &env, PARAM& param)
+ {
+ if (likely (env.argStack.get_count () == 11))
+ {
+ point_t d;
+ d.init ();
+ for (unsigned int i = 0; i < 10; i += 2)
+ d.move (env.eval_arg (i), env.eval_arg (i+1));
+
+ point_t pt1 = env.get_pt ();
+ pt1.move (env.eval_arg (0), env.eval_arg (1));
+ point_t pt2 = pt1;
+ pt2.move (env.eval_arg (2), env.eval_arg (3));
+ point_t pt3 = pt2;
+ pt3.move (env.eval_arg (4), env.eval_arg (5));
+ point_t pt4 = pt3;
+ pt4.move (env.eval_arg (6), env.eval_arg (7));
+ point_t pt5 = pt4;
+ pt5.move (env.eval_arg (8), env.eval_arg (9));
+ point_t pt6 = pt5;
+
+ if (fabs (d.x.to_real ()) > fabs (d.y.to_real ()))
+ {
+ pt6.move_x (env.eval_arg (10));
+ pt6.y = env.get_pt ().y;
+ }
+ else
+ {
+ pt6.x = env.get_pt ().x;
+ pt6.move_y (env.eval_arg (10));
+ }
+
+ curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6);
+ }
+ else
+ env.set_error ();
+ }
+
+ protected:
+ static void curve2 (ENV &env, PARAM& param,
+ const point_t &pt1, const point_t &pt2, const point_t &pt3,
+ const point_t &pt4, const point_t &pt5, const point_t &pt6)
+ {
+ PATH::curve (env, param, pt1, pt2, pt3);
+ PATH::curve (env, param, pt4, pt5, pt6);
+ }
+};
+
+template <typename ENV, typename OPSET, typename PARAM>
+struct cs_interpreter_t : interpreter_t<ENV>
+{
+ bool interpret (PARAM& param)
+ {
+ SUPER::env.set_endchar (false);
+
+ for (;;) {
+ OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param);
+ if (unlikely (SUPER::env.in_error ()))
+ return false;
+ if (SUPER::env.is_endchar ())
+ break;
+ }
+
+ return true;
+ }
+
+ private:
+ typedef interpreter_t<ENV> SUPER;
+};
+
+} /* namespace CFF */
+
+#endif /* HB_CFF_INTERP_CS_COMMON_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-dict-common.hh b/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-dict-common.hh
new file mode 100644
index 0000000000..1f03d82399
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-dict-common.hh
@@ -0,0 +1,216 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_CFF_INTERP_DICT_COMMON_HH
+#define HB_CFF_INTERP_DICT_COMMON_HH
+
+#include "hb-cff-interp-common.hh"
+#include <math.h>
+#include <float.h>
+
+namespace CFF {
+
+using namespace OT;
+
+/* an opstr and the parsed out dict value(s) */
+struct dict_val_t : op_str_t
+{
+ void init () { single_val.set_int (0); }
+ void fini () {}
+
+ number_t single_val;
+};
+
+typedef dict_val_t num_dict_val_t;
+
+template <typename VAL> struct dict_values_t : parsed_values_t<VAL> {};
+
+template <typename OPSTR=op_str_t>
+struct top_dict_values_t : dict_values_t<OPSTR>
+{
+ void init ()
+ {
+ dict_values_t<OPSTR>::init ();
+ charStringsOffset = 0;
+ FDArrayOffset = 0;
+ }
+ void fini () { dict_values_t<OPSTR>::fini (); }
+
+ unsigned int calculate_serialized_op_size (const OPSTR& opstr) const
+ {
+ switch (opstr.op)
+ {
+ case OpCode_CharStrings:
+ case OpCode_FDArray:
+ return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (opstr.op);
+
+ default:
+ return opstr.str.length;
+ }
+ }
+
+ unsigned int charStringsOffset;
+ unsigned int FDArrayOffset;
+};
+
+struct dict_opset_t : opset_t<number_t>
+{
+ static void process_op (op_code_t op, interp_env_t<number_t>& env)
+ {
+ switch (op) {
+ case OpCode_longintdict: /* 5-byte integer */
+ env.argStack.push_longint_from_substr (env.str_ref);
+ break;
+
+ case OpCode_BCD: /* real number */
+ env.argStack.push_real (parse_bcd (env.str_ref));
+ break;
+
+ default:
+ opset_t<number_t>::process_op (op, env);
+ break;
+ }
+ }
+
+ /* Turns CFF's BCD format into strtod understandable string */
+ static double parse_bcd (byte_str_ref_t& str_ref)
+ {
+ if (unlikely (str_ref.in_error ())) return .0;
+
+ enum Nibble { DECIMAL=10, EXP_POS, EXP_NEG, RESERVED, NEG, END };
+
+ char buf[32];
+ unsigned char byte = 0;
+ for (unsigned i = 0, count = 0; count < ARRAY_LENGTH (buf); ++i, ++count)
+ {
+ unsigned nibble;
+ if (!(i & 1))
+ {
+ if (unlikely (!str_ref.avail ())) break;
+
+ byte = str_ref[0];
+ str_ref.inc ();
+ nibble = byte >> 4;
+ }
+ else
+ nibble = byte & 0x0F;
+
+ if (unlikely (nibble == RESERVED)) break;
+ else if (nibble == END)
+ {
+ const char *p = buf;
+ double pv;
+ if (unlikely (!hb_parse_double (&p, p + count, &pv, true/* whole buffer */)))
+ break;
+ return pv;
+ }
+ else
+ {
+ buf[count] = "0123456789.EE?-?"[nibble];
+ if (nibble == EXP_NEG)
+ {
+ ++count;
+ if (unlikely (count == ARRAY_LENGTH (buf))) break;
+ buf[count] = '-';
+ }
+ }
+ }
+
+ str_ref.set_error ();
+ return .0;
+ }
+
+ static bool is_hint_op (op_code_t op)
+ {
+ switch (op)
+ {
+ case OpCode_BlueValues:
+ case OpCode_OtherBlues:
+ case OpCode_FamilyBlues:
+ case OpCode_FamilyOtherBlues:
+ case OpCode_StemSnapH:
+ case OpCode_StemSnapV:
+ case OpCode_StdHW:
+ case OpCode_StdVW:
+ case OpCode_BlueScale:
+ case OpCode_BlueShift:
+ case OpCode_BlueFuzz:
+ case OpCode_ForceBold:
+ case OpCode_LanguageGroup:
+ case OpCode_ExpansionFactor:
+ return true;
+ default:
+ return false;
+ }
+ }
+};
+
+template <typename VAL=op_str_t>
+struct top_dict_opset_t : dict_opset_t
+{
+ static void process_op (op_code_t op, interp_env_t<number_t>& env, top_dict_values_t<VAL> & dictval)
+ {
+ switch (op) {
+ case OpCode_CharStrings:
+ dictval.charStringsOffset = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+ case OpCode_FDArray:
+ dictval.FDArrayOffset = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+ case OpCode_FontMatrix:
+ env.clear_args ();
+ break;
+ default:
+ dict_opset_t::process_op (op, env);
+ break;
+ }
+ }
+};
+
+template <typename OPSET, typename PARAM, typename ENV=num_interp_env_t>
+struct dict_interpreter_t : interpreter_t<ENV>
+{
+ bool interpret (PARAM& param)
+ {
+ param.init ();
+ while (SUPER::env.str_ref.avail ())
+ {
+ OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param);
+ if (unlikely (SUPER::env.in_error ()))
+ return false;
+ }
+
+ return true;
+ }
+
+ private:
+ typedef interpreter_t<ENV> SUPER;
+};
+
+} /* namespace CFF */
+
+#endif /* HB_CFF_INTERP_DICT_COMMON_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cff1-interp-cs.hh b/src/3rdparty/harfbuzz-ng/src/hb-cff1-interp-cs.hh
new file mode 100644
index 0000000000..1c8762c172
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-cff1-interp-cs.hh
@@ -0,0 +1,161 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_CFF1_INTERP_CS_HH
+#define HB_CFF1_INTERP_CS_HH
+
+#include "hb.hh"
+#include "hb-cff-interp-cs-common.hh"
+
+namespace CFF {
+
+using namespace OT;
+
+typedef biased_subrs_t<CFF1Subrs> cff1_biased_subrs_t;
+
+struct cff1_cs_interp_env_t : cs_interp_env_t<number_t, CFF1Subrs>
+{
+ template <typename ACC>
+ void init (const byte_str_t &str, ACC &acc, unsigned int fd)
+ {
+ SUPER::init (str, acc.globalSubrs, acc.privateDicts[fd].localSubrs);
+ processed_width = false;
+ has_width = false;
+ arg_start = 0;
+ in_seac = false;
+ }
+
+ void fini () { SUPER::fini (); }
+
+ void set_width (bool has_width_)
+ {
+ if (likely (!processed_width && (SUPER::argStack.get_count () > 0)))
+ {
+ if (has_width_)
+ {
+ width = SUPER::argStack[0];
+ has_width = true;
+ arg_start = 1;
+ }
+ }
+ processed_width = true;
+ }
+
+ void clear_args ()
+ {
+ arg_start = 0;
+ SUPER::clear_args ();
+ }
+
+ void set_in_seac (bool _in_seac) { in_seac = _in_seac; }
+
+ bool processed_width;
+ bool has_width;
+ unsigned int arg_start;
+ number_t width;
+ bool in_seac;
+
+ private:
+ typedef cs_interp_env_t<number_t, CFF1Subrs> SUPER;
+};
+
+template <typename OPSET, typename PARAM, typename PATH=path_procs_null_t<cff1_cs_interp_env_t, PARAM>>
+struct cff1_cs_opset_t : cs_opset_t<number_t, OPSET, cff1_cs_interp_env_t, PARAM, PATH>
+{
+ /* PostScript-originated legacy opcodes (OpCode_add etc) are unsupported */
+ /* Type 1-originated deprecated opcodes, seac behavior of endchar and dotsection are supported */
+
+ static void process_op (op_code_t op, cff1_cs_interp_env_t &env, PARAM& param)
+ {
+ switch (op) {
+ case OpCode_dotsection:
+ SUPER::flush_args_and_op (op, env, param);
+ break;
+
+ case OpCode_endchar:
+ OPSET::check_width (op, env, param);
+ if (env.argStack.get_count () >= 4)
+ {
+ OPSET::process_seac (env, param);
+ }
+ OPSET::flush_args_and_op (op, env, param);
+ env.set_endchar (true);
+ break;
+
+ default:
+ SUPER::process_op (op, env, param);
+ }
+ }
+
+ static void check_width (op_code_t op, cff1_cs_interp_env_t &env, PARAM& param)
+ {
+ if (!env.processed_width)
+ {
+ bool has_width = false;
+ switch (op)
+ {
+ case OpCode_endchar:
+ case OpCode_hstem:
+ case OpCode_hstemhm:
+ case OpCode_vstem:
+ case OpCode_vstemhm:
+ case OpCode_hintmask:
+ case OpCode_cntrmask:
+ has_width = ((env.argStack.get_count () & 1) != 0);
+ break;
+ case OpCode_hmoveto:
+ case OpCode_vmoveto:
+ has_width = (env.argStack.get_count () > 1);
+ break;
+ case OpCode_rmoveto:
+ has_width = (env.argStack.get_count () > 2);
+ break;
+ default:
+ return;
+ }
+ env.set_width (has_width);
+ }
+ }
+
+ static void process_seac (cff1_cs_interp_env_t &env, PARAM& param)
+ {
+ }
+
+ static void flush_args (cff1_cs_interp_env_t &env, PARAM& param)
+ {
+ SUPER::flush_args (env, param);
+ env.clear_args (); /* pop off width */
+ }
+
+ private:
+ typedef cs_opset_t<number_t, OPSET, cff1_cs_interp_env_t, PARAM, PATH> SUPER;
+};
+
+template <typename OPSET, typename PARAM>
+struct cff1_cs_interpreter_t : cs_interpreter_t<cff1_cs_interp_env_t, OPSET, PARAM> {};
+
+} /* namespace CFF */
+
+#endif /* HB_CFF1_INTERP_CS_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cff2-interp-cs.hh b/src/3rdparty/harfbuzz-ng/src/hb-cff2-interp-cs.hh
new file mode 100644
index 0000000000..a72100e1ab
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-cff2-interp-cs.hh
@@ -0,0 +1,271 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_CFF2_INTERP_CS_HH
+#define HB_CFF2_INTERP_CS_HH
+
+#include "hb.hh"
+#include "hb-cff-interp-cs-common.hh"
+
+namespace CFF {
+
+using namespace OT;
+
+struct blend_arg_t : number_t
+{
+ void init ()
+ {
+ number_t::init ();
+ deltas.init ();
+ }
+
+ void fini ()
+ {
+ number_t::fini ();
+ deltas.fini_deep ();
+ }
+
+ void set_int (int v) { reset_blends (); number_t::set_int (v); }
+ void set_fixed (int32_t v) { reset_blends (); number_t::set_fixed (v); }
+ void set_real (double v) { reset_blends (); number_t::set_real (v); }
+
+ void set_blends (unsigned int numValues_, unsigned int valueIndex_,
+ unsigned int numBlends, hb_array_t<const blend_arg_t> blends_)
+ {
+ numValues = numValues_;
+ valueIndex = valueIndex_;
+ deltas.resize (numBlends);
+ for (unsigned int i = 0; i < numBlends; i++)
+ deltas[i] = blends_[i];
+ }
+
+ bool blending () const { return deltas.length > 0; }
+ void reset_blends ()
+ {
+ numValues = valueIndex = 0;
+ deltas.resize (0);
+ }
+
+ unsigned int numValues;
+ unsigned int valueIndex;
+ hb_vector_t<number_t> deltas;
+};
+
+typedef interp_env_t<blend_arg_t> BlendInterpEnv;
+typedef biased_subrs_t<CFF2Subrs> cff2_biased_subrs_t;
+
+struct cff2_cs_interp_env_t : cs_interp_env_t<blend_arg_t, CFF2Subrs>
+{
+ template <typename ACC>
+ void init (const byte_str_t &str, ACC &acc, unsigned int fd,
+ const int *coords_=nullptr, unsigned int num_coords_=0)
+ {
+ SUPER::init (str, acc.globalSubrs, acc.privateDicts[fd].localSubrs);
+
+ coords = coords_;
+ num_coords = num_coords_;
+ varStore = acc.varStore;
+ seen_blend = false;
+ seen_vsindex_ = false;
+ scalars.init ();
+ do_blend = (coords != nullptr) && num_coords && (varStore != &Null(CFF2VariationStore));
+ set_ivs (acc.privateDicts[fd].ivs);
+ }
+
+ void fini ()
+ {
+ scalars.fini ();
+ SUPER::fini ();
+ }
+
+ op_code_t fetch_op ()
+ {
+ if (this->str_ref.avail ())
+ return SUPER::fetch_op ();
+
+ /* make up return or endchar op */
+ if (this->callStack.is_empty ())
+ return OpCode_endchar;
+ else
+ return OpCode_return;
+ }
+
+ const blend_arg_t& eval_arg (unsigned int i)
+ {
+ blend_arg_t &arg = argStack[i];
+ blend_arg (arg);
+ return arg;
+ }
+
+ const blend_arg_t& pop_arg ()
+ {
+ blend_arg_t &arg = argStack.pop ();
+ blend_arg (arg);
+ return arg;
+ }
+
+ void process_blend ()
+ {
+ if (!seen_blend)
+ {
+ region_count = varStore->varStore.get_region_index_count (get_ivs ());
+ if (do_blend)
+ {
+ scalars.resize (region_count);
+ varStore->varStore.get_scalars (get_ivs (),
+ (int *)coords, num_coords,
+ &scalars[0], region_count);
+ }
+ seen_blend = true;
+ }
+ }
+
+ void process_vsindex ()
+ {
+ unsigned int index = argStack.pop_uint ();
+ if (unlikely (seen_vsindex () || seen_blend))
+ {
+ set_error ();
+ }
+ else
+ {
+ set_ivs (index);
+ }
+ seen_vsindex_ = true;
+ }
+
+ unsigned int get_region_count () const { return region_count; }
+ void set_region_count (unsigned int region_count_) { region_count = region_count_; }
+ unsigned int get_ivs () const { return ivs; }
+ void set_ivs (unsigned int ivs_) { ivs = ivs_; }
+ bool seen_vsindex () const { return seen_vsindex_; }
+
+ protected:
+ void blend_arg (blend_arg_t &arg)
+ {
+ if (do_blend && arg.blending ())
+ {
+ if (likely (scalars.length == arg.deltas.length))
+ {
+ double v = arg.to_real ();
+ for (unsigned int i = 0; i < scalars.length; i++)
+ {
+ v += (double)scalars[i] * arg.deltas[i].to_real ();
+ }
+ arg.set_real (v);
+ arg.deltas.resize (0);
+ }
+ }
+ }
+
+ protected:
+ const int *coords;
+ unsigned int num_coords;
+ const CFF2VariationStore *varStore;
+ unsigned int region_count;
+ unsigned int ivs;
+ hb_vector_t<float> scalars;
+ bool do_blend;
+ bool seen_vsindex_;
+ bool seen_blend;
+
+ typedef cs_interp_env_t<blend_arg_t, CFF2Subrs> SUPER;
+};
+template <typename OPSET, typename PARAM, typename PATH=path_procs_null_t<cff2_cs_interp_env_t, PARAM>>
+struct cff2_cs_opset_t : cs_opset_t<blend_arg_t, OPSET, cff2_cs_interp_env_t, PARAM, PATH>
+{
+ static void process_op (op_code_t op, cff2_cs_interp_env_t &env, PARAM& param)
+ {
+ switch (op) {
+ case OpCode_callsubr:
+ case OpCode_callgsubr:
+ /* a subroutine number shoudln't be a blended value */
+ if (unlikely (env.argStack.peek ().blending ()))
+ {
+ env.set_error ();
+ break;
+ }
+ SUPER::process_op (op, env, param);
+ break;
+
+ case OpCode_blendcs:
+ OPSET::process_blend (env, param);
+ break;
+
+ case OpCode_vsindexcs:
+ if (unlikely (env.argStack.peek ().blending ()))
+ {
+ env.set_error ();
+ break;
+ }
+ OPSET::process_vsindex (env, param);
+ break;
+
+ default:
+ SUPER::process_op (op, env, param);
+ }
+ }
+
+ static void process_blend (cff2_cs_interp_env_t &env, PARAM& param)
+ {
+ unsigned int n, k;
+
+ env.process_blend ();
+ k = env.get_region_count ();
+ n = env.argStack.pop_uint ();
+ /* copy the blend values into blend array of the default values */
+ unsigned int start = env.argStack.get_count () - ((k+1) * n);
+ /* let an obvious error case fail, but note CFF2 spec doesn't forbid n==0 */
+ if (unlikely (start > env.argStack.get_count ()))
+ {
+ env.set_error ();
+ return;
+ }
+ for (unsigned int i = 0; i < n; i++)
+ {
+ const hb_array_t<const blend_arg_t> blends = env.argStack.get_subarray (start + n + (i * k));
+ env.argStack[start + i].set_blends (n, i, k, blends);
+ }
+
+ /* pop off blend values leaving default values now adorned with blend values */
+ env.argStack.pop (k * n);
+ }
+
+ static void process_vsindex (cff2_cs_interp_env_t &env, PARAM& param)
+ {
+ env.process_vsindex ();
+ env.clear_args ();
+ }
+
+ private:
+ typedef cs_opset_t<blend_arg_t, OPSET, cff2_cs_interp_env_t, PARAM, PATH> SUPER;
+};
+
+template <typename OPSET, typename PARAM>
+struct cff2_cs_interpreter_t : cs_interpreter_t<cff2_cs_interp_env_t, OPSET, PARAM> {};
+
+} /* namespace CFF */
+
+#endif /* HB_CFF2_INTERP_CS_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-common.cc b/src/3rdparty/harfbuzz-ng/src/hb-common.cc
index cb1fb43ffb..0ae0c05f48 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-common.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-common.cc
@@ -26,33 +26,60 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-private.hh"
-
-#include "hb-mutex-private.hh"
-#include "hb-object-private.hh"
+#include "hb.hh"
+#include "hb-machinery.hh"
#include <locale.h>
-#ifdef HAVE_XLOCALE_H
-#include <xlocale.h>
+
+#ifdef HB_NO_SETLOCALE
+#define setlocale(Category, Locale) "C"
#endif
+/**
+ * SECTION:hb-common
+ * @title: hb-common
+ * @short_description: Common data types
+ * @include: hb.h
+ *
+ * Common data types used across HarfBuzz are defined here.
+ **/
+
/* hb_options_t */
-hb_options_union_t _hb_options;
+hb_atomic_int_t _hb_options;
void
-_hb_options_init (void)
+_hb_options_init ()
{
hb_options_union_t u;
u.i = 0;
- u.opts.initialized = 1;
+ u.opts.initialized = true;
+
+ const char *c = getenv ("HB_OPTIONS");
+ if (c)
+ {
+ while (*c)
+ {
+ const char *p = strchr (c, ':');
+ if (!p)
+ p = c + strlen (c);
+
+#define OPTION(name, symbol) \
+ if (0 == strncmp (c, name, p - c) && strlen (name) == static_cast<size_t>(p - c)) do { u.opts.symbol = true; } while (0)
+
+ OPTION ("uniscribe-bug-compatible", uniscribe_bug_compatible);
+ OPTION ("aat", aat);
+
+#undef OPTION
- char *c = getenv ("HB_OPTIONS");
- u.opts.uniscribe_bug_compatible = c && strstr (c, "uniscribe-bug-compatible");
+ c = *p ? p + 1 : p;
+ }
+
+ }
/* This is idempotent and threadsafe. */
- _hb_options = u;
+ _hb_options.set_relaxed (u.i);
}
@@ -60,12 +87,12 @@ _hb_options_init (void)
/**
* hb_tag_from_string:
- * @str: (array length=len) (element-type uint8_t):
- * @len:
+ * @str: (array length=len) (element-type uint8_t):
+ * @len:
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.2
**/
@@ -90,10 +117,10 @@ hb_tag_from_string (const char *str, int len)
/**
* hb_tag_to_string:
- * @tag:
- * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t):
+ * @tag:
+ * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t):
+ *
*
- *
*
* Since: 0.9.5
**/
@@ -118,12 +145,12 @@ const char direction_strings[][4] = {
/**
* hb_direction_from_string:
- * @str: (array length=len) (element-type uint8_t):
- * @len:
+ * @str: (array length=len) (element-type uint8_t):
+ * @len:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -146,11 +173,11 @@ hb_direction_from_string (const char *str, int len)
/**
* hb_direction_to_string:
- * @direction:
+ * @direction:
*
- *
*
- * Return value: (transfer none):
+ *
+ * Return value: (transfer none):
*
* Since: 0.9.2
**/
@@ -176,7 +203,7 @@ static const char canon_map[256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0,
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 0, 0, 0, 0, 0, 0,
- '-', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+ 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 0, 0, 0, '-',
0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 0, 0, 0, 0
@@ -219,13 +246,12 @@ struct hb_language_item_t {
struct hb_language_item_t *next;
hb_language_t lang;
- inline bool operator == (const char *s) const {
- return lang_equal (lang, s);
- }
+ bool operator == (const char *s) const
+ { return lang_equal (lang, s); }
- inline hb_language_item_t & operator = (const char *s) {
+ hb_language_item_t & operator = (const char *s) {
/* If a custom allocated is used calling strdup() pairs
- badly with a call to the custom free() in finish() below.
+ badly with a call to the custom free() in fini() below.
Therefore don't call strdup(), implement its behavior.
*/
size_t len = strlen(s) + 1;
@@ -240,23 +266,28 @@ struct hb_language_item_t {
return *this;
}
- void finish (void) { free ((void *) lang); }
+ void fini () { free ((void *) lang); }
};
/* Thread-safe lock-free language list */
-static hb_language_item_t *langs;
+static hb_atomic_ptr_t <hb_language_item_t> langs;
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
static void
-free_langs (void)
+free_langs ()
{
- while (langs) {
- hb_language_item_t *next = langs->next;
- langs->finish ();
- free (langs);
- langs = next;
+retry:
+ hb_language_item_t *first_lang = langs;
+ if (unlikely (!langs.cmpexch (first_lang, nullptr)))
+ goto retry;
+
+ while (first_lang) {
+ hb_language_item_t *next = first_lang->next;
+ first_lang->fini ();
+ free (first_lang);
+ first_lang = next;
}
}
#endif
@@ -265,7 +296,7 @@ static hb_language_item_t *
lang_find_or_insert (const char *key)
{
retry:
- hb_language_item_t *first_lang = (hb_language_item_t *) hb_atomic_ptr_get (&langs);
+ hb_language_item_t *first_lang = langs;
for (hb_language_item_t *lang = first_lang; lang; lang = lang->next)
if (*lang == key)
@@ -283,13 +314,14 @@ retry:
return nullptr;
}
- if (!hb_atomic_ptr_cmpexch (&langs, first_lang, lang)) {
- lang->finish ();
+ if (unlikely (!langs.cmpexch (first_lang, lang)))
+ {
+ lang->fini ();
free (lang);
goto retry;
}
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
if (!first_lang)
atexit (free_langs); /* First person registers atexit() callback. */
#endif
@@ -301,14 +333,14 @@ retry:
/**
* hb_language_from_string:
* @str: (array length=len) (element-type uint8_t): a string representing
- * ISO 639 language code
+ * a BCP 47 language tag
* @len: length of the @str, or -1 if it is %NULL-terminated.
*
- * Converts @str representing an ISO 639 language code to the corresponding
+ * Converts @str representing a BCP 47 language tag to the corresponding
* #hb_language_t.
*
* Return value: (transfer none):
- * The #hb_language_t corresponding to the ISO 639 language code.
+ * The #hb_language_t corresponding to the BCP 47 language tag.
*
* Since: 0.9.2
**/
@@ -323,7 +355,7 @@ hb_language_from_string (const char *str, int len)
{
/* NUL-terminate it. */
char strbuf[64];
- len = MIN (len, (int) sizeof (strbuf) - 1);
+ len = hb_min (len, (int) sizeof (strbuf) - 1);
memcpy (strbuf, str, len);
strbuf[len] = '\0';
item = lang_find_or_insert (strbuf);
@@ -349,31 +381,40 @@ hb_language_from_string (const char *str, int len)
const char *
hb_language_to_string (hb_language_t language)
{
- /* This is actually nullptr-safe! */
+ if (unlikely (!language)) return nullptr;
+
return language->s;
}
/**
* hb_language_get_default:
*
- *
+ * Get default language from current locale.
+ *
+ * Note that the first time this function is called, it calls
+ * "setlocale (LC_CTYPE, nullptr)" to fetch current locale. The underlying
+ * setlocale function is, in many implementations, NOT threadsafe. To avoid
+ * problems, call this function once before multiple threads can call it.
+ * This function is only used from hb_buffer_guess_segment_properties() by
+ * HarfBuzz itself.
*
* Return value: (transfer none):
*
* Since: 0.9.2
**/
hb_language_t
-hb_language_get_default (void)
+hb_language_get_default ()
{
- static hb_language_t default_language = HB_LANGUAGE_INVALID;
+ static hb_atomic_ptr_t <hb_language_t> default_language;
- hb_language_t language = (hb_language_t) hb_atomic_ptr_get (&default_language);
- if (unlikely (language == HB_LANGUAGE_INVALID)) {
+ hb_language_t language = default_language;
+ if (unlikely (language == HB_LANGUAGE_INVALID))
+ {
language = hb_language_from_string (setlocale (LC_CTYPE, nullptr), -1);
- (void) hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, language);
+ (void) default_language.cmpexch (HB_LANGUAGE_INVALID, language);
}
- return default_language;
+ return language;
}
@@ -385,7 +426,7 @@ hb_language_get_default (void)
*
* Converts an ISO 15924 script tag to a corresponding #hb_script_t.
*
- * Return value:
+ * Return value:
* An #hb_script_t corresponding to the ISO 15924 tag.
*
* Since: 0.9.2
@@ -407,7 +448,7 @@ hb_script_from_iso15924_tag (hb_tag_t tag)
case HB_TAG('Q','a','a','i'): return HB_SCRIPT_INHERITED;
case HB_TAG('Q','a','a','c'): return HB_SCRIPT_COPTIC;
- /* Script variants from http://unicode.org/iso15924/ */
+ /* Script variants from https://unicode.org/iso15924/ */
case HB_TAG('C','y','r','s'): return HB_SCRIPT_CYRILLIC;
case HB_TAG('L','a','t','f'): return HB_SCRIPT_LATIN;
case HB_TAG('L','a','t','g'): return HB_SCRIPT_LATIN;
@@ -434,7 +475,7 @@ hb_script_from_iso15924_tag (hb_tag_t tag)
* corresponding #hb_script_t. Shorthand for hb_tag_from_string() then
* hb_script_from_iso15924_tag().
*
- * Return value:
+ * Return value:
* An #hb_script_t corresponding to the ISO 15924 tag.
*
* Since: 0.9.2
@@ -447,7 +488,7 @@ hb_script_from_string (const char *str, int len)
/**
* hb_script_to_iso15924_tag:
- * @script: an #hb_script_ to convert.
+ * @script: an #hb_script_t to convert.
*
* See hb_script_from_iso15924_tag().
*
@@ -464,18 +505,18 @@ hb_script_to_iso15924_tag (hb_script_t script)
/**
* hb_script_get_horizontal_direction:
- * @script:
+ * @script:
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.2
**/
hb_direction_t
hb_script_get_horizontal_direction (hb_script_t script)
{
- /* http://goo.gl/x9ilM */
+ /* https://docs.google.com/spreadsheets/d/1Y90M0Ie3MUJ6UVCRDOypOtijlMDLNNyyLk36T6iMu0o */
switch ((hb_tag_t) script)
{
/* Unicode-1.1 additions */
@@ -524,12 +565,25 @@ hb_script_get_horizontal_direction (hb_script_t script)
case HB_SCRIPT_PSALTER_PAHLAVI:
/* Unicode-8.0 additions */
- case HB_SCRIPT_OLD_HUNGARIAN:
+ case HB_SCRIPT_HATRAN:
/* Unicode-9.0 additions */
case HB_SCRIPT_ADLAM:
+ /* Unicode-11.0 additions */
+ case HB_SCRIPT_HANIFI_ROHINGYA:
+ case HB_SCRIPT_OLD_SOGDIAN:
+ case HB_SCRIPT_SOGDIAN:
+
return HB_DIRECTION_RTL;
+
+
+ /* https://github.com/harfbuzz/harfbuzz/issues/1000 */
+ case HB_SCRIPT_OLD_HUNGARIAN:
+ case HB_SCRIPT_OLD_ITALIC:
+ case HB_SCRIPT_RUNIC:
+
+ return HB_DIRECTION_INVALID;
}
return HB_DIRECTION_LTR;
@@ -570,6 +624,19 @@ hb_user_data_array_t::get (hb_user_data_key_t *key)
/* hb_version */
+
+/**
+ * SECTION:hb-version
+ * @title: hb-version
+ * @short_description: Information about the version of HarfBuzz in use
+ * @include: hb.h
+ *
+ * These functions and macros allow accessing version of the HarfBuzz
+ * library used at compile- as well as run-time, and to direct code
+ * conditionally based on those versions, again, at compile- or run-time.
+ **/
+
+
/**
* hb_version:
* @major: (out): Library major version component.
@@ -600,20 +667,20 @@ hb_version (unsigned int *major,
* Since: 0.9.2
**/
const char *
-hb_version_string (void)
+hb_version_string ()
{
return HB_VERSION_STRING;
}
/**
* hb_version_atleast:
- * @major:
- * @minor:
- * @micro:
+ * @major:
+ * @minor:
+ * @micro:
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.30
**/
@@ -652,125 +719,24 @@ parse_char (const char **pp, const char *end, char c)
static bool
parse_uint (const char **pp, const char *end, unsigned int *pv)
{
- char buf[32];
- unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp));
- strncpy (buf, *pp, len);
- buf[len] = '\0';
-
- char *p = buf;
- char *pend = p;
- unsigned int v;
-
- /* Intentionally use strtol instead of strtoul, such that
- * -1 turns into "big number"... */
- errno = 0;
- v = strtol (p, &pend, 0);
- if (errno || p == pend)
- return false;
+ /* Intentionally use hb_parse_int inside instead of hb_parse_uint,
+ * such that -1 turns into "big number"... */
+ int v;
+ if (unlikely (!hb_parse_int (pp, end, &v))) return false;
*pv = v;
- *pp += pend - p;
return true;
}
static bool
parse_uint32 (const char **pp, const char *end, uint32_t *pv)
{
- char buf[32];
- unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp));
- strncpy (buf, *pp, len);
- buf[len] = '\0';
-
- char *p = buf;
- char *pend = p;
- unsigned int v;
-
- /* Intentionally use strtol instead of strtoul, such that
- * -1 turns into "big number"... */
- errno = 0;
- v = strtol (p, &pend, 0);
- if (errno || p == pend)
- return false;
-
- *pv = v;
- *pp += pend - p;
- return true;
-}
-
-#if defined (HAVE_NEWLOCALE) && defined (HAVE_STRTOD_L)
-#define USE_XLOCALE 1
-#define HB_LOCALE_T locale_t
-#define HB_CREATE_LOCALE(locName) newlocale (LC_ALL_MASK, locName, nullptr)
-#define HB_FREE_LOCALE(loc) freelocale (loc)
-#elif defined(_MSC_VER)
-#define USE_XLOCALE 1
-#define HB_LOCALE_T _locale_t
-#define HB_CREATE_LOCALE(locName) _create_locale (LC_ALL, locName)
-#define HB_FREE_LOCALE(loc) _free_locale (loc)
-#define strtod_l(a, b, c) _strtod_l ((a), (b), (c))
-#endif
-
-#ifdef USE_XLOCALE
-
-static HB_LOCALE_T C_locale;
-
-#ifdef HB_USE_ATEXIT
-static void
-free_C_locale (void)
-{
- if (C_locale)
- HB_FREE_LOCALE (C_locale);
-}
-#endif
-
-static HB_LOCALE_T
-get_C_locale (void)
-{
-retry:
- HB_LOCALE_T C = (HB_LOCALE_T) hb_atomic_ptr_get (&C_locale);
-
- if (unlikely (!C))
- {
- C = HB_CREATE_LOCALE ("C");
-
- if (!hb_atomic_ptr_cmpexch (&C_locale, nullptr, C))
- {
- HB_FREE_LOCALE (C_locale);
- goto retry;
- }
-
-#ifdef HB_USE_ATEXIT
- atexit (free_C_locale); /* First person registers atexit() callback. */
-#endif
- }
-
- return C;
-}
-#endif
-
-static bool
-parse_float (const char **pp, const char *end, float *pv)
-{
- char buf[32];
- unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp));
- strncpy (buf, *pp, len);
- buf[len] = '\0';
-
- char *p = buf;
- char *pend = p;
- float v;
-
- errno = 0;
-#ifdef USE_XLOCALE
- v = strtod_l (p, &pend, get_C_locale ());
-#else
- v = strtod (p, &pend);
-#endif
- if (errno || p == pend)
- return false;
+ /* Intentionally use hb_parse_int inside instead of hb_parse_uint,
+ * such that -1 turns into "big number"... */
+ int v;
+ if (unlikely (!hb_parse_int (pp, end, &v))) return false;
*pv = v;
- *pp += pend - p;
return true;
}
@@ -784,9 +750,14 @@ parse_bool (const char **pp, const char *end, uint32_t *pv)
(*pp)++;
/* CSS allows on/off as aliases 1/0. */
- if (*pp - p == 2 && 0 == strncmp (p, "on", 2))
+ if (*pp - p == 2
+ && TOLOWER (p[0]) == 'o'
+ && TOLOWER (p[1]) == 'n')
*pv = 1;
- else if (*pp - p == 3 && 0 == strncmp (p, "off", 3))
+ else if (*pp - p == 3
+ && TOLOWER (p[0]) == 'o'
+ && TOLOWER (p[1]) == 'f'
+ && TOLOWER (p[2]) == 'f')
*pv = 0;
else
return false;
@@ -823,7 +794,7 @@ parse_tag (const char **pp, const char *end, hb_tag_t *tag)
}
const char *p = *pp;
- while (*pp < end && ISALNUM(**pp))
+ while (*pp < end && (ISALNUM(**pp) || **pp == '_'))
(*pp)++;
if (p == *pp || *pp - p > 4)
@@ -852,15 +823,15 @@ parse_feature_indices (const char **pp, const char *end, hb_feature_t *feature)
bool has_start;
- feature->start = 0;
- feature->end = (unsigned int) -1;
+ feature->start = HB_FEATURE_GLOBAL_START;
+ feature->end = HB_FEATURE_GLOBAL_END;
if (!parse_char (pp, end, '['))
return true;
has_start = parse_uint (pp, end, &feature->start);
- if (parse_char (pp, end, ':')) {
+ if (parse_char (pp, end, ':') || parse_char (pp, end, ';')) {
parse_uint (pp, end, &feature->end);
} else {
if (has_start)
@@ -875,10 +846,10 @@ parse_feature_value_postfix (const char **pp, const char *end, hb_feature_t *fea
{
bool had_equal = parse_char (pp, end, '=');
bool had_value = parse_uint32 (pp, end, &feature->value) ||
- parse_bool (pp, end, &feature->value);
+ parse_bool (pp, end, &feature->value);
/* CSS doesn't use equal-sign between tag and value.
* If there was an equal-sign, then there *must* be a value.
- * A value without an eqaul-sign is ok, but not required. */
+ * A value without an equal-sign is ok, but not required. */
return !had_equal || had_value;
}
@@ -901,7 +872,41 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature)
*
* Parses a string into a #hb_feature_t.
*
- * TODO: document the syntax here.
+ * The format for specifying feature strings follows. All valid CSS
+ * font-feature-settings values other than 'normal' and the global values are
+ * also accepted, though not documented below. CSS string escapes are not
+ * supported.
+ *
+ * The range indices refer to the positions between Unicode characters. The
+ * position before the first character is always 0.
+ *
+ * The format is Python-esque. Here is how it all works:
+ *
+ * <informaltable pgwide='1' align='left' frame='none'>
+ * <tgroup cols='5'>
+ * <thead>
+ * <row><entry>Syntax</entry> <entry>Value</entry> <entry>Start</entry> <entry>End</entry></row>
+ * </thead>
+ * <tbody>
+ * <row><entry>Setting value:</entry></row>
+ * <row><entry>kern</entry> <entry>1</entry> <entry>0</entry> <entry>∞</entry> <entry>Turn feature on</entry></row>
+ * <row><entry>+kern</entry> <entry>1</entry> <entry>0</entry> <entry>∞</entry> <entry>Turn feature on</entry></row>
+ * <row><entry>-kern</entry> <entry>0</entry> <entry>0</entry> <entry>∞</entry> <entry>Turn feature off</entry></row>
+ * <row><entry>kern=0</entry> <entry>0</entry> <entry>0</entry> <entry>∞</entry> <entry>Turn feature off</entry></row>
+ * <row><entry>kern=1</entry> <entry>1</entry> <entry>0</entry> <entry>∞</entry> <entry>Turn feature on</entry></row>
+ * <row><entry>aalt=2</entry> <entry>2</entry> <entry>0</entry> <entry>∞</entry> <entry>Choose 2nd alternate</entry></row>
+ * <row><entry>Setting index:</entry></row>
+ * <row><entry>kern[]</entry> <entry>1</entry> <entry>0</entry> <entry>∞</entry> <entry>Turn feature on</entry></row>
+ * <row><entry>kern[:]</entry> <entry>1</entry> <entry>0</entry> <entry>∞</entry> <entry>Turn feature on</entry></row>
+ * <row><entry>kern[5:]</entry> <entry>1</entry> <entry>5</entry> <entry>∞</entry> <entry>Turn feature on, partial</entry></row>
+ * <row><entry>kern[:5]</entry> <entry>1</entry> <entry>0</entry> <entry>5</entry> <entry>Turn feature on, partial</entry></row>
+ * <row><entry>kern[3:5]</entry> <entry>1</entry> <entry>3</entry> <entry>5</entry> <entry>Turn feature on, range</entry></row>
+ * <row><entry>kern[3]</entry> <entry>1</entry> <entry>3</entry> <entry>3+1</entry> <entry>Turn feature on, single char</entry></row>
+ * <row><entry>Mixing it all:</entry></row>
+ * <row><entry>aalt[3:5]=2</entry> <entry>2</entry> <entry>3</entry> <entry>5</entry> <entry>Turn 2nd alternate on for range</entry></row>
+ * </tbody>
+ * </tgroup>
+ * </informaltable>
*
* Return value:
* %true if @str is successfully parsed, %false otherwise.
@@ -959,21 +964,21 @@ hb_feature_to_string (hb_feature_t *feature,
{
s[len++] = '[';
if (feature->start)
- len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->start));
+ len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->start));
if (feature->end != feature->start + 1) {
s[len++] = ':';
if (feature->end != (unsigned int) -1)
- len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->end));
+ len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->end));
}
s[len++] = ']';
}
if (feature->value > 1)
{
s[len++] = '=';
- len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->value));
+ len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->value));
}
assert (len < ARRAY_LENGTH (s));
- len = MIN (len, size - 1);
+ len = hb_min (len, size - 1);
memcpy (buf, s, len);
buf[len] = '\0';
}
@@ -984,7 +989,11 @@ static bool
parse_variation_value (const char **pp, const char *end, hb_variation_t *variation)
{
parse_char (pp, end, '='); /* Optional. */
- return parse_float (pp, end, &variation->value);
+ double v;
+ if (unlikely (!hb_parse_double (pp, end, &v))) return false;
+
+ variation->value = v;
+ return true;
}
static bool
@@ -1040,10 +1049,76 @@ hb_variation_to_string (hb_variation_t *variation,
while (len && s[len - 1] == ' ')
len--;
s[len++] = '=';
- len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", variation->value));
+ len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", (double) variation->value));
assert (len < ARRAY_LENGTH (s));
- len = MIN (len, size - 1);
+ len = hb_min (len, size - 1);
memcpy (buf, s, len);
buf[len] = '\0';
}
+
+/**
+ * hb_color_get_alpha:
+ * color: a #hb_color_t we are interested in its channels.
+ *
+ * Return value: Alpha channel value of the given color
+ *
+ * Since: 2.1.0
+ */
+uint8_t
+(hb_color_get_alpha) (hb_color_t color)
+{
+ return hb_color_get_alpha (color);
+}
+
+/**
+ * hb_color_get_red:
+ * color: a #hb_color_t we are interested in its channels.
+ *
+ * Return value: Red channel value of the given color
+ *
+ * Since: 2.1.0
+ */
+uint8_t
+(hb_color_get_red) (hb_color_t color)
+{
+ return hb_color_get_red (color);
+}
+
+/**
+ * hb_color_get_green:
+ * color: a #hb_color_t we are interested in its channels.
+ *
+ * Return value: Green channel value of the given color
+ *
+ * Since: 2.1.0
+ */
+uint8_t
+(hb_color_get_green) (hb_color_t color)
+{
+ return hb_color_get_green (color);
+}
+
+/**
+ * hb_color_get_blue:
+ * color: a #hb_color_t we are interested in its channels.
+ *
+ * Return value: Blue channel value of the given color
+ *
+ * Since: 2.1.0
+ */
+uint8_t
+(hb_color_get_blue) (hb_color_t color)
+{
+ return hb_color_get_blue (color);
+}
+
+
+/* If there is no visibility control, then hb-static.cc will NOT
+ * define anything. Instead, we get it to define one set in here
+ * only, so only libharfbuzz.so defines them, not other libs. */
+#ifdef HB_NO_VISIBILITY
+#undef HB_NO_VISIBILITY
+#include "hb-static.cc"
+#define HB_NO_VISIBILITY 1
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-common.h b/src/3rdparty/harfbuzz-ng/src/hb-common.h
index 26200ce125..037e50880e 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-common.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-common.h
@@ -33,6 +33,10 @@
#ifndef HB_COMMON_H
#define HB_COMMON_H
+#ifndef HB_EXTERN
+#define HB_EXTERN extern
+#endif
+
#ifndef HB_BEGIN_DECLS
# ifdef __cplusplus
# define HB_BEGIN_DECLS extern "C" {
@@ -49,10 +53,39 @@
# include <inttypes.h>
#elif defined (_AIX)
# include <sys/inttypes.h>
+#elif defined (_MSC_VER) && _MSC_VER < 1600
+/* VS 2010 (_MSC_VER 1600) has stdint.h */
+typedef __int8 int8_t;
+typedef unsigned __int8 uint8_t;
+typedef __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#elif defined (__KERNEL__)
+# include <linux/types.h>
#else
# include <stdint.h>
#endif
+#if defined(__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
+#define HB_DEPRECATED __attribute__((__deprecated__))
+#elif defined(_MSC_VER) && (_MSC_VER >= 1300)
+#define HB_DEPRECATED __declspec(deprecated)
+#else
+#define HB_DEPRECATED
+#endif
+
+#if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
+#define HB_DEPRECATED_FOR(f) __attribute__((__deprecated__("Use '" #f "' instead")))
+#elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320)
+#define HB_DEPRECATED_FOR(f) __declspec(deprecated("is deprecated. Use '" #f "' instead"))
+#else
+#define HB_DEPRECATED_FOR(f) HB_DEPRECATED
+#endif
+
+
HB_BEGIN_DECLS
@@ -76,8 +109,8 @@ typedef union _hb_var_int_t {
typedef uint32_t hb_tag_t;
-#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint8_t)(c1))<<24)|(((uint8_t)(c2))<<16)|(((uint8_t)(c3))<<8)|((uint8_t)(c4))))
-#define HB_UNTAG(tag) ((uint8_t)((tag)>>24)), ((uint8_t)((tag)>>16)), ((uint8_t)((tag)>>8)), ((uint8_t)(tag))
+#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
+#define HB_UNTAG(tag) (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
#define HB_TAG_NONE HB_TAG(0,0,0,0)
#define HB_TAG_MAX HB_TAG(0xff,0xff,0xff,0xff)
@@ -142,8 +175,8 @@ hb_language_get_default (void);
/* hb_script_t */
-/* http://unicode.org/iso15924/ */
-/* http://goo.gl/x9ilM */
+/* https://unicode.org/iso15924/ */
+/* https://docs.google.com/spreadsheets/d/1Y90M0Ie3MUJ6UVCRDOypOtijlMDLNNyyLk36T6iMu0o */
/* Unicode Character Database property: Script (sc) */
typedef enum
{
@@ -315,17 +348,38 @@ typedef enum
/*10.0*/HB_SCRIPT_SOYOMBO = HB_TAG ('S','o','y','o'),
/*10.0*/HB_SCRIPT_ZANABAZAR_SQUARE = HB_TAG ('Z','a','n','b'),
+ /*
+ * Since 1.8.0
+ */
+ /*11.0*/HB_SCRIPT_DOGRA = HB_TAG ('D','o','g','r'),
+ /*11.0*/HB_SCRIPT_GUNJALA_GONDI = HB_TAG ('G','o','n','g'),
+ /*11.0*/HB_SCRIPT_HANIFI_ROHINGYA = HB_TAG ('R','o','h','g'),
+ /*11.0*/HB_SCRIPT_MAKASAR = HB_TAG ('M','a','k','a'),
+ /*11.0*/HB_SCRIPT_MEDEFAIDRIN = HB_TAG ('M','e','d','f'),
+ /*11.0*/HB_SCRIPT_OLD_SOGDIAN = HB_TAG ('S','o','g','o'),
+ /*11.0*/HB_SCRIPT_SOGDIAN = HB_TAG ('S','o','g','d'),
+
+ /*
+ * Since 2.4.0
+ */
+ /*12.0*/HB_SCRIPT_ELYMAIC = HB_TAG ('E','l','y','m'),
+ /*12.0*/HB_SCRIPT_NANDINAGARI = HB_TAG ('N','a','n','d'),
+ /*12.0*/HB_SCRIPT_NYIAKENG_PUACHUE_HMONG = HB_TAG ('H','m','n','p'),
+ /*12.0*/HB_SCRIPT_WANCHO = HB_TAG ('W','c','h','o'),
+
/* No script set. */
HB_SCRIPT_INVALID = HB_TAG_NONE,
/* Dummy values to ensure any hb_tag_t value can be passed/stored as hb_script_t
- * without risking undefined behavior. Include both a signed and unsigned max,
- * since technically enums are int, and indeed, hb_script_t ends up being signed.
+ * without risking undefined behavior. We have two, for historical reasons.
+ * HB_TAG_MAX used to be unsigned, but that was invalid Ansi C, so was changed
+ * to _HB_SCRIPT_MAX_VALUE to be equal to HB_TAG_MAX_SIGNED as well.
+ *
* See this thread for technicalities:
*
- * http://lists.freedesktop.org/archives/harfbuzz/2014-March/004150.html
+ * https://lists.freedesktop.org/archives/harfbuzz/2014-March/004150.html
*/
- _HB_SCRIPT_MAX_VALUE = HB_TAG_MAX, /*< skip >*/
+ _HB_SCRIPT_MAX_VALUE = HB_TAG_MAX_SIGNED, /*< skip >*/
_HB_SCRIPT_MAX_VALUE_SIGNED = HB_TAG_MAX_SIGNED /*< skip >*/
} hb_script_t;
@@ -358,6 +412,34 @@ typedef void (*hb_destroy_func_t) (void *user_data);
/* Font features and variations. */
+/**
+ * HB_FEATURE_GLOBAL_START
+ *
+ * Since: 2.0.0
+ */
+#define HB_FEATURE_GLOBAL_START 0
+/**
+ * HB_FEATURE_GLOBAL_END
+ *
+ * Since: 2.0.0
+ */
+#define HB_FEATURE_GLOBAL_END ((unsigned int) -1)
+
+/**
+ * hb_feature_t:
+ * @tag: a feature tag
+ * @value: 0 disables the feature, non-zero (usually 1) enables the feature.
+ * For features implemented as lookup type 3 (like 'salt') the @value is a one
+ * based index into the alternates.
+ * @start: the cluster to start applying this feature setting (inclusive).
+ * @end: the cluster to end applying this feature setting (exclusive).
+ *
+ * The #hb_feature_t is the structure that holds information about requested
+ * feature application. The feature will be applied with the given value to all
+ * glyphs which are in clusters between @start (inclusive) and @end (exclusive).
+ * Setting start to @HB_FEATURE_GLOBAL_START and end to @HB_FEATURE_GLOBAL_END
+ * specifies that the feature always applies to the entire buffer.
+ */
typedef struct hb_feature_t {
hb_tag_t tag;
uint32_t value;
@@ -391,6 +473,32 @@ HB_EXTERN void
hb_variation_to_string (hb_variation_t *variation,
char *buf, unsigned int size);
+/**
+ * hb_color_t:
+ *
+ * Data type for holding color values.
+ *
+ * Since: 2.1.0
+ */
+typedef uint32_t hb_color_t;
+
+#define HB_COLOR(b,g,r,a) ((hb_color_t) HB_TAG ((b),(g),(r),(a)))
+
+HB_EXTERN uint8_t
+hb_color_get_alpha (hb_color_t color);
+#define hb_color_get_alpha(color) ((color) & 0xFF)
+
+HB_EXTERN uint8_t
+hb_color_get_red (hb_color_t color);
+#define hb_color_get_red(color) (((color) >> 8) & 0xFF)
+
+HB_EXTERN uint8_t
+hb_color_get_green (hb_color_t color);
+#define hb_color_get_green(color) (((color) >> 16) & 0xFF)
+
+HB_EXTERN uint8_t
+hb_color_get_blue (hb_color_t color);
+#define hb_color_get_blue(color) (((color) >> 24) & 0xFF)
HB_END_DECLS
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-config.hh b/src/3rdparty/harfbuzz-ng/src/hb-config.hh
new file mode 100644
index 0000000000..14c5395952
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-config.hh
@@ -0,0 +1,162 @@
+/*
+ * Copyright © 2019 Facebook, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Facebook Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_CONFIG_HH
+#define HB_CONFIG_HH
+
+#if 0 /* Make test happy. */
+#include "hb.hh"
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#ifdef HB_TINY
+#define HB_LEAN
+#define HB_MINI
+#define HB_NO_MT
+#define HB_NO_UCD_UNASSIGNED
+#ifndef NDEBUG
+#define NDEBUG
+#endif
+#ifndef __OPTIMIZE_SIZE__
+#define __OPTIMIZE_SIZE__
+#endif
+#endif
+
+#ifdef HB_LEAN
+#define HB_DISABLE_DEPRECATED
+#define HB_NDEBUG
+#define HB_NO_ATEXIT
+#define HB_NO_BUFFER_MESSAGE
+#define HB_NO_BUFFER_SERIALIZE
+#define HB_NO_BITMAP
+#define HB_NO_CFF
+#define HB_NO_COLOR
+#define HB_NO_ERRNO
+#define HB_NO_FACE_COLLECT_UNICODES
+#define HB_NO_GETENV
+#define HB_NO_HINTING
+#define HB_NO_LANGUAGE_PRIVATE_SUBTAG
+#define HB_NO_LAYOUT_FEATURE_PARAMS
+#define HB_NO_LAYOUT_COLLECT_GLYPHS
+#define HB_NO_LAYOUT_UNUSED
+#define HB_NO_MATH
+#define HB_NO_META
+#define HB_NO_METRICS
+#define HB_NO_MMAP
+#define HB_NO_NAME
+#define HB_NO_OPEN
+#define HB_NO_SETLOCALE
+#define HB_NO_OT_FONT_GLYPH_NAMES
+#define HB_NO_OT_SHAPE_FRACTIONS
+#define HB_NO_STAT
+#define HB_NO_SUBSET_LAYOUT
+#define HB_NO_VAR
+#endif
+
+#ifdef HB_MINI
+#define HB_NO_AAT
+#define HB_NO_LEGACY
+#endif
+
+
+/* Closure of options. */
+
+#ifdef HB_DISABLE_DEPRECATED
+#define HB_IF_NOT_DEPRECATED(x)
+#else
+#define HB_IF_NOT_DEPRECATED(x) x
+#endif
+
+#ifdef HB_NO_AAT
+#define HB_NO_OT_NAME_LANGUAGE_AAT
+#define HB_NO_AAT_SHAPE
+#endif
+
+#ifdef HB_NO_BITMAP
+#define HB_NO_OT_FONT_BITMAP
+#endif
+
+#ifdef HB_NO_CFF
+#define HB_NO_OT_FONT_CFF
+#define HB_NO_SUBSET_CFF
+#endif
+
+#ifdef HB_NO_GETENV
+#define HB_NO_UNISCRIBE_BUG_COMPATIBLE
+#endif
+
+#ifdef HB_NO_LEGACY
+#define HB_NO_CMAP_LEGACY_SUBTABLES
+#define HB_NO_FALLBACK_SHAPE
+#define HB_NO_OT_KERN
+#define HB_NO_OT_LAYOUT_BLACKLIST
+#define HB_NO_OT_SHAPE_FALLBACK
+#endif
+
+#ifdef HB_NO_NAME
+#define HB_NO_OT_NAME_LANGUAGE
+#endif
+
+#ifdef HB_NO_OT
+#define HB_NO_OT_FONT
+#define HB_NO_OT_LAYOUT
+#define HB_NO_OT_TAG
+#define HB_NO_OT_SHAPE
+#endif
+
+#ifdef HB_NO_OT_SHAPE
+#define HB_NO_AAT_SHAPE
+#endif
+
+#ifdef HB_NO_OT_SHAPE_FALLBACK
+#define HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK
+#define HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK
+#define HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK
+#define HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS
+#endif
+
+#ifdef NDEBUG
+#ifndef HB_NDEBUG
+#define HB_NDEBUG
+#endif
+#endif
+
+#ifdef __OPTIMIZE_SIZE__
+#ifndef HB_OPTIMIZE_SIZE
+#define HB_OPTIMIZE_SIZE
+#endif
+#endif
+
+#ifdef HAVE_CONFIG_OVERRIDE_H
+#include "config-override.h"
+#endif
+
+
+#endif /* HB_CONFIG_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc b/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc
index d64cb7edbd..8885cfe730 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc
@@ -26,28 +26,25 @@
* Google Author(s): Behdad Esfahbod
*/
-#define HB_SHAPER coretext
+#include "hb.hh"
-#include "hb-private.hh"
-#include "hb-debug.hh"
-#include "hb-shaper-impl-private.hh"
+#ifdef HAVE_CORETEXT
+
+#include "hb-shaper-impl.hh"
#include "hb-coretext.h"
+#include "hb-aat-layout.hh"
#include <math.h>
-typedef bool (*qt_get_font_table_func_t) (void *user_data, unsigned int tag, unsigned char *buffer, unsigned int *length);
-
-struct FontEngineFaceData {
- void *user_data;
- qt_get_font_table_func_t get_font_table;
-};
-
-struct CoreTextFontEngineData {
- CTFontRef ctFont;
- CGFontRef cgFont;
-};
-
+/**
+ * SECTION:hb-coretext
+ * @title: hb-coretext
+ * @short_description: CoreText integration
+ * @include: hb-coretext.h
+ *
+ * Functions for using HarfBuzz with the CoreText fonts.
+ **/
/* https://developer.apple.com/documentation/coretext/1508745-ctfontcreatewithgraphicsfont */
#define HB_CORETEXT_DEFAULT_FONT_SIZE 12.f
@@ -60,7 +57,7 @@ release_table_data (void *user_data)
}
static hb_blob_t *
-reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
+_hb_cg_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
{
CGFontRef cg_font = reinterpret_cast<CGFontRef> (user_data);
CFDataRef cf_data = CGFontCopyTableForTag (cg_font, tag);
@@ -70,7 +67,10 @@ reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
const char *data = reinterpret_cast<const char*> (CFDataGetBytePtr (cf_data));
const size_t length = CFDataGetLength (cf_data);
if (!data || !length)
+ {
+ CFRelease (cf_data);
return nullptr;
+ }
return hb_blob_create (data, length, HB_MEMORY_MODE_READONLY,
reinterpret_cast<void *> (const_cast<__CFData *> (cf_data)),
@@ -84,13 +84,8 @@ _hb_cg_font_release (void *data)
}
-HB_SHAPER_DATA_ENSURE_DEFINE(coretext, face)
-HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(coretext, font,
- fabs (CTFontGetSize ((CTFontRef) data) - font->ptem) <= .5
-)
-
static CTFontDescriptorRef
-get_last_resort_font_desc (void)
+get_last_resort_font_desc ()
{
// TODO Handle allocation failures?
CTFontDescriptorRef last_resort = CTFontDescriptorCreateWithNameAndSize (CFSTR("LastResort"), 0);
@@ -116,7 +111,7 @@ static void
release_data (void *info, const void *data, size_t size)
{
assert (hb_blob_get_length ((hb_blob_t *) info) == size &&
- hb_blob_get_data ((hb_blob_t *) info, nullptr) == data);
+ hb_blob_get_data ((hb_blob_t *) info, nullptr) == data);
hb_blob_destroy ((hb_blob_t *) info);
}
@@ -131,7 +126,6 @@ create_cg_font (hb_face_t *face)
}
else
{
-#if 0
hb_blob_t *blob = hb_face_reference_blob (face);
unsigned int blob_length;
const char *blob_data = hb_blob_get_data (blob, &blob_length);
@@ -146,11 +140,6 @@ create_cg_font (hb_face_t *face)
DEBUG_MSG (CORETEXT, face, "Face CGFontCreateWithDataProvider() failed");
CGDataProviderRelease (provider);
}
-#else
- FontEngineFaceData *fontEngineFaceData = (FontEngineFaceData *) face->user_data;
- CoreTextFontEngineData *coreTextFontEngineData = (CoreTextFontEngineData *) fontEngineFaceData->user_data;
- cg_font = CGFontRetain (coreTextFontEngineData->cgFont);
-#endif
}
return cg_font;
}
@@ -167,6 +156,10 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size)
if (CFStringHasPrefix (cg_postscript_name, CFSTR (".SFNSText")) ||
CFStringHasPrefix (cg_postscript_name, CFSTR (".SFNSDisplay")))
{
+#if !(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) && MAC_OS_X_VERSION_MIN_REQUIRED < 1080
+# define kCTFontUIFontSystem kCTFontSystemFontType
+# define kCTFontUIFontEmphasizedSystem kCTFontEmphasizedSystemFontType
+#endif
CTFontUIFontType font_type = kCTFontUIFontSystem;
if (CFStringHasSuffix (cg_postscript_name, CFSTR ("-Bold")))
font_type = kCTFontUIFontEmphasizedSystem;
@@ -205,7 +198,18 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size)
return ct_font;
}
- CFURLRef original_url = (CFURLRef)CTFontCopyAttribute(ct_font, kCTFontURLAttribute);
+ CFURLRef original_url = nullptr;
+#if !(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) && MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+ ATSFontRef atsFont;
+ FSRef fsref;
+ OSStatus status;
+ atsFont = CTFontGetPlatformFont (ct_font, NULL);
+ status = ATSFontGetFileReference (atsFont, &fsref);
+ if (status == noErr)
+ original_url = CFURLCreateFromFSRef (NULL, &fsref);
+#else
+ original_url = (CFURLRef) CTFontCopyAttribute (ct_font, kCTFontURLAttribute);
+#endif
/* Create font copy with cascade list that has LastResort first; this speeds up CoreText
* font fallback which we don't need anyway. */
@@ -224,18 +228,26 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size)
* system locations that we cannot access from the sandboxed renderer
* process in Blink. This can be detected by the new file URL location
* that the newly found font points to. */
- CFURLRef new_url = (CFURLRef) CTFontCopyAttribute (new_ct_font, kCTFontURLAttribute);
+ CFURLRef new_url = nullptr;
+#if !(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) && MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+ atsFont = CTFontGetPlatformFont (new_ct_font, NULL);
+ status = ATSFontGetFileReference (atsFont, &fsref);
+ if (status == noErr)
+ new_url = CFURLCreateFromFSRef (NULL, &fsref);
+#else
+ new_url = (CFURLRef) CTFontCopyAttribute (new_ct_font, kCTFontURLAttribute);
+#endif
// Keep reconfigured font if URL cannot be retrieved (seems to be the case
// on Mac OS 10.12 Sierra), speculative fix for crbug.com/625606
if (!original_url || !new_url || CFEqual (original_url, new_url)) {
- CFRelease (ct_font);
- ct_font = new_ct_font;
+ CFRelease (ct_font);
+ ct_font = new_ct_font;
} else {
- CFRelease (new_ct_font);
- DEBUG_MSG (CORETEXT, ct_font, "Discarding reconfigured CTFont, location changed.");
+ CFRelease (new_ct_font);
+ DEBUG_MSG (CORETEXT, ct_font, "Discarding reconfigured CTFont, location changed.");
}
if (new_url)
- CFRelease (new_url);
+ CFRelease (new_url);
}
else
DEBUG_MSG (CORETEXT, ct_font, "Font copy with empty cascade list failed");
@@ -246,7 +258,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size)
return ct_font;
}
-hb_coretext_shaper_face_data_t *
+hb_coretext_face_data_t *
_hb_coretext_shaper_face_data_create (hb_face_t *face)
{
CGFontRef cg_font = create_cg_font (face);
@@ -257,11 +269,11 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face)
return nullptr;
}
- return (hb_coretext_shaper_face_data_t *) cg_font;
+ return (hb_coretext_face_data_t *) cg_font;
}
void
-_hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data)
+_hb_coretext_shaper_face_data_destroy (hb_coretext_face_data_t *data)
{
CFRelease ((CGFontRef) data);
}
@@ -269,7 +281,7 @@ _hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data)
hb_face_t *
hb_coretext_face_create (CGFontRef cg_font)
{
- return hb_face_create_for_tables (reference_table, CGFontRetain (cg_font), _hb_cg_font_release);
+ return hb_face_create_for_tables (_hb_cg_reference_table, CGFontRetain (cg_font), _hb_cg_font_release);
}
/*
@@ -278,19 +290,19 @@ hb_coretext_face_create (CGFontRef cg_font)
CGFontRef
hb_coretext_face_get_cg_font (hb_face_t *face)
{
- if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return nullptr;
- return (CGFontRef) HB_SHAPER_DATA_GET (face);
+ return (CGFontRef) (const void *) face->data.coretext;
}
-hb_coretext_shaper_font_data_t *
+hb_coretext_font_data_t *
_hb_coretext_shaper_font_data_create (hb_font_t *font)
{
hb_face_t *face = font->face;
- if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return nullptr;
- CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face);
+ const hb_coretext_face_data_t *face_data = face->data.coretext;
+ if (unlikely (!face_data)) return nullptr;
+ CGFontRef cg_font = (CGFontRef) (const void *) face->data.coretext;
- CGFloat font_size = font->ptem <= 0.f ? HB_CORETEXT_DEFAULT_FONT_SIZE : font->ptem;
+ CGFloat font_size = (CGFloat) (font->ptem <= 0.f ? HB_CORETEXT_DEFAULT_FONT_SIZE : font->ptem);
CTFontRef ct_font = create_ct_font (cg_font, font_size);
if (unlikely (!ct_font))
@@ -299,34 +311,66 @@ _hb_coretext_shaper_font_data_create (hb_font_t *font)
return nullptr;
}
- return (hb_coretext_shaper_font_data_t *) ct_font;
+ return (hb_coretext_font_data_t *) ct_font;
}
void
-_hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data)
+_hb_coretext_shaper_font_data_destroy (hb_coretext_font_data_t *data)
{
CFRelease ((CTFontRef) data);
}
+static const hb_coretext_font_data_t *
+hb_coretext_font_data_sync (hb_font_t *font)
+{
+retry:
+ const hb_coretext_font_data_t *data = font->data.coretext;
+ if (unlikely (!data)) return nullptr;
+
+ if (fabs (CTFontGetSize ((CTFontRef) data) - (CGFloat) font->ptem) > .5)
+ {
+ /* XXX-MT-bug
+ * Note that evaluating condition above can be dangerous if another thread
+ * got here first and destructed data. That's, as always, bad use pattern.
+ * If you modify the font (change font size), other threads must not be
+ * using it at the same time. However, since this check is delayed to
+ * when one actually tries to shape something, this is a XXX race condition
+ * (and the only one we have that I know of) right now. Ie. you modify the
+ * font size in one thread, then (supposedly safely) try to use it from two
+ * or more threads and BOOM! I'm not sure how to fix this. We want RCU.
+ */
+
+ /* Drop and recreate. */
+ /* If someone dropped it in the mean time, throw it away and don't touch it.
+ * Otherwise, destruct it. */
+ if (likely (font->data.coretext.cmpexch (const_cast<hb_coretext_font_data_t *> (data), nullptr)))
+ _hb_coretext_shaper_font_data_destroy (const_cast<hb_coretext_font_data_t *> (data));
+ else
+ goto retry;
+ }
+ return font->data.coretext;
+}
+
+
/*
* Since: 1.7.2
*/
hb_font_t *
hb_coretext_font_create (CTFontRef ct_font)
{
- CGFontRef cg_font = CTFontCopyGraphicsFont (ct_font, 0);
+ CGFontRef cg_font = CTFontCopyGraphicsFont (ct_font, nullptr);
hb_face_t *face = hb_coretext_face_create (cg_font);
CFRelease (cg_font);
hb_font_t *font = hb_font_create (face);
hb_face_destroy (face);
- if (unlikely (hb_object_is_inert (font)))
+ if (unlikely (hb_object_is_immutable (font)))
return font;
hb_font_set_ptem (font, CTFontGetSize (ct_font));
/* Let there be dragons here... */
- HB_SHAPER_DATA_GET (font) = (hb_coretext_shaper_font_data_t *) CFRetain (ct_font);
+ font->data.coretext.cmpexch (nullptr, (hb_coretext_font_data_t *) CFRetain (ct_font));
return font;
}
@@ -334,31 +378,8 @@ hb_coretext_font_create (CTFontRef ct_font)
CTFontRef
hb_coretext_font_get_ct_font (hb_font_t *font)
{
- if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return nullptr;
- return (CTFontRef) HB_SHAPER_DATA_GET (font);
-}
-
-
-
-/*
- * shaper shape_plan data
- */
-
-struct hb_coretext_shaper_shape_plan_data_t {};
-
-hb_coretext_shaper_shape_plan_data_t *
-_hb_coretext_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED,
- const hb_feature_t *user_features HB_UNUSED,
- unsigned int num_user_features HB_UNUSED,
- const int *coords HB_UNUSED,
- unsigned int num_coords HB_UNUSED)
-{
- return (hb_coretext_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
-}
-
-void
-_hb_coretext_shaper_shape_plan_data_destroy (hb_coretext_shaper_shape_plan_data_t *data HB_UNUSED)
-{
+ const hb_coretext_font_data_t *data = hb_coretext_font_data_sync (font);
+ return data ? (CTFontRef) data : nullptr;
}
@@ -375,7 +396,7 @@ struct active_feature_t {
feature_record_t rec;
unsigned int order;
- static int cmp (const void *pa, const void *pb) {
+ HB_INTERNAL static int cmp (const void *pa, const void *pb) {
const active_feature_t *a = (const active_feature_t *) pa;
const active_feature_t *b = (const active_feature_t *) pb;
return a->rec.feature < b->rec.feature ? -1 : a->rec.feature > b->rec.feature ? 1 :
@@ -393,7 +414,7 @@ struct feature_event_t {
bool start;
active_feature_t feature;
- static int cmp (const void *pa, const void *pb) {
+ HB_INTERNAL static int cmp (const void *pa, const void *pb) {
const feature_event_t *a = (const feature_event_t *) pa;
const feature_event_t *b = (const feature_event_t *) pb;
return a->index < b->index ? -1 : a->index > b->index ? 1 :
@@ -409,200 +430,23 @@ struct range_record_t {
};
-/* The following enum members are added in OS X 10.8. */
-#define kAltHalfWidthTextSelector 6
-#define kAltProportionalTextSelector 5
-#define kAlternateHorizKanaOffSelector 1
-#define kAlternateHorizKanaOnSelector 0
-#define kAlternateKanaType 34
-#define kAlternateVertKanaOffSelector 3
-#define kAlternateVertKanaOnSelector 2
-#define kCaseSensitiveLayoutOffSelector 1
-#define kCaseSensitiveLayoutOnSelector 0
-#define kCaseSensitiveLayoutType 33
-#define kCaseSensitiveSpacingOffSelector 3
-#define kCaseSensitiveSpacingOnSelector 2
-#define kContextualAlternatesOffSelector 1
-#define kContextualAlternatesOnSelector 0
-#define kContextualAlternatesType 36
-#define kContextualLigaturesOffSelector 19
-#define kContextualLigaturesOnSelector 18
-#define kContextualSwashAlternatesOffSelector 5
-#define kContextualSwashAlternatesOnSelector 4
-#define kDefaultLowerCaseSelector 0
-#define kDefaultUpperCaseSelector 0
-#define kHistoricalLigaturesOffSelector 21
-#define kHistoricalLigaturesOnSelector 20
-#define kHojoCharactersSelector 12
-#define kJIS2004CharactersSelector 11
-#define kLowerCasePetiteCapsSelector 2
-#define kLowerCaseSmallCapsSelector 1
-#define kLowerCaseType 37
-#define kMathematicalGreekOffSelector 11
-#define kMathematicalGreekOnSelector 10
-#define kNLCCharactersSelector 13
-#define kQuarterWidthTextSelector 4
-#define kScientificInferiorsSelector 4
-#define kStylisticAltEightOffSelector 17
-#define kStylisticAltEightOnSelector 16
-#define kStylisticAltEighteenOffSelector 37
-#define kStylisticAltEighteenOnSelector 36
-#define kStylisticAltElevenOffSelector 23
-#define kStylisticAltElevenOnSelector 22
-#define kStylisticAltFifteenOffSelector 31
-#define kStylisticAltFifteenOnSelector 30
-#define kStylisticAltFiveOffSelector 11
-#define kStylisticAltFiveOnSelector 10
-#define kStylisticAltFourOffSelector 9
-#define kStylisticAltFourOnSelector 8
-#define kStylisticAltFourteenOffSelector 29
-#define kStylisticAltFourteenOnSelector 28
-#define kStylisticAltNineOffSelector 19
-#define kStylisticAltNineOnSelector 18
-#define kStylisticAltNineteenOffSelector 39
-#define kStylisticAltNineteenOnSelector 38
-#define kStylisticAltOneOffSelector 3
-#define kStylisticAltOneOnSelector 2
-#define kStylisticAltSevenOffSelector 15
-#define kStylisticAltSevenOnSelector 14
-#define kStylisticAltSeventeenOffSelector 35
-#define kStylisticAltSeventeenOnSelector 34
-#define kStylisticAltSixOffSelector 13
-#define kStylisticAltSixOnSelector 12
-#define kStylisticAltSixteenOffSelector 33
-#define kStylisticAltSixteenOnSelector 32
-#define kStylisticAltTenOffSelector 21
-#define kStylisticAltTenOnSelector 20
-#define kStylisticAltThirteenOffSelector 27
-#define kStylisticAltThirteenOnSelector 26
-#define kStylisticAltThreeOffSelector 7
-#define kStylisticAltThreeOnSelector 6
-#define kStylisticAltTwelveOffSelector 25
-#define kStylisticAltTwelveOnSelector 24
-#define kStylisticAltTwentyOffSelector 41
-#define kStylisticAltTwentyOnSelector 40
-#define kStylisticAltTwoOffSelector 5
-#define kStylisticAltTwoOnSelector 4
-#define kStylisticAlternativesType 35
-#define kSwashAlternatesOffSelector 3
-#define kSwashAlternatesOnSelector 2
-#define kThirdWidthTextSelector 3
-#define kTraditionalNamesCharactersSelector 14
-#define kUpperCasePetiteCapsSelector 2
-#define kUpperCaseSmallCapsSelector 1
-#define kUpperCaseType 38
-
-/* Table data courtesy of Apple. */
-static const struct feature_mapping_t {
- FourCharCode otFeatureTag;
- uint16_t aatFeatureType;
- uint16_t selectorToEnable;
- uint16_t selectorToDisable;
-} feature_mappings[] = {
- { 'c2pc', kUpperCaseType, kUpperCasePetiteCapsSelector, kDefaultUpperCaseSelector },
- { 'c2sc', kUpperCaseType, kUpperCaseSmallCapsSelector, kDefaultUpperCaseSelector },
- { 'calt', kContextualAlternatesType, kContextualAlternatesOnSelector, kContextualAlternatesOffSelector },
- { 'case', kCaseSensitiveLayoutType, kCaseSensitiveLayoutOnSelector, kCaseSensitiveLayoutOffSelector },
- { 'clig', kLigaturesType, kContextualLigaturesOnSelector, kContextualLigaturesOffSelector },
- { 'cpsp', kCaseSensitiveLayoutType, kCaseSensitiveSpacingOnSelector, kCaseSensitiveSpacingOffSelector },
- { 'cswh', kContextualAlternatesType, kContextualSwashAlternatesOnSelector, kContextualSwashAlternatesOffSelector },
- { 'dlig', kLigaturesType, kRareLigaturesOnSelector, kRareLigaturesOffSelector },
- { 'expt', kCharacterShapeType, kExpertCharactersSelector, 16 },
- { 'frac', kFractionsType, kDiagonalFractionsSelector, kNoFractionsSelector },
- { 'fwid', kTextSpacingType, kMonospacedTextSelector, 7 },
- { 'halt', kTextSpacingType, kAltHalfWidthTextSelector, 7 },
- { 'hist', kLigaturesType, kHistoricalLigaturesOnSelector, kHistoricalLigaturesOffSelector },
- { 'hkna', kAlternateKanaType, kAlternateHorizKanaOnSelector, kAlternateHorizKanaOffSelector, },
- { 'hlig', kLigaturesType, kHistoricalLigaturesOnSelector, kHistoricalLigaturesOffSelector },
- { 'hngl', kTransliterationType, kHanjaToHangulSelector, kNoTransliterationSelector },
- { 'hojo', kCharacterShapeType, kHojoCharactersSelector, 16 },
- { 'hwid', kTextSpacingType, kHalfWidthTextSelector, 7 },
- { 'ital', kItalicCJKRomanType, kCJKItalicRomanOnSelector, kCJKItalicRomanOffSelector },
- { 'jp04', kCharacterShapeType, kJIS2004CharactersSelector, 16 },
- { 'jp78', kCharacterShapeType, kJIS1978CharactersSelector, 16 },
- { 'jp83', kCharacterShapeType, kJIS1983CharactersSelector, 16 },
- { 'jp90', kCharacterShapeType, kJIS1990CharactersSelector, 16 },
- { 'liga', kLigaturesType, kCommonLigaturesOnSelector, kCommonLigaturesOffSelector },
- { 'lnum', kNumberCaseType, kUpperCaseNumbersSelector, 2 },
- { 'mgrk', kMathematicalExtrasType, kMathematicalGreekOnSelector, kMathematicalGreekOffSelector },
- { 'nlck', kCharacterShapeType, kNLCCharactersSelector, 16 },
- { 'onum', kNumberCaseType, kLowerCaseNumbersSelector, 2 },
- { 'ordn', kVerticalPositionType, kOrdinalsSelector, kNormalPositionSelector },
- { 'palt', kTextSpacingType, kAltProportionalTextSelector, 7 },
- { 'pcap', kLowerCaseType, kLowerCasePetiteCapsSelector, kDefaultLowerCaseSelector },
- { 'pkna', kTextSpacingType, kProportionalTextSelector, 7 },
- { 'pnum', kNumberSpacingType, kProportionalNumbersSelector, 4 },
- { 'pwid', kTextSpacingType, kProportionalTextSelector, 7 },
- { 'qwid', kTextSpacingType, kQuarterWidthTextSelector, 7 },
- { 'ruby', kRubyKanaType, kRubyKanaOnSelector, kRubyKanaOffSelector },
- { 'sinf', kVerticalPositionType, kScientificInferiorsSelector, kNormalPositionSelector },
- { 'smcp', kLowerCaseType, kLowerCaseSmallCapsSelector, kDefaultLowerCaseSelector },
- { 'smpl', kCharacterShapeType, kSimplifiedCharactersSelector, 16 },
- { 'ss01', kStylisticAlternativesType, kStylisticAltOneOnSelector, kStylisticAltOneOffSelector },
- { 'ss02', kStylisticAlternativesType, kStylisticAltTwoOnSelector, kStylisticAltTwoOffSelector },
- { 'ss03', kStylisticAlternativesType, kStylisticAltThreeOnSelector, kStylisticAltThreeOffSelector },
- { 'ss04', kStylisticAlternativesType, kStylisticAltFourOnSelector, kStylisticAltFourOffSelector },
- { 'ss05', kStylisticAlternativesType, kStylisticAltFiveOnSelector, kStylisticAltFiveOffSelector },
- { 'ss06', kStylisticAlternativesType, kStylisticAltSixOnSelector, kStylisticAltSixOffSelector },
- { 'ss07', kStylisticAlternativesType, kStylisticAltSevenOnSelector, kStylisticAltSevenOffSelector },
- { 'ss08', kStylisticAlternativesType, kStylisticAltEightOnSelector, kStylisticAltEightOffSelector },
- { 'ss09', kStylisticAlternativesType, kStylisticAltNineOnSelector, kStylisticAltNineOffSelector },
- { 'ss10', kStylisticAlternativesType, kStylisticAltTenOnSelector, kStylisticAltTenOffSelector },
- { 'ss11', kStylisticAlternativesType, kStylisticAltElevenOnSelector, kStylisticAltElevenOffSelector },
- { 'ss12', kStylisticAlternativesType, kStylisticAltTwelveOnSelector, kStylisticAltTwelveOffSelector },
- { 'ss13', kStylisticAlternativesType, kStylisticAltThirteenOnSelector, kStylisticAltThirteenOffSelector },
- { 'ss14', kStylisticAlternativesType, kStylisticAltFourteenOnSelector, kStylisticAltFourteenOffSelector },
- { 'ss15', kStylisticAlternativesType, kStylisticAltFifteenOnSelector, kStylisticAltFifteenOffSelector },
- { 'ss16', kStylisticAlternativesType, kStylisticAltSixteenOnSelector, kStylisticAltSixteenOffSelector },
- { 'ss17', kStylisticAlternativesType, kStylisticAltSeventeenOnSelector, kStylisticAltSeventeenOffSelector },
- { 'ss18', kStylisticAlternativesType, kStylisticAltEighteenOnSelector, kStylisticAltEighteenOffSelector },
- { 'ss19', kStylisticAlternativesType, kStylisticAltNineteenOnSelector, kStylisticAltNineteenOffSelector },
- { 'ss20', kStylisticAlternativesType, kStylisticAltTwentyOnSelector, kStylisticAltTwentyOffSelector },
- { 'subs', kVerticalPositionType, kInferiorsSelector, kNormalPositionSelector },
- { 'sups', kVerticalPositionType, kSuperiorsSelector, kNormalPositionSelector },
- { 'swsh', kContextualAlternatesType, kSwashAlternatesOnSelector, kSwashAlternatesOffSelector },
- { 'titl', kStyleOptionsType, kTitlingCapsSelector, kNoStyleOptionsSelector },
- { 'tnam', kCharacterShapeType, kTraditionalNamesCharactersSelector, 16 },
- { 'tnum', kNumberSpacingType, kMonospacedNumbersSelector, 4 },
- { 'trad', kCharacterShapeType, kTraditionalCharactersSelector, 16 },
- { 'twid', kTextSpacingType, kThirdWidthTextSelector, 7 },
- { 'unic', kLetterCaseType, 14, 15 },
- { 'valt', kTextSpacingType, kAltProportionalTextSelector, 7 },
- { 'vert', kVerticalSubstitutionType, kSubstituteVerticalFormsOnSelector, kSubstituteVerticalFormsOffSelector },
- { 'vhal', kTextSpacingType, kAltHalfWidthTextSelector, 7 },
- { 'vkna', kAlternateKanaType, kAlternateVertKanaOnSelector, kAlternateVertKanaOffSelector },
- { 'vpal', kTextSpacingType, kAltProportionalTextSelector, 7 },
- { 'vrt2', kVerticalSubstitutionType, kSubstituteVerticalFormsOnSelector, kSubstituteVerticalFormsOffSelector },
- { 'zero', kTypographicExtrasType, kSlashedZeroOnSelector, kSlashedZeroOffSelector },
-};
-
-static int
-_hb_feature_mapping_cmp (const void *key_, const void *entry_)
-{
- unsigned int key = * (unsigned int *) key_;
- const feature_mapping_t * entry = (const feature_mapping_t *) entry_;
- return key < entry->otFeatureTag ? -1 :
- key > entry->otFeatureTag ? 1 :
- 0;
-}
-
hb_bool_t
_hb_coretext_shape (hb_shape_plan_t *shape_plan,
hb_font_t *font,
- hb_buffer_t *buffer,
- const hb_feature_t *features,
- unsigned int num_features)
+ hb_buffer_t *buffer,
+ const hb_feature_t *features,
+ unsigned int num_features)
{
hb_face_t *face = font->face;
- CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face);
- CTFontRef ct_font = (CTFontRef) HB_SHAPER_DATA_GET (font);
+ CGFontRef cg_font = (CGFontRef) (const void *) face->data.coretext;
+ CTFontRef ct_font = (CTFontRef) hb_coretext_font_data_sync (font);
CGFloat ct_font_size = CTFontGetSize (ct_font);
CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size;
CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
/* Attach marks to their bases, to match the 'ot' shaper.
- * Adapted from hb-ot-shape:hb_form_clusters().
+ * Adapted from a very old version of hb-ot-shape:hb_form_clusters().
* Note that this only makes us be closer to the 'ot' shaper,
* but by no means the same. For example, if there's
* B1 M1 B2 M2, and B1-B2 form a ligature, M2's cluster will
@@ -618,8 +462,8 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
buffer->merge_clusters (i - 1, i + 1);
}
- hb_auto_array_t<feature_record_t> feature_records;
- hb_auto_array_t<range_record_t> range_records;
+ hb_vector_t<feature_record_t> feature_records;
+ hb_vector_t<range_record_t> range_records;
/*
* Set up features.
@@ -628,16 +472,12 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
if (num_features)
{
/* Sort features by start/end events. */
- hb_auto_array_t<feature_event_t> feature_events;
+ hb_vector_t<feature_event_t> feature_events;
for (unsigned int i = 0; i < num_features; i++)
{
- const feature_mapping_t * mapping = (const feature_mapping_t *) bsearch (&features[i].tag,
- feature_mappings,
- ARRAY_LENGTH (feature_mappings),
- sizeof (feature_mappings[0]),
- _hb_feature_mapping_cmp);
+ const hb_aat_feature_mapping_t * mapping = hb_aat_layout_find_feature_mapping (features[i].tag);
if (!mapping)
- continue;
+ continue;
active_feature_t feature;
feature.rec.feature = mapping->aatFeatureType;
@@ -647,15 +487,11 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
feature_event_t *event;
event = feature_events.push ();
- if (unlikely (!event))
- goto fail_features;
event->index = features[i].start;
event->start = true;
event->feature = feature;
event = feature_events.push ();
- if (unlikely (!event))
- goto fail_features;
event->index = features[i].end;
event->start = false;
event->feature = feature;
@@ -669,34 +505,30 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
feature.order = num_features + 1;
feature_event_t *event = feature_events.push ();
- if (unlikely (!event))
- goto fail_features;
event->index = 0; /* This value does magic. */
event->start = false;
event->feature = feature;
}
/* Scan events and save features for each range. */
- hb_auto_array_t<active_feature_t> active_features;
+ hb_vector_t<active_feature_t> active_features;
unsigned int last_index = 0;
- for (unsigned int i = 0; i < feature_events.len; i++)
+ for (unsigned int i = 0; i < feature_events.length; i++)
{
feature_event_t *event = &feature_events[i];
if (event->index != last_index)
{
- /* Save a snapshot of active features and the range. */
+ /* Save a snapshot of active features and the range. */
range_record_t *range = range_records.push ();
- if (unlikely (!range))
- goto fail_features;
- if (active_features.len)
+ if (active_features.length)
{
CFMutableArrayRef features_array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
/* TODO sort and resolve conflicting features? */
/* active_features.qsort (); */
- for (unsigned int j = 0; j < active_features.len; j++)
+ for (unsigned int j = 0; j < active_features.length; j++)
{
CFStringRef keys[] = {
kCTFontFeatureTypeIdentifierKey,
@@ -746,30 +578,23 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
last_index = event->index;
}
- if (event->start) {
- active_feature_t *feature = active_features.push ();
- if (unlikely (!feature))
- goto fail_features;
- *feature = event->feature;
+ if (event->start)
+ {
+ active_features.push (event->feature);
} else {
- active_feature_t *feature = active_features.find (&event->feature);
+ active_feature_t *feature = active_features.find (&event->feature);
if (feature)
- active_features.remove (feature - active_features.array);
+ active_features.remove (feature - active_features.arrayZ);
}
}
}
- else
- {
- fail_features:
- num_features = 0;
- }
unsigned int scratch_size;
hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size);
#define ALLOCATE_ARRAY(Type, name, len, on_no_room) \
Type *name = (Type *) scratch; \
- { \
+ do { \
unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \
if (unlikely (_consumed > scratch_size)) \
{ \
@@ -778,7 +603,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
} \
scratch += _consumed; \
scratch_size -= _consumed; \
- }
+ } while (0)
ALLOCATE_ARRAY (UniChar, pchars, buffer->len * 2, /*nothing*/);
unsigned int chars_len = 0;
@@ -810,13 +635,13 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
DEBUG_MSG (CORETEXT, nullptr, __VA_ARGS__); \
ret = false; \
goto fail; \
- } HB_STMT_END;
+ } HB_STMT_END
bool ret = true;
CFStringRef string_ref = nullptr;
CTLineRef line = nullptr;
- if (0)
+ if (false)
{
resize_and_retry:
DEBUG_MSG (CORETEXT, buffer, "Buffer resize");
@@ -872,15 +697,18 @@ resize_and_retry:
/* What's the iOS equivalent of this check?
* The symbols was introduced in iOS 7.0.
* At any rate, our fallback is safe and works fine. */
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1090
+#if !(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) && MAC_OS_X_VERSION_MIN_REQUIRED < 1090
# define kCTLanguageAttributeName CFSTR ("NSLanguage")
#endif
- CFStringRef lang = CFStringCreateWithCStringNoCopy (kCFAllocatorDefault,
+ CFStringRef lang = CFStringCreateWithCStringNoCopy (kCFAllocatorDefault,
hb_language_to_string (buffer->props.language),
kCFStringEncodingUTF8,
kCFAllocatorNull);
if (unlikely (!lang))
+ {
+ CFRelease (attr_string);
FAIL ("CFStringCreateWithCStringNoCopy failed");
+ }
CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
kCTLanguageAttributeName, lang);
CFRelease (lang);
@@ -888,7 +716,7 @@ resize_and_retry:
CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
kCTFontAttributeName, ct_font);
- if (num_features && range_records.len)
+ if (num_features && range_records.length)
{
unsigned int start = 0;
range_record_t *last_range = &range_records[0];
@@ -929,7 +757,7 @@ resize_and_retry:
feature.start < chars_len && feature.start < feature.end)
{
CFRange feature_range = CFRangeMake (feature.start,
- MIN (feature.end, chars_len) - feature.start);
+ hb_min (feature.end, chars_len) - feature.start);
if (feature.value)
CFAttributedStringRemoveAttribute (attr_string, feature_range, kCTKernAttributeName);
else
@@ -941,6 +769,9 @@ resize_and_retry:
int level = HB_DIRECTION_IS_FORWARD (buffer->props.direction) ? 0 : 1;
CFNumberRef level_number = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &level);
+#if !(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) && MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+ extern const CFStringRef kCTTypesetterOptionForcedEmbeddingLevel;
+#endif
CFDictionaryRef options = CFDictionaryCreate (kCFAllocatorDefault,
(const void **) &kCTTypesetterOptionForcedEmbeddingLevel,
(const void **) &level_number,
@@ -949,7 +780,10 @@ resize_and_retry:
&kCFTypeDictionaryValueCallBacks);
CFRelease (level_number);
if (unlikely (!options))
- FAIL ("CFDictionaryCreate failed");
+ {
+ CFRelease (attr_string);
+ FAIL ("CFDictionaryCreate failed");
+ }
CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedStringAndOptions (attr_string, options);
CFRelease (options);
@@ -973,7 +807,7 @@ resize_and_retry:
/* For right-to-left runs, CoreText returns the glyphs positioned such that
* any trailing whitespace is to the left of (0,0). Adjust coordinate system
* to fix for that. Test with any RTL string with trailing spaces.
- * https://code.google.com/p/chromium/issues/detail?id=469028
+ * https://crbug.com/469028
*/
if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction))
{
@@ -1026,12 +860,12 @@ resize_and_retry:
* However, even that wouldn't work if we were passed in the CGFont to
* construct a hb_face to begin with.
*
- * See: http://github.com/harfbuzz/harfbuzz/pull/36
+ * See: https://github.com/harfbuzz/harfbuzz/pull/36
*
* Also see: https://bugs.chromium.org/p/chromium/issues/detail?id=597098
*/
bool matched = false;
- for (unsigned int i = 0; i < range_records.len; i++)
+ for (unsigned int i = 0; i < range_records.length; i++)
if (range_records[i].font && CFEqual (run_ct_font, range_records[i].font))
{
matched = true;
@@ -1039,7 +873,7 @@ resize_and_retry:
}
if (!matched)
{
- CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, 0);
+ CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, nullptr);
if (run_cg_font)
{
matched = CFEqual (run_cg_font, cg_font);
@@ -1059,7 +893,7 @@ resize_and_retry:
if (!matched)
{
CFRange range = CTRunGetStringRange (run);
- DEBUG_MSG (CORETEXT, run, "Run used fallback font: %ld..%ld",
+ DEBUG_MSG (CORETEXT, run, "Run used fallback font: %ld..%ld",
range.location, range.location + range.length);
if (!buffer->ensure_inplace (buffer->len + range.length))
goto resize_and_retry;
@@ -1087,7 +921,7 @@ resize_and_retry:
continue;
}
if (buffer->unicode->is_default_ignorable (ch))
- continue;
+ continue;
info->codepoint = notdef;
info->cluster = log_clusters[j];
@@ -1129,10 +963,10 @@ resize_and_retry:
#define SCRATCH_RESTORE() \
scratch_size = scratch_size_saved; \
- scratch = scratch_saved;
+ scratch = scratch_saved
{ /* Setup glyphs */
- SCRATCH_SAVE();
+ SCRATCH_SAVE();
const CGGlyph* glyphs = USE_PTR ? CTRunGetGlyphsPtr (run) : nullptr;
if (!glyphs) {
ALLOCATE_ARRAY (CGGlyph, glyph_buf, num_glyphs, goto resize_and_retry);
@@ -1155,12 +989,12 @@ resize_and_retry:
SCRATCH_RESTORE();
}
{
- /* Setup positions.
+ /* Setup positions.
* Note that CoreText does not return advances for glyphs. As such,
* for all but last glyph, we use the delta position to next glyph as
* advance (in the advance direction only), and for last glyph we set
* whatever is needed to make the whole run's advance add up. */
- SCRATCH_SAVE();
+ SCRATCH_SAVE();
const CGPoint* positions = USE_PTR ? CTRunGetPositionsPtr (run) : nullptr;
if (!positions) {
ALLOCATE_ARRAY (CGPoint, position_buf, num_glyphs, goto resize_and_retry);
@@ -1212,16 +1046,16 @@ resize_and_retry:
}
/* Mac OS 10.6 doesn't have kCTTypesetterOptionForcedEmbeddingLevel,
- * or if it does, it doesn't resepct it. So we get runs with wrong
+ * or if it does, it doesn't respect it. So we get runs with wrong
* directions. As such, disable the assert... It wouldn't crash, but
* cursoring will be off...
*
- * http://crbug.com/419769
+ * https://crbug.com/419769
*/
- if (0)
+ if (false)
{
/* Make sure all runs had the expected direction. */
- bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
+ HB_UNUSED bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
assert (bool (status_and & kCTRunStatusRightToLeft) == backward);
assert (bool (status_or & kCTRunStatusRightToLeft) == backward);
}
@@ -1238,8 +1072,6 @@ resize_and_retry:
pos->x_offset = info->var1.i32;
pos->y_offset = info->var2.i32;
- info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
-
info++, pos++;
}
else
@@ -1249,8 +1081,6 @@ resize_and_retry:
pos->x_offset = info->var1.i32;
pos->y_offset = info->var2.i32;
- info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
-
info++, pos++;
}
@@ -1272,7 +1102,7 @@ resize_and_retry:
unsigned int cluster = info[count - 1].cluster;
for (unsigned int i = count - 1; i > 0; i--)
{
- cluster = MIN (cluster, info[i - 1].cluster);
+ cluster = hb_min (cluster, info[i - 1].cluster);
info[i - 1].cluster = cluster;
}
}
@@ -1281,7 +1111,7 @@ resize_and_retry:
unsigned int cluster = info[0].cluster;
for (unsigned int i = 1; i < count; i++)
{
- cluster = MIN (cluster, info[i].cluster);
+ cluster = hb_min (cluster, info[i].cluster);
info[i].cluster = cluster;
}
}
@@ -1298,7 +1128,7 @@ fail:
if (line)
CFRelease (line);
- for (unsigned int i = 0; i < range_records.len; i++)
+ for (unsigned int i = 0; i < range_records.length; i++)
if (range_records[i].font)
CFRelease (range_records[i].font);
@@ -1306,94 +1136,4 @@ fail:
}
-/*
- * AAT shaper
- */
-
-HB_SHAPER_DATA_ENSURE_DEFINE(coretext_aat, face)
-HB_SHAPER_DATA_ENSURE_DEFINE(coretext_aat, font)
-
-/*
- * shaper face data
- */
-
-struct hb_coretext_aat_shaper_face_data_t {};
-
-hb_coretext_aat_shaper_face_data_t *
-_hb_coretext_aat_shaper_face_data_create (hb_face_t *face)
-{
- static const hb_tag_t tags[] = {HB_CORETEXT_TAG_MORX, HB_CORETEXT_TAG_MORT, HB_CORETEXT_TAG_KERX};
-
- for (unsigned int i = 0; i < ARRAY_LENGTH (tags); i++)
- {
- hb_blob_t *blob = face->reference_table (tags[i]);
- if (hb_blob_get_length (blob))
- {
- hb_blob_destroy (blob);
- return hb_coretext_shaper_face_data_ensure (face) ? (hb_coretext_aat_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr;
- }
- hb_blob_destroy (blob);
- }
-
- return nullptr;
-}
-
-void
-_hb_coretext_aat_shaper_face_data_destroy (hb_coretext_aat_shaper_face_data_t *data HB_UNUSED)
-{
-}
-
-
-/*
- * shaper font data
- */
-
-struct hb_coretext_aat_shaper_font_data_t {};
-
-hb_coretext_aat_shaper_font_data_t *
-_hb_coretext_aat_shaper_font_data_create (hb_font_t *font)
-{
- return hb_coretext_shaper_font_data_ensure (font) ? (hb_coretext_aat_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr;
-}
-
-void
-_hb_coretext_aat_shaper_font_data_destroy (hb_coretext_aat_shaper_font_data_t *data HB_UNUSED)
-{
-}
-
-
-/*
- * shaper shape_plan data
- */
-
-struct hb_coretext_aat_shaper_shape_plan_data_t {};
-
-hb_coretext_aat_shaper_shape_plan_data_t *
-_hb_coretext_aat_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED,
- const hb_feature_t *user_features HB_UNUSED,
- unsigned int num_user_features HB_UNUSED,
- const int *coords HB_UNUSED,
- unsigned int num_coords HB_UNUSED)
-{
- return (hb_coretext_aat_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
-}
-
-void
-_hb_coretext_aat_shaper_shape_plan_data_destroy (hb_coretext_aat_shaper_shape_plan_data_t *data HB_UNUSED)
-{
-}
-
-
-/*
- * shaper
- */
-
-hb_bool_t
-_hb_coretext_aat_shape (hb_shape_plan_t *shape_plan,
- hb_font_t *font,
- hb_buffer_t *buffer,
- const hb_feature_t *features,
- unsigned int num_features)
-{
- return _hb_coretext_shape (shape_plan, font, buffer, features, num_features);
-}
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-debug.hh b/src/3rdparty/harfbuzz-ng/src/hb-debug.hh
index 6c425f7b9d..a7e52c8cbe 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-debug.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-debug.hh
@@ -27,13 +27,63 @@
#ifndef HB_DEBUG_HH
#define HB_DEBUG_HH
-#include "hb-private.hh"
+#include "hb.hh"
+#include "hb-atomic.hh"
+#include "hb-algs.hh"
#ifndef HB_DEBUG
#define HB_DEBUG 0
#endif
+
+/*
+ * Global runtime options.
+ */
+
+struct hb_options_t
+{
+ bool unused : 1; /* In-case sign bit is here. */
+ bool initialized : 1;
+ bool uniscribe_bug_compatible : 1;
+ bool aat : 1;
+};
+
+union hb_options_union_t {
+ int i;
+ hb_options_t opts;
+};
+static_assert ((sizeof (hb_atomic_int_t) >= sizeof (hb_options_union_t)), "");
+
+HB_INTERNAL void
+_hb_options_init ();
+
+extern HB_INTERNAL hb_atomic_int_t _hb_options;
+
+static inline hb_options_t
+hb_options ()
+{
+#ifdef HB_NO_GETENV
+ return hb_options_t ();
+#endif
+ /* Make a local copy, so we can access bitfield threadsafely. */
+ hb_options_union_t u;
+ u.i = _hb_options.get_relaxed ();
+
+ if (unlikely (!u.i))
+ {
+ _hb_options_init ();
+ u.i = _hb_options.get_relaxed ();
+ }
+
+ return u.opts;
+}
+
+
+/*
+ * Debug output (needs enabling at compile time.)
+ */
+
static inline bool
_hb_debug (unsigned int level,
unsigned int max_level)
@@ -111,7 +161,7 @@ _hb_debug_msg_va (const char *what,
VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR;
fprintf (stderr, "%2u %s" VRBAR "%s",
level,
- bars + sizeof (bars) - 1 - MIN ((unsigned int) sizeof (bars) - 1, (unsigned int) (sizeof (VBAR) - 1) * level),
+ bars + sizeof (bars) - 1 - hb_min ((unsigned int) sizeof (bars) - 1, (unsigned int) (sizeof (VBAR) - 1) * level),
level_dir ? (level_dir > 0 ? DLBAR : ULBAR) : LBAR);
} else
fprintf (stderr, " " VRBAR LBAR);
@@ -126,7 +176,7 @@ _hb_debug_msg_va (const char *what,
fprintf (stderr, "\n");
}
-template <> inline void
+template <> inline void HB_PRINTF_FUNC(7, 0)
_hb_debug_msg_va<0> (const char *what HB_UNUSED,
const void *obj HB_UNUSED,
const char *func HB_UNUSED,
@@ -145,7 +195,7 @@ _hb_debug_msg (const char *what,
int level_dir,
const char *message,
...) HB_PRINTF_FUNC(7, 8);
-template <int max_level> static inline void
+template <int max_level> static inline void HB_PRINTF_FUNC(7, 8)
_hb_debug_msg (const char *what,
const void *obj,
const char *func,
@@ -169,7 +219,7 @@ _hb_debug_msg<0> (const char *what HB_UNUSED,
int level_dir HB_UNUSED,
const char *message HB_UNUSED,
...) HB_PRINTF_FUNC(7, 8);
-template <> inline void
+template <> inline void HB_PRINTF_FUNC(7, 8)
_hb_debug_msg<0> (const char *what HB_UNUSED,
const void *obj HB_UNUSED,
const char *func HB_UNUSED,
@@ -199,8 +249,8 @@ struct hb_printer_t<bool> {
};
template <>
-struct hb_printer_t<hb_void_t> {
- const char *print (hb_void_t) { return ""; }
+struct hb_printer_t<hb_empty_t> {
+ const char *print (hb_empty_t) { return ""; }
};
@@ -216,7 +266,7 @@ static inline void _hb_warn_no_return (bool returned)
}
}
template <>
-/*static*/ inline void _hb_warn_no_return<hb_void_t> (bool returned HB_UNUSED)
+/*static*/ inline void _hb_warn_no_return<hb_empty_t> (bool returned HB_UNUSED)
{}
template <int max_level, typename ret_t>
@@ -237,7 +287,7 @@ struct hb_auto_trace_t
_hb_debug_msg_va<max_level> (what, obj, func, true, plevel ? *plevel : 0, +1, message, ap);
va_end (ap);
}
- inline ~hb_auto_trace_t (void)
+ ~hb_auto_trace_t ()
{
_hb_warn_no_return<ret_t> (returned);
if (!returned) {
@@ -246,20 +296,23 @@ struct hb_auto_trace_t
if (plevel) --*plevel;
}
- inline ret_t ret (ret_t v, unsigned int line = 0)
+ template <typename T>
+ T ret (T&& v,
+ const char *func = "",
+ unsigned int line = 0)
{
if (unlikely (returned)) {
fprintf (stderr, "OUCH, double calls to return_trace(). This is a bug, please report.\n");
- return v;
+ return hb_forward<T> (v);
}
- _hb_debug_msg<max_level> (what, obj, nullptr, true, plevel ? *plevel : 1, -1,
+ _hb_debug_msg<max_level> (what, obj, func, true, plevel ? *plevel : 1, -1,
"return %s (line %d)",
- hb_printer_t<ret_t>().print (v), line);
+ hb_printer_t<decltype (v)>().print (v), line);
if (plevel) --*plevel;
plevel = nullptr;
returned = true;
- return v;
+ return hb_forward<T> (v);
}
private:
@@ -278,17 +331,23 @@ struct hb_auto_trace_t<0, ret_t>
const char *message,
...) HB_PRINTF_FUNC(6, 7) {}
- inline ret_t ret (ret_t v, unsigned int line HB_UNUSED = 0) { return v; }
+ template <typename T>
+ T ret (T&& v,
+ const char *func HB_UNUSED = nullptr,
+ unsigned int line HB_UNUSED = 0) { return hb_forward<T> (v); }
};
/* For disabled tracing; optimize out everything.
* https://github.com/harfbuzz/harfbuzz/pull/605 */
template <typename ret_t>
struct hb_no_trace_t {
- inline ret_t ret (ret_t v, unsigned int line HB_UNUSED = 0) { return v; }
+ template <typename T>
+ T ret (T&& v,
+ const char *func HB_UNUSED = nullptr,
+ unsigned int line HB_UNUSED = 0) { return hb_forward<T> (v); }
};
-#define return_trace(RET) return trace.ret (RET, __LINE__)
+#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
/*
@@ -348,30 +407,6 @@ struct hb_no_trace_t {
#define TRACE_APPLY(this) hb_no_trace_t<bool> trace
#endif
-#ifndef HB_DEBUG_CLOSURE
-#define HB_DEBUG_CLOSURE (HB_DEBUG+0)
-#endif
-#if HB_DEBUG_CLOSURE
-#define TRACE_CLOSURE(this) \
- hb_auto_trace_t<HB_DEBUG_CLOSURE, hb_void_t> trace \
- (&c->debug_depth, c->get_name (), this, HB_FUNC, \
- " ")
-#else
-#define TRACE_CLOSURE(this) hb_no_trace_t<hb_void_t> trace HB_UNUSED
-#endif
-
-#ifndef HB_DEBUG_COLLECT_GLYPHS
-#define HB_DEBUG_COLLECT_GLYPHS (HB_DEBUG+0)
-#endif
-#if HB_DEBUG_COLLECT_GLYPHS
-#define TRACE_COLLECT_GLYPHS(this) \
- hb_auto_trace_t<HB_DEBUG_COLLECT_GLYPHS, hb_void_t> trace \
- (&c->debug_depth, c->get_name (), this, HB_FUNC, \
- " ")
-#else
-#define TRACE_COLLECT_GLYPHS(this) hb_no_trace_t<hb_void_t> trace HB_UNUSED
-#endif
-
#ifndef HB_DEBUG_SANITIZE
#define HB_DEBUG_SANITIZE (HB_DEBUG+0)
#endif
@@ -379,7 +414,7 @@ struct hb_no_trace_t {
#define TRACE_SANITIZE(this) \
hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace \
(&c->debug_depth, c->get_name (), this, HB_FUNC, \
- " ");
+ " ")
#else
#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
#endif
@@ -391,38 +426,36 @@ struct hb_no_trace_t {
#define TRACE_SERIALIZE(this) \
hb_auto_trace_t<HB_DEBUG_SERIALIZE, bool> trace \
(&c->debug_depth, "SERIALIZE", c, HB_FUNC, \
- " ");
+ " ")
#else
#define TRACE_SERIALIZE(this) hb_no_trace_t<bool> trace
#endif
-#ifndef HB_DEBUG_WOULD_APPLY
-#define HB_DEBUG_WOULD_APPLY (HB_DEBUG+0)
+#ifndef HB_DEBUG_SUBSET
+#define HB_DEBUG_SUBSET (HB_DEBUG+0)
#endif
-#if HB_DEBUG_WOULD_APPLY
-#define TRACE_WOULD_APPLY(this) \
- hb_auto_trace_t<HB_DEBUG_WOULD_APPLY, bool> trace \
- (&c->debug_depth, c->get_name (), this, HB_FUNC, \
- "%d glyphs", c->len);
+#if HB_DEBUG_SUBSET
+#define TRACE_SUBSET(this) \
+ hb_auto_trace_t<HB_DEBUG_SUBSET, bool> trace \
+ (&c->debug_depth, c->get_name (), this, HB_FUNC, \
+ " ")
#else
-#define TRACE_WOULD_APPLY(this) hb_no_trace_t<bool> trace
+#define TRACE_SUBSET(this) hb_no_trace_t<bool> trace
#endif
#ifndef HB_DEBUG_DISPATCH
#define HB_DEBUG_DISPATCH ( \
HB_DEBUG_APPLY + \
- HB_DEBUG_CLOSURE + \
- HB_DEBUG_COLLECT_GLYPHS + \
HB_DEBUG_SANITIZE + \
HB_DEBUG_SERIALIZE + \
- HB_DEBUG_WOULD_APPLY + \
+ HB_DEBUG_SUBSET + \
0)
#endif
#if HB_DEBUG_DISPATCH
#define TRACE_DISPATCH(this, format) \
hb_auto_trace_t<context_t::max_debug_depth, typename context_t::return_t> trace \
(&c->debug_depth, c->get_name (), this, HB_FUNC, \
- "format %d", (int) format);
+ "format %d", (int) format)
#else
#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h b/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h
index eac7efb42f..43f89a4c4e 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h
@@ -36,10 +36,23 @@
#include "hb-font.h"
#include "hb-set.h"
+
+/**
+ * SECTION:hb-deprecated
+ * @title: hb-deprecated
+ * @short_description: Deprecated API
+ * @include: hb.h
+ *
+ * These API have been deprecated in favor of newer API, or because they
+ * were deemed unnecessary.
+ **/
+
+
HB_BEGIN_DECLS
#ifndef HB_DISABLE_DEPRECATED
+
#define HB_SCRIPT_CANADIAN_ABORIGINAL HB_SCRIPT_CANADIAN_SYLLABICS
#define HB_BUFFER_FLAGS_DEFAULT HB_BUFFER_FLAG_DEFAULT
@@ -50,14 +63,131 @@ typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
hb_codepoint_t *glyph,
void *user_data);
-HB_EXTERN void
+HB_EXTERN HB_DEPRECATED_FOR(hb_font_funcs_set_nominal_glyph_func and hb_font_funcs_set_variation_glyph_func) void
hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_func_t func,
void *user_data, hb_destroy_func_t destroy);
-HB_EXTERN void
+HB_EXTERN HB_DEPRECATED void
hb_set_invert (hb_set_t *set);
+/**
+ * hb_unicode_eastasian_width_func_t:
+ *
+ * Deprecated: 2.0.0
+ */
+typedef unsigned int (*hb_unicode_eastasian_width_func_t) (hb_unicode_funcs_t *ufuncs,
+ hb_codepoint_t unicode,
+ void *user_data);
+
+/**
+ * hb_unicode_funcs_set_eastasian_width_func:
+ * @ufuncs: a Unicode function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+HB_EXTERN HB_DEPRECATED void
+hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
+ hb_unicode_eastasian_width_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_unicode_eastasian_width:
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+HB_EXTERN HB_DEPRECATED unsigned int
+hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs,
+ hb_codepoint_t unicode);
+
+
+/**
+ * hb_unicode_decompose_compatibility_func_t:
+ * @ufuncs: a Unicode function structure
+ * @u: codepoint to decompose
+ * @decomposed: address of codepoint array (of length %HB_UNICODE_MAX_DECOMPOSITION_LEN) to write decomposition into
+ * @user_data: user data pointer as passed to hb_unicode_funcs_set_decompose_compatibility_func()
+ *
+ * Fully decompose @u to its Unicode compatibility decomposition. The codepoints of the decomposition will be written to @decomposed.
+ * The complete length of the decomposition will be returned.
+ *
+ * If @u has no compatibility decomposition, zero should be returned.
+ *
+ * The Unicode standard guarantees that a buffer of length %HB_UNICODE_MAX_DECOMPOSITION_LEN codepoints will always be sufficient for any
+ * compatibility decomposition plus an terminating value of 0. Consequently, @decompose must be allocated by the caller to be at least this length. Implementations
+ * of this function type must ensure that they do not write past the provided array.
+ *
+ * Return value: number of codepoints in the full compatibility decomposition of @u, or 0 if no decomposition available.
+ *
+ * Deprecated: 2.0.0
+ */
+typedef unsigned int (*hb_unicode_decompose_compatibility_func_t) (hb_unicode_funcs_t *ufuncs,
+ hb_codepoint_t u,
+ hb_codepoint_t *decomposed,
+ void *user_data);
+
+/**
+ * HB_UNICODE_MAX_DECOMPOSITION_LEN:
+ *
+ * See Unicode 6.1 for details on the maximum decomposition length.
+ *
+ * Deprecated: 2.0.0
+ */
+#define HB_UNICODE_MAX_DECOMPOSITION_LEN (18+1) /* codepoints */
+
+/**
+ * hb_unicode_funcs_set_decompose_compatibility_func:
+ * @ufuncs: a Unicode function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+HB_EXTERN HB_DEPRECATED void
+hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs,
+ hb_unicode_decompose_compatibility_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+HB_EXTERN HB_DEPRECATED unsigned int
+hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
+ hb_codepoint_t u,
+ hb_codepoint_t *decomposed);
+
+
+typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t;
+
+/**
+ * hb_font_funcs_set_glyph_v_kerning_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 0.9.2
+ * Deprecated: 2.0.0
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_glyph_v_kerning_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+HB_EXTERN hb_position_t
+hb_font_get_glyph_v_kerning (hb_font_t *font,
+ hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph);
+
#endif
HB_END_DECLS
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-directwrite.cc b/src/3rdparty/harfbuzz-ng/src/hb-directwrite.cc
new file mode 100644
index 0000000000..efb2029ec0
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-directwrite.cc
@@ -0,0 +1,979 @@
+/*
+ * Copyright © 2015-2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb.hh"
+
+#ifdef HAVE_DIRECTWRITE
+
+#include "hb-shaper-impl.hh"
+
+#include <dwrite_1.h>
+
+#include "hb-directwrite.h"
+
+
+/* Declare object creator for dynamic support of DWRITE */
+typedef HRESULT (* WINAPI t_DWriteCreateFactory)(
+ DWRITE_FACTORY_TYPE factoryType,
+ REFIID iid,
+ IUnknown **factory
+);
+
+/*
+ * hb-directwrite uses new/delete syntatically but as we let users
+ * to override malloc/free, we will redefine new/delete so users
+ * won't need to do that by their own.
+ */
+void* operator new (size_t size) { return malloc (size); }
+void* operator new [] (size_t size) { return malloc (size); }
+void operator delete (void* pointer) { free (pointer); }
+void operator delete [] (void* pointer) { free (pointer); }
+
+
+/*
+ * DirectWrite font stream helpers
+ */
+
+// This is a font loader which provides only one font (unlike its original design).
+// For a better implementation which was also source of this
+// and DWriteFontFileStream, have a look at to NativeFontResourceDWrite.cpp in Mozilla
+class DWriteFontFileLoader : public IDWriteFontFileLoader
+{
+private:
+ IDWriteFontFileStream *mFontFileStream;
+public:
+ DWriteFontFileLoader (IDWriteFontFileStream *fontFileStream)
+ { mFontFileStream = fontFileStream; }
+
+ // IUnknown interface
+ IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject)
+ { return S_OK; }
+ IFACEMETHOD_ (ULONG, AddRef) () { return 1; }
+ IFACEMETHOD_ (ULONG, Release) () { return 1; }
+
+ // IDWriteFontFileLoader methods
+ virtual HRESULT STDMETHODCALLTYPE
+ CreateStreamFromKey (void const* fontFileReferenceKey,
+ uint32_t fontFileReferenceKeySize,
+ OUT IDWriteFontFileStream** fontFileStream)
+ {
+ *fontFileStream = mFontFileStream;
+ return S_OK;
+ }
+
+ virtual ~DWriteFontFileLoader() {}
+};
+
+class DWriteFontFileStream : public IDWriteFontFileStream
+{
+private:
+ uint8_t *mData;
+ uint32_t mSize;
+public:
+ DWriteFontFileStream (uint8_t *aData, uint32_t aSize)
+ {
+ mData = aData;
+ mSize = aSize;
+ }
+
+ // IUnknown interface
+ IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject)
+ { return S_OK; }
+ IFACEMETHOD_ (ULONG, AddRef) () { return 1; }
+ IFACEMETHOD_ (ULONG, Release) () { return 1; }
+
+ // IDWriteFontFileStream methods
+ virtual HRESULT STDMETHODCALLTYPE
+ ReadFileFragment (void const** fragmentStart,
+ UINT64 fileOffset,
+ UINT64 fragmentSize,
+ OUT void** fragmentContext)
+ {
+ // We are required to do bounds checking.
+ if (fileOffset + fragmentSize > mSize) return E_FAIL;
+
+ // truncate the 64 bit fileOffset to size_t sized index into mData
+ size_t index = static_cast<size_t> (fileOffset);
+
+ // We should be alive for the duration of this.
+ *fragmentStart = &mData[index];
+ *fragmentContext = nullptr;
+ return S_OK;
+ }
+
+ virtual void STDMETHODCALLTYPE
+ ReleaseFileFragment (void* fragmentContext) {}
+
+ virtual HRESULT STDMETHODCALLTYPE
+ GetFileSize (OUT UINT64* fileSize)
+ {
+ *fileSize = mSize;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE
+ GetLastWriteTime (OUT UINT64* lastWriteTime) { return E_NOTIMPL; }
+
+ virtual ~DWriteFontFileStream() {}
+};
+
+
+/*
+* shaper face data
+*/
+
+struct hb_directwrite_face_data_t
+{
+ HMODULE dwrite_dll;
+ IDWriteFactory *dwriteFactory;
+ IDWriteFontFile *fontFile;
+ DWriteFontFileStream *fontFileStream;
+ DWriteFontFileLoader *fontFileLoader;
+ IDWriteFontFace *fontFace;
+ hb_blob_t *faceBlob;
+};
+
+hb_directwrite_face_data_t *
+_hb_directwrite_shaper_face_data_create (hb_face_t *face)
+{
+ hb_directwrite_face_data_t *data = new hb_directwrite_face_data_t;
+ if (unlikely (!data))
+ return nullptr;
+
+#define FAIL(...) \
+ HB_STMT_START { \
+ DEBUG_MSG (DIRECTWRITE, nullptr, __VA_ARGS__); \
+ return nullptr; \
+ } HB_STMT_END
+
+ data->dwrite_dll = LoadLibrary (TEXT ("DWRITE"));
+ if (unlikely (!data->dwrite_dll))
+ FAIL ("Cannot find DWrite.DLL");
+
+ t_DWriteCreateFactory p_DWriteCreateFactory;
+
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-function-type"
+#endif
+
+ p_DWriteCreateFactory = (t_DWriteCreateFactory)
+ GetProcAddress (data->dwrite_dll, "DWriteCreateFactory");
+
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+
+ if (unlikely (!p_DWriteCreateFactory))
+ FAIL ("Cannot find DWriteCreateFactory().");
+
+ HRESULT hr;
+
+ // TODO: factory and fontFileLoader should be cached separately
+ IDWriteFactory* dwriteFactory;
+ hr = p_DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory),
+ (IUnknown**) &dwriteFactory);
+
+ if (unlikely (hr != S_OK))
+ FAIL ("Failed to run DWriteCreateFactory().");
+
+ hb_blob_t *blob = hb_face_reference_blob (face);
+ DWriteFontFileStream *fontFileStream;
+ fontFileStream = new DWriteFontFileStream ((uint8_t *) hb_blob_get_data (blob, nullptr),
+ hb_blob_get_length (blob));
+
+ DWriteFontFileLoader *fontFileLoader = new DWriteFontFileLoader (fontFileStream);
+ dwriteFactory->RegisterFontFileLoader (fontFileLoader);
+
+ IDWriteFontFile *fontFile;
+ uint64_t fontFileKey = 0;
+ hr = dwriteFactory->CreateCustomFontFileReference (&fontFileKey, sizeof (fontFileKey),
+ fontFileLoader, &fontFile);
+
+ if (FAILED (hr))
+ FAIL ("Failed to load font file from data!");
+
+ BOOL isSupported;
+ DWRITE_FONT_FILE_TYPE fileType;
+ DWRITE_FONT_FACE_TYPE faceType;
+ uint32_t numberOfFaces;
+ hr = fontFile->Analyze (&isSupported, &fileType, &faceType, &numberOfFaces);
+ if (FAILED (hr) || !isSupported)
+ FAIL ("Font file is not supported.");
+
+#undef FAIL
+
+ IDWriteFontFace *fontFace;
+ dwriteFactory->CreateFontFace (faceType, 1, &fontFile, 0,
+ DWRITE_FONT_SIMULATIONS_NONE, &fontFace);
+
+ data->dwriteFactory = dwriteFactory;
+ data->fontFile = fontFile;
+ data->fontFileStream = fontFileStream;
+ data->fontFileLoader = fontFileLoader;
+ data->fontFace = fontFace;
+ data->faceBlob = blob;
+
+ return data;
+}
+
+void
+_hb_directwrite_shaper_face_data_destroy (hb_directwrite_face_data_t *data)
+{
+ if (data->fontFace)
+ data->fontFace->Release ();
+ if (data->fontFile)
+ data->fontFile->Release ();
+ if (data->dwriteFactory)
+ {
+ if (data->fontFileLoader)
+ data->dwriteFactory->UnregisterFontFileLoader (data->fontFileLoader);
+ data->dwriteFactory->Release ();
+ }
+ if (data->fontFileLoader)
+ delete data->fontFileLoader;
+ if (data->fontFileStream)
+ delete data->fontFileStream;
+ if (data->faceBlob)
+ hb_blob_destroy (data->faceBlob);
+ if (data->dwrite_dll)
+ FreeLibrary (data->dwrite_dll);
+ if (data)
+ delete data;
+}
+
+
+/*
+ * shaper font data
+ */
+
+struct hb_directwrite_font_data_t {};
+
+hb_directwrite_font_data_t *
+_hb_directwrite_shaper_font_data_create (hb_font_t *font)
+{
+ hb_directwrite_font_data_t *data = new hb_directwrite_font_data_t;
+ if (unlikely (!data))
+ return nullptr;
+
+ return data;
+}
+
+void
+_hb_directwrite_shaper_font_data_destroy (hb_directwrite_font_data_t *data)
+{
+ delete data;
+}
+
+
+// Most of TextAnalysis is originally written by Bas Schouten for Mozilla project
+// but now is relicensed to MIT for HarfBuzz use
+class TextAnalysis : public IDWriteTextAnalysisSource, public IDWriteTextAnalysisSink
+{
+public:
+
+ IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject)
+ { return S_OK; }
+ IFACEMETHOD_ (ULONG, AddRef) () { return 1; }
+ IFACEMETHOD_ (ULONG, Release) () { return 1; }
+
+ // A single contiguous run of characters containing the same analysis
+ // results.
+ struct Run
+ {
+ uint32_t mTextStart; // starting text position of this run
+ uint32_t mTextLength; // number of contiguous code units covered
+ uint32_t mGlyphStart; // starting glyph in the glyphs array
+ uint32_t mGlyphCount; // number of glyphs associated with this run
+ // text
+ DWRITE_SCRIPT_ANALYSIS mScript;
+ uint8_t mBidiLevel;
+ bool mIsSideways;
+
+ bool ContainsTextPosition (uint32_t aTextPosition) const
+ {
+ return aTextPosition >= mTextStart &&
+ aTextPosition < mTextStart + mTextLength;
+ }
+
+ Run *nextRun;
+ };
+
+public:
+ TextAnalysis (const wchar_t* text, uint32_t textLength,
+ const wchar_t* localeName, DWRITE_READING_DIRECTION readingDirection)
+ : mTextLength (textLength), mText (text), mLocaleName (localeName),
+ mReadingDirection (readingDirection), mCurrentRun (nullptr) {}
+ ~TextAnalysis ()
+ {
+ // delete runs, except mRunHead which is part of the TextAnalysis object
+ for (Run *run = mRunHead.nextRun; run;)
+ {
+ Run *origRun = run;
+ run = run->nextRun;
+ delete origRun;
+ }
+ }
+
+ STDMETHODIMP
+ GenerateResults (IDWriteTextAnalyzer* textAnalyzer, Run **runHead)
+ {
+ // Analyzes the text using the script analyzer and returns
+ // the result as a series of runs.
+
+ HRESULT hr = S_OK;
+
+ // Initially start out with one result that covers the entire range.
+ // This result will be subdivided by the analysis processes.
+ mRunHead.mTextStart = 0;
+ mRunHead.mTextLength = mTextLength;
+ mRunHead.mBidiLevel =
+ (mReadingDirection == DWRITE_READING_DIRECTION_RIGHT_TO_LEFT);
+ mRunHead.nextRun = nullptr;
+ mCurrentRun = &mRunHead;
+
+ // Call each of the analyzers in sequence, recording their results.
+ if (SUCCEEDED (hr = textAnalyzer->AnalyzeScript (this, 0, mTextLength, this)))
+ *runHead = &mRunHead;
+
+ return hr;
+ }
+
+ // IDWriteTextAnalysisSource implementation
+
+ IFACEMETHODIMP
+ GetTextAtPosition (uint32_t textPosition,
+ OUT wchar_t const** textString,
+ OUT uint32_t* textLength)
+ {
+ if (textPosition >= mTextLength)
+ {
+ // No text at this position, valid query though.
+ *textString = nullptr;
+ *textLength = 0;
+ }
+ else
+ {
+ *textString = mText + textPosition;
+ *textLength = mTextLength - textPosition;
+ }
+ return S_OK;
+ }
+
+ IFACEMETHODIMP
+ GetTextBeforePosition (uint32_t textPosition,
+ OUT wchar_t const** textString,
+ OUT uint32_t* textLength)
+ {
+ if (textPosition == 0 || textPosition > mTextLength)
+ {
+ // Either there is no text before here (== 0), or this
+ // is an invalid position. The query is considered valid though.
+ *textString = nullptr;
+ *textLength = 0;
+ }
+ else
+ {
+ *textString = mText;
+ *textLength = textPosition;
+ }
+ return S_OK;
+ }
+
+ IFACEMETHODIMP_ (DWRITE_READING_DIRECTION)
+ GetParagraphReadingDirection () { return mReadingDirection; }
+
+ IFACEMETHODIMP GetLocaleName (uint32_t textPosition, uint32_t* textLength,
+ wchar_t const** localeName)
+ { return S_OK; }
+
+ IFACEMETHODIMP
+ GetNumberSubstitution (uint32_t textPosition,
+ OUT uint32_t* textLength,
+ OUT IDWriteNumberSubstitution** numberSubstitution)
+ {
+ // We do not support number substitution.
+ *numberSubstitution = nullptr;
+ *textLength = mTextLength - textPosition;
+
+ return S_OK;
+ }
+
+ // IDWriteTextAnalysisSink implementation
+
+ IFACEMETHODIMP
+ SetScriptAnalysis (uint32_t textPosition, uint32_t textLength,
+ DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis)
+ {
+ SetCurrentRun (textPosition);
+ SplitCurrentRun (textPosition);
+ while (textLength > 0)
+ {
+ Run *run = FetchNextRun (&textLength);
+ run->mScript = *scriptAnalysis;
+ }
+
+ return S_OK;
+ }
+
+ IFACEMETHODIMP
+ SetLineBreakpoints (uint32_t textPosition,
+ uint32_t textLength,
+ const DWRITE_LINE_BREAKPOINT* lineBreakpoints)
+ { return S_OK; }
+
+ IFACEMETHODIMP SetBidiLevel (uint32_t textPosition, uint32_t textLength,
+ uint8_t explicitLevel, uint8_t resolvedLevel)
+ { return S_OK; }
+
+ IFACEMETHODIMP
+ SetNumberSubstitution (uint32_t textPosition, uint32_t textLength,
+ IDWriteNumberSubstitution* numberSubstitution)
+ { return S_OK; }
+
+protected:
+ Run *FetchNextRun (IN OUT uint32_t* textLength)
+ {
+ // Used by the sink setters, this returns a reference to the next run.
+ // Position and length are adjusted to now point after the current run
+ // being returned.
+
+ Run *origRun = mCurrentRun;
+ // Split the tail if needed (the length remaining is less than the
+ // current run's size).
+ if (*textLength < mCurrentRun->mTextLength)
+ SplitCurrentRun (mCurrentRun->mTextStart + *textLength);
+ else
+ // Just advance the current run.
+ mCurrentRun = mCurrentRun->nextRun;
+ *textLength -= origRun->mTextLength;
+
+ // Return a reference to the run that was just current.
+ return origRun;
+ }
+
+ void SetCurrentRun (uint32_t textPosition)
+ {
+ // Move the current run to the given position.
+ // Since the analyzers generally return results in a forward manner,
+ // this will usually just return early. If not, find the
+ // corresponding run for the text position.
+
+ if (mCurrentRun && mCurrentRun->ContainsTextPosition (textPosition))
+ return;
+
+ for (Run *run = &mRunHead; run; run = run->nextRun)
+ if (run->ContainsTextPosition (textPosition))
+ {
+ mCurrentRun = run;
+ return;
+ }
+ assert (0); // We should always be able to find the text position in one of our runs
+ }
+
+ void SplitCurrentRun (uint32_t splitPosition)
+ {
+ if (!mCurrentRun)
+ {
+ assert (0); // SplitCurrentRun called without current run
+ // Shouldn't be calling this when no current run is set!
+ return;
+ }
+ // Split the current run.
+ if (splitPosition <= mCurrentRun->mTextStart)
+ {
+ // No need to split, already the start of a run
+ // or before it. Usually the first.
+ return;
+ }
+ Run *newRun = new Run;
+
+ *newRun = *mCurrentRun;
+
+ // Insert the new run in our linked list.
+ newRun->nextRun = mCurrentRun->nextRun;
+ mCurrentRun->nextRun = newRun;
+
+ // Adjust runs' text positions and lengths.
+ uint32_t splitPoint = splitPosition - mCurrentRun->mTextStart;
+ newRun->mTextStart += splitPoint;
+ newRun->mTextLength -= splitPoint;
+ mCurrentRun->mTextLength = splitPoint;
+ mCurrentRun = newRun;
+ }
+
+protected:
+ // Input
+ // (weak references are fine here, since this class is a transient
+ // stack-based helper that doesn't need to copy data)
+ uint32_t mTextLength;
+ const wchar_t* mText;
+ const wchar_t* mLocaleName;
+ DWRITE_READING_DIRECTION mReadingDirection;
+
+ // Current processing state.
+ Run *mCurrentRun;
+
+ // Output is a list of runs starting here
+ Run mRunHead;
+};
+
+/*
+ * shaper
+ */
+
+static hb_bool_t
+_hb_directwrite_shape_full (hb_shape_plan_t *shape_plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer,
+ const hb_feature_t *features,
+ unsigned int num_features,
+ float lineWidth)
+{
+ hb_face_t *face = font->face;
+ const hb_directwrite_face_data_t *face_data = face->data.directwrite;
+ IDWriteFactory *dwriteFactory = face_data->dwriteFactory;
+ IDWriteFontFace *fontFace = face_data->fontFace;
+
+ IDWriteTextAnalyzer* analyzer;
+ dwriteFactory->CreateTextAnalyzer (&analyzer);
+
+ unsigned int scratch_size;
+ hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size);
+#define ALLOCATE_ARRAY(Type, name, len) \
+ Type *name = (Type *) scratch; \
+ do { \
+ unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \
+ assert (_consumed <= scratch_size); \
+ scratch += _consumed; \
+ scratch_size -= _consumed; \
+ } while (0)
+
+#define utf16_index() var1.u32
+
+ ALLOCATE_ARRAY (wchar_t, textString, buffer->len * 2);
+
+ unsigned int chars_len = 0;
+ for (unsigned int i = 0; i < buffer->len; i++)
+ {
+ hb_codepoint_t c = buffer->info[i].codepoint;
+ buffer->info[i].utf16_index () = chars_len;
+ if (likely (c <= 0xFFFFu))
+ textString[chars_len++] = c;
+ else if (unlikely (c > 0x10FFFFu))
+ textString[chars_len++] = 0xFFFDu;
+ else
+ {
+ textString[chars_len++] = 0xD800u + ((c - 0x10000u) >> 10);
+ textString[chars_len++] = 0xDC00u + ((c - 0x10000u) & ((1u << 10) - 1));
+ }
+ }
+
+ ALLOCATE_ARRAY (WORD, log_clusters, chars_len);
+ /* Need log_clusters to assign features. */
+ chars_len = 0;
+ for (unsigned int i = 0; i < buffer->len; i++)
+ {
+ hb_codepoint_t c = buffer->info[i].codepoint;
+ unsigned int cluster = buffer->info[i].cluster;
+ log_clusters[chars_len++] = cluster;
+ if (hb_in_range (c, 0x10000u, 0x10FFFFu))
+ log_clusters[chars_len++] = cluster; /* Surrogates. */
+ }
+
+ // TODO: Handle TEST_DISABLE_OPTIONAL_LIGATURES
+
+ DWRITE_READING_DIRECTION readingDirection;
+ readingDirection = buffer->props.direction ?
+ DWRITE_READING_DIRECTION_RIGHT_TO_LEFT :
+ DWRITE_READING_DIRECTION_LEFT_TO_RIGHT;
+
+ /*
+ * There's an internal 16-bit limit on some things inside the analyzer,
+ * but we never attempt to shape a word longer than 64K characters
+ * in a single gfxShapedWord, so we cannot exceed that limit.
+ */
+ uint32_t textLength = buffer->len;
+
+ TextAnalysis analysis (textString, textLength, nullptr, readingDirection);
+ TextAnalysis::Run *runHead;
+ HRESULT hr;
+ hr = analysis.GenerateResults (analyzer, &runHead);
+
+#define FAIL(...) \
+ HB_STMT_START { \
+ DEBUG_MSG (DIRECTWRITE, nullptr, __VA_ARGS__); \
+ return false; \
+ } HB_STMT_END
+
+ if (FAILED (hr))
+ FAIL ("Analyzer failed to generate results.");
+
+ uint32_t maxGlyphCount = 3 * textLength / 2 + 16;
+ uint32_t glyphCount;
+ bool isRightToLeft = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
+
+ const wchar_t localeName[20] = {0};
+ if (buffer->props.language != nullptr)
+ mbstowcs ((wchar_t*) localeName,
+ hb_language_to_string (buffer->props.language), 20);
+
+ // TODO: it does work but doesn't care about ranges
+ DWRITE_TYPOGRAPHIC_FEATURES typographic_features;
+ typographic_features.featureCount = num_features;
+ if (num_features)
+ {
+ typographic_features.features = new DWRITE_FONT_FEATURE[num_features];
+ for (unsigned int i = 0; i < num_features; ++i)
+ {
+ typographic_features.features[i].nameTag = (DWRITE_FONT_FEATURE_TAG)
+ hb_uint32_swap (features[i].tag);
+ typographic_features.features[i].parameter = features[i].value;
+ }
+ }
+ const DWRITE_TYPOGRAPHIC_FEATURES* dwFeatures;
+ dwFeatures = (const DWRITE_TYPOGRAPHIC_FEATURES*) &typographic_features;
+ const uint32_t featureRangeLengths[] = { textLength };
+ //
+
+ uint16_t* clusterMap;
+ clusterMap = new uint16_t[textLength];
+ DWRITE_SHAPING_TEXT_PROPERTIES* textProperties;
+ textProperties = new DWRITE_SHAPING_TEXT_PROPERTIES[textLength];
+retry_getglyphs:
+ uint16_t* glyphIndices = new uint16_t[maxGlyphCount];
+ DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProperties;
+ glyphProperties = new DWRITE_SHAPING_GLYPH_PROPERTIES[maxGlyphCount];
+
+ hr = analyzer->GetGlyphs (textString, textLength, fontFace, false,
+ isRightToLeft, &runHead->mScript, localeName,
+ nullptr, &dwFeatures, featureRangeLengths, 1,
+ maxGlyphCount, clusterMap, textProperties,
+ glyphIndices, glyphProperties, &glyphCount);
+
+ if (unlikely (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER)))
+ {
+ delete [] glyphIndices;
+ delete [] glyphProperties;
+
+ maxGlyphCount *= 2;
+
+ goto retry_getglyphs;
+ }
+ if (FAILED (hr))
+ FAIL ("Analyzer failed to get glyphs.");
+
+ float* glyphAdvances = new float[maxGlyphCount];
+ DWRITE_GLYPH_OFFSET* glyphOffsets = new DWRITE_GLYPH_OFFSET[maxGlyphCount];
+
+ /* The -2 in the following is to compensate for possible
+ * alignment needed after the WORD array. sizeof (WORD) == 2. */
+ unsigned int glyphs_size = (scratch_size * sizeof (int) - 2)
+ / (sizeof (WORD) +
+ sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES) +
+ sizeof (int) +
+ sizeof (DWRITE_GLYPH_OFFSET) +
+ sizeof (uint32_t));
+ ALLOCATE_ARRAY (uint32_t, vis_clusters, glyphs_size);
+
+#undef ALLOCATE_ARRAY
+
+ int fontEmSize = font->face->get_upem ();
+ if (fontEmSize < 0) fontEmSize = -fontEmSize;
+
+ if (fontEmSize < 0) fontEmSize = -fontEmSize;
+ double x_mult = (double) font->x_scale / fontEmSize;
+ double y_mult = (double) font->y_scale / fontEmSize;
+
+ hr = analyzer->GetGlyphPlacements (textString, clusterMap, textProperties,
+ textLength, glyphIndices, glyphProperties,
+ glyphCount, fontFace, fontEmSize,
+ false, isRightToLeft, &runHead->mScript, localeName,
+ &dwFeatures, featureRangeLengths, 1,
+ glyphAdvances, glyphOffsets);
+
+ if (FAILED (hr))
+ FAIL ("Analyzer failed to get glyph placements.");
+
+ IDWriteTextAnalyzer1* analyzer1;
+ analyzer->QueryInterface (&analyzer1);
+
+ if (analyzer1 && lineWidth)
+ {
+ DWRITE_JUSTIFICATION_OPPORTUNITY* justificationOpportunities =
+ new DWRITE_JUSTIFICATION_OPPORTUNITY[maxGlyphCount];
+ hr = analyzer1->GetJustificationOpportunities (fontFace, fontEmSize, runHead->mScript,
+ textLength, glyphCount, textString,
+ clusterMap, glyphProperties,
+ justificationOpportunities);
+
+ if (FAILED (hr))
+ FAIL ("Analyzer failed to get justification opportunities.");
+
+ float* justifiedGlyphAdvances = new float[maxGlyphCount];
+ DWRITE_GLYPH_OFFSET* justifiedGlyphOffsets = new DWRITE_GLYPH_OFFSET[glyphCount];
+ hr = analyzer1->JustifyGlyphAdvances (lineWidth, glyphCount, justificationOpportunities,
+ glyphAdvances, glyphOffsets, justifiedGlyphAdvances,
+ justifiedGlyphOffsets);
+
+ if (FAILED (hr)) FAIL ("Analyzer failed to get justify glyph advances.");
+
+ DWRITE_SCRIPT_PROPERTIES scriptProperties;
+ hr = analyzer1->GetScriptProperties (runHead->mScript, &scriptProperties);
+ if (FAILED (hr)) FAIL ("Analyzer failed to get script properties.");
+ uint32_t justificationCharacter = scriptProperties.justificationCharacter;
+
+ // if a script justificationCharacter is not space, it can have GetJustifiedGlyphs
+ if (justificationCharacter != 32)
+ {
+ uint16_t* modifiedClusterMap = new uint16_t[textLength];
+ retry_getjustifiedglyphs:
+ uint16_t* modifiedGlyphIndices = new uint16_t[maxGlyphCount];
+ float* modifiedGlyphAdvances = new float[maxGlyphCount];
+ DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets = new DWRITE_GLYPH_OFFSET[maxGlyphCount];
+ uint32_t actualGlyphsCount;
+ hr = analyzer1->GetJustifiedGlyphs (fontFace, fontEmSize, runHead->mScript,
+ textLength, glyphCount, maxGlyphCount,
+ clusterMap, glyphIndices, glyphAdvances,
+ justifiedGlyphAdvances, justifiedGlyphOffsets,
+ glyphProperties, &actualGlyphsCount,
+ modifiedClusterMap, modifiedGlyphIndices,
+ modifiedGlyphAdvances, modifiedGlyphOffsets);
+
+ if (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER))
+ {
+ maxGlyphCount = actualGlyphsCount;
+ delete [] modifiedGlyphIndices;
+ delete [] modifiedGlyphAdvances;
+ delete [] modifiedGlyphOffsets;
+
+ maxGlyphCount = actualGlyphsCount;
+
+ goto retry_getjustifiedglyphs;
+ }
+ if (FAILED (hr))
+ FAIL ("Analyzer failed to get justified glyphs.");
+
+ delete [] clusterMap;
+ delete [] glyphIndices;
+ delete [] glyphAdvances;
+ delete [] glyphOffsets;
+
+ glyphCount = actualGlyphsCount;
+ clusterMap = modifiedClusterMap;
+ glyphIndices = modifiedGlyphIndices;
+ glyphAdvances = modifiedGlyphAdvances;
+ glyphOffsets = modifiedGlyphOffsets;
+
+ delete [] justifiedGlyphAdvances;
+ delete [] justifiedGlyphOffsets;
+ }
+ else
+ {
+ delete [] glyphAdvances;
+ delete [] glyphOffsets;
+
+ glyphAdvances = justifiedGlyphAdvances;
+ glyphOffsets = justifiedGlyphOffsets;
+ }
+
+ delete [] justificationOpportunities;
+ }
+
+ /* Ok, we've got everything we need, now compose output buffer,
+ * very, *very*, carefully! */
+
+ /* Calculate visual-clusters. That's what we ship. */
+ for (unsigned int i = 0; i < glyphCount; i++)
+ vis_clusters[i] = (uint32_t) -1;
+ for (unsigned int i = 0; i < buffer->len; i++)
+ {
+ uint32_t *p =
+ &vis_clusters[log_clusters[buffer->info[i].utf16_index ()]];
+ *p = hb_min (*p, buffer->info[i].cluster);
+ }
+ for (unsigned int i = 1; i < glyphCount; i++)
+ if (vis_clusters[i] == (uint32_t) -1)
+ vis_clusters[i] = vis_clusters[i - 1];
+
+#undef utf16_index
+
+ if (unlikely (!buffer->ensure (glyphCount)))
+ FAIL ("Buffer in error");
+
+#undef FAIL
+
+ /* Set glyph infos */
+ buffer->len = 0;
+ for (unsigned int i = 0; i < glyphCount; i++)
+ {
+ hb_glyph_info_t *info = &buffer->info[buffer->len++];
+
+ info->codepoint = glyphIndices[i];
+ info->cluster = vis_clusters[i];
+
+ /* The rest is crap. Let's store position info there for now. */
+ info->mask = glyphAdvances[i];
+ info->var1.i32 = glyphOffsets[i].advanceOffset;
+ info->var2.i32 = glyphOffsets[i].ascenderOffset;
+ }
+
+ /* Set glyph positions */
+ buffer->clear_positions ();
+ for (unsigned int i = 0; i < glyphCount; i++)
+ {
+ hb_glyph_info_t *info = &buffer->info[i];
+ hb_glyph_position_t *pos = &buffer->pos[i];
+
+ /* TODO vertical */
+ pos->x_advance = x_mult * (int32_t) info->mask;
+ pos->x_offset = x_mult * (isRightToLeft ? -info->var1.i32 : info->var1.i32);
+ pos->y_offset = y_mult * info->var2.i32;
+ }
+
+ if (isRightToLeft) hb_buffer_reverse (buffer);
+
+ delete [] clusterMap;
+ delete [] glyphIndices;
+ delete [] textProperties;
+ delete [] glyphProperties;
+ delete [] glyphAdvances;
+ delete [] glyphOffsets;
+
+ if (num_features)
+ delete [] typographic_features.features;
+
+ /* Wow, done! */
+ return true;
+}
+
+hb_bool_t
+_hb_directwrite_shape (hb_shape_plan_t *shape_plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer,
+ const hb_feature_t *features,
+ unsigned int num_features)
+{
+ return _hb_directwrite_shape_full (shape_plan, font, buffer,
+ features, num_features, 0);
+}
+
+HB_UNUSED static bool
+_hb_directwrite_shape_experimental_width (hb_font_t *font,
+ hb_buffer_t *buffer,
+ const hb_feature_t *features,
+ unsigned int num_features,
+ float width)
+{
+ static const char *shapers = "directwrite";
+ hb_shape_plan_t *shape_plan;
+ shape_plan = hb_shape_plan_create_cached (font->face, &buffer->props,
+ features, num_features, &shapers);
+ hb_bool_t res = _hb_directwrite_shape_full (shape_plan, font, buffer,
+ features, num_features, width);
+
+ buffer->unsafe_to_break_all ();
+
+ return res;
+}
+
+struct _hb_directwrite_font_table_context {
+ IDWriteFontFace *face;
+ void *table_context;
+};
+
+static void
+_hb_directwrite_table_data_release (void *data)
+{
+ _hb_directwrite_font_table_context *context = (_hb_directwrite_font_table_context *) data;
+ context->face->ReleaseFontTable (context->table_context);
+ delete context;
+}
+
+static hb_blob_t *
+_hb_directwrite_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
+{
+ IDWriteFontFace *dw_face = ((IDWriteFontFace *) user_data);
+ const void *data;
+ uint32_t length;
+ void *table_context;
+ BOOL exists;
+ if (!dw_face || FAILED (dw_face->TryGetFontTable (hb_uint32_swap (tag), &data,
+ &length, &table_context, &exists)))
+ return nullptr;
+
+ if (!data || !exists || !length)
+ {
+ dw_face->ReleaseFontTable (table_context);
+ return nullptr;
+ }
+
+ _hb_directwrite_font_table_context *context = new _hb_directwrite_font_table_context;
+ context->face = dw_face;
+ context->table_context = table_context;
+
+ return hb_blob_create ((const char *) data, length, HB_MEMORY_MODE_READONLY,
+ context, _hb_directwrite_table_data_release);
+}
+
+static void
+_hb_directwrite_font_release (void *data)
+{
+ if (data)
+ ((IDWriteFontFace *) data)->Release ();
+}
+
+/**
+ * hb_directwrite_face_create:
+ * @font_face: a DirectWrite IDWriteFontFace object.
+ *
+ * Return value: #hb_face_t object corresponding to the given input
+ *
+ * Since: 2.4.0
+ **/
+hb_face_t *
+hb_directwrite_face_create (IDWriteFontFace *font_face)
+{
+ if (font_face)
+ font_face->AddRef ();
+ return hb_face_create_for_tables (_hb_directwrite_reference_table, font_face,
+ _hb_directwrite_font_release);
+}
+
+/**
+* hb_directwrite_face_get_font_face:
+* @face: a #hb_face_t object
+*
+* Return value: DirectWrite IDWriteFontFace object corresponding to the given input
+*
+* Since: 2.5.0
+**/
+IDWriteFontFace *
+hb_directwrite_face_get_font_face (hb_face_t *face)
+{
+ return face->data.directwrite->fontFace;
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-directwrite.h b/src/3rdparty/harfbuzz-ng/src/hb-directwrite.h
new file mode 100644
index 0000000000..f837627a28
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-directwrite.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2015-2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_DIRECTWRITE_H
+#define HB_DIRECTWRITE_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+HB_EXTERN hb_face_t *
+hb_directwrite_face_create (IDWriteFontFace *font_face);
+
+HB_EXTERN IDWriteFontFace *
+hb_directwrite_face_get_font_face (hb_face_t *face);
+
+HB_END_DECLS
+
+#endif /* HB_DIRECTWRITE_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-dispatch.hh b/src/3rdparty/harfbuzz-ng/src/hb-dispatch.hh
new file mode 100644
index 0000000000..1ce3fac936
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-dispatch.hh
@@ -0,0 +1,58 @@
+/*
+ * Copyright © 2007,2008,2009,2010 Red Hat, Inc.
+ * Copyright © 2012,2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_DISPATCH_HH
+#define HB_DISPATCH_HH
+
+#include "hb.hh"
+
+/*
+ * Dispatch
+ */
+
+template <typename Context, typename Return, unsigned int MaxDebugDepth>
+struct hb_dispatch_context_t
+{
+ private:
+ /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
+ const Context* thiz () const { return static_cast<const Context *> (this); }
+ Context* thiz () { return static_cast< Context *> (this); }
+ public:
+ static constexpr unsigned max_debug_depth = MaxDebugDepth;
+ typedef Return return_t;
+ template <typename T, typename F>
+ bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; }
+ template <typename T, typename ...Ts>
+ return_t dispatch (const T &obj, Ts&&... ds)
+ { return obj.dispatch (thiz (), hb_forward<Ts> (ds)...); }
+ static return_t no_dispatch_return_value () { return Context::default_return_value (); }
+ static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; }
+};
+
+
+#endif /* HB_DISPATCH_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-dsalgs.hh b/src/3rdparty/harfbuzz-ng/src/hb-dsalgs.hh
deleted file mode 100644
index 4e8f0431c6..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-dsalgs.hh
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright © 2017 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_DSALGS_HH
-#define HB_DSALGS_HH
-
-#include "hb-private.hh"
-
-#if defined(__ghs)
-// GHS compiler doesn't support the __restrict keyword
-#define __restrict
-#endif
-
-
-
-static inline void *
-hb_bsearch_r (const void *key, const void *base,
- size_t nmemb, size_t size,
- int (*compar)(const void *_key, const void *_item, void *_arg),
- void *arg)
-{
- int min = 0, max = (int) nmemb - 1;
- while (min <= max)
- {
- int mid = (min + max) / 2;
- const void *p = (const void *) (((const char *) base) + (mid * size));
- int c = compar (key, p, arg);
- if (c < 0)
- max = mid - 1;
- else if (c > 0)
- min = mid + 1;
- else
- return (void *) p;
- }
- return NULL;
-}
-
-
-
-/* From https://github.com/noporpoise/sort_r */
-
-/* Isaac Turner 29 April 2014 Public Domain */
-
-/*
-
-hb_sort_r function to be exported.
-
-Parameters:
- base is the array to be sorted
- nel is the number of elements in the array
- width is the size in bytes of each element of the array
- compar is the comparison function
- arg is a pointer to be passed to the comparison function
-
-void hb_sort_r(void *base, size_t nel, size_t width,
- int (*compar)(const void *_a, const void *_b, void *_arg),
- void *arg);
-*/
-
-
-/* swap a, b iff a>b */
-/* __restrict is same as restrict but better support on old machines */
-static int sort_r_cmpswap(char *__restrict a, char *__restrict b, size_t w,
- int (*compar)(const void *_a, const void *_b,
- void *_arg),
- void *arg)
-{
- char tmp, *end = a+w;
- if(compar(a, b, arg) > 0) {
- for(; a < end; a++, b++) { tmp = *a; *a = *b; *b = tmp; }
- return 1;
- }
- return 0;
-}
-
-/* Note: quicksort is not stable, equivalent values may be swapped */
-static inline void sort_r_simple(void *base, size_t nel, size_t w,
- int (*compar)(const void *_a, const void *_b,
- void *_arg),
- void *arg)
-{
- char *b = (char *)base, *end = b + nel*w;
- if(nel < 7) {
- /* Insertion sort for arbitrarily small inputs */
- char *pi, *pj;
- for(pi = b+w; pi < end; pi += w) {
- for(pj = pi; pj > b && sort_r_cmpswap(pj-w,pj,w,compar,arg); pj -= w) {}
- }
- }
- else
- {
- /* nel > 6; Quicksort */
-
- /* Use median of first, middle and last items as pivot */
- char *x, *y, *xend, ch;
- char *pl, *pr;
- char *last = b+w*(nel-1), *tmp;
- char *l[3];
- l[0] = b;
- l[1] = b+w*(nel/2);
- l[2] = last;
-
- if(compar(l[0],l[1],arg) > 0) { tmp=l[0]; l[0]=l[1]; l[1]=tmp; }
- if(compar(l[1],l[2],arg) > 0) {
- tmp=l[1]; l[1]=l[2]; l[2]=tmp; /* swap(l[1],l[2]) */
- if(compar(l[0],l[1],arg) > 0) { tmp=l[0]; l[0]=l[1]; l[1]=tmp; }
- }
-
- /* swap l[id], l[2] to put pivot as last element */
- for(x = l[1], y = last, xend = x+w; x<xend; x++, y++) {
- ch = *x; *x = *y; *y = ch;
- }
-
- pl = b;
- pr = last;
-
- while(pl < pr) {
- for(; pl < pr; pl += w) {
- if(sort_r_cmpswap(pl, pr, w, compar, arg)) {
- pr -= w; /* pivot now at pl */
- break;
- }
- }
- for(; pl < pr; pr -= w) {
- if(sort_r_cmpswap(pl, pr, w, compar, arg)) {
- pl += w; /* pivot now at pr */
- break;
- }
- }
- }
-
- sort_r_simple(b, (pl-b)/w, w, compar, arg);
- sort_r_simple(pl+w, (end-(pl+w))/w, w, compar, arg);
- }
-}
-
-static inline void hb_sort_r(void *base, size_t nel, size_t width,
- int (*compar)(const void *_a, const void *_b, void *_arg),
- void *arg)
-{
- sort_r_simple(base, nel, width, compar, arg);
-}
-
-#endif /* HB_DSALGS_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-face-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-face-private.hh
deleted file mode 100644
index 43e7b1cb3f..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-face-private.hh
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- * Copyright © 2011 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_FACE_PRIVATE_HH
-#define HB_FACE_PRIVATE_HH
-
-#include "hb-private.hh"
-
-#include "hb-object-private.hh"
-#include "hb-shaper-private.hh"
-#include "hb-shape-plan-private.hh"
-
-
-/*
- * hb_face_t
- */
-
-struct hb_face_t {
- hb_object_header_t header;
- ASSERT_POD ();
-
- hb_bool_t immutable;
-
- hb_reference_table_func_t reference_table_func;
- void *user_data;
- hb_destroy_func_t destroy;
-
- unsigned int index; /* Face index in a collection, zero-based. */
- mutable unsigned int upem; /* Units-per-EM. */
- mutable unsigned int num_glyphs; /* Number of glyphs. */
-
- struct hb_shaper_data_t shaper_data; /* Various shaper data. */
-
- /* Various non-shaping data. */
- /* ... */
-
- /* Cache */
- struct plan_node_t {
- hb_shape_plan_t *shape_plan;
- plan_node_t *next;
- } *shape_plans;
-
-
- inline hb_blob_t *reference_table (hb_tag_t tag) const
- {
- hb_blob_t *blob;
-
- if (unlikely (!reference_table_func))
- return hb_blob_get_empty ();
-
- blob = reference_table_func (/*XXX*/const_cast<hb_face_t *> (this), tag, user_data);
- if (unlikely (!blob))
- return hb_blob_get_empty ();
-
- return blob;
- }
-
- inline HB_PURE_FUNC unsigned int get_upem (void) const
- {
- if (unlikely (!upem))
- load_upem ();
- return upem;
- }
-
- inline unsigned int get_num_glyphs (void) const
- {
- if (unlikely (num_glyphs == (unsigned int) -1))
- load_num_glyphs ();
- return num_glyphs;
- }
-
- private:
- HB_INTERNAL void load_upem (void) const;
- HB_INTERNAL void load_num_glyphs (void) const;
-};
-
-extern HB_INTERNAL const hb_face_t _hb_face_nil;
-
-#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
-#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, face);
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
-#undef HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
-
-
-#endif /* HB_FACE_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-face.cc b/src/3rdparty/harfbuzz-ng/src/hb-face.cc
index 26fddbe529..0c9949fff1 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-face.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-face.cc
@@ -26,48 +26,81 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-private.hh"
+#include "hb.hh"
-#include "hb-face-private.hh"
-#include "hb-open-file-private.hh"
-#include "hb-ot-head-table.hh"
-#include "hb-ot-maxp-table.hh"
+#include "hb-face.hh"
+#include "hb-blob.hh"
+#include "hb-open-file.hh"
+#include "hb-ot-face.hh"
+#include "hb-ot-cmap-table.hh"
+/**
+ * SECTION:hb-face
+ * @title: hb-face
+ * @short_description: Font face objects
+ * @include: hb.h
+ *
+ * Font face is objects represent a single face in a font family.
+ * More exactly, a font face represents a single face in a binary font file.
+ * Font faces are typically built from a binary blob and a face index.
+ * Font faces are used to create fonts.
+ **/
+
+
+/**
+ * hb_face_count:
+ * @blob: a blob.
+ *
+ * Get number of faces in a blob.
+ *
+ * Return value: Number of faces in @blob
+ *
+ * Since: 1.7.7
+ **/
+unsigned int
+hb_face_count (hb_blob_t *blob)
+{
+ if (unlikely (!blob))
+ return 0;
+
+ /* TODO We shouldn't be sanitizing blob. Port to run sanitizer and return if not sane. */
+ /* Make API signature const after. */
+ hb_blob_t *sanitized = hb_sanitize_context_t ().sanitize_blob<OT::OpenTypeFontFile> (hb_blob_reference (blob));
+ const OT::OpenTypeFontFile& ot = *sanitized->as<OT::OpenTypeFontFile> ();
+ unsigned int ret = ot.get_face_count ();
+ hb_blob_destroy (sanitized);
+
+ return ret;
+}
+
/*
* hb_face_t
*/
-const hb_face_t _hb_face_nil = {
+DEFINE_NULL_INSTANCE (hb_face_t) =
+{
HB_OBJECT_HEADER_STATIC,
- true, /* immutable */
-
nullptr, /* reference_table_func */
nullptr, /* user_data */
nullptr, /* destroy */
0, /* index */
- 1000, /* upem */
- 0, /* num_glyphs */
-
- {
-#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
- },
+ HB_ATOMIC_INT_INIT (1000), /* upem */
+ HB_ATOMIC_INT_INIT (0), /* num_glyphs */
- nullptr, /* shape_plans */
+ /* Zero for the rest is fine. */
};
/**
* hb_face_create_for_tables:
* @reference_table_func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
+ * @user_data:
+ * @destroy:
+ *
*
- *
*
* Return value: (transfer full)
*
@@ -90,8 +123,10 @@ hb_face_create_for_tables (hb_reference_table_func_t reference_table_func,
face->user_data = user_data;
face->destroy = destroy;
- face->upem = 0;
- face->num_glyphs = (unsigned int) -1;
+ face->num_glyphs.set_relaxed (-1);
+
+ face->data.init0 (face);
+ face->table.init0 (face);
return face;
}
@@ -134,22 +169,23 @@ _hb_face_for_data_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void
if (tag == HB_TAG_NONE)
return hb_blob_reference (data->blob);
- const OT::OpenTypeFontFile &ot_file = *OT::Sanitizer<OT::OpenTypeFontFile>::lock_instance (data->blob);
- const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index);
+ const OT::OpenTypeFontFile &ot_file = *data->blob->as<OT::OpenTypeFontFile> ();
+ unsigned int base_offset;
+ const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index, &base_offset);
const OT::OpenTypeTable &table = ot_face.get_table_by_tag (tag);
- hb_blob_t *blob = hb_blob_create_sub_blob (data->blob, table.offset, table.length);
+ hb_blob_t *blob = hb_blob_create_sub_blob (data->blob, base_offset + table.offset, table.length);
return blob;
}
/**
* hb_face_create: (Xconstructor)
- * @blob:
- * @index:
+ * @blob:
+ * @index:
+ *
*
- *
*
* Return value: (transfer full):
*
@@ -164,7 +200,7 @@ hb_face_create (hb_blob_t *blob,
if (unlikely (!blob))
blob = hb_blob_get_empty ();
- hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (OT::Sanitizer<OT::OpenTypeFontFile>::sanitize (hb_blob_reference (blob)), index);
+ hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (hb_sanitize_context_t ().sanitize_blob<OT::OpenTypeFontFile> (hb_blob_reference (blob)), index);
if (unlikely (!closure))
return hb_face_get_empty ();
@@ -181,16 +217,16 @@ hb_face_create (hb_blob_t *blob,
/**
* hb_face_get_empty:
*
- *
+ *
*
* Return value: (transfer full)
*
* Since: 0.9.2
**/
hb_face_t *
-hb_face_get_empty (void)
+hb_face_get_empty ()
{
- return const_cast<hb_face_t *> (&_hb_face_nil);
+ return const_cast<hb_face_t *> (&Null(hb_face_t));
}
@@ -198,9 +234,9 @@ hb_face_get_empty (void)
* hb_face_reference: (skip)
* @face: a face.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -214,7 +250,7 @@ hb_face_reference (hb_face_t *face)
* hb_face_destroy: (skip)
* @face: a face.
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -231,9 +267,8 @@ hb_face_destroy (hb_face_t *face)
node = next;
}
-#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, face);
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
+ face->data.fini ();
+ face->table.fini ();
if (face->destroy)
face->destroy (face->user_data);
@@ -244,14 +279,14 @@ hb_face_destroy (hb_face_t *face)
/**
* hb_face_set_user_data: (skip)
* @face: a face.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.2
**/
@@ -268,16 +303,16 @@ hb_face_set_user_data (hb_face_t *face,
/**
* hb_face_get_user_data: (skip)
* @face: a face.
- * @key:
+ * @key:
+ *
*
- *
*
* Return value: (transfer none):
*
* Since: 0.9.2
**/
void *
-hb_face_get_user_data (hb_face_t *face,
+hb_face_get_user_data (const hb_face_t *face,
hb_user_data_key_t *key)
{
return hb_object_get_user_data (face, key);
@@ -287,51 +322,54 @@ hb_face_get_user_data (hb_face_t *face,
* hb_face_make_immutable:
* @face: a face.
*
- *
+ *
*
* Since: 0.9.2
**/
void
hb_face_make_immutable (hb_face_t *face)
{
- if (unlikely (hb_object_is_inert (face)))
+ if (hb_object_is_immutable (face))
return;
- face->immutable = true;
+ hb_object_make_immutable (face);
}
/**
* hb_face_is_immutable:
* @face: a face.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
hb_bool_t
-hb_face_is_immutable (hb_face_t *face)
+hb_face_is_immutable (const hb_face_t *face)
{
- return face->immutable;
+ return hb_object_is_immutable (face);
}
/**
* hb_face_reference_table:
* @face: a face.
- * @tag:
+ * @tag:
+ *
*
- *
*
* Return value: (transfer full):
*
* Since: 0.9.2
**/
hb_blob_t *
-hb_face_reference_table (hb_face_t *face,
- hb_tag_t tag)
+hb_face_reference_table (const hb_face_t *face,
+ hb_tag_t tag)
{
+ if (unlikely (tag == HB_TAG_NONE))
+ return hb_blob_get_empty ();
+
return face->reference_table (tag);
}
@@ -339,7 +377,7 @@ hb_face_reference_table (hb_face_t *face,
* hb_face_reference_blob:
* @face: a face.
*
- *
+ *
*
* Return value: (transfer full):
*
@@ -354,9 +392,9 @@ hb_face_reference_blob (hb_face_t *face)
/**
* hb_face_set_index:
* @face: a face.
- * @index:
+ * @index:
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -364,7 +402,7 @@ void
hb_face_set_index (hb_face_t *face,
unsigned int index)
{
- if (face->immutable)
+ if (hb_object_is_immutable (face))
return;
face->index = index;
@@ -374,14 +412,14 @@ hb_face_set_index (hb_face_t *face,
* hb_face_get_index:
* @face: a face.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
unsigned int
-hb_face_get_index (hb_face_t *face)
+hb_face_get_index (const hb_face_t *face)
{
return face->index;
}
@@ -389,9 +427,9 @@ hb_face_get_index (hb_face_t *face)
/**
* hb_face_set_upem:
* @face: a face.
- * @upem:
+ * @upem:
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -399,43 +437,34 @@ void
hb_face_set_upem (hb_face_t *face,
unsigned int upem)
{
- if (face->immutable)
+ if (hb_object_is_immutable (face))
return;
- face->upem = upem;
+ face->upem.set_relaxed (upem);
}
/**
* hb_face_get_upem:
* @face: a face.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
unsigned int
-hb_face_get_upem (hb_face_t *face)
+hb_face_get_upem (const hb_face_t *face)
{
return face->get_upem ();
}
-void
-hb_face_t::load_upem (void) const
-{
- hb_blob_t *head_blob = OT::Sanitizer<OT::head>::sanitize (reference_table (HB_OT_TAG_head));
- const OT::head *head_table = OT::Sanitizer<OT::head>::lock_instance (head_blob);
- upem = head_table->get_upem ();
- hb_blob_destroy (head_blob);
-}
-
/**
* hb_face_set_glyph_count:
* @face: a face.
- * @glyph_count:
+ * @glyph_count:
+ *
*
- *
*
* Since: 0.9.7
**/
@@ -443,40 +472,34 @@ void
hb_face_set_glyph_count (hb_face_t *face,
unsigned int glyph_count)
{
- if (face->immutable)
+ if (hb_object_is_immutable (face))
return;
- face->num_glyphs = glyph_count;
+ face->num_glyphs.set_relaxed (glyph_count);
}
/**
* hb_face_get_glyph_count:
* @face: a face.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.7
**/
unsigned int
-hb_face_get_glyph_count (hb_face_t *face)
+hb_face_get_glyph_count (const hb_face_t *face)
{
return face->get_num_glyphs ();
}
-void
-hb_face_t::load_num_glyphs (void) const
-{
- hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>::sanitize (reference_table (HB_OT_TAG_maxp));
- const OT::maxp *maxp_table = OT::Sanitizer<OT::maxp>::lock_instance (maxp_blob);
- num_glyphs = maxp_table->get_num_glyphs ();
- hb_blob_destroy (maxp_blob);
-}
-
/**
* hb_face_get_table_tags:
* @face: a face.
+ * @start_offset: index of first tag to return.
+ * @table_count: input length of @table_tags array, output number of items written.
+ * @table_tags: array to write tags into.
*
* Retrieves table tags for a face, if possible.
*
@@ -485,12 +508,12 @@ hb_face_t::load_num_glyphs (void) const
* Since: 1.6.0
**/
unsigned int
-hb_face_get_table_tags (hb_face_t *face,
+hb_face_get_table_tags (const hb_face_t *face,
unsigned int start_offset,
unsigned int *table_count, /* IN/OUT */
hb_tag_t *table_tags /* OUT */)
{
- if (face->destroy != _hb_face_for_data_closure_destroy)
+ if (face->destroy != (hb_destroy_func_t) _hb_face_for_data_closure_destroy)
{
if (table_count)
*table_count = 0;
@@ -499,8 +522,204 @@ hb_face_get_table_tags (hb_face_t *face,
hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) face->user_data;
- const OT::OpenTypeFontFile &ot_file = *OT::Sanitizer<OT::OpenTypeFontFile>::lock_instance (data->blob);
+ const OT::OpenTypeFontFile &ot_file = *data->blob->as<OT::OpenTypeFontFile> ();
const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index);
return ot_face.get_table_tags (start_offset, table_count, table_tags);
}
+
+
+/*
+ * Character set.
+ */
+
+
+#ifndef HB_NO_FACE_COLLECT_UNICODES
+/**
+ * hb_face_collect_unicodes:
+ * @face: font face.
+ * @out: set to add Unicode characters covered by @face to.
+ *
+ * Since: 1.9.0
+ */
+void
+hb_face_collect_unicodes (hb_face_t *face,
+ hb_set_t *out)
+{
+ face->table.cmap->collect_unicodes (out);
+}
+/**
+ * hb_face_collect_variation_selectors:
+ * @face: font face.
+ * @out: set to add Variation Selector characters covered by @face to.
+ *
+ *
+ *
+ * Since: 1.9.0
+ */
+void
+hb_face_collect_variation_selectors (hb_face_t *face,
+ hb_set_t *out)
+{
+ face->table.cmap->collect_variation_selectors (out);
+}
+/**
+ * hb_face_collect_variation_unicodes:
+ * @face: font face.
+ * @out: set to add Unicode characters for @variation_selector covered by @face to.
+ *
+ *
+ *
+ * Since: 1.9.0
+ */
+void
+hb_face_collect_variation_unicodes (hb_face_t *face,
+ hb_codepoint_t variation_selector,
+ hb_set_t *out)
+{
+ face->table.cmap->collect_variation_unicodes (variation_selector, out);
+}
+#endif
+
+
+/*
+ * face-builder: A face that has add_table().
+ */
+
+struct hb_face_builder_data_t
+{
+ struct table_entry_t
+ {
+ int cmp (hb_tag_t t) const
+ {
+ if (t < tag) return -1;
+ if (t > tag) return -1;
+ return 0;
+ }
+
+ hb_tag_t tag;
+ hb_blob_t *blob;
+ };
+
+ hb_vector_t<table_entry_t> tables;
+};
+
+static hb_face_builder_data_t *
+_hb_face_builder_data_create ()
+{
+ hb_face_builder_data_t *data = (hb_face_builder_data_t *) calloc (1, sizeof (hb_face_builder_data_t));
+ if (unlikely (!data))
+ return nullptr;
+
+ data->tables.init ();
+
+ return data;
+}
+
+static void
+_hb_face_builder_data_destroy (void *user_data)
+{
+ hb_face_builder_data_t *data = (hb_face_builder_data_t *) user_data;
+
+ for (unsigned int i = 0; i < data->tables.length; i++)
+ hb_blob_destroy (data->tables[i].blob);
+
+ data->tables.fini ();
+
+ free (data);
+}
+
+static hb_blob_t *
+_hb_face_builder_data_reference_blob (hb_face_builder_data_t *data)
+{
+
+ unsigned int table_count = data->tables.length;
+ unsigned int face_length = table_count * 16 + 12;
+
+ for (unsigned int i = 0; i < table_count; i++)
+ face_length += hb_ceil_to_4 (hb_blob_get_length (data->tables[i].blob));
+
+ char *buf = (char *) malloc (face_length);
+ if (unlikely (!buf))
+ return nullptr;
+
+ hb_serialize_context_t c (buf, face_length);
+ c.propagate_error (data->tables);
+ OT::OpenTypeFontFile *f = c.start_serialize<OT::OpenTypeFontFile> ();
+
+ bool is_cff = data->tables.lsearch (HB_TAG ('C','F','F',' ')) || data->tables.lsearch (HB_TAG ('C','F','F','2'));
+ hb_tag_t sfnt_tag = is_cff ? OT::OpenTypeFontFile::CFFTag : OT::OpenTypeFontFile::TrueTypeTag;
+
+ bool ret = f->serialize_single (&c, sfnt_tag, data->tables.as_array ());
+
+ c.end_serialize ();
+
+ if (unlikely (!ret))
+ {
+ free (buf);
+ return nullptr;
+ }
+
+ return hb_blob_create (buf, face_length, HB_MEMORY_MODE_WRITABLE, buf, free);
+}
+
+static hb_blob_t *
+_hb_face_builder_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
+{
+ hb_face_builder_data_t *data = (hb_face_builder_data_t *) user_data;
+
+ if (!tag)
+ return _hb_face_builder_data_reference_blob (data);
+
+ hb_face_builder_data_t::table_entry_t *entry = data->tables.lsearch (tag);
+ if (entry)
+ return hb_blob_reference (entry->blob);
+
+ return nullptr;
+}
+
+
+/**
+ * hb_face_builder_create:
+ *
+ * Creates a #hb_face_t that can be used with hb_face_builder_add_table().
+ * After tables are added to the face, it can be compiled to a binary
+ * font file by calling hb_face_reference_blob().
+ *
+ * Return value: (transfer full): New face.
+ *
+ * Since: 1.9.0
+ **/
+hb_face_t *
+hb_face_builder_create ()
+{
+ hb_face_builder_data_t *data = _hb_face_builder_data_create ();
+ if (unlikely (!data)) return hb_face_get_empty ();
+
+ return hb_face_create_for_tables (_hb_face_builder_reference_table,
+ data,
+ _hb_face_builder_data_destroy);
+}
+
+/**
+ * hb_face_builder_add_table:
+ *
+ * Add table for @tag with data provided by @blob to the face. @face must
+ * be created using hb_face_builder_create().
+ *
+ * Since: 1.9.0
+ **/
+hb_bool_t
+hb_face_builder_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob)
+{
+ if (unlikely (face->destroy != (hb_destroy_func_t) _hb_face_builder_data_destroy))
+ return false;
+
+ hb_face_builder_data_t *data = (hb_face_builder_data_t *) face->user_data;
+ hb_face_builder_data_t::table_entry_t *entry = data->tables.push ();
+
+ entry->tag = tag;
+ entry->blob = hb_blob_reference (blob);
+
+ return true;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-face.h b/src/3rdparty/harfbuzz-ng/src/hb-face.h
index 9842d52b65..e8ff090d55 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-face.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-face.h
@@ -33,10 +33,15 @@
#include "hb-common.h"
#include "hb-blob.h"
+#include "hb-set.h"
HB_BEGIN_DECLS
+HB_EXTERN unsigned int
+hb_face_count (hb_blob_t *blob);
+
+
/*
* hb_face_t
*/
@@ -71,21 +76,20 @@ hb_face_set_user_data (hb_face_t *face,
hb_destroy_func_t destroy,
hb_bool_t replace);
-
HB_EXTERN void *
-hb_face_get_user_data (hb_face_t *face,
+hb_face_get_user_data (const hb_face_t *face,
hb_user_data_key_t *key);
HB_EXTERN void
hb_face_make_immutable (hb_face_t *face);
HB_EXTERN hb_bool_t
-hb_face_is_immutable (hb_face_t *face);
+hb_face_is_immutable (const hb_face_t *face);
HB_EXTERN hb_blob_t *
-hb_face_reference_table (hb_face_t *face,
- hb_tag_t tag);
+hb_face_reference_table (const hb_face_t *face,
+ hb_tag_t tag);
HB_EXTERN hb_blob_t *
hb_face_reference_blob (hb_face_t *face);
@@ -95,28 +99,60 @@ hb_face_set_index (hb_face_t *face,
unsigned int index);
HB_EXTERN unsigned int
-hb_face_get_index (hb_face_t *face);
+hb_face_get_index (const hb_face_t *face);
HB_EXTERN void
hb_face_set_upem (hb_face_t *face,
unsigned int upem);
HB_EXTERN unsigned int
-hb_face_get_upem (hb_face_t *face);
+hb_face_get_upem (const hb_face_t *face);
HB_EXTERN void
hb_face_set_glyph_count (hb_face_t *face,
unsigned int glyph_count);
HB_EXTERN unsigned int
-hb_face_get_glyph_count (hb_face_t *face);
+hb_face_get_glyph_count (const hb_face_t *face);
HB_EXTERN unsigned int
-hb_face_get_table_tags (hb_face_t *face,
+hb_face_get_table_tags (const hb_face_t *face,
unsigned int start_offset,
unsigned int *table_count, /* IN/OUT */
hb_tag_t *table_tags /* OUT */);
+
+/*
+ * Character set.
+ */
+
+HB_EXTERN void
+hb_face_collect_unicodes (hb_face_t *face,
+ hb_set_t *out);
+
+HB_EXTERN void
+hb_face_collect_variation_selectors (hb_face_t *face,
+ hb_set_t *out);
+
+HB_EXTERN void
+hb_face_collect_variation_unicodes (hb_face_t *face,
+ hb_codepoint_t variation_selector,
+ hb_set_t *out);
+
+
+/*
+ * Builder face.
+ */
+
+HB_EXTERN hb_face_t *
+hb_face_builder_create (void);
+
+HB_EXTERN hb_bool_t
+hb_face_builder_add_table (hb_face_t *face,
+ hb_tag_t tag,
+ hb_blob_t *blob);
+
+
HB_END_DECLS
#endif /* HB_FACE_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-face.hh b/src/3rdparty/harfbuzz-ng/src/hb-face.hh
new file mode 100644
index 0000000000..68834baeb8
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-face.hh
@@ -0,0 +1,109 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_FACE_HH
+#define HB_FACE_HH
+
+#include "hb.hh"
+
+#include "hb-shaper.hh"
+#include "hb-shape-plan.hh"
+#include "hb-ot-face.hh"
+
+
+/*
+ * hb_face_t
+ */
+
+#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INSTANTIATE_SHAPERS(shaper, face);
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+
+struct hb_face_t
+{
+ hb_object_header_t header;
+
+ hb_reference_table_func_t reference_table_func;
+ void *user_data;
+ hb_destroy_func_t destroy;
+
+ unsigned int index; /* Face index in a collection, zero-based. */
+ mutable hb_atomic_int_t upem; /* Units-per-EM. */
+ mutable hb_atomic_int_t num_glyphs; /* Number of glyphs. */
+
+ hb_shaper_object_dataset_t<hb_face_t> data;/* Various shaper data. */
+ hb_ot_face_t table; /* All the face's tables. */
+
+ /* Cache */
+ struct plan_node_t
+ {
+ hb_shape_plan_t *shape_plan;
+ plan_node_t *next;
+ };
+ hb_atomic_ptr_t<plan_node_t> shape_plans;
+
+ hb_blob_t *reference_table (hb_tag_t tag) const
+ {
+ hb_blob_t *blob;
+
+ if (unlikely (!reference_table_func))
+ return hb_blob_get_empty ();
+
+ blob = reference_table_func (/*XXX*/const_cast<hb_face_t *> (this), tag, user_data);
+ if (unlikely (!blob))
+ return hb_blob_get_empty ();
+
+ return blob;
+ }
+
+ HB_PURE_FUNC unsigned int get_upem () const
+ {
+ unsigned int ret = upem.get_relaxed ();
+ if (unlikely (!ret))
+ {
+ return load_upem ();
+ }
+ return ret;
+ }
+
+ unsigned int get_num_glyphs () const
+ {
+ unsigned int ret = num_glyphs.get_relaxed ();
+ if (unlikely (ret == (unsigned int) -1))
+ return load_num_glyphs ();
+ return ret;
+ }
+
+ private:
+ HB_INTERNAL unsigned int load_upem () const;
+ HB_INTERNAL unsigned int load_num_glyphs () const;
+};
+DECLARE_NULL_INSTANCE (hb_face_t);
+
+
+#endif /* HB_FACE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-fallback-shape.cc b/src/3rdparty/harfbuzz-ng/src/hb-fallback-shape.cc
index 3f09c3f530..c5b7c2c230 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-fallback-shape.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-fallback-shape.cc
@@ -24,28 +24,24 @@
* Google Author(s): Behdad Esfahbod
*/
-#define HB_SHAPER fallback
-#include "hb-shaper-impl-private.hh"
-
-
-HB_SHAPER_DATA_ENSURE_DEFINE(fallback, face)
-HB_SHAPER_DATA_ENSURE_DEFINE(fallback, font)
+#include "hb-shaper-impl.hh"
+#ifndef HB_NO_FALLBACK_SHAPE
/*
* shaper face data
*/
-struct hb_fallback_shaper_face_data_t {};
+struct hb_fallback_face_data_t {};
-hb_fallback_shaper_face_data_t *
+hb_fallback_face_data_t *
_hb_fallback_shaper_face_data_create (hb_face_t *face HB_UNUSED)
{
- return (hb_fallback_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
+ return (hb_fallback_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
-_hb_fallback_shaper_face_data_destroy (hb_fallback_shaper_face_data_t *data HB_UNUSED)
+_hb_fallback_shaper_face_data_destroy (hb_fallback_face_data_t *data HB_UNUSED)
{
}
@@ -54,38 +50,16 @@ _hb_fallback_shaper_face_data_destroy (hb_fallback_shaper_face_data_t *data HB_U
* shaper font data
*/
-struct hb_fallback_shaper_font_data_t {};
+struct hb_fallback_font_data_t {};
-hb_fallback_shaper_font_data_t *
+hb_fallback_font_data_t *
_hb_fallback_shaper_font_data_create (hb_font_t *font HB_UNUSED)
{
- return (hb_fallback_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
+ return (hb_fallback_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
-_hb_fallback_shaper_font_data_destroy (hb_fallback_shaper_font_data_t *data HB_UNUSED)
-{
-}
-
-
-/*
- * shaper shape_plan data
- */
-
-struct hb_fallback_shaper_shape_plan_data_t {};
-
-hb_fallback_shaper_shape_plan_data_t *
-_hb_fallback_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED,
- const hb_feature_t *user_features HB_UNUSED,
- unsigned int num_user_features HB_UNUSED,
- const int *coords HB_UNUSED,
- unsigned int num_coords HB_UNUSED)
-{
- return (hb_fallback_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
-}
-
-void
-_hb_fallback_shaper_shape_plan_data_destroy (hb_fallback_shaper_shape_plan_data_t *data HB_UNUSED)
+_hb_fallback_shaper_font_data_destroy (hb_fallback_font_data_t *data HB_UNUSED)
{
}
@@ -147,3 +121,5 @@ _hb_fallback_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
return true;
}
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-font-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-font-private.hh
deleted file mode 100644
index d2801fb86e..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-font-private.hh
+++ /dev/null
@@ -1,555 +0,0 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- * Copyright © 2011 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_FONT_PRIVATE_HH
-#define HB_FONT_PRIVATE_HH
-
-#include "hb-private.hh"
-
-#include "hb-object-private.hh"
-#include "hb-face-private.hh"
-#include "hb-shaper-private.hh"
-
-
-
-/*
- * hb_font_funcs_t
- */
-
-#define HB_FONT_FUNCS_IMPLEMENT_CALLBACKS \
- HB_FONT_FUNC_IMPLEMENT (font_h_extents) \
- HB_FONT_FUNC_IMPLEMENT (font_v_extents) \
- HB_FONT_FUNC_IMPLEMENT (nominal_glyph) \
- HB_FONT_FUNC_IMPLEMENT (variation_glyph) \
- HB_FONT_FUNC_IMPLEMENT (glyph_h_advance) \
- HB_FONT_FUNC_IMPLEMENT (glyph_v_advance) \
- HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \
- HB_FONT_FUNC_IMPLEMENT (glyph_v_origin) \
- HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning) \
- HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning) \
- HB_FONT_FUNC_IMPLEMENT (glyph_extents) \
- HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \
- HB_FONT_FUNC_IMPLEMENT (glyph_name) \
- HB_FONT_FUNC_IMPLEMENT (glyph_from_name) \
- /* ^--- Add new callbacks here */
-
-struct hb_font_funcs_t {
- hb_object_header_t header;
- ASSERT_POD ();
-
- hb_bool_t immutable;
-
- struct {
-#define HB_FONT_FUNC_IMPLEMENT(name) void *name;
- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
- } user_data;
-
- struct {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_destroy_func_t name;
- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
- } destroy;
-
- /* Don't access these directly. Call font->get_*() instead. */
- union get_t {
- struct get_funcs_t {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
- } f;
- void (*array[VAR]) (void);
- } get;
-};
-
-
-
-/*
- * hb_font_t
- */
-
-struct hb_font_t {
- hb_object_header_t header;
- ASSERT_POD ();
-
- hb_bool_t immutable;
-
- hb_font_t *parent;
- hb_face_t *face;
-
- int x_scale;
- int y_scale;
-
- unsigned int x_ppem;
- unsigned int y_ppem;
-
- float ptem;
-
- /* Font variation coordinates. */
- unsigned int num_coords;
- int *coords;
-
- hb_font_funcs_t *klass;
- void *user_data;
- hb_destroy_func_t destroy;
-
- struct hb_shaper_data_t shaper_data;
-
-
- /* Convert from font-space to user-space */
- inline int dir_scale (hb_direction_t direction)
- { return HB_DIRECTION_IS_VERTICAL(direction) ? y_scale : x_scale; }
- inline hb_position_t em_scale_x (int16_t v) { return em_scale (v, x_scale); }
- inline hb_position_t em_scale_y (int16_t v) { return em_scale (v, y_scale); }
- inline hb_position_t em_scalef_x (float v) { return em_scalef (v, this->x_scale); }
- inline hb_position_t em_scalef_y (float v) { return em_scalef (v, this->y_scale); }
- inline hb_position_t em_scale_dir (int16_t v, hb_direction_t direction)
- { return em_scale (v, dir_scale (direction)); }
-
- /* Convert from parent-font user-space to our user-space */
- inline hb_position_t parent_scale_x_distance (hb_position_t v) {
- if (unlikely (parent && parent->x_scale != x_scale))
- return (hb_position_t) (v * (int64_t) this->x_scale / this->parent->x_scale);
- return v;
- }
- inline hb_position_t parent_scale_y_distance (hb_position_t v) {
- if (unlikely (parent && parent->y_scale != y_scale))
- return (hb_position_t) (v * (int64_t) this->y_scale / this->parent->y_scale);
- return v;
- }
- inline hb_position_t parent_scale_x_position (hb_position_t v) {
- return parent_scale_x_distance (v);
- }
- inline hb_position_t parent_scale_y_position (hb_position_t v) {
- return parent_scale_y_distance (v);
- }
-
- inline void parent_scale_distance (hb_position_t *x, hb_position_t *y) {
- *x = parent_scale_x_distance (*x);
- *y = parent_scale_y_distance (*y);
- }
- inline void parent_scale_position (hb_position_t *x, hb_position_t *y) {
- *x = parent_scale_x_position (*x);
- *y = parent_scale_y_position (*y);
- }
-
-
- /* Public getters */
-
- HB_INTERNAL bool has_func (unsigned int i);
-
- /* has_* ... */
-#define HB_FONT_FUNC_IMPLEMENT(name) \
- bool \
- has_##name##_func (void) \
- { \
- hb_font_funcs_t *funcs = this->klass; \
- unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
- return has_func (i); \
- }
- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
-
- inline hb_bool_t get_font_h_extents (hb_font_extents_t *extents)
- {
- memset (extents, 0, sizeof (*extents));
- return klass->get.f.font_h_extents (this, user_data,
- extents,
- klass->user_data.font_h_extents);
- }
- inline hb_bool_t get_font_v_extents (hb_font_extents_t *extents)
- {
- memset (extents, 0, sizeof (*extents));
- return klass->get.f.font_v_extents (this, user_data,
- extents,
- klass->user_data.font_v_extents);
- }
-
- inline bool has_glyph (hb_codepoint_t unicode)
- {
- hb_codepoint_t glyph;
- return get_nominal_glyph (unicode, &glyph);
- }
-
- inline hb_bool_t get_nominal_glyph (hb_codepoint_t unicode,
- hb_codepoint_t *glyph)
- {
- *glyph = 0;
- return klass->get.f.nominal_glyph (this, user_data,
- unicode, glyph,
- klass->user_data.nominal_glyph);
- }
-
- inline hb_bool_t get_variation_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph)
- {
- *glyph = 0;
- return klass->get.f.variation_glyph (this, user_data,
- unicode, variation_selector, glyph,
- klass->user_data.variation_glyph);
- }
-
- inline hb_position_t get_glyph_h_advance (hb_codepoint_t glyph)
- {
- return klass->get.f.glyph_h_advance (this, user_data,
- glyph,
- klass->user_data.glyph_h_advance);
- }
-
- inline hb_position_t get_glyph_v_advance (hb_codepoint_t glyph)
- {
- return klass->get.f.glyph_v_advance (this, user_data,
- glyph,
- klass->user_data.glyph_v_advance);
- }
-
- inline hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph,
- hb_position_t *x, hb_position_t *y)
- {
- *x = *y = 0;
- return klass->get.f.glyph_h_origin (this, user_data,
- glyph, x, y,
- klass->user_data.glyph_h_origin);
- }
-
- inline hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph,
- hb_position_t *x, hb_position_t *y)
- {
- *x = *y = 0;
- return klass->get.f.glyph_v_origin (this, user_data,
- glyph, x, y,
- klass->user_data.glyph_v_origin);
- }
-
- inline hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph)
- {
- return klass->get.f.glyph_h_kerning (this, user_data,
- left_glyph, right_glyph,
- klass->user_data.glyph_h_kerning);
- }
-
- inline hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph)
- {
- return klass->get.f.glyph_v_kerning (this, user_data,
- top_glyph, bottom_glyph,
- klass->user_data.glyph_v_kerning);
- }
-
- inline hb_bool_t get_glyph_extents (hb_codepoint_t glyph,
- hb_glyph_extents_t *extents)
- {
- memset (extents, 0, sizeof (*extents));
- return klass->get.f.glyph_extents (this, user_data,
- glyph,
- extents,
- klass->user_data.glyph_extents);
- }
-
- inline hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index,
- hb_position_t *x, hb_position_t *y)
- {
- *x = *y = 0;
- return klass->get.f.glyph_contour_point (this, user_data,
- glyph, point_index,
- x, y,
- klass->user_data.glyph_contour_point);
- }
-
- inline hb_bool_t get_glyph_name (hb_codepoint_t glyph,
- char *name, unsigned int size)
- {
- if (size) *name = '\0';
- return klass->get.f.glyph_name (this, user_data,
- glyph,
- name, size,
- klass->user_data.glyph_name);
- }
-
- inline hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */
- hb_codepoint_t *glyph)
- {
- *glyph = 0;
- if (len == -1) len = strlen (name);
- return klass->get.f.glyph_from_name (this, user_data,
- name, len,
- glyph,
- klass->user_data.glyph_from_name);
- }
-
-
- /* A bit higher-level, and with fallback */
-
- inline void get_h_extents_with_fallback (hb_font_extents_t *extents)
- {
- if (!get_font_h_extents (extents))
- {
- extents->ascender = y_scale * .8;
- extents->descender = extents->ascender - y_scale;
- extents->line_gap = 0;
- }
- }
- inline void get_v_extents_with_fallback (hb_font_extents_t *extents)
- {
- if (!get_font_v_extents (extents))
- {
- extents->ascender = x_scale / 2;
- extents->descender = extents->ascender - x_scale;
- extents->line_gap = 0;
- }
- }
-
- inline void get_extents_for_direction (hb_direction_t direction,
- hb_font_extents_t *extents)
- {
- if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
- get_h_extents_with_fallback (extents);
- else
- get_v_extents_with_fallback (extents);
- }
-
- inline void get_glyph_advance_for_direction (hb_codepoint_t glyph,
- hb_direction_t direction,
- hb_position_t *x, hb_position_t *y)
- {
- if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) {
- *x = get_glyph_h_advance (glyph);
- *y = 0;
- } else {
- *x = 0;
- *y = get_glyph_v_advance (glyph);
- }
- }
-
- inline void guess_v_origin_minus_h_origin (hb_codepoint_t glyph,
- hb_position_t *x, hb_position_t *y)
- {
- *x = get_glyph_h_advance (glyph) / 2;
-
- /* TODO cache this somehow?! */
- hb_font_extents_t extents;
- get_h_extents_with_fallback (&extents);
- *y = extents.ascender;
- }
-
- inline void get_glyph_h_origin_with_fallback (hb_codepoint_t glyph,
- hb_position_t *x, hb_position_t *y)
- {
- if (!get_glyph_h_origin (glyph, x, y) &&
- get_glyph_v_origin (glyph, x, y))
- {
- hb_position_t dx, dy;
- guess_v_origin_minus_h_origin (glyph, &dx, &dy);
- *x -= dx; *y -= dy;
- }
- }
- inline void get_glyph_v_origin_with_fallback (hb_codepoint_t glyph,
- hb_position_t *x, hb_position_t *y)
- {
- if (!get_glyph_v_origin (glyph, x, y) &&
- get_glyph_h_origin (glyph, x, y))
- {
- hb_position_t dx, dy;
- guess_v_origin_minus_h_origin (glyph, &dx, &dy);
- *x += dx; *y += dy;
- }
- }
-
- inline void get_glyph_origin_for_direction (hb_codepoint_t glyph,
- hb_direction_t direction,
- hb_position_t *x, hb_position_t *y)
- {
- if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
- get_glyph_h_origin_with_fallback (glyph, x, y);
- else
- get_glyph_v_origin_with_fallback (glyph, x, y);
- }
-
- inline void add_glyph_h_origin (hb_codepoint_t glyph,
- hb_position_t *x, hb_position_t *y)
- {
- hb_position_t origin_x, origin_y;
-
- get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y);
-
- *x += origin_x;
- *y += origin_y;
- }
- inline void add_glyph_v_origin (hb_codepoint_t glyph,
- hb_position_t *x, hb_position_t *y)
- {
- hb_position_t origin_x, origin_y;
-
- get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y);
-
- *x += origin_x;
- *y += origin_y;
- }
- inline void add_glyph_origin_for_direction (hb_codepoint_t glyph,
- hb_direction_t direction,
- hb_position_t *x, hb_position_t *y)
- {
- hb_position_t origin_x, origin_y;
-
- get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y);
-
- *x += origin_x;
- *y += origin_y;
- }
-
- inline void subtract_glyph_h_origin (hb_codepoint_t glyph,
- hb_position_t *x, hb_position_t *y)
- {
- hb_position_t origin_x, origin_y;
-
- get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y);
-
- *x -= origin_x;
- *y -= origin_y;
- }
- inline void subtract_glyph_v_origin (hb_codepoint_t glyph,
- hb_position_t *x, hb_position_t *y)
- {
- hb_position_t origin_x, origin_y;
-
- get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y);
-
- *x -= origin_x;
- *y -= origin_y;
- }
- inline void subtract_glyph_origin_for_direction (hb_codepoint_t glyph,
- hb_direction_t direction,
- hb_position_t *x, hb_position_t *y)
- {
- hb_position_t origin_x, origin_y;
-
- get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y);
-
- *x -= origin_x;
- *y -= origin_y;
- }
-
- inline void get_glyph_kerning_for_direction (hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
- hb_direction_t direction,
- hb_position_t *x, hb_position_t *y)
- {
- if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) {
- *x = get_glyph_h_kerning (first_glyph, second_glyph);
- *y = 0;
- } else {
- *x = 0;
- *y = get_glyph_v_kerning (first_glyph, second_glyph);
- }
- }
-
- inline hb_bool_t get_glyph_extents_for_origin (hb_codepoint_t glyph,
- hb_direction_t direction,
- hb_glyph_extents_t *extents)
- {
- hb_bool_t ret = get_glyph_extents (glyph, extents);
-
- if (ret)
- subtract_glyph_origin_for_direction (glyph, direction, &extents->x_bearing, &extents->y_bearing);
-
- return ret;
- }
-
- inline hb_bool_t get_glyph_contour_point_for_origin (hb_codepoint_t glyph, unsigned int point_index,
- hb_direction_t direction,
- hb_position_t *x, hb_position_t *y)
- {
- hb_bool_t ret = get_glyph_contour_point (glyph, point_index, x, y);
-
- if (ret)
- subtract_glyph_origin_for_direction (glyph, direction, x, y);
-
- return ret;
- }
-
- /* Generates gidDDD if glyph has no name. */
- inline void
- glyph_to_string (hb_codepoint_t glyph,
- char *s, unsigned int size)
- {
- if (get_glyph_name (glyph, s, size)) return;
-
- if (size && snprintf (s, size, "gid%u", glyph) < 0)
- *s = '\0';
- }
-
- /* Parses gidDDD and uniUUUU strings automatically. */
- inline hb_bool_t
- glyph_from_string (const char *s, int len, /* -1 means nul-terminated */
- hb_codepoint_t *glyph)
- {
- if (get_glyph_from_name (s, len, glyph)) return true;
-
- if (len == -1) len = strlen (s);
-
- /* Straight glyph index. */
- if (hb_codepoint_parse (s, len, 10, glyph))
- return true;
-
- if (len > 3)
- {
- /* gidDDD syntax for glyph indices. */
- if (0 == strncmp (s, "gid", 3) &&
- hb_codepoint_parse (s + 3, len - 3, 10, glyph))
- return true;
-
- /* uniUUUU and other Unicode character indices. */
- hb_codepoint_t unichar;
- if (0 == strncmp (s, "uni", 3) &&
- hb_codepoint_parse (s + 3, len - 3, 16, &unichar) &&
- get_nominal_glyph (unichar, glyph))
- return true;
- }
-
- return false;
- }
-
- inline hb_position_t em_scale (int16_t v, int scale)
- {
- int upem = face->get_upem ();
- int64_t scaled = v * (int64_t) scale;
- scaled += scaled >= 0 ? upem/2 : -upem/2; /* Round. */
- return (hb_position_t) (scaled / upem);
- }
- inline hb_position_t em_scalef (float v, int scale)
- {
- return (hb_position_t) (v * scale / face->get_upem ());
- }
-};
-
-#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
-#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, font);
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
-#undef HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
-
-
-#endif /* HB_FONT_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-font.cc b/src/3rdparty/harfbuzz-ng/src/hb-font.cc
index f3534b686b..e89ad697ef 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-font.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-font.cc
@@ -26,9 +26,25 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-private.hh"
+#include "hb.hh"
-#include "hb-font-private.hh"
+#include "hb-font.hh"
+#include "hb-machinery.hh"
+
+#include "hb-ot.h"
+
+
+/**
+ * SECTION:hb-font
+ * @title: hb-font
+ * @short_description: Font objects
+ * @include: hb.h
+ *
+ * Font objects represent a font face at a certain size and other
+ * parameters (pixels per EM, points per EM, variation settings.)
+ * Fonts are created from font faces, and are used as input to
+ * hb_shape() among other things.
+ **/
/*
@@ -38,23 +54,23 @@
static hb_bool_t
hb_font_get_font_h_extents_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- hb_font_extents_t *metrics,
+ hb_font_extents_t *extents,
void *user_data HB_UNUSED)
{
- memset (metrics, 0, sizeof (*metrics));
+ memset (extents, 0, sizeof (*extents));
return false;
}
static hb_bool_t
-hb_font_get_font_h_extents_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_font_extents_t *metrics,
- void *user_data HB_UNUSED)
+hb_font_get_font_h_extents_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_font_extents_t *extents,
+ void *user_data HB_UNUSED)
{
- hb_bool_t ret = font->parent->get_font_h_extents (metrics);
+ hb_bool_t ret = font->parent->get_font_h_extents (extents);
if (ret) {
- metrics->ascender = font->parent_scale_y_distance (metrics->ascender);
- metrics->descender = font->parent_scale_y_distance (metrics->descender);
- metrics->line_gap = font->parent_scale_y_distance (metrics->line_gap);
+ extents->ascender = font->parent_scale_y_distance (extents->ascender);
+ extents->descender = font->parent_scale_y_distance (extents->descender);
+ extents->line_gap = font->parent_scale_y_distance (extents->line_gap);
}
return ret;
}
@@ -62,23 +78,23 @@ hb_font_get_font_h_extents_parent (hb_font_t *font,
static hb_bool_t
hb_font_get_font_v_extents_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- hb_font_extents_t *metrics,
+ hb_font_extents_t *extents,
void *user_data HB_UNUSED)
{
- memset (metrics, 0, sizeof (*metrics));
+ memset (extents, 0, sizeof (*extents));
return false;
}
static hb_bool_t
-hb_font_get_font_v_extents_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_font_extents_t *metrics,
- void *user_data HB_UNUSED)
+hb_font_get_font_v_extents_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_font_extents_t *extents,
+ void *user_data HB_UNUSED)
{
- hb_bool_t ret = font->parent->get_font_v_extents (metrics);
+ hb_bool_t ret = font->parent->get_font_v_extents (extents);
if (ret) {
- metrics->ascender = font->parent_scale_x_distance (metrics->ascender);
- metrics->descender = font->parent_scale_x_distance (metrics->descender);
- metrics->line_gap = font->parent_scale_x_distance (metrics->line_gap);
+ extents->ascender = font->parent_scale_x_distance (extents->ascender);
+ extents->descender = font->parent_scale_x_distance (extents->descender);
+ extents->line_gap = font->parent_scale_x_distance (extents->line_gap);
}
return ret;
}
@@ -86,7 +102,7 @@ hb_font_get_font_v_extents_parent (hb_font_t *font,
static hb_bool_t
hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- hb_codepoint_t unicode,
+ hb_codepoint_t unicode HB_UNUSED,
hb_codepoint_t *glyph,
void *user_data HB_UNUSED)
{
@@ -94,20 +110,53 @@ hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED,
return false;
}
static hb_bool_t
-hb_font_get_nominal_glyph_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t unicode,
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
+hb_font_get_nominal_glyph_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
{
+ if (font->has_nominal_glyphs_func_set ())
+ {
+ return font->get_nominal_glyphs (1, &unicode, 0, glyph, 0);
+ }
return font->parent->get_nominal_glyph (unicode, glyph);
}
+#define hb_font_get_nominal_glyphs_nil hb_font_get_nominal_glyphs_default
+static unsigned int
+hb_font_get_nominal_glyphs_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ unsigned int count,
+ const hb_codepoint_t *first_unicode,
+ unsigned int unicode_stride,
+ hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride,
+ void *user_data HB_UNUSED)
+{
+ if (font->has_nominal_glyph_func_set ())
+ {
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (!font->get_nominal_glyph (*first_unicode, first_glyph))
+ return i;
+
+ first_unicode = &StructAtOffsetUnaligned<hb_codepoint_t> (first_unicode, unicode_stride);
+ first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+ }
+ return count;
+ }
+
+ return font->parent->get_nominal_glyphs (count,
+ first_unicode, unicode_stride,
+ first_glyph, glyph_stride);
+}
+
static hb_bool_t
hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
+ hb_codepoint_t unicode HB_UNUSED,
+ hb_codepoint_t variation_selector HB_UNUSED,
hb_codepoint_t *glyph,
void *user_data HB_UNUSED)
{
@@ -115,56 +164,132 @@ hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED,
return false;
}
static hb_bool_t
-hb_font_get_variation_glyph_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
+hb_font_get_variation_glyph_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
{
return font->parent->get_variation_glyph (unicode, variation_selector, glyph);
}
static hb_position_t
-hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED,
+hb_font_get_glyph_h_advance_nil (hb_font_t *font,
void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
+ hb_codepoint_t glyph HB_UNUSED,
void *user_data HB_UNUSED)
{
return font->x_scale;
}
static hb_position_t
-hb_font_get_glyph_h_advance_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
- void *user_data HB_UNUSED)
+hb_font_get_glyph_h_advance_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ void *user_data HB_UNUSED)
{
+ if (font->has_glyph_h_advances_func_set ())
+ {
+ hb_position_t ret;
+ font->get_glyph_h_advances (1, &glyph, 0, &ret, 0);
+ return ret;
+ }
return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
}
static hb_position_t
-hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED,
+hb_font_get_glyph_v_advance_nil (hb_font_t *font,
void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
+ hb_codepoint_t glyph HB_UNUSED,
void *user_data HB_UNUSED)
{
/* TODO use font_extents.ascender+descender */
return font->y_scale;
}
static hb_position_t
-hb_font_get_glyph_v_advance_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
- void *user_data HB_UNUSED)
+hb_font_get_glyph_v_advance_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ void *user_data HB_UNUSED)
{
+ if (font->has_glyph_v_advances_func_set ())
+ {
+ hb_position_t ret;
+ font->get_glyph_v_advances (1, &glyph, 0, &ret, 0);
+ return ret;
+ }
return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
}
+#define hb_font_get_glyph_h_advances_nil hb_font_get_glyph_h_advances_default
+static void
+hb_font_get_glyph_h_advances_default (hb_font_t* font,
+ void* font_data HB_UNUSED,
+ unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride,
+ hb_position_t *first_advance,
+ unsigned int advance_stride,
+ void *user_data HB_UNUSED)
+{
+ if (font->has_glyph_h_advance_func_set ())
+ {
+ for (unsigned int i = 0; i < count; i++)
+ {
+ *first_advance = font->get_glyph_h_advance (*first_glyph);
+ first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+ first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+ }
+ return;
+ }
+
+ font->parent->get_glyph_h_advances (count,
+ first_glyph, glyph_stride,
+ first_advance, advance_stride);
+ for (unsigned int i = 0; i < count; i++)
+ {
+ *first_advance = font->parent_scale_x_distance (*first_advance);
+ first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+ }
+}
+
+#define hb_font_get_glyph_v_advances_nil hb_font_get_glyph_v_advances_default
+static void
+hb_font_get_glyph_v_advances_default (hb_font_t* font,
+ void* font_data HB_UNUSED,
+ unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride,
+ hb_position_t *first_advance,
+ unsigned int advance_stride,
+ void *user_data HB_UNUSED)
+{
+ if (font->has_glyph_v_advance_func_set ())
+ {
+ for (unsigned int i = 0; i < count; i++)
+ {
+ *first_advance = font->get_glyph_v_advance (*first_glyph);
+ first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+ first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+ }
+ return;
+ }
+
+ font->parent->get_glyph_v_advances (count,
+ first_glyph, glyph_stride,
+ first_advance, advance_stride);
+ for (unsigned int i = 0; i < count; i++)
+ {
+ *first_advance = font->parent_scale_y_distance (*first_advance);
+ first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+ }
+}
+
static hb_bool_t
hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
+ hb_codepoint_t glyph HB_UNUSED,
hb_position_t *x,
hb_position_t *y,
void *user_data HB_UNUSED)
@@ -173,12 +298,12 @@ hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
return true;
}
static hb_bool_t
-hb_font_get_glyph_h_origin_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
- hb_position_t *x,
- hb_position_t *y,
- void *user_data HB_UNUSED)
+hb_font_get_glyph_h_origin_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
{
hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
if (ret)
@@ -189,7 +314,7 @@ hb_font_get_glyph_h_origin_parent (hb_font_t *font,
static hb_bool_t
hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
+ hb_codepoint_t glyph HB_UNUSED,
hb_position_t *x,
hb_position_t *y,
void *user_data HB_UNUSED)
@@ -198,12 +323,12 @@ hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
return false;
}
static hb_bool_t
-hb_font_get_glyph_v_origin_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
- hb_position_t *x,
- hb_position_t *y,
- void *user_data HB_UNUSED)
+hb_font_get_glyph_v_origin_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
{
hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
if (ret)
@@ -214,45 +339,47 @@ hb_font_get_glyph_v_origin_parent (hb_font_t *font,
static hb_position_t
hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- hb_codepoint_t left_glyph,
- hb_codepoint_t right_glyph,
+ hb_codepoint_t left_glyph HB_UNUSED,
+ hb_codepoint_t right_glyph HB_UNUSED,
void *user_data HB_UNUSED)
{
return 0;
}
static hb_position_t
-hb_font_get_glyph_h_kerning_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t left_glyph,
- hb_codepoint_t right_glyph,
- void *user_data HB_UNUSED)
+hb_font_get_glyph_h_kerning_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t left_glyph,
+ hb_codepoint_t right_glyph,
+ void *user_data HB_UNUSED)
{
return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
}
+#ifndef HB_DISABLE_DEPRECATED
static hb_position_t
hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- hb_codepoint_t top_glyph,
- hb_codepoint_t bottom_glyph,
+ hb_codepoint_t top_glyph HB_UNUSED,
+ hb_codepoint_t bottom_glyph HB_UNUSED,
void *user_data HB_UNUSED)
{
return 0;
}
static hb_position_t
-hb_font_get_glyph_v_kerning_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t top_glyph,
- hb_codepoint_t bottom_glyph,
- void *user_data HB_UNUSED)
+hb_font_get_glyph_v_kerning_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t top_glyph,
+ hb_codepoint_t bottom_glyph,
+ void *user_data HB_UNUSED)
{
return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
}
+#endif
static hb_bool_t
hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
+ hb_codepoint_t glyph HB_UNUSED,
hb_glyph_extents_t *extents,
void *user_data HB_UNUSED)
{
@@ -260,11 +387,11 @@ hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
return false;
}
static hb_bool_t
-hb_font_get_glyph_extents_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
- hb_glyph_extents_t *extents,
- void *user_data HB_UNUSED)
+hb_font_get_glyph_extents_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ hb_glyph_extents_t *extents,
+ void *user_data HB_UNUSED)
{
hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
if (ret) {
@@ -277,8 +404,8 @@ hb_font_get_glyph_extents_parent (hb_font_t *font,
static hb_bool_t
hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
- unsigned int point_index,
+ hb_codepoint_t glyph HB_UNUSED,
+ unsigned int point_index HB_UNUSED,
hb_position_t *x,
hb_position_t *y,
void *user_data HB_UNUSED)
@@ -287,13 +414,13 @@ hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
return false;
}
static hb_bool_t
-hb_font_get_glyph_contour_point_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
- unsigned int point_index,
- hb_position_t *x,
- hb_position_t *y,
- void *user_data HB_UNUSED)
+hb_font_get_glyph_contour_point_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ unsigned int point_index,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
{
hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
if (ret)
@@ -304,7 +431,7 @@ hb_font_get_glyph_contour_point_parent (hb_font_t *font,
static hb_bool_t
hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
+ hb_codepoint_t glyph HB_UNUSED,
char *name, unsigned int size,
void *user_data HB_UNUSED)
{
@@ -312,11 +439,11 @@ hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED,
return false;
}
static hb_bool_t
-hb_font_get_glyph_name_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
- char *name, unsigned int size,
- void *user_data HB_UNUSED)
+hb_font_get_glyph_name_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ char *name, unsigned int size,
+ void *user_data HB_UNUSED)
{
return font->parent->get_glyph_name (glyph, name, size);
}
@@ -324,7 +451,8 @@ hb_font_get_glyph_name_parent (hb_font_t *font,
static hb_bool_t
hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
- const char *name, int len, /* -1 means nul-terminated */
+ const char *name HB_UNUSED,
+ int len HB_UNUSED, /* -1 means nul-terminated */
hb_codepoint_t *glyph,
void *user_data HB_UNUSED)
{
@@ -332,20 +460,19 @@ hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED,
return false;
}
static hb_bool_t
-hb_font_get_glyph_from_name_parent (hb_font_t *font,
- void *font_data HB_UNUSED,
- const char *name, int len, /* -1 means nul-terminated */
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
+hb_font_get_glyph_from_name_default (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ const char *name, int len, /* -1 means nul-terminated */
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
{
return font->parent->get_glyph_from_name (name, len, glyph);
}
-static const hb_font_funcs_t _hb_font_funcs_nil = {
+DEFINE_NULL_INSTANCE (hb_font_funcs_t) =
+{
HB_OBJECT_HEADER_STATIC,
- true, /* immutable */
-
{
#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
@@ -364,10 +491,9 @@ static const hb_font_funcs_t _hb_font_funcs_nil = {
}
}
};
-static const hb_font_funcs_t _hb_font_funcs_parent = {
- HB_OBJECT_HEADER_STATIC,
- true, /* immutable */
+static const hb_font_funcs_t _hb_font_funcs_default = {
+ HB_OBJECT_HEADER_STATIC,
{
#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
@@ -381,7 +507,7 @@ static const hb_font_funcs_t _hb_font_funcs_parent = {
},
{
{
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_parent,
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_default,
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
#undef HB_FONT_FUNC_IMPLEMENT
}
@@ -392,21 +518,21 @@ static const hb_font_funcs_t _hb_font_funcs_parent = {
/**
* hb_font_funcs_create: (Xconstructor)
*
- *
*
- * Return value: (transfer full):
+ *
+ * Return value: (transfer full):
*
* Since: 0.9.2
**/
hb_font_funcs_t *
-hb_font_funcs_create (void)
+hb_font_funcs_create ()
{
hb_font_funcs_t *ffuncs;
if (!(ffuncs = hb_object_create<hb_font_funcs_t> ()))
return hb_font_funcs_get_empty ();
- ffuncs->get = _hb_font_funcs_parent.get;
+ ffuncs->get = _hb_font_funcs_default.get;
return ffuncs;
}
@@ -414,25 +540,25 @@ hb_font_funcs_create (void)
/**
* hb_font_funcs_get_empty:
*
- *
*
- * Return value: (transfer full):
+ *
+ * Return value: (transfer full):
*
* Since: 0.9.2
**/
hb_font_funcs_t *
-hb_font_funcs_get_empty (void)
+hb_font_funcs_get_empty ()
{
- return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_parent);
+ return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_default);
}
/**
* hb_font_funcs_reference: (skip)
* @ffuncs: font functions.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -446,7 +572,7 @@ hb_font_funcs_reference (hb_font_funcs_t *ffuncs)
* hb_font_funcs_destroy: (skip)
* @ffuncs: font functions.
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -466,14 +592,14 @@ hb_font_funcs_destroy (hb_font_funcs_t *ffuncs)
/**
* hb_font_funcs_set_user_data: (skip)
* @ffuncs: font functions.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.2
**/
@@ -490,11 +616,11 @@ hb_font_funcs_set_user_data (hb_font_funcs_t *ffuncs,
/**
* hb_font_funcs_get_user_data: (skip)
* @ffuncs: font functions.
- * @key:
+ * @key:
+ *
*
- *
*
- * Return value: (transfer none):
+ * Return value: (transfer none):
*
* Since: 0.9.2
**/
@@ -510,61 +636,61 @@ hb_font_funcs_get_user_data (hb_font_funcs_t *ffuncs,
* hb_font_funcs_make_immutable:
* @ffuncs: font functions.
*
- *
+ *
*
* Since: 0.9.2
**/
void
hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs)
{
- if (unlikely (hb_object_is_inert (ffuncs)))
+ if (hb_object_is_immutable (ffuncs))
return;
- ffuncs->immutable = true;
+ hb_object_make_immutable (ffuncs);
}
/**
* hb_font_funcs_is_immutable:
* @ffuncs: font functions.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
hb_bool_t
hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs)
{
- return ffuncs->immutable;
+ return hb_object_is_immutable (ffuncs);
}
#define HB_FONT_FUNC_IMPLEMENT(name) \
- \
+ \
void \
hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \
- hb_font_get_##name##_func_t func, \
- void *user_data, \
- hb_destroy_func_t destroy) \
+ hb_font_get_##name##_func_t func, \
+ void *user_data, \
+ hb_destroy_func_t destroy) \
{ \
- if (ffuncs->immutable) { \
+ if (hb_object_is_immutable (ffuncs)) { \
if (destroy) \
destroy (user_data); \
return; \
} \
- \
+ \
if (ffuncs->destroy.name) \
ffuncs->destroy.name (ffuncs->user_data.name); \
- \
+ \
if (func) { \
ffuncs->get.f.name = func; \
ffuncs->user_data.name = user_data; \
ffuncs->destroy.name = destroy; \
} else { \
- ffuncs->get.f.name = hb_font_get_##name##_parent; \
- ffuncs->user_data.name = nullptr; \
- ffuncs->destroy.name = nullptr; \
+ ffuncs->get.f.name = hb_font_get_##name##_default; \
+ ffuncs->user_data.name = nullptr; \
+ ffuncs->destroy.name = nullptr; \
} \
}
@@ -572,11 +698,16 @@ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
#undef HB_FONT_FUNC_IMPLEMENT
bool
+hb_font_t::has_func_set (unsigned int i)
+{
+ return this->klass->get.array[i] != _hb_font_funcs_default.get.array[i];
+}
+
+bool
hb_font_t::has_func (unsigned int i)
{
- if (parent && parent != hb_font_get_empty () && parent->has_func (i))
- return true;
- return this->klass->get.array[i] != _hb_font_funcs_parent.get.array[i];
+ return has_func_set (i) ||
+ (parent && parent != &_hb_Null_hb_font_t && parent->has_func (i));
}
/* Public getters */
@@ -620,13 +751,13 @@ hb_font_get_v_extents (hb_font_t *font,
/**
* hb_font_get_glyph:
* @font: a font.
- * @unicode:
- * @variation_selector:
- * @glyph: (out):
+ * @unicode:
+ * @variation_selector:
+ * @glyph: (out):
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.2
**/
@@ -643,12 +774,12 @@ hb_font_get_glyph (hb_font_t *font,
/**
* hb_font_get_nominal_glyph:
* @font: a font.
- * @unicode:
- * @glyph: (out):
+ * @unicode:
+ * @glyph: (out):
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 1.2.3
**/
@@ -661,15 +792,38 @@ hb_font_get_nominal_glyph (hb_font_t *font,
}
/**
+ * hb_font_get_nominal_glyphs:
+ * @font: a font.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 2.6.3
+ **/
+unsigned int
+hb_font_get_nominal_glyphs (hb_font_t *font,
+ unsigned int count,
+ const hb_codepoint_t *first_unicode,
+ unsigned int unicode_stride,
+ hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride)
+{
+ return font->get_nominal_glyphs (count,
+ first_unicode, unicode_stride,
+ first_glyph, glyph_stride);
+}
+
+/**
* hb_font_get_variation_glyph:
* @font: a font.
- * @unicode:
- * @variation_selector:
- * @glyph: (out):
+ * @unicode:
+ * @variation_selector:
+ * @glyph: (out):
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 1.2.3
**/
@@ -684,11 +838,11 @@ hb_font_get_variation_glyph (hb_font_t *font,
/**
* hb_font_get_glyph_h_advance:
* @font: a font.
- * @glyph:
+ * @glyph:
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.2
**/
@@ -702,11 +856,11 @@ hb_font_get_glyph_h_advance (hb_font_t *font,
/**
* hb_font_get_glyph_v_advance:
* @font: a font.
- * @glyph:
+ * @glyph:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -718,15 +872,52 @@ hb_font_get_glyph_v_advance (hb_font_t *font,
}
/**
+ * hb_font_get_glyph_h_advances:
+ * @font: a font.
+ *
+ *
+ *
+ * Since: 1.8.6
+ **/
+void
+hb_font_get_glyph_h_advances (hb_font_t* font,
+ unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned glyph_stride,
+ hb_position_t *first_advance,
+ unsigned advance_stride)
+{
+ font->get_glyph_h_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
+}
+/**
+ * hb_font_get_glyph_v_advances:
+ * @font: a font.
+ *
+ *
+ *
+ * Since: 1.8.6
+ **/
+void
+hb_font_get_glyph_v_advances (hb_font_t* font,
+ unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned glyph_stride,
+ hb_position_t *first_advance,
+ unsigned advance_stride)
+{
+ font->get_glyph_v_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
+}
+
+/**
* hb_font_get_glyph_h_origin:
* @font: a font.
- * @glyph:
- * @x: (out):
- * @y: (out):
+ * @glyph:
+ * @x: (out):
+ * @y: (out):
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -741,13 +932,13 @@ hb_font_get_glyph_h_origin (hb_font_t *font,
/**
* hb_font_get_glyph_v_origin:
* @font: a font.
- * @glyph:
- * @x: (out):
- * @y: (out):
+ * @glyph:
+ * @x: (out):
+ * @y: (out):
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -762,12 +953,12 @@ hb_font_get_glyph_v_origin (hb_font_t *font,
/**
* hb_font_get_glyph_h_kerning:
* @font: a font.
- * @left_glyph:
- * @right_glyph:
+ * @left_glyph:
+ * @right_glyph:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -778,17 +969,19 @@ hb_font_get_glyph_h_kerning (hb_font_t *font,
return font->get_glyph_h_kerning (left_glyph, right_glyph);
}
+#ifndef HB_DISABLE_DEPRECATED
/**
* hb_font_get_glyph_v_kerning:
* @font: a font.
- * @top_glyph:
- * @bottom_glyph:
+ * @top_glyph:
+ * @bottom_glyph:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
+ * Deprecated: 2.0.0
**/
hb_position_t
hb_font_get_glyph_v_kerning (hb_font_t *font,
@@ -796,16 +989,17 @@ hb_font_get_glyph_v_kerning (hb_font_t *font,
{
return font->get_glyph_v_kerning (top_glyph, bottom_glyph);
}
+#endif
/**
* hb_font_get_glyph_extents:
* @font: a font.
- * @glyph:
- * @extents: (out):
+ * @glyph:
+ * @extents: (out):
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -820,14 +1014,14 @@ hb_font_get_glyph_extents (hb_font_t *font,
/**
* hb_font_get_glyph_contour_point:
* @font: a font.
- * @glyph:
- * @point_index:
- * @x: (out):
- * @y: (out):
+ * @glyph:
+ * @point_index:
+ * @x: (out):
+ * @y: (out):
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -842,13 +1036,13 @@ hb_font_get_glyph_contour_point (hb_font_t *font,
/**
* hb_font_get_glyph_name:
* @font: a font.
- * @glyph:
- * @name: (array length=size):
- * @size:
+ * @glyph:
+ * @name: (array length=size):
+ * @size:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -863,13 +1057,13 @@ hb_font_get_glyph_name (hb_font_t *font,
/**
* hb_font_get_glyph_from_name:
* @font: a font.
- * @name: (array length=len):
- * @len:
- * @glyph: (out):
+ * @name: (array length=len):
+ * @len:
+ * @glyph: (out):
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.2
**/
@@ -888,7 +1082,7 @@ hb_font_get_glyph_from_name (hb_font_t *font,
* hb_font_get_extents_for_direction:
* @font: a font.
* @direction:
- * @extents:
+ * @extents: (out):
*
*
*
@@ -904,12 +1098,12 @@ hb_font_get_extents_for_direction (hb_font_t *font,
/**
* hb_font_get_glyph_advance_for_direction:
* @font: a font.
- * @glyph:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @glyph:
+ * @direction:
+ * @x: (out):
+ * @y: (out):
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -921,16 +1115,36 @@ hb_font_get_glyph_advance_for_direction (hb_font_t *font,
{
return font->get_glyph_advance_for_direction (glyph, direction, x, y);
}
+/**
+ * hb_font_get_glyph_advances_for_direction:
+ * @font: a font.
+ * @direction:
+ *
+ *
+ *
+ * Since: 1.8.6
+ **/
+HB_EXTERN void
+hb_font_get_glyph_advances_for_direction (hb_font_t* font,
+ hb_direction_t direction,
+ unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned glyph_stride,
+ hb_position_t *first_advance,
+ unsigned advance_stride)
+{
+ font->get_glyph_advances_for_direction (direction, count, first_glyph, glyph_stride, first_advance, advance_stride);
+}
/**
* hb_font_get_glyph_origin_for_direction:
* @font: a font.
- * @glyph:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @glyph:
+ * @direction:
+ * @x: (out):
+ * @y: (out):
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -946,12 +1160,12 @@ hb_font_get_glyph_origin_for_direction (hb_font_t *font,
/**
* hb_font_add_glyph_origin_for_direction:
* @font: a font.
- * @glyph:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @glyph:
+ * @direction:
+ * @x: (out):
+ * @y: (out):
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -967,12 +1181,12 @@ hb_font_add_glyph_origin_for_direction (hb_font_t *font,
/**
* hb_font_subtract_glyph_origin_for_direction:
* @font: a font.
- * @glyph:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @glyph:
+ * @direction:
+ * @x: (out):
+ * @y: (out):
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -988,13 +1202,13 @@ hb_font_subtract_glyph_origin_for_direction (hb_font_t *font,
/**
* hb_font_get_glyph_kerning_for_direction:
* @font: a font.
- * @first_glyph:
- * @second_glyph:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @first_glyph:
+ * @second_glyph:
+ * @direction:
+ * @x: (out):
+ * @y: (out):
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -1010,13 +1224,13 @@ hb_font_get_glyph_kerning_for_direction (hb_font_t *font,
/**
* hb_font_get_glyph_extents_for_origin:
* @font: a font.
- * @glyph:
- * @direction:
- * @extents: (out):
+ * @glyph:
+ * @direction:
+ * @extents: (out):
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.2
**/
@@ -1032,15 +1246,15 @@ hb_font_get_glyph_extents_for_origin (hb_font_t *font,
/**
* hb_font_get_glyph_contour_point_for_origin:
* @font: a font.
- * @glyph:
- * @point_index:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @glyph:
+ * @point_index:
+ * @direction:
+ * @x: (out):
+ * @y: (out):
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -1057,11 +1271,11 @@ hb_font_get_glyph_contour_point_for_origin (hb_font_t *font,
/**
* hb_font_glyph_to_string:
* @font: a font.
- * @glyph:
- * @s: (array length=size):
- * @size:
+ * @glyph:
+ * @s: (array length=size):
+ * @size:
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -1077,13 +1291,13 @@ hb_font_glyph_to_string (hb_font_t *font,
/**
* hb_font_glyph_from_string:
* @font: a font.
- * @s: (array length=len) (element-type uint8_t):
- * @len:
- * @glyph: (out):
+ * @s: (array length=len) (element-type uint8_t):
+ * @len:
+ * @glyph: (out):
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -1100,18 +1314,33 @@ hb_font_glyph_from_string (hb_font_t *font,
* hb_font_t
*/
-/**
- * hb_font_create: (Xconstructor)
- * @face: a face.
- *
- *
- *
- * Return value: (transfer full):
- *
- * Since: 0.9.2
- **/
-hb_font_t *
-hb_font_create (hb_face_t *face)
+DEFINE_NULL_INSTANCE (hb_font_t) =
+{
+ HB_OBJECT_HEADER_STATIC,
+
+ nullptr, /* parent */
+ const_cast<hb_face_t *> (&_hb_Null_hb_face_t),
+
+ 1000, /* x_scale */
+ 1000, /* y_scale */
+ 1<<16, /* x_mult */
+ 1<<16, /* y_mult */
+
+ 0, /* x_ppem */
+ 0, /* y_ppem */
+ 0, /* ptem */
+
+ 0, /* num_coords */
+ nullptr, /* coords */
+
+ const_cast<hb_font_funcs_t *> (&_hb_Null_hb_font_funcs_t),
+
+ /* Zero for the rest is fine. */
+};
+
+
+static hb_font_t *
+_hb_font_create (hb_face_t *face)
{
hb_font_t *font;
@@ -1124,8 +1353,32 @@ hb_font_create (hb_face_t *face)
font->parent = hb_font_get_empty ();
font->face = hb_face_reference (face);
font->klass = hb_font_funcs_get_empty ();
-
+ font->data.init0 (font);
font->x_scale = font->y_scale = hb_face_get_upem (face);
+ font->x_mult = font->y_mult = 1 << 16;
+
+ return font;
+}
+
+/**
+ * hb_font_create: (Xconstructor)
+ * @face: a face.
+ *
+ *
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 0.9.2
+ **/
+hb_font_t *
+hb_font_create (hb_face_t *face)
+{
+ hb_font_t *font = _hb_font_create (face);
+
+#ifndef HB_NO_OT_FONT
+ /* Install our in-house, very lightweight, funcs. */
+ hb_ot_font_set_funcs (font);
+#endif
return font;
}
@@ -1134,9 +1387,9 @@ hb_font_create (hb_face_t *face)
* hb_font_create_sub_font:
* @parent: parent font.
*
- *
*
- * Return value: (transfer full):
+ *
+ * Return value: (transfer full):
*
* Since: 0.9.2
**/
@@ -1146,23 +1399,22 @@ hb_font_create_sub_font (hb_font_t *parent)
if (unlikely (!parent))
parent = hb_font_get_empty ();
- hb_font_t *font = hb_font_create (parent->face);
+ hb_font_t *font = _hb_font_create (parent->face);
- if (unlikely (hb_object_is_inert (font)))
+ if (unlikely (hb_object_is_immutable (font)))
return font;
font->parent = hb_font_reference (parent);
font->x_scale = parent->x_scale;
font->y_scale = parent->y_scale;
+ font->mults_changed ();
font->x_ppem = parent->x_ppem;
font->y_ppem = parent->y_ppem;
font->ptem = parent->ptem;
font->num_coords = parent->num_coords;
- if (!font->num_coords)
- font->coords = nullptr;
- else
+ if (font->num_coords)
{
unsigned int size = parent->num_coords * sizeof (parent->coords[0]);
font->coords = (int *) malloc (size);
@@ -1178,54 +1430,25 @@ hb_font_create_sub_font (hb_font_t *parent)
/**
* hb_font_get_empty:
*
- *
+ *
*
* Return value: (transfer full)
*
* Since: 0.9.2
**/
hb_font_t *
-hb_font_get_empty (void)
+hb_font_get_empty ()
{
- static const hb_font_t _hb_font_nil = {
- HB_OBJECT_HEADER_STATIC,
-
- true, /* immutable */
-
- nullptr, /* parent */
- const_cast<hb_face_t *> (&_hb_face_nil),
-
- 1000, /* x_scale */
- 1000, /* y_scale */
-
- 0, /* x_ppem */
- 0, /* y_ppem */
- 0, /* ptem */
-
- 0, /* num_coords */
- nullptr, /* coords */
-
- const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil), /* klass */
- nullptr, /* user_data */
- nullptr, /* destroy */
-
- {
-#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
- }
- };
-
- return const_cast<hb_font_t *> (&_hb_font_nil);
+ return const_cast<hb_font_t *> (&Null(hb_font_t));
}
/**
* hb_font_reference: (skip)
* @font: a font.
*
- *
*
- * Return value: (transfer full):
+ *
+ * Return value: (transfer full):
*
* Since: 0.9.2
**/
@@ -1239,7 +1462,7 @@ hb_font_reference (hb_font_t *font)
* hb_font_destroy: (skip)
* @font: a font.
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -1248,9 +1471,7 @@ hb_font_destroy (hb_font_t *font)
{
if (!hb_object_destroy (font)) return;
-#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, font);
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
+ font->data.fini ();
if (font->destroy)
font->destroy (font->user_data);
@@ -1267,14 +1488,14 @@ hb_font_destroy (hb_font_t *font)
/**
* hb_font_set_user_data: (skip)
* @font: a font.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -1291,11 +1512,11 @@ hb_font_set_user_data (hb_font_t *font,
/**
* hb_font_get_user_data: (skip)
* @font: a font.
- * @key:
+ * @key:
+ *
*
- *
*
- * Return value: (transfer none):
+ * Return value: (transfer none):
*
* Since: 0.9.2
**/
@@ -1310,36 +1531,36 @@ hb_font_get_user_data (hb_font_t *font,
* hb_font_make_immutable:
* @font: a font.
*
- *
+ *
*
* Since: 0.9.2
**/
void
hb_font_make_immutable (hb_font_t *font)
{
- if (unlikely (hb_object_is_inert (font)))
+ if (hb_object_is_immutable (font))
return;
if (font->parent)
hb_font_make_immutable (font->parent);
- font->immutable = true;
+ hb_object_make_immutable (font);
}
/**
* hb_font_is_immutable:
* @font: a font.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
hb_bool_t
hb_font_is_immutable (hb_font_t *font)
{
- return font->immutable;
+ return hb_object_is_immutable (font);
}
/**
@@ -1355,7 +1576,7 @@ void
hb_font_set_parent (hb_font_t *font,
hb_font_t *parent)
{
- if (font->immutable)
+ if (hb_object_is_immutable (font))
return;
if (!parent)
@@ -1372,9 +1593,9 @@ hb_font_set_parent (hb_font_t *font,
* hb_font_get_parent:
* @font: a font.
*
- *
*
- * Return value: (transfer none):
+ *
+ * Return value: (transfer none):
*
* Since: 0.9.2
**/
@@ -1397,7 +1618,7 @@ void
hb_font_set_face (hb_font_t *font,
hb_face_t *face)
{
- if (font->immutable)
+ if (hb_object_is_immutable (font))
return;
if (unlikely (!face))
@@ -1405,7 +1626,9 @@ hb_font_set_face (hb_font_t *font,
hb_face_t *old = font->face;
+ hb_face_make_immutable (face);
font->face = hb_face_reference (face);
+ font->mults_changed ();
hb_face_destroy (old);
}
@@ -1414,9 +1637,9 @@ hb_font_set_face (hb_font_t *font,
* hb_font_get_face:
* @font: a font.
*
- *
*
- * Return value: (transfer none):
+ *
+ * Return value: (transfer none):
*
* Since: 0.9.2
**/
@@ -1431,10 +1654,10 @@ hb_font_get_face (hb_font_t *font)
* hb_font_set_funcs:
* @font: a font.
* @klass: (closure font_data) (destroy destroy) (scope notified):
- * @font_data:
- * @destroy:
+ * @font_data:
+ * @destroy:
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -1444,7 +1667,8 @@ hb_font_set_funcs (hb_font_t *font,
void *font_data,
hb_destroy_func_t destroy)
{
- if (font->immutable) {
+ if (hb_object_is_immutable (font))
+ {
if (destroy)
destroy (font_data);
return;
@@ -1467,19 +1691,20 @@ hb_font_set_funcs (hb_font_t *font,
* hb_font_set_funcs_data:
* @font: a font.
* @font_data: (destroy destroy) (scope notified):
- * @destroy:
+ * @destroy:
+ *
*
- *
*
* Since: 0.9.2
**/
void
hb_font_set_funcs_data (hb_font_t *font,
- void *font_data,
- hb_destroy_func_t destroy)
+ void *font_data,
+ hb_destroy_func_t destroy)
{
/* Destroy user_data? */
- if (font->immutable) {
+ if (hb_object_is_immutable (font))
+ {
if (destroy)
destroy (font_data);
return;
@@ -1496,10 +1721,10 @@ hb_font_set_funcs_data (hb_font_t *font,
/**
* hb_font_set_scale:
* @font: a font.
- * @x_scale:
- * @y_scale:
+ * @x_scale:
+ * @y_scale:
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -1508,20 +1733,21 @@ hb_font_set_scale (hb_font_t *font,
int x_scale,
int y_scale)
{
- if (font->immutable)
+ if (hb_object_is_immutable (font))
return;
font->x_scale = x_scale;
font->y_scale = y_scale;
+ font->mults_changed ();
}
/**
* hb_font_get_scale:
* @font: a font.
- * @x_scale: (out):
- * @y_scale: (out):
+ * @x_scale: (out):
+ * @y_scale: (out):
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -1537,10 +1763,10 @@ hb_font_get_scale (hb_font_t *font,
/**
* hb_font_set_ppem:
* @font: a font.
- * @x_ppem:
- * @y_ppem:
+ * @x_ppem:
+ * @y_ppem:
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -1549,7 +1775,7 @@ hb_font_set_ppem (hb_font_t *font,
unsigned int x_ppem,
unsigned int y_ppem)
{
- if (font->immutable)
+ if (hb_object_is_immutable (font))
return;
font->x_ppem = x_ppem;
@@ -1559,10 +1785,10 @@ hb_font_set_ppem (hb_font_t *font,
/**
* hb_font_get_ppem:
* @font: a font.
- * @x_ppem: (out):
- * @y_ppem: (out):
+ * @x_ppem: (out):
+ * @y_ppem: (out):
+ *
*
- *
*
* Since: 0.9.2
**/
@@ -1578,16 +1804,18 @@ hb_font_get_ppem (hb_font_t *font,
/**
* hb_font_set_ptem:
* @font: a font.
- * @ptem:
+ * @ptem: font size in points.
*
- * Sets "point size" of the font.
+ * Sets "point size" of the font. Set to 0 to unset.
+ *
+ * There are 72 points in an inch.
*
* Since: 1.6.0
**/
void
hb_font_set_ptem (hb_font_t *font, float ptem)
{
- if (font->immutable)
+ if (hb_object_is_immutable (font))
return;
font->ptem = ptem;
@@ -1609,6 +1837,7 @@ hb_font_get_ptem (hb_font_t *font)
return font->ptem;
}
+#ifndef HB_NO_VAR
/*
* Variations
*/
@@ -1634,7 +1863,7 @@ hb_font_set_variations (hb_font_t *font,
const hb_variation_t *variations,
unsigned int variations_length)
{
- if (font->immutable)
+ if (hb_object_is_immutable (font))
return;
if (!variations_length)
@@ -1665,7 +1894,7 @@ hb_font_set_var_coords_design (hb_font_t *font,
const float *coords,
unsigned int coords_length)
{
- if (font->immutable)
+ if (hb_object_is_immutable (font))
return;
int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr;
@@ -1677,6 +1906,33 @@ hb_font_set_var_coords_design (hb_font_t *font,
}
/**
+ * hb_font_set_var_named_instance:
+ * @font: a font.
+ * @instance_index: named instance index.
+ *
+ * Sets design coords of a font from a named instance index.
+ *
+ * Since: 2.6.0
+ */
+void
+hb_font_set_var_named_instance (hb_font_t *font,
+ unsigned instance_index)
+{
+ if (hb_object_is_immutable (font))
+ return;
+
+ unsigned int coords_length = hb_ot_var_named_instance_get_design_coords (font->face, instance_index, nullptr, nullptr);
+
+ float *coords = coords_length ? (float *) calloc (coords_length, sizeof (float)) : nullptr;
+ if (unlikely (coords_length && !coords))
+ return;
+
+ hb_ot_var_named_instance_get_design_coords (font->face, instance_index, &coords_length, coords);
+ hb_font_set_var_coords_design (font, coords, coords_length);
+ free (coords);
+}
+
+/**
* hb_font_set_var_coords_normalized:
*
* Since: 1.4.2
@@ -1686,7 +1942,7 @@ hb_font_set_var_coords_normalized (hb_font_t *font,
const int *coords, /* 2.14 normalized */
unsigned int coords_length)
{
- if (font->immutable)
+ if (hb_object_is_immutable (font))
return;
int *copy = coords_length ? (int *) calloc (coords_length, sizeof (coords[0])) : nullptr;
@@ -1716,10 +1972,9 @@ hb_font_get_var_coords_normalized (hb_font_t *font,
return font->coords;
}
-
+#endif
#ifndef HB_DISABLE_DEPRECATED
-
/*
* Deprecated get_glyph_func():
*/
@@ -1806,9 +2061,9 @@ hb_font_get_variation_glyph_trampoline (hb_font_t *font,
/**
* hb_font_funcs_set_glyph_func:
* @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
+ * @func: (closure user_data) (destroy destroy) (scope notified): callback function.
+ * @user_data: data to pass to @func.
+ * @destroy: function to call when @user_data is not needed anymore.
*
* Deprecated. Use hb_font_funcs_set_nominal_glyph_func() and
* hb_font_funcs_set_variation_glyph_func() instead.
@@ -1842,5 +2097,4 @@ hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
trampoline,
trampoline_destroy);
}
-
-#endif /* HB_DISABLE_DEPRECATED */
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-font.h b/src/3rdparty/harfbuzz-ng/src/hb-font.h
index 540cdcab95..01ff201aee 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-font.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-font.h
@@ -110,7 +110,7 @@ typedef struct hb_glyph_extents_t
/* func types */
typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data,
- hb_font_extents_t *metrics,
+ hb_font_extents_t *extents,
void *user_data);
typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t;
typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t;
@@ -125,6 +125,14 @@ typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *
hb_codepoint_t *glyph,
void *user_data);
+typedef unsigned int (*hb_font_get_nominal_glyphs_func_t) (hb_font_t *font, void *font_data,
+ unsigned int count,
+ const hb_codepoint_t *first_unicode,
+ unsigned int unicode_stride,
+ hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride,
+ void *user_data);
+
typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data,
hb_codepoint_t glyph,
@@ -132,6 +140,16 @@ typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void
typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_h_advance_func_t;
typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_v_advance_func_t;
+typedef void (*hb_font_get_glyph_advances_func_t) (hb_font_t* font, void* font_data,
+ unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned glyph_stride,
+ hb_position_t *first_advance,
+ unsigned advance_stride,
+ void *user_data);
+typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_h_advances_func_t;
+typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_v_advances_func_t;
+
typedef hb_bool_t (*hb_font_get_glyph_origin_func_t) (hb_font_t *font, void *font_data,
hb_codepoint_t glyph,
hb_position_t *x, hb_position_t *y,
@@ -143,7 +161,6 @@ typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void
hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
void *user_data);
typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t;
-typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t;
typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_data,
@@ -207,7 +224,7 @@ hb_font_funcs_set_font_v_extents_func (hb_font_funcs_t *ffuncs,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 1.2.3
**/
@@ -217,13 +234,29 @@ hb_font_funcs_set_nominal_glyph_func (hb_font_funcs_t *ffuncs,
void *user_data, hb_destroy_func_t destroy);
/**
+ * hb_font_funcs_set_nominal_glyphs_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 2.0.0
+ **/
+HB_EXTERN void
+hb_font_funcs_set_nominal_glyphs_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_nominal_glyphs_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+/**
* hb_font_funcs_set_variation_glyph_func:
* @ffuncs: font functions.
* @func: (closure user_data) (destroy destroy) (scope notified):
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 1.2.3
**/
@@ -239,7 +272,7 @@ hb_font_funcs_set_variation_glyph_func (hb_font_funcs_t *ffuncs,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -255,7 +288,7 @@ hb_font_funcs_set_glyph_h_advance_func (hb_font_funcs_t *ffuncs,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -265,67 +298,83 @@ hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs,
void *user_data, hb_destroy_func_t destroy);
/**
- * hb_font_funcs_set_glyph_h_origin_func:
+ * hb_font_funcs_set_glyph_h_advances_func:
* @ffuncs: font functions.
* @func: (closure user_data) (destroy destroy) (scope notified):
* @user_data:
* @destroy:
*
- *
*
- * Since: 0.9.2
+ *
+ * Since: 1.8.6
**/
HB_EXTERN void
-hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs,
- hb_font_get_glyph_h_origin_func_t func,
- void *user_data, hb_destroy_func_t destroy);
+hb_font_funcs_set_glyph_h_advances_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_glyph_h_advances_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
/**
- * hb_font_funcs_set_glyph_v_origin_func:
+ * hb_font_funcs_set_glyph_v_advances_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.8.6
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_v_advances_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_glyph_v_advances_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_h_origin_func:
* @ffuncs: font functions.
* @func: (closure user_data) (destroy destroy) (scope notified):
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
HB_EXTERN void
-hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs,
- hb_font_get_glyph_v_origin_func_t func,
+hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_glyph_h_origin_func_t func,
void *user_data, hb_destroy_func_t destroy);
/**
- * hb_font_funcs_set_glyph_h_kerning_func:
+ * hb_font_funcs_set_glyph_v_origin_func:
* @ffuncs: font functions.
* @func: (closure user_data) (destroy destroy) (scope notified):
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
HB_EXTERN void
-hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs,
- hb_font_get_glyph_h_kerning_func_t func,
- void *user_data, hb_destroy_func_t destroy);
+hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_glyph_v_origin_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
/**
- * hb_font_funcs_set_glyph_v_kerning_func:
+ * hb_font_funcs_set_glyph_h_kerning_func:
* @ffuncs: font functions.
* @func: (closure user_data) (destroy destroy) (scope notified):
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
HB_EXTERN void
-hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs,
- hb_font_get_glyph_v_kerning_func_t func,
+hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_glyph_h_kerning_func_t func,
void *user_data, hb_destroy_func_t destroy);
/**
@@ -335,7 +384,7 @@ hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -351,7 +400,7 @@ hb_font_funcs_set_glyph_extents_func (hb_font_funcs_t *ffuncs,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -367,7 +416,7 @@ hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -383,7 +432,7 @@ hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -410,6 +459,14 @@ hb_font_get_variation_glyph (hb_font_t *font,
hb_codepoint_t unicode, hb_codepoint_t variation_selector,
hb_codepoint_t *glyph);
+HB_EXTERN unsigned int
+hb_font_get_nominal_glyphs (hb_font_t *font,
+ unsigned int count,
+ const hb_codepoint_t *first_unicode,
+ unsigned int unicode_stride,
+ hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride);
+
HB_EXTERN hb_position_t
hb_font_get_glyph_h_advance (hb_font_t *font,
hb_codepoint_t glyph);
@@ -417,6 +474,21 @@ HB_EXTERN hb_position_t
hb_font_get_glyph_v_advance (hb_font_t *font,
hb_codepoint_t glyph);
+HB_EXTERN void
+hb_font_get_glyph_h_advances (hb_font_t* font,
+ unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned glyph_stride,
+ hb_position_t *first_advance,
+ unsigned advance_stride);
+HB_EXTERN void
+hb_font_get_glyph_v_advances (hb_font_t* font,
+ unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned glyph_stride,
+ hb_position_t *first_advance,
+ unsigned advance_stride);
+
HB_EXTERN hb_bool_t
hb_font_get_glyph_h_origin (hb_font_t *font,
hb_codepoint_t glyph,
@@ -429,9 +501,6 @@ hb_font_get_glyph_v_origin (hb_font_t *font,
HB_EXTERN hb_position_t
hb_font_get_glyph_h_kerning (hb_font_t *font,
hb_codepoint_t left_glyph, hb_codepoint_t right_glyph);
-HB_EXTERN hb_position_t
-hb_font_get_glyph_v_kerning (hb_font_t *font,
- hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph);
HB_EXTERN hb_bool_t
hb_font_get_glyph_extents (hb_font_t *font,
@@ -456,7 +525,7 @@ hb_font_get_glyph_from_name (hb_font_t *font,
/* high-level funcs, with fallback */
/* Calls either hb_font_get_nominal_glyph() if variation_selector is 0,
- * otherwise callse hb_font_get_variation_glyph(). */
+ * otherwise calls hb_font_get_variation_glyph(). */
HB_EXTERN hb_bool_t
hb_font_get_glyph (hb_font_t *font,
hb_codepoint_t unicode, hb_codepoint_t variation_selector,
@@ -472,6 +541,14 @@ hb_font_get_glyph_advance_for_direction (hb_font_t *font,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
HB_EXTERN void
+hb_font_get_glyph_advances_for_direction (hb_font_t* font,
+ hb_direction_t direction,
+ unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned glyph_stride,
+ hb_position_t *first_advance,
+ unsigned advance_stride);
+HB_EXTERN void
hb_font_get_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
@@ -580,8 +657,8 @@ hb_font_set_funcs (hb_font_t *font,
/* Be *very* careful with this function! */
HB_EXTERN void
hb_font_set_funcs_data (hb_font_t *font,
- void *font_data,
- hb_destroy_func_t destroy);
+ void *font_data,
+ hb_destroy_func_t destroy);
HB_EXTERN void
@@ -636,6 +713,10 @@ HB_EXTERN const int *
hb_font_get_var_coords_normalized (hb_font_t *font,
unsigned int *length);
+HB_EXTERN void
+hb_font_set_var_named_instance (hb_font_t *font,
+ unsigned instance_index);
+
HB_END_DECLS
#endif /* HB_FONT_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-font.hh b/src/3rdparty/harfbuzz-ng/src/hb-font.hh
new file mode 100644
index 0000000000..b1e8e6440c
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-font.hh
@@ -0,0 +1,631 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_FONT_HH
+#define HB_FONT_HH
+
+#include "hb.hh"
+
+#include "hb-face.hh"
+#include "hb-shaper.hh"
+
+
+/*
+ * hb_font_funcs_t
+ */
+
+#define HB_FONT_FUNCS_IMPLEMENT_CALLBACKS \
+ HB_FONT_FUNC_IMPLEMENT (font_h_extents) \
+ HB_FONT_FUNC_IMPLEMENT (font_v_extents) \
+ HB_FONT_FUNC_IMPLEMENT (nominal_glyph) \
+ HB_FONT_FUNC_IMPLEMENT (nominal_glyphs) \
+ HB_FONT_FUNC_IMPLEMENT (variation_glyph) \
+ HB_FONT_FUNC_IMPLEMENT (glyph_h_advance) \
+ HB_FONT_FUNC_IMPLEMENT (glyph_v_advance) \
+ HB_FONT_FUNC_IMPLEMENT (glyph_h_advances) \
+ HB_FONT_FUNC_IMPLEMENT (glyph_v_advances) \
+ HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \
+ HB_FONT_FUNC_IMPLEMENT (glyph_v_origin) \
+ HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning) \
+ HB_IF_NOT_DEPRECATED (HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning)) \
+ HB_FONT_FUNC_IMPLEMENT (glyph_extents) \
+ HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \
+ HB_FONT_FUNC_IMPLEMENT (glyph_name) \
+ HB_FONT_FUNC_IMPLEMENT (glyph_from_name) \
+ /* ^--- Add new callbacks here */
+
+struct hb_font_funcs_t
+{
+ hb_object_header_t header;
+
+ struct {
+#define HB_FONT_FUNC_IMPLEMENT(name) void *name;
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ } user_data;
+
+ struct {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_destroy_func_t name;
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ } destroy;
+
+ /* Don't access these directly. Call font->get_*() instead. */
+ union get_t {
+ struct get_funcs_t {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ } f;
+ void (*array[0
+#define HB_FONT_FUNC_IMPLEMENT(name) +1
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ ]) ();
+ } get;
+};
+DECLARE_NULL_INSTANCE (hb_font_funcs_t);
+
+
+/*
+ * hb_font_t
+ */
+
+#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INSTANTIATE_SHAPERS(shaper, font);
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+
+struct hb_font_t
+{
+ hb_object_header_t header;
+
+ hb_font_t *parent;
+ hb_face_t *face;
+
+ int32_t x_scale;
+ int32_t y_scale;
+ int64_t x_mult;
+ int64_t y_mult;
+
+ unsigned int x_ppem;
+ unsigned int y_ppem;
+
+ float ptem;
+
+ /* Font variation coordinates. */
+ unsigned int num_coords;
+ int *coords;
+
+ hb_font_funcs_t *klass;
+ void *user_data;
+ hb_destroy_func_t destroy;
+
+ hb_shaper_object_dataset_t<hb_font_t> data; /* Various shaper data. */
+
+
+ /* Convert from font-space to user-space */
+ int64_t dir_mult (hb_direction_t direction)
+ { return HB_DIRECTION_IS_VERTICAL(direction) ? y_mult : x_mult; }
+ hb_position_t em_scale_x (int16_t v) { return em_mult (v, x_mult); }
+ hb_position_t em_scale_y (int16_t v) { return em_mult (v, y_mult); }
+ hb_position_t em_scalef_x (float v) { return em_scalef (v, x_scale); }
+ hb_position_t em_scalef_y (float v) { return em_scalef (v, y_scale); }
+ float em_fscale_x (int16_t v) { return em_fscale (v, x_scale); }
+ float em_fscale_y (int16_t v) { return em_fscale (v, y_scale); }
+ hb_position_t em_scale_dir (int16_t v, hb_direction_t direction)
+ { return em_mult (v, dir_mult (direction)); }
+
+ /* Convert from parent-font user-space to our user-space */
+ hb_position_t parent_scale_x_distance (hb_position_t v)
+ {
+ if (unlikely (parent && parent->x_scale != x_scale))
+ return (hb_position_t) (v * (int64_t) this->x_scale / this->parent->x_scale);
+ return v;
+ }
+ hb_position_t parent_scale_y_distance (hb_position_t v)
+ {
+ if (unlikely (parent && parent->y_scale != y_scale))
+ return (hb_position_t) (v * (int64_t) this->y_scale / this->parent->y_scale);
+ return v;
+ }
+ hb_position_t parent_scale_x_position (hb_position_t v)
+ { return parent_scale_x_distance (v); }
+ hb_position_t parent_scale_y_position (hb_position_t v)
+ { return parent_scale_y_distance (v); }
+
+ void parent_scale_distance (hb_position_t *x, hb_position_t *y)
+ {
+ *x = parent_scale_x_distance (*x);
+ *y = parent_scale_y_distance (*y);
+ }
+ void parent_scale_position (hb_position_t *x, hb_position_t *y)
+ {
+ *x = parent_scale_x_position (*x);
+ *y = parent_scale_y_position (*y);
+ }
+
+
+ /* Public getters */
+
+ HB_INTERNAL bool has_func (unsigned int i);
+ HB_INTERNAL bool has_func_set (unsigned int i);
+
+ /* has_* ... */
+#define HB_FONT_FUNC_IMPLEMENT(name) \
+ bool \
+ has_##name##_func () \
+ { \
+ hb_font_funcs_t *funcs = this->klass; \
+ unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
+ return has_func (i); \
+ } \
+ bool \
+ has_##name##_func_set () \
+ { \
+ hb_font_funcs_t *funcs = this->klass; \
+ unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
+ return has_func_set (i); \
+ }
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+
+ hb_bool_t get_font_h_extents (hb_font_extents_t *extents)
+ {
+ memset (extents, 0, sizeof (*extents));
+ return klass->get.f.font_h_extents (this, user_data,
+ extents,
+ klass->user_data.font_h_extents);
+ }
+ hb_bool_t get_font_v_extents (hb_font_extents_t *extents)
+ {
+ memset (extents, 0, sizeof (*extents));
+ return klass->get.f.font_v_extents (this, user_data,
+ extents,
+ klass->user_data.font_v_extents);
+ }
+
+ bool has_glyph (hb_codepoint_t unicode)
+ {
+ hb_codepoint_t glyph;
+ return get_nominal_glyph (unicode, &glyph);
+ }
+
+ hb_bool_t get_nominal_glyph (hb_codepoint_t unicode,
+ hb_codepoint_t *glyph)
+ {
+ *glyph = 0;
+ return klass->get.f.nominal_glyph (this, user_data,
+ unicode, glyph,
+ klass->user_data.nominal_glyph);
+ }
+ unsigned int get_nominal_glyphs (unsigned int count,
+ const hb_codepoint_t *first_unicode,
+ unsigned int unicode_stride,
+ hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride)
+ {
+ return klass->get.f.nominal_glyphs (this, user_data,
+ count,
+ first_unicode, unicode_stride,
+ first_glyph, glyph_stride,
+ klass->user_data.nominal_glyphs);
+ }
+
+ hb_bool_t get_variation_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph)
+ {
+ *glyph = 0;
+ return klass->get.f.variation_glyph (this, user_data,
+ unicode, variation_selector, glyph,
+ klass->user_data.variation_glyph);
+ }
+
+ hb_position_t get_glyph_h_advance (hb_codepoint_t glyph)
+ {
+ return klass->get.f.glyph_h_advance (this, user_data,
+ glyph,
+ klass->user_data.glyph_h_advance);
+ }
+
+ hb_position_t get_glyph_v_advance (hb_codepoint_t glyph)
+ {
+ return klass->get.f.glyph_v_advance (this, user_data,
+ glyph,
+ klass->user_data.glyph_v_advance);
+ }
+
+ void get_glyph_h_advances (unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride,
+ hb_position_t *first_advance,
+ unsigned int advance_stride)
+ {
+ return klass->get.f.glyph_h_advances (this, user_data,
+ count,
+ first_glyph, glyph_stride,
+ first_advance, advance_stride,
+ klass->user_data.glyph_h_advances);
+ }
+
+ void get_glyph_v_advances (unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride,
+ hb_position_t *first_advance,
+ unsigned int advance_stride)
+ {
+ return klass->get.f.glyph_v_advances (this, user_data,
+ count,
+ first_glyph, glyph_stride,
+ first_advance, advance_stride,
+ klass->user_data.glyph_v_advances);
+ }
+
+ hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ *x = *y = 0;
+ return klass->get.f.glyph_h_origin (this, user_data,
+ glyph, x, y,
+ klass->user_data.glyph_h_origin);
+ }
+
+ hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ *x = *y = 0;
+ return klass->get.f.glyph_v_origin (this, user_data,
+ glyph, x, y,
+ klass->user_data.glyph_v_origin);
+ }
+
+ hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph,
+ hb_codepoint_t right_glyph)
+ {
+#ifdef HB_DISABLE_DEPRECATED
+ return 0;
+#else
+ return klass->get.f.glyph_h_kerning (this, user_data,
+ left_glyph, right_glyph,
+ klass->user_data.glyph_h_kerning);
+#endif
+ }
+
+ hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph,
+ hb_codepoint_t bottom_glyph)
+ {
+#ifdef HB_DISABLE_DEPRECATED
+ return 0;
+#else
+ return klass->get.f.glyph_v_kerning (this, user_data,
+ top_glyph, bottom_glyph,
+ klass->user_data.glyph_v_kerning);
+#endif
+ }
+
+ hb_bool_t get_glyph_extents (hb_codepoint_t glyph,
+ hb_glyph_extents_t *extents)
+ {
+ memset (extents, 0, sizeof (*extents));
+ return klass->get.f.glyph_extents (this, user_data,
+ glyph,
+ extents,
+ klass->user_data.glyph_extents);
+ }
+
+ hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index,
+ hb_position_t *x, hb_position_t *y)
+ {
+ *x = *y = 0;
+ return klass->get.f.glyph_contour_point (this, user_data,
+ glyph, point_index,
+ x, y,
+ klass->user_data.glyph_contour_point);
+ }
+
+ hb_bool_t get_glyph_name (hb_codepoint_t glyph,
+ char *name, unsigned int size)
+ {
+ if (size) *name = '\0';
+ return klass->get.f.glyph_name (this, user_data,
+ glyph,
+ name, size,
+ klass->user_data.glyph_name);
+ }
+
+ hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */
+ hb_codepoint_t *glyph)
+ {
+ *glyph = 0;
+ if (len == -1) len = strlen (name);
+ return klass->get.f.glyph_from_name (this, user_data,
+ name, len,
+ glyph,
+ klass->user_data.glyph_from_name);
+ }
+
+
+ /* A bit higher-level, and with fallback */
+
+ void get_h_extents_with_fallback (hb_font_extents_t *extents)
+ {
+ if (!get_font_h_extents (extents))
+ {
+ extents->ascender = y_scale * .8;
+ extents->descender = extents->ascender - y_scale;
+ extents->line_gap = 0;
+ }
+ }
+ void get_v_extents_with_fallback (hb_font_extents_t *extents)
+ {
+ if (!get_font_v_extents (extents))
+ {
+ extents->ascender = x_scale / 2;
+ extents->descender = extents->ascender - x_scale;
+ extents->line_gap = 0;
+ }
+ }
+
+ void get_extents_for_direction (hb_direction_t direction,
+ hb_font_extents_t *extents)
+ {
+ if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
+ get_h_extents_with_fallback (extents);
+ else
+ get_v_extents_with_fallback (extents);
+ }
+
+ void get_glyph_advance_for_direction (hb_codepoint_t glyph,
+ hb_direction_t direction,
+ hb_position_t *x, hb_position_t *y)
+ {
+ *x = *y = 0;
+ if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
+ *x = get_glyph_h_advance (glyph);
+ else
+ *y = get_glyph_v_advance (glyph);
+ }
+ void get_glyph_advances_for_direction (hb_direction_t direction,
+ unsigned int count,
+ const hb_codepoint_t *first_glyph,
+ unsigned glyph_stride,
+ hb_position_t *first_advance,
+ unsigned advance_stride)
+ {
+ if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
+ get_glyph_h_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
+ else
+ get_glyph_v_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
+ }
+
+ void guess_v_origin_minus_h_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ *x = get_glyph_h_advance (glyph) / 2;
+
+ /* TODO cache this somehow?! */
+ hb_font_extents_t extents;
+ get_h_extents_with_fallback (&extents);
+ *y = extents.ascender;
+ }
+
+ void get_glyph_h_origin_with_fallback (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ if (!get_glyph_h_origin (glyph, x, y) &&
+ get_glyph_v_origin (glyph, x, y))
+ {
+ hb_position_t dx, dy;
+ guess_v_origin_minus_h_origin (glyph, &dx, &dy);
+ *x -= dx; *y -= dy;
+ }
+ }
+ void get_glyph_v_origin_with_fallback (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ if (!get_glyph_v_origin (glyph, x, y) &&
+ get_glyph_h_origin (glyph, x, y))
+ {
+ hb_position_t dx, dy;
+ guess_v_origin_minus_h_origin (glyph, &dx, &dy);
+ *x += dx; *y += dy;
+ }
+ }
+
+ void get_glyph_origin_for_direction (hb_codepoint_t glyph,
+ hb_direction_t direction,
+ hb_position_t *x, hb_position_t *y)
+ {
+ if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
+ get_glyph_h_origin_with_fallback (glyph, x, y);
+ else
+ get_glyph_v_origin_with_fallback (glyph, x, y);
+ }
+
+ void add_glyph_h_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y);
+
+ *x += origin_x;
+ *y += origin_y;
+ }
+ void add_glyph_v_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y);
+
+ *x += origin_x;
+ *y += origin_y;
+ }
+ void add_glyph_origin_for_direction (hb_codepoint_t glyph,
+ hb_direction_t direction,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y);
+
+ *x += origin_x;
+ *y += origin_y;
+ }
+
+ void subtract_glyph_h_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y);
+
+ *x -= origin_x;
+ *y -= origin_y;
+ }
+ void subtract_glyph_v_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y);
+
+ *x -= origin_x;
+ *y -= origin_y;
+ }
+ void subtract_glyph_origin_for_direction (hb_codepoint_t glyph,
+ hb_direction_t direction,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y);
+
+ *x -= origin_x;
+ *y -= origin_y;
+ }
+
+ void get_glyph_kerning_for_direction (hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
+ hb_direction_t direction,
+ hb_position_t *x, hb_position_t *y)
+ {
+ if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) {
+ *y = 0;
+ *x = get_glyph_h_kerning (first_glyph, second_glyph);
+ } else {
+ *x = 0;
+ *y = get_glyph_v_kerning (first_glyph, second_glyph);
+ }
+ }
+
+ hb_bool_t get_glyph_extents_for_origin (hb_codepoint_t glyph,
+ hb_direction_t direction,
+ hb_glyph_extents_t *extents)
+ {
+ hb_bool_t ret = get_glyph_extents (glyph, extents);
+
+ if (ret)
+ subtract_glyph_origin_for_direction (glyph, direction, &extents->x_bearing, &extents->y_bearing);
+
+ return ret;
+ }
+
+ hb_bool_t get_glyph_contour_point_for_origin (hb_codepoint_t glyph, unsigned int point_index,
+ hb_direction_t direction,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_bool_t ret = get_glyph_contour_point (glyph, point_index, x, y);
+
+ if (ret)
+ subtract_glyph_origin_for_direction (glyph, direction, x, y);
+
+ return ret;
+ }
+
+ /* Generates gidDDD if glyph has no name. */
+ void
+ glyph_to_string (hb_codepoint_t glyph,
+ char *s, unsigned int size)
+ {
+ if (get_glyph_name (glyph, s, size)) return;
+
+ if (size && snprintf (s, size, "gid%u", glyph) < 0)
+ *s = '\0';
+ }
+
+ /* Parses gidDDD and uniUUUU strings automatically. */
+ hb_bool_t
+ glyph_from_string (const char *s, int len, /* -1 means nul-terminated */
+ hb_codepoint_t *glyph)
+ {
+ if (get_glyph_from_name (s, len, glyph)) return true;
+
+ if (len == -1) len = strlen (s);
+
+ /* Straight glyph index. */
+ if (hb_codepoint_parse (s, len, 10, glyph))
+ return true;
+
+ if (len > 3)
+ {
+ /* gidDDD syntax for glyph indices. */
+ if (0 == strncmp (s, "gid", 3) &&
+ hb_codepoint_parse (s + 3, len - 3, 10, glyph))
+ return true;
+
+ /* uniUUUU and other Unicode character indices. */
+ hb_codepoint_t unichar;
+ if (0 == strncmp (s, "uni", 3) &&
+ hb_codepoint_parse (s + 3, len - 3, 16, &unichar) &&
+ get_nominal_glyph (unichar, glyph))
+ return true;
+ }
+
+ return false;
+ }
+
+ void mults_changed ()
+ {
+ signed upem = face->get_upem ();
+ x_mult = ((int64_t) x_scale << 16) / upem;
+ y_mult = ((int64_t) y_scale << 16) / upem;
+ }
+
+ hb_position_t em_mult (int16_t v, int64_t mult)
+ {
+ return (hb_position_t) ((v * mult) >> 16);
+ }
+ hb_position_t em_scalef (float v, int scale)
+ { return (hb_position_t) roundf (v * scale / face->get_upem ()); }
+ float em_fscale (int16_t v, int scale)
+ { return (float) v * scale / face->get_upem (); }
+};
+DECLARE_NULL_INSTANCE (hb_font_t);
+
+
+#endif /* HB_FONT_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ft.cc b/src/3rdparty/harfbuzz-ng/src/hb-ft.cc
new file mode 100644
index 0000000000..e526bf40d5
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ft.cc
@@ -0,0 +1,884 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ * Copyright © 2009 Keith Stribley
+ * Copyright © 2015 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifdef HAVE_FREETYPE
+
+#include "hb-ft.h"
+
+#include "hb-font.hh"
+#include "hb-machinery.hh"
+#include "hb-cache.hh"
+
+#include FT_ADVANCES_H
+#include FT_MULTIPLE_MASTERS_H
+#include FT_TRUETYPE_TABLES_H
+
+
+/**
+ * SECTION:hb-ft
+ * @title: hb-ft
+ * @short_description: FreeType integration
+ * @include: hb-ft.h
+ *
+ * Functions for using HarfBuzz with the FreeType library to provide face and
+ * font data.
+ **/
+
+
+/* TODO:
+ *
+ * In general, this file does a fine job of what it's supposed to do.
+ * There are, however, things that need more work:
+ *
+ * - FreeType works in 26.6 mode. Clients can decide to use that mode, and everything
+ * would work fine. However, we also abuse this API for performing in font-space,
+ * but don't pass the correct flags to FreeType. We just abuse the no-hinting mode
+ * for that, such that no rounding etc happens. As such, we don't set ppem, and
+ * pass NO_HINTING as load_flags. Would be much better to use NO_SCALE, and scale
+ * ourselves.
+ *
+ * - We don't handle / allow for emboldening / obliqueing.
+ *
+ * - In the future, we should add constructors to create fonts in font space?
+ */
+
+
+struct hb_ft_font_t
+{
+ mutable hb_mutex_t lock;
+ FT_Face ft_face;
+ int load_flags;
+ bool symbol; /* Whether selected cmap is symbol cmap. */
+ bool unref; /* Whether to destroy ft_face when done. */
+
+ mutable hb_atomic_int_t cached_x_scale;
+ mutable hb_advance_cache_t advance_cache;
+};
+
+static hb_ft_font_t *
+_hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref)
+{
+ hb_ft_font_t *ft_font = (hb_ft_font_t *) calloc (1, sizeof (hb_ft_font_t));
+
+ if (unlikely (!ft_font))
+ return nullptr;
+
+ ft_font->lock.init ();
+ ft_font->ft_face = ft_face;
+ ft_font->symbol = symbol;
+ ft_font->unref = unref;
+
+ ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
+
+ ft_font->cached_x_scale.set_relaxed (0);
+ ft_font->advance_cache.init ();
+
+ return ft_font;
+}
+
+static void
+_hb_ft_face_destroy (void *data)
+{
+ FT_Done_Face ((FT_Face) data);
+}
+
+static void
+_hb_ft_font_destroy (void *data)
+{
+ hb_ft_font_t *ft_font = (hb_ft_font_t *) data;
+
+ ft_font->advance_cache.fini ();
+
+ if (ft_font->unref)
+ _hb_ft_face_destroy (ft_font->ft_face);
+
+ ft_font->lock.fini ();
+
+ free (ft_font);
+}
+
+/**
+ * hb_ft_font_set_load_flags:
+ * @font:
+ * @load_flags:
+ *
+ *
+ *
+ * Since: 1.0.5
+ **/
+void
+hb_ft_font_set_load_flags (hb_font_t *font, int load_flags)
+{
+ if (hb_object_is_immutable (font))
+ return;
+
+ if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+ return;
+
+ hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data;
+
+ ft_font->load_flags = load_flags;
+}
+
+/**
+ * hb_ft_font_get_load_flags:
+ * @font:
+ *
+ *
+ *
+ * Return value:
+ * Since: 1.0.5
+ **/
+int
+hb_ft_font_get_load_flags (hb_font_t *font)
+{
+ if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+ return 0;
+
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
+
+ return ft_font->load_flags;
+}
+
+FT_Face
+hb_ft_font_get_face (hb_font_t *font)
+{
+ if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+ return nullptr;
+
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
+
+ return ft_font->ft_face;
+}
+
+
+
+static hb_bool_t
+hb_ft_get_nominal_glyph (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ hb_lock_t lock (ft_font->lock);
+ unsigned int g = FT_Get_Char_Index (ft_font->ft_face, unicode);
+
+ if (unlikely (!g))
+ {
+ if (unlikely (ft_font->symbol) && unicode <= 0x00FFu)
+ {
+ /* For symbol-encoded OpenType fonts, we duplicate the
+ * U+F000..F0FF range at U+0000..U+00FF. That's what
+ * Windows seems to do, and that's hinted about at:
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/recom
+ * under "Non-Standard (Symbol) Fonts". */
+ g = FT_Get_Char_Index (ft_font->ft_face, 0xF000u + unicode);
+ if (!g)
+ return false;
+ }
+ else
+ return false;
+ }
+
+ *glyph = g;
+ return true;
+}
+
+static unsigned int
+hb_ft_get_nominal_glyphs (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ unsigned int count,
+ const hb_codepoint_t *first_unicode,
+ unsigned int unicode_stride,
+ hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ hb_lock_t lock (ft_font->lock);
+ unsigned int done;
+ for (done = 0;
+ done < count && (*first_glyph = FT_Get_Char_Index (ft_font->ft_face, *first_unicode));
+ done++)
+ {
+ first_unicode = &StructAtOffsetUnaligned<hb_codepoint_t> (first_unicode, unicode_stride);
+ first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+ }
+ /* We don't need to do ft_font->symbol dance here, since HB calls the singular
+ * nominal_glyph() for what we don't handle here. */
+ return done;
+}
+
+
+static hb_bool_t
+hb_ft_get_variation_glyph (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ hb_lock_t lock (ft_font->lock);
+ unsigned int g = FT_Face_GetCharVariantIndex (ft_font->ft_face, unicode, variation_selector);
+
+ if (unlikely (!g))
+ return false;
+
+ *glyph = g;
+ return true;
+}
+
+static void
+hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data,
+ unsigned count,
+ const hb_codepoint_t *first_glyph,
+ unsigned glyph_stride,
+ hb_position_t *first_advance,
+ unsigned advance_stride,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ hb_lock_t lock (ft_font->lock);
+ FT_Face ft_face = ft_font->ft_face;
+ int load_flags = ft_font->load_flags;
+ int mult = font->x_scale < 0 ? -1 : +1;
+
+ if (font->x_scale != ft_font->cached_x_scale.get ())
+ {
+ ft_font->advance_cache.clear ();
+ ft_font->cached_x_scale.set (font->x_scale);
+ }
+
+ for (unsigned int i = 0; i < count; i++)
+ {
+ FT_Fixed v = 0;
+ hb_codepoint_t glyph = *first_glyph;
+
+ unsigned int cv;
+ if (ft_font->advance_cache.get (glyph, &cv))
+ v = cv;
+ else
+ {
+ FT_Get_Advance (ft_face, glyph, load_flags, &v);
+ ft_font->advance_cache.set (glyph, v);
+ }
+
+ *first_advance = (v * mult + (1<<9)) >> 10;
+ first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+ first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+ }
+}
+
+static hb_position_t
+hb_ft_get_glyph_v_advance (hb_font_t *font,
+ void *font_data,
+ hb_codepoint_t glyph,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ hb_lock_t lock (ft_font->lock);
+ FT_Fixed v;
+
+ if (unlikely (FT_Get_Advance (ft_font->ft_face, glyph, ft_font->load_flags | FT_LOAD_VERTICAL_LAYOUT, &v)))
+ return 0;
+
+ if (font->y_scale < 0)
+ v = -v;
+
+ /* Note: FreeType's vertical metrics grows downward while other FreeType coordinates
+ * have a Y growing upward. Hence the extra negation. */
+ return (-v + (1<<9)) >> 10;
+}
+
+static hb_bool_t
+hb_ft_get_glyph_v_origin (hb_font_t *font,
+ void *font_data,
+ hb_codepoint_t glyph,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ hb_lock_t lock (ft_font->lock);
+ FT_Face ft_face = ft_font->ft_face;
+
+ if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags)))
+ return false;
+
+ /* Note: FreeType's vertical metrics grows downward while other FreeType coordinates
+ * have a Y growing upward. Hence the extra negation. */
+ *x = ft_face->glyph->metrics.horiBearingX - ft_face->glyph->metrics.vertBearingX;
+ *y = ft_face->glyph->metrics.horiBearingY - (-ft_face->glyph->metrics.vertBearingY);
+
+ if (font->x_scale < 0)
+ *x = -*x;
+ if (font->y_scale < 0)
+ *y = -*y;
+
+ return true;
+}
+
+#ifndef HB_NO_OT_SHAPE_FALLBACK
+static hb_position_t
+hb_ft_get_glyph_h_kerning (hb_font_t *font,
+ void *font_data,
+ hb_codepoint_t left_glyph,
+ hb_codepoint_t right_glyph,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ FT_Vector kerningv;
+
+ FT_Kerning_Mode mode = font->x_ppem ? FT_KERNING_DEFAULT : FT_KERNING_UNFITTED;
+ if (FT_Get_Kerning (ft_font->ft_face, left_glyph, right_glyph, mode, &kerningv))
+ return 0;
+
+ return kerningv.x;
+}
+#endif
+
+static hb_bool_t
+hb_ft_get_glyph_extents (hb_font_t *font,
+ void *font_data,
+ hb_codepoint_t glyph,
+ hb_glyph_extents_t *extents,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ hb_lock_t lock (ft_font->lock);
+ FT_Face ft_face = ft_font->ft_face;
+
+ if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags)))
+ return false;
+
+ extents->x_bearing = ft_face->glyph->metrics.horiBearingX;
+ extents->y_bearing = ft_face->glyph->metrics.horiBearingY;
+ extents->width = ft_face->glyph->metrics.width;
+ extents->height = -ft_face->glyph->metrics.height;
+ if (font->x_scale < 0)
+ {
+ extents->x_bearing = -extents->x_bearing;
+ extents->width = -extents->width;
+ }
+ if (font->y_scale < 0)
+ {
+ extents->y_bearing = -extents->y_bearing;
+ extents->height = -extents->height;
+ }
+ return true;
+}
+
+static hb_bool_t
+hb_ft_get_glyph_contour_point (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t glyph,
+ unsigned int point_index,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ hb_lock_t lock (ft_font->lock);
+ FT_Face ft_face = ft_font->ft_face;
+
+ if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags)))
+ return false;
+
+ if (unlikely (ft_face->glyph->format != FT_GLYPH_FORMAT_OUTLINE))
+ return false;
+
+ if (unlikely (point_index >= (unsigned int) ft_face->glyph->outline.n_points))
+ return false;
+
+ *x = ft_face->glyph->outline.points[point_index].x;
+ *y = ft_face->glyph->outline.points[point_index].y;
+
+ return true;
+}
+
+static hb_bool_t
+hb_ft_get_glyph_name (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t glyph,
+ char *name, unsigned int size,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ hb_lock_t lock (ft_font->lock);
+ FT_Face ft_face = ft_font->ft_face;
+
+ hb_bool_t ret = !FT_Get_Glyph_Name (ft_face, glyph, name, size);
+ if (ret && (size && !*name))
+ ret = false;
+
+ return ret;
+}
+
+static hb_bool_t
+hb_ft_get_glyph_from_name (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ const char *name, int len, /* -1 means nul-terminated */
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ hb_lock_t lock (ft_font->lock);
+ FT_Face ft_face = ft_font->ft_face;
+
+ if (len < 0)
+ *glyph = FT_Get_Name_Index (ft_face, (FT_String *) name);
+ else {
+ /* Make a nul-terminated version. */
+ char buf[128];
+ len = hb_min (len, (int) sizeof (buf) - 1);
+ strncpy (buf, name, len);
+ buf[len] = '\0';
+ *glyph = FT_Get_Name_Index (ft_face, buf);
+ }
+
+ if (*glyph == 0)
+ {
+ /* Check whether the given name was actually the name of glyph 0. */
+ char buf[128];
+ if (!FT_Get_Glyph_Name(ft_face, 0, buf, sizeof (buf)) &&
+ len < 0 ? !strcmp (buf, name) : !strncmp (buf, name, len))
+ return true;
+ }
+
+ return *glyph != 0;
+}
+
+static hb_bool_t
+hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ hb_lock_t lock (ft_font->lock);
+ FT_Face ft_face = ft_font->ft_face;
+ metrics->ascender = FT_MulFix(ft_face->ascender, ft_face->size->metrics.y_scale);
+ metrics->descender = FT_MulFix(ft_face->descender, ft_face->size->metrics.y_scale);
+ metrics->line_gap = FT_MulFix( ft_face->height, ft_face->size->metrics.y_scale ) - (metrics->ascender - metrics->descender);
+ if (font->y_scale < 0)
+ {
+ metrics->ascender = -metrics->ascender;
+ metrics->descender = -metrics->descender;
+ metrics->line_gap = -metrics->line_gap;
+ }
+ return true;
+}
+
+#if HB_USE_ATEXIT
+static void free_static_ft_funcs ();
+#endif
+
+static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ft_font_funcs_lazy_loader_t>
+{
+ static hb_font_funcs_t *create ()
+ {
+ hb_font_funcs_t *funcs = hb_font_funcs_create ();
+
+ hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, nullptr, nullptr);
+ //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, nullptr, nullptr);
+ hb_font_funcs_set_nominal_glyph_func (funcs, hb_ft_get_nominal_glyph, nullptr, nullptr);
+ hb_font_funcs_set_nominal_glyphs_func (funcs, hb_ft_get_nominal_glyphs, nullptr, nullptr);
+ hb_font_funcs_set_variation_glyph_func (funcs, hb_ft_get_variation_glyph, nullptr, nullptr);
+ hb_font_funcs_set_glyph_h_advances_func (funcs, hb_ft_get_glyph_h_advances, nullptr, nullptr);
+ hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ft_get_glyph_v_advance, nullptr, nullptr);
+ //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ft_get_glyph_h_origin, nullptr, nullptr);
+ hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ft_get_glyph_v_origin, nullptr, nullptr);
+#ifndef HB_NO_OT_SHAPE_FALLBACK
+ hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ft_get_glyph_h_kerning, nullptr, nullptr);
+#endif
+ //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ft_get_glyph_v_kerning, nullptr, nullptr);
+ hb_font_funcs_set_glyph_extents_func (funcs, hb_ft_get_glyph_extents, nullptr, nullptr);
+ hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ft_get_glyph_contour_point, nullptr, nullptr);
+ hb_font_funcs_set_glyph_name_func (funcs, hb_ft_get_glyph_name, nullptr, nullptr);
+ hb_font_funcs_set_glyph_from_name_func (funcs, hb_ft_get_glyph_from_name, nullptr, nullptr);
+
+ hb_font_funcs_make_immutable (funcs);
+
+#if HB_USE_ATEXIT
+ atexit (free_static_ft_funcs);
+#endif
+
+ return funcs;
+ }
+} static_ft_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_ft_funcs ()
+{
+ static_ft_funcs.free_instance ();
+}
+#endif
+
+static hb_font_funcs_t *
+_hb_ft_get_font_funcs ()
+{
+ return static_ft_funcs.get_unconst ();
+}
+
+static void
+_hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref)
+{
+ bool symbol = ft_face->charmap && ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL;
+
+ hb_font_set_funcs (font,
+ _hb_ft_get_font_funcs (),
+ _hb_ft_font_create (ft_face, symbol, unref),
+ _hb_ft_font_destroy);
+}
+
+
+static hb_blob_t *
+_hb_ft_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
+{
+ FT_Face ft_face = (FT_Face) user_data;
+ FT_Byte *buffer;
+ FT_ULong length = 0;
+ FT_Error error;
+
+ /* Note: FreeType like HarfBuzz uses the NONE tag for fetching the entire blob */
+
+ error = FT_Load_Sfnt_Table (ft_face, tag, 0, nullptr, &length);
+ if (error)
+ return nullptr;
+
+ buffer = (FT_Byte *) malloc (length);
+ if (!buffer)
+ return nullptr;
+
+ error = FT_Load_Sfnt_Table (ft_face, tag, 0, buffer, &length);
+ if (error)
+ {
+ free (buffer);
+ return nullptr;
+ }
+
+ return hb_blob_create ((const char *) buffer, length,
+ HB_MEMORY_MODE_WRITABLE,
+ buffer, free);
+}
+
+/**
+ * hb_ft_face_create:
+ * @ft_face: (destroy destroy) (scope notified):
+ * @destroy:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ * Since: 0.9.2
+ **/
+hb_face_t *
+hb_ft_face_create (FT_Face ft_face,
+ hb_destroy_func_t destroy)
+{
+ hb_face_t *face;
+
+ if (!ft_face->stream->read) {
+ hb_blob_t *blob;
+
+ blob = hb_blob_create ((const char *) ft_face->stream->base,
+ (unsigned int) ft_face->stream->size,
+ HB_MEMORY_MODE_READONLY,
+ ft_face, destroy);
+ face = hb_face_create (blob, ft_face->face_index);
+ hb_blob_destroy (blob);
+ } else {
+ face = hb_face_create_for_tables (_hb_ft_reference_table, ft_face, destroy);
+ }
+
+ hb_face_set_index (face, ft_face->face_index);
+ hb_face_set_upem (face, ft_face->units_per_EM);
+
+ return face;
+}
+
+/**
+ * hb_ft_face_create_referenced:
+ * @ft_face:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ * Since: 0.9.38
+ **/
+hb_face_t *
+hb_ft_face_create_referenced (FT_Face ft_face)
+{
+ FT_Reference_Face (ft_face);
+ return hb_ft_face_create (ft_face, _hb_ft_face_destroy);
+}
+
+static void
+hb_ft_face_finalize (FT_Face ft_face)
+{
+ hb_face_destroy ((hb_face_t *) ft_face->generic.data);
+}
+
+/**
+ * hb_ft_face_create_cached:
+ * @ft_face:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ * Since: 0.9.2
+ **/
+hb_face_t *
+hb_ft_face_create_cached (FT_Face ft_face)
+{
+ if (unlikely (!ft_face->generic.data || ft_face->generic.finalizer != (FT_Generic_Finalizer) hb_ft_face_finalize))
+ {
+ if (ft_face->generic.finalizer)
+ ft_face->generic.finalizer (ft_face);
+
+ ft_face->generic.data = hb_ft_face_create (ft_face, nullptr);
+ ft_face->generic.finalizer = (FT_Generic_Finalizer) hb_ft_face_finalize;
+ }
+
+ return hb_face_reference ((hb_face_t *) ft_face->generic.data);
+}
+
+
+/**
+ * hb_ft_font_create:
+ * @ft_face: (destroy destroy) (scope notified):
+ * @destroy:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ * Since: 0.9.2
+ **/
+hb_font_t *
+hb_ft_font_create (FT_Face ft_face,
+ hb_destroy_func_t destroy)
+{
+ hb_font_t *font;
+ hb_face_t *face;
+
+ face = hb_ft_face_create (ft_face, destroy);
+ font = hb_font_create (face);
+ hb_face_destroy (face);
+ _hb_ft_font_set_funcs (font, ft_face, false);
+ hb_ft_font_changed (font);
+ return font;
+}
+
+void
+hb_ft_font_changed (hb_font_t *font)
+{
+ if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+ return;
+
+ hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data;
+ FT_Face ft_face = ft_font->ft_face;
+
+ hb_font_set_scale (font,
+ (int) (((uint64_t) ft_face->size->metrics.x_scale * (uint64_t) ft_face->units_per_EM + (1u<<15)) >> 16),
+ (int) (((uint64_t) ft_face->size->metrics.y_scale * (uint64_t) ft_face->units_per_EM + (1u<<15)) >> 16));
+#if 0 /* hb-ft works in no-hinting model */
+ hb_font_set_ppem (font,
+ ft_face->size->metrics.x_ppem,
+ ft_face->size->metrics.y_ppem);
+#endif
+
+#ifdef HAVE_FT_GET_VAR_BLEND_COORDINATES
+ FT_MM_Var *mm_var = nullptr;
+ if (!FT_Get_MM_Var (ft_face, &mm_var))
+ {
+ FT_Fixed *ft_coords = (FT_Fixed *) calloc (mm_var->num_axis, sizeof (FT_Fixed));
+ int *coords = (int *) calloc (mm_var->num_axis, sizeof (int));
+ if (coords && ft_coords)
+ {
+ if (!FT_Get_Var_Blend_Coordinates (ft_face, mm_var->num_axis, ft_coords))
+ {
+ bool nonzero = false;
+
+ for (unsigned int i = 0; i < mm_var->num_axis; ++i)
+ {
+ coords[i] = ft_coords[i] >>= 2;
+ nonzero = nonzero || coords[i];
+ }
+
+ if (nonzero)
+ hb_font_set_var_coords_normalized (font, coords, mm_var->num_axis);
+ else
+ hb_font_set_var_coords_normalized (font, nullptr, 0);
+ }
+ }
+ free (coords);
+ free (ft_coords);
+#ifdef HAVE_FT_DONE_MM_VAR
+ FT_Done_MM_Var (ft_face->glyph->library, mm_var);
+#else
+ free (mm_var);
+#endif
+ }
+#endif
+}
+
+/**
+ * hb_ft_font_create_referenced:
+ * @ft_face:
+ *
+ *
+ *
+ * Return value: (transfer full):
+ * Since: 0.9.38
+ **/
+hb_font_t *
+hb_ft_font_create_referenced (FT_Face ft_face)
+{
+ FT_Reference_Face (ft_face);
+ return hb_ft_font_create (ft_face, _hb_ft_face_destroy);
+}
+
+#if HB_USE_ATEXIT
+static void free_static_ft_library ();
+#endif
+
+static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<FT_Library>,
+ hb_ft_library_lazy_loader_t>
+{
+ static FT_Library create ()
+ {
+ FT_Library l;
+ if (FT_Init_FreeType (&l))
+ return nullptr;
+
+#if HB_USE_ATEXIT
+ atexit (free_static_ft_library);
+#endif
+
+ return l;
+ }
+ static void destroy (FT_Library l)
+ {
+ FT_Done_FreeType (l);
+ }
+ static FT_Library get_null ()
+ {
+ return nullptr;
+ }
+} static_ft_library;
+
+#if HB_USE_ATEXIT
+static
+void free_static_ft_library ()
+{
+ static_ft_library.free_instance ();
+}
+#endif
+
+static FT_Library
+get_ft_library ()
+{
+ return static_ft_library.get_unconst ();
+}
+
+static void
+_release_blob (FT_Face ft_face)
+{
+ hb_blob_destroy ((hb_blob_t *) ft_face->generic.data);
+}
+
+void
+hb_ft_font_set_funcs (hb_font_t *font)
+{
+ hb_blob_t *blob = hb_face_reference_blob (font->face);
+ unsigned int blob_length;
+ const char *blob_data = hb_blob_get_data (blob, &blob_length);
+ if (unlikely (!blob_length))
+ DEBUG_MSG (FT, font, "Font face has empty blob");
+
+ FT_Face ft_face = nullptr;
+ FT_Error err = FT_New_Memory_Face (get_ft_library (),
+ (const FT_Byte *) blob_data,
+ blob_length,
+ hb_face_get_index (font->face),
+ &ft_face);
+
+ if (unlikely (err)) {
+ hb_blob_destroy (blob);
+ DEBUG_MSG (FT, font, "Font face FT_New_Memory_Face() failed");
+ return;
+ }
+
+ if (FT_Select_Charmap (ft_face, FT_ENCODING_MS_SYMBOL))
+ FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE);
+
+ FT_Set_Char_Size (ft_face,
+ abs (font->x_scale), abs (font->y_scale),
+ 0, 0);
+#if 0
+ font->x_ppem * 72 * 64 / font->x_scale,
+ font->y_ppem * 72 * 64 / font->y_scale);
+#endif
+ if (font->x_scale < 0 || font->y_scale < 0)
+ {
+ FT_Matrix matrix = { font->x_scale < 0 ? -1 : +1, 0,
+ 0, font->y_scale < 0 ? -1 : +1};
+ FT_Set_Transform (ft_face, &matrix, nullptr);
+ }
+
+#ifdef HAVE_FT_SET_VAR_BLEND_COORDINATES
+ unsigned int num_coords;
+ const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
+ if (num_coords)
+ {
+ FT_Fixed *ft_coords = (FT_Fixed *) calloc (num_coords, sizeof (FT_Fixed));
+ if (ft_coords)
+ {
+ for (unsigned int i = 0; i < num_coords; i++)
+ ft_coords[i] = coords[i] * 4;
+ FT_Set_Var_Blend_Coordinates (ft_face, num_coords, ft_coords);
+ free (ft_coords);
+ }
+ }
+#endif
+
+ ft_face->generic.data = blob;
+ ft_face->generic.finalizer = (FT_Generic_Finalizer) _release_blob;
+
+ _hb_ft_font_set_funcs (font, ft_face, true);
+ hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING);
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ft.h b/src/3rdparty/harfbuzz-ng/src/hb-ft.h
new file mode 100644
index 0000000000..94013eeb91
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ft.h
@@ -0,0 +1,132 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ * Copyright © 2015 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_FT_H
+#define HB_FT_H
+
+#include "hb.h"
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+HB_BEGIN_DECLS
+
+/*
+ * Note: FreeType is not thread-safe.
+ * Hence, these functions are not either.
+ */
+
+/*
+ * hb-face from ft-face.
+ */
+
+/* This one creates a new hb-face for given ft-face.
+ * When the returned hb-face is destroyed, the destroy
+ * callback is called (if not NULL), with the ft-face passed
+ * to it.
+ *
+ * The client is responsible to make sure that ft-face is
+ * destroyed after hb-face is destroyed.
+ *
+ * Most often you don't want this function. You should use either
+ * hb_ft_face_create_cached(), or hb_ft_face_create_referenced().
+ * In particular, if you are going to pass NULL as destroy, you
+ * probably should use (the more recent) hb_ft_face_create_referenced()
+ * instead.
+ */
+HB_EXTERN hb_face_t *
+hb_ft_face_create (FT_Face ft_face,
+ hb_destroy_func_t destroy);
+
+/* This version is like hb_ft_face_create(), except that it caches
+ * the hb-face using the generic pointer of the ft-face. This means
+ * that subsequent calls to this function with the same ft-face will
+ * return the same hb-face (correctly referenced).
+ *
+ * Client is still responsible for making sure that ft-face is destroyed
+ * after hb-face is.
+ */
+HB_EXTERN hb_face_t *
+hb_ft_face_create_cached (FT_Face ft_face);
+
+/* This version is like hb_ft_face_create(), except that it calls
+ * FT_Reference_Face() on ft-face, as such keeping ft-face alive
+ * as long as the hb-face is.
+ *
+ * This is the most convenient version to use. Use it unless you have
+ * very good reasons not to.
+ */
+HB_EXTERN hb_face_t *
+hb_ft_face_create_referenced (FT_Face ft_face);
+
+
+/*
+ * hb-font from ft-face.
+ */
+
+/*
+ * Note:
+ *
+ * Set face size on ft-face before creating hb-font from it.
+ * Otherwise hb-ft would NOT pick up the font size correctly.
+ */
+
+/* See notes on hb_ft_face_create(). Same issues re lifecycle-management
+ * apply here. Use hb_ft_font_create_referenced() if you can. */
+HB_EXTERN hb_font_t *
+hb_ft_font_create (FT_Face ft_face,
+ hb_destroy_func_t destroy);
+
+/* See notes on hb_ft_face_create_referenced() re lifecycle-management
+ * issues. */
+HB_EXTERN hb_font_t *
+hb_ft_font_create_referenced (FT_Face ft_face);
+
+HB_EXTERN FT_Face
+hb_ft_font_get_face (hb_font_t *font);
+
+HB_EXTERN void
+hb_ft_font_set_load_flags (hb_font_t *font, int load_flags);
+
+HB_EXTERN int
+hb_ft_font_get_load_flags (hb_font_t *font);
+
+/* Call when size or variations settings on underlying FT_Face change. */
+HB_EXTERN void
+hb_ft_font_changed (hb_font_t *font);
+
+/* Makes an hb_font_t use FreeType internally to implement font functions.
+ * Note: this internally creates an FT_Face. Use it when you create your
+ * hb_face_t using hb_face_create(). */
+HB_EXTERN void
+hb_ft_font_set_funcs (hb_font_t *font);
+
+
+HB_END_DECLS
+
+#endif /* HB_FT_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-gdi.cc b/src/3rdparty/harfbuzz-ng/src/hb-gdi.cc
new file mode 100644
index 0000000000..f6306ef89f
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-gdi.cc
@@ -0,0 +1,73 @@
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb.hh"
+
+#ifdef HAVE_GDI
+
+#include "hb-gdi.h"
+
+static hb_blob_t *
+_hb_gdi_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
+{
+ char *buffer = nullptr;
+ DWORD length = 0;
+
+ HDC hdc = GetDC (nullptr);
+ if (unlikely (!SelectObject (hdc, (HFONT) user_data))) goto fail;
+
+ length = GetFontData (hdc, hb_uint32_swap (tag), 0, buffer, length);
+ if (unlikely (length == GDI_ERROR)) goto fail_with_releasedc;
+
+ buffer = (char *) malloc (length);
+ if (unlikely (!buffer)) goto fail_with_releasedc;
+ length = GetFontData (hdc, hb_uint32_swap (tag), 0, buffer, length);
+ if (unlikely (length == GDI_ERROR)) goto fail_with_releasedc_and_free;
+ ReleaseDC (nullptr, hdc);
+
+ return hb_blob_create ((const char *) buffer, length, HB_MEMORY_MODE_WRITABLE, buffer, free);
+
+fail_with_releasedc_and_free:
+ free (buffer);
+fail_with_releasedc:
+ ReleaseDC (nullptr, hdc);
+fail:
+ return hb_blob_get_empty ();
+}
+
+/**
+ * hb_gdi_face_create:
+ * @hfont: a HFONT object.
+ *
+ * Return value: #hb_face_t object corresponding to the given input
+ *
+ * Since: 2.6.0
+ **/
+hb_face_t *
+hb_gdi_face_create (HFONT hfont)
+{
+ return hb_face_create_for_tables (_hb_gdi_reference_table, (void *) hfont, nullptr);
+}
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-gdi.h b/src/3rdparty/harfbuzz-ng/src/hb-gdi.h
new file mode 100644
index 0000000000..68cc43917e
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-gdi.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_GDI_H
+#define HB_GDI_H
+
+#include "hb.h"
+
+#include <windows.h>
+
+HB_BEGIN_DECLS
+
+HB_EXTERN hb_face_t *
+hb_gdi_face_create (HFONT hfont);
+
+HB_END_DECLS
+
+#endif /* HB_GDI_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-glib.cc b/src/3rdparty/harfbuzz-ng/src/hb-glib.cc
new file mode 100644
index 0000000000..db02b6760e
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-glib.cc
@@ -0,0 +1,411 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifdef HAVE_GLIB
+
+#include "hb-glib.h"
+
+#include "hb-machinery.hh"
+
+
+/**
+ * SECTION:hb-glib
+ * @title: hb-glib
+ * @short_description: GLib integration
+ * @include: hb-glib.h
+ *
+ * Functions for using HarfBuzz with the GLib library to provide Unicode data.
+ **/
+
+
+#if !GLIB_CHECK_VERSION(2,29,14)
+static const hb_script_t
+glib_script_to_script[] =
+{
+ HB_SCRIPT_COMMON,
+ HB_SCRIPT_INHERITED,
+ HB_SCRIPT_ARABIC,
+ HB_SCRIPT_ARMENIAN,
+ HB_SCRIPT_BENGALI,
+ HB_SCRIPT_BOPOMOFO,
+ HB_SCRIPT_CHEROKEE,
+ HB_SCRIPT_COPTIC,
+ HB_SCRIPT_CYRILLIC,
+ HB_SCRIPT_DESERET,
+ HB_SCRIPT_DEVANAGARI,
+ HB_SCRIPT_ETHIOPIC,
+ HB_SCRIPT_GEORGIAN,
+ HB_SCRIPT_GOTHIC,
+ HB_SCRIPT_GREEK,
+ HB_SCRIPT_GUJARATI,
+ HB_SCRIPT_GURMUKHI,
+ HB_SCRIPT_HAN,
+ HB_SCRIPT_HANGUL,
+ HB_SCRIPT_HEBREW,
+ HB_SCRIPT_HIRAGANA,
+ HB_SCRIPT_KANNADA,
+ HB_SCRIPT_KATAKANA,
+ HB_SCRIPT_KHMER,
+ HB_SCRIPT_LAO,
+ HB_SCRIPT_LATIN,
+ HB_SCRIPT_MALAYALAM,
+ HB_SCRIPT_MONGOLIAN,
+ HB_SCRIPT_MYANMAR,
+ HB_SCRIPT_OGHAM,
+ HB_SCRIPT_OLD_ITALIC,
+ HB_SCRIPT_ORIYA,
+ HB_SCRIPT_RUNIC,
+ HB_SCRIPT_SINHALA,
+ HB_SCRIPT_SYRIAC,
+ HB_SCRIPT_TAMIL,
+ HB_SCRIPT_TELUGU,
+ HB_SCRIPT_THAANA,
+ HB_SCRIPT_THAI,
+ HB_SCRIPT_TIBETAN,
+ HB_SCRIPT_CANADIAN_SYLLABICS,
+ HB_SCRIPT_YI,
+ HB_SCRIPT_TAGALOG,
+ HB_SCRIPT_HANUNOO,
+ HB_SCRIPT_BUHID,
+ HB_SCRIPT_TAGBANWA,
+
+ /* Unicode-4.0 additions */
+ HB_SCRIPT_BRAILLE,
+ HB_SCRIPT_CYPRIOT,
+ HB_SCRIPT_LIMBU,
+ HB_SCRIPT_OSMANYA,
+ HB_SCRIPT_SHAVIAN,
+ HB_SCRIPT_LINEAR_B,
+ HB_SCRIPT_TAI_LE,
+ HB_SCRIPT_UGARITIC,
+
+ /* Unicode-4.1 additions */
+ HB_SCRIPT_NEW_TAI_LUE,
+ HB_SCRIPT_BUGINESE,
+ HB_SCRIPT_GLAGOLITIC,
+ HB_SCRIPT_TIFINAGH,
+ HB_SCRIPT_SYLOTI_NAGRI,
+ HB_SCRIPT_OLD_PERSIAN,
+ HB_SCRIPT_KHAROSHTHI,
+
+ /* Unicode-5.0 additions */
+ HB_SCRIPT_UNKNOWN,
+ HB_SCRIPT_BALINESE,
+ HB_SCRIPT_CUNEIFORM,
+ HB_SCRIPT_PHOENICIAN,
+ HB_SCRIPT_PHAGS_PA,
+ HB_SCRIPT_NKO,
+
+ /* Unicode-5.1 additions */
+ HB_SCRIPT_KAYAH_LI,
+ HB_SCRIPT_LEPCHA,
+ HB_SCRIPT_REJANG,
+ HB_SCRIPT_SUNDANESE,
+ HB_SCRIPT_SAURASHTRA,
+ HB_SCRIPT_CHAM,
+ HB_SCRIPT_OL_CHIKI,
+ HB_SCRIPT_VAI,
+ HB_SCRIPT_CARIAN,
+ HB_SCRIPT_LYCIAN,
+ HB_SCRIPT_LYDIAN,
+
+ /* Unicode-5.2 additions */
+ HB_SCRIPT_AVESTAN,
+ HB_SCRIPT_BAMUM,
+ HB_SCRIPT_EGYPTIAN_HIEROGLYPHS,
+ HB_SCRIPT_IMPERIAL_ARAMAIC,
+ HB_SCRIPT_INSCRIPTIONAL_PAHLAVI,
+ HB_SCRIPT_INSCRIPTIONAL_PARTHIAN,
+ HB_SCRIPT_JAVANESE,
+ HB_SCRIPT_KAITHI,
+ HB_SCRIPT_TAI_THAM,
+ HB_SCRIPT_LISU,
+ HB_SCRIPT_MEETEI_MAYEK,
+ HB_SCRIPT_OLD_SOUTH_ARABIAN,
+ HB_SCRIPT_OLD_TURKIC,
+ HB_SCRIPT_SAMARITAN,
+ HB_SCRIPT_TAI_VIET,
+
+ /* Unicode-6.0 additions */
+ HB_SCRIPT_BATAK,
+ HB_SCRIPT_BRAHMI,
+ HB_SCRIPT_MANDAIC,
+
+ /* Unicode-6.1 additions */
+ HB_SCRIPT_CHAKMA,
+ HB_SCRIPT_MEROITIC_CURSIVE,
+ HB_SCRIPT_MEROITIC_HIEROGLYPHS,
+ HB_SCRIPT_MIAO,
+ HB_SCRIPT_SHARADA,
+ HB_SCRIPT_SORA_SOMPENG,
+ HB_SCRIPT_TAKRI
+};
+#endif
+
+hb_script_t
+hb_glib_script_to_script (GUnicodeScript script)
+{
+#if GLIB_CHECK_VERSION(2,29,14)
+ return (hb_script_t) g_unicode_script_to_iso15924 (script);
+#else
+ if (likely ((unsigned int) script < ARRAY_LENGTH (glib_script_to_script)))
+ return glib_script_to_script[script];
+
+ if (unlikely (script == G_UNICODE_SCRIPT_INVALID_CODE))
+ return HB_SCRIPT_INVALID;
+
+ return HB_SCRIPT_UNKNOWN;
+#endif
+}
+
+GUnicodeScript
+hb_glib_script_from_script (hb_script_t script)
+{
+#if GLIB_CHECK_VERSION(2,29,14)
+ return g_unicode_script_from_iso15924 (script);
+#else
+ unsigned int count = ARRAY_LENGTH (glib_script_to_script);
+ for (unsigned int i = 0; i < count; i++)
+ if (glib_script_to_script[i] == script)
+ return (GUnicodeScript) i;
+
+ if (unlikely (script == HB_SCRIPT_INVALID))
+ return G_UNICODE_SCRIPT_INVALID_CODE;
+
+ return G_UNICODE_SCRIPT_UNKNOWN;
+#endif
+}
+
+
+static hb_unicode_combining_class_t
+hb_glib_unicode_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+
+{
+ return (hb_unicode_combining_class_t) g_unichar_combining_class (unicode);
+}
+
+static hb_unicode_general_category_t
+hb_glib_unicode_general_category (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+
+{
+ /* hb_unicode_general_category_t and GUnicodeType are identical */
+ return (hb_unicode_general_category_t) g_unichar_type (unicode);
+}
+
+static hb_codepoint_t
+hb_glib_unicode_mirroring (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+{
+ g_unichar_get_mirror_char (unicode, &unicode);
+ return unicode;
+}
+
+static hb_script_t
+hb_glib_unicode_script (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+{
+ return hb_glib_script_to_script (g_unichar_get_script (unicode));
+}
+
+static hb_bool_t
+hb_glib_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t a,
+ hb_codepoint_t b,
+ hb_codepoint_t *ab,
+ void *user_data HB_UNUSED)
+{
+#if GLIB_CHECK_VERSION(2,29,12)
+ return g_unichar_compose (a, b, ab);
+#endif
+
+ /* We don't ifdef-out the fallback code such that compiler always
+ * sees it and makes sure it's compilable. */
+
+ gchar utf8[12];
+ gchar *normalized;
+ int len;
+ hb_bool_t ret;
+
+ len = g_unichar_to_utf8 (a, utf8);
+ len += g_unichar_to_utf8 (b, utf8 + len);
+ normalized = g_utf8_normalize (utf8, len, G_NORMALIZE_NFC);
+ len = g_utf8_strlen (normalized, -1);
+ if (unlikely (!len))
+ return false;
+
+ if (len == 1) {
+ *ab = g_utf8_get_char (normalized);
+ ret = true;
+ } else {
+ ret = false;
+ }
+
+ g_free (normalized);
+ return ret;
+}
+
+static hb_bool_t
+hb_glib_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t ab,
+ hb_codepoint_t *a,
+ hb_codepoint_t *b,
+ void *user_data HB_UNUSED)
+{
+#if GLIB_CHECK_VERSION(2,29,12)
+ return g_unichar_decompose (ab, a, b);
+#endif
+
+ /* We don't ifdef-out the fallback code such that compiler always
+ * sees it and makes sure it's compilable. */
+
+ gchar utf8[6];
+ gchar *normalized;
+ int len;
+ hb_bool_t ret;
+
+ len = g_unichar_to_utf8 (ab, utf8);
+ normalized = g_utf8_normalize (utf8, len, G_NORMALIZE_NFD);
+ len = g_utf8_strlen (normalized, -1);
+ if (unlikely (!len))
+ return false;
+
+ if (len == 1) {
+ *a = g_utf8_get_char (normalized);
+ *b = 0;
+ ret = *a != ab;
+ } else if (len == 2) {
+ *a = g_utf8_get_char (normalized);
+ *b = g_utf8_get_char (g_utf8_next_char (normalized));
+ /* Here's the ugly part: if ab decomposes to a single character and
+ * that character decomposes again, we have to detect that and undo
+ * the second part :-(. */
+ gchar *recomposed = g_utf8_normalize (normalized, -1, G_NORMALIZE_NFC);
+ hb_codepoint_t c = g_utf8_get_char (recomposed);
+ if (c != ab && c != *a) {
+ *a = c;
+ *b = 0;
+ }
+ g_free (recomposed);
+ ret = true;
+ } else {
+ /* If decomposed to more than two characters, take the last one,
+ * and recompose the rest to get the first component. */
+ gchar *end = g_utf8_offset_to_pointer (normalized, len - 1);
+ gchar *recomposed;
+ *b = g_utf8_get_char (end);
+ recomposed = g_utf8_normalize (normalized, end - normalized, G_NORMALIZE_NFC);
+ /* We expect that recomposed has exactly one character now. */
+ *a = g_utf8_get_char (recomposed);
+ g_free (recomposed);
+ ret = true;
+ }
+
+ g_free (normalized);
+ return ret;
+}
+
+
+#if HB_USE_ATEXIT
+static void free_static_glib_funcs ();
+#endif
+
+static struct hb_glib_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_glib_unicode_funcs_lazy_loader_t>
+{
+ static hb_unicode_funcs_t *create ()
+ {
+ hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr);
+
+ hb_unicode_funcs_set_combining_class_func (funcs, hb_glib_unicode_combining_class, nullptr, nullptr);
+ hb_unicode_funcs_set_general_category_func (funcs, hb_glib_unicode_general_category, nullptr, nullptr);
+ hb_unicode_funcs_set_mirroring_func (funcs, hb_glib_unicode_mirroring, nullptr, nullptr);
+ hb_unicode_funcs_set_script_func (funcs, hb_glib_unicode_script, nullptr, nullptr);
+ hb_unicode_funcs_set_compose_func (funcs, hb_glib_unicode_compose, nullptr, nullptr);
+ hb_unicode_funcs_set_decompose_func (funcs, hb_glib_unicode_decompose, nullptr, nullptr);
+
+ hb_unicode_funcs_make_immutable (funcs);
+
+#if HB_USE_ATEXIT
+ atexit (free_static_glib_funcs);
+#endif
+
+ return funcs;
+ }
+} static_glib_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_glib_funcs ()
+{
+ static_glib_funcs.free_instance ();
+}
+#endif
+
+hb_unicode_funcs_t *
+hb_glib_get_unicode_funcs ()
+{
+ return static_glib_funcs.get_unconst ();
+}
+
+
+
+#if GLIB_CHECK_VERSION(2,31,10)
+
+static void
+_hb_g_bytes_unref (void *data)
+{
+ g_bytes_unref ((GBytes *) data);
+}
+
+/**
+ * hb_glib_blob_create:
+ *
+ * Since: 0.9.38
+ **/
+hb_blob_t *
+hb_glib_blob_create (GBytes *gbytes)
+{
+ gsize size = 0;
+ gconstpointer data = g_bytes_get_data (gbytes, &size);
+ return hb_blob_create ((const char *) data,
+ size,
+ HB_MEMORY_MODE_READONLY,
+ g_bytes_ref (gbytes),
+ _hb_g_bytes_unref);
+}
+#endif
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-glib.h b/src/3rdparty/harfbuzz-ng/src/hb-glib.h
new file mode 100644
index 0000000000..5f04183ba1
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-glib.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_GLIB_H
+#define HB_GLIB_H
+
+#include "hb.h"
+
+#include <glib.h>
+
+HB_BEGIN_DECLS
+
+
+HB_EXTERN hb_script_t
+hb_glib_script_to_script (GUnicodeScript script);
+
+HB_EXTERN GUnicodeScript
+hb_glib_script_from_script (hb_script_t script);
+
+
+HB_EXTERN hb_unicode_funcs_t *
+hb_glib_get_unicode_funcs (void);
+
+#if GLIB_CHECK_VERSION(2,31,10)
+HB_EXTERN hb_blob_t *
+hb_glib_blob_create (GBytes *gbytes);
+#endif
+
+HB_END_DECLS
+
+#endif /* HB_GLIB_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-gobject-enums.cc.tmpl b/src/3rdparty/harfbuzz-ng/src/hb-gobject-enums.cc.tmpl
new file mode 100644
index 0000000000..17f1adeb1d
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-gobject-enums.cc.tmpl
@@ -0,0 +1,80 @@
+/*** BEGIN file-header ***/
+/*
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifdef HAVE_GOBJECT
+
+/* g++ didn't like older gtype.h gcc-only code path. */
+#include <glib.h>
+#if !GLIB_CHECK_VERSION(2,29,16)
+#undef __GNUC__
+#undef __GNUC_MINOR__
+#define __GNUC__ 2
+#define __GNUC_MINOR__ 6
+#endif
+
+#include "hb-gobject.h"
+
+/*** END file-header ***/
+
+/*** BEGIN file-production ***/
+/* enumerations from "@filename@" */
+/*** END file-production ***/
+
+/*** BEGIN file-tail ***/
+
+#endif
+/*** END file-tail ***/
+
+/*** BEGIN value-header ***/
+GType
+@enum_name@_get_type ()
+{
+ static gsize type_id = 0;
+
+ if (g_once_init_enter (&type_id))
+ {
+ static const G@Type@Value values[] = {
+/*** END value-header ***/
+
+/*** BEGIN value-production ***/
+ { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
+/*** END value-production ***/
+
+/*** BEGIN value-tail ***/
+ { 0, NULL, NULL }
+ };
+ GType id =
+ g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
+ g_once_init_leave (&type_id, id);
+ }
+
+ return type_id;
+}
+
+/*** END value-tail ***/
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-gobject-enums.h.tmpl b/src/3rdparty/harfbuzz-ng/src/hb-gobject-enums.h.tmpl
new file mode 100644
index 0000000000..7ef9dfc029
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-gobject-enums.h.tmpl
@@ -0,0 +1,56 @@
+/*** BEGIN file-header ***/
+/*
+ * Copyright © 2013 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_GOBJECT_H_IN
+#error "Include <hb-gobject.h> instead."
+#endif
+
+#ifndef HB_GOBJECT_ENUMS_H
+#define HB_GOBJECT_ENUMS_H
+
+#include "hb.h"
+
+#include <glib-object.h>
+
+HB_BEGIN_DECLS
+
+
+/*** END file-header ***/
+
+/*** BEGIN value-header ***/
+HB_EXTERN GType
+@enum_name@_get_type () G_GNUC_CONST;
+#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())
+
+/*** END value-header ***/
+
+/*** BEGIN file-tail ***/
+
+HB_END_DECLS
+
+#endif /* HB_GOBJECT_ENUMS_H */
+/*** END file-tail ***/
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc b/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc
new file mode 100644
index 0000000000..7f4922ef19
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc
@@ -0,0 +1,101 @@
+/*
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifdef HAVE_GOBJECT
+
+
+/**
+ * SECTION:hb-gobject
+ * @title: hb-gobject
+ * @short_description: GObject integration
+ * @include: hb-gobject.h
+ *
+ * Functions for using HarfBuzz with the GObject library to provide
+ * type data.
+ **/
+
+
+/* g++ didn't like older gtype.h gcc-only code path. */
+#include <glib.h>
+#if !GLIB_CHECK_VERSION(2,29,16)
+#undef __GNUC__
+#undef __GNUC_MINOR__
+#define __GNUC__ 2
+#define __GNUC_MINOR__ 6
+#endif
+
+#include "hb-gobject.h"
+
+#define HB_DEFINE_BOXED_TYPE(name,copy_func,free_func) \
+GType \
+hb_gobject_##name##_get_type () \
+{ \
+ static gsize type_id = 0; \
+ if (g_once_init_enter (&type_id)) { \
+ GType id = g_boxed_type_register_static (g_intern_static_string ("hb_" #name "_t"), \
+ (GBoxedCopyFunc) copy_func, \
+ (GBoxedFreeFunc) free_func); \
+ g_once_init_leave (&type_id, id); \
+ } \
+ return type_id; \
+}
+
+#define HB_DEFINE_OBJECT_TYPE(name) \
+ HB_DEFINE_BOXED_TYPE (name, hb_##name##_reference, hb_##name##_destroy)
+
+#define HB_DEFINE_VALUE_TYPE(name) \
+ static hb_##name##_t *_hb_##name##_reference (const hb_##name##_t *l) \
+ { \
+ hb_##name##_t *c = (hb_##name##_t *) calloc (1, sizeof (hb_##name##_t)); \
+ if (unlikely (!c)) return nullptr; \
+ *c = *l; \
+ return c; \
+ } \
+ static void _hb_##name##_destroy (hb_##name##_t *l) { free (l); } \
+ HB_DEFINE_BOXED_TYPE (name, _hb_##name##_reference, _hb_##name##_destroy)
+
+HB_DEFINE_OBJECT_TYPE (buffer)
+HB_DEFINE_OBJECT_TYPE (blob)
+HB_DEFINE_OBJECT_TYPE (face)
+HB_DEFINE_OBJECT_TYPE (font)
+HB_DEFINE_OBJECT_TYPE (font_funcs)
+HB_DEFINE_OBJECT_TYPE (set)
+HB_DEFINE_OBJECT_TYPE (map)
+HB_DEFINE_OBJECT_TYPE (shape_plan)
+HB_DEFINE_OBJECT_TYPE (unicode_funcs)
+HB_DEFINE_VALUE_TYPE (feature)
+HB_DEFINE_VALUE_TYPE (glyph_info)
+HB_DEFINE_VALUE_TYPE (glyph_position)
+HB_DEFINE_VALUE_TYPE (segment_properties)
+HB_DEFINE_VALUE_TYPE (user_data_key)
+
+HB_DEFINE_VALUE_TYPE (ot_math_glyph_variant)
+HB_DEFINE_VALUE_TYPE (ot_math_glyph_part)
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.h b/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.h
new file mode 100644
index 0000000000..800beede0f
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_GOBJECT_H_IN
+#error "Include <hb-gobject.h> instead."
+#endif
+
+#ifndef HB_GOBJECT_STRUCTS_H
+#define HB_GOBJECT_STRUCTS_H
+
+#include "hb.h"
+
+#include <glib-object.h>
+
+HB_BEGIN_DECLS
+
+
+/* Object types */
+
+/**
+ * hb_gobject_blob_get_type:
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN GType
+hb_gobject_blob_get_type (void);
+#define HB_GOBJECT_TYPE_BLOB (hb_gobject_blob_get_type ())
+
+/**
+ * hb_gobject_buffer_get_type:
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN GType
+hb_gobject_buffer_get_type (void);
+#define HB_GOBJECT_TYPE_BUFFER (hb_gobject_buffer_get_type ())
+
+/**
+ * hb_gobject_face_get_type:
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN GType
+hb_gobject_face_get_type (void);
+#define HB_GOBJECT_TYPE_FACE (hb_gobject_face_get_type ())
+
+/**
+ * hb_gobject_font_get_type:
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN GType
+hb_gobject_font_get_type (void);
+#define HB_GOBJECT_TYPE_FONT (hb_gobject_font_get_type ())
+
+/**
+ * hb_gobject_font_funcs_get_type:
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN GType
+hb_gobject_font_funcs_get_type (void);
+#define HB_GOBJECT_TYPE_FONT_FUNCS (hb_gobject_font_funcs_get_type ())
+
+HB_EXTERN GType
+hb_gobject_set_get_type (void);
+#define HB_GOBJECT_TYPE_SET (hb_gobject_set_get_type ())
+
+HB_EXTERN GType
+hb_gobject_map_get_type (void);
+#define HB_GOBJECT_TYPE_MAP (hb_gobject_map_get_type ())
+
+HB_EXTERN GType
+hb_gobject_shape_plan_get_type (void);
+#define HB_GOBJECT_TYPE_SHAPE_PLAN (hb_gobject_shape_plan_get_type ())
+
+/**
+ * hb_gobject_unicode_funcs_get_type:
+ *
+ * Since: 0.9.2
+ **/
+HB_EXTERN GType
+hb_gobject_unicode_funcs_get_type (void);
+#define HB_GOBJECT_TYPE_UNICODE_FUNCS (hb_gobject_unicode_funcs_get_type ())
+
+/* Value types */
+
+HB_EXTERN GType
+hb_gobject_feature_get_type (void);
+#define HB_GOBJECT_TYPE_FEATURE (hb_gobject_feature_get_type ())
+
+HB_EXTERN GType
+hb_gobject_glyph_info_get_type (void);
+#define HB_GOBJECT_TYPE_GLYPH_INFO (hb_gobject_glyph_info_get_type ())
+
+HB_EXTERN GType
+hb_gobject_glyph_position_get_type (void);
+#define HB_GOBJECT_TYPE_GLYPH_POSITION (hb_gobject_glyph_position_get_type ())
+
+HB_EXTERN GType
+hb_gobject_segment_properties_get_type (void);
+#define HB_GOBJECT_TYPE_SEGMENT_PROPERTIES (hb_gobject_segment_properties_get_type ())
+
+HB_EXTERN GType
+hb_gobject_user_data_key_get_type (void);
+#define HB_GOBJECT_TYPE_USER_DATA_KEY (hb_gobject_user_data_key_get_type ())
+
+HB_EXTERN GType
+hb_gobject_ot_math_glyph_variant_get_type (void);
+#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT (hb_gobject_ot_math_glyph_variant_get_type ())
+
+HB_EXTERN GType
+hb_gobject_ot_math_glyph_part_get_type (void);
+#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART (hb_gobject_ot_math_glyph_part_get_type ())
+
+
+HB_END_DECLS
+
+#endif /* HB_GOBJECT_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-gobject.h b/src/3rdparty/harfbuzz-ng/src/hb-gobject.h
new file mode 100644
index 0000000000..ea1bd25df8
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-gobject.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_GOBJECT_H
+#define HB_GOBJECT_H
+#define HB_GOBJECT_H_IN
+
+#include "hb.h"
+
+#include "hb-gobject-enums.h"
+#include "hb-gobject-structs.h"
+
+HB_BEGIN_DECLS
+HB_END_DECLS
+
+#undef HB_GOBJECT_H_IN
+#endif /* HB_GOBJECT_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc b/src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc
new file mode 100644
index 0000000000..f0f2f8c736
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc
@@ -0,0 +1,430 @@
+/*
+ * Copyright © 2011 Martin Hosken
+ * Copyright © 2011 SIL International
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifdef HAVE_GRAPHITE2
+
+#include "hb-shaper-impl.hh"
+
+#include "hb-graphite2.h"
+
+#include <graphite2/Segment.h>
+
+#include "hb-ot-layout.h"
+
+
+/**
+ * SECTION:hb-graphite2
+ * @title: hb-graphite2
+ * @short_description: Graphite2 integration
+ * @include: hb-graphite2.h
+ *
+ * Functions for using HarfBuzz with the Graphite2 fonts.
+ **/
+
+
+/*
+ * shaper face data
+ */
+
+typedef struct hb_graphite2_tablelist_t
+{
+ struct hb_graphite2_tablelist_t *next;
+ hb_blob_t *blob;
+ unsigned int tag;
+} hb_graphite2_tablelist_t;
+
+struct hb_graphite2_face_data_t
+{
+ hb_face_t *face;
+ gr_face *grface;
+ hb_atomic_ptr_t<hb_graphite2_tablelist_t> tlist;
+};
+
+static const void *hb_graphite2_get_table (const void *data, unsigned int tag, size_t *len)
+{
+ hb_graphite2_face_data_t *face_data = (hb_graphite2_face_data_t *) data;
+ hb_graphite2_tablelist_t *tlist = face_data->tlist;
+
+ hb_blob_t *blob = nullptr;
+
+ for (hb_graphite2_tablelist_t *p = tlist; p; p = p->next)
+ if (p->tag == tag) {
+ blob = p->blob;
+ break;
+ }
+
+ if (unlikely (!blob))
+ {
+ blob = face_data->face->reference_table (tag);
+
+ hb_graphite2_tablelist_t *p = (hb_graphite2_tablelist_t *) calloc (1, sizeof (hb_graphite2_tablelist_t));
+ if (unlikely (!p)) {
+ hb_blob_destroy (blob);
+ return nullptr;
+ }
+ p->blob = blob;
+ p->tag = tag;
+
+retry:
+ hb_graphite2_tablelist_t *tlist = face_data->tlist;
+ p->next = tlist;
+
+ if (unlikely (!face_data->tlist.cmpexch (tlist, p)))
+ goto retry;
+ }
+
+ unsigned int tlen;
+ const char *d = hb_blob_get_data (blob, &tlen);
+ *len = tlen;
+ return d;
+}
+
+hb_graphite2_face_data_t *
+_hb_graphite2_shaper_face_data_create (hb_face_t *face)
+{
+ hb_blob_t *silf_blob = face->reference_table (HB_GRAPHITE2_TAG_SILF);
+ /* Umm, we just reference the table to check whether it exists.
+ * Maybe add better API for this? */
+ if (!hb_blob_get_length (silf_blob))
+ {
+ hb_blob_destroy (silf_blob);
+ return nullptr;
+ }
+ hb_blob_destroy (silf_blob);
+
+ hb_graphite2_face_data_t *data = (hb_graphite2_face_data_t *) calloc (1, sizeof (hb_graphite2_face_data_t));
+ if (unlikely (!data))
+ return nullptr;
+
+ data->face = face;
+ data->grface = gr_make_face (data, &hb_graphite2_get_table, gr_face_preloadAll);
+
+ if (unlikely (!data->grface)) {
+ free (data);
+ return nullptr;
+ }
+
+ return data;
+}
+
+void
+_hb_graphite2_shaper_face_data_destroy (hb_graphite2_face_data_t *data)
+{
+ hb_graphite2_tablelist_t *tlist = data->tlist;
+
+ while (tlist)
+ {
+ hb_graphite2_tablelist_t *old = tlist;
+ hb_blob_destroy (tlist->blob);
+ tlist = tlist->next;
+ free (old);
+ }
+
+ gr_face_destroy (data->grface);
+
+ free (data);
+}
+
+/*
+ * Since: 0.9.10
+ */
+gr_face *
+hb_graphite2_face_get_gr_face (hb_face_t *face)
+{
+ const hb_graphite2_face_data_t *data = face->data.graphite2;
+ return data ? data->grface : nullptr;
+}
+
+
+/*
+ * shaper font data
+ */
+
+struct hb_graphite2_font_data_t {};
+
+hb_graphite2_font_data_t *
+_hb_graphite2_shaper_font_data_create (hb_font_t *font HB_UNUSED)
+{
+ return (hb_graphite2_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
+}
+
+void
+_hb_graphite2_shaper_font_data_destroy (hb_graphite2_font_data_t *data HB_UNUSED)
+{
+}
+
+#ifndef HB_DISABLE_DEPRECATED
+/**
+ * hb_graphite2_font_get_gr_font:
+ *
+ * Since: 0.9.10
+ * Deprecated: 1.4.2
+ */
+gr_font *
+hb_graphite2_font_get_gr_font (hb_font_t *font HB_UNUSED)
+{
+ return nullptr;
+}
+#endif
+
+
+/*
+ * shaper
+ */
+
+struct hb_graphite2_cluster_t {
+ unsigned int base_char;
+ unsigned int num_chars;
+ unsigned int base_glyph;
+ unsigned int num_glyphs;
+ unsigned int cluster;
+ unsigned int advance;
+};
+
+hb_bool_t
+_hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
+ hb_font_t *font,
+ hb_buffer_t *buffer,
+ const hb_feature_t *features,
+ unsigned int num_features)
+{
+ hb_face_t *face = font->face;
+ gr_face *grface = face->data.graphite2->grface;
+
+ const char *lang = hb_language_to_string (hb_buffer_get_language (buffer));
+ const char *lang_end = lang ? strchr (lang, '-') : nullptr;
+ int lang_len = lang_end ? lang_end - lang : -1;
+ gr_feature_val *feats = gr_face_featureval_for_lang (grface, lang ? hb_tag_from_string (lang, lang_len) : 0);
+
+ for (unsigned int i = 0; i < num_features; i++)
+ {
+ const gr_feature_ref *fref = gr_face_find_fref (grface, features[i].tag);
+ if (fref)
+ gr_fref_set_feature_value (fref, features[i].value, feats);
+ }
+
+ gr_segment *seg = nullptr;
+ const gr_slot *is;
+ unsigned int ci = 0, ic = 0;
+ unsigned int curradvx = 0, curradvy = 0;
+
+ unsigned int scratch_size;
+ hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size);
+
+ uint32_t *chars = (uint32_t *) scratch;
+
+ for (unsigned int i = 0; i < buffer->len; ++i)
+ chars[i] = buffer->info[i].codepoint;
+
+ /* TODO ensure_native_direction. */
+
+ hb_tag_t script_tag[HB_OT_MAX_TAGS_PER_SCRIPT];
+ unsigned int count = HB_OT_MAX_TAGS_PER_SCRIPT;
+ hb_ot_tags_from_script_and_language (hb_buffer_get_script (buffer),
+ HB_LANGUAGE_INVALID,
+ &count,
+ script_tag,
+ nullptr, nullptr);
+
+ seg = gr_make_seg (nullptr, grface,
+ count ? script_tag[count - 1] : HB_OT_TAG_DEFAULT_SCRIPT,
+ feats,
+ gr_utf32, chars, buffer->len,
+ 2 | (hb_buffer_get_direction (buffer) == HB_DIRECTION_RTL ? 1 : 0));
+
+ if (unlikely (!seg)) {
+ if (feats) gr_featureval_destroy (feats);
+ return false;
+ }
+
+ unsigned int glyph_count = gr_seg_n_slots (seg);
+ if (unlikely (!glyph_count)) {
+ if (feats) gr_featureval_destroy (feats);
+ gr_seg_destroy (seg);
+ buffer->len = 0;
+ return true;
+ }
+
+ buffer->ensure (glyph_count);
+ scratch = buffer->get_scratch_buffer (&scratch_size);
+ while ((DIV_CEIL (sizeof (hb_graphite2_cluster_t) * buffer->len, sizeof (*scratch)) +
+ DIV_CEIL (sizeof (hb_codepoint_t) * glyph_count, sizeof (*scratch))) > scratch_size)
+ {
+ if (unlikely (!buffer->ensure (buffer->allocated * 2)))
+ {
+ if (feats) gr_featureval_destroy (feats);
+ gr_seg_destroy (seg);
+ return false;
+ }
+ scratch = buffer->get_scratch_buffer (&scratch_size);
+ }
+
+#define ALLOCATE_ARRAY(Type, name, len) \
+ Type *name = (Type *) scratch; \
+ do { \
+ unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \
+ assert (_consumed <= scratch_size); \
+ scratch += _consumed; \
+ scratch_size -= _consumed; \
+ } while (0)
+
+ ALLOCATE_ARRAY (hb_graphite2_cluster_t, clusters, buffer->len);
+ ALLOCATE_ARRAY (hb_codepoint_t, gids, glyph_count);
+
+#undef ALLOCATE_ARRAY
+
+ memset (clusters, 0, sizeof (clusters[0]) * buffer->len);
+
+ hb_codepoint_t *pg = gids;
+ clusters[0].cluster = buffer->info[0].cluster;
+ unsigned int upem = hb_face_get_upem (face);
+ float xscale = (float) font->x_scale / upem;
+ float yscale = (float) font->y_scale / upem;
+ yscale *= yscale / xscale;
+ unsigned int curradv = 0;
+ if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+ {
+ curradv = gr_slot_origin_X(gr_seg_first_slot(seg)) * xscale;
+ clusters[0].advance = gr_seg_advance_X(seg) * xscale - curradv;
+ }
+ else
+ clusters[0].advance = 0;
+ for (is = gr_seg_first_slot (seg), ic = 0; is; is = gr_slot_next_in_segment (is), ic++)
+ {
+ unsigned int before = gr_slot_before (is);
+ unsigned int after = gr_slot_after (is);
+ *pg = gr_slot_gid (is);
+ pg++;
+ while (clusters[ci].base_char > before && ci)
+ {
+ clusters[ci-1].num_chars += clusters[ci].num_chars;
+ clusters[ci-1].num_glyphs += clusters[ci].num_glyphs;
+ clusters[ci-1].advance += clusters[ci].advance;
+ ci--;
+ }
+
+ if (gr_slot_can_insert_before (is) && clusters[ci].num_chars && before >= clusters[ci].base_char + clusters[ci].num_chars)
+ {
+ hb_graphite2_cluster_t *c = clusters + ci + 1;
+ c->base_char = clusters[ci].base_char + clusters[ci].num_chars;
+ c->cluster = buffer->info[c->base_char].cluster;
+ c->num_chars = before - c->base_char;
+ c->base_glyph = ic;
+ c->num_glyphs = 0;
+ if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+ {
+ c->advance = curradv - gr_slot_origin_X(is) * xscale;
+ curradv -= c->advance;
+ }
+ else
+ {
+ c->advance = 0;
+ clusters[ci].advance += gr_slot_origin_X(is) * xscale - curradv;
+ curradv += clusters[ci].advance;
+ }
+ ci++;
+ }
+ clusters[ci].num_glyphs++;
+
+ if (clusters[ci].base_char + clusters[ci].num_chars < after + 1)
+ clusters[ci].num_chars = after + 1 - clusters[ci].base_char;
+ }
+
+ if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+ clusters[ci].advance += curradv;
+ else
+ clusters[ci].advance += gr_seg_advance_X(seg) * xscale - curradv;
+ ci++;
+
+ for (unsigned int i = 0; i < ci; ++i)
+ {
+ for (unsigned int j = 0; j < clusters[i].num_glyphs; ++j)
+ {
+ hb_glyph_info_t *info = &buffer->info[clusters[i].base_glyph + j];
+ info->codepoint = gids[clusters[i].base_glyph + j];
+ info->cluster = clusters[i].cluster;
+ info->var1.i32 = clusters[i].advance; // all glyphs in the cluster get the same advance
+ }
+ }
+ buffer->len = glyph_count;
+
+ /* Positioning. */
+ unsigned int currclus = (unsigned int) -1;
+ const hb_glyph_info_t *info = buffer->info;
+ hb_glyph_position_t *pPos = hb_buffer_get_glyph_positions (buffer, nullptr);
+ if (!HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+ {
+ curradvx = 0;
+ for (is = gr_seg_first_slot (seg); is; pPos++, ++info, is = gr_slot_next_in_segment (is))
+ {
+ pPos->x_offset = gr_slot_origin_X (is) * xscale - curradvx;
+ pPos->y_offset = gr_slot_origin_Y (is) * yscale - curradvy;
+ if (info->cluster != currclus) {
+ pPos->x_advance = info->var1.i32;
+ curradvx += pPos->x_advance;
+ currclus = info->cluster;
+ } else
+ pPos->x_advance = 0.;
+
+ pPos->y_advance = gr_slot_advance_Y (is, grface, nullptr) * yscale;
+ curradvy += pPos->y_advance;
+ }
+ }
+ else
+ {
+ curradvx = gr_seg_advance_X(seg) * xscale;
+ for (is = gr_seg_first_slot (seg); is; pPos++, info++, is = gr_slot_next_in_segment (is))
+ {
+ if (info->cluster != currclus)
+ {
+ pPos->x_advance = info->var1.i32;
+ curradvx -= pPos->x_advance;
+ currclus = info->cluster;
+ } else
+ pPos->x_advance = 0.;
+
+ pPos->y_advance = gr_slot_advance_Y (is, grface, nullptr) * yscale;
+ curradvy -= pPos->y_advance;
+ pPos->x_offset = gr_slot_origin_X (is) * xscale - info->var1.i32 - curradvx + pPos->x_advance;
+ pPos->y_offset = gr_slot_origin_Y (is) * yscale - curradvy;
+ }
+ hb_buffer_reverse_clusters (buffer);
+ }
+
+ if (feats) gr_featureval_destroy (feats);
+ gr_seg_destroy (seg);
+
+ buffer->unsafe_to_break_all ();
+
+ return true;
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-graphite2.h b/src/3rdparty/harfbuzz-ng/src/hb-graphite2.h
new file mode 100644
index 0000000000..1720191b42
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-graphite2.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright © 2011 Martin Hosken
+ * Copyright © 2011 SIL International
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_GRAPHITE2_H
+#define HB_GRAPHITE2_H
+
+#include "hb.h"
+
+#include <graphite2/Font.h>
+
+HB_BEGIN_DECLS
+
+
+#define HB_GRAPHITE2_TAG_SILF HB_TAG('S','i','l','f')
+
+
+HB_EXTERN gr_face *
+hb_graphite2_face_get_gr_face (hb_face_t *face);
+
+#ifndef HB_DISABLE_DEPRECATED
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_graphite2_face_get_gr_face) gr_font *
+hb_graphite2_font_get_gr_font (hb_font_t *font);
+
+#endif
+
+
+HB_END_DECLS
+
+#endif /* HB_GRAPHITE2_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-icu.cc b/src/3rdparty/harfbuzz-ng/src/hb-icu.cc
new file mode 100644
index 0000000000..985ff02dcd
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-icu.cc
@@ -0,0 +1,363 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ * Copyright © 2009 Keith Stribley
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifdef HAVE_ICU
+
+#include "hb-icu.h"
+
+#include "hb-machinery.hh"
+
+#include <unicode/uchar.h>
+#include <unicode/unorm2.h>
+#include <unicode/ustring.h>
+#include <unicode/utf16.h>
+#include <unicode/uversion.h>
+
+/* ICU extra semicolon, fixed since 65, https://github.com/unicode-org/icu/commit/480bec3 */
+#if U_ICU_VERSION_MAJOR_NUM < 65 && (defined(__GNUC__) || defined(__clang__))
+#define HB_ICU_EXTRA_SEMI_IGNORED
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wextra-semi-stmt"
+#endif
+
+/**
+ * SECTION:hb-icu
+ * @title: hb-icu
+ * @short_description: ICU integration
+ * @include: hb-icu.h
+ *
+ * Functions for using HarfBuzz with the ICU library to provide Unicode data.
+ **/
+
+hb_script_t
+hb_icu_script_to_script (UScriptCode script)
+{
+ if (unlikely (script == USCRIPT_INVALID_CODE))
+ return HB_SCRIPT_INVALID;
+
+ return hb_script_from_string (uscript_getShortName (script), -1);
+}
+
+UScriptCode
+hb_icu_script_from_script (hb_script_t script)
+{
+ if (unlikely (script == HB_SCRIPT_INVALID))
+ return USCRIPT_INVALID_CODE;
+
+ unsigned int numScriptCode = 1 + u_getIntPropertyMaxValue (UCHAR_SCRIPT);
+ for (unsigned int i = 0; i < numScriptCode; i++)
+ if (unlikely (hb_icu_script_to_script ((UScriptCode) i) == script))
+ return (UScriptCode) i;
+
+ return USCRIPT_UNKNOWN;
+}
+
+
+static hb_unicode_combining_class_t
+hb_icu_unicode_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+
+{
+ return (hb_unicode_combining_class_t) u_getCombiningClass (unicode);
+}
+
+static hb_unicode_general_category_t
+hb_icu_unicode_general_category (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+{
+ switch (u_getIntPropertyValue(unicode, UCHAR_GENERAL_CATEGORY))
+ {
+ case U_UNASSIGNED: return HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED;
+
+ case U_UPPERCASE_LETTER: return HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER;
+ case U_LOWERCASE_LETTER: return HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER;
+ case U_TITLECASE_LETTER: return HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER;
+ case U_MODIFIER_LETTER: return HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER;
+ case U_OTHER_LETTER: return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER;
+
+ case U_NON_SPACING_MARK: return HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK;
+ case U_ENCLOSING_MARK: return HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK;
+ case U_COMBINING_SPACING_MARK: return HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK;
+
+ case U_DECIMAL_DIGIT_NUMBER: return HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER;
+ case U_LETTER_NUMBER: return HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER;
+ case U_OTHER_NUMBER: return HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER;
+
+ case U_SPACE_SEPARATOR: return HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR;
+ case U_LINE_SEPARATOR: return HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR;
+ case U_PARAGRAPH_SEPARATOR: return HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR;
+
+ case U_CONTROL_CHAR: return HB_UNICODE_GENERAL_CATEGORY_CONTROL;
+ case U_FORMAT_CHAR: return HB_UNICODE_GENERAL_CATEGORY_FORMAT;
+ case U_PRIVATE_USE_CHAR: return HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE;
+ case U_SURROGATE: return HB_UNICODE_GENERAL_CATEGORY_SURROGATE;
+
+
+ case U_DASH_PUNCTUATION: return HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION;
+ case U_START_PUNCTUATION: return HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION;
+ case U_END_PUNCTUATION: return HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION;
+ case U_CONNECTOR_PUNCTUATION: return HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION;
+ case U_OTHER_PUNCTUATION: return HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION;
+
+ case U_MATH_SYMBOL: return HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL;
+ case U_CURRENCY_SYMBOL: return HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL;
+ case U_MODIFIER_SYMBOL: return HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL;
+ case U_OTHER_SYMBOL: return HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL;
+
+ case U_INITIAL_PUNCTUATION: return HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION;
+ case U_FINAL_PUNCTUATION: return HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION;
+ }
+
+ return HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED;
+}
+
+static hb_codepoint_t
+hb_icu_unicode_mirroring (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+{
+ return u_charMirror(unicode);
+}
+
+static hb_script_t
+hb_icu_unicode_script (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+{
+ UErrorCode status = U_ZERO_ERROR;
+ UScriptCode scriptCode = uscript_getScript(unicode, &status);
+
+ if (unlikely (U_FAILURE (status)))
+ return HB_SCRIPT_UNKNOWN;
+
+ return hb_icu_script_to_script (scriptCode);
+}
+
+static hb_bool_t
+hb_icu_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t a,
+ hb_codepoint_t b,
+ hb_codepoint_t *ab,
+ void *user_data HB_UNUSED)
+{
+#if U_ICU_VERSION_MAJOR_NUM >= 49
+ {
+ const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
+ UChar32 ret = unorm2_composePair (normalizer, a, b);
+ if (ret < 0) return false;
+ *ab = ret;
+ return true;
+ }
+#endif
+
+ /* We don't ifdef-out the fallback code such that compiler always
+ * sees it and makes sure it's compilable. */
+
+ UChar utf16[4], normalized[5];
+ unsigned int len;
+ hb_bool_t ret, err;
+ UErrorCode icu_err;
+
+ len = 0;
+ err = false;
+ U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), a, err);
+ if (err) return false;
+ U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), b, err);
+ if (err) return false;
+
+ icu_err = U_ZERO_ERROR;
+ len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err);
+ if (U_FAILURE (icu_err))
+ return false;
+ if (u_countChar32 (normalized, len) == 1) {
+ U16_GET_UNSAFE (normalized, 0, *ab);
+ ret = true;
+ } else {
+ ret = false;
+ }
+
+ return ret;
+}
+
+static hb_bool_t
+hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t ab,
+ hb_codepoint_t *a,
+ hb_codepoint_t *b,
+ void *user_data HB_UNUSED)
+{
+#if U_ICU_VERSION_MAJOR_NUM >= 49
+ {
+ const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
+ UChar decomposed[4];
+ int len;
+ UErrorCode icu_err = U_ZERO_ERROR;
+ len = unorm2_getRawDecomposition (normalizer, ab, decomposed,
+ ARRAY_LENGTH (decomposed), &icu_err);
+ if (U_FAILURE (icu_err) || len < 0) return false;
+
+ len = u_countChar32 (decomposed, len);
+ if (len == 1) {
+ U16_GET_UNSAFE (decomposed, 0, *a);
+ *b = 0;
+ return *a != ab;
+ } else if (len == 2) {
+ len = 0;
+ U16_NEXT_UNSAFE (decomposed, len, *a);
+ U16_NEXT_UNSAFE (decomposed, len, *b);
+ }
+ return true;
+ }
+#endif
+
+ /* We don't ifdef-out the fallback code such that compiler always
+ * sees it and makes sure it's compilable. */
+
+ UChar utf16[2], normalized[2 * 19/*HB_UNICODE_MAX_DECOMPOSITION_LEN*/ + 1];
+ unsigned int len;
+ hb_bool_t ret, err;
+ UErrorCode icu_err;
+
+ /* This function is a monster! Maybe it wasn't a good idea adding a
+ * pairwise decompose API... */
+ /* Watchout for the dragons. Err, watchout for macros changing len. */
+
+ len = 0;
+ err = false;
+ U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), ab, err);
+ if (err) return false;
+
+ icu_err = U_ZERO_ERROR;
+ len = unorm2_normalize (unorm2_getNFDInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err);
+ if (U_FAILURE (icu_err))
+ return false;
+
+ len = u_countChar32 (normalized, len);
+
+ if (len == 1) {
+ U16_GET_UNSAFE (normalized, 0, *a);
+ *b = 0;
+ ret = *a != ab;
+ } else if (len == 2) {
+ len = 0;
+ U16_NEXT_UNSAFE (normalized, len, *a);
+ U16_NEXT_UNSAFE (normalized, len, *b);
+
+ /* Here's the ugly part: if ab decomposes to a single character and
+ * that character decomposes again, we have to detect that and undo
+ * the second part :-(. */
+ UChar recomposed[20];
+ icu_err = U_ZERO_ERROR;
+ unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
+ if (U_FAILURE (icu_err))
+ return false;
+ hb_codepoint_t c;
+ U16_GET_UNSAFE (recomposed, 0, c);
+ if (c != *a && c != ab) {
+ *a = c;
+ *b = 0;
+ }
+ ret = true;
+ } else {
+ /* If decomposed to more than two characters, take the last one,
+ * and recompose the rest to get the first component. */
+ U16_PREV_UNSAFE (normalized, len, *b); /* Changes len in-place. */
+ UChar recomposed[18 * 2];
+ icu_err = U_ZERO_ERROR;
+ len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
+ if (U_FAILURE (icu_err))
+ return false;
+ /* We expect that recomposed has exactly one character now. */
+ if (unlikely (u_countChar32 (recomposed, len) != 1))
+ return false;
+ U16_GET_UNSAFE (recomposed, 0, *a);
+ ret = true;
+ }
+
+ return ret;
+}
+
+
+#if HB_USE_ATEXIT
+static void free_static_icu_funcs ();
+#endif
+
+static struct hb_icu_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_icu_unicode_funcs_lazy_loader_t>
+{
+ static hb_unicode_funcs_t *create ()
+ {
+ void *user_data = nullptr;
+#if U_ICU_VERSION_MAJOR_NUM >= 49
+ UErrorCode icu_err = U_ZERO_ERROR;
+ user_data = (void *) unorm2_getNFCInstance (&icu_err);
+ assert (user_data);
+#endif
+
+ hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr);
+
+ hb_unicode_funcs_set_combining_class_func (funcs, hb_icu_unicode_combining_class, nullptr, nullptr);
+ hb_unicode_funcs_set_general_category_func (funcs, hb_icu_unicode_general_category, nullptr, nullptr);
+ hb_unicode_funcs_set_mirroring_func (funcs, hb_icu_unicode_mirroring, nullptr, nullptr);
+ hb_unicode_funcs_set_script_func (funcs, hb_icu_unicode_script, nullptr, nullptr);
+ hb_unicode_funcs_set_compose_func (funcs, hb_icu_unicode_compose, user_data, nullptr);
+ hb_unicode_funcs_set_decompose_func (funcs, hb_icu_unicode_decompose, user_data, nullptr);
+
+ hb_unicode_funcs_make_immutable (funcs);
+
+#if HB_USE_ATEXIT
+ atexit (free_static_icu_funcs);
+#endif
+
+ return funcs;
+ }
+} static_icu_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_icu_funcs ()
+{
+ static_icu_funcs.free_instance ();
+}
+#endif
+
+hb_unicode_funcs_t *
+hb_icu_get_unicode_funcs ()
+{
+ return static_icu_funcs.get_unconst ();
+}
+
+#ifdef HB_ICU_EXTRA_SEMI_IGNORED
+#pragma GCC diagnostic pop
+#endif
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-icu.h b/src/3rdparty/harfbuzz-ng/src/hb-icu.h
new file mode 100644
index 0000000000..2db6a7b679
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-icu.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_ICU_H
+#define HB_ICU_H
+
+#include "hb.h"
+
+#include <unicode/uscript.h>
+
+HB_BEGIN_DECLS
+
+
+HB_EXTERN hb_script_t
+hb_icu_script_to_script (UScriptCode script);
+
+HB_EXTERN UScriptCode
+hb_icu_script_from_script (hb_script_t script);
+
+
+HB_EXTERN hb_unicode_funcs_t *
+hb_icu_get_unicode_funcs (void);
+
+
+HB_END_DECLS
+
+#endif /* HB_ICU_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-iter.hh b/src/3rdparty/harfbuzz-ng/src/hb-iter.hh
new file mode 100644
index 0000000000..981c5c218c
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-iter.hh
@@ -0,0 +1,939 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ * Copyright © 2019 Facebook, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ * Facebook Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_ITER_HH
+#define HB_ITER_HH
+
+#include "hb.hh"
+#include "hb-algs.hh"
+#include "hb-meta.hh"
+
+
+/* Unified iterator object.
+ *
+ * The goal of this template is to make the same iterator interface
+ * available to all types, and make it very easy and compact to use.
+ * hb_iter_tator objects are small, light-weight, objects that can be
+ * copied by value. If the collection / object being iterated on
+ * is writable, then the iterator returns lvalues, otherwise it
+ * returns rvalues.
+ *
+ * TODO Document more.
+ *
+ * If iterator implementation implements operator!=, then can be
+ * used in range-based for loop. That comes free if the iterator
+ * is random-access. Otherwise, the range-based for loop incurs
+ * one traversal to find end(), which can be avoided if written
+ * as a while-style for loop, or if iterator implements a faster
+ * __end__() method.
+ * TODO When opting in for C++17, address this by changing return
+ * type of .end()?
+ */
+
+/*
+ * Base classes for iterators.
+ */
+
+/* Base class for all iterators. */
+template <typename iter_t, typename Item = typename iter_t::__item_t__>
+struct hb_iter_t
+{
+ typedef Item item_t;
+ constexpr unsigned get_item_size () const { return hb_static_size (Item); }
+ static constexpr bool is_iterator = true;
+ static constexpr bool is_random_access_iterator = false;
+ static constexpr bool is_sorted_iterator = false;
+
+ private:
+ /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
+ const iter_t* thiz () const { return static_cast<const iter_t *> (this); }
+ iter_t* thiz () { return static_cast< iter_t *> (this); }
+ public:
+
+ /* TODO:
+ * Port operators below to use hb_enable_if to sniff which method implements
+ * an operator and use it, and remove hb_iter_fallback_mixin_t completely. */
+
+ /* Operators. */
+ iter_t iter () const { return *thiz(); }
+ iter_t operator + () const { return *thiz(); }
+ iter_t begin () const { return *thiz(); }
+ iter_t end () const { return thiz()->__end__ (); }
+ explicit operator bool () const { return thiz()->__more__ (); }
+ unsigned len () const { return thiz()->__len__ (); }
+ /* The following can only be enabled if item_t is reference type. Otherwise
+ * it will be returning pointer to temporary rvalue.
+ * TODO Use a wrapper return type to fix for non-reference type. */
+ template <typename T = item_t,
+ hb_enable_if (hb_is_reference (T))>
+ hb_remove_reference<item_t>* operator -> () const { return hb_addressof (**thiz()); }
+ item_t operator * () const { return thiz()->__item__ (); }
+ item_t operator * () { return thiz()->__item__ (); }
+ item_t operator [] (unsigned i) const { return thiz()->__item_at__ (i); }
+ item_t operator [] (unsigned i) { return thiz()->__item_at__ (i); }
+ iter_t& operator += (unsigned count) & { thiz()->__forward__ (count); return *thiz(); }
+ iter_t operator += (unsigned count) && { thiz()->__forward__ (count); return *thiz(); }
+ iter_t& operator ++ () & { thiz()->__next__ (); return *thiz(); }
+ iter_t operator ++ () && { thiz()->__next__ (); return *thiz(); }
+ iter_t& operator -= (unsigned count) & { thiz()->__rewind__ (count); return *thiz(); }
+ iter_t operator -= (unsigned count) && { thiz()->__rewind__ (count); return *thiz(); }
+ iter_t& operator -- () & { thiz()->__prev__ (); return *thiz(); }
+ iter_t operator -- () && { thiz()->__prev__ (); return *thiz(); }
+ iter_t operator + (unsigned count) const { auto c = thiz()->iter (); c += count; return c; }
+ friend iter_t operator + (unsigned count, const iter_t &it) { return it + count; }
+ iter_t operator ++ (int) { iter_t c (*thiz()); ++*thiz(); return c; }
+ iter_t operator - (unsigned count) const { auto c = thiz()->iter (); c -= count; return c; }
+ iter_t operator -- (int) { iter_t c (*thiz()); --*thiz(); return c; }
+ template <typename T>
+ iter_t& operator >> (T &v) & { v = **thiz(); ++*thiz(); return *thiz(); }
+ template <typename T>
+ iter_t operator >> (T &v) && { v = **thiz(); ++*thiz(); return *thiz(); }
+ template <typename T>
+ iter_t& operator << (const T v) & { **thiz() = v; ++*thiz(); return *thiz(); }
+ template <typename T>
+ iter_t operator << (const T v) && { **thiz() = v; ++*thiz(); return *thiz(); }
+
+ protected:
+ hb_iter_t () = default;
+ hb_iter_t (const hb_iter_t &o HB_UNUSED) = default;
+ hb_iter_t (hb_iter_t &&o HB_UNUSED) = default;
+ hb_iter_t& operator = (const hb_iter_t &o HB_UNUSED) = default;
+ hb_iter_t& operator = (hb_iter_t &&o HB_UNUSED) = default;
+};
+
+#define HB_ITER_USING(Name) \
+ using item_t = typename Name::item_t; \
+ using Name::begin; \
+ using Name::end; \
+ using Name::get_item_size; \
+ using Name::is_iterator; \
+ using Name::iter; \
+ using Name::operator bool; \
+ using Name::len; \
+ using Name::operator ->; \
+ using Name::operator *; \
+ using Name::operator []; \
+ using Name::operator +=; \
+ using Name::operator ++; \
+ using Name::operator -=; \
+ using Name::operator --; \
+ using Name::operator +; \
+ using Name::operator -; \
+ using Name::operator >>; \
+ using Name::operator <<; \
+ static_assert (true, "")
+
+/* Returns iterator / item type of a type. */
+template <typename Iterable>
+using hb_iter_type = decltype (hb_deref (hb_declval (Iterable)).iter ());
+template <typename Iterable>
+using hb_item_type = decltype (*hb_deref (hb_declval (Iterable)).iter ());
+
+
+template <typename> struct hb_array_t;
+template <typename> struct hb_sorted_array_t;
+
+struct
+{
+ template <typename T> hb_iter_type<T>
+ operator () (T&& c) const
+ { return hb_deref (hb_forward<T> (c)).iter (); }
+
+ /* Specialization for C arrays. */
+
+ template <typename Type> inline hb_array_t<Type>
+ operator () (Type *array, unsigned int length) const
+ { return hb_array_t<Type> (array, length); }
+
+ template <typename Type, unsigned int length> hb_array_t<Type>
+ operator () (Type (&array)[length]) const
+ { return hb_array_t<Type> (array, length); }
+
+}
+HB_FUNCOBJ (hb_iter);
+struct
+{
+ template <typename T> unsigned
+ operator () (T&& c) const
+ { return c.len (); }
+
+}
+HB_FUNCOBJ (hb_len);
+
+/* Mixin to fill in what the subclass doesn't provide. */
+template <typename iter_t, typename item_t = typename iter_t::__item_t__>
+struct hb_iter_fallback_mixin_t
+{
+ private:
+ /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
+ const iter_t* thiz () const { return static_cast<const iter_t *> (this); }
+ iter_t* thiz () { return static_cast< iter_t *> (this); }
+ public:
+
+ /* Access: Implement __item__(), or __item_at__() if random-access. */
+ item_t __item__ () const { return (*thiz())[0]; }
+ item_t __item_at__ (unsigned i) const { return *(*thiz() + i); }
+
+ /* Termination: Implement __more__(), or __len__() if random-access. */
+ bool __more__ () const { return bool (thiz()->len ()); }
+ unsigned __len__ () const
+ { iter_t c (*thiz()); unsigned l = 0; while (c) { c++; l++; } return l; }
+
+ /* Advancing: Implement __next__(), or __forward__() if random-access. */
+ void __next__ () { *thiz() += 1; }
+ void __forward__ (unsigned n) { while (*thiz() && n--) ++*thiz(); }
+
+ /* Rewinding: Implement __prev__() or __rewind__() if bidirectional. */
+ void __prev__ () { *thiz() -= 1; }
+ void __rewind__ (unsigned n) { while (*thiz() && n--) --*thiz(); }
+
+ /* Range-based for: Implement __end__() if can be done faster,
+ * and operator!=. */
+ iter_t __end__ () const
+ {
+ if (thiz()->is_random_access_iterator)
+ return *thiz() + thiz()->len ();
+ /* Above expression loops twice. Following loops once. */
+ auto it = *thiz();
+ while (it) ++it;
+ return it;
+ }
+
+ protected:
+ hb_iter_fallback_mixin_t () = default;
+ hb_iter_fallback_mixin_t (const hb_iter_fallback_mixin_t &o HB_UNUSED) = default;
+ hb_iter_fallback_mixin_t (hb_iter_fallback_mixin_t &&o HB_UNUSED) = default;
+ hb_iter_fallback_mixin_t& operator = (const hb_iter_fallback_mixin_t &o HB_UNUSED) = default;
+ hb_iter_fallback_mixin_t& operator = (hb_iter_fallback_mixin_t &&o HB_UNUSED) = default;
+};
+
+template <typename iter_t, typename item_t = typename iter_t::__item_t__>
+struct hb_iter_with_fallback_t :
+ hb_iter_t<iter_t, item_t>,
+ hb_iter_fallback_mixin_t<iter_t, item_t>
+{
+ protected:
+ hb_iter_with_fallback_t () = default;
+ hb_iter_with_fallback_t (const hb_iter_with_fallback_t &o HB_UNUSED) = default;
+ hb_iter_with_fallback_t (hb_iter_with_fallback_t &&o HB_UNUSED) = default;
+ hb_iter_with_fallback_t& operator = (const hb_iter_with_fallback_t &o HB_UNUSED) = default;
+ hb_iter_with_fallback_t& operator = (hb_iter_with_fallback_t &&o HB_UNUSED) = default;
+};
+
+/*
+ * Meta-programming predicates.
+ */
+
+/* hb_is_iterator() / hb_is_iterator_of() */
+
+template<typename Iter, typename Item>
+struct hb_is_iterator_of
+{
+ template <typename Item2 = Item>
+ static hb_true_type impl (hb_priority<2>, hb_iter_t<Iter, hb_type_identity<Item2>> *);
+ static hb_false_type impl (hb_priority<0>, const void *);
+
+ public:
+ static constexpr bool value = decltype (impl (hb_prioritize, hb_declval (Iter*)))::value;
+};
+#define hb_is_iterator_of(Iter, Item) hb_is_iterator_of<Iter, Item>::value
+#define hb_is_iterator(Iter) hb_is_iterator_of (Iter, typename Iter::item_t)
+
+/* hb_is_iterable() */
+
+template <typename T>
+struct hb_is_iterable
+{
+ private:
+
+ template <typename U>
+ static auto impl (hb_priority<1>) -> decltype (hb_declval (U).iter (), hb_true_type ());
+
+ template <typename>
+ static hb_false_type impl (hb_priority<0>);
+
+ public:
+ static constexpr bool value = decltype (impl<T> (hb_prioritize))::value;
+};
+#define hb_is_iterable(Iterable) hb_is_iterable<Iterable>::value
+
+/* hb_is_source_of() / hb_is_sink_of() */
+
+template<typename Iter, typename Item>
+struct hb_is_source_of
+{
+ private:
+ template <typename Iter2 = Iter,
+ hb_enable_if (hb_is_convertible (typename Iter2::item_t, hb_add_lvalue_reference<hb_add_const<Item>>))>
+ static hb_true_type impl (hb_priority<2>);
+ template <typename Iter2 = Iter>
+ static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) >> hb_declval (Item &), hb_true_type ());
+ static hb_false_type impl (hb_priority<0>);
+
+ public:
+ static constexpr bool value = decltype (impl (hb_prioritize))::value;
+};
+#define hb_is_source_of(Iter, Item) hb_is_source_of<Iter, Item>::value
+
+template<typename Iter, typename Item>
+struct hb_is_sink_of
+{
+ private:
+ template <typename Iter2 = Iter,
+ hb_enable_if (hb_is_convertible (typename Iter2::item_t, hb_add_lvalue_reference<Item>))>
+ static hb_true_type impl (hb_priority<2>);
+ template <typename Iter2 = Iter>
+ static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) << hb_declval (Item), hb_true_type ());
+ static hb_false_type impl (hb_priority<0>);
+
+ public:
+ static constexpr bool value = decltype (impl (hb_prioritize))::value;
+};
+#define hb_is_sink_of(Iter, Item) hb_is_sink_of<Iter, Item>::value
+
+/* This is commonly used, so define: */
+#define hb_is_sorted_source_of(Iter, Item) \
+ (hb_is_source_of(Iter, Item) && Iter::is_sorted_iterator)
+
+
+/* Range-based 'for' for iterables. */
+
+template <typename Iterable,
+ hb_requires (hb_is_iterable (Iterable))>
+static inline auto begin (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).begin ())
+
+template <typename Iterable,
+ hb_requires (hb_is_iterable (Iterable))>
+static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).end ())
+
+/* begin()/end() are NOT looked up non-ADL. So each namespace must declare them.
+ * Do it for namespace OT. */
+namespace OT {
+
+template <typename Iterable,
+ hb_requires (hb_is_iterable (Iterable))>
+static inline auto begin (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).begin ())
+
+template <typename Iterable,
+ hb_requires (hb_is_iterable (Iterable))>
+static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).end ())
+
+}
+
+
+/*
+ * Adaptors, combiners, etc.
+ */
+
+template <typename Lhs, typename Rhs,
+ hb_requires (hb_is_iterator (Lhs))>
+static inline auto
+operator | (Lhs&& lhs, Rhs&& rhs) HB_AUTO_RETURN (hb_forward<Rhs> (rhs) (hb_forward<Lhs> (lhs)))
+
+/* hb_map(), hb_filter(), hb_reduce() */
+
+enum class hb_function_sortedness_t {
+ NOT_SORTED,
+ RETAINS_SORTING,
+ SORTED,
+};
+
+template <typename Iter, typename Proj, hb_function_sortedness_t Sorted,
+ hb_requires (hb_is_iterator (Iter))>
+struct hb_map_iter_t :
+ hb_iter_t<hb_map_iter_t<Iter, Proj, Sorted>,
+ decltype (hb_get (hb_declval (Proj), *hb_declval (Iter)))>
+{
+ hb_map_iter_t (const Iter& it, Proj f_) : it (it), f (f_) {}
+
+ typedef decltype (hb_get (hb_declval (Proj), *hb_declval (Iter))) __item_t__;
+ static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator;
+ static constexpr bool is_sorted_iterator =
+ Sorted == hb_function_sortedness_t::SORTED ? true :
+ Sorted == hb_function_sortedness_t::RETAINS_SORTING ? Iter::is_sorted_iterator :
+ false;
+ __item_t__ __item__ () const { return hb_get (f.get (), *it); }
+ __item_t__ __item_at__ (unsigned i) const { return hb_get (f.get (), it[i]); }
+ bool __more__ () const { return bool (it); }
+ unsigned __len__ () const { return it.len (); }
+ void __next__ () { ++it; }
+ void __forward__ (unsigned n) { it += n; }
+ void __prev__ () { --it; }
+ void __rewind__ (unsigned n) { it -= n; }
+ hb_map_iter_t __end__ () const { return hb_map_iter_t (it.end (), f); }
+ bool operator != (const hb_map_iter_t& o) const
+ { return it != o.it; }
+
+ private:
+ Iter it;
+ hb_reference_wrapper<Proj> f;
+};
+
+template <typename Proj, hb_function_sortedness_t Sorted>
+struct hb_map_iter_factory_t
+{
+ hb_map_iter_factory_t (Proj f) : f (f) {}
+
+ template <typename Iter,
+ hb_requires (hb_is_iterator (Iter))>
+ hb_map_iter_t<Iter, Proj, Sorted>
+ operator () (Iter it)
+ { return hb_map_iter_t<Iter, Proj, Sorted> (it, f); }
+
+ private:
+ Proj f;
+};
+struct
+{
+ template <typename Proj>
+ hb_map_iter_factory_t<Proj, hb_function_sortedness_t::NOT_SORTED>
+ operator () (Proj&& f) const
+ { return hb_map_iter_factory_t<Proj, hb_function_sortedness_t::NOT_SORTED> (f); }
+}
+HB_FUNCOBJ (hb_map);
+struct
+{
+ template <typename Proj>
+ hb_map_iter_factory_t<Proj, hb_function_sortedness_t::RETAINS_SORTING>
+ operator () (Proj&& f) const
+ { return hb_map_iter_factory_t<Proj, hb_function_sortedness_t::RETAINS_SORTING> (f); }
+}
+HB_FUNCOBJ (hb_map_retains_sorting);
+struct
+{
+ template <typename Proj>
+ hb_map_iter_factory_t<Proj, hb_function_sortedness_t::SORTED>
+ operator () (Proj&& f) const
+ { return hb_map_iter_factory_t<Proj, hb_function_sortedness_t::SORTED> (f); }
+}
+HB_FUNCOBJ (hb_map_sorted);
+
+template <typename Iter, typename Pred, typename Proj,
+ hb_requires (hb_is_iterator (Iter))>
+struct hb_filter_iter_t :
+ hb_iter_with_fallback_t<hb_filter_iter_t<Iter, Pred, Proj>,
+ typename Iter::item_t>
+{
+ hb_filter_iter_t (const Iter& it_, Pred p_, Proj f_) : it (it_), p (p_), f (f_)
+ { while (it && !hb_has (p.get (), hb_get (f.get (), *it))) ++it; }
+
+ typedef typename Iter::item_t __item_t__;
+ static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator;
+ __item_t__ __item__ () const { return *it; }
+ bool __more__ () const { return bool (it); }
+ void __next__ () { do ++it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); }
+ void __prev__ () { do --it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); }
+ hb_filter_iter_t __end__ () const { return hb_filter_iter_t (it.end (), p, f); }
+ bool operator != (const hb_filter_iter_t& o) const
+ { return it != o.it; }
+
+ private:
+ Iter it;
+ hb_reference_wrapper<Pred> p;
+ hb_reference_wrapper<Proj> f;
+};
+template <typename Pred, typename Proj>
+struct hb_filter_iter_factory_t
+{
+ hb_filter_iter_factory_t (Pred p, Proj f) : p (p), f (f) {}
+
+ template <typename Iter,
+ hb_requires (hb_is_iterator (Iter))>
+ hb_filter_iter_t<Iter, Pred, Proj>
+ operator () (Iter it)
+ { return hb_filter_iter_t<Iter, Pred, Proj> (it, p, f); }
+
+ private:
+ Pred p;
+ Proj f;
+};
+struct
+{
+ template <typename Pred = decltype ((hb_identity)),
+ typename Proj = decltype ((hb_identity))>
+ hb_filter_iter_factory_t<Pred, Proj>
+ operator () (Pred&& p = hb_identity, Proj&& f = hb_identity) const
+ { return hb_filter_iter_factory_t<Pred, Proj> (p, f); }
+}
+HB_FUNCOBJ (hb_filter);
+
+template <typename Redu, typename InitT>
+struct hb_reduce_t
+{
+ hb_reduce_t (Redu r, InitT init_value) : r (r), init_value (init_value) {}
+
+ template <typename Iter,
+ hb_requires (hb_is_iterator (Iter)),
+ typename AccuT = hb_decay<decltype (hb_declval (Redu) (hb_declval (InitT), hb_declval (typename Iter::item_t)))>>
+ AccuT
+ operator () (Iter it)
+ {
+ AccuT value = init_value;
+ for (; it; ++it)
+ value = r (value, *it);
+ return value;
+ }
+
+ private:
+ Redu r;
+ InitT init_value;
+};
+struct
+{
+ template <typename Redu, typename InitT>
+ hb_reduce_t<Redu, InitT>
+ operator () (Redu&& r, InitT init_value) const
+ { return hb_reduce_t<Redu, InitT> (r, init_value); }
+}
+HB_FUNCOBJ (hb_reduce);
+
+
+/* hb_zip() */
+
+template <typename A, typename B>
+struct hb_zip_iter_t :
+ hb_iter_t<hb_zip_iter_t<A, B>,
+ hb_pair_t<typename A::item_t, typename B::item_t>>
+{
+ hb_zip_iter_t () {}
+ hb_zip_iter_t (const A& a, const B& b) : a (a), b (b) {}
+
+ typedef hb_pair_t<typename A::item_t, typename B::item_t> __item_t__;
+ static constexpr bool is_random_access_iterator =
+ A::is_random_access_iterator &&
+ B::is_random_access_iterator;
+ /* Note. The following categorization is only valid if A is strictly sorted,
+ * ie. does NOT have duplicates. Previously I tried to categorize sortedness
+ * more granularly, see commits:
+ *
+ * 513762849a683914fc266a17ddf38f133cccf072
+ * 4d3cf2adb669c345cc43832d11689271995e160a
+ *
+ * However, that was not enough, since hb_sorted_array_t, hb_sorted_vector_t,
+ * SortedArrayOf, etc all needed to be updated to add more variants. At that
+ * point I saw it not worth the effort, and instead we now deem all sorted
+ * collections as essentially strictly-sorted for the purposes of zip.
+ *
+ * The above assumption is not as bad as it sounds. Our "sorted" comes with
+ * no guarantees. It's just a contract, put in place to help you remember,
+ * and think about, whether an iterator you receive is expected to be
+ * sorted or not. As such, it's not perfect by definition, and should not
+ * be treated so. The inaccuracy here just errs in the direction of being
+ * more permissive, so your code compiles instead of erring on the side of
+ * marking your zipped iterator unsorted in which case your code won't
+ * compile.
+ *
+ * This semantical limitation does NOT affect logic in any other place I
+ * know of as of this writing.
+ */
+ static constexpr bool is_sorted_iterator = A::is_sorted_iterator;
+
+ __item_t__ __item__ () const { return __item_t__ (*a, *b); }
+ __item_t__ __item_at__ (unsigned i) const { return __item_t__ (a[i], b[i]); }
+ bool __more__ () const { return bool (a) && bool (b); }
+ unsigned __len__ () const { return hb_min (a.len (), b.len ()); }
+ void __next__ () { ++a; ++b; }
+ void __forward__ (unsigned n) { a += n; b += n; }
+ void __prev__ () { --a; --b; }
+ void __rewind__ (unsigned n) { a -= n; b -= n; }
+ hb_zip_iter_t __end__ () const { return hb_zip_iter_t (a.end (), b.end ()); }
+ /* Note, we should stop if ANY of the iters reaches end. As such two compare
+ * unequal if both items are unequal, NOT if either is unequal. */
+ bool operator != (const hb_zip_iter_t& o) const
+ { return a != o.a && b != o.b; }
+
+ private:
+ A a;
+ B b;
+};
+struct
+{ HB_PARTIALIZE(2);
+ template <typename A, typename B,
+ hb_requires (hb_is_iterable (A) && hb_is_iterable (B))>
+ hb_zip_iter_t<hb_iter_type<A>, hb_iter_type<B>>
+ operator () (A&& a, B&& b) const
+ { return hb_zip_iter_t<hb_iter_type<A>, hb_iter_type<B>> (hb_iter (a), hb_iter (b)); }
+}
+HB_FUNCOBJ (hb_zip);
+
+/* hb_apply() */
+
+template <typename Appl>
+struct hb_apply_t
+{
+ hb_apply_t (Appl a) : a (a) {}
+
+ template <typename Iter,
+ hb_requires (hb_is_iterator (Iter))>
+ void operator () (Iter it)
+ {
+ for (; it; ++it)
+ (void) hb_invoke (a, *it);
+ }
+
+ private:
+ Appl a;
+};
+struct
+{
+ template <typename Appl> hb_apply_t<Appl>
+ operator () (Appl&& a) const
+ { return hb_apply_t<Appl> (a); }
+
+ template <typename Appl> hb_apply_t<Appl&>
+ operator () (Appl *a) const
+ { return hb_apply_t<Appl&> (*a); }
+}
+HB_FUNCOBJ (hb_apply);
+
+/* hb_range()/hb_iota()/hb_repeat() */
+
+template <typename T, typename S>
+struct hb_range_iter_t :
+ hb_iter_t<hb_range_iter_t<T, S>, T>
+{
+ hb_range_iter_t (T start, T end_, S step) : v (start), end_ (end_for (start, end_, step)), step (step) {}
+
+ typedef T __item_t__;
+ static constexpr bool is_random_access_iterator = true;
+ static constexpr bool is_sorted_iterator = true;
+ __item_t__ __item__ () const { return hb_ridentity (v); }
+ __item_t__ __item_at__ (unsigned j) const { return v + j * step; }
+ bool __more__ () const { return v != end_; }
+ unsigned __len__ () const { return !step ? UINT_MAX : (end_ - v) / step; }
+ void __next__ () { v += step; }
+ void __forward__ (unsigned n) { v += n * step; }
+ void __prev__ () { v -= step; }
+ void __rewind__ (unsigned n) { v -= n * step; }
+ hb_range_iter_t __end__ () const { return hb_range_iter_t (end_, end_, step); }
+ bool operator != (const hb_range_iter_t& o) const
+ { return v != o.v; }
+
+ private:
+ static inline T end_for (T start, T end_, S step)
+ {
+ if (!step)
+ return end_;
+ auto res = (end_ - start) % step;
+ if (!res)
+ return end_;
+ end_ += step - res;
+ return end_;
+ }
+
+ private:
+ T v;
+ T end_;
+ S step;
+};
+struct
+{
+ template <typename T = unsigned> hb_range_iter_t<T, unsigned>
+ operator () (T end = (unsigned) -1) const
+ { return hb_range_iter_t<T, unsigned> (0, end, 1u); }
+
+ template <typename T, typename S = unsigned> hb_range_iter_t<T, S>
+ operator () (T start, T end, S step = 1u) const
+ { return hb_range_iter_t<T, S> (start, end, step); }
+}
+HB_FUNCOBJ (hb_range);
+
+template <typename T, typename S>
+struct hb_iota_iter_t :
+ hb_iter_with_fallback_t<hb_iota_iter_t<T, S>, T>
+{
+ hb_iota_iter_t (T start, S step) : v (start), step (step) {}
+
+ private:
+
+ template <typename S2 = S>
+ auto
+ inc (hb_type_identity<S2> s, hb_priority<1>)
+ -> hb_void_t<decltype (hb_invoke (hb_forward<S2> (s), hb_declval<T&> ()))>
+ { v = hb_invoke (hb_forward<S2> (s), v); }
+
+ void
+ inc (S s, hb_priority<0>)
+ { v += s; }
+
+ public:
+
+ typedef T __item_t__;
+ static constexpr bool is_random_access_iterator = true;
+ static constexpr bool is_sorted_iterator = true;
+ __item_t__ __item__ () const { return hb_ridentity (v); }
+ bool __more__ () const { return true; }
+ unsigned __len__ () const { return UINT_MAX; }
+ void __next__ () { inc (step, hb_prioritize); }
+ void __prev__ () { v -= step; }
+ hb_iota_iter_t __end__ () const { return *this; }
+ bool operator != (const hb_iota_iter_t& o) const { return true; }
+
+ private:
+ T v;
+ S step;
+};
+struct
+{
+ template <typename T = unsigned, typename S = unsigned> hb_iota_iter_t<T, S>
+ operator () (T start = 0u, S step = 1u) const
+ { return hb_iota_iter_t<T, S> (start, step); }
+}
+HB_FUNCOBJ (hb_iota);
+
+template <typename T>
+struct hb_repeat_iter_t :
+ hb_iter_t<hb_repeat_iter_t<T>, T>
+{
+ hb_repeat_iter_t (T value) : v (value) {}
+
+ typedef T __item_t__;
+ static constexpr bool is_random_access_iterator = true;
+ static constexpr bool is_sorted_iterator = true;
+ __item_t__ __item__ () const { return v; }
+ __item_t__ __item_at__ (unsigned j) const { return v; }
+ bool __more__ () const { return true; }
+ unsigned __len__ () const { return UINT_MAX; }
+ void __next__ () {}
+ void __forward__ (unsigned) {}
+ void __prev__ () {}
+ void __rewind__ (unsigned) {}
+ hb_repeat_iter_t __end__ () const { return *this; }
+ bool operator != (const hb_repeat_iter_t& o) const { return true; }
+
+ private:
+ T v;
+};
+struct
+{
+ template <typename T> hb_repeat_iter_t<T>
+ operator () (T value) const
+ { return hb_repeat_iter_t<T> (value); }
+}
+HB_FUNCOBJ (hb_repeat);
+
+/* hb_enumerate()/hb_take() */
+
+struct
+{
+ template <typename Iterable,
+ typename Index = unsigned,
+ hb_requires (hb_is_iterable (Iterable))>
+ auto operator () (Iterable&& it, Index start = 0u) const HB_AUTO_RETURN
+ ( hb_zip (hb_iota (start), it) )
+}
+HB_FUNCOBJ (hb_enumerate);
+
+struct
+{ HB_PARTIALIZE(2);
+ template <typename Iterable,
+ hb_requires (hb_is_iterable (Iterable))>
+ auto operator () (Iterable&& it, unsigned count) const HB_AUTO_RETURN
+ ( hb_zip (hb_range (count), it) | hb_map (hb_second) )
+
+ /* Specialization arrays. */
+
+ template <typename Type> inline hb_array_t<Type>
+ operator () (hb_array_t<Type> array, unsigned count) const
+ { return array.sub_array (0, count); }
+
+ template <typename Type> inline hb_sorted_array_t<Type>
+ operator () (hb_sorted_array_t<Type> array, unsigned count) const
+ { return array.sub_array (0, count); }
+}
+HB_FUNCOBJ (hb_take);
+
+struct
+{ HB_PARTIALIZE(2);
+ template <typename Iter,
+ hb_requires (hb_is_iterator (Iter))>
+ auto operator () (Iter it, unsigned count) const HB_AUTO_RETURN
+ (
+ + hb_iota (it, hb_add (count))
+ | hb_map (hb_take (count))
+ | hb_take ((hb_len (it) + count - 1) / count)
+ )
+}
+HB_FUNCOBJ (hb_chop);
+
+/* hb_sink() */
+
+template <typename Sink>
+struct hb_sink_t
+{
+ hb_sink_t (Sink s) : s (s) {}
+
+ template <typename Iter,
+ hb_requires (hb_is_iterator (Iter))>
+ void operator () (Iter it)
+ {
+ for (; it; ++it)
+ s << *it;
+ }
+
+ private:
+ Sink s;
+};
+struct
+{
+ template <typename Sink> hb_sink_t<Sink>
+ operator () (Sink&& s) const
+ { return hb_sink_t<Sink> (s); }
+
+ template <typename Sink> hb_sink_t<Sink&>
+ operator () (Sink *s) const
+ { return hb_sink_t<Sink&> (*s); }
+}
+HB_FUNCOBJ (hb_sink);
+
+/* hb-drain: hb_sink to void / blackhole / /dev/null. */
+
+struct
+{
+ template <typename Iter,
+ hb_requires (hb_is_iterator (Iter))>
+ void operator () (Iter it) const
+ {
+ for (; it; ++it)
+ (void) *it;
+ }
+}
+HB_FUNCOBJ (hb_drain);
+
+/* hb_unzip(): unzip and sink to two sinks. */
+
+template <typename Sink1, typename Sink2>
+struct hb_unzip_t
+{
+ hb_unzip_t (Sink1 s1, Sink2 s2) : s1 (s1), s2 (s2) {}
+
+ template <typename Iter,
+ hb_requires (hb_is_iterator (Iter))>
+ void operator () (Iter it)
+ {
+ for (; it; ++it)
+ {
+ const auto &v = *it;
+ s1 << v.first;
+ s2 << v.second;
+ }
+ }
+
+ private:
+ Sink1 s1;
+ Sink2 s2;
+};
+struct
+{
+ template <typename Sink1, typename Sink2> hb_unzip_t<Sink1, Sink2>
+ operator () (Sink1&& s1, Sink2&& s2) const
+ { return hb_unzip_t<Sink1, Sink2> (s1, s2); }
+
+ template <typename Sink1, typename Sink2> hb_unzip_t<Sink1&, Sink2&>
+ operator () (Sink1 *s1, Sink2 *s2) const
+ { return hb_unzip_t<Sink1&, Sink2&> (*s1, *s2); }
+}
+HB_FUNCOBJ (hb_unzip);
+
+
+/* hb-all, hb-any, hb-none. */
+
+struct
+{
+ template <typename Iterable,
+ typename Pred = decltype ((hb_identity)),
+ typename Proj = decltype ((hb_identity)),
+ hb_requires (hb_is_iterable (Iterable))>
+ bool operator () (Iterable&& c,
+ Pred&& p = hb_identity,
+ Proj&& f = hb_identity) const
+ {
+ for (auto it = hb_iter (c); it; ++it)
+ if (!hb_match (hb_forward<Pred> (p), hb_get (hb_forward<Proj> (f), *it)))
+ return false;
+ return true;
+ }
+}
+HB_FUNCOBJ (hb_all);
+struct
+{
+ template <typename Iterable,
+ typename Pred = decltype ((hb_identity)),
+ typename Proj = decltype ((hb_identity)),
+ hb_requires (hb_is_iterable (Iterable))>
+ bool operator () (Iterable&& c,
+ Pred&& p = hb_identity,
+ Proj&& f = hb_identity) const
+ {
+ for (auto it = hb_iter (c); it; ++it)
+ if (hb_match (hb_forward<Pred> (p), hb_get (hb_forward<Proj> (f), *it)))
+ return true;
+ return false;
+ }
+}
+HB_FUNCOBJ (hb_any);
+struct
+{
+ template <typename Iterable,
+ typename Pred = decltype ((hb_identity)),
+ typename Proj = decltype ((hb_identity)),
+ hb_requires (hb_is_iterable (Iterable))>
+ bool operator () (Iterable&& c,
+ Pred&& p = hb_identity,
+ Proj&& f = hb_identity) const
+ {
+ for (auto it = hb_iter (c); it; ++it)
+ if (hb_match (hb_forward<Pred> (p), hb_get (hb_forward<Proj> (f), *it)))
+ return false;
+ return true;
+ }
+}
+HB_FUNCOBJ (hb_none);
+
+/*
+ * Algorithms operating on iterators.
+ */
+
+template <typename C, typename V,
+ hb_requires (hb_is_iterable (C))>
+inline void
+hb_fill (C& c, const V &v)
+{
+ for (auto i = hb_iter (c); i; i++)
+ *i = v;
+}
+
+template <typename S, typename D>
+inline void
+hb_copy (S&& is, D&& id)
+{
+ hb_iter (is) | hb_sink (id);
+}
+
+
+#endif /* HB_ITER_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-kern.hh b/src/3rdparty/harfbuzz-ng/src/hb-kern.hh
new file mode 100644
index 0000000000..99d533c045
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-kern.hh
@@ -0,0 +1,139 @@
+/*
+ * Copyright © 2017 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_KERN_HH
+#define HB_KERN_HH
+
+#include "hb-open-type.hh"
+#include "hb-aat-layout-common.hh"
+#include "hb-ot-layout-gpos-table.hh"
+
+
+namespace OT {
+
+
+template <typename Driver>
+struct hb_kern_machine_t
+{
+ hb_kern_machine_t (const Driver &driver_,
+ bool crossStream_ = false) :
+ driver (driver_),
+ crossStream (crossStream_) {}
+
+ HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW
+ void kern (hb_font_t *font,
+ hb_buffer_t *buffer,
+ hb_mask_t kern_mask,
+ bool scale = true) const
+ {
+ OT::hb_ot_apply_context_t c (1, font, buffer);
+ c.set_lookup_mask (kern_mask);
+ c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
+ OT::hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c.iter_input;
+ skippy_iter.init (&c);
+
+ bool horizontal = HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction);
+ unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
+ hb_glyph_position_t *pos = buffer->pos;
+ for (unsigned int idx = 0; idx < count;)
+ {
+ if (!(info[idx].mask & kern_mask))
+ {
+ idx++;
+ continue;
+ }
+
+ skippy_iter.reset (idx, 1);
+ if (!skippy_iter.next ())
+ {
+ idx++;
+ continue;
+ }
+
+ unsigned int i = idx;
+ unsigned int j = skippy_iter.idx;
+
+ hb_position_t kern = driver.get_kerning (info[i].codepoint,
+ info[j].codepoint);
+
+
+ if (likely (!kern))
+ goto skip;
+
+ if (horizontal)
+ {
+ if (scale)
+ kern = font->em_scale_x (kern);
+ if (crossStream)
+ {
+ pos[j].y_offset = kern;
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+ }
+ else
+ {
+ hb_position_t kern1 = kern >> 1;
+ hb_position_t kern2 = kern - kern1;
+ pos[i].x_advance += kern1;
+ pos[j].x_advance += kern2;
+ pos[j].x_offset += kern2;
+ }
+ }
+ else
+ {
+ if (scale)
+ kern = font->em_scale_y (kern);
+ if (crossStream)
+ {
+ pos[j].x_offset = kern;
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
+ }
+ else
+ {
+ hb_position_t kern1 = kern >> 1;
+ hb_position_t kern2 = kern - kern1;
+ pos[i].y_advance += kern1;
+ pos[j].y_advance += kern2;
+ pos[j].y_offset += kern2;
+ }
+ }
+
+ buffer->unsafe_to_break (i, j + 1);
+
+ skip:
+ idx = skippy_iter.idx;
+ }
+ }
+
+ const Driver &driver;
+ bool crossStream;
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_KERN_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-machinery.hh b/src/3rdparty/harfbuzz-ng/src/hb-machinery.hh
new file mode 100644
index 0000000000..15535d75bd
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-machinery.hh
@@ -0,0 +1,323 @@
+/*
+ * Copyright © 2007,2008,2009,2010 Red Hat, Inc.
+ * Copyright © 2012,2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_MACHINERY_HH
+#define HB_MACHINERY_HH
+
+#include "hb.hh"
+#include "hb-blob.hh"
+
+#include "hb-dispatch.hh"
+#include "hb-sanitize.hh"
+#include "hb-serialize.hh"
+
+
+/*
+ * Casts
+ */
+
+/* Cast to struct T, reference to reference */
+template<typename Type, typename TObject>
+static inline const Type& CastR(const TObject &X)
+{ return reinterpret_cast<const Type&> (X); }
+template<typename Type, typename TObject>
+static inline Type& CastR(TObject &X)
+{ return reinterpret_cast<Type&> (X); }
+
+/* Cast to struct T, pointer to pointer */
+template<typename Type, typename TObject>
+static inline const Type* CastP(const TObject *X)
+{ return reinterpret_cast<const Type*> (X); }
+template<typename Type, typename TObject>
+static inline Type* CastP(TObject *X)
+{ return reinterpret_cast<Type*> (X); }
+
+/* StructAtOffset<T>(P,Ofs) returns the struct T& that is placed at memory
+ * location pointed to by P plus Ofs bytes. */
+template<typename Type>
+static inline const Type& StructAtOffset(const void *P, unsigned int offset)
+{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
+template<typename Type>
+static inline Type& StructAtOffset(void *P, unsigned int offset)
+{ return * reinterpret_cast<Type*> ((char *) P + offset); }
+template<typename Type>
+static inline const Type& StructAtOffsetUnaligned(const void *P, unsigned int offset)
+{
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-align"
+ return * reinterpret_cast<Type*> ((char *) P + offset);
+#pragma GCC diagnostic pop
+}
+template<typename Type>
+static inline Type& StructAtOffsetUnaligned(void *P, unsigned int offset)
+{
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-align"
+ return * reinterpret_cast<Type*> ((char *) P + offset);
+#pragma GCC diagnostic pop
+}
+
+/* StructAfter<T>(X) returns the struct T& that is placed after X.
+ * Works with X of variable size also. X must implement get_size() */
+template<typename Type, typename TObject>
+static inline const Type& StructAfter(const TObject &X)
+{ return StructAtOffset<Type>(&X, X.get_size()); }
+template<typename Type, typename TObject>
+static inline Type& StructAfter(TObject &X)
+{ return StructAtOffset<Type>(&X, X.get_size()); }
+
+
+/*
+ * Size checking
+ */
+
+/* Check _assertion in a method environment */
+#define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \
+ void _instance_assertion_on_line_##_line () const \
+ { static_assert ((_assertion), ""); }
+# define _DEFINE_INSTANCE_ASSERTION0(_line, _assertion) _DEFINE_INSTANCE_ASSERTION1 (_line, _assertion)
+# define DEFINE_INSTANCE_ASSERTION(_assertion) _DEFINE_INSTANCE_ASSERTION0 (__LINE__, _assertion)
+
+/* Check that _code compiles in a method environment */
+#define _DEFINE_COMPILES_ASSERTION1(_line, _code) \
+ void _compiles_assertion_on_line_##_line () const \
+ { _code; }
+# define _DEFINE_COMPILES_ASSERTION0(_line, _code) _DEFINE_COMPILES_ASSERTION1 (_line, _code)
+# define DEFINE_COMPILES_ASSERTION(_code) _DEFINE_COMPILES_ASSERTION0 (__LINE__, _code)
+
+
+#define DEFINE_SIZE_STATIC(size) \
+ DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)) \
+ unsigned int get_size () const { return (size); } \
+ static constexpr unsigned null_size = (size); \
+ static constexpr unsigned min_size = (size); \
+ static constexpr unsigned static_size = (size)
+
+#define DEFINE_SIZE_UNION(size, _member) \
+ DEFINE_COMPILES_ASSERTION ((void) this->u._member.static_size) \
+ DEFINE_INSTANCE_ASSERTION (sizeof(this->u._member) == (size)) \
+ static constexpr unsigned null_size = (size); \
+ static constexpr unsigned min_size = (size)
+
+#define DEFINE_SIZE_MIN(size) \
+ DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)) \
+ static constexpr unsigned null_size = (size); \
+ static constexpr unsigned min_size = (size)
+
+#define DEFINE_SIZE_UNBOUNDED(size) \
+ DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)) \
+ static constexpr unsigned min_size = (size)
+
+#define DEFINE_SIZE_ARRAY(size, array) \
+ DEFINE_COMPILES_ASSERTION ((void) (array)[0].static_size) \
+ DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + HB_VAR_ARRAY * sizeof ((array)[0])) \
+ static constexpr unsigned null_size = (size); \
+ static constexpr unsigned min_size = (size)
+
+#define DEFINE_SIZE_ARRAY_SIZED(size, array) \
+ unsigned int get_size () const { return (size - (array).min_size + (array).get_size ()); } \
+ DEFINE_SIZE_ARRAY(size, array)
+
+
+
+/*
+ * Lazy loaders.
+ */
+
+template <typename Data, unsigned int WheresData>
+struct hb_data_wrapper_t
+{
+ static_assert (WheresData > 0, "");
+
+ Data * get_data () const
+ { return *(((Data **) (void *) this) - WheresData); }
+
+ bool is_inert () const { return !get_data (); }
+
+ template <typename Stored, typename Subclass>
+ Stored * call_create () const { return Subclass::create (get_data ()); }
+};
+template <>
+struct hb_data_wrapper_t<void, 0>
+{
+ bool is_inert () const { return false; }
+
+ template <typename Stored, typename Funcs>
+ Stored * call_create () const { return Funcs::create (); }
+};
+
+template <typename T1, typename T2> struct hb_non_void_t { typedef T1 value; };
+template <typename T2> struct hb_non_void_t<void, T2> { typedef T2 value; };
+
+template <typename Returned,
+ typename Subclass = void,
+ typename Data = void,
+ unsigned int WheresData = 0,
+ typename Stored = Returned>
+struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
+{
+ typedef typename hb_non_void_t<Subclass,
+ hb_lazy_loader_t<Returned,Subclass,Data,WheresData,Stored>
+ >::value Funcs;
+
+ void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
+ void init () { instance.set_relaxed (nullptr); }
+ void fini () { do_destroy (instance.get ()); }
+
+ void free_instance ()
+ {
+ retry:
+ Stored *p = instance.get ();
+ if (unlikely (p && !cmpexch (p, nullptr)))
+ goto retry;
+ do_destroy (p);
+ }
+
+ static void do_destroy (Stored *p)
+ {
+ if (p && p != const_cast<Stored *> (Funcs::get_null ()))
+ Funcs::destroy (p);
+ }
+
+ const Returned * operator -> () const { return get (); }
+ const Returned & operator * () const { return *get (); }
+ explicit operator bool () const
+ { return get_stored () != Funcs::get_null (); }
+ template <typename C> operator const C * () const { return get (); }
+
+ Stored * get_stored () const
+ {
+ retry:
+ Stored *p = this->instance.get ();
+ if (unlikely (!p))
+ {
+ if (unlikely (this->is_inert ()))
+ return const_cast<Stored *> (Funcs::get_null ());
+
+ p = this->template call_create<Stored, Funcs> ();
+ if (unlikely (!p))
+ p = const_cast<Stored *> (Funcs::get_null ());
+
+ if (unlikely (!cmpexch (nullptr, p)))
+ {
+ do_destroy (p);
+ goto retry;
+ }
+ }
+ return p;
+ }
+ Stored * get_stored_relaxed () const
+ {
+ return this->instance.get_relaxed ();
+ }
+
+ bool cmpexch (Stored *current, Stored *value) const
+ {
+ /* This *must* be called when there are no other threads accessing. */
+ return this->instance.cmpexch (current, value);
+ }
+
+ const Returned * get () const { return Funcs::convert (get_stored ()); }
+ const Returned * get_relaxed () const { return Funcs::convert (get_stored_relaxed ()); }
+ Returned * get_unconst () const { return const_cast<Returned *> (Funcs::convert (get_stored ())); }
+
+ /* To be possibly overloaded by subclasses. */
+ static Returned* convert (Stored *p) { return p; }
+
+ /* By default null/init/fini the object. */
+ static const Stored* get_null () { return &Null(Stored); }
+ static Stored *create (Data *data)
+ {
+ Stored *p = (Stored *) calloc (1, sizeof (Stored));
+ if (likely (p))
+ p->init (data);
+ return p;
+ }
+ static Stored *create ()
+ {
+ Stored *p = (Stored *) calloc (1, sizeof (Stored));
+ if (likely (p))
+ p->init ();
+ return p;
+ }
+ static void destroy (Stored *p)
+ {
+ p->fini ();
+ free (p);
+ }
+
+// private:
+ /* Must only have one pointer. */
+ hb_atomic_ptr_t<Stored *> instance;
+};
+
+/* Specializations. */
+
+template <typename T, unsigned int WheresFace>
+struct hb_face_lazy_loader_t : hb_lazy_loader_t<T,
+ hb_face_lazy_loader_t<T, WheresFace>,
+ hb_face_t, WheresFace> {};
+
+template <typename T, unsigned int WheresFace>
+struct hb_table_lazy_loader_t : hb_lazy_loader_t<T,
+ hb_table_lazy_loader_t<T, WheresFace>,
+ hb_face_t, WheresFace,
+ hb_blob_t>
+{
+ static hb_blob_t *create (hb_face_t *face)
+ { return hb_sanitize_context_t ().reference_table<T> (face); }
+ static void destroy (hb_blob_t *p) { hb_blob_destroy (p); }
+
+ static const hb_blob_t *get_null ()
+ { return hb_blob_get_empty (); }
+
+ static const T* convert (const hb_blob_t *blob)
+ { return blob->as<T> (); }
+
+ hb_blob_t* get_blob () const { return this->get_stored (); }
+};
+
+template <typename Subclass>
+struct hb_font_funcs_lazy_loader_t : hb_lazy_loader_t<hb_font_funcs_t, Subclass>
+{
+ static void destroy (hb_font_funcs_t *p)
+ { hb_font_funcs_destroy (p); }
+ static const hb_font_funcs_t *get_null ()
+ { return hb_font_funcs_get_empty (); }
+};
+template <typename Subclass>
+struct hb_unicode_funcs_lazy_loader_t : hb_lazy_loader_t<hb_unicode_funcs_t, Subclass>
+{
+ static void destroy (hb_unicode_funcs_t *p)
+ { hb_unicode_funcs_destroy (p); }
+ static const hb_unicode_funcs_t *get_null ()
+ { return hb_unicode_funcs_get_empty (); }
+};
+
+
+#endif /* HB_MACHINERY_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-map.cc b/src/3rdparty/harfbuzz-ng/src/hb-map.cc
new file mode 100644
index 0000000000..a2c770c586
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-map.cc
@@ -0,0 +1,268 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-map.hh"
+
+
+/**
+ * SECTION:hb-map
+ * @title: hb-map
+ * @short_description: Object representing integer to integer mapping
+ * @include: hb.h
+ *
+ * Map objects are integer-to-integer hash-maps. Currently they are
+ * not used in the HarfBuzz public API, but are provided for client's
+ * use if desired.
+ **/
+
+
+/**
+ * hb_map_create: (Xconstructor)
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 1.7.7
+ **/
+hb_map_t *
+hb_map_create ()
+{
+ hb_map_t *map;
+
+ if (!(map = hb_object_create<hb_map_t> ()))
+ return hb_map_get_empty ();
+
+ map->init_shallow ();
+
+ return map;
+}
+
+/**
+ * hb_map_get_empty:
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 1.7.7
+ **/
+hb_map_t *
+hb_map_get_empty ()
+{
+ return const_cast<hb_map_t *> (&Null(hb_map_t));
+}
+
+/**
+ * hb_map_reference: (skip)
+ * @map: a map.
+ *
+ * Return value: (transfer full):
+ *
+ * Since: 1.7.7
+ **/
+hb_map_t *
+hb_map_reference (hb_map_t *map)
+{
+ return hb_object_reference (map);
+}
+
+/**
+ * hb_map_destroy: (skip)
+ * @map: a map.
+ *
+ * Since: 1.7.7
+ **/
+void
+hb_map_destroy (hb_map_t *map)
+{
+ if (!hb_object_destroy (map)) return;
+
+ map->fini_shallow ();
+
+ free (map);
+}
+
+/**
+ * hb_map_set_user_data: (skip)
+ * @map: a map.
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
+ *
+ * Return value:
+ *
+ * Since: 1.7.7
+ **/
+hb_bool_t
+hb_map_set_user_data (hb_map_t *map,
+ hb_user_data_key_t *key,
+ void * data,
+ hb_destroy_func_t destroy,
+ hb_bool_t replace)
+{
+ return hb_object_set_user_data (map, key, data, destroy, replace);
+}
+
+/**
+ * hb_map_get_user_data: (skip)
+ * @map: a map.
+ * @key:
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 1.7.7
+ **/
+void *
+hb_map_get_user_data (hb_map_t *map,
+ hb_user_data_key_t *key)
+{
+ return hb_object_get_user_data (map, key);
+}
+
+
+/**
+ * hb_map_allocation_successful:
+ * @map: a map.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.7.7
+ **/
+hb_bool_t
+hb_map_allocation_successful (const hb_map_t *map)
+{
+ return map->successful;
+}
+
+
+/**
+ * hb_map_set:
+ * @map: a map.
+ * @key:
+ * @value:
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+void
+hb_map_set (hb_map_t *map,
+ hb_codepoint_t key,
+ hb_codepoint_t value)
+{
+ map->set (key, value);
+}
+
+/**
+ * hb_map_get:
+ * @map: a map.
+ * @key:
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+hb_codepoint_t
+hb_map_get (const hb_map_t *map,
+ hb_codepoint_t key)
+{
+ return map->get (key);
+}
+
+/**
+ * hb_map_del:
+ * @map: a map.
+ * @key:
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+void
+hb_map_del (hb_map_t *map,
+ hb_codepoint_t key)
+{
+ map->del (key);
+}
+
+/**
+ * hb_map_has:
+ * @map: a map.
+ * @key:
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+hb_bool_t
+hb_map_has (const hb_map_t *map,
+ hb_codepoint_t key)
+{
+ return map->has (key);
+}
+
+
+/**
+ * hb_map_clear:
+ * @map: a map.
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+void
+hb_map_clear (hb_map_t *map)
+{
+ return map->clear ();
+}
+
+/**
+ * hb_map_is_empty:
+ * @map: a map.
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+hb_bool_t
+hb_map_is_empty (const hb_map_t *map)
+{
+ return map->is_empty ();
+}
+
+/**
+ * hb_map_get_population:
+ * @map: a map.
+ *
+ *
+ *
+ * Since: 1.7.7
+ **/
+unsigned int
+hb_map_get_population (const hb_map_t *map)
+{
+ return map->get_population ();
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-map.h b/src/3rdparty/harfbuzz-ng/src/hb-map.h
new file mode 100644
index 0000000000..b77843c2ba
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-map.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_MAP_H
+#define HB_MAP_H
+
+#include "hb-common.h"
+
+HB_BEGIN_DECLS
+
+
+/*
+ * Since: 1.7.7
+ */
+#define HB_MAP_VALUE_INVALID ((hb_codepoint_t) -1)
+
+typedef struct hb_map_t hb_map_t;
+
+
+HB_EXTERN hb_map_t *
+hb_map_create (void);
+
+HB_EXTERN hb_map_t *
+hb_map_get_empty (void);
+
+HB_EXTERN hb_map_t *
+hb_map_reference (hb_map_t *map);
+
+HB_EXTERN void
+hb_map_destroy (hb_map_t *map);
+
+HB_EXTERN hb_bool_t
+hb_map_set_user_data (hb_map_t *map,
+ hb_user_data_key_t *key,
+ void * data,
+ hb_destroy_func_t destroy,
+ hb_bool_t replace);
+
+HB_EXTERN void *
+hb_map_get_user_data (hb_map_t *map,
+ hb_user_data_key_t *key);
+
+
+/* Returns false if allocation has failed before */
+HB_EXTERN hb_bool_t
+hb_map_allocation_successful (const hb_map_t *map);
+
+HB_EXTERN void
+hb_map_clear (hb_map_t *map);
+
+HB_EXTERN hb_bool_t
+hb_map_is_empty (const hb_map_t *map);
+
+HB_EXTERN unsigned int
+hb_map_get_population (const hb_map_t *map);
+
+HB_EXTERN void
+hb_map_set (hb_map_t *map,
+ hb_codepoint_t key,
+ hb_codepoint_t value);
+
+HB_EXTERN hb_codepoint_t
+hb_map_get (const hb_map_t *map,
+ hb_codepoint_t key);
+
+HB_EXTERN void
+hb_map_del (hb_map_t *map,
+ hb_codepoint_t key);
+
+HB_EXTERN hb_bool_t
+hb_map_has (const hb_map_t *map,
+ hb_codepoint_t key);
+
+
+HB_END_DECLS
+
+#endif /* HB_MAP_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-map.hh b/src/3rdparty/harfbuzz-ng/src/hb-map.hh
new file mode 100644
index 0000000000..8c8db4d520
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-map.hh
@@ -0,0 +1,328 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_MAP_HH
+#define HB_MAP_HH
+
+#include "hb.hh"
+
+
+/*
+ * hb_hashmap_t
+ */
+
+template <typename K, typename V,
+ K kINVALID = hb_is_pointer (K) ? 0 : hb_is_signed (K) ? hb_int_min (K) : (K) -1,
+ V vINVALID = hb_is_pointer (V) ? 0 : hb_is_signed (V) ? hb_int_min (V) : (V) -1>
+struct hb_hashmap_t
+{
+ HB_DELETE_COPY_ASSIGN (hb_hashmap_t);
+ hb_hashmap_t () { init (); }
+ ~hb_hashmap_t () { fini (); }
+
+ static_assert (hb_is_integral (K) || hb_is_pointer (K), "");
+ static_assert (hb_is_integral (V) || hb_is_pointer (V), "");
+
+ struct item_t
+ {
+ K key;
+ V value;
+ uint32_t hash;
+
+ void clear () { key = kINVALID; value = vINVALID; hash = 0; }
+
+ bool operator == (K o) { return hb_deref (key) == hb_deref (o); }
+ bool operator == (const item_t &o) { return *this == o.key; }
+ bool is_unused () const { return key == kINVALID; }
+ bool is_tombstone () const { return key != kINVALID && value == vINVALID; }
+ bool is_real () const { return key != kINVALID && value != vINVALID; }
+ hb_pair_t<K, V> get_pair() const { return hb_pair_t<K, V> (key, value); }
+ };
+
+ hb_object_header_t header;
+ bool successful; /* Allocations successful */
+ unsigned int population; /* Not including tombstones. */
+ unsigned int occupancy; /* Including tombstones. */
+ unsigned int mask;
+ unsigned int prime;
+ item_t *items;
+
+ void init_shallow ()
+ {
+ successful = true;
+ population = occupancy = 0;
+ mask = 0;
+ prime = 0;
+ items = nullptr;
+ }
+ void init ()
+ {
+ hb_object_init (this);
+ init_shallow ();
+ }
+ void fini_shallow ()
+ {
+ free (items);
+ items = nullptr;
+ population = occupancy = 0;
+ }
+ void fini ()
+ {
+ hb_object_fini (this);
+ fini_shallow ();
+ }
+
+ void reset ()
+ {
+ if (unlikely (hb_object_is_immutable (this)))
+ return;
+ successful = true;
+ clear ();
+ }
+
+ bool in_error () const { return !successful; }
+
+ bool resize ()
+ {
+ if (unlikely (!successful)) return false;
+
+ unsigned int power = hb_bit_storage (population * 2 + 8);
+ unsigned int new_size = 1u << power;
+ item_t *new_items = (item_t *) malloc ((size_t) new_size * sizeof (item_t));
+ if (unlikely (!new_items))
+ {
+ successful = false;
+ return false;
+ }
+ + hb_iter (new_items, new_size)
+ | hb_apply (&item_t::clear)
+ ;
+
+ unsigned int old_size = mask + 1;
+ item_t *old_items = items;
+
+ /* Switch to new, empty, array. */
+ population = occupancy = 0;
+ mask = new_size - 1;
+ prime = prime_for (power);
+ items = new_items;
+
+ /* Insert back old items. */
+ if (old_items)
+ for (unsigned int i = 0; i < old_size; i++)
+ if (old_items[i].is_real ())
+ set_with_hash (old_items[i].key,
+ old_items[i].hash,
+ old_items[i].value);
+
+ free (old_items);
+
+ return true;
+ }
+
+ void set (K key, V value)
+ {
+ set_with_hash (key, hb_hash (key), value);
+ }
+
+ V get (K key) const
+ {
+ if (unlikely (!items)) return vINVALID;
+ unsigned int i = bucket_for (key);
+ return items[i].is_real () && items[i] == key ? items[i].value : vINVALID;
+ }
+
+ void del (K key) { set (key, vINVALID); }
+
+ /* Has interface. */
+ static constexpr V SENTINEL = vINVALID;
+ typedef V value_t;
+ value_t operator [] (K k) const { return get (k); }
+ bool has (K k, V *vp = nullptr) const
+ {
+ V v = (*this)[k];
+ if (vp) *vp = v;
+ return v != SENTINEL;
+ }
+ /* Projection. */
+ V operator () (K k) const { return get (k); }
+
+ void clear ()
+ {
+ if (unlikely (hb_object_is_immutable (this)))
+ return;
+ if (items)
+ + hb_iter (items, mask + 1)
+ | hb_apply (&item_t::clear)
+ ;
+
+ population = occupancy = 0;
+ }
+
+ bool is_empty () const { return population == 0; }
+
+ unsigned int get_population () const { return population; }
+
+ /*
+ * Iterator
+ */
+ auto iter () const HB_AUTO_RETURN
+ (
+ + hb_array (items, mask ? mask + 1 : 0)
+ | hb_filter (&item_t::is_real)
+ | hb_map (&item_t::get_pair)
+ )
+ auto keys () const HB_AUTO_RETURN
+ (
+ + hb_array (items, mask ? mask + 1 : 0)
+ | hb_filter (&item_t::is_real)
+ | hb_map (&item_t::key)
+ | hb_map (hb_ridentity)
+ )
+ auto values () const HB_AUTO_RETURN
+ (
+ + hb_array (items, mask ? mask + 1 : 0)
+ | hb_filter (&item_t::is_real)
+ | hb_map (&item_t::value)
+ | hb_map (hb_ridentity)
+ )
+
+ /* Sink interface. */
+ hb_hashmap_t<K, V, kINVALID, vINVALID>& operator << (const hb_pair_t<K, V>& v)
+ { set (v.first, v.second); return *this; }
+
+ protected:
+
+ void set_with_hash (K key, uint32_t hash, V value)
+ {
+ if (unlikely (!successful)) return;
+ if (unlikely (key == kINVALID)) return;
+ if ((occupancy + occupancy / 2) >= mask && !resize ()) return;
+ unsigned int i = bucket_for_hash (key, hash);
+
+ if (value == vINVALID && items[i].key != key)
+ return; /* Trying to delete non-existent key. */
+
+ if (!items[i].is_unused ())
+ {
+ occupancy--;
+ if (items[i].is_tombstone ())
+ population--;
+ }
+
+ items[i].key = key;
+ items[i].value = value;
+ items[i].hash = hash;
+
+ occupancy++;
+ if (!items[i].is_tombstone ())
+ population++;
+ }
+
+ unsigned int bucket_for (K key) const
+ {
+ return bucket_for_hash (key, hb_hash (key));
+ }
+
+ unsigned int bucket_for_hash (K key, uint32_t hash) const
+ {
+ unsigned int i = hash % prime;
+ unsigned int step = 0;
+ unsigned int tombstone = (unsigned) -1;
+ while (!items[i].is_unused ())
+ {
+ if (items[i].hash == hash && items[i] == key)
+ return i;
+ if (tombstone == (unsigned) -1 && items[i].is_tombstone ())
+ tombstone = i;
+ i = (i + ++step) & mask;
+ }
+ return tombstone == (unsigned) -1 ? i : tombstone;
+ }
+
+ static unsigned int prime_for (unsigned int shift)
+ {
+ /* Following comment and table copied from glib. */
+ /* Each table size has an associated prime modulo (the first prime
+ * lower than the table size) used to find the initial bucket. Probing
+ * then works modulo 2^n. The prime modulo is necessary to get a
+ * good distribution with poor hash functions.
+ */
+ /* Not declaring static to make all kinds of compilers happy... */
+ /*static*/ const unsigned int prime_mod [32] =
+ {
+ 1, /* For 1 << 0 */
+ 2,
+ 3,
+ 7,
+ 13,
+ 31,
+ 61,
+ 127,
+ 251,
+ 509,
+ 1021,
+ 2039,
+ 4093,
+ 8191,
+ 16381,
+ 32749,
+ 65521, /* For 1 << 16 */
+ 131071,
+ 262139,
+ 524287,
+ 1048573,
+ 2097143,
+ 4194301,
+ 8388593,
+ 16777213,
+ 33554393,
+ 67108859,
+ 134217689,
+ 268435399,
+ 536870909,
+ 1073741789,
+ 2147483647 /* For 1 << 31 */
+ };
+
+ if (unlikely (shift >= ARRAY_LENGTH (prime_mod)))
+ return prime_mod[ARRAY_LENGTH (prime_mod) - 1];
+
+ return prime_mod[shift];
+ }
+};
+
+/*
+ * hb_map_t
+ */
+
+struct hb_map_t : hb_hashmap_t<hb_codepoint_t,
+ hb_codepoint_t,
+ HB_MAP_VALUE_INVALID,
+ HB_MAP_VALUE_INVALID> {};
+
+
+#endif /* HB_MAP_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-meta.hh b/src/3rdparty/harfbuzz-ng/src/hb-meta.hh
new file mode 100644
index 0000000000..2dfaeb7b46
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-meta.hh
@@ -0,0 +1,400 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_META_HH
+#define HB_META_HH
+
+#include "hb.hh"
+
+
+/*
+ * C++ template meta-programming & fundamentals used with them.
+ */
+
+/* Void! For when we need a expression-type of void. */
+struct hb_empty_t {};
+
+/* https://en.cppreference.com/w/cpp/types/void_t */
+template<typename... Ts> struct _hb_void_t { typedef void type; };
+template<typename... Ts> using hb_void_t = typename _hb_void_t<Ts...>::type;
+
+template<typename Head, typename... Ts> struct _hb_head_t { typedef Head type; };
+template<typename... Ts> using hb_head_t = typename _hb_head_t<Ts...>::type;
+
+template <typename T, T v> struct hb_integral_constant { static constexpr T value = v; };
+template <bool b> using hb_bool_constant = hb_integral_constant<bool, b>;
+using hb_true_type = hb_bool_constant<true>;
+using hb_false_type = hb_bool_constant<false>;
+
+
+/* Basic type SFINAE. */
+
+template <bool B, typename T = void> struct hb_enable_if {};
+template <typename T> struct hb_enable_if<true, T> { typedef T type; };
+#define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr
+/* Concepts/Requires alias: */
+#define hb_requires(Cond) hb_enable_if((Cond))
+
+template <typename T, typename T2> struct hb_is_same : hb_false_type {};
+template <typename T> struct hb_is_same<T, T> : hb_true_type {};
+#define hb_is_same(T, T2) hb_is_same<T, T2>::value
+
+/* Function overloading SFINAE and priority. */
+
+#define HB_RETURN(Ret, E) -> hb_head_t<Ret, decltype ((E))> { return (E); }
+#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
+#define HB_VOID_RETURN(E) -> hb_void_t<decltype ((E))> { (E); }
+
+template <unsigned Pri> struct hb_priority : hb_priority<Pri - 1> {};
+template <> struct hb_priority<0> {};
+#define hb_prioritize hb_priority<16> ()
+
+#define HB_FUNCOBJ(x) static_const x HB_UNUSED
+
+
+template <typename T> struct hb_type_identity_t { typedef T type; };
+template <typename T> using hb_type_identity = typename hb_type_identity_t<T>::type;
+
+struct
+{
+ template <typename T> constexpr T*
+ operator () (T& arg) const
+ {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-align"
+ /* https://en.cppreference.com/w/cpp/memory/addressof */
+ return reinterpret_cast<T*> (
+ &const_cast<char&> (
+ reinterpret_cast<const volatile char&> (arg)));
+#pragma GCC diagnostic pop
+ }
+}
+HB_FUNCOBJ (hb_addressof);
+
+template <typename T> static inline T hb_declval ();
+#define hb_declval(T) (hb_declval<T> ())
+
+template <typename T> struct hb_match_const : hb_type_identity_t<T>, hb_bool_constant<false>{};
+template <typename T> struct hb_match_const<const T> : hb_type_identity_t<T>, hb_bool_constant<true> {};
+template <typename T> using hb_remove_const = typename hb_match_const<T>::type;
+template <typename T> using hb_add_const = const T;
+#define hb_is_const(T) hb_match_const<T>::value
+template <typename T> struct hb_match_reference : hb_type_identity_t<T>, hb_bool_constant<false>{};
+template <typename T> struct hb_match_reference<T &> : hb_type_identity_t<T>, hb_bool_constant<true> {};
+template <typename T> struct hb_match_reference<T &&> : hb_type_identity_t<T>, hb_bool_constant<true> {};
+template <typename T> using hb_remove_reference = typename hb_match_reference<T>::type;
+template <typename T> auto _hb_try_add_lvalue_reference (hb_priority<1>) -> hb_type_identity<T&>;
+template <typename T> auto _hb_try_add_lvalue_reference (hb_priority<0>) -> hb_type_identity<T>;
+template <typename T> using hb_add_lvalue_reference = decltype (_hb_try_add_lvalue_reference<T> (hb_prioritize));
+template <typename T> auto _hb_try_add_rvalue_reference (hb_priority<1>) -> hb_type_identity<T&&>;
+template <typename T> auto _hb_try_add_rvalue_reference (hb_priority<0>) -> hb_type_identity<T>;
+template <typename T> using hb_add_rvalue_reference = decltype (_hb_try_add_rvalue_reference<T> (hb_prioritize));
+#define hb_is_reference(T) hb_match_reference<T>::value
+template <typename T> struct hb_match_pointer : hb_type_identity_t<T>, hb_bool_constant<false>{};
+template <typename T> struct hb_match_pointer<T *> : hb_type_identity_t<T>, hb_bool_constant<true> {};
+template <typename T> using hb_remove_pointer = typename hb_match_pointer<T>::type;
+template <typename T> auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity<hb_remove_reference<T>*>;
+template <typename T> auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity<T>;
+template <typename T> using hb_add_pointer = decltype (_hb_try_add_pointer<T> (hb_prioritize));
+#define hb_is_pointer(T) hb_match_pointer<T>::value
+
+
+/* TODO Add feature-parity to std::decay. */
+template <typename T> using hb_decay = hb_remove_const<hb_remove_reference<T>>;
+
+
+template<bool B, class T, class F>
+struct _hb_conditional { typedef T type; };
+template<class T, class F>
+struct _hb_conditional<false, T, F> { typedef F type; };
+template<bool B, class T, class F>
+using hb_conditional = typename _hb_conditional<B, T, F>::type;
+
+
+template <typename From, typename To>
+struct hb_is_convertible
+{
+ private:
+ static constexpr bool from_void = hb_is_same (void, hb_decay<From>);
+ static constexpr bool to_void = hb_is_same (void, hb_decay<To> );
+ static constexpr bool either_void = from_void || to_void;
+ static constexpr bool both_void = from_void && to_void;
+
+ static hb_true_type impl2 (hb_conditional<to_void, int, To>);
+
+ template <typename T>
+ static auto impl (hb_priority<1>) -> decltype (impl2 (hb_declval (T)));
+ template <typename T>
+ static hb_false_type impl (hb_priority<0>);
+ public:
+ static constexpr bool value = both_void ||
+ (!either_void &&
+ decltype (impl<hb_conditional<from_void, int, From>> (hb_prioritize))::value);
+};
+#define hb_is_convertible(From,To) hb_is_convertible<From, To>::value
+
+template <typename Base, typename Derived>
+using hb_is_base_of = hb_is_convertible<hb_decay<Derived> *, hb_decay<Base> *>;
+#define hb_is_base_of(Base,Derived) hb_is_base_of<Base, Derived>::value
+
+template <typename From, typename To>
+using hb_is_cr_convertible = hb_bool_constant<
+ hb_is_same (hb_decay<From>, hb_decay<To>) &&
+ (!hb_is_const (From) || hb_is_const (To)) &&
+ (!hb_is_reference (To) || hb_is_const (To) || hb_is_reference (To))
+>;
+#define hb_is_cr_convertible(From,To) hb_is_cr_convertible<From, To>::value
+
+/* std::move and std::forward */
+
+template <typename T>
+static constexpr hb_remove_reference<T>&& hb_move (T&& t) { return (hb_remove_reference<T>&&) (t); }
+
+template <typename T>
+static constexpr T&& hb_forward (hb_remove_reference<T>& t) { return (T&&) t; }
+template <typename T>
+static constexpr T&& hb_forward (hb_remove_reference<T>&& t) { return (T&&) t; }
+
+struct
+{
+ template <typename T> constexpr auto
+ operator () (T&& v) const HB_AUTO_RETURN (hb_forward<T> (v))
+
+ template <typename T> constexpr auto
+ operator () (T *v) const HB_AUTO_RETURN (*v)
+}
+HB_FUNCOBJ (hb_deref);
+
+struct
+{
+ template <typename T> constexpr auto
+ operator () (T&& v) const HB_AUTO_RETURN (hb_forward<T> (v))
+
+ template <typename T> constexpr auto
+ operator () (T& v) const HB_AUTO_RETURN (hb_addressof (v))
+}
+HB_FUNCOBJ (hb_ref);
+
+template <typename T>
+struct hb_reference_wrapper
+{
+ hb_reference_wrapper (T v) : v (v) {}
+ bool operator == (const hb_reference_wrapper& o) const { return v == o.v; }
+ bool operator != (const hb_reference_wrapper& o) const { return v != o.v; }
+ operator T () const { return v; }
+ T get () const { return v; }
+ T v;
+};
+template <typename T>
+struct hb_reference_wrapper<T&>
+{
+ hb_reference_wrapper (T& v) : v (hb_addressof (v)) {}
+ bool operator == (const hb_reference_wrapper& o) const { return v == o.v; }
+ bool operator != (const hb_reference_wrapper& o) const { return v != o.v; }
+ operator T& () const { return *v; }
+ T& get () const { return *v; }
+ T* v;
+};
+
+
+template <typename T>
+using hb_is_integral = hb_bool_constant<
+ hb_is_same (hb_decay<T>, char) ||
+ hb_is_same (hb_decay<T>, signed char) ||
+ hb_is_same (hb_decay<T>, unsigned char) ||
+ hb_is_same (hb_decay<T>, signed int) ||
+ hb_is_same (hb_decay<T>, unsigned int) ||
+ hb_is_same (hb_decay<T>, signed short) ||
+ hb_is_same (hb_decay<T>, unsigned short) ||
+ hb_is_same (hb_decay<T>, signed long) ||
+ hb_is_same (hb_decay<T>, unsigned long) ||
+ hb_is_same (hb_decay<T>, signed long long) ||
+ hb_is_same (hb_decay<T>, unsigned long long) ||
+ false
+>;
+#define hb_is_integral(T) hb_is_integral<T>::value
+template <typename T>
+using hb_is_floating_point = hb_bool_constant<
+ hb_is_same (hb_decay<T>, float) ||
+ hb_is_same (hb_decay<T>, double) ||
+ hb_is_same (hb_decay<T>, long double) ||
+ false
+>;
+#define hb_is_floating_point(T) hb_is_floating_point<T>::value
+template <typename T>
+using hb_is_arithmetic = hb_bool_constant<
+ hb_is_integral (T) ||
+ hb_is_floating_point (T) ||
+ false
+>;
+#define hb_is_arithmetic(T) hb_is_arithmetic<T>::value
+
+
+template <typename T>
+using hb_is_signed = hb_conditional<hb_is_arithmetic (T),
+ hb_bool_constant<(T) -1 < (T) 0>,
+ hb_false_type>;
+#define hb_is_signed(T) hb_is_signed<T>::value
+template <typename T>
+using hb_is_unsigned = hb_conditional<hb_is_arithmetic (T),
+ hb_bool_constant<(T) 0 < (T) -1>,
+ hb_false_type>;
+#define hb_is_unsigned(T) hb_is_unsigned<T>::value
+
+template <typename T> struct hb_int_min;
+template <> struct hb_int_min<char> : hb_integral_constant<char, CHAR_MIN> {};
+template <> struct hb_int_min<signed char> : hb_integral_constant<signed char, SCHAR_MIN> {};
+template <> struct hb_int_min<unsigned char> : hb_integral_constant<unsigned char, 0> {};
+template <> struct hb_int_min<signed short> : hb_integral_constant<signed short, SHRT_MIN> {};
+template <> struct hb_int_min<unsigned short> : hb_integral_constant<unsigned short, 0> {};
+template <> struct hb_int_min<signed int> : hb_integral_constant<signed int, INT_MIN> {};
+template <> struct hb_int_min<unsigned int> : hb_integral_constant<unsigned int, 0> {};
+template <> struct hb_int_min<signed long> : hb_integral_constant<signed long, LONG_MIN> {};
+template <> struct hb_int_min<unsigned long> : hb_integral_constant<unsigned long, 0> {};
+template <> struct hb_int_min<signed long long> : hb_integral_constant<signed long long, LLONG_MIN> {};
+template <> struct hb_int_min<unsigned long long> : hb_integral_constant<unsigned long long, 0> {};
+#define hb_int_min(T) hb_int_min<T>::value
+template <typename T> struct hb_int_max;
+template <> struct hb_int_max<char> : hb_integral_constant<char, CHAR_MAX> {};
+template <> struct hb_int_max<signed char> : hb_integral_constant<signed char, SCHAR_MAX> {};
+template <> struct hb_int_max<unsigned char> : hb_integral_constant<unsigned char, UCHAR_MAX> {};
+template <> struct hb_int_max<signed short> : hb_integral_constant<signed short, SHRT_MAX> {};
+template <> struct hb_int_max<unsigned short> : hb_integral_constant<unsigned short, USHRT_MAX> {};
+template <> struct hb_int_max<signed int> : hb_integral_constant<signed int, INT_MAX> {};
+template <> struct hb_int_max<unsigned int> : hb_integral_constant<unsigned int, UINT_MAX> {};
+template <> struct hb_int_max<signed long> : hb_integral_constant<signed long, LONG_MAX> {};
+template <> struct hb_int_max<unsigned long> : hb_integral_constant<unsigned long, ULONG_MAX> {};
+template <> struct hb_int_max<signed long long> : hb_integral_constant<signed long long, LLONG_MAX> {};
+template <> struct hb_int_max<unsigned long long> : hb_integral_constant<unsigned long long, ULLONG_MAX> {};
+#define hb_int_max(T) hb_int_max<T>::value
+
+
+
+template <typename T, typename>
+struct _hb_is_destructible : hb_false_type {};
+template <typename T>
+struct _hb_is_destructible<T, hb_void_t<decltype (hb_declval (T).~T ())>> : hb_true_type {};
+template <typename T>
+using hb_is_destructible = _hb_is_destructible<T, void>;
+#define hb_is_destructible(T) hb_is_destructible<T>::value
+
+template <typename T, typename, typename ...Ts>
+struct _hb_is_constructible : hb_false_type {};
+template <typename T, typename ...Ts>
+struct _hb_is_constructible<T, hb_void_t<decltype (T (hb_declval (Ts)...))>, Ts...> : hb_true_type {};
+template <typename T, typename ...Ts>
+using hb_is_constructible = _hb_is_constructible<T, void, Ts...>;
+#define hb_is_constructible(...) hb_is_constructible<__VA_ARGS__>::value
+
+template <typename T>
+using hb_is_default_constructible = hb_is_constructible<T>;
+#define hb_is_default_constructible(T) hb_is_default_constructible<T>::value
+
+template <typename T>
+using hb_is_copy_constructible = hb_is_constructible<T, hb_add_lvalue_reference<hb_add_const<T>>>;
+#define hb_is_copy_constructible(T) hb_is_copy_constructible<T>::value
+
+template <typename T>
+using hb_is_move_constructible = hb_is_constructible<T, hb_add_rvalue_reference<hb_add_const<T>>>;
+#define hb_is_move_constructible(T) hb_is_move_constructible<T>::value
+
+template <typename T, typename U, typename>
+struct _hb_is_assignable : hb_false_type {};
+template <typename T, typename U>
+struct _hb_is_assignable<T, U, hb_void_t<decltype (hb_declval (T) = hb_declval (U))>> : hb_true_type {};
+template <typename T, typename U>
+using hb_is_assignable = _hb_is_assignable<T, U, void>;
+#define hb_is_assignable(T,U) hb_is_assignable<T, U>::value
+
+template <typename T>
+using hb_is_copy_assignable = hb_is_assignable<hb_add_lvalue_reference<T>,
+ hb_add_lvalue_reference<hb_add_const<T>>>;
+#define hb_is_copy_assignable(T) hb_is_copy_assignable<T>::value
+
+template <typename T>
+using hb_is_move_assignable = hb_is_assignable<hb_add_lvalue_reference<T>,
+ hb_add_rvalue_reference<T>>;
+#define hb_is_move_assignable(T) hb_is_move_assignable<T>::value
+
+/* Trivial versions. */
+
+template <typename T> union hb_trivial { T value; };
+
+/* Don't know how to do the following. */
+template <typename T>
+using hb_is_trivially_destructible= hb_is_destructible<hb_trivial<T>>;
+#define hb_is_trivially_destructible(T) hb_is_trivially_destructible<T>::value
+
+/* Don't know how to do the following. */
+//template <typename T, typename ...Ts>
+//using hb_is_trivially_constructible= hb_is_constructible<hb_trivial<T>, hb_trivial<Ts>...>;
+//#define hb_is_trivially_constructible(...) hb_is_trivially_constructible<__VA_ARGS__>::value
+
+template <typename T>
+using hb_is_trivially_default_constructible= hb_is_default_constructible<hb_trivial<T>>;
+#define hb_is_trivially_default_constructible(T) hb_is_trivially_default_constructible<T>::value
+
+template <typename T>
+using hb_is_trivially_copy_constructible= hb_is_copy_constructible<hb_trivial<T>>;
+#define hb_is_trivially_copy_constructible(T) hb_is_trivially_copy_constructible<T>::value
+
+template <typename T>
+using hb_is_trivially_move_constructible= hb_is_move_constructible<hb_trivial<T>>;
+#define hb_is_trivially_move_constructible(T) hb_is_trivially_move_constructible<T>::value
+
+/* Don't know how to do the following. */
+//template <typename T, typename U>
+//using hb_is_trivially_assignable= hb_is_assignable<hb_trivial<T>, hb_trivial<U>>;
+//#define hb_is_trivially_assignable(T,U) hb_is_trivially_assignable<T, U>::value
+
+template <typename T>
+using hb_is_trivially_copy_assignable= hb_is_copy_assignable<hb_trivial<T>>;
+#define hb_is_trivially_copy_assignable(T) hb_is_trivially_copy_assignable<T>::value
+
+template <typename T>
+using hb_is_trivially_move_assignable= hb_is_move_assignable<hb_trivial<T>>;
+#define hb_is_trivially_move_assignable(T) hb_is_trivially_move_assignable<T>::value
+
+template <typename T>
+using hb_is_trivially_copyable= hb_bool_constant<
+ hb_is_trivially_destructible (T) &&
+ (!hb_is_move_assignable (T) || hb_is_trivially_move_assignable (T)) &&
+ (!hb_is_move_constructible (T) || hb_is_trivially_move_constructible (T)) &&
+ (!hb_is_copy_assignable (T) || hb_is_trivially_copy_assignable (T)) &&
+ (!hb_is_copy_constructible (T) || hb_is_trivially_copy_constructible (T)) &&
+ true
+>;
+#define hb_is_trivially_copyable(T) hb_is_trivially_copyable<T>::value
+
+template <typename T>
+using hb_is_trivial= hb_bool_constant<
+ hb_is_trivially_copyable (T) &&
+ hb_is_trivially_default_constructible (T)
+>;
+#define hb_is_trivial(T) hb_is_trivial<T>::value
+
+
+#endif /* HB_META_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-mutex-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-mutex-private.hh
deleted file mode 100644
index 49ed10e08a..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-mutex-private.hh
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright © 2007 Chris Wilson
- * Copyright © 2009,2010 Red Hat, Inc.
- * Copyright © 2011,2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Contributor(s):
- * Chris Wilson <chris@chris-wilson.co.uk>
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_MUTEX_PRIVATE_HH
-#define HB_MUTEX_PRIVATE_HH
-
-#include "hb-private.hh"
-
-
-/* mutex */
-
-/* We need external help for these */
-
-#if defined(HB_MUTEX_IMPL_INIT) \
- && defined(hb_mutex_impl_init) \
- && defined(hb_mutex_impl_lock) \
- && defined(hb_mutex_impl_unlock) \
- && defined(hb_mutex_impl_finish)
-
-/* Defined externally, i.e. in config.h; must have typedef'ed hb_mutex_impl_t as well. */
-
-
-#elif !defined(HB_NO_MT) && (defined(_WIN32) || defined(__CYGWIN__))
-
-#include <windows.h>
-typedef CRITICAL_SECTION hb_mutex_impl_t;
-#define HB_MUTEX_IMPL_INIT {0}
-#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
-#define hb_mutex_impl_init(M) InitializeCriticalSectionEx (M, 0, 0)
-#else
-#define hb_mutex_impl_init(M) InitializeCriticalSection (M)
-#endif
-#define hb_mutex_impl_lock(M) EnterCriticalSection (M)
-#define hb_mutex_impl_unlock(M) LeaveCriticalSection (M)
-#define hb_mutex_impl_finish(M) DeleteCriticalSection (M)
-
-
-#elif !defined(HB_NO_MT) && (defined(HAVE_PTHREAD) || defined(__APPLE__))
-
-#include <pthread.h>
-typedef pthread_mutex_t hb_mutex_impl_t;
-#define HB_MUTEX_IMPL_INIT PTHREAD_MUTEX_INITIALIZER
-#define hb_mutex_impl_init(M) pthread_mutex_init (M, nullptr)
-#define hb_mutex_impl_lock(M) pthread_mutex_lock (M)
-#define hb_mutex_impl_unlock(M) pthread_mutex_unlock (M)
-#define hb_mutex_impl_finish(M) pthread_mutex_destroy (M)
-
-
-#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
-
-#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD)
-# include <sched.h>
-# define HB_SCHED_YIELD() sched_yield ()
-#else
-# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END
-#endif
-
-/* This actually is not a totally awful implementation. */
-typedef volatile int hb_mutex_impl_t;
-#define HB_MUTEX_IMPL_INIT 0
-#define hb_mutex_impl_init(M) *(M) = 0
-#define hb_mutex_impl_lock(M) HB_STMT_START { while (__sync_lock_test_and_set((M), 1)) HB_SCHED_YIELD (); } HB_STMT_END
-#define hb_mutex_impl_unlock(M) __sync_lock_release (M)
-#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END
-
-
-#elif !defined(HB_NO_MT)
-
-#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD)
-# include <sched.h>
-# define HB_SCHED_YIELD() sched_yield ()
-#else
-# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END
-#endif
-
-#define HB_MUTEX_INT_NIL 1 /* Warn that fallback implementation is in use. */
-typedef volatile int hb_mutex_impl_t;
-#define HB_MUTEX_IMPL_INIT 0
-#define hb_mutex_impl_init(M) *(M) = 0
-#define hb_mutex_impl_lock(M) HB_STMT_START { while (*(M)) HB_SCHED_YIELD (); (*(M))++; } HB_STMT_END
-#define hb_mutex_impl_unlock(M) (*(M))--;
-#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END
-
-
-#else /* HB_NO_MT */
-
-typedef int hb_mutex_impl_t;
-#define HB_MUTEX_IMPL_INIT 0
-#define hb_mutex_impl_init(M) HB_STMT_START {} HB_STMT_END
-#define hb_mutex_impl_lock(M) HB_STMT_START {} HB_STMT_END
-#define hb_mutex_impl_unlock(M) HB_STMT_START {} HB_STMT_END
-#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END
-
-
-#endif
-
-
-#define HB_MUTEX_INIT {HB_MUTEX_IMPL_INIT}
-
-struct hb_mutex_t
-{
- /* TODO Add tracing. */
-
- hb_mutex_impl_t m;
-
- inline void init (void) { hb_mutex_impl_init (&m); }
- inline void lock (void) { hb_mutex_impl_lock (&m); }
- inline void unlock (void) { hb_mutex_impl_unlock (&m); }
- inline void finish (void) { hb_mutex_impl_finish (&m); }
-};
-
-
-#endif /* HB_MUTEX_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-mutex.hh b/src/3rdparty/harfbuzz-ng/src/hb-mutex.hh
new file mode 100644
index 0000000000..e7f8b1c434
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-mutex.hh
@@ -0,0 +1,134 @@
+/*
+ * Copyright © 2007 Chris Wilson
+ * Copyright © 2009,2010 Red Hat, Inc.
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Contributor(s):
+ * Chris Wilson <chris@chris-wilson.co.uk>
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_MUTEX_HH
+#define HB_MUTEX_HH
+
+#include "hb.hh"
+
+
+/* mutex */
+
+/* We need external help for these */
+
+#if defined(HB_MUTEX_IMPL_INIT) \
+ && defined(hb_mutex_impl_init) \
+ && defined(hb_mutex_impl_lock) \
+ && defined(hb_mutex_impl_unlock) \
+ && defined(hb_mutex_impl_finish)
+
+/* Defined externally, i.e. in config.h; must have typedef'ed hb_mutex_impl_t as well. */
+
+
+#elif !defined(HB_NO_MT) && (defined(HAVE_PTHREAD) || defined(__APPLE__))
+
+#include <pthread.h>
+typedef pthread_mutex_t hb_mutex_impl_t;
+#define HB_MUTEX_IMPL_INIT PTHREAD_MUTEX_INITIALIZER
+#define hb_mutex_impl_init(M) pthread_mutex_init (M, nullptr)
+#define hb_mutex_impl_lock(M) pthread_mutex_lock (M)
+#define hb_mutex_impl_unlock(M) pthread_mutex_unlock (M)
+#define hb_mutex_impl_finish(M) pthread_mutex_destroy (M)
+
+
+#elif !defined(HB_NO_MT) && defined(_WIN32)
+
+#include <windows.h>
+typedef CRITICAL_SECTION hb_mutex_impl_t;
+#define HB_MUTEX_IMPL_INIT {0}
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+#define hb_mutex_impl_init(M) InitializeCriticalSectionEx (M, 0, 0)
+#else
+#define hb_mutex_impl_init(M) InitializeCriticalSection (M)
+#endif
+#define hb_mutex_impl_lock(M) EnterCriticalSection (M)
+#define hb_mutex_impl_unlock(M) LeaveCriticalSection (M)
+#define hb_mutex_impl_finish(M) DeleteCriticalSection (M)
+
+
+#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
+
+#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD)
+# include <sched.h>
+# define HB_SCHED_YIELD() sched_yield ()
+#else
+# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END
+#endif
+
+/* This actually is not a totally awful implementation. */
+typedef volatile int hb_mutex_impl_t;
+#define HB_MUTEX_IMPL_INIT 0
+#define hb_mutex_impl_init(M) *(M) = 0
+#define hb_mutex_impl_lock(M) HB_STMT_START { while (__sync_lock_test_and_set((M), 1)) HB_SCHED_YIELD (); } HB_STMT_END
+#define hb_mutex_impl_unlock(M) __sync_lock_release (M)
+#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END
+
+
+#elif defined(HB_NO_MT)
+
+typedef int hb_mutex_impl_t;
+#define HB_MUTEX_IMPL_INIT 0
+#define hb_mutex_impl_init(M) HB_STMT_START {} HB_STMT_END
+#define hb_mutex_impl_lock(M) HB_STMT_START {} HB_STMT_END
+#define hb_mutex_impl_unlock(M) HB_STMT_START {} HB_STMT_END
+#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END
+
+
+#else
+
+#error "Could not find any system to define mutex macros."
+#error "Check hb-mutex.hh for possible resolutions."
+
+#endif
+
+
+#define HB_MUTEX_INIT {HB_MUTEX_IMPL_INIT}
+
+struct hb_mutex_t
+{
+ hb_mutex_impl_t m;
+
+ void init () { hb_mutex_impl_init (&m); }
+ void lock () { hb_mutex_impl_lock (&m); }
+ void unlock () { hb_mutex_impl_unlock (&m); }
+ void fini () { hb_mutex_impl_finish (&m); }
+};
+
+struct hb_lock_t
+{
+ hb_lock_t (hb_mutex_t &mutex_) : mutex (mutex_) { mutex.lock (); }
+ ~hb_lock_t () { mutex.unlock (); }
+ private:
+ hb_mutex_t &mutex;
+};
+
+
+#endif /* HB_MUTEX_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-null.hh b/src/3rdparty/harfbuzz-ng/src/hb-null.hh
new file mode 100644
index 0000000000..d4578205e3
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-null.hh
@@ -0,0 +1,184 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_NULL_HH
+#define HB_NULL_HH
+
+#include "hb.hh"
+#include "hb-meta.hh"
+
+
+/*
+ * Static pools
+ */
+
+/* Global nul-content Null pool. Enlarge as necessary. */
+
+#define HB_NULL_POOL_SIZE 384
+
+/* Use SFINAE to sniff whether T has min_size; in which case return T::null_size,
+ * otherwise return sizeof(T). */
+
+/* The hard way...
+ * https://stackoverflow.com/questions/7776448/sfinae-tried-with-bool-gives-compiler-error-template-argument-tvalue-invol
+ */
+
+template <typename T, typename>
+struct _hb_null_size : hb_integral_constant<unsigned, sizeof (T)> {};
+template <typename T>
+struct _hb_null_size<T, hb_void_t<decltype (T::min_size)>> : hb_integral_constant<unsigned, T::null_size> {};
+
+template <typename T>
+using hb_null_size = _hb_null_size<T, void>;
+#define hb_null_size(T) hb_null_size<T>::value
+
+/* These doesn't belong here, but since is copy/paste from above, put it here. */
+
+/* hb_static_size (T)
+ * Returns T::static_size if T::min_size is defined, or sizeof (T) otherwise. */
+
+template <typename T, typename>
+struct _hb_static_size : hb_integral_constant<unsigned, sizeof (T)> {};
+template <typename T>
+struct _hb_static_size<T, hb_void_t<decltype (T::min_size)>> : hb_integral_constant<unsigned, T::static_size> {};
+template <typename T>
+using hb_static_size = _hb_static_size<T, void>;
+#define hb_static_size(T) hb_static_size<T>::value
+
+
+/*
+ * Null()
+ */
+
+extern HB_INTERNAL
+uint64_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (uint64_t) - 1) / sizeof (uint64_t)];
+
+/* Generic nul-content Null objects. */
+template <typename Type>
+struct Null {
+ static Type const & get_null ()
+ {
+ static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+ return *reinterpret_cast<Type const *> (_hb_NullPool);
+ }
+};
+template <typename QType>
+struct NullHelper
+{
+ typedef hb_remove_const<hb_remove_reference<QType>> Type;
+ static const Type & get_null () { return Null<Type>::get_null (); }
+};
+#define Null(Type) NullHelper<Type>::get_null ()
+
+/* Specializations for arbitrary-content Null objects expressed in bytes. */
+#define DECLARE_NULL_NAMESPACE_BYTES(Namespace, Type) \
+ } /* Close namespace. */ \
+ extern HB_INTERNAL const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size]; \
+ template <> \
+ struct Null<Namespace::Type> { \
+ static Namespace::Type const & get_null () { \
+ return *reinterpret_cast<const Namespace::Type *> (_hb_Null_##Namespace##_##Type); \
+ } \
+ }; \
+ namespace Namespace { \
+ static_assert (true, "Just so we take semicolon after.")
+#define DEFINE_NULL_NAMESPACE_BYTES(Namespace, Type) \
+ const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size]
+
+/* Specializations for arbitrary-content Null objects expressed as struct initializer. */
+#define DECLARE_NULL_INSTANCE(Type) \
+ extern HB_INTERNAL const Type _hb_Null_##Type; \
+ template <> \
+ struct Null<Type> { \
+ static Type const & get_null () { \
+ return _hb_Null_##Type; \
+ } \
+ }; \
+ static_assert (true, "Just so we take semicolon after.")
+#define DEFINE_NULL_INSTANCE(Type) \
+ const Type _hb_Null_##Type
+
+/* Global writable pool. Enlarge as necessary. */
+
+/* To be fully correct, CrapPool must be thread_local. However, we do not rely on CrapPool
+ * for correct operation. It only exist to catch and divert program logic bugs instead of
+ * causing bad memory access. So, races there are not actually introducing incorrectness
+ * in the code. Has ~12kb binary size overhead to have it, also clang build fails with it. */
+extern HB_INTERNAL
+/*thread_local*/ uint64_t _hb_CrapPool[(HB_NULL_POOL_SIZE + sizeof (uint64_t) - 1) / sizeof (uint64_t)];
+
+/* CRAP pool: Common Region for Access Protection. */
+template <typename Type>
+static inline Type& Crap () {
+ static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+ Type *obj = reinterpret_cast<Type *> (_hb_CrapPool);
+ memcpy (obj, &Null(Type), sizeof (*obj));
+ return *obj;
+}
+template <typename QType>
+struct CrapHelper
+{
+ typedef hb_remove_const<hb_remove_reference<QType>> Type;
+ static Type & get_crap () { return Crap<Type> (); }
+};
+#define Crap(Type) CrapHelper<Type>::get_crap ()
+
+template <typename Type>
+struct CrapOrNullHelper {
+ static Type & get () { return Crap(Type); }
+};
+template <typename Type>
+struct CrapOrNullHelper<const Type> {
+ static const Type & get () { return Null(Type); }
+};
+#define CrapOrNull(Type) CrapOrNullHelper<Type>::get ()
+
+
+/*
+ * hb_nonnull_ptr_t
+ */
+
+template <typename P>
+struct hb_nonnull_ptr_t
+{
+ typedef hb_remove_pointer<P> T;
+
+ hb_nonnull_ptr_t (T *v_ = nullptr) : v (v_) {}
+ T * operator = (T *v_) { return v = v_; }
+ T * operator -> () const { return get (); }
+ T & operator * () const { return *get (); }
+ T ** operator & () const { return &v; }
+ /* Only auto-cast to const types. */
+ template <typename C> operator const C * () const { return get (); }
+ operator const char * () const { return (const char *) get (); }
+ T * get () const { return v ? v : const_cast<T *> (&Null(T)); }
+ T * get_raw () const { return v; }
+
+ T *v;
+};
+
+
+#endif /* HB_NULL_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-number-parser.hh b/src/3rdparty/harfbuzz-ng/src/hb-number-parser.hh
new file mode 100644
index 0000000000..c78c85097e
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-number-parser.hh
@@ -0,0 +1,240 @@
+
+#line 1 "hb-number-parser.rl"
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#ifndef HB_NUMBER_PARSER_HH
+#define HB_NUMBER_PARSER_HH
+
+#include "hb.hh"
+
+#include <float.h>
+
+
+#line 37 "hb-number-parser.hh"
+static const unsigned char _double_parser_trans_keys[] = {
+ 0u, 0u, 43u, 57u, 46u, 57u, 48u, 57u, 43u, 57u, 48u, 57u, 48u, 101u, 48u, 57u,
+ 46u, 101u, 0
+};
+
+static const char _double_parser_key_spans[] = {
+ 0, 15, 12, 10, 15, 10, 54, 10,
+ 56
+};
+
+static const unsigned char _double_parser_index_offsets[] = {
+ 0, 0, 16, 29, 40, 56, 67, 122,
+ 133
+};
+
+static const char _double_parser_indicies[] = {
+ 0, 1, 2, 3, 1, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 1, 3, 1, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 1, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 1, 6, 1, 7, 1, 1, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 1, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 1, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 9, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 9, 1, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 1, 3, 1,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 9, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 9, 1, 0
+};
+
+static const char _double_parser_trans_targs[] = {
+ 2, 0, 2, 3, 8, 6, 5, 5,
+ 7, 4
+};
+
+static const char _double_parser_trans_actions[] = {
+ 0, 0, 1, 0, 2, 3, 0, 4,
+ 5, 0
+};
+
+static const int double_parser_start = 1;
+static const int double_parser_first_final = 6;
+static const int double_parser_error = 0;
+
+static const int double_parser_en_main = 1;
+
+
+#line 70 "hb-number-parser.rl"
+
+
+/* Works only for n < 512 */
+static inline double
+_pow10 (unsigned int exponent)
+{
+ static const double _powers_of_10[] =
+ {
+ 1.0e+256,
+ 1.0e+128,
+ 1.0e+64,
+ 1.0e+32,
+ 1.0e+16,
+ 1.0e+8,
+ 10000.,
+ 100.,
+ 10.
+ };
+ unsigned int mask = 1 << (ARRAY_LENGTH (_powers_of_10) - 1);
+ double result = 1;
+ for (const double *power = _powers_of_10; mask; ++power, mask >>= 1)
+ if (exponent & mask) result *= *power;
+ return result;
+}
+
+static inline double
+strtod_rl (const char *buf, char **end_ptr)
+{
+ const char *p, *pe;
+ double value = 0;
+ double frac = 0;
+ double frac_count = 0;
+ unsigned int exp = 0;
+ bool neg = false, exp_neg = false, exp_overflow = false;
+ const unsigned long long MAX_FRACT = 0xFFFFFFFFFFFFFull; /* 1^52-1 */
+ const unsigned int MAX_EXP = 0x7FFu; /* 1^11-1 */
+ p = buf;
+ pe = p + strlen (p);
+
+ while (p < pe && ISSPACE (*p))
+ p++;
+
+ int cs;
+
+#line 142 "hb-number-parser.hh"
+ {
+ cs = double_parser_start;
+ }
+
+#line 147 "hb-number-parser.hh"
+ {
+ int _slen;
+ int _trans;
+ const unsigned char *_keys;
+ const char *_inds;
+ if ( p == pe )
+ goto _test_eof;
+ if ( cs == 0 )
+ goto _out;
+_resume:
+ _keys = _double_parser_trans_keys + (cs<<1);
+ _inds = _double_parser_indicies + _double_parser_index_offsets[cs];
+
+ _slen = _double_parser_key_spans[cs];
+ _trans = _inds[ _slen > 0 && _keys[0] <=(*p) &&
+ (*p) <= _keys[1] ?
+ (*p) - _keys[0] : _slen ];
+
+ cs = _double_parser_trans_targs[_trans];
+
+ if ( _double_parser_trans_actions[_trans] == 0 )
+ goto _again;
+
+ switch ( _double_parser_trans_actions[_trans] ) {
+ case 1:
+#line 39 "hb-number-parser.rl"
+ { neg = true; }
+ break;
+ case 4:
+#line 40 "hb-number-parser.rl"
+ { exp_neg = true; }
+ break;
+ case 2:
+#line 42 "hb-number-parser.rl"
+ {
+ value = value * 10. + ((*p) - '0');
+}
+ break;
+ case 3:
+#line 45 "hb-number-parser.rl"
+ {
+ if (likely (frac <= MAX_FRACT / 10))
+ {
+ frac = frac * 10. + ((*p) - '0');
+ ++frac_count;
+ }
+}
+ break;
+ case 5:
+#line 52 "hb-number-parser.rl"
+ {
+ if (likely (exp * 10 + ((*p) - '0') <= MAX_EXP))
+ exp = exp * 10 + ((*p) - '0');
+ else
+ exp_overflow = true;
+}
+ break;
+#line 205 "hb-number-parser.hh"
+ }
+
+_again:
+ if ( cs == 0 )
+ goto _out;
+ if ( ++p != pe )
+ goto _resume;
+ _test_eof: {}
+ _out: {}
+ }
+
+#line 116 "hb-number-parser.rl"
+
+
+ *end_ptr = (char *) p;
+
+ if (frac_count) value += frac / _pow10 (frac_count);
+ if (neg) value *= -1.;
+
+ if (unlikely (exp_overflow))
+ {
+ if (value == 0) return value;
+ if (exp_neg) return neg ? -DBL_MIN : DBL_MIN;
+ else return neg ? -DBL_MAX : DBL_MAX;
+ }
+
+ if (exp)
+ {
+ if (exp_neg) value /= _pow10 (exp);
+ else value *= _pow10 (exp);
+ }
+
+ return value;
+}
+
+#endif /* HB_NUMBER_PARSER_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-number-parser.rl b/src/3rdparty/harfbuzz-ng/src/hb-number-parser.rl
new file mode 100644
index 0000000000..8445fa22a1
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-number-parser.rl
@@ -0,0 +1,139 @@
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#ifndef HB_NUMBER_PARSER_HH
+#define HB_NUMBER_PARSER_HH
+
+#include "hb.hh"
+
+#include <float.h>
+
+%%{
+
+machine double_parser;
+alphtype unsigned char;
+write data;
+
+action see_neg { neg = true; }
+action see_exp_neg { exp_neg = true; }
+
+action add_int {
+ value = value * 10. + (fc - '0');
+}
+action add_frac {
+ if (likely (frac <= MAX_FRACT / 10))
+ {
+ frac = frac * 10. + (fc - '0');
+ ++frac_count;
+ }
+}
+action add_exp {
+ if (likely (exp * 10 + (fc - '0') <= MAX_EXP))
+ exp = exp * 10 + (fc - '0');
+ else
+ exp_overflow = true;
+}
+
+num = [0-9]+;
+
+main := (
+ (
+ (('+'|'-'@see_neg)? num @add_int) ('.' num @add_frac)?
+ |
+ (('+'|'-'@see_neg)? '.' num @add_frac)
+ )
+ (('e'|'E') (('+'|'-'@see_exp_neg)? num @add_exp))?
+);
+
+}%%
+
+/* Works only for n < 512 */
+static inline double
+_pow10 (unsigned int exponent)
+{
+ static const double _powers_of_10[] =
+ {
+ 1.0e+256,
+ 1.0e+128,
+ 1.0e+64,
+ 1.0e+32,
+ 1.0e+16,
+ 1.0e+8,
+ 10000.,
+ 100.,
+ 10.
+ };
+ unsigned int mask = 1 << (ARRAY_LENGTH (_powers_of_10) - 1);
+ double result = 1;
+ for (const double *power = _powers_of_10; mask; ++power, mask >>= 1)
+ if (exponent & mask) result *= *power;
+ return result;
+}
+
+static inline double
+strtod_rl (const char *buf, char **end_ptr)
+{
+ const char *p, *pe;
+ double value = 0;
+ double frac = 0;
+ double frac_count = 0;
+ unsigned int exp = 0;
+ bool neg = false, exp_neg = false, exp_overflow = false;
+ const unsigned long long MAX_FRACT = 0xFFFFFFFFFFFFFull; /* 1^52-1 */
+ const unsigned int MAX_EXP = 0x7FFu; /* 1^11-1 */
+ p = buf;
+ pe = p + strlen (p);
+
+ while (p < pe && ISSPACE (*p))
+ p++;
+
+ int cs;
+ %%{
+ write init;
+ write exec;
+ }%%
+
+ *end_ptr = (char *) p;
+
+ if (frac_count) value += frac / _pow10 (frac_count);
+ if (neg) value *= -1.;
+
+ if (unlikely (exp_overflow))
+ {
+ if (value == 0) return value;
+ if (exp_neg) return neg ? -DBL_MIN : DBL_MIN;
+ else return neg ? -DBL_MAX : DBL_MAX;
+ }
+
+ if (exp)
+ {
+ if (exp_neg) value /= _pow10 (exp);
+ else value *= _pow10 (exp);
+ }
+
+ return value;
+}
+
+#endif /* HB_NUMBER_PARSER_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-number.cc b/src/3rdparty/harfbuzz-ng/src/hb-number.cc
new file mode 100644
index 0000000000..4f84d4ad5c
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-number.cc
@@ -0,0 +1,147 @@
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#include "hb.hh"
+#include "hb-machinery.hh"
+#include "hb-number-parser.hh"
+
+#include <locale.h>
+#ifdef HAVE_XLOCALE_H
+#include <xlocale.h>
+#endif
+
+template<typename T, typename Func>
+static bool
+_parse_number (const char **pp, const char *end, T *pv,
+ bool whole_buffer, Func f)
+{
+ char buf[32];
+ unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1,
+ (unsigned int) (end - *pp));
+ strncpy (buf, *pp, len);
+ buf[len] = '\0';
+
+ char *p = buf;
+ char *pend = p;
+
+ errno = 0;
+ *pv = f (p, &pend);
+ if (unlikely (errno || p == pend ||
+ /* Check if consumed whole buffer if is requested */
+ (whole_buffer && pend - p != end - *pp))) return false;
+
+ *pp += pend - p;
+ return true;
+}
+
+bool
+hb_parse_int (const char **pp, const char *end, int *pv, bool whole_buffer)
+{
+ return _parse_number<int> (pp, end, pv, whole_buffer,
+ [] (const char *p, char **end)
+ { return strtol (p, end, 10); });
+}
+
+bool
+hb_parse_uint (const char **pp, const char *end, unsigned int *pv,
+ bool whole_buffer, int base)
+{
+ return _parse_number<unsigned int> (pp, end, pv, whole_buffer,
+ [base] (const char *p, char **end)
+ { return strtoul (p, end, base); });
+}
+
+
+#if defined (HAVE_NEWLOCALE) && defined (HAVE_STRTOD_L)
+#define USE_XLOCALE 1
+#define HB_LOCALE_T locale_t
+#define HB_CREATE_LOCALE(locName) newlocale (LC_ALL_MASK, locName, nullptr)
+#define HB_FREE_LOCALE(loc) freelocale (loc)
+#elif defined(_MSC_VER)
+#define USE_XLOCALE 1
+#define HB_LOCALE_T _locale_t
+#define HB_CREATE_LOCALE(locName) _create_locale (LC_ALL, locName)
+#define HB_FREE_LOCALE(loc) _free_locale (loc)
+#define strtod_l(a, b, c) _strtod_l ((a), (b), (c))
+#endif
+
+#ifdef USE_XLOCALE
+
+#if HB_USE_ATEXIT
+static void free_static_C_locale ();
+#endif
+
+static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<HB_LOCALE_T>,
+ hb_C_locale_lazy_loader_t>
+{
+ static HB_LOCALE_T create ()
+ {
+ HB_LOCALE_T C_locale = HB_CREATE_LOCALE ("C");
+
+#if HB_USE_ATEXIT
+ atexit (free_static_C_locale);
+#endif
+
+ return C_locale;
+ }
+ static void destroy (HB_LOCALE_T p)
+ {
+ HB_FREE_LOCALE (p);
+ }
+ static HB_LOCALE_T get_null ()
+ {
+ return nullptr;
+ }
+} static_C_locale;
+
+#if HB_USE_ATEXIT
+static
+void free_static_C_locale ()
+{
+ static_C_locale.free_instance ();
+}
+#endif
+
+static HB_LOCALE_T
+get_C_locale ()
+{
+ return static_C_locale.get_unconst ();
+}
+#endif /* USE_XLOCALE */
+
+bool
+hb_parse_double (const char **pp, const char *end, double *pv,
+ bool whole_buffer)
+{
+ return _parse_number<double> (pp, end, pv, whole_buffer,
+ [] (const char *p, char **end)
+ {
+#ifdef USE_XLOCALE
+ return strtod_l (p, end, get_C_locale ());
+#else
+ return strtod_rl (p, end);
+#endif
+ });
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-number.hh b/src/3rdparty/harfbuzz-ng/src/hb-number.hh
new file mode 100644
index 0000000000..14d1260aa3
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-number.hh
@@ -0,0 +1,41 @@
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#ifndef HB_NUMBER_HH
+#define HB_NUMBER_HH
+
+HB_INTERNAL bool
+hb_parse_int (const char **pp, const char *end, int *pv,
+ bool whole_buffer = false);
+
+HB_INTERNAL bool
+hb_parse_uint (const char **pp, const char *end, unsigned int *pv,
+ bool whole_buffer = false, int base = 10);
+
+HB_INTERNAL bool
+hb_parse_double (const char **pp, const char *end, double *pv,
+ bool whole_buffer = false);
+
+#endif /* HB_NUMBER_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-object-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-object-private.hh
deleted file mode 100644
index baa1f8f05c..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-object-private.hh
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright © 2007 Chris Wilson
- * Copyright © 2009,2010 Red Hat, Inc.
- * Copyright © 2011,2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Contributor(s):
- * Chris Wilson <chris@chris-wilson.co.uk>
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OBJECT_PRIVATE_HH
-#define HB_OBJECT_PRIVATE_HH
-
-#include "hb-private.hh"
-#include "hb-debug.hh"
-
-#include "hb-atomic-private.hh"
-#include "hb-mutex-private.hh"
-
-
-/* reference_count */
-
-#define HB_REFERENCE_COUNT_INERT_VALUE -1
-#define HB_REFERENCE_COUNT_POISON_VALUE -0x0000DEAD
-#define HB_REFERENCE_COUNT_INIT {HB_ATOMIC_INT_INIT(HB_REFERENCE_COUNT_INERT_VALUE)}
-
-struct hb_reference_count_t
-{
- hb_atomic_int_t ref_count;
-
- inline void init (int v) { ref_count.set_unsafe (v); }
- inline int get_unsafe (void) const { return ref_count.get_unsafe (); }
- inline int inc (void) { return ref_count.inc (); }
- inline int dec (void) { return ref_count.dec (); }
- inline void finish (void) { ref_count.set_unsafe (HB_REFERENCE_COUNT_POISON_VALUE); }
-
- inline bool is_inert (void) const { return ref_count.get_unsafe () == HB_REFERENCE_COUNT_INERT_VALUE; }
- inline bool is_valid (void) const { return ref_count.get_unsafe () > 0; }
-};
-
-
-/* user_data */
-
-#define HB_USER_DATA_ARRAY_INIT {HB_MUTEX_INIT, HB_LOCKABLE_SET_INIT}
-struct hb_user_data_array_t
-{
- struct hb_user_data_item_t {
- hb_user_data_key_t *key;
- void *data;
- hb_destroy_func_t destroy;
-
- inline bool operator == (hb_user_data_key_t *other_key) const { return key == other_key; }
- inline bool operator == (hb_user_data_item_t &other) const { return key == other.key; }
-
- void finish (void) { if (destroy) destroy (data); }
- };
-
- hb_mutex_t lock;
- hb_lockable_set_t<hb_user_data_item_t, hb_mutex_t> items;
-
- inline void init (void) { lock.init (); items.init (); }
-
- HB_INTERNAL bool set (hb_user_data_key_t *key,
- void * data,
- hb_destroy_func_t destroy,
- hb_bool_t replace);
-
- HB_INTERNAL void *get (hb_user_data_key_t *key);
-
- inline void finish (void) { items.finish (lock); lock.finish (); }
-};
-
-
-/* object_header */
-
-struct hb_object_header_t
-{
- hb_reference_count_t ref_count;
- hb_user_data_array_t user_data;
-
-#define HB_OBJECT_HEADER_STATIC {HB_REFERENCE_COUNT_INIT, HB_USER_DATA_ARRAY_INIT}
-
- private:
- ASSERT_POD ();
-};
-
-
-/* object */
-
-template <typename Type>
-static inline void hb_object_trace (const Type *obj, const char *function)
-{
- DEBUG_MSG (OBJECT, (void *) obj,
- "%s refcount=%d",
- function,
- obj ? obj->header.ref_count.get_unsafe () : 0);
-}
-
-template <typename Type>
-static inline Type *hb_object_create (void)
-{
- Type *obj = (Type *) calloc (1, sizeof (Type));
-
- if (unlikely (!obj))
- return obj;
-
- hb_object_init (obj);
- hb_object_trace (obj, HB_FUNC);
- return obj;
-}
-template <typename Type>
-static inline void hb_object_init (Type *obj)
-{
- obj->header.ref_count.init (1);
- obj->header.user_data.init ();
-}
-template <typename Type>
-static inline bool hb_object_is_inert (const Type *obj)
-{
- return unlikely (obj->header.ref_count.is_inert ());
-}
-template <typename Type>
-static inline bool hb_object_is_valid (const Type *obj)
-{
- return likely (obj->header.ref_count.is_valid ());
-}
-template <typename Type>
-static inline Type *hb_object_reference (Type *obj)
-{
- hb_object_trace (obj, HB_FUNC);
- if (unlikely (!obj || hb_object_is_inert (obj)))
- return obj;
- assert (hb_object_is_valid (obj));
- obj->header.ref_count.inc ();
- return obj;
-}
-template <typename Type>
-static inline bool hb_object_destroy (Type *obj)
-{
- hb_object_trace (obj, HB_FUNC);
- if (unlikely (!obj || hb_object_is_inert (obj)))
- return false;
- assert (hb_object_is_valid (obj));
- if (obj->header.ref_count.dec () != 1)
- return false;
-
- obj->header.ref_count.finish (); /* Do this before user_data */
- obj->header.user_data.finish ();
- return true;
-}
-template <typename Type>
-static inline bool hb_object_set_user_data (Type *obj,
- hb_user_data_key_t *key,
- void * data,
- hb_destroy_func_t destroy,
- hb_bool_t replace)
-{
- if (unlikely (!obj || hb_object_is_inert (obj)))
- return false;
- assert (hb_object_is_valid (obj));
- return obj->header.user_data.set (key, data, destroy, replace);
-}
-
-template <typename Type>
-static inline void *hb_object_get_user_data (Type *obj,
- hb_user_data_key_t *key)
-{
- if (unlikely (!obj || hb_object_is_inert (obj)))
- return nullptr;
- assert (hb_object_is_valid (obj));
- return obj->header.user_data.get (key);
-}
-
-
-#endif /* HB_OBJECT_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-object.hh b/src/3rdparty/harfbuzz-ng/src/hb-object.hh
new file mode 100644
index 0000000000..c470532aac
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-object.hh
@@ -0,0 +1,342 @@
+/*
+ * Copyright © 2007 Chris Wilson
+ * Copyright © 2009,2010 Red Hat, Inc.
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Contributor(s):
+ * Chris Wilson <chris@chris-wilson.co.uk>
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OBJECT_HH
+#define HB_OBJECT_HH
+
+#include "hb.hh"
+#include "hb-atomic.hh"
+#include "hb-mutex.hh"
+#include "hb-vector.hh"
+
+
+/*
+ * Lockable set
+ */
+
+template <typename item_t, typename lock_t>
+struct hb_lockable_set_t
+{
+ hb_vector_t<item_t> items;
+
+ void init () { items.init (); }
+
+ template <typename T>
+ item_t *replace_or_insert (T v, lock_t &l, bool replace)
+ {
+ l.lock ();
+ item_t *item = items.find (v);
+ if (item) {
+ if (replace) {
+ item_t old = *item;
+ *item = v;
+ l.unlock ();
+ old.fini ();
+ }
+ else {
+ item = nullptr;
+ l.unlock ();
+ }
+ } else {
+ item = items.push (v);
+ l.unlock ();
+ }
+ return item;
+ }
+
+ template <typename T>
+ void remove (T v, lock_t &l)
+ {
+ l.lock ();
+ item_t *item = items.find (v);
+ if (item)
+ {
+ item_t old = *item;
+ *item = items[items.length - 1];
+ items.pop ();
+ l.unlock ();
+ old.fini ();
+ } else {
+ l.unlock ();
+ }
+ }
+
+ template <typename T>
+ bool find (T v, item_t *i, lock_t &l)
+ {
+ l.lock ();
+ item_t *item = items.find (v);
+ if (item)
+ *i = *item;
+ l.unlock ();
+ return !!item;
+ }
+
+ template <typename T>
+ item_t *find_or_insert (T v, lock_t &l)
+ {
+ l.lock ();
+ item_t *item = items.find (v);
+ if (!item) {
+ item = items.push (v);
+ }
+ l.unlock ();
+ return item;
+ }
+
+ void fini (lock_t &l)
+ {
+ if (!items.length)
+ {
+ /* No need to lock. */
+ items.fini ();
+ return;
+ }
+ l.lock ();
+ while (items.length)
+ {
+ item_t old = items[items.length - 1];
+ items.pop ();
+ l.unlock ();
+ old.fini ();
+ l.lock ();
+ }
+ items.fini ();
+ l.unlock ();
+ }
+
+};
+
+
+/*
+ * Reference-count.
+ */
+
+#define HB_REFERENCE_COUNT_INERT_VALUE 0
+#define HB_REFERENCE_COUNT_POISON_VALUE -0x0000DEAD
+#define HB_REFERENCE_COUNT_INIT {HB_ATOMIC_INT_INIT (HB_REFERENCE_COUNT_INERT_VALUE)}
+
+struct hb_reference_count_t
+{
+ mutable hb_atomic_int_t ref_count;
+
+ void init (int v = 1) { ref_count.set_relaxed (v); }
+ int get_relaxed () const { return ref_count.get_relaxed (); }
+ int inc () const { return ref_count.inc (); }
+ int dec () const { return ref_count.dec (); }
+ void fini () { ref_count.set_relaxed (HB_REFERENCE_COUNT_POISON_VALUE); }
+
+ bool is_inert () const { return ref_count.get_relaxed () == HB_REFERENCE_COUNT_INERT_VALUE; }
+ bool is_valid () const { return ref_count.get_relaxed () > 0; }
+};
+
+
+/* user_data */
+
+struct hb_user_data_array_t
+{
+ struct hb_user_data_item_t {
+ hb_user_data_key_t *key;
+ void *data;
+ hb_destroy_func_t destroy;
+
+ bool operator == (hb_user_data_key_t *other_key) const { return key == other_key; }
+ bool operator == (hb_user_data_item_t &other) const { return key == other.key; }
+
+ void fini () { if (destroy) destroy (data); }
+ };
+
+ hb_mutex_t lock;
+ hb_lockable_set_t<hb_user_data_item_t, hb_mutex_t> items;
+
+ void init () { lock.init (); items.init (); }
+
+ HB_INTERNAL bool set (hb_user_data_key_t *key,
+ void * data,
+ hb_destroy_func_t destroy,
+ hb_bool_t replace);
+
+ HB_INTERNAL void *get (hb_user_data_key_t *key);
+
+ void fini () { items.fini (lock); lock.fini (); }
+};
+
+
+/*
+ * Object header
+ */
+
+struct hb_object_header_t
+{
+ hb_reference_count_t ref_count;
+ mutable hb_atomic_int_t writable;
+ hb_atomic_ptr_t<hb_user_data_array_t> user_data;
+};
+#define HB_OBJECT_HEADER_STATIC \
+ { \
+ HB_REFERENCE_COUNT_INIT, \
+ HB_ATOMIC_INT_INIT (false), \
+ HB_ATOMIC_PTR_INIT (nullptr) \
+ }
+
+
+/*
+ * Object
+ */
+
+template <typename Type>
+static inline void hb_object_trace (const Type *obj, const char *function)
+{
+ DEBUG_MSG (OBJECT, (void *) obj,
+ "%s refcount=%d",
+ function,
+ obj ? obj->header.ref_count.get_relaxed () : 0);
+}
+
+template <typename Type>
+static inline Type *hb_object_create ()
+{
+ Type *obj = (Type *) calloc (1, sizeof (Type));
+
+ if (unlikely (!obj))
+ return obj;
+
+ hb_object_init (obj);
+ hb_object_trace (obj, HB_FUNC);
+ return obj;
+}
+template <typename Type>
+static inline void hb_object_init (Type *obj)
+{
+ obj->header.ref_count.init ();
+ obj->header.writable.set_relaxed (true);
+ obj->header.user_data.init ();
+}
+template <typename Type>
+static inline bool hb_object_is_inert (const Type *obj)
+{
+ return unlikely (obj->header.ref_count.is_inert ());
+}
+template <typename Type>
+static inline bool hb_object_is_valid (const Type *obj)
+{
+ return likely (obj->header.ref_count.is_valid ());
+}
+template <typename Type>
+static inline bool hb_object_is_immutable (const Type *obj)
+{
+ return !obj->header.writable.get_relaxed ();
+}
+template <typename Type>
+static inline void hb_object_make_immutable (const Type *obj)
+{
+ obj->header.writable.set_relaxed (false);
+}
+template <typename Type>
+static inline Type *hb_object_reference (Type *obj)
+{
+ hb_object_trace (obj, HB_FUNC);
+ if (unlikely (!obj || hb_object_is_inert (obj)))
+ return obj;
+ assert (hb_object_is_valid (obj));
+ obj->header.ref_count.inc ();
+ return obj;
+}
+template <typename Type>
+static inline bool hb_object_destroy (Type *obj)
+{
+ hb_object_trace (obj, HB_FUNC);
+ if (unlikely (!obj || hb_object_is_inert (obj)))
+ return false;
+ assert (hb_object_is_valid (obj));
+ if (obj->header.ref_count.dec () != 1)
+ return false;
+
+ hb_object_fini (obj);
+ return true;
+}
+template <typename Type>
+static inline void hb_object_fini (Type *obj)
+{
+ obj->header.ref_count.fini (); /* Do this before user_data */
+ hb_user_data_array_t *user_data = obj->header.user_data.get ();
+ if (user_data)
+ {
+ user_data->fini ();
+ free (user_data);
+ user_data = nullptr;
+ }
+}
+template <typename Type>
+static inline bool hb_object_set_user_data (Type *obj,
+ hb_user_data_key_t *key,
+ void * data,
+ hb_destroy_func_t destroy,
+ hb_bool_t replace)
+{
+ if (unlikely (!obj || hb_object_is_inert (obj)))
+ return false;
+ assert (hb_object_is_valid (obj));
+
+retry:
+ hb_user_data_array_t *user_data = obj->header.user_data.get ();
+ if (unlikely (!user_data))
+ {
+ user_data = (hb_user_data_array_t *) calloc (sizeof (hb_user_data_array_t), 1);
+ if (unlikely (!user_data))
+ return false;
+ user_data->init ();
+ if (unlikely (!obj->header.user_data.cmpexch (nullptr, user_data)))
+ {
+ user_data->fini ();
+ free (user_data);
+ goto retry;
+ }
+ }
+
+ return user_data->set (key, data, destroy, replace);
+}
+
+template <typename Type>
+static inline void *hb_object_get_user_data (Type *obj,
+ hb_user_data_key_t *key)
+{
+ if (unlikely (!obj || hb_object_is_inert (obj)))
+ return nullptr;
+ assert (hb_object_is_valid (obj));
+ hb_user_data_array_t *user_data = obj->header.user_data.get ();
+ if (!user_data)
+ return nullptr;
+ return user_data->get (key);
+}
+
+
+#endif /* HB_OBJECT_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-open-file-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-open-file-private.hh
deleted file mode 100644
index 644e0b40f6..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-open-file-private.hh
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Copyright © 2007,2008,2009 Red Hat, Inc.
- * Copyright © 2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OPEN_FILE_PRIVATE_HH
-#define HB_OPEN_FILE_PRIVATE_HH
-
-#include "hb-open-type-private.hh"
-
-
-namespace OT {
-
-
-/*
- *
- * The OpenType Font File
- *
- */
-
-
-/*
- * Organization of an OpenType Font
- */
-
-struct OpenTypeFontFile;
-struct OffsetTable;
-struct TTCHeader;
-
-
-typedef struct TableRecord
-{
- int cmp (Tag t) const
- { return t.cmp (tag); }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- Tag tag; /* 4-byte identifier. */
- CheckSum checkSum; /* CheckSum for this table. */
- UINT32 offset; /* Offset from beginning of TrueType font
- * file. */
- UINT32 length; /* Length of this table. */
- public:
- DEFINE_SIZE_STATIC (16);
-} OpenTypeTable;
-
-typedef struct OffsetTable
-{
- friend struct OpenTypeFontFile;
-
- inline unsigned int get_table_count (void) const
- { return tables.len; }
- inline const TableRecord& get_table (unsigned int i) const
- {
- return tables[i];
- }
- inline unsigned int get_table_tags (unsigned int start_offset,
- unsigned int *table_count, /* IN/OUT */
- hb_tag_t *table_tags /* OUT */) const
- {
- if (table_count)
- {
- if (start_offset >= tables.len)
- *table_count = 0;
- else
- *table_count = MIN<unsigned int> (*table_count, tables.len - start_offset);
-
- const TableRecord *sub_tables = tables.array + start_offset;
- unsigned int count = *table_count;
- for (unsigned int i = 0; i < count; i++)
- table_tags[i] = sub_tables[i].tag;
- }
- return tables.len;
- }
- inline bool find_table_index (hb_tag_t tag, unsigned int *table_index) const
- {
- Tag t;
- t.set (tag);
- /* Linear-search for small tables to work around fonts with unsorted
- * table list. */
- int i = tables.len < 64 ? tables.lsearch (t) : tables.bsearch (t);
- if (table_index)
- *table_index = i == -1 ? Index::NOT_FOUND_INDEX : (unsigned int) i;
- return i != -1;
- }
- inline const TableRecord& get_table_by_tag (hb_tag_t tag) const
- {
- unsigned int table_index;
- find_table_index (tag, &table_index);
- return get_table (table_index);
- }
-
- public:
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && tables.sanitize (c));
- }
-
- protected:
- Tag sfnt_version; /* '\0\001\0\00' if TrueType / 'OTTO' if CFF */
- BinSearchArrayOf<TableRecord>
- tables;
- public:
- DEFINE_SIZE_ARRAY (12, tables);
-} OpenTypeFontFace;
-
-
-/*
- * TrueType Collections
- */
-
-struct TTCHeaderVersion1
-{
- friend struct TTCHeader;
-
- inline unsigned int get_face_count (void) const { return table.len; }
- inline const OpenTypeFontFace& get_face (unsigned int i) const { return this+table[i]; }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (table.sanitize (c, this));
- }
-
- protected:
- Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */
- FixedVersion<>version; /* Version of the TTC Header (1.0),
- * 0x00010000u */
- ArrayOf<LOffsetTo<OffsetTable>, UINT32>
- table; /* Array of offsets to the OffsetTable for each font
- * from the beginning of the file */
- public:
- DEFINE_SIZE_ARRAY (12, table);
-};
-
-struct TTCHeader
-{
- friend struct OpenTypeFontFile;
-
- private:
-
- inline unsigned int get_face_count (void) const
- {
- switch (u.header.version.major) {
- case 2: /* version 2 is compatible with version 1 */
- case 1: return u.version1.get_face_count ();
- default:return 0;
- }
- }
- inline const OpenTypeFontFace& get_face (unsigned int i) const
- {
- switch (u.header.version.major) {
- case 2: /* version 2 is compatible with version 1 */
- case 1: return u.version1.get_face (i);
- default:return Null(OpenTypeFontFace);
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!u.header.version.sanitize (c))) return_trace (false);
- switch (u.header.version.major) {
- case 2: /* version 2 is compatible with version 1 */
- case 1: return_trace (u.version1.sanitize (c));
- default:return_trace (true);
- }
- }
-
- protected:
- union {
- struct {
- Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */
- FixedVersion<>version; /* Version of the TTC Header (1.0 or 2.0),
- * 0x00010000u or 0x00020000u */
- } header;
- TTCHeaderVersion1 version1;
- } u;
-};
-
-
-/*
- * OpenType Font File
- */
-
-struct OpenTypeFontFile
-{
- static const hb_tag_t tableTag = HB_TAG ('_','_','_','_'); /* Sanitizer needs this. */
-
- static const hb_tag_t CFFTag = HB_TAG ('O','T','T','O'); /* OpenType with Postscript outlines */
- static const hb_tag_t TrueTypeTag = HB_TAG ( 0 , 1 , 0 , 0 ); /* OpenType with TrueType outlines */
- static const hb_tag_t TTCTag = HB_TAG ('t','t','c','f'); /* TrueType Collection */
- static const hb_tag_t TrueTag = HB_TAG ('t','r','u','e'); /* Obsolete Apple TrueType */
- static const hb_tag_t Typ1Tag = HB_TAG ('t','y','p','1'); /* Obsolete Apple Type1 font in SFNT container */
-
- inline hb_tag_t get_tag (void) const { return u.tag; }
-
- inline unsigned int get_face_count (void) const
- {
- switch (u.tag) {
- case CFFTag: /* All the non-collection tags */
- case TrueTag:
- case Typ1Tag:
- case TrueTypeTag: return 1;
- case TTCTag: return u.ttcHeader.get_face_count ();
- default: return 0;
- }
- }
- inline const OpenTypeFontFace& get_face (unsigned int i) const
- {
- switch (u.tag) {
- /* Note: for non-collection SFNT data we ignore index. This is because
- * Apple dfont container is a container of SFNT's. So each SFNT is a
- * non-TTC, but the index is more than zero. */
- case CFFTag: /* All the non-collection tags */
- case TrueTag:
- case Typ1Tag:
- case TrueTypeTag: return u.fontFace;
- case TTCTag: return u.ttcHeader.get_face (i);
- default: return Null(OpenTypeFontFace);
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!u.tag.sanitize (c))) return_trace (false);
- switch (u.tag) {
- case CFFTag: /* All the non-collection tags */
- case TrueTag:
- case Typ1Tag:
- case TrueTypeTag: return_trace (u.fontFace.sanitize (c));
- case TTCTag: return_trace (u.ttcHeader.sanitize (c));
- default: return_trace (true);
- }
- }
-
- protected:
- union {
- Tag tag; /* 4-byte identifier. */
- OpenTypeFontFace fontFace;
- TTCHeader ttcHeader;
- } u;
- public:
- DEFINE_SIZE_UNION (4, tag);
-};
-
-
-} /* namespace OT */
-
-
-#endif /* HB_OPEN_FILE_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-open-file.hh b/src/3rdparty/harfbuzz-ng/src/hb-open-file.hh
new file mode 100644
index 0000000000..cb1fdf1c99
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-open-file.hh
@@ -0,0 +1,526 @@
+/*
+ * Copyright © 2007,2008,2009 Red Hat, Inc.
+ * Copyright © 2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OPEN_FILE_HH
+#define HB_OPEN_FILE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-head-table.hh"
+
+
+namespace OT {
+
+
+/*
+ *
+ * The OpenType Font File
+ *
+ */
+
+
+/*
+ * Organization of an OpenType Font
+ */
+
+struct OpenTypeFontFile;
+struct OffsetTable;
+struct TTCHeader;
+
+
+typedef struct TableRecord
+{
+ int cmp (Tag t) const { return -t.cmp (tag); }
+
+ HB_INTERNAL static int cmp (const void *pa, const void *pb)
+ {
+ const TableRecord *a = (const TableRecord *) pa;
+ const TableRecord *b = (const TableRecord *) pb;
+ return b->cmp (a->tag);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ Tag tag; /* 4-byte identifier. */
+ CheckSum checkSum; /* CheckSum for this table. */
+ Offset32 offset; /* Offset from beginning of TrueType font
+ * file. */
+ HBUINT32 length; /* Length of this table. */
+ public:
+ DEFINE_SIZE_STATIC (16);
+} OpenTypeTable;
+
+typedef struct OffsetTable
+{
+ friend struct OpenTypeFontFile;
+
+ unsigned int get_table_count () const { return tables.len; }
+ const TableRecord& get_table (unsigned int i) const
+ { return tables[i]; }
+ unsigned int get_table_tags (unsigned int start_offset,
+ unsigned int *table_count, /* IN/OUT */
+ hb_tag_t *table_tags /* OUT */) const
+ {
+ if (table_count)
+ {
+ if (start_offset >= tables.len)
+ *table_count = 0;
+ else
+ *table_count = hb_min (*table_count, tables.len - start_offset);
+
+ const TableRecord *sub_tables = tables.arrayZ + start_offset;
+ unsigned int count = *table_count;
+ for (unsigned int i = 0; i < count; i++)
+ table_tags[i] = sub_tables[i].tag;
+ }
+ return tables.len;
+ }
+ bool find_table_index (hb_tag_t tag, unsigned int *table_index) const
+ {
+ Tag t;
+ t = tag;
+ return tables.bfind (t, table_index, HB_BFIND_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
+ }
+ const TableRecord& get_table_by_tag (hb_tag_t tag) const
+ {
+ unsigned int table_index;
+ find_table_index (tag, &table_index);
+ return get_table (table_index);
+ }
+
+ public:
+
+ template <typename item_t>
+ bool serialize (hb_serialize_context_t *c,
+ hb_tag_t sfnt_tag,
+ hb_array_t<item_t> items)
+ {
+ TRACE_SERIALIZE (this);
+ /* Alloc 12 for the OTHeader. */
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+ /* Write sfntVersion (bytes 0..3). */
+ sfnt_version = sfnt_tag;
+ /* Take space for numTables, searchRange, entrySelector, RangeShift
+ * and the TableRecords themselves. */
+ if (unlikely (!tables.serialize (c, items.length))) return_trace (false);
+
+ const char *dir_end = (const char *) c->head;
+ HBUINT32 *checksum_adjustment = nullptr;
+
+ /* Write OffsetTables, alloc for and write actual table blobs. */
+ for (unsigned int i = 0; i < tables.len; i++)
+ {
+ TableRecord &rec = tables.arrayZ[i];
+ hb_blob_t *blob = items[i].blob;
+ rec.tag = items[i].tag;
+ rec.length = blob->length;
+ rec.offset.serialize (c, this);
+
+ /* Allocate room for the table and copy it. */
+ char *start = (char *) c->allocate_size<void> (rec.length);
+ if (unlikely (!start)) return false;
+
+ if (likely (rec.length))
+ memcpy (start, blob->data, rec.length);
+
+ /* 4-byte alignment. */
+ c->align (4);
+ const char *end = (const char *) c->head;
+
+ if (items[i].tag == HB_OT_TAG_head &&
+ (unsigned) (end - start) >= head::static_size)
+ {
+ head *h = (head *) start;
+ checksum_adjustment = &h->checkSumAdjustment;
+ *checksum_adjustment = 0;
+ }
+
+ rec.checkSum.set_for_data (start, end - start);
+ }
+
+ tables.qsort ();
+
+ if (checksum_adjustment)
+ {
+ CheckSum checksum;
+
+ /* The following line is a slower version of the following block. */
+ //checksum.set_for_data (this, (const char *) c->head - (const char *) this);
+ checksum.set_for_data (this, dir_end - (const char *) this);
+ for (unsigned int i = 0; i < items.length; i++)
+ {
+ TableRecord &rec = tables.arrayZ[i];
+ checksum = checksum + rec.checkSum;
+ }
+
+ *checksum_adjustment = 0xB1B0AFBAu - checksum;
+ }
+
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && tables.sanitize (c));
+ }
+
+ protected:
+ Tag sfnt_version; /* '\0\001\0\00' if TrueType / 'OTTO' if CFF */
+ BinSearchArrayOf<TableRecord>
+ tables;
+ public:
+ DEFINE_SIZE_ARRAY (12, tables);
+} OpenTypeFontFace;
+
+
+/*
+ * TrueType Collections
+ */
+
+struct TTCHeaderVersion1
+{
+ friend struct TTCHeader;
+
+ unsigned int get_face_count () const { return table.len; }
+ const OpenTypeFontFace& get_face (unsigned int i) const { return this+table[i]; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (table.sanitize (c, this));
+ }
+
+ protected:
+ Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */
+ FixedVersion<>version; /* Version of the TTC Header (1.0),
+ * 0x00010000u */
+ LArrayOf<LOffsetTo<OffsetTable>>
+ table; /* Array of offsets to the OffsetTable for each font
+ * from the beginning of the file */
+ public:
+ DEFINE_SIZE_ARRAY (12, table);
+};
+
+struct TTCHeader
+{
+ friend struct OpenTypeFontFile;
+
+ private:
+
+ unsigned int get_face_count () const
+ {
+ switch (u.header.version.major) {
+ case 2: /* version 2 is compatible with version 1 */
+ case 1: return u.version1.get_face_count ();
+ default:return 0;
+ }
+ }
+ const OpenTypeFontFace& get_face (unsigned int i) const
+ {
+ switch (u.header.version.major) {
+ case 2: /* version 2 is compatible with version 1 */
+ case 1: return u.version1.get_face (i);
+ default:return Null(OpenTypeFontFace);
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!u.header.version.sanitize (c))) return_trace (false);
+ switch (u.header.version.major) {
+ case 2: /* version 2 is compatible with version 1 */
+ case 1: return_trace (u.version1.sanitize (c));
+ default:return_trace (true);
+ }
+ }
+
+ protected:
+ union {
+ struct {
+ Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */
+ FixedVersion<>version; /* Version of the TTC Header (1.0 or 2.0),
+ * 0x00010000u or 0x00020000u */
+ } header;
+ TTCHeaderVersion1 version1;
+ } u;
+};
+
+/*
+ * Mac Resource Fork
+ *
+ * http://mirror.informatimago.com/next/developer.apple.com/documentation/mac/MoreToolbox/MoreToolbox-99.html
+ */
+
+struct ResourceRecord
+{
+ const OpenTypeFontFace & get_face (const void *data_base) const
+ { return CastR<OpenTypeFontFace> ((data_base+offset).arrayZ); }
+
+ bool sanitize (hb_sanitize_context_t *c,
+ const void *data_base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ offset.sanitize (c, data_base) &&
+ get_face (data_base).sanitize (c));
+ }
+
+ protected:
+ HBUINT16 id; /* Resource ID. */
+ HBINT16 nameOffset; /* Offset from beginning of resource name list
+ * to resource name, -1 means there is none. */
+ HBUINT8 attrs; /* Resource attributes */
+ NNOffsetTo<LArrayOf<HBUINT8>, HBUINT24>
+ offset; /* Offset from beginning of data block to
+ * data for this resource */
+ HBUINT32 reserved; /* Reserved for handle to resource */
+ public:
+ DEFINE_SIZE_STATIC (12);
+};
+
+#define HB_TAG_sfnt HB_TAG ('s','f','n','t')
+
+struct ResourceTypeRecord
+{
+ unsigned int get_resource_count () const
+ { return tag == HB_TAG_sfnt ? resCountM1 + 1 : 0; }
+
+ bool is_sfnt () const { return tag == HB_TAG_sfnt; }
+
+ const ResourceRecord& get_resource_record (unsigned int i,
+ const void *type_base) const
+ { return (type_base+resourcesZ).as_array (get_resource_count ())[i]; }
+
+ bool sanitize (hb_sanitize_context_t *c,
+ const void *type_base,
+ const void *data_base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ resourcesZ.sanitize (c, type_base,
+ get_resource_count (),
+ data_base));
+ }
+
+ protected:
+ Tag tag; /* Resource type. */
+ HBUINT16 resCountM1; /* Number of resources minus 1. */
+ NNOffsetTo<UnsizedArrayOf<ResourceRecord>>
+ resourcesZ; /* Offset from beginning of resource type list
+ * to reference item list for this type. */
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+struct ResourceMap
+{
+ unsigned int get_face_count () const
+ {
+ unsigned int count = get_type_count ();
+ for (unsigned int i = 0; i < count; i++)
+ {
+ const ResourceTypeRecord& type = get_type_record (i);
+ if (type.is_sfnt ())
+ return type.get_resource_count ();
+ }
+ return 0;
+ }
+
+ const OpenTypeFontFace& get_face (unsigned int idx,
+ const void *data_base) const
+ {
+ unsigned int count = get_type_count ();
+ for (unsigned int i = 0; i < count; i++)
+ {
+ const ResourceTypeRecord& type = get_type_record (i);
+ /* The check for idx < count is here because ResourceRecord is NOT null-safe.
+ * Because an offset of 0 there does NOT mean null. */
+ if (type.is_sfnt () && idx < type.get_resource_count ())
+ return type.get_resource_record (idx, &(this+typeList)).get_face (data_base);
+ }
+ return Null (OpenTypeFontFace);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *data_base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ typeList.sanitize (c, this,
+ &(this+typeList),
+ data_base));
+ }
+
+ private:
+ unsigned int get_type_count () const { return (this+typeList).lenM1 + 1; }
+
+ const ResourceTypeRecord& get_type_record (unsigned int i) const
+ { return (this+typeList)[i]; }
+
+ protected:
+ HBUINT8 reserved0[16]; /* Reserved for copy of resource header */
+ HBUINT32 reserved1; /* Reserved for handle to next resource map */
+ HBUINT16 resreved2; /* Reserved for file reference number */
+ HBUINT16 attrs; /* Resource fork attribute */
+ NNOffsetTo<ArrayOfM1<ResourceTypeRecord>>
+ typeList; /* Offset from beginning of map to
+ * resource type list */
+ Offset16 nameList; /* Offset from beginning of map to
+ * resource name list */
+ public:
+ DEFINE_SIZE_STATIC (28);
+};
+
+struct ResourceForkHeader
+{
+ unsigned int get_face_count () const
+ { return (this+map).get_face_count (); }
+
+ const OpenTypeFontFace& get_face (unsigned int idx,
+ unsigned int *base_offset = nullptr) const
+ {
+ const OpenTypeFontFace &face = (this+map).get_face (idx, &(this+data));
+ if (base_offset)
+ *base_offset = (const char *) &face - (const char *) this;
+ return face;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ data.sanitize (c, this, dataLen) &&
+ map.sanitize (c, this, &(this+data)));
+ }
+
+ protected:
+ LNNOffsetTo<UnsizedArrayOf<HBUINT8>>
+ data; /* Offset from beginning of resource fork
+ * to resource data */
+ LNNOffsetTo<ResourceMap >
+ map; /* Offset from beginning of resource fork
+ * to resource map */
+ HBUINT32 dataLen; /* Length of resource data */
+ HBUINT32 mapLen; /* Length of resource map */
+ public:
+ DEFINE_SIZE_STATIC (16);
+};
+
+/*
+ * OpenType Font File
+ */
+
+struct OpenTypeFontFile
+{
+ enum {
+ CFFTag = HB_TAG ('O','T','T','O'), /* OpenType with Postscript outlines */
+ TrueTypeTag = HB_TAG ( 0 , 1 , 0 , 0 ), /* OpenType with TrueType outlines */
+ TTCTag = HB_TAG ('t','t','c','f'), /* TrueType Collection */
+ DFontTag = HB_TAG ( 0 , 0 , 1 , 0 ), /* DFont Mac Resource Fork */
+ TrueTag = HB_TAG ('t','r','u','e'), /* Obsolete Apple TrueType */
+ Typ1Tag = HB_TAG ('t','y','p','1') /* Obsolete Apple Type1 font in SFNT container */
+ };
+
+ hb_tag_t get_tag () const { return u.tag; }
+
+ unsigned int get_face_count () const
+ {
+ switch (u.tag) {
+ case CFFTag: /* All the non-collection tags */
+ case TrueTag:
+ case Typ1Tag:
+ case TrueTypeTag: return 1;
+ case TTCTag: return u.ttcHeader.get_face_count ();
+ case DFontTag: return u.rfHeader.get_face_count ();
+ default: return 0;
+ }
+ }
+ const OpenTypeFontFace& get_face (unsigned int i, unsigned int *base_offset = nullptr) const
+ {
+ if (base_offset)
+ *base_offset = 0;
+ switch (u.tag) {
+ /* Note: for non-collection SFNT data we ignore index. This is because
+ * Apple dfont container is a container of SFNT's. So each SFNT is a
+ * non-TTC, but the index is more than zero. */
+ case CFFTag: /* All the non-collection tags */
+ case TrueTag:
+ case Typ1Tag:
+ case TrueTypeTag: return u.fontFace;
+ case TTCTag: return u.ttcHeader.get_face (i);
+ case DFontTag: return u.rfHeader.get_face (i, base_offset);
+ default: return Null(OpenTypeFontFace);
+ }
+ }
+
+ template <typename item_t>
+ bool serialize_single (hb_serialize_context_t *c,
+ hb_tag_t sfnt_tag,
+ hb_array_t<item_t> items)
+ {
+ TRACE_SERIALIZE (this);
+ assert (sfnt_tag != TTCTag);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+ return_trace (u.fontFace.serialize (c, sfnt_tag, items));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!u.tag.sanitize (c))) return_trace (false);
+ switch (u.tag) {
+ case CFFTag: /* All the non-collection tags */
+ case TrueTag:
+ case Typ1Tag:
+ case TrueTypeTag: return_trace (u.fontFace.sanitize (c));
+ case TTCTag: return_trace (u.ttcHeader.sanitize (c));
+ case DFontTag: return_trace (u.rfHeader.sanitize (c));
+ default: return_trace (true);
+ }
+ }
+
+ protected:
+ union {
+ Tag tag; /* 4-byte identifier. */
+ OpenTypeFontFace fontFace;
+ TTCHeader ttcHeader;
+ ResourceForkHeader rfHeader;
+ } u;
+ public:
+ DEFINE_SIZE_UNION (4, tag);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OPEN_FILE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh
deleted file mode 100644
index 2f4e1b9e9e..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh
+++ /dev/null
@@ -1,1184 +0,0 @@
-/*
- * Copyright © 2007,2008,2009,2010 Red Hat, Inc.
- * Copyright © 2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OPEN_TYPE_PRIVATE_HH
-#define HB_OPEN_TYPE_PRIVATE_HH
-
-#include "hb-private.hh"
-#include "hb-debug.hh"
-#include "hb-face-private.hh"
-
-
-namespace OT {
-
-
-
-/*
- * Casts
- */
-
-/* Cast to struct T, reference to reference */
-template<typename Type, typename TObject>
-static inline const Type& CastR(const TObject &X)
-{ return reinterpret_cast<const Type&> (X); }
-template<typename Type, typename TObject>
-static inline Type& CastR(TObject &X)
-{ return reinterpret_cast<Type&> (X); }
-
-/* Cast to struct T, pointer to pointer */
-template<typename Type, typename TObject>
-static inline const Type* CastP(const TObject *X)
-{ return reinterpret_cast<const Type*> (X); }
-template<typename Type, typename TObject>
-static inline Type* CastP(TObject *X)
-{ return reinterpret_cast<Type*> (X); }
-
-/* StructAtOffset<T>(P,Ofs) returns the struct T& that is placed at memory
- * location pointed to by P plus Ofs bytes. */
-template<typename Type>
-static inline const Type& StructAtOffset(const void *P, unsigned int offset)
-{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
-template<typename Type>
-static inline Type& StructAtOffset(void *P, unsigned int offset)
-{ return * reinterpret_cast<Type*> ((char *) P + offset); }
-
-/* StructAfter<T>(X) returns the struct T& that is placed after X.
- * Works with X of variable size also. X must implement get_size() */
-template<typename Type, typename TObject>
-static inline const Type& StructAfter(const TObject &X)
-{ return StructAtOffset<Type>(&X, X.get_size()); }
-template<typename Type, typename TObject>
-static inline Type& StructAfter(TObject &X)
-{ return StructAtOffset<Type>(&X, X.get_size()); }
-
-
-
-/*
- * Size checking
- */
-
-/* Check _assertion in a method environment */
-#define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \
- inline void _instance_assertion_on_line_##_line (void) const \
- { \
- static_assert ((_assertion), ""); \
- ASSERT_INSTANCE_POD (*this); /* Make sure it's POD. */ \
- }
-# define _DEFINE_INSTANCE_ASSERTION0(_line, _assertion) _DEFINE_INSTANCE_ASSERTION1 (_line, _assertion)
-# define DEFINE_INSTANCE_ASSERTION(_assertion) _DEFINE_INSTANCE_ASSERTION0 (__LINE__, _assertion)
-
-/* Check that _code compiles in a method environment */
-#define _DEFINE_COMPILES_ASSERTION1(_line, _code) \
- inline void _compiles_assertion_on_line_##_line (void) const \
- { _code; }
-# define _DEFINE_COMPILES_ASSERTION0(_line, _code) _DEFINE_COMPILES_ASSERTION1 (_line, _code)
-# define DEFINE_COMPILES_ASSERTION(_code) _DEFINE_COMPILES_ASSERTION0 (__LINE__, _code)
-
-
-#define DEFINE_SIZE_STATIC(size) \
- DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \
- static const unsigned int static_size = (size); \
- static const unsigned int min_size = (size); \
- inline unsigned int get_size (void) const { return (size); }
-
-#define DEFINE_SIZE_UNION(size, _member) \
- DEFINE_INSTANCE_ASSERTION (0*sizeof(this->u._member.static_size) + sizeof(this->u._member) == (size)); \
- static const unsigned int min_size = (size)
-
-#define DEFINE_SIZE_MIN(size) \
- DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)); \
- static const unsigned int min_size = (size)
-
-#define DEFINE_SIZE_ARRAY(size, array) \
- DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + sizeof (array[0])); \
- DEFINE_COMPILES_ASSERTION ((void) array[0].static_size) \
- static const unsigned int min_size = (size)
-
-#define DEFINE_SIZE_ARRAY2(size, array1, array2) \
- DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + sizeof (this->array1[0]) + sizeof (this->array2[0])); \
- DEFINE_COMPILES_ASSERTION ((void) array1[0].static_size; (void) array2[0].static_size) \
- static const unsigned int min_size = (size)
-
-
-
-/*
- * Null objects
- */
-
-/* Global nul-content Null pool. Enlarge as necessary. */
-
-#define HB_NULL_POOL_SIZE 264
-static_assert (HB_NULL_POOL_SIZE % sizeof (void *) == 0, "Align HB_NULL_POOL_SIZE.");
-extern HB_INTERNAL const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)];
-
-/* Generic nul-content Null objects. */
-template <typename Type>
-static inline const Type& Null (void) {
- static_assert (sizeof (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
- return *CastP<Type> (_hb_NullPool);
-}
-
-/* Specializaiton for arbitrary-content arbitrary-sized Null objects. */
-#define DEFINE_NULL_DATA(Type, data) \
-static const char _Null##Type[sizeof (Type) + 1] = data; /* +1 is for nul-termination in data */ \
-template <> \
-/*static*/ inline const Type& Null<Type> (void) { \
- return *CastP<Type> (_Null##Type); \
-} /* The following line really exists such that we end in a place needing semicolon */ \
-static_assert (Type::min_size + 1 <= sizeof (_Null##Type), "Null pool too small. Enlarge.")
-
-/* Accessor macro. */
-#define Null(Type) Null<Type>()
-
-
-/*
- * Dispatch
- */
-
-template <typename Context, typename Return, unsigned int MaxDebugDepth>
-struct hb_dispatch_context_t
-{
- static const unsigned int max_debug_depth = MaxDebugDepth;
- typedef Return return_t;
- template <typename T, typename F>
- inline bool may_dispatch (const T *obj, const F *format) { return true; }
- static return_t no_dispatch_return_value (void) { return Context::default_return_value (); }
-};
-
-
-/*
- * Sanitize
- */
-
-/* This limits sanitizing time on really broken fonts. */
-#ifndef HB_SANITIZE_MAX_EDITS
-#define HB_SANITIZE_MAX_EDITS 32
-#endif
-
-struct hb_sanitize_context_t :
- hb_dispatch_context_t<hb_sanitize_context_t, bool, HB_DEBUG_SANITIZE>
-{
- inline hb_sanitize_context_t (void) :
- debug_depth (0),
- start (nullptr), end (nullptr),
- writable (false), edit_count (0),
- blob (nullptr) {}
-
- inline const char *get_name (void) { return "SANITIZE"; }
- template <typename T, typename F>
- inline bool may_dispatch (const T *obj, const F *format)
- { return format->sanitize (this); }
- template <typename T>
- inline return_t dispatch (const T &obj) { return obj.sanitize (this); }
- static return_t default_return_value (void) { return true; }
- static return_t no_dispatch_return_value (void) { return false; }
- bool stop_sublookup_iteration (const return_t r) const { return !r; }
-
- inline void init (hb_blob_t *b)
- {
- this->blob = hb_blob_reference (b);
- this->writable = false;
- }
-
- inline void start_processing (void)
- {
- this->start = hb_blob_get_data (this->blob, nullptr);
- this->end = this->start + hb_blob_get_length (this->blob);
- assert (this->start <= this->end); /* Must not overflow. */
- this->edit_count = 0;
- this->debug_depth = 0;
-
- DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1,
- "start [%p..%p] (%lu bytes)",
- this->start, this->end,
- (unsigned long) (this->end - this->start));
- }
-
- inline void end_processing (void)
- {
- DEBUG_MSG_LEVEL (SANITIZE, this->start, 0, -1,
- "end [%p..%p] %u edit requests",
- this->start, this->end, this->edit_count);
-
- hb_blob_destroy (this->blob);
- this->blob = nullptr;
- this->start = this->end = nullptr;
- }
-
- inline bool check_range (const void *base, unsigned int len) const
- {
- const char *p = (const char *) base;
- bool ok = this->start <= p && p <= this->end && (unsigned int) (this->end - p) >= len;
-
- DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
- "check_range [%p..%p] (%d bytes) in [%p..%p] -> %s",
- p, p + len, len,
- this->start, this->end,
- ok ? "OK" : "OUT-OF-RANGE");
-
- return likely (ok);
- }
-
- inline bool check_array (const void *base, unsigned int record_size, unsigned int len) const
- {
- const char *p = (const char *) base;
- bool overflows = _hb_unsigned_int_mul_overflows (len, record_size);
- unsigned int array_size = record_size * len;
- bool ok = !overflows && this->check_range (base, array_size);
-
- DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
- "check_array [%p..%p] (%d*%d=%d bytes) in [%p..%p] -> %s",
- p, p + (record_size * len), record_size, len, (unsigned int) array_size,
- this->start, this->end,
- overflows ? "OVERFLOWS" : ok ? "OK" : "OUT-OF-RANGE");
-
- return likely (ok);
- }
-
- template <typename Type>
- inline bool check_struct (const Type *obj) const
- {
- return likely (this->check_range (obj, obj->min_size));
- }
-
- inline bool may_edit (const void *base HB_UNUSED, unsigned int len HB_UNUSED)
- {
- if (this->edit_count >= HB_SANITIZE_MAX_EDITS)
- return false;
-
- const char *p = (const char *) base;
- this->edit_count++;
-
- DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
- "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s",
- this->edit_count,
- p, p + len, len,
- this->start, this->end,
- this->writable ? "GRANTED" : "DENIED");
-
- return this->writable;
- }
-
- template <typename Type, typename ValueType>
- inline bool try_set (const Type *obj, const ValueType &v) {
- if (this->may_edit (obj, obj->static_size)) {
- const_cast<Type *> (obj)->set (v);
- return true;
- }
- return false;
- }
-
- mutable unsigned int debug_depth;
- const char *start, *end;
- bool writable;
- unsigned int edit_count;
- hb_blob_t *blob;
-};
-
-
-
-/* Template to sanitize an object. */
-template <typename Type>
-struct Sanitizer
-{
- static hb_blob_t *sanitize (hb_blob_t *blob) {
- hb_sanitize_context_t c[1];
- bool sane;
-
- /* TODO is_sane() stuff */
-
- c->init (blob);
-
- retry:
- DEBUG_MSG_FUNC (SANITIZE, c->start, "start");
-
- c->start_processing ();
-
- if (unlikely (!c->start)) {
- c->end_processing ();
- return blob;
- }
-
- Type *t = CastP<Type> (const_cast<char *> (c->start));
-
- sane = t->sanitize (c);
- if (sane) {
- if (c->edit_count) {
- DEBUG_MSG_FUNC (SANITIZE, c->start, "passed first round with %d edits; going for second round", c->edit_count);
-
- /* sanitize again to ensure no toe-stepping */
- c->edit_count = 0;
- sane = t->sanitize (c);
- if (c->edit_count) {
- DEBUG_MSG_FUNC (SANITIZE, c->start, "requested %d edits in second round; FAILLING", c->edit_count);
- sane = false;
- }
- }
- } else {
- unsigned int edit_count = c->edit_count;
- if (edit_count && !c->writable) {
- c->start = hb_blob_get_data_writable (blob, nullptr);
- c->end = c->start + hb_blob_get_length (blob);
-
- if (c->start) {
- c->writable = true;
- /* ok, we made it writable by relocating. try again */
- DEBUG_MSG_FUNC (SANITIZE, c->start, "retry");
- goto retry;
- }
- }
- }
-
- c->end_processing ();
-
- DEBUG_MSG_FUNC (SANITIZE, c->start, sane ? "PASSED" : "FAILED");
- if (sane)
- return blob;
- else {
- hb_blob_destroy (blob);
- return hb_blob_get_empty ();
- }
- }
-
- static const Type* lock_instance (hb_blob_t *blob) {
- hb_blob_make_immutable (blob);
- const char *base = hb_blob_get_data (blob, nullptr);
- return unlikely (!base) ? &Null(Type) : CastP<Type> (base);
- }
-};
-
-
-
-/*
- * Serialize
- */
-
-
-struct hb_serialize_context_t
-{
- inline hb_serialize_context_t (void *start_, unsigned int size)
- {
- this->start = (char *) start_;
- this->end = this->start + size;
-
- this->ran_out_of_room = false;
- this->head = this->start;
- this->debug_depth = 0;
- }
-
- template <typename Type>
- inline Type *start_serialize (void)
- {
- DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, +1,
- "start [%p..%p] (%lu bytes)",
- this->start, this->end,
- (unsigned long) (this->end - this->start));
-
- return start_embed<Type> ();
- }
-
- inline void end_serialize (void)
- {
- DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, -1,
- "end [%p..%p] serialized %d bytes; %s",
- this->start, this->end,
- (int) (this->head - this->start),
- this->ran_out_of_room ? "RAN OUT OF ROOM" : "did not ran out of room");
-
- }
-
- template <typename Type>
- inline Type *copy (void)
- {
- assert (!this->ran_out_of_room);
- unsigned int len = this->head - this->start;
- void *p = malloc (len);
- if (p)
- memcpy (p, this->start, len);
- return reinterpret_cast<Type *> (p);
- }
-
- template <typename Type>
- inline Type *allocate_size (unsigned int size)
- {
- if (unlikely (this->ran_out_of_room || this->end - this->head < ptrdiff_t (size))) {
- this->ran_out_of_room = true;
- return nullptr;
- }
- memset (this->head, 0, size);
- char *ret = this->head;
- this->head += size;
- return reinterpret_cast<Type *> (ret);
- }
-
- template <typename Type>
- inline Type *allocate_min (void)
- {
- return this->allocate_size<Type> (Type::min_size);
- }
-
- template <typename Type>
- inline Type *start_embed (void)
- {
- Type *ret = reinterpret_cast<Type *> (this->head);
- return ret;
- }
-
- template <typename Type>
- inline Type *embed (const Type &obj)
- {
- unsigned int size = obj.get_size ();
- Type *ret = this->allocate_size<Type> (size);
- if (unlikely (!ret)) return nullptr;
- memcpy (ret, obj, size);
- return ret;
- }
-
- template <typename Type>
- inline Type *extend_min (Type &obj)
- {
- unsigned int size = obj.min_size;
- assert (this->start <= (char *) &obj && (char *) &obj <= this->head && (char *) &obj + size >= this->head);
- if (unlikely (!this->allocate_size<Type> (((char *) &obj) + size - this->head))) return nullptr;
- return reinterpret_cast<Type *> (&obj);
- }
-
- template <typename Type>
- inline Type *extend (Type &obj)
- {
- unsigned int size = obj.get_size ();
- assert (this->start < (char *) &obj && (char *) &obj <= this->head && (char *) &obj + size >= this->head);
- if (unlikely (!this->allocate_size<Type> (((char *) &obj) + size - this->head))) return nullptr;
- return reinterpret_cast<Type *> (&obj);
- }
-
- inline void truncate (void *new_head)
- {
- assert (this->start < new_head && new_head <= this->head);
- this->head = (char *) new_head;
- }
-
- unsigned int debug_depth;
- char *start, *end, *head;
- bool ran_out_of_room;
-};
-
-template <typename Type>
-struct Supplier
-{
- inline Supplier (const Type *array, unsigned int len_)
- {
- head = array;
- len = len_;
- }
- inline const Type operator [] (unsigned int i) const
- {
- if (unlikely (i >= len)) return Type ();
- return head[i];
- }
-
- inline void advance (unsigned int count)
- {
- if (unlikely (count > len))
- count = len;
- len -= count;
- head += count;
- }
-
- private:
- inline Supplier (const Supplier<Type> &); /* Disallow copy */
- inline Supplier<Type>& operator= (const Supplier<Type> &); /* Disallow copy */
-
- unsigned int len;
- const Type *head;
-};
-
-
-
-
-/*
- *
- * The OpenType Font File: Data Types
- */
-
-
-/* "The following data types are used in the OpenType font file.
- * All OpenType fonts use Motorola-style byte ordering (Big Endian):" */
-
-/*
- * Int types
- */
-
-
-template <typename Type, int Bytes> struct BEInt;
-
-template <typename Type>
-struct BEInt<Type, 1>
-{
- public:
- inline void set (Type V)
- {
- v = V;
- }
- inline operator Type (void) const
- {
- return v;
- }
- private: uint8_t v;
-};
-template <typename Type>
-struct BEInt<Type, 2>
-{
- public:
- inline void set (Type V)
- {
- v[0] = (V >> 8) & 0xFF;
- v[1] = (V ) & 0xFF;
- }
- inline operator Type (void) const
- {
- return (v[0] << 8)
- + (v[1] );
- }
- private: uint8_t v[2];
-};
-template <typename Type>
-struct BEInt<Type, 3>
-{
- public:
- inline void set (Type V)
- {
- v[0] = (V >> 16) & 0xFF;
- v[1] = (V >> 8) & 0xFF;
- v[2] = (V ) & 0xFF;
- }
- inline operator Type (void) const
- {
- return (v[0] << 16)
- + (v[1] << 8)
- + (v[2] );
- }
- private: uint8_t v[3];
-};
-template <typename Type>
-struct BEInt<Type, 4>
-{
- public:
- inline void set (Type V)
- {
- v[0] = (V >> 24) & 0xFF;
- v[1] = (V >> 16) & 0xFF;
- v[2] = (V >> 8) & 0xFF;
- v[3] = (V ) & 0xFF;
- }
- inline operator Type (void) const
- {
- return (v[0] << 24)
- + (v[1] << 16)
- + (v[2] << 8)
- + (v[3] );
- }
- private: uint8_t v[4];
-};
-
-/* Integer types in big-endian order and no alignment requirement */
-template <typename Type, unsigned int Size>
-struct IntType
-{
- inline void set (Type i) { v.set (i); }
- inline operator Type(void) const { return v; }
- inline bool operator == (const IntType<Type,Size> &o) const { return (Type) v == (Type) o.v; }
- inline bool operator != (const IntType<Type,Size> &o) const { return !(*this == o); }
- static inline int cmp (const IntType<Type,Size> *a, const IntType<Type,Size> *b) { return b->cmp (*a); }
- template <typename Type2>
- inline int cmp (Type2 a) const
- {
- Type b = v;
- if (sizeof (Type) < sizeof (int) && sizeof (Type2) < sizeof (int))
- return (int) a - (int) b;
- else
- return a < b ? -1 : a == b ? 0 : +1;
- }
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (likely (c->check_struct (this)));
- }
- protected:
- BEInt<Type, Size> v;
- public:
- DEFINE_SIZE_STATIC (Size);
-};
-
-typedef IntType<uint8_t, 1> UINT8; /* 8-bit unsigned integer. */
-typedef IntType<int8_t, 1> INT8; /* 8-bit signed integer. */
-typedef IntType<uint16_t, 2> UINT16; /* 16-bit unsigned integer. */
-typedef IntType<int16_t, 2> INT16; /* 16-bit signed integer. */
-typedef IntType<uint32_t, 4> UINT32; /* 32-bit unsigned integer. */
-typedef IntType<int32_t, 4> INT32; /* 32-bit signed integer. */
-typedef IntType<uint32_t, 3> UINT24; /* 24-bit unsigned integer. */
-
-/* 16-bit signed integer (INT16) that describes a quantity in FUnits. */
-typedef INT16 FWORD;
-
-/* 16-bit unsigned integer (UINT16) that describes a quantity in FUnits. */
-typedef UINT16 UFWORD;
-
-/* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */
-struct F2DOT14 : INT16
-{
- //inline float to_float (void) const { return ???; }
- //inline void set_float (float f) { v.set (f * ???); }
- public:
- DEFINE_SIZE_STATIC (2);
-};
-
-/* 32-bit signed fixed-point number (16.16). */
-struct Fixed: INT32
-{
- //inline float to_float (void) const { return ???; }
- //inline void set_float (float f) { v.set (f * ???); }
- public:
- DEFINE_SIZE_STATIC (4);
-};
-
-/* Date represented in number of seconds since 12:00 midnight, January 1,
- * 1904. The value is represented as a signed 64-bit integer. */
-struct LONGDATETIME
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (likely (c->check_struct (this)));
- }
- protected:
- INT32 major;
- UINT32 minor;
- public:
- DEFINE_SIZE_STATIC (8);
-};
-
-/* Array of four uint8s (length = 32 bits) used to identify a script, language
- * system, feature, or baseline */
-struct Tag : UINT32
-{
- /* What the char* converters return is NOT nul-terminated. Print using "%.4s" */
- inline operator const char* (void) const { return reinterpret_cast<const char *> (&this->v); }
- inline operator char* (void) { return reinterpret_cast<char *> (&this->v); }
- public:
- DEFINE_SIZE_STATIC (4);
-};
-DEFINE_NULL_DATA (Tag, " ");
-
-/* Glyph index number, same as uint16 (length = 16 bits) */
-typedef UINT16 GlyphID;
-
-/* Script/language-system/feature index */
-struct Index : UINT16 {
- static const unsigned int NOT_FOUND_INDEX = 0xFFFFu;
-};
-DEFINE_NULL_DATA (Index, "\xff\xff");
-
-/* Offset, Null offset = 0 */
-template <typename Type>
-struct Offset : Type
-{
- inline bool is_null (void) const { return 0 == *this; }
- public:
- DEFINE_SIZE_STATIC (sizeof(Type));
-};
-
-typedef Offset<UINT16> Offset16;
-typedef Offset<UINT32> Offset32;
-
-
-/* CheckSum */
-struct CheckSum : UINT32
-{
- /* This is reference implementation from the spec. */
- static inline uint32_t CalcTableChecksum (const UINT32 *Table, uint32_t Length)
- {
- uint32_t Sum = 0L;
- const UINT32 *EndPtr = Table+((Length+3) & ~3) / UINT32::static_size;
-
- while (Table < EndPtr)
- Sum += *Table++;
- return Sum;
- }
-
- /* Note: data should be 4byte aligned and have 4byte padding at the end. */
- inline void set_for_data (const void *data, unsigned int length)
- { set (CalcTableChecksum ((const UINT32 *) data, length)); }
-
- public:
- DEFINE_SIZE_STATIC (4);
-};
-
-
-/*
- * Version Numbers
- */
-
-template <typename FixedType=UINT16>
-struct FixedVersion
-{
- inline uint32_t to_int (void) const { return (major << (sizeof(FixedType) * 8)) + minor; }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- FixedType major;
- FixedType minor;
- public:
- DEFINE_SIZE_STATIC (2 * sizeof(FixedType));
-};
-
-
-
-/*
- * Template subclasses of Offset that do the dereferencing.
- * Use: (base+offset)
- */
-
-template <typename Type, typename OffsetType=UINT16>
-struct OffsetTo : Offset<OffsetType>
-{
- inline const Type& operator () (const void *base) const
- {
- unsigned int offset = *this;
- if (unlikely (!offset)) return Null(Type);
- return StructAtOffset<Type> (base, offset);
- }
-
- inline Type& serialize (hb_serialize_context_t *c, const void *base)
- {
- Type *t = c->start_embed<Type> ();
- this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */
- return *t;
- }
-
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!c->check_struct (this))) return_trace (false);
- unsigned int offset = *this;
- if (unlikely (!offset)) return_trace (true);
- if (unlikely (!c->check_range (base, offset))) return_trace (false);
- const Type &obj = StructAtOffset<Type> (base, offset);
- return_trace (likely (obj.sanitize (c)) || neuter (c));
- }
- template <typename T>
- inline bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!c->check_struct (this))) return_trace (false);
- unsigned int offset = *this;
- if (unlikely (!offset)) return_trace (true);
- if (unlikely (!c->check_range (base, offset))) return_trace (false);
- const Type &obj = StructAtOffset<Type> (base, offset);
- return_trace (likely (obj.sanitize (c, user_data)) || neuter (c));
- }
-
- /* Set the offset to Null */
- inline bool neuter (hb_sanitize_context_t *c) const {
- return c->try_set (this, 0);
- }
- DEFINE_SIZE_STATIC (sizeof(OffsetType));
-};
-template <typename Type> struct LOffsetTo : OffsetTo<Type, UINT32> {};
-template <typename Base, typename OffsetType, typename Type>
-static inline const Type& operator + (const Base &base, const OffsetTo<Type, OffsetType> &offset) { return offset (base); }
-template <typename Base, typename OffsetType, typename Type>
-static inline Type& operator + (Base &base, OffsetTo<Type, OffsetType> &offset) { return offset (base); }
-
-
-/*
- * Array Types
- */
-
-/* An array with a number of elements. */
-template <typename Type, typename LenType=UINT16>
-struct ArrayOf
-{
- const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const
- {
- unsigned int count = len;
- if (unlikely (start_offset > count))
- count = 0;
- else
- count -= start_offset;
- count = MIN (count, *pcount);
- *pcount = count;
- return array + start_offset;
- }
-
- inline const Type& operator [] (unsigned int i) const
- {
- if (unlikely (i >= len)) return Null(Type);
- return array[i];
- }
- inline Type& operator [] (unsigned int i)
- {
- return array[i];
- }
- inline unsigned int get_size (void) const
- { return len.static_size + len * Type::static_size; }
-
- inline bool serialize (hb_serialize_context_t *c,
- unsigned int items_len)
- {
- TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return_trace (false);
- len.set (items_len); /* TODO(serialize) Overflow? */
- if (unlikely (!c->extend (*this))) return_trace (false);
- return_trace (true);
- }
-
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<Type> &items,
- unsigned int items_len)
- {
- TRACE_SERIALIZE (this);
- if (unlikely (!serialize (c, items_len))) return_trace (false);
- for (unsigned int i = 0; i < items_len; i++)
- array[i] = items[i];
- items.advance (items_len);
- return_trace (true);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!sanitize_shallow (c))) return_trace (false);
-
- /* Note: for structs that do not reference other structs,
- * we do not need to call their sanitize() as we already did
- * a bound check on the aggregate array size. We just include
- * a small unreachable expression to make sure the structs
- * pointed to do have a simple sanitize(), ie. they do not
- * reference other structs via offsets.
- */
- (void) (false && array[0].sanitize (c));
-
- return_trace (true);
- }
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!sanitize_shallow (c))) return_trace (false);
- unsigned int count = len;
- for (unsigned int i = 0; i < count; i++)
- if (unlikely (!array[i].sanitize (c, base)))
- return_trace (false);
- return_trace (true);
- }
- template <typename T>
- inline bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!sanitize_shallow (c))) return_trace (false);
- unsigned int count = len;
- for (unsigned int i = 0; i < count; i++)
- if (unlikely (!array[i].sanitize (c, base, user_data)))
- return_trace (false);
- return_trace (true);
- }
-
- template <typename SearchType>
- inline int lsearch (const SearchType &x) const
- {
- unsigned int count = len;
- for (unsigned int i = 0; i < count; i++)
- if (!this->array[i].cmp (x))
- return i;
- return -1;
- }
-
- private:
- inline bool sanitize_shallow (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (len.sanitize (c) && c->check_array (array, Type::static_size, len));
- }
-
- public:
- LenType len;
- Type array[VAR];
- public:
- DEFINE_SIZE_ARRAY (sizeof (LenType), array);
-};
-template <typename Type> struct LArrayOf : ArrayOf<Type, UINT32> {};
-
-/* Array of Offset's */
-template <typename Type, typename OffsetType=UINT16>
-struct OffsetArrayOf : ArrayOf<OffsetTo<Type, OffsetType> > {};
-
-/* Array of offsets relative to the beginning of the array itself. */
-template <typename Type>
-struct OffsetListOf : OffsetArrayOf<Type>
-{
- inline const Type& operator [] (unsigned int i) const
- {
- if (unlikely (i >= this->len)) return Null(Type);
- return this+this->array[i];
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (OffsetArrayOf<Type>::sanitize (c, this));
- }
- template <typename T>
- inline bool sanitize (hb_sanitize_context_t *c, T user_data) const
- {
- TRACE_SANITIZE (this);
- return_trace (OffsetArrayOf<Type>::sanitize (c, this, user_data));
- }
-};
-
-
-/* An array starting at second element. */
-template <typename Type, typename LenType=UINT16>
-struct HeadlessArrayOf
-{
- inline const Type& operator [] (unsigned int i) const
- {
- if (unlikely (i >= len || !i)) return Null(Type);
- return array[i-1];
- }
- inline unsigned int get_size (void) const
- { return len.static_size + (len ? len - 1 : 0) * Type::static_size; }
-
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<Type> &items,
- unsigned int items_len)
- {
- TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return_trace (false);
- len.set (items_len); /* TODO(serialize) Overflow? */
- if (unlikely (!items_len)) return_trace (true);
- if (unlikely (!c->extend (*this))) return_trace (false);
- for (unsigned int i = 0; i < items_len - 1; i++)
- array[i] = items[i];
- items.advance (items_len - 1);
- return_trace (true);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!sanitize_shallow (c))) return_trace (false);
-
- /* Note: for structs that do not reference other structs,
- * we do not need to call their sanitize() as we already did
- * a bound check on the aggregate array size. We just include
- * a small unreachable expression to make sure the structs
- * pointed to do have a simple sanitize(), ie. they do not
- * reference other structs via offsets.
- */
- (void) (false && array[0].sanitize (c));
-
- return_trace (true);
- }
-
- private:
- inline bool sanitize_shallow (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (len.sanitize (c) &&
- (!len || c->check_array (array, Type::static_size, len - 1)));
- }
-
- public:
- LenType len;
- Type array[VAR];
- public:
- DEFINE_SIZE_ARRAY (sizeof (LenType), array);
-};
-
-
-/*
- * An array with sorted elements. Supports binary searching.
- */
-template <typename Type, typename LenType=UINT16>
-struct SortedArrayOf : ArrayOf<Type, LenType>
-{
- template <typename SearchType>
- inline int bsearch (const SearchType &x) const
- {
- /* Hand-coded bsearch here since this is in the hot inner loop. */
- const Type *array = this->array;
- int min = 0, max = (int) this->len - 1;
- while (min <= max)
- {
- int mid = (min + max) / 2;
- int c = array[mid].cmp (x);
- if (c < 0)
- max = mid - 1;
- else if (c > 0)
- min = mid + 1;
- else
- return mid;
- }
- return -1;
- }
-};
-
-/*
- * Binary-search arrays
- */
-
-struct BinSearchHeader
-{
- inline operator uint32_t (void) const { return len; }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- protected:
- UINT16 len;
- UINT16 searchRangeZ;
- UINT16 entrySelectorZ;
- UINT16 rangeShiftZ;
-
- public:
- DEFINE_SIZE_STATIC (8);
-};
-
-template <typename Type>
-struct BinSearchArrayOf : SortedArrayOf<Type, BinSearchHeader> {};
-
-
-/* Lazy struct and blob loaders. */
-
-/* Logic is shared between hb_lazy_loader_t and hb_lazy_table_loader_t */
-template <typename T>
-struct hb_lazy_loader_t
-{
- inline void init (hb_face_t *face_)
- {
- face = face_;
- instance = nullptr;
- }
-
- inline void fini (void)
- {
- if (instance && instance != &OT::Null(T))
- {
- instance->fini();
- free (instance);
- }
- }
-
- inline const T* get (void) const
- {
- retry:
- T *p = (T *) hb_atomic_ptr_get (&instance);
- if (unlikely (!p))
- {
- p = (T *) calloc (1, sizeof (T));
- if (unlikely (!p))
- p = const_cast<T *> (&OT::Null(T));
- else
- p->init (face);
- if (unlikely (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), nullptr, p)))
- {
- if (p != &OT::Null(T))
- p->fini ();
- goto retry;
- }
- }
- return p;
- }
-
- inline const T* operator-> (void) const
- {
- return get ();
- }
-
- private:
- hb_face_t *face;
- T *instance;
-};
-
-/* Logic is shared between hb_lazy_loader_t and hb_lazy_table_loader_t */
-template <typename T>
-struct hb_lazy_table_loader_t
-{
- inline void init (hb_face_t *face_)
- {
- face = face_;
- instance = nullptr;
- blob = nullptr;
- }
-
- inline void fini (void)
- {
- hb_blob_destroy (blob);
- }
-
- inline const T* get (void) const
- {
- retry:
- T *p = (T *) hb_atomic_ptr_get (&instance);
- if (unlikely (!p))
- {
- hb_blob_t *blob_ = OT::Sanitizer<T>::sanitize (face->reference_table (T::tableTag));
- p = const_cast<T *>(OT::Sanitizer<T>::lock_instance (blob_));
- if (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), nullptr, p))
- {
- hb_blob_destroy (blob_);
- goto retry;
- }
- blob = blob_;
- }
- return p;
- }
-
- inline const T* operator-> (void) const
- {
- return get();
- }
-
- private:
- hb_face_t *face;
- T *instance;
- mutable hb_blob_t *blob;
-};
-
-
-} /* namespace OT */
-
-
-#endif /* HB_OPEN_TYPE_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-open-type.hh b/src/3rdparty/harfbuzz-ng/src/hb-open-type.hh
new file mode 100644
index 0000000000..af242ece12
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-open-type.hh
@@ -0,0 +1,1065 @@
+/*
+ * Copyright © 2007,2008,2009,2010 Red Hat, Inc.
+ * Copyright © 2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OPEN_TYPE_HH
+#define HB_OPEN_TYPE_HH
+
+#include "hb.hh"
+#include "hb-blob.hh"
+#include "hb-face.hh"
+#include "hb-machinery.hh"
+#include "hb-subset.hh"
+
+
+namespace OT {
+
+
+/*
+ *
+ * The OpenType Font File: Data Types
+ */
+
+
+/* "The following data types are used in the OpenType font file.
+ * All OpenType fonts use Motorola-style byte ordering (Big Endian):" */
+
+/*
+ * Int types
+ */
+
+/* Integer types in big-endian order and no alignment requirement */
+template <typename Type, unsigned int Size>
+struct IntType
+{
+ typedef Type type;
+ typedef hb_conditional<hb_is_signed (Type), signed, unsigned> wide_type;
+
+ IntType& operator = (wide_type i) { v = i; return *this; }
+ operator wide_type () const { return v; }
+ bool operator == (const IntType &o) const { return (Type) v == (Type) o.v; }
+ bool operator != (const IntType &o) const { return !(*this == o); }
+
+ IntType& operator += (unsigned count) { *this = *this + count; return *this; }
+ IntType& operator -= (unsigned count) { *this = *this - count; return *this; }
+ IntType& operator ++ () { *this += 1; return *this; }
+ IntType& operator -- () { *this -= 1; return *this; }
+ IntType operator ++ (int) { IntType c (*this); ++*this; return c; }
+ IntType operator -- (int) { IntType c (*this); --*this; return c; }
+
+ HB_INTERNAL static int cmp (const IntType *a, const IntType *b)
+ { return b->cmp (*a); }
+ template <typename Type2>
+ int cmp (Type2 a) const
+ {
+ Type b = v;
+ if (sizeof (Type) < sizeof (int) && sizeof (Type2) < sizeof (int))
+ return (int) a - (int) b;
+ else
+ return a < b ? -1 : a == b ? 0 : +1;
+ }
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+ protected:
+ BEInt<Type, Size> v;
+ public:
+ DEFINE_SIZE_STATIC (Size);
+};
+
+typedef IntType<uint8_t, 1> HBUINT8; /* 8-bit unsigned integer. */
+typedef IntType<int8_t, 1> HBINT8; /* 8-bit signed integer. */
+typedef IntType<uint16_t, 2> HBUINT16; /* 16-bit unsigned integer. */
+typedef IntType<int16_t, 2> HBINT16; /* 16-bit signed integer. */
+typedef IntType<uint32_t, 4> HBUINT32; /* 32-bit unsigned integer. */
+typedef IntType<int32_t, 4> HBINT32; /* 32-bit signed integer. */
+/* Note: we cannot defined a signed HBINT24 because there's no corresponding C type.
+ * Works for unsigned, but not signed, since we rely on compiler for sign-extension. */
+typedef IntType<uint32_t, 3> HBUINT24; /* 24-bit unsigned integer. */
+
+/* 16-bit signed integer (HBINT16) that describes a quantity in FUnits. */
+typedef HBINT16 FWORD;
+
+/* 32-bit signed integer (HBINT32) that describes a quantity in FUnits. */
+typedef HBINT32 FWORD32;
+
+/* 16-bit unsigned integer (HBUINT16) that describes a quantity in FUnits. */
+typedef HBUINT16 UFWORD;
+
+/* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */
+struct F2DOT14 : HBINT16
+{
+ F2DOT14& operator = (uint16_t i ) { HBINT16::operator= (i); return *this; }
+ // 16384 means 1<<14
+ float to_float () const { return ((int32_t) v) / 16384.f; }
+ void set_float (float f) { v = roundf (f * 16384.f); }
+ public:
+ DEFINE_SIZE_STATIC (2);
+};
+
+/* 32-bit signed fixed-point number (16.16). */
+struct HBFixed : HBINT32
+{
+ HBFixed& operator = (uint32_t i) { HBINT32::operator= (i); return *this; }
+ // 65536 means 1<<16
+ float to_float () const { return ((int32_t) v) / 65536.f; }
+ void set_float (float f) { v = roundf (f * 65536.f); }
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+/* Date represented in number of seconds since 12:00 midnight, January 1,
+ * 1904. The value is represented as a signed 64-bit integer. */
+struct LONGDATETIME
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+ protected:
+ HBINT32 major;
+ HBUINT32 minor;
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+/* Array of four uint8s (length = 32 bits) used to identify a script, language
+ * system, feature, or baseline */
+struct Tag : HBUINT32
+{
+ Tag& operator = (hb_tag_t i) { HBUINT32::operator= (i); return *this; }
+ /* What the char* converters return is NOT nul-terminated. Print using "%.4s" */
+ operator const char* () const { return reinterpret_cast<const char *> (&this->v); }
+ operator char* () { return reinterpret_cast<char *> (&this->v); }
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+/* Glyph index number, same as uint16 (length = 16 bits) */
+struct HBGlyphID : HBUINT16
+{
+ HBGlyphID& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; }
+};
+
+/* Script/language-system/feature index */
+struct Index : HBUINT16 {
+ static constexpr unsigned NOT_FOUND_INDEX = 0xFFFFu;
+ Index& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; }
+};
+DECLARE_NULL_NAMESPACE_BYTES (OT, Index);
+
+typedef Index NameID;
+
+/* Offset, Null offset = 0 */
+template <typename Type, bool has_null=true>
+struct Offset : Type
+{
+ Offset& operator = (typename Type::type i) { Type::operator= (i); return *this; }
+
+ typedef Type type;
+
+ bool is_null () const { return has_null && 0 == *this; }
+
+ void *serialize (hb_serialize_context_t *c, const void *base)
+ {
+ void *t = c->start_embed<void> ();
+ c->check_assign (*this, (unsigned) ((char *) t - (char *) base));
+ return t;
+ }
+
+ public:
+ DEFINE_SIZE_STATIC (sizeof (Type));
+};
+
+typedef Offset<HBUINT16> Offset16;
+typedef Offset<HBUINT32> Offset32;
+
+
+/* CheckSum */
+struct CheckSum : HBUINT32
+{
+ CheckSum& operator = (uint32_t i) { HBUINT32::operator= (i); return *this; }
+
+ /* This is reference implementation from the spec. */
+ static uint32_t CalcTableChecksum (const HBUINT32 *Table, uint32_t Length)
+ {
+ uint32_t Sum = 0L;
+ assert (0 == (Length & 3));
+ const HBUINT32 *EndPtr = Table + Length / HBUINT32::static_size;
+
+ while (Table < EndPtr)
+ Sum += *Table++;
+ return Sum;
+ }
+
+ /* Note: data should be 4byte aligned and have 4byte padding at the end. */
+ void set_for_data (const void *data, unsigned int length)
+ { *this = CalcTableChecksum ((const HBUINT32 *) data, length); }
+
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+
+/*
+ * Version Numbers
+ */
+
+template <typename FixedType=HBUINT16>
+struct FixedVersion
+{
+ uint32_t to_int () const { return (major << (sizeof (FixedType) * 8)) + minor; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ FixedType major;
+ FixedType minor;
+ public:
+ DEFINE_SIZE_STATIC (2 * sizeof (FixedType));
+};
+
+
+/*
+ * Template subclasses of Offset that do the dereferencing.
+ * Use: (base+offset)
+ */
+
+template <typename Type, bool has_null>
+struct _hb_has_null
+{
+ static const Type *get_null () { return nullptr; }
+ static Type *get_crap () { return nullptr; }
+};
+template <typename Type>
+struct _hb_has_null<Type, true>
+{
+ static const Type *get_null () { return &Null (Type); }
+ static Type *get_crap () { return &Crap (Type); }
+};
+
+template <typename Type, typename OffsetType=HBUINT16, bool has_null=true>
+struct OffsetTo : Offset<OffsetType, has_null>
+{
+ HB_DELETE_COPY_ASSIGN (OffsetTo);
+ OffsetTo () = default;
+
+ OffsetTo& operator = (typename OffsetType::type i) { OffsetType::operator= (i); return *this; }
+
+ const Type& operator () (const void *base) const
+ {
+ if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
+ return StructAtOffset<const Type> (base, *this);
+ }
+ Type& operator () (void *base) const
+ {
+ if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_crap ();
+ return StructAtOffset<Type> (base, *this);
+ }
+
+ template <typename Base,
+ hb_enable_if (hb_is_convertible (const Base, const void *))>
+ friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
+ template <typename Base,
+ hb_enable_if (hb_is_convertible (const Base, const void *))>
+ friend const Type& operator + (const OffsetTo &offset, const Base &base) { return offset ((const void *) base); }
+ template <typename Base,
+ hb_enable_if (hb_is_convertible (Base, void *))>
+ friend Type& operator + (Base &&base, OffsetTo &offset) { return offset ((void *) base); }
+ template <typename Base,
+ hb_enable_if (hb_is_convertible (Base, void *))>
+ friend Type& operator + (OffsetTo &offset, Base &&base) { return offset ((void *) base); }
+
+ Type& serialize (hb_serialize_context_t *c, const void *base)
+ {
+ return * (Type *) Offset<OffsetType>::serialize (c, base);
+ }
+
+ template <typename ...Ts>
+ bool serialize_subset (hb_subset_context_t *c,
+ const OffsetTo& src,
+ const void *src_base,
+ const void *dst_base,
+ Ts&&... ds)
+ {
+ *this = 0;
+ if (src.is_null ())
+ return false;
+
+ auto *s = c->serializer;
+
+ s->push ();
+
+ bool ret = c->dispatch (src_base+src, hb_forward<Ts> (ds)...);
+
+ if (ret || !has_null)
+ s->add_link (*this, s->pop_pack (), dst_base);
+ else
+ s->pop_discard ();
+
+ return ret;
+ }
+
+ /* TODO: Somehow merge this with previous function into a serialize_dispatch(). */
+ template <typename ...Ts>
+ bool serialize_copy (hb_serialize_context_t *c,
+ const OffsetTo& src,
+ const void *src_base,
+ const void *dst_base,
+ Ts&&... ds)
+ {
+ *this = 0;
+ if (src.is_null ())
+ return false;
+
+ c->push ();
+
+ bool ret = c->copy (src_base+src, hb_forward<Ts> (ds)...);
+
+ c->add_link (*this, c->pop_pack (), dst_base);
+
+ return ret;
+ }
+
+ bool sanitize_shallow (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this))) return_trace (false);
+ if (unlikely (this->is_null ())) return_trace (true);
+ if (unlikely (!c->check_range (base, *this))) return_trace (false);
+ return_trace (true);
+ }
+
+ template <typename ...Ts>
+ bool sanitize (hb_sanitize_context_t *c, const void *base, Ts&&... ds) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (sanitize_shallow (c, base) &&
+ (this->is_null () ||
+ c->dispatch (StructAtOffset<Type> (base, *this), hb_forward<Ts> (ds)...) ||
+ neuter (c)));
+ }
+
+ /* Set the offset to Null */
+ bool neuter (hb_sanitize_context_t *c) const
+ {
+ if (!has_null) return false;
+ return c->try_set (this, 0);
+ }
+ DEFINE_SIZE_STATIC (sizeof (OffsetType));
+};
+/* Partial specializations. */
+template <typename Type, bool has_null=true>
+using LOffsetTo = OffsetTo<Type, HBUINT32, has_null>;
+template <typename Type, typename OffsetType=HBUINT16>
+using NNOffsetTo = OffsetTo<Type, OffsetType, false>;
+template <typename Type>
+using LNNOffsetTo = LOffsetTo<Type, false>;
+
+
+/*
+ * Array Types
+ */
+
+template <typename Type>
+struct UnsizedArrayOf
+{
+ typedef Type item_t;
+ static constexpr unsigned item_size = hb_static_size (Type);
+
+ HB_DELETE_CREATE_COPY_ASSIGN (UnsizedArrayOf);
+
+ const Type& operator [] (int i_) const
+ {
+ unsigned int i = (unsigned int) i_;
+ const Type *p = &arrayZ[i];
+ if (unlikely (p < arrayZ)) return Null (Type); /* Overflowed. */
+ return *p;
+ }
+ Type& operator [] (int i_)
+ {
+ unsigned int i = (unsigned int) i_;
+ Type *p = &arrayZ[i];
+ if (unlikely (p < arrayZ)) return Crap (Type); /* Overflowed. */
+ return *p;
+ }
+
+ unsigned int get_size (unsigned int len) const
+ { return len * Type::static_size; }
+
+ template <typename T> operator T * () { return arrayZ; }
+ template <typename T> operator const T * () const { return arrayZ; }
+ hb_array_t<Type> as_array (unsigned int len)
+ { return hb_array (arrayZ, len); }
+ hb_array_t<const Type> as_array (unsigned int len) const
+ { return hb_array (arrayZ, len); }
+ operator hb_array_t< Type> () { return as_array (); }
+ operator hb_array_t<const Type> () const { return as_array (); }
+
+ template <typename T>
+ Type &lsearch (unsigned int len, const T &x, Type &not_found = Crap (Type))
+ { return *as_array (len).lsearch (x, &not_found); }
+ template <typename T>
+ const Type &lsearch (unsigned int len, const T &x, const Type &not_found = Null (Type)) const
+ { return *as_array (len).lsearch (x, &not_found); }
+
+ void qsort (unsigned int len, unsigned int start = 0, unsigned int end = (unsigned int) -1)
+ { as_array (len).qsort (start, end); }
+
+ bool serialize (hb_serialize_context_t *c, unsigned int items_len)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend (*this, items_len))) return_trace (false);
+ return_trace (true);
+ }
+ template <typename Iterator,
+ hb_requires (hb_is_source_of (Iterator, Type))>
+ bool serialize (hb_serialize_context_t *c, Iterator items)
+ {
+ TRACE_SERIALIZE (this);
+ unsigned count = items.len ();
+ if (unlikely (!serialize (c, count))) return_trace (false);
+ /* TODO Umm. Just exhaust the iterator instead? Being extra
+ * cautious right now.. */
+ for (unsigned i = 0; i < count; i++, ++items)
+ arrayZ[i] = *items;
+ return_trace (true);
+ }
+
+ UnsizedArrayOf* copy (hb_serialize_context_t *c, unsigned count) const
+ {
+ TRACE_SERIALIZE (this);
+ auto *out = c->start_embed (this);
+ if (unlikely (!as_array (count).copy (c))) return_trace (nullptr);
+ return_trace (out);
+ }
+
+ template <typename ...Ts>
+ bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts&&... ds) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
+ if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true);
+ for (unsigned int i = 0; i < count; i++)
+ if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...)))
+ return_trace (false);
+ return_trace (true);
+ }
+
+ bool sanitize_shallow (hb_sanitize_context_t *c, unsigned int count) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_array (arrayZ, count));
+ }
+
+ public:
+ Type arrayZ[HB_VAR_ARRAY];
+ public:
+ DEFINE_SIZE_UNBOUNDED (0);
+};
+
+/* Unsized array of offset's */
+template <typename Type, typename OffsetType, bool has_null=true>
+using UnsizedOffsetArrayOf = UnsizedArrayOf<OffsetTo<Type, OffsetType, has_null>>;
+
+/* Unsized array of offsets relative to the beginning of the array itself. */
+template <typename Type, typename OffsetType, bool has_null=true>
+struct UnsizedOffsetListOf : UnsizedOffsetArrayOf<Type, OffsetType, has_null>
+{
+ const Type& operator [] (int i_) const
+ {
+ unsigned int i = (unsigned int) i_;
+ const OffsetTo<Type, OffsetType, has_null> *p = &this->arrayZ[i];
+ if (unlikely (p < this->arrayZ)) return Null (Type); /* Overflowed. */
+ return this+*p;
+ }
+ Type& operator [] (int i_)
+ {
+ unsigned int i = (unsigned int) i_;
+ const OffsetTo<Type, OffsetType, has_null> *p = &this->arrayZ[i];
+ if (unlikely (p < this->arrayZ)) return Crap (Type); /* Overflowed. */
+ return this+*p;
+ }
+
+ template <typename ...Ts>
+ bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts&&... ds) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace ((UnsizedOffsetArrayOf<Type, OffsetType, has_null>
+ ::sanitize (c, count, this, hb_forward<Ts> (ds)...)));
+ }
+};
+
+/* An array with sorted elements. Supports binary searching. */
+template <typename Type>
+struct SortedUnsizedArrayOf : UnsizedArrayOf<Type>
+{
+ hb_sorted_array_t<Type> as_array (unsigned int len)
+ { return hb_sorted_array (this->arrayZ, len); }
+ hb_sorted_array_t<const Type> as_array (unsigned int len) const
+ { return hb_sorted_array (this->arrayZ, len); }
+ operator hb_sorted_array_t<Type> () { return as_array (); }
+ operator hb_sorted_array_t<const Type> () const { return as_array (); }
+
+ template <typename T>
+ Type &bsearch (unsigned int len, const T &x, Type &not_found = Crap (Type))
+ { return *as_array (len).bsearch (x, &not_found); }
+ template <typename T>
+ const Type &bsearch (unsigned int len, const T &x, const Type &not_found = Null (Type)) const
+ { return *as_array (len).bsearch (x, &not_found); }
+ template <typename T>
+ bool bfind (unsigned int len, const T &x, unsigned int *i = nullptr,
+ hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+ unsigned int to_store = (unsigned int) -1) const
+ { return as_array (len).bfind (x, i, not_found, to_store); }
+};
+
+
+/* An array with a number of elements. */
+template <typename Type, typename LenType=HBUINT16>
+struct ArrayOf
+{
+ typedef Type item_t;
+ static constexpr unsigned item_size = hb_static_size (Type);
+
+ HB_DELETE_CREATE_COPY_ASSIGN (ArrayOf);
+
+ const Type& operator [] (int i_) const
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i >= len)) return Null (Type);
+ return arrayZ[i];
+ }
+ Type& operator [] (int i_)
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i >= len)) return Crap (Type);
+ return arrayZ[i];
+ }
+
+ unsigned int get_size () const
+ { return len.static_size + len * Type::static_size; }
+
+ explicit operator bool () const { return len; }
+
+ void pop () { len--; }
+
+ hb_array_t< Type> as_array () { return hb_array (arrayZ, len); }
+ hb_array_t<const Type> as_array () const { return hb_array (arrayZ, len); }
+
+ /* Iterator. */
+ typedef hb_array_t<const Type> iter_t;
+ typedef hb_array_t< Type> writer_t;
+ iter_t iter () const { return as_array (); }
+ writer_t writer () { return as_array (); }
+ operator iter_t () const { return iter (); }
+ operator writer_t () { return writer (); }
+
+ hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+ { return as_array ().sub_array (start_offset, count); }
+ hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
+ { return as_array ().sub_array (start_offset, count); }
+ hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+ { return as_array ().sub_array (start_offset, count); }
+ hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
+ { return as_array ().sub_array (start_offset, count); }
+
+ bool serialize (hb_serialize_context_t *c, unsigned int items_len)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+ c->check_assign (len, items_len);
+ if (unlikely (!c->extend (*this))) return_trace (false);
+ return_trace (true);
+ }
+ template <typename Iterator,
+ hb_requires (hb_is_source_of (Iterator, Type))>
+ bool serialize (hb_serialize_context_t *c, Iterator items)
+ {
+ TRACE_SERIALIZE (this);
+ unsigned count = items.len ();
+ if (unlikely (!serialize (c, count))) return_trace (false);
+ /* TODO Umm. Just exhaust the iterator instead? Being extra
+ * cautious right now.. */
+ for (unsigned i = 0; i < count; i++, ++items)
+ arrayZ[i] = *items;
+ return_trace (true);
+ }
+
+ Type* serialize_append (hb_serialize_context_t *c)
+ {
+ TRACE_SERIALIZE (this);
+ len++;
+ if (unlikely (!len || !c->extend (*this)))
+ {
+ len--;
+ return_trace (nullptr);
+ }
+ return_trace (&arrayZ[len - 1]);
+ }
+
+ ArrayOf* copy (hb_serialize_context_t *c) const
+ {
+ TRACE_SERIALIZE (this);
+ auto *out = c->start_embed (this);
+ if (unlikely (!c->extend_min (out))) return_trace (nullptr);
+ c->check_assign (out->len, len);
+ if (unlikely (!as_array ().copy (c))) return_trace (nullptr);
+ return_trace (out);
+ }
+
+ template <typename ...Ts>
+ bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!sanitize_shallow (c))) return_trace (false);
+ if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true);
+ unsigned int count = len;
+ for (unsigned int i = 0; i < count; i++)
+ if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...)))
+ return_trace (false);
+ return_trace (true);
+ }
+
+ template <typename T>
+ Type &lsearch (const T &x, Type &not_found = Crap (Type))
+ { return *as_array ().lsearch (x, &not_found); }
+ template <typename T>
+ const Type &lsearch (const T &x, const Type &not_found = Null (Type)) const
+ { return *as_array ().lsearch (x, &not_found); }
+
+ void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1)
+ { as_array ().qsort (start, end); }
+
+ bool sanitize_shallow (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (len.sanitize (c) && c->check_array (arrayZ, len));
+ }
+
+ public:
+ LenType len;
+ Type arrayZ[HB_VAR_ARRAY];
+ public:
+ DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ);
+};
+template <typename Type>
+using LArrayOf = ArrayOf<Type, HBUINT32>;
+using PString = ArrayOf<HBUINT8, HBUINT8>;
+
+/* Array of Offset's */
+template <typename Type>
+using OffsetArrayOf = ArrayOf<OffsetTo<Type, HBUINT16>>;
+template <typename Type>
+using LOffsetArrayOf = ArrayOf<OffsetTo<Type, HBUINT32>>;
+template <typename Type>
+using LOffsetLArrayOf = ArrayOf<OffsetTo<Type, HBUINT32>, HBUINT32>;
+
+/* Array of offsets relative to the beginning of the array itself. */
+template <typename Type>
+struct OffsetListOf : OffsetArrayOf<Type>
+{
+ const Type& operator [] (int i_) const
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i >= this->len)) return Null (Type);
+ return this+this->arrayZ[i];
+ }
+ const Type& operator [] (int i_)
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i >= this->len)) return Crap (Type);
+ return this+this->arrayZ[i];
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ struct OffsetListOf<Type> *out = c->serializer->embed (*this);
+ if (unlikely (!out)) return_trace (false);
+ unsigned int count = this->len;
+ for (unsigned int i = 0; i < count; i++)
+ out->arrayZ[i].serialize_subset (c, this->arrayZ[i], this, out);
+ return_trace (true);
+ }
+
+ template <typename ...Ts>
+ bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (OffsetArrayOf<Type>::sanitize (c, this, hb_forward<Ts> (ds)...));
+ }
+};
+
+/* An array starting at second element. */
+template <typename Type, typename LenType=HBUINT16>
+struct HeadlessArrayOf
+{
+ static constexpr unsigned item_size = Type::static_size;
+
+ HB_DELETE_CREATE_COPY_ASSIGN (HeadlessArrayOf);
+
+ const Type& operator [] (int i_) const
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i >= lenP1 || !i)) return Null (Type);
+ return arrayZ[i-1];
+ }
+ Type& operator [] (int i_)
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i >= lenP1 || !i)) return Crap (Type);
+ return arrayZ[i-1];
+ }
+ unsigned int get_size () const
+ { return lenP1.static_size + get_length () * Type::static_size; }
+
+ unsigned get_length () const { return lenP1 ? lenP1 - 1 : 0; }
+
+ hb_array_t< Type> as_array () { return hb_array (arrayZ, get_length ()); }
+ hb_array_t<const Type> as_array () const { return hb_array (arrayZ, get_length ()); }
+
+ /* Iterator. */
+ typedef hb_array_t<const Type> iter_t;
+ typedef hb_array_t< Type> writer_t;
+ iter_t iter () const { return as_array (); }
+ writer_t writer () { return as_array (); }
+ operator iter_t () const { return iter (); }
+ operator writer_t () { return writer (); }
+
+ bool serialize (hb_serialize_context_t *c, unsigned int items_len)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+ c->check_assign (lenP1, items_len + 1);
+ if (unlikely (!c->extend (*this))) return_trace (false);
+ return_trace (true);
+ }
+ template <typename Iterator,
+ hb_requires (hb_is_source_of (Iterator, Type))>
+ bool serialize (hb_serialize_context_t *c, Iterator items)
+ {
+ TRACE_SERIALIZE (this);
+ unsigned count = items.len ();
+ if (unlikely (!serialize (c, count))) return_trace (false);
+ /* TODO Umm. Just exhaust the iterator instead? Being extra
+ * cautious right now.. */
+ for (unsigned i = 0; i < count; i++, ++items)
+ arrayZ[i] = *items;
+ return_trace (true);
+ }
+
+ template <typename ...Ts>
+ bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!sanitize_shallow (c))) return_trace (false);
+ if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true);
+ unsigned int count = get_length ();
+ for (unsigned int i = 0; i < count; i++)
+ if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...)))
+ return_trace (false);
+ return_trace (true);
+ }
+
+ private:
+ bool sanitize_shallow (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (lenP1.sanitize (c) &&
+ (!lenP1 || c->check_array (arrayZ, lenP1 - 1)));
+ }
+
+ public:
+ LenType lenP1;
+ Type arrayZ[HB_VAR_ARRAY];
+ public:
+ DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ);
+};
+
+/* An array storing length-1. */
+template <typename Type, typename LenType=HBUINT16>
+struct ArrayOfM1
+{
+ HB_DELETE_CREATE_COPY_ASSIGN (ArrayOfM1);
+
+ const Type& operator [] (int i_) const
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i > lenM1)) return Null (Type);
+ return arrayZ[i];
+ }
+ Type& operator [] (int i_)
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i > lenM1)) return Crap (Type);
+ return arrayZ[i];
+ }
+ unsigned int get_size () const
+ { return lenM1.static_size + (lenM1 + 1) * Type::static_size; }
+
+ template <typename ...Ts>
+ bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!sanitize_shallow (c))) return_trace (false);
+ unsigned int count = lenM1 + 1;
+ for (unsigned int i = 0; i < count; i++)
+ if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...)))
+ return_trace (false);
+ return_trace (true);
+ }
+
+ private:
+ bool sanitize_shallow (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (lenM1.sanitize (c) &&
+ (c->check_array (arrayZ, lenM1 + 1)));
+ }
+
+ public:
+ LenType lenM1;
+ Type arrayZ[HB_VAR_ARRAY];
+ public:
+ DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ);
+};
+
+/* An array with sorted elements. Supports binary searching. */
+template <typename Type, typename LenType=HBUINT16>
+struct SortedArrayOf : ArrayOf<Type, LenType>
+{
+ hb_sorted_array_t< Type> as_array () { return hb_sorted_array (this->arrayZ, this->len); }
+ hb_sorted_array_t<const Type> as_array () const { return hb_sorted_array (this->arrayZ, this->len); }
+
+ /* Iterator. */
+ typedef hb_sorted_array_t<const Type> iter_t;
+ typedef hb_sorted_array_t< Type> writer_t;
+ iter_t iter () const { return as_array (); }
+ writer_t writer () { return as_array (); }
+ operator iter_t () const { return iter (); }
+ operator writer_t () { return writer (); }
+
+ hb_sorted_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+ { return as_array ().sub_array (start_offset, count); }
+ hb_sorted_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
+ { return as_array ().sub_array (start_offset, count); }
+ hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+ { return as_array ().sub_array (start_offset, count); }
+ hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
+ { return as_array ().sub_array (start_offset, count); }
+
+ bool serialize (hb_serialize_context_t *c, unsigned int items_len)
+ {
+ TRACE_SERIALIZE (this);
+ bool ret = ArrayOf<Type, LenType>::serialize (c, items_len);
+ return_trace (ret);
+ }
+ template <typename Iterator,
+ hb_requires (hb_is_sorted_source_of (Iterator, Type))>
+ bool serialize (hb_serialize_context_t *c, Iterator items)
+ {
+ TRACE_SERIALIZE (this);
+ bool ret = ArrayOf<Type, LenType>::serialize (c, items);
+ return_trace (ret);
+ }
+
+ template <typename T>
+ Type &bsearch (const T &x, Type &not_found = Crap (Type))
+ { return *as_array ().bsearch (x, &not_found); }
+ template <typename T>
+ const Type &bsearch (const T &x, const Type &not_found = Null (Type)) const
+ { return *as_array ().bsearch (x, &not_found); }
+ template <typename T>
+ bool bfind (const T &x, unsigned int *i = nullptr,
+ hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+ unsigned int to_store = (unsigned int) -1) const
+ { return as_array ().bfind (x, i, not_found, to_store); }
+};
+
+/*
+ * Binary-search arrays
+ */
+
+template <typename LenType=HBUINT16>
+struct BinSearchHeader
+{
+ operator uint32_t () const { return len; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ BinSearchHeader& operator = (unsigned int v)
+ {
+ len = v;
+ assert (len == v);
+ entrySelector = hb_max (1u, hb_bit_storage (v)) - 1;
+ searchRange = 16 * (1u << entrySelector);
+ rangeShift = v * 16 > searchRange
+ ? 16 * v - searchRange
+ : 0;
+ return *this;
+ }
+
+ protected:
+ LenType len;
+ LenType searchRange;
+ LenType entrySelector;
+ LenType rangeShift;
+
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+template <typename Type, typename LenType=HBUINT16>
+using BinSearchArrayOf = SortedArrayOf<Type, BinSearchHeader<LenType>>;
+
+
+struct VarSizedBinSearchHeader
+{
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ HBUINT16 unitSize; /* Size of a lookup unit for this search in bytes. */
+ HBUINT16 nUnits; /* Number of units of the preceding size to be searched. */
+ HBUINT16 searchRange; /* The value of unitSize times the largest power of 2
+ * that is less than or equal to the value of nUnits. */
+ HBUINT16 entrySelector; /* The log base 2 of the largest power of 2 less than
+ * or equal to the value of nUnits. */
+ HBUINT16 rangeShift; /* The value of unitSize times the difference of the
+ * value of nUnits minus the largest power of 2 less
+ * than or equal to the value of nUnits. */
+ public:
+ DEFINE_SIZE_STATIC (10);
+};
+
+template <typename Type>
+struct VarSizedBinSearchArrayOf
+{
+ static constexpr unsigned item_size = Type::static_size;
+
+ HB_DELETE_CREATE_COPY_ASSIGN (VarSizedBinSearchArrayOf);
+
+ bool last_is_terminator () const
+ {
+ if (unlikely (!header.nUnits)) return false;
+
+ /* Gah.
+ *
+ * "The number of termination values that need to be included is table-specific.
+ * The value that indicates binary search termination is 0xFFFF." */
+ const HBUINT16 *words = &StructAtOffset<HBUINT16> (&bytesZ, (header.nUnits - 1) * header.unitSize);
+ unsigned int count = Type::TerminationWordCount;
+ for (unsigned int i = 0; i < count; i++)
+ if (words[i] != 0xFFFFu)
+ return false;
+ return true;
+ }
+
+ const Type& operator [] (int i_) const
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i >= get_length ())) return Null (Type);
+ return StructAtOffset<Type> (&bytesZ, i * header.unitSize);
+ }
+ Type& operator [] (int i_)
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i >= get_length ())) return Crap (Type);
+ return StructAtOffset<Type> (&bytesZ, i * header.unitSize);
+ }
+ unsigned int get_length () const
+ { return header.nUnits - last_is_terminator (); }
+ unsigned int get_size () const
+ { return header.static_size + header.nUnits * header.unitSize; }
+
+ template <typename ...Ts>
+ bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!sanitize_shallow (c))) return_trace (false);
+ if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true);
+ unsigned int count = get_length ();
+ for (unsigned int i = 0; i < count; i++)
+ if (unlikely (!(*this)[i].sanitize (c, hb_forward<Ts> (ds)...)))
+ return_trace (false);
+ return_trace (true);
+ }
+
+ template <typename T>
+ const Type *bsearch (const T &key) const
+ {
+ unsigned int size = header.unitSize;
+ int min = 0, max = (int) get_length () - 1;
+ while (min <= max)
+ {
+ int mid = ((unsigned int) min + (unsigned int) max) / 2;
+ const Type *p = (const Type *) (((const char *) &bytesZ) + (mid * size));
+ int c = p->cmp (key);
+ if (c < 0) max = mid - 1;
+ else if (c > 0) min = mid + 1;
+ else return p;
+ }
+ return nullptr;
+ }
+
+ private:
+ bool sanitize_shallow (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (header.sanitize (c) &&
+ Type::static_size <= header.unitSize &&
+ c->check_range (bytesZ.arrayZ,
+ header.nUnits,
+ header.unitSize));
+ }
+
+ protected:
+ VarSizedBinSearchHeader header;
+ UnsizedArrayOf<HBUINT8> bytesZ;
+ public:
+ DEFINE_SIZE_ARRAY (10, bytesZ);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OPEN_TYPE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cbdt-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-cbdt-table.hh
deleted file mode 100644
index 415625e5f8..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-cbdt-table.hh
+++ /dev/null
@@ -1,471 +0,0 @@
-/*
- * Copyright © 2016 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Seigo Nonaka
- */
-
-#ifndef HB_OT_CBDT_TABLE_HH
-#define HB_OT_CBDT_TABLE_HH
-
-#include "hb-open-type-private.hh"
-
-namespace OT {
-
-struct SmallGlyphMetrics
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- inline void get_extents (hb_glyph_extents_t *extents) const
- {
- extents->x_bearing = bearingX;
- extents->y_bearing = bearingY;
- extents->width = width;
- extents->height = -height;
- }
-
- UINT8 height;
- UINT8 width;
- INT8 bearingX;
- INT8 bearingY;
- UINT8 advance;
-
- DEFINE_SIZE_STATIC(5);
-};
-
-struct BigGlyphMetrics : SmallGlyphMetrics
-{
- INT8 vertBearingX;
- INT8 vertBearingY;
- UINT8 vertAdvance;
-
- DEFINE_SIZE_STATIC(8);
-};
-
-struct SBitLineMetrics
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- INT8 ascender;
- INT8 decender;
- UINT8 widthMax;
- INT8 caretSlopeNumerator;
- INT8 caretSlopeDenominator;
- INT8 caretOffset;
- INT8 minOriginSB;
- INT8 minAdvanceSB;
- INT8 maxBeforeBL;
- INT8 minAfterBL;
- INT8 padding1;
- INT8 padding2;
-
- DEFINE_SIZE_STATIC(12);
-};
-
-
-/*
- * Index Subtables.
- */
-
-struct IndexSubtableHeader
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- UINT16 indexFormat;
- UINT16 imageFormat;
- UINT32 imageDataOffset;
-
- DEFINE_SIZE_STATIC(8);
-};
-
-template <typename OffsetType>
-struct IndexSubtableFormat1Or3
-{
- inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- c->check_array (offsetArrayZ, offsetArrayZ[0].static_size, glyph_count + 1));
- }
-
- bool get_image_data (unsigned int idx,
- unsigned int *offset,
- unsigned int *length) const
- {
- if (unlikely (offsetArrayZ[idx + 1] <= offsetArrayZ[idx]))
- return false;
-
- *offset = header.imageDataOffset + offsetArrayZ[idx];
- *length = offsetArrayZ[idx + 1] - offsetArrayZ[idx];
- return true;
- }
-
- IndexSubtableHeader header;
- Offset<OffsetType> offsetArrayZ[VAR];
-
- DEFINE_SIZE_ARRAY(8, offsetArrayZ);
-};
-
-struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<UINT32> {};
-struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<UINT16> {};
-
-struct IndexSubtable
-{
- inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
- {
- TRACE_SANITIZE (this);
- if (!u.header.sanitize (c)) return_trace (false);
- switch (u.header.indexFormat) {
- case 1: return_trace (u.format1.sanitize (c, glyph_count));
- case 3: return_trace (u.format3.sanitize (c, glyph_count));
- default:return_trace (true);
- }
- }
-
- inline bool get_extents (hb_glyph_extents_t *extents) const
- {
- switch (u.header.indexFormat) {
- case 2: case 5: /* TODO */
- case 1: case 3: case 4: /* Variable-metrics formats do not have metrics here. */
- default:return (false);
- }
- }
-
- bool get_image_data (unsigned int idx,
- unsigned int *offset,
- unsigned int *length,
- unsigned int *format) const
- {
- *format = u.header.imageFormat;
- switch (u.header.indexFormat) {
- case 1: return u.format1.get_image_data (idx, offset, length);
- case 3: return u.format3.get_image_data (idx, offset, length);
- default: return false;
- }
- }
-
- protected:
- union {
- IndexSubtableHeader header;
- IndexSubtableFormat1 format1;
- IndexSubtableFormat3 format3;
- /* TODO: Format 2, 4, 5. */
- } u;
- public:
- DEFINE_SIZE_UNION (8, header);
-};
-
-struct IndexSubtableRecord
-{
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- firstGlyphIndex <= lastGlyphIndex &&
- offsetToSubtable.sanitize (c, this, lastGlyphIndex - firstGlyphIndex + 1));
- }
-
- inline bool get_extents (hb_glyph_extents_t *extents) const
- {
- return (this+offsetToSubtable).get_extents (extents);
- }
-
- bool get_image_data (unsigned int gid,
- unsigned int *offset,
- unsigned int *length,
- unsigned int *format) const
- {
- if (gid < firstGlyphIndex || gid > lastGlyphIndex)
- {
- return false;
- }
- return (this+offsetToSubtable).get_image_data (gid - firstGlyphIndex,
- offset, length, format);
- }
-
- UINT16 firstGlyphIndex;
- UINT16 lastGlyphIndex;
- LOffsetTo<IndexSubtable> offsetToSubtable;
-
- DEFINE_SIZE_STATIC(8);
-};
-
-struct IndexSubtableArray
-{
- inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!c->check_array (&indexSubtablesZ, indexSubtablesZ[0].static_size, count)))
- return_trace (false);
- for (unsigned int i = 0; i < count; i++)
- if (unlikely (!indexSubtablesZ[i].sanitize (c, this)))
- return_trace (false);
- return_trace (true);
- }
-
- public:
- const IndexSubtableRecord* find_table (hb_codepoint_t glyph, unsigned int numTables) const
- {
- for (unsigned int i = 0; i < numTables; ++i)
- {
- unsigned int firstGlyphIndex = indexSubtablesZ[i].firstGlyphIndex;
- unsigned int lastGlyphIndex = indexSubtablesZ[i].lastGlyphIndex;
- if (firstGlyphIndex <= glyph && glyph <= lastGlyphIndex) {
- return &indexSubtablesZ[i];
- }
- }
- return nullptr;
- }
-
- protected:
- IndexSubtableRecord indexSubtablesZ[VAR];
-
- public:
- DEFINE_SIZE_ARRAY(0, indexSubtablesZ);
-};
-
-struct BitmapSizeTable
-{
- friend struct CBLC;
-
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- indexSubtableArrayOffset.sanitize (c, base, numberOfIndexSubtables) &&
- c->check_range (&(base+indexSubtableArrayOffset), indexTablesSize) &&
- horizontal.sanitize (c) &&
- vertical.sanitize (c));
- }
-
- const IndexSubtableRecord *find_table (hb_codepoint_t glyph, const void *base) const
- {
- return (base+indexSubtableArrayOffset).find_table (glyph, numberOfIndexSubtables);
- }
-
- protected:
- LOffsetTo<IndexSubtableArray> indexSubtableArrayOffset;
- UINT32 indexTablesSize;
- UINT32 numberOfIndexSubtables;
- UINT32 colorRef;
- SBitLineMetrics horizontal;
- SBitLineMetrics vertical;
- UINT16 startGlyphIndex;
- UINT16 endGlyphIndex;
- UINT8 ppemX;
- UINT8 ppemY;
- UINT8 bitDepth;
- INT8 flags;
-
- public:
- DEFINE_SIZE_STATIC(48);
-};
-
-
-/*
- * Glyph Bitmap Data Formats.
- */
-
-struct GlyphBitmapDataFormat17
-{
- SmallGlyphMetrics glyphMetrics;
- UINT32 dataLen;
- UINT8 dataZ[VAR];
-
- DEFINE_SIZE_ARRAY(9, dataZ);
-};
-
-
-/*
- * CBLC -- Color Bitmap Location Table
- */
-
-#define HB_OT_TAG_CBLC HB_TAG('C','B','L','C')
-
-struct CBLC
-{
- friend struct CBDT;
-
- static const hb_tag_t tableTag = HB_OT_TAG_CBLC;
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- likely (version.major == 2 || version.major == 3) &&
- sizeTables.sanitize (c, this));
- }
-
- protected:
- const IndexSubtableRecord *find_table (hb_codepoint_t glyph,
- unsigned int *x_ppem, unsigned int *y_ppem) const
- {
- /* TODO: Make it possible to select strike. */
-
- unsigned int count = sizeTables.len;
- for (uint32_t i = 0; i < count; ++i)
- {
- unsigned int startGlyphIndex = sizeTables.array[i].startGlyphIndex;
- unsigned int endGlyphIndex = sizeTables.array[i].endGlyphIndex;
- if (startGlyphIndex <= glyph && glyph <= endGlyphIndex)
- {
- *x_ppem = sizeTables[i].ppemX;
- *y_ppem = sizeTables[i].ppemY;
- return sizeTables[i].find_table (glyph, this);
- }
- }
-
- return nullptr;
- }
-
- protected:
- FixedVersion<> version;
- LArrayOf<BitmapSizeTable> sizeTables;
-
- public:
- DEFINE_SIZE_ARRAY(8, sizeTables);
-};
-
-/*
- * CBDT -- Color Bitmap Data Table
- */
-#define HB_OT_TAG_CBDT HB_TAG('C','B','D','T')
-
-struct CBDT
-{
- static const hb_tag_t tableTag = HB_OT_TAG_CBDT;
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- likely (version.major == 2 || version.major == 3));
- }
-
- struct accelerator_t
- {
- inline void init (hb_face_t *face)
- {
- upem = face->get_upem();
-
- cblc_blob = Sanitizer<CBLC>::sanitize (face->reference_table (HB_OT_TAG_CBLC));
- cbdt_blob = Sanitizer<CBDT>::sanitize (face->reference_table (HB_OT_TAG_CBDT));
- cbdt_len = hb_blob_get_length (cbdt_blob);
-
- if (hb_blob_get_length (cblc_blob) == 0) {
- cblc = nullptr;
- cbdt = nullptr;
- return; /* Not a bitmap font. */
- }
- cblc = Sanitizer<CBLC>::lock_instance (cblc_blob);
- cbdt = Sanitizer<CBDT>::lock_instance (cbdt_blob);
-
- }
-
- inline void fini (void)
- {
- hb_blob_destroy (this->cblc_blob);
- hb_blob_destroy (this->cbdt_blob);
- }
-
- inline bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const
- {
- unsigned int x_ppem = upem, y_ppem = upem; /* TODO Use font ppem if available. */
-
- if (!cblc)
- return false; // Not a color bitmap font.
-
- const IndexSubtableRecord *subtable_record = this->cblc->find_table(glyph, &x_ppem, &y_ppem);
- if (!subtable_record || !x_ppem || !y_ppem)
- return false;
-
- if (subtable_record->get_extents (extents))
- return true;
-
- unsigned int image_offset = 0, image_length = 0, image_format = 0;
- if (!subtable_record->get_image_data (glyph, &image_offset, &image_length, &image_format))
- return false;
-
- {
- if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
- return false;
-
- switch (image_format)
- {
- case 17: {
- if (unlikely (image_length < GlyphBitmapDataFormat17::min_size))
- return false;
-
- const GlyphBitmapDataFormat17& glyphFormat17 =
- StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
- glyphFormat17.glyphMetrics.get_extents (extents);
- }
- break;
- default:
- // TODO: Support other image formats.
- return false;
- }
- }
-
- /* Convert to the font units. */
- extents->x_bearing *= upem / (float) x_ppem;
- extents->y_bearing *= upem / (float) y_ppem;
- extents->width *= upem / (float) x_ppem;
- extents->height *= upem / (float) y_ppem;
-
- return true;
- }
-
- private:
- hb_blob_t *cblc_blob;
- hb_blob_t *cbdt_blob;
- const CBLC *cblc;
- const CBDT *cbdt;
-
- unsigned int cbdt_len;
- unsigned int upem;
- };
-
-
- protected:
- FixedVersion<>version;
- UINT8 dataZ[VAR];
-
- public:
- DEFINE_SIZE_ARRAY(4, dataZ);
-};
-
-} /* namespace OT */
-
-#endif /* HB_OT_CBDT_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh
new file mode 100644
index 0000000000..6735c74be4
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh
@@ -0,0 +1,653 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+#ifndef HB_OT_CFF_COMMON_HH
+#define HB_OT_CFF_COMMON_HH
+
+#include "hb-open-type.hh"
+#include "hb-bimap.hh"
+#include "hb-ot-layout-common.hh"
+#include "hb-cff-interp-dict-common.hh"
+#include "hb-subset-plan.hh"
+
+namespace CFF {
+
+using namespace OT;
+
+#define CFF_UNDEF_CODE 0xFFFFFFFF
+
+/* utility macro */
+template<typename Type>
+static inline const Type& StructAtOffsetOrNull (const void *P, unsigned int offset)
+{ return offset ? StructAtOffset<Type> (P, offset) : Null (Type); }
+
+inline unsigned int calcOffSize (unsigned int dataSize)
+{
+ unsigned int size = 1;
+ unsigned int offset = dataSize + 1;
+ while (offset & ~0xFF)
+ {
+ size++;
+ offset >>= 8;
+ }
+ /* format does not support size > 4; caller should handle it as an error */
+ return size;
+}
+
+struct code_pair_t
+{
+ hb_codepoint_t code;
+ hb_codepoint_t glyph;
+};
+
+typedef hb_vector_t<unsigned char> str_buff_t;
+struct str_buff_vec_t : hb_vector_t<str_buff_t>
+{
+ void fini () { SUPER::fini_deep (); }
+
+ unsigned int total_size () const
+ {
+ unsigned int size = 0;
+ for (unsigned int i = 0; i < length; i++)
+ size += (*this)[i].length;
+ return size;
+ }
+
+ private:
+ typedef hb_vector_t<str_buff_t> SUPER;
+};
+
+/* CFF INDEX */
+template <typename COUNT>
+struct CFFIndex
+{
+ static unsigned int calculate_offset_array_size (unsigned int offSize, unsigned int count)
+ { return offSize * (count + 1); }
+
+ unsigned int offset_array_size () const
+ { return calculate_offset_array_size (offSize, count); }
+
+ static unsigned int calculate_serialized_size (unsigned int offSize_, unsigned int count,
+ unsigned int dataSize)
+ {
+ if (count == 0) return COUNT::static_size;
+ return min_size + calculate_offset_array_size (offSize_, count) + dataSize;
+ }
+
+ bool serialize (hb_serialize_context_t *c, const CFFIndex &src)
+ {
+ TRACE_SERIALIZE (this);
+ unsigned int size = src.get_size ();
+ CFFIndex *dest = c->allocate_size<CFFIndex> (size);
+ if (unlikely (dest == nullptr)) return_trace (false);
+ memcpy (dest, &src, size);
+ return_trace (true);
+ }
+
+ bool serialize (hb_serialize_context_t *c,
+ unsigned int offSize_,
+ const byte_str_array_t &byteArray)
+ {
+ TRACE_SERIALIZE (this);
+ if (byteArray.length == 0)
+ {
+ COUNT *dest = c->allocate_min<COUNT> ();
+ if (unlikely (dest == nullptr)) return_trace (false);
+ *dest = 0;
+ }
+ else
+ {
+ /* serialize CFFIndex header */
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+ this->count = byteArray.length;
+ this->offSize = offSize_;
+ if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (byteArray.length + 1))))
+ return_trace (false);
+
+ /* serialize indices */
+ unsigned int offset = 1;
+ unsigned int i = 0;
+ for (; i < byteArray.length; i++)
+ {
+ set_offset_at (i, offset);
+ offset += byteArray[i].get_size ();
+ }
+ set_offset_at (i, offset);
+
+ /* serialize data */
+ for (unsigned int i = 0; i < byteArray.length; i++)
+ {
+ const byte_str_t &bs = byteArray[i];
+ unsigned char *dest = c->allocate_size<unsigned char> (bs.length);
+ if (unlikely (dest == nullptr))
+ return_trace (false);
+ memcpy (dest, &bs[0], bs.length);
+ }
+ }
+ return_trace (true);
+ }
+
+ bool serialize (hb_serialize_context_t *c,
+ unsigned int offSize_,
+ const str_buff_vec_t &buffArray)
+ {
+ byte_str_array_t byteArray;
+ byteArray.init ();
+ byteArray.resize (buffArray.length);
+ for (unsigned int i = 0; i < byteArray.length; i++)
+ byteArray[i] = byte_str_t (buffArray[i].arrayZ, buffArray[i].length);
+ bool result = this->serialize (c, offSize_, byteArray);
+ byteArray.fini ();
+ return result;
+ }
+
+ void set_offset_at (unsigned int index, unsigned int offset)
+ {
+ HBUINT8 *p = offsets + offSize * index + offSize;
+ unsigned int size = offSize;
+ for (; size; size--)
+ {
+ --p;
+ *p = offset & 0xFF;
+ offset >>= 8;
+ }
+ }
+
+ unsigned int offset_at (unsigned int index) const
+ {
+ assert (index <= count);
+ const HBUINT8 *p = offsets + offSize * index;
+ unsigned int size = offSize;
+ unsigned int offset = 0;
+ for (; size; size--)
+ offset = (offset << 8) + *p++;
+ return offset;
+ }
+
+ unsigned int length_at (unsigned int index) const
+ {
+ if (unlikely ((offset_at (index + 1) < offset_at (index)) ||
+ (offset_at (index + 1) > offset_at (count))))
+ return 0;
+ return offset_at (index + 1) - offset_at (index);
+ }
+
+ const unsigned char *data_base () const
+ { return (const unsigned char *) this + min_size + offset_array_size (); }
+
+ unsigned int data_size () const { return HBINT8::static_size; }
+
+ byte_str_t operator [] (unsigned int index) const
+ {
+ if (unlikely (index >= count)) return Null (byte_str_t);
+ return byte_str_t (data_base () + offset_at (index) - 1, length_at (index));
+ }
+
+ unsigned int get_size () const
+ {
+ if (this == &Null (CFFIndex)) return 0;
+ if (count > 0)
+ return min_size + offset_array_size () + (offset_at (count) - 1);
+ return count.static_size; /* empty CFFIndex contains count only */
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely ((c->check_struct (this) && count == 0) || /* empty INDEX */
+ (c->check_struct (this) && offSize >= 1 && offSize <= 4 &&
+ c->check_array (offsets, offSize, count + 1) &&
+ c->check_array ((const HBUINT8*) data_base (), 1, max_offset () - 1))));
+ }
+
+ protected:
+ unsigned int max_offset () const
+ {
+ unsigned int max = 0;
+ for (unsigned int i = 0; i < count + 1u; i++)
+ {
+ unsigned int off = offset_at (i);
+ if (off > max) max = off;
+ }
+ return max;
+ }
+
+ public:
+ COUNT count; /* Number of object data. Note there are (count+1) offsets */
+ HBUINT8 offSize; /* The byte size of each offset in the offsets array. */
+ HBUINT8 offsets[HB_VAR_ARRAY]; /* The array of (count + 1) offsets into objects array (1-base). */
+ /* HBUINT8 data[HB_VAR_ARRAY]; Object data */
+ public:
+ DEFINE_SIZE_ARRAY (COUNT::static_size + HBUINT8::static_size, offsets);
+};
+
+template <typename COUNT, typename TYPE>
+struct CFFIndexOf : CFFIndex<COUNT>
+{
+ const byte_str_t operator [] (unsigned int index) const
+ {
+ if (likely (index < CFFIndex<COUNT>::count))
+ return byte_str_t (CFFIndex<COUNT>::data_base () + CFFIndex<COUNT>::offset_at (index) - 1, CFFIndex<COUNT>::length_at (index));
+ return Null(byte_str_t);
+ }
+
+ template <typename DATA, typename PARAM1, typename PARAM2>
+ bool serialize (hb_serialize_context_t *c,
+ unsigned int offSize_,
+ const DATA *dataArray,
+ unsigned int dataArrayLen,
+ const hb_vector_t<unsigned int> &dataSizeArray,
+ const PARAM1 &param1,
+ const PARAM2 &param2)
+ {
+ TRACE_SERIALIZE (this);
+ /* serialize CFFIndex header */
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+ this->count = dataArrayLen;
+ this->offSize = offSize_;
+ if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (dataArrayLen + 1))))
+ return_trace (false);
+
+ /* serialize indices */
+ unsigned int offset = 1;
+ unsigned int i = 0;
+ for (; i < dataArrayLen; i++)
+ {
+ CFFIndex<COUNT>::set_offset_at (i, offset);
+ offset += dataSizeArray[i];
+ }
+ CFFIndex<COUNT>::set_offset_at (i, offset);
+
+ /* serialize data */
+ for (unsigned int i = 0; i < dataArrayLen; i++)
+ {
+ TYPE *dest = c->start_embed<TYPE> ();
+ if (unlikely (dest == nullptr ||
+ !dest->serialize (c, dataArray[i], param1, param2)))
+ return_trace (false);
+ }
+ return_trace (true);
+ }
+
+ /* in parallel to above */
+ template <typename DATA, typename PARAM>
+ static unsigned int calculate_serialized_size (unsigned int &offSize_ /* OUT */,
+ const DATA *dataArray,
+ unsigned int dataArrayLen,
+ hb_vector_t<unsigned int> &dataSizeArray, /* OUT */
+ const PARAM &param)
+ {
+ /* determine offset size */
+ unsigned int totalDataSize = 0;
+ for (unsigned int i = 0; i < dataArrayLen; i++)
+ {
+ unsigned int dataSize = TYPE::calculate_serialized_size (dataArray[i], param);
+ dataSizeArray[i] = dataSize;
+ totalDataSize += dataSize;
+ }
+ offSize_ = calcOffSize (totalDataSize);
+
+ return CFFIndex<COUNT>::calculate_serialized_size (offSize_, dataArrayLen, totalDataSize);
+ }
+};
+
+/* Top Dict, Font Dict, Private Dict */
+struct Dict : UnsizedByteStr
+{
+ template <typename DICTVAL, typename OP_SERIALIZER, typename PARAM>
+ bool serialize (hb_serialize_context_t *c,
+ const DICTVAL &dictval,
+ OP_SERIALIZER& opszr,
+ PARAM& param)
+ {
+ TRACE_SERIALIZE (this);
+ for (unsigned int i = 0; i < dictval.get_count (); i++)
+ if (unlikely (!opszr.serialize (c, dictval[i], param)))
+ return_trace (false);
+
+ return_trace (true);
+ }
+
+ /* in parallel to above */
+ template <typename DICTVAL, typename OP_SERIALIZER, typename PARAM>
+ static unsigned int calculate_serialized_size (const DICTVAL &dictval,
+ OP_SERIALIZER& opszr,
+ PARAM& param)
+ {
+ unsigned int size = 0;
+ for (unsigned int i = 0; i < dictval.get_count (); i++)
+ size += opszr.calculate_serialized_size (dictval[i], param);
+ return size;
+ }
+
+ template <typename DICTVAL, typename OP_SERIALIZER>
+ static unsigned int calculate_serialized_size (const DICTVAL &dictval,
+ OP_SERIALIZER& opszr)
+ {
+ unsigned int size = 0;
+ for (unsigned int i = 0; i < dictval.get_count (); i++)
+ size += opszr.calculate_serialized_size (dictval[i]);
+ return size;
+ }
+
+ template <typename INTTYPE, int minVal, int maxVal>
+ static bool serialize_int_op (hb_serialize_context_t *c, op_code_t op, int value, op_code_t intOp)
+ {
+ // XXX: not sure why but LLVM fails to compile the following 'unlikely' macro invocation
+ if (/*unlikely*/ (!serialize_int<INTTYPE, minVal, maxVal> (c, intOp, value)))
+ return false;
+
+ TRACE_SERIALIZE (this);
+ /* serialize the opcode */
+ HBUINT8 *p = c->allocate_size<HBUINT8> (OpCode_Size (op));
+ if (unlikely (p == nullptr)) return_trace (false);
+ if (Is_OpCode_ESC (op))
+ {
+ *p = OpCode_escape;
+ op = Unmake_OpCode_ESC (op);
+ p++;
+ }
+ *p = op;
+ return_trace (true);
+ }
+
+ static bool serialize_uint4_op (hb_serialize_context_t *c, op_code_t op, int value)
+ { return serialize_int_op<HBUINT32, 0, 0x7FFFFFFF> (c, op, value, OpCode_longintdict); }
+
+ static bool serialize_uint2_op (hb_serialize_context_t *c, op_code_t op, int value)
+ { return serialize_int_op<HBUINT16, 0, 0x7FFF> (c, op, value, OpCode_shortint); }
+
+ static bool serialize_offset4_op (hb_serialize_context_t *c, op_code_t op, int value)
+ { return serialize_uint4_op (c, op, value); }
+
+ static bool serialize_offset2_op (hb_serialize_context_t *c, op_code_t op, int value)
+ { return serialize_uint2_op (c, op, value); }
+};
+
+struct TopDict : Dict {};
+struct FontDict : Dict {};
+struct PrivateDict : Dict {};
+
+struct table_info_t
+{
+ void init () { offSize = offset = size = 0; }
+
+ unsigned int offset;
+ unsigned int size;
+ unsigned int offSize;
+};
+
+template <typename COUNT>
+struct FDArray : CFFIndexOf<COUNT, FontDict>
+{
+ /* used by CFF1 */
+ template <typename DICTVAL, typename OP_SERIALIZER>
+ bool serialize (hb_serialize_context_t *c,
+ unsigned int offSize_,
+ const hb_vector_t<DICTVAL> &fontDicts,
+ OP_SERIALIZER& opszr)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+ this->count = fontDicts.length;
+ this->offSize = offSize_;
+ if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (fontDicts.length + 1))))
+ return_trace (false);
+
+ /* serialize font dict offsets */
+ unsigned int offset = 1;
+ unsigned int fid = 0;
+ for (; fid < fontDicts.length; fid++)
+ {
+ CFFIndexOf<COUNT, FontDict>::set_offset_at (fid, offset);
+ offset += FontDict::calculate_serialized_size (fontDicts[fid], opszr);
+ }
+ CFFIndexOf<COUNT, FontDict>::set_offset_at (fid, offset);
+
+ /* serialize font dicts */
+ for (unsigned int i = 0; i < fontDicts.length; i++)
+ {
+ FontDict *dict = c->start_embed<FontDict> ();
+ if (unlikely (!dict->serialize (c, fontDicts[i], opszr, fontDicts[i])))
+ return_trace (false);
+ }
+ return_trace (true);
+ }
+
+ /* used by CFF2 */
+ template <typename DICTVAL, typename OP_SERIALIZER>
+ bool serialize (hb_serialize_context_t *c,
+ unsigned int offSize_,
+ const hb_vector_t<DICTVAL> &fontDicts,
+ unsigned int fdCount,
+ const hb_inc_bimap_t &fdmap,
+ OP_SERIALIZER& opszr,
+ const hb_vector_t<table_info_t> &privateInfos)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+ this->count = fdCount;
+ this->offSize = offSize_;
+ if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (fdCount + 1))))
+ return_trace (false);
+
+ /* serialize font dict offsets */
+ unsigned int offset = 1;
+ unsigned int fid = 0;
+ for (unsigned i = 0; i < fontDicts.length; i++)
+ if (fdmap.has (i))
+ {
+ if (unlikely (fid >= fdCount)) return_trace (false);
+ CFFIndexOf<COUNT, FontDict>::set_offset_at (fid++, offset);
+ offset += FontDict::calculate_serialized_size (fontDicts[i], opszr);
+ }
+ CFFIndexOf<COUNT, FontDict>::set_offset_at (fid, offset);
+
+ /* serialize font dicts */
+ for (unsigned int i = 0; i < fontDicts.length; i++)
+ if (fdmap.has (i))
+ {
+ FontDict *dict = c->start_embed<FontDict> ();
+ if (unlikely (!dict->serialize (c, fontDicts[i], opszr, privateInfos[fdmap[i]])))
+ return_trace (false);
+ }
+ return_trace (true);
+ }
+
+ /* in parallel to above */
+ template <typename OP_SERIALIZER, typename DICTVAL>
+ static unsigned int calculate_serialized_size (unsigned int &offSize_ /* OUT */,
+ const hb_vector_t<DICTVAL> &fontDicts,
+ unsigned int fdCount,
+ const hb_inc_bimap_t &fdmap,
+ OP_SERIALIZER& opszr)
+ {
+ unsigned int dictsSize = 0;
+ for (unsigned int i = 0; i < fontDicts.len; i++)
+ if (fdmap.has (i))
+ dictsSize += FontDict::calculate_serialized_size (fontDicts[i], opszr);
+
+ offSize_ = calcOffSize (dictsSize);
+ return CFFIndex<COUNT>::calculate_serialized_size (offSize_, fdCount, dictsSize);
+ }
+};
+
+/* FDSelect */
+struct FDSelect0 {
+ bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!(c->check_struct (this))))
+ return_trace (false);
+ for (unsigned int i = 0; i < c->get_num_glyphs (); i++)
+ if (unlikely (!fds[i].sanitize (c)))
+ return_trace (false);
+
+ return_trace (true);
+ }
+
+ hb_codepoint_t get_fd (hb_codepoint_t glyph) const
+ { return (hb_codepoint_t) fds[glyph]; }
+
+ unsigned int get_size (unsigned int num_glyphs) const
+ { return HBUINT8::static_size * num_glyphs; }
+
+ HBUINT8 fds[HB_VAR_ARRAY];
+
+ DEFINE_SIZE_MIN (0);
+};
+
+template <typename GID_TYPE, typename FD_TYPE>
+struct FDSelect3_4_Range
+{
+ bool sanitize (hb_sanitize_context_t *c, const void * /*nullptr*/, unsigned int fdcount) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (first < c->get_num_glyphs () && (fd < fdcount));
+ }
+
+ GID_TYPE first;
+ FD_TYPE fd;
+ public:
+ DEFINE_SIZE_STATIC (GID_TYPE::static_size + FD_TYPE::static_size);
+};
+
+template <typename GID_TYPE, typename FD_TYPE>
+struct FDSelect3_4
+{
+ unsigned int get_size () const
+ { return GID_TYPE::static_size * 2 + ranges.get_size (); }
+
+ bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this) || !ranges.sanitize (c, nullptr, fdcount) ||
+ (nRanges () == 0) || ranges[0].first != 0))
+ return_trace (false);
+
+ for (unsigned int i = 1; i < nRanges (); i++)
+ if (unlikely (ranges[i - 1].first >= ranges[i].first))
+ return_trace (false);
+
+ if (unlikely (!sentinel().sanitize (c) || (sentinel() != c->get_num_glyphs ())))
+ return_trace (false);
+
+ return_trace (true);
+ }
+
+ hb_codepoint_t get_fd (hb_codepoint_t glyph) const
+ {
+ unsigned int i;
+ for (i = 1; i < nRanges (); i++)
+ if (glyph < ranges[i].first)
+ break;
+
+ return (hb_codepoint_t) ranges[i - 1].fd;
+ }
+
+ GID_TYPE &nRanges () { return ranges.len; }
+ GID_TYPE nRanges () const { return ranges.len; }
+ GID_TYPE &sentinel () { return StructAfter<GID_TYPE> (ranges[nRanges () - 1]); }
+ const GID_TYPE &sentinel () const { return StructAfter<GID_TYPE> (ranges[nRanges () - 1]); }
+
+ ArrayOf<FDSelect3_4_Range<GID_TYPE, FD_TYPE>, GID_TYPE> ranges;
+ /* GID_TYPE sentinel */
+
+ DEFINE_SIZE_ARRAY (GID_TYPE::static_size, ranges);
+};
+
+typedef FDSelect3_4<HBUINT16, HBUINT8> FDSelect3;
+typedef FDSelect3_4_Range<HBUINT16, HBUINT8> FDSelect3_Range;
+
+struct FDSelect
+{
+ bool serialize (hb_serialize_context_t *c, const FDSelect &src, unsigned int num_glyphs)
+ {
+ TRACE_SERIALIZE (this);
+ unsigned int size = src.get_size (num_glyphs);
+ FDSelect *dest = c->allocate_size<FDSelect> (size);
+ if (unlikely (dest == nullptr)) return_trace (false);
+ memcpy (dest, &src, size);
+ return_trace (true);
+ }
+
+ unsigned int calculate_serialized_size (unsigned int num_glyphs) const
+ { return get_size (num_glyphs); }
+
+ unsigned int get_size (unsigned int num_glyphs) const
+ {
+ switch (format)
+ {
+ case 0: return format.static_size + u.format0.get_size (num_glyphs);
+ case 3: return format.static_size + u.format3.get_size ();
+ default:return 0;
+ }
+ }
+
+ hb_codepoint_t get_fd (hb_codepoint_t glyph) const
+ {
+ if (this == &Null (FDSelect)) return 0;
+
+ switch (format)
+ {
+ case 0: return u.format0.get_fd (glyph);
+ case 3: return u.format3.get_fd (glyph);
+ default:return 0;
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this)))
+ return_trace (false);
+
+ switch (format)
+ {
+ case 0: return_trace (u.format0.sanitize (c, fdcount));
+ case 3: return_trace (u.format3.sanitize (c, fdcount));
+ default:return_trace (false);
+ }
+ }
+
+ HBUINT8 format;
+ union {
+ FDSelect0 format0;
+ FDSelect3 format3;
+ } u;
+ public:
+ DEFINE_SIZE_MIN (1);
+};
+
+template <typename COUNT>
+struct Subrs : CFFIndex<COUNT>
+{
+ typedef COUNT count_type;
+ typedef CFFIndex<COUNT> SUPER;
+};
+
+} /* namespace CFF */
+
+#endif /* HB_OT_CFF_COMMON_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc
new file mode 100644
index 0000000000..55abd11d61
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc
@@ -0,0 +1,396 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_CFF
+
+#include "hb-ot-cff1-table.hh"
+#include "hb-cff1-interp-cs.hh"
+
+using namespace CFF;
+
+/* SID to code */
+static const uint8_t standard_encoding_to_code [] =
+{
+ 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
+ 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
+ 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 177,
+ 178, 179, 180, 182, 183, 184, 185, 186, 187, 188, 189, 191, 193, 194, 195, 196,
+ 197, 198, 199, 200, 202, 203, 205, 206, 207, 208, 225, 227, 232, 233, 234, 235,
+ 241, 245, 248, 249, 250, 251
+};
+
+/* SID to code */
+static const uint8_t expert_encoding_to_code [] =
+{
+ 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 45, 46,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 201, 0, 0, 0, 0, 189, 0, 0, 188, 0,
+ 0, 0, 0, 190, 202, 0, 0, 0, 0, 203, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 61, 62, 63, 65, 66, 67,
+ 68, 69, 73, 76, 77, 78, 79, 82, 83, 84, 86, 89, 90, 91, 93, 94,
+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
+ 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
+ 161, 162, 163, 166, 167, 168, 169, 170, 172, 175, 178, 179, 182, 183, 184, 191,
+ 192, 193, 194, 195, 196, 197, 200, 204, 205, 206, 207, 208, 209, 210, 211, 212,
+ 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228,
+ 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
+ 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255
+};
+
+/* glyph ID to SID */
+static const uint16_t expert_charset_to_sid [] =
+{
+ 0, 1, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 13, 14, 15, 99,
+ 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 27, 28, 249, 250, 251, 252,
+ 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 109, 110,
+ 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282,
+ 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
+ 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
+ 315, 316, 317, 318, 158, 155, 163, 319, 320, 321, 322, 323, 324, 325, 326, 150,
+ 164, 169, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340,
+ 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356,
+ 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
+ 373, 374, 375, 376, 377, 378
+};
+
+/* glyph ID to SID */
+static const uint16_t expert_subset_charset_to_sid [] =
+{
+ 0, 1, 231, 232, 235, 236, 237, 238, 13, 14, 15, 99, 239, 240, 241, 242,
+ 243, 244, 245, 246, 247, 248, 27, 28, 249, 250, 251, 253, 254, 255, 256, 257,
+ 258, 259, 260, 261, 262, 263, 264, 265, 266, 109, 110, 267, 268, 269, 270, 272,
+ 300, 301, 302, 305, 314, 315, 158, 155, 163, 320, 321, 322, 323, 324, 325, 326,
+ 150, 164, 169, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339,
+ 340, 341, 342, 343, 344, 345, 346
+};
+
+/* code to SID */
+static const uint8_t standard_encoding_to_sid [] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
+ 0, 111, 112, 113, 114, 0, 115, 116, 117, 118, 119, 120, 121, 122, 0, 123,
+ 0, 124, 125, 126, 127, 128, 129, 130, 131, 0, 132, 133, 0, 134, 135, 136,
+ 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 138, 0, 139, 0, 0, 0, 0, 140, 141, 142, 143, 0, 0, 0, 0,
+ 0, 144, 0, 0, 0, 145, 0, 0, 146, 147, 148, 149, 0, 0, 0, 0
+};
+
+hb_codepoint_t OT::cff1::lookup_standard_encoding_for_code (hb_codepoint_t sid)
+{
+ if (sid < ARRAY_LENGTH (standard_encoding_to_code))
+ return (hb_codepoint_t)standard_encoding_to_code[sid];
+ else
+ return 0;
+}
+
+hb_codepoint_t OT::cff1::lookup_expert_encoding_for_code (hb_codepoint_t sid)
+{
+ if (sid < ARRAY_LENGTH (expert_encoding_to_code))
+ return (hb_codepoint_t)expert_encoding_to_code[sid];
+ else
+ return 0;
+}
+
+hb_codepoint_t OT::cff1::lookup_expert_charset_for_sid (hb_codepoint_t glyph)
+{
+ if (glyph < ARRAY_LENGTH (expert_charset_to_sid))
+ return (hb_codepoint_t)expert_charset_to_sid[glyph];
+ else
+ return 0;
+}
+
+hb_codepoint_t OT::cff1::lookup_expert_subset_charset_for_sid (hb_codepoint_t glyph)
+{
+ if (glyph < ARRAY_LENGTH (expert_subset_charset_to_sid))
+ return (hb_codepoint_t)expert_subset_charset_to_sid[glyph];
+ else
+ return 0;
+}
+
+hb_codepoint_t OT::cff1::lookup_standard_encoding_for_sid (hb_codepoint_t code)
+{
+ if (code < ARRAY_LENGTH (standard_encoding_to_sid))
+ return (hb_codepoint_t)standard_encoding_to_sid[code];
+ else
+ return CFF_UNDEF_SID;
+}
+
+struct bounds_t
+{
+ void init ()
+ {
+ min.set_int (INT_MAX, INT_MAX);
+ max.set_int (INT_MIN, INT_MIN);
+ }
+
+ void update (const point_t &pt)
+ {
+ if (pt.x < min.x) min.x = pt.x;
+ if (pt.x > max.x) max.x = pt.x;
+ if (pt.y < min.y) min.y = pt.y;
+ if (pt.y > max.y) max.y = pt.y;
+ }
+
+ void merge (const bounds_t &b)
+ {
+ if (empty ())
+ *this = b;
+ else if (!b.empty ())
+ {
+ if (b.min.x < min.x) min.x = b.min.x;
+ if (b.max.x > max.x) max.x = b.max.x;
+ if (b.min.y < min.y) min.y = b.min.y;
+ if (b.max.y > max.y) max.y = b.max.y;
+ }
+ }
+
+ void offset (const point_t &delta)
+ {
+ if (!empty ())
+ {
+ min.move (delta);
+ max.move (delta);
+ }
+ }
+
+ bool empty () const { return (min.x >= max.x) || (min.y >= max.y); }
+
+ point_t min;
+ point_t max;
+};
+
+struct cff1_extents_param_t
+{
+ void init (const OT::cff1::accelerator_t *_cff)
+ {
+ path_open = false;
+ cff = _cff;
+ bounds.init ();
+ }
+
+ void start_path () { path_open = true; }
+ void end_path () { path_open = false; }
+ bool is_path_open () const { return path_open; }
+
+ bool path_open;
+ bounds_t bounds;
+
+ const OT::cff1::accelerator_t *cff;
+};
+
+struct cff1_path_procs_extents_t : path_procs_t<cff1_path_procs_extents_t, cff1_cs_interp_env_t, cff1_extents_param_t>
+{
+ static void moveto (cff1_cs_interp_env_t &env, cff1_extents_param_t& param, const point_t &pt)
+ {
+ param.end_path ();
+ env.moveto (pt);
+ }
+
+ static void line (cff1_cs_interp_env_t &env, cff1_extents_param_t& param, const point_t &pt1)
+ {
+ if (!param.is_path_open ())
+ {
+ param.start_path ();
+ param.bounds.update (env.get_pt ());
+ }
+ env.moveto (pt1);
+ param.bounds.update (env.get_pt ());
+ }
+
+ static void curve (cff1_cs_interp_env_t &env, cff1_extents_param_t& param, const point_t &pt1, const point_t &pt2, const point_t &pt3)
+ {
+ if (!param.is_path_open ())
+ {
+ param.start_path ();
+ param.bounds.update (env.get_pt ());
+ }
+ /* include control points */
+ param.bounds.update (pt1);
+ param.bounds.update (pt2);
+ env.moveto (pt3);
+ param.bounds.update (env.get_pt ());
+ }
+};
+
+static bool _get_bounds (const OT::cff1::accelerator_t *cff, hb_codepoint_t glyph, bounds_t &bounds, bool in_seac=false);
+
+struct cff1_cs_opset_extents_t : cff1_cs_opset_t<cff1_cs_opset_extents_t, cff1_extents_param_t, cff1_path_procs_extents_t>
+{
+ static void process_seac (cff1_cs_interp_env_t &env, cff1_extents_param_t& param)
+ {
+ unsigned int n = env.argStack.get_count ();
+ point_t delta;
+ delta.x = env.argStack[n-4];
+ delta.y = env.argStack[n-3];
+ hb_codepoint_t base = param.cff->std_code_to_glyph (env.argStack[n-2].to_int ());
+ hb_codepoint_t accent = param.cff->std_code_to_glyph (env.argStack[n-1].to_int ());
+
+ bounds_t base_bounds, accent_bounds;
+ if (likely (!env.in_seac && base && accent
+ && _get_bounds (param.cff, base, base_bounds, true)
+ && _get_bounds (param.cff, accent, accent_bounds, true)))
+ {
+ param.bounds.merge (base_bounds);
+ accent_bounds.offset (delta);
+ param.bounds.merge (accent_bounds);
+ }
+ else
+ env.set_error ();
+ }
+};
+
+bool _get_bounds (const OT::cff1::accelerator_t *cff, hb_codepoint_t glyph, bounds_t &bounds, bool in_seac)
+{
+ bounds.init ();
+ if (unlikely (!cff->is_valid () || (glyph >= cff->num_glyphs))) return false;
+
+ unsigned int fd = cff->fdSelect->get_fd (glyph);
+ cff1_cs_interpreter_t<cff1_cs_opset_extents_t, cff1_extents_param_t> interp;
+ const byte_str_t str = (*cff->charStrings)[glyph];
+ interp.env.init (str, *cff, fd);
+ interp.env.set_in_seac (in_seac);
+ cff1_extents_param_t param;
+ param.init (cff);
+ if (unlikely (!interp.interpret (param))) return false;
+ bounds = param.bounds;
+ return true;
+}
+
+bool OT::cff1::accelerator_t::get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const
+{
+#ifdef HB_NO_OT_FONT_CFF
+ /* XXX Remove check when this code moves to .hh file. */
+ return true;
+#endif
+
+ bounds_t bounds;
+
+ if (!_get_bounds (this, glyph, bounds))
+ return false;
+
+ if (bounds.min.x >= bounds.max.x)
+ {
+ extents->width = 0;
+ extents->x_bearing = 0;
+ }
+ else
+ {
+ extents->x_bearing = font->em_scalef_x (bounds.min.x.to_real ());
+ extents->width = font->em_scalef_x (bounds.max.x.to_real () - bounds.min.x.to_real ());
+ }
+ if (bounds.min.y >= bounds.max.y)
+ {
+ extents->height = 0;
+ extents->y_bearing = 0;
+ }
+ else
+ {
+ extents->y_bearing = font->em_scalef_y (bounds.max.y.to_real ());
+ extents->height = font->em_scalef_y (bounds.min.y.to_real () - bounds.max.y.to_real ());
+ }
+
+ return true;
+}
+
+struct get_seac_param_t
+{
+ void init (const OT::cff1::accelerator_t *_cff)
+ {
+ cff = _cff;
+ base = 0;
+ accent = 0;
+ }
+
+ bool has_seac () const { return base && accent; }
+
+ const OT::cff1::accelerator_t *cff;
+ hb_codepoint_t base;
+ hb_codepoint_t accent;
+};
+
+struct cff1_cs_opset_seac_t : cff1_cs_opset_t<cff1_cs_opset_seac_t, get_seac_param_t>
+{
+ static void process_seac (cff1_cs_interp_env_t &env, get_seac_param_t& param)
+ {
+ unsigned int n = env.argStack.get_count ();
+ hb_codepoint_t base_char = (hb_codepoint_t)env.argStack[n-2].to_int ();
+ hb_codepoint_t accent_char = (hb_codepoint_t)env.argStack[n-1].to_int ();
+
+ param.base = param.cff->std_code_to_glyph (base_char);
+ param.accent = param.cff->std_code_to_glyph (accent_char);
+ }
+};
+
+bool OT::cff1::accelerator_t::get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const
+{
+ if (unlikely (!is_valid () || (glyph >= num_glyphs))) return false;
+
+ unsigned int fd = fdSelect->get_fd (glyph);
+ cff1_cs_interpreter_t<cff1_cs_opset_seac_t, get_seac_param_t> interp;
+ const byte_str_t str = (*charStrings)[glyph];
+ interp.env.init (str, *this, fd);
+ get_seac_param_t param;
+ param.init (this);
+ if (unlikely (!interp.interpret (param))) return false;
+
+ if (param.has_seac ())
+ {
+ *base = param.base;
+ *accent = param.accent;
+ return true;
+ }
+ return false;
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh
new file mode 100644
index 0000000000..ad206511c1
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh
@@ -0,0 +1,1320 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_OT_CFF1_TABLE_HH
+#define HB_OT_CFF1_TABLE_HH
+
+#include "hb-ot-head-table.hh"
+#include "hb-ot-cff-common.hh"
+#include "hb-subset-cff1.hh"
+
+namespace CFF {
+
+/*
+ * CFF -- Compact Font Format (CFF)
+ * http://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5176.CFF.pdf
+ */
+#define HB_OT_TAG_cff1 HB_TAG('C','F','F',' ')
+
+#define CFF_UNDEF_SID CFF_UNDEF_CODE
+
+enum EncodingID { StandardEncoding = 0, ExpertEncoding = 1 };
+enum CharsetID { ISOAdobeCharset = 0, ExpertCharset = 1, ExpertSubsetCharset = 2 };
+
+typedef CFFIndex<HBUINT16> CFF1Index;
+template <typename Type> struct CFF1IndexOf : CFFIndexOf<HBUINT16, Type> {};
+
+typedef CFFIndex<HBUINT16> CFF1Index;
+typedef CFF1Index CFF1CharStrings;
+typedef FDArray<HBUINT16> CFF1FDArray;
+typedef Subrs<HBUINT16> CFF1Subrs;
+
+struct CFF1FDSelect : FDSelect {};
+
+/* Encoding */
+struct Encoding0 {
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (codes.sanitize (c));
+ }
+
+ hb_codepoint_t get_code (hb_codepoint_t glyph) const
+ {
+ assert (glyph > 0);
+ glyph--;
+ if (glyph < nCodes ())
+ {
+ return (hb_codepoint_t)codes[glyph];
+ }
+ else
+ return CFF_UNDEF_CODE;
+ }
+
+ HBUINT8 &nCodes () { return codes.len; }
+ HBUINT8 nCodes () const { return codes.len; }
+
+ ArrayOf<HBUINT8, HBUINT8> codes;
+
+ DEFINE_SIZE_ARRAY_SIZED (1, codes);
+};
+
+struct Encoding1_Range {
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ HBUINT8 first;
+ HBUINT8 nLeft;
+
+ DEFINE_SIZE_STATIC (2);
+};
+
+struct Encoding1 {
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (ranges.sanitize (c));
+ }
+
+ hb_codepoint_t get_code (hb_codepoint_t glyph) const
+ {
+ assert (glyph > 0);
+ glyph--;
+ for (unsigned int i = 0; i < nRanges (); i++)
+ {
+ if (glyph <= ranges[i].nLeft)
+ {
+ hb_codepoint_t code = (hb_codepoint_t) ranges[i].first + glyph;
+ return (likely (code < 0x100) ? code: CFF_UNDEF_CODE);
+ }
+ glyph -= (ranges[i].nLeft + 1);
+ }
+ return CFF_UNDEF_CODE;
+ }
+
+ HBUINT8 &nRanges () { return ranges.len; }
+ HBUINT8 nRanges () const { return ranges.len; }
+
+ ArrayOf<Encoding1_Range, HBUINT8> ranges;
+
+ DEFINE_SIZE_ARRAY_SIZED (1, ranges);
+};
+
+struct SuppEncoding {
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ HBUINT8 code;
+ HBUINT16 glyph;
+
+ DEFINE_SIZE_STATIC (3);
+};
+
+struct CFF1SuppEncData {
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (supps.sanitize (c));
+ }
+
+ void get_codes (hb_codepoint_t sid, hb_vector_t<hb_codepoint_t> &codes) const
+ {
+ for (unsigned int i = 0; i < nSups (); i++)
+ if (sid == supps[i].glyph)
+ codes.push (supps[i].code);
+ }
+
+ HBUINT8 &nSups () { return supps.len; }
+ HBUINT8 nSups () const { return supps.len; }
+
+ ArrayOf<SuppEncoding, HBUINT8> supps;
+
+ DEFINE_SIZE_ARRAY_SIZED (1, supps);
+};
+
+struct Encoding
+{
+ /* serialize a fullset Encoding */
+ bool serialize (hb_serialize_context_t *c, const Encoding &src)
+ {
+ TRACE_SERIALIZE (this);
+ unsigned int size = src.get_size ();
+ Encoding *dest = c->allocate_size<Encoding> (size);
+ if (unlikely (dest == nullptr)) return_trace (false);
+ memcpy (dest, &src, size);
+ return_trace (true);
+ }
+
+ /* serialize a subset Encoding */
+ bool serialize (hb_serialize_context_t *c,
+ uint8_t format,
+ unsigned int enc_count,
+ const hb_vector_t<code_pair_t>& code_ranges,
+ const hb_vector_t<code_pair_t>& supp_codes)
+ {
+ TRACE_SERIALIZE (this);
+ Encoding *dest = c->extend_min (*this);
+ if (unlikely (dest == nullptr)) return_trace (false);
+ dest->format = format | ((supp_codes.length > 0) ? 0x80 : 0);
+ switch (format) {
+ case 0:
+ {
+ Encoding0 *fmt0 = c->allocate_size<Encoding0> (Encoding0::min_size + HBUINT8::static_size * enc_count);
+ if (unlikely (fmt0 == nullptr)) return_trace (false);
+ fmt0->nCodes () = enc_count;
+ unsigned int glyph = 0;
+ for (unsigned int i = 0; i < code_ranges.length; i++)
+ {
+ hb_codepoint_t code = code_ranges[i].code;
+ for (int left = (int)code_ranges[i].glyph; left >= 0; left--)
+ fmt0->codes[glyph++] = code++;
+ if (unlikely (!((glyph <= 0x100) && (code <= 0x100))))
+ return_trace (false);
+ }
+ }
+ break;
+
+ case 1:
+ {
+ Encoding1 *fmt1 = c->allocate_size<Encoding1> (Encoding1::min_size + Encoding1_Range::static_size * code_ranges.length);
+ if (unlikely (fmt1 == nullptr)) return_trace (false);
+ fmt1->nRanges () = code_ranges.length;
+ for (unsigned int i = 0; i < code_ranges.length; i++)
+ {
+ if (unlikely (!((code_ranges[i].code <= 0xFF) && (code_ranges[i].glyph <= 0xFF))))
+ return_trace (false);
+ fmt1->ranges[i].first = code_ranges[i].code;
+ fmt1->ranges[i].nLeft = code_ranges[i].glyph;
+ }
+ }
+ break;
+
+ }
+
+ if (supp_codes.length)
+ {
+ CFF1SuppEncData *suppData = c->allocate_size<CFF1SuppEncData> (CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_codes.length);
+ if (unlikely (suppData == nullptr)) return_trace (false);
+ suppData->nSups () = supp_codes.length;
+ for (unsigned int i = 0; i < supp_codes.length; i++)
+ {
+ suppData->supps[i].code = supp_codes[i].code;
+ suppData->supps[i].glyph = supp_codes[i].glyph; /* actually SID */
+ }
+ }
+
+ return_trace (true);
+ }
+
+ /* parallel to above: calculate the size of a subset Encoding */
+ static unsigned int calculate_serialized_size (uint8_t format,
+ unsigned int enc_count,
+ unsigned int supp_count)
+ {
+ unsigned int size = min_size;
+ switch (format)
+ {
+ case 0: size += Encoding0::min_size + HBUINT8::static_size * enc_count; break;
+ case 1: size += Encoding1::min_size + Encoding1_Range::static_size * enc_count; break;
+ default:return 0;
+ }
+ if (supp_count > 0)
+ size += CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_count;
+ return size;
+ }
+
+ unsigned int get_size () const
+ {
+ unsigned int size = min_size;
+ switch (table_format ())
+ {
+ case 0: size += u.format0.get_size (); break;
+ case 1: size += u.format1.get_size (); break;
+ }
+ if (has_supplement ())
+ size += suppEncData ().get_size ();
+ return size;
+ }
+
+ hb_codepoint_t get_code (hb_codepoint_t glyph) const
+ {
+ switch (table_format ())
+ {
+ case 0: return u.format0.get_code (glyph);
+ case 1: return u.format1.get_code (glyph);
+ default:return 0;
+ }
+ }
+
+ uint8_t table_format () const { return format & 0x7F; }
+ bool has_supplement () const { return format & 0x80; }
+
+ void get_supplement_codes (hb_codepoint_t sid, hb_vector_t<hb_codepoint_t> &codes) const
+ {
+ codes.resize (0);
+ if (has_supplement ())
+ suppEncData().get_codes (sid, codes);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this)))
+ return_trace (false);
+
+ switch (table_format ())
+ {
+ case 0: if (unlikely (!u.format0.sanitize (c))) { return_trace (false); } break;
+ case 1: if (unlikely (!u.format1.sanitize (c))) { return_trace (false); } break;
+ default:return_trace (false);
+ }
+ return_trace (likely (!has_supplement () || suppEncData ().sanitize (c)));
+ }
+
+ protected:
+ const CFF1SuppEncData &suppEncData () const
+ {
+ switch (table_format ())
+ {
+ case 0: return StructAfter<CFF1SuppEncData> (u.format0.codes[u.format0.nCodes ()-1]);
+ case 1: return StructAfter<CFF1SuppEncData> (u.format1.ranges[u.format1.nRanges ()-1]);
+ default:return Null (CFF1SuppEncData);
+ }
+ }
+
+ public:
+ HBUINT8 format;
+ union {
+ Encoding0 format0;
+ Encoding1 format1;
+ } u;
+ /* CFF1SuppEncData suppEncData; */
+
+ DEFINE_SIZE_MIN (1);
+};
+
+/* Charset */
+struct Charset0 {
+ bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && sids[num_glyphs - 1].sanitize (c));
+ }
+
+ hb_codepoint_t get_sid (hb_codepoint_t glyph) const
+ {
+ if (glyph == 0)
+ return 0;
+ else
+ return sids[glyph - 1];
+ }
+
+ hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const
+ {
+ if (sid == 0)
+ return 0;
+
+ for (unsigned int glyph = 1; glyph < num_glyphs; glyph++)
+ {
+ if (sids[glyph-1] == sid)
+ return glyph;
+ }
+ return 0;
+ }
+
+ unsigned int get_size (unsigned int num_glyphs) const
+ {
+ assert (num_glyphs > 0);
+ return HBUINT16::static_size * (num_glyphs - 1);
+ }
+
+ HBUINT16 sids[HB_VAR_ARRAY];
+
+ DEFINE_SIZE_ARRAY(0, sids);
+};
+
+template <typename TYPE>
+struct Charset_Range {
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ HBUINT16 first;
+ TYPE nLeft;
+
+ DEFINE_SIZE_STATIC (HBUINT16::static_size + TYPE::static_size);
+};
+
+template <typename TYPE>
+struct Charset1_2 {
+ bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this)))
+ return_trace (false);
+ num_glyphs--;
+ for (unsigned int i = 0; num_glyphs > 0; i++)
+ {
+ if (unlikely (!ranges[i].sanitize (c) || (num_glyphs < ranges[i].nLeft + 1)))
+ return_trace (false);
+ num_glyphs -= (ranges[i].nLeft + 1);
+ }
+ return_trace (true);
+ }
+
+ hb_codepoint_t get_sid (hb_codepoint_t glyph) const
+ {
+ if (glyph == 0) return 0;
+ glyph--;
+ for (unsigned int i = 0;; i++)
+ {
+ if (glyph <= ranges[i].nLeft)
+ return (hb_codepoint_t)ranges[i].first + glyph;
+ glyph -= (ranges[i].nLeft + 1);
+ }
+
+ return 0;
+ }
+
+ hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const
+ {
+ if (sid == 0) return 0;
+ hb_codepoint_t glyph = 1;
+ for (unsigned int i = 0;; i++)
+ {
+ if (glyph >= num_glyphs)
+ return 0;
+ if ((ranges[i].first <= sid) && (sid <= ranges[i].first + ranges[i].nLeft))
+ return glyph + (sid - ranges[i].first);
+ glyph += (ranges[i].nLeft + 1);
+ }
+
+ return 0;
+ }
+
+ unsigned int get_size (unsigned int num_glyphs) const
+ {
+ unsigned int size = HBUINT8::static_size;
+ int glyph = (int)num_glyphs;
+
+ assert (glyph > 0);
+ glyph--;
+ for (unsigned int i = 0; glyph > 0; i++)
+ {
+ glyph -= (ranges[i].nLeft + 1);
+ size += Charset_Range<TYPE>::static_size;
+ }
+
+ return size;
+ }
+
+ Charset_Range<TYPE> ranges[HB_VAR_ARRAY];
+
+ DEFINE_SIZE_ARRAY (0, ranges);
+};
+
+typedef Charset1_2<HBUINT8> Charset1;
+typedef Charset1_2<HBUINT16> Charset2;
+typedef Charset_Range<HBUINT8> Charset1_Range;
+typedef Charset_Range<HBUINT16> Charset2_Range;
+
+struct Charset
+{
+ /* serialize a fullset Charset */
+ bool serialize (hb_serialize_context_t *c, const Charset &src, unsigned int num_glyphs)
+ {
+ TRACE_SERIALIZE (this);
+ unsigned int size = src.get_size (num_glyphs);
+ Charset *dest = c->allocate_size<Charset> (size);
+ if (unlikely (dest == nullptr)) return_trace (false);
+ memcpy (dest, &src, size);
+ return_trace (true);
+ }
+
+ /* serialize a subset Charset */
+ bool serialize (hb_serialize_context_t *c,
+ uint8_t format,
+ unsigned int num_glyphs,
+ const hb_vector_t<code_pair_t>& sid_ranges)
+ {
+ TRACE_SERIALIZE (this);
+ Charset *dest = c->extend_min (*this);
+ if (unlikely (dest == nullptr)) return_trace (false);
+ dest->format = format;
+ switch (format)
+ {
+ case 0:
+ {
+ Charset0 *fmt0 = c->allocate_size<Charset0> (Charset0::min_size + HBUINT16::static_size * (num_glyphs - 1));
+ if (unlikely (fmt0 == nullptr)) return_trace (false);
+ unsigned int glyph = 0;
+ for (unsigned int i = 0; i < sid_ranges.length; i++)
+ {
+ hb_codepoint_t sid = sid_ranges[i].code;
+ for (int left = (int)sid_ranges[i].glyph; left >= 0; left--)
+ fmt0->sids[glyph++] = sid++;
+ }
+ }
+ break;
+
+ case 1:
+ {
+ Charset1 *fmt1 = c->allocate_size<Charset1> (Charset1::min_size + Charset1_Range::static_size * sid_ranges.length);
+ if (unlikely (fmt1 == nullptr)) return_trace (false);
+ for (unsigned int i = 0; i < sid_ranges.length; i++)
+ {
+ if (unlikely (!(sid_ranges[i].glyph <= 0xFF)))
+ return_trace (false);
+ fmt1->ranges[i].first = sid_ranges[i].code;
+ fmt1->ranges[i].nLeft = sid_ranges[i].glyph;
+ }
+ }
+ break;
+
+ case 2:
+ {
+ Charset2 *fmt2 = c->allocate_size<Charset2> (Charset2::min_size + Charset2_Range::static_size * sid_ranges.length);
+ if (unlikely (fmt2 == nullptr)) return_trace (false);
+ for (unsigned int i = 0; i < sid_ranges.length; i++)
+ {
+ if (unlikely (!(sid_ranges[i].glyph <= 0xFFFF)))
+ return_trace (false);
+ fmt2->ranges[i].first = sid_ranges[i].code;
+ fmt2->ranges[i].nLeft = sid_ranges[i].glyph;
+ }
+ }
+ break;
+
+ }
+ return_trace (true);
+ }
+
+ /* parallel to above: calculate the size of a subset Charset */
+ static unsigned int calculate_serialized_size (uint8_t format,
+ unsigned int count)
+ {
+ switch (format)
+ {
+ case 0: return min_size + Charset0::min_size + HBUINT16::static_size * (count - 1);
+ case 1: return min_size + Charset1::min_size + Charset1_Range::static_size * count;
+ case 2: return min_size + Charset2::min_size + Charset2_Range::static_size * count;
+ default:return 0;
+ }
+ }
+
+ unsigned int get_size (unsigned int num_glyphs) const
+ {
+ switch (format)
+ {
+ case 0: return min_size + u.format0.get_size (num_glyphs);
+ case 1: return min_size + u.format1.get_size (num_glyphs);
+ case 2: return min_size + u.format2.get_size (num_glyphs);
+ default:return 0;
+ }
+ }
+
+ hb_codepoint_t get_sid (hb_codepoint_t glyph) const
+ {
+ switch (format)
+ {
+ case 0: return u.format0.get_sid (glyph);
+ case 1: return u.format1.get_sid (glyph);
+ case 2: return u.format2.get_sid (glyph);
+ default:return 0;
+ }
+ }
+
+ hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const
+ {
+ switch (format)
+ {
+ case 0: return u.format0.get_glyph (sid, num_glyphs);
+ case 1: return u.format1.get_glyph (sid, num_glyphs);
+ case 2: return u.format2.get_glyph (sid, num_glyphs);
+ default:return 0;
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this)))
+ return_trace (false);
+
+ switch (format)
+ {
+ case 0: return_trace (u.format0.sanitize (c, c->get_num_glyphs ()));
+ case 1: return_trace (u.format1.sanitize (c, c->get_num_glyphs ()));
+ case 2: return_trace (u.format2.sanitize (c, c->get_num_glyphs ()));
+ default:return_trace (false);
+ }
+ }
+
+ HBUINT8 format;
+ union {
+ Charset0 format0;
+ Charset1 format1;
+ Charset2 format2;
+ } u;
+
+ DEFINE_SIZE_MIN (1);
+};
+
+struct CFF1StringIndex : CFF1Index
+{
+ bool serialize (hb_serialize_context_t *c, const CFF1StringIndex &strings,
+ unsigned int offSize_, const hb_inc_bimap_t &sidmap)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely ((strings.count == 0) || (sidmap.get_population () == 0)))
+ {
+ if (unlikely (!c->extend_min (this->count)))
+ return_trace (false);
+ count = 0;
+ return_trace (true);
+ }
+
+ byte_str_array_t bytesArray;
+ bytesArray.init ();
+ if (!bytesArray.resize (sidmap.get_population ()))
+ return_trace (false);
+ for (unsigned int i = 0; i < strings.count; i++)
+ {
+ hb_codepoint_t j = sidmap[i];
+ if (j != CFF_UNDEF_CODE)
+ bytesArray[j] = strings[i];
+ }
+
+ bool result = CFF1Index::serialize (c, offSize_, bytesArray);
+ bytesArray.fini ();
+ return_trace (result);
+ }
+
+ /* in parallel to above */
+ unsigned int calculate_serialized_size (unsigned int &offSize_ /*OUT*/, const hb_inc_bimap_t &sidmap) const
+ {
+ offSize_ = 0;
+ if ((count == 0) || (sidmap.get_population () == 0))
+ return count.static_size;
+
+ unsigned int dataSize = 0;
+ for (unsigned int i = 0; i < count; i++)
+ if (sidmap[i] != CFF_UNDEF_CODE)
+ dataSize += length_at (i);
+
+ offSize_ = calcOffSize(dataSize);
+ return CFF1Index::calculate_serialized_size (offSize_, sidmap.get_population (), dataSize);
+ }
+};
+
+struct cff1_top_dict_interp_env_t : num_interp_env_t
+{
+ cff1_top_dict_interp_env_t ()
+ : num_interp_env_t(), prev_offset(0), last_offset(0) {}
+
+ unsigned int prev_offset;
+ unsigned int last_offset;
+};
+
+struct name_dict_values_t
+{
+ enum name_dict_val_index_t
+ {
+ version,
+ notice,
+ copyright,
+ fullName,
+ familyName,
+ weight,
+ postscript,
+ fontName,
+ baseFontName,
+ registry,
+ ordering,
+
+ ValCount
+ };
+
+ void init ()
+ {
+ for (unsigned int i = 0; i < ValCount; i++)
+ values[i] = CFF_UNDEF_SID;
+ }
+
+ unsigned int& operator[] (unsigned int i)
+ { assert (i < ValCount); return values[i]; }
+
+ unsigned int operator[] (unsigned int i) const
+ { assert (i < ValCount); return values[i]; }
+
+ static enum name_dict_val_index_t name_op_to_index (op_code_t op)
+ {
+ switch (op) {
+ default: // can't happen - just make some compiler happy
+ case OpCode_version:
+ return version;
+ case OpCode_Notice:
+ return notice;
+ case OpCode_Copyright:
+ return copyright;
+ case OpCode_FullName:
+ return fullName;
+ case OpCode_FamilyName:
+ return familyName;
+ case OpCode_Weight:
+ return weight;
+ case OpCode_PostScript:
+ return postscript;
+ case OpCode_FontName:
+ return fontName;
+ case OpCode_BaseFontName:
+ return baseFontName;
+ }
+ }
+
+ unsigned int values[ValCount];
+};
+
+struct cff1_top_dict_val_t : op_str_t
+{
+ unsigned int last_arg_offset;
+};
+
+struct cff1_top_dict_values_t : top_dict_values_t<cff1_top_dict_val_t>
+{
+ void init ()
+ {
+ top_dict_values_t<cff1_top_dict_val_t>::init ();
+
+ nameSIDs.init ();
+ ros_supplement = 0;
+ cidCount = 8720;
+ EncodingOffset = 0;
+ CharsetOffset = 0;
+ FDSelectOffset = 0;
+ privateDictInfo.init ();
+ }
+ void fini () { top_dict_values_t<cff1_top_dict_val_t>::fini (); }
+
+ bool is_CID () const
+ { return nameSIDs[name_dict_values_t::registry] != CFF_UNDEF_SID; }
+
+ name_dict_values_t nameSIDs;
+ unsigned int ros_supplement_offset;
+ unsigned int ros_supplement;
+ unsigned int cidCount;
+
+ unsigned int EncodingOffset;
+ unsigned int CharsetOffset;
+ unsigned int FDSelectOffset;
+ table_info_t privateDictInfo;
+};
+
+struct cff1_top_dict_opset_t : top_dict_opset_t<cff1_top_dict_val_t>
+{
+ static void process_op (op_code_t op, cff1_top_dict_interp_env_t& env, cff1_top_dict_values_t& dictval)
+ {
+ cff1_top_dict_val_t val;
+ val.last_arg_offset = (env.last_offset-1) - dictval.opStart; /* offset to the last argument */
+
+ switch (op) {
+ case OpCode_version:
+ case OpCode_Notice:
+ case OpCode_Copyright:
+ case OpCode_FullName:
+ case OpCode_FamilyName:
+ case OpCode_Weight:
+ case OpCode_PostScript:
+ case OpCode_BaseFontName:
+ dictval.nameSIDs[name_dict_values_t::name_op_to_index (op)] = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+ case OpCode_isFixedPitch:
+ case OpCode_ItalicAngle:
+ case OpCode_UnderlinePosition:
+ case OpCode_UnderlineThickness:
+ case OpCode_PaintType:
+ case OpCode_CharstringType:
+ case OpCode_UniqueID:
+ case OpCode_StrokeWidth:
+ case OpCode_SyntheticBase:
+ case OpCode_CIDFontVersion:
+ case OpCode_CIDFontRevision:
+ case OpCode_CIDFontType:
+ case OpCode_UIDBase:
+ case OpCode_FontBBox:
+ case OpCode_XUID:
+ case OpCode_BaseFontBlend:
+ env.clear_args ();
+ break;
+
+ case OpCode_CIDCount:
+ dictval.cidCount = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+
+ case OpCode_ROS:
+ dictval.ros_supplement = env.argStack.pop_uint ();
+ dictval.nameSIDs[name_dict_values_t::ordering] = env.argStack.pop_uint ();
+ dictval.nameSIDs[name_dict_values_t::registry] = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+
+ case OpCode_Encoding:
+ dictval.EncodingOffset = env.argStack.pop_uint ();
+ env.clear_args ();
+ if (unlikely (dictval.EncodingOffset == 0)) return;
+ break;
+
+ case OpCode_charset:
+ dictval.CharsetOffset = env.argStack.pop_uint ();
+ env.clear_args ();
+ if (unlikely (dictval.CharsetOffset == 0)) return;
+ break;
+
+ case OpCode_FDSelect:
+ dictval.FDSelectOffset = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+
+ case OpCode_Private:
+ dictval.privateDictInfo.offset = env.argStack.pop_uint ();
+ dictval.privateDictInfo.size = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+
+ default:
+ env.last_offset = env.str_ref.offset;
+ top_dict_opset_t<cff1_top_dict_val_t>::process_op (op, env, dictval);
+ /* Record this operand below if stack is empty, otherwise done */
+ if (!env.argStack.is_empty ()) return;
+ break;
+ }
+
+ if (unlikely (env.in_error ())) return;
+
+ dictval.add_op (op, env.str_ref, val);
+ }
+};
+
+struct cff1_font_dict_values_t : dict_values_t<op_str_t>
+{
+ void init ()
+ {
+ dict_values_t<op_str_t>::init ();
+ privateDictInfo.init ();
+ fontName = CFF_UNDEF_SID;
+ }
+ void fini () { dict_values_t<op_str_t>::fini (); }
+
+ table_info_t privateDictInfo;
+ unsigned int fontName;
+};
+
+struct cff1_font_dict_opset_t : dict_opset_t
+{
+ static void process_op (op_code_t op, num_interp_env_t& env, cff1_font_dict_values_t& dictval)
+ {
+ switch (op) {
+ case OpCode_FontName:
+ dictval.fontName = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+ case OpCode_FontMatrix:
+ case OpCode_PaintType:
+ env.clear_args ();
+ break;
+ case OpCode_Private:
+ dictval.privateDictInfo.offset = env.argStack.pop_uint ();
+ dictval.privateDictInfo.size = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+
+ default:
+ dict_opset_t::process_op (op, env);
+ if (!env.argStack.is_empty ()) return;
+ break;
+ }
+
+ if (unlikely (env.in_error ())) return;
+
+ dictval.add_op (op, env.str_ref);
+ }
+};
+
+template <typename VAL>
+struct cff1_private_dict_values_base_t : dict_values_t<VAL>
+{
+ void init ()
+ {
+ dict_values_t<VAL>::init ();
+ subrsOffset = 0;
+ localSubrs = &Null(CFF1Subrs);
+ }
+ void fini () { dict_values_t<VAL>::fini (); }
+
+ unsigned int calculate_serialized_size () const
+ {
+ unsigned int size = 0;
+ for (unsigned int i = 0; i < dict_values_t<VAL>::get_count; i++)
+ if (dict_values_t<VAL>::get_value (i).op == OpCode_Subrs)
+ size += OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Subrs);
+ else
+ size += dict_values_t<VAL>::get_value (i).str.length;
+ return size;
+ }
+
+ unsigned int subrsOffset;
+ const CFF1Subrs *localSubrs;
+};
+
+typedef cff1_private_dict_values_base_t<op_str_t> cff1_private_dict_values_subset_t;
+typedef cff1_private_dict_values_base_t<num_dict_val_t> cff1_private_dict_values_t;
+
+struct cff1_private_dict_opset_t : dict_opset_t
+{
+ static void process_op (op_code_t op, num_interp_env_t& env, cff1_private_dict_values_t& dictval)
+ {
+ num_dict_val_t val;
+ val.init ();
+
+ switch (op) {
+ case OpCode_BlueValues:
+ case OpCode_OtherBlues:
+ case OpCode_FamilyBlues:
+ case OpCode_FamilyOtherBlues:
+ case OpCode_StemSnapH:
+ case OpCode_StemSnapV:
+ env.clear_args ();
+ break;
+ case OpCode_StdHW:
+ case OpCode_StdVW:
+ case OpCode_BlueScale:
+ case OpCode_BlueShift:
+ case OpCode_BlueFuzz:
+ case OpCode_ForceBold:
+ case OpCode_LanguageGroup:
+ case OpCode_ExpansionFactor:
+ case OpCode_initialRandomSeed:
+ case OpCode_defaultWidthX:
+ case OpCode_nominalWidthX:
+ val.single_val = env.argStack.pop_num ();
+ env.clear_args ();
+ break;
+ case OpCode_Subrs:
+ dictval.subrsOffset = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+
+ default:
+ dict_opset_t::process_op (op, env);
+ if (!env.argStack.is_empty ()) return;
+ break;
+ }
+
+ if (unlikely (env.in_error ())) return;
+
+ dictval.add_op (op, env.str_ref, val);
+ }
+};
+
+struct cff1_private_dict_opset_subset : dict_opset_t
+{
+ static void process_op (op_code_t op, num_interp_env_t& env, cff1_private_dict_values_subset_t& dictval)
+ {
+ switch (op) {
+ case OpCode_BlueValues:
+ case OpCode_OtherBlues:
+ case OpCode_FamilyBlues:
+ case OpCode_FamilyOtherBlues:
+ case OpCode_StemSnapH:
+ case OpCode_StemSnapV:
+ case OpCode_StdHW:
+ case OpCode_StdVW:
+ case OpCode_BlueScale:
+ case OpCode_BlueShift:
+ case OpCode_BlueFuzz:
+ case OpCode_ForceBold:
+ case OpCode_LanguageGroup:
+ case OpCode_ExpansionFactor:
+ case OpCode_initialRandomSeed:
+ case OpCode_defaultWidthX:
+ case OpCode_nominalWidthX:
+ env.clear_args ();
+ break;
+
+ case OpCode_Subrs:
+ dictval.subrsOffset = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+
+ default:
+ dict_opset_t::process_op (op, env);
+ if (!env.argStack.is_empty ()) return;
+ break;
+ }
+
+ if (unlikely (env.in_error ())) return;
+
+ dictval.add_op (op, env.str_ref);
+ }
+};
+
+typedef dict_interpreter_t<cff1_top_dict_opset_t, cff1_top_dict_values_t, cff1_top_dict_interp_env_t> cff1_top_dict_interpreter_t;
+typedef dict_interpreter_t<cff1_font_dict_opset_t, cff1_font_dict_values_t> cff1_font_dict_interpreter_t;
+
+typedef CFF1Index CFF1NameIndex;
+typedef CFF1IndexOf<TopDict> CFF1TopDictIndex;
+
+} /* namespace CFF */
+
+namespace OT {
+
+using namespace CFF;
+
+struct cff1
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_cff1;
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ likely (version.major == 1));
+ }
+
+ template <typename PRIVOPSET, typename PRIVDICTVAL>
+ struct accelerator_templ_t
+ {
+ void init (hb_face_t *face)
+ {
+ topDict.init ();
+ fontDicts.init ();
+ privateDicts.init ();
+
+ this->blob = sc.reference_table<cff1> (face);
+
+ /* setup for run-time santization */
+ sc.init (this->blob);
+ sc.start_processing ();
+
+ const OT::cff1 *cff = this->blob->template as<OT::cff1> ();
+
+ if (cff == &Null(OT::cff1))
+ { fini (); return; }
+
+ nameIndex = &cff->nameIndex (cff);
+ if ((nameIndex == &Null (CFF1NameIndex)) || !nameIndex->sanitize (&sc))
+ { fini (); return; }
+
+ topDictIndex = &StructAtOffset<CFF1TopDictIndex> (nameIndex, nameIndex->get_size ());
+ if ((topDictIndex == &Null (CFF1TopDictIndex)) || !topDictIndex->sanitize (&sc) || (topDictIndex->count == 0))
+ { fini (); return; }
+
+ { /* parse top dict */
+ const byte_str_t topDictStr = (*topDictIndex)[0];
+ if (unlikely (!topDictStr.sanitize (&sc))) { fini (); return; }
+ cff1_top_dict_interpreter_t top_interp;
+ top_interp.env.init (topDictStr);
+ topDict.init ();
+ if (unlikely (!top_interp.interpret (topDict))) { fini (); return; }
+ }
+
+ if (is_predef_charset ())
+ charset = &Null(Charset);
+ else
+ {
+ charset = &StructAtOffsetOrNull<Charset> (cff, topDict.CharsetOffset);
+ if (unlikely ((charset == &Null (Charset)) || !charset->sanitize (&sc))) { fini (); return; }
+ }
+
+ fdCount = 1;
+ if (is_CID ())
+ {
+ fdArray = &StructAtOffsetOrNull<CFF1FDArray> (cff, topDict.FDArrayOffset);
+ fdSelect = &StructAtOffsetOrNull<CFF1FDSelect> (cff, topDict.FDSelectOffset);
+ if (unlikely ((fdArray == &Null(CFF1FDArray)) || !fdArray->sanitize (&sc) ||
+ (fdSelect == &Null(CFF1FDSelect)) || !fdSelect->sanitize (&sc, fdArray->count)))
+ { fini (); return; }
+
+ fdCount = fdArray->count;
+ }
+ else
+ {
+ fdArray = &Null(CFF1FDArray);
+ fdSelect = &Null(CFF1FDSelect);
+ }
+
+ stringIndex = &StructAtOffset<CFF1StringIndex> (topDictIndex, topDictIndex->get_size ());
+ if ((stringIndex == &Null (CFF1StringIndex)) || !stringIndex->sanitize (&sc))
+ { fini (); return; }
+
+ globalSubrs = &StructAtOffset<CFF1Subrs> (stringIndex, stringIndex->get_size ());
+ if ((globalSubrs != &Null (CFF1Subrs)) && !globalSubrs->sanitize (&sc))
+ { fini (); return; }
+
+ charStrings = &StructAtOffsetOrNull<CFF1CharStrings> (cff, topDict.charStringsOffset);
+
+ if ((charStrings == &Null(CFF1CharStrings)) || unlikely (!charStrings->sanitize (&sc)))
+ { fini (); return; }
+
+ num_glyphs = charStrings->count;
+ if (num_glyphs != sc.get_num_glyphs ())
+ { fini (); return; }
+
+ privateDicts.resize (fdCount);
+ for (unsigned int i = 0; i < fdCount; i++)
+ privateDicts[i].init ();
+
+ // parse CID font dicts and gather private dicts
+ if (is_CID ())
+ {
+ for (unsigned int i = 0; i < fdCount; i++)
+ {
+ byte_str_t fontDictStr = (*fdArray)[i];
+ if (unlikely (!fontDictStr.sanitize (&sc))) { fini (); return; }
+ cff1_font_dict_values_t *font;
+ cff1_font_dict_interpreter_t font_interp;
+ font_interp.env.init (fontDictStr);
+ font = fontDicts.push ();
+ if (unlikely (font == &Crap(cff1_font_dict_values_t))) { fini (); return; }
+ font->init ();
+ if (unlikely (!font_interp.interpret (*font))) { fini (); return; }
+ PRIVDICTVAL *priv = &privateDicts[i];
+ const byte_str_t privDictStr (StructAtOffset<UnsizedByteStr> (cff, font->privateDictInfo.offset), font->privateDictInfo.size);
+ if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; }
+ dict_interpreter_t<PRIVOPSET, PRIVDICTVAL> priv_interp;
+ priv_interp.env.init (privDictStr);
+ priv->init ();
+ if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; }
+
+ priv->localSubrs = &StructAtOffsetOrNull<CFF1Subrs> (&privDictStr, priv->subrsOffset);
+ if (priv->localSubrs != &Null(CFF1Subrs) &&
+ unlikely (!priv->localSubrs->sanitize (&sc)))
+ { fini (); return; }
+ }
+ }
+ else /* non-CID */
+ {
+ cff1_top_dict_values_t *font = &topDict;
+ PRIVDICTVAL *priv = &privateDicts[0];
+
+ const byte_str_t privDictStr (StructAtOffset<UnsizedByteStr> (cff, font->privateDictInfo.offset), font->privateDictInfo.size);
+ if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; }
+ dict_interpreter_t<PRIVOPSET, PRIVDICTVAL> priv_interp;
+ priv_interp.env.init (privDictStr);
+ priv->init ();
+ if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; }
+
+ priv->localSubrs = &StructAtOffsetOrNull<CFF1Subrs> (&privDictStr, priv->subrsOffset);
+ if (priv->localSubrs != &Null(CFF1Subrs) &&
+ unlikely (!priv->localSubrs->sanitize (&sc)))
+ { fini (); return; }
+ }
+ }
+
+ void fini ()
+ {
+ sc.end_processing ();
+ topDict.fini ();
+ fontDicts.fini_deep ();
+ privateDicts.fini_deep ();
+ hb_blob_destroy (blob);
+ blob = nullptr;
+ }
+
+ bool is_valid () const { return blob != nullptr; }
+ bool is_CID () const { return topDict.is_CID (); }
+
+ bool is_predef_charset () const { return topDict.CharsetOffset <= ExpertSubsetCharset; }
+
+ unsigned int std_code_to_glyph (hb_codepoint_t code) const
+ {
+ hb_codepoint_t sid = lookup_standard_encoding_for_sid (code);
+ if (unlikely (sid == CFF_UNDEF_SID))
+ return 0;
+
+ if (charset != &Null(Charset))
+ return charset->get_glyph (sid, num_glyphs);
+ else if ((topDict.CharsetOffset == ISOAdobeCharset)
+ && (code <= 228 /*zcaron*/)) return sid;
+ return 0;
+ }
+
+ protected:
+ hb_blob_t *blob;
+ hb_sanitize_context_t sc;
+
+ public:
+ const Charset *charset;
+ const CFF1NameIndex *nameIndex;
+ const CFF1TopDictIndex *topDictIndex;
+ const CFF1StringIndex *stringIndex;
+ const CFF1Subrs *globalSubrs;
+ const CFF1CharStrings *charStrings;
+ const CFF1FDArray *fdArray;
+ const CFF1FDSelect *fdSelect;
+ unsigned int fdCount;
+
+ cff1_top_dict_values_t topDict;
+ hb_vector_t<cff1_font_dict_values_t> fontDicts;
+ hb_vector_t<PRIVDICTVAL> privateDicts;
+
+ unsigned int num_glyphs;
+ };
+
+ struct accelerator_t : accelerator_templ_t<cff1_private_dict_opset_t, cff1_private_dict_values_t>
+ {
+ HB_INTERNAL bool get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const;
+ HB_INTERNAL bool get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const;
+ };
+
+ struct accelerator_subset_t : accelerator_templ_t<cff1_private_dict_opset_subset, cff1_private_dict_values_subset_t>
+ {
+ void init (hb_face_t *face)
+ {
+ SUPER::init (face);
+ if (blob == nullptr) return;
+
+ const OT::cff1 *cff = this->blob->as<OT::cff1> ();
+ encoding = &Null(Encoding);
+ if (is_CID ())
+ {
+ if (unlikely (charset == &Null(Charset))) { fini (); return; }
+ }
+ else
+ {
+ if (!is_predef_encoding ())
+ {
+ encoding = &StructAtOffsetOrNull<Encoding> (cff, topDict.EncodingOffset);
+ if (unlikely ((encoding == &Null (Encoding)) || !encoding->sanitize (&sc))) { fini (); return; }
+ }
+ }
+ }
+
+ bool is_predef_encoding () const { return topDict.EncodingOffset <= ExpertEncoding; }
+
+ hb_codepoint_t glyph_to_code (hb_codepoint_t glyph) const
+ {
+ if (encoding != &Null(Encoding))
+ return encoding->get_code (glyph);
+ else
+ {
+ hb_codepoint_t sid = glyph_to_sid (glyph);
+ if (sid == 0) return 0;
+ hb_codepoint_t code = 0;
+ switch (topDict.EncodingOffset)
+ {
+ case StandardEncoding:
+ code = lookup_standard_encoding_for_code (sid);
+ break;
+ case ExpertEncoding:
+ code = lookup_expert_encoding_for_code (sid);
+ break;
+ default:
+ break;
+ }
+ return code;
+ }
+ }
+
+ hb_codepoint_t glyph_to_sid (hb_codepoint_t glyph) const
+ {
+ if (charset != &Null(Charset))
+ return charset->get_sid (glyph);
+ else
+ {
+ hb_codepoint_t sid = 0;
+ switch (topDict.CharsetOffset)
+ {
+ case ISOAdobeCharset:
+ if (glyph <= 228 /*zcaron*/) sid = glyph;
+ break;
+ case ExpertCharset:
+ sid = lookup_expert_charset_for_sid (glyph);
+ break;
+ case ExpertSubsetCharset:
+ sid = lookup_expert_subset_charset_for_sid (glyph);
+ break;
+ default:
+ break;
+ }
+ return sid;
+ }
+ }
+
+ const Encoding *encoding;
+
+ private:
+ typedef accelerator_templ_t<cff1_private_dict_opset_subset, cff1_private_dict_values_subset_t> SUPER;
+ };
+
+ bool subset (hb_subset_plan_t *plan) const
+ {
+ hb_blob_t *cff_prime = nullptr;
+
+ bool success = true;
+ if (hb_subset_cff1 (plan, &cff_prime)) {
+ success = success && plan->add_table (HB_OT_TAG_cff1, cff_prime);
+ hb_blob_t *head_blob = hb_sanitize_context_t().reference_table<head> (plan->source);
+ success = success && head_blob && plan->add_table (HB_OT_TAG_head, head_blob);
+ hb_blob_destroy (head_blob);
+ } else {
+ success = false;
+ }
+ hb_blob_destroy (cff_prime);
+
+ return success;
+ }
+
+ protected:
+ HB_INTERNAL static hb_codepoint_t lookup_standard_encoding_for_code (hb_codepoint_t sid);
+ HB_INTERNAL static hb_codepoint_t lookup_expert_encoding_for_code (hb_codepoint_t sid);
+ HB_INTERNAL static hb_codepoint_t lookup_expert_charset_for_sid (hb_codepoint_t glyph);
+ HB_INTERNAL static hb_codepoint_t lookup_expert_subset_charset_for_sid (hb_codepoint_t glyph);
+ HB_INTERNAL static hb_codepoint_t lookup_standard_encoding_for_sid (hb_codepoint_t code);
+
+ public:
+ FixedVersion<HBUINT8> version; /* Version of CFF table. set to 0x0100u */
+ OffsetTo<CFF1NameIndex, HBUINT8> nameIndex; /* headerSize = Offset to Name INDEX. */
+ HBUINT8 offSize; /* offset size (unused?) */
+
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+struct cff1_accelerator_t : cff1::accelerator_t {};
+} /* namespace OT */
+
+#endif /* HB_OT_CFF1_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.cc
new file mode 100644
index 0000000000..a2242b76fb
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.cc
@@ -0,0 +1,146 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_OT_FONT_CFF
+
+#include "hb-ot-cff2-table.hh"
+#include "hb-cff2-interp-cs.hh"
+
+using namespace CFF;
+
+struct cff2_extents_param_t
+{
+ void init ()
+ {
+ path_open = false;
+ min_x.set_int (INT_MAX);
+ min_y.set_int (INT_MAX);
+ max_x.set_int (INT_MIN);
+ max_y.set_int (INT_MIN);
+ }
+
+ void start_path () { path_open = true; }
+ void end_path () { path_open = false; }
+ bool is_path_open () const { return path_open; }
+
+ void update_bounds (const point_t &pt)
+ {
+ if (pt.x < min_x) min_x = pt.x;
+ if (pt.x > max_x) max_x = pt.x;
+ if (pt.y < min_y) min_y = pt.y;
+ if (pt.y > max_y) max_y = pt.y;
+ }
+
+ bool path_open;
+ number_t min_x;
+ number_t min_y;
+ number_t max_x;
+ number_t max_y;
+};
+
+struct cff2_path_procs_extents_t : path_procs_t<cff2_path_procs_extents_t, cff2_cs_interp_env_t, cff2_extents_param_t>
+{
+ static void moveto (cff2_cs_interp_env_t &env, cff2_extents_param_t& param, const point_t &pt)
+ {
+ param.end_path ();
+ env.moveto (pt);
+ }
+
+ static void line (cff2_cs_interp_env_t &env, cff2_extents_param_t& param, const point_t &pt1)
+ {
+ if (!param.is_path_open ())
+ {
+ param.start_path ();
+ param.update_bounds (env.get_pt ());
+ }
+ env.moveto (pt1);
+ param.update_bounds (env.get_pt ());
+ }
+
+ static void curve (cff2_cs_interp_env_t &env, cff2_extents_param_t& param, const point_t &pt1, const point_t &pt2, const point_t &pt3)
+ {
+ if (!param.is_path_open ())
+ {
+ param.start_path ();
+ param.update_bounds (env.get_pt ());
+ }
+ /* include control points */
+ param.update_bounds (pt1);
+ param.update_bounds (pt2);
+ env.moveto (pt3);
+ param.update_bounds (env.get_pt ());
+ }
+};
+
+struct cff2_cs_opset_extents_t : cff2_cs_opset_t<cff2_cs_opset_extents_t, cff2_extents_param_t, cff2_path_procs_extents_t> {};
+
+bool OT::cff2::accelerator_t::get_extents (hb_font_t *font,
+ hb_codepoint_t glyph,
+ hb_glyph_extents_t *extents) const
+{
+#ifdef HB_NO_OT_FONT_CFF
+ /* XXX Remove check when this code moves to .hh file. */
+ return true;
+#endif
+
+ if (unlikely (!is_valid () || (glyph >= num_glyphs))) return false;
+
+ unsigned int fd = fdSelect->get_fd (glyph);
+ cff2_cs_interpreter_t<cff2_cs_opset_extents_t, cff2_extents_param_t> interp;
+ const byte_str_t str = (*charStrings)[glyph];
+ interp.env.init (str, *this, fd, font->coords, font->num_coords);
+ cff2_extents_param_t param;
+ param.init ();
+ if (unlikely (!interp.interpret (param))) return false;
+
+ if (param.min_x >= param.max_x)
+ {
+ extents->width = 0;
+ extents->x_bearing = 0;
+ }
+ else
+ {
+ extents->x_bearing = font->em_scalef_x (param.min_x.to_real ());
+ extents->width = font->em_scalef_x (param.max_x.to_real () - param.min_x.to_real ());
+ }
+ if (param.min_y >= param.max_y)
+ {
+ extents->height = 0;
+ extents->y_bearing = 0;
+ }
+ else
+ {
+ extents->y_bearing = font->em_scalef_y (param.max_y.to_real ());
+ extents->height = font->em_scalef_y (param.min_y.to_real () - param.max_y.to_real ());
+ }
+
+ return true;
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh
new file mode 100644
index 0000000000..8646cde58d
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh
@@ -0,0 +1,570 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_OT_CFF2_TABLE_HH
+#define HB_OT_CFF2_TABLE_HH
+
+#include "hb-ot-head-table.hh"
+#include "hb-ot-cff-common.hh"
+#include "hb-subset-cff2.hh"
+
+namespace CFF {
+
+/*
+ * CFF2 -- Compact Font Format (CFF) Version 2
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/cff2
+ */
+#define HB_OT_TAG_cff2 HB_TAG('C','F','F','2')
+
+typedef CFFIndex<HBUINT32> CFF2Index;
+template <typename Type> struct CFF2IndexOf : CFFIndexOf<HBUINT32, Type> {};
+
+typedef CFF2Index CFF2CharStrings;
+typedef FDArray<HBUINT32> CFF2FDArray;
+typedef Subrs<HBUINT32> CFF2Subrs;
+
+typedef FDSelect3_4<HBUINT32, HBUINT16> FDSelect4;
+typedef FDSelect3_4_Range<HBUINT32, HBUINT16> FDSelect4_Range;
+
+struct CFF2FDSelect
+{
+ bool serialize (hb_serialize_context_t *c, const CFF2FDSelect &src, unsigned int num_glyphs)
+ {
+ TRACE_SERIALIZE (this);
+ unsigned int size = src.get_size (num_glyphs);
+ CFF2FDSelect *dest = c->allocate_size<CFF2FDSelect> (size);
+ if (unlikely (dest == nullptr)) return_trace (false);
+ memcpy (dest, &src, size);
+ return_trace (true);
+ }
+
+ unsigned int calculate_serialized_size (unsigned int num_glyphs) const
+ { return get_size (num_glyphs); }
+
+ unsigned int get_size (unsigned int num_glyphs) const
+ {
+ switch (format)
+ {
+ case 0: return format.static_size + u.format0.get_size (num_glyphs);
+ case 3: return format.static_size + u.format3.get_size ();
+ case 4: return format.static_size + u.format4.get_size ();
+ default:return 0;
+ }
+ }
+
+ hb_codepoint_t get_fd (hb_codepoint_t glyph) const
+ {
+ if (this == &Null (CFF2FDSelect))
+ return 0;
+
+ switch (format)
+ {
+ case 0: return u.format0.get_fd (glyph);
+ case 3: return u.format3.get_fd (glyph);
+ case 4: return u.format4.get_fd (glyph);
+ default:return 0;
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this)))
+ return_trace (false);
+
+ switch (format)
+ {
+ case 0: return_trace (u.format0.sanitize (c, fdcount));
+ case 3: return_trace (u.format3.sanitize (c, fdcount));
+ case 4: return_trace (u.format4.sanitize (c, fdcount));
+ default:return_trace (false);
+ }
+ }
+
+ HBUINT8 format;
+ union {
+ FDSelect0 format0;
+ FDSelect3 format3;
+ FDSelect4 format4;
+ } u;
+ public:
+ DEFINE_SIZE_MIN (2);
+};
+
+struct CFF2VariationStore
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)) && c->check_range (&varStore, size) && varStore.sanitize (c));
+ }
+
+ bool serialize (hb_serialize_context_t *c, const CFF2VariationStore *varStore)
+ {
+ TRACE_SERIALIZE (this);
+ unsigned int size_ = varStore->get_size ();
+ CFF2VariationStore *dest = c->allocate_size<CFF2VariationStore> (size_);
+ if (unlikely (dest == nullptr)) return_trace (false);
+ memcpy (dest, varStore, size_);
+ return_trace (true);
+ }
+
+ unsigned int get_size () const { return HBUINT16::static_size + size; }
+
+ HBUINT16 size;
+ VariationStore varStore;
+
+ DEFINE_SIZE_MIN (2 + VariationStore::min_size);
+};
+
+struct cff2_top_dict_values_t : top_dict_values_t<>
+{
+ void init ()
+ {
+ top_dict_values_t<>::init ();
+ vstoreOffset = 0;
+ FDSelectOffset = 0;
+ }
+ void fini () { top_dict_values_t<>::fini (); }
+
+ unsigned int calculate_serialized_size () const
+ {
+ unsigned int size = 0;
+ for (unsigned int i = 0; i < get_count (); i++)
+ {
+ op_code_t op = get_value (i).op;
+ switch (op)
+ {
+ case OpCode_vstore:
+ case OpCode_FDSelect:
+ size += OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (op);
+ break;
+ default:
+ size += top_dict_values_t<>::calculate_serialized_op_size (get_value (i));
+ break;
+ }
+ }
+ return size;
+ }
+
+ unsigned int vstoreOffset;
+ unsigned int FDSelectOffset;
+};
+
+struct cff2_top_dict_opset_t : top_dict_opset_t<>
+{
+ static void process_op (op_code_t op, num_interp_env_t& env, cff2_top_dict_values_t& dictval)
+ {
+ switch (op) {
+ case OpCode_FontMatrix:
+ {
+ dict_val_t val;
+ val.init ();
+ dictval.add_op (op, env.str_ref);
+ env.clear_args ();
+ }
+ break;
+
+ case OpCode_vstore:
+ dictval.vstoreOffset = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+ case OpCode_FDSelect:
+ dictval.FDSelectOffset = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+
+ default:
+ SUPER::process_op (op, env, dictval);
+ /* Record this operand below if stack is empty, otherwise done */
+ if (!env.argStack.is_empty ()) return;
+ }
+
+ if (unlikely (env.in_error ())) return;
+
+ dictval.add_op (op, env.str_ref);
+ }
+
+ typedef top_dict_opset_t<> SUPER;
+};
+
+struct cff2_font_dict_values_t : dict_values_t<op_str_t>
+{
+ void init ()
+ {
+ dict_values_t<op_str_t>::init ();
+ privateDictInfo.init ();
+ }
+ void fini () { dict_values_t<op_str_t>::fini (); }
+
+ table_info_t privateDictInfo;
+};
+
+struct cff2_font_dict_opset_t : dict_opset_t
+{
+ static void process_op (op_code_t op, num_interp_env_t& env, cff2_font_dict_values_t& dictval)
+ {
+ switch (op) {
+ case OpCode_Private:
+ dictval.privateDictInfo.offset = env.argStack.pop_uint ();
+ dictval.privateDictInfo.size = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+
+ default:
+ SUPER::process_op (op, env);
+ if (!env.argStack.is_empty ())
+ return;
+ }
+
+ if (unlikely (env.in_error ())) return;
+
+ dictval.add_op (op, env.str_ref);
+ }
+
+ private:
+ typedef dict_opset_t SUPER;
+};
+
+template <typename VAL>
+struct cff2_private_dict_values_base_t : dict_values_t<VAL>
+{
+ void init ()
+ {
+ dict_values_t<VAL>::init ();
+ subrsOffset = 0;
+ localSubrs = &Null(CFF2Subrs);
+ ivs = 0;
+ }
+ void fini () { dict_values_t<VAL>::fini (); }
+
+ unsigned int calculate_serialized_size () const
+ {
+ unsigned int size = 0;
+ for (unsigned int i = 0; i < dict_values_t<VAL>::get_count; i++)
+ if (dict_values_t<VAL>::get_value (i).op == OpCode_Subrs)
+ size += OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Subrs);
+ else
+ size += dict_values_t<VAL>::get_value (i).str.length;
+ return size;
+ }
+
+ unsigned int subrsOffset;
+ const CFF2Subrs *localSubrs;
+ unsigned int ivs;
+};
+
+typedef cff2_private_dict_values_base_t<op_str_t> cff2_private_dict_values_subset_t;
+typedef cff2_private_dict_values_base_t<num_dict_val_t> cff2_private_dict_values_t;
+
+struct cff2_priv_dict_interp_env_t : num_interp_env_t
+{
+ void init (const byte_str_t &str)
+ {
+ num_interp_env_t::init (str);
+ ivs = 0;
+ seen_vsindex = false;
+ }
+
+ void process_vsindex ()
+ {
+ if (likely (!seen_vsindex))
+ {
+ set_ivs (argStack.pop_uint ());
+ }
+ seen_vsindex = true;
+ }
+
+ unsigned int get_ivs () const { return ivs; }
+ void set_ivs (unsigned int ivs_) { ivs = ivs_; }
+
+ protected:
+ unsigned int ivs;
+ bool seen_vsindex;
+};
+
+struct cff2_private_dict_opset_t : dict_opset_t
+{
+ static void process_op (op_code_t op, cff2_priv_dict_interp_env_t& env, cff2_private_dict_values_t& dictval)
+ {
+ num_dict_val_t val;
+ val.init ();
+
+ switch (op) {
+ case OpCode_StdHW:
+ case OpCode_StdVW:
+ case OpCode_BlueScale:
+ case OpCode_BlueShift:
+ case OpCode_BlueFuzz:
+ case OpCode_ExpansionFactor:
+ case OpCode_LanguageGroup:
+ val.single_val = env.argStack.pop_num ();
+ env.clear_args ();
+ break;
+ case OpCode_BlueValues:
+ case OpCode_OtherBlues:
+ case OpCode_FamilyBlues:
+ case OpCode_FamilyOtherBlues:
+ case OpCode_StemSnapH:
+ case OpCode_StemSnapV:
+ env.clear_args ();
+ break;
+ case OpCode_Subrs:
+ dictval.subrsOffset = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+ case OpCode_vsindexdict:
+ env.process_vsindex ();
+ dictval.ivs = env.get_ivs ();
+ env.clear_args ();
+ break;
+ case OpCode_blenddict:
+ break;
+
+ default:
+ dict_opset_t::process_op (op, env);
+ if (!env.argStack.is_empty ()) return;
+ break;
+ }
+
+ if (unlikely (env.in_error ())) return;
+
+ dictval.add_op (op, env.str_ref, val);
+ }
+};
+
+struct cff2_private_dict_opset_subset_t : dict_opset_t
+{
+ static void process_op (op_code_t op, cff2_priv_dict_interp_env_t& env, cff2_private_dict_values_subset_t& dictval)
+ {
+ switch (op) {
+ case OpCode_BlueValues:
+ case OpCode_OtherBlues:
+ case OpCode_FamilyBlues:
+ case OpCode_FamilyOtherBlues:
+ case OpCode_StdHW:
+ case OpCode_StdVW:
+ case OpCode_BlueScale:
+ case OpCode_BlueShift:
+ case OpCode_BlueFuzz:
+ case OpCode_StemSnapH:
+ case OpCode_StemSnapV:
+ case OpCode_LanguageGroup:
+ case OpCode_ExpansionFactor:
+ env.clear_args ();
+ break;
+
+ case OpCode_blenddict:
+ env.clear_args ();
+ return;
+
+ case OpCode_Subrs:
+ dictval.subrsOffset = env.argStack.pop_uint ();
+ env.clear_args ();
+ break;
+
+ default:
+ SUPER::process_op (op, env);
+ if (!env.argStack.is_empty ()) return;
+ break;
+ }
+
+ if (unlikely (env.in_error ())) return;
+
+ dictval.add_op (op, env.str_ref);
+ }
+
+ private:
+ typedef dict_opset_t SUPER;
+};
+
+typedef dict_interpreter_t<cff2_top_dict_opset_t, cff2_top_dict_values_t> cff2_top_dict_interpreter_t;
+typedef dict_interpreter_t<cff2_font_dict_opset_t, cff2_font_dict_values_t> cff2_font_dict_interpreter_t;
+
+} /* namespace CFF */
+
+namespace OT {
+
+using namespace CFF;
+
+struct cff2
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_cff2;
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ likely (version.major == 2));
+ }
+
+ template <typename PRIVOPSET, typename PRIVDICTVAL>
+ struct accelerator_templ_t
+ {
+ void init (hb_face_t *face)
+ {
+ topDict.init ();
+ fontDicts.init ();
+ privateDicts.init ();
+
+ this->blob = sc.reference_table<cff2> (face);
+
+ /* setup for run-time santization */
+ sc.init (this->blob);
+ sc.start_processing ();
+
+ const OT::cff2 *cff2 = this->blob->template as<OT::cff2> ();
+
+ if (cff2 == &Null(OT::cff2))
+ { fini (); return; }
+
+ { /* parse top dict */
+ byte_str_t topDictStr (cff2 + cff2->topDict, cff2->topDictSize);
+ if (unlikely (!topDictStr.sanitize (&sc))) { fini (); return; }
+ cff2_top_dict_interpreter_t top_interp;
+ top_interp.env.init (topDictStr);
+ topDict.init ();
+ if (unlikely (!top_interp.interpret (topDict))) { fini (); return; }
+ }
+
+ globalSubrs = &StructAtOffset<CFF2Subrs> (cff2, cff2->topDict + cff2->topDictSize);
+ varStore = &StructAtOffsetOrNull<CFF2VariationStore> (cff2, topDict.vstoreOffset);
+ charStrings = &StructAtOffsetOrNull<CFF2CharStrings> (cff2, topDict.charStringsOffset);
+ fdArray = &StructAtOffsetOrNull<CFF2FDArray> (cff2, topDict.FDArrayOffset);
+ fdSelect = &StructAtOffsetOrNull<CFF2FDSelect> (cff2, topDict.FDSelectOffset);
+
+ if (((varStore != &Null(CFF2VariationStore)) && unlikely (!varStore->sanitize (&sc))) ||
+ (charStrings == &Null(CFF2CharStrings)) || unlikely (!charStrings->sanitize (&sc)) ||
+ (globalSubrs == &Null(CFF2Subrs)) || unlikely (!globalSubrs->sanitize (&sc)) ||
+ (fdArray == &Null(CFF2FDArray)) || unlikely (!fdArray->sanitize (&sc)) ||
+ (((fdSelect != &Null(CFF2FDSelect)) && unlikely (!fdSelect->sanitize (&sc, fdArray->count)))))
+ { fini (); return; }
+
+ num_glyphs = charStrings->count;
+ if (num_glyphs != sc.get_num_glyphs ())
+ { fini (); return; }
+
+ fdCount = fdArray->count;
+ privateDicts.resize (fdCount);
+
+ /* parse font dicts and gather private dicts */
+ for (unsigned int i = 0; i < fdCount; i++)
+ {
+ const byte_str_t fontDictStr = (*fdArray)[i];
+ if (unlikely (!fontDictStr.sanitize (&sc))) { fini (); return; }
+ cff2_font_dict_values_t *font;
+ cff2_font_dict_interpreter_t font_interp;
+ font_interp.env.init (fontDictStr);
+ font = fontDicts.push ();
+ if (unlikely (font == &Crap(cff2_font_dict_values_t))) { fini (); return; }
+ font->init ();
+ if (unlikely (!font_interp.interpret (*font))) { fini (); return; }
+
+ const byte_str_t privDictStr (StructAtOffsetOrNull<UnsizedByteStr> (cff2, font->privateDictInfo.offset), font->privateDictInfo.size);
+ if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; }
+ dict_interpreter_t<PRIVOPSET, PRIVDICTVAL, cff2_priv_dict_interp_env_t> priv_interp;
+ priv_interp.env.init(privDictStr);
+ privateDicts[i].init ();
+ if (unlikely (!priv_interp.interpret (privateDicts[i]))) { fini (); return; }
+
+ privateDicts[i].localSubrs = &StructAtOffsetOrNull<CFF2Subrs> (&privDictStr[0], privateDicts[i].subrsOffset);
+ if (privateDicts[i].localSubrs != &Null(CFF2Subrs) &&
+ unlikely (!privateDicts[i].localSubrs->sanitize (&sc)))
+ { fini (); return; }
+ }
+ }
+
+ void fini ()
+ {
+ sc.end_processing ();
+ topDict.fini ();
+ fontDicts.fini_deep ();
+ privateDicts.fini_deep ();
+ hb_blob_destroy (blob);
+ blob = nullptr;
+ }
+
+ bool is_valid () const { return blob != nullptr; }
+
+ protected:
+ hb_blob_t *blob;
+ hb_sanitize_context_t sc;
+
+ public:
+ cff2_top_dict_values_t topDict;
+ const CFF2Subrs *globalSubrs;
+ const CFF2VariationStore *varStore;
+ const CFF2CharStrings *charStrings;
+ const CFF2FDArray *fdArray;
+ const CFF2FDSelect *fdSelect;
+ unsigned int fdCount;
+
+ hb_vector_t<cff2_font_dict_values_t> fontDicts;
+ hb_vector_t<PRIVDICTVAL> privateDicts;
+
+ unsigned int num_glyphs;
+ };
+
+ struct accelerator_t : accelerator_templ_t<cff2_private_dict_opset_t, cff2_private_dict_values_t>
+ {
+ HB_INTERNAL bool get_extents (hb_font_t *font,
+ hb_codepoint_t glyph,
+ hb_glyph_extents_t *extents) const;
+ };
+
+ typedef accelerator_templ_t<cff2_private_dict_opset_subset_t, cff2_private_dict_values_subset_t> accelerator_subset_t;
+
+ bool subset (hb_subset_plan_t *plan) const
+ {
+ hb_blob_t *cff2_prime = nullptr;
+
+ bool success = true;
+ if (hb_subset_cff2 (plan, &cff2_prime)) {
+ success = success && plan->add_table (HB_OT_TAG_cff2, cff2_prime);
+ hb_blob_t *head_blob = hb_sanitize_context_t().reference_table<head> (plan->source);
+ success = success && head_blob && plan->add_table (HB_OT_TAG_head, head_blob);
+ hb_blob_destroy (head_blob);
+ } else {
+ success = false;
+ }
+ hb_blob_destroy (cff2_prime);
+
+ return success;
+ }
+
+ public:
+ FixedVersion<HBUINT8> version; /* Version of CFF2 table. set to 0x0200u */
+ NNOffsetTo<TopDict, HBUINT8> topDict; /* headerSize = Offset to Top DICT. */
+ HBUINT16 topDictSize; /* Top DICT size */
+
+ public:
+ DEFINE_SIZE_STATIC (5);
+};
+
+struct cff2_accelerator_t : cff2::accelerator_t {};
+} /* namespace OT */
+
+#endif /* HB_OT_CFF2_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh
index 883d7b3f0b..9ebd8e417f 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh
@@ -27,22 +27,21 @@
#ifndef HB_OT_CMAP_TABLE_HH
#define HB_OT_CMAP_TABLE_HH
-#include "hb-open-type-private.hh"
-
-
-namespace OT {
-
+#include "hb-open-type.hh"
+#include "hb-set.hh"
/*
- * cmap -- Character To Glyph Index Mapping Table
+ * cmap -- Character to Glyph Index Mapping
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/cmap
*/
-
#define HB_OT_TAG_cmap HB_TAG('c','m','a','p')
+namespace OT {
+
struct CmapSubtableFormat0
{
- inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+ bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
{
hb_codepoint_t gid = codepoint < 256 ? glyphIdArray[codepoint] : 0;
if (!gid)
@@ -50,18 +49,24 @@ struct CmapSubtableFormat0
*glyph = gid;
return true;
}
+ void collect_unicodes (hb_set_t *out) const
+ {
+ for (unsigned int i = 0; i < 256; i++)
+ if (glyphIdArray[i])
+ out->add (i);
+ }
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
protected:
- UINT16 format; /* Format number is set to 0. */
- UINT16 lengthZ; /* Byte length of this subtable. */
- UINT16 languageZ; /* Ignore. */
- UINT8 glyphIdArray[256];/* An array that maps character
+ HBUINT16 format; /* Format number is set to 0. */
+ HBUINT16 length; /* Byte length of this subtable. */
+ HBUINT16 language; /* Ignore. */
+ HBUINT8 glyphIdArray[256];/* An array that maps character
* code to glyph index values. */
public:
DEFINE_SIZE_STATIC (6 + 256);
@@ -69,31 +74,231 @@ struct CmapSubtableFormat0
struct CmapSubtableFormat4
{
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ HBUINT16* serialize_endcode_array (hb_serialize_context_t *c,
+ Iterator it)
+ {
+ HBUINT16 *endCode = c->start_embed<HBUINT16> ();
+ hb_codepoint_t prev_endcp = 0xFFFF;
+
+ + it
+ | hb_apply ([&] (const hb_item_type<Iterator> _)
+ {
+ if (prev_endcp != 0xFFFF && prev_endcp + 1u != _.first)
+ {
+ HBUINT16 end_code;
+ end_code = prev_endcp;
+ c->copy<HBUINT16> (end_code);
+ }
+ prev_endcp = _.first;
+ })
+ ;
+
+ {
+ // last endCode
+ HBUINT16 endcode;
+ endcode = prev_endcp;
+ if (unlikely (!c->copy<HBUINT16> (endcode))) return nullptr;
+ // There must be a final entry with end_code == 0xFFFF.
+ if (prev_endcp != 0xFFFF)
+ {
+ HBUINT16 finalcode;
+ finalcode = 0xFFFF;
+ if (unlikely (!c->copy<HBUINT16> (finalcode))) return nullptr;
+ }
+ }
+
+ return endCode;
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ HBUINT16* serialize_startcode_array (hb_serialize_context_t *c,
+ Iterator it)
+ {
+ HBUINT16 *startCode = c->start_embed<HBUINT16> ();
+ hb_codepoint_t prev_cp = 0xFFFF;
+
+ + it
+ | hb_apply ([&] (const hb_item_type<Iterator> _)
+ {
+ if (prev_cp == 0xFFFF || prev_cp + 1u != _.first)
+ {
+ HBUINT16 start_code;
+ start_code = _.first;
+ c->copy<HBUINT16> (start_code);
+ }
+
+ prev_cp = _.first;
+ })
+ ;
+
+ // There must be a final entry with end_code == 0xFFFF.
+ if (it.len () == 0 || prev_cp != 0xFFFF)
+ {
+ HBUINT16 finalcode;
+ finalcode = 0xFFFF;
+ if (unlikely (!c->copy<HBUINT16> (finalcode))) return nullptr;
+ }
+
+ return startCode;
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ HBINT16* serialize_idDelta_array (hb_serialize_context_t *c,
+ Iterator it,
+ HBUINT16 *endCode,
+ HBUINT16 *startCode,
+ unsigned segcount)
+ {
+ unsigned i = 0;
+ hb_codepoint_t last_gid = 0, start_gid = 0, last_cp = 0xFFFF;
+ bool use_delta = true;
+
+ HBINT16 *idDelta = c->start_embed<HBINT16> ();
+ if ((char *)idDelta - (char *)startCode != (int) segcount * (int) HBINT16::static_size)
+ return nullptr;
+
+ + it
+ | hb_apply ([&] (const hb_item_type<Iterator> _)
+ {
+ if (_.first == startCode[i])
+ {
+ use_delta = true;
+ start_gid = _.second;
+ }
+ else if (_.second != last_gid + 1) use_delta = false;
+
+ if (_.first == endCode[i])
+ {
+ HBINT16 delta;
+ if (use_delta) delta = (int)start_gid - (int)startCode[i];
+ else delta = 0;
+ c->copy<HBINT16> (delta);
+
+ i++;
+ }
+
+ last_gid = _.second;
+ last_cp = _.first;
+ })
+ ;
+
+ if (it.len () == 0 || last_cp != 0xFFFF)
+ {
+ HBINT16 delta;
+ delta = 1;
+ if (unlikely (!c->copy<HBINT16> (delta))) return nullptr;
+ }
+
+ return idDelta;
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ HBUINT16* serialize_rangeoffset_glyid (hb_serialize_context_t *c,
+ Iterator it,
+ HBUINT16 *endCode,
+ HBUINT16 *startCode,
+ HBINT16 *idDelta,
+ unsigned segcount)
+ {
+ HBUINT16 *idRangeOffset = c->allocate_size<HBUINT16> (HBUINT16::static_size * segcount);
+ if (unlikely (!c->check_success (idRangeOffset))) return nullptr;
+ if (unlikely ((char *)idRangeOffset - (char *)idDelta != (int) segcount * (int) HBINT16::static_size)) return nullptr;
+
+ + hb_range (segcount)
+ | hb_filter ([&] (const unsigned _) { return idDelta[_] == 0; })
+ | hb_apply ([&] (const unsigned i)
+ {
+ idRangeOffset[i] = 2 * (c->start_embed<HBUINT16> () - idRangeOffset - i);
+
+ + it
+ | hb_filter ([&] (const hb_item_type<Iterator> _) { return _.first >= startCode[i] && _.first <= endCode[i]; })
+ | hb_apply ([&] (const hb_item_type<Iterator> _)
+ {
+ HBUINT16 glyID;
+ glyID = _.second;
+ c->copy<HBUINT16> (glyID);
+ })
+ ;
+
+
+ })
+ ;
+
+ return idRangeOffset;
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ void serialize (hb_serialize_context_t *c,
+ Iterator it)
+ {
+ unsigned table_initpos = c->length ();
+ if (unlikely (!c->extend_min (*this))) return;
+ this->format = 4;
+
+ //serialize endCode[]
+ HBUINT16 *endCode = serialize_endcode_array (c, it);
+ if (unlikely (!endCode)) return;
+
+ unsigned segcount = (c->length () - min_size) / HBUINT16::static_size;
+
+ // 2 bytes of padding.
+ if (unlikely (!c->allocate_size<HBUINT16> (HBUINT16::static_size))) return; // 2 bytes of padding.
+
+ // serialize startCode[]
+ HBUINT16 *startCode = serialize_startcode_array (c, it);
+ if (unlikely (!startCode)) return;
+
+ //serialize idDelta[]
+ HBINT16 *idDelta = serialize_idDelta_array (c, it, endCode, startCode, segcount);
+ if (unlikely (!idDelta)) return;
+
+ HBUINT16 *idRangeOffset = serialize_rangeoffset_glyid (c, it, endCode, startCode, idDelta, segcount);
+ if (unlikely (!c->check_success (idRangeOffset))) return;
+
+ if (unlikely (!c->check_assign(this->length, c->length () - table_initpos))) return;
+ this->segCountX2 = segcount * 2;
+ this->entrySelector = hb_max (1u, hb_bit_storage (segcount)) - 1;
+ this->searchRange = 2 * (1u << this->entrySelector);
+ this->rangeShift = segcount * 2 > this->searchRange
+ ? 2 * segcount - this->searchRange
+ : 0;
+ }
+
struct accelerator_t
{
- inline void init (const CmapSubtableFormat4 *subtable)
+ accelerator_t () {}
+ accelerator_t (const CmapSubtableFormat4 *subtable) { init (subtable); }
+ ~accelerator_t () { fini (); }
+
+ void init (const CmapSubtableFormat4 *subtable)
{
segCount = subtable->segCountX2 / 2;
- endCount = subtable->values;
+ endCount = subtable->values.arrayZ;
startCount = endCount + segCount + 1;
idDelta = startCount + segCount;
idRangeOffset = idDelta + segCount;
glyphIdArray = idRangeOffset + segCount;
glyphIdArrayLength = (subtable->length - 16 - 8 * segCount) / 2;
}
+ void fini () {}
- static inline bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph)
+ bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
{
- const accelerator_t *thiz = (const accelerator_t *) obj;
-
/* Custom two-array bsearch. */
- int min = 0, max = (int) thiz->segCount - 1;
- const UINT16 *startCount = thiz->startCount;
- const UINT16 *endCount = thiz->endCount;
+ int min = 0, max = (int) this->segCount - 1;
+ const HBUINT16 *startCount = this->startCount;
+ const HBUINT16 *endCount = this->endCount;
unsigned int i;
while (min <= max)
{
- int mid = (min + max) / 2;
+ int mid = ((unsigned int) min + (unsigned int) max) / 2;
if (codepoint < startCount[mid])
max = mid - 1;
else if (codepoint > endCount[mid])
@@ -108,42 +313,85 @@ struct CmapSubtableFormat4
found:
hb_codepoint_t gid;
- unsigned int rangeOffset = thiz->idRangeOffset[i];
+ unsigned int rangeOffset = this->idRangeOffset[i];
if (rangeOffset == 0)
- gid = codepoint + thiz->idDelta[i];
+ gid = codepoint + this->idDelta[i];
else
{
/* Somebody has been smoking... */
- unsigned int index = rangeOffset / 2 + (codepoint - thiz->startCount[i]) + i - thiz->segCount;
- if (unlikely (index >= thiz->glyphIdArrayLength))
+ unsigned int index = rangeOffset / 2 + (codepoint - this->startCount[i]) + i - this->segCount;
+ if (unlikely (index >= this->glyphIdArrayLength))
return false;
- gid = thiz->glyphIdArray[index];
+ gid = this->glyphIdArray[index];
if (unlikely (!gid))
return false;
- gid += thiz->idDelta[i];
+ gid += this->idDelta[i];
}
-
- *glyph = gid & 0xFFFFu;
+ gid &= 0xFFFFu;
+ if (!gid)
+ return false;
+ *glyph = gid;
return true;
}
+ HB_INTERNAL static bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph)
+ { return ((const accelerator_t *) obj)->get_glyph (codepoint, glyph); }
+ void collect_unicodes (hb_set_t *out) const
+ {
+ unsigned int count = this->segCount;
+ if (count && this->startCount[count - 1] == 0xFFFFu)
+ count--; /* Skip sentinel segment. */
+ for (unsigned int i = 0; i < count; i++)
+ {
+ hb_codepoint_t start = this->startCount[i];
+ hb_codepoint_t end = this->endCount[i];
+ unsigned int rangeOffset = this->idRangeOffset[i];
+ if (rangeOffset == 0)
+ {
+ for (hb_codepoint_t codepoint = start; codepoint <= end; codepoint++)
+ {
+ hb_codepoint_t gid = (codepoint + this->idDelta[i]) & 0xFFFFu;
+ if (unlikely (!gid))
+ continue;
+ out->add (codepoint);
+ }
+ }
+ else
+ {
+ for (hb_codepoint_t codepoint = start; codepoint <= end; codepoint++)
+ {
+ unsigned int index = rangeOffset / 2 + (codepoint - this->startCount[i]) + i - this->segCount;
+ if (unlikely (index >= this->glyphIdArrayLength))
+ break;
+ hb_codepoint_t gid = this->glyphIdArray[index];
+ if (unlikely (!gid))
+ continue;
+ out->add (codepoint);
+ }
+ }
+ }
+ }
- const UINT16 *endCount;
- const UINT16 *startCount;
- const UINT16 *idDelta;
- const UINT16 *idRangeOffset;
- const UINT16 *glyphIdArray;
+ const HBUINT16 *endCount;
+ const HBUINT16 *startCount;
+ const HBUINT16 *idDelta;
+ const HBUINT16 *idRangeOffset;
+ const HBUINT16 *glyphIdArray;
unsigned int segCount;
unsigned int glyphIdArrayLength;
};
- inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+ bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
{
- accelerator_t accel;
- accel.init (this);
+ accelerator_t accel (this);
return accel.get_glyph_func (&accel, codepoint, glyph);
}
+ void collect_unicodes (hb_set_t *out) const
+ {
+ accelerator_t accel (this);
+ accel.collect_unicodes (out);
+ }
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
if (unlikely (!c->check_struct (this)))
@@ -154,7 +402,7 @@ struct CmapSubtableFormat4
/* Some broken fonts have too long of a "length" value.
* If that is the case, just change the value to truncate
* the subtable at the end of the blob. */
- uint16_t new_length = (uint16_t) MIN ((uintptr_t) 65535,
+ uint16_t new_length = (uint16_t) hb_min ((uintptr_t) 65535,
(uintptr_t) (c->end -
(char *) this));
if (!c->try_set (&length, new_length))
@@ -164,25 +412,29 @@ struct CmapSubtableFormat4
return_trace (16 + 4 * (unsigned int) segCountX2 <= length);
}
+
+
protected:
- UINT16 format; /* Format number is set to 4. */
- UINT16 length; /* This is the length in bytes of the
+ HBUINT16 format; /* Format number is set to 4. */
+ HBUINT16 length; /* This is the length in bytes of the
* subtable. */
- UINT16 languageZ; /* Ignore. */
- UINT16 segCountX2; /* 2 x segCount. */
- UINT16 searchRangeZ; /* 2 * (2**floor(log2(segCount))) */
- UINT16 entrySelectorZ; /* log2(searchRange/2) */
- UINT16 rangeShiftZ; /* 2 x segCount - searchRange */
-
- UINT16 values[VAR];
+ HBUINT16 language; /* Ignore. */
+ HBUINT16 segCountX2; /* 2 x segCount. */
+ HBUINT16 searchRange; /* 2 * (2**floor(log2(segCount))) */
+ HBUINT16 entrySelector; /* log2(searchRange/2) */
+ HBUINT16 rangeShift; /* 2 x segCount - searchRange */
+
+ UnsizedArrayOf<HBUINT16>
+ values;
#if 0
- UINT16 endCount[segCount]; /* End characterCode for each segment,
+ HBUINT16 endCount[segCount]; /* End characterCode for each segment,
* last=0xFFFFu. */
- UINT16 reservedPad; /* Set to 0. */
- UINT16 startCount[segCount]; /* Start character code for each segment. */
- INT16 idDelta[segCount]; /* Delta for all character codes in segment. */
- UINT16 idRangeOffset[segCount];/* Offsets into glyphIdArray or 0 */
- UINT16 glyphIdArray[VAR]; /* Glyph index array (arbitrary length) */
+ HBUINT16 reservedPad; /* Set to 0. */
+ HBUINT16 startCount[segCount]; /* Start character code for each segment. */
+ HBINT16 idDelta[segCount]; /* Delta for all character codes in segment. */
+ HBUINT16 idRangeOffset[segCount];/* Offsets into glyphIdArray or 0 */
+ UnsizedArrayOf<HBUINT16>
+ glyphIdArray; /* Glyph index array (arbitrary length) */
#endif
public:
@@ -193,6 +445,9 @@ struct CmapSubtableLongGroup
{
friend struct CmapSubtableFormat12;
friend struct CmapSubtableFormat13;
+ template<typename U>
+ friend struct CmapSubtableLongSegmented;
+ friend struct cmap;
int cmp (hb_codepoint_t codepoint) const
{
@@ -201,25 +456,26 @@ struct CmapSubtableLongGroup
return 0;
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
private:
- UINT32 startCharCode; /* First character code in this group. */
- UINT32 endCharCode; /* Last character code in this group. */
- UINT32 glyphID; /* Glyph index; interpretation depends on
- * subtable format. */
+ HBUINT32 startCharCode; /* First character code in this group. */
+ HBUINT32 endCharCode; /* Last character code in this group. */
+ HBUINT32 glyphID; /* Glyph index; interpretation depends on
+ * subtable format. */
public:
DEFINE_SIZE_STATIC (12);
};
+DECLARE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup);
template <typename UINT>
struct CmapSubtableTrimmed
{
- inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+ bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
{
/* Rely on our implicit array bound-checking. */
hb_codepoint_t gid = glyphIdArray[codepoint - startCharCode];
@@ -228,8 +484,16 @@ struct CmapSubtableTrimmed
*glyph = gid;
return true;
}
+ void collect_unicodes (hb_set_t *out) const
+ {
+ hb_codepoint_t start = startCharCode;
+ unsigned int count = glyphIdArray.len;
+ for (unsigned int i = 0; i < count; i++)
+ if (glyphIdArray[i])
+ out->add (start + i);
+ }
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) && glyphIdArray.sanitize (c));
@@ -237,43 +501,62 @@ struct CmapSubtableTrimmed
protected:
UINT formatReserved; /* Subtable format and (maybe) padding. */
- UINT lengthZ; /* Byte length of this subtable. */
- UINT languageZ; /* Ignore. */
+ UINT length; /* Byte length of this subtable. */
+ UINT language; /* Ignore. */
UINT startCharCode; /* First character code covered. */
- ArrayOf<GlyphID, UINT>
+ ArrayOf<HBGlyphID, UINT>
glyphIdArray; /* Array of glyph index values for character
* codes in the range. */
public:
DEFINE_SIZE_ARRAY (5 * sizeof (UINT), glyphIdArray);
};
-struct CmapSubtableFormat6 : CmapSubtableTrimmed<UINT16> {};
-struct CmapSubtableFormat10 : CmapSubtableTrimmed<UINT32 > {};
+struct CmapSubtableFormat6 : CmapSubtableTrimmed<HBUINT16> {};
+struct CmapSubtableFormat10 : CmapSubtableTrimmed<HBUINT32 > {};
template <typename T>
struct CmapSubtableLongSegmented
{
- inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+ friend struct cmap;
+
+ bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
{
- int i = groups.bsearch (codepoint);
- if (i == -1)
+ hb_codepoint_t gid = T::group_get_glyph (groups.bsearch (codepoint), codepoint);
+ if (!gid)
return false;
- *glyph = T::group_get_glyph (groups[i], codepoint);
+ *glyph = gid;
return true;
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ void collect_unicodes (hb_set_t *out) const
+ {
+ for (unsigned int i = 0; i < this->groups.len; i++)
+ {
+ hb_codepoint_t start = this->groups[i].startCharCode;
+ hb_codepoint_t end = hb_min ((hb_codepoint_t) this->groups[i].endCharCode,
+ (hb_codepoint_t) HB_UNICODE_MAX);
+ for (hb_codepoint_t codepoint = start; codepoint <= end; codepoint++)
+ {
+ hb_codepoint_t gid = T::group_get_glyph (this->groups[i], codepoint);
+ if (unlikely (!gid))
+ continue;
+ out->add (codepoint);
+ }
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) && groups.sanitize (c));
}
protected:
- UINT16 format; /* Subtable format; set to 12. */
- UINT16 reservedZ; /* Reserved; set to 0. */
- UINT32 lengthZ; /* Byte length of this subtable. */
- UINT32 languageZ; /* Ignore. */
- SortedArrayOf<CmapSubtableLongGroup, UINT32>
+ HBUINT16 format; /* Subtable format; set to 12. */
+ HBUINT16 reserved; /* Reserved; set to 0. */
+ HBUINT32 length; /* Byte length of this subtable. */
+ HBUINT32 language; /* Ignore. */
+ SortedArrayOf<CmapSubtableLongGroup, HBUINT32>
groups; /* Groupings. */
public:
DEFINE_SIZE_ARRAY (16, groups);
@@ -281,15 +564,84 @@ struct CmapSubtableLongSegmented
struct CmapSubtableFormat12 : CmapSubtableLongSegmented<CmapSubtableFormat12>
{
- static inline hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
- hb_codepoint_t u)
- { return group.glyphID + (u - group.startCharCode); }
+ static hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
+ hb_codepoint_t u)
+ { return likely (group.startCharCode <= group.endCharCode) ?
+ group.glyphID + (u - group.startCharCode) : 0; }
+
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ void serialize (hb_serialize_context_t *c,
+ Iterator it)
+ {
+ if (it.len () == 0) return;
+ unsigned table_initpos = c->length ();
+ if (unlikely (!c->extend_min (*this))) return;
+
+ hb_codepoint_t startCharCode = 0xFFFF, endCharCode = 0xFFFF;
+ hb_codepoint_t glyphID = 0;
+
+ + it
+ | hb_apply ([&] (const hb_item_type<Iterator> _)
+ {
+ if (startCharCode == 0xFFFF)
+ {
+ startCharCode = _.first;
+ endCharCode = _.first;
+ glyphID = _.second;
+ }
+ else if (!_is_gid_consecutive (endCharCode, startCharCode, glyphID, _.first, _.second))
+ {
+ CmapSubtableLongGroup grouprecord;
+ grouprecord.startCharCode = startCharCode;
+ grouprecord.endCharCode = endCharCode;
+ grouprecord.glyphID = glyphID;
+ c->copy<CmapSubtableLongGroup> (grouprecord);
+
+ startCharCode = _.first;
+ endCharCode = _.first;
+ glyphID = _.second;
+ }
+ else
+ {
+ endCharCode = _.first;
+ }
+ })
+ ;
+
+ CmapSubtableLongGroup record;
+ record.startCharCode = startCharCode;
+ record.endCharCode = endCharCode;
+ record.glyphID = glyphID;
+ c->copy<CmapSubtableLongGroup> (record);
+
+ this->format = 12;
+ this->reserved = 0;
+ this->length = c->length () - table_initpos;
+ this->groups.len = (this->length - min_size)/CmapSubtableLongGroup::static_size;
+ }
+
+ static size_t get_sub_table_size (const hb_sorted_vector_t<CmapSubtableLongGroup> &groups_data)
+ { return 16 + 12 * groups_data.length; }
+
+ private:
+ static bool _is_gid_consecutive (hb_codepoint_t endCharCode,
+ hb_codepoint_t startCharCode,
+ hb_codepoint_t glyphID,
+ hb_codepoint_t cp,
+ hb_codepoint_t new_gid)
+ {
+ return (cp - 1 == endCharCode) &&
+ new_gid == glyphID + (cp - startCharCode);
+ }
+
};
struct CmapSubtableFormat13 : CmapSubtableLongSegmented<CmapSubtableFormat13>
{
- static inline hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
- hb_codepoint_t u HB_UNUSED)
+ static hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
+ hb_codepoint_t u HB_UNUSED)
{ return group.glyphID; }
};
@@ -302,76 +654,201 @@ typedef enum
struct UnicodeValueRange
{
- inline int cmp (const hb_codepoint_t &codepoint) const
+ int cmp (const hb_codepoint_t &codepoint) const
{
if (codepoint < startUnicodeValue) return -1;
if (codepoint > startUnicodeValue + additionalCount) return +1;
return 0;
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
- UINT24 startUnicodeValue; /* First value in this range. */
- UINT8 additionalCount; /* Number of additional values in this
+ HBUINT24 startUnicodeValue; /* First value in this range. */
+ HBUINT8 additionalCount; /* Number of additional values in this
* range. */
public:
DEFINE_SIZE_STATIC (4);
};
-typedef SortedArrayOf<UnicodeValueRange, UINT32> DefaultUVS;
-
-struct UVSMapping
+struct DefaultUVS : SortedArrayOf<UnicodeValueRange, HBUINT32>
{
- inline int cmp (const hb_codepoint_t &codepoint) const
+ void collect_unicodes (hb_set_t *out) const
{
- return unicodeValue.cmp (codepoint);
+ unsigned int count = len;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ hb_codepoint_t first = arrayZ[i].startUnicodeValue;
+ hb_codepoint_t last = hb_min ((hb_codepoint_t) (first + arrayZ[i].additionalCount),
+ (hb_codepoint_t) HB_UNICODE_MAX);
+ out->add_range (first, last);
+ }
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ DefaultUVS* copy (hb_serialize_context_t *c,
+ const hb_set_t *unicodes) const
+ {
+ DefaultUVS *out = c->start_embed<DefaultUVS> ();
+ if (unlikely (!out)) return nullptr;
+ auto snap = c->snapshot ();
+
+ HBUINT32 len;
+ len = 0;
+ if (unlikely (!c->copy<HBUINT32> (len))) return nullptr;
+ unsigned init_len = c->length ();
+
+ hb_codepoint_t lastCode = HB_MAP_VALUE_INVALID;
+ int count = -1;
+
+ for (const UnicodeValueRange& _ : as_array ())
+ {
+ for (const unsigned addcnt : hb_range ((unsigned) _.additionalCount + 1))
+ {
+ unsigned curEntry = (unsigned) _.startUnicodeValue + addcnt;
+ if (!unicodes->has (curEntry)) continue;
+ count += 1;
+ if (lastCode == HB_MAP_VALUE_INVALID)
+ lastCode = curEntry;
+ else if (lastCode + count != curEntry)
+ {
+ UnicodeValueRange rec;
+ rec.startUnicodeValue = lastCode;
+ rec.additionalCount = count - 1;
+ c->copy<UnicodeValueRange> (rec);
+
+ lastCode = curEntry;
+ count = 0;
+ }
+ }
+ }
+
+ if (lastCode != HB_MAP_VALUE_INVALID)
+ {
+ UnicodeValueRange rec;
+ rec.startUnicodeValue = lastCode;
+ rec.additionalCount = count;
+ c->copy<UnicodeValueRange> (rec);
+ }
+
+ if (c->length () - init_len == 0)
+ {
+ c->revert (snap);
+ return nullptr;
+ }
+ else
+ {
+ if (unlikely (!c->check_assign (out->len, (c->length () - init_len) / UnicodeValueRange::static_size))) return nullptr;
+ return out;
+ }
+ }
+
+ public:
+ DEFINE_SIZE_ARRAY (4, *this);
+};
+
+struct UVSMapping
+{
+ int cmp (const hb_codepoint_t &codepoint) const
+ { return unicodeValue.cmp (codepoint); }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
- UINT24 unicodeValue; /* Base Unicode value of the UVS */
- GlyphID glyphID; /* Glyph ID of the UVS */
+ HBUINT24 unicodeValue; /* Base Unicode value of the UVS */
+ HBGlyphID glyphID; /* Glyph ID of the UVS */
public:
DEFINE_SIZE_STATIC (5);
};
-typedef SortedArrayOf<UVSMapping, UINT32> NonDefaultUVS;
+struct NonDefaultUVS : SortedArrayOf<UVSMapping, HBUINT32>
+{
+ void collect_unicodes (hb_set_t *out) const
+ {
+ unsigned int count = len;
+ for (unsigned int i = 0; i < count; i++)
+ out->add (arrayZ[i].glyphID);
+ }
+
+ void closure_glyphs (const hb_set_t *unicodes,
+ hb_set_t *glyphset) const
+ {
+ + as_array ()
+ | hb_filter (unicodes, &UVSMapping::unicodeValue)
+ | hb_map (&UVSMapping::glyphID)
+ | hb_sink (glyphset)
+ ;
+ }
+
+ NonDefaultUVS* copy (hb_serialize_context_t *c,
+ const hb_set_t *unicodes,
+ const hb_set_t *glyphs,
+ const hb_map_t *glyph_map) const
+ {
+ NonDefaultUVS *out = c->start_embed<NonDefaultUVS> ();
+ if (unlikely (!out)) return nullptr;
+
+ auto it =
+ + as_array ()
+ | hb_filter ([&] (const UVSMapping& _)
+ {
+ return unicodes->has (_.unicodeValue) || glyphs->has (_.glyphID);
+ })
+ ;
+
+ if (!it) return nullptr;
+
+ HBUINT32 len;
+ len = it.len ();
+ if (unlikely (!c->copy<HBUINT32> (len))) return nullptr;
+
+ for (const UVSMapping& _ : it)
+ {
+ UVSMapping mapping;
+ mapping.unicodeValue = _.unicodeValue;
+ mapping.glyphID = glyph_map->get (_.glyphID);
+ c->copy<UVSMapping> (mapping);
+ }
+
+ return out;
+ }
+
+ public:
+ DEFINE_SIZE_ARRAY (4, *this);
+};
struct VariationSelectorRecord
{
- inline glyph_variant_t get_glyph (hb_codepoint_t codepoint,
- hb_codepoint_t *glyph,
- const void *base) const
- {
- int i;
- const DefaultUVS &defaults = base+defaultUVS;
- i = defaults.bsearch (codepoint);
- if (i != -1)
+ glyph_variant_t get_glyph (hb_codepoint_t codepoint,
+ hb_codepoint_t *glyph,
+ const void *base) const
+ {
+ if ((base+defaultUVS).bfind (codepoint))
return GLYPH_VARIANT_USE_DEFAULT;
- const NonDefaultUVS &nonDefaults = base+nonDefaultUVS;
- i = nonDefaults.bsearch (codepoint);
- if (i != -1)
+ const UVSMapping &nonDefault = (base+nonDefaultUVS).bsearch (codepoint);
+ if (nonDefault.glyphID)
{
- *glyph = nonDefaults[i].glyphID;
+ *glyph = nonDefault.glyphID;
return GLYPH_VARIANT_FOUND;
}
return GLYPH_VARIANT_NOT_FOUND;
}
- inline int cmp (const hb_codepoint_t &variation_selector) const
+ void collect_unicodes (hb_set_t *out, const void *base) const
{
- return varSelector.cmp (variation_selector);
+ (base+defaultUVS).collect_unicodes (out);
+ (base+nonDefaultUVS).collect_unicodes (out);
}
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ int cmp (const hb_codepoint_t &variation_selector) const
+ { return varSelector.cmp (variation_selector); }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -379,25 +856,117 @@ struct VariationSelectorRecord
nonDefaultUVS.sanitize (c, base));
}
- UINT24 varSelector; /* Variation selector. */
+ VariationSelectorRecord* copy (hb_serialize_context_t *c,
+ const hb_set_t *unicodes,
+ const hb_set_t *glyphs,
+ const hb_map_t *glyph_map,
+ const void *src_base,
+ const void *dst_base) const
+ {
+ auto snap = c->snapshot ();
+ auto *out = c->embed<VariationSelectorRecord> (*this);
+ if (unlikely (!out)) return nullptr;
+
+ out->defaultUVS = 0;
+ out->nonDefaultUVS = 0;
+
+ bool drop = true;
+
+ if (defaultUVS != 0)
+ {
+ c->push ();
+ if (c->copy (src_base+defaultUVS, unicodes))
+ {
+ c->add_link (out->defaultUVS, c->pop_pack (), dst_base);
+ drop = false;
+ }
+ else c->pop_discard ();
+ }
+
+ if (nonDefaultUVS != 0)
+ {
+ c->push ();
+ if (c->copy (src_base+nonDefaultUVS, unicodes, glyphs, glyph_map))
+ {
+ c->add_link (out->nonDefaultUVS, c->pop_pack (), dst_base);
+ drop = false;
+ }
+ else c->pop_discard ();
+ }
+
+ if (drop)
+ {
+ c->revert (snap);
+ return nullptr;
+ }
+ else return out;
+ }
+
+ HBUINT24 varSelector; /* Variation selector. */
LOffsetTo<DefaultUVS>
- defaultUVS; /* Offset to Default UVS Table. May be 0. */
+ defaultUVS; /* Offset to Default UVS Table. May be 0. */
LOffsetTo<NonDefaultUVS>
- nonDefaultUVS; /* Offset to Non-Default UVS Table. May be 0. */
+ nonDefaultUVS; /* Offset to Non-Default UVS Table. May be 0. */
public:
DEFINE_SIZE_STATIC (11);
};
struct CmapSubtableFormat14
{
- inline glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph) const
+ glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph) const
+ { return record.bsearch (variation_selector).get_glyph (codepoint, glyph, this); }
+
+ void collect_variation_selectors (hb_set_t *out) const
+ {
+ unsigned int count = record.len;
+ for (unsigned int i = 0; i < count; i++)
+ out->add (record.arrayZ[i].varSelector);
+ }
+ void collect_variation_unicodes (hb_codepoint_t variation_selector,
+ hb_set_t *out) const
+ { record.bsearch (variation_selector).collect_unicodes (out, this); }
+
+ void serialize (hb_serialize_context_t *c,
+ const hb_set_t *unicodes,
+ const hb_set_t *glyphs,
+ const hb_map_t *glyph_map,
+ const void *src_base)
+ {
+ auto snap = c->snapshot ();
+ unsigned table_initpos = c->length ();
+ const char* init_tail = c->tail;
+
+ if (unlikely (!c->extend_min (*this))) return;
+ this->format = 14;
+
+ const CmapSubtableFormat14 *src_tbl = reinterpret_cast<const CmapSubtableFormat14*> (src_base);
+ for (const VariationSelectorRecord& _ : src_tbl->record)
+ c->copy (_, unicodes, glyphs, glyph_map, src_base, this);
+
+ if (c->length () - table_initpos == CmapSubtableFormat14::min_size)
+ c->revert (snap);
+ else
+ {
+ int tail_len = init_tail - c->tail;
+ c->check_assign (this->length, c->length () - table_initpos + tail_len);
+ c->check_assign (this->record.len, (c->length () - table_initpos - CmapSubtableFormat14::min_size) / VariationSelectorRecord::static_size);
+ }
+ }
+
+ void closure_glyphs (const hb_set_t *unicodes,
+ hb_set_t *glyphset) const
{
- return record[record.bsearch(variation_selector)].get_glyph (codepoint, glyph, this);
+ + hb_iter (record)
+ | hb_filter (hb_bool, &VariationSelectorRecord::nonDefaultUVS)
+ | hb_map (&VariationSelectorRecord::nonDefaultUVS)
+ | hb_map (hb_add (this))
+ | hb_apply ([=] (const NonDefaultUVS& _) { _.closure_glyphs (unicodes, glyphset); })
+ ;
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -405,9 +974,9 @@ struct CmapSubtableFormat14
}
protected:
- UINT16 format; /* Format number is set to 14. */
- UINT32 lengthZ; /* Byte length of this subtable. */
- SortedArrayOf<VariationSelectorRecord, UINT32>
+ HBUINT16 format; /* Format number is set to 14. */
+ HBUINT32 length; /* Byte length of this subtable. */
+ SortedArrayOf<VariationSelectorRecord, HBUINT32>
record; /* Variation selector records; sorted
* in increasing order of `varSelector'. */
public:
@@ -418,22 +987,51 @@ struct CmapSubtable
{
/* Note: We intentionally do NOT implement subtable formats 2 and 8. */
- inline bool get_glyph (hb_codepoint_t codepoint,
- hb_codepoint_t *glyph) const
+ bool get_glyph (hb_codepoint_t codepoint,
+ hb_codepoint_t *glyph) const
{
switch (u.format) {
- case 0: return u.format0 .get_glyph(codepoint, glyph);
- case 4: return u.format4 .get_glyph(codepoint, glyph);
- case 6: return u.format6 .get_glyph(codepoint, glyph);
- case 10: return u.format10.get_glyph(codepoint, glyph);
- case 12: return u.format12.get_glyph(codepoint, glyph);
- case 13: return u.format13.get_glyph(codepoint, glyph);
+ case 0: return u.format0 .get_glyph (codepoint, glyph);
+ case 4: return u.format4 .get_glyph (codepoint, glyph);
+ case 6: return u.format6 .get_glyph (codepoint, glyph);
+ case 10: return u.format10.get_glyph (codepoint, glyph);
+ case 12: return u.format12.get_glyph (codepoint, glyph);
+ case 13: return u.format13.get_glyph (codepoint, glyph);
case 14:
default: return false;
}
}
+ void collect_unicodes (hb_set_t *out) const
+ {
+ switch (u.format) {
+ case 0: u.format0 .collect_unicodes (out); return;
+ case 4: u.format4 .collect_unicodes (out); return;
+ case 6: u.format6 .collect_unicodes (out); return;
+ case 10: u.format10.collect_unicodes (out); return;
+ case 12: u.format12.collect_unicodes (out); return;
+ case 13: u.format13.collect_unicodes (out); return;
+ case 14:
+ default: return;
+ }
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ void serialize (hb_serialize_context_t *c,
+ Iterator it,
+ unsigned format,
+ const hb_subset_plan_t *plan,
+ const void *src_base)
+ {
+ switch (format) {
+ case 4: u.format4.serialize (c, it); return;
+ case 12: u.format12.serialize (c, it); return;
+ case 14: u.format14.serialize (c, plan->unicodes, plan->_glyphset, plan->glyph_map, src_base); return;
+ default: return;
+ }
+ }
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
if (!u.format.sanitize (c)) return_trace (false);
@@ -451,7 +1049,7 @@ struct CmapSubtable
public:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
CmapSubtableFormat0 format0;
CmapSubtableFormat4 format4;
CmapSubtableFormat6 format6;
@@ -467,7 +1065,7 @@ struct CmapSubtable
struct EncodingRecord
{
- inline int cmp (const EncodingRecord &other) const
+ int cmp (const EncodingRecord &other) const
{
int ret;
ret = platformID.cmp (other.platformID);
@@ -477,15 +1075,50 @@ struct EncodingRecord
return 0;
}
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
subtable.sanitize (c, base));
}
- UINT16 platformID; /* Platform ID. */
- UINT16 encodingID; /* Platform-specific encoding ID. */
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ EncodingRecord* copy (hb_serialize_context_t *c,
+ Iterator it,
+ unsigned format,
+ const void *src_base,
+ const void *dst_base,
+ const hb_subset_plan_t *plan,
+ /* INOUT */ unsigned *objidx) const
+ {
+ TRACE_SERIALIZE (this);
+ auto snap = c->snapshot ();
+ auto *out = c->embed (this);
+ if (unlikely (!out)) return_trace (nullptr);
+ out->subtable = 0;
+
+ if (*objidx == 0)
+ {
+ CmapSubtable *cmapsubtable = c->push<CmapSubtable> ();
+ unsigned origin_length = c->length ();
+ cmapsubtable->serialize (c, it, format, plan, &(src_base+subtable));
+ if (c->length () - origin_length > 0) *objidx = c->pop_pack ();
+ else c->pop_discard ();
+ }
+
+ if (*objidx == 0)
+ {
+ c->revert (snap);
+ return_trace (nullptr);
+ }
+
+ c->add_link (out->subtable, *objidx, dst_base);
+ return_trace (out);
+ }
+
+ HBUINT16 platformID; /* Platform ID. */
+ HBUINT16 encodingID; /* Platform-specific encoding ID. */
LOffsetTo<CmapSubtable>
subtable; /* Byte offset from beginning of table to the subtable for this encoding. */
public:
@@ -494,119 +1127,244 @@ struct EncodingRecord
struct cmap
{
- static const hb_tag_t tableTag = HB_OT_TAG_cmap;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_cmap;
+
+ template<typename Iterator, typename EncodingRecIter,
+ hb_requires (hb_is_iterator (Iterator))>
+ void serialize (hb_serialize_context_t *c,
+ Iterator it,
+ EncodingRecIter encodingrec_iter,
+ const void *src_base,
+ const hb_subset_plan_t *plan)
+ {
+ if (unlikely (!c->extend_min ((*this)))) return;
+ this->version = 0;
- inline bool sanitize (hb_sanitize_context_t *c) const
+ unsigned format4objidx = 0, format12objidx = 0, format14objidx = 0;
+
+ for (const EncodingRecord& _ : encodingrec_iter)
+ {
+ unsigned format = (src_base+_.subtable).u.format;
+
+ if (format == 4) c->copy (_, it, 4u, src_base, this, plan, &format4objidx);
+ else if (format == 12) c->copy (_, it, 12u, src_base, this, plan, &format12objidx);
+ else if (format == 14) c->copy (_, it, 14u, src_base, this, plan, &format14objidx);
+ }
+
+ c->check_assign(this->encodingRecord.len, (c->length () - cmap::min_size)/EncodingRecord::static_size);
+ }
+
+ void closure_glyphs (const hb_set_t *unicodes,
+ hb_set_t *glyphset) const
{
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- likely (version == 0) &&
- encodingRecord.sanitize (c, this));
+ + hb_iter (encodingRecord)
+ | hb_map (&EncodingRecord::subtable)
+ | hb_map (hb_add (this))
+ | hb_filter ([&] (const CmapSubtable& _) { return _.u.format == 14; })
+ | hb_apply ([=] (const CmapSubtable& _) { _.u.format14.closure_glyphs (unicodes, glyphset); })
+ ;
}
- struct accelerator_t
+ bool subset (hb_subset_context_t *c) const
{
- inline void init (hb_face_t *face)
+ TRACE_SUBSET (this);
+
+ cmap *cmap_prime = c->serializer->start_embed<cmap> ();
+ if (unlikely (!c->serializer->check_success (cmap_prime))) return_trace (false);
+
+ auto encodingrec_iter =
+ + hb_iter (encodingRecord)
+ | hb_filter ([&] (const EncodingRecord& _)
+ {
+ if ((_.platformID == 0 && _.encodingID == 3) ||
+ (_.platformID == 0 && _.encodingID == 4) ||
+ (_.platformID == 3 && _.encodingID == 1) ||
+ (_.platformID == 3 && _.encodingID == 10) ||
+ (this + _.subtable).u.format == 14)
+ return true;
+
+ return false;
+ })
+ ;
+
+
+ if (unlikely (!encodingrec_iter.len ())) return_trace (false);
+
+ const EncodingRecord *unicode_bmp= nullptr, *unicode_ucs4 = nullptr, *ms_bmp = nullptr, *ms_ucs4 = nullptr;
+ bool has_format12 = false;
+
+ for (const EncodingRecord& _ : encodingrec_iter)
{
- this->blob = OT::Sanitizer<OT::cmap>::sanitize (face->reference_table (HB_OT_TAG_cmap));
- const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (this->blob);
- const OT::CmapSubtable *subtable = nullptr;
- const OT::CmapSubtableFormat14 *subtable_uvs = nullptr;
-
- bool symbol = false;
- /* 32-bit subtables. */
- if (!subtable) subtable = cmap->find_subtable (3, 10);
- if (!subtable) subtable = cmap->find_subtable (0, 6);
- if (!subtable) subtable = cmap->find_subtable (0, 4);
- /* 16-bit subtables. */
- if (!subtable) subtable = cmap->find_subtable (3, 1);
- if (!subtable) subtable = cmap->find_subtable (0, 3);
- if (!subtable) subtable = cmap->find_subtable (0, 2);
- if (!subtable) subtable = cmap->find_subtable (0, 1);
- if (!subtable) subtable = cmap->find_subtable (0, 0);
- if (!subtable)
- {
- subtable = cmap->find_subtable (3, 0);
- if (subtable) symbol = true;
- }
- /* Meh. */
- if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
+ unsigned format = (this + _.subtable).u.format;
+ if (format == 12) has_format12 = true;
+
+ const EncodingRecord *table = hb_addressof (_);
+ if (_.platformID == 0 && _.encodingID == 3) unicode_bmp = table;
+ else if (_.platformID == 0 && _.encodingID == 4) unicode_ucs4 = table;
+ else if (_.platformID == 3 && _.encodingID == 1) ms_bmp = table;
+ else if (_.platformID == 3 && _.encodingID == 10) ms_ucs4 = table;
+ }
+
+ if (unlikely (!unicode_bmp && !ms_bmp)) return_trace (false);
+ if (unlikely (has_format12 && (!unicode_ucs4 && !ms_ucs4))) return_trace (false);
+
+ auto it =
+ + hb_iter (c->plan->unicodes)
+ | hb_map ([&] (hb_codepoint_t _)
+ {
+ hb_codepoint_t new_gid = HB_MAP_VALUE_INVALID;
+ c->plan->new_gid_for_codepoint (_, &new_gid);
+ return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (_, new_gid);
+ })
+ | hb_filter ([&] (const hb_pair_t<hb_codepoint_t, hb_codepoint_t> _)
+ { return (_.second != HB_MAP_VALUE_INVALID); })
+ ;
+
+ cmap_prime->serialize (c->serializer, it, encodingrec_iter, this, c->plan);
+ return_trace (true);
+ }
+
+ const CmapSubtable *find_best_subtable (bool *symbol = nullptr) const
+ {
+ if (symbol) *symbol = false;
+
+ const CmapSubtable *subtable;
+
+ /* Symbol subtable.
+ * Prefer symbol if available.
+ * https://github.com/harfbuzz/harfbuzz/issues/1918 */
+ if ((subtable = this->find_subtable (3, 0)))
+ {
+ if (symbol) *symbol = true;
+ return subtable;
+ }
+
+ /* 32-bit subtables. */
+ if ((subtable = this->find_subtable (3, 10))) return subtable;
+ if ((subtable = this->find_subtable (0, 6))) return subtable;
+ if ((subtable = this->find_subtable (0, 4))) return subtable;
+
+ /* 16-bit subtables. */
+ if ((subtable = this->find_subtable (3, 1))) return subtable;
+ if ((subtable = this->find_subtable (0, 3))) return subtable;
+ if ((subtable = this->find_subtable (0, 2))) return subtable;
+ if ((subtable = this->find_subtable (0, 1))) return subtable;
+ if ((subtable = this->find_subtable (0, 0))) return subtable;
+
+ /* Meh. */
+ return &Null (CmapSubtable);
+ }
- /* UVS subtable. */
- if (!subtable_uvs)
+ struct accelerator_t
+ {
+ void init (hb_face_t *face)
+ {
+ this->table = hb_sanitize_context_t ().reference_table<cmap> (face);
+ bool symbol;
+ this->subtable = table->find_best_subtable (&symbol);
+ this->subtable_uvs = &Null (CmapSubtableFormat14);
{
- const OT::CmapSubtable *st = cmap->find_subtable (0, 5);
+ const CmapSubtable *st = table->find_subtable (0, 5);
if (st && st->u.format == 14)
subtable_uvs = &st->u.format14;
}
- /* Meh. */
- if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtableFormat14);
-
- this->uvs_table = subtable_uvs;
this->get_glyph_data = subtable;
if (unlikely (symbol))
- this->get_glyph_func = get_glyph_from_symbol<OT::CmapSubtable>;
+ this->get_glyph_funcZ = get_glyph_from_symbol<CmapSubtable>;
else
+ {
switch (subtable->u.format) {
/* Accelerate format 4 and format 12. */
- default: this->get_glyph_func = get_glyph_from<OT::CmapSubtable>; break;
- case 12: this->get_glyph_func = get_glyph_from<OT::CmapSubtableFormat12>; break;
+ default:
+ this->get_glyph_funcZ = get_glyph_from<CmapSubtable>;
+ break;
+ case 12:
+ this->get_glyph_funcZ = get_glyph_from<CmapSubtableFormat12>;
+ break;
case 4:
- {
- this->format4_accel.init (&subtable->u.format4);
- this->get_glyph_data = &this->format4_accel;
- this->get_glyph_func = this->format4_accel.get_glyph_func;
- }
+ {
+ this->format4_accel.init (&subtable->u.format4);
+ this->get_glyph_data = &this->format4_accel;
+ this->get_glyph_funcZ = this->format4_accel.get_glyph_func;
break;
}
+ }
+ }
}
- inline void fini (void)
+ void fini () { this->table.destroy (); }
+
+ bool get_nominal_glyph (hb_codepoint_t unicode,
+ hb_codepoint_t *glyph) const
{
- hb_blob_destroy (this->blob);
+ if (unlikely (!this->get_glyph_funcZ)) return false;
+ return this->get_glyph_funcZ (this->get_glyph_data, unicode, glyph);
}
-
- inline bool get_nominal_glyph (hb_codepoint_t unicode,
- hb_codepoint_t *glyph) const
+ unsigned int get_nominal_glyphs (unsigned int count,
+ const hb_codepoint_t *first_unicode,
+ unsigned int unicode_stride,
+ hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride) const
{
- return this->get_glyph_func (this->get_glyph_data, unicode, glyph);
+ if (unlikely (!this->get_glyph_funcZ)) return 0;
+
+ hb_cmap_get_glyph_func_t get_glyph_funcZ = this->get_glyph_funcZ;
+ const void *get_glyph_data = this->get_glyph_data;
+
+ unsigned int done;
+ for (done = 0;
+ done < count && get_glyph_funcZ (get_glyph_data, *first_unicode, first_glyph);
+ done++)
+ {
+ first_unicode = &StructAtOffsetUnaligned<hb_codepoint_t> (first_unicode, unicode_stride);
+ first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+ }
+ return done;
}
- inline bool get_variation_glyph (hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph) const
+ bool get_variation_glyph (hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph) const
{
- switch (this->uvs_table->get_glyph_variant (unicode,
- variation_selector,
- glyph))
+ switch (this->subtable_uvs->get_glyph_variant (unicode,
+ variation_selector,
+ glyph))
{
- case OT::GLYPH_VARIANT_NOT_FOUND: return false;
- case OT::GLYPH_VARIANT_FOUND: return true;
- case OT::GLYPH_VARIANT_USE_DEFAULT: break;
+ case GLYPH_VARIANT_NOT_FOUND: return false;
+ case GLYPH_VARIANT_FOUND: return true;
+ case GLYPH_VARIANT_USE_DEFAULT: break;
}
return get_nominal_glyph (unicode, glyph);
}
+ void collect_unicodes (hb_set_t *out) const
+ { subtable->collect_unicodes (out); }
+ void collect_variation_selectors (hb_set_t *out) const
+ { subtable_uvs->collect_variation_selectors (out); }
+ void collect_variation_unicodes (hb_codepoint_t variation_selector,
+ hb_set_t *out) const
+ { subtable_uvs->collect_variation_unicodes (variation_selector, out); }
+
protected:
typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
hb_codepoint_t codepoint,
hb_codepoint_t *glyph);
template <typename Type>
- static inline bool get_glyph_from (const void *obj,
- hb_codepoint_t codepoint,
- hb_codepoint_t *glyph)
+ HB_INTERNAL static bool get_glyph_from (const void *obj,
+ hb_codepoint_t codepoint,
+ hb_codepoint_t *glyph)
{
const Type *typed_obj = (const Type *) obj;
return typed_obj->get_glyph (codepoint, glyph);
}
template <typename Type>
- static inline bool get_glyph_from_symbol (const void *obj,
- hb_codepoint_t codepoint,
- hb_codepoint_t *glyph)
+ HB_INTERNAL static bool get_glyph_from_symbol (const void *obj,
+ hb_codepoint_t codepoint,
+ hb_codepoint_t *glyph)
{
const Type *typed_obj = (const Type *) obj;
if (likely (typed_obj->get_glyph (codepoint, glyph)))
@@ -617,7 +1375,7 @@ struct cmap
/* For symbol-encoded OpenType fonts, we duplicate the
* U+F000..F0FF range at U+0000..U+00FF. That's what
* Windows seems to do, and that's hinted about at:
- * http://www.microsoft.com/typography/otspec/recom.htm
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/recom
* under "Non-Standard (Symbol) Fonts". */
return typed_obj->get_glyph (0xF000u + codepoint, glyph);
}
@@ -626,41 +1384,75 @@ struct cmap
}
private:
- hb_cmap_get_glyph_func_t get_glyph_func;
+ hb_nonnull_ptr_t<const CmapSubtable> subtable;
+ hb_nonnull_ptr_t<const CmapSubtableFormat14> subtable_uvs;
+
+ hb_cmap_get_glyph_func_t get_glyph_funcZ;
const void *get_glyph_data;
- OT::CmapSubtableFormat4::accelerator_t format4_accel;
- const OT::CmapSubtableFormat14 *uvs_table;
- hb_blob_t *blob;
+ CmapSubtableFormat4::accelerator_t format4_accel;
+
+ public:
+ hb_blob_ptr_t<cmap> table;
};
protected:
- inline const CmapSubtable *find_subtable (unsigned int platform_id,
- unsigned int encoding_id) const
+ const CmapSubtable *find_subtable (unsigned int platform_id,
+ unsigned int encoding_id) const
{
EncodingRecord key;
- key.platformID.set (platform_id);
- key.encodingID.set (encoding_id);
-
- /* Note: We can use bsearch, but since it has no performance
- * implications, we use lsearch and as such accept fonts with
- * unsorted subtable list. */
- int result = encodingRecord./*bsearch*/lsearch (key);
- if (result == -1 || !encodingRecord[result].subtable)
+ key.platformID = platform_id;
+ key.encodingID = encoding_id;
+
+ const EncodingRecord &result = encodingRecord.bsearch (key);
+ if (!result.subtable)
return nullptr;
- return &(this+encodingRecord[result].subtable);
+ return &(this+result.subtable);
+ }
+
+ const EncodingRecord *find_encodingrec (unsigned int platform_id,
+ unsigned int encoding_id) const
+ {
+ EncodingRecord key;
+ key.platformID = platform_id;
+ key.encodingID = encoding_id;
+
+ return encodingRecord.as_array ().bsearch (key);
+ }
+
+ bool find_subtable (unsigned format) const
+ {
+ auto it =
+ + hb_iter (encodingRecord)
+ | hb_map (&EncodingRecord::subtable)
+ | hb_map (hb_add (this))
+ | hb_filter ([&] (const CmapSubtable& _) { return _.u.format == format; })
+ ;
+
+ return it.len ();
+ }
+
+ public:
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ likely (version == 0) &&
+ encodingRecord.sanitize (c, this));
}
protected:
- UINT16 version; /* Table version number (0). */
+ HBUINT16 version; /* Table version number (0). */
SortedArrayOf<EncodingRecord>
encodingRecord; /* Encoding tables. */
public:
DEFINE_SIZE_ARRAY (4, encodingRecord);
};
+struct cmap_accelerator_t : cmap::accelerator_t {};
} /* namespace OT */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-color-cbdt-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-color-cbdt-table.hh
new file mode 100644
index 0000000000..3498d3b360
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-color-cbdt-table.hh
@@ -0,0 +1,535 @@
+/*
+ * Copyright © 2016 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Seigo Nonaka
+ */
+
+#ifndef HB_OT_COLOR_CBDT_TABLE_HH
+#define HB_OT_COLOR_CBDT_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * CBLC -- Color Bitmap Location
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/cblc
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/eblc
+ * CBDT -- Color Bitmap Data
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/cbdt
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/ebdt
+ */
+#define HB_OT_TAG_CBLC HB_TAG('C','B','L','C')
+#define HB_OT_TAG_CBDT HB_TAG('C','B','D','T')
+
+
+namespace OT {
+
+struct SmallGlyphMetrics
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ void get_extents (hb_font_t *font, hb_glyph_extents_t *extents) const
+ {
+ extents->x_bearing = font->em_scale_x (bearingX);
+ extents->y_bearing = font->em_scale_y (bearingY);
+ extents->width = font->em_scale_x (width);
+ extents->height = font->em_scale_y (-height);
+ }
+
+ HBUINT8 height;
+ HBUINT8 width;
+ HBINT8 bearingX;
+ HBINT8 bearingY;
+ HBUINT8 advance;
+ public:
+ DEFINE_SIZE_STATIC(5);
+};
+
+struct BigGlyphMetrics : SmallGlyphMetrics
+{
+ HBINT8 vertBearingX;
+ HBINT8 vertBearingY;
+ HBUINT8 vertAdvance;
+ public:
+ DEFINE_SIZE_STATIC(8);
+};
+
+struct SBitLineMetrics
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ HBINT8 ascender;
+ HBINT8 decender;
+ HBUINT8 widthMax;
+ HBINT8 caretSlopeNumerator;
+ HBINT8 caretSlopeDenominator;
+ HBINT8 caretOffset;
+ HBINT8 minOriginSB;
+ HBINT8 minAdvanceSB;
+ HBINT8 maxBeforeBL;
+ HBINT8 minAfterBL;
+ HBINT8 padding1;
+ HBINT8 padding2;
+ public:
+ DEFINE_SIZE_STATIC(12);
+};
+
+
+/*
+ * Index Subtables.
+ */
+
+struct IndexSubtableHeader
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ HBUINT16 indexFormat;
+ HBUINT16 imageFormat;
+ HBUINT32 imageDataOffset;
+ public:
+ DEFINE_SIZE_STATIC(8);
+};
+
+template <typename OffsetType>
+struct IndexSubtableFormat1Or3
+{
+ bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ offsetArrayZ.sanitize (c, glyph_count + 1));
+ }
+
+ bool get_image_data (unsigned int idx,
+ unsigned int *offset,
+ unsigned int *length) const
+ {
+ if (unlikely (offsetArrayZ[idx + 1] <= offsetArrayZ[idx]))
+ return false;
+
+ *offset = header.imageDataOffset + offsetArrayZ[idx];
+ *length = offsetArrayZ[idx + 1] - offsetArrayZ[idx];
+ return true;
+ }
+
+ IndexSubtableHeader header;
+ UnsizedArrayOf<Offset<OffsetType>>
+ offsetArrayZ;
+ public:
+ DEFINE_SIZE_ARRAY(8, offsetArrayZ);
+};
+
+struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<HBUINT32> {};
+struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<HBUINT16> {};
+
+struct IndexSubtable
+{
+ bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
+ {
+ TRACE_SANITIZE (this);
+ if (!u.header.sanitize (c)) return_trace (false);
+ switch (u.header.indexFormat) {
+ case 1: return_trace (u.format1.sanitize (c, glyph_count));
+ case 3: return_trace (u.format3.sanitize (c, glyph_count));
+ default:return_trace (true);
+ }
+ }
+
+ bool get_extents (hb_glyph_extents_t *extents HB_UNUSED) const
+ {
+ switch (u.header.indexFormat) {
+ case 2: case 5: /* TODO */
+ case 1: case 3: case 4: /* Variable-metrics formats do not have metrics here. */
+ default:return (false);
+ }
+ }
+
+ bool get_image_data (unsigned int idx,
+ unsigned int *offset,
+ unsigned int *length,
+ unsigned int *format) const
+ {
+ *format = u.header.imageFormat;
+ switch (u.header.indexFormat) {
+ case 1: return u.format1.get_image_data (idx, offset, length);
+ case 3: return u.format3.get_image_data (idx, offset, length);
+ default: return false;
+ }
+ }
+
+ protected:
+ union {
+ IndexSubtableHeader header;
+ IndexSubtableFormat1 format1;
+ IndexSubtableFormat3 format3;
+ /* TODO: Format 2, 4, 5. */
+ } u;
+ public:
+ DEFINE_SIZE_UNION (8, header);
+};
+
+struct IndexSubtableRecord
+{
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ firstGlyphIndex <= lastGlyphIndex &&
+ offsetToSubtable.sanitize (c, base, lastGlyphIndex - firstGlyphIndex + 1));
+ }
+
+ bool get_extents (hb_glyph_extents_t *extents,
+ const void *base) const
+ {
+ return (base+offsetToSubtable).get_extents (extents);
+ }
+
+ bool get_image_data (unsigned int gid,
+ const void *base,
+ unsigned int *offset,
+ unsigned int *length,
+ unsigned int *format) const
+ {
+ if (gid < firstGlyphIndex || gid > lastGlyphIndex) return false;
+ return (base+offsetToSubtable).get_image_data (gid - firstGlyphIndex,
+ offset, length, format);
+ }
+
+ HBGlyphID firstGlyphIndex;
+ HBGlyphID lastGlyphIndex;
+ LOffsetTo<IndexSubtable> offsetToSubtable;
+ public:
+ DEFINE_SIZE_STATIC(8);
+};
+
+struct IndexSubtableArray
+{
+ friend struct CBDT;
+
+ bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (indexSubtablesZ.sanitize (c, count, this));
+ }
+
+ public:
+ const IndexSubtableRecord* find_table (hb_codepoint_t glyph, unsigned int numTables) const
+ {
+ for (unsigned int i = 0; i < numTables; ++i)
+ {
+ unsigned int firstGlyphIndex = indexSubtablesZ[i].firstGlyphIndex;
+ unsigned int lastGlyphIndex = indexSubtablesZ[i].lastGlyphIndex;
+ if (firstGlyphIndex <= glyph && glyph <= lastGlyphIndex)
+ return &indexSubtablesZ[i];
+ }
+ return nullptr;
+ }
+
+ protected:
+ UnsizedArrayOf<IndexSubtableRecord> indexSubtablesZ;
+};
+
+struct BitmapSizeTable
+{
+ friend struct CBLC;
+ friend struct CBDT;
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ indexSubtableArrayOffset.sanitize (c, base, numberOfIndexSubtables) &&
+ horizontal.sanitize (c) &&
+ vertical.sanitize (c));
+ }
+
+ const IndexSubtableRecord *find_table (hb_codepoint_t glyph,
+ const void *base,
+ const void **out_base) const
+ {
+ *out_base = &(base+indexSubtableArrayOffset);
+ return (base+indexSubtableArrayOffset).find_table (glyph, numberOfIndexSubtables);
+ }
+
+ protected:
+ LNNOffsetTo<IndexSubtableArray>
+ indexSubtableArrayOffset;
+ HBUINT32 indexTablesSize;
+ HBUINT32 numberOfIndexSubtables;
+ HBUINT32 colorRef;
+ SBitLineMetrics horizontal;
+ SBitLineMetrics vertical;
+ HBGlyphID startGlyphIndex;
+ HBGlyphID endGlyphIndex;
+ HBUINT8 ppemX;
+ HBUINT8 ppemY;
+ HBUINT8 bitDepth;
+ HBINT8 flags;
+ public:
+ DEFINE_SIZE_STATIC(48);
+};
+
+
+/*
+ * Glyph Bitmap Data Formats.
+ */
+
+struct GlyphBitmapDataFormat17
+{
+ SmallGlyphMetrics glyphMetrics;
+ LArrayOf<HBUINT8> data;
+ public:
+ DEFINE_SIZE_ARRAY(9, data);
+};
+
+struct GlyphBitmapDataFormat18
+{
+ BigGlyphMetrics glyphMetrics;
+ LArrayOf<HBUINT8> data;
+ public:
+ DEFINE_SIZE_ARRAY(12, data);
+};
+
+struct GlyphBitmapDataFormat19
+{
+ LArrayOf<HBUINT8> data;
+ public:
+ DEFINE_SIZE_ARRAY(4, data);
+};
+
+struct CBLC
+{
+ friend struct CBDT;
+
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_CBLC;
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ likely (version.major == 2 || version.major == 3) &&
+ sizeTables.sanitize (c, this));
+ }
+
+ protected:
+ const BitmapSizeTable &choose_strike (hb_font_t *font) const
+ {
+ unsigned count = sizeTables.len;
+ if (unlikely (!count))
+ return Null(BitmapSizeTable);
+
+ unsigned int requested_ppem = hb_max (font->x_ppem, font->y_ppem);
+ if (!requested_ppem)
+ requested_ppem = 1<<30; /* Choose largest strike. */
+ unsigned int best_i = 0;
+ unsigned int best_ppem = hb_max (sizeTables[0].ppemX, sizeTables[0].ppemY);
+
+ for (unsigned int i = 1; i < count; i++)
+ {
+ unsigned int ppem = hb_max (sizeTables[i].ppemX, sizeTables[i].ppemY);
+ if ((requested_ppem <= ppem && ppem < best_ppem) ||
+ (requested_ppem > best_ppem && ppem > best_ppem))
+ {
+ best_i = i;
+ best_ppem = ppem;
+ }
+ }
+
+ return sizeTables[best_i];
+ }
+
+ protected:
+ FixedVersion<> version;
+ LArrayOf<BitmapSizeTable> sizeTables;
+ public:
+ DEFINE_SIZE_ARRAY(8, sizeTables);
+};
+
+struct CBDT
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_CBDT;
+
+ struct accelerator_t
+ {
+ void init (hb_face_t *face)
+ {
+ cblc = hb_sanitize_context_t().reference_table<CBLC> (face);
+ cbdt = hb_sanitize_context_t().reference_table<CBDT> (face);
+
+ upem = hb_face_get_upem (face);
+ }
+
+ void fini ()
+ {
+ this->cblc.destroy ();
+ this->cbdt.destroy ();
+ }
+
+ bool get_extents (hb_font_t *font, hb_codepoint_t glyph,
+ hb_glyph_extents_t *extents) const
+ {
+ const void *base;
+ const BitmapSizeTable &strike = this->cblc->choose_strike (font);
+ const IndexSubtableRecord *subtable_record = strike.find_table (glyph, cblc, &base);
+ if (!subtable_record || !strike.ppemX || !strike.ppemY)
+ return false;
+
+ if (subtable_record->get_extents (extents, base))
+ return true;
+
+ unsigned int image_offset = 0, image_length = 0, image_format = 0;
+ if (!subtable_record->get_image_data (glyph, base, &image_offset, &image_length, &image_format))
+ return false;
+
+ {
+ unsigned int cbdt_len = cbdt.get_length ();
+ if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
+ return false;
+
+ switch (image_format)
+ {
+ case 17: {
+ if (unlikely (image_length < GlyphBitmapDataFormat17::min_size))
+ return false;
+ const GlyphBitmapDataFormat17& glyphFormat17 =
+ StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
+ glyphFormat17.glyphMetrics.get_extents (font, extents);
+ break;
+ }
+ case 18: {
+ if (unlikely (image_length < GlyphBitmapDataFormat18::min_size))
+ return false;
+ const GlyphBitmapDataFormat18& glyphFormat18 =
+ StructAtOffset<GlyphBitmapDataFormat18> (this->cbdt, image_offset);
+ glyphFormat18.glyphMetrics.get_extents (font, extents);
+ break;
+ }
+ default:
+ // TODO: Support other image formats.
+ return false;
+ }
+ }
+
+ /* Convert to font units. */
+ float x_scale = upem / (float) strike.ppemX;
+ float y_scale = upem / (float) strike.ppemY;
+ extents->x_bearing = roundf (extents->x_bearing * x_scale);
+ extents->y_bearing = roundf (extents->y_bearing * y_scale);
+ extents->width = roundf (extents->width * x_scale);
+ extents->height = roundf (extents->height * y_scale);
+
+ return true;
+ }
+
+ hb_blob_t* reference_png (hb_font_t *font,
+ hb_codepoint_t glyph) const
+ {
+ const void *base;
+ const BitmapSizeTable &strike = this->cblc->choose_strike (font);
+ const IndexSubtableRecord *subtable_record = strike.find_table (glyph, cblc, &base);
+ if (!subtable_record || !strike.ppemX || !strike.ppemY)
+ return hb_blob_get_empty ();
+
+ unsigned int image_offset = 0, image_length = 0, image_format = 0;
+ if (!subtable_record->get_image_data (glyph, base, &image_offset, &image_length, &image_format))
+ return hb_blob_get_empty ();
+
+ {
+ unsigned int cbdt_len = cbdt.get_length ();
+ if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
+ return hb_blob_get_empty ();
+
+ switch (image_format)
+ {
+ case 17: {
+ if (unlikely (image_length < GlyphBitmapDataFormat17::min_size))
+ return hb_blob_get_empty ();
+ const GlyphBitmapDataFormat17& glyphFormat17 =
+ StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
+ return hb_blob_create_sub_blob (cbdt.get_blob (),
+ image_offset + GlyphBitmapDataFormat17::min_size,
+ glyphFormat17.data.len);
+ }
+ case 18: {
+ if (unlikely (image_length < GlyphBitmapDataFormat18::min_size))
+ return hb_blob_get_empty ();
+ const GlyphBitmapDataFormat18& glyphFormat18 =
+ StructAtOffset<GlyphBitmapDataFormat18> (this->cbdt, image_offset);
+ return hb_blob_create_sub_blob (cbdt.get_blob (),
+ image_offset + GlyphBitmapDataFormat18::min_size,
+ glyphFormat18.data.len);
+ }
+ case 19: {
+ if (unlikely (image_length < GlyphBitmapDataFormat19::min_size))
+ return hb_blob_get_empty ();
+ const GlyphBitmapDataFormat19& glyphFormat19 =
+ StructAtOffset<GlyphBitmapDataFormat19> (this->cbdt, image_offset);
+ return hb_blob_create_sub_blob (cbdt.get_blob (),
+ image_offset + GlyphBitmapDataFormat19::min_size,
+ glyphFormat19.data.len);
+ }
+ }
+ }
+
+ return hb_blob_get_empty ();
+ }
+
+ bool has_data () const { return cbdt.get_length (); }
+
+ private:
+ hb_blob_ptr_t<CBLC> cblc;
+ hb_blob_ptr_t<CBDT> cbdt;
+
+ unsigned int upem;
+ };
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ likely (version.major == 2 || version.major == 3));
+ }
+
+ protected:
+ FixedVersion<> version;
+ UnsizedArrayOf<HBUINT8> dataZ;
+ public:
+ DEFINE_SIZE_ARRAY(4, dataZ);
+};
+
+struct CBDT_accelerator_t : CBDT::accelerator_t {};
+
+} /* namespace OT */
+
+#endif /* HB_OT_COLOR_CBDT_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-color-colr-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-color-colr-table.hh
new file mode 100644
index 0000000000..e2ed7c6549
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-color-colr-table.hh
@@ -0,0 +1,138 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_COLOR_COLR_TABLE_HH
+#define HB_OT_COLOR_COLR_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * COLR -- Color
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/colr
+ */
+#define HB_OT_TAG_COLR HB_TAG('C','O','L','R')
+
+
+namespace OT {
+
+
+struct LayerRecord
+{
+ operator hb_ot_color_layer_t () const { return {glyphId, colorIdx}; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ protected:
+ HBGlyphID glyphId; /* Glyph ID of layer glyph */
+ Index colorIdx; /* Index value to use with a
+ * selected color palette.
+ * An index value of 0xFFFF
+ * is a special case indicating
+ * that the text foreground
+ * color (defined by a
+ * higher-level client) should
+ * be used and shall not be
+ * treated as actual index
+ * into CPAL ColorRecord array. */
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+struct BaseGlyphRecord
+{
+ int cmp (hb_codepoint_t g) const
+ { return g < glyphId ? -1 : g > glyphId ? 1 : 0; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ public:
+ HBGlyphID glyphId; /* Glyph ID of reference glyph */
+ HBUINT16 firstLayerIdx; /* Index (from beginning of
+ * the Layer Records) to the
+ * layer record. There will be
+ * numLayers consecutive entries
+ * for this base glyph. */
+ HBUINT16 numLayers; /* Number of color layers
+ * associated with this glyph */
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+struct COLR
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_COLR;
+
+ bool has_data () const { return numBaseGlyphs; }
+
+ unsigned int get_glyph_layers (hb_codepoint_t glyph,
+ unsigned int start_offset,
+ unsigned int *count, /* IN/OUT. May be NULL. */
+ hb_ot_color_layer_t *layers /* OUT. May be NULL. */) const
+ {
+ const BaseGlyphRecord &record = (this+baseGlyphsZ).bsearch (numBaseGlyphs, glyph);
+
+ hb_array_t<const LayerRecord> all_layers = (this+layersZ).as_array (numLayers);
+ hb_array_t<const LayerRecord> glyph_layers = all_layers.sub_array (record.firstLayerIdx,
+ record.numLayers);
+ if (count)
+ {
+ + glyph_layers.sub_array (start_offset, count)
+ | hb_sink (hb_array (layers, *count))
+ ;
+ }
+ return glyph_layers.length;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) &&
+ (this+layersZ).sanitize (c, numLayers)));
+ }
+
+ protected:
+ HBUINT16 version; /* Table version number (starts at 0). */
+ HBUINT16 numBaseGlyphs; /* Number of Base Glyph Records. */
+ LNNOffsetTo<SortedUnsizedArrayOf<BaseGlyphRecord>>
+ baseGlyphsZ; /* Offset to Base Glyph records. */
+ LNNOffsetTo<UnsizedArrayOf<LayerRecord>>
+ layersZ; /* Offset to Layer Records. */
+ HBUINT16 numLayers; /* Number of Layer Records. */
+ public:
+ DEFINE_SIZE_STATIC (14);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_COLOR_COLR_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-color-cpal-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-color-cpal-table.hh
new file mode 100644
index 0000000000..1b3c7fc0b8
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-color-cpal-table.hh
@@ -0,0 +1,193 @@
+/*
+ * Copyright © 2016 Google, Inc.
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Sascha Brawer
+ */
+
+#ifndef HB_OT_COLOR_CPAL_TABLE_HH
+#define HB_OT_COLOR_CPAL_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-color.h"
+#include "hb-ot-name.h"
+
+
+/*
+ * CPAL -- Color Palette
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/cpal
+ */
+#define HB_OT_TAG_CPAL HB_TAG('C','P','A','L')
+
+
+namespace OT {
+
+
+struct CPALV1Tail
+{
+ friend struct CPAL;
+
+ private:
+ hb_ot_color_palette_flags_t get_palette_flags (const void *base,
+ unsigned int palette_index,
+ unsigned int palette_count) const
+ {
+ if (!paletteFlagsZ) return HB_OT_COLOR_PALETTE_FLAG_DEFAULT;
+ return (hb_ot_color_palette_flags_t) (uint32_t)
+ (base+paletteFlagsZ).as_array (palette_count)[palette_index];
+ }
+
+ hb_ot_name_id_t get_palette_name_id (const void *base,
+ unsigned int palette_index,
+ unsigned int palette_count) const
+ {
+ if (!paletteLabelsZ) return HB_OT_NAME_ID_INVALID;
+ return (base+paletteLabelsZ).as_array (palette_count)[palette_index];
+ }
+
+ hb_ot_name_id_t get_color_name_id (const void *base,
+ unsigned int color_index,
+ unsigned int color_count) const
+ {
+ if (!colorLabelsZ) return HB_OT_NAME_ID_INVALID;
+ return (base+colorLabelsZ).as_array (color_count)[color_index];
+ }
+
+ public:
+ bool sanitize (hb_sanitize_context_t *c,
+ const void *base,
+ unsigned int palette_count,
+ unsigned int color_count) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ (!paletteFlagsZ || (base+paletteFlagsZ).sanitize (c, palette_count)) &&
+ (!paletteLabelsZ || (base+paletteLabelsZ).sanitize (c, palette_count)) &&
+ (!colorLabelsZ || (base+colorLabelsZ).sanitize (c, color_count)));
+ }
+
+ protected:
+ LNNOffsetTo<UnsizedArrayOf<HBUINT32>>
+ paletteFlagsZ; /* Offset from the beginning of CPAL table to
+ * the Palette Type Array. Set to 0 if no array
+ * is provided. */
+ LNNOffsetTo<UnsizedArrayOf<NameID>>
+ paletteLabelsZ; /* Offset from the beginning of CPAL table to
+ * the palette labels array. Set to 0 if no
+ * array is provided. */
+ LNNOffsetTo<UnsizedArrayOf<NameID>>
+ colorLabelsZ; /* Offset from the beginning of CPAL table to
+ * the color labels array. Set to 0
+ * if no array is provided. */
+ public:
+ DEFINE_SIZE_STATIC (12);
+};
+
+typedef HBUINT32 BGRAColor;
+
+struct CPAL
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_CPAL;
+
+ bool has_data () const { return numPalettes; }
+
+ unsigned int get_size () const
+ { return min_size + numPalettes * sizeof (colorRecordIndicesZ[0]); }
+
+ unsigned int get_palette_count () const { return numPalettes; }
+ unsigned int get_color_count () const { return numColors; }
+
+ hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette_index) const
+ { return v1 ().get_palette_flags (this, palette_index, numPalettes); }
+
+ hb_ot_name_id_t get_palette_name_id (unsigned int palette_index) const
+ { return v1 ().get_palette_name_id (this, palette_index, numPalettes); }
+
+ hb_ot_name_id_t get_color_name_id (unsigned int color_index) const
+ { return v1 ().get_color_name_id (this, color_index, numColors); }
+
+ unsigned int get_palette_colors (unsigned int palette_index,
+ unsigned int start_offset,
+ unsigned int *color_count, /* IN/OUT. May be NULL. */
+ hb_color_t *colors /* OUT. May be NULL. */) const
+ {
+ if (unlikely (palette_index >= numPalettes))
+ {
+ if (color_count) *color_count = 0;
+ return 0;
+ }
+ unsigned int start_index = colorRecordIndicesZ[palette_index];
+ hb_array_t<const BGRAColor> all_colors ((this+colorRecordsZ).arrayZ, numColorRecords);
+ hb_array_t<const BGRAColor> palette_colors = all_colors.sub_array (start_index,
+ numColors);
+ if (color_count)
+ {
+ hb_array_t<const BGRAColor> segment_colors = palette_colors.sub_array (start_offset, *color_count);
+ /* Always return numColors colors per palette even if it has out-of-bounds start index. */
+ unsigned int count = hb_min ((unsigned) hb_max ((int) (numColors - start_offset), 0), *color_count);
+ *color_count = count;
+ for (unsigned int i = 0; i < count; i++)
+ colors[i] = segment_colors[i]; /* Bound-checked read. */
+ }
+ return numColors;
+ }
+
+ private:
+ const CPALV1Tail& v1 () const
+ {
+ if (version == 0) return Null(CPALV1Tail);
+ return StructAfter<CPALV1Tail> (*this);
+ }
+
+ public:
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ (this+colorRecordsZ).sanitize (c, numColorRecords) &&
+ colorRecordIndicesZ.sanitize (c, numPalettes) &&
+ (version == 0 || v1 ().sanitize (c, this, numPalettes, numColors)));
+ }
+
+ protected:
+ HBUINT16 version; /* Table version number */
+ /* Version 0 */
+ HBUINT16 numColors; /* Number of colors in each palette. */
+ HBUINT16 numPalettes; /* Number of palettes in the table. */
+ HBUINT16 numColorRecords; /* Total number of color records, combined for
+ * all palettes. */
+ LNNOffsetTo<UnsizedArrayOf<BGRAColor>>
+ colorRecordsZ; /* Offset from the beginning of CPAL table to
+ * the first ColorRecord. */
+ UnsizedArrayOf<HBUINT16>
+ colorRecordIndicesZ; /* Index of each palette’s first color record in
+ * the combined color record array. */
+/*CPALV1Tail v1;*/
+ public:
+ DEFINE_SIZE_ARRAY (12, colorRecordIndicesZ);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_COLOR_CPAL_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-color-sbix-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-color-sbix-table.hh
new file mode 100644
index 0000000000..35d3fd5105
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-color-sbix-table.hh
@@ -0,0 +1,293 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_COLOR_SBIX_TABLE_HH
+#define HB_OT_COLOR_SBIX_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * sbix -- Standard Bitmap Graphics
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/sbix
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6sbix.html
+ */
+#define HB_OT_TAG_sbix HB_TAG('s','b','i','x')
+
+
+namespace OT {
+
+
+struct SBIXGlyph
+{
+ HBINT16 xOffset; /* The horizontal (x-axis) offset from the left
+ * edge of the graphic to the glyph’s origin.
+ * That is, the x-coordinate of the point on the
+ * baseline at the left edge of the glyph. */
+ HBINT16 yOffset; /* The vertical (y-axis) offset from the bottom
+ * edge of the graphic to the glyph’s origin.
+ * That is, the y-coordinate of the point on the
+ * baseline at the left edge of the glyph. */
+ Tag graphicType; /* Indicates the format of the embedded graphic
+ * data: one of 'jpg ', 'png ' or 'tiff', or the
+ * special format 'dupe'. */
+ UnsizedArrayOf<HBUINT8>
+ data; /* The actual embedded graphic data. The total
+ * length is inferred from sequential entries in
+ * the glyphDataOffsets array and the fixed size
+ * (8 bytes) of the preceding fields. */
+ public:
+ DEFINE_SIZE_ARRAY (8, data);
+};
+
+struct SBIXStrike
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ imageOffsetsZ.sanitize_shallow (c, c->get_num_glyphs () + 1));
+ }
+
+ hb_blob_t *get_glyph_blob (unsigned int glyph_id,
+ hb_blob_t *sbix_blob,
+ hb_tag_t file_type,
+ int *x_offset,
+ int *y_offset,
+ unsigned int num_glyphs,
+ unsigned int *strike_ppem) const
+ {
+ if (unlikely (!ppem)) return hb_blob_get_empty (); /* To get Null() object out of the way. */
+
+ unsigned int retry_count = 8;
+ unsigned int sbix_len = sbix_blob->length;
+ unsigned int strike_offset = (const char *) this - (const char *) sbix_blob->data;
+ assert (strike_offset < sbix_len);
+
+ retry:
+ if (unlikely (glyph_id >= num_glyphs ||
+ imageOffsetsZ[glyph_id + 1] <= imageOffsetsZ[glyph_id] ||
+ imageOffsetsZ[glyph_id + 1] - imageOffsetsZ[glyph_id] <= SBIXGlyph::min_size ||
+ (unsigned int) imageOffsetsZ[glyph_id + 1] > sbix_len - strike_offset))
+ return hb_blob_get_empty ();
+
+ unsigned int glyph_offset = strike_offset + (unsigned int) imageOffsetsZ[glyph_id] + SBIXGlyph::min_size;
+ unsigned int glyph_length = imageOffsetsZ[glyph_id + 1] - imageOffsetsZ[glyph_id] - SBIXGlyph::min_size;
+
+ const SBIXGlyph *glyph = &(this+imageOffsetsZ[glyph_id]);
+
+ if (glyph->graphicType == HB_TAG ('d','u','p','e'))
+ {
+ if (glyph_length >= 2)
+ {
+ glyph_id = *((HBUINT16 *) &glyph->data);
+ if (retry_count--)
+ goto retry;
+ }
+ return hb_blob_get_empty ();
+ }
+
+ if (unlikely (file_type != glyph->graphicType))
+ return hb_blob_get_empty ();
+
+ if (strike_ppem) *strike_ppem = ppem;
+ if (x_offset) *x_offset = glyph->xOffset;
+ if (y_offset) *y_offset = glyph->yOffset;
+ return hb_blob_create_sub_blob (sbix_blob, glyph_offset, glyph_length);
+ }
+
+ public:
+ HBUINT16 ppem; /* The PPEM size for which this strike was designed. */
+ HBUINT16 resolution; /* The device pixel density (in PPI) for which this
+ * strike was designed. (E.g., 96 PPI, 192 PPI.) */
+ protected:
+ UnsizedArrayOf<LOffsetTo<SBIXGlyph>>
+ imageOffsetsZ; /* Offset from the beginning of the strike data header
+ * to bitmap data for an individual glyph ID. */
+ public:
+ DEFINE_SIZE_ARRAY (4, imageOffsetsZ);
+};
+
+struct sbix
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_sbix;
+
+ bool has_data () const { return version; }
+
+ const SBIXStrike &get_strike (unsigned int i) const { return this+strikes[i]; }
+
+ struct accelerator_t
+ {
+ void init (hb_face_t *face)
+ {
+ table = hb_sanitize_context_t().reference_table<sbix> (face);
+ num_glyphs = face->get_num_glyphs ();
+ }
+ void fini () { table.destroy (); }
+
+ bool has_data () const { return table->has_data (); }
+
+ bool get_extents (hb_font_t *font,
+ hb_codepoint_t glyph,
+ hb_glyph_extents_t *extents) const
+ {
+ /* We only support PNG right now, and following function checks type. */
+ return get_png_extents (font, glyph, extents);
+ }
+
+ hb_blob_t *reference_png (hb_font_t *font,
+ hb_codepoint_t glyph_id,
+ int *x_offset,
+ int *y_offset,
+ unsigned int *available_ppem) const
+ {
+ return choose_strike (font).get_glyph_blob (glyph_id, table.get_blob (),
+ HB_TAG ('p','n','g',' '),
+ x_offset, y_offset,
+ num_glyphs, available_ppem);
+ }
+
+ private:
+
+ const SBIXStrike &choose_strike (hb_font_t *font) const
+ {
+ unsigned count = table->strikes.len;
+ if (unlikely (!count))
+ return Null(SBIXStrike);
+
+ unsigned int requested_ppem = hb_max (font->x_ppem, font->y_ppem);
+ if (!requested_ppem)
+ requested_ppem = 1<<30; /* Choose largest strike. */
+ /* TODO Add DPI sensitivity as well? */
+ unsigned int best_i = 0;
+ unsigned int best_ppem = table->get_strike (0).ppem;
+
+ for (unsigned int i = 1; i < count; i++)
+ {
+ unsigned int ppem = (table->get_strike (i)).ppem;
+ if ((requested_ppem <= ppem && ppem < best_ppem) ||
+ (requested_ppem > best_ppem && ppem > best_ppem))
+ {
+ best_i = i;
+ best_ppem = ppem;
+ }
+ }
+
+ return table->get_strike (best_i);
+ }
+
+ struct PNGHeader
+ {
+ HBUINT8 signature[8];
+ struct
+ {
+ struct
+ {
+ HBUINT32 length;
+ Tag type;
+ } header;
+ HBUINT32 width;
+ HBUINT32 height;
+ HBUINT8 bitDepth;
+ HBUINT8 colorType;
+ HBUINT8 compressionMethod;
+ HBUINT8 filterMethod;
+ HBUINT8 interlaceMethod;
+ } IHDR;
+
+ public:
+ DEFINE_SIZE_STATIC (29);
+ };
+
+ bool get_png_extents (hb_font_t *font,
+ hb_codepoint_t glyph,
+ hb_glyph_extents_t *extents) const
+ {
+ /* Following code is safe to call even without data.
+ * But faster to short-circuit. */
+ if (!has_data ())
+ return false;
+
+ int x_offset = 0, y_offset = 0;
+ unsigned int strike_ppem = 0;
+ hb_blob_t *blob = reference_png (font, glyph, &x_offset, &y_offset, &strike_ppem);
+
+ const PNGHeader &png = *blob->as<PNGHeader>();
+
+ extents->x_bearing = x_offset;
+ extents->y_bearing = png.IHDR.height + y_offset;
+ extents->width = png.IHDR.width;
+ extents->height = -png.IHDR.height;
+
+ /* Convert to font units. */
+ if (strike_ppem)
+ {
+ float scale = font->face->get_upem () / (float) strike_ppem;
+ extents->x_bearing = font->em_scalef_x (extents->x_bearing * scale);
+ extents->y_bearing = font->em_scalef_y (extents->y_bearing * scale);
+ extents->width = font->em_scalef_x (extents->width * scale);
+ extents->height = font->em_scalef_y (extents->height * scale);
+ }
+ else
+ {
+ extents->x_bearing = font->em_scale_x (extents->x_bearing);
+ extents->y_bearing = font->em_scale_y (extents->y_bearing);
+ extents->width = font->em_scale_x (extents->width);
+ extents->height = font->em_scale_y (extents->height);
+ }
+
+ hb_blob_destroy (blob);
+
+ return strike_ppem;
+ }
+
+ private:
+ hb_blob_ptr_t<sbix> table;
+
+ unsigned int num_glyphs;
+ };
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ version >= 1 &&
+ strikes.sanitize (c, this)));
+ }
+
+ protected:
+ HBUINT16 version; /* Table version number — set to 1 */
+ HBUINT16 flags; /* Bit 0: Set to 1. Bit 1: Draw outlines.
+ * Bits 2 to 15: reserved (set to 0). */
+ LOffsetLArrayOf<SBIXStrike>
+ strikes; /* Offsets from the beginning of the 'sbix'
+ * table to data for each individual bitmap strike. */
+ public:
+ DEFINE_SIZE_ARRAY (8, strikes);
+};
+
+struct sbix_accelerator_t : sbix::accelerator_t {};
+
+} /* namespace OT */
+
+#endif /* HB_OT_COLOR_SBIX_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-color-svg-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-color-svg-table.hh
new file mode 100644
index 0000000000..926d61e0fa
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-color-svg-table.hh
@@ -0,0 +1,124 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_COLOR_SVG_TABLE_HH
+#define HB_OT_COLOR_SVG_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * SVG -- SVG (Scalable Vector Graphics)
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/svg
+ */
+
+#define HB_OT_TAG_SVG HB_TAG('S','V','G',' ')
+
+
+namespace OT {
+
+
+struct SVGDocumentIndexEntry
+{
+ int cmp (hb_codepoint_t g) const
+ { return g < startGlyphID ? -1 : g > endGlyphID ? 1 : 0; }
+
+ hb_blob_t *reference_blob (hb_blob_t *svg_blob, unsigned int index_offset) const
+ {
+ return hb_blob_create_sub_blob (svg_blob,
+ index_offset + (unsigned int) svgDoc,
+ svgDocLength);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ svgDoc.sanitize (c, base, svgDocLength));
+ }
+
+ protected:
+ HBUINT16 startGlyphID; /* The first glyph ID in the range described by
+ * this index entry. */
+ HBUINT16 endGlyphID; /* The last glyph ID in the range described by
+ * this index entry. Must be >= startGlyphID. */
+ LNNOffsetTo<UnsizedArrayOf<HBUINT8>>
+ svgDoc; /* Offset from the beginning of the SVG Document Index
+ * to an SVG document. Must be non-zero. */
+ HBUINT32 svgDocLength; /* Length of the SVG document.
+ * Must be non-zero. */
+ public:
+ DEFINE_SIZE_STATIC (12);
+};
+
+struct SVG
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_SVG;
+
+ bool has_data () const { return svgDocEntries; }
+
+ struct accelerator_t
+ {
+ void init (hb_face_t *face)
+ { table = hb_sanitize_context_t().reference_table<SVG> (face); }
+ void fini () { table.destroy (); }
+
+ hb_blob_t *reference_blob_for_glyph (hb_codepoint_t glyph_id) const
+ {
+ return table->get_glyph_entry (glyph_id).reference_blob (table.get_blob (),
+ table->svgDocEntries);
+ }
+
+ bool has_data () const { return table->has_data (); }
+
+ private:
+ hb_blob_ptr_t<SVG> table;
+ };
+
+ const SVGDocumentIndexEntry &get_glyph_entry (hb_codepoint_t glyph_id) const
+ { return (this+svgDocEntries).bsearch (glyph_id); }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ (this+svgDocEntries).sanitize_shallow (c)));
+ }
+
+ protected:
+ HBUINT16 version; /* Table version (starting at 0). */
+ LOffsetTo<SortedArrayOf<SVGDocumentIndexEntry>>
+ svgDocEntries; /* Offset (relative to the start of the SVG table) to the
+ * SVG Documents Index. Must be non-zero. */
+ /* Array of SVG Document Index Entries. */
+ HBUINT32 reserved; /* Set to 0. */
+ public:
+ DEFINE_SIZE_STATIC (10);
+};
+
+struct SVG_accelerator_t : SVG::accelerator_t {};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_COLOR_SVG_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-color.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-color.cc
new file mode 100644
index 0000000000..0e7203a88b
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-color.cc
@@ -0,0 +1,321 @@
+/*
+ * Copyright © 2016 Google, Inc.
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Sascha Brawer, Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_COLOR
+
+#include "hb-ot.h"
+
+#include "hb-ot-color-cbdt-table.hh"
+#include "hb-ot-color-colr-table.hh"
+#include "hb-ot-color-cpal-table.hh"
+#include "hb-ot-color-sbix-table.hh"
+#include "hb-ot-color-svg-table.hh"
+
+#include <stdlib.h>
+#include <string.h>
+
+
+/**
+ * SECTION:hb-ot-color
+ * @title: hb-ot-color
+ * @short_description: OpenType Color Fonts
+ * @include: hb-ot.h
+ *
+ * Functions for fetching color-font information from OpenType font faces.
+ *
+ * HarfBuzz supports `COLR`/`CPAL`, `sbix`, `CBDT`, and `SVG` color fonts.
+ **/
+
+
+/*
+ * CPAL
+ */
+
+
+/**
+ * hb_ot_color_has_palettes:
+ * @face: #hb_face_t to work upon
+ *
+ * Tests whether a face includes a `CPAL` color-palette table.
+ *
+ * Return value: true if data found, false otherwise
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_palettes (hb_face_t *face)
+{
+ return face->table.CPAL->has_data ();
+}
+
+/**
+ * hb_ot_color_palette_get_count:
+ * @face: #hb_face_t to work upon
+ *
+ * Fetches the number of color palettes in a face.
+ *
+ * Return value: the number of palettes found
+ *
+ * Since: 2.1.0
+ */
+unsigned int
+hb_ot_color_palette_get_count (hb_face_t *face)
+{
+ return face->table.CPAL->get_palette_count ();
+}
+
+/**
+ * hb_ot_color_palette_get_name_id:
+ * @face: #hb_face_t to work upon
+ * @palette_index: The index of the color palette
+ *
+ * Fetches the `name` table Name ID that provides display names for
+ * a `CPAL` color palette.
+ *
+ * Palette display names can be generic (e.g., "Default") or provide
+ * specific, themed names (e.g., "Spring", "Summer", "Fall", and "Winter").
+ *
+ * Return value: the Named ID found for the palette.
+ * If the requested palette has no name the result is #HB_OT_NAME_ID_INVALID.
+ *
+ * Since: 2.1.0
+ */
+hb_ot_name_id_t
+hb_ot_color_palette_get_name_id (hb_face_t *face,
+ unsigned int palette_index)
+{
+ return face->table.CPAL->get_palette_name_id (palette_index);
+}
+
+/**
+ * hb_ot_color_palette_color_get_name_id:
+ * @face: #hb_face_t to work upon
+ * @color_index: The index of the color
+ *
+ * Fetches the `name` table Name ID that provides display names for
+ * the specificed color in a face's `CPAL` color palette.
+ *
+ * Display names can be generic (e.g., "Background") or specific
+ * (e.g., "Eye color").
+ *
+ * Return value: the Name ID found for the color.
+ *
+ * Since: 2.1.0
+ */
+hb_ot_name_id_t
+hb_ot_color_palette_color_get_name_id (hb_face_t *face,
+ unsigned int color_index)
+{
+ return face->table.CPAL->get_color_name_id (color_index);
+}
+
+/**
+ * hb_ot_color_palette_get_flags:
+ * @face: #hb_face_t to work upon
+ * @palette_index: The index of the color palette
+ *
+ * Fetches the flags defined for a color palette.
+ *
+ * Return value: the #hb_ot_color_palette_flags_t of the requested color palette
+ *
+ * Since: 2.1.0
+ */
+hb_ot_color_palette_flags_t
+hb_ot_color_palette_get_flags (hb_face_t *face,
+ unsigned int palette_index)
+{
+ return face->table.CPAL->get_palette_flags (palette_index);
+}
+
+/**
+ * hb_ot_color_palette_get_colors:
+ * @face: #hb_face_t to work upon
+ * @palette_index: the index of the color palette to query
+ * @start_offset: offset of the first color to retrieve
+ * @color_count: (inout) (optional): Input = the maximum number of colors to return;
+ * Output = the actual number of colors returned (may be zero)
+ * @colors: (out) (array length=color_count) (nullable): The array of #hb_color_t records found
+ *
+ * Fetches a list of the colors in a color palette.
+ *
+ * After calling this function, @colors will be filled with the palette
+ * colors. If @colors is NULL, the function will just return the number
+ * of total colors without storing any actual colors; this can be used
+ * for allocating a buffer of suitable size before calling
+ * hb_ot_color_palette_get_colors() a second time.
+ *
+ * Return value: the total number of colors in the palette
+ *
+ * Since: 2.1.0
+ */
+unsigned int
+hb_ot_color_palette_get_colors (hb_face_t *face,
+ unsigned int palette_index,
+ unsigned int start_offset,
+ unsigned int *colors_count /* IN/OUT. May be NULL. */,
+ hb_color_t *colors /* OUT. May be NULL. */)
+{
+ return face->table.CPAL->get_palette_colors (palette_index, start_offset, colors_count, colors);
+}
+
+
+/*
+ * COLR
+ */
+
+/**
+ * hb_ot_color_has_layers:
+ * @face: #hb_face_t to work upon
+ *
+ * Tests whether a face includes any `COLR` color layers.
+ *
+ * Return value: true if data found, false otherwise
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_layers (hb_face_t *face)
+{
+ return face->table.COLR->has_data ();
+}
+
+/**
+ * hb_ot_color_glyph_get_layers:
+ * @face: #hb_face_t to work upon
+ * @glyph: The glyph index to query
+ * @start_offset: offset of the first layer to retrieve
+ * @layer_count: (inout) (optional): Input = the maximum number of layers to return;
+ * Output = the actual number of layers returned (may be zero)
+ * @layers: (out) (array length=layer_count) (nullable): The array of layers found
+ *
+ * Fetches a list of all color layers for the specified glyph index in the specified
+ * face. The list returned will begin at the offset provided.
+ *
+ * Return value: Total number of layers available for the glyph index queried
+ *
+ * Since: 2.1.0
+ */
+unsigned int
+hb_ot_color_glyph_get_layers (hb_face_t *face,
+ hb_codepoint_t glyph,
+ unsigned int start_offset,
+ unsigned int *layer_count, /* IN/OUT. May be NULL. */
+ hb_ot_color_layer_t *layers /* OUT. May be NULL. */)
+{
+ return face->table.COLR->get_glyph_layers (glyph, start_offset, layer_count, layers);
+}
+
+
+/*
+ * SVG
+ */
+
+/**
+ * hb_ot_color_has_svg:
+ * @face: #hb_face_t to work upon.
+ *
+ * Tests whether a face includes any `SVG` glyph images.
+ *
+ * Return value: true if data found, false otherwise.
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_svg (hb_face_t *face)
+{
+ return face->table.SVG->has_data ();
+}
+
+/**
+ * hb_ot_color_glyph_reference_svg:
+ * @face: #hb_face_t to work upon
+ * @glyph: a svg glyph index
+ *
+ * Fetches the SVG document for a glyph. The blob may be either plain text or gzip-encoded.
+ *
+ * Return value: (transfer full): An #hb_blob_t containing the SVG document of the glyph, if available
+ *
+ * Since: 2.1.0
+ */
+hb_blob_t *
+hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph)
+{
+ return face->table.SVG->reference_blob_for_glyph (glyph);
+}
+
+
+/*
+ * PNG: CBDT or sbix
+ */
+
+/**
+ * hb_ot_color_has_png:
+ * @face: #hb_face_t to work upon
+ *
+ * Tests whether a face has PNG glyph images (either in `CBDT` or `sbix` tables).
+ *
+ * Return value: true if data found, false otherwise
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_png (hb_face_t *face)
+{
+ return face->table.CBDT->has_data () || face->table.sbix->has_data ();
+}
+
+/**
+ * hb_ot_color_glyph_reference_png:
+ * @font: #hb_font_t to work upon
+ * @glyph: a glyph index
+ *
+ * Fetches the PNG image for a glyph. This function takes a font object, not a face object,
+ * as input. To get an optimally sized PNG blob, the UPEM value must be set on the @font
+ * object. If UPEM is unset, the blob returned will be the largest PNG available.
+ *
+ * Return value: (transfer full): An #hb_blob_t containing the PNG image for the glyph, if available
+ *
+ * Since: 2.1.0
+ */
+hb_blob_t *
+hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t glyph)
+{
+ hb_blob_t *blob = hb_blob_get_empty ();
+
+ if (font->face->table.sbix->has_data ())
+ blob = font->face->table.sbix->reference_png (font, glyph, nullptr, nullptr, nullptr);
+
+ if (!blob->length && font->face->table.CBDT->has_data ())
+ blob = font->face->table.CBDT->reference_png (font, glyph);
+
+ return blob;
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-color.h b/src/3rdparty/harfbuzz-ng/src/hb-ot-color.h
new file mode 100644
index 0000000000..63ef20a1a0
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-color.h
@@ -0,0 +1,139 @@
+/*
+ * Copyright © 2016 Google, Inc.
+ * Copyright © 2018 Khaled Hosny
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Sascha Brawer, Behdad Esfahbod
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_COLOR_H
+#define HB_OT_COLOR_H
+
+#include "hb.h"
+#include "hb-ot-name.h"
+
+HB_BEGIN_DECLS
+
+
+/*
+ * Color palettes.
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_palettes (hb_face_t *face);
+
+HB_EXTERN unsigned int
+hb_ot_color_palette_get_count (hb_face_t *face);
+
+HB_EXTERN hb_ot_name_id_t
+hb_ot_color_palette_get_name_id (hb_face_t *face,
+ unsigned int palette_index);
+
+HB_EXTERN hb_ot_name_id_t
+hb_ot_color_palette_color_get_name_id (hb_face_t *face,
+ unsigned int color_index);
+
+/**
+ * hb_ot_color_palette_flags_t:
+ * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: Default indicating that there is nothing special
+ * to note about a color palette.
+ * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND: Flag indicating that the color
+ * palette is appropriate to use when displaying the font on a light background such as white.
+ * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND: Flag indicating that the color
+ * palette is appropriate to use when displaying the font on a dark background such as black.
+ *
+ * Since: 2.1.0
+ */
+typedef enum { /*< flags >*/
+ HB_OT_COLOR_PALETTE_FLAG_DEFAULT = 0x00000000u,
+ HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND = 0x00000001u,
+ HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND = 0x00000002u
+} hb_ot_color_palette_flags_t;
+
+HB_EXTERN hb_ot_color_palette_flags_t
+hb_ot_color_palette_get_flags (hb_face_t *face,
+ unsigned int palette_index);
+
+HB_EXTERN unsigned int
+hb_ot_color_palette_get_colors (hb_face_t *face,
+ unsigned int palette_index,
+ unsigned int start_offset,
+ unsigned int *color_count, /* IN/OUT. May be NULL. */
+ hb_color_t *colors /* OUT. May be NULL. */);
+
+
+/*
+ * Color layers.
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_layers (hb_face_t *face);
+
+/**
+ * hb_ot_color_layer_t:
+ *
+ * Pairs of glyph and color index.
+ *
+ * Since: 2.1.0
+ **/
+typedef struct hb_ot_color_layer_t
+{
+ hb_codepoint_t glyph;
+ unsigned int color_index;
+} hb_ot_color_layer_t;
+
+HB_EXTERN unsigned int
+hb_ot_color_glyph_get_layers (hb_face_t *face,
+ hb_codepoint_t glyph,
+ unsigned int start_offset,
+ unsigned int *layer_count, /* IN/OUT. May be NULL. */
+ hb_ot_color_layer_t *layers /* OUT. May be NULL. */);
+
+/*
+ * SVG
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_svg (hb_face_t *face);
+
+HB_EXTERN hb_blob_t *
+hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph);
+
+/*
+ * PNG: CBDT or sbix
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_png (hb_face_t *face);
+
+HB_EXTERN hb_blob_t *
+hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t glyph);
+
+
+HB_END_DECLS
+
+#endif /* HB_OT_COLOR_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-deprecated.h b/src/3rdparty/harfbuzz-ng/src/hb-ot-deprecated.h
new file mode 100644
index 0000000000..bc72f8a701
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-deprecated.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_DEPRECATED_H
+#define HB_OT_DEPRECATED_H
+
+#include "hb.h"
+#include "hb-ot-name.h"
+
+
+HB_BEGIN_DECLS
+
+#ifndef HB_DISABLE_DEPRECATED
+
+
+/* https://github.com/harfbuzz/harfbuzz/issues/1734 */
+#define HB_MATH_GLYPH_PART_FLAG_EXTENDER HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER
+
+
+/* Like hb_ot_layout_table_find_script, but takes zero-terminated array of scripts to test */
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_table_select_script) hb_bool_t
+hb_ot_layout_table_choose_script (hb_face_t *face,
+ hb_tag_t table_tag,
+ const hb_tag_t *script_tags,
+ unsigned int *script_index,
+ hb_tag_t *chosen_script);
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_script_select_language) hb_bool_t
+hb_ot_layout_script_find_language (hb_face_t *face,
+ hb_tag_t table_tag,
+ unsigned int script_index,
+ hb_tag_t language_tag,
+ unsigned int *language_index);
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) void
+hb_ot_tags_from_script (hb_script_t script,
+ hb_tag_t *script_tag_1,
+ hb_tag_t *script_tag_2);
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) hb_tag_t
+hb_ot_tag_from_language (hb_language_t language);
+
+
+/**
+ * HB_OT_VAR_NO_AXIS_INDEX:
+ *
+ * Since: 1.4.2
+ * Deprecated: 2.2.0
+ */
+#define HB_OT_VAR_NO_AXIS_INDEX 0xFFFFFFFFu
+
+/**
+ * hb_ot_var_axis_t:
+ *
+ * Since: 1.4.2
+ * Deprecated: 2.2.0
+ */
+typedef struct hb_ot_var_axis_t
+{
+ hb_tag_t tag;
+ hb_ot_name_id_t name_id;
+ float min_value;
+ float default_value;
+ float max_value;
+} hb_ot_var_axis_t;
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_get_axis_infos) unsigned int
+hb_ot_var_get_axes (hb_face_t *face,
+ unsigned int start_offset,
+ unsigned int *axes_count /* IN/OUT */,
+ hb_ot_var_axis_t *axes_array /* OUT */);
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_find_axis_info) hb_bool_t
+hb_ot_var_find_axis (hb_face_t *face,
+ hb_tag_t axis_tag,
+ unsigned int *axis_index,
+ hb_ot_var_axis_t *axis_info);
+
+
+#endif
+
+HB_END_DECLS
+
+#endif /* HB_OT_DEPRECATED_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-face-table-list.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-face-table-list.hh
new file mode 100644
index 0000000000..6fa9baf135
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-face-table-list.hh
@@ -0,0 +1,139 @@
+/*
+ * Copyright © 2007,2008,2009 Red Hat, Inc.
+ * Copyright © 2012,2013 Google, Inc.
+ * Copyright © 2019, Facebook Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ * Facebook Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_FACE_TABLE_LIST_HH
+#define HB_OT_FACE_TABLE_LIST_HH
+#endif /* HB_OT_FACE_TABLE_LIST_HH */ /* Dummy header guards */
+
+#ifndef HB_OT_ACCELERATOR
+#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
+#define _HB_OT_ACCELERATOR_UNDEF
+#endif
+
+
+/* This lists font tables that the hb_face_t will contain and lazily
+ * load. Don't add a table unless it's used though. This is not
+ * exactly free. */
+
+/* v--- Add new tables in the right place here. */
+
+
+/* OpenType fundamentals. */
+HB_OT_TABLE (OT, head)
+#if !defined(HB_NO_FACE_COLLECT_UNICODES) || !defined(HB_NO_OT_FONT)
+HB_OT_ACCELERATOR (OT, cmap)
+#endif
+HB_OT_TABLE (OT, hhea)
+HB_OT_ACCELERATOR (OT, hmtx)
+HB_OT_TABLE (OT, OS2)
+#if !defined(HB_NO_OT_FONT_GLYPH_NAMES) || !defined(HB_NO_METRICS)
+HB_OT_ACCELERATOR (OT, post)
+#endif
+#ifndef HB_NO_NAME
+HB_OT_ACCELERATOR (OT, name)
+#endif
+#ifndef HB_NO_STAT
+HB_OT_TABLE (OT, STAT)
+#endif
+#ifndef HB_NO_META
+HB_OT_ACCELERATOR (OT, meta)
+#endif
+
+/* Vertical layout. */
+HB_OT_TABLE (OT, vhea)
+HB_OT_ACCELERATOR (OT, vmtx)
+
+/* TrueType outlines. */
+HB_OT_ACCELERATOR (OT, glyf)
+
+/* CFF outlines. */
+#ifndef HB_NO_CFF
+HB_OT_ACCELERATOR (OT, cff1)
+HB_OT_ACCELERATOR (OT, cff2)
+HB_OT_TABLE (OT, VORG)
+#endif
+
+/* OpenType variations. */
+#ifndef HB_NO_VAR
+HB_OT_TABLE (OT, fvar)
+HB_OT_TABLE (OT, avar)
+HB_OT_ACCELERATOR (OT, gvar)
+HB_OT_TABLE (OT, MVAR)
+#endif
+
+/* Legacy kern. */
+#ifndef HB_NO_OT_KERN
+HB_OT_TABLE (OT, kern)
+#endif
+
+/* OpenType shaping. */
+#ifndef HB_NO_OT_LAYOUT
+HB_OT_ACCELERATOR (OT, GDEF)
+HB_OT_ACCELERATOR (OT, GSUB)
+HB_OT_ACCELERATOR (OT, GPOS)
+//HB_OT_TABLE (OT, JSTF)
+#endif
+
+/* OpenType baseline. */
+#ifndef HB_NO_BASE
+HB_OT_TABLE (OT, BASE)
+#endif
+
+/* AAT shaping. */
+#ifndef HB_NO_AAT
+HB_OT_TABLE (AAT, morx)
+HB_OT_TABLE (AAT, mort)
+HB_OT_TABLE (AAT, kerx)
+HB_OT_TABLE (AAT, ankr)
+HB_OT_TABLE (AAT, trak)
+HB_OT_TABLE (AAT, lcar)
+HB_OT_TABLE (AAT, ltag)
+HB_OT_TABLE (AAT, feat)
+// HB_OT_TABLE (AAT, opbd)
+#endif
+
+/* OpenType color fonts. */
+#ifndef HB_NO_COLOR
+HB_OT_TABLE (OT, COLR)
+HB_OT_TABLE (OT, CPAL)
+HB_OT_ACCELERATOR (OT, CBDT)
+HB_OT_ACCELERATOR (OT, sbix)
+HB_OT_ACCELERATOR (OT, SVG)
+#endif
+
+/* OpenType math. */
+#ifndef HB_NO_MATH
+HB_OT_TABLE (OT, MATH)
+#endif
+
+
+#ifdef _HB_OT_ACCELERATOR_UNDEF
+#undef HB_OT_ACCELERATOR
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-face.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-face.cc
new file mode 100644
index 0000000000..5ef8df43ce
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-face.cc
@@ -0,0 +1,58 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-face.hh"
+
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-ot-cff1-table.hh"
+#include "hb-ot-cff2-table.hh"
+#include "hb-ot-hmtx-table.hh"
+#include "hb-ot-kern-table.hh"
+#include "hb-ot-meta-table.hh"
+#include "hb-ot-name-table.hh"
+#include "hb-ot-post-table.hh"
+#include "hb-ot-color-cbdt-table.hh"
+#include "hb-ot-color-sbix-table.hh"
+#include "hb-ot-color-svg-table.hh"
+#include "hb-ot-layout-gdef-table.hh"
+#include "hb-ot-layout-gsub-table.hh"
+#include "hb-ot-layout-gpos-table.hh"
+
+
+void hb_ot_face_t::init0 (hb_face_t *face)
+{
+ this->face = face;
+#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
+#include "hb-ot-face-table-list.hh"
+#undef HB_OT_TABLE
+}
+void hb_ot_face_t::fini ()
+{
+#define HB_OT_TABLE(Namespace, Type) Type.fini ();
+#include "hb-ot-face-table-list.hh"
+#undef HB_OT_TABLE
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-face.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-face.hh
new file mode 100644
index 0000000000..e24d380bca
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-face.hh
@@ -0,0 +1,74 @@
+/*
+ * Copyright © 2007,2008,2009 Red Hat, Inc.
+ * Copyright © 2012,2013 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_FACE_HH
+#define HB_OT_FACE_HH
+
+#include "hb.hh"
+
+#include "hb-machinery.hh"
+
+
+/*
+ * hb_ot_face_t
+ */
+
+/* Declare tables. */
+#define HB_OT_TABLE(Namespace, Type) namespace Namespace { struct Type; }
+#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type##_accelerator_t)
+#include "hb-ot-face-table-list.hh"
+#undef HB_OT_ACCELERATOR
+#undef HB_OT_TABLE
+
+struct hb_ot_face_t
+{
+ HB_INTERNAL void init0 (hb_face_t *face);
+ HB_INTERNAL void fini ();
+
+#define HB_OT_TABLE_ORDER(Namespace, Type) \
+ HB_PASTE (ORDER_, HB_PASTE (Namespace, HB_PASTE (_, Type)))
+ enum order_t
+ {
+ ORDER_ZERO,
+#define HB_OT_TABLE(Namespace, Type) HB_OT_TABLE_ORDER (Namespace, Type),
+#include "hb-ot-face-table-list.hh"
+#undef HB_OT_TABLE
+ };
+
+ hb_face_t *face; /* MUST be JUST before the lazy loaders. */
+#define HB_OT_TABLE(Namespace, Type) \
+ hb_table_lazy_loader_t<Namespace::Type, HB_OT_TABLE_ORDER (Namespace, Type)> Type;
+#define HB_OT_ACCELERATOR(Namespace, Type) \
+ hb_face_lazy_loader_t<Namespace::Type##_accelerator_t, HB_OT_TABLE_ORDER (Namespace, Type)> Type;
+#include "hb-ot-face-table-list.hh"
+#undef HB_OT_ACCELERATOR
+#undef HB_OT_TABLE
+};
+
+
+#endif /* HB_OT_FACE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc
index 9864064b11..96f94e4a9e 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc
@@ -24,66 +24,39 @@
* Google Author(s): Behdad Esfahbod, Roozbeh Pournader
*/
-#include "hb-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_OT_FONT
#include "hb-ot.h"
-#include "hb-font-private.hh"
+#include "hb-font.hh"
+#include "hb-machinery.hh"
+#include "hb-ot-face.hh"
#include "hb-ot-cmap-table.hh"
-#include "hb-ot-cbdt-table.hh"
#include "hb-ot-glyf-table.hh"
+#include "hb-ot-cff1-table.hh"
+#include "hb-ot-cff2-table.hh"
#include "hb-ot-hmtx-table.hh"
-#include "hb-ot-kern-table.hh"
+#include "hb-ot-os2-table.hh"
#include "hb-ot-post-table.hh"
+#include "hb-ot-stat-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-ot-vorg-table.hh"
+#include "hb-ot-color-cbdt-table.hh"
+#include "hb-ot-color-sbix-table.hh"
-struct hb_ot_font_t
-{
- OT::cmap::accelerator_t cmap;
- OT::hmtx::accelerator_t h_metrics;
- OT::vmtx::accelerator_t v_metrics;
- OT::hb_lazy_loader_t<OT::glyf::accelerator_t> glyf;
- OT::hb_lazy_loader_t<OT::CBDT::accelerator_t> cbdt;
- OT::hb_lazy_loader_t<OT::post::accelerator_t> post;
- OT::hb_lazy_loader_t<OT::kern::accelerator_t> kern;
-};
-
-
-static hb_ot_font_t *
-_hb_ot_font_create (hb_face_t *face)
-{
- hb_ot_font_t *ot_font = (hb_ot_font_t *) calloc (1, sizeof (hb_ot_font_t));
-
- if (unlikely (!ot_font))
- return nullptr;
-
- ot_font->cmap.init (face);
- ot_font->h_metrics.init (face);
- ot_font->v_metrics.init (face, ot_font->h_metrics.ascender - ot_font->h_metrics.descender); /* TODO Can we do this lazily? */
- ot_font->glyf.init (face);
- ot_font->cbdt.init (face);
- ot_font->post.init (face);
- ot_font->kern.init (face);
-
- return ot_font;
-}
-
-static void
-_hb_ot_font_destroy (void *data)
-{
- hb_ot_font_t *ot_font = (hb_ot_font_t *) data;
-
- ot_font->cmap.fini ();
- ot_font->h_metrics.fini ();
- ot_font->v_metrics.fini ();
- ot_font->glyf.fini ();
- ot_font->cbdt.fini ();
- ot_font->post.fini ();
- ot_font->kern.fini ();
-
- free (ot_font);
-}
+/**
+ * SECTION:hb-ot-font
+ * @title: hb-ot-font
+ * @short_description: OpenType font implementation
+ * @include: hb-ot.h
+ *
+ * Functions for using OpenType fonts with hb_shape(). Note that fonts returned
+ * by hb_font_create() default to using these functions, so most clients would
+ * never need to call these functions directly.
+ **/
static hb_bool_t
@@ -92,10 +65,25 @@ hb_ot_get_nominal_glyph (hb_font_t *font HB_UNUSED,
hb_codepoint_t unicode,
hb_codepoint_t *glyph,
void *user_data HB_UNUSED)
+{
+ const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+ return ot_face->cmap->get_nominal_glyph (unicode, glyph);
+}
+static unsigned int
+hb_ot_get_nominal_glyphs (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ unsigned int count,
+ const hb_codepoint_t *first_unicode,
+ unsigned int unicode_stride,
+ hb_codepoint_t *first_glyph,
+ unsigned int glyph_stride,
+ void *user_data HB_UNUSED)
{
- const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- return ot_font->cmap.get_nominal_glyph (unicode, glyph);
+ const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+ return ot_face->cmap->get_nominal_glyphs (count,
+ first_unicode, unicode_stride,
+ first_glyph, glyph_stride);
}
static hb_bool_t
@@ -106,158 +94,206 @@ hb_ot_get_variation_glyph (hb_font_t *font HB_UNUSED,
hb_codepoint_t *glyph,
void *user_data HB_UNUSED)
{
- const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- return ot_font->cmap.get_variation_glyph (unicode, variation_selector, glyph);
+ const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+ return ot_face->cmap->get_variation_glyph (unicode, variation_selector, glyph);
}
-static hb_position_t
-hb_ot_get_glyph_h_advance (hb_font_t *font,
- void *font_data,
- hb_codepoint_t glyph,
- void *user_data HB_UNUSED)
+static void
+hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data,
+ unsigned count,
+ const hb_codepoint_t *first_glyph,
+ unsigned glyph_stride,
+ hb_position_t *first_advance,
+ unsigned advance_stride,
+ void *user_data HB_UNUSED)
{
- const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- return font->em_scale_x (ot_font->h_metrics.get_advance (glyph, font));
+ const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+ const OT::hmtx_accelerator_t &hmtx = *ot_face->hmtx;
+
+ for (unsigned int i = 0; i < count; i++)
+ {
+ *first_advance = font->em_scale_x (hmtx.get_advance (*first_glyph, font));
+ first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+ first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+ }
}
-static hb_position_t
-hb_ot_get_glyph_v_advance (hb_font_t *font,
- void *font_data,
- hb_codepoint_t glyph,
- void *user_data HB_UNUSED)
+static void
+hb_ot_get_glyph_v_advances (hb_font_t* font, void* font_data,
+ unsigned count,
+ const hb_codepoint_t *first_glyph,
+ unsigned glyph_stride,
+ hb_position_t *first_advance,
+ unsigned advance_stride,
+ void *user_data HB_UNUSED)
{
- const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- return font->em_scale_y (-(int) ot_font->v_metrics.get_advance (glyph, font));
+ const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+ const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx;
+
+ for (unsigned int i = 0; i < count; i++)
+ {
+ *first_advance = font->em_scale_y (-(int) vmtx.get_advance (*first_glyph, font));
+ first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
+ first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
+ }
}
-static hb_position_t
-hb_ot_get_glyph_h_kerning (hb_font_t *font,
- void *font_data,
- hb_codepoint_t left_glyph,
- hb_codepoint_t right_glyph,
- void *user_data HB_UNUSED)
+static hb_bool_t
+hb_ot_get_glyph_v_origin (hb_font_t *font,
+ void *font_data,
+ hb_codepoint_t glyph,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
{
- const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- return font->em_scale_x (ot_font->kern->get_h_kerning (left_glyph, right_glyph));
+ const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+
+ *x = font->get_glyph_h_advance (glyph) / 2;
+
+#ifndef HB_NO_OT_FONT_CFF
+ const OT::VORG &VORG = *ot_face->VORG;
+ if (VORG.has_data ())
+ {
+ *y = font->em_scale_y (VORG.get_y_origin (glyph));
+ return true;
+ }
+#endif
+
+ hb_glyph_extents_t extents = {0};
+ if (ot_face->glyf->get_extents (font, glyph, &extents))
+ {
+ const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx;
+ hb_position_t tsb = vmtx.get_side_bearing (font, glyph);
+ *y = extents.y_bearing + font->em_scale_y (tsb);
+ return true;
+ }
+
+ hb_font_extents_t font_extents;
+ font->get_h_extents_with_fallback (&font_extents);
+ *y = font_extents.ascender;
+
+ return true;
}
static hb_bool_t
-hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
+hb_ot_get_glyph_extents (hb_font_t *font,
void *font_data,
hb_codepoint_t glyph,
hb_glyph_extents_t *extents,
void *user_data HB_UNUSED)
{
- const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- bool ret = ot_font->glyf->get_extents (glyph, extents);
- if (!ret)
- ret = ot_font->cbdt->get_extents (glyph, extents);
+ const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+ bool ret = false;
+
+#if !defined(HB_NO_OT_FONT_BITMAP) && !defined(HB_NO_COLOR)
+ if (!ret) ret = ot_face->sbix->get_extents (font, glyph, extents);
+#endif
+ if (!ret) ret = ot_face->glyf->get_extents (font, glyph, extents);
+#ifndef HB_NO_OT_FONT_CFF
+ if (!ret) ret = ot_face->cff1->get_extents (font, glyph, extents);
+ if (!ret) ret = ot_face->cff2->get_extents (font, glyph, extents);
+#endif
+#if !defined(HB_NO_OT_FONT_BITMAP) && !defined(HB_NO_COLOR)
+ if (!ret) ret = ot_face->CBDT->get_extents (font, glyph, extents);
+#endif
+
// TODO Hook up side-bearings variations.
- extents->x_bearing = font->em_scale_x (extents->x_bearing);
- extents->y_bearing = font->em_scale_y (extents->y_bearing);
- extents->width = font->em_scale_x (extents->width);
- extents->height = font->em_scale_y (extents->height);
return ret;
}
+#ifndef HB_NO_OT_FONT_GLYPH_NAMES
static hb_bool_t
hb_ot_get_glyph_name (hb_font_t *font HB_UNUSED,
- void *font_data,
- hb_codepoint_t glyph,
- char *name, unsigned int size,
- void *user_data HB_UNUSED)
+ void *font_data,
+ hb_codepoint_t glyph,
+ char *name, unsigned int size,
+ void *user_data HB_UNUSED)
{
- const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- return ot_font->post->get_glyph_name (glyph, name, size);
+ const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+ return ot_face->post->get_glyph_name (glyph, name, size);
}
-
static hb_bool_t
hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED,
- void *font_data,
- const char *name, int len,
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
+ void *font_data,
+ const char *name, int len,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
{
- const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- return ot_font->post->get_glyph_from_name (name, len, glyph);
+ const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
+ return ot_face->post->get_glyph_from_name (name, len, glyph);
}
+#endif
static hb_bool_t
-hb_ot_get_font_h_extents (hb_font_t *font HB_UNUSED,
- void *font_data,
+hb_ot_get_font_h_extents (hb_font_t *font,
+ void *font_data HB_UNUSED,
hb_font_extents_t *metrics,
void *user_data HB_UNUSED)
{
- const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- metrics->ascender = font->em_scale_y (ot_font->h_metrics.ascender);
- metrics->descender = font->em_scale_y (ot_font->h_metrics.descender);
- metrics->line_gap = font->em_scale_y (ot_font->h_metrics.line_gap);
- // TODO Hook up variations.
- return ot_font->h_metrics.has_font_extents;
+ return _hb_ot_metrics_get_position_common (font, HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER, &metrics->ascender) &&
+ _hb_ot_metrics_get_position_common (font, HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER, &metrics->descender) &&
+ _hb_ot_metrics_get_position_common (font, HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP, &metrics->line_gap);
}
static hb_bool_t
-hb_ot_get_font_v_extents (hb_font_t *font HB_UNUSED,
- void *font_data,
+hb_ot_get_font_v_extents (hb_font_t *font,
+ void *font_data HB_UNUSED,
hb_font_extents_t *metrics,
void *user_data HB_UNUSED)
{
- const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- metrics->ascender = font->em_scale_x (ot_font->v_metrics.ascender);
- metrics->descender = font->em_scale_x (ot_font->v_metrics.descender);
- metrics->line_gap = font->em_scale_x (ot_font->v_metrics.line_gap);
- // TODO Hook up variations.
- return ot_font->v_metrics.has_font_extents;
+ return _hb_ot_metrics_get_position_common (font, HB_OT_METRICS_TAG_VERTICAL_ASCENDER, &metrics->ascender) &&
+ _hb_ot_metrics_get_position_common (font, HB_OT_METRICS_TAG_VERTICAL_DESCENDER, &metrics->descender) &&
+ _hb_ot_metrics_get_position_common (font, HB_OT_METRICS_TAG_VERTICAL_LINE_GAP, &metrics->line_gap);
}
-static hb_font_funcs_t *static_ot_funcs = nullptr;
-
-#ifdef HB_USE_ATEXIT
-static
-void free_static_ot_funcs (void)
-{
- hb_font_funcs_destroy (static_ot_funcs);
-}
+#if HB_USE_ATEXIT
+static void free_static_ot_funcs ();
#endif
-static hb_font_funcs_t *
-_hb_ot_get_font_funcs (void)
+static struct hb_ot_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ot_font_funcs_lazy_loader_t>
{
-retry:
- hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ot_funcs);
-
- if (unlikely (!funcs))
+ static hb_font_funcs_t *create ()
{
- funcs = hb_font_funcs_create ();
+ hb_font_funcs_t *funcs = hb_font_funcs_create ();
hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, nullptr, nullptr);
hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, nullptr, nullptr);
hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, nullptr, nullptr);
+ hb_font_funcs_set_nominal_glyphs_func (funcs, hb_ot_get_nominal_glyphs, nullptr, nullptr);
hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, nullptr, nullptr);
- hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ot_get_glyph_h_advance, nullptr, nullptr);
- hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ot_get_glyph_v_advance, nullptr, nullptr);
+ hb_font_funcs_set_glyph_h_advances_func (funcs, hb_ot_get_glyph_h_advances, nullptr, nullptr);
+ hb_font_funcs_set_glyph_v_advances_func (funcs, hb_ot_get_glyph_v_advances, nullptr, nullptr);
//hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, nullptr, nullptr);
- //hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, nullptr, nullptr);
- hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ot_get_glyph_h_kerning, nullptr, nullptr);
- //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ot_get_glyph_v_kerning, nullptr, nullptr);
+ hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, nullptr, nullptr);
hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, nullptr, nullptr);
//hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, nullptr, nullptr);
+#ifndef HB_NO_OT_FONT_GLYPH_NAMES
hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, nullptr, nullptr);
hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, nullptr, nullptr);
+#endif
hb_font_funcs_make_immutable (funcs);
- if (!hb_atomic_ptr_cmpexch (&static_ot_funcs, nullptr, funcs)) {
- hb_font_funcs_destroy (funcs);
- goto retry;
- }
+#if HB_USE_ATEXIT
+ atexit (free_static_ot_funcs);
+#endif
-#ifdef HB_USE_ATEXIT
- atexit (free_static_ot_funcs); /* First person registers atexit() callback. */
+ return funcs;
+ }
+} static_ot_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_ot_funcs ()
+{
+ static_ot_funcs.free_instance ();
+}
#endif
- };
- return funcs;
+static hb_font_funcs_t *
+_hb_ot_get_font_funcs ()
+{
+ return static_ot_funcs.get_unconst ();
}
@@ -269,12 +305,25 @@ retry:
void
hb_ot_font_set_funcs (hb_font_t *font)
{
- hb_ot_font_t *ot_font = _hb_ot_font_create (font->face);
- if (unlikely (!ot_font))
- return;
-
hb_font_set_funcs (font,
_hb_ot_get_font_funcs (),
- ot_font,
- _hb_ot_font_destroy);
+ &font->face->table,
+ nullptr);
}
+
+#ifndef HB_NO_VAR
+int
+_glyf_get_side_bearing_var (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical)
+{
+ return font->face->table.glyf->get_side_bearing_var (font, glyph, is_vertical);
+}
+
+unsigned
+_glyf_get_advance_var (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical)
+{
+ return font->face->table.glyf->get_advance_var (font, glyph, is_vertical);
+}
+#endif
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-gasp-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-gasp-table.hh
new file mode 100644
index 0000000000..94fff58a15
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-gasp-table.hh
@@ -0,0 +1,84 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_GASP_TABLE_HH
+#define HB_OT_GASP_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-hhea-table.hh"
+#include "hb-ot-os2-table.hh"
+#include "hb-ot-var-hvar-table.hh"
+
+/*
+ * gasp -- Grid-fitting and Scan-conversion Procedure
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/gasp
+ */
+#define HB_OT_TAG_gasp HB_TAG('g','a','s','p')
+
+
+namespace OT {
+
+struct GaspRange
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ public:
+ HBUINT16 rangeMaxPPEM; /* Upper limit of range, in PPEM */
+ HBUINT16 rangeGaspBehavior;
+ /* Flags describing desired rasterizer behavior. */
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+struct gasp
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_gasp;
+
+ const GaspRange &get_gasp_range (unsigned int i) const
+ { return gaspRanges[i]; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ gaspRanges.sanitize (c));
+ }
+
+ protected:
+ HBUINT16 version; /* Version number (set to 1) */
+ ArrayOf<GaspRange>
+ gaspRanges; /* Number of records to follow
+ * Sorted by ppem */
+ public:
+ DEFINE_SIZE_ARRAY (4, gaspRanges);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_GASP_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-glyf-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-glyf-table.hh
index 88d3850b6e..571e50ea0c 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-glyf-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-glyf-table.hh
@@ -1,5 +1,7 @@
/*
* Copyright © 2015 Google, Inc.
+ * Copyright © 2019 Adobe Inc.
+ * Copyright © 2019 Ebrahim Byagowi
*
* This is part of HarfBuzz, a text shaping library.
*
@@ -21,23 +23,27 @@
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
- * Google Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod, Garret Rieger, Roderick Sheeter
+ * Adobe Author(s): Michiharu Ariza
*/
#ifndef HB_OT_GLYF_TABLE_HH
#define HB_OT_GLYF_TABLE_HH
-#include "hb-open-type-private.hh"
+#include "hb-open-type.hh"
#include "hb-ot-head-table.hh"
+#include "hb-ot-hmtx-table.hh"
+#include "hb-ot-var-gvar-table.hh"
+#include <float.h>
namespace OT {
/*
* loca -- Index to Location
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/loca
*/
-
#define HB_OT_TAG_loca HB_TAG('l','o','c','a')
@@ -45,135 +51,1063 @@ struct loca
{
friend struct glyf;
- static const hb_tag_t tableTag = HB_OT_TAG_loca;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_loca;
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const
{
TRACE_SANITIZE (this);
return_trace (true);
}
protected:
- UINT8 dataX[VAR]; /* Location data. */
- DEFINE_SIZE_ARRAY (0, dataX);
+ UnsizedArrayOf<HBUINT8>
+ dataZ; /* Location data. */
+ public:
+ DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always
+ * check the size externally, allow Null() object of it by
+ * defining it _MIN instead. */
};
/*
* glyf -- TrueType Glyph Data
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf
*/
-
#define HB_OT_TAG_glyf HB_TAG('g','l','y','f')
struct glyf
{
- static const hb_tag_t tableTag = HB_OT_TAG_glyf;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_glyf;
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const
{
TRACE_SANITIZE (this);
- /* We don't check for anything specific here. The users of the
- * struct do all the hard work... */
+ /* Runtime checks as eager sanitizing each glyph is costy */
+ return_trace (true);
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_source_of (Iterator, unsigned int))>
+ static bool
+ _add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets)
+ {
+ unsigned max_offset = + padded_offsets | hb_reduce(hb_add, 0);
+ unsigned num_offsets = padded_offsets.len () + 1;
+ bool use_short_loca = max_offset < 0x1FFFF;
+ unsigned entry_size = use_short_loca ? 2 : 4;
+ char *loca_prime_data = (char *) calloc (entry_size, num_offsets);
+
+ if (unlikely (!loca_prime_data)) return false;
+
+ DEBUG_MSG (SUBSET, nullptr, "loca entry_size %d num_offsets %d "
+ "max_offset %d size %d",
+ entry_size, num_offsets, max_offset, entry_size * num_offsets);
+
+ if (use_short_loca)
+ _write_loca (padded_offsets, 1, hb_array ((HBUINT16*) loca_prime_data, num_offsets));
+ else
+ _write_loca (padded_offsets, 0, hb_array ((HBUINT32*) loca_prime_data, num_offsets));
+
+ hb_blob_t * loca_blob = hb_blob_create (loca_prime_data,
+ entry_size * num_offsets,
+ HB_MEMORY_MODE_WRITABLE,
+ loca_prime_data,
+ free);
+
+ bool result = plan->add_table (HB_OT_TAG_loca, loca_blob)
+ && _add_head_and_set_loca_version (plan, use_short_loca);
+
+ hb_blob_destroy (loca_blob);
+ return result;
+ }
+
+ template<typename IteratorIn, typename IteratorOut,
+ hb_requires (hb_is_source_of (IteratorIn, unsigned int)),
+ hb_requires (hb_is_sink_of (IteratorOut, unsigned))>
+ static void
+ _write_loca (IteratorIn it, unsigned right_shift, IteratorOut dest)
+ {
+ unsigned int offset = 0;
+ dest << 0;
+ + it
+ | hb_map ([=, &offset] (unsigned int padded_size)
+ {
+ offset += padded_size;
+ DEBUG_MSG (SUBSET, nullptr, "loca entry offset %d", offset);
+ return offset >> right_shift;
+ })
+ | hb_sink (dest)
+ ;
+ }
+
+ /* requires source of SubsetGlyph complains the identifier isn't declared */
+ template <typename Iterator>
+ bool serialize (hb_serialize_context_t *c,
+ Iterator it,
+ const hb_subset_plan_t *plan)
+ {
+ TRACE_SERIALIZE (this);
+ for (const auto &_ : it) _.serialize (c, plan);
return_trace (true);
}
- struct GlyphHeader
+ /* Byte region(s) per glyph to output
+ unpadded, hints removed if so requested
+ If we fail to process a glyph we produce an empty (0-length) glyph */
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+
+ glyf *glyf_prime = c->serializer->start_embed <glyf> ();
+ if (unlikely (!c->serializer->check_success (glyf_prime))) return_trace (false);
+
+ hb_vector_t<SubsetGlyph> glyphs;
+ _populate_subset_glyphs (c->plan, &glyphs);
+
+ glyf_prime->serialize (c->serializer, hb_iter (glyphs), c->plan);
+
+ auto padded_offsets =
+ + hb_iter (glyphs)
+ | hb_map (&SubsetGlyph::padded_size)
+ ;
+
+ if (c->serializer->in_error ()) return_trace (false);
+ return_trace (c->serializer->check_success (_add_loca_and_head (c->plan,
+ padded_offsets)));
+ }
+
+ template <typename SubsetGlyph>
+ void
+ _populate_subset_glyphs (const hb_subset_plan_t *plan,
+ hb_vector_t<SubsetGlyph> *glyphs /* OUT */) const
+ {
+ OT::glyf::accelerator_t glyf;
+ glyf.init (plan->source);
+
+ + hb_range (plan->num_output_glyphs ())
+ | hb_map ([&] (hb_codepoint_t new_gid)
+ {
+ SubsetGlyph subset_glyph = {0};
+ subset_glyph.new_gid = new_gid;
+
+ /* should never fail: all old gids should be mapped */
+ if (!plan->old_gid_for_new_gid (new_gid, &subset_glyph.old_gid))
+ return subset_glyph;
+
+ subset_glyph.source_glyph = glyf.glyph_for_gid (subset_glyph.old_gid, true);
+ if (plan->drop_hints) subset_glyph.drop_hints_bytes ();
+ else subset_glyph.dest_start = subset_glyph.source_glyph.get_bytes ();
+
+ return subset_glyph;
+ })
+ | hb_sink (glyphs)
+ ;
+
+ glyf.fini ();
+ }
+
+ static bool
+ _add_head_and_set_loca_version (hb_subset_plan_t *plan, bool use_short_loca)
+ {
+ hb_blob_t *head_blob = hb_sanitize_context_t ().reference_table<head> (plan->source);
+ hb_blob_t *head_prime_blob = hb_blob_copy_writable_or_fail (head_blob);
+ hb_blob_destroy (head_blob);
+
+ if (unlikely (!head_prime_blob))
+ return false;
+
+ head *head_prime = (head *) hb_blob_get_data_writable (head_prime_blob, nullptr);
+ head_prime->indexToLocFormat = use_short_loca ? 0 : 1;
+ bool success = plan->add_table (HB_OT_TAG_head, head_prime_blob);
+
+ hb_blob_destroy (head_prime_blob);
+ return success;
+ }
+
+ struct CompositeGlyphChain
+ {
+ enum composite_glyph_flag_t
+ {
+ ARG_1_AND_2_ARE_WORDS = 0x0001,
+ ARGS_ARE_XY_VALUES = 0x0002,
+ ROUND_XY_TO_GRID = 0x0004,
+ WE_HAVE_A_SCALE = 0x0008,
+ MORE_COMPONENTS = 0x0020,
+ WE_HAVE_AN_X_AND_Y_SCALE = 0x0040,
+ WE_HAVE_A_TWO_BY_TWO = 0x0080,
+ WE_HAVE_INSTRUCTIONS = 0x0100,
+ USE_MY_METRICS = 0x0200,
+ OVERLAP_COMPOUND = 0x0400,
+ SCALED_COMPONENT_OFFSET = 0x0800,
+ UNSCALED_COMPONENT_OFFSET = 0x1000
+ };
+
+ unsigned int get_size () const
+ {
+ unsigned int size = min_size;
+ /* arg1 and 2 are int16 */
+ if (flags & ARG_1_AND_2_ARE_WORDS) size += 4;
+ /* arg1 and 2 are int8 */
+ else size += 2;
+
+ /* One x 16 bit (scale) */
+ if (flags & WE_HAVE_A_SCALE) size += 2;
+ /* Two x 16 bit (xscale, yscale) */
+ else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) size += 4;
+ /* Four x 16 bit (xscale, scale01, scale10, yscale) */
+ else if (flags & WE_HAVE_A_TWO_BY_TWO) size += 8;
+
+ return size;
+ }
+
+ bool is_use_my_metrics () const { return flags & USE_MY_METRICS; }
+ bool is_anchored () const { return !(flags & ARGS_ARE_XY_VALUES); }
+ void get_anchor_points (unsigned int &point1, unsigned int &point2) const
+ {
+ const HBUINT8 *p = &StructAfter<const HBUINT8> (glyphIndex);
+ if (flags & ARG_1_AND_2_ARE_WORDS)
+ {
+ point1 = ((const HBUINT16 *) p)[0];
+ point2 = ((const HBUINT16 *) p)[1];
+ }
+ else
+ {
+ point1 = p[0];
+ point2 = p[1];
+ }
+ }
+
+ void transform_points (contour_point_vector_t &points) const
+ {
+ float matrix[4];
+ contour_point_t trans;
+ if (get_transformation (matrix, trans))
+ {
+ if (scaled_offsets ())
+ {
+ points.translate (trans);
+ points.transform (matrix);
+ }
+ else
+ {
+ points.transform (matrix);
+ points.translate (trans);
+ }
+ }
+ }
+
+ protected:
+ bool scaled_offsets () const
+ { return (flags & (SCALED_COMPONENT_OFFSET | UNSCALED_COMPONENT_OFFSET)) == SCALED_COMPONENT_OFFSET; }
+
+ bool get_transformation (float (&matrix)[4], contour_point_t &trans) const
+ {
+ matrix[0] = matrix[3] = 1.f;
+ matrix[1] = matrix[2] = 0.f;
+
+ int tx, ty;
+ const HBINT8 *p = &StructAfter<const HBINT8> (glyphIndex);
+ if (flags & ARG_1_AND_2_ARE_WORDS)
+ {
+ tx = *(const HBINT16 *) p;
+ p += HBINT16::static_size;
+ ty = *(const HBINT16 *) p;
+ p += HBINT16::static_size;
+ }
+ else
+ {
+ tx = *p++;
+ ty = *p++;
+ }
+ if (is_anchored ()) tx = ty = 0;
+
+ trans.init ((float) tx, (float) ty);
+
+ {
+ const F2DOT14 *points = (const F2DOT14 *) p;
+ if (flags & WE_HAVE_A_SCALE)
+ {
+ matrix[0] = matrix[3] = points[0].to_float ();
+ return true;
+ }
+ else if (flags & WE_HAVE_AN_X_AND_Y_SCALE)
+ {
+ matrix[0] = points[0].to_float ();
+ matrix[3] = points[1].to_float ();
+ return true;
+ }
+ else if (flags & WE_HAVE_A_TWO_BY_TWO)
+ {
+ matrix[0] = points[0].to_float ();
+ matrix[1] = points[1].to_float ();
+ matrix[2] = points[2].to_float ();
+ matrix[3] = points[3].to_float ();
+ return true;
+ }
+ }
+ return tx || ty;
+ }
+
+ public:
+ HBUINT16 flags;
+ HBGlyphID glyphIndex;
+ public:
+ DEFINE_SIZE_MIN (4);
+ };
+
+ struct composite_iter_t : hb_iter_with_fallback_t<composite_iter_t, const CompositeGlyphChain &>
{
- INT16 numberOfContours; /* If the number of contours is
- * greater than or equal to zero,
- * this is a simple glyph; if negative,
- * this is a composite glyph. */
- FWORD xMin; /* Minimum x for coordinate data. */
- FWORD yMin; /* Minimum y for coordinate data. */
- FWORD xMax; /* Maximum x for coordinate data. */
- FWORD yMax; /* Maximum y for coordinate data. */
-
- DEFINE_SIZE_STATIC (10);
+ typedef const CompositeGlyphChain *__item_t__;
+ composite_iter_t (hb_bytes_t glyph_, __item_t__ current_) :
+ glyph (glyph_), current (current_)
+ { if (!in_range (current)) current = nullptr; }
+ composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr) {}
+
+ const CompositeGlyphChain &__item__ () const { return *current; }
+ bool __more__ () const { return current; }
+ void __next__ ()
+ {
+ if (!(current->flags & CompositeGlyphChain::MORE_COMPONENTS)) { current = nullptr; return; }
+
+ const CompositeGlyphChain *possible = &StructAfter<CompositeGlyphChain,
+ CompositeGlyphChain> (*current);
+ if (!in_range (possible)) { current = nullptr; return; }
+ current = possible;
+ }
+ bool operator != (const composite_iter_t& o) const
+ { return glyph != o.glyph || current != o.current; }
+
+ bool in_range (const CompositeGlyphChain *composite) const
+ {
+ return glyph.in_range (composite, CompositeGlyphChain::min_size)
+ && glyph.in_range (composite, composite->get_size ());
+ }
+
+ private:
+ hb_bytes_t glyph;
+ __item_t__ current;
};
- struct accelerator_t
+ struct Glyph
{
- inline void init (hb_face_t *face)
+ private:
+ struct GlyphHeader
+ {
+ bool has_data () const { return numberOfContours; }
+
+ bool get_extents (hb_font_t *font, hb_codepoint_t gid, hb_glyph_extents_t *extents) const
+ {
+ /* Undocumented rasterizer behavior: shift glyph to the left by (lsb - xMin), i.e., xMin = lsb */
+ /* extents->x_bearing = hb_min (glyph_header.xMin, glyph_header.xMax); */
+ extents->x_bearing = font->em_scale_x (font->face->table.hmtx->get_side_bearing (gid));
+ extents->y_bearing = font->em_scale_y (hb_max (yMin, yMax));
+ extents->width = font->em_scale_x (hb_max (xMin, xMax) - hb_min (xMin, xMax));
+ extents->height = font->em_scale_y (hb_min (yMin, yMax) - hb_max (yMin, yMax));
+
+ return true;
+ }
+
+ HBINT16 numberOfContours;
+ /* If the number of contours is
+ * greater than or equal to zero,
+ * this is a simple glyph; if negative,
+ * this is a composite glyph. */
+ FWORD xMin; /* Minimum x for coordinate data. */
+ FWORD yMin; /* Minimum y for coordinate data. */
+ FWORD xMax; /* Maximum x for coordinate data. */
+ FWORD yMax; /* Maximum y for coordinate data. */
+ public:
+ DEFINE_SIZE_STATIC (10);
+ };
+
+ struct SimpleGlyph
+ {
+ const GlyphHeader &header;
+ hb_bytes_t bytes;
+ SimpleGlyph (const GlyphHeader &header_, hb_bytes_t bytes_) :
+ header (header_), bytes (bytes_) {}
+
+ unsigned int instruction_len_offset () const
+ { return GlyphHeader::static_size + 2 * header.numberOfContours; }
+
+ unsigned int length (unsigned int instruction_len) const
+ { return instruction_len_offset () + 2 + instruction_len; }
+
+ unsigned int instructions_length () const
+ {
+ unsigned int instruction_length_offset = instruction_len_offset ();
+ if (unlikely (instruction_length_offset + 2 > bytes.length)) return 0;
+
+ const HBUINT16 &instructionLength = StructAtOffset<HBUINT16> (&bytes, instruction_length_offset);
+ /* Out of bounds of the current glyph */
+ if (unlikely (length (instructionLength) > bytes.length)) return 0;
+ return instructionLength;
+ }
+
+ enum simple_glyph_flag_t
+ {
+ FLAG_ON_CURVE = 0x01,
+ FLAG_X_SHORT = 0x02,
+ FLAG_Y_SHORT = 0x04,
+ FLAG_REPEAT = 0x08,
+ FLAG_X_SAME = 0x10,
+ FLAG_Y_SAME = 0x20,
+ FLAG_RESERVED1 = 0x40,
+ FLAG_RESERVED2 = 0x80
+ };
+
+ const Glyph trim_padding () const
+ {
+ /* based on FontTools _g_l_y_f.py::trim */
+ const char *glyph = bytes.arrayZ;
+ const char *glyph_end = glyph + bytes.length;
+ /* simple glyph w/contours, possibly trimmable */
+ glyph += instruction_len_offset ();
+
+ if (unlikely (glyph + 2 >= glyph_end)) return Glyph ();
+ unsigned int num_coordinates = StructAtOffset<HBUINT16> (glyph - 2, 0) + 1;
+ unsigned int num_instructions = StructAtOffset<HBUINT16> (glyph, 0);
+
+ glyph += 2 + num_instructions;
+ if (unlikely (glyph + 2 >= glyph_end)) return Glyph ();
+
+ unsigned int coord_bytes = 0;
+ unsigned int coords_with_flags = 0;
+ while (glyph < glyph_end)
+ {
+ uint8_t flag = *glyph;
+ glyph++;
+
+ unsigned int repeat = 1;
+ if (flag & FLAG_REPEAT)
+ {
+ if (unlikely (glyph >= glyph_end)) return Glyph ();
+ repeat = *glyph + 1;
+ glyph++;
+ }
+
+ unsigned int xBytes, yBytes;
+ xBytes = yBytes = 0;
+ if (flag & FLAG_X_SHORT) xBytes = 1;
+ else if ((flag & FLAG_X_SAME) == 0) xBytes = 2;
+
+ if (flag & FLAG_Y_SHORT) yBytes = 1;
+ else if ((flag & FLAG_Y_SAME) == 0) yBytes = 2;
+
+ coord_bytes += (xBytes + yBytes) * repeat;
+ coords_with_flags += repeat;
+ if (coords_with_flags >= num_coordinates) break;
+ }
+
+ if (unlikely (coords_with_flags != num_coordinates)) return Glyph ();
+ return Glyph (bytes.sub_array (0, bytes.length + coord_bytes - (glyph_end - glyph)));
+ }
+
+ /* zero instruction length */
+ void drop_hints ()
+ {
+ GlyphHeader &glyph_header = const_cast<GlyphHeader &> (header);
+ (HBUINT16 &) StructAtOffset<HBUINT16> (&glyph_header, instruction_len_offset ()) = 0;
+ }
+
+ void drop_hints_bytes (hb_bytes_t &dest_start, hb_bytes_t &dest_end) const
+ {
+ unsigned int instructions_len = instructions_length ();
+ unsigned int glyph_length = length (instructions_len);
+ dest_start = bytes.sub_array (0, glyph_length - instructions_len);
+ dest_end = bytes.sub_array (glyph_length, bytes.length - glyph_length);
+ }
+
+ struct x_setter_t
+ {
+ void set (contour_point_t &point, float v) const { point.x = v; }
+ bool is_short (uint8_t flag) const { return flag & FLAG_X_SHORT; }
+ bool is_same (uint8_t flag) const { return flag & FLAG_X_SAME; }
+ };
+
+ struct y_setter_t
+ {
+ void set (contour_point_t &point, float v) const { point.y = v; }
+ bool is_short (uint8_t flag) const { return flag & FLAG_Y_SHORT; }
+ bool is_same (uint8_t flag) const { return flag & FLAG_Y_SAME; }
+ };
+
+ template <typename T>
+ static bool read_points (const HBUINT8 *&p /* IN/OUT */,
+ contour_point_vector_t &points_ /* IN/OUT */,
+ const hb_bytes_t &bytes)
+ {
+ T coord_setter;
+ float v = 0;
+ for (unsigned int i = 0; i < points_.length - PHANTOM_COUNT; i++)
+ {
+ uint8_t flag = points_[i].flag;
+ if (coord_setter.is_short (flag))
+ {
+ if (unlikely (!bytes.in_range (p))) return false;
+ if (coord_setter.is_same (flag))
+ v += *p++;
+ else
+ v -= *p++;
+ }
+ else
+ {
+ if (!coord_setter.is_same (flag))
+ {
+ if (unlikely (!bytes.in_range ((const HBUINT16 *) p))) return false;
+ v += *(const HBINT16 *) p;
+ p += HBINT16::static_size;
+ }
+ }
+ coord_setter.set (points_[i], v);
+ }
+ return true;
+ }
+
+ bool get_contour_points (contour_point_vector_t &points_ /* OUT */,
+ hb_vector_t<unsigned int> &end_points_ /* OUT */,
+ const bool phantom_only=false) const
+ {
+ const HBUINT16 *endPtsOfContours = &StructAfter<HBUINT16> (header);
+ int num_contours = header.numberOfContours;
+ if (unlikely (!bytes.in_range (&endPtsOfContours[num_contours + 1]))) return false;
+ unsigned int num_points = endPtsOfContours[num_contours - 1] + 1;
+
+ points_.resize (num_points + PHANTOM_COUNT);
+ for (unsigned int i = 0; i < points_.length; i++) points_[i].init ();
+ if (phantom_only) return true;
+
+ /* Read simple glyph points if !phantom_only */
+ end_points_.resize (num_contours);
+
+ for (int i = 0; i < num_contours; i++)
+ end_points_[i] = endPtsOfContours[i];
+
+ /* Skip instructions */
+ const HBUINT8 *p = &StructAtOffset<HBUINT8> (&endPtsOfContours[num_contours + 1],
+ endPtsOfContours[num_contours]);
+
+ /* Read flags */
+ for (unsigned int i = 0; i < num_points; i++)
+ {
+ if (unlikely (!bytes.in_range (p))) return false;
+ uint8_t flag = *p++;
+ points_[i].flag = flag;
+ if (flag & FLAG_REPEAT)
+ {
+ if (unlikely (!bytes.in_range (p))) return false;
+ unsigned int repeat_count = *p++;
+ while ((repeat_count-- > 0) && (++i < num_points))
+ points_[i].flag = flag;
+ }
+ }
+
+ /* Read x & y coordinates */
+ return (read_points<x_setter_t> (p, points_, bytes) &&
+ read_points<y_setter_t> (p, points_, bytes));
+ }
+ };
+
+ struct CompositeGlyph
{
- hb_blob_t *head_blob = Sanitizer<head>::sanitize (face->reference_table (HB_OT_TAG_head));
- const head *head_table = Sanitizer<head>::lock_instance (head_blob);
- if ((unsigned int) head_table->indexToLocFormat > 1 || head_table->glyphDataFormat != 0)
+ const GlyphHeader &header;
+ hb_bytes_t bytes;
+ CompositeGlyph (const GlyphHeader &header_, hb_bytes_t bytes_) :
+ header (header_), bytes (bytes_) {}
+
+ composite_iter_t get_iterator () const
+ { return composite_iter_t (bytes, &StructAfter<CompositeGlyphChain, GlyphHeader> (header)); }
+
+ unsigned int instructions_length (hb_bytes_t bytes) const
+ {
+ unsigned int start = bytes.length;
+ unsigned int end = bytes.length;
+ const CompositeGlyphChain *last = nullptr;
+ for (auto &item : get_iterator ())
+ last = &item;
+ if (unlikely (!last)) return 0;
+
+ if ((uint16_t) last->flags & CompositeGlyphChain::WE_HAVE_INSTRUCTIONS)
+ start = (char *) last - &bytes + last->get_size ();
+ if (unlikely (start > end)) return 0;
+ return end - start;
+ }
+
+ /* Trimming for composites not implemented.
+ * If removing hints it falls out of that. */
+ const Glyph trim_padding () const { return Glyph (bytes); }
+
+ /* remove WE_HAVE_INSTRUCTIONS flag from composite glyph */
+ void drop_hints ()
{
+ for (const auto &_ : get_iterator ())
+ *const_cast<OT::HBUINT16 *> (&_.flags) = (uint16_t) _.flags & ~OT::glyf::CompositeGlyphChain::WE_HAVE_INSTRUCTIONS;
+ }
+
+ /* Chop instructions off the end */
+ void drop_hints_bytes (hb_bytes_t &dest_start) const
+ { dest_start = bytes.sub_array (0, bytes.length - instructions_length (bytes)); }
+
+ bool get_contour_points (contour_point_vector_t &points_ /* OUT */,
+ hb_vector_t<unsigned int> &end_points_ /* OUT */,
+ const bool phantom_only=false) const
+ {
+ /* add one pseudo point for each component in composite glyph */
+ unsigned int num_points = hb_len (get_iterator ());
+ points_.resize (num_points + PHANTOM_COUNT);
+ for (unsigned int i = 0; i < points_.length; i++) points_[i].init ();
+ return true;
+ }
+ };
+
+ enum glyph_type_t { EMPTY, SIMPLE, COMPOSITE };
+
+ enum phantom_point_index_t
+ {
+ PHANTOM_LEFT = 0,
+ PHANTOM_RIGHT = 1,
+ PHANTOM_TOP = 2,
+ PHANTOM_BOTTOM = 3,
+ PHANTOM_COUNT = 4
+ };
+
+ public:
+ composite_iter_t get_composite_iterator () const
+ {
+ if (type != COMPOSITE) return composite_iter_t ();
+ return CompositeGlyph (*header, bytes).get_iterator ();
+ }
+
+ const Glyph trim_padding () const
+ {
+ switch (type) {
+ case COMPOSITE: return CompositeGlyph (*header, bytes).trim_padding ();
+ case SIMPLE: return SimpleGlyph (*header, bytes).trim_padding ();
+ default: return bytes;
+ }
+ }
+
+ void drop_hints ()
+ {
+ switch (type) {
+ case COMPOSITE: CompositeGlyph (*header, bytes).drop_hints (); return;
+ case SIMPLE: SimpleGlyph (*header, bytes).drop_hints (); return;
+ default: return;
+ }
+ }
+
+ void drop_hints_bytes (hb_bytes_t &dest_start, hb_bytes_t &dest_end) const
+ {
+ switch (type) {
+ case COMPOSITE: CompositeGlyph (*header, bytes).drop_hints_bytes (dest_start); return;
+ case SIMPLE: SimpleGlyph (*header, bytes).drop_hints_bytes (dest_start, dest_end); return;
+ default: return;
+ }
+ }
+
+ /* for a simple glyph, return contour end points, flags, along with coordinate points
+ * for a composite glyph, return pseudo component points
+ * in both cases points trailed with four phantom points
+ */
+ bool get_contour_points (contour_point_vector_t &points_ /* OUT */,
+ hb_vector_t<unsigned int> &end_points_ /* OUT */,
+ const bool phantom_only=false) const
+ {
+ switch (type) {
+ case COMPOSITE: return CompositeGlyph (*header, bytes).get_contour_points (points_, end_points_, phantom_only);
+ case SIMPLE: return SimpleGlyph (*header, bytes).get_contour_points (points_, end_points_, phantom_only);
+ default:
+ /* empty glyph */
+ points_.resize (PHANTOM_COUNT);
+ for (unsigned int i = 0; i < points_.length; i++) points_[i].init ();
+ return true;
+ }
+ }
+
+ bool is_simple_glyph () const { return type == SIMPLE; }
+ bool is_composite_glyph () const { return type == COMPOSITE; }
+
+ bool get_extents (hb_font_t *font, hb_codepoint_t gid, hb_glyph_extents_t *extents) const
+ {
+ if (type == EMPTY) return true; /* Empty glyph; zero extents. */
+ return header->get_extents (font, gid, extents);
+ }
+
+ hb_bytes_t get_bytes () const { return bytes; }
+ const GlyphHeader &get_header () const { return *header; }
+
+ Glyph (hb_bytes_t bytes_ = hb_bytes_t ()) :
+ bytes (bytes_), header (bytes.as<GlyphHeader> ())
+ {
+ int num_contours = header->numberOfContours;
+ if (unlikely (num_contours == 0)) type = EMPTY;
+ else if (num_contours > 0) type = SIMPLE;
+ else type = COMPOSITE; /* negative numbers */
+ }
+
+ protected:
+ hb_bytes_t bytes;
+ const GlyphHeader *header;
+ unsigned type;
+ };
+
+ struct accelerator_t
+ {
+ void init (hb_face_t *face_)
+ {
+ short_offset = false;
+ num_glyphs = 0;
+ loca_table = nullptr;
+ glyf_table = nullptr;
+ face = face_;
+ const OT::head &head = *face->table.head;
+ if (head.indexToLocFormat > 1 || head.glyphDataFormat > 0)
/* Unknown format. Leave num_glyphs=0, that takes care of disabling us. */
- hb_blob_destroy (head_blob);
return;
+ short_offset = 0 == head.indexToLocFormat;
+
+ loca_table = hb_sanitize_context_t ().reference_table<loca> (face);
+ glyf_table = hb_sanitize_context_t ().reference_table<glyf> (face);
+
+ num_glyphs = hb_max (1u, loca_table.get_length () / (short_offset ? 2 : 4)) - 1;
+ }
+
+ void fini ()
+ {
+ loca_table.destroy ();
+ glyf_table.destroy ();
+ }
+
+ enum phantom_point_index_t
+ {
+ PHANTOM_LEFT = 0,
+ PHANTOM_RIGHT = 1,
+ PHANTOM_TOP = 2,
+ PHANTOM_BOTTOM = 3,
+ PHANTOM_COUNT = 4
+ };
+
+ protected:
+
+ void init_phantom_points (hb_codepoint_t gid, hb_array_t<contour_point_t> &phantoms /* IN/OUT */) const
+ {
+ const Glyph &glyph = glyph_for_gid (gid);
+ int h_delta = (int) glyph.get_header ().xMin - face->table.hmtx->get_side_bearing (gid);
+ int v_orig = (int) glyph.get_header ().yMax + face->table.vmtx->get_side_bearing (gid);
+ unsigned int h_adv = face->table.hmtx->get_advance (gid);
+ unsigned int v_adv = face->table.vmtx->get_advance (gid);
+
+ phantoms[PHANTOM_LEFT].x = h_delta;
+ phantoms[PHANTOM_RIGHT].x = h_adv + h_delta;
+ phantoms[PHANTOM_TOP].y = v_orig;
+ phantoms[PHANTOM_BOTTOM].y = v_orig - (int) v_adv;
+ }
+
+ struct contour_bounds_t
+ {
+ contour_bounds_t () { min_x = min_y = FLT_MAX; max_x = max_y = -FLT_MAX; }
+
+ void add (const contour_point_t &p)
+ {
+ min_x = hb_min (min_x, p.x);
+ min_y = hb_min (min_y, p.y);
+ max_x = hb_max (max_x, p.x);
+ max_y = hb_max (max_y, p.y);
+ }
+
+ bool empty () const { return (min_x >= max_x) || (min_y >= max_y); }
+
+ void get_extents (hb_font_t *font, hb_glyph_extents_t *extents)
+ {
+ if (unlikely (empty ()))
+ {
+ extents->width = 0;
+ extents->x_bearing = 0;
+ extents->height = 0;
+ extents->y_bearing = 0;
+ return;
+ }
+ extents->x_bearing = font->em_scalef_x (min_x);
+ extents->width = font->em_scalef_x (max_x - min_x);
+ extents->y_bearing = font->em_scalef_y (max_y);
+ extents->height = font->em_scalef_y (min_y - max_y);
+ }
+
+ protected:
+ float min_x, min_y, max_x, max_y;
+ };
+
+#ifndef HB_NO_VAR
+ /* Note: Recursively calls itself.
+ * all_points includes phantom points
+ */
+ bool get_points_var (hb_codepoint_t gid,
+ const int *coords, unsigned int coord_count,
+ contour_point_vector_t &all_points /* OUT */,
+ unsigned int depth = 0) const
+ {
+ if (unlikely (depth++ > HB_MAX_NESTING_LEVEL)) return false;
+ contour_point_vector_t points;
+ hb_vector_t<unsigned int> end_points;
+ const Glyph &glyph = glyph_for_gid (gid);
+ if (unlikely (!glyph.get_contour_points (points, end_points))) return false;
+ hb_array_t<contour_point_t> phantoms = points.sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT);
+ init_phantom_points (gid, phantoms);
+ if (unlikely (!face->table.gvar->apply_deltas_to_points (gid, coords, coord_count, points.as_array (), end_points.as_array ()))) return false;
+
+ unsigned int comp_index = 0;
+ if (glyph.is_simple_glyph ())
+ all_points.extend (points.as_array ());
+ else if (glyph.is_composite_glyph ())
+ {
+ for (auto &item : glyph.get_composite_iterator ())
+ {
+ contour_point_vector_t comp_points;
+ if (unlikely (!get_points_var (item.glyphIndex, coords, coord_count,
+ comp_points, depth))
+ || comp_points.length < PHANTOM_COUNT)
+ return false;
+
+ /* Copy phantom points from component if USE_MY_METRICS flag set */
+ if (item.is_use_my_metrics ())
+ for (unsigned int i = 0; i < PHANTOM_COUNT; i++)
+ phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i];
+
+ /* Apply component transformation & translation */
+ item.transform_points (comp_points);
+
+ /* Apply translatation from gvar */
+ comp_points.translate (points[comp_index]);
+
+ if (item.is_anchored ())
+ {
+ unsigned int p1, p2;
+ item.get_anchor_points (p1, p2);
+ if (likely (p1 < all_points.length && p2 < comp_points.length))
+ {
+ contour_point_t delta;
+ delta.init (all_points[p1].x - comp_points[p2].x,
+ all_points[p1].y - comp_points[p2].y);
+
+ comp_points.translate (delta);
+ }
+ }
+
+ all_points.extend (comp_points.sub_array (0, comp_points.length - PHANTOM_COUNT));
+
+ comp_index++;
+ }
+
+ all_points.extend (phantoms);
}
- short_offset = 0 == head_table->indexToLocFormat;
- hb_blob_destroy (head_blob);
+ else return false;
+
+ return true;
+ }
+
+ bool get_points_bearing_applied (hb_font_t *font, hb_codepoint_t gid, contour_point_vector_t &all_points) const
+ {
+ if (unlikely (!get_points_var (gid, font->coords, font->num_coords, all_points) ||
+ all_points.length < PHANTOM_COUNT)) return false;
+
+ /* Undocumented rasterizer behavior:
+ * Shift points horizontally by the updated left side bearing
+ */
+ contour_point_t delta;
+ delta.init (-all_points[all_points.length - PHANTOM_COUNT + PHANTOM_LEFT].x, 0.f);
+ if (delta.x) all_points.translate (delta);
+ return true;
+ }
+
+ protected:
+
+ bool get_var_extents_and_phantoms (hb_font_t *font, hb_codepoint_t gid,
+ hb_glyph_extents_t *extents=nullptr /* OUT */,
+ contour_point_vector_t *phantoms=nullptr /* OUT */) const
+ {
+ contour_point_vector_t all_points;
+ if (!unlikely (get_points_bearing_applied (font, gid, all_points))) return false;
+ if (extents)
+ {
+ contour_bounds_t bounds;
+ for (unsigned int i = 0; i + PHANTOM_COUNT < all_points.length; i++)
+ bounds.add (all_points[i]);
+ bounds.get_extents (font, extents);
+ }
+ if (phantoms)
+ for (unsigned int i = 0; i < PHANTOM_COUNT; i++)
+ (*phantoms)[i] = all_points[all_points.length - PHANTOM_COUNT + i];
+ return true;
+ }
+
+ bool get_var_metrics (hb_font_t *font, hb_codepoint_t gid,
+ contour_point_vector_t &phantoms) const
+ { return get_var_extents_and_phantoms (font, gid, nullptr, &phantoms); }
+
+ bool get_extents_var (hb_font_t *font, hb_codepoint_t gid,
+ hb_glyph_extents_t *extents) const
+ { return get_var_extents_and_phantoms (font, gid, extents); }
+#endif
- loca_blob = Sanitizer<loca>::sanitize (face->reference_table (HB_OT_TAG_loca));
- loca_table = Sanitizer<loca>::lock_instance (loca_blob);
- glyf_blob = Sanitizer<glyf>::sanitize (face->reference_table (HB_OT_TAG_glyf));
- glyf_table = Sanitizer<glyf>::lock_instance (glyf_blob);
+ public:
+#ifndef HB_NO_VAR
+ unsigned int get_advance_var (hb_font_t *font, hb_codepoint_t gid,
+ bool is_vertical) const
+ {
+ bool success = false;
+ contour_point_vector_t phantoms;
+ phantoms.resize (PHANTOM_COUNT);
+
+ if (likely (font->num_coords == face->table.gvar->get_axis_count ()))
+ success = get_var_metrics (font, gid, phantoms);
+
+ if (unlikely (!success))
+ return is_vertical ? face->table.vmtx->get_advance (gid) : face->table.hmtx->get_advance (gid);
- num_glyphs = MAX (1u, hb_blob_get_length (loca_blob) / (short_offset ? 2 : 4)) - 1;
- glyf_len = hb_blob_get_length (glyf_blob);
+ if (is_vertical)
+ return roundf (phantoms[PHANTOM_TOP].y - phantoms[PHANTOM_BOTTOM].y);
+ else
+ return roundf (phantoms[PHANTOM_RIGHT].x - phantoms[PHANTOM_LEFT].x);
}
- inline void fini (void)
+ int get_side_bearing_var (hb_font_t *font, hb_codepoint_t gid, bool is_vertical) const
{
- hb_blob_destroy (loca_blob);
- hb_blob_destroy (glyf_blob);
+ hb_glyph_extents_t extents;
+ contour_point_vector_t phantoms;
+ phantoms.resize (PHANTOM_COUNT);
+
+ if (unlikely (!get_var_extents_and_phantoms (font, gid, &extents, &phantoms)))
+ return is_vertical ? face->table.vmtx->get_side_bearing (gid) : face->table.hmtx->get_side_bearing (gid);
+
+ return is_vertical ? ceil (phantoms[PHANTOM_TOP].y) - extents.y_bearing : floor (phantoms[PHANTOM_LEFT].x);
}
+#endif
- inline bool get_extents (hb_codepoint_t glyph,
- hb_glyph_extents_t *extents) const
+ bool get_extents (hb_font_t *font, hb_codepoint_t gid, hb_glyph_extents_t *extents) const
{
- if (unlikely (glyph >= num_glyphs))
- return false;
+#ifndef HB_NO_VAR
+ unsigned int coord_count;
+ const int *coords = hb_font_get_var_coords_normalized (font, &coord_count);
+ if (coords && coord_count > 0 && coord_count == face->table.gvar->get_axis_count ())
+ return get_extents_var (font, gid, extents);
+#endif
+
+ if (unlikely (gid >= num_glyphs)) return false;
+
+ return glyph_for_gid (gid).get_extents (font, gid, extents);
+ }
+ const Glyph
+ glyph_for_gid (hb_codepoint_t gid, bool needs_padding_removal = false) const
+ {
unsigned int start_offset, end_offset;
+ if (unlikely (gid >= num_glyphs)) return Glyph ();
+
if (short_offset)
{
- const UINT16 *offsets = (const UINT16 *) loca_table->dataX;
- start_offset = 2 * offsets[glyph];
- end_offset = 2 * offsets[glyph + 1];
+ const HBUINT16 *offsets = (const HBUINT16 *) loca_table->dataZ.arrayZ;
+ start_offset = 2 * offsets[gid];
+ end_offset = 2 * offsets[gid + 1];
}
else
{
- const UINT32 *offsets = (const UINT32 *) loca_table->dataX;
- start_offset = offsets[glyph];
- end_offset = offsets[glyph + 1];
+ const HBUINT32 *offsets = (const HBUINT32 *) loca_table->dataZ.arrayZ;
+ start_offset = offsets[gid];
+ end_offset = offsets[gid + 1];
}
- if (start_offset > end_offset || end_offset > glyf_len)
- return false;
+ if (unlikely (start_offset > end_offset || end_offset > glyf_table.get_length ()))
+ return Glyph ();
- if (end_offset - start_offset < GlyphHeader::static_size)
- return true; /* Empty glyph; zero extents. */
+ Glyph glyph (hb_bytes_t ((const char *) this->glyf_table + start_offset,
+ end_offset - start_offset));
+ return needs_padding_removal ? glyph.trim_padding () : glyph;
+ }
- const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyf_table, start_offset);
+ void
+ add_gid_and_children (hb_codepoint_t gid, hb_set_t *gids_to_retain,
+ unsigned int depth = 0) const
+ {
+ if (unlikely (depth++ > HB_MAX_NESTING_LEVEL)) return;
+ /* Check if is already visited */
+ if (gids_to_retain->has (gid)) return;
- extents->x_bearing = MIN (glyph_header.xMin, glyph_header.xMax);
- extents->y_bearing = MAX (glyph_header.yMin, glyph_header.yMax);
- extents->width = MAX (glyph_header.xMin, glyph_header.xMax) - extents->x_bearing;
- extents->height = MIN (glyph_header.yMin, glyph_header.yMax) - extents->y_bearing;
+ gids_to_retain->add (gid);
- return true;
+ for (auto &item : glyph_for_gid (gid).get_composite_iterator ())
+ add_gid_and_children (item.glyphIndex, gids_to_retain, depth);
}
private:
bool short_offset;
unsigned int num_glyphs;
- const loca *loca_table;
- const glyf *glyf_table;
- hb_blob_t *loca_blob;
- hb_blob_t *glyf_blob;
- unsigned int glyf_len;
+ hb_blob_ptr_t<loca> loca_table;
+ hb_blob_ptr_t<glyf> glyf_table;
+ hb_face_t *face;
};
- protected:
- UINT8 dataX[VAR]; /* Glyphs data. */
+ struct SubsetGlyph
+ {
+ hb_codepoint_t new_gid;
+ hb_codepoint_t old_gid;
+ Glyph source_glyph;
+ hb_bytes_t dest_start; /* region of source_glyph to copy first */
+ hb_bytes_t dest_end; /* region of source_glyph to copy second */
+
+ bool serialize (hb_serialize_context_t *c,
+ const hb_subset_plan_t *plan) const
+ {
+ TRACE_SERIALIZE (this);
+
+ hb_bytes_t dest_glyph = dest_start.copy (c);
+ dest_glyph = hb_bytes_t (&dest_glyph, dest_glyph.length + dest_end.copy (c).length);
+ unsigned int pad_length = padding ();
+ DEBUG_MSG (SUBSET, nullptr, "serialize %d byte glyph, width %d pad %d", dest_glyph.length, dest_glyph.length + pad_length, pad_length);
+
+ HBUINT8 pad;
+ pad = 0;
+ while (pad_length > 0)
+ {
+ c->embed (pad);
+ pad_length--;
+ }
+
+ if (!unlikely (dest_glyph.length)) return_trace (true);
+
+ /* update components gids */
+ for (auto &_ : Glyph (dest_glyph).get_composite_iterator ())
+ {
+ hb_codepoint_t new_gid;
+ if (plan->new_gid_for_old_gid (_.glyphIndex, &new_gid))
+ ((OT::glyf::CompositeGlyphChain *) &_)->glyphIndex = new_gid;
+ }
- DEFINE_SIZE_ARRAY (0, dataX);
+ if (plan->drop_hints) Glyph (dest_glyph).drop_hints ();
+
+ return_trace (true);
+ }
+
+ void drop_hints_bytes ()
+ { source_glyph.drop_hints_bytes (dest_start, dest_end); }
+
+ unsigned int length () const { return dest_start.length + dest_end.length; }
+ /* pad to 2 to ensure 2-byte loca will be ok */
+ unsigned int padding () const { return length () % 2; }
+ unsigned int padded_size () const { return length () + padding (); }
+ };
+
+ protected:
+ UnsizedArrayOf<HBUINT8>
+ dataZ; /* Glyphs data. */
+ public:
+ DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always
+ * check the size externally, allow Null() object of it by
+ * defining it _MIN instead. */
};
+struct glyf_accelerator_t : glyf::accelerator_t {};
+
} /* namespace OT */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh
new file mode 100644
index 0000000000..96c1d1f634
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh
@@ -0,0 +1,178 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger
+ */
+
+#ifndef HB_OT_HDMX_TABLE_HH
+#define HB_OT_HDMX_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * hdmx -- Horizontal Device Metrics
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/hdmx
+ */
+#define HB_OT_TAG_hdmx HB_TAG('h','d','m','x')
+
+
+namespace OT {
+
+
+struct DeviceRecord
+{
+ static unsigned int get_size (unsigned count)
+ { return hb_ceil_to_4 (min_size + count * HBUINT8::static_size); }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ bool serialize (hb_serialize_context_t *c, unsigned pixelSize, Iterator it)
+ {
+ TRACE_SERIALIZE (this);
+
+ unsigned length = it.len ();
+
+ if (unlikely (!c->extend (*this, length))) return_trace (false);
+
+ this->pixelSize = pixelSize;
+ this->maxWidth =
+ + it
+ | hb_reduce (hb_max, 0u);
+
+ + it
+ | hb_sink (widthsZ.as_array (length));
+
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, unsigned sizeDeviceRecord) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ c->check_range (this, sizeDeviceRecord)));
+ }
+
+ HBUINT8 pixelSize; /* Pixel size for following widths (as ppem). */
+ HBUINT8 maxWidth; /* Maximum width. */
+ UnsizedArrayOf<HBUINT8> widthsZ; /* Array of widths (numGlyphs is from the 'maxp' table). */
+ public:
+ DEFINE_SIZE_ARRAY (2, widthsZ);
+};
+
+
+struct hdmx
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_hdmx;
+
+ unsigned int get_size () const
+ { return min_size + numRecords * sizeDeviceRecord; }
+
+ const DeviceRecord& operator [] (unsigned int i) const
+ {
+ /* XXX Null(DeviceRecord) is NOT safe as it's num-glyphs lengthed.
+ * https://github.com/harfbuzz/harfbuzz/issues/1300 */
+ if (unlikely (i >= numRecords)) return Null (DeviceRecord);
+ return StructAtOffset<DeviceRecord> (&this->firstDeviceRecord, i * sizeDeviceRecord);
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ bool serialize (hb_serialize_context_t *c, unsigned version, Iterator it)
+ {
+ TRACE_SERIALIZE (this);
+
+ if (unlikely (!c->extend_min ((*this)))) return_trace (false);
+
+ this->version = version;
+ this->numRecords = it.len ();
+ this->sizeDeviceRecord = DeviceRecord::get_size (it ? (*it).second.len () : 0);
+
+ + it
+ | hb_apply ([c] (const hb_item_type<Iterator>& _) {
+ c->start_embed<DeviceRecord> ()->serialize (c, _.first, _.second);
+ })
+ ;
+
+ return_trace (c->successful);
+ }
+
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+
+ hdmx *hdmx_prime = c->serializer->start_embed <hdmx> ();
+ if (unlikely (!hdmx_prime)) return_trace (false);
+
+ auto it =
+ + hb_range ((unsigned) numRecords)
+ | hb_map ([c, this] (unsigned _)
+ {
+ const DeviceRecord *device_record =
+ &StructAtOffset<DeviceRecord> (&firstDeviceRecord,
+ _ * sizeDeviceRecord);
+ auto row =
+ + hb_range (c->plan->num_output_glyphs ())
+ | hb_map (c->plan->reverse_glyph_map)
+ | hb_map ([=] (hb_codepoint_t _)
+ {
+ if (c->plan->is_empty_glyph (_))
+ return Null(HBUINT8);
+ return device_record->widthsZ.as_array (get_num_glyphs ()) [_];
+ })
+ ;
+ return hb_pair ((unsigned) device_record->pixelSize, +row);
+ })
+ ;
+
+ hdmx_prime->serialize (c->serializer, version, it);
+ return_trace (true);
+ }
+
+ unsigned get_num_glyphs () const
+ {
+ return sizeDeviceRecord - DeviceRecord::min_size;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ !hb_unsigned_mul_overflows (numRecords, sizeDeviceRecord) &&
+ sizeDeviceRecord >= DeviceRecord::min_size &&
+ c->check_range (this, get_size ()));
+ }
+
+ protected:
+ HBUINT16 version; /* Table version number (0) */
+ HBUINT16 numRecords; /* Number of device records. */
+ HBUINT32 sizeDeviceRecord; /* Size of a device record, 32-bit aligned. */
+ DeviceRecord firstDeviceRecord; /* Array of device records. */
+ public:
+ DEFINE_SIZE_MIN (8);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_HDMX_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-head-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-head-table.hh
index dd4349ef85..3c0bb3d6dd 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-head-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-head-table.hh
@@ -29,30 +29,45 @@
#ifndef HB_OT_HEAD_TABLE_HH
#define HB_OT_HEAD_TABLE_HH
-#include "hb-open-type-private.hh"
-
-
-namespace OT {
-
+#include "hb-open-type.hh"
/*
* head -- Font Header
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/head
*/
-
#define HB_OT_TAG_head HB_TAG('h','e','a','d')
+
+namespace OT {
+
+
struct head
{
- static const hb_tag_t tableTag = HB_OT_TAG_head;
+ friend struct OffsetTable;
- inline unsigned int get_upem (void) const
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_head;
+
+ unsigned int get_upem () const
{
unsigned int upem = unitsPerEm;
/* If no valid head table found, assume 1000, which matches typical Type1 usage. */
return 16 <= upem && upem <= 16384 ? upem : 1000;
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ enum mac_style_flag_t {
+ BOLD = 1u<<0,
+ ITALIC = 1u<<1,
+ UNDERLINE = 1u<<2,
+ OUTLINE = 1u<<3,
+ SHADOW = 1u<<4,
+ CONDENSED = 1u<<5
+ };
+
+ bool is_bold () const { return macStyle & BOLD; }
+ bool is_italic () const { return macStyle & ITALIC; }
+ bool is_condensed () const { return macStyle & CONDENSED; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -64,11 +79,11 @@ struct head
FixedVersion<>version; /* Version of the head table--currently
* 0x00010000u for version 1.0. */
FixedVersion<>fontRevision; /* Set by font manufacturer. */
- UINT32 checkSumAdjustment; /* To compute: set it to 0, sum the
- * entire font as UINT32, then store
+ HBUINT32 checkSumAdjustment; /* To compute: set it to 0, sum the
+ * entire font as HBUINT32, then store
* 0xB1B0AFBAu - sum. */
- UINT32 magicNumber; /* Set to 0x5F0F3CF5u. */
- UINT16 flags; /* Bit 0: Baseline for font at y=0;
+ HBUINT32 magicNumber; /* Set to 0x5F0F3CF5u. */
+ HBUINT16 flags; /* Bit 0: Baseline for font at y=0;
* Bit 1: Left sidebearing point at x=0;
* Bit 2: Instructions may depend on point size;
* Bit 3: Force ppem to integer values for all
@@ -76,7 +91,6 @@ struct head
* ppem sizes if this bit is clear;
* Bit 4: Instructions may alter advance width
* (the advance widths might not scale linearly);
-
* Bits 5-10: These should be set according to
* Apple's specification. However, they are not
* implemented in OpenType.
@@ -96,7 +110,6 @@ struct head
* contains any strong right-to-left glyphs.
* Bit 10: This bit should be set if the font
* contains Indic-style rearrangement effects.
-
* Bit 11: Font data is 'lossless,' as a result
* of having been compressed and decompressed
* with the Agfa MicroType Express engine.
@@ -114,18 +127,18 @@ struct head
* encoded in the cmap subtables represent proper
* support for those code points.
* Bit 15: Reserved, set to 0. */
- UINT16 unitsPerEm; /* Valid range is from 16 to 16384. This value
+ HBUINT16 unitsPerEm; /* Valid range is from 16 to 16384. This value
* should be a power of 2 for fonts that have
* TrueType outlines. */
LONGDATETIME created; /* Number of seconds since 12:00 midnight,
January 1, 1904. 64-bit integer */
LONGDATETIME modified; /* Number of seconds since 12:00 midnight,
January 1, 1904. 64-bit integer */
- INT16 xMin; /* For all glyph bounding boxes. */
- INT16 yMin; /* For all glyph bounding boxes. */
- INT16 xMax; /* For all glyph bounding boxes. */
- INT16 yMax; /* For all glyph bounding boxes. */
- UINT16 macStyle; /* Bit 0: Bold (if set to 1);
+ HBINT16 xMin; /* For all glyph bounding boxes. */
+ HBINT16 yMin; /* For all glyph bounding boxes. */
+ HBINT16 xMax; /* For all glyph bounding boxes. */
+ HBINT16 yMax; /* For all glyph bounding boxes. */
+ HBUINT16 macStyle; /* Bit 0: Bold (if set to 1);
* Bit 1: Italic (if set to 1)
* Bit 2: Underline (if set to 1)
* Bit 3: Outline (if set to 1)
@@ -133,16 +146,16 @@ struct head
* Bit 5: Condensed (if set to 1)
* Bit 6: Extended (if set to 1)
* Bits 7-15: Reserved (set to 0). */
- UINT16 lowestRecPPEM; /* Smallest readable size in pixels. */
- INT16 fontDirectionHint; /* Deprecated (Set to 2).
+ HBUINT16 lowestRecPPEM; /* Smallest readable size in pixels. */
+ HBINT16 fontDirectionHint; /* Deprecated (Set to 2).
* 0: Fully mixed directional glyphs;
* 1: Only strongly left to right;
* 2: Like 1 but also contains neutrals;
* -1: Only strongly right to left;
* -2: Like -1 but also contains neutrals. */
public:
- INT16 indexToLocFormat; /* 0 for short offsets, 1 for long. */
- INT16 glyphDataFormat; /* 0 for current format. */
+ HBUINT16 indexToLocFormat; /* 0 for short offsets, 1 for long. */
+ HBUINT16 glyphDataFormat; /* 0 for current format. */
DEFINE_SIZE_STATIC (54);
};
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh
index dca014148e..778b6c5132 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh
@@ -27,24 +27,27 @@
#ifndef HB_OT_HHEA_TABLE_HH
#define HB_OT_HHEA_TABLE_HH
-#include "hb-open-type-private.hh"
-
-
-namespace OT {
-
+#include "hb-open-type.hh"
/*
- * hhea -- The Horizontal Header Table
- * vhea -- The Vertical Header Table
+ * hhea -- Horizontal Header
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/hhea
+ * vhea -- Vertical Header
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/vhea
*/
-
#define HB_OT_TAG_hhea HB_TAG('h','h','e','a')
#define HB_OT_TAG_vhea HB_TAG('v','h','e','a')
+namespace OT {
+
+
+template <typename T>
struct _hea
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool has_data () const { return version.major; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) && likely (version.major == 1));
@@ -64,31 +67,31 @@ struct _hea
* (xMax - xMin)) for horizontal. */
FWORD maxExtent; /* horizontal: Max(lsb + (xMax - xMin)),
* vertical: minLeadingBearing+(yMax-yMin). */
- INT16 caretSlopeRise; /* Used to calculate the slope of the
+ HBINT16 caretSlopeRise; /* Used to calculate the slope of the
* cursor (rise/run); 1 for vertical caret,
* 0 for horizontal.*/
- INT16 caretSlopeRun; /* 0 for vertical caret, 1 for horizontal. */
- INT16 caretOffset; /* The amount by which a slanted
+ HBINT16 caretSlopeRun; /* 0 for vertical caret, 1 for horizontal. */
+ HBINT16 caretOffset; /* The amount by which a slanted
* highlight on a glyph needs
* to be shifted to produce the
* best appearance. Set to 0 for
* non-slanted fonts. */
- INT16 reserved1; /* Set to 0. */
- INT16 reserved2; /* Set to 0. */
- INT16 reserved3; /* Set to 0. */
- INT16 reserved4; /* Set to 0. */
- INT16 metricDataFormat; /* 0 for current format. */
- UINT16 numberOfLongMetrics; /* Number of LongMetric entries in metric
+ HBINT16 reserved1; /* Set to 0. */
+ HBINT16 reserved2; /* Set to 0. */
+ HBINT16 reserved3; /* Set to 0. */
+ HBINT16 reserved4; /* Set to 0. */
+ HBINT16 metricDataFormat; /* 0 for current format. */
+ HBUINT16 numberOfLongMetrics; /* Number of LongMetric entries in metric
* table. */
public:
DEFINE_SIZE_STATIC (36);
};
-struct hhea : _hea {
- static const hb_tag_t tableTag = HB_OT_TAG_hhea;
+struct hhea : _hea<hhea> {
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_hhea;
};
-struct vhea : _hea {
- static const hb_tag_t tableTag = HB_OT_TAG_vhea;
+struct vhea : _hea<vhea> {
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_vhea;
};
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh
index e710aee42e..e20b372622 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh
@@ -21,42 +21,50 @@
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
- * Google Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod, Roderick Sheeter
*/
#ifndef HB_OT_HMTX_TABLE_HH
#define HB_OT_HMTX_TABLE_HH
-#include "hb-open-type-private.hh"
+#include "hb-open-type.hh"
#include "hb-ot-hhea-table.hh"
-#include "hb-ot-os2-table.hh"
#include "hb-ot-var-hvar-table.hh"
-
-
-namespace OT {
-
+#include "hb-ot-metrics.hh"
/*
- * hmtx -- The Horizontal Metrics Table
- * vmtx -- The Vertical Metrics Table
+ * hmtx -- Horizontal Metrics
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/hmtx
+ * vmtx -- Vertical Metrics
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/vmtx
*/
-
#define HB_OT_TAG_hmtx HB_TAG('h','m','t','x')
#define HB_OT_TAG_vmtx HB_TAG('v','m','t','x')
+HB_INTERNAL int
+_glyf_get_side_bearing_var (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical);
+
+HB_INTERNAL unsigned
+_glyf_get_advance_var (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical);
+
+
+namespace OT {
+
+
struct LongMetric
{
UFWORD advance; /* Advance width/height. */
- FWORD lsb; /* Leading (left/top) side bearing. */
+ FWORD sb; /* Leading (left/top) side bearing. */
public:
DEFINE_SIZE_STATIC (4);
};
-template <typename T>
+
+template <typename T, typename H>
struct hmtxvmtx
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const
{
TRACE_SANITIZE (this);
/* We don't check for anything specific here. The users of the
@@ -64,47 +72,107 @@ struct hmtxvmtx
return_trace (true);
}
- struct accelerator_t
+
+ bool subset_update_header (hb_subset_plan_t *plan,
+ unsigned int num_hmetrics) const
{
- inline void init (hb_face_t *face,
- unsigned int default_advance_ = 0)
- {
- default_advance = default_advance_ ? default_advance_ : face->get_upem ();
+ hb_blob_t *src_blob = hb_sanitize_context_t ().reference_table<H> (plan->source, H::tableTag);
+ hb_blob_t *dest_blob = hb_blob_copy_writable_or_fail (src_blob);
+ hb_blob_destroy (src_blob);
- bool got_font_extents = false;
- if (T::os2Tag)
- {
- hb_blob_t *os2_blob = Sanitizer<os2>::sanitize (face->reference_table (T::os2Tag));
- const os2 *os2_table = Sanitizer<os2>::lock_instance (os2_blob);
-#define USE_TYPO_METRICS (1u<<7)
- if (0 != (os2_table->fsSelection & USE_TYPO_METRICS))
- {
- ascender = os2_table->sTypoAscender;
- descender = os2_table->sTypoDescender;
- line_gap = os2_table->sTypoLineGap;
- got_font_extents = (ascender | descender) != 0;
- }
- hb_blob_destroy (os2_blob);
- }
+ if (unlikely (!dest_blob)) {
+ return false;
+ }
- hb_blob_t *_hea_blob = Sanitizer<_hea>::sanitize (face->reference_table (T::headerTag));
- const _hea *_hea_table = Sanitizer<_hea>::lock_instance (_hea_blob);
- num_advances = _hea_table->numberOfLongMetrics;
- if (!got_font_extents)
- {
- ascender = _hea_table->ascender;
- descender = _hea_table->descender;
- line_gap = _hea_table->lineGap;
- got_font_extents = (ascender | descender) != 0;
- }
- hb_blob_destroy (_hea_blob);
+ unsigned int length;
+ H *table = (H *) hb_blob_get_data (dest_blob, &length);
+ table->numberOfLongMetrics = num_hmetrics;
+
+ bool result = plan->add_table (H::tableTag, dest_blob);
+ hb_blob_destroy (dest_blob);
+
+ return result;
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ void serialize (hb_serialize_context_t *c,
+ Iterator it,
+ unsigned num_advances)
+ {
+ unsigned idx = 0;
+ + it
+ | hb_apply ([c, &idx, num_advances] (const hb_item_type<Iterator>& _)
+ {
+ if (idx < num_advances)
+ {
+ LongMetric lm;
+ lm.advance = _.first;
+ lm.sb = _.second;
+ if (unlikely (!c->embed<LongMetric> (&lm))) return;
+ }
+ else
+ {
+ FWORD *sb = c->allocate_size<FWORD> (FWORD::static_size);
+ if (unlikely (!sb)) return;
+ *sb = _.second;
+ }
+ idx++;
+ })
+ ;
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+
+ T *table_prime = c->serializer->start_embed <T> ();
+ if (unlikely (!table_prime)) return_trace (false);
+
+ accelerator_t _mtx;
+ _mtx.init (c->plan->source);
+ unsigned num_advances = _mtx.num_advances_for_subset (c->plan);
+
+ auto it =
+ + hb_range (c->plan->num_output_glyphs ())
+ | hb_map ([c, &_mtx] (unsigned _)
+ {
+ hb_codepoint_t old_gid;
+ if (!c->plan->old_gid_for_new_gid (_, &old_gid))
+ return hb_pair (0u, 0);
+ return hb_pair (_mtx.get_advance (old_gid), _mtx.get_side_bearing (old_gid));
+ })
+ ;
+
+ table_prime->serialize (c->serializer, it, num_advances);
+
+ _mtx.fini ();
+
+ if (unlikely (c->serializer->ran_out_of_room || c->serializer->in_error ()))
+ return_trace (false);
+
+ // Amend header num hmetrics
+ if (unlikely (!subset_update_header (c->plan, num_advances)))
+ return_trace (false);
+
+ return_trace (true);
+ }
- has_font_extents = got_font_extents;
+ struct accelerator_t
+ {
+ friend struct hmtxvmtx;
- blob = Sanitizer<hmtxvmtx>::sanitize (face->reference_table (T::tableTag));
+ void init (hb_face_t *face,
+ unsigned int default_advance_ = 0)
+ {
+ default_advance = default_advance_ ? default_advance_ : hb_face_get_upem (face);
+
+ num_advances = T::is_horizontal ? face->table.hhea->numberOfLongMetrics : face->table.vhea->numberOfLongMetrics;
+
+ table = hb_sanitize_context_t().reference_table<hmtxvmtx> (face, T::tableTag);
/* Cap num_metrics() and num_advances() based on table length. */
- unsigned int len = hb_blob_get_length (blob);
+ unsigned int len = table.get_length ();
if (unlikely (num_advances * 4 > len))
num_advances = len / 4;
num_metrics = num_advances + (len - 4 * num_advances) / 2;
@@ -114,23 +182,49 @@ struct hmtxvmtx
if (unlikely (!num_advances))
{
num_metrics = num_advances = 0;
- hb_blob_destroy (blob);
- blob = hb_blob_get_empty ();
+ table.destroy ();
+ table = hb_blob_get_empty ();
}
- table = Sanitizer<hmtxvmtx>::lock_instance (blob);
- var_blob = Sanitizer<HVARVVAR>::sanitize (face->reference_table (T::variationsTag));
- var_table = Sanitizer<HVARVVAR>::lock_instance (var_blob);
+ var_table = hb_sanitize_context_t().reference_table<HVARVVAR> (face, T::variationsTag);
+ }
+
+ void fini ()
+ {
+ table.destroy ();
+ var_table.destroy ();
}
- inline void fini (void)
+ int get_side_bearing (hb_codepoint_t glyph) const
{
- hb_blob_destroy (blob);
- hb_blob_destroy (var_blob);
+ if (glyph < num_advances)
+ return table->longMetricZ[glyph].sb;
+
+ if (unlikely (glyph >= num_metrics))
+ return 0;
+
+ const FWORD *bearings = (const FWORD *) &table->longMetricZ[num_advances];
+ return bearings[glyph - num_advances];
+ }
+
+ int get_side_bearing (hb_font_t *font, hb_codepoint_t glyph) const
+ {
+ int side_bearing = get_side_bearing (glyph);
+
+#ifndef HB_NO_VAR
+ if (unlikely (glyph >= num_metrics) || !font->num_coords)
+ return side_bearing;
+
+ if (var_table.get_length ())
+ return side_bearing + var_table->get_side_bearing_var (glyph, font->coords, font->num_coords); // TODO Optimize?!
+
+ return _glyf_get_side_bearing_var (font, glyph, T::tableTag == HB_OT_TAG_vmtx);
+#else
+ return side_bearing;
+#endif
}
- inline unsigned int get_advance (hb_codepoint_t glyph,
- hb_font_t *font) const
+ unsigned int get_advance (hb_codepoint_t glyph) const
{
if (unlikely (glyph >= num_metrics))
{
@@ -143,29 +237,65 @@ struct hmtxvmtx
return default_advance;
}
- return table->longMetric[MIN (glyph, (uint32_t) num_advances - 1)].advance
- + var_table->get_advance_var (glyph, font->coords, font->num_coords); // TODO Optimize?!
+ return table->longMetricZ[hb_min (glyph, (uint32_t) num_advances - 1)].advance;
}
- public:
- bool has_font_extents;
- unsigned short ascender;
- unsigned short descender;
- unsigned short line_gap;
+ unsigned int get_advance (hb_codepoint_t glyph,
+ hb_font_t *font) const
+ {
+ unsigned int advance = get_advance (glyph);
+
+#ifndef HB_NO_VAR
+ if (unlikely (glyph >= num_metrics) || !font->num_coords)
+ return advance;
+
+ if (var_table.get_length ())
+ return advance + roundf (var_table->get_advance_var (font, glyph)); // TODO Optimize?!
+
+ return _glyf_get_advance_var (font, glyph, T::tableTag == HB_OT_TAG_vmtx);
+#else
+ return advance;
+#endif
+ }
+
+ unsigned int num_advances_for_subset (const hb_subset_plan_t *plan) const
+ {
+ unsigned int num_advances = plan->num_output_glyphs ();
+ unsigned int last_advance = _advance_for_new_gid (plan,
+ num_advances - 1);
+ while (num_advances > 1 &&
+ last_advance == _advance_for_new_gid (plan,
+ num_advances - 2))
+ {
+ num_advances--;
+ }
+
+ return num_advances;
+ }
private:
+ unsigned int _advance_for_new_gid (const hb_subset_plan_t *plan,
+ hb_codepoint_t new_gid) const
+ {
+ hb_codepoint_t old_gid;
+ if (!plan->old_gid_for_new_gid (new_gid, &old_gid))
+ return 0;
+
+ return get_advance (old_gid);
+ }
+
+ protected:
unsigned int num_metrics;
unsigned int num_advances;
unsigned int default_advance;
- const hmtxvmtx *table;
- hb_blob_t *blob;
- const HVARVVAR *var_table;
- hb_blob_t *var_blob;
+ private:
+ hb_blob_ptr_t<hmtxvmtx> table;
+ hb_blob_ptr_t<HVARVVAR> var_table;
};
protected:
- LongMetric longMetric[VAR]; /* Paired advance width and leading
+ UnsizedArrayOf<LongMetric>longMetricZ;/* Paired advance width and leading
* bearing values for each glyph. The
* value numOfHMetrics comes from
* the 'hhea' table. If the font is
@@ -173,7 +303,7 @@ struct hmtxvmtx
* be in the array, but that entry is
* required. The last entry applies to
* all subsequent glyphs. */
- FWORD leadingBearingX[VAR]; /* Here the advance is assumed
+/*UnsizedArrayOf<FWORD> leadingBearingX;*//* Here the advance is assumed
* to be the same as the advance
* for the last entry above. The
* number of entries in this array is
@@ -187,22 +317,23 @@ struct hmtxvmtx
* font to vary the side bearing
* values for each glyph. */
public:
- DEFINE_SIZE_ARRAY2 (0, longMetric, leadingBearingX);
+ DEFINE_SIZE_ARRAY (0, longMetricZ);
};
-struct hmtx : hmtxvmtx<hmtx> {
- static const hb_tag_t tableTag = HB_OT_TAG_hmtx;
- static const hb_tag_t headerTag = HB_OT_TAG_hhea;
- static const hb_tag_t variationsTag = HB_OT_TAG_HVAR;
- static const hb_tag_t os2Tag = HB_OT_TAG_os2;
+struct hmtx : hmtxvmtx<hmtx, hhea> {
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_hmtx;
+ static constexpr hb_tag_t variationsTag = HB_OT_TAG_HVAR;
+ static constexpr bool is_horizontal = true;
};
-struct vmtx : hmtxvmtx<vmtx> {
- static const hb_tag_t tableTag = HB_OT_TAG_vmtx;
- static const hb_tag_t headerTag = HB_OT_TAG_vhea;
- static const hb_tag_t variationsTag = HB_OT_TAG_VVAR;
- static const hb_tag_t os2Tag = HB_TAG_NONE;
+struct vmtx : hmtxvmtx<vmtx, vhea> {
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_vmtx;
+ static constexpr hb_tag_t variationsTag = HB_OT_TAG_VVAR;
+ static constexpr bool is_horizontal = false;
};
+struct hmtx_accelerator_t : hmtx::accelerator_t {};
+struct vmtx_accelerator_t : vmtx::accelerator_t {};
+
} /* namespace OT */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-kern-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-kern-table.hh
index e07faca63f..36e5a358e6 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-kern-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-kern-table.hh
@@ -27,365 +27,325 @@
#ifndef HB_OT_KERN_TABLE_HH
#define HB_OT_KERN_TABLE_HH
-#include "hb-open-type-private.hh"
-
-namespace OT {
+#include "hb-aat-layout-kerx-table.hh"
/*
* kern -- Kerning
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/kern
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6kern.html
*/
-
#define HB_OT_TAG_kern HB_TAG('k','e','r','n')
-struct hb_glyph_pair_t
-{
- hb_codepoint_t left;
- hb_codepoint_t right;
-};
-
-struct KernPair
-{
- inline int get_kerning (void) const
- { return value; }
-
- inline int cmp (const hb_glyph_pair_t &o) const
- {
- int ret = left.cmp (o.left);
- if (ret) return ret;
- return right.cmp (o.right);
- }
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
+namespace OT {
- protected:
- GlyphID left;
- GlyphID right;
- FWORD value;
- public:
- DEFINE_SIZE_STATIC (6);
-};
-struct KernSubTableFormat0
+template <typename KernSubTableHeader>
+struct KernSubTableFormat3
{
- inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+ int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
{
- hb_glyph_pair_t pair = {left, right};
- int i = pairs.bsearch (pair);
- if (i == -1)
+ hb_array_t<const FWORD> kernValue = kernValueZ.as_array (kernValueCount);
+ hb_array_t<const HBUINT8> leftClass = StructAfter<const UnsizedArrayOf<HBUINT8>> (kernValue).as_array (glyphCount);
+ hb_array_t<const HBUINT8> rightClass = StructAfter<const UnsizedArrayOf<HBUINT8>> (leftClass).as_array (glyphCount);
+ hb_array_t<const HBUINT8> kernIndex = StructAfter<const UnsizedArrayOf<HBUINT8>> (rightClass).as_array (leftClassCount * rightClassCount);
+
+ unsigned int leftC = leftClass[left];
+ unsigned int rightC = rightClass[right];
+ if (unlikely (leftC >= leftClassCount || rightC >= rightClassCount))
return 0;
- return pairs[i].get_kerning ();
+ unsigned int i = leftC * rightClassCount + rightC;
+ return kernValue[kernIndex[i]];
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool apply (AAT::hb_aat_apply_context_t *c) const
{
- TRACE_SANITIZE (this);
- return_trace (pairs.sanitize (c));
- }
+ TRACE_APPLY (this);
- protected:
- BinSearchArrayOf<KernPair> pairs; /* Array of kerning pairs. */
- public:
- DEFINE_SIZE_ARRAY (8, pairs);
-};
+ if (!c->plan->requested_kerning)
+ return false;
-struct KernClassTable
-{
- inline unsigned int get_class (hb_codepoint_t g) const { return classes[g - firstGlyph]; }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (firstGlyph.sanitize (c) && classes.sanitize (c));
- }
+ if (header.coverage & header.Backwards)
+ return false;
- protected:
- UINT16 firstGlyph; /* First glyph in class range. */
- ArrayOf<UINT16> classes; /* Glyph classes. */
- public:
- DEFINE_SIZE_ARRAY (4, classes);
-};
+ hb_kern_machine_t<KernSubTableFormat3> machine (*this, header.coverage & header.CrossStream);
+ machine.kern (c->font, c->buffer, c->plan->kern_mask);
-struct KernSubTableFormat2
-{
- inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const
- {
- unsigned int l = (this+leftClassTable).get_class (left);
- unsigned int r = (this+leftClassTable).get_class (left);
- unsigned int offset = l * rowWidth + r * sizeof (FWORD);
- const FWORD *arr = &(this+array);
- if (unlikely ((const void *) arr < (const void *) this || (const void *) arr >= (const void *) end))
- return 0;
- const FWORD *v = &StructAtOffset<FWORD> (arr, offset);
- if (unlikely ((const void *) v < (const void *) arr || (const void *) (v + 1) > (const void *) end))
- return 0;
- return *v;
+ return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
- return_trace (rowWidth.sanitize (c) &&
- leftClassTable.sanitize (c, this) &&
- rightClassTable.sanitize (c, this) &&
- array.sanitize (c, this));
+ return_trace (c->check_struct (this) &&
+ c->check_range (kernValueZ,
+ kernValueCount * sizeof (FWORD) +
+ glyphCount * 2 +
+ leftClassCount * rightClassCount));
}
protected:
- UINT16 rowWidth; /* The width, in bytes, of a row in the table. */
- OffsetTo<KernClassTable>
- leftClassTable; /* Offset from beginning of this subtable to
- * left-hand class table. */
- OffsetTo<KernClassTable>
- rightClassTable;/* Offset from beginning of this subtable to
- * right-hand class table. */
- OffsetTo<FWORD>
- array; /* Offset from beginning of this subtable to
- * the start of the kerning array. */
+ KernSubTableHeader header;
+ HBUINT16 glyphCount; /* The number of glyphs in this font. */
+ HBUINT8 kernValueCount; /* The number of kerning values. */
+ HBUINT8 leftClassCount; /* The number of left-hand classes. */
+ HBUINT8 rightClassCount;/* The number of right-hand classes. */
+ HBUINT8 flags; /* Set to zero (reserved for future use). */
+ UnsizedArrayOf<FWORD> kernValueZ; /* The kerning values.
+ * Length kernValueCount. */
+#if 0
+ UnsizedArrayOf<HBUINT8>leftClass; /* The left-hand classes.
+ * Length glyphCount. */
+ UnsizedArrayOf<HBUINT8>rightClass; /* The right-hand classes.
+ * Length glyphCount. */
+ UnsizedArrayOf<HBUINT8>kernIndex; /* The indices into the kernValue array.
+ * Length leftClassCount * rightClassCount */
+#endif
public:
- DEFINE_SIZE_MIN (8);
+ DEFINE_SIZE_ARRAY (KernSubTableHeader::static_size + 6, kernValueZ);
};
+template <typename KernSubTableHeader>
struct KernSubTable
{
- inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end, unsigned int format) const
+ unsigned int get_size () const { return u.header.length; }
+ unsigned int get_type () const { return u.header.format; }
+
+ int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
{
- switch (format) {
+ switch (get_type ()) {
+ /* This method hooks up to hb_font_t's get_h_kerning. Only support Format0. */
case 0: return u.format0.get_kerning (left, right);
- case 2: return u.format2.get_kerning (left, right, end);
default:return 0;
}
}
- inline bool sanitize (hb_sanitize_context_t *c, unsigned int format) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
- TRACE_SANITIZE (this);
- switch (format) {
- case 0: return_trace (u.format0.sanitize (c));
- case 2: return_trace (u.format2.sanitize (c));
- default:return_trace (true);
+ unsigned int subtable_type = get_type ();
+ TRACE_DISPATCH (this, subtable_type);
+ switch (subtable_type) {
+ case 0: return_trace (c->dispatch (u.format0));
+#ifndef HB_NO_AAT_SHAPE
+ case 1: return_trace (u.header.apple ? c->dispatch (u.format1, hb_forward<Ts> (ds)...) : c->default_return_value ());
+#endif
+ case 2: return_trace (c->dispatch (u.format2));
+#ifndef HB_NO_AAT_SHAPE
+ case 3: return_trace (u.header.apple ? c->dispatch (u.format3, hb_forward<Ts> (ds)...) : c->default_return_value ());
+#endif
+ default: return_trace (c->default_return_value ());
}
}
- protected:
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!u.header.sanitize (c) ||
+ u.header.length < u.header.min_size ||
+ !c->check_range (this, u.header.length))) return_trace (false);
+
+ return_trace (dispatch (c));
+ }
+
+ public:
union {
- KernSubTableFormat0 format0;
- KernSubTableFormat2 format2;
+ KernSubTableHeader header;
+ AAT::KerxSubTableFormat0<KernSubTableHeader> format0;
+ AAT::KerxSubTableFormat1<KernSubTableHeader> format1;
+ AAT::KerxSubTableFormat2<KernSubTableHeader> format2;
+ KernSubTableFormat3<KernSubTableHeader> format3;
} u;
public:
- DEFINE_SIZE_MIN (0);
+ DEFINE_SIZE_MIN (KernSubTableHeader::static_size);
};
-template <typename T>
-struct KernSubTableWrapper
+struct KernOTSubTableHeader
{
- /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
- inline const T* thiz (void) const { return static_cast<const T *> (this); }
+ static constexpr bool apple = false;
+ typedef AAT::ObsoleteTypes Types;
- inline bool is_horizontal (void) const
- { return (thiz()->coverage & T::COVERAGE_CHECK_FLAGS) == T::COVERAGE_CHECK_HORIZONTAL; }
+ unsigned tuple_count () const { return 0; }
+ bool is_horizontal () const { return (coverage & Horizontal); }
- inline bool is_override (void) const
- { return bool (thiz()->coverage & T::COVERAGE_OVERRIDE_FLAG); }
-
- inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const
- { return thiz()->subtable.get_kerning (left, right, end, thiz()->format); }
-
- inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const
- { return is_horizontal () ? get_kerning (left, right, end) : 0; }
-
- inline unsigned int get_size (void) const { return thiz()->length; }
+ enum Coverage
+ {
+ Horizontal = 0x01u,
+ Minimum = 0x02u,
+ CrossStream = 0x04u,
+ Override = 0x08u,
+
+ /* Not supported: */
+ Backwards = 0x00u,
+ Variation = 0x00u,
+ };
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
- return_trace (c->check_struct (thiz()) &&
- thiz()->length >= thiz()->min_size &&
- c->check_array (thiz(), 1, thiz()->length) &&
- thiz()->subtable.sanitize (c, thiz()->format));
+ return_trace (c->check_struct (this));
}
+
+ public:
+ HBUINT16 versionZ; /* Unused. */
+ HBUINT16 length; /* Length of the subtable (including this header). */
+ HBUINT8 format; /* Subtable format. */
+ HBUINT8 coverage; /* Coverage bits. */
+ public:
+ DEFINE_SIZE_STATIC (6);
};
-template <typename T>
-struct KernTable
+struct KernOT : AAT::KerxTable<KernOT>
{
- /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
- inline const T* thiz (void) const { return static_cast<const T *> (this); }
+ friend struct AAT::KerxTable<KernOT>;
- inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right, unsigned int table_length) const
- {
- int v = 0;
- const typename T::SubTableWrapper *st = CastP<typename T::SubTableWrapper> (thiz()->data);
- unsigned int count = thiz()->nTables;
- for (unsigned int i = 0; i < count; i++)
- {
- if (st->is_override ())
- v = 0;
- v += st->get_h_kerning (left, right, table_length + (const char *) this);
- st = &StructAfter<typename T::SubTableWrapper> (*st);
- }
- return v;
- }
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_kern;
+ static constexpr unsigned minVersion = 0u;
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!c->check_struct (thiz()) ||
- thiz()->version != T::VERSION))
- return_trace (false);
-
- const typename T::SubTableWrapper *st = CastP<typename T::SubTableWrapper> (thiz()->data);
- unsigned int count = thiz()->nTables;
- for (unsigned int i = 0; i < count; i++)
- {
- if (unlikely (!st->sanitize (c)))
- return_trace (false);
- st = &StructAfter<typename T::SubTableWrapper> (*st);
- }
+ typedef KernOTSubTableHeader SubTableHeader;
+ typedef SubTableHeader::Types Types;
+ typedef KernSubTable<SubTableHeader> SubTable;
- return_trace (true);
- }
+ protected:
+ HBUINT16 version; /* Version--0x0000u */
+ HBUINT16 tableCount; /* Number of subtables in the kerning table. */
+ SubTable firstSubTable; /* Subtables. */
+ public:
+ DEFINE_SIZE_MIN (4);
};
-struct KernOT : KernTable<KernOT>
+
+struct KernAATSubTableHeader
{
- friend struct KernTable<KernOT>;
+ static constexpr bool apple = true;
+ typedef AAT::ObsoleteTypes Types;
- static const uint16_t VERSION = 0x0000u;
+ unsigned tuple_count () const { return 0; }
+ bool is_horizontal () const { return !(coverage & Vertical); }
- struct SubTableWrapper : KernSubTableWrapper<SubTableWrapper>
+ enum Coverage
{
- friend struct KernSubTableWrapper<SubTableWrapper>;
-
- enum coverage_flags_t {
- COVERAGE_DIRECTION_FLAG = 0x01u,
- COVERAGE_MINIMUM_FLAG = 0x02u,
- COVERAGE_CROSSSTREAM_FLAG = 0x04u,
- COVERAGE_OVERRIDE_FLAG = 0x08u,
-
- COVERAGE_VARIATION_FLAG = 0x00u, /* Not supported. */
-
- COVERAGE_CHECK_FLAGS = 0x07u,
- COVERAGE_CHECK_HORIZONTAL = 0x01u
- };
-
- protected:
- UINT16 versionZ; /* Unused. */
- UINT16 length; /* Length of the subtable (including this header). */
- UINT8 format; /* Subtable format. */
- UINT8 coverage; /* Coverage bits. */
- KernSubTable subtable; /* Subtable data. */
- public:
- DEFINE_SIZE_MIN (6);
+ Vertical = 0x80u,
+ CrossStream = 0x40u,
+ Variation = 0x20u,
+
+ /* Not supported: */
+ Backwards = 0x00u,
};
- protected:
- UINT16 version; /* Version--0x0000u */
- UINT16 nTables; /* Number of subtables in the kerning table. */
- UINT8 data[VAR];
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ public:
+ HBUINT32 length; /* Length of the subtable (including this header). */
+ HBUINT8 coverage; /* Coverage bits. */
+ HBUINT8 format; /* Subtable format. */
+ HBUINT16 tupleIndex; /* The tuple index (used for variations fonts).
+ * This value specifies which tuple this subtable covers.
+ * Note: We don't implement. */
public:
- DEFINE_SIZE_ARRAY (4, data);
+ DEFINE_SIZE_STATIC (8);
};
-struct KernAAT : KernTable<KernAAT>
+struct KernAAT : AAT::KerxTable<KernAAT>
{
- friend struct KernTable<KernAAT>;
+ friend struct AAT::KerxTable<KernAAT>;
- static const uint32_t VERSION = 0x00010000u;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_kern;
+ static constexpr unsigned minVersion = 0x00010000u;
- struct SubTableWrapper : KernSubTableWrapper<SubTableWrapper>
- {
- friend struct KernSubTableWrapper<SubTableWrapper>;
-
- enum coverage_flags_t {
- COVERAGE_DIRECTION_FLAG = 0x80u,
- COVERAGE_CROSSSTREAM_FLAG = 0x40u,
- COVERAGE_VARIATION_FLAG = 0x20u,
-
- COVERAGE_OVERRIDE_FLAG = 0x00u, /* Not supported. */
-
- COVERAGE_CHECK_FLAGS = 0xE0u,
- COVERAGE_CHECK_HORIZONTAL = 0x00u
- };
-
- protected:
- UINT32 length; /* Length of the subtable (including this header). */
- UINT8 coverage; /* Coverage bits. */
- UINT8 format; /* Subtable format. */
- UINT16 tupleIndex; /* The tuple index (used for variations fonts).
- * This value specifies which tuple this subtable covers. */
- KernSubTable subtable; /* Subtable data. */
- public:
- DEFINE_SIZE_MIN (8);
- };
+ typedef KernAATSubTableHeader SubTableHeader;
+ typedef SubTableHeader::Types Types;
+ typedef KernSubTable<SubTableHeader> SubTable;
protected:
- UINT32 version; /* Version--0x00010000u */
- UINT32 nTables; /* Number of subtables in the kerning table. */
- UINT8 data[VAR];
+ HBUINT32 version; /* Version--0x00010000u */
+ HBUINT32 tableCount; /* Number of subtables in the kerning table. */
+ SubTable firstSubTable; /* Subtables. */
public:
- DEFINE_SIZE_ARRAY (8, data);
+ DEFINE_SIZE_MIN (8);
};
struct kern
{
- static const hb_tag_t tableTag = HB_OT_TAG_kern;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_kern;
- inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right, unsigned int table_length) const
+ bool has_data () const { return u.version32; }
+ unsigned get_type () const { return u.major; }
+
+ bool has_state_machine () const
{
- switch (u.major) {
- case 0: return u.ot.get_h_kerning (left, right, table_length);
- case 1: return u.aat.get_h_kerning (left, right, table_length);
- default:return 0;
+ switch (get_type ()) {
+ case 0: return u.ot.has_state_machine ();
+#ifndef HB_NO_AAT_SHAPE
+ case 1: return u.aat.has_state_machine ();
+#endif
+ default:return false;
}
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool has_cross_stream () const
{
- TRACE_SANITIZE (this);
- if (!u.major.sanitize (c)) return_trace (false);
- switch (u.major) {
- case 0: return_trace (u.ot.sanitize (c));
- case 1: return_trace (u.aat.sanitize (c));
- default:return_trace (true);
+ switch (get_type ()) {
+ case 0: return u.ot.has_cross_stream ();
+#ifndef HB_NO_AAT_SHAPE
+ case 1: return u.aat.has_cross_stream ();
+#endif
+ default:return false;
}
}
- struct accelerator_t
+ int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const
{
- inline void init (hb_face_t *face)
- {
- blob = Sanitizer<kern>::sanitize (face->reference_table (HB_OT_TAG_kern));
- table = Sanitizer<kern>::lock_instance (blob);
- table_length = hb_blob_get_length (blob);
- }
- inline void fini (void)
- {
- hb_blob_destroy (blob);
+ switch (get_type ()) {
+ case 0: return u.ot.get_h_kerning (left, right);
+#ifndef HB_NO_AAT_SHAPE
+ case 1: return u.aat.get_h_kerning (left, right);
+#endif
+ default:return 0;
}
+ }
- inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const
- { return table->get_h_kerning (left, right, table_length); }
+ bool apply (AAT::hb_aat_apply_context_t *c) const
+ { return dispatch (c); }
- private:
- hb_blob_t *blob;
- const kern *table;
- unsigned int table_length;
- };
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+ {
+ unsigned int subtable_type = get_type ();
+ TRACE_DISPATCH (this, subtable_type);
+ switch (subtable_type) {
+ case 0: return_trace (c->dispatch (u.ot, hb_forward<Ts> (ds)...));
+#ifndef HB_NO_AAT_SHAPE
+ case 1: return_trace (c->dispatch (u.aat, hb_forward<Ts> (ds)...));
+#endif
+ default: return_trace (c->default_return_value ());
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!u.version32.sanitize (c)) return_trace (false);
+ return_trace (dispatch (c));
+ }
protected:
union {
- UINT16 major;
+ HBUINT32 version32;
+ HBUINT16 major;
KernOT ot;
+#ifndef HB_NO_AAT_SHAPE
KernAAT aat;
+#endif
} u;
public:
- DEFINE_SIZE_UNION (2, major);
+ DEFINE_SIZE_UNION (4, version32);
};
} /* namespace OT */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh
new file mode 100644
index 0000000000..02fe14fa06
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh
@@ -0,0 +1,509 @@
+/*
+ * Copyright © 2016 Elie Roux <elie.roux@telecom-bretagne.eu>
+ * Copyright © 2018 Google, Inc.
+ * Copyright © 2018-2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_LAYOUT_BASE_TABLE_HH
+#define HB_OT_LAYOUT_BASE_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-layout-common.hh"
+
+namespace OT {
+
+/*
+ * BASE -- Baseline
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/base
+ */
+
+struct BaseCoordFormat1
+{
+ hb_position_t get_coord () const { return coordinate; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 1 */
+ FWORD coordinate; /* X or Y value, in design units */
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+struct BaseCoordFormat2
+{
+ hb_position_t get_coord () const
+ {
+ /* TODO */
+ return coordinate;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 2 */
+ FWORD coordinate; /* X or Y value, in design units */
+ HBGlyphID referenceGlyph; /* Glyph ID of control glyph */
+ HBUINT16 coordPoint; /* Index of contour point on the
+ * reference glyph */
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+struct BaseCoordFormat3
+{
+ hb_position_t get_coord (hb_font_t *font,
+ const VariationStore &var_store,
+ hb_direction_t direction) const
+ {
+ const Device &device = this+deviceTable;
+ return coordinate + (HB_DIRECTION_IS_VERTICAL (direction) ?
+ device.get_y_delta (font, var_store) :
+ device.get_x_delta (font, var_store));
+ }
+
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ deviceTable.sanitize (c, this)));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 3 */
+ FWORD coordinate; /* X or Y value, in design units */
+ OffsetTo<Device>
+ deviceTable; /* Offset to Device table for X or
+ * Y value, from beginning of
+ * BaseCoord table (may be NULL). */
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+struct BaseCoord
+{
+ bool has_data () const { return u.format; }
+
+ hb_position_t get_coord (hb_font_t *font,
+ const VariationStore &var_store,
+ hb_direction_t direction) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.get_coord ();
+ case 2: return u.format2.get_coord ();
+ case 3: return u.format3.get_coord (font, var_store, direction);
+ default:return 0;
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!u.format.sanitize (c))) return_trace (false);
+ switch (u.format) {
+ case 1: return_trace (u.format1.sanitize (c));
+ case 2: return_trace (u.format2.sanitize (c));
+ case 3: return_trace (u.format3.sanitize (c));
+ default:return_trace (false);
+ }
+ }
+
+ protected:
+ union {
+ HBUINT16 format;
+ BaseCoordFormat1 format1;
+ BaseCoordFormat2 format2;
+ BaseCoordFormat3 format3;
+ } u;
+ public:
+ DEFINE_SIZE_UNION (2, format);
+};
+
+struct FeatMinMaxRecord
+{
+ int cmp (hb_tag_t key) const { return tag.cmp (key); }
+
+ bool has_data () const { return tag; }
+
+ void get_min_max (const BaseCoord **min, const BaseCoord **max) const
+ {
+ if (likely (min)) *min = &(this+minCoord);
+ if (likely (max)) *max = &(this+maxCoord);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ minCoord.sanitize (c, this) &&
+ maxCoord.sanitize (c, this)));
+ }
+
+ protected:
+ Tag tag; /* 4-byte feature identification tag--must
+ * match feature tag in FeatureList */
+ OffsetTo<BaseCoord>
+ minCoord; /* Offset to BaseCoord table that defines
+ * the minimum extent value, from beginning
+ * of MinMax table (may be NULL) */
+ OffsetTo<BaseCoord>
+ maxCoord; /* Offset to BaseCoord table that defines
+ * the maximum extent value, from beginning
+ * of MinMax table (may be NULL) */
+ public:
+ DEFINE_SIZE_STATIC (8);
+
+};
+
+struct MinMax
+{
+ void get_min_max (hb_tag_t feature_tag,
+ const BaseCoord **min,
+ const BaseCoord **max) const
+ {
+ const FeatMinMaxRecord &minMaxCoord = featMinMaxRecords.bsearch (feature_tag);
+ if (minMaxCoord.has_data ())
+ minMaxCoord.get_min_max (min, max);
+ else
+ {
+ if (likely (min)) *min = &(this+minCoord);
+ if (likely (max)) *max = &(this+maxCoord);
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ minCoord.sanitize (c, this) &&
+ maxCoord.sanitize (c, this) &&
+ featMinMaxRecords.sanitize (c, this)));
+ }
+
+ protected:
+ OffsetTo<BaseCoord>
+ minCoord; /* Offset to BaseCoord table that defines
+ * minimum extent value, from the beginning
+ * of MinMax table (may be NULL) */
+ OffsetTo<BaseCoord>
+ maxCoord; /* Offset to BaseCoord table that defines
+ * maximum extent value, from the beginning
+ * of MinMax table (may be NULL) */
+ SortedArrayOf<FeatMinMaxRecord>
+ featMinMaxRecords;
+ /* Array of FeatMinMaxRecords, in alphabetical
+ * order by featureTableTag */
+ public:
+ DEFINE_SIZE_ARRAY (6, featMinMaxRecords);
+};
+
+struct BaseValues
+{
+ const BaseCoord &get_base_coord (int baseline_tag_index) const
+ {
+ if (baseline_tag_index == -1) baseline_tag_index = defaultIndex;
+ return this+baseCoords[baseline_tag_index];
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ baseCoords.sanitize (c, this)));
+ }
+
+ protected:
+ Index defaultIndex; /* Index number of default baseline for this
+ * script — equals index position of baseline tag
+ * in baselineTags array of the BaseTagList */
+ OffsetArrayOf<BaseCoord>
+ baseCoords; /* Number of BaseCoord tables defined — should equal
+ * baseTagCount in the BaseTagList
+ *
+ * Array of offsets to BaseCoord tables, from beginning of
+ * BaseValues table — order matches baselineTags array in
+ * the BaseTagList */
+ public:
+ DEFINE_SIZE_ARRAY (4, baseCoords);
+};
+
+struct BaseLangSysRecord
+{
+ int cmp (hb_tag_t key) const { return baseLangSysTag.cmp (key); }
+
+ bool has_data () const { return baseLangSysTag; }
+
+ const MinMax &get_min_max () const { return this+minMax; }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ minMax.sanitize (c, this)));
+ }
+
+ protected:
+ Tag baseLangSysTag; /* 4-byte language system identification tag */
+ OffsetTo<MinMax>
+ minMax; /* Offset to MinMax table, from beginning
+ * of BaseScript table */
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+struct BaseScript
+{
+ const MinMax &get_min_max (hb_tag_t language_tag) const
+ {
+ const BaseLangSysRecord& record = baseLangSysRecords.bsearch (language_tag);
+ return record.has_data () ? record.get_min_max () : this+defaultMinMax;
+ }
+
+ const BaseCoord &get_base_coord (int baseline_tag_index) const
+ { return (this+baseValues).get_base_coord (baseline_tag_index); }
+
+ bool has_data () const { return baseValues; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ baseValues.sanitize (c, this) &&
+ defaultMinMax.sanitize (c, this) &&
+ baseLangSysRecords.sanitize (c, this)));
+ }
+
+ protected:
+ OffsetTo<BaseValues>
+ baseValues; /* Offset to BaseValues table, from beginning
+ * of BaseScript table (may be NULL) */
+ OffsetTo<MinMax>
+ defaultMinMax; /* Offset to MinMax table, from beginning of
+ * BaseScript table (may be NULL) */
+ SortedArrayOf<BaseLangSysRecord>
+ baseLangSysRecords;
+ /* Number of BaseLangSysRecords
+ * defined — may be zero (0) */
+
+ public:
+ DEFINE_SIZE_ARRAY (6, baseLangSysRecords);
+};
+
+struct BaseScriptList;
+struct BaseScriptRecord
+{
+ int cmp (hb_tag_t key) const { return baseScriptTag.cmp (key); }
+
+ bool has_data () const { return baseScriptTag; }
+
+ const BaseScript &get_base_script (const BaseScriptList *list) const
+ { return list+baseScript; }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ baseScript.sanitize (c, base)));
+ }
+
+ protected:
+ Tag baseScriptTag; /* 4-byte script identification tag */
+ OffsetTo<BaseScript>
+ baseScript; /* Offset to BaseScript table, from beginning
+ * of BaseScriptList */
+
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+struct BaseScriptList
+{
+ const BaseScript &get_base_script (hb_tag_t script) const
+ {
+ const BaseScriptRecord *record = &baseScriptRecords.bsearch (script);
+ if (!record->has_data ()) record = &baseScriptRecords.bsearch (HB_TAG ('D','F','L','T'));
+ return record->has_data () ? record->get_base_script (this) : Null (BaseScript);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ baseScriptRecords.sanitize (c, this));
+ }
+
+ protected:
+ SortedArrayOf<BaseScriptRecord>
+ baseScriptRecords;
+
+ public:
+ DEFINE_SIZE_ARRAY (2, baseScriptRecords);
+};
+
+struct Axis
+{
+ bool get_baseline (hb_tag_t baseline_tag,
+ hb_tag_t script_tag,
+ hb_tag_t language_tag,
+ const BaseCoord **coord) const
+ {
+ const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
+ if (!base_script.has_data ()) return false;
+
+ if (likely (coord))
+ {
+ unsigned int tag_index = 0;
+ (this+baseTagList).bfind (baseline_tag, &tag_index);
+ *coord = &base_script.get_base_coord (tag_index);
+ }
+
+ return true;
+ }
+
+ bool get_min_max (hb_tag_t script_tag,
+ hb_tag_t language_tag,
+ hb_tag_t feature_tag,
+ const BaseCoord **min_coord,
+ const BaseCoord **max_coord) const
+ {
+ const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
+ if (!base_script.has_data ()) return false;
+
+ base_script.get_min_max (language_tag).get_min_max (feature_tag, min_coord, max_coord);
+
+ return true;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ (this+baseTagList).sanitize (c) &&
+ (this+baseScriptList).sanitize (c)));
+ }
+
+ protected:
+ OffsetTo<SortedArrayOf<Tag>>
+ baseTagList; /* Offset to BaseTagList table, from beginning
+ * of Axis table (may be NULL)
+ * Array of 4-byte baseline identification tags — must
+ * be in alphabetical order */
+ OffsetTo<BaseScriptList>
+ baseScriptList; /* Offset to BaseScriptList table, from beginning
+ * of Axis table
+ * Array of BaseScriptRecords, in alphabetical order
+ * by baseScriptTag */
+
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+struct BASE
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_BASE;
+
+ const Axis &get_axis (hb_direction_t direction) const
+ { return HB_DIRECTION_IS_VERTICAL (direction) ? this+vAxis : this+hAxis; }
+
+ const VariationStore &get_var_store () const
+ { return version.to_int () < 0x00010001u ? Null (VariationStore) : this+varStore; }
+
+ bool get_baseline (hb_font_t *font,
+ hb_tag_t baseline_tag,
+ hb_direction_t direction,
+ hb_tag_t script_tag,
+ hb_tag_t language_tag,
+ hb_position_t *base) const
+ {
+ const BaseCoord *base_coord = nullptr;
+ if (unlikely (!get_axis (direction).get_baseline (baseline_tag, script_tag, language_tag, &base_coord) ||
+ !base_coord || !base_coord->has_data ()))
+ return false;
+
+ if (likely (base))
+ *base = base_coord->get_coord (font, get_var_store (), direction);
+
+ return true;
+ }
+
+ /* TODO: Expose this separately sometime? */
+ bool get_min_max (hb_font_t *font,
+ hb_direction_t direction,
+ hb_tag_t script_tag,
+ hb_tag_t language_tag,
+ hb_tag_t feature_tag,
+ hb_position_t *min,
+ hb_position_t *max)
+ {
+ const BaseCoord *min_coord, *max_coord;
+ if (!get_axis (direction).get_min_max (script_tag, language_tag, feature_tag,
+ &min_coord, &max_coord))
+ return false;
+
+ const VariationStore &var_store = get_var_store ();
+ if (likely (min && min_coord)) *min = min_coord->get_coord (font, var_store, direction);
+ if (likely (max && max_coord)) *max = max_coord->get_coord (font, var_store, direction);
+ return true;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ likely (version.major == 1) &&
+ hAxis.sanitize (c, this) &&
+ vAxis.sanitize (c, this) &&
+ (version.to_int () < 0x00010001u || varStore.sanitize (c, this))));
+ }
+
+ protected:
+ FixedVersion<>version; /* Version of the BASE table */
+ OffsetTo<Axis>hAxis; /* Offset to horizontal Axis table, from beginning
+ * of BASE table (may be NULL) */
+ OffsetTo<Axis>vAxis; /* Offset to vertical Axis table, from beginning
+ * of BASE table (may be NULL) */
+ LOffsetTo<VariationStore>
+ varStore; /* Offset to the table of Item Variation
+ * Store--from beginning of BASE
+ * header (may be NULL). Introduced
+ * in version 0x00010001. */
+ public:
+ DEFINE_SIZE_MIN (8);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_BASE_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common-private.hh
deleted file mode 100644
index 5e699e1967..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common-private.hh
+++ /dev/null
@@ -1,1772 +0,0 @@
-/*
- * Copyright © 2007,2008,2009 Red Hat, Inc.
- * Copyright © 2010,2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_LAYOUT_COMMON_PRIVATE_HH
-#define HB_OT_LAYOUT_COMMON_PRIVATE_HH
-
-#include "hb-private.hh"
-#include "hb-debug.hh"
-#include "hb-ot-layout-private.hh"
-#include "hb-open-type-private.hh"
-#include "hb-set-private.hh"
-
-
-#ifndef HB_MAX_NESTING_LEVEL
-#define HB_MAX_NESTING_LEVEL 6
-#endif
-#ifndef HB_MAX_CONTEXT_LENGTH
-#define HB_MAX_CONTEXT_LENGTH 64
-#endif
-
-
-namespace OT {
-
-
-#define NOT_COVERED ((unsigned int) -1)
-
-
-
-/*
- *
- * OpenType Layout Common Table Formats
- *
- */
-
-
-/*
- * Script, ScriptList, LangSys, Feature, FeatureList, Lookup, LookupList
- */
-
-template <typename Type>
-struct Record
-{
- inline int cmp (hb_tag_t a) const {
- return tag.cmp (a);
- }
-
- struct sanitize_closure_t {
- hb_tag_t tag;
- const void *list_base;
- };
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
- {
- TRACE_SANITIZE (this);
- const sanitize_closure_t closure = {tag, base};
- return_trace (c->check_struct (this) && offset.sanitize (c, base, &closure));
- }
-
- Tag tag; /* 4-byte Tag identifier */
- OffsetTo<Type>
- offset; /* Offset from beginning of object holding
- * the Record */
- public:
- DEFINE_SIZE_STATIC (6);
-};
-
-template <typename Type>
-struct RecordArrayOf : SortedArrayOf<Record<Type> > {
- inline const Tag& get_tag (unsigned int i) const
- {
- /* We cheat slightly and don't define separate Null objects
- * for Record types. Instead, we return the correct Null(Tag)
- * here. */
- if (unlikely (i >= this->len)) return Null(Tag);
- return (*this)[i].tag;
- }
- inline unsigned int get_tags (unsigned int start_offset,
- unsigned int *record_count /* IN/OUT */,
- hb_tag_t *record_tags /* OUT */) const
- {
- if (record_count) {
- const Record<Type> *arr = this->sub_array (start_offset, record_count);
- unsigned int count = *record_count;
- for (unsigned int i = 0; i < count; i++)
- record_tags[i] = arr[i].tag;
- }
- return this->len;
- }
- inline bool find_index (hb_tag_t tag, unsigned int *index) const
- {
- /* If we want to allow non-sorted data, we can lsearch(). */
- int i = this->/*lsearch*/bsearch (tag);
- if (i != -1) {
- if (index) *index = i;
- return true;
- } else {
- if (index) *index = Index::NOT_FOUND_INDEX;
- return false;
- }
- }
-};
-
-template <typename Type>
-struct RecordListOf : RecordArrayOf<Type>
-{
- inline const Type& operator [] (unsigned int i) const
- { return this+RecordArrayOf<Type>::operator [](i).offset; }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (RecordArrayOf<Type>::sanitize (c, this));
- }
-};
-
-
-struct RangeRecord
-{
- inline int cmp (hb_codepoint_t g) const {
- return g < start ? -1 : g <= end ? 0 : +1 ;
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- inline bool intersects (const hb_set_t *glyphs) const {
- return glyphs->intersects (start, end);
- }
-
- template <typename set_t>
- inline bool add_coverage (set_t *glyphs) const {
- return glyphs->add_range (start, end);
- }
-
- GlyphID start; /* First GlyphID in the range */
- GlyphID end; /* Last GlyphID in the range */
- UINT16 value; /* Value */
- public:
- DEFINE_SIZE_STATIC (6);
-};
-DEFINE_NULL_DATA (RangeRecord, "\000\001");
-
-
-struct IndexArray : ArrayOf<Index>
-{
- inline unsigned int get_indexes (unsigned int start_offset,
- unsigned int *_count /* IN/OUT */,
- unsigned int *_indexes /* OUT */) const
- {
- if (_count) {
- const UINT16 *arr = this->sub_array (start_offset, _count);
- unsigned int count = *_count;
- for (unsigned int i = 0; i < count; i++)
- _indexes[i] = arr[i];
- }
- return this->len;
- }
-};
-
-
-struct Script;
-struct LangSys;
-struct Feature;
-
-
-struct LangSys
-{
- inline unsigned int get_feature_count (void) const
- { return featureIndex.len; }
- inline hb_tag_t get_feature_index (unsigned int i) const
- { return featureIndex[i]; }
- inline unsigned int get_feature_indexes (unsigned int start_offset,
- unsigned int *feature_count /* IN/OUT */,
- unsigned int *feature_indexes /* OUT */) const
- { return featureIndex.get_indexes (start_offset, feature_count, feature_indexes); }
-
- inline bool has_required_feature (void) const { return reqFeatureIndex != 0xFFFFu; }
- inline unsigned int get_required_feature_index (void) const
- {
- if (reqFeatureIndex == 0xFFFFu)
- return Index::NOT_FOUND_INDEX;
- return reqFeatureIndex;;
- }
-
- inline bool sanitize (hb_sanitize_context_t *c,
- const Record<LangSys>::sanitize_closure_t * = nullptr) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && featureIndex.sanitize (c));
- }
-
- Offset16 lookupOrderZ; /* = Null (reserved for an offset to a
- * reordering table) */
- UINT16 reqFeatureIndex;/* Index of a feature required for this
- * language system--if no required features
- * = 0xFFFFu */
- IndexArray featureIndex; /* Array of indices into the FeatureList */
- public:
- DEFINE_SIZE_ARRAY (6, featureIndex);
-};
-DEFINE_NULL_DATA (LangSys, "\0\0\xFF\xFF");
-
-
-struct Script
-{
- inline unsigned int get_lang_sys_count (void) const
- { return langSys.len; }
- inline const Tag& get_lang_sys_tag (unsigned int i) const
- { return langSys.get_tag (i); }
- inline unsigned int get_lang_sys_tags (unsigned int start_offset,
- unsigned int *lang_sys_count /* IN/OUT */,
- hb_tag_t *lang_sys_tags /* OUT */) const
- { return langSys.get_tags (start_offset, lang_sys_count, lang_sys_tags); }
- inline const LangSys& get_lang_sys (unsigned int i) const
- {
- if (i == Index::NOT_FOUND_INDEX) return get_default_lang_sys ();
- return this+langSys[i].offset;
- }
- inline bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const
- { return langSys.find_index (tag, index); }
-
- inline bool has_default_lang_sys (void) const { return defaultLangSys != 0; }
- inline const LangSys& get_default_lang_sys (void) const { return this+defaultLangSys; }
-
- inline bool sanitize (hb_sanitize_context_t *c,
- const Record<Script>::sanitize_closure_t * = nullptr) const
- {
- TRACE_SANITIZE (this);
- return_trace (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
- }
-
- protected:
- OffsetTo<LangSys>
- defaultLangSys; /* Offset to DefaultLangSys table--from
- * beginning of Script table--may be Null */
- RecordArrayOf<LangSys>
- langSys; /* Array of LangSysRecords--listed
- * alphabetically by LangSysTag */
- public:
- DEFINE_SIZE_ARRAY (4, langSys);
-};
-
-typedef RecordListOf<Script> ScriptList;
-
-
-/* http://www.microsoft.com/typography/otspec/features_pt.htm#size */
-struct FeatureParamsSize
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!c->check_struct (this))) return_trace (false);
-
- /* This subtable has some "history", if you will. Some earlier versions of
- * Adobe tools calculated the offset of the FeatureParams sutable from the
- * beginning of the FeatureList table! Now, that is dealt with in the
- * Feature implementation. But we still need to be able to tell junk from
- * real data. Note: We don't check that the nameID actually exists.
- *
- * Read Roberts wrote on 9/15/06 on opentype-list@indx.co.uk :
- *
- * Yes, it is correct that a new version of the AFDKO (version 2.0) will be
- * coming out soon, and that the makeotf program will build a font with a
- * 'size' feature that is correct by the specification.
- *
- * The specification for this feature tag is in the "OpenType Layout Tag
- * Registry". You can see a copy of this at:
- * http://partners.adobe.com/public/developer/opentype/index_tag8.html#size
- *
- * Here is one set of rules to determine if the 'size' feature is built
- * correctly, or as by the older versions of MakeOTF. You may be able to do
- * better.
- *
- * Assume that the offset to the size feature is according to specification,
- * and make the following value checks. If it fails, assume the the size
- * feature is calculated as versions of MakeOTF before the AFDKO 2.0 built it.
- * If this fails, reject the 'size' feature. The older makeOTF's calculated the
- * offset from the beginning of the FeatureList table, rather than from the
- * beginning of the 'size' Feature table.
- *
- * If "design size" == 0:
- * fails check
- *
- * Else if ("subfamily identifier" == 0 and
- * "range start" == 0 and
- * "range end" == 0 and
- * "range start" == 0 and
- * "menu name ID" == 0)
- * passes check: this is the format used when there is a design size
- * specified, but there is no recommended size range.
- *
- * Else if ("design size" < "range start" or
- * "design size" > "range end" or
- * "range end" <= "range start" or
- * "menu name ID" < 256 or
- * "menu name ID" > 32767 or
- * menu name ID is not a name ID which is actually in the name table)
- * fails test
- * Else
- * passes test.
- */
-
- if (!designSize)
- return_trace (false);
- else if (subfamilyID == 0 &&
- subfamilyNameID == 0 &&
- rangeStart == 0 &&
- rangeEnd == 0)
- return_trace (true);
- else if (designSize < rangeStart ||
- designSize > rangeEnd ||
- subfamilyNameID < 256 ||
- subfamilyNameID > 32767)
- return_trace (false);
- else
- return_trace (true);
- }
-
- UINT16 designSize; /* Represents the design size in 720/inch
- * units (decipoints). The design size entry
- * must be non-zero. When there is a design
- * size but no recommended size range, the
- * rest of the array will consist of zeros. */
- UINT16 subfamilyID; /* Has no independent meaning, but serves
- * as an identifier that associates fonts
- * in a subfamily. All fonts which share a
- * Preferred or Font Family name and which
- * differ only by size range shall have the
- * same subfamily value, and no fonts which
- * differ in weight or style shall have the
- * same subfamily value. If this value is
- * zero, the remaining fields in the array
- * will be ignored. */
- UINT16 subfamilyNameID;/* If the preceding value is non-zero, this
- * value must be set in the range 256 - 32767
- * (inclusive). It records the value of a
- * field in the name table, which must
- * contain English-language strings encoded
- * in Windows Unicode and Macintosh Roman,
- * and may contain additional strings
- * localized to other scripts and languages.
- * Each of these strings is the name an
- * application should use, in combination
- * with the family name, to represent the
- * subfamily in a menu. Applications will
- * choose the appropriate version based on
- * their selection criteria. */
- UINT16 rangeStart; /* Large end of the recommended usage range
- * (inclusive), stored in 720/inch units
- * (decipoints). */
- UINT16 rangeEnd; /* Small end of the recommended usage range
- (exclusive), stored in 720/inch units
- * (decipoints). */
- public:
- DEFINE_SIZE_STATIC (10);
-};
-
-/* http://www.microsoft.com/typography/otspec/features_pt.htm#ssxx */
-struct FeatureParamsStylisticSet
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- /* Right now minorVersion is at zero. Which means, any table supports
- * the uiNameID field. */
- return_trace (c->check_struct (this));
- }
-
- UINT16 version; /* (set to 0): This corresponds to a “minor”
- * version number. Additional data may be
- * added to the end of this Feature Parameters
- * table in the future. */
-
- UINT16 uiNameID; /* The 'name' table name ID that specifies a
- * string (or strings, for multiple languages)
- * for a user-interface label for this
- * feature. The values of uiLabelNameId and
- * sampleTextNameId are expected to be in the
- * font-specific name ID range (256-32767),
- * though that is not a requirement in this
- * Feature Parameters specification. The
- * user-interface label for the feature can
- * be provided in multiple languages. An
- * English string should be included as a
- * fallback. The string should be kept to a
- * minimal length to fit comfortably with
- * different application interfaces. */
- public:
- DEFINE_SIZE_STATIC (4);
-};
-
-/* http://www.microsoft.com/typography/otspec/features_ae.htm#cv01-cv99 */
-struct FeatureParamsCharacterVariants
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- characters.sanitize (c));
- }
-
- UINT16 format; /* Format number is set to 0. */
- UINT16 featUILableNameID; /* The ‘name’ table name ID that
- * specifies a string (or strings,
- * for multiple languages) for a
- * user-interface label for this
- * feature. (May be nullptr.) */
- UINT16 featUITooltipTextNameID;/* The ‘name’ table name ID that
- * specifies a string (or strings,
- * for multiple languages) that an
- * application can use for tooltip
- * text for this feature. (May be
- * nullptr.) */
- UINT16 sampleTextNameID; /* The ‘name’ table name ID that
- * specifies sample text that
- * illustrates the effect of this
- * feature. (May be nullptr.) */
- UINT16 numNamedParameters; /* Number of named parameters. (May
- * be zero.) */
- UINT16 firstParamUILabelNameID;/* The first ‘name’ table name ID
- * used to specify strings for
- * user-interface labels for the
- * feature parameters. (Must be zero
- * if numParameters is zero.) */
- ArrayOf<UINT24>
- characters; /* Array of the Unicode Scalar Value
- * of the characters for which this
- * feature provides glyph variants.
- * (May be zero.) */
- public:
- DEFINE_SIZE_ARRAY (14, characters);
-};
-
-struct FeatureParams
-{
- inline bool sanitize (hb_sanitize_context_t *c, hb_tag_t tag) const
- {
- TRACE_SANITIZE (this);
- if (tag == HB_TAG ('s','i','z','e'))
- return_trace (u.size.sanitize (c));
- if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
- return_trace (u.stylisticSet.sanitize (c));
- if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
- return_trace (u.characterVariants.sanitize (c));
- return_trace (true);
- }
-
- inline const FeatureParamsSize& get_size_params (hb_tag_t tag) const
- {
- if (tag == HB_TAG ('s','i','z','e'))
- return u.size;
- return Null(FeatureParamsSize);
- }
-
- private:
- union {
- FeatureParamsSize size;
- FeatureParamsStylisticSet stylisticSet;
- FeatureParamsCharacterVariants characterVariants;
- } u;
- DEFINE_SIZE_STATIC (17);
-};
-
-struct Feature
-{
- inline unsigned int get_lookup_count (void) const
- { return lookupIndex.len; }
- inline hb_tag_t get_lookup_index (unsigned int i) const
- { return lookupIndex[i]; }
- inline unsigned int get_lookup_indexes (unsigned int start_index,
- unsigned int *lookup_count /* IN/OUT */,
- unsigned int *lookup_tags /* OUT */) const
- { return lookupIndex.get_indexes (start_index, lookup_count, lookup_tags); }
-
- inline const FeatureParams &get_feature_params (void) const
- { return this+featureParams; }
-
- inline bool sanitize (hb_sanitize_context_t *c,
- const Record<Feature>::sanitize_closure_t *closure = nullptr) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c))))
- return_trace (false);
-
- /* Some earlier versions of Adobe tools calculated the offset of the
- * FeatureParams subtable from the beginning of the FeatureList table!
- *
- * If sanitizing "failed" for the FeatureParams subtable, try it with the
- * alternative location. We would know sanitize "failed" if old value
- * of the offset was non-zero, but it's zeroed now.
- *
- * Only do this for the 'size' feature, since at the time of the faulty
- * Adobe tools, only the 'size' feature had FeatureParams defined.
- */
-
- OffsetTo<FeatureParams> orig_offset = featureParams;
- if (unlikely (!featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE)))
- return_trace (false);
-
- if (likely (orig_offset.is_null ()))
- return_trace (true);
-
- if (featureParams == 0 && closure &&
- closure->tag == HB_TAG ('s','i','z','e') &&
- closure->list_base && closure->list_base < this)
- {
- unsigned int new_offset_int = (unsigned int) orig_offset -
- (((char *) this) - ((char *) closure->list_base));
-
- OffsetTo<FeatureParams> new_offset;
- /* Check that it did not overflow. */
- new_offset.set (new_offset_int);
- if (new_offset == new_offset_int &&
- c->try_set (&featureParams, new_offset) &&
- !featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE))
- return_trace (false);
-
- if (c->edit_count > 1)
- c->edit_count--; /* This was a "legitimate" edit; don't contribute to error count. */
- }
-
- return_trace (true);
- }
-
- OffsetTo<FeatureParams>
- featureParams; /* Offset to Feature Parameters table (if one
- * has been defined for the feature), relative
- * to the beginning of the Feature Table; = Null
- * if not required */
- IndexArray lookupIndex; /* Array of LookupList indices */
- public:
- DEFINE_SIZE_ARRAY (4, lookupIndex);
-};
-
-typedef RecordListOf<Feature> FeatureList;
-
-
-struct LookupFlag : UINT16
-{
- enum Flags {
- RightToLeft = 0x0001u,
- IgnoreBaseGlyphs = 0x0002u,
- IgnoreLigatures = 0x0004u,
- IgnoreMarks = 0x0008u,
- IgnoreFlags = 0x000Eu,
- UseMarkFilteringSet = 0x0010u,
- Reserved = 0x00E0u,
- MarkAttachmentType = 0xFF00u
- };
- public:
- DEFINE_SIZE_STATIC (2);
-};
-
-} /* namespace OT */
-/* This has to be outside the namespace. */
-HB_MARK_AS_FLAG_T (OT::LookupFlag::Flags);
-namespace OT {
-
-struct Lookup
-{
- inline unsigned int get_subtable_count (void) const { return subTable.len; }
-
- template <typename SubTableType>
- inline const SubTableType& get_subtable (unsigned int i) const
- { return this+CastR<OffsetArrayOf<SubTableType> > (subTable)[i]; }
-
- template <typename SubTableType>
- inline const OffsetArrayOf<SubTableType>& get_subtables (void) const
- { return CastR<OffsetArrayOf<SubTableType> > (subTable); }
- template <typename SubTableType>
- inline OffsetArrayOf<SubTableType>& get_subtables (void)
- { return CastR<OffsetArrayOf<SubTableType> > (subTable); }
-
- inline unsigned int get_type (void) const { return lookupType; }
-
- /* lookup_props is a 32-bit integer where the lower 16-bit is LookupFlag and
- * higher 16-bit is mark-filtering-set if the lookup uses one.
- * Not to be confused with glyph_props which is very similar. */
- inline uint32_t get_props (void) const
- {
- unsigned int flag = lookupFlag;
- if (unlikely (flag & LookupFlag::UseMarkFilteringSet))
- {
- const UINT16 &markFilteringSet = StructAfter<UINT16> (subTable);
- flag += (markFilteringSet << 16);
- }
- return flag;
- }
-
- template <typename SubTableType, typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
- {
- unsigned int lookup_type = get_type ();
- TRACE_DISPATCH (this, lookup_type);
- unsigned int count = get_subtable_count ();
- for (unsigned int i = 0; i < count; i++) {
- typename context_t::return_t r = get_subtable<SubTableType> (i).dispatch (c, lookup_type);
- if (c->stop_sublookup_iteration (r))
- return_trace (r);
- }
- return_trace (c->default_return_value ());
- }
-
- inline bool serialize (hb_serialize_context_t *c,
- unsigned int lookup_type,
- uint32_t lookup_props,
- unsigned int num_subtables)
- {
- TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return_trace (false);
- lookupType.set (lookup_type);
- lookupFlag.set (lookup_props & 0xFFFFu);
- if (unlikely (!subTable.serialize (c, num_subtables))) return_trace (false);
- if (lookupFlag & LookupFlag::UseMarkFilteringSet)
- {
- UINT16 &markFilteringSet = StructAfter<UINT16> (subTable);
- markFilteringSet.set (lookup_props >> 16);
- }
- return_trace (true);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- /* Real sanitize of the subtables is done by GSUB/GPOS/... */
- if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
- if (lookupFlag & LookupFlag::UseMarkFilteringSet)
- {
- const UINT16 &markFilteringSet = StructAfter<UINT16> (subTable);
- if (!markFilteringSet.sanitize (c)) return_trace (false);
- }
- return_trace (true);
- }
-
- private:
- UINT16 lookupType; /* Different enumerations for GSUB and GPOS */
- UINT16 lookupFlag; /* Lookup qualifiers */
- ArrayOf<Offset16>
- subTable; /* Array of SubTables */
- UINT16 markFilteringSetX[VAR]; /* Index (base 0) into GDEF mark glyph sets
- * structure. This field is only present if bit
- * UseMarkFilteringSet of lookup flags is set. */
- public:
- DEFINE_SIZE_ARRAY2 (6, subTable, markFilteringSetX);
-};
-
-typedef OffsetListOf<Lookup> LookupList;
-
-
-/*
- * Coverage Table
- */
-
-struct CoverageFormat1
-{
- friend struct Coverage;
-
- private:
- inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
- {
- int i = glyphArray.bsearch (glyph_id);
- static_assert ((((unsigned int) -1) == NOT_COVERED), "");
- return i;
- }
-
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &glyphs,
- unsigned int num_glyphs)
- {
- TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return_trace (false);
- glyphArray.len.set (num_glyphs);
- if (unlikely (!c->extend (glyphArray))) return_trace (false);
- for (unsigned int i = 0; i < num_glyphs; i++)
- glyphArray[i] = glyphs[i];
- glyphs.advance (num_glyphs);
- return_trace (true);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (glyphArray.sanitize (c));
- }
-
- inline bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const {
- return glyphs->has (glyphArray[index]);
- }
-
- template <typename set_t>
- inline bool add_coverage (set_t *glyphs) const {
- return glyphs->add_sorted_array (glyphArray.array, glyphArray.len);
- }
-
- public:
- /* Older compilers need this to be public. */
- struct Iter {
- inline void init (const struct CoverageFormat1 &c_) { c = &c_; i = 0; };
- inline bool more (void) { return i < c->glyphArray.len; }
- inline void next (void) { i++; }
- inline hb_codepoint_t get_glyph (void) { return c->glyphArray[i]; }
- inline unsigned int get_coverage (void) { return i; }
-
- private:
- const struct CoverageFormat1 *c;
- unsigned int i;
- };
- private:
-
- protected:
- UINT16 coverageFormat; /* Format identifier--format = 1 */
- SortedArrayOf<GlyphID>
- glyphArray; /* Array of GlyphIDs--in numerical order */
- public:
- DEFINE_SIZE_ARRAY (4, glyphArray);
-};
-
-struct CoverageFormat2
-{
- friend struct Coverage;
-
- private:
- inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
- {
- int i = rangeRecord.bsearch (glyph_id);
- if (i != -1) {
- const RangeRecord &range = rangeRecord[i];
- return (unsigned int) range.value + (glyph_id - range.start);
- }
- return NOT_COVERED;
- }
-
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &glyphs,
- unsigned int num_glyphs)
- {
- TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return_trace (false);
-
- if (unlikely (!num_glyphs))
- {
- rangeRecord.len.set (0);
- return_trace (true);
- }
-
- unsigned int num_ranges = 1;
- for (unsigned int i = 1; i < num_glyphs; i++)
- if (glyphs[i - 1] + 1 != glyphs[i])
- num_ranges++;
- rangeRecord.len.set (num_ranges);
- if (unlikely (!c->extend (rangeRecord))) return_trace (false);
-
- unsigned int range = 0;
- rangeRecord[range].start = glyphs[0];
- rangeRecord[range].value.set (0);
- for (unsigned int i = 1; i < num_glyphs; i++)
- if (glyphs[i - 1] + 1 != glyphs[i]) {
- range++;
- rangeRecord[range].start = glyphs[i];
- rangeRecord[range].value.set (i);
- rangeRecord[range].end = glyphs[i];
- } else {
- rangeRecord[range].end = glyphs[i];
- }
- glyphs.advance (num_glyphs);
- return_trace (true);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (rangeRecord.sanitize (c));
- }
-
- inline bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const {
- unsigned int i;
- unsigned int count = rangeRecord.len;
- for (i = 0; i < count; i++) {
- const RangeRecord &range = rangeRecord[i];
- if (range.value <= index &&
- index < (unsigned int) range.value + (range.end - range.start) &&
- range.intersects (glyphs))
- return true;
- else if (index < range.value)
- return false;
- }
- return false;
- }
-
- template <typename set_t>
- inline bool add_coverage (set_t *glyphs) const {
- unsigned int count = rangeRecord.len;
- for (unsigned int i = 0; i < count; i++)
- if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
- return false;
- return true;
- }
-
- public:
- /* Older compilers need this to be public. */
- struct Iter
- {
- inline void init (const CoverageFormat2 &c_)
- {
- c = &c_;
- coverage = 0;
- i = 0;
- j = c->rangeRecord.len ? c_.rangeRecord[0].start : 0;
- }
- inline bool more (void) { return i < c->rangeRecord.len; }
- inline void next (void)
- {
- if (j >= c->rangeRecord[i].end)
- {
- i++;
- if (more ())
- {
- j = c->rangeRecord[i].start;
- coverage = c->rangeRecord[i].value;
- }
- return;
- }
- coverage++;
- j++;
- }
- inline hb_codepoint_t get_glyph (void) { return j; }
- inline unsigned int get_coverage (void) { return coverage; }
-
- private:
- const struct CoverageFormat2 *c;
- unsigned int i, j, coverage;
- };
- private:
-
- protected:
- UINT16 coverageFormat; /* Format identifier--format = 2 */
- SortedArrayOf<RangeRecord>
- rangeRecord; /* Array of glyph ranges--ordered by
- * Start GlyphID. rangeCount entries
- * long */
- public:
- DEFINE_SIZE_ARRAY (4, rangeRecord);
-};
-
-struct Coverage
-{
- inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
- {
- switch (u.format) {
- case 1: return u.format1.get_coverage(glyph_id);
- case 2: return u.format2.get_coverage(glyph_id);
- default:return NOT_COVERED;
- }
- }
-
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &glyphs,
- unsigned int num_glyphs)
- {
- TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return_trace (false);
- unsigned int num_ranges = 1;
- for (unsigned int i = 1; i < num_glyphs; i++)
- if (glyphs[i - 1] + 1 != glyphs[i])
- num_ranges++;
- u.format.set (num_glyphs * 2 < num_ranges * 3 ? 1 : 2);
- switch (u.format) {
- case 1: return_trace (u.format1.serialize (c, glyphs, num_glyphs));
- case 2: return_trace (u.format2.serialize (c, glyphs, num_glyphs));
- default:return_trace (false);
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return_trace (false);
- switch (u.format) {
- case 1: return_trace (u.format1.sanitize (c));
- case 2: return_trace (u.format2.sanitize (c));
- default:return_trace (true);
- }
- }
-
- inline bool intersects (const hb_set_t *glyphs) const {
- /* TODO speed this up */
- Coverage::Iter iter;
- for (iter.init (*this); iter.more (); iter.next ()) {
- if (glyphs->has (iter.get_glyph ()))
- return true;
- }
- return false;
- }
-
- inline bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const {
- switch (u.format) {
- case 1: return u.format1.intersects_coverage (glyphs, index);
- case 2: return u.format2.intersects_coverage (glyphs, index);
- default:return false;
- }
- }
-
- /* Might return false if array looks unsorted.
- * Used for faster rejection of corrupt data. */
- template <typename set_t>
- inline bool add_coverage (set_t *glyphs) const {
- switch (u.format) {
- case 1: return u.format1.add_coverage (glyphs);
- case 2: return u.format2.add_coverage (glyphs);
- default:return false;
- }
- }
-
- struct Iter {
- Iter (void) : format (0), u () {};
- inline void init (const Coverage &c_) {
- format = c_.u.format;
- switch (format) {
- case 1: u.format1.init (c_.u.format1); return;
- case 2: u.format2.init (c_.u.format2); return;
- default: return;
- }
- }
- inline bool more (void) {
- switch (format) {
- case 1: return u.format1.more ();
- case 2: return u.format2.more ();
- default:return false;
- }
- }
- inline void next (void) {
- switch (format) {
- case 1: u.format1.next (); break;
- case 2: u.format2.next (); break;
- default: break;
- }
- }
- inline hb_codepoint_t get_glyph (void) {
- switch (format) {
- case 1: return u.format1.get_glyph ();
- case 2: return u.format2.get_glyph ();
- default:return 0;
- }
- }
- inline unsigned int get_coverage (void) {
- switch (format) {
- case 1: return u.format1.get_coverage ();
- case 2: return u.format2.get_coverage ();
- default:return -1;
- }
- }
-
- private:
- unsigned int format;
- union {
- CoverageFormat2::Iter format2; /* Put this one first since it's larger; helps shut up compiler. */
- CoverageFormat1::Iter format1;
- } u;
- };
-
- protected:
- union {
- UINT16 format; /* Format identifier */
- CoverageFormat1 format1;
- CoverageFormat2 format2;
- } u;
- public:
- DEFINE_SIZE_UNION (2, format);
-};
-
-
-/*
- * Class Definition Table
- */
-
-struct ClassDefFormat1
-{
- friend struct ClassDef;
-
- private:
- inline unsigned int get_class (hb_codepoint_t glyph_id) const
- {
- unsigned int i = (unsigned int) (glyph_id - startGlyph);
- if (unlikely (i < classValue.len))
- return classValue[i];
- return 0;
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && classValue.sanitize (c));
- }
-
- template <typename set_t>
- inline bool add_coverage (set_t *glyphs) const {
- unsigned int start = 0;
- unsigned int count = classValue.len;
- for (unsigned int i = 0; i < count; i++)
- {
- if (classValue[i])
- continue;
-
- if (start != i)
- if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + i)))
- return false;
-
- start = i + 1;
- }
- if (start != count)
- if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + count)))
- return false;
-
- return true;
- }
-
- template <typename set_t>
- inline bool add_class (set_t *glyphs, unsigned int klass) const {
- unsigned int count = classValue.len;
- for (unsigned int i = 0; i < count; i++)
- {
- if (classValue[i] == klass)
- glyphs->add (startGlyph + i);
- }
- return true;
- }
-
- inline bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const {
- unsigned int count = classValue.len;
- if (klass == 0)
- {
- /* Match if there's any glyph that is not listed! */
- hb_codepoint_t g = -1;
- if (!hb_set_next (glyphs, &g))
- return false;
- if (g < startGlyph)
- return true;
- g = startGlyph + count - 1;
- if (hb_set_next (glyphs, &g))
- return true;
- /* Fall through. */
- }
- for (unsigned int i = 0; i < count; i++)
- if (classValue[i] == klass && glyphs->has (startGlyph + i))
- return true;
- return false;
- }
-
- protected:
- UINT16 classFormat; /* Format identifier--format = 1 */
- GlyphID startGlyph; /* First GlyphID of the classValueArray */
- ArrayOf<UINT16>
- classValue; /* Array of Class Values--one per GlyphID */
- public:
- DEFINE_SIZE_ARRAY (6, classValue);
-};
-
-struct ClassDefFormat2
-{
- friend struct ClassDef;
-
- private:
- inline unsigned int get_class (hb_codepoint_t glyph_id) const
- {
- int i = rangeRecord.bsearch (glyph_id);
- if (unlikely (i != -1))
- return rangeRecord[i].value;
- return 0;
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (rangeRecord.sanitize (c));
- }
-
- template <typename set_t>
- inline bool add_coverage (set_t *glyphs) const {
- unsigned int count = rangeRecord.len;
- for (unsigned int i = 0; i < count; i++)
- if (rangeRecord[i].value)
- if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
- return false;
- return true;
- }
-
- template <typename set_t>
- inline bool add_class (set_t *glyphs, unsigned int klass) const {
- unsigned int count = rangeRecord.len;
- for (unsigned int i = 0; i < count; i++)
- {
- if (rangeRecord[i].value == klass)
- if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
- return false;
- }
- return true;
- }
-
- inline bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const {
- unsigned int count = rangeRecord.len;
- if (klass == 0)
- {
- /* Match if there's any glyph that is not listed! */
- hb_codepoint_t g = (hb_codepoint_t) -1;
- for (unsigned int i = 0; i < count; i++)
- {
- if (!hb_set_next (glyphs, &g))
- break;
- if (g < rangeRecord[i].start)
- return true;
- g = rangeRecord[i].end;
- }
- if (g != (hb_codepoint_t) -1 && hb_set_next (glyphs, &g))
- return true;
- /* Fall through. */
- }
- for (unsigned int i = 0; i < count; i++)
- if (rangeRecord[i].value == klass && rangeRecord[i].intersects (glyphs))
- return true;
- return false;
- }
-
- protected:
- UINT16 classFormat; /* Format identifier--format = 2 */
- SortedArrayOf<RangeRecord>
- rangeRecord; /* Array of glyph ranges--ordered by
- * Start GlyphID */
- public:
- DEFINE_SIZE_ARRAY (4, rangeRecord);
-};
-
-struct ClassDef
-{
- inline unsigned int get_class (hb_codepoint_t glyph_id) const
- {
- switch (u.format) {
- case 1: return u.format1.get_class(glyph_id);
- case 2: return u.format2.get_class(glyph_id);
- default:return 0;
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return_trace (false);
- switch (u.format) {
- case 1: return_trace (u.format1.sanitize (c));
- case 2: return_trace (u.format2.sanitize (c));
- default:return_trace (true);
- }
- }
-
- /* Might return false if array looks unsorted.
- * Used for faster rejection of corrupt data. */
- template <typename set_t>
- inline bool add_coverage (set_t *glyphs) const {
- switch (u.format) {
- case 1: return u.format1.add_coverage (glyphs);
- case 2: return u.format2.add_coverage (glyphs);
- default:return false;
- }
- }
-
- /* Might return false if array looks unsorted.
- * Used for faster rejection of corrupt data. */
- template <typename set_t>
- inline bool add_class (set_t *glyphs, unsigned int klass) const {
- switch (u.format) {
- case 1: return u.format1.add_class (glyphs, klass);
- case 2: return u.format2.add_class (glyphs, klass);
- default:return false;
- }
- }
-
- inline bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const {
- switch (u.format) {
- case 1: return u.format1.intersects_class (glyphs, klass);
- case 2: return u.format2.intersects_class (glyphs, klass);
- default:return false;
- }
- }
-
- protected:
- union {
- UINT16 format; /* Format identifier */
- ClassDefFormat1 format1;
- ClassDefFormat2 format2;
- } u;
- public:
- DEFINE_SIZE_UNION (2, format);
-};
-
-
-/*
- * Item Variation Store
- */
-
-struct VarRegionAxis
-{
- inline float evaluate (int coord) const
- {
- int start = startCoord, peak = peakCoord, end = endCoord;
-
- /* TODO Move these to sanitize(). */
- if (unlikely (start > peak || peak > end))
- return 1.;
- if (unlikely (start < 0 && end > 0 && peak != 0))
- return 1.;
-
- if (peak == 0 || coord == peak)
- return 1.;
-
- if (coord <= start || end <= coord)
- return 0.;
-
- /* Interpolate */
- if (coord < peak)
- return float (coord - start) / (peak - start);
- else
- return float (end - coord) / (end - peak);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- /* TODO Handle invalid start/peak/end configs, so we don't
- * have to do that at runtime. */
- }
-
- public:
- F2DOT14 startCoord;
- F2DOT14 peakCoord;
- F2DOT14 endCoord;
- public:
- DEFINE_SIZE_STATIC (6);
-};
-
-struct VarRegionList
-{
- inline float evaluate (unsigned int region_index,
- int *coords, unsigned int coord_len) const
- {
- if (unlikely (region_index >= regionCount))
- return 0.;
-
- const VarRegionAxis *axes = axesZ + (region_index * axisCount);
-
- float v = 1.;
- unsigned int count = MIN (coord_len, (unsigned int) axisCount);
- for (unsigned int i = 0; i < count; i++)
- {
- float factor = axes[i].evaluate (coords[i]);
- if (factor == 0.)
- return 0.;
- v *= factor;
- }
- return v;
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- c->check_array (axesZ, axesZ[0].static_size,
- (unsigned int) axisCount * (unsigned int) regionCount));
- }
-
- protected:
- UINT16 axisCount;
- UINT16 regionCount;
- VarRegionAxis axesZ[VAR];
- public:
- DEFINE_SIZE_ARRAY (4, axesZ);
-};
-
-struct VarData
-{
- inline unsigned int get_row_size (void) const
- { return shortCount + regionIndices.len; }
-
- inline unsigned int get_size (void) const
- { return itemCount * get_row_size (); }
-
- inline float get_delta (unsigned int inner,
- int *coords, unsigned int coord_count,
- const VarRegionList &regions) const
- {
- if (unlikely (inner >= itemCount))
- return 0.;
-
- unsigned int count = regionIndices.len;
- unsigned int scount = shortCount;
-
- const UINT8 *bytes = &StructAfter<UINT8> (regionIndices);
- const UINT8 *row = bytes + inner * (scount + count);
-
- float delta = 0.;
- unsigned int i = 0;
-
- const INT16 *scursor = reinterpret_cast<const INT16 *> (row);
- for (; i < scount; i++)
- {
- float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count);
- delta += scalar * *scursor++;
- }
- const INT8 *bcursor = reinterpret_cast<const INT8 *> (scursor);
- for (; i < count; i++)
- {
- float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count);
- delta += scalar * *bcursor++;
- }
-
- return delta;
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- regionIndices.sanitize(c) &&
- shortCount <= regionIndices.len &&
- c->check_array (&StructAfter<UINT8> (regionIndices),
- get_row_size (), itemCount));
- }
-
- protected:
- UINT16 itemCount;
- UINT16 shortCount;
- ArrayOf<UINT16> regionIndices;
- UINT8 bytesX[VAR];
- public:
- DEFINE_SIZE_ARRAY2 (6, regionIndices, bytesX);
-};
-
-struct VariationStore
-{
- inline float get_delta (unsigned int outer, unsigned int inner,
- int *coords, unsigned int coord_count) const
- {
- if (unlikely (outer >= dataSets.len))
- return 0.;
-
- return (this+dataSets[outer]).get_delta (inner,
- coords, coord_count,
- this+regions);
- }
-
- inline float get_delta (unsigned int index,
- int *coords, unsigned int coord_count) const
- {
- unsigned int outer = index >> 16;
- unsigned int inner = index & 0xFFFF;
- return get_delta (outer, inner, coords, coord_count);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- format == 1 &&
- regions.sanitize (c, this) &&
- dataSets.sanitize (c, this));
- }
-
- protected:
- UINT16 format;
- LOffsetTo<VarRegionList> regions;
- OffsetArrayOf<VarData, UINT32> dataSets;
- public:
- DEFINE_SIZE_ARRAY (8, dataSets);
-};
-
-/*
- * Feature Variations
- */
-
-struct ConditionFormat1
-{
- friend struct Condition;
-
- private:
- inline bool evaluate (const int *coords, unsigned int coord_len) const
- {
- int coord = axisIndex < coord_len ? coords[axisIndex] : 0;
- return filterRangeMinValue <= coord && coord <= filterRangeMaxValue;
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- protected:
- UINT16 format; /* Format identifier--format = 1 */
- UINT16 axisIndex;
- F2DOT14 filterRangeMinValue;
- F2DOT14 filterRangeMaxValue;
- public:
- DEFINE_SIZE_STATIC (8);
-};
-
-struct Condition
-{
- inline bool evaluate (const int *coords, unsigned int coord_len) const
- {
- switch (u.format) {
- case 1: return u.format1.evaluate (coords, coord_len);
- default:return false;
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return_trace (false);
- switch (u.format) {
- case 1: return_trace (u.format1.sanitize (c));
- default:return_trace (true);
- }
- }
-
- protected:
- union {
- UINT16 format; /* Format identifier */
- ConditionFormat1 format1;
- } u;
- public:
- DEFINE_SIZE_UNION (2, format);
-};
-
-struct ConditionSet
-{
- inline bool evaluate (const int *coords, unsigned int coord_len) const
- {
- unsigned int count = conditions.len;
- for (unsigned int i = 0; i < count; i++)
- if (!(this+conditions.array[i]).evaluate (coords, coord_len))
- return false;
- return true;
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (conditions.sanitize (c, this));
- }
-
- protected:
- OffsetArrayOf<Condition, UINT32> conditions;
- public:
- DEFINE_SIZE_ARRAY (2, conditions);
-};
-
-struct FeatureTableSubstitutionRecord
-{
- friend struct FeatureTableSubstitution;
-
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && feature.sanitize (c, base));
- }
-
- protected:
- UINT16 featureIndex;
- LOffsetTo<Feature> feature;
- public:
- DEFINE_SIZE_STATIC (6);
-};
-
-struct FeatureTableSubstitution
-{
- inline const Feature *find_substitute (unsigned int feature_index) const
- {
- unsigned int count = substitutions.len;
- for (unsigned int i = 0; i < count; i++)
- {
- const FeatureTableSubstitutionRecord &record = substitutions.array[i];
- if (record.featureIndex == feature_index)
- return &(this+record.feature);
- }
- return nullptr;
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (version.sanitize (c) &&
- likely (version.major == 1) &&
- substitutions.sanitize (c, this));
- }
-
- protected:
- FixedVersion<> version; /* Version--0x00010000u */
- ArrayOf<FeatureTableSubstitutionRecord>
- substitutions;
- public:
- DEFINE_SIZE_ARRAY (6, substitutions);
-};
-
-struct FeatureVariationRecord
-{
- friend struct FeatureVariations;
-
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
- {
- TRACE_SANITIZE (this);
- return_trace (conditions.sanitize (c, base) &&
- substitutions.sanitize (c, base));
- }
-
- protected:
- LOffsetTo<ConditionSet>
- conditions;
- LOffsetTo<FeatureTableSubstitution>
- substitutions;
- public:
- DEFINE_SIZE_STATIC (8);
-};
-
-struct FeatureVariations
-{
- static const unsigned int NOT_FOUND_INDEX = 0xFFFFFFFFu;
-
- inline bool find_index (const int *coords, unsigned int coord_len,
- unsigned int *index) const
- {
- unsigned int count = varRecords.len;
- for (unsigned int i = 0; i < count; i++)
- {
- const FeatureVariationRecord &record = varRecords.array[i];
- if ((this+record.conditions).evaluate (coords, coord_len))
- {
- *index = i;
- return true;
- }
- }
- *index = NOT_FOUND_INDEX;
- return false;
- }
-
- inline const Feature *find_substitute (unsigned int variations_index,
- unsigned int feature_index) const
- {
- const FeatureVariationRecord &record = varRecords[variations_index];
- return (this+record.substitutions).find_substitute (feature_index);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (version.sanitize (c) &&
- likely (version.major == 1) &&
- varRecords.sanitize (c, this));
- }
-
- protected:
- FixedVersion<> version; /* Version--0x00010000u */
- LArrayOf<FeatureVariationRecord>
- varRecords;
- public:
- DEFINE_SIZE_ARRAY (8, varRecords);
-};
-
-
-/*
- * Device Tables
- */
-
-struct HintingDevice
-{
- friend struct Device;
-
- private:
-
- inline hb_position_t get_x_delta (hb_font_t *font) const
- { return get_delta (font->x_ppem, font->x_scale); }
-
- inline hb_position_t get_y_delta (hb_font_t *font) const
- { return get_delta (font->y_ppem, font->y_scale); }
-
- inline unsigned int get_size (void) const
- {
- unsigned int f = deltaFormat;
- if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * UINT16::static_size;
- return UINT16::static_size * (4 + ((endSize - startSize) >> (4 - f)));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && c->check_range (this, this->get_size ()));
- }
-
- private:
-
- inline int get_delta (unsigned int ppem, int scale) const
- {
- if (!ppem) return 0;
-
- int pixels = get_delta_pixels (ppem);
-
- if (!pixels) return 0;
-
- return (int) (pixels * (int64_t) scale / ppem);
- }
- inline int get_delta_pixels (unsigned int ppem_size) const
- {
- unsigned int f = deltaFormat;
- if (unlikely (f < 1 || f > 3))
- return 0;
-
- if (ppem_size < startSize || ppem_size > endSize)
- return 0;
-
- unsigned int s = ppem_size - startSize;
-
- unsigned int byte = deltaValue[s >> (4 - f)];
- unsigned int bits = (byte >> (16 - (((s & ((1 << (4 - f)) - 1)) + 1) << f)));
- unsigned int mask = (0xFFFFu >> (16 - (1 << f)));
-
- int delta = bits & mask;
-
- if ((unsigned int) delta >= ((mask + 1) >> 1))
- delta -= mask + 1;
-
- return delta;
- }
-
- protected:
- UINT16 startSize; /* Smallest size to correct--in ppem */
- UINT16 endSize; /* Largest size to correct--in ppem */
- UINT16 deltaFormat; /* Format of DeltaValue array data: 1, 2, or 3
- * 1 Signed 2-bit value, 8 values per uint16
- * 2 Signed 4-bit value, 4 values per uint16
- * 3 Signed 8-bit value, 2 values per uint16
- */
- UINT16 deltaValue[VAR]; /* Array of compressed data */
- public:
- DEFINE_SIZE_ARRAY (6, deltaValue);
-};
-
-struct VariationDevice
-{
- friend struct Device;
-
- private:
-
- inline hb_position_t get_x_delta (hb_font_t *font, const VariationStore &store) const
- { return font->em_scalef_x (get_delta (font, store)); }
-
- inline hb_position_t get_y_delta (hb_font_t *font, const VariationStore &store) const
- { return font->em_scalef_y (get_delta (font, store)); }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- private:
-
- inline float get_delta (hb_font_t *font, const VariationStore &store) const
- {
- return store.get_delta (outerIndex, innerIndex, font->coords, font->num_coords);
- }
-
- protected:
- UINT16 outerIndex;
- UINT16 innerIndex;
- UINT16 deltaFormat; /* Format identifier for this table: 0x0x8000 */
- public:
- DEFINE_SIZE_STATIC (6);
-};
-
-struct DeviceHeader
-{
- protected:
- UINT16 reserved1;
- UINT16 reserved2;
- public:
- UINT16 format; /* Format identifier */
- public:
- DEFINE_SIZE_STATIC (6);
-};
-
-struct Device
-{
- inline hb_position_t get_x_delta (hb_font_t *font, const VariationStore &store=Null(VariationStore)) const
- {
- switch (u.b.format)
- {
- case 1: case 2: case 3:
- return u.hinting.get_x_delta (font);
- case 0x8000:
- return u.variation.get_x_delta (font, store);
- default:
- return 0;
- }
- }
- inline hb_position_t get_y_delta (hb_font_t *font, const VariationStore &store=Null(VariationStore)) const
- {
- switch (u.b.format)
- {
- case 1: case 2: case 3:
- return u.hinting.get_y_delta (font);
- case 0x8000:
- return u.variation.get_y_delta (font, store);
- default:
- return 0;
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (!u.b.format.sanitize (c)) return_trace (false);
- switch (u.b.format) {
- case 1: case 2: case 3:
- return_trace (u.hinting.sanitize (c));
- case 0x8000:
- return_trace (u.variation.sanitize (c));
- default:
- return_trace (true);
- }
- }
-
- protected:
- union {
- DeviceHeader b;
- HintingDevice hinting;
- VariationDevice variation;
- } u;
- public:
- DEFINE_SIZE_UNION (6, b);
-};
-
-
-} /* namespace OT */
-
-
-#endif /* HB_OT_LAYOUT_COMMON_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh
new file mode 100644
index 0000000000..fa08140f56
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh
@@ -0,0 +1,2635 @@
+/*
+ * Copyright © 2007,2008,2009 Red Hat, Inc.
+ * Copyright © 2010,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_LAYOUT_COMMON_HH
+#define HB_OT_LAYOUT_COMMON_HH
+
+#include "hb.hh"
+#include "hb-ot-layout.hh"
+#include "hb-open-type.hh"
+#include "hb-set.hh"
+#include "hb-bimap.hh"
+
+
+#ifndef HB_MAX_NESTING_LEVEL
+#define HB_MAX_NESTING_LEVEL 6
+#endif
+#ifndef HB_MAX_CONTEXT_LENGTH
+#define HB_MAX_CONTEXT_LENGTH 64
+#endif
+#ifndef HB_CLOSURE_MAX_STAGES
+/*
+ * The maximum number of times a lookup can be applied during shaping.
+ * Used to limit the number of iterations of the closure algorithm.
+ * This must be larger than the number of times add_pause() is
+ * called in a collect_features call of any shaper.
+ */
+#define HB_CLOSURE_MAX_STAGES 32
+#endif
+
+#ifndef HB_MAX_SCRIPTS
+#define HB_MAX_SCRIPTS 500
+#endif
+
+#ifndef HB_MAX_LANGSYS
+#define HB_MAX_LANGSYS 2000
+#endif
+
+
+namespace OT {
+
+
+#define NOT_COVERED ((unsigned int) -1)
+
+
+template<typename Iterator>
+static inline void Coverage_serialize (hb_serialize_context_t *c,
+ Iterator it);
+
+template<typename Iterator>
+static inline void ClassDef_serialize (hb_serialize_context_t *c,
+ Iterator it);
+
+static void ClassDef_remap_and_serialize (hb_serialize_context_t *c,
+ const hb_set_t &glyphset,
+ const hb_map_t &gid_klass_map,
+ hb_sorted_vector_t<HBGlyphID> glyphs,
+ hb_sorted_vector_t<unsigned> klasses,
+ hb_map_t *klass_map /*INOUT*/);
+
+
+template<typename OutputArray>
+struct subset_offset_array_t
+{
+ subset_offset_array_t
+ (hb_subset_context_t *subset_context,
+ OutputArray& out,
+ const void *src_base,
+ const void *dest_base)
+ : _subset_context(subset_context), _out (out), _src_base (src_base), _dest_base (dest_base) {}
+
+ template <typename T>
+ bool
+ operator ()
+ (T&& offset)
+ {
+ auto *o = _out.serialize_append (_subset_context->serializer);
+ if (unlikely (!o)) return false;
+ auto snap = _subset_context->serializer->snapshot ();
+ bool ret = o->serialize_subset (_subset_context, offset, _src_base, _dest_base);
+ if (!ret)
+ {
+ _out.pop ();
+ _subset_context->serializer->revert (snap);
+ }
+ return ret;
+ }
+
+ private:
+ hb_subset_context_t *_subset_context;
+ OutputArray &_out;
+ const void *_src_base;
+ const void *_dest_base;
+};
+
+/*
+ * Helper to subset an array of offsets. Subsets the thing pointed to by each offset
+ * and discards the offset in the array if the subset operation results in an empty
+ * thing.
+ */
+struct
+{
+ template<typename OutputArray>
+ subset_offset_array_t<OutputArray>
+ operator ()
+ (hb_subset_context_t *subset_context,
+ OutputArray& out,
+ const void *src_base,
+ const void *dest_base) const
+ {
+ return subset_offset_array_t<OutputArray> (subset_context, out, src_base, dest_base);
+ }
+}
+HB_FUNCOBJ (subset_offset_array);
+
+/*
+ *
+ * OpenType Layout Common Table Formats
+ *
+ */
+
+
+/*
+ * Script, ScriptList, LangSys, Feature, FeatureList, Lookup, LookupList
+ */
+
+struct Record_sanitize_closure_t {
+ hb_tag_t tag;
+ const void *list_base;
+};
+
+struct RecordList_subset_context_t {
+
+ RecordList_subset_context_t() : script_count (0), langsys_count (0)
+ {}
+
+ bool visitScript ()
+ {
+ return script_count++ < HB_MAX_SCRIPTS;
+ }
+
+ bool visitLangSys ()
+ {
+ return langsys_count++ < HB_MAX_LANGSYS;
+ }
+
+ private:
+ unsigned int script_count;
+ unsigned int langsys_count;
+};
+
+template <typename Type>
+struct Record
+{
+ int cmp (hb_tag_t a) const { return tag.cmp (a); }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ const Record_sanitize_closure_t closure = {tag, base};
+ return_trace (c->check_struct (this) && offset.sanitize (c, base, &closure));
+ }
+
+ Tag tag; /* 4-byte Tag identifier */
+ OffsetTo<Type>
+ offset; /* Offset from beginning of object holding
+ * the Record */
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+template <typename Type>
+struct RecordArrayOf : SortedArrayOf<Record<Type>>
+{
+ const OffsetTo<Type>& get_offset (unsigned int i) const
+ { return (*this)[i].offset; }
+ OffsetTo<Type>& get_offset (unsigned int i)
+ { return (*this)[i].offset; }
+ const Tag& get_tag (unsigned int i) const
+ { return (*this)[i].tag; }
+ unsigned int get_tags (unsigned int start_offset,
+ unsigned int *record_count /* IN/OUT */,
+ hb_tag_t *record_tags /* OUT */) const
+ {
+ if (record_count) {
+ const Record<Type> *arr = this->sub_array (start_offset, record_count);
+ unsigned int count = *record_count;
+ for (unsigned int i = 0; i < count; i++)
+ record_tags[i] = arr[i].tag;
+ }
+ return this->len;
+ }
+ bool find_index (hb_tag_t tag, unsigned int *index) const
+ {
+ return this->bfind (tag, index, HB_BFIND_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
+ }
+};
+
+template <typename Type>
+struct RecordListOf : RecordArrayOf<Type>
+{
+ const Type& operator [] (unsigned int i) const
+ { return this+this->get_offset (i); }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+ RecordList_subset_context_t record_list_context;
+
+ unsigned int count = this->len;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ auto *record = out->serialize_append (c->serializer);
+ if (unlikely (!record)) return false;
+ auto snap = c->serializer->snapshot ();
+ if (record->offset.serialize_subset (c, this->get_offset (i), this, out, &record_list_context))
+ {
+ record->tag = this->get_tag(i);
+ continue;
+ }
+ out->pop ();
+ c->serializer->revert (snap);
+ }
+
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (RecordArrayOf<Type>::sanitize (c, this));
+ }
+};
+
+
+struct RangeRecord
+{
+ int cmp (hb_codepoint_t g) const
+ { return g < start ? -1 : g <= end ? 0 : +1; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ bool intersects (const hb_set_t *glyphs) const
+ { return glyphs->intersects (start, end); }
+
+ template <typename set_t>
+ bool add_coverage (set_t *glyphs) const
+ { return glyphs->add_range (start, end); }
+
+ HBGlyphID start; /* First GlyphID in the range */
+ HBGlyphID end; /* Last GlyphID in the range */
+ HBUINT16 value; /* Value */
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+DECLARE_NULL_NAMESPACE_BYTES (OT, RangeRecord);
+
+
+struct IndexArray : ArrayOf<Index>
+{
+ unsigned int get_indexes (unsigned int start_offset,
+ unsigned int *_count /* IN/OUT */,
+ unsigned int *_indexes /* OUT */) const
+ {
+ if (_count) {
+ const HBUINT16 *arr = this->sub_array (start_offset, _count);
+ unsigned int count = *_count;
+ for (unsigned int i = 0; i < count; i++)
+ _indexes[i] = arr[i];
+ }
+ return this->len;
+ }
+
+ void add_indexes_to (hb_set_t* output /* OUT */) const
+ {
+ output->add_array (arrayZ, len);
+ }
+};
+
+
+struct Script;
+struct LangSys;
+struct Feature;
+
+struct LangSys
+{
+ unsigned int get_feature_count () const
+ { return featureIndex.len; }
+ hb_tag_t get_feature_index (unsigned int i) const
+ { return featureIndex[i]; }
+ unsigned int get_feature_indexes (unsigned int start_offset,
+ unsigned int *feature_count /* IN/OUT */,
+ unsigned int *feature_indexes /* OUT */) const
+ { return featureIndex.get_indexes (start_offset, feature_count, feature_indexes); }
+ void add_feature_indexes_to (hb_set_t *feature_indexes) const
+ { featureIndex.add_indexes_to (feature_indexes); }
+
+ bool has_required_feature () const { return reqFeatureIndex != 0xFFFFu; }
+ unsigned int get_required_feature_index () const
+ {
+ if (reqFeatureIndex == 0xFFFFu)
+ return Index::NOT_FOUND_INDEX;
+ return reqFeatureIndex;
+ }
+
+ LangSys* copy (hb_serialize_context_t *c) const
+ {
+ TRACE_SERIALIZE (this);
+ return_trace (c->embed (*this));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c,
+ const Record_sanitize_closure_t * = nullptr) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && featureIndex.sanitize (c));
+ }
+
+ Offset16 lookupOrderZ; /* = Null (reserved for an offset to a
+ * reordering table) */
+ HBUINT16 reqFeatureIndex;/* Index of a feature required for this
+ * language system--if no required features
+ * = 0xFFFFu */
+ IndexArray featureIndex; /* Array of indices into the FeatureList */
+ public:
+ DEFINE_SIZE_ARRAY_SIZED (6, featureIndex);
+};
+DECLARE_NULL_NAMESPACE_BYTES (OT, LangSys);
+
+struct Script
+{
+ unsigned int get_lang_sys_count () const
+ { return langSys.len; }
+ const Tag& get_lang_sys_tag (unsigned int i) const
+ { return langSys.get_tag (i); }
+ unsigned int get_lang_sys_tags (unsigned int start_offset,
+ unsigned int *lang_sys_count /* IN/OUT */,
+ hb_tag_t *lang_sys_tags /* OUT */) const
+ { return langSys.get_tags (start_offset, lang_sys_count, lang_sys_tags); }
+ const LangSys& get_lang_sys (unsigned int i) const
+ {
+ if (i == Index::NOT_FOUND_INDEX) return get_default_lang_sys ();
+ return this+langSys[i].offset;
+ }
+ bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const
+ { return langSys.find_index (tag, index); }
+
+ bool has_default_lang_sys () const { return defaultLangSys != 0; }
+ const LangSys& get_default_lang_sys () const { return this+defaultLangSys; }
+
+ bool subset (hb_subset_context_t *c, RecordList_subset_context_t *record_list_context) const
+ {
+ TRACE_SUBSET (this);
+ if (!record_list_context->visitScript ()) return_trace (false);
+
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+ out->defaultLangSys.serialize_copy (c->serializer, defaultLangSys, this, out);
+
+ for (const auto &src: langSys)
+ {
+ if (!record_list_context->visitLangSys ()) {
+ continue;
+ }
+
+ auto snap = c->serializer->snapshot ();
+ auto *lang_sys = c->serializer->embed (src);
+
+ if (likely(lang_sys)
+ && lang_sys->offset.serialize_copy (c->serializer, src.offset, this, out))
+ {
+ out->langSys.len++;
+ continue;
+ }
+ c->serializer->revert (snap);
+ }
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c,
+ const Record_sanitize_closure_t * = nullptr) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
+ }
+
+ protected:
+ OffsetTo<LangSys>
+ defaultLangSys; /* Offset to DefaultLangSys table--from
+ * beginning of Script table--may be Null */
+ RecordArrayOf<LangSys>
+ langSys; /* Array of LangSysRecords--listed
+ * alphabetically by LangSysTag */
+ public:
+ DEFINE_SIZE_ARRAY_SIZED (4, langSys);
+};
+
+typedef RecordListOf<Script> ScriptList;
+
+
+/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#size */
+struct FeatureParamsSize
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this))) return_trace (false);
+
+ /* This subtable has some "history", if you will. Some earlier versions of
+ * Adobe tools calculated the offset of the FeatureParams sutable from the
+ * beginning of the FeatureList table! Now, that is dealt with in the
+ * Feature implementation. But we still need to be able to tell junk from
+ * real data. Note: We don't check that the nameID actually exists.
+ *
+ * Read Roberts wrote on 9/15/06 on opentype-list@indx.co.uk :
+ *
+ * Yes, it is correct that a new version of the AFDKO (version 2.0) will be
+ * coming out soon, and that the makeotf program will build a font with a
+ * 'size' feature that is correct by the specification.
+ *
+ * The specification for this feature tag is in the "OpenType Layout Tag
+ * Registry". You can see a copy of this at:
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-size
+ *
+ * Here is one set of rules to determine if the 'size' feature is built
+ * correctly, or as by the older versions of MakeOTF. You may be able to do
+ * better.
+ *
+ * Assume that the offset to the size feature is according to specification,
+ * and make the following value checks. If it fails, assume the size
+ * feature is calculated as versions of MakeOTF before the AFDKO 2.0 built it.
+ * If this fails, reject the 'size' feature. The older makeOTF's calculated the
+ * offset from the beginning of the FeatureList table, rather than from the
+ * beginning of the 'size' Feature table.
+ *
+ * If "design size" == 0:
+ * fails check
+ *
+ * Else if ("subfamily identifier" == 0 and
+ * "range start" == 0 and
+ * "range end" == 0 and
+ * "range start" == 0 and
+ * "menu name ID" == 0)
+ * passes check: this is the format used when there is a design size
+ * specified, but there is no recommended size range.
+ *
+ * Else if ("design size" < "range start" or
+ * "design size" > "range end" or
+ * "range end" <= "range start" or
+ * "menu name ID" < 256 or
+ * "menu name ID" > 32767 or
+ * menu name ID is not a name ID which is actually in the name table)
+ * fails test
+ * Else
+ * passes test.
+ */
+
+ if (!designSize)
+ return_trace (false);
+ else if (subfamilyID == 0 &&
+ subfamilyNameID == 0 &&
+ rangeStart == 0 &&
+ rangeEnd == 0)
+ return_trace (true);
+ else if (designSize < rangeStart ||
+ designSize > rangeEnd ||
+ subfamilyNameID < 256 ||
+ subfamilyNameID > 32767)
+ return_trace (false);
+ else
+ return_trace (true);
+ }
+
+ HBUINT16 designSize; /* Represents the design size in 720/inch
+ * units (decipoints). The design size entry
+ * must be non-zero. When there is a design
+ * size but no recommended size range, the
+ * rest of the array will consist of zeros. */
+ HBUINT16 subfamilyID; /* Has no independent meaning, but serves
+ * as an identifier that associates fonts
+ * in a subfamily. All fonts which share a
+ * Preferred or Font Family name and which
+ * differ only by size range shall have the
+ * same subfamily value, and no fonts which
+ * differ in weight or style shall have the
+ * same subfamily value. If this value is
+ * zero, the remaining fields in the array
+ * will be ignored. */
+ NameID subfamilyNameID;/* If the preceding value is non-zero, this
+ * value must be set in the range 256 - 32767
+ * (inclusive). It records the value of a
+ * field in the name table, which must
+ * contain English-language strings encoded
+ * in Windows Unicode and Macintosh Roman,
+ * and may contain additional strings
+ * localized to other scripts and languages.
+ * Each of these strings is the name an
+ * application should use, in combination
+ * with the family name, to represent the
+ * subfamily in a menu. Applications will
+ * choose the appropriate version based on
+ * their selection criteria. */
+ HBUINT16 rangeStart; /* Large end of the recommended usage range
+ * (inclusive), stored in 720/inch units
+ * (decipoints). */
+ HBUINT16 rangeEnd; /* Small end of the recommended usage range
+ (exclusive), stored in 720/inch units
+ * (decipoints). */
+ public:
+ DEFINE_SIZE_STATIC (10);
+};
+
+/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#ssxx */
+struct FeatureParamsStylisticSet
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ /* Right now minorVersion is at zero. Which means, any table supports
+ * the uiNameID field. */
+ return_trace (c->check_struct (this));
+ }
+
+ HBUINT16 version; /* (set to 0): This corresponds to a “minor”
+ * version number. Additional data may be
+ * added to the end of this Feature Parameters
+ * table in the future. */
+
+ NameID uiNameID; /* The 'name' table name ID that specifies a
+ * string (or strings, for multiple languages)
+ * for a user-interface label for this
+ * feature. The values of uiLabelNameId and
+ * sampleTextNameId are expected to be in the
+ * font-specific name ID range (256-32767),
+ * though that is not a requirement in this
+ * Feature Parameters specification. The
+ * user-interface label for the feature can
+ * be provided in multiple languages. An
+ * English string should be included as a
+ * fallback. The string should be kept to a
+ * minimal length to fit comfortably with
+ * different application interfaces. */
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_ae#cv01-cv99 */
+struct FeatureParamsCharacterVariants
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ characters.sanitize (c));
+ }
+
+ HBUINT16 format; /* Format number is set to 0. */
+ NameID featUILableNameID; /* The ‘name’ table name ID that
+ * specifies a string (or strings,
+ * for multiple languages) for a
+ * user-interface label for this
+ * feature. (May be NULL.) */
+ NameID featUITooltipTextNameID;/* The ‘name’ table name ID that
+ * specifies a string (or strings,
+ * for multiple languages) that an
+ * application can use for tooltip
+ * text for this feature. (May be
+ * nullptr.) */
+ NameID sampleTextNameID; /* The ‘name’ table name ID that
+ * specifies sample text that
+ * illustrates the effect of this
+ * feature. (May be NULL.) */
+ HBUINT16 numNamedParameters; /* Number of named parameters. (May
+ * be zero.) */
+ NameID firstParamUILabelNameID;/* The first ‘name’ table name ID
+ * used to specify strings for
+ * user-interface labels for the
+ * feature parameters. (Must be zero
+ * if numParameters is zero.) */
+ ArrayOf<HBUINT24>
+ characters; /* Array of the Unicode Scalar Value
+ * of the characters for which this
+ * feature provides glyph variants.
+ * (May be zero.) */
+ public:
+ DEFINE_SIZE_ARRAY (14, characters);
+};
+
+struct FeatureParams
+{
+ bool sanitize (hb_sanitize_context_t *c, hb_tag_t tag) const
+ {
+#ifdef HB_NO_LAYOUT_FEATURE_PARAMS
+ return true;
+#endif
+ TRACE_SANITIZE (this);
+ if (tag == HB_TAG ('s','i','z','e'))
+ return_trace (u.size.sanitize (c));
+ if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
+ return_trace (u.stylisticSet.sanitize (c));
+ if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
+ return_trace (u.characterVariants.sanitize (c));
+ return_trace (true);
+ }
+
+#ifndef HB_NO_LAYOUT_FEATURE_PARAMS
+ const FeatureParamsSize& get_size_params (hb_tag_t tag) const
+ {
+ if (tag == HB_TAG ('s','i','z','e'))
+ return u.size;
+ return Null (FeatureParamsSize);
+ }
+ const FeatureParamsStylisticSet& get_stylistic_set_params (hb_tag_t tag) const
+ {
+ if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
+ return u.stylisticSet;
+ return Null (FeatureParamsStylisticSet);
+ }
+ const FeatureParamsCharacterVariants& get_character_variants_params (hb_tag_t tag) const
+ {
+ if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
+ return u.characterVariants;
+ return Null (FeatureParamsCharacterVariants);
+ }
+#endif
+
+ private:
+ union {
+ FeatureParamsSize size;
+ FeatureParamsStylisticSet stylisticSet;
+ FeatureParamsCharacterVariants characterVariants;
+ } u;
+ public:
+ DEFINE_SIZE_MIN (0);
+};
+
+struct Feature
+{
+ unsigned int get_lookup_count () const
+ { return lookupIndex.len; }
+ hb_tag_t get_lookup_index (unsigned int i) const
+ { return lookupIndex[i]; }
+ unsigned int get_lookup_indexes (unsigned int start_index,
+ unsigned int *lookup_count /* IN/OUT */,
+ unsigned int *lookup_tags /* OUT */) const
+ { return lookupIndex.get_indexes (start_index, lookup_count, lookup_tags); }
+ void add_lookup_indexes_to (hb_set_t *lookup_indexes) const
+ { lookupIndex.add_indexes_to (lookup_indexes); }
+
+ const FeatureParams &get_feature_params () const
+ { return this+featureParams; }
+
+ bool subset (hb_subset_context_t *c, RecordList_subset_context_t *r) const
+ {
+ TRACE_SUBSET (this);
+ auto *out = c->serializer->embed (*this);
+ if (unlikely (!out)) return_trace (false);
+ out->featureParams = 0; /* TODO(subset) FeatureParams. */
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c,
+ const Record_sanitize_closure_t *closure = nullptr) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c))))
+ return_trace (false);
+
+ /* Some earlier versions of Adobe tools calculated the offset of the
+ * FeatureParams subtable from the beginning of the FeatureList table!
+ *
+ * If sanitizing "failed" for the FeatureParams subtable, try it with the
+ * alternative location. We would know sanitize "failed" if old value
+ * of the offset was non-zero, but it's zeroed now.
+ *
+ * Only do this for the 'size' feature, since at the time of the faulty
+ * Adobe tools, only the 'size' feature had FeatureParams defined.
+ */
+
+ if (likely (featureParams.is_null ()))
+ return_trace (true);
+
+ unsigned int orig_offset = featureParams;
+ if (unlikely (!featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE)))
+ return_trace (false);
+
+ if (featureParams == 0 && closure &&
+ closure->tag == HB_TAG ('s','i','z','e') &&
+ closure->list_base && closure->list_base < this)
+ {
+ unsigned int new_offset_int = orig_offset -
+ (((char *) this) - ((char *) closure->list_base));
+
+ OffsetTo<FeatureParams> new_offset;
+ /* Check that it would not overflow. */
+ new_offset = new_offset_int;
+ if (new_offset == new_offset_int &&
+ c->try_set (&featureParams, new_offset_int) &&
+ !featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE))
+ return_trace (false);
+ }
+
+ return_trace (true);
+ }
+
+ OffsetTo<FeatureParams>
+ featureParams; /* Offset to Feature Parameters table (if one
+ * has been defined for the feature), relative
+ * to the beginning of the Feature Table; = Null
+ * if not required */
+ IndexArray lookupIndex; /* Array of LookupList indices */
+ public:
+ DEFINE_SIZE_ARRAY_SIZED (4, lookupIndex);
+};
+
+typedef RecordListOf<Feature> FeatureList;
+
+
+struct LookupFlag : HBUINT16
+{
+ enum Flags {
+ RightToLeft = 0x0001u,
+ IgnoreBaseGlyphs = 0x0002u,
+ IgnoreLigatures = 0x0004u,
+ IgnoreMarks = 0x0008u,
+ IgnoreFlags = 0x000Eu,
+ UseMarkFilteringSet = 0x0010u,
+ Reserved = 0x00E0u,
+ MarkAttachmentType = 0xFF00u
+ };
+ public:
+ DEFINE_SIZE_STATIC (2);
+};
+
+} /* namespace OT */
+/* This has to be outside the namespace. */
+HB_MARK_AS_FLAG_T (OT::LookupFlag::Flags);
+namespace OT {
+
+struct Lookup
+{
+ unsigned int get_subtable_count () const { return subTable.len; }
+
+ template <typename TSubTable>
+ const OffsetArrayOf<TSubTable>& get_subtables () const
+ { return CastR<OffsetArrayOf<TSubTable>> (subTable); }
+ template <typename TSubTable>
+ OffsetArrayOf<TSubTable>& get_subtables ()
+ { return CastR<OffsetArrayOf<TSubTable>> (subTable); }
+
+ template <typename TSubTable>
+ const TSubTable& get_subtable (unsigned int i) const
+ { return this+get_subtables<TSubTable> ()[i]; }
+ template <typename TSubTable>
+ TSubTable& get_subtable (unsigned int i)
+ { return this+get_subtables<TSubTable> ()[i]; }
+
+ unsigned int get_size () const
+ {
+ const HBUINT16 &markFilteringSet = StructAfter<const HBUINT16> (subTable);
+ if (lookupFlag & LookupFlag::UseMarkFilteringSet)
+ return (const char *) &StructAfter<const char> (markFilteringSet) - (const char *) this;
+ return (const char *) &markFilteringSet - (const char *) this;
+ }
+
+ unsigned int get_type () const { return lookupType; }
+
+ /* lookup_props is a 32-bit integer where the lower 16-bit is LookupFlag and
+ * higher 16-bit is mark-filtering-set if the lookup uses one.
+ * Not to be confused with glyph_props which is very similar. */
+ uint32_t get_props () const
+ {
+ unsigned int flag = lookupFlag;
+ if (unlikely (flag & LookupFlag::UseMarkFilteringSet))
+ {
+ const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
+ flag += (markFilteringSet << 16);
+ }
+ return flag;
+ }
+
+ template <typename TSubTable, typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+ {
+ unsigned int lookup_type = get_type ();
+ TRACE_DISPATCH (this, lookup_type);
+ unsigned int count = get_subtable_count ();
+ for (unsigned int i = 0; i < count; i++) {
+ typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, hb_forward<Ts> (ds)...);
+ if (c->stop_sublookup_iteration (r))
+ return_trace (r);
+ }
+ return_trace (c->default_return_value ());
+ }
+
+ bool serialize (hb_serialize_context_t *c,
+ unsigned int lookup_type,
+ uint32_t lookup_props,
+ unsigned int num_subtables)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+ lookupType = lookup_type;
+ lookupFlag = lookup_props & 0xFFFFu;
+ if (unlikely (!subTable.serialize (c, num_subtables))) return_trace (false);
+ if (lookupFlag & LookupFlag::UseMarkFilteringSet)
+ {
+ if (unlikely (!c->extend (*this))) return_trace (false);
+ HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
+ markFilteringSet = lookup_props >> 16;
+ }
+ return_trace (true);
+ }
+
+ template <typename TSubTable>
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ auto *out = c->serializer->embed (*this);
+ if (unlikely (!out)) return_trace (false);
+
+ /* Subset the actual subtables. */
+ /* TODO Drop empty ones, either by calling intersects() beforehand,
+ * or just dropping null offsets after. */
+ const OffsetArrayOf<TSubTable>& subtables = get_subtables<TSubTable> ();
+ OffsetArrayOf<TSubTable>& out_subtables = out->get_subtables<TSubTable> ();
+ unsigned int count = subTable.len;
+ for (unsigned int i = 0; i < count; i++)
+ out_subtables[i].serialize_subset (c, subtables[i], this, out, get_type ());
+
+ return_trace (true);
+ }
+
+ template <typename TSubTable>
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
+ if (lookupFlag & LookupFlag::UseMarkFilteringSet)
+ {
+ const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
+ if (!markFilteringSet.sanitize (c)) return_trace (false);
+ }
+
+ if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
+ return_trace (false);
+
+ if (unlikely (get_type () == TSubTable::Extension && !c->get_edit_count ()))
+ {
+ /* The spec says all subtables of an Extension lookup should
+ * have the same type, which shall not be the Extension type
+ * itself (but we already checked for that).
+ * This is specially important if one has a reverse type!
+ *
+ * We only do this if sanitizer edit_count is zero. Otherwise,
+ * some of the subtables might have become insane after they
+ * were sanity-checked by the edits of subsequent subtables.
+ * https://bugs.chromium.org/p/chromium/issues/detail?id=960331
+ */
+ unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
+ unsigned int count = get_subtable_count ();
+ for (unsigned int i = 1; i < count; i++)
+ if (get_subtable<TSubTable> (i).u.extension.get_type () != type)
+ return_trace (false);
+ }
+ return_trace (true);
+ }
+
+ private:
+ HBUINT16 lookupType; /* Different enumerations for GSUB and GPOS */
+ HBUINT16 lookupFlag; /* Lookup qualifiers */
+ ArrayOf<Offset16>
+ subTable; /* Array of SubTables */
+/*HBUINT16 markFilteringSetX[HB_VAR_ARRAY];*//* Index (base 0) into GDEF mark glyph sets
+ * structure. This field is only present if bit
+ * UseMarkFilteringSet of lookup flags is set. */
+ public:
+ DEFINE_SIZE_ARRAY (6, subTable);
+};
+
+typedef OffsetListOf<Lookup> LookupList;
+
+
+/*
+ * Coverage Table
+ */
+
+struct CoverageFormat1
+{
+ friend struct Coverage;
+
+ private:
+ unsigned int get_coverage (hb_codepoint_t glyph_id) const
+ {
+ unsigned int i;
+ glyphArray.bfind (glyph_id, &i, HB_BFIND_NOT_FOUND_STORE, NOT_COVERED);
+ return i;
+ }
+
+ template <typename Iterator,
+ hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
+ bool serialize (hb_serialize_context_t *c, Iterator glyphs)
+ {
+ TRACE_SERIALIZE (this);
+ return_trace (glyphArray.serialize (c, glyphs));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (glyphArray.sanitize (c));
+ }
+
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ /* TODO Speed up, using hb_set_next() and bsearch()? */
+ unsigned int count = glyphArray.len;
+ for (unsigned int i = 0; i < count; i++)
+ if (glyphs->has (glyphArray[i]))
+ return true;
+ return false;
+ }
+ bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
+ { return glyphs->has (glyphArray[index]); }
+
+ template <typename set_t>
+ bool add_coverage (set_t *glyphs) const
+ { return glyphs->add_sorted_array (glyphArray.arrayZ, glyphArray.len); }
+
+ public:
+ /* Older compilers need this to be public. */
+ struct iter_t
+ {
+ void init (const struct CoverageFormat1 &c_) { c = &c_; i = 0; }
+ void fini () {}
+ bool more () const { return i < c->glyphArray.len; }
+ void next () { i++; }
+ hb_codepoint_t get_glyph () const { return c->glyphArray[i]; }
+ bool operator != (const iter_t& o) const
+ { return i != o.i || c != o.c; }
+
+ private:
+ const struct CoverageFormat1 *c;
+ unsigned int i;
+ };
+ private:
+
+ protected:
+ HBUINT16 coverageFormat; /* Format identifier--format = 1 */
+ SortedArrayOf<HBGlyphID>
+ glyphArray; /* Array of GlyphIDs--in numerical order */
+ public:
+ DEFINE_SIZE_ARRAY (4, glyphArray);
+};
+
+struct CoverageFormat2
+{
+ friend struct Coverage;
+
+ private:
+ unsigned int get_coverage (hb_codepoint_t glyph_id) const
+ {
+ const RangeRecord &range = rangeRecord.bsearch (glyph_id);
+ return likely (range.start <= range.end) ?
+ (unsigned int) range.value + (glyph_id - range.start) :
+ NOT_COVERED;
+ }
+
+ template <typename Iterator,
+ hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
+ bool serialize (hb_serialize_context_t *c, Iterator glyphs)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+ if (unlikely (!glyphs))
+ {
+ rangeRecord.len = 0;
+ return_trace (true);
+ }
+
+ /* TODO(iter) Write more efficiently? */
+
+ unsigned num_ranges = 0;
+ hb_codepoint_t last = (hb_codepoint_t) -2;
+ for (auto g: glyphs)
+ {
+ if (last + 1 != g)
+ num_ranges++;
+ last = g;
+ }
+
+ if (unlikely (!rangeRecord.serialize (c, num_ranges))) return_trace (false);
+
+ unsigned count = 0;
+ unsigned range = (unsigned) -1;
+ last = (hb_codepoint_t) -2;
+ for (auto g: glyphs)
+ {
+ if (last + 1 != g)
+ {
+ range++;
+ rangeRecord[range].start = g;
+ rangeRecord[range].value = count;
+ }
+ rangeRecord[range].end = g;
+ last = g;
+ count++;
+ }
+
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (rangeRecord.sanitize (c));
+ }
+
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ /* TODO Speed up, using hb_set_next() and bsearch()? */
+ unsigned int count = rangeRecord.len;
+ for (unsigned int i = 0; i < count; i++)
+ if (rangeRecord[i].intersects (glyphs))
+ return true;
+ return false;
+ }
+ bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
+ {
+ unsigned int i;
+ unsigned int count = rangeRecord.len;
+ for (i = 0; i < count; i++) {
+ const RangeRecord &range = rangeRecord[i];
+ if (range.value <= index &&
+ index < (unsigned int) range.value + (range.end - range.start) &&
+ range.intersects (glyphs))
+ return true;
+ else if (index < range.value)
+ return false;
+ }
+ return false;
+ }
+
+ template <typename set_t>
+ bool add_coverage (set_t *glyphs) const
+ {
+ unsigned int count = rangeRecord.len;
+ for (unsigned int i = 0; i < count; i++)
+ if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+ return false;
+ return true;
+ }
+
+ public:
+ /* Older compilers need this to be public. */
+ struct iter_t
+ {
+ void init (const CoverageFormat2 &c_)
+ {
+ c = &c_;
+ coverage = 0;
+ i = 0;
+ j = c->rangeRecord.len ? c->rangeRecord[0].start : 0;
+ if (unlikely (c->rangeRecord[0].start > c->rangeRecord[0].end))
+ {
+ /* Broken table. Skip. */
+ i = c->rangeRecord.len;
+ }
+ }
+ void fini () {}
+ bool more () const { return i < c->rangeRecord.len; }
+ void next ()
+ {
+ if (j >= c->rangeRecord[i].end)
+ {
+ i++;
+ if (more ())
+ {
+ unsigned int old = coverage;
+ j = c->rangeRecord[i].start;
+ coverage = c->rangeRecord[i].value;
+ if (unlikely (coverage != old + 1))
+ {
+ /* Broken table. Skip. Important to avoid DoS.
+ * Also, our callers depend on coverage being
+ * consecutive and monotonically increasing,
+ * ie. iota(). */
+ i = c->rangeRecord.len;
+ return;
+ }
+ }
+ return;
+ }
+ coverage++;
+ j++;
+ }
+ hb_codepoint_t get_glyph () const { return j; }
+ bool operator != (const iter_t& o) const
+ { return i != o.i || j != o.j || c != o.c; }
+
+ private:
+ const struct CoverageFormat2 *c;
+ unsigned int i, coverage;
+ hb_codepoint_t j;
+ };
+ private:
+
+ protected:
+ HBUINT16 coverageFormat; /* Format identifier--format = 2 */
+ SortedArrayOf<RangeRecord>
+ rangeRecord; /* Array of glyph ranges--ordered by
+ * Start GlyphID. rangeCount entries
+ * long */
+ public:
+ DEFINE_SIZE_ARRAY (4, rangeRecord);
+};
+
+struct Coverage
+{
+ /* Has interface. */
+ static constexpr unsigned SENTINEL = NOT_COVERED;
+ typedef unsigned int value_t;
+ value_t operator [] (hb_codepoint_t k) const { return get (k); }
+ bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; }
+ /* Predicate. */
+ bool operator () (hb_codepoint_t k) const { return has (k); }
+
+ unsigned int get (hb_codepoint_t k) const { return get_coverage (k); }
+ unsigned int get_coverage (hb_codepoint_t glyph_id) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.get_coverage (glyph_id);
+ case 2: return u.format2.get_coverage (glyph_id);
+ default:return NOT_COVERED;
+ }
+ }
+
+ template <typename Iterator,
+ hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
+ bool serialize (hb_serialize_context_t *c, Iterator glyphs)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+ unsigned count = 0;
+ unsigned num_ranges = 0;
+ hb_codepoint_t last = (hb_codepoint_t) -2;
+ for (auto g: glyphs)
+ {
+ if (last + 1 != g)
+ num_ranges++;
+ last = g;
+ count++;
+ }
+ u.format = count <= num_ranges * 3 ? 1 : 2;
+
+ switch (u.format)
+ {
+ case 1: return_trace (u.format1.serialize (c, glyphs));
+ case 2: return_trace (u.format2.serialize (c, glyphs));
+ default:return_trace (false);
+ }
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ auto it =
+ + iter ()
+ | hb_filter (glyphset)
+ | hb_map_retains_sorting (glyph_map)
+ ;
+
+ bool ret = bool (it);
+ Coverage_serialize (c->serializer, it);
+ return_trace (ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!u.format.sanitize (c)) return_trace (false);
+ switch (u.format)
+ {
+ case 1: return_trace (u.format1.sanitize (c));
+ case 2: return_trace (u.format2.sanitize (c));
+ default:return_trace (true);
+ }
+ }
+
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ switch (u.format)
+ {
+ case 1: return u.format1.intersects (glyphs);
+ case 2: return u.format2.intersects (glyphs);
+ default:return false;
+ }
+ }
+ bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
+ {
+ switch (u.format)
+ {
+ case 1: return u.format1.intersects_coverage (glyphs, index);
+ case 2: return u.format2.intersects_coverage (glyphs, index);
+ default:return false;
+ }
+ }
+
+ /* Might return false if array looks unsorted.
+ * Used for faster rejection of corrupt data. */
+ template <typename set_t>
+ bool add_coverage (set_t *glyphs) const
+ {
+ switch (u.format)
+ {
+ case 1: return u.format1.add_coverage (glyphs);
+ case 2: return u.format2.add_coverage (glyphs);
+ default:return false;
+ }
+ }
+
+ struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t>
+ {
+ static constexpr bool is_sorted_iterator = true;
+ iter_t (const Coverage &c_ = Null(Coverage))
+ {
+ memset (this, 0, sizeof (*this));
+ format = c_.u.format;
+ switch (format)
+ {
+ case 1: u.format1.init (c_.u.format1); return;
+ case 2: u.format2.init (c_.u.format2); return;
+ default: return;
+ }
+ }
+ bool __more__ () const
+ {
+ switch (format)
+ {
+ case 1: return u.format1.more ();
+ case 2: return u.format2.more ();
+ default:return false;
+ }
+ }
+ void __next__ ()
+ {
+ switch (format)
+ {
+ case 1: u.format1.next (); break;
+ case 2: u.format2.next (); break;
+ default: break;
+ }
+ }
+ typedef hb_codepoint_t __item_t__;
+ __item_t__ __item__ () const { return get_glyph (); }
+
+ hb_codepoint_t get_glyph () const
+ {
+ switch (format)
+ {
+ case 1: return u.format1.get_glyph ();
+ case 2: return u.format2.get_glyph ();
+ default:return 0;
+ }
+ }
+ bool operator != (const iter_t& o) const
+ {
+ if (format != o.format) return true;
+ switch (format)
+ {
+ case 1: return u.format1 != o.u.format1;
+ case 2: return u.format2 != o.u.format2;
+ default:return false;
+ }
+ }
+
+ private:
+ unsigned int format;
+ union {
+ CoverageFormat2::iter_t format2; /* Put this one first since it's larger; helps shut up compiler. */
+ CoverageFormat1::iter_t format1;
+ } u;
+ };
+ iter_t iter () const { return iter_t (*this); }
+
+ protected:
+ union {
+ HBUINT16 format; /* Format identifier */
+ CoverageFormat1 format1;
+ CoverageFormat2 format2;
+ } u;
+ public:
+ DEFINE_SIZE_UNION (2, format);
+};
+
+template<typename Iterator>
+static inline void
+Coverage_serialize (hb_serialize_context_t *c,
+ Iterator it)
+{ c->start_embed<Coverage> ()->serialize (c, it); }
+
+static void ClassDef_remap_and_serialize (hb_serialize_context_t *c,
+ const hb_set_t &glyphset,
+ const hb_map_t &gid_klass_map,
+ hb_sorted_vector_t<HBGlyphID> glyphs,
+ hb_sorted_vector_t<unsigned> klasses,
+ hb_map_t *klass_map /*INOUT*/)
+{
+ bool has_no_match = glyphset.get_population () > gid_klass_map.get_population ();
+
+ hb_map_t m;
+ if (!klass_map) klass_map = &m;
+
+ if (has_no_match) klass_map->set (0, 0);
+ unsigned idx = klass_map->has (0) ? 1 : 0;
+ for (const unsigned k: klasses.iter ())
+ {
+ if (klass_map->has (k)) continue;
+ klass_map->set (k, idx);
+ idx++;
+ }
+
+ auto it =
+ + glyphs.iter ()
+ | hb_map_retains_sorting ([&] (const HBGlyphID& gid) -> hb_pair_t<hb_codepoint_t, HBUINT16>
+ {
+ HBUINT16 new_klass;
+ new_klass = klass_map->get (gid_klass_map[gid]);
+ return hb_pair ((hb_codepoint_t)gid, new_klass);
+ })
+ ;
+
+ c->propagate_error (glyphs, klasses);
+ ClassDef_serialize (c, it);
+}
+
+/*
+ * Class Definition Table
+ */
+
+struct ClassDefFormat1
+{
+ friend struct ClassDef;
+
+ private:
+ unsigned int get_class (hb_codepoint_t glyph_id) const
+ {
+ return classValue[(unsigned int) (glyph_id - startGlyph)];
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ bool serialize (hb_serialize_context_t *c,
+ Iterator it)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+ if (unlikely (!it))
+ {
+ startGlyph = 0;
+ classValue.len = 0;
+ return_trace (true);
+ }
+
+ startGlyph = (*it).first;
+ classValue.serialize (c, + it
+ | hb_map (hb_second));
+ return_trace (true);
+ }
+
+ bool subset (hb_subset_context_t *c,
+ hb_map_t *klass_map = nullptr /*OUT*/) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ hb_sorted_vector_t<HBGlyphID> glyphs;
+ hb_sorted_vector_t<unsigned> orig_klasses;
+ hb_map_t gid_org_klass_map;
+
+ hb_codepoint_t start = startGlyph;
+ hb_codepoint_t end = start + classValue.len;
+ for (const hb_codepoint_t gid : + hb_range (start, end)
+ | hb_filter (glyphset))
+ {
+ unsigned klass = classValue[gid - start];
+ if (!klass) continue;
+
+ glyphs.push (glyph_map[gid]);
+ gid_org_klass_map.set (glyph_map[gid], klass);
+ orig_klasses.push (klass);
+ }
+
+ ClassDef_remap_and_serialize (c->serializer, glyphset, gid_org_klass_map,
+ glyphs, orig_klasses, klass_map);
+ return_trace ((bool) glyphs);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && classValue.sanitize (c));
+ }
+
+ template <typename set_t>
+ bool add_coverage (set_t *glyphs) const
+ {
+ unsigned int start = 0;
+ unsigned int count = classValue.len;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (classValue[i])
+ continue;
+
+ if (start != i)
+ if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + i)))
+ return false;
+
+ start = i + 1;
+ }
+ if (start != count)
+ if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + count)))
+ return false;
+
+ return true;
+ }
+
+ template <typename set_t>
+ bool add_class (set_t *glyphs, unsigned int klass) const
+ {
+ unsigned int count = classValue.len;
+ for (unsigned int i = 0; i < count; i++)
+ if (classValue[i] == klass) glyphs->add (startGlyph + i);
+ return true;
+ }
+
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ /* TODO Speed up, using hb_set_next()? */
+ hb_codepoint_t start = startGlyph;
+ hb_codepoint_t end = startGlyph + classValue.len;
+ for (hb_codepoint_t iter = startGlyph - 1;
+ hb_set_next (glyphs, &iter) && iter < end;)
+ if (classValue[iter - start]) return true;
+ return false;
+ }
+ bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
+ {
+ unsigned int count = classValue.len;
+ if (klass == 0)
+ {
+ /* Match if there's any glyph that is not listed! */
+ hb_codepoint_t g = HB_SET_VALUE_INVALID;
+ if (!hb_set_next (glyphs, &g)) return false;
+ if (g < startGlyph) return true;
+ g = startGlyph + count - 1;
+ if (hb_set_next (glyphs, &g)) return true;
+ /* Fall through. */
+ }
+ for (unsigned int i = 0; i < count; i++)
+ if (classValue[i] == klass && glyphs->has (startGlyph + i))
+ return true;
+ return false;
+ }
+
+ protected:
+ HBUINT16 classFormat; /* Format identifier--format = 1 */
+ HBGlyphID startGlyph; /* First GlyphID of the classValueArray */
+ ArrayOf<HBUINT16>
+ classValue; /* Array of Class Values--one per GlyphID */
+ public:
+ DEFINE_SIZE_ARRAY (6, classValue);
+};
+
+struct ClassDefFormat2
+{
+ friend struct ClassDef;
+
+ private:
+ unsigned int get_class (hb_codepoint_t glyph_id) const
+ {
+ return rangeRecord.bsearch (glyph_id).value;
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ bool serialize (hb_serialize_context_t *c,
+ Iterator it)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+ if (unlikely (!it))
+ {
+ rangeRecord.len = 0;
+ return_trace (true);
+ }
+
+ unsigned num_ranges = 1;
+ hb_codepoint_t prev_gid = (*it).first;
+ unsigned prev_klass = (*it).second;
+
+ RangeRecord range_rec;
+ range_rec.start = prev_gid;
+ range_rec.end = prev_gid;
+ range_rec.value = prev_klass;
+
+ RangeRecord *record = c->copy (range_rec);
+ if (unlikely (!record)) return_trace (false);
+
+ for (const auto gid_klass_pair : + (++it))
+ {
+ hb_codepoint_t cur_gid = gid_klass_pair.first;
+ unsigned cur_klass = gid_klass_pair.second;
+
+ if (cur_gid != prev_gid + 1 ||
+ cur_klass != prev_klass)
+ {
+ if (unlikely (!record)) break;
+ record->end = prev_gid;
+ num_ranges++;
+
+ range_rec.start = cur_gid;
+ range_rec.end = cur_gid;
+ range_rec.value = cur_klass;
+
+ record = c->copy (range_rec);
+ }
+
+ prev_klass = cur_klass;
+ prev_gid = cur_gid;
+ }
+
+ if (likely (record)) record->end = prev_gid;
+ rangeRecord.len = num_ranges;
+ return_trace (true);
+ }
+
+ bool subset (hb_subset_context_t *c,
+ hb_map_t *klass_map = nullptr /*OUT*/) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ hb_sorted_vector_t<HBGlyphID> glyphs;
+ hb_sorted_vector_t<unsigned> orig_klasses;
+ hb_map_t gid_org_klass_map;
+
+ unsigned count = rangeRecord.len;
+ for (unsigned i = 0; i < count; i++)
+ {
+ unsigned klass = rangeRecord[i].value;
+ if (!klass) continue;
+ hb_codepoint_t start = rangeRecord[i].start;
+ hb_codepoint_t end = rangeRecord[i].end + 1;
+ for (hb_codepoint_t g = start; g < end; g++)
+ {
+ if (!glyphset.has (g)) continue;
+ glyphs.push (glyph_map[g]);
+ gid_org_klass_map.set (glyph_map[g], klass);
+ orig_klasses.push (klass);
+ }
+ }
+
+ ClassDef_remap_and_serialize (c->serializer, glyphset, gid_org_klass_map,
+ glyphs, orig_klasses, klass_map);
+ return_trace ((bool) glyphs);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (rangeRecord.sanitize (c));
+ }
+
+ template <typename set_t>
+ bool add_coverage (set_t *glyphs) const
+ {
+ unsigned int count = rangeRecord.len;
+ for (unsigned int i = 0; i < count; i++)
+ if (rangeRecord[i].value)
+ if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+ return false;
+ return true;
+ }
+
+ template <typename set_t>
+ bool add_class (set_t *glyphs, unsigned int klass) const
+ {
+ unsigned int count = rangeRecord.len;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (rangeRecord[i].value == klass)
+ if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+ return false;
+ }
+ return true;
+ }
+
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ /* TODO Speed up, using hb_set_next() and bsearch()? */
+ unsigned int count = rangeRecord.len;
+ for (unsigned int i = 0; i < count; i++)
+ if (rangeRecord[i].intersects (glyphs))
+ return true;
+ return false;
+ }
+ bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
+ {
+ unsigned int count = rangeRecord.len;
+ if (klass == 0)
+ {
+ /* Match if there's any glyph that is not listed! */
+ hb_codepoint_t g = HB_SET_VALUE_INVALID;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (!hb_set_next (glyphs, &g))
+ break;
+ if (g < rangeRecord[i].start)
+ return true;
+ g = rangeRecord[i].end;
+ }
+ if (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g))
+ return true;
+ /* Fall through. */
+ }
+ for (unsigned int i = 0; i < count; i++)
+ if (rangeRecord[i].value == klass && rangeRecord[i].intersects (glyphs))
+ return true;
+ return false;
+ }
+
+ protected:
+ HBUINT16 classFormat; /* Format identifier--format = 2 */
+ SortedArrayOf<RangeRecord>
+ rangeRecord; /* Array of glyph ranges--ordered by
+ * Start GlyphID */
+ public:
+ DEFINE_SIZE_ARRAY (4, rangeRecord);
+};
+
+struct ClassDef
+{
+ /* Has interface. */
+ static constexpr unsigned SENTINEL = 0;
+ typedef unsigned int value_t;
+ value_t operator [] (hb_codepoint_t k) const { return get (k); }
+ bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; }
+ /* Projection. */
+ hb_codepoint_t operator () (hb_codepoint_t k) const { return get (k); }
+
+ unsigned int get (hb_codepoint_t k) const { return get_class (k); }
+ unsigned int get_class (hb_codepoint_t glyph_id) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.get_class (glyph_id);
+ case 2: return u.format2.get_class (glyph_id);
+ default:return 0;
+ }
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ bool serialize (hb_serialize_context_t *c, Iterator it)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+ unsigned format = 2;
+ if (likely (it))
+ {
+ hb_codepoint_t glyph_min = (*it).first;
+ hb_codepoint_t glyph_max = + it
+ | hb_map (hb_first)
+ | hb_reduce (hb_max, 0u);
+
+ unsigned num_ranges = 1;
+ hb_codepoint_t prev_gid = glyph_min;
+ unsigned prev_klass = (*it).second;
+
+ for (const auto gid_klass_pair : it)
+ {
+ hb_codepoint_t cur_gid = gid_klass_pair.first;
+ unsigned cur_klass = gid_klass_pair.second;
+ if (cur_gid != prev_gid + 1 ||
+ cur_klass != prev_klass)
+ num_ranges++;
+
+ prev_gid = cur_gid;
+ prev_klass = cur_klass;
+ }
+
+ if (1 + (glyph_max - glyph_min + 1) < num_ranges * 3)
+ format = 1;
+ }
+ u.format = format;
+
+ switch (u.format)
+ {
+ case 1: return_trace (u.format1.serialize (c, it));
+ case 2: return_trace (u.format2.serialize (c, it));
+ default:return_trace (false);
+ }
+ }
+
+ bool subset (hb_subset_context_t *c,
+ hb_map_t *klass_map = nullptr /*OUT*/) const
+ {
+ TRACE_SUBSET (this);
+ switch (u.format) {
+ case 1: return_trace (u.format1.subset (c, klass_map));
+ case 2: return_trace (u.format2.subset (c, klass_map));
+ default:return_trace (false);
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!u.format.sanitize (c)) return_trace (false);
+ switch (u.format) {
+ case 1: return_trace (u.format1.sanitize (c));
+ case 2: return_trace (u.format2.sanitize (c));
+ default:return_trace (true);
+ }
+ }
+
+ /* Might return false if array looks unsorted.
+ * Used for faster rejection of corrupt data. */
+ template <typename set_t>
+ bool add_coverage (set_t *glyphs) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.add_coverage (glyphs);
+ case 2: return u.format2.add_coverage (glyphs);
+ default:return false;
+ }
+ }
+
+ /* Might return false if array looks unsorted.
+ * Used for faster rejection of corrupt data. */
+ template <typename set_t>
+ bool add_class (set_t *glyphs, unsigned int klass) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.add_class (glyphs, klass);
+ case 2: return u.format2.add_class (glyphs, klass);
+ default:return false;
+ }
+ }
+
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.intersects (glyphs);
+ case 2: return u.format2.intersects (glyphs);
+ default:return false;
+ }
+ }
+ bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.intersects_class (glyphs, klass);
+ case 2: return u.format2.intersects_class (glyphs, klass);
+ default:return false;
+ }
+ }
+
+ protected:
+ union {
+ HBUINT16 format; /* Format identifier */
+ ClassDefFormat1 format1;
+ ClassDefFormat2 format2;
+ } u;
+ public:
+ DEFINE_SIZE_UNION (2, format);
+};
+
+template<typename Iterator>
+static inline void ClassDef_serialize (hb_serialize_context_t *c,
+ Iterator it)
+{ c->start_embed<ClassDef> ()->serialize (c, it); }
+
+
+/*
+ * Item Variation Store
+ */
+
+struct VarRegionAxis
+{
+ float evaluate (int coord) const
+ {
+ int start = startCoord, peak = peakCoord, end = endCoord;
+
+ /* TODO Move these to sanitize(). */
+ if (unlikely (start > peak || peak > end))
+ return 1.;
+ if (unlikely (start < 0 && end > 0 && peak != 0))
+ return 1.;
+
+ if (peak == 0 || coord == peak)
+ return 1.;
+
+ if (coord <= start || end <= coord)
+ return 0.;
+
+ /* Interpolate */
+ if (coord < peak)
+ return float (coord - start) / (peak - start);
+ else
+ return float (end - coord) / (end - peak);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ /* TODO Handle invalid start/peak/end configs, so we don't
+ * have to do that at runtime. */
+ }
+
+ public:
+ F2DOT14 startCoord;
+ F2DOT14 peakCoord;
+ F2DOT14 endCoord;
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+struct VarRegionList
+{
+ float evaluate (unsigned int region_index,
+ const int *coords, unsigned int coord_len) const
+ {
+ if (unlikely (region_index >= regionCount))
+ return 0.;
+
+ const VarRegionAxis *axes = axesZ.arrayZ + (region_index * axisCount);
+
+ float v = 1.;
+ unsigned int count = axisCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ int coord = i < coord_len ? coords[i] : 0;
+ float factor = axes[i].evaluate (coord);
+ if (factor == 0.f)
+ return 0.;
+ v *= factor;
+ }
+ return v;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ axesZ.sanitize (c, (unsigned int) axisCount * (unsigned int) regionCount));
+ }
+
+ bool serialize (hb_serialize_context_t *c, const VarRegionList *src, const hb_bimap_t &region_map)
+ {
+ TRACE_SERIALIZE (this);
+ VarRegionList *out = c->allocate_min<VarRegionList> ();
+ if (unlikely (!out)) return_trace (false);
+ axisCount = src->axisCount;
+ regionCount = region_map.get_population ();
+ if (unlikely (!c->allocate_size<VarRegionList> (get_size () - min_size))) return_trace (false);
+ for (unsigned int r = 0; r < regionCount; r++)
+ memcpy (&axesZ[axisCount * r], &src->axesZ[axisCount * region_map.backward (r)], VarRegionAxis::static_size * axisCount);
+
+ return_trace (true);
+ }
+
+ unsigned int get_size () const { return min_size + VarRegionAxis::static_size * axisCount * regionCount; }
+ unsigned int get_region_count () const { return regionCount; }
+
+ protected:
+ HBUINT16 axisCount;
+ HBUINT16 regionCount;
+ UnsizedArrayOf<VarRegionAxis>
+ axesZ;
+ public:
+ DEFINE_SIZE_ARRAY (4, axesZ);
+};
+
+struct VarData
+{
+ unsigned int get_region_index_count () const
+ { return regionIndices.len; }
+
+ unsigned int get_row_size () const
+ { return shortCount + regionIndices.len; }
+
+ unsigned int get_size () const
+ { return itemCount * get_row_size (); }
+
+ float get_delta (unsigned int inner,
+ const int *coords, unsigned int coord_count,
+ const VarRegionList &regions) const
+ {
+ if (unlikely (inner >= itemCount))
+ return 0.;
+
+ unsigned int count = regionIndices.len;
+ unsigned int scount = shortCount;
+
+ const HBUINT8 *bytes = get_delta_bytes ();
+ const HBUINT8 *row = bytes + inner * (scount + count);
+
+ float delta = 0.;
+ unsigned int i = 0;
+
+ const HBINT16 *scursor = reinterpret_cast<const HBINT16 *> (row);
+ for (; i < scount; i++)
+ {
+ float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count);
+ delta += scalar * *scursor++;
+ }
+ const HBINT8 *bcursor = reinterpret_cast<const HBINT8 *> (scursor);
+ for (; i < count; i++)
+ {
+ float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count);
+ delta += scalar * *bcursor++;
+ }
+
+ return delta;
+ }
+
+ void get_scalars (int *coords, unsigned int coord_count,
+ const VarRegionList &regions,
+ float *scalars /*OUT */,
+ unsigned int num_scalars) const
+ {
+ unsigned count = hb_min (num_scalars, regionIndices.len);
+ for (unsigned int i = 0; i < count; i++)
+ scalars[i] = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count);
+ for (unsigned int i = count; i < num_scalars; i++)
+ scalars[i] = 0.f;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ regionIndices.sanitize (c) &&
+ shortCount <= regionIndices.len &&
+ c->check_range (get_delta_bytes (),
+ itemCount,
+ get_row_size ()));
+ }
+
+ bool serialize (hb_serialize_context_t *c,
+ const VarData *src,
+ const hb_inc_bimap_t &inner_map,
+ const hb_bimap_t &region_map)
+ {
+ TRACE_SERIALIZE (this);
+ if (unlikely (!c->extend_min (*this))) return_trace (false);
+ itemCount = inner_map.get_next_value ();
+
+ /* Optimize short count */
+ unsigned short ri_count = src->regionIndices.len;
+ enum delta_size_t { kZero=0, kByte, kShort };
+ hb_vector_t<delta_size_t> delta_sz;
+ hb_vector_t<unsigned int> ri_map; /* maps old index to new index */
+ delta_sz.resize (ri_count);
+ ri_map.resize (ri_count);
+ unsigned int new_short_count = 0;
+ unsigned int r;
+ for (r = 0; r < ri_count; r++)
+ {
+ delta_sz[r] = kZero;
+ for (unsigned int i = 0; i < inner_map.get_next_value (); i++)
+ {
+ unsigned int old = inner_map.backward (i);
+ int16_t delta = src->get_item_delta (old, r);
+ if (delta < -128 || 127 < delta)
+ {
+ delta_sz[r] = kShort;
+ new_short_count++;
+ break;
+ }
+ else if (delta != 0)
+ delta_sz[r] = kByte;
+ }
+ }
+ unsigned int short_index = 0;
+ unsigned int byte_index = new_short_count;
+ unsigned int new_ri_count = 0;
+ for (r = 0; r < ri_count; r++)
+ if (delta_sz[r])
+ {
+ ri_map[r] = (delta_sz[r] == kShort)? short_index++ : byte_index++;
+ new_ri_count++;
+ }
+
+ shortCount = new_short_count;
+ regionIndices.len = new_ri_count;
+
+ unsigned int size = regionIndices.get_size () - HBUINT16::static_size/*regionIndices.len*/ + (get_row_size () * itemCount);
+ if (unlikely (!c->allocate_size<HBUINT8> (size)))
+ return_trace (false);
+
+ for (r = 0; r < ri_count; r++)
+ if (delta_sz[r]) regionIndices[ri_map[r]] = region_map[src->regionIndices[r]];
+
+ for (unsigned int i = 0; i < itemCount; i++)
+ {
+ unsigned int old = inner_map.backward (i);
+ for (unsigned int r = 0; r < ri_count; r++)
+ if (delta_sz[r]) set_item_delta (i, ri_map[r], src->get_item_delta (old, r));
+ }
+
+ return_trace (true);
+ }
+
+ void collect_region_refs (hb_inc_bimap_t &region_map, const hb_inc_bimap_t &inner_map) const
+ {
+ for (unsigned int r = 0; r < regionIndices.len; r++)
+ {
+ unsigned int region = regionIndices[r];
+ if (region_map.has (region)) continue;
+ for (unsigned int i = 0; i < inner_map.get_next_value (); i++)
+ if (get_item_delta (inner_map.backward (i), r) != 0)
+ {
+ region_map.add (region);
+ break;
+ }
+ }
+ }
+
+ protected:
+ const HBUINT8 *get_delta_bytes () const
+ { return &StructAfter<HBUINT8> (regionIndices); }
+
+ HBUINT8 *get_delta_bytes ()
+ { return &StructAfter<HBUINT8> (regionIndices); }
+
+ int16_t get_item_delta (unsigned int item, unsigned int region) const
+ {
+ if ( item >= itemCount || unlikely (region >= regionIndices.len)) return 0;
+ const HBINT8 *p = (const HBINT8 *)get_delta_bytes () + item * get_row_size ();
+ if (region < shortCount)
+ return ((const HBINT16 *)p)[region];
+ else
+ return (p + HBINT16::static_size * shortCount)[region - shortCount];
+ }
+
+ void set_item_delta (unsigned int item, unsigned int region, int16_t delta)
+ {
+ HBINT8 *p = (HBINT8 *)get_delta_bytes () + item * get_row_size ();
+ if (region < shortCount)
+ ((HBINT16 *)p)[region] = delta;
+ else
+ (p + HBINT16::static_size * shortCount)[region - shortCount] = delta;
+ }
+
+ protected:
+ HBUINT16 itemCount;
+ HBUINT16 shortCount;
+ ArrayOf<HBUINT16> regionIndices;
+/*UnsizedArrayOf<HBUINT8>bytesX;*/
+ public:
+ DEFINE_SIZE_ARRAY (6, regionIndices);
+};
+
+struct VariationStore
+{
+ float get_delta (unsigned int outer, unsigned int inner,
+ const int *coords, unsigned int coord_count) const
+ {
+#ifdef HB_NO_VAR
+ return 0.f;
+#endif
+
+ if (unlikely (outer >= dataSets.len))
+ return 0.f;
+
+ return (this+dataSets[outer]).get_delta (inner,
+ coords, coord_count,
+ this+regions);
+ }
+
+ float get_delta (unsigned int index,
+ const int *coords, unsigned int coord_count) const
+ {
+ unsigned int outer = index >> 16;
+ unsigned int inner = index & 0xFFFF;
+ return get_delta (outer, inner, coords, coord_count);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+#ifdef HB_NO_VAR
+ return true;
+#endif
+
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ format == 1 &&
+ regions.sanitize (c, this) &&
+ dataSets.sanitize (c, this));
+ }
+
+ bool serialize (hb_serialize_context_t *c,
+ const VariationStore *src,
+ const hb_array_t <hb_inc_bimap_t> &inner_maps)
+ {
+ TRACE_SERIALIZE (this);
+ unsigned int set_count = 0;
+ for (unsigned int i = 0; i < inner_maps.length; i++)
+ if (inner_maps[i].get_population () > 0) set_count++;
+
+ unsigned int size = min_size + HBUINT32::static_size * set_count;
+ if (unlikely (!c->allocate_size<HBUINT32> (size))) return_trace (false);
+ format = 1;
+
+ hb_inc_bimap_t region_map;
+ for (unsigned int i = 0; i < inner_maps.length; i++)
+ (src+src->dataSets[i]).collect_region_refs (region_map, inner_maps[i]);
+ region_map.sort ();
+
+ if (unlikely (!regions.serialize (c, this)
+ .serialize (c, &(src+src->regions), region_map))) return_trace (false);
+
+ /* TODO: The following code could be simplified when
+ * OffsetListOf::subset () can take a custom param to be passed to VarData::serialize ()
+ */
+ dataSets.len = set_count;
+ unsigned int set_index = 0;
+ for (unsigned int i = 0; i < inner_maps.length; i++)
+ {
+ if (inner_maps[i].get_population () == 0) continue;
+ if (unlikely (!dataSets[set_index++].serialize (c, this)
+ .serialize (c, &(src+src->dataSets[i]), inner_maps[i], region_map)))
+ return_trace (false);
+ }
+
+ return_trace (true);
+ }
+
+ unsigned int get_region_index_count (unsigned int ivs) const
+ { return (this+dataSets[ivs]).get_region_index_count (); }
+
+ void get_scalars (unsigned int ivs,
+ int *coords, unsigned int coord_count,
+ float *scalars /*OUT*/,
+ unsigned int num_scalars) const
+ {
+#ifdef HB_NO_VAR
+ for (unsigned i = 0; i < num_scalars; i++)
+ scalars[i] = 0.f;
+ return;
+#endif
+
+ (this+dataSets[ivs]).get_scalars (coords, coord_count, this+regions,
+ &scalars[0], num_scalars);
+ }
+
+ unsigned int get_sub_table_count () const { return dataSets.len; }
+
+ protected:
+ HBUINT16 format;
+ LOffsetTo<VarRegionList> regions;
+ LOffsetArrayOf<VarData> dataSets;
+ public:
+ DEFINE_SIZE_ARRAY (8, dataSets);
+};
+
+/*
+ * Feature Variations
+ */
+
+struct ConditionFormat1
+{
+ friend struct Condition;
+
+ private:
+ bool evaluate (const int *coords, unsigned int coord_len) const
+ {
+ int coord = axisIndex < coord_len ? coords[axisIndex] : 0;
+ return filterRangeMinValue <= coord && coord <= filterRangeMaxValue;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 axisIndex;
+ F2DOT14 filterRangeMinValue;
+ F2DOT14 filterRangeMaxValue;
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+struct Condition
+{
+ bool evaluate (const int *coords, unsigned int coord_len) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.evaluate (coords, coord_len);
+ default:return false;
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!u.format.sanitize (c)) return_trace (false);
+ switch (u.format) {
+ case 1: return_trace (u.format1.sanitize (c));
+ default:return_trace (true);
+ }
+ }
+
+ protected:
+ union {
+ HBUINT16 format; /* Format identifier */
+ ConditionFormat1 format1;
+ } u;
+ public:
+ DEFINE_SIZE_UNION (2, format);
+};
+
+struct ConditionSet
+{
+ bool evaluate (const int *coords, unsigned int coord_len) const
+ {
+ unsigned int count = conditions.len;
+ for (unsigned int i = 0; i < count; i++)
+ if (!(this+conditions.arrayZ[i]).evaluate (coords, coord_len))
+ return false;
+ return true;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (conditions.sanitize (c, this));
+ }
+
+ protected:
+ LOffsetArrayOf<Condition> conditions;
+ public:
+ DEFINE_SIZE_ARRAY (2, conditions);
+};
+
+struct FeatureTableSubstitutionRecord
+{
+ friend struct FeatureTableSubstitution;
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && feature.sanitize (c, base));
+ }
+
+ protected:
+ HBUINT16 featureIndex;
+ LOffsetTo<Feature> feature;
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+struct FeatureTableSubstitution
+{
+ const Feature *find_substitute (unsigned int feature_index) const
+ {
+ unsigned int count = substitutions.len;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ const FeatureTableSubstitutionRecord &record = substitutions.arrayZ[i];
+ if (record.featureIndex == feature_index)
+ return &(this+record.feature);
+ }
+ return nullptr;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (version.sanitize (c) &&
+ likely (version.major == 1) &&
+ substitutions.sanitize (c, this));
+ }
+
+ protected:
+ FixedVersion<> version; /* Version--0x00010000u */
+ ArrayOf<FeatureTableSubstitutionRecord>
+ substitutions;
+ public:
+ DEFINE_SIZE_ARRAY (6, substitutions);
+};
+
+struct FeatureVariationRecord
+{
+ friend struct FeatureVariations;
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (conditions.sanitize (c, base) &&
+ substitutions.sanitize (c, base));
+ }
+
+ protected:
+ LOffsetTo<ConditionSet>
+ conditions;
+ LOffsetTo<FeatureTableSubstitution>
+ substitutions;
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+struct FeatureVariations
+{
+ static constexpr unsigned NOT_FOUND_INDEX = 0xFFFFFFFFu;
+
+ bool find_index (const int *coords, unsigned int coord_len,
+ unsigned int *index) const
+ {
+ unsigned int count = varRecords.len;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ const FeatureVariationRecord &record = varRecords.arrayZ[i];
+ if ((this+record.conditions).evaluate (coords, coord_len))
+ {
+ *index = i;
+ return true;
+ }
+ }
+ *index = NOT_FOUND_INDEX;
+ return false;
+ }
+
+ const Feature *find_substitute (unsigned int variations_index,
+ unsigned int feature_index) const
+ {
+ const FeatureVariationRecord &record = varRecords[variations_index];
+ return (this+record.substitutions).find_substitute (feature_index);
+ }
+
+ FeatureVariations* copy (hb_serialize_context_t *c) const
+ {
+ TRACE_SERIALIZE (this);
+ return_trace (c->embed (*this));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (version.sanitize (c) &&
+ likely (version.major == 1) &&
+ varRecords.sanitize (c, this));
+ }
+
+ protected:
+ FixedVersion<> version; /* Version--0x00010000u */
+ LArrayOf<FeatureVariationRecord>
+ varRecords;
+ public:
+ DEFINE_SIZE_ARRAY_SIZED (8, varRecords);
+};
+
+
+/*
+ * Device Tables
+ */
+
+struct HintingDevice
+{
+ friend struct Device;
+
+ private:
+
+ hb_position_t get_x_delta (hb_font_t *font) const
+ { return get_delta (font->x_ppem, font->x_scale); }
+
+ hb_position_t get_y_delta (hb_font_t *font) const
+ { return get_delta (font->y_ppem, font->y_scale); }
+
+ public:
+
+ unsigned int get_size () const
+ {
+ unsigned int f = deltaFormat;
+ if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * HBUINT16::static_size;
+ return HBUINT16::static_size * (4 + ((endSize - startSize) >> (4 - f)));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && c->check_range (this, this->get_size ()));
+ }
+
+ HintingDevice* copy (hb_serialize_context_t *c) const
+ {
+ TRACE_SERIALIZE (this);
+ return_trace (c->embed<HintingDevice> (this));
+ }
+
+ private:
+
+ int get_delta (unsigned int ppem, int scale) const
+ {
+ if (!ppem) return 0;
+
+ int pixels = get_delta_pixels (ppem);
+
+ if (!pixels) return 0;
+
+ return (int) (pixels * (int64_t) scale / ppem);
+ }
+ int get_delta_pixels (unsigned int ppem_size) const
+ {
+ unsigned int f = deltaFormat;
+ if (unlikely (f < 1 || f > 3))
+ return 0;
+
+ if (ppem_size < startSize || ppem_size > endSize)
+ return 0;
+
+ unsigned int s = ppem_size - startSize;
+
+ unsigned int byte = deltaValueZ[s >> (4 - f)];
+ unsigned int bits = (byte >> (16 - (((s & ((1 << (4 - f)) - 1)) + 1) << f)));
+ unsigned int mask = (0xFFFFu >> (16 - (1 << f)));
+
+ int delta = bits & mask;
+
+ if ((unsigned int) delta >= ((mask + 1) >> 1))
+ delta -= mask + 1;
+
+ return delta;
+ }
+
+ protected:
+ HBUINT16 startSize; /* Smallest size to correct--in ppem */
+ HBUINT16 endSize; /* Largest size to correct--in ppem */
+ HBUINT16 deltaFormat; /* Format of DeltaValue array data: 1, 2, or 3
+ * 1 Signed 2-bit value, 8 values per uint16
+ * 2 Signed 4-bit value, 4 values per uint16
+ * 3 Signed 8-bit value, 2 values per uint16
+ */
+ UnsizedArrayOf<HBUINT16>
+ deltaValueZ; /* Array of compressed data */
+ public:
+ DEFINE_SIZE_ARRAY (6, deltaValueZ);
+};
+
+struct VariationDevice
+{
+ friend struct Device;
+
+ private:
+
+ hb_position_t get_x_delta (hb_font_t *font, const VariationStore &store) const
+ { return font->em_scalef_x (get_delta (font, store)); }
+
+ hb_position_t get_y_delta (hb_font_t *font, const VariationStore &store) const
+ { return font->em_scalef_y (get_delta (font, store)); }
+
+ VariationDevice* copy (hb_serialize_context_t *c) const
+ {
+ TRACE_SERIALIZE (this);
+ return_trace (c->embed<VariationDevice> (this));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ private:
+
+ float get_delta (hb_font_t *font, const VariationStore &store) const
+ {
+ return store.get_delta (outerIndex, innerIndex, font->coords, font->num_coords);
+ }
+
+ protected:
+ HBUINT16 outerIndex;
+ HBUINT16 innerIndex;
+ HBUINT16 deltaFormat; /* Format identifier for this table: 0x0x8000 */
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+struct DeviceHeader
+{
+ protected:
+ HBUINT16 reserved1;
+ HBUINT16 reserved2;
+ public:
+ HBUINT16 format; /* Format identifier */
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+struct Device
+{
+ hb_position_t get_x_delta (hb_font_t *font, const VariationStore &store=Null (VariationStore)) const
+ {
+ switch (u.b.format)
+ {
+#ifndef HB_NO_HINTING
+ case 1: case 2: case 3:
+ return u.hinting.get_x_delta (font);
+#endif
+#ifndef HB_NO_VAR
+ case 0x8000:
+ return u.variation.get_x_delta (font, store);
+#endif
+ default:
+ return 0;
+ }
+ }
+ hb_position_t get_y_delta (hb_font_t *font, const VariationStore &store=Null (VariationStore)) const
+ {
+ switch (u.b.format)
+ {
+ case 1: case 2: case 3:
+#ifndef HB_NO_HINTING
+ return u.hinting.get_y_delta (font);
+#endif
+#ifndef HB_NO_VAR
+ case 0x8000:
+ return u.variation.get_y_delta (font, store);
+#endif
+ default:
+ return 0;
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!u.b.format.sanitize (c)) return_trace (false);
+ switch (u.b.format) {
+#ifndef HB_NO_HINTING
+ case 1: case 2: case 3:
+ return_trace (u.hinting.sanitize (c));
+#endif
+#ifndef HB_NO_VAR
+ case 0x8000:
+ return_trace (u.variation.sanitize (c));
+#endif
+ default:
+ return_trace (true);
+ }
+ }
+
+ Device* copy (hb_serialize_context_t *c) const
+ {
+ TRACE_SERIALIZE (this);
+ switch (u.b.format) {
+#ifndef HB_NO_HINTING
+ case 1:
+ case 2:
+ case 3:
+ return_trace (reinterpret_cast<Device *> (u.hinting.copy (c)));
+#endif
+#ifndef HB_NO_VAR
+ case 0x8000:
+ return_trace (reinterpret_cast<Device *> (u.variation.copy (c)));
+#endif
+ default:
+ return_trace (nullptr);
+ }
+ }
+
+ protected:
+ union {
+ DeviceHeader b;
+ HintingDevice hinting;
+#ifndef HB_NO_VAR
+ VariationDevice variation;
+#endif
+ } u;
+ public:
+ DEFINE_SIZE_UNION (6, b);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_COMMON_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gdef-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gdef-table.hh
index eed46dd672..dc751d88ea 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gdef-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gdef-table.hh
@@ -29,9 +29,9 @@
#ifndef HB_OT_LAYOUT_GDEF_TABLE_HH
#define HB_OT_LAYOUT_GDEF_TABLE_HH
-#include "hb-ot-layout-common-private.hh"
+#include "hb-ot-layout-common.hh"
-#include "hb-font-private.hh"
+#include "hb-font.hh"
namespace OT {
@@ -41,15 +41,15 @@ namespace OT {
* Attachment List Table
*/
-typedef ArrayOf<UINT16> AttachPoint; /* Array of contour point indices--in
+typedef ArrayOf<HBUINT16> AttachPoint; /* Array of contour point indices--in
* increasing numerical order */
struct AttachList
{
- inline unsigned int get_attach_points (hb_codepoint_t glyph_id,
- unsigned int start_offset,
- unsigned int *point_count /* IN/OUT */,
- unsigned int *point_array /* OUT */) const
+ unsigned int get_attach_points (hb_codepoint_t glyph_id,
+ unsigned int start_offset,
+ unsigned int *point_count /* IN/OUT */,
+ unsigned int *point_array /* OUT */) const
{
unsigned int index = (this+coverage).get_coverage (glyph_id);
if (index == NOT_COVERED)
@@ -61,9 +61,10 @@ struct AttachList
const AttachPoint &points = this+attachPoint[index];
- if (point_count) {
- const UINT16 *array = points.sub_array (start_offset, point_count);
- unsigned int count = *point_count;
+ if (point_count)
+ {
+ hb_array_t<const HBUINT16> array = points.sub_array (start_offset, point_count);
+ unsigned int count = array.length;
for (unsigned int i = 0; i < count; i++)
point_array[i] = array[i];
}
@@ -71,7 +72,7 @@ struct AttachList
return points.len;
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && attachPoint.sanitize (c, this));
@@ -97,20 +98,20 @@ struct CaretValueFormat1
friend struct CaretValue;
private:
- inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction) const
+ hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction) const
{
return HB_DIRECTION_IS_HORIZONTAL (direction) ? font->em_scale_x (coordinate) : font->em_scale_y (coordinate);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
protected:
- UINT16 caretValueFormat; /* Format identifier--format = 1 */
- INT16 coordinate; /* X or Y value, in design units */
+ HBUINT16 caretValueFormat; /* Format identifier--format = 1 */
+ FWORD coordinate; /* X or Y value, in design units */
public:
DEFINE_SIZE_STATIC (4);
};
@@ -120,24 +121,22 @@ struct CaretValueFormat2
friend struct CaretValue;
private:
- inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id) const
+ hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id) const
{
hb_position_t x, y;
- if (font->get_glyph_contour_point_for_origin (glyph_id, caretValuePoint, direction, &x, &y))
- return HB_DIRECTION_IS_HORIZONTAL (direction) ? x : y;
- else
- return 0;
+ font->get_glyph_contour_point_for_origin (glyph_id, caretValuePoint, direction, &x, &y);
+ return HB_DIRECTION_IS_HORIZONTAL (direction) ? x : y;
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
protected:
- UINT16 caretValueFormat; /* Format identifier--format = 2 */
- UINT16 caretValuePoint; /* Contour point index on glyph */
+ HBUINT16 caretValueFormat; /* Format identifier--format = 2 */
+ HBUINT16 caretValuePoint; /* Contour point index on glyph */
public:
DEFINE_SIZE_STATIC (4);
};
@@ -146,22 +145,23 @@ struct CaretValueFormat3
{
friend struct CaretValue;
- inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, const VariationStore &var_store) const
+ hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction,
+ const VariationStore &var_store) const
{
return HB_DIRECTION_IS_HORIZONTAL (direction) ?
- font->em_scale_x (coordinate) + (this+deviceTable).get_x_delta (font, var_store) :
- font->em_scale_y (coordinate) + (this+deviceTable).get_y_delta (font, var_store);
+ font->em_scale_x (coordinate) + (this+deviceTable).get_x_delta (font, var_store) :
+ font->em_scale_y (coordinate) + (this+deviceTable).get_y_delta (font, var_store);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) && deviceTable.sanitize (c, this));
}
protected:
- UINT16 caretValueFormat; /* Format identifier--format = 3 */
- INT16 coordinate; /* X or Y value, in design units */
+ HBUINT16 caretValueFormat; /* Format identifier--format = 3 */
+ FWORD coordinate; /* X or Y value, in design units */
OffsetTo<Device>
deviceTable; /* Offset to Device table for X or Y
* value--from beginning of CaretValue
@@ -172,7 +172,7 @@ struct CaretValueFormat3
struct CaretValue
{
- inline hb_position_t get_caret_value (hb_font_t *font,
+ hb_position_t get_caret_value (hb_font_t *font,
hb_direction_t direction,
hb_codepoint_t glyph_id,
const VariationStore &var_store) const
@@ -185,7 +185,7 @@ struct CaretValue
}
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
if (!u.format.sanitize (c)) return_trace (false);
@@ -199,7 +199,7 @@ struct CaretValue
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
CaretValueFormat1 format1;
CaretValueFormat2 format2;
CaretValueFormat3 format3;
@@ -210,17 +210,18 @@ struct CaretValue
struct LigGlyph
{
- inline unsigned int get_lig_carets (hb_font_t *font,
- hb_direction_t direction,
- hb_codepoint_t glyph_id,
- const VariationStore &var_store,
- unsigned int start_offset,
- unsigned int *caret_count /* IN/OUT */,
- hb_position_t *caret_array /* OUT */) const
+ unsigned int get_lig_carets (hb_font_t *font,
+ hb_direction_t direction,
+ hb_codepoint_t glyph_id,
+ const VariationStore &var_store,
+ unsigned int start_offset,
+ unsigned int *caret_count /* IN/OUT */,
+ hb_position_t *caret_array /* OUT */) const
{
- if (caret_count) {
- const OffsetTo<CaretValue> *array = carets.sub_array (start_offset, caret_count);
- unsigned int count = *caret_count;
+ if (caret_count)
+ {
+ hb_array_t <const OffsetTo<CaretValue>> array = carets.sub_array (start_offset, caret_count);
+ unsigned int count = array.length;
for (unsigned int i = 0; i < count; i++)
caret_array[i] = (this+array[i]).get_caret_value (font, direction, glyph_id, var_store);
}
@@ -228,7 +229,7 @@ struct LigGlyph
return carets.len;
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (carets.sanitize (c, this));
@@ -245,13 +246,13 @@ struct LigGlyph
struct LigCaretList
{
- inline unsigned int get_lig_carets (hb_font_t *font,
- hb_direction_t direction,
- hb_codepoint_t glyph_id,
- const VariationStore &var_store,
- unsigned int start_offset,
- unsigned int *caret_count /* IN/OUT */,
- hb_position_t *caret_array /* OUT */) const
+ unsigned int get_lig_carets (hb_font_t *font,
+ hb_direction_t direction,
+ hb_codepoint_t glyph_id,
+ const VariationStore &var_store,
+ unsigned int start_offset,
+ unsigned int *caret_count /* IN/OUT */,
+ hb_position_t *caret_array /* OUT */) const
{
unsigned int index = (this+coverage).get_coverage (glyph_id);
if (index == NOT_COVERED)
@@ -264,7 +265,7 @@ struct LigCaretList
return lig_glyph.get_lig_carets (font, direction, glyph_id, var_store, start_offset, caret_count, caret_array);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && ligGlyph.sanitize (c, this));
@@ -284,18 +285,18 @@ struct LigCaretList
struct MarkGlyphSetsFormat1
{
- inline bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
+ bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
{ return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; }
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this));
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
- ArrayOf<LOffsetTo<Coverage> >
+ HBUINT16 format; /* Format identifier--format = 1 */
+ ArrayOf<LOffsetTo<Coverage>>
coverage; /* Array of long offsets to mark set
* coverage tables */
public:
@@ -304,7 +305,7 @@ struct MarkGlyphSetsFormat1
struct MarkGlyphSets
{
- inline bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
+ bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
{
switch (u.format) {
case 1: return u.format1.covers (set_index, glyph_id);
@@ -312,7 +313,7 @@ struct MarkGlyphSets
}
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
if (!u.format.sanitize (c)) return_trace (false);
@@ -324,7 +325,7 @@ struct MarkGlyphSets
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
MarkGlyphSetsFormat1 format1;
} u;
public:
@@ -333,12 +334,14 @@ struct MarkGlyphSets
/*
- * GDEF -- The Glyph Definition Table
+ * GDEF -- Glyph Definition
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/gdef
*/
+
struct GDEF
{
- static const hb_tag_t tableTag = HB_OT_TAG_GDEF;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_GDEF;
enum GlyphClasses {
UnclassifiedGlyph = 0,
@@ -348,59 +351,47 @@ struct GDEF
ComponentGlyph = 4
};
- inline bool has_glyph_classes (void) const { return glyphClassDef != 0; }
- inline unsigned int get_glyph_class (hb_codepoint_t glyph) const
+ bool has_data () const { return version.to_int (); }
+ bool has_glyph_classes () const { return glyphClassDef != 0; }
+ unsigned int get_glyph_class (hb_codepoint_t glyph) const
{ return (this+glyphClassDef).get_class (glyph); }
- inline void get_glyphs_in_class (unsigned int klass, hb_set_t *glyphs) const
+ void get_glyphs_in_class (unsigned int klass, hb_set_t *glyphs) const
{ (this+glyphClassDef).add_class (glyphs, klass); }
- inline bool has_mark_attachment_types (void) const { return markAttachClassDef != 0; }
- inline unsigned int get_mark_attachment_type (hb_codepoint_t glyph) const
+ bool has_mark_attachment_types () const { return markAttachClassDef != 0; }
+ unsigned int get_mark_attachment_type (hb_codepoint_t glyph) const
{ return (this+markAttachClassDef).get_class (glyph); }
- inline bool has_attach_points (void) const { return attachList != 0; }
- inline unsigned int get_attach_points (hb_codepoint_t glyph_id,
- unsigned int start_offset,
- unsigned int *point_count /* IN/OUT */,
- unsigned int *point_array /* OUT */) const
+ bool has_attach_points () const { return attachList != 0; }
+ unsigned int get_attach_points (hb_codepoint_t glyph_id,
+ unsigned int start_offset,
+ unsigned int *point_count /* IN/OUT */,
+ unsigned int *point_array /* OUT */) const
{ return (this+attachList).get_attach_points (glyph_id, start_offset, point_count, point_array); }
- inline bool has_lig_carets (void) const { return ligCaretList != 0; }
- inline unsigned int get_lig_carets (hb_font_t *font,
- hb_direction_t direction,
- hb_codepoint_t glyph_id,
- unsigned int start_offset,
- unsigned int *caret_count /* IN/OUT */,
- hb_position_t *caret_array /* OUT */) const
+ bool has_lig_carets () const { return ligCaretList != 0; }
+ unsigned int get_lig_carets (hb_font_t *font,
+ hb_direction_t direction,
+ hb_codepoint_t glyph_id,
+ unsigned int start_offset,
+ unsigned int *caret_count /* IN/OUT */,
+ hb_position_t *caret_array /* OUT */) const
{ return (this+ligCaretList).get_lig_carets (font,
direction, glyph_id, get_var_store(),
start_offset, caret_count, caret_array); }
- inline bool has_mark_sets (void) const { return version.to_int () >= 0x00010002u && markGlyphSetsDef != 0; }
- inline bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const
+ bool has_mark_sets () const { return version.to_int () >= 0x00010002u && markGlyphSetsDef != 0; }
+ bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const
{ return version.to_int () >= 0x00010002u && (this+markGlyphSetsDef).covers (set_index, glyph_id); }
- inline bool has_var_store (void) const { return version.to_int () >= 0x00010003u && varStore != 0; }
- inline const VariationStore &get_var_store (void) const
+ bool has_var_store () const { return version.to_int () >= 0x00010003u && varStore != 0; }
+ const VariationStore &get_var_store () const
{ return version.to_int () >= 0x00010003u ? this+varStore : Null(VariationStore); }
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (version.sanitize (c) &&
- likely (version.major == 1) &&
- glyphClassDef.sanitize (c, this) &&
- attachList.sanitize (c, this) &&
- ligCaretList.sanitize (c, this) &&
- markAttachClassDef.sanitize (c, this) &&
- (version.to_int () < 0x00010002u || markGlyphSetsDef.sanitize (c, this)) &&
- (version.to_int () < 0x00010003u || varStore.sanitize (c, this)));
- }
-
/* glyph_props is a 16-bit integer where the lower 8-bit have bits representing
- * glyph class and other bits, and high 8-bit gthe mark attachment type (if any).
+ * glyph class and other bits, and high 8-bit the mark attachment type (if any).
* Not to be confused with lookup_props which is very similar. */
- inline unsigned int get_glyph_props (hb_codepoint_t glyph) const
+ unsigned int get_glyph_props (hb_codepoint_t glyph) const
{
unsigned int klass = get_glyph_class (glyph);
@@ -418,6 +409,65 @@ struct GDEF
}
}
+ HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+ hb_face_t *face) const;
+
+ struct accelerator_t
+ {
+ void init (hb_face_t *face)
+ {
+ this->table = hb_sanitize_context_t().reference_table<GDEF> (face);
+ if (unlikely (this->table->is_blacklisted (this->table.get_blob (), face)))
+ {
+ hb_blob_destroy (this->table.get_blob ());
+ this->table = hb_blob_get_empty ();
+ }
+ }
+
+ void fini () { this->table.destroy (); }
+
+ hb_blob_ptr_t<GDEF> table;
+ };
+
+ unsigned int get_size () const
+ {
+ return min_size +
+ (version.to_int () >= 0x00010002u ? markGlyphSetsDef.static_size : 0) +
+ (version.to_int () >= 0x00010003u ? varStore.static_size : 0);
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ auto *out = c->serializer->embed (*this);
+ if (unlikely (!out)) return_trace (false);
+
+ out->glyphClassDef.serialize_subset (c, glyphClassDef, this, out);
+ out->attachList = 0;//TODO(subset) serialize_subset (c, attachList, this, out);
+ out->ligCaretList = 0;//TODO(subset) serialize_subset (c, ligCaretList, this, out);
+ out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this, out);
+
+ if (version.to_int () >= 0x00010002u)
+ out->markGlyphSetsDef = 0;// TODO(subset) serialize_subset (c, markGlyphSetsDef, this, out);
+
+ if (version.to_int () >= 0x00010003u)
+ out->varStore = 0;// TODO(subset) serialize_subset (c, varStore, this, out);
+
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (version.sanitize (c) &&
+ likely (version.major == 1) &&
+ glyphClassDef.sanitize (c, this) &&
+ attachList.sanitize (c, this) &&
+ ligCaretList.sanitize (c, this) &&
+ markAttachClassDef.sanitize (c, this) &&
+ (version.to_int () < 0x00010002u || markGlyphSetsDef.sanitize (c, this)) &&
+ (version.to_int () < 0x00010003u || varStore.sanitize (c, this)));
+ }
protected:
FixedVersion<>version; /* Version of the GDEF table--currently
@@ -452,6 +502,7 @@ struct GDEF
DEFINE_SIZE_MIN (12);
};
+struct GDEF_accelerator_t : GDEF::accelerator_t {};
} /* namespace OT */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh
index b344d793c7..024312d610 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh
@@ -29,7 +29,7 @@
#ifndef HB_OT_LAYOUT_GPOS_TABLE_HH
#define HB_OT_LAYOUT_GPOS_TABLE_HH
-#include "hb-ot-layout-gsubgpos-private.hh"
+#include "hb-ot-layout-gsubgpos.hh"
namespace OT {
@@ -51,11 +51,11 @@ enum attach_type_t {
/* Shared Tables: ValueRecord, Anchor Table, and MarkArray */
-typedef UINT16 Value;
+typedef HBUINT16 Value;
-typedef Value ValueRecord[VAR];
+typedef UnsizedArrayOf<Value> ValueRecord;
-struct ValueFormat : UINT16
+struct ValueFormat : HBUINT16
{
enum Flags {
xPlacement = 0x0001u, /* Includes horizontal adjustment for placement */
@@ -74,89 +74,89 @@ struct ValueFormat : UINT16
/* All fields are options. Only those available advance the value pointer. */
#if 0
- INT16 xPlacement; /* Horizontal adjustment for
+ HBINT16 xPlacement; /* Horizontal adjustment for
* placement--in design units */
- INT16 yPlacement; /* Vertical adjustment for
+ HBINT16 yPlacement; /* Vertical adjustment for
* placement--in design units */
- INT16 xAdvance; /* Horizontal adjustment for
+ HBINT16 xAdvance; /* Horizontal adjustment for
* advance--in design units (only used
* for horizontal writing) */
- INT16 yAdvance; /* Vertical adjustment for advance--in
+ HBINT16 yAdvance; /* Vertical adjustment for advance--in
* design units (only used for vertical
* writing) */
- Offset xPlaDevice; /* Offset to Device table for
+ OffsetTo<Device> xPlaDevice; /* Offset to Device table for
* horizontal placement--measured from
* beginning of PosTable (may be NULL) */
- Offset yPlaDevice; /* Offset to Device table for vertical
+ OffsetTo<Device> yPlaDevice; /* Offset to Device table for vertical
* placement--measured from beginning
* of PosTable (may be NULL) */
- Offset xAdvDevice; /* Offset to Device table for
+ OffsetTo<Device> xAdvDevice; /* Offset to Device table for
* horizontal advance--measured from
* beginning of PosTable (may be NULL) */
- Offset yAdvDevice; /* Offset to Device table for vertical
+ OffsetTo<Device> yAdvDevice; /* Offset to Device table for vertical
* advance--measured from beginning of
* PosTable (may be NULL) */
#endif
- inline unsigned int get_len (void) const
- { return _hb_popcount32 ((unsigned int) *this); }
- inline unsigned int get_size (void) const
- { return get_len () * Value::static_size; }
+ unsigned int get_len () const { return hb_popcount ((unsigned int) *this); }
+ unsigned int get_size () const { return get_len () * Value::static_size; }
- void apply_value (hb_apply_context_t *c,
- const void *base,
- const Value *values,
- hb_glyph_position_t &glyph_pos) const
+ bool apply_value (hb_ot_apply_context_t *c,
+ const void *base,
+ const Value *values,
+ hb_glyph_position_t &glyph_pos) const
{
+ bool ret = false;
unsigned int format = *this;
- if (!format) return;
+ if (!format) return ret;
hb_font_t *font = c->font;
- hb_bool_t horizontal = HB_DIRECTION_IS_HORIZONTAL (c->direction);
+ bool horizontal = HB_DIRECTION_IS_HORIZONTAL (c->direction);
- if (format & xPlacement) glyph_pos.x_offset += font->em_scale_x (get_short (values++));
- if (format & yPlacement) glyph_pos.y_offset += font->em_scale_y (get_short (values++));
+ if (format & xPlacement) glyph_pos.x_offset += font->em_scale_x (get_short (values++, &ret));
+ if (format & yPlacement) glyph_pos.y_offset += font->em_scale_y (get_short (values++, &ret));
if (format & xAdvance) {
- if (likely (horizontal)) glyph_pos.x_advance += font->em_scale_x (get_short (values));
+ if (likely (horizontal)) glyph_pos.x_advance += font->em_scale_x (get_short (values, &ret));
values++;
}
/* y_advance values grow downward but font-space grows upward, hence negation */
if (format & yAdvance) {
- if (unlikely (!horizontal)) glyph_pos.y_advance -= font->em_scale_y (get_short (values));
+ if (unlikely (!horizontal)) glyph_pos.y_advance -= font->em_scale_y (get_short (values, &ret));
values++;
}
- if (!has_device ()) return;
+ if (!has_device ()) return ret;
bool use_x_device = font->x_ppem || font->num_coords;
bool use_y_device = font->y_ppem || font->num_coords;
- if (!use_x_device && !use_y_device) return;
+ if (!use_x_device && !use_y_device) return ret;
const VariationStore &store = c->var_store;
/* pixel -> fractional pixel */
if (format & xPlaDevice) {
- if (use_x_device) glyph_pos.x_offset += (base + get_device (values)).get_x_delta (font, store);
+ if (use_x_device) glyph_pos.x_offset += (base + get_device (values, &ret)).get_x_delta (font, store);
values++;
}
if (format & yPlaDevice) {
- if (use_y_device) glyph_pos.y_offset += (base + get_device (values)).get_y_delta (font, store);
+ if (use_y_device) glyph_pos.y_offset += (base + get_device (values, &ret)).get_y_delta (font, store);
values++;
}
if (format & xAdvDevice) {
- if (horizontal && use_x_device) glyph_pos.x_advance += (base + get_device (values)).get_x_delta (font, store);
+ if (horizontal && use_x_device) glyph_pos.x_advance += (base + get_device (values, &ret)).get_x_delta (font, store);
values++;
}
if (format & yAdvDevice) {
/* y_advance values grow downward but font-space grows upward, hence negation */
- if (!horizontal && use_y_device) glyph_pos.y_advance -= (base + get_device (values)).get_y_delta (font, store);
+ if (!horizontal && use_y_device) glyph_pos.y_advance -= (base + get_device (values, &ret)).get_y_delta (font, store);
values++;
}
+ return ret;
}
private:
- inline bool sanitize_value_devices (hb_sanitize_context_t *c, const void *base, const Value *values) const
+ bool sanitize_value_devices (hb_sanitize_context_t *c, const void *base, const Value *values) const
{
unsigned int format = *this;
@@ -173,39 +173,46 @@ struct ValueFormat : UINT16
return true;
}
- static inline OffsetTo<Device>& get_device (Value* value)
- { return *CastP<OffsetTo<Device> > (value); }
- static inline const OffsetTo<Device>& get_device (const Value* value)
- { return *CastP<OffsetTo<Device> > (value); }
+ HB_INTERNAL static OffsetTo<Device>& get_device (Value* value)
+ { return *CastP<OffsetTo<Device>> (value); }
+ HB_INTERNAL static const OffsetTo<Device>& get_device (const Value* value, bool *worked=nullptr)
+ {
+ if (worked) *worked |= bool (*value);
+ return *CastP<OffsetTo<Device>> (value);
+ }
- static inline const INT16& get_short (const Value* value)
- { return *CastP<INT16> (value); }
+ HB_INTERNAL static const HBINT16& get_short (const Value* value, bool *worked=nullptr)
+ {
+ if (worked) *worked |= bool (*value);
+ return *CastP<HBINT16> (value);
+ }
public:
- inline bool has_device (void) const {
+ bool has_device () const
+ {
unsigned int format = *this;
return (format & devices) != 0;
}
- inline bool sanitize_value (hb_sanitize_context_t *c, const void *base, const Value *values) const
+ bool sanitize_value (hb_sanitize_context_t *c, const void *base, const Value *values) const
{
TRACE_SANITIZE (this);
return_trace (c->check_range (values, get_size ()) && (!has_device () || sanitize_value_devices (c, base, values)));
}
- inline bool sanitize_values (hb_sanitize_context_t *c, const void *base, const Value *values, unsigned int count) const
+ bool sanitize_values (hb_sanitize_context_t *c, const void *base, const Value *values, unsigned int count) const
{
TRACE_SANITIZE (this);
unsigned int len = get_len ();
- if (!c->check_array (values, get_size (), count)) return_trace (false);
+ if (!c->check_range (values, count, get_size ())) return_trace (false);
if (!has_device ()) return_trace (true);
for (unsigned int i = 0; i < count; i++) {
if (!sanitize_value_devices (c, base, values))
- return_trace (false);
+ return_trace (false);
values += len;
}
@@ -213,7 +220,7 @@ struct ValueFormat : UINT16
}
/* Just sanitize referenced Device tables. Doesn't check the values themselves. */
- inline bool sanitize_values_stride_unsafe (hb_sanitize_context_t *c, const void *base, const Value *values, unsigned int count, unsigned int stride) const
+ bool sanitize_values_stride_unsafe (hb_sanitize_context_t *c, const void *base, const Value *values, unsigned int count, unsigned int stride) const
{
TRACE_SANITIZE (this);
@@ -221,7 +228,7 @@ struct ValueFormat : UINT16
for (unsigned int i = 0; i < count; i++) {
if (!sanitize_value_devices (c, base, values))
- return_trace (false);
+ return_trace (false);
values += stride;
}
@@ -229,71 +236,95 @@ struct ValueFormat : UINT16
}
};
+template<typename Iterator>
+static inline void SinglePos_serialize (hb_serialize_context_t *c,
+ Iterator it,
+ ValueFormat valFormat);
+
struct AnchorFormat1
{
- inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
- hb_position_t *x, hb_position_t *y) const
+ void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
+ float *x, float *y) const
{
hb_font_t *font = c->font;
- *x = font->em_scale_x (xCoordinate);
- *y = font->em_scale_y (yCoordinate);
+ *x = font->em_fscale_x (xCoordinate);
+ *y = font->em_fscale_y (yCoordinate);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
+ AnchorFormat1* copy (hb_serialize_context_t *c) const
+ {
+ TRACE_SERIALIZE (this);
+ return_trace (c->embed<AnchorFormat1> (this));
+ }
+
protected:
- UINT16 format; /* Format identifier--format = 1 */
- INT16 xCoordinate; /* Horizontal value--in design units */
- INT16 yCoordinate; /* Vertical value--in design units */
+ HBUINT16 format; /* Format identifier--format = 1 */
+ FWORD xCoordinate; /* Horizontal value--in design units */
+ FWORD yCoordinate; /* Vertical value--in design units */
public:
DEFINE_SIZE_STATIC (6);
};
struct AnchorFormat2
{
- inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id,
- hb_position_t *x, hb_position_t *y) const
+ void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id,
+ float *x, float *y) const
{
hb_font_t *font = c->font;
+
+#ifdef HB_NO_HINTING
+ *x = font->em_fscale_x (xCoordinate);
+ *y = font->em_fscale_y (yCoordinate);
+ return;
+#endif
+
unsigned int x_ppem = font->x_ppem;
unsigned int y_ppem = font->y_ppem;
- hb_position_t cx, cy;
- hb_bool_t ret;
+ hb_position_t cx = 0, cy = 0;
+ bool ret;
ret = (x_ppem || y_ppem) &&
- font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy);
- *x = ret && x_ppem ? cx : font->em_scale_x (xCoordinate);
- *y = ret && y_ppem ? cy : font->em_scale_y (yCoordinate);
+ font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy);
+ *x = ret && x_ppem ? cx : font->em_fscale_x (xCoordinate);
+ *y = ret && y_ppem ? cy : font->em_fscale_y (yCoordinate);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
+ AnchorFormat2* copy (hb_serialize_context_t *c) const
+ {
+ TRACE_SERIALIZE (this);
+ return_trace (c->embed<AnchorFormat2> (this));
+ }
+
protected:
- UINT16 format; /* Format identifier--format = 2 */
- INT16 xCoordinate; /* Horizontal value--in design units */
- INT16 yCoordinate; /* Vertical value--in design units */
- UINT16 anchorPoint; /* Index to glyph contour point */
+ HBUINT16 format; /* Format identifier--format = 2 */
+ FWORD xCoordinate; /* Horizontal value--in design units */
+ FWORD yCoordinate; /* Vertical value--in design units */
+ HBUINT16 anchorPoint; /* Index to glyph contour point */
public:
DEFINE_SIZE_STATIC (8);
};
struct AnchorFormat3
{
- inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
- hb_position_t *x, hb_position_t *y) const
+ void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
+ float *x, float *y) const
{
hb_font_t *font = c->font;
- *x = font->em_scale_x (xCoordinate);
- *y = font->em_scale_y (yCoordinate);
+ *x = font->em_fscale_x (xCoordinate);
+ *y = font->em_fscale_y (yCoordinate);
if (font->x_ppem || font->num_coords)
*x += (this+xDeviceTable).get_x_delta (font, c->var_store);
@@ -301,16 +332,27 @@ struct AnchorFormat3
*y += (this+yDeviceTable).get_y_delta (font, c->var_store);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) && xDeviceTable.sanitize (c, this) && yDeviceTable.sanitize (c, this));
}
+ AnchorFormat3* copy (hb_serialize_context_t *c) const
+ {
+ TRACE_SERIALIZE (this);
+ auto *out = c->embed<AnchorFormat3> (this);
+ if (unlikely (!out)) return_trace (nullptr);
+
+ out->xDeviceTable.serialize_copy (c, xDeviceTable, this, out);
+ out->yDeviceTable.serialize_copy (c, yDeviceTable, this, out);
+ return_trace (out);
+ }
+
protected:
- UINT16 format; /* Format identifier--format = 3 */
- INT16 xCoordinate; /* Horizontal value--in design units */
- INT16 yCoordinate; /* Vertical value--in design units */
+ HBUINT16 format; /* Format identifier--format = 3 */
+ FWORD xCoordinate; /* Horizontal value--in design units */
+ FWORD yCoordinate; /* Vertical value--in design units */
OffsetTo<Device>
xDeviceTable; /* Offset to Device table for X
* coordinate-- from beginning of
@@ -325,19 +367,19 @@ struct AnchorFormat3
struct Anchor
{
- inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id,
- hb_position_t *x, hb_position_t *y) const
+ void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id,
+ float *x, float *y) const
{
*x = *y = 0;
switch (u.format) {
case 1: u.format1.get_anchor (c, glyph_id, x, y); return;
case 2: u.format2.get_anchor (c, glyph_id, x, y); return;
case 3: u.format3.get_anchor (c, glyph_id, x, y); return;
- default: return;
+ default: return;
}
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
if (!u.format.sanitize (c)) return_trace (false);
@@ -349,9 +391,20 @@ struct Anchor
}
}
+ Anchor* copy (hb_serialize_context_t *c) const
+ {
+ TRACE_SERIALIZE (this);
+ switch (u.format) {
+ case 1: return_trace (reinterpret_cast<Anchor *> (u.format1.copy (c)));
+ case 2: return_trace (reinterpret_cast<Anchor *> (u.format2.copy (c)));
+ case 3: return_trace (reinterpret_cast<Anchor *> (u.format3.copy (c)));
+ default:return_trace (nullptr);
+ }
+ }
+
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
AnchorFormat1 format1;
AnchorFormat2 format2;
AnchorFormat3 format3;
@@ -363,29 +416,31 @@ struct Anchor
struct AnchorMatrix
{
- inline const Anchor& get_anchor (unsigned int row, unsigned int col, unsigned int cols, bool *found) const {
+ const Anchor& get_anchor (unsigned int row, unsigned int col,
+ unsigned int cols, bool *found) const
+ {
*found = false;
if (unlikely (row >= rows || col >= cols)) return Null(Anchor);
*found = !matrixZ[row * cols + col].is_null ();
return this+matrixZ[row * cols + col];
}
- inline bool sanitize (hb_sanitize_context_t *c, unsigned int cols) const
+ bool sanitize (hb_sanitize_context_t *c, unsigned int cols) const
{
TRACE_SANITIZE (this);
if (!c->check_struct (this)) return_trace (false);
- if (unlikely (_hb_unsigned_int_mul_overflows (rows, cols))) return_trace (false);
+ if (unlikely (hb_unsigned_mul_overflows (rows, cols))) return_trace (false);
unsigned int count = rows * cols;
- if (!c->check_array (matrixZ, matrixZ[0].static_size, count)) return_trace (false);
+ if (!c->check_array (matrixZ.arrayZ, count)) return_trace (false);
for (unsigned int i = 0; i < count; i++)
if (!matrixZ[i].sanitize (c, this)) return_trace (false);
return_trace (true);
}
- UINT16 rows; /* Number of rows */
+ HBUINT16 rows; /* Number of rows */
protected:
- OffsetTo<Anchor>
- matrixZ[VAR]; /* Matrix of offsets to Anchor tables--
+ UnsizedArrayOf<OffsetTo<Anchor>>
+ matrixZ; /* Matrix of offsets to Anchor tables--
* from beginning of AnchorMatrix table */
public:
DEFINE_SIZE_ARRAY (2, matrixZ);
@@ -396,14 +451,14 @@ struct MarkRecord
{
friend struct MarkArray;
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) && markAnchor.sanitize (c, base));
}
protected:
- UINT16 klass; /* Class defined for this mark */
+ HBUINT16 klass; /* Class defined for this mark */
OffsetTo<Anchor>
markAnchor; /* Offset to Anchor table--from
* beginning of MarkArray table */
@@ -413,10 +468,10 @@ struct MarkRecord
struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage order */
{
- inline bool apply (hb_apply_context_t *c,
- unsigned int mark_index, unsigned int glyph_index,
- const AnchorMatrix &anchors, unsigned int class_count,
- unsigned int glyph_pos) const
+ bool apply (hb_ot_apply_context_t *c,
+ unsigned int mark_index, unsigned int glyph_index,
+ const AnchorMatrix &anchors, unsigned int class_count,
+ unsigned int glyph_pos) const
{
TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer;
@@ -430,15 +485,15 @@ struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage orde
* return false such that the subsequent subtables have a chance at it. */
if (unlikely (!found)) return_trace (false);
- hb_position_t mark_x, mark_y, base_x, base_y;
+ float mark_x, mark_y, base_x, base_y;
buffer->unsafe_to_break (glyph_pos, buffer->idx);
mark_anchor.get_anchor (c, buffer->cur().codepoint, &mark_x, &mark_y);
glyph_anchor.get_anchor (c, buffer->info[glyph_pos].codepoint, &base_x, &base_y);
hb_glyph_position_t &o = buffer->cur_pos();
- o.x_offset = base_x - mark_x;
- o.y_offset = base_y - mark_y;
+ o.x_offset = roundf (base_x - mark_x);
+ o.y_offset = roundf (base_y - mark_y);
o.attach_type() = ATTACH_TYPE_MARK;
o.attach_chain() = (int) glyph_pos - (int) buffer->idx;
buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
@@ -447,7 +502,7 @@ struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage orde
return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (ArrayOf<MarkRecord>::sanitize (c, this));
@@ -459,18 +514,15 @@ struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage orde
struct SinglePosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- if (unlikely (!(this+coverage).add_coverage (c->input))) return;
- }
+ bool intersects (const hb_set_t *glyphs) const
+ { return (this+coverage).intersects (glyphs); }
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ { if (unlikely (!(this+coverage).add_coverage (c->input))) return; }
+
+ const Coverage &get_coverage () const { return this+coverage; }
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer;
@@ -483,7 +535,45 @@ struct SinglePosFormat1
return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ void serialize (hb_serialize_context_t *c,
+ Iterator it,
+ ValueFormat valFormat)
+ {
+ if (unlikely (!c->extend_min (*this))) return;
+ if (unlikely (!c->check_assign (valueFormat, valFormat))) return;
+
+ for (const auto &_ : hb_second (*it))
+ c->copy (_);
+
+ auto glyphs =
+ + it
+ | hb_map_retains_sorting (hb_first)
+ ;
+
+ coverage.serialize (c, this).serialize (c, glyphs);
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ auto it =
+ + hb_iter (this+coverage)
+ | hb_filter (glyphset)
+ | hb_map_retains_sorting (glyph_map)
+ | hb_zip (hb_repeat (values.as_array (valueFormat.get_len ())))
+ ;
+
+ bool ret = bool (it);
+ SinglePos_serialize (c->serializer, it, valueFormat);
+ return_trace (ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -492,7 +582,7 @@ struct SinglePosFormat1
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 format; /* Format identifier--format = 1 */
OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from
* beginning of subtable */
@@ -507,18 +597,15 @@ struct SinglePosFormat1
struct SinglePosFormat2
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- if (unlikely (!(this+coverage).add_coverage (c->input))) return;
- }
+ bool intersects (const hb_set_t *glyphs) const
+ { return (this+coverage).intersects (glyphs); }
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ { if (unlikely (!(this+coverage).add_coverage (c->input))) return; }
+
+ const Coverage &get_coverage () const { return this+coverage; }
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer;
@@ -535,7 +622,54 @@ struct SinglePosFormat2
return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ void serialize (hb_serialize_context_t *c,
+ Iterator it,
+ ValueFormat valFormat)
+ {
+ if (unlikely (!c->extend_min (*this))) return;
+ if (unlikely (!c->check_assign (valueFormat, valFormat))) return;
+ if (unlikely (!c->check_assign (valueCount, it.len ()))) return;
+
+ for (const auto iter : it)
+ for (const auto &_ : iter.second)
+ c->copy (_);
+
+ auto glyphs =
+ + it
+ | hb_map_retains_sorting (hb_first)
+ ;
+
+ coverage.serialize (c, this).serialize (c, glyphs);
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ unsigned sub_length = valueFormat.get_len ();
+ auto values_array = values.as_array (valueCount * sub_length);
+
+ auto it =
+ + hb_zip (this+coverage, hb_range ((unsigned) valueCount))
+ | hb_filter (glyphset, hb_first)
+ | hb_map_retains_sorting ([&] (const hb_pair_t<hb_codepoint_t, unsigned>& _)
+ {
+ return hb_pair (glyph_map[_.first],
+ values_array.sub_array (_.second * sub_length,
+ sub_length));
+ })
+ ;
+
+ bool ret = bool (it);
+ SinglePos_serialize (c->serializer, it, valueFormat);
+ return_trace (ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -544,13 +678,13 @@ struct SinglePosFormat2
}
protected:
- UINT16 format; /* Format identifier--format = 2 */
+ HBUINT16 format; /* Format identifier--format = 2 */
OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from
* beginning of subtable */
ValueFormat valueFormat; /* Defines the types of data in the
* ValueRecord */
- UINT16 valueCount; /* Number of ValueRecords */
+ HBUINT16 valueCount; /* Number of ValueRecords */
ValueRecord values; /* Array of ValueRecords--positioning
* values applied to glyphs */
public:
@@ -559,33 +693,88 @@ struct SinglePosFormat2
struct SinglePos
{
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ unsigned get_format (Iterator glyph_val_iter_pairs)
+ {
+ hb_array_t<const Value> first_val_iter = hb_second (*glyph_val_iter_pairs);
+
+ for (const auto iter : glyph_val_iter_pairs)
+ for (const auto _ : hb_zip (iter.second, first_val_iter))
+ if (_.first != _.second)
+ return 2;
+
+ return 1;
+ }
+
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ void serialize (hb_serialize_context_t *c,
+ Iterator glyph_val_iter_pairs,
+ ValueFormat valFormat)
+ {
+ if (unlikely (!c->extend_min (u.format))) return;
+ unsigned format = 2;
+
+ if (glyph_val_iter_pairs) format = get_format (glyph_val_iter_pairs);
+
+ u.format = format;
+ switch (u.format) {
+ case 1: u.format1.serialize (c, glyph_val_iter_pairs, valFormat);
+ return;
+ case 2: u.format2.serialize (c, glyph_val_iter_pairs, valFormat);
+ return;
+ default:return;
+ }
+ }
+
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
- case 2: return_trace (c->dispatch (u.format2));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+ case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
SinglePosFormat1 format1;
SinglePosFormat2 format2;
} u;
};
+template<typename Iterator>
+static inline void
+SinglePos_serialize (hb_serialize_context_t *c,
+ Iterator it,
+ ValueFormat valFormat)
+{ c->start_embed<SinglePos> ()->serialize (c, it, valFormat); }
+
struct PairValueRecord
{
friend struct PairSet;
+ bool serialize (hb_serialize_context_t *c,
+ unsigned length,
+ const hb_map_t &glyph_map) const
+ {
+ TRACE_SERIALIZE (this);
+ auto *out = c->start_embed (*this);
+ if (unlikely (!c->extend_min (out))) return_trace (false);
+
+ out->secondGlyph = glyph_map[secondGlyph];
+ return_trace (c->copy (values, length));
+ }
+
protected:
- GlyphID secondGlyph; /* GlyphID of second glyph in the
+ HBGlyphID secondGlyph; /* GlyphID of second glyph in the
* pair--first glyph is listed in the
* Coverage table */
ValueRecord values; /* Positioning data for the first glyph
@@ -598,19 +787,36 @@ struct PairSet
{
friend struct PairPosFormat1;
- inline void collect_glyphs (hb_collect_glyphs_context_t *c,
+ bool intersects (const hb_set_t *glyphs,
+ const ValueFormat *valueFormats) const
+ {
+ unsigned int len1 = valueFormats[0].get_len ();
+ unsigned int len2 = valueFormats[1].get_len ();
+ unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
+
+ const PairValueRecord *record = &firstPairValueRecord;
+ unsigned int count = len;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (glyphs->has (record->secondGlyph))
+ return true;
+ record = &StructAtOffset<const PairValueRecord> (record, record_size);
+ }
+ return false;
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c,
const ValueFormat *valueFormats) const
{
- TRACE_COLLECT_GLYPHS (this);
unsigned int len1 = valueFormats[0].get_len ();
unsigned int len2 = valueFormats[1].get_len ();
- unsigned int record_size = UINT16::static_size * (1 + len1 + len2);
+ unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
- const PairValueRecord *record = CastP<PairValueRecord> (arrayZ);
+ const PairValueRecord *record = &firstPairValueRecord;
c->input->add_array (&record->secondGlyph, len, record_size);
}
- inline bool apply (hb_apply_context_t *c,
+ bool apply (hb_ot_apply_context_t *c,
const ValueFormat *valueFormats,
unsigned int pos) const
{
@@ -618,9 +824,8 @@ struct PairSet
hb_buffer_t *buffer = c->buffer;
unsigned int len1 = valueFormats[0].get_len ();
unsigned int len2 = valueFormats[1].get_len ();
- unsigned int record_size = UINT16::static_size * (1 + len1 + len2);
+ unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
- const PairValueRecord *record_array = CastP<PairValueRecord> (arrayZ);
unsigned int count = len;
/* Hand-coded bsearch. */
@@ -630,18 +835,19 @@ struct PairSet
int min = 0, max = (int) count - 1;
while (min <= max)
{
- int mid = (min + max) / 2;
- const PairValueRecord *record = &StructAtOffset<PairValueRecord> (record_array, record_size * mid);
+ int mid = ((unsigned int) min + (unsigned int) max) / 2;
+ const PairValueRecord *record = &StructAtOffset<PairValueRecord> (&firstPairValueRecord, record_size * mid);
hb_codepoint_t mid_x = record->secondGlyph;
if (x < mid_x)
- max = mid - 1;
+ max = mid - 1;
else if (x > mid_x)
- min = mid + 1;
+ min = mid + 1;
else
{
- buffer->unsafe_to_break (buffer->idx, pos + 1);
- valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos());
- valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]);
+ /* Note the intentional use of "|" instead of short-circuit "||". */
+ if (valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos()) |
+ valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]))
+ buffer->unsafe_to_break (buffer->idx, pos + 1);
if (len2)
pos++;
buffer->idx = pos;
@@ -652,64 +858,150 @@ struct PairSet
return_trace (false);
}
- struct sanitize_closure_t {
+ bool subset (hb_subset_context_t *c,
+ const ValueFormat valueFormats[2]) const
+ {
+ TRACE_SUBSET (this);
+ auto snap = c->serializer->snapshot ();
+
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+ out->len = 0;
+
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ unsigned len1 = valueFormats[0].get_len ();
+ unsigned len2 = valueFormats[1].get_len ();
+ unsigned record_size = HBUINT16::static_size + Value::static_size * (len1 + len2);
+
+ const PairValueRecord *record = &firstPairValueRecord;
+ unsigned count = len, num = 0;
+ for (unsigned i = 0; i < count; i++)
+ {
+ if (!glyphset.has (record->secondGlyph)) continue;
+ if (record->serialize (c->serializer, len1 + len2, glyph_map)) num++;
+ record = &StructAtOffset<const PairValueRecord> (record, record_size);
+ }
+
+ out->len = num;
+ if (!num) c->serializer->revert (snap);
+ return_trace (num);
+ }
+
+ struct sanitize_closure_t
+ {
const void *base;
const ValueFormat *valueFormats;
unsigned int len1; /* valueFormats[0].get_len() */
unsigned int stride; /* 1 + len1 + len2 */
};
- inline bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) const
+ bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) const
{
TRACE_SANITIZE (this);
if (!(c->check_struct (this)
- && c->check_array (arrayZ, UINT16::static_size * closure->stride, len))) return_trace (false);
+ && c->check_range (&firstPairValueRecord,
+ len,
+ HBUINT16::static_size,
+ closure->stride))) return_trace (false);
unsigned int count = len;
- const PairValueRecord *record = CastP<PairValueRecord> (arrayZ);
+ const PairValueRecord *record = &firstPairValueRecord;
return_trace (closure->valueFormats[0].sanitize_values_stride_unsafe (c, closure->base, &record->values[0], count, closure->stride) &&
closure->valueFormats[1].sanitize_values_stride_unsafe (c, closure->base, &record->values[closure->len1], count, closure->stride));
}
protected:
- UINT16 len; /* Number of PairValueRecords */
- UINT16 arrayZ[VAR]; /* Array of PairValueRecords--ordered
- * by GlyphID of the second glyph */
+ HBUINT16 len; /* Number of PairValueRecords */
+ PairValueRecord firstPairValueRecord;
+ /* Array of PairValueRecords--ordered
+ * by GlyphID of the second glyph */
public:
- DEFINE_SIZE_ARRAY (2, arrayZ);
+ DEFINE_SIZE_MIN (2);
};
struct PairPosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ return
+ + hb_zip (this+coverage, pairSet)
+ | hb_filter (*glyphs, hb_first)
+ | hb_map (hb_second)
+ | hb_map ([glyphs, this] (const OffsetTo<PairSet> &_)
+ { return (this+_).intersects (glyphs, valueFormat); })
+ | hb_any
+ ;
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
if (unlikely (!(this+coverage).add_coverage (c->input))) return;
unsigned int count = pairSet.len;
for (unsigned int i = 0; i < count; i++)
(this+pairSet[i]).collect_glyphs (c, valueFormat);
}
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
+ const Coverage &get_coverage () const { return this+coverage; }
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer;
unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return_trace (false);
- hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
skippy_iter.reset (buffer->idx, 1);
if (!skippy_iter.next ()) return_trace (false);
return_trace ((this+pairSet[index]).apply (c, valueFormat, skippy_iter.idx));
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+ out->format = format;
+ out->valueFormat[0] = valueFormat[0];
+ out->valueFormat[1] = valueFormat[1];
+
+ hb_sorted_vector_t<hb_codepoint_t> new_coverage;
+
+ + hb_zip (this+coverage, pairSet)
+ | hb_filter (glyphset, hb_first)
+ | hb_filter ([this, c, out] (const OffsetTo<PairSet>& _)
+ {
+ auto *o = out->pairSet.serialize_append (c->serializer);
+ if (unlikely (!o)) return false;
+ auto snap = c->serializer->snapshot ();
+ bool ret = o->serialize_subset (c, _, this, out, valueFormat);
+ if (!ret)
+ {
+ out->pairSet.pop ();
+ c->serializer->revert (snap);
+ }
+ return ret;
+ },
+ hb_second)
+ | hb_map (hb_first)
+ | hb_map (glyph_map)
+ | hb_sink (new_coverage)
+ ;
+
+ out->coverage.serialize (c->serializer, out)
+ .serialize (c->serializer, new_coverage.iter ());
+
+ return_trace (bool (new_coverage));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
@@ -717,7 +1009,8 @@ struct PairPosFormat1
unsigned int len1 = valueFormat[0].get_len ();
unsigned int len2 = valueFormat[1].get_len ();
- PairSet::sanitize_closure_t closure = {
+ PairSet::sanitize_closure_t closure =
+ {
this,
valueFormat,
len1,
@@ -728,7 +1021,7 @@ struct PairPosFormat1
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 format; /* Format identifier--format = 1 */
OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from
* beginning of subtable */
@@ -747,26 +1040,28 @@ struct PairPosFormat1
struct PairPosFormat2
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
{
- TRACE_COLLECT_GLYPHS (this);
- if (unlikely (!(this+coverage).add_coverage (c->input))) return;
- if (unlikely (!(this+classDef2).add_coverage (c->input))) return;
+ return (this+coverage).intersects (glyphs) &&
+ (this+classDef2).intersects (glyphs);
}
- inline const Coverage &get_coverage (void) const
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- return this+coverage;
+ if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+ if (unlikely (!(this+classDef2).add_coverage (c->input))) return;
}
- inline bool apply (hb_apply_context_t *c) const
+ const Coverage &get_coverage () const { return this+coverage; }
+
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer;
unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return_trace (false);
- hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
skippy_iter.reset (buffer->idx, 1);
if (!skippy_iter.next ()) return_trace (false);
@@ -778,10 +1073,11 @@ struct PairPosFormat2
unsigned int klass2 = (this+classDef2).get_class (buffer->info[skippy_iter.idx].codepoint);
if (unlikely (klass1 >= class1Count || klass2 >= class2Count)) return_trace (false);
- buffer->unsafe_to_break (buffer->idx, skippy_iter.idx + 1);
const Value *v = &values[record_len * (klass1 * class2Count + klass2)];
- valueFormat1.apply_value (c, this, v, buffer->cur_pos());
- valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]);
+ /* Note the intentional use of "|" instead of short-circuit "||". */
+ if (valueFormat1.apply_value (c, this, v, buffer->cur_pos()) |
+ valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]))
+ buffer->unsafe_to_break (buffer->idx, skippy_iter.idx + 1);
buffer->idx = skippy_iter.idx;
if (len2)
@@ -790,7 +1086,55 @@ struct PairPosFormat2
return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+ out->format = format;
+ out->valueFormat1 = valueFormat1;
+ out->valueFormat2 = valueFormat2;
+
+ hb_map_t klass1_map;
+ out->classDef1.serialize_subset (c, classDef1, this, out, &klass1_map);
+ out->class1Count = klass1_map.get_population ();
+
+ hb_map_t klass2_map;
+ out->classDef2.serialize_subset (c, classDef2, this, out, &klass2_map);
+ out->class2Count = klass2_map.get_population ();
+
+ unsigned record_len = valueFormat1.get_len () + valueFormat2.get_len ();
+
+ + hb_range ((unsigned) class1Count)
+ | hb_filter (klass1_map)
+ | hb_apply ([&] (const unsigned class1_idx)
+ {
+ + hb_range ((unsigned) class2Count)
+ | hb_filter (klass2_map)
+ | hb_apply ([&] (const unsigned class2_idx)
+ {
+ unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * record_len;
+ for (unsigned i = 0; i < record_len; i++)
+ c->serializer->copy (values[idx+i]);
+ })
+ ;
+ })
+ ;
+
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ auto it =
+ + hb_iter (this+coverage)
+ | hb_filter (glyphset)
+ | hb_map_retains_sorting (glyph_map)
+ ;
+
+ out->coverage.serialize (c->serializer, out).serialize (c->serializer, it);
+ return_trace (out->class1Count && out->class2Count && bool (it));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
if (!(c->check_struct (this)
@@ -803,13 +1147,15 @@ struct PairPosFormat2
unsigned int stride = len1 + len2;
unsigned int record_size = valueFormat1.get_size () + valueFormat2.get_size ();
unsigned int count = (unsigned int) class1Count * (unsigned int) class2Count;
- return_trace (c->check_array (values, record_size, count) &&
+ return_trace (c->check_range ((const void *) values,
+ count,
+ record_size) &&
valueFormat1.sanitize_values_stride_unsafe (c, this, &values[0], count, stride) &&
valueFormat2.sanitize_values_stride_unsafe (c, this, &values[len1], count, stride));
}
protected:
- UINT16 format; /* Format identifier--format = 2 */
+ HBUINT16 format; /* Format identifier--format = 2 */
OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from
* beginning of subtable */
@@ -827,9 +1173,9 @@ struct PairPosFormat2
classDef2; /* Offset to ClassDef table--from
* beginning of PairPos subtable--for
* the second glyph of the pair */
- UINT16 class1Count; /* Number of classes in ClassDef1
+ HBUINT16 class1Count; /* Number of classes in ClassDef1
* table--includes Class0 */
- UINT16 class2Count; /* Number of classes in ClassDef2
+ HBUINT16 class2Count; /* Number of classes in ClassDef2
* table--includes Class0 */
ValueRecord values; /* Matrix of value pairs:
* class1-major, class2-minor,
@@ -840,21 +1186,21 @@ struct PairPosFormat2
struct PairPos
{
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
- case 2: return_trace (c->dispatch (u.format2));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+ case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
PairPosFormat1 format1;
PairPosFormat2 format2;
} u;
@@ -865,12 +1211,25 @@ struct EntryExitRecord
{
friend struct CursivePosFormat1;
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
{
TRACE_SANITIZE (this);
return_trace (entryAnchor.sanitize (c, base) && exitAnchor.sanitize (c, base));
}
+ EntryExitRecord* copy (hb_serialize_context_t *c,
+ const void *src_base,
+ const void *dst_base) const
+ {
+ TRACE_SERIALIZE (this);
+ auto *out = c->embed (this);
+ if (unlikely (!out)) return_trace (nullptr);
+
+ out->entryAnchor.serialize_copy (c, entryAnchor, src_base, dst_base);
+ out->exitAnchor.serialize_copy (c, exitAnchor, src_base, dst_base);
+ return_trace (out);
+ }
+
protected:
OffsetTo<Anchor>
entryAnchor; /* Offset to EntryAnchor table--from
@@ -889,39 +1248,36 @@ reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direc
struct CursivePosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- if (unlikely (!(this+coverage).add_coverage (c->input))) return;
- }
+ bool intersects (const hb_set_t *glyphs) const
+ { return (this+coverage).intersects (glyphs); }
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ { if (unlikely (!(this+coverage).add_coverage (c->input))) return; }
+
+ const Coverage &get_coverage () const { return this+coverage; }
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer;
const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)];
- if (!this_record.exitAnchor) return_trace (false);
+ if (!this_record.entryAnchor) return_trace (false);
- hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
skippy_iter.reset (buffer->idx, 1);
- if (!skippy_iter.next ()) return_trace (false);
+ if (!skippy_iter.prev ()) return_trace (false);
- const EntryExitRecord &next_record = entryExitRecord[(this+coverage).get_coverage (buffer->info[skippy_iter.idx].codepoint)];
- if (!next_record.entryAnchor) return_trace (false);
+ const EntryExitRecord &prev_record = entryExitRecord[(this+coverage).get_coverage (buffer->info[skippy_iter.idx].codepoint)];
+ if (!prev_record.exitAnchor) return_trace (false);
- unsigned int i = buffer->idx;
- unsigned int j = skippy_iter.idx;
+ unsigned int i = skippy_iter.idx;
+ unsigned int j = buffer->idx;
buffer->unsafe_to_break (i, j);
- hb_position_t entry_x, entry_y, exit_x, exit_y;
- (this+this_record.exitAnchor).get_anchor (c, buffer->info[i].codepoint, &exit_x, &exit_y);
- (this+next_record.entryAnchor).get_anchor (c, buffer->info[j].codepoint, &entry_x, &entry_y);
+ float entry_x, entry_y, exit_x, exit_y;
+ (this+prev_record.exitAnchor).get_anchor (c, buffer->info[i].codepoint, &exit_x, &exit_y);
+ (this+this_record.entryAnchor).get_anchor (c, buffer->info[j].codepoint, &entry_x, &entry_y);
hb_glyph_position_t *pos = buffer->pos;
@@ -929,32 +1285,32 @@ struct CursivePosFormat1
/* Main-direction adjustment */
switch (c->direction) {
case HB_DIRECTION_LTR:
- pos[i].x_advance = exit_x + pos[i].x_offset;
+ pos[i].x_advance = roundf (exit_x) + pos[i].x_offset;
- d = entry_x + pos[j].x_offset;
+ d = roundf (entry_x) + pos[j].x_offset;
pos[j].x_advance -= d;
pos[j].x_offset -= d;
break;
case HB_DIRECTION_RTL:
- d = exit_x + pos[i].x_offset;
+ d = roundf (exit_x) + pos[i].x_offset;
pos[i].x_advance -= d;
pos[i].x_offset -= d;
- pos[j].x_advance = entry_x + pos[j].x_offset;
+ pos[j].x_advance = roundf (entry_x) + pos[j].x_offset;
break;
case HB_DIRECTION_TTB:
- pos[i].y_advance = exit_y + pos[i].y_offset;
+ pos[i].y_advance = roundf (exit_y) + pos[i].y_offset;
- d = entry_y + pos[j].y_offset;
+ d = roundf (entry_y) + pos[j].y_offset;
pos[j].y_advance -= d;
pos[j].y_offset -= d;
break;
case HB_DIRECTION_BTT:
- d = exit_y + pos[i].y_offset;
+ d = roundf (exit_y) + pos[i].y_offset;
pos[i].y_advance -= d;
pos[i].y_offset -= d;
- pos[j].y_advance = entry_y;
+ pos[j].y_advance = roundf (entry_y);
break;
case HB_DIRECTION_INVALID:
default:
@@ -968,7 +1324,7 @@ struct CursivePosFormat1
* parent.
*
* Optimize things for the case of RightToLeft, as that's most common in
- * Arabinc. */
+ * Arabic. */
unsigned int child = i;
unsigned int parent = j;
hb_position_t x_offset = entry_x - exit_x;
@@ -997,18 +1353,61 @@ struct CursivePosFormat1
else
pos[child].x_offset = x_offset;
- buffer->idx = j;
+ buffer->idx++;
return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ template <typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ void serialize (hb_serialize_context_t *c,
+ Iterator it,
+ const void *src_base)
+ {
+ if (unlikely (!c->extend_min ((*this)))) return;
+ this->format = 1;
+ this->entryExitRecord.len = it.len ();
+
+ for (const EntryExitRecord& entry_record : + it
+ | hb_map (hb_second))
+ c->copy (entry_record, src_base, this);
+
+ auto glyphs =
+ + it
+ | hb_map_retains_sorting (hb_first)
+ ;
+
+ coverage.serialize (c, this).serialize (c, glyphs);
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!out)) return_trace (false);
+
+ auto it =
+ + hb_zip (this+coverage, entryExitRecord)
+ | hb_filter (glyphset, hb_first)
+ | hb_map_retains_sorting ([&] (hb_pair_t<hb_codepoint_t, const EntryExitRecord&> p) -> hb_pair_t<hb_codepoint_t, const EntryExitRecord&>
+ { return hb_pair (glyph_map[p.first], p.second);})
+ ;
+
+ bool ret = bool (it);
+ out->serialize (c->serializer, it, this);
+ return_trace (ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && entryExitRecord.sanitize (c, this));
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 format; /* Format identifier--format = 1 */
OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from
* beginning of subtable */
@@ -1021,20 +1420,20 @@ struct CursivePosFormat1
struct CursivePos
{
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
CursivePosFormat1 format1;
} u;
};
@@ -1047,19 +1446,19 @@ typedef AnchorMatrix BaseArray; /* base-major--
struct MarkBasePosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
+ { return (this+markCoverage).intersects (glyphs) &&
+ (this+baseCoverage).intersects (glyphs); }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
if (unlikely (!(this+markCoverage).add_coverage (c->input))) return;
if (unlikely (!(this+baseCoverage).add_coverage (c->input))) return;
}
- inline const Coverage &get_coverage (void) const
- {
- return this+markCoverage;
- }
+ const Coverage &get_coverage () const { return this+markCoverage; }
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer;
@@ -1067,17 +1466,28 @@ struct MarkBasePosFormat1
if (likely (mark_index == NOT_COVERED)) return_trace (false);
/* Now we search backwards for a non-mark glyph */
- hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
skippy_iter.reset (buffer->idx, 1);
skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
do {
if (!skippy_iter.prev ()) return_trace (false);
- /* We only want to attach to the first of a MultipleSubst sequence. Reject others. */
+ /* We only want to attach to the first of a MultipleSubst sequence.
+ * https://github.com/harfbuzz/harfbuzz/issues/740
+ * Reject others...
+ * ...but stop if we find a mark in the MultipleSubst sequence:
+ * https://github.com/harfbuzz/harfbuzz/issues/1020 */
if (!_hb_glyph_info_multiplied (&buffer->info[skippy_iter.idx]) ||
- 0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]))
+ 0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) ||
+ (skippy_iter.idx == 0 ||
+ _hb_glyph_info_is_mark (&buffer->info[skippy_iter.idx - 1]) ||
+ _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]) !=
+ _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx - 1]) ||
+ _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) !=
+ _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx - 1]) + 1
+ ))
break;
skippy_iter.reject ();
- } while (1);
+ } while (true);
/* Checking that matched glyph is actually a base glyph by GDEF is too strong; disabled */
//if (!_hb_glyph_info_is_base_glyph (&buffer->info[skippy_iter.idx])) { return_trace (false); }
@@ -1088,7 +1498,14 @@ struct MarkBasePosFormat1
return_trace ((this+markArray).apply (c, mark_index, base_index, this+baseArray, classCount, skippy_iter.idx));
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ // TODO(subset)
+ return_trace (false);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -1099,14 +1516,14 @@ struct MarkBasePosFormat1
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 format; /* Format identifier--format = 1 */
OffsetTo<Coverage>
markCoverage; /* Offset to MarkCoverage table--from
* beginning of MarkBasePos subtable */
OffsetTo<Coverage>
baseCoverage; /* Offset to BaseCoverage table--from
* beginning of MarkBasePos subtable */
- UINT16 classCount; /* Number of classes defined for marks */
+ HBUINT16 classCount; /* Number of classes defined for marks */
OffsetTo<MarkArray>
markArray; /* Offset to MarkArray table--from
* beginning of MarkBasePos subtable */
@@ -1119,20 +1536,20 @@ struct MarkBasePosFormat1
struct MarkBasePos
{
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
MarkBasePosFormat1 format1;
} u;
};
@@ -1150,19 +1567,19 @@ typedef OffsetListOf<LigatureAttach> LigatureArray;
struct MarkLigPosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
+ { return (this+markCoverage).intersects (glyphs) &&
+ (this+ligatureCoverage).intersects (glyphs); }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
if (unlikely (!(this+markCoverage).add_coverage (c->input))) return;
if (unlikely (!(this+ligatureCoverage).add_coverage (c->input))) return;
}
- inline const Coverage &get_coverage (void) const
- {
- return this+markCoverage;
- }
+ const Coverage &get_coverage () const { return this+markCoverage; }
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer;
@@ -1170,7 +1587,7 @@ struct MarkLigPosFormat1
if (likely (mark_index == NOT_COVERED)) return_trace (false);
/* Now we search backwards for a non-mark glyph */
- hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
skippy_iter.reset (buffer->idx, 1);
skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
if (!skippy_iter.prev ()) return_trace (false);
@@ -1198,14 +1615,21 @@ struct MarkLigPosFormat1
unsigned int mark_id = _hb_glyph_info_get_lig_id (&buffer->cur());
unsigned int mark_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
if (lig_id && lig_id == mark_id && mark_comp > 0)
- comp_index = MIN (comp_count, _hb_glyph_info_get_lig_comp (&buffer->cur())) - 1;
+ comp_index = hb_min (comp_count, _hb_glyph_info_get_lig_comp (&buffer->cur())) - 1;
else
comp_index = comp_count - 1;
return_trace ((this+markArray).apply (c, mark_index, comp_index, lig_attach, classCount, j));
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ // TODO(subset)
+ return_trace (false);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -1216,7 +1640,7 @@ struct MarkLigPosFormat1
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 format; /* Format identifier--format = 1 */
OffsetTo<Coverage>
markCoverage; /* Offset to Mark Coverage table--from
* beginning of MarkLigPos subtable */
@@ -1224,7 +1648,7 @@ struct MarkLigPosFormat1
ligatureCoverage; /* Offset to Ligature Coverage
* table--from beginning of MarkLigPos
* subtable */
- UINT16 classCount; /* Number of defined mark classes */
+ HBUINT16 classCount; /* Number of defined mark classes */
OffsetTo<MarkArray>
markArray; /* Offset to MarkArray table--from
* beginning of MarkLigPos subtable */
@@ -1237,20 +1661,20 @@ struct MarkLigPosFormat1
struct MarkLigPos
{
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
MarkLigPosFormat1 format1;
} u;
};
@@ -1263,19 +1687,19 @@ typedef AnchorMatrix Mark2Array; /* mark2-major--
struct MarkMarkPosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
+ { return (this+mark1Coverage).intersects (glyphs) &&
+ (this+mark2Coverage).intersects (glyphs); }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
if (unlikely (!(this+mark1Coverage).add_coverage (c->input))) return;
if (unlikely (!(this+mark2Coverage).add_coverage (c->input))) return;
}
- inline const Coverage &get_coverage (void) const
- {
- return this+mark1Coverage;
- }
+ const Coverage &get_coverage () const { return this+mark1Coverage; }
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer;
@@ -1283,7 +1707,7 @@ struct MarkMarkPosFormat1
if (likely (mark1_index == NOT_COVERED)) return_trace (false);
/* now we search backwards for a suitable mark glyph until a non-mark glyph */
- hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
skippy_iter.reset (buffer->idx, 1);
skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags);
if (!skippy_iter.prev ()) return_trace (false);
@@ -1301,7 +1725,7 @@ struct MarkMarkPosFormat1
if (id1 == 0) /* Marks belonging to the same base. */
goto good;
else if (comp1 == comp2) /* Marks belonging to the same ligature component. */
- goto good;
+ goto good;
} else {
/* If ligature ids don't match, it may be the case that one of the marks
* itself is a ligature. In which case match. */
@@ -1319,7 +1743,14 @@ struct MarkMarkPosFormat1
return_trace ((this+mark1Array).apply (c, mark1_index, mark2_index, this+mark2Array, classCount, j));
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ // TODO(subset)
+ return_trace (false);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -1330,7 +1761,7 @@ struct MarkMarkPosFormat1
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 format; /* Format identifier--format = 1 */
OffsetTo<Coverage>
mark1Coverage; /* Offset to Combining Mark1 Coverage
* table--from beginning of MarkMarkPos
@@ -1339,7 +1770,7 @@ struct MarkMarkPosFormat1
mark2Coverage; /* Offset to Combining Mark2 Coverage
* table--from beginning of MarkMarkPos
* subtable */
- UINT16 classCount; /* Number of defined mark classes */
+ HBUINT16 classCount; /* Number of defined mark classes */
OffsetTo<MarkArray>
mark1Array; /* Offset to Mark1Array table--from
* beginning of MarkMarkPos subtable */
@@ -1352,20 +1783,20 @@ struct MarkMarkPosFormat1
struct MarkMarkPos
{
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
MarkMarkPosFormat1 format1;
} u;
};
@@ -1377,7 +1808,7 @@ struct ChainContextPos : ChainContext {};
struct ExtensionPos : Extension<ExtensionPos>
{
- typedef struct PosLookupSubTable LookupSubTable;
+ typedef struct PosLookupSubTable SubTable;
};
@@ -1389,6 +1820,7 @@ struct ExtensionPos : Extension<ExtensionPos>
struct PosLookupSubTable
{
+ friend struct Lookup;
friend struct PosLookup;
enum Type {
@@ -1403,28 +1835,26 @@ struct PosLookupSubTable
Extension = 9
};
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts&&... ds) const
{
TRACE_DISPATCH (this, lookup_type);
- if (unlikely (!c->may_dispatch (this, &u.sub_format))) return_trace (c->no_dispatch_return_value ());
switch (lookup_type) {
- case Single: return_trace (u.single.dispatch (c));
- case Pair: return_trace (u.pair.dispatch (c));
- case Cursive: return_trace (u.cursive.dispatch (c));
- case MarkBase: return_trace (u.markBase.dispatch (c));
- case MarkLig: return_trace (u.markLig.dispatch (c));
- case MarkMark: return_trace (u.markMark.dispatch (c));
- case Context: return_trace (u.context.dispatch (c));
- case ChainContext: return_trace (u.chainContext.dispatch (c));
- case Extension: return_trace (u.extension.dispatch (c));
+ case Single: return_trace (u.single.dispatch (c, hb_forward<Ts> (ds)...));
+ case Pair: return_trace (u.pair.dispatch (c, hb_forward<Ts> (ds)...));
+ case Cursive: return_trace (u.cursive.dispatch (c, hb_forward<Ts> (ds)...));
+ case MarkBase: return_trace (u.markBase.dispatch (c, hb_forward<Ts> (ds)...));
+ case MarkLig: return_trace (u.markLig.dispatch (c, hb_forward<Ts> (ds)...));
+ case MarkMark: return_trace (u.markMark.dispatch (c, hb_forward<Ts> (ds)...));
+ case Context: return_trace (u.context.dispatch (c, hb_forward<Ts> (ds)...));
+ case ChainContext: return_trace (u.chainContext.dispatch (c, hb_forward<Ts> (ds)...));
+ case Extension: return_trace (u.extension.dispatch (c, hb_forward<Ts> (ds)...));
default: return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 sub_format;
SinglePos single;
PairPos pair;
CursivePos cursive;
@@ -1436,80 +1866,86 @@ struct PosLookupSubTable
ExtensionPos extension;
} u;
public:
- DEFINE_SIZE_UNION (2, sub_format);
+ DEFINE_SIZE_MIN (0);
};
struct PosLookup : Lookup
{
- inline const PosLookupSubTable& get_subtable (unsigned int i) const
- { return Lookup::get_subtable<PosLookupSubTable> (i); }
+ typedef struct PosLookupSubTable SubTable;
- inline bool is_reverse (void) const
+ const SubTable& get_subtable (unsigned int i) const
+ { return Lookup::get_subtable<SubTable> (i); }
+
+ bool is_reverse () const
{
return false;
}
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
return_trace (dispatch (c));
}
- inline hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
{
- TRACE_COLLECT_GLYPHS (this);
- return_trace (dispatch (c));
+ hb_intersects_context_t c (glyphs);
+ return dispatch (&c);
}
+ hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs_context_t *c) const
+ { return dispatch (c); }
+
template <typename set_t>
- inline void add_coverage (set_t *glyphs) const
+ void add_coverage (set_t *glyphs) const
{
hb_add_coverage_context_t<set_t> c (glyphs);
dispatch (&c);
}
- static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
+ HB_INTERNAL static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
template <typename context_t>
- static inline typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
+ static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
- { return Lookup::dispatch<PosLookupSubTable> (c); }
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+ { return Lookup::dispatch<SubTable> (c, hb_forward<Ts> (ds)...); }
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!Lookup::sanitize (c))) return_trace (false);
- return_trace (dispatch (c));
- }
-};
+ bool subset (hb_subset_context_t *c) const
+ { return Lookup::subset<SubTable> (c); }
-typedef OffsetListOf<PosLookup> PosLookupList;
+ bool sanitize (hb_sanitize_context_t *c) const
+ { return Lookup::sanitize<SubTable> (c); }
+};
/*
- * GPOS -- The Glyph Positioning Table
+ * GPOS -- Glyph Positioning
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/gpos
*/
struct GPOS : GSUBGPOS
{
- static const hb_tag_t tableTag = HB_OT_TAG_GPOS;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_GPOS;
- inline const PosLookup& get_lookup (unsigned int i) const
+ const PosLookup& get_lookup (unsigned int i) const
{ return CastR<PosLookup> (GSUBGPOS::get_lookup (i)); }
static inline void position_start (hb_font_t *font, hb_buffer_t *buffer);
static inline void position_finish_advances (hb_font_t *font, hb_buffer_t *buffer);
static inline void position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer);
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!GSUBGPOS::sanitize (c))) return_trace (false);
- const OffsetTo<PosLookupList> &list = CastR<OffsetTo<PosLookupList> > (lookupList);
- return_trace (list.sanitize (c, this));
- }
+ bool subset (hb_subset_context_t *c) const
+ { return GSUBGPOS::subset<PosLookup> (c); }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ { return GSUBGPOS::sanitize<PosLookup> (c); }
+
+ HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+ hb_face_t *face) const;
+
+ typedef GSUBGPOS::accelerator_t<GPOS> accelerator_t;
};
@@ -1539,7 +1975,10 @@ reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direc
pos[j].attach_type() = type;
}
static void
-propagate_attachment_offsets (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction)
+propagate_attachment_offsets (hb_glyph_position_t *pos,
+ unsigned int len,
+ unsigned int i,
+ hb_direction_t direction)
{
/* Adjusts offsets of attached glyphs (both cursive and mark) to accumulate
* offset of glyph they are attached to. */
@@ -1547,11 +1986,14 @@ propagate_attachment_offsets (hb_glyph_position_t *pos, unsigned int i, hb_direc
if (likely (!chain))
return;
+ pos[i].attach_chain() = 0;
+
unsigned int j = (int) i + chain;
- pos[i].attach_chain() = 0;
+ if (unlikely (j >= len))
+ return;
- propagate_attachment_offsets (pos, j, direction);
+ propagate_attachment_offsets (pos, len, j, direction);
assert (!!(type & ATTACH_TYPE_MARK) ^ !!(type & ATTACH_TYPE_CURSIVE));
@@ -1590,7 +2032,7 @@ GPOS::position_start (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
}
void
-GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
+GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSED)
{
//_hb_buffer_assert_gsubgpos_vars (buffer);
}
@@ -1607,24 +2049,25 @@ GPOS::position_finish_offsets (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
/* Handle attachments */
if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT)
for (unsigned int i = 0; i < len; i++)
- propagate_attachment_offsets (pos, i, direction);
+ propagate_attachment_offsets (pos, len, i, direction);
}
+struct GPOS_accelerator_t : GPOS::accelerator_t {};
+
+
/* Out-of-class implementation for methods recursing */
+#ifndef HB_NO_OT_LAYOUT
template <typename context_t>
/*static*/ inline typename context_t::return_t PosLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index)
{
- const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos);
- const PosLookup &l = gpos.get_lookup (lookup_index);
+ const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index);
return l.dispatch (c);
}
-
-/*static*/ inline bool PosLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index)
+/*static*/ inline bool PosLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
{
- const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos);
- const PosLookup &l = gpos.get_lookup (lookup_index);
+ const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index);
unsigned int saved_lookup_props = c->lookup_props;
unsigned int saved_lookup_index = c->lookup_index;
c->set_lookup_index (lookup_index);
@@ -1634,10 +2077,7 @@ template <typename context_t>
c->set_lookup_props (saved_lookup_props);
return ret;
}
-
-
-#undef attach_chain
-#undef attach_type
+#endif
} /* namespace OT */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh
index 0b09c4e4a1..fc21cb056e 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh
@@ -29,54 +29,49 @@
#ifndef HB_OT_LAYOUT_GSUB_TABLE_HH
#define HB_OT_LAYOUT_GSUB_TABLE_HH
-#include "hb-ot-layout-gsubgpos-private.hh"
+#include "hb-ot-layout-gsubgpos.hh"
namespace OT {
+typedef hb_pair_t<hb_codepoint_t, hb_codepoint_t> hb_codepoint_pair_t;
+
+template<typename Iterator>
+static inline void SingleSubst_serialize (hb_serialize_context_t *c,
+ Iterator it);
+
struct SingleSubstFormat1
{
- inline void closure (hb_closure_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
+ { return (this+coverage).intersects (glyphs); }
+
+ void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
- Coverage::Iter iter;
- for (iter.init (this+coverage); iter.more (); iter.next ())
- {
- /* TODO Switch to range-based API to work around malicious fonts.
- * https://github.com/harfbuzz/harfbuzz/issues/363 */
- hb_codepoint_t glyph_id = iter.get_glyph ();
- if (c->glyphs->has (glyph_id))
- c->glyphs->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
- }
+ unsigned d = deltaGlyphID;
+ + hb_iter (this+coverage)
+ | hb_filter (*c->glyphs)
+ | hb_map ([d] (hb_codepoint_t g) { return (g + d) & 0xFFFFu; })
+ | hb_sink (c->output)
+ ;
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
if (unlikely (!(this+coverage).add_coverage (c->input))) return;
- Coverage::Iter iter;
- for (iter.init (this+coverage); iter.more (); iter.next ())
- {
- /* TODO Switch to range-based API to work around malicious fonts.
- * https://github.com/harfbuzz/harfbuzz/issues/363 */
- hb_codepoint_t glyph_id = iter.get_glyph ();
- c->output->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
- }
+ unsigned d = deltaGlyphID;
+ + hb_iter (this+coverage)
+ | hb_map ([d] (hb_codepoint_t g) { return (g + d) & 0xFFFFu; })
+ | hb_sink (c->output)
+ ;
}
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
+ const Coverage &get_coverage () const { return this+coverage; }
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
- return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
- }
+ bool would_apply (hb_would_apply_context_t *c) const
+ { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; }
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
@@ -91,115 +86,153 @@ struct SingleSubstFormat1
return_trace (true);
}
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &glyphs,
- unsigned int num_glyphs,
- int delta)
+ template<typename Iterator,
+ hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
+ bool serialize (hb_serialize_context_t *c,
+ Iterator glyphs,
+ unsigned delta)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (*this))) return_trace (false);
- if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false);
- deltaGlyphID.set (delta); /* TODO(serilaize) overflow? */
+ if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs))) return_trace (false);
+ c->check_assign (deltaGlyphID, delta);
return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ hb_codepoint_t delta = deltaGlyphID;
+
+ auto it =
+ + hb_iter (this+coverage)
+ | hb_filter (glyphset)
+ | hb_map_retains_sorting ([&] (hb_codepoint_t g) {
+ return hb_codepoint_pair_t (g,
+ (g + delta) & 0xFFFF); })
+ | hb_filter (glyphset, hb_second)
+ | hb_map_retains_sorting ([&] (hb_codepoint_pair_t p) -> hb_codepoint_pair_t
+ { return hb_pair (glyph_map[p.first], glyph_map[p.second]); })
+ ;
+
+ bool ret = bool (it);
+ SingleSubst_serialize (c->serializer, it);
+ return_trace (ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c));
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 format; /* Format identifier--format = 1 */
OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from
* beginning of Substitution table */
- INT16 deltaGlyphID; /* Add to original GlyphID to get
- * substitute GlyphID */
+ HBUINT16 deltaGlyphID; /* Add to original GlyphID to get
+ * substitute GlyphID, modulo 0x10000 */
public:
DEFINE_SIZE_STATIC (6);
};
struct SingleSubstFormat2
{
- inline void closure (hb_closure_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
+ { return (this+coverage).intersects (glyphs); }
+
+ void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
- Coverage::Iter iter;
- unsigned int count = substitute.len;
- for (iter.init (this+coverage); iter.more (); iter.next ())
- {
- if (unlikely (iter.get_coverage () >= count))
- break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
- if (c->glyphs->has (iter.get_glyph ()))
- c->glyphs->add (substitute[iter.get_coverage ()]);
- }
+ + hb_zip (this+coverage, substitute)
+ | hb_filter (*c->glyphs, hb_first)
+ | hb_map (hb_second)
+ | hb_sink (c->output)
+ ;
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
if (unlikely (!(this+coverage).add_coverage (c->input))) return;
- Coverage::Iter iter;
- unsigned int count = substitute.len;
- for (iter.init (this+coverage); iter.more (); iter.next ())
- {
- if (unlikely (iter.get_coverage () >= count))
- break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
- c->output->add (substitute[iter.get_coverage ()]);
- }
+ + hb_zip (this+coverage, substitute)
+ | hb_map (hb_second)
+ | hb_sink (c->output)
+ ;
}
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
+ const Coverage &get_coverage () const { return this+coverage; }
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
- return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
- }
+ bool would_apply (hb_would_apply_context_t *c) const
+ { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; }
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
- hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
- unsigned int index = (this+coverage).get_coverage (glyph_id);
+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return_trace (false);
if (unlikely (index >= substitute.len)) return_trace (false);
- glyph_id = substitute[index];
- c->replace_glyph (glyph_id);
+ c->replace_glyph (substitute[index]);
return_trace (true);
}
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &glyphs,
- Supplier<GlyphID> &substitutes,
- unsigned int num_glyphs)
+ template<typename Iterator,
+ hb_requires (hb_is_sorted_source_of (Iterator,
+ hb_codepoint_pair_t))>
+ bool serialize (hb_serialize_context_t *c,
+ Iterator it)
{
TRACE_SERIALIZE (this);
+ auto substitutes =
+ + it
+ | hb_map (hb_second)
+ ;
+ auto glyphs =
+ + it
+ | hb_map_retains_sorting (hb_first)
+ ;
if (unlikely (!c->extend_min (*this))) return_trace (false);
- if (unlikely (!substitute.serialize (c, substitutes, num_glyphs))) return_trace (false);
- if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false);
+ if (unlikely (!substitute.serialize (c, substitutes))) return_trace (false);
+ if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs))) return_trace (false);
return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ auto it =
+ + hb_zip (this+coverage, substitute)
+ | hb_filter (glyphset, hb_first)
+ | hb_filter (glyphset, hb_second)
+ | hb_map_retains_sorting ([&] (hb_pair_t<hb_codepoint_t, const HBGlyphID &> p) -> hb_codepoint_pair_t
+ { return hb_pair (glyph_map[p.first], glyph_map[p.second]); })
+ ;
+
+ bool ret = bool (it);
+ SingleSubst_serialize (c->serializer, it);
+ return_trace (ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && substitute.sanitize (c));
}
protected:
- UINT16 format; /* Format identifier--format = 2 */
+ HBUINT16 format; /* Format identifier--format = 2 */
OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from
* beginning of Substitution table */
- ArrayOf<GlyphID>
+ ArrayOf<HBGlyphID>
substitute; /* Array of substitute
* GlyphIDs--ordered by Coverage Index */
public:
@@ -208,71 +241,75 @@ struct SingleSubstFormat2
struct SingleSubst
{
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &glyphs,
- Supplier<GlyphID> &substitutes,
- unsigned int num_glyphs)
+
+ template<typename Iterator,
+ hb_requires (hb_is_sorted_source_of (Iterator,
+ const hb_codepoint_pair_t))>
+ bool serialize (hb_serialize_context_t *c,
+ Iterator glyphs)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (u.format))) return_trace (false);
- unsigned int format = 2;
- int delta = 0;
- if (num_glyphs) {
+ unsigned format = 2;
+ unsigned delta = 0;
+ if (glyphs)
+ {
format = 1;
- /* TODO(serialize) check for wrap-around */
- delta = substitutes[0] - glyphs[0];
- for (unsigned int i = 1; i < num_glyphs; i++)
- if (delta != substitutes[i] - glyphs[i]) {
- format = 2;
- break;
- }
+ auto get_delta = [=] (hb_codepoint_pair_t _) {
+ return (unsigned) (_.second - _.first) & 0xFFFF;
+ };
+ delta = get_delta (*glyphs);
+ if (!hb_all (++(+glyphs), delta, get_delta)) format = 2;
}
- u.format.set (format);
+ u.format = format;
switch (u.format) {
- case 1: return_trace (u.format1.serialize (c, glyphs, num_glyphs, delta));
- case 2: return_trace (u.format2.serialize (c, glyphs, substitutes, num_glyphs));
+ case 1: return_trace (u.format1.serialize (c,
+ + glyphs
+ | hb_map_retains_sorting (hb_first),
+ delta));
+ case 2: return_trace (u.format2.serialize (c, glyphs));
default:return_trace (false);
}
}
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
- case 2: return_trace (c->dispatch (u.format2));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+ case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
SingleSubstFormat1 format1;
SingleSubstFormat2 format2;
} u;
};
+template<typename Iterator>
+static inline void
+SingleSubst_serialize (hb_serialize_context_t *c,
+ Iterator it)
+{ c->start_embed<SingleSubst> ()->serialize (c, it); }
struct Sequence
{
- inline void closure (hb_closure_context_t *c) const
- {
- TRACE_CLOSURE (this);
- unsigned int count = substitute.len;
- for (unsigned int i = 0; i < count; i++)
- c->glyphs->add (substitute[i]);
- }
+ bool intersects (const hb_set_t *glyphs) const
+ { return hb_all (substitute, glyphs); }
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- c->output->add_array (substitute.array, substitute.len);
- }
+ void closure (hb_closure_context_t *c) const
+ { c->output->add_array (substitute.arrayZ, substitute.len); }
- inline bool apply (hb_apply_context_t *c) const
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ { c->output->add_array (substitute.arrayZ, substitute.len); }
+
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
unsigned int count = substitute.len;
@@ -281,7 +318,7 @@ struct Sequence
* as a "multiplied" substitution. */
if (unlikely (count == 1))
{
- c->replace_glyph (substitute.array[0]);
+ c->replace_glyph (substitute.arrayZ[0]);
return_trace (true);
}
/* Spec disallows this, but Uniscribe allows it.
@@ -297,31 +334,47 @@ struct Sequence
for (unsigned int i = 0; i < count; i++) {
_hb_glyph_info_set_lig_props_for_component (&c->buffer->cur(), i);
- c->output_glyph_for_component (substitute.array[i], klass);
+ c->output_glyph_for_component (substitute.arrayZ[i], klass);
}
c->buffer->skip_glyph ();
return_trace (true);
}
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &glyphs,
- unsigned int num_glyphs)
+ template <typename Iterator,
+ hb_requires (hb_is_source_of (Iterator, hb_codepoint_t))>
+ bool serialize (hb_serialize_context_t *c,
+ Iterator subst)
{
TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return_trace (false);
- if (unlikely (!substitute.serialize (c, glyphs, num_glyphs))) return_trace (false);
- return_trace (true);
+ return_trace (substitute.serialize (c, subst));
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ if (!intersects (&glyphset)) return_trace (false);
+
+ auto it =
+ + hb_iter (substitute)
+ | hb_map (glyph_map)
+ ;
+
+ auto *out = c->serializer->start_embed (*this);
+ return_trace (out->serialize (c->serializer, it));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (substitute.sanitize (c));
}
protected:
- ArrayOf<GlyphID>
+ ArrayOf<HBGlyphID>
substitute; /* String of GlyphIDs to substitute */
public:
DEFINE_SIZE_ARRAY (2, substitute);
@@ -329,41 +382,35 @@ struct Sequence
struct MultipleSubstFormat1
{
- inline void closure (hb_closure_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
+ { return (this+coverage).intersects (glyphs); }
+
+ void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
- Coverage::Iter iter;
- unsigned int count = sequence.len;
- for (iter.init (this+coverage); iter.more (); iter.next ())
- {
- if (unlikely (iter.get_coverage () >= count))
- break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
- if (c->glyphs->has (iter.get_glyph ()))
- (this+sequence[iter.get_coverage ()]).closure (c);
- }
+ + hb_zip (this+coverage, sequence)
+ | hb_filter (*c->glyphs, hb_first)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_apply ([c] (const Sequence &_) { _.closure (c); })
+ ;
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
if (unlikely (!(this+coverage).add_coverage (c->input))) return;
- unsigned int count = sequence.len;
- for (unsigned int i = 0; i < count; i++)
- (this+sequence[i]).collect_glyphs (c);
+ + hb_zip (this+coverage, sequence)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_apply ([c] (const Sequence &_) { _.collect_glyphs (c); })
+ ;
}
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
+ const Coverage &get_coverage () const { return this+coverage; }
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
- return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
- }
+ bool would_apply (hb_would_apply_context_t *c) const
+ { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; }
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
@@ -373,32 +420,56 @@ struct MultipleSubstFormat1
return_trace ((this+sequence[index]).apply (c));
}
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &glyphs,
- Supplier<unsigned int> &substitute_len_list,
- unsigned int num_glyphs,
- Supplier<GlyphID> &substitute_glyphs_list)
+ bool serialize (hb_serialize_context_t *c,
+ hb_sorted_array_t<const HBGlyphID> glyphs,
+ hb_array_t<const unsigned int> substitute_len_list,
+ hb_array_t<const HBGlyphID> substitute_glyphs_list)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (*this))) return_trace (false);
- if (unlikely (!sequence.serialize (c, num_glyphs))) return_trace (false);
- for (unsigned int i = 0; i < num_glyphs; i++)
- if (unlikely (!sequence[i].serialize (c, this).serialize (c,
- substitute_glyphs_list,
- substitute_len_list[i]))) return_trace (false);
- substitute_len_list.advance (num_glyphs);
- if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false);
- return_trace (true);
+ if (unlikely (!sequence.serialize (c, glyphs.length))) return_trace (false);
+ for (unsigned int i = 0; i < glyphs.length; i++)
+ {
+ unsigned int substitute_len = substitute_len_list[i];
+ if (unlikely (!sequence[i].serialize (c, this)
+ .serialize (c, substitute_glyphs_list.sub_array (0, substitute_len))))
+ return_trace (false);
+ substitute_glyphs_list += substitute_len;
+ }
+ return_trace (coverage.serialize (c, this).serialize (c, glyphs));
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+ out->format = format;
+
+ hb_sorted_vector_t<hb_codepoint_t> new_coverage;
+ + hb_zip (this+coverage, sequence)
+ | hb_filter (glyphset, hb_first)
+ | hb_filter (subset_offset_array (c, out->sequence, this, out), hb_second)
+ | hb_map (hb_first)
+ | hb_map (glyph_map)
+ | hb_sink (new_coverage)
+ ;
+ out->coverage.serialize (c->serializer, out)
+ .serialize (c->serializer, new_coverage.iter ());
+ return_trace (bool (new_coverage));
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && sequence.sanitize (c, this));
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 format; /* Format identifier--format = 1 */
OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from
* beginning of Substitution table */
@@ -411,144 +482,204 @@ struct MultipleSubstFormat1
struct MultipleSubst
{
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &glyphs,
- Supplier<unsigned int> &substitute_len_list,
- unsigned int num_glyphs,
- Supplier<GlyphID> &substitute_glyphs_list)
+ bool serialize (hb_serialize_context_t *c,
+ hb_sorted_array_t<const HBGlyphID> glyphs,
+ hb_array_t<const unsigned int> substitute_len_list,
+ hb_array_t<const HBGlyphID> substitute_glyphs_list)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (u.format))) return_trace (false);
unsigned int format = 1;
- u.format.set (format);
+ u.format = format;
switch (u.format) {
- case 1: return_trace (u.format1.serialize (c, glyphs, substitute_len_list, num_glyphs, substitute_glyphs_list));
+ case 1: return_trace (u.format1.serialize (c, glyphs, substitute_len_list, substitute_glyphs_list));
default:return_trace (false);
}
}
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
MultipleSubstFormat1 format1;
} u;
};
+struct AlternateSet
+{
+ bool intersects (const hb_set_t *glyphs) const
+ { return hb_any (alternates, glyphs); }
-typedef ArrayOf<GlyphID> AlternateSet; /* Array of alternate GlyphIDs--in
- * arbitrary order */
+ void closure (hb_closure_context_t *c) const
+ { c->output->add_array (alternates.arrayZ, alternates.len); }
-struct AlternateSubstFormat1
-{
- inline void closure (hb_closure_context_t *c) const
- {
- TRACE_CLOSURE (this);
- Coverage::Iter iter;
- unsigned int count = alternateSet.len;
- for (iter.init (this+coverage); iter.more (); iter.next ())
- {
- if (unlikely (iter.get_coverage () >= count))
- break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
- if (c->glyphs->has (iter.get_glyph ())) {
- const AlternateSet &alt_set = this+alternateSet[iter.get_coverage ()];
- unsigned int count = alt_set.len;
- for (unsigned int i = 0; i < count; i++)
- c->glyphs->add (alt_set[i]);
- }
- }
- }
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ { c->output->add_array (alternates.arrayZ, alternates.len); }
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
- if (unlikely (!(this+coverage).add_coverage (c->input))) return;
- Coverage::Iter iter;
- unsigned int count = alternateSet.len;
- for (iter.init (this+coverage); iter.more (); iter.next ())
- {
- if (unlikely (iter.get_coverage () >= count))
- break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
- const AlternateSet &alt_set = this+alternateSet[iter.get_coverage ()];
- c->output->add_array (alt_set.array, alt_set.len);
- }
+ TRACE_APPLY (this);
+ unsigned int count = alternates.len;
+
+ if (unlikely (!count)) return_trace (false);
+
+ hb_mask_t glyph_mask = c->buffer->cur().mask;
+ hb_mask_t lookup_mask = c->lookup_mask;
+
+ /* Note: This breaks badly if two features enabled this lookup together. */
+ unsigned int shift = hb_ctz (lookup_mask);
+ unsigned int alt_index = ((lookup_mask & glyph_mask) >> shift);
+
+ /* If alt_index is MAX_VALUE, randomize feature if it is the rand feature. */
+ if (alt_index == HB_OT_MAP_MAX_VALUE && c->random)
+ alt_index = c->random_number () % count + 1;
+
+ if (unlikely (alt_index > count || alt_index == 0)) return_trace (false);
+
+ c->replace_glyph (alternates[alt_index - 1]);
+
+ return_trace (true);
}
- inline const Coverage &get_coverage (void) const
+ template <typename Iterator,
+ hb_requires (hb_is_source_of (Iterator, hb_codepoint_t))>
+ bool serialize (hb_serialize_context_t *c,
+ Iterator alts)
{
- return this+coverage;
+ TRACE_SERIALIZE (this);
+ return_trace (alternates.serialize (c, alts));
}
- inline bool would_apply (hb_would_apply_context_t *c) const
+ bool subset (hb_subset_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
- return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ auto it =
+ + hb_iter (alternates)
+ | hb_filter (glyphset)
+ | hb_map (glyph_map)
+ ;
+
+ auto *out = c->serializer->start_embed (*this);
+ return_trace (out->serialize (c->serializer, it) &&
+ out->alternates);
}
- inline bool apply (hb_apply_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
- TRACE_APPLY (this);
- hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
+ TRACE_SANITIZE (this);
+ return_trace (alternates.sanitize (c));
+ }
- unsigned int index = (this+coverage).get_coverage (glyph_id);
- if (likely (index == NOT_COVERED)) return_trace (false);
+ protected:
+ ArrayOf<HBGlyphID>
+ alternates; /* Array of alternate GlyphIDs--in
+ * arbitrary order */
+ public:
+ DEFINE_SIZE_ARRAY (2, alternates);
+};
- const AlternateSet &alt_set = this+alternateSet[index];
+struct AlternateSubstFormat1
+{
+ bool intersects (const hb_set_t *glyphs) const
+ { return (this+coverage).intersects (glyphs); }
- if (unlikely (!alt_set.len)) return_trace (false);
+ void closure (hb_closure_context_t *c) const
+ {
+ + hb_zip (this+coverage, alternateSet)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_apply ([c] (const AlternateSet &_) { _.closure (c); })
+ ;
+ }
- hb_mask_t glyph_mask = c->buffer->cur().mask;
- hb_mask_t lookup_mask = c->lookup_mask;
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+ + hb_zip (this+coverage, alternateSet)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_apply ([c] (const AlternateSet &_) { _.collect_glyphs (c); })
+ ;
+ }
- /* Note: This breaks badly if two features enabled this lookup together. */
- unsigned int shift = _hb_ctz (lookup_mask);
- unsigned int alt_index = ((lookup_mask & glyph_mask) >> shift);
+ const Coverage &get_coverage () const { return this+coverage; }
- if (unlikely (alt_index > alt_set.len || alt_index == 0)) return_trace (false);
+ bool would_apply (hb_would_apply_context_t *c) const
+ { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; }
- glyph_id = alt_set[alt_index - 1];
+ bool apply (hb_ot_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
- c->replace_glyph (glyph_id);
+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ if (likely (index == NOT_COVERED)) return_trace (false);
- return_trace (true);
+ return_trace ((this+alternateSet[index]).apply (c));
}
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &glyphs,
- Supplier<unsigned int> &alternate_len_list,
- unsigned int num_glyphs,
- Supplier<GlyphID> &alternate_glyphs_list)
+ bool serialize (hb_serialize_context_t *c,
+ hb_sorted_array_t<const HBGlyphID> glyphs,
+ hb_array_t<const unsigned int> alternate_len_list,
+ hb_array_t<const HBGlyphID> alternate_glyphs_list)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (*this))) return_trace (false);
- if (unlikely (!alternateSet.serialize (c, num_glyphs))) return_trace (false);
- for (unsigned int i = 0; i < num_glyphs; i++)
- if (unlikely (!alternateSet[i].serialize (c, this).serialize (c,
- alternate_glyphs_list,
- alternate_len_list[i]))) return_trace (false);
- alternate_len_list.advance (num_glyphs);
- if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false);
- return_trace (true);
+ if (unlikely (!alternateSet.serialize (c, glyphs.length))) return_trace (false);
+ for (unsigned int i = 0; i < glyphs.length; i++)
+ {
+ unsigned int alternate_len = alternate_len_list[i];
+ if (unlikely (!alternateSet[i].serialize (c, this)
+ .serialize (c, alternate_glyphs_list.sub_array (0, alternate_len))))
+ return_trace (false);
+ alternate_glyphs_list += alternate_len;
+ }
+ return_trace (coverage.serialize (c, this).serialize (c, glyphs));
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+ out->format = format;
+
+ hb_sorted_vector_t<hb_codepoint_t> new_coverage;
+ + hb_zip (this+coverage, alternateSet)
+ | hb_filter (glyphset, hb_first)
+ | hb_filter (subset_offset_array (c, out->alternateSet, this, out), hb_second)
+ | hb_map (hb_first)
+ | hb_map (glyph_map)
+ | hb_sink (new_coverage)
+ ;
+ out->coverage.serialize (c->serializer, out)
+ .serialize (c->serializer, new_coverage.iter ());
+ return_trace (bool (new_coverage));
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && alternateSet.sanitize (c, this));
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 format; /* Format identifier--format = 1 */
OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from
* beginning of Substitution table */
@@ -561,36 +692,35 @@ struct AlternateSubstFormat1
struct AlternateSubst
{
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &glyphs,
- Supplier<unsigned int> &alternate_len_list,
- unsigned int num_glyphs,
- Supplier<GlyphID> &alternate_glyphs_list)
+ bool serialize (hb_serialize_context_t *c,
+ hb_sorted_array_t<const HBGlyphID> glyphs,
+ hb_array_t<const unsigned int> alternate_len_list,
+ hb_array_t<const HBGlyphID> alternate_glyphs_list)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (u.format))) return_trace (false);
unsigned int format = 1;
- u.format.set (format);
+ u.format = format;
switch (u.format) {
- case 1: return_trace (u.format1.serialize (c, glyphs, alternate_len_list, num_glyphs, alternate_glyphs_list));
+ case 1: return_trace (u.format1.serialize (c, glyphs, alternate_len_list, alternate_glyphs_list));
default:return_trace (false);
}
}
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
AlternateSubstFormat1 format1;
} u;
};
@@ -598,40 +728,37 @@ struct AlternateSubst
struct Ligature
{
- inline void closure (hb_closure_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
+ { return hb_all (component, glyphs); }
+
+ void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
- unsigned int count = component.len;
- for (unsigned int i = 1; i < count; i++)
- if (!c->glyphs->has (component[i]))
- return;
- c->glyphs->add (ligGlyph);
+ if (!intersects (c->glyphs)) return;
+ c->output->add (ligGlyph);
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
- c->input->add_array (component.array, component.len ? component.len - 1 : 0);
+ c->input->add_array (component.arrayZ, component.get_length ());
c->output->add (ligGlyph);
}
- inline bool would_apply (hb_would_apply_context_t *c) const
+ bool would_apply (hb_would_apply_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
- if (c->len != component.len)
- return_trace (false);
+ if (c->len != component.lenP1)
+ return false;
for (unsigned int i = 1; i < c->len; i++)
if (likely (c->glyphs[i] != component[i]))
- return_trace (false);
+ return false;
- return_trace (true);
+ return true;
}
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
- unsigned int count = component.len;
+ unsigned int count = component.lenP1;
if (unlikely (!count)) return_trace (false);
@@ -643,7 +770,6 @@ struct Ligature
return_trace (true);
}
- bool is_mark_ligature = false;
unsigned int total_component_count = 0;
unsigned int match_length = 0;
@@ -655,7 +781,6 @@ struct Ligature
nullptr,
&match_length,
match_positions,
- &is_mark_ligature,
&total_component_count)))
return_trace (false);
@@ -664,34 +789,53 @@ struct Ligature
match_positions,
match_length,
ligGlyph,
- is_mark_ligature,
total_component_count);
return_trace (true);
}
- inline bool serialize (hb_serialize_context_t *c,
- GlyphID ligature,
- Supplier<GlyphID> &components, /* Starting from second */
- unsigned int num_components /* Including first component */)
+ template <typename Iterator,
+ hb_requires (hb_is_source_of (Iterator, hb_codepoint_t))>
+ bool serialize (hb_serialize_context_t *c,
+ hb_codepoint_t ligature,
+ Iterator components /* Starting from second */)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (*this))) return_trace (false);
ligGlyph = ligature;
- if (unlikely (!component.serialize (c, components, num_components))) return_trace (false);
+ if (unlikely (!component.serialize (c, components))) return_trace (false);
return_trace (true);
}
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ if (!intersects (&glyphset) || !glyphset.has (ligGlyph)) return_trace (false);
+
+ auto it =
+ + hb_iter (component)
+ | hb_map (glyph_map)
+ ;
+
+ auto *out = c->serializer->start_embed (*this);
+ return_trace (out->serialize (c->serializer,
+ glyph_map[ligGlyph],
+ it));
+ }
+
public:
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (ligGlyph.sanitize (c) && component.sanitize (c));
}
protected:
- GlyphID ligGlyph; /* GlyphID of ligature to substitute */
- HeadlessArrayOf<GlyphID>
+ HBGlyphID ligGlyph; /* GlyphID of ligature to substitute */
+ HeadlessArrayOf<HBGlyphID>
component; /* Array of component GlyphIDs--start
* with the second component--ordered
* in writing direction */
@@ -701,36 +845,43 @@ struct Ligature
struct LigatureSet
{
- inline void closure (hb_closure_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
{
- TRACE_CLOSURE (this);
- unsigned int num_ligs = ligature.len;
- for (unsigned int i = 0; i < num_ligs; i++)
- (this+ligature[i]).closure (c);
+ return
+ + hb_iter (ligature)
+ | hb_map (hb_add (this))
+ | hb_map ([glyphs] (const Ligature &_) { return _.intersects (glyphs); })
+ | hb_any
+ ;
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ void closure (hb_closure_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
- unsigned int num_ligs = ligature.len;
- for (unsigned int i = 0; i < num_ligs; i++)
- (this+ligature[i]).collect_glyphs (c);
+ + hb_iter (ligature)
+ | hb_map (hb_add (this))
+ | hb_apply ([c] (const Ligature &_) { _.closure (c); })
+ ;
}
- inline bool would_apply (hb_would_apply_context_t *c) const
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
- unsigned int num_ligs = ligature.len;
- for (unsigned int i = 0; i < num_ligs; i++)
- {
- const Ligature &lig = this+ligature[i];
- if (lig.would_apply (c))
- return_trace (true);
- }
- return_trace (false);
+ + hb_iter (ligature)
+ | hb_map (hb_add (this))
+ | hb_apply ([c] (const Ligature &_) { _.collect_glyphs (c); })
+ ;
}
- inline bool apply (hb_apply_context_t *c) const
+ bool would_apply (hb_would_apply_context_t *c) const
+ {
+ return
+ + hb_iter (ligature)
+ | hb_map (hb_add (this))
+ | hb_map ([c] (const Ligature &_) { return _.would_apply (c); })
+ | hb_any
+ ;
+ }
+
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
unsigned int num_ligs = ligature.len;
@@ -743,26 +894,41 @@ struct LigatureSet
return_trace (false);
}
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &ligatures,
- Supplier<unsigned int> &component_count_list,
- unsigned int num_ligatures,
- Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
+ bool serialize (hb_serialize_context_t *c,
+ hb_array_t<const HBGlyphID> ligatures,
+ hb_array_t<const unsigned int> component_count_list,
+ hb_array_t<const HBGlyphID> &component_list /* Starting from second for each ligature */)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (*this))) return_trace (false);
- if (unlikely (!ligature.serialize (c, num_ligatures))) return_trace (false);
- for (unsigned int i = 0; i < num_ligatures; i++)
- if (unlikely (!ligature[i].serialize (c, this).serialize (c,
- ligatures[i],
- component_list,
- component_count_list[i]))) return_trace (false);
- ligatures.advance (num_ligatures);
- component_count_list.advance (num_ligatures);
+ if (unlikely (!ligature.serialize (c, ligatures.length))) return_trace (false);
+ for (unsigned int i = 0; i < ligatures.length; i++)
+ {
+ unsigned int component_count = (unsigned) hb_max ((int) component_count_list[i] - 1, 0);
+ if (unlikely (!ligature[i].serialize (c, this)
+ .serialize (c,
+ ligatures[i],
+ component_list.sub_array (0, component_count))))
+ return_trace (false);
+ component_list += component_count;
+ }
return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+ + hb_iter (ligature)
+ | hb_filter (subset_offset_array (c, out->ligature, this, out))
+ | hb_drain
+ ;
+ return_trace (bool (out->ligature));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (ligature.sanitize (c, this));
@@ -778,91 +944,116 @@ struct LigatureSet
struct LigatureSubstFormat1
{
- inline void closure (hb_closure_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
{
- TRACE_CLOSURE (this);
- Coverage::Iter iter;
- unsigned int count = ligatureSet.len;
- for (iter.init (this+coverage); iter.more (); iter.next ())
- {
- if (unlikely (iter.get_coverage () >= count))
- break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
- if (c->glyphs->has (iter.get_glyph ()))
- (this+ligatureSet[iter.get_coverage ()]).closure (c);
- }
+ return
+ + hb_zip (this+coverage, ligatureSet)
+ | hb_filter (*glyphs, hb_first)
+ | hb_map (hb_second)
+ | hb_map ([this, glyphs] (const OffsetTo<LigatureSet> &_)
+ { return (this+_).intersects (glyphs); })
+ | hb_any
+ ;
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ void closure (hb_closure_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
- if (unlikely (!(this+coverage).add_coverage (c->input))) return;
- Coverage::Iter iter;
- unsigned int count = ligatureSet.len;
- for (iter.init (this+coverage); iter.more (); iter.next ())
- {
- if (unlikely (iter.get_coverage () >= count))
- break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
- (this+ligatureSet[iter.get_coverage ()]).collect_glyphs (c);
- }
+ + hb_zip (this+coverage, ligatureSet)
+ | hb_filter (*c->glyphs, hb_first)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_apply ([c] (const LigatureSet &_) { _.closure (c); })
+ ;
}
- inline const Coverage &get_coverage (void) const
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- return this+coverage;
+ if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+
+ + hb_zip (this+coverage, ligatureSet)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_apply ([c] (const LigatureSet &_) { _.collect_glyphs (c); })
+ ;
}
- inline bool would_apply (hb_would_apply_context_t *c) const
+ const Coverage &get_coverage () const { return this+coverage; }
+
+ bool would_apply (hb_would_apply_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
unsigned int index = (this+coverage).get_coverage (c->glyphs[0]);
- if (likely (index == NOT_COVERED)) return_trace (false);
+ if (likely (index == NOT_COVERED)) return false;
const LigatureSet &lig_set = this+ligatureSet[index];
- return_trace (lig_set.would_apply (c));
+ return lig_set.would_apply (c);
}
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
- hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
- unsigned int index = (this+coverage).get_coverage (glyph_id);
+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return_trace (false);
const LigatureSet &lig_set = this+ligatureSet[index];
return_trace (lig_set.apply (c));
}
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &first_glyphs,
- Supplier<unsigned int> &ligature_per_first_glyph_count_list,
- unsigned int num_first_glyphs,
- Supplier<GlyphID> &ligatures_list,
- Supplier<unsigned int> &component_count_list,
- Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
+ bool serialize (hb_serialize_context_t *c,
+ hb_sorted_array_t<const HBGlyphID> first_glyphs,
+ hb_array_t<const unsigned int> ligature_per_first_glyph_count_list,
+ hb_array_t<const HBGlyphID> ligatures_list,
+ hb_array_t<const unsigned int> component_count_list,
+ hb_array_t<const HBGlyphID> component_list /* Starting from second for each ligature */)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (*this))) return_trace (false);
- if (unlikely (!ligatureSet.serialize (c, num_first_glyphs))) return_trace (false);
- for (unsigned int i = 0; i < num_first_glyphs; i++)
- if (unlikely (!ligatureSet[i].serialize (c, this).serialize (c,
- ligatures_list,
- component_count_list,
- ligature_per_first_glyph_count_list[i],
- component_list))) return_trace (false);
- ligature_per_first_glyph_count_list.advance (num_first_glyphs);
- if (unlikely (!coverage.serialize (c, this).serialize (c, first_glyphs, num_first_glyphs))) return_trace (false);
- return_trace (true);
+ if (unlikely (!ligatureSet.serialize (c, first_glyphs.length))) return_trace (false);
+ for (unsigned int i = 0; i < first_glyphs.length; i++)
+ {
+ unsigned int ligature_count = ligature_per_first_glyph_count_list[i];
+ if (unlikely (!ligatureSet[i].serialize (c, this)
+ .serialize (c,
+ ligatures_list.sub_array (0, ligature_count),
+ component_count_list.sub_array (0, ligature_count),
+ component_list))) return_trace (false);
+ ligatures_list += ligature_count;
+ component_count_list += ligature_count;
+ }
+ return_trace (coverage.serialize (c, this).serialize (c, first_glyphs));
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+ out->format = format;
+
+ hb_sorted_vector_t<hb_codepoint_t> new_coverage;
+ + hb_zip (this+coverage, ligatureSet)
+ | hb_filter (glyphset, hb_first)
+ | hb_filter (subset_offset_array (c, out->ligatureSet, this, out), hb_second)
+ | hb_map (hb_first)
+ | hb_map (glyph_map)
+ | hb_sink (new_coverage)
+ ;
+ out->coverage.serialize (c->serializer, out)
+ .serialize (c->serializer, new_coverage.iter ());
+ return_trace (bool (new_coverage));
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && ligatureSet.sanitize (c, this));
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 format; /* Format identifier--format = 1 */
OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from
* beginning of Substitution table */
@@ -875,23 +1066,21 @@ struct LigatureSubstFormat1
struct LigatureSubst
{
- inline bool serialize (hb_serialize_context_t *c,
- Supplier<GlyphID> &first_glyphs,
- Supplier<unsigned int> &ligature_per_first_glyph_count_list,
- unsigned int num_first_glyphs,
- Supplier<GlyphID> &ligatures_list,
- Supplier<unsigned int> &component_count_list,
- Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
+ bool serialize (hb_serialize_context_t *c,
+ hb_sorted_array_t<const HBGlyphID> first_glyphs,
+ hb_array_t<const unsigned int> ligature_per_first_glyph_count_list,
+ hb_array_t<const HBGlyphID> ligatures_list,
+ hb_array_t<const unsigned int> component_count_list,
+ hb_array_t<const HBGlyphID> component_list /* Starting from second for each ligature */)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (u.format))) return_trace (false);
unsigned int format = 1;
- u.format.set (format);
+ u.format = format;
switch (u.format) {
case 1: return_trace (u.format1.serialize (c,
first_glyphs,
ligature_per_first_glyph_count_list,
- num_first_glyphs,
ligatures_list,
component_count_list,
component_list));
@@ -899,20 +1088,20 @@ struct LigatureSubst
}
}
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
LigatureSubstFormat1 format1;
} u;
};
@@ -924,46 +1113,52 @@ struct ChainContextSubst : ChainContext {};
struct ExtensionSubst : Extension<ExtensionSubst>
{
- typedef struct SubstLookupSubTable LookupSubTable;
+ typedef struct SubstLookupSubTable SubTable;
- inline bool is_reverse (void) const;
+ bool is_reverse () const;
};
struct ReverseChainSingleSubstFormat1
{
- inline void closure (hb_closure_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
{
- TRACE_CLOSURE (this);
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+ if (!(this+coverage).intersects (glyphs))
+ return false;
+
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
unsigned int count;
count = backtrack.len;
for (unsigned int i = 0; i < count; i++)
- if (!(this+backtrack[i]).intersects (c->glyphs))
- return;
+ if (!(this+backtrack[i]).intersects (glyphs))
+ return false;
count = lookahead.len;
for (unsigned int i = 0; i < count; i++)
- if (!(this+lookahead[i]).intersects (c->glyphs))
- return;
+ if (!(this+lookahead[i]).intersects (glyphs))
+ return false;
- const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
- Coverage::Iter iter;
- count = substitute.len;
- for (iter.init (this+coverage); iter.more (); iter.next ())
- {
- if (unlikely (iter.get_coverage () >= count))
- break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
- if (c->glyphs->has (iter.get_glyph ()))
- c->glyphs->add (substitute[iter.get_coverage ()]);
- }
+ return true;
+ }
+
+ void closure (hb_closure_context_t *c) const
+ {
+ if (!intersects (c->glyphs)) return;
+
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+ const ArrayOf<HBGlyphID> &substitute = StructAfter<ArrayOf<HBGlyphID>> (lookahead);
+
+ + hb_zip (this+coverage, substitute)
+ | hb_filter (*c->glyphs, hb_first)
+ | hb_map (hb_second)
+ | hb_sink (c->output)
+ ;
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
if (unlikely (!(this+coverage).add_coverage (c->input))) return;
unsigned int count;
@@ -972,28 +1167,22 @@ struct ReverseChainSingleSubstFormat1
for (unsigned int i = 0; i < count; i++)
if (unlikely (!(this+backtrack[i]).add_coverage (c->before))) return;
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
count = lookahead.len;
for (unsigned int i = 0; i < count; i++)
if (unlikely (!(this+lookahead[i]).add_coverage (c->after))) return;
- const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
+ const ArrayOf<HBGlyphID> &substitute = StructAfter<ArrayOf<HBGlyphID>> (lookahead);
count = substitute.len;
- c->output->add_array (substitute.array, substitute.len);
+ c->output->add_array (substitute.arrayZ, substitute.len);
}
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
+ const Coverage &get_coverage () const { return this+coverage; }
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
- return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
- }
+ bool would_apply (hb_would_apply_context_t *c) const
+ { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; }
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL))
@@ -1002,16 +1191,16 @@ struct ReverseChainSingleSubstFormat1
unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return_trace (false);
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
- const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+ const ArrayOf<HBGlyphID> &substitute = StructAfter<ArrayOf<HBGlyphID>> (lookahead);
unsigned int start_index = 0, end_index = 0;
if (match_backtrack (c,
- backtrack.len, (UINT16 *) backtrack.array,
+ backtrack.len, (HBUINT16 *) backtrack.arrayZ,
match_coverage, this,
&start_index) &&
- match_lookahead (c,
- lookahead.len, (UINT16 *) lookahead.array,
+ match_lookahead (c,
+ lookahead.len, (HBUINT16 *) lookahead.arrayZ,
match_coverage, this,
1, &end_index))
{
@@ -1026,32 +1215,39 @@ struct ReverseChainSingleSubstFormat1
return_trace (false);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ // TODO(subset)
+ return_trace (false);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this)))
return_trace (false);
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
if (!lookahead.sanitize (c, this))
return_trace (false);
- const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
+ const ArrayOf<HBGlyphID> &substitute = StructAfter<ArrayOf<HBGlyphID>> (lookahead);
return_trace (substitute.sanitize (c));
}
protected:
- UINT16 format; /* Format identifier--format = 1 */
+ HBUINT16 format; /* Format identifier--format = 1 */
OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from
* beginning of table */
OffsetArrayOf<Coverage>
backtrack; /* Array of coverage tables
- * in backtracking sequence, in glyph
+ * in backtracking sequence, in glyph
* sequence order */
OffsetArrayOf<Coverage>
lookaheadX; /* Array of coverage tables
* in lookahead sequence, in glyph
* sequence order */
- ArrayOf<GlyphID>
+ ArrayOf<HBGlyphID>
substituteX; /* Array of substitute
* GlyphIDs--ordered by Coverage Index */
public:
@@ -1060,20 +1256,20 @@ struct ReverseChainSingleSubstFormat1
struct ReverseChainSingleSubst
{
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 format; /* Format identifier */
+ HBUINT16 format; /* Format identifier */
ReverseChainSingleSubstFormat1 format1;
} u;
};
@@ -1086,6 +1282,7 @@ struct ReverseChainSingleSubst
struct SubstLookupSubTable
{
+ friend struct Lookup;
friend struct SubstLookup;
enum Type {
@@ -1099,27 +1296,25 @@ struct SubstLookupSubTable
ReverseChainSingle = 8
};
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts&&... ds) const
{
TRACE_DISPATCH (this, lookup_type);
- if (unlikely (!c->may_dispatch (this, &u.sub_format))) return_trace (c->no_dispatch_return_value ());
switch (lookup_type) {
- case Single: return_trace (u.single.dispatch (c));
- case Multiple: return_trace (u.multiple.dispatch (c));
- case Alternate: return_trace (u.alternate.dispatch (c));
- case Ligature: return_trace (u.ligature.dispatch (c));
- case Context: return_trace (u.context.dispatch (c));
- case ChainContext: return_trace (u.chainContext.dispatch (c));
- case Extension: return_trace (u.extension.dispatch (c));
- case ReverseChainSingle: return_trace (u.reverseChainContextSingle.dispatch (c));
+ case Single: return_trace (u.single.dispatch (c, hb_forward<Ts> (ds)...));
+ case Multiple: return_trace (u.multiple.dispatch (c, hb_forward<Ts> (ds)...));
+ case Alternate: return_trace (u.alternate.dispatch (c, hb_forward<Ts> (ds)...));
+ case Ligature: return_trace (u.ligature.dispatch (c, hb_forward<Ts> (ds)...));
+ case Context: return_trace (u.context.dispatch (c, hb_forward<Ts> (ds)...));
+ case ChainContext: return_trace (u.chainContext.dispatch (c, hb_forward<Ts> (ds)...));
+ case Extension: return_trace (u.extension.dispatch (c, hb_forward<Ts> (ds)...));
+ case ReverseChainSingle: return_trace (u.reverseChainContextSingle.dispatch (c, hb_forward<Ts> (ds)...));
default: return_trace (c->default_return_value ());
}
}
protected:
union {
- UINT16 sub_format;
SingleSubst single;
MultipleSubst multiple;
AlternateSubst alternate;
@@ -1130,224 +1325,217 @@ struct SubstLookupSubTable
ReverseChainSingleSubst reverseChainContextSingle;
} u;
public:
- DEFINE_SIZE_UNION (2, sub_format);
+ DEFINE_SIZE_MIN (0);
};
struct SubstLookup : Lookup
{
- inline const SubstLookupSubTable& get_subtable (unsigned int i) const
- { return Lookup::get_subtable<SubstLookupSubTable> (i); }
+ typedef SubstLookupSubTable SubTable;
- inline static bool lookup_type_is_reverse (unsigned int lookup_type)
- { return lookup_type == SubstLookupSubTable::ReverseChainSingle; }
+ const SubTable& get_subtable (unsigned int i) const
+ { return Lookup::get_subtable<SubTable> (i); }
- inline bool is_reverse (void) const
+ HB_INTERNAL static bool lookup_type_is_reverse (unsigned int lookup_type)
+ { return lookup_type == SubTable::ReverseChainSingle; }
+
+ bool is_reverse () const
{
unsigned int type = get_type ();
- if (unlikely (type == SubstLookupSubTable::Extension))
+ if (unlikely (type == SubTable::Extension))
return CastR<ExtensionSubst> (get_subtable(0)).is_reverse ();
return lookup_type_is_reverse (type);
}
- inline bool apply (hb_apply_context_t *c) const
+ bool apply (hb_ot_apply_context_t *c) const
{
TRACE_APPLY (this);
return_trace (dispatch (c));
}
- inline hb_closure_context_t::return_t closure (hb_closure_context_t *c) const
+ bool intersects (const hb_set_t *glyphs) const
{
- TRACE_CLOSURE (this);
- c->set_recurse_func (dispatch_recurse_func<hb_closure_context_t>);
- return_trace (dispatch (c));
+ hb_intersects_context_t c (glyphs);
+ return dispatch (&c);
}
- inline hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs_context_t *c) const
+ hb_closure_context_t::return_t closure (hb_closure_context_t *c, unsigned int this_index) const
+ {
+ if (!c->should_visit_lookup (this_index))
+ return hb_closure_context_t::default_return_value ();
+
+ c->set_recurse_func (dispatch_closure_recurse_func);
+
+ hb_closure_context_t::return_t ret = dispatch (c);
+
+ c->flush ();
+
+ return ret;
+ }
+
+ hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
c->set_recurse_func (dispatch_recurse_func<hb_collect_glyphs_context_t>);
- return_trace (dispatch (c));
+ return dispatch (c);
}
template <typename set_t>
- inline void add_coverage (set_t *glyphs) const
+ void add_coverage (set_t *glyphs) const
{
hb_add_coverage_context_t<set_t> c (glyphs);
dispatch (&c);
}
- inline bool would_apply (hb_would_apply_context_t *c,
- const hb_ot_layout_lookup_accelerator_t *accel) const
+ bool would_apply (hb_would_apply_context_t *c,
+ const hb_ot_layout_lookup_accelerator_t *accel) const
{
- TRACE_WOULD_APPLY (this);
- if (unlikely (!c->len)) return_trace (false);
- if (!accel->may_have (c->glyphs[0])) return_trace (false);
- return_trace (dispatch (c));
+ if (unlikely (!c->len)) return false;
+ if (!accel->may_have (c->glyphs[0])) return false;
+ return dispatch (c);
}
- static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
+ HB_INTERNAL static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
- inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c,
- unsigned int i)
- { return get_subtables<SubstLookupSubTable> ()[i].serialize (c, this); }
+ SubTable& serialize_subtable (hb_serialize_context_t *c,
+ unsigned int i)
+ { return get_subtables<SubTable> ()[i].serialize (c, this); }
- inline bool serialize_single (hb_serialize_context_t *c,
- uint32_t lookup_props,
- Supplier<GlyphID> &glyphs,
- Supplier<GlyphID> &substitutes,
- unsigned int num_glyphs)
+ bool serialize_single (hb_serialize_context_t *c,
+ uint32_t lookup_props,
+ hb_sorted_array_t<const HBGlyphID> glyphs,
+ hb_array_t<const HBGlyphID> substitutes)
{
TRACE_SERIALIZE (this);
- if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Single, lookup_props, 1))) return_trace (false);
- return_trace (serialize_subtable (c, 0).u.single.serialize (c, glyphs, substitutes, num_glyphs));
+ if (unlikely (!Lookup::serialize (c, SubTable::Single, lookup_props, 1))) return_trace (false);
+ return_trace (serialize_subtable (c, 0).u.single.
+ serialize (c, hb_zip (glyphs, substitutes)));
}
- inline bool serialize_multiple (hb_serialize_context_t *c,
- uint32_t lookup_props,
- Supplier<GlyphID> &glyphs,
- Supplier<unsigned int> &substitute_len_list,
- unsigned int num_glyphs,
- Supplier<GlyphID> &substitute_glyphs_list)
+ bool serialize_multiple (hb_serialize_context_t *c,
+ uint32_t lookup_props,
+ hb_sorted_array_t<const HBGlyphID> glyphs,
+ hb_array_t<const unsigned int> substitute_len_list,
+ hb_array_t<const HBGlyphID> substitute_glyphs_list)
{
TRACE_SERIALIZE (this);
- if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Multiple, lookup_props, 1))) return_trace (false);
- return_trace (serialize_subtable (c, 0).u.multiple.serialize (c,
- glyphs,
- substitute_len_list,
- num_glyphs,
- substitute_glyphs_list));
+ if (unlikely (!Lookup::serialize (c, SubTable::Multiple, lookup_props, 1))) return_trace (false);
+ return_trace (serialize_subtable (c, 0).u.multiple.
+ serialize (c,
+ glyphs,
+ substitute_len_list,
+ substitute_glyphs_list));
}
- inline bool serialize_alternate (hb_serialize_context_t *c,
- uint32_t lookup_props,
- Supplier<GlyphID> &glyphs,
- Supplier<unsigned int> &alternate_len_list,
- unsigned int num_glyphs,
- Supplier<GlyphID> &alternate_glyphs_list)
+ bool serialize_alternate (hb_serialize_context_t *c,
+ uint32_t lookup_props,
+ hb_sorted_array_t<const HBGlyphID> glyphs,
+ hb_array_t<const unsigned int> alternate_len_list,
+ hb_array_t<const HBGlyphID> alternate_glyphs_list)
{
TRACE_SERIALIZE (this);
- if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Alternate, lookup_props, 1))) return_trace (false);
- return_trace (serialize_subtable (c, 0).u.alternate.serialize (c,
- glyphs,
- alternate_len_list,
- num_glyphs,
- alternate_glyphs_list));
- }
-
- inline bool serialize_ligature (hb_serialize_context_t *c,
- uint32_t lookup_props,
- Supplier<GlyphID> &first_glyphs,
- Supplier<unsigned int> &ligature_per_first_glyph_count_list,
- unsigned int num_first_glyphs,
- Supplier<GlyphID> &ligatures_list,
- Supplier<unsigned int> &component_count_list,
- Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
+ if (unlikely (!Lookup::serialize (c, SubTable::Alternate, lookup_props, 1))) return_trace (false);
+ return_trace (serialize_subtable (c, 0).u.alternate.
+ serialize (c,
+ glyphs,
+ alternate_len_list,
+ alternate_glyphs_list));
+ }
+
+ bool serialize_ligature (hb_serialize_context_t *c,
+ uint32_t lookup_props,
+ hb_sorted_array_t<const HBGlyphID> first_glyphs,
+ hb_array_t<const unsigned int> ligature_per_first_glyph_count_list,
+ hb_array_t<const HBGlyphID> ligatures_list,
+ hb_array_t<const unsigned int> component_count_list,
+ hb_array_t<const HBGlyphID> component_list /* Starting from second for each ligature */)
{
TRACE_SERIALIZE (this);
- if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Ligature, lookup_props, 1))) return_trace (false);
- return_trace (serialize_subtable (c, 0).u.ligature.serialize (c,
- first_glyphs,
- ligature_per_first_glyph_count_list,
- num_first_glyphs,
- ligatures_list,
- component_count_list,
- component_list));
+ if (unlikely (!Lookup::serialize (c, SubTable::Ligature, lookup_props, 1))) return_trace (false);
+ return_trace (serialize_subtable (c, 0).u.ligature.
+ serialize (c,
+ first_glyphs,
+ ligature_per_first_glyph_count_list,
+ ligatures_list,
+ component_count_list,
+ component_list));
}
template <typename context_t>
- static inline typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
-
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
- { return Lookup::dispatch<SubstLookupSubTable> (c); }
+ HB_INTERNAL static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
- inline bool sanitize (hb_sanitize_context_t *c) const
+ HB_INTERNAL static hb_closure_context_t::return_t dispatch_closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index)
{
- TRACE_SANITIZE (this);
- if (unlikely (!Lookup::sanitize (c))) return_trace (false);
- if (unlikely (!dispatch (c))) return_trace (false);
+ if (!c->should_visit_lookup (lookup_index))
+ return hb_empty_t ();
- if (unlikely (get_type () == SubstLookupSubTable::Extension))
- {
- /* The spec says all subtables of an Extension lookup should
- * have the same type, which shall not be the Extension type
- * itself. This is specially important if one has a reverse type! */
- unsigned int type = get_subtable (0).u.extension.get_type ();
- if (unlikely (type == SubstLookupSubTable::Extension))
- return_trace (false);
- unsigned int count = get_subtable_count ();
- for (unsigned int i = 1; i < count; i++)
- if (get_subtable (i).u.extension.get_type () != type)
- return_trace (false);
- }
- return_trace (true);
+ hb_closure_context_t::return_t ret = dispatch_recurse_func (c, lookup_index);
+
+ /* While in theory we should flush here, it will cause timeouts because a recursive
+ * lookup can keep growing the glyph set. Skip, and outer loop will retry up to
+ * HB_CLOSURE_MAX_STAGES time, which should be enough for every realistic font. */
+ //c->flush ();
+
+ return ret;
}
-};
-typedef OffsetListOf<SubstLookup> SubstLookupList;
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+ { return Lookup::dispatch<SubTable> (c, hb_forward<Ts> (ds)...); }
+
+ bool subset (hb_subset_context_t *c) const
+ { return Lookup::subset<SubTable> (c); }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ { return Lookup::sanitize<SubTable> (c); }
+};
/*
- * GSUB -- The Glyph Substitution Table
+ * GSUB -- Glyph Substitution
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/gsub
*/
struct GSUB : GSUBGPOS
{
- static const hb_tag_t tableTag = HB_OT_TAG_GSUB;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_GSUB;
- inline const SubstLookup& get_lookup (unsigned int i) const
+ const SubstLookup& get_lookup (unsigned int i) const
{ return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); }
- static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
+ bool subset (hb_subset_context_t *c) const
+ { return GSUBGPOS::subset<SubstLookup> (c); }
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (unlikely (!GSUBGPOS::sanitize (c))) return_trace (false);
- const OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList);
- return_trace (list.sanitize (c, this));
- }
-};
+ bool sanitize (hb_sanitize_context_t *c) const
+ { return GSUBGPOS::sanitize<SubstLookup> (c); }
+ HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+ hb_face_t *face) const;
-void
-GSUB::substitute_start (hb_font_t *font, hb_buffer_t *buffer)
-{
- _hb_buffer_assert_gsubgpos_vars (buffer);
+ typedef GSUBGPOS::accelerator_t<GSUB> accelerator_t;
+};
- const GDEF &gdef = *hb_ot_layout_from_face (font->face)->gdef;
- unsigned int count = buffer->len;
- for (unsigned int i = 0; i < count; i++)
- {
- _hb_glyph_info_set_glyph_props (&buffer->info[i], gdef.get_glyph_props (buffer->info[i].codepoint));
- _hb_glyph_info_clear_lig_props (&buffer->info[i]);
- buffer->info[i].syllable() = 0;
- }
-}
+
+struct GSUB_accelerator_t : GSUB::accelerator_t {};
/* Out-of-class implementation for methods recursing */
-/*static*/ inline bool ExtensionSubst::is_reverse (void) const
+#ifndef HB_NO_OT_LAYOUT
+/*static*/ inline bool ExtensionSubst::is_reverse () const
{
unsigned int type = get_type ();
- if (unlikely (type == SubstLookupSubTable::Extension))
- return CastR<ExtensionSubst> (get_subtable<LookupSubTable>()).is_reverse ();
+ if (unlikely (type == SubTable::Extension))
+ return CastR<ExtensionSubst> (get_subtable<SubTable>()).is_reverse ();
return SubstLookup::lookup_type_is_reverse (type);
}
-
template <typename context_t>
/*static*/ inline typename context_t::return_t SubstLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index)
{
- const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
- const SubstLookup &l = gsub.get_lookup (lookup_index);
+ const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index);
return l.dispatch (c);
}
-
-/*static*/ inline bool SubstLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index)
+/*static*/ inline bool SubstLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
{
- const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
- const SubstLookup &l = gsub.get_lookup (lookup_index);
+ const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index);
unsigned int saved_lookup_props = c->lookup_props;
unsigned int saved_lookup_index = c->lookup_index;
c->set_lookup_index (lookup_index);
@@ -1357,6 +1545,7 @@ template <typename context_t>
c->set_lookup_props (saved_lookup_props);
return ret;
}
+#endif
} /* namespace OT */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
deleted file mode 100644
index b08a59138e..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
+++ /dev/null
@@ -1,2373 +0,0 @@
-/*
- * Copyright © 2007,2008,2009,2010 Red Hat, Inc.
- * Copyright © 2010,2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_LAYOUT_GSUBGPOS_PRIVATE_HH
-#define HB_OT_LAYOUT_GSUBGPOS_PRIVATE_HH
-
-#include "hb-private.hh"
-#include "hb-debug.hh"
-#include "hb-buffer-private.hh"
-#include "hb-ot-layout-gdef-table.hh"
-#include "hb-set-private.hh"
-
-
-namespace OT {
-
-
-struct hb_closure_context_t :
- hb_dispatch_context_t<hb_closure_context_t, hb_void_t, HB_DEBUG_CLOSURE>
-{
- inline const char *get_name (void) { return "CLOSURE"; }
- typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
- template <typename T>
- inline return_t dispatch (const T &obj) { obj.closure (this); return HB_VOID; }
- static return_t default_return_value (void) { return HB_VOID; }
- bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return false; }
- return_t recurse (unsigned int lookup_index)
- {
- if (unlikely (nesting_level_left == 0 || !recurse_func))
- return default_return_value ();
-
- nesting_level_left--;
- recurse_func (this, lookup_index);
- nesting_level_left++;
- return HB_VOID;
- }
-
- hb_face_t *face;
- hb_set_t *glyphs;
- recurse_func_t recurse_func;
- unsigned int nesting_level_left;
- unsigned int debug_depth;
-
- hb_closure_context_t (hb_face_t *face_,
- hb_set_t *glyphs_,
- unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
- face (face_),
- glyphs (glyphs_),
- recurse_func (nullptr),
- nesting_level_left (nesting_level_left_),
- debug_depth (0) {}
-
- void set_recurse_func (recurse_func_t func) { recurse_func = func; }
-};
-
-
-struct hb_would_apply_context_t :
- hb_dispatch_context_t<hb_would_apply_context_t, bool, HB_DEBUG_WOULD_APPLY>
-{
- inline const char *get_name (void) { return "WOULD_APPLY"; }
- template <typename T>
- inline return_t dispatch (const T &obj) { return obj.would_apply (this); }
- static return_t default_return_value (void) { return false; }
- bool stop_sublookup_iteration (return_t r) const { return r; }
-
- hb_face_t *face;
- const hb_codepoint_t *glyphs;
- unsigned int len;
- bool zero_context;
- unsigned int debug_depth;
-
- hb_would_apply_context_t (hb_face_t *face_,
- const hb_codepoint_t *glyphs_,
- unsigned int len_,
- bool zero_context_) :
- face (face_),
- glyphs (glyphs_),
- len (len_),
- zero_context (zero_context_),
- debug_depth (0) {}
-};
-
-
-struct hb_collect_glyphs_context_t :
- hb_dispatch_context_t<hb_collect_glyphs_context_t, hb_void_t, HB_DEBUG_COLLECT_GLYPHS>
-{
- inline const char *get_name (void) { return "COLLECT_GLYPHS"; }
- typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
- template <typename T>
- inline return_t dispatch (const T &obj) { obj.collect_glyphs (this); return HB_VOID; }
- static return_t default_return_value (void) { return HB_VOID; }
- bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return false; }
- return_t recurse (unsigned int lookup_index)
- {
- if (unlikely (nesting_level_left == 0 || !recurse_func))
- return default_return_value ();
-
- /* Note that GPOS sets recurse_func to nullptr already, so it doesn't get
- * past the previous check. For GSUB, we only want to collect the output
- * glyphs in the recursion. If output is not requested, we can go home now.
- *
- * Note further, that the above is not exactly correct. A recursed lookup
- * is allowed to match input that is not matched in the context, but that's
- * not how most fonts are built. It's possible to relax that and recurse
- * with all sets here if it proves to be an issue.
- */
-
- if (output == hb_set_get_empty ())
- return HB_VOID;
-
- /* Return if new lookup was recursed to before. */
- if (recursed_lookups->has (lookup_index))
- return HB_VOID;
-
- hb_set_t *old_before = before;
- hb_set_t *old_input = input;
- hb_set_t *old_after = after;
- before = input = after = hb_set_get_empty ();
-
- nesting_level_left--;
- recurse_func (this, lookup_index);
- nesting_level_left++;
-
- before = old_before;
- input = old_input;
- after = old_after;
-
- recursed_lookups->add (lookup_index);
-
- return HB_VOID;
- }
-
- hb_face_t *face;
- hb_set_t *before;
- hb_set_t *input;
- hb_set_t *after;
- hb_set_t *output;
- recurse_func_t recurse_func;
- hb_set_t *recursed_lookups;
- unsigned int nesting_level_left;
- unsigned int debug_depth;
-
- hb_collect_glyphs_context_t (hb_face_t *face_,
- hb_set_t *glyphs_before, /* OUT. May be nullptr */
- hb_set_t *glyphs_input, /* OUT. May be nullptr */
- hb_set_t *glyphs_after, /* OUT. May be nullptr */
- hb_set_t *glyphs_output, /* OUT. May be nullptr */
- unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
- face (face_),
- before (glyphs_before ? glyphs_before : hb_set_get_empty ()),
- input (glyphs_input ? glyphs_input : hb_set_get_empty ()),
- after (glyphs_after ? glyphs_after : hb_set_get_empty ()),
- output (glyphs_output ? glyphs_output : hb_set_get_empty ()),
- recurse_func (nullptr),
- recursed_lookups (nullptr),
- nesting_level_left (nesting_level_left_),
- debug_depth (0)
- {
- recursed_lookups = hb_set_create ();
- }
- ~hb_collect_glyphs_context_t (void)
- {
- hb_set_destroy (recursed_lookups);
- }
-
- void set_recurse_func (recurse_func_t func) { recurse_func = func; }
-};
-
-
-
-/* XXX Can we remove this? */
-
-template <typename set_t>
-struct hb_add_coverage_context_t :
- hb_dispatch_context_t<hb_add_coverage_context_t<set_t>, const Coverage &, HB_DEBUG_GET_COVERAGE>
-{
- inline const char *get_name (void) { return "GET_COVERAGE"; }
- typedef const Coverage &return_t;
- template <typename T>
- inline return_t dispatch (const T &obj) { return obj.get_coverage (); }
- static return_t default_return_value (void) { return Null(Coverage); }
- bool stop_sublookup_iteration (return_t r) const
- {
- r.add_coverage (set);
- return false;
- }
-
- hb_add_coverage_context_t (set_t *set_) :
- set (set_),
- debug_depth (0) {}
-
- set_t *set;
- unsigned int debug_depth;
-};
-
-
-struct hb_apply_context_t :
- hb_dispatch_context_t<hb_apply_context_t, bool, HB_DEBUG_APPLY>
-{
- struct matcher_t
- {
- inline matcher_t (void) :
- lookup_props (0),
- ignore_zwnj (false),
- ignore_zwj (false),
- mask (-1),
-#define arg1(arg) (arg) /* Remove the macro to see why it's needed! */
- syllable arg1(0),
-#undef arg1
- match_func (nullptr),
- match_data (nullptr) {};
-
- typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const UINT16 &value, const void *data);
-
- inline void set_ignore_zwnj (bool ignore_zwnj_) { ignore_zwnj = ignore_zwnj_; }
- inline void set_ignore_zwj (bool ignore_zwj_) { ignore_zwj = ignore_zwj_; }
- inline void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
- inline void set_mask (hb_mask_t mask_) { mask = mask_; }
- inline void set_syllable (uint8_t syllable_) { syllable = syllable_; }
- inline void set_match_func (match_func_t match_func_,
- const void *match_data_)
- { match_func = match_func_; match_data = match_data_; }
-
- enum may_match_t {
- MATCH_NO,
- MATCH_YES,
- MATCH_MAYBE
- };
-
- inline may_match_t may_match (const hb_glyph_info_t &info,
- const UINT16 *glyph_data) const
- {
- if (!(info.mask & mask) ||
- (syllable && syllable != info.syllable ()))
- return MATCH_NO;
-
- if (match_func)
- return match_func (info.codepoint, *glyph_data, match_data) ? MATCH_YES : MATCH_NO;
-
- return MATCH_MAYBE;
- }
-
- enum may_skip_t {
- SKIP_NO,
- SKIP_YES,
- SKIP_MAYBE
- };
-
- inline may_skip_t
- may_skip (const hb_apply_context_t *c,
- const hb_glyph_info_t &info) const
- {
- if (!c->check_glyph_property (&info, lookup_props))
- return SKIP_YES;
-
- if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_hidden (&info) &&
- (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
- (ignore_zwj || !_hb_glyph_info_is_zwj (&info))))
- return SKIP_MAYBE;
-
- return SKIP_NO;
- }
-
- protected:
- unsigned int lookup_props;
- bool ignore_zwnj;
- bool ignore_zwj;
- hb_mask_t mask;
- uint8_t syllable;
- match_func_t match_func;
- const void *match_data;
- };
-
- struct skipping_iterator_t
- {
- inline void init (hb_apply_context_t *c_, bool context_match = false)
- {
- c = c_;
- match_glyph_data = nullptr;
- matcher.set_match_func (nullptr, nullptr);
- matcher.set_lookup_props (c->lookup_props);
- /* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */
- matcher.set_ignore_zwnj (c->table_index == 1 || (context_match && c->auto_zwnj));
- /* Ignore ZWJ if we are matching GSUB context, or matching GPOS, or if asked to. */
- matcher.set_ignore_zwj (c->table_index == 1 || (context_match || c->auto_zwj));
- matcher.set_mask (context_match ? -1 : c->lookup_mask);
- }
- inline void set_lookup_props (unsigned int lookup_props)
- {
- matcher.set_lookup_props (lookup_props);
- }
- inline void set_match_func (matcher_t::match_func_t match_func_,
- const void *match_data_,
- const UINT16 glyph_data[])
- {
- matcher.set_match_func (match_func_, match_data_);
- match_glyph_data = glyph_data;
- }
-
- inline void reset (unsigned int start_index_,
- unsigned int num_items_)
- {
- idx = start_index_;
- num_items = num_items_;
- end = c->buffer->len;
- matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0);
- }
-
- inline void reject (void) { num_items++; match_glyph_data--; }
-
- inline matcher_t::may_skip_t
- may_skip (const hb_apply_context_t *c,
- const hb_glyph_info_t &info) const
- {
- return matcher.may_skip (c, info);
- }
-
- inline bool next (void)
- {
- assert (num_items > 0);
- while (idx + num_items < end)
- {
- idx++;
- const hb_glyph_info_t &info = c->buffer->info[idx];
-
- matcher_t::may_skip_t skip = matcher.may_skip (c, info);
- if (unlikely (skip == matcher_t::SKIP_YES))
- continue;
-
- matcher_t::may_match_t match = matcher.may_match (info, match_glyph_data);
- if (match == matcher_t::MATCH_YES ||
- (match == matcher_t::MATCH_MAYBE &&
- skip == matcher_t::SKIP_NO))
- {
- num_items--;
- match_glyph_data++;
- return true;
- }
-
- if (skip == matcher_t::SKIP_NO)
- return false;
- }
- return false;
- }
- inline bool prev (void)
- {
- assert (num_items > 0);
- while (idx >= num_items)
- {
- idx--;
- const hb_glyph_info_t &info = c->buffer->out_info[idx];
-
- matcher_t::may_skip_t skip = matcher.may_skip (c, info);
- if (unlikely (skip == matcher_t::SKIP_YES))
- continue;
-
- matcher_t::may_match_t match = matcher.may_match (info, match_glyph_data);
- if (match == matcher_t::MATCH_YES ||
- (match == matcher_t::MATCH_MAYBE &&
- skip == matcher_t::SKIP_NO))
- {
- num_items--;
- match_glyph_data++;
- return true;
- }
-
- if (skip == matcher_t::SKIP_NO)
- return false;
- }
- return false;
- }
-
- unsigned int idx;
- protected:
- hb_apply_context_t *c;
- matcher_t matcher;
- const UINT16 *match_glyph_data;
-
- unsigned int num_items;
- unsigned int end;
- };
-
-
- inline const char *get_name (void) { return "APPLY"; }
- typedef return_t (*recurse_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
- template <typename T>
- inline return_t dispatch (const T &obj) { return obj.apply (this); }
- static return_t default_return_value (void) { return false; }
- bool stop_sublookup_iteration (return_t r) const { return r; }
- return_t recurse (unsigned int lookup_index)
- {
- if (unlikely (nesting_level_left == 0 || !recurse_func || buffer->max_ops-- <= 0))
- return default_return_value ();
-
- nesting_level_left--;
- bool ret = recurse_func (this, lookup_index);
- nesting_level_left++;
- return ret;
- }
-
- skipping_iterator_t iter_input, iter_context;
-
- hb_font_t *font;
- hb_face_t *face;
- hb_buffer_t *buffer;
- recurse_func_t recurse_func;
- const GDEF &gdef;
- const VariationStore &var_store;
-
- hb_direction_t direction;
- hb_mask_t lookup_mask;
- unsigned int table_index; /* GSUB/GPOS */
- unsigned int lookup_index;
- unsigned int lookup_props;
- unsigned int nesting_level_left;
- unsigned int debug_depth;
-
- bool auto_zwnj;
- bool auto_zwj;
- bool has_glyph_classes;
-
-
- hb_apply_context_t (unsigned int table_index_,
- hb_font_t *font_,
- hb_buffer_t *buffer_) :
- iter_input (), iter_context (),
- font (font_), face (font->face), buffer (buffer_),
- recurse_func (nullptr),
- gdef (*hb_ot_layout_from_face (face)->gdef),
- var_store (gdef.get_var_store ()),
- direction (buffer_->props.direction),
- lookup_mask (1),
- table_index (table_index_),
- lookup_index ((unsigned int) -1),
- lookup_props (0),
- nesting_level_left (HB_MAX_NESTING_LEVEL),
- debug_depth (0),
- auto_zwnj (true),
- auto_zwj (true),
- has_glyph_classes (gdef.has_glyph_classes ()) {}
-
- inline void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; }
- inline void set_auto_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; }
- inline void set_auto_zwnj (bool auto_zwnj_) { auto_zwnj = auto_zwnj_; }
- inline void set_recurse_func (recurse_func_t func) { recurse_func = func; }
- inline void set_lookup_index (unsigned int lookup_index_) { lookup_index = lookup_index_; }
- inline void set_lookup_props (unsigned int lookup_props_)
- {
- lookup_props = lookup_props_;
- iter_input.init (this, false);
- iter_context.init (this, true);
- }
-
- inline bool
- match_properties_mark (hb_codepoint_t glyph,
- unsigned int glyph_props,
- unsigned int match_props) const
- {
- /* If using mark filtering sets, the high short of
- * match_props has the set index.
- */
- if (match_props & LookupFlag::UseMarkFilteringSet)
- return gdef.mark_set_covers (match_props >> 16, glyph);
-
- /* The second byte of match_props has the meaning
- * "ignore marks of attachment type different than
- * the attachment type specified."
- */
- if (match_props & LookupFlag::MarkAttachmentType)
- return (match_props & LookupFlag::MarkAttachmentType) == (glyph_props & LookupFlag::MarkAttachmentType);
-
- return true;
- }
-
- inline bool
- check_glyph_property (const hb_glyph_info_t *info,
- unsigned int match_props) const
- {
- hb_codepoint_t glyph = info->codepoint;
- unsigned int glyph_props = _hb_glyph_info_get_glyph_props (info);
-
- /* Not covered, if, for example, glyph class is ligature and
- * match_props includes LookupFlags::IgnoreLigatures
- */
- if (glyph_props & match_props & LookupFlag::IgnoreFlags)
- return false;
-
- if (unlikely (glyph_props & HB_OT_LAYOUT_GLYPH_PROPS_MARK))
- return match_properties_mark (glyph, glyph_props, match_props);
-
- return true;
- }
-
- inline void _set_glyph_props (hb_codepoint_t glyph_index,
- unsigned int class_guess = 0,
- bool ligature = false,
- bool component = false) const
- {
- unsigned int add_in = _hb_glyph_info_get_glyph_props (&buffer->cur()) &
- HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE;
- add_in |= HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED;
- if (ligature)
- {
- add_in |= HB_OT_LAYOUT_GLYPH_PROPS_LIGATED;
- /* In the only place that the MULTIPLIED bit is used, Uniscribe
- * seems to only care about the "last" transformation between
- * Ligature and Multiple substitions. Ie. if you ligate, expand,
- * and ligate again, it forgives the multiplication and acts as
- * if only ligation happened. As such, clear MULTIPLIED bit.
- */
- add_in &= ~HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
- }
- if (component)
- add_in |= HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
- if (likely (has_glyph_classes))
- _hb_glyph_info_set_glyph_props (&buffer->cur(), add_in | gdef.get_glyph_props (glyph_index));
- else if (class_guess)
- _hb_glyph_info_set_glyph_props (&buffer->cur(), add_in | class_guess);
- }
-
- inline void replace_glyph (hb_codepoint_t glyph_index) const
- {
- _set_glyph_props (glyph_index);
- buffer->replace_glyph (glyph_index);
- }
- inline void replace_glyph_inplace (hb_codepoint_t glyph_index) const
- {
- _set_glyph_props (glyph_index);
- buffer->cur().codepoint = glyph_index;
- }
- inline void replace_glyph_with_ligature (hb_codepoint_t glyph_index,
- unsigned int class_guess) const
- {
- _set_glyph_props (glyph_index, class_guess, true);
- buffer->replace_glyph (glyph_index);
- }
- inline void output_glyph_for_component (hb_codepoint_t glyph_index,
- unsigned int class_guess) const
- {
- _set_glyph_props (glyph_index, class_guess, false, true);
- buffer->output_glyph (glyph_index);
- }
-};
-
-
-
-typedef bool (*intersects_func_t) (hb_set_t *glyphs, const UINT16 &value, const void *data);
-typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const UINT16 &value, const void *data);
-typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const UINT16 &value, const void *data);
-
-struct ContextClosureFuncs
-{
- intersects_func_t intersects;
-};
-struct ContextCollectGlyphsFuncs
-{
- collect_glyphs_func_t collect;
-};
-struct ContextApplyFuncs
-{
- match_func_t match;
-};
-
-
-static inline bool intersects_glyph (hb_set_t *glyphs, const UINT16 &value, const void *data HB_UNUSED)
-{
- return glyphs->has (value);
-}
-static inline bool intersects_class (hb_set_t *glyphs, const UINT16 &value, const void *data)
-{
- const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
- return class_def.intersects_class (glyphs, value);
-}
-static inline bool intersects_coverage (hb_set_t *glyphs, const UINT16 &value, const void *data)
-{
- const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
- return (data+coverage).intersects (glyphs);
-}
-
-static inline bool intersects_array (hb_closure_context_t *c,
- unsigned int count,
- const UINT16 values[],
- intersects_func_t intersects_func,
- const void *intersects_data)
-{
- for (unsigned int i = 0; i < count; i++)
- if (likely (!intersects_func (c->glyphs, values[i], intersects_data)))
- return false;
- return true;
-}
-
-
-static inline void collect_glyph (hb_set_t *glyphs, const UINT16 &value, const void *data HB_UNUSED)
-{
- glyphs->add (value);
-}
-static inline void collect_class (hb_set_t *glyphs, const UINT16 &value, const void *data)
-{
- const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
- class_def.add_class (glyphs, value);
-}
-static inline void collect_coverage (hb_set_t *glyphs, const UINT16 &value, const void *data)
-{
- const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
- (data+coverage).add_coverage (glyphs);
-}
-static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED,
- hb_set_t *glyphs,
- unsigned int count,
- const UINT16 values[],
- collect_glyphs_func_t collect_func,
- const void *collect_data)
-{
- for (unsigned int i = 0; i < count; i++)
- collect_func (glyphs, values[i], collect_data);
-}
-
-
-static inline bool match_glyph (hb_codepoint_t glyph_id, const UINT16 &value, const void *data HB_UNUSED)
-{
- return glyph_id == value;
-}
-static inline bool match_class (hb_codepoint_t glyph_id, const UINT16 &value, const void *data)
-{
- const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
- return class_def.get_class (glyph_id) == value;
-}
-static inline bool match_coverage (hb_codepoint_t glyph_id, const UINT16 &value, const void *data)
-{
- const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
- return (data+coverage).get_coverage (glyph_id) != NOT_COVERED;
-}
-
-static inline bool would_match_input (hb_would_apply_context_t *c,
- unsigned int count, /* Including the first glyph (not matched) */
- const UINT16 input[], /* Array of input values--start with second glyph */
- match_func_t match_func,
- const void *match_data)
-{
- if (count != c->len)
- return false;
-
- for (unsigned int i = 1; i < count; i++)
- if (likely (!match_func (c->glyphs[i], input[i - 1], match_data)))
- return false;
-
- return true;
-}
-static inline bool match_input (hb_apply_context_t *c,
- unsigned int count, /* Including the first glyph (not matched) */
- const UINT16 input[], /* Array of input values--start with second glyph */
- match_func_t match_func,
- const void *match_data,
- unsigned int *end_offset,
- unsigned int match_positions[HB_MAX_CONTEXT_LENGTH],
- bool *p_is_mark_ligature = nullptr,
- unsigned int *p_total_component_count = nullptr)
-{
- TRACE_APPLY (nullptr);
-
- if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false);
-
- hb_buffer_t *buffer = c->buffer;
-
- hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
- skippy_iter.reset (buffer->idx, count - 1);
- skippy_iter.set_match_func (match_func, match_data, input);
-
- /*
- * This is perhaps the trickiest part of OpenType... Remarks:
- *
- * - If all components of the ligature were marks, we call this a mark ligature.
- *
- * - If there is no GDEF, and the ligature is NOT a mark ligature, we categorize
- * it as a ligature glyph.
- *
- * - Ligatures cannot be formed across glyphs attached to different components
- * of previous ligatures. Eg. the sequence is LAM,SHADDA,LAM,FATHA,HEH, and
- * LAM,LAM,HEH form a ligature, leaving SHADDA,FATHA next to eachother.
- * However, it would be wrong to ligate that SHADDA,FATHA sequence.
- * There are a couple of exceptions to this:
- *
- * o If a ligature tries ligating with marks that belong to it itself, go ahead,
- * assuming that the font designer knows what they are doing (otherwise it can
- * break Indic stuff when a matra wants to ligate with a conjunct,
- *
- * o If two marks want to ligate and they belong to different components of the
- * same ligature glyph, and said ligature glyph is to be ignored according to
- * mark-filtering rules, then allow.
- * https://github.com/harfbuzz/harfbuzz/issues/545
- */
-
- bool is_mark_ligature = _hb_glyph_info_is_mark (&buffer->cur());
-
- unsigned int total_component_count = 0;
- total_component_count += _hb_glyph_info_get_lig_num_comps (&buffer->cur());
-
- unsigned int first_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
- unsigned int first_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
-
- enum {
- LIGBASE_NOT_CHECKED,
- LIGBASE_MAY_NOT_SKIP,
- LIGBASE_MAY_SKIP
- } ligbase = LIGBASE_NOT_CHECKED;
-
- match_positions[0] = buffer->idx;
- for (unsigned int i = 1; i < count; i++)
- {
- if (!skippy_iter.next ()) return_trace (false);
-
- match_positions[i] = skippy_iter.idx;
-
- unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]);
- unsigned int this_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]);
-
- if (first_lig_id && first_lig_comp)
- {
- /* If first component was attached to a previous ligature component,
- * all subsequent components should be attached to the same ligature
- * component, otherwise we shouldn't ligate them... */
- if (first_lig_id != this_lig_id || first_lig_comp != this_lig_comp)
- {
- /* ...unless, we are attached to a base ligature and that base
- * ligature is ignorable. */
- if (ligbase == LIGBASE_NOT_CHECKED)
- {
- bool found = false;
- const hb_glyph_info_t *out = buffer->out_info;
- unsigned int j = buffer->out_len;
- while (j && _hb_glyph_info_get_lig_id (&out[j - 1]) == first_lig_id)
- {
- if (_hb_glyph_info_get_lig_comp (&out[j - 1]) == 0)
- {
- j--;
- found = true;
- break;
- }
- j--;
- }
-
- if (found && skippy_iter.may_skip (c, out[j]) == hb_apply_context_t::matcher_t::SKIP_YES)
- ligbase = LIGBASE_MAY_SKIP;
- else
- ligbase = LIGBASE_MAY_NOT_SKIP;
- }
-
- if (ligbase == LIGBASE_MAY_NOT_SKIP)
- return_trace (false);
- }
- }
- else
- {
- /* If first component was NOT attached to a previous ligature component,
- * all subsequent components should also NOT be attached to any ligature
- * component, unless they are attached to the first component itself! */
- if (this_lig_id && this_lig_comp && (this_lig_id != first_lig_id))
- return_trace (false);
- }
-
- is_mark_ligature = is_mark_ligature && _hb_glyph_info_is_mark (&buffer->info[skippy_iter.idx]);
- total_component_count += _hb_glyph_info_get_lig_num_comps (&buffer->info[skippy_iter.idx]);
- }
-
- *end_offset = skippy_iter.idx - buffer->idx + 1;
-
- if (p_is_mark_ligature)
- *p_is_mark_ligature = is_mark_ligature;
-
- if (p_total_component_count)
- *p_total_component_count = total_component_count;
-
- return_trace (true);
-}
-static inline bool ligate_input (hb_apply_context_t *c,
- unsigned int count, /* Including the first glyph */
- unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
- unsigned int match_length,
- hb_codepoint_t lig_glyph,
- bool is_mark_ligature,
- unsigned int total_component_count)
-{
- TRACE_APPLY (nullptr);
-
- hb_buffer_t *buffer = c->buffer;
-
- buffer->merge_clusters (buffer->idx, buffer->idx + match_length);
-
- /*
- * - If it *is* a mark ligature, we don't allocate a new ligature id, and leave
- * the ligature to keep its old ligature id. This will allow it to attach to
- * a base ligature in GPOS. Eg. if the sequence is: LAM,LAM,SHADDA,FATHA,HEH,
- * and LAM,LAM,HEH for a ligature, they will leave SHADDA and FATHA wit a
- * ligature id and component value of 2. Then if SHADDA,FATHA form a ligature
- * later, we don't want them to lose their ligature id/component, otherwise
- * GPOS will fail to correctly position the mark ligature on top of the
- * LAM,LAM,HEH ligature. See:
- * https://bugzilla.gnome.org/show_bug.cgi?id=676343
- *
- * - If a ligature is formed of components that some of which are also ligatures
- * themselves, and those ligature components had marks attached to *their*
- * components, we have to attach the marks to the new ligature component
- * positions! Now *that*'s tricky! And these marks may be following the
- * last component of the whole sequence, so we should loop forward looking
- * for them and update them.
- *
- * Eg. the sequence is LAM,LAM,SHADDA,FATHA,HEH, and the font first forms a
- * 'calt' ligature of LAM,HEH, leaving the SHADDA and FATHA with a ligature
- * id and component == 1. Now, during 'liga', the LAM and the LAM-HEH ligature
- * form a LAM-LAM-HEH ligature. We need to reassign the SHADDA and FATHA to
- * the new ligature with a component value of 2.
- *
- * This in fact happened to a font... See:
- * https://bugzilla.gnome.org/show_bug.cgi?id=437633
- */
-
- unsigned int klass = is_mark_ligature ? 0 : HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE;
- unsigned int lig_id = is_mark_ligature ? 0 : _hb_allocate_lig_id (buffer);
- unsigned int last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
- unsigned int last_num_components = _hb_glyph_info_get_lig_num_comps (&buffer->cur());
- unsigned int components_so_far = last_num_components;
-
- if (!is_mark_ligature)
- {
- _hb_glyph_info_set_lig_props_for_ligature (&buffer->cur(), lig_id, total_component_count);
- if (_hb_glyph_info_get_general_category (&buffer->cur()) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
- {
- _hb_glyph_info_set_general_category (&buffer->cur(), HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER);
- }
- }
- c->replace_glyph_with_ligature (lig_glyph, klass);
-
- for (unsigned int i = 1; i < count; i++)
- {
- while (buffer->idx < match_positions[i] && !buffer->in_error)
- {
- if (!is_mark_ligature) {
- unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
- if (this_comp == 0)
- this_comp = last_num_components;
- unsigned int new_lig_comp = components_so_far - last_num_components +
- MIN (this_comp, last_num_components);
- _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp);
- }
- buffer->next_glyph ();
- }
-
- last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
- last_num_components = _hb_glyph_info_get_lig_num_comps (&buffer->cur());
- components_so_far += last_num_components;
-
- /* Skip the base glyph */
- buffer->idx++;
- }
-
- if (!is_mark_ligature && last_lig_id) {
- /* Re-adjust components for any marks following. */
- for (unsigned int i = buffer->idx; i < buffer->len; i++) {
- if (last_lig_id == _hb_glyph_info_get_lig_id (&buffer->info[i])) {
- unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->info[i]);
- if (!this_comp)
- break;
- unsigned int new_lig_comp = components_so_far - last_num_components +
- MIN (this_comp, last_num_components);
- _hb_glyph_info_set_lig_props_for_mark (&buffer->info[i], lig_id, new_lig_comp);
- } else
- break;
- }
- }
- return_trace (true);
-}
-
-static inline bool match_backtrack (hb_apply_context_t *c,
- unsigned int count,
- const UINT16 backtrack[],
- match_func_t match_func,
- const void *match_data,
- unsigned int *match_start)
-{
- TRACE_APPLY (nullptr);
-
- hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
- skippy_iter.reset (c->buffer->backtrack_len (), count);
- skippy_iter.set_match_func (match_func, match_data, backtrack);
-
- for (unsigned int i = 0; i < count; i++)
- if (!skippy_iter.prev ())
- return_trace (false);
-
- *match_start = skippy_iter.idx;
-
- return_trace (true);
-}
-
-static inline bool match_lookahead (hb_apply_context_t *c,
- unsigned int count,
- const UINT16 lookahead[],
- match_func_t match_func,
- const void *match_data,
- unsigned int offset,
- unsigned int *end_index)
-{
- TRACE_APPLY (nullptr);
-
- hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
- skippy_iter.reset (c->buffer->idx + offset - 1, count);
- skippy_iter.set_match_func (match_func, match_data, lookahead);
-
- for (unsigned int i = 0; i < count; i++)
- if (!skippy_iter.next ())
- return_trace (false);
-
- *end_index = skippy_iter.idx + 1;
-
- return_trace (true);
-}
-
-
-
-struct LookupRecord
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- UINT16 sequenceIndex; /* Index into current glyph
- * sequence--first glyph = 0 */
- UINT16 lookupListIndex; /* Lookup to apply to that
- * position--zero--based */
- public:
- DEFINE_SIZE_STATIC (4);
-};
-
-
-template <typename context_t>
-static inline void recurse_lookups (context_t *c,
- unsigned int lookupCount,
- const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */)
-{
- for (unsigned int i = 0; i < lookupCount; i++)
- c->recurse (lookupRecord[i].lookupListIndex);
-}
-
-static inline bool apply_lookup (hb_apply_context_t *c,
- unsigned int count, /* Including the first glyph */
- unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
- unsigned int lookupCount,
- const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
- unsigned int match_length)
-{
- TRACE_APPLY (nullptr);
-
- hb_buffer_t *buffer = c->buffer;
- int end;
-
- /* All positions are distance from beginning of *output* buffer.
- * Adjust. */
- {
- unsigned int bl = buffer->backtrack_len ();
- end = bl + match_length;
-
- int delta = bl - buffer->idx;
- /* Convert positions to new indexing. */
- for (unsigned int j = 0; j < count; j++)
- match_positions[j] += delta;
- }
-
- for (unsigned int i = 0; i < lookupCount && !buffer->in_error; i++)
- {
- unsigned int idx = lookupRecord[i].sequenceIndex;
- if (idx >= count)
- continue;
-
- /* Don't recurse to ourself at same position.
- * Note that this test is too naive, it doesn't catch longer loops. */
- if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index)
- continue;
-
- if (unlikely (!buffer->move_to (match_positions[idx])))
- break;
-
- if (unlikely (buffer->max_ops <= 0))
- break;
-
- unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
- if (!c->recurse (lookupRecord[i].lookupListIndex))
- continue;
-
- unsigned int new_len = buffer->backtrack_len () + buffer->lookahead_len ();
- int delta = new_len - orig_len;
-
- if (!delta)
- continue;
-
- /* Recursed lookup changed buffer len. Adjust.
- *
- * TODO:
- *
- * Right now, if buffer length increased by n, we assume n new glyphs
- * were added right after the current position, and if buffer length
- * was decreased by n, we assume n match positions after the current
- * one where removed. The former (buffer length increased) case is
- * fine, but the decrease case can be improved in at least two ways,
- * both of which are significant:
- *
- * - If recursed-to lookup is MultipleSubst and buffer length
- * decreased, then it's current match position that was deleted,
- * NOT the one after it.
- *
- * - If buffer length was decreased by n, it does not necessarily
- * mean that n match positions where removed, as there might
- * have been marks and default-ignorables in the sequence. We
- * should instead drop match positions between current-position
- * and current-position + n instead.
- *
- * It should be possible to construct tests for both of these cases.
- */
-
- end += delta;
- if (end <= int (match_positions[idx]))
- {
- /* End might end up being smaller than match_positions[idx] if the recursed
- * lookup ended up removing many items, more than we have had matched.
- * Just never rewind end back and get out of here.
- * https://bugs.chromium.org/p/chromium/issues/detail?id=659496 */
- end = match_positions[idx];
- /* There can't be any further changes. */
- break;
- }
-
- unsigned int next = idx + 1; /* next now is the position after the recursed lookup. */
-
- if (delta > 0)
- {
- if (unlikely (delta + count > HB_MAX_CONTEXT_LENGTH))
- break;
- }
- else
- {
- /* NOTE: delta is negative. */
- delta = MAX (delta, (int) next - (int) count);
- next -= delta;
- }
-
- /* Shift! */
- memmove (match_positions + next + delta, match_positions + next,
- (count - next) * sizeof (match_positions[0]));
- next += delta;
- count += delta;
-
- /* Fill in new entries. */
- for (unsigned int j = idx + 1; j < next; j++)
- match_positions[j] = match_positions[j - 1] + 1;
-
- /* And fixup the rest. */
- for (; next < count; next++)
- match_positions[next] += delta;
- }
-
- buffer->move_to (end);
-
- return_trace (true);
-}
-
-
-
-/* Contextual lookups */
-
-struct ContextClosureLookupContext
-{
- ContextClosureFuncs funcs;
- const void *intersects_data;
-};
-
-struct ContextCollectGlyphsLookupContext
-{
- ContextCollectGlyphsFuncs funcs;
- const void *collect_data;
-};
-
-struct ContextApplyLookupContext
-{
- ContextApplyFuncs funcs;
- const void *match_data;
-};
-
-static inline void context_closure_lookup (hb_closure_context_t *c,
- unsigned int inputCount, /* Including the first glyph (not matched) */
- const UINT16 input[], /* Array of input values--start with second glyph */
- unsigned int lookupCount,
- const LookupRecord lookupRecord[],
- ContextClosureLookupContext &lookup_context)
-{
- if (intersects_array (c,
- inputCount ? inputCount - 1 : 0, input,
- lookup_context.funcs.intersects, lookup_context.intersects_data))
- recurse_lookups (c,
- lookupCount, lookupRecord);
-}
-
-static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
- unsigned int inputCount, /* Including the first glyph (not matched) */
- const UINT16 input[], /* Array of input values--start with second glyph */
- unsigned int lookupCount,
- const LookupRecord lookupRecord[],
- ContextCollectGlyphsLookupContext &lookup_context)
-{
- collect_array (c, c->input,
- inputCount ? inputCount - 1 : 0, input,
- lookup_context.funcs.collect, lookup_context.collect_data);
- recurse_lookups (c,
- lookupCount, lookupRecord);
-}
-
-static inline bool context_would_apply_lookup (hb_would_apply_context_t *c,
- unsigned int inputCount, /* Including the first glyph (not matched) */
- const UINT16 input[], /* Array of input values--start with second glyph */
- unsigned int lookupCount HB_UNUSED,
- const LookupRecord lookupRecord[] HB_UNUSED,
- ContextApplyLookupContext &lookup_context)
-{
- return would_match_input (c,
- inputCount, input,
- lookup_context.funcs.match, lookup_context.match_data);
-}
-static inline bool context_apply_lookup (hb_apply_context_t *c,
- unsigned int inputCount, /* Including the first glyph (not matched) */
- const UINT16 input[], /* Array of input values--start with second glyph */
- unsigned int lookupCount,
- const LookupRecord lookupRecord[],
- ContextApplyLookupContext &lookup_context)
-{
- unsigned int match_length = 0;
- unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
- return match_input (c,
- inputCount, input,
- lookup_context.funcs.match, lookup_context.match_data,
- &match_length, match_positions)
- && (c->buffer->unsafe_to_break (c->buffer->idx, c->buffer->idx + match_length),
- apply_lookup (c,
- inputCount, match_positions,
- lookupCount, lookupRecord,
- match_length));
-}
-
-struct Rule
-{
- inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
- {
- TRACE_CLOSURE (this);
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0));
- context_closure_lookup (c,
- inputCount, inputZ,
- lookupCount, lookupRecord,
- lookup_context);
- }
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const
- {
- TRACE_COLLECT_GLYPHS (this);
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0));
- context_collect_glyphs_lookup (c,
- inputCount, inputZ,
- lookupCount, lookupRecord,
- lookup_context);
- }
-
- inline bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
- {
- TRACE_WOULD_APPLY (this);
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0));
- return_trace (context_would_apply_lookup (c, inputCount, inputZ, lookupCount, lookupRecord, lookup_context));
- }
-
- inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
- {
- TRACE_APPLY (this);
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0));
- return_trace (context_apply_lookup (c, inputCount, inputZ, lookupCount, lookupRecord, lookup_context));
- }
-
- public:
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (inputCount.sanitize (c) &&
- lookupCount.sanitize (c) &&
- c->check_range (inputZ,
- inputZ[0].static_size * inputCount +
- lookupRecordX[0].static_size * lookupCount));
- }
-
- protected:
- UINT16 inputCount; /* Total number of glyphs in input
- * glyph sequence--includes the first
- * glyph */
- UINT16 lookupCount; /* Number of LookupRecords */
- UINT16 inputZ[VAR]; /* Array of match inputs--start with
- * second glyph */
- LookupRecord lookupRecordX[VAR]; /* Array of LookupRecords--in
- * design order */
- public:
- DEFINE_SIZE_ARRAY2 (4, inputZ, lookupRecordX);
-};
-
-struct RuleSet
-{
- inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
- {
- TRACE_CLOSURE (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- (this+rule[i]).closure (c, lookup_context);
- }
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const
- {
- TRACE_COLLECT_GLYPHS (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- (this+rule[i]).collect_glyphs (c, lookup_context);
- }
-
- inline bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
- {
- TRACE_WOULD_APPLY (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- {
- if ((this+rule[i]).would_apply (c, lookup_context))
- return_trace (true);
- }
- return_trace (false);
- }
-
- inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
- {
- TRACE_APPLY (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- {
- if ((this+rule[i]).apply (c, lookup_context))
- return_trace (true);
- }
- return_trace (false);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (rule.sanitize (c, this));
- }
-
- protected:
- OffsetArrayOf<Rule>
- rule; /* Array of Rule tables
- * ordered by preference */
- public:
- DEFINE_SIZE_ARRAY (2, rule);
-};
-
-
-struct ContextFormat1
-{
- inline void closure (hb_closure_context_t *c) const
- {
- TRACE_CLOSURE (this);
-
- const Coverage &cov = (this+coverage);
-
- struct ContextClosureLookupContext lookup_context = {
- {intersects_glyph},
- nullptr
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- if (cov.intersects_coverage (c->glyphs, i)) {
- const RuleSet &rule_set = this+ruleSet[i];
- rule_set.closure (c, lookup_context);
- }
- }
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (c->input);
-
- struct ContextCollectGlyphsLookupContext lookup_context = {
- {collect_glyph},
- nullptr
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- (this+ruleSet[i]).collect_glyphs (c, lookup_context);
- }
-
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
-
- const RuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
- struct ContextApplyLookupContext lookup_context = {
- {match_glyph},
- nullptr
- };
- return_trace (rule_set.would_apply (c, lookup_context));
- }
-
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
- TRACE_APPLY (this);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED))
- return_trace (false);
-
- const RuleSet &rule_set = this+ruleSet[index];
- struct ContextApplyLookupContext lookup_context = {
- {match_glyph},
- nullptr
- };
- return_trace (rule_set.apply (c, lookup_context));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
- }
-
- protected:
- UINT16 format; /* Format identifier--format = 1 */
- OffsetTo<Coverage>
- coverage; /* Offset to Coverage table--from
- * beginning of table */
- OffsetArrayOf<RuleSet>
- ruleSet; /* Array of RuleSet tables
- * ordered by Coverage Index */
- public:
- DEFINE_SIZE_ARRAY (6, ruleSet);
-};
-
-
-struct ContextFormat2
-{
- inline void closure (hb_closure_context_t *c) const
- {
- TRACE_CLOSURE (this);
- if (!(this+coverage).intersects (c->glyphs))
- return;
-
- const ClassDef &class_def = this+classDef;
-
- struct ContextClosureLookupContext lookup_context = {
- {intersects_class},
- &class_def
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- if (class_def.intersects_class (c->glyphs, i)) {
- const RuleSet &rule_set = this+ruleSet[i];
- rule_set.closure (c, lookup_context);
- }
- }
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (c->input);
-
- const ClassDef &class_def = this+classDef;
- struct ContextCollectGlyphsLookupContext lookup_context = {
- {collect_class},
- &class_def
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- (this+ruleSet[i]).collect_glyphs (c, lookup_context);
- }
-
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
-
- const ClassDef &class_def = this+classDef;
- unsigned int index = class_def.get_class (c->glyphs[0]);
- const RuleSet &rule_set = this+ruleSet[index];
- struct ContextApplyLookupContext lookup_context = {
- {match_class},
- &class_def
- };
- return_trace (rule_set.would_apply (c, lookup_context));
- }
-
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
- TRACE_APPLY (this);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return_trace (false);
-
- const ClassDef &class_def = this+classDef;
- index = class_def.get_class (c->buffer->cur().codepoint);
- const RuleSet &rule_set = this+ruleSet[index];
- struct ContextApplyLookupContext lookup_context = {
- {match_class},
- &class_def
- };
- return_trace (rule_set.apply (c, lookup_context));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (coverage.sanitize (c, this) && classDef.sanitize (c, this) && ruleSet.sanitize (c, this));
- }
-
- protected:
- UINT16 format; /* Format identifier--format = 2 */
- OffsetTo<Coverage>
- coverage; /* Offset to Coverage table--from
- * beginning of table */
- OffsetTo<ClassDef>
- classDef; /* Offset to glyph ClassDef table--from
- * beginning of table */
- OffsetArrayOf<RuleSet>
- ruleSet; /* Array of RuleSet tables
- * ordered by class */
- public:
- DEFINE_SIZE_ARRAY (8, ruleSet);
-};
-
-
-struct ContextFormat3
-{
- inline void closure (hb_closure_context_t *c) const
- {
- TRACE_CLOSURE (this);
- if (!(this+coverageZ[0]).intersects (c->glyphs))
- return;
-
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ, coverageZ[0].static_size * glyphCount);
- struct ContextClosureLookupContext lookup_context = {
- {intersects_coverage},
- this
- };
- context_closure_lookup (c,
- glyphCount, (const UINT16 *) (coverageZ + 1),
- lookupCount, lookupRecord,
- lookup_context);
- }
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverageZ[0]).add_coverage (c->input);
-
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ, coverageZ[0].static_size * glyphCount);
- struct ContextCollectGlyphsLookupContext lookup_context = {
- {collect_coverage},
- this
- };
-
- context_collect_glyphs_lookup (c,
- glyphCount, (const UINT16 *) (coverageZ + 1),
- lookupCount, lookupRecord,
- lookup_context);
- }
-
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
-
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ, coverageZ[0].static_size * glyphCount);
- struct ContextApplyLookupContext lookup_context = {
- {match_coverage},
- this
- };
- return_trace (context_would_apply_lookup (c, glyphCount, (const UINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
- }
-
- inline const Coverage &get_coverage (void) const
- {
- return this+coverageZ[0];
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
- TRACE_APPLY (this);
- unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return_trace (false);
-
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ, coverageZ[0].static_size * glyphCount);
- struct ContextApplyLookupContext lookup_context = {
- {match_coverage},
- this
- };
- return_trace (context_apply_lookup (c, glyphCount, (const UINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (!c->check_struct (this)) return_trace (false);
- unsigned int count = glyphCount;
- if (!count) return_trace (false); /* We want to access coverageZ[0] freely. */
- if (!c->check_array (coverageZ, coverageZ[0].static_size, count)) return_trace (false);
- for (unsigned int i = 0; i < count; i++)
- if (!coverageZ[i].sanitize (c, this)) return_trace (false);
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ, coverageZ[0].static_size * count);
- return_trace (c->check_array (lookupRecord, lookupRecord[0].static_size, lookupCount));
- }
-
- protected:
- UINT16 format; /* Format identifier--format = 3 */
- UINT16 glyphCount; /* Number of glyphs in the input glyph
- * sequence */
- UINT16 lookupCount; /* Number of LookupRecords */
- OffsetTo<Coverage>
- coverageZ[VAR]; /* Array of offsets to Coverage
- * table in glyph sequence order */
- LookupRecord lookupRecordX[VAR]; /* Array of LookupRecords--in
- * design order */
- public:
- DEFINE_SIZE_ARRAY2 (6, coverageZ, lookupRecordX);
-};
-
-struct Context
-{
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
- {
- TRACE_DISPATCH (this, u.format);
- if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
- switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
- case 2: return_trace (c->dispatch (u.format2));
- case 3: return_trace (c->dispatch (u.format3));
- default:return_trace (c->default_return_value ());
- }
- }
-
- protected:
- union {
- UINT16 format; /* Format identifier */
- ContextFormat1 format1;
- ContextFormat2 format2;
- ContextFormat3 format3;
- } u;
-};
-
-
-/* Chaining Contextual lookups */
-
-struct ChainContextClosureLookupContext
-{
- ContextClosureFuncs funcs;
- const void *intersects_data[3];
-};
-
-struct ChainContextCollectGlyphsLookupContext
-{
- ContextCollectGlyphsFuncs funcs;
- const void *collect_data[3];
-};
-
-struct ChainContextApplyLookupContext
-{
- ContextApplyFuncs funcs;
- const void *match_data[3];
-};
-
-static inline void chain_context_closure_lookup (hb_closure_context_t *c,
- unsigned int backtrackCount,
- const UINT16 backtrack[],
- unsigned int inputCount, /* Including the first glyph (not matched) */
- const UINT16 input[], /* Array of input values--start with second glyph */
- unsigned int lookaheadCount,
- const UINT16 lookahead[],
- unsigned int lookupCount,
- const LookupRecord lookupRecord[],
- ChainContextClosureLookupContext &lookup_context)
-{
- if (intersects_array (c,
- backtrackCount, backtrack,
- lookup_context.funcs.intersects, lookup_context.intersects_data[0])
- && intersects_array (c,
- inputCount ? inputCount - 1 : 0, input,
- lookup_context.funcs.intersects, lookup_context.intersects_data[1])
- && intersects_array (c,
- lookaheadCount, lookahead,
- lookup_context.funcs.intersects, lookup_context.intersects_data[2]))
- recurse_lookups (c,
- lookupCount, lookupRecord);
-}
-
-static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
- unsigned int backtrackCount,
- const UINT16 backtrack[],
- unsigned int inputCount, /* Including the first glyph (not matched) */
- const UINT16 input[], /* Array of input values--start with second glyph */
- unsigned int lookaheadCount,
- const UINT16 lookahead[],
- unsigned int lookupCount,
- const LookupRecord lookupRecord[],
- ChainContextCollectGlyphsLookupContext &lookup_context)
-{
- collect_array (c, c->before,
- backtrackCount, backtrack,
- lookup_context.funcs.collect, lookup_context.collect_data[0]);
- collect_array (c, c->input,
- inputCount ? inputCount - 1 : 0, input,
- lookup_context.funcs.collect, lookup_context.collect_data[1]);
- collect_array (c, c->after,
- lookaheadCount, lookahead,
- lookup_context.funcs.collect, lookup_context.collect_data[2]);
- recurse_lookups (c,
- lookupCount, lookupRecord);
-}
-
-static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
- unsigned int backtrackCount,
- const UINT16 backtrack[] HB_UNUSED,
- unsigned int inputCount, /* Including the first glyph (not matched) */
- const UINT16 input[], /* Array of input values--start with second glyph */
- unsigned int lookaheadCount,
- const UINT16 lookahead[] HB_UNUSED,
- unsigned int lookupCount HB_UNUSED,
- const LookupRecord lookupRecord[] HB_UNUSED,
- ChainContextApplyLookupContext &lookup_context)
-{
- return (c->zero_context ? !backtrackCount && !lookaheadCount : true)
- && would_match_input (c,
- inputCount, input,
- lookup_context.funcs.match, lookup_context.match_data[1]);
-}
-
-static inline bool chain_context_apply_lookup (hb_apply_context_t *c,
- unsigned int backtrackCount,
- const UINT16 backtrack[],
- unsigned int inputCount, /* Including the first glyph (not matched) */
- const UINT16 input[], /* Array of input values--start with second glyph */
- unsigned int lookaheadCount,
- const UINT16 lookahead[],
- unsigned int lookupCount,
- const LookupRecord lookupRecord[],
- ChainContextApplyLookupContext &lookup_context)
-{
- unsigned int start_index = 0, match_length = 0, end_index = 0;
- unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
- return match_input (c,
- inputCount, input,
- lookup_context.funcs.match, lookup_context.match_data[1],
- &match_length, match_positions)
- && match_backtrack (c,
- backtrackCount, backtrack,
- lookup_context.funcs.match, lookup_context.match_data[0],
- &start_index)
- && match_lookahead (c,
- lookaheadCount, lookahead,
- lookup_context.funcs.match, lookup_context.match_data[2],
- match_length, &end_index)
- && (c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index),
- apply_lookup (c,
- inputCount, match_positions,
- lookupCount, lookupRecord,
- match_length));
-}
-
-struct ChainRule
-{
- inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
- {
- TRACE_CLOSURE (this);
- const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack);
- const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- chain_context_closure_lookup (c,
- backtrack.len, backtrack.array,
- input.len, input.array,
- lookahead.len, lookahead.array,
- lookup.len, lookup.array,
- lookup_context);
- }
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
- {
- TRACE_COLLECT_GLYPHS (this);
- const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack);
- const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- chain_context_collect_glyphs_lookup (c,
- backtrack.len, backtrack.array,
- input.len, input.array,
- lookahead.len, lookahead.array,
- lookup.len, lookup.array,
- lookup_context);
- }
-
- inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
- {
- TRACE_WOULD_APPLY (this);
- const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack);
- const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- return_trace (chain_context_would_apply_lookup (c,
- backtrack.len, backtrack.array,
- input.len, input.array,
- lookahead.len, lookahead.array, lookup.len,
- lookup.array, lookup_context));
- }
-
- inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
- {
- TRACE_APPLY (this);
- const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack);
- const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- return_trace (chain_context_apply_lookup (c,
- backtrack.len, backtrack.array,
- input.len, input.array,
- lookahead.len, lookahead.array, lookup.len,
- lookup.array, lookup_context));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (!backtrack.sanitize (c)) return_trace (false);
- const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack);
- if (!input.sanitize (c)) return_trace (false);
- const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input);
- if (!lookahead.sanitize (c)) return_trace (false);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- return_trace (lookup.sanitize (c));
- }
-
- protected:
- ArrayOf<UINT16>
- backtrack; /* Array of backtracking values
- * (to be matched before the input
- * sequence) */
- HeadlessArrayOf<UINT16>
- inputX; /* Array of input values (start with
- * second glyph) */
- ArrayOf<UINT16>
- lookaheadX; /* Array of lookahead values's (to be
- * matched after the input sequence) */
- ArrayOf<LookupRecord>
- lookupX; /* Array of LookupRecords--in
- * design order) */
- public:
- DEFINE_SIZE_MIN (8);
-};
-
-struct ChainRuleSet
-{
- inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
- {
- TRACE_CLOSURE (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- (this+rule[i]).closure (c, lookup_context);
- }
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
- {
- TRACE_COLLECT_GLYPHS (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- (this+rule[i]).collect_glyphs (c, lookup_context);
- }
-
- inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
- {
- TRACE_WOULD_APPLY (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- if ((this+rule[i]).would_apply (c, lookup_context))
- return_trace (true);
-
- return_trace (false);
- }
-
- inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
- {
- TRACE_APPLY (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- if ((this+rule[i]).apply (c, lookup_context))
- return_trace (true);
-
- return_trace (false);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (rule.sanitize (c, this));
- }
-
- protected:
- OffsetArrayOf<ChainRule>
- rule; /* Array of ChainRule tables
- * ordered by preference */
- public:
- DEFINE_SIZE_ARRAY (2, rule);
-};
-
-struct ChainContextFormat1
-{
- inline void closure (hb_closure_context_t *c) const
- {
- TRACE_CLOSURE (this);
- const Coverage &cov = (this+coverage);
-
- struct ChainContextClosureLookupContext lookup_context = {
- {intersects_glyph},
- {nullptr, nullptr, nullptr}
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- if (cov.intersects_coverage (c->glyphs, i)) {
- const ChainRuleSet &rule_set = this+ruleSet[i];
- rule_set.closure (c, lookup_context);
- }
- }
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (c->input);
-
- struct ChainContextCollectGlyphsLookupContext lookup_context = {
- {collect_glyph},
- {nullptr, nullptr, nullptr}
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- (this+ruleSet[i]).collect_glyphs (c, lookup_context);
- }
-
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
-
- const ChainRuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
- struct ChainContextApplyLookupContext lookup_context = {
- {match_glyph},
- {nullptr, nullptr, nullptr}
- };
- return_trace (rule_set.would_apply (c, lookup_context));
- }
-
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
- TRACE_APPLY (this);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return_trace (false);
-
- const ChainRuleSet &rule_set = this+ruleSet[index];
- struct ChainContextApplyLookupContext lookup_context = {
- {match_glyph},
- {nullptr, nullptr, nullptr}
- };
- return_trace (rule_set.apply (c, lookup_context));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
- }
-
- protected:
- UINT16 format; /* Format identifier--format = 1 */
- OffsetTo<Coverage>
- coverage; /* Offset to Coverage table--from
- * beginning of table */
- OffsetArrayOf<ChainRuleSet>
- ruleSet; /* Array of ChainRuleSet tables
- * ordered by Coverage Index */
- public:
- DEFINE_SIZE_ARRAY (6, ruleSet);
-};
-
-struct ChainContextFormat2
-{
- inline void closure (hb_closure_context_t *c) const
- {
- TRACE_CLOSURE (this);
- if (!(this+coverage).intersects (c->glyphs))
- return;
-
- const ClassDef &backtrack_class_def = this+backtrackClassDef;
- const ClassDef &input_class_def = this+inputClassDef;
- const ClassDef &lookahead_class_def = this+lookaheadClassDef;
-
- struct ChainContextClosureLookupContext lookup_context = {
- {intersects_class},
- {&backtrack_class_def,
- &input_class_def,
- &lookahead_class_def}
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- if (input_class_def.intersects_class (c->glyphs, i)) {
- const ChainRuleSet &rule_set = this+ruleSet[i];
- rule_set.closure (c, lookup_context);
- }
- }
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (c->input);
-
- const ClassDef &backtrack_class_def = this+backtrackClassDef;
- const ClassDef &input_class_def = this+inputClassDef;
- const ClassDef &lookahead_class_def = this+lookaheadClassDef;
-
- struct ChainContextCollectGlyphsLookupContext lookup_context = {
- {collect_class},
- {&backtrack_class_def,
- &input_class_def,
- &lookahead_class_def}
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- (this+ruleSet[i]).collect_glyphs (c, lookup_context);
- }
-
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
-
- const ClassDef &backtrack_class_def = this+backtrackClassDef;
- const ClassDef &input_class_def = this+inputClassDef;
- const ClassDef &lookahead_class_def = this+lookaheadClassDef;
-
- unsigned int index = input_class_def.get_class (c->glyphs[0]);
- const ChainRuleSet &rule_set = this+ruleSet[index];
- struct ChainContextApplyLookupContext lookup_context = {
- {match_class},
- {&backtrack_class_def,
- &input_class_def,
- &lookahead_class_def}
- };
- return_trace (rule_set.would_apply (c, lookup_context));
- }
-
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
- TRACE_APPLY (this);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return_trace (false);
-
- const ClassDef &backtrack_class_def = this+backtrackClassDef;
- const ClassDef &input_class_def = this+inputClassDef;
- const ClassDef &lookahead_class_def = this+lookaheadClassDef;
-
- index = input_class_def.get_class (c->buffer->cur().codepoint);
- const ChainRuleSet &rule_set = this+ruleSet[index];
- struct ChainContextApplyLookupContext lookup_context = {
- {match_class},
- {&backtrack_class_def,
- &input_class_def,
- &lookahead_class_def}
- };
- return_trace (rule_set.apply (c, lookup_context));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (coverage.sanitize (c, this) &&
- backtrackClassDef.sanitize (c, this) &&
- inputClassDef.sanitize (c, this) &&
- lookaheadClassDef.sanitize (c, this) &&
- ruleSet.sanitize (c, this));
- }
-
- protected:
- UINT16 format; /* Format identifier--format = 2 */
- OffsetTo<Coverage>
- coverage; /* Offset to Coverage table--from
- * beginning of table */
- OffsetTo<ClassDef>
- backtrackClassDef; /* Offset to glyph ClassDef table
- * containing backtrack sequence
- * data--from beginning of table */
- OffsetTo<ClassDef>
- inputClassDef; /* Offset to glyph ClassDef
- * table containing input sequence
- * data--from beginning of table */
- OffsetTo<ClassDef>
- lookaheadClassDef; /* Offset to glyph ClassDef table
- * containing lookahead sequence
- * data--from beginning of table */
- OffsetArrayOf<ChainRuleSet>
- ruleSet; /* Array of ChainRuleSet tables
- * ordered by class */
- public:
- DEFINE_SIZE_ARRAY (12, ruleSet);
-};
-
-struct ChainContextFormat3
-{
- inline void closure (hb_closure_context_t *c) const
- {
- TRACE_CLOSURE (this);
- const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-
- if (!(this+input[0]).intersects (c->glyphs))
- return;
-
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- struct ChainContextClosureLookupContext lookup_context = {
- {intersects_coverage},
- {this, this, this}
- };
- chain_context_closure_lookup (c,
- backtrack.len, (const UINT16 *) backtrack.array,
- input.len, (const UINT16 *) input.array + 1,
- lookahead.len, (const UINT16 *) lookahead.array,
- lookup.len, lookup.array,
- lookup_context);
- }
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-
- (this+input[0]).add_coverage (c->input);
-
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- struct ChainContextCollectGlyphsLookupContext lookup_context = {
- {collect_coverage},
- {this, this, this}
- };
- chain_context_collect_glyphs_lookup (c,
- backtrack.len, (const UINT16 *) backtrack.array,
- input.len, (const UINT16 *) input.array + 1,
- lookahead.len, (const UINT16 *) lookahead.array,
- lookup.len, lookup.array,
- lookup_context);
- }
-
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
-
- const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- struct ChainContextApplyLookupContext lookup_context = {
- {match_coverage},
- {this, this, this}
- };
- return_trace (chain_context_would_apply_lookup (c,
- backtrack.len, (const UINT16 *) backtrack.array,
- input.len, (const UINT16 *) input.array + 1,
- lookahead.len, (const UINT16 *) lookahead.array,
- lookup.len, lookup.array, lookup_context));
- }
-
- inline const Coverage &get_coverage (void) const
- {
- const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
- return this+input[0];
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
- TRACE_APPLY (this);
- const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-
- unsigned int index = (this+input[0]).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return_trace (false);
-
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- struct ChainContextApplyLookupContext lookup_context = {
- {match_coverage},
- {this, this, this}
- };
- return_trace (chain_context_apply_lookup (c,
- backtrack.len, (const UINT16 *) backtrack.array,
- input.len, (const UINT16 *) input.array + 1,
- lookahead.len, (const UINT16 *) lookahead.array,
- lookup.len, lookup.array, lookup_context));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- if (!backtrack.sanitize (c, this)) return_trace (false);
- const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
- if (!input.sanitize (c, this)) return_trace (false);
- if (!input.len) return_trace (false); /* To be consistent with Context. */
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
- if (!lookahead.sanitize (c, this)) return_trace (false);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- return_trace (lookup.sanitize (c));
- }
-
- protected:
- UINT16 format; /* Format identifier--format = 3 */
- OffsetArrayOf<Coverage>
- backtrack; /* Array of coverage tables
- * in backtracking sequence, in glyph
- * sequence order */
- OffsetArrayOf<Coverage>
- inputX ; /* Array of coverage
- * tables in input sequence, in glyph
- * sequence order */
- OffsetArrayOf<Coverage>
- lookaheadX; /* Array of coverage tables
- * in lookahead sequence, in glyph
- * sequence order */
- ArrayOf<LookupRecord>
- lookupX; /* Array of LookupRecords--in
- * design order) */
- public:
- DEFINE_SIZE_MIN (10);
-};
-
-struct ChainContext
-{
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
- {
- TRACE_DISPATCH (this, u.format);
- if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
- switch (u.format) {
- case 1: return_trace (c->dispatch (u.format1));
- case 2: return_trace (c->dispatch (u.format2));
- case 3: return_trace (c->dispatch (u.format3));
- default:return_trace (c->default_return_value ());
- }
- }
-
- protected:
- union {
- UINT16 format; /* Format identifier */
- ChainContextFormat1 format1;
- ChainContextFormat2 format2;
- ChainContextFormat3 format3;
- } u;
-};
-
-
-template <typename T>
-struct ExtensionFormat1
-{
- inline unsigned int get_type (void) const { return extensionLookupType; }
-
- template <typename X>
- inline const X& get_subtable (void) const
- {
- unsigned int offset = extensionOffset;
- if (unlikely (!offset)) return Null(typename T::LookupSubTable);
- return StructAtOffset<typename T::LookupSubTable> (this, offset);
- }
-
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
- {
- TRACE_DISPATCH (this, format);
- if (unlikely (!c->may_dispatch (this, this))) return_trace (c->no_dispatch_return_value ());
- return_trace (get_subtable<typename T::LookupSubTable> ().dispatch (c, get_type ()));
- }
-
- /* This is called from may_dispatch() above with hb_sanitize_context_t. */
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && extensionOffset != 0);
- }
-
- protected:
- UINT16 format; /* Format identifier. Set to 1. */
- UINT16 extensionLookupType; /* Lookup type of subtable referenced
- * by ExtensionOffset (i.e. the
- * extension subtable). */
- UINT32 extensionOffset; /* Offset to the extension subtable,
- * of lookup type subtable. */
- public:
- DEFINE_SIZE_STATIC (8);
-};
-
-template <typename T>
-struct Extension
-{
- inline unsigned int get_type (void) const
- {
- switch (u.format) {
- case 1: return u.format1.get_type ();
- default:return 0;
- }
- }
- template <typename X>
- inline const X& get_subtable (void) const
- {
- switch (u.format) {
- case 1: return u.format1.template get_subtable<typename T::LookupSubTable> ();
- default:return Null(typename T::LookupSubTable);
- }
- }
-
- template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
- {
- TRACE_DISPATCH (this, u.format);
- if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
- switch (u.format) {
- case 1: return_trace (u.format1.dispatch (c));
- default:return_trace (c->default_return_value ());
- }
- }
-
- protected:
- union {
- UINT16 format; /* Format identifier */
- ExtensionFormat1<T> format1;
- } u;
-};
-
-
-/*
- * GSUB/GPOS Common
- */
-
-struct GSUBGPOS
-{
- inline unsigned int get_script_count (void) const
- { return (this+scriptList).len; }
- inline const Tag& get_script_tag (unsigned int i) const
- { return (this+scriptList).get_tag (i); }
- inline unsigned int get_script_tags (unsigned int start_offset,
- unsigned int *script_count /* IN/OUT */,
- hb_tag_t *script_tags /* OUT */) const
- { return (this+scriptList).get_tags (start_offset, script_count, script_tags); }
- inline const Script& get_script (unsigned int i) const
- { return (this+scriptList)[i]; }
- inline bool find_script_index (hb_tag_t tag, unsigned int *index) const
- { return (this+scriptList).find_index (tag, index); }
-
- inline unsigned int get_feature_count (void) const
- { return (this+featureList).len; }
- inline hb_tag_t get_feature_tag (unsigned int i) const
- { return i == Index::NOT_FOUND_INDEX ? HB_TAG_NONE : (this+featureList).get_tag (i); }
- inline unsigned int get_feature_tags (unsigned int start_offset,
- unsigned int *feature_count /* IN/OUT */,
- hb_tag_t *feature_tags /* OUT */) const
- { return (this+featureList).get_tags (start_offset, feature_count, feature_tags); }
- inline const Feature& get_feature (unsigned int i) const
- { return (this+featureList)[i]; }
- inline bool find_feature_index (hb_tag_t tag, unsigned int *index) const
- { return (this+featureList).find_index (tag, index); }
-
- inline unsigned int get_lookup_count (void) const
- { return (this+lookupList).len; }
- inline const Lookup& get_lookup (unsigned int i) const
- { return (this+lookupList)[i]; }
-
- inline bool find_variations_index (const int *coords, unsigned int num_coords,
- unsigned int *index) const
- { return (version.to_int () >= 0x00010001u ? this+featureVars : Null(FeatureVariations))
- .find_index (coords, num_coords, index); }
- inline const Feature& get_feature_variation (unsigned int feature_index,
- unsigned int variations_index) const
- {
- if (FeatureVariations::NOT_FOUND_INDEX != variations_index &&
- version.to_int () >= 0x00010001u)
- {
- const Feature *feature = (this+featureVars).find_substitute (variations_index,
- feature_index);
- if (feature)
- return *feature;
- }
- return get_feature (feature_index);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (version.sanitize (c) &&
- likely (version.major == 1) &&
- scriptList.sanitize (c, this) &&
- featureList.sanitize (c, this) &&
- lookupList.sanitize (c, this) &&
- (version.to_int () < 0x00010001u || featureVars.sanitize (c, this)));
- }
-
- protected:
- FixedVersion<>version; /* Version of the GSUB/GPOS table--initially set
- * to 0x00010000u */
- OffsetTo<ScriptList>
- scriptList; /* ScriptList table */
- OffsetTo<FeatureList>
- featureList; /* FeatureList table */
- OffsetTo<LookupList>
- lookupList; /* LookupList table */
- LOffsetTo<FeatureVariations>
- featureVars; /* Offset to Feature Variations
- table--from beginning of table
- * (may be NULL). Introduced
- * in version 0x00010001. */
- public:
- DEFINE_SIZE_MIN (10);
-};
-
-
-} /* namespace OT */
-
-
-#endif /* HB_OT_LAYOUT_GSUBGPOS_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos.hh
new file mode 100644
index 0000000000..579d17871b
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos.hh
@@ -0,0 +1,3009 @@
+/*
+ * Copyright © 2007,2008,2009,2010 Red Hat, Inc.
+ * Copyright © 2010,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_LAYOUT_GSUBGPOS_HH
+#define HB_OT_LAYOUT_GSUBGPOS_HH
+
+#include "hb.hh"
+#include "hb-buffer.hh"
+#include "hb-map.hh"
+#include "hb-set.hh"
+#include "hb-ot-map.hh"
+#include "hb-ot-layout-common.hh"
+#include "hb-ot-layout-gdef-table.hh"
+
+
+namespace OT {
+
+
+struct hb_intersects_context_t :
+ hb_dispatch_context_t<hb_intersects_context_t, bool, 0>
+{
+ const char *get_name () { return "INTERSECTS"; }
+ template <typename T>
+ return_t dispatch (const T &obj) { return obj.intersects (this->glyphs); }
+ static return_t default_return_value () { return false; }
+ bool stop_sublookup_iteration (return_t r) const { return r; }
+
+ const hb_set_t *glyphs;
+ unsigned int debug_depth;
+
+ hb_intersects_context_t (const hb_set_t *glyphs_) :
+ glyphs (glyphs_),
+ debug_depth (0) {}
+};
+
+struct hb_closure_context_t :
+ hb_dispatch_context_t<hb_closure_context_t, hb_empty_t, 0>
+{
+ const char *get_name () { return "CLOSURE"; }
+ typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
+ template <typename T>
+ return_t dispatch (const T &obj) { obj.closure (this); return hb_empty_t (); }
+ static return_t default_return_value () { return hb_empty_t (); }
+ void recurse (unsigned int lookup_index)
+ {
+ if (unlikely (nesting_level_left == 0 || !recurse_func))
+ return;
+
+ nesting_level_left--;
+ recurse_func (this, lookup_index);
+ nesting_level_left++;
+ }
+
+ bool should_visit_lookup (unsigned int lookup_index)
+ {
+ if (is_lookup_done (lookup_index))
+ return false;
+ done_lookups->set (lookup_index, glyphs->get_population ());
+ return true;
+ }
+
+ bool is_lookup_done (unsigned int lookup_index)
+ {
+ /* Have we visited this lookup with the current set of glyphs? */
+ return done_lookups->get (lookup_index) == glyphs->get_population ();
+ }
+
+ hb_face_t *face;
+ hb_set_t *glyphs;
+ hb_set_t output[1];
+ recurse_func_t recurse_func;
+ unsigned int nesting_level_left;
+ unsigned int debug_depth;
+
+ hb_closure_context_t (hb_face_t *face_,
+ hb_set_t *glyphs_,
+ hb_map_t *done_lookups_,
+ unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
+ face (face_),
+ glyphs (glyphs_),
+ recurse_func (nullptr),
+ nesting_level_left (nesting_level_left_),
+ debug_depth (0),
+ done_lookups (done_lookups_) {}
+
+ ~hb_closure_context_t () { flush (); }
+
+ void set_recurse_func (recurse_func_t func) { recurse_func = func; }
+
+ void flush ()
+ {
+ hb_set_union (glyphs, output);
+ hb_set_clear (output);
+ }
+
+ private:
+ hb_map_t *done_lookups;
+};
+
+
+struct hb_would_apply_context_t :
+ hb_dispatch_context_t<hb_would_apply_context_t, bool, 0>
+{
+ const char *get_name () { return "WOULD_APPLY"; }
+ template <typename T>
+ return_t dispatch (const T &obj) { return obj.would_apply (this); }
+ static return_t default_return_value () { return false; }
+ bool stop_sublookup_iteration (return_t r) const { return r; }
+
+ hb_face_t *face;
+ const hb_codepoint_t *glyphs;
+ unsigned int len;
+ bool zero_context;
+ unsigned int debug_depth;
+
+ hb_would_apply_context_t (hb_face_t *face_,
+ const hb_codepoint_t *glyphs_,
+ unsigned int len_,
+ bool zero_context_) :
+ face (face_),
+ glyphs (glyphs_),
+ len (len_),
+ zero_context (zero_context_),
+ debug_depth (0) {}
+};
+
+
+struct hb_collect_glyphs_context_t :
+ hb_dispatch_context_t<hb_collect_glyphs_context_t, hb_empty_t, 0>
+{
+ const char *get_name () { return "COLLECT_GLYPHS"; }
+ typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
+ template <typename T>
+ return_t dispatch (const T &obj) { obj.collect_glyphs (this); return hb_empty_t (); }
+ static return_t default_return_value () { return hb_empty_t (); }
+ void recurse (unsigned int lookup_index)
+ {
+ if (unlikely (nesting_level_left == 0 || !recurse_func))
+ return;
+
+ /* Note that GPOS sets recurse_func to nullptr already, so it doesn't get
+ * past the previous check. For GSUB, we only want to collect the output
+ * glyphs in the recursion. If output is not requested, we can go home now.
+ *
+ * Note further, that the above is not exactly correct. A recursed lookup
+ * is allowed to match input that is not matched in the context, but that's
+ * not how most fonts are built. It's possible to relax that and recurse
+ * with all sets here if it proves to be an issue.
+ */
+
+ if (output == hb_set_get_empty ())
+ return;
+
+ /* Return if new lookup was recursed to before. */
+ if (recursed_lookups->has (lookup_index))
+ return;
+
+ hb_set_t *old_before = before;
+ hb_set_t *old_input = input;
+ hb_set_t *old_after = after;
+ before = input = after = hb_set_get_empty ();
+
+ nesting_level_left--;
+ recurse_func (this, lookup_index);
+ nesting_level_left++;
+
+ before = old_before;
+ input = old_input;
+ after = old_after;
+
+ recursed_lookups->add (lookup_index);
+ }
+
+ hb_face_t *face;
+ hb_set_t *before;
+ hb_set_t *input;
+ hb_set_t *after;
+ hb_set_t *output;
+ recurse_func_t recurse_func;
+ hb_set_t *recursed_lookups;
+ unsigned int nesting_level_left;
+ unsigned int debug_depth;
+
+ hb_collect_glyphs_context_t (hb_face_t *face_,
+ hb_set_t *glyphs_before, /* OUT. May be NULL */
+ hb_set_t *glyphs_input, /* OUT. May be NULL */
+ hb_set_t *glyphs_after, /* OUT. May be NULL */
+ hb_set_t *glyphs_output, /* OUT. May be NULL */
+ unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
+ face (face_),
+ before (glyphs_before ? glyphs_before : hb_set_get_empty ()),
+ input (glyphs_input ? glyphs_input : hb_set_get_empty ()),
+ after (glyphs_after ? glyphs_after : hb_set_get_empty ()),
+ output (glyphs_output ? glyphs_output : hb_set_get_empty ()),
+ recurse_func (nullptr),
+ recursed_lookups (hb_set_create ()),
+ nesting_level_left (nesting_level_left_),
+ debug_depth (0) {}
+ ~hb_collect_glyphs_context_t () { hb_set_destroy (recursed_lookups); }
+
+ void set_recurse_func (recurse_func_t func) { recurse_func = func; }
+};
+
+
+
+template <typename set_t>
+struct hb_add_coverage_context_t :
+ hb_dispatch_context_t<hb_add_coverage_context_t<set_t>, const Coverage &, HB_DEBUG_GET_COVERAGE>
+{
+ const char *get_name () { return "GET_COVERAGE"; }
+ typedef const Coverage &return_t;
+ template <typename T>
+ return_t dispatch (const T &obj) { return obj.get_coverage (); }
+ static return_t default_return_value () { return Null(Coverage); }
+ bool stop_sublookup_iteration (return_t r) const
+ {
+ r.add_coverage (set);
+ return false;
+ }
+
+ hb_add_coverage_context_t (set_t *set_) :
+ set (set_),
+ debug_depth (0) {}
+
+ set_t *set;
+ unsigned int debug_depth;
+};
+
+
+struct hb_ot_apply_context_t :
+ hb_dispatch_context_t<hb_ot_apply_context_t, bool, HB_DEBUG_APPLY>
+{
+ struct matcher_t
+ {
+ matcher_t () :
+ lookup_props (0),
+ ignore_zwnj (false),
+ ignore_zwj (false),
+ mask (-1),
+#define arg1(arg) (arg) /* Remove the macro to see why it's needed! */
+ syllable arg1(0),
+#undef arg1
+ match_func (nullptr),
+ match_data (nullptr) {}
+
+ typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data);
+
+ void set_ignore_zwnj (bool ignore_zwnj_) { ignore_zwnj = ignore_zwnj_; }
+ void set_ignore_zwj (bool ignore_zwj_) { ignore_zwj = ignore_zwj_; }
+ void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
+ void set_mask (hb_mask_t mask_) { mask = mask_; }
+ void set_syllable (uint8_t syllable_) { syllable = syllable_; }
+ void set_match_func (match_func_t match_func_,
+ const void *match_data_)
+ { match_func = match_func_; match_data = match_data_; }
+
+ enum may_match_t {
+ MATCH_NO,
+ MATCH_YES,
+ MATCH_MAYBE
+ };
+
+ may_match_t may_match (const hb_glyph_info_t &info,
+ const HBUINT16 *glyph_data) const
+ {
+ if (!(info.mask & mask) ||
+ (syllable && syllable != info.syllable ()))
+ return MATCH_NO;
+
+ if (match_func)
+ return match_func (info.codepoint, *glyph_data, match_data) ? MATCH_YES : MATCH_NO;
+
+ return MATCH_MAYBE;
+ }
+
+ enum may_skip_t {
+ SKIP_NO,
+ SKIP_YES,
+ SKIP_MAYBE
+ };
+
+ may_skip_t may_skip (const hb_ot_apply_context_t *c,
+ const hb_glyph_info_t &info) const
+ {
+ if (!c->check_glyph_property (&info, lookup_props))
+ return SKIP_YES;
+
+ if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_hidden (&info) &&
+ (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
+ (ignore_zwj || !_hb_glyph_info_is_zwj (&info))))
+ return SKIP_MAYBE;
+
+ return SKIP_NO;
+ }
+
+ protected:
+ unsigned int lookup_props;
+ bool ignore_zwnj;
+ bool ignore_zwj;
+ hb_mask_t mask;
+ uint8_t syllable;
+ match_func_t match_func;
+ const void *match_data;
+ };
+
+ struct skipping_iterator_t
+ {
+ void init (hb_ot_apply_context_t *c_, bool context_match = false)
+ {
+ c = c_;
+ match_glyph_data = nullptr;
+ matcher.set_match_func (nullptr, nullptr);
+ matcher.set_lookup_props (c->lookup_props);
+ /* Ignore ZWNJ if we are matching GPOS, or matching GSUB context and asked to. */
+ matcher.set_ignore_zwnj (c->table_index == 1 || (context_match && c->auto_zwnj));
+ /* Ignore ZWJ if we are matching context, or asked to. */
+ matcher.set_ignore_zwj (context_match || c->auto_zwj);
+ matcher.set_mask (context_match ? -1 : c->lookup_mask);
+ }
+ void set_lookup_props (unsigned int lookup_props)
+ {
+ matcher.set_lookup_props (lookup_props);
+ }
+ void set_match_func (matcher_t::match_func_t match_func_,
+ const void *match_data_,
+ const HBUINT16 glyph_data[])
+ {
+ matcher.set_match_func (match_func_, match_data_);
+ match_glyph_data = glyph_data;
+ }
+
+ void reset (unsigned int start_index_,
+ unsigned int num_items_)
+ {
+ idx = start_index_;
+ num_items = num_items_;
+ end = c->buffer->len;
+ matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0);
+ }
+
+ void reject () { num_items++; match_glyph_data--; }
+
+ matcher_t::may_skip_t
+ may_skip (const hb_glyph_info_t &info) const
+ { return matcher.may_skip (c, info); }
+
+ bool next ()
+ {
+ assert (num_items > 0);
+ while (idx + num_items < end)
+ {
+ idx++;
+ const hb_glyph_info_t &info = c->buffer->info[idx];
+
+ matcher_t::may_skip_t skip = matcher.may_skip (c, info);
+ if (unlikely (skip == matcher_t::SKIP_YES))
+ continue;
+
+ matcher_t::may_match_t match = matcher.may_match (info, match_glyph_data);
+ if (match == matcher_t::MATCH_YES ||
+ (match == matcher_t::MATCH_MAYBE &&
+ skip == matcher_t::SKIP_NO))
+ {
+ num_items--;
+ if (match_glyph_data) match_glyph_data++;
+ return true;
+ }
+
+ if (skip == matcher_t::SKIP_NO)
+ return false;
+ }
+ return false;
+ }
+ bool prev ()
+ {
+ assert (num_items > 0);
+ while (idx > num_items - 1)
+ {
+ idx--;
+ const hb_glyph_info_t &info = c->buffer->out_info[idx];
+
+ matcher_t::may_skip_t skip = matcher.may_skip (c, info);
+ if (unlikely (skip == matcher_t::SKIP_YES))
+ continue;
+
+ matcher_t::may_match_t match = matcher.may_match (info, match_glyph_data);
+ if (match == matcher_t::MATCH_YES ||
+ (match == matcher_t::MATCH_MAYBE &&
+ skip == matcher_t::SKIP_NO))
+ {
+ num_items--;
+ if (match_glyph_data) match_glyph_data++;
+ return true;
+ }
+
+ if (skip == matcher_t::SKIP_NO)
+ return false;
+ }
+ return false;
+ }
+
+ unsigned int idx;
+ protected:
+ hb_ot_apply_context_t *c;
+ matcher_t matcher;
+ const HBUINT16 *match_glyph_data;
+
+ unsigned int num_items;
+ unsigned int end;
+ };
+
+
+ const char *get_name () { return "APPLY"; }
+ typedef return_t (*recurse_func_t) (hb_ot_apply_context_t *c, unsigned int lookup_index);
+ template <typename T>
+ return_t dispatch (const T &obj) { return obj.apply (this); }
+ static return_t default_return_value () { return false; }
+ bool stop_sublookup_iteration (return_t r) const { return r; }
+ return_t recurse (unsigned int sub_lookup_index)
+ {
+ if (unlikely (nesting_level_left == 0 || !recurse_func || buffer->max_ops-- <= 0))
+ return default_return_value ();
+
+ nesting_level_left--;
+ bool ret = recurse_func (this, sub_lookup_index);
+ nesting_level_left++;
+ return ret;
+ }
+
+ skipping_iterator_t iter_input, iter_context;
+
+ hb_font_t *font;
+ hb_face_t *face;
+ hb_buffer_t *buffer;
+ recurse_func_t recurse_func;
+ const GDEF &gdef;
+ const VariationStore &var_store;
+
+ hb_direction_t direction;
+ hb_mask_t lookup_mask;
+ unsigned int table_index; /* GSUB/GPOS */
+ unsigned int lookup_index;
+ unsigned int lookup_props;
+ unsigned int nesting_level_left;
+ unsigned int debug_depth;
+
+ bool has_glyph_classes;
+ bool auto_zwnj;
+ bool auto_zwj;
+ bool random;
+
+ uint32_t random_state;
+
+
+ hb_ot_apply_context_t (unsigned int table_index_,
+ hb_font_t *font_,
+ hb_buffer_t *buffer_) :
+ iter_input (), iter_context (),
+ font (font_), face (font->face), buffer (buffer_),
+ recurse_func (nullptr),
+ gdef (
+#ifndef HB_NO_OT_LAYOUT
+ *face->table.GDEF->table
+#else
+ Null(GDEF)
+#endif
+ ),
+ var_store (gdef.get_var_store ()),
+ direction (buffer_->props.direction),
+ lookup_mask (1),
+ table_index (table_index_),
+ lookup_index ((unsigned int) -1),
+ lookup_props (0),
+ nesting_level_left (HB_MAX_NESTING_LEVEL),
+ debug_depth (0),
+ has_glyph_classes (gdef.has_glyph_classes ()),
+ auto_zwnj (true),
+ auto_zwj (true),
+ random (false),
+ random_state (1) { init_iters (); }
+
+ void init_iters ()
+ {
+ iter_input.init (this, false);
+ iter_context.init (this, true);
+ }
+
+ void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; init_iters (); }
+ void set_auto_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; init_iters (); }
+ void set_auto_zwnj (bool auto_zwnj_) { auto_zwnj = auto_zwnj_; init_iters (); }
+ void set_random (bool random_) { random = random_; }
+ void set_recurse_func (recurse_func_t func) { recurse_func = func; }
+ void set_lookup_index (unsigned int lookup_index_) { lookup_index = lookup_index_; }
+ void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; init_iters (); }
+
+ uint32_t random_number ()
+ {
+ /* http://www.cplusplus.com/reference/random/minstd_rand/ */
+ random_state = random_state * 48271 % 2147483647;
+ return random_state;
+ }
+
+ bool match_properties_mark (hb_codepoint_t glyph,
+ unsigned int glyph_props,
+ unsigned int match_props) const
+ {
+ /* If using mark filtering sets, the high short of
+ * match_props has the set index.
+ */
+ if (match_props & LookupFlag::UseMarkFilteringSet)
+ return gdef.mark_set_covers (match_props >> 16, glyph);
+
+ /* The second byte of match_props has the meaning
+ * "ignore marks of attachment type different than
+ * the attachment type specified."
+ */
+ if (match_props & LookupFlag::MarkAttachmentType)
+ return (match_props & LookupFlag::MarkAttachmentType) == (glyph_props & LookupFlag::MarkAttachmentType);
+
+ return true;
+ }
+
+ bool check_glyph_property (const hb_glyph_info_t *info,
+ unsigned int match_props) const
+ {
+ hb_codepoint_t glyph = info->codepoint;
+ unsigned int glyph_props = _hb_glyph_info_get_glyph_props (info);
+
+ /* Not covered, if, for example, glyph class is ligature and
+ * match_props includes LookupFlags::IgnoreLigatures
+ */
+ if (glyph_props & match_props & LookupFlag::IgnoreFlags)
+ return false;
+
+ if (unlikely (glyph_props & HB_OT_LAYOUT_GLYPH_PROPS_MARK))
+ return match_properties_mark (glyph, glyph_props, match_props);
+
+ return true;
+ }
+
+ void _set_glyph_props (hb_codepoint_t glyph_index,
+ unsigned int class_guess = 0,
+ bool ligature = false,
+ bool component = false) const
+ {
+ unsigned int add_in = _hb_glyph_info_get_glyph_props (&buffer->cur()) &
+ HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE;
+ add_in |= HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED;
+ if (ligature)
+ {
+ add_in |= HB_OT_LAYOUT_GLYPH_PROPS_LIGATED;
+ /* In the only place that the MULTIPLIED bit is used, Uniscribe
+ * seems to only care about the "last" transformation between
+ * Ligature and Multiple substitutions. Ie. if you ligate, expand,
+ * and ligate again, it forgives the multiplication and acts as
+ * if only ligation happened. As such, clear MULTIPLIED bit.
+ */
+ add_in &= ~HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
+ }
+ if (component)
+ add_in |= HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
+ if (likely (has_glyph_classes))
+ _hb_glyph_info_set_glyph_props (&buffer->cur(), add_in | gdef.get_glyph_props (glyph_index));
+ else if (class_guess)
+ _hb_glyph_info_set_glyph_props (&buffer->cur(), add_in | class_guess);
+ }
+
+ void replace_glyph (hb_codepoint_t glyph_index) const
+ {
+ _set_glyph_props (glyph_index);
+ buffer->replace_glyph (glyph_index);
+ }
+ void replace_glyph_inplace (hb_codepoint_t glyph_index) const
+ {
+ _set_glyph_props (glyph_index);
+ buffer->cur().codepoint = glyph_index;
+ }
+ void replace_glyph_with_ligature (hb_codepoint_t glyph_index,
+ unsigned int class_guess) const
+ {
+ _set_glyph_props (glyph_index, class_guess, true);
+ buffer->replace_glyph (glyph_index);
+ }
+ void output_glyph_for_component (hb_codepoint_t glyph_index,
+ unsigned int class_guess) const
+ {
+ _set_glyph_props (glyph_index, class_guess, false, true);
+ buffer->output_glyph (glyph_index);
+ }
+};
+
+
+struct hb_get_subtables_context_t :
+ hb_dispatch_context_t<hb_get_subtables_context_t, hb_empty_t, HB_DEBUG_APPLY>
+{
+ template <typename Type>
+ HB_INTERNAL static bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c)
+ {
+ const Type *typed_obj = (const Type *) obj;
+ return typed_obj->apply (c);
+ }
+
+ typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_ot_apply_context_t *c);
+
+ struct hb_applicable_t
+ {
+ template <typename T>
+ void init (const T &obj_, hb_apply_func_t apply_func_)
+ {
+ obj = &obj_;
+ apply_func = apply_func_;
+ digest.init ();
+ obj_.get_coverage ().add_coverage (&digest);
+ }
+
+ bool apply (OT::hb_ot_apply_context_t *c) const
+ {
+ return digest.may_have (c->buffer->cur().codepoint) && apply_func (obj, c);
+ }
+
+ private:
+ const void *obj;
+ hb_apply_func_t apply_func;
+ hb_set_digest_t digest;
+ };
+
+ typedef hb_vector_t<hb_applicable_t> array_t;
+
+ /* Dispatch interface. */
+ const char *get_name () { return "GET_SUBTABLES"; }
+ template <typename T>
+ return_t dispatch (const T &obj)
+ {
+ hb_applicable_t *entry = array.push();
+ entry->init (obj, apply_to<T>);
+ return hb_empty_t ();
+ }
+ static return_t default_return_value () { return hb_empty_t (); }
+
+ hb_get_subtables_context_t (array_t &array_) :
+ array (array_),
+ debug_depth (0) {}
+
+ array_t &array;
+ unsigned int debug_depth;
+};
+
+
+
+
+typedef bool (*intersects_func_t) (const hb_set_t *glyphs, const HBUINT16 &value, const void *data);
+typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const HBUINT16 &value, const void *data);
+typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data);
+
+struct ContextClosureFuncs
+{
+ intersects_func_t intersects;
+};
+struct ContextCollectGlyphsFuncs
+{
+ collect_glyphs_func_t collect;
+};
+struct ContextApplyFuncs
+{
+ match_func_t match;
+};
+
+
+static inline bool intersects_glyph (const hb_set_t *glyphs, const HBUINT16 &value, const void *data HB_UNUSED)
+{
+ return glyphs->has (value);
+}
+static inline bool intersects_class (const hb_set_t *glyphs, const HBUINT16 &value, const void *data)
+{
+ const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
+ return class_def.intersects_class (glyphs, value);
+}
+static inline bool intersects_coverage (const hb_set_t *glyphs, const HBUINT16 &value, const void *data)
+{
+ const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
+ return (data+coverage).intersects (glyphs);
+}
+
+static inline bool intersects_array (const hb_set_t *glyphs,
+ unsigned int count,
+ const HBUINT16 values[],
+ intersects_func_t intersects_func,
+ const void *intersects_data)
+{
+ for (const HBUINT16 &_ : + hb_iter (values, count))
+ if (intersects_func (glyphs, _, intersects_data)) return true;
+ return false;
+}
+
+
+static inline void collect_glyph (hb_set_t *glyphs, const HBUINT16 &value, const void *data HB_UNUSED)
+{
+ glyphs->add (value);
+}
+static inline void collect_class (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
+{
+ const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
+ class_def.add_class (glyphs, value);
+}
+static inline void collect_coverage (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
+{
+ const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
+ (data+coverage).add_coverage (glyphs);
+}
+static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED,
+ hb_set_t *glyphs,
+ unsigned int count,
+ const HBUINT16 values[],
+ collect_glyphs_func_t collect_func,
+ const void *collect_data)
+{
+ return
+ + hb_iter (values, count)
+ | hb_apply ([&] (const HBUINT16 &_) { collect_func (glyphs, _, collect_data); })
+ ;
+}
+
+
+static inline bool match_glyph (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data HB_UNUSED)
+{
+ return glyph_id == value;
+}
+static inline bool match_class (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data)
+{
+ const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
+ return class_def.get_class (glyph_id) == value;
+}
+static inline bool match_coverage (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data)
+{
+ const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
+ return (data+coverage).get_coverage (glyph_id) != NOT_COVERED;
+}
+
+static inline bool would_match_input (hb_would_apply_context_t *c,
+ unsigned int count, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ match_func_t match_func,
+ const void *match_data)
+{
+ if (count != c->len)
+ return false;
+
+ for (unsigned int i = 1; i < count; i++)
+ if (likely (!match_func (c->glyphs[i], input[i - 1], match_data)))
+ return false;
+
+ return true;
+}
+static inline bool match_input (hb_ot_apply_context_t *c,
+ unsigned int count, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ match_func_t match_func,
+ const void *match_data,
+ unsigned int *end_offset,
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH],
+ unsigned int *p_total_component_count = nullptr)
+{
+ TRACE_APPLY (nullptr);
+
+ if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false);
+
+ hb_buffer_t *buffer = c->buffer;
+
+ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+ skippy_iter.reset (buffer->idx, count - 1);
+ skippy_iter.set_match_func (match_func, match_data, input);
+
+ /*
+ * This is perhaps the trickiest part of OpenType... Remarks:
+ *
+ * - If all components of the ligature were marks, we call this a mark ligature.
+ *
+ * - If there is no GDEF, and the ligature is NOT a mark ligature, we categorize
+ * it as a ligature glyph.
+ *
+ * - Ligatures cannot be formed across glyphs attached to different components
+ * of previous ligatures. Eg. the sequence is LAM,SHADDA,LAM,FATHA,HEH, and
+ * LAM,LAM,HEH form a ligature, leaving SHADDA,FATHA next to eachother.
+ * However, it would be wrong to ligate that SHADDA,FATHA sequence.
+ * There are a couple of exceptions to this:
+ *
+ * o If a ligature tries ligating with marks that belong to it itself, go ahead,
+ * assuming that the font designer knows what they are doing (otherwise it can
+ * break Indic stuff when a matra wants to ligate with a conjunct,
+ *
+ * o If two marks want to ligate and they belong to different components of the
+ * same ligature glyph, and said ligature glyph is to be ignored according to
+ * mark-filtering rules, then allow.
+ * https://github.com/harfbuzz/harfbuzz/issues/545
+ */
+
+ unsigned int total_component_count = 0;
+ total_component_count += _hb_glyph_info_get_lig_num_comps (&buffer->cur());
+
+ unsigned int first_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
+ unsigned int first_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
+
+ enum {
+ LIGBASE_NOT_CHECKED,
+ LIGBASE_MAY_NOT_SKIP,
+ LIGBASE_MAY_SKIP
+ } ligbase = LIGBASE_NOT_CHECKED;
+
+ match_positions[0] = buffer->idx;
+ for (unsigned int i = 1; i < count; i++)
+ {
+ if (!skippy_iter.next ()) return_trace (false);
+
+ match_positions[i] = skippy_iter.idx;
+
+ unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]);
+ unsigned int this_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]);
+
+ if (first_lig_id && first_lig_comp)
+ {
+ /* If first component was attached to a previous ligature component,
+ * all subsequent components should be attached to the same ligature
+ * component, otherwise we shouldn't ligate them... */
+ if (first_lig_id != this_lig_id || first_lig_comp != this_lig_comp)
+ {
+ /* ...unless, we are attached to a base ligature and that base
+ * ligature is ignorable. */
+ if (ligbase == LIGBASE_NOT_CHECKED)
+ {
+ bool found = false;
+ const auto *out = buffer->out_info;
+ unsigned int j = buffer->out_len;
+ while (j && _hb_glyph_info_get_lig_id (&out[j - 1]) == first_lig_id)
+ {
+ if (_hb_glyph_info_get_lig_comp (&out[j - 1]) == 0)
+ {
+ j--;
+ found = true;
+ break;
+ }
+ j--;
+ }
+
+ if (found && skippy_iter.may_skip (out[j]) == hb_ot_apply_context_t::matcher_t::SKIP_YES)
+ ligbase = LIGBASE_MAY_SKIP;
+ else
+ ligbase = LIGBASE_MAY_NOT_SKIP;
+ }
+
+ if (ligbase == LIGBASE_MAY_NOT_SKIP)
+ return_trace (false);
+ }
+ }
+ else
+ {
+ /* If first component was NOT attached to a previous ligature component,
+ * all subsequent components should also NOT be attached to any ligature
+ * component, unless they are attached to the first component itself! */
+ if (this_lig_id && this_lig_comp && (this_lig_id != first_lig_id))
+ return_trace (false);
+ }
+
+ total_component_count += _hb_glyph_info_get_lig_num_comps (&buffer->info[skippy_iter.idx]);
+ }
+
+ *end_offset = skippy_iter.idx - buffer->idx + 1;
+
+ if (p_total_component_count)
+ *p_total_component_count = total_component_count;
+
+ return_trace (true);
+}
+static inline bool ligate_input (hb_ot_apply_context_t *c,
+ unsigned int count, /* Including the first glyph */
+ const unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
+ unsigned int match_length,
+ hb_codepoint_t lig_glyph,
+ unsigned int total_component_count)
+{
+ TRACE_APPLY (nullptr);
+
+ hb_buffer_t *buffer = c->buffer;
+
+ buffer->merge_clusters (buffer->idx, buffer->idx + match_length);
+
+ /* - If a base and one or more marks ligate, consider that as a base, NOT
+ * ligature, such that all following marks can still attach to it.
+ * https://github.com/harfbuzz/harfbuzz/issues/1109
+ *
+ * - If all components of the ligature were marks, we call this a mark ligature.
+ * If it *is* a mark ligature, we don't allocate a new ligature id, and leave
+ * the ligature to keep its old ligature id. This will allow it to attach to
+ * a base ligature in GPOS. Eg. if the sequence is: LAM,LAM,SHADDA,FATHA,HEH,
+ * and LAM,LAM,HEH for a ligature, they will leave SHADDA and FATHA with a
+ * ligature id and component value of 2. Then if SHADDA,FATHA form a ligature
+ * later, we don't want them to lose their ligature id/component, otherwise
+ * GPOS will fail to correctly position the mark ligature on top of the
+ * LAM,LAM,HEH ligature. See:
+ * https://bugzilla.gnome.org/show_bug.cgi?id=676343
+ *
+ * - If a ligature is formed of components that some of which are also ligatures
+ * themselves, and those ligature components had marks attached to *their*
+ * components, we have to attach the marks to the new ligature component
+ * positions! Now *that*'s tricky! And these marks may be following the
+ * last component of the whole sequence, so we should loop forward looking
+ * for them and update them.
+ *
+ * Eg. the sequence is LAM,LAM,SHADDA,FATHA,HEH, and the font first forms a
+ * 'calt' ligature of LAM,HEH, leaving the SHADDA and FATHA with a ligature
+ * id and component == 1. Now, during 'liga', the LAM and the LAM-HEH ligature
+ * form a LAM-LAM-HEH ligature. We need to reassign the SHADDA and FATHA to
+ * the new ligature with a component value of 2.
+ *
+ * This in fact happened to a font... See:
+ * https://bugzilla.gnome.org/show_bug.cgi?id=437633
+ */
+
+ bool is_base_ligature = _hb_glyph_info_is_base_glyph (&buffer->info[match_positions[0]]);
+ bool is_mark_ligature = _hb_glyph_info_is_mark (&buffer->info[match_positions[0]]);
+ for (unsigned int i = 1; i < count; i++)
+ if (!_hb_glyph_info_is_mark (&buffer->info[match_positions[i]]))
+ {
+ is_base_ligature = false;
+ is_mark_ligature = false;
+ break;
+ }
+ bool is_ligature = !is_base_ligature && !is_mark_ligature;
+
+ unsigned int klass = is_ligature ? HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE : 0;
+ unsigned int lig_id = is_ligature ? _hb_allocate_lig_id (buffer) : 0;
+ unsigned int last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
+ unsigned int last_num_components = _hb_glyph_info_get_lig_num_comps (&buffer->cur());
+ unsigned int components_so_far = last_num_components;
+
+ if (is_ligature)
+ {
+ _hb_glyph_info_set_lig_props_for_ligature (&buffer->cur(), lig_id, total_component_count);
+ if (_hb_glyph_info_get_general_category (&buffer->cur()) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
+ {
+ _hb_glyph_info_set_general_category (&buffer->cur(), HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER);
+ }
+ }
+ c->replace_glyph_with_ligature (lig_glyph, klass);
+
+ for (unsigned int i = 1; i < count; i++)
+ {
+ while (buffer->idx < match_positions[i] && buffer->successful)
+ {
+ if (is_ligature)
+ {
+ unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
+ if (this_comp == 0)
+ this_comp = last_num_components;
+ unsigned int new_lig_comp = components_so_far - last_num_components +
+ hb_min (this_comp, last_num_components);
+ _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp);
+ }
+ buffer->next_glyph ();
+ }
+
+ last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
+ last_num_components = _hb_glyph_info_get_lig_num_comps (&buffer->cur());
+ components_so_far += last_num_components;
+
+ /* Skip the base glyph */
+ buffer->idx++;
+ }
+
+ if (!is_mark_ligature && last_lig_id) {
+ /* Re-adjust components for any marks following. */
+ for (unsigned int i = buffer->idx; i < buffer->len; i++) {
+ if (last_lig_id == _hb_glyph_info_get_lig_id (&buffer->info[i])) {
+ unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->info[i]);
+ if (!this_comp)
+ break;
+ unsigned int new_lig_comp = components_so_far - last_num_components +
+ hb_min (this_comp, last_num_components);
+ _hb_glyph_info_set_lig_props_for_mark (&buffer->info[i], lig_id, new_lig_comp);
+ } else
+ break;
+ }
+ }
+ return_trace (true);
+}
+
+static inline bool match_backtrack (hb_ot_apply_context_t *c,
+ unsigned int count,
+ const HBUINT16 backtrack[],
+ match_func_t match_func,
+ const void *match_data,
+ unsigned int *match_start)
+{
+ TRACE_APPLY (nullptr);
+
+ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
+ skippy_iter.reset (c->buffer->backtrack_len (), count);
+ skippy_iter.set_match_func (match_func, match_data, backtrack);
+
+ for (unsigned int i = 0; i < count; i++)
+ if (!skippy_iter.prev ())
+ return_trace (false);
+
+ *match_start = skippy_iter.idx;
+
+ return_trace (true);
+}
+
+static inline bool match_lookahead (hb_ot_apply_context_t *c,
+ unsigned int count,
+ const HBUINT16 lookahead[],
+ match_func_t match_func,
+ const void *match_data,
+ unsigned int offset,
+ unsigned int *end_index)
+{
+ TRACE_APPLY (nullptr);
+
+ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
+ skippy_iter.reset (c->buffer->idx + offset - 1, count);
+ skippy_iter.set_match_func (match_func, match_data, lookahead);
+
+ for (unsigned int i = 0; i < count; i++)
+ if (!skippy_iter.next ())
+ return_trace (false);
+
+ *end_index = skippy_iter.idx + 1;
+
+ return_trace (true);
+}
+
+
+
+struct LookupRecord
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ HBUINT16 sequenceIndex; /* Index into current glyph
+ * sequence--first glyph = 0 */
+ HBUINT16 lookupListIndex; /* Lookup to apply to that
+ * position--zero--based */
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+template <typename context_t>
+static inline void recurse_lookups (context_t *c,
+ unsigned int lookupCount,
+ const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */)
+{
+ for (unsigned int i = 0; i < lookupCount; i++)
+ c->recurse (lookupRecord[i].lookupListIndex);
+}
+
+static inline bool apply_lookup (hb_ot_apply_context_t *c,
+ unsigned int count, /* Including the first glyph */
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
+ unsigned int lookupCount,
+ const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
+ unsigned int match_length)
+{
+ TRACE_APPLY (nullptr);
+
+ hb_buffer_t *buffer = c->buffer;
+ int end;
+
+ /* All positions are distance from beginning of *output* buffer.
+ * Adjust. */
+ {
+ unsigned int bl = buffer->backtrack_len ();
+ end = bl + match_length;
+
+ int delta = bl - buffer->idx;
+ /* Convert positions to new indexing. */
+ for (unsigned int j = 0; j < count; j++)
+ match_positions[j] += delta;
+ }
+
+ for (unsigned int i = 0; i < lookupCount && buffer->successful; i++)
+ {
+ unsigned int idx = lookupRecord[i].sequenceIndex;
+ if (idx >= count)
+ continue;
+
+ /* Don't recurse to ourself at same position.
+ * Note that this test is too naive, it doesn't catch longer loops. */
+ if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index)
+ continue;
+
+ if (unlikely (!buffer->move_to (match_positions[idx])))
+ break;
+
+ if (unlikely (buffer->max_ops <= 0))
+ break;
+
+ unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
+ if (!c->recurse (lookupRecord[i].lookupListIndex))
+ continue;
+
+ unsigned int new_len = buffer->backtrack_len () + buffer->lookahead_len ();
+ int delta = new_len - orig_len;
+
+ if (!delta)
+ continue;
+
+ /* Recursed lookup changed buffer len. Adjust.
+ *
+ * TODO:
+ *
+ * Right now, if buffer length increased by n, we assume n new glyphs
+ * were added right after the current position, and if buffer length
+ * was decreased by n, we assume n match positions after the current
+ * one where removed. The former (buffer length increased) case is
+ * fine, but the decrease case can be improved in at least two ways,
+ * both of which are significant:
+ *
+ * - If recursed-to lookup is MultipleSubst and buffer length
+ * decreased, then it's current match position that was deleted,
+ * NOT the one after it.
+ *
+ * - If buffer length was decreased by n, it does not necessarily
+ * mean that n match positions where removed, as there might
+ * have been marks and default-ignorables in the sequence. We
+ * should instead drop match positions between current-position
+ * and current-position + n instead.
+ *
+ * It should be possible to construct tests for both of these cases.
+ */
+
+ end += delta;
+ if (end <= int (match_positions[idx]))
+ {
+ /* End might end up being smaller than match_positions[idx] if the recursed
+ * lookup ended up removing many items, more than we have had matched.
+ * Just never rewind end back and get out of here.
+ * https://bugs.chromium.org/p/chromium/issues/detail?id=659496 */
+ end = match_positions[idx];
+ /* There can't be any further changes. */
+ break;
+ }
+
+ unsigned int next = idx + 1; /* next now is the position after the recursed lookup. */
+
+ if (delta > 0)
+ {
+ if (unlikely (delta + count > HB_MAX_CONTEXT_LENGTH))
+ break;
+ }
+ else
+ {
+ /* NOTE: delta is negative. */
+ delta = hb_max (delta, (int) next - (int) count);
+ next -= delta;
+ }
+
+ /* Shift! */
+ memmove (match_positions + next + delta, match_positions + next,
+ (count - next) * sizeof (match_positions[0]));
+ next += delta;
+ count += delta;
+
+ /* Fill in new entries. */
+ for (unsigned int j = idx + 1; j < next; j++)
+ match_positions[j] = match_positions[j - 1] + 1;
+
+ /* And fixup the rest. */
+ for (; next < count; next++)
+ match_positions[next] += delta;
+ }
+
+ buffer->move_to (end);
+
+ return_trace (true);
+}
+
+
+
+/* Contextual lookups */
+
+struct ContextClosureLookupContext
+{
+ ContextClosureFuncs funcs;
+ const void *intersects_data;
+};
+
+struct ContextCollectGlyphsLookupContext
+{
+ ContextCollectGlyphsFuncs funcs;
+ const void *collect_data;
+};
+
+struct ContextApplyLookupContext
+{
+ ContextApplyFuncs funcs;
+ const void *match_data;
+};
+
+static inline bool context_intersects (const hb_set_t *glyphs,
+ unsigned int inputCount, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ ContextClosureLookupContext &lookup_context)
+{
+ return intersects_array (glyphs,
+ inputCount ? inputCount - 1 : 0, input,
+ lookup_context.funcs.intersects, lookup_context.intersects_data);
+}
+
+static inline void context_closure_lookup (hb_closure_context_t *c,
+ unsigned int inputCount, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ unsigned int lookupCount,
+ const LookupRecord lookupRecord[],
+ ContextClosureLookupContext &lookup_context)
+{
+ if (context_intersects (c->glyphs,
+ inputCount, input,
+ lookup_context))
+ recurse_lookups (c,
+ lookupCount, lookupRecord);
+}
+
+static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
+ unsigned int inputCount, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ unsigned int lookupCount,
+ const LookupRecord lookupRecord[],
+ ContextCollectGlyphsLookupContext &lookup_context)
+{
+ collect_array (c, c->input,
+ inputCount ? inputCount - 1 : 0, input,
+ lookup_context.funcs.collect, lookup_context.collect_data);
+ recurse_lookups (c,
+ lookupCount, lookupRecord);
+}
+
+static inline bool context_would_apply_lookup (hb_would_apply_context_t *c,
+ unsigned int inputCount, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ unsigned int lookupCount HB_UNUSED,
+ const LookupRecord lookupRecord[] HB_UNUSED,
+ ContextApplyLookupContext &lookup_context)
+{
+ return would_match_input (c,
+ inputCount, input,
+ lookup_context.funcs.match, lookup_context.match_data);
+}
+static inline bool context_apply_lookup (hb_ot_apply_context_t *c,
+ unsigned int inputCount, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ unsigned int lookupCount,
+ const LookupRecord lookupRecord[],
+ ContextApplyLookupContext &lookup_context)
+{
+ unsigned int match_length = 0;
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
+ return match_input (c,
+ inputCount, input,
+ lookup_context.funcs.match, lookup_context.match_data,
+ &match_length, match_positions)
+ && (c->buffer->unsafe_to_break (c->buffer->idx, c->buffer->idx + match_length),
+ apply_lookup (c,
+ inputCount, match_positions,
+ lookupCount, lookupRecord,
+ match_length));
+}
+
+struct Rule
+{
+ bool intersects (const hb_set_t *glyphs, ContextClosureLookupContext &lookup_context) const
+ {
+ return context_intersects (glyphs,
+ inputCount, inputZ.arrayZ,
+ lookup_context);
+ }
+
+ void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
+ {
+ const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
+ (inputZ.as_array ((inputCount ? inputCount - 1 : 0)));
+ context_closure_lookup (c,
+ inputCount, inputZ.arrayZ,
+ lookupCount, lookupRecord.arrayZ,
+ lookup_context);
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c,
+ ContextCollectGlyphsLookupContext &lookup_context) const
+ {
+ const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
+ (inputZ.as_array (inputCount ? inputCount - 1 : 0));
+ context_collect_glyphs_lookup (c,
+ inputCount, inputZ.arrayZ,
+ lookupCount, lookupRecord.arrayZ,
+ lookup_context);
+ }
+
+ bool would_apply (hb_would_apply_context_t *c,
+ ContextApplyLookupContext &lookup_context) const
+ {
+ const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
+ (inputZ.as_array (inputCount ? inputCount - 1 : 0));
+ return context_would_apply_lookup (c,
+ inputCount, inputZ.arrayZ,
+ lookupCount, lookupRecord.arrayZ,
+ lookup_context);
+ }
+
+ bool apply (hb_ot_apply_context_t *c,
+ ContextApplyLookupContext &lookup_context) const
+ {
+ TRACE_APPLY (this);
+ const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
+ (inputZ.as_array (inputCount ? inputCount - 1 : 0));
+ return_trace (context_apply_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, lookup_context));
+ }
+
+ public:
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (inputCount.sanitize (c) &&
+ lookupCount.sanitize (c) &&
+ c->check_range (inputZ.arrayZ,
+ inputZ.item_size * (inputCount ? inputCount - 1 : 0) +
+ LookupRecord::static_size * lookupCount));
+ }
+
+ protected:
+ HBUINT16 inputCount; /* Total number of glyphs in input
+ * glyph sequence--includes the first
+ * glyph */
+ HBUINT16 lookupCount; /* Number of LookupRecords */
+ UnsizedArrayOf<HBUINT16>
+ inputZ; /* Array of match inputs--start with
+ * second glyph */
+/*UnsizedArrayOf<LookupRecord>
+ lookupRecordX;*/ /* Array of LookupRecords--in
+ * design order */
+ public:
+ DEFINE_SIZE_ARRAY (4, inputZ);
+};
+
+struct RuleSet
+{
+ bool intersects (const hb_set_t *glyphs,
+ ContextClosureLookupContext &lookup_context) const
+ {
+ return
+ + hb_iter (rule)
+ | hb_map (hb_add (this))
+ | hb_map ([&] (const Rule &_) { return _.intersects (glyphs, lookup_context); })
+ | hb_any
+ ;
+ }
+
+ void closure (hb_closure_context_t *c,
+ ContextClosureLookupContext &lookup_context) const
+ {
+ return
+ + hb_iter (rule)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const Rule &_) { _.closure (c, lookup_context); })
+ ;
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c,
+ ContextCollectGlyphsLookupContext &lookup_context) const
+ {
+ return
+ + hb_iter (rule)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const Rule &_) { _.collect_glyphs (c, lookup_context); })
+ ;
+ }
+
+ bool would_apply (hb_would_apply_context_t *c,
+ ContextApplyLookupContext &lookup_context) const
+ {
+ return
+ + hb_iter (rule)
+ | hb_map (hb_add (this))
+ | hb_map ([&] (const Rule &_) { return _.would_apply (c, lookup_context); })
+ | hb_any
+ ;
+ }
+
+ bool apply (hb_ot_apply_context_t *c,
+ ContextApplyLookupContext &lookup_context) const
+ {
+ TRACE_APPLY (this);
+ return_trace (
+ + hb_iter (rule)
+ | hb_map (hb_add (this))
+ | hb_map ([&] (const Rule &_) { return _.apply (c, lookup_context); })
+ | hb_any
+ )
+ ;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (rule.sanitize (c, this));
+ }
+
+ protected:
+ OffsetArrayOf<Rule>
+ rule; /* Array of Rule tables
+ * ordered by preference */
+ public:
+ DEFINE_SIZE_ARRAY (2, rule);
+};
+
+
+struct ContextFormat1
+{
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ struct ContextClosureLookupContext lookup_context = {
+ {intersects_glyph},
+ nullptr
+ };
+
+ return
+ + hb_zip (this+coverage, ruleSet)
+ | hb_filter (*glyphs, hb_first)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_map ([&] (const RuleSet &_) { return _.intersects (glyphs, lookup_context); })
+ | hb_any
+ ;
+ }
+
+ void closure (hb_closure_context_t *c) const
+ {
+ struct ContextClosureLookupContext lookup_context = {
+ {intersects_glyph},
+ nullptr
+ };
+
+ + hb_zip (this+coverage, ruleSet)
+ | hb_filter (*c->glyphs, hb_first)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const RuleSet &_) { _.closure (c, lookup_context); })
+ ;
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ (this+coverage).add_coverage (c->input);
+
+ struct ContextCollectGlyphsLookupContext lookup_context = {
+ {collect_glyph},
+ nullptr
+ };
+
+ + hb_iter (ruleSet)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const RuleSet &_) { _.collect_glyphs (c, lookup_context); })
+ ;
+ }
+
+ bool would_apply (hb_would_apply_context_t *c) const
+ {
+ const RuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
+ struct ContextApplyLookupContext lookup_context = {
+ {match_glyph},
+ nullptr
+ };
+ return rule_set.would_apply (c, lookup_context);
+ }
+
+ const Coverage &get_coverage () const { return this+coverage; }
+
+ bool apply (hb_ot_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ if (likely (index == NOT_COVERED))
+ return_trace (false);
+
+ const RuleSet &rule_set = this+ruleSet[index];
+ struct ContextApplyLookupContext lookup_context = {
+ {match_glyph},
+ nullptr
+ };
+ return_trace (rule_set.apply (c, lookup_context));
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ // TODO(subset)
+ return_trace (false);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 1 */
+ OffsetTo<Coverage>
+ coverage; /* Offset to Coverage table--from
+ * beginning of table */
+ OffsetArrayOf<RuleSet>
+ ruleSet; /* Array of RuleSet tables
+ * ordered by Coverage Index */
+ public:
+ DEFINE_SIZE_ARRAY (6, ruleSet);
+};
+
+
+struct ContextFormat2
+{
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ if (!(this+coverage).intersects (glyphs))
+ return false;
+
+ const ClassDef &class_def = this+classDef;
+
+ struct ContextClosureLookupContext lookup_context = {
+ {intersects_class},
+ &class_def
+ };
+
+ return
+ + hb_enumerate (ruleSet)
+ | hb_map ([&] (const hb_pair_t<unsigned, const OffsetTo<RuleSet> &> p)
+ { return class_def.intersects_class (glyphs, p.first) &&
+ (this+p.second).intersects (glyphs, lookup_context); })
+ | hb_any
+ ;
+ }
+
+ void closure (hb_closure_context_t *c) const
+ {
+ if (!(this+coverage).intersects (c->glyphs))
+ return;
+
+ const ClassDef &class_def = this+classDef;
+
+ struct ContextClosureLookupContext lookup_context = {
+ {intersects_class},
+ &class_def
+ };
+
+ return
+ + hb_enumerate (ruleSet)
+ | hb_filter ([&] (unsigned _)
+ { return class_def.intersects_class (c->glyphs, _); },
+ hb_first)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const RuleSet &_) { _.closure (c, lookup_context); })
+ ;
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ (this+coverage).add_coverage (c->input);
+
+ const ClassDef &class_def = this+classDef;
+ struct ContextCollectGlyphsLookupContext lookup_context = {
+ {collect_class},
+ &class_def
+ };
+
+ + hb_iter (ruleSet)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const RuleSet &_) { _.collect_glyphs (c, lookup_context); })
+ ;
+ }
+
+ bool would_apply (hb_would_apply_context_t *c) const
+ {
+ const ClassDef &class_def = this+classDef;
+ unsigned int index = class_def.get_class (c->glyphs[0]);
+ const RuleSet &rule_set = this+ruleSet[index];
+ struct ContextApplyLookupContext lookup_context = {
+ {match_class},
+ &class_def
+ };
+ return rule_set.would_apply (c, lookup_context);
+ }
+
+ const Coverage &get_coverage () const { return this+coverage; }
+
+ bool apply (hb_ot_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ if (likely (index == NOT_COVERED)) return_trace (false);
+
+ const ClassDef &class_def = this+classDef;
+ index = class_def.get_class (c->buffer->cur().codepoint);
+ const RuleSet &rule_set = this+ruleSet[index];
+ struct ContextApplyLookupContext lookup_context = {
+ {match_class},
+ &class_def
+ };
+ return_trace (rule_set.apply (c, lookup_context));
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ // TODO(subset)
+ return_trace (false);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (coverage.sanitize (c, this) && classDef.sanitize (c, this) && ruleSet.sanitize (c, this));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 2 */
+ OffsetTo<Coverage>
+ coverage; /* Offset to Coverage table--from
+ * beginning of table */
+ OffsetTo<ClassDef>
+ classDef; /* Offset to glyph ClassDef table--from
+ * beginning of table */
+ OffsetArrayOf<RuleSet>
+ ruleSet; /* Array of RuleSet tables
+ * ordered by class */
+ public:
+ DEFINE_SIZE_ARRAY (8, ruleSet);
+};
+
+
+struct ContextFormat3
+{
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ if (!(this+coverageZ[0]).intersects (glyphs))
+ return false;
+
+ struct ContextClosureLookupContext lookup_context = {
+ {intersects_coverage},
+ this
+ };
+ return context_intersects (glyphs,
+ glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1),
+ lookup_context);
+ }
+
+ void closure (hb_closure_context_t *c) const
+ {
+ if (!(this+coverageZ[0]).intersects (c->glyphs))
+ return;
+
+ const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+ struct ContextClosureLookupContext lookup_context = {
+ {intersects_coverage},
+ this
+ };
+ context_closure_lookup (c,
+ glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1),
+ lookupCount, lookupRecord,
+ lookup_context);
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ (this+coverageZ[0]).add_coverage (c->input);
+
+ const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+ struct ContextCollectGlyphsLookupContext lookup_context = {
+ {collect_coverage},
+ this
+ };
+
+ context_collect_glyphs_lookup (c,
+ glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1),
+ lookupCount, lookupRecord,
+ lookup_context);
+ }
+
+ bool would_apply (hb_would_apply_context_t *c) const
+ {
+ const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+ struct ContextApplyLookupContext lookup_context = {
+ {match_coverage},
+ this
+ };
+ return context_would_apply_lookup (c,
+ glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1),
+ lookupCount, lookupRecord,
+ lookup_context);
+ }
+
+ const Coverage &get_coverage () const { return this+coverageZ[0]; }
+
+ bool apply (hb_ot_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+ unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint);
+ if (likely (index == NOT_COVERED)) return_trace (false);
+
+ const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+ struct ContextApplyLookupContext lookup_context = {
+ {match_coverage},
+ this
+ };
+ return_trace (context_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1), lookupCount, lookupRecord, lookup_context));
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ // TODO(subset)
+ return_trace (false);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!c->check_struct (this)) return_trace (false);
+ unsigned int count = glyphCount;
+ if (!count) return_trace (false); /* We want to access coverageZ[0] freely. */
+ if (!c->check_array (coverageZ.arrayZ, count)) return_trace (false);
+ for (unsigned int i = 0; i < count; i++)
+ if (!coverageZ[i].sanitize (c, this)) return_trace (false);
+ const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+ return_trace (c->check_array (lookupRecord, lookupCount));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 3 */
+ HBUINT16 glyphCount; /* Number of glyphs in the input glyph
+ * sequence */
+ HBUINT16 lookupCount; /* Number of LookupRecords */
+ UnsizedArrayOf<OffsetTo<Coverage>>
+ coverageZ; /* Array of offsets to Coverage
+ * table in glyph sequence order */
+/*UnsizedArrayOf<LookupRecord>
+ lookupRecordX;*/ /* Array of LookupRecords--in
+ * design order */
+ public:
+ DEFINE_SIZE_ARRAY (6, coverageZ);
+};
+
+struct Context
+{
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+ {
+ TRACE_DISPATCH (this, u.format);
+ if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+ switch (u.format) {
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+ case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
+ case 3: return_trace (c->dispatch (u.format3, hb_forward<Ts> (ds)...));
+ default:return_trace (c->default_return_value ());
+ }
+ }
+
+ protected:
+ union {
+ HBUINT16 format; /* Format identifier */
+ ContextFormat1 format1;
+ ContextFormat2 format2;
+ ContextFormat3 format3;
+ } u;
+};
+
+
+/* Chaining Contextual lookups */
+
+struct ChainContextClosureLookupContext
+{
+ ContextClosureFuncs funcs;
+ const void *intersects_data[3];
+};
+
+struct ChainContextCollectGlyphsLookupContext
+{
+ ContextCollectGlyphsFuncs funcs;
+ const void *collect_data[3];
+};
+
+struct ChainContextApplyLookupContext
+{
+ ContextApplyFuncs funcs;
+ const void *match_data[3];
+};
+
+static inline bool chain_context_intersects (const hb_set_t *glyphs,
+ unsigned int backtrackCount,
+ const HBUINT16 backtrack[],
+ unsigned int inputCount, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ unsigned int lookaheadCount,
+ const HBUINT16 lookahead[],
+ ChainContextClosureLookupContext &lookup_context)
+{
+ return intersects_array (glyphs,
+ backtrackCount, backtrack,
+ lookup_context.funcs.intersects, lookup_context.intersects_data[0])
+ && intersects_array (glyphs,
+ inputCount ? inputCount - 1 : 0, input,
+ lookup_context.funcs.intersects, lookup_context.intersects_data[1])
+ && intersects_array (glyphs,
+ lookaheadCount, lookahead,
+ lookup_context.funcs.intersects, lookup_context.intersects_data[2]);
+}
+
+static inline void chain_context_closure_lookup (hb_closure_context_t *c,
+ unsigned int backtrackCount,
+ const HBUINT16 backtrack[],
+ unsigned int inputCount, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ unsigned int lookaheadCount,
+ const HBUINT16 lookahead[],
+ unsigned int lookupCount,
+ const LookupRecord lookupRecord[],
+ ChainContextClosureLookupContext &lookup_context)
+{
+ if (chain_context_intersects (c->glyphs,
+ backtrackCount, backtrack,
+ inputCount, input,
+ lookaheadCount, lookahead,
+ lookup_context))
+ recurse_lookups (c,
+ lookupCount, lookupRecord);
+}
+
+static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
+ unsigned int backtrackCount,
+ const HBUINT16 backtrack[],
+ unsigned int inputCount, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ unsigned int lookaheadCount,
+ const HBUINT16 lookahead[],
+ unsigned int lookupCount,
+ const LookupRecord lookupRecord[],
+ ChainContextCollectGlyphsLookupContext &lookup_context)
+{
+ collect_array (c, c->before,
+ backtrackCount, backtrack,
+ lookup_context.funcs.collect, lookup_context.collect_data[0]);
+ collect_array (c, c->input,
+ inputCount ? inputCount - 1 : 0, input,
+ lookup_context.funcs.collect, lookup_context.collect_data[1]);
+ collect_array (c, c->after,
+ lookaheadCount, lookahead,
+ lookup_context.funcs.collect, lookup_context.collect_data[2]);
+ recurse_lookups (c,
+ lookupCount, lookupRecord);
+}
+
+static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
+ unsigned int backtrackCount,
+ const HBUINT16 backtrack[] HB_UNUSED,
+ unsigned int inputCount, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ unsigned int lookaheadCount,
+ const HBUINT16 lookahead[] HB_UNUSED,
+ unsigned int lookupCount HB_UNUSED,
+ const LookupRecord lookupRecord[] HB_UNUSED,
+ ChainContextApplyLookupContext &lookup_context)
+{
+ return (c->zero_context ? !backtrackCount && !lookaheadCount : true)
+ && would_match_input (c,
+ inputCount, input,
+ lookup_context.funcs.match, lookup_context.match_data[1]);
+}
+
+static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
+ unsigned int backtrackCount,
+ const HBUINT16 backtrack[],
+ unsigned int inputCount, /* Including the first glyph (not matched) */
+ const HBUINT16 input[], /* Array of input values--start with second glyph */
+ unsigned int lookaheadCount,
+ const HBUINT16 lookahead[],
+ unsigned int lookupCount,
+ const LookupRecord lookupRecord[],
+ ChainContextApplyLookupContext &lookup_context)
+{
+ unsigned int start_index = 0, match_length = 0, end_index = 0;
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
+ return match_input (c,
+ inputCount, input,
+ lookup_context.funcs.match, lookup_context.match_data[1],
+ &match_length, match_positions)
+ && match_backtrack (c,
+ backtrackCount, backtrack,
+ lookup_context.funcs.match, lookup_context.match_data[0],
+ &start_index)
+ && match_lookahead (c,
+ lookaheadCount, lookahead,
+ lookup_context.funcs.match, lookup_context.match_data[2],
+ match_length, &end_index)
+ && (c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index),
+ apply_lookup (c,
+ inputCount, match_positions,
+ lookupCount, lookupRecord,
+ match_length));
+}
+
+struct ChainRule
+{
+ bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const
+ {
+ const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
+ const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+ return chain_context_intersects (glyphs,
+ backtrack.len, backtrack.arrayZ,
+ input.lenP1, input.arrayZ,
+ lookahead.len, lookahead.arrayZ,
+ lookup_context);
+ }
+
+ void closure (hb_closure_context_t *c,
+ ChainContextClosureLookupContext &lookup_context) const
+ {
+ const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
+ const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ chain_context_closure_lookup (c,
+ backtrack.len, backtrack.arrayZ,
+ input.lenP1, input.arrayZ,
+ lookahead.len, lookahead.arrayZ,
+ lookup.len, lookup.arrayZ,
+ lookup_context);
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c,
+ ChainContextCollectGlyphsLookupContext &lookup_context) const
+ {
+ const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
+ const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ chain_context_collect_glyphs_lookup (c,
+ backtrack.len, backtrack.arrayZ,
+ input.lenP1, input.arrayZ,
+ lookahead.len, lookahead.arrayZ,
+ lookup.len, lookup.arrayZ,
+ lookup_context);
+ }
+
+ bool would_apply (hb_would_apply_context_t *c,
+ ChainContextApplyLookupContext &lookup_context) const
+ {
+ const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
+ const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ return chain_context_would_apply_lookup (c,
+ backtrack.len, backtrack.arrayZ,
+ input.lenP1, input.arrayZ,
+ lookahead.len, lookahead.arrayZ, lookup.len,
+ lookup.arrayZ, lookup_context);
+ }
+
+ bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
+ {
+ TRACE_APPLY (this);
+ const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
+ const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ return_trace (chain_context_apply_lookup (c,
+ backtrack.len, backtrack.arrayZ,
+ input.lenP1, input.arrayZ,
+ lookahead.len, lookahead.arrayZ, lookup.len,
+ lookup.arrayZ, lookup_context));
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ void serialize_array (hb_serialize_context_t *c,
+ HBUINT16 len,
+ Iterator it) const
+ {
+ c->copy (len);
+ for (const auto g : it)
+ {
+ HBUINT16 gid;
+ gid = g;
+ c->copy (gid);
+ }
+ }
+
+ ChainRule* copy (hb_serialize_context_t *c,
+ const hb_map_t *backtrack_map,
+ const hb_map_t *input_map = nullptr,
+ const hb_map_t *lookahead_map = nullptr) const
+ {
+ TRACE_SERIALIZE (this);
+ auto *out = c->start_embed (this);
+ if (unlikely (!out)) return_trace (nullptr);
+
+ const hb_map_t *mapping = backtrack_map;
+ serialize_array (c, backtrack.len, + backtrack.iter ()
+ | hb_map (mapping));
+
+ const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
+ if (input_map) mapping = input_map;
+ serialize_array (c, input.lenP1, + input.iter ()
+ | hb_map (mapping));
+
+ const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+ if (lookahead_map) mapping = lookahead_map;
+ serialize_array (c, lookahead.len, + lookahead.iter ()
+ | hb_map (mapping));
+
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ c->copy (lookup);
+
+ return_trace (out);
+ }
+
+ bool subset (hb_subset_context_t *c,
+ const hb_map_t *backtrack_map = nullptr,
+ const hb_map_t *input_map = nullptr,
+ const hb_map_t *lookahead_map = nullptr) const
+ {
+ TRACE_SUBSET (this);
+
+ const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
+ const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+
+ if (!backtrack_map)
+ {
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ if (!hb_all (backtrack, glyphset) ||
+ !hb_all (input, glyphset) ||
+ !hb_all (lookahead, glyphset))
+ return_trace (false);
+
+ copy (c->serializer, c->plan->glyph_map);
+ }
+ else
+ {
+ if (!hb_all (backtrack, backtrack_map) ||
+ !hb_all (input, input_map) ||
+ !hb_all (lookahead, lookahead_map))
+ return_trace (false);
+
+ copy (c->serializer, backtrack_map, input_map, lookahead_map);
+ }
+
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!backtrack.sanitize (c)) return_trace (false);
+ const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
+ if (!input.sanitize (c)) return_trace (false);
+ const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+ if (!lookahead.sanitize (c)) return_trace (false);
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ return_trace (lookup.sanitize (c));
+ }
+
+ protected:
+ ArrayOf<HBUINT16>
+ backtrack; /* Array of backtracking values
+ * (to be matched before the input
+ * sequence) */
+ HeadlessArrayOf<HBUINT16>
+ inputX; /* Array of input values (start with
+ * second glyph) */
+ ArrayOf<HBUINT16>
+ lookaheadX; /* Array of lookahead values's (to be
+ * matched after the input sequence) */
+ ArrayOf<LookupRecord>
+ lookupX; /* Array of LookupRecords--in
+ * design order) */
+ public:
+ DEFINE_SIZE_MIN (8);
+};
+
+struct ChainRuleSet
+{
+ bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const
+ {
+ return
+ + hb_iter (rule)
+ | hb_map (hb_add (this))
+ | hb_map ([&] (const ChainRule &_) { return _.intersects (glyphs, lookup_context); })
+ | hb_any
+ ;
+ }
+ void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
+ {
+ return
+ + hb_iter (rule)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const ChainRule &_) { _.closure (c, lookup_context); })
+ ;
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
+ {
+ return
+ + hb_iter (rule)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const ChainRule &_) { _.collect_glyphs (c, lookup_context); })
+ ;
+ }
+
+ bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
+ {
+ return
+ + hb_iter (rule)
+ | hb_map (hb_add (this))
+ | hb_map ([&] (const ChainRule &_) { return _.would_apply (c, lookup_context); })
+ | hb_any
+ ;
+ }
+
+ bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
+ {
+ TRACE_APPLY (this);
+ return_trace (
+ + hb_iter (rule)
+ | hb_map (hb_add (this))
+ | hb_map ([&] (const ChainRule &_) { return _.apply (c, lookup_context); })
+ | hb_any
+ )
+ ;
+ }
+
+ bool subset (hb_subset_context_t *c,
+ const hb_map_t *backtrack_klass_map = nullptr,
+ const hb_map_t *input_klass_map = nullptr,
+ const hb_map_t *lookahead_klass_map = nullptr) const
+ {
+ TRACE_SUBSET (this);
+
+ auto snap = c->serializer->snapshot ();
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+ for (const OffsetTo<ChainRule>& _ : rule)
+ {
+ if (!_) continue;
+ auto *o = out->rule.serialize_append (c->serializer);
+ if (unlikely (!o)) continue;
+
+ auto o_snap = c->serializer->snapshot ();
+ if (!o->serialize_subset (c, _, this, out,
+ backtrack_klass_map,
+ input_klass_map,
+ lookahead_klass_map))
+ {
+ out->rule.pop ();
+ c->serializer->revert (o_snap);
+ }
+ }
+
+ bool ret = bool (out->rule);
+ if (!ret) c->serializer->revert (snap);
+
+ return_trace (ret);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (rule.sanitize (c, this));
+ }
+
+ protected:
+ OffsetArrayOf<ChainRule>
+ rule; /* Array of ChainRule tables
+ * ordered by preference */
+ public:
+ DEFINE_SIZE_ARRAY (2, rule);
+};
+
+struct ChainContextFormat1
+{
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ struct ChainContextClosureLookupContext lookup_context = {
+ {intersects_glyph},
+ {nullptr, nullptr, nullptr}
+ };
+
+ return
+ + hb_zip (this+coverage, ruleSet)
+ | hb_filter (*glyphs, hb_first)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_map ([&] (const ChainRuleSet &_) { return _.intersects (glyphs, lookup_context); })
+ | hb_any
+ ;
+ }
+
+ void closure (hb_closure_context_t *c) const
+ {
+ struct ChainContextClosureLookupContext lookup_context = {
+ {intersects_glyph},
+ {nullptr, nullptr, nullptr}
+ };
+
+ + hb_zip (this+coverage, ruleSet)
+ | hb_filter (*c->glyphs, hb_first)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const ChainRuleSet &_) { _.closure (c, lookup_context); })
+ ;
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ (this+coverage).add_coverage (c->input);
+
+ struct ChainContextCollectGlyphsLookupContext lookup_context = {
+ {collect_glyph},
+ {nullptr, nullptr, nullptr}
+ };
+
+ + hb_iter (ruleSet)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const ChainRuleSet &_) { _.collect_glyphs (c, lookup_context); })
+ ;
+ }
+
+ bool would_apply (hb_would_apply_context_t *c) const
+ {
+ const ChainRuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
+ struct ChainContextApplyLookupContext lookup_context = {
+ {match_glyph},
+ {nullptr, nullptr, nullptr}
+ };
+ return rule_set.would_apply (c, lookup_context);
+ }
+
+ const Coverage &get_coverage () const { return this+coverage; }
+
+ bool apply (hb_ot_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ if (likely (index == NOT_COVERED)) return_trace (false);
+
+ const ChainRuleSet &rule_set = this+ruleSet[index];
+ struct ChainContextApplyLookupContext lookup_context = {
+ {match_glyph},
+ {nullptr, nullptr, nullptr}
+ };
+ return_trace (rule_set.apply (c, lookup_context));
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ const hb_set_t &glyphset = *c->plan->glyphset ();
+ const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+ out->format = format;
+
+ hb_sorted_vector_t<hb_codepoint_t> new_coverage;
+ + hb_zip (this+coverage, ruleSet)
+ | hb_filter (glyphset, hb_first)
+ | hb_filter (subset_offset_array (c, out->ruleSet, this, out), hb_second)
+ | hb_map (hb_first)
+ | hb_map (glyph_map)
+ | hb_sink (new_coverage)
+ ;
+
+ out->coverage.serialize (c->serializer, out)
+ .serialize (c->serializer, new_coverage.iter ());
+ return_trace (bool (new_coverage));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 1 */
+ OffsetTo<Coverage>
+ coverage; /* Offset to Coverage table--from
+ * beginning of table */
+ OffsetArrayOf<ChainRuleSet>
+ ruleSet; /* Array of ChainRuleSet tables
+ * ordered by Coverage Index */
+ public:
+ DEFINE_SIZE_ARRAY (6, ruleSet);
+};
+
+struct ChainContextFormat2
+{
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ if (!(this+coverage).intersects (glyphs))
+ return false;
+
+ const ClassDef &backtrack_class_def = this+backtrackClassDef;
+ const ClassDef &input_class_def = this+inputClassDef;
+ const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+ struct ChainContextClosureLookupContext lookup_context = {
+ {intersects_class},
+ {&backtrack_class_def,
+ &input_class_def,
+ &lookahead_class_def}
+ };
+
+ return
+ + hb_enumerate (ruleSet)
+ | hb_map ([&] (const hb_pair_t<unsigned, const OffsetTo<ChainRuleSet> &> p)
+ { return input_class_def.intersects_class (glyphs, p.first) &&
+ (this+p.second).intersects (glyphs, lookup_context); })
+ | hb_any
+ ;
+ }
+ void closure (hb_closure_context_t *c) const
+ {
+ if (!(this+coverage).intersects (c->glyphs))
+ return;
+
+ const ClassDef &backtrack_class_def = this+backtrackClassDef;
+ const ClassDef &input_class_def = this+inputClassDef;
+ const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+ struct ChainContextClosureLookupContext lookup_context = {
+ {intersects_class},
+ {&backtrack_class_def,
+ &input_class_def,
+ &lookahead_class_def}
+ };
+
+ return
+ + hb_enumerate (ruleSet)
+ | hb_filter ([&] (unsigned _)
+ { return input_class_def.intersects_class (c->glyphs, _); },
+ hb_first)
+ | hb_map (hb_second)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const ChainRuleSet &_) { _.closure (c, lookup_context); })
+ ;
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ (this+coverage).add_coverage (c->input);
+
+ const ClassDef &backtrack_class_def = this+backtrackClassDef;
+ const ClassDef &input_class_def = this+inputClassDef;
+ const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+ struct ChainContextCollectGlyphsLookupContext lookup_context = {
+ {collect_class},
+ {&backtrack_class_def,
+ &input_class_def,
+ &lookahead_class_def}
+ };
+
+ + hb_iter (ruleSet)
+ | hb_map (hb_add (this))
+ | hb_apply ([&] (const ChainRuleSet &_) { _.collect_glyphs (c, lookup_context); })
+ ;
+ }
+
+ bool would_apply (hb_would_apply_context_t *c) const
+ {
+ const ClassDef &backtrack_class_def = this+backtrackClassDef;
+ const ClassDef &input_class_def = this+inputClassDef;
+ const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+ unsigned int index = input_class_def.get_class (c->glyphs[0]);
+ const ChainRuleSet &rule_set = this+ruleSet[index];
+ struct ChainContextApplyLookupContext lookup_context = {
+ {match_class},
+ {&backtrack_class_def,
+ &input_class_def,
+ &lookahead_class_def}
+ };
+ return rule_set.would_apply (c, lookup_context);
+ }
+
+ const Coverage &get_coverage () const { return this+coverage; }
+
+ bool apply (hb_ot_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ if (likely (index == NOT_COVERED)) return_trace (false);
+
+ const ClassDef &backtrack_class_def = this+backtrackClassDef;
+ const ClassDef &input_class_def = this+inputClassDef;
+ const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+ index = input_class_def.get_class (c->buffer->cur().codepoint);
+ const ChainRuleSet &rule_set = this+ruleSet[index];
+ struct ChainContextApplyLookupContext lookup_context = {
+ {match_class},
+ {&backtrack_class_def,
+ &input_class_def,
+ &lookahead_class_def}
+ };
+ return_trace (rule_set.apply (c, lookup_context));
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ auto *out = c->serializer->start_embed (*this);
+ if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+ out->format = format;
+ out->coverage.serialize_subset (c, coverage, this, out);
+
+ hb_map_t backtrack_klass_map;
+ out->backtrackClassDef.serialize_subset (c, backtrackClassDef, this, out, &backtrack_klass_map);
+
+ // subset inputClassDef based on glyphs survived in Coverage subsetting
+ hb_map_t input_klass_map;
+ out->inputClassDef.serialize_subset (c, inputClassDef, this, out, &input_klass_map);
+
+ hb_map_t lookahead_klass_map;
+ out->lookaheadClassDef.serialize_subset (c, lookaheadClassDef, this, out, &lookahead_klass_map);
+
+ hb_vector_t<unsigned> rulesets;
+ bool ret = true;
+ for (const OffsetTo<ChainRuleSet>& _ : + hb_enumerate (ruleSet)
+ | hb_filter (input_klass_map, hb_first)
+ | hb_map (hb_second))
+ {
+ auto *o = out->ruleSet.serialize_append (c->serializer);
+ if (unlikely (!o))
+ {
+ ret = false;
+ break;
+ }
+ if (!o->serialize_subset (c, _, this, out,
+ &backtrack_klass_map,
+ &input_klass_map,
+ &lookahead_klass_map))
+ {
+ rulesets.push (0);
+ }
+ else rulesets.push (1);
+ }
+
+ if (!ret) return_trace (ret);
+
+ //prune empty trailing ruleSets
+ unsigned count = rulesets.length;
+ while (count > 0 && rulesets[count-1] == 0)
+ {
+ out->ruleSet.pop ();
+ count--;
+ }
+
+ return_trace (bool (out->ruleSet));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (coverage.sanitize (c, this) &&
+ backtrackClassDef.sanitize (c, this) &&
+ inputClassDef.sanitize (c, this) &&
+ lookaheadClassDef.sanitize (c, this) &&
+ ruleSet.sanitize (c, this));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 2 */
+ OffsetTo<Coverage>
+ coverage; /* Offset to Coverage table--from
+ * beginning of table */
+ OffsetTo<ClassDef>
+ backtrackClassDef; /* Offset to glyph ClassDef table
+ * containing backtrack sequence
+ * data--from beginning of table */
+ OffsetTo<ClassDef>
+ inputClassDef; /* Offset to glyph ClassDef
+ * table containing input sequence
+ * data--from beginning of table */
+ OffsetTo<ClassDef>
+ lookaheadClassDef; /* Offset to glyph ClassDef table
+ * containing lookahead sequence
+ * data--from beginning of table */
+ OffsetArrayOf<ChainRuleSet>
+ ruleSet; /* Array of ChainRuleSet tables
+ * ordered by class */
+ public:
+ DEFINE_SIZE_ARRAY (12, ruleSet);
+};
+
+struct ChainContextFormat3
+{
+ bool intersects (const hb_set_t *glyphs) const
+ {
+ const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+
+ if (!(this+input[0]).intersects (glyphs))
+ return false;
+
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
+ struct ChainContextClosureLookupContext lookup_context = {
+ {intersects_coverage},
+ {this, this, this}
+ };
+ return chain_context_intersects (glyphs,
+ backtrack.len, (const HBUINT16 *) backtrack.arrayZ,
+ input.len, (const HBUINT16 *) input.arrayZ + 1,
+ lookahead.len, (const HBUINT16 *) lookahead.arrayZ,
+ lookup_context);
+ }
+
+ void closure (hb_closure_context_t *c) const
+ {
+ const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+
+ if (!(this+input[0]).intersects (c->glyphs))
+ return;
+
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ struct ChainContextClosureLookupContext lookup_context = {
+ {intersects_coverage},
+ {this, this, this}
+ };
+ chain_context_closure_lookup (c,
+ backtrack.len, (const HBUINT16 *) backtrack.arrayZ,
+ input.len, (const HBUINT16 *) input.arrayZ + 1,
+ lookahead.len, (const HBUINT16 *) lookahead.arrayZ,
+ lookup.len, lookup.arrayZ,
+ lookup_context);
+ }
+
+ void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+
+ (this+input[0]).add_coverage (c->input);
+
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ struct ChainContextCollectGlyphsLookupContext lookup_context = {
+ {collect_coverage},
+ {this, this, this}
+ };
+ chain_context_collect_glyphs_lookup (c,
+ backtrack.len, (const HBUINT16 *) backtrack.arrayZ,
+ input.len, (const HBUINT16 *) input.arrayZ + 1,
+ lookahead.len, (const HBUINT16 *) lookahead.arrayZ,
+ lookup.len, lookup.arrayZ,
+ lookup_context);
+ }
+
+ bool would_apply (hb_would_apply_context_t *c) const
+ {
+ const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ struct ChainContextApplyLookupContext lookup_context = {
+ {match_coverage},
+ {this, this, this}
+ };
+ return chain_context_would_apply_lookup (c,
+ backtrack.len, (const HBUINT16 *) backtrack.arrayZ,
+ input.len, (const HBUINT16 *) input.arrayZ + 1,
+ lookahead.len, (const HBUINT16 *) lookahead.arrayZ,
+ lookup.len, lookup.arrayZ, lookup_context);
+ }
+
+ const Coverage &get_coverage () const
+ {
+ const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+ return this+input[0];
+ }
+
+ bool apply (hb_ot_apply_context_t *c) const
+ {
+ TRACE_APPLY (this);
+ const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+
+ unsigned int index = (this+input[0]).get_coverage (c->buffer->cur().codepoint);
+ if (likely (index == NOT_COVERED)) return_trace (false);
+
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ struct ChainContextApplyLookupContext lookup_context = {
+ {match_coverage},
+ {this, this, this}
+ };
+ return_trace (chain_context_apply_lookup (c,
+ backtrack.len, (const HBUINT16 *) backtrack.arrayZ,
+ input.len, (const HBUINT16 *) input.arrayZ + 1,
+ lookahead.len, (const HBUINT16 *) lookahead.arrayZ,
+ lookup.len, lookup.arrayZ, lookup_context));
+ }
+
+ template<typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ bool serialize_coverage_offsets (hb_subset_context_t *c,
+ Iterator it,
+ const void* src_base,
+ const void* dst_base) const
+ {
+ TRACE_SERIALIZE (this);
+ auto *out = c->serializer->start_embed<OffsetArrayOf<Coverage>> ();
+
+ if (unlikely (!c->serializer->allocate_size<HBUINT16> (HBUINT16::static_size))) return_trace (false);
+
+ + it
+ | hb_apply (subset_offset_array (c, *out, src_base, dst_base))
+ ;
+
+ return_trace (out->len);
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+
+ auto *out = c->serializer->start_embed (this);
+ if (unlikely (!out)) return_trace (false);
+ if (unlikely (!c->serializer->embed (this->format))) return_trace (false);
+
+ if (!serialize_coverage_offsets (c, backtrack.iter (), this, out))
+ return_trace (false);
+
+ const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+ if (!serialize_coverage_offsets (c, input.iter (), this, out))
+ return_trace (false);
+
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
+ if (!serialize_coverage_offsets (c, lookahead.iter (), this, out))
+ return_trace (false);
+
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ return_trace (c->serializer->copy (lookup));
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!backtrack.sanitize (c, this)) return_trace (false);
+ const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+ if (!input.sanitize (c, this)) return_trace (false);
+ if (!input.len) return_trace (false); /* To be consistent with Context. */
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
+ if (!lookahead.sanitize (c, this)) return_trace (false);
+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+ return_trace (lookup.sanitize (c));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier--format = 3 */
+ OffsetArrayOf<Coverage>
+ backtrack; /* Array of coverage tables
+ * in backtracking sequence, in glyph
+ * sequence order */
+ OffsetArrayOf<Coverage>
+ inputX ; /* Array of coverage
+ * tables in input sequence, in glyph
+ * sequence order */
+ OffsetArrayOf<Coverage>
+ lookaheadX; /* Array of coverage tables
+ * in lookahead sequence, in glyph
+ * sequence order */
+ ArrayOf<LookupRecord>
+ lookupX; /* Array of LookupRecords--in
+ * design order) */
+ public:
+ DEFINE_SIZE_MIN (10);
+};
+
+struct ChainContext
+{
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+ {
+ TRACE_DISPATCH (this, u.format);
+ if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+ switch (u.format) {
+ case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+ case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
+ case 3: return_trace (c->dispatch (u.format3, hb_forward<Ts> (ds)...));
+ default:return_trace (c->default_return_value ());
+ }
+ }
+
+ protected:
+ union {
+ HBUINT16 format; /* Format identifier */
+ ChainContextFormat1 format1;
+ ChainContextFormat2 format2;
+ ChainContextFormat3 format3;
+ } u;
+};
+
+
+template <typename T>
+struct ExtensionFormat1
+{
+ unsigned int get_type () const { return extensionLookupType; }
+
+ template <typename X>
+ const X& get_subtable () const
+ { return this + CastR<LOffsetTo<typename T::SubTable>> (extensionOffset); }
+
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+ {
+ TRACE_DISPATCH (this, format);
+ if (unlikely (!c->may_dispatch (this, this))) return_trace (c->no_dispatch_return_value ());
+ return_trace (get_subtable<typename T::SubTable> ().dispatch (c, get_type (), hb_forward<Ts> (ds)...));
+ }
+
+ /* This is called from may_dispatch() above with hb_sanitize_context_t. */
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ extensionLookupType != T::SubTable::Extension);
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier. Set to 1. */
+ HBUINT16 extensionLookupType; /* Lookup type of subtable referenced
+ * by ExtensionOffset (i.e. the
+ * extension subtable). */
+ Offset32 extensionOffset; /* Offset to the extension subtable,
+ * of lookup type subtable. */
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+template <typename T>
+struct Extension
+{
+ unsigned int get_type () const
+ {
+ switch (u.format) {
+ case 1: return u.format1.get_type ();
+ default:return 0;
+ }
+ }
+ template <typename X>
+ const X& get_subtable () const
+ {
+ switch (u.format) {
+ case 1: return u.format1.template get_subtable<typename T::SubTable> ();
+ default:return Null(typename T::SubTable);
+ }
+ }
+
+ template <typename context_t, typename ...Ts>
+ typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+ {
+ TRACE_DISPATCH (this, u.format);
+ if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+ switch (u.format) {
+ case 1: return_trace (u.format1.dispatch (c, hb_forward<Ts> (ds)...));
+ default:return_trace (c->default_return_value ());
+ }
+ }
+
+ protected:
+ union {
+ HBUINT16 format; /* Format identifier */
+ ExtensionFormat1<T> format1;
+ } u;
+};
+
+
+/*
+ * GSUB/GPOS Common
+ */
+
+struct hb_ot_layout_lookup_accelerator_t
+{
+ template <typename TLookup>
+ void init (const TLookup &lookup)
+ {
+ digest.init ();
+ lookup.add_coverage (&digest);
+
+ subtables.init ();
+ OT::hb_get_subtables_context_t c_get_subtables (subtables);
+ lookup.dispatch (&c_get_subtables);
+ }
+ void fini () { subtables.fini (); }
+
+ bool may_have (hb_codepoint_t g) const
+ { return digest.may_have (g); }
+
+ bool apply (hb_ot_apply_context_t *c) const
+ {
+ for (unsigned int i = 0; i < subtables.length; i++)
+ if (subtables[i].apply (c))
+ return true;
+ return false;
+ }
+
+ private:
+ hb_set_digest_t digest;
+ hb_get_subtables_context_t::array_t subtables;
+};
+
+struct GSUBGPOS
+{
+ bool has_data () const { return version.to_int (); }
+ unsigned int get_script_count () const
+ { return (this+scriptList).len; }
+ const Tag& get_script_tag (unsigned int i) const
+ { return (this+scriptList).get_tag (i); }
+ unsigned int get_script_tags (unsigned int start_offset,
+ unsigned int *script_count /* IN/OUT */,
+ hb_tag_t *script_tags /* OUT */) const
+ { return (this+scriptList).get_tags (start_offset, script_count, script_tags); }
+ const Script& get_script (unsigned int i) const
+ { return (this+scriptList)[i]; }
+ bool find_script_index (hb_tag_t tag, unsigned int *index) const
+ { return (this+scriptList).find_index (tag, index); }
+
+ unsigned int get_feature_count () const
+ { return (this+featureList).len; }
+ hb_tag_t get_feature_tag (unsigned int i) const
+ { return i == Index::NOT_FOUND_INDEX ? HB_TAG_NONE : (this+featureList).get_tag (i); }
+ unsigned int get_feature_tags (unsigned int start_offset,
+ unsigned int *feature_count /* IN/OUT */,
+ hb_tag_t *feature_tags /* OUT */) const
+ { return (this+featureList).get_tags (start_offset, feature_count, feature_tags); }
+ const Feature& get_feature (unsigned int i) const
+ { return (this+featureList)[i]; }
+ bool find_feature_index (hb_tag_t tag, unsigned int *index) const
+ { return (this+featureList).find_index (tag, index); }
+
+ unsigned int get_lookup_count () const
+ { return (this+lookupList).len; }
+ const Lookup& get_lookup (unsigned int i) const
+ { return (this+lookupList)[i]; }
+
+ bool find_variations_index (const int *coords, unsigned int num_coords,
+ unsigned int *index) const
+ {
+#ifdef HB_NOVAR
+ return false;
+#endif
+ return (version.to_int () >= 0x00010001u ? this+featureVars : Null(FeatureVariations))
+ .find_index (coords, num_coords, index);
+ }
+ const Feature& get_feature_variation (unsigned int feature_index,
+ unsigned int variations_index) const
+ {
+#ifndef HB_NO_VAR
+ if (FeatureVariations::NOT_FOUND_INDEX != variations_index &&
+ version.to_int () >= 0x00010001u)
+ {
+ const Feature *feature = (this+featureVars).find_substitute (variations_index,
+ feature_index);
+ if (feature)
+ return *feature;
+ }
+#endif
+ return get_feature (feature_index);
+ }
+
+ template <typename TLookup>
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ auto *out = c->serializer->embed (*this);
+ if (unlikely (!out)) return_trace (false);
+
+ out->scriptList.serialize_subset (c, scriptList, this, out);
+ out->featureList.serialize_subset (c, featureList, this, out);
+
+ typedef OffsetListOf<TLookup> TLookupList;
+ /* TODO Use intersects() to count how many subtables survive? */
+ CastR<OffsetTo<TLookupList>> (out->lookupList)
+ .serialize_subset (c,
+ CastR<OffsetTo<TLookupList>> (lookupList),
+ this,
+ out);
+
+#ifndef HB_NO_VAR
+ if (version.to_int () >= 0x00010001u)
+ out->featureVars.serialize_copy (c->serializer, featureVars, this, out);
+#endif
+
+ return_trace (true);
+ }
+
+ unsigned int get_size () const
+ {
+ return min_size +
+ (version.to_int () >= 0x00010001u ? featureVars.static_size : 0);
+ }
+
+ template <typename TLookup>
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ typedef OffsetListOf<TLookup> TLookupList;
+ if (unlikely (!(version.sanitize (c) &&
+ likely (version.major == 1) &&
+ scriptList.sanitize (c, this) &&
+ featureList.sanitize (c, this) &&
+ CastR<OffsetTo<TLookupList>> (lookupList).sanitize (c, this))))
+ return_trace (false);
+
+#ifndef HB_NO_VAR
+ if (unlikely (!(version.to_int () < 0x00010001u || featureVars.sanitize (c, this))))
+ return_trace (false);
+#endif
+
+ return_trace (true);
+ }
+
+ template <typename T>
+ struct accelerator_t
+ {
+ void init (hb_face_t *face)
+ {
+ this->table = hb_sanitize_context_t().reference_table<T> (face);
+ if (unlikely (this->table->is_blacklisted (this->table.get_blob (), face)))
+ {
+ hb_blob_destroy (this->table.get_blob ());
+ this->table = hb_blob_get_empty ();
+ }
+
+ this->lookup_count = table->get_lookup_count ();
+
+ this->accels = (hb_ot_layout_lookup_accelerator_t *) calloc (this->lookup_count, sizeof (hb_ot_layout_lookup_accelerator_t));
+ if (unlikely (!this->accels))
+ this->lookup_count = 0;
+
+ for (unsigned int i = 0; i < this->lookup_count; i++)
+ this->accels[i].init (table->get_lookup (i));
+ }
+
+ void fini ()
+ {
+ for (unsigned int i = 0; i < this->lookup_count; i++)
+ this->accels[i].fini ();
+ free (this->accels);
+ this->table.destroy ();
+ }
+
+ hb_blob_ptr_t<T> table;
+ unsigned int lookup_count;
+ hb_ot_layout_lookup_accelerator_t *accels;
+ };
+
+ protected:
+ FixedVersion<>version; /* Version of the GSUB/GPOS table--initially set
+ * to 0x00010000u */
+ OffsetTo<ScriptList>
+ scriptList; /* ScriptList table */
+ OffsetTo<FeatureList>
+ featureList; /* FeatureList table */
+ OffsetTo<LookupList>
+ lookupList; /* LookupList table */
+ LOffsetTo<FeatureVariations>
+ featureVars; /* Offset to Feature Variations
+ table--from beginning of table
+ * (may be NULL). Introduced
+ * in version 0x00010001. */
+ public:
+ DEFINE_SIZE_MIN (10);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_GSUBGPOS_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-jstf-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-jstf-table.hh
index adbaad64f3..53eb623cf5 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-jstf-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-jstf-table.hh
@@ -27,7 +27,7 @@
#ifndef HB_OT_LAYOUT_JSTF_TABLE_HH
#define HB_OT_LAYOUT_JSTF_TABLE_HH
-#include "hb-open-type-private.hh"
+#include "hb-open-type.hh"
#include "hb-ot-layout-gpos-table.hh"
@@ -54,7 +54,7 @@ typedef OffsetListOf<PosLookup> JstfMax;
struct JstfPriority
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -123,8 +123,8 @@ struct JstfPriority
struct JstfLangSys : OffsetListOf<JstfPriority>
{
- inline bool sanitize (hb_sanitize_context_t *c,
- const Record<JstfLangSys>::sanitize_closure_t * = nullptr) const
+ bool sanitize (hb_sanitize_context_t *c,
+ const Record_sanitize_closure_t * = nullptr) const
{
TRACE_SANITIZE (this);
return_trace (OffsetListOf<JstfPriority>::sanitize (c));
@@ -136,7 +136,7 @@ struct JstfLangSys : OffsetListOf<JstfPriority>
* ExtenderGlyphs -- Extender Glyph Table
*/
-typedef SortedArrayOf<GlyphID> ExtenderGlyphs;
+typedef SortedArrayOf<HBGlyphID> ExtenderGlyphs;
/*
@@ -145,27 +145,27 @@ typedef SortedArrayOf<GlyphID> ExtenderGlyphs;
struct JstfScript
{
- inline unsigned int get_lang_sys_count (void) const
+ unsigned int get_lang_sys_count () const
{ return langSys.len; }
- inline const Tag& get_lang_sys_tag (unsigned int i) const
+ const Tag& get_lang_sys_tag (unsigned int i) const
{ return langSys.get_tag (i); }
- inline unsigned int get_lang_sys_tags (unsigned int start_offset,
- unsigned int *lang_sys_count /* IN/OUT */,
- hb_tag_t *lang_sys_tags /* OUT */) const
+ unsigned int get_lang_sys_tags (unsigned int start_offset,
+ unsigned int *lang_sys_count /* IN/OUT */,
+ hb_tag_t *lang_sys_tags /* OUT */) const
{ return langSys.get_tags (start_offset, lang_sys_count, lang_sys_tags); }
- inline const JstfLangSys& get_lang_sys (unsigned int i) const
+ const JstfLangSys& get_lang_sys (unsigned int i) const
{
if (i == Index::NOT_FOUND_INDEX) return get_default_lang_sys ();
return this+langSys[i].offset;
}
- inline bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const
+ bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const
{ return langSys.find_index (tag, index); }
- inline bool has_default_lang_sys (void) const { return defaultLangSys != 0; }
- inline const JstfLangSys& get_default_lang_sys (void) const { return this+defaultLangSys; }
+ bool has_default_lang_sys () const { return defaultLangSys != 0; }
+ const JstfLangSys& get_default_lang_sys () const { return this+defaultLangSys; }
- inline bool sanitize (hb_sanitize_context_t *c,
- const Record<JstfScript>::sanitize_closure_t * = nullptr) const
+ bool sanitize (hb_sanitize_context_t *c,
+ const Record_sanitize_closure_t * = nullptr) const
{
TRACE_SANITIZE (this);
return_trace (extenderGlyphs.sanitize (c, this) &&
@@ -189,27 +189,28 @@ struct JstfScript
/*
- * JSTF -- The Justification Table
+ * JSTF -- Justification
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/jstf
*/
struct JSTF
{
- static const hb_tag_t tableTag = HB_OT_TAG_JSTF;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_JSTF;
- inline unsigned int get_script_count (void) const
+ unsigned int get_script_count () const
{ return scriptList.len; }
- inline const Tag& get_script_tag (unsigned int i) const
+ const Tag& get_script_tag (unsigned int i) const
{ return scriptList.get_tag (i); }
- inline unsigned int get_script_tags (unsigned int start_offset,
- unsigned int *script_count /* IN/OUT */,
- hb_tag_t *script_tags /* OUT */) const
+ unsigned int get_script_tags (unsigned int start_offset,
+ unsigned int *script_count /* IN/OUT */,
+ hb_tag_t *script_tags /* OUT */) const
{ return scriptList.get_tags (start_offset, script_count, script_tags); }
- inline const JstfScript& get_script (unsigned int i) const
+ const JstfScript& get_script (unsigned int i) const
{ return this+scriptList[i].offset; }
- inline bool find_script_index (hb_tag_t tag, unsigned int *index) const
+ bool find_script_index (hb_tag_t tag, unsigned int *index) const
{ return scriptList.find_index (tag, index); }
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (version.sanitize (c) &&
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-math-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-math-table.hh
deleted file mode 100644
index b52b1215d2..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-math-table.hh
+++ /dev/null
@@ -1,722 +0,0 @@
-/*
- * Copyright © 2016 Igalia S.L.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Igalia Author(s): Frédéric Wang
- */
-
-#ifndef HB_OT_LAYOUT_MATH_TABLE_HH
-#define HB_OT_LAYOUT_MATH_TABLE_HH
-
-#include "hb-open-type-private.hh"
-#include "hb-ot-layout-common-private.hh"
-#include "hb-ot-math.h"
-
-namespace OT {
-
-
-struct MathValueRecord
-{
- inline hb_position_t get_x_value (hb_font_t *font, const void *base) const
- { return font->em_scale_x (value) + (base+deviceTable).get_x_delta (font); }
- inline hb_position_t get_y_value (hb_font_t *font, const void *base) const
- { return font->em_scale_y (value) + (base+deviceTable).get_y_delta (font); }
-
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && deviceTable.sanitize (c, base));
- }
-
- protected:
- SHORT value; /* The X or Y value in design units */
- OffsetTo<Device> deviceTable; /* Offset to the device table - from the
- * beginning of parent table. May be NULL.
- * Suggested format for device table is 1. */
-
- public:
- DEFINE_SIZE_STATIC (4);
-};
-
-struct MathConstants
-{
- inline bool sanitize_math_value_records (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
-
- unsigned int count = ARRAY_LENGTH (mathValueRecords);
- for (unsigned int i = 0; i < count; i++)
- if (!mathValueRecords[i].sanitize (c, this))
- return_trace (false);
-
- return_trace (true);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && sanitize_math_value_records(c));
- }
-
- inline hb_position_t get_value (hb_ot_math_constant_t constant,
- hb_font_t *font) const
- {
- switch (constant) {
-
- case HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN:
- case HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN:
- return percentScaleDown[constant - HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN];
-
- case HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT:
- case HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT:
- return font->em_scale_y (minHeight[constant - HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT]);
-
- case HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE:
- case HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE:
- case HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP:
- case HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT:
- return mathValueRecords[constant - HB_OT_MATH_CONSTANT_MATH_LEADING].get_x_value(font, this);
-
- case HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT:
- case HB_OT_MATH_CONSTANT_AXIS_HEIGHT:
- case HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT:
- case HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN:
- case HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN:
- case HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN:
- case HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN:
- case HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP:
- case HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN:
- case HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP:
- case HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN:
- case HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS:
- case HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN:
- case HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN:
- case HB_OT_MATH_CONSTANT_MATH_LEADING:
- case HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER:
- case HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS:
- case HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP:
- case HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP:
- case HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER:
- case HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS:
- case HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP:
- case HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP:
- case HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN:
- case HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN:
- case HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN:
- case HB_OT_MATH_CONSTANT_STACK_GAP_MIN:
- case HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP:
- case HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP:
- case HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN:
- case HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN:
- case HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN:
- case HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP:
- case HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN:
- case HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN:
- case HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX:
- case HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN:
- case HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX:
- case HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT:
- case HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN:
- case HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP:
- case HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED:
- case HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER:
- case HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS:
- case HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP:
- case HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN:
- case HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN:
- return mathValueRecords[constant - HB_OT_MATH_CONSTANT_MATH_LEADING].get_y_value(font, this);
-
- case HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT:
- return radicalDegreeBottomRaisePercent;
-
- default:
- return 0;
- }
- }
-
- protected:
- SHORT percentScaleDown[2];
- USHORT minHeight[2];
- MathValueRecord mathValueRecords[51];
- SHORT radicalDegreeBottomRaisePercent;
-
- public:
- DEFINE_SIZE_STATIC (214);
-};
-
-struct MathItalicsCorrectionInfo
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- coverage.sanitize (c, this) &&
- italicsCorrection.sanitize (c, this));
- }
-
- inline hb_position_t get_value (hb_codepoint_t glyph,
- hb_font_t *font) const
- {
- unsigned int index = (this+coverage).get_coverage (glyph);
- return italicsCorrection[index].get_x_value (font, this);
- }
-
- protected:
- OffsetTo<Coverage> coverage; /* Offset to Coverage table -
- * from the beginning of
- * MathItalicsCorrectionInfo
- * table. */
- ArrayOf<MathValueRecord> italicsCorrection; /* Array of MathValueRecords
- * defining italics correction
- * values for each
- * covered glyph. */
-
- public:
- DEFINE_SIZE_ARRAY (4, italicsCorrection);
-};
-
-struct MathTopAccentAttachment
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- topAccentCoverage.sanitize (c, this) &&
- topAccentAttachment.sanitize (c, this));
- }
-
- inline hb_position_t get_value (hb_codepoint_t glyph,
- hb_font_t *font) const
- {
- unsigned int index = (this+topAccentCoverage).get_coverage (glyph);
- if (index == NOT_COVERED)
- return font->get_glyph_h_advance (glyph) / 2;
- return topAccentAttachment[index].get_x_value(font, this);
- }
-
- protected:
- OffsetTo<Coverage> topAccentCoverage; /* Offset to Coverage table -
- * from the beginning of
- * MathTopAccentAttachment
- * table. */
- ArrayOf<MathValueRecord> topAccentAttachment; /* Array of MathValueRecords
- * defining top accent
- * attachment points for each
- * covered glyph. */
-
- public:
- DEFINE_SIZE_ARRAY (2 + 2, topAccentAttachment);
-};
-
-struct MathKern
-{
- inline bool sanitize_math_value_records (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- unsigned int count = 2 * heightCount + 1;
- for (unsigned int i = 0; i < count; i++)
- if (!mathValueRecords[i].sanitize (c, this)) return_trace (false);
- return_trace (true);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- c->check_array (mathValueRecords,
- mathValueRecords[0].static_size,
- 2 * heightCount + 1) &&
- sanitize_math_value_records (c));
- }
-
- inline hb_position_t get_value (hb_position_t correction_height, hb_font_t *font) const
- {
- const MathValueRecord* correctionHeight = mathValueRecords;
- const MathValueRecord* kernValue = mathValueRecords + heightCount;
- int sign = font->y_scale < 0 ? -1 : +1;
-
- /* The description of the MathKern table is a ambiguous, but interpreting
- * "between the two heights found at those indexes" for 0 < i < len as
- *
- * correctionHeight[i-1] < correction_height <= correctionHeight[i]
- *
- * makes the result consistent with the limit cases and we can just use the
- * binary search algorithm of std::upper_bound:
- */
- unsigned int i = 0;
- unsigned int count = heightCount;
- while (count > 0)
- {
- unsigned int half = count / 2;
- hb_position_t height = correctionHeight[i + half].get_y_value(font, this);
- if (sign * height < sign * correction_height)
- {
- i += half + 1;
- count -= half + 1;
- } else
- count = half;
- }
- return kernValue[i].get_x_value(font, this);
- }
-
- protected:
- USHORT heightCount;
- MathValueRecord mathValueRecords[VAR]; /* Array of correction heights at
- * which the kern value changes.
- * Sorted by the height value in
- * design units (heightCount entries),
- * Followed by:
- * Array of kern values corresponding
- * to heights. (heightCount+1 entries).
- */
-
- public:
- DEFINE_SIZE_ARRAY (2, mathValueRecords);
-};
-
-struct MathKernInfoRecord
-{
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
- {
- TRACE_SANITIZE (this);
-
- unsigned int count = ARRAY_LENGTH (mathKern);
- for (unsigned int i = 0; i < count; i++)
- if (unlikely (!mathKern[i].sanitize (c, base)))
- return_trace (false);
-
- return_trace (true);
- }
-
- inline hb_position_t get_kerning (hb_ot_math_kern_t kern,
- hb_position_t correction_height,
- hb_font_t *font,
- const void *base) const
- {
- unsigned int idx = kern;
- if (unlikely (idx >= ARRAY_LENGTH (mathKern))) return 0;
- return (base+mathKern[idx]).get_value (correction_height, font);
- }
-
- protected:
- /* Offset to MathKern table for each corner -
- * from the beginning of MathKernInfo table. May be NULL. */
- OffsetTo<MathKern> mathKern[4];
-
- public:
- DEFINE_SIZE_STATIC (8);
-};
-
-struct MathKernInfo
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- mathKernCoverage.sanitize (c, this) &&
- mathKernInfoRecords.sanitize (c, this));
- }
-
- inline hb_position_t get_kerning (hb_codepoint_t glyph,
- hb_ot_math_kern_t kern,
- hb_position_t correction_height,
- hb_font_t *font) const
- {
- unsigned int index = (this+mathKernCoverage).get_coverage (glyph);
- return mathKernInfoRecords[index].get_kerning (kern, correction_height, font, this);
- }
-
- protected:
- OffsetTo<Coverage> mathKernCoverage; /* Offset to Coverage table -
- * from the beginning of the
- * MathKernInfo table. */
- ArrayOf<MathKernInfoRecord> mathKernInfoRecords; /* Array of
- * MathKernInfoRecords,
- * per-glyph information for
- * mathematical positioning
- * of subscripts and
- * superscripts. */
-
- public:
- DEFINE_SIZE_ARRAY (4, mathKernInfoRecords);
-};
-
-struct MathGlyphInfo
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- mathItalicsCorrectionInfo.sanitize (c, this) &&
- mathTopAccentAttachment.sanitize (c, this) &&
- extendedShapeCoverage.sanitize (c, this) &&
- mathKernInfo.sanitize(c, this));
- }
-
- inline hb_position_t
- get_italics_correction (hb_codepoint_t glyph, hb_font_t *font) const
- { return (this+mathItalicsCorrectionInfo).get_value (glyph, font); }
-
- inline hb_position_t
- get_top_accent_attachment (hb_codepoint_t glyph, hb_font_t *font) const
- { return (this+mathTopAccentAttachment).get_value (glyph, font); }
-
- inline bool is_extended_shape (hb_codepoint_t glyph) const
- { return (this+extendedShapeCoverage).get_coverage (glyph) != NOT_COVERED; }
-
- inline hb_position_t get_kerning (hb_codepoint_t glyph,
- hb_ot_math_kern_t kern,
- hb_position_t correction_height,
- hb_font_t *font) const
- { return (this+mathKernInfo).get_kerning (glyph, kern, correction_height, font); }
-
- protected:
- /* Offset to MathItalicsCorrectionInfo table -
- * from the beginning of MathGlyphInfo table. */
- OffsetTo<MathItalicsCorrectionInfo> mathItalicsCorrectionInfo;
-
- /* Offset to MathTopAccentAttachment table -
- * from the beginning of MathGlyphInfo table. */
- OffsetTo<MathTopAccentAttachment> mathTopAccentAttachment;
-
- /* Offset to coverage table for Extended Shape glyphs -
- * from the beginning of MathGlyphInfo table. When the left or right glyph of
- * a box is an extended shape variant, the (ink) box (and not the default
- * position defined by values in MathConstants table) should be used for
- * vertical positioning purposes. May be NULL.. */
- OffsetTo<Coverage> extendedShapeCoverage;
-
- /* Offset to MathKernInfo table -
- * from the beginning of MathGlyphInfo table. */
- OffsetTo<MathKernInfo> mathKernInfo;
-
- public:
- DEFINE_SIZE_STATIC (8);
-};
-
-struct MathGlyphVariantRecord
-{
- friend struct MathGlyphConstruction;
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- protected:
- GlyphID variantGlyph; /* Glyph ID for the variant. */
- USHORT advanceMeasurement; /* Advance width/height, in design units, of the
- * variant, in the direction of requested
- * glyph extension. */
-
- public:
- DEFINE_SIZE_STATIC (4);
-};
-
-struct PartFlags : USHORT
-{
- enum Flags {
- Extender = 0x0001u, /* If set, the part can be skipped or repeated. */
-
- Defined = 0x0001u, /* All defined flags. */
- };
-
- public:
- DEFINE_SIZE_STATIC (2);
-};
-
-struct MathGlyphPartRecord
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this));
- }
-
- inline void extract (hb_ot_math_glyph_part_t &out,
- int scale,
- hb_font_t *font) const
- {
- out.glyph = glyph;
-
- out.start_connector_length = font->em_scale (startConnectorLength, scale);
- out.end_connector_length = font->em_scale (endConnectorLength, scale);
- out.full_advance = font->em_scale (fullAdvance, scale);
-
- ASSERT_STATIC ((unsigned int) HB_MATH_GLYPH_PART_FLAG_EXTENDER ==
- (unsigned int) PartFlags::Extender);
-
- out.flags = (hb_ot_math_glyph_part_flags_t)
- (unsigned int)
- (partFlags & PartFlags::Defined);
- }
-
- protected:
- GlyphID glyph; /* Glyph ID for the part. */
- USHORT startConnectorLength; /* Advance width/ height of the straight bar
- * connector material, in design units, is at
- * the beginning of the glyph, in the
- * direction of the extension. */
- USHORT endConnectorLength; /* Advance width/ height of the straight bar
- * connector material, in design units, is at
- * the end of the glyph, in the direction of
- * the extension. */
- USHORT fullAdvance; /* Full advance width/height for this part,
- * in the direction of the extension.
- * In design units. */
- PartFlags partFlags; /* Part qualifiers. */
-
- public:
- DEFINE_SIZE_STATIC (10);
-};
-
-struct MathGlyphAssembly
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- italicsCorrection.sanitize(c, this) &&
- partRecords.sanitize(c));
- }
-
- inline unsigned int get_parts (hb_direction_t direction,
- hb_font_t *font,
- unsigned int start_offset,
- unsigned int *parts_count, /* IN/OUT */
- hb_ot_math_glyph_part_t *parts /* OUT */,
- hb_position_t *italics_correction /* OUT */) const
- {
- if (parts_count)
- {
- int scale = font->dir_scale (direction);
- const MathGlyphPartRecord *arr =
- partRecords.sub_array (start_offset, parts_count);
- unsigned int count = *parts_count;
- for (unsigned int i = 0; i < count; i++)
- arr[i].extract (parts[i], scale, font);
- }
-
- if (italics_correction)
- *italics_correction = italicsCorrection.get_x_value (font, this);
-
- return partRecords.len;
- }
-
- protected:
- MathValueRecord italicsCorrection; /* Italics correction of this
- * MathGlyphAssembly. Should not
- * depend on the assembly size. */
- ArrayOf<MathGlyphPartRecord> partRecords; /* Array of part records, from
- * left to right and bottom to
- * top. */
-
- public:
- DEFINE_SIZE_ARRAY (6, partRecords);
-};
-
-struct MathGlyphConstruction
-{
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- glyphAssembly.sanitize(c, this) &&
- mathGlyphVariantRecord.sanitize(c));
- }
-
- inline const MathGlyphAssembly &get_assembly (void) const
- { return this+glyphAssembly; }
-
- inline unsigned int get_variants (hb_direction_t direction,
- hb_font_t *font,
- unsigned int start_offset,
- unsigned int *variants_count, /* IN/OUT */
- hb_ot_math_glyph_variant_t *variants /* OUT */) const
- {
- if (variants_count)
- {
- int scale = font->dir_scale (direction);
- const MathGlyphVariantRecord *arr =
- mathGlyphVariantRecord.sub_array (start_offset, variants_count);
- unsigned int count = *variants_count;
- for (unsigned int i = 0; i < count; i++)
- {
- variants[i].glyph = arr[i].variantGlyph;
- variants[i].advance = font->em_scale (arr[i].advanceMeasurement, scale);
- }
- }
- return mathGlyphVariantRecord.len;
- }
-
- protected:
- /* Offset to MathGlyphAssembly table for this shape - from the beginning of
- MathGlyphConstruction table. May be NULL. */
- OffsetTo<MathGlyphAssembly> glyphAssembly;
-
- /* MathGlyphVariantRecords for alternative variants of the glyphs. */
- ArrayOf<MathGlyphVariantRecord> mathGlyphVariantRecord;
-
- public:
- DEFINE_SIZE_ARRAY (4, mathGlyphVariantRecord);
-};
-
-struct MathVariants
-{
- inline bool sanitize_offsets (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- unsigned int count = vertGlyphCount + horizGlyphCount;
- for (unsigned int i = 0; i < count; i++)
- if (!glyphConstruction[i].sanitize (c, this)) return_trace (false);
- return_trace (true);
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- vertGlyphCoverage.sanitize (c, this) &&
- horizGlyphCoverage.sanitize (c, this) &&
- c->check_array (glyphConstruction,
- glyphConstruction[0].static_size,
- vertGlyphCount + horizGlyphCount) &&
- sanitize_offsets (c));
- }
-
- inline hb_position_t get_min_connector_overlap (hb_direction_t direction,
- hb_font_t *font) const
- { return font->em_scale_dir (minConnectorOverlap, direction); }
-
- inline unsigned int get_glyph_variants (hb_codepoint_t glyph,
- hb_direction_t direction,
- hb_font_t *font,
- unsigned int start_offset,
- unsigned int *variants_count, /* IN/OUT */
- hb_ot_math_glyph_variant_t *variants /* OUT */) const
- { return get_glyph_construction (glyph, direction, font)
- .get_variants (direction, font, start_offset, variants_count, variants); }
-
- inline unsigned int get_glyph_parts (hb_codepoint_t glyph,
- hb_direction_t direction,
- hb_font_t *font,
- unsigned int start_offset,
- unsigned int *parts_count, /* IN/OUT */
- hb_ot_math_glyph_part_t *parts /* OUT */,
- hb_position_t *italics_correction /* OUT */) const
- { return get_glyph_construction (glyph, direction, font)
- .get_assembly ()
- .get_parts (direction, font,
- start_offset, parts_count, parts,
- italics_correction); }
-
- private:
- inline const MathGlyphConstruction &
- get_glyph_construction (hb_codepoint_t glyph,
- hb_direction_t direction,
- hb_font_t *font) const
- {
- bool vertical = HB_DIRECTION_IS_VERTICAL (direction);
- unsigned int count = vertical ? vertGlyphCount : horizGlyphCount;
- const OffsetTo<Coverage> &coverage = vertical ? vertGlyphCoverage
- : horizGlyphCoverage;
-
- unsigned int index = (this+coverage).get_coverage (glyph);
- if (unlikely (index >= count)) return Null(MathGlyphConstruction);
-
- if (!vertical)
- index += vertGlyphCount;
-
- return this+glyphConstruction[index];
- }
-
- protected:
- USHORT minConnectorOverlap; /* Minimum overlap of connecting
- * glyphs during glyph construction,
- * in design units. */
- OffsetTo<Coverage> vertGlyphCoverage; /* Offset to Coverage table -
- * from the beginning of MathVariants
- * table. */
- OffsetTo<Coverage> horizGlyphCoverage; /* Offset to Coverage table -
- * from the beginning of MathVariants
- * table. */
- USHORT vertGlyphCount; /* Number of glyphs for which
- * information is provided for
- * vertically growing variants. */
- USHORT horizGlyphCount; /* Number of glyphs for which
- * information is provided for
- * horizontally growing variants. */
-
- /* Array of offsets to MathGlyphConstruction tables - from the beginning of
- the MathVariants table, for shapes growing in vertical/horizontal
- direction. */
- OffsetTo<MathGlyphConstruction> glyphConstruction[VAR];
-
- public:
- DEFINE_SIZE_ARRAY (10, glyphConstruction);
-};
-
-
-/*
- * MATH -- The MATH Table
- */
-
-struct MATH
-{
- static const hb_tag_t tableTag = HB_OT_TAG_MATH;
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (version.sanitize (c) &&
- likely (version.major == 1) &&
- mathConstants.sanitize (c, this) &&
- mathGlyphInfo.sanitize (c, this) &&
- mathVariants.sanitize (c, this));
- }
-
- inline hb_position_t get_constant (hb_ot_math_constant_t constant,
- hb_font_t *font) const
- { return (this+mathConstants).get_value (constant, font); }
-
- inline const MathGlyphInfo &get_math_glyph_info (void) const
- { return this+mathGlyphInfo; }
-
- inline const MathVariants &get_math_variants (void) const
- { return this+mathVariants; }
-
- protected:
- FixedVersion<>version; /* Version of the MATH table
- * initially set to 0x00010000u */
- OffsetTo<MathConstants> mathConstants;/* MathConstants table */
- OffsetTo<MathGlyphInfo> mathGlyphInfo;/* MathGlyphInfo table */
- OffsetTo<MathVariants> mathVariants; /* MathVariants table */
-
- public:
- DEFINE_SIZE_STATIC (10);
-};
-
-} /* mathspace OT */
-
-
-#endif /* HB_OT_LAYOUT_MATH_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-private.hh
deleted file mode 100644
index 0f0926f890..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-private.hh
+++ /dev/null
@@ -1,635 +0,0 @@
-/*
- * Copyright © 2007,2008,2009 Red Hat, Inc.
- * Copyright © 2012,2013 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_LAYOUT_PRIVATE_HH
-#define HB_OT_LAYOUT_PRIVATE_HH
-
-#include "hb-private.hh"
-
-#include "hb-font-private.hh"
-#include "hb-buffer-private.hh"
-#include "hb-set-digest-private.hh"
-#include "hb-open-type-private.hh"
-
-
-/* Private API corresponding to hb-ot-layout.h: */
-
-HB_INTERNAL hb_bool_t
-hb_ot_layout_table_find_feature (hb_face_t *face,
- hb_tag_t table_tag,
- hb_tag_t feature_tag,
- unsigned int *feature_index);
-
-
-/*
- * GDEF
- */
-
-enum hb_ot_layout_glyph_props_flags_t
-{
- /* The following three match LookupFlags::Ignore* numbers. */
- HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH = 0x02u,
- HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE = 0x04u,
- HB_OT_LAYOUT_GLYPH_PROPS_MARK = 0x08u,
-
- /* The following are used internally; not derived from GDEF. */
- HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED = 0x10u,
- HB_OT_LAYOUT_GLYPH_PROPS_LIGATED = 0x20u,
- HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED = 0x40u,
-
- HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE = HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED |
- HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
- HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED
-};
-HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t);
-
-
-/*
- * GSUB/GPOS
- */
-
-HB_INTERNAL hb_bool_t
-hb_ot_layout_lookup_would_substitute_fast (hb_face_t *face,
- unsigned int lookup_index,
- const hb_codepoint_t *glyphs,
- unsigned int glyphs_length,
- hb_bool_t zero_context);
-
-
-/* Should be called before all the substitute_lookup's are done. */
-HB_INTERNAL void
-hb_ot_layout_substitute_start (hb_font_t *font,
- hb_buffer_t *buffer);
-
-
-struct hb_ot_layout_lookup_accelerator_t;
-
-namespace OT {
- struct hb_apply_context_t;
- struct SubstLookup;
-}
-
-HB_INTERNAL void
-hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c,
- const OT::SubstLookup &lookup,
- const hb_ot_layout_lookup_accelerator_t &accel);
-
-
-/* Should be called before all the position_lookup's are done. */
-HB_INTERNAL void
-hb_ot_layout_position_start (hb_font_t *font,
- hb_buffer_t *buffer);
-
-/* Should be called after all the position_lookup's are done, to finish advances. */
-HB_INTERNAL void
-hb_ot_layout_position_finish_advances (hb_font_t *font,
- hb_buffer_t *buffer);
-
-/* Should be called after hb_ot_layout_position_finish_advances, to finish offsets. */
-HB_INTERNAL void
-hb_ot_layout_position_finish_offsets (hb_font_t *font,
- hb_buffer_t *buffer);
-
-
-
-/*
- * hb_ot_layout_t
- */
-
-namespace OT {
- struct GDEF;
- struct GSUB;
- struct GPOS;
- struct MATH;
- struct fvar;
- struct avar;
-}
-
-struct hb_ot_layout_lookup_accelerator_t
-{
- template <typename TLookup>
- inline void init (const TLookup &lookup)
- {
- digest.init ();
- lookup.add_coverage (&digest);
- }
-
- inline void fini (void)
- {
- }
-
- inline bool may_have (hb_codepoint_t g) const {
- return digest.may_have (g);
- }
-
- private:
- hb_set_digest_t digest;
-};
-
-struct hb_ot_layout_t
-{
- hb_blob_t *gdef_blob;
- hb_blob_t *gsub_blob;
- hb_blob_t *gpos_blob;
-
- const struct OT::GDEF *gdef;
- const struct OT::GSUB *gsub;
- const struct OT::GPOS *gpos;
-
- /* TODO Move the following out of this struct. */
- OT::hb_lazy_table_loader_t<struct OT::MATH> math;
- OT::hb_lazy_table_loader_t<struct OT::fvar> fvar;
- OT::hb_lazy_table_loader_t<struct OT::avar> avar;
-
- unsigned int gsub_lookup_count;
- unsigned int gpos_lookup_count;
-
- hb_ot_layout_lookup_accelerator_t *gsub_accels;
- hb_ot_layout_lookup_accelerator_t *gpos_accels;
-};
-
-
-HB_INTERNAL hb_ot_layout_t *
-_hb_ot_layout_create (hb_face_t *face);
-
-HB_INTERNAL void
-_hb_ot_layout_destroy (hb_ot_layout_t *layout);
-
-
-#define hb_ot_layout_from_face(face) ((hb_ot_layout_t *) face->shaper_data.ot)
-
-
-/*
- * Buffer var routines.
- */
-
-/* buffer var allocations, used during the entire shaping process */
-#define unicode_props() var2.u16[0]
-
-/* buffer var allocations, used during the GSUB/GPOS processing */
-#define glyph_props() var1.u16[0] /* GDEF glyph properties */
-#define lig_props() var1.u8[2] /* GSUB/GPOS ligature tracking */
-#define syllable() var1.u8[3] /* GSUB/GPOS shaping boundaries */
-
-
-/* Loop over syllables. Based on foreach_cluster(). */
-#define foreach_syllable(buffer, start, end) \
- for (unsigned int \
- _count = buffer->len, \
- start = 0, end = _count ? _next_syllable (buffer, 0) : 0; \
- start < _count; \
- start = end, end = _next_syllable (buffer, start))
-
-static inline unsigned int
-_next_syllable (hb_buffer_t *buffer, unsigned int start)
-{
- hb_glyph_info_t *info = buffer->info;
- unsigned int count = buffer->len;
-
- unsigned int syllable = info[start].syllable();
- while (++start < count && syllable == info[start].syllable())
- ;
-
- return start;
-}
-
-
-/* unicode_props */
-
-/* Design:
- * unicode_props() is a two-byte number. The low byte includes:
- * - General_Category: 5 bits.
- * - A bit each for:
- * * Is it Default_Ignorable(); we have a modified Default_Ignorable().
- * * Whether it's one of the three Mongolian Free Variation Selectors,
- * CGJ, or other characters that are hidden but should not be ignored
- * like most other Default_Ignorable()s do during matching.
- * * One free bit right now.
- *
- * The high-byte has different meanings, switched by the Gen-Cat:
- * - For Mn,Mc,Me: the modified Combining_Class.
- * - For Cf: whether it's ZWJ, ZWNJ, or something else.
- * - For Ws: index of which space character this is, if space fallback
- * is needed, ie. we don't set this by default, only if asked to.
- */
-
-enum hb_unicode_props_flags_t {
- UPROPS_MASK_GEN_CAT = 0x001Fu,
- UPROPS_MASK_IGNORABLE = 0x0020u,
- UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3,
- * or TAG characters */
-
- /* If GEN_CAT=FORMAT, top byte masks: */
- UPROPS_MASK_Cf_ZWJ = 0x0100u,
- UPROPS_MASK_Cf_ZWNJ = 0x0200u
-};
-HB_MARK_AS_FLAG_T (hb_unicode_props_flags_t);
-
-static inline void
-_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
-{
- hb_unicode_funcs_t *unicode = buffer->unicode;
- unsigned int u = info->codepoint;
- unsigned int gen_cat = (unsigned int) unicode->general_category (u);
- unsigned int props = gen_cat;
-
- if (u >= 0x80)
- {
- buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
- if (unlikely (unicode->is_default_ignorable (u)))
- {
- buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
- props |= UPROPS_MASK_IGNORABLE;
- if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
- else if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
- /* Mongolian Free Variation Selectors need to be remembered
- * because although we need to hide them like default-ignorables,
- * they need to non-ignorable during shaping. This is similar to
- * what we do for joiners in Indic-like shapers, but since the
- * FVSes are GC=Mn, we have use a separate bit to remember them.
- * Fixes:
- * https://github.com/harfbuzz/harfbuzz/issues/234 */
- else if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_HIDDEN;
- /* TAG characters need similar treatment. Fixes:
- * https://github.com/harfbuzz/harfbuzz/issues/463 */
- else if (unlikely (hb_in_range (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN;
- /* COMBINING GRAPHEME JOINER should not be skipped; at least some times.
- * https://github.com/harfbuzz/harfbuzz/issues/554 */
- else if (unlikely (u == 0x034Fu)) props |= UPROPS_MASK_HIDDEN;
- }
- else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat)))
- {
- /* The above check is just an optimization to let in only things we need further
- * processing on. */
-
- /* Only Mn and Mc can have non-zero ccc:
- * http://www.unicode.org/policies/stability_policy.html#Property_Value
- * """
- * Canonical_Combining_Class, General_Category
- * All characters other than those with General_Category property values
- * Spacing_Mark (Mc) and Nonspacing_Mark (Mn) have the Canonical_Combining_Class
- * property value 0.
- * 1.1.5+
- * """
- *
- * Also, all Mn's that are Default_Ignorable, have ccc=0, hence
- * the "else if".
- */
- props |= unicode->modified_combining_class (info->codepoint)<<8;
-
- /* Recategorize emoji skin-tone modifiers as Unicode mark, so they
- * behave correctly in non-native directionality. They originally
- * are MODIFIER_SYMBOL. Fixes:
- * https://github.com/harfbuzz/harfbuzz/issues/169
- */
- if (unlikely (hb_in_range (u, 0x1F3FBu, 0x1F3FFu)))
- {
- props = gen_cat = HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK;
- }
- }
- }
-
- info->unicode_props() = props;
-}
-
-static inline void
-_hb_glyph_info_set_general_category (hb_glyph_info_t *info,
- hb_unicode_general_category_t gen_cat)
-{
- /* Clears top-byte. */
- info->unicode_props() = (unsigned int) gen_cat | (info->unicode_props() & (0xFF & ~UPROPS_MASK_GEN_CAT));
-}
-
-static inline hb_unicode_general_category_t
-_hb_glyph_info_get_general_category (const hb_glyph_info_t *info)
-{
- return (hb_unicode_general_category_t) (info->unicode_props() & UPROPS_MASK_GEN_CAT);
-}
-
-static inline bool
-_hb_glyph_info_is_unicode_mark (const hb_glyph_info_t *info)
-{
- return HB_UNICODE_GENERAL_CATEGORY_IS_MARK (info->unicode_props() & UPROPS_MASK_GEN_CAT);
-}
-static inline void
-_hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info,
- unsigned int modified_class)
-{
- if (unlikely (!_hb_glyph_info_is_unicode_mark (info)))
- return;
- info->unicode_props() = (modified_class<<8) | (info->unicode_props() & 0xFF);
-}
-static inline unsigned int
-_hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info)
-{
- return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
-}
-
-#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
-
-static inline bool
-_hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info)
-{
- return _hb_glyph_info_get_general_category (info) ==
- HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR;
-}
-static inline void
-_hb_glyph_info_set_unicode_space_fallback_type (hb_glyph_info_t *info, hb_unicode_funcs_t::space_t s)
-{
- if (unlikely (!_hb_glyph_info_is_unicode_space (info)))
- return;
- info->unicode_props() = (((unsigned int) s)<<8) | (info->unicode_props() & 0xFF);
-}
-static inline hb_unicode_funcs_t::space_t
-_hb_glyph_info_get_unicode_space_fallback_type (const hb_glyph_info_t *info)
-{
- return _hb_glyph_info_is_unicode_space (info) ?
- (hb_unicode_funcs_t::space_t) (info->unicode_props()>>8) :
- hb_unicode_funcs_t::NOT_SPACE;
-}
-
-static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info);
-
-static inline hb_bool_t
-_hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
-{
- return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
- !_hb_glyph_info_ligated (info);
-}
-static inline hb_bool_t
-_hb_glyph_info_is_default_ignorable_and_not_hidden (const hb_glyph_info_t *info)
-{
- return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_HIDDEN))
- == UPROPS_MASK_IGNORABLE) &&
- !_hb_glyph_info_ligated (info);
-}
-
-static inline bool
-_hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
-{
- return _hb_glyph_info_get_general_category (info) ==
- HB_UNICODE_GENERAL_CATEGORY_FORMAT;
-}
-static inline hb_bool_t
-_hb_glyph_info_is_zwnj (const hb_glyph_info_t *info)
-{
- return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWNJ);
-}
-static inline hb_bool_t
-_hb_glyph_info_is_zwj (const hb_glyph_info_t *info)
-{
- return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
-}
-static inline hb_bool_t
-_hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
-{
- return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ));
-}
-static inline void
-_hb_glyph_info_flip_joiners (hb_glyph_info_t *info)
-{
- if (!_hb_glyph_info_is_unicode_format (info))
- return;
- info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ;
-}
-
-/* lig_props: aka lig_id / lig_comp
- *
- * When a ligature is formed:
- *
- * - The ligature glyph and any marks in between all the same newly allocated
- * lig_id,
- * - The ligature glyph will get lig_num_comps set to the number of components
- * - The marks get lig_comp > 0, reflecting which component of the ligature
- * they were applied to.
- * - This is used in GPOS to attach marks to the right component of a ligature
- * in MarkLigPos,
- * - Note that when marks are ligated together, much of the above is skipped
- * and the current lig_id reused.
- *
- * When a multiple-substitution is done:
- *
- * - All resulting glyphs will have lig_id = 0,
- * - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively.
- * - This is used in GPOS to attach marks to the first component of a
- * multiple substitution in MarkBasePos.
- *
- * The numbers are also used in GPOS to do mark-to-mark positioning only
- * to marks that belong to the same component of the same ligature.
- */
-
-static inline void
-_hb_glyph_info_clear_lig_props (hb_glyph_info_t *info)
-{
- info->lig_props() = 0;
-}
-
-#define IS_LIG_BASE 0x10
-
-static inline void
-_hb_glyph_info_set_lig_props_for_ligature (hb_glyph_info_t *info,
- unsigned int lig_id,
- unsigned int lig_num_comps)
-{
- info->lig_props() = (lig_id << 5) | IS_LIG_BASE | (lig_num_comps & 0x0F);
-}
-
-static inline void
-_hb_glyph_info_set_lig_props_for_mark (hb_glyph_info_t *info,
- unsigned int lig_id,
- unsigned int lig_comp)
-{
- info->lig_props() = (lig_id << 5) | (lig_comp & 0x0F);
-}
-
-static inline void
-_hb_glyph_info_set_lig_props_for_component (hb_glyph_info_t *info, unsigned int comp)
-{
- _hb_glyph_info_set_lig_props_for_mark (info, 0, comp);
-}
-
-static inline unsigned int
-_hb_glyph_info_get_lig_id (const hb_glyph_info_t *info)
-{
- return info->lig_props() >> 5;
-}
-
-static inline bool
-_hb_glyph_info_ligated_internal (const hb_glyph_info_t *info)
-{
- return !!(info->lig_props() & IS_LIG_BASE);
-}
-
-static inline unsigned int
-_hb_glyph_info_get_lig_comp (const hb_glyph_info_t *info)
-{
- if (_hb_glyph_info_ligated_internal (info))
- return 0;
- else
- return info->lig_props() & 0x0F;
-}
-
-static inline unsigned int
-_hb_glyph_info_get_lig_num_comps (const hb_glyph_info_t *info)
-{
- if ((info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE) &&
- _hb_glyph_info_ligated_internal (info))
- return info->lig_props() & 0x0F;
- else
- return 1;
-}
-
-static inline uint8_t
-_hb_allocate_lig_id (hb_buffer_t *buffer) {
- uint8_t lig_id = buffer->next_serial () & 0x07;
- if (unlikely (!lig_id))
- lig_id = _hb_allocate_lig_id (buffer); /* in case of overflow */
- return lig_id;
-}
-
-/* glyph_props: */
-
-static inline void
-_hb_glyph_info_set_glyph_props (hb_glyph_info_t *info, unsigned int props)
-{
- info->glyph_props() = props;
-}
-
-static inline unsigned int
-_hb_glyph_info_get_glyph_props (const hb_glyph_info_t *info)
-{
- return info->glyph_props();
-}
-
-static inline bool
-_hb_glyph_info_is_base_glyph (const hb_glyph_info_t *info)
-{
- return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH);
-}
-
-static inline bool
-_hb_glyph_info_is_ligature (const hb_glyph_info_t *info)
-{
- return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE);
-}
-
-static inline bool
-_hb_glyph_info_is_mark (const hb_glyph_info_t *info)
-{
- return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK);
-}
-
-static inline bool
-_hb_glyph_info_substituted (const hb_glyph_info_t *info)
-{
- return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
-}
-
-static inline bool
-_hb_glyph_info_ligated (const hb_glyph_info_t *info)
-{
- return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATED);
-}
-
-static inline bool
-_hb_glyph_info_multiplied (const hb_glyph_info_t *info)
-{
- return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
-}
-
-static inline bool
-_hb_glyph_info_ligated_and_didnt_multiply (const hb_glyph_info_t *info)
-{
- return _hb_glyph_info_ligated (info) && !_hb_glyph_info_multiplied (info);
-}
-
-static inline void
-_hb_glyph_info_clear_ligated_and_multiplied (hb_glyph_info_t *info)
-{
- info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
- HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
-}
-
-static inline void
-_hb_glyph_info_clear_substituted (hb_glyph_info_t *info)
-{
- info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
-}
-
-
-/* Allocation / deallocation. */
-
-static inline void
-_hb_buffer_allocate_unicode_vars (hb_buffer_t *buffer)
-{
- HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props);
-}
-
-static inline void
-_hb_buffer_deallocate_unicode_vars (hb_buffer_t *buffer)
-{
- HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props);
-}
-
-static inline void
-_hb_buffer_assert_unicode_vars (hb_buffer_t *buffer)
-{
- HB_BUFFER_ASSERT_VAR (buffer, unicode_props);
-}
-
-static inline void
-_hb_buffer_allocate_gsubgpos_vars (hb_buffer_t *buffer)
-{
- HB_BUFFER_ALLOCATE_VAR (buffer, glyph_props);
- HB_BUFFER_ALLOCATE_VAR (buffer, lig_props);
- HB_BUFFER_ALLOCATE_VAR (buffer, syllable);
-}
-
-static inline void
-_hb_buffer_deallocate_gsubgpos_vars (hb_buffer_t *buffer)
-{
- HB_BUFFER_DEALLOCATE_VAR (buffer, syllable);
- HB_BUFFER_DEALLOCATE_VAR (buffer, lig_props);
- HB_BUFFER_DEALLOCATE_VAR (buffer, glyph_props);
-}
-
-static inline void
-_hb_buffer_assert_gsubgpos_vars (hb_buffer_t *buffer)
-{
- HB_BUFFER_ASSERT_VAR (buffer, glyph_props);
- HB_BUFFER_ASSERT_VAR (buffer, lig_props);
- HB_BUFFER_ASSERT_VAR (buffer, syllable);
-}
-
-/* Make sure no one directly touches our props... */
-#undef unicode_props0
-#undef unicode_props1
-#undef lig_props
-#undef glyph_props
-
-#endif /* HB_OT_LAYOUT_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc
index 8845889827..fba3ad1916 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc
@@ -28,222 +28,266 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-open-type-private.hh"
-#include "hb-ot-layout-private.hh"
+#include "hb.hh"
+#ifndef HB_NO_OT_LAYOUT
+
+#ifdef HB_NO_OT_TAG
+#error "Cannot compile hb-ot-layout.cc with HB_NO_OT_TAG."
+#endif
+
+#include "hb-open-type.hh"
+#include "hb-ot-layout.hh"
+#include "hb-ot-face.hh"
+#include "hb-ot-map.hh"
+#include "hb-map.hh"
+
+#include "hb-ot-kern-table.hh"
#include "hb-ot-layout-gdef-table.hh"
#include "hb-ot-layout-gsub-table.hh"
#include "hb-ot-layout-gpos-table.hh"
+#include "hb-ot-layout-base-table.hh" // Just so we compile it; unused otherwise.
#include "hb-ot-layout-jstf-table.hh" // Just so we compile it; unused otherwise.
-#include "hb-ot-name-table.hh" // Just so we compile it; unused otherwise.
-
-#include "hb-ot-map-private.hh"
-
-
-const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
-
+#include "hb-ot-name-table.hh"
+#include "hb-ot-os2-table.hh"
-hb_ot_layout_t *
-_hb_ot_layout_create (hb_face_t *face)
-{
- hb_ot_layout_t *layout = (hb_ot_layout_t *) calloc (1, sizeof (hb_ot_layout_t));
- if (unlikely (!layout))
- return nullptr;
-
- layout->gdef_blob = OT::Sanitizer<OT::GDEF>::sanitize (face->reference_table (HB_OT_TAG_GDEF));
- layout->gdef = OT::Sanitizer<OT::GDEF>::lock_instance (layout->gdef_blob);
-
- layout->gsub_blob = OT::Sanitizer<OT::GSUB>::sanitize (face->reference_table (HB_OT_TAG_GSUB));
- layout->gsub = OT::Sanitizer<OT::GSUB>::lock_instance (layout->gsub_blob);
-
- layout->gpos_blob = OT::Sanitizer<OT::GPOS>::sanitize (face->reference_table (HB_OT_TAG_GPOS));
- layout->gpos = OT::Sanitizer<OT::GPOS>::lock_instance (layout->gpos_blob);
+#include "hb-aat-layout-lcar-table.hh"
+#include "hb-aat-layout-morx-table.hh"
- layout->math.init (face);
- layout->fvar.init (face);
- layout->avar.init (face);
+#include "hb-aat-layout-opbd-table.hh" // Just so we compile it; unused otherwise.
- {
- /*
- * The ugly business of blacklisting individual fonts' tables happen here!
- * See this thread for why we finally had to bend in and do this:
- * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
- */
- unsigned int gdef_len = hb_blob_get_length (layout->gdef_blob);
- unsigned int gsub_len = hb_blob_get_length (layout->gsub_blob);
- unsigned int gpos_len = hb_blob_get_length (layout->gpos_blob);
- if (0
- /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
- || (442 == gdef_len && 42038 == gpos_len && 2874 == gsub_len)
- /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
- || (430 == gdef_len && 40662 == gpos_len && 2874 == gsub_len)
- /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
- || (442 == gdef_len && 39116 == gpos_len && 2874 == gsub_len)
- /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
- || (430 == gdef_len && 39374 == gpos_len && 2874 == gsub_len)
- /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
- || (490 == gdef_len && 41638 == gpos_len && 3046 == gsub_len)
- /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
- || (478 == gdef_len && 41902 == gpos_len && 3046 == gsub_len)
- )
- {
- /* In certain versions of Times New Roman Italic and Bold Italic,
- * ASCII double quotation mark U+0022, mapped to glyph 5, has wrong
- * glyph class 3 (mark) in GDEF. Nuke the GDEF to avoid zero-width
- * double-quote. See:
- * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
- */
- if (3 == layout->gdef->get_glyph_class (5))
- layout->gdef = &OT::Null(OT::GDEF);
- }
- else if (0
- /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c tahoma.ttf from Windows 8 */
- || (898 == gdef_len && 46470 == gpos_len && 12554 == gsub_len)
- /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc tahomabd.ttf from Windows 8 */
- || (910 == gdef_len && 47732 == gpos_len && 12566 == gsub_len)
- /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e tahoma.ttf from Windows 8.1 */
- || (928 == gdef_len && 59332 == gpos_len && 23298 == gsub_len)
- /* sha1sum:6d400781948517c3c0441ba42acb309584b73033 tahomabd.ttf from Windows 8.1 */
- || (940 == gdef_len && 60732 == gpos_len && 23310 == gsub_len)
- /* tahoma.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- || (964 == gdef_len && 60072 == gpos_len && 23836 == gsub_len)
- /* tahomabd.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- || (976 == gdef_len && 61456 == gpos_len && 23832 == gsub_len)
- /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846 tahoma.ttf from Windows 10 */
- || (994 == gdef_len && 60336 == gpos_len && 24474 == gsub_len)
- /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343 tahomabd.ttf from Windows 10 */
- || (1006 == gdef_len && 61740 == gpos_len && 24470 == gsub_len)
- /* tahoma.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- || (1006 == gdef_len && 61346 == gpos_len && 24576 == gsub_len)
- /* tahomabd.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- || (1018 == gdef_len && 62828 == gpos_len && 24572 == gsub_len)
- /* sha1sum:b9c84d820c49850d3d27ec498be93955b82772b5 tahoma.ttf from Windows 10 AU */
- || (1006 == gdef_len && 61352 == gpos_len && 24576 == gsub_len)
- /* sha1sum:2bdfaab28174bdadd2f3d4200a30a7ae31db79d2 tahomabd.ttf from Windows 10 AU */
- || (1018 == gdef_len && 62834 == gpos_len && 24572 == gsub_len)
- /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7 Tahoma.ttf from Mac OS X 10.9 */
- || (832 == gdef_len && 47162 == gpos_len && 7324 == gsub_len)
- /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba Tahoma Bold.ttf from Mac OS X 10.9 */
- || (844 == gdef_len && 45474 == gpos_len && 7302 == gsub_len)
- /* sha1sum:eb8afadd28e9cf963e886b23a30b44ab4fd83acc himalaya.ttf from Windows 7 */
- || (180 == gdef_len && 7254 == gpos_len && 13054 == gsub_len)
- /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0 himalaya.ttf from Windows 8 */
- || (192 == gdef_len && 7254 == gpos_len && 12638 == gsub_len)
- /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427 himalaya.ttf from Windows 8.1 */
- || (192 == gdef_len && 7254 == gpos_len && 12690 == gsub_len)
- /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44 cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */
- /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371 cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */
- || (188 == gdef_len && 3852 == gpos_len && 248 == gsub_len)
- /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */
- /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */
- || (188 == gdef_len && 3426 == gpos_len && 264 == gsub_len)
- /* d125afa82a77a6475ac0e74e7c207914af84b37a padauk-2.80/Padauk.ttf RHEL 7.2 */
- || (1058 == gdef_len && 11818 == gpos_len && 47032 == gsub_len)
- /* 0f7b80437227b90a577cc078c0216160ae61b031 padauk-2.80/Padauk-Bold.ttf RHEL 7.2*/
- || (1046 == gdef_len && 12600 == gpos_len && 47030 == gsub_len)
- /* d3dde9aa0a6b7f8f6a89ef1002e9aaa11b882290 padauk-2.80/Padauk.ttf Ubuntu 16.04 */
- || (1058 == gdef_len && 16770 == gpos_len && 71796 == gsub_len)
- /* 5f3c98ccccae8a953be2d122c1b3a77fd805093f padauk-2.80/Padauk-Bold.ttf Ubuntu 16.04 */
- || (1046 == gdef_len && 17862 == gpos_len && 71790 == gsub_len)
- /* 6c93b63b64e8b2c93f5e824e78caca555dc887c7 padauk-2.80/Padauk-book.ttf */
- || (1046 == gdef_len && 17112 == gpos_len && 71788 == gsub_len)
- /* d89b1664058359b8ec82e35d3531931125991fb9 padauk-2.80/Padauk-bookbold.ttf */
- || (1058 == gdef_len && 17514 == gpos_len && 71794 == gsub_len)
- /* 824cfd193aaf6234b2b4dc0cf3c6ef576c0d00ef padauk-3.0/Padauk-book.ttf */
- || (1330 == gdef_len && 57938 == gpos_len && 109904 == gsub_len)
- /* 91fcc10cf15e012d27571e075b3b4dfe31754a8a padauk-3.0/Padauk-bookbold.ttf */
- || (1330 == gdef_len && 58972 == gpos_len && 109904 == gsub_len)
- /* sha1sum: c26e41d567ed821bed997e937bc0c41435689e85 Padauk.ttf
- * "Padauk Regular" "Version 2.5", see https://crbug.com/681813 */
- || (1004 == gdef_len && 14836 == gpos_len && 59092 == gsub_len)
- )
- {
- /* Many versions of Tahoma have bad GDEF tables that incorrectly classify some spacing marks
- * such as certain IPA symbols as glyph class 3. So do older versions of Microsoft Himalaya,
- * and the version of Cantarell shipped by Ubuntu 16.04.
- * Nuke the GDEF tables of these fonts to avoid unwanted width-zeroing.
- * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925
- * https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
- * https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
- */
- layout->gdef = &OT::Null(OT::GDEF);
- }
- }
+/**
+ * SECTION:hb-ot-layout
+ * @title: hb-ot-layout
+ * @short_description: OpenType Layout
+ * @include: hb-ot.h
+ *
+ * Functions for querying OpenType Layout features in the font face.
+ **/
- layout->gsub_lookup_count = layout->gsub->get_lookup_count ();
- layout->gpos_lookup_count = layout->gpos->get_lookup_count ();
- layout->gsub_accels = (hb_ot_layout_lookup_accelerator_t *) calloc (layout->gsub->get_lookup_count (), sizeof (hb_ot_layout_lookup_accelerator_t));
- layout->gpos_accels = (hb_ot_layout_lookup_accelerator_t *) calloc (layout->gpos->get_lookup_count (), sizeof (hb_ot_layout_lookup_accelerator_t));
+/*
+ * kern
+ */
- if (unlikely ((layout->gsub_lookup_count && !layout->gsub_accels) ||
- (layout->gpos_lookup_count && !layout->gpos_accels)))
- {
- _hb_ot_layout_destroy (layout);
- return nullptr;
- }
+#ifndef HB_NO_OT_KERN
+/**
+ * hb_ot_layout_has_kerning:
+ * @face: The #hb_face_t to work on
+ *
+ * Tests whether a face includes any kerning data in the 'kern' table.
+ * Does NOT test for kerning lookups in the GPOS table.
+ *
+ * Return value: true if data found, false otherwise
+ *
+ **/
+bool
+hb_ot_layout_has_kerning (hb_face_t *face)
+{
+ return face->table.kern->has_data ();
+}
- for (unsigned int i = 0; i < layout->gsub_lookup_count; i++)
- layout->gsub_accels[i].init (layout->gsub->get_lookup (i));
- for (unsigned int i = 0; i < layout->gpos_lookup_count; i++)
- layout->gpos_accels[i].init (layout->gpos->get_lookup (i));
+/**
+ * hb_ot_layout_has_machine_kerning:
+ * @face: The #hb_face_t to work on
+ *
+ * Tests whether a face includes any state-machine kerning in the 'kern' table.
+ * Does NOT examine the GPOS table.
+ *
+ * Return value: true if data found, false otherwise
+ *
+ **/
+bool
+hb_ot_layout_has_machine_kerning (hb_face_t *face)
+{
+ return face->table.kern->has_state_machine ();
+}
- return layout;
+/**
+ * hb_ot_layout_has_cross_kerning:
+ * @face: The #hb_face_t to work on
+ *
+ * Tests whether a face has any cross-stream kerning (i.e., kerns
+ * that make adjustments perpendicular to the direction of the text
+ * flow: Y adjustments in horizontal text or X adjustments in
+ * vertical text) in the 'kern' table.
+ *
+ * Does NOT examine the GPOS table.
+ *
+ * Return value: true is data found, false otherwise
+ *
+ **/
+bool
+hb_ot_layout_has_cross_kerning (hb_face_t *face)
+{
+ return face->table.kern->has_cross_stream ();
}
void
-_hb_ot_layout_destroy (hb_ot_layout_t *layout)
+hb_ot_layout_kern (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
{
- for (unsigned int i = 0; i < layout->gsub_lookup_count; i++)
- layout->gsub_accels[i].fini ();
- for (unsigned int i = 0; i < layout->gpos_lookup_count; i++)
- layout->gpos_accels[i].fini ();
+ hb_blob_t *blob = font->face->table.kern.get_blob ();
+ const AAT::kern& kern = *blob->as<AAT::kern> ();
- free (layout->gsub_accels);
- free (layout->gpos_accels);
+ AAT::hb_aat_apply_context_t c (plan, font, buffer, blob);
- hb_blob_destroy (layout->gdef_blob);
- hb_blob_destroy (layout->gsub_blob);
- hb_blob_destroy (layout->gpos_blob);
+ kern.apply (&c);
+}
+#endif
- layout->math.fini ();
- layout->fvar.fini ();
- layout->avar.fini ();
- free (layout);
-}
+/*
+ * GDEF
+ */
-static inline const OT::GDEF&
-_get_gdef (hb_face_t *face)
+bool
+OT::GDEF::is_blacklisted (hb_blob_t *blob,
+ hb_face_t *face) const
{
- if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::GDEF);
- return *hb_ot_layout_from_face (face)->gdef;
-}
-static inline const OT::GSUB&
-_get_gsub (hb_face_t *face)
-{
- if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::GSUB);
- return *hb_ot_layout_from_face (face)->gsub;
+#ifdef HB_NO_OT_LAYOUT_BLACKLIST
+ return false;
+#endif
+ /* The ugly business of blacklisting individual fonts' tables happen here!
+ * See this thread for why we finally had to bend in and do this:
+ * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
+ *
+ * In certain versions of Times New Roman Italic and Bold Italic,
+ * ASCII double quotation mark U+0022 has wrong glyph class 3 (mark)
+ * in GDEF. Many versions of Tahoma have bad GDEF tables that
+ * incorrectly classify some spacing marks such as certain IPA
+ * symbols as glyph class 3. So do older versions of Microsoft
+ * Himalaya, and the version of Cantarell shipped by Ubuntu 16.04.
+ *
+ * Nuke the GDEF tables of to avoid unwanted width-zeroing.
+ *
+ * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
+ */
+ switch HB_CODEPOINT_ENCODE3(blob->length,
+ face->table.GSUB->table.get_length (),
+ face->table.GPOS->table.get_length ())
+ {
+ /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
+ case HB_CODEPOINT_ENCODE3 (442, 2874, 42038):
+ /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
+ case HB_CODEPOINT_ENCODE3 (430, 2874, 40662):
+ /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
+ case HB_CODEPOINT_ENCODE3 (442, 2874, 39116):
+ /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
+ case HB_CODEPOINT_ENCODE3 (430, 2874, 39374):
+ /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
+ case HB_CODEPOINT_ENCODE3 (490, 3046, 41638):
+ /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
+ case HB_CODEPOINT_ENCODE3 (478, 3046, 41902):
+ /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c tahoma.ttf from Windows 8 */
+ case HB_CODEPOINT_ENCODE3 (898, 12554, 46470):
+ /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc tahomabd.ttf from Windows 8 */
+ case HB_CODEPOINT_ENCODE3 (910, 12566, 47732):
+ /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e tahoma.ttf from Windows 8.1 */
+ case HB_CODEPOINT_ENCODE3 (928, 23298, 59332):
+ /* sha1sum:6d400781948517c3c0441ba42acb309584b73033 tahomabd.ttf from Windows 8.1 */
+ case HB_CODEPOINT_ENCODE3 (940, 23310, 60732):
+ /* tahoma.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+ case HB_CODEPOINT_ENCODE3 (964, 23836, 60072):
+ /* tahomabd.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+ case HB_CODEPOINT_ENCODE3 (976, 23832, 61456):
+ /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846 tahoma.ttf from Windows 10 */
+ case HB_CODEPOINT_ENCODE3 (994, 24474, 60336):
+ /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343 tahomabd.ttf from Windows 10 */
+ case HB_CODEPOINT_ENCODE3 (1006, 24470, 61740):
+ /* tahoma.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+ case HB_CODEPOINT_ENCODE3 (1006, 24576, 61346):
+ /* tahomabd.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+ case HB_CODEPOINT_ENCODE3 (1018, 24572, 62828):
+ /* sha1sum:b9c84d820c49850d3d27ec498be93955b82772b5 tahoma.ttf from Windows 10 AU */
+ case HB_CODEPOINT_ENCODE3 (1006, 24576, 61352):
+ /* sha1sum:2bdfaab28174bdadd2f3d4200a30a7ae31db79d2 tahomabd.ttf from Windows 10 AU */
+ case HB_CODEPOINT_ENCODE3 (1018, 24572, 62834):
+ /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7 Tahoma.ttf from Mac OS X 10.9 */
+ case HB_CODEPOINT_ENCODE3 (832, 7324, 47162):
+ /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba Tahoma Bold.ttf from Mac OS X 10.9 */
+ case HB_CODEPOINT_ENCODE3 (844, 7302, 45474):
+ /* sha1sum:eb8afadd28e9cf963e886b23a30b44ab4fd83acc himalaya.ttf from Windows 7 */
+ case HB_CODEPOINT_ENCODE3 (180, 13054, 7254):
+ /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0 himalaya.ttf from Windows 8 */
+ case HB_CODEPOINT_ENCODE3 (192, 12638, 7254):
+ /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427 himalaya.ttf from Windows 8.1 */
+ case HB_CODEPOINT_ENCODE3 (192, 12690, 7254):
+ /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44 cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */
+ /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371 cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */
+ case HB_CODEPOINT_ENCODE3 (188, 248, 3852):
+ /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */
+ /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */
+ case HB_CODEPOINT_ENCODE3 (188, 264, 3426):
+ /* d125afa82a77a6475ac0e74e7c207914af84b37a padauk-2.80/Padauk.ttf RHEL 7.2 */
+ case HB_CODEPOINT_ENCODE3 (1058, 47032, 11818):
+ /* 0f7b80437227b90a577cc078c0216160ae61b031 padauk-2.80/Padauk-Bold.ttf RHEL 7.2*/
+ case HB_CODEPOINT_ENCODE3 (1046, 47030, 12600):
+ /* d3dde9aa0a6b7f8f6a89ef1002e9aaa11b882290 padauk-2.80/Padauk.ttf Ubuntu 16.04 */
+ case HB_CODEPOINT_ENCODE3 (1058, 71796, 16770):
+ /* 5f3c98ccccae8a953be2d122c1b3a77fd805093f padauk-2.80/Padauk-Bold.ttf Ubuntu 16.04 */
+ case HB_CODEPOINT_ENCODE3 (1046, 71790, 17862):
+ /* 6c93b63b64e8b2c93f5e824e78caca555dc887c7 padauk-2.80/Padauk-book.ttf */
+ case HB_CODEPOINT_ENCODE3 (1046, 71788, 17112):
+ /* d89b1664058359b8ec82e35d3531931125991fb9 padauk-2.80/Padauk-bookbold.ttf */
+ case HB_CODEPOINT_ENCODE3 (1058, 71794, 17514):
+ /* 824cfd193aaf6234b2b4dc0cf3c6ef576c0d00ef padauk-3.0/Padauk-book.ttf */
+ case HB_CODEPOINT_ENCODE3 (1330, 109904, 57938):
+ /* 91fcc10cf15e012d27571e075b3b4dfe31754a8a padauk-3.0/Padauk-bookbold.ttf */
+ case HB_CODEPOINT_ENCODE3 (1330, 109904, 58972):
+ /* sha1sum: c26e41d567ed821bed997e937bc0c41435689e85 Padauk.ttf
+ * "Padauk Regular" "Version 2.5", see https://crbug.com/681813 */
+ case HB_CODEPOINT_ENCODE3 (1004, 59092, 14836):
+ return true;
+ }
+ return false;
}
-static inline const OT::GPOS&
-_get_gpos (hb_face_t *face)
+
+static void
+_hb_ot_layout_set_glyph_props (hb_font_t *font,
+ hb_buffer_t *buffer)
{
- if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::GPOS);
- return *hb_ot_layout_from_face (face)->gpos;
+ _hb_buffer_assert_gsubgpos_vars (buffer);
+
+ const OT::GDEF &gdef = *font->face->table.GDEF->table;
+ unsigned int count = buffer->len;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ _hb_glyph_info_set_glyph_props (&buffer->info[i], gdef.get_glyph_props (buffer->info[i].codepoint));
+ _hb_glyph_info_clear_lig_props (&buffer->info[i]);
+ buffer->info[i].syllable() = 0;
+ }
}
-/*
- * GDEF
- */
+/* Public API */
+/**
+ * hb_ot_layout_has_glyph_classes:
+ * @face: #hb_face_t to work upon
+ *
+ * Tests whether a face has any glyph classes defined in its GDEF table.
+ *
+ * Return value: true if data found, false otherwise
+ *
+ **/
hb_bool_t
hb_ot_layout_has_glyph_classes (hb_face_t *face)
{
- return _get_gdef (face).has_glyph_classes ();
+ return face->table.GDEF->table->has_glyph_classes ();
}
/**
* hb_ot_layout_get_glyph_class:
+ * @face: The #hb_face_t to work on
+ * @glyph: The #hb_codepoint_t code point to query
+ *
+ * Fetches the GDEF class of the requested glyph in the specified face.
+ *
+ * Return value: The #hb_ot_layout_glyph_class_t glyph class of the given code
+ * point in the GDEF table of the face.
*
* Since: 0.9.7
**/
@@ -251,11 +295,18 @@ hb_ot_layout_glyph_class_t
hb_ot_layout_get_glyph_class (hb_face_t *face,
hb_codepoint_t glyph)
{
- return (hb_ot_layout_glyph_class_t) _get_gdef (face).get_glyph_class (glyph);
+ return (hb_ot_layout_glyph_class_t) face->table.GDEF->table->get_glyph_class (glyph);
}
/**
* hb_ot_layout_get_glyphs_in_class:
+ * @face: The #hb_face_t to work on
+ * @klass: The #hb_ot_layout_glyph_class_t GDEF class to retrieve
+ * @glyphs: (out): The #hb_set_t set of all glyphs belonging to the requested
+ * class.
+ *
+ * Retrieves the set of all glyphs from the face that belong to the requested
+ * glyph class in the face's GDEF table.
*
* Since: 0.9.7
**/
@@ -264,9 +315,26 @@ hb_ot_layout_get_glyphs_in_class (hb_face_t *face,
hb_ot_layout_glyph_class_t klass,
hb_set_t *glyphs /* OUT */)
{
- return _get_gdef (face).get_glyphs_in_class (klass, glyphs);
+ return face->table.GDEF->table->get_glyphs_in_class (klass, glyphs);
}
+
+#ifndef HB_NO_LAYOUT_UNUSED
+/**
+ * hb_ot_layout_get_attach_points:
+ * @face: The #hb_face_t to work on
+ * @glyph: The #hb_codepoint_t code point to query
+ * @start_offset: offset of the first attachment point to retrieve
+ * @point_count: (inout) (allow-none): Input = the maximum number of attachment points to return;
+ * Output = the actual number of attachment points returned (may be zero)
+ * @point_array: (out) (array length=point_count): The array of attachment points found for the query
+ *
+ * Fetches a list of all attachment points for the specified glyph in the GDEF
+ * table of the face. The list returned will begin at the offset provided.
+ *
+ * Useful if the client program wishes to cache the list.
+ *
+ **/
unsigned int
hb_ot_layout_get_attach_points (hb_face_t *face,
hb_codepoint_t glyph,
@@ -274,9 +342,25 @@ hb_ot_layout_get_attach_points (hb_face_t *face,
unsigned int *point_count /* IN/OUT */,
unsigned int *point_array /* OUT */)
{
- return _get_gdef (face).get_attach_points (glyph, start_offset, point_count, point_array);
+ return face->table.GDEF->table->get_attach_points (glyph,
+ start_offset,
+ point_count,
+ point_array);
}
-
+/**
+ * hb_ot_layout_get_ligature_carets:
+ * @font: The #hb_font_t to work on
+ * @direction: The #hb_direction_t text direction to use
+ * @glyph: The #hb_codepoint_t code point to query
+ * @start_offset: offset of the first caret position to retrieve
+ * @caret_count: (inout) (allow-none): Input = the maximum number of caret positions to return;
+ * Output = the actual number of caret positions returned (may be zero)
+ * @caret_array: (out) (array length=caret_count): The array of caret positions found for the query
+ *
+ * Fetches a list of the caret positions defined for a ligature glyph in the GDEF
+ * table of the font. The list returned will begin at the offset provided.
+ *
+ **/
unsigned int
hb_ot_layout_get_ligature_carets (hb_font_t *font,
hb_direction_t direction,
@@ -285,32 +369,101 @@ hb_ot_layout_get_ligature_carets (hb_font_t *font,
unsigned int *caret_count /* IN/OUT */,
hb_position_t *caret_array /* OUT */)
{
- return _get_gdef (font->face).get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array);
+ unsigned int result_caret_count = 0;
+ unsigned int result = font->face->table.GDEF->table->get_lig_carets (font, direction, glyph, start_offset, &result_caret_count, caret_array);
+ if (result)
+ {
+ if (caret_count) *caret_count = result_caret_count;
+ }
+ else
+ {
+#ifndef HB_NO_AAT
+ result = font->face->table.lcar->get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array);
+#else
+ if (caret_count) *caret_count = 0;
+#endif
+ }
+ return result;
}
+#endif
/*
* GSUB/GPOS
*/
+bool
+OT::GSUB::is_blacklisted (hb_blob_t *blob HB_UNUSED,
+ hb_face_t *face) const
+{
+#ifdef HB_NO_OT_LAYOUT_BLACKLIST
+ return false;
+#endif
+
+#ifndef HB_NO_AAT_SHAPE
+ /* Mac OS X prefers morx over GSUB. It also ships with various Indic fonts,
+ * all by 'MUTF' foundry (Tamil MN, Tamil Sangam MN, etc.), that have broken
+ * GSUB/GPOS tables. Some have GSUB with zero scripts, those are ignored by
+ * our morx/GSUB preference code. But if GSUB has non-zero scripts, we tend
+ * to prefer it over morx because we want to be consistent with other OpenType
+ * shapers.
+ *
+ * To work around broken Indic Mac system fonts, we ignore GSUB table if
+ * OS/2 VendorId is 'MUTF' and font has morx table as well.
+ *
+ * https://github.com/harfbuzz/harfbuzz/issues/1410
+ * https://github.com/harfbuzz/harfbuzz/issues/1348
+ * https://github.com/harfbuzz/harfbuzz/issues/1391
+ */
+ if (unlikely (face->table.OS2->achVendID == HB_TAG ('M','U','T','F') &&
+ face->table.morx->has_data ()))
+ return true;
+#endif
+
+ return false;
+}
+
+bool
+OT::GPOS::is_blacklisted (hb_blob_t *blob HB_UNUSED,
+ hb_face_t *face HB_UNUSED) const
+{
+#ifdef HB_NO_OT_LAYOUT_BLACKLIST
+ return false;
+#endif
+ return false;
+}
+
static const OT::GSUBGPOS&
get_gsubgpos_table (hb_face_t *face,
hb_tag_t table_tag)
{
switch (table_tag) {
- case HB_OT_TAG_GSUB: return _get_gsub (face);
- case HB_OT_TAG_GPOS: return _get_gpos (face);
- default: return OT::Null(OT::GSUBGPOS);
+ case HB_OT_TAG_GSUB: return *face->table.GSUB->table;
+ case HB_OT_TAG_GPOS: return *face->table.GPOS->table;
+ default: return Null(OT::GSUBGPOS);
}
}
+/**
+ * hb_ot_layout_table_get_script_tags:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @start_offset: offset of the first script tag to retrieve
+ * @script_count: (inout) (allow-none): Input = the maximum number of script tags to return;
+ * Output = the actual number of script tags returned (may be zero)
+ * @script_tags: (out) (array length=script_count): The array of #hb_tag_t script tags found for the query
+ *
+ * Fetches a list of all scripts enumerated in the specified face's GSUB table
+ * or GPOS table. The list returned will begin at the offset provided.
+ *
+ **/
unsigned int
hb_ot_layout_table_get_script_tags (hb_face_t *face,
hb_tag_t table_tag,
unsigned int start_offset,
unsigned int *script_count /* IN/OUT */,
- hb_tag_t *script_tags /* OUT */)
+ hb_tag_t *script_tags /* OUT */)
{
const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
@@ -319,11 +472,24 @@ hb_ot_layout_table_get_script_tags (hb_face_t *face,
#define HB_OT_TAG_LATIN_SCRIPT HB_TAG ('l', 'a', 't', 'n')
+/**
+ * hb_ot_layout_table_find_script:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @script_tag: #hb_tag_t of the script tag requested
+ * @script_index: (out): The index of the requested script tag
+ *
+ * Fetches the index if a given script tag in the specified face's GSUB table
+ * or GPOS table.
+ *
+ * Return value: true if the script is found, false otherwise
+ *
+ **/
hb_bool_t
hb_ot_layout_table_find_script (hb_face_t *face,
hb_tag_t table_tag,
hb_tag_t script_tag,
- unsigned int *script_index)
+ unsigned int *script_index /* OUT */)
{
static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_SCRIPT_INDEX), "");
const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
@@ -349,24 +515,61 @@ hb_ot_layout_table_find_script (hb_face_t *face,
return false;
}
+#ifndef HB_DISABLE_DEPRECATED
+/**
+ * hb_ot_layout_table_choose_script:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @script_tags: Array of #hb_tag_t script tags
+ * @script_index: (out): The index of the requested script tag
+ * @chosen_script: (out): #hb_tag_t of the script tag requested
+ *
+ * Deprecated since 2.0.0
+ **/
hb_bool_t
hb_ot_layout_table_choose_script (hb_face_t *face,
hb_tag_t table_tag,
const hb_tag_t *script_tags,
- unsigned int *script_index,
- hb_tag_t *chosen_script)
+ unsigned int *script_index /* OUT */,
+ hb_tag_t *chosen_script /* OUT */)
+{
+ const hb_tag_t *t;
+ for (t = script_tags; *t; t++);
+ return hb_ot_layout_table_select_script (face, table_tag, t - script_tags, script_tags, script_index, chosen_script);
+}
+#endif
+
+/**
+ * hb_ot_layout_table_select_script:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @script_count: Number of script tags in the array
+ * @script_tags: Array of #hb_tag_t script tags
+ * @script_index: (out): The index of the requested script
+ * @chosen_script: (out): #hb_tag_t of the requested script
+ *
+ * Since: 2.0.0
+ **/
+hb_bool_t
+hb_ot_layout_table_select_script (hb_face_t *face,
+ hb_tag_t table_tag,
+ unsigned int script_count,
+ const hb_tag_t *script_tags,
+ unsigned int *script_index /* OUT */,
+ hb_tag_t *chosen_script /* OUT */)
{
static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_SCRIPT_INDEX), "");
const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+ unsigned int i;
- while (*script_tags)
+ for (i = 0; i < script_count; i++)
{
- if (g.find_script_index (*script_tags, script_index)) {
+ if (g.find_script_index (script_tags[i], script_index))
+ {
if (chosen_script)
- *chosen_script = *script_tags;
+ *chosen_script = script_tags[i];
return true;
}
- script_tags++;
}
/* try finding 'DFLT' */
@@ -397,23 +600,49 @@ hb_ot_layout_table_choose_script (hb_face_t *face,
return false;
}
+
+/**
+ * hb_ot_layout_table_get_feature_tags:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @start_offset: offset of the first feature tag to retrieve
+ * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return;
+ * Output = the actual number of feature tags returned (may be zero)
+ * @feature_tags: (out) (array length=feature_count): Array of feature tags found in the table
+ *
+ * Fetches a list of all feature tags in the given face's GSUB or GPOS table.
+ *
+ **/
unsigned int
hb_ot_layout_table_get_feature_tags (hb_face_t *face,
hb_tag_t table_tag,
unsigned int start_offset,
unsigned int *feature_count /* IN/OUT */,
- hb_tag_t *feature_tags /* OUT */)
+ hb_tag_t *feature_tags /* OUT */)
{
const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
return g.get_feature_tags (start_offset, feature_count, feature_tags);
}
-hb_bool_t
+
+/**
+ * hb_ot_layout_table_find_feature:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @feature_tag: The #hb_tag_t og the requested feature tag
+ * @feature_index: (out): The index of the requested feature
+ *
+ * Fetches the index for a given feature tag in the specified face's GSUB table
+ * or GPOS table.
+ *
+ * Return value: true if the feature is found, false otherwise
+ **/
+bool
hb_ot_layout_table_find_feature (hb_face_t *face,
hb_tag_t table_tag,
hb_tag_t feature_tag,
- unsigned int *feature_index)
+ unsigned int *feature_index /* OUT */)
{
static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_FEATURE_INDEX), "");
const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
@@ -432,19 +661,51 @@ hb_ot_layout_table_find_feature (hb_face_t *face,
}
+/**
+ * hb_ot_layout_script_get_language_tags:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @script_index: The index of the requested script tag
+ * @start_offset: offset of the first language tag to retrieve
+ * @language_count: (inout) (allow-none): Input = the maximum number of language tags to return;
+ * Output = the actual number of language tags returned (may be zero)
+ * @language_tags: (out) (array length=language_count): Array of language tags found in the table
+ *
+ * Fetches a list of language tags in the given face's GSUB or GPOS table, underneath
+ * the specified script index. The list returned will begin at the offset provided.
+ *
+ **/
unsigned int
hb_ot_layout_script_get_language_tags (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
unsigned int start_offset,
unsigned int *language_count /* IN/OUT */,
- hb_tag_t *language_tags /* OUT */)
+ hb_tag_t *language_tags /* OUT */)
{
const OT::Script &s = get_gsubgpos_table (face, table_tag).get_script (script_index);
return s.get_lang_sys_tags (start_offset, language_count, language_tags);
}
+
+#ifndef HB_DISABLE_DEPRECATED
+/**
+ * hb_ot_layout_script_find_language:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @script_index: The index of the requested script tag
+ * @language_tag: The #hb_tag_t of the requested language
+ * @language_index: The index of the requested language
+ *
+ * Fetches the index of a given language tag in the specified face's GSUB table
+ * or GPOS table, underneath the specified script tag.
+ *
+ * Return value: true if the language tag is found, false otherwise
+ *
+ * Since: ??
+ * Deprecated: ??
+ **/
hb_bool_t
hb_ot_layout_script_find_language (hb_face_t *face,
hb_tag_t table_tag,
@@ -452,13 +713,51 @@ hb_ot_layout_script_find_language (hb_face_t *face,
hb_tag_t language_tag,
unsigned int *language_index)
{
+ return hb_ot_layout_script_select_language (face,
+ table_tag,
+ script_index,
+ 1,
+ &language_tag,
+ language_index);
+}
+#endif
+
+
+/**
+ * hb_ot_layout_script_select_language:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @script_index: The index of the requested script tag
+ * @language_count: The number of languages in the specified script
+ * @language_tags: The array of language tags
+ * @language_index: (out): The index of the requested language
+ *
+ * Fetches the index of a given language tag in the specified face's GSUB table
+ * or GPOS table, underneath the specified script index.
+ *
+ * Return value: true if the language tag is found, false otherwise
+ *
+ * Since: 2.0.0
+ **/
+hb_bool_t
+hb_ot_layout_script_select_language (hb_face_t *face,
+ hb_tag_t table_tag,
+ unsigned int script_index,
+ unsigned int language_count,
+ const hb_tag_t *language_tags,
+ unsigned int *language_index /* OUT */)
+{
static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX), "");
const OT::Script &s = get_gsubgpos_table (face, table_tag).get_script (script_index);
+ unsigned int i;
- if (s.find_lang_sys_index (language_tag, language_index))
- return true;
+ for (i = 0; i < language_count; i++)
+ {
+ if (s.find_lang_sys_index (language_tags[i], language_index))
+ return true;
+ }
- /* try with 'dflt'; MS site has had typos and many fonts use it now :( */
+ /* try finding 'dflt' */
if (s.find_lang_sys_index (HB_OT_TAG_DEFAULT_LANGUAGE, language_index))
return false;
@@ -466,6 +765,21 @@ hb_ot_layout_script_find_language (hb_face_t *face,
return false;
}
+
+/**
+ * hb_ot_layout_language_get_required_feature_index:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @script_index: The index of the requested script tag
+ * @language_index: The index of the requested language tag
+ * @feature_index: (out): The index of the requested feature
+ *
+ * Fetches the index of a requested feature in the given face's GSUB or GPOS table,
+ * underneath the specified script and language.
+ *
+ * Return value: true if the feature is found, false otherwise
+ *
+ **/
hb_bool_t
hb_ot_layout_language_get_required_feature_index (hb_face_t *face,
hb_tag_t table_tag,
@@ -481,8 +795,20 @@ hb_ot_layout_language_get_required_feature_index (hb_face_t *face,
nullptr);
}
+
/**
* hb_ot_layout_language_get_required_feature:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @script_index: The index of the requested script tag
+ * @language_index: The index of the requested language tag
+ * @feature_index: The index of the requested feature
+ * @feature_tag: (out): The #hb_tag_t of the requested feature
+ *
+ * Fetches the tag of a requested feature index in the given face's GSUB or GPOS table,
+ * underneath the specified script and language.
+ *
+ * Return value: true if the feature is found, false otherwise
*
* Since: 0.9.30
**/
@@ -504,13 +830,29 @@ hb_ot_layout_language_get_required_feature (hb_face_t *face,
return l.has_required_feature ();
}
+
+/**
+ * hb_ot_layout_language_get_feature_indexes:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @script_index: The index of the requested script tag
+ * @language_index: The index of the requested language tag
+ * @start_offset: offset of the first feature tag to retrieve
+ * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return;
+ * Output: the actual number of feature tags returned (may be zero)
+ * @feature_indexes: (out) (array length=feature_count): The array of feature indexes found for the query
+ *
+ * Fetches a list of all features in the specified face's GSUB table
+ * or GPOS table, underneath the specified script and language. The list
+ * returned will begin at the offset provided.
+ **/
unsigned int
hb_ot_layout_language_get_feature_indexes (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
unsigned int language_index,
unsigned int start_offset,
- unsigned int *feature_count /* IN/OUT */,
+ unsigned int *feature_count /* IN/OUT */,
unsigned int *feature_indexes /* OUT */)
{
const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
@@ -519,6 +861,23 @@ hb_ot_layout_language_get_feature_indexes (hb_face_t *face,
return l.get_feature_indexes (start_offset, feature_count, feature_indexes);
}
+
+/**
+ * hb_ot_layout_language_get_feature_tags:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @script_index: The index of the requested script tag
+ * @language_index: The index of the requested language tag
+ * @start_offset: offset of the first feature tag to retrieve
+ * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return;
+ * Output = the actual number of feature tags returned (may be zero)
+ * @feature_tags: (out) (array length=feature_count): The array of #hb_tag_t feature tags found for the query
+ *
+ * Fetches a list of all features in the specified face's GSUB table
+ * or GPOS table, underneath the specified script and language. The list
+ * returned will begin at the offset provided.
+ *
+ **/
unsigned int
hb_ot_layout_language_get_feature_tags (hb_face_t *face,
hb_tag_t table_tag,
@@ -526,7 +885,7 @@ hb_ot_layout_language_get_feature_tags (hb_face_t *face,
unsigned int language_index,
unsigned int start_offset,
unsigned int *feature_count /* IN/OUT */,
- hb_tag_t *feature_tags /* OUT */)
+ hb_tag_t *feature_tags /* OUT */)
{
const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
@@ -544,13 +903,28 @@ hb_ot_layout_language_get_feature_tags (hb_face_t *face,
}
+/**
+ * hb_ot_layout_language_find_feature:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @script_index: The index of the requested script tag
+ * @language_index: The index of the requested language tag
+ * @feature_tag: #hb_tag_t of the feature tag requested
+ * @feature_index: (out): The index of the requested feature
+ *
+ * Fetches the index of a given feature tag in the specified face's GSUB table
+ * or GPOS table, underneath the specified script and language.
+ *
+ * Return value: true if the feature is found, false otherwise
+ *
+ **/
hb_bool_t
hb_ot_layout_language_find_feature (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
unsigned int language_index,
hb_tag_t feature_tag,
- unsigned int *feature_index)
+ unsigned int *feature_index /* OUT */)
{
static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_FEATURE_INDEX), "");
const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
@@ -570,8 +944,20 @@ hb_ot_layout_language_find_feature (hb_face_t *face,
return false;
}
+
/**
* hb_ot_layout_feature_get_lookups:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @feature_index: The index of the requested feature
+ * @start_offset: offset of the first lookup to retrieve
+ * @lookup_count: (inout) (allow-none): Input = the maximum number of lookups to return;
+ * Output = the actual number of lookups returned (may be zero)
+ * @lookup_indexes: (out) (array length=lookup_count): The array of lookup indexes found for the query
+ *
+ * Fetches a list of all lookups enumerated for the specified feature, in
+ * the specified face's GSUB table or GPOS table. The list returned will
+ * begin at the offset provided.
*
* Since: 0.9.7
**/
@@ -580,7 +966,7 @@ hb_ot_layout_feature_get_lookups (hb_face_t *face,
hb_tag_t table_tag,
unsigned int feature_index,
unsigned int start_offset,
- unsigned int *lookup_count /* IN/OUT */,
+ unsigned int *lookup_count /* IN/OUT */,
unsigned int *lookup_indexes /* OUT */)
{
return hb_ot_layout_feature_with_variations_get_lookups (face,
@@ -592,8 +978,14 @@ hb_ot_layout_feature_get_lookups (hb_face_t *face,
lookup_indexes);
}
+
/**
* hb_ot_layout_table_get_lookup_count:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ *
+ * Fetches the total number of lookups enumerated in the specified
+ * face's GSUB table or GPOS table.
*
* Since: 0.9.22
**/
@@ -601,208 +993,241 @@ unsigned int
hb_ot_layout_table_get_lookup_count (hb_face_t *face,
hb_tag_t table_tag)
{
- if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return 0;
- switch (table_tag)
- {
- case HB_OT_TAG_GSUB:
- {
- return hb_ot_layout_from_face (face)->gsub_lookup_count;
- }
- case HB_OT_TAG_GPOS:
- {
- return hb_ot_layout_from_face (face)->gpos_lookup_count;
- }
- }
- return 0;
+ return get_gsubgpos_table (face, table_tag).get_lookup_count ();
}
-static void
-_hb_ot_layout_collect_lookups_lookups (hb_face_t *face,
- hb_tag_t table_tag,
- unsigned int feature_index,
- hb_set_t *lookup_indexes /* OUT */)
+
+struct hb_collect_features_context_t
{
- unsigned int lookup_indices[32];
- unsigned int offset, len;
-
- offset = 0;
- do {
- len = ARRAY_LENGTH (lookup_indices);
- hb_ot_layout_feature_get_lookups (face,
- table_tag,
- feature_index,
- offset, &len,
- lookup_indices);
-
- for (unsigned int i = 0; i < len; i++)
- lookup_indexes->add (lookup_indices[i]);
-
- offset += len;
- } while (len == ARRAY_LENGTH (lookup_indices));
-}
+ hb_collect_features_context_t (hb_face_t *face,
+ hb_tag_t table_tag,
+ hb_set_t *feature_indexes_)
+ : g (get_gsubgpos_table (face, table_tag)),
+ feature_indexes (feature_indexes_),
+ script_count(0),langsys_count(0) {}
+
+ bool visited (const OT::Script &s)
+ {
+ /* We might have Null() object here. Don't want to involve
+ * that in the memoize. So, detect empty objects and return. */
+ if (unlikely (!s.has_default_lang_sys () &&
+ !s.get_lang_sys_count ()))
+ return true;
+
+ if (script_count++ > HB_MAX_SCRIPTS)
+ return true;
+
+ return visited (s, visited_script);
+ }
+ bool visited (const OT::LangSys &l)
+ {
+ /* We might have Null() object here. Don't want to involve
+ * that in the memoize. So, detect empty objects and return. */
+ if (unlikely (!l.has_required_feature () &&
+ !l.get_feature_count ()))
+ return true;
+
+ if (langsys_count++ > HB_MAX_LANGSYS)
+ return true;
+
+ return visited (l, visited_langsys);
+ }
+
+ private:
+ template <typename T>
+ bool visited (const T &p, hb_set_t &visited_set)
+ {
+ hb_codepoint_t delta = (hb_codepoint_t) ((uintptr_t) &p - (uintptr_t) &g);
+ if (visited_set.has (delta))
+ return true;
+
+ visited_set.add (delta);
+ return false;
+ }
+
+ public:
+ const OT::GSUBGPOS &g;
+ hb_set_t *feature_indexes;
+
+ private:
+ hb_set_t visited_script;
+ hb_set_t visited_langsys;
+ unsigned int script_count;
+ unsigned int langsys_count;
+};
static void
-_hb_ot_layout_collect_lookups_features (hb_face_t *face,
- hb_tag_t table_tag,
- unsigned int script_index,
- unsigned int language_index,
- const hb_tag_t *features,
- hb_set_t *lookup_indexes /* OUT */)
+langsys_collect_features (hb_collect_features_context_t *c,
+ const OT::LangSys &l,
+ const hb_tag_t *features)
{
+ if (c->visited (l)) return;
+
if (!features)
{
- unsigned int required_feature_index;
- if (hb_ot_layout_language_get_required_feature (face,
- table_tag,
- script_index,
- language_index,
- &required_feature_index,
- nullptr))
- _hb_ot_layout_collect_lookups_lookups (face,
- table_tag,
- required_feature_index,
- lookup_indexes);
-
- /* All features */
- unsigned int feature_indices[32];
- unsigned int offset, len;
-
- offset = 0;
- do {
- len = ARRAY_LENGTH (feature_indices);
- hb_ot_layout_language_get_feature_indexes (face,
- table_tag,
- script_index,
- language_index,
- offset, &len,
- feature_indices);
-
- for (unsigned int i = 0; i < len; i++)
- _hb_ot_layout_collect_lookups_lookups (face,
- table_tag,
- feature_indices[i],
- lookup_indexes);
-
- offset += len;
- } while (len == ARRAY_LENGTH (feature_indices));
+ /* All features. */
+ if (l.has_required_feature ())
+ c->feature_indexes->add (l.get_required_feature_index ());
+
+ l.add_feature_indexes_to (c->feature_indexes);
}
else
{
+ /* Ugh. Any faster way? */
for (; *features; features++)
{
- unsigned int feature_index;
- if (hb_ot_layout_language_find_feature (face,
- table_tag,
- script_index,
- language_index,
- *features,
- &feature_index))
- _hb_ot_layout_collect_lookups_lookups (face,
- table_tag,
- feature_index,
- lookup_indexes);
+ hb_tag_t feature_tag = *features;
+ unsigned int num_features = l.get_feature_count ();
+ for (unsigned int i = 0; i < num_features; i++)
+ {
+ unsigned int feature_index = l.get_feature_index (i);
+
+ if (feature_tag == c->g.get_feature_tag (feature_index))
+ {
+ c->feature_indexes->add (feature_index);
+ break;
+ }
+ }
}
}
}
static void
-_hb_ot_layout_collect_lookups_languages (hb_face_t *face,
- hb_tag_t table_tag,
- unsigned int script_index,
- const hb_tag_t *languages,
- const hb_tag_t *features,
- hb_set_t *lookup_indexes /* OUT */)
+script_collect_features (hb_collect_features_context_t *c,
+ const OT::Script &s,
+ const hb_tag_t *languages,
+ const hb_tag_t *features)
{
- _hb_ot_layout_collect_lookups_features (face,
- table_tag,
- script_index,
- HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX,
- features,
- lookup_indexes);
+ if (c->visited (s)) return;
if (!languages)
{
- /* All languages */
- unsigned int count = hb_ot_layout_script_get_language_tags (face,
- table_tag,
- script_index,
- 0, nullptr, nullptr);
+ /* All languages. */
+ if (s.has_default_lang_sys ())
+ langsys_collect_features (c,
+ s.get_default_lang_sys (),
+ features);
+
+ unsigned int count = s.get_lang_sys_count ();
for (unsigned int language_index = 0; language_index < count; language_index++)
- _hb_ot_layout_collect_lookups_features (face,
- table_tag,
- script_index,
- language_index,
- features,
- lookup_indexes);
+ langsys_collect_features (c,
+ s.get_lang_sys (language_index),
+ features);
}
else
{
for (; *languages; languages++)
{
unsigned int language_index;
- if (hb_ot_layout_script_find_language (face,
- table_tag,
- script_index,
- *languages,
- &language_index))
- _hb_ot_layout_collect_lookups_features (face,
- table_tag,
- script_index,
- language_index,
- features,
- lookup_indexes);
+ if (s.find_lang_sys_index (*languages, &language_index))
+ langsys_collect_features (c,
+ s.get_lang_sys (language_index),
+ features);
}
}
}
+
/**
- * hb_ot_layout_collect_lookups:
+ * hb_ot_layout_collect_features:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @scripts: The array of scripts to collect features for
+ * @languages: The array of languages to collect features for
+ * @features: The array of features to collect
+ * @feature_indexes: (out): The array of feature indexes found for the query
*
- * Since: 0.9.8
+ * Fetches a list of all feature indexes in the specified face's GSUB table
+ * or GPOS table, underneath the specified scripts, languages, and features.
+ * If no list of scripts is provided, all scripts will be queried. If no list
+ * of languages is provided, all languages will be queried. If no list of
+ * features is provided, all features will be queried.
+ *
+ * Since: 1.8.5
**/
void
-hb_ot_layout_collect_lookups (hb_face_t *face,
- hb_tag_t table_tag,
- const hb_tag_t *scripts,
- const hb_tag_t *languages,
- const hb_tag_t *features,
- hb_set_t *lookup_indexes /* OUT */)
+hb_ot_layout_collect_features (hb_face_t *face,
+ hb_tag_t table_tag,
+ const hb_tag_t *scripts,
+ const hb_tag_t *languages,
+ const hb_tag_t *features,
+ hb_set_t *feature_indexes /* OUT */)
{
+ hb_collect_features_context_t c (face, table_tag, feature_indexes);
if (!scripts)
{
- /* All scripts */
- unsigned int count = hb_ot_layout_table_get_script_tags (face,
- table_tag,
- 0, nullptr, nullptr);
+ /* All scripts. */
+ unsigned int count = c.g.get_script_count ();
for (unsigned int script_index = 0; script_index < count; script_index++)
- _hb_ot_layout_collect_lookups_languages (face,
- table_tag,
- script_index,
- languages,
- features,
- lookup_indexes);
+ script_collect_features (&c,
+ c.g.get_script (script_index),
+ languages,
+ features);
}
else
{
for (; *scripts; scripts++)
{
unsigned int script_index;
- if (hb_ot_layout_table_find_script (face,
- table_tag,
- *scripts,
- &script_index))
- _hb_ot_layout_collect_lookups_languages (face,
- table_tag,
- script_index,
- languages,
- features,
- lookup_indexes);
+ if (c.g.find_script_index (*scripts, &script_index))
+ script_collect_features (&c,
+ c.g.get_script (script_index),
+ languages,
+ features);
}
}
}
+
+/**
+ * hb_ot_layout_collect_lookups:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @scripts: The array of scripts to collect lookups for
+ * @languages: The array of languages to collect lookups for
+ * @features: The array of features to collect lookups for
+ * @lookup_indexes: (out): The array of lookup indexes found for the query
+ *
+ * Fetches a list of all feature-lookup indexes in the specified face's GSUB
+ * table or GPOS table, underneath the specified scripts, languages, and
+ * features. If no list of scripts is provided, all scripts will be queried.
+ * If no list of languages is provided, all languages will be queried. If no
+ * list of features is provided, all features will be queried.
+ *
+ * Since: 0.9.8
+ **/
+void
+hb_ot_layout_collect_lookups (hb_face_t *face,
+ hb_tag_t table_tag,
+ const hb_tag_t *scripts,
+ const hb_tag_t *languages,
+ const hb_tag_t *features,
+ hb_set_t *lookup_indexes /* OUT */)
+{
+ const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+ hb_set_t feature_indexes;
+ hb_ot_layout_collect_features (face, table_tag, scripts, languages, features, &feature_indexes);
+
+ for (hb_codepoint_t feature_index = HB_SET_VALUE_INVALID;
+ hb_set_next (&feature_indexes, &feature_index);)
+ g.get_feature (feature_index).add_lookup_indexes_to (lookup_indexes);
+}
+
+
+#ifndef HB_NO_LAYOUT_COLLECT_GLYPHS
/**
* hb_ot_layout_lookup_collect_glyphs:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @lookup_index: The index of the feature lookup to query
+ * @glyphs_before: (out): Array of glyphs preceding the substitution range
+ * @glyphs_input: (out): Array of input glyphs that would be substituted by the lookup
+ * @glyphs_after: (out): Array of glyphs following the substition range
+ * @glyphs_output: (out): Array of glyphs that would be the substitued output of the lookup
+ *
+ * Fetches a list of all glyphs affected by the specified lookup in the
+ * specified face's GSUB table or GPOS table.
*
* Since: 0.9.7
**/
@@ -810,13 +1235,11 @@ void
hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
hb_tag_t table_tag,
unsigned int lookup_index,
- hb_set_t *glyphs_before, /* OUT. May be nullptr */
- hb_set_t *glyphs_input, /* OUT. May be nullptr */
- hb_set_t *glyphs_after, /* OUT. May be nullptr */
- hb_set_t *glyphs_output /* OUT. May be nullptr */)
+ hb_set_t *glyphs_before, /* OUT. May be NULL */
+ hb_set_t *glyphs_input, /* OUT. May be NULL */
+ hb_set_t *glyphs_after, /* OUT. May be NULL */
+ hb_set_t *glyphs_output /* OUT. May be NULL */)
{
- if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return;
-
OT::hb_collect_glyphs_context_t c (face,
glyphs_before,
glyphs_input,
@@ -827,22 +1250,36 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
{
case HB_OT_TAG_GSUB:
{
- const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
+ const OT::SubstLookup& l = face->table.GSUB->table->get_lookup (lookup_index);
l.collect_glyphs (&c);
return;
}
case HB_OT_TAG_GPOS:
{
- const OT::PosLookup& l = hb_ot_layout_from_face (face)->gpos->get_lookup (lookup_index);
+ const OT::PosLookup& l = face->table.GPOS->table->get_lookup (lookup_index);
l.collect_glyphs (&c);
return;
}
}
}
+#endif
/* Variations support */
+
+/**
+ * hb_ot_layout_table_find_feature_variations:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @coords: The variation coordinates to query
+ * @num_coords: The number of variation coorinates
+ * @variations_index: (out): The array of feature variations found for the query
+ *
+ * Fetches a list of feature variations in the specified face's GSUB table
+ * or GPOS table, at the specified variation coordinates.
+ *
+ **/
hb_bool_t
hb_ot_layout_table_find_feature_variations (hb_face_t *face,
hb_tag_t table_tag,
@@ -855,6 +1292,23 @@ hb_ot_layout_table_find_feature_variations (hb_face_t *face,
return g.find_variations_index (coords, num_coords, variations_index);
}
+
+/**
+ * hb_ot_layout_feature_with_variations_get_lookups:
+ * @face: #hb_face_t to work upon
+ * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @feature_index: The index of the feature to query
+ * @variations_index: The index of the feature variation to query
+ * @start_offset: offset of the first lookup to retrieve
+ * @lookup_count: (inout) (allow-none): Input = the maximum number of lookups to return;
+ * Output = the actual number of lookups returned (may be zero)
+ * @lookup_indexes: (out) (array length=lookup_count): The array of lookups found for the query
+ *
+ * Fetches a list of all lookups enumerated for the specified feature, in
+ * the specified face's GSUB table or GPOS table, enabled at the specified
+ * variations index. The list returned will begin at the offset provided.
+ *
+ **/
unsigned int
hb_ot_layout_feature_with_variations_get_lookups (hb_face_t *face,
hb_tag_t table_tag,
@@ -877,14 +1331,35 @@ hb_ot_layout_feature_with_variations_get_lookups (hb_face_t *face,
* OT::GSUB
*/
+
+/**
+ * hb_ot_layout_has_substitution:
+ * @face: #hb_face_t to work upon
+ *
+ * Tests whether the specified face includes any GSUB substitutions.
+ *
+ * Return value: true if data found, false otherwise
+ *
+ **/
hb_bool_t
hb_ot_layout_has_substitution (hb_face_t *face)
{
- return &_get_gsub (face) != &OT::Null(OT::GSUB);
+ return face->table.GSUB->table->has_data ();
}
+
/**
* hb_ot_layout_lookup_would_substitute:
+ * @face: #hb_face_t to work upon
+ * @lookup_index: The index of the lookup to query
+ * @glyphs: The sequence of glyphs to query for substitution
+ * @glyphs_length: The length of the glyph sequence
+ * @zero_context: #hb_bool_t indicating whether substitutions should be context-free
+ *
+ * Tests whether a specified lookup in the specified face would
+ * trigger a substitution on the given glyph sequence.
+ *
+ * Return value: true if a substitution would be triggered, false otherwise
*
* Since: 0.9.7
**/
@@ -895,90 +1370,239 @@ hb_ot_layout_lookup_would_substitute (hb_face_t *face,
unsigned int glyphs_length,
hb_bool_t zero_context)
{
- if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return false;
- return hb_ot_layout_lookup_would_substitute_fast (face, lookup_index, glyphs, glyphs_length, zero_context);
-}
-
-hb_bool_t
-hb_ot_layout_lookup_would_substitute_fast (hb_face_t *face,
- unsigned int lookup_index,
- const hb_codepoint_t *glyphs,
- unsigned int glyphs_length,
- hb_bool_t zero_context)
-{
- if (unlikely (lookup_index >= hb_ot_layout_from_face (face)->gsub_lookup_count)) return false;
+ if (unlikely (lookup_index >= face->table.GSUB->lookup_count)) return false;
OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, (bool) zero_context);
- const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
+ const OT::SubstLookup& l = face->table.GSUB->table->get_lookup (lookup_index);
- return l.would_apply (&c, &hb_ot_layout_from_face (face)->gsub_accels[lookup_index]);
+ return l.would_apply (&c, &face->table.GSUB->accels[lookup_index]);
}
+
+/**
+ * hb_ot_layout_substitute_start:
+ * @font: #hb_font_t to use
+ * @buffer: #hb_buffer_t buffer to work upon
+ *
+ * Called before substitution lookups are performed, to ensure that glyph
+ * class and other properties are set on the glyphs in the buffer.
+ *
+ **/
void
-hb_ot_layout_substitute_start (hb_font_t *font, hb_buffer_t *buffer)
+hb_ot_layout_substitute_start (hb_font_t *font,
+ hb_buffer_t *buffer)
{
- OT::GSUB::substitute_start (font, buffer);
+_hb_ot_layout_set_glyph_props (font, buffer);
+}
+
+void
+hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer,
+ bool (*filter) (const hb_glyph_info_t *info))
+{
+ /* Merge clusters and delete filtered glyphs.
+ * NOTE! We can't use out-buffer as we have positioning data. */
+ unsigned int j = 0;
+ unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
+ hb_glyph_position_t *pos = buffer->pos;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (filter (&info[i]))
+ {
+ /* Merge clusters.
+ * Same logic as buffer->delete_glyph(), but for in-place removal. */
+
+ unsigned int cluster = info[i].cluster;
+ if (i + 1 < count && cluster == info[i + 1].cluster)
+ continue; /* Cluster survives; do nothing. */
+
+ if (j)
+ {
+ /* Merge cluster backward. */
+ if (cluster < info[j - 1].cluster)
+ {
+ unsigned int mask = info[i].mask;
+ unsigned int old_cluster = info[j - 1].cluster;
+ for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--)
+ buffer->set_cluster (info[k - 1], cluster, mask);
+ }
+ continue;
+ }
+
+ if (i + 1 < count)
+ buffer->merge_clusters (i, i + 2); /* Merge cluster forward. */
+
+ continue;
+ }
+
+ if (j != i)
+ {
+ info[j] = info[i];
+ pos[j] = pos[i];
+ }
+ j++;
+ }
+ buffer->len = j;
}
/**
* hb_ot_layout_lookup_substitute_closure:
+ * @face: #hb_face_t to work upon
+ * @lookup_index: index of the feature lookup to query
+ * @glyphs: (out): Array of glyphs comprising the transitive closure of the lookup
+ *
+ * Compute the transitive closure of glyphs needed for a
+ * specified lookup.
*
* Since: 0.9.7
**/
void
hb_ot_layout_lookup_substitute_closure (hb_face_t *face,
unsigned int lookup_index,
- hb_set_t *glyphs)
+ hb_set_t *glyphs /* OUT */)
{
- OT::hb_closure_context_t c (face, glyphs);
+ hb_map_t done_lookups;
+ OT::hb_closure_context_t c (face, glyphs, &done_lookups);
- const OT::SubstLookup& l = _get_gsub (face).get_lookup (lookup_index);
+ const OT::SubstLookup& l = face->table.GSUB->table->get_lookup (lookup_index);
- l.closure (&c);
+ l.closure (&c, lookup_index);
+}
+
+/**
+ * hb_ot_layout_lookups_substitute_closure:
+ * @face: #hb_face_t to work upon
+ * @lookups: The set of lookups to query
+ * @glyphs: (out): Array of glyphs comprising the transitive closure of the lookups
+ *
+ * Compute the transitive closure of glyphs needed for all of the
+ * provided lookups.
+ *
+ * Since: 1.8.1
+ **/
+void
+hb_ot_layout_lookups_substitute_closure (hb_face_t *face,
+ const hb_set_t *lookups,
+ hb_set_t *glyphs /* OUT */)
+{
+ hb_map_t done_lookups;
+ OT::hb_closure_context_t c (face, glyphs, &done_lookups);
+ const OT::GSUB& gsub = *face->table.GSUB->table;
+
+ unsigned int iteration_count = 0;
+ unsigned int glyphs_length;
+ do
+ {
+ glyphs_length = glyphs->get_population ();
+ if (lookups != nullptr)
+ {
+ for (hb_codepoint_t lookup_index = HB_SET_VALUE_INVALID; hb_set_next (lookups, &lookup_index);)
+ gsub.get_lookup (lookup_index).closure (&c, lookup_index);
+ }
+ else
+ {
+ for (unsigned int i = 0; i < gsub.get_lookup_count (); i++)
+ gsub.get_lookup (i).closure (&c, i);
+ }
+ } while (iteration_count++ <= HB_CLOSURE_MAX_STAGES &&
+ glyphs_length != glyphs->get_population ());
}
/*
* OT::GPOS
*/
+
+/**
+ * hb_ot_layout_has_positioning:
+ * @face: #hb_face_t to work upon
+ *
+ * Return value: true if the face has GPOS data, false otherwise
+ *
+ **/
hb_bool_t
hb_ot_layout_has_positioning (hb_face_t *face)
{
- return &_get_gpos (face) != &OT::Null(OT::GPOS);
+ return face->table.GPOS->table->has_data ();
}
+/**
+ * hb_ot_layout_position_start:
+ * @font: #hb_font_t to use
+ * @buffer: #hb_buffer_t buffer to work upon
+ *
+ * Called before positioning lookups are performed, to ensure that glyph
+ * attachment types and glyph-attachment chains are set for the glyphs in the buffer.
+ *
+ **/
void
hb_ot_layout_position_start (hb_font_t *font, hb_buffer_t *buffer)
{
OT::GPOS::position_start (font, buffer);
}
+
+/**
+ * hb_ot_layout_position_finish_advances:
+ * @font: #hb_font_t to use
+ * @buffer: #hb_buffer_t buffer to work upon
+ *
+ * Called after positioning lookups are performed, to finish glyph advances.
+ *
+ **/
void
hb_ot_layout_position_finish_advances (hb_font_t *font, hb_buffer_t *buffer)
{
OT::GPOS::position_finish_advances (font, buffer);
}
+/**
+ * hb_ot_layout_position_finish_offsets:
+ * @font: #hb_font_t to use
+ * @buffer: #hb_buffer_t buffer to work upon
+ *
+ * Called after positioning lookups are performed, to finish glyph offsets.
+ *
+ **/
void
hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer)
{
OT::GPOS::position_finish_offsets (font, buffer);
}
+
+#ifndef HB_NO_LAYOUT_FEATURE_PARAMS
/**
* hb_ot_layout_get_size_params:
+ * @face: #hb_face_t to work upon
+ * @design_size: (out): The design size of the face
+ * @subfamily_id: (out): The identifier of the face within the font subfamily
+ * @subfamily_name_id: (out): The ‘name’ table name ID of the face within the font subfamily
+ * @range_start: (out): The minimum size of the recommended size range for the face
+ * @range_end: (out): The maximum size of the recommended size range for the face
+ *
+ * Fetches optical-size feature data (i.e., the `size` feature from GPOS). Note that
+ * the subfamily_id and the subfamily name string (accessible via the subfamily_name_id)
+ * as used here are defined as pertaining only to fonts within a font family that differ
+ * specifically in their respective size ranges; other ways to differentiate fonts within
+ * a subfamily are not covered by the `size` feature.
+ *
+ * For more information on this distinction, see the `size` documentation at
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-39size39
+ *
+ * Return value: true if data found, false otherwise
*
* Since: 0.9.10
**/
hb_bool_t
-hb_ot_layout_get_size_params (hb_face_t *face,
- unsigned int *design_size, /* OUT. May be nullptr */
- unsigned int *subfamily_id, /* OUT. May be nullptr */
- unsigned int *subfamily_name_id, /* OUT. May be nullptr */
- unsigned int *range_start, /* OUT. May be nullptr */
- unsigned int *range_end /* OUT. May be nullptr */)
+hb_ot_layout_get_size_params (hb_face_t *face,
+ unsigned int *design_size, /* OUT. May be NULL */
+ unsigned int *subfamily_id, /* OUT. May be NULL */
+ hb_ot_name_id_t *subfamily_name_id, /* OUT. May be NULL */
+ unsigned int *range_start, /* OUT. May be NULL */
+ unsigned int *range_end /* OUT. May be NULL */)
{
- const OT::GPOS &gpos = _get_gpos (face);
+ const OT::GPOS &gpos = *face->table.GPOS->table;
const hb_tag_t tag = HB_TAG ('s','i','z','e');
unsigned int num_features = gpos.get_feature_count ();
@@ -991,29 +1615,153 @@ hb_ot_layout_get_size_params (hb_face_t *face,
if (params.designSize)
{
-#define PARAM(a, A) if (a) *a = params.A
- PARAM (design_size, designSize);
- PARAM (subfamily_id, subfamilyID);
- PARAM (subfamily_name_id, subfamilyNameID);
- PARAM (range_start, rangeStart);
- PARAM (range_end, rangeEnd);
-#undef PARAM
+ if (design_size) *design_size = params.designSize;
+ if (subfamily_id) *subfamily_id = params.subfamilyID;
+ if (subfamily_name_id) *subfamily_name_id = params.subfamilyNameID;
+ if (range_start) *range_start = params.rangeStart;
+ if (range_end) *range_end = params.rangeEnd;
return true;
}
}
}
-#define PARAM(a, A) if (a) *a = 0
- PARAM (design_size, designSize);
- PARAM (subfamily_id, subfamilyID);
- PARAM (subfamily_name_id, subfamilyNameID);
- PARAM (range_start, rangeStart);
- PARAM (range_end, rangeEnd);
-#undef PARAM
+ if (design_size) *design_size = 0;
+ if (subfamily_id) *subfamily_id = 0;
+ if (subfamily_name_id) *subfamily_name_id = HB_OT_NAME_ID_INVALID;
+ if (range_start) *range_start = 0;
+ if (range_end) *range_end = 0;
return false;
}
+/**
+ * hb_ot_layout_feature_get_name_ids:
+ * @face: #hb_face_t to work upon
+ * @table_tag: table tag to query, "GSUB" or "GPOS".
+ * @feature_index: index of feature to query.
+ * @label_id: (out) (allow-none): The ‘name’ table name ID that specifies a string
+ * for a user-interface label for this feature. (May be NULL.)
+ * @tooltip_id: (out) (allow-none): The ‘name’ table name ID that specifies a string
+ * that an application can use for tooltip text for this
+ * feature. (May be NULL.)
+ * @sample_id: (out) (allow-none): The ‘name’ table name ID that specifies sample text
+ * that illustrates the effect of this feature. (May be NULL.)
+ * @num_named_parameters: (out) (allow-none): Number of named parameters. (May be zero.)
+ * @first_param_id: (out) (allow-none): The first ‘name’ table name ID used to specify
+ * strings for user-interface labels for the feature
+ * parameters. (Must be zero if numParameters is zero.)
+ *
+ * Fetches name indices from feature parameters for "Stylistic Set" ('ssXX') or
+ * "Character Variant" ('cvXX') features.
+ *
+ * Return value: true if data found, false otherwise
+ *
+ * Since: 2.0.0
+ **/
+hb_bool_t
+hb_ot_layout_feature_get_name_ids (hb_face_t *face,
+ hb_tag_t table_tag,
+ unsigned int feature_index,
+ hb_ot_name_id_t *label_id, /* OUT. May be NULL */
+ hb_ot_name_id_t *tooltip_id, /* OUT. May be NULL */
+ hb_ot_name_id_t *sample_id, /* OUT. May be NULL */
+ unsigned int *num_named_parameters, /* OUT. May be NULL */
+ hb_ot_name_id_t *first_param_id /* OUT. May be NULL */)
+{
+ const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+ hb_tag_t feature_tag = g.get_feature_tag (feature_index);
+ const OT::Feature &f = g.get_feature (feature_index);
+
+ const OT::FeatureParams &feature_params = f.get_feature_params ();
+ if (&feature_params != &Null (OT::FeatureParams))
+ {
+ const OT::FeatureParamsStylisticSet& ss_params =
+ feature_params.get_stylistic_set_params (feature_tag);
+ if (&ss_params != &Null (OT::FeatureParamsStylisticSet)) /* ssXX */
+ {
+ if (label_id) *label_id = ss_params.uiNameID;
+ // ssXX features don't have the rest
+ if (tooltip_id) *tooltip_id = HB_OT_NAME_ID_INVALID;
+ if (sample_id) *sample_id = HB_OT_NAME_ID_INVALID;
+ if (num_named_parameters) *num_named_parameters = 0;
+ if (first_param_id) *first_param_id = HB_OT_NAME_ID_INVALID;
+ return true;
+ }
+ const OT::FeatureParamsCharacterVariants& cv_params =
+ feature_params.get_character_variants_params (feature_tag);
+ if (&cv_params != &Null (OT::FeatureParamsCharacterVariants)) /* cvXX */
+ {
+ if (label_id) *label_id = cv_params.featUILableNameID;
+ if (tooltip_id) *tooltip_id = cv_params.featUITooltipTextNameID;
+ if (sample_id) *sample_id = cv_params.sampleTextNameID;
+ if (num_named_parameters) *num_named_parameters = cv_params.numNamedParameters;
+ if (first_param_id) *first_param_id = cv_params.firstParamUILabelNameID;
+ return true;
+ }
+ }
+
+ if (label_id) *label_id = HB_OT_NAME_ID_INVALID;
+ if (tooltip_id) *tooltip_id = HB_OT_NAME_ID_INVALID;
+ if (sample_id) *sample_id = HB_OT_NAME_ID_INVALID;
+ if (num_named_parameters) *num_named_parameters = 0;
+ if (first_param_id) *first_param_id = HB_OT_NAME_ID_INVALID;
+ return false;
+}
+/**
+ * hb_ot_layout_feature_get_characters:
+ * @face: #hb_face_t to work upon
+ * @table_tag: table tag to query, "GSUB" or "GPOS".
+ * @feature_index: index of feature to query.
+ * @start_offset: offset of the first character to retrieve
+ * @char_count: (inout) (allow-none): Input = the maximum number of characters to return;
+ * Output = the actual number of characters returned (may be zero)
+ * @characters: (out caller-allocates) (array length=char_count): A buffer pointer.
+ * The Unicode codepoints of the characters for which this feature provides
+ * glyph variants.
+ *
+ * Fetches a list of the characters defined as having a variant under the specified
+ * "Character Variant" ("cvXX") feature tag.
+ *
+ * <note>Note: If the char_count output value is equal to its input value, then there
+ * is a chance there were more characters defined under the feature tag than were
+ * returned. This function can be called with incrementally larger start_offset
+ * until the char_count output value is lower than its input value, or the size
+ * of the characters array can be increased.</note>
+ *
+ * Return value: Number of total sample characters in the cvXX feature.
+ *
+ * Since: 2.0.0
+ **/
+unsigned int
+hb_ot_layout_feature_get_characters (hb_face_t *face,
+ hb_tag_t table_tag,
+ unsigned int feature_index,
+ unsigned int start_offset,
+ unsigned int *char_count, /* IN/OUT. May be NULL */
+ hb_codepoint_t *characters /* OUT. May be NULL */)
+{
+ const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+ hb_tag_t feature_tag = g.get_feature_tag (feature_index);
+ const OT::Feature &f = g.get_feature (feature_index);
+
+ const OT::FeatureParams &feature_params = f.get_feature_params ();
+
+ const OT::FeatureParamsCharacterVariants& cv_params =
+ feature_params.get_character_variants_params(feature_tag);
+
+ unsigned int len = 0;
+ if (char_count && characters && start_offset < cv_params.characters.len)
+ {
+ len = hb_min (cv_params.characters.len - start_offset, *char_count);
+ for (unsigned int i = 0; i < len; ++i)
+ characters[i] = cv_params.characters[start_offset + i];
+ }
+ if (char_count) *char_count = len;
+ return cv_params.characters.len;
+}
+#endif
/*
@@ -1024,103 +1772,47 @@ hb_ot_layout_get_size_params (hb_face_t *face,
struct GSUBProxy
{
- static const unsigned int table_index = 0;
- static const bool inplace = false;
+ static constexpr unsigned table_index = 0u;
+ static constexpr bool inplace = false;
typedef OT::SubstLookup Lookup;
GSUBProxy (hb_face_t *face) :
- table (*hb_ot_layout_from_face (face)->gsub),
- accels (hb_ot_layout_from_face (face)->gsub_accels) {}
+ table (*face->table.GSUB->table),
+ accels (face->table.GSUB->accels) {}
const OT::GSUB &table;
- const hb_ot_layout_lookup_accelerator_t *accels;
+ const OT::hb_ot_layout_lookup_accelerator_t *accels;
};
struct GPOSProxy
{
- static const unsigned int table_index = 1;
- static const bool inplace = true;
+ static constexpr unsigned table_index = 1u;
+ static constexpr bool inplace = true;
typedef OT::PosLookup Lookup;
GPOSProxy (hb_face_t *face) :
- table (*hb_ot_layout_from_face (face)->gpos),
- accels (hb_ot_layout_from_face (face)->gpos_accels) {}
+ table (*face->table.GPOS->table),
+ accels (face->table.GPOS->accels) {}
const OT::GPOS &table;
- const hb_ot_layout_lookup_accelerator_t *accels;
+ const OT::hb_ot_layout_lookup_accelerator_t *accels;
};
-struct hb_get_subtables_context_t :
- OT::hb_dispatch_context_t<hb_get_subtables_context_t, hb_void_t, HB_DEBUG_APPLY>
-{
- template <typename Type>
- static inline bool apply_to (const void *obj, OT::hb_apply_context_t *c)
- {
- const Type *typed_obj = (const Type *) obj;
- return typed_obj->apply (c);
- }
-
- typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_apply_context_t *c);
-
- struct hb_applicable_t
- {
- inline void init (const void *obj_, hb_apply_func_t apply_func_)
- {
- obj = obj_;
- apply_func = apply_func_;
- }
-
- inline bool apply (OT::hb_apply_context_t *c) const { return apply_func (obj, c); }
-
- private:
- const void *obj;
- hb_apply_func_t apply_func;
- };
-
- typedef hb_auto_array_t<hb_applicable_t> array_t;
-
- /* Dispatch interface. */
- inline const char *get_name (void) { return "GET_SUBTABLES"; }
- template <typename T>
- inline return_t dispatch (const T &obj)
- {
- hb_applicable_t *entry = array.push();
- if (likely (entry))
- entry->init (&obj, apply_to<T>);
- return HB_VOID;
- }
- static return_t default_return_value (void) { return HB_VOID; }
- bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return false; }
-
- hb_get_subtables_context_t (array_t &array_) :
- array (array_),
- debug_depth (0) {}
-
- array_t &array;
- unsigned int debug_depth;
-};
-
static inline bool
-apply_forward (OT::hb_apply_context_t *c,
- const hb_ot_layout_lookup_accelerator_t &accel,
- const hb_get_subtables_context_t::array_t &subtables)
+apply_forward (OT::hb_ot_apply_context_t *c,
+ const OT::hb_ot_layout_lookup_accelerator_t &accel)
{
bool ret = false;
hb_buffer_t *buffer = c->buffer;
- while (buffer->idx < buffer->len && !buffer->in_error)
+ while (buffer->idx < buffer->len && buffer->successful)
{
bool applied = false;
if (accel.may_have (buffer->cur().codepoint) &&
(buffer->cur().mask & c->lookup_mask) &&
c->check_glyph_property (&buffer->cur(), c->lookup_props))
{
- for (unsigned int i = 0; i < subtables.len; i++)
- if (subtables[i].apply (c))
- {
- applied = true;
- break;
- }
+ applied = accel.apply (c);
}
if (applied)
@@ -1132,9 +1824,8 @@ apply_forward (OT::hb_apply_context_t *c,
}
static inline bool
-apply_backward (OT::hb_apply_context_t *c,
- const hb_ot_layout_lookup_accelerator_t &accel,
- const hb_get_subtables_context_t::array_t &subtables)
+apply_backward (OT::hb_ot_apply_context_t *c,
+ const OT::hb_ot_layout_lookup_accelerator_t &accel)
{
bool ret = false;
hb_buffer_t *buffer = c->buffer;
@@ -1143,14 +1834,8 @@ apply_backward (OT::hb_apply_context_t *c,
if (accel.may_have (buffer->cur().codepoint) &&
(buffer->cur().mask & c->lookup_mask) &&
c->check_glyph_property (&buffer->cur(), c->lookup_props))
- {
- for (unsigned int i = 0; i < subtables.len; i++)
- if (subtables[i].apply (c))
- {
- ret = true;
- break;
- }
- }
+ ret |= accel.apply (c);
+
/* The reverse lookup doesn't "advance" cursor (for good reason). */
buffer->idx--;
@@ -1161,9 +1846,9 @@ apply_backward (OT::hb_apply_context_t *c,
template <typename Proxy>
static inline void
-apply_string (OT::hb_apply_context_t *c,
+apply_string (OT::hb_ot_apply_context_t *c,
const typename Proxy::Lookup &lookup,
- const hb_ot_layout_lookup_accelerator_t &accel)
+ const OT::hb_ot_layout_lookup_accelerator_t &accel)
{
hb_buffer_t *buffer = c->buffer;
@@ -1172,19 +1857,15 @@ apply_string (OT::hb_apply_context_t *c,
c->set_lookup_props (lookup.get_props ());
- hb_get_subtables_context_t::array_t subtables;
- hb_get_subtables_context_t c_get_subtables (subtables);
- lookup.dispatch (&c_get_subtables);
-
if (likely (!lookup.is_reverse ()))
{
/* in/out forward substitution/positioning */
- if (Proxy::table_index == 0)
+ if (Proxy::table_index == 0u)
buffer->clear_output ();
buffer->idx = 0;
bool ret;
- ret = apply_forward (c, accel, subtables);
+ ret = apply_forward (c, accel);
if (ret)
{
if (!Proxy::inplace)
@@ -1196,11 +1877,11 @@ apply_string (OT::hb_apply_context_t *c,
else
{
/* in-place backward substitution/positioning */
- if (Proxy::table_index == 0)
+ if (Proxy::table_index == 0u)
buffer->remove_output ();
buffer->idx = buffer->len - 1;
- apply_backward (c, accel, subtables);
+ apply_backward (c, accel);
}
}
@@ -1212,10 +1893,10 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
{
const unsigned int table_index = proxy.table_index;
unsigned int i = 0;
- OT::hb_apply_context_t c (table_index, font, buffer);
+ OT::hb_ot_apply_context_t c (table_index, font, buffer);
c.set_recurse_func (Proxy::Lookup::apply_recurse_func);
- for (unsigned int stage_index = 0; stage_index < stages[table_index].len; stage_index++) {
+ for (unsigned int stage_index = 0; stage_index < stages[table_index].length; stage_index++) {
const stage_map_t *stage = &stages[table_index][stage_index];
for (; i < stage->last_lookup; i++)
{
@@ -1225,6 +1906,11 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
c.set_lookup_mask (lookups[table_index][i].mask);
c.set_auto_zwj (lookups[table_index][i].auto_zwj);
c.set_auto_zwnj (lookups[table_index][i].auto_zwnj);
+ if (lookups[table_index][i].random)
+ {
+ c.set_random (true);
+ buffer->unsafe_to_break_all ();
+ }
apply_string<Proxy> (&c,
proxy.table.get_lookup (lookup_index),
proxy.accels[lookup_index]);
@@ -1251,10 +1937,44 @@ void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_
apply (proxy, plan, font, buffer);
}
-HB_INTERNAL void
-hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c,
+void
+hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
const OT::SubstLookup &lookup,
- const hb_ot_layout_lookup_accelerator_t &accel)
+ const OT::hb_ot_layout_lookup_accelerator_t &accel)
{
apply_string<GSUBProxy> (c, lookup, accel);
}
+
+#ifndef HB_NO_BASE
+/**
+ * hb_ot_layout_get_baseline:
+ * @font: a font
+ * @baseline_tag: a baseline tag
+ * @direction: text direction.
+ * @script_tag: script tag.
+ * @language_tag: language tag.
+ * @coord: (out): baseline value if found.
+ *
+ * Fetches a baseline value from the face.
+ *
+ * Return value: if found baseline value in the the font.
+ *
+ * Since: 2.6.0
+ **/
+hb_bool_t
+hb_ot_layout_get_baseline (hb_font_t *font,
+ hb_ot_layout_baseline_tag_t baseline_tag,
+ hb_direction_t direction,
+ hb_tag_t script_tag,
+ hb_tag_t language_tag,
+ hb_position_t *coord /* OUT. May be NULL. */)
+{
+ bool result = font->face->table.BASE->get_baseline (font, baseline_tag, direction, script_tag, language_tag, coord);
+
+ if (result && coord)
+ *coord = HB_DIRECTION_IS_HORIZONTAL (direction) ? font->em_scale_y (*coord) : font->em_scale_x (*coord);
+
+ return result;
+}
+#endif
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h
index 9861f0fc7b..7e8a897cff 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h
@@ -33,11 +33,12 @@
#include "hb.h"
-#include "hb-ot-tag.h"
+#include "hb-ot-name.h"
HB_BEGIN_DECLS
+#define HB_OT_TAG_BASE HB_TAG('B','A','S','E')
#define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
#define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
#define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
@@ -45,12 +46,64 @@ HB_BEGIN_DECLS
/*
+ * Script & Language tags.
+ */
+
+#define HB_OT_TAG_DEFAULT_SCRIPT HB_TAG ('D', 'F', 'L', 'T')
+#define HB_OT_TAG_DEFAULT_LANGUAGE HB_TAG ('d', 'f', 'l', 't')
+
+/**
+ * HB_OT_MAX_TAGS_PER_SCRIPT:
+ *
+ * Since: 2.0.0
+ **/
+#define HB_OT_MAX_TAGS_PER_SCRIPT 3u
+/**
+ * HB_OT_MAX_TAGS_PER_LANGUAGE:
+ *
+ * Since: 2.0.0
+ **/
+#define HB_OT_MAX_TAGS_PER_LANGUAGE 3u
+
+HB_EXTERN void
+hb_ot_tags_from_script_and_language (hb_script_t script,
+ hb_language_t language,
+ unsigned int *script_count /* IN/OUT */,
+ hb_tag_t *script_tags /* OUT */,
+ unsigned int *language_count /* IN/OUT */,
+ hb_tag_t *language_tags /* OUT */);
+
+HB_EXTERN hb_script_t
+hb_ot_tag_to_script (hb_tag_t tag);
+
+HB_EXTERN hb_language_t
+hb_ot_tag_to_language (hb_tag_t tag);
+
+HB_EXTERN void
+hb_ot_tags_to_script_and_language (hb_tag_t script_tag,
+ hb_tag_t language_tag,
+ hb_script_t *script /* OUT */,
+ hb_language_t *language /* OUT */);
+
+
+/*
* GDEF
*/
HB_EXTERN hb_bool_t
hb_ot_layout_has_glyph_classes (hb_face_t *face);
+/**
+ * hb_ot_layout_glyph_class_t:
+ * @HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED: Glyphs not matching the other classifications
+ * @HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH: Spacing, single characters, capable of accepting marks
+ * @HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE: Glyphs that represent ligation of multiple characters
+ * @HB_OT_LAYOUT_GLYPH_CLASS_MARK: Non-spacing, combining glyphs that represent marks
+ * @HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT: Spacing glyphs that represent part of a single character
+ *
+ * The GDEF classes defined for glyphs.
+ *
+ **/
typedef enum {
HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED = 0,
HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH = 1,
@@ -110,13 +163,13 @@ hb_ot_layout_table_find_script (hb_face_t *face,
hb_tag_t script_tag,
unsigned int *script_index);
-/* Like find_script, but takes zero-terminated array of scripts to test */
HB_EXTERN hb_bool_t
-hb_ot_layout_table_choose_script (hb_face_t *face,
+hb_ot_layout_table_select_script (hb_face_t *face,
hb_tag_t table_tag,
+ unsigned int script_count,
const hb_tag_t *script_tags,
- unsigned int *script_index,
- hb_tag_t *chosen_script);
+ unsigned int *script_index /* OUT */,
+ hb_tag_t *chosen_script /* OUT */);
HB_EXTERN unsigned int
hb_ot_layout_table_get_feature_tags (hb_face_t *face,
@@ -134,11 +187,12 @@ hb_ot_layout_script_get_language_tags (hb_face_t *face,
hb_tag_t *language_tags /* OUT */);
HB_EXTERN hb_bool_t
-hb_ot_layout_script_find_language (hb_face_t *face,
- hb_tag_t table_tag,
- unsigned int script_index,
- hb_tag_t language_tag,
- unsigned int *language_index);
+hb_ot_layout_script_select_language (hb_face_t *face,
+ hb_tag_t table_tag,
+ unsigned int script_index,
+ unsigned int language_count,
+ const hb_tag_t *language_tags,
+ unsigned int *language_index /* OUT */);
HB_EXTERN hb_bool_t
hb_ot_layout_language_get_required_feature_index (hb_face_t *face,
@@ -193,6 +247,13 @@ HB_EXTERN unsigned int
hb_ot_layout_table_get_lookup_count (hb_face_t *face,
hb_tag_t table_tag);
+HB_EXTERN void
+hb_ot_layout_collect_features (hb_face_t *face,
+ hb_tag_t table_tag,
+ const hb_tag_t *scripts,
+ const hb_tag_t *languages,
+ const hb_tag_t *features,
+ hb_set_t *feature_indexes /* OUT */);
HB_EXTERN void
hb_ot_layout_collect_lookups (hb_face_t *face,
@@ -206,10 +267,10 @@ HB_EXTERN void
hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
hb_tag_t table_tag,
unsigned int lookup_index,
- hb_set_t *glyphs_before, /* OUT. May be NULL */
- hb_set_t *glyphs_input, /* OUT. May be NULL */
- hb_set_t *glyphs_after, /* OUT. May be NULL */
- hb_set_t *glyphs_output /* OUT. May be NULL */);
+ hb_set_t *glyphs_before, /* OUT. May be NULL */
+ hb_set_t *glyphs_input, /* OUT. May be NULL */
+ hb_set_t *glyphs_after, /* OUT. May be NULL */
+ hb_set_t *glyphs_output /* OUT. May be NULL */);
#ifdef HB_NOT_IMPLEMENTED
typedef struct
@@ -272,10 +333,16 @@ hb_ot_layout_lookup_would_substitute (hb_face_t *face,
HB_EXTERN void
hb_ot_layout_lookup_substitute_closure (hb_face_t *face,
- unsigned int lookup_index,
- hb_set_t *glyphs
+ unsigned int lookup_index,
+ hb_set_t *glyphs
/*TODO , hb_bool_t inclusive */);
+HB_EXTERN void
+hb_ot_layout_lookups_substitute_closure (hb_face_t *face,
+ const hb_set_t *lookups,
+ hb_set_t *glyphs);
+
+
#ifdef HB_NOT_IMPLEMENTED
/* Note: You better have GDEF when using this API, or marks won't do much. */
HB_EXTERN hb_bool_t
@@ -306,14 +373,82 @@ Xhb_ot_layout_lookup_position (hb_font_t *font,
#endif
/* Optical 'size' feature info. Returns true if found.
- * http://www.microsoft.com/typography/otspec/features_pt.htm#size */
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#size */
+HB_EXTERN hb_bool_t
+hb_ot_layout_get_size_params (hb_face_t *face,
+ unsigned int *design_size, /* OUT. May be NULL */
+ unsigned int *subfamily_id, /* OUT. May be NULL */
+ hb_ot_name_id_t *subfamily_name_id, /* OUT. May be NULL */
+ unsigned int *range_start, /* OUT. May be NULL */
+ unsigned int *range_end /* OUT. May be NULL */);
+
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_feature_get_name_ids (hb_face_t *face,
+ hb_tag_t table_tag,
+ unsigned int feature_index,
+ hb_ot_name_id_t *label_id /* OUT. May be NULL */,
+ hb_ot_name_id_t *tooltip_id /* OUT. May be NULL */,
+ hb_ot_name_id_t *sample_id /* OUT. May be NULL */,
+ unsigned int *num_named_parameters /* OUT. May be NULL */,
+ hb_ot_name_id_t *first_param_id /* OUT. May be NULL */);
+
+
+HB_EXTERN unsigned int
+hb_ot_layout_feature_get_characters (hb_face_t *face,
+ hb_tag_t table_tag,
+ unsigned int feature_index,
+ unsigned int start_offset,
+ unsigned int *char_count /* IN/OUT. May be NULL */,
+ hb_codepoint_t *characters /* OUT. May be NULL */);
+
+/*
+ * BASE
+ */
+
+/**
+ * hb_ot_layout_baseline_tag_t:
+ * @HB_OT_LAYOUT_BASELINE_TAG_ROMAN: The baseline used by alphabetic scripts such as Latin, Cyrillic and Greek.
+ * In vertical writing mode, the alphabetic baseline for characters rotated 90 degrees clockwise.
+ * (This would not apply to alphabetic characters that remain upright in vertical writing mode, since these
+ * characters are not rotated.)
+ * @HB_OT_LAYOUT_BASELINE_TAG_HANGING: The hanging baseline. In horizontal direction, this is the horizontal
+ * line from which syllables seem, to hang in Tibetan and other similar scripts. In vertical writing mode,
+ * for Tibetan (or some other similar script) characters rotated 90 degrees clockwise.
+ * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_BOTTOM_OR_LEFT: Ideographic character face bottom or left edge,
+ * if the direction is horizontal or vertical, respectively.
+ * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_TOP_OR_RIGHT: Ideographic character face top or right edge,
+ * if the direction is horizontal or vertical, respectively.
+ * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_BOTTOM_OR_LEFT: Ideographic em-box bottom or left edge,
+ * if the direction is horizontal or vertical, respectively.
+ * @HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_TOP_OR_RIGHT: Ideographic em-box top or right edge baseline,
+ * if the direction is horizontal or vertical, respectively.
+ * @HB_OT_LAYOUT_BASELINE_TAG_MATH: The baseline about which mathematical characters are centered.
+ * In vertical writing mode when mathematical characters rotated 90 degrees clockwise, are centered.
+ *
+ * Baseline tags from https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags
+ *
+ * Since: 2.6.0
+ */
+typedef enum {
+ HB_OT_LAYOUT_BASELINE_TAG_ROMAN = HB_TAG ('r','o','m','n'),
+ HB_OT_LAYOUT_BASELINE_TAG_HANGING = HB_TAG ('h','a','n','g'),
+ HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_BOTTOM_OR_LEFT = HB_TAG ('i','c','f','b'),
+ HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_TOP_OR_RIGHT = HB_TAG ('i','c','f','t'),
+ HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_BOTTOM_OR_LEFT = HB_TAG ('i','d','e','o'),
+ HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_TOP_OR_RIGHT = HB_TAG ('i','d','t','p'),
+ HB_OT_LAYOUT_BASELINE_TAG_MATH = HB_TAG ('m','a','t','h'),
+
+ _HB_OT_LAYOUT_BASELINE_TAG_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
+} hb_ot_layout_baseline_tag_t;
+
HB_EXTERN hb_bool_t
-hb_ot_layout_get_size_params (hb_face_t *face,
- unsigned int *design_size, /* OUT. May be NULL */
- unsigned int *subfamily_id, /* OUT. May be NULL */
- unsigned int *subfamily_name_id, /* OUT. May be NULL */
- unsigned int *range_start, /* OUT. May be NULL */
- unsigned int *range_end /* OUT. May be NULL */);
+hb_ot_layout_get_baseline (hb_font_t *font,
+ hb_ot_layout_baseline_tag_t baseline_tag,
+ hb_direction_t direction,
+ hb_tag_t script_tag,
+ hb_tag_t language_tag,
+ hb_position_t *coord /* OUT. May be NULL. */);
HB_END_DECLS
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.hh
new file mode 100644
index 0000000000..f3bb15581a
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.hh
@@ -0,0 +1,627 @@
+/*
+ * Copyright © 2007,2008,2009 Red Hat, Inc.
+ * Copyright © 2012,2013 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_LAYOUT_HH
+#define HB_OT_LAYOUT_HH
+
+#include "hb.hh"
+
+#include "hb-font.hh"
+#include "hb-buffer.hh"
+#include "hb-open-type.hh"
+#include "hb-ot-shape.hh"
+#include "hb-set-digest.hh"
+
+
+struct hb_ot_shape_plan_t;
+
+
+/*
+ * kern
+ */
+
+HB_INTERNAL bool
+hb_ot_layout_has_kerning (hb_face_t *face);
+
+HB_INTERNAL bool
+hb_ot_layout_has_machine_kerning (hb_face_t *face);
+
+HB_INTERNAL bool
+hb_ot_layout_has_cross_kerning (hb_face_t *face);
+
+HB_INTERNAL void
+hb_ot_layout_kern (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
+
+/* Private API corresponding to hb-ot-layout.h: */
+
+HB_INTERNAL bool
+hb_ot_layout_table_find_feature (hb_face_t *face,
+ hb_tag_t table_tag,
+ hb_tag_t feature_tag,
+ unsigned int *feature_index);
+
+
+/*
+ * GDEF
+ */
+
+enum hb_ot_layout_glyph_props_flags_t
+{
+ /* The following three match LookupFlags::Ignore* numbers. */
+ HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH = 0x02u,
+ HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE = 0x04u,
+ HB_OT_LAYOUT_GLYPH_PROPS_MARK = 0x08u,
+
+ /* The following are used internally; not derived from GDEF. */
+ HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED = 0x10u,
+ HB_OT_LAYOUT_GLYPH_PROPS_LIGATED = 0x20u,
+ HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED = 0x40u,
+
+ HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE = HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED |
+ HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
+ HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED
+};
+HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t);
+
+
+/*
+ * GSUB/GPOS
+ */
+
+
+/* Should be called before all the substitute_lookup's are done. */
+HB_INTERNAL void
+hb_ot_layout_substitute_start (hb_font_t *font,
+ hb_buffer_t *buffer);
+
+HB_INTERNAL void
+hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer,
+ bool (*filter) (const hb_glyph_info_t *info));
+
+namespace OT {
+ struct hb_ot_apply_context_t;
+ struct SubstLookup;
+ struct hb_ot_layout_lookup_accelerator_t;
+}
+
+HB_INTERNAL void
+hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
+ const OT::SubstLookup &lookup,
+ const OT::hb_ot_layout_lookup_accelerator_t &accel);
+
+
+/* Should be called before all the position_lookup's are done. */
+HB_INTERNAL void
+hb_ot_layout_position_start (hb_font_t *font,
+ hb_buffer_t *buffer);
+
+/* Should be called after all the position_lookup's are done, to fini advances. */
+HB_INTERNAL void
+hb_ot_layout_position_finish_advances (hb_font_t *font,
+ hb_buffer_t *buffer);
+
+/* Should be called after hb_ot_layout_position_finish_advances, to fini offsets. */
+HB_INTERNAL void
+hb_ot_layout_position_finish_offsets (hb_font_t *font,
+ hb_buffer_t *buffer);
+
+
+/*
+ * Buffer var routines.
+ */
+
+/* buffer var allocations, used during the entire shaping process */
+#define unicode_props() var2.u16[0]
+
+/* buffer var allocations, used during the GSUB/GPOS processing */
+#define glyph_props() var1.u16[0] /* GDEF glyph properties */
+#define lig_props() var1.u8[2] /* GSUB/GPOS ligature tracking */
+#define syllable() var1.u8[3] /* GSUB/GPOS shaping boundaries */
+
+
+/* Loop over syllables. Based on foreach_cluster(). */
+#define foreach_syllable(buffer, start, end) \
+ for (unsigned int \
+ _count = buffer->len, \
+ start = 0, end = _count ? _hb_next_syllable (buffer, 0) : 0; \
+ start < _count; \
+ start = end, end = _hb_next_syllable (buffer, start))
+
+static inline unsigned int
+_hb_next_syllable (hb_buffer_t *buffer, unsigned int start)
+{
+ hb_glyph_info_t *info = buffer->info;
+ unsigned int count = buffer->len;
+
+ unsigned int syllable = info[start].syllable();
+ while (++start < count && syllable == info[start].syllable())
+ ;
+
+ return start;
+}
+
+static inline void
+_hb_clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font HB_UNUSED,
+ hb_buffer_t *buffer)
+{
+ hb_glyph_info_t *info = buffer->info;
+ unsigned int count = buffer->len;
+ for (unsigned int i = 0; i < count; i++)
+ info[i].syllable() = 0;
+}
+
+
+/* unicode_props */
+
+/* Design:
+ * unicode_props() is a two-byte number. The low byte includes:
+ * - General_Category: 5 bits.
+ * - A bit each for:
+ * * Is it Default_Ignorable(); we have a modified Default_Ignorable().
+ * * Whether it's one of the three Mongolian Free Variation Selectors,
+ * CGJ, or other characters that are hidden but should not be ignored
+ * like most other Default_Ignorable()s do during matching.
+ * * Whether it's a grapheme continuation.
+ *
+ * The high-byte has different meanings, switched by the Gen-Cat:
+ * - For Mn,Mc,Me: the modified Combining_Class.
+ * - For Cf: whether it's ZWJ, ZWNJ, or something else.
+ * - For Ws: index of which space character this is, if space fallback
+ * is needed, ie. we don't set this by default, only if asked to.
+ */
+
+enum hb_unicode_props_flags_t {
+ UPROPS_MASK_GEN_CAT = 0x001Fu,
+ UPROPS_MASK_IGNORABLE = 0x0020u,
+ UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3, or TAG characters */
+ UPROPS_MASK_CONTINUATION=0x0080u,
+
+ /* If GEN_CAT=FORMAT, top byte masks: */
+ UPROPS_MASK_Cf_ZWJ = 0x0100u,
+ UPROPS_MASK_Cf_ZWNJ = 0x0200u
+};
+HB_MARK_AS_FLAG_T (hb_unicode_props_flags_t);
+
+static inline void
+_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
+{
+ hb_unicode_funcs_t *unicode = buffer->unicode;
+ unsigned int u = info->codepoint;
+ unsigned int gen_cat = (unsigned int) unicode->general_category (u);
+ unsigned int props = gen_cat;
+
+ if (u >= 0x80u)
+ {
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
+
+ if (unlikely (unicode->is_default_ignorable (u)))
+ {
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
+ props |= UPROPS_MASK_IGNORABLE;
+ if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
+ else if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
+ /* Mongolian Free Variation Selectors need to be remembered
+ * because although we need to hide them like default-ignorables,
+ * they need to non-ignorable during shaping. This is similar to
+ * what we do for joiners in Indic-like shapers, but since the
+ * FVSes are GC=Mn, we have use a separate bit to remember them.
+ * Fixes:
+ * https://github.com/harfbuzz/harfbuzz/issues/234 */
+ else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_HIDDEN;
+ /* TAG characters need similar treatment. Fixes:
+ * https://github.com/harfbuzz/harfbuzz/issues/463 */
+ else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN;
+ /* COMBINING GRAPHEME JOINER should not be skipped; at least some times.
+ * https://github.com/harfbuzz/harfbuzz/issues/554 */
+ else if (unlikely (u == 0x034Fu))
+ {
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CGJ;
+ props |= UPROPS_MASK_HIDDEN;
+ }
+ }
+
+ if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (gen_cat)))
+ {
+ props |= UPROPS_MASK_CONTINUATION;
+ props |= unicode->modified_combining_class (u)<<8;
+ }
+ }
+
+ info->unicode_props() = props;
+}
+
+static inline void
+_hb_glyph_info_set_general_category (hb_glyph_info_t *info,
+ hb_unicode_general_category_t gen_cat)
+{
+ /* Clears top-byte. */
+ info->unicode_props() = (unsigned int) gen_cat | (info->unicode_props() & (0xFF & ~UPROPS_MASK_GEN_CAT));
+}
+
+static inline hb_unicode_general_category_t
+_hb_glyph_info_get_general_category (const hb_glyph_info_t *info)
+{
+ return (hb_unicode_general_category_t) (info->unicode_props() & UPROPS_MASK_GEN_CAT);
+}
+
+static inline bool
+_hb_glyph_info_is_unicode_mark (const hb_glyph_info_t *info)
+{
+ return HB_UNICODE_GENERAL_CATEGORY_IS_MARK (info->unicode_props() & UPROPS_MASK_GEN_CAT);
+}
+static inline void
+_hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info,
+ unsigned int modified_class)
+{
+ if (unlikely (!_hb_glyph_info_is_unicode_mark (info)))
+ return;
+ info->unicode_props() = (modified_class<<8) | (info->unicode_props() & 0xFF);
+}
+static inline unsigned int
+_hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
+}
+#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
+
+static inline bool
+_hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_get_general_category (info) ==
+ HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR;
+}
+static inline void
+_hb_glyph_info_set_unicode_space_fallback_type (hb_glyph_info_t *info, hb_unicode_funcs_t::space_t s)
+{
+ if (unlikely (!_hb_glyph_info_is_unicode_space (info)))
+ return;
+ info->unicode_props() = (((unsigned int) s)<<8) | (info->unicode_props() & 0xFF);
+}
+static inline hb_unicode_funcs_t::space_t
+_hb_glyph_info_get_unicode_space_fallback_type (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_is_unicode_space (info) ?
+ (hb_unicode_funcs_t::space_t) (info->unicode_props()>>8) :
+ hb_unicode_funcs_t::NOT_SPACE;
+}
+
+static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info);
+
+static inline bool
+_hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
+{
+ return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
+ !_hb_glyph_info_ligated (info);
+}
+static inline bool
+_hb_glyph_info_is_default_ignorable_and_not_hidden (const hb_glyph_info_t *info)
+{
+ return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_HIDDEN))
+ == UPROPS_MASK_IGNORABLE) &&
+ !_hb_glyph_info_ligated (info);
+}
+static inline void
+_hb_glyph_info_unhide (hb_glyph_info_t *info)
+{
+ info->unicode_props() &= ~ UPROPS_MASK_HIDDEN;
+}
+
+static inline void
+_hb_glyph_info_set_continuation (hb_glyph_info_t *info)
+{
+ info->unicode_props() |= UPROPS_MASK_CONTINUATION;
+}
+static inline void
+_hb_glyph_info_reset_continuation (hb_glyph_info_t *info)
+{
+ info->unicode_props() &= ~ UPROPS_MASK_CONTINUATION;
+}
+static inline bool
+_hb_glyph_info_is_continuation (const hb_glyph_info_t *info)
+{
+ return info->unicode_props() & UPROPS_MASK_CONTINUATION;
+}
+/* Loop over grapheme. Based on foreach_cluster(). */
+#define foreach_grapheme(buffer, start, end) \
+ for (unsigned int \
+ _count = buffer->len, \
+ start = 0, end = _count ? _hb_next_grapheme (buffer, 0) : 0; \
+ start < _count; \
+ start = end, end = _hb_next_grapheme (buffer, start))
+
+static inline unsigned int
+_hb_next_grapheme (hb_buffer_t *buffer, unsigned int start)
+{
+ hb_glyph_info_t *info = buffer->info;
+ unsigned int count = buffer->len;
+
+ while (++start < count && _hb_glyph_info_is_continuation (&info[start]))
+ ;
+
+ return start;
+}
+
+static inline bool
+_hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_get_general_category (info) ==
+ HB_UNICODE_GENERAL_CATEGORY_FORMAT;
+}
+static inline bool
+_hb_glyph_info_is_zwnj (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWNJ);
+}
+static inline bool
+_hb_glyph_info_is_zwj (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
+}
+static inline bool
+_hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ));
+}
+static inline void
+_hb_glyph_info_flip_joiners (hb_glyph_info_t *info)
+{
+ if (!_hb_glyph_info_is_unicode_format (info))
+ return;
+ info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ;
+}
+
+/* lig_props: aka lig_id / lig_comp
+ *
+ * When a ligature is formed:
+ *
+ * - The ligature glyph and any marks in between all the same newly allocated
+ * lig_id,
+ * - The ligature glyph will get lig_num_comps set to the number of components
+ * - The marks get lig_comp > 0, reflecting which component of the ligature
+ * they were applied to.
+ * - This is used in GPOS to attach marks to the right component of a ligature
+ * in MarkLigPos,
+ * - Note that when marks are ligated together, much of the above is skipped
+ * and the current lig_id reused.
+ *
+ * When a multiple-substitution is done:
+ *
+ * - All resulting glyphs will have lig_id = 0,
+ * - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively.
+ * - This is used in GPOS to attach marks to the first component of a
+ * multiple substitution in MarkBasePos.
+ *
+ * The numbers are also used in GPOS to do mark-to-mark positioning only
+ * to marks that belong to the same component of the same ligature.
+ */
+
+static inline void
+_hb_glyph_info_clear_lig_props (hb_glyph_info_t *info)
+{
+ info->lig_props() = 0;
+}
+
+#define IS_LIG_BASE 0x10
+
+static inline void
+_hb_glyph_info_set_lig_props_for_ligature (hb_glyph_info_t *info,
+ unsigned int lig_id,
+ unsigned int lig_num_comps)
+{
+ info->lig_props() = (lig_id << 5) | IS_LIG_BASE | (lig_num_comps & 0x0F);
+}
+
+static inline void
+_hb_glyph_info_set_lig_props_for_mark (hb_glyph_info_t *info,
+ unsigned int lig_id,
+ unsigned int lig_comp)
+{
+ info->lig_props() = (lig_id << 5) | (lig_comp & 0x0F);
+}
+
+static inline void
+_hb_glyph_info_set_lig_props_for_component (hb_glyph_info_t *info, unsigned int comp)
+{
+ _hb_glyph_info_set_lig_props_for_mark (info, 0, comp);
+}
+
+static inline unsigned int
+_hb_glyph_info_get_lig_id (const hb_glyph_info_t *info)
+{
+ return info->lig_props() >> 5;
+}
+
+static inline bool
+_hb_glyph_info_ligated_internal (const hb_glyph_info_t *info)
+{
+ return !!(info->lig_props() & IS_LIG_BASE);
+}
+
+static inline unsigned int
+_hb_glyph_info_get_lig_comp (const hb_glyph_info_t *info)
+{
+ if (_hb_glyph_info_ligated_internal (info))
+ return 0;
+ else
+ return info->lig_props() & 0x0F;
+}
+
+static inline unsigned int
+_hb_glyph_info_get_lig_num_comps (const hb_glyph_info_t *info)
+{
+ if ((info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE) &&
+ _hb_glyph_info_ligated_internal (info))
+ return info->lig_props() & 0x0F;
+ else
+ return 1;
+}
+
+static inline uint8_t
+_hb_allocate_lig_id (hb_buffer_t *buffer) {
+ uint8_t lig_id = buffer->next_serial () & 0x07;
+ if (unlikely (!lig_id))
+ lig_id = _hb_allocate_lig_id (buffer); /* in case of overflow */
+ return lig_id;
+}
+
+/* glyph_props: */
+
+static inline void
+_hb_glyph_info_set_glyph_props (hb_glyph_info_t *info, unsigned int props)
+{
+ info->glyph_props() = props;
+}
+
+static inline unsigned int
+_hb_glyph_info_get_glyph_props (const hb_glyph_info_t *info)
+{
+ return info->glyph_props();
+}
+
+static inline bool
+_hb_glyph_info_is_base_glyph (const hb_glyph_info_t *info)
+{
+ return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH);
+}
+
+static inline bool
+_hb_glyph_info_is_ligature (const hb_glyph_info_t *info)
+{
+ return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE);
+}
+
+static inline bool
+_hb_glyph_info_is_mark (const hb_glyph_info_t *info)
+{
+ return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK);
+}
+
+static inline bool
+_hb_glyph_info_substituted (const hb_glyph_info_t *info)
+{
+ return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
+}
+
+static inline bool
+_hb_glyph_info_ligated (const hb_glyph_info_t *info)
+{
+ return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATED);
+}
+
+static inline bool
+_hb_glyph_info_multiplied (const hb_glyph_info_t *info)
+{
+ return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
+}
+
+static inline bool
+_hb_glyph_info_ligated_and_didnt_multiply (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_ligated (info) && !_hb_glyph_info_multiplied (info);
+}
+
+static inline void
+_hb_glyph_info_clear_ligated_and_multiplied (hb_glyph_info_t *info)
+{
+ info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
+ HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
+}
+
+static inline void
+_hb_glyph_info_clear_substituted (hb_glyph_info_t *info)
+{
+ info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
+}
+
+static inline void
+_hb_clear_substitution_flags (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font HB_UNUSED,
+ hb_buffer_t *buffer)
+{
+ hb_glyph_info_t *info = buffer->info;
+ unsigned int count = buffer->len;
+ for (unsigned int i = 0; i < count; i++)
+ _hb_glyph_info_clear_substituted (&info[i]);
+}
+
+
+/* Allocation / deallocation. */
+
+static inline void
+_hb_buffer_allocate_unicode_vars (hb_buffer_t *buffer)
+{
+ HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props);
+}
+
+static inline void
+_hb_buffer_deallocate_unicode_vars (hb_buffer_t *buffer)
+{
+ HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props);
+}
+
+static inline void
+_hb_buffer_assert_unicode_vars (hb_buffer_t *buffer)
+{
+ HB_BUFFER_ASSERT_VAR (buffer, unicode_props);
+}
+
+static inline void
+_hb_buffer_allocate_gsubgpos_vars (hb_buffer_t *buffer)
+{
+ HB_BUFFER_ALLOCATE_VAR (buffer, glyph_props);
+ HB_BUFFER_ALLOCATE_VAR (buffer, lig_props);
+ HB_BUFFER_ALLOCATE_VAR (buffer, syllable);
+}
+
+static inline void
+_hb_buffer_deallocate_gsubgpos_vars (hb_buffer_t *buffer)
+{
+ HB_BUFFER_DEALLOCATE_VAR (buffer, syllable);
+ HB_BUFFER_DEALLOCATE_VAR (buffer, lig_props);
+ HB_BUFFER_DEALLOCATE_VAR (buffer, glyph_props);
+}
+
+static inline void
+_hb_buffer_assert_gsubgpos_vars (hb_buffer_t *buffer)
+{
+ HB_BUFFER_ASSERT_VAR (buffer, glyph_props);
+ HB_BUFFER_ASSERT_VAR (buffer, lig_props);
+ HB_BUFFER_ASSERT_VAR (buffer, syllable);
+}
+
+/* Make sure no one directly touches our props... */
+#undef unicode_props0
+#undef unicode_props1
+#undef lig_props
+#undef glyph_props
+
+#endif /* HB_OT_LAYOUT_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-map-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-map-private.hh
deleted file mode 100644
index 97b92cc9a8..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-map-private.hh
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright © 2009,2010 Red Hat, Inc.
- * Copyright © 2010,2011,2012,2013 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_MAP_PRIVATE_HH
-#define HB_OT_MAP_PRIVATE_HH
-
-#include "hb-buffer-private.hh"
-
-
-struct hb_ot_shape_plan_t;
-
-static const hb_tag_t table_tags[2] = {HB_OT_TAG_GSUB, HB_OT_TAG_GPOS};
-
-struct hb_ot_map_t
-{
- friend struct hb_ot_map_builder_t;
-
- public:
-
- struct feature_map_t {
- hb_tag_t tag; /* should be first for our bsearch to work */
- unsigned int index[2]; /* GSUB/GPOS */
- unsigned int stage[2]; /* GSUB/GPOS */
- unsigned int shift;
- hb_mask_t mask;
- hb_mask_t _1_mask; /* mask for value=1, for quick access */
- unsigned int needs_fallback : 1;
- unsigned int auto_zwnj : 1;
- unsigned int auto_zwj : 1;
-
- inline int cmp (const hb_tag_t *tag_) const
- { return *tag_ < tag ? -1 : *tag_ > tag ? 1 : 0; }
- };
-
- struct lookup_map_t {
- unsigned short index;
- unsigned short auto_zwnj : 1;
- unsigned short auto_zwj : 1;
- hb_mask_t mask;
-
- static int cmp (const void *pa, const void *pb)
- {
- const lookup_map_t *a = (const lookup_map_t *) pa;
- const lookup_map_t *b = (const lookup_map_t *) pb;
- return a->index < b->index ? -1 : a->index > b->index ? 1 : 0;
- }
- };
-
- typedef void (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer);
-
- struct stage_map_t {
- unsigned int last_lookup; /* Cumulative */
- pause_func_t pause_func;
- };
-
-
- hb_ot_map_t (void) { memset (this, 0, sizeof (*this)); }
-
- inline hb_mask_t get_global_mask (void) const { return global_mask; }
-
- inline hb_mask_t get_mask (hb_tag_t feature_tag, unsigned int *shift = nullptr) const {
- const feature_map_t *map = features.bsearch (&feature_tag);
- if (shift) *shift = map ? map->shift : 0;
- return map ? map->mask : 0;
- }
-
- inline bool needs_fallback (hb_tag_t feature_tag) const {
- const feature_map_t *map = features.bsearch (&feature_tag);
- return map ? map->needs_fallback : false;
- }
-
- inline hb_mask_t get_1_mask (hb_tag_t feature_tag) const {
- const feature_map_t *map = features.bsearch (&feature_tag);
- return map ? map->_1_mask : 0;
- }
-
- inline unsigned int get_feature_index (unsigned int table_index, hb_tag_t feature_tag) const {
- const feature_map_t *map = features.bsearch (&feature_tag);
- return map ? map->index[table_index] : HB_OT_LAYOUT_NO_FEATURE_INDEX;
- }
-
- inline unsigned int get_feature_stage (unsigned int table_index, hb_tag_t feature_tag) const {
- const feature_map_t *map = features.bsearch (&feature_tag);
- return map ? map->stage[table_index] : (unsigned int) -1;
- }
-
- inline void get_stage_lookups (unsigned int table_index, unsigned int stage,
- const struct lookup_map_t **plookups, unsigned int *lookup_count) const {
- if (unlikely (stage == (unsigned int) -1)) {
- *plookups = nullptr;
- *lookup_count = 0;
- return;
- }
- assert (stage <= stages[table_index].len);
- unsigned int start = stage ? stages[table_index][stage - 1].last_lookup : 0;
- unsigned int end = stage < stages[table_index].len ? stages[table_index][stage].last_lookup : lookups[table_index].len;
- *plookups = end == start ? nullptr : &lookups[table_index][start];
- *lookup_count = end - start;
- }
-
- HB_INTERNAL void collect_lookups (unsigned int table_index, hb_set_t *lookups) const;
- template <typename Proxy>
- HB_INTERNAL inline void apply (const Proxy &proxy,
- const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
- HB_INTERNAL void substitute (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
- HB_INTERNAL void position (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
-
- inline void finish (void) {
- features.finish ();
- for (unsigned int table_index = 0; table_index < 2; table_index++)
- {
- lookups[table_index].finish ();
- stages[table_index].finish ();
- }
- }
-
- public:
- hb_tag_t chosen_script[2];
- bool found_script[2];
-
- private:
-
- hb_mask_t global_mask;
-
- hb_prealloced_array_t<feature_map_t, 8> features;
- hb_prealloced_array_t<lookup_map_t, 32> lookups[2]; /* GSUB/GPOS */
- hb_prealloced_array_t<stage_map_t, 4> stages[2]; /* GSUB/GPOS */
-};
-
-enum hb_ot_map_feature_flags_t {
- F_NONE = 0x0000u,
- F_GLOBAL = 0x0001u, /* Feature applies to all characters; results in no mask allocated for it. */
- F_HAS_FALLBACK = 0x0002u, /* Has fallback implementation, so include mask bit even if feature not found. */
- F_MANUAL_ZWNJ = 0x0004u, /* Don't skip over ZWNJ when matching **context**. */
- F_MANUAL_ZWJ = 0x0008u, /* Don't skip over ZWJ when matching **input**. */
- F_GLOBAL_SEARCH = 0x0010u /* If feature not found in LangSys, look for it in global feature list and pick one. */
-};
-HB_MARK_AS_FLAG_T (hb_ot_map_feature_flags_t);
-/* Macro version for where const is desired. */
-#define F_COMBINE(l,r) (hb_ot_map_feature_flags_t ((unsigned int) (l) | (unsigned int) (r)))
-
-
-struct hb_ot_map_builder_t
-{
- public:
-
- HB_INTERNAL hb_ot_map_builder_t (hb_face_t *face_,
- const hb_segment_properties_t *props_);
-
- HB_INTERNAL void add_feature (hb_tag_t tag, unsigned int value,
- hb_ot_map_feature_flags_t flags);
-
- inline void add_global_bool_feature (hb_tag_t tag)
- { add_feature (tag, 1, F_GLOBAL); }
-
- inline void add_gsub_pause (hb_ot_map_t::pause_func_t pause_func)
- { add_pause (0, pause_func); }
- inline void add_gpos_pause (hb_ot_map_t::pause_func_t pause_func)
- { add_pause (1, pause_func); }
-
- HB_INTERNAL void compile (hb_ot_map_t &m,
- const int *coords,
- unsigned int num_coords);
-
- inline void finish (void) {
- feature_infos.finish ();
- for (unsigned int table_index = 0; table_index < 2; table_index++)
- {
- stages[table_index].finish ();
- }
- }
-
- private:
-
- HB_INTERNAL void add_lookups (hb_ot_map_t &m,
- hb_face_t *face,
- unsigned int table_index,
- unsigned int feature_index,
- unsigned int variations_index,
- hb_mask_t mask,
- bool auto_zwnj = true,
- bool auto_zwj = true);
-
- struct feature_info_t {
- hb_tag_t tag;
- unsigned int seq; /* sequence#, used for stable sorting only */
- unsigned int max_value;
- hb_ot_map_feature_flags_t flags;
- unsigned int default_value; /* for non-global features, what should the unset glyphs take */
- unsigned int stage[2]; /* GSUB/GPOS */
-
- static int cmp (const void *pa, const void *pb)
- {
- const feature_info_t *a = (const feature_info_t *) pa;
- const feature_info_t *b = (const feature_info_t *) pb;
- return (a->tag != b->tag) ? (a->tag < b->tag ? -1 : 1) :
- (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
- }
- };
-
- struct stage_info_t {
- unsigned int index;
- hb_ot_map_t::pause_func_t pause_func;
- };
-
- HB_INTERNAL void add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func);
-
- public:
-
- hb_face_t *face;
- hb_segment_properties_t props;
-
- hb_tag_t chosen_script[2];
- bool found_script[2];
- unsigned int script_index[2], language_index[2];
-
- private:
-
- unsigned int current_stage[2]; /* GSUB/GPOS */
- hb_prealloced_array_t<feature_info_t, 32> feature_infos;
- hb_prealloced_array_t<stage_info_t, 8> stages[2]; /* GSUB/GPOS */
-};
-
-
-
-#endif /* HB_OT_MAP_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-map.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-map.cc
index ea9bde9a66..e4bb4b6366 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-map.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-map.cc
@@ -26,15 +26,19 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-ot-map-private.hh"
+#include "hb.hh"
-#include "hb-ot-layout-private.hh"
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-map.hh"
+#include "hb-ot-shape.hh"
+#include "hb-ot-layout.hh"
void hb_ot_map_t::collect_lookups (unsigned int table_index, hb_set_t *lookups_out) const
{
- for (unsigned int i = 0; i < lookups[table_index].len; i++)
- hb_set_add (lookups_out, lookups[table_index][i].index);
+ for (unsigned int i = 0; i < lookups[table_index].length; i++)
+ lookups_out->add (lookups[table_index][i].index);
}
@@ -43,6 +47,10 @@ hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
{
memset (this, 0, sizeof (*this));
+ feature_infos.init ();
+ for (unsigned int table_index = 0; table_index < 2; table_index++)
+ stages[table_index].init ();
+
face = face_;
props = *props_;
@@ -50,27 +58,35 @@ hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
/* Fetch script/language indices for GSUB/GPOS. We need these later to skip
* features not available in either table and not waste precious bits for them. */
- hb_tag_t script_tags[3] = {HB_TAG_NONE, HB_TAG_NONE, HB_TAG_NONE};
- hb_tag_t language_tag;
+ unsigned int script_count = HB_OT_MAX_TAGS_PER_SCRIPT;
+ unsigned int language_count = HB_OT_MAX_TAGS_PER_LANGUAGE;
+ hb_tag_t script_tags[HB_OT_MAX_TAGS_PER_SCRIPT];
+ hb_tag_t language_tags[HB_OT_MAX_TAGS_PER_LANGUAGE];
- hb_ot_tags_from_script (props.script, &script_tags[0], &script_tags[1]);
- language_tag = hb_ot_tag_from_language (props.language);
+ hb_ot_tags_from_script_and_language (props.script, props.language, &script_count, script_tags, &language_count, language_tags);
for (unsigned int table_index = 0; table_index < 2; table_index++) {
hb_tag_t table_tag = table_tags[table_index];
- found_script[table_index] = (bool) hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &chosen_script[table_index]);
- hb_ot_layout_script_find_language (face, table_tag, script_index[table_index], language_tag, &language_index[table_index]);
+ found_script[table_index] = (bool) hb_ot_layout_table_select_script (face, table_tag, script_count, script_tags, &script_index[table_index], &chosen_script[table_index]);
+ hb_ot_layout_script_select_language (face, table_tag, script_index[table_index], language_count, language_tags, &language_index[table_index]);
}
}
-void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value,
- hb_ot_map_feature_flags_t flags)
+hb_ot_map_builder_t::~hb_ot_map_builder_t ()
+{
+ feature_infos.fini ();
+ for (unsigned int table_index = 0; table_index < 2; table_index++)
+ stages[table_index].fini ();
+}
+
+void hb_ot_map_builder_t::add_feature (hb_tag_t tag,
+ hb_ot_map_feature_flags_t flags,
+ unsigned int value)
{
- feature_info_t *info = feature_infos.push();
- if (unlikely (!info)) return;
if (unlikely (!tag)) return;
+ feature_info_t *info = feature_infos.push();
info->tag = tag;
- info->seq = feature_infos.len;
+ info->seq = feature_infos.length;
info->max_value = value;
info->flags = flags;
info->default_value = (flags & F_GLOBAL) ? value : 0;
@@ -80,13 +96,13 @@ void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value,
void
hb_ot_map_builder_t::add_lookups (hb_ot_map_t &m,
- hb_face_t *face,
unsigned int table_index,
unsigned int feature_index,
unsigned int variations_index,
hb_mask_t mask,
bool auto_zwnj,
- bool auto_zwj)
+ bool auto_zwj,
+ bool random)
{
unsigned int lookup_indices[32];
unsigned int offset, len;
@@ -109,12 +125,11 @@ hb_ot_map_builder_t::add_lookups (hb_ot_map_t &m,
if (lookup_indices[i] >= table_lookup_count)
continue;
hb_ot_map_t::lookup_map_t *lookup = m.lookups[table_index].push ();
- if (unlikely (!lookup))
- return;
lookup->mask = mask;
lookup->index = lookup_indices[i];
lookup->auto_zwnj = auto_zwnj;
lookup->auto_zwj = auto_zwj;
+ lookup->random = random;
}
offset += len;
@@ -125,22 +140,19 @@ hb_ot_map_builder_t::add_lookups (hb_ot_map_t &m,
void hb_ot_map_builder_t::add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func)
{
stage_info_t *s = stages[table_index].push ();
- if (likely (s)) {
- s->index = current_stage[table_index];
- s->pause_func = pause_func;
- }
+ s->index = current_stage[table_index];
+ s->pause_func = pause_func;
current_stage[table_index]++;
}
void
-hb_ot_map_builder_t::compile (hb_ot_map_t &m,
- const int *coords,
- unsigned int num_coords)
+hb_ot_map_builder_t::compile (hb_ot_map_t &m,
+ const hb_ot_shape_plan_key_t &key)
{
static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), "");
unsigned int global_bit_mask = HB_GLYPH_FLAG_DEFINED + 1;
- unsigned int global_bit_shift = _hb_popcount32 (HB_GLYPH_FLAG_DEFINED);
+ unsigned int global_bit_shift = hb_popcount (HB_GLYPH_FLAG_DEFINED);
m.global_mask = global_bit_mask;
@@ -165,14 +177,12 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
&required_feature_tag[table_index]);
}
- if (!feature_infos.len)
- return;
-
/* Sort features and merge duplicates */
+ if (feature_infos.length)
{
feature_infos.qsort ();
unsigned int j = 0;
- for (unsigned int i = 1; i < feature_infos.len; i++)
+ for (unsigned int i = 1; i < feature_infos.length; i++)
if (feature_infos[i].tag != feature_infos[j].tag)
feature_infos[++j] = feature_infos[i];
else {
@@ -181,13 +191,14 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
feature_infos[j].max_value = feature_infos[i].max_value;
feature_infos[j].default_value = feature_infos[i].default_value;
} else {
- feature_infos[j].flags &= ~F_GLOBAL;
- feature_infos[j].max_value = MAX (feature_infos[j].max_value, feature_infos[i].max_value);
+ if (feature_infos[j].flags & F_GLOBAL)
+ feature_infos[j].flags ^= F_GLOBAL;
+ feature_infos[j].max_value = hb_max (feature_infos[j].max_value, feature_infos[i].max_value);
/* Inherit default_value from j */
}
feature_infos[j].flags |= (feature_infos[i].flags & F_HAS_FALLBACK);
- feature_infos[j].stage[0] = MIN (feature_infos[j].stage[0], feature_infos[i].stage[0]);
- feature_infos[j].stage[1] = MIN (feature_infos[j].stage[1], feature_infos[i].stage[1]);
+ feature_infos[j].stage[0] = hb_min (feature_infos[j].stage[0], feature_infos[i].stage[0]);
+ feature_infos[j].stage[1] = hb_min (feature_infos[j].stage[1], feature_infos[i].stage[1]);
}
feature_infos.shrink (j + 1);
}
@@ -196,7 +207,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
/* Allocate bits now */
unsigned int next_bit = global_bit_shift + 1;
- for (unsigned int i = 0; i < feature_infos.len; i++)
+ for (unsigned int i = 0; i < feature_infos.length; i++)
{
const feature_info_t *info = &feature_infos[i];
@@ -206,35 +217,35 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
/* Uses the global bit */
bits_needed = 0;
else
- /* Limit to 8 bits per feature. */
- bits_needed = MIN(8u, _hb_bit_storage (info->max_value));
+ /* Limit bits per feature. */
+ bits_needed = hb_min (HB_OT_MAP_MAX_BITS, hb_bit_storage (info->max_value));
if (!info->max_value || next_bit + bits_needed > 8 * sizeof (hb_mask_t))
continue; /* Feature disabled, or not enough bits. */
- hb_bool_t found = false;
+ bool found = false;
unsigned int feature_index[2];
for (unsigned int table_index = 0; table_index < 2; table_index++)
{
if (required_feature_tag[table_index] == info->tag)
required_feature_stage[table_index] = info->stage[table_index];
- found |= hb_ot_layout_language_find_feature (face,
- table_tags[table_index],
- script_index[table_index],
- language_index[table_index],
- info->tag,
- &feature_index[table_index]);
+ found |= (bool) hb_ot_layout_language_find_feature (face,
+ table_tags[table_index],
+ script_index[table_index],
+ language_index[table_index],
+ info->tag,
+ &feature_index[table_index]);
}
if (!found && (info->flags & F_GLOBAL_SEARCH))
{
for (unsigned int table_index = 0; table_index < 2; table_index++)
{
- found |= hb_ot_layout_table_find_feature (face,
- table_tags[table_index],
- info->tag,
- &feature_index[table_index]);
+ found |= (bool) hb_ot_layout_table_find_feature (face,
+ table_tags[table_index],
+ info->tag,
+ &feature_index[table_index]);
}
}
if (!found && !(info->flags & F_HAS_FALLBACK))
@@ -242,8 +253,6 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
hb_ot_map_t::feature_map_t *map = m.features.push ();
- if (unlikely (!map))
- break;
map->tag = info->tag;
map->index[0] = feature_index[0];
@@ -252,6 +261,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
map->stage[1] = info->stage[1];
map->auto_zwnj = !(info->flags & F_MANUAL_ZWNJ);
map->auto_zwj = !(info->flags & F_MANUAL_ZWJ);
+ map->random = !!(info->flags & F_RANDOM);
if ((info->flags & F_GLOBAL) && info->max_value == 1) {
/* Uses the global bit */
map->shift = global_bit_shift;
@@ -276,40 +286,34 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
{
/* Collect lookup indices for features */
- unsigned int variations_index;
- hb_ot_layout_table_find_feature_variations (face,
- table_tags[table_index],
- coords,
- num_coords,
- &variations_index);
-
unsigned int stage_index = 0;
unsigned int last_num_lookups = 0;
for (unsigned stage = 0; stage < current_stage[table_index]; stage++)
{
if (required_feature_index[table_index] != HB_OT_LAYOUT_NO_FEATURE_INDEX &&
required_feature_stage[table_index] == stage)
- add_lookups (m, face, table_index,
+ add_lookups (m, table_index,
required_feature_index[table_index],
- variations_index,
+ key.variations_index[table_index],
global_bit_mask);
- for (unsigned i = 0; i < m.features.len; i++)
- if (m.features[i].stage[table_index] == stage)
- add_lookups (m, face, table_index,
+ for (unsigned i = 0; i < m.features.length; i++)
+ if (m.features[i].stage[table_index] == stage)
+ add_lookups (m, table_index,
m.features[i].index[table_index],
- variations_index,
+ key.variations_index[table_index],
m.features[i].mask,
m.features[i].auto_zwnj,
- m.features[i].auto_zwj);
+ m.features[i].auto_zwj,
+ m.features[i].random);
/* Sort lookups and merge duplicates */
- if (last_num_lookups < m.lookups[table_index].len)
+ if (last_num_lookups < m.lookups[table_index].length)
{
- m.lookups[table_index].qsort (last_num_lookups, m.lookups[table_index].len);
+ m.lookups[table_index].qsort (last_num_lookups, m.lookups[table_index].length);
unsigned int j = last_num_lookups;
- for (unsigned int i = j + 1; i < m.lookups[table_index].len; i++)
+ for (unsigned int i = j + 1; i < m.lookups[table_index].length; i++)
if (m.lookups[table_index][i].index != m.lookups[table_index][j].index)
m.lookups[table_index][++j] = m.lookups[table_index][i];
else
@@ -321,17 +325,18 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
m.lookups[table_index].shrink (j + 1);
}
- last_num_lookups = m.lookups[table_index].len;
+ last_num_lookups = m.lookups[table_index].length;
- if (stage_index < stages[table_index].len && stages[table_index][stage_index].index == stage) {
+ if (stage_index < stages[table_index].length && stages[table_index][stage_index].index == stage) {
hb_ot_map_t::stage_map_t *stage_map = m.stages[table_index].push ();
- if (likely (stage_map)) {
- stage_map->last_lookup = last_num_lookups;
- stage_map->pause_func = stages[table_index][stage_index].pause_func;
- }
+ stage_map->last_lookup = last_num_lookups;
+ stage_map->pause_func = stages[table_index][stage_index].pause_func;
stage_index++;
}
}
}
}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-map.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-map.hh
new file mode 100644
index 0000000000..0a4827d745
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-map.hh
@@ -0,0 +1,284 @@
+/*
+ * Copyright © 2009,2010 Red Hat, Inc.
+ * Copyright © 2010,2011,2012,2013 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_MAP_HH
+#define HB_OT_MAP_HH
+
+#include "hb-buffer.hh"
+
+
+#define HB_OT_MAP_MAX_BITS 8u
+#define HB_OT_MAP_MAX_VALUE ((1u << HB_OT_MAP_MAX_BITS) - 1u)
+
+struct hb_ot_shape_plan_t;
+
+static const hb_tag_t table_tags[2] = {HB_OT_TAG_GSUB, HB_OT_TAG_GPOS};
+
+struct hb_ot_map_t
+{
+ friend struct hb_ot_map_builder_t;
+
+ public:
+
+ struct feature_map_t {
+ hb_tag_t tag; /* should be first for our bsearch to work */
+ unsigned int index[2]; /* GSUB/GPOS */
+ unsigned int stage[2]; /* GSUB/GPOS */
+ unsigned int shift;
+ hb_mask_t mask;
+ hb_mask_t _1_mask; /* mask for value=1, for quick access */
+ unsigned int needs_fallback : 1;
+ unsigned int auto_zwnj : 1;
+ unsigned int auto_zwj : 1;
+ unsigned int random : 1;
+
+ int cmp (const hb_tag_t tag_) const
+ { return tag_ < tag ? -1 : tag_ > tag ? 1 : 0; }
+ };
+
+ struct lookup_map_t {
+ unsigned short index;
+ unsigned short auto_zwnj : 1;
+ unsigned short auto_zwj : 1;
+ unsigned short random : 1;
+ hb_mask_t mask;
+
+ HB_INTERNAL static int cmp (const void *pa, const void *pb)
+ {
+ const lookup_map_t *a = (const lookup_map_t *) pa;
+ const lookup_map_t *b = (const lookup_map_t *) pb;
+ return a->index < b->index ? -1 : a->index > b->index ? 1 : 0;
+ }
+ };
+
+ typedef void (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer);
+
+ struct stage_map_t {
+ unsigned int last_lookup; /* Cumulative */
+ pause_func_t pause_func;
+ };
+
+ void init ()
+ {
+ memset (this, 0, sizeof (*this));
+
+ features.init ();
+ for (unsigned int table_index = 0; table_index < 2; table_index++)
+ {
+ lookups[table_index].init ();
+ stages[table_index].init ();
+ }
+ }
+ void fini ()
+ {
+ features.fini ();
+ for (unsigned int table_index = 0; table_index < 2; table_index++)
+ {
+ lookups[table_index].fini ();
+ stages[table_index].fini ();
+ }
+ }
+
+ hb_mask_t get_global_mask () const { return global_mask; }
+
+ hb_mask_t get_mask (hb_tag_t feature_tag, unsigned int *shift = nullptr) const
+ {
+ const feature_map_t *map = features.bsearch (feature_tag);
+ if (shift) *shift = map ? map->shift : 0;
+ return map ? map->mask : 0;
+ }
+
+ bool needs_fallback (hb_tag_t feature_tag) const
+ {
+ const feature_map_t *map = features.bsearch (feature_tag);
+ return map ? map->needs_fallback : false;
+ }
+
+ hb_mask_t get_1_mask (hb_tag_t feature_tag) const
+ {
+ const feature_map_t *map = features.bsearch (feature_tag);
+ return map ? map->_1_mask : 0;
+ }
+
+ unsigned int get_feature_index (unsigned int table_index, hb_tag_t feature_tag) const
+ {
+ const feature_map_t *map = features.bsearch (feature_tag);
+ return map ? map->index[table_index] : HB_OT_LAYOUT_NO_FEATURE_INDEX;
+ }
+
+ unsigned int get_feature_stage (unsigned int table_index, hb_tag_t feature_tag) const
+ {
+ const feature_map_t *map = features.bsearch (feature_tag);
+ return map ? map->stage[table_index] : (unsigned int) -1;
+ }
+
+ void get_stage_lookups (unsigned int table_index, unsigned int stage,
+ const struct lookup_map_t **plookups, unsigned int *lookup_count) const
+ {
+ if (unlikely (stage == (unsigned int) -1)) {
+ *plookups = nullptr;
+ *lookup_count = 0;
+ return;
+ }
+ assert (stage <= stages[table_index].length);
+ unsigned int start = stage ? stages[table_index][stage - 1].last_lookup : 0;
+ unsigned int end = stage < stages[table_index].length ? stages[table_index][stage].last_lookup : lookups[table_index].length;
+ *plookups = end == start ? nullptr : &lookups[table_index][start];
+ *lookup_count = end - start;
+ }
+
+ HB_INTERNAL void collect_lookups (unsigned int table_index, hb_set_t *lookups) const;
+ template <typename Proxy>
+ HB_INTERNAL void apply (const Proxy &proxy,
+ const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
+ HB_INTERNAL void substitute (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
+ HB_INTERNAL void position (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
+
+ public:
+ hb_tag_t chosen_script[2];
+ bool found_script[2];
+
+ private:
+
+ hb_mask_t global_mask;
+
+ hb_sorted_vector_t<feature_map_t> features;
+ hb_vector_t<lookup_map_t> lookups[2]; /* GSUB/GPOS */
+ hb_vector_t<stage_map_t> stages[2]; /* GSUB/GPOS */
+};
+
+enum hb_ot_map_feature_flags_t
+{
+ F_NONE = 0x0000u,
+ F_GLOBAL = 0x0001u, /* Feature applies to all characters; results in no mask allocated for it. */
+ F_HAS_FALLBACK = 0x0002u, /* Has fallback implementation, so include mask bit even if feature not found. */
+ F_MANUAL_ZWNJ = 0x0004u, /* Don't skip over ZWNJ when matching **context**. */
+ F_MANUAL_ZWJ = 0x0008u, /* Don't skip over ZWJ when matching **input**. */
+ F_MANUAL_JOINERS = F_MANUAL_ZWNJ | F_MANUAL_ZWJ,
+ F_GLOBAL_MANUAL_JOINERS= F_GLOBAL | F_MANUAL_JOINERS,
+ F_GLOBAL_HAS_FALLBACK = F_GLOBAL | F_HAS_FALLBACK,
+ F_GLOBAL_SEARCH = 0x0010u, /* If feature not found in LangSys, look for it in global feature list and pick one. */
+ F_RANDOM = 0x0020u /* Randomly select a glyph from an AlternateSubstFormat1 subtable. */
+};
+HB_MARK_AS_FLAG_T (hb_ot_map_feature_flags_t);
+
+
+struct hb_ot_map_feature_t
+{
+ hb_tag_t tag;
+ hb_ot_map_feature_flags_t flags;
+};
+
+struct hb_ot_shape_plan_key_t;
+
+struct hb_ot_map_builder_t
+{
+ public:
+
+ HB_INTERNAL hb_ot_map_builder_t (hb_face_t *face_,
+ const hb_segment_properties_t *props_);
+
+ HB_INTERNAL ~hb_ot_map_builder_t ();
+
+ HB_INTERNAL void add_feature (hb_tag_t tag,
+ hb_ot_map_feature_flags_t flags=F_NONE,
+ unsigned int value=1);
+
+ void add_feature (const hb_ot_map_feature_t &feat)
+ { add_feature (feat.tag, feat.flags); }
+
+ void enable_feature (hb_tag_t tag,
+ hb_ot_map_feature_flags_t flags=F_NONE,
+ unsigned int value=1)
+ { add_feature (tag, F_GLOBAL | flags, value); }
+
+ void disable_feature (hb_tag_t tag)
+ { add_feature (tag, F_GLOBAL, 0); }
+
+ void add_gsub_pause (hb_ot_map_t::pause_func_t pause_func)
+ { add_pause (0, pause_func); }
+ void add_gpos_pause (hb_ot_map_t::pause_func_t pause_func)
+ { add_pause (1, pause_func); }
+
+ HB_INTERNAL void compile (hb_ot_map_t &m,
+ const hb_ot_shape_plan_key_t &key);
+
+ private:
+
+ HB_INTERNAL void add_lookups (hb_ot_map_t &m,
+ unsigned int table_index,
+ unsigned int feature_index,
+ unsigned int variations_index,
+ hb_mask_t mask,
+ bool auto_zwnj = true,
+ bool auto_zwj = true,
+ bool random = false);
+
+ struct feature_info_t {
+ hb_tag_t tag;
+ unsigned int seq; /* sequence#, used for stable sorting only */
+ unsigned int max_value;
+ hb_ot_map_feature_flags_t flags;
+ unsigned int default_value; /* for non-global features, what should the unset glyphs take */
+ unsigned int stage[2]; /* GSUB/GPOS */
+
+ HB_INTERNAL static int cmp (const void *pa, const void *pb)
+ {
+ const feature_info_t *a = (const feature_info_t *) pa;
+ const feature_info_t *b = (const feature_info_t *) pb;
+ return (a->tag != b->tag) ? (a->tag < b->tag ? -1 : 1) :
+ (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
+ }
+ };
+
+ struct stage_info_t {
+ unsigned int index;
+ hb_ot_map_t::pause_func_t pause_func;
+ };
+
+ HB_INTERNAL void add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func);
+
+ public:
+
+ hb_face_t *face;
+ hb_segment_properties_t props;
+
+ hb_tag_t chosen_script[2];
+ bool found_script[2];
+ unsigned int script_index[2], language_index[2];
+
+ private:
+
+ unsigned int current_stage[2]; /* GSUB/GPOS */
+ hb_vector_t<feature_info_t> feature_infos;
+ hb_vector_t<stage_info_t> stages[2]; /* GSUB/GPOS */
+};
+
+
+
+#endif /* HB_OT_MAP_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-math-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-math-table.hh
index 7dc3283a28..7529e0c080 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-math-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-math-table.hh
@@ -27,8 +27,8 @@
#ifndef HB_OT_MATH_TABLE_HH
#define HB_OT_MATH_TABLE_HH
-#include "hb-open-type-private.hh"
-#include "hb-ot-layout-common-private.hh"
+#include "hb-open-type.hh"
+#include "hb-ot-layout-common.hh"
#include "hb-ot-math.h"
namespace OT {
@@ -36,21 +36,21 @@ namespace OT {
struct MathValueRecord
{
- inline hb_position_t get_x_value (hb_font_t *font, const void *base) const
+ hb_position_t get_x_value (hb_font_t *font, const void *base) const
{ return font->em_scale_x (value) + (base+deviceTable).get_x_delta (font); }
- inline hb_position_t get_y_value (hb_font_t *font, const void *base) const
+ hb_position_t get_y_value (hb_font_t *font, const void *base) const
{ return font->em_scale_y (value) + (base+deviceTable).get_y_delta (font); }
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) && deviceTable.sanitize (c, base));
}
protected:
- INT16 value; /* The X or Y value in design units */
+ HBINT16 value; /* The X or Y value in design units */
OffsetTo<Device> deviceTable; /* Offset to the device table - from the
- * beginning of parent table. May be nullptr.
+ * beginning of parent table. May be NULL.
* Suggested format for device table is 1. */
public:
@@ -59,7 +59,7 @@ struct MathValueRecord
struct MathConstants
{
- inline bool sanitize_math_value_records (hb_sanitize_context_t *c) const
+ bool sanitize_math_value_records (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
@@ -71,13 +71,13 @@ struct MathConstants
return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && sanitize_math_value_records(c));
+ return_trace (c->check_struct (this) && sanitize_math_value_records (c));
}
- inline hb_position_t get_value (hb_ot_math_constant_t constant,
+ hb_position_t get_value (hb_ot_math_constant_t constant,
hb_font_t *font) const
{
switch (constant) {
@@ -94,7 +94,7 @@ struct MathConstants
case HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE:
case HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP:
case HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT:
- return mathValueRecords[constant - HB_OT_MATH_CONSTANT_MATH_LEADING].get_x_value(font, this);
+ return mathValueRecords[constant - HB_OT_MATH_CONSTANT_MATH_LEADING].get_x_value (font, this);
case HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT:
case HB_OT_MATH_CONSTANT_AXIS_HEIGHT:
@@ -143,7 +143,7 @@ struct MathConstants
case HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP:
case HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN:
case HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN:
- return mathValueRecords[constant - HB_OT_MATH_CONSTANT_MATH_LEADING].get_y_value(font, this);
+ return mathValueRecords[constant - HB_OT_MATH_CONSTANT_MATH_LEADING].get_y_value (font, this);
case HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT:
return radicalDegreeBottomRaisePercent;
@@ -154,10 +154,10 @@ struct MathConstants
}
protected:
- INT16 percentScaleDown[2];
- UINT16 minHeight[2];
+ HBINT16 percentScaleDown[2];
+ HBUINT16 minHeight[2];
MathValueRecord mathValueRecords[51];
- INT16 radicalDegreeBottomRaisePercent;
+ HBINT16 radicalDegreeBottomRaisePercent;
public:
DEFINE_SIZE_STATIC (214);
@@ -165,7 +165,7 @@ struct MathConstants
struct MathItalicsCorrectionInfo
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -173,8 +173,8 @@ struct MathItalicsCorrectionInfo
italicsCorrection.sanitize (c, this));
}
- inline hb_position_t get_value (hb_codepoint_t glyph,
- hb_font_t *font) const
+ hb_position_t get_value (hb_codepoint_t glyph,
+ hb_font_t *font) const
{
unsigned int index = (this+coverage).get_coverage (glyph);
return italicsCorrection[index].get_x_value (font, this);
@@ -196,7 +196,7 @@ struct MathItalicsCorrectionInfo
struct MathTopAccentAttachment
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -204,13 +204,13 @@ struct MathTopAccentAttachment
topAccentAttachment.sanitize (c, this));
}
- inline hb_position_t get_value (hb_codepoint_t glyph,
- hb_font_t *font) const
+ hb_position_t get_value (hb_codepoint_t glyph,
+ hb_font_t *font) const
{
unsigned int index = (this+topAccentCoverage).get_coverage (glyph);
if (index == NOT_COVERED)
return font->get_glyph_h_advance (glyph) / 2;
- return topAccentAttachment[index].get_x_value(font, this);
+ return topAccentAttachment[index].get_x_value (font, this);
}
protected:
@@ -229,29 +229,27 @@ struct MathTopAccentAttachment
struct MathKern
{
- inline bool sanitize_math_value_records (hb_sanitize_context_t *c) const
+ bool sanitize_math_value_records (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
unsigned int count = 2 * heightCount + 1;
for (unsigned int i = 0; i < count; i++)
- if (!mathValueRecords[i].sanitize (c, this)) return_trace (false);
+ if (!mathValueRecordsZ.arrayZ[i].sanitize (c, this)) return_trace (false);
return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
- c->check_array (mathValueRecords,
- mathValueRecords[0].static_size,
- 2 * heightCount + 1) &&
+ c->check_array (mathValueRecordsZ.arrayZ, 2 * heightCount + 1) &&
sanitize_math_value_records (c));
}
- inline hb_position_t get_value (hb_position_t correction_height, hb_font_t *font) const
+ hb_position_t get_value (hb_position_t correction_height, hb_font_t *font) const
{
- const MathValueRecord* correctionHeight = mathValueRecords;
- const MathValueRecord* kernValue = mathValueRecords + heightCount;
+ const MathValueRecord* correctionHeight = mathValueRecordsZ.arrayZ;
+ const MathValueRecord* kernValue = mathValueRecordsZ.arrayZ + heightCount;
int sign = font->y_scale < 0 ? -1 : +1;
/* The description of the MathKern table is a ambiguous, but interpreting
@@ -267,7 +265,7 @@ struct MathKern
while (count > 0)
{
unsigned int half = count / 2;
- hb_position_t height = correctionHeight[i + half].get_y_value(font, this);
+ hb_position_t height = correctionHeight[i + half].get_y_value (font, this);
if (sign * height < sign * correction_height)
{
i += half + 1;
@@ -275,27 +273,28 @@ struct MathKern
} else
count = half;
}
- return kernValue[i].get_x_value(font, this);
+ return kernValue[i].get_x_value (font, this);
}
protected:
- UINT16 heightCount;
- MathValueRecord mathValueRecords[VAR]; /* Array of correction heights at
- * which the kern value changes.
- * Sorted by the height value in
- * design units (heightCount entries),
- * Followed by:
- * Array of kern values corresponding
- * to heights. (heightCount+1 entries).
- */
+ HBUINT16 heightCount;
+ UnsizedArrayOf<MathValueRecord>
+ mathValueRecordsZ; /* Array of correction heights at
+ * which the kern value changes.
+ * Sorted by the height value in
+ * design units (heightCount entries),
+ * Followed by:
+ * Array of kern values corresponding
+ * to heights. (heightCount+1 entries).
+ */
public:
- DEFINE_SIZE_ARRAY (2, mathValueRecords);
+ DEFINE_SIZE_ARRAY (2, mathValueRecordsZ);
};
struct MathKernInfoRecord
{
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
{
TRACE_SANITIZE (this);
@@ -307,10 +306,10 @@ struct MathKernInfoRecord
return_trace (true);
}
- inline hb_position_t get_kerning (hb_ot_math_kern_t kern,
- hb_position_t correction_height,
- hb_font_t *font,
- const void *base) const
+ hb_position_t get_kerning (hb_ot_math_kern_t kern,
+ hb_position_t correction_height,
+ hb_font_t *font,
+ const void *base) const
{
unsigned int idx = kern;
if (unlikely (idx >= ARRAY_LENGTH (mathKern))) return 0;
@@ -319,7 +318,7 @@ struct MathKernInfoRecord
protected:
/* Offset to MathKern table for each corner -
- * from the beginning of MathKernInfo table. May be nullptr. */
+ * from the beginning of MathKernInfo table. May be NULL. */
OffsetTo<MathKern> mathKern[4];
public:
@@ -328,7 +327,7 @@ struct MathKernInfoRecord
struct MathKernInfo
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
@@ -336,10 +335,10 @@ struct MathKernInfo
mathKernInfoRecords.sanitize (c, this));
}
- inline hb_position_t get_kerning (hb_codepoint_t glyph,
- hb_ot_math_kern_t kern,
- hb_position_t correction_height,
- hb_font_t *font) const
+ hb_position_t get_kerning (hb_codepoint_t glyph,
+ hb_ot_math_kern_t kern,
+ hb_position_t correction_height,
+ hb_font_t *font) const
{
unsigned int index = (this+mathKernCoverage).get_coverage (glyph);
return mathKernInfoRecords[index].get_kerning (kern, correction_height, font, this);
@@ -362,31 +361,31 @@ struct MathKernInfo
struct MathGlyphInfo
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
mathItalicsCorrectionInfo.sanitize (c, this) &&
mathTopAccentAttachment.sanitize (c, this) &&
extendedShapeCoverage.sanitize (c, this) &&
- mathKernInfo.sanitize(c, this));
+ mathKernInfo.sanitize (c, this));
}
- inline hb_position_t
+ hb_position_t
get_italics_correction (hb_codepoint_t glyph, hb_font_t *font) const
{ return (this+mathItalicsCorrectionInfo).get_value (glyph, font); }
- inline hb_position_t
+ hb_position_t
get_top_accent_attachment (hb_codepoint_t glyph, hb_font_t *font) const
{ return (this+mathTopAccentAttachment).get_value (glyph, font); }
- inline bool is_extended_shape (hb_codepoint_t glyph) const
+ bool is_extended_shape (hb_codepoint_t glyph) const
{ return (this+extendedShapeCoverage).get_coverage (glyph) != NOT_COVERED; }
- inline hb_position_t get_kerning (hb_codepoint_t glyph,
- hb_ot_math_kern_t kern,
- hb_position_t correction_height,
- hb_font_t *font) const
+ hb_position_t get_kerning (hb_codepoint_t glyph,
+ hb_ot_math_kern_t kern,
+ hb_position_t correction_height,
+ hb_font_t *font) const
{ return (this+mathKernInfo).get_kerning (glyph, kern, correction_height, font); }
protected:
@@ -402,7 +401,7 @@ struct MathGlyphInfo
* from the beginning of MathGlyphInfo table. When the left or right glyph of
* a box is an extended shape variant, the (ink) box (and not the default
* position defined by values in MathConstants table) should be used for
- * vertical positioning purposes. May be nullptr.. */
+ * vertical positioning purposes. May be NULL.. */
OffsetTo<Coverage> extendedShapeCoverage;
/* Offset to MathKernInfo table -
@@ -417,23 +416,23 @@ struct MathGlyphVariantRecord
{
friend struct MathGlyphConstruction;
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
protected:
- GlyphID variantGlyph; /* Glyph ID for the variant. */
- UINT16 advanceMeasurement; /* Advance width/height, in design units, of the
- * variant, in the direction of requested
- * glyph extension. */
+ HBGlyphID variantGlyph; /* Glyph ID for the variant. */
+ HBUINT16 advanceMeasurement; /* Advance width/height, in design units, of the
+ * variant, in the direction of requested
+ * glyph extension. */
public:
DEFINE_SIZE_STATIC (4);
};
-struct PartFlags : UINT16
+struct PartFlags : HBUINT16
{
enum Flags {
Extender = 0x0001u, /* If set, the part can be skipped or repeated. */
@@ -447,23 +446,23 @@ struct PartFlags : UINT16
struct MathGlyphPartRecord
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
- inline void extract (hb_ot_math_glyph_part_t &out,
- int scale,
- hb_font_t *font) const
+ void extract (hb_ot_math_glyph_part_t &out,
+ int64_t mult,
+ hb_font_t *font) const
{
out.glyph = glyph;
- out.start_connector_length = font->em_scale (startConnectorLength, scale);
- out.end_connector_length = font->em_scale (endConnectorLength, scale);
- out.full_advance = font->em_scale (fullAdvance, scale);
+ out.start_connector_length = font->em_mult (startConnectorLength, mult);
+ out.end_connector_length = font->em_mult (endConnectorLength, mult);
+ out.full_advance = font->em_mult (fullAdvance, mult);
- static_assert ((unsigned int) HB_MATH_GLYPH_PART_FLAG_EXTENDER ==
+ static_assert ((unsigned int) HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER ==
(unsigned int) PartFlags::Extender, "");
out.flags = (hb_ot_math_glyph_part_flags_t)
@@ -472,16 +471,16 @@ struct MathGlyphPartRecord
}
protected:
- GlyphID glyph; /* Glyph ID for the part. */
- UINT16 startConnectorLength; /* Advance width/ height of the straight bar
+ HBGlyphID glyph; /* Glyph ID for the part. */
+ HBUINT16 startConnectorLength; /* Advance width/ height of the straight bar
* connector material, in design units, is at
* the beginning of the glyph, in the
* direction of the extension. */
- UINT16 endConnectorLength; /* Advance width/ height of the straight bar
+ HBUINT16 endConnectorLength; /* Advance width/ height of the straight bar
* connector material, in design units, is at
* the end of the glyph, in the direction of
* the extension. */
- UINT16 fullAdvance; /* Full advance width/height for this part,
+ HBUINT16 fullAdvance; /* Full advance width/height for this part,
* in the direction of the extension.
* In design units. */
PartFlags partFlags; /* Part qualifiers. */
@@ -492,29 +491,28 @@ struct MathGlyphPartRecord
struct MathGlyphAssembly
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
- italicsCorrection.sanitize(c, this) &&
- partRecords.sanitize(c));
+ italicsCorrection.sanitize (c, this) &&
+ partRecords.sanitize (c));
}
- inline unsigned int get_parts (hb_direction_t direction,
- hb_font_t *font,
- unsigned int start_offset,
- unsigned int *parts_count, /* IN/OUT */
- hb_ot_math_glyph_part_t *parts /* OUT */,
- hb_position_t *italics_correction /* OUT */) const
+ unsigned int get_parts (hb_direction_t direction,
+ hb_font_t *font,
+ unsigned int start_offset,
+ unsigned int *parts_count, /* IN/OUT */
+ hb_ot_math_glyph_part_t *parts /* OUT */,
+ hb_position_t *italics_correction /* OUT */) const
{
if (parts_count)
{
- int scale = font->dir_scale (direction);
- const MathGlyphPartRecord *arr =
- partRecords.sub_array (start_offset, parts_count);
- unsigned int count = *parts_count;
+ int64_t mult = font->dir_mult (direction);
+ hb_array_t<const MathGlyphPartRecord> arr = partRecords.sub_array (start_offset, parts_count);
+ unsigned int count = arr.length;
for (unsigned int i = 0; i < count; i++)
- arr[i].extract (parts[i], scale, font);
+ arr[i].extract (parts[i], mult, font);
}
if (italics_correction)
@@ -537,33 +535,31 @@ struct MathGlyphAssembly
struct MathGlyphConstruction
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
- glyphAssembly.sanitize(c, this) &&
- mathGlyphVariantRecord.sanitize(c));
+ glyphAssembly.sanitize (c, this) &&
+ mathGlyphVariantRecord.sanitize (c));
}
- inline const MathGlyphAssembly &get_assembly (void) const
- { return this+glyphAssembly; }
+ const MathGlyphAssembly &get_assembly () const { return this+glyphAssembly; }
- inline unsigned int get_variants (hb_direction_t direction,
- hb_font_t *font,
- unsigned int start_offset,
- unsigned int *variants_count, /* IN/OUT */
- hb_ot_math_glyph_variant_t *variants /* OUT */) const
+ unsigned int get_variants (hb_direction_t direction,
+ hb_font_t *font,
+ unsigned int start_offset,
+ unsigned int *variants_count, /* IN/OUT */
+ hb_ot_math_glyph_variant_t *variants /* OUT */) const
{
if (variants_count)
{
- int scale = font->dir_scale (direction);
- const MathGlyphVariantRecord *arr =
- mathGlyphVariantRecord.sub_array (start_offset, variants_count);
- unsigned int count = *variants_count;
+ int64_t mult = font->dir_mult (direction);
+ hb_array_t<const MathGlyphVariantRecord> arr = mathGlyphVariantRecord.sub_array (start_offset, variants_count);
+ unsigned int count = arr.length;
for (unsigned int i = 0; i < count; i++)
{
variants[i].glyph = arr[i].variantGlyph;
- variants[i].advance = font->em_scale (arr[i].advanceMeasurement, scale);
+ variants[i].advance = font->em_mult (arr[i].advanceMeasurement, mult);
}
}
return mathGlyphVariantRecord.len;
@@ -571,7 +567,7 @@ struct MathGlyphConstruction
protected:
/* Offset to MathGlyphAssembly table for this shape - from the beginning of
- MathGlyphConstruction table. May be nullptr. */
+ MathGlyphConstruction table. May be NULL. */
OffsetTo<MathGlyphAssembly> glyphAssembly;
/* MathGlyphVariantRecords for alternative variants of the glyphs. */
@@ -583,41 +579,39 @@ struct MathGlyphConstruction
struct MathVariants
{
- inline bool sanitize_offsets (hb_sanitize_context_t *c) const
+ bool sanitize_offsets (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
unsigned int count = vertGlyphCount + horizGlyphCount;
for (unsigned int i = 0; i < count; i++)
- if (!glyphConstruction[i].sanitize (c, this)) return_trace (false);
+ if (!glyphConstruction.arrayZ[i].sanitize (c, this)) return_trace (false);
return_trace (true);
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
vertGlyphCoverage.sanitize (c, this) &&
horizGlyphCoverage.sanitize (c, this) &&
- c->check_array (glyphConstruction,
- glyphConstruction[0].static_size,
- vertGlyphCount + horizGlyphCount) &&
+ c->check_array (glyphConstruction.arrayZ, vertGlyphCount + horizGlyphCount) &&
sanitize_offsets (c));
}
- inline hb_position_t get_min_connector_overlap (hb_direction_t direction,
+ hb_position_t get_min_connector_overlap (hb_direction_t direction,
hb_font_t *font) const
{ return font->em_scale_dir (minConnectorOverlap, direction); }
- inline unsigned int get_glyph_variants (hb_codepoint_t glyph,
- hb_direction_t direction,
- hb_font_t *font,
- unsigned int start_offset,
- unsigned int *variants_count, /* IN/OUT */
- hb_ot_math_glyph_variant_t *variants /* OUT */) const
+ unsigned int get_glyph_variants (hb_codepoint_t glyph,
+ hb_direction_t direction,
+ hb_font_t *font,
+ unsigned int start_offset,
+ unsigned int *variants_count, /* IN/OUT */
+ hb_ot_math_glyph_variant_t *variants /* OUT */) const
{ return get_glyph_construction (glyph, direction, font)
.get_variants (direction, font, start_offset, variants_count, variants); }
- inline unsigned int get_glyph_parts (hb_codepoint_t glyph,
+ unsigned int get_glyph_parts (hb_codepoint_t glyph,
hb_direction_t direction,
hb_font_t *font,
unsigned int start_offset,
@@ -631,10 +625,10 @@ struct MathVariants
italics_correction); }
private:
- inline const MathGlyphConstruction &
- get_glyph_construction (hb_codepoint_t glyph,
- hb_direction_t direction,
- hb_font_t *font) const
+ const MathGlyphConstruction &
+ get_glyph_construction (hb_codepoint_t glyph,
+ hb_direction_t direction,
+ hb_font_t *font HB_UNUSED) const
{
bool vertical = HB_DIRECTION_IS_VERTICAL (direction);
unsigned int count = vertical ? vertGlyphCount : horizGlyphCount;
@@ -642,7 +636,7 @@ struct MathVariants
: horizGlyphCoverage;
unsigned int index = (this+coverage).get_coverage (glyph);
- if (unlikely (index >= count)) return Null(MathGlyphConstruction);
+ if (unlikely (index >= count)) return Null (MathGlyphConstruction);
if (!vertical)
index += vertGlyphCount;
@@ -651,7 +645,7 @@ struct MathVariants
}
protected:
- UINT16 minConnectorOverlap; /* Minimum overlap of connecting
+ HBUINT16 minConnectorOverlap; /* Minimum overlap of connecting
* glyphs during glyph construction,
* in design units. */
OffsetTo<Coverage> vertGlyphCoverage; /* Offset to Coverage table -
@@ -660,17 +654,18 @@ struct MathVariants
OffsetTo<Coverage> horizGlyphCoverage; /* Offset to Coverage table -
* from the beginning of MathVariants
* table. */
- UINT16 vertGlyphCount; /* Number of glyphs for which
+ HBUINT16 vertGlyphCount; /* Number of glyphs for which
* information is provided for
* vertically growing variants. */
- UINT16 horizGlyphCount; /* Number of glyphs for which
+ HBUINT16 horizGlyphCount; /* Number of glyphs for which
* information is provided for
* horizontally growing variants. */
/* Array of offsets to MathGlyphConstruction tables - from the beginning of
the MathVariants table, for shapes growing in vertical/horizontal
direction. */
- OffsetTo<MathGlyphConstruction> glyphConstruction[VAR];
+ UnsizedArrayOf<OffsetTo<MathGlyphConstruction>>
+ glyphConstruction;
public:
DEFINE_SIZE_ARRAY (10, glyphConstruction);
@@ -678,14 +673,17 @@ struct MathVariants
/*
- * MATH -- The MATH Table
+ * MATH -- Mathematical typesetting
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/math
*/
struct MATH
{
- static const hb_tag_t tableTag = HB_OT_TAG_MATH;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_MATH;
+
+ bool has_data () const { return version.to_int (); }
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (version.sanitize (c) &&
@@ -695,15 +693,13 @@ struct MATH
mathVariants.sanitize (c, this));
}
- inline hb_position_t get_constant (hb_ot_math_constant_t constant,
+ hb_position_t get_constant (hb_ot_math_constant_t constant,
hb_font_t *font) const
{ return (this+mathConstants).get_value (constant, font); }
- inline const MathGlyphInfo &get_math_glyph_info (void) const
- { return this+mathGlyphInfo; }
+ const MathGlyphInfo &get_glyph_info () const { return this+mathGlyphInfo; }
- inline const MathVariants &get_math_variants (void) const
- { return this+mathVariants; }
+ const MathVariants &get_variants () const { return this+mathVariants; }
protected:
FixedVersion<>version; /* Version of the MATH table
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-math.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-math.cc
index f82a07353c..9d8c6e735a 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-math.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-math.cc
@@ -24,18 +24,27 @@
* Igalia Author(s): Frédéric Wang
*/
-#include "hb-open-type-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_MATH
-#include "hb-ot-layout-private.hh"
#include "hb-ot-math-table.hh"
-static inline const OT::MATH&
-_get_math (hb_face_t *face)
-{
- if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::MATH);
- hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
- return *(layout->math.get ());
-}
+
+/**
+ * SECTION:hb-ot-math
+ * @title: hb-ot-math
+ * @short_description: OpenType Math information
+ * @include: hb-ot.h
+ *
+ * Functions for fetching mathematics layout data from OpenType fonts.
+ *
+ * HarfBuzz itself does not implement a math layout solution. The
+ * functions and types provided can be used by client programs to access
+ * the font data necessary for typesetting OpenType Math layout.
+ *
+ **/
+
/*
* OT::MATH
@@ -45,31 +54,32 @@ _get_math (hb_face_t *face)
* hb_ot_math_has_data:
* @face: #hb_face_t to test
*
- * This function allows to verify the presence of an OpenType MATH table on the
- * face.
+ * Tests whether a face has a `MATH` table.
*
- * Return value: true if face has a MATH table, false otherwise
+ * Return value: true if the table is found, false otherwise
*
* Since: 1.3.3
**/
hb_bool_t
hb_ot_math_has_data (hb_face_t *face)
{
- return &_get_math (face) != &OT::Null(OT::MATH);
+ return face->table.MATH->has_data ();
}
/**
* hb_ot_math_get_constant:
- * @font: #hb_font_t from which to retrieve the value
+ * @font: #hb_font_t to work upon
* @constant: #hb_ot_math_constant_t the constant to retrieve
*
- * This function returns the requested math constants as a #hb_position_t.
- * If the request constant is HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN,
- * HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN or
- * HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN then the return value is
- * actually an integer between 0 and 100 representing that percentage.
+ * Fetches the specified math constant. For most constants, the value returned
+ * is an #hb_position_t.
+ *
+ * However, if the requested constant is #HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN,
+ * #HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN or
+ * #HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN, then the return value is
+ * an integer between 0 and 100 representing that percentage.
*
- * Return value: the requested constant or 0
+ * Return value: the requested constant or zero
*
* Since: 1.3.3
**/
@@ -77,16 +87,18 @@ hb_position_t
hb_ot_math_get_constant (hb_font_t *font,
hb_ot_math_constant_t constant)
{
- const OT::MATH &math = _get_math (font->face);
- return math.get_constant(constant, font);
+ return font->face->table.MATH->get_constant(constant, font);
}
/**
* hb_ot_math_get_glyph_italics_correction:
- * @font: #hb_font_t from which to retrieve the value
- * @glyph: glyph index from which to retrieve the value
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph index from which to retrieve the value
*
- * Return value: the italics correction of the glyph or 0
+ * Fetches an italics-correction value (if one exists) for the specified
+ * glyph index.
+ *
+ * Return value: the italics correction of the glyph or zero
*
* Since: 1.3.3
**/
@@ -94,16 +106,25 @@ hb_position_t
hb_ot_math_get_glyph_italics_correction (hb_font_t *font,
hb_codepoint_t glyph)
{
- const OT::MATH &math = _get_math (font->face);
- return math.get_math_glyph_info().get_italics_correction (glyph, font);
+ return font->face->table.MATH->get_glyph_info().get_italics_correction (glyph, font);
}
/**
* hb_ot_math_get_glyph_top_accent_attachment:
- * @font: #hb_font_t from which to retrieve the value
- * @glyph: glyph index from which to retrieve the value
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph index from which to retrieve the value
+ *
+ * Fetches a top-accent-attachment value (if one exists) for the specified
+ * glyph index.
+ *
+ * For any glyph that does not have a top-accent-attachment value - that is,
+ * a glyph not covered by the `MathTopAccentAttachment` table (or, when
+ * @font has no `MathTopAccentAttachment` table or no `MATH` table, any
+ * glyph) - the function synthesizes a value, returning the position at
+ * one-half the glyph's advance width.
*
- * Return value: the top accent attachment of the glyph or 0
+ * Return value: the top accent attachment of the glyph or 0.5 * the advance
+ * width of @glyph
*
* Since: 1.3.3
**/
@@ -111,14 +132,15 @@ hb_position_t
hb_ot_math_get_glyph_top_accent_attachment (hb_font_t *font,
hb_codepoint_t glyph)
{
- const OT::MATH &math = _get_math (font->face);
- return math.get_math_glyph_info().get_top_accent_attachment (glyph, font);
+ return font->face->table.MATH->get_glyph_info().get_top_accent_attachment (glyph, font);
}
/**
* hb_ot_math_is_glyph_extended_shape:
- * @face: a #hb_face_t to test
- * @glyph: a glyph index to test
+ * @face: #hb_face_t to work upon
+ * @glyph: The glyph index to test
+ *
+ * Tests whether the given glyph index is an extended shape in the face.
*
* Return value: true if the glyph is an extended shape, false otherwise
*
@@ -128,24 +150,25 @@ hb_bool_t
hb_ot_math_is_glyph_extended_shape (hb_face_t *face,
hb_codepoint_t glyph)
{
- const OT::MATH &math = _get_math (face);
- return math.get_math_glyph_info().is_extended_shape (glyph);
+ return face->table.MATH->get_glyph_info().is_extended_shape (glyph);
}
/**
* hb_ot_math_get_glyph_kerning:
- * @font: #hb_font_t from which to retrieve the value
- * @glyph: glyph index from which to retrieve the value
- * @kern: the #hb_ot_math_kern_t from which to retrieve the value
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph index from which to retrieve the value
+ * @kern: The #hb_ot_math_kern_t from which to retrieve the value
* @correction_height: the correction height to use to determine the kerning.
*
- * This function tries to retrieve the MathKern table for the specified font,
- * glyph and #hb_ot_math_kern_t. Then it browses the list of heights from the
- * MathKern table to find one value that is greater or equal to specified
- * correction_height. If one is found the corresponding value from the list of
- * kerns is returned and otherwise the last kern value is returned.
+ * Fetches the math kerning (cut-ins) value for the specified font, glyph index, and
+ * @kern.
+ *
+ * If the MathKern table is found, the function examines it to find a height
+ * value that is greater or equal to @correction_height. If such a height
+ * value is found, corresponding kerning value from the table is returned. If
+ * no such height value is found, the last kerning value is returned.
*
- * Return value: requested kerning or 0
+ * Return value: requested kerning value or zero
*
* Since: 1.3.3
**/
@@ -155,26 +178,32 @@ hb_ot_math_get_glyph_kerning (hb_font_t *font,
hb_ot_math_kern_t kern,
hb_position_t correction_height)
{
- const OT::MATH &math = _get_math (font->face);
- return math.get_math_glyph_info().get_kerning (glyph, kern, correction_height, font);
+ return font->face->table.MATH->get_glyph_info().get_kerning (glyph,
+ kern,
+ correction_height,
+ font);
}
/**
* hb_ot_math_get_glyph_variants:
- * @font: #hb_font_t from which to retrieve the values
- * @glyph: index of the glyph to stretch
- * @direction: direction of the stretching
+ * @font: #hb_font_t to work upon
+ * @glyph: The index of the glyph to stretch
+ * @direction: The direction of the stretching (horizontal or vertical)
* @start_offset: offset of the first variant to retrieve
- * @variants_count: maximum number of variants to retrieve after start_offset
- * (IN) and actual number of variants retrieved (OUT)
- * @variants: array of size at least @variants_count to store the result
+ * @variants_count: (inout): Input = the maximum number of variants to return;
+ * Output = the actual number of variants returned
+ * @variants: (out) (array length=variants_count): array of variants returned
*
- * This function tries to retrieve the MathGlyphConstruction for the specified
- * font, glyph and direction. Note that only the value of
- * #HB_DIRECTION_IS_HORIZONTAL is considered. It provides the corresponding list
- * of size variants as an array of hb_ot_math_glyph_variant_t structs.
+ * Fetches the MathGlyphConstruction for the specified font, glyph index, and
+ * direction. The corresponding list of size variants is returned as a list of
+ * #hb_ot_math_glyph_variant_t structs.
*
- * Return value: the total number of size variants available or 0
+ * <note>The @direction parameter is only used to select between horizontal
+ * or vertical directions for the construction. Even though all #hb_direction_t
+ * values are accepted, only the result of #HB_DIRECTION_IS_HORIZONTAL is
+ * considered.</note>
+ *
+ * Return value: the total number of size variants available or zero
*
* Since: 1.3.3
**/
@@ -186,24 +215,27 @@ hb_ot_math_get_glyph_variants (hb_font_t *font,
unsigned int *variants_count, /* IN/OUT */
hb_ot_math_glyph_variant_t *variants /* OUT */)
{
- const OT::MATH &math = _get_math (font->face);
- return math.get_math_variants().get_glyph_variants (glyph, direction, font,
- start_offset,
- variants_count,
- variants);
+ return font->face->table.MATH->get_variants().get_glyph_variants (glyph, direction, font,
+ start_offset,
+ variants_count,
+ variants);
}
/**
* hb_ot_math_get_min_connector_overlap:
- * @font: #hb_font_t from which to retrieve the value
- * @direction: direction of the stretching
+ * @font: #hb_font_t to work upon
+ * @direction: direction of the stretching (horizontal or vertical)
+ *
+ * Fetches the MathVariants table for the specified font and returns the
+ * minimum overlap of connecting glyphs that are required to draw a glyph
+ * assembly in the specified direction.
*
- * This function tries to retrieve the MathVariants table for the specified
- * font and returns the minimum overlap of connecting glyphs to draw a glyph
- * assembly in the specified direction. Note that only the value of
- * #HB_DIRECTION_IS_HORIZONTAL is considered.
+ * <note>The @direction parameter is only used to select between horizontal
+ * or vertical directions for the construction. Even though all #hb_direction_t
+ * values are accepted, only the result of #HB_DIRECTION_IS_HORIZONTAL is
+ * considered.</note>
*
- * Return value: requested min connector overlap or 0
+ * Return value: requested minimum connector overlap or zero
*
* Since: 1.3.3
**/
@@ -211,25 +243,29 @@ hb_position_t
hb_ot_math_get_min_connector_overlap (hb_font_t *font,
hb_direction_t direction)
{
- const OT::MATH &math = _get_math (font->face);
- return math.get_math_variants().get_min_connector_overlap (direction, font);
+ return font->face->table.MATH->get_variants().get_min_connector_overlap (direction, font);
}
/**
* hb_ot_math_get_glyph_assembly:
- * @font: #hb_font_t from which to retrieve the values
- * @glyph: index of the glyph to stretch
- * @direction: direction of the stretching
+ * @font: #hb_font_t to work upon
+ * @glyph: The index of the glyph to stretch
+ * @direction: direction of the stretching (horizontal or vertical)
* @start_offset: offset of the first glyph part to retrieve
- * @parts_count: maximum number of glyph parts to retrieve after start_offset
- * (IN) and actual number of parts retrieved (OUT)
- * @parts: array of size at least @parts_count to store the result
- * @italics_correction: italic correction of the glyph assembly
+ * @parts_count: (inout): Input = maximum number of glyph parts to return;
+ * Output = actual number of parts returned
+ * @parts: (out) (array length=parts_count): the glyph parts returned
+ * @italics_correction: (out): italics correction of the glyph assembly
+ *
+ * Fetches the GlyphAssembly for the specified font, glyph index, and direction.
+ * Returned are a list of #hb_ot_math_glyph_part_t glyph parts that can be
+ * used to draw the glyph and an italics-correction value (if one is defined
+ * in the font).
*
- * This function tries to retrieve the GlyphAssembly for the specified font,
- * glyph and direction. Note that only the value of #HB_DIRECTION_IS_HORIZONTAL
- * is considered. It provides the information necessary to draw the glyph
- * assembly as an array of #hb_ot_math_glyph_part_t.
+ * <note>The @direction parameter is only used to select between horizontal
+ * or vertical directions for the construction. Even though all #hb_direction_t
+ * values are accepted, only the result of #HB_DIRECTION_IS_HORIZONTAL is
+ * considered.</note>
*
* Return value: the total number of parts in the glyph assembly
*
@@ -244,10 +280,14 @@ hb_ot_math_get_glyph_assembly (hb_font_t *font,
hb_ot_math_glyph_part_t *parts, /* OUT */
hb_position_t *italics_correction /* OUT */)
{
- const OT::MATH &math = _get_math (font->face);
- return math.get_math_variants().get_glyph_parts (glyph, direction, font,
- start_offset,
- parts_count,
- parts,
- italics_correction);
+ return font->face->table.MATH->get_variants().get_glyph_parts (glyph,
+ direction,
+ font,
+ start_offset,
+ parts_count,
+ parts,
+ italics_correction);
}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-math.h b/src/3rdparty/harfbuzz-ng/src/hb-ot-math.h
index 521a5ca037..ad864a762d 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-math.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-math.h
@@ -50,6 +50,9 @@ HB_BEGIN_DECLS
/**
* hb_ot_math_constant_t:
*
+ * The 'MATH' table constants specified at
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/math
+ *
* Since: 1.3.3
*/
typedef enum {
@@ -114,6 +117,9 @@ typedef enum {
/**
* hb_ot_math_kern_t:
*
+ * The math kerning-table types defined for the four corners
+ * of a glyph.
+ *
* Since: 1.3.3
*/
typedef enum {
@@ -125,6 +131,10 @@ typedef enum {
/**
* hb_ot_math_glyph_variant_t:
+ * @glyph: The glyph index of the variant
+ * @advance: The advance width of the variant
+ *
+ * Data type to hold math-variant information for a glyph.
*
* Since: 1.3.3
*/
@@ -136,14 +146,25 @@ typedef struct hb_ot_math_glyph_variant_t {
/**
* hb_ot_math_glyph_part_flags_t:
*
+ * Flags for math glyph parts.
+ *
* Since: 1.3.3
*/
typedef enum { /*< flags >*/
- HB_MATH_GLYPH_PART_FLAG_EXTENDER = 0x00000001u /* Extender glyph */
+ HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER = 0x00000001u /* Extender glyph */
} hb_ot_math_glyph_part_flags_t;
/**
* hb_ot_math_glyph_part_t:
+ * @glyph: The glyph index of the variant part
+ * @start_connector_length: The length of the connector on the starting side of the variant part
+ * @end_connector_length: The length of the connector on the ending side of the variant part
+ * @full_advance: The total advance of the part
+ * @flags: #hb_ot_math_glyph_part_flags_t flags for the part
+ *
+ * Data type to hold information for a "part" component of a math-variant glyph.
+ * Large variants for stretchable math glyphs (such as parentheses) can be constructed
+ * on the fly from parts.
*
* Since: 1.3.3
*/
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-maxp-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-maxp-table.hh
index f6d283eb14..1c25eda16b 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-maxp-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-maxp-table.hh
@@ -27,40 +27,109 @@
#ifndef HB_OT_MAXP_TABLE_HH
#define HB_OT_MAXP_TABLE_HH
-#include "hb-open-type-private.hh"
-
+#include "hb-open-type.hh"
namespace OT {
/*
- * maxp -- The Maximum Profile Table
+ * maxp -- Maximum Profile
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/maxp
*/
#define HB_OT_TAG_maxp HB_TAG('m','a','x','p')
+struct maxpV1Tail
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ HBUINT16 maxPoints; /* Maximum points in a non-composite glyph. */
+ HBUINT16 maxContours; /* Maximum contours in a non-composite glyph. */
+ HBUINT16 maxCompositePoints; /* Maximum points in a composite glyph. */
+ HBUINT16 maxCompositeContours; /* Maximum contours in a composite glyph. */
+ HBUINT16 maxZones; /* 1 if instructions do not use the twilight zone (Z0),
+ * or 2 if instructions do use Z0; should be set to 2 in
+ * most cases. */
+ HBUINT16 maxTwilightPoints; /* Maximum points used in Z0. */
+ HBUINT16 maxStorage; /* Number of Storage Area locations. */
+ HBUINT16 maxFunctionDefs; /* Number of FDEFs, equal to the highest function number + 1. */
+ HBUINT16 maxInstructionDefs; /* Number of IDEFs. */
+ HBUINT16 maxStackElements; /* Maximum stack depth. (This includes Font and CVT
+ * Programs, as well as the instructions for each glyph.) */
+ HBUINT16 maxSizeOfInstructions; /* Maximum byte count for glyph instructions. */
+ HBUINT16 maxComponentElements; /* Maximum number of components referenced at
+ * "top level" for any composite glyph. */
+ HBUINT16 maxComponentDepth; /* Maximum levels of recursion; 1 for simple components. */
+ public:
+ DEFINE_SIZE_STATIC (26);
+};
+
+
struct maxp
{
- static const hb_tag_t tableTag = HB_OT_TAG_maxp;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_maxp;
+
+ unsigned int get_num_glyphs () const { return numGlyphs; }
- inline unsigned int get_num_glyphs (void) const
+ void set_num_glyphs (unsigned int count)
{
- return numGlyphs;
+ numGlyphs = count;
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- likely (version.major == 1 ||
- (version.major == 0 && version.minor == 0x5000u)));
+ if (unlikely (!c->check_struct (this)))
+ return_trace (false);
+
+ if (version.major == 1)
+ {
+ const maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*this);
+ return_trace (v1.sanitize (c));
+ }
+ return_trace (likely (version.major == 0 && version.minor == 0x5000u));
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ maxp *maxp_prime = c->serializer->embed (this);
+ if (unlikely (!maxp_prime)) return_trace (false);
+
+ maxp_prime->numGlyphs = c->plan->num_output_glyphs ();
+ if (maxp_prime->version.major == 1)
+ {
+ const maxpV1Tail *src_v1 = &StructAfter<maxpV1Tail> (*this);
+ maxpV1Tail *dest_v1 = c->serializer->embed<maxpV1Tail> (src_v1);
+ if (unlikely (!dest_v1)) return_trace (false);
+
+ if (c->plan->drop_hints)
+ drop_hint_fields (dest_v1);
+ }
+
+ return_trace (true);
+ }
+
+ static void drop_hint_fields (maxpV1Tail* dest_v1)
+ {
+ dest_v1->maxZones = 1;
+ dest_v1->maxTwilightPoints = 0;
+ dest_v1->maxStorage = 0;
+ dest_v1->maxFunctionDefs = 0;
+ dest_v1->maxInstructionDefs = 0;
+ dest_v1->maxStackElements = 0;
+ dest_v1->maxSizeOfInstructions = 0;
}
- /* We only implement version 0.5 as none of the extra fields in version 1.0 are useful. */
protected:
FixedVersion<>version; /* Version of the maxp table (0.5 or 1.0),
* 0x00005000u or 0x00010000u. */
- UINT16 numGlyphs; /* The number of glyphs in the font. */
+ HBUINT16 numGlyphs; /* The number of glyphs in the font. */
+/*maxpV1Tail v1Tail[HB_VAR_ARRAY]; */
public:
DEFINE_SIZE_STATIC (6);
};
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-meta-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-meta-table.hh
new file mode 100644
index 0000000000..43a02d6cec
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-meta-table.hh
@@ -0,0 +1,126 @@
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_META_TABLE_HH
+#define HB_OT_META_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * meta -- Metadata Table
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/meta
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6meta.html
+ */
+#define HB_OT_TAG_meta HB_TAG ('m','e','t','a')
+
+
+namespace OT {
+
+
+struct DataMap
+{
+ int cmp (hb_tag_t a) const { return tag.cmp (a); }
+
+ hb_tag_t get_tag () const { return tag; }
+
+ hb_blob_t *reference_entry (hb_blob_t *meta_blob) const
+ { return hb_blob_create_sub_blob (meta_blob, dataZ, dataLength); }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ dataZ.sanitize (c, base, dataLength)));
+ }
+
+ protected:
+ Tag tag; /* A tag indicating the type of metadata. */
+ LOffsetTo<UnsizedArrayOf<HBUINT8>>
+ dataZ; /* Offset in bytes from the beginning of the
+ * metadata table to the data for this tag. */
+ HBUINT32 dataLength; /* Length of the data. The data is not required to
+ * be padded to any byte boundary. */
+ public:
+ DEFINE_SIZE_STATIC (12);
+};
+
+struct meta
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_meta;
+
+ struct accelerator_t
+ {
+ void init (hb_face_t *face)
+ { table = hb_sanitize_context_t ().reference_table<meta> (face); }
+ void fini () { table.destroy (); }
+
+ hb_blob_t *reference_entry (hb_tag_t tag) const
+ { return table->dataMaps.lsearch (tag).reference_entry (table.get_blob ()); }
+
+ unsigned int get_entries (unsigned int start_offset,
+ unsigned int *count,
+ hb_ot_meta_tag_t *entries) const
+ {
+ if (count)
+ {
+ + table->dataMaps.sub_array (start_offset, count)
+ | hb_map (&DataMap::get_tag)
+ | hb_map ([](hb_tag_t tag) { return (hb_ot_meta_tag_t) tag; })
+ | hb_sink (hb_array (entries, *count))
+ ;
+ }
+ return table->dataMaps.len;
+ }
+
+ private:
+ hb_blob_ptr_t<meta> table;
+ };
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ version == 1 &&
+ dataMaps.sanitize (c, this)));
+ }
+
+ protected:
+ HBUINT32 version; /* Version number of the metadata table — set to 1. */
+ HBUINT32 flags; /* Flags — currently unused; set to 0. */
+ HBUINT32 dataOffset; /* Per Apple specification:
+ * Offset from the beginning of the table to the data.
+ * Per OT specification:
+ * Reserved. Not used; should be set to 0. */
+ LArrayOf<DataMap>
+ dataMaps; /* Array of data map records. */
+ public:
+ DEFINE_SIZE_ARRAY (16, dataMaps);
+};
+
+struct meta_accelerator_t : meta::accelerator_t {};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_META_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-meta.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-meta.cc
new file mode 100644
index 0000000000..a1e081b245
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-meta.cc
@@ -0,0 +1,77 @@
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_META
+
+#include "hb-ot-meta-table.hh"
+
+/**
+ * SECTION:hb-ot-meta
+ * @title: hb-ot-meta
+ * @short_description: OpenType Metadata
+ * @include: hb-ot.h
+ *
+ * Functions for fetching metadata from fonts.
+ **/
+
+/**
+ * hb_ot_meta_reference_entry:
+ * @face: a face object
+ * @start_offset: iteration's start offset
+ * @entries_count:(inout) (allow-none): buffer size as input, filled size as output
+ * @entries: (out caller-allocates) (array length=entries_count): entries tags buffer
+ *
+ * Return value: Number of all available feature types.
+ *
+ * Since: 2.6.0
+ **/
+unsigned int
+hb_ot_meta_get_entry_tags (hb_face_t *face,
+ unsigned int start_offset,
+ unsigned int *entries_count, /* IN/OUT. May be NULL. */
+ hb_ot_meta_tag_t *entries /* OUT. May be NULL. */)
+{
+ return face->table.meta->get_entries (start_offset, entries_count, entries);
+}
+
+/**
+ * hb_ot_meta_reference_entry:
+ * @face: a #hb_face_t object.
+ * @meta_tag: tag of metadata you like to have.
+ *
+ * It fetches metadata entry of a given tag from a font.
+ *
+ * Returns: (transfer full): A blob containing the blob.
+ *
+ * Since: 2.6.0
+ **/
+hb_blob_t *
+hb_ot_meta_reference_entry (hb_face_t *face, hb_ot_meta_tag_t meta_tag)
+{
+ return face->table.meta->reference_entry (meta_tag);
+}
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-meta.h b/src/3rdparty/harfbuzz-ng/src/hb-ot-meta.h
new file mode 100644
index 0000000000..0278d84148
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-meta.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_META_H
+#define HB_OT_META_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+/**
+ * hb_ot_meta_tag_t:
+ * @HB_OT_META_TAG_DESIGN_LANGUAGES: Design languages. Text, using only
+ * Basic Latin (ASCII) characters. Indicates languages and/or scripts
+ * for the user audiences that the font was primarily designed for.
+ * @HB_OT_META_TAG_SUPPORTED_LANGUAGES: Supported languages. Text, using
+ * only Basic Latin (ASCII) characters. Indicates languages and/or scripts
+ * that the font is declared to be capable of supporting.
+ *
+ * Known metadata tags from https://docs.microsoft.com/en-us/typography/opentype/spec/meta
+ *
+ * Since: 2.6.0
+ **/
+typedef enum {
+/*
+ HB_OT_META_TAG_APPL = HB_TAG ('a','p','p','l'),
+ HB_OT_META_TAG_BILD = HB_TAG ('b','i','l','d'),
+*/
+ HB_OT_META_TAG_DESIGN_LANGUAGES = HB_TAG ('d','l','n','g'),
+ HB_OT_META_TAG_SUPPORTED_LANGUAGES = HB_TAG ('s','l','n','g'),
+
+ _HB_OT_META_TAG_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
+} hb_ot_meta_tag_t;
+
+HB_EXTERN unsigned int
+hb_ot_meta_get_entry_tags (hb_face_t *face,
+ unsigned int start_offset,
+ unsigned int *entries_count, /* IN/OUT. May be NULL. */
+ hb_ot_meta_tag_t *entries /* OUT. May be NULL. */);
+
+HB_EXTERN hb_blob_t *
+hb_ot_meta_reference_entry (hb_face_t *face, hb_ot_meta_tag_t meta_tag);
+
+HB_END_DECLS
+
+#endif /* HB_OT_META_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.cc
new file mode 100644
index 0000000000..181ac4d57e
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.cc
@@ -0,0 +1,231 @@
+/*
+ * Copyright © 2018-2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb.hh"
+
+#include "hb-ot-var-mvar-table.hh"
+#include "hb-ot-gasp-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-ot-os2-table.hh"
+#include "hb-ot-post-table.hh"
+#include "hb-ot-hhea-table.hh"
+#include "hb-ot-metrics.hh"
+#include "hb-ot-face.hh"
+
+
+static float
+_fix_ascender_descender (float value, hb_ot_metrics_tag_t metrics_tag)
+{
+ if (metrics_tag == HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER ||
+ metrics_tag == HB_OT_METRICS_TAG_VERTICAL_ASCENDER)
+ return fabs ((double) value);
+ if (metrics_tag == HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER ||
+ metrics_tag == HB_OT_METRICS_TAG_VERTICAL_DESCENDER)
+ return -fabs ((double) value);
+ return value;
+}
+
+/* The common part of _get_position logic needed on hb-ot-font and here
+ to be able to have slim builds without the not always needed parts */
+bool
+_hb_ot_metrics_get_position_common (hb_font_t *font,
+ hb_ot_metrics_tag_t metrics_tag,
+ hb_position_t *position /* OUT. May be NULL. */)
+{
+ hb_face_t *face = font->face;
+ switch ((unsigned) metrics_tag)
+ {
+#ifndef HB_NO_VAR
+#define GET_VAR face->table.MVAR->get_var (metrics_tag, font->coords, font->num_coords)
+#else
+#define GET_VAR .0f
+#endif
+#define GET_METRIC_X(TABLE, ATTR) \
+ (face->table.TABLE->has_data () && \
+ (position && (*position = font->em_scalef_x (_fix_ascender_descender ( \
+ face->table.TABLE->ATTR + GET_VAR, metrics_tag))), true))
+#define GET_METRIC_Y(TABLE, ATTR) \
+ (face->table.TABLE->has_data () && \
+ (position && (*position = font->em_scalef_y (_fix_ascender_descender ( \
+ face->table.TABLE->ATTR + GET_VAR, metrics_tag))), true))
+ case HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER:
+ return (face->table.OS2->use_typo_metrics () && GET_METRIC_Y (OS2, sTypoAscender)) ||
+ GET_METRIC_Y (hhea, ascender);
+ case HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER:
+ return (face->table.OS2->use_typo_metrics () && GET_METRIC_Y (OS2, sTypoDescender)) ||
+ GET_METRIC_Y (hhea, descender);
+ case HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP:
+ return (face->table.OS2->use_typo_metrics () && GET_METRIC_Y (OS2, sTypoLineGap)) ||
+ GET_METRIC_Y (hhea, lineGap);
+ case HB_OT_METRICS_TAG_VERTICAL_ASCENDER: return GET_METRIC_X (vhea, ascender);
+ case HB_OT_METRICS_TAG_VERTICAL_DESCENDER: return GET_METRIC_X (vhea, descender);
+ case HB_OT_METRICS_TAG_VERTICAL_LINE_GAP: return GET_METRIC_X (vhea, lineGap);
+#undef GET_METRIC_Y
+#undef GET_METRIC_X
+#undef GET_VAR
+ default: assert (0); return false;
+ }
+}
+
+#ifndef HB_NO_METRICS
+
+#if 0
+static bool
+_get_gasp (hb_face_t *face, float *result, hb_ot_metrics_tag_t metrics_tag)
+{
+ const OT::GaspRange& range = face->table.gasp->get_gasp_range (metrics_tag - HB_TAG ('g','s','p','0'));
+ if (&range == &Null (OT::GaspRange)) return false;
+ if (result) *result = range.rangeMaxPPEM + font->face->table.MVAR->get_var (metrics_tag, font->coords, font->num_coords);
+ return true;
+}
+#endif
+
+/* Private tags for https://github.com/harfbuzz/harfbuzz/issues/1866 */
+#define _HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER_OS2 HB_TAG ('O','a','s','c')
+#define _HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER_HHEA HB_TAG ('H','a','s','c')
+#define _HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER_OS2 HB_TAG ('O','d','s','c')
+#define _HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER_HHEA HB_TAG ('H','d','s','c')
+#define _HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP_OS2 HB_TAG ('O','l','g','p')
+#define _HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP_HHEA HB_TAG ('H','l','g','p')
+
+/**
+ * hb_ot_metrics_get_position:
+ * @font: a #hb_font_t object.
+ * @metrics_tag: tag of metrics value you like to fetch.
+ * @position: (out) (optional): result of metrics value from the font.
+ *
+ * It fetches metrics value corresponding to a given tag from a font.
+ *
+ * Returns: Whether found the requested metrics in the font.
+ * Since: 2.6.0
+ **/
+hb_bool_t
+hb_ot_metrics_get_position (hb_font_t *font,
+ hb_ot_metrics_tag_t metrics_tag,
+ hb_position_t *position /* OUT. May be NULL. */)
+{
+ hb_face_t *face = font->face;
+ switch ((unsigned) metrics_tag)
+ {
+ case HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER:
+ case HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER:
+ case HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP:
+ case HB_OT_METRICS_TAG_VERTICAL_ASCENDER:
+ case HB_OT_METRICS_TAG_VERTICAL_DESCENDER:
+ case HB_OT_METRICS_TAG_VERTICAL_LINE_GAP: return _hb_ot_metrics_get_position_common (font, metrics_tag, position);
+#ifndef HB_NO_VAR
+#define GET_VAR hb_ot_metrics_get_variation (font, metrics_tag)
+#else
+#define GET_VAR 0
+#endif
+#define GET_METRIC_X(TABLE, ATTR) \
+ (face->table.TABLE->has_data () && \
+ (position && (*position = font->em_scalef_x (face->table.TABLE->ATTR + GET_VAR)), true))
+#define GET_METRIC_Y(TABLE, ATTR) \
+ (face->table.TABLE->has_data () && \
+ (position && (*position = font->em_scalef_y (face->table.TABLE->ATTR + GET_VAR)), true))
+ case HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_ASCENT: return GET_METRIC_Y (OS2, usWinAscent);
+ case HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_DESCENT: return GET_METRIC_Y (OS2, usWinDescent);
+ case HB_OT_METRICS_TAG_HORIZONTAL_CARET_RISE: return GET_METRIC_Y (hhea, caretSlopeRise);
+ case HB_OT_METRICS_TAG_HORIZONTAL_CARET_RUN: return GET_METRIC_X (hhea, caretSlopeRun);
+ case HB_OT_METRICS_TAG_HORIZONTAL_CARET_OFFSET: return GET_METRIC_X (hhea, caretOffset);
+ case HB_OT_METRICS_TAG_VERTICAL_CARET_RISE: return GET_METRIC_X (vhea, caretSlopeRise);
+ case HB_OT_METRICS_TAG_VERTICAL_CARET_RUN: return GET_METRIC_Y (vhea, caretSlopeRun);
+ case HB_OT_METRICS_TAG_VERTICAL_CARET_OFFSET: return GET_METRIC_Y (vhea, caretOffset);
+ case HB_OT_METRICS_TAG_X_HEIGHT: return GET_METRIC_Y (OS2->v2 (), sxHeight);
+ case HB_OT_METRICS_TAG_CAP_HEIGHT: return GET_METRIC_Y (OS2->v2 (), sCapHeight);
+ case HB_OT_METRICS_TAG_SUBSCRIPT_EM_X_SIZE: return GET_METRIC_X (OS2, ySubscriptXSize);
+ case HB_OT_METRICS_TAG_SUBSCRIPT_EM_Y_SIZE: return GET_METRIC_Y (OS2, ySubscriptYSize);
+ case HB_OT_METRICS_TAG_SUBSCRIPT_EM_X_OFFSET: return GET_METRIC_X (OS2, ySubscriptXOffset);
+ case HB_OT_METRICS_TAG_SUBSCRIPT_EM_Y_OFFSET: return GET_METRIC_Y (OS2, ySubscriptYOffset);
+ case HB_OT_METRICS_TAG_SUPERSCRIPT_EM_X_SIZE: return GET_METRIC_X (OS2, ySuperscriptXSize);
+ case HB_OT_METRICS_TAG_SUPERSCRIPT_EM_Y_SIZE: return GET_METRIC_Y (OS2, ySuperscriptYSize);
+ case HB_OT_METRICS_TAG_SUPERSCRIPT_EM_X_OFFSET: return GET_METRIC_X (OS2, ySuperscriptXOffset);
+ case HB_OT_METRICS_TAG_SUPERSCRIPT_EM_Y_OFFSET: return GET_METRIC_Y (OS2, ySuperscriptYOffset);
+ case HB_OT_METRICS_TAG_STRIKEOUT_SIZE: return GET_METRIC_Y (OS2, yStrikeoutSize);
+ case HB_OT_METRICS_TAG_STRIKEOUT_OFFSET: return GET_METRIC_Y (OS2, yStrikeoutPosition);
+ case HB_OT_METRICS_TAG_UNDERLINE_SIZE: return GET_METRIC_Y (post->table, underlineThickness);
+ case HB_OT_METRICS_TAG_UNDERLINE_OFFSET: return GET_METRIC_Y (post->table, underlinePosition);
+
+ /* Private tags */
+ case _HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER_OS2: return GET_METRIC_Y (OS2, sTypoAscender);
+ case _HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER_HHEA: return GET_METRIC_Y (hhea, ascender);
+ case _HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER_OS2: return GET_METRIC_Y (OS2, sTypoDescender);
+ case _HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER_HHEA: return GET_METRIC_Y (hhea, descender);
+ case _HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP_OS2: return GET_METRIC_Y (OS2, sTypoLineGap);
+ case _HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP_HHEA: return GET_METRIC_Y (hhea, lineGap);
+#undef GET_METRIC_Y
+#undef GET_METRIC_X
+#undef GET_VAR
+ default: return false;
+ }
+}
+
+#ifndef HB_NO_VAR
+/**
+ * hb_ot_metrics_get_variation:
+ * @font:
+ * @metrics_tag:
+ *
+ * Returns:
+ *
+ * Since: 2.6.0
+ **/
+float
+hb_ot_metrics_get_variation (hb_font_t *font, hb_ot_metrics_tag_t metrics_tag)
+{
+ return font->face->table.MVAR->get_var (metrics_tag, font->coords, font->num_coords);
+}
+
+/**
+ * hb_ot_metrics_get_x_variation:
+ * @font:
+ * @metrics_tag:
+ *
+ * Returns:
+ *
+ * Since: 2.6.0
+ **/
+hb_position_t
+hb_ot_metrics_get_x_variation (hb_font_t *font, hb_ot_metrics_tag_t metrics_tag)
+{
+ return font->em_scalef_x (hb_ot_metrics_get_variation (font, metrics_tag));
+}
+
+/**
+ * hb_ot_metrics_get_y_variation:
+ * @font:
+ * @metrics_tag:
+ *
+ * Returns:
+ *
+ * Since: 2.6.0
+ **/
+hb_position_t
+hb_ot_metrics_get_y_variation (hb_font_t *font, hb_ot_metrics_tag_t metrics_tag)
+{
+ return font->em_scalef_y (hb_ot_metrics_get_variation (font, metrics_tag));
+}
+#endif
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.h b/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.h
new file mode 100644
index 0000000000..42c7363c03
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_METRICS_H
+#define HB_OT_METRICS_H
+
+#include "hb.h"
+#include "hb-ot-name.h"
+
+HB_BEGIN_DECLS
+
+
+/**
+ * hb_ot_metrics_tag_t:
+ * @HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER: horizontal ascender.
+ * @HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER: horizontal descender.
+ * @HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP: horizontal line gap.
+ * @HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_ASCENT: horizontal clipping ascent.
+ * @HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_DESCENT: horizontal clipping descent.
+ * @HB_OT_METRICS_TAG_VERTICAL_ASCENDER: vertical ascender.
+ * @HB_OT_METRICS_TAG_VERTICAL_DESCENDER: vertical descender.
+ * @HB_OT_METRICS_TAG_VERTICAL_LINE_GAP: vertical line gap.
+ * @HB_OT_METRICS_TAG_HORIZONTAL_CARET_RISE: horizontal caret rise.
+ * @HB_OT_METRICS_TAG_HORIZONTAL_CARET_RUN: horizontal caret run.
+ * @HB_OT_METRICS_TAG_HORIZONTAL_CARET_OFFSET: horizontal caret offset.
+ * @HB_OT_METRICS_TAG_VERTICAL_CARET_RISE: vertical caret rise.
+ * @HB_OT_METRICS_TAG_VERTICAL_CARET_RUN: vertical caret run.
+ * @HB_OT_METRICS_TAG_VERTICAL_CARET_OFFSET: vertical caret offset.
+ * @HB_OT_METRICS_TAG_X_HEIGHT: x height.
+ * @HB_OT_METRICS_TAG_CAP_HEIGHT: cap height.
+ * @HB_OT_METRICS_TAG_SUBSCRIPT_EM_X_SIZE: subscript em x size.
+ * @HB_OT_METRICS_TAG_SUBSCRIPT_EM_Y_SIZE: subscript em y size.
+ * @HB_OT_METRICS_TAG_SUBSCRIPT_EM_X_OFFSET: subscript em x offset.
+ * @HB_OT_METRICS_TAG_SUBSCRIPT_EM_Y_OFFSET: subscript em y offset.
+ * @HB_OT_METRICS_TAG_SUPERSCRIPT_EM_X_SIZE: superscript em x size.
+ * @HB_OT_METRICS_TAG_SUPERSCRIPT_EM_Y_SIZE: superscript em y size.
+ * @HB_OT_METRICS_TAG_SUPERSCRIPT_EM_X_OFFSET: superscript em x offset.
+ * @HB_OT_METRICS_TAG_SUPERSCRIPT_EM_Y_OFFSET: superscript em y offset.
+ * @HB_OT_METRICS_TAG_STRIKEOUT_SIZE: strikeout size.
+ * @HB_OT_METRICS_TAG_STRIKEOUT_OFFSET: strikeout offset.
+ * @HB_OT_METRICS_TAG_UNDERLINE_SIZE: underline size.
+ * @HB_OT_METRICS_TAG_UNDERLINE_OFFSET: underline offset.
+ *
+ * From https://docs.microsoft.com/en-us/typography/opentype/spec/mvar#value-tags
+ *
+ * Since: 2.6.0
+ **/
+typedef enum {
+ HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER = HB_TAG ('h','a','s','c'),
+ HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER = HB_TAG ('h','d','s','c'),
+ HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP = HB_TAG ('h','l','g','p'),
+ HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_ASCENT = HB_TAG ('h','c','l','a'),
+ HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_DESCENT = HB_TAG ('h','c','l','d'),
+ HB_OT_METRICS_TAG_VERTICAL_ASCENDER = HB_TAG ('v','a','s','c'),
+ HB_OT_METRICS_TAG_VERTICAL_DESCENDER = HB_TAG ('v','d','s','c'),
+ HB_OT_METRICS_TAG_VERTICAL_LINE_GAP = HB_TAG ('v','l','g','p'),
+ HB_OT_METRICS_TAG_HORIZONTAL_CARET_RISE = HB_TAG ('h','c','r','s'),
+ HB_OT_METRICS_TAG_HORIZONTAL_CARET_RUN = HB_TAG ('h','c','r','n'),
+ HB_OT_METRICS_TAG_HORIZONTAL_CARET_OFFSET = HB_TAG ('h','c','o','f'),
+ HB_OT_METRICS_TAG_VERTICAL_CARET_RISE = HB_TAG ('v','c','r','s'),
+ HB_OT_METRICS_TAG_VERTICAL_CARET_RUN = HB_TAG ('v','c','r','n'),
+ HB_OT_METRICS_TAG_VERTICAL_CARET_OFFSET = HB_TAG ('v','c','o','f'),
+ HB_OT_METRICS_TAG_X_HEIGHT = HB_TAG ('x','h','g','t'),
+ HB_OT_METRICS_TAG_CAP_HEIGHT = HB_TAG ('c','p','h','t'),
+ HB_OT_METRICS_TAG_SUBSCRIPT_EM_X_SIZE = HB_TAG ('s','b','x','s'),
+ HB_OT_METRICS_TAG_SUBSCRIPT_EM_Y_SIZE = HB_TAG ('s','b','y','s'),
+ HB_OT_METRICS_TAG_SUBSCRIPT_EM_X_OFFSET = HB_TAG ('s','b','x','o'),
+ HB_OT_METRICS_TAG_SUBSCRIPT_EM_Y_OFFSET = HB_TAG ('s','b','y','o'),
+ HB_OT_METRICS_TAG_SUPERSCRIPT_EM_X_SIZE = HB_TAG ('s','p','x','s'),
+ HB_OT_METRICS_TAG_SUPERSCRIPT_EM_Y_SIZE = HB_TAG ('s','p','y','s'),
+ HB_OT_METRICS_TAG_SUPERSCRIPT_EM_X_OFFSET = HB_TAG ('s','p','x','o'),
+ HB_OT_METRICS_TAG_SUPERSCRIPT_EM_Y_OFFSET = HB_TAG ('s','p','y','o'),
+ HB_OT_METRICS_TAG_STRIKEOUT_SIZE = HB_TAG ('s','t','r','s'),
+ HB_OT_METRICS_TAG_STRIKEOUT_OFFSET = HB_TAG ('s','t','r','o'),
+ HB_OT_METRICS_TAG_UNDERLINE_SIZE = HB_TAG ('u','n','d','s'),
+ HB_OT_METRICS_TAG_UNDERLINE_OFFSET = HB_TAG ('u','n','d','o'),
+
+ _HB_OT_METRICS_TAG_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
+} hb_ot_metrics_tag_t;
+
+HB_EXTERN hb_bool_t
+hb_ot_metrics_get_position (hb_font_t *font,
+ hb_ot_metrics_tag_t metrics_tag,
+ hb_position_t *position /* OUT. May be NULL. */);
+
+HB_EXTERN float
+hb_ot_metrics_get_variation (hb_font_t *font, hb_ot_metrics_tag_t metrics_tag);
+
+HB_EXTERN hb_position_t
+hb_ot_metrics_get_x_variation (hb_font_t *font, hb_ot_metrics_tag_t metrics_tag);
+
+HB_EXTERN hb_position_t
+hb_ot_metrics_get_y_variation (hb_font_t *font, hb_ot_metrics_tag_t metrics_tag);
+
+HB_END_DECLS
+
+#endif /* HB_OT_METRICS_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.hh
new file mode 100644
index 0000000000..19a5e9ed41
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.hh
@@ -0,0 +1,35 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_METRICS_HH
+#define HB_OT_METRICS_HH
+
+#include "hb.hh"
+
+HB_INTERNAL bool
+_hb_ot_metrics_get_position_common (hb_font_t *font,
+ hb_ot_metrics_tag_t metrics_tag,
+ hb_position_t *position /* OUT. May be NULL. */);
+
+#endif /* HB_OT_METRICS_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-name-language-static.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-name-language-static.hh
new file mode 100644
index 0000000000..580e7637b9
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-name-language-static.hh
@@ -0,0 +1,465 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_NAME_LANGUAGE_STATIC_HH
+#define HB_OT_NAME_LANGUAGE_STATIC_HH
+
+#include "hb-ot-name-language.hh"
+
+/* Following two tables were generated by joining FreeType, FontConfig,
+ * and OpenType specification language lists, then filled in missing
+ * entries using:
+ * https://docs.microsoft.com/en-us/windows/desktop/intl/language-identifier-constants-and-strings
+ */
+
+struct hb_ot_language_map_t
+{
+ static int cmp (const void *key, const void *item)
+ {
+ unsigned int a = * (unsigned int *) key;
+ unsigned int b = ((const hb_ot_language_map_t *) item)->code;
+ return a < b ? -1 : a > b ? +1 : 0;
+ }
+
+ uint16_t code;
+ char lang[6];
+};
+
+static const hb_ot_language_map_t
+hb_ms_language_map[] =
+{
+ {0x0001, "ar"}, /* ??? */
+ {0x0004, "zh"}, /* ??? */
+ {0x0009, "en"}, /* ??? */
+ {0x0401, "ar"}, /* Arabic (Saudi Arabia) */
+ {0x0402, "bg"}, /* Bulgarian (Bulgaria) */
+ {0x0403, "ca"}, /* Catalan (Catalan) */
+ {0x0404, "zh-tw"}, /* Chinese (Taiwan) */
+ {0x0405, "cs"}, /* Czech (Czech Republic) */
+ {0x0406, "da"}, /* Danish (Denmark) */
+ {0x0407, "de"}, /* German (Germany) */
+ {0x0408, "el"}, /* Greek (Greece) */
+ {0x0409, "en"}, /* English (United States) */
+ {0x040A, "es"}, /* Spanish (Traditional Sort) (Spain) */
+ {0x040B, "fi"}, /* Finnish (Finland) */
+ {0x040C, "fr"}, /* French (France) */
+ {0x040D, "he"}, /* Hebrew (Israel) */
+ {0x040E, "hu"}, /* Hungarian (Hungary) */
+ {0x040F, "is"}, /* Icelandic (Iceland) */
+ {0x0410, "it"}, /* Italian (Italy) */
+ {0x0411, "ja"}, /* Japanese (Japan) */
+ {0x0412, "ko"}, /* Korean (Korea) */
+ {0x0413, "nl"}, /* Dutch (Netherlands) */
+ {0x0414, "no"}, /* Norwegian (Bokmal) (Norway) */
+ {0x0415, "pl"}, /* Polish (Poland) */
+ {0x0416, "pt"}, /* Portuguese (Brazil) */
+ {0x0417, "rm"}, /* Romansh (Switzerland) */
+ {0x0418, "ro"}, /* Romanian (Romania) */
+ {0x0419, "ru"}, /* Russian (Russia) */
+ {0x041A, "hr"}, /* Croatian (Croatia) */
+ {0x041B, "sk"}, /* Slovak (Slovakia) */
+ {0x041C, "sq"}, /* Albanian (Albania) */
+ {0x041D, "sv"}, /* Swedish (Sweden) */
+ {0x041E, "th"}, /* Thai (Thailand) */
+ {0x041F, "tr"}, /* Turkish (Turkey) */
+ {0x0420, "ur"}, /* Urdu (Islamic Republic of Pakistan) */
+ {0x0421, "id"}, /* Indonesian (Indonesia) */
+ {0x0422, "uk"}, /* Ukrainian (Ukraine) */
+ {0x0423, "be"}, /* Belarusian (Belarus) */
+ {0x0424, "sl"}, /* Slovenian (Slovenia) */
+ {0x0425, "et"}, /* Estonian (Estonia) */
+ {0x0426, "lv"}, /* Latvian (Latvia) */
+ {0x0427, "lt"}, /* Lithuanian (Lithuania) */
+ {0x0428, "tg"}, /* Tajik (Cyrillic) (Tajikistan) */
+ {0x0429, "fa"}, /* Persian (Iran) */
+ {0x042A, "vi"}, /* Vietnamese (Vietnam) */
+ {0x042B, "hy"}, /* Armenian (Armenia) */
+ {0x042C, "az"}, /* Azeri (Latin) (Azerbaijan) */
+ {0x042D, "eu"}, /* Basque (Basque) */
+ {0x042E, "hsb"}, /* Upper Sorbian (Germany) */
+ {0x042F, "mk"}, /* Macedonian (FYROM) (Former Yugoslav Republic of Macedonia) */
+ {0x0430, "st"}, /* ??? */
+ {0x0431, "ts"}, /* ??? */
+ {0x0432, "tn"}, /* Setswana (South Africa) */
+ {0x0433, "ven"}, /* ??? */
+ {0x0434, "xh"}, /* isiXhosa (South Africa) */
+ {0x0435, "zu"}, /* isiZulu (South Africa) */
+ {0x0436, "af"}, /* Afrikaans (South Africa) */
+ {0x0437, "ka"}, /* Georgian (Georgia) */
+ {0x0438, "fo"}, /* Faroese (Faroe Islands) */
+ {0x0439, "hi"}, /* Hindi (India) */
+ {0x043A, "mt"}, /* Maltese (Malta) */
+ {0x043B, "se"}, /* Sami (Northern) (Norway) */
+ {0x043C, "ga"}, /* ??? */
+ {0x043D, "yi"}, /* ??? */
+ {0x043E, "ms"}, /* Malay (Malaysia) */
+ {0x043F, "kk"}, /* Kazakh (Kazakhstan) */
+ {0x0440, "ky"}, /* Kyrgyz (Kyrgyzstan) */
+ {0x0441, "sw"}, /* Kiswahili (Kenya) */
+ {0x0442, "tk"}, /* Turkmen (Turkmenistan) */
+ {0x0443, "uz"}, /* Uzbek (Latin) (Uzbekistan) */
+ {0x0444, "tt"}, /* Tatar (Russia) */
+ {0x0445, "bn"}, /* Bengali (India) */
+ {0x0446, "pa"}, /* Punjabi (India) */
+ {0x0447, "gu"}, /* Gujarati (India) */
+ {0x0448, "or"}, /* Odia (formerly Oriya) (India) */
+ {0x0449, "ta"}, /* Tamil (India) */
+ {0x044A, "te"}, /* Telugu (India) */
+ {0x044B, "kn"}, /* Kannada (India) */
+ {0x044C, "ml"}, /* Malayalam (India) */
+ {0x044D, "as"}, /* Assamese (India) */
+ {0x044E, "mr"}, /* Marathi (India) */
+ {0x044F, "sa"}, /* Sanskrit (India) */
+ {0x0450, "mn"}, /* Mongolian (Cyrillic) (Mongolia) */
+ {0x0451, "bo"}, /* Tibetan (PRC) */
+ {0x0452, "cy"}, /* Welsh (United Kingdom) */
+ {0x0453, "km"}, /* Khmer (Cambodia) */
+ {0x0454, "lo"}, /* Lao (Lao P.D.R.) */
+ {0x0455, "my"}, /* ??? */
+ {0x0456, "gl"}, /* Galician (Galician) */
+ {0x0457, "kok"}, /* Konkani (India) */
+ {0x0458, "mni"}, /* ??? */
+ {0x0459, "sd"}, /* ??? */
+ {0x045A, "syr"}, /* Syriac (Syria) */
+ {0x045B, "si"}, /* Sinhala (Sri Lanka) */
+ {0x045C, "chr"}, /* ??? */
+ {0x045D, "iu"}, /* Inuktitut (Canada) */
+ {0x045E, "am"}, /* Amharic (Ethiopia) */
+ {0x0460, "ks"}, /* ??? */
+ {0x0461, "ne"}, /* Nepali (Nepal) */
+ {0x0462, "fy"}, /* Frisian (Netherlands) */
+ {0x0463, "ps"}, /* Pashto (Afghanistan) */
+ {0x0464, "phi"}, /* Filipino (Philippines) */
+ {0x0465, "div"}, /* Divehi (Maldives) */
+ {0x0468, "ha"}, /* Hausa (Latin) (Nigeria) */
+ {0x046A, "yo"}, /* Yoruba (Nigeria) */
+ {0x046B, "quz"}, /* Quechua (Bolivia) */
+ {0x046C, "nso"}, /* Sesotho sa Leboa (South Africa) */
+ {0x046D, "ba"}, /* Bashkir (Russia) */
+ {0x046E, "lb"}, /* Luxembourgish (Luxembourg) */
+ {0x046F, "kl"}, /* Greenlandic (Greenland) */
+ {0x0470, "ibo"}, /* Igbo (Nigeria) */
+ {0x0471, "kau"}, /* ??? */
+ {0x0472, "om"}, /* ??? */
+ {0x0473, "ti"}, /* ??? */
+ {0x0474, "gn"}, /* ??? */
+ {0x0475, "haw"}, /* ??? */
+ {0x0476, "la"}, /* ??? */
+ {0x0477, "so"}, /* ??? */
+ {0x0478, "ii"}, /* Yi (PRC) */
+ {0x0479, "pap"}, /* ??? */
+ {0x047A, "arn"}, /* Mapudungun (Chile) */
+ {0x047C, "moh"}, /* Mohawk (Mohawk) */
+ {0x047E, "br"}, /* Breton (France) */
+ {0x0480, "ug"}, /* Uighur (PRC) */
+ {0x0481, "mi"}, /* Maori (New Zealand) */
+ {0x0482, "oc"}, /* Occitan (France) */
+ {0x0483, "co"}, /* Corsican (France) */
+ {0x0484, "gsw"}, /* Alsatian (France) */
+ {0x0485, "sah"}, /* Yakut (Russia) */
+ {0x0486, "qut"}, /* K'iche (Guatemala) */
+ {0x0487, "rw"}, /* Kinyarwanda (Rwanda) */
+ {0x0488, "wo"}, /* Wolof (Senegal) */
+ {0x048C, "fa"}, /* Dari (Afghanistan) */
+ {0x0801, "ar"}, /* Arabic (Iraq) */
+ {0x0804, "zh-cn"}, /* Chinese (People’s Republic of China) */
+ {0x0807, "de"}, /* German (Switzerland) */
+ {0x0809, "en"}, /* English (United Kingdom) */
+ {0x080A, "es"}, /* Spanish (Mexico) */
+ {0x080C, "fr"}, /* French (Belgium) */
+ {0x0810, "it"}, /* Italian (Switzerland) */
+ {0x0812, "ko"}, /* ??? */
+ {0x0813, "nl"}, /* Dutch (Belgium) */
+ {0x0814, "nn"}, /* Norwegian (Nynorsk) (Norway) */
+ {0x0816, "pt"}, /* Portuguese (Portugal) */
+ {0x0818, "mo"}, /* ??? */
+ {0x0819, "ru"}, /* ??? */
+ {0x081A, "sr"}, /* Serbian (Latin) (Serbia) */
+ {0x081D, "sv"}, /* Sweden (Finland) */
+ {0x0820, "ur"}, /* ??? */
+ {0x0827, "lt"}, /* ??? */
+ {0x082C, "az"}, /* Azeri (Cyrillic) (Azerbaijan) */
+ {0x082E, "dsb"}, /* Lower Sorbian (Germany) */
+//{0x083B, ""}, /* Sami (Northern) (Sweden) */
+ {0x083C, "gd"}, /* Irish (Ireland) */
+ {0x083E, "ms"}, /* Malay (Brunei Darussalam) */
+ {0x0843, "uz"}, /* Uzbek (Cyrillic) (Uzbekistan) */
+ {0x0845, "bn"}, /* Bengali (Bangladesh) */
+ {0x0846, "ar"}, /* ??? */
+ {0x0850, "mn"}, /* Mongolian (Traditional) (People’s Republic of China) */
+ {0x0851, "dz"}, /* ??? */
+ {0x085D, "iu"}, /* Inuktitut (Latin) (Canada) */
+ {0x085F, "tzm"}, /* Tamazight (Latin) (Algeria) */
+ {0x0861, "ne"}, /* ??? */
+//{0x086B, ""}, /* Quechua (Ecuador) */
+ {0x0873, "ti"}, /* ??? */
+ {0x0C01, "ar"}, /* Arabic (Egypt) */
+ {0x0C04, "zh-hk"}, /* Chinese (Hong Kong S.A.R.) */
+ {0x0C07, "de"}, /* German (Austria) */
+ {0x0C09, "en"}, /* English (Australia) */
+ {0x0C0A, "es"}, /* Spanish (Modern Sort) (Spain) */
+ {0x0C0C, "fr"}, /* French (Canada) */
+ {0x0C1A, "sr"}, /* Serbian (Cyrillic) (Serbia) */
+ {0x0C3B, "se"}, /* Sami (Northern) (Finland) */
+//{0x0C6B, ""}, /* Quechua (Peru) */
+ {0x1001, "ar"}, /* Arabic (Libya) */
+ {0x1004, "zh-sg"}, /* Chinese (Singapore) */
+ {0x1007, "de"}, /* German (Luxembourg) */
+ {0x1009, "en"}, /* English (Canada) */
+ {0x100A, "es"}, /* Spanish (Guatemala) */
+ {0x100C, "fr"}, /* French (Switzerland) */
+ {0x101A, "hr"}, /* Croatian (Latin) (Bosnia and Herzegovina) */
+ {0x103B, "smj"}, /* Sami (Lule) (Norway) */
+ {0x1401, "ar"}, /* Arabic (Algeria) */
+//{0x1404, ""}, /* Chinese (Macao S.A.R.) */
+ {0x1407, "de"}, /* German (Liechtenstein) */
+ {0x1409, "en"}, /* English (New Zealand) */
+ {0x140A, "es"}, /* Spanish (Costa Rica) */
+ {0x140C, "fr"}, /* French (Luxembourg) */
+ {0x141A, "bs"}, /* Bosnian (Latin) (Bosnia and Herzegovina) */
+//{0x143B, ""}, /* Sami (Lule) (Sweden) */
+ {0x1801, "ar"}, /* Arabic (Morocco) */
+ {0x1809, "en"}, /* English (Ireland) */
+ {0x180A, "es"}, /* Spanish (Panama) */
+ {0x180C, "fr"}, /* French (Principality of Monaco) */
+//{0x181A, ""}, /* Serbian (Latin) (Bosnia and Herzegovina) */
+ {0x183B, "sma"}, /* Sami (Southern) (Norway) */
+ {0x1C01, "ar"}, /* Arabic (Tunisia) */
+ {0x1C09, "en"}, /* English (South Africa) */
+ {0x1C0A, "es"}, /* Spanish (Dominican Republic) */
+ {0x1C0C, "fr"}, /* ??? */
+//{0x1C1A, ""}, /* Serbian (Cyrillic) (Bosnia and Herzegovina) */
+//{0x1C3B, ""}, /* Sami (Southern) (Sweden) */
+ {0x2001, "ar"}, /* Arabic (Oman) */
+ {0x2009, "en"}, /* English (Jamaica) */
+ {0x200A, "es"}, /* Spanish (Venezuela) */
+ {0x200C, "fr"}, /* ??? */
+ {0x201A, "bs"}, /* Bosnian (Cyrillic) (Bosnia and Herzegovina) */
+ {0x203B, "sms"}, /* Sami (Skolt) (Finland) */
+ {0x2401, "ar"}, /* Arabic (Yemen) */
+ {0x2409, "en"}, /* English (Caribbean) */
+ {0x240A, "es"}, /* Spanish (Colombia) */
+ {0x240C, "fr"}, /* ??? */
+ {0x243B, "smn"}, /* Sami (Inari) (Finland) */
+ {0x2801, "ar"}, /* Arabic (Syria) */
+ {0x2809, "en"}, /* English (Belize) */
+ {0x280A, "es"}, /* Spanish (Peru) */
+ {0x280C, "fr"}, /* ??? */
+ {0x2C01, "ar"}, /* Arabic (Jordan) */
+ {0x2C09, "en"}, /* English (Trinidad and Tobago) */
+ {0x2C0A, "es"}, /* Spanish (Argentina) */
+ {0x2C0C, "fr"}, /* ??? */
+ {0x3001, "ar"}, /* Arabic (Lebanon) */
+ {0x3009, "en"}, /* English (Zimbabwe) */
+ {0x300A, "es"}, /* Spanish (Ecuador) */
+ {0x300C, "fr"}, /* ??? */
+ {0x3401, "ar"}, /* Arabic (Kuwait) */
+ {0x3409, "en"}, /* English (Republic of the Philippines) */
+ {0x340A, "es"}, /* Spanish (Chile) */
+ {0x340C, "fr"}, /* ??? */
+ {0x3801, "ar"}, /* Arabic (U.A.E.) */
+ {0x380A, "es"}, /* Spanish (Uruguay) */
+ {0x380C, "fr"}, /* ??? */
+ {0x3C01, "ar"}, /* Arabic (Bahrain) */
+ {0x3C09, "en"}, /* ??? */
+ {0x3C0A, "es"}, /* Spanish (Paraguay) */
+ {0x3C0C, "fr"}, /* ??? */
+ {0x4001, "ar"}, /* Arabic (Qatar) */
+ {0x4009, "en"}, /* English (India) */
+ {0x400A, "es"}, /* Spanish (Bolivia) */
+ {0x4409, "en"}, /* English (Malaysia) */
+ {0x440A, "es"}, /* Spanish (El Salvador) */
+ {0x4809, "en"}, /* English (Singapore) */
+ {0x480A, "es"}, /* Spanish (Honduras) */
+ {0x4C0A, "es"}, /* Spanish (Nicaragua) */
+ {0x500A, "es"}, /* Spanish (Puerto Rico) */
+ {0x540A, "es"}, /* Spanish (United States) */
+ {0xE40A, "es"}, /* ??? */
+ {0xE40C, "fr"}, /* ??? */
+};
+
+static const hb_ot_language_map_t
+hb_mac_language_map[] =
+{
+ { 0, "en"}, /* English */
+ { 1, "fr"}, /* French */
+ { 2, "de"}, /* German */
+ { 3, "it"}, /* Italian */
+ { 4, "nl"}, /* Dutch */
+ { 5, "sv"}, /* Swedish */
+ { 6, "es"}, /* Spanish */
+ { 7, "da"}, /* Danish */
+ { 8, "pt"}, /* Portuguese */
+ { 9, "no"}, /* Norwegian */
+ { 10, "he"}, /* Hebrew */
+ { 11, "ja"}, /* Japanese */
+ { 12, "ar"}, /* Arabic */
+ { 13, "fi"}, /* Finnish */
+ { 14, "el"}, /* Greek */
+ { 15, "is"}, /* Icelandic */
+ { 16, "mt"}, /* Maltese */
+ { 17, "tr"}, /* Turkish */
+ { 18, "hr"}, /* Croatian */
+ { 19, "zh-tw"}, /* Chinese (Traditional) */
+ { 20, "ur"}, /* Urdu */
+ { 21, "hi"}, /* Hindi */
+ { 22, "th"}, /* Thai */
+ { 23, "ko"}, /* Korean */
+ { 24, "lt"}, /* Lithuanian */
+ { 25, "pl"}, /* Polish */
+ { 26, "hu"}, /* Hungarian */
+ { 27, "et"}, /* Estonian */
+ { 28, "lv"}, /* Latvian */
+//{ 29, ""}, /* Sami */
+ { 30, "fo"}, /* Faroese */
+ { 31, "fa"}, /* Farsi/Persian */
+ { 32, "ru"}, /* Russian */
+ { 33, "zh-cn"}, /* Chinese (Simplified) */
+ { 34, "nl"}, /* Flemish */
+ { 35, "ga"}, /* Irish Gaelic */
+ { 36, "sq"}, /* Albanian */
+ { 37, "ro"}, /* Romanian */
+ { 38, "cs"}, /* Czech */
+ { 39, "sk"}, /* Slovak */
+ { 40, "sl"}, /* Slovenian */
+ { 41, "yi"}, /* Yiddish */
+ { 42, "sr"}, /* Serbian */
+ { 43, "mk"}, /* Macedonian */
+ { 44, "bg"}, /* Bulgarian */
+ { 45, "uk"}, /* Ukrainian */
+ { 46, "be"}, /* Byelorussian */
+ { 47, "uz"}, /* Uzbek */
+ { 48, "kk"}, /* Kazakh */
+ { 49, "az"}, /* Azerbaijani (Cyrillic script) */
+ { 50, "az"}, /* Azerbaijani (Arabic script) */
+ { 51, "hy"}, /* Armenian */
+ { 52, "ka"}, /* Georgian */
+ { 53, "mo"}, /* Moldavian */
+ { 54, "ky"}, /* Kirghiz */
+ { 55, "tg"}, /* Tajiki */
+ { 56, "tk"}, /* Turkmen */
+ { 57, "mn"}, /* Mongolian (Mongolian script) */
+ { 58, "mn"}, /* Mongolian (Cyrillic script) */
+ { 59, "ps"}, /* Pashto */
+ { 60, "ku"}, /* Kurdish */
+ { 61, "ks"}, /* Kashmiri */
+ { 62, "sd"}, /* Sindhi */
+ { 63, "bo"}, /* Tibetan */
+ { 64, "ne"}, /* Nepali */
+ { 65, "sa"}, /* Sanskrit */
+ { 66, "mr"}, /* Marathi */
+ { 67, "bn"}, /* Bengali */
+ { 68, "as"}, /* Assamese */
+ { 69, "gu"}, /* Gujarati */
+ { 70, "pa"}, /* Punjabi */
+ { 71, "or"}, /* Oriya */
+ { 72, "ml"}, /* Malayalam */
+ { 73, "kn"}, /* Kannada */
+ { 74, "ta"}, /* Tamil */
+ { 75, "te"}, /* Telugu */
+ { 76, "si"}, /* Sinhalese */
+ { 77, "my"}, /* Burmese */
+ { 78, "km"}, /* Khmer */
+ { 79, "lo"}, /* Lao */
+ { 80, "vi"}, /* Vietnamese */
+ { 81, "id"}, /* Indonesian */
+ { 82, "tl"}, /* Tagalog */
+ { 83, "ms"}, /* Malay (Roman script) */
+ { 84, "ms"}, /* Malay (Arabic script) */
+ { 85, "am"}, /* Amharic */
+ { 86, "ti"}, /* Tigrinya */
+ { 87, "om"}, /* Galla */
+ { 88, "so"}, /* Somali */
+ { 89, "sw"}, /* Swahili */
+ { 90, "rw"}, /* Kinyarwanda/Ruanda */
+ { 91, "rn"}, /* Rundi */
+ { 92, "ny"}, /* Nyanja/Chewa */
+ { 93, "mg"}, /* Malagasy */
+ { 94, "eo"}, /* Esperanto */
+ {128, "cy"}, /* Welsh */
+ {129, "eu"}, /* Basque */
+ {130, "ca"}, /* Catalan */
+ {131, "la"}, /* Latin */
+ {132, "qu"}, /* Quechua */
+ {133, "gn"}, /* Guarani */
+ {134, "ay"}, /* Aymara */
+ {135, "tt"}, /* Tatar */
+ {136, "ug"}, /* Uighur */
+ {137, "dz"}, /* Dzongkha */
+ {138, "jw"}, /* Javanese (Roman script) */
+ {139, "su"}, /* Sundanese (Roman script) */
+ {140, "gl"}, /* Galician */
+ {141, "af"}, /* Afrikaans */
+ {142, "br"}, /* Breton */
+ {143, "iu"}, /* Inuktitut */
+ {144, "gd"}, /* Scottish Gaelic */
+ {145, "gv"}, /* Manx Gaelic */
+ {146, "ga"}, /* Irish Gaelic (with dot above) */
+ {147, "to"}, /* Tongan */
+ {148, "el"}, /* Greek (polytonic) */
+ {149, "ik"}, /* Greenlandic */
+ {150, "az"}, /* Azerbaijani (Roman script) */
+};
+
+
+static hb_language_t
+_hb_ot_name_language_for (unsigned int code,
+ const hb_ot_language_map_t *array,
+ unsigned int len)
+{
+#ifdef HB_NO_OT_NAME_LANGUAGE
+ return HB_LANGUAGE_INVALID;
+#endif
+ const hb_ot_language_map_t *entry = (const hb_ot_language_map_t *)
+ hb_bsearch (&code,
+ array,
+ len,
+ sizeof (array[0]),
+ hb_ot_language_map_t::cmp);
+
+ if (entry)
+ return hb_language_from_string (entry->lang, -1);
+
+ return HB_LANGUAGE_INVALID;
+}
+
+hb_language_t
+_hb_ot_name_language_for_ms_code (unsigned int code)
+{
+ return _hb_ot_name_language_for (code,
+ hb_ms_language_map,
+ ARRAY_LENGTH (hb_ms_language_map));
+}
+
+hb_language_t
+_hb_ot_name_language_for_mac_code (unsigned int code)
+{
+ return _hb_ot_name_language_for (code,
+ hb_mac_language_map,
+ ARRAY_LENGTH (hb_mac_language_map));
+}
+
+#endif /* HB_OT_NAME_LANGUAGE_STATIC_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-name-language.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-name-language.hh
new file mode 100644
index 0000000000..903076c0d5
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-name-language.hh
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_NAME_LANGUAGE_HH
+#define HB_OT_NAME_LANGUAGE_HH
+
+#include "hb.hh"
+
+
+HB_INTERNAL hb_language_t
+_hb_ot_name_language_for_ms_code (unsigned int code);
+
+HB_INTERNAL hb_language_t
+_hb_ot_name_language_for_mac_code (unsigned int code);
+
+
+#endif /* HB_OT_NAME_LANGUAGE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-name-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-name-table.hh
index 4c5b3c0f98..84be04c8bf 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-name-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-name-table.hh
@@ -27,110 +27,311 @@
#ifndef HB_OT_NAME_TABLE_HH
#define HB_OT_NAME_TABLE_HH
-#include "hb-open-type-private.hh"
+#include "hb-open-type.hh"
+#include "hb-ot-name-language.hh"
+#include "hb-aat-layout.hh"
namespace OT {
+#define entry_score var.u16[0]
+#define entry_index var.u16[1]
+
+
/*
- * name -- The Naming Table
+ * name -- Naming
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/name
*/
-
#define HB_OT_TAG_name HB_TAG('n','a','m','e')
+#define UNSUPPORTED 42
struct NameRecord
{
- static int cmp (const void *pa, const void *pb)
+ hb_language_t language (hb_face_t *face) const
+ {
+#ifndef HB_NO_OT_NAME_LANGUAGE
+ unsigned int p = platformID;
+ unsigned int l = languageID;
+
+ if (p == 3)
+ return _hb_ot_name_language_for_ms_code (l);
+
+ if (p == 1)
+ return _hb_ot_name_language_for_mac_code (l);
+
+#ifndef HB_NO_OT_NAME_LANGUAGE_AAT
+ if (p == 0)
+ return face->table.ltag->get_language (l);
+#endif
+
+#endif
+ return HB_LANGUAGE_INVALID;
+ }
+
+ uint16_t score () const
{
- const NameRecord *a = (const NameRecord *) pa;
- const NameRecord *b = (const NameRecord *) pb;
- int ret;
- ret = b->platformID.cmp (a->platformID);
- if (ret) return ret;
- ret = b->encodingID.cmp (a->encodingID);
- if (ret) return ret;
- ret = b->languageID.cmp (a->languageID);
- if (ret) return ret;
- ret = b->nameID.cmp (a->nameID);
- if (ret) return ret;
- return 0;
+ /* Same order as in cmap::find_best_subtable(). */
+ unsigned int p = platformID;
+ unsigned int e = encodingID;
+
+ /* 32-bit. */
+ if (p == 3 && e == 10) return 0;
+ if (p == 0 && e == 6) return 1;
+ if (p == 0 && e == 4) return 2;
+
+ /* 16-bit. */
+ if (p == 3 && e == 1) return 3;
+ if (p == 0 && e == 3) return 4;
+ if (p == 0 && e == 2) return 5;
+ if (p == 0 && e == 1) return 6;
+ if (p == 0 && e == 0) return 7;
+
+ /* Symbol. */
+ if (p == 3 && e == 0) return 8;
+
+ /* We treat all Mac Latin names as ASCII only. */
+ if (p == 1 && e == 0) return 10; /* 10 is magic number :| */
+
+ return UNSUPPORTED;
}
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ NameRecord* copy (hb_serialize_context_t *c,
+ const void *src_base,
+ const void *dst_base) const
+ {
+ TRACE_SERIALIZE (this);
+ auto *out = c->embed (this);
+ if (unlikely (!out)) return_trace (nullptr);
+ out->offset.serialize_copy (c, offset, src_base, dst_base, length);
+ return_trace (out);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c, const void *base) const
{
TRACE_SANITIZE (this);
- /* We can check from base all the way up to the end of string... */
- return_trace (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset));
+ return_trace (c->check_struct (this) && offset.sanitize (c, base, length));
}
- UINT16 platformID; /* Platform ID. */
- UINT16 encodingID; /* Platform-specific encoding ID. */
- UINT16 languageID; /* Language ID. */
- UINT16 nameID; /* Name ID. */
- UINT16 length; /* String length (in bytes). */
- UINT16 offset; /* String offset from start of storage area (in bytes). */
+ HBUINT16 platformID; /* Platform ID. */
+ HBUINT16 encodingID; /* Platform-specific encoding ID. */
+ HBUINT16 languageID; /* Language ID. */
+ HBUINT16 nameID; /* Name ID. */
+ HBUINT16 length; /* String length (in bytes). */
+ NNOffsetTo<UnsizedArrayOf<HBUINT8>>
+ offset; /* String offset from start of storage area (in bytes). */
public:
DEFINE_SIZE_STATIC (12);
};
+static int
+_hb_ot_name_entry_cmp_key (const void *pa, const void *pb)
+{
+ const hb_ot_name_entry_t *a = (const hb_ot_name_entry_t *) pa;
+ const hb_ot_name_entry_t *b = (const hb_ot_name_entry_t *) pb;
+
+ /* Compare by name_id, then language. */
+
+ if (a->name_id != b->name_id)
+ return a->name_id < b->name_id ? -1 : +1;
+
+ if (a->language == b->language) return 0;
+ if (!a->language) return -1;
+ if (!b->language) return +1;
+ return strcmp (hb_language_to_string (a->language),
+ hb_language_to_string (b->language));
+}
+
+static int
+_hb_ot_name_entry_cmp (const void *pa, const void *pb)
+{
+ /* Compare by name_id, then language, then score, then index. */
+
+ int v = _hb_ot_name_entry_cmp_key (pa, pb);
+ if (v)
+ return v;
+
+ const hb_ot_name_entry_t *a = (const hb_ot_name_entry_t *) pa;
+ const hb_ot_name_entry_t *b = (const hb_ot_name_entry_t *) pb;
+
+ if (a->entry_score != b->entry_score)
+ return a->entry_score < b->entry_score ? -1 : +1;
+
+ if (a->entry_index != b->entry_index)
+ return a->entry_index < b->entry_index ? -1 : +1;
+
+ return 0;
+}
+
struct name
{
- static const hb_tag_t tableTag = HB_OT_TAG_name;
-
- inline unsigned int get_name (unsigned int platform_id,
- unsigned int encoding_id,
- unsigned int language_id,
- unsigned int name_id,
- void *buffer,
- unsigned int buffer_length) const
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_name;
+
+ unsigned int get_size () const
+ { return min_size + count * nameRecordZ.item_size; }
+
+ template <typename Iterator,
+ hb_requires (hb_is_source_of (Iterator, const NameRecord &))>
+ bool serialize (hb_serialize_context_t *c,
+ Iterator it,
+ const void *src_string_pool)
{
- NameRecord key;
- key.platformID.set (platform_id);
- key.encodingID.set (encoding_id);
- key.languageID.set (language_id);
- key.nameID.set (name_id);
- NameRecord *match = (NameRecord *) bsearch (&key, nameRecord, count, sizeof (nameRecord[0]), NameRecord::cmp);
-
- if (!match)
- return 0;
-
- unsigned int length = MIN (buffer_length, (unsigned int) match->length);
- memcpy (buffer, (char *) this + stringOffset + match->offset, length);
- return length;
+ TRACE_SERIALIZE (this);
+
+ if (unlikely (!c->extend_min ((*this)))) return_trace (false);
+
+ this->format = 0;
+ this->count = it.len ();
+
+ auto snap = c->snapshot ();
+ this->nameRecordZ.serialize (c, this->count);
+ if (unlikely (!c->check_assign (this->stringOffset, c->length ()))) return_trace (false);
+ c->revert (snap);
+
+ const void *dst_string_pool = &(this + this->stringOffset);
+
+ for (const auto &_ : it) c->copy (_, src_string_pool, dst_string_pool);
+
+ if (unlikely (c->ran_out_of_room)) return_trace (false);
+
+ assert (this->stringOffset == c->length ());
+
+ return_trace (true);
}
- inline unsigned int get_size (void) const
- { return min_size + count * nameRecord[0].min_size; }
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+
+ name *name_prime = c->serializer->start_embed<name> ();
+ if (unlikely (!name_prime)) return_trace (false);
+
+ auto it =
+ + nameRecordZ.as_array (count)
+ | hb_filter (c->plan->name_ids, &NameRecord::nameID)
+ ;
+
+ name_prime->serialize (c->serializer, it, hb_addressof (this + stringOffset));
+ return_trace (name_prime->count);
+ }
- inline bool sanitize_records (hb_sanitize_context_t *c) const {
+ bool sanitize_records (hb_sanitize_context_t *c) const
+ {
TRACE_SANITIZE (this);
- char *string_pool = (char *) this + stringOffset;
- unsigned int _count = count;
- for (unsigned int i = 0; i < _count; i++)
- if (!nameRecord[i].sanitize (c, string_pool)) return_trace (false);
- return_trace (true);
+ const void *string_pool = (this+stringOffset).arrayZ;
+ return_trace (nameRecordZ.sanitize (c, count, string_pool));
}
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
likely (format == 0 || format == 1) &&
- c->check_array (nameRecord, nameRecord[0].static_size, count) &&
+ c->check_array (nameRecordZ.arrayZ, count) &&
+ c->check_range (this, stringOffset) &&
sanitize_records (c));
}
+ struct accelerator_t
+ {
+ void init (hb_face_t *face)
+ {
+ this->table = hb_sanitize_context_t().reference_table<name> (face);
+ assert (this->table.get_length () >= this->table->stringOffset);
+ this->pool = (const char *) (const void *) (this->table+this->table->stringOffset);
+ this->pool_len = this->table.get_length () - this->table->stringOffset;
+ const hb_array_t<const NameRecord> all_names (this->table->nameRecordZ.arrayZ,
+ this->table->count);
+
+ this->names.init ();
+ this->names.alloc (all_names.length);
+
+ for (unsigned int i = 0; i < all_names.length; i++)
+ {
+ hb_ot_name_entry_t *entry = this->names.push ();
+
+ entry->name_id = all_names[i].nameID;
+ entry->language = all_names[i].language (face);
+ entry->entry_score = all_names[i].score ();
+ entry->entry_index = i;
+ }
+
+ this->names.qsort (_hb_ot_name_entry_cmp);
+ /* Walk and pick best only for each name_id,language pair,
+ * while dropping unsupported encodings. */
+ unsigned int j = 0;
+ for (unsigned int i = 0; i < this->names.length; i++)
+ {
+ if (this->names[i].entry_score == UNSUPPORTED ||
+ this->names[i].language == HB_LANGUAGE_INVALID)
+ continue;
+ if (i &&
+ this->names[i - 1].name_id == this->names[i].name_id &&
+ this->names[i - 1].language == this->names[i].language)
+ continue;
+ this->names[j++] = this->names[i];
+ }
+ this->names.resize (j);
+ }
+
+ void fini ()
+ {
+ this->names.fini ();
+ this->table.destroy ();
+ }
+
+ int get_index (hb_ot_name_id_t name_id,
+ hb_language_t language,
+ unsigned int *width=nullptr) const
+ {
+ const hb_ot_name_entry_t key = {name_id, {0}, language};
+ const hb_ot_name_entry_t *entry = (const hb_ot_name_entry_t *)
+ hb_bsearch (&key,
+ (const hb_ot_name_entry_t *) this->names,
+ this->names.length,
+ sizeof (key),
+ _hb_ot_name_entry_cmp_key);
+ if (!entry)
+ return -1;
+
+ if (width)
+ *width = entry->entry_score < 10 ? 2 : 1;
+
+ return entry->entry_index;
+ }
+
+ hb_bytes_t get_name (unsigned int idx) const
+ {
+ const hb_array_t<const NameRecord> all_names (table->nameRecordZ.arrayZ, table->count);
+ const NameRecord &record = all_names[idx];
+ const hb_bytes_t string_pool (pool, pool_len);
+ return string_pool.sub_array (record.offset, record.length);
+ }
+
+ private:
+ const char *pool;
+ unsigned int pool_len;
+ public:
+ hb_blob_ptr_t<name> table;
+ hb_vector_t<hb_ot_name_entry_t> names;
+ };
+
/* We only implement format 0 for now. */
- UINT16 format; /* Format selector (=0/1). */
- UINT16 count; /* Number of name records. */
- Offset16 stringOffset; /* Offset to start of string storage (from start of table). */
- NameRecord nameRecord[VAR]; /* The name records where count is the number of records. */
+ HBUINT16 format; /* Format selector (=0/1). */
+ HBUINT16 count; /* Number of name records. */
+ NNOffsetTo<UnsizedArrayOf<HBUINT8>>
+ stringOffset; /* Offset to start of string storage (from start of table). */
+ UnsizedArrayOf<NameRecord>
+ nameRecordZ; /* The name records where count is the number of records. */
public:
- DEFINE_SIZE_ARRAY (6, nameRecord);
+ DEFINE_SIZE_ARRAY (6, nameRecordZ);
};
+#undef entry_index
+#undef entry_score
+
+struct name_accelerator_t : name::accelerator_t {};
} /* namespace OT */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-name.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-name.cc
new file mode 100644
index 0000000000..10122b8c2e
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-name.cc
@@ -0,0 +1,228 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_NAME
+
+#include "hb-ot-name-table.hh"
+
+#include "hb-utf.hh"
+
+
+/**
+ * SECTION:hb-ot-name
+ * @title: hb-ot-name
+ * @short_description: OpenType font name information
+ * @include: hb-ot.h
+ *
+ * Functions for fetching name strings from OpenType fonts.
+ **/
+
+
+/**
+ * hb_ot_name_list_names:
+ * @face: font face.
+ * @num_entries: (out) (allow-none): number of returned entries.
+ *
+ * Enumerates all available name IDs and language combinations. Returned
+ * array is owned by the @face and should not be modified. It can be
+ * used as long as @face is alive.
+ *
+ * Returns: (out) (transfer none) (array length=num_entries): Array of available name entries.
+ * Since: 2.1.0
+ **/
+const hb_ot_name_entry_t *
+hb_ot_name_list_names (hb_face_t *face,
+ unsigned int *num_entries /* OUT */)
+{
+ const OT::name_accelerator_t &name = *face->table.name;
+ if (num_entries) *num_entries = name.names.length;
+ return (const hb_ot_name_entry_t *) name.names;
+}
+
+
+template <typename in_utf_t, typename out_utf_t>
+static inline unsigned int
+hb_ot_name_convert_utf (hb_bytes_t bytes,
+ unsigned int *text_size /* IN/OUT */,
+ typename out_utf_t::codepoint_t *text /* OUT */)
+{
+ unsigned int src_len = bytes.length / sizeof (typename in_utf_t::codepoint_t);
+ const typename in_utf_t::codepoint_t *src = (const typename in_utf_t::codepoint_t *) bytes.arrayZ;
+ const typename in_utf_t::codepoint_t *src_end = src + src_len;
+
+ typename out_utf_t::codepoint_t *dst = text;
+
+ hb_codepoint_t unicode;
+ const hb_codepoint_t replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT;
+
+ if (text_size && *text_size)
+ {
+ (*text_size)--; /* Same room for NUL-termination. */
+ const typename out_utf_t::codepoint_t *dst_end = text + *text_size;
+
+ while (src < src_end && dst < dst_end)
+ {
+ const typename in_utf_t::codepoint_t *src_next = in_utf_t::next (src, src_end, &unicode, replacement);
+ typename out_utf_t::codepoint_t *dst_next = out_utf_t::encode (dst, dst_end, unicode);
+ if (dst_next == dst)
+ break; /* Out-of-room. */
+
+ dst = dst_next;
+ src = src_next;
+ }
+
+ *text_size = dst - text;
+ *dst = 0; /* NUL-terminate. */
+ }
+
+ /* Accumulate length of rest. */
+ unsigned int dst_len = dst - text;
+ while (src < src_end)
+ {
+ src = in_utf_t::next (src, src_end, &unicode, replacement);
+ dst_len += out_utf_t::encode_len (unicode);
+ }
+ return dst_len;
+}
+
+template <typename utf_t>
+static inline unsigned int
+hb_ot_name_get_utf (hb_face_t *face,
+ hb_ot_name_id_t name_id,
+ hb_language_t language,
+ unsigned int *text_size /* IN/OUT */,
+ typename utf_t::codepoint_t *text /* OUT */)
+{
+ const OT::name_accelerator_t &name = *face->table.name;
+
+ if (!language)
+ language = hb_language_from_string ("en", 2);
+
+ unsigned int width;
+ int idx = name.get_index (name_id, language, &width);
+ if (idx != -1)
+ {
+ hb_bytes_t bytes = name.get_name (idx);
+
+ if (width == 2) /* UTF16-BE */
+ return hb_ot_name_convert_utf<hb_utf16_be_t, utf_t> (bytes, text_size, text);
+
+ if (width == 1) /* ASCII */
+ return hb_ot_name_convert_utf<hb_ascii_t, utf_t> (bytes, text_size, text);
+ }
+
+ if (text_size)
+ {
+ if (*text_size)
+ *text = 0;
+ *text_size = 0;
+ }
+ return 0;
+}
+
+/**
+ * hb_ot_name_get_utf8:
+ * @face: font face.
+ * @name_id: OpenType name identifier to fetch.
+ * @language: language to fetch the name for.
+ * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ * text written to buffer.
+ * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
+ *
+ * Fetches a font name from the OpenType 'name' table.
+ * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
+ * Returns string in UTF-8 encoding.
+ *
+ * Returns: full length of the requested string, or 0 if not found.
+ * Since: 2.1.0
+ **/
+unsigned int
+hb_ot_name_get_utf8 (hb_face_t *face,
+ hb_ot_name_id_t name_id,
+ hb_language_t language,
+ unsigned int *text_size /* IN/OUT */,
+ char *text /* OUT */)
+{
+ return hb_ot_name_get_utf<hb_utf8_t> (face, name_id, language, text_size,
+ (hb_utf8_t::codepoint_t *) text);
+}
+
+/**
+ * hb_ot_name_get_utf16:
+ * @face: font face.
+ * @name_id: OpenType name identifier to fetch.
+ * @language: language to fetch the name for.
+ * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ * text written to buffer.
+ * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
+ *
+ * Fetches a font name from the OpenType 'name' table.
+ * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
+ * Returns string in UTF-16 encoding.
+ *
+ * Returns: full length of the requested string, or 0 if not found.
+ * Since: 2.1.0
+ **/
+unsigned int
+hb_ot_name_get_utf16 (hb_face_t *face,
+ hb_ot_name_id_t name_id,
+ hb_language_t language,
+ unsigned int *text_size /* IN/OUT */,
+ uint16_t *text /* OUT */)
+{
+ return hb_ot_name_get_utf<hb_utf16_t> (face, name_id, language, text_size, text);
+}
+
+/**
+ * hb_ot_name_get_utf32:
+ * @face: font face.
+ * @name_id: OpenType name identifier to fetch.
+ * @language: language to fetch the name for.
+ * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ * text written to buffer.
+ * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
+ *
+ * Fetches a font name from the OpenType 'name' table.
+ * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
+ * Returns string in UTF-32 encoding.
+ *
+ * Returns: full length of the requested string, or 0 if not found.
+ * Since: 2.1.0
+ **/
+unsigned int
+hb_ot_name_get_utf32 (hb_face_t *face,
+ hb_ot_name_id_t name_id,
+ hb_language_t language,
+ unsigned int *text_size /* IN/OUT */,
+ uint32_t *text /* OUT */)
+{
+ return hb_ot_name_get_utf<hb_utf32_t> (face, name_id, language, text_size, text);
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-name.h b/src/3rdparty/harfbuzz-ng/src/hb-ot-name.h
new file mode 100644
index 0000000000..3b4ad581c7
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-name.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_NAME_H
+#define HB_OT_NAME_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+
+/**
+ * hb_ot_name_id_t:
+ * @HB_OT_NAME_ID_INVALID: Value to represent a nonexistent name ID.
+ *
+ * An integral type representing an OpenType 'name' table name identifier.
+ * There are predefined name IDs, as well as name IDs return from other
+ * API. These can be used to fetch name strings from a font face.
+ *
+ * Since: 2.0.0
+ **/
+enum
+{
+ HB_OT_NAME_ID_COPYRIGHT = 0,
+ HB_OT_NAME_ID_FONT_FAMILY = 1,
+ HB_OT_NAME_ID_FONT_SUBFAMILY = 2,
+ HB_OT_NAME_ID_UNIQUE_ID = 3,
+ HB_OT_NAME_ID_FULL_NAME = 4,
+ HB_OT_NAME_ID_VERSION_STRING = 5,
+ HB_OT_NAME_ID_POSTSCRIPT_NAME = 6,
+ HB_OT_NAME_ID_TRADEMARK = 7,
+ HB_OT_NAME_ID_MANUFACTURER = 8,
+ HB_OT_NAME_ID_DESIGNER = 9,
+ HB_OT_NAME_ID_DESCRIPTION = 10,
+ HB_OT_NAME_ID_VENDOR_URL = 11,
+ HB_OT_NAME_ID_DESIGNER_URL = 12,
+ HB_OT_NAME_ID_LICENSE = 13,
+ HB_OT_NAME_ID_LICENSE_URL = 14,
+/*HB_OT_NAME_ID_RESERVED = 15,*/
+ HB_OT_NAME_ID_TYPOGRAPHIC_FAMILY = 16,
+ HB_OT_NAME_ID_TYPOGRAPHIC_SUBFAMILY = 17,
+ HB_OT_NAME_ID_MAC_FULL_NAME = 18,
+ HB_OT_NAME_ID_SAMPLE_TEXT = 19,
+ HB_OT_NAME_ID_CID_FINDFONT_NAME = 20,
+ HB_OT_NAME_ID_WWS_FAMILY = 21,
+ HB_OT_NAME_ID_WWS_SUBFAMILY = 22,
+ HB_OT_NAME_ID_LIGHT_BACKGROUND = 23,
+ HB_OT_NAME_ID_DARK_BACKGROUND = 24,
+ HB_OT_NAME_ID_VARIATIONS_PS_PREFIX = 25,
+
+ HB_OT_NAME_ID_INVALID = 0xFFFF
+};
+
+typedef unsigned int hb_ot_name_id_t;
+
+
+/**
+ * hb_ot_name_entry_t:
+ * @name_id: name ID
+ * @language: language
+ *
+ * Structure representing a name ID in a particular language.
+ *
+ * Since: 2.1.0
+ **/
+typedef struct hb_ot_name_entry_t
+{
+ hb_ot_name_id_t name_id;
+ /*< private >*/
+ hb_var_int_t var;
+ /*< public >*/
+ hb_language_t language;
+} hb_ot_name_entry_t;
+
+HB_EXTERN const hb_ot_name_entry_t *
+hb_ot_name_list_names (hb_face_t *face,
+ unsigned int *num_entries /* OUT */);
+
+
+HB_EXTERN unsigned int
+hb_ot_name_get_utf8 (hb_face_t *face,
+ hb_ot_name_id_t name_id,
+ hb_language_t language,
+ unsigned int *text_size /* IN/OUT */,
+ char *text /* OUT */);
+
+HB_EXTERN unsigned int
+hb_ot_name_get_utf16 (hb_face_t *face,
+ hb_ot_name_id_t name_id,
+ hb_language_t language,
+ unsigned int *text_size /* IN/OUT */,
+ uint16_t *text /* OUT */);
+
+HB_EXTERN unsigned int
+hb_ot_name_get_utf32 (hb_face_t *face,
+ hb_ot_name_id_t name_id,
+ hb_language_t language,
+ unsigned int *text_size /* IN/OUT */,
+ uint32_t *text /* OUT */);
+
+
+HB_END_DECLS
+
+#endif /* HB_OT_NAME_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-os2-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-os2-table.hh
index aa78f1e0a6..f6b150323b 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-os2-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-os2-table.hh
@@ -1,5 +1,6 @@
/*
* Copyright © 2011,2012 Google, Inc.
+ * Copyright © 2018 Ebrahim Byagowi
*
* This is part of HarfBuzz, a text shaping library.
*
@@ -27,76 +28,263 @@
#ifndef HB_OT_OS2_TABLE_HH
#define HB_OT_OS2_TABLE_HH
-#include "hb-open-type-private.hh"
+#include "hb-open-type.hh"
+#include "hb-ot-os2-unicode-ranges.hh"
-
-namespace OT {
+#include "hb-set.hh"
/*
* OS/2 and Windows Metrics
- * http://www.microsoft.com/typography/otspec/os2.htm
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/os2
*/
+#define HB_OT_TAG_OS2 HB_TAG('O','S','/','2')
-#define HB_OT_TAG_os2 HB_TAG('O','S','/','2')
-struct os2
+namespace OT {
+
+struct OS2V1Tail
{
- static const hb_tag_t tableTag = HB_OT_TAG_os2;
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
- inline bool sanitize (hb_sanitize_context_t *c) const
+ public:
+ HBUINT32 ulCodePageRange1;
+ HBUINT32 ulCodePageRange2;
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+struct OS2V2Tail
+{
+ bool has_data () const { return sxHeight || sCapHeight; }
+
+ const OS2V2Tail * operator -> () const { return this; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
public:
- UINT16 version;
-
- /* Version 0 */
- INT16 xAvgCharWidth;
- UINT16 usWeightClass;
- UINT16 usWidthClass;
- UINT16 fsType;
- INT16 ySubscriptXSize;
- INT16 ySubscriptYSize;
- INT16 ySubscriptXOffset;
- INT16 ySubscriptYOffset;
- INT16 ySuperscriptXSize;
- INT16 ySuperscriptYSize;
- INT16 ySuperscriptXOffset;
- INT16 ySuperscriptYOffset;
- INT16 yStrikeoutSize;
- INT16 yStrikeoutPosition;
- INT16 sFamilyClass;
- UINT8 panose[10];
- UINT32 ulUnicodeRange[4];
- Tag achVendID;
- UINT16 fsSelection;
- UINT16 usFirstCharIndex;
- UINT16 usLastCharIndex;
- INT16 sTypoAscender;
- INT16 sTypoDescender;
- INT16 sTypoLineGap;
- UINT16 usWinAscent;
- UINT16 usWinDescent;
-
- /* Version 1 */
- //UINT32 ulCodePageRange1;
- //UINT32 ulCodePageRange2;
-
- /* Version 2 */
- //INT16 sxHeight;
- //INT16 sCapHeight;
- //UINT16 usDefaultChar;
- //UINT16 usBreakChar;
- //UINT16 usMaxContext;
-
- /* Version 5 */
- //UINT16 usLowerOpticalPointSize;
- //UINT16 usUpperOpticalPointSize;
+ HBINT16 sxHeight;
+ HBINT16 sCapHeight;
+ HBUINT16 usDefaultChar;
+ HBUINT16 usBreakChar;
+ HBUINT16 usMaxContext;
+ public:
+ DEFINE_SIZE_STATIC (10);
+};
+
+struct OS2V5Tail
+{
+ inline bool get_optical_size (unsigned int *lower, unsigned int *upper) const
+ {
+ unsigned int lower_optical_size = usLowerOpticalPointSize;
+ unsigned int upper_optical_size = usUpperOpticalPointSize;
+
+ /* Per https://docs.microsoft.com/en-us/typography/opentype/spec/os2#lps */
+ if (lower_optical_size < upper_optical_size &&
+ lower_optical_size >= 1 && lower_optical_size <= 0xFFFE &&
+ upper_optical_size >= 2 && upper_optical_size <= 0xFFFF)
+ {
+ *lower = lower_optical_size;
+ *upper = upper_optical_size;
+ return true;
+ }
+ return false;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ public:
+ HBUINT16 usLowerOpticalPointSize;
+ HBUINT16 usUpperOpticalPointSize;
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+struct OS2
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_OS2;
+
+ bool has_data () const { return usWeightClass || usWidthClass || usFirstCharIndex || usLastCharIndex; }
+
+ const OS2V1Tail &v1 () const { return version >= 1 ? v1X : Null (OS2V1Tail); }
+ const OS2V2Tail &v2 () const { return version >= 2 ? v2X : Null (OS2V2Tail); }
+ const OS2V5Tail &v5 () const { return version >= 5 ? v5X : Null (OS2V5Tail); }
+
+ enum selection_flag_t {
+ ITALIC = 1u<<0,
+ UNDERSCORE = 1u<<1,
+ NEGATIVE = 1u<<2,
+ OUTLINED = 1u<<3,
+ STRIKEOUT = 1u<<4,
+ BOLD = 1u<<5,
+ REGULAR = 1u<<6,
+ USE_TYPO_METRICS = 1u<<7,
+ WWS = 1u<<8,
+ OBLIQUE = 1u<<9
+ };
+
+ bool is_italic () const { return fsSelection & ITALIC; }
+ bool is_oblique () const { return fsSelection & OBLIQUE; }
+ bool use_typo_metrics () const { return fsSelection & USE_TYPO_METRICS; }
+
+ enum width_class_t {
+ FWIDTH_ULTRA_CONDENSED = 1, /* 50% */
+ FWIDTH_EXTRA_CONDENSED = 2, /* 62.5% */
+ FWIDTH_CONDENSED = 3, /* 75% */
+ FWIDTH_SEMI_CONDENSED = 4, /* 87.5% */
+ FWIDTH_NORMAL = 5, /* 100% */
+ FWIDTH_SEMI_EXPANDED = 6, /* 112.5% */
+ FWIDTH_EXPANDED = 7, /* 125% */
+ FWIDTH_EXTRA_EXPANDED = 8, /* 150% */
+ FWIDTH_ULTRA_EXPANDED = 9 /* 200% */
+ };
+
+ float get_width () const
+ {
+ switch (usWidthClass) {
+ case FWIDTH_ULTRA_CONDENSED:return 50.f;
+ case FWIDTH_EXTRA_CONDENSED:return 62.5f;
+ case FWIDTH_CONDENSED: return 75.f;
+ case FWIDTH_SEMI_CONDENSED: return 87.5f;
+ default:
+ case FWIDTH_NORMAL: return 100.f;
+ case FWIDTH_SEMI_EXPANDED: return 112.5f;
+ case FWIDTH_EXPANDED: return 125.f;
+ case FWIDTH_EXTRA_EXPANDED: return 150.f;
+ case FWIDTH_ULTRA_EXPANDED: return 200.f;
+ }
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ OS2 *os2_prime = c->serializer->embed (this);
+ if (unlikely (!os2_prime)) return_trace (false);
+
+ uint16_t min_cp, max_cp;
+ find_min_and_max_codepoint (c->plan->unicodes, &min_cp, &max_cp);
+ os2_prime->usFirstCharIndex = min_cp;
+ os2_prime->usLastCharIndex = max_cp;
+
+ _update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange);
+
+ return_trace (true);
+ }
+
+ void _update_unicode_ranges (const hb_set_t *codepoints,
+ HBUINT32 ulUnicodeRange[4]) const
+ {
+ HBUINT32 newBits[4];
+ for (unsigned int i = 0; i < 4; i++)
+ newBits[i] = 0;
+ hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+ while (codepoints->next (&cp)) {
+ unsigned int bit = _hb_ot_os2_get_unicode_range_bit (cp);
+ if (bit < 128)
+ {
+ unsigned int block = bit / 32;
+ unsigned int bit_in_block = bit % 32;
+ unsigned int mask = 1 << bit_in_block;
+ newBits[block] = newBits[block] | mask;
+ }
+ if (cp >= 0x10000 && cp <= 0x110000)
+ {
+ /* the spec says that bit 57 ("Non Plane 0") implies that there's
+ at least one codepoint beyond the BMP; so I also include all
+ the non-BMP codepoints here */
+ newBits[1] = newBits[1] | (1 << 25);
+ }
+ }
+
+ for (unsigned int i = 0; i < 4; i++)
+ ulUnicodeRange[i] = ulUnicodeRange[i] & newBits[i]; // set bits only if set in the original
+ }
+
+ static void find_min_and_max_codepoint (const hb_set_t *codepoints,
+ uint16_t *min_cp, /* OUT */
+ uint16_t *max_cp /* OUT */)
+ {
+ *min_cp = codepoints->get_min ();
+ *max_cp = codepoints->get_max ();
+ }
+
+ /* https://github.com/Microsoft/Font-Validator/blob/520aaae/OTFontFileVal/val_OS2.cs#L644-L681 */
+ enum font_page_t {
+ HEBREW_FONT_PAGE = 0xB100, // Hebrew Windows 3.1 font page
+ SIMP_ARABIC_FONT_PAGE = 0xB200, // Simplified Arabic Windows 3.1 font page
+ TRAD_ARABIC_FONT_PAGE = 0xB300, // Traditional Arabic Windows 3.1 font page
+ OEM_ARABIC_FONT_PAGE = 0xB400, // OEM Arabic Windows 3.1 font page
+ SIMP_FARSI_FONT_PAGE = 0xBA00, // Simplified Farsi Windows 3.1 font page
+ TRAD_FARSI_FONT_PAGE = 0xBB00, // Traditional Farsi Windows 3.1 font page
+ THAI_FONT_PAGE = 0xDE00 // Thai Windows 3.1 font page
+ };
+ font_page_t get_font_page () const
+ { return (font_page_t) (version == 0 ? fsSelection & 0xFF00 : 0); }
+
+ unsigned get_size () const
+ {
+ unsigned result = min_size;
+ if (version >= 1) result += v1X.get_size ();
+ if (version >= 2) result += v2X.get_size ();
+ if (version >= 5) result += v5X.get_size ();
+ return result;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this))) return_trace (false);
+ if (unlikely (version >= 1 && !v1X.sanitize (c))) return_trace (false);
+ if (unlikely (version >= 2 && !v2X.sanitize (c))) return_trace (false);
+ if (unlikely (version >= 5 && !v5X.sanitize (c))) return_trace (false);
+ return_trace (true);
+ }
+
+ public:
+ HBUINT16 version;
+ HBINT16 xAvgCharWidth;
+ HBUINT16 usWeightClass;
+ HBUINT16 usWidthClass;
+ HBUINT16 fsType;
+ HBINT16 ySubscriptXSize;
+ HBINT16 ySubscriptYSize;
+ HBINT16 ySubscriptXOffset;
+ HBINT16 ySubscriptYOffset;
+ HBINT16 ySuperscriptXSize;
+ HBINT16 ySuperscriptYSize;
+ HBINT16 ySuperscriptXOffset;
+ HBINT16 ySuperscriptYOffset;
+ HBINT16 yStrikeoutSize;
+ HBINT16 yStrikeoutPosition;
+ HBINT16 sFamilyClass;
+ HBUINT8 panose[10];
+ HBUINT32 ulUnicodeRange[4];
+ Tag achVendID;
+ HBUINT16 fsSelection;
+ HBUINT16 usFirstCharIndex;
+ HBUINT16 usLastCharIndex;
+ HBINT16 sTypoAscender;
+ HBINT16 sTypoDescender;
+ HBINT16 sTypoLineGap;
+ HBUINT16 usWinAscent;
+ HBUINT16 usWinDescent;
+ OS2V1Tail v1X;
+ OS2V2Tail v2X;
+ OS2V5Tail v5X;
public:
- DEFINE_SIZE_STATIC (78);
+ DEFINE_SIZE_MIN (78);
};
} /* namespace OT */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-os2-unicode-ranges.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-os2-unicode-ranges.hh
new file mode 100644
index 0000000000..b0ccd00d7b
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-os2-unicode-ranges.hh
@@ -0,0 +1,247 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger
+ */
+
+#ifndef HB_OT_OS2_UNICODE_RANGES_HH
+#define HB_OT_OS2_UNICODE_RANGES_HH
+
+#include "hb.hh"
+
+namespace OT {
+
+struct OS2Range
+{
+ static int
+ cmp (const void *_key, const void *_item)
+ {
+ hb_codepoint_t cp = *((hb_codepoint_t *) _key);
+ const OS2Range *range = (OS2Range *) _item;
+
+ if (cp < range->start)
+ return -1;
+ else if (cp <= range->end)
+ return 0;
+ else
+ return +1;
+ }
+
+ hb_codepoint_t start;
+ hb_codepoint_t end;
+ unsigned int bit;
+};
+
+/* Note: The contents of this array was generated using gen-os2-unicode-ranges.py. */
+static const OS2Range _hb_os2_unicode_ranges[] =
+{
+ { 0x0, 0x7F, 0}, // Basic Latin
+ { 0x80, 0xFF, 1}, // Latin-1 Supplement
+ { 0x100, 0x17F, 2}, // Latin Extended-A
+ { 0x180, 0x24F, 3}, // Latin Extended-B
+ { 0x250, 0x2AF, 4}, // IPA Extensions
+ { 0x2B0, 0x2FF, 5}, // Spacing Modifier Letters
+ { 0x300, 0x36F, 6}, // Combining Diacritical Marks
+ { 0x370, 0x3FF, 7}, // Greek and Coptic
+ { 0x400, 0x4FF, 9}, // Cyrillic
+ { 0x500, 0x52F, 9}, // Cyrillic Supplement
+ { 0x530, 0x58F, 10}, // Armenian
+ { 0x590, 0x5FF, 11}, // Hebrew
+ { 0x600, 0x6FF, 13}, // Arabic
+ { 0x700, 0x74F, 71}, // Syriac
+ { 0x750, 0x77F, 13}, // Arabic Supplement
+ { 0x780, 0x7BF, 72}, // Thaana
+ { 0x7C0, 0x7FF, 14}, // NKo
+ { 0x900, 0x97F, 15}, // Devanagari
+ { 0x980, 0x9FF, 16}, // Bengali
+ { 0xA00, 0xA7F, 17}, // Gurmukhi
+ { 0xA80, 0xAFF, 18}, // Gujarati
+ { 0xB00, 0xB7F, 19}, // Oriya
+ { 0xB80, 0xBFF, 20}, // Tamil
+ { 0xC00, 0xC7F, 21}, // Telugu
+ { 0xC80, 0xCFF, 22}, // Kannada
+ { 0xD00, 0xD7F, 23}, // Malayalam
+ { 0xD80, 0xDFF, 73}, // Sinhala
+ { 0xE00, 0xE7F, 24}, // Thai
+ { 0xE80, 0xEFF, 25}, // Lao
+ { 0xF00, 0xFFF, 70}, // Tibetan
+ { 0x1000, 0x109F, 74}, // Myanmar
+ { 0x10A0, 0x10FF, 26}, // Georgian
+ { 0x1100, 0x11FF, 28}, // Hangul Jamo
+ { 0x1200, 0x137F, 75}, // Ethiopic
+ { 0x1380, 0x139F, 75}, // Ethiopic Supplement
+ { 0x13A0, 0x13FF, 76}, // Cherokee
+ { 0x1400, 0x167F, 77}, // Unified Canadian Aboriginal Syllabics
+ { 0x1680, 0x169F, 78}, // Ogham
+ { 0x16A0, 0x16FF, 79}, // Runic
+ { 0x1700, 0x171F, 84}, // Tagalog
+ { 0x1720, 0x173F, 84}, // Hanunoo
+ { 0x1740, 0x175F, 84}, // Buhid
+ { 0x1760, 0x177F, 84}, // Tagbanwa
+ { 0x1780, 0x17FF, 80}, // Khmer
+ { 0x1800, 0x18AF, 81}, // Mongolian
+ { 0x1900, 0x194F, 93}, // Limbu
+ { 0x1950, 0x197F, 94}, // Tai Le
+ { 0x1980, 0x19DF, 95}, // New Tai Lue
+ { 0x19E0, 0x19FF, 80}, // Khmer Symbols
+ { 0x1A00, 0x1A1F, 96}, // Buginese
+ { 0x1B00, 0x1B7F, 27}, // Balinese
+ { 0x1B80, 0x1BBF, 112}, // Sundanese
+ { 0x1C00, 0x1C4F, 113}, // Lepcha
+ { 0x1C50, 0x1C7F, 114}, // Ol Chiki
+ { 0x1D00, 0x1D7F, 4}, // Phonetic Extensions
+ { 0x1D80, 0x1DBF, 4}, // Phonetic Extensions Supplement
+ { 0x1DC0, 0x1DFF, 6}, // Combining Diacritical Marks Supplement
+ { 0x1E00, 0x1EFF, 29}, // Latin Extended Additional
+ { 0x1F00, 0x1FFF, 30}, // Greek Extended
+ { 0x2000, 0x206F, 31}, // General Punctuation
+ { 0x2070, 0x209F, 32}, // Superscripts And Subscripts
+ { 0x20A0, 0x20CF, 33}, // Currency Symbols
+ { 0x20D0, 0x20FF, 34}, // Combining Diacritical Marks For Symbols
+ { 0x2100, 0x214F, 35}, // Letterlike Symbols
+ { 0x2150, 0x218F, 36}, // Number Forms
+ { 0x2190, 0x21FF, 37}, // Arrows
+ { 0x2200, 0x22FF, 38}, // Mathematical Operators
+ { 0x2300, 0x23FF, 39}, // Miscellaneous Technical
+ { 0x2400, 0x243F, 40}, // Control Pictures
+ { 0x2440, 0x245F, 41}, // Optical Character Recognition
+ { 0x2460, 0x24FF, 42}, // Enclosed Alphanumerics
+ { 0x2500, 0x257F, 43}, // Box Drawing
+ { 0x2580, 0x259F, 44}, // Block Elements
+ { 0x25A0, 0x25FF, 45}, // Geometric Shapes
+ { 0x2600, 0x26FF, 46}, // Miscellaneous Symbols
+ { 0x2700, 0x27BF, 47}, // Dingbats
+ { 0x27C0, 0x27EF, 38}, // Miscellaneous Mathematical Symbols-A
+ { 0x27F0, 0x27FF, 37}, // Supplemental Arrows-A
+ { 0x2800, 0x28FF, 82}, // Braille Patterns
+ { 0x2900, 0x297F, 37}, // Supplemental Arrows-B
+ { 0x2980, 0x29FF, 38}, // Miscellaneous Mathematical Symbols-B
+ { 0x2A00, 0x2AFF, 38}, // Supplemental Mathematical Operators
+ { 0x2B00, 0x2BFF, 37}, // Miscellaneous Symbols and Arrows
+ { 0x2C00, 0x2C5F, 97}, // Glagolitic
+ { 0x2C60, 0x2C7F, 29}, // Latin Extended-C
+ { 0x2C80, 0x2CFF, 8}, // Coptic
+ { 0x2D00, 0x2D2F, 26}, // Georgian Supplement
+ { 0x2D30, 0x2D7F, 98}, // Tifinagh
+ { 0x2D80, 0x2DDF, 75}, // Ethiopic Extended
+ { 0x2DE0, 0x2DFF, 9}, // Cyrillic Extended-A
+ { 0x2E00, 0x2E7F, 31}, // Supplemental Punctuation
+ { 0x2E80, 0x2EFF, 59}, // CJK Radicals Supplement
+ { 0x2F00, 0x2FDF, 59}, // Kangxi Radicals
+ { 0x2FF0, 0x2FFF, 59}, // Ideographic Description Characters
+ { 0x3000, 0x303F, 48}, // CJK Symbols And Punctuation
+ { 0x3040, 0x309F, 49}, // Hiragana
+ { 0x30A0, 0x30FF, 50}, // Katakana
+ { 0x3100, 0x312F, 51}, // Bopomofo
+ { 0x3130, 0x318F, 52}, // Hangul Compatibility Jamo
+ { 0x3190, 0x319F, 59}, // Kanbun
+ { 0x31A0, 0x31BF, 51}, // Bopomofo Extended
+ { 0x31C0, 0x31EF, 61}, // CJK Strokes
+ { 0x31F0, 0x31FF, 50}, // Katakana Phonetic Extensions
+ { 0x3200, 0x32FF, 54}, // Enclosed CJK Letters And Months
+ { 0x3300, 0x33FF, 55}, // CJK Compatibility
+ { 0x3400, 0x4DBF, 59}, // CJK Unified Ideographs Extension A
+ { 0x4DC0, 0x4DFF, 99}, // Yijing Hexagram Symbols
+ { 0x4E00, 0x9FFF, 59}, // CJK Unified Ideographs
+ { 0xA000, 0xA48F, 83}, // Yi Syllables
+ { 0xA490, 0xA4CF, 83}, // Yi Radicals
+ { 0xA500, 0xA63F, 12}, // Vai
+ { 0xA640, 0xA69F, 9}, // Cyrillic Extended-B
+ { 0xA700, 0xA71F, 5}, // Modifier Tone Letters
+ { 0xA720, 0xA7FF, 29}, // Latin Extended-D
+ { 0xA800, 0xA82F, 100}, // Syloti Nagri
+ { 0xA840, 0xA87F, 53}, // Phags-pa
+ { 0xA880, 0xA8DF, 115}, // Saurashtra
+ { 0xA900, 0xA92F, 116}, // Kayah Li
+ { 0xA930, 0xA95F, 117}, // Rejang
+ { 0xAA00, 0xAA5F, 118}, // Cham
+ { 0xAC00, 0xD7AF, 56}, // Hangul Syllables
+ { 0xD800, 0xDFFF, 57}, // Non-Plane 0 *
+ { 0xE000, 0xF8FF, 60}, // Private Use Area (plane 0)
+ { 0xF900, 0xFAFF, 61}, // CJK Compatibility Ideographs
+ { 0xFB00, 0xFB4F, 62}, // Alphabetic Presentation Forms
+ { 0xFB50, 0xFDFF, 63}, // Arabic Presentation Forms-A
+ { 0xFE00, 0xFE0F, 91}, // Variation Selectors
+ { 0xFE10, 0xFE1F, 65}, // Vertical Forms
+ { 0xFE20, 0xFE2F, 64}, // Combining Half Marks
+ { 0xFE30, 0xFE4F, 65}, // CJK Compatibility Forms
+ { 0xFE50, 0xFE6F, 66}, // Small Form Variants
+ { 0xFE70, 0xFEFF, 67}, // Arabic Presentation Forms-B
+ { 0xFF00, 0xFFEF, 68}, // Halfwidth And Fullwidth Forms
+ { 0xFFF0, 0xFFFF, 69}, // Specials
+ { 0x10000, 0x1007F, 101}, // Linear B Syllabary
+ { 0x10080, 0x100FF, 101}, // Linear B Ideograms
+ { 0x10100, 0x1013F, 101}, // Aegean Numbers
+ { 0x10140, 0x1018F, 102}, // Ancient Greek Numbers
+ { 0x10190, 0x101CF, 119}, // Ancient Symbols
+ { 0x101D0, 0x101FF, 120}, // Phaistos Disc
+ { 0x10280, 0x1029F, 121}, // Lycian
+ { 0x102A0, 0x102DF, 121}, // Carian
+ { 0x10300, 0x1032F, 85}, // Old Italic
+ { 0x10330, 0x1034F, 86}, // Gothic
+ { 0x10380, 0x1039F, 103}, // Ugaritic
+ { 0x103A0, 0x103DF, 104}, // Old Persian
+ { 0x10400, 0x1044F, 87}, // Deseret
+ { 0x10450, 0x1047F, 105}, // Shavian
+ { 0x10480, 0x104AF, 106}, // Osmanya
+ { 0x10800, 0x1083F, 107}, // Cypriot Syllabary
+ { 0x10900, 0x1091F, 58}, // Phoenician
+ { 0x10920, 0x1093F, 121}, // Lydian
+ { 0x10A00, 0x10A5F, 108}, // Kharoshthi
+ { 0x12000, 0x123FF, 110}, // Cuneiform
+ { 0x12400, 0x1247F, 110}, // Cuneiform Numbers and Punctuation
+ { 0x1D000, 0x1D0FF, 88}, // Byzantine Musical Symbols
+ { 0x1D100, 0x1D1FF, 88}, // Musical Symbols
+ { 0x1D200, 0x1D24F, 88}, // Ancient Greek Musical Notation
+ { 0x1D300, 0x1D35F, 109}, // Tai Xuan Jing Symbols
+ { 0x1D360, 0x1D37F, 111}, // Counting Rod Numerals
+ { 0x1D400, 0x1D7FF, 89}, // Mathematical Alphanumeric Symbols
+ { 0x1F000, 0x1F02F, 122}, // Mahjong Tiles
+ { 0x1F030, 0x1F09F, 122}, // Domino Tiles
+ { 0x20000, 0x2A6DF, 59}, // CJK Unified Ideographs Extension B
+ { 0x2F800, 0x2FA1F, 61}, // CJK Compatibility Ideographs Supplement
+ { 0xE0000, 0xE007F, 92}, // Tags
+ { 0xE0100, 0xE01EF, 91}, // Variation Selectors Supplement
+ { 0xF0000, 0xFFFFD, 90}, // Private Use (plane 15)
+ {0x100000, 0x10FFFD, 90}, // Private Use (plane 16)
+};
+
+/**
+ * _hb_ot_os2_get_unicode_range_bit:
+ * Returns the bit to be set in os/2 ulUnicodeOS2Range for a given codepoint.
+ **/
+static unsigned int
+_hb_ot_os2_get_unicode_range_bit (hb_codepoint_t cp)
+{
+ OS2Range *range = (OS2Range*) hb_bsearch (&cp, _hb_os2_unicode_ranges,
+ ARRAY_LENGTH (_hb_os2_unicode_ranges),
+ sizeof (OS2Range),
+ OS2Range::cmp);
+ if (range != nullptr)
+ return range->bit;
+ return -1;
+}
+
+} /* namespace OT */
+
+#endif /* HB_OT_OS2_UNICODE_RANGES_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-post-macroman.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-post-macroman.hh
index dbbb97e5a9..b4df8aaeea 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-post-macroman.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-post-macroman.hh
@@ -27,7 +27,7 @@
#ifndef HB_OT_POST_MACROMAN_HH
#if 0 /* Make checks happy. */
#define HB_OT_POST_MACROMAN_HH
-#include "hb-private.hh"
+#include "hb.hh"
#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table.hh
index 7f1c2c420f..38302f5518 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table.hh
@@ -27,8 +27,7 @@
#ifndef HB_OT_POST_TABLE_HH
#define HB_OT_POST_TABLE_HH
-#include "hb-open-type-private.hh"
-#include "hb-dsalgs.hh"
+#include "hb-open-type.hh"
#define HB_STRING_ARRAY_NAME format1_names
#define HB_STRING_ARRAY_LIST "hb-ot-post-macroman.hh"
@@ -38,113 +37,117 @@
#define NUM_FORMAT1_NAMES 258
-namespace OT {
-
-
/*
* post -- PostScript
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/post
*/
-
#define HB_OT_TAG_post HB_TAG('p','o','s','t')
+namespace OT {
+
+
struct postV2Tail
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ friend struct post;
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (glyphNameIndex.sanitize (c));
}
- ArrayOf<UINT16>glyphNameIndex; /* This is not an offset, but is the
+ protected:
+ ArrayOf<HBUINT16> glyphNameIndex; /* This is not an offset, but is the
* ordinal number of the glyph in 'post'
* string tables. */
- UINT8 namesX[VAR]; /* Glyph names with length bytes [variable]
+/*UnsizedArrayOf<HBUINT8>
+ namesX;*/ /* Glyph names with length bytes [variable]
* (a Pascal string). */
- DEFINE_SIZE_ARRAY2 (2, glyphNameIndex, namesX);
+ public:
+ DEFINE_SIZE_ARRAY (2, glyphNameIndex);
};
struct post
{
- static const hb_tag_t tableTag = HB_OT_TAG_post;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_post;
- inline bool sanitize (hb_sanitize_context_t *c) const
+ void serialize (hb_serialize_context_t *c) const
{
- TRACE_SANITIZE (this);
- if (unlikely (!c->check_struct (this)))
- return_trace (false);
- if (version.to_int () == 0x00020000)
- {
- const postV2Tail &v2 = StructAfter<postV2Tail> (*this);
- return_trace (v2.sanitize (c));
- }
+ post *post_prime = c->allocate_min<post> ();
+ if (unlikely (!post_prime)) return;
+
+ memcpy (post_prime, this, post::min_size);
+ post_prime->version.major = 3; // Version 3 does not have any glyph names.
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ post *post_prime = c->serializer->start_embed<post> ();
+ if (unlikely (!post_prime)) return_trace (false);
+
+ serialize (c->serializer);
+ if (c->serializer->in_error () || c->serializer->ran_out_of_room) return_trace (false);
+
return_trace (true);
}
struct accelerator_t
{
- inline void init (hb_face_t *face)
+ void init (hb_face_t *face)
{
- blob = Sanitizer<post>::sanitize (face->reference_table (HB_OT_TAG_post));
- const post *table = Sanitizer<post>::lock_instance (blob);
- unsigned int table_length = hb_blob_get_length (blob);
+ index_to_offset.init ();
+
+ table = hb_sanitize_context_t ().reference_table<post> (face);
+ unsigned int table_length = table.get_length ();
version = table->version.to_int ();
- index_to_offset.init ();
- if (version != 0x00020000)
- return;
+ if (version != 0x00020000) return;
- const postV2Tail &v2 = StructAfter<postV2Tail> (*table);
+ const postV2Tail &v2 = table->v2X;
glyphNameIndex = &v2.glyphNameIndex;
pool = &StructAfter<uint8_t> (v2.glyphNameIndex);
- const uint8_t *end = (uint8_t *) table + table_length;
- for (const uint8_t *data = pool; data < end && data + *data <= end; data += 1 + *data)
- {
- uint32_t *offset = index_to_offset.push ();
- if (unlikely (!offset))
- break;
- *offset = data - pool;
- }
+ const uint8_t *end = (const uint8_t *) (const void *) table + table_length;
+ for (const uint8_t *data = pool;
+ index_to_offset.length < 65535 && data < end && data + *data < end;
+ data += 1 + *data)
+ index_to_offset.push (data - pool);
}
- inline void fini (void)
+ void fini ()
{
- index_to_offset.finish ();
- free (gids_sorted_by_name);
+ index_to_offset.fini ();
+ free (gids_sorted_by_name.get ());
+ table.destroy ();
}
- inline bool get_glyph_name (hb_codepoint_t glyph,
- char *buf, unsigned int buf_len) const
+ bool get_glyph_name (hb_codepoint_t glyph,
+ char *buf, unsigned int buf_len) const
{
- hb_string_t s = find_glyph_name (glyph);
- if (!s.len)
- return false;
- if (!buf_len)
- return true;
- if (buf_len <= s.len) /* What to do with truncation? Returning false for now. */
- return false;
- strncpy (buf, s.bytes, s.len);
- buf[s.len] = '\0';
+ hb_bytes_t s = find_glyph_name (glyph);
+ if (!s.length) return false;
+ if (!buf_len) return true;
+ unsigned int len = hb_min (buf_len - 1, s.length);
+ strncpy (buf, s.arrayZ, len);
+ buf[len] = '\0';
return true;
}
- inline bool get_glyph_from_name (const char *name, int len,
- hb_codepoint_t *glyph) const
+ bool get_glyph_from_name (const char *name, int len,
+ hb_codepoint_t *glyph) const
{
unsigned int count = get_glyph_count ();
- if (unlikely (!count))
- return false;
+ if (unlikely (!count)) return false;
- if (len < 0)
- len = strlen (name);
+ if (len < 0) len = strlen (name);
- if (unlikely (!len))
- return false;
+ if (unlikely (!len)) return false;
retry:
- uint16_t *gids = (uint16_t *) hb_atomic_ptr_get (&gids_sorted_by_name);
+ uint16_t *gids = gids_sorted_by_name.get ();
if (unlikely (!gids))
{
@@ -154,16 +157,18 @@ struct post
for (unsigned int i = 0; i < count; i++)
gids[i] = i;
- hb_sort_r (gids, count, sizeof (gids[0]), cmp_gids, (void *) this);
+ hb_qsort (gids, count, sizeof (gids[0]), cmp_gids, (void *) this);
- if (!hb_atomic_ptr_cmpexch (&gids_sorted_by_name, nullptr, gids)) {
+ if (unlikely (!gids_sorted_by_name.cmpexch (nullptr, gids)))
+ {
free (gids);
goto retry;
}
}
- hb_string_t st (name, len);
- const uint16_t *gid = (const uint16_t *) hb_bsearch_r (&st, gids, count, sizeof (gids[0]), cmp_key, (void *) this);
+ hb_bytes_t st (name, len);
+ const uint16_t *gid = (const uint16_t *) hb_bsearch (hb_addressof (st), gids, count,
+ sizeof (gids[0]), cmp_key, (void *) this);
if (gid)
{
*glyph = *gid;
@@ -173,20 +178,22 @@ struct post
return false;
}
+ hb_blob_ptr_t<post> table;
+
protected:
- inline unsigned int get_glyph_count (void) const
+ unsigned int get_glyph_count () const
{
if (version == 0x00010000)
- return NUM_FORMAT1_NAMES;
+ return NUM_FORMAT1_NAMES;
if (version == 0x00020000)
- return glyphNameIndex->len;
+ return glyphNameIndex->len;
return 0;
}
- static inline int cmp_gids (const void *pa, const void *pb, void *arg)
+ static int cmp_gids (const void *pa, const void *pb, void *arg)
{
const accelerator_t *thiz = (const accelerator_t *) arg;
uint16_t a = * (const uint16_t *) pa;
@@ -194,58 +201,68 @@ struct post
return thiz->find_glyph_name (b).cmp (thiz->find_glyph_name (a));
}
- static inline int cmp_key (const void *pk, const void *po, void *arg)
+ static int cmp_key (const void *pk, const void *po, void *arg)
{
const accelerator_t *thiz = (const accelerator_t *) arg;
- const hb_string_t *key = (const hb_string_t *) pk;
+ const hb_bytes_t *key = (const hb_bytes_t *) pk;
uint16_t o = * (const uint16_t *) po;
return thiz->find_glyph_name (o).cmp (*key);
}
- inline hb_string_t find_glyph_name (hb_codepoint_t glyph) const
+ hb_bytes_t find_glyph_name (hb_codepoint_t glyph) const
{
if (version == 0x00010000)
{
if (glyph >= NUM_FORMAT1_NAMES)
- return hb_string_t ();
+ return hb_bytes_t ();
return format1_names (glyph);
}
if (version != 0x00020000 || glyph >= glyphNameIndex->len)
- return hb_string_t ();
+ return hb_bytes_t ();
- unsigned int index = glyphNameIndex->array[glyph];
+ unsigned int index = glyphNameIndex->arrayZ[glyph];
if (index < NUM_FORMAT1_NAMES)
return format1_names (index);
index -= NUM_FORMAT1_NAMES;
- if (index >= index_to_offset.len)
- return hb_string_t ();
- unsigned int offset = index_to_offset.array[index];
+ if (index >= index_to_offset.length)
+ return hb_bytes_t ();
+ unsigned int offset = index_to_offset[index];
const uint8_t *data = pool + offset;
unsigned int name_length = *data;
data++;
- return hb_string_t ((const char *) data, name_length);
+ return hb_bytes_t ((const char *) data, name_length);
}
private:
- hb_blob_t *blob;
uint32_t version;
- const ArrayOf<UINT16> *glyphNameIndex;
- hb_prealloced_array_t<uint32_t, 1> index_to_offset;
+ const ArrayOf<HBUINT16> *glyphNameIndex;
+ hb_vector_t<uint32_t> index_to_offset;
const uint8_t *pool;
- mutable uint16_t *gids_sorted_by_name;
+ hb_atomic_ptr_t<uint16_t *> gids_sorted_by_name;
};
+ bool has_data () const { return version.to_int (); }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ (version.to_int () == 0x00010000 ||
+ (version.to_int () == 0x00020000 && v2X.sanitize (c)) ||
+ version.to_int () == 0x00030000)));
+ }
+
public:
FixedVersion<>version; /* 0x00010000 for version 1.0
* 0x00020000 for version 2.0
* 0x00025000 for version 2.5 (deprecated)
* 0x00030000 for version 3.0 */
- Fixed italicAngle; /* Italic angle in counter-clockwise degrees
+ HBFixed italicAngle; /* Italic angle in counter-clockwise degrees
* from the vertical. Zero for upright text,
* negative for text that leans to the right
* (forward). */
@@ -261,21 +278,23 @@ struct post
* from the value of this field. */
FWORD underlineThickness; /* Suggested values for the underline
thickness. */
- UINT32 isFixedPitch; /* Set to 0 if the font is proportionally
+ HBUINT32 isFixedPitch; /* Set to 0 if the font is proportionally
* spaced, non-zero if the font is not
* proportionally spaced (i.e. monospaced). */
- UINT32 minMemType42; /* Minimum memory usage when an OpenType font
+ HBUINT32 minMemType42; /* Minimum memory usage when an OpenType font
* is downloaded. */
- UINT32 maxMemType42; /* Maximum memory usage when an OpenType font
+ HBUINT32 maxMemType42; /* Maximum memory usage when an OpenType font
* is downloaded. */
- UINT32 minMemType1; /* Minimum memory usage when an OpenType font
+ HBUINT32 minMemType1; /* Minimum memory usage when an OpenType font
* is downloaded as a Type 1 font. */
- UINT32 maxMemType1; /* Maximum memory usage when an OpenType font
+ HBUINT32 maxMemType1; /* Maximum memory usage when an OpenType font
* is downloaded as a Type 1 font. */
-/*postV2Tail v2[VAR];*/
- DEFINE_SIZE_STATIC (32);
+ postV2Tail v2X;
+ DEFINE_SIZE_MIN (32);
};
+struct post_accelerator_t : post::accelerator_t {};
+
} /* namespace OT */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-fallback.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-fallback.hh
index d98cde121c..2a7a8ebbc0 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-fallback.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-fallback.hh
@@ -27,9 +27,9 @@
#ifndef HB_OT_SHAPE_COMPLEX_ARABIC_FALLBACK_HH
#define HB_OT_SHAPE_COMPLEX_ARABIC_FALLBACK_HH
-#include "hb-private.hh"
+#include "hb.hh"
-#include "hb-ot-shape-private.hh"
+#include "hb-ot-shape.hh"
#include "hb-ot-layout-gsub-table.hh"
@@ -49,8 +49,8 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS
hb_font_t *font,
unsigned int feature_index)
{
- OT::GlyphID glyphs[SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1];
- OT::GlyphID substitutes[SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1];
+ OT::HBGlyphID glyphs[SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1];
+ OT::HBGlyphID substitutes[SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1];
unsigned int num_glyphs = 0;
/* Populate arrays */
@@ -66,8 +66,8 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS
u_glyph > 0xFFFFu || s_glyph > 0xFFFFu)
continue;
- glyphs[num_glyphs].set (u_glyph);
- substitutes[num_glyphs].set (s_glyph);
+ glyphs[num_glyphs] = u_glyph;
+ substitutes[num_glyphs] = s_glyph;
num_glyphs++;
}
@@ -77,22 +77,20 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS
/* Bubble-sort or something equally good!
* May not be good-enough for presidential candidate interviews, but good-enough for us... */
- hb_stable_sort (&glyphs[0], num_glyphs, (int(*)(const OT::GlyphID*, const OT::GlyphID *)) OT::GlyphID::cmp, &substitutes[0]);
+ hb_stable_sort (&glyphs[0], num_glyphs,
+ (int(*)(const OT::HBUINT16*, const OT::HBUINT16 *)) OT::HBGlyphID::cmp,
+ &substitutes[0]);
- OT::Supplier<OT::GlyphID> glyphs_supplier (glyphs, num_glyphs);
- OT::Supplier<OT::GlyphID> substitutes_supplier (substitutes, num_glyphs);
/* Each glyph takes four bytes max, and there's some overhead. */
char buf[(SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1) * 4 + 128];
- OT::hb_serialize_context_t c (buf, sizeof (buf));
+ hb_serialize_context_t c (buf, sizeof (buf));
OT::SubstLookup *lookup = c.start_serialize<OT::SubstLookup> ();
bool ret = lookup->serialize_single (&c,
OT::LookupFlag::IgnoreMarks,
- glyphs_supplier,
- substitutes_supplier,
- num_glyphs);
+ hb_sorted_array (glyphs, num_glyphs),
+ hb_array (substitutes, num_glyphs));
c.end_serialize ();
- /* TODO sanitize the results? */
return ret ? c.copy<OT::SubstLookup> () : nullptr;
}
@@ -101,15 +99,15 @@ static OT::SubstLookup *
arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_font_t *font)
{
- OT::GlyphID first_glyphs[ARRAY_LENGTH_CONST (ligature_table)];
+ OT::HBGlyphID first_glyphs[ARRAY_LENGTH_CONST (ligature_table)];
unsigned int first_glyphs_indirection[ARRAY_LENGTH_CONST (ligature_table)];
unsigned int ligature_per_first_glyph_count_list[ARRAY_LENGTH_CONST (first_glyphs)];
unsigned int num_first_glyphs = 0;
/* We know that all our ligatures are 2-component */
- OT::GlyphID ligature_list[ARRAY_LENGTH_CONST (first_glyphs) * ARRAY_LENGTH_CONST(ligature_table[0].ligatures)];
+ OT::HBGlyphID ligature_list[ARRAY_LENGTH_CONST (first_glyphs) * ARRAY_LENGTH_CONST(ligature_table[0].ligatures)];
unsigned int component_count_list[ARRAY_LENGTH_CONST (ligature_list)];
- OT::GlyphID component_list[ARRAY_LENGTH_CONST (ligature_list) * 1/* One extra component per ligature */];
+ OT::HBGlyphID component_list[ARRAY_LENGTH_CONST (ligature_list) * 1/* One extra component per ligature */];
unsigned int num_ligatures = 0;
/* Populate arrays */
@@ -121,12 +119,14 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN
hb_codepoint_t first_glyph;
if (!hb_font_get_glyph (font, first_u, 0, &first_glyph))
continue;
- first_glyphs[num_first_glyphs].set (first_glyph);
+ first_glyphs[num_first_glyphs] = first_glyph;
ligature_per_first_glyph_count_list[num_first_glyphs] = 0;
first_glyphs_indirection[num_first_glyphs] = first_glyph_idx;
num_first_glyphs++;
}
- hb_stable_sort (&first_glyphs[0], num_first_glyphs, (int(*)(const OT::GlyphID*, const OT::GlyphID *)) OT::GlyphID::cmp, &first_glyphs_indirection[0]);
+ hb_stable_sort (&first_glyphs[0], num_first_glyphs,
+ (int(*)(const OT::HBUINT16*, const OT::HBUINT16 *)) OT::HBGlyphID::cmp,
+ &first_glyphs_indirection[0]);
/* Now that the first-glyphs are sorted, walk again, populate ligatures. */
for (unsigned int i = 0; i < num_first_glyphs; i++)
@@ -145,9 +145,9 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN
ligature_per_first_glyph_count_list[i]++;
- ligature_list[num_ligatures].set (ligature_glyph);
+ ligature_list[num_ligatures] = ligature_glyph;
component_count_list[num_ligatures] = 2;
- component_list[num_ligatures].set (second_glyph);
+ component_list[num_ligatures] = second_glyph;
num_ligatures++;
}
}
@@ -155,25 +155,18 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN
if (!num_ligatures)
return nullptr;
- OT::Supplier<OT::GlyphID> first_glyphs_supplier (first_glyphs, num_first_glyphs);
- OT::Supplier<unsigned int > ligature_per_first_glyph_count_supplier (ligature_per_first_glyph_count_list, num_first_glyphs);
- OT::Supplier<OT::GlyphID> ligatures_supplier (ligature_list, num_ligatures);
- OT::Supplier<unsigned int > component_count_supplier (component_count_list, num_ligatures);
- OT::Supplier<OT::GlyphID> component_supplier (component_list, num_ligatures);
/* 16 bytes per ligature ought to be enough... */
char buf[ARRAY_LENGTH_CONST (ligature_list) * 16 + 128];
- OT::hb_serialize_context_t c (buf, sizeof (buf));
+ hb_serialize_context_t c (buf, sizeof (buf));
OT::SubstLookup *lookup = c.start_serialize<OT::SubstLookup> ();
bool ret = lookup->serialize_ligature (&c,
OT::LookupFlag::IgnoreMarks,
- first_glyphs_supplier,
- ligature_per_first_glyph_count_supplier,
- num_first_glyphs,
- ligatures_supplier,
- component_count_supplier,
- component_supplier);
-
+ hb_sorted_array (first_glyphs, num_first_glyphs),
+ hb_array (ligature_per_first_glyph_count_list, num_first_glyphs),
+ hb_array (ligature_list, num_ligatures),
+ hb_array (component_count_list, num_ligatures),
+ hb_array (component_list, num_ligatures));
c.end_serialize ();
/* TODO sanitize the results? */
@@ -195,19 +188,15 @@ arabic_fallback_synthesize_lookup (const hb_ot_shape_plan_t *plan,
struct arabic_fallback_plan_t
{
- ASSERT_POD ();
-
unsigned int num_lookups;
bool free_lookups;
hb_mask_t mask_array[ARABIC_FALLBACK_MAX_LOOKUPS];
OT::SubstLookup *lookup_array[ARABIC_FALLBACK_MAX_LOOKUPS];
- hb_ot_layout_lookup_accelerator_t accel_array[ARABIC_FALLBACK_MAX_LOOKUPS];
+ OT::hb_ot_layout_lookup_accelerator_t accel_array[ARABIC_FALLBACK_MAX_LOOKUPS];
};
-static const arabic_fallback_plan_t arabic_fallback_plan_nil = {};
-
-#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(HB_NO_WIN1256)
+#if defined(_WIN32) && !defined(HB_NO_WIN1256)
#define HB_WITH_WIN1256
#endif
@@ -215,16 +204,20 @@ static const arabic_fallback_plan_t arabic_fallback_plan_nil = {};
#include "hb-ot-shape-complex-arabic-win1256.hh"
#endif
-struct ManifestLookup {
+struct ManifestLookup
+{
+ public:
OT::Tag tag;
OT::OffsetTo<OT::SubstLookup> lookupOffset;
+ public:
+ DEFINE_SIZE_STATIC (6);
};
typedef OT::ArrayOf<ManifestLookup> Manifest;
static bool
-arabic_fallback_plan_init_win1256 (arabic_fallback_plan_t *fallback_plan,
- const hb_ot_shape_plan_t *plan,
- hb_font_t *font)
+arabic_fallback_plan_init_win1256 (arabic_fallback_plan_t *fallback_plan HB_UNUSED,
+ const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font HB_UNUSED)
{
#ifdef HB_WITH_WIN1256
/* Does this font look like it's Windows-1256-encoded? */
@@ -237,8 +230,8 @@ arabic_fallback_plan_init_win1256 (arabic_fallback_plan_t *fallback_plan,
return false;
const Manifest &manifest = reinterpret_cast<const Manifest&> (arabic_win1256_gsub_lookups.manifest);
- static_assert (sizeof (arabic_win1256_gsub_lookups.manifestData) / sizeof (ManifestLookup)
- <= ARABIC_FALLBACK_MAX_LOOKUPS, "");
+ static_assert (sizeof (arabic_win1256_gsub_lookups.manifestData) ==
+ ARABIC_FALLBACK_MAX_LOOKUPS * sizeof (ManifestLookup), "");
/* TODO sanitize the table? */
unsigned j = 0;
@@ -299,7 +292,7 @@ arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan,
{
arabic_fallback_plan_t *fallback_plan = (arabic_fallback_plan_t *) calloc (1, sizeof (arabic_fallback_plan_t));
if (unlikely (!fallback_plan))
- return const_cast<arabic_fallback_plan_t *> (&arabic_fallback_plan_nil);
+ return const_cast<arabic_fallback_plan_t *> (&Null(arabic_fallback_plan_t));
fallback_plan->num_lookups = 0;
fallback_plan->free_lookups = false;
@@ -314,14 +307,15 @@ arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan,
if (arabic_fallback_plan_init_win1256 (fallback_plan, plan, font))
return fallback_plan;
+ assert (fallback_plan->num_lookups == 0);
free (fallback_plan);
- return const_cast<arabic_fallback_plan_t *> (&arabic_fallback_plan_nil);
+ return const_cast<arabic_fallback_plan_t *> (&Null(arabic_fallback_plan_t));
}
static void
arabic_fallback_plan_destroy (arabic_fallback_plan_t *fallback_plan)
{
- if (!fallback_plan || fallback_plan == &arabic_fallback_plan_nil)
+ if (!fallback_plan || fallback_plan->num_lookups == 0)
return;
for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)
@@ -340,7 +334,7 @@ arabic_fallback_plan_shape (arabic_fallback_plan_t *fallback_plan,
hb_font_t *font,
hb_buffer_t *buffer)
{
- OT::hb_apply_context_t c (0, font, buffer);
+ OT::hb_ot_apply_context_t c (0, font, buffer);
for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)
if (fallback_plan->lookup_array[i]) {
c.set_lookup_mask (fallback_plan->mask_array[i]);
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-private.hh
deleted file mode 100644
index fcedc7d742..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-private.hh
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright © 2015 Mozilla Foundation.
- * Copyright © 2015 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Mozilla Author(s): Jonathan Kew
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_SHAPE_COMPLEX_ARABIC_PRIVATE_HH
-#define HB_OT_SHAPE_COMPLEX_ARABIC_PRIVATE_HH
-
-#include "hb-private.hh"
-
-#include "hb-ot-shape-complex-private.hh"
-
-
-struct arabic_shape_plan_t;
-
-HB_INTERNAL void *
-data_create_arabic (const hb_ot_shape_plan_t *plan);
-
-HB_INTERNAL void
-data_destroy_arabic (void *data);
-
-HB_INTERNAL void
-setup_masks_arabic_plan (const arabic_shape_plan_t *arabic_plan,
- hb_buffer_t *buffer,
- hb_script_t script);
-
-#endif /* HB_OT_SHAPE_COMPLEX_ARABIC_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-table.hh
index cd6e4058b5..719fabd353 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-table.hh
@@ -6,10 +6,10 @@
*
* on files with these headers:
*
- * # ArabicShaping-10.0.0.txt
- * # Date: 2017-02-16, 00:00:00 GMT [RP, KW]
- * # Blocks-10.0.0.txt
- * # Date: 2017-04-12, 17:30:00 GMT [KW]
+ * # ArabicShaping-12.0.0.txt
+ * # Date: 2018-09-22, 23:54:00 GMT [KW, RP]
+ * # Blocks-12.0.0.txt
+ * # Date: 2018-07-30, 19:40:00 GMT [KW]
* UnicodeData.txt does not have a header.
*/
@@ -45,7 +45,7 @@ static const uint8_t joining_table[] =
/* Syriac */
- /* 0700 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,A,X,D,D,D,DR,DR,R,R,R,D,D,D,D,R,D,
+ /* 0700 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,T,A,X,D,D,D,DR,DR,R,R,R,D,D,D,D,R,D,
/* 0720 */ D,D,D,D,D,D,D,D,R,D,DR,D,R,D,D,DR,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/* 0740 */ X,X,X,X,X,X,X,X,X,X,X,X,X,R,D,D,
@@ -91,7 +91,7 @@ static const uint8_t joining_table[] =
/* 1800 */ U,D,X,X,C,X,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/* 1820 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* 1840 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 1860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,
+ /* 1860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,
/* 1880 */ U,U,U,U,U,T,T,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* 18A0 */ D,D,D,D,D,D,D,D,D,X,D,
@@ -125,15 +125,36 @@ static const uint8_t joining_table[] =
/* 10B80 */ D,R,D,R,R,R,D,D,D,R,D,D,R,D,R,R,D,R,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/* 10BA0 */ X,X,X,X,X,X,X,X,X,R,R,R,R,D,D,U,
-#define joining_offset_0x1e900u 1146
+#define joining_offset_0x10d00u 1146
+
+ /* Hanifi Rohingya */
+
+ /* 10D00 */ L,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+ /* 10D20 */ D,D,R,D,
+
+#define joining_offset_0x10f30u 1182
+
+ /* Sogdian */
+
+ /* 10F20 */ D,D,D,R,D,D,D,D,D,D,D,D,D,D,D,D,
+ /* 10F40 */ D,D,D,D,D,U,X,X,X,X,X,X,X,X,X,X,X,D,D,D,R,
+
+#define joining_offset_0x110bdu 1219
+
+ /* Kaithi */
+
+ /* 110A0 */ U,X,X,
+ /* 110C0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,U,
+
+#define joining_offset_0x1e900u 1236
/* Adlam */
/* 1E900 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* 1E920 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 1E940 */ D,D,D,D,
+ /* 1E940 */ D,D,D,D,X,X,X,X,X,X,X,T,
-}; /* Table items: 1214; occupancy: 55% */
+}; /* Table items: 1312; occupancy: 56% */
static unsigned int
@@ -160,10 +181,16 @@ joining_type (hb_codepoint_t u)
case 0x10u:
if (hb_in_range<hb_codepoint_t> (u, 0x10AC0u, 0x10AEFu)) return joining_table[u - 0x10AC0u + joining_offset_0x10ac0u];
if (hb_in_range<hb_codepoint_t> (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u];
+ if (hb_in_range<hb_codepoint_t> (u, 0x10D00u, 0x10D23u)) return joining_table[u - 0x10D00u + joining_offset_0x10d00u];
+ if (hb_in_range<hb_codepoint_t> (u, 0x10F30u, 0x10F54u)) return joining_table[u - 0x10F30u + joining_offset_0x10f30u];
+ break;
+
+ case 0x11u:
+ if (hb_in_range<hb_codepoint_t> (u, 0x110BDu, 0x110CDu)) return joining_table[u - 0x110BDu + joining_offset_0x110bdu];
break;
case 0x1Eu:
- if (hb_in_range<hb_codepoint_t> (u, 0x1E900u, 0x1E943u)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u];
+ if (hb_in_range<hb_codepoint_t> (u, 0x1E900u, 0x1E94Bu)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u];
break;
default:
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-win1256.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-win1256.hh
index 54c6cdc24f..b15e145f2f 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-win1256.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic-win1256.hh
@@ -313,7 +313,7 @@ OT_TABLE_END
* Include a second time to get the table data...
*/
#if 0
-#include "hb-private.hh" /* Make check-includes.sh happy. */
+#include "hb.hh" /* Make check-includes.sh happy. */
#endif
#ifdef OT_MEASURE
#include "hb-ot-shape-complex-arabic-win1256.hh"
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc
index eb9d36ff1d..f92e6378a1 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc
@@ -24,10 +24,12 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-private.hh"
-#include "hb-debug.hh"
-#include "hb-ot-shape-complex-arabic-private.hh"
-#include "hb-ot-shape-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex-arabic.hh"
+#include "hb-ot-shape.hh"
/* buffer var allocations */
@@ -160,11 +162,6 @@ static const struct arabic_state_table_entry {
static void
-nuke_joiners (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
-
-static void
arabic_fallback_shape (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
@@ -201,32 +198,38 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
* work correctly. See https://github.com/harfbuzz/harfbuzz/issues/505
*/
- map->add_gsub_pause (nuke_joiners);
- map->add_global_bool_feature (HB_TAG('s','t','c','h'));
+ map->enable_feature (HB_TAG('s','t','c','h'));
map->add_gsub_pause (record_stch);
- map->add_global_bool_feature (HB_TAG('c','c','m','p'));
- map->add_global_bool_feature (HB_TAG('l','o','c','l'));
+ map->enable_feature (HB_TAG('c','c','m','p'));
+ map->enable_feature (HB_TAG('l','o','c','l'));
map->add_gsub_pause (nullptr);
for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++)
{
bool has_fallback = plan->props.script == HB_SCRIPT_ARABIC && !FEATURE_IS_SYRIAC (arabic_features[i]);
- map->add_feature (arabic_features[i], 1, has_fallback ? F_HAS_FALLBACK : F_NONE);
+ map->add_feature (arabic_features[i], has_fallback ? F_HAS_FALLBACK : F_NONE);
map->add_gsub_pause (nullptr);
}
- map->add_feature (HB_TAG('r','l','i','g'), 1, F_GLOBAL|F_HAS_FALLBACK);
+ /* Normally, Unicode says a ZWNJ means "don't ligate". In Arabic script
+ * however, it says a ZWJ should also mean "don't ligate". So we run
+ * the main ligating features as MANUAL_ZWJ. */
+
+ map->enable_feature (HB_TAG('r','l','i','g'), F_MANUAL_ZWJ | F_HAS_FALLBACK);
+
if (plan->props.script == HB_SCRIPT_ARABIC)
map->add_gsub_pause (arabic_fallback_shape);
/* No pause after rclt. See 98460779bae19e4d64d29461ff154b3527bf8420. */
- map->add_global_bool_feature (HB_TAG('r','c','l','t'));
- map->add_global_bool_feature (HB_TAG('c','a','l','t'));
+ map->enable_feature (HB_TAG('r','c','l','t'), F_MANUAL_ZWJ);
+ map->enable_feature (HB_TAG('c','a','l','t'), F_MANUAL_ZWJ);
map->add_gsub_pause (nullptr);
+ /* And undo here. */
+
/* The spec includes 'cswh'. Earlier versions of Windows
* used to enable this by default, but testing suggests
* that Windows 8 and later do not enable it by default,
@@ -235,23 +238,21 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
* Note that IranNastaliq uses this feature extensively
* to fixup broken glyph sequences. Oh well...
* Test case: U+0643,U+0640,U+0631. */
- //map->add_global_bool_feature (HB_TAG('c','s','w','h'));
- map->add_global_bool_feature (HB_TAG('m','s','e','t'));
+ //map->enable_feature (HB_TAG('c','s','w','h'));
+ map->enable_feature (HB_TAG('m','s','e','t'));
}
#include "hb-ot-shape-complex-arabic-fallback.hh"
struct arabic_shape_plan_t
{
- ASSERT_POD ();
-
/* The "+ 1" in the next array is to accommodate for the "NONE" command,
* which is not an OpenType feature, but this simplifies the code by not
* having to do a "if (... < NONE) ..." and just rely on the fact that
* mask_array[NONE] == 0. */
hb_mask_t mask_array[ARABIC_NUM_FEATURES + 1];
- arabic_fallback_plan_t *fallback_plan;
+ hb_atomic_ptr_t<arabic_fallback_plan_t> fallback_plan;
unsigned int do_fallback : 1;
unsigned int has_stch : 1;
@@ -380,36 +381,28 @@ setup_masks_arabic (const hb_ot_shape_plan_t *plan,
setup_masks_arabic_plan (arabic_plan, buffer, plan->props.script);
}
-
-static void
-nuke_joiners (const hb_ot_shape_plan_t *plan HB_UNUSED,
- hb_font_t *font HB_UNUSED,
- hb_buffer_t *buffer)
-{
- unsigned int count = buffer->len;
- hb_glyph_info_t *info = buffer->info;
- for (unsigned int i = 0; i < count; i++)
- if (_hb_glyph_info_is_zwj (&info[i]))
- _hb_glyph_info_flip_joiners (&info[i]);
-}
-
static void
arabic_fallback_shape (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer)
{
+#ifdef HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK
+ return;
+#endif
+
const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data;
if (!arabic_plan->do_fallback)
return;
retry:
- arabic_fallback_plan_t *fallback_plan = (arabic_fallback_plan_t *) hb_atomic_ptr_get (&arabic_plan->fallback_plan);
+ arabic_fallback_plan_t *fallback_plan = arabic_plan->fallback_plan;
if (unlikely (!fallback_plan))
{
/* This sucks. We need a font to build the fallback plan... */
fallback_plan = arabic_fallback_plan_create (plan, font);
- if (unlikely (!hb_atomic_ptr_cmpexch (&(const_cast<arabic_shape_plan_t *> (arabic_plan))->fallback_plan, nullptr, fallback_plan))) {
+ if (unlikely (!arabic_plan->fallback_plan.cmpexch (nullptr, fallback_plan)))
+ {
arabic_fallback_plan_destroy (fallback_plan);
goto retry;
}
@@ -421,14 +414,14 @@ retry:
/*
* Stretch feature: "stch".
* See example here:
- * https://www.microsoft.com/typography/OpenTypeDev/syriac/intro.htm
+ * https://docs.microsoft.com/en-us/typography/script-development/syriac
* We implement this in a generic way, such that the Arabic subtending
* marks can use it as well.
*/
static void
record_stch (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
+ hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer)
{
const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data;
@@ -452,7 +445,7 @@ record_stch (const hb_ot_shape_plan_t *plan,
}
static void
-apply_stch (const hb_ot_shape_plan_t *plan,
+apply_stch (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_buffer_t *buffer,
hb_font_t *font)
{
@@ -470,9 +463,9 @@ apply_stch (const hb_ot_shape_plan_t *plan,
int sign = font->x_scale < 0 ? -1 : +1;
unsigned int extra_glyphs_needed = 0; // Set during MEASURE, used during CUT
- typedef enum { MEASURE, CUT } step_t;
+ enum { MEASURE, CUT } /* step_t */;
- for (step_t step = MEASURE; step <= CUT; step = (step_t) (step + 1))
+ for (unsigned int step = MEASURE; step <= CUT; step = step + 1)
{
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
@@ -481,15 +474,15 @@ apply_stch (const hb_ot_shape_plan_t *plan,
unsigned int j = new_len;
for (unsigned int i = count; i; i--)
{
- if (!hb_in_range<unsigned> (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
+ if (!hb_in_range<uint8_t> (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
{
- if (step == CUT)
+ if (step == CUT)
{
--j;
info[j] = info[i - 1];
pos[j] = pos[i - 1];
}
- continue;
+ continue;
}
/* Yay, justification! */
@@ -502,7 +495,7 @@ apply_stch (const hb_ot_shape_plan_t *plan,
unsigned int end = i;
while (i &&
- hb_in_range<unsigned> (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
+ hb_in_range<uint8_t> (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
{
i--;
hb_position_t width = font->get_glyph_h_advance (info[i].codepoint);
@@ -520,7 +513,7 @@ apply_stch (const hb_ot_shape_plan_t *plan,
unsigned int start = i;
unsigned int context = i;
while (context &&
- !hb_in_range<unsigned> (info[context - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING) &&
+ !hb_in_range<uint8_t> (info[context - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING) &&
(_hb_glyph_info_is_default_ignorable (&info[context - 1]) ||
HB_ARABIC_GENERAL_CATEGORY_IS_WORD (_hb_glyph_info_get_general_category (&info[context - 1]))))
{
@@ -547,10 +540,10 @@ apply_stch (const hb_ot_shape_plan_t *plan,
hb_position_t shortfall = sign * w_remaining - sign * w_repeating * (n_copies + 1);
if (shortfall > 0 && n_repeating > 0)
{
- ++n_copies;
- hb_position_t excess = (n_copies + 1) * sign * w_repeating - sign * w_remaining;
- if (excess > 0)
- extra_repeat_overlap = excess / (n_copies * n_repeating);
+ ++n_copies;
+ hb_position_t excess = (n_copies + 1) * sign * w_repeating - sign * w_remaining;
+ if (excess > 0)
+ extra_repeat_overlap = excess / (n_copies * n_repeating);
}
if (step == MEASURE)
@@ -590,7 +583,7 @@ apply_stch (const hb_ot_shape_plan_t *plan,
if (step == MEASURE)
{
if (unlikely (!buffer->ensure (count + extra_glyphs_needed)))
- break;
+ break;
}
else
{
@@ -611,7 +604,7 @@ postprocess_glyphs_arabic (const hb_ot_shape_plan_t *plan,
HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
}
-/* http://www.unicode.org/reports/tr53/tr53-1.pdf */
+/* http://www.unicode.org/reports/tr53/ */
static hb_codepoint_t
modifier_combining_marks[] =
@@ -623,6 +616,7 @@ modifier_combining_marks[] =
0x06E3u, /* ARABIC SMALL LOW SEEN */
0x06E7u, /* ARABIC SMALL HIGH YEH */
0x06E8u, /* ARABIC SMALL HIGH NOON */
+ 0x08D3u, /* ARABIC SMALL LOW WAW */
0x08F3u, /* ARABIC SMALL HIGH WAW */
};
@@ -637,20 +631,22 @@ info_is_mcm (const hb_glyph_info_t &info)
}
static void
-reorder_marks_arabic (const hb_ot_shape_plan_t *plan,
+reorder_marks_arabic (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_buffer_t *buffer,
unsigned int start,
unsigned int end)
{
hb_glyph_info_t *info = buffer->info;
+ DEBUG_MSG (ARABIC, buffer, "Reordering marks from %d to %d", start, end);
+
unsigned int i = start;
for (unsigned int cc = 220; cc <= 230; cc += 10)
{
- DEBUG_MSG (ARABIC, buffer, "Looking for %d's starting at %d\n", cc, i);
+ DEBUG_MSG (ARABIC, buffer, "Looking for %d's starting at %d", cc, i);
while (i < end && info_cc(info[i]) < cc)
i++;
- DEBUG_MSG (ARABIC, buffer, "Looking for %d's stopped at %d\n", cc, i);
+ DEBUG_MSG (ARABIC, buffer, "Looking for %d's stopped at %d", cc, i);
if (i == end)
break;
@@ -658,20 +654,17 @@ reorder_marks_arabic (const hb_ot_shape_plan_t *plan,
if (info_cc(info[i]) > cc)
continue;
- /* Technically we should also check "info_cc(info[j]) == cc"
- * in the following loop. But not doing it is safe; we might
- * end up moving all the 220 MCMs and 230 MCMs together in one
- * move and be done. */
unsigned int j = i;
- while (j < end && info_is_mcm (info[j]))
+ while (j < end && info_cc(info[j]) == cc && info_is_mcm (info[j]))
j++;
- DEBUG_MSG (ARABIC, buffer, "Found %d's from %d to %d\n", cc, i, j);
if (i == j)
continue;
+ DEBUG_MSG (ARABIC, buffer, "Found %d's from %d to %d", cc, i, j);
+
/* Shift it! */
- DEBUG_MSG (ARABIC, buffer, "Shifting %d's: %d %d\n", cc, i, j);
+ DEBUG_MSG (ARABIC, buffer, "Shifting %d's: %d %d", cc, i, j);
hb_glyph_info_t temp[HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS];
assert (j - i <= ARRAY_LENGTH (temp));
buffer->merge_clusters (start, j);
@@ -679,7 +672,25 @@ reorder_marks_arabic (const hb_ot_shape_plan_t *plan,
memmove (&info[start + j - i], &info[start], (i - start) * sizeof (hb_glyph_info_t));
memmove (&info[start], temp, (j - i) * sizeof (hb_glyph_info_t));
- start += j - i;
+ /* Renumber CC such that the reordered sequence is still sorted.
+ * 22 and 26 are chosen because they are smaller than all Arabic categories,
+ * and are folded back to 220/230 respectively during fallback mark positioning.
+ *
+ * We do this because the CGJ-handling logic in the normalizer relies on
+ * mark sequences having an increasing order even after this reordering.
+ * https://github.com/harfbuzz/harfbuzz/issues/554
+ * This, however, does break some obscure sequences, where the normalizer
+ * might compose a sequence that it should not. For example, in the seequence
+ * ALEF, HAMZAH, MADDAH, we should NOT try to compose ALEF+MADDAH, but with this
+ * renumbering, we will.
+ */
+ unsigned int new_start = start + j - i;
+ unsigned int new_cc = cc == 220 ? HB_MODIFIED_COMBINING_CLASS_CCC22 : HB_MODIFIED_COMBINING_CLASS_CCC26;
+ while (start < new_start)
+ {
+ _hb_glyph_info_set_modified_combining_class (&info[start], new_cc);
+ start++;
+ }
i = j;
}
@@ -697,8 +708,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
nullptr, /* decompose */
nullptr, /* compose */
setup_masks_arabic,
- nullptr, /* disable_otl */
+ HB_TAG_NONE, /* gpos_tag */
reorder_marks_arabic,
HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
true, /* fallback_position */
};
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.hh
new file mode 100644
index 0000000000..5bf6ff6338
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.hh
@@ -0,0 +1,50 @@
+/*
+ * Copyright © 2015 Mozilla Foundation.
+ * Copyright © 2015 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Mozilla Author(s): Jonathan Kew
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_ARABIC_HH
+#define HB_OT_SHAPE_COMPLEX_ARABIC_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex.hh"
+
+
+struct arabic_shape_plan_t;
+
+HB_INTERNAL void *
+data_create_arabic (const hb_ot_shape_plan_t *plan);
+
+HB_INTERNAL void
+data_destroy_arabic (void *data);
+
+HB_INTERNAL void
+setup_masks_arabic_plan (const arabic_shape_plan_t *arabic_plan,
+ hb_buffer_t *buffer,
+ hb_script_t script);
+
+#endif /* HB_OT_SHAPE_COMPLEX_ARABIC_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-default.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-default.cc
index 68a62a10d4..a921f16fad 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-default.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-default.cc
@@ -24,7 +24,11 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-ot-shape-complex-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex.hh"
const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
@@ -39,8 +43,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
nullptr, /* decompose */
nullptr, /* compose */
nullptr, /* setup_masks */
- nullptr, /* disable_otl */
+ HB_TAG_NONE, /* gpos_tag */
nullptr, /* reorder_marks */
HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
true, /* fallback_position */
};
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc
index 7508c223c4..f5915f43ae 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc
@@ -24,7 +24,11 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-ot-shape-complex-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex.hh"
/* Hangul shaper */
@@ -56,7 +60,7 @@ collect_features_hangul (hb_ot_shape_planner_t *plan)
hb_ot_map_builder_t *map = &plan->map;
for (unsigned int i = FIRST_HANGUL_FEATURE; i < HANGUL_FEATURE_COUNT; i++)
- map->add_feature (hangul_features[i], 1, F_NONE);
+ map->add_feature (hangul_features[i]);
}
static void
@@ -65,13 +69,11 @@ override_features_hangul (hb_ot_shape_planner_t *plan)
/* Uniscribe does not apply 'calt' for Hangul, and certain fonts
* (Noto Sans CJK, Source Sans Han, etc) apply all of jamo lookups
* in calt, which is not desirable. */
- plan->map.add_feature (HB_TAG('c','a','l','t'), 0, F_GLOBAL);
+ plan->map.disable_feature (HB_TAG('c','a','l','t'));
}
struct hangul_shape_plan_t
{
- ASSERT_POD ();
-
hb_mask_t mask_array[HANGUL_FEATURE_COUNT];
};
@@ -128,7 +130,7 @@ is_zero_width_char (hb_font_t *font,
}
static void
-preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
+preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_buffer_t *buffer,
hb_font_t *font)
{
@@ -151,8 +153,8 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
* - <V>: U+1160..11A7, U+D7B0..D7C7
* - <T>: U+11A8..11FF, U+D7CB..D7FB
*
- * - Only the <L,V> sequences for the 11xx ranges combine.
- * - Only <LV,T> sequences for T in U+11A8..11C3 combine.
+ * - Only the <L,V> sequences for some of the U+11xx ranges combine.
+ * - Only <LV,T> sequences for some of the Ts in U+11xx range combine.
*
* Here is what we want to accomplish in this shaper:
*
@@ -188,7 +190,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
*/
unsigned int count = buffer->len;
- for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
+ for (buffer->idx = 0; buffer->idx < count && buffer->successful;)
{
hb_codepoint_t u = buffer->cur().codepoint;
@@ -202,7 +204,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
if (start < end && end == buffer->out_len)
{
/* Tone mark follows a valid syllable; move it in front, unless it's zero width. */
- buffer->unsafe_to_break_from_outbuffer (start, buffer->idx);
+ buffer->unsafe_to_break_from_outbuffer (start, buffer->idx);
buffer->next_glyph ();
if (!is_zero_width_char (font, u))
{
@@ -216,7 +218,8 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
else
{
/* No valid syllable as base for tone mark; try to insert dotted circle. */
- if (font->has_glyph (0x25CCu))
+ if (!(buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE) &&
+ font->has_glyph (0x25CCu))
{
hb_codepoint_t chars[2];
if (!is_zero_width_char (font, u)) {
@@ -269,7 +272,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
if (font->has_glyph (s))
{
buffer->replace_glyphs (t ? 3 : 2, 1, &s);
- if (unlikely (buffer->in_error))
+ if (unlikely (!buffer->successful))
return;
end = start + 1;
continue;
@@ -319,7 +322,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
if (font->has_glyph (new_s))
{
buffer->replace_glyphs (2, 1, &new_s);
- if (unlikely (buffer->in_error))
+ if (unlikely (!buffer->successful))
return;
end = start + 1;
continue;
@@ -345,29 +348,31 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
{
unsigned int s_len = tindex ? 3 : 2;
buffer->replace_glyphs (1, s_len, decomposed);
- if (unlikely (buffer->in_error))
- return;
-
- /* We decomposed S: apply jamo features to the individual glyphs
- * that are now in buffer->out_info.
- */
- hb_glyph_info_t *info = buffer->out_info;
/* If we decomposed an LV because of a non-combining T following,
* we want to include this T in the syllable.
*/
if (has_glyph && !tindex)
{
- buffer->next_glyph ();
- s_len++;
- }
- end = start + s_len;
+ buffer->next_glyph ();
+ s_len++;
+ }
+
+ if (unlikely (!buffer->successful))
+ return;
+
+ /* We decomposed S: apply jamo features to the individual glyphs
+ * that are now in buffer->out_info.
+ */
+ hb_glyph_info_t *info = buffer->out_info;
+ end = start + s_len;
unsigned int i = start;
info[i++].hangul_shaping_feature() = LJMO;
info[i++].hangul_shaping_feature() = VJMO;
if (i < end)
info[i++].hangul_shaping_feature() = TJMO;
+
if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
buffer->merge_out_clusters (start, end);
continue;
@@ -378,7 +383,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
if (has_glyph)
{
- /* We didn't decompose the S, so just advance past it. */
+ /* We didn't decompose the S, so just advance past it. */
end = start + 1;
buffer->next_glyph ();
continue;
@@ -424,8 +429,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hangul =
nullptr, /* decompose */
nullptr, /* compose */
setup_masks_hangul,
- nullptr, /* disable_otl */
+ HB_TAG_NONE, /* gpos_tag */
nullptr, /* reorder_marks */
HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
false, /* fallback_position */
};
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc
index 34cf28b8e2..334d3ded82 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc
@@ -24,7 +24,11 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-ot-shape-complex-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex.hh"
static bool
@@ -70,7 +74,11 @@ compose_hebrew (const hb_ot_shape_normalize_context_t *c,
bool found = (bool) c->unicode->compose (a, b, ab);
- if (!found && !c->plan->has_mark)
+#ifdef HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK
+ return found;
+#endif
+
+ if (!found && !c->plan->has_gpos_mark)
{
/* Special-case Hebrew presentation forms that are excluded from
* standard normalization, but wanted for old fonts. */
@@ -154,18 +162,6 @@ compose_hebrew (const hb_ot_shape_normalize_context_t *c,
return found;
}
-static bool
-disable_otl_hebrew (const hb_ot_shape_plan_t *plan)
-{
- /* For Hebrew shaper, use fallback if GPOS does not have 'hebr'
- * script. This matches Uniscribe better, and makes fonts like
- * Arial that have GSUB/GPOS/GDEF but no data for Hebrew work.
- * See:
- * https://github.com/harfbuzz/harfbuzz/issues/347#issuecomment-267838368
- */
- return plan->map.chosen_script[1] != HB_TAG ('h','e','b','r');
-}
-
const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew =
{
@@ -179,8 +175,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew =
nullptr, /* decompose */
compose_hebrew,
nullptr, /* setup_masks */
- disable_otl_hebrew,
+ HB_TAG ('h','e','b','r'), /* gpos_tag. https://github.com/harfbuzz/harfbuzz/issues/347#issuecomment-267838368 */
nullptr, /* reorder_marks */
HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
true, /* fallback_position */
};
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh
index 7eaba4e4e7..670b6bf486 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh
@@ -29,1111 +29,289 @@
#ifndef HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH
#define HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH
-#include "hb-private.hh"
+#include "hb.hh"
#line 36 "hb-ot-shape-complex-indic-machine.hh"
static const unsigned char _indic_syllable_machine_trans_keys[] = {
- 8u, 8u, 1u, 16u, 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u,
- 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u,
- 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u,
- 4u, 8u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u,
- 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 8u, 13u,
- 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u,
- 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u,
- 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u,
- 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u,
- 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u,
- 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u,
- 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u,
- 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u,
- 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u,
- 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u,
- 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u,
- 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u,
- 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u,
- 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 5u, 8u, 4u, 14u, 4u, 14u, 5u, 8u,
- 5u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u,
- 5u, 7u, 7u, 7u, 8u, 8u, 1u, 16u, 8u, 13u, 4u, 8u, 6u, 6u, 16u, 16u,
- 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u,
- 16u, 16u, 8u, 8u, 1u, 19u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u,
- 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u,
- 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u,
- 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u,
- 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
- 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
- 5u, 14u, 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u,
- 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u,
- 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u,
- 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u,
- 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u,
- 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
- 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u,
- 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
- 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
- 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u,
- 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
- 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
- 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u,
- 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u,
- 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u,
- 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 17u, 4u, 14u,
- 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
- 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
- 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u,
- 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
- 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
- 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u,
- 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u,
- 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u,
- 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u,
- 1u, 17u, 4u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u,
- 5u, 10u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 3u, 17u, 3u, 17u, 1u, 16u,
- 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
- 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
- 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u,
- 9u, 10u, 9u, 9u, 5u, 10u, 1u, 16u, 0
+ 8u, 8u, 4u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u,
+ 4u, 13u, 4u, 8u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u,
+ 4u, 8u, 4u, 13u, 4u, 13u, 4u, 13u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u,
+ 6u, 6u, 16u, 16u, 4u, 8u, 4u, 8u, 4u, 13u, 8u, 8u, 5u, 7u, 5u, 8u,
+ 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 4u, 8u, 5u, 8u, 8u, 8u, 1u, 19u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 5u, 10u, 5u, 10u, 10u, 10u, 5u, 10u,
+ 1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 4u, 10u, 5u, 10u, 4u, 10u, 5u, 10u,
+ 3u, 10u, 5u, 10u, 3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u,
+ 1u, 16u, 3u, 10u, 4u, 10u, 5u, 10u, 4u, 10u, 5u, 10u, 5u, 10u, 3u, 10u,
+ 5u, 10u, 3u, 17u, 3u, 17u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+ 3u, 17u, 1u, 16u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 1u, 16u, 3u, 10u,
+ 4u, 10u, 5u, 10u, 3u, 17u, 4u, 10u, 5u, 10u, 5u, 10u, 3u, 10u, 5u, 10u,
+ 3u, 17u, 4u, 13u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u,
+ 1u, 16u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 1u, 16u, 3u, 10u, 4u, 10u,
+ 5u, 10u, 3u, 17u, 4u, 10u, 5u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 1u, 17u,
+ 3u, 17u, 1u, 17u, 4u, 13u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 3u, 10u,
+ 5u, 10u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 0
};
static const char _indic_syllable_machine_key_spans[] = {
- 1, 16, 6, 4, 3, 1, 4, 3,
- 1, 4, 3, 1, 4, 3, 1, 5,
- 1, 1, 5, 1, 1, 5, 1, 1,
- 5, 1, 1, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 1, 16, 6,
- 4, 3, 1, 4, 3, 1, 4, 3,
- 1, 4, 3, 1, 5, 1, 1, 5,
- 1, 1, 5, 1, 1, 5, 1, 1,
- 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 1, 16, 6, 4, 3, 1,
- 4, 3, 1, 4, 3, 1, 4, 3,
- 1, 5, 1, 1, 5, 1, 1, 5,
- 1, 1, 5, 1, 1, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 1, 16,
- 6, 4, 3, 1, 4, 3, 1, 4,
- 3, 1, 4, 3, 1, 5, 1, 1,
- 5, 1, 1, 5, 1, 1, 5, 1,
- 1, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 4, 11, 11, 4,
- 3, 4, 3, 1, 4, 3, 1, 4,
- 3, 1, 1, 16, 6, 5, 1, 1,
- 5, 1, 1, 5, 1, 1, 5, 1,
- 1, 1, 19, 15, 15, 14, 16, 15,
- 15, 14, 16, 15, 15, 14, 16, 15,
- 15, 14, 16, 15, 15, 14, 10, 10,
- 6, 2, 1, 2, 2, 1, 6, 11,
- 8, 6, 8, 11, 12, 12, 11, 10,
- 12, 11, 10, 12, 11, 10, 12, 11,
- 10, 12, 16, 11, 15, 15, 16, 16,
- 16, 16, 16, 15, 15, 16, 16, 16,
- 16, 16, 15, 15, 16, 16, 16, 16,
- 16, 15, 15, 16, 16, 16, 16, 16,
- 15, 15, 15, 15, 14, 16, 15, 15,
- 14, 16, 15, 15, 14, 16, 15, 15,
- 14, 16, 15, 15, 14, 10, 10, 6,
- 2, 1, 2, 2, 1, 6, 11, 8,
- 6, 8, 11, 12, 12, 11, 10, 12,
- 11, 10, 12, 11, 10, 12, 11, 10,
- 12, 16, 11, 15, 15, 16, 16, 16,
- 16, 16, 15, 15, 16, 16, 16, 16,
- 16, 15, 15, 16, 16, 16, 16, 16,
- 15, 15, 16, 16, 16, 16, 11, 16,
- 15, 15, 14, 16, 15, 15, 14, 16,
- 15, 15, 14, 16, 15, 15, 14, 16,
- 15, 15, 14, 10, 10, 6, 2, 1,
- 2, 2, 1, 6, 11, 8, 6, 8,
- 11, 12, 12, 11, 10, 12, 11, 10,
- 12, 11, 10, 12, 11, 10, 12, 16,
- 11, 15, 15, 16, 16, 16, 16, 16,
- 15, 15, 16, 16, 16, 16, 16, 15,
- 15, 16, 16, 16, 16, 16, 15, 15,
- 16, 16, 16, 16, 16, 11, 15, 11,
- 15, 15, 14, 16, 15, 15, 14, 16,
- 15, 15, 14, 16, 15, 15, 14, 16,
- 15, 15, 14, 10, 10, 6, 2, 1,
- 2, 2, 1, 6, 11, 8, 6, 8,
- 11, 12, 12, 11, 10, 12, 11, 10,
- 12, 11, 10, 12, 11, 10, 12, 16,
- 11, 15, 15, 16, 16, 16, 16, 16,
- 15, 15, 16, 16, 16, 16, 16, 15,
- 15, 16, 16, 16, 16, 16, 15, 15,
- 16, 16, 16, 16, 16, 15, 17, 15,
- 17, 11, 6, 2, 1, 2, 2, 1,
- 6, 16, 15, 15, 14, 15, 15, 16,
- 12, 11, 10, 12, 11, 10, 12, 11,
- 10, 12, 11, 10, 11, 8, 6, 8,
- 11, 16, 8, 6, 6, 2, 1, 2,
- 2, 1, 6, 16
+ 1, 5, 3, 4, 5, 1, 1, 5,
+ 10, 5, 1, 3, 4, 5, 1, 1,
+ 5, 10, 10, 10, 1, 3, 4, 5,
+ 1, 1, 5, 5, 10, 1, 3, 4,
+ 5, 1, 1, 5, 5, 4, 1, 19,
+ 15, 15, 14, 16, 6, 6, 1, 6,
+ 16, 16, 16, 8, 7, 6, 7, 6,
+ 8, 6, 15, 15, 15, 15, 14, 16,
+ 15, 15, 14, 16, 6, 1, 6, 16,
+ 16, 8, 7, 6, 7, 6, 6, 8,
+ 6, 15, 15, 5, 15, 15, 14, 16,
+ 15, 16, 6, 1, 6, 16, 16, 8,
+ 7, 6, 15, 7, 6, 6, 8, 6,
+ 15, 10, 5, 15, 15, 14, 16, 15,
+ 16, 6, 1, 6, 16, 16, 8, 7,
+ 6, 15, 7, 6, 6, 8, 6, 17,
+ 15, 17, 10, 6, 1, 6, 16, 8,
+ 6, 6, 1, 6, 16
};
static const short _indic_syllable_machine_index_offsets[] = {
- 0, 2, 19, 26, 31, 35, 37, 42,
- 46, 48, 53, 57, 59, 64, 68, 70,
- 76, 78, 80, 86, 88, 90, 96, 98,
- 100, 106, 108, 110, 122, 134, 146, 158,
- 170, 182, 194, 206, 218, 230, 232, 249,
- 256, 261, 265, 267, 272, 276, 278, 283,
- 287, 289, 294, 298, 300, 306, 308, 310,
- 316, 318, 320, 326, 328, 330, 336, 338,
- 340, 352, 364, 376, 388, 400, 412, 424,
- 436, 448, 460, 462, 479, 486, 491, 495,
- 497, 502, 506, 508, 513, 517, 519, 524,
- 528, 530, 536, 538, 540, 546, 548, 550,
- 556, 558, 560, 566, 568, 570, 582, 594,
- 606, 618, 630, 642, 654, 666, 678, 680,
- 697, 704, 709, 713, 715, 720, 724, 726,
- 731, 735, 737, 742, 746, 748, 754, 756,
- 758, 764, 766, 768, 774, 776, 778, 784,
- 786, 788, 800, 812, 824, 836, 848, 860,
- 872, 884, 896, 908, 920, 925, 937, 949,
- 954, 958, 963, 967, 969, 974, 978, 980,
- 985, 989, 991, 993, 1010, 1017, 1023, 1025,
- 1027, 1033, 1035, 1037, 1043, 1045, 1047, 1053,
- 1055, 1057, 1059, 1079, 1095, 1111, 1126, 1143,
- 1159, 1175, 1190, 1207, 1223, 1239, 1254, 1271,
- 1287, 1303, 1318, 1335, 1351, 1367, 1382, 1393,
- 1404, 1411, 1414, 1416, 1419, 1422, 1424, 1431,
- 1443, 1452, 1459, 1468, 1480, 1493, 1506, 1518,
- 1529, 1542, 1554, 1565, 1578, 1590, 1601, 1614,
- 1626, 1637, 1650, 1667, 1679, 1695, 1711, 1728,
- 1745, 1762, 1779, 1796, 1812, 1828, 1845, 1862,
- 1879, 1896, 1913, 1929, 1945, 1962, 1979, 1996,
- 2013, 2030, 2046, 2062, 2079, 2096, 2113, 2130,
- 2147, 2163, 2179, 2195, 2211, 2226, 2243, 2259,
- 2275, 2290, 2307, 2323, 2339, 2354, 2371, 2387,
- 2403, 2418, 2435, 2451, 2467, 2482, 2493, 2504,
- 2511, 2514, 2516, 2519, 2522, 2524, 2531, 2543,
- 2552, 2559, 2568, 2580, 2593, 2606, 2618, 2629,
- 2642, 2654, 2665, 2678, 2690, 2701, 2714, 2726,
- 2737, 2750, 2767, 2779, 2795, 2811, 2828, 2845,
- 2862, 2879, 2896, 2912, 2928, 2945, 2962, 2979,
- 2996, 3013, 3029, 3045, 3062, 3079, 3096, 3113,
- 3130, 3146, 3162, 3179, 3196, 3213, 3230, 3242,
- 3259, 3275, 3291, 3306, 3323, 3339, 3355, 3370,
- 3387, 3403, 3419, 3434, 3451, 3467, 3483, 3498,
- 3515, 3531, 3547, 3562, 3573, 3584, 3591, 3594,
- 3596, 3599, 3602, 3604, 3611, 3623, 3632, 3639,
- 3648, 3660, 3673, 3686, 3698, 3709, 3722, 3734,
- 3745, 3758, 3770, 3781, 3794, 3806, 3817, 3830,
- 3847, 3859, 3875, 3891, 3908, 3925, 3942, 3959,
- 3976, 3992, 4008, 4025, 4042, 4059, 4076, 4093,
- 4109, 4125, 4142, 4159, 4176, 4193, 4210, 4226,
- 4242, 4259, 4276, 4293, 4310, 4327, 4339, 4355,
- 4367, 4383, 4399, 4414, 4431, 4447, 4463, 4478,
- 4495, 4511, 4527, 4542, 4559, 4575, 4591, 4606,
- 4623, 4639, 4655, 4670, 4681, 4692, 4699, 4702,
- 4704, 4707, 4710, 4712, 4719, 4731, 4740, 4747,
- 4756, 4768, 4781, 4794, 4806, 4817, 4830, 4842,
- 4853, 4866, 4878, 4889, 4902, 4914, 4925, 4938,
- 4955, 4967, 4983, 4999, 5016, 5033, 5050, 5067,
- 5084, 5100, 5116, 5133, 5150, 5167, 5184, 5201,
- 5217, 5233, 5250, 5267, 5284, 5301, 5318, 5334,
- 5350, 5367, 5384, 5401, 5418, 5435, 5451, 5469,
- 5485, 5503, 5515, 5522, 5525, 5527, 5530, 5533,
- 5535, 5542, 5559, 5575, 5591, 5606, 5622, 5638,
- 5655, 5668, 5680, 5691, 5704, 5716, 5727, 5740,
- 5752, 5763, 5776, 5788, 5799, 5811, 5820, 5827,
- 5836, 5848, 5865, 5874, 5881, 5888, 5891, 5893,
- 5896, 5899, 5901, 5908
+ 0, 2, 8, 12, 17, 23, 25, 27,
+ 33, 44, 50, 52, 56, 61, 67, 69,
+ 71, 77, 88, 99, 110, 112, 116, 121,
+ 127, 129, 131, 137, 143, 154, 156, 160,
+ 165, 171, 173, 175, 181, 187, 192, 194,
+ 214, 230, 246, 261, 278, 285, 292, 294,
+ 301, 318, 335, 352, 361, 369, 376, 384,
+ 391, 400, 407, 423, 439, 455, 471, 486,
+ 503, 519, 535, 550, 567, 574, 576, 583,
+ 600, 617, 626, 634, 641, 649, 656, 663,
+ 672, 679, 695, 711, 717, 733, 749, 764,
+ 781, 797, 814, 821, 823, 830, 847, 864,
+ 873, 881, 888, 904, 912, 919, 926, 935,
+ 942, 958, 969, 975, 991, 1007, 1022, 1039,
+ 1055, 1072, 1079, 1081, 1088, 1105, 1122, 1131,
+ 1139, 1146, 1162, 1170, 1177, 1184, 1193, 1200,
+ 1218, 1234, 1252, 1263, 1270, 1272, 1279, 1296,
+ 1305, 1312, 1319, 1321, 1328
};
-static const short _indic_syllable_machine_indicies[] = {
- 1, 0, 2, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2, 0, 1, 0, 0, 0, 0,
- 4, 0, 5, 5, 6, 1, 0, 7,
- 7, 6, 0, 6, 0, 8, 8, 9,
- 1, 0, 10, 10, 9, 0, 9, 0,
- 11, 11, 12, 1, 0, 13, 13, 12,
- 0, 12, 0, 14, 14, 15, 1, 0,
- 16, 16, 15, 0, 15, 0, 17, 0,
- 0, 0, 1, 0, 18, 0, 19, 0,
- 20, 14, 14, 15, 1, 0, 21, 0,
- 22, 0, 23, 11, 11, 12, 1, 0,
- 24, 0, 25, 0, 26, 8, 8, 9,
- 1, 0, 27, 0, 28, 0, 29, 5,
- 5, 6, 1, 0, 0, 0, 0, 0,
- 29, 0, 29, 5, 5, 6, 1, 0,
- 0, 0, 0, 30, 29, 0, 31, 5,
- 5, 6, 1, 0, 0, 0, 0, 0,
- 31, 0, 31, 5, 5, 6, 1, 0,
- 0, 0, 0, 32, 31, 0, 33, 5,
- 5, 6, 1, 0, 0, 0, 0, 0,
- 33, 0, 33, 5, 5, 6, 1, 0,
- 0, 0, 0, 34, 33, 0, 35, 5,
- 5, 6, 1, 0, 0, 0, 0, 0,
- 35, 0, 35, 5, 5, 6, 1, 0,
- 0, 0, 0, 36, 35, 0, 37, 5,
- 5, 6, 1, 0, 0, 0, 0, 0,
- 37, 0, 37, 5, 5, 6, 1, 0,
- 0, 0, 0, 38, 37, 0, 40, 39,
- 41, 42, 39, 39, 39, 39, 39, 39,
- 39, 39, 39, 39, 39, 39, 39, 41,
- 39, 40, 39, 39, 39, 39, 43, 39,
- 44, 44, 45, 40, 39, 46, 46, 45,
- 39, 45, 39, 47, 47, 48, 40, 39,
- 49, 49, 48, 39, 48, 39, 50, 50,
- 51, 40, 39, 52, 52, 51, 39, 51,
- 39, 53, 53, 54, 40, 39, 55, 55,
- 54, 39, 54, 39, 56, 39, 39, 39,
- 40, 39, 57, 39, 58, 39, 59, 53,
- 53, 54, 40, 39, 60, 39, 61, 39,
- 62, 50, 50, 51, 40, 39, 63, 39,
- 64, 39, 65, 47, 47, 48, 40, 39,
- 66, 39, 67, 39, 68, 44, 44, 45,
- 40, 39, 39, 39, 39, 39, 68, 39,
- 68, 44, 44, 45, 40, 39, 39, 39,
- 39, 69, 68, 39, 70, 44, 44, 45,
- 40, 39, 39, 39, 39, 39, 70, 39,
- 70, 44, 44, 45, 40, 39, 39, 39,
- 39, 71, 70, 39, 72, 44, 44, 45,
- 40, 39, 39, 39, 39, 39, 72, 39,
- 72, 44, 44, 45, 40, 39, 39, 39,
- 39, 73, 72, 39, 74, 44, 44, 45,
- 40, 39, 39, 39, 39, 39, 74, 39,
- 74, 44, 44, 45, 40, 39, 39, 39,
- 39, 75, 74, 39, 76, 44, 44, 45,
- 40, 39, 39, 39, 39, 39, 76, 39,
- 76, 44, 44, 45, 40, 39, 39, 39,
- 39, 77, 76, 39, 79, 78, 80, 81,
- 78, 78, 78, 78, 78, 78, 78, 78,
- 78, 78, 78, 78, 78, 80, 78, 79,
- 78, 78, 78, 78, 82, 78, 83, 83,
- 84, 79, 78, 86, 86, 84, 85, 84,
- 85, 87, 87, 88, 79, 78, 89, 89,
- 88, 78, 88, 78, 90, 90, 91, 79,
- 78, 92, 92, 91, 78, 91, 78, 93,
- 93, 94, 79, 78, 95, 95, 94, 78,
- 94, 78, 96, 78, 78, 78, 79, 78,
- 97, 78, 98, 78, 99, 93, 93, 94,
- 79, 78, 100, 78, 101, 78, 102, 90,
- 90, 91, 79, 78, 103, 78, 104, 78,
- 105, 87, 87, 88, 79, 78, 106, 78,
- 107, 78, 108, 83, 83, 84, 79, 78,
- 78, 78, 78, 78, 108, 78, 108, 83,
- 83, 84, 79, 78, 78, 78, 78, 109,
- 108, 78, 110, 83, 83, 84, 79, 78,
- 78, 78, 78, 78, 110, 78, 110, 83,
- 83, 84, 79, 78, 78, 78, 78, 111,
- 110, 78, 112, 83, 83, 84, 79, 78,
- 78, 78, 78, 78, 112, 78, 112, 83,
- 83, 84, 79, 78, 78, 78, 78, 113,
- 112, 78, 114, 83, 83, 84, 79, 78,
- 78, 78, 78, 78, 114, 78, 114, 83,
- 83, 84, 79, 78, 78, 78, 78, 115,
- 114, 78, 116, 83, 83, 84, 79, 78,
- 78, 78, 78, 78, 116, 78, 118, 117,
- 119, 120, 117, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 119,
- 117, 118, 117, 117, 117, 117, 121, 117,
- 122, 122, 123, 118, 117, 124, 124, 123,
- 117, 123, 117, 125, 125, 126, 118, 117,
- 127, 127, 126, 117, 126, 117, 128, 128,
- 129, 118, 117, 130, 130, 129, 117, 129,
- 117, 131, 131, 132, 118, 117, 133, 133,
- 132, 117, 132, 117, 134, 117, 117, 117,
- 118, 117, 135, 117, 136, 117, 137, 131,
- 131, 132, 118, 117, 138, 117, 139, 117,
- 140, 128, 128, 129, 118, 117, 141, 117,
- 142, 117, 143, 125, 125, 126, 118, 117,
- 144, 117, 145, 117, 146, 122, 122, 123,
- 118, 117, 117, 117, 117, 117, 146, 117,
- 146, 122, 122, 123, 118, 117, 117, 117,
- 117, 147, 146, 117, 148, 122, 122, 123,
- 118, 117, 117, 117, 117, 117, 148, 117,
- 148, 122, 122, 123, 118, 117, 117, 117,
- 117, 149, 148, 117, 150, 122, 122, 123,
- 118, 117, 117, 117, 117, 117, 150, 117,
- 150, 122, 122, 123, 118, 117, 117, 117,
- 117, 151, 150, 117, 152, 122, 122, 123,
- 118, 117, 117, 117, 117, 117, 152, 117,
- 152, 122, 122, 123, 118, 117, 117, 117,
- 117, 153, 152, 117, 154, 122, 122, 123,
- 118, 117, 117, 117, 117, 117, 154, 117,
- 154, 122, 122, 123, 118, 117, 117, 117,
- 117, 155, 154, 117, 116, 83, 83, 84,
- 79, 78, 78, 78, 78, 156, 116, 78,
- 86, 86, 84, 1, 0, 114, 83, 83,
- 84, 157, 0, 0, 0, 0, 0, 114,
- 0, 114, 83, 83, 84, 157, 0, 0,
- 0, 0, 158, 114, 0, 159, 159, 160,
- 1, 0, 7, 7, 160, 0, 161, 161,
- 162, 157, 0, 163, 163, 162, 0, 162,
- 0, 164, 164, 165, 157, 0, 166, 166,
- 165, 0, 165, 0, 167, 167, 168, 157,
- 0, 169, 169, 168, 0, 168, 0, 157,
- 0, 170, 171, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 170, 0, 157, 0, 0, 0, 0, 172,
- 0, 173, 0, 0, 0, 157, 0, 174,
- 0, 175, 0, 176, 167, 167, 168, 157,
- 0, 177, 0, 178, 0, 179, 164, 164,
- 165, 157, 0, 180, 0, 181, 0, 182,
- 161, 161, 162, 157, 0, 183, 0, 184,
- 0, 186, 185, 188, 189, 190, 191, 192,
- 193, 84, 79, 194, 195, 196, 196, 156,
- 197, 198, 199, 200, 201, 202, 187, 204,
- 205, 206, 207, 6, 1, 208, 209, 203,
- 203, 38, 210, 203, 203, 211, 203, 212,
- 205, 213, 213, 6, 1, 208, 209, 203,
- 203, 203, 210, 203, 203, 211, 203, 205,
- 213, 213, 6, 1, 208, 209, 203, 203,
- 203, 210, 203, 203, 211, 203, 214, 203,
- 203, 203, 19, 215, 203, 1, 208, 209,
- 203, 203, 203, 216, 203, 214, 203, 217,
- 218, 219, 220, 6, 1, 208, 209, 203,
- 203, 36, 221, 203, 203, 211, 203, 222,
- 218, 223, 223, 6, 1, 208, 209, 203,
- 203, 203, 221, 203, 203, 211, 203, 218,
- 223, 223, 6, 1, 208, 209, 203, 203,
- 203, 221, 203, 203, 211, 203, 224, 203,
- 203, 203, 19, 225, 203, 1, 208, 209,
- 203, 203, 203, 216, 203, 224, 203, 226,
- 227, 228, 229, 6, 1, 208, 209, 203,
- 203, 34, 230, 203, 203, 211, 203, 231,
- 227, 232, 232, 6, 1, 208, 209, 203,
- 203, 203, 230, 203, 203, 211, 203, 227,
- 232, 232, 6, 1, 208, 209, 203, 203,
- 203, 230, 203, 203, 211, 203, 233, 203,
- 203, 203, 19, 234, 203, 1, 208, 209,
- 203, 203, 203, 216, 203, 233, 203, 235,
- 236, 237, 238, 6, 1, 208, 209, 203,
- 203, 32, 239, 203, 203, 211, 203, 240,
- 236, 241, 241, 6, 1, 208, 209, 203,
- 203, 203, 239, 203, 203, 211, 203, 236,
- 241, 241, 6, 1, 208, 209, 203, 203,
- 203, 239, 203, 203, 211, 203, 242, 203,
- 203, 203, 19, 243, 203, 1, 208, 209,
- 203, 203, 203, 216, 203, 242, 203, 244,
- 245, 246, 247, 6, 1, 208, 209, 203,
- 203, 30, 248, 203, 203, 211, 203, 249,
- 245, 250, 250, 6, 1, 208, 209, 203,
- 203, 203, 248, 203, 203, 211, 203, 245,
- 250, 250, 6, 1, 208, 209, 203, 203,
- 203, 248, 203, 203, 211, 203, 19, 251,
- 203, 1, 208, 209, 203, 203, 203, 216,
- 203, 252, 252, 203, 1, 208, 209, 203,
- 203, 203, 216, 203, 253, 203, 203, 254,
- 208, 209, 203, 208, 209, 203, 255, 203,
- 208, 256, 203, 208, 257, 203, 208, 203,
- 253, 203, 203, 203, 208, 209, 203, 258,
- 203, 259, 260, 203, 1, 208, 209, 203,
- 203, 4, 203, 3, 203, 252, 252, 203,
- 1, 208, 209, 203, 252, 252, 203, 1,
- 208, 209, 203, 258, 203, 252, 252, 203,
- 1, 208, 209, 203, 258, 203, 259, 252,
- 203, 1, 208, 209, 203, 203, 4, 203,
- 19, 203, 261, 261, 6, 1, 208, 209,
- 203, 203, 203, 216, 203, 262, 28, 263,
- 264, 9, 1, 208, 209, 203, 203, 203,
- 216, 203, 28, 263, 264, 9, 1, 208,
- 209, 203, 203, 203, 216, 203, 263, 263,
- 9, 1, 208, 209, 203, 203, 203, 216,
- 203, 265, 25, 266, 267, 12, 1, 208,
- 209, 203, 203, 203, 216, 203, 25, 266,
- 267, 12, 1, 208, 209, 203, 203, 203,
- 216, 203, 266, 266, 12, 1, 208, 209,
- 203, 203, 203, 216, 203, 268, 22, 269,
- 270, 15, 1, 208, 209, 203, 203, 203,
- 216, 203, 22, 269, 270, 15, 1, 208,
- 209, 203, 203, 203, 216, 203, 269, 269,
- 15, 1, 208, 209, 203, 203, 203, 216,
- 203, 271, 19, 252, 272, 203, 1, 208,
- 209, 203, 203, 203, 216, 203, 19, 252,
- 272, 203, 1, 208, 209, 203, 203, 203,
- 216, 203, 252, 273, 203, 1, 208, 209,
- 203, 203, 203, 216, 203, 19, 203, 252,
- 252, 203, 1, 208, 209, 203, 203, 203,
- 216, 203, 2, 3, 203, 203, 19, 251,
- 203, 1, 208, 209, 203, 203, 203, 216,
- 203, 2, 203, 245, 250, 250, 6, 1,
- 208, 209, 203, 203, 203, 248, 203, 244,
- 245, 250, 250, 6, 1, 208, 209, 203,
- 203, 203, 248, 203, 203, 211, 203, 244,
- 245, 246, 250, 6, 1, 208, 209, 203,
- 203, 30, 248, 203, 203, 211, 203, 242,
- 203, 274, 203, 261, 261, 6, 1, 208,
- 209, 203, 203, 203, 216, 203, 242, 203,
- 242, 203, 203, 203, 252, 252, 203, 1,
- 208, 209, 203, 203, 203, 216, 203, 242,
- 203, 242, 203, 203, 203, 252, 275, 203,
- 1, 208, 209, 203, 203, 203, 216, 203,
- 242, 203, 242, 203, 274, 203, 252, 252,
- 203, 1, 208, 209, 203, 203, 203, 216,
- 203, 242, 203, 242, 3, 203, 203, 19,
- 243, 203, 1, 208, 209, 203, 203, 203,
- 216, 203, 242, 203, 235, 236, 241, 241,
- 6, 1, 208, 209, 203, 203, 203, 239,
- 203, 203, 211, 203, 235, 236, 237, 241,
- 6, 1, 208, 209, 203, 203, 32, 239,
- 203, 203, 211, 203, 233, 203, 276, 203,
- 261, 261, 6, 1, 208, 209, 203, 203,
- 203, 216, 203, 233, 203, 233, 203, 203,
- 203, 252, 252, 203, 1, 208, 209, 203,
- 203, 203, 216, 203, 233, 203, 233, 203,
- 203, 203, 252, 277, 203, 1, 208, 209,
- 203, 203, 203, 216, 203, 233, 203, 233,
- 203, 276, 203, 252, 252, 203, 1, 208,
- 209, 203, 203, 203, 216, 203, 233, 203,
- 233, 3, 203, 203, 19, 234, 203, 1,
- 208, 209, 203, 203, 203, 216, 203, 233,
- 203, 226, 227, 232, 232, 6, 1, 208,
- 209, 203, 203, 203, 230, 203, 203, 211,
- 203, 226, 227, 228, 232, 6, 1, 208,
- 209, 203, 203, 34, 230, 203, 203, 211,
- 203, 224, 203, 278, 203, 261, 261, 6,
- 1, 208, 209, 203, 203, 203, 216, 203,
- 224, 203, 224, 203, 203, 203, 252, 252,
- 203, 1, 208, 209, 203, 203, 203, 216,
- 203, 224, 203, 224, 203, 203, 203, 252,
- 279, 203, 1, 208, 209, 203, 203, 203,
- 216, 203, 224, 203, 224, 203, 278, 203,
- 252, 252, 203, 1, 208, 209, 203, 203,
- 203, 216, 203, 224, 203, 224, 3, 203,
- 203, 19, 225, 203, 1, 208, 209, 203,
- 203, 203, 216, 203, 224, 203, 217, 218,
- 223, 223, 6, 1, 208, 209, 203, 203,
- 203, 221, 203, 203, 211, 203, 217, 218,
- 219, 223, 6, 1, 208, 209, 203, 203,
- 36, 221, 203, 203, 211, 203, 214, 203,
- 280, 203, 261, 261, 6, 1, 208, 209,
- 203, 203, 203, 216, 203, 214, 203, 214,
- 203, 203, 203, 252, 252, 203, 1, 208,
- 209, 203, 203, 203, 216, 203, 214, 203,
- 214, 203, 203, 203, 252, 281, 203, 1,
- 208, 209, 203, 203, 203, 216, 203, 214,
- 203, 214, 203, 280, 203, 252, 252, 203,
- 1, 208, 209, 203, 203, 203, 216, 203,
- 214, 203, 214, 3, 203, 203, 19, 215,
- 203, 1, 208, 209, 203, 203, 203, 216,
- 203, 214, 203, 204, 205, 213, 213, 6,
- 1, 208, 209, 203, 203, 203, 210, 203,
- 203, 211, 203, 204, 205, 206, 213, 6,
- 1, 208, 209, 203, 203, 38, 210, 203,
- 203, 211, 203, 283, 284, 285, 286, 45,
- 40, 287, 288, 282, 282, 77, 289, 282,
- 282, 290, 282, 291, 284, 292, 286, 45,
- 40, 287, 288, 282, 282, 282, 289, 282,
- 282, 290, 282, 284, 292, 286, 45, 40,
- 287, 288, 282, 282, 282, 289, 282, 282,
- 290, 282, 293, 282, 282, 282, 58, 294,
- 282, 40, 287, 288, 282, 282, 282, 295,
- 282, 293, 282, 296, 297, 298, 299, 45,
- 40, 287, 288, 282, 282, 75, 300, 282,
- 282, 290, 282, 301, 297, 302, 302, 45,
- 40, 287, 288, 282, 282, 282, 300, 282,
- 282, 290, 282, 297, 302, 302, 45, 40,
- 287, 288, 282, 282, 282, 300, 282, 282,
- 290, 282, 303, 282, 282, 282, 58, 304,
- 282, 40, 287, 288, 282, 282, 282, 295,
- 282, 303, 282, 305, 306, 307, 308, 45,
- 40, 287, 288, 282, 282, 73, 309, 282,
- 282, 290, 282, 310, 306, 311, 311, 45,
- 40, 287, 288, 282, 282, 282, 309, 282,
- 282, 290, 282, 306, 311, 311, 45, 40,
- 287, 288, 282, 282, 282, 309, 282, 282,
- 290, 282, 312, 282, 282, 282, 58, 313,
- 282, 40, 287, 288, 282, 282, 282, 295,
- 282, 312, 282, 314, 315, 316, 317, 45,
- 40, 287, 288, 282, 282, 71, 318, 282,
- 282, 290, 282, 319, 315, 320, 320, 45,
- 40, 287, 288, 282, 282, 282, 318, 282,
- 282, 290, 282, 315, 320, 320, 45, 40,
- 287, 288, 282, 282, 282, 318, 282, 282,
- 290, 282, 321, 282, 282, 282, 58, 322,
- 282, 40, 287, 288, 282, 282, 282, 295,
- 282, 321, 282, 323, 324, 325, 326, 45,
- 40, 287, 288, 282, 282, 69, 327, 282,
- 282, 290, 282, 328, 324, 329, 329, 45,
- 40, 287, 288, 282, 282, 282, 327, 282,
- 282, 290, 282, 324, 329, 329, 45, 40,
- 287, 288, 282, 282, 282, 327, 282, 282,
- 290, 282, 58, 330, 282, 40, 287, 288,
- 282, 282, 282, 295, 282, 331, 331, 282,
- 40, 287, 288, 282, 282, 282, 295, 282,
- 332, 282, 282, 333, 287, 288, 282, 287,
- 288, 282, 334, 282, 287, 335, 282, 287,
- 336, 282, 287, 282, 332, 282, 282, 282,
- 287, 288, 282, 337, 282, 338, 339, 282,
- 40, 287, 288, 282, 282, 43, 282, 42,
- 282, 331, 331, 282, 40, 287, 288, 282,
- 331, 331, 282, 40, 287, 288, 282, 337,
- 282, 331, 331, 282, 40, 287, 288, 282,
- 337, 282, 338, 331, 282, 40, 287, 288,
- 282, 282, 43, 282, 58, 282, 340, 340,
- 45, 40, 287, 288, 282, 282, 282, 295,
- 282, 341, 67, 342, 343, 48, 40, 287,
- 288, 282, 282, 282, 295, 282, 67, 342,
- 343, 48, 40, 287, 288, 282, 282, 282,
- 295, 282, 342, 342, 48, 40, 287, 288,
- 282, 282, 282, 295, 282, 344, 64, 345,
- 346, 51, 40, 287, 288, 282, 282, 282,
- 295, 282, 64, 345, 346, 51, 40, 287,
- 288, 282, 282, 282, 295, 282, 345, 345,
- 51, 40, 287, 288, 282, 282, 282, 295,
- 282, 347, 61, 348, 349, 54, 40, 287,
- 288, 282, 282, 282, 295, 282, 61, 348,
- 349, 54, 40, 287, 288, 282, 282, 282,
- 295, 282, 348, 348, 54, 40, 287, 288,
- 282, 282, 282, 295, 282, 350, 58, 331,
- 351, 282, 40, 287, 288, 282, 282, 282,
- 295, 282, 58, 331, 351, 282, 40, 287,
- 288, 282, 282, 282, 295, 282, 331, 352,
- 282, 40, 287, 288, 282, 282, 282, 295,
- 282, 58, 282, 331, 331, 282, 40, 287,
- 288, 282, 282, 282, 295, 282, 41, 42,
- 282, 282, 58, 330, 282, 40, 287, 288,
- 282, 282, 282, 295, 282, 41, 282, 324,
- 329, 329, 45, 40, 287, 288, 282, 282,
- 282, 327, 282, 323, 324, 329, 329, 45,
- 40, 287, 288, 282, 282, 282, 327, 282,
- 282, 290, 282, 323, 324, 325, 329, 45,
- 40, 287, 288, 282, 282, 69, 327, 282,
- 282, 290, 282, 321, 282, 353, 282, 340,
- 340, 45, 40, 287, 288, 282, 282, 282,
- 295, 282, 321, 282, 321, 282, 282, 282,
- 331, 331, 282, 40, 287, 288, 282, 282,
- 282, 295, 282, 321, 282, 321, 282, 282,
- 282, 331, 354, 282, 40, 287, 288, 282,
- 282, 282, 295, 282, 321, 282, 321, 282,
- 353, 282, 331, 331, 282, 40, 287, 288,
- 282, 282, 282, 295, 282, 321, 282, 321,
- 42, 282, 282, 58, 322, 282, 40, 287,
- 288, 282, 282, 282, 295, 282, 321, 282,
- 314, 315, 320, 320, 45, 40, 287, 288,
- 282, 282, 282, 318, 282, 282, 290, 282,
- 314, 315, 316, 320, 45, 40, 287, 288,
- 282, 282, 71, 318, 282, 282, 290, 282,
- 312, 282, 355, 282, 340, 340, 45, 40,
- 287, 288, 282, 282, 282, 295, 282, 312,
- 282, 312, 282, 282, 282, 331, 331, 282,
- 40, 287, 288, 282, 282, 282, 295, 282,
- 312, 282, 312, 282, 282, 282, 331, 356,
- 282, 40, 287, 288, 282, 282, 282, 295,
- 282, 312, 282, 312, 282, 355, 282, 331,
- 331, 282, 40, 287, 288, 282, 282, 282,
- 295, 282, 312, 282, 312, 42, 282, 282,
- 58, 313, 282, 40, 287, 288, 282, 282,
- 282, 295, 282, 312, 282, 305, 306, 311,
- 311, 45, 40, 287, 288, 282, 282, 282,
- 309, 282, 282, 290, 282, 305, 306, 307,
- 311, 45, 40, 287, 288, 282, 282, 73,
- 309, 282, 282, 290, 282, 303, 282, 357,
- 282, 340, 340, 45, 40, 287, 288, 282,
- 282, 282, 295, 282, 303, 282, 303, 282,
- 282, 282, 331, 331, 282, 40, 287, 288,
- 282, 282, 282, 295, 282, 303, 282, 303,
- 282, 282, 282, 331, 358, 282, 40, 287,
- 288, 282, 282, 282, 295, 282, 303, 282,
- 303, 282, 357, 282, 331, 331, 282, 40,
- 287, 288, 282, 282, 282, 295, 282, 303,
- 282, 303, 42, 282, 282, 58, 304, 282,
- 40, 287, 288, 282, 282, 282, 295, 282,
- 303, 282, 296, 297, 302, 302, 45, 40,
- 287, 288, 282, 282, 282, 300, 282, 282,
- 290, 282, 296, 297, 298, 302, 45, 40,
- 287, 288, 282, 282, 75, 300, 282, 282,
- 290, 282, 293, 282, 359, 282, 340, 340,
- 45, 40, 287, 288, 282, 282, 282, 295,
- 282, 293, 282, 293, 282, 282, 282, 331,
- 331, 282, 40, 287, 288, 282, 282, 282,
- 295, 282, 293, 282, 293, 282, 282, 282,
- 331, 360, 282, 40, 287, 288, 282, 282,
- 282, 295, 282, 293, 282, 293, 282, 359,
- 282, 331, 331, 282, 40, 287, 288, 282,
- 282, 282, 295, 282, 293, 282, 76, 44,
- 44, 45, 40, 282, 282, 282, 282, 282,
- 76, 282, 293, 42, 282, 282, 58, 294,
- 282, 40, 287, 288, 282, 282, 282, 295,
- 282, 293, 282, 283, 284, 292, 286, 45,
- 40, 287, 288, 282, 282, 282, 289, 282,
- 282, 290, 282, 362, 191, 363, 363, 84,
- 79, 194, 195, 361, 361, 361, 197, 361,
- 361, 200, 361, 191, 363, 363, 84, 79,
- 194, 195, 361, 361, 361, 197, 361, 361,
- 200, 361, 364, 361, 361, 361, 98, 365,
- 361, 79, 194, 195, 361, 361, 361, 366,
- 361, 364, 361, 367, 368, 369, 370, 84,
- 79, 194, 195, 361, 361, 115, 371, 361,
- 361, 200, 361, 372, 368, 373, 373, 84,
- 79, 194, 195, 361, 361, 361, 371, 361,
- 361, 200, 361, 368, 373, 373, 84, 79,
- 194, 195, 361, 361, 361, 371, 361, 361,
- 200, 361, 374, 361, 361, 361, 98, 375,
- 361, 79, 194, 195, 361, 361, 361, 366,
- 361, 374, 361, 376, 377, 378, 379, 84,
- 79, 194, 195, 361, 361, 113, 380, 361,
- 361, 200, 361, 381, 377, 382, 382, 84,
- 79, 194, 195, 361, 361, 361, 380, 361,
- 361, 200, 361, 377, 382, 382, 84, 79,
- 194, 195, 361, 361, 361, 380, 361, 361,
- 200, 361, 383, 361, 361, 361, 98, 384,
- 361, 79, 194, 195, 361, 361, 361, 366,
- 361, 383, 361, 385, 386, 387, 388, 84,
- 79, 194, 195, 361, 361, 111, 389, 361,
- 361, 200, 361, 390, 386, 391, 391, 84,
- 79, 194, 195, 361, 361, 361, 389, 361,
- 361, 200, 361, 386, 391, 391, 84, 79,
- 194, 195, 361, 361, 361, 389, 361, 361,
- 200, 361, 392, 361, 361, 361, 98, 393,
- 361, 79, 194, 195, 361, 361, 361, 366,
- 361, 392, 361, 394, 395, 396, 397, 84,
- 79, 194, 195, 361, 361, 109, 398, 361,
- 361, 200, 361, 399, 395, 400, 400, 84,
- 79, 194, 195, 361, 361, 361, 398, 361,
- 361, 200, 361, 395, 400, 400, 84, 79,
- 194, 195, 361, 361, 361, 398, 361, 361,
- 200, 361, 98, 401, 361, 79, 194, 195,
- 361, 361, 361, 366, 361, 402, 402, 361,
- 79, 194, 195, 361, 361, 361, 366, 361,
- 403, 361, 361, 404, 194, 195, 361, 194,
- 195, 361, 405, 361, 194, 406, 361, 194,
- 407, 361, 194, 361, 403, 361, 361, 361,
- 194, 195, 361, 408, 361, 409, 410, 361,
- 79, 194, 195, 361, 361, 82, 361, 81,
- 361, 402, 402, 361, 79, 194, 195, 361,
- 402, 402, 361, 79, 194, 195, 361, 408,
- 361, 402, 402, 361, 79, 194, 195, 361,
- 408, 361, 409, 402, 361, 79, 194, 195,
- 361, 361, 82, 361, 98, 361, 411, 411,
- 84, 79, 194, 195, 361, 361, 361, 366,
- 361, 412, 107, 413, 414, 88, 79, 194,
- 195, 361, 361, 361, 366, 361, 107, 413,
- 414, 88, 79, 194, 195, 361, 361, 361,
- 366, 361, 413, 413, 88, 79, 194, 195,
- 361, 361, 361, 366, 361, 415, 104, 416,
- 417, 91, 79, 194, 195, 361, 361, 361,
- 366, 361, 104, 416, 417, 91, 79, 194,
- 195, 361, 361, 361, 366, 361, 416, 416,
- 91, 79, 194, 195, 361, 361, 361, 366,
- 361, 418, 101, 419, 420, 94, 79, 194,
- 195, 361, 361, 361, 366, 361, 101, 419,
- 420, 94, 79, 194, 195, 361, 361, 361,
- 366, 361, 419, 419, 94, 79, 194, 195,
- 361, 361, 361, 366, 361, 421, 98, 402,
- 422, 361, 79, 194, 195, 361, 361, 361,
- 366, 361, 98, 402, 422, 361, 79, 194,
- 195, 361, 361, 361, 366, 361, 402, 423,
- 361, 79, 194, 195, 361, 361, 361, 366,
- 361, 98, 361, 402, 402, 361, 79, 194,
- 195, 361, 361, 361, 366, 361, 80, 81,
- 361, 361, 98, 401, 361, 79, 194, 195,
- 361, 361, 361, 366, 361, 80, 361, 395,
- 400, 400, 84, 79, 194, 195, 361, 361,
- 361, 398, 361, 394, 395, 400, 400, 84,
- 79, 194, 195, 361, 361, 361, 398, 361,
- 361, 200, 361, 394, 395, 396, 400, 84,
- 79, 194, 195, 361, 361, 109, 398, 361,
- 361, 200, 361, 392, 361, 424, 361, 411,
- 411, 84, 79, 194, 195, 361, 361, 361,
- 366, 361, 392, 361, 392, 361, 361, 361,
- 402, 402, 361, 79, 194, 195, 361, 361,
- 361, 366, 361, 392, 361, 392, 361, 361,
- 361, 402, 425, 361, 79, 194, 195, 361,
- 361, 361, 366, 361, 392, 361, 392, 361,
- 424, 361, 402, 402, 361, 79, 194, 195,
- 361, 361, 361, 366, 361, 392, 361, 392,
- 81, 361, 361, 98, 393, 361, 79, 194,
- 195, 361, 361, 361, 366, 361, 392, 361,
- 385, 386, 391, 391, 84, 79, 194, 195,
- 361, 361, 361, 389, 361, 361, 200, 361,
- 385, 386, 387, 391, 84, 79, 194, 195,
- 361, 361, 111, 389, 361, 361, 200, 361,
- 383, 361, 426, 361, 411, 411, 84, 79,
- 194, 195, 361, 361, 361, 366, 361, 383,
- 361, 383, 361, 361, 361, 402, 402, 361,
- 79, 194, 195, 361, 361, 361, 366, 361,
- 383, 361, 383, 361, 361, 361, 402, 427,
- 361, 79, 194, 195, 361, 361, 361, 366,
- 361, 383, 361, 383, 361, 426, 361, 402,
- 402, 361, 79, 194, 195, 361, 361, 361,
- 366, 361, 383, 361, 383, 81, 361, 361,
- 98, 384, 361, 79, 194, 195, 361, 361,
- 361, 366, 361, 383, 361, 376, 377, 382,
- 382, 84, 79, 194, 195, 361, 361, 361,
- 380, 361, 361, 200, 361, 376, 377, 378,
- 382, 84, 79, 194, 195, 361, 361, 113,
- 380, 361, 361, 200, 361, 374, 361, 428,
- 361, 411, 411, 84, 79, 194, 195, 361,
- 361, 361, 366, 361, 374, 361, 374, 361,
- 361, 361, 402, 402, 361, 79, 194, 195,
- 361, 361, 361, 366, 361, 374, 361, 374,
- 361, 361, 361, 402, 429, 361, 79, 194,
- 195, 361, 361, 361, 366, 361, 374, 361,
- 374, 361, 428, 361, 402, 402, 361, 79,
- 194, 195, 361, 361, 361, 366, 361, 374,
- 361, 374, 81, 361, 361, 98, 375, 361,
- 79, 194, 195, 361, 361, 361, 366, 361,
- 374, 361, 367, 368, 373, 373, 84, 79,
- 194, 195, 361, 361, 361, 371, 361, 361,
- 200, 361, 367, 368, 369, 373, 84, 79,
- 194, 195, 361, 361, 115, 371, 361, 361,
- 200, 361, 364, 361, 430, 361, 411, 411,
- 84, 79, 194, 195, 361, 361, 361, 366,
- 361, 364, 361, 364, 361, 361, 361, 402,
- 402, 361, 79, 194, 195, 361, 361, 361,
- 366, 361, 364, 361, 364, 361, 361, 361,
- 402, 431, 361, 79, 194, 195, 361, 361,
- 361, 366, 361, 364, 361, 364, 361, 430,
- 361, 402, 402, 361, 79, 194, 195, 361,
- 361, 361, 366, 361, 364, 361, 364, 81,
- 361, 361, 98, 365, 361, 79, 194, 195,
- 361, 361, 361, 366, 361, 364, 361, 116,
- 83, 83, 84, 79, 432, 432, 432, 432,
- 156, 116, 432, 190, 191, 363, 363, 84,
- 79, 194, 195, 361, 361, 361, 197, 361,
- 361, 200, 361, 116, 83, 83, 84, 79,
- 432, 432, 432, 432, 432, 116, 432, 434,
- 435, 436, 437, 123, 118, 438, 439, 433,
- 433, 155, 440, 433, 433, 441, 433, 442,
- 435, 437, 437, 123, 118, 438, 439, 433,
- 433, 433, 440, 433, 433, 441, 433, 435,
- 437, 437, 123, 118, 438, 439, 433, 433,
- 433, 440, 433, 433, 441, 433, 443, 433,
- 433, 433, 136, 444, 433, 118, 438, 439,
- 433, 433, 433, 445, 433, 443, 433, 446,
- 447, 448, 449, 123, 118, 438, 439, 433,
- 433, 153, 450, 433, 433, 441, 433, 451,
- 447, 452, 452, 123, 118, 438, 439, 433,
- 433, 433, 450, 433, 433, 441, 433, 447,
- 452, 452, 123, 118, 438, 439, 433, 433,
- 433, 450, 433, 433, 441, 433, 453, 433,
- 433, 433, 136, 454, 433, 118, 438, 439,
- 433, 433, 433, 445, 433, 453, 433, 455,
- 456, 457, 458, 123, 118, 438, 439, 433,
- 433, 151, 459, 433, 433, 441, 433, 460,
- 456, 461, 461, 123, 118, 438, 439, 433,
- 433, 433, 459, 433, 433, 441, 433, 456,
- 461, 461, 123, 118, 438, 439, 433, 433,
- 433, 459, 433, 433, 441, 433, 462, 433,
- 433, 433, 136, 463, 433, 118, 438, 439,
- 433, 433, 433, 445, 433, 462, 433, 464,
- 465, 466, 467, 123, 118, 438, 439, 433,
- 433, 149, 468, 433, 433, 441, 433, 469,
- 465, 470, 470, 123, 118, 438, 439, 433,
- 433, 433, 468, 433, 433, 441, 433, 465,
- 470, 470, 123, 118, 438, 439, 433, 433,
- 433, 468, 433, 433, 441, 433, 471, 433,
- 433, 433, 136, 472, 433, 118, 438, 439,
- 433, 433, 433, 445, 433, 471, 433, 473,
- 474, 475, 476, 123, 118, 438, 439, 433,
- 433, 147, 477, 433, 433, 441, 433, 478,
- 474, 479, 479, 123, 118, 438, 439, 433,
- 433, 433, 477, 433, 433, 441, 433, 474,
- 479, 479, 123, 118, 438, 439, 433, 433,
- 433, 477, 433, 433, 441, 433, 136, 480,
- 433, 118, 438, 439, 433, 433, 433, 445,
- 433, 481, 481, 433, 118, 438, 439, 433,
- 433, 433, 445, 433, 482, 433, 433, 483,
- 438, 439, 433, 438, 439, 433, 484, 433,
- 438, 485, 433, 438, 486, 433, 438, 433,
- 482, 433, 433, 433, 438, 439, 433, 487,
- 433, 488, 489, 433, 118, 438, 439, 433,
- 433, 121, 433, 120, 433, 481, 481, 433,
- 118, 438, 439, 433, 481, 481, 433, 118,
- 438, 439, 433, 487, 433, 481, 481, 433,
- 118, 438, 439, 433, 487, 433, 488, 481,
- 433, 118, 438, 439, 433, 433, 121, 433,
- 136, 433, 490, 490, 123, 118, 438, 439,
- 433, 433, 433, 445, 433, 491, 145, 492,
- 493, 126, 118, 438, 439, 433, 433, 433,
- 445, 433, 145, 492, 493, 126, 118, 438,
- 439, 433, 433, 433, 445, 433, 492, 492,
- 126, 118, 438, 439, 433, 433, 433, 445,
- 433, 494, 142, 495, 496, 129, 118, 438,
- 439, 433, 433, 433, 445, 433, 142, 495,
- 496, 129, 118, 438, 439, 433, 433, 433,
- 445, 433, 495, 495, 129, 118, 438, 439,
- 433, 433, 433, 445, 433, 497, 139, 498,
- 499, 132, 118, 438, 439, 433, 433, 433,
- 445, 433, 139, 498, 499, 132, 118, 438,
- 439, 433, 433, 433, 445, 433, 498, 498,
- 132, 118, 438, 439, 433, 433, 433, 445,
- 433, 500, 136, 481, 501, 433, 118, 438,
- 439, 433, 433, 433, 445, 433, 136, 481,
- 501, 433, 118, 438, 439, 433, 433, 433,
- 445, 433, 481, 502, 433, 118, 438, 439,
- 433, 433, 433, 445, 433, 136, 433, 481,
- 481, 433, 118, 438, 439, 433, 433, 433,
- 445, 433, 119, 120, 433, 433, 136, 480,
- 433, 118, 438, 439, 433, 433, 433, 445,
- 433, 119, 433, 474, 479, 479, 123, 118,
- 438, 439, 433, 433, 433, 477, 433, 473,
- 474, 479, 479, 123, 118, 438, 439, 433,
- 433, 433, 477, 433, 433, 441, 433, 473,
- 474, 475, 479, 123, 118, 438, 439, 433,
- 433, 147, 477, 433, 433, 441, 433, 471,
- 433, 503, 433, 490, 490, 123, 118, 438,
- 439, 433, 433, 433, 445, 433, 471, 433,
- 471, 433, 433, 433, 481, 481, 433, 118,
- 438, 439, 433, 433, 433, 445, 433, 471,
- 433, 471, 433, 433, 433, 481, 504, 433,
- 118, 438, 439, 433, 433, 433, 445, 433,
- 471, 433, 471, 433, 503, 433, 481, 481,
- 433, 118, 438, 439, 433, 433, 433, 445,
- 433, 471, 433, 471, 120, 433, 433, 136,
- 472, 433, 118, 438, 439, 433, 433, 433,
- 445, 433, 471, 433, 464, 465, 470, 470,
- 123, 118, 438, 439, 433, 433, 433, 468,
- 433, 433, 441, 433, 464, 465, 466, 470,
- 123, 118, 438, 439, 433, 433, 149, 468,
- 433, 433, 441, 433, 462, 433, 505, 433,
- 490, 490, 123, 118, 438, 439, 433, 433,
- 433, 445, 433, 462, 433, 462, 433, 433,
- 433, 481, 481, 433, 118, 438, 439, 433,
- 433, 433, 445, 433, 462, 433, 462, 433,
- 433, 433, 481, 506, 433, 118, 438, 439,
- 433, 433, 433, 445, 433, 462, 433, 462,
- 433, 505, 433, 481, 481, 433, 118, 438,
- 439, 433, 433, 433, 445, 433, 462, 433,
- 462, 120, 433, 433, 136, 463, 433, 118,
- 438, 439, 433, 433, 433, 445, 433, 462,
- 433, 455, 456, 461, 461, 123, 118, 438,
- 439, 433, 433, 433, 459, 433, 433, 441,
- 433, 455, 456, 457, 461, 123, 118, 438,
- 439, 433, 433, 151, 459, 433, 433, 441,
- 433, 453, 433, 507, 433, 490, 490, 123,
- 118, 438, 439, 433, 433, 433, 445, 433,
- 453, 433, 453, 433, 433, 433, 481, 481,
- 433, 118, 438, 439, 433, 433, 433, 445,
- 433, 453, 433, 453, 433, 433, 433, 481,
- 508, 433, 118, 438, 439, 433, 433, 433,
- 445, 433, 453, 433, 453, 433, 507, 433,
- 481, 481, 433, 118, 438, 439, 433, 433,
- 433, 445, 433, 453, 433, 453, 120, 433,
- 433, 136, 454, 433, 118, 438, 439, 433,
- 433, 433, 445, 433, 453, 433, 446, 447,
- 452, 452, 123, 118, 438, 439, 433, 433,
- 433, 450, 433, 433, 441, 433, 446, 447,
- 448, 452, 123, 118, 438, 439, 433, 433,
- 153, 450, 433, 433, 441, 433, 443, 433,
- 509, 433, 490, 490, 123, 118, 438, 439,
- 433, 433, 433, 445, 433, 443, 433, 443,
- 433, 433, 433, 481, 481, 433, 118, 438,
- 439, 433, 433, 433, 445, 433, 443, 433,
- 443, 433, 433, 433, 481, 510, 433, 118,
- 438, 439, 433, 433, 433, 445, 433, 443,
- 433, 443, 433, 509, 433, 481, 481, 433,
- 118, 438, 439, 433, 433, 433, 445, 433,
- 443, 433, 443, 120, 433, 433, 136, 444,
- 433, 118, 438, 439, 433, 433, 433, 445,
- 433, 443, 433, 434, 435, 437, 437, 123,
- 118, 438, 439, 433, 433, 433, 440, 433,
- 433, 441, 433, 188, 189, 190, 191, 511,
- 363, 84, 79, 194, 195, 196, 196, 156,
- 197, 361, 188, 200, 361, 204, 512, 206,
- 207, 6, 1, 208, 209, 203, 203, 38,
- 210, 203, 203, 211, 203, 214, 189, 190,
- 191, 513, 514, 84, 157, 515, 516, 203,
- 196, 156, 517, 203, 214, 200, 203, 116,
- 518, 518, 84, 157, 208, 209, 203, 203,
- 156, 519, 203, 520, 203, 203, 521, 515,
- 516, 203, 515, 516, 203, 255, 203, 515,
- 522, 203, 515, 523, 203, 515, 203, 520,
- 203, 203, 203, 515, 516, 203, 524, 3,
- 361, 361, 402, 431, 361, 79, 194, 195,
- 361, 361, 361, 366, 361, 524, 361, 525,
- 368, 526, 527, 84, 157, 515, 516, 203,
- 203, 158, 371, 203, 203, 200, 203, 528,
- 368, 529, 529, 84, 157, 515, 516, 203,
- 203, 203, 371, 203, 203, 200, 203, 368,
- 529, 529, 84, 157, 515, 516, 203, 203,
- 203, 371, 203, 203, 200, 203, 525, 368,
- 529, 529, 84, 157, 515, 516, 203, 203,
- 203, 371, 203, 203, 200, 203, 525, 368,
- 526, 529, 84, 157, 515, 516, 203, 203,
- 158, 371, 203, 203, 200, 203, 214, 203,
- 280, 116, 530, 530, 160, 157, 208, 209,
- 203, 203, 203, 519, 203, 214, 203, 531,
- 184, 532, 533, 162, 157, 515, 516, 203,
- 203, 203, 534, 203, 184, 532, 533, 162,
- 157, 515, 516, 203, 203, 203, 534, 203,
- 532, 532, 162, 157, 515, 516, 203, 203,
- 203, 534, 203, 535, 181, 536, 537, 165,
- 157, 515, 516, 203, 203, 203, 534, 203,
- 181, 536, 537, 165, 157, 515, 516, 203,
- 203, 203, 534, 203, 536, 536, 165, 157,
- 515, 516, 203, 203, 203, 534, 203, 538,
- 178, 539, 540, 168, 157, 515, 516, 203,
- 203, 203, 534, 203, 178, 539, 540, 168,
- 157, 515, 516, 203, 203, 203, 534, 203,
- 539, 539, 168, 157, 515, 516, 203, 203,
- 203, 534, 203, 541, 175, 542, 543, 203,
- 157, 515, 516, 203, 203, 203, 534, 203,
- 175, 542, 543, 203, 157, 515, 516, 203,
- 203, 203, 534, 203, 542, 542, 203, 157,
- 515, 516, 203, 203, 203, 534, 203, 544,
- 203, 545, 546, 203, 157, 515, 516, 203,
- 203, 172, 203, 171, 203, 542, 542, 203,
- 157, 515, 516, 203, 542, 542, 203, 157,
- 515, 516, 203, 544, 203, 542, 542, 203,
- 157, 515, 516, 203, 544, 203, 545, 542,
- 203, 157, 515, 516, 203, 203, 172, 203,
- 524, 171, 361, 361, 98, 365, 361, 79,
- 194, 195, 361, 361, 361, 366, 361, 524,
- 361, 548, 547, 549, 549, 547, 186, 550,
- 551, 547, 549, 549, 547, 186, 550, 551,
- 547, 552, 547, 547, 553, 550, 551, 547,
- 550, 551, 547, 554, 547, 550, 555, 547,
- 550, 556, 547, 550, 547, 552, 547, 547,
- 547, 550, 551, 547, 188, 432, 432, 432,
- 432, 432, 432, 432, 432, 432, 196, 432,
- 432, 432, 432, 188, 432, 0
+static const unsigned char _indic_syllable_machine_indicies[] = {
+ 1, 0, 2, 3, 3, 4, 1, 0,
+ 3, 3, 4, 0, 3, 3, 4, 1,
+ 0, 5, 3, 3, 4, 1, 0, 6,
+ 0, 7, 0, 8, 3, 3, 4, 1,
+ 0, 2, 3, 3, 4, 1, 0, 0,
+ 0, 0, 9, 0, 11, 12, 12, 13,
+ 14, 10, 14, 10, 12, 12, 13, 10,
+ 12, 12, 13, 14, 10, 15, 12, 12,
+ 13, 14, 10, 16, 10, 17, 10, 18,
+ 12, 12, 13, 14, 10, 11, 12, 12,
+ 13, 14, 10, 10, 10, 10, 19, 10,
+ 11, 12, 12, 13, 14, 10, 10, 10,
+ 10, 20, 10, 22, 23, 23, 24, 25,
+ 21, 21, 21, 21, 26, 21, 25, 21,
+ 23, 23, 24, 27, 23, 23, 24, 25,
+ 21, 28, 23, 23, 24, 25, 21, 29,
+ 21, 30, 21, 22, 23, 23, 24, 25,
+ 21, 31, 23, 23, 24, 25, 21, 33,
+ 34, 34, 35, 36, 32, 32, 32, 32,
+ 37, 32, 36, 32, 34, 34, 35, 32,
+ 34, 34, 35, 36, 32, 38, 34, 34,
+ 35, 36, 32, 39, 32, 40, 32, 33,
+ 34, 34, 35, 36, 32, 41, 34, 34,
+ 35, 36, 32, 23, 23, 24, 1, 0,
+ 43, 42, 45, 46, 47, 48, 49, 50,
+ 24, 25, 44, 51, 52, 52, 26, 44,
+ 53, 54, 55, 56, 57, 44, 59, 60,
+ 61, 62, 4, 1, 58, 63, 58, 58,
+ 9, 58, 58, 58, 64, 58, 65, 60,
+ 66, 66, 4, 1, 58, 63, 58, 58,
+ 58, 58, 58, 58, 64, 58, 60, 66,
+ 66, 4, 1, 58, 63, 58, 58, 58,
+ 58, 58, 58, 64, 58, 45, 58, 58,
+ 58, 67, 68, 58, 1, 58, 63, 58,
+ 58, 58, 58, 58, 45, 58, 69, 69,
+ 58, 1, 58, 63, 58, 63, 58, 58,
+ 70, 58, 63, 58, 63, 58, 63, 58,
+ 58, 58, 58, 63, 58, 45, 58, 71,
+ 58, 69, 69, 58, 1, 58, 63, 58,
+ 58, 58, 58, 58, 45, 58, 45, 58,
+ 58, 58, 69, 69, 58, 1, 58, 63,
+ 58, 58, 58, 58, 58, 45, 58, 45,
+ 58, 58, 58, 69, 68, 58, 1, 58,
+ 63, 58, 58, 58, 58, 58, 45, 58,
+ 72, 7, 73, 74, 4, 1, 58, 63,
+ 58, 7, 73, 74, 4, 1, 58, 63,
+ 58, 73, 73, 4, 1, 58, 63, 58,
+ 75, 76, 76, 4, 1, 58, 63, 58,
+ 67, 77, 58, 1, 58, 63, 58, 67,
+ 58, 69, 69, 58, 1, 58, 63, 58,
+ 69, 77, 58, 1, 58, 63, 58, 59,
+ 60, 66, 66, 4, 1, 58, 63, 58,
+ 58, 58, 58, 58, 58, 64, 58, 59,
+ 60, 61, 66, 4, 1, 58, 63, 58,
+ 58, 9, 58, 58, 58, 64, 58, 79,
+ 80, 81, 82, 13, 14, 78, 83, 78,
+ 78, 20, 78, 78, 78, 84, 78, 85,
+ 80, 86, 82, 13, 14, 78, 83, 78,
+ 78, 78, 78, 78, 78, 84, 78, 80,
+ 86, 82, 13, 14, 78, 83, 78, 78,
+ 78, 78, 78, 78, 84, 78, 87, 78,
+ 78, 78, 88, 89, 78, 14, 78, 83,
+ 78, 78, 78, 78, 78, 87, 78, 90,
+ 80, 91, 92, 13, 14, 78, 83, 78,
+ 78, 19, 78, 78, 78, 84, 78, 93,
+ 80, 86, 86, 13, 14, 78, 83, 78,
+ 78, 78, 78, 78, 78, 84, 78, 80,
+ 86, 86, 13, 14, 78, 83, 78, 78,
+ 78, 78, 78, 78, 84, 78, 87, 78,
+ 78, 78, 94, 89, 78, 14, 78, 83,
+ 78, 78, 78, 78, 78, 87, 78, 83,
+ 78, 78, 95, 78, 83, 78, 83, 78,
+ 83, 78, 78, 78, 78, 83, 78, 87,
+ 78, 96, 78, 94, 94, 78, 14, 78,
+ 83, 78, 78, 78, 78, 78, 87, 78,
+ 87, 78, 78, 78, 94, 94, 78, 14,
+ 78, 83, 78, 78, 78, 78, 78, 87,
+ 78, 97, 17, 98, 99, 13, 14, 78,
+ 83, 78, 17, 98, 99, 13, 14, 78,
+ 83, 78, 98, 98, 13, 14, 78, 83,
+ 78, 100, 101, 101, 13, 14, 78, 83,
+ 78, 88, 102, 78, 14, 78, 83, 78,
+ 94, 94, 78, 14, 78, 83, 78, 88,
+ 78, 94, 94, 78, 14, 78, 83, 78,
+ 94, 102, 78, 14, 78, 83, 78, 90,
+ 80, 86, 86, 13, 14, 78, 83, 78,
+ 78, 78, 78, 78, 78, 84, 78, 90,
+ 80, 91, 86, 13, 14, 78, 83, 78,
+ 78, 19, 78, 78, 78, 84, 78, 11,
+ 12, 12, 13, 14, 78, 79, 80, 86,
+ 82, 13, 14, 78, 83, 78, 78, 78,
+ 78, 78, 78, 84, 78, 104, 48, 105,
+ 105, 24, 25, 103, 51, 103, 103, 103,
+ 103, 103, 103, 55, 103, 48, 105, 105,
+ 24, 25, 103, 51, 103, 103, 103, 103,
+ 103, 103, 55, 103, 106, 103, 103, 103,
+ 107, 108, 103, 25, 103, 51, 103, 103,
+ 103, 103, 103, 106, 103, 47, 48, 109,
+ 110, 24, 25, 103, 51, 103, 103, 26,
+ 103, 103, 103, 55, 103, 106, 103, 103,
+ 103, 111, 108, 103, 25, 103, 51, 103,
+ 103, 103, 103, 103, 106, 103, 51, 103,
+ 103, 112, 103, 51, 103, 51, 103, 51,
+ 103, 103, 103, 103, 51, 103, 106, 103,
+ 113, 103, 111, 111, 103, 25, 103, 51,
+ 103, 103, 103, 103, 103, 106, 103, 106,
+ 103, 103, 103, 111, 111, 103, 25, 103,
+ 51, 103, 103, 103, 103, 103, 106, 103,
+ 114, 30, 115, 116, 24, 25, 103, 51,
+ 103, 30, 115, 116, 24, 25, 103, 51,
+ 103, 115, 115, 24, 25, 103, 51, 103,
+ 47, 48, 105, 105, 24, 25, 103, 51,
+ 103, 103, 103, 103, 103, 103, 55, 103,
+ 117, 118, 118, 24, 25, 103, 51, 103,
+ 107, 119, 103, 25, 103, 51, 103, 111,
+ 111, 103, 25, 103, 51, 103, 107, 103,
+ 111, 111, 103, 25, 103, 51, 103, 111,
+ 119, 103, 25, 103, 51, 103, 47, 48,
+ 109, 105, 24, 25, 103, 51, 103, 103,
+ 26, 103, 103, 103, 55, 103, 22, 23,
+ 23, 24, 25, 120, 120, 120, 120, 26,
+ 120, 22, 23, 23, 24, 25, 120, 122,
+ 123, 124, 125, 35, 36, 121, 126, 121,
+ 121, 37, 121, 121, 121, 127, 121, 128,
+ 123, 125, 125, 35, 36, 121, 126, 121,
+ 121, 121, 121, 121, 121, 127, 121, 123,
+ 125, 125, 35, 36, 121, 126, 121, 121,
+ 121, 121, 121, 121, 127, 121, 129, 121,
+ 121, 121, 130, 131, 121, 36, 121, 126,
+ 121, 121, 121, 121, 121, 129, 121, 122,
+ 123, 124, 52, 35, 36, 121, 126, 121,
+ 121, 37, 121, 121, 121, 127, 121, 129,
+ 121, 121, 121, 132, 131, 121, 36, 121,
+ 126, 121, 121, 121, 121, 121, 129, 121,
+ 126, 121, 121, 133, 121, 126, 121, 126,
+ 121, 126, 121, 121, 121, 121, 126, 121,
+ 129, 121, 134, 121, 132, 132, 121, 36,
+ 121, 126, 121, 121, 121, 121, 121, 129,
+ 121, 129, 121, 121, 121, 132, 132, 121,
+ 36, 121, 126, 121, 121, 121, 121, 121,
+ 129, 121, 135, 40, 136, 137, 35, 36,
+ 121, 126, 121, 40, 136, 137, 35, 36,
+ 121, 126, 121, 136, 136, 35, 36, 121,
+ 126, 121, 122, 123, 125, 125, 35, 36,
+ 121, 126, 121, 121, 121, 121, 121, 121,
+ 127, 121, 138, 139, 139, 35, 36, 121,
+ 126, 121, 130, 140, 121, 36, 121, 126,
+ 121, 132, 132, 121, 36, 121, 126, 121,
+ 130, 121, 132, 132, 121, 36, 121, 126,
+ 121, 132, 140, 121, 36, 121, 126, 121,
+ 45, 46, 47, 48, 109, 105, 24, 25,
+ 103, 51, 52, 52, 26, 103, 103, 45,
+ 55, 103, 59, 141, 61, 62, 4, 1,
+ 58, 63, 58, 58, 9, 58, 58, 58,
+ 64, 58, 45, 46, 47, 48, 142, 143,
+ 24, 144, 58, 145, 58, 52, 26, 58,
+ 58, 45, 55, 58, 22, 146, 146, 24,
+ 144, 58, 63, 58, 58, 26, 58, 145,
+ 58, 58, 147, 58, 145, 58, 145, 58,
+ 145, 58, 58, 58, 58, 145, 58, 45,
+ 58, 71, 22, 146, 146, 24, 144, 58,
+ 63, 58, 58, 58, 58, 58, 45, 58,
+ 149, 148, 150, 150, 148, 43, 148, 151,
+ 148, 150, 150, 148, 43, 148, 151, 148,
+ 151, 148, 148, 152, 148, 151, 148, 151,
+ 148, 151, 148, 148, 148, 148, 151, 148,
+ 45, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 52, 120, 120, 120, 120, 45,
+ 120, 0
};
-static const short _indic_syllable_machine_trans_targs[] = {
- 178, 200, 207, 209, 210, 4, 213, 5,
- 7, 216, 8, 10, 219, 11, 13, 222,
- 14, 16, 17, 199, 19, 20, 221, 22,
- 23, 218, 25, 26, 215, 224, 228, 232,
- 235, 239, 242, 246, 249, 253, 256, 178,
- 279, 286, 288, 289, 41, 292, 42, 44,
- 295, 45, 47, 298, 48, 50, 301, 51,
- 53, 54, 278, 56, 57, 300, 59, 60,
- 297, 62, 63, 294, 303, 307, 311, 314,
- 318, 321, 325, 328, 332, 336, 178, 357,
- 364, 366, 367, 78, 370, 178, 79, 81,
- 373, 82, 84, 376, 85, 87, 379, 88,
- 90, 91, 356, 93, 94, 378, 96, 97,
- 375, 99, 100, 372, 381, 385, 389, 392,
- 396, 399, 403, 406, 410, 178, 437, 444,
- 446, 447, 114, 450, 115, 117, 453, 118,
- 120, 456, 121, 123, 459, 124, 126, 127,
- 436, 129, 130, 458, 132, 133, 455, 135,
- 136, 452, 461, 465, 469, 472, 476, 479,
- 483, 486, 490, 493, 414, 498, 509, 152,
- 512, 154, 515, 155, 157, 518, 158, 160,
- 521, 161, 524, 526, 527, 166, 167, 523,
- 169, 170, 520, 172, 173, 517, 175, 176,
- 514, 178, 532, 178, 179, 258, 337, 339,
- 413, 415, 359, 360, 416, 412, 494, 495,
- 384, 530, 539, 178, 180, 182, 36, 257,
- 202, 203, 255, 227, 181, 35, 183, 251,
- 1, 184, 186, 34, 250, 248, 185, 33,
- 187, 244, 188, 190, 32, 243, 241, 189,
- 31, 191, 237, 192, 194, 30, 236, 234,
- 193, 29, 195, 230, 196, 198, 28, 229,
- 226, 197, 27, 212, 0, 201, 206, 178,
- 204, 205, 208, 2, 211, 3, 214, 6,
- 24, 217, 9, 21, 220, 12, 18, 223,
- 15, 225, 231, 233, 238, 240, 245, 247,
- 252, 254, 178, 259, 261, 73, 334, 281,
- 282, 335, 306, 260, 72, 262, 330, 38,
- 263, 265, 71, 329, 327, 264, 70, 266,
- 323, 267, 269, 69, 322, 320, 268, 68,
- 270, 316, 271, 273, 67, 315, 313, 272,
- 66, 274, 309, 275, 277, 65, 308, 305,
- 276, 64, 291, 37, 280, 285, 178, 283,
- 284, 287, 39, 290, 40, 293, 43, 61,
- 296, 46, 58, 299, 49, 55, 302, 52,
- 304, 310, 312, 317, 319, 324, 326, 331,
- 333, 178, 338, 109, 340, 408, 75, 341,
- 343, 108, 407, 405, 342, 107, 344, 401,
- 345, 347, 106, 400, 398, 346, 105, 348,
- 394, 349, 351, 104, 393, 391, 350, 103,
- 352, 387, 353, 355, 102, 386, 383, 354,
- 101, 369, 74, 358, 363, 178, 361, 362,
- 365, 76, 368, 77, 371, 80, 98, 374,
- 83, 95, 377, 86, 92, 380, 89, 382,
- 388, 390, 395, 397, 402, 404, 409, 411,
- 178, 178, 417, 419, 146, 145, 439, 440,
- 492, 464, 418, 420, 488, 111, 421, 423,
- 144, 487, 485, 422, 143, 424, 481, 425,
- 427, 142, 480, 478, 426, 141, 428, 474,
- 429, 431, 140, 473, 471, 430, 139, 432,
- 467, 433, 435, 138, 466, 463, 434, 137,
- 449, 110, 438, 443, 178, 441, 442, 445,
- 112, 448, 113, 451, 116, 134, 454, 119,
- 131, 457, 122, 128, 460, 125, 462, 468,
- 470, 475, 477, 482, 484, 489, 491, 147,
- 496, 497, 511, 500, 501, 529, 148, 505,
- 499, 504, 502, 503, 506, 507, 150, 510,
- 508, 149, 151, 513, 153, 174, 163, 516,
- 156, 171, 519, 159, 168, 522, 162, 165,
- 525, 164, 528, 178, 531, 177, 534, 535,
- 533, 538, 178, 536, 537
+static const unsigned char _indic_syllable_machine_trans_targs[] = {
+ 39, 45, 50, 2, 51, 5, 6, 53,
+ 57, 58, 39, 67, 11, 73, 68, 14,
+ 15, 75, 80, 81, 84, 39, 89, 21,
+ 95, 90, 98, 39, 24, 25, 97, 103,
+ 39, 112, 30, 118, 113, 121, 33, 34,
+ 120, 126, 39, 137, 39, 40, 60, 85,
+ 87, 105, 106, 91, 107, 127, 128, 99,
+ 135, 140, 39, 41, 43, 8, 59, 46,
+ 54, 42, 1, 44, 48, 0, 47, 49,
+ 52, 3, 4, 55, 7, 56, 39, 61,
+ 63, 18, 83, 69, 76, 62, 9, 64,
+ 78, 71, 65, 17, 82, 66, 10, 70,
+ 72, 74, 12, 13, 77, 16, 79, 39,
+ 86, 26, 88, 101, 93, 19, 104, 20,
+ 92, 94, 96, 22, 23, 100, 27, 102,
+ 39, 39, 108, 110, 28, 35, 114, 122,
+ 109, 111, 124, 116, 29, 115, 117, 119,
+ 31, 32, 123, 36, 125, 129, 130, 134,
+ 131, 132, 37, 133, 39, 136, 38, 138,
+ 139
};
static const char _indic_syllable_machine_trans_actions[] = {
- 1, 0, 2, 2, 2, 0, 2, 0,
- 0, 2, 0, 0, 2, 0, 0, 2,
- 0, 0, 0, 2, 0, 0, 2, 0,
- 0, 2, 0, 0, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 3,
- 0, 2, 2, 2, 0, 2, 0, 0,
- 2, 0, 0, 2, 0, 0, 2, 0,
- 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 0, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 4, 0,
- 2, 2, 2, 0, 2, 5, 0, 0,
- 2, 0, 0, 2, 0, 0, 2, 0,
- 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 0, 2, 2, 6, 2, 6,
- 2, 6, 2, 6, 2, 7, 0, 2,
- 2, 2, 0, 2, 0, 0, 2, 0,
- 0, 2, 0, 0, 2, 0, 0, 0,
- 2, 0, 0, 2, 0, 0, 2, 0,
- 0, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 6, 0, 8, 0,
- 2, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 2, 2, 2, 0, 0, 2,
- 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 9, 0, 12, 2, 2, 6, 2,
- 13, 13, 0, 0, 2, 2, 6, 2,
- 6, 2, 0, 14, 2, 2, 0, 2,
- 0, 0, 2, 2, 2, 0, 2, 2,
- 0, 2, 2, 0, 2, 2, 2, 0,
- 2, 2, 2, 2, 0, 2, 2, 2,
- 0, 2, 2, 2, 2, 0, 2, 2,
- 2, 0, 2, 2, 2, 2, 0, 2,
- 2, 2, 0, 2, 0, 0, 0, 15,
- 0, 0, 2, 0, 2, 0, 2, 0,
- 0, 2, 0, 0, 2, 0, 0, 2,
- 0, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 16, 2, 2, 0, 2, 0,
- 0, 2, 2, 2, 0, 2, 2, 0,
- 2, 2, 0, 2, 2, 2, 0, 2,
- 2, 2, 2, 0, 2, 2, 2, 0,
- 2, 2, 2, 2, 0, 2, 2, 2,
- 0, 2, 2, 2, 2, 0, 2, 2,
- 2, 0, 2, 0, 0, 0, 17, 0,
- 0, 2, 0, 2, 0, 2, 0, 0,
- 2, 0, 0, 2, 0, 0, 2, 0,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 18, 6, 0, 6, 6, 0, 6,
- 2, 0, 6, 2, 6, 0, 6, 6,
- 6, 2, 0, 6, 2, 6, 0, 6,
- 6, 6, 2, 0, 6, 2, 6, 0,
- 6, 6, 6, 2, 0, 6, 2, 6,
- 0, 6, 0, 0, 0, 19, 0, 0,
- 2, 0, 2, 0, 2, 0, 0, 2,
- 0, 0, 2, 0, 0, 2, 0, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 20, 21, 2, 2, 0, 0, 0, 0,
- 2, 2, 2, 2, 2, 0, 2, 2,
- 0, 2, 2, 2, 0, 2, 2, 2,
- 2, 0, 2, 2, 2, 0, 2, 2,
- 2, 2, 0, 2, 2, 2, 0, 2,
- 2, 2, 2, 0, 2, 2, 2, 0,
- 2, 0, 0, 0, 22, 0, 0, 2,
- 0, 2, 0, 2, 0, 0, 2, 0,
- 0, 2, 0, 0, 2, 0, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 0,
- 0, 8, 2, 0, 0, 2, 0, 2,
- 0, 0, 0, 0, 8, 8, 0, 8,
- 8, 0, 0, 2, 0, 0, 0, 2,
- 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 2, 23, 2, 0, 0, 0,
- 0, 0, 24, 0, 0
+ 1, 0, 2, 0, 2, 0, 0, 2,
+ 2, 2, 3, 2, 0, 2, 0, 0,
+ 0, 2, 2, 2, 2, 4, 2, 0,
+ 5, 0, 5, 6, 0, 0, 5, 2,
+ 7, 2, 0, 2, 0, 2, 0, 0,
+ 2, 2, 8, 0, 11, 2, 2, 5,
+ 0, 12, 12, 0, 2, 5, 2, 5,
+ 2, 0, 13, 2, 0, 0, 2, 0,
+ 2, 2, 0, 2, 2, 0, 0, 2,
+ 2, 0, 0, 0, 0, 2, 14, 2,
+ 0, 0, 2, 0, 2, 2, 0, 2,
+ 2, 2, 2, 0, 2, 2, 0, 0,
+ 2, 2, 0, 0, 0, 0, 2, 15,
+ 5, 0, 5, 2, 2, 0, 5, 0,
+ 0, 2, 5, 0, 0, 0, 0, 2,
+ 16, 17, 2, 0, 0, 0, 0, 2,
+ 2, 2, 2, 2, 0, 0, 2, 2,
+ 0, 0, 0, 0, 2, 0, 18, 18,
+ 0, 0, 0, 0, 19, 2, 0, 0,
+ 0
};
static const char _indic_syllable_machine_to_state_actions[] = {
@@ -1141,6 +319,7 @@ static const char _indic_syllable_machine_to_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -1153,58 +332,7 @@ static const char _indic_syllable_machine_to_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0
+ 0, 0, 0, 0, 0
};
static const char _indic_syllable_machine_from_state_actions[] = {
@@ -1212,6 +340,7 @@ static const char _indic_syllable_machine_from_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 10,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -1224,163 +353,61 @@ static const char _indic_syllable_machine_from_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 11, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0
+ 0, 0, 0, 0, 0
};
static const short _indic_syllable_machine_eof_trans[] = {
1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 79, 79, 79, 79, 86, 86,
- 79, 79, 79, 79, 79, 79, 79, 79,
+ 1, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 22, 22, 28, 22, 22,
+ 22, 22, 22, 22, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 1, 43, 0,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 79, 79, 79, 79,
79, 79, 79, 79, 79, 79, 79, 79,
79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 118, 118,
- 118, 118, 118, 118, 118, 118, 118, 118,
- 118, 118, 118, 118, 118, 118, 118, 118,
- 118, 118, 118, 118, 118, 118, 118, 118,
- 118, 118, 118, 118, 118, 118, 118, 118,
- 118, 118, 118, 79, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 186, 0, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 362, 362, 362, 362, 362, 362, 362,
- 362, 362, 362, 362, 362, 362, 362, 362,
- 362, 362, 362, 362, 362, 362, 362, 362,
- 362, 362, 362, 362, 362, 362, 362, 362,
- 362, 362, 362, 362, 362, 362, 362, 362,
- 362, 362, 362, 362, 362, 362, 362, 362,
- 362, 362, 362, 362, 362, 362, 362, 362,
- 362, 362, 362, 362, 362, 362, 362, 362,
- 362, 362, 362, 362, 362, 362, 362, 362,
- 362, 362, 362, 362, 362, 433, 362, 433,
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 362, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 362, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 362, 548, 548, 548, 548, 548, 548,
- 548, 548, 548, 433
+ 79, 79, 79, 79, 79, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 121, 121, 122, 122, 122, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 104,
+ 59, 59, 59, 59, 59, 59, 59, 149,
+ 149, 149, 149, 149, 121
};
-static const int indic_syllable_machine_start = 178;
-static const int indic_syllable_machine_first_final = 178;
+static const int indic_syllable_machine_start = 39;
+static const int indic_syllable_machine_first_final = 39;
static const int indic_syllable_machine_error = -1;
-static const int indic_syllable_machine_en_main = 178;
+static const int indic_syllable_machine_en_main = 39;
#line 36 "hb-ot-shape-complex-indic-machine.rl"
-#line 97 "hb-ot-shape-complex-indic-machine.rl"
+#line 93 "hb-ot-shape-complex-indic-machine.rl"
#define found_syllable(syllable_type) \
HB_STMT_START { \
- if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \
- for (unsigned int i = last; i < p+1; i++) \
- info[i].syllable() = (syllable_serial << 4) | syllable_type; \
- last = p+1; \
+ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+ for (unsigned int i = ts; i < te; i++) \
+ info[i].syllable() = (syllable_serial << 4) | indic_##syllable_type; \
syllable_serial++; \
if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
} HB_STMT_END
static void
-find_syllables (hb_buffer_t *buffer)
+find_syllables_indic (hb_buffer_t *buffer)
{
- unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED;
+ unsigned int p, pe, eof, ts, te, act;
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 1384 "hb-ot-shape-complex-indic-machine.hh"
+#line 411 "hb-ot-shape-complex-indic-machine.hh"
{
cs = indic_syllable_machine_start;
ts = 0;
@@ -1388,30 +415,29 @@ find_syllables (hb_buffer_t *buffer)
act = 0;
}
-#line 118 "hb-ot-shape-complex-indic-machine.rl"
+#line 113 "hb-ot-shape-complex-indic-machine.rl"
p = 0;
pe = eof = buffer->len;
- unsigned int last = 0;
unsigned int syllable_serial = 1;
-#line 1401 "hb-ot-shape-complex-indic-machine.hh"
+#line 427 "hb-ot-shape-complex-indic-machine.hh"
{
int _slen;
int _trans;
const unsigned char *_keys;
- const short *_inds;
+ const unsigned char *_inds;
if ( p == pe )
goto _test_eof;
_resume:
switch ( _indic_syllable_machine_from_state_actions[cs] ) {
- case 11:
+ case 10:
#line 1 "NONE"
{ts = p;}
break;
-#line 1415 "hb-ot-shape-complex-indic-machine.hh"
+#line 441 "hb-ot-shape-complex-indic-machine.hh"
}
_keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -1433,75 +459,55 @@ _eof_trans:
#line 1 "NONE"
{te = p+1;}
break;
- case 15:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
- {te = p+1;{ found_syllable (consonant_syllable); }}
- break;
- case 17:
+ case 11:
#line 89 "hb-ot-shape-complex-indic-machine.rl"
- {te = p+1;{ found_syllable (vowel_syllable); }}
- break;
- case 22:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
- {te = p+1;{ found_syllable (standalone_cluster); }}
- break;
- case 24:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
- {te = p+1;{ found_syllable (symbol_cluster); }}
- break;
- case 19:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
- {te = p+1;{ found_syllable (broken_cluster); }}
- break;
- case 12:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (non_indic_cluster); }}
break;
- case 14:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+ case 13:
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (consonant_syllable); }}
break;
- case 16:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+ case 14:
+#line 85 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (vowel_syllable); }}
break;
- case 21:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+ case 17:
+#line 86 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (standalone_cluster); }}
break;
- case 23:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+ case 19:
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (symbol_cluster); }}
break;
- case 18:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+ case 15:
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
- case 20:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+ case 16:
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (non_indic_cluster); }}
break;
case 1:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
break;
case 3:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 85 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
break;
case 7:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 86 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
break;
- case 9:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+ case 8:
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
break;
case 4:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
break;
- case 5:
+ case 6:
#line 1 "NONE"
{ switch( act ) {
case 1:
@@ -1516,34 +522,34 @@ _eof_trans:
}
}
break;
- case 8:
+ case 18:
#line 1 "NONE"
{te = p+1;}
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
{act = 1;}
break;
- case 6:
+ case 5:
#line 1 "NONE"
{te = p+1;}
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
{act = 5;}
break;
- case 13:
+ case 12:
#line 1 "NONE"
{te = p+1;}
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
{act = 6;}
break;
-#line 1538 "hb-ot-shape-complex-indic-machine.hh"
+#line 544 "hb-ot-shape-complex-indic-machine.hh"
}
_again:
switch ( _indic_syllable_machine_to_state_actions[cs] ) {
- case 10:
+ case 9:
#line 1 "NONE"
{ts = 0;}
break;
-#line 1547 "hb-ot-shape-complex-indic-machine.hh"
+#line 553 "hb-ot-shape-complex-indic-machine.hh"
}
if ( ++p != pe )
@@ -1559,8 +565,10 @@ _again:
}
-#line 127 "hb-ot-shape-complex-indic-machine.rl"
+#line 121 "hb-ot-shape-complex-indic-machine.rl"
}
+#undef found_syllable
+
#endif /* HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.rl b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.rl
new file mode 100644
index 0000000000..5f819bd296
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.rl
@@ -0,0 +1,126 @@
+/*
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH
+
+#include "hb.hh"
+
+%%{
+ machine indic_syllable_machine;
+ alphtype unsigned char;
+ write data;
+}%%
+
+%%{
+
+# Same order as enum indic_category_t. Not sure how to avoid duplication.
+C = 1;
+V = 2;
+N = 3;
+H = 4;
+ZWNJ = 5;
+ZWJ = 6;
+M = 7;
+SM = 8;
+A = 10;
+PLACEHOLDER = 11;
+DOTTEDCIRCLE = 12;
+RS = 13;
+Repha = 15;
+Ra = 16;
+CM = 17;
+Symbol= 18;
+CS = 19;
+
+c = (C | Ra); # is_consonant
+n = ((ZWNJ?.RS)? (N.N?)?); # is_consonant_modifier
+z = ZWJ|ZWNJ; # is_joiner
+reph = (Ra H | Repha); # possible reph
+
+cn = c.ZWJ?.n?;
+forced_rakar = ZWJ H ZWJ Ra;
+symbol = Symbol.N?;
+matra_group = z*.M.N?.(H | forced_rakar)?;
+syllable_tail = (z?.SM.SM?.ZWNJ?)? A*;
+halant_group = (z?.H.(ZWJ.N?)?);
+final_halant_group = halant_group | H.ZWNJ;
+medial_group = CM?;
+halant_or_matra_group = (final_halant_group | matra_group*);
+
+complex_syllable_tail = (halant_group.cn)* medial_group halant_or_matra_group syllable_tail;
+
+consonant_syllable = (Repha|CS)? cn complex_syllable_tail;
+vowel_syllable = reph? V.n? (ZWJ | complex_syllable_tail);
+standalone_cluster = ((Repha|CS)? PLACEHOLDER | reph? DOTTEDCIRCLE).n? complex_syllable_tail;
+symbol_cluster = symbol syllable_tail;
+broken_cluster = reph? n? complex_syllable_tail;
+other = any;
+
+main := |*
+ consonant_syllable => { found_syllable (consonant_syllable); };
+ vowel_syllable => { found_syllable (vowel_syllable); };
+ standalone_cluster => { found_syllable (standalone_cluster); };
+ symbol_cluster => { found_syllable (symbol_cluster); };
+ broken_cluster => { found_syllable (broken_cluster); };
+ other => { found_syllable (non_indic_cluster); };
+*|;
+
+
+}%%
+
+#define found_syllable(syllable_type) \
+ HB_STMT_START { \
+ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+ for (unsigned int i = ts; i < te; i++) \
+ info[i].syllable() = (syllable_serial << 4) | indic_##syllable_type; \
+ syllable_serial++; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+ } HB_STMT_END
+
+static void
+find_syllables_indic (hb_buffer_t *buffer)
+{
+ unsigned int p, pe, eof, ts, te, act;
+ int cs;
+ hb_glyph_info_t *info = buffer->info;
+ %%{
+ write init;
+ getkey info[p].indic_category();
+ }%%
+
+ p = 0;
+ pe = eof = buffer->len;
+
+ unsigned int syllable_serial = 1;
+ %%{
+ write exec;
+ }%%
+}
+
+#undef found_syllable
+
+#endif /* HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-private.hh
deleted file mode 100644
index a1e0d5266b..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-private.hh
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright © 2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_SHAPE_COMPLEX_INDIC_PRIVATE_HH
-#define HB_OT_SHAPE_COMPLEX_INDIC_PRIVATE_HH
-
-#include "hb-private.hh"
-
-
-#include "hb-ot-shape-complex-private.hh"
-#include "hb-ot-shape-private.hh" /* XXX Remove */
-
-
-#define INDIC_TABLE_ELEMENT_TYPE uint16_t
-
-/* Cateories used in the OpenType spec:
- * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx
- */
-/* Note: This enum is duplicated in the -machine.rl source file.
- * Not sure how to avoid duplication. */
-enum indic_category_t {
- OT_X = 0,
- OT_C = 1,
- OT_V = 2,
- OT_N = 3,
- OT_H = 4,
- OT_ZWNJ = 5,
- OT_ZWJ = 6,
- OT_M = 7,
- OT_SM = 8,
- OT_VD = 9,
- OT_A = 10,
- OT_PLACEHOLDER = 11,
- OT_DOTTEDCIRCLE = 12,
- OT_RS = 13, /* Register Shifter, used in Khmer OT spec. */
- OT_Coeng = 14, /* Khmer-style Virama. */
- OT_Repha = 15, /* Atomically-encoded logical or visual repha. */
- OT_Ra = 16,
- OT_CM = 17, /* Consonant-Medial. */
- OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */
- OT_CS = 19
-};
-
-#define MEDIAL_FLAGS (FLAG (OT_CM))
-
-/* Note:
- *
- * We treat Vowels and placeholders as if they were consonants. This is safe because Vowels
- * cannot happen in a consonant syllable. The plus side however is, we can call the
- * consonant syllable logic from the vowel syllable function and get it all right! */
-#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CS) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE))
-#define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ))
-#define HALANT_OR_COENG_FLAGS (FLAG (OT_H) | FLAG (OT_Coeng))
-
-
-/* Visual positions in a syllable from left to right. */
-enum indic_position_t {
- POS_START,
-
- POS_RA_TO_BECOME_REPH,
- POS_PRE_M,
- POS_PRE_C,
-
- POS_BASE_C,
- POS_AFTER_MAIN,
-
- POS_ABOVE_C,
-
- POS_BEFORE_SUB,
- POS_BELOW_C,
- POS_AFTER_SUB,
-
- POS_BEFORE_POST,
- POS_POST_C,
- POS_AFTER_POST,
-
- POS_FINAL_C,
- POS_SMVD,
-
- POS_END
-};
-
-/* Categories used in IndicSyllabicCategory.txt from UCD. */
-enum indic_syllabic_category_t {
- INDIC_SYLLABIC_CATEGORY_OTHER = OT_X,
-
- INDIC_SYLLABIC_CATEGORY_AVAGRAHA = OT_Symbol,
- INDIC_SYLLABIC_CATEGORY_BINDU = OT_SM,
- INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER = OT_PLACEHOLDER, /* Don't care. */
- INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK = OT_A,
- INDIC_SYLLABIC_CATEGORY_CONSONANT = OT_C,
- INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD = OT_C,
- INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL = OT_CM,
- INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER = OT_C,
- INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER = OT_M, /* U+17CD only. */
- INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL = OT_CM,
- INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER = OT_PLACEHOLDER,
- INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA = OT_Repha,
- INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED = OT_X, /* Don't care. */
- INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED = OT_CM,
- INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA = OT_N,
- INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER = OT_CS,
- INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK = OT_SM, /* https://github.com/harfbuzz/harfbuzz/issues/552 */
- INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER = OT_Coeng,
- INDIC_SYLLABIC_CATEGORY_JOINER = OT_ZWJ,
- INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER = OT_X,
- INDIC_SYLLABIC_CATEGORY_NON_JOINER = OT_ZWNJ,
- INDIC_SYLLABIC_CATEGORY_NUKTA = OT_N,
- INDIC_SYLLABIC_CATEGORY_NUMBER = OT_PLACEHOLDER,
- INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER = OT_PLACEHOLDER, /* Don't care. */
- INDIC_SYLLABIC_CATEGORY_PURE_KILLER = OT_M, /* Is like a vowel matra. */
- INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER = OT_RS,
- INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER = OT_SM,
- INDIC_SYLLABIC_CATEGORY_TONE_LETTER = OT_X,
- INDIC_SYLLABIC_CATEGORY_TONE_MARK = OT_N,
- INDIC_SYLLABIC_CATEGORY_VIRAMA = OT_H,
- INDIC_SYLLABIC_CATEGORY_VISARGA = OT_SM,
- INDIC_SYLLABIC_CATEGORY_VOWEL = OT_V,
- INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT = OT_M,
- INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT = OT_V
-};
-
-/* Categories used in IndicSMatraCategory.txt from UCD */
-enum indic_matra_category_t {
- INDIC_MATRA_CATEGORY_NOT_APPLICABLE = POS_END,
-
- INDIC_MATRA_CATEGORY_LEFT = POS_PRE_C,
- INDIC_MATRA_CATEGORY_TOP = POS_ABOVE_C,
- INDIC_MATRA_CATEGORY_BOTTOM = POS_BELOW_C,
- INDIC_MATRA_CATEGORY_RIGHT = POS_POST_C,
-
- /* These should resolve to the position of the last part of the split sequence. */
- INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT,
- INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT,
- INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM = INDIC_MATRA_CATEGORY_BOTTOM,
- INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT,
- INDIC_MATRA_CATEGORY_TOP_AND_LEFT = INDIC_MATRA_CATEGORY_TOP,
- INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT,
- INDIC_MATRA_CATEGORY_TOP_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT,
-
- INDIC_MATRA_CATEGORY_OVERSTRUCK = POS_AFTER_MAIN,
- INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT = POS_PRE_M
-};
-
-#define INDIC_COMBINE_CATEGORIES(S,M) \
- ( \
- ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
- ( S | \
- ( \
- ( \
- S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \
- S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \
- S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \
- S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \
- S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \
- S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \
- false \
- ? M : INDIC_MATRA_CATEGORY_NOT_APPLICABLE \
- ) << 8 \
- ) \
- ) \
- )
-
-HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE
-hb_indic_get_categories (hb_codepoint_t u);
-
-#endif /* HB_OT_SHAPE_COMPLEX_INDIC_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-table.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-table.cc
index bfd1c6d342..cc91f172c3 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-table.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-table.cc
@@ -6,68 +6,77 @@
*
* on files with these headers:
*
- * # IndicSyllabicCategory-10.0.0.txt
- * # Date: 2017-05-31, 01:07:00 GMT [KW, RP]
- * # IndicPositionalCategory-10.0.0.txt
- * # Date: 2017-05-31, 01:07:00 GMT [RP]
- * # Blocks-10.0.0.txt
- * # Date: 2017-04-12, 17:30:00 GMT [KW]
+ * # IndicSyllabicCategory-12.0.0.txt
+ * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
+ * # IndicPositionalCategory-12.0.0.txt
+ * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
+ * # Blocks-12.0.0.txt
+ * # Date: 2018-07-30, 19:40:00 GMT [KW]
*/
-#include "hb-ot-shape-complex-indic-private.hh"
-
-
-#define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 15 chars; Avagraha */
-#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 80 chars; Bindu */
-#define ISC_BJN INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER /* 20 chars; Brahmi_Joining_Number */
-#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 57 chars; Cantillation_Mark */
-#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 2024 chars; Consonant */
-#define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 10 chars; Consonant_Dead */
-#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 68 chars; Consonant_Final */
-#define ISC_CHL INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER /* 5 chars; Consonant_Head_Letter */
-#define ISC_CK INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER /* 2 chars; Consonant_Killer */
-#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 27 chars; Consonant_Medial */
-#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 18 chars; Consonant_Placeholder */
-#define ISC_CPR INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA /* 2 chars; Consonant_Preceding_Repha */
-#define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED /* 7 chars; Consonant_Prefixed */
-#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 95 chars; Consonant_Subjoined */
-#define ISC_CSR INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA /* 5 chars; Consonant_Succeeding_Repha */
-#define ISC_CWS INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER /* 4 chars; Consonant_With_Stacker */
-#define ISC_GM INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK /* 3 chars; Gemination_Mark */
-#define ISC_IS INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER /* 10 chars; Invisible_Stacker */
-#define ISC_ZWJ INDIC_SYLLABIC_CATEGORY_JOINER /* 1 chars; Joiner */
-#define ISC_ML INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER /* 1 chars; Modifying_Letter */
-#define ISC_ZWNJ INDIC_SYLLABIC_CATEGORY_NON_JOINER /* 1 chars; Non_Joiner */
-#define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 28 chars; Nukta */
-#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 469 chars; Number */
-#define ISC_NJ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER /* 1 chars; Number_Joiner */
-#define ISC_x INDIC_SYLLABIC_CATEGORY_OTHER /* 1 chars; Other */
-#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 21 chars; Pure_Killer */
-#define ISC_RS INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER /* 2 chars; Register_Shifter */
-#define ISC_SM INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER /* 22 chars; Syllable_Modifier */
-#define ISC_TL INDIC_SYLLABIC_CATEGORY_TONE_LETTER /* 7 chars; Tone_Letter */
-#define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 42 chars; Tone_Mark */
-#define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 24 chars; Virama */
-#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 34 chars; Visarga */
-#define ISC_Vo INDIC_SYLLABIC_CATEGORY_VOWEL /* 30 chars; Vowel */
-#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 633 chars; Vowel_Dependent */
-#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 443 chars; Vowel_Independent */
-
-#define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 330 chars; Bottom */
-#define IMC_BL INDIC_MATRA_CATEGORY_BOTTOM_AND_LEFT /* 1 chars; Bottom_And_Left */
-#define IMC_BR INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT /* 2 chars; Bottom_And_Right */
-#define IMC_L INDIC_MATRA_CATEGORY_LEFT /* 57 chars; Left */
-#define IMC_LR INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT /* 21 chars; Left_And_Right */
-#define IMC_x INDIC_MATRA_CATEGORY_NOT_APPLICABLE /* 1 chars; Not_Applicable */
-#define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 10 chars; Overstruck */
-#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 262 chars; Right */
-#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 380 chars; Top */
-#define IMC_TB INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM /* 10 chars; Top_And_Bottom */
-#define IMC_TBR INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT /* 1 chars; Top_And_Bottom_And_Right */
-#define IMC_TL INDIC_MATRA_CATEGORY_TOP_AND_LEFT /* 6 chars; Top_And_Left */
-#define IMC_TLR INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT /* 4 chars; Top_And_Left_And_Right */
-#define IMC_TR INDIC_MATRA_CATEGORY_TOP_AND_RIGHT /* 13 chars; Top_And_Right */
-#define IMC_VOL INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT /* 19 chars; Visual_Order_Left */
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex-indic.hh"
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-macros"
+
+#define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 17 chars; Avagraha */
+#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 86 chars; Bindu */
+#define ISC_BJN INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER /* 20 chars; Brahmi_Joining_Number */
+#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 59 chars; Cantillation_Mark */
+#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 2160 chars; Consonant */
+#define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 12 chars; Consonant_Dead */
+#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 67 chars; Consonant_Final */
+#define ISC_CHL INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER /* 5 chars; Consonant_Head_Letter */
+#define ISC_CIP INDIC_SYLLABIC_CATEGORY_CONSONANT_INITIAL_POSTFIXED /* 1 chars; Consonant_Initial_Postfixed */
+#define ISC_CK INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER /* 2 chars; Consonant_Killer */
+#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 29 chars; Consonant_Medial */
+#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 22 chars; Consonant_Placeholder */
+#define ISC_CPR INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA /* 2 chars; Consonant_Preceding_Repha */
+#define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED /* 9 chars; Consonant_Prefixed */
+#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 94 chars; Consonant_Subjoined */
+#define ISC_CSR INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA /* 4 chars; Consonant_Succeeding_Repha */
+#define ISC_CWS INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER /* 6 chars; Consonant_With_Stacker */
+#define ISC_GM INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK /* 3 chars; Gemination_Mark */
+#define ISC_IS INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER /* 11 chars; Invisible_Stacker */
+#define ISC_ZWJ INDIC_SYLLABIC_CATEGORY_JOINER /* 1 chars; Joiner */
+#define ISC_ML INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER /* 1 chars; Modifying_Letter */
+#define ISC_ZWNJ INDIC_SYLLABIC_CATEGORY_NON_JOINER /* 1 chars; Non_Joiner */
+#define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 30 chars; Nukta */
+#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 481 chars; Number */
+#define ISC_NJ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER /* 1 chars; Number_Joiner */
+#define ISC_x INDIC_SYLLABIC_CATEGORY_OTHER /* 1 chars; Other */
+#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 21 chars; Pure_Killer */
+#define ISC_RS INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER /* 2 chars; Register_Shifter */
+#define ISC_SM INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER /* 25 chars; Syllable_Modifier */
+#define ISC_TL INDIC_SYLLABIC_CATEGORY_TONE_LETTER /* 7 chars; Tone_Letter */
+#define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 42 chars; Tone_Mark */
+#define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 27 chars; Virama */
+#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 35 chars; Visarga */
+#define ISC_Vo INDIC_SYLLABIC_CATEGORY_VOWEL /* 30 chars; Vowel */
+#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 673 chars; Vowel_Dependent */
+#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 476 chars; Vowel_Independent */
+
+#define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 349 chars; Bottom */
+#define IMC_BL INDIC_MATRA_CATEGORY_BOTTOM_AND_LEFT /* 1 chars; Bottom_And_Left */
+#define IMC_BR INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT /* 2 chars; Bottom_And_Right */
+#define IMC_L INDIC_MATRA_CATEGORY_LEFT /* 61 chars; Left */
+#define IMC_LR INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT /* 21 chars; Left_And_Right */
+#define IMC_x INDIC_MATRA_CATEGORY_NOT_APPLICABLE /* 1 chars; Not_Applicable */
+#define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 10 chars; Overstruck */
+#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 281 chars; Right */
+#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 398 chars; Top */
+#define IMC_TB INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM /* 10 chars; Top_And_Bottom */
+#define IMC_TBR INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT /* 1 chars; Top_And_Bottom_And_Right */
+#define IMC_TL INDIC_MATRA_CATEGORY_TOP_AND_LEFT /* 6 chars; Top_And_Left */
+#define IMC_TLR INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT /* 4 chars; Top_And_Left_And_Right */
+#define IMC_TR INDIC_MATRA_CATEGORY_TOP_AND_RIGHT /* 13 chars; Top_And_Right */
+#define IMC_VOL INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT /* 19 chars; Visual_Order_Left */
+
+#pragma GCC diagnostic pop
#define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M)
@@ -119,7 +128,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* Bengali */
- /* 0980 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0980 */ _(CP,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0988 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(VI,x),
/* 0990 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0998 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
@@ -134,7 +143,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 09E0 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 09E8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 09F0 */ _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 09F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(Bi,x), _(x,x), _(x,x), _(x,x),
+ /* 09F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(Bi,x), _(x,x), _(SM,T), _(x,x),
/* Gurmukhi */
@@ -148,7 +157,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 0A38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(x,x), _(M,R), _(M,L),
/* 0A40 */ _(M,R), _(M,B), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T),
/* 0A48 */ _(M,T), _(x,x), _(x,x), _(M,T), _(M,T), _(V,B), _(x,x), _(x,x),
- /* 0A50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 0A50 */ _(x,x), _(Ca,B), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* 0A58 */ _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(x,x),
/* 0A60 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0A68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
@@ -214,7 +223,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* Telugu */
- /* 0C00 */ _(Bi,T), _(Bi,R), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0C00 */ _(Bi,T), _(Bi,R), _(Bi,R), _(Vs,R), _(Bi,T), _(VI,x), _(VI,x), _(VI,x),
/* 0C08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x),
/* 0C10 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0C18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
@@ -233,7 +242,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* Kannada */
- /* 0C80 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0C80 */ _(Bi,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0C88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x),
/* 0C90 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0C98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
@@ -301,7 +310,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 1030 */ _(M,B), _(M,L), _(M,T), _(M,T), _(M,T), _(M,T), _(Bi,T), _(TM,B),
/* 1038 */ _(Vs,R), _(IS,x), _(PK,T), _(CM,R), _(CM,x), _(CM,B), _(CM,B), _(C,x),
/* 1040 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1048 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(CP,x), _(x,x),
+ /* 1048 */ _(Nd,x), _(Nd,x), _(x,x), _(CP,x), _(x,x), _(x,x), _(CP,x), _(x,x),
/* 1050 */ _(C,x), _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(M,R), _(M,R),
/* 1058 */ _(M,B), _(M,B), _(C,x), _(C,x), _(C,x), _(C,x), _(CM,B), _(CM,B),
/* 1060 */ _(CM,B), _(C,x), _(M,R), _(TM,R), _(TM,R), _(C,x), _(C,x), _(M,R),
@@ -342,8 +351,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 1CD8 */ _(Ca,B), _(Ca,B), _(Ca,T), _(Ca,T), _(Ca,B), _(Ca,B), _(Ca,B), _(Ca,B),
/* 1CE0 */ _(Ca,T), _(Ca,R), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O),
/* 1CE8 */ _(x,O), _(x,x), _(x,x), _(x,x), _(x,x), _(x,B), _(x,x), _(x,x),
- /* 1CF0 */ _(x,x), _(x,x), _(Vs,x), _(Vs,x), _(Ca,T), _(x,x), _(x,x), _(Ca,R),
- /* 1CF8 */ _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 1CF0 */ _(x,x), _(x,x), _(CD,x), _(CD,x), _(Ca,T),_(CWS,x),_(CWS,x), _(Ca,R),
+ /* 1CF8 */ _(Ca,x), _(Ca,x), _(CP,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
#define indic_offset_0x2008u 1656
@@ -370,8 +379,9 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* A8E0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
/* A8E8 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
/* A8F0 */ _(Ca,T), _(Ca,T), _(Bi,x), _(Bi,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* A8F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(VI,x), _(M,T),
-#define indic_offset_0xa9e0u 1720
+#define indic_offset_0xa9e0u 1728
/* Myanmar Extended-B */
@@ -381,7 +391,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* A9F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* A9F8 */ _(Nd,x), _(Nd,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x),
-#define indic_offset_0xaa60u 1752
+#define indic_offset_0xaa60u 1760
/* Myanmar Extended-A */
@@ -391,7 +401,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* AA70 */ _(x,x), _(C,x), _(C,x), _(C,x), _(CP,x), _(CP,x), _(CP,x), _(x,x),
/* AA78 */ _(x,x), _(x,x), _(C,x), _(TM,R), _(TM,T), _(TM,R), _(C,x), _(C,x),
-}; /* Table items: 1784; occupancy: 70% */
+}; /* Table items: 1792; occupancy: 70% */
INDIC_TABLE_ELEMENT_TYPE
hb_indic_get_categories (hb_codepoint_t u)
@@ -399,10 +409,10 @@ hb_indic_get_categories (hb_codepoint_t u)
switch (u >> 12)
{
case 0x0u:
+ if (unlikely (u == 0x00A0u)) return _(CP,x);
if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
if (hb_in_range<hb_codepoint_t> (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u];
if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
- if (unlikely (u == 0x00A0u)) return _(CP,x);
break;
case 0x1u:
@@ -412,13 +422,13 @@ hb_indic_get_categories (hb_codepoint_t u)
break;
case 0x2u:
+ if (unlikely (u == 0x25CCu)) return _(CP,x);
if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
if (hb_in_range<hb_codepoint_t> (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u];
- if (unlikely (u == 0x25CCu)) return _(CP,x);
break;
case 0xAu:
- if (hb_in_range<hb_codepoint_t> (u, 0xA8E0u, 0xA8F7u)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u];
+ if (hb_in_range<hb_codepoint_t> (u, 0xA8E0u, 0xA8FFu)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u];
if (hb_in_range<hb_codepoint_t> (u, 0xA9E0u, 0xA9FFu)) return indic_table[u - 0xA9E0u + indic_offset_0xa9e0u];
if (hb_in_range<hb_codepoint_t> (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u];
break;
@@ -439,6 +449,7 @@ hb_indic_get_categories (hb_codepoint_t u)
#undef ISC_CD
#undef ISC_CF
#undef ISC_CHL
+#undef ISC_CIP
#undef ISC_CK
#undef ISC_CM
#undef ISC_CP
@@ -483,4 +494,6 @@ hb_indic_get_categories (hb_codepoint_t u)
#undef IMC_TR
#undef IMC_VOL
+#endif
+
/* == End of generated table == */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc
index 97d6d38287..26dc60ddc9 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc
@@ -24,241 +24,17 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-ot-shape-complex-indic-private.hh"
-#include "hb-ot-layout-private.hh"
+#include "hb.hh"
-/* buffer var allocations */
-#define indic_category() complex_var_u8_0() /* indic_category_t */
-#define indic_position() complex_var_u8_1() /* indic_position_t */
+#ifndef HB_NO_OT_SHAPE
+#include "hb-ot-shape-complex-indic.hh"
+#include "hb-ot-shape-complex-vowel-constraints.hh"
+#include "hb-ot-layout.hh"
-/*
- * Indic shaper.
- */
-
-
-#define IN_HALF_BLOCK(u, Base) (((u) & ~0x7Fu) == (Base))
-
-#define IS_DEVA(u) (IN_HALF_BLOCK (u, 0x0900u))
-#define IS_BENG(u) (IN_HALF_BLOCK (u, 0x0980u))
-#define IS_GURU(u) (IN_HALF_BLOCK (u, 0x0A00u))
-#define IS_GUJR(u) (IN_HALF_BLOCK (u, 0x0A80u))
-#define IS_ORYA(u) (IN_HALF_BLOCK (u, 0x0B00u))
-#define IS_TAML(u) (IN_HALF_BLOCK (u, 0x0B80u))
-#define IS_TELU(u) (IN_HALF_BLOCK (u, 0x0C00u))
-#define IS_KNDA(u) (IN_HALF_BLOCK (u, 0x0C80u))
-#define IS_MLYM(u) (IN_HALF_BLOCK (u, 0x0D00u))
-#define IS_SINH(u) (IN_HALF_BLOCK (u, 0x0D80u))
-#define IS_KHMR(u) (IN_HALF_BLOCK (u, 0x1780u))
-
-
-#define MATRA_POS_LEFT(u) POS_PRE_M
-#define MATRA_POS_RIGHT(u) ( \
- IS_DEVA(u) ? POS_AFTER_SUB : \
- IS_BENG(u) ? POS_AFTER_POST : \
- IS_GURU(u) ? POS_AFTER_POST : \
- IS_GUJR(u) ? POS_AFTER_POST : \
- IS_ORYA(u) ? POS_AFTER_POST : \
- IS_TAML(u) ? POS_AFTER_POST : \
- IS_TELU(u) ? (u <= 0x0C42u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
- IS_KNDA(u) ? (u < 0x0CC3u || u > 0xCD6u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
- IS_MLYM(u) ? POS_AFTER_POST : \
- IS_SINH(u) ? POS_AFTER_SUB : \
- IS_KHMR(u) ? POS_AFTER_POST : \
- /*default*/ POS_AFTER_SUB \
- )
-#define MATRA_POS_TOP(u) ( /* BENG and MLYM don't have top matras. */ \
- IS_DEVA(u) ? POS_AFTER_SUB : \
- IS_GURU(u) ? POS_AFTER_POST : /* Deviate from spec */ \
- IS_GUJR(u) ? POS_AFTER_SUB : \
- IS_ORYA(u) ? POS_AFTER_MAIN : \
- IS_TAML(u) ? POS_AFTER_SUB : \
- IS_TELU(u) ? POS_BEFORE_SUB : \
- IS_KNDA(u) ? POS_BEFORE_SUB : \
- IS_SINH(u) ? POS_AFTER_SUB : \
- IS_KHMR(u) ? POS_AFTER_POST : \
- /*default*/ POS_AFTER_SUB \
- )
-#define MATRA_POS_BOTTOM(u) ( \
- IS_DEVA(u) ? POS_AFTER_SUB : \
- IS_BENG(u) ? POS_AFTER_SUB : \
- IS_GURU(u) ? POS_AFTER_POST : \
- IS_GUJR(u) ? POS_AFTER_POST : \
- IS_ORYA(u) ? POS_AFTER_SUB : \
- IS_TAML(u) ? POS_AFTER_POST : \
- IS_TELU(u) ? POS_BEFORE_SUB : \
- IS_KNDA(u) ? POS_BEFORE_SUB : \
- IS_MLYM(u) ? POS_AFTER_POST : \
- IS_SINH(u) ? POS_AFTER_SUB : \
- IS_KHMR(u) ? POS_AFTER_POST : \
- /*default*/ POS_AFTER_SUB \
- )
-
-static inline indic_position_t
-matra_position (hb_codepoint_t u, indic_position_t side)
-{
- switch ((int) side)
- {
- case POS_PRE_C: return MATRA_POS_LEFT (u);
- case POS_POST_C: return MATRA_POS_RIGHT (u);
- case POS_ABOVE_C: return MATRA_POS_TOP (u);
- case POS_BELOW_C: return MATRA_POS_BOTTOM (u);
- };
- return side;
-}
-
-/* XXX
- * This is a hack for now. We should move this data into the main Indic table.
- * Or completely remove it and just check in the tables.
- */
-static const hb_codepoint_t ra_chars[] = {
- 0x0930u, /* Devanagari */
- 0x09B0u, /* Bengali */
- 0x09F0u, /* Bengali */
- 0x0A30u, /* Gurmukhi */ /* No Reph */
- 0x0AB0u, /* Gujarati */
- 0x0B30u, /* Oriya */
- 0x0BB0u, /* Tamil */ /* No Reph */
- 0x0C30u, /* Telugu */ /* Reph formed only with ZWJ */
- 0x0CB0u, /* Kannada */
- 0x0D30u, /* Malayalam */ /* No Reph, Logical Repha */
-
- 0x0DBBu, /* Sinhala */ /* Reph formed only with ZWJ */
-
- 0x179Au, /* Khmer */ /* No Reph, Visual Repha */
-};
-
-static inline bool
-is_ra (hb_codepoint_t u)
-{
- for (unsigned int i = 0; i < ARRAY_LENGTH (ra_chars); i++)
- if (u == ra_chars[i])
- return true;
- return false;
-}
-
-static inline bool
-is_one_of (const hb_glyph_info_t &info, unsigned int flags)
-{
- /* If it ligated, all bets are off. */
- if (_hb_glyph_info_ligated (&info)) return false;
- return !!(FLAG_UNSAFE (info.indic_category()) & flags);
-}
-
-static inline bool
-is_joiner (const hb_glyph_info_t &info)
-{
- return is_one_of (info, JOINER_FLAGS);
-}
-
-static inline bool
-is_consonant (const hb_glyph_info_t &info)
-{
- return is_one_of (info, CONSONANT_FLAGS);
-}
-
-static inline bool
-is_halant_or_coeng (const hb_glyph_info_t &info)
-{
- return is_one_of (info, HALANT_OR_COENG_FLAGS);
-}
-
-static inline void
-set_indic_properties (hb_glyph_info_t &info)
-{
- hb_codepoint_t u = info.codepoint;
- unsigned int type = hb_indic_get_categories (u);
- indic_category_t cat = (indic_category_t) (type & 0x7Fu);
- indic_position_t pos = (indic_position_t) (type >> 8);
-
-
- /*
- * Re-assign category
- */
-
- /* The following act more like the Bindus. */
- if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x0953u, 0x0954u)))
- cat = OT_SM;
- /* The following act like consonants. */
- else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x0A72u, 0x0A73u,
- 0x1CF5u, 0x1CF6u)))
- cat = OT_C;
- /* TODO: The following should only be allowed after a Visarga.
- * For now, just treat them like regular tone marks. */
- else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x1CE2u, 0x1CE8u)))
- cat = OT_A;
- /* TODO: The following should only be allowed after some of
- * the nasalization marks, maybe only for U+1CE9..U+1CF1.
- * For now, just treat them like tone marks. */
- else if (unlikely (u == 0x1CEDu))
- cat = OT_A;
- /* The following take marks in standalone clusters, similar to Avagraha. */
- else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0xA8F2u, 0xA8F7u,
- 0x1CE9u, 0x1CECu,
- 0x1CEEu, 0x1CF1u)))
- {
- cat = OT_Symbol;
- static_assert (((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol), "");
- }
- else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x17CDu, 0x17D1u) ||
- u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */
- {
- /* These can occur mid-syllable (eg. before matras), even though Unicode marks them as Syllable_Modifier.
- * https://github.com/roozbehp/unicode-data/issues/5 */
- cat = OT_M;
- pos = POS_ABOVE_C;
- }
- else if (unlikely (u == 0x0A51u))
- {
- /* https://github.com/harfbuzz/harfbuzz/issues/524 */
- cat = OT_M;
- pos = POS_BELOW_C;
- }
-
- /* According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil,
- * so the Indic shaper needs to know their categories. */
- else if (unlikely (u == 0x11301u || u == 0x11303u)) cat = OT_SM;
- else if (unlikely (u == 0x1133cu)) cat = OT_N;
-
- else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */
-
- else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */
- else if (unlikely (u == 0x0C80u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/623 */
- else if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
- else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u)))
- cat = OT_PLACEHOLDER;
- else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
-
-
- /*
- * Re-assign position.
- */
-
- if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS))
- {
- pos = POS_BASE_C;
- if (is_ra (u))
- cat = OT_Ra;
- }
- else if (cat == OT_M)
- {
- pos = matra_position (u, pos);
- }
- else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) | FLAG (OT_VD) | FLAG (OT_A) | FLAG (OT_Symbol))))
- {
- pos = POS_SMVD;
- }
-
- if (unlikely (u == 0x0B01u)) pos = POS_BEFORE_SUB; /* Oriya Bindu is BeforeSub in the spec. */
-
-
-
- info.indic_category() = cat;
- info.indic_position() = pos;
-}
/*
- * Things above this line should ideally be moved to the Indic table itself.
+ * Indic shaper.
*/
@@ -271,7 +47,6 @@ set_indic_properties (hb_glyph_info_t &info)
*/
enum base_position_t {
- BASE_POS_FIRST,
BASE_POS_LAST_SINHALA,
BASE_POS_LAST
};
@@ -280,13 +55,11 @@ enum reph_position_t {
REPH_POS_BEFORE_SUB = POS_BEFORE_SUB,
REPH_POS_AFTER_SUB = POS_AFTER_SUB,
REPH_POS_BEFORE_POST = POS_BEFORE_POST,
- REPH_POS_AFTER_POST = POS_AFTER_POST,
- REPH_POS_DONT_CARE = POS_RA_TO_BECOME_REPH
+ REPH_POS_AFTER_POST = POS_AFTER_POST
};
enum reph_mode_t {
REPH_MODE_IMPLICIT, /* Reph formed out of initial Ra,H sequence. */
REPH_MODE_EXPLICIT, /* Reph formed out of initial Ra,H,ZWJ sequence. */
- REPH_MODE_VIS_REPHA, /* Encoded Repha character, no reordering needed. */
REPH_MODE_LOG_REPHA /* Encoded Repha character, needs reordering. */
};
enum blwf_mode_t {
@@ -318,8 +91,7 @@ static const indic_config_t indic_configs[] =
{HB_SCRIPT_KANNADA, true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY},
{HB_SCRIPT_MALAYALAM, true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST},
{HB_SCRIPT_SINHALA, false,0x0DCAu,BASE_POS_LAST_SINHALA,
- REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
- {HB_SCRIPT_KHMER, false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST},
+ REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
};
@@ -328,95 +100,78 @@ static const indic_config_t indic_configs[] =
* Indic shaper.
*/
-struct feature_list_t {
- hb_tag_t tag;
- hb_ot_map_feature_flags_t flags;
-};
-
-static const feature_list_t
+static const hb_ot_map_feature_t
indic_features[] =
{
/*
* Basic features.
* These features are applied in order, one at a time, after initial_reordering.
*/
- {HB_TAG('n','u','k','t'), F_GLOBAL},
- {HB_TAG('a','k','h','n'), F_GLOBAL},
- {HB_TAG('r','p','h','f'), F_NONE},
- {HB_TAG('r','k','r','f'), F_GLOBAL},
- {HB_TAG('p','r','e','f'), F_NONE},
- {HB_TAG('b','l','w','f'), F_NONE},
- {HB_TAG('a','b','v','f'), F_NONE},
- {HB_TAG('h','a','l','f'), F_NONE},
- {HB_TAG('p','s','t','f'), F_NONE},
- {HB_TAG('v','a','t','u'), F_GLOBAL},
- {HB_TAG('c','j','c','t'), F_GLOBAL},
- {HB_TAG('c','f','a','r'), F_NONE},
+ {HB_TAG('n','u','k','t'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('a','k','h','n'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('r','p','h','f'), F_MANUAL_JOINERS},
+ {HB_TAG('r','k','r','f'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('p','r','e','f'), F_MANUAL_JOINERS},
+ {HB_TAG('b','l','w','f'), F_MANUAL_JOINERS},
+ {HB_TAG('a','b','v','f'), F_MANUAL_JOINERS},
+ {HB_TAG('h','a','l','f'), F_MANUAL_JOINERS},
+ {HB_TAG('p','s','t','f'), F_MANUAL_JOINERS},
+ {HB_TAG('v','a','t','u'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('c','j','c','t'), F_GLOBAL_MANUAL_JOINERS},
/*
* Other features.
- * These features are applied all at once, after final_reordering.
+ * These features are applied all at once, after final_reordering
+ * but before clearing syllables.
* Default Bengali font in Windows for example has intermixed
* lookups for init,pres,abvs,blws features.
*/
- {HB_TAG('i','n','i','t'), F_NONE},
- {HB_TAG('p','r','e','s'), F_GLOBAL},
- {HB_TAG('a','b','v','s'), F_GLOBAL},
- {HB_TAG('b','l','w','s'), F_GLOBAL},
- {HB_TAG('p','s','t','s'), F_GLOBAL},
- {HB_TAG('h','a','l','n'), F_GLOBAL},
- /* Positioning features, though we don't care about the types. */
- {HB_TAG('d','i','s','t'), F_GLOBAL},
- {HB_TAG('a','b','v','m'), F_GLOBAL},
- {HB_TAG('b','l','w','m'), F_GLOBAL},
+ {HB_TAG('i','n','i','t'), F_MANUAL_JOINERS},
+ {HB_TAG('p','r','e','s'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('a','b','v','s'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('b','l','w','s'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('p','s','t','s'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('h','a','l','n'), F_GLOBAL_MANUAL_JOINERS},
};
/*
* Must be in the same order as the indic_features array.
*/
enum {
- _NUKT,
- _AKHN,
- RPHF,
- _RKRF,
- PREF,
- BLWF,
- ABVF,
- HALF,
- PSTF,
- _VATU,
- _CJCT,
- CFAR,
-
- INIT,
- _PRES,
- _ABVS,
- _BLWS,
- _PSTS,
- _HALN,
- _DIST,
- _ABVM,
- _BLWM,
+ _INDIC_NUKT,
+ _INDIC_AKHN,
+ INDIC_RPHF,
+ _INDIC_RKRF,
+ INDIC_PREF,
+ INDIC_BLWF,
+ INDIC_ABVF,
+ INDIC_HALF,
+ INDIC_PSTF,
+ _INDIC_VATU,
+ _INDIC_CJCT,
+
+ INDIC_INIT,
+ _INDIC_PRES,
+ _INDIC_ABVS,
+ _INDIC_BLWS,
+ _INDIC_PSTS,
+ _INDIC_HALN,
INDIC_NUM_FEATURES,
- INDIC_BASIC_FEATURES = INIT /* Don't forget to update this! */
+ INDIC_BASIC_FEATURES = INDIC_INIT, /* Don't forget to update this! */
};
static void
-setup_syllables (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
-static void
-initial_reordering (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
+setup_syllables_indic (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
static void
-final_reordering (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
+initial_reordering_indic (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
static void
-clear_syllables (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
+final_reordering_indic (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
static void
collect_features_indic (hb_ot_shape_planner_t *plan)
@@ -424,83 +179,46 @@ collect_features_indic (hb_ot_shape_planner_t *plan)
hb_ot_map_builder_t *map = &plan->map;
/* Do this before any lookups have been applied. */
- map->add_gsub_pause (setup_syllables);
+ map->add_gsub_pause (setup_syllables_indic);
- map->add_global_bool_feature (HB_TAG('l','o','c','l'));
+ map->enable_feature (HB_TAG('l','o','c','l'));
/* The Indic specs do not require ccmp, but we apply it here since if
* there is a use of it, it's typically at the beginning. */
- map->add_global_bool_feature (HB_TAG('c','c','m','p'));
+ map->enable_feature (HB_TAG('c','c','m','p'));
unsigned int i = 0;
- map->add_gsub_pause (initial_reordering);
+ map->add_gsub_pause (initial_reordering_indic);
+
for (; i < INDIC_BASIC_FEATURES; i++) {
- map->add_feature (indic_features[i].tag, 1, indic_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
+ map->add_feature (indic_features[i]);
map->add_gsub_pause (nullptr);
}
- map->add_gsub_pause (final_reordering);
- for (; i < INDIC_NUM_FEATURES; i++) {
- map->add_feature (indic_features[i].tag, 1, indic_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
- }
- map->add_global_bool_feature (HB_TAG('c','a','l','t'));
- map->add_global_bool_feature (HB_TAG('c','l','i','g'));
+ map->add_gsub_pause (final_reordering_indic);
+
+ for (; i < INDIC_NUM_FEATURES; i++)
+ map->add_feature (indic_features[i]);
- map->add_gsub_pause (clear_syllables);
+ map->enable_feature (HB_TAG('c','a','l','t'));
+ map->enable_feature (HB_TAG('c','l','i','g'));
+
+ map->add_gsub_pause (_hb_clear_syllables);
}
static void
override_features_indic (hb_ot_shape_planner_t *plan)
{
- /* Uniscribe does not apply 'kern' in Khmer. */
- if (hb_options ().uniscribe_bug_compatible)
- {
- switch ((hb_tag_t) plan->props.script)
- {
- case HB_SCRIPT_KHMER:
- plan->map.add_feature (HB_TAG('k','e','r','n'), 0, F_GLOBAL);
- break;
- }
- }
-
- plan->map.add_feature (HB_TAG('l','i','g','a'), 0, F_GLOBAL);
+ plan->map.disable_feature (HB_TAG('l','i','g','a'));
}
-struct would_substitute_feature_t
-{
- inline void init (const hb_ot_map_t *map, hb_tag_t feature_tag, bool zero_context_)
- {
- zero_context = zero_context_;
- map->get_stage_lookups (0/*GSUB*/,
- map->get_feature_stage (0/*GSUB*/, feature_tag),
- &lookups, &count);
- }
-
- inline bool would_substitute (const hb_codepoint_t *glyphs,
- unsigned int glyphs_count,
- hb_face_t *face) const
- {
- for (unsigned int i = 0; i < count; i++)
- if (hb_ot_layout_lookup_would_substitute_fast (face, lookups[i].index, glyphs, glyphs_count, zero_context))
- return true;
- return false;
- }
-
- private:
- const hb_ot_map_t::lookup_map_t *lookups;
- unsigned int count;
- bool zero_context;
-};
-
struct indic_shape_plan_t
{
- ASSERT_POD ();
-
- inline bool get_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const
+ bool load_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const
{
- hb_codepoint_t glyph = virama_glyph;
- if (unlikely (virama_glyph == (hb_codepoint_t) -1))
+ hb_codepoint_t glyph = virama_glyph.get_relaxed ();
+ if (unlikely (glyph == (hb_codepoint_t) -1))
{
if (!config->virama || !font->get_nominal_glyph (config->virama, &glyph))
glyph = 0;
@@ -508,8 +226,8 @@ struct indic_shape_plan_t
* Maybe one day... */
/* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
- * during shape planning... Instead, overwrite it here. It's safe. Don't worry! */
- virama_glyph = glyph;
+ * during shape planning... Instead, overwrite it here. */
+ virama_glyph.set_relaxed ((int) glyph);
}
*pglyph = glyph;
@@ -519,12 +237,17 @@ struct indic_shape_plan_t
const indic_config_t *config;
bool is_old_spec;
- mutable hb_codepoint_t virama_glyph;
+#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE
+ bool uniscribe_bug_compatible;
+#else
+ static constexpr bool uniscribe_bug_compatible = false;
+#endif
+ mutable hb_atomic_int_t virama_glyph;
- would_substitute_feature_t rphf;
- would_substitute_feature_t pref;
- would_substitute_feature_t blwf;
- would_substitute_feature_t pstf;
+ hb_indic_would_substitute_feature_t rphf;
+ hb_indic_would_substitute_feature_t pref;
+ hb_indic_would_substitute_feature_t blwf;
+ hb_indic_would_substitute_feature_t pstf;
hb_mask_t mask_array[INDIC_NUM_FEATURES];
};
@@ -544,7 +267,10 @@ data_create_indic (const hb_ot_shape_plan_t *plan)
}
indic_plan->is_old_spec = indic_plan->config->has_old_spec && ((plan->map.chosen_script[0] & 0x000000FFu) != '2');
- indic_plan->virama_glyph = (hb_codepoint_t) -1;
+#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE
+ indic_plan->uniscribe_bug_compatible = hb_options ().uniscribe_bug_compatible;
+#endif
+ indic_plan->virama_glyph.set_relaxed (-1);
/* Use zero-context would_substitute() matching for new-spec of the main
* Indic scripts, and scripts with one spec only, but not for old-specs.
@@ -604,13 +330,13 @@ consonant_position_from_face (const indic_shape_plan_t *indic_plan,
}
-enum syllable_type_t {
- consonant_syllable,
- vowel_syllable,
- standalone_cluster,
- symbol_cluster,
- broken_cluster,
- non_indic_cluster,
+enum indic_syllable_type_t {
+ indic_consonant_syllable,
+ indic_vowel_syllable,
+ indic_standalone_cluster,
+ indic_symbol_cluster,
+ indic_broken_cluster,
+ indic_non_indic_cluster,
};
#include "hb-ot-shape-complex-indic-machine.hh"
@@ -634,11 +360,11 @@ setup_masks_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
}
static void
-setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
- hb_font_t *font HB_UNUSED,
- hb_buffer_t *buffer)
+setup_syllables_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font HB_UNUSED,
+ hb_buffer_t *buffer)
{
- find_syllables (buffer);
+ find_syllables_indic (buffer);
foreach_syllable (buffer, start, end)
buffer->unsafe_to_break (start, end);
}
@@ -655,9 +381,9 @@ compare_indic_order (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
static void
-update_consonant_positions (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer)
+update_consonant_positions_indic (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
{
const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
@@ -665,7 +391,7 @@ update_consonant_positions (const hb_ot_shape_plan_t *plan,
return;
hb_codepoint_t virama;
- if (indic_plan->get_virama_glyph (font, &virama))
+ if (indic_plan->load_virama_glyph (font, &virama))
{
hb_face_t *face = font->face;
unsigned int count = buffer->len;
@@ -681,7 +407,7 @@ update_consonant_positions (const hb_ot_shape_plan_t *plan,
/* Rules from:
- * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx */
+ * https://docs.microsqoft.com/en-us/typography/script-development/devanagari */
static void
initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
@@ -730,8 +456,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
* and has more than one consonant, Ra is excluded from candidates for
* base consonants. */
unsigned int limit = start;
- if (indic_plan->config->reph_pos != REPH_POS_DONT_CARE &&
- indic_plan->mask_array[RPHF] &&
+ if (indic_plan->mask_array[INDIC_RPHF] &&
start + 3 <= end &&
(
(indic_plan->config->reph_mode == REPH_MODE_IMPLICIT && !is_joiner (info[start + 2])) ||
@@ -815,7 +540,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
case BASE_POS_LAST_SINHALA:
{
- /* Sinhala base positioning is slightly different from main Indic, in that:
+ /* Sinhala base positioning is slightly different from main Indic, in that:
* 1. Its ZWJ behavior is different,
* 2. We don't need to look into the font for consonant positions.
*/
@@ -840,22 +565,6 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
info[i].indic_position() = POS_BELOW_C;
}
break;
-
- case BASE_POS_FIRST:
- {
- /* The first consonant is always the base. */
-
- assert (indic_plan->config->reph_mode == REPH_MODE_VIS_REPHA);
- assert (!has_reph);
-
- base = start;
-
- /* Mark all subsequent consonants as below. */
- for (unsigned int i = base + 1; i < end; i++)
- if (is_consonant (info[i]))
- info[i].indic_position() = POS_BELOW_C;
- }
- break;
}
/* -> If the syllable starts with Ra + Halant (in a script that has Reph)
@@ -905,20 +614,20 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
/* Reorder characters */
for (unsigned int i = start; i < base; i++)
- info[i].indic_position() = MIN (POS_PRE_C, (indic_position_t) info[i].indic_position());
+ info[i].indic_position() = hb_min (POS_PRE_C, (indic_position_t) info[i].indic_position());
if (base < end)
info[base].indic_position() = POS_BASE_C;
- /* Mark final consonants. A final consonant is one appearing after a matra,
- * like in Khmer. */
+ /* Mark final consonants. A final consonant is one appearing after a matra.
+ * Happens in Sinhala. */
for (unsigned int i = base + 1; i < end; i++)
if (info[i].indic_category() == OT_M) {
for (unsigned int j = i + 1; j < end; j++)
- if (is_consonant (info[j])) {
- info[j].indic_position() = POS_FINAL_C;
- break;
- }
+ if (is_consonant (info[j])) {
+ info[j].indic_position() = POS_FINAL_C;
+ break;
+ }
break;
}
@@ -930,9 +639,10 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
* last consonant.
*
* Reports suggest that in some scripts Uniscribe does this only if there
- * is *not* a Halant after last consonant already (eg. Kannada), while it
- * does it unconditionally in other scripts (eg. Malayalam). We don't
- * currently know about other scripts, so we single out Malayalam for now.
+ * is *not* a Halant after last consonant already. We know that is the
+ * case for Kannada, while it reorders unconditionally in other scripts,
+ * eg. Malayalam, Bengali, and Devanagari. We don't currently know about
+ * other scripts, so we blacklist Kannada.
*
* Kannada test case:
* U+0C9A,U+0CCD,U+0C9A,U+0CCD
@@ -942,15 +652,25 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
* Malayalam test case:
* U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D
* With lohit-ttf-20121122/Lohit-Malayalam.ttf
+ *
+ * Bengali test case:
+ * U+0998,U+09CD,U+09AF,U+09CD
+ * With Windows XP vrinda.ttf
+ * https://github.com/harfbuzz/harfbuzz/issues/1073
+ *
+ * Devanagari test case:
+ * U+091F,U+094D,U+0930,U+094D
+ * With chandas.ttf
+ * https://github.com/harfbuzz/harfbuzz/issues/1071
*/
if (indic_plan->is_old_spec)
{
- bool disallow_double_halants = buffer->props.script != HB_SCRIPT_MALAYALAM;
+ bool disallow_double_halants = buffer->props.script == HB_SCRIPT_KANNADA;
for (unsigned int i = base + 1; i < end; i++)
if (info[i].indic_category() == OT_H)
{
- unsigned int j;
- for (j = end - 1; j > i; j--)
+ unsigned int j;
+ for (j = end - 1; j > i; j--)
if (is_consonant (info[j]) ||
(disallow_double_halants && info[j].indic_category() == OT_H))
break;
@@ -960,7 +680,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
memmove (&info[i], &info[i + 1], (j - i) * sizeof (info[0]));
info[j] = t;
}
- break;
+ break;
}
}
@@ -969,7 +689,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
indic_position_t last_pos = POS_START;
for (unsigned int i = start; i < end; i++)
{
- if ((FLAG_UNSAFE (info[i].indic_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | HALANT_OR_COENG_FLAGS)))
+ if ((FLAG_UNSAFE (info[i].indic_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | FLAG (OT_H))))
{
info[i].indic_position() = last_pos;
if (unlikely (info[i].indic_category() == OT_H &&
@@ -991,7 +711,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
}
}
} else if (info[i].indic_position() != POS_SMVD) {
- last_pos = (indic_position_t) info[i].indic_position();
+ last_pos = (indic_position_t) info[i].indic_position();
}
}
}
@@ -1007,7 +727,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
info[j].indic_position() = info[i].indic_position();
last = i;
} else if (info[i].indic_category() == OT_M)
- last = i;
+ last = i;
}
@@ -1035,20 +755,22 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
*
* We could use buffer->sort() for this, if there was no special
* reordering of pre-base stuff happening later...
+ * We don't want to merge_clusters all of that, which buffer->sort()
+ * would.
*/
- if (indic_plan->is_old_spec || end - base > 127)
+ if (indic_plan->is_old_spec || end - start > 127)
buffer->merge_clusters (base, end);
else
{
/* Note! syllable() is a one-byte field. */
for (unsigned int i = base; i < end; i++)
- if (info[i].syllable() != 255)
+ if (info[i].syllable() != 255)
{
unsigned int max = i;
unsigned int j = start + info[i].syllable();
while (j != i)
{
- max = MAX (max, j);
+ max = hb_max (max, j);
unsigned int next = start + info[j].syllable();
info[j].syllable() = 255; /* So we don't process j later again. */
j = next;
@@ -1070,13 +792,13 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
/* Reph */
for (unsigned int i = start; i < end && info[i].indic_position() == POS_RA_TO_BECOME_REPH; i++)
- info[i].mask |= indic_plan->mask_array[RPHF];
+ info[i].mask |= indic_plan->mask_array[INDIC_RPHF];
/* Pre-base */
- mask = indic_plan->mask_array[HALF];
+ mask = indic_plan->mask_array[INDIC_HALF];
if (!indic_plan->is_old_spec &&
indic_plan->config->blwf_mode == BLWF_MODE_PRE_AND_POST)
- mask |= indic_plan->mask_array[BLWF];
+ mask |= indic_plan->mask_array[INDIC_BLWF];
for (unsigned int i = start; i < base; i++)
info[i].mask |= mask;
/* Base */
@@ -1084,7 +806,9 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
if (base < end)
info[base].mask |= mask;
/* Post-base */
- mask = indic_plan->mask_array[BLWF] | indic_plan->mask_array[ABVF] | indic_plan->mask_array[PSTF];
+ mask = indic_plan->mask_array[INDIC_BLWF] |
+ indic_plan->mask_array[INDIC_ABVF] |
+ indic_plan->mask_array[INDIC_PSTF];
for (unsigned int i = base + 1; i < end; i++)
info[i].mask |= mask;
}
@@ -1116,34 +840,23 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
(i + 2 == base ||
info[i+2].indic_category() != OT_ZWJ))
{
- info[i ].mask |= indic_plan->mask_array[BLWF];
- info[i+1].mask |= indic_plan->mask_array[BLWF];
+ info[i ].mask |= indic_plan->mask_array[INDIC_BLWF];
+ info[i+1].mask |= indic_plan->mask_array[INDIC_BLWF];
}
}
unsigned int pref_len = 2;
- if (indic_plan->mask_array[PREF] && base + pref_len < end)
+ if (indic_plan->mask_array[INDIC_PREF] && base + pref_len < end)
{
/* Find a Halant,Ra sequence and mark it for pre-base-reordering processing. */
for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) {
hb_codepoint_t glyphs[2];
for (unsigned int j = 0; j < pref_len; j++)
- glyphs[j] = info[i + j].codepoint;
+ glyphs[j] = info[i + j].codepoint;
if (indic_plan->pref.would_substitute (glyphs, pref_len, face))
{
for (unsigned int j = 0; j < pref_len; j++)
- info[i++].mask |= indic_plan->mask_array[PREF];
-
- /* Mark the subsequent stuff with 'cfar'. Used in Khmer.
- * Read the feature spec.
- * This allows distinguishing the following cases with MS Khmer fonts:
- * U+1784,U+17D2,U+179A,U+17D2,U+1782
- * U+1784,U+17D2,U+1782,U+17D2,U+179A
- */
- if (indic_plan->mask_array[CFAR])
- for (; i < end; i++)
- info[i].mask |= indic_plan->mask_array[CFAR];
-
+ info[i++].mask |= indic_plan->mask_array[INDIC_PREF];
break;
}
}
@@ -1164,7 +877,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
/* A ZWNJ disables HALF. */
if (non_joiner)
- info[j].mask &= ~indic_plan->mask_array[HALF];
+ info[j].mask &= ~indic_plan->mask_array[INDIC_HALF];
} while (j > start && !is_consonant (info[j]));
}
@@ -1179,7 +892,8 @@ initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan,
/* We treat placeholder/dotted-circle as if they are consonants, so we
* should just chain. Only if not in compatibility mode that is... */
- if (hb_options ().uniscribe_bug_compatible)
+ const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
+ if (indic_plan->uniscribe_bug_compatible)
{
/* For dotted-circle, this is what Uniscribe does:
* If dotted-circle is the last glyph, it just does nothing.
@@ -1192,41 +906,45 @@ initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan,
}
static void
-initial_reordering_syllable (const hb_ot_shape_plan_t *plan,
- hb_face_t *face,
- hb_buffer_t *buffer,
- unsigned int start, unsigned int end)
+initial_reordering_syllable_indic (const hb_ot_shape_plan_t *plan,
+ hb_face_t *face,
+ hb_buffer_t *buffer,
+ unsigned int start, unsigned int end)
{
- syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
+ indic_syllable_type_t syllable_type = (indic_syllable_type_t) (buffer->info[start].syllable() & 0x0F);
switch (syllable_type)
{
- case vowel_syllable: /* We made the vowels look like consonants. So let's call the consonant logic! */
- case consonant_syllable:
+ case indic_vowel_syllable: /* We made the vowels look like consonants. So let's call the consonant logic! */
+ case indic_consonant_syllable:
initial_reordering_consonant_syllable (plan, face, buffer, start, end);
break;
- case broken_cluster: /* We already inserted dotted-circles, so just call the standalone_cluster. */
- case standalone_cluster:
+ case indic_broken_cluster: /* We already inserted dotted-circles, so just call the standalone_cluster. */
+ case indic_standalone_cluster:
initial_reordering_standalone_cluster (plan, face, buffer, start, end);
break;
- case symbol_cluster:
- case non_indic_cluster:
+ case indic_symbol_cluster:
+ case indic_non_indic_cluster:
break;
}
}
static inline void
-insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
- hb_font_t *font,
- hb_buffer_t *buffer)
+insert_dotted_circles_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
{
- /* Note: This loop is extra overhead, but should not be measurable. */
+ if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
+ return;
+
+ /* Note: This loop is extra overhead, but should not be measurable.
+ * TODO Use a buffer scratch flag to remove the loop. */
bool has_broken_syllables = false;
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
- if ((info[i].syllable() & 0x0F) == broken_cluster)
+ if ((info[i].syllable() & 0x0F) == indic_broken_cluster)
{
has_broken_syllables = true;
break;
@@ -1248,11 +966,11 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
buffer->idx = 0;
unsigned int last_syllable = 0;
- while (buffer->idx < buffer->len && !buffer->in_error)
+ while (buffer->idx < buffer->len && buffer->successful)
{
unsigned int syllable = buffer->cur().syllable();
- syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
- if (unlikely (last_syllable != syllable && syllable_type == broken_cluster))
+ indic_syllable_type_t syllable_type = (indic_syllable_type_t) (syllable & 0x0F);
+ if (unlikely (last_syllable != syllable && syllable_type == indic_broken_cluster))
{
last_syllable = syllable;
@@ -1260,39 +978,37 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
ginfo.cluster = buffer->cur().cluster;
ginfo.mask = buffer->cur().mask;
ginfo.syllable() = buffer->cur().syllable();
- /* TODO Set glyph_props? */
/* Insert dottedcircle after possible Repha. */
- while (buffer->idx < buffer->len && !buffer->in_error &&
+ while (buffer->idx < buffer->len && buffer->successful &&
last_syllable == buffer->cur().syllable() &&
buffer->cur().indic_category() == OT_Repha)
- buffer->next_glyph ();
+ buffer->next_glyph ();
buffer->output_info (ginfo);
}
else
buffer->next_glyph ();
}
-
buffer->swap_buffers ();
}
static void
-initial_reordering (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer)
+initial_reordering_indic (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
{
- update_consonant_positions (plan, font, buffer);
- insert_dotted_circles (plan, font, buffer);
+ update_consonant_positions_indic (plan, font, buffer);
+ insert_dotted_circles_indic (plan, font, buffer);
foreach_syllable (buffer, start, end)
- initial_reordering_syllable (plan, font->face, buffer, start, end);
+ initial_reordering_syllable_indic (plan, font->face, buffer, start, end);
}
static void
-final_reordering_syllable (const hb_ot_shape_plan_t *plan,
- hb_buffer_t *buffer,
- unsigned int start, unsigned int end)
+final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ unsigned int start, unsigned int end)
{
const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
hb_glyph_info_t *info = buffer->info;
@@ -1303,15 +1019,17 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
* phase, and that might have messed up our properties. Recover
* from a particular case of that where we're fairly sure that a
* class of OT_H is desired but has been lost. */
- if (indic_plan->virama_glyph)
+ /* We don't call load_virama_glyph(), since we know it's already
+ * loaded. */
+ hb_codepoint_t virama_glyph = indic_plan->virama_glyph.get_relaxed ();
+ if (virama_glyph)
{
- unsigned int virama_glyph = indic_plan->virama_glyph;
for (unsigned int i = start; i < end; i++)
if (info[i].codepoint == virama_glyph &&
_hb_glyph_info_ligated (&info[i]) &&
_hb_glyph_info_multiplied (&info[i]))
{
- /* This will make sure that this glyph passes is_halant_or_coeng() test. */
+ /* This will make sure that this glyph passes is_halant() test. */
info[i].indic_category() = OT_H;
_hb_glyph_info_clear_ligated_and_multiplied (&info[i]);
}
@@ -1326,7 +1044,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
* syllable.
*/
- bool try_pref = !!indic_plan->mask_array[PREF];
+ bool try_pref = !!indic_plan->mask_array[INDIC_PREF];
/* Find base again */
unsigned int base;
@@ -1336,7 +1054,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
if (try_pref && base + 1 < end)
{
for (unsigned int i = base + 1; i < end; i++)
- if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
+ if ((info[i].mask & indic_plan->mask_array[INDIC_PREF]) != 0)
{
if (!(_hb_glyph_info_substituted (&info[i]) &&
_hb_glyph_info_ligated_and_didnt_multiply (&info[i])))
@@ -1344,7 +1062,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
/* Ok, this was a 'pref' candidate but didn't form any.
* Base is around here... */
base = i;
- while (base < end && is_halant_or_coeng (info[base]))
+ while (base < end && is_halant (info[base]))
base++;
info[base].indic_position() = POS_BASE_C;
@@ -1360,7 +1078,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
{
while (i < end && is_joiner (info[i]))
i++;
- if (i == end || !is_halant_or_coeng (info[i]))
+ if (i == end || !is_halant (info[i]))
break;
i++; /* Skip halant. */
while (i < end && is_joiner (info[i]))
@@ -1374,7 +1092,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
}
if (start < base && info[base].indic_position() > POS_BASE_C)
- base--;
+ base--;
break;
}
if (base == end && start < base &&
@@ -1382,7 +1100,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
base--;
if (base < end)
while (start < base &&
- is_one_of (info[base], (FLAG (OT_N) | HALANT_OR_COENG_FLAGS)))
+ is_one_of (info[base], (FLAG (OT_N) | FLAG (OT_H))))
base--;
@@ -1394,6 +1112,24 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
* defined as “after last standalone halant glyph, after initial matra
* position and before the main consonant”. If ZWJ or ZWNJ follow this
* halant, position is moved after it.
+ *
+ * IMPLEMENTATION NOTES:
+ *
+ * It looks like the last sentence is wrong. Testing, with Windows 7 Uniscribe
+ * and Devanagari shows that the behavior is best described as:
+ *
+ * "If ZWJ follows this halant, matra is NOT repositioned after this halant.
+ * If ZWNJ follows this halant, position is moved after it."
+ *
+ * Test case, with Adobe Devanagari or Nirmala UI:
+ *
+ * U+091F,U+094D,U+200C,U+092F,U+093F
+ * (Matra moves to the middle, after ZWNJ.)
+ *
+ * U+091F,U+094D,U+200D,U+092F,U+093F
+ * (Matra does NOT move, stays to the left.)
+ *
+ * https://github.com/harfbuzz/harfbuzz/issues/1070
*/
if (start + 1 < end && start < base) /* Otherwise there can't be any pre-base matra characters. */
@@ -1407,22 +1143,46 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
*/
if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL)
{
+ search:
while (new_pos > start &&
- !(is_one_of (info[new_pos], (FLAG (OT_M) | HALANT_OR_COENG_FLAGS))))
+ !(is_one_of (info[new_pos], (FLAG (OT_M) | FLAG (OT_H)))))
new_pos--;
/* If we found no Halant we are done.
* Otherwise only proceed if the Halant does
* not belong to the Matra itself! */
- if (is_halant_or_coeng (info[new_pos]) &&
+ if (is_halant (info[new_pos]) &&
info[new_pos].indic_position() != POS_PRE_M)
{
+#if 0 // See comment above
/* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
if (new_pos + 1 < end && is_joiner (info[new_pos + 1]))
new_pos++;
+#endif
+ if (new_pos + 1 < end)
+ {
+ /* -> If ZWJ follows this halant, matra is NOT repositioned after this halant. */
+ if (info[new_pos + 1].indic_category() == OT_ZWJ)
+ {
+ /* Keep searching. */
+ if (new_pos > start)
+ {
+ new_pos--;
+ goto search;
+ }
+ }
+ /* -> If ZWNJ follows this halant, position is moved after it.
+ *
+ * IMPLEMENTATION NOTES:
+ *
+ * This is taken care of by the state-machine. A Halant,ZWNJ is a terminating
+ * sequence for a consonant syllable; any pre-base matras occurring after it
+ * will belong to the subsequent syllable.
+ */
+ }
}
else
- new_pos = start; /* No move. */
+ new_pos = start; /* No move. */
}
if (start < new_pos && info[new_pos].indic_position () != POS_PRE_M)
@@ -1441,14 +1201,14 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
/* Note: this merge_clusters() is intentionally *after* the reordering.
* Indic matra reordering is special and tricky... */
- buffer->merge_clusters (new_pos, MIN (end, base + 1));
+ buffer->merge_clusters (new_pos, hb_min (end, base + 1));
new_pos--;
}
} else {
for (unsigned int i = start; i < base; i++)
if (info[i].indic_position () == POS_PRE_M) {
- buffer->merge_clusters (i, MIN (end, base + 1));
+ buffer->merge_clusters (i, hb_min (end, base + 1));
break;
}
}
@@ -1481,8 +1241,6 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
unsigned int new_reph_pos;
reph_position_t reph_pos = indic_plan->config->reph_pos;
- assert (reph_pos != REPH_POS_DONT_CARE);
-
/* 1. If reph should be positioned after post-base consonant forms,
* proceed to step 5.
*/
@@ -1504,10 +1262,10 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
*/
{
new_reph_pos = start + 1;
- while (new_reph_pos < base && !is_halant_or_coeng (info[new_reph_pos]))
+ while (new_reph_pos < base && !is_halant (info[new_reph_pos]))
new_reph_pos++;
- if (new_reph_pos < base && is_halant_or_coeng (info[new_reph_pos]))
+ if (new_reph_pos < base && is_halant (info[new_reph_pos]))
{
/* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */
if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1]))
@@ -1526,7 +1284,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
while (new_reph_pos + 1 < end && info[new_reph_pos + 1].indic_position() <= POS_AFTER_MAIN)
new_reph_pos++;
if (new_reph_pos < end)
- goto reph_move;
+ goto reph_move;
}
/* 4. If reph should be positioned before post-base consonant, find
@@ -1542,7 +1300,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
!( FLAG_UNSAFE (info[new_reph_pos + 1].indic_position()) & (FLAG (POS_POST_C) | FLAG (POS_AFTER_POST) | FLAG (POS_SMVD))))
new_reph_pos++;
if (new_reph_pos < end)
- goto reph_move;
+ goto reph_move;
}
/* 5. If no consonant is found in steps 3 or 4, move reph to a position
@@ -1556,10 +1314,10 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
{
/* Copied from step 2. */
new_reph_pos = start + 1;
- while (new_reph_pos < base && !is_halant_or_coeng (info[new_reph_pos]))
+ while (new_reph_pos < base && !is_halant (info[new_reph_pos]))
new_reph_pos++;
- if (new_reph_pos < base && is_halant_or_coeng (info[new_reph_pos]))
+ if (new_reph_pos < base && is_halant (info[new_reph_pos]))
{
/* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */
if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1]))
@@ -1582,14 +1340,16 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
* Uniscribe doesn't do this.
* TEST: U+0930,U+094D,U+0915,U+094B,U+094D
*/
- if (!hb_options ().uniscribe_bug_compatible &&
- unlikely (is_halant_or_coeng (info[new_reph_pos]))) {
+ if (!indic_plan->uniscribe_bug_compatible &&
+ unlikely (is_halant (info[new_reph_pos])))
+ {
for (unsigned int i = base + 1; i < new_reph_pos; i++)
if (info[i].indic_category() == OT_M) {
/* Ok, got it. */
new_reph_pos--;
}
}
+
goto reph_move;
}
@@ -1616,13 +1376,13 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base-reordering Ra. */
{
for (unsigned int i = base + 1; i < end; i++)
- if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
+ if ((info[i].mask & indic_plan->mask_array[INDIC_PREF]) != 0)
{
/* 1. Only reorder a glyph produced by substitution during application
* of the <pref> feature. (Note that a font may shape a Ra consonant with
* the feature generally but block it in certain contexts.)
*/
- /* Note: We just check that something got substituted. We don't check that
+ /* Note: We just check that something got substituted. We don't check that
* the <pref> feature actually did it...
*
* Reorder pref only if it ligated. */
@@ -1644,24 +1404,11 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL)
{
while (new_pos > start &&
- !(is_one_of (info[new_pos - 1], FLAG(OT_M) | HALANT_OR_COENG_FLAGS)))
+ !(is_one_of (info[new_pos - 1], FLAG(OT_M) | FLAG (OT_H))))
new_pos--;
-
- /* In Khmer coeng model, a H,Ra can go *after* matras. If it goes after a
- * split matra, it should be reordered to *before* the left part of such matra. */
- if (new_pos > start && info[new_pos - 1].indic_category() == OT_M)
- {
- unsigned int old_pos = i;
- for (unsigned int j = base + 1; j < old_pos; j++)
- if (info[j].indic_category() == OT_M)
- {
- new_pos--;
- break;
- }
- }
}
- if (new_pos > start && is_halant_or_coeng (info[new_pos - 1]))
+ if (new_pos > start && is_halant (info[new_pos - 1]))
{
/* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
if (new_pos < end && is_joiner (info[new_pos]))
@@ -1681,7 +1428,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
}
}
- break;
+ break;
}
}
@@ -1692,7 +1439,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
if (!start ||
!(FLAG_UNSAFE (_hb_glyph_info_get_general_category (&info[start - 1])) &
FLAG_RANGE (HB_UNICODE_GENERAL_CATEGORY_FORMAT, HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
- info[start].mask |= indic_plan->mask_array[INIT];
+ info[start].mask |= indic_plan->mask_array[INDIC_INIT];
else
buffer->unsafe_to_break (start - 1, start + 1);
}
@@ -1701,13 +1448,13 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
/*
* Finish off the clusters and go home!
*/
- if (hb_options ().uniscribe_bug_compatible)
+ if (indic_plan->uniscribe_bug_compatible)
{
switch ((hb_tag_t) plan->props.script)
{
case HB_SCRIPT_TAMIL:
case HB_SCRIPT_SINHALA:
- break;
+ break;
default:
/* Uniscribe merges the entire syllable into a single cluster... Except for Tamil & Sinhala.
@@ -1722,15 +1469,15 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
static void
-final_reordering (const hb_ot_shape_plan_t *plan,
- hb_font_t *font HB_UNUSED,
- hb_buffer_t *buffer)
+final_reordering_indic (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font HB_UNUSED,
+ hb_buffer_t *buffer)
{
unsigned int count = buffer->len;
if (unlikely (!count)) return;
foreach_syllable (buffer, start, end)
- final_reordering_syllable (plan, buffer, start, end);
+ final_reordering_syllable_indic (plan, buffer, start, end);
HB_BUFFER_DEALLOCATE_VAR (buffer, indic_category);
HB_BUFFER_DEALLOCATE_VAR (buffer, indic_position);
@@ -1738,17 +1485,13 @@ final_reordering (const hb_ot_shape_plan_t *plan,
static void
-clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
- hb_font_t *font HB_UNUSED,
- hb_buffer_t *buffer)
+preprocess_text_indic (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font)
{
- hb_glyph_info_t *info = buffer->info;
- unsigned int count = buffer->len;
- for (unsigned int i = 0; i < count; i++)
- info[i].syllable() = 0;
+ _hb_preprocess_text_vowel_constraints (plan, buffer, font);
}
-
static bool
decompose_indic (const hb_ot_shape_normalize_context_t *c,
hb_codepoint_t ab,
@@ -1759,6 +1502,9 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c,
{
/* Don't decompose these. */
case 0x0931u : return false; /* DEVANAGARI LETTER RRA */
+ // https://github.com/harfbuzz/harfbuzz/issues/779
+ case 0x09DCu : return false; /* BENGALI LETTER RRA */
+ case 0x09DDu : return false; /* BENGALI LETTER RHA */
case 0x0B94u : return false; /* TAMIL LETTER AU */
@@ -1766,13 +1512,6 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c,
* Decompose split matras that don't have Unicode decompositions.
*/
- /* Khmer */
- case 0x17BEu : *a = 0x17C1u; *b= 0x17BEu; return true;
- case 0x17BFu : *a = 0x17C1u; *b= 0x17BFu; return true;
- case 0x17C0u : *a = 0x17C1u; *b= 0x17C0u; return true;
- case 0x17C4u : *a = 0x17C1u; *b= 0x17C4u; return true;
- case 0x17C5u : *a = 0x17C1u; *b= 0x17C5u; return true;
-
#if 0
/* Gujarati */
/* This one has no decomposition in Unicode, but needs no decomposition either. */
@@ -1808,14 +1547,13 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c,
* The Uniscribe behavior is now documented in the newly published Sinhala
* spec in 2012:
*
- * http://www.microsoft.com/typography/OpenTypeDev/sinhala/intro.htm#shaping
+ * https://docs.microsoft.com/en-us/typography/script-development/sinhala#shaping
*/
- const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) c->plan->data;
+ const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) c->plan->data;
hb_codepoint_t glyph;
-
- if (hb_options ().uniscribe_bug_compatible ||
+ if (indic_plan->uniscribe_bug_compatible ||
(c->font->get_nominal_glyph (ab, &glyph) &&
indic_plan->pstf.would_substitute (&glyph, 1, c->font->face)))
{
@@ -1852,14 +1590,17 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
override_features_indic,
data_create_indic,
data_destroy_indic,
- nullptr, /* preprocess_text */
+ preprocess_text_indic,
nullptr, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
decompose_indic,
compose_indic,
setup_masks_indic,
- nullptr, /* disable_otl */
+ HB_TAG_NONE, /* gpos_tag */
nullptr, /* reorder_marks */
HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
false, /* fallback_position */
};
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.hh
new file mode 100644
index 0000000000..1eeed68c50
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.hh
@@ -0,0 +1,435 @@
+/*
+ * Copyright © 2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_INDIC_HH
+#define HB_OT_SHAPE_COMPLEX_INDIC_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex.hh"
+
+
+/* buffer var allocations */
+#define indic_category() complex_var_u8_0() /* indic_category_t */
+#define indic_position() complex_var_u8_1() /* indic_position_t */
+
+
+#define INDIC_TABLE_ELEMENT_TYPE uint16_t
+
+/* Cateories used in the OpenType spec:
+ * https://docs.microsoft.com/en-us/typography/script-development/devanagari
+ */
+/* Note: This enum is duplicated in the -machine.rl source file.
+ * Not sure how to avoid duplication. */
+enum indic_category_t {
+ OT_X = 0,
+ OT_C = 1,
+ OT_V = 2,
+ OT_N = 3,
+ OT_H = 4,
+ OT_ZWNJ = 5,
+ OT_ZWJ = 6,
+ OT_M = 7,
+ OT_SM = 8,
+ /* OT_VD = 9, UNUSED; we use OT_A instead. */
+ OT_A = 10,
+ OT_PLACEHOLDER = 11,
+ OT_DOTTEDCIRCLE = 12,
+ OT_RS = 13, /* Register Shifter, used in Khmer OT spec. */
+ OT_Coeng = 14, /* Khmer-style Virama. */
+ OT_Repha = 15, /* Atomically-encoded logical or visual repha. */
+ OT_Ra = 16,
+ OT_CM = 17, /* Consonant-Medial. */
+ OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */
+ OT_CS = 19,
+
+ /* The following are used by Khmer & Myanmar shapers. Defined
+ * here for them to share. */
+ OT_VAbv = 26,
+ OT_VBlw = 27,
+ OT_VPre = 28,
+ OT_VPst = 29,
+};
+
+#define MEDIAL_FLAGS (FLAG (OT_CM))
+
+/* Note:
+ *
+ * We treat Vowels and placeholders as if they were consonants. This is safe because Vowels
+ * cannot happen in a consonant syllable. The plus side however is, we can call the
+ * consonant syllable logic from the vowel syllable function and get it all right! */
+#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CS) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE))
+#define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ))
+
+
+/* Visual positions in a syllable from left to right. */
+enum indic_position_t {
+ POS_START = 0,
+
+ POS_RA_TO_BECOME_REPH = 1,
+ POS_PRE_M = 2,
+ POS_PRE_C = 3,
+
+ POS_BASE_C = 4,
+ POS_AFTER_MAIN = 5,
+
+ POS_ABOVE_C = 6,
+
+ POS_BEFORE_SUB = 7,
+ POS_BELOW_C = 8,
+ POS_AFTER_SUB = 9,
+
+ POS_BEFORE_POST = 10,
+ POS_POST_C = 11,
+ POS_AFTER_POST = 12,
+
+ POS_FINAL_C = 13,
+ POS_SMVD = 14,
+
+ POS_END = 15
+};
+
+/* Categories used in IndicSyllabicCategory.txt from UCD. */
+enum indic_syllabic_category_t {
+ INDIC_SYLLABIC_CATEGORY_OTHER = OT_X,
+
+ INDIC_SYLLABIC_CATEGORY_AVAGRAHA = OT_Symbol,
+ INDIC_SYLLABIC_CATEGORY_BINDU = OT_SM,
+ INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER = OT_PLACEHOLDER, /* Don't care. */
+ INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK = OT_A,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT = OT_C,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD = OT_C,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL = OT_CM,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER = OT_C,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER = OT_M, /* U+17CD only. */
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL = OT_CM,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER = OT_PLACEHOLDER,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA = OT_Repha,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED = OT_X, /* Don't care. */
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED = OT_CM,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA = OT_CM,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER = OT_CS,
+ INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK = OT_SM, /* https://github.com/harfbuzz/harfbuzz/issues/552 */
+ INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER = OT_Coeng,
+ INDIC_SYLLABIC_CATEGORY_JOINER = OT_ZWJ,
+ INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER = OT_X,
+ INDIC_SYLLABIC_CATEGORY_NON_JOINER = OT_ZWNJ,
+ INDIC_SYLLABIC_CATEGORY_NUKTA = OT_N,
+ INDIC_SYLLABIC_CATEGORY_NUMBER = OT_PLACEHOLDER,
+ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER = OT_PLACEHOLDER, /* Don't care. */
+ INDIC_SYLLABIC_CATEGORY_PURE_KILLER = OT_M, /* Is like a vowel matra. */
+ INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER = OT_RS,
+ INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER = OT_SM,
+ INDIC_SYLLABIC_CATEGORY_TONE_LETTER = OT_X,
+ INDIC_SYLLABIC_CATEGORY_TONE_MARK = OT_N,
+ INDIC_SYLLABIC_CATEGORY_VIRAMA = OT_H,
+ INDIC_SYLLABIC_CATEGORY_VISARGA = OT_SM,
+ INDIC_SYLLABIC_CATEGORY_VOWEL = OT_V,
+ INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT = OT_M,
+ INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT = OT_V
+};
+
+/* Categories used in IndicSMatraCategory.txt from UCD */
+enum indic_matra_category_t {
+ INDIC_MATRA_CATEGORY_NOT_APPLICABLE = POS_END,
+
+ INDIC_MATRA_CATEGORY_LEFT = POS_PRE_C,
+ INDIC_MATRA_CATEGORY_TOP = POS_ABOVE_C,
+ INDIC_MATRA_CATEGORY_BOTTOM = POS_BELOW_C,
+ INDIC_MATRA_CATEGORY_RIGHT = POS_POST_C,
+
+ /* These should resolve to the position of the last part of the split sequence. */
+ INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT,
+ INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT,
+ INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM = INDIC_MATRA_CATEGORY_BOTTOM,
+ INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT,
+ INDIC_MATRA_CATEGORY_TOP_AND_LEFT = INDIC_MATRA_CATEGORY_TOP,
+ INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT,
+ INDIC_MATRA_CATEGORY_TOP_AND_RIGHT = INDIC_MATRA_CATEGORY_RIGHT,
+
+ INDIC_MATRA_CATEGORY_OVERSTRUCK = POS_AFTER_MAIN,
+ INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT = POS_PRE_M
+};
+
+#define INDIC_COMBINE_CATEGORIES(S,M) \
+ ( \
+ ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
+ ( S | \
+ ( \
+ ( \
+ S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \
+ S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \
+ S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \
+ S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \
+ S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \
+ S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \
+ false \
+ ? M : INDIC_MATRA_CATEGORY_NOT_APPLICABLE \
+ ) << 8 \
+ ) \
+ ) \
+ )
+
+HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE
+hb_indic_get_categories (hb_codepoint_t u);
+
+
+static inline bool
+is_one_of (const hb_glyph_info_t &info, unsigned int flags)
+{
+ /* If it ligated, all bets are off. */
+ if (_hb_glyph_info_ligated (&info)) return false;
+ return !!(FLAG_UNSAFE (info.indic_category()) & flags);
+}
+
+static inline bool
+is_joiner (const hb_glyph_info_t &info)
+{
+ return is_one_of (info, JOINER_FLAGS);
+}
+
+static inline bool
+is_consonant (const hb_glyph_info_t &info)
+{
+ return is_one_of (info, CONSONANT_FLAGS);
+}
+
+static inline bool
+is_halant (const hb_glyph_info_t &info)
+{
+ return is_one_of (info, FLAG (OT_H));
+}
+
+#define IN_HALF_BLOCK(u, Base) (((u) & ~0x7Fu) == (Base))
+
+#define IS_DEVA(u) (IN_HALF_BLOCK (u, 0x0900u))
+#define IS_BENG(u) (IN_HALF_BLOCK (u, 0x0980u))
+#define IS_GURU(u) (IN_HALF_BLOCK (u, 0x0A00u))
+#define IS_GUJR(u) (IN_HALF_BLOCK (u, 0x0A80u))
+#define IS_ORYA(u) (IN_HALF_BLOCK (u, 0x0B00u))
+#define IS_TAML(u) (IN_HALF_BLOCK (u, 0x0B80u))
+#define IS_TELU(u) (IN_HALF_BLOCK (u, 0x0C00u))
+#define IS_KNDA(u) (IN_HALF_BLOCK (u, 0x0C80u))
+#define IS_MLYM(u) (IN_HALF_BLOCK (u, 0x0D00u))
+#define IS_SINH(u) (IN_HALF_BLOCK (u, 0x0D80u))
+
+
+#define MATRA_POS_LEFT(u) POS_PRE_M
+#define MATRA_POS_RIGHT(u) ( \
+ IS_DEVA(u) ? POS_AFTER_SUB : \
+ IS_BENG(u) ? POS_AFTER_POST : \
+ IS_GURU(u) ? POS_AFTER_POST : \
+ IS_GUJR(u) ? POS_AFTER_POST : \
+ IS_ORYA(u) ? POS_AFTER_POST : \
+ IS_TAML(u) ? POS_AFTER_POST : \
+ IS_TELU(u) ? (u <= 0x0C42u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
+ IS_KNDA(u) ? (u < 0x0CC3u || u > 0xCD6u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
+ IS_MLYM(u) ? POS_AFTER_POST : \
+ IS_SINH(u) ? POS_AFTER_SUB : \
+ /*default*/ POS_AFTER_SUB \
+ )
+#define MATRA_POS_TOP(u) ( /* BENG and MLYM don't have top matras. */ \
+ IS_DEVA(u) ? POS_AFTER_SUB : \
+ IS_GURU(u) ? POS_AFTER_POST : /* Deviate from spec */ \
+ IS_GUJR(u) ? POS_AFTER_SUB : \
+ IS_ORYA(u) ? POS_AFTER_MAIN : \
+ IS_TAML(u) ? POS_AFTER_SUB : \
+ IS_TELU(u) ? POS_BEFORE_SUB : \
+ IS_KNDA(u) ? POS_BEFORE_SUB : \
+ IS_SINH(u) ? POS_AFTER_SUB : \
+ /*default*/ POS_AFTER_SUB \
+ )
+#define MATRA_POS_BOTTOM(u) ( \
+ IS_DEVA(u) ? POS_AFTER_SUB : \
+ IS_BENG(u) ? POS_AFTER_SUB : \
+ IS_GURU(u) ? POS_AFTER_POST : \
+ IS_GUJR(u) ? POS_AFTER_POST : \
+ IS_ORYA(u) ? POS_AFTER_SUB : \
+ IS_TAML(u) ? POS_AFTER_POST : \
+ IS_TELU(u) ? POS_BEFORE_SUB : \
+ IS_KNDA(u) ? POS_BEFORE_SUB : \
+ IS_MLYM(u) ? POS_AFTER_POST : \
+ IS_SINH(u) ? POS_AFTER_SUB : \
+ /*default*/ POS_AFTER_SUB \
+ )
+
+static inline indic_position_t
+matra_position_indic (hb_codepoint_t u, indic_position_t side)
+{
+ switch ((int) side)
+ {
+ case POS_PRE_C: return MATRA_POS_LEFT (u);
+ case POS_POST_C: return MATRA_POS_RIGHT (u);
+ case POS_ABOVE_C: return MATRA_POS_TOP (u);
+ case POS_BELOW_C: return MATRA_POS_BOTTOM (u);
+ }
+ return side;
+}
+
+/* XXX
+ * This is a hack for now. We should move this data into the main Indic table.
+ * Or completely remove it and just check in the tables.
+ */
+static const hb_codepoint_t ra_chars[] = {
+ 0x0930u, /* Devanagari */
+ 0x09B0u, /* Bengali */
+ 0x09F0u, /* Bengali */
+ 0x0A30u, /* Gurmukhi */ /* No Reph */
+ 0x0AB0u, /* Gujarati */
+ 0x0B30u, /* Oriya */
+ 0x0BB0u, /* Tamil */ /* No Reph */
+ 0x0C30u, /* Telugu */ /* Reph formed only with ZWJ */
+ 0x0CB0u, /* Kannada */
+ 0x0D30u, /* Malayalam */ /* No Reph, Logical Repha */
+
+ 0x0DBBu, /* Sinhala */ /* Reph formed only with ZWJ */
+
+ 0x179Au, /* Khmer */
+};
+
+static inline bool
+is_ra (hb_codepoint_t u)
+{
+ for (unsigned int i = 0; i < ARRAY_LENGTH (ra_chars); i++)
+ if (u == ra_chars[i])
+ return true;
+ return false;
+}
+
+static inline void
+set_indic_properties (hb_glyph_info_t &info)
+{
+ hb_codepoint_t u = info.codepoint;
+ unsigned int type = hb_indic_get_categories (u);
+ indic_category_t cat = (indic_category_t) (type & 0x7Fu);
+ indic_position_t pos = (indic_position_t) (type >> 8);
+
+
+ /*
+ * Re-assign category
+ */
+
+ /* The following act more like the Bindus. */
+ if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x0953u, 0x0954u)))
+ cat = OT_SM;
+ /* The following act like consonants. */
+ else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x0A72u, 0x0A73u,
+ 0x1CF5u, 0x1CF6u)))
+ cat = OT_C;
+ /* TODO: The following should only be allowed after a Visarga.
+ * For now, just treat them like regular tone marks. */
+ else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x1CE2u, 0x1CE8u)))
+ cat = OT_A;
+ /* TODO: The following should only be allowed after some of
+ * the nasalization marks, maybe only for U+1CE9..U+1CF1.
+ * For now, just treat them like tone marks. */
+ else if (unlikely (u == 0x1CEDu))
+ cat = OT_A;
+ /* The following take marks in standalone clusters, similar to Avagraha. */
+ else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0xA8F2u, 0xA8F7u,
+ 0x1CE9u, 0x1CECu,
+ 0x1CEEu, 0x1CF1u)))
+ {
+ cat = OT_Symbol;
+ static_assert (((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol), "");
+ }
+ else if (unlikely (u == 0x0A51u))
+ {
+ /* https://github.com/harfbuzz/harfbuzz/issues/524 */
+ cat = OT_M;
+ pos = POS_BELOW_C;
+ }
+
+ /* According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil,
+ * so the Indic shaper needs to know their categories. */
+ else if (unlikely (u == 0x11301u || u == 0x11303u)) cat = OT_SM;
+ else if (unlikely (u == 0x1133Bu || u == 0x1133Cu)) cat = OT_N;
+
+ else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */
+
+ else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */
+ else if (unlikely (u == 0x09FCu)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/1613 */
+ else if (unlikely (u == 0x0C80u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/623 */
+ else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u)))
+ cat = OT_PLACEHOLDER;
+ else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
+
+
+ /*
+ * Re-assign position.
+ */
+
+ if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS))
+ {
+ pos = POS_BASE_C;
+ if (is_ra (u))
+ cat = OT_Ra;
+ }
+ else if (cat == OT_M)
+ {
+ pos = matra_position_indic (u, pos);
+ }
+ else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) /* | FLAG (OT_VD) */ | FLAG (OT_A) | FLAG (OT_Symbol))))
+ {
+ pos = POS_SMVD;
+ }
+
+ if (unlikely (u == 0x0B01u)) pos = POS_BEFORE_SUB; /* Oriya Bindu is BeforeSub in the spec. */
+
+
+
+ info.indic_category() = cat;
+ info.indic_position() = pos;
+}
+
+struct hb_indic_would_substitute_feature_t
+{
+ void init (const hb_ot_map_t *map, hb_tag_t feature_tag, bool zero_context_)
+ {
+ zero_context = zero_context_;
+ map->get_stage_lookups (0/*GSUB*/,
+ map->get_feature_stage (0/*GSUB*/, feature_tag),
+ &lookups, &count);
+ }
+
+ bool would_substitute (const hb_codepoint_t *glyphs,
+ unsigned int glyphs_count,
+ hb_face_t *face) const
+ {
+ for (unsigned int i = 0; i < count; i++)
+ if (hb_ot_layout_lookup_would_substitute (face, lookups[i].index, glyphs, glyphs_count, zero_context))
+ return true;
+ return false;
+ }
+
+ private:
+ const hb_ot_map_t::lookup_map_t *lookups;
+ unsigned int count;
+ bool zero_context;
+};
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_INDIC_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer-machine.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer-machine.hh
new file mode 100644
index 0000000000..a040318d34
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer-machine.hh
@@ -0,0 +1,372 @@
+
+#line 1 "hb-ot-shape-complex-khmer-machine.rl"
+/*
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+
+#include "hb.hh"
+
+
+#line 36 "hb-ot-shape-complex-khmer-machine.hh"
+static const unsigned char _khmer_syllable_machine_trans_keys[] = {
+ 5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u,
+ 5u, 26u, 5u, 21u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u,
+ 5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 1u, 29u, 5u, 29u, 5u, 29u, 5u, 29u,
+ 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 26u, 5u, 29u,
+ 5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 29u, 5u, 29u,
+ 0
+};
+
+static const char _khmer_syllable_machine_key_spans[] = {
+ 22, 17, 22, 17, 16, 17, 22, 17,
+ 22, 17, 17, 22, 17, 16, 17, 22,
+ 17, 22, 17, 22, 29, 25, 25, 25,
+ 1, 18, 25, 25, 25, 16, 22, 25,
+ 25, 1, 18, 25, 25, 16, 25, 25
+};
+
+static const short _khmer_syllable_machine_index_offsets[] = {
+ 0, 23, 41, 64, 82, 99, 117, 140,
+ 158, 181, 199, 217, 240, 258, 275, 293,
+ 316, 334, 357, 375, 398, 428, 454, 480,
+ 506, 508, 527, 553, 579, 605, 622, 645,
+ 671, 697, 699, 718, 744, 770, 787, 813
+};
+
+static const char _khmer_syllable_machine_indicies[] = {
+ 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2,
+ 3, 0, 0, 0, 0, 4, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,
+ 0, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 4, 0,
+ 5, 5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 6, 6, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 6, 0, 7, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 8, 0, 9, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 10, 0, 0,
+ 0, 0, 4, 0, 9, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 10, 0, 11, 11,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 12, 0,
+ 0, 0, 0, 4, 0, 11, 11, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 12, 0, 14,
+ 14, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 15,
+ 13, 14, 14, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 15, 16, 16, 16, 16, 17, 16,
+ 18, 18, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 17, 16, 19, 19, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 19, 16, 20, 20, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 21, 16, 22, 22, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 23, 16, 16,
+ 16, 16, 17, 16, 22, 22, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 23, 16, 24, 24,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 25, 16,
+ 16, 16, 16, 17, 16, 24, 24, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 25, 16, 14,
+ 14, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 26, 15,
+ 16, 16, 16, 16, 17, 16, 28, 28,
+ 27, 27, 29, 29, 27, 27, 27, 27,
+ 2, 2, 27, 30, 27, 28, 27, 27,
+ 27, 27, 15, 19, 27, 27, 27, 17,
+ 23, 25, 21, 27, 32, 32, 31, 31,
+ 31, 31, 31, 31, 31, 33, 31, 31,
+ 31, 31, 31, 2, 3, 6, 31, 31,
+ 31, 4, 10, 12, 8, 31, 34, 34,
+ 31, 31, 31, 31, 31, 31, 31, 35,
+ 31, 31, 31, 31, 31, 31, 3, 6,
+ 31, 31, 31, 4, 10, 12, 8, 31,
+ 5, 5, 31, 31, 31, 31, 31, 31,
+ 31, 35, 31, 31, 31, 31, 31, 31,
+ 4, 6, 31, 31, 31, 31, 31, 31,
+ 8, 31, 6, 31, 7, 7, 31, 31,
+ 31, 31, 31, 31, 31, 35, 31, 31,
+ 31, 31, 31, 31, 8, 6, 31, 36,
+ 36, 31, 31, 31, 31, 31, 31, 31,
+ 35, 31, 31, 31, 31, 31, 31, 10,
+ 6, 31, 31, 31, 4, 31, 31, 8,
+ 31, 37, 37, 31, 31, 31, 31, 31,
+ 31, 31, 35, 31, 31, 31, 31, 31,
+ 31, 12, 6, 31, 31, 31, 4, 10,
+ 31, 8, 31, 34, 34, 31, 31, 31,
+ 31, 31, 31, 31, 33, 31, 31, 31,
+ 31, 31, 31, 3, 6, 31, 31, 31,
+ 4, 10, 12, 8, 31, 28, 28, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 28, 31, 14, 14,
+ 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 15, 38,
+ 38, 38, 38, 17, 38, 40, 40, 39,
+ 39, 39, 39, 39, 39, 39, 41, 39,
+ 39, 39, 39, 39, 39, 15, 19, 39,
+ 39, 39, 17, 23, 25, 21, 39, 18,
+ 18, 39, 39, 39, 39, 39, 39, 39,
+ 41, 39, 39, 39, 39, 39, 39, 17,
+ 19, 39, 39, 39, 39, 39, 39, 21,
+ 39, 19, 39, 20, 20, 39, 39, 39,
+ 39, 39, 39, 39, 41, 39, 39, 39,
+ 39, 39, 39, 21, 19, 39, 42, 42,
+ 39, 39, 39, 39, 39, 39, 39, 41,
+ 39, 39, 39, 39, 39, 39, 23, 19,
+ 39, 39, 39, 17, 39, 39, 21, 39,
+ 43, 43, 39, 39, 39, 39, 39, 39,
+ 39, 41, 39, 39, 39, 39, 39, 39,
+ 25, 19, 39, 39, 39, 17, 23, 39,
+ 21, 39, 44, 44, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 44, 39, 45, 45, 39, 39, 39,
+ 39, 39, 39, 39, 30, 39, 39, 39,
+ 39, 39, 26, 15, 19, 39, 39, 39,
+ 17, 23, 25, 21, 39, 40, 40, 39,
+ 39, 39, 39, 39, 39, 39, 30, 39,
+ 39, 39, 39, 39, 39, 15, 19, 39,
+ 39, 39, 17, 23, 25, 21, 39, 0
+};
+
+static const char _khmer_syllable_machine_trans_targs[] = {
+ 20, 1, 28, 22, 23, 3, 24, 5,
+ 25, 7, 26, 9, 27, 20, 10, 31,
+ 20, 32, 12, 33, 14, 34, 16, 35,
+ 18, 36, 39, 20, 21, 30, 37, 20,
+ 0, 29, 2, 4, 6, 8, 20, 20,
+ 11, 13, 15, 17, 38, 19
+};
+
+static const char _khmer_syllable_machine_trans_actions[] = {
+ 1, 0, 2, 2, 2, 0, 0, 0,
+ 2, 0, 2, 0, 2, 3, 0, 4,
+ 5, 2, 0, 0, 0, 2, 0, 2,
+ 0, 2, 4, 8, 2, 9, 0, 10,
+ 0, 0, 0, 0, 0, 0, 11, 12,
+ 0, 0, 0, 0, 4, 0
+};
+
+static const char _khmer_syllable_machine_to_state_actions[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static const char _khmer_syllable_machine_from_state_actions[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static const unsigned char _khmer_syllable_machine_eof_trans[] = {
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 14, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 0, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 39, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40
+};
+
+static const int khmer_syllable_machine_start = 20;
+static const int khmer_syllable_machine_first_final = 20;
+static const int khmer_syllable_machine_error = -1;
+
+static const int khmer_syllable_machine_en_main = 20;
+
+
+#line 36 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+
+#line 80 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+#define found_syllable(syllable_type) \
+ HB_STMT_START { \
+ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+ for (unsigned int i = ts; i < te; i++) \
+ info[i].syllable() = (syllable_serial << 4) | khmer_##syllable_type; \
+ syllable_serial++; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+ } HB_STMT_END
+
+static void
+find_syllables_khmer (hb_buffer_t *buffer)
+{
+ unsigned int p, pe, eof, ts, te, act HB_UNUSED;
+ int cs;
+ hb_glyph_info_t *info = buffer->info;
+
+#line 242 "hb-ot-shape-complex-khmer-machine.hh"
+ {
+ cs = khmer_syllable_machine_start;
+ ts = 0;
+ te = 0;
+ act = 0;
+ }
+
+#line 100 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+ p = 0;
+ pe = eof = buffer->len;
+
+ unsigned int syllable_serial = 1;
+
+#line 258 "hb-ot-shape-complex-khmer-machine.hh"
+ {
+ int _slen;
+ int _trans;
+ const unsigned char *_keys;
+ const char *_inds;
+ if ( p == pe )
+ goto _test_eof;
+_resume:
+ switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
+ case 7:
+#line 1 "NONE"
+ {ts = p;}
+ break;
+#line 272 "hb-ot-shape-complex-khmer-machine.hh"
+ }
+
+ _keys = _khmer_syllable_machine_trans_keys + (cs<<1);
+ _inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs];
+
+ _slen = _khmer_syllable_machine_key_spans[cs];
+ _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].khmer_category()) &&
+ ( info[p].khmer_category()) <= _keys[1] ?
+ ( info[p].khmer_category()) - _keys[0] : _slen ];
+
+_eof_trans:
+ cs = _khmer_syllable_machine_trans_targs[_trans];
+
+ if ( _khmer_syllable_machine_trans_actions[_trans] == 0 )
+ goto _again;
+
+ switch ( _khmer_syllable_machine_trans_actions[_trans] ) {
+ case 2:
+#line 1 "NONE"
+ {te = p+1;}
+ break;
+ case 8:
+#line 76 "hb-ot-shape-complex-khmer-machine.rl"
+ {te = p+1;{ found_syllable (non_khmer_cluster); }}
+ break;
+ case 10:
+#line 74 "hb-ot-shape-complex-khmer-machine.rl"
+ {te = p;p--;{ found_syllable (consonant_syllable); }}
+ break;
+ case 12:
+#line 75 "hb-ot-shape-complex-khmer-machine.rl"
+ {te = p;p--;{ found_syllable (broken_cluster); }}
+ break;
+ case 11:
+#line 76 "hb-ot-shape-complex-khmer-machine.rl"
+ {te = p;p--;{ found_syllable (non_khmer_cluster); }}
+ break;
+ case 1:
+#line 74 "hb-ot-shape-complex-khmer-machine.rl"
+ {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
+ break;
+ case 5:
+#line 75 "hb-ot-shape-complex-khmer-machine.rl"
+ {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
+ break;
+ case 3:
+#line 1 "NONE"
+ { switch( act ) {
+ case 2:
+ {{p = ((te))-1;} found_syllable (broken_cluster); }
+ break;
+ case 3:
+ {{p = ((te))-1;} found_syllable (non_khmer_cluster); }
+ break;
+ }
+ }
+ break;
+ case 4:
+#line 1 "NONE"
+ {te = p+1;}
+#line 75 "hb-ot-shape-complex-khmer-machine.rl"
+ {act = 2;}
+ break;
+ case 9:
+#line 1 "NONE"
+ {te = p+1;}
+#line 76 "hb-ot-shape-complex-khmer-machine.rl"
+ {act = 3;}
+ break;
+#line 342 "hb-ot-shape-complex-khmer-machine.hh"
+ }
+
+_again:
+ switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
+ case 6:
+#line 1 "NONE"
+ {ts = 0;}
+ break;
+#line 351 "hb-ot-shape-complex-khmer-machine.hh"
+ }
+
+ if ( ++p != pe )
+ goto _resume;
+ _test_eof: {}
+ if ( p == eof )
+ {
+ if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
+ _trans = _khmer_syllable_machine_eof_trans[cs] - 1;
+ goto _eof_trans;
+ }
+ }
+
+ }
+
+#line 108 "hb-ot-shape-complex-khmer-machine.rl"
+
+}
+
+#undef found_syllable
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer-machine.rl b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer-machine.rl
new file mode 100644
index 0000000000..e7f14533dd
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer-machine.rl
@@ -0,0 +1,113 @@
+/*
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+
+#include "hb.hh"
+
+%%{
+ machine khmer_syllable_machine;
+ alphtype unsigned char;
+ write data;
+}%%
+
+%%{
+
+# Same order as enum khmer_category_t. Not sure how to avoid duplication.
+C = 1;
+V = 2;
+ZWNJ = 5;
+ZWJ = 6;
+PLACEHOLDER = 11;
+DOTTEDCIRCLE = 12;
+Coeng= 14;
+Ra = 16;
+Robatic = 20;
+Xgroup = 21;
+Ygroup = 22;
+VAbv = 26;
+VBlw = 27;
+VPre = 28;
+VPst = 29;
+
+c = (C | Ra | V);
+cn = c.((ZWJ|ZWNJ)?.Robatic)?;
+joiner = (ZWJ | ZWNJ);
+xgroup = (joiner*.Xgroup)*;
+ygroup = Ygroup*;
+
+# This grammar was experimentally extracted from what Uniscribe allows.
+
+matra_group = VPre? xgroup VBlw? xgroup (joiner?.VAbv)? xgroup VPst?;
+syllable_tail = xgroup matra_group xgroup (Coeng.c)? ygroup;
+
+
+broken_cluster = (Coeng.cn)* (Coeng | syllable_tail);
+consonant_syllable = (cn|PLACEHOLDER|DOTTEDCIRCLE) broken_cluster;
+other = any;
+
+main := |*
+ consonant_syllable => { found_syllable (consonant_syllable); };
+ broken_cluster => { found_syllable (broken_cluster); };
+ other => { found_syllable (non_khmer_cluster); };
+*|;
+
+
+}%%
+
+#define found_syllable(syllable_type) \
+ HB_STMT_START { \
+ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+ for (unsigned int i = ts; i < te; i++) \
+ info[i].syllable() = (syllable_serial << 4) | khmer_##syllable_type; \
+ syllable_serial++; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+ } HB_STMT_END
+
+static void
+find_syllables_khmer (hb_buffer_t *buffer)
+{
+ unsigned int p, pe, eof, ts, te, act HB_UNUSED;
+ int cs;
+ hb_glyph_info_t *info = buffer->info;
+ %%{
+ write init;
+ getkey info[p].khmer_category();
+ }%%
+
+ p = 0;
+ pe = eof = buffer->len;
+
+ unsigned int syllable_serial = 1;
+ %%{
+ write exec;
+ }%%
+}
+
+#undef found_syllable
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer.cc
new file mode 100644
index 0000000000..fd8a9be978
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer.cc
@@ -0,0 +1,461 @@
+/*
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex-khmer.hh"
+#include "hb-ot-layout.hh"
+
+
+/*
+ * Khmer shaper.
+ */
+
+static const hb_ot_map_feature_t
+khmer_features[] =
+{
+ /*
+ * Basic features.
+ * These features are applied in order, one at a time, after reordering.
+ */
+ {HB_TAG('p','r','e','f'), F_MANUAL_JOINERS},
+ {HB_TAG('b','l','w','f'), F_MANUAL_JOINERS},
+ {HB_TAG('a','b','v','f'), F_MANUAL_JOINERS},
+ {HB_TAG('p','s','t','f'), F_MANUAL_JOINERS},
+ {HB_TAG('c','f','a','r'), F_MANUAL_JOINERS},
+ /*
+ * Other features.
+ * These features are applied all at once after clearing syllables.
+ */
+ {HB_TAG('p','r','e','s'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('a','b','v','s'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('b','l','w','s'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('p','s','t','s'), F_GLOBAL_MANUAL_JOINERS},
+};
+
+/*
+ * Must be in the same order as the khmer_features array.
+ */
+enum {
+ KHMER_PREF,
+ KHMER_BLWF,
+ KHMER_ABVF,
+ KHMER_PSTF,
+ KHMER_CFAR,
+
+ _KHMER_PRES,
+ _KHMER_ABVS,
+ _KHMER_BLWS,
+ _KHMER_PSTS,
+
+ KHMER_NUM_FEATURES,
+ KHMER_BASIC_FEATURES = _KHMER_PRES, /* Don't forget to update this! */
+};
+
+static void
+setup_syllables_khmer (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+static void
+reorder_khmer (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
+static void
+collect_features_khmer (hb_ot_shape_planner_t *plan)
+{
+ hb_ot_map_builder_t *map = &plan->map;
+
+ /* Do this before any lookups have been applied. */
+ map->add_gsub_pause (setup_syllables_khmer);
+ map->add_gsub_pause (reorder_khmer);
+
+ /* Testing suggests that Uniscribe does NOT pause between basic
+ * features. Test with KhmerUI.ttf and the following three
+ * sequences:
+ *
+ * U+1789,U+17BC
+ * U+1789,U+17D2,U+1789
+ * U+1789,U+17D2,U+1789,U+17BC
+ *
+ * https://github.com/harfbuzz/harfbuzz/issues/974
+ */
+ map->enable_feature (HB_TAG('l','o','c','l'));
+ map->enable_feature (HB_TAG('c','c','m','p'));
+
+ unsigned int i = 0;
+ for (; i < KHMER_BASIC_FEATURES; i++)
+ map->add_feature (khmer_features[i]);
+
+ map->add_gsub_pause (_hb_clear_syllables);
+
+ for (; i < KHMER_NUM_FEATURES; i++)
+ map->add_feature (khmer_features[i]);
+}
+
+static void
+override_features_khmer (hb_ot_shape_planner_t *plan)
+{
+ hb_ot_map_builder_t *map = &plan->map;
+
+ /* Khmer spec has 'clig' as part of required shaping features:
+ * "Apply feature 'clig' to form ligatures that are desired for
+ * typographical correctness.", hence in overrides... */
+ map->enable_feature (HB_TAG('c','l','i','g'));
+
+ /* Uniscribe does not apply 'kern' in Khmer. */
+ if (hb_options ().uniscribe_bug_compatible)
+ {
+ map->disable_feature (HB_TAG('k','e','r','n'));
+ }
+
+ map->disable_feature (HB_TAG('l','i','g','a'));
+}
+
+
+struct khmer_shape_plan_t
+{
+ bool get_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const
+ {
+ hb_codepoint_t glyph = virama_glyph;
+ if (unlikely (virama_glyph == (hb_codepoint_t) -1))
+ {
+ if (!font->get_nominal_glyph (0x17D2u, &glyph))
+ glyph = 0;
+ /* Technically speaking, the spec says we should apply 'locl' to virama too.
+ * Maybe one day... */
+
+ /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
+ * during shape planning... Instead, overwrite it here. It's safe. Don't worry! */
+ virama_glyph = glyph;
+ }
+
+ *pglyph = glyph;
+ return glyph != 0;
+ }
+
+ mutable hb_codepoint_t virama_glyph;
+
+ hb_indic_would_substitute_feature_t pref;
+
+ hb_mask_t mask_array[KHMER_NUM_FEATURES];
+};
+
+static void *
+data_create_khmer (const hb_ot_shape_plan_t *plan)
+{
+ khmer_shape_plan_t *khmer_plan = (khmer_shape_plan_t *) calloc (1, sizeof (khmer_shape_plan_t));
+ if (unlikely (!khmer_plan))
+ return nullptr;
+
+ khmer_plan->virama_glyph = (hb_codepoint_t) -1;
+
+ khmer_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), true);
+
+ for (unsigned int i = 0; i < ARRAY_LENGTH (khmer_plan->mask_array); i++)
+ khmer_plan->mask_array[i] = (khmer_features[i].flags & F_GLOBAL) ?
+ 0 : plan->map.get_1_mask (khmer_features[i].tag);
+
+ return khmer_plan;
+}
+
+static void
+data_destroy_khmer (void *data)
+{
+ free (data);
+}
+
+
+enum khmer_syllable_type_t {
+ khmer_consonant_syllable,
+ khmer_broken_cluster,
+ khmer_non_khmer_cluster,
+};
+
+#include "hb-ot-shape-complex-khmer-machine.hh"
+
+static void
+setup_masks_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_buffer_t *buffer,
+ hb_font_t *font HB_UNUSED)
+{
+ HB_BUFFER_ALLOCATE_VAR (buffer, khmer_category);
+
+ /* We cannot setup masks here. We save information about characters
+ * and setup masks later on in a pause-callback. */
+
+ unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
+ for (unsigned int i = 0; i < count; i++)
+ set_khmer_properties (info[i]);
+}
+
+static void
+setup_syllables_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font HB_UNUSED,
+ hb_buffer_t *buffer)
+{
+ find_syllables_khmer (buffer);
+ foreach_syllable (buffer, start, end)
+ buffer->unsafe_to_break (start, end);
+}
+
+
+/* Rules from:
+ * https://docs.microsoft.com/en-us/typography/script-development/devanagari */
+
+static void
+reorder_consonant_syllable (const hb_ot_shape_plan_t *plan,
+ hb_face_t *face HB_UNUSED,
+ hb_buffer_t *buffer,
+ unsigned int start, unsigned int end)
+{
+ const khmer_shape_plan_t *khmer_plan = (const khmer_shape_plan_t *) plan->data;
+ hb_glyph_info_t *info = buffer->info;
+
+ /* Setup masks. */
+ {
+ /* Post-base */
+ hb_mask_t mask = khmer_plan->mask_array[KHMER_BLWF] |
+ khmer_plan->mask_array[KHMER_ABVF] |
+ khmer_plan->mask_array[KHMER_PSTF];
+ for (unsigned int i = start + 1; i < end; i++)
+ info[i].mask |= mask;
+ }
+
+ unsigned int num_coengs = 0;
+ for (unsigned int i = start + 1; i < end; i++)
+ {
+ /* """
+ * When a COENG + (Cons | IndV) combination are found (and subscript count
+ * is less than two) the character combination is handled according to the
+ * subscript type of the character following the COENG.
+ *
+ * ...
+ *
+ * Subscript Type 2 - The COENG + RO characters are reordered to immediately
+ * before the base glyph. Then the COENG + RO characters are assigned to have
+ * the 'pref' OpenType feature applied to them.
+ * """
+ */
+ if (info[i].khmer_category() == OT_Coeng && num_coengs <= 2 && i + 1 < end)
+ {
+ num_coengs++;
+
+ if (info[i + 1].khmer_category() == OT_Ra)
+ {
+ for (unsigned int j = 0; j < 2; j++)
+ info[i + j].mask |= khmer_plan->mask_array[KHMER_PREF];
+
+ /* Move the Coeng,Ro sequence to the start. */
+ buffer->merge_clusters (start, i + 2);
+ hb_glyph_info_t t0 = info[i];
+ hb_glyph_info_t t1 = info[i + 1];
+ memmove (&info[start + 2], &info[start], (i - start) * sizeof (info[0]));
+ info[start] = t0;
+ info[start + 1] = t1;
+
+ /* Mark the subsequent stuff with 'cfar'. Used in Khmer.
+ * Read the feature spec.
+ * This allows distinguishing the following cases with MS Khmer fonts:
+ * U+1784,U+17D2,U+179A,U+17D2,U+1782
+ * U+1784,U+17D2,U+1782,U+17D2,U+179A
+ */
+ if (khmer_plan->mask_array[KHMER_CFAR])
+ for (unsigned int j = i + 2; j < end; j++)
+ info[j].mask |= khmer_plan->mask_array[KHMER_CFAR];
+
+ num_coengs = 2; /* Done. */
+ }
+ }
+
+ /* Reorder left matra piece. */
+ else if (info[i].khmer_category() == OT_VPre)
+ {
+ /* Move to the start. */
+ buffer->merge_clusters (start, i + 1);
+ hb_glyph_info_t t = info[i];
+ memmove (&info[start + 1], &info[start], (i - start) * sizeof (info[0]));
+ info[start] = t;
+ }
+ }
+}
+
+static void
+reorder_syllable_khmer (const hb_ot_shape_plan_t *plan,
+ hb_face_t *face,
+ hb_buffer_t *buffer,
+ unsigned int start, unsigned int end)
+{
+ khmer_syllable_type_t syllable_type = (khmer_syllable_type_t) (buffer->info[start].syllable() & 0x0F);
+ switch (syllable_type)
+ {
+ case khmer_broken_cluster: /* We already inserted dotted-circles, so just call the consonant_syllable. */
+ case khmer_consonant_syllable:
+ reorder_consonant_syllable (plan, face, buffer, start, end);
+ break;
+
+ case khmer_non_khmer_cluster:
+ break;
+ }
+}
+
+static inline void
+insert_dotted_circles_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
+{
+ if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
+ return;
+
+ /* Note: This loop is extra overhead, but should not be measurable.
+ * TODO Use a buffer scratch flag to remove the loop. */
+ bool has_broken_syllables = false;
+ unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
+ for (unsigned int i = 0; i < count; i++)
+ if ((info[i].syllable() & 0x0F) == khmer_broken_cluster)
+ {
+ has_broken_syllables = true;
+ break;
+ }
+ if (likely (!has_broken_syllables))
+ return;
+
+
+ hb_codepoint_t dottedcircle_glyph;
+ if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
+ return;
+
+ hb_glyph_info_t dottedcircle = {0};
+ dottedcircle.codepoint = 0x25CCu;
+ set_khmer_properties (dottedcircle);
+ dottedcircle.codepoint = dottedcircle_glyph;
+
+ buffer->clear_output ();
+
+ buffer->idx = 0;
+ unsigned int last_syllable = 0;
+ while (buffer->idx < buffer->len && buffer->successful)
+ {
+ unsigned int syllable = buffer->cur().syllable();
+ khmer_syllable_type_t syllable_type = (khmer_syllable_type_t) (syllable & 0x0F);
+ if (unlikely (last_syllable != syllable && syllable_type == khmer_broken_cluster))
+ {
+ last_syllable = syllable;
+
+ hb_glyph_info_t ginfo = dottedcircle;
+ ginfo.cluster = buffer->cur().cluster;
+ ginfo.mask = buffer->cur().mask;
+ ginfo.syllable() = buffer->cur().syllable();
+
+ /* Insert dottedcircle after possible Repha. */
+ while (buffer->idx < buffer->len && buffer->successful &&
+ last_syllable == buffer->cur().syllable() &&
+ buffer->cur().khmer_category() == OT_Repha)
+ buffer->next_glyph ();
+
+ buffer->output_info (ginfo);
+ }
+ else
+ buffer->next_glyph ();
+ }
+ buffer->swap_buffers ();
+}
+
+static void
+reorder_khmer (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
+{
+ insert_dotted_circles_khmer (plan, font, buffer);
+
+ foreach_syllable (buffer, start, end)
+ reorder_syllable_khmer (plan, font->face, buffer, start, end);
+
+ HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category);
+}
+
+
+static bool
+decompose_khmer (const hb_ot_shape_normalize_context_t *c,
+ hb_codepoint_t ab,
+ hb_codepoint_t *a,
+ hb_codepoint_t *b)
+{
+ switch (ab)
+ {
+ /*
+ * Decompose split matras that don't have Unicode decompositions.
+ */
+
+ /* Khmer */
+ case 0x17BEu : *a = 0x17C1u; *b= 0x17BEu; return true;
+ case 0x17BFu : *a = 0x17C1u; *b= 0x17BFu; return true;
+ case 0x17C0u : *a = 0x17C1u; *b= 0x17C0u; return true;
+ case 0x17C4u : *a = 0x17C1u; *b= 0x17C4u; return true;
+ case 0x17C5u : *a = 0x17C1u; *b= 0x17C5u; return true;
+ }
+
+ return (bool) c->unicode->decompose (ab, a, b);
+}
+
+static bool
+compose_khmer (const hb_ot_shape_normalize_context_t *c,
+ hb_codepoint_t a,
+ hb_codepoint_t b,
+ hb_codepoint_t *ab)
+{
+ /* Avoid recomposing split matras. */
+ if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (c->unicode->general_category (a)))
+ return false;
+
+ return (bool) c->unicode->compose (a, b, ab);
+}
+
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_khmer =
+{
+ collect_features_khmer,
+ override_features_khmer,
+ data_create_khmer,
+ data_destroy_khmer,
+ nullptr, /* preprocess_text */
+ nullptr, /* postprocess_glyphs */
+ HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
+ decompose_khmer,
+ compose_khmer,
+ setup_masks_khmer,
+ HB_TAG_NONE, /* gpos_tag */
+ nullptr, /* reorder_marks */
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+ false, /* fallback_position */
+};
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer.hh
new file mode 100644
index 0000000000..11a77bfd4b
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-khmer.hh
@@ -0,0 +1,113 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_KHMER_HH
+#define HB_OT_SHAPE_COMPLEX_KHMER_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex-indic.hh"
+
+
+/* buffer var allocations */
+#define khmer_category() indic_category() /* khmer_category_t */
+
+
+/* Note: This enum is duplicated in the -machine.rl source file.
+ * Not sure how to avoid duplication. */
+enum khmer_category_t
+{
+ OT_Robatic = 20,
+ OT_Xgroup = 21,
+ OT_Ygroup = 22,
+ //OT_VAbv = 26,
+ //OT_VBlw = 27,
+ //OT_VPre = 28,
+ //OT_VPst = 29,
+};
+
+static inline void
+set_khmer_properties (hb_glyph_info_t &info)
+{
+ hb_codepoint_t u = info.codepoint;
+ unsigned int type = hb_indic_get_categories (u);
+ khmer_category_t cat = (khmer_category_t) (type & 0x7Fu);
+ indic_position_t pos = (indic_position_t) (type >> 8);
+
+
+ /*
+ * Re-assign category
+ *
+ * These categories are experimentally extracted from what Uniscribe allows.
+ */
+ switch (u)
+ {
+ case 0x179Au:
+ cat = (khmer_category_t) OT_Ra;
+ break;
+
+ case 0x17CCu:
+ case 0x17C9u:
+ case 0x17CAu:
+ cat = OT_Robatic;
+ break;
+
+ case 0x17C6u:
+ case 0x17CBu:
+ case 0x17CDu:
+ case 0x17CEu:
+ case 0x17CFu:
+ case 0x17D0u:
+ case 0x17D1u:
+ cat = OT_Xgroup;
+ break;
+
+ case 0x17C7u:
+ case 0x17C8u:
+ case 0x17DDu:
+ case 0x17D3u: /* Just guessing. Uniscribe doesn't categorize it. */
+ cat = OT_Ygroup;
+ break;
+ }
+
+ /*
+ * Re-assign position.
+ */
+ if (cat == (khmer_category_t) OT_M)
+ switch ((int) pos)
+ {
+ case POS_PRE_C: cat = (khmer_category_t) OT_VPre; break;
+ case POS_BELOW_C: cat = (khmer_category_t) OT_VBlw; break;
+ case POS_ABOVE_C: cat = (khmer_category_t) OT_VAbv; break;
+ case POS_POST_C: cat = (khmer_category_t) OT_VPst; break;
+ default: assert (0);
+ }
+
+ info.khmer_category() = cat;
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh
index ed87404305..c2f4c0045c 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh
@@ -29,35 +29,38 @@
#ifndef HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
#define HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
-#include "hb-private.hh"
+#include "hb.hh"
#line 36 "hb-ot-shape-complex-myanmar-machine.hh"
static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
1u, 32u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u,
3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u,
- 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, 5u, 8u,
- 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u,
- 3u, 30u, 3u, 29u, 1u, 32u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u,
- 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 32u, 8u, 8u, 0
+ 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u,
+ 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u,
+ 3u, 29u, 3u, 29u, 1u, 16u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u,
+ 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u,
+ 3u, 29u, 1u, 32u, 1u, 32u, 8u, 8u, 0
};
static const char _myanmar_syllable_machine_key_spans[] = {
32, 28, 25, 4, 25, 23, 21, 21,
27, 27, 27, 27, 16, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 25, 4,
- 25, 23, 21, 21, 27, 27, 27, 27,
- 28, 27, 32, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 32, 1
+ 27, 27, 28, 27, 27, 27, 27, 27,
+ 25, 4, 25, 23, 21, 21, 27, 27,
+ 27, 27, 16, 28, 27, 27, 27, 27,
+ 27, 28, 27, 27, 27, 27, 27, 28,
+ 27, 32, 32, 1
};
static const short _myanmar_syllable_machine_index_offsets[] = {
0, 33, 62, 88, 93, 119, 143, 165,
187, 215, 243, 271, 299, 316, 344, 372,
- 400, 428, 456, 484, 512, 540, 568, 594,
- 599, 625, 649, 671, 693, 721, 749, 777,
- 805, 834, 862, 895, 923, 951, 979, 1007,
- 1035, 1063, 1091, 1119, 1147, 1180
+ 400, 428, 456, 485, 513, 541, 569, 597,
+ 625, 651, 656, 682, 706, 728, 750, 778,
+ 806, 834, 862, 879, 908, 936, 964, 992,
+ 1020, 1048, 1077, 1105, 1133, 1161, 1189, 1217,
+ 1246, 1274, 1307, 1340
};
static const char _myanmar_syllable_machine_indicies[] = {
@@ -105,7 +108,7 @@ static const char _myanmar_syllable_machine_indicies[] = {
21, 21, 21, 27, 21, 21, 28, 29,
30, 31, 32, 33, 34, 35, 36, 21,
22, 21, 24, 24, 21, 25, 21, 26,
- 21, 21, 21, 21, 21, 21, 21, 35,
+ 21, 21, 21, 21, 21, 21, 21, 43,
21, 21, 21, 21, 21, 21, 32, 33,
34, 35, 36, 21, 22, 21, 24, 24,
21, 25, 21, 26, 21, 21, 21, 21,
@@ -119,116 +122,138 @@ static const char _myanmar_syllable_machine_indicies[] = {
21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 32, 21, 34, 21, 36, 21,
22, 21, 24, 24, 21, 25, 21, 26,
- 21, 21, 21, 21, 21, 21, 21, 35,
- 21, 21, 28, 21, 30, 21, 32, 33,
- 34, 35, 36, 21, 22, 21, 24, 24,
- 21, 25, 21, 26, 21, 21, 21, 21,
- 21, 21, 21, 35, 21, 21, 28, 21,
- 21, 21, 32, 33, 34, 35, 36, 21,
- 22, 21, 24, 24, 21, 25, 21, 26,
- 21, 21, 21, 21, 21, 21, 21, 35,
- 21, 21, 28, 29, 30, 21, 32, 33,
- 34, 35, 36, 21, 22, 23, 24, 24,
- 21, 25, 21, 26, 21, 21, 21, 21,
- 21, 21, 21, 27, 21, 21, 28, 29,
- 30, 31, 32, 33, 34, 35, 36, 21,
- 3, 3, 43, 5, 43, 43, 43, 43,
- 43, 43, 43, 43, 43, 44, 43, 43,
- 43, 43, 43, 43, 14, 43, 43, 43,
- 18, 43, 3, 3, 43, 5, 43, 3,
- 3, 43, 5, 43, 43, 43, 43, 43,
- 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 43, 43, 14, 43, 43, 43, 18,
- 43, 45, 43, 3, 3, 43, 5, 43,
- 14, 43, 43, 43, 43, 43, 43, 43,
- 46, 43, 43, 43, 43, 43, 43, 14,
- 43, 3, 3, 43, 5, 43, 43, 43,
- 43, 43, 43, 43, 43, 43, 46, 43,
- 43, 43, 43, 43, 43, 14, 43, 3,
- 3, 43, 5, 43, 43, 43, 43, 43,
- 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 43, 43, 14, 43, 2, 43, 3,
- 3, 43, 5, 43, 6, 43, 43, 43,
- 43, 43, 43, 43, 47, 43, 43, 47,
- 43, 43, 43, 14, 48, 43, 43, 18,
- 43, 2, 43, 3, 3, 43, 5, 43,
- 6, 43, 43, 43, 43, 43, 43, 43,
- 43, 43, 43, 43, 43, 43, 43, 14,
- 43, 43, 43, 18, 43, 2, 43, 3,
- 3, 43, 5, 43, 6, 43, 43, 43,
- 43, 43, 43, 43, 47, 43, 43, 43,
- 43, 43, 43, 14, 48, 43, 43, 18,
- 43, 2, 43, 3, 3, 43, 5, 43,
- 6, 43, 43, 43, 43, 43, 43, 43,
- 43, 43, 43, 43, 43, 43, 43, 14,
- 48, 43, 43, 18, 43, 22, 23, 24,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 32, 33,
+ 34, 35, 36, 43, 21, 22, 21, 24,
+ 24, 21, 25, 21, 26, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 28,
+ 21, 30, 21, 32, 33, 34, 35, 36,
+ 21, 22, 21, 24, 24, 21, 25, 21,
+ 26, 21, 21, 21, 21, 21, 21, 21,
+ 43, 21, 21, 28, 21, 21, 21, 32,
+ 33, 34, 35, 36, 21, 22, 21, 24,
24, 21, 25, 21, 26, 21, 21, 21,
- 21, 21, 21, 21, 49, 21, 21, 28,
+ 21, 21, 21, 21, 44, 21, 21, 28,
+ 29, 30, 21, 32, 33, 34, 35, 36,
+ 21, 22, 21, 24, 24, 21, 25, 21,
+ 26, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 28, 29, 30, 21, 32,
+ 33, 34, 35, 36, 21, 22, 23, 24,
+ 24, 21, 25, 21, 26, 21, 21, 21,
+ 21, 21, 21, 21, 27, 21, 21, 28,
29, 30, 31, 32, 33, 34, 35, 36,
- 37, 21, 22, 50, 24, 24, 21, 25,
- 21, 26, 21, 21, 21, 21, 21, 21,
- 21, 27, 21, 21, 28, 29, 30, 31,
- 32, 33, 34, 35, 36, 21, 1, 1,
- 2, 3, 3, 3, 43, 5, 43, 6,
- 1, 43, 43, 43, 43, 1, 43, 8,
- 43, 43, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 43, 1, 43, 2,
- 43, 3, 3, 43, 5, 43, 6, 43,
- 43, 43, 43, 43, 43, 43, 8, 43,
- 43, 10, 11, 12, 13, 14, 15, 16,
- 17, 18, 43, 2, 43, 3, 3, 43,
- 5, 43, 6, 43, 43, 43, 43, 43,
- 43, 43, 17, 43, 43, 43, 43, 43,
- 43, 14, 15, 16, 17, 18, 43, 2,
- 43, 3, 3, 43, 5, 43, 6, 43,
- 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 43, 43, 43, 43, 14, 15, 16,
- 17, 18, 43, 2, 43, 3, 3, 43,
- 5, 43, 6, 43, 43, 43, 43, 43,
- 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 14, 15, 16, 43, 18, 43, 2,
- 43, 3, 3, 43, 5, 43, 6, 43,
- 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 43, 43, 43, 43, 14, 43, 16,
- 43, 18, 43, 2, 43, 3, 3, 43,
- 5, 43, 6, 43, 43, 43, 43, 43,
- 43, 43, 17, 43, 43, 10, 43, 12,
- 43, 14, 15, 16, 17, 18, 43, 2,
- 43, 3, 3, 43, 5, 43, 6, 43,
- 43, 43, 43, 43, 43, 43, 17, 43,
- 43, 10, 43, 43, 43, 14, 15, 16,
- 17, 18, 43, 2, 43, 3, 3, 43,
- 5, 43, 6, 43, 43, 43, 43, 43,
- 43, 43, 17, 43, 43, 10, 11, 12,
- 43, 14, 15, 16, 17, 18, 43, 2,
- 3, 3, 3, 43, 5, 43, 6, 43,
- 43, 43, 43, 43, 43, 43, 8, 43,
- 43, 10, 11, 12, 13, 14, 15, 16,
- 17, 18, 43, 1, 1, 51, 51, 51,
- 51, 51, 51, 51, 51, 1, 51, 51,
- 51, 51, 1, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 1, 51, 52, 51, 0
+ 21, 46, 46, 45, 5, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 47, 45,
+ 45, 45, 45, 45, 45, 14, 45, 45,
+ 45, 18, 45, 46, 46, 45, 5, 45,
+ 46, 46, 45, 5, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 14, 45, 45, 45,
+ 18, 45, 48, 45, 46, 46, 45, 5,
+ 45, 14, 45, 45, 45, 45, 45, 45,
+ 45, 49, 45, 45, 45, 45, 45, 45,
+ 14, 45, 46, 46, 45, 5, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 49,
+ 45, 45, 45, 45, 45, 45, 14, 45,
+ 46, 46, 45, 5, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 14, 45, 2, 45,
+ 46, 46, 45, 5, 45, 6, 45, 45,
+ 45, 45, 45, 45, 45, 50, 45, 45,
+ 50, 45, 45, 45, 14, 51, 45, 45,
+ 18, 45, 2, 45, 46, 46, 45, 5,
+ 45, 6, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 14, 45, 45, 45, 18, 45, 2, 45,
+ 46, 46, 45, 5, 45, 6, 45, 45,
+ 45, 45, 45, 45, 45, 50, 45, 45,
+ 45, 45, 45, 45, 14, 51, 45, 45,
+ 18, 45, 2, 45, 46, 46, 45, 5,
+ 45, 6, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 14, 51, 45, 45, 18, 45, 52, 52,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 52, 45, 2,
+ 3, 46, 46, 45, 5, 45, 6, 45,
+ 45, 45, 45, 45, 45, 45, 8, 45,
+ 45, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 45, 2, 45, 46, 46,
+ 45, 5, 45, 6, 45, 45, 45, 45,
+ 45, 45, 45, 8, 45, 45, 10, 11,
+ 12, 13, 14, 15, 16, 17, 18, 45,
+ 2, 45, 46, 46, 45, 5, 45, 6,
+ 45, 45, 45, 45, 45, 45, 45, 53,
+ 45, 45, 45, 45, 45, 45, 14, 15,
+ 16, 17, 18, 45, 2, 45, 46, 46,
+ 45, 5, 45, 6, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 14, 15, 16, 17, 18, 45,
+ 2, 45, 46, 46, 45, 5, 45, 6,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 14, 15,
+ 16, 45, 18, 45, 2, 45, 46, 46,
+ 45, 5, 45, 6, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 14, 45, 16, 45, 18, 45,
+ 2, 45, 46, 46, 45, 5, 45, 6,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 14, 15,
+ 16, 17, 18, 53, 45, 2, 45, 46,
+ 46, 45, 5, 45, 6, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 10,
+ 45, 12, 45, 14, 15, 16, 17, 18,
+ 45, 2, 45, 46, 46, 45, 5, 45,
+ 6, 45, 45, 45, 45, 45, 45, 45,
+ 53, 45, 45, 10, 45, 45, 45, 14,
+ 15, 16, 17, 18, 45, 2, 45, 46,
+ 46, 45, 5, 45, 6, 45, 45, 45,
+ 45, 45, 45, 45, 54, 45, 45, 10,
+ 11, 12, 45, 14, 15, 16, 17, 18,
+ 45, 2, 45, 46, 46, 45, 5, 45,
+ 6, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 10, 11, 12, 45, 14,
+ 15, 16, 17, 18, 45, 2, 3, 46,
+ 46, 45, 5, 45, 6, 45, 45, 45,
+ 45, 45, 45, 45, 8, 45, 45, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18,
+ 45, 22, 23, 24, 24, 21, 25, 21,
+ 26, 21, 21, 21, 21, 21, 21, 21,
+ 55, 21, 21, 28, 29, 30, 31, 32,
+ 33, 34, 35, 36, 37, 21, 22, 56,
+ 24, 24, 21, 25, 21, 26, 21, 21,
+ 21, 21, 21, 21, 21, 27, 21, 21,
+ 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 21, 1, 1, 2, 3, 46, 46,
+ 45, 5, 45, 6, 1, 45, 45, 45,
+ 45, 1, 45, 8, 45, 45, 10, 11,
+ 12, 13, 14, 15, 16, 17, 18, 19,
+ 45, 1, 45, 1, 1, 57, 57, 57,
+ 57, 57, 57, 57, 57, 1, 57, 57,
+ 57, 57, 1, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 1, 57, 58, 57, 0
};
static const char _myanmar_syllable_machine_trans_targs[] = {
- 0, 1, 22, 0, 0, 23, 29, 32,
- 35, 44, 36, 40, 41, 42, 25, 38,
- 39, 37, 28, 43, 45, 0, 2, 12,
- 0, 3, 9, 13, 14, 18, 19, 20,
- 5, 16, 17, 15, 8, 21, 4, 6,
- 7, 10, 11, 0, 24, 26, 27, 30,
- 31, 33, 34, 0, 0
+ 0, 1, 24, 34, 0, 25, 31, 47,
+ 36, 50, 37, 42, 43, 44, 27, 39,
+ 40, 41, 30, 46, 51, 0, 2, 12,
+ 0, 3, 9, 13, 14, 19, 20, 21,
+ 5, 16, 17, 18, 8, 23, 4, 6,
+ 7, 10, 11, 15, 22, 0, 0, 26,
+ 28, 29, 32, 33, 35, 38, 45, 48,
+ 49, 0, 0
};
static const char _myanmar_syllable_machine_trans_actions[] = {
- 3, 0, 0, 4, 5, 0, 0, 0,
+ 3, 0, 0, 0, 4, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 6, 0, 0,
- 7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 5, 0, 0,
+ 6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 8, 0, 0, 0, 0,
- 0, 0, 0, 9, 10
+ 0, 0, 0, 0, 0, 7, 8, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9, 10
};
static const char _myanmar_syllable_machine_to_state_actions[] = {
@@ -237,7 +262,8 @@ static const char _myanmar_syllable_machine_to_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0
};
static const char _myanmar_syllable_machine_from_state_actions[] = {
@@ -246,16 +272,18 @@ static const char _myanmar_syllable_machine_from_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0
};
static const short _myanmar_syllable_machine_eof_trans[] = {
0, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44,
- 22, 22, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 52, 52
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 22,
+ 22, 46, 58, 58
};
static const int myanmar_syllable_machine_start = 0;
@@ -274,22 +302,21 @@ static const int myanmar_syllable_machine_en_main = 0;
#define found_syllable(syllable_type) \
HB_STMT_START { \
- if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \
- for (unsigned int i = last; i < p+1; i++) \
- info[i].syllable() = (syllable_serial << 4) | syllable_type; \
- last = p+1; \
+ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+ for (unsigned int i = ts; i < te; i++) \
+ info[i].syllable() = (syllable_serial << 4) | myanmar_##syllable_type; \
syllable_serial++; \
if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
} HB_STMT_END
static void
-find_syllables (hb_buffer_t *buffer)
+find_syllables_myanmar (hb_buffer_t *buffer)
{
- unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED;
+ unsigned int p, pe, eof, ts, te, act HB_UNUSED;
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 293 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 320 "hb-ot-shape-complex-myanmar-machine.hh"
{
cs = myanmar_syllable_machine_start;
ts = 0;
@@ -297,16 +324,15 @@ find_syllables (hb_buffer_t *buffer)
act = 0;
}
-#line 115 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 114 "hb-ot-shape-complex-myanmar-machine.rl"
p = 0;
pe = eof = buffer->len;
- unsigned int last = 0;
unsigned int syllable_serial = 1;
-#line 310 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 336 "hb-ot-shape-complex-myanmar-machine.hh"
{
int _slen;
int _trans;
@@ -320,7 +346,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
-#line 324 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 350 "hb-ot-shape-complex-myanmar-machine.hh"
}
_keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -338,11 +364,11 @@ _eof_trans:
goto _again;
switch ( _myanmar_syllable_machine_trans_actions[_trans] ) {
- case 7:
+ case 6:
#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (consonant_syllable); }}
break;
- case 5:
+ case 4:
#line 87 "hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (non_myanmar_cluster); }}
break;
@@ -350,7 +376,7 @@ _eof_trans:
#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (punctuation_cluster); }}
break;
- case 4:
+ case 8:
#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (broken_cluster); }}
break;
@@ -358,11 +384,11 @@ _eof_trans:
#line 90 "hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (non_myanmar_cluster); }}
break;
- case 6:
+ case 5:
#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
{te = p;p--;{ found_syllable (consonant_syllable); }}
break;
- case 8:
+ case 7:
#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
@@ -370,7 +396,7 @@ _eof_trans:
#line 90 "hb-ot-shape-complex-myanmar-machine.rl"
{te = p;p--;{ found_syllable (non_myanmar_cluster); }}
break;
-#line 374 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 400 "hb-ot-shape-complex-myanmar-machine.hh"
}
_again:
@@ -379,7 +405,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
-#line 383 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 409 "hb-ot-shape-complex-myanmar-machine.hh"
}
if ( ++p != pe )
@@ -395,7 +421,7 @@ _again:
}
-#line 124 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 122 "hb-ot-shape-complex-myanmar-machine.rl"
}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.rl b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.rl
new file mode 100644
index 0000000000..67133cd734
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.rl
@@ -0,0 +1,127 @@
+/*
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
+
+#include "hb.hh"
+
+%%{
+ machine myanmar_syllable_machine;
+ alphtype unsigned char;
+ write data;
+}%%
+
+%%{
+
+# Same order as enum myanmar_category_t. Not sure how to avoid duplication.
+A = 10;
+As = 18;
+C = 1;
+D = 32;
+D0 = 20;
+DB = 3;
+GB = 11;
+H = 4;
+IV = 2;
+MH = 21;
+MR = 22;
+MW = 23;
+MY = 24;
+PT = 25;
+V = 8;
+VAbv = 26;
+VBlw = 27;
+VPre = 28;
+VPst = 29;
+VS = 30;
+ZWJ = 6;
+ZWNJ = 5;
+Ra = 16;
+P = 31;
+CS = 19;
+
+j = ZWJ|ZWNJ; # Joiners
+k = (Ra As H); # Kinzi
+
+c = C|Ra; # is_consonant
+
+medial_group = MY? As? MR? ((MW MH? | MH) As?)?;
+main_vowel_group = (VPre.VS?)* VAbv* VBlw* A* (DB As?)?;
+post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?;
+pwo_tone_group = PT A* DB? As?;
+
+complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?;
+syllable_tail = (H (c|IV).VS?)* (H | complex_syllable_tail);
+
+consonant_syllable = (k|CS)? (c|IV|D|GB).VS? syllable_tail;
+punctuation_cluster = P V;
+broken_cluster = k? VS? syllable_tail;
+other = any;
+
+main := |*
+ consonant_syllable => { found_syllable (consonant_syllable); };
+ j => { found_syllable (non_myanmar_cluster); };
+ punctuation_cluster => { found_syllable (punctuation_cluster); };
+ broken_cluster => { found_syllable (broken_cluster); };
+ other => { found_syllable (non_myanmar_cluster); };
+*|;
+
+
+}%%
+
+#define found_syllable(syllable_type) \
+ HB_STMT_START { \
+ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+ for (unsigned int i = ts; i < te; i++) \
+ info[i].syllable() = (syllable_serial << 4) | myanmar_##syllable_type; \
+ syllable_serial++; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+ } HB_STMT_END
+
+static void
+find_syllables_myanmar (hb_buffer_t *buffer)
+{
+ unsigned int p, pe, eof, ts, te, act HB_UNUSED;
+ int cs;
+ hb_glyph_info_t *info = buffer->info;
+ %%{
+ write init;
+ getkey info[p].myanmar_category();
+ }%%
+
+ p = 0;
+ pe = eof = buffer->len;
+
+ unsigned int syllable_serial = 1;
+ %%{
+ write exec;
+ }%%
+}
+
+#undef found_syllable
+
+#endif /* HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc
index 5ea1dbff27..fc3490d716 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc
@@ -24,11 +24,11 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-ot-shape-complex-indic-private.hh"
+#include "hb.hh"
-/* buffer var allocations */
-#define myanmar_category() complex_var_u8_0() /* myanmar_category_t */
-#define myanmar_position() complex_var_u8_1() /* myanmar_position_t */
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex-myanmar.hh"
/*
@@ -36,11 +36,11 @@
*/
static const hb_tag_t
-basic_features[] =
+myanmar_basic_features[] =
{
/*
* Basic features.
- * These features are applied in order, one at a time, after initial_reordering.
+ * These features are applied in order, one at a time, after reordering.
*/
HB_TAG('r','p','h','f'),
HB_TAG('p','r','e','f'),
@@ -48,42 +48,26 @@ basic_features[] =
HB_TAG('p','s','t','f'),
};
static const hb_tag_t
-other_features[] =
+myanmar_other_features[] =
{
/*
* Other features.
- * These features are applied all at once, after final_reordering.
+ * These features are applied all at once, after clearing syllables.
*/
HB_TAG('p','r','e','s'),
HB_TAG('a','b','v','s'),
HB_TAG('b','l','w','s'),
HB_TAG('p','s','t','s'),
- /* Positioning features, though we don't care about the types. */
- HB_TAG('d','i','s','t'),
- /* Pre-release version of Windows 8 Myanmar font had abvm,blwm
- * features. The released Windows 8 version of the font (as well
- * as the released spec) used 'mark' instead. The Windows 8
- * shaper however didn't apply 'mark' but did apply 'mkmk'.
- * Perhaps it applied abvm/blwm. This was fixed in a Windows 8
- * update, so now it applies mark/mkmk. We are guessing that
- * it still applies abvm/blwm too.
- */
- HB_TAG('a','b','v','m'),
- HB_TAG('b','l','w','m'),
};
static void
-setup_syllables (const hb_ot_shape_plan_t *plan,
+setup_syllables_myanmar (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+static void
+reorder_myanmar (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
-static void
-initial_reordering (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
-static void
-final_reordering (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
static void
collect_features_myanmar (hb_ot_shape_planner_t *plan)
@@ -91,193 +75,49 @@ collect_features_myanmar (hb_ot_shape_planner_t *plan)
hb_ot_map_builder_t *map = &plan->map;
/* Do this before any lookups have been applied. */
- map->add_gsub_pause (setup_syllables);
+ map->add_gsub_pause (setup_syllables_myanmar);
- map->add_global_bool_feature (HB_TAG('l','o','c','l'));
+ map->enable_feature (HB_TAG('l','o','c','l'));
/* The Indic specs do not require ccmp, but we apply it here since if
* there is a use of it, it's typically at the beginning. */
- map->add_global_bool_feature (HB_TAG('c','c','m','p'));
+ map->enable_feature (HB_TAG('c','c','m','p'));
+
+ map->add_gsub_pause (reorder_myanmar);
- map->add_gsub_pause (initial_reordering);
- for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++)
+ for (unsigned int i = 0; i < ARRAY_LENGTH (myanmar_basic_features); i++)
{
- map->add_feature (basic_features[i], 1, F_GLOBAL | F_MANUAL_ZWJ);
+ map->enable_feature (myanmar_basic_features[i], F_MANUAL_ZWJ);
map->add_gsub_pause (nullptr);
}
- map->add_gsub_pause (final_reordering);
- for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++)
- map->add_feature (other_features[i], 1, F_GLOBAL | F_MANUAL_ZWJ);
+
+ map->add_gsub_pause (_hb_clear_syllables);
+
+ for (unsigned int i = 0; i < ARRAY_LENGTH (myanmar_other_features); i++)
+ map->enable_feature (myanmar_other_features[i], F_MANUAL_ZWJ);
}
static void
override_features_myanmar (hb_ot_shape_planner_t *plan)
{
- plan->map.add_feature (HB_TAG('l','i','g','a'), 0, F_GLOBAL);
+ plan->map.disable_feature (HB_TAG('l','i','g','a'));
}
-enum syllable_type_t {
- consonant_syllable,
- punctuation_cluster,
- broken_cluster,
- non_myanmar_cluster,
+enum myanmar_syllable_type_t {
+ myanmar_consonant_syllable,
+ myanmar_punctuation_cluster,
+ myanmar_broken_cluster,
+ myanmar_non_myanmar_cluster,
};
#include "hb-ot-shape-complex-myanmar-machine.hh"
-/* Note: This enum is duplicated in the -machine.rl source file.
- * Not sure how to avoid duplication. */
-enum myanmar_category_t {
- OT_As = 18, /* Asat */
- OT_D0 = 20, /* Digit zero */
- OT_DB = OT_N, /* Dot below */
- OT_GB = OT_PLACEHOLDER,
- OT_MH = 21, /* Various consonant medial types */
- OT_MR = 22, /* Various consonant medial types */
- OT_MW = 23, /* Various consonant medial types */
- OT_MY = 24, /* Various consonant medial types */
- OT_PT = 25, /* Pwo and other tones */
- OT_VAbv = 26,
- OT_VBlw = 27,
- OT_VPre = 28,
- OT_VPst = 29,
- OT_VS = 30, /* Variation selectors */
- OT_P = 31, /* Punctuation */
- OT_D = 32, /* Digits except zero */
-};
-
-
-static inline bool
-is_one_of (const hb_glyph_info_t &info, unsigned int flags)
-{
- /* If it ligated, all bets are off. */
- if (_hb_glyph_info_ligated (&info)) return false;
- return !!(FLAG_UNSAFE (info.myanmar_category()) & flags);
-}
-
-static inline bool
-is_consonant (const hb_glyph_info_t &info)
-{
- return is_one_of (info, CONSONANT_FLAGS);
-}
-
-
-static inline void
-set_myanmar_properties (hb_glyph_info_t &info)
-{
- hb_codepoint_t u = info.codepoint;
- unsigned int type = hb_indic_get_categories (u);
- indic_category_t cat = (indic_category_t) (type & 0x7Fu);
- indic_position_t pos = (indic_position_t) (type >> 8);
-
- /* Myanmar
- * http://www.microsoft.com/typography/OpenTypeDev/myanmar/intro.htm#analyze
- */
- if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu)))
- cat = (indic_category_t) OT_VS;
-
- switch (u)
- {
- case 0x104Eu:
- cat = (indic_category_t) OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */
- break;
-
- case 0x002Du: case 0x00A0u: case 0x00D7u: case 0x2012u:
- case 0x2013u: case 0x2014u: case 0x2015u: case 0x2022u:
- case 0x25CCu: case 0x25FBu: case 0x25FCu: case 0x25FDu:
- case 0x25FEu:
- cat = (indic_category_t) OT_GB;
- break;
-
- case 0x1004u: case 0x101Bu: case 0x105Au:
- cat = (indic_category_t) OT_Ra;
- break;
-
- case 0x1032u: case 0x1036u:
- cat = (indic_category_t) OT_A;
- break;
-
- case 0x1039u:
- cat = (indic_category_t) OT_H;
- break;
-
- case 0x103Au:
- cat = (indic_category_t) OT_As;
- break;
-
- case 0x1041u: case 0x1042u: case 0x1043u: case 0x1044u:
- case 0x1045u: case 0x1046u: case 0x1047u: case 0x1048u:
- case 0x1049u: case 0x1090u: case 0x1091u: case 0x1092u:
- case 0x1093u: case 0x1094u: case 0x1095u: case 0x1096u:
- case 0x1097u: case 0x1098u: case 0x1099u:
- cat = (indic_category_t) OT_D;
- break;
-
- case 0x1040u:
- cat = (indic_category_t) OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */
- break;
-
- case 0x103Eu: case 0x1060u:
- cat = (indic_category_t) OT_MH;
- break;
-
- case 0x103Cu:
- cat = (indic_category_t) OT_MR;
- break;
-
- case 0x103Du: case 0x1082u:
- cat = (indic_category_t) OT_MW;
- break;
-
- case 0x103Bu: case 0x105Eu: case 0x105Fu:
- cat = (indic_category_t) OT_MY;
- break;
-
- case 0x1063u: case 0x1064u: case 0x1069u: case 0x106Au:
- case 0x106Bu: case 0x106Cu: case 0x106Du: case 0xAA7Bu:
- cat = (indic_category_t) OT_PT;
- break;
-
- case 0x1038u: case 0x1087u: case 0x1088u: case 0x1089u:
- case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du:
- case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu:
- cat = (indic_category_t) OT_SM;
- break;
-
- case 0x104Au: case 0x104Bu:
- cat = (indic_category_t) OT_P;
- break;
-
- case 0xAA74u: case 0xAA75u: case 0xAA76u:
- /* https://github.com/roozbehp/unicode-data/issues/3 */
- cat = (indic_category_t) OT_C;
- break;
- }
-
- if (cat == OT_M)
- {
- switch ((int) pos)
- {
- case POS_PRE_C: cat = (indic_category_t) OT_VPre;
- pos = POS_PRE_M; break;
- case POS_ABOVE_C: cat = (indic_category_t) OT_VAbv; break;
- case POS_BELOW_C: cat = (indic_category_t) OT_VBlw; break;
- case POS_POST_C: cat = (indic_category_t) OT_VPst; break;
- }
- }
-
- info.myanmar_category() = (myanmar_category_t) cat;
- info.myanmar_position() = pos;
-}
-
-
-
static void
setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
- hb_buffer_t *buffer,
- hb_font_t *font HB_UNUSED)
+ hb_buffer_t *buffer,
+ hb_font_t *font HB_UNUSED)
{
HB_BUFFER_ALLOCATE_VAR (buffer, myanmar_category);
HB_BUFFER_ALLOCATE_VAR (buffer, myanmar_position);
@@ -292,11 +132,11 @@ setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
}
static void
-setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
- hb_font_t *font HB_UNUSED,
- hb_buffer_t *buffer)
+setup_syllables_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font HB_UNUSED,
+ hb_buffer_t *buffer)
{
- find_syllables (buffer);
+ find_syllables_myanmar (buffer);
foreach_syllable (buffer, start, end)
buffer->unsafe_to_break (start, end);
}
@@ -312,7 +152,7 @@ compare_myanmar_order (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
/* Rules from:
- * http://www.microsoft.com/typography/OpenTypeDev/myanmar/intro.htm */
+ * https://docs.microsoft.com/en-us/typography/script-development/myanmar */
static void
initial_reordering_consonant_syllable (hb_buffer_t *buffer,
@@ -374,6 +214,11 @@ initial_reordering_consonant_syllable (hb_buffer_t *buffer,
{
continue;
}
+ if (info[i].myanmar_category() == OT_VS)
+ {
+ info[i].myanmar_position() = info[i - 1].myanmar_position();
+ continue;
+ }
if (pos == POS_AFTER_MAIN && info[i].myanmar_category() == OT_VBlw)
{
@@ -394,7 +239,7 @@ initial_reordering_consonant_syllable (hb_buffer_t *buffer,
}
if (pos == POS_BELOW_C && info[i].myanmar_category() != OT_A)
{
- pos = POS_AFTER_SUB;
+ pos = POS_AFTER_SUB;
info[i].myanmar_position() = pos;
continue;
}
@@ -407,36 +252,40 @@ initial_reordering_consonant_syllable (hb_buffer_t *buffer,
}
static void
-initial_reordering_syllable (const hb_ot_shape_plan_t *plan,
- hb_face_t *face,
- hb_buffer_t *buffer,
- unsigned int start, unsigned int end)
+reorder_syllable_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_face_t *face HB_UNUSED,
+ hb_buffer_t *buffer,
+ unsigned int start, unsigned int end)
{
- syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
+ myanmar_syllable_type_t syllable_type = (myanmar_syllable_type_t) (buffer->info[start].syllable() & 0x0F);
switch (syllable_type) {
- case broken_cluster: /* We already inserted dotted-circles, so just call the consonant_syllable. */
- case consonant_syllable:
+ case myanmar_broken_cluster: /* We already inserted dotted-circles, so just call the consonant_syllable. */
+ case myanmar_consonant_syllable:
initial_reordering_consonant_syllable (buffer, start, end);
break;
- case punctuation_cluster:
- case non_myanmar_cluster:
+ case myanmar_punctuation_cluster:
+ case myanmar_non_myanmar_cluster:
break;
}
}
static inline void
-insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
- hb_font_t *font,
- hb_buffer_t *buffer)
+insert_dotted_circles_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
{
- /* Note: This loop is extra overhead, but should not be measurable. */
+ if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
+ return;
+
+ /* Note: This loop is extra overhead, but should not be measurable.
+ * TODO Use a buffer scratch flag to remove the loop. */
bool has_broken_syllables = false;
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
- if ((info[i].syllable() & 0x0F) == broken_cluster)
+ if ((info[i].syllable() & 0x0F) == myanmar_broken_cluster)
{
has_broken_syllables = true;
break;
@@ -458,11 +307,11 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
buffer->idx = 0;
unsigned int last_syllable = 0;
- while (buffer->idx < buffer->len && !buffer->in_error)
+ while (buffer->idx < buffer->len && buffer->successful)
{
unsigned int syllable = buffer->cur().syllable();
- syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
- if (unlikely (last_syllable != syllable && syllable_type == broken_cluster))
+ myanmar_syllable_type_t syllable_type = (myanmar_syllable_type_t) (syllable & 0x0F);
+ if (unlikely (last_syllable != syllable && syllable_type == myanmar_broken_cluster))
{
last_syllable = syllable;
@@ -476,72 +325,63 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
else
buffer->next_glyph ();
}
-
buffer->swap_buffers ();
}
static void
-initial_reordering (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer)
+reorder_myanmar (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
{
- insert_dotted_circles (plan, font, buffer);
+ insert_dotted_circles_myanmar (plan, font, buffer);
foreach_syllable (buffer, start, end)
- initial_reordering_syllable (plan, font->face, buffer, start, end);
-}
-
-static void
-final_reordering (const hb_ot_shape_plan_t *plan,
- hb_font_t *font HB_UNUSED,
- hb_buffer_t *buffer)
-{
- hb_glyph_info_t *info = buffer->info;
- unsigned int count = buffer->len;
-
- /* Zero syllables now... */
- for (unsigned int i = 0; i < count; i++)
- info[i].syllable() = 0;
+ reorder_syllable_myanmar (plan, font->face, buffer, start, end);
HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_category);
HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position);
}
-/* Uniscribe seems to have a shaper for 'mymr' that is like the
- * generic shaper, except that it zeros mark advances GDEF_LATE. */
-const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_old =
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar =
{
- nullptr, /* collect_features */
- nullptr, /* override_features */
+ collect_features_myanmar,
+ override_features_myanmar,
nullptr, /* data_create */
nullptr, /* data_destroy */
nullptr, /* preprocess_text */
nullptr, /* postprocess_glyphs */
- HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
+ HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
nullptr, /* decompose */
nullptr, /* compose */
- nullptr, /* setup_masks */
- nullptr, /* disable_otl */
+ setup_masks_myanmar,
+ HB_TAG_NONE, /* gpos_tag */
nullptr, /* reorder_marks */
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
- true, /* fallback_position */
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
+ false, /* fallback_position */
};
-const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar =
+
+/* Ugly Zawgyi encoding.
+ * Disable all auto processing.
+ * https://github.com/harfbuzz/harfbuzz/issues/1162 */
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_zawgyi =
{
- collect_features_myanmar,
- override_features_myanmar,
+ nullptr, /* collect_features */
+ nullptr, /* override_features */
nullptr, /* data_create */
nullptr, /* data_destroy */
nullptr, /* preprocess_text */
nullptr, /* postprocess_glyphs */
- HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
+ HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
nullptr, /* decompose */
nullptr, /* compose */
- setup_masks_myanmar,
- nullptr, /* disable_otl */
+ nullptr, /* setup_masks */
+ HB_TAG_NONE, /* gpos_tag */
nullptr, /* reorder_marks */
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
false, /* fallback_position */
};
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.hh
new file mode 100644
index 0000000000..7b9821e6ba
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.hh
@@ -0,0 +1,171 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_MYANMAR_HH
+#define HB_OT_SHAPE_COMPLEX_MYANMAR_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex-indic.hh"
+
+
+/* buffer var allocations */
+#define myanmar_category() indic_category() /* myanmar_category_t */
+#define myanmar_position() indic_position() /* myanmar_position_t */
+
+
+/* Note: This enum is duplicated in the -machine.rl source file.
+ * Not sure how to avoid duplication. */
+enum myanmar_category_t {
+ OT_As = 18, /* Asat */
+ OT_D0 = 20, /* Digit zero */
+ OT_DB = OT_N, /* Dot below */
+ OT_GB = OT_PLACEHOLDER,
+ OT_MH = 21, /* Various consonant medial types */
+ OT_MR = 22, /* Various consonant medial types */
+ OT_MW = 23, /* Various consonant medial types */
+ OT_MY = 24, /* Various consonant medial types */
+ OT_PT = 25, /* Pwo and other tones */
+ //OT_VAbv = 26,
+ //OT_VBlw = 27,
+ //OT_VPre = 28,
+ //OT_VPst = 29,
+ OT_VS = 30, /* Variation selectors */
+ OT_P = 31, /* Punctuation */
+ OT_D = 32, /* Digits except zero */
+};
+
+
+static inline void
+set_myanmar_properties (hb_glyph_info_t &info)
+{
+ hb_codepoint_t u = info.codepoint;
+ unsigned int type = hb_indic_get_categories (u);
+ unsigned int cat = type & 0x7Fu;
+ indic_position_t pos = (indic_position_t) (type >> 8);
+
+ /* Myanmar
+ * https://docs.microsoft.com/en-us/typography/script-development/myanmar#analyze
+ */
+ if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu)))
+ cat = OT_VS;
+
+ switch (u)
+ {
+ case 0x104Eu:
+ cat = OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */
+ break;
+
+ case 0x002Du: case 0x00A0u: case 0x00D7u: case 0x2012u:
+ case 0x2013u: case 0x2014u: case 0x2015u: case 0x2022u:
+ case 0x25CCu: case 0x25FBu: case 0x25FCu: case 0x25FDu:
+ case 0x25FEu:
+ cat = OT_GB;
+ break;
+
+ case 0x1004u: case 0x101Bu: case 0x105Au:
+ cat = OT_Ra;
+ break;
+
+ case 0x1032u: case 0x1036u:
+ cat = OT_A;
+ break;
+
+ case 0x1039u:
+ cat = OT_H;
+ break;
+
+ case 0x103Au:
+ cat = OT_As;
+ break;
+
+ case 0x1041u: case 0x1042u: case 0x1043u: case 0x1044u:
+ case 0x1045u: case 0x1046u: case 0x1047u: case 0x1048u:
+ case 0x1049u: case 0x1090u: case 0x1091u: case 0x1092u:
+ case 0x1093u: case 0x1094u: case 0x1095u: case 0x1096u:
+ case 0x1097u: case 0x1098u: case 0x1099u:
+ cat = OT_D;
+ break;
+
+ case 0x1040u:
+ cat = OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */
+ break;
+
+ case 0x103Eu: case 0x1060u:
+ cat = OT_MH;
+ break;
+
+ case 0x103Cu:
+ cat = OT_MR;
+ break;
+
+ case 0x103Du: case 0x1082u:
+ cat = OT_MW;
+ break;
+
+ case 0x103Bu: case 0x105Eu: case 0x105Fu:
+ cat = OT_MY;
+ break;
+
+ case 0x1063u: case 0x1064u: case 0x1069u: case 0x106Au:
+ case 0x106Bu: case 0x106Cu: case 0x106Du: case 0xAA7Bu:
+ cat = OT_PT;
+ break;
+
+ case 0x1038u: case 0x1087u: case 0x1088u: case 0x1089u:
+ case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du:
+ case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu:
+ cat = OT_SM;
+ break;
+
+ case 0x104Au: case 0x104Bu:
+ cat = OT_P;
+ break;
+
+ case 0xAA74u: case 0xAA75u: case 0xAA76u:
+ /* https://github.com/harfbuzz/harfbuzz/issues/218 */
+ cat = OT_C;
+ break;
+ }
+
+ if (cat == OT_M)
+ {
+ switch ((int) pos)
+ {
+ case POS_PRE_C: cat = (myanmar_category_t) OT_VPre;
+ pos = POS_PRE_M; break;
+ case POS_ABOVE_C: cat = (myanmar_category_t) OT_VAbv; break;
+ case POS_BELOW_C: cat = (myanmar_category_t) OT_VBlw; break;
+ case POS_POST_C: cat = (myanmar_category_t) OT_VPst; break;
+ }
+ }
+
+ info.myanmar_category() = cat;
+ info.myanmar_position() = pos;
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_MYANMAR_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh
deleted file mode 100644
index fb2f61157a..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
- * Copyright © 2010,2011,2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_SHAPE_COMPLEX_PRIVATE_HH
-#define HB_OT_SHAPE_COMPLEX_PRIVATE_HH
-
-#include "hb-private.hh"
-
-#include "hb-ot-shape-private.hh"
-#include "hb-ot-shape-normalize-private.hh"
-
-
-
-/* buffer var allocations, used by complex shapers */
-#define complex_var_u8_0() var2.u8[2]
-#define complex_var_u8_1() var2.u8[3]
-
-
-#define HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS 32
-
-enum hb_ot_shape_zero_width_marks_type_t {
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE
-};
-
-
-/* Master OT shaper list */
-#define HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS \
- HB_COMPLEX_SHAPER_IMPLEMENT (default) /* should be first */ \
- HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \
- HB_COMPLEX_SHAPER_IMPLEMENT (hangul) \
- HB_COMPLEX_SHAPER_IMPLEMENT (hebrew) \
- HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_old) \
- HB_COMPLEX_SHAPER_IMPLEMENT (indic) \
- HB_COMPLEX_SHAPER_IMPLEMENT (myanmar) \
- HB_COMPLEX_SHAPER_IMPLEMENT (thai) \
- HB_COMPLEX_SHAPER_IMPLEMENT (tibetan) \
- HB_COMPLEX_SHAPER_IMPLEMENT (use) \
- /* ^--- Add new shapers here */
-
-
-struct hb_ot_complex_shaper_t
-{
- /* collect_features()
- * Called during shape_plan().
- * Shapers should use plan->map to add their features and callbacks.
- * May be nullptr.
- */
- void (*collect_features) (hb_ot_shape_planner_t *plan);
-
- /* override_features()
- * Called during shape_plan().
- * Shapers should use plan->map to override features and add callbacks after
- * common features are added.
- * May be nullptr.
- */
- void (*override_features) (hb_ot_shape_planner_t *plan);
-
-
- /* data_create()
- * Called at the end of shape_plan().
- * Whatever shapers return will be accessible through plan->data later.
- * If nullptr is returned, means a plan failure.
- */
- void *(*data_create) (const hb_ot_shape_plan_t *plan);
-
- /* data_destroy()
- * Called when the shape_plan is being destroyed.
- * plan->data is passed here for destruction.
- * If nullptr is returned, means a plan failure.
- * May be nullptr.
- */
- void (*data_destroy) (void *data);
-
-
- /* preprocess_text()
- * Called during shape().
- * Shapers can use to modify text before shaping starts.
- * May be nullptr.
- */
- void (*preprocess_text) (const hb_ot_shape_plan_t *plan,
- hb_buffer_t *buffer,
- hb_font_t *font);
-
- /* postprocess_glyphs()
- * Called during shape().
- * Shapers can use to modify glyphs after shaping ends.
- * May be nullptr.
- */
- void (*postprocess_glyphs) (const hb_ot_shape_plan_t *plan,
- hb_buffer_t *buffer,
- hb_font_t *font);
-
-
- hb_ot_shape_normalization_mode_t normalization_preference;
-
- /* decompose()
- * Called during shape()'s normalization.
- * May be nullptr.
- */
- bool (*decompose) (const hb_ot_shape_normalize_context_t *c,
- hb_codepoint_t ab,
- hb_codepoint_t *a,
- hb_codepoint_t *b);
-
- /* compose()
- * Called during shape()'s normalization.
- * May be nullptr.
- */
- bool (*compose) (const hb_ot_shape_normalize_context_t *c,
- hb_codepoint_t a,
- hb_codepoint_t b,
- hb_codepoint_t *ab);
-
- /* setup_masks()
- * Called during shape().
- * Shapers should use map to get feature masks and set on buffer.
- * Shapers may NOT modify characters.
- * May be nullptr.
- */
- void (*setup_masks) (const hb_ot_shape_plan_t *plan,
- hb_buffer_t *buffer,
- hb_font_t *font);
-
- /* disable_otl()
- * Called during shape().
- * If set and returns true, GDEF/GSUB/GPOS of the font are ignored
- * and fallback operations used.
- * May be nullptr.
- */
- bool (*disable_otl) (const hb_ot_shape_plan_t *plan);
-
- /* reorder_marks()
- * Called during shape().
- * Shapers can use to modify ordering of combining marks.
- * May be nullptr.
- */
- void (*reorder_marks) (const hb_ot_shape_plan_t *plan,
- hb_buffer_t *buffer,
- unsigned int start,
- unsigned int end);
-
- hb_ot_shape_zero_width_marks_type_t zero_width_marks;
-
- bool fallback_position;
-};
-
-#define HB_COMPLEX_SHAPER_IMPLEMENT(name) extern HB_INTERNAL const hb_ot_complex_shaper_t _hb_ot_complex_shaper_##name;
-HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
-#undef HB_COMPLEX_SHAPER_IMPLEMENT
-
-
-static inline const hb_ot_complex_shaper_t *
-hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
-{
- switch ((hb_tag_t) planner->props.script)
- {
- default:
- return &_hb_ot_complex_shaper_default;
-
-
- /* Unicode-1.1 additions */
- case HB_SCRIPT_ARABIC:
-
- /* Unicode-3.0 additions */
- case HB_SCRIPT_MONGOLIAN:
- case HB_SCRIPT_SYRIAC:
-
- /* Unicode-5.0 additions */
- case HB_SCRIPT_NKO:
- case HB_SCRIPT_PHAGS_PA:
-
- /* Unicode-6.0 additions */
- case HB_SCRIPT_MANDAIC:
-
- /* Unicode-7.0 additions */
- case HB_SCRIPT_MANICHAEAN:
- case HB_SCRIPT_PSALTER_PAHLAVI:
-
- /* Unicode-9.0 additions */
- case HB_SCRIPT_ADLAM:
-
- /* For Arabic script, use the Arabic shaper even if no OT script tag was found.
- * This is because we do fallback shaping for Arabic script (and not others).
- * But note that Arabic shaping is applicable only to horizontal layout; for
- * vertical text, just use the generic shaper instead. */
- if ((planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT ||
- planner->props.script == HB_SCRIPT_ARABIC) &&
- HB_DIRECTION_IS_HORIZONTAL(planner->props.direction))
- return &_hb_ot_complex_shaper_arabic;
- else
- return &_hb_ot_complex_shaper_default;
-
-
- /* Unicode-1.1 additions */
- case HB_SCRIPT_THAI:
- case HB_SCRIPT_LAO:
-
- return &_hb_ot_complex_shaper_thai;
-
-
- /* Unicode-1.1 additions */
- case HB_SCRIPT_HANGUL:
-
- return &_hb_ot_complex_shaper_hangul;
-
-
- /* Unicode-2.0 additions */
- case HB_SCRIPT_TIBETAN:
-
- return &_hb_ot_complex_shaper_tibetan;
-
-
- /* Unicode-1.1 additions */
- case HB_SCRIPT_HEBREW:
-
- return &_hb_ot_complex_shaper_hebrew;
-
-
- /* ^--- Add new shapers here */
-
-#if 0
- /* Unicode-4.1 additions */
- case HB_SCRIPT_NEW_TAI_LUE:
-#endif
-
- /* Unicode-1.1 additions */
- case HB_SCRIPT_BENGALI:
- case HB_SCRIPT_DEVANAGARI:
- case HB_SCRIPT_GUJARATI:
- case HB_SCRIPT_GURMUKHI:
- case HB_SCRIPT_KANNADA:
- case HB_SCRIPT_MALAYALAM:
- case HB_SCRIPT_ORIYA:
- case HB_SCRIPT_TAMIL:
- case HB_SCRIPT_TELUGU:
-
- /* Unicode-3.0 additions */
- case HB_SCRIPT_SINHALA:
-
- /* If the designer designed the font for the 'DFLT' script,
- * (or we ended up arbitrarily pick 'latn'), use the default shaper.
- * Otherwise, use the specific shaper.
- * Note that for some simple scripts, there may not be *any*
- * GSUB/GPOS needed, so there may be no scripts found! */
- if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
- planner->map.chosen_script[0] == HB_TAG ('l','a','t','n'))
- return &_hb_ot_complex_shaper_default;
- else
- return &_hb_ot_complex_shaper_indic;
-
- case HB_SCRIPT_KHMER:
- /* A number of Khmer fonts in the wild don't have a 'pref' feature,
- * and as such won't shape properly via the Indic shaper;
- * however, they typically have 'liga' / 'clig' features that implement
- * the necessary "reordering" by means of ligature substitutions.
- * So we send such pref-less fonts through the generic shaper instead. */
- if (planner->map.found_script[0] &&
- hb_ot_layout_language_find_feature (planner->face, HB_OT_TAG_GSUB,
- planner->map.script_index[0],
- planner->map.language_index[0],
- HB_TAG ('p','r','e','f'),
- nullptr))
- return &_hb_ot_complex_shaper_indic;
- else
- return &_hb_ot_complex_shaper_default;
-
- case HB_SCRIPT_MYANMAR:
- if (planner->map.chosen_script[0] == HB_TAG ('m','y','m','2'))
- return &_hb_ot_complex_shaper_myanmar;
- else if (planner->map.chosen_script[0] == HB_TAG ('m','y','m','r'))
- return &_hb_ot_complex_shaper_myanmar_old;
- else
- return &_hb_ot_complex_shaper_default;
-
-
- /* Unicode-2.0 additions */
- //case HB_SCRIPT_TIBETAN:
-
- /* Unicode-3.0 additions */
- //case HB_SCRIPT_MONGOLIAN:
- //case HB_SCRIPT_SINHALA:
-
- /* Unicode-3.2 additions */
- case HB_SCRIPT_BUHID:
- case HB_SCRIPT_HANUNOO:
- case HB_SCRIPT_TAGALOG:
- case HB_SCRIPT_TAGBANWA:
-
- /* Unicode-4.0 additions */
- case HB_SCRIPT_LIMBU:
- case HB_SCRIPT_TAI_LE:
-
- /* Unicode-4.1 additions */
- case HB_SCRIPT_BUGINESE:
- case HB_SCRIPT_KHAROSHTHI:
- case HB_SCRIPT_SYLOTI_NAGRI:
- case HB_SCRIPT_TIFINAGH:
-
- /* Unicode-5.0 additions */
- case HB_SCRIPT_BALINESE:
- //case HB_SCRIPT_NKO:
- //case HB_SCRIPT_PHAGS_PA:
-
- /* Unicode-5.1 additions */
- case HB_SCRIPT_CHAM:
- case HB_SCRIPT_KAYAH_LI:
- case HB_SCRIPT_LEPCHA:
- case HB_SCRIPT_REJANG:
- case HB_SCRIPT_SAURASHTRA:
- case HB_SCRIPT_SUNDANESE:
-
- /* Unicode-5.2 additions */
- case HB_SCRIPT_EGYPTIAN_HIEROGLYPHS:
- case HB_SCRIPT_JAVANESE:
- case HB_SCRIPT_KAITHI:
- case HB_SCRIPT_MEETEI_MAYEK:
- case HB_SCRIPT_TAI_THAM:
- case HB_SCRIPT_TAI_VIET:
-
- /* Unicode-6.0 additions */
- case HB_SCRIPT_BATAK:
- case HB_SCRIPT_BRAHMI:
- //case HB_SCRIPT_MANDAIC:
-
- /* Unicode-6.1 additions */
- case HB_SCRIPT_CHAKMA:
- case HB_SCRIPT_SHARADA:
- case HB_SCRIPT_TAKRI:
-
- /* Unicode-7.0 additions */
- case HB_SCRIPT_DUPLOYAN:
- case HB_SCRIPT_GRANTHA:
- case HB_SCRIPT_KHOJKI:
- case HB_SCRIPT_KHUDAWADI:
- case HB_SCRIPT_MAHAJANI:
- //case HB_SCRIPT_MANICHAEAN:
- case HB_SCRIPT_MODI:
- case HB_SCRIPT_PAHAWH_HMONG:
- //case HB_SCRIPT_PSALTER_PAHLAVI:
- case HB_SCRIPT_SIDDHAM:
- case HB_SCRIPT_TIRHUTA:
-
- /* Unicode-8.0 additions */
- case HB_SCRIPT_AHOM:
- //case HB_SCRIPT_MULTANI:
-
- /* Unicode-9.0 additions */
- case HB_SCRIPT_BHAIKSUKI:
- case HB_SCRIPT_MARCHEN:
- case HB_SCRIPT_NEWA:
-
- /* Unicode-10.0 additions */
- case HB_SCRIPT_MASARAM_GONDI:
- case HB_SCRIPT_SOYOMBO:
- case HB_SCRIPT_ZANABAZAR_SQUARE:
-
- /* If the designer designed the font for the 'DFLT' script,
- * (or we ended up arbitrarily pick 'latn'), use the default shaper.
- * Otherwise, use the specific shaper.
- * Note that for some simple scripts, there may not be *any*
- * GSUB/GPOS needed, so there may be no scripts found! */
- if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
- planner->map.chosen_script[0] == HB_TAG ('l','a','t','n'))
- return &_hb_ot_complex_shaper_default;
- else
- return &_hb_ot_complex_shaper_use;
- }
-}
-
-
-#endif /* HB_OT_SHAPE_COMPLEX_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc
index 6ba925c675..347ea2e7ac 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc
@@ -24,7 +24,11 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-ot-shape-complex-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex.hh"
/* Thai / Lao shaper */
@@ -218,6 +222,10 @@ do_thai_pua_shaping (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_buffer_t *buffer,
hb_font_t *font)
{
+#ifdef HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK
+ return;
+#endif
+
thai_above_state_t above_state = thai_above_start_state[NOT_CONSONANT];
thai_below_state_t below_state = thai_below_start_state[NOT_CONSONANT];
unsigned int base = 0;
@@ -260,7 +268,7 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
{
/* This function implements the shaping logic documented here:
*
- * http://linux.thai.net/~thep/th-otf/shaping.html
+ * https://linux.thai.net/~thep/th-otf/shaping.html
*
* The first shaping rule listed there is needed even if the font has Thai
* OpenType tables. The rest do fallback positioning based on PUA codepoints.
@@ -315,7 +323,7 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
buffer->clear_output ();
unsigned int count = buffer->len;
- for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
+ for (buffer->idx = 0; buffer->idx < count && buffer->successful;)
{
hb_codepoint_t u = buffer->cur().codepoint;
if (likely (!IS_SARA_AM (u))) {
@@ -324,10 +332,10 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
}
/* Is SARA AM. Decompose and reorder. */
- hb_codepoint_t decomposed[2] = {hb_codepoint_t (NIKHAHIT_FROM_SARA_AM (u)),
- hb_codepoint_t (SARA_AA_FROM_SARA_AM (u))};
- buffer->replace_glyphs (1, 2, decomposed);
- if (unlikely (buffer->in_error))
+ hb_glyph_info_t &nikhahit = buffer->output_glyph (NIKHAHIT_FROM_SARA_AM (u));
+ _hb_glyph_info_set_continuation (&nikhahit);
+ buffer->replace_glyph (SARA_AA_FROM_SARA_AM (u));
+ if (unlikely (!buffer->successful))
return;
/* Make Nikhahit be recognized as a ccc=0 mark when zeroing widths. */
@@ -376,8 +384,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai =
nullptr, /* decompose */
nullptr, /* compose */
nullptr, /* setup_masks */
- nullptr, /* disable_otl */
+ HB_TAG_NONE, /* gpos_tag */
nullptr, /* reorder_marks */
HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
false,/* fallback_position */
};
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc
deleted file mode 100644
index eaac0bf689..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright © 2010,2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#include "hb-ot-shape-complex-private.hh"
-
-
-static const hb_tag_t tibetan_features[] =
-{
- HB_TAG('a','b','v','s'),
- HB_TAG('b','l','w','s'),
- HB_TAG('a','b','v','m'),
- HB_TAG('b','l','w','m'),
- HB_TAG_NONE
-};
-
-static void
-collect_features_tibetan (hb_ot_shape_planner_t *plan)
-{
- for (const hb_tag_t *script_features = tibetan_features; script_features && *script_features; script_features++)
- plan->map.add_global_bool_feature (*script_features);
-}
-
-
-const hb_ot_complex_shaper_t _hb_ot_complex_shaper_tibetan =
-{
- collect_features_tibetan,
- nullptr, /* override_features */
- nullptr, /* data_create */
- nullptr, /* data_destroy */
- nullptr, /* preprocess_text */
- nullptr, /* postprocess_glyphs */
- HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
- nullptr, /* decompose */
- nullptr, /* compose */
- nullptr, /* setup_masks */
- nullptr, /* disable_otl */
- nullptr, /* reorder_marks */
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
- true, /* fallback_position */
-};
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-machine.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-machine.hh
index 4f6727186d..462342c618 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-machine.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-machine.hh
@@ -31,296 +31,368 @@
#ifndef HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
#define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
-#include "hb-private.hh"
+#include "hb.hh"
#line 38 "hb-ot-shape-complex-use-machine.hh"
static const unsigned char _use_syllable_machine_trans_keys[] = {
- 1u, 1u, 0u, 43u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u,
- 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
- 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
- 13u, 21u, 4u, 4u, 13u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u,
- 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
- 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 1u, 39u, 8u, 39u,
- 21u, 42u, 41u, 42u, 42u, 42u, 1u, 5u, 0
+ 12u, 48u, 1u, 15u, 1u, 1u, 12u, 48u, 1u, 1u, 0u, 48u, 21u, 21u, 11u, 48u,
+ 11u, 48u, 1u, 15u, 1u, 1u, 11u, 48u, 22u, 48u, 23u, 48u, 24u, 47u, 25u, 47u,
+ 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 1u, 1u, 24u, 48u,
+ 23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 11u, 48u,
+ 1u, 48u, 11u, 48u, 13u, 21u, 4u, 4u, 13u, 13u, 11u, 48u, 11u, 48u, 41u, 42u,
+ 42u, 42u, 11u, 48u, 11u, 48u, 22u, 48u, 23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u,
+ 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 24u, 48u, 23u, 48u, 23u, 48u,
+ 23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 11u, 48u, 1u, 48u, 1u, 15u,
+ 4u, 4u, 13u, 21u, 13u, 13u, 12u, 48u, 1u, 48u, 11u, 48u, 41u, 42u, 42u, 42u,
+ 21u, 42u, 1u, 5u, 0
};
static const char _use_syllable_machine_key_spans[] = {
- 1, 44, 1, 32, 32, 1, 32, 32,
- 32, 19, 19, 19, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 9, 1, 1, 32, 32, 32, 32, 19,
- 19, 19, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 1, 39, 32,
- 22, 2, 1, 5
+ 37, 15, 1, 37, 1, 49, 1, 38,
+ 38, 15, 1, 38, 27, 26, 24, 23,
+ 22, 2, 1, 25, 25, 25, 1, 25,
+ 26, 26, 26, 27, 27, 27, 27, 38,
+ 48, 38, 9, 1, 1, 38, 38, 2,
+ 1, 38, 38, 27, 26, 24, 23, 22,
+ 2, 1, 25, 25, 25, 25, 26, 26,
+ 26, 27, 27, 27, 27, 38, 48, 15,
+ 1, 9, 1, 37, 48, 38, 2, 1,
+ 22, 5
};
static const short _use_syllable_machine_index_offsets[] = {
- 0, 2, 47, 49, 82, 115, 117, 150,
- 183, 216, 236, 256, 276, 309, 342, 375,
- 408, 441, 474, 507, 540, 573, 606, 639,
- 672, 682, 684, 686, 719, 752, 785, 818,
- 838, 858, 878, 911, 944, 977, 1010, 1043,
- 1076, 1109, 1142, 1175, 1208, 1241, 1243, 1283,
- 1316, 1339, 1342, 1344
+ 0, 38, 54, 56, 94, 96, 146, 148,
+ 187, 226, 242, 244, 283, 311, 338, 363,
+ 387, 410, 413, 415, 441, 467, 493, 495,
+ 521, 548, 575, 602, 630, 658, 686, 714,
+ 753, 802, 841, 851, 853, 855, 894, 933,
+ 936, 938, 977, 1016, 1044, 1071, 1096, 1120,
+ 1143, 1146, 1148, 1174, 1200, 1226, 1252, 1279,
+ 1306, 1333, 1361, 1389, 1417, 1445, 1484, 1533,
+ 1549, 1551, 1561, 1563, 1601, 1650, 1689, 1692,
+ 1694, 1717
};
static const char _use_syllable_machine_indicies[] = {
- 1, 0, 2, 3, 4, 2, 5, 3,
- 4, 4, 6, 4, 4, 1, 7, 4,
- 4, 4, 2, 2, 8, 9, 4, 4,
- 10, 11, 12, 13, 14, 15, 16, 10,
- 17, 18, 19, 20, 21, 22, 4, 23,
- 24, 25, 4, 4, 4, 26, 4, 28,
- 27, 30, 29, 29, 31, 32, 29, 29,
- 29, 29, 29, 29, 29, 29, 33, 34,
- 35, 36, 37, 38, 39, 40, 34, 41,
- 33, 42, 43, 44, 45, 29, 46, 47,
- 48, 29, 30, 29, 29, 31, 32, 29,
- 29, 29, 29, 29, 29, 29, 29, 49,
- 34, 35, 36, 37, 38, 39, 40, 34,
- 41, 42, 42, 43, 44, 45, 29, 46,
- 47, 48, 29, 31, 50, 30, 29, 29,
- 31, 32, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 34, 35, 36, 37, 38,
- 39, 40, 34, 41, 42, 42, 43, 44,
- 45, 29, 46, 47, 48, 29, 30, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 34, 35, 36, 37,
- 38, 29, 29, 29, 29, 29, 29, 43,
- 44, 45, 29, 46, 47, 48, 29, 30,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 35, 36,
- 37, 38, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 46, 47, 48, 29,
- 30, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 36, 37, 38, 29, 30, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 37, 38, 29,
- 30, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 38, 29, 30, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 36, 37, 38, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 46, 47, 48, 29, 30, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 36, 37, 38,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 47, 48, 29, 30, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 36, 37,
- 38, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 48, 29, 30,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 35, 36,
- 37, 38, 29, 29, 29, 29, 29, 29,
- 43, 44, 45, 29, 46, 47, 48, 29,
- 30, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 35,
- 36, 37, 38, 29, 29, 29, 29, 29,
- 29, 29, 44, 45, 29, 46, 47, 48,
- 29, 30, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 35, 36, 37, 38, 29, 29, 29, 29,
- 29, 29, 29, 29, 45, 29, 46, 47,
- 48, 29, 30, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 34, 35, 36, 37, 38, 29, 40, 34,
- 29, 29, 29, 43, 44, 45, 29, 46,
- 47, 48, 29, 30, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 34, 35, 36, 37, 38, 29, 51,
- 34, 29, 29, 29, 43, 44, 45, 29,
- 46, 47, 48, 29, 30, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 34, 35, 36, 37, 38, 29,
- 29, 34, 29, 29, 29, 43, 44, 45,
- 29, 46, 47, 48, 29, 30, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 34, 35, 36, 37, 38,
- 39, 40, 34, 29, 29, 29, 43, 44,
- 45, 29, 46, 47, 48, 29, 30, 29,
- 29, 31, 32, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 34, 35, 36, 37,
- 38, 39, 40, 34, 41, 29, 42, 43,
- 44, 45, 29, 46, 47, 48, 29, 30,
- 29, 29, 31, 32, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 34, 35, 36,
- 37, 38, 39, 40, 34, 41, 33, 42,
- 43, 44, 45, 29, 46, 47, 48, 29,
- 53, 52, 52, 52, 52, 52, 52, 52,
- 54, 52, 5, 55, 53, 52, 6, 56,
- 56, 1, 57, 56, 56, 56, 56, 56,
- 56, 56, 56, 58, 10, 11, 12, 13,
- 14, 15, 16, 10, 17, 19, 19, 20,
- 21, 22, 56, 23, 24, 25, 56, 6,
- 56, 56, 1, 57, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 10, 11, 12,
- 13, 14, 15, 16, 10, 17, 19, 19,
- 20, 21, 22, 56, 23, 24, 25, 56,
- 6, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 10, 11,
- 12, 13, 14, 56, 56, 56, 56, 56,
- 56, 20, 21, 22, 56, 23, 24, 25,
- 56, 6, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 11, 12, 13, 14, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 23, 24,
- 25, 56, 6, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 12, 13, 14, 56, 6, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 13,
- 14, 56, 6, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 14, 56, 6, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 12, 13,
- 14, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 23, 24, 25, 56, 6,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 12,
- 13, 14, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 24, 25, 56,
- 6, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 12, 13, 14, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 25,
- 56, 6, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 11, 12, 13, 14, 56, 56, 56, 56,
- 56, 56, 20, 21, 22, 56, 23, 24,
- 25, 56, 6, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 11, 12, 13, 14, 56, 56, 56,
- 56, 56, 56, 56, 21, 22, 56, 23,
- 24, 25, 56, 6, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 11, 12, 13, 14, 56, 56,
- 56, 56, 56, 56, 56, 56, 22, 56,
- 23, 24, 25, 56, 6, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 10, 11, 12, 13, 14, 56,
- 16, 10, 56, 56, 56, 20, 21, 22,
- 56, 23, 24, 25, 56, 6, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 10, 11, 12, 13, 14,
- 56, 59, 10, 56, 56, 56, 20, 21,
- 22, 56, 23, 24, 25, 56, 6, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 10, 11, 12, 13,
- 14, 56, 56, 10, 56, 56, 56, 20,
- 21, 22, 56, 23, 24, 25, 56, 6,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 10, 11, 12,
- 13, 14, 15, 16, 10, 56, 56, 56,
- 20, 21, 22, 56, 23, 24, 25, 56,
- 6, 56, 56, 1, 57, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 10, 11,
- 12, 13, 14, 15, 16, 10, 17, 56,
- 19, 20, 21, 22, 56, 23, 24, 25,
- 56, 1, 60, 3, 56, 56, 56, 3,
- 56, 56, 6, 56, 56, 1, 57, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 10, 11, 12, 13, 14, 15, 16, 10,
- 17, 18, 19, 20, 21, 22, 56, 23,
- 24, 25, 56, 6, 56, 56, 1, 57,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 10, 11, 12, 13, 14, 15, 16,
- 10, 17, 18, 19, 20, 21, 22, 56,
- 23, 24, 25, 56, 62, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 61,
- 62, 63, 61, 62, 63, 61, 63, 61,
- 3, 60, 60, 60, 3, 60, 0
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 1, 0, 3, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 4, 2, 3, 2,
+ 6, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 5, 5, 5, 6, 5, 7, 5,
+ 8, 9, 10, 8, 11, 12, 10, 10,
+ 10, 10, 10, 3, 13, 14, 10, 15,
+ 8, 8, 16, 17, 10, 10, 18, 19,
+ 20, 21, 22, 23, 24, 18, 25, 26,
+ 27, 28, 29, 30, 10, 31, 32, 33,
+ 10, 34, 35, 36, 37, 38, 39, 40,
+ 13, 10, 42, 41, 44, 1, 43, 43,
+ 45, 43, 43, 43, 43, 43, 46, 47,
+ 48, 49, 50, 51, 52, 53, 47, 54,
+ 46, 55, 56, 57, 58, 43, 59, 60,
+ 61, 43, 43, 43, 43, 62, 63, 64,
+ 65, 1, 43, 44, 1, 43, 43, 45,
+ 43, 43, 43, 43, 43, 66, 47, 48,
+ 49, 50, 51, 52, 53, 47, 54, 55,
+ 55, 56, 57, 58, 43, 59, 60, 61,
+ 43, 43, 43, 43, 62, 63, 64, 65,
+ 1, 43, 44, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 68, 67, 44, 67, 44, 1, 43, 43,
+ 45, 43, 43, 43, 43, 43, 43, 47,
+ 48, 49, 50, 51, 52, 53, 47, 54,
+ 55, 55, 56, 57, 58, 43, 59, 60,
+ 61, 43, 43, 43, 43, 62, 63, 64,
+ 65, 1, 43, 47, 48, 49, 50, 51,
+ 43, 43, 43, 43, 43, 43, 56, 57,
+ 58, 43, 59, 60, 61, 43, 43, 43,
+ 43, 48, 63, 64, 65, 69, 43, 48,
+ 49, 50, 51, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 59, 60, 61,
+ 43, 43, 43, 43, 43, 63, 64, 65,
+ 69, 43, 49, 50, 51, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 63,
+ 64, 65, 43, 50, 51, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 63,
+ 64, 65, 43, 51, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 63, 64,
+ 65, 43, 63, 64, 43, 64, 43, 49,
+ 50, 51, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 59, 60, 61, 43,
+ 43, 43, 43, 43, 63, 64, 65, 69,
+ 43, 49, 50, 51, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 60,
+ 61, 43, 43, 43, 43, 43, 63, 64,
+ 65, 69, 43, 49, 50, 51, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 61, 43, 43, 43, 43, 43,
+ 63, 64, 65, 69, 43, 71, 70, 49,
+ 50, 51, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 63, 64, 65, 69,
+ 43, 48, 49, 50, 51, 43, 43, 43,
+ 43, 43, 43, 56, 57, 58, 43, 59,
+ 60, 61, 43, 43, 43, 43, 48, 63,
+ 64, 65, 69, 43, 48, 49, 50, 51,
+ 43, 43, 43, 43, 43, 43, 43, 57,
+ 58, 43, 59, 60, 61, 43, 43, 43,
+ 43, 48, 63, 64, 65, 69, 43, 48,
+ 49, 50, 51, 43, 43, 43, 43, 43,
+ 43, 43, 43, 58, 43, 59, 60, 61,
+ 43, 43, 43, 43, 48, 63, 64, 65,
+ 69, 43, 47, 48, 49, 50, 51, 43,
+ 53, 47, 43, 43, 43, 56, 57, 58,
+ 43, 59, 60, 61, 43, 43, 43, 43,
+ 48, 63, 64, 65, 69, 43, 47, 48,
+ 49, 50, 51, 43, 72, 47, 43, 43,
+ 43, 56, 57, 58, 43, 59, 60, 61,
+ 43, 43, 43, 43, 48, 63, 64, 65,
+ 69, 43, 47, 48, 49, 50, 51, 43,
+ 43, 47, 43, 43, 43, 56, 57, 58,
+ 43, 59, 60, 61, 43, 43, 43, 43,
+ 48, 63, 64, 65, 69, 43, 47, 48,
+ 49, 50, 51, 52, 53, 47, 43, 43,
+ 43, 56, 57, 58, 43, 59, 60, 61,
+ 43, 43, 43, 43, 48, 63, 64, 65,
+ 69, 43, 44, 1, 43, 43, 45, 43,
+ 43, 43, 43, 43, 43, 47, 48, 49,
+ 50, 51, 52, 53, 47, 54, 43, 55,
+ 56, 57, 58, 43, 59, 60, 61, 43,
+ 43, 43, 43, 62, 63, 64, 65, 1,
+ 43, 44, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 68,
+ 67, 67, 67, 67, 67, 67, 67, 48,
+ 49, 50, 51, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 59, 60, 61,
+ 67, 67, 67, 67, 67, 63, 64, 65,
+ 69, 67, 44, 1, 43, 43, 45, 43,
+ 43, 43, 43, 43, 43, 47, 48, 49,
+ 50, 51, 52, 53, 47, 54, 46, 55,
+ 56, 57, 58, 43, 59, 60, 61, 43,
+ 43, 43, 43, 62, 63, 64, 65, 1,
+ 43, 74, 73, 73, 73, 73, 73, 73,
+ 73, 75, 73, 11, 76, 74, 73, 44,
+ 1, 43, 43, 45, 43, 43, 43, 43,
+ 43, 77, 47, 48, 49, 50, 51, 52,
+ 53, 47, 54, 46, 55, 56, 57, 58,
+ 43, 59, 60, 61, 43, 78, 79, 43,
+ 62, 63, 64, 65, 1, 43, 44, 1,
+ 43, 43, 45, 43, 43, 43, 43, 43,
+ 43, 47, 48, 49, 50, 51, 52, 53,
+ 47, 54, 46, 55, 56, 57, 58, 43,
+ 59, 60, 61, 43, 78, 79, 43, 62,
+ 63, 64, 65, 1, 43, 78, 79, 80,
+ 79, 80, 3, 6, 81, 81, 82, 81,
+ 81, 81, 81, 81, 83, 18, 19, 20,
+ 21, 22, 23, 24, 18, 25, 27, 27,
+ 28, 29, 30, 81, 31, 32, 33, 81,
+ 81, 81, 81, 37, 38, 39, 40, 6,
+ 81, 3, 6, 81, 81, 82, 81, 81,
+ 81, 81, 81, 81, 18, 19, 20, 21,
+ 22, 23, 24, 18, 25, 27, 27, 28,
+ 29, 30, 81, 31, 32, 33, 81, 81,
+ 81, 81, 37, 38, 39, 40, 6, 81,
+ 18, 19, 20, 21, 22, 81, 81, 81,
+ 81, 81, 81, 28, 29, 30, 81, 31,
+ 32, 33, 81, 81, 81, 81, 19, 38,
+ 39, 40, 84, 81, 19, 20, 21, 22,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 31, 32, 33, 81, 81, 81,
+ 81, 81, 38, 39, 40, 84, 81, 20,
+ 21, 22, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 38, 39, 40, 81,
+ 21, 22, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 38, 39, 40, 81,
+ 22, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 38, 39, 40, 81, 38,
+ 39, 81, 39, 81, 20, 21, 22, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 31, 32, 33, 81, 81, 81, 81,
+ 81, 38, 39, 40, 84, 81, 20, 21,
+ 22, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 32, 33, 81, 81,
+ 81, 81, 81, 38, 39, 40, 84, 81,
+ 20, 21, 22, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 33,
+ 81, 81, 81, 81, 81, 38, 39, 40,
+ 84, 81, 20, 21, 22, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 38,
+ 39, 40, 84, 81, 19, 20, 21, 22,
+ 81, 81, 81, 81, 81, 81, 28, 29,
+ 30, 81, 31, 32, 33, 81, 81, 81,
+ 81, 19, 38, 39, 40, 84, 81, 19,
+ 20, 21, 22, 81, 81, 81, 81, 81,
+ 81, 81, 29, 30, 81, 31, 32, 33,
+ 81, 81, 81, 81, 19, 38, 39, 40,
+ 84, 81, 19, 20, 21, 22, 81, 81,
+ 81, 81, 81, 81, 81, 81, 30, 81,
+ 31, 32, 33, 81, 81, 81, 81, 19,
+ 38, 39, 40, 84, 81, 18, 19, 20,
+ 21, 22, 81, 24, 18, 81, 81, 81,
+ 28, 29, 30, 81, 31, 32, 33, 81,
+ 81, 81, 81, 19, 38, 39, 40, 84,
+ 81, 18, 19, 20, 21, 22, 81, 85,
+ 18, 81, 81, 81, 28, 29, 30, 81,
+ 31, 32, 33, 81, 81, 81, 81, 19,
+ 38, 39, 40, 84, 81, 18, 19, 20,
+ 21, 22, 81, 81, 18, 81, 81, 81,
+ 28, 29, 30, 81, 31, 32, 33, 81,
+ 81, 81, 81, 19, 38, 39, 40, 84,
+ 81, 18, 19, 20, 21, 22, 23, 24,
+ 18, 81, 81, 81, 28, 29, 30, 81,
+ 31, 32, 33, 81, 81, 81, 81, 19,
+ 38, 39, 40, 84, 81, 3, 6, 81,
+ 81, 82, 81, 81, 81, 81, 81, 81,
+ 18, 19, 20, 21, 22, 23, 24, 18,
+ 25, 81, 27, 28, 29, 30, 81, 31,
+ 32, 33, 81, 81, 81, 81, 37, 38,
+ 39, 40, 6, 81, 3, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 4, 81, 81, 81, 81, 81,
+ 81, 81, 19, 20, 21, 22, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 31, 32, 33, 81, 81, 81, 81, 81,
+ 38, 39, 40, 84, 81, 3, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 4, 86, 87, 81, 14,
+ 81, 81, 81, 81, 81, 81, 81, 88,
+ 81, 14, 81, 6, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 6, 86, 86, 86, 6,
+ 86, 9, 81, 81, 81, 9, 81, 81,
+ 81, 81, 81, 3, 6, 14, 81, 82,
+ 81, 81, 81, 81, 81, 81, 18, 19,
+ 20, 21, 22, 23, 24, 18, 25, 26,
+ 27, 28, 29, 30, 81, 31, 32, 33,
+ 81, 34, 35, 81, 37, 38, 39, 40,
+ 6, 81, 3, 6, 81, 81, 82, 81,
+ 81, 81, 81, 81, 81, 18, 19, 20,
+ 21, 22, 23, 24, 18, 25, 26, 27,
+ 28, 29, 30, 81, 31, 32, 33, 81,
+ 81, 81, 81, 37, 38, 39, 40, 6,
+ 81, 34, 35, 81, 35, 81, 78, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 78, 79, 80, 9, 86, 86,
+ 86, 9, 86, 0
};
static const char _use_syllable_machine_trans_targs[] = {
- 1, 27, 2, 3, 1, 24, 1, 45,
- 46, 48, 29, 30, 31, 32, 33, 40,
- 41, 43, 47, 44, 37, 38, 39, 34,
- 35, 36, 51, 1, 1, 1, 1, 4,
- 5, 23, 7, 8, 9, 10, 11, 18,
- 19, 21, 22, 15, 16, 17, 12, 13,
- 14, 6, 1, 20, 1, 25, 26, 1,
- 1, 0, 28, 42, 1, 1, 49, 50
+ 5, 9, 5, 41, 2, 5, 1, 53,
+ 6, 7, 5, 34, 37, 63, 64, 67,
+ 68, 72, 43, 44, 45, 46, 47, 57,
+ 58, 60, 69, 61, 54, 55, 56, 50,
+ 51, 52, 70, 71, 73, 62, 48, 49,
+ 5, 5, 5, 5, 8, 0, 33, 12,
+ 13, 14, 15, 16, 27, 28, 30, 31,
+ 24, 25, 26, 19, 20, 21, 32, 17,
+ 18, 5, 11, 5, 10, 22, 5, 23,
+ 29, 5, 35, 36, 5, 38, 39, 40,
+ 5, 5, 3, 42, 4, 59, 5, 65,
+ 66
};
static const char _use_syllable_machine_trans_actions[] = {
- 1, 2, 0, 0, 5, 0, 6, 0,
- 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 2, 0, 0, 0, 0,
- 0, 0, 0, 7, 8, 9, 10, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 2, 3, 0, 4, 0, 5,
+ 0, 5, 8, 0, 5, 9, 0, 9,
+ 3, 0, 5, 5, 0, 0, 0, 5,
+ 5, 5, 3, 3, 5, 5, 5, 5,
+ 5, 5, 0, 0, 0, 3, 0, 0,
+ 10, 11, 12, 13, 5, 0, 5, 0,
+ 0, 0, 0, 0, 0, 0, 0, 5,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 11, 0, 12, 0, 0, 13,
- 14, 0, 2, 0, 15, 16, 0, 0
+ 0, 14, 5, 15, 0, 0, 16, 0,
+ 0, 17, 0, 0, 18, 5, 0, 0,
+ 19, 20, 0, 3, 0, 5, 21, 0,
+ 0
};
static const char _use_syllable_machine_to_state_actions[] = {
- 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0
+ 0, 0
};
static const char _use_syllable_machine_from_state_actions[] = {
- 0, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 7, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0
};
static const short _use_syllable_machine_eof_trans[] = {
- 1, 0, 28, 30, 30, 51, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 53, 56, 53, 57, 57, 57, 57, 57,
- 57, 57, 57, 57, 57, 57, 57, 57,
- 57, 57, 57, 57, 57, 61, 57, 57,
- 62, 62, 62, 61
+ 1, 3, 3, 6, 6, 0, 42, 44,
+ 44, 68, 68, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 71, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 68, 44, 74, 77, 74, 44, 44, 81,
+ 81, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 87,
+ 82, 82, 82, 87, 82, 82, 82, 82,
+ 81, 87
};
-static const int use_syllable_machine_start = 1;
-static const int use_syllable_machine_first_final = 1;
+static const int use_syllable_machine_start = 5;
+static const int use_syllable_machine_first_final = 5;
static const int use_syllable_machine_error = -1;
-static const int use_syllable_machine_en_main = 1;
+static const int use_syllable_machine_en_main = 5;
#line 38 "hb-ot-shape-complex-use-machine.rl"
-#line 140 "hb-ot-shape-complex-use-machine.rl"
+#line 162 "hb-ot-shape-complex-use-machine.rl"
#define found_syllable(syllable_type) \
HB_STMT_START { \
- if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \
- for (unsigned int i = last; i < p+1; i++) \
- info[i].syllable() = (syllable_serial << 4) | syllable_type; \
- last = p+1; \
+ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+ for (unsigned int i = ts; i < te; i++) \
+ info[i].syllable() = (syllable_serial << 4) | use_##syllable_type; \
syllable_serial++; \
if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
} HB_STMT_END
static void
-find_syllables (hb_buffer_t *buffer)
+find_syllables_use (hb_buffer_t *buffer)
{
- unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED;
+ unsigned int p, pe, eof, ts, te, act;
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 324 "hb-ot-shape-complex-use-machine.hh"
+#line 396 "hb-ot-shape-complex-use-machine.hh"
{
cs = use_syllable_machine_start;
ts = 0;
@@ -328,16 +400,15 @@ find_syllables (hb_buffer_t *buffer)
act = 0;
}
-#line 161 "hb-ot-shape-complex-use-machine.rl"
+#line 182 "hb-ot-shape-complex-use-machine.rl"
p = 0;
pe = eof = buffer->len;
- unsigned int last = 0;
unsigned int syllable_serial = 1;
-#line 341 "hb-ot-shape-complex-use-machine.hh"
+#line 412 "hb-ot-shape-complex-use-machine.hh"
{
int _slen;
int _trans;
@@ -347,11 +418,11 @@ find_syllables (hb_buffer_t *buffer)
goto _test_eof;
_resume:
switch ( _use_syllable_machine_from_state_actions[cs] ) {
- case 4:
+ case 7:
#line 1 "NONE"
{ts = p;}
break;
-#line 355 "hb-ot-shape-complex-use-machine.hh"
+#line 426 "hb-ot-shape-complex-use-machine.hh"
}
_keys = _use_syllable_machine_trans_keys + (cs<<1);
@@ -369,72 +440,104 @@ _eof_trans:
goto _again;
switch ( _use_syllable_machine_trans_actions[_trans] ) {
- case 2:
+ case 5:
#line 1 "NONE"
{te = p+1;}
break;
- case 8:
-#line 129 "hb-ot-shape-complex-use-machine.rl"
+ case 12:
+#line 150 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (independent_cluster); }}
break;
- case 10:
-#line 131 "hb-ot-shape-complex-use-machine.rl"
+ case 14:
+#line 153 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (standard_cluster); }}
break;
- case 6:
-#line 135 "hb-ot-shape-complex-use-machine.rl"
+ case 10:
+#line 157 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (broken_cluster); }}
break;
- case 5:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
+ case 8:
+#line 158 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (non_cluster); }}
break;
- case 7:
-#line 129 "hb-ot-shape-complex-use-machine.rl"
+ case 11:
+#line 150 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (independent_cluster); }}
break;
- case 11:
-#line 130 "hb-ot-shape-complex-use-machine.rl"
+ case 15:
+#line 151 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
break;
- case 9:
-#line 131 "hb-ot-shape-complex-use-machine.rl"
- {te = p;p--;{ found_syllable (standard_cluster); }}
+ case 16:
+#line 152 "hb-ot-shape-complex-use-machine.rl"
+ {te = p;p--;{ found_syllable (sakot_terminated_cluster); }}
break;
case 13:
-#line 132 "hb-ot-shape-complex-use-machine.rl"
+#line 153 "hb-ot-shape-complex-use-machine.rl"
+ {te = p;p--;{ found_syllable (standard_cluster); }}
+ break;
+ case 18:
+#line 154 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
break;
- case 12:
-#line 133 "hb-ot-shape-complex-use-machine.rl"
+ case 17:
+#line 155 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (numeral_cluster); }}
break;
- case 16:
-#line 134 "hb-ot-shape-complex-use-machine.rl"
+ case 19:
+#line 156 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (symbol_cluster); }}
break;
- case 14:
-#line 135 "hb-ot-shape-complex-use-machine.rl"
+ case 20:
+#line 157 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
- case 15:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
+ case 21:
+#line 158 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (non_cluster); }}
break;
case 1:
-#line 135 "hb-ot-shape-complex-use-machine.rl"
+#line 153 "hb-ot-shape-complex-use-machine.rl"
+ {{p = ((te))-1;}{ found_syllable (standard_cluster); }}
+ break;
+ case 4:
+#line 157 "hb-ot-shape-complex-use-machine.rl"
{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
break;
-#line 429 "hb-ot-shape-complex-use-machine.hh"
+ case 2:
+#line 1 "NONE"
+ { switch( act ) {
+ case 8:
+ {{p = ((te))-1;} found_syllable (broken_cluster); }
+ break;
+ case 9:
+ {{p = ((te))-1;} found_syllable (non_cluster); }
+ break;
+ }
+ }
+ break;
+ case 3:
+#line 1 "NONE"
+ {te = p+1;}
+#line 157 "hb-ot-shape-complex-use-machine.rl"
+ {act = 8;}
+ break;
+ case 9:
+#line 1 "NONE"
+ {te = p+1;}
+#line 158 "hb-ot-shape-complex-use-machine.rl"
+ {act = 9;}
+ break;
+#line 532 "hb-ot-shape-complex-use-machine.hh"
}
_again:
switch ( _use_syllable_machine_to_state_actions[cs] ) {
- case 3:
+ case 6:
#line 1 "NONE"
{ts = 0;}
break;
-#line 438 "hb-ot-shape-complex-use-machine.hh"
+#line 541 "hb-ot-shape-complex-use-machine.hh"
}
if ( ++p != pe )
@@ -450,7 +553,7 @@ _again:
}
-#line 170 "hb-ot-shape-complex-use-machine.rl"
+#line 190 "hb-ot-shape-complex-use-machine.rl"
}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-machine.rl b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-machine.rl
new file mode 100644
index 0000000000..9b75b5c6e2
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-machine.rl
@@ -0,0 +1,195 @@
+/*
+ * Copyright © 2015 Mozilla Foundation.
+ * Copyright © 2015 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Mozilla Author(s): Jonathan Kew
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
+
+#include "hb.hh"
+
+%%{
+ machine use_syllable_machine;
+ alphtype unsigned char;
+ write data;
+}%%
+
+%%{
+
+# Same order as enum use_category_t. Not sure how to avoid duplication.
+
+O = 0; # OTHER
+
+B = 1; # BASE
+IND = 3; # BASE_IND
+N = 4; # BASE_NUM
+GB = 5; # BASE_OTHER
+CGJ = 6; # CGJ
+#F = 7; # CONS_FINAL
+#FM = 8; # CONS_FINAL_MOD
+#M = 9; # CONS_MED
+#CM = 10; # CONS_MOD
+SUB = 11; # CONS_SUB
+H = 12; # HALANT
+
+HN = 13; # HALANT_NUM
+ZWNJ = 14; # Zero width non-joiner
+ZWJ = 15; # Zero width joiner
+WJ = 16; # Word joiner
+Rsv = 17; # Reserved characters
+R = 18; # REPHA
+S = 19; # SYM
+#SM = 20; # SYM_MOD
+VS = 21; # VARIATION_SELECTOR
+#V = 36; # VOWEL
+#VM = 40; # VOWEL_MOD
+CS = 43; # CONS_WITH_STACKER
+HVM = 44; # HALANT_OR_VOWEL_MODIFIER
+Sk = 48; # SAKOT
+
+FAbv = 24; # CONS_FINAL_ABOVE
+FBlw = 25; # CONS_FINAL_BELOW
+FPst = 26; # CONS_FINAL_POST
+MAbv = 27; # CONS_MED_ABOVE
+MBlw = 28; # CONS_MED_BELOW
+MPst = 29; # CONS_MED_POST
+MPre = 30; # CONS_MED_PRE
+CMAbv = 31; # CONS_MOD_ABOVE
+CMBlw = 32; # CONS_MOD_BELOW
+VAbv = 33; # VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST
+VBlw = 34; # VOWEL_BELOW / VOWEL_BELOW_POST
+VPst = 35; # VOWEL_POST UIPC = Right
+VPre = 22; # VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST
+VMAbv = 37; # VOWEL_MOD_ABOVE
+VMBlw = 38; # VOWEL_MOD_BELOW
+VMPst = 39; # VOWEL_MOD_POST
+VMPre = 23; # VOWEL_MOD_PRE
+SMAbv = 41; # SYM_MOD_ABOVE
+SMBlw = 42; # SYM_MOD_BELOW
+FMAbv = 45; # CONS_FINAL_MOD UIPC = Top
+FMBlw = 46; # CONS_FINAL_MOD UIPC = Bottom
+FMPst = 47; # CONS_FINAL_MOD UIPC = Not_Applicable
+
+h = H | HVM | Sk;
+
+# Override: Adhoc ZWJ placement. https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729
+consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.h.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*;
+# Override: Allow two MBlw. https://github.com/harfbuzz/harfbuzz/issues/376
+medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?;
+dependent_vowels = VPre* VAbv* VBlw* VPst*;
+vowel_modifiers = HVM? VMPre* VMAbv* VMBlw* VMPst*;
+final_consonants = FAbv* FBlw* FPst*;
+final_modifiers = FMAbv* FMBlw* | FMPst?;
+
+complex_syllable_start = (R | CS)? (B | GB) VS?;
+complex_syllable_middle =
+ consonant_modifiers
+ medial_consonants
+ dependent_vowels
+ vowel_modifiers
+ (Sk B)*
+;
+complex_syllable_tail =
+ complex_syllable_middle
+ final_consonants
+ final_modifiers
+;
+number_joiner_terminated_cluster_tail = (HN N VS?)* HN;
+numeral_cluster_tail = (HN N VS?)+;
+symbol_cluster_tail = SMAbv+ SMBlw* | SMBlw+;
+
+virama_terminated_cluster =
+ complex_syllable_start
+ consonant_modifiers
+ ZWJ?.h.ZWJ?
+;
+sakot_terminated_cluster =
+ complex_syllable_start
+ complex_syllable_middle
+ Sk
+;
+standard_cluster =
+ complex_syllable_start
+ complex_syllable_tail
+;
+broken_cluster =
+ R?
+ (complex_syllable_tail | number_joiner_terminated_cluster_tail | numeral_cluster_tail | symbol_cluster_tail)
+;
+
+number_joiner_terminated_cluster = N VS? number_joiner_terminated_cluster_tail;
+numeral_cluster = N VS? numeral_cluster_tail?;
+symbol_cluster = (S | GB) VS? symbol_cluster_tail?;
+independent_cluster = (IND | O | Rsv | WJ) VS?;
+other = any;
+
+main := |*
+ independent_cluster => { found_syllable (independent_cluster); };
+ virama_terminated_cluster => { found_syllable (virama_terminated_cluster); };
+ sakot_terminated_cluster => { found_syllable (sakot_terminated_cluster); };
+ standard_cluster => { found_syllable (standard_cluster); };
+ number_joiner_terminated_cluster => { found_syllable (number_joiner_terminated_cluster); };
+ numeral_cluster => { found_syllable (numeral_cluster); };
+ symbol_cluster => { found_syllable (symbol_cluster); };
+ broken_cluster => { found_syllable (broken_cluster); };
+ other => { found_syllable (non_cluster); };
+*|;
+
+
+}%%
+
+#define found_syllable(syllable_type) \
+ HB_STMT_START { \
+ if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+ for (unsigned int i = ts; i < te; i++) \
+ info[i].syllable() = (syllable_serial << 4) | use_##syllable_type; \
+ syllable_serial++; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+ } HB_STMT_END
+
+static void
+find_syllables_use (hb_buffer_t *buffer)
+{
+ unsigned int p, pe, eof, ts, te, act;
+ int cs;
+ hb_glyph_info_t *info = buffer->info;
+ %%{
+ write init;
+ getkey info[p].use_category();
+ }%%
+
+ p = 0;
+ pe = eof = buffer->len;
+
+ unsigned int syllable_serial = 1;
+ %%{
+ write exec;
+ }%%
+}
+
+#undef found_syllable
+
+#endif /* HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-private.hh
deleted file mode 100644
index 3e763ae393..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-private.hh
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright © 2015 Mozilla Foundation.
- * Copyright © 2015 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Mozilla Author(s): Jonathan Kew
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_SHAPE_COMPLEX_USE_PRIVATE_HH
-#define HB_OT_SHAPE_COMPLEX_USE_PRIVATE_HH
-
-#include "hb-private.hh"
-
-
-#include "hb-ot-shape-complex-private.hh"
-
-
-#define USE_TABLE_ELEMENT_TYPE uint8_t
-
-/* Cateories used in the Universal Shaping Engine spec:
- * https://www.microsoft.com/typography/OpenTypeDev/USE/intro.htm
- */
-/* Note: This enum is duplicated in the -machine.rl source file.
- * Not sure how to avoid duplication. */
-enum use_category_t {
- USE_O = 0, /* OTHER */
-
- USE_B = 1, /* BASE */
- USE_IND = 3, /* BASE_IND */
- USE_N = 4, /* BASE_NUM */
- USE_GB = 5, /* BASE_OTHER */
- USE_CGJ = 6, /* CGJ */
-// USE_F = 7, /* CONS_FINAL */
- USE_FM = 8, /* CONS_FINAL_MOD */
-// USE_M = 9, /* CONS_MED */
-// USE_CM = 10, /* CONS_MOD */
- USE_SUB = 11, /* CONS_SUB */
- USE_H = 12, /* HALANT */
-
- USE_HN = 13, /* HALANT_NUM */
- USE_ZWNJ = 14, /* Zero width non-joiner */
- USE_ZWJ = 15, /* Zero width joiner */
- USE_WJ = 16, /* Word joiner */
- USE_Rsv = 17, /* Reserved characters */
- USE_R = 18, /* REPHA */
- USE_S = 19, /* SYM */
-// USE_SM = 20, /* SYM_MOD */
- USE_VS = 21, /* VARIATION_SELECTOR */
-// USE_V = 36, /* VOWEL */
-// USE_VM = 40, /* VOWEL_MOD */
-
- USE_FAbv = 24, /* CONS_FINAL_ABOVE */
- USE_FBlw = 25, /* CONS_FINAL_BELOW */
- USE_FPst = 26, /* CONS_FINAL_POST */
- USE_MAbv = 27, /* CONS_MED_ABOVE */
- USE_MBlw = 28, /* CONS_MED_BELOW */
- USE_MPst = 29, /* CONS_MED_POST */
- USE_MPre = 30, /* CONS_MED_PRE */
- USE_CMAbv = 31, /* CONS_MOD_ABOVE */
- USE_CMBlw = 32, /* CONS_MOD_BELOW */
- USE_VAbv = 33, /* VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST */
- USE_VBlw = 34, /* VOWEL_BELOW / VOWEL_BELOW_POST */
- USE_VPst = 35, /* VOWEL_POST UIPC = Right */
- USE_VPre = 22, /* VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST */
- USE_VMAbv = 37, /* VOWEL_MOD_ABOVE */
- USE_VMBlw = 38, /* VOWEL_MOD_BELOW */
- USE_VMPst = 39, /* VOWEL_MOD_POST */
- USE_VMPre = 23, /* VOWEL_MOD_PRE */
- USE_SMAbv = 41, /* SYM_MOD_ABOVE */
- USE_SMBlw = 42, /* SYM_MOD_BELOW */
- USE_CS = 43 /* CONS_WITH_STACKER */
-};
-
-HB_INTERNAL USE_TABLE_ELEMENT_TYPE
-hb_use_get_categories (hb_codepoint_t u);
-
-#endif /* HB_OT_SHAPE_COMPLEX_USE_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-table.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-table.cc
index fd6978f281..e3889b3e60 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-table.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use-table.cc
@@ -6,24 +6,30 @@
*
* on files with these headers:
*
- * # IndicSyllabicCategory-10.0.0.txt
- * # Date: 2017-05-31, 01:07:00 GMT [KW, RP]
- * # IndicPositionalCategory-10.0.0.txt
- * # Date: 2017-05-31, 01:07:00 GMT [RP]
- * # Blocks-10.0.0.txt
- * # Date: 2017-04-12, 17:30:00 GMT [KW]
+ * # IndicSyllabicCategory-12.0.0.txt
+ * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
+ * # IndicPositionalCategory-12.0.0.txt
+ * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
+ * # Blocks-12.0.0.txt
+ * # Date: 2018-07-30, 19:40:00 GMT [KW]
* UnicodeData.txt does not have a header.
*/
-#include "hb-ot-shape-complex-use-private.hh"
+#include "hb.hh"
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex-use.hh"
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-macros"
#define B USE_B /* BASE */
#define CGJ USE_CGJ /* CGJ */
#define CS USE_CS /* CONS_WITH_STACKER */
-#define FM USE_FM /* CONS_FINAL_MOD */
#define GB USE_GB /* BASE_OTHER */
#define H USE_H /* HALANT */
#define HN USE_HN /* HALANT_NUM */
+#define HVM USE_HVM /* HALANT_OR_VOWEL_MODIFIER */
#define IND USE_IND /* BASE_IND */
#define N USE_N /* BASE_NUM */
#define O USE_O /* OTHER */
@@ -31,6 +37,7 @@
#define Rsv USE_Rsv /* Reserved */
#define S USE_S /* SYM */
#define SUB USE_SUB /* CONS_SUB */
+#define Sk USE_Sk /* SAKOT */
#define VS USE_VS /* VARIATION_SELECTOR */
#define WJ USE_WJ /* Word_Joiner */
#define ZWJ USE_ZWJ /* ZWJ */
@@ -40,6 +47,9 @@
#define FBlw USE_FBlw
#define FPst USE_FPst
#define FAbv USE_FAbv
+#define FMBlw USE_FMBlw
+#define FMPst USE_FMPst
+#define FMAbv USE_FMAbv
#define MPre USE_MPre
#define MBlw USE_MBlw
#define MPst USE_MPst
@@ -54,6 +64,7 @@
#define VMBlw USE_VMBlw
#define VMPst USE_VMPst
#define VMAbv USE_VMAbv
+#pragma GCC diagnostic pop
static const USE_TABLE_ELEMENT_TYPE use_table[] = {
@@ -71,11 +82,17 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Latin-1 Supplement */
/* 00A0 */ GB, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- /* 00B0 */ O, O, FM, FM, O, O, O, O, O, O, O, O, O, O, O, O,
+ /* 00B0 */ O, O, FMPst, FMPst, O, O, O, O, O, O, O, O, O, O, O, O,
/* 00C0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* 00D0 */ O, O, O, O, O, O, O, GB,
-#define use_offset_0x0900u 80
+#define use_offset_0x0348u 80
+
+
+ /* Combining Diacritical Marks */
+ O, O, O, O, O, O, O, CGJ,
+
+#define use_offset_0x0900u 88
/* Devanagari */
@@ -91,14 +108,14 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Bengali */
- /* 0980 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B,
+ /* 0980 */ GB, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B,
/* 0990 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 09A0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 09B0 */ B, O, B, O, O, O, B, B, B, B, O, O, CMBlw, B, VPst, VPre,
- /* 09C0 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPre, VPre, H, IND, O,
+ /* 09C0 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPst, VPst, H, IND, O,
/* 09D0 */ O, O, O, O, O, O, O, VPst, O, O, O, O, B, B, O, B,
/* 09E0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
- /* 09F0 */ B, B, O, O, O, O, O, O, O, O, O, O, B, O, O, O,
+ /* 09F0 */ B, B, O, O, O, O, O, O, O, O, O, O, B, O, FMAbv, O,
/* Gurmukhi */
@@ -107,7 +124,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 0A20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0A30 */ B, O, B, B, O, B, B, O, B, B, O, O, CMBlw, O, VPst, VPre,
/* 0A40 */ VPst, VBlw, VBlw, O, O, O, O, VAbv, VAbv, O, O, VAbv, VAbv, H, O, O,
- /* 0A50 */ O, O, O, O, O, O, O, O, O, B, B, B, B, O, B, O,
+ /* 0A50 */ O, VMBlw, O, O, O, O, O, O, O, B, B, B, B, O, B, O,
/* 0A60 */ O, O, O, O, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0A70 */ VMAbv, CMAbv, GB, GB, O, MBlw, O, O, O, O, O, O, O, O, O, O,
@@ -128,7 +145,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 0B10 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0B20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0B30 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VAbv,
- /* 0B40 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPre, VPre, H, O, O,
+ /* 0B40 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPst, O, O, VPst, VPst, H, O, O,
/* 0B50 */ O, O, O, O, O, O, VAbv, VAbv, O, O, O, O, B, B, O, B,
/* 0B60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0B70 */ O, B, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@@ -139,14 +156,14 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 0B90 */ B, O, B, B, B, B, O, O, O, B, B, O, B, O, B, B,
/* 0BA0 */ O, O, O, B, B, O, O, O, B, B, B, O, O, O, B, B,
/* 0BB0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, VPst, VPst,
- /* 0BC0 */ VAbv, VPst, VPst, O, O, O, VPre, VPre, VPre, O, VPre, VPre, VPre, H, O, O,
+ /* 0BC0 */ VAbv, VPst, VPst, O, O, O, VPre, VPre, VPre, O, VPst, VPst, VPst, H, O, O,
/* 0BD0 */ O, O, O, O, O, O, O, VPst, O, O, O, O, O, O, O, O,
/* 0BE0 */ O, O, O, O, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0BF0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Telugu */
- /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B,
+ /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, VMAbv, B, B, B, B, B, B, B, B, O, B, B,
/* 0C10 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0C20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0C30 */ B, B, B, B, B, B, B, B, B, B, O, O, O, B, VAbv, VAbv,
@@ -157,7 +174,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Kannada */
- /* 0C80 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B,
+ /* 0C80 */ B, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B,
/* 0C90 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0CA0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0CB0 */ B, B, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VAbv,
@@ -172,7 +189,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 0D10 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0D20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0D30 */ B, B, B, B, B, B, B, B, B, B, B, VAbv, VAbv, B, VPst, VPst,
- /* 0D40 */ VPst, VPst, VPst, VBlw, VBlw, O, VPre, VPre, VPre, O, VPre, VPre, VPre, H, R, O,
+ /* 0D40 */ VPst, VPst, VPst, VBlw, VBlw, O, VPre, VPre, VPre, O, VPst, VPst, VPst, H, R, O,
/* 0D50 */ O, O, O, O, IND, IND, IND, VPst, O, O, O, O, O, O, O, B,
/* 0D60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0D70 */ O, O, O, O, O, O, O, O, O, O, IND, IND, IND, IND, IND, IND,
@@ -184,11 +201,28 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 0DA0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0DB0 */ B, B, O, B, B, B, B, B, B, B, B, B, O, B, O, O,
/* 0DC0 */ B, B, B, B, B, B, B, O, O, O, H, O, O, O, O, VPst,
- /* 0DD0 */ VPst, VPst, VAbv, VAbv, VBlw, O, VBlw, O, VPst, VPre, VPre, VPre, VPre, VPre, VPre, VPst,
+ /* 0DD0 */ VPst, VPst, VAbv, VAbv, VBlw, O, VBlw, O, VPst, VPre, VPst, VPre, VPst, VPst, VPst, VPst,
/* 0DE0 */ O, O, O, O, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0DF0 */ O, O, VPst, VPst, O, O, O, O,
-#define use_offset_0x1000u 1352
+#define use_offset_0x0f18u 1360
+
+
+ /* Tibetan */
+ VBlw, VBlw, O, O, O, O, O, O,
+ /* 0F20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0F30 */ B, B, B, B, O, FMBlw, O, FMBlw, O, CMAbv, O, O, O, O, VPst, VPre,
+ /* 0F40 */ B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, B,
+ /* 0F50 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0F60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, O, O,
+ /* 0F70 */ O, VBlw, VBlw, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VMAbv, VMPst,
+ /* 0F80 */ VBlw, VAbv, VMAbv, VMAbv, VBlw, IND, VMAbv, VMAbv, B, B, B, B, B, SUB, SUB, SUB,
+ /* 0F90 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
+ /* 0FA0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
+ /* 0FB0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, O, O,
+ /* 0FC0 */ O, O, O, O, O, O, FMBlw, O,
+
+#define use_offset_0x1000u 1536
/* Myanmar */
@@ -197,14 +231,14 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 1010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1020 */ B, B, B, B, B, B, B, B, B, B, B, VPst, VPst, VAbv, VAbv, VBlw,
/* 1030 */ VBlw, VPre, VAbv, VAbv, VAbv, VAbv, VMAbv, VMBlw, VMPst, H, VAbv, MPst, MPre, MBlw, MBlw, B,
- /* 1040 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, GB, O,
+ /* 1040 */ B, B, B, B, B, B, B, B, B, B, O, GB, O, O, GB, O,
/* 1050 */ B, B, B, B, B, B, VPst, VPst, VBlw, VBlw, B, B, B, B, MBlw, MBlw,
/* 1060 */ MBlw, B, VPst, VMPst, VMPst, B, B, VPst, VPst, VMPst, VMPst, VMPst, VMPst, VMPst, B, B,
/* 1070 */ B, VAbv, VAbv, VAbv, VAbv, B, B, B, B, B, B, B, B, B, B, B,
/* 1080 */ B, B, MBlw, VPst, VPre, VAbv, VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw, B, VMPst,
/* 1090 */ B, B, B, B, B, B, B, B, B, B, VMPst, VMPst, VPst, VAbv, O, O,
-#define use_offset_0x1700u 1512
+#define use_offset_0x1700u 1696
/* Tagalog */
@@ -232,12 +266,12 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 1780 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1790 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 17A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 17B0 */ B, B, B, B, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPre, VPre,
- /* 17C0 */ VPre, VPre, VPre, VPre, VPre, VPre, VMAbv, VMPst, VPst, VMAbv, VMAbv, FM, FAbv, CMAbv, FM, FM,
- /* 17D0 */ FM, VAbv, H, FM, O, O, O, O, O, O, O, O, B, VAbv, O, O,
+ /* 17B0 */ B, B, B, B, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPst, VPst,
+ /* 17C0 */ VPst, VPre, VPre, VPre, VPst, VPst, VMAbv, VMPst, VPst, VMAbv, VMAbv, FMAbv, FAbv, CMAbv, FMAbv, FMAbv,
+ /* 17D0 */ FMAbv, VAbv, H, FMAbv, O, O, O, O, O, O, O, O, B, FMAbv, O, O,
/* 17E0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
-#define use_offset_0x1900u 1752
+#define use_offset_0x1900u 1936
/* Limbu */
@@ -245,7 +279,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 1900 */ GB, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1910 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, O,
/* 1920 */ VAbv, VAbv, VBlw, VPst, VPst, VAbv, VAbv, VAbv, VAbv, SUB, SUB, SUB, O, O, O, O,
- /* 1930 */ FPst, FPst, VMBlw, FPst, FPst, FPst, FPst, FPst, FPst, FBlw, VAbv, FM, O, O, O, O,
+ /* 1930 */ FPst, FPst, VMBlw, FPst, FPst, FPst, FPst, FPst, FPst, FBlw, VAbv, FMBlw, O, O, O, O,
/* 1940 */ O, O, O, O, O, O, B, B, B, B, B, B, B, B, B, B,
/* Tai Le */
@@ -261,7 +295,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 19A0 */ B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, O,
/* 19B0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 19C0 */ B, B, B, B, B, B, B, B, VMPst, VMPst, O, O, O, O, O, O,
- /* 19D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
+ /* 19D0 */ B, B, B, B, B, B, B, B, B, B, B, O, O, O, O, O,
/* 19E0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* 19F0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@@ -275,13 +309,13 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 1A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1A30 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 1A50 */ B, B, B, B, B, MPre, MBlw, SUB, FAbv, FAbv, FAbv, SUB, SUB, SUB, SUB, O,
- /* 1A60 */ H, VPst, VAbv, VPst, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre,
- /* 1A70 */ VPre, VPre, VPre, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VAbv, FM, FM, O, O, FBlw,
+ /* 1A50 */ B, B, B, B, B, MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, SUB, SUB, SUB, O,
+ /* 1A60 */ Sk, VPst, VAbv, VPst, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre,
+ /* 1A70 */ VPre, VPre, VPre, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VAbv, FMAbv, FMAbv, O, O, FMBlw,
/* 1A80 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
/* 1A90 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
-#define use_offset_0x1b00u 2168
+#define use_offset_0x1b00u 2352
/* Balinese */
@@ -290,9 +324,9 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 1B10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1B20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1B30 */ B, B, B, B, CMAbv, VPst, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VPre, VPre,
- /* 1B40 */ VPre, VPre, VAbv, VAbv, H, B, B, B, B, B, B, B, O, O, O, O,
- /* 1B50 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
- /* 1B60 */ O, O, O, O, O, O, O, O, O, O, O, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv,
+ /* 1B40 */ VPst, VPst, VAbv, VAbv, H, B, B, B, B, B, B, B, O, O, O, O,
+ /* 1B50 */ B, B, B, B, B, B, B, B, B, B, O, GB, GB, O, O, GB,
+ /* 1B60 */ O, S, GB, S, S, S, S, S, GB, S, S, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv,
/* 1B70 */ SMAbv, SMAbv, SMAbv, SMAbv, O, O, O, O, O, O, O, O, O, O, O, O,
/* Sundanese */
@@ -307,60 +341,66 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 1BC0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1BD0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1BE0 */ B, B, B, B, B, B, CMAbv, VPst, VAbv, VAbv, VPst, VPst, VPst, VAbv, VPst, VAbv,
- /* 1BF0 */ FAbv, FAbv, VPst, VPst, O, O, O, O, O, O, O, O, O, O, O, O,
+ /* 1BF0 */ FAbv, FAbv, CMBlw, CMBlw, O, O, O, O, O, O, O, O, O, O, O, O,
/* Lepcha */
/* 1C00 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1C10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1C20 */ B, B, B, B, SUB, SUB, VPst, VPre, VPre, VPre, VPst, VPst, VBlw, FAbv, FAbv, FAbv,
- /* 1C30 */ FAbv, FAbv, FAbv, FAbv, VMPre, VMPre, FM, CMBlw, O, O, O, O, O, O, O, O,
+ /* 1C30 */ FAbv, FAbv, FAbv, FAbv, VMPre, VMPre, FMAbv, CMBlw, O, O, O, O, O, O, O, O,
/* 1C40 */ B, B, B, B, B, B, B, B, B, B, O, O, O, B, B, B,
-#define use_offset_0x1cd0u 2504
+#define use_offset_0x1cd0u 2688
/* Vedic Extensions */
/* 1CD0 */ VMAbv, VMAbv, VMAbv, O, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMAbv, VMAbv, VMBlw, VMBlw, VMBlw, VMBlw,
/* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, O, O, O, O, VMBlw, O, O,
- /* 1CF0 */ O, O, VMPst, VMPst, VMAbv, O, O, VMPst, VMAbv, VMAbv, O, O, O, O, O, O,
+ /* 1CF0 */ O, O, IND, IND, VMAbv, CS, CS, VMPst, VMAbv, VMAbv, GB, O, O, O, O, O,
-#define use_offset_0x1df8u 2552
+#define use_offset_0x1df8u 2736
/* Combining Diacritical Marks Supplement */
- O, O, O, FM, O, O, O, O,
+ O, O, O, FMAbv, O, O, O, O,
-#define use_offset_0x2008u 2560
+#define use_offset_0x2008u 2744
/* General Punctuation */
O, O, O, O, ZWNJ, ZWJ, O, O,
/* 2010 */ GB, GB, GB, GB, GB, O, O, O,
-#define use_offset_0x2060u 2576
+#define use_offset_0x2060u 2760
/* 2060 */ WJ, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Superscripts and Subscripts */
- /* 2070 */ O, O, O, O, FM, O, O, O, O, O, O, O, O, O, O, O,
- /* 2080 */ O, O, FM, FM, FM, O, O, O,
+ /* 2070 */ O, O, O, O, FMPst, O, O, O, O, O, O, O, O, O, O, O,
+ /* 2080 */ O, O, FMPst, FMPst, FMPst, O, O, O,
-#define use_offset_0x20f0u 2616
+#define use_offset_0x20f0u 2800
/* Combining Diacritical Marks for Symbols */
/* 20F0 */ VMAbv, O, O, O, O, O, O, O,
-#define use_offset_0xa800u 2624
+#define use_offset_0x25c8u 2808
+
+
+ /* Geometric Shapes */
+ O, O, O, O, GB, O, O, O,
+
+#define use_offset_0xa800u 2816
/* Syloti Nagri */
- /* A800 */ B, B, O, B, B, B, VAbv, B, B, B, B, VMAbv, B, B, B, B,
+ /* A800 */ B, B, VAbv, B, B, B, H, B, B, B, B, VMAbv, B, B, B, B,
/* A810 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A820 */ B, B, B, VPst, VPst, VBlw, VAbv, VPst, O, O, O, O, O, O, O, O,
/* A830 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@@ -384,7 +424,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Devanagari Extended */
/* A8E0 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
- /* A8F0 */ VMAbv, VMAbv, B, B, O, O, O, O, O, O, O, O, O, O, O, O,
+ /* A8F0 */ VMAbv, VMAbv, B, B, O, O, O, O, O, O, O, O, O, O, B, VAbv,
/* Kayah Li */
@@ -405,7 +445,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* A980 */ VMAbv, VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B,
/* A990 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A9A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* A9B0 */ B, B, B, CMAbv, VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VPre, VAbv, SUB, MPst, MBlw,
+ /* A9B0 */ B, B, B, CMAbv, VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VPre, VAbv, MBlw, MPst, MBlw,
/* A9C0 */ H, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* A9D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
@@ -442,7 +482,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* AAE0 */ B, B, B, B, B, B, B, B, B, B, B, VPre, VBlw, VAbv, VPre, VPst,
/* AAF0 */ O, O, O, O, O, VMPst, H, O,
-#define use_offset_0xabc0u 3384
+#define use_offset_0xabc0u 3576
/* Meetei Mayek */
@@ -452,14 +492,14 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* ABE0 */ B, B, B, VPst, VPst, VAbv, VPst, VPst, VBlw, VPst, VPst, O, VMPst, VBlw, O, O,
/* ABF0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
-#define use_offset_0xfe00u 3448
+#define use_offset_0xfe00u 3640
/* Variation Selectors */
/* FE00 */ VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS,
-#define use_offset_0x10a00u 3464
+#define use_offset_0x10a00u 3656
/* Kharoshthi */
@@ -467,10 +507,10 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 10A00 */ B, VBlw, VBlw, VBlw, O, VAbv, VBlw, O, O, O, O, O, VBlw, VBlw, VMBlw, VMAbv,
/* 10A10 */ B, B, B, B, O, B, B, B, O, B, B, B, B, B, B, B,
/* 10A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 10A30 */ B, B, B, B, O, O, O, O, CMAbv, CMBlw, CMBlw, O, O, O, O, H,
- /* 10A40 */ B, B, B, B, B, B, B, B,
+ /* 10A30 */ B, B, B, B, B, B, O, O, CMAbv, CMBlw, CMBlw, O, O, O, O, H,
+ /* 10A40 */ B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, O,
-#define use_offset_0x11000u 3536
+#define use_offset_0x11000u 3736
/* Brahmi */
@@ -479,10 +519,10 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11020 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11030 */ B, B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw,
- /* 11040 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, O, O, O, O, O, O, O, O, O,
+ /* 11040 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, HVM, O, O, O, O, O, O, O, O, O,
/* 11050 */ O, O, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
/* 11060 */ N, N, N, N, N, N, B, B, B, B, B, B, B, B, B, B,
- /* 11070 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ /* 11070 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, HN,
/* Kaithi */
@@ -491,16 +531,16 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 110A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 110B0 */ VPst, VPre, VPst, VBlw, VBlw, VAbv, VAbv, VPst, VPst, H, CMBlw, O, O, O, O, O,
-#define use_offset_0x11100u 3728
+#define use_offset_0x11100u 3928
/* Chakma */
/* 11100 */ VMAbv, VMAbv, VMAbv, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11110 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 11120 */ B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VBlw, VBlw, VPre, VAbv, VAbv, VAbv,
- /* 11130 */ VAbv, VBlw, VBlw, H, VAbv, O, B, B, B, B, B, B, B, B, B, B,
- /* 11140 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ /* 11120 */ B, B, B, B, B, B, B, VBlw, VBlw, VBlw, VAbv, VAbv, VPre, VBlw, VAbv, VAbv,
+ /* 11130 */ VBlw, VAbv, VAbv, H, CMBlw, O, B, B, B, B, B, B, B, B, B, B,
+ /* 11140 */ O, O, O, O, B, VPst, VPst, O, O, O, O, O, O, O, O, O,
/* Mahajani */
@@ -514,7 +554,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11190 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 111A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 111B0 */ B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv,
- /* 111C0 */ H, B, R, R, O, O, O, O, O, O, CMBlw, VAbv, VBlw, O, O, O,
+ /* 111C0 */ H, B, R, R, O, O, O, O, GB, FMBlw, CMBlw, VAbv, VBlw, O, O, O,
/* 111D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
/* Sinhala Archaic Numbers */
@@ -529,7 +569,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11220 */ B, B, B, B, B, B, B, B, B, B, B, B, VPst, VPst, VPst, VBlw,
/* 11230 */ VAbv, VAbv, VAbv, VAbv, VMAbv, H, CMAbv, CMAbv, O, O, O, O, O, O, VMAbv, O,
-#define use_offset_0x11280u 4048
+#define use_offset_0x11280u 4248
/* Multani */
@@ -548,16 +588,16 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Grantha */
- /* 11300 */ VMAbv, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B,
+ /* 11300 */ VMAbv, VMAbv, VMAbv, VMAbv, O, B, B, B, B, B, B, B, B, O, O, B,
/* 11310 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11320 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
- /* 11330 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VPst,
- /* 11340 */ VAbv, VPst, VPst, VPst, VPst, O, O, VPre, VPre, O, O, VPre, VPre, H, O, O,
+ /* 11330 */ B, O, B, B, O, B, B, B, B, B, O, CMBlw, CMBlw, B, VPst, VPst,
+ /* 11340 */ VAbv, VPst, VPst, VPst, VPst, O, O, VPre, VPre, O, O, VPst, VPst, HVM, O, O,
/* 11350 */ O, O, O, O, O, O, O, VPst, O, O, O, O, O, O, B, B,
/* 11360 */ B, B, VPst, VPst, O, O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O,
/* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O,
-#define use_offset_0x11400u 4296
+#define use_offset_0x11400u 4496
/* Newa */
@@ -567,7 +607,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11420 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11430 */ B, B, B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv,
/* 11440 */ VPst, VPst, H, VMAbv, VMAbv, VMPst, CMBlw, B, O, O, O, O, O, O, O, O,
- /* 11450 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
+ /* 11450 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, FMAbv, B,
/* 11460 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* 11470 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@@ -576,11 +616,11 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11480 */ O, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11490 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 114A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 114B0 */ VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VPre, VAbv, VPre, VPre, VPst, VPre, VMAbv,
- /* 114C0 */ VMAbv, VMPst, H, CMBlw, B, O, O, O, O, O, O, O, O, O, O, O,
+ /* 114B0 */ VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VPre, VAbv, VPst, VPst, VPst, VPst, VMAbv,
+ /* 114C0 */ VMAbv, VMAbv, H, CMBlw, B, O, O, O, O, O, O, O, O, O, O, O,
/* 114D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
-#define use_offset_0x11580u 4520
+#define use_offset_0x11580u 4720
/* Siddham */
@@ -588,7 +628,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11580 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11590 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 115A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, VPst,
- /* 115B0 */ VPre, VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, VPre, VPre, VMAbv, VMAbv, VMPst, H,
+ /* 115B0 */ VPre, VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPst, VPst, VPst, VMAbv, VMAbv, VMPst, H,
/* 115C0 */ CMBlw, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* 115D0 */ O, O, O, O, O, O, O, O, B, B, B, B, VBlw, VBlw, O, O,
/* 115E0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@@ -610,7 +650,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11680 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11690 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 116A0 */ B, B, B, B, B, B, B, B, B, B, B, VMAbv, VMPst, VAbv, VPre, VPst,
- /* 116B0 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, CMBlw, O, O, O, O, O, O, O, O,
+ /* 116B0 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, CMBlw, B, O, O, O, O, O, O, O,
/* 116C0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
/* 116D0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* 116E0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@@ -619,19 +659,38 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Ahom */
/* 11700 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 11710 */ B, B, B, B, B, B, B, B, B, B, O, O, O, MBlw, MPre, MAbv,
+ /* 11710 */ B, B, B, B, B, B, B, B, B, B, B, O, O, MBlw, MPre, MAbv,
/* 11720 */ VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VAbv, VBlw, VAbv, VAbv, VAbv, O, O, O, O,
/* 11730 */ B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, O,
-#define use_offset_0x11a00u 4968
+#define use_offset_0x11800u 5168
+
+ /* Dogra */
+
+ /* 11800 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11810 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11820 */ B, B, B, B, B, B, B, B, B, B, B, B, VPst, VPre, VPst, VBlw,
+ /* 11830 */ VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VMAbv, VMPst, H, CMBlw, O, O, O, O, O,
+
+#define use_offset_0x119a0u 5232
+
+
+ /* Nandinagari */
+
+ /* 119A0 */ B, B, B, B, B, B, B, B, O, O, B, B, B, B, B, B,
+ /* 119B0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 119C0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 119D0 */ B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, O, O, VAbv, VAbv, VPst, VPst, VMPst, VMPst,
+ /* 119E0 */ H, B, O, O, VPre, O, O, O, O, O, O, O, O, O, O, O,
+ /* 119F0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Zanabazar Square */
/* 11A00 */ B, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VAbv, VAbv, VBlw, B, B, B, B, B,
/* 11A10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 11A30 */ B, B, B, FM, VBlw, VMAbv, VMAbv, VMAbv, VMAbv, VMPst, R, MBlw, MBlw, MBlw, MBlw, GB,
+ /* 11A30 */ B, B, B, FMBlw, VBlw, VMAbv, VMAbv, VMAbv, VMAbv, VMPst, R, MBlw, MBlw, MBlw, MBlw, GB,
/* 11A40 */ O, O, O, O, O, GB, O, H, O, O, O, O, O, O, O, O,
/* Soyombo */
@@ -639,10 +698,10 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11A50 */ B, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VPst, VPst, VBlw, VBlw, VBlw, B, B, B, B,
/* 11A60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11A70 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 11A80 */ B, B, B, B, O, O, R, R, R, R, FBlw, FBlw, FBlw, FBlw, FBlw, FBlw,
- /* 11A90 */ FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, VMAbv, VMPst, CMAbv, H, O, O, O, O, O, O,
+ /* 11A80 */ B, B, B, B, R, R, R, R, R, R, FBlw, FBlw, FBlw, FBlw, FBlw, FBlw,
+ /* 11A90 */ FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, VMAbv, VMPst, CMAbv, H, O, O, O, B, O, O,
-#define use_offset_0x11c00u 5128
+#define use_offset_0x11c00u 5488
/* Bhaiksuki */
@@ -651,7 +710,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11C10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11C20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, VPst,
/* 11C30 */ VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VBlw, O, VAbv, VAbv, VAbv, VAbv, VMAbv, VMAbv, VMPst, H,
- /* 11C40 */ B, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ /* 11C40 */ B, O, O, O, GB, GB, O, O, O, O, O, O, O, O, O, O,
/* 11C50 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11C60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, O, O,
@@ -663,7 +722,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11CA0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
/* 11CB0 */ VBlw, VPre, VBlw, VAbv, VPst, VMAbv, VMAbv, O,
-#define use_offset_0x11d00u 5312
+#define use_offset_0x11d00u 5672
/* Masaram Gondi */
@@ -675,18 +734,35 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11D40 */ VMAbv, VMAbv, CMBlw, VAbv, VBlw, H, R, MBlw, O, O, O, O, O, O, O, O,
/* 11D50 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
-}; /* Table items: 5408; occupancy: 73% */
+ /* Gunjala Gondi */
+
+ /* 11D60 */ B, B, B, B, B, B, O, B, B, O, B, B, B, B, B, B,
+ /* 11D70 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11D80 */ B, B, B, B, B, B, B, B, B, B, VPst, VPst, VPst, VPst, VPst, O,
+ /* 11D90 */ VAbv, VAbv, O, VPst, VPst, VMAbv, VMPst, H, O, O, O, O, O, O, O, O,
+ /* 11DA0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
+
+#define use_offset_0x11ee0u 5848
+
+
+ /* Makasar */
+
+ /* 11EE0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11EF0 */ B, B, GB, VAbv, VBlw, VPre, VPst, O,
+
+}; /* Table items: 5872; occupancy: 74% */
USE_TABLE_ELEMENT_TYPE
-hb_use_get_categories (hb_codepoint_t u)
+hb_use_get_category (hb_codepoint_t u)
{
switch (u >> 12)
{
case 0x0u:
if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
if (hb_in_range<hb_codepoint_t> (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u];
+ if (hb_in_range<hb_codepoint_t> (u, 0x0348u, 0x034Fu)) return use_table[u - 0x0348u + use_offset_0x0348u];
if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u];
- if (unlikely (u == 0x034Fu)) return CGJ;
+ if (hb_in_range<hb_codepoint_t> (u, 0x0F18u, 0x0FC7u)) return use_table[u - 0x0F18u + use_offset_0x0f18u];
break;
case 0x1u:
@@ -702,7 +778,7 @@ hb_use_get_categories (hb_codepoint_t u)
if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
if (hb_in_range<hb_codepoint_t> (u, 0x2060u, 0x2087u)) return use_table[u - 0x2060u + use_offset_0x2060u];
if (hb_in_range<hb_codepoint_t> (u, 0x20F0u, 0x20F7u)) return use_table[u - 0x20F0u + use_offset_0x20f0u];
- if (unlikely (u == 0x25CCu)) return GB;
+ if (hb_in_range<hb_codepoint_t> (u, 0x25C8u, 0x25CFu)) return use_table[u - 0x25C8u + use_offset_0x25c8u];
break;
case 0xAu:
@@ -715,7 +791,7 @@ hb_use_get_categories (hb_codepoint_t u)
break;
case 0x10u:
- if (hb_in_range<hb_codepoint_t> (u, 0x10A00u, 0x10A47u)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
+ if (hb_in_range<hb_codepoint_t> (u, 0x10A00u, 0x10A4Fu)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
break;
case 0x11u:
@@ -724,10 +800,11 @@ hb_use_get_categories (hb_codepoint_t u)
if (hb_in_range<hb_codepoint_t> (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
if (hb_in_range<hb_codepoint_t> (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
if (hb_in_range<hb_codepoint_t> (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u];
- if (hb_in_range<hb_codepoint_t> (u, 0x11A00u, 0x11A9Fu)) return use_table[u - 0x11A00u + use_offset_0x11a00u];
+ if (hb_in_range<hb_codepoint_t> (u, 0x11800u, 0x1183Fu)) return use_table[u - 0x11800u + use_offset_0x11800u];
+ if (hb_in_range<hb_codepoint_t> (u, 0x119A0u, 0x11A9Fu)) return use_table[u - 0x119A0u + use_offset_0x119a0u];
if (hb_in_range<hb_codepoint_t> (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u];
- if (hb_in_range<hb_codepoint_t> (u, 0x11D00u, 0x11D5Fu)) return use_table[u - 0x11D00u + use_offset_0x11d00u];
- if (unlikely (u == 0x1107Fu)) return HN;
+ if (hb_in_range<hb_codepoint_t> (u, 0x11D00u, 0x11DAFu)) return use_table[u - 0x11D00u + use_offset_0x11d00u];
+ if (hb_in_range<hb_codepoint_t> (u, 0x11EE0u, 0x11EF7u)) return use_table[u - 0x11EE0u + use_offset_0x11ee0u];
break;
default:
@@ -739,10 +816,10 @@ hb_use_get_categories (hb_codepoint_t u)
#undef B
#undef CGJ
#undef CS
-#undef FM
#undef GB
#undef H
#undef HN
+#undef HVM
#undef IND
#undef N
#undef O
@@ -750,6 +827,7 @@ hb_use_get_categories (hb_codepoint_t u)
#undef Rsv
#undef S
#undef SUB
+#undef Sk
#undef VS
#undef WJ
#undef ZWJ
@@ -759,6 +837,9 @@ hb_use_get_categories (hb_codepoint_t u)
#undef FBlw
#undef FPst
#undef FAbv
+#undef FMBlw
+#undef FMPst
+#undef FMAbv
#undef MPre
#undef MBlw
#undef MPst
@@ -774,4 +855,6 @@ hb_use_get_categories (hb_codepoint_t u)
#undef VMPst
#undef VMAbv
+
+#endif
/* == End of generated table == */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use.cc
index 62acd697bd..10f5822c00 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use.cc
@@ -26,8 +26,13 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-ot-shape-complex-use-private.hh"
-#include "hb-ot-shape-complex-arabic-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex-use.hh"
+#include "hb-ot-shape-complex-arabic.hh"
+#include "hb-ot-shape-complex-vowel-constraints.hh"
/* buffer var allocations */
#define use_category() complex_var_u8_0()
@@ -35,11 +40,11 @@
/*
* Universal Shaping Engine.
- * https://www.microsoft.com/typography/OpenTypeDev/USE/intro.htm
+ * https://docs.microsoft.com/en-us/typography/script-development/use
*/
static const hb_tag_t
-basic_features[] =
+use_basic_features[] =
{
/*
* Basic features.
@@ -54,64 +59,52 @@ basic_features[] =
HB_TAG('c','j','c','t'),
};
static const hb_tag_t
-arabic_features[] =
+use_topographical_features[] =
{
HB_TAG('i','s','o','l'),
HB_TAG('i','n','i','t'),
HB_TAG('m','e','d','i'),
HB_TAG('f','i','n','a'),
- /* The spec doesn't specify these but we apply anyway, since our Arabic shaper
- * does. These are only used in Syriac spec. */
- HB_TAG('m','e','d','2'),
- HB_TAG('f','i','n','2'),
- HB_TAG('f','i','n','3'),
};
-/* Same order as arabic_features. Don't need Syriac stuff.*/
+/* Same order as use_topographical_features. */
enum joining_form_t {
- ISOL,
- INIT,
- MEDI,
- FINA,
- _NONE
+ USE_ISOL,
+ USE_INIT,
+ USE_MEDI,
+ USE_FINA,
+ _USE_NONE
};
static const hb_tag_t
-other_features[] =
+use_other_features[] =
{
/*
* Other features.
- * These features are applied all at once, after reordering.
+ * These features are applied all at once, after reordering and
+ * clearing syllables.
*/
HB_TAG('a','b','v','s'),
HB_TAG('b','l','w','s'),
HB_TAG('h','a','l','n'),
HB_TAG('p','r','e','s'),
HB_TAG('p','s','t','s'),
- /* Positioning features, though we don't care about the types. */
- HB_TAG('d','i','s','t'),
- HB_TAG('a','b','v','m'),
- HB_TAG('b','l','w','m'),
};
static void
-setup_syllables (const hb_ot_shape_plan_t *plan,
+setup_syllables_use (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+static void
+record_rphf_use (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
static void
-clear_substitution_flags (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
-static void
-record_rphf (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
+record_pref_use (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
static void
-record_pref (const hb_ot_shape_plan_t *plan,
+reorder_use (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
-static void
-reorder (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
static void
collect_features_use (hb_ot_shape_planner_t *plan)
@@ -119,42 +112,41 @@ collect_features_use (hb_ot_shape_planner_t *plan)
hb_ot_map_builder_t *map = &plan->map;
/* Do this before any lookups have been applied. */
- map->add_gsub_pause (setup_syllables);
+ map->add_gsub_pause (setup_syllables_use);
/* "Default glyph pre-processing group" */
- map->add_global_bool_feature (HB_TAG('l','o','c','l'));
- map->add_global_bool_feature (HB_TAG('c','c','m','p'));
- map->add_global_bool_feature (HB_TAG('n','u','k','t'));
- map->add_global_bool_feature (HB_TAG('a','k','h','n'));
+ map->enable_feature (HB_TAG('l','o','c','l'));
+ map->enable_feature (HB_TAG('c','c','m','p'));
+ map->enable_feature (HB_TAG('n','u','k','t'));
+ map->enable_feature (HB_TAG('a','k','h','n'), F_MANUAL_ZWJ);
/* "Reordering group" */
- map->add_gsub_pause (clear_substitution_flags);
- map->add_feature (HB_TAG('r','p','h','f'), 1, F_MANUAL_ZWJ);
- map->add_gsub_pause (record_rphf);
- map->add_gsub_pause (clear_substitution_flags);
- map->add_feature (HB_TAG('p','r','e','f'), 1, F_GLOBAL | F_MANUAL_ZWJ);
- map->add_gsub_pause (record_pref);
+ map->add_gsub_pause (_hb_clear_substitution_flags);
+ map->add_feature (HB_TAG('r','p','h','f'), F_MANUAL_ZWJ);
+ map->add_gsub_pause (record_rphf_use);
+ map->add_gsub_pause (_hb_clear_substitution_flags);
+ map->enable_feature (HB_TAG('p','r','e','f'), F_MANUAL_ZWJ);
+ map->add_gsub_pause (record_pref_use);
/* "Orthographic unit shaping group" */
- for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++)
- map->add_feature (basic_features[i], 1, F_GLOBAL | F_MANUAL_ZWJ);
+ for (unsigned int i = 0; i < ARRAY_LENGTH (use_basic_features); i++)
+ map->enable_feature (use_basic_features[i], F_MANUAL_ZWJ);
- map->add_gsub_pause (reorder);
+ map->add_gsub_pause (reorder_use);
+ map->add_gsub_pause (_hb_clear_syllables);
/* "Topographical features" */
- for (unsigned int i = 0; i < ARRAY_LENGTH (arabic_features); i++)
- map->add_feature (arabic_features[i], 1, F_NONE);
+ for (unsigned int i = 0; i < ARRAY_LENGTH (use_topographical_features); i++)
+ map->add_feature (use_topographical_features[i]);
map->add_gsub_pause (nullptr);
- /* "Standard typographic presentation" and "Positional feature application" */
- for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++)
- map->add_feature (other_features[i], 1, F_GLOBAL | F_MANUAL_ZWJ);
+ /* "Standard typographic presentation" */
+ for (unsigned int i = 0; i < ARRAY_LENGTH (use_other_features); i++)
+ map->enable_feature (use_other_features[i], F_MANUAL_ZWJ);
}
struct use_shape_plan_t
{
- ASSERT_POD ();
-
hb_mask_t rphf_mask;
arabic_shape_plan_t *arabic_plan;
@@ -227,15 +219,16 @@ data_destroy_use (void *data)
free (data);
}
-enum syllable_type_t {
- independent_cluster,
- virama_terminated_cluster,
- standard_cluster,
- number_joiner_terminated_cluster,
- numeral_cluster,
- symbol_cluster,
- broken_cluster,
- non_cluster,
+enum use_syllable_type_t {
+ use_independent_cluster,
+ use_virama_terminated_cluster,
+ use_sakot_terminated_cluster,
+ use_standard_cluster,
+ use_number_joiner_terminated_cluster,
+ use_numeral_cluster,
+ use_symbol_cluster,
+ use_broken_cluster,
+ use_non_cluster,
};
#include "hb-ot-shape-complex-use-machine.hh"
@@ -262,7 +255,7 @@ setup_masks_use (const hb_ot_shape_plan_t *plan,
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
- info[i].use_category() = hb_use_get_categories (info[i].codepoint);
+ info[i].use_category() = hb_use_get_category (info[i].codepoint);
}
static void
@@ -278,7 +271,7 @@ setup_rphf_mask (const hb_ot_shape_plan_t *plan,
foreach_syllable (buffer, start, end)
{
- unsigned int limit = info[start].use_category() == USE_R ? 1 : MIN (3u, end - start);
+ unsigned int limit = info[start].use_category() == USE_R ? 1 : hb_min (3u, end - start);
for (unsigned int i = start; i < start + limit; i++)
info[i].mask |= mask;
}
@@ -292,11 +285,11 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan,
if (use_plan->arabic_plan)
return;
- static_assert ((INIT < 4 && ISOL < 4 && MEDI < 4 && FINA < 4), "");
+ static_assert ((USE_INIT < 4 && USE_ISOL < 4 && USE_MEDI < 4 && USE_FINA < 4), "");
hb_mask_t masks[4], all_masks = 0;
for (unsigned int i = 0; i < 4; i++)
{
- masks[i] = plan->map.get_1_mask (arabic_features[i]);
+ masks[i] = plan->map.get_1_mask (use_topographical_features[i]);
if (masks[i] == plan->map.get_global_mask ())
masks[i] = 0;
all_masks |= masks[i];
@@ -306,38 +299,39 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan,
hb_mask_t other_masks = ~all_masks;
unsigned int last_start = 0;
- joining_form_t last_form = _NONE;
+ joining_form_t last_form = _USE_NONE;
hb_glyph_info_t *info = buffer->info;
foreach_syllable (buffer, start, end)
{
- syllable_type_t syllable_type = (syllable_type_t) (info[start].syllable() & 0x0F);
+ use_syllable_type_t syllable_type = (use_syllable_type_t) (info[start].syllable() & 0x0F);
switch (syllable_type)
{
- case independent_cluster:
- case symbol_cluster:
- case non_cluster:
+ case use_independent_cluster:
+ case use_symbol_cluster:
+ case use_non_cluster:
/* These don't join. Nothing to do. */
- last_form = _NONE;
+ last_form = _USE_NONE;
break;
- case virama_terminated_cluster:
- case standard_cluster:
- case number_joiner_terminated_cluster:
- case numeral_cluster:
- case broken_cluster:
+ case use_virama_terminated_cluster:
+ case use_sakot_terminated_cluster:
+ case use_standard_cluster:
+ case use_number_joiner_terminated_cluster:
+ case use_numeral_cluster:
+ case use_broken_cluster:
- bool join = last_form == FINA || last_form == ISOL;
+ bool join = last_form == USE_FINA || last_form == USE_ISOL;
if (join)
{
/* Fixup previous syllable's form. */
- last_form = last_form == FINA ? MEDI : INIT;
+ last_form = last_form == USE_FINA ? USE_MEDI : USE_INIT;
for (unsigned int i = last_start; i < start; i++)
info[i].mask = (info[i].mask & other_masks) | masks[last_form];
}
/* Form for this syllable. */
- last_form = join ? FINA : ISOL;
+ last_form = join ? USE_FINA : USE_ISOL;
for (unsigned int i = start; i < end; i++)
info[i].mask = (info[i].mask & other_masks) | masks[last_form];
@@ -349,11 +343,11 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan,
}
static void
-setup_syllables (const hb_ot_shape_plan_t *plan,
- hb_font_t *font HB_UNUSED,
- hb_buffer_t *buffer)
+setup_syllables_use (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font HB_UNUSED,
+ hb_buffer_t *buffer)
{
- find_syllables (buffer);
+ find_syllables_use (buffer);
foreach_syllable (buffer, start, end)
buffer->unsafe_to_break (start, end);
setup_rphf_mask (plan, buffer);
@@ -361,20 +355,9 @@ setup_syllables (const hb_ot_shape_plan_t *plan,
}
static void
-clear_substitution_flags (const hb_ot_shape_plan_t *plan,
- hb_font_t *font HB_UNUSED,
- hb_buffer_t *buffer)
-{
- hb_glyph_info_t *info = buffer->info;
- unsigned int count = buffer->len;
- for (unsigned int i = 0; i < count; i++)
- _hb_glyph_info_clear_substituted (&info[i]);
-}
-
-static void
-record_rphf (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer)
+record_rphf_use (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font HB_UNUSED,
+ hb_buffer_t *buffer)
{
const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data;
@@ -395,9 +378,9 @@ record_rphf (const hb_ot_shape_plan_t *plan,
}
static void
-record_pref (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer)
+record_pref_use (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font HB_UNUSED,
+ hb_buffer_t *buffer)
{
hb_glyph_info_t *info = buffer->info;
@@ -414,38 +397,59 @@ record_pref (const hb_ot_shape_plan_t *plan,
}
static inline bool
-is_halant (const hb_glyph_info_t &info)
+is_halant_use (const hb_glyph_info_t &info)
{
- return info.use_category() == USE_H && !_hb_glyph_info_ligated (&info);
+ return (info.use_category() == USE_H || info.use_category() == USE_HVM) &&
+ !_hb_glyph_info_ligated (&info);
}
static void
-reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
+reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end)
{
- syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
+ use_syllable_type_t syllable_type = (use_syllable_type_t) (buffer->info[start].syllable() & 0x0F);
/* Only a few syllable types need reordering. */
if (unlikely (!(FLAG_UNSAFE (syllable_type) &
- (FLAG (virama_terminated_cluster) |
- FLAG (standard_cluster) |
- FLAG (broken_cluster) |
+ (FLAG (use_virama_terminated_cluster) |
+ FLAG (use_sakot_terminated_cluster) |
+ FLAG (use_standard_cluster) |
+ FLAG (use_broken_cluster) |
0))))
return;
hb_glyph_info_t *info = buffer->info;
-#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB))
+#define POST_BASE_FLAGS64 (FLAG64 (USE_FM) | \
+ FLAG64 (USE_FAbv) | \
+ FLAG64 (USE_FBlw) | \
+ FLAG64 (USE_FPst) | \
+ FLAG64 (USE_MAbv) | \
+ FLAG64 (USE_MBlw) | \
+ FLAG64 (USE_MPst) | \
+ FLAG64 (USE_MPre) | \
+ FLAG64 (USE_VAbv) | \
+ FLAG64 (USE_VBlw) | \
+ FLAG64 (USE_VPst) | \
+ FLAG64 (USE_VPre) | \
+ FLAG64 (USE_VMAbv) | \
+ FLAG64 (USE_VMBlw) | \
+ FLAG64 (USE_VMPst) | \
+ FLAG64 (USE_VMPre))
/* Move things forward. */
if (info[start].use_category() == USE_R && end - start > 1)
{
- /* Got a repha. Reorder it to after first base, before first halant. */
+ /* Got a repha. Reorder it towards the end, but before the first post-base
+ * glyph. */
for (unsigned int i = start + 1; i < end; i++)
- if ((FLAG_UNSAFE (info[i].use_category()) & (BASE_FLAGS)) || is_halant (info[i]))
+ {
+ bool is_post_base_glyph = (FLAG64_UNSAFE (info[i].use_category()) & POST_BASE_FLAGS64) ||
+ is_halant_use (info[i]);
+ if (is_post_base_glyph || i == end - 1)
{
- /* If we hit a halant, move before it; otherwise it's a base: move to it's
- * place, and shift things in between backward. */
+ /* If we hit a post-base glyph, move before it; otherwise move to the
+ * end. Shift things in between backward. */
- if (is_halant (info[i]))
+ if (is_post_base_glyph)
i--;
buffer->merge_clusters (start, i + 1);
@@ -455,21 +459,19 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
break;
}
+ }
}
/* Move things back. */
- unsigned int j = end;
+ unsigned int j = start;
for (unsigned int i = start; i < end; i++)
{
uint32_t flag = FLAG_UNSAFE (info[i].use_category());
- if ((flag & (BASE_FLAGS)) || is_halant (info[i]))
+ if (is_halant_use (info[i]))
{
- /* If we hit a halant, move after it; otherwise it's a base: move to it's
- * place, and shift things in between backward. */
- if (is_halant (info[i]))
- j = i + 1;
- else
- j = i;
+ /* If we hit a halant, move after it; otherwise move to the beginning, and
+ * shift things in between forward. */
+ j = i + 1;
}
else if (((flag) & (FLAG (USE_VPre) | FLAG (USE_VMPre))) &&
/* Only move the first component of a MultipleSubst. */
@@ -485,16 +487,20 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
}
static inline void
-insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
- hb_font_t *font,
- hb_buffer_t *buffer)
+insert_dotted_circles_use (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
{
- /* Note: This loop is extra overhead, but should not be measurable. */
+ if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
+ return;
+
+ /* Note: This loop is extra overhead, but should not be measurable.
+ * TODO Use a buffer scratch flag to remove the loop. */
bool has_broken_syllables = false;
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
- if ((info[i].syllable() & 0x0F) == broken_cluster)
+ if ((info[i].syllable() & 0x0F) == use_broken_cluster)
{
has_broken_syllables = true;
break;
@@ -505,17 +511,17 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_glyph_info_t dottedcircle = {0};
if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint))
return;
- dottedcircle.use_category() = hb_use_get_categories (0x25CC);
+ dottedcircle.use_category() = hb_use_get_category (0x25CC);
buffer->clear_output ();
buffer->idx = 0;
unsigned int last_syllable = 0;
- while (buffer->idx < buffer->len && !buffer->in_error)
+ while (buffer->idx < buffer->len && buffer->successful)
{
unsigned int syllable = buffer->cur().syllable();
- syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
- if (unlikely (last_syllable != syllable && syllable_type == broken_cluster))
+ use_syllable_type_t syllable_type = (use_syllable_type_t) (syllable & 0x0F);
+ if (unlikely (last_syllable != syllable && syllable_type == use_broken_cluster))
{
last_syllable = syllable;
@@ -523,60 +529,41 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
ginfo.cluster = buffer->cur().cluster;
ginfo.mask = buffer->cur().mask;
ginfo.syllable() = buffer->cur().syllable();
- /* TODO Set glyph_props? */
/* Insert dottedcircle after possible Repha. */
- while (buffer->idx < buffer->len && !buffer->in_error &&
+ while (buffer->idx < buffer->len && buffer->successful &&
last_syllable == buffer->cur().syllable() &&
buffer->cur().use_category() == USE_R)
- buffer->next_glyph ();
+ buffer->next_glyph ();
buffer->output_info (ginfo);
}
else
buffer->next_glyph ();
}
-
buffer->swap_buffers ();
}
static void
-reorder (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer)
+reorder_use (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
{
- insert_dotted_circles (plan, font, buffer);
-
- hb_glyph_info_t *info = buffer->info;
+ insert_dotted_circles_use (plan, font, buffer);
foreach_syllable (buffer, start, end)
- reorder_syllable (buffer, start, end);
-
- /* Zero syllables now... */
- unsigned int count = buffer->len;
- for (unsigned int i = 0; i < count; i++)
- info[i].syllable() = 0;
+ reorder_syllable_use (buffer, start, end);
HB_BUFFER_DEALLOCATE_VAR (buffer, use_category);
}
-static bool
-decompose_use (const hb_ot_shape_normalize_context_t *c,
- hb_codepoint_t ab,
- hb_codepoint_t *a,
- hb_codepoint_t *b)
-{
- switch (ab)
- {
- /* Chakma:
- * Special case where the Unicode decomp gives matras in the wrong order
- * for cluster validation.
- */
- case 0x1112Eu : *a = 0x11127u; *b= 0x11131u; return true;
- case 0x1112Fu : *a = 0x11127u; *b= 0x11132u; return true;
- }
- return (bool) c->unicode->decompose (ab, a, b);
+static void
+preprocess_text_use (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font)
+{
+ _hb_preprocess_text_vowel_constraints (plan, buffer, font);
}
static bool
@@ -599,14 +586,17 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_use =
nullptr, /* override_features */
data_create_use,
data_destroy_use,
- nullptr, /* preprocess_text */
+ preprocess_text_use,
nullptr, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
- decompose_use,
+ nullptr, /* decompose */
compose_use,
setup_masks_use,
- nullptr, /* disable_otl */
+ HB_TAG_NONE, /* gpos_tag */
nullptr, /* reorder_marks */
HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
false, /* fallback_position */
};
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use.hh
new file mode 100644
index 0000000000..ce6645ecd3
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-use.hh
@@ -0,0 +1,105 @@
+/*
+ * Copyright © 2015 Mozilla Foundation.
+ * Copyright © 2015 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Mozilla Author(s): Jonathan Kew
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_USE_HH
+#define HB_OT_SHAPE_COMPLEX_USE_HH
+
+#include "hb.hh"
+
+
+#include "hb-ot-shape-complex.hh"
+
+
+#define USE_TABLE_ELEMENT_TYPE uint8_t
+
+/* Cateories used in the Universal Shaping Engine spec:
+ * https://docs.microsoft.com/en-us/typography/script-development/use
+ */
+/* Note: This enum is duplicated in the -machine.rl source file.
+ * Not sure how to avoid duplication. */
+enum use_category_t {
+ USE_O = 0, /* OTHER */
+
+ USE_B = 1, /* BASE */
+ USE_IND = 3, /* BASE_IND */
+ USE_N = 4, /* BASE_NUM */
+ USE_GB = 5, /* BASE_OTHER */
+ USE_CGJ = 6, /* CGJ */
+// USE_F = 7, /* CONS_FINAL */
+ USE_FM = 8, /* CONS_FINAL_MOD */
+// USE_M = 9, /* CONS_MED */
+// USE_CM = 10, /* CONS_MOD */
+ USE_SUB = 11, /* CONS_SUB */
+ USE_H = 12, /* HALANT */
+
+ USE_HN = 13, /* HALANT_NUM */
+ USE_ZWNJ = 14, /* Zero width non-joiner */
+ USE_ZWJ = 15, /* Zero width joiner */
+ USE_WJ = 16, /* Word joiner */
+ USE_Rsv = 17, /* Reserved characters */
+ USE_R = 18, /* REPHA */
+ USE_S = 19, /* SYM */
+// USE_SM = 20, /* SYM_MOD */
+ USE_VS = 21, /* VARIATION_SELECTOR */
+// USE_V = 36, /* VOWEL */
+// USE_VM = 40, /* VOWEL_MOD */
+ USE_CS = 43, /* CONS_WITH_STACKER */
+
+ /* https://github.com/harfbuzz/harfbuzz/issues/1102 */
+ USE_HVM = 44, /* HALANT_OR_VOWEL_MODIFIER */
+
+ USE_Sk = 48, /* SAKOT */
+
+ USE_FAbv = 24, /* CONS_FINAL_ABOVE */
+ USE_FBlw = 25, /* CONS_FINAL_BELOW */
+ USE_FPst = 26, /* CONS_FINAL_POST */
+ USE_MAbv = 27, /* CONS_MED_ABOVE */
+ USE_MBlw = 28, /* CONS_MED_BELOW */
+ USE_MPst = 29, /* CONS_MED_POST */
+ USE_MPre = 30, /* CONS_MED_PRE */
+ USE_CMAbv = 31, /* CONS_MOD_ABOVE */
+ USE_CMBlw = 32, /* CONS_MOD_BELOW */
+ USE_VAbv = 33, /* VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST */
+ USE_VBlw = 34, /* VOWEL_BELOW / VOWEL_BELOW_POST */
+ USE_VPst = 35, /* VOWEL_POST UIPC = Right */
+ USE_VPre = 22, /* VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST */
+ USE_VMAbv = 37, /* VOWEL_MOD_ABOVE */
+ USE_VMBlw = 38, /* VOWEL_MOD_BELOW */
+ USE_VMPst = 39, /* VOWEL_MOD_POST */
+ USE_VMPre = 23, /* VOWEL_MOD_PRE */
+ USE_SMAbv = 41, /* SYM_MOD_ABOVE */
+ USE_SMBlw = 42, /* SYM_MOD_BELOW */
+ USE_FMAbv = 45, /* CONS_FINAL_MOD UIPC = Top */
+ USE_FMBlw = 46, /* CONS_FINAL_MOD UIPC = Bottom */
+ USE_FMPst = 47, /* CONS_FINAL_MOD UIPC = Not_Applicable */
+};
+
+HB_INTERNAL USE_TABLE_ELEMENT_TYPE
+hb_use_get_category (hb_codepoint_t u);
+
+#endif /* HB_OT_SHAPE_COMPLEX_USE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-vowel-constraints.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-vowel-constraints.cc
new file mode 100644
index 0000000000..2f8041323a
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-vowel-constraints.cc
@@ -0,0 +1,449 @@
+/* == Start of generated functions == */
+/*
+ * The following functions are generated by running:
+ *
+ * ./gen-vowel-constraints.py use Scripts.txt
+ *
+ * on files with these headers:
+ *
+ * # Copied from https://docs.microsoft.com/en-us/typography/script-development/use
+ * # On October 23, 2018; with documentd dated 02/07/2018.
+ *
+ * # Scripts-12.0.0.txt
+ * # Date: 2019-01-28, 22:16:47 GMT
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex-vowel-constraints.hh"
+
+static void
+_output_dotted_circle (hb_buffer_t *buffer)
+{
+ hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);
+ _hb_glyph_info_reset_continuation (&dottedcircle);
+}
+
+static void
+_output_with_dotted_circle (hb_buffer_t *buffer)
+{
+ _output_dotted_circle (buffer);
+ buffer->next_glyph ();
+}
+
+void
+_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_buffer_t *buffer,
+ hb_font_t *font HB_UNUSED)
+{
+#ifdef HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS
+ return;
+#endif
+ if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)
+ return;
+
+ /* UGLY UGLY UGLY business of adding dotted-circle in the middle of
+ * vowel-sequences that look like another vowel. Data for each script
+ * collected from the USE script development spec.
+ *
+ * https://github.com/harfbuzz/harfbuzz/issues/1019
+ */
+ bool processed = false;
+ buffer->clear_output ();
+ unsigned int count = buffer->len;
+ switch ((unsigned) buffer->props.script)
+ {
+ case HB_SCRIPT_DEVANAGARI:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x0905u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x093Au: case 0x093Bu: case 0x093Eu: case 0x0945u:
+ case 0x0946u: case 0x0949u: case 0x094Au: case 0x094Bu:
+ case 0x094Cu: case 0x094Fu: case 0x0956u: case 0x0957u:
+ matched = true;
+ break;
+ }
+ break;
+ case 0x0906u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x093Au: case 0x0945u: case 0x0946u: case 0x0947u:
+ case 0x0948u:
+ matched = true;
+ break;
+ }
+ break;
+ case 0x0909u:
+ matched = 0x0941u == buffer->cur (1).codepoint;
+ break;
+ case 0x090Fu:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x0945u: case 0x0946u: case 0x0947u:
+ matched = true;
+ break;
+ }
+ break;
+ case 0x0930u:
+ if (0x094Du == buffer->cur (1).codepoint &&
+ buffer->idx + 2 < count &&
+ 0x0907u == buffer->cur (2).codepoint)
+ {
+ buffer->next_glyph ();
+ buffer->next_glyph ();
+ _output_dotted_circle (buffer);
+ }
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_BENGALI:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x0985u:
+ matched = 0x09BEu == buffer->cur (1).codepoint;
+ break;
+ case 0x098Bu:
+ matched = 0x09C3u == buffer->cur (1).codepoint;
+ break;
+ case 0x098Cu:
+ matched = 0x09E2u == buffer->cur (1).codepoint;
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_GURMUKHI:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x0A05u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x0A3Eu: case 0x0A48u: case 0x0A4Cu:
+ matched = true;
+ break;
+ }
+ break;
+ case 0x0A72u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x0A3Fu: case 0x0A40u: case 0x0A47u:
+ matched = true;
+ break;
+ }
+ break;
+ case 0x0A73u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x0A41u: case 0x0A42u: case 0x0A4Bu:
+ matched = true;
+ break;
+ }
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_GUJARATI:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x0A85u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x0ABEu: case 0x0AC5u: case 0x0AC7u: case 0x0AC8u:
+ case 0x0AC9u: case 0x0ACBu: case 0x0ACCu:
+ matched = true;
+ break;
+ }
+ break;
+ case 0x0AC5u:
+ matched = 0x0ABEu == buffer->cur (1).codepoint;
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_ORIYA:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x0B05u:
+ matched = 0x0B3Eu == buffer->cur (1).codepoint;
+ break;
+ case 0x0B0Fu: case 0x0B13u:
+ matched = 0x0B57u == buffer->cur (1).codepoint;
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_TELUGU:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x0C12u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x0C4Cu: case 0x0C55u:
+ matched = true;
+ break;
+ }
+ break;
+ case 0x0C3Fu: case 0x0C46u: case 0x0C4Au:
+ matched = 0x0C55u == buffer->cur (1).codepoint;
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_KANNADA:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x0C89u: case 0x0C8Bu:
+ matched = 0x0CBEu == buffer->cur (1).codepoint;
+ break;
+ case 0x0C92u:
+ matched = 0x0CCCu == buffer->cur (1).codepoint;
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_MALAYALAM:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x0D07u: case 0x0D09u:
+ matched = 0x0D57u == buffer->cur (1).codepoint;
+ break;
+ case 0x0D0Eu:
+ matched = 0x0D46u == buffer->cur (1).codepoint;
+ break;
+ case 0x0D12u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x0D3Eu: case 0x0D57u:
+ matched = true;
+ break;
+ }
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_SINHALA:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x0D85u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x0DCFu: case 0x0DD0u: case 0x0DD1u:
+ matched = true;
+ break;
+ }
+ break;
+ case 0x0D8Bu: case 0x0D8Fu: case 0x0D94u:
+ matched = 0x0DDFu == buffer->cur (1).codepoint;
+ break;
+ case 0x0D8Du:
+ matched = 0x0DD8u == buffer->cur (1).codepoint;
+ break;
+ case 0x0D91u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x0DCAu: case 0x0DD9u: case 0x0DDAu: case 0x0DDCu:
+ case 0x0DDDu:
+ matched = true;
+ break;
+ }
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_BRAHMI:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x11005u:
+ matched = 0x11038u == buffer->cur (1).codepoint;
+ break;
+ case 0x1100Bu:
+ matched = 0x1103Eu == buffer->cur (1).codepoint;
+ break;
+ case 0x1100Fu:
+ matched = 0x11042u == buffer->cur (1).codepoint;
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_KHUDAWADI:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x112B0u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x112E0u: case 0x112E5u: case 0x112E6u: case 0x112E7u:
+ case 0x112E8u:
+ matched = true;
+ break;
+ }
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_TIRHUTA:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x11481u:
+ matched = 0x114B0u == buffer->cur (1).codepoint;
+ break;
+ case 0x1148Bu: case 0x1148Du:
+ matched = 0x114BAu == buffer->cur (1).codepoint;
+ break;
+ case 0x114AAu:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x114B5u: case 0x114B6u:
+ matched = true;
+ break;
+ }
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_MODI:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x11600u: case 0x11601u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x11639u: case 0x1163Au:
+ matched = true;
+ break;
+ }
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ case HB_SCRIPT_TAKRI:
+ for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+ {
+ bool matched = false;
+ switch (buffer->cur ().codepoint)
+ {
+ case 0x11680u:
+ switch (buffer->cur (1).codepoint)
+ {
+ case 0x116ADu: case 0x116B4u: case 0x116B5u:
+ matched = true;
+ break;
+ }
+ break;
+ case 0x11686u:
+ matched = 0x116B2u == buffer->cur (1).codepoint;
+ break;
+ }
+ buffer->next_glyph ();
+ if (matched) _output_with_dotted_circle (buffer);
+ }
+ processed = true;
+ break;
+
+ default:
+ break;
+ }
+ if (processed)
+ {
+ if (buffer->idx < count)
+ buffer->next_glyph ();
+ buffer->swap_buffers ();
+ }
+}
+
+
+#endif
+/* == End of generated functions == */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-vowel-constraints.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-vowel-constraints.hh
new file mode 100644
index 0000000000..d9082d4ead
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-vowel-constraints.hh
@@ -0,0 +1,39 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS_HH
+#define HB_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex.hh"
+
+HB_INTERNAL void
+_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font);
+
+#endif /* HB_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex.hh
new file mode 100644
index 0000000000..2691622135
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex.hh
@@ -0,0 +1,397 @@
+/*
+ * Copyright © 2010,2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_HH
+#define HB_OT_SHAPE_COMPLEX_HH
+
+#include "hb.hh"
+
+#include "hb-ot-layout.hh"
+#include "hb-ot-shape.hh"
+#include "hb-ot-shape-normalize.hh"
+
+
+/* buffer var allocations, used by complex shapers */
+#define complex_var_u8_0() var2.u8[2]
+#define complex_var_u8_1() var2.u8[3]
+
+
+#define HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS 32
+
+enum hb_ot_shape_zero_width_marks_type_t {
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE
+};
+
+
+/* Master OT shaper list */
+#define HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS \
+ HB_COMPLEX_SHAPER_IMPLEMENT (default) /* should be first */ \
+ HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \
+ HB_COMPLEX_SHAPER_IMPLEMENT (hangul) \
+ HB_COMPLEX_SHAPER_IMPLEMENT (hebrew) \
+ HB_COMPLEX_SHAPER_IMPLEMENT (indic) \
+ HB_COMPLEX_SHAPER_IMPLEMENT (khmer) \
+ HB_COMPLEX_SHAPER_IMPLEMENT (myanmar) \
+ HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_zawgyi) \
+ HB_COMPLEX_SHAPER_IMPLEMENT (thai) \
+ HB_COMPLEX_SHAPER_IMPLEMENT (use) \
+ /* ^--- Add new shapers here */
+
+
+struct hb_ot_complex_shaper_t
+{
+ /* collect_features()
+ * Called during shape_plan().
+ * Shapers should use plan->map to add their features and callbacks.
+ * May be NULL.
+ */
+ void (*collect_features) (hb_ot_shape_planner_t *plan);
+
+ /* override_features()
+ * Called during shape_plan().
+ * Shapers should use plan->map to override features and add callbacks after
+ * common features are added.
+ * May be NULL.
+ */
+ void (*override_features) (hb_ot_shape_planner_t *plan);
+
+
+ /* data_create()
+ * Called at the end of shape_plan().
+ * Whatever shapers return will be accessible through plan->data later.
+ * If nullptr is returned, means a plan failure.
+ */
+ void *(*data_create) (const hb_ot_shape_plan_t *plan);
+
+ /* data_destroy()
+ * Called when the shape_plan is being destroyed.
+ * plan->data is passed here for destruction.
+ * If nullptr is returned, means a plan failure.
+ * May be NULL.
+ */
+ void (*data_destroy) (void *data);
+
+
+ /* preprocess_text()
+ * Called during shape().
+ * Shapers can use to modify text before shaping starts.
+ * May be NULL.
+ */
+ void (*preprocess_text) (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font);
+
+ /* postprocess_glyphs()
+ * Called during shape().
+ * Shapers can use to modify glyphs after shaping ends.
+ * May be NULL.
+ */
+ void (*postprocess_glyphs) (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font);
+
+
+ hb_ot_shape_normalization_mode_t normalization_preference;
+
+ /* decompose()
+ * Called during shape()'s normalization.
+ * May be NULL.
+ */
+ bool (*decompose) (const hb_ot_shape_normalize_context_t *c,
+ hb_codepoint_t ab,
+ hb_codepoint_t *a,
+ hb_codepoint_t *b);
+
+ /* compose()
+ * Called during shape()'s normalization.
+ * May be NULL.
+ */
+ bool (*compose) (const hb_ot_shape_normalize_context_t *c,
+ hb_codepoint_t a,
+ hb_codepoint_t b,
+ hb_codepoint_t *ab);
+
+ /* setup_masks()
+ * Called during shape().
+ * Shapers should use map to get feature masks and set on buffer.
+ * Shapers may NOT modify characters.
+ * May be NULL.
+ */
+ void (*setup_masks) (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font);
+
+ /* gpos_tag()
+ * If not HB_TAG_NONE, then must match found GPOS script tag for
+ * GPOS to be applied. Otherwise, fallback positioning will be used.
+ */
+ hb_tag_t gpos_tag;
+
+ /* reorder_marks()
+ * Called during shape().
+ * Shapers can use to modify ordering of combining marks.
+ * May be NULL.
+ */
+ void (*reorder_marks) (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ unsigned int start,
+ unsigned int end);
+
+ hb_ot_shape_zero_width_marks_type_t zero_width_marks;
+
+ bool fallback_position;
+};
+
+#define HB_COMPLEX_SHAPER_IMPLEMENT(name) extern HB_INTERNAL const hb_ot_complex_shaper_t _hb_ot_complex_shaper_##name;
+HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
+#undef HB_COMPLEX_SHAPER_IMPLEMENT
+
+
+static inline const hb_ot_complex_shaper_t *
+hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
+{
+ switch ((hb_tag_t) planner->props.script)
+ {
+ default:
+ return &_hb_ot_complex_shaper_default;
+
+
+ /* Unicode-1.1 additions */
+ case HB_SCRIPT_ARABIC:
+
+ /* Unicode-3.0 additions */
+ case HB_SCRIPT_MONGOLIAN:
+ case HB_SCRIPT_SYRIAC:
+
+ /* Unicode-5.0 additions */
+ case HB_SCRIPT_NKO:
+ case HB_SCRIPT_PHAGS_PA:
+
+ /* Unicode-6.0 additions */
+ case HB_SCRIPT_MANDAIC:
+
+ /* Unicode-7.0 additions */
+ case HB_SCRIPT_MANICHAEAN:
+ case HB_SCRIPT_PSALTER_PAHLAVI:
+
+ /* Unicode-9.0 additions */
+ case HB_SCRIPT_ADLAM:
+
+ /* Unicode-11.0 additions */
+ case HB_SCRIPT_HANIFI_ROHINGYA:
+ case HB_SCRIPT_SOGDIAN:
+
+ /* For Arabic script, use the Arabic shaper even if no OT script tag was found.
+ * This is because we do fallback shaping for Arabic script (and not others).
+ * But note that Arabic shaping is applicable only to horizontal layout; for
+ * vertical text, just use the generic shaper instead. */
+ if ((planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT ||
+ planner->props.script == HB_SCRIPT_ARABIC) &&
+ HB_DIRECTION_IS_HORIZONTAL(planner->props.direction))
+ return &_hb_ot_complex_shaper_arabic;
+ else
+ return &_hb_ot_complex_shaper_default;
+
+
+ /* Unicode-1.1 additions */
+ case HB_SCRIPT_THAI:
+ case HB_SCRIPT_LAO:
+
+ return &_hb_ot_complex_shaper_thai;
+
+
+ /* Unicode-1.1 additions */
+ case HB_SCRIPT_HANGUL:
+
+ return &_hb_ot_complex_shaper_hangul;
+
+
+ /* Unicode-1.1 additions */
+ case HB_SCRIPT_HEBREW:
+
+ return &_hb_ot_complex_shaper_hebrew;
+
+
+ /* Unicode-1.1 additions */
+ case HB_SCRIPT_BENGALI:
+ case HB_SCRIPT_DEVANAGARI:
+ case HB_SCRIPT_GUJARATI:
+ case HB_SCRIPT_GURMUKHI:
+ case HB_SCRIPT_KANNADA:
+ case HB_SCRIPT_MALAYALAM:
+ case HB_SCRIPT_ORIYA:
+ case HB_SCRIPT_TAMIL:
+ case HB_SCRIPT_TELUGU:
+
+ /* Unicode-3.0 additions */
+ case HB_SCRIPT_SINHALA:
+
+ /* If the designer designed the font for the 'DFLT' script,
+ * (or we ended up arbitrarily pick 'latn'), use the default shaper.
+ * Otherwise, use the specific shaper.
+ *
+ * If it's indy3 tag, send to USE. */
+ if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
+ planner->map.chosen_script[0] == HB_TAG ('l','a','t','n'))
+ return &_hb_ot_complex_shaper_default;
+ else if ((planner->map.chosen_script[0] & 0x000000FF) == '3')
+ return &_hb_ot_complex_shaper_use;
+ else
+ return &_hb_ot_complex_shaper_indic;
+
+ case HB_SCRIPT_KHMER:
+ return &_hb_ot_complex_shaper_khmer;
+
+ case HB_SCRIPT_MYANMAR:
+ /* If the designer designed the font for the 'DFLT' script,
+ * (or we ended up arbitrarily pick 'latn'), use the default shaper.
+ * Otherwise, use the specific shaper.
+ *
+ * If designer designed for 'mymr' tag, also send to default
+ * shaper. That's tag used from before Myanmar shaping spec
+ * was developed. The shaping spec uses 'mym2' tag. */
+ if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
+ planner->map.chosen_script[0] == HB_TAG ('l','a','t','n') ||
+ planner->map.chosen_script[0] == HB_TAG ('m','y','m','r'))
+ return &_hb_ot_complex_shaper_default;
+ else
+ return &_hb_ot_complex_shaper_myanmar;
+
+
+ /* https://github.com/harfbuzz/harfbuzz/issues/1162 */
+ case HB_SCRIPT_MYANMAR_ZAWGYI:
+
+ return &_hb_ot_complex_shaper_myanmar_zawgyi;
+
+
+ /* Unicode-2.0 additions */
+ case HB_SCRIPT_TIBETAN:
+
+ /* Unicode-3.0 additions */
+ //case HB_SCRIPT_MONGOLIAN:
+ //case HB_SCRIPT_SINHALA:
+
+ /* Unicode-3.2 additions */
+ case HB_SCRIPT_BUHID:
+ case HB_SCRIPT_HANUNOO:
+ case HB_SCRIPT_TAGALOG:
+ case HB_SCRIPT_TAGBANWA:
+
+ /* Unicode-4.0 additions */
+ case HB_SCRIPT_LIMBU:
+ case HB_SCRIPT_TAI_LE:
+
+ /* Unicode-4.1 additions */
+ case HB_SCRIPT_BUGINESE:
+ case HB_SCRIPT_KHAROSHTHI:
+ case HB_SCRIPT_SYLOTI_NAGRI:
+ case HB_SCRIPT_TIFINAGH:
+
+ /* Unicode-5.0 additions */
+ case HB_SCRIPT_BALINESE:
+ //case HB_SCRIPT_NKO:
+ //case HB_SCRIPT_PHAGS_PA:
+
+ /* Unicode-5.1 additions */
+ case HB_SCRIPT_CHAM:
+ case HB_SCRIPT_KAYAH_LI:
+ case HB_SCRIPT_LEPCHA:
+ case HB_SCRIPT_REJANG:
+ case HB_SCRIPT_SAURASHTRA:
+ case HB_SCRIPT_SUNDANESE:
+
+ /* Unicode-5.2 additions */
+ case HB_SCRIPT_EGYPTIAN_HIEROGLYPHS:
+ case HB_SCRIPT_JAVANESE:
+ case HB_SCRIPT_KAITHI:
+ case HB_SCRIPT_MEETEI_MAYEK:
+ case HB_SCRIPT_TAI_THAM:
+ case HB_SCRIPT_TAI_VIET:
+
+ /* Unicode-6.0 additions */
+ case HB_SCRIPT_BATAK:
+ case HB_SCRIPT_BRAHMI:
+ //case HB_SCRIPT_MANDAIC:
+
+ /* Unicode-6.1 additions */
+ case HB_SCRIPT_CHAKMA:
+ case HB_SCRIPT_SHARADA:
+ case HB_SCRIPT_TAKRI:
+
+ /* Unicode-7.0 additions */
+ case HB_SCRIPT_DUPLOYAN:
+ case HB_SCRIPT_GRANTHA:
+ case HB_SCRIPT_KHOJKI:
+ case HB_SCRIPT_KHUDAWADI:
+ case HB_SCRIPT_MAHAJANI:
+ //case HB_SCRIPT_MANICHAEAN:
+ case HB_SCRIPT_MODI:
+ case HB_SCRIPT_PAHAWH_HMONG:
+ //case HB_SCRIPT_PSALTER_PAHLAVI:
+ case HB_SCRIPT_SIDDHAM:
+ case HB_SCRIPT_TIRHUTA:
+
+ /* Unicode-8.0 additions */
+ case HB_SCRIPT_AHOM:
+
+ /* Unicode-9.0 additions */
+ //case HB_SCRIPT_ADLAM:
+ case HB_SCRIPT_BHAIKSUKI:
+ case HB_SCRIPT_MARCHEN:
+ case HB_SCRIPT_NEWA:
+
+ /* Unicode-10.0 additions */
+ case HB_SCRIPT_MASARAM_GONDI:
+ case HB_SCRIPT_SOYOMBO:
+ case HB_SCRIPT_ZANABAZAR_SQUARE:
+
+ /* Unicode-11.0 additions */
+ case HB_SCRIPT_DOGRA:
+ case HB_SCRIPT_GUNJALA_GONDI:
+ //case HB_SCRIPT_HANIFI_ROHINGYA:
+ case HB_SCRIPT_MAKASAR:
+ //case HB_SCRIPT_SOGDIAN:
+
+ /* Unicode-12.0 additions */
+ case HB_SCRIPT_NANDINAGARI:
+
+ /* If the designer designed the font for the 'DFLT' script,
+ * (or we ended up arbitrarily pick 'latn'), use the default shaper.
+ * Otherwise, use the specific shaper.
+ * Note that for some simple scripts, there may not be *any*
+ * GSUB/GPOS needed, so there may be no scripts found! */
+ if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
+ planner->map.chosen_script[0] == HB_TAG ('l','a','t','n'))
+ return &_hb_ot_complex_shaper_default;
+ else
+ return &_hb_ot_complex_shaper_use;
+ }
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback-private.hh
deleted file mode 100644
index e134224df9..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback-private.hh
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright © 2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_SHAPE_FALLBACK_PRIVATE_HH
-#define HB_OT_SHAPE_FALLBACK_PRIVATE_HH
-
-#include "hb-private.hh"
-
-#include "hb-ot-shape-private.hh"
-
-
-HB_INTERNAL void _hb_ot_shape_fallback_position (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
-
-HB_INTERNAL void _hb_ot_shape_fallback_position_recategorize_marks (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
-
-
-HB_INTERNAL void _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
-
-HB_INTERNAL void _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer);
-
-
-#endif /* HB_OT_SHAPE_FALLBACK_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc
index 458c8eaa04..024bcfe04f 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc
@@ -24,8 +24,12 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-ot-shape-fallback-private.hh"
-#include "hb-ot-layout-gsubgpos-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-fallback.hh"
+#include "hb-kern.hh"
static unsigned int
recategorize_combining_class (hb_codepoint_t u,
@@ -41,30 +45,30 @@ recategorize_combining_class (hb_codepoint_t u,
{
switch (u)
{
- case 0x0E31u:
- case 0x0E34u:
- case 0x0E35u:
- case 0x0E36u:
- case 0x0E37u:
- case 0x0E47u:
- case 0x0E4Cu:
- case 0x0E4Du:
- case 0x0E4Eu:
+ case 0x0E31u:
+ case 0x0E34u:
+ case 0x0E35u:
+ case 0x0E36u:
+ case 0x0E37u:
+ case 0x0E47u:
+ case 0x0E4Cu:
+ case 0x0E4Du:
+ case 0x0E4Eu:
klass = HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT;
break;
- case 0x0EB1u:
- case 0x0EB4u:
- case 0x0EB5u:
- case 0x0EB6u:
- case 0x0EB7u:
- case 0x0EBBu:
- case 0x0ECCu:
- case 0x0ECDu:
+ case 0x0EB1u:
+ case 0x0EB4u:
+ case 0x0EB5u:
+ case 0x0EB6u:
+ case 0x0EB7u:
+ case 0x0EBBu:
+ case 0x0ECCu:
+ case 0x0ECDu:
klass = HB_UNICODE_COMBINING_CLASS_ABOVE;
break;
- case 0x0EBCu:
+ case 0x0EBCu:
klass = HB_UNICODE_COMBINING_CLASS_BELOW;
break;
}
@@ -162,10 +166,14 @@ recategorize_combining_class (hb_codepoint_t u,
}
void
-_hb_ot_shape_fallback_position_recategorize_marks (const hb_ot_shape_plan_t *plan HB_UNUSED,
- hb_font_t *font HB_UNUSED,
- hb_buffer_t *buffer)
+_hb_ot_shape_fallback_mark_position_recategorize_marks (const hb_ot_shape_plan_t *plan HB_UNUSED,
+ hb_font_t *font HB_UNUSED,
+ hb_buffer_t *buffer)
{
+#ifdef HB_NO_OT_SHAPE_FALLBACK
+ return;
+#endif
+
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
@@ -180,19 +188,25 @@ _hb_ot_shape_fallback_position_recategorize_marks (const hb_ot_shape_plan_t *pla
static void
zero_mark_advances (hb_buffer_t *buffer,
unsigned int start,
- unsigned int end)
+ unsigned int end,
+ bool adjust_offsets_when_zeroing)
{
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = start; i < end; i++)
if (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
{
+ if (adjust_offsets_when_zeroing)
+ {
+ buffer->pos[i].x_offset -= buffer->pos[i].x_advance;
+ buffer->pos[i].y_offset -= buffer->pos[i].y_advance;
+ }
buffer->pos[i].x_advance = 0;
buffer->pos[i].y_advance = 0;
}
}
static inline void
-position_mark (const hb_ot_shape_plan_t *plan,
+position_mark (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_font_t *font,
hb_buffer_t *buffer,
hb_glyph_extents_t &base_extents,
@@ -200,8 +214,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
unsigned int combining_class)
{
hb_glyph_extents_t mark_extents;
- if (!font->get_glyph_extents (buffer->info[i].codepoint,
- &mark_extents))
+ if (!font->get_glyph_extents (buffer->info[i].codepoint, &mark_extents))
return;
hb_position_t y_gap = font->y_scale / 16;
@@ -219,10 +232,10 @@ position_mark (const hb_ot_shape_plan_t *plan,
case HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE:
if (buffer->props.direction == HB_DIRECTION_LTR) {
pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width / 2 - mark_extents.x_bearing;
- break;
+ break;
} else if (buffer->props.direction == HB_DIRECTION_RTL) {
pos.x_offset += base_extents.x_bearing - mark_extents.width / 2 - mark_extents.x_bearing;
- break;
+ break;
}
HB_FALLTHROUGH;
@@ -304,7 +317,8 @@ position_around_base (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer,
unsigned int base,
- unsigned int end)
+ unsigned int end,
+ bool adjust_offsets_when_zeroing)
{
hb_direction_t horiz_dir = HB_DIRECTION_INVALID;
@@ -315,14 +329,20 @@ position_around_base (const hb_ot_shape_plan_t *plan,
&base_extents))
{
/* If extents don't work, zero marks and go home. */
- zero_mark_advances (buffer, base + 1, end);
+ zero_mark_advances (buffer, base + 1, end, adjust_offsets_when_zeroing);
return;
}
- base_extents.x_bearing += buffer->pos[base].x_offset;
base_extents.y_bearing += buffer->pos[base].y_offset;
+ /* Use horizontal advance for horizontal positioning.
+ * Generally a better idea. Also works for zero-ink glyphs. See:
+ * https://github.com/harfbuzz/harfbuzz/issues/1532 */
+ base_extents.x_bearing = 0;
+ base_extents.width = font->get_glyph_h_advance (buffer->info[base].codepoint);
unsigned int lig_id = _hb_glyph_info_get_lig_id (&buffer->info[base]);
- unsigned int num_lig_components = _hb_glyph_info_get_lig_num_comps (&buffer->info[base]);
+ /* Use integer for num_lig_components such that it doesn't convert to unsigned
+ * when we divide or multiply by it. */
+ int num_lig_components = _hb_glyph_info_get_lig_num_comps (&buffer->info[base]);
hb_position_t x_offset = 0, y_offset = 0;
if (HB_DIRECTION_IS_FORWARD (buffer->props.direction)) {
@@ -331,7 +351,7 @@ position_around_base (const hb_ot_shape_plan_t *plan,
}
hb_glyph_extents_t component_extents = base_extents;
- unsigned int last_lig_component = (unsigned int) -1;
+ int last_lig_component = -1;
unsigned int last_combining_class = 255;
hb_glyph_extents_t cluster_extents = base_extents; /* Initialization is just to shut gcc up. */
hb_glyph_info_t *info = buffer->info;
@@ -340,7 +360,7 @@ position_around_base (const hb_ot_shape_plan_t *plan,
{
if (num_lig_components > 1) {
unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&info[i]);
- unsigned int this_lig_component = _hb_glyph_info_get_lig_comp (&info[i]) - 1;
+ int this_lig_component = _hb_glyph_info_get_lig_comp (&info[i]) - 1;
/* Conditions for attaching to the last component. */
if (!lig_id || lig_id != this_lig_id || this_lig_component >= num_lig_components)
this_lig_component = num_lig_components - 1;
@@ -367,7 +387,7 @@ position_around_base (const hb_ot_shape_plan_t *plan,
if (last_combining_class != this_combining_class)
{
last_combining_class = this_combining_class;
- cluster_extents = component_extents;
+ cluster_extents = component_extents;
}
position_mark (plan, font, buffer, cluster_extents, i, this_combining_class);
@@ -393,7 +413,8 @@ position_cluster (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer,
unsigned int start,
- unsigned int end)
+ unsigned int end,
+ bool adjust_offsets_when_zeroing)
{
if (end - start < 2)
return;
@@ -409,17 +430,22 @@ position_cluster (const hb_ot_shape_plan_t *plan,
if (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[j])))
break;
- position_around_base (plan, font, buffer, i, j);
+ position_around_base (plan, font, buffer, i, j, adjust_offsets_when_zeroing);
i = j - 1;
}
}
void
-_hb_ot_shape_fallback_position (const hb_ot_shape_plan_t *plan,
- hb_font_t *font,
- hb_buffer_t *buffer)
+_hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer,
+ bool adjust_offsets_when_zeroing)
{
+#ifdef HB_NO_OT_SHAPE_FALLBACK
+ return;
+#endif
+
_hb_buffer_assert_gsubgpos_vars (buffer);
unsigned int start = 0;
@@ -427,79 +453,74 @@ _hb_ot_shape_fallback_position (const hb_ot_shape_plan_t *plan,
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 1; i < count; i++)
if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])))) {
- position_cluster (plan, font, buffer, start, i);
+ position_cluster (plan, font, buffer, start, i, adjust_offsets_when_zeroing);
start = i;
}
- position_cluster (plan, font, buffer, start, count);
+ position_cluster (plan, font, buffer, start, count, adjust_offsets_when_zeroing);
}
-/* Performs old-style TrueType kerning. */
+#ifndef HB_DISABLE_DEPRECATED
+struct hb_ot_shape_fallback_kern_driver_t
+{
+ hb_ot_shape_fallback_kern_driver_t (hb_font_t *font_,
+ hb_buffer_t *buffer) :
+ font (font_), direction (buffer->props.direction) {}
+
+ hb_position_t get_kerning (hb_codepoint_t first, hb_codepoint_t second) const
+ {
+ hb_position_t kern = 0;
+ font->get_glyph_kerning_for_direction (first, second,
+ direction,
+ &kern, &kern);
+ return kern;
+ }
+
+ hb_font_t *font;
+ hb_direction_t direction;
+};
+#endif
+
+/* Performs font-assisted kerning. */
void
_hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
- hb_buffer_t *buffer)
+ hb_buffer_t *buffer)
{
- if (!plan->has_kern) return;
-
- OT::hb_apply_context_t c (1, font, buffer);
- c.set_lookup_mask (plan->kern_mask);
- c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
- OT::hb_apply_context_t::skipping_iterator_t &skippy_iter = c.iter_input;
- skippy_iter.init (&c);
-
- unsigned int count = buffer->len;
- hb_glyph_info_t *info = buffer->info;
- hb_glyph_position_t *pos = buffer->pos;
- for (unsigned int idx = 0; idx < count;)
- {
- skippy_iter.reset (idx, 1);
- if (!skippy_iter.next ())
- {
- idx++;
- continue;
- }
+#ifdef HB_NO_OT_SHAPE_FALLBACK
+ return;
+#endif
+
+#ifndef HB_DISABLE_DEPRECATED
+ if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction) ?
+ !font->has_glyph_h_kerning_func () :
+ !font->has_glyph_v_kerning_func ())
+ return;
- hb_position_t x_kern, y_kern;
- font->get_glyph_kerning_for_direction (info[idx].codepoint,
- info[skippy_iter.idx].codepoint,
- buffer->props.direction,
- &x_kern, &y_kern);
+ bool reverse = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
- if (x_kern)
- {
- hb_position_t kern1 = x_kern >> 1;
- hb_position_t kern2 = x_kern - kern1;
- pos[idx].x_advance += kern1;
- pos[skippy_iter.idx].x_advance += kern2;
- pos[skippy_iter.idx].x_offset += kern2;
- }
+ if (reverse)
+ buffer->reverse ();
- if (y_kern)
- {
- hb_position_t kern1 = y_kern >> 1;
- hb_position_t kern2 = y_kern - kern1;
- pos[idx].y_advance += kern1;
- pos[skippy_iter.idx].y_advance += kern2;
- pos[skippy_iter.idx].y_offset += kern2;
- }
+ hb_ot_shape_fallback_kern_driver_t driver (font, buffer);
+ OT::hb_kern_machine_t<hb_ot_shape_fallback_kern_driver_t> machine (driver);
+ machine.kern (font, buffer, plan->kern_mask, false);
- idx = skippy_iter.idx;
- }
+ if (reverse)
+ buffer->reverse ();
+#endif
}
/* Adjusts width of various spaces. */
void
-_hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
+_hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_font_t *font,
hb_buffer_t *buffer)
{
- if (!HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
- return;
-
hb_glyph_info_t *info = buffer->info;
hb_glyph_position_t *pos = buffer->pos;
+ bool horizontal = HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction);
unsigned int count = buffer->len;
for (unsigned int i = 0; i < count; i++)
if (_hb_glyph_info_is_unicode_space (&info[i]) && !_hb_glyph_info_ligated (&info[i]))
@@ -520,37 +541,56 @@ _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
case t::SPACE_EM_5:
case t::SPACE_EM_6:
case t::SPACE_EM_16:
- pos[i].x_advance = (font->x_scale + ((int) space_type)/2) / (int) space_type;
+ if (horizontal)
+ pos[i].x_advance = +(font->x_scale + ((int) space_type)/2) / (int) space_type;
+ else
+ pos[i].y_advance = -(font->y_scale + ((int) space_type)/2) / (int) space_type;
break;
case t::SPACE_4_EM_18:
- pos[i].x_advance = font->x_scale * 4 / 18;
+ if (horizontal)
+ pos[i].x_advance = (int64_t) +font->x_scale * 4 / 18;
+ else
+ pos[i].y_advance = (int64_t) -font->y_scale * 4 / 18;
break;
case t::SPACE_FIGURE:
for (char u = '0'; u <= '9'; u++)
if (font->get_nominal_glyph (u, &glyph))
{
- pos[i].x_advance = font->get_glyph_h_advance (glyph);
+ if (horizontal)
+ pos[i].x_advance = font->get_glyph_h_advance (glyph);
+ else
+ pos[i].y_advance = font->get_glyph_v_advance (glyph);
break;
}
break;
case t::SPACE_PUNCTUATION:
- if (font->get_nominal_glyph ('.', &glyph))
- pos[i].x_advance = font->get_glyph_h_advance (glyph);
- else if (font->get_nominal_glyph (',', &glyph))
- pos[i].x_advance = font->get_glyph_h_advance (glyph);
+ if (font->get_nominal_glyph ('.', &glyph) ||
+ font->get_nominal_glyph (',', &glyph))
+ {
+ if (horizontal)
+ pos[i].x_advance = font->get_glyph_h_advance (glyph);
+ else
+ pos[i].y_advance = font->get_glyph_v_advance (glyph);
+ }
break;
case t::SPACE_NARROW:
/* Half-space?
- * Unicode doc http://www.unicode.org/charts/PDF/U2000.pdf says ~1/4 or 1/5 of EM.
+ * Unicode doc https://unicode.org/charts/PDF/U2000.pdf says ~1/4 or 1/5 of EM.
* However, in my testing, many fonts have their regular space being about that
* size. To me, a percentage of the space width makes more sense. Half is as
* good as any. */
- pos[i].x_advance /= 2;
+ if (horizontal)
+ pos[i].x_advance /= 2;
+ else
+ pos[i].y_advance /= 2;
break;
}
}
}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.hh
new file mode 100644
index 0000000000..5faf5f2dfb
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.hh
@@ -0,0 +1,54 @@
+/*
+ * Copyright © 2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_FALLBACK_HH
+#define HB_OT_SHAPE_FALLBACK_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape.hh"
+
+
+HB_INTERNAL void _hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer,
+ bool adjust_offsets_when_zeroing);
+
+HB_INTERNAL void _hb_ot_shape_fallback_mark_position_recategorize_marks (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
+
+HB_INTERNAL void _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
+HB_INTERNAL void _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
+
+#endif /* HB_OT_SHAPE_FALLBACK_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize-private.hh
deleted file mode 100644
index c744e26451..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize-private.hh
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright © 2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_SHAPE_NORMALIZE_PRIVATE_HH
-#define HB_OT_SHAPE_NORMALIZE_PRIVATE_HH
-
-#include "hb-private.hh"
-
-
-/* buffer var allocations, used during the normalization process */
-#define glyph_index() var1.u32
-
-struct hb_ot_shape_plan_t;
-
-enum hb_ot_shape_normalization_mode_t {
- HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
- HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED,
- HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS, /* never composes base-to-base */
- HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, /* always fully decomposes and then recompose back */
-
- HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT = HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS
-};
-
-HB_INTERNAL void _hb_ot_shape_normalize (const hb_ot_shape_plan_t *shaper,
- hb_buffer_t *buffer,
- hb_font_t *font);
-
-
-struct hb_ot_shape_normalize_context_t
-{
- const hb_ot_shape_plan_t *plan;
- hb_buffer_t *buffer;
- hb_font_t *font;
- hb_unicode_funcs_t *unicode;
- bool (*decompose) (const hb_ot_shape_normalize_context_t *c,
- hb_codepoint_t ab,
- hb_codepoint_t *a,
- hb_codepoint_t *b);
- bool (*compose) (const hb_ot_shape_normalize_context_t *c,
- hb_codepoint_t a,
- hb_codepoint_t b,
- hb_codepoint_t *ab);
-};
-
-
-#endif /* HB_OT_SHAPE_NORMALIZE_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc
index fd9e7c2a8d..553d532574 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc
@@ -24,9 +24,13 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-ot-shape-normalize-private.hh"
-#include "hb-ot-shape-complex-private.hh"
-#include "hb-ot-shape-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-normalize.hh"
+#include "hb-ot-shape-complex.hh"
+#include "hb-ot-shape.hh"
/*
@@ -119,7 +123,7 @@ skip_char (hb_buffer_t *buffer)
static inline unsigned int
decompose (const hb_ot_shape_normalize_context_t *c, bool shortest, hb_codepoint_t ab)
{
- hb_codepoint_t a, b, a_glyph, b_glyph;
+ hb_codepoint_t a = 0, b = 0, a_glyph = 0, b_glyph = 0;
hb_buffer_t * const buffer = c->buffer;
hb_font_t * const font = c->font;
@@ -164,7 +168,7 @@ decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shor
{
hb_buffer_t * const buffer = c->buffer;
hb_codepoint_t u = buffer->cur().codepoint;
- hb_codepoint_t glyph;
+ hb_codepoint_t glyph = 0;
if (shortest && c->font->get_nominal_glyph (u, &glyph))
{
@@ -213,21 +217,23 @@ decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shor
}
static inline void
-handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool short_circuit)
+handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c,
+ unsigned int end,
+ bool short_circuit HB_UNUSED)
{
/* TODO Currently if there's a variation-selector we give-up, it's just too hard. */
hb_buffer_t * const buffer = c->buffer;
hb_font_t * const font = c->font;
- for (; buffer->idx < end - 1 && !buffer->in_error;) {
+ for (; buffer->idx < end - 1 && buffer->successful;) {
if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepoint))) {
- /* The next two lines are some ugly lines... But work. */
if (font->get_variation_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
{
- buffer->replace_glyphs (2, 1, &buffer->cur().codepoint);
+ hb_codepoint_t unicode = buffer->cur().codepoint;
+ buffer->replace_glyphs (2, 1, &unicode);
}
else
{
- /* Just pass on the two characters separately, let GSUB do its magic. */
+ /* Just pass on the two characters separately, let GSUB do its magic. */
set_glyph (buffer->cur(), font);
buffer->next_glyph ();
set_glyph (buffer->cur(), font);
@@ -254,25 +260,16 @@ static inline void
decompose_multi_char_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool short_circuit)
{
hb_buffer_t * const buffer = c->buffer;
- for (unsigned int i = buffer->idx; i < end && !buffer->in_error; i++)
+ for (unsigned int i = buffer->idx; i < end && buffer->successful; i++)
if (unlikely (buffer->unicode->is_variation_selector (buffer->info[i].codepoint))) {
handle_variation_selector_cluster (c, end, short_circuit);
return;
}
- while (buffer->idx < end && !buffer->in_error)
+ while (buffer->idx < end && buffer->successful)
decompose_current_character (c, short_circuit);
}
-static inline void
-decompose_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool might_short_circuit, bool always_short_circuit)
-{
- if (likely (c->buffer->idx + 1 == end))
- decompose_current_character (c, might_short_circuit);
- else
- decompose_multi_char_cluster (c, end, always_short_circuit);
-}
-
static int
compare_combining_class (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
@@ -294,6 +291,16 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
_hb_buffer_assert_unicode_vars (buffer);
hb_ot_shape_normalization_mode_t mode = plan->shaper->normalization_preference;
+ if (mode == HB_OT_SHAPE_NORMALIZATION_MODE_AUTO)
+ {
+ if (plan->has_gpos_mark)
+ // https://github.com/harfbuzz/harfbuzz/issues/653#issuecomment-423905920
+ //mode = HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED;
+ mode = HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS;
+ else
+ mode = HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS;
+ }
+
const hb_ot_shape_normalize_context_t c = {
plan,
buffer,
@@ -318,114 +325,154 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
/* First round, decompose */
- buffer->clear_output ();
- count = buffer->len;
- for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
+ bool all_simple = true;
{
- unsigned int end;
- for (end = buffer->idx + 1; end < count; end++)
- if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->info[end]))))
- break;
+ buffer->clear_output ();
+ count = buffer->len;
+ buffer->idx = 0;
+ do
+ {
+ unsigned int end;
+ for (end = buffer->idx + 1; end < count; end++)
+ if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->info[end]))))
+ break;
+
+ if (end < count)
+ end--; /* Leave one base for the marks to cluster with. */
- decompose_cluster (&c, end, might_short_circuit, always_short_circuit);
+ /* From idx to end are simple clusters. */
+ if (might_short_circuit)
+ {
+ unsigned int done = font->get_nominal_glyphs (end - buffer->idx,
+ &buffer->cur().codepoint,
+ sizeof (buffer->info[0]),
+ &buffer->cur().glyph_index(),
+ sizeof (buffer->info[0]));
+ buffer->next_glyphs (done);
+ }
+ while (buffer->idx < end && buffer->successful)
+ decompose_current_character (&c, might_short_circuit);
+
+ if (buffer->idx == count || !buffer->successful)
+ break;
+
+ all_simple = false;
+
+ /* Find all the marks now. */
+ for (end = buffer->idx + 1; end < count; end++)
+ if (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->info[end])))
+ break;
+
+ /* idx to end is one non-simple cluster. */
+ decompose_multi_char_cluster (&c, end, always_short_circuit);
+ }
+ while (buffer->idx < count && buffer->successful);
+ buffer->swap_buffers ();
}
- buffer->swap_buffers ();
/* Second round, reorder (inplace) */
- count = buffer->len;
- for (unsigned int i = 0; i < count; i++)
+ if (!all_simple)
{
- if (_hb_glyph_info_get_modified_combining_class (&buffer->info[i]) == 0)
- continue;
+ count = buffer->len;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (_hb_glyph_info_get_modified_combining_class (&buffer->info[i]) == 0)
+ continue;
- unsigned int end;
- for (end = i + 1; end < count; end++)
- if (_hb_glyph_info_get_modified_combining_class (&buffer->info[end]) == 0)
- break;
+ unsigned int end;
+ for (end = i + 1; end < count; end++)
+ if (_hb_glyph_info_get_modified_combining_class (&buffer->info[end]) == 0)
+ break;
- /* We are going to do a O(n^2). Only do this if the sequence is short,
- * but not too short ;). */
- if (end - i < 2 || end - i > HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS) {
- i = end;
- continue;
- }
+ /* We are going to do a O(n^2). Only do this if the sequence is short. */
+ if (end - i > HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS) {
+ i = end;
+ continue;
+ }
- buffer->sort (i, end, compare_combining_class);
+ buffer->sort (i, end, compare_combining_class);
- if (plan->shaper->reorder_marks)
- plan->shaper->reorder_marks (plan, buffer, i, end);
+ if (plan->shaper->reorder_marks)
+ plan->shaper->reorder_marks (plan, buffer, i, end);
- i = end;
+ i = end;
+ }
+ }
+ if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CGJ)
+ {
+ /* For all CGJ, check if it prevented any reordering at all.
+ * If it did NOT, then make it skippable.
+ * https://github.com/harfbuzz/harfbuzz/issues/554
+ */
+ for (unsigned int i = 1; i + 1 < buffer->len; i++)
+ if (buffer->info[i].codepoint == 0x034Fu/*CGJ*/ &&
+ info_cc(buffer->info[i-1]) <= info_cc(buffer->info[i+1]))
+ {
+ _hb_glyph_info_unhide (&buffer->info[i]);
+ }
}
- if (mode == HB_OT_SHAPE_NORMALIZATION_MODE_NONE ||
- mode == HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED)
- return;
-
/* Third round, recompose */
- /* As noted in the comment earlier, we don't try to combine
- * ccc=0 chars with their previous Starter. */
-
- buffer->clear_output ();
- count = buffer->len;
- unsigned int starter = 0;
- bool combine = true;
- buffer->next_glyph ();
- while (buffer->idx < count && !buffer->in_error)
+ if (!all_simple &&
+ (mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS ||
+ mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT))
{
- hb_codepoint_t composed, glyph;
- if (combine &&
- /* We don't try to compose a non-mark character with it's preceding starter.
- * This is both an optimization to avoid trying to compose every two neighboring
- * glyphs in most scripts AND a desired feature for Hangul. Apparently Hangul
- * fonts are not designed to mix-and-match pre-composed syllables and Jamo. */
- HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->cur())))
+ /* As noted in the comment earlier, we don't try to combine
+ * ccc=0 chars with their previous Starter. */
+
+ buffer->clear_output ();
+ count = buffer->len;
+ unsigned int starter = 0;
+ buffer->next_glyph ();
+ while (buffer->idx < count && buffer->successful)
{
- if (/* If there's anything between the starter and this char, they should have CCC
- * smaller than this character's. */
- (starter == buffer->out_len - 1 ||
- info_cc (buffer->prev()) < info_cc (buffer->cur())) &&
- /* And compose. */
- c.compose (&c,
- buffer->out_info[starter].codepoint,
- buffer->cur().codepoint,
- &composed) &&
- /* And the font has glyph for the composite. */
- font->get_nominal_glyph (composed, &glyph))
+ hb_codepoint_t composed, glyph;
+ if (/* We don't try to compose a non-mark character with it's preceding starter.
+ * This is both an optimization to avoid trying to compose every two neighboring
+ * glyphs in most scripts AND a desired feature for Hangul. Apparently Hangul
+ * fonts are not designed to mix-and-match pre-composed syllables and Jamo. */
+ HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->cur())))
{
- /* Composes. */
- buffer->next_glyph (); /* Copy to out-buffer. */
- if (unlikely (buffer->in_error))
- return;
- buffer->merge_out_clusters (starter, buffer->out_len);
- buffer->out_len--; /* Remove the second composable. */
- /* Modify starter and carry on. */
- buffer->out_info[starter].codepoint = composed;
- buffer->out_info[starter].glyph_index() = glyph;
- _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer);
-
- continue;
+ if (/* If there's anything between the starter and this char, they should have CCC
+ * smaller than this character's. */
+ (starter == buffer->out_len - 1 ||
+ info_cc (buffer->prev()) < info_cc (buffer->cur())) &&
+ /* And compose. */
+ c.compose (&c,
+ buffer->out_info[starter].codepoint,
+ buffer->cur().codepoint,
+ &composed) &&
+ /* And the font has glyph for the composite. */
+ font->get_nominal_glyph (composed, &glyph))
+ {
+ /* Composes. */
+ buffer->next_glyph (); /* Copy to out-buffer. */
+ if (unlikely (!buffer->successful))
+ return;
+ buffer->merge_out_clusters (starter, buffer->out_len);
+ buffer->out_len--; /* Remove the second composable. */
+ /* Modify starter and carry on. */
+ buffer->out_info[starter].codepoint = composed;
+ buffer->out_info[starter].glyph_index() = glyph;
+ _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer);
+
+ continue;
+ }
}
- else if (/* We sometimes custom-tailor the sorted order of marks. In that case, stop
- * trying to combine as soon as combining-class drops. */
- starter < buffer->out_len - 1 &&
- info_cc (buffer->prev()) > info_cc (buffer->cur()))
- combine = false;
- }
- /* Blocked, or doesn't compose. */
- buffer->next_glyph ();
+ /* Blocked, or doesn't compose. */
+ buffer->next_glyph ();
- if (info_cc (buffer->prev()) == 0)
- {
- starter = buffer->out_len - 1;
- combine = true;
+ if (info_cc (buffer->prev()) == 0)
+ starter = buffer->out_len - 1;
}
+ buffer->swap_buffers ();
}
- buffer->swap_buffers ();
-
}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.hh
new file mode 100644
index 0000000000..04f1a80091
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.hh
@@ -0,0 +1,70 @@
+/*
+ * Copyright © 2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_NORMALIZE_HH
+#define HB_OT_SHAPE_NORMALIZE_HH
+
+#include "hb.hh"
+
+
+/* buffer var allocations, used during the normalization process */
+#define glyph_index() var1.u32
+
+struct hb_ot_shape_plan_t;
+
+enum hb_ot_shape_normalization_mode_t {
+ HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
+ HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED,
+ HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS, /* Never composes base-to-base */
+ HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, /* Always fully decomposes and then recompose back */
+
+ HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, /* See hb-ot-shape-normalize.cc for logic. */
+ HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT = HB_OT_SHAPE_NORMALIZATION_MODE_AUTO
+};
+
+HB_INTERNAL void _hb_ot_shape_normalize (const hb_ot_shape_plan_t *shaper,
+ hb_buffer_t *buffer,
+ hb_font_t *font);
+
+
+struct hb_ot_shape_normalize_context_t
+{
+ const hb_ot_shape_plan_t *plan;
+ hb_buffer_t *buffer;
+ hb_font_t *font;
+ hb_unicode_funcs_t *unicode;
+ bool (*decompose) (const hb_ot_shape_normalize_context_t *c,
+ hb_codepoint_t ab,
+ hb_codepoint_t *a,
+ hb_codepoint_t *b);
+ bool (*compose) (const hb_ot_shape_normalize_context_t *c,
+ hb_codepoint_t a,
+ hb_codepoint_t b,
+ hb_codepoint_t *ab);
+};
+
+
+#endif /* HB_OT_SHAPE_NORMALIZE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-private.hh
deleted file mode 100644
index fe5d2b7f33..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-private.hh
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright © 2010 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_SHAPE_PRIVATE_HH
-#define HB_OT_SHAPE_PRIVATE_HH
-
-#include "hb-private.hh"
-
-#include "hb-ot-map-private.hh"
-#include "hb-ot-layout-private.hh"
-
-
-
-struct hb_ot_shape_plan_t
-{
- hb_segment_properties_t props;
- const struct hb_ot_complex_shaper_t *shaper;
- hb_ot_map_t map;
- const void *data;
- hb_mask_t rtlm_mask, frac_mask, numr_mask, dnom_mask;
- hb_mask_t kern_mask;
- unsigned int has_frac : 1;
- unsigned int has_kern : 1;
- unsigned int has_mark : 1;
-
- inline void collect_lookups (hb_tag_t table_tag, hb_set_t *lookups) const
- {
- unsigned int table_index;
- switch (table_tag) {
- case HB_OT_TAG_GSUB: table_index = 0; break;
- case HB_OT_TAG_GPOS: table_index = 1; break;
- default: return;
- }
- map.collect_lookups (table_index, lookups);
- }
- inline void substitute (hb_font_t *font, hb_buffer_t *buffer) const { map.substitute (this, font, buffer); }
- inline void position (hb_font_t *font, hb_buffer_t *buffer) const { map.position (this, font, buffer); }
-
- void finish (void) { map.finish (); }
-};
-
-struct hb_ot_shape_planner_t
-{
- /* In the order that they are filled in. */
- hb_face_t *face;
- hb_segment_properties_t props;
- const struct hb_ot_complex_shaper_t *shaper;
- hb_ot_map_builder_t map;
-
- hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan) :
- face (master_plan->face_unsafe),
- props (master_plan->props),
- shaper (nullptr),
- map (face, &props) {}
- ~hb_ot_shape_planner_t (void) { map.finish (); }
-
- inline void compile (hb_ot_shape_plan_t &plan,
- const int *coords,
- unsigned int num_coords)
- {
- plan.props = props;
- plan.shaper = shaper;
- map.compile (plan.map, coords, num_coords);
-
- plan.rtlm_mask = plan.map.get_1_mask (HB_TAG ('r','t','l','m'));
- plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c'));
- plan.numr_mask = plan.map.get_1_mask (HB_TAG ('n','u','m','r'));
- plan.dnom_mask = plan.map.get_1_mask (HB_TAG ('d','n','o','m'));
-
- plan.kern_mask = plan.map.get_mask (HB_DIRECTION_IS_HORIZONTAL (plan.props.direction) ?
- HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n'));
-
- plan.has_frac = plan.frac_mask || (plan.numr_mask && plan.dnom_mask);
- plan.has_kern = !!plan.kern_mask;
- plan.has_mark = !!plan.map.get_1_mask (HB_TAG ('m','a','r','k'));
- }
-
- private:
- /* No copy. */
- hb_ot_shape_planner_t (const hb_ot_shape_planner_t &);
- hb_ot_shape_planner_t &operator = (const hb_ot_shape_planner_t &);
-};
-
-
-#endif /* HB_OT_SHAPE_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc
index 2f28b5620d..5d9a70cda2 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc
@@ -26,60 +26,305 @@
* Google Author(s): Behdad Esfahbod
*/
-#define HB_SHAPER ot
-#define hb_ot_shaper_face_data_t hb_ot_layout_t
-#define hb_ot_shaper_shape_plan_data_t hb_ot_shape_plan_t
-#include "hb-shaper-impl-private.hh"
-
-#include "hb-ot-shape-private.hh"
-#include "hb-ot-shape-complex-private.hh"
-#include "hb-ot-shape-fallback-private.hh"
-#include "hb-ot-shape-normalize-private.hh"
-
-#include "hb-ot-layout-private.hh"
-#include "hb-unicode-private.hh"
-#include "hb-set-private.hh"
-
-
-static hb_tag_t common_features[] = {
- HB_TAG('c','c','m','p'),
- HB_TAG('l','o','c','l'),
- HB_TAG('m','a','r','k'),
- HB_TAG('m','k','m','k'),
- HB_TAG('r','l','i','g'),
-};
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#ifdef HB_NO_OT_LAYOUT
+#error "Cannot compile 'ot' shaper with HB_NO_OT_LAYOUT."
+#endif
+
+#include "hb-shaper-impl.hh"
+
+#include "hb-ot-shape.hh"
+#include "hb-ot-shape-complex.hh"
+#include "hb-ot-shape-fallback.hh"
+#include "hb-ot-shape-normalize.hh"
+
+#include "hb-ot-face.hh"
+
+#include "hb-set.hh"
+#include "hb-aat-layout.hh"
-static hb_tag_t horizontal_features[] = {
- HB_TAG('c','a','l','t'),
- HB_TAG('c','l','i','g'),
- HB_TAG('c','u','r','s'),
- HB_TAG('k','e','r','n'),
- HB_TAG('l','i','g','a'),
- HB_TAG('r','c','l','t'),
+
+/**
+ * SECTION:hb-ot-shape
+ * @title: hb-ot-shape
+ * @short_description: OpenType shaping support
+ * @include: hb-ot.h
+ *
+ * Support functions for OpenType shaping related queries.
+ **/
+
+
+static void
+hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
+ const hb_feature_t *user_features,
+ unsigned int num_user_features);
+
+#ifndef HB_NO_AAT_SHAPE
+static inline bool
+_hb_apply_morx (hb_face_t *face)
+{
+ if (hb_options ().aat &&
+ hb_aat_layout_has_substitution (face))
+ return true;
+
+ /* Ignore empty GSUB tables. */
+ return (!hb_ot_layout_has_substitution (face) ||
+ !hb_ot_layout_table_get_script_tags (face,
+ HB_OT_TAG_GSUB,
+ 0, nullptr, nullptr)) &&
+ hb_aat_layout_has_substitution (face);
+}
+#endif
+
+hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t *face,
+ const hb_segment_properties_t *props) :
+ face (face),
+ props (*props),
+ map (face, props),
+ aat_map (face, props)
+#ifndef HB_NO_AAT_SHAPE
+ , apply_morx (_hb_apply_morx (face))
+#endif
+{
+ shaper = hb_ot_shape_complex_categorize (this);
+
+ script_zero_marks = shaper->zero_width_marks != HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE;
+ script_fallback_mark_positioning = shaper->fallback_position;
+
+ if (apply_morx)
+ shaper = &_hb_ot_complex_shaper_default;
+}
+
+void
+hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan,
+ const hb_ot_shape_plan_key_t &key)
+{
+ plan.props = props;
+ plan.shaper = shaper;
+ map.compile (plan.map, key);
+#ifndef HB_NO_AAT_SHAPE
+ if (apply_morx)
+ aat_map.compile (plan.aat_map);
+#endif
+
+#ifndef HB_NO_OT_SHAPE_FRACTIONS
+ plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c'));
+ plan.numr_mask = plan.map.get_1_mask (HB_TAG ('n','u','m','r'));
+ plan.dnom_mask = plan.map.get_1_mask (HB_TAG ('d','n','o','m'));
+ plan.has_frac = plan.frac_mask || (plan.numr_mask && plan.dnom_mask);
+#endif
+
+ plan.rtlm_mask = plan.map.get_1_mask (HB_TAG ('r','t','l','m'));
+ hb_tag_t kern_tag = HB_DIRECTION_IS_HORIZONTAL (props.direction) ?
+ HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n');
+#ifndef HB_NO_OT_KERN
+ plan.kern_mask = plan.map.get_mask (kern_tag);
+ plan.requested_kerning = !!plan.kern_mask;
+#endif
+#ifndef HB_NO_AAT_SHAPE
+ plan.trak_mask = plan.map.get_mask (HB_TAG ('t','r','a','k'));
+ plan.requested_tracking = !!plan.trak_mask;
+#endif
+
+ bool has_gpos_kern = plan.map.get_feature_index (1, kern_tag) != HB_OT_LAYOUT_NO_FEATURE_INDEX;
+ bool disable_gpos = plan.shaper->gpos_tag &&
+ plan.shaper->gpos_tag != plan.map.chosen_script[1];
+
+ /*
+ * Decide who provides glyph classes. GDEF or Unicode.
+ */
+
+ if (!hb_ot_layout_has_glyph_classes (face))
+ plan.fallback_glyph_classes = true;
+
+ /*
+ * Decide who does substitutions. GSUB, morx, or fallback.
+ */
+
+#ifndef HB_NO_AAT_SHAPE
+ plan.apply_morx = apply_morx;
+#endif
+
+ /*
+ * Decide who does positioning. GPOS, kerx, kern, or fallback.
+ */
+
+ if (0)
+ ;
+#ifndef HB_NO_AAT_SHAPE
+ else if (hb_options ().aat && hb_aat_layout_has_positioning (face))
+ plan.apply_kerx = true;
+#endif
+ else if (!apply_morx && !disable_gpos && hb_ot_layout_has_positioning (face))
+ plan.apply_gpos = true;
+#ifndef HB_NO_AAT_SHAPE
+ else if (hb_aat_layout_has_positioning (face))
+ plan.apply_kerx = true;
+#endif
+
+ if (!plan.apply_kerx && !has_gpos_kern)
+ {
+ /* Apparently Apple applies kerx if GPOS kern was not applied. */
+#ifndef HB_NO_AAT_SHAPE
+ if (hb_aat_layout_has_positioning (face))
+ plan.apply_kerx = true;
+ else
+#endif
+#ifndef HB_NO_OT_KERN
+ if (hb_ot_layout_has_kerning (face))
+ plan.apply_kern = true;
+#endif
+ }
+
+ plan.zero_marks = script_zero_marks &&
+ !plan.apply_kerx &&
+ (!plan.apply_kern
+#ifndef HB_NO_OT_KERN
+ || !hb_ot_layout_has_machine_kerning (face)
+#endif
+ );
+ plan.has_gpos_mark = !!plan.map.get_1_mask (HB_TAG ('m','a','r','k'));
+
+ plan.adjust_mark_positioning_when_zeroing = !plan.apply_gpos &&
+ !plan.apply_kerx &&
+ (!plan.apply_kern
+#ifndef HB_NO_OT_KERN
+ || !hb_ot_layout_has_cross_kerning (face)
+#endif
+ );
+
+ plan.fallback_mark_positioning = plan.adjust_mark_positioning_when_zeroing &&
+ script_fallback_mark_positioning;
+
+#ifndef HB_NO_AAT_SHAPE
+ /* Currently we always apply trak. */
+ plan.apply_trak = plan.requested_tracking && hb_aat_layout_has_tracking (face);
+#endif
+}
+
+bool
+hb_ot_shape_plan_t::init0 (hb_face_t *face,
+ const hb_shape_plan_key_t *key)
+{
+ map.init ();
+#ifndef HB_NO_AAT_SHAPE
+ aat_map.init ();
+#endif
+
+ hb_ot_shape_planner_t planner (face,
+ &key->props);
+
+ hb_ot_shape_collect_features (&planner,
+ key->user_features,
+ key->num_user_features);
+
+ planner.compile (*this, key->ot);
+
+ if (shaper->data_create)
+ {
+ data = shaper->data_create (this);
+ if (unlikely (!data))
+ return false;
+ }
+
+ return true;
+}
+
+void
+hb_ot_shape_plan_t::fini ()
+{
+ if (shaper->data_destroy)
+ shaper->data_destroy (const_cast<void *> (data));
+
+ map.fini ();
+#ifndef HB_NO_AAT_SHAPE
+ aat_map.fini ();
+#endif
+}
+
+void
+hb_ot_shape_plan_t::substitute (hb_font_t *font,
+ hb_buffer_t *buffer) const
+{
+#ifndef HB_NO_AAT_SHAPE
+ if (unlikely (apply_morx))
+ hb_aat_layout_substitute (this, font, buffer);
+ else
+#endif
+ map.substitute (this, font, buffer);
+}
+
+void
+hb_ot_shape_plan_t::position (hb_font_t *font,
+ hb_buffer_t *buffer) const
+{
+ if (this->apply_gpos)
+ map.position (this, font, buffer);
+#ifndef HB_NO_AAT_SHAPE
+ else if (this->apply_kerx)
+ hb_aat_layout_position (this, font, buffer);
+#endif
+#ifndef HB_NO_OT_KERN
+ else if (this->apply_kern)
+ hb_ot_layout_kern (this, font, buffer);
+#endif
+ else
+ _hb_ot_shape_fallback_kern (this, font, buffer);
+
+#ifndef HB_NO_AAT_SHAPE
+ if (this->apply_trak)
+ hb_aat_layout_track (this, font, buffer);
+#endif
+}
+
+
+static const hb_ot_map_feature_t
+common_features[] =
+{
+ {HB_TAG('a','b','v','m'), F_GLOBAL},
+ {HB_TAG('b','l','w','m'), F_GLOBAL},
+ {HB_TAG('c','c','m','p'), F_GLOBAL},
+ {HB_TAG('l','o','c','l'), F_GLOBAL},
+ {HB_TAG('m','a','r','k'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('m','k','m','k'), F_GLOBAL_MANUAL_JOINERS},
+ {HB_TAG('r','l','i','g'), F_GLOBAL},
};
+static const hb_ot_map_feature_t
+horizontal_features[] =
+{
+ {HB_TAG('c','a','l','t'), F_GLOBAL},
+ {HB_TAG('c','l','i','g'), F_GLOBAL},
+ {HB_TAG('c','u','r','s'), F_GLOBAL},
+ {HB_TAG('d','i','s','t'), F_GLOBAL},
+ {HB_TAG('k','e','r','n'), F_GLOBAL_HAS_FALLBACK},
+ {HB_TAG('l','i','g','a'), F_GLOBAL},
+ {HB_TAG('r','c','l','t'), F_GLOBAL},
+};
static void
hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
- const hb_segment_properties_t *props,
const hb_feature_t *user_features,
unsigned int num_user_features)
{
hb_ot_map_builder_t *map = &planner->map;
- map->add_global_bool_feature (HB_TAG('r','v','r','n'));
+ map->enable_feature (HB_TAG('r','v','r','n'));
map->add_gsub_pause (nullptr);
- switch (props->direction) {
+ switch (planner->props.direction) {
case HB_DIRECTION_LTR:
- map->add_global_bool_feature (HB_TAG ('l','t','r','a'));
- map->add_global_bool_feature (HB_TAG ('l','t','r','m'));
+ map->enable_feature (HB_TAG ('l','t','r','a'));
+ map->enable_feature (HB_TAG ('l','t','r','m'));
break;
case HB_DIRECTION_RTL:
- map->add_global_bool_feature (HB_TAG ('r','t','l','a'));
- map->add_feature (HB_TAG ('r','t','l','m'), 1, F_NONE);
+ map->enable_feature (HB_TAG ('r','t','l','a'));
+ map->add_feature (HB_TAG ('r','t','l','m'));
break;
case HB_DIRECTION_TTB:
case HB_DIRECTION_BTT:
@@ -88,39 +333,68 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
break;
}
- map->add_feature (HB_TAG ('f','r','a','c'), 1, F_NONE);
- map->add_feature (HB_TAG ('n','u','m','r'), 1, F_NONE);
- map->add_feature (HB_TAG ('d','n','o','m'), 1, F_NONE);
+#ifndef HB_NO_OT_SHAPE_FRACTIONS
+ /* Automatic fractions. */
+ map->add_feature (HB_TAG ('f','r','a','c'));
+ map->add_feature (HB_TAG ('n','u','m','r'));
+ map->add_feature (HB_TAG ('d','n','o','m'));
+#endif
+
+ /* Random! */
+ map->enable_feature (HB_TAG ('r','a','n','d'), F_RANDOM, HB_OT_MAP_MAX_VALUE);
+
+#ifndef HB_NO_AAT_SHAPE
+ /* Tracking. We enable dummy feature here just to allow disabling
+ * AAT 'trak' table using features.
+ * https://github.com/harfbuzz/harfbuzz/issues/1303 */
+ map->enable_feature (HB_TAG ('t','r','a','k'), F_HAS_FALLBACK);
+#endif
+
+ map->enable_feature (HB_TAG ('H','A','R','F'));
if (planner->shaper->collect_features)
planner->shaper->collect_features (planner);
+ map->enable_feature (HB_TAG ('B','U','Z','Z'));
+
for (unsigned int i = 0; i < ARRAY_LENGTH (common_features); i++)
- map->add_global_bool_feature (common_features[i]);
+ map->add_feature (common_features[i]);
- if (HB_DIRECTION_IS_HORIZONTAL (props->direction))
+ if (HB_DIRECTION_IS_HORIZONTAL (planner->props.direction))
for (unsigned int i = 0; i < ARRAY_LENGTH (horizontal_features); i++)
- map->add_feature (horizontal_features[i], 1, F_GLOBAL |
- (horizontal_features[i] == HB_TAG('k','e','r','n') ?
- F_HAS_FALLBACK : F_NONE));
+ map->add_feature (horizontal_features[i]);
else
{
/* We really want to find a 'vert' feature if there's any in the font, no
* matter which script/langsys it is listed (or not) under.
* See various bugs referenced from:
* https://github.com/harfbuzz/harfbuzz/issues/63 */
- map->add_feature (HB_TAG ('v','e','r','t'), 1, F_GLOBAL | F_GLOBAL_SEARCH);
+ map->enable_feature (HB_TAG ('v','e','r','t'), F_GLOBAL_SEARCH);
}
- if (planner->shaper->override_features)
- planner->shaper->override_features (planner);
-
- for (unsigned int i = 0; i < num_user_features; i++) {
+ for (unsigned int i = 0; i < num_user_features; i++)
+ {
const hb_feature_t *feature = &user_features[i];
- map->add_feature (feature->tag, feature->value,
- (feature->start == 0 && feature->end == (unsigned int) -1) ?
- F_GLOBAL : F_NONE);
+ map->add_feature (feature->tag,
+ (feature->start == HB_FEATURE_GLOBAL_START &&
+ feature->end == HB_FEATURE_GLOBAL_END) ? F_GLOBAL : F_NONE,
+ feature->value);
}
+
+#ifndef HB_NO_AAT_SHAPE
+ if (planner->apply_morx)
+ {
+ hb_aat_map_builder_t *aat_map = &planner->aat_map;
+ for (unsigned int i = 0; i < num_user_features; i++)
+ {
+ const hb_feature_t *feature = &user_features[i];
+ aat_map->add_feature (feature->tag, feature->value);
+ }
+ }
+#endif
+
+ if (planner->shaper->override_features)
+ planner->shaper->override_features (planner);
}
@@ -128,18 +402,17 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
* shaper face data
*/
-HB_SHAPER_DATA_ENSURE_DEFINE(ot, face)
+struct hb_ot_face_data_t {};
-hb_ot_shaper_face_data_t *
+hb_ot_face_data_t *
_hb_ot_shaper_face_data_create (hb_face_t *face)
{
- return _hb_ot_layout_create (face);
+ return (hb_ot_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
-_hb_ot_shaper_face_data_destroy (hb_ot_shaper_face_data_t *data)
+_hb_ot_shaper_face_data_destroy (hb_ot_face_data_t *data)
{
- _hb_ot_layout_destroy (data);
}
@@ -147,64 +420,17 @@ _hb_ot_shaper_face_data_destroy (hb_ot_shaper_face_data_t *data)
* shaper font data
*/
-HB_SHAPER_DATA_ENSURE_DEFINE(ot, font)
-
-struct hb_ot_shaper_font_data_t {};
+struct hb_ot_font_data_t {};
-hb_ot_shaper_font_data_t *
+hb_ot_font_data_t *
_hb_ot_shaper_font_data_create (hb_font_t *font HB_UNUSED)
{
- return (hb_ot_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
-}
-
-void
-_hb_ot_shaper_font_data_destroy (hb_ot_shaper_font_data_t *data)
-{
-}
-
-
-/*
- * shaper shape_plan data
- */
-
-hb_ot_shaper_shape_plan_data_t *
-_hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan,
- const hb_feature_t *user_features,
- unsigned int num_user_features,
- const int *coords,
- unsigned int num_coords)
-{
- hb_ot_shape_plan_t *plan = (hb_ot_shape_plan_t *) calloc (1, sizeof (hb_ot_shape_plan_t));
- if (unlikely (!plan))
- return nullptr;
-
- hb_ot_shape_planner_t planner (shape_plan);
-
- planner.shaper = hb_ot_shape_complex_categorize (&planner);
-
- hb_ot_shape_collect_features (&planner, &shape_plan->props,
- user_features, num_user_features);
-
- planner.compile (*plan, coords, num_coords);
-
- if (plan->shaper->data_create) {
- plan->data = plan->shaper->data_create (plan);
- if (unlikely (!plan->data))
- return nullptr;
- }
-
- return plan;
+ return (hb_ot_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
-_hb_ot_shaper_shape_plan_data_destroy (hb_ot_shaper_shape_plan_data_t *plan)
+_hb_ot_shaper_font_data_destroy (hb_ot_font_data_t *data HB_UNUSED)
{
- if (plan->shaper->data_destroy)
- plan->shaper->data_destroy (const_cast<void *> (plan->data));
-
- plan->finish ();
-
- free (plan);
}
@@ -222,8 +448,6 @@ struct hb_ot_shape_context_t
unsigned int num_user_features;
/* Transient stuff */
- bool fallback_positioning;
- bool fallback_glyph_classes;
hb_direction_t target_direction;
};
@@ -237,19 +461,66 @@ struct hb_ot_shape_context_t
static void
hb_set_unicode_props (hb_buffer_t *buffer)
{
+ /* Implement enough of Unicode Graphemes here that shaping
+ * in reverse-direction wouldn't break graphemes. Namely,
+ * we mark all marks and ZWJ and ZWJ,Extended_Pictographic
+ * sequences as continuations. The foreach_grapheme()
+ * macro uses this bit.
+ *
+ * https://www.unicode.org/reports/tr29/#Regex_Definitions
+ */
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
+ {
_hb_glyph_info_set_unicode_props (&info[i], buffer);
+
+ /* Marks are already set as continuation by the above line.
+ * Handle Emoji_Modifier and ZWJ-continuation. */
+ if (unlikely (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL &&
+ hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x1F3FBu, 0x1F3FFu)))
+ {
+ _hb_glyph_info_set_continuation (&info[i]);
+ }
+#ifndef HB_NO_EMOJI_SEQUENCES
+ else if (unlikely (_hb_glyph_info_is_zwj (&info[i])))
+ {
+ _hb_glyph_info_set_continuation (&info[i]);
+ if (i + 1 < count &&
+ _hb_unicode_is_emoji_Extended_Pictographic (info[i + 1].codepoint))
+ {
+ i++;
+ _hb_glyph_info_set_unicode_props (&info[i], buffer);
+ _hb_glyph_info_set_continuation (&info[i]);
+ }
+ }
+#endif
+ /* Or part of the Other_Grapheme_Extend that is not marks.
+ * As of Unicode 11 that is just:
+ *
+ * 200C ; Other_Grapheme_Extend # Cf ZERO WIDTH NON-JOINER
+ * FF9E..FF9F ; Other_Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+ * E0020..E007F ; Other_Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG
+ *
+ * ZWNJ is special, we don't want to merge it as there's no need, and keeping
+ * it separate results in more granular clusters. Ignore Katakana for now.
+ * Tags are used for Emoji sub-region flag sequences:
+ * https://github.com/harfbuzz/harfbuzz/issues/1556
+ */
+ else if (unlikely (hb_in_range<hb_codepoint_t> (info[i].codepoint, 0xE0020u, 0xE007Fu)))
+ _hb_glyph_info_set_continuation (&info[i]);
+ }
}
static void
hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
{
+ if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
+ return;
+
if (!(buffer->flags & HB_BUFFER_FLAG_BOT) ||
buffer->context_len[0] ||
- _hb_glyph_info_get_general_category (&buffer->info[0]) !=
- HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
+ !_hb_glyph_info_is_unicode_mark (&buffer->info[0]))
return;
if (!font->has_glyph (0x25CCu))
@@ -266,9 +537,8 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
info.cluster = buffer->cur().cluster;
info.mask = buffer->cur().mask;
buffer->output_info (info);
- while (buffer->idx < buffer->len && !buffer->in_error)
+ while (buffer->idx < buffer->len && buffer->successful)
buffer->next_glyph ();
-
buffer->swap_buffers ();
}
@@ -278,59 +548,40 @@ hb_form_clusters (hb_buffer_t *buffer)
if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII))
return;
- /* Loop duplicated in hb_ensure_native_direction(), and in _hb-coretext.cc */
- unsigned int base = 0;
- unsigned int count = buffer->len;
- hb_glyph_info_t *info = buffer->info;
- for (unsigned int i = 1; i < count; i++)
- {
- if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])) &&
- !_hb_glyph_info_is_joiner (&info[i])))
- {
- if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
- buffer->merge_clusters (base, i);
- else
- buffer->unsafe_to_break (base, i);
- base = i;
- }
- }
if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
- buffer->merge_clusters (base, count);
+ foreach_grapheme (buffer, start, end)
+ buffer->merge_clusters (start, end);
else
- buffer->unsafe_to_break (base, count);
+ foreach_grapheme (buffer, start, end)
+ buffer->unsafe_to_break (start, end);
}
static void
hb_ensure_native_direction (hb_buffer_t *buffer)
{
hb_direction_t direction = buffer->props.direction;
+ hb_direction_t horiz_dir = hb_script_get_horizontal_direction (buffer->props.script);
/* TODO vertical:
* The only BTT vertical script is Ogham, but it's not clear to me whether OpenType
* Ogham fonts are supposed to be implemented BTT or not. Need to research that
* first. */
- if ((HB_DIRECTION_IS_HORIZONTAL (direction) && direction != hb_script_get_horizontal_direction (buffer->props.script)) ||
- (HB_DIRECTION_IS_VERTICAL (direction) && direction != HB_DIRECTION_TTB))
+ if ((HB_DIRECTION_IS_HORIZONTAL (direction) &&
+ direction != horiz_dir && horiz_dir != HB_DIRECTION_INVALID) ||
+ (HB_DIRECTION_IS_VERTICAL (direction) &&
+ direction != HB_DIRECTION_TTB))
{
- /* Same loop as hb_form_clusters().
- * Since form_clusters() merged clusters already, we don't merge. */
- unsigned int base = 0;
- unsigned int count = buffer->len;
- hb_glyph_info_t *info = buffer->info;
- for (unsigned int i = 1; i < count; i++)
- {
- if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i]))))
- {
- if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
- buffer->merge_clusters (base, i);
- buffer->reverse_range (base, i);
- base = i;
- }
- }
if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
- buffer->merge_clusters (base, count);
- buffer->reverse_range (base, count);
+ foreach_grapheme (buffer, start, end)
+ {
+ buffer->merge_clusters (start, end);
+ buffer->reverse_range (start, end);
+ }
+ else
+ foreach_grapheme (buffer, start, end)
+ /* form_clusters() merged clusters already, we don't merge. */
+ buffer->reverse_range (start, end);
buffer->reverse ();
@@ -339,10 +590,12 @@ hb_ensure_native_direction (hb_buffer_t *buffer)
}
-/* Substitute */
+/*
+ * Substitute
+ */
static inline void
-hb_ot_mirror_chars (hb_ot_shape_context_t *c)
+hb_ot_mirror_chars (const hb_ot_shape_context_t *c)
{
if (HB_DIRECTION_IS_FORWARD (c->target_direction))
return;
@@ -363,8 +616,12 @@ hb_ot_mirror_chars (hb_ot_shape_context_t *c)
}
static inline void
-hb_ot_shape_setup_masks_fraction (hb_ot_shape_context_t *c)
+hb_ot_shape_setup_masks_fraction (const hb_ot_shape_context_t *c)
{
+#ifdef HB_NO_OT_SHAPE_FRACTIONS
+ return;
+#endif
+
if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
!c->plan->has_frac)
return;
@@ -393,19 +650,19 @@ hb_ot_shape_setup_masks_fraction (hb_ot_shape_context_t *c)
while (start &&
_hb_glyph_info_get_general_category (&info[start - 1]) ==
HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
- start--;
+ start--;
while (end < count &&
_hb_glyph_info_get_general_category (&info[end]) ==
HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
- end++;
+ end++;
buffer->unsafe_to_break (start, end);
for (unsigned int j = start; j < i; j++)
- info[j].mask |= pre_mask;
+ info[j].mask |= pre_mask;
info[i].mask |= c->plan->frac_mask;
for (unsigned int j = i + 1; j < end; j++)
- info[j].mask |= post_mask;
+ info[j].mask |= post_mask;
i = end - 1;
}
@@ -413,7 +670,7 @@ hb_ot_shape_setup_masks_fraction (hb_ot_shape_context_t *c)
}
static inline void
-hb_ot_shape_initialize_masks (hb_ot_shape_context_t *c)
+hb_ot_shape_initialize_masks (const hb_ot_shape_context_t *c)
{
hb_ot_map_t *map = &c->plan->map;
hb_buffer_t *buffer = c->buffer;
@@ -423,7 +680,7 @@ hb_ot_shape_initialize_masks (hb_ot_shape_context_t *c)
}
static inline void
-hb_ot_shape_setup_masks (hb_ot_shape_context_t *c)
+hb_ot_shape_setup_masks (const hb_ot_shape_context_t *c)
{
hb_ot_map_t *map = &c->plan->map;
hb_buffer_t *buffer = c->buffer;
@@ -445,12 +702,11 @@ hb_ot_shape_setup_masks (hb_ot_shape_context_t *c)
}
static void
-hb_ot_zero_width_default_ignorables (hb_ot_shape_context_t *c)
+hb_ot_zero_width_default_ignorables (const hb_buffer_t *buffer)
{
- hb_buffer_t *buffer = c->buffer;
-
if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
- (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
+ (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES) ||
+ (buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES))
return;
unsigned int count = buffer->len;
@@ -463,82 +719,29 @@ hb_ot_zero_width_default_ignorables (hb_ot_shape_context_t *c)
}
static void
-hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c)
+hb_ot_hide_default_ignorables (hb_buffer_t *buffer,
+ hb_font_t *font)
{
- hb_buffer_t *buffer = c->buffer;
-
if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
(buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
return;
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
- hb_glyph_position_t *pos = buffer->pos;
- unsigned int i = 0;
- for (i = 0; i < count; i++)
- {
- if (unlikely (_hb_glyph_info_is_default_ignorable (&info[i])))
- break;
- }
- /* No default-ignorables found; return. */
- if (i == count)
- return;
-
- hb_codepoint_t space;
- if (c->font->get_nominal_glyph (' ', &space))
+ hb_codepoint_t invisible = buffer->invisible;
+ if (!(buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES) &&
+ (invisible || font->get_nominal_glyph (' ', &invisible)))
{
- /* Replace default-ignorables with a zero-advance space glyph. */
- for (/*continue*/; i < count; i++)
+ /* Replace default-ignorables with a zero-advance invisible glyph. */
+ for (unsigned int i = 0; i < count; i++)
{
if (_hb_glyph_info_is_default_ignorable (&info[i]))
- info[i].codepoint = space;
+ info[i].codepoint = invisible;
}
}
else
- {
- /* Merge clusters and delete default-ignorables.
- * NOTE! We can't use out-buffer as we have positioning data. */
- unsigned int j = i;
- for (; i < count; i++)
- {
- if (_hb_glyph_info_is_default_ignorable (&info[i]))
- {
- /* Merge clusters.
- * Same logic as buffer->delete_glyph(), but for in-place removal. */
-
- unsigned int cluster = info[i].cluster;
- if (i + 1 < count && cluster == info[i + 1].cluster)
- continue; /* Cluster survives; do nothing. */
-
- if (j)
- {
- /* Merge cluster backward. */
- if (cluster < info[j - 1].cluster)
- {
- unsigned int mask = info[i].mask;
- unsigned int old_cluster = info[j - 1].cluster;
- for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--)
- buffer->set_cluster (info[k - 1], cluster, mask);
- }
- continue;
- }
-
- if (i + 1 < count)
- buffer->merge_clusters (i, i + 2); /* Merge cluster forward. */
-
- continue;
- }
-
- if (j != i)
- {
- info[j] = info[i];
- pos[j] = pos[i];
- }
- j++;
- }
- buffer->len = j;
- }
+ hb_ot_layout_delete_glyphs_inplace (buffer, _hb_glyph_info_is_default_ignorable);
}
@@ -555,10 +758,10 @@ hb_ot_map_glyphs_fast (hb_buffer_t *buffer)
}
static inline void
-hb_synthesize_glyph_classes (hb_ot_shape_context_t *c)
+hb_synthesize_glyph_classes (hb_buffer_t *buffer)
{
- unsigned int count = c->buffer->len;
- hb_glyph_info_t *info = c->buffer->info;
+ unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
{
hb_ot_layout_glyph_props_flags_t klass;
@@ -581,7 +784,7 @@ hb_synthesize_glyph_classes (hb_ot_shape_context_t *c)
}
static inline void
-hb_ot_substitute_default (hb_ot_shape_context_t *c)
+hb_ot_substitute_default (const hb_ot_shape_context_t *c)
{
hb_buffer_t *buffer = c->buffer;
@@ -594,8 +797,8 @@ hb_ot_substitute_default (hb_ot_shape_context_t *c)
hb_ot_shape_setup_masks (c);
/* This is unfortunate to go here, but necessary... */
- if (c->fallback_positioning)
- _hb_ot_shape_fallback_position_recategorize_marks (c->plan, c->font, buffer);
+ if (c->plan->fallback_mark_positioning)
+ _hb_ot_shape_fallback_mark_position_recategorize_marks (c->plan, c->font, buffer);
hb_ot_map_glyphs_fast (buffer);
@@ -603,22 +806,20 @@ hb_ot_substitute_default (hb_ot_shape_context_t *c)
}
static inline void
-hb_ot_substitute_complex (hb_ot_shape_context_t *c)
+hb_ot_substitute_complex (const hb_ot_shape_context_t *c)
{
hb_buffer_t *buffer = c->buffer;
hb_ot_layout_substitute_start (c->font, buffer);
- if (!hb_ot_layout_has_glyph_classes (c->face))
- hb_synthesize_glyph_classes (c);
+ if (c->plan->fallback_glyph_classes)
+ hb_synthesize_glyph_classes (c->buffer);
c->plan->substitute (c->font, buffer);
-
- return;
}
static inline void
-hb_ot_substitute (hb_ot_shape_context_t *c)
+hb_ot_substitute_pre (const hb_ot_shape_context_t *c)
{
hb_ot_substitute_default (c);
@@ -627,7 +828,23 @@ hb_ot_substitute (hb_ot_shape_context_t *c)
hb_ot_substitute_complex (c);
}
-/* Position */
+static inline void
+hb_ot_substitute_post (const hb_ot_shape_context_t *c)
+{
+ hb_ot_hide_default_ignorables (c->buffer, c->font);
+#ifndef HB_NO_AAT_SHAPE
+ if (c->plan->apply_morx)
+ hb_aat_layout_remove_deleted_glyphs (c->buffer);
+#endif
+
+ if (c->plan->shaper->postprocess_glyphs)
+ c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
+}
+
+
+/*
+ * Position
+ */
static inline void
adjust_mark_offsets (hb_glyph_position_t *pos)
@@ -652,13 +869,13 @@ zero_mark_widths_by_gdef (hb_buffer_t *buffer, bool adjust_offsets)
if (_hb_glyph_info_is_mark (&info[i]))
{
if (adjust_offsets)
- adjust_mark_offsets (&buffer->pos[i]);
+ adjust_mark_offsets (&buffer->pos[i]);
zero_mark_width (&buffer->pos[i]);
}
}
static inline void
-hb_ot_position_default (hb_ot_shape_context_t *c)
+hb_ot_position_default (const hb_ot_shape_context_t *c)
{
hb_direction_t direction = c->buffer->props.direction;
unsigned int count = c->buffer->len;
@@ -667,8 +884,8 @@ hb_ot_position_default (hb_ot_shape_context_t *c)
if (HB_DIRECTION_IS_HORIZONTAL (direction))
{
- for (unsigned int i = 0; i < count; i++)
- pos[i].x_advance = c->font->get_glyph_h_advance (info[i].codepoint);
+ c->font->get_glyph_h_advances (count, &info[0].codepoint, sizeof(info[0]),
+ &pos[0].x_advance, sizeof(pos[0]));
/* The nil glyph_h_origin() func returns 0, so no need to apply it. */
if (c->font->has_glyph_h_origin_func ())
for (unsigned int i = 0; i < count; i++)
@@ -678,9 +895,10 @@ hb_ot_position_default (hb_ot_shape_context_t *c)
}
else
{
+ c->font->get_glyph_v_advances (count, &info[0].codepoint, sizeof(info[0]),
+ &pos[0].y_advance, sizeof(pos[0]));
for (unsigned int i = 0; i < count; i++)
{
- pos[i].y_advance = c->font->get_glyph_v_advance (info[i].codepoint);
c->font->subtract_glyph_v_origin (info[i].codepoint,
&pos[i].x_offset,
&pos[i].y_offset);
@@ -691,23 +909,22 @@ hb_ot_position_default (hb_ot_shape_context_t *c)
}
static inline void
-hb_ot_position_complex (hb_ot_shape_context_t *c)
+hb_ot_position_complex (const hb_ot_shape_context_t *c)
{
unsigned int count = c->buffer->len;
hb_glyph_info_t *info = c->buffer->info;
hb_glyph_position_t *pos = c->buffer->pos;
- /* If the font has no GPOS, AND, no fallback positioning will
- * happen, AND, direction is forward, then when zeroing mark
- * widths, we shift the mark with it, such that the mark
- * is positioned hanging over the previous glyph. When
+ /* If the font has no GPOS and direction is forward, then when
+ * zeroing mark widths, we shift the mark with it, such that the
+ * mark is positioned hanging over the previous glyph. When
* direction is backward we don't shift and it will end up
* hanging over the next glyph after the final reordering.
- * If fallback positinoing happens or GPOS is present, we don't
- * care.
+ *
+ * Note: If fallback positinoing happens, we don't care about
+ * this as it will be overriden.
*/
- bool adjust_offsets_when_zeroing = c->fallback_positioning &&
- !c->plan->shaper->fallback_position &&
+ bool adjust_offsets_when_zeroing = c->plan->adjust_mark_positioning_when_zeroing &&
HB_DIRECTION_IS_FORWARD (c->buffer->props.direction);
/* We change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */
@@ -721,36 +938,41 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
hb_ot_layout_position_start (c->font, c->buffer);
- switch (c->plan->shaper->zero_width_marks)
- {
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
- zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
- break;
-
- default:
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
- break;
- }
+ if (c->plan->zero_marks)
+ switch (c->plan->shaper->zero_width_marks)
+ {
+ case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
+ zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
+ break;
+
+ default:
+ case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
+ case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
+ break;
+ }
- if (likely (!c->fallback_positioning))
- c->plan->position (c->font, c->buffer);
+ c->plan->position (c->font, c->buffer);
- switch (c->plan->shaper->zero_width_marks)
- {
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
- zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
- break;
-
- default:
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
- break;
- }
+ if (c->plan->zero_marks)
+ switch (c->plan->shaper->zero_width_marks)
+ {
+ case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
+ zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
+ break;
+
+ default:
+ case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
+ case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
+ break;
+ }
- /* Finishing off GPOS has to follow a certain order. */
+ /* Finish off. Has to follow a certain order. */
hb_ot_layout_position_finish_advances (c->font, c->buffer);
- hb_ot_zero_width_default_ignorables (c);
+ hb_ot_zero_width_default_ignorables (c->buffer);
+#ifndef HB_NO_AAT_SHAPE
+ if (c->plan->apply_morx)
+ hb_aat_layout_zero_width_deleted_glyphs (c->buffer);
+#endif
hb_ot_layout_position_finish_offsets (c->font, c->buffer);
/* The nil glyph_h_origin() func returns 0, so no need to apply it. */
@@ -759,10 +981,14 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
c->font->subtract_glyph_h_origin (info[i].codepoint,
&pos[i].x_offset,
&pos[i].y_offset);
+
+ if (c->plan->fallback_mark_positioning)
+ _hb_ot_shape_fallback_mark_position (c->plan, c->font, c->buffer,
+ adjust_offsets_when_zeroing);
}
static inline void
-hb_ot_position (hb_ot_shape_context_t *c)
+hb_ot_position (const hb_ot_shape_context_t *c)
{
c->buffer->clear_positions ();
@@ -770,17 +996,9 @@ hb_ot_position (hb_ot_shape_context_t *c)
hb_ot_position_complex (c);
- if (c->fallback_positioning && c->plan->shaper->fallback_position)
- _hb_ot_shape_fallback_position (c->plan, c->font, c->buffer);
-
if (HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction))
hb_buffer_reverse (c->buffer);
- /* Visual fallback goes here. */
-
- if (c->fallback_positioning)
- _hb_ot_shape_fallback_kern (c->plan, c->font, c->buffer);
-
_hb_buffer_deallocate_gsubgpos_vars (c->buffer);
}
@@ -817,22 +1035,17 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
{
c->buffer->deallocate_var_all ();
c->buffer->scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
- if (likely (!_hb_unsigned_int_mul_overflows (c->buffer->len, HB_BUFFER_MAX_LEN_FACTOR)))
+ if (likely (!hb_unsigned_mul_overflows (c->buffer->len, HB_BUFFER_MAX_LEN_FACTOR)))
{
- c->buffer->max_len = MAX (c->buffer->len * HB_BUFFER_MAX_LEN_FACTOR,
+ c->buffer->max_len = hb_max (c->buffer->len * HB_BUFFER_MAX_LEN_FACTOR,
(unsigned) HB_BUFFER_MAX_LEN_MIN);
}
- if (likely (!_hb_unsigned_int_mul_overflows (c->buffer->len, HB_BUFFER_MAX_OPS_FACTOR)))
+ if (likely (!hb_unsigned_mul_overflows (c->buffer->len, HB_BUFFER_MAX_OPS_FACTOR)))
{
- c->buffer->max_ops = MAX (c->buffer->len * HB_BUFFER_MAX_OPS_FACTOR,
+ c->buffer->max_ops = hb_max (c->buffer->len * HB_BUFFER_MAX_OPS_FACTOR,
(unsigned) HB_BUFFER_MAX_OPS_MIN);
}
- bool disable_otl = c->plan->shaper->disable_otl && c->plan->shaper->disable_otl (c->plan);
- //c->fallback_substitute = disable_otl || !hb_ot_layout_has_substitution (c->face);
- c->fallback_positioning = disable_otl || !hb_ot_layout_has_positioning (c->face);
- c->fallback_glyph_classes = disable_otl || !hb_ot_layout_has_glyph_classes (c->face);
-
/* Save the original direction, we use it later. */
c->target_direction = c->buffer->props.direction;
@@ -851,13 +1064,9 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
if (c->plan->shaper->preprocess_text)
c->plan->shaper->preprocess_text (c->plan, c->buffer, c->font);
- hb_ot_substitute (c);
+ hb_ot_substitute_pre (c);
hb_ot_position (c);
-
- hb_ot_hide_default_ignorables (c);
-
- if (c->plan->shaper->postprocess_glyphs)
- c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
+ hb_ot_substitute_post (c);
hb_propagate_flags (c->buffer);
@@ -878,7 +1087,7 @@ _hb_ot_shape (hb_shape_plan_t *shape_plan,
const hb_feature_t *features,
unsigned int num_features)
{
- hb_ot_shape_context_t c = {HB_SHAPER_DATA_GET (shape_plan), font, font->face, buffer, features, num_features};
+ hb_ot_shape_context_t c = {&shape_plan->ot, font, font->face, buffer, features, num_features};
hb_ot_shape_internal (&c);
return true;
@@ -895,8 +1104,7 @@ hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan,
hb_tag_t table_tag,
hb_set_t *lookup_indexes /* OUT */)
{
- /* XXX Does the first part always succeed? */
- HB_SHAPER_DATA_GET (shape_plan)->collect_lookups (table_tag, lookup_indexes);
+ shape_plan->ot.collect_lookups (table_tag, lookup_indexes);
}
@@ -932,8 +1140,6 @@ hb_ot_shape_glyphs_closure (hb_font_t *font,
unsigned int num_features,
hb_set_t *glyphs)
{
- hb_ot_shape_plan_t plan;
-
const char *shapers[] = {"ot", nullptr};
hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached (font->face, &buffer->props,
features, num_features, shapers);
@@ -947,17 +1153,12 @@ hb_ot_shape_glyphs_closure (hb_font_t *font,
hb_set_t *lookups = hb_set_create ();
hb_ot_shape_plan_collect_lookups (shape_plan, HB_OT_TAG_GSUB, lookups);
-
- /* And find transitive closure. */
- hb_set_t *copy = hb_set_create ();
- do {
- copy->set (glyphs);
- for (hb_codepoint_t lookup_index = -1; hb_set_next (lookups, &lookup_index);)
- hb_ot_layout_lookup_substitute_closure (font->face, lookup_index, glyphs);
- } while (!copy->is_equal (glyphs));
- hb_set_destroy (copy);
+ hb_ot_layout_lookups_substitute_closure (font->face, lookups, glyphs);
hb_set_destroy (lookups);
hb_shape_plan_destroy (shape_plan);
}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.hh
new file mode 100644
index 0000000000..2cde73d854
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.hh
@@ -0,0 +1,169 @@
+/*
+ * Copyright © 2010 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_HH
+#define HB_OT_SHAPE_HH
+
+#include "hb.hh"
+
+#include "hb-ot-map.hh"
+#include "hb-aat-map.hh"
+
+
+struct hb_ot_shape_plan_key_t
+{
+ unsigned int variations_index[2];
+
+ void init (hb_face_t *face,
+ const int *coords,
+ unsigned int num_coords)
+ {
+ for (unsigned int table_index = 0; table_index < 2; table_index++)
+ hb_ot_layout_table_find_feature_variations (face,
+ table_tags[table_index],
+ coords,
+ num_coords,
+ &variations_index[table_index]);
+ }
+
+ bool equal (const hb_ot_shape_plan_key_t *other)
+ {
+ return 0 == memcmp (this, other, sizeof (*this));
+ }
+};
+
+
+struct hb_shape_plan_key_t;
+
+struct hb_ot_shape_plan_t
+{
+ hb_segment_properties_t props;
+ const struct hb_ot_complex_shaper_t *shaper;
+ hb_ot_map_t map;
+ hb_aat_map_t aat_map;
+ const void *data;
+#ifndef HB_NO_OT_SHAPE_FRACTIONS
+ hb_mask_t frac_mask, numr_mask, dnom_mask;
+#else
+ static constexpr hb_mask_t frac_mask = 0;
+ static constexpr hb_mask_t numr_mask = 0;
+ static constexpr hb_mask_t dnom_mask = 0;
+#endif
+ hb_mask_t rtlm_mask;
+#ifndef HB_NO_OT_KERN
+ hb_mask_t kern_mask;
+#else
+ static constexpr hb_mask_t kern_mask = 0;
+#endif
+#ifndef HB_NO_AAT_SHAPE
+ hb_mask_t trak_mask;
+#else
+ static constexpr hb_mask_t trak_mask = 0;
+#endif
+
+#ifndef HB_NO_OT_KERN
+ bool requested_kerning : 1;
+#else
+ static constexpr bool requested_kerning = false;
+#endif
+#ifndef HB_NO_AAT_SHAPE
+ bool requested_tracking : 1;
+#else
+ static constexpr bool requested_tracking = false;
+#endif
+#ifndef HB_NO_OT_SHAPE_FRACTIONS
+ bool has_frac : 1;
+#else
+ static constexpr bool has_frac = false;
+#endif
+ bool has_gpos_mark : 1;
+ bool zero_marks : 1;
+ bool fallback_glyph_classes : 1;
+ bool fallback_mark_positioning : 1;
+ bool adjust_mark_positioning_when_zeroing : 1;
+
+ bool apply_gpos : 1;
+#ifndef HB_NO_OT_KERN
+ bool apply_kern : 1;
+#else
+ static constexpr bool apply_kern = false;
+#endif
+#ifndef HB_NO_AAT_SHAPE
+ bool apply_kerx : 1;
+ bool apply_morx : 1;
+ bool apply_trak : 1;
+#else
+ static constexpr bool apply_kerx = false;
+ static constexpr bool apply_morx = false;
+ static constexpr bool apply_trak = false;
+#endif
+
+ void collect_lookups (hb_tag_t table_tag, hb_set_t *lookups) const
+ {
+ unsigned int table_index;
+ switch (table_tag) {
+ case HB_OT_TAG_GSUB: table_index = 0; break;
+ case HB_OT_TAG_GPOS: table_index = 1; break;
+ default: return;
+ }
+ map.collect_lookups (table_index, lookups);
+ }
+
+ HB_INTERNAL bool init0 (hb_face_t *face,
+ const hb_shape_plan_key_t *key);
+ HB_INTERNAL void fini ();
+
+ HB_INTERNAL void substitute (hb_font_t *font, hb_buffer_t *buffer) const;
+ HB_INTERNAL void position (hb_font_t *font, hb_buffer_t *buffer) const;
+};
+
+struct hb_shape_plan_t;
+
+struct hb_ot_shape_planner_t
+{
+ /* In the order that they are filled in. */
+ hb_face_t *face;
+ hb_segment_properties_t props;
+ hb_ot_map_builder_t map;
+ hb_aat_map_builder_t aat_map;
+#ifndef HB_NO_AAT_SHAPE
+ bool apply_morx : 1;
+#else
+ static constexpr bool apply_morx = false;
+#endif
+ bool script_zero_marks : 1;
+ bool script_fallback_mark_positioning : 1;
+ const struct hb_ot_complex_shaper_t *shaper;
+
+ HB_INTERNAL hb_ot_shape_planner_t (hb_face_t *face,
+ const hb_segment_properties_t *props);
+
+ HB_INTERNAL void compile (hb_ot_shape_plan_t &plan,
+ const hb_ot_shape_plan_key_t &key);
+};
+
+
+#endif /* HB_OT_SHAPE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-stat-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-stat-table.hh
new file mode 100644
index 0000000000..2cdd3a488b
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-stat-table.hh
@@ -0,0 +1,344 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_STAT_TABLE_HH
+#define HB_OT_STAT_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-layout-common.hh"
+
+/*
+ * STAT -- Style Attributes
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/stat
+ */
+#define HB_OT_TAG_STAT HB_TAG('S','T','A','T')
+
+
+namespace OT {
+
+enum
+{
+ OLDER_SIBLING_FONT_ATTRIBUTE = 0x0001, /* If set, this axis value table
+ * provides axis value information
+ * that is applicable to other fonts
+ * within the same font family. This
+ * is used if the other fonts were
+ * released earlier and did not include
+ * information about values for some axis.
+ * If newer versions of the other
+ * fonts include the information
+ * themselves and are present,
+ * then this record is ignored. */
+ ELIDABLE_AXIS_VALUE_NAME = 0x0002 /* If set, it indicates that the axis
+ * value represents the “normal” value
+ * for the axis and may be omitted when
+ * composing name strings. */
+ // Reserved = 0xFFFC /* Reserved for future use — set to zero. */
+};
+
+struct AxisValueFormat1
+{
+ hb_ot_name_id_t get_value_name_id () const { return valueNameID; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier — set to 1. */
+ HBUINT16 axisIndex; /* Zero-base index into the axis record array
+ * identifying the axis of design variation
+ * to which the axis value record applies.
+ * Must be less than designAxisCount. */
+ HBUINT16 flags; /* Flags — see below for details. */
+ NameID valueNameID; /* The name ID for entries in the 'name' table
+ * that provide a display string for this
+ * attribute value. */
+ HBFixed value; /* A numeric value for this attribute value. */
+ public:
+ DEFINE_SIZE_STATIC (12);
+};
+
+struct AxisValueFormat2
+{
+ hb_ot_name_id_t get_value_name_id () const { return valueNameID; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier — set to 2. */
+ HBUINT16 axisIndex; /* Zero-base index into the axis record array
+ * identifying the axis of design variation
+ * to which the axis value record applies.
+ * Must be less than designAxisCount. */
+ HBUINT16 flags; /* Flags — see below for details. */
+ NameID valueNameID; /* The name ID for entries in the 'name' table
+ * that provide a display string for this
+ * attribute value. */
+ HBFixed nominalValue; /* A numeric value for this attribute value. */
+ HBFixed rangeMinValue; /* The minimum value for a range associated
+ * with the specified name ID. */
+ HBFixed rangeMaxValue; /* The maximum value for a range associated
+ * with the specified name ID. */
+ public:
+ DEFINE_SIZE_STATIC (20);
+};
+
+struct AxisValueFormat3
+{
+ hb_ot_name_id_t get_value_name_id () const { return valueNameID; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier — set to 3. */
+ HBUINT16 axisIndex; /* Zero-base index into the axis record array
+ * identifying the axis of design variation
+ * to which the axis value record applies.
+ * Must be less than designAxisCount. */
+ HBUINT16 flags; /* Flags — see below for details. */
+ NameID valueNameID; /* The name ID for entries in the 'name' table
+ * that provide a display string for this
+ * attribute value. */
+ HBFixed value; /* A numeric value for this attribute value. */
+ HBFixed linkedValue; /* The numeric value for a style-linked mapping
+ * from this value. */
+ public:
+ DEFINE_SIZE_STATIC (16);
+};
+
+struct AxisValueRecord
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ HBUINT16 axisIndex; /* Zero-base index into the axis record array
+ * identifying the axis to which this value
+ * applies. Must be less than designAxisCount. */
+ HBFixed value; /* A numeric value for this attribute value. */
+ public:
+ DEFINE_SIZE_STATIC (6);
+};
+
+struct AxisValueFormat4
+{
+ hb_ot_name_id_t get_value_name_id () const { return valueNameID; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ HBUINT16 format; /* Format identifier — set to 4. */
+ HBUINT16 axisCount; /* The total number of axes contributing to
+ * this axis-values combination. */
+ HBUINT16 flags; /* Flags — see below for details. */
+ NameID valueNameID; /* The name ID for entries in the 'name' table
+ * that provide a display string for this
+ * attribute value. */
+ UnsizedArrayOf<AxisValueRecord>
+ axisValues; /* Array of AxisValue records that provide the
+ * combination of axis values, one for each
+ * contributing axis. */
+ public:
+ DEFINE_SIZE_ARRAY (8, axisValues);
+};
+
+struct AxisValue
+{
+ hb_ot_name_id_t get_value_name_id () const
+ {
+ switch (u.format)
+ {
+ case 1: return u.format1.get_value_name_id ();
+ case 2: return u.format2.get_value_name_id ();
+ case 3: return u.format3.get_value_name_id ();
+ case 4: return u.format4.get_value_name_id ();
+ default:return HB_OT_NAME_ID_INVALID;
+ }
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (unlikely (!c->check_struct (this)))
+ return_trace (false);
+
+ switch (u.format)
+ {
+ case 1: return_trace (u.format1.sanitize (c));
+ case 2: return_trace (u.format2.sanitize (c));
+ case 3: return_trace (u.format3.sanitize (c));
+ case 4: return_trace (u.format4.sanitize (c));
+ default:return_trace (true);
+ }
+ }
+
+ protected:
+ union
+ {
+ HBUINT16 format;
+ AxisValueFormat1 format1;
+ AxisValueFormat2 format2;
+ AxisValueFormat3 format3;
+ AxisValueFormat4 format4;
+ } u;
+ public:
+ DEFINE_SIZE_UNION (2, format);
+};
+
+struct StatAxisRecord
+{
+ hb_ot_name_id_t get_name_id () const { return nameID; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this)));
+ }
+
+ protected:
+ Tag tag; /* A tag identifying the axis of design variation. */
+ NameID nameID; /* The name ID for entries in the 'name' table that
+ * provide a display string for this axis. */
+ HBUINT16 ordering; /* A value that applications can use to determine
+ * primary sorting of face names, or for ordering
+ * of descriptors when composing family or face names. */
+ public:
+ DEFINE_SIZE_STATIC (8);
+};
+
+struct STAT
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_STAT;
+
+ bool has_data () const { return version.to_int (); }
+
+ unsigned get_design_axis_count () const { return designAxisCount; }
+
+ hb_ot_name_id_t get_axis_record_name_id (unsigned axis_record_index) const
+ {
+ if (unlikely (axis_record_index >= designAxisCount)) return HB_OT_NAME_ID_INVALID;
+ const StatAxisRecord &axis_record = get_design_axes ()[axis_record_index];
+ return axis_record.get_name_id ();
+ }
+
+ unsigned get_axis_value_count () const { return axisValueCount; }
+
+ hb_ot_name_id_t get_axis_value_name_id (unsigned axis_value_index) const
+ {
+ if (unlikely (axis_value_index >= axisValueCount)) return HB_OT_NAME_ID_INVALID;
+ const AxisValue &axis_value = (this + get_axis_value_offsets ()[axis_value_index]);
+ return axis_value.get_value_name_id ();
+ }
+
+ void collect_name_ids (hb_set_t *nameids_to_retain) const
+ {
+ if (!has_data ()) return;
+
+ + get_design_axes ()
+ | hb_map (&StatAxisRecord::get_name_id)
+ | hb_sink (nameids_to_retain)
+ ;
+
+ + get_axis_value_offsets ()
+ | hb_map (hb_add (&(this + offsetToAxisValueOffsets)))
+ | hb_map (&AxisValue::get_value_name_id)
+ | hb_sink (nameids_to_retain)
+ ;
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ version.major == 1 &&
+ version.minor > 0 &&
+ designAxesOffset.sanitize (c, this, designAxisCount) &&
+ offsetToAxisValueOffsets.sanitize (c, this, axisValueCount, &(this+offsetToAxisValueOffsets))));
+ }
+
+ protected:
+ hb_array_t<const StatAxisRecord> const get_design_axes () const
+ { return (this+designAxesOffset).as_array (designAxisCount); }
+
+ hb_array_t<const OffsetTo<AxisValue>> const get_axis_value_offsets () const
+ { return (this+offsetToAxisValueOffsets).as_array (axisValueCount); }
+
+
+ protected:
+ FixedVersion<>version; /* Version of the stat table
+ * initially set to 0x00010002u */
+ HBUINT16 designAxisSize; /* The size in bytes of each axis record. */
+ HBUINT16 designAxisCount;/* The number of design axis records. In a
+ * font with an 'fvar' table, this value must be
+ * greater than or equal to the axisCount value
+ * in the 'fvar' table. In all fonts, must
+ * be greater than zero if axisValueCount
+ * is greater than zero. */
+ LNNOffsetTo<UnsizedArrayOf<StatAxisRecord>>
+ designAxesOffset;
+ /* Offset in bytes from the beginning of
+ * the STAT table to the start of the design
+ * axes array. If designAxisCount is zero,
+ * set to zero; if designAxisCount is greater
+ * than zero, must be greater than zero. */
+ HBUINT16 axisValueCount; /* The number of axis value tables. */
+ LNNOffsetTo<UnsizedArrayOf<OffsetTo<AxisValue>>>
+ offsetToAxisValueOffsets;
+ /* Offset in bytes from the beginning of
+ * the STAT table to the start of the design
+ * axes value offsets array. If axisValueCount
+ * is zero, set to zero; if axisValueCount is
+ * greater than zero, must be greater than zero. */
+ NameID elidedFallbackNameID;
+ /* Name ID used as fallback when projection of
+ * names into a particular font model produces
+ * a subfamily name containing only elidable
+ * elements. */
+ public:
+ DEFINE_SIZE_STATIC (20);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_STAT_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-tag-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-tag-table.hh
new file mode 100644
index 0000000000..d8fcd2fdb4
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-tag-table.hh
@@ -0,0 +1,2065 @@
+/* == Start of generated table == */
+/*
+ * The following table is generated by running:
+ *
+ * ./gen-tag-table.py languagetags language-subtag-registry
+ *
+ * on files with these headers:
+ *
+ * <meta name="updated_at" content="2018-11-18 05:25 AM" />
+ * File-Date: 2019-04-03
+ */
+
+#ifndef HB_OT_TAG_TABLE_HH
+#define HB_OT_TAG_TABLE_HH
+
+static const LangTag ot_languages[] = {
+ {"aa", HB_TAG('A','F','R',' ')}, /* Afar */
+ {"aae", HB_TAG('S','Q','I',' ')}, /* Arbëreshë Albanian -> Albanian */
+ {"aao", HB_TAG('A','R','A',' ')}, /* Algerian Saharan Arabic -> Arabic */
+ {"aat", HB_TAG('S','Q','I',' ')}, /* Arvanitika Albanian -> Albanian */
+ {"ab", HB_TAG('A','B','K',' ')}, /* Abkhazian */
+ {"abh", HB_TAG('A','R','A',' ')}, /* Tajiki Arabic -> Arabic */
+ {"abq", HB_TAG('A','B','A',' ')}, /* Abaza */
+ {"abv", HB_TAG('A','R','A',' ')}, /* Baharna Arabic -> Arabic */
+ {"acf", HB_TAG('F','A','N',' ')}, /* Saint Lucian Creole French -> French Antillean */
+/*{"ach", HB_TAG('A','C','H',' ')},*/ /* Acoli -> Acholi */
+ {"acm", HB_TAG('A','R','A',' ')}, /* Mesopotamian Arabic -> Arabic */
+ {"acq", HB_TAG('A','R','A',' ')}, /* Ta'izzi-Adeni Arabic -> Arabic */
+/*{"acr", HB_TAG('A','C','R',' ')},*/ /* Achi */
+ {"acw", HB_TAG('A','R','A',' ')}, /* Hijazi Arabic -> Arabic */
+ {"acx", HB_TAG('A','R','A',' ')}, /* Omani Arabic -> Arabic */
+ {"acy", HB_TAG('A','R','A',' ')}, /* Cypriot Arabic -> Arabic */
+ {"ada", HB_TAG('D','N','G',' ')}, /* Adangme -> Dangme */
+ {"adf", HB_TAG('A','R','A',' ')}, /* Dhofari Arabic -> Arabic */
+ {"adp", HB_TAG('D','Z','N',' ')}, /* Adap (retired code) -> Dzongkha */
+/*{"ady", HB_TAG('A','D','Y',' ')},*/ /* Adyghe */
+ {"aeb", HB_TAG('A','R','A',' ')}, /* Tunisian Arabic -> Arabic */
+ {"aec", HB_TAG('A','R','A',' ')}, /* Saidi Arabic -> Arabic */
+ {"af", HB_TAG('A','F','K',' ')}, /* Afrikaans */
+ {"afb", HB_TAG('A','R','A',' ')}, /* Gulf Arabic -> Arabic */
+ {"ahg", HB_TAG('A','G','W',' ')}, /* Qimant -> Agaw */
+ {"aht", HB_TAG('A','T','H',' ')}, /* Ahtena -> Athapaskan */
+ {"aii", HB_TAG('S','W','A',' ')}, /* Assyrian Neo-Aramaic -> Swadaya Aramaic */
+ {"aii", HB_TAG('S','Y','R',' ')}, /* Assyrian Neo-Aramaic -> Syriac */
+/*{"aio", HB_TAG('A','I','O',' ')},*/ /* Aiton */
+ {"aiw", HB_TAG('A','R','I',' ')}, /* Aari */
+ {"ajp", HB_TAG('A','R','A',' ')}, /* South Levantine Arabic -> Arabic */
+ {"ak", HB_TAG('A','K','A',' ')}, /* Akan [macrolanguage] */
+ {"ak", HB_TAG('T','W','I',' ')}, /* Akan [macrolanguage] -> Twi */
+ {"aln", HB_TAG('S','Q','I',' ')}, /* Gheg Albanian -> Albanian */
+ {"als", HB_TAG('S','Q','I',' ')}, /* Tosk Albanian -> Albanian */
+/*{"alt", HB_TAG('A','L','T',' ')},*/ /* Southern Altai -> Altai */
+ {"am", HB_TAG('A','M','H',' ')}, /* Amharic */
+ {"amf", HB_TAG('H','B','N',' ')}, /* Hamer-Banna -> Hammer-Banna */
+ {"amw", HB_TAG('S','Y','R',' ')}, /* Western Neo-Aramaic -> Syriac */
+ {"an", HB_TAG('A','R','G',' ')}, /* Aragonese */
+/*{"ang", HB_TAG('A','N','G',' ')},*/ /* Old English (ca. 450-1100) -> Anglo-Saxon */
+ {"apc", HB_TAG('A','R','A',' ')}, /* North Levantine Arabic -> Arabic */
+ {"apd", HB_TAG('A','R','A',' ')}, /* Sudanese Arabic -> Arabic */
+ {"apj", HB_TAG('A','T','H',' ')}, /* Jicarilla Apache -> Athapaskan */
+ {"apk", HB_TAG('A','T','H',' ')}, /* Kiowa Apache -> Athapaskan */
+ {"apl", HB_TAG('A','T','H',' ')}, /* Lipan Apache -> Athapaskan */
+ {"apm", HB_TAG('A','T','H',' ')}, /* Mescalero-Chiricahua Apache -> Athapaskan */
+ {"apw", HB_TAG('A','T','H',' ')}, /* Western Apache -> Athapaskan */
+ {"ar", HB_TAG('A','R','A',' ')}, /* Arabic [macrolanguage] */
+ {"arb", HB_TAG('A','R','A',' ')}, /* Standard Arabic -> Arabic */
+ {"arn", HB_TAG('M','A','P',' ')}, /* Mapudungun */
+ {"arq", HB_TAG('A','R','A',' ')}, /* Algerian Arabic -> Arabic */
+ {"ars", HB_TAG('A','R','A',' ')}, /* Najdi Arabic -> Arabic */
+ {"ary", HB_TAG('M','O','R',' ')}, /* Moroccan Arabic -> Moroccan */
+ {"arz", HB_TAG('A','R','A',' ')}, /* Egyptian Arabic -> Arabic */
+ {"as", HB_TAG('A','S','M',' ')}, /* Assamese */
+/*{"ast", HB_TAG('A','S','T',' ')},*/ /* Asturian */
+/*{"ath", HB_TAG('A','T','H',' ')},*/ /* Athapascan [family] -> Athapaskan */
+ {"atj", HB_TAG('R','C','R',' ')}, /* Atikamekw -> R-Cree */
+ {"atv", HB_TAG('A','L','T',' ')}, /* Northern Altai -> Altai */
+ {"auz", HB_TAG('A','R','A',' ')}, /* Uzbeki Arabic -> Arabic */
+ {"av", HB_TAG('A','V','R',' ')}, /* Avaric -> Avar */
+ {"avl", HB_TAG('A','R','A',' ')}, /* Eastern Egyptian Bedawi Arabic -> Arabic */
+/*{"awa", HB_TAG('A','W','A',' ')},*/ /* Awadhi */
+ {"ay", HB_TAG('A','Y','M',' ')}, /* Aymara [macrolanguage] */
+ {"ayc", HB_TAG('A','Y','M',' ')}, /* Southern Aymara -> Aymara */
+ {"ayh", HB_TAG('A','R','A',' ')}, /* Hadrami Arabic -> Arabic */
+ {"ayl", HB_TAG('A','R','A',' ')}, /* Libyan Arabic -> Arabic */
+ {"ayn", HB_TAG('A','R','A',' ')}, /* Sanaani Arabic -> Arabic */
+ {"ayp", HB_TAG('A','R','A',' ')}, /* North Mesopotamian Arabic -> Arabic */
+ {"ayr", HB_TAG('A','Y','M',' ')}, /* Central Aymara -> Aymara */
+ {"az", HB_TAG('A','Z','E',' ')}, /* Azerbaijani [macrolanguage] */
+/*{"azb", HB_TAG('A','Z','B',' ')},*/ /* South Azerbaijani -> Torki */
+ {"azj", HB_TAG('A','Z','E',' ')}, /* North Azerbaijani -> Azerbaijani */
+ {"ba", HB_TAG('B','S','H',' ')}, /* Bashkir */
+ {"bad", HB_TAG('B','A','D','0')}, /* Banda [family] */
+ {"bai", HB_TAG('B','M','L',' ')}, /* Bamileke [family] */
+ {"bal", HB_TAG('B','L','I',' ')}, /* Baluchi [macrolanguage] */
+/*{"ban", HB_TAG('B','A','N',' ')},*/ /* Balinese */
+/*{"bar", HB_TAG('B','A','R',' ')},*/ /* Bavarian */
+/*{"bbc", HB_TAG('B','B','C',' ')},*/ /* Batak Toba */
+ {"bbz", HB_TAG('A','R','A',' ')}, /* Babalia Creole Arabic -> Arabic */
+ {"bcc", HB_TAG('B','L','I',' ')}, /* Southern Balochi -> Baluchi */
+ {"bci", HB_TAG('B','A','U',' ')}, /* Baoulé -> Baulé */
+ {"bcl", HB_TAG('B','I','K',' ')}, /* Central Bikol -> Bikol */
+ {"bcq", HB_TAG('B','C','H',' ')}, /* Bench */
+ {"bcr", HB_TAG('A','T','H',' ')}, /* Babine -> Athapaskan */
+/*{"bdy", HB_TAG('B','D','Y',' ')},*/ /* Bandjalang */
+ {"be", HB_TAG('B','E','L',' ')}, /* Belarusian -> Belarussian */
+ {"bea", HB_TAG('A','T','H',' ')}, /* Beaver -> Athapaskan */
+ {"beb", HB_TAG('B','T','I',' ')}, /* Bebele -> Beti */
+/*{"bem", HB_TAG('B','E','M',' ')},*/ /* Bemba (Zambia) */
+ {"ber", HB_TAG('B','B','R',' ')}, /* Berber [family] */
+ {"bfq", HB_TAG('B','A','D',' ')}, /* Badaga */
+ {"bft", HB_TAG('B','L','T',' ')}, /* Balti */
+ {"bfu", HB_TAG('L','A','H',' ')}, /* Gahri -> Lahuli */
+ {"bfy", HB_TAG('B','A','G',' ')}, /* Bagheli -> Baghelkhandi */
+ {"bg", HB_TAG('B','G','R',' ')}, /* Bulgarian */
+/*{"bgc", HB_TAG('B','G','C',' ')},*/ /* Haryanvi */
+ {"bgn", HB_TAG('B','L','I',' ')}, /* Western Balochi -> Baluchi */
+ {"bgp", HB_TAG('B','L','I',' ')}, /* Eastern Balochi -> Baluchi */
+/*{"bgq", HB_TAG('B','G','Q',' ')},*/ /* Bagri */
+ {"bgr", HB_TAG('Q','I','N',' ')}, /* Bawm Chin -> Chin */
+ {"bhb", HB_TAG('B','H','I',' ')}, /* Bhili */
+/*{"bhi", HB_TAG('B','H','I',' ')},*/ /* Bhilali -> Bhili */
+ {"bhk", HB_TAG('B','I','K',' ')}, /* Albay Bicolano (retired code) -> Bikol */
+/*{"bho", HB_TAG('B','H','O',' ')},*/ /* Bhojpuri */
+ {"bhr", HB_TAG('M','L','G',' ')}, /* Bara Malagasy -> Malagasy */
+ {"bi", HB_TAG('B','I','S',' ')}, /* Bislama */
+/*{"bik", HB_TAG('B','I','K',' ')},*/ /* Bikol [macrolanguage] */
+ {"bin", HB_TAG('E','D','O',' ')}, /* Edo */
+/*{"bjj", HB_TAG('B','J','J',' ')},*/ /* Kanauji */
+ {"bjn", HB_TAG('M','L','Y',' ')}, /* Banjar -> Malay */
+ {"bjq", HB_TAG('M','L','G',' ')}, /* Southern Betsimisaraka Malagasy (retired code) -> Malagasy */
+ {"bjt", HB_TAG('B','L','N',' ')}, /* Balanta-Ganja -> Balante */
+ {"bla", HB_TAG('B','K','F',' ')}, /* Siksika -> Blackfoot */
+ {"ble", HB_TAG('B','L','N',' ')}, /* Balanta-Kentohe -> Balante */
+/*{"blk", HB_TAG('B','L','K',' ')},*/ /* Pa’o Karen */
+ {"bln", HB_TAG('B','I','K',' ')}, /* Southern Catanduanes Bikol -> Bikol */
+ {"bm", HB_TAG('B','M','B',' ')}, /* Bambara (Bamanankan) */
+ {"bmm", HB_TAG('M','L','G',' ')}, /* Northern Betsimisaraka Malagasy -> Malagasy */
+ {"bn", HB_TAG('B','E','N',' ')}, /* Bengali */
+ {"bo", HB_TAG('T','I','B',' ')}, /* Tibetan */
+/*{"bpy", HB_TAG('B','P','Y',' ')},*/ /* Bishnupriya -> Bishnupriya Manipuri */
+ {"bqi", HB_TAG('L','R','C',' ')}, /* Bakhtiari -> Luri */
+ {"br", HB_TAG('B','R','E',' ')}, /* Breton */
+ {"bra", HB_TAG('B','R','I',' ')}, /* Braj -> Braj Bhasha */
+/*{"brh", HB_TAG('B','R','H',' ')},*/ /* Brahui */
+/*{"brx", HB_TAG('B','R','X',' ')},*/ /* Bodo (India) */
+ {"bs", HB_TAG('B','O','S',' ')}, /* Bosnian */
+/*{"bsk", HB_TAG('B','S','K',' ')},*/ /* Burushaski */
+ {"btb", HB_TAG('B','T','I',' ')}, /* Beti (Cameroon) (retired code) */
+ {"btj", HB_TAG('M','L','Y',' ')}, /* Bacanese Malay -> Malay */
+ {"bto", HB_TAG('B','I','K',' ')}, /* Rinconada Bikol -> Bikol */
+/*{"bts", HB_TAG('B','T','S',' ')},*/ /* Batak Simalungun */
+/*{"bug", HB_TAG('B','U','G',' ')},*/ /* Buginese -> Bugis */
+ {"bum", HB_TAG('B','T','I',' ')}, /* Bulu (Cameroon) -> Beti */
+ {"bve", HB_TAG('M','L','Y',' ')}, /* Berau Malay -> Malay */
+ {"bvu", HB_TAG('M','L','Y',' ')}, /* Bukit Malay -> Malay */
+ {"bxk", HB_TAG('L','U','H',' ')}, /* Bukusu -> Luyia */
+ {"bxp", HB_TAG('B','T','I',' ')}, /* Bebil -> Beti */
+ {"bxr", HB_TAG('R','B','U',' ')}, /* Russia Buriat -> Russian Buriat */
+ {"byn", HB_TAG('B','I','L',' ')}, /* Bilin -> Bilen */
+/*{"byv", HB_TAG('B','Y','V',' ')},*/ /* Medumba */
+ {"bzc", HB_TAG('M','L','G',' ')}, /* Southern Betsimisaraka Malagasy -> Malagasy */
+ {"ca", HB_TAG('C','A','T',' ')}, /* Catalan */
+ {"caf", HB_TAG('C','R','R',' ')}, /* Southern Carrier -> Carrier */
+ {"caf", HB_TAG('A','T','H',' ')}, /* Southern Carrier -> Athapaskan */
+/*{"cak", HB_TAG('C','A','K',' ')},*/ /* Kaqchikel */
+/*{"cbk", HB_TAG('C','B','K',' ')},*/ /* Chavacano -> Zamboanga Chavacano */
+ {"cbl", HB_TAG('Q','I','N',' ')}, /* Bualkhaw Chin -> Chin */
+ {"cco", HB_TAG('C','C','H','N')}, /* Comaltepec Chinantec -> Chinantec */
+ {"ccq", HB_TAG('A','R','K',' ')}, /* Chaungtha (retired code) -> Rakhine */
+ {"cdo", HB_TAG('Z','H','S',' ')}, /* Min Dong Chinese -> Chinese Simplified */
+ {"ce", HB_TAG('C','H','E',' ')}, /* Chechen */
+/*{"ceb", HB_TAG('C','E','B',' ')},*/ /* Cebuano */
+ {"cfm", HB_TAG('H','A','L',' ')}, /* Halam (Falam Chin) */
+/*{"cgg", HB_TAG('C','G','G',' ')},*/ /* Chiga */
+ {"ch", HB_TAG('C','H','A',' ')}, /* Chamorro */
+ {"chj", HB_TAG('C','C','H','N')}, /* Ojitlán Chinantec -> Chinantec */
+ {"chk", HB_TAG('C','H','K','0')}, /* Chuukese */
+/*{"cho", HB_TAG('C','H','O',' ')},*/ /* Choctaw */
+ {"chp", HB_TAG('C','H','P',' ')}, /* Chipewyan */
+ {"chp", HB_TAG('S','A','Y',' ')}, /* Chipewyan -> Sayisi */
+ {"chp", HB_TAG('A','T','H',' ')}, /* Chipewyan -> Athapaskan */
+ {"chq", HB_TAG('C','C','H','N')}, /* Quiotepec Chinantec -> Chinantec */
+/*{"chr", HB_TAG('C','H','R',' ')},*/ /* Cherokee */
+/*{"chy", HB_TAG('C','H','Y',' ')},*/ /* Cheyenne */
+ {"chz", HB_TAG('C','C','H','N')}, /* Ozumacín Chinantec -> Chinantec */
+ {"ciw", HB_TAG('O','J','B',' ')}, /* Chippewa -> Ojibway */
+/*{"cja", HB_TAG('C','J','A',' ')},*/ /* Western Cham */
+/*{"cjm", HB_TAG('C','J','M',' ')},*/ /* Eastern Cham */
+ {"cjy", HB_TAG('Z','H','S',' ')}, /* Jinyu Chinese -> Chinese Simplified */
+ {"cka", HB_TAG('Q','I','N',' ')}, /* Khumi Awa Chin (retired code) -> Chin */
+ {"ckb", HB_TAG('K','U','R',' ')}, /* Central Kurdish -> Kurdish */
+ {"ckt", HB_TAG('C','H','K',' ')}, /* Chukot -> Chukchi */
+ {"clc", HB_TAG('A','T','H',' ')}, /* Chilcotin -> Athapaskan */
+ {"cld", HB_TAG('S','Y','R',' ')}, /* Chaldean Neo-Aramaic -> Syriac */
+ {"cle", HB_TAG('C','C','H','N')}, /* Lealao Chinantec -> Chinantec */
+ {"cmn", HB_TAG('Z','H','S',' ')}, /* Mandarin Chinese -> Chinese Simplified */
+ {"cmr", HB_TAG('Q','I','N',' ')}, /* Mro-Khimi Chin -> Chin */
+ {"cnb", HB_TAG('Q','I','N',' ')}, /* Chinbon Chin -> Chin */
+ {"cnh", HB_TAG('Q','I','N',' ')}, /* Hakha Chin -> Chin */
+ {"cnk", HB_TAG('Q','I','N',' ')}, /* Khumi Chin -> Chin */
+ {"cnl", HB_TAG('C','C','H','N')}, /* Lalana Chinantec -> Chinantec */
+ {"cnt", HB_TAG('C','C','H','N')}, /* Tepetotutla Chinantec -> Chinantec */
+ {"cnw", HB_TAG('Q','I','N',' ')}, /* Ngawn Chin -> Chin */
+ {"co", HB_TAG('C','O','S',' ')}, /* Corsican */
+ {"coa", HB_TAG('M','L','Y',' ')}, /* Cocos Islands Malay -> Malay */
+/*{"cop", HB_TAG('C','O','P',' ')},*/ /* Coptic */
+ {"coq", HB_TAG('A','T','H',' ')}, /* Coquille -> Athapaskan */
+ {"cpa", HB_TAG('C','C','H','N')}, /* Palantla Chinantec -> Chinantec */
+ {"cpe", HB_TAG('C','P','P',' ')}, /* English-based creoles and pidgins [family] -> Creoles */
+ {"cpf", HB_TAG('C','P','P',' ')}, /* French-based creoles and pidgins [family] -> Creoles */
+/*{"cpp", HB_TAG('C','P','P',' ')},*/ /* Portuguese-based creoles and pidgins [family] -> Creoles */
+ {"cpx", HB_TAG('Z','H','S',' ')}, /* Pu-Xian Chinese -> Chinese Simplified */
+ {"cqd", HB_TAG('H','M','N',' ')}, /* Chuanqiandian Cluster Miao -> Hmong */
+ {"cqu", HB_TAG('Q','U','H',' ')}, /* Chilean Quechua (retired code) -> Quechua (Bolivia) */
+ {"cr", HB_TAG('C','R','E',' ')}, /* Cree [macrolanguage] */
+ {"cr", HB_TAG('Y','C','R',' ')}, /* Cree [macrolanguage] -> Y-Cree */
+ {"crh", HB_TAG('C','R','T',' ')}, /* Crimean Tatar */
+ {"crj", HB_TAG('E','C','R',' ')}, /* Southern East Cree -> Eastern Cree */
+ {"crk", HB_TAG('W','C','R',' ')}, /* Plains Cree -> West-Cree */
+ {"crl", HB_TAG('E','C','R',' ')}, /* Northern East Cree -> Eastern Cree */
+ {"crm", HB_TAG('M','C','R',' ')}, /* Moose Cree */
+ {"crm", HB_TAG('L','C','R',' ')}, /* Moose Cree -> L-Cree */
+ {"crp", HB_TAG('C','P','P',' ')}, /* Creoles and pidgins [family] -> Creoles */
+ {"crx", HB_TAG('C','R','R',' ')}, /* Carrier */
+ {"crx", HB_TAG('A','T','H',' ')}, /* Carrier -> Athapaskan */
+ {"cs", HB_TAG('C','S','Y',' ')}, /* Czech */
+ {"csa", HB_TAG('C','C','H','N')}, /* Chiltepec Chinantec -> Chinantec */
+/*{"csb", HB_TAG('C','S','B',' ')},*/ /* Kashubian */
+ {"csh", HB_TAG('Q','I','N',' ')}, /* Asho Chin -> Chin */
+ {"cso", HB_TAG('C','C','H','N')}, /* Sochiapam Chinantec -> Chinantec */
+ {"csw", HB_TAG('N','C','R',' ')}, /* Swampy Cree -> N-Cree */
+ {"csw", HB_TAG('N','H','C',' ')}, /* Swampy Cree -> Norway House Cree */
+ {"csy", HB_TAG('Q','I','N',' ')}, /* Siyin Chin -> Chin */
+ {"ctc", HB_TAG('A','T','H',' ')}, /* Chetco -> Athapaskan */
+ {"ctd", HB_TAG('Q','I','N',' ')}, /* Tedim Chin -> Chin */
+ {"cte", HB_TAG('C','C','H','N')}, /* Tepinapa Chinantec -> Chinantec */
+/*{"ctg", HB_TAG('C','T','G',' ')},*/ /* Chittagonian */
+ {"ctl", HB_TAG('C','C','H','N')}, /* Tlacoatzintepec Chinantec -> Chinantec */
+ {"cts", HB_TAG('B','I','K',' ')}, /* Northern Catanduanes Bikol -> Bikol */
+ {"cu", HB_TAG('C','S','L',' ')}, /* Church Slavonic */
+ {"cuc", HB_TAG('C','C','H','N')}, /* Usila Chinantec -> Chinantec */
+/*{"cuk", HB_TAG('C','U','K',' ')},*/ /* San Blas Kuna */
+ {"cv", HB_TAG('C','H','U',' ')}, /* Chuvash */
+ {"cvn", HB_TAG('C','C','H','N')}, /* Valle Nacional Chinantec -> Chinantec */
+ {"cwd", HB_TAG('D','C','R',' ')}, /* Woods Cree */
+ {"cwd", HB_TAG('T','C','R',' ')}, /* Woods Cree -> TH-Cree */
+ {"cy", HB_TAG('W','E','L',' ')}, /* Welsh */
+ {"czh", HB_TAG('Z','H','S',' ')}, /* Huizhou Chinese -> Chinese Simplified */
+ {"czo", HB_TAG('Z','H','S',' ')}, /* Min Zhong Chinese -> Chinese Simplified */
+ {"czt", HB_TAG('Q','I','N',' ')}, /* Zotung Chin -> Chin */
+ {"da", HB_TAG('D','A','N',' ')}, /* Danish */
+ {"dao", HB_TAG('Q','I','N',' ')}, /* Daai Chin -> Chin */
+ {"dap", HB_TAG('N','I','S',' ')}, /* Nisi (India) (retired code) */
+/*{"dar", HB_TAG('D','A','R',' ')},*/ /* Dargwa */
+/*{"dax", HB_TAG('D','A','X',' ')},*/ /* Dayi */
+ {"de", HB_TAG('D','E','U',' ')}, /* German */
+ {"den", HB_TAG('S','L','A',' ')}, /* Slave (Athapascan) [macrolanguage] -> Slavey */
+ {"den", HB_TAG('A','T','H',' ')}, /* Slave (Athapascan) [macrolanguage] -> Athapaskan */
+/*{"dgo", HB_TAG('D','G','O',' ')},*/ /* Dogri */
+ {"dgr", HB_TAG('A','T','H',' ')}, /* Dogrib -> Athapaskan */
+ {"dhd", HB_TAG('M','A','W',' ')}, /* Dhundari -> Marwari */
+/*{"dhg", HB_TAG('D','H','G',' ')},*/ /* Dhangu */
+ {"dib", HB_TAG('D','N','K',' ')}, /* South Central Dinka -> Dinka */
+ {"dik", HB_TAG('D','N','K',' ')}, /* Southwestern Dinka -> Dinka */
+ {"din", HB_TAG('D','N','K',' ')}, /* Dinka [macrolanguage] */
+ {"dip", HB_TAG('D','N','K',' ')}, /* Northeastern Dinka -> Dinka */
+/*{"diq", HB_TAG('D','I','Q',' ')},*/ /* Dimli */
+ {"diw", HB_TAG('D','N','K',' ')}, /* Northwestern Dinka -> Dinka */
+ {"dje", HB_TAG('D','J','R',' ')}, /* Zarma */
+ {"djr", HB_TAG('D','J','R','0')}, /* Djambarrpuyngu */
+ {"dks", HB_TAG('D','N','K',' ')}, /* Southeastern Dinka -> Dinka */
+ {"dng", HB_TAG('D','U','N',' ')}, /* Dungan */
+/*{"dnj", HB_TAG('D','N','J',' ')},*/ /* Dan */
+ {"doi", HB_TAG('D','G','R',' ')}, /* Dogri [macrolanguage] */
+ {"drh", HB_TAG('M','N','G',' ')}, /* Darkhat (retired code) -> Mongolian */
+ {"drw", HB_TAG('D','R','I',' ')}, /* Darwazi (retired code) -> Dari */
+ {"dsb", HB_TAG('L','S','B',' ')}, /* Lower Sorbian */
+ {"dty", HB_TAG('N','E','P',' ')}, /* Dotyali -> Nepali */
+/*{"duj", HB_TAG('D','U','J',' ')},*/ /* Dhuwal (retired code) */
+ {"dup", HB_TAG('M','L','Y',' ')}, /* Duano -> Malay */
+ {"dv", HB_TAG('D','I','V',' ')}, /* Divehi (Dhivehi, Maldivian) */
+ {"dv", HB_TAG('D','H','V',' ')}, /* Divehi (Dhivehi, Maldivian) (deprecated) */
+ {"dwu", HB_TAG('D','U','J',' ')}, /* Dhuwal */
+ {"dwy", HB_TAG('D','U','J',' ')}, /* Dhuwaya -> Dhuwal */
+ {"dyu", HB_TAG('J','U','L',' ')}, /* Dyula -> Jula */
+ {"dz", HB_TAG('D','Z','N',' ')}, /* Dzongkha */
+ {"ee", HB_TAG('E','W','E',' ')}, /* Ewe */
+/*{"efi", HB_TAG('E','F','I',' ')},*/ /* Efik */
+ {"ekk", HB_TAG('E','T','I',' ')}, /* Standard Estonian -> Estonian */
+ {"el", HB_TAG('E','L','L',' ')}, /* Modern Greek (1453-) -> Greek */
+ {"emk", HB_TAG('E','M','K',' ')}, /* Eastern Maninkakan */
+ {"emk", HB_TAG('M','N','K',' ')}, /* Eastern Maninkakan -> Maninka */
+ {"en", HB_TAG('E','N','G',' ')}, /* English */
+ {"enb", HB_TAG('K','A','L',' ')}, /* Markweeta -> Kalenjin */
+ {"enf", HB_TAG('F','N','E',' ')}, /* Forest Enets -> Forest Nenets */
+ {"enh", HB_TAG('T','N','E',' ')}, /* Tundra Enets -> Tundra Nenets */
+ {"eo", HB_TAG('N','T','O',' ')}, /* Esperanto */
+ {"es", HB_TAG('E','S','P',' ')}, /* Spanish */
+ {"esg", HB_TAG('G','O','N',' ')}, /* Aheri Gondi -> Gondi */
+ {"esi", HB_TAG('I','P','K',' ')}, /* North Alaskan Inupiatun -> Inupiat */
+ {"esk", HB_TAG('I','P','K',' ')}, /* Northwest Alaska Inupiatun -> Inupiat */
+/*{"esu", HB_TAG('E','S','U',' ')},*/ /* Central Yupik */
+ {"et", HB_TAG('E','T','I',' ')}, /* Estonian [macrolanguage] */
+ {"eto", HB_TAG('B','T','I',' ')}, /* Eton (Cameroon) -> Beti */
+ {"eu", HB_TAG('E','U','Q',' ')}, /* Basque */
+ {"eve", HB_TAG('E','V','N',' ')}, /* Even */
+ {"evn", HB_TAG('E','V','K',' ')}, /* Evenki */
+ {"ewo", HB_TAG('B','T','I',' ')}, /* Ewondo -> Beti */
+ {"eyo", HB_TAG('K','A','L',' ')}, /* Keiyo -> Kalenjin */
+ {"fa", HB_TAG('F','A','R',' ')}, /* Persian [macrolanguage] */
+ {"fan", HB_TAG('F','A','N','0')}, /* Fang (Equatorial Guinea) */
+/*{"fat", HB_TAG('F','A','T',' ')},*/ /* Fanti */
+ {"fbl", HB_TAG('B','I','K',' ')}, /* West Albay Bikol -> Bikol */
+ {"ff", HB_TAG('F','U','L',' ')}, /* Fulah [macrolanguage] */
+ {"ffm", HB_TAG('F','U','L',' ')}, /* Maasina Fulfulde -> Fulah */
+ {"fi", HB_TAG('F','I','N',' ')}, /* Finnish */
+ {"fil", HB_TAG('P','I','L',' ')}, /* Filipino */
+ {"fj", HB_TAG('F','J','I',' ')}, /* Fijian */
+ {"flm", HB_TAG('H','A','L',' ')}, /* Halam (Falam Chin) (retired code) */
+ {"flm", HB_TAG('Q','I','N',' ')}, /* Falam Chin (retired code) -> Chin */
+/*{"fmp", HB_TAG('F','M','P',' ')},*/ /* Fe’fe’ */
+ {"fo", HB_TAG('F','O','S',' ')}, /* Faroese */
+/*{"fon", HB_TAG('F','O','N',' ')},*/ /* Fon */
+ {"fr", HB_TAG('F','R','A',' ')}, /* French */
+/*{"frc", HB_TAG('F','R','C',' ')},*/ /* Cajun French */
+/*{"frp", HB_TAG('F','R','P',' ')},*/ /* Arpitan */
+ {"fub", HB_TAG('F','U','L',' ')}, /* Adamawa Fulfulde -> Fulah */
+ {"fuc", HB_TAG('F','U','L',' ')}, /* Pulaar -> Fulah */
+ {"fue", HB_TAG('F','U','L',' ')}, /* Borgu Fulfulde -> Fulah */
+ {"fuf", HB_TAG('F','T','A',' ')}, /* Pular -> Futa */
+ {"fuh", HB_TAG('F','U','L',' ')}, /* Western Niger Fulfulde -> Fulah */
+ {"fui", HB_TAG('F','U','L',' ')}, /* Bagirmi Fulfulde -> Fulah */
+ {"fuq", HB_TAG('F','U','L',' ')}, /* Central-Eastern Niger Fulfulde -> Fulah */
+ {"fur", HB_TAG('F','R','L',' ')}, /* Friulian */
+/*{"fuv", HB_TAG('F','U','V',' ')},*/ /* Nigerian Fulfulde */
+ {"fy", HB_TAG('F','R','I',' ')}, /* Western Frisian -> Frisian */
+ {"ga", HB_TAG('I','R','I',' ')}, /* Irish */
+ {"gaa", HB_TAG('G','A','D',' ')}, /* Ga */
+/*{"gag", HB_TAG('G','A','G',' ')},*/ /* Gagauz */
+ {"gan", HB_TAG('Z','H','S',' ')}, /* Gan Chinese -> Chinese Simplified */
+ {"gax", HB_TAG('O','R','O',' ')}, /* Borana-Arsi-Guji Oromo -> Oromo */
+ {"gaz", HB_TAG('O','R','O',' ')}, /* West Central Oromo -> Oromo */
+ {"gbm", HB_TAG('G','A','W',' ')}, /* Garhwali */
+ {"gce", HB_TAG('A','T','H',' ')}, /* Galice -> Athapaskan */
+ {"gd", HB_TAG('G','A','E',' ')}, /* Scottish Gaelic (Gaelic) */
+ {"gda", HB_TAG('R','A','J',' ')}, /* Gade Lohar -> Rajasthani */
+/*{"gez", HB_TAG('G','E','Z',' ')},*/ /* Geez */
+ {"ggo", HB_TAG('G','O','N',' ')}, /* Southern Gondi (retired code) -> Gondi */
+/*{"gih", HB_TAG('G','I','H',' ')},*/ /* Githabul */
+ {"gil", HB_TAG('G','I','L','0')}, /* Kiribati (Gilbertese) */
+ {"gju", HB_TAG('R','A','J',' ')}, /* Gujari -> Rajasthani */
+/*{"gkp", HB_TAG('G','K','P',' ')},*/ /* Guinea Kpelle -> Kpelle (Guinea) */
+ {"gl", HB_TAG('G','A','L',' ')}, /* Galician */
+ {"gld", HB_TAG('N','A','N',' ')}, /* Nanai */
+/*{"glk", HB_TAG('G','L','K',' ')},*/ /* Gilaki */
+ {"gn", HB_TAG('G','U','A',' ')}, /* Guarani [macrolanguage] */
+/*{"gnn", HB_TAG('G','N','N',' ')},*/ /* Gumatj */
+ {"gno", HB_TAG('G','O','N',' ')}, /* Northern Gondi -> Gondi */
+ {"gnw", HB_TAG('G','U','A',' ')}, /* Western Bolivian Guaraní -> Guarani */
+/*{"gog", HB_TAG('G','O','G',' ')},*/ /* Gogo */
+ {"gom", HB_TAG('K','O','K',' ')}, /* Goan Konkani -> Konkani */
+/*{"gon", HB_TAG('G','O','N',' ')},*/ /* Gondi [macrolanguage] */
+ {"grt", HB_TAG('G','R','O',' ')}, /* Garo */
+ {"gru", HB_TAG('S','O','G',' ')}, /* Kistane -> Sodo Gurage */
+ {"gsw", HB_TAG('A','L','S',' ')}, /* Alsatian */
+ {"gu", HB_TAG('G','U','J',' ')}, /* Gujarati */
+/*{"guc", HB_TAG('G','U','C',' ')},*/ /* Wayuu */
+/*{"guf", HB_TAG('G','U','F',' ')},*/ /* Gupapuyngu */
+ {"gug", HB_TAG('G','U','A',' ')}, /* Paraguayan Guaraní -> Guarani */
+ {"gui", HB_TAG('G','U','A',' ')}, /* Eastern Bolivian Guaraní -> Guarani */
+ {"guk", HB_TAG('G','M','Z',' ')}, /* Gumuz */
+ {"guk", HB_TAG('G','U','K',' ')}, /* Gumuz (SIL fonts) */
+ {"gun", HB_TAG('G','U','A',' ')}, /* Mbyá Guaraní -> Guarani */
+/*{"guz", HB_TAG('G','U','Z',' ')},*/ /* Gusii */
+ {"gv", HB_TAG('M','N','X',' ')}, /* Manx */
+ {"gwi", HB_TAG('A','T','H',' ')}, /* Gwichʼin -> Athapaskan */
+ {"ha", HB_TAG('H','A','U',' ')}, /* Hausa */
+ {"haa", HB_TAG('A','T','H',' ')}, /* Han -> Athapaskan */
+ {"hae", HB_TAG('O','R','O',' ')}, /* Eastern Oromo -> Oromo */
+ {"hak", HB_TAG('Z','H','S',' ')}, /* Hakka Chinese -> Chinese Simplified */
+ {"har", HB_TAG('H','R','I',' ')}, /* Harari */
+/*{"haw", HB_TAG('H','A','W',' ')},*/ /* Hawaiian */
+/*{"hay", HB_TAG('H','A','Y',' ')},*/ /* Haya */
+/*{"haz", HB_TAG('H','A','Z',' ')},*/ /* Hazaragi */
+ {"he", HB_TAG('I','W','R',' ')}, /* Hebrew */
+ {"hea", HB_TAG('H','M','N',' ')}, /* Northern Qiandong Miao -> Hmong */
+ {"hi", HB_TAG('H','I','N',' ')}, /* Hindi */
+/*{"hil", HB_TAG('H','I','L',' ')},*/ /* Hiligaynon */
+ {"hji", HB_TAG('M','L','Y',' ')}, /* Haji -> Malay */
+ {"hlt", HB_TAG('Q','I','N',' ')}, /* Matu Chin -> Chin */
+ {"hma", HB_TAG('H','M','N',' ')}, /* Southern Mashan Hmong -> Hmong */
+ {"hmc", HB_TAG('H','M','N',' ')}, /* Central Huishui Hmong -> Hmong */
+ {"hmd", HB_TAG('H','M','N',' ')}, /* Large Flowery Miao -> Hmong */
+ {"hme", HB_TAG('H','M','N',' ')}, /* Eastern Huishui Hmong -> Hmong */
+ {"hmg", HB_TAG('H','M','N',' ')}, /* Southwestern Guiyang Hmong -> Hmong */
+ {"hmh", HB_TAG('H','M','N',' ')}, /* Southwestern Huishui Hmong -> Hmong */
+ {"hmi", HB_TAG('H','M','N',' ')}, /* Northern Huishui Hmong -> Hmong */
+ {"hmj", HB_TAG('H','M','N',' ')}, /* Ge -> Hmong */
+ {"hml", HB_TAG('H','M','N',' ')}, /* Luopohe Hmong -> Hmong */
+ {"hmm", HB_TAG('H','M','N',' ')}, /* Central Mashan Hmong -> Hmong */
+/*{"hmn", HB_TAG('H','M','N',' ')},*/ /* Hmong [macrolanguage] */
+ {"hmp", HB_TAG('H','M','N',' ')}, /* Northern Mashan Hmong -> Hmong */
+ {"hmq", HB_TAG('H','M','N',' ')}, /* Eastern Qiandong Miao -> Hmong */
+ {"hms", HB_TAG('H','M','N',' ')}, /* Southern Qiandong Miao -> Hmong */
+ {"hmw", HB_TAG('H','M','N',' ')}, /* Western Mashan Hmong -> Hmong */
+ {"hmy", HB_TAG('H','M','N',' ')}, /* Southern Guiyang Hmong -> Hmong */
+ {"hmz", HB_TAG('H','M','N',' ')}, /* Hmong Shua -> Hmong */
+/*{"hnd", HB_TAG('H','N','D',' ')},*/ /* Southern Hindko -> Hindko */
+ {"hne", HB_TAG('C','H','H',' ')}, /* Chhattisgarhi -> Chattisgarhi */
+ {"hnj", HB_TAG('H','M','N',' ')}, /* Hmong Njua -> Hmong */
+ {"hno", HB_TAG('H','N','D',' ')}, /* Northern Hindko -> Hindko */
+ {"ho", HB_TAG('H','M','O',' ')}, /* Hiri Motu */
+ {"hoc", HB_TAG('H','O',' ',' ')}, /* Ho */
+ {"hoi", HB_TAG('A','T','H',' ')}, /* Holikachuk -> Athapaskan */
+ {"hoj", HB_TAG('H','A','R',' ')}, /* Hadothi -> Harauti */
+ {"hr", HB_TAG('H','R','V',' ')}, /* Croatian */
+ {"hrm", HB_TAG('H','M','N',' ')}, /* Horned Miao -> Hmong */
+ {"hsb", HB_TAG('U','S','B',' ')}, /* Upper Sorbian */
+ {"hsn", HB_TAG('Z','H','S',' ')}, /* Xiang Chinese -> Chinese Simplified */
+ {"ht", HB_TAG('H','A','I',' ')}, /* Haitian (Haitian Creole) */
+ {"hu", HB_TAG('H','U','N',' ')}, /* Hungarian */
+ {"huj", HB_TAG('H','M','N',' ')}, /* Northern Guiyang Hmong -> Hmong */
+ {"hup", HB_TAG('A','T','H',' ')}, /* Hupa -> Athapaskan */
+ {"hy", HB_TAG('H','Y','E','0')}, /* Armenian -> Armenian East */
+ {"hy", HB_TAG('H','Y','E',' ')}, /* Armenian */
+ {"hyw", HB_TAG('H','Y','E',' ')}, /* Western Armenian -> Armenian */
+ {"hz", HB_TAG('H','E','R',' ')}, /* Herero */
+ {"ia", HB_TAG('I','N','A',' ')}, /* Interlingua (International Auxiliary Language Association) */
+/*{"iba", HB_TAG('I','B','A',' ')},*/ /* Iban */
+/*{"ibb", HB_TAG('I','B','B',' ')},*/ /* Ibibio */
+ {"id", HB_TAG('I','N','D',' ')}, /* Indonesian */
+ {"ida", HB_TAG('L','U','H',' ')}, /* Idakho-Isukha-Tiriki -> Luyia */
+ {"ie", HB_TAG('I','L','E',' ')}, /* Interlingue */
+ {"ig", HB_TAG('I','B','O',' ')}, /* Igbo */
+ {"igb", HB_TAG('E','B','I',' ')}, /* Ebira */
+ {"ii", HB_TAG('Y','I','M',' ')}, /* Sichuan Yi -> Yi Modern */
+ {"ijc", HB_TAG('I','J','O',' ')}, /* Izon -> Ijo */
+/*{"ijo", HB_TAG('I','J','O',' ')},*/ /* Ijo [family] */
+ {"ik", HB_TAG('I','P','K',' ')}, /* Inupiaq [macrolanguage] -> Inupiat */
+ {"ike", HB_TAG('I','N','U',' ')}, /* Eastern Canadian Inuktitut -> Inuktitut */
+ {"ikt", HB_TAG('I','N','U',' ')}, /* Inuinnaqtun -> Inuktitut */
+/*{"ilo", HB_TAG('I','L','O',' ')},*/ /* Iloko -> Ilokano */
+ {"in", HB_TAG('I','N','D',' ')}, /* Indonesian (retired code) */
+ {"ing", HB_TAG('A','T','H',' ')}, /* Degexit'an -> Athapaskan */
+ {"inh", HB_TAG('I','N','G',' ')}, /* Ingush */
+ {"io", HB_TAG('I','D','O',' ')}, /* Ido */
+ {"is", HB_TAG('I','S','L',' ')}, /* Icelandic */
+ {"it", HB_TAG('I','T','A',' ')}, /* Italian */
+ {"iu", HB_TAG('I','N','U',' ')}, /* Inuktitut [macrolanguage] */
+ {"iw", HB_TAG('I','W','R',' ')}, /* Hebrew (retired code) */
+ {"ja", HB_TAG('J','A','N',' ')}, /* Japanese */
+ {"jak", HB_TAG('M','L','Y',' ')}, /* Jakun -> Malay */
+/*{"jam", HB_TAG('J','A','M',' ')},*/ /* Jamaican Creole English -> Jamaican Creole */
+ {"jax", HB_TAG('M','L','Y',' ')}, /* Jambi Malay -> Malay */
+/*{"jbo", HB_TAG('J','B','O',' ')},*/ /* Lojban */
+/*{"jct", HB_TAG('J','C','T',' ')},*/ /* Krymchak */
+ {"ji", HB_TAG('J','I','I',' ')}, /* Yiddish (retired code) */
+ {"jv", HB_TAG('J','A','V',' ')}, /* Javanese */
+ {"jw", HB_TAG('J','A','V',' ')}, /* Javanese (retired code) */
+ {"ka", HB_TAG('K','A','T',' ')}, /* Georgian */
+ {"kaa", HB_TAG('K','R','K',' ')}, /* Kara-Kalpak -> Karakalpak */
+ {"kab", HB_TAG('K','A','B','0')}, /* Kabyle */
+ {"kam", HB_TAG('K','M','B',' ')}, /* Kamba (Kenya) */
+ {"kar", HB_TAG('K','R','N',' ')}, /* Karen [family] */
+ {"kbd", HB_TAG('K','A','B',' ')}, /* Kabardian */
+ {"kby", HB_TAG('K','N','R',' ')}, /* Manga Kanuri -> Kanuri */
+ {"kca", HB_TAG('K','H','K',' ')}, /* Khanty -> Khanty-Kazim */
+ {"kca", HB_TAG('K','H','S',' ')}, /* Khanty -> Khanty-Shurishkar */
+ {"kca", HB_TAG('K','H','V',' ')}, /* Khanty -> Khanty-Vakhi */
+/*{"kde", HB_TAG('K','D','E',' ')},*/ /* Makonde */
+ {"kdr", HB_TAG('K','R','M',' ')}, /* Karaim */
+ {"kdt", HB_TAG('K','U','Y',' ')}, /* Kuy */
+/*{"kea", HB_TAG('K','E','A',' ')},*/ /* Kabuverdianu (Crioulo) */
+/*{"kek", HB_TAG('K','E','K',' ')},*/ /* Kekchi */
+ {"kex", HB_TAG('K','K','N',' ')}, /* Kukna -> Kokni */
+ {"kfa", HB_TAG('K','O','D',' ')}, /* Kodava -> Kodagu */
+ {"kfr", HB_TAG('K','A','C',' ')}, /* Kachhi -> Kachchi */
+ {"kfx", HB_TAG('K','U','L',' ')}, /* Kullu Pahari -> Kulvi */
+ {"kfy", HB_TAG('K','M','N',' ')}, /* Kumaoni */
+ {"kg", HB_TAG('K','O','N','0')}, /* Kongo [macrolanguage] */
+ {"kha", HB_TAG('K','S','I',' ')}, /* Khasi */
+ {"khb", HB_TAG('X','B','D',' ')}, /* Lü */
+ {"khk", HB_TAG('M','N','G',' ')}, /* Halh Mongolian -> Mongolian */
+ {"kht", HB_TAG('K','H','N',' ')}, /* Khamti -> Khamti Shan (Microsoft fonts) */
+ {"kht", HB_TAG('K','H','T',' ')}, /* Khamti -> Khamti Shan (OpenType spec and SIL fonts) */
+/*{"khw", HB_TAG('K','H','W',' ')},*/ /* Khowar */
+ {"ki", HB_TAG('K','I','K',' ')}, /* Kikuyu (Gikuyu) */
+/*{"kiu", HB_TAG('K','I','U',' ')},*/ /* Kirmanjki */
+ {"kj", HB_TAG('K','U','A',' ')}, /* Kuanyama */
+/*{"kjd", HB_TAG('K','J','D',' ')},*/ /* Southern Kiwai */
+ {"kjh", HB_TAG('K','H','A',' ')}, /* Khakas -> Khakass */
+/*{"kjp", HB_TAG('K','J','P',' ')},*/ /* Pwo Eastern Karen -> Eastern Pwo Karen */
+/*{"kjz", HB_TAG('K','J','Z',' ')},*/ /* Bumthangkha */
+ {"kk", HB_TAG('K','A','Z',' ')}, /* Kazakh */
+ {"kkz", HB_TAG('A','T','H',' ')}, /* Kaska -> Athapaskan */
+ {"kl", HB_TAG('G','R','N',' ')}, /* Greenlandic */
+ {"kln", HB_TAG('K','A','L',' ')}, /* Kalenjin [macrolanguage] */
+ {"km", HB_TAG('K','H','M',' ')}, /* Khmer */
+ {"kmb", HB_TAG('M','B','N',' ')}, /* Kimbundu -> Mbundu */
+ {"kmr", HB_TAG('K','U','R',' ')}, /* Northern Kurdish -> Kurdish */
+ {"kmw", HB_TAG('K','M','O',' ')}, /* Komo (Democratic Republic of Congo) */
+/*{"kmz", HB_TAG('K','M','Z',' ')},*/ /* Khorasani Turkish -> Khorasani Turkic */
+ {"kn", HB_TAG('K','A','N',' ')}, /* Kannada */
+ {"knc", HB_TAG('K','N','R',' ')}, /* Central Kanuri -> Kanuri */
+ {"kng", HB_TAG('K','O','N','0')}, /* Koongo -> Kongo */
+ {"knn", HB_TAG('K','O','K',' ')}, /* Konkani */
+ {"ko", HB_TAG('K','O','R',' ')}, /* Korean */
+ {"koi", HB_TAG('K','O','P',' ')}, /* Komi-Permyak */
+/*{"kok", HB_TAG('K','O','K',' ')},*/ /* Konkani [macrolanguage] */
+/*{"kos", HB_TAG('K','O','S',' ')},*/ /* Kosraean */
+ {"koy", HB_TAG('A','T','H',' ')}, /* Koyukon -> Athapaskan */
+ {"kpe", HB_TAG('K','P','L',' ')}, /* Kpelle [macrolanguage] */
+ {"kpv", HB_TAG('K','O','Z',' ')}, /* Komi-Zyrian */
+ {"kpy", HB_TAG('K','Y','K',' ')}, /* Koryak */
+ {"kqs", HB_TAG('K','I','S',' ')}, /* Northern Kissi -> Kisii */
+ {"kqy", HB_TAG('K','R','T',' ')}, /* Koorete */
+ {"kr", HB_TAG('K','N','R',' ')}, /* Kanuri [macrolanguage] */
+ {"krc", HB_TAG('K','A','R',' ')}, /* Karachay-Balkar -> Karachay */
+ {"krc", HB_TAG('B','A','L',' ')}, /* Karachay-Balkar -> Balkar */
+/*{"kri", HB_TAG('K','R','I',' ')},*/ /* Krio */
+/*{"krl", HB_TAG('K','R','L',' ')},*/ /* Karelian */
+ {"krt", HB_TAG('K','N','R',' ')}, /* Tumari Kanuri -> Kanuri */
+ {"kru", HB_TAG('K','U','U',' ')}, /* Kurukh */
+ {"ks", HB_TAG('K','S','H',' ')}, /* Kashmiri */
+ {"ksh", HB_TAG('K','S','H','0')}, /* Kölsch -> Ripuarian */
+ {"kss", HB_TAG('K','I','S',' ')}, /* Southern Kisi -> Kisii */
+/*{"ksw", HB_TAG('K','S','W',' ')},*/ /* S’gaw Karen */
+ {"ktb", HB_TAG('K','E','B',' ')}, /* Kambaata -> Kebena */
+ {"ktu", HB_TAG('K','O','N',' ')}, /* Kituba (Democratic Republic of Congo) -> Kikongo */
+ {"ktw", HB_TAG('A','T','H',' ')}, /* Kato -> Athapaskan */
+ {"ku", HB_TAG('K','U','R',' ')}, /* Kurdish [macrolanguage] */
+/*{"kum", HB_TAG('K','U','M',' ')},*/ /* Kumyk */
+ {"kuu", HB_TAG('A','T','H',' ')}, /* Upper Kuskokwim -> Athapaskan */
+ {"kv", HB_TAG('K','O','M',' ')}, /* Komi [macrolanguage] */
+ {"kvb", HB_TAG('M','L','Y',' ')}, /* Kubu -> Malay */
+ {"kvr", HB_TAG('M','L','Y',' ')}, /* Kerinci -> Malay */
+ {"kw", HB_TAG('C','O','R',' ')}, /* Cornish */
+ {"kwy", HB_TAG('K','O','N','0')}, /* San Salvador Kongo -> Kongo */
+ {"kxc", HB_TAG('K','M','S',' ')}, /* Konso -> Komso */
+ {"kxd", HB_TAG('M','L','Y',' ')}, /* Brunei -> Malay */
+ {"kxu", HB_TAG('K','U','I',' ')}, /* Kui (India) */
+ {"ky", HB_TAG('K','I','R',' ')}, /* Kirghiz (Kyrgyz) */
+/*{"kyu", HB_TAG('K','Y','U',' ')},*/ /* Western Kayah */
+ {"la", HB_TAG('L','A','T',' ')}, /* Latin */
+ {"lad", HB_TAG('J','U','D',' ')}, /* Ladino */
+ {"lb", HB_TAG('L','T','Z',' ')}, /* Luxembourgish */
+ {"lbe", HB_TAG('L','A','K',' ')}, /* Lak */
+ {"lbj", HB_TAG('L','D','K',' ')}, /* Ladakhi */
+ {"lbl", HB_TAG('B','I','K',' ')}, /* Libon Bikol -> Bikol */
+ {"lce", HB_TAG('M','L','Y',' ')}, /* Loncong -> Malay */
+ {"lcf", HB_TAG('M','L','Y',' ')}, /* Lubu -> Malay */
+ {"ldi", HB_TAG('K','O','N','0')}, /* Laari -> Kongo */
+/*{"lez", HB_TAG('L','E','Z',' ')},*/ /* Lezghian -> Lezgi */
+ {"lg", HB_TAG('L','U','G',' ')}, /* Ganda */
+ {"li", HB_TAG('L','I','M',' ')}, /* Limburgish */
+ {"lif", HB_TAG('L','M','B',' ')}, /* Limbu */
+/*{"lij", HB_TAG('L','I','J',' ')},*/ /* Ligurian */
+/*{"lis", HB_TAG('L','I','S',' ')},*/ /* Lisu */
+ {"liw", HB_TAG('M','L','Y',' ')}, /* Col -> Malay */
+/*{"ljp", HB_TAG('L','J','P',' ')},*/ /* Lampung Api -> Lampung */
+ {"lkb", HB_TAG('L','U','H',' ')}, /* Kabras -> Luyia */
+/*{"lki", HB_TAG('L','K','I',' ')},*/ /* Laki */
+ {"lko", HB_TAG('L','U','H',' ')}, /* Khayo -> Luyia */
+ {"lks", HB_TAG('L','U','H',' ')}, /* Kisa -> Luyia */
+ {"lld", HB_TAG('L','A','D',' ')}, /* Ladin */
+ {"lmn", HB_TAG('L','A','M',' ')}, /* Lambadi -> Lambani */
+/*{"lmo", HB_TAG('L','M','O',' ')},*/ /* Lombard */
+ {"ln", HB_TAG('L','I','N',' ')}, /* Lingala */
+ {"lo", HB_TAG('L','A','O',' ')}, /* Lao */
+/*{"lom", HB_TAG('L','O','M',' ')},*/ /* Loma (Liberia) */
+/*{"lrc", HB_TAG('L','R','C',' ')},*/ /* Northern Luri -> Luri */
+ {"lri", HB_TAG('L','U','H',' ')}, /* Marachi -> Luyia */
+ {"lrm", HB_TAG('L','U','H',' ')}, /* Marama -> Luyia */
+ {"lsm", HB_TAG('L','U','H',' ')}, /* Saamia -> Luyia */
+ {"lt", HB_TAG('L','T','H',' ')}, /* Lithuanian */
+ {"ltg", HB_TAG('L','V','I',' ')}, /* Latgalian -> Latvian */
+ {"lto", HB_TAG('L','U','H',' ')}, /* Tsotso -> Luyia */
+ {"lts", HB_TAG('L','U','H',' ')}, /* Tachoni -> Luyia */
+ {"lu", HB_TAG('L','U','B',' ')}, /* Luba-Katanga */
+/*{"lua", HB_TAG('L','U','A',' ')},*/ /* Luba-Lulua */
+/*{"luo", HB_TAG('L','U','O',' ')},*/ /* Luo (Kenya and Tanzania) */
+ {"lus", HB_TAG('M','I','Z',' ')}, /* Lushai -> Mizo */
+ {"luy", HB_TAG('L','U','H',' ')}, /* Luyia [macrolanguage] */
+ {"luz", HB_TAG('L','R','C',' ')}, /* Southern Luri -> Luri */
+ {"lv", HB_TAG('L','V','I',' ')}, /* Latvian [macrolanguage] */
+ {"lvs", HB_TAG('L','V','I',' ')}, /* Standard Latvian -> Latvian */
+ {"lwg", HB_TAG('L','U','H',' ')}, /* Wanga -> Luyia */
+ {"lzh", HB_TAG('Z','H','T',' ')}, /* Literary Chinese -> Chinese Traditional */
+ {"lzz", HB_TAG('L','A','Z',' ')}, /* Laz */
+/*{"mad", HB_TAG('M','A','D',' ')},*/ /* Madurese -> Madura */
+/*{"mag", HB_TAG('M','A','G',' ')},*/ /* Magahi */
+ {"mai", HB_TAG('M','T','H',' ')}, /* Maithili */
+ {"mak", HB_TAG('M','K','R',' ')}, /* Makasar */
+/*{"mam", HB_TAG('M','A','M',' ')},*/ /* Mam */
+ {"man", HB_TAG('M','N','K',' ')}, /* Mandingo [macrolanguage] -> Maninka */
+ {"max", HB_TAG('M','L','Y',' ')}, /* North Moluccan Malay -> Malay */
+/*{"mbo", HB_TAG('M','B','O',' ')},*/ /* Mbo (Cameroon) */
+ {"mct", HB_TAG('B','T','I',' ')}, /* Mengisa -> Beti */
+ {"mdf", HB_TAG('M','O','K',' ')}, /* Moksha */
+/*{"mdr", HB_TAG('M','D','R',' ')},*/ /* Mandar */
+ {"mdy", HB_TAG('M','L','E',' ')}, /* Male (Ethiopia) */
+ {"men", HB_TAG('M','D','E',' ')}, /* Mende (Sierra Leone) */
+ {"meo", HB_TAG('M','L','Y',' ')}, /* Kedah Malay -> Malay */
+/*{"mer", HB_TAG('M','E','R',' ')},*/ /* Meru */
+/*{"mfa", HB_TAG('M','F','A',' ')},*/ /* Pattani Malay */
+ {"mfb", HB_TAG('M','L','Y',' ')}, /* Bangka -> Malay */
+/*{"mfe", HB_TAG('M','F','E',' ')},*/ /* Morisyen */
+ {"mg", HB_TAG('M','L','G',' ')}, /* Malagasy [macrolanguage] */
+ {"mh", HB_TAG('M','A','H',' ')}, /* Marshallese */
+ {"mhr", HB_TAG('L','M','A',' ')}, /* Eastern Mari -> Low Mari */
+ {"mhv", HB_TAG('A','R','K',' ')}, /* Arakanese (retired code) -> Rakhine */
+ {"mi", HB_TAG('M','R','I',' ')}, /* Maori */
+/*{"min", HB_TAG('M','I','N',' ')},*/ /* Minangkabau */
+ {"mk", HB_TAG('M','K','D',' ')}, /* Macedonian */
+ {"mku", HB_TAG('M','N','K',' ')}, /* Konyanka Maninka -> Maninka */
+/*{"mkw", HB_TAG('M','K','W',' ')},*/ /* Kituba (Congo) */
+ {"ml", HB_TAG('M','A','L',' ')}, /* Malayalam -> Malayalam Traditional */
+ {"ml", HB_TAG('M','L','R',' ')}, /* Malayalam -> Malayalam Reformed */
+ {"mlq", HB_TAG('M','L','N',' ')}, /* Western Maninkakan -> Malinke */
+ {"mlq", HB_TAG('M','N','K',' ')}, /* Western Maninkakan -> Maninka */
+ {"mmr", HB_TAG('H','M','N',' ')}, /* Western Xiangxi Miao -> Hmong */
+ {"mn", HB_TAG('M','N','G',' ')}, /* Mongolian [macrolanguage] */
+ {"mnc", HB_TAG('M','C','H',' ')}, /* Manchu */
+/*{"mni", HB_TAG('M','N','I',' ')},*/ /* Manipuri */
+ {"mnk", HB_TAG('M','N','D',' ')}, /* Mandinka */
+ {"mnk", HB_TAG('M','N','K',' ')}, /* Mandinka -> Maninka */
+ {"mnp", HB_TAG('Z','H','S',' ')}, /* Min Bei Chinese -> Chinese Simplified */
+ {"mns", HB_TAG('M','A','N',' ')}, /* Mansi */
+ {"mnw", HB_TAG('M','O','N',' ')}, /* Mon */
+ {"mo", HB_TAG('M','O','L',' ')}, /* Moldavian (retired code) */
+/*{"moh", HB_TAG('M','O','H',' ')},*/ /* Mohawk */
+/*{"mos", HB_TAG('M','O','S',' ')},*/ /* Mossi */
+ {"mpe", HB_TAG('M','A','J',' ')}, /* Majang */
+ {"mqg", HB_TAG('M','L','Y',' ')}, /* Kota Bangun Kutai Malay -> Malay */
+ {"mr", HB_TAG('M','A','R',' ')}, /* Marathi */
+ {"mrh", HB_TAG('Q','I','N',' ')}, /* Mara Chin -> Chin */
+ {"mrj", HB_TAG('H','M','A',' ')}, /* Western Mari -> High Mari */
+ {"ms", HB_TAG('M','L','Y',' ')}, /* Malay [macrolanguage] */
+ {"msc", HB_TAG('M','N','K',' ')}, /* Sankaran Maninka -> Maninka */
+ {"msh", HB_TAG('M','L','G',' ')}, /* Masikoro Malagasy -> Malagasy */
+ {"msi", HB_TAG('M','L','Y',' ')}, /* Sabah Malay -> Malay */
+ {"mt", HB_TAG('M','T','S',' ')}, /* Maltese */
+ {"mtr", HB_TAG('M','A','W',' ')}, /* Mewari -> Marwari */
+ {"mui", HB_TAG('M','L','Y',' ')}, /* Musi -> Malay */
+ {"mup", HB_TAG('R','A','J',' ')}, /* Malvi -> Rajasthani */
+ {"muq", HB_TAG('H','M','N',' ')}, /* Eastern Xiangxi Miao -> Hmong */
+/*{"mus", HB_TAG('M','U','S',' ')},*/ /* Creek -> Muscogee */
+ {"mvb", HB_TAG('A','T','H',' ')}, /* Mattole -> Athapaskan */
+ {"mve", HB_TAG('M','A','W',' ')}, /* Marwari (Pakistan) */
+ {"mvf", HB_TAG('M','N','G',' ')}, /* Peripheral Mongolian -> Mongolian */
+ {"mwk", HB_TAG('M','N','K',' ')}, /* Kita Maninkakan -> Maninka */
+/*{"mwl", HB_TAG('M','W','L',' ')},*/ /* Mirandese */
+ {"mwr", HB_TAG('M','A','W',' ')}, /* Marwari [macrolanguage] */
+/*{"mww", HB_TAG('M','W','W',' ')},*/ /* Hmong Daw */
+ {"my", HB_TAG('B','R','M',' ')}, /* Burmese */
+ {"mym", HB_TAG('M','E','N',' ')}, /* Me’en */
+/*{"myn", HB_TAG('M','Y','N',' ')},*/ /* Mayan [family] */
+ {"myq", HB_TAG('M','N','K',' ')}, /* Forest Maninka (retired code) -> Maninka */
+ {"myv", HB_TAG('E','R','Z',' ')}, /* Erzya */
+/*{"mzn", HB_TAG('M','Z','N',' ')},*/ /* Mazanderani */
+ {"na", HB_TAG('N','A','U',' ')}, /* Nauru -> Nauruan */
+/*{"nag", HB_TAG('N','A','G',' ')},*/ /* Naga Pidgin -> Naga-Assamese */
+/*{"nah", HB_TAG('N','A','H',' ')},*/ /* Nahuatl [family] */
+ {"nan", HB_TAG('Z','H','S',' ')}, /* Min Nan Chinese -> Chinese Simplified */
+/*{"nap", HB_TAG('N','A','P',' ')},*/ /* Neapolitan */
+ {"nb", HB_TAG('N','O','R',' ')}, /* Norwegian Bokmål -> Norwegian */
+ {"nd", HB_TAG('N','D','B',' ')}, /* North Ndebele -> Ndebele */
+/*{"ndc", HB_TAG('N','D','C',' ')},*/ /* Ndau */
+/*{"nds", HB_TAG('N','D','S',' ')},*/ /* Low Saxon */
+ {"ne", HB_TAG('N','E','P',' ')}, /* Nepali [macrolanguage] */
+/*{"new", HB_TAG('N','E','W',' ')},*/ /* Newari */
+ {"ng", HB_TAG('N','D','G',' ')}, /* Ndonga */
+/*{"nga", HB_TAG('N','G','A',' ')},*/ /* Ngbaka */
+ {"ngl", HB_TAG('L','M','W',' ')}, /* Lomwe */
+ {"ngo", HB_TAG('S','X','T',' ')}, /* Ngoni -> Sutu */
+ {"nhd", HB_TAG('G','U','A',' ')}, /* Chiripá -> Guarani */
+ {"niq", HB_TAG('K','A','L',' ')}, /* Nandi -> Kalenjin */
+/*{"niu", HB_TAG('N','I','U',' ')},*/ /* Niuean */
+ {"niv", HB_TAG('G','I','L',' ')}, /* Gilyak */
+ {"njz", HB_TAG('N','I','S',' ')}, /* Nyishi -> Nisi */
+ {"nl", HB_TAG('N','L','D',' ')}, /* Dutch */
+ {"nle", HB_TAG('L','U','H',' ')}, /* East Nyala -> Luyia */
+ {"nn", HB_TAG('N','Y','N',' ')}, /* Norwegian Nynorsk (Nynorsk, Norwegian) */
+ {"no", HB_TAG('N','O','R',' ')}, /* Norwegian [macrolanguage] */
+ {"nod", HB_TAG('N','T','A',' ')}, /* Northern Thai -> Northern Tai */
+/*{"noe", HB_TAG('N','O','E',' ')},*/ /* Nimadi */
+/*{"nog", HB_TAG('N','O','G',' ')},*/ /* Nogai */
+/*{"nov", HB_TAG('N','O','V',' ')},*/ /* Novial */
+ {"npi", HB_TAG('N','E','P',' ')}, /* Nepali */
+ {"nqo", HB_TAG('N','K','O',' ')}, /* N’Ko */
+ {"nr", HB_TAG('N','D','B',' ')}, /* South Ndebele -> Ndebele */
+ {"nsk", HB_TAG('N','A','S',' ')}, /* Naskapi */
+/*{"nso", HB_TAG('N','S','O',' ')},*/ /* Pedi -> Sotho, Northern */
+ {"nv", HB_TAG('N','A','V',' ')}, /* Navajo */
+ {"nv", HB_TAG('A','T','H',' ')}, /* Navajo -> Athapaskan */
+ {"ny", HB_TAG('C','H','I',' ')}, /* Chichewa (Chewa, Nyanja) */
+ {"nyd", HB_TAG('L','U','H',' ')}, /* Nyore -> Luyia */
+/*{"nym", HB_TAG('N','Y','M',' ')},*/ /* Nyamwezi */
+ {"nyn", HB_TAG('N','K','L',' ')}, /* Nyankole */
+/*{"nza", HB_TAG('N','Z','A',' ')},*/ /* Tigon Mbembe -> Mbembe Tigon */
+ {"oc", HB_TAG('O','C','I',' ')}, /* Occitan (post 1500) */
+ {"oj", HB_TAG('O','J','B',' ')}, /* Ojibwa [macrolanguage] -> Ojibway */
+/*{"ojb", HB_TAG('O','J','B',' ')},*/ /* Northwestern Ojibwa -> Ojibway */
+ {"ojc", HB_TAG('O','J','B',' ')}, /* Central Ojibwa -> Ojibway */
+ {"ojg", HB_TAG('O','J','B',' ')}, /* Eastern Ojibwa -> Ojibway */
+ {"ojs", HB_TAG('O','C','R',' ')}, /* Severn Ojibwa -> Oji-Cree */
+ {"ojw", HB_TAG('O','J','B',' ')}, /* Western Ojibwa -> Ojibway */
+ {"oki", HB_TAG('K','A','L',' ')}, /* Okiek -> Kalenjin */
+ {"okm", HB_TAG('K','O','H',' ')}, /* Middle Korean (10th-16th cent.) -> Korean Old Hangul */
+ {"om", HB_TAG('O','R','O',' ')}, /* Oromo [macrolanguage] */
+ {"or", HB_TAG('O','R','I',' ')}, /* Odia (formerly Oriya) [macrolanguage] */
+ {"orc", HB_TAG('O','R','O',' ')}, /* Orma -> Oromo */
+ {"orn", HB_TAG('M','L','Y',' ')}, /* Orang Kanaq -> Malay */
+ {"ors", HB_TAG('M','L','Y',' ')}, /* Orang Seletar -> Malay */
+ {"ory", HB_TAG('O','R','I',' ')}, /* Odia (formerly Oriya) */
+ {"os", HB_TAG('O','S','S',' ')}, /* Ossetian */
+ {"otw", HB_TAG('O','J','B',' ')}, /* Ottawa -> Ojibway */
+ {"pa", HB_TAG('P','A','N',' ')}, /* Punjabi */
+/*{"pag", HB_TAG('P','A','G',' ')},*/ /* Pangasinan */
+/*{"pam", HB_TAG('P','A','M',' ')},*/ /* Pampanga -> Pampangan */
+ {"pap", HB_TAG('P','A','P','0')}, /* Papiamento -> Papiamentu */
+/*{"pau", HB_TAG('P','A','U',' ')},*/ /* Palauan */
+ {"pbt", HB_TAG('P','A','S',' ')}, /* Southern Pashto -> Pashto */
+ {"pbu", HB_TAG('P','A','S',' ')}, /* Northern Pashto -> Pashto */
+/*{"pcc", HB_TAG('P','C','C',' ')},*/ /* Bouyei */
+/*{"pcd", HB_TAG('P','C','D',' ')},*/ /* Picard */
+ {"pce", HB_TAG('P','L','G',' ')}, /* Ruching Palaung -> Palaung */
+ {"pck", HB_TAG('Q','I','N',' ')}, /* Paite Chin -> Chin */
+/*{"pdc", HB_TAG('P','D','C',' ')},*/ /* Pennsylvania German */
+ {"pel", HB_TAG('M','L','Y',' ')}, /* Pekal -> Malay */
+ {"pes", HB_TAG('F','A','R',' ')}, /* Iranian Persian -> Persian */
+ {"pga", HB_TAG('A','R','A',' ')}, /* Sudanese Creole Arabic -> Arabic */
+/*{"phk", HB_TAG('P','H','K',' ')},*/ /* Phake */
+ {"pi", HB_TAG('P','A','L',' ')}, /* Pali */
+/*{"pih", HB_TAG('P','I','H',' ')},*/ /* Pitcairn-Norfolk -> Norfolk */
+ {"pko", HB_TAG('K','A','L',' ')}, /* Pökoot -> Kalenjin */
+ {"pl", HB_TAG('P','L','K',' ')}, /* Polish */
+ {"pll", HB_TAG('P','L','G',' ')}, /* Shwe Palaung -> Palaung */
+ {"plp", HB_TAG('P','A','P',' ')}, /* Palpa */
+ {"plt", HB_TAG('M','L','G',' ')}, /* Plateau Malagasy -> Malagasy */
+/*{"pms", HB_TAG('P','M','S',' ')},*/ /* Piemontese */
+/*{"pnb", HB_TAG('P','N','B',' ')},*/ /* Western Panjabi */
+/*{"poh", HB_TAG('P','O','H',' ')},*/ /* Poqomchi' -> Pocomchi */
+/*{"pon", HB_TAG('P','O','N',' ')},*/ /* Pohnpeian */
+ {"ppa", HB_TAG('B','A','G',' ')}, /* Pao (retired code) -> Baghelkhandi */
+/*{"pro", HB_TAG('P','R','O',' ')},*/ /* Old Provençal (to 1500) -> Provençal / Old Provençal */
+ {"prs", HB_TAG('D','R','I',' ')}, /* Dari */
+ {"ps", HB_TAG('P','A','S',' ')}, /* Pashto [macrolanguage] */
+ {"pse", HB_TAG('M','L','Y',' ')}, /* Central Malay -> Malay */
+ {"pst", HB_TAG('P','A','S',' ')}, /* Central Pashto -> Pashto */
+ {"pt", HB_TAG('P','T','G',' ')}, /* Portuguese */
+/*{"pwo", HB_TAG('P','W','O',' ')},*/ /* Pwo Western Karen -> Western Pwo Karen */
+ {"qu", HB_TAG('Q','U','Z',' ')}, /* Quechua [macrolanguage] */
+ {"qub", HB_TAG('Q','W','H',' ')}, /* Huallaga Huánuco Quechua -> Quechua (Peru) */
+/*{"quc", HB_TAG('Q','U','C',' ')},*/ /* K’iche’ */
+ {"qud", HB_TAG('Q','V','I',' ')}, /* Calderón Highland Quichua -> Quechua (Ecuador) */
+ {"quf", HB_TAG('Q','U','Z',' ')}, /* Lambayeque Quechua -> Quechua */
+ {"qug", HB_TAG('Q','V','I',' ')}, /* Chimborazo Highland Quichua -> Quechua (Ecuador) */
+/*{"quh", HB_TAG('Q','U','H',' ')},*/ /* South Bolivian Quechua -> Quechua (Bolivia) */
+ {"quk", HB_TAG('Q','U','Z',' ')}, /* Chachapoyas Quechua -> Quechua */
+ {"qul", HB_TAG('Q','U','Z',' ')}, /* North Bolivian Quechua -> Quechua */
+ {"qup", HB_TAG('Q','V','I',' ')}, /* Southern Pastaza Quechua -> Quechua (Ecuador) */
+ {"qur", HB_TAG('Q','W','H',' ')}, /* Yanahuanca Pasco Quechua -> Quechua (Peru) */
+ {"qus", HB_TAG('Q','U','H',' ')}, /* Santiago del Estero Quichua -> Quechua (Bolivia) */
+ {"quw", HB_TAG('Q','V','I',' ')}, /* Tena Lowland Quichua -> Quechua (Ecuador) */
+ {"qux", HB_TAG('Q','W','H',' ')}, /* Yauyos Quechua -> Quechua (Peru) */
+ {"quy", HB_TAG('Q','U','Z',' ')}, /* Ayacucho Quechua -> Quechua */
+/*{"quz", HB_TAG('Q','U','Z',' ')},*/ /* Cusco Quechua -> Quechua */
+ {"qva", HB_TAG('Q','W','H',' ')}, /* Ambo-Pasco Quechua -> Quechua (Peru) */
+ {"qvc", HB_TAG('Q','U','Z',' ')}, /* Cajamarca Quechua -> Quechua */
+ {"qve", HB_TAG('Q','U','Z',' ')}, /* Eastern Apurímac Quechua -> Quechua */
+ {"qvh", HB_TAG('Q','W','H',' ')}, /* Huamalíes-Dos de Mayo Huánuco Quechua -> Quechua (Peru) */
+/*{"qvi", HB_TAG('Q','V','I',' ')},*/ /* Imbabura Highland Quichua -> Quechua (Ecuador) */
+ {"qvj", HB_TAG('Q','V','I',' ')}, /* Loja Highland Quichua -> Quechua (Ecuador) */
+ {"qvl", HB_TAG('Q','W','H',' ')}, /* Cajatambo North Lima Quechua -> Quechua (Peru) */
+ {"qvm", HB_TAG('Q','W','H',' ')}, /* Margos-Yarowilca-Lauricocha Quechua -> Quechua (Peru) */
+ {"qvn", HB_TAG('Q','W','H',' ')}, /* North Junín Quechua -> Quechua (Peru) */
+ {"qvo", HB_TAG('Q','V','I',' ')}, /* Napo Lowland Quechua -> Quechua (Ecuador) */
+ {"qvp", HB_TAG('Q','W','H',' ')}, /* Pacaraos Quechua -> Quechua (Peru) */
+ {"qvs", HB_TAG('Q','U','Z',' ')}, /* San Martín Quechua -> Quechua */
+ {"qvw", HB_TAG('Q','W','H',' ')}, /* Huaylla Wanca Quechua -> Quechua (Peru) */
+ {"qvz", HB_TAG('Q','V','I',' ')}, /* Northern Pastaza Quichua -> Quechua (Ecuador) */
+ {"qwa", HB_TAG('Q','W','H',' ')}, /* Corongo Ancash Quechua -> Quechua (Peru) */
+ {"qwc", HB_TAG('Q','U','Z',' ')}, /* Classical Quechua -> Quechua */
+/*{"qwh", HB_TAG('Q','W','H',' ')},*/ /* Huaylas Ancash Quechua -> Quechua (Peru) */
+ {"qws", HB_TAG('Q','W','H',' ')}, /* Sihuas Ancash Quechua -> Quechua (Peru) */
+ {"qxa", HB_TAG('Q','W','H',' ')}, /* Chiquián Ancash Quechua -> Quechua (Peru) */
+ {"qxc", HB_TAG('Q','W','H',' ')}, /* Chincha Quechua -> Quechua (Peru) */
+ {"qxh", HB_TAG('Q','W','H',' ')}, /* Panao Huánuco Quechua -> Quechua (Peru) */
+ {"qxl", HB_TAG('Q','V','I',' ')}, /* Salasaca Highland Quichua -> Quechua (Ecuador) */
+ {"qxn", HB_TAG('Q','W','H',' ')}, /* Northern Conchucos Ancash Quechua -> Quechua (Peru) */
+ {"qxo", HB_TAG('Q','W','H',' ')}, /* Southern Conchucos Ancash Quechua -> Quechua (Peru) */
+ {"qxp", HB_TAG('Q','U','Z',' ')}, /* Puno Quechua -> Quechua */
+ {"qxr", HB_TAG('Q','V','I',' ')}, /* Cañar Highland Quichua -> Quechua (Ecuador) */
+ {"qxt", HB_TAG('Q','W','H',' ')}, /* Santa Ana de Tusi Pasco Quechua -> Quechua (Peru) */
+ {"qxu", HB_TAG('Q','U','Z',' ')}, /* Arequipa-La Unión Quechua -> Quechua */
+ {"qxw", HB_TAG('Q','W','H',' ')}, /* Jauja Wanca Quechua -> Quechua (Peru) */
+ {"rag", HB_TAG('L','U','H',' ')}, /* Logooli -> Luyia */
+/*{"raj", HB_TAG('R','A','J',' ')},*/ /* Rajasthani [macrolanguage] */
+/*{"rar", HB_TAG('R','A','R',' ')},*/ /* Rarotongan */
+ {"rbb", HB_TAG('P','L','G',' ')}, /* Rumai Palaung -> Palaung */
+ {"rbl", HB_TAG('B','I','K',' ')}, /* Miraya Bikol -> Bikol */
+/*{"rej", HB_TAG('R','E','J',' ')},*/ /* Rejang */
+/*{"ria", HB_TAG('R','I','A',' ')},*/ /* Riang (India) */
+/*{"rif", HB_TAG('R','I','F',' ')},*/ /* Tarifit */
+/*{"rit", HB_TAG('R','I','T',' ')},*/ /* Ritarungo */
+ {"rki", HB_TAG('A','R','K',' ')}, /* Rakhine */
+/*{"rkw", HB_TAG('R','K','W',' ')},*/ /* Arakwal */
+ {"rm", HB_TAG('R','M','S',' ')}, /* Romansh */
+ {"rmc", HB_TAG('R','O','Y',' ')}, /* Carpathian Romani -> Romany */
+ {"rmf", HB_TAG('R','O','Y',' ')}, /* Kalo Finnish Romani -> Romany */
+ {"rml", HB_TAG('R','O','Y',' ')}, /* Baltic Romani -> Romany */
+ {"rmn", HB_TAG('R','O','Y',' ')}, /* Balkan Romani -> Romany */
+ {"rmo", HB_TAG('R','O','Y',' ')}, /* Sinte Romani -> Romany */
+ {"rmw", HB_TAG('R','O','Y',' ')}, /* Welsh Romani -> Romany */
+/*{"rmy", HB_TAG('R','M','Y',' ')},*/ /* Vlax Romani */
+ {"rmz", HB_TAG('A','R','K',' ')}, /* Marma -> Rakhine */
+ {"rn", HB_TAG('R','U','N',' ')}, /* Rundi */
+ {"rnl", HB_TAG('H','A','L',' ')}, /* Ranglong -> Halam (Falam Chin) */
+ {"ro", HB_TAG('R','O','M',' ')}, /* Romanian */
+ {"rom", HB_TAG('R','O','Y',' ')}, /* Romany [macrolanguage] */
+/*{"rtm", HB_TAG('R','T','M',' ')},*/ /* Rotuman */
+ {"ru", HB_TAG('R','U','S',' ')}, /* Russian */
+ {"rue", HB_TAG('R','S','Y',' ')}, /* Rusyn */
+/*{"rup", HB_TAG('R','U','P',' ')},*/ /* Aromanian */
+ {"rw", HB_TAG('R','U','A',' ')}, /* Kinyarwanda */
+ {"rwr", HB_TAG('M','A','W',' ')}, /* Marwari (India) */
+ {"sa", HB_TAG('S','A','N',' ')}, /* Sanskrit */
+ {"sah", HB_TAG('Y','A','K',' ')}, /* Yakut -> Sakha */
+ {"sam", HB_TAG('P','A','A',' ')}, /* Samaritan Aramaic -> Palestinian Aramaic */
+/*{"sas", HB_TAG('S','A','S',' ')},*/ /* Sasak */
+/*{"sat", HB_TAG('S','A','T',' ')},*/ /* Santali */
+ {"sc", HB_TAG('S','R','D',' ')}, /* Sardinian [macrolanguage] */
+ {"sck", HB_TAG('S','A','D',' ')}, /* Sadri */
+/*{"scn", HB_TAG('S','C','N',' ')},*/ /* Sicilian */
+/*{"sco", HB_TAG('S','C','O',' ')},*/ /* Scots */
+ {"scs", HB_TAG('S','C','S',' ')}, /* North Slavey */
+ {"scs", HB_TAG('S','L','A',' ')}, /* North Slavey -> Slavey */
+ {"scs", HB_TAG('A','T','H',' ')}, /* North Slavey -> Athapaskan */
+ {"sd", HB_TAG('S','N','D',' ')}, /* Sindhi */
+ {"sdc", HB_TAG('S','R','D',' ')}, /* Sassarese Sardinian -> Sardinian */
+ {"sdh", HB_TAG('K','U','R',' ')}, /* Southern Kurdish -> Kurdish */
+ {"sdn", HB_TAG('S','R','D',' ')}, /* Gallurese Sardinian -> Sardinian */
+ {"se", HB_TAG('N','S','M',' ')}, /* Northern Sami */
+ {"seh", HB_TAG('S','N','A',' ')}, /* Sena */
+ {"sek", HB_TAG('A','T','H',' ')}, /* Sekani -> Athapaskan */
+/*{"sel", HB_TAG('S','E','L',' ')},*/ /* Selkup */
+ {"sez", HB_TAG('Q','I','N',' ')}, /* Senthang Chin -> Chin */
+ {"sfm", HB_TAG('H','M','N',' ')}, /* Small Flowery Miao -> Hmong */
+ {"sg", HB_TAG('S','G','O',' ')}, /* Sango */
+/*{"sga", HB_TAG('S','G','A',' ')},*/ /* Old Irish (to 900) */
+ {"sgc", HB_TAG('K','A','L',' ')}, /* Kipsigis -> Kalenjin */
+/*{"sgs", HB_TAG('S','G','S',' ')},*/ /* Samogitian */
+ {"sgw", HB_TAG('C','H','G',' ')}, /* Sebat Bet Gurage -> Chaha Gurage */
+ {"sgw", HB_TAG('S','G','W',' ')}, /* Sebat Bet Gurage -> Chaha Gurage (SIL fonts) */
+/*{"shi", HB_TAG('S','H','I',' ')},*/ /* Tachelhit */
+/*{"shn", HB_TAG('S','H','N',' ')},*/ /* Shan */
+ {"shu", HB_TAG('A','R','A',' ')}, /* Chadian Arabic -> Arabic */
+ {"si", HB_TAG('S','N','H',' ')}, /* Sinhala (Sinhalese) */
+/*{"sid", HB_TAG('S','I','D',' ')},*/ /* Sidamo */
+ {"sjd", HB_TAG('K','S','M',' ')}, /* Kildin Sami */
+ {"sjo", HB_TAG('S','I','B',' ')}, /* Xibe -> Sibe */
+ {"sk", HB_TAG('S','K','Y',' ')}, /* Slovak */
+ {"skg", HB_TAG('M','L','G',' ')}, /* Sakalava Malagasy -> Malagasy */
+ {"skr", HB_TAG('S','R','K',' ')}, /* Saraiki */
+ {"sl", HB_TAG('S','L','V',' ')}, /* Slovenian */
+ {"sm", HB_TAG('S','M','O',' ')}, /* Samoan */
+ {"sma", HB_TAG('S','S','M',' ')}, /* Southern Sami */
+ {"smj", HB_TAG('L','S','M',' ')}, /* Lule Sami */
+ {"smn", HB_TAG('I','S','M',' ')}, /* Inari Sami */
+ {"sms", HB_TAG('S','K','S',' ')}, /* Skolt Sami */
+ {"sn", HB_TAG('S','N','A','0')}, /* Shona */
+/*{"snk", HB_TAG('S','N','K',' ')},*/ /* Soninke */
+ {"so", HB_TAG('S','M','L',' ')}, /* Somali */
+/*{"sop", HB_TAG('S','O','P',' ')},*/ /* Songe */
+ {"spv", HB_TAG('O','R','I',' ')}, /* Sambalpuri -> Odia (formerly Oriya) */
+ {"spy", HB_TAG('K','A','L',' ')}, /* Sabaot -> Kalenjin */
+ {"sq", HB_TAG('S','Q','I',' ')}, /* Albanian [macrolanguage] */
+ {"sr", HB_TAG('S','R','B',' ')}, /* Serbian */
+ {"src", HB_TAG('S','R','D',' ')}, /* Logudorese Sardinian -> Sardinian */
+ {"sro", HB_TAG('S','R','D',' ')}, /* Campidanese Sardinian -> Sardinian */
+/*{"srr", HB_TAG('S','R','R',' ')},*/ /* Serer */
+ {"srs", HB_TAG('A','T','H',' ')}, /* Sarsi -> Athapaskan */
+ {"ss", HB_TAG('S','W','Z',' ')}, /* Swati */
+ {"ssh", HB_TAG('A','R','A',' ')}, /* Shihhi Arabic -> Arabic */
+ {"st", HB_TAG('S','O','T',' ')}, /* Southern Sotho -> Sotho, Southern */
+/*{"stq", HB_TAG('S','T','Q',' ')},*/ /* Saterfriesisch -> Saterland Frisian */
+ {"stv", HB_TAG('S','I','G',' ')}, /* Silt'e -> Silte Gurage */
+ {"su", HB_TAG('S','U','N',' ')}, /* Sundanese */
+/*{"suk", HB_TAG('S','U','K',' ')},*/ /* Sukuma */
+ {"suq", HB_TAG('S','U','R',' ')}, /* Suri */
+ {"sv", HB_TAG('S','V','E',' ')}, /* Swedish */
+/*{"sva", HB_TAG('S','V','A',' ')},*/ /* Svan */
+ {"sw", HB_TAG('S','W','K',' ')}, /* Swahili [macrolanguage] */
+ {"swb", HB_TAG('C','M','R',' ')}, /* Maore Comorian -> Comorian */
+ {"swc", HB_TAG('S','W','K',' ')}, /* Congo Swahili -> Swahili */
+ {"swh", HB_TAG('S','W','K',' ')}, /* Swahili */
+ {"swv", HB_TAG('M','A','W',' ')}, /* Shekhawati -> Marwari */
+/*{"sxu", HB_TAG('S','X','U',' ')},*/ /* Upper Saxon */
+ {"syc", HB_TAG('S','Y','R',' ')}, /* Classical Syriac -> Syriac */
+/*{"syl", HB_TAG('S','Y','L',' ')},*/ /* Sylheti */
+/*{"syr", HB_TAG('S','Y','R',' ')},*/ /* Syriac [macrolanguage] */
+/*{"szl", HB_TAG('S','Z','L',' ')},*/ /* Silesian */
+ {"ta", HB_TAG('T','A','M',' ')}, /* Tamil */
+ {"taa", HB_TAG('A','T','H',' ')}, /* Lower Tanana -> Athapaskan */
+/*{"tab", HB_TAG('T','A','B',' ')},*/ /* Tabassaran -> Tabasaran */
+ {"taq", HB_TAG('T','M','H',' ')}, /* Tamasheq -> Tamashek */
+ {"tau", HB_TAG('A','T','H',' ')}, /* Upper Tanana -> Athapaskan */
+ {"tcb", HB_TAG('A','T','H',' ')}, /* Tanacross -> Athapaskan */
+ {"tce", HB_TAG('A','T','H',' ')}, /* Southern Tutchone -> Athapaskan */
+ {"tcp", HB_TAG('Q','I','N',' ')}, /* Tawr Chin -> Chin */
+ {"tcy", HB_TAG('T','U','L',' ')}, /* Tulu -> Tumbuka */
+ {"tcz", HB_TAG('Q','I','N',' ')}, /* Thado Chin -> Chin */
+/*{"tdd", HB_TAG('T','D','D',' ')},*/ /* Tai Nüa -> Dehong Dai */
+ {"tdx", HB_TAG('M','L','G',' ')}, /* Tandroy-Mahafaly Malagasy -> Malagasy */
+ {"te", HB_TAG('T','E','L',' ')}, /* Telugu */
+ {"tec", HB_TAG('K','A','L',' ')}, /* Terik -> Kalenjin */
+ {"tem", HB_TAG('T','M','N',' ')}, /* Timne -> Temne */
+/*{"tet", HB_TAG('T','E','T',' ')},*/ /* Tetum */
+ {"tfn", HB_TAG('A','T','H',' ')}, /* Tanaina -> Athapaskan */
+ {"tg", HB_TAG('T','A','J',' ')}, /* Tajik -> Tajiki */
+ {"tgj", HB_TAG('N','I','S',' ')}, /* Tagin -> Nisi */
+ {"tgx", HB_TAG('A','T','H',' ')}, /* Tagish -> Athapaskan */
+ {"th", HB_TAG('T','H','A',' ')}, /* Thai */
+ {"tht", HB_TAG('A','T','H',' ')}, /* Tahltan -> Athapaskan */
+ {"thv", HB_TAG('T','M','H',' ')}, /* Tahaggart Tamahaq -> Tamashek */
+ {"thz", HB_TAG('T','M','H',' ')}, /* Tayart Tamajeq -> Tamashek */
+ {"ti", HB_TAG('T','G','Y',' ')}, /* Tigrinya */
+ {"tig", HB_TAG('T','G','R',' ')}, /* Tigre */
+/*{"tiv", HB_TAG('T','I','V',' ')},*/ /* Tiv */
+ {"tk", HB_TAG('T','K','M',' ')}, /* Turkmen */
+ {"tkg", HB_TAG('M','L','G',' ')}, /* Tesaka Malagasy -> Malagasy */
+ {"tl", HB_TAG('T','G','L',' ')}, /* Tagalog */
+/*{"tmh", HB_TAG('T','M','H',' ')},*/ /* Tamashek [macrolanguage] */
+ {"tmw", HB_TAG('M','L','Y',' ')}, /* Temuan -> Malay */
+ {"tn", HB_TAG('T','N','A',' ')}, /* Tswana */
+ {"tnf", HB_TAG('D','R','I',' ')}, /* Tangshewi (retired code) -> Dari */
+ {"to", HB_TAG('T','G','N',' ')}, /* Tonga (Tonga Islands) -> Tongan */
+ {"tod", HB_TAG('T','O','D','0')}, /* Toma */
+ {"toi", HB_TAG('T','N','G',' ')}, /* Tonga (Zambia) */
+ {"tol", HB_TAG('A','T','H',' ')}, /* Tolowa -> Athapaskan */
+/*{"tpi", HB_TAG('T','P','I',' ')},*/ /* Tok Pisin */
+ {"tr", HB_TAG('T','R','K',' ')}, /* Turkish */
+ {"tru", HB_TAG('T','U','A',' ')}, /* Turoyo -> Turoyo Aramaic */
+ {"tru", HB_TAG('S','Y','R',' ')}, /* Turoyo -> Syriac */
+ {"ts", HB_TAG('T','S','G',' ')}, /* Tsonga */
+/*{"tsj", HB_TAG('T','S','J',' ')},*/ /* Tshangla */
+ {"tt", HB_TAG('T','A','T',' ')}, /* Tatar */
+ {"ttm", HB_TAG('A','T','H',' ')}, /* Northern Tutchone -> Athapaskan */
+ {"ttq", HB_TAG('T','M','H',' ')}, /* Tawallammat Tamajaq -> Tamashek */
+/*{"tum", HB_TAG('T','U','M',' ')},*/ /* Tumbuka -> Tulu */
+ {"tuu", HB_TAG('A','T','H',' ')}, /* Tututni -> Athapaskan */
+ {"tuy", HB_TAG('K','A','L',' ')}, /* Tugen -> Kalenjin */
+/*{"tvl", HB_TAG('T','V','L',' ')},*/ /* Tuvalu */
+ {"tw", HB_TAG('T','W','I',' ')}, /* Twi */
+ {"tw", HB_TAG('A','K','A',' ')}, /* Twi -> Akan */
+ {"txc", HB_TAG('A','T','H',' ')}, /* Tsetsaut -> Athapaskan */
+ {"txy", HB_TAG('M','L','G',' ')}, /* Tanosy Malagasy -> Malagasy */
+ {"ty", HB_TAG('T','H','T',' ')}, /* Tahitian */
+ {"tyv", HB_TAG('T','U','V',' ')}, /* Tuvinian -> Tuvin */
+/*{"tyz", HB_TAG('T','Y','Z',' ')},*/ /* Tày */
+/*{"tzm", HB_TAG('T','Z','M',' ')},*/ /* Central Atlas Tamazight -> Tamazight */
+/*{"tzo", HB_TAG('T','Z','O',' ')},*/ /* Tzotzil */
+ {"ubl", HB_TAG('B','I','K',' ')}, /* Buhi'non Bikol -> Bikol */
+/*{"udm", HB_TAG('U','D','M',' ')},*/ /* Udmurt */
+ {"ug", HB_TAG('U','Y','G',' ')}, /* Uyghur */
+ {"uk", HB_TAG('U','K','R',' ')}, /* Ukrainian */
+/*{"umb", HB_TAG('U','M','B',' ')},*/ /* Umbundu */
+ {"unr", HB_TAG('M','U','N',' ')}, /* Mundari */
+ {"ur", HB_TAG('U','R','D',' ')}, /* Urdu */
+ {"urk", HB_TAG('M','L','Y',' ')}, /* Urak Lawoi' -> Malay */
+ {"uz", HB_TAG('U','Z','B',' ')}, /* Uzbek [macrolanguage] */
+ {"uzn", HB_TAG('U','Z','B',' ')}, /* Northern Uzbek -> Uzbek */
+ {"uzs", HB_TAG('U','Z','B',' ')}, /* Southern Uzbek -> Uzbek */
+ {"ve", HB_TAG('V','E','N',' ')}, /* Venda */
+/*{"vec", HB_TAG('V','E','C',' ')},*/ /* Venetian */
+ {"vi", HB_TAG('V','I','T',' ')}, /* Vietnamese */
+ {"vkk", HB_TAG('M','L','Y',' ')}, /* Kaur -> Malay */
+ {"vkt", HB_TAG('M','L','Y',' ')}, /* Tenggarong Kutai Malay -> Malay */
+ {"vls", HB_TAG('F','L','E',' ')}, /* Vlaams -> Dutch (Flemish) */
+ {"vmw", HB_TAG('M','A','K',' ')}, /* Makhuwa */
+ {"vo", HB_TAG('V','O','L',' ')}, /* Volapük */
+/*{"vro", HB_TAG('V','R','O',' ')},*/ /* Võro */
+ {"wa", HB_TAG('W','L','N',' ')}, /* Walloon */
+/*{"war", HB_TAG('W','A','R',' ')},*/ /* Waray (Philippines) -> Waray-Waray */
+ {"wbm", HB_TAG('W','A',' ',' ')}, /* Wa */
+ {"wbr", HB_TAG('W','A','G',' ')}, /* Wagdi */
+ {"wlc", HB_TAG('C','M','R',' ')}, /* Mwali Comorian -> Comorian */
+ {"wle", HB_TAG('S','I','G',' ')}, /* Wolane -> Silte Gurage */
+ {"wlk", HB_TAG('A','T','H',' ')}, /* Wailaki -> Athapaskan */
+ {"wni", HB_TAG('C','M','R',' ')}, /* Ndzwani Comorian -> Comorian */
+ {"wo", HB_TAG('W','L','F',' ')}, /* Wolof */
+ {"wry", HB_TAG('M','A','W',' ')}, /* Merwari -> Marwari */
+ {"wsg", HB_TAG('G','O','N',' ')}, /* Adilabad Gondi -> Gondi */
+/*{"wtm", HB_TAG('W','T','M',' ')},*/ /* Mewati */
+ {"wuu", HB_TAG('Z','H','S',' ')}, /* Wu Chinese -> Chinese Simplified */
+ {"xal", HB_TAG('K','L','M',' ')}, /* Kalmyk */
+ {"xal", HB_TAG('T','O','D',' ')}, /* Kalmyk -> Todo */
+ {"xan", HB_TAG('S','E','K',' ')}, /* Xamtanga -> Sekota */
+ {"xh", HB_TAG('X','H','S',' ')}, /* Xhosa */
+/*{"xjb", HB_TAG('X','J','B',' ')},*/ /* Minjungbal -> Minjangbal */
+/*{"xkf", HB_TAG('X','K','F',' ')},*/ /* Khengkha */
+ {"xmm", HB_TAG('M','L','Y',' ')}, /* Manado Malay -> Malay */
+ {"xmv", HB_TAG('M','L','G',' ')}, /* Antankarana Malagasy -> Malagasy */
+ {"xmw", HB_TAG('M','L','G',' ')}, /* Tsimihety Malagasy -> Malagasy */
+ {"xnr", HB_TAG('D','G','R',' ')}, /* Kangri -> Dogri */
+/*{"xog", HB_TAG('X','O','G',' ')},*/ /* Soga */
+/*{"xpe", HB_TAG('X','P','E',' ')},*/ /* Liberia Kpelle -> Kpelle (Liberia) */
+ {"xsl", HB_TAG('S','S','L',' ')}, /* South Slavey */
+ {"xsl", HB_TAG('S','L','A',' ')}, /* South Slavey -> Slavey */
+ {"xsl", HB_TAG('A','T','H',' ')}, /* South Slavey -> Athapaskan */
+ {"xst", HB_TAG('S','I','G',' ')}, /* Silt'e (retired code) -> Silte Gurage */
+ {"xwo", HB_TAG('T','O','D',' ')}, /* Written Oirat -> Todo */
+/*{"yao", HB_TAG('Y','A','O',' ')},*/ /* Yao */
+/*{"yap", HB_TAG('Y','A','P',' ')},*/ /* Yapese */
+ {"ybd", HB_TAG('A','R','K',' ')}, /* Yangbye (retired code) -> Rakhine */
+ {"ydd", HB_TAG('J','I','I',' ')}, /* Eastern Yiddish -> Yiddish */
+ {"yi", HB_TAG('J','I','I',' ')}, /* Yiddish [macrolanguage] */
+ {"yih", HB_TAG('J','I','I',' ')}, /* Western Yiddish -> Yiddish */
+ {"yo", HB_TAG('Y','B','A',' ')}, /* Yoruba */
+ {"yos", HB_TAG('Q','I','N',' ')}, /* Yos (retired code) -> Chin */
+ {"yrk", HB_TAG('T','N','E',' ')}, /* Nenets -> Tundra Nenets */
+ {"yrk", HB_TAG('F','N','E',' ')}, /* Nenets -> Forest Nenets */
+ {"yue", HB_TAG('Z','H','H',' ')}, /* Yue Chinese -> Chinese, Hong Kong SAR */
+ {"za", HB_TAG('Z','H','A',' ')}, /* Zhuang [macrolanguage] */
+ {"zch", HB_TAG('Z','H','A',' ')}, /* Central Hongshuihe Zhuang -> Zhuang */
+ {"zdj", HB_TAG('C','M','R',' ')}, /* Ngazidja Comorian -> Comorian */
+/*{"zea", HB_TAG('Z','E','A',' ')},*/ /* Zeeuws -> Zealandic */
+ {"zeh", HB_TAG('Z','H','A',' ')}, /* Eastern Hongshuihe Zhuang -> Zhuang */
+ {"zgb", HB_TAG('Z','H','A',' ')}, /* Guibei Zhuang -> Zhuang */
+/*{"zgh", HB_TAG('Z','G','H',' ')},*/ /* Standard Moroccan Tamazight */
+ {"zgm", HB_TAG('Z','H','A',' ')}, /* Minz Zhuang -> Zhuang */
+ {"zgn", HB_TAG('Z','H','A',' ')}, /* Guibian Zhuang -> Zhuang */
+ {"zh", HB_TAG('Z','H','S',' ')}, /* Chinese [macrolanguage] -> Chinese Simplified */
+ {"zhd", HB_TAG('Z','H','A',' ')}, /* Dai Zhuang -> Zhuang */
+ {"zhn", HB_TAG('Z','H','A',' ')}, /* Nong Zhuang -> Zhuang */
+ {"zlj", HB_TAG('Z','H','A',' ')}, /* Liujiang Zhuang -> Zhuang */
+ {"zlm", HB_TAG('M','L','Y',' ')}, /* Malay */
+ {"zln", HB_TAG('Z','H','A',' ')}, /* Lianshan Zhuang -> Zhuang */
+ {"zlq", HB_TAG('Z','H','A',' ')}, /* Liuqian Zhuang -> Zhuang */
+ {"zmi", HB_TAG('M','L','Y',' ')}, /* Negeri Sembilan Malay -> Malay */
+ {"zne", HB_TAG('Z','N','D',' ')}, /* Zande */
+ {"zom", HB_TAG('Q','I','N',' ')}, /* Zou -> Chin */
+ {"zqe", HB_TAG('Z','H','A',' ')}, /* Qiubei Zhuang -> Zhuang */
+ {"zsm", HB_TAG('M','L','Y',' ')}, /* Standard Malay -> Malay */
+ {"zu", HB_TAG('Z','U','L',' ')}, /* Zulu */
+ {"zum", HB_TAG('L','R','C',' ')}, /* Kumzari -> Luri */
+ {"zyb", HB_TAG('Z','H','A',' ')}, /* Yongbei Zhuang -> Zhuang */
+ {"zyg", HB_TAG('Z','H','A',' ')}, /* Yang Zhuang -> Zhuang */
+ {"zyj", HB_TAG('Z','H','A',' ')}, /* Youjiang Zhuang -> Zhuang */
+ {"zyn", HB_TAG('Z','H','A',' ')}, /* Yongnan Zhuang -> Zhuang */
+/*{"zza", HB_TAG('Z','Z','A',' ')},*/ /* Zazaki [macrolanguage] */
+ {"zzj", HB_TAG('Z','H','A',' ')}, /* Zuojiang Zhuang -> Zhuang */
+};
+
+/**
+ * hb_ot_tags_from_complex_language:
+ * @lang_str: a BCP 47 language tag to convert.
+ * @limit: a pointer to the end of the substring of @lang_str to consider for
+ * conversion.
+ * @count: maximum number of language tags to retrieve (IN) and actual number of
+ * language tags retrieved (OUT). If no tags are retrieved, it is not modified.
+ * @tags: array of size at least @language_count to store the language tag
+ * results
+ *
+ * Converts a multi-subtag BCP 47 language tag to language tags.
+ *
+ * Return value: Whether any language systems were retrieved.
+ **/
+static bool
+hb_ot_tags_from_complex_language (const char *lang_str,
+ const char *limit,
+ unsigned int *count /* IN/OUT */,
+ hb_tag_t *tags /* OUT */)
+{
+ if (subtag_matches (lang_str, limit, "-fonnapa"))
+ {
+ /* Undetermined; North American Phonetic Alphabet */
+ tags[0] = HB_TAG('A','P','P','H'); /* Phonetic transcription—Americanist conventions */
+ *count = 1;
+ return true;
+ }
+ if (subtag_matches (lang_str, limit, "-polyton"))
+ {
+ /* Modern Greek (1453-); Polytonic Greek */
+ tags[0] = HB_TAG('P','G','R',' '); /* Polytonic Greek */
+ *count = 1;
+ return true;
+ }
+ if (subtag_matches (lang_str, limit, "-provenc"))
+ {
+ /* Occitan (post 1500); Provençal */
+ tags[0] = HB_TAG('P','R','O',' '); /* Provençal / Old Provençal */
+ *count = 1;
+ return true;
+ }
+ if (subtag_matches (lang_str, limit, "-fonipa"))
+ {
+ /* Undetermined; International Phonetic Alphabet */
+ tags[0] = HB_TAG('I','P','P','H'); /* Phonetic transcription—IPA conventions */
+ *count = 1;
+ return true;
+ }
+ if (subtag_matches (lang_str, limit, "-geok"))
+ {
+ /* Undetermined; Khutsuri (Asomtavruli and Nuskhuri) */
+ tags[0] = HB_TAG('K','G','E',' '); /* Khutsuri Georgian */
+ *count = 1;
+ return true;
+ }
+ if (subtag_matches (lang_str, limit, "-syre"))
+ {
+ /* Undetermined; Syriac (Estrangelo variant) */
+ tags[0] = HB_TAG('S','Y','R','E'); /* Syriac, Estrangela script-variant (equivalent to ISO 15924 'Syre') */
+ *count = 1;
+ return true;
+ }
+ if (subtag_matches (lang_str, limit, "-syrj"))
+ {
+ /* Undetermined; Syriac (Western variant) */
+ tags[0] = HB_TAG('S','Y','R','J'); /* Syriac, Western script-variant (equivalent to ISO 15924 'Syrj') */
+ *count = 1;
+ return true;
+ }
+ if (subtag_matches (lang_str, limit, "-syrn"))
+ {
+ /* Undetermined; Syriac (Eastern variant) */
+ tags[0] = HB_TAG('S','Y','R','N'); /* Syriac, Eastern script-variant (equivalent to ISO 15924 'Syrn') */
+ *count = 1;
+ return true;
+ }
+ switch (lang_str[0])
+ {
+ case 'a':
+ if (0 == strcmp (&lang_str[1], "rt-lojban"))
+ {
+ /* Lojban */
+ tags[0] = HB_TAG('J','B','O',' '); /* Lojban */
+ *count = 1;
+ return true;
+ }
+ break;
+ case 'c':
+ if (lang_matches (&lang_str[1], "do-hant-hk"))
+ {
+ /* Min Dong Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "do-hant-mo"))
+ {
+ /* Min Dong Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "jy-hant-hk"))
+ {
+ /* Jinyu Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "jy-hant-mo"))
+ {
+ /* Jinyu Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "mn-hant-hk"))
+ {
+ /* Mandarin Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "mn-hant-mo"))
+ {
+ /* Mandarin Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "px-hant-hk"))
+ {
+ /* Pu-Xian Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "px-hant-mo"))
+ {
+ /* Pu-Xian Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "zh-hant-hk"))
+ {
+ /* Huizhou Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "zh-hant-mo"))
+ {
+ /* Huizhou Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "zo-hant-hk"))
+ {
+ /* Min Zhong Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "zo-hant-mo"))
+ {
+ /* Min Zhong Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "do-hans"))
+ {
+ /* Min Dong Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "do-hant"))
+ {
+ /* Min Dong Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "jy-hans"))
+ {
+ /* Jinyu Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "jy-hant"))
+ {
+ /* Jinyu Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "mn-hans"))
+ {
+ /* Mandarin Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "mn-hant"))
+ {
+ /* Mandarin Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "px-hans"))
+ {
+ /* Pu-Xian Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "px-hant"))
+ {
+ /* Pu-Xian Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "zh-hans"))
+ {
+ /* Huizhou Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "zh-hant"))
+ {
+ /* Huizhou Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "zo-hans"))
+ {
+ /* Min Zhong Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "zo-hant"))
+ {
+ /* Min Zhong Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "do-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Min Dong Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "do-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Min Dong Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "do-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Min Dong Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "jy-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Jinyu Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "jy-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Jinyu Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "jy-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Jinyu Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "mn-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Mandarin Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "mn-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Mandarin Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "mn-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Mandarin Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "px-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Pu-Xian Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "px-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Pu-Xian Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "px-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Pu-Xian Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "zh-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Huizhou Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "zh-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Huizhou Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "zh-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Huizhou Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "zo-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Min Zhong Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "zo-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Min Zhong Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "zo-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Min Zhong Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ break;
+ case 'g':
+ if (lang_matches (&lang_str[1], "an-hant-hk"))
+ {
+ /* Gan Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "an-hant-mo"))
+ {
+ /* Gan Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "an-hans"))
+ {
+ /* Gan Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "an-hant"))
+ {
+ /* Gan Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "a-latg"))
+ {
+ /* Irish */
+ tags[0] = HB_TAG('I','R','T',' '); /* Irish Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "an-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Gan Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "an-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Gan Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "an-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Gan Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ break;
+ case 'h':
+ if (lang_matches (&lang_str[1], "ak-hant-hk"))
+ {
+ /* Hakka Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "ak-hant-mo"))
+ {
+ /* Hakka Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "sn-hant-hk"))
+ {
+ /* Xiang Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "sn-hant-mo"))
+ {
+ /* Xiang Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "ak-hans"))
+ {
+ /* Hakka Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "ak-hant"))
+ {
+ /* Hakka Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "sn-hans"))
+ {
+ /* Xiang Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "sn-hant"))
+ {
+ /* Xiang Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "ak-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Hakka Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "ak-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Hakka Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "ak-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Hakka Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "sn-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Xiang Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "sn-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Xiang Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "sn-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Xiang Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ break;
+ case 'i':
+ if (0 == strcmp (&lang_str[1], "-navajo"))
+ {
+ /* Navajo */
+ unsigned int i;
+ hb_tag_t possible_tags[] = {
+ HB_TAG('N','A','V',' '), /* Navajo */
+ HB_TAG('A','T','H',' '), /* Athapaskan */
+ };
+ for (i = 0; i < 2 && i < *count; i++)
+ tags[i] = possible_tags[i];
+ *count = i;
+ return true;
+ }
+ if (0 == strcmp (&lang_str[1], "-hak"))
+ {
+ /* Hakka */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (0 == strcmp (&lang_str[1], "-lux"))
+ {
+ /* Luxembourgish */
+ tags[0] = HB_TAG('L','T','Z',' '); /* Luxembourgish */
+ *count = 1;
+ return true;
+ }
+ break;
+ case 'l':
+ if (lang_matches (&lang_str[1], "zh-hans"))
+ {
+ /* Literary Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ break;
+ case 'm':
+ if (lang_matches (&lang_str[1], "np-hant-hk"))
+ {
+ /* Min Bei Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "np-hant-mo"))
+ {
+ /* Min Bei Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "np-hans"))
+ {
+ /* Min Bei Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "np-hant"))
+ {
+ /* Min Bei Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "np-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Min Bei Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "np-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Min Bei Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "np-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Min Bei Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ break;
+ case 'n':
+ if (lang_matches (&lang_str[1], "an-hant-hk"))
+ {
+ /* Min Nan Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "an-hant-mo"))
+ {
+ /* Min Nan Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "an-hans"))
+ {
+ /* Min Nan Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "an-hant"))
+ {
+ /* Min Nan Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "an-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Min Nan Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "an-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Min Nan Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "an-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Min Nan Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strcmp (&lang_str[1], "o-bok"))
+ {
+ /* Norwegian Bokmal */
+ tags[0] = HB_TAG('N','O','R',' '); /* Norwegian */
+ *count = 1;
+ return true;
+ }
+ if (0 == strcmp (&lang_str[1], "o-nyn"))
+ {
+ /* Norwegian Nynorsk */
+ tags[0] = HB_TAG('N','Y','N',' '); /* Norwegian Nynorsk (Nynorsk, Norwegian) */
+ *count = 1;
+ return true;
+ }
+ break;
+ case 'r':
+ if (0 == strncmp (&lang_str[1], "o-", 2)
+ && subtag_matches (lang_str, limit, "-md"))
+ {
+ /* Romanian; Moldova */
+ tags[0] = HB_TAG('M','O','L',' '); /* Moldavian */
+ *count = 1;
+ return true;
+ }
+ break;
+ case 'w':
+ if (lang_matches (&lang_str[1], "uu-hant-hk"))
+ {
+ /* Wu Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "uu-hant-mo"))
+ {
+ /* Wu Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "uu-hans"))
+ {
+ /* Wu Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "uu-hant"))
+ {
+ /* Wu Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "uu-", 3)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Wu Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "uu-", 3)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Wu Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "uu-", 3)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Wu Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ break;
+ case 'y':
+ if (lang_matches (&lang_str[1], "ue-hans"))
+ {
+ /* Yue Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ break;
+ case 'z':
+ if (lang_matches (&lang_str[1], "h-hant-hk"))
+ {
+ /* Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "h-hant-mo"))
+ {
+ /* Chinese */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strcmp (&lang_str[1], "h-min-nan"))
+ {
+ /* Minnan, Hokkien, Amoy, Taiwanese, Southern Min, Southern Fujian, Hoklo, Southern Fukien, Ho-lo */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "h-hans"))
+ {
+ /* Chinese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (lang_matches (&lang_str[1], "h-hant"))
+ {
+ /* Chinese */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ if (0 == strcmp (&lang_str[1], "h-min"))
+ {
+ /* Min, Fuzhou, Hokkien, Amoy, or Taiwanese */
+ tags[0] = HB_TAG('Z','H','S',' '); /* Chinese Simplified */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "h-", 2)
+ && subtag_matches (lang_str, limit, "-hk"))
+ {
+ /* Chinese; Hong Kong */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "h-", 2)
+ && subtag_matches (lang_str, limit, "-mo"))
+ {
+ /* Chinese; Macao */
+ tags[0] = HB_TAG('Z','H','H',' '); /* Chinese, Hong Kong SAR */
+ *count = 1;
+ return true;
+ }
+ if (0 == strncmp (&lang_str[1], "h-", 2)
+ && subtag_matches (lang_str, limit, "-tw"))
+ {
+ /* Chinese; Taiwan, Province of China */
+ tags[0] = HB_TAG('Z','H','T',' '); /* Chinese Traditional */
+ *count = 1;
+ return true;
+ }
+ break;
+ }
+ return false;
+}
+
+/**
+ * hb_ot_ambiguous_tag_to_language
+ * @tag: A language tag.
+ *
+ * Converts @tag to a BCP 47 language tag if it is ambiguous (it corresponds to
+ * many language tags) and the best tag is not the alphabetically first, or if
+ * the best tag consists of multiple subtags, or if the best tag does not appear
+ * in #ot_languages.
+ *
+ * Return value: The #hb_language_t corresponding to the BCP 47 language tag,
+ * or #HB_LANGUAGE_INVALID if @tag is not ambiguous.
+ **/
+static hb_language_t
+hb_ot_ambiguous_tag_to_language (hb_tag_t tag)
+{
+ switch (tag)
+ {
+ case HB_TAG('A','L','T',' '): /* Altai */
+ return hb_language_from_string ("alt", -1); /* Southern Altai */
+ case HB_TAG('A','P','P','H'): /* Phonetic transcription—Americanist conventions */
+ return hb_language_from_string ("und-fonnapa", -1); /* Undetermined; North American Phonetic Alphabet */
+ case HB_TAG('A','R','A',' '): /* Arabic */
+ return hb_language_from_string ("ar", -1); /* Arabic */
+ case HB_TAG('A','R','K',' '): /* Rakhine */
+ return hb_language_from_string ("rki", -1); /* Rakhine */
+ case HB_TAG('A','T','H',' '): /* Athapaskan */
+ return hb_language_from_string ("ath", -1); /* Athapascan */
+ case HB_TAG('B','I','K',' '): /* Bikol */
+ return hb_language_from_string ("bik", -1); /* Bikol */
+ case HB_TAG('C','P','P',' '): /* Creoles */
+ return hb_language_from_string ("crp", -1); /* Creoles and pidgins */
+ case HB_TAG('C','R','R',' '): /* Carrier */
+ return hb_language_from_string ("crx", -1); /* Carrier */
+ case HB_TAG('D','N','K',' '): /* Dinka */
+ return hb_language_from_string ("din", -1); /* Dinka */
+ case HB_TAG('D','R','I',' '): /* Dari */
+ return hb_language_from_string ("prs", -1); /* Dari */
+ case HB_TAG('D','Z','N',' '): /* Dzongkha */
+ return hb_language_from_string ("dz", -1); /* Dzongkha */
+ case HB_TAG('E','T','I',' '): /* Estonian */
+ return hb_language_from_string ("et", -1); /* Estonian */
+ case HB_TAG('G','O','N',' '): /* Gondi */
+ return hb_language_from_string ("gon", -1); /* Gondi */
+ case HB_TAG('H','M','N',' '): /* Hmong */
+ return hb_language_from_string ("hmn", -1); /* Hmong */
+ case HB_TAG('H','N','D',' '): /* Hindko */
+ return hb_language_from_string ("hnd", -1); /* Southern Hindko */
+ case HB_TAG('I','J','O',' '): /* Ijo */
+ return hb_language_from_string ("ijo", -1); /* Ijo */
+ case HB_TAG('I','N','U',' '): /* Inuktitut */
+ return hb_language_from_string ("iu", -1); /* Inuktitut */
+ case HB_TAG('I','P','K',' '): /* Inupiat */
+ return hb_language_from_string ("ik", -1); /* Inupiaq */
+ case HB_TAG('I','P','P','H'): /* Phonetic transcription—IPA conventions */
+ return hb_language_from_string ("und-fonipa", -1); /* Undetermined; International Phonetic Alphabet */
+ case HB_TAG('I','R','T',' '): /* Irish Traditional */
+ return hb_language_from_string ("ga-Latg", -1); /* Irish; Latin (Gaelic variant) */
+ case HB_TAG('J','I','I',' '): /* Yiddish */
+ return hb_language_from_string ("yi", -1); /* Yiddish */
+ case HB_TAG('K','A','L',' '): /* Kalenjin */
+ return hb_language_from_string ("kln", -1); /* Kalenjin */
+ case HB_TAG('K','G','E',' '): /* Khutsuri Georgian */
+ return hb_language_from_string ("und-Geok", -1); /* Undetermined; Khutsuri (Asomtavruli and Nuskhuri) */
+ case HB_TAG('K','N','R',' '): /* Kanuri */
+ return hb_language_from_string ("kr", -1); /* Kanuri */
+ case HB_TAG('K','O','K',' '): /* Konkani */
+ return hb_language_from_string ("kok", -1); /* Konkani */
+ case HB_TAG('K','U','R',' '): /* Kurdish */
+ return hb_language_from_string ("ku", -1); /* Kurdish */
+ case HB_TAG('L','U','H',' '): /* Luyia */
+ return hb_language_from_string ("luy", -1); /* Luyia */
+ case HB_TAG('L','V','I',' '): /* Latvian */
+ return hb_language_from_string ("lv", -1); /* Latvian */
+ case HB_TAG('M','A','W',' '): /* Marwari */
+ return hb_language_from_string ("mwr", -1); /* Marwari */
+ case HB_TAG('M','L','G',' '): /* Malagasy */
+ return hb_language_from_string ("mg", -1); /* Malagasy */
+ case HB_TAG('M','L','Y',' '): /* Malay */
+ return hb_language_from_string ("ms", -1); /* Malay */
+ case HB_TAG('M','N','G',' '): /* Mongolian */
+ return hb_language_from_string ("mn", -1); /* Mongolian */
+ case HB_TAG('M','O','L',' '): /* Moldavian */
+ return hb_language_from_string ("ro-MD", -1); /* Romanian; Moldova */
+ case HB_TAG('N','E','P',' '): /* Nepali */
+ return hb_language_from_string ("ne", -1); /* Nepali */
+ case HB_TAG('N','I','S',' '): /* Nisi */
+ return hb_language_from_string ("njz", -1); /* Nyishi */
+ case HB_TAG('N','O','R',' '): /* Norwegian */
+ return hb_language_from_string ("no", -1); /* Norwegian */
+ case HB_TAG('O','J','B',' '): /* Ojibway */
+ return hb_language_from_string ("oj", -1); /* Ojibwa */
+ case HB_TAG('O','R','O',' '): /* Oromo */
+ return hb_language_from_string ("om", -1); /* Oromo */
+ case HB_TAG('P','A','S',' '): /* Pashto */
+ return hb_language_from_string ("ps", -1); /* Pashto */
+ case HB_TAG('P','G','R',' '): /* Polytonic Greek */
+ return hb_language_from_string ("el-polyton", -1); /* Modern Greek (1453-); Polytonic Greek */
+ case HB_TAG('P','R','O',' '): /* Provençal / Old Provençal */
+ return hb_language_from_string ("pro", -1); /* Old Provençal (to 1500) */
+ case HB_TAG('Q','U','H',' '): /* Quechua (Bolivia) */
+ return hb_language_from_string ("quh", -1); /* South Bolivian Quechua */
+ case HB_TAG('Q','V','I',' '): /* Quechua (Ecuador) */
+ return hb_language_from_string ("qvi", -1); /* Imbabura Highland Quichua */
+ case HB_TAG('Q','W','H',' '): /* Quechua (Peru) */
+ return hb_language_from_string ("qwh", -1); /* Huaylas Ancash Quechua */
+ case HB_TAG('R','A','J',' '): /* Rajasthani */
+ return hb_language_from_string ("raj", -1); /* Rajasthani */
+ case HB_TAG('R','O','Y',' '): /* Romany */
+ return hb_language_from_string ("rom", -1); /* Romany */
+ case HB_TAG('S','Q','I',' '): /* Albanian */
+ return hb_language_from_string ("sq", -1); /* Albanian */
+ case HB_TAG('S','Y','R',' '): /* Syriac */
+ return hb_language_from_string ("syr", -1); /* Syriac */
+ case HB_TAG('S','Y','R','E'): /* Syriac, Estrangela script-variant (equivalent to ISO 15924 'Syre') */
+ return hb_language_from_string ("und-Syre", -1); /* Undetermined; Syriac (Estrangelo variant) */
+ case HB_TAG('S','Y','R','J'): /* Syriac, Western script-variant (equivalent to ISO 15924 'Syrj') */
+ return hb_language_from_string ("und-Syrj", -1); /* Undetermined; Syriac (Western variant) */
+ case HB_TAG('S','Y','R','N'): /* Syriac, Eastern script-variant (equivalent to ISO 15924 'Syrn') */
+ return hb_language_from_string ("und-Syrn", -1); /* Undetermined; Syriac (Eastern variant) */
+ case HB_TAG('T','M','H',' '): /* Tamashek */
+ return hb_language_from_string ("tmh", -1); /* Tamashek */
+ case HB_TAG('T','N','E',' '): /* Tundra Nenets */
+ return hb_language_from_string ("yrk", -1); /* Nenets */
+ case HB_TAG('Z','H','H',' '): /* Chinese, Hong Kong SAR */
+ return hb_language_from_string ("zh-HK", -1); /* Chinese; Hong Kong */
+ case HB_TAG('Z','H','S',' '): /* Chinese Simplified */
+ return hb_language_from_string ("zh-Hans", -1); /* Chinese; Han (Simplified variant) */
+ case HB_TAG('Z','H','T',' '): /* Chinese Traditional */
+ return hb_language_from_string ("zh-Hant", -1); /* Chinese; Han (Traditional variant) */
+ default:
+ return HB_LANGUAGE_INVALID;
+ }
+}
+
+#endif /* HB_OT_TAG_TABLE_HH */
+
+/* == End of generated table == */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-tag.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-tag.cc
index 1338c31732..8ad917ae7f 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-tag.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-tag.cc
@@ -26,7 +26,9 @@
* Google Author(s): Behdad Esfahbod, Roozbeh Pournader
*/
-#include "hb-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_OT_TAG
/* hb_script_t */
@@ -36,7 +38,8 @@ hb_ot_old_tag_from_script (hb_script_t script)
{
/* This seems to be accurate as of end of 2012. */
- switch ((hb_tag_t) script) {
+ switch ((hb_tag_t) script)
+ {
case HB_SCRIPT_INVALID: return HB_OT_TAG_DEFAULT_SCRIPT;
/* KATAKANA and HIRAGANA both map to 'kana' */
@@ -49,8 +52,6 @@ hb_ot_old_tag_from_script (hb_script_t script)
case HB_SCRIPT_NKO: return HB_TAG('n','k','o',' ');
/* Unicode-5.1 additions */
case HB_SCRIPT_VAI: return HB_TAG('v','a','i',' ');
- /* Unicode-5.2 additions */
- /* Unicode-6.0 additions */
}
/* Else, just change first char to lowercase and return */
@@ -114,37 +115,61 @@ hb_ot_new_tag_to_script (hb_tag_t tag)
return HB_SCRIPT_UNKNOWN;
}
+#ifndef HB_DISABLE_DEPRECATED
+void
+hb_ot_tags_from_script (hb_script_t script,
+ hb_tag_t *script_tag_1,
+ hb_tag_t *script_tag_2)
+{
+ unsigned int count = 2;
+ hb_tag_t tags[2];
+ hb_ot_tags_from_script_and_language (script, HB_LANGUAGE_INVALID, &count, tags, nullptr, nullptr);
+ *script_tag_1 = count > 0 ? tags[0] : HB_OT_TAG_DEFAULT_SCRIPT;
+ *script_tag_2 = count > 1 ? tags[1] : HB_OT_TAG_DEFAULT_SCRIPT;
+}
+#endif
+
/*
* Complete list at:
- * https://www.microsoft.com/typography/otspec/scripttags.htm
- * https://www.microsoft.com/typography/otspec160/scripttagsProposed.htm
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/scripttags
*
* Most of the script tags are the same as the ISO 15924 tag but lowercased.
* So we just do that, and handle the exceptional cases in a switch.
*/
-void
-hb_ot_tags_from_script (hb_script_t script,
- hb_tag_t *script_tag_1,
- hb_tag_t *script_tag_2)
+static void
+hb_ot_all_tags_from_script (hb_script_t script,
+ unsigned int *count /* IN/OUT */,
+ hb_tag_t *tags /* OUT */)
{
- hb_tag_t new_tag;
+ unsigned int i = 0;
- *script_tag_2 = HB_OT_TAG_DEFAULT_SCRIPT;
- *script_tag_1 = hb_ot_old_tag_from_script (script);
+ hb_tag_t new_tag = hb_ot_new_tag_from_script (script);
+ if (unlikely (new_tag != HB_OT_TAG_DEFAULT_SCRIPT))
+ {
+ /* HB_SCRIPT_MYANMAR maps to 'mym2', but there is no 'mym3'. */
+ if (new_tag != HB_TAG('m','y','m','2'))
+ tags[i++] = new_tag | '3';
+ if (*count > i)
+ tags[i++] = new_tag;
+ }
- new_tag = hb_ot_new_tag_from_script (script);
- if (unlikely (new_tag != HB_OT_TAG_DEFAULT_SCRIPT)) {
- *script_tag_2 = *script_tag_1;
- *script_tag_1 = new_tag;
+ if (*count > i)
+ {
+ hb_tag_t old_tag = hb_ot_old_tag_from_script (script);
+ if (old_tag != HB_OT_TAG_DEFAULT_SCRIPT)
+ tags[i++] = old_tag;
}
+
+ *count = i;
}
hb_script_t
hb_ot_tag_to_script (hb_tag_t tag)
{
- if (unlikely ((tag & 0x000000FFu) == '2'))
- return hb_ot_new_tag_to_script (tag);
+ unsigned char digit = tag & 0x000000FFu;
+ if (unlikely (digit == '2' || digit == '3'))
+ return hb_ot_new_tag_to_script (tag & 0xFFFFFF32);
return hb_ot_old_tag_to_script (tag);
}
@@ -152,748 +177,19 @@ hb_ot_tag_to_script (hb_tag_t tag)
/* hb_language_t */
-typedef struct {
- char language[4];
- hb_tag_t tag;
-} LangTag;
-
-/*
- * Complete list at:
- * http://www.microsoft.com/typography/otspec/languagetags.htm
- *
- * Generated by intersecting the OpenType language tag list from
- * Draft OpenType 1.5 spec, with with the ISO 639-3 codes from
- * 2008-08-04, matching on name, and finally adjusted manually.
- *
- * Updated on 2012-12-07 with more research into remaining codes.
- *
- * Updated on 2013-11-23 based on usage in SIL and Microsoft fonts,
- * the new proposal from Microsoft, and latest ISO 639-3 names.
- *
- * Some items still missing. Those are commented out at the end.
- * Keep sorted for bsearch.
- *
- * Updated as of 2015-05-06: OT1.7 on MS website has some newer
- * items that we don't have here, eg. Zazaki. This is the new
- * items in OpenType 1.7 (red items), most of which we have:
- * http://www.microsoft.com/typography/otspec170/languagetags.htm
- */
-
-static const LangTag ot_languages[] = {
- {"aa", HB_TAG('A','F','R',' ')}, /* Afar */
- {"ab", HB_TAG('A','B','K',' ')}, /* Abkhazian */
- {"abq", HB_TAG('A','B','A',' ')}, /* Abaza */
- {"acf", HB_TAG('F','A','N',' ')}, /* French Antillean */
- {"ach", HB_TAG('A','C','H',' ')}, /* Acoli */
- {"acr", HB_TAG('A','C','R',' ')}, /* Achi */
- {"ada", HB_TAG('D','N','G',' ')}, /* Dangme */
- {"ady", HB_TAG('A','D','Y',' ')}, /* Adyghe */
- {"af", HB_TAG('A','F','K',' ')}, /* Afrikaans */
- {"ahg", HB_TAG('A','G','W',' ')}, /* Agaw */
- {"aii", HB_TAG('S','W','A',' ')}, /* Swadaya Aramaic */
- {"aio", HB_TAG('A','I','O',' ')}, /* Aiton */
- {"aiw", HB_TAG('A','R','I',' ')}, /* Aari */
- {"ak", HB_TAG('T','W','I',' ')}, /* Akan [macrolanguage] */
- {"aka", HB_TAG('A','K','A',' ')}, /* Akan */
- {"alt", HB_TAG('A','L','T',' ')}, /* [Southern] Altai */
- {"am", HB_TAG('A','M','H',' ')}, /* Amharic */
- {"amf", HB_TAG('H','B','N',' ')}, /* Hammer-Banna */
- {"amw", HB_TAG('S','Y','R',' ')}, /* Western Neo-Aramaic */
- {"an", HB_TAG('A','R','G',' ')}, /* Aragonese */
- {"ang", HB_TAG('A','N','G',' ')}, /* Old English (ca. 450-1100) */
- {"ar", HB_TAG('A','R','A',' ')}, /* Arabic [macrolanguage] */
- {"arb", HB_TAG('A','R','A',' ')}, /* Standard Arabic */
- {"arn", HB_TAG('M','A','P',' ')}, /* Mapudungun */
- {"ary", HB_TAG('M','O','R',' ')}, /* Moroccan Arabic */
- {"as", HB_TAG('A','S','M',' ')}, /* Assamese */
- {"ast", HB_TAG('A','S','T',' ')}, /* Asturian/Asturleonese/Bable/Leonese */
- {"ath", HB_TAG('A','T','H',' ')}, /* Athapaskan [family] */
- {"atj", HB_TAG('R','C','R',' ')}, /* R-Cree */
- {"atv", HB_TAG('A','L','T',' ')}, /* [Northern] Altai */
- {"av", HB_TAG('A','V','R',' ')}, /* Avaric */
- {"awa", HB_TAG('A','W','A',' ')}, /* Awadhi */
- {"ay", HB_TAG('A','Y','M',' ')}, /* Aymara [macrolanguage] */
- {"az", HB_TAG('A','Z','E',' ')}, /* Azerbaijani [macrolanguage] */
- {"azb", HB_TAG('A','Z','B',' ')}, /* South Azerbaijani */
- {"azj", HB_TAG('A','Z','E',' ')}, /* North Azerbaijani */
- {"ba", HB_TAG('B','S','H',' ')}, /* Bashkir */
- {"bad", HB_TAG('B','A','D','0')}, /* Banda */
- {"bai", HB_TAG('B','M','L',' ')}, /* Bamileke [family] */
- {"bal", HB_TAG('B','L','I',' ')}, /* Baluchi [macrolangauge] */
- {"ban", HB_TAG('B','A','N',' ')}, /* Balinese */
- {"bar", HB_TAG('B','A','R',' ')}, /* Bavarian */
- {"bbc", HB_TAG('B','B','C',' ')}, /* Batak Toba */
- {"bci", HB_TAG('B','A','U',' ')}, /* Baoulé */
- {"bcl", HB_TAG('B','I','K',' ')}, /* Central Bikol */
- {"bcq", HB_TAG('B','C','H',' ')}, /* Bench */
- {"bdy", HB_TAG('B','D','Y',' ')}, /* Bandjalang */
- {"be", HB_TAG('B','E','L',' ')}, /* Belarusian */
- {"bem", HB_TAG('B','E','M',' ')}, /* Bemba (Zambia) */
- {"ber", HB_TAG('B','E','R',' ')}, /* Berber [family] */
- {"bfq", HB_TAG('B','A','D',' ')}, /* Badaga */
- {"bft", HB_TAG('B','L','T',' ')}, /* Balti */
- {"bfu", HB_TAG('L','A','H',' ')}, /* Lahuli */
- {"bfy", HB_TAG('B','A','G',' ')}, /* Baghelkhandi */
- {"bg", HB_TAG('B','G','R',' ')}, /* Bulgarian */
- {"bgc", HB_TAG('B','G','C',' ')}, /* Haryanvi */
- {"bgq", HB_TAG('B','G','Q',' ')}, /* Bagri */
- {"bgr", HB_TAG('Q','I','N',' ')}, /* Bawm Chin */
- {"bhb", HB_TAG('B','H','I',' ')}, /* Bhili */
- {"bhk", HB_TAG('B','I','K',' ')}, /* Albay Bicolano (retired code) */
- {"bho", HB_TAG('B','H','O',' ')}, /* Bhojpuri */
- {"bi", HB_TAG('B','I','S',' ')}, /* Bislama */
- {"bik", HB_TAG('B','I','K',' ')}, /* Bikol [macrolanguage] */
- {"bin", HB_TAG('E','D','O',' ')}, /* Bini */
- {"bjj", HB_TAG('B','J','J',' ')}, /* Kanauji */
- {"bjt", HB_TAG('B','L','N',' ')}, /* Balanta-Ganja */
- {"bla", HB_TAG('B','K','F',' ')}, /* Blackfoot */
- {"ble", HB_TAG('B','L','N',' ')}, /* Balanta-Kentohe */
- {"blk", HB_TAG('B','L','K',' ')}, /* Pa'O/Pa'o Karen */
- {"bln", HB_TAG('B','I','K',' ')}, /* Southern Catanduanes Bikol */
- {"bm", HB_TAG('B','M','B',' ')}, /* Bambara */
- {"bn", HB_TAG('B','E','N',' ')}, /* Bengali */
- {"bo", HB_TAG('T','I','B',' ')}, /* Tibetan */
- {"bpy", HB_TAG('B','P','Y',' ')}, /* Bishnupriya */
- {"bqi", HB_TAG('L','R','C',' ')}, /* Bakhtiari */
- {"br", HB_TAG('B','R','E',' ')}, /* Breton */
- {"bra", HB_TAG('B','R','I',' ')}, /* Braj Bhasha */
- {"brh", HB_TAG('B','R','H',' ')}, /* Brahui */
- {"brx", HB_TAG('B','R','X',' ')}, /* Bodo (India) */
- {"bs", HB_TAG('B','O','S',' ')}, /* Bosnian */
- {"btb", HB_TAG('B','T','I',' ')}, /* Beti (Cameroon) */
- {"bto", HB_TAG('B','I','K',' ')}, /* Rinconada Bikol */
- {"bts", HB_TAG('B','T','S',' ')}, /* Batak Simalungun */
- {"bug", HB_TAG('B','U','G',' ')}, /* Buginese */
- {"bxr", HB_TAG('R','B','U',' ')}, /* Russian Buriat */
- {"byn", HB_TAG('B','I','L',' ')}, /* Bilen */
- {"ca", HB_TAG('C','A','T',' ')}, /* Catalan */
- {"cak", HB_TAG('C','A','K',' ')}, /* Kaqchikel */
- {"cbk", HB_TAG('C','B','K',' ')}, /* Chavacano */
- {"cbl", HB_TAG('Q','I','N',' ')}, /* Bualkhaw Chin */
- {"cco", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"ce", HB_TAG('C','H','E',' ')}, /* Chechen */
- {"ceb", HB_TAG('C','E','B',' ')}, /* Cebuano */
- {"cfm", HB_TAG('H','A','L',' ')}, /* Halam/Falam Chin */
- {"cgg", HB_TAG('C','G','G',' ')}, /* Chiga */
- {"ch", HB_TAG('C','H','A',' ')}, /* Chamorro */
- {"chj", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"chk", HB_TAG('C','H','K','0')}, /* Chuukese */
- {"cho", HB_TAG('C','H','O',' ')}, /* Choctaw */
- {"chp", HB_TAG('C','H','P',' ')}, /* Chipewyan */
- {"chq", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"chr", HB_TAG('C','H','R',' ')}, /* Cherokee */
- {"chy", HB_TAG('C','H','Y',' ')}, /* Cheyenne */
- {"chz", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"cja", HB_TAG('C','J','A',' ')}, /* Western Cham */
- {"cjm", HB_TAG('C','J','M',' ')}, /* Eastern Cham */
- {"cka", HB_TAG('Q','I','N',' ')}, /* Khumi Awa Chin */
- {"ckb", HB_TAG('K','U','R',' ')}, /* Central Kurdish (Sorani) */
- {"ckt", HB_TAG('C','H','K',' ')}, /* Chukchi */
- {"cld", HB_TAG('S','Y','R',' ')}, /* Chaldean Neo-Aramaic */
- {"cle", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"cmr", HB_TAG('Q','I','N',' ')}, /* Mro-Khimi Chin */
- {"cnb", HB_TAG('Q','I','N',' ')}, /* Chinbon Chin */
- {"cnh", HB_TAG('Q','I','N',' ')}, /* Hakha Chin */
- {"cnk", HB_TAG('Q','I','N',' ')}, /* Khumi Chin */
- {"cnl", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"cnt", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"cnw", HB_TAG('Q','I','N',' ')}, /* Ngawn Chin */
- {"cop", HB_TAG('C','O','P',' ')}, /* Coptic */
- {"cpa", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"cpp", HB_TAG('C','P','P',' ')}, /* Creoles */
- {"cr", HB_TAG('C','R','E',' ')}, /* Cree */
- {"cre", HB_TAG('Y','C','R',' ')}, /* Y-Cree */
- {"crh", HB_TAG('C','R','T',' ')}, /* Crimean Tatar */
- {"crj", HB_TAG('E','C','R',' ')}, /* [Southern] East Cree */
- {"crk", HB_TAG('W','C','R',' ')}, /* West-Cree */
- {"crl", HB_TAG('E','C','R',' ')}, /* [Northern] East Cree */
- {"crm", HB_TAG('M','C','R',' ')}, /* Moose Cree */
- {"crx", HB_TAG('C','R','R',' ')}, /* Carrier */
- {"cs", HB_TAG('C','S','Y',' ')}, /* Czech */
- {"csa", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"csb", HB_TAG('C','S','B',' ')}, /* Kashubian */
- {"csh", HB_TAG('Q','I','N',' ')}, /* Asho Chin */
- {"cso", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"csy", HB_TAG('Q','I','N',' ')}, /* Siyin Chin */
- {"ctd", HB_TAG('Q','I','N',' ')}, /* Tedim Chin */
- {"cte", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"ctg", HB_TAG('C','T','G',' ')}, /* Chittagonian */
- {"ctl", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"cts", HB_TAG('B','I','K',' ')}, /* Northern Catanduanes Bikol */
- {"cu", HB_TAG('C','S','L',' ')}, /* Church Slavic */
- {"cuc", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"cuk", HB_TAG('C','U','K',' ')}, /* San Blas Kuna */
- {"cv", HB_TAG('C','H','U',' ')}, /* Chuvash */
- {"cvn", HB_TAG('C','C','H','N')}, /* Chinantec */
- {"cwd", HB_TAG('D','C','R',' ')}, /* Woods Cree */
- {"cy", HB_TAG('W','E','L',' ')}, /* Welsh */
- {"czt", HB_TAG('Q','I','N',' ')}, /* Zotung Chin */
- {"da", HB_TAG('D','A','N',' ')}, /* Danish */
- {"dao", HB_TAG('Q','I','N',' ')}, /* Daai Chin */
- {"dap", HB_TAG('N','I','S',' ')}, /* Nisi (India) */
- {"dar", HB_TAG('D','A','R',' ')}, /* Dargwa */
- {"dax", HB_TAG('D','A','X',' ')}, /* Dayi */
- {"de", HB_TAG('D','E','U',' ')}, /* German */
- {"dgo", HB_TAG('D','G','O',' ')}, /* Dogri */
- {"dhd", HB_TAG('M','A','W',' ')}, /* Dhundari */
- {"dhg", HB_TAG('D','H','G',' ')}, /* Dhangu */
- {"din", HB_TAG('D','N','K',' ')}, /* Dinka [macrolanguage] */
- {"diq", HB_TAG('D','I','Q',' ')}, /* Dimli */
- {"dje", HB_TAG('D','J','R',' ')}, /* Zarma */
- {"djr", HB_TAG('D','J','R','0')}, /* Djambarrpuyngu */
- {"dng", HB_TAG('D','U','N',' ')}, /* Dungan */
- {"dnj", HB_TAG('D','N','J',' ')}, /* Dan */
- {"doi", HB_TAG('D','G','R',' ')}, /* Dogri [macrolanguage] */
- {"dsb", HB_TAG('L','S','B',' ')}, /* Lower Sorbian */
- {"duj", HB_TAG('D','U','J',' ')}, /* Dhuwal */
- {"dv", HB_TAG('D','I','V',' ')}, /* Dhivehi/Divehi/Maldivian */
- {"dyu", HB_TAG('J','U','L',' ')}, /* Jula */
- {"dz", HB_TAG('D','Z','N',' ')}, /* Dzongkha */
- {"ee", HB_TAG('E','W','E',' ')}, /* Ewe */
- {"efi", HB_TAG('E','F','I',' ')}, /* Efik */
- {"ekk", HB_TAG('E','T','I',' ')}, /* Standard Estonian */
- {"el", HB_TAG('E','L','L',' ')}, /* Modern Greek (1453-) */
- {"emk", HB_TAG('M','N','K',' ')}, /* Eastern Maninkakan */
- {"en", HB_TAG('E','N','G',' ')}, /* English */
- {"enf", HB_TAG('F','N','E',' ')}, /* Forest Nenets */
- {"enh", HB_TAG('T','N','E',' ')}, /* Tundra Nenets */
- {"eo", HB_TAG('N','T','O',' ')}, /* Esperanto */
- {"eot", HB_TAG('B','T','I',' ')}, /* Beti (Côte d'Ivoire) */
- {"es", HB_TAG('E','S','P',' ')}, /* Spanish */
- {"esu", HB_TAG('E','S','U',' ')}, /* Central Yupik */
- {"et", HB_TAG('E','T','I',' ')}, /* Estonian [macrolanguage] */
- {"eu", HB_TAG('E','U','Q',' ')}, /* Basque */
- {"eve", HB_TAG('E','V','N',' ')}, /* Even */
- {"evn", HB_TAG('E','V','K',' ')}, /* Evenki */
- {"fa", HB_TAG('F','A','R',' ')}, /* Persian [macrolanguage] */
- {"fan", HB_TAG('F','A','N','0')}, /* Fang */
- {"fat", HB_TAG('F','A','T',' ')}, /* Fanti */
- {"ff", HB_TAG('F','U','L',' ')}, /* Fulah [macrolanguage] */
- {"fi", HB_TAG('F','I','N',' ')}, /* Finnish */
- {"fil", HB_TAG('P','I','L',' ')}, /* Filipino */
- {"fj", HB_TAG('F','J','I',' ')}, /* Fijian */
- {"flm", HB_TAG('H','A','L',' ')}, /* Halam/Falam Chin [retired ISO639 code] */
- {"fo", HB_TAG('F','O','S',' ')}, /* Faroese */
- {"fon", HB_TAG('F','O','N',' ')}, /* Fon */
- {"fr", HB_TAG('F','R','A',' ')}, /* French */
- {"frc", HB_TAG('F','R','C',' ')}, /* Cajun French */
- {"frp", HB_TAG('F','R','P',' ')}, /* Arpitan/Francoprovençal */
- {"fuf", HB_TAG('F','T','A',' ')}, /* Futa */
- {"fur", HB_TAG('F','R','L',' ')}, /* Friulian */
- {"fuv", HB_TAG('F','U','V',' ')}, /* Nigerian Fulfulde */
- {"fy", HB_TAG('F','R','I',' ')}, /* Western Frisian */
- {"ga", HB_TAG('I','R','I',' ')}, /* Irish */
- {"gaa", HB_TAG('G','A','D',' ')}, /* Ga */
- {"gag", HB_TAG('G','A','G',' ')}, /* Gagauz */
- {"gbm", HB_TAG('G','A','W',' ')}, /* Garhwali */
- {"gd", HB_TAG('G','A','E',' ')}, /* Scottish Gaelic */
- {"gez", HB_TAG('G','E','Z',' ')}, /* Ge'ez */
- {"ggo", HB_TAG('G','O','N',' ')}, /* Southern Gondi */
- {"gih", HB_TAG('G','I','H',' ')}, /* Githabul */
- {"gil", HB_TAG('G','I','L','0')}, /* Kiribati (Gilbertese) */
- {"gkp", HB_TAG('G','K','P',' ')}, /* Kpelle (Guinea) */
- {"gl", HB_TAG('G','A','L',' ')}, /* Galician */
- {"gld", HB_TAG('N','A','N',' ')}, /* Nanai */
- {"glk", HB_TAG('G','L','K',' ')}, /* Gilaki */
- {"gn", HB_TAG('G','U','A',' ')}, /* Guarani [macrolanguage] */
- {"gnn", HB_TAG('G','N','N',' ')}, /* Gumatj */
- {"gno", HB_TAG('G','O','N',' ')}, /* Northern Gondi */
- {"gog", HB_TAG('G','O','G',' ')}, /* Gogo */
- {"gon", HB_TAG('G','O','N',' ')}, /* Gondi [macrolanguage] */
- {"grt", HB_TAG('G','R','O',' ')}, /* Garo */
- {"gru", HB_TAG('S','O','G',' ')}, /* Sodo Gurage */
- {"gsw", HB_TAG('A','L','S',' ')}, /* Alsatian */
- {"gu", HB_TAG('G','U','J',' ')}, /* Gujarati */
- {"guc", HB_TAG('G','U','C',' ')}, /* Wayuu */
- {"guf", HB_TAG('G','U','F',' ')}, /* Gupapuyngu */
- {"guk", HB_TAG('G','M','Z',' ')}, /* Gumuz */
-/*{"guk", HB_TAG('G','U','K',' ')},*/ /* Gumuz (in SIL fonts) */
- {"guz", HB_TAG('G','U','Z',' ')}, /* Ekegusii/Gusii */
- {"gv", HB_TAG('M','N','X',' ')}, /* Manx */
- {"ha", HB_TAG('H','A','U',' ')}, /* Hausa */
- {"har", HB_TAG('H','R','I',' ')}, /* Harari */
- {"haw", HB_TAG('H','A','W',' ')}, /* Hawaiian */
- {"hay", HB_TAG('H','A','Y',' ')}, /* Haya */
- {"haz", HB_TAG('H','A','Z',' ')}, /* Hazaragi */
- {"he", HB_TAG('I','W','R',' ')}, /* Hebrew */
- {"hi", HB_TAG('H','I','N',' ')}, /* Hindi */
- {"hil", HB_TAG('H','I','L',' ')}, /* Hiligaynon */
- {"hlt", HB_TAG('Q','I','N',' ')}, /* Matu Chin */
- {"hmn", HB_TAG('H','M','N',' ')}, /* Hmong */
- {"hnd", HB_TAG('H','N','D',' ')}, /* [Southern] Hindko */
- {"hne", HB_TAG('C','H','H',' ')}, /* Chattisgarhi */
- {"hno", HB_TAG('H','N','D',' ')}, /* [Northern] Hindko */
- {"ho", HB_TAG('H','M','O',' ')}, /* Hiri Motu */
- {"hoc", HB_TAG('H','O',' ',' ')}, /* Ho */
- {"hoj", HB_TAG('H','A','R',' ')}, /* Harauti */
- {"hr", HB_TAG('H','R','V',' ')}, /* Croatian */
- {"hsb", HB_TAG('U','S','B',' ')}, /* Upper Sorbian */
- {"ht", HB_TAG('H','A','I',' ')}, /* Haitian/Haitian Creole */
- {"hu", HB_TAG('H','U','N',' ')}, /* Hungarian */
- {"hy", HB_TAG('H','Y','E',' ')}, /* Armenian */
- {"hz", HB_TAG('H','E','R',' ')}, /* Herero */
- {"ia", HB_TAG('I','N','A',' ')}, /* Interlingua (International Auxiliary Language Association) */
- {"iba", HB_TAG('I','B','A',' ')}, /* Iban */
- {"ibb", HB_TAG('I','B','B',' ')}, /* Ibibio */
- {"id", HB_TAG('I','N','D',' ')}, /* Indonesian */
- {"ie", HB_TAG('I','L','E',' ')}, /* Interlingue/Occidental */
- {"ig", HB_TAG('I','B','O',' ')}, /* Igbo */
- {"igb", HB_TAG('E','B','I',' ')}, /* Ebira */
- {"ii", HB_TAG('Y','I','M',' ')}, /* Yi Modern */
- {"ijc", HB_TAG('I','J','O',' ')}, /* Izon */
- {"ijo", HB_TAG('I','J','O',' ')}, /* Ijo [family] */
- {"ik", HB_TAG('I','P','K',' ')}, /* Inupiaq [macrolanguage] */
- {"ilo", HB_TAG('I','L','O',' ')}, /* Ilokano */
- {"inh", HB_TAG('I','N','G',' ')}, /* Ingush */
- {"io", HB_TAG('I','D','O',' ')}, /* Ido */
- {"is", HB_TAG('I','S','L',' ')}, /* Icelandic */
- {"it", HB_TAG('I','T','A',' ')}, /* Italian */
- {"iu", HB_TAG('I','N','U',' ')}, /* Inuktitut [macrolanguage] */
- {"ja", HB_TAG('J','A','N',' ')}, /* Japanese */
- {"jam", HB_TAG('J','A','M',' ')}, /* Jamaican Creole English */
- {"jbo", HB_TAG('J','B','O',' ')}, /* Lojban */
- {"jv", HB_TAG('J','A','V',' ')}, /* Javanese */
- {"ka", HB_TAG('K','A','T',' ')}, /* Georgian */
- {"kaa", HB_TAG('K','R','K',' ')}, /* Karakalpak */
- {"kab", HB_TAG('K','A','B','0')}, /* Kabyle */
- {"kam", HB_TAG('K','M','B',' ')}, /* Kamba (Kenya) */
- {"kar", HB_TAG('K','R','N',' ')}, /* Karen [family] */
- {"kat", HB_TAG('K','G','E',' ')}, /* Khutsuri Georgian */
- {"kbd", HB_TAG('K','A','B',' ')}, /* Kabardian */
- {"kde", HB_TAG('K','D','E',' ')}, /* Makonde */
- {"kdr", HB_TAG('K','R','M',' ')}, /* Karaim */
- {"kdt", HB_TAG('K','U','Y',' ')}, /* Kuy */
- {"kea", HB_TAG('K','E','A',' ')}, /* Kabuverdianu (Crioulo) */
- {"kek", HB_TAG('K','E','K',' ')}, /* Kekchi */
- {"kex", HB_TAG('K','K','N',' ')}, /* Kokni */
- {"kfa", HB_TAG('K','O','D',' ')}, /* Kodagu */
- {"kfr", HB_TAG('K','A','C',' ')}, /* Kachchi */
- {"kfx", HB_TAG('K','U','L',' ')}, /* Kulvi */
- {"kfy", HB_TAG('K','M','N',' ')}, /* Kumaoni */
- {"kg", HB_TAG('K','O','N',' ')}, /* Kongo [macrolanguage] */
- {"kha", HB_TAG('K','S','I',' ')}, /* Khasi */
- {"khb", HB_TAG('X','B','D',' ')}, /* Lü */
- {"kht", HB_TAG('K','H','N',' ')}, /* Khamti (Microsoft fonts) */
-/*{"kht", HB_TAG('K','H','T',' ')},*/ /* Khamti (OpenType spec and SIL fonts) */
- {"khw", HB_TAG('K','H','W',' ')}, /* Khowar */
- {"ki", HB_TAG('K','I','K',' ')}, /* Gikuyu/Kikuyu */
- {"kiu", HB_TAG('K','I','U',' ')}, /* Kirmanjki */
- {"kj", HB_TAG('K','U','A',' ')}, /* Kuanyama/Kwanyama */
- {"kjd", HB_TAG('K','J','D',' ')}, /* Southern Kiwai */
- {"kjh", HB_TAG('K','H','A',' ')}, /* Khakass */
- {"kjp", HB_TAG('K','J','P',' ')}, /* Pwo Eastern Karen */
- {"kk", HB_TAG('K','A','Z',' ')}, /* Kazakh */
- {"kl", HB_TAG('G','R','N',' ')}, /* Kalaallisut */
- {"kln", HB_TAG('K','A','L',' ')}, /* Kalenjin */
- {"km", HB_TAG('K','H','M',' ')}, /* Central Khmer */
- {"kmb", HB_TAG('M','B','N',' ')}, /* Kimbundu */
- {"kmw", HB_TAG('K','M','O',' ')}, /* Komo (Democratic Republic of Congo) */
- {"kn", HB_TAG('K','A','N',' ')}, /* Kannada */
- {"knn", HB_TAG('K','O','K',' ')}, /* Konkani */
- {"ko", HB_TAG('K','O','R',' ')}, /* Korean */
- {"koi", HB_TAG('K','O','P',' ')}, /* Komi-Permyak */
- {"kok", HB_TAG('K','O','K',' ')}, /* Konkani [macrolanguage] */
- {"kon", HB_TAG('K','O','N','0')}, /* Kongo */
- {"kos", HB_TAG('K','O','S',' ')}, /* Kosraean */
- {"kpe", HB_TAG('K','P','L',' ')}, /* Kpelle [macrolanguage] */
- {"kpv", HB_TAG('K','O','Z',' ')}, /* Komi-Zyrian */
- {"kpy", HB_TAG('K','Y','K',' ')}, /* Koryak */
- {"kqy", HB_TAG('K','R','T',' ')}, /* Koorete */
- {"kr", HB_TAG('K','N','R',' ')}, /* Kanuri [macrolanguage] */
- {"kri", HB_TAG('K','R','I',' ')}, /* Krio */
- {"krl", HB_TAG('K','R','L',' ')}, /* Karelian */
- {"kru", HB_TAG('K','U','U',' ')}, /* Kurukh */
- {"ks", HB_TAG('K','S','H',' ')}, /* Kashmiri */
- {"ksh", HB_TAG('K','S','H','0')}, /* Ripuarian, Kölsch */
-/*{"ksw", HB_TAG('K','R','N',' ')},*/ /* S'gaw Karen (Microsoft fonts?) */
- {"ksw", HB_TAG('K','S','W',' ')}, /* S'gaw Karen (OpenType spec and SIL fonts) */
- {"ktb", HB_TAG('K','E','B',' ')}, /* Kebena */
- {"ktu", HB_TAG('K','O','N',' ')}, /* Kikongo */
- {"ku", HB_TAG('K','U','R',' ')}, /* Kurdish [macrolanguage] */
- {"kum", HB_TAG('K','U','M',' ')}, /* Kumyk */
- {"kv", HB_TAG('K','O','M',' ')}, /* Komi [macrolanguage] */
- {"kvd", HB_TAG('K','U','I',' ')}, /* Kui (Indonesia) */
- {"kw", HB_TAG('C','O','R',' ')}, /* Cornish */
- {"kxc", HB_TAG('K','M','S',' ')}, /* Komso */
- {"kxu", HB_TAG('K','U','I',' ')}, /* Kui (India) */
- {"ky", HB_TAG('K','I','R',' ')}, /* Kirghiz/Kyrgyz */
- {"kyu", HB_TAG('K','Y','U',' ')}, /* Western Kayah */
- {"la", HB_TAG('L','A','T',' ')}, /* Latin */
- {"lad", HB_TAG('J','U','D',' ')}, /* Ladino */
- {"lb", HB_TAG('L','T','Z',' ')}, /* Luxembourgish */
- {"lbe", HB_TAG('L','A','K',' ')}, /* Lak */
- {"lbj", HB_TAG('L','D','K',' ')}, /* Ladakhi */
- {"lez", HB_TAG('L','E','Z',' ')}, /* Lezgi */
- {"lg", HB_TAG('L','U','G',' ')}, /* Ganda */
- {"li", HB_TAG('L','I','M',' ')}, /* Limburgan/Limburger/Limburgish */
- {"lif", HB_TAG('L','M','B',' ')}, /* Limbu */
- {"lij", HB_TAG('L','I','J',' ')}, /* Ligurian */
- {"lis", HB_TAG('L','I','S',' ')}, /* Lisu */
- {"ljp", HB_TAG('L','J','P',' ')}, /* Lampung Api */
- {"lki", HB_TAG('L','K','I',' ')}, /* Laki */
- {"lld", HB_TAG('L','A','D',' ')}, /* Ladin */
- {"lmn", HB_TAG('L','A','M',' ')}, /* Lambani */
- {"lmo", HB_TAG('L','M','O',' ')}, /* Lombard */
- {"ln", HB_TAG('L','I','N',' ')}, /* Lingala */
- {"lo", HB_TAG('L','A','O',' ')}, /* Lao */
- {"lom", HB_TAG('L','O','M',' ')}, /* Loma */
- {"lrc", HB_TAG('L','R','C',' ')}, /* Northern Luri */
- {"lt", HB_TAG('L','T','H',' ')}, /* Lithuanian */
- {"lu", HB_TAG('L','U','B',' ')}, /* Luba-Katanga */
- {"lua", HB_TAG('L','U','B',' ')}, /* Luba-Kasai */
- {"luo", HB_TAG('L','U','O',' ')}, /* Luo (Kenya and Tanzania) */
- {"lus", HB_TAG('M','I','Z',' ')}, /* Mizo */
- {"luy", HB_TAG('L','U','H',' ')}, /* Luyia/Oluluyia [macrolanguage] */
- {"luz", HB_TAG('L','R','C',' ')}, /* Southern Luri */
- {"lv", HB_TAG('L','V','I',' ')}, /* Latvian */
- {"lzz", HB_TAG('L','A','Z',' ')}, /* Laz */
- {"mad", HB_TAG('M','A','D',' ')}, /* Madurese */
- {"mag", HB_TAG('M','A','G',' ')}, /* Magahi */
- {"mai", HB_TAG('M','T','H',' ')}, /* Maithili */
- {"mak", HB_TAG('M','K','R',' ')}, /* Makasar */
- {"mam", HB_TAG('M','A','M',' ')}, /* Mam */
- {"man", HB_TAG('M','N','K',' ')}, /* Manding/Mandingo [macrolanguage] */
- {"mdc", HB_TAG('M','L','E',' ')}, /* Male (Papua New Guinea) */
- {"mdf", HB_TAG('M','O','K',' ')}, /* Moksha */
- {"mdr", HB_TAG('M','D','R',' ')}, /* Mandar */
- {"mdy", HB_TAG('M','L','E',' ')}, /* Male (Ethiopia) */
- {"men", HB_TAG('M','D','E',' ')}, /* Mende (Sierra Leone) */
- {"mer", HB_TAG('M','E','R',' ')}, /* Meru */
- {"mfe", HB_TAG('M','F','E',' ')}, /* Morisyen */
- {"mg", HB_TAG('M','L','G',' ')}, /* Malagasy [macrolanguage] */
- {"mh", HB_TAG('M','A','H',' ')}, /* Marshallese */
- {"mhr", HB_TAG('L','M','A',' ')}, /* Low Mari */
- {"mi", HB_TAG('M','R','I',' ')}, /* Maori */
- {"min", HB_TAG('M','I','N',' ')}, /* Minangkabau */
- {"mk", HB_TAG('M','K','D',' ')}, /* Macedonian */
- {"mku", HB_TAG('M','N','K',' ')}, /* Konyanka Maninka */
- {"mkw", HB_TAG('M','K','W',' ')}, /* Kituba (Congo) */
- {"ml", HB_TAG('M','L','R',' ')}, /* Malayalam */
- {"mlq", HB_TAG('M','N','K',' ')}, /* Western Maninkakan */
- {"mn", HB_TAG('M','N','G',' ')}, /* Mongolian [macrolanguage] */
- {"mnc", HB_TAG('M','C','H',' ')}, /* Manchu */
- {"mni", HB_TAG('M','N','I',' ')}, /* Manipuri */
- {"mnk", HB_TAG('M','N','D',' ')}, /* Mandinka */
- {"mns", HB_TAG('M','A','N',' ')}, /* Mansi */
- {"mnw", HB_TAG('M','O','N',' ')}, /* Mon */
- {"mo", HB_TAG('M','O','L',' ')}, /* Moldavian */
- {"moh", HB_TAG('M','O','H',' ')}, /* Mohawk */
- {"mos", HB_TAG('M','O','S',' ')}, /* Mossi */
- {"mpe", HB_TAG('M','A','J',' ')}, /* Majang */
- {"mr", HB_TAG('M','A','R',' ')}, /* Marathi */
- {"mrh", HB_TAG('Q','I','N',' ')}, /* Mara Chin */
- {"mrj", HB_TAG('H','M','A',' ')}, /* High Mari */
- {"ms", HB_TAG('M','L','Y',' ')}, /* Malay [macrolanguage] */
- {"msc", HB_TAG('M','N','K',' ')}, /* Sankaran Maninka */
- {"mt", HB_TAG('M','T','S',' ')}, /* Maltese */
- {"mtr", HB_TAG('M','A','W',' ')}, /* Mewari */
- {"mus", HB_TAG('M','U','S',' ')}, /* Creek */
- {"mve", HB_TAG('M','A','W',' ')}, /* Marwari (Pakistan) */
- {"mwk", HB_TAG('M','N','K',' ')}, /* Kita Maninkakan */
- {"mwl", HB_TAG('M','W','L',' ')}, /* Mirandese */
- {"mwr", HB_TAG('M','A','W',' ')}, /* Marwari [macrolanguage] */
- {"mww", HB_TAG('M','W','W',' ')}, /* Hmong Daw */
- {"my", HB_TAG('B','R','M',' ')}, /* Burmese */
- {"mym", HB_TAG('M','E','N',' ')}, /* Me'en */
- {"myn", HB_TAG('M','Y','N',' ')}, /* Mayan */
- {"myq", HB_TAG('M','N','K',' ')}, /* Forest Maninka (retired code) */
- {"myv", HB_TAG('E','R','Z',' ')}, /* Erzya */
- {"mzn", HB_TAG('M','Z','N',' ')}, /* Mazanderani */
- {"na", HB_TAG('N','A','U',' ')}, /* Nauru */
- {"nag", HB_TAG('N','A','G',' ')}, /* Naga-Assamese */
- {"nah", HB_TAG('N','A','H',' ')}, /* Nahuatl [family] */
- {"nap", HB_TAG('N','A','P',' ')}, /* Neapolitan */
- {"nb", HB_TAG('N','O','R',' ')}, /* Norwegian Bokmål */
- {"nco", HB_TAG('S','I','B',' ')}, /* Sibe */
- {"nd", HB_TAG('N','D','B',' ')}, /* [North] Ndebele */
- {"ndc", HB_TAG('N','D','C',' ')}, /* Ndau */
- {"nds", HB_TAG('N','D','S',' ')}, /* Low German/Low Saxon */
- {"ne", HB_TAG('N','E','P',' ')}, /* Nepali */
- {"new", HB_TAG('N','E','W',' ')}, /* Newari */
- {"ng", HB_TAG('N','D','G',' ')}, /* Ndonga */
- {"nga", HB_TAG('N','G','A',' ')}, /* Ngabaka */
- {"ngl", HB_TAG('L','M','W',' ')}, /* Lomwe */
- {"ngo", HB_TAG('S','X','T',' ')}, /* Sutu */
- {"niu", HB_TAG('N','I','U',' ')}, /* Niuean */
- {"niv", HB_TAG('G','I','L',' ')}, /* Gilyak */
- {"nl", HB_TAG('N','L','D',' ')}, /* Dutch */
- {"nn", HB_TAG('N','Y','N',' ')}, /* Norwegian Nynorsk */
- {"no", HB_TAG('N','O','R',' ')}, /* Norwegian [macrolanguage] */
- {"nod", HB_TAG('N','T','A',' ')}, /* Northern Thai */
- {"noe", HB_TAG('N','O','E',' ')}, /* Nimadi */
- {"nog", HB_TAG('N','O','G',' ')}, /* Nogai */
- {"nov", HB_TAG('N','O','V',' ')}, /* Novial */
- {"nqo", HB_TAG('N','K','O',' ')}, /* N'Ko */
- {"nr", HB_TAG('N','D','B',' ')}, /* [South] Ndebele */
- {"nsk", HB_TAG('N','A','S',' ')}, /* Naskapi */
- {"nso", HB_TAG('S','O','T',' ')}, /* [Northern] Sotho */
- {"nv", HB_TAG('N','A','V',' ')}, /* Navajo */
- {"ny", HB_TAG('C','H','I',' ')}, /* Chewa/Chichwa/Nyanja */
- {"nym", HB_TAG('N','Y','M',' ')}, /* Nyamwezi */
- {"nyn", HB_TAG('N','K','L',' ')}, /* Nyankole */
- {"oc", HB_TAG('O','C','I',' ')}, /* Occitan (post 1500) */
- {"oj", HB_TAG('O','J','B',' ')}, /* Ojibwa [macrolanguage] */
- {"ojs", HB_TAG('O','C','R',' ')}, /* Oji-Cree */
- {"okm", HB_TAG('K','O','H',' ')}, /* Korean Old Hangul */
- {"om", HB_TAG('O','R','O',' ')}, /* Oromo [macrolanguage] */
- {"or", HB_TAG('O','R','I',' ')}, /* Oriya */
- {"os", HB_TAG('O','S','S',' ')}, /* Ossetian */
- {"pa", HB_TAG('P','A','N',' ')}, /* Panjabi */
- {"pag", HB_TAG('P','A','G',' ')}, /* Pangasinan */
- {"pam", HB_TAG('P','A','M',' ')}, /* Kapampangan/Pampanga */
- {"pap", HB_TAG('P','A','P','0')}, /* Papiamento */
- {"pau", HB_TAG('P','A','U',' ')}, /* Palauan */
- {"pcc", HB_TAG('P','C','C',' ')}, /* Bouyei */
- {"pcd", HB_TAG('P','C','D',' ')}, /* Picard */
- {"pce", HB_TAG('P','L','G',' ')}, /* [Ruching] Palaung */
- {"pck", HB_TAG('Q','I','N',' ')}, /* Paite Chin */
- {"pdc", HB_TAG('P','D','C',' ')}, /* Pennsylvania German */
- {"pes", HB_TAG('F','A','R',' ')}, /* Iranian Persian */
- {"phk", HB_TAG('P','H','K',' ')}, /* Phake */
- {"pi", HB_TAG('P','A','L',' ')}, /* Pali */
- {"pih", HB_TAG('P','I','H',' ')}, /* Pitcairn-Norfolk */
- {"pl", HB_TAG('P','L','K',' ')}, /* Polish */
- {"pll", HB_TAG('P','L','G',' ')}, /* [Shwe] Palaung */
- {"plp", HB_TAG('P','A','P',' ')}, /* Palpa */
- {"pms", HB_TAG('P','M','S',' ')}, /* Piemontese */
- {"pnb", HB_TAG('P','N','B',' ')}, /* Western Panjabi */
- {"poh", HB_TAG('P','O','H',' ')}, /* Pocomchi */
- {"pon", HB_TAG('P','O','N',' ')}, /* Pohnpeian */
- {"prs", HB_TAG('D','R','I',' ')}, /* Afghan Persian/Dari */
- {"ps", HB_TAG('P','A','S',' ')}, /* Pashto/Pushto [macrolanguage] */
- {"pt", HB_TAG('P','T','G',' ')}, /* Portuguese */
- {"pwo", HB_TAG('P','W','O',' ')}, /* Pwo Western Karen */
- {"qu", HB_TAG('Q','U','Z',' ')}, /* Quechua [macrolanguage] */
- {"quc", HB_TAG('Q','U','C',' ')}, /* K'iche'/Quiché */
- {"quh", HB_TAG('Q','U','H',' ')}, /* Quechua (Bolivia) */
- {"quz", HB_TAG('Q','U','Z',' ')}, /* Cusco Quechua */
- {"qvi", HB_TAG('Q','V','I',' ')}, /* Quechua (Ecuador) */
- {"qwh", HB_TAG('Q','W','H',' ')}, /* Quechua (Peru) */
- {"raj", HB_TAG('R','A','J',' ')}, /* Rajasthani [macrolanguage] */
- {"rar", HB_TAG('R','A','R',' ')}, /* Rarotongan */
- {"rbb", HB_TAG('P','L','G',' ')}, /* Rumai Palaung */
- {"rej", HB_TAG('R','E','J',' ')}, /* Rejang */
- {"ria", HB_TAG('R','I','A',' ')}, /* Riang (India) */
- {"rif", HB_TAG('R','I','F',' ')}, /* Tarifit */
- {"ril", HB_TAG('R','I','A',' ')}, /* Riang (Myanmar) */
- {"rit", HB_TAG('R','I','T',' ')}, /* Ritarungo */
- {"rki", HB_TAG('A','R','K',' ')}, /* Rakhine */
- {"rkw", HB_TAG('R','K','W',' ')}, /* Arakwal */
- {"rm", HB_TAG('R','M','S',' ')}, /* Romansh */
- {"rmy", HB_TAG('R','M','Y',' ')}, /* Vlax Romani */
- {"rn", HB_TAG('R','U','N',' ')}, /* Rundi */
- {"ro", HB_TAG('R','O','M',' ')}, /* Romanian */
- {"rom", HB_TAG('R','O','Y',' ')}, /* Romany [macrolanguage] */
- {"rtm", HB_TAG('R','T','M',' ')}, /* Rotuman */
- {"ru", HB_TAG('R','U','S',' ')}, /* Russian */
- {"rue", HB_TAG('R','S','Y',' ')}, /* Rusyn */
- {"rup", HB_TAG('R','U','P',' ')}, /* Aromanian/Arumanian/Macedo-Romanian */
- {"rw", HB_TAG('R','U','A',' ')}, /* Kinyarwanda */
- {"rwr", HB_TAG('M','A','W',' ')}, /* Marwari (India) */
- {"sa", HB_TAG('S','A','N',' ')}, /* Sanskrit */
- {"sah", HB_TAG('Y','A','K',' ')}, /* Yakut */
- {"sam", HB_TAG('P','A','A',' ')}, /* Palestinian Aramaic */
- {"sas", HB_TAG('S','A','S',' ')}, /* Sasak */
- {"sat", HB_TAG('S','A','T',' ')}, /* Santali */
- {"sc", HB_TAG('S','R','D',' ')}, /* Sardinian [macrolanguage] */
- {"sck", HB_TAG('S','A','D',' ')}, /* Sadri */
- {"scn", HB_TAG('S','C','N',' ')}, /* Sicilian */
- {"sco", HB_TAG('S','C','O',' ')}, /* Scots */
- {"scs", HB_TAG('S','L','A',' ')}, /* [North] Slavey */
- {"sd", HB_TAG('S','N','D',' ')}, /* Sindhi */
- {"se", HB_TAG('N','S','M',' ')}, /* Northern Sami */
- {"seh", HB_TAG('S','N','A',' ')}, /* Sena */
- {"sel", HB_TAG('S','E','L',' ')}, /* Selkup */
- {"sez", HB_TAG('Q','I','N',' ')}, /* Senthang Chin */
- {"sg", HB_TAG('S','G','O',' ')}, /* Sango */
- {"sga", HB_TAG('S','G','A',' ')}, /* Old Irish (to 900) */
- {"sgs", HB_TAG('S','G','S',' ')}, /* Samogitian */
- {"sgw", HB_TAG('C','H','G',' ')}, /* Sebat Bet Gurage */
-/*{"sgw", HB_TAG('S','G','W',' ')},*/ /* Sebat Bet Gurage (in SIL fonts) */
- {"shi", HB_TAG('S','H','I',' ')}, /* Tachelhit */
- {"shn", HB_TAG('S','H','N',' ')}, /* Shan */
- {"si", HB_TAG('S','N','H',' ')}, /* Sinhala */
- {"sid", HB_TAG('S','I','D',' ')}, /* Sidamo */
- {"sjd", HB_TAG('K','S','M',' ')}, /* Kildin Sami */
- {"sk", HB_TAG('S','K','Y',' ')}, /* Slovak */
- {"skr", HB_TAG('S','R','K',' ')}, /* Seraiki */
- {"sl", HB_TAG('S','L','V',' ')}, /* Slovenian */
- {"sm", HB_TAG('S','M','O',' ')}, /* Samoan */
- {"sma", HB_TAG('S','S','M',' ')}, /* Southern Sami */
- {"smj", HB_TAG('L','S','M',' ')}, /* Lule Sami */
- {"smn", HB_TAG('I','S','M',' ')}, /* Inari Sami */
- {"sms", HB_TAG('S','K','S',' ')}, /* Skolt Sami */
- {"sn", HB_TAG('S','N','A','0')}, /* Shona */
- {"snk", HB_TAG('S','N','K',' ')}, /* Soninke */
- {"so", HB_TAG('S','M','L',' ')}, /* Somali */
- {"sop", HB_TAG('S','O','P',' ')}, /* Songe */
- {"sq", HB_TAG('S','Q','I',' ')}, /* Albanian [macrolanguage] */
- {"sr", HB_TAG('S','R','B',' ')}, /* Serbian */
- {"srr", HB_TAG('S','R','R',' ')}, /* Serer */
- {"ss", HB_TAG('S','W','Z',' ')}, /* Swati */
- {"st", HB_TAG('S','O','T',' ')}, /* [Southern] Sotho */
- {"stq", HB_TAG('S','T','Q',' ')}, /* Saterfriesisch */
- {"stv", HB_TAG('S','I','G',' ')}, /* Silt'e */
- {"su", HB_TAG('S','U','N',' ')}, /* Sundanese */
- {"suk", HB_TAG('S','U','K',' ')}, /* Sukama */
- {"suq", HB_TAG('S','U','R',' ')}, /* Suri */
- {"sv", HB_TAG('S','V','E',' ')}, /* Swedish */
- {"sva", HB_TAG('S','V','A',' ')}, /* Svan */
- {"sw", HB_TAG('S','W','K',' ')}, /* Swahili [macrolanguage] */
- {"swb", HB_TAG('C','M','R',' ')}, /* Comorian */
- {"swh", HB_TAG('S','W','K',' ')}, /* Kiswahili/Swahili */
- {"swv", HB_TAG('M','A','W',' ')}, /* Shekhawati */
- {"sxu", HB_TAG('S','X','U',' ')}, /* Upper Saxon */
- {"syc", HB_TAG('S','Y','R',' ')}, /* Classical Syriac */
- {"syl", HB_TAG('S','Y','L',' ')}, /* Sylheti */
- {"syr", HB_TAG('S','Y','R',' ')}, /* Syriac [macrolanguage] */
- {"szl", HB_TAG('S','Z','L',' ')}, /* Silesian */
- {"ta", HB_TAG('T','A','M',' ')}, /* Tamil */
- {"tab", HB_TAG('T','A','B',' ')}, /* Tabasaran */
- {"tcp", HB_TAG('Q','I','N',' ')}, /* Tawr Chin */
- {"tcy", HB_TAG('T','U','L',' ')}, /* Tulu */
- {"tcz", HB_TAG('Q','I','N',' ')}, /* Thado Chin */
- {"tdd", HB_TAG('T','D','D',' ')}, /* Tai Nüa */
- {"te", HB_TAG('T','E','L',' ')}, /* Telugu */
- {"tem", HB_TAG('T','M','N',' ')}, /* Temne */
- {"tet", HB_TAG('T','E','T',' ')}, /* Tetum */
- {"tg", HB_TAG('T','A','J',' ')}, /* Tajik */
- {"th", HB_TAG('T','H','A',' ')}, /* Thai */
- {"ti", HB_TAG('T','G','Y',' ')}, /* Tigrinya */
- {"tig", HB_TAG('T','G','R',' ')}, /* Tigre */
- {"tiv", HB_TAG('T','I','V',' ')}, /* Tiv */
- {"tk", HB_TAG('T','K','M',' ')}, /* Turkmen */
- {"tl", HB_TAG('T','G','L',' ')}, /* Tagalog */
- {"tmh", HB_TAG('T','M','H',' ')}, /* Tamashek */
- {"tn", HB_TAG('T','N','A',' ')}, /* Tswana */
- {"to", HB_TAG('T','G','N',' ')}, /* Tonga (Tonga Islands) */
- {"tod", HB_TAG('T','O','D','0')}, /* Toma */
- {"toi", HB_TAG('T','N','G',' ')}, /* Tonga */
- {"tpi", HB_TAG('T','P','I',' ')}, /* Tok Pisin */
- {"tr", HB_TAG('T','R','K',' ')}, /* Turkish */
- {"tru", HB_TAG('T','U','A',' ')}, /* Turoyo Aramaic */
- {"ts", HB_TAG('T','S','G',' ')}, /* Tsonga */
- {"tt", HB_TAG('T','A','T',' ')}, /* Tatar */
- {"tum", HB_TAG('T','U','M',' ')}, /* Tumbuka */
- {"tvl", HB_TAG('T','V','L',' ')}, /* Tuvalu */
- {"tw", HB_TAG('T','W','I',' ')}, /* Twi */
- {"ty", HB_TAG('T','H','T',' ')}, /* Tahitian */
- {"tyv", HB_TAG('T','U','V',' ')}, /* Tuvin */
- {"tyz", HB_TAG('T','Y','Z',' ')}, /* Tày */
- {"tzm", HB_TAG('T','Z','M',' ')}, /* Central Atlas Tamazight */
- {"tzo", HB_TAG('T','Z','O',' ')}, /* Tzotzil */
- {"udm", HB_TAG('U','D','M',' ')}, /* Udmurt */
- {"ug", HB_TAG('U','Y','G',' ')}, /* Uighur */
- {"uk", HB_TAG('U','K','R',' ')}, /* Ukrainian */
- {"umb", HB_TAG('U','M','B',' ')}, /* Umbundu */
- {"unr", HB_TAG('M','U','N',' ')}, /* Mundari */
- {"ur", HB_TAG('U','R','D',' ')}, /* Urdu */
- {"uz", HB_TAG('U','Z','B',' ')}, /* Uzbek [macrolanguage] */
- {"uzn", HB_TAG('U','Z','B',' ')}, /* Northern Uzbek */
- {"uzs", HB_TAG('U','Z','B',' ')}, /* Southern Uzbek */
- {"ve", HB_TAG('V','E','N',' ')}, /* Venda */
- {"vec", HB_TAG('V','E','C',' ')}, /* Venetian */
- {"vi", HB_TAG('V','I','T',' ')}, /* Vietnamese */
- {"vls", HB_TAG('F','L','E',' ')}, /* Vlaams */
- {"vmw", HB_TAG('M','A','K',' ')}, /* Makhuwa */
- {"vo", HB_TAG('V','O','L',' ')}, /* Volapük */
- {"vro", HB_TAG('V','R','O',' ')}, /* Võro */
- {"wa", HB_TAG('W','L','N',' ')}, /* Walloon */
- {"war", HB_TAG('W','A','R',' ')}, /* Waray (Philippines) */
- {"wbm", HB_TAG('W','A',' ',' ')}, /* Wa */
- {"wbr", HB_TAG('W','A','G',' ')}, /* Wagdi */
- {"wle", HB_TAG('S','I','G',' ')}, /* Wolane */
- {"wo", HB_TAG('W','L','F',' ')}, /* Wolof */
- {"wry", HB_TAG('M','A','W',' ')}, /* Merwari */
- {"wtm", HB_TAG('W','T','M',' ')}, /* Mewati */
- {"xal", HB_TAG('K','L','M',' ')}, /* Kalmyk */
- {"xan", HB_TAG('S','E','K',' ')}, /* Sekota */
- {"xh", HB_TAG('X','H','S',' ')}, /* Xhosa */
- {"xjb", HB_TAG('X','J','B',' ')}, /* Minjangbal */
- {"xog", HB_TAG('X','O','G',' ')}, /* Soga */
- {"xom", HB_TAG('K','M','O',' ')}, /* Komo (Sudan) */
- {"xpe", HB_TAG('X','P','E',' ')}, /* Kpelle (Liberia) */
- {"xsl", HB_TAG('S','S','L',' ')}, /* South Slavey */
- {"xst", HB_TAG('S','I','G',' ')}, /* Silt'e (retired code) */
- {"xwo", HB_TAG('T','O','D',' ')}, /* Written Oirat (Todo) */
- {"yao", HB_TAG('Y','A','O',' ')}, /* Yao */
- {"yap", HB_TAG('Y','A','P',' ')}, /* Yapese */
- {"yi", HB_TAG('J','I','I',' ')}, /* Yiddish [macrolanguage] */
- {"yo", HB_TAG('Y','B','A',' ')}, /* Yoruba */
- {"yos", HB_TAG('Q','I','N',' ')}, /* Yos, deprecated by IANA in favor of Zou [zom] */
- {"yso", HB_TAG('N','I','S',' ')}, /* Nisi (China) */
- {"za", HB_TAG('Z','H','A',' ')}, /* Chuang/Zhuang [macrolanguage] */
- {"zea", HB_TAG('Z','E','A',' ')}, /* Zeeuws */
- {"zgh", HB_TAG('Z','G','H',' ')}, /* Standard Morrocan Tamazigh */
- {"zne", HB_TAG('Z','N','D',' ')}, /* Zande */
- {"zom", HB_TAG('Q','I','N',' ')}, /* Zou */
- {"zu", HB_TAG('Z','U','L',' ')}, /* Zulu */
- {"zum", HB_TAG('L','R','C',' ')}, /* Kumzari */
- {"zza", HB_TAG('Z','Z','A',' ')}, /* Zazaki */
-
- /* The corresponding languages IDs for the following IDs are unclear,
- * overlap, or are architecturally weird. Needs more research. */
-
-/*{"chp", HB_TAG('S','A','Y',' ')},*/ /* Sayisi */
-/*{"cwd", HB_TAG('T','C','R',' ')},*/ /* TH-Cree */
-/*{"emk", HB_TAG('E','M','K',' ')},*/ /* Eastern Maninkakan */
-/*{"krc", HB_TAG('B','A','L',' ')},*/ /* Balkar */
-/*{"??", HB_TAG('B','C','R',' ')},*/ /* Bible Cree */
-/*{"zh?", HB_TAG('C','H','N',' ')},*/ /* Chinese (seen in Microsoft fonts) */
-/*{"ar-Syrc?", HB_TAG('G','A','R',' ')},*/ /* Garshuni */
-/*{"hy?", HB_TAG('H','Y','E','0')},*/ /* Armenian East (ISO 639-3 hye according to Microsoft, but that’s equivalent to ISO 639-1 hy) */
-/*{"ga-Latg?/" HB_TAG('I','R','T',' ')},*/ /* Irish Traditional */
-/*{"krc", HB_TAG('K','A','R',' ')},*/ /* Karachay */
-/*{"ka-Geok?", HB_TAG('K','G','E',' ')},*/ /* Khutsuri Georgian */
-/*{"kca", HB_TAG('K','H','K',' ')},*/ /* Khanty-Kazim */
-/*{"kca", HB_TAG('K','H','S',' ')},*/ /* Khanty-Shurishkar */
-/*{"kca", HB_TAG('K','H','V',' ')},*/ /* Khanty-Vakhi */
-/*{"kqs, kss", HB_TAG('K','I','S',' ')},*/ /* Kisii */
-/*{"lua", HB_TAG('L','U','A',' ')},*/ /* Luba-Lulua */
-/*{"mlq", HB_TAG('M','L','N',' ')},*/ /* Malinke */
-/*{"nso", HB_TAG('N','S','O',' ')},*/ /* Sotho, Northern */
-/*{"??", HB_TAG('M','A','L',' ')},*/ /* Malayalam Traditional */
-/*{"csw", HB_TAG('N','C','R',' ')},*/ /* N-Cree */
-/*{"csw", HB_TAG('N','H','C',' ')},*/ /* Norway House Cree */
-/*{"el-polyton", HB_TAG('P','G','R',' ')},*/ /* Polytonic Greek */
-/*{"bgr, cnh, cnw, czt, sez, tcp, csy, ctd, flm, pck, tcz, zom, cmr, dao, hlt, cka, cnk, mrh, mwg, cbl, cnb, csh", HB_TAG('Q','I','N',' ')},*/ /* Chin */
-/*{"??", HB_TAG('Y','I','C',' ')},*/ /* Yi Classic */
-/*{"zh-Latn-pinyin", HB_TAG('Z','H','P',' ')},*/ /* Chinese Phonetic */
-};
-
-typedef struct {
- char language[11];
- hb_tag_t tag;
-} LangTagLong;
-static const LangTagLong ot_languages_zh[] = {
- /* Store longest-first, if one is a prefix of another. */
- {"zh-cn", HB_TAG('Z','H','S',' ')}, /* Chinese (China) */
- {"zh-hk", HB_TAG('Z','H','H',' ')}, /* Chinese (Hong Kong) */
- {"zh-mo", HB_TAG('Z','H','H',' ')}, /* Chinese (Macao) */
- {"zh-sg", HB_TAG('Z','H','S',' ')}, /* Chinese (Singapore) */
- {"zh-tw", HB_TAG('Z','H','T',' ')}, /* Chinese (Taiwan) */
- {"zh-hans", HB_TAG('Z','H','S',' ')}, /* Chinese (Simplified) */
- {"zh-hant-hk",HB_TAG('Z','H','H',' ')}, /* Chinese (Hong Kong) */
- {"zh-hant-mo",HB_TAG('Z','H','H',' ')}, /* Chinese (Macao) */
- {"zh-hant", HB_TAG('Z','H','T',' ')}, /* Chinese (Traditional) */
-};
-
-static int
-lang_compare_first_component (const void *pa,
- const void *pb)
+static bool
+subtag_matches (const char *lang_str,
+ const char *limit,
+ const char *subtag)
{
- const char *a = (const char *) pa;
- const char *b = (const char *) pb;
- unsigned int da, db;
- const char *p;
-
- p = strchr (a, '-');
- da = p ? (unsigned int) (p - a) : strlen (a);
-
- p = strchr (b, '-');
- db = p ? (unsigned int) (p - b) : strlen (b);
-
- return strncmp (a, b, MAX (da, db));
+ do {
+ const char *s = strstr (lang_str, subtag);
+ if (!s || s >= limit)
+ return false;
+ if (!ISALNUM (s[strlen (subtag)]))
+ return true;
+ lang_str = s + strlen (subtag);
+ } while (true);
}
static hb_bool_t
@@ -905,112 +201,216 @@ lang_matches (const char *lang_str, const char *spec)
(lang_str[len] == '\0' || lang_str[len] == '-');
}
+struct LangTag
+{
+ char language[4];
+ hb_tag_t tag;
+
+ int cmp (const char *a) const
+ {
+ const char *b = this->language;
+ unsigned int da, db;
+ const char *p;
+
+ p = strchr (a, '-');
+ da = p ? (unsigned int) (p - a) : strlen (a);
+
+ p = strchr (b, '-');
+ db = p ? (unsigned int) (p - b) : strlen (b);
+
+ return strncmp (a, b, hb_max (da, db));
+ }
+ int cmp (const LangTag *that) const
+ { return cmp (that->language); }
+};
+
+#include "hb-ot-tag-table.hh"
+
+/* The corresponding languages IDs for the following IDs are unclear,
+ * overlap, or are architecturally weird. Needs more research. */
+
+/*{"??", {HB_TAG('B','C','R',' ')}},*/ /* Bible Cree */
+/*{"zh?", {HB_TAG('C','H','N',' ')}},*/ /* Chinese (seen in Microsoft fonts) */
+/*{"ar-Syrc?", {HB_TAG('G','A','R',' ')}},*/ /* Garshuni */
+/*{"??", {HB_TAG('N','G','R',' ')}},*/ /* Nagari */
+/*{"??", {HB_TAG('Y','I','C',' ')}},*/ /* Yi Classic */
+/*{"zh?", {HB_TAG('Z','H','P',' ')}},*/ /* Chinese Phonetic */
+
+#ifndef HB_DISABLE_DEPRECATED
hb_tag_t
hb_ot_tag_from_language (hb_language_t language)
{
- const char *lang_str, *s;
+ unsigned int count = 1;
+ hb_tag_t tags[1];
+ hb_ot_tags_from_script_and_language (HB_SCRIPT_UNKNOWN, language, nullptr, nullptr, &count, tags);
+ return count > 0 ? tags[0] : HB_OT_TAG_DEFAULT_LANGUAGE;
+}
+#endif
- if (language == HB_LANGUAGE_INVALID)
- return HB_OT_TAG_DEFAULT_LANGUAGE;
-
- lang_str = hb_language_to_string (language);
-
- s = strstr (lang_str, "x-hbot");
- if (s) {
- char tag[4];
- int i;
- s += 6;
- for (i = 0; i < 4 && ISALNUM (s[i]); i++)
- tag[i] = TOUPPER (s[i]);
- if (i) {
- for (; i < 4; i++)
- tag[i] = ' ';
- return HB_TAG (tag[0], tag[1], tag[2], tag[3]);
+static void
+hb_ot_tags_from_language (const char *lang_str,
+ const char *limit,
+ unsigned int *count,
+ hb_tag_t *tags)
+{
+ const char *s;
+ unsigned int tag_idx;
+
+ /* Check for matches of multiple subtags. */
+ if (hb_ot_tags_from_complex_language (lang_str, limit, count, tags))
+ return;
+
+ /* Find a language matching in the first component. */
+ s = strchr (lang_str, '-');
+ {
+ if (s && limit - lang_str >= 6)
+ {
+ const char *extlang_end = strchr (s + 1, '-');
+ /* If there is an extended language tag, use it. */
+ if (3 == (extlang_end ? extlang_end - s - 1 : strlen (s + 1)) &&
+ ISALPHA (s[1]))
+ lang_str = s + 1;
+ }
+ if (hb_sorted_array (ot_languages).bfind (lang_str, &tag_idx))
+ {
+ unsigned int i;
+ while (tag_idx != 0 &&
+ 0 == strcmp (ot_languages[tag_idx].language, ot_languages[tag_idx - 1].language))
+ tag_idx--;
+ for (i = 0;
+ i < *count &&
+ tag_idx + i < ARRAY_LENGTH (ot_languages) &&
+ 0 == strcmp (ot_languages[tag_idx + i].language, ot_languages[tag_idx].language);
+ i++)
+ tags[i] = ot_languages[tag_idx + i].tag;
+ *count = i;
+ return;
}
}
- /*
- * "fonipa" is a variant tag in BCP-47, meaning the International Phonetic Alphabet.
- * It can be applied to any language.
- */
- if (strstr (lang_str, "-fonipa")) {
- return HB_TAG('I','P','P','H'); /* Phonetic transcription—IPA conventions */
+ if (!s)
+ s = lang_str + strlen (lang_str);
+ if (s - lang_str == 3) {
+ /* Assume it's ISO-639-3 and upper-case and use it. */
+ tags[0] = hb_tag_from_string (lang_str, s - lang_str) & ~0x20202000u;
+ *count = 1;
+ return;
}
- /*
- * "fonnapa" is a variant tag in BCP-47, meaning the North American Phonetic Alphabet
- * also known as Americanist Phonetic Notation. It can be applied to any language.
- */
- if (strstr (lang_str, "-fonnapa")) {
- return HB_TAG('A','P','P','H'); /* Phonetic transcription—Americanist conventions */
- }
+ *count = 0;
+}
- /*
- * "Syre" is a BCP-47 script tag, meaning the Estrangela variant of the Syriac script.
- * It can be applied to any language.
- */
- if (strstr (lang_str, "-syre")) {
- return HB_TAG('S','Y','R','E'); /* Estrangela Syriac */
- }
+static bool
+parse_private_use_subtag (const char *private_use_subtag,
+ unsigned int *count,
+ hb_tag_t *tags,
+ const char *prefix,
+ unsigned char (*normalize) (unsigned char))
+{
+#ifdef HB_NO_LANGUAGE_PRIVATE_SUBTAG
+ return false;
+#endif
- /*
- * "Syrj" is a BCP-47 script tag, meaning the Western variant of the Syriac script.
- * It can be applied to any language.
- */
- if (strstr (lang_str, "-syrj")) {
- return HB_TAG('S','Y','R','J'); /* Western Syriac */
- }
+ if (!(private_use_subtag && count && tags && *count)) return false;
+
+ const char *s = strstr (private_use_subtag, prefix);
+ if (!s) return false;
+
+ char tag[4];
+ int i;
+ s += strlen (prefix);
+ for (i = 0; i < 4 && ISALNUM (s[i]); i++)
+ tag[i] = normalize (s[i]);
+ if (!i) return false;
+
+ for (; i < 4; i++)
+ tag[i] = ' ';
+ tags[0] = HB_TAG (tag[0], tag[1], tag[2], tag[3]);
+ if ((tags[0] & 0xDFDFDFDF) == HB_OT_TAG_DEFAULT_SCRIPT)
+ tags[0] ^= ~0xDFDFDFDF;
+ *count = 1;
+ return true;
+}
- /*
- * "Syrn" is a BCP-47 script tag, meaning the Eastern variant of the Syriac script.
- * It can be applied to any language.
- */
- if (strstr (lang_str, "-syrn")) {
- return HB_TAG('S','Y','R','N'); /* Eastern Syriac */
- }
+/**
+ * hb_ot_tags_from_script_and_language:
+ * @script: an #hb_script_t to convert.
+ * @language: an #hb_language_t to convert.
+ * @script_count: (allow-none): maximum number of script tags to retrieve (IN)
+ * and actual number of script tags retrieved (OUT)
+ * @script_tags: (out) (allow-none): array of size at least @script_count to store the
+ * script tag results
+ * @language_count: (allow-none): maximum number of language tags to retrieve
+ * (IN) and actual number of language tags retrieved (OUT)
+ * @language_tags: (out) (allow-none): array of size at least @language_count to store
+ * the language tag results
+ *
+ * Converts an #hb_script_t and an #hb_language_t to script and language tags.
+ *
+ * Since: 2.0.0
+ **/
+void
+hb_ot_tags_from_script_and_language (hb_script_t script,
+ hb_language_t language,
+ unsigned int *script_count /* IN/OUT */,
+ hb_tag_t *script_tags /* OUT */,
+ unsigned int *language_count /* IN/OUT */,
+ hb_tag_t *language_tags /* OUT */)
+{
+ bool needs_script = true;
- /* Find a language matching in the first component */
+ if (language == HB_LANGUAGE_INVALID)
{
- const LangTag *lang_tag;
- lang_tag = (LangTag *) bsearch (lang_str, ot_languages,
- ARRAY_LENGTH (ot_languages), sizeof (LangTag),
- lang_compare_first_component);
- if (lang_tag)
- return lang_tag->tag;
+ if (language_count && language_tags && *language_count)
+ *language_count = 0;
}
-
- /* Otherwise, check the Chinese ones */
- if (0 == lang_compare_first_component (lang_str, "zh"))
+ else
{
- unsigned int i;
+ const char *lang_str, *s, *limit, *private_use_subtag;
+ bool needs_language;
- for (i = 0; i < ARRAY_LENGTH (ot_languages_zh); i++)
+ lang_str = hb_language_to_string (language);
+ limit = nullptr;
+ private_use_subtag = nullptr;
+ if (lang_str[0] == 'x' && lang_str[1] == '-')
{
- const LangTagLong *lang_tag;
- lang_tag = &ot_languages_zh[i];
- if (lang_matches (lang_str, lang_tag->language))
- return lang_tag->tag;
+ private_use_subtag = lang_str;
+ } else {
+ for (s = lang_str + 1; *s; s++)
+ {
+ if (s[-1] == '-' && s[1] == '-')
+ {
+ if (s[0] == 'x')
+ {
+ private_use_subtag = s;
+ if (!limit)
+ limit = s - 1;
+ break;
+ } else if (!limit)
+ {
+ limit = s - 1;
+ }
+ }
+ }
+ if (!limit)
+ limit = s;
}
- /* Otherwise just return 'ZHS ' */
- return HB_TAG('Z','H','S',' ');
- }
+ needs_script = !parse_private_use_subtag (private_use_subtag, script_count, script_tags, "-hbsc", TOLOWER);
+ needs_language = !parse_private_use_subtag (private_use_subtag, language_count, language_tags, "-hbot", TOUPPER);
- s = strchr (lang_str, '-');
- if (!s)
- s = lang_str + strlen (lang_str);
- if (s - lang_str == 3) {
- /* Assume it's ISO-639-3 and upper-case and use it. */
- return hb_tag_from_string (lang_str, s - lang_str) & ~0x20202000u;
+ if (needs_language && language_count && language_tags && *language_count)
+ hb_ot_tags_from_language (lang_str, limit, language_count, language_tags);
}
- return HB_OT_TAG_DEFAULT_LANGUAGE;
+ if (needs_script && script_count && script_tags && *script_count)
+ hb_ot_all_tags_from_script (script, script_count, script_tags);
}
/**
* hb_ot_tag_to_language:
*
- *
+ *
*
* Return value: (transfer none):
*
@@ -1024,58 +424,116 @@ hb_ot_tag_to_language (hb_tag_t tag)
if (tag == HB_OT_TAG_DEFAULT_LANGUAGE)
return nullptr;
- /* struct LangTag has only room for 3-letter language tags. */
- switch (tag) {
- case HB_TAG('A','P','P','H'): /* Phonetic transcription—Americanist conventions */
- return hb_language_from_string ("und-fonnapa", -1);
- case HB_TAG('I','P','P','H'): /* Phonetic transcription—IPA conventions */
- return hb_language_from_string ("und-fonipa", -1);
- case HB_TAG('S','Y','R',' '): /* Syriac [macrolanguage] */
- return hb_language_from_string ("syr", -1);
- case HB_TAG('S','Y','R','E'): /* Estrangela Syriac */
- return hb_language_from_string ("und-Syre", -1);
- case HB_TAG('S','Y','R','J'): /* Western Syriac */
- return hb_language_from_string ("und-Syrj", -1);
- case HB_TAG('S','Y','R','N'): /* Eastern Syriac */
- return hb_language_from_string ("und-Syrn", -1);
+ {
+ hb_language_t disambiguated_tag = hb_ot_ambiguous_tag_to_language (tag);
+ if (disambiguated_tag != HB_LANGUAGE_INVALID)
+ return disambiguated_tag;
}
for (i = 0; i < ARRAY_LENGTH (ot_languages); i++)
if (ot_languages[i].tag == tag)
return hb_language_from_string (ot_languages[i].language, -1);
- /* If tag starts with ZH, it's Chinese */
- if ((tag & 0xFFFF0000u) == 0x5A480000u) {
- switch (tag) {
- case HB_TAG('Z','H','H',' '): return hb_language_from_string ("zh-hk", -1); /* Hong Kong */
- case HB_TAG('Z','H','S',' '): return hb_language_from_string ("zh-Hans", -1); /* Simplified */
- case HB_TAG('Z','H','T',' '): return hb_language_from_string ("zh-Hant", -1); /* Traditional */
- default: break; /* Fall through */
- }
- }
-
- /* Else return a custom language in the form of "x-hbotABCD" */
+ /* If it's three letters long, assume it's ISO 639-3 and lower-case and use it
+ * (if it's not a registered tag, calling hb_ot_tag_from_language on the
+ * result might not return the same tag as the original tag).
+ * Else return a custom language in the form of "x-hbotABCD". */
{
- unsigned char buf[11] = "x-hbot";
+ char buf[11] = "x-hbot";
+ char *str = buf;
buf[6] = tag >> 24;
buf[7] = (tag >> 16) & 0xFF;
buf[8] = (tag >> 8) & 0xFF;
buf[9] = tag & 0xFF;
if (buf[9] == 0x20)
+ {
buf[9] = '\0';
+ if (ISALPHA (buf[6]) && ISALPHA (buf[7]) && ISALPHA (buf[8]))
+ {
+ buf[6] = TOLOWER (buf[6]);
+ buf[7] = TOLOWER (buf[7]);
+ buf[8] = TOLOWER (buf[8]);
+ str += 6;
+ }
+ }
buf[10] = '\0';
- return hb_language_from_string ((char *) buf, -1);
+ return hb_language_from_string (str, -1);
+ }
+}
+
+/**
+ * hb_ot_tags_to_script_and_language:
+ * @script_tag: a script tag
+ * @language_tag: a language tag
+ * @script: (allow-none): the #hb_script_t corresponding to @script_tag (OUT).
+ * @language: (allow-none): the #hb_language_t corresponding to @script_tag and
+ * @language_tag (OUT).
+ *
+ * Converts a script tag and a language tag to an #hb_script_t and an
+ * #hb_language_t.
+ *
+ * Since: 2.0.0
+ **/
+void
+hb_ot_tags_to_script_and_language (hb_tag_t script_tag,
+ hb_tag_t language_tag,
+ hb_script_t *script /* OUT */,
+ hb_language_t *language /* OUT */)
+{
+ hb_script_t script_out = hb_ot_tag_to_script (script_tag);
+ if (script)
+ *script = script_out;
+ if (language)
+ {
+ unsigned int script_count = 1;
+ hb_tag_t primary_script_tag[1];
+ hb_ot_tags_from_script_and_language (script_out,
+ HB_LANGUAGE_INVALID,
+ &script_count,
+ primary_script_tag,
+ nullptr, nullptr);
+ *language = hb_ot_tag_to_language (language_tag);
+ if (script_count == 0 || primary_script_tag[0] != script_tag)
+ {
+ unsigned char *buf;
+ const char *lang_str = hb_language_to_string (*language);
+ size_t len = strlen (lang_str);
+ buf = (unsigned char *) malloc (len + 11);
+ if (unlikely (!buf))
+ {
+ *language = nullptr;
+ }
+ else
+ {
+ memcpy (buf, lang_str, len);
+ if (lang_str[0] != 'x' || lang_str[1] != '-') {
+ buf[len++] = '-';
+ buf[len++] = 'x';
+ }
+ buf[len++] = '-';
+ buf[len++] = 'h';
+ buf[len++] = 'b';
+ buf[len++] = 's';
+ buf[len++] = 'c';
+ buf[len++] = script_tag >> 24;
+ buf[len++] = (script_tag >> 16) & 0xFF;
+ buf[len++] = (script_tag >> 8) & 0xFF;
+ buf[len++] = script_tag & 0xFF;
+ *language = hb_language_from_string ((char *) buf, len);
+ free (buf);
+ }
+ }
}
}
#ifdef MAIN
static inline void
-test_langs_sorted (void)
+test_langs_sorted ()
{
for (unsigned int i = 1; i < ARRAY_LENGTH (ot_languages); i++)
{
- int c = lang_compare_first_component (ot_languages[i-1].language, ot_languages[i].language);
- if (c >= 0)
+ int c = ot_languages[i].cmp (&ot_languages[i - 1]);
+ if (c > 0)
{
fprintf (stderr, "ot_languages not sorted at index %d: %s %d %s\n",
i, ot_languages[i-1].language, c, ot_languages[i].language);
@@ -1085,10 +543,13 @@ test_langs_sorted (void)
}
int
-main (void)
+main ()
{
test_langs_sorted ();
return 0;
}
#endif
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-tag.h b/src/3rdparty/harfbuzz-ng/src/hb-ot-tag.h
deleted file mode 100644
index 54fb747f58..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-tag.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_H_IN
-#error "Include <hb-ot.h> instead."
-#endif
-
-#ifndef HB_OT_TAG_H
-#define HB_OT_TAG_H
-
-#include "hb.h"
-
-HB_BEGIN_DECLS
-
-
-#define HB_OT_TAG_DEFAULT_SCRIPT HB_TAG ('D', 'F', 'L', 'T')
-#define HB_OT_TAG_DEFAULT_LANGUAGE HB_TAG ('d', 'f', 'l', 't')
-
-HB_EXTERN void
-hb_ot_tags_from_script (hb_script_t script,
- hb_tag_t *script_tag_1,
- hb_tag_t *script_tag_2);
-
-HB_EXTERN hb_script_t
-hb_ot_tag_to_script (hb_tag_t tag);
-
-HB_EXTERN hb_tag_t
-hb_ot_tag_from_language (hb_language_t language);
-
-HB_EXTERN hb_language_t
-hb_ot_tag_to_language (hb_tag_t tag);
-
-
-HB_END_DECLS
-
-#endif /* HB_OT_TAG_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-var-avar-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-var-avar-table.hh
index 4b88a40304..ef8ba3f5a2 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-var-avar-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-var-avar-table.hh
@@ -27,23 +27,32 @@
#ifndef HB_OT_VAR_AVAR_TABLE_HH
#define HB_OT_VAR_AVAR_TABLE_HH
-#include "hb-open-type-private.hh"
+#include "hb-open-type.hh"
+
+/*
+ * avar -- Axis Variations
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/avar
+ */
+
+#define HB_OT_TAG_avar HB_TAG('a','v','a','r')
+
namespace OT {
struct AxisValueMap
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
}
public:
- F2DOT14 fromCoord; /* A normalized coordinate value obtained using
- * default normalization. */
- F2DOT14 toCoord; /* The modified, normalized coordinate value. */
+ F2DOT14 coords[2];
+// F2DOT14 fromCoord; /* A normalized coordinate value obtained using
+// * default normalization. */
+// F2DOT14 toCoord; /* The modified, normalized coordinate value. */
public:
DEFINE_SIZE_STATIC (4);
@@ -51,54 +60,54 @@ struct AxisValueMap
struct SegmentMaps : ArrayOf<AxisValueMap>
{
- inline int map (int value) const
+ int map (int value, unsigned int from_offset = 0, unsigned int to_offset = 1) const
{
+#define fromCoord coords[from_offset]
+#define toCoord coords[to_offset]
/* The following special-cases are not part of OpenType, which requires
* that at least -1, 0, and +1 must be mapped. But we include these as
* part of a better error recovery scheme. */
-
if (len < 2)
{
if (!len)
return value;
else /* len == 1*/
- return value - array[0].fromCoord + array[0].toCoord;
+ return value - arrayZ[0].fromCoord + arrayZ[0].toCoord;
}
- if (value <= array[0].fromCoord)
- return value - array[0].fromCoord + array[0].toCoord;
+ if (value <= arrayZ[0].fromCoord)
+ return value - arrayZ[0].fromCoord + arrayZ[0].toCoord;
unsigned int i;
unsigned int count = len;
- for (i = 1; i < count && value > array[i].fromCoord; i++)
+ for (i = 1; i < count && value > arrayZ[i].fromCoord; i++)
;
- if (value >= array[i].fromCoord)
- return value - array[i].fromCoord + array[i].toCoord;
+ if (value >= arrayZ[i].fromCoord)
+ return value - arrayZ[i].fromCoord + arrayZ[i].toCoord;
- if (unlikely (array[i-1].fromCoord == array[i].fromCoord))
- return array[i-1].toCoord;
+ if (unlikely (arrayZ[i-1].fromCoord == arrayZ[i].fromCoord))
+ return arrayZ[i-1].toCoord;
- int denom = array[i].fromCoord - array[i-1].fromCoord;
- return array[i-1].toCoord +
- ((array[i].toCoord - array[i-1].toCoord) *
- (value - array[i-1].fromCoord) + denom/2) / denom;
+ int denom = arrayZ[i].fromCoord - arrayZ[i-1].fromCoord;
+ return arrayZ[i-1].toCoord +
+ ((arrayZ[i].toCoord - arrayZ[i-1].toCoord) *
+ (value - arrayZ[i-1].fromCoord) + denom/2) / denom;
+#undef toCoord
+#undef fromCoord
}
- DEFINE_SIZE_ARRAY (2, array);
-};
-
-/*
- * avar — Axis Variations Table
- */
+ int unmap (int value) const { return map (value, 1, 0); }
-#define HB_OT_TAG_avar HB_TAG('a','v','a','r')
+ public:
+ DEFINE_SIZE_ARRAY (2, *this);
+};
struct avar
{
- static const hb_tag_t tableTag = HB_OT_TAG_avar;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_avar;
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
if (unlikely (!(version.sanitize (c) &&
@@ -106,23 +115,23 @@ struct avar
c->check_struct (this))))
return_trace (false);
- const SegmentMaps *map = &axisSegmentMapsZ;
+ const SegmentMaps *map = &firstAxisSegmentMaps;
unsigned int count = axisCount;
for (unsigned int i = 0; i < count; i++)
{
if (unlikely (!map->sanitize (c)))
- return_trace (false);
+ return_trace (false);
map = &StructAfter<SegmentMaps> (*map);
}
return_trace (true);
}
- inline void map_coords (int *coords, unsigned int coords_length) const
+ void map_coords (int *coords, unsigned int coords_length) const
{
- unsigned int count = MIN<unsigned int> (coords_length, axisCount);
+ unsigned int count = hb_min (coords_length, axisCount);
- const SegmentMaps *map = &axisSegmentMapsZ;
+ const SegmentMaps *map = &firstAxisSegmentMaps;
for (unsigned int i = 0; i < count; i++)
{
coords[i] = map->map (coords[i]);
@@ -130,14 +139,26 @@ struct avar
}
}
+ void unmap_coords (int *coords, unsigned int coords_length) const
+ {
+ unsigned int count = hb_min (coords_length, axisCount);
+
+ const SegmentMaps *map = &firstAxisSegmentMaps;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ coords[i] = map->unmap (coords[i]);
+ map = &StructAfter<SegmentMaps> (*map);
+ }
+ }
+
protected:
FixedVersion<>version; /* Version of the avar table
* initially set to 0x00010000u */
- UINT16 reserved; /* This field is permanently reserved. Set to 0. */
- UINT16 axisCount; /* The number of variation axes in the font. This
+ HBUINT16 reserved; /* This field is permanently reserved. Set to 0. */
+ HBUINT16 axisCount; /* The number of variation axes in the font. This
* must be the same number as axisCount in the
* 'fvar' table. */
- SegmentMaps axisSegmentMapsZ;
+ SegmentMaps firstAxisSegmentMaps;
public:
DEFINE_SIZE_MIN (8);
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-var-fvar-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-var-fvar-table.hh
index 2a9357a5e2..7ce3123819 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-var-fvar-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-var-fvar-table.hh
@@ -27,36 +27,55 @@
#ifndef HB_OT_VAR_FVAR_TABLE_HH
#define HB_OT_VAR_FVAR_TABLE_HH
-#include "hb-open-type-private.hh"
+#include "hb-open-type.hh"
+
+/*
+ * fvar -- Font Variations
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/fvar
+ */
+
+#define HB_OT_TAG_fvar HB_TAG('f','v','a','r')
+
namespace OT {
struct InstanceRecord
{
- inline bool sanitize (hb_sanitize_context_t *c, unsigned int axis_count) const
+ friend struct fvar;
+
+ hb_array_t<const HBFixed> get_coordinates (unsigned int axis_count) const
+ { return coordinatesZ.as_array (axis_count); }
+
+ bool sanitize (hb_sanitize_context_t *c, unsigned int axis_count) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
- c->check_array (coordinates, coordinates[0].static_size, axis_count));
+ c->check_array (coordinatesZ.arrayZ, axis_count));
}
protected:
- UINT16 subfamilyNameID;/* The name ID for entries in the 'name' table
+ NameID subfamilyNameID;/* The name ID for entries in the 'name' table
* that provide subfamily names for this instance. */
- UINT16 reserved; /* Reserved for future use — set to 0. */
- Fixed coordinates[VAR];/* The coordinates array for this instance. */
- //UINT16 postScriptNameIDX;/*Optional. The name ID for entries in the 'name'
+ HBUINT16 flags; /* Reserved for future use — set to 0. */
+ UnsizedArrayOf<HBFixed>
+ coordinatesZ; /* The coordinates array for this instance. */
+ //NameID postScriptNameIDX;/*Optional. The name ID for entries in the 'name'
// * table that provide PostScript names for this
// * instance. */
public:
- DEFINE_SIZE_ARRAY (4, coordinates);
+ DEFINE_SIZE_UNBOUNDED (4);
};
struct AxisRecord
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ enum
+ {
+ AXIS_FLAG_HIDDEN = 0x0001,
+ };
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
@@ -64,108 +83,153 @@ struct AxisRecord
public:
Tag axisTag; /* Tag identifying the design variation for the axis. */
- Fixed minValue; /* The minimum coordinate value for the axis. */
- Fixed defaultValue; /* The default coordinate value for the axis. */
- Fixed maxValue; /* The maximum coordinate value for the axis. */
- UINT16 reserved; /* Reserved for future use — set to 0. */
- UINT16 axisNameID; /* The name ID for entries in the 'name' table that
+ HBFixed minValue; /* The minimum coordinate value for the axis. */
+ HBFixed defaultValue; /* The default coordinate value for the axis. */
+ HBFixed maxValue; /* The maximum coordinate value for the axis. */
+ HBUINT16 flags; /* Axis flags. */
+ NameID axisNameID; /* The name ID for entries in the 'name' table that
* provide a display name for this axis. */
public:
DEFINE_SIZE_STATIC (20);
};
-
-/*
- * fvar — Font Variations Table
- */
-
-#define HB_OT_TAG_fvar HB_TAG('f','v','a','r')
-
struct fvar
{
- static const hb_tag_t tableTag = HB_OT_TAG_fvar;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_fvar;
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool has_data () const { return version.to_int (); }
+
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (version.sanitize (c) &&
likely (version.major == 1) &&
c->check_struct (this) &&
+ axisSize == 20 && /* Assumed in our code. */
instanceSize >= axisCount * 4 + 4 &&
- axisSize <= 1024 && /* Arbitrary, just to simplify overflow checks. */
- instanceSize <= 1024 && /* Arbitrary, just to simplify overflow checks. */
- c->check_range (this, things) &&
- c->check_range (&StructAtOffset<char> (this, things),
- axisCount * axisSize + instanceCount * instanceSize));
+ get_axes ().sanitize (c) &&
+ c->check_range (get_instance (0), instanceCount, instanceSize));
}
- inline unsigned int get_axis_count (void) const
- { return axisCount; }
+ unsigned int get_axis_count () const { return axisCount; }
+
+#ifndef HB_DISABLE_DEPRECATED
+ void get_axis_deprecated (unsigned int axis_index,
+ hb_ot_var_axis_t *info) const
+ {
+ const AxisRecord &axis = get_axes ()[axis_index];
+ info->tag = axis.axisTag;
+ info->name_id = axis.axisNameID;
+ info->default_value = axis.defaultValue / 65536.f;
+ /* Ensure order, to simplify client math. */
+ info->min_value = hb_min (info->default_value, axis.minValue / 65536.f);
+ info->max_value = hb_max (info->default_value, axis.maxValue / 65536.f);
+ }
+#endif
- inline bool get_axis (unsigned int index, hb_ot_var_axis_t *info) const
+ void get_axis_info (unsigned int axis_index,
+ hb_ot_var_axis_info_t *info) const
{
- if (unlikely (index >= axisCount))
- return false;
+ const AxisRecord &axis = get_axes ()[axis_index];
+ info->axis_index = axis_index;
+ info->tag = axis.axisTag;
+ info->name_id = axis.axisNameID;
+ info->flags = (hb_ot_var_axis_flags_t) (unsigned int) axis.flags;
+ info->default_value = axis.defaultValue / 65536.f;
+ /* Ensure order, to simplify client math. */
+ info->min_value = hb_min (info->default_value, axis.minValue / 65536.f);
+ info->max_value = hb_max (info->default_value, axis.maxValue / 65536.f);
+ info->reserved = 0;
+ }
- if (info)
+#ifndef HB_DISABLE_DEPRECATED
+ unsigned int get_axes_deprecated (unsigned int start_offset,
+ unsigned int *axes_count /* IN/OUT */,
+ hb_ot_var_axis_t *axes_array /* OUT */) const
+ {
+ if (axes_count)
{
- const AxisRecord &axis = get_axes ()[index];
- info->tag = axis.axisTag;
- info->name_id = axis.axisNameID;
- info->default_value = axis.defaultValue / 65536.;
- /* Ensure order, to simplify client math. */
- info->min_value = MIN<float> (info->default_value, axis.minValue / 65536.);
- info->max_value = MAX<float> (info->default_value, axis.maxValue / 65536.);
- }
+ /* TODO Rewrite as hb_array_t<>::sub-array() */
+ unsigned int count = axisCount;
+ start_offset = hb_min (start_offset, count);
+
+ count -= start_offset;
+ axes_array += start_offset;
+
+ count = hb_min (count, *axes_count);
+ *axes_count = count;
- return true;
+ for (unsigned int i = 0; i < count; i++)
+ get_axis_deprecated (start_offset + i, axes_array + i);
+ }
+ return axisCount;
}
+#endif
- inline unsigned int get_axis_infos (unsigned int start_offset,
- unsigned int *axes_count /* IN/OUT */,
- hb_ot_var_axis_t *axes_array /* OUT */) const
+ unsigned int get_axis_infos (unsigned int start_offset,
+ unsigned int *axes_count /* IN/OUT */,
+ hb_ot_var_axis_info_t *axes_array /* OUT */) const
{
if (axes_count)
{
+ /* TODO Rewrite as hb_array_t<>::sub-array() */
unsigned int count = axisCount;
- start_offset = MIN (start_offset, count);
+ start_offset = hb_min (start_offset, count);
count -= start_offset;
axes_array += start_offset;
- count = MIN (count, *axes_count);
+ count = hb_min (count, *axes_count);
*axes_count = count;
for (unsigned int i = 0; i < count; i++)
- get_axis (start_offset + i, axes_array + i);
+ get_axis_info (start_offset + i, axes_array + i);
}
return axisCount;
}
- inline bool find_axis (hb_tag_t tag, unsigned int *index, hb_ot_var_axis_t *info) const
+#ifndef HB_DISABLE_DEPRECATED
+ bool find_axis_deprecated (hb_tag_t tag,
+ unsigned int *axis_index,
+ hb_ot_var_axis_t *info) const
{
const AxisRecord *axes = get_axes ();
unsigned int count = get_axis_count ();
for (unsigned int i = 0; i < count; i++)
if (axes[i].axisTag == tag)
{
- if (index)
- *index = i;
- return get_axis (i, info);
+ if (axis_index)
+ *axis_index = i;
+ get_axis_deprecated (i, info);
+ return true;
}
- if (index)
- *index = HB_OT_VAR_NO_AXIS_INDEX;
+ if (axis_index)
+ *axis_index = HB_OT_VAR_NO_AXIS_INDEX;
return false;
}
+#endif
- inline int normalize_axis_value (unsigned int axis_index, float v) const
+ bool find_axis_info (hb_tag_t tag,
+ hb_ot_var_axis_info_t *info) const
{
- hb_ot_var_axis_t axis;
- if (!get_axis (axis_index, &axis))
- return 0;
+ const AxisRecord *axes = get_axes ();
+ unsigned int count = get_axis_count ();
+ for (unsigned int i = 0; i < count; i++)
+ if (axes[i].axisTag == tag)
+ {
+ get_axis_info (i, info);
+ return true;
+ }
+ return false;
+ }
+
+ int normalize_axis_value (unsigned int axis_index, float v) const
+ {
+ hb_ot_var_axis_info_t axis;
+ get_axis_info (axis_index, &axis);
- v = MAX (MIN (v, axis.max_value), axis.min_value); /* Clamp. */
+ v = hb_max (hb_min (v, axis.max_value), axis.min_value); /* Clamp. */
if (v == axis.default_value)
return 0;
@@ -173,31 +237,111 @@ struct fvar
v = (v - axis.default_value) / (axis.default_value - axis.min_value);
else
v = (v - axis.default_value) / (axis.max_value - axis.default_value);
- return (int) (v * 16384. + (v >= 0. ? .5 : -.5));
+ return roundf (v * 16384.f);
+ }
+
+ float unnormalize_axis_value (unsigned int axis_index, float v) const
+ {
+ hb_ot_var_axis_info_t axis;
+ get_axis_info (axis_index, &axis);
+
+ if (v == 0)
+ return axis.default_value;
+ else if (v < 0)
+ v = v * (axis.default_value - axis.min_value) / 16384.f + axis.default_value;
+ else
+ v = v * (axis.max_value - axis.default_value) / 16384.f + axis.default_value;
+ return v;
+ }
+
+ unsigned int get_instance_count () const { return instanceCount; }
+
+ hb_ot_name_id_t get_instance_subfamily_name_id (unsigned int instance_index) const
+ {
+ const InstanceRecord *instance = get_instance (instance_index);
+ if (unlikely (!instance)) return HB_OT_NAME_ID_INVALID;
+ return instance->subfamilyNameID;
+ }
+
+ hb_ot_name_id_t get_instance_postscript_name_id (unsigned int instance_index) const
+ {
+ const InstanceRecord *instance = get_instance (instance_index);
+ if (unlikely (!instance)) return HB_OT_NAME_ID_INVALID;
+ if (instanceSize >= axisCount * 4 + 6)
+ return StructAfter<NameID> (instance->get_coordinates (axisCount));
+ return HB_OT_NAME_ID_INVALID;
+ }
+
+ unsigned int get_instance_coords (unsigned int instance_index,
+ unsigned int *coords_length, /* IN/OUT */
+ float *coords /* OUT */) const
+ {
+ const InstanceRecord *instance = get_instance (instance_index);
+ if (unlikely (!instance))
+ {
+ if (coords_length)
+ *coords_length = 0;
+ return 0;
+ }
+
+ if (coords_length && *coords_length)
+ {
+ hb_array_t<const HBFixed> instanceCoords = instance->get_coordinates (axisCount)
+ .sub_array (0, *coords_length);
+ for (unsigned int i = 0; i < instanceCoords.length; i++)
+ coords[i] = instanceCoords.arrayZ[i].to_float ();
+ }
+ return axisCount;
}
+ void collect_name_ids (hb_set_t *nameids) const
+ {
+ if (!has_data ()) return;
+
+ + get_axes ()
+ | hb_map (&AxisRecord::axisNameID)
+ | hb_sink (nameids)
+ ;
+
+ + hb_range ((unsigned) instanceCount)
+ | hb_map ([this] (const unsigned _) { return get_instance_subfamily_name_id (_); })
+ | hb_sink (nameids)
+ ;
+
+ + hb_range ((unsigned) instanceCount)
+ | hb_map ([this] (const unsigned _) { return get_instance_postscript_name_id (_); })
+ | hb_sink (nameids)
+ ;
+ }
+
+
protected:
- inline const AxisRecord * get_axes (void) const
- { return &StructAtOffset<AxisRecord> (this, things); }
+ hb_array_t<const AxisRecord> get_axes () const
+ { return hb_array (&(this+firstAxis), axisCount); }
- inline const InstanceRecord * get_instances (void) const
- { return &StructAtOffset<InstanceRecord> (get_axes () + axisCount, 0); }
+ const InstanceRecord *get_instance (unsigned int i) const
+ {
+ if (unlikely (i >= instanceCount)) return nullptr;
+ return &StructAtOffset<InstanceRecord> (&StructAfter<InstanceRecord> (get_axes ()),
+ i * instanceSize);
+ }
protected:
FixedVersion<>version; /* Version of the fvar table
* initially set to 0x00010000u */
- Offset16 things; /* Offset in bytes from the beginning of the table
+ OffsetTo<AxisRecord>
+ firstAxis; /* Offset in bytes from the beginning of the table
* to the start of the AxisRecord array. */
- UINT16 reserved; /* This field is permanently reserved. Set to 2. */
- UINT16 axisCount; /* The number of variation axes in the font (the
+ HBUINT16 reserved; /* This field is permanently reserved. Set to 2. */
+ HBUINT16 axisCount; /* The number of variation axes in the font (the
* number of records in the axes array). */
- UINT16 axisSize; /* The size in bytes of each VariationAxisRecord —
+ HBUINT16 axisSize; /* The size in bytes of each VariationAxisRecord —
* set to 20 (0x0014) for this version. */
- UINT16 instanceCount; /* The number of named instances defined in the font
+ HBUINT16 instanceCount; /* The number of named instances defined in the font
* (the number of records in the instances array). */
- UINT16 instanceSize; /* The size in bytes of each InstanceRecord — set
- * to either axisCount * sizeof(Fixed) + 4, or to
- * axisCount * sizeof(Fixed) + 6. */
+ HBUINT16 instanceSize; /* The size in bytes of each InstanceRecord — set
+ * to either axisCount * sizeof(HBFixed) + 4, or to
+ * axisCount * sizeof(HBFixed) + 6. */
public:
DEFINE_SIZE_STATIC (16);
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-var-gvar-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-var-gvar-table.hh
new file mode 100644
index 0000000000..a76121d860
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-var-gvar-table.hh
@@ -0,0 +1,717 @@
+/*
+ * Copyright © 2019 Adobe Inc.
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_OT_VAR_GVAR_TABLE_HH
+#define HB_OT_VAR_GVAR_TABLE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-ot-var-fvar-table.hh"
+
+/*
+ * gvar -- Glyph Variation Table
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/gvar
+ */
+#define HB_OT_TAG_gvar HB_TAG('g','v','a','r')
+
+namespace OT {
+
+struct contour_point_t
+{
+ void init (float x_=0.f, float y_=0.f) { flag = 0; x = x_; y = y_; }
+
+ void translate (const contour_point_t &p) { x += p.x; y += p.y; }
+
+ uint8_t flag;
+ float x, y;
+};
+
+struct contour_point_vector_t : hb_vector_t<contour_point_t>
+{
+ void extend (const hb_array_t<contour_point_t> &a)
+ {
+ unsigned int old_len = length;
+ resize (old_len + a.length);
+ for (unsigned int i = 0; i < a.length; i++)
+ (*this)[old_len + i] = a[i];
+ }
+
+ void transform (const float (&matrix)[4])
+ {
+ for (unsigned int i = 0; i < length; i++)
+ {
+ contour_point_t &p = (*this)[i];
+ float x_ = p.x * matrix[0] + p.y * matrix[2];
+ p.y = p.x * matrix[1] + p.y * matrix[3];
+ p.x = x_;
+ }
+ }
+
+ void translate (const contour_point_t& delta)
+ {
+ for (unsigned int i = 0; i < length; i++)
+ (*this)[i].translate (delta);
+ }
+};
+
+struct Tuple : UnsizedArrayOf<F2DOT14> {};
+
+struct TuppleIndex : HBUINT16
+{
+ enum Flags {
+ EmbeddedPeakTuple = 0x8000u,
+ IntermediateRegion = 0x4000u,
+ PrivatePointNumbers = 0x2000u,
+ TupleIndexMask = 0x0FFFu
+ };
+
+ DEFINE_SIZE_STATIC (2);
+};
+
+struct TupleVarHeader
+{
+ unsigned int get_size (unsigned int axis_count) const
+ {
+ return min_size +
+ (has_peak () ? get_peak_tuple ().get_size (axis_count) : 0) +
+ (has_intermediate () ? (get_start_tuple (axis_count).get_size (axis_count) +
+ get_end_tuple (axis_count).get_size (axis_count)) : 0);
+ }
+
+ const TupleVarHeader &get_next (unsigned int axis_count) const
+ { return StructAtOffset<TupleVarHeader> (this, get_size (axis_count)); }
+
+ float calculate_scalar (const int *coords, unsigned int coord_count,
+ const hb_array_t<const F2DOT14> shared_tuples) const
+ {
+ const F2DOT14 *peak_tuple;
+
+ if (has_peak ())
+ peak_tuple = &(get_peak_tuple ()[0]);
+ else
+ {
+ unsigned int index = get_index ();
+ if (unlikely (index * coord_count >= shared_tuples.length))
+ return 0.f;
+ peak_tuple = &shared_tuples[coord_count * index];
+ }
+
+ const F2DOT14 *start_tuple = nullptr;
+ const F2DOT14 *end_tuple = nullptr;
+ if (has_intermediate ())
+ {
+ start_tuple = get_start_tuple (coord_count);
+ end_tuple = get_end_tuple (coord_count);
+ }
+
+ float scalar = 1.f;
+ for (unsigned int i = 0; i < coord_count; i++)
+ {
+ int v = coords[i];
+ int peak = peak_tuple[i];
+ if (!peak || v == peak) continue;
+
+ if (has_intermediate ())
+ {
+ int start = start_tuple[i];
+ int end = end_tuple[i];
+ if (unlikely (start > peak || peak > end ||
+ (start < 0 && end > 0 && peak))) continue;
+ if (v < start || v > end) return 0.f;
+ if (v < peak)
+ { if (peak != start) scalar *= (float) (v - start) / (peak - start); }
+ else
+ { if (peak != end) scalar *= (float) (end - v) / (end - peak); }
+ }
+ else if (!v || v < hb_min (0, peak) || v > hb_max (0, peak)) return 0.f;
+ else
+ scalar *= (float) v / peak;
+ }
+ return scalar;
+ }
+
+ unsigned int get_data_size () const { return varDataSize; }
+
+ bool has_peak () const { return (tupleIndex & TuppleIndex::EmbeddedPeakTuple); }
+ bool has_intermediate () const { return (tupleIndex & TuppleIndex::IntermediateRegion); }
+ bool has_private_points () const { return (tupleIndex & TuppleIndex::PrivatePointNumbers); }
+ unsigned int get_index () const { return (tupleIndex & TuppleIndex::TupleIndexMask); }
+
+ protected:
+ const Tuple &get_peak_tuple () const
+ { return StructAfter<Tuple> (tupleIndex); }
+ const Tuple &get_start_tuple (unsigned int axis_count) const
+ { return *(const Tuple *) &get_peak_tuple ()[has_peak () ? axis_count : 0]; }
+ const Tuple &get_end_tuple (unsigned int axis_count) const
+ { return *(const Tuple *) &get_peak_tuple ()[has_peak () ? (axis_count * 2) : axis_count]; }
+
+ HBUINT16 varDataSize;
+ TuppleIndex tupleIndex;
+ /* UnsizedArrayOf<F2DOT14> peakTuple - optional */
+ /* UnsizedArrayOf<F2DOT14> intermediateStartTuple - optional */
+ /* UnsizedArrayOf<F2DOT14> intermediateEndTuple - optional */
+
+ public:
+ DEFINE_SIZE_MIN (4);
+};
+
+struct TupleVarCount : HBUINT16
+{
+ bool has_shared_point_numbers () const { return ((*this) & SharedPointNumbers); }
+ unsigned int get_count () const { return (*this) & CountMask; }
+
+ protected:
+ enum Flags
+ {
+ SharedPointNumbers = 0x8000u,
+ CountMask = 0x0FFFu
+ };
+
+ public:
+ DEFINE_SIZE_STATIC (2);
+};
+
+struct GlyphVarData
+{
+ const TupleVarHeader &get_tuple_var_header (void) const
+ { return StructAfter<TupleVarHeader> (data); }
+
+ struct tuple_iterator_t
+ {
+ void init (const GlyphVarData *var_data_, unsigned int length_, unsigned int axis_count_)
+ {
+ var_data = var_data_;
+ length = length_;
+ index = 0;
+ axis_count = axis_count_;
+ current_tuple = &var_data->get_tuple_var_header ();
+ data_offset = 0;
+ }
+
+ bool get_shared_indices (hb_vector_t<unsigned int> &shared_indices /* OUT */)
+ {
+ if (var_data->has_shared_point_numbers ())
+ {
+ hb_bytes_t bytes ((const char *) var_data, length);
+ const HBUINT8 *base = &(var_data+var_data->data);
+ const HBUINT8 *p = base;
+ if (!unpack_points (p, shared_indices, bytes)) return false;
+ data_offset = p - base;
+ }
+ return true;
+ }
+
+ bool is_valid () const
+ {
+ return (index < var_data->tupleVarCount.get_count ()) &&
+ in_range (current_tuple) &&
+ current_tuple->get_size (axis_count);
+ }
+
+ bool move_to_next ()
+ {
+ data_offset += current_tuple->get_data_size ();
+ current_tuple = &current_tuple->get_next (axis_count);
+ index++;
+ return is_valid ();
+ }
+
+ bool in_range (const void *p, unsigned int l) const
+ { return (const char*) p >= (const char*) var_data && (const char*) p+l <= (const char*) var_data + length; }
+
+ template <typename T> bool in_range (const T *p) const { return in_range (p, sizeof (*p)); }
+
+ const HBUINT8 *get_serialized_data () const
+ { return &(var_data+var_data->data) + data_offset; }
+
+ private:
+ const GlyphVarData *var_data;
+ unsigned int length;
+ unsigned int index;
+ unsigned int axis_count;
+ unsigned int data_offset;
+
+ public:
+ const TupleVarHeader *current_tuple;
+ };
+
+ static bool get_tuple_iterator (const GlyphVarData *var_data,
+ unsigned int length,
+ unsigned int axis_count,
+ hb_vector_t<unsigned int> &shared_indices /* OUT */,
+ tuple_iterator_t *iterator /* OUT */)
+ {
+ iterator->init (var_data, length, axis_count);
+ if (!iterator->get_shared_indices (shared_indices))
+ return false;
+ return iterator->is_valid ();
+ }
+
+ bool has_shared_point_numbers () const { return tupleVarCount.has_shared_point_numbers (); }
+
+ static bool unpack_points (const HBUINT8 *&p /* IN/OUT */,
+ hb_vector_t<unsigned int> &points /* OUT */,
+ const hb_bytes_t &bytes)
+ {
+ enum packed_point_flag_t
+ {
+ POINTS_ARE_WORDS = 0x80,
+ POINT_RUN_COUNT_MASK = 0x7F
+ };
+
+ if (unlikely (!bytes.in_range (p))) return false;
+
+ uint16_t count = *p++;
+ if (count & POINTS_ARE_WORDS)
+ {
+ if (unlikely (!bytes.in_range (p))) return false;
+ count = ((count & POINT_RUN_COUNT_MASK) << 8) | *p++;
+ }
+ points.resize (count);
+
+ unsigned int n = 0;
+ uint16_t i = 0;
+ while (i < count)
+ {
+ if (unlikely (!bytes.in_range (p))) return false;
+ uint16_t j;
+ uint8_t control = *p++;
+ uint16_t run_count = (control & POINT_RUN_COUNT_MASK) + 1;
+ if (control & POINTS_ARE_WORDS)
+ {
+ for (j = 0; j < run_count && i < count; j++, i++)
+ {
+ if (unlikely (!bytes.in_range ((const HBUINT16 *) p)))
+ return false;
+ n += *(const HBUINT16 *)p;
+ points[i] = n;
+ p += HBUINT16::static_size;
+ }
+ }
+ else
+ {
+ for (j = 0; j < run_count && i < count; j++, i++)
+ {
+ if (unlikely (!bytes.in_range (p))) return false;
+ n += *p++;
+ points[i] = n;
+ }
+ }
+ if (j < run_count) return false;
+ }
+ return true;
+ }
+
+ static bool unpack_deltas (const HBUINT8 *&p /* IN/OUT */,
+ hb_vector_t<int> &deltas /* IN/OUT */,
+ const hb_bytes_t &bytes)
+ {
+ enum packed_delta_flag_t
+ {
+ DELTAS_ARE_ZERO = 0x80,
+ DELTAS_ARE_WORDS = 0x40,
+ DELTA_RUN_COUNT_MASK = 0x3F
+ };
+
+ unsigned int i = 0;
+ unsigned int count = deltas.length;
+ while (i < count)
+ {
+ if (unlikely (!bytes.in_range (p))) return false;
+ uint8_t control = *p++;
+ unsigned int run_count = (control & DELTA_RUN_COUNT_MASK) + 1;
+ unsigned int j;
+ if (control & DELTAS_ARE_ZERO)
+ for (j = 0; j < run_count && i < count; j++, i++)
+ deltas[i] = 0;
+ else if (control & DELTAS_ARE_WORDS)
+ for (j = 0; j < run_count && i < count; j++, i++)
+ {
+ if (unlikely (!bytes.in_range ((const HBUINT16 *) p)))
+ return false;
+ deltas[i] = *(const HBINT16 *) p;
+ p += HBUINT16::static_size;
+ }
+ else
+ for (j = 0; j < run_count && i < count; j++, i++)
+ {
+ if (unlikely (!bytes.in_range (p)))
+ return false;
+ deltas[i] = *(const HBINT8 *) p++;
+ }
+ if (j < run_count)
+ return false;
+ }
+ return true;
+ }
+
+ protected:
+ TupleVarCount tupleVarCount;
+ OffsetTo<HBUINT8> data;
+ /* TupleVarHeader tupleVarHeaders[] */
+ public:
+ DEFINE_SIZE_MIN (4);
+};
+
+struct gvar
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_gvar;
+
+ bool sanitize_shallow (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && (version.major == 1) &&
+ (glyphCount == c->get_num_glyphs ()) &&
+ c->check_array (&(this+sharedTuples), axisCount * sharedTupleCount) &&
+ (is_long_offset () ?
+ c->check_array (get_long_offset_array (), glyphCount+1) :
+ c->check_array (get_short_offset_array (), glyphCount+1)) &&
+ c->check_array (((const HBUINT8*)&(this+dataZ)) + get_offset (0),
+ get_offset (glyphCount) - get_offset (0)));
+ }
+
+ /* GlyphVarData not sanitized here; must be checked while accessing each glyph varation data */
+ bool sanitize (hb_sanitize_context_t *c) const
+ { return sanitize_shallow (c); }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+
+ gvar *out = c->serializer->allocate_min<gvar> ();
+ if (unlikely (!out)) return_trace (false);
+
+ out->version.major = 1;
+ out->version.minor = 0;
+ out->axisCount = axisCount;
+ out->sharedTupleCount = sharedTupleCount;
+
+ unsigned int num_glyphs = c->plan->num_output_glyphs ();
+ out->glyphCount = num_glyphs;
+
+ unsigned int subset_data_size = 0;
+ for (hb_codepoint_t gid = 0; gid < num_glyphs; gid++)
+ {
+ hb_codepoint_t old_gid;
+ if (!c->plan->old_gid_for_new_gid (gid, &old_gid)) continue;
+ subset_data_size += get_glyph_var_data_length (old_gid);
+ }
+
+ bool long_offset = subset_data_size & ~0xFFFFu;
+ out->flags = long_offset ? 1 : 0;
+
+ HBUINT8 *subset_offsets = c->serializer->allocate_size<HBUINT8> ((long_offset ? 4 : 2) * (num_glyphs + 1));
+ if (!subset_offsets) return_trace (false);
+
+ /* shared tuples */
+ if (!sharedTupleCount || !sharedTuples)
+ out->sharedTuples = 0;
+ else
+ {
+ unsigned int shared_tuple_size = F2DOT14::static_size * axisCount * sharedTupleCount;
+ F2DOT14 *tuples = c->serializer->allocate_size<F2DOT14> (shared_tuple_size);
+ if (!tuples) return_trace (false);
+ out->sharedTuples = (char *) tuples - (char *) out;
+ memcpy (tuples, &(this+sharedTuples), shared_tuple_size);
+ }
+
+ char *subset_data = c->serializer->allocate_size<char> (subset_data_size);
+ if (!subset_data) return_trace (false);
+ out->dataZ = subset_data - (char *)out;
+
+ unsigned int glyph_offset = 0;
+ for (hb_codepoint_t gid = 0; gid < num_glyphs; gid++)
+ {
+ hb_codepoint_t old_gid;
+ unsigned int length = c->plan->old_gid_for_new_gid (gid, &old_gid) ? get_glyph_var_data_length (old_gid) : 0;
+
+ if (long_offset)
+ ((HBUINT32 *) subset_offsets)[gid] = glyph_offset;
+ else
+ ((HBUINT16 *) subset_offsets)[gid] = glyph_offset / 2;
+
+ if (length > 0) memcpy (subset_data, get_glyph_var_data (old_gid), length);
+ subset_data += length;
+ glyph_offset += length;
+ }
+ if (long_offset)
+ ((HBUINT32 *) subset_offsets)[num_glyphs] = glyph_offset;
+ else
+ ((HBUINT16 *) subset_offsets)[num_glyphs] = glyph_offset / 2;
+
+ return_trace (true);
+ }
+
+ protected:
+ const GlyphVarData *get_glyph_var_data (hb_codepoint_t glyph) const
+ {
+ unsigned int start_offset = get_offset (glyph);
+ unsigned int end_offset = get_offset (glyph+1);
+
+ if ((start_offset == end_offset) ||
+ unlikely ((start_offset > get_offset (glyphCount)) ||
+ (start_offset + GlyphVarData::min_size > end_offset)))
+ return &Null (GlyphVarData);
+ return &(((unsigned char *) this + start_offset) + dataZ);
+ }
+
+ bool is_long_offset () const { return (flags & 1) != 0; }
+
+ unsigned int get_offset (unsigned int i) const
+ {
+ if (is_long_offset ())
+ return get_long_offset_array ()[i];
+ else
+ return get_short_offset_array ()[i] * 2;
+ }
+
+ unsigned int get_glyph_var_data_length (unsigned int glyph) const
+ {
+ unsigned int end_offset = get_offset (glyph + 1);
+ unsigned int start_offset = get_offset (glyph);
+ if (unlikely (start_offset > end_offset || end_offset > get_offset (glyphCount)))
+ return 0;
+ return end_offset - start_offset;
+ }
+
+ const HBUINT32 * get_long_offset_array () const { return (const HBUINT32 *) &offsetZ; }
+ const HBUINT16 *get_short_offset_array () const { return (const HBUINT16 *) &offsetZ; }
+
+ public:
+ struct accelerator_t
+ {
+ void init (hb_face_t *face)
+ {
+ gvar_table = hb_sanitize_context_t ().reference_table<gvar> (face);
+ hb_blob_ptr_t<fvar> fvar_table = hb_sanitize_context_t ().reference_table<fvar> (face);
+ unsigned int axis_count = fvar_table->get_axis_count ();
+ fvar_table.destroy ();
+
+ if (unlikely ((gvar_table->glyphCount != face->get_num_glyphs ()) ||
+ (gvar_table->axisCount != axis_count)))
+ fini ();
+
+ unsigned int num_shared_coord = gvar_table->sharedTupleCount * gvar_table->axisCount;
+ shared_tuples.resize (num_shared_coord);
+ for (unsigned int i = 0; i < num_shared_coord; i++)
+ shared_tuples[i] = (&(gvar_table + gvar_table->sharedTuples))[i];
+ }
+
+ void fini ()
+ {
+ gvar_table.destroy ();
+ shared_tuples.fini ();
+ }
+
+ private:
+ struct x_getter { static float get (const contour_point_t &p) { return p.x; } };
+ struct y_getter { static float get (const contour_point_t &p) { return p.y; } };
+
+ template <typename T>
+ static float infer_delta (const hb_array_t<contour_point_t> points,
+ const hb_array_t<contour_point_t> deltas,
+ unsigned int target, unsigned int prev, unsigned int next)
+ {
+ float target_val = T::get (points[target]);
+ float prev_val = T::get (points[prev]);
+ float next_val = T::get (points[next]);
+ float prev_delta = T::get (deltas[prev]);
+ float next_delta = T::get (deltas[next]);
+
+ if (prev_val == next_val)
+ return (prev_delta == next_delta) ? prev_delta : 0.f;
+ else if (target_val <= hb_min (prev_val, next_val))
+ return (prev_val < next_val) ? prev_delta : next_delta;
+ else if (target_val >= hb_max (prev_val, next_val))
+ return (prev_val > next_val) ? prev_delta : next_delta;
+
+ /* linear interpolation */
+ float r = (target_val - prev_val) / (next_val - prev_val);
+ return (1.f - r) * prev_delta + r * next_delta;
+ }
+
+ static unsigned int next_index (unsigned int i, unsigned int start, unsigned int end)
+ { return (i >= end) ? start : (i + 1); }
+
+ public:
+ bool apply_deltas_to_points (hb_codepoint_t glyph,
+ const int *coords, unsigned int coord_count,
+ const hb_array_t<contour_point_t> points,
+ const hb_array_t<unsigned int> end_points) const
+ {
+ if (unlikely (coord_count != gvar_table->axisCount)) return false;
+
+ const GlyphVarData *var_data = gvar_table->get_glyph_var_data (glyph);
+ if (var_data == &Null (GlyphVarData)) return true;
+ hb_vector_t<unsigned int> shared_indices;
+ GlyphVarData::tuple_iterator_t iterator;
+ if (!GlyphVarData::get_tuple_iterator (var_data,
+ gvar_table->get_glyph_var_data_length (glyph),
+ gvar_table->axisCount,
+ shared_indices,
+ &iterator))
+ return false;
+
+ /* Save original points for inferred delta calculation */
+ contour_point_vector_t orig_points;
+ orig_points.resize (points.length);
+ for (unsigned int i = 0; i < orig_points.length; i++)
+ orig_points[i] = points[i];
+
+ contour_point_vector_t deltas; /* flag is used to indicate referenced point */
+ deltas.resize (points.length);
+
+ do
+ {
+ float scalar = iterator.current_tuple->calculate_scalar (coords, coord_count, shared_tuples.as_array ());
+ if (scalar == 0.f) continue;
+ const HBUINT8 *p = iterator.get_serialized_data ();
+ unsigned int length = iterator.current_tuple->get_data_size ();
+ if (unlikely (!iterator.in_range (p, length)))
+ return false;
+
+ hb_bytes_t bytes ((const char *) p, length);
+ hb_vector_t<unsigned int> private_indices;
+ if (iterator.current_tuple->has_private_points () &&
+ !GlyphVarData::unpack_points (p, private_indices, bytes))
+ return false;
+ const hb_array_t<unsigned int> &indices = private_indices.length ? private_indices : shared_indices;
+
+ bool apply_to_all = (indices.length == 0);
+ unsigned int num_deltas = apply_to_all ? points.length : indices.length;
+ hb_vector_t<int> x_deltas;
+ x_deltas.resize (num_deltas);
+ if (!GlyphVarData::unpack_deltas (p, x_deltas, bytes))
+ return false;
+ hb_vector_t<int> y_deltas;
+ y_deltas.resize (num_deltas);
+ if (!GlyphVarData::unpack_deltas (p, y_deltas, bytes))
+ return false;
+
+ for (unsigned int i = 0; i < deltas.length; i++)
+ deltas[i].init ();
+ for (unsigned int i = 0; i < num_deltas; i++)
+ {
+ unsigned int pt_index = apply_to_all ? i : indices[i];
+ deltas[pt_index].flag = 1; /* this point is referenced, i.e., explicit deltas specified */
+ deltas[pt_index].x += x_deltas[i] * scalar;
+ deltas[pt_index].y += y_deltas[i] * scalar;
+ }
+
+ /* infer deltas for unreferenced points */
+ unsigned int start_point = 0;
+ for (unsigned int c = 0; c < end_points.length; c++)
+ {
+ unsigned int end_point = end_points[c];
+ unsigned int i, j;
+
+ /* Check the number of unreferenced points in a contour. If no unref points or no ref points, nothing to do. */
+ unsigned int unref_count = 0;
+ for (i = start_point; i <= end_point; i++)
+ if (!deltas[i].flag) unref_count++;
+ if (unref_count == 0 || unref_count > end_point - start_point)
+ goto no_more_gaps;
+
+ j = start_point;
+ for (;;)
+ {
+ /* Locate the next gap of unreferenced points between two referenced points prev and next.
+ * Note that a gap may wrap around at left (start_point) and/or at right (end_point).
+ */
+ unsigned int prev, next;
+ for (;;)
+ {
+ i = j;
+ j = next_index (i, start_point, end_point);
+ if (deltas[i].flag && !deltas[j].flag) break;
+ }
+ prev = j = i;
+ for (;;)
+ {
+ i = j;
+ j = next_index (i, start_point, end_point);
+ if (!deltas[i].flag && deltas[j].flag) break;
+ }
+ next = j;
+ /* Infer deltas for all unref points in the gap between prev and next */
+ i = prev;
+ for (;;)
+ {
+ i = next_index (i, start_point, end_point);
+ if (i == next) break;
+ deltas[i].x = infer_delta<x_getter> (orig_points.as_array (), deltas.as_array (), i, prev, next);
+ deltas[i].y = infer_delta<y_getter> (orig_points.as_array (), deltas.as_array (), i, prev, next);
+ if (--unref_count == 0) goto no_more_gaps;
+ }
+ }
+no_more_gaps:
+ start_point = end_point + 1;
+ }
+
+ /* apply specified / inferred deltas to points */
+ for (unsigned int i = 0; i < points.length; i++)
+ {
+ points[i].x += (float) roundf (deltas[i].x);
+ points[i].y += (float) roundf (deltas[i].y);
+ }
+ } while (iterator.move_to_next ());
+
+ return true;
+ }
+
+ unsigned int get_axis_count () const { return gvar_table->axisCount; }
+
+ protected:
+ const GlyphVarData *get_glyph_var_data (hb_codepoint_t glyph) const
+ { return gvar_table->get_glyph_var_data (glyph); }
+
+ private:
+ hb_blob_ptr_t<gvar> gvar_table;
+ hb_vector_t<F2DOT14> shared_tuples;
+ };
+
+ protected:
+ FixedVersion<>version; /* Version of gvar table. Set to 0x00010000u. */
+ HBUINT16 axisCount;
+ HBUINT16 sharedTupleCount;
+ LOffsetTo<F2DOT14>
+ sharedTuples; /* LOffsetTo<UnsizedArrayOf<Tupple>> */
+ HBUINT16 glyphCount;
+ HBUINT16 flags;
+ LOffsetTo<GlyphVarData>
+ dataZ; /* Array of GlyphVarData */
+ UnsizedArrayOf<HBUINT8>
+ offsetZ; /* Array of 16-bit or 32-bit (glyphCount+1) offsets */
+ public:
+ DEFINE_SIZE_MIN (20);
+};
+
+struct gvar_accelerator_t : gvar::accelerator_t {};
+
+} /* namespace OT */
+
+#endif /* HB_OT_VAR_GVAR_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-var-hvar-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-var-hvar-table.hh
index fac843a719..223430fb82 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-var-hvar-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-var-hvar-table.hh
@@ -27,7 +27,7 @@
#ifndef HB_OT_VAR_HVAR_TABLE_HH
#define HB_OT_VAR_HVAR_TABLE_HH
-#include "hb-ot-layout-common-private.hh"
+#include "hb-ot-layout-common.hh"
namespace OT {
@@ -35,11 +35,13 @@ namespace OT {
struct DeltaSetIndexMap
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this) &&
- c->check_array (mapData, get_width (), mapCount));
+ c->check_range (mapDataZ.arrayZ,
+ mapCount,
+ get_width ()));
}
unsigned int map (unsigned int v) const /* Returns 16.16 outer.inner. */
@@ -55,7 +57,7 @@ struct DeltaSetIndexMap
unsigned int u = 0;
{ /* Fetch it. */
unsigned int w = get_width ();
- const UINT8 *p = mapData + w * v;
+ const HBUINT8 *p = mapDataZ.arrayZ + w * v;
for (; w; w--)
u = (u << 8) + *p++;
}
@@ -71,37 +73,37 @@ struct DeltaSetIndexMap
}
protected:
- inline unsigned int get_width (void) const
- { return ((format >> 4) & 3) + 1; }
+ unsigned int get_width () const { return ((format >> 4) & 3) + 1; }
- inline unsigned int get_inner_bitcount (void) const
- { return (format & 0xF) + 1; }
+ unsigned int get_inner_bitcount () const { return (format & 0xF) + 1; }
protected:
- UINT16 format; /* A packed field that describes the compressed
+ HBUINT16 format; /* A packed field that describes the compressed
* representation of delta-set indices. */
- UINT16 mapCount; /* The number of mapping entries. */
- UINT8 mapData[VAR]; /* The delta-set index mapping data. */
+ HBUINT16 mapCount; /* The number of mapping entries. */
+ UnsizedArrayOf<HBUINT8>
+ mapDataZ; /* The delta-set index mapping data. */
public:
- DEFINE_SIZE_ARRAY (4, mapData);
+ DEFINE_SIZE_ARRAY (4, mapDataZ);
};
/*
- * HVAR -- The Horizontal Metrics Variations Table
- * VVAR -- The Vertical Metrics Variations Table
+ * HVAR -- Horizontal Metrics Variations
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/hvar
+ * VVAR -- Vertical Metrics Variations
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/vvar
*/
-
#define HB_OT_TAG_HVAR HB_TAG('H','V','A','R')
#define HB_OT_TAG_VVAR HB_TAG('V','V','A','R')
struct HVARVVAR
{
- static const hb_tag_t HVARTag = HB_OT_TAG_HVAR;
- static const hb_tag_t VVARTag = HB_OT_TAG_VVAR;
+ static constexpr hb_tag_t HVARTag = HB_OT_TAG_HVAR;
+ static constexpr hb_tag_t VVARTag = HB_OT_TAG_VVAR;
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (version.sanitize (c) &&
@@ -112,15 +114,21 @@ struct HVARVVAR
rsbMap.sanitize (c, this));
}
- inline float get_advance_var (hb_codepoint_t glyph,
- int *coords, unsigned int coord_count) const
+ float get_advance_var (hb_font_t *font, hb_codepoint_t glyph) const
{
unsigned int varidx = (this+advMap).map (glyph);
+ return (this+varStore).get_delta (varidx, font->coords, font->num_coords);
+ }
+
+ float get_side_bearing_var (hb_codepoint_t glyph,
+ const int *coords, unsigned int coord_count) const
+ {
+ if (!has_side_bearing_deltas ()) return 0.f;
+ unsigned int varidx = (this+lsbMap).map (glyph);
return (this+varStore).get_delta (varidx, coords, coord_count);
}
- inline bool has_sidebearing_deltas (void) const
- { return lsbMap && rsbMap; }
+ bool has_side_bearing_deltas () const { return lsbMap && rsbMap; }
protected:
FixedVersion<>version; /* Version of the metrics variation table
@@ -139,12 +147,12 @@ struct HVARVVAR
};
struct HVAR : HVARVVAR {
- static const hb_tag_t tableTag = HB_OT_TAG_HVAR;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_HVAR;
};
struct VVAR : HVARVVAR {
- static const hb_tag_t tableTag = HB_OT_TAG_VVAR;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_VVAR;
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (static_cast<const HVARVVAR *> (this)->sanitize (c) &&
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-var-mvar-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-var-mvar-table.hh
index e17ff5160a..5a9d2afb7c 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-var-mvar-table.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-var-mvar-table.hh
@@ -27,7 +27,7 @@
#ifndef HB_OT_VAR_MVAR_TABLE_HH
#define HB_OT_VAR_MVAR_TABLE_HH
-#include "hb-ot-layout-common-private.hh"
+#include "hb-ot-layout-common.hh"
namespace OT {
@@ -35,7 +35,7 @@ namespace OT {
struct VariationValueRecord
{
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (c->check_struct (this));
@@ -43,7 +43,7 @@ struct VariationValueRecord
public:
Tag valueTag; /* Four-byte tag identifying a font-wide measure. */
- UINT32 varIdx; /* Outer/inner index into VariationStore item. */
+ HBUINT32 varIdx; /* Outer/inner index into VariationStore item. */
public:
DEFINE_SIZE_STATIC (8);
@@ -51,16 +51,16 @@ struct VariationValueRecord
/*
- * MVAR -- Metrics Variations Table
+ * MVAR -- Metrics Variations
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/mvar
*/
-
#define HB_OT_TAG_MVAR HB_TAG('M','V','A','R')
struct MVAR
{
- static const hb_tag_t tableTag = HB_OT_TAG_MVAR;
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_MVAR;
- inline bool sanitize (hb_sanitize_context_t *c) const
+ bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (version.sanitize (c) &&
@@ -68,16 +68,18 @@ struct MVAR
c->check_struct (this) &&
valueRecordSize >= VariationValueRecord::static_size &&
varStore.sanitize (c, this) &&
- c->check_array (values, valueRecordSize, valueRecordCount));
+ c->check_range (valuesZ.arrayZ,
+ valueRecordCount,
+ valueRecordSize));
}
- inline float get_var (hb_tag_t tag,
- int *coords, unsigned int coord_count) const
+ float get_var (hb_tag_t tag,
+ const int *coords, unsigned int coord_count) const
{
const VariationValueRecord *record;
- record = (VariationValueRecord *) bsearch (&tag, values,
- valueRecordCount, valueRecordSize,
- tag_compare);
+ record = (VariationValueRecord *) hb_bsearch (&tag, valuesZ.arrayZ,
+ valueRecordCount, valueRecordSize,
+ tag_compare);
if (!record)
return 0.;
@@ -85,7 +87,7 @@ struct MVAR
}
protected:
- static inline int tag_compare (const void *pa, const void *pb)
+ static int tag_compare (const void *pa, const void *pb)
{
const hb_tag_t *a = (const hb_tag_t *) pa;
const Tag *b = (const Tag *) pb;
@@ -95,17 +97,18 @@ protected:
protected:
FixedVersion<>version; /* Version of the metrics variation table
* initially set to 0x00010000u */
- UINT16 reserved; /* Not used; set to 0. */
- UINT16 valueRecordSize;/* The size in bytes of each value record —
+ HBUINT16 reserved; /* Not used; set to 0. */
+ HBUINT16 valueRecordSize;/* The size in bytes of each value record —
* must be greater than zero. */
- UINT16 valueRecordCount;/* The number of value records — may be zero. */
+ HBUINT16 valueRecordCount;/* The number of value records — may be zero. */
OffsetTo<VariationStore>
varStore; /* Offset to item variation store table. */
- UINT8 values[VAR]; /* Array of value records. The records must be
+ UnsizedArrayOf<HBUINT8>
+ valuesZ; /* Array of value records. The records must be
* in binary order of their valueTag field. */
public:
- DEFINE_SIZE_ARRAY (12, values);
+ DEFINE_SIZE_ARRAY (12, valuesZ);
};
} /* namespace OT */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-var.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-var.cc
index 90ba0bd02c..6b8b09b6ba 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-var.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-var.cc
@@ -24,39 +24,37 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-open-type-private.hh"
+#include "hb.hh"
+
+#ifndef HB_NO_VAR
+
+#include "hb-ot-var.h"
-#include "hb-ot-layout-private.hh"
#include "hb-ot-var-avar-table.hh"
#include "hb-ot-var-fvar-table.hh"
#include "hb-ot-var-mvar-table.hh"
-#include "hb-ot-var.h"
+
+
+/**
+ * SECTION:hb-ot-var
+ * @title: hb-ot-var
+ * @short_description: OpenType Font Variations
+ * @include: hb-ot.h
+ *
+ * Functions for fetching information about OpenType Variable Fonts.
+ **/
+
/*
* fvar/avar
*/
-static inline const OT::fvar&
-_get_fvar (hb_face_t *face)
-{
- if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::fvar);
- hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
- return *(layout->fvar.get ());
-}
-static inline const OT::avar&
-_get_avar (hb_face_t *face)
-{
- if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::avar);
- hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
- return *(layout->avar.get ());
-}
/**
* hb_ot_var_has_data:
* @face: #hb_face_t to test
*
* This function allows to verify the presence of OpenType variation data on the face.
- * Alternatively, use hb_ot_var_get_axis_count().
*
* Return value: true if face has a `fvar' table and false otherwise
*
@@ -65,7 +63,7 @@ _get_avar (hb_face_t *face)
hb_bool_t
hb_ot_var_has_data (hb_face_t *face)
{
- return &_get_fvar (face) != &OT::Null(OT::fvar);
+ return face->table.fvar->has_data ();
}
/**
@@ -76,14 +74,15 @@ hb_ot_var_has_data (hb_face_t *face)
unsigned int
hb_ot_var_get_axis_count (hb_face_t *face)
{
- const OT::fvar &fvar = _get_fvar (face);
- return fvar.get_axis_count ();
+ return face->table.fvar->get_axis_count ();
}
+#ifndef HB_DISABLE_DEPRECATED
/**
* hb_ot_var_get_axes:
*
* Since: 1.4.2
+ * Deprecated: 2.2.0
**/
unsigned int
hb_ot_var_get_axes (hb_face_t *face,
@@ -91,14 +90,14 @@ hb_ot_var_get_axes (hb_face_t *face,
unsigned int *axes_count /* IN/OUT */,
hb_ot_var_axis_t *axes_array /* OUT */)
{
- const OT::fvar &fvar = _get_fvar (face);
- return fvar.get_axis_infos (start_offset, axes_count, axes_array);
+ return face->table.fvar->get_axes_deprecated (start_offset, axes_count, axes_array);
}
/**
* hb_ot_var_find_axis:
*
* Since: 1.4.2
+ * Deprecated: 2.2.0
**/
hb_bool_t
hb_ot_var_find_axis (hb_face_t *face,
@@ -106,8 +105,69 @@ hb_ot_var_find_axis (hb_face_t *face,
unsigned int *axis_index,
hb_ot_var_axis_t *axis_info)
{
- const OT::fvar &fvar = _get_fvar (face);
- return fvar.find_axis (axis_tag, axis_index, axis_info);
+ return face->table.fvar->find_axis_deprecated (axis_tag, axis_index, axis_info);
+}
+#endif
+
+/**
+ * hb_ot_var_get_axis_infos:
+ *
+ * Since: 2.2.0
+ **/
+HB_EXTERN unsigned int
+hb_ot_var_get_axis_infos (hb_face_t *face,
+ unsigned int start_offset,
+ unsigned int *axes_count /* IN/OUT */,
+ hb_ot_var_axis_info_t *axes_array /* OUT */)
+{
+ return face->table.fvar->get_axis_infos (start_offset, axes_count, axes_array);
+}
+
+/**
+ * hb_ot_var_find_axis_info:
+ *
+ * Since: 2.2.0
+ **/
+HB_EXTERN hb_bool_t
+hb_ot_var_find_axis_info (hb_face_t *face,
+ hb_tag_t axis_tag,
+ hb_ot_var_axis_info_t *axis_info)
+{
+ return face->table.fvar->find_axis_info (axis_tag, axis_info);
+}
+
+
+/*
+ * Named instances.
+ */
+
+unsigned int
+hb_ot_var_get_named_instance_count (hb_face_t *face)
+{
+ return face->table.fvar->get_instance_count ();
+}
+
+hb_ot_name_id_t
+hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t *face,
+ unsigned int instance_index)
+{
+ return face->table.fvar->get_instance_subfamily_name_id (instance_index);
+}
+
+hb_ot_name_id_t
+hb_ot_var_named_instance_get_postscript_name_id (hb_face_t *face,
+ unsigned int instance_index)
+{
+ return face->table.fvar->get_instance_postscript_name_id (instance_index);
+}
+
+unsigned int
+hb_ot_var_named_instance_get_design_coords (hb_face_t *face,
+ unsigned int instance_index,
+ unsigned int *coords_length, /* IN/OUT */
+ float *coords /* OUT */)
+{
+ return face->table.fvar->get_instance_coords (instance_index, coords_length, coords);
}
@@ -126,17 +186,16 @@ hb_ot_var_normalize_variations (hb_face_t *face,
for (unsigned int i = 0; i < coords_length; i++)
coords[i] = 0;
- const OT::fvar &fvar = _get_fvar (face);
+ const OT::fvar &fvar = *face->table.fvar;
for (unsigned int i = 0; i < variations_length; i++)
{
- unsigned int axis_index;
- if (hb_ot_var_find_axis (face, variations[i].tag, &axis_index, nullptr) &&
- axis_index < coords_length)
- coords[axis_index] = fvar.normalize_axis_value (axis_index, variations[i].value);
+ hb_ot_var_axis_info_t info;
+ if (hb_ot_var_find_axis_info (face, variations[i].tag, &info) &&
+ info.axis_index < coords_length)
+ coords[info.axis_index] = fvar.normalize_axis_value (info.axis_index, variations[i].value);
}
- const OT::avar &avar = _get_avar (face);
- avar.map_coords (coords, coords_length);
+ face->table.avar->map_coords (coords, coords_length);
}
/**
@@ -150,10 +209,12 @@ hb_ot_var_normalize_coords (hb_face_t *face,
const float *design_coords, /* IN */
int *normalized_coords /* OUT */)
{
- const OT::fvar &fvar = _get_fvar (face);
+ const OT::fvar &fvar = *face->table.fvar;
for (unsigned int i = 0; i < coords_length; i++)
normalized_coords[i] = fvar.normalize_axis_value (i, design_coords[i]);
- const OT::avar &avar = _get_avar (face);
- avar.map_coords (normalized_coords, coords_length);
+ face->table.avar->map_coords (normalized_coords, coords_length);
}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-var.h b/src/3rdparty/harfbuzz-ng/src/hb-ot-var.h
index a2c0c5f2b0..df89bc5a23 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot-var.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-var.h
@@ -47,44 +47,85 @@ HB_BEGIN_DECLS
* fvar / avar
*/
+HB_EXTERN hb_bool_t
+hb_ot_var_has_data (hb_face_t *face);
+
+
+/*
+ * Variation axes.
+ */
+
+
+HB_EXTERN unsigned int
+hb_ot_var_get_axis_count (hb_face_t *face);
+
/**
- * hb_ot_var_axis_t:
+ * hb_ot_var_axis_flags_t:
+ * @HB_OT_VAR_AXIS_FLAG_HIDDEN: The axis should not be exposed directly in user interfaces.
*
- * Since: 1.4.2
+ * Since: 2.2.0
*/
-typedef struct hb_ot_var_axis_t {
- hb_tag_t tag;
- unsigned int name_id;
- float min_value;
- float default_value;
- float max_value;
-} hb_ot_var_axis_t;
+typedef enum { /*< flags >*/
+ HB_OT_VAR_AXIS_FLAG_HIDDEN = 0x00000001u,
-HB_EXTERN hb_bool_t
-hb_ot_var_has_data (hb_face_t *face);
+ _HB_OT_VAR_AXIS_FLAG_MAX_VALUE= HB_TAG_MAX_SIGNED /*< skip >*/
+} hb_ot_var_axis_flags_t;
/**
- * HB_OT_VAR_NO_AXIS_INDEX:
+ * hb_ot_var_axis_info_t:
*
- * Since: 1.4.2
+ * Since: 2.2.0
*/
-#define HB_OT_VAR_NO_AXIS_INDEX 0xFFFFFFFFu
+typedef struct hb_ot_var_axis_info_t
+{
+ unsigned int axis_index;
+ hb_tag_t tag;
+ hb_ot_name_id_t name_id;
+ hb_ot_var_axis_flags_t flags;
+ float min_value;
+ float default_value;
+ float max_value;
+ /*< private >*/
+ unsigned int reserved;
+} hb_ot_var_axis_info_t;
HB_EXTERN unsigned int
-hb_ot_var_get_axis_count (hb_face_t *face);
+hb_ot_var_get_axis_infos (hb_face_t *face,
+ unsigned int start_offset,
+ unsigned int *axes_count /* IN/OUT */,
+ hb_ot_var_axis_info_t *axes_array /* OUT */);
+
+HB_EXTERN hb_bool_t
+hb_ot_var_find_axis_info (hb_face_t *face,
+ hb_tag_t axis_tag,
+ hb_ot_var_axis_info_t *axis_info);
+
+
+/*
+ * Named instances.
+ */
HB_EXTERN unsigned int
-hb_ot_var_get_axes (hb_face_t *face,
- unsigned int start_offset,
- unsigned int *axes_count /* IN/OUT */,
- hb_ot_var_axis_t *axes_array /* OUT */);
+hb_ot_var_get_named_instance_count (hb_face_t *face);
-HB_EXTERN hb_bool_t
-hb_ot_var_find_axis (hb_face_t *face,
- hb_tag_t axis_tag,
- unsigned int *axis_index,
- hb_ot_var_axis_t *axis_info);
+HB_EXTERN hb_ot_name_id_t
+hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t *face,
+ unsigned int instance_index);
+HB_EXTERN hb_ot_name_id_t
+hb_ot_var_named_instance_get_postscript_name_id (hb_face_t *face,
+ unsigned int instance_index);
+
+HB_EXTERN unsigned int
+hb_ot_var_named_instance_get_design_coords (hb_face_t *face,
+ unsigned int instance_index,
+ unsigned int *coords_length, /* IN/OUT */
+ float *coords /* OUT */);
+
+
+/*
+ * Conversions.
+ */
HB_EXTERN void
hb_ot_var_normalize_variations (hb_face_t *face,
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-vorg-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-vorg-table.hh
new file mode 100644
index 0000000000..a4d6b0622b
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-vorg-table.hh
@@ -0,0 +1,135 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_OT_VORG_TABLE_HH
+#define HB_OT_VORG_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * VORG -- Vertical Origin Table
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/vorg
+ */
+#define HB_OT_TAG_VORG HB_TAG('V','O','R','G')
+
+namespace OT {
+
+struct VertOriginMetric
+{
+ int cmp (hb_codepoint_t g) const { return glyph.cmp (g); }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ public:
+ HBGlyphID glyph;
+ FWORD vertOriginY;
+
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
+struct VORG
+{
+ static constexpr hb_tag_t tableTag = HB_OT_TAG_VORG;
+
+ bool has_data () const { return version.to_int (); }
+
+ int get_y_origin (hb_codepoint_t glyph) const
+ {
+ unsigned int i;
+ if (!vertYOrigins.bfind (glyph, &i))
+ return defaultVertOriginY;
+ return vertYOrigins[i].vertOriginY;
+ }
+
+ template <typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ void serialize (hb_serialize_context_t *c,
+ Iterator it,
+ FWORD defaultVertOriginY)
+ {
+
+ if (unlikely (!c->extend_min ((*this)))) return;
+
+ this->version.major = 1;
+ this->version.minor = 0;
+
+ this->defaultVertOriginY = defaultVertOriginY;
+ this->vertYOrigins.len = it.len ();
+
+ for (const auto _ : it) c->copy (_);
+ }
+
+ bool subset (hb_subset_context_t *c) const
+ {
+ TRACE_SUBSET (this);
+ VORG *vorg_prime = c->serializer->start_embed<VORG> ();
+ if (unlikely (!c->serializer->check_success (vorg_prime))) return_trace (false);
+
+ auto it =
+ + vertYOrigins.as_array ()
+ | hb_filter (c->plan->glyphset (), &VertOriginMetric::glyph)
+ | hb_map ([&] (const VertOriginMetric& _)
+ {
+ hb_codepoint_t new_glyph = HB_SET_VALUE_INVALID;
+ c->plan->new_gid_for_old_gid (_.glyph, &new_glyph);
+
+ VertOriginMetric metric;
+ metric.glyph = new_glyph;
+ metric.vertOriginY = _.vertOriginY;
+ return metric;
+ })
+ ;
+
+ /* serialize the new table */
+ vorg_prime->serialize (c->serializer, it, defaultVertOriginY);
+ return_trace (true);
+ }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ version.major == 1 &&
+ vertYOrigins.sanitize (c));
+ }
+
+ protected:
+ FixedVersion<> version; /* Version of VORG table. Set to 0x00010000u. */
+ FWORD defaultVertOriginY; /* The default vertical origin. */
+ SortedArrayOf<VertOriginMetric>
+ vertYOrigins; /* The array of vertical origins. */
+
+ public:
+ DEFINE_SIZE_ARRAY(8, vertYOrigins);
+};
+} /* namespace OT */
+
+#endif /* HB_OT_VORG_TABLE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot.h b/src/3rdparty/harfbuzz-ng/src/hb-ot.h
index 2120a3efa3..f2dbaa1b31 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-ot.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ot.h
@@ -30,10 +30,14 @@
#include "hb.h"
+#include "hb-ot-color.h"
+#include "hb-ot-deprecated.h"
#include "hb-ot-font.h"
#include "hb-ot-layout.h"
#include "hb-ot-math.h"
-#include "hb-ot-tag.h"
+#include "hb-ot-meta.h"
+#include "hb-ot-metrics.h"
+#include "hb-ot-name.h"
#include "hb-ot-shape.h"
#include "hb-ot-var.h"
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-pool.hh b/src/3rdparty/harfbuzz-ng/src/hb-pool.hh
new file mode 100644
index 0000000000..83875dbe13
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-pool.hh
@@ -0,0 +1,102 @@
+/*
+ * Copyright © 2019 Facebook, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Facebook Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_POOL_HH
+#define HB_POOL_HH
+
+#include "hb.hh"
+
+/* Memory pool for persistent allocation of small objects. */
+
+template <typename T, unsigned ChunkLen = 16>
+struct hb_pool_t
+{
+ hb_pool_t () : next (nullptr) {}
+ ~hb_pool_t () { fini (); }
+
+ void fini ()
+ {
+ next = nullptr;
+
+ + hb_iter (chunks)
+ | hb_apply ([] (chunk_t *_) { ::free (_); })
+ ;
+
+ chunks.fini ();
+ }
+
+ T* alloc ()
+ {
+ if (unlikely (!next))
+ {
+ if (unlikely (!chunks.alloc (chunks.length + 1))) return nullptr;
+ chunk_t *chunk = (chunk_t *) calloc (1, sizeof (chunk_t));
+ if (unlikely (!chunk)) return nullptr;
+ chunks.push (chunk);
+ next = chunk->thread ();
+ }
+
+ T* obj = next;
+ next = * ((T**) next);
+
+ memset (obj, 0, sizeof (T));
+
+ return obj;
+ }
+
+ void free (T* obj)
+ {
+ * (T**) obj = next;
+ next = obj;
+ }
+
+ private:
+
+ static_assert (ChunkLen > 1, "");
+ static_assert (sizeof (T) >= sizeof (void *), "");
+ static_assert (alignof (T) % alignof (void *) == 0, "");
+
+ struct chunk_t
+ {
+ T* thread ()
+ {
+ for (unsigned i = 0; i < ARRAY_LENGTH (arrayZ) - 1; i++)
+ * (T**) &arrayZ[i] = &arrayZ[i + 1];
+
+ * (T**) &arrayZ[ARRAY_LENGTH (arrayZ) - 1] = nullptr;
+
+ return arrayZ;
+ }
+
+ T arrayZ[ChunkLen];
+ };
+
+ T* next;
+ hb_vector_t<chunk_t *> chunks;
+};
+
+
+#endif /* HB_POOL_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-private.hh
deleted file mode 100644
index acddd89381..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-private.hh
+++ /dev/null
@@ -1,899 +0,0 @@
-/*
- * Copyright © 2007,2008,2009 Red Hat, Inc.
- * Copyright © 2011,2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_PRIVATE_HH
-#define HB_PRIVATE_HH
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "hb.h"
-#define HB_H_IN
-#ifdef HAVE_OT
-#include "hb-ot.h"
-#define HB_OT_H_IN
-#endif
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdarg.h>
-
-
-#define HB_PASTE1(a,b) a##b
-#define HB_PASTE(a,b) HB_PASTE1(a,b)
-
-/* Compile-time custom allocator support. */
-
-#if defined(hb_malloc_impl) \
- && defined(hb_calloc_impl) \
- && defined(hb_realloc_impl) \
- && defined(hb_free_impl)
-extern "C" void* hb_malloc_impl(size_t size);
-extern "C" void* hb_calloc_impl(size_t nmemb, size_t size);
-extern "C" void* hb_realloc_impl(void *ptr, size_t size);
-extern "C" void hb_free_impl(void *ptr);
-#define malloc hb_malloc_impl
-#define calloc hb_calloc_impl
-#define realloc hb_realloc_impl
-#define free hb_free_impl
-#endif
-
-
-/* Compiler attributes */
-
-
-#if __cplusplus < 201103L
-
-#ifndef nullptr
-#define nullptr NULL
-#endif
-
-// Static assertions
-#ifndef static_assert
-#define static_assert(e, msg) \
- HB_UNUSED typedef int HB_PASTE(static_assertion_failed_at_line_, __LINE__) [(e) ? 1 : -1]
-#endif // static_assert
-
-#endif // __cplusplus < 201103L
-
-#define _GNU_SOURCE 1
-
-#if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__)
-#define likely(expr) (__builtin_expect (!!(expr), 1))
-#define unlikely(expr) (__builtin_expect (!!(expr), 0))
-#else
-#define likely(expr) (expr)
-#define unlikely(expr) (expr)
-#endif
-
-#if !defined(__GNUC__) && !defined(__clang__)
-#undef __attribute__
-#define __attribute__(x)
-#endif
-
-#if __GNUC__ >= 3
-#define HB_PURE_FUNC __attribute__((pure))
-#define HB_CONST_FUNC __attribute__((const))
-#define HB_PRINTF_FUNC(format_idx, arg_idx) __attribute__((__format__ (__printf__, format_idx, arg_idx)))
-#else
-#define HB_PURE_FUNC
-#define HB_CONST_FUNC
-#define HB_PRINTF_FUNC(format_idx, arg_idx)
-#endif
-#if __GNUC__ >= 4
-#define HB_UNUSED __attribute__((unused))
-#elif defined(_MSC_VER) /* https://github.com/harfbuzz/harfbuzz/issues/635 */
-#define HB_UNUSED __pragma(warning(suppress: 4100 4101))
-#else
-#define HB_UNUSED
-#endif
-
-#ifndef HB_INTERNAL
-# if !defined(__MINGW32__) && !defined(__CYGWIN__)
-# define HB_INTERNAL __attribute__((__visibility__("hidden")))
-# else
-# define HB_INTERNAL
-# endif
-#endif
-
-#if __GNUC__ >= 3
-#define HB_FUNC __PRETTY_FUNCTION__
-#elif defined(_MSC_VER)
-#define HB_FUNC __FUNCSIG__
-#else
-#define HB_FUNC __func__
-#endif
-
-/*
- * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
- * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
- * cases that fall through without a break or return statement. HB_FALLTHROUGH
- * is only needed on cases that have code:
- *
- * switch (foo) {
- * case 1: // These cases have no code. No fallthrough annotations are needed.
- * case 2:
- * case 3:
- * foo = 4; // This case has code, so a fallthrough annotation is needed:
- * HB_FALLTHROUGH;
- * default:
- * return foo;
- * }
- */
-#if defined(__clang__) && __cplusplus >= 201103L
- /* clang's fallthrough annotations are only available starting in C++11. */
-# define HB_FALLTHROUGH [[clang::fallthrough]]
-#elif defined(_MSC_VER)
- /*
- * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
- * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx
- */
-# include <sal.h>
-# define HB_FALLTHROUGH __fallthrough
-#else
-# define HB_FALLTHROUGH /* FALLTHROUGH */
-#endif
-
-#if defined(_WIN32) || defined(__CYGWIN__)
- /* We need Windows Vista for both Uniscribe backend and for
- * MemoryBarrier. We don't support compiling on Windows XP,
- * though we run on it fine. */
-# if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0600
-# undef _WIN32_WINNT
-# endif
-# ifndef _WIN32_WINNT
-# define _WIN32_WINNT 0x0600
-# endif
-# ifndef WIN32_LEAN_AND_MEAN
-# define WIN32_LEAN_AND_MEAN 1
-# endif
-# ifndef STRICT
-# define STRICT 1
-# endif
-
-# if defined(_WIN32_WCE)
- /* Some things not defined on Windows CE. */
-# define vsnprintf _vsnprintf
-# define getenv(Name) nullptr
-# if _WIN32_WCE < 0x800
-# define setlocale(Category, Locale) "C"
-static int errno = 0; /* Use something better? */
-# endif
-# elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
-# define getenv(Name) nullptr
-# endif
-# if defined(_MSC_VER) && _MSC_VER < 1900
-# define snprintf _snprintf
-# endif
-#endif
-
-#if HAVE_ATEXIT
-/* atexit() is only safe to be called from shared libraries on certain
- * platforms. Whitelist.
- * https://bugs.freedesktop.org/show_bug.cgi?id=82246 */
-# if defined(__linux) && defined(__GLIBC_PREREQ)
-# if __GLIBC_PREREQ(2,3)
-/* From atexit() manpage, it's safe with glibc 2.2.3 on Linux. */
-# define HB_USE_ATEXIT 1
-# endif
-# elif defined(_MSC_VER) || defined(__MINGW32__)
-/* For MSVC:
- * http://msdn.microsoft.com/en-ca/library/tze57ck3.aspx
- * http://msdn.microsoft.com/en-ca/library/zk17ww08.aspx
- * mingw32 headers say atexit is safe to use in shared libraries.
- */
-# define HB_USE_ATEXIT 1
-# elif defined(__ANDROID__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
-/* This was fixed in Android NKD r8 or r8b:
- * https://code.google.com/p/android/issues/detail?id=6455
- * which introduced GCC 4.6:
- * https://developer.android.com/tools/sdk/ndk/index.html
- */
-# define HB_USE_ATEXIT 1
-# endif
-#endif
-
-/* Basics */
-
-#undef MIN
-template <typename Type>
-static inline Type MIN (const Type &a, const Type &b) { return a < b ? a : b; }
-
-#undef MAX
-template <typename Type>
-static inline Type MAX (const Type &a, const Type &b) { return a > b ? a : b; }
-
-static inline unsigned int DIV_CEIL (const unsigned int a, unsigned int b)
-{ return (a + (b - 1)) / b; }
-
-
-#undef ARRAY_LENGTH
-template <typename Type, unsigned int n>
-static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
-/* A const version, but does not detect erratically being called on pointers. */
-#define ARRAY_LENGTH_CONST(__array) ((signed int) (sizeof (__array) / sizeof (__array[0])))
-
-#define HB_STMT_START do
-#define HB_STMT_END while (0)
-
-template <unsigned int cond> class hb_assert_constant_t;
-template <> class hb_assert_constant_t<1> {};
-
-#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
-
-/* Lets assert int types. Saves trouble down the road. */
-
-static_assert ((sizeof (int8_t) == 1), "");
-static_assert ((sizeof (uint8_t) == 1), "");
-static_assert ((sizeof (int16_t) == 2), "");
-static_assert ((sizeof (uint16_t) == 2), "");
-static_assert ((sizeof (int32_t) == 4), "");
-static_assert ((sizeof (uint32_t) == 4), "");
-static_assert ((sizeof (int64_t) == 8), "");
-static_assert ((sizeof (uint64_t) == 8), "");
-
-static_assert ((sizeof (hb_codepoint_t) == 4), "");
-static_assert ((sizeof (hb_position_t) == 4), "");
-static_assert ((sizeof (hb_mask_t) == 4), "");
-static_assert ((sizeof (hb_var_int_t) == 4), "");
-
-
-/* We like our types POD */
-
-#define _ASSERT_TYPE_POD1(_line, _type) union _type_##_type##_on_line_##_line##_is_not_POD { _type instance; }
-#define _ASSERT_TYPE_POD0(_line, _type) _ASSERT_TYPE_POD1 (_line, _type)
-#define ASSERT_TYPE_POD(_type) _ASSERT_TYPE_POD0 (__LINE__, _type)
-
-#ifdef __GNUC__
-# define _ASSERT_INSTANCE_POD1(_line, _instance) \
- HB_STMT_START { \
- typedef __typeof__(_instance) _type_##_line; \
- _ASSERT_TYPE_POD1 (_line, _type_##_line); \
- } HB_STMT_END
-#else
-# define _ASSERT_INSTANCE_POD1(_line, _instance) typedef int _assertion_on_line_##_line##_not_tested
-#endif
-# define _ASSERT_INSTANCE_POD0(_line, _instance) _ASSERT_INSTANCE_POD1 (_line, _instance)
-# define ASSERT_INSTANCE_POD(_instance) _ASSERT_INSTANCE_POD0 (__LINE__, _instance)
-
-/* Check _assertion in a method environment */
-#define _ASSERT_POD1(_line) \
- HB_UNUSED inline void _static_assertion_on_line_##_line (void) const \
- { _ASSERT_INSTANCE_POD1 (_line, *this); /* Make sure it's POD. */ }
-# define _ASSERT_POD0(_line) _ASSERT_POD1 (_line)
-# define ASSERT_POD() _ASSERT_POD0 (__LINE__)
-
-
-
-/* Misc */
-
-/* Void! */
-struct _hb_void_t {};
-typedef const _hb_void_t *hb_void_t;
-#define HB_VOID ((const _hb_void_t *) nullptr)
-
-/* Return the number of 1 bits in mask. */
-static inline HB_CONST_FUNC unsigned int
-_hb_popcount32 (uint32_t mask)
-{
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
- return __builtin_popcount (mask);
-#else
- /* "HACKMEM 169" */
- uint32_t y;
- y = (mask >> 1) &033333333333;
- y = mask - y - ((y >>1) & 033333333333);
- return (((y + (y >> 3)) & 030707070707) % 077);
-#endif
-}
-static inline HB_CONST_FUNC unsigned int
-_hb_popcount64 (uint64_t mask)
-{
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
- if (sizeof (long) >= sizeof (mask))
- return __builtin_popcountl (mask);
-#endif
- return _hb_popcount32 (mask & 0xFFFFFFFF) + _hb_popcount32 (mask >> 32);
-}
-template <typename T> static inline unsigned int _hb_popcount (T mask);
-template <> inline unsigned int _hb_popcount<uint32_t> (uint32_t mask) { return _hb_popcount32 (mask); }
-template <> inline unsigned int _hb_popcount<uint64_t> (uint64_t mask) { return _hb_popcount64 (mask); }
-
-/* Returns the number of bits needed to store number */
-static inline HB_CONST_FUNC unsigned int
-_hb_bit_storage (unsigned int number)
-{
-#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
- return likely (number) ? (sizeof (unsigned int) * 8 - __builtin_clz (number)) : 0;
-#else
- unsigned int n_bits = 0;
- while (number) {
- n_bits++;
- number >>= 1;
- }
- return n_bits;
-#endif
-}
-
-/* Returns the number of zero bits in the least significant side of number */
-static inline HB_CONST_FUNC unsigned int
-_hb_ctz (unsigned int number)
-{
-#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
- return likely (number) ? __builtin_ctz (number) : 0;
-#else
- unsigned int n_bits = 0;
- if (unlikely (!number)) return 0;
- while (!(number & 1)) {
- n_bits++;
- number >>= 1;
- }
- return n_bits;
-#endif
-}
-
-static inline bool
-_hb_unsigned_int_mul_overflows (unsigned int count, unsigned int size)
-{
- return (size > 0) && (count >= ((unsigned int) -1) / size);
-}
-
-
-
-/* arrays and maps */
-
-
-#define HB_PREALLOCED_ARRAY_INIT {0, 0, nullptr}
-template <typename Type, unsigned int StaticSize=16>
-struct hb_prealloced_array_t
-{
- unsigned int len;
- unsigned int allocated;
- Type *array;
- Type static_array[StaticSize];
-
- void init (void)
- {
- len = 0;
- allocated = ARRAY_LENGTH (static_array);
- array = static_array;
- }
-
- inline Type& operator [] (unsigned int i) { return array[i]; }
- inline const Type& operator [] (unsigned int i) const { return array[i]; }
-
- inline Type *push (void)
- {
- if (unlikely (!resize (len + 1)))
- return nullptr;
-
- return &array[len - 1];
- }
-
- inline bool resize (unsigned int size)
- {
- if (unlikely (size > allocated))
- {
- /* Need to reallocate */
-
- unsigned int new_allocated = allocated;
- while (size >= new_allocated)
- new_allocated += (new_allocated >> 1) + 8;
-
- Type *new_array = nullptr;
-
- if (array == static_array) {
- new_array = (Type *) calloc (new_allocated, sizeof (Type));
- if (new_array)
- memcpy (new_array, array, len * sizeof (Type));
- } else {
- bool overflows = (new_allocated < allocated) || _hb_unsigned_int_mul_overflows (new_allocated, sizeof (Type));
- if (likely (!overflows)) {
- new_array = (Type *) realloc (array, new_allocated * sizeof (Type));
- }
- }
-
- if (unlikely (!new_array))
- return false;
-
- array = new_array;
- allocated = new_allocated;
- }
-
- len = size;
- return true;
- }
-
- inline void pop (void)
- {
- len--;
- }
-
- inline void remove (unsigned int i)
- {
- if (unlikely (i >= len))
- return;
- memmove (static_cast<void *> (&array[i]),
- static_cast<void *> (&array[i + 1]),
- (len - i - 1) * sizeof (Type));
- len--;
- }
-
- inline void shrink (unsigned int l)
- {
- if (l < len)
- len = l;
- }
-
- template <typename T>
- inline Type *find (T v) {
- for (unsigned int i = 0; i < len; i++)
- if (array[i] == v)
- return &array[i];
- return nullptr;
- }
- template <typename T>
- inline const Type *find (T v) const {
- for (unsigned int i = 0; i < len; i++)
- if (array[i] == v)
- return &array[i];
- return nullptr;
- }
-
- inline void qsort (void)
- {
- ::qsort (array, len, sizeof (Type), Type::cmp);
- }
-
- inline void qsort (unsigned int start, unsigned int end)
- {
- ::qsort (array + start, end - start, sizeof (Type), Type::cmp);
- }
-
- template <typename T>
- inline Type *bsearch (T *x)
- {
- unsigned int i;
- return bfind (x, &i) ? &array[i] : nullptr;
- }
- template <typename T>
- inline const Type *bsearch (T *x) const
- {
- unsigned int i;
- return bfind (x, &i) ? &array[i] : nullptr;
- }
- template <typename T>
- inline bool bfind (T *x, unsigned int *i) const
- {
- int min = 0, max = (int) this->len - 1;
- while (min <= max)
- {
- int mid = (min + max) / 2;
- int c = this->array[mid].cmp (x);
- if (c < 0)
- max = mid - 1;
- else if (c > 0)
- min = mid + 1;
- else
- {
- *i = mid;
- return true;
- }
- }
- if (max < 0 || (max < (int) this->len && this->array[max].cmp (x) > 0))
- max++;
- *i = max;
- return false;
- }
-
- inline void finish (void)
- {
- if (array != static_array)
- free (array);
- array = nullptr;
- allocated = len = 0;
- }
-};
-
-template <typename Type>
-struct hb_auto_array_t : hb_prealloced_array_t <Type>
-{
- hb_auto_array_t (void) { hb_prealloced_array_t<Type>::init (); }
- ~hb_auto_array_t (void) { hb_prealloced_array_t<Type>::finish (); }
-};
-
-
-#define HB_LOCKABLE_SET_INIT {HB_PREALLOCED_ARRAY_INIT}
-template <typename item_t, typename lock_t>
-struct hb_lockable_set_t
-{
- hb_prealloced_array_t <item_t, 1> items;
-
- inline void init (void) { items.init (); }
-
- template <typename T>
- inline item_t *replace_or_insert (T v, lock_t &l, bool replace)
- {
- l.lock ();
- item_t *item = items.find (v);
- if (item) {
- if (replace) {
- item_t old = *item;
- *item = v;
- l.unlock ();
- old.finish ();
- }
- else {
- item = nullptr;
- l.unlock ();
- }
- } else {
- item = items.push ();
- if (likely (item))
- *item = v;
- l.unlock ();
- }
- return item;
- }
-
- template <typename T>
- inline void remove (T v, lock_t &l)
- {
- l.lock ();
- item_t *item = items.find (v);
- if (item) {
- item_t old = *item;
- *item = items[items.len - 1];
- items.pop ();
- l.unlock ();
- old.finish ();
- } else {
- l.unlock ();
- }
- }
-
- template <typename T>
- inline bool find (T v, item_t *i, lock_t &l)
- {
- l.lock ();
- item_t *item = items.find (v);
- if (item)
- *i = *item;
- l.unlock ();
- return !!item;
- }
-
- template <typename T>
- inline item_t *find_or_insert (T v, lock_t &l)
- {
- l.lock ();
- item_t *item = items.find (v);
- if (!item) {
- item = items.push ();
- if (likely (item))
- *item = v;
- }
- l.unlock ();
- return item;
- }
-
- inline void finish (lock_t &l)
- {
- if (!items.len) {
- /* No need for locking. */
- items.finish ();
- return;
- }
- l.lock ();
- while (items.len) {
- item_t old = items[items.len - 1];
- items.pop ();
- l.unlock ();
- old.finish ();
- l.lock ();
- }
- items.finish ();
- l.unlock ();
- }
-
-};
-
-
-/* ASCII tag/character handling */
-
-static inline bool ISALPHA (unsigned char c)
-{ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); }
-static inline bool ISALNUM (unsigned char c)
-{ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'); }
-static inline bool ISSPACE (unsigned char c)
-{ return c == ' ' || c =='\f'|| c =='\n'|| c =='\r'|| c =='\t'|| c =='\v'; }
-static inline unsigned char TOUPPER (unsigned char c)
-{ return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c; }
-static inline unsigned char TOLOWER (unsigned char c)
-{ return (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c; }
-
-
-/* HB_NDEBUG disables some sanity checks that are very safe to disable and
- * should be disabled in production systems. If NDEBUG is defined, enable
- * HB_NDEBUG; but if it's desirable that normal assert()s (which are very
- * light-weight) to be enabled, then HB_DEBUG can be defined to disable
- * the costlier checks. */
-#ifdef NDEBUG
-#define HB_NDEBUG
-#endif
-
-
-/* Misc */
-
-template <typename T> class hb_assert_unsigned_t;
-template <> class hb_assert_unsigned_t<unsigned char> {};
-template <> class hb_assert_unsigned_t<unsigned short> {};
-template <> class hb_assert_unsigned_t<unsigned int> {};
-template <> class hb_assert_unsigned_t<unsigned long> {};
-
-template <typename T> static inline bool
-hb_in_range (T u, T lo, T hi)
-{
- /* The sizeof() is here to force template instantiation.
- * I'm sure there are better ways to do this but can't think of
- * one right now. Declaring a variable won't work as HB_UNUSED
- * is unusable on some platforms and unused types are less likely
- * to generate a warning than unused variables. */
- static_assert ((sizeof (hb_assert_unsigned_t<T>) >= 0), "");
-
- /* The casts below are important as if T is smaller than int,
- * the subtract results will become a signed int! */
- return (T)(u - lo) <= (T)(hi - lo);
-}
-
-template <typename T> static inline bool
-hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2)
-{
- return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2);
-}
-
-template <typename T> static inline bool
-hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3)
-{
- return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2) || hb_in_range (u, lo3, hi3);
-}
-
-
-/* Enable bitwise ops on enums marked as flags_t */
-/* To my surprise, looks like the function resolver is happy to silently cast
- * one enum to another... So this doesn't provide the type-checking that I
- * originally had in mind... :(.
- *
- * For MSVC warnings, see: https://github.com/harfbuzz/harfbuzz/pull/163
- */
-#ifdef _MSC_VER
-# pragma warning(disable:4200)
-# pragma warning(disable:4800)
-#endif
-#define HB_MARK_AS_FLAG_T(T) \
- extern "C++" { \
- static inline T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
- static inline T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
- static inline T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \
- static inline T operator ~ (T r) { return T (~(unsigned int) r); } \
- static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
- static inline T& operator &= (T& l, T r) { l = l & r; return l; } \
- static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \
- }
-
-
-/* Useful for set-operations on small enums.
- * For example, for testing "x ∈ {x1, x2, x3}" use:
- * (FLAG_UNSAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
- */
-#define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned int)(x) < 32) + (1U << (unsigned int)(x)))
-#define FLAG_UNSAFE(x) ((unsigned int)(x) < 32 ? (1U << (unsigned int)(x)) : 0)
-#define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(x))
-
-
-template <typename T, typename T2> static inline void
-hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *), T2 *array2)
-{
- for (unsigned int i = 1; i < len; i++)
- {
- unsigned int j = i;
- while (j && compar (&array[j - 1], &array[i]) > 0)
- j--;
- if (i == j)
- continue;
- /* Move item i to occupy place for item j, shift what's in between. */
- {
- T t = array[i];
- memmove (&array[j + 1], &array[j], (i - j) * sizeof (T));
- array[j] = t;
- }
- if (array2)
- {
- T2 t = array2[i];
- memmove (&array2[j + 1], &array2[j], (i - j) * sizeof (T2));
- array2[j] = t;
- }
- }
-}
-
-template <typename T> static inline void
-hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *))
-{
- hb_stable_sort (array, len, compar, (int *) nullptr);
-}
-
-static inline hb_bool_t
-hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *out)
-{
- /* Pain because we don't know whether s is nul-terminated. */
- char buf[64];
- len = MIN (ARRAY_LENGTH (buf) - 1, len);
- strncpy (buf, s, len);
- buf[len] = '\0';
-
- char *end;
- errno = 0;
- unsigned long v = strtoul (buf, &end, base);
- if (errno) return false;
- if (*end) return false;
- *out = v;
- return true;
-}
-
-
-/* Vectorization */
-
-struct HbOpOr
-{
- static const bool passthru_left = true;
- static const bool passthru_right = true;
- template <typename T> static void process (T &o, const T &a, const T &b) { o = a | b; }
-};
-struct HbOpAnd
-{
- static const bool passthru_left = false;
- static const bool passthru_right = false;
- template <typename T> static void process (T &o, const T &a, const T &b) { o = a & b; }
-};
-struct HbOpMinus
-{
- static const bool passthru_left = true;
- static const bool passthru_right = false;
- template <typename T> static void process (T &o, const T &a, const T &b) { o = a & ~b; }
-};
-struct HbOpXor
-{
- static const bool passthru_left = true;
- static const bool passthru_right = true;
- template <typename T> static void process (T &o, const T &a, const T &b) { o = a ^ b; }
-};
-
-/* Type behaving similar to vectorized vars defined using __attribute__((vector_size(...))). */
-template <typename elt_t, unsigned int byte_size>
-struct hb_vector_size_t
-{
- elt_t& operator [] (unsigned int i) { return v[i]; }
- const elt_t& operator [] (unsigned int i) const { return v[i]; }
-
- template <class Op>
- inline hb_vector_size_t process (const hb_vector_size_t &o) const
- {
- hb_vector_size_t r;
- for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
- Op::process (r.v[i], v[i], o.v[i]);
- return r;
- }
- inline hb_vector_size_t operator | (const hb_vector_size_t &o) const
- { return process<HbOpOr> (o); }
- inline hb_vector_size_t operator & (const hb_vector_size_t &o) const
- { return process<HbOpAnd> (o); }
- inline hb_vector_size_t operator ^ (const hb_vector_size_t &o) const
- { return process<HbOpXor> (o); }
- inline hb_vector_size_t operator ~ () const
- {
- hb_vector_size_t r;
- for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
- r.v[i] = ~v[i];
- return r;
- }
-
- private:
- static_assert (byte_size / sizeof (elt_t) * sizeof (elt_t) == byte_size, "");
- elt_t v[byte_size / sizeof (elt_t)];
-};
-
-/* The `vector_size' attribute was introduced in gcc 3.1. */
-#if defined( __GNUC__ ) && ( __GNUC__ >= 4 )
-#define HAVE_VECTOR_SIZE 1
-#endif
-
-
-/* Global runtime options. */
-
-struct hb_options_t
-{
- unsigned int initialized : 1;
- unsigned int uniscribe_bug_compatible : 1;
-};
-
-union hb_options_union_t {
- unsigned int i;
- hb_options_t opts;
-};
-static_assert ((sizeof (int) == sizeof (hb_options_union_t)), "");
-
-HB_INTERNAL void
-_hb_options_init (void);
-
-extern HB_INTERNAL hb_options_union_t _hb_options;
-
-static inline hb_options_t
-hb_options (void)
-{
- if (unlikely (!_hb_options.i))
- _hb_options_init ();
-
- return _hb_options.opts;
-}
-
-/* Size signifying variable-sized array */
-#define VAR 1
-
-
-/* String type. */
-
-struct hb_string_t
-{
- inline hb_string_t (void) : bytes (nullptr), len (0) {}
- inline hb_string_t (const char *bytes_, unsigned int len_) : bytes (bytes_), len (len_) {}
-
- inline int cmp (const hb_string_t &a) const
- {
- if (len != a.len)
- return (int) a.len - (int) len;
-
- return memcmp (a.bytes, bytes, len);
- }
- static inline int cmp (const void *pa, const void *pb)
- {
- hb_string_t *a = (hb_string_t *) pa;
- hb_string_t *b = (hb_string_t *) pb;
- return b->cmp (*a);
- }
-
- const char *bytes;
- unsigned int len;
-};
-
-
-#endif /* HB_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-sanitize.hh b/src/3rdparty/harfbuzz-ng/src/hb-sanitize.hh
new file mode 100644
index 0000000000..7859c6a2c6
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-sanitize.hh
@@ -0,0 +1,401 @@
+/*
+ * Copyright © 2007,2008,2009,2010 Red Hat, Inc.
+ * Copyright © 2012,2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_SANITIZE_HH
+#define HB_SANITIZE_HH
+
+#include "hb.hh"
+#include "hb-blob.hh"
+#include "hb-dispatch.hh"
+
+
+/*
+ * Sanitize
+ *
+ *
+ * === Introduction ===
+ *
+ * The sanitize machinery is at the core of our zero-cost font loading. We
+ * mmap() font file into memory and create a blob out of it. Font subtables
+ * are returned as a readonly sub-blob of the main font blob. These table
+ * blobs are then sanitized before use, to ensure invalid memory access does
+ * not happen. The toplevel sanitize API use is like, eg. to load the 'head'
+ * table:
+ *
+ * hb_blob_t *head_blob = hb_sanitize_context_t ().reference_table<OT::head> (face);
+ *
+ * The blob then can be converted to a head table struct with:
+ *
+ * const head *head_table = head_blob->as<head> ();
+ *
+ * What the reference_table does is, to call hb_face_reference_table() to load
+ * the table blob, sanitize it and return either the sanitized blob, or empty
+ * blob if sanitization failed. The blob->as() function returns the null
+ * object of its template type argument if the blob is empty. Otherwise, it
+ * just casts the blob contents to the desired type.
+ *
+ * Sanitizing a blob of data with a type T works as follows (with minor
+ * simplification):
+ *
+ * - Cast blob content to T*, call sanitize() method of it,
+ * - If sanitize succeeded, return blob.
+ * - Otherwise, if blob is not writable, try making it writable,
+ * or copy if cannot be made writable in-place,
+ * - Call sanitize() again. Return blob if sanitize succeeded.
+ * - Return empty blob otherwise.
+ *
+ *
+ * === The sanitize() contract ===
+ *
+ * The sanitize() method of each object type shall return true if it's safe to
+ * call other methods of the object, and false otherwise.
+ *
+ * Note that what sanitize() checks for might align with what the specification
+ * describes as valid table data, but does not have to be. In particular, we
+ * do NOT want to be pedantic and concern ourselves with validity checks that
+ * are irrelevant to our use of the table. On the contrary, we want to be
+ * lenient with error handling and accept invalid data to the extent that it
+ * does not impose extra burden on us.
+ *
+ * Based on the sanitize contract, one can see that what we check for depends
+ * on how we use the data in other table methods. Ie. if other table methods
+ * assume that offsets do NOT point out of the table data block, then that's
+ * something sanitize() must check for (GSUB/GPOS/GDEF/etc work this way). On
+ * the other hand, if other methods do such checks themselves, then sanitize()
+ * does not have to bother with them (glyf/local work this way). The choice
+ * depends on the table structure and sanitize() performance. For example, to
+ * check glyf/loca offsets in sanitize() would cost O(num-glyphs). We try hard
+ * to avoid such costs during font loading. By postponing such checks to the
+ * actual glyph loading, we reduce the sanitize cost to O(1) and total runtime
+ * cost to O(used-glyphs). As such, this is preferred.
+ *
+ * The same argument can be made re GSUB/GPOS/GDEF, but there, the table
+ * structure is so complicated that by checking all offsets at sanitize() time,
+ * we make the code much simpler in other methods, as offsets and referenced
+ * objects do not need to be validated at each use site.
+ */
+
+/* This limits sanitizing time on really broken fonts. */
+#ifndef HB_SANITIZE_MAX_EDITS
+#define HB_SANITIZE_MAX_EDITS 32
+#endif
+#ifndef HB_SANITIZE_MAX_OPS_FACTOR
+#define HB_SANITIZE_MAX_OPS_FACTOR 8
+#endif
+#ifndef HB_SANITIZE_MAX_OPS_MIN
+#define HB_SANITIZE_MAX_OPS_MIN 16384
+#endif
+#ifndef HB_SANITIZE_MAX_OPS_MAX
+#define HB_SANITIZE_MAX_OPS_MAX 0x3FFFFFFF
+#endif
+
+struct hb_sanitize_context_t :
+ hb_dispatch_context_t<hb_sanitize_context_t, bool, HB_DEBUG_SANITIZE>
+{
+ hb_sanitize_context_t () :
+ debug_depth (0),
+ start (nullptr), end (nullptr),
+ max_ops (0),
+ writable (false), edit_count (0),
+ blob (nullptr),
+ num_glyphs (65536),
+ num_glyphs_set (false) {}
+
+ const char *get_name () { return "SANITIZE"; }
+ template <typename T, typename F>
+ bool may_dispatch (const T *obj HB_UNUSED, const F *format)
+ { return format->sanitize (this); }
+ static return_t default_return_value () { return true; }
+ static return_t no_dispatch_return_value () { return false; }
+ bool stop_sublookup_iteration (const return_t r) const { return !r; }
+
+ private:
+ template <typename T, typename ...Ts> auto
+ _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN
+ ( obj.sanitize (this, hb_forward<Ts> (ds)...) )
+ template <typename T, typename ...Ts> auto
+ _dispatch (const T &obj, hb_priority<0>, Ts&&... ds) HB_AUTO_RETURN
+ ( obj.dispatch (this, hb_forward<Ts> (ds)...) )
+ public:
+ template <typename T, typename ...Ts> auto
+ dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN
+ ( _dispatch (obj, hb_prioritize, hb_forward<Ts> (ds)...) )
+
+
+ void init (hb_blob_t *b)
+ {
+ this->blob = hb_blob_reference (b);
+ this->writable = false;
+ }
+
+ void set_num_glyphs (unsigned int num_glyphs_)
+ {
+ num_glyphs = num_glyphs_;
+ num_glyphs_set = true;
+ }
+ unsigned int get_num_glyphs () { return num_glyphs; }
+
+ void set_max_ops (int max_ops_) { max_ops = max_ops_; }
+
+ template <typename T>
+ void set_object (const T *obj)
+ {
+ reset_object ();
+
+ if (!obj) return;
+
+ const char *obj_start = (const char *) obj;
+ if (unlikely (obj_start < this->start || this->end <= obj_start))
+ this->start = this->end = nullptr;
+ else
+ {
+ this->start = obj_start;
+ this->end = obj_start + hb_min (size_t (this->end - obj_start), obj->get_size ());
+ }
+ }
+
+ void reset_object ()
+ {
+ this->start = this->blob->data;
+ this->end = this->start + this->blob->length;
+ assert (this->start <= this->end); /* Must not overflow. */
+ }
+
+ void start_processing ()
+ {
+ reset_object ();
+ this->max_ops = hb_max ((unsigned int) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR,
+ (unsigned) HB_SANITIZE_MAX_OPS_MIN);
+ this->edit_count = 0;
+ this->debug_depth = 0;
+
+ DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1,
+ "start [%p..%p] (%lu bytes)",
+ this->start, this->end,
+ (unsigned long) (this->end - this->start));
+ }
+
+ void end_processing ()
+ {
+ DEBUG_MSG_LEVEL (SANITIZE, this->start, 0, -1,
+ "end [%p..%p] %u edit requests",
+ this->start, this->end, this->edit_count);
+
+ hb_blob_destroy (this->blob);
+ this->blob = nullptr;
+ this->start = this->end = nullptr;
+ }
+
+ unsigned get_edit_count () { return edit_count; }
+
+ bool check_range (const void *base,
+ unsigned int len) const
+ {
+ const char *p = (const char *) base;
+ bool ok = !len ||
+ (this->start <= p &&
+ p <= this->end &&
+ (unsigned int) (this->end - p) >= len &&
+ this->max_ops-- > 0);
+
+ DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
+ "check_range [%p..%p]"
+ " (%d bytes) in [%p..%p] -> %s",
+ p, p + len, len,
+ this->start, this->end,
+ ok ? "OK" : "OUT-OF-RANGE");
+
+ return likely (ok);
+ }
+
+ template <typename T>
+ bool check_range (const T *base,
+ unsigned int a,
+ unsigned int b) const
+ {
+ return !hb_unsigned_mul_overflows (a, b) &&
+ this->check_range (base, a * b);
+ }
+
+ template <typename T>
+ bool check_range (const T *base,
+ unsigned int a,
+ unsigned int b,
+ unsigned int c) const
+ {
+ return !hb_unsigned_mul_overflows (a, b) &&
+ this->check_range (base, a * b, c);
+ }
+
+ template <typename T>
+ bool check_array (const T *base, unsigned int len) const
+ {
+ return this->check_range (base, len, hb_static_size (T));
+ }
+
+ template <typename T>
+ bool check_array (const T *base,
+ unsigned int a,
+ unsigned int b) const
+ {
+ return this->check_range (base, a, b, hb_static_size (T));
+ }
+
+ template <typename Type>
+ bool check_struct (const Type *obj) const
+ { return likely (this->check_range (obj, obj->min_size)); }
+
+ bool may_edit (const void *base, unsigned int len)
+ {
+ if (this->edit_count >= HB_SANITIZE_MAX_EDITS)
+ return false;
+
+ const char *p = (const char *) base;
+ this->edit_count++;
+
+ DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
+ "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s",
+ this->edit_count,
+ p, p + len, len,
+ this->start, this->end,
+ this->writable ? "GRANTED" : "DENIED");
+
+ return this->writable;
+ }
+
+ template <typename Type, typename ValueType>
+ bool try_set (const Type *obj, const ValueType &v)
+ {
+ if (this->may_edit (obj, hb_static_size (Type)))
+ {
+ * const_cast<Type *> (obj) = v;
+ return true;
+ }
+ return false;
+ }
+
+ template <typename Type>
+ hb_blob_t *sanitize_blob (hb_blob_t *blob)
+ {
+ bool sane;
+
+ init (blob);
+
+ retry:
+ DEBUG_MSG_FUNC (SANITIZE, start, "start");
+
+ start_processing ();
+
+ if (unlikely (!start))
+ {
+ end_processing ();
+ return blob;
+ }
+
+ Type *t = reinterpret_cast<Type *> (const_cast<char *> (start));
+
+ sane = t->sanitize (this);
+ if (sane)
+ {
+ if (edit_count)
+ {
+ DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %d edits; going for second round", edit_count);
+
+ /* sanitize again to ensure no toe-stepping */
+ edit_count = 0;
+ sane = t->sanitize (this);
+ if (edit_count) {
+ DEBUG_MSG_FUNC (SANITIZE, start, "requested %d edits in second round; FAILLING", edit_count);
+ sane = false;
+ }
+ }
+ }
+ else
+ {
+ if (edit_count && !writable) {
+ start = hb_blob_get_data_writable (blob, nullptr);
+ end = start + blob->length;
+
+ if (start)
+ {
+ writable = true;
+ /* ok, we made it writable by relocating. try again */
+ DEBUG_MSG_FUNC (SANITIZE, start, "retry");
+ goto retry;
+ }
+ }
+ }
+
+ end_processing ();
+
+ DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED");
+ if (sane)
+ {
+ hb_blob_make_immutable (blob);
+ return blob;
+ }
+ else
+ {
+ hb_blob_destroy (blob);
+ return hb_blob_get_empty ();
+ }
+ }
+
+ template <typename Type>
+ hb_blob_t *reference_table (const hb_face_t *face, hb_tag_t tableTag = Type::tableTag)
+ {
+ if (!num_glyphs_set)
+ set_num_glyphs (hb_face_get_glyph_count (face));
+ return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
+ }
+
+ mutable unsigned int debug_depth;
+ const char *start, *end;
+ mutable int max_ops;
+ private:
+ bool writable;
+ unsigned int edit_count;
+ hb_blob_t *blob;
+ unsigned int num_glyphs;
+ bool num_glyphs_set;
+};
+
+struct hb_sanitize_with_object_t
+{
+ template <typename T>
+ hb_sanitize_with_object_t (hb_sanitize_context_t *c, const T& obj) : c (c)
+ { c->set_object (obj); }
+ ~hb_sanitize_with_object_t ()
+ { c->reset_object (); }
+
+ private:
+ hb_sanitize_context_t *c;
+};
+
+
+#endif /* HB_SANITIZE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-serialize.hh b/src/3rdparty/harfbuzz-ng/src/hb-serialize.hh
new file mode 100644
index 0000000000..4c674b1b1a
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-serialize.hh
@@ -0,0 +1,466 @@
+/*
+ * Copyright © 2007,2008,2009,2010 Red Hat, Inc.
+ * Copyright © 2012,2018 Google, Inc.
+ * Copyright © 2019 Facebook, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ * Facebook Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_SERIALIZE_HH
+#define HB_SERIALIZE_HH
+
+#include "hb.hh"
+#include "hb-blob.hh"
+#include "hb-map.hh"
+#include "hb-pool.hh"
+
+
+/*
+ * Serialize
+ */
+
+struct hb_serialize_context_t
+{
+ typedef unsigned objidx_t;
+
+ struct range_t
+ {
+ char *head, *tail;
+ };
+
+ struct object_t : range_t
+ {
+ void fini () { links.fini (); }
+
+ bool operator == (const object_t &o) const
+ {
+ return (tail - head == o.tail - o.head)
+ && (links.length == o.links.length)
+ && 0 == hb_memcmp (head, o.head, tail - head)
+ && links.as_bytes () == o.links.as_bytes ();
+ }
+ uint32_t hash () const
+ {
+ return hb_bytes_t (head, tail - head).hash () ^
+ links.as_bytes ().hash ();
+ }
+
+ struct link_t
+ {
+ bool is_wide: 1;
+ unsigned position : 31;
+ unsigned bias;
+ objidx_t objidx;
+ };
+
+ hb_vector_t<link_t> links;
+ object_t *next;
+ };
+
+ range_t snapshot () { range_t s = {head, tail} ; return s; }
+
+
+ hb_serialize_context_t (void *start_, unsigned int size) :
+ start ((char *) start_),
+ end (start + size),
+ current (nullptr)
+ { reset (); }
+ ~hb_serialize_context_t () { fini (); }
+
+ void fini ()
+ {
+ for (object_t *_ : ++hb_iter (packed)) _->fini ();
+ packed.fini ();
+ this->packed_map.fini ();
+
+ while (current)
+ {
+ auto *_ = current;
+ current = current->next;
+ _->fini ();
+ }
+ object_pool.fini ();
+ }
+
+ bool in_error () const { return !this->successful; }
+
+ void reset ()
+ {
+ this->successful = true;
+ this->ran_out_of_room = false;
+ this->head = this->start;
+ this->tail = this->end;
+ this->debug_depth = 0;
+
+ fini ();
+ this->packed.push (nullptr);
+ }
+
+ bool check_success (bool success)
+ { return this->successful && (success || (err_other_error (), false)); }
+
+ template <typename T1, typename T2>
+ bool check_equal (T1 &&v1, T2 &&v2)
+ { return check_success (v1 == v2); }
+
+ template <typename T1, typename T2>
+ bool check_assign (T1 &v1, T2 &&v2)
+ { return check_equal (v1 = v2, v2); }
+
+ template <typename T> bool propagate_error (T &&obj)
+ { return check_success (!hb_deref (obj).in_error ()); }
+
+ template <typename T1, typename... Ts> bool propagate_error (T1 &&o1, Ts&&... os)
+ { return propagate_error (hb_forward<T1> (o1)) &&
+ propagate_error (hb_forward<Ts> (os)...); }
+
+ /* To be called around main operation. */
+ template <typename Type>
+ Type *start_serialize ()
+ {
+ DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, +1,
+ "start [%p..%p] (%lu bytes)",
+ this->start, this->end,
+ (unsigned long) (this->end - this->start));
+
+ assert (!current);
+ return push<Type> ();
+ }
+ void end_serialize ()
+ {
+ DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, -1,
+ "end [%p..%p] serialized %u bytes; %s",
+ this->start, this->end,
+ (unsigned) (this->head - this->start),
+ this->successful ? "successful" : "UNSUCCESSFUL");
+
+ propagate_error (packed, packed_map);
+
+ if (unlikely (!current)) return;
+ assert (!current->next);
+
+ /* Only "pack" if there exist other objects... Otherwise, don't bother.
+ * Saves a move. */
+ if (packed.length <= 1)
+ return;
+
+ pop_pack ();
+
+ resolve_links ();
+ }
+
+ template <typename Type = void>
+ Type *push ()
+ {
+ object_t *obj = object_pool.alloc ();
+ if (unlikely (!obj))
+ check_success (false);
+ else
+ {
+ obj->head = head;
+ obj->tail = tail;
+ obj->next = current;
+ current = obj;
+ }
+ return start_embed<Type> ();
+ }
+ void pop_discard ()
+ {
+ object_t *obj = current;
+ if (unlikely (!obj)) return;
+ current = current->next;
+ revert (*obj);
+ obj->fini ();
+ object_pool.free (obj);
+ }
+ objidx_t pop_pack ()
+ {
+ object_t *obj = current;
+ if (unlikely (!obj)) return 0;
+ current = current->next;
+ obj->tail = head;
+ obj->next = nullptr;
+ unsigned len = obj->tail - obj->head;
+ head = obj->head; /* Rewind head. */
+
+ if (!len)
+ {
+ assert (!obj->links.length);
+ return 0;
+ }
+
+ objidx_t objidx = packed_map.get (obj);
+ if (objidx)
+ {
+ obj->fini ();
+ return objidx;
+ }
+
+ tail -= len;
+ memmove (tail, obj->head, len);
+
+ obj->head = tail;
+ obj->tail = tail + len;
+
+ packed.push (obj);
+
+ if (unlikely (packed.in_error ()))
+ return 0;
+
+ objidx = packed.length - 1;
+
+ packed_map.set (obj, objidx);
+
+ return objidx;
+ }
+
+ void revert (range_t snap)
+ {
+ assert (snap.head <= head);
+ assert (tail <= snap.tail);
+ head = snap.head;
+ tail = snap.tail;
+ discard_stale_objects ();
+ }
+
+ void discard_stale_objects ()
+ {
+ while (packed.length > 1 &&
+ packed.tail ()->head < tail)
+ {
+ packed_map.del (packed.tail ());
+ assert (!packed.tail ()->next);
+ packed.tail ()->fini ();
+ packed.pop ();
+ }
+ if (packed.length > 1)
+ assert (packed.tail ()->head == tail);
+ }
+
+ template <typename T>
+ void add_link (T &ofs, objidx_t objidx, const void *base = nullptr)
+ {
+ static_assert (sizeof (T) == 2 || sizeof (T) == 4, "");
+
+ if (!objidx)
+ return;
+
+ assert (current);
+ assert (current->head <= (const char *) &ofs);
+
+ if (!base)
+ base = current->head;
+ else
+ assert (current->head <= (const char *) base);
+
+ auto& link = *current->links.push ();
+ link.is_wide = sizeof (T) == 4;
+ link.position = (const char *) &ofs - current->head;
+ link.bias = (const char *) base - current->head;
+ link.objidx = objidx;
+ }
+
+ void resolve_links ()
+ {
+ if (unlikely (in_error ())) return;
+
+ assert (!current);
+ assert (packed.length > 1);
+
+ for (const object_t* parent : ++hb_iter (packed))
+ for (const object_t::link_t &link : parent->links)
+ {
+ const object_t* child = packed[link.objidx];
+ assert (link.bias <= (size_t) (parent->tail - parent->head));
+ unsigned offset = (child->head - parent->head) - link.bias;
+
+ if (link.is_wide)
+ {
+ auto &off = * ((BEInt<uint32_t, 4> *) (parent->head + link.position));
+ assert (0 == off);
+ check_assign (off, offset);
+ }
+ else
+ {
+ auto &off = * ((BEInt<uint16_t, 2> *) (parent->head + link.position));
+ assert (0 == off);
+ check_assign (off, offset);
+ }
+ }
+ }
+
+ unsigned int length () const { return this->head - current->head; }
+
+ void align (unsigned int alignment)
+ {
+ unsigned int l = length () % alignment;
+ if (l)
+ allocate_size<void> (alignment - l);
+ }
+
+ template <typename Type = void>
+ Type *start_embed (const Type *obj HB_UNUSED = nullptr) const
+ { return reinterpret_cast<Type *> (this->head); }
+ template <typename Type>
+ Type *start_embed (const Type &obj) const
+ { return start_embed (hb_addressof (obj)); }
+
+ /* Following two functions exist to allow setting breakpoint on. */
+ void err_ran_out_of_room () { this->ran_out_of_room = true; }
+ void err_other_error () { this->successful = false; }
+
+ template <typename Type>
+ Type *allocate_size (unsigned int size)
+ {
+ if (unlikely (!this->successful)) return nullptr;
+
+ if (this->tail - this->head < ptrdiff_t (size))
+ {
+ err_ran_out_of_room ();
+ this->successful = false;
+ return nullptr;
+ }
+ memset (this->head, 0, size);
+ char *ret = this->head;
+ this->head += size;
+ return reinterpret_cast<Type *> (ret);
+ }
+
+ template <typename Type>
+ Type *allocate_min ()
+ { return this->allocate_size<Type> (Type::min_size); }
+
+ template <typename Type>
+ Type *embed (const Type *obj)
+ {
+ unsigned int size = obj->get_size ();
+ Type *ret = this->allocate_size<Type> (size);
+ if (unlikely (!ret)) return nullptr;
+ memcpy (ret, obj, size);
+ return ret;
+ }
+ template <typename Type>
+ Type *embed (const Type &obj)
+ { return embed (hb_addressof (obj)); }
+
+ template <typename Type, typename ...Ts> auto
+ _copy (const Type &src, hb_priority<1>, Ts&&... ds) HB_RETURN
+ (Type *, src.copy (this, hb_forward<Ts> (ds)...))
+
+ template <typename Type> auto
+ _copy (const Type &src, hb_priority<0>) -> decltype (&(hb_declval<Type> () = src))
+ {
+ Type *ret = this->allocate_size<Type> (sizeof (Type));
+ if (unlikely (!ret)) return nullptr;
+ *ret = src;
+ return ret;
+ }
+
+ /* Like embed, but active: calls obj.operator=() or obj.copy() to transfer data
+ * instead of memcpy(). */
+ template <typename Type, typename ...Ts>
+ Type *copy (const Type &src, Ts&&... ds)
+ { return _copy (src, hb_prioritize, hb_forward<Ts> (ds)...); }
+ template <typename Type, typename ...Ts>
+ Type *copy (const Type *src, Ts&&... ds)
+ { return copy (*src, hb_forward<Ts> (ds)...); }
+
+ template <typename Type>
+ hb_serialize_context_t& operator << (const Type &obj) & { embed (obj); return *this; }
+
+ template <typename Type>
+ Type *extend_size (Type *obj, unsigned int size)
+ {
+ assert (this->start <= (char *) obj);
+ assert ((char *) obj <= this->head);
+ assert ((char *) obj + size >= this->head);
+ if (unlikely (!this->allocate_size<Type> (((char *) obj) + size - this->head))) return nullptr;
+ return reinterpret_cast<Type *> (obj);
+ }
+ template <typename Type>
+ Type *extend_size (Type &obj, unsigned int size)
+ { return extend_size (hb_addressof (obj), size); }
+
+ template <typename Type>
+ Type *extend_min (Type *obj) { return extend_size (obj, obj->min_size); }
+ template <typename Type>
+ Type *extend_min (Type &obj) { return extend_min (hb_addressof (obj)); }
+
+ template <typename Type, typename ...Ts>
+ Type *extend (Type *obj, Ts&&... ds)
+ { return extend_size (obj, obj->get_size (hb_forward<Ts> (ds)...)); }
+ template <typename Type, typename ...Ts>
+ Type *extend (Type &obj, Ts&&... ds)
+ { return extend (hb_addressof (obj), hb_forward<Ts> (ds)...); }
+
+ /* Output routines. */
+ hb_bytes_t copy_bytes () const
+ {
+ assert (this->successful);
+ /* Copy both items from head side and tail side... */
+ unsigned int len = (this->head - this->start)
+ + (this->end - this->tail);
+
+ char *p = (char *) malloc (len);
+ if (unlikely (!p)) return hb_bytes_t ();
+
+ memcpy (p, this->start, this->head - this->start);
+ memcpy (p + (this->head - this->start), this->tail, this->end - this->tail);
+ return hb_bytes_t (p, len);
+ }
+ template <typename Type>
+ Type *copy () const
+ { return reinterpret_cast<Type *> ((char *) copy_bytes ().arrayZ); }
+ hb_blob_t *copy_blob () const
+ {
+ hb_bytes_t b = copy_bytes ();
+ return hb_blob_create (b.arrayZ, b.length,
+ HB_MEMORY_MODE_WRITABLE,
+ (char *) b.arrayZ, free);
+ }
+
+ public: /* TODO Make private. */
+ char *start, *head, *tail, *end;
+ unsigned int debug_depth;
+ bool successful;
+ bool ran_out_of_room;
+
+ private:
+
+ /* Object memory pool. */
+ hb_pool_t<object_t> object_pool;
+
+ /* Stack of currently under construction objects. */
+ object_t *current;
+
+ /* Stack of packed objects. Object 0 is always nil object. */
+ hb_vector_t<object_t *> packed;
+
+ /* Map view of packed objects. */
+ hb_hashmap_t<const object_t *, objidx_t, nullptr, 0> packed_map;
+};
+
+
+#endif /* HB_SERIALIZE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-set-digest-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-set-digest-private.hh
deleted file mode 100644
index e099a82641..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-set-digest-private.hh
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright © 2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_SET_DIGEST_PRIVATE_HH
-#define HB_SET_DIGEST_PRIVATE_HH
-
-#include "hb-private.hh"
-
-/*
- * The set digests here implement various "filters" that support
- * "approximate member query". Conceptually these are like Bloom
- * Filter and Quotient Filter, however, much smaller, faster, and
- * designed to fit the requirements of our uses for glyph coverage
- * queries.
- *
- * Our filters are highly accurate if the lookup covers fairly local
- * set of glyphs, but fully flooded and ineffective if coverage is
- * all over the place.
- *
- * The frozen-set can be used instead of a digest, to trade more
- * memory for 100% accuracy, but in practice, that doesn't look like
- * an attractive trade-off.
- */
-
-template <typename mask_t, unsigned int shift>
-struct hb_set_digest_lowest_bits_t
-{
- ASSERT_POD ();
-
- static const unsigned int mask_bytes = sizeof (mask_t);
- static const unsigned int mask_bits = sizeof (mask_t) * 8;
- static const unsigned int num_bits = 0
- + (mask_bytes >= 1 ? 3 : 0)
- + (mask_bytes >= 2 ? 1 : 0)
- + (mask_bytes >= 4 ? 1 : 0)
- + (mask_bytes >= 8 ? 1 : 0)
- + (mask_bytes >= 16? 1 : 0)
- + 0;
-
- static_assert ((shift < sizeof (hb_codepoint_t) * 8), "");
- static_assert ((shift + num_bits <= sizeof (hb_codepoint_t) * 8), "");
-
- inline void init (void) {
- mask = 0;
- }
-
- inline void add (hb_codepoint_t g) {
- mask |= mask_for (g);
- }
-
- inline bool add_range (hb_codepoint_t a, hb_codepoint_t b) {
- if ((b >> shift) - (a >> shift) >= mask_bits - 1)
- mask = (mask_t) -1;
- else {
- mask_t ma = mask_for (a);
- mask_t mb = mask_for (b);
- mask |= mb + (mb - ma) - (mb < ma);
- }
- return true;
- }
-
- template <typename T>
- inline void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
- {
- for (unsigned int i = 0; i < count; i++)
- {
- add (*array);
- array = (const T *) (stride + (const char *) array);
- }
- }
- template <typename T>
- inline bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
- {
- for (unsigned int i = 0; i < count; i++)
- {
- add (*array);
- array = (const T *) (stride + (const char *) array);
- }
- return true;
- }
-
- inline bool may_have (hb_codepoint_t g) const {
- return !!(mask & mask_for (g));
- }
-
- private:
-
- static inline mask_t mask_for (hb_codepoint_t g) {
- return ((mask_t) 1) << ((g >> shift) & (mask_bits - 1));
- }
- mask_t mask;
-};
-
-template <typename head_t, typename tail_t>
-struct hb_set_digest_combiner_t
-{
- ASSERT_POD ();
-
- inline void init (void) {
- head.init ();
- tail.init ();
- }
-
- inline void add (hb_codepoint_t g) {
- head.add (g);
- tail.add (g);
- }
-
- inline bool add_range (hb_codepoint_t a, hb_codepoint_t b) {
- head.add_range (a, b);
- tail.add_range (a, b);
- return true;
- }
- template <typename T>
- inline void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
- {
- head.add_array (array, count, stride);
- tail.add_array (array, count, stride);
- }
- template <typename T>
- inline bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
- {
- head.add_sorted_array (array, count, stride);
- tail.add_sorted_array (array, count, stride);
- return true;
- }
-
- inline bool may_have (hb_codepoint_t g) const {
- return head.may_have (g) && tail.may_have (g);
- }
-
- private:
- head_t head;
- tail_t tail;
-};
-
-
-/*
- * hb_set_digest_t
- *
- * This is a combination of digests that performs "best".
- * There is not much science to this: it's a result of intuition
- * and testing.
- */
-typedef hb_set_digest_combiner_t
-<
- hb_set_digest_lowest_bits_t<unsigned long, 4>,
- hb_set_digest_combiner_t
- <
- hb_set_digest_lowest_bits_t<unsigned long, 0>,
- hb_set_digest_lowest_bits_t<unsigned long, 9>
- >
-> hb_set_digest_t;
-
-
-#endif /* HB_SET_DIGEST_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-set-digest.hh b/src/3rdparty/harfbuzz-ng/src/hb-set-digest.hh
new file mode 100644
index 0000000000..b97526f775
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-set-digest.hh
@@ -0,0 +1,174 @@
+/*
+ * Copyright © 2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_SET_DIGEST_HH
+#define HB_SET_DIGEST_HH
+
+#include "hb.hh"
+
+/*
+ * The set digests here implement various "filters" that support
+ * "approximate member query". Conceptually these are like Bloom
+ * Filter and Quotient Filter, however, much smaller, faster, and
+ * designed to fit the requirements of our uses for glyph coverage
+ * queries.
+ *
+ * Our filters are highly accurate if the lookup covers fairly local
+ * set of glyphs, but fully flooded and ineffective if coverage is
+ * all over the place.
+ *
+ * The frozen-set can be used instead of a digest, to trade more
+ * memory for 100% accuracy, but in practice, that doesn't look like
+ * an attractive trade-off.
+ */
+
+template <typename mask_t, unsigned int shift>
+struct hb_set_digest_lowest_bits_t
+{
+ static constexpr unsigned mask_bytes = sizeof (mask_t);
+ static constexpr unsigned mask_bits = sizeof (mask_t) * 8;
+ static constexpr unsigned num_bits = 0
+ + (mask_bytes >= 1 ? 3 : 0)
+ + (mask_bytes >= 2 ? 1 : 0)
+ + (mask_bytes >= 4 ? 1 : 0)
+ + (mask_bytes >= 8 ? 1 : 0)
+ + (mask_bytes >= 16? 1 : 0)
+ + 0;
+
+ static_assert ((shift < sizeof (hb_codepoint_t) * 8), "");
+ static_assert ((shift + num_bits <= sizeof (hb_codepoint_t) * 8), "");
+
+ void init () { mask = 0; }
+
+ void add (hb_codepoint_t g) { mask |= mask_for (g); }
+
+ bool add_range (hb_codepoint_t a, hb_codepoint_t b)
+ {
+ if ((b >> shift) - (a >> shift) >= mask_bits - 1)
+ mask = (mask_t) -1;
+ else {
+ mask_t ma = mask_for (a);
+ mask_t mb = mask_for (b);
+ mask |= mb + (mb - ma) - (mb < ma);
+ }
+ return true;
+ }
+
+ template <typename T>
+ void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+ {
+ for (unsigned int i = 0; i < count; i++)
+ {
+ add (*array);
+ array = (const T *) (stride + (const char *) array);
+ }
+ }
+ template <typename T>
+ bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+ {
+ for (unsigned int i = 0; i < count; i++)
+ {
+ add (*array);
+ array = (const T *) (stride + (const char *) array);
+ }
+ return true;
+ }
+
+ bool may_have (hb_codepoint_t g) const
+ { return !!(mask & mask_for (g)); }
+
+ private:
+
+ static mask_t mask_for (hb_codepoint_t g)
+ { return ((mask_t) 1) << ((g >> shift) & (mask_bits - 1)); }
+ mask_t mask;
+};
+
+template <typename head_t, typename tail_t>
+struct hb_set_digest_combiner_t
+{
+ void init ()
+ {
+ head.init ();
+ tail.init ();
+ }
+
+ void add (hb_codepoint_t g)
+ {
+ head.add (g);
+ tail.add (g);
+ }
+
+ bool add_range (hb_codepoint_t a, hb_codepoint_t b)
+ {
+ head.add_range (a, b);
+ tail.add_range (a, b);
+ return true;
+ }
+ template <typename T>
+ void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+ {
+ head.add_array (array, count, stride);
+ tail.add_array (array, count, stride);
+ }
+ template <typename T>
+ bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+ {
+ head.add_sorted_array (array, count, stride);
+ tail.add_sorted_array (array, count, stride);
+ return true;
+ }
+
+ bool may_have (hb_codepoint_t g) const
+ {
+ return head.may_have (g) && tail.may_have (g);
+ }
+
+ private:
+ head_t head;
+ tail_t tail;
+};
+
+
+/*
+ * hb_set_digest_t
+ *
+ * This is a combination of digests that performs "best".
+ * There is not much science to this: it's a result of intuition
+ * and testing.
+ */
+typedef hb_set_digest_combiner_t
+<
+ hb_set_digest_lowest_bits_t<unsigned long, 4>,
+ hb_set_digest_combiner_t
+ <
+ hb_set_digest_lowest_bits_t<unsigned long, 0>,
+ hb_set_digest_lowest_bits_t<unsigned long, 9>
+ >
+> hb_set_digest_t;
+
+
+#endif /* HB_SET_DIGEST_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-set-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-set-private.hh
deleted file mode 100644
index 9c6f3ee37a..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-set-private.hh
+++ /dev/null
@@ -1,577 +0,0 @@
-/*
- * Copyright © 2012,2017 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_SET_PRIVATE_HH
-#define HB_SET_PRIVATE_HH
-
-#include "hb-private.hh"
-#include "hb-object-private.hh"
-
-
-/*
- * hb_set_t
- */
-
-/* TODO Keep a free-list so we can free pages that are completely zeroed. At that
- * point maybe also use a sentinel value for "all-1" pages? */
-
-struct hb_set_t
-{
- struct page_map_t
- {
- inline int cmp (const page_map_t *o) const { return (int) o->major - (int) major; }
-
- uint32_t major;
- uint32_t index;
- };
-
- struct page_t
- {
- inline void init0 (void) { memset (&v, 0, sizeof (v)); }
- inline void init1 (void) { memset (&v, 0xff, sizeof (v)); }
-
- inline unsigned int len (void) const
- { return ARRAY_LENGTH_CONST (v); }
-
- inline bool is_empty (void) const
- {
- for (unsigned int i = 0; i < len (); i++)
- if (v[i])
- return false;
- return true;
- }
-
- inline void add (hb_codepoint_t g) { elt (g) |= mask (g); }
- inline void del (hb_codepoint_t g) { elt (g) &= ~mask (g); }
- inline bool has (hb_codepoint_t g) const { return !!(elt (g) & mask (g)); }
-
- inline void add_range (hb_codepoint_t a, hb_codepoint_t b)
- {
- elt_t *la = &elt (a);
- elt_t *lb = &elt (b);
- if (la == lb)
- *la |= (mask (b) << 1) - mask(a);
- else
- {
- *la |= ~(mask (a) - 1);
- la++;
-
- memset (la, 0xff, (char *) lb - (char *) la);
-
- *lb |= ((mask (b) << 1) - 1);
- }
- }
-
- inline bool is_equal (const page_t *other) const
- {
- return 0 == memcmp (&v, &other->v, sizeof (v));
- }
-
- inline unsigned int get_population (void) const
- {
- unsigned int pop = 0;
- for (unsigned int i = 0; i < len (); i++)
- pop += _hb_popcount (v[i]);
- return pop;
- }
-
- inline bool next (hb_codepoint_t *codepoint) const
- {
- unsigned int m = (*codepoint + 1) & MASK;
- if (!m)
- {
- *codepoint = INVALID;
- return false;
- }
- unsigned int i = m / ELT_BITS;
- unsigned int j = m & ELT_MASK;
-
- for (; j < ELT_BITS; j++)
- if (v[i] & (elt_t (1) << j))
- goto found;
- for (i++; i < len (); i++)
- if (v[i])
- for (j = 0; j < ELT_BITS; j++)
- if (v[i] & (elt_t (1) << j))
- goto found;
-
- *codepoint = INVALID;
- return false;
-
- found:
- *codepoint = i * ELT_BITS + j;
- return true;
- }
- inline hb_codepoint_t get_min (void) const
- {
- for (unsigned int i = 0; i < len (); i++)
- if (v[i])
- {
- elt_t e = v[i];
- for (unsigned int j = 0; j < ELT_BITS; j++)
- if (e & (elt_t (1) << j))
- return i * ELT_BITS + j;
- }
- return INVALID;
- }
- inline hb_codepoint_t get_max (void) const
- {
- for (int i = len () - 1; i >= 0; i--)
- if (v[i])
- {
- elt_t e = v[i];
- for (int j = ELT_BITS - 1; j >= 0; j--)
- if (e & (elt_t (1) << j))
- return i * ELT_BITS + j;
- }
- return 0;
- }
-
- static const unsigned int PAGE_BITS = 8192; /* Use to tune. */
- static_assert ((PAGE_BITS & ((PAGE_BITS) - 1)) == 0, "");
-
- typedef uint64_t elt_t;
-
-#if 0 && HAVE_VECTOR_SIZE
- /* The vectorized version does not work with clang as non-const
- * elt() errs "non-const reference cannot bind to vector element". */
- typedef elt_t vector_t __attribute__((vector_size (PAGE_BITS / 8)));
-#else
- typedef hb_vector_size_t<elt_t, PAGE_BITS / 8> vector_t;
-#endif
-
- vector_t v;
-
- static const unsigned int ELT_BITS = sizeof (elt_t) * 8;
- static const unsigned int ELT_MASK = ELT_BITS - 1;
- static const unsigned int BITS = sizeof (vector_t) * 8;
- static const unsigned int MASK = BITS - 1;
- static_assert (PAGE_BITS == BITS, "");
-
- elt_t &elt (hb_codepoint_t g) { return v[(g & MASK) / ELT_BITS]; }
- elt_t const &elt (hb_codepoint_t g) const { return v[(g & MASK) / ELT_BITS]; }
- elt_t mask (hb_codepoint_t g) const { return elt_t (1) << (g & ELT_MASK); }
- };
- static_assert (page_t::PAGE_BITS == sizeof (page_t) * 8, "");
-
- hb_object_header_t header;
- ASSERT_POD ();
- bool in_error;
- hb_prealloced_array_t<page_map_t, 8> page_map;
- hb_prealloced_array_t<page_t, 1> pages;
-
- inline void init (void)
- {
- page_map.init ();
- pages.init ();
- }
- inline void finish (void)
- {
- page_map.finish ();
- pages.finish ();
- }
-
- inline bool resize (unsigned int count)
- {
- if (unlikely (in_error)) return false;
- if (!pages.resize (count) || !page_map.resize (count))
- {
- pages.resize (page_map.len);
- in_error = true;
- return false;
- }
- return true;
- }
-
- inline void clear (void) {
- if (unlikely (hb_object_is_inert (this)))
- return;
- in_error = false;
- page_map.resize (0);
- pages.resize (0);
- }
- inline bool is_empty (void) const {
- unsigned int count = pages.len;
- for (unsigned int i = 0; i < count; i++)
- if (!pages[i].is_empty ())
- return false;
- return true;
- }
-
- inline void add (hb_codepoint_t g)
- {
- if (unlikely (in_error)) return;
- if (unlikely (g == INVALID)) return;
- page_t *page = page_for_insert (g); if (unlikely (!page)) return;
- page->add (g);
- }
- inline bool add_range (hb_codepoint_t a, hb_codepoint_t b)
- {
- if (unlikely (in_error)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
- if (unlikely (a > b || a == INVALID || b == INVALID)) return false;
- unsigned int ma = get_major (a);
- unsigned int mb = get_major (b);
- if (ma == mb)
- {
- page_t *page = page_for_insert (a); if (unlikely (!page)) return false;
- page->add_range (a, b);
- }
- else
- {
- page_t *page = page_for_insert (a); if (unlikely (!page)) return false;
- page->add_range (a, major_start (ma + 1) - 1);
-
- for (unsigned int m = ma + 1; m < mb; m++)
- {
- page = page_for_insert (major_start (m)); if (unlikely (!page)) return false;
- page->init1 ();
- }
-
- page = page_for_insert (b); if (unlikely (!page)) return false;
- page->add_range (major_start (mb), b);
- }
- return true;
- }
-
- template <typename T>
- inline void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
- {
- if (unlikely (in_error)) return;
- if (!count) return;
- hb_codepoint_t g = *array;
- while (count)
- {
- unsigned int m = get_major (g);
- page_t *page = page_for_insert (g); if (unlikely (!page)) return;
- unsigned int start = major_start (m);
- unsigned int end = major_start (m + 1);
- do
- {
- page->add (g);
-
- array++;
- count--;
- }
- while (count && (g = *array, start <= g && g < end));
- }
- }
-
- /* Might return false if array looks unsorted.
- * Used for faster rejection of corrupt data. */
- template <typename T>
- inline bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
- {
- if (unlikely (in_error)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
- if (!count) return true;
- hb_codepoint_t g = *array;
- hb_codepoint_t last_g = g;
- while (count)
- {
- unsigned int m = get_major (g);
- page_t *page = page_for_insert (g); if (unlikely (!page)) return false;
- unsigned int end = major_start (m + 1);
- do
- {
- /* If we try harder we can change the following comparison to <=;
- * Not sure if it's worth it. */
- if (g < last_g) return false;
- last_g = g;
- page->add (g);
-
- array++;
- count--;
- }
- while (count && (g = *array, g < end));
- }
- return true;
- }
-
- inline void del (hb_codepoint_t g)
- {
- if (unlikely (in_error)) return;
- page_t *p = page_for (g);
- if (!p)
- return;
- p->del (g);
- }
- inline void del_range (hb_codepoint_t a, hb_codepoint_t b)
- {
- /* TODO Optimize, like add_range(). */
- if (unlikely (in_error)) return;
- for (unsigned int i = a; i < b + 1; i++)
- del (i);
- }
- inline bool has (hb_codepoint_t g) const
- {
- const page_t *p = page_for (g);
- if (!p)
- return false;
- return p->has (g);
- }
- inline bool intersects (hb_codepoint_t first,
- hb_codepoint_t last) const
- {
- hb_codepoint_t c = first - 1;
- return next (&c) && c <= last;
- }
- inline void set (const hb_set_t *other)
- {
- if (unlikely (in_error)) return;
- unsigned int count = other->pages.len;
- if (!resize (count))
- return;
-
- memcpy (pages.array, other->pages.array, count * sizeof (pages.array[0]));
- memcpy (page_map.array, other->page_map.array, count * sizeof (page_map.array[0]));
- }
-
- inline bool is_equal (const hb_set_t *other) const
- {
- unsigned int na = pages.len;
- unsigned int nb = other->pages.len;
-
- unsigned int a = 0, b = 0;
- for (; a < na && b < nb; )
- {
- if (page_at (a).is_empty ()) { a++; continue; }
- if (other->page_at (b).is_empty ()) { b++; continue; }
- if (page_map[a].major != other->page_map[b].major ||
- !page_at (a).is_equal (&other->page_at (b)))
- return false;
- a++;
- b++;
- }
- for (; a < na; a++)
- if (!page_at (a).is_empty ()) { return false; }
- for (; b < nb; b++)
- if (!other->page_at (b).is_empty ()) { return false; }
-
- return true;
- }
-
- template <class Op>
- inline void process (const hb_set_t *other)
- {
- if (unlikely (in_error)) return;
-
- unsigned int na = pages.len;
- unsigned int nb = other->pages.len;
-
- unsigned int count = 0;
- unsigned int a = 0, b = 0;
- for (; a < na && b < nb; )
- {
- if (page_map[a].major == other->page_map[b].major)
- {
- count++;
- a++;
- b++;
- }
- else if (page_map[a].major < other->page_map[b].major)
- {
- if (Op::passthru_left)
- count++;
- a++;
- }
- else
- {
- if (Op::passthru_right)
- count++;
- b++;
- }
- }
- if (Op::passthru_left)
- count += na - a;
- if (Op::passthru_right)
- count += nb - b;
-
- if (!resize (count))
- return;
-
- /* Process in-place backward. */
- a = na;
- b = nb;
- for (; a && b; )
- {
- if (page_map[a - 1].major == other->page_map[b - 1].major)
- {
- a--;
- b--;
- Op::process (page_at (--count).v, page_at (a).v, other->page_at (b).v);
- }
- else if (page_map[a - 1].major > other->page_map[b - 1].major)
- {
- a--;
- if (Op::passthru_left)
- page_at (--count).v = page_at (a).v;
- }
- else
- {
- b--;
- if (Op::passthru_right)
- page_at (--count).v = other->page_at (b).v;
- }
- }
- if (Op::passthru_left)
- while (a)
- page_at (--count).v = page_at (--a).v;
- if (Op::passthru_right)
- while (b)
- page_at (--count).v = other->page_at (--b).v;
- assert (!count);
- }
-
- inline void union_ (const hb_set_t *other)
- {
- process<HbOpOr> (other);
- }
- inline void intersect (const hb_set_t *other)
- {
- process<HbOpAnd> (other);
- }
- inline void subtract (const hb_set_t *other)
- {
- process<HbOpMinus> (other);
- }
- inline void symmetric_difference (const hb_set_t *other)
- {
- process<HbOpXor> (other);
- }
- inline bool next (hb_codepoint_t *codepoint) const
- {
- if (unlikely (*codepoint == INVALID)) {
- *codepoint = get_min ();
- return *codepoint != INVALID;
- }
-
- page_map_t map = {get_major (*codepoint), 0};
- unsigned int i;
- page_map.bfind (&map, &i);
- if (i < page_map.len)
- {
- if (pages[page_map[i].index].next (codepoint))
- {
- *codepoint += page_map[i].major * page_t::PAGE_BITS;
- return true;
- }
- i++;
- }
- for (; i < page_map.len; i++)
- {
- hb_codepoint_t m = pages[page_map[i].index].get_min ();
- if (m != INVALID)
- {
- *codepoint = page_map[i].major * page_t::PAGE_BITS + m;
- return true;
- }
- }
- *codepoint = INVALID;
- return false;
- }
- inline bool next_range (hb_codepoint_t *first, hb_codepoint_t *last) const
- {
- hb_codepoint_t i;
-
- i = *last;
- if (!next (&i))
- {
- *last = *first = INVALID;
- return false;
- }
-
- *last = *first = i;
- while (next (&i) && i == *last + 1)
- (*last)++;
-
- return true;
- }
-
- inline unsigned int get_population (void) const
- {
- unsigned int pop = 0;
- unsigned int count = pages.len;
- for (unsigned int i = 0; i < count; i++)
- pop += pages[i].get_population ();
- return pop;
- }
- inline hb_codepoint_t get_min (void) const
- {
- unsigned int count = pages.len;
- for (unsigned int i = 0; i < count; i++)
- if (!page_at (i).is_empty ())
- return page_map[i].major * page_t::PAGE_BITS + page_at (i).get_min ();
- return INVALID;
- }
- inline hb_codepoint_t get_max (void) const
- {
- unsigned int count = pages.len;
- for (int i = count - 1; i >= 0; i++)
- if (!page_at (i).is_empty ())
- return page_map[i].major * page_t::PAGE_BITS + page_at (i).get_max ();
- return INVALID;
- }
-
- static const hb_codepoint_t INVALID = HB_SET_VALUE_INVALID;
-
- inline page_t *page_for_insert (hb_codepoint_t g)
- {
- page_map_t map = {get_major (g), pages.len};
- unsigned int i;
- if (!page_map.bfind (&map, &i))
- {
- if (!resize (pages.len + 1))
- return nullptr;
-
- pages[map.index].init0 ();
- memmove (&page_map[i + 1], &page_map[i], (page_map.len - 1 - i) * sizeof (page_map[0]));
- page_map[i] = map;
- }
- return &pages[page_map[i].index];
- }
- inline page_t *page_for (hb_codepoint_t g)
- {
- page_map_t key = {get_major (g)};
- const page_map_t *found = page_map.bsearch (&key);
- if (found)
- return &pages[found->index];
- return nullptr;
- }
- inline const page_t *page_for (hb_codepoint_t g) const
- {
- page_map_t key = {get_major (g)};
- const page_map_t *found = page_map.bsearch (&key);
- if (found)
- return &pages[found->index];
- return nullptr;
- }
- inline page_t &page_at (unsigned int i) { return pages[page_map[i].index]; }
- inline const page_t &page_at (unsigned int i) const { return pages[page_map[i].index]; }
- inline unsigned int get_major (hb_codepoint_t g) const { return g / page_t::PAGE_BITS; }
- inline hb_codepoint_t major_start (unsigned int major) const { return major * page_t::PAGE_BITS; }
-};
-
-
-#endif /* HB_SET_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-set.cc b/src/3rdparty/harfbuzz-ng/src/hb-set.cc
index 0b4f871e85..10638a7e6d 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-set.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-set.cc
@@ -24,10 +24,19 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-set-private.hh"
+#include "hb-set.hh"
-/* Public API */
+/**
+ * SECTION:hb-set
+ * @title: hb-set
+ * @short_description: Object representing a set of integers
+ * @include: hb.h
+ *
+ * Set objects represent a mathematical set of integer values. They are
+ * used in non-shaping API to query certain set of characters or glyphs,
+ * or other integer values.
+ **/
/**
@@ -38,14 +47,14 @@
* Since: 0.9.2
**/
hb_set_t *
-hb_set_create (void)
+hb_set_create ()
{
hb_set_t *set;
if (!(set = hb_object_create<hb_set_t> ()))
return hb_set_get_empty ();
- set->init ();
+ set->init_shallow ();
return set;
}
@@ -58,16 +67,9 @@ hb_set_create (void)
* Since: 0.9.2
**/
hb_set_t *
-hb_set_get_empty (void)
+hb_set_get_empty ()
{
- static const hb_set_t _hb_set_nil = {
- HB_OBJECT_HEADER_STATIC,
- true, /* in_error */
-
- {0} /* elts */
- };
-
- return const_cast<hb_set_t *> (&_hb_set_nil);
+ return const_cast<hb_set_t *> (&Null(hb_set_t));
}
/**
@@ -95,7 +97,7 @@ hb_set_destroy (hb_set_t *set)
{
if (!hb_object_destroy (set)) return;
- set->finish ();
+ set->fini_shallow ();
free (set);
}
@@ -150,9 +152,9 @@ hb_set_get_user_data (hb_set_t *set,
* Since: 0.9.2
**/
hb_bool_t
-hb_set_allocation_successful (const hb_set_t *set HB_UNUSED)
+hb_set_allocation_successful (const hb_set_t *set)
{
- return !set->in_error;
+ return set->successful;
}
/**
@@ -274,11 +276,11 @@ hb_set_del_range (hb_set_t *set,
/**
* hb_set_is_equal:
* @set: a set.
- * @other:
+ * @other: other set.
*
*
*
- * Return value:
+ * Return value: %TRUE if the two sets are equal, %FALSE otherwise.
*
* Since: 0.9.7
**/
@@ -290,6 +292,24 @@ hb_set_is_equal (const hb_set_t *set,
}
/**
+ * hb_set_is_subset:
+ * @set: a set.
+ * @larger_set: other set.
+ *
+ *
+ *
+ * Return value: %TRUE if the @set is a subset of (or equal to) @larger_set, %FALSE otherwise.
+ *
+ * Since: 1.8.1
+ **/
+hb_bool_t
+hb_set_is_subset (const hb_set_t *set,
+ const hb_set_t *larger_set)
+{
+ return set->is_subset (larger_set);
+}
+
+/**
* hb_set_set:
* @set: a set.
* @other:
@@ -369,6 +389,7 @@ hb_set_symmetric_difference (hb_set_t *set,
set->symmetric_difference (other);
}
+#ifndef HB_DISABLE_DEPRECATED
/**
* hb_set_invert:
* @set: a set.
@@ -380,9 +401,10 @@ hb_set_symmetric_difference (hb_set_t *set,
* Deprecated: 1.6.1
**/
void
-hb_set_invert (hb_set_t *set)
+hb_set_invert (hb_set_t *set HB_UNUSED)
{
}
+#endif
/**
* hb_set_get_population:
@@ -437,7 +459,9 @@ hb_set_get_max (const hb_set_t *set)
* @set: a set.
* @codepoint: (inout):
*
- *
+ * Gets the next number in @set that is greater than current value of @codepoint.
+ *
+ * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
*
* Return value: whether there was a next value.
*
@@ -451,6 +475,26 @@ hb_set_next (const hb_set_t *set,
}
/**
+ * hb_set_previous:
+ * @set: a set.
+ * @codepoint: (inout):
+ *
+ * Gets the previous number in @set that is lower than current value of @codepoint.
+ *
+ * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
+ *
+ * Return value: whether there was a previous value.
+ *
+ * Since: 1.8.0
+ **/
+hb_bool_t
+hb_set_previous (const hb_set_t *set,
+ hb_codepoint_t *codepoint)
+{
+ return set->previous (codepoint);
+}
+
+/**
* hb_set_next_range:
* @set: a set.
* @first: (out): output first codepoint in the range.
@@ -459,6 +503,8 @@ hb_set_next (const hb_set_t *set,
* Gets the next consecutive range of numbers in @set that
* are greater than current value of @last.
*
+ * Set @last to %HB_SET_VALUE_INVALID to get started.
+ *
* Return value: whether there was a next range.
*
* Since: 0.9.7
@@ -470,3 +516,26 @@ hb_set_next_range (const hb_set_t *set,
{
return set->next_range (first, last);
}
+
+/**
+ * hb_set_previous_range:
+ * @set: a set.
+ * @first: (inout): input current first and output first codepoint in the range.
+ * @last: (out): output last codepoint in the range.
+ *
+ * Gets the previous consecutive range of numbers in @set that
+ * are less than current value of @first.
+ *
+ * Set @first to %HB_SET_VALUE_INVALID to get started.
+ *
+ * Return value: whether there was a previous range.
+ *
+ * Since: 1.8.0
+ **/
+hb_bool_t
+hb_set_previous_range (const hb_set_t *set,
+ hb_codepoint_t *first,
+ hb_codepoint_t *last)
+{
+ return set->previous_range (first, last);
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-set.h b/src/3rdparty/harfbuzz-ng/src/hb-set.h
index 2ce406073c..ed0e05db2e 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-set.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-set.h
@@ -82,8 +82,6 @@ HB_EXTERN hb_bool_t
hb_set_has (const hb_set_t *set,
hb_codepoint_t codepoint);
-/* Right now limited to 16-bit integers. Eventually will do full codepoint range, sans -1
- * which we will use as a sentinel. */
HB_EXTERN void
hb_set_add (hb_set_t *set,
hb_codepoint_t codepoint);
@@ -106,6 +104,10 @@ HB_EXTERN hb_bool_t
hb_set_is_equal (const hb_set_t *set,
const hb_set_t *other);
+HB_EXTERN hb_bool_t
+hb_set_is_subset (const hb_set_t *set,
+ const hb_set_t *larger_set);
+
HB_EXTERN void
hb_set_set (hb_set_t *set,
const hb_set_t *other);
@@ -129,25 +131,36 @@ hb_set_symmetric_difference (hb_set_t *set,
HB_EXTERN unsigned int
hb_set_get_population (const hb_set_t *set);
-/* Returns -1 if set empty. */
+/* Returns HB_SET_VALUE_INVALID if set empty. */
HB_EXTERN hb_codepoint_t
hb_set_get_min (const hb_set_t *set);
-/* Returns -1 if set empty. */
+/* Returns HB_SET_VALUE_INVALID if set empty. */
HB_EXTERN hb_codepoint_t
hb_set_get_max (const hb_set_t *set);
-/* Pass -1 in to get started. */
+/* Pass HB_SET_VALUE_INVALID in to get started. */
HB_EXTERN hb_bool_t
hb_set_next (const hb_set_t *set,
hb_codepoint_t *codepoint);
-/* Pass -1 for first and last to get started. */
+/* Pass HB_SET_VALUE_INVALID in to get started. */
+HB_EXTERN hb_bool_t
+hb_set_previous (const hb_set_t *set,
+ hb_codepoint_t *codepoint);
+
+/* Pass HB_SET_VALUE_INVALID for first and last to get started. */
HB_EXTERN hb_bool_t
hb_set_next_range (const hb_set_t *set,
hb_codepoint_t *first,
hb_codepoint_t *last);
+/* Pass HB_SET_VALUE_INVALID for first and last to get started. */
+HB_EXTERN hb_bool_t
+hb_set_previous_range (const hb_set_t *set,
+ hb_codepoint_t *first,
+ hb_codepoint_t *last);
+
HB_END_DECLS
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-set.hh b/src/3rdparty/harfbuzz-ng/src/hb-set.hh
new file mode 100644
index 0000000000..36d11c0319
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-set.hh
@@ -0,0 +1,764 @@
+/*
+ * Copyright © 2012,2017 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_SET_HH
+#define HB_SET_HH
+
+#include "hb.hh"
+#include "hb-machinery.hh"
+
+
+/*
+ * hb_set_t
+ */
+
+/* TODO Keep a free-list so we can free pages that are completely zeroed. At that
+ * point maybe also use a sentinel value for "all-1" pages? */
+
+struct hb_set_t
+{
+ HB_DELETE_COPY_ASSIGN (hb_set_t);
+ hb_set_t () { init (); }
+ ~hb_set_t () { fini (); }
+
+ struct page_map_t
+ {
+ int cmp (const page_map_t &o) const { return (int) o.major - (int) major; }
+
+ uint32_t major;
+ uint32_t index;
+ };
+
+ struct page_t
+ {
+ void init0 () { v.clear (); }
+ void init1 () { v.clear (0xFF); }
+
+ unsigned int len () const
+ { return ARRAY_LENGTH_CONST (v); }
+
+ bool is_empty () const
+ {
+ for (unsigned int i = 0; i < len (); i++)
+ if (v[i])
+ return false;
+ return true;
+ }
+
+ void add (hb_codepoint_t g) { elt (g) |= mask (g); }
+ void del (hb_codepoint_t g) { elt (g) &= ~mask (g); }
+ bool get (hb_codepoint_t g) const { return elt (g) & mask (g); }
+
+ void add_range (hb_codepoint_t a, hb_codepoint_t b)
+ {
+ elt_t *la = &elt (a);
+ elt_t *lb = &elt (b);
+ if (la == lb)
+ *la |= (mask (b) << 1) - mask(a);
+ else
+ {
+ *la |= ~(mask (a) - 1);
+ la++;
+
+ memset (la, 0xff, (char *) lb - (char *) la);
+
+ *lb |= ((mask (b) << 1) - 1);
+ }
+ }
+
+ bool is_equal (const page_t *other) const
+ {
+ return 0 == hb_memcmp (&v, &other->v, sizeof (v));
+ }
+
+ unsigned int get_population () const
+ {
+ unsigned int pop = 0;
+ for (unsigned int i = 0; i < len (); i++)
+ pop += hb_popcount (v[i]);
+ return pop;
+ }
+
+ bool next (hb_codepoint_t *codepoint) const
+ {
+ unsigned int m = (*codepoint + 1) & MASK;
+ if (!m)
+ {
+ *codepoint = INVALID;
+ return false;
+ }
+ unsigned int i = m / ELT_BITS;
+ unsigned int j = m & ELT_MASK;
+
+ const elt_t vv = v[i] & ~((elt_t (1) << j) - 1);
+ for (const elt_t *p = &vv; i < len (); p = &v[++i])
+ if (*p)
+ {
+ *codepoint = i * ELT_BITS + elt_get_min (*p);
+ return true;
+ }
+
+ *codepoint = INVALID;
+ return false;
+ }
+ bool previous (hb_codepoint_t *codepoint) const
+ {
+ unsigned int m = (*codepoint - 1) & MASK;
+ if (m == MASK)
+ {
+ *codepoint = INVALID;
+ return false;
+ }
+ unsigned int i = m / ELT_BITS;
+ unsigned int j = m & ELT_MASK;
+
+ const elt_t vv = v[i] & ((elt_t (1) << (j + 1)) - 1);
+ const elt_t *p = &vv;
+ while (true)
+ {
+ if (*p)
+ {
+ *codepoint = i * ELT_BITS + elt_get_max (*p);
+ return true;
+ }
+ if ((int) i <= 0) break;
+ p = &v[--i];
+ }
+
+ *codepoint = INVALID;
+ return false;
+ }
+ hb_codepoint_t get_min () const
+ {
+ for (unsigned int i = 0; i < len (); i++)
+ if (v[i])
+ return i * ELT_BITS + elt_get_min (v[i]);
+ return INVALID;
+ }
+ hb_codepoint_t get_max () const
+ {
+ for (int i = len () - 1; i >= 0; i--)
+ if (v[i])
+ return i * ELT_BITS + elt_get_max (v[i]);
+ return 0;
+ }
+
+ typedef unsigned long long elt_t;
+ static constexpr unsigned PAGE_BITS = 512;
+ static_assert ((PAGE_BITS & ((PAGE_BITS) - 1)) == 0, "");
+
+ static unsigned int elt_get_min (const elt_t &elt) { return hb_ctz (elt); }
+ static unsigned int elt_get_max (const elt_t &elt) { return hb_bit_storage (elt) - 1; }
+
+ typedef hb_vector_size_t<elt_t, PAGE_BITS / 8> vector_t;
+
+ static constexpr unsigned ELT_BITS = sizeof (elt_t) * 8;
+ static constexpr unsigned ELT_MASK = ELT_BITS - 1;
+ static constexpr unsigned BITS = sizeof (vector_t) * 8;
+ static constexpr unsigned MASK = BITS - 1;
+ static_assert ((unsigned) PAGE_BITS == (unsigned) BITS, "");
+
+ elt_t &elt (hb_codepoint_t g) { return v[(g & MASK) / ELT_BITS]; }
+ elt_t const &elt (hb_codepoint_t g) const { return v[(g & MASK) / ELT_BITS]; }
+ elt_t mask (hb_codepoint_t g) const { return elt_t (1) << (g & ELT_MASK); }
+
+ vector_t v;
+ };
+ static_assert (page_t::PAGE_BITS == sizeof (page_t) * 8, "");
+
+ hb_object_header_t header;
+ bool successful; /* Allocations successful */
+ mutable unsigned int population;
+ hb_sorted_vector_t<page_map_t> page_map;
+ hb_vector_t<page_t> pages;
+
+ void init_shallow ()
+ {
+ successful = true;
+ population = 0;
+ page_map.init ();
+ pages.init ();
+ }
+ void init ()
+ {
+ hb_object_init (this);
+ init_shallow ();
+ }
+ void fini_shallow ()
+ {
+ population = 0;
+ page_map.fini ();
+ pages.fini ();
+ }
+ void fini ()
+ {
+ hb_object_fini (this);
+ fini_shallow ();
+ }
+
+ bool in_error () const { return !successful; }
+
+ bool resize (unsigned int count)
+ {
+ if (unlikely (!successful)) return false;
+ if (!pages.resize (count) || !page_map.resize (count))
+ {
+ pages.resize (page_map.length);
+ successful = false;
+ return false;
+ }
+ return true;
+ }
+
+ void reset ()
+ {
+ if (unlikely (hb_object_is_immutable (this)))
+ return;
+ clear ();
+ successful = true;
+ }
+
+ void clear ()
+ {
+ if (unlikely (hb_object_is_immutable (this)))
+ return;
+ population = 0;
+ page_map.resize (0);
+ pages.resize (0);
+ }
+ bool is_empty () const
+ {
+ unsigned int count = pages.length;
+ for (unsigned int i = 0; i < count; i++)
+ if (!pages[i].is_empty ())
+ return false;
+ return true;
+ }
+
+ void dirty () { population = (unsigned int) -1; }
+
+ void add (hb_codepoint_t g)
+ {
+ if (unlikely (!successful)) return;
+ if (unlikely (g == INVALID)) return;
+ dirty ();
+ page_t *page = page_for_insert (g); if (unlikely (!page)) return;
+ page->add (g);
+ }
+ bool add_range (hb_codepoint_t a, hb_codepoint_t b)
+ {
+ if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
+ if (unlikely (a > b || a == INVALID || b == INVALID)) return false;
+ dirty ();
+ unsigned int ma = get_major (a);
+ unsigned int mb = get_major (b);
+ if (ma == mb)
+ {
+ page_t *page = page_for_insert (a); if (unlikely (!page)) return false;
+ page->add_range (a, b);
+ }
+ else
+ {
+ page_t *page = page_for_insert (a); if (unlikely (!page)) return false;
+ page->add_range (a, major_start (ma + 1) - 1);
+
+ for (unsigned int m = ma + 1; m < mb; m++)
+ {
+ page = page_for_insert (major_start (m)); if (unlikely (!page)) return false;
+ page->init1 ();
+ }
+
+ page = page_for_insert (b); if (unlikely (!page)) return false;
+ page->add_range (major_start (mb), b);
+ }
+ return true;
+ }
+
+ template <typename T>
+ void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+ {
+ if (unlikely (!successful)) return;
+ if (!count) return;
+ dirty ();
+ hb_codepoint_t g = *array;
+ while (count)
+ {
+ unsigned int m = get_major (g);
+ page_t *page = page_for_insert (g); if (unlikely (!page)) return;
+ unsigned int start = major_start (m);
+ unsigned int end = major_start (m + 1);
+ do
+ {
+ page->add (g);
+
+ array = &StructAtOffsetUnaligned<T> (array, stride);
+ count--;
+ }
+ while (count && (g = *array, start <= g && g < end));
+ }
+ }
+
+ /* Might return false if array looks unsorted.
+ * Used for faster rejection of corrupt data. */
+ template <typename T>
+ bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+ {
+ if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
+ if (!count) return true;
+ dirty ();
+ hb_codepoint_t g = *array;
+ hb_codepoint_t last_g = g;
+ while (count)
+ {
+ unsigned int m = get_major (g);
+ page_t *page = page_for_insert (g); if (unlikely (!page)) return false;
+ unsigned int end = major_start (m + 1);
+ do
+ {
+ /* If we try harder we can change the following comparison to <=;
+ * Not sure if it's worth it. */
+ if (g < last_g) return false;
+ last_g = g;
+ page->add (g);
+
+ array = (const T *) ((const char *) array + stride);
+ count--;
+ }
+ while (count && (g = *array, g < end));
+ }
+ return true;
+ }
+
+ void del (hb_codepoint_t g)
+ {
+ /* TODO perform op even if !successful. */
+ if (unlikely (!successful)) return;
+ page_t *page = page_for (g);
+ if (!page)
+ return;
+ dirty ();
+ page->del (g);
+ }
+ void del_range (hb_codepoint_t a, hb_codepoint_t b)
+ {
+ /* TODO perform op even if !successful. */
+ /* TODO Optimize, like add_range(). */
+ if (unlikely (!successful)) return;
+ for (unsigned int i = a; i < b + 1; i++)
+ del (i);
+ }
+ bool get (hb_codepoint_t g) const
+ {
+ const page_t *page = page_for (g);
+ if (!page)
+ return false;
+ return page->get (g);
+ }
+
+ /* Has interface. */
+ static constexpr bool SENTINEL = false;
+ typedef bool value_t;
+ value_t operator [] (hb_codepoint_t k) const { return get (k); }
+ bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; }
+ /* Predicate. */
+ bool operator () (hb_codepoint_t k) const { return has (k); }
+
+ /* Sink interface. */
+ hb_set_t& operator << (hb_codepoint_t v) { add (v); return *this; }
+
+ bool intersects (hb_codepoint_t first, hb_codepoint_t last) const
+ {
+ hb_codepoint_t c = first - 1;
+ return next (&c) && c <= last;
+ }
+ void set (const hb_set_t *other)
+ {
+ if (unlikely (!successful)) return;
+ unsigned int count = other->pages.length;
+ if (!resize (count))
+ return;
+ population = other->population;
+ memcpy ((void *) pages, (const void *) other->pages, count * pages.item_size);
+ memcpy ((void *) page_map, (const void *) other->page_map, count * page_map.item_size);
+ }
+
+ bool is_equal (const hb_set_t *other) const
+ {
+ if (get_population () != other->get_population ())
+ return false;
+
+ unsigned int na = pages.length;
+ unsigned int nb = other->pages.length;
+
+ unsigned int a = 0, b = 0;
+ for (; a < na && b < nb; )
+ {
+ if (page_at (a).is_empty ()) { a++; continue; }
+ if (other->page_at (b).is_empty ()) { b++; continue; }
+ if (page_map[a].major != other->page_map[b].major ||
+ !page_at (a).is_equal (&other->page_at (b)))
+ return false;
+ a++;
+ b++;
+ }
+ for (; a < na; a++)
+ if (!page_at (a).is_empty ()) { return false; }
+ for (; b < nb; b++)
+ if (!other->page_at (b).is_empty ()) { return false; }
+
+ return true;
+ }
+
+ bool is_subset (const hb_set_t *larger_set) const
+ {
+ if (get_population () > larger_set->get_population ())
+ return false;
+
+ /* TODO Optimize to use pages. */
+ hb_codepoint_t c = INVALID;
+ while (next (&c))
+ if (!larger_set->has (c))
+ return false;
+
+ return true;
+ }
+
+ template <typename Op>
+ void process (const Op& op, const hb_set_t *other)
+ {
+ if (unlikely (!successful)) return;
+
+ dirty ();
+
+ unsigned int na = pages.length;
+ unsigned int nb = other->pages.length;
+ unsigned int next_page = na;
+
+ unsigned int count = 0, newCount = 0;
+ unsigned int a = 0, b = 0;
+ for (; a < na && b < nb; )
+ {
+ if (page_map[a].major == other->page_map[b].major)
+ {
+ count++;
+ a++;
+ b++;
+ }
+ else if (page_map[a].major < other->page_map[b].major)
+ {
+ if (Op::passthru_left)
+ count++;
+ a++;
+ }
+ else
+ {
+ if (Op::passthru_right)
+ count++;
+ b++;
+ }
+ }
+ if (Op::passthru_left)
+ count += na - a;
+ if (Op::passthru_right)
+ count += nb - b;
+
+ if (count > pages.length)
+ if (!resize (count))
+ return;
+ newCount = count;
+
+ /* Process in-place backward. */
+ a = na;
+ b = nb;
+ for (; a && b; )
+ {
+ if (page_map[a - 1].major == other->page_map[b - 1].major)
+ {
+ a--;
+ b--;
+ count--;
+ page_map[count] = page_map[a];
+ page_at (count).v = op (page_at (a).v, other->page_at (b).v);
+ }
+ else if (page_map[a - 1].major > other->page_map[b - 1].major)
+ {
+ a--;
+ if (Op::passthru_left)
+ {
+ count--;
+ page_map[count] = page_map[a];
+ }
+ }
+ else
+ {
+ b--;
+ if (Op::passthru_right)
+ {
+ count--;
+ page_map[count].major = other->page_map[b].major;
+ page_map[count].index = next_page++;
+ page_at (count).v = other->page_at (b).v;
+ }
+ }
+ }
+ if (Op::passthru_left)
+ while (a)
+ {
+ a--;
+ count--;
+ page_map[count] = page_map [a];
+ }
+ if (Op::passthru_right)
+ while (b)
+ {
+ b--;
+ count--;
+ page_map[count].major = other->page_map[b].major;
+ page_map[count].index = next_page++;
+ page_at (count).v = other->page_at (b).v;
+ }
+ assert (!count);
+ if (pages.length > newCount)
+ resize (newCount);
+ }
+
+ void union_ (const hb_set_t *other)
+ {
+ process (hb_bitwise_or, other);
+ }
+ void intersect (const hb_set_t *other)
+ {
+ process (hb_bitwise_and, other);
+ }
+ void subtract (const hb_set_t *other)
+ {
+ process (hb_bitwise_sub, other);
+ }
+ void symmetric_difference (const hb_set_t *other)
+ {
+ process (hb_bitwise_xor, other);
+ }
+ bool next (hb_codepoint_t *codepoint) const
+ {
+ if (unlikely (*codepoint == INVALID)) {
+ *codepoint = get_min ();
+ return *codepoint != INVALID;
+ }
+
+ page_map_t map = {get_major (*codepoint), 0};
+ unsigned int i;
+ page_map.bfind (map, &i, HB_BFIND_NOT_FOUND_STORE_CLOSEST);
+ if (i < page_map.length && page_map[i].major == map.major)
+ {
+ if (pages[page_map[i].index].next (codepoint))
+ {
+ *codepoint += page_map[i].major * page_t::PAGE_BITS;
+ return true;
+ }
+ i++;
+ }
+ for (; i < page_map.length; i++)
+ {
+ hb_codepoint_t m = pages[page_map[i].index].get_min ();
+ if (m != INVALID)
+ {
+ *codepoint = page_map[i].major * page_t::PAGE_BITS + m;
+ return true;
+ }
+ }
+ *codepoint = INVALID;
+ return false;
+ }
+ bool previous (hb_codepoint_t *codepoint) const
+ {
+ if (unlikely (*codepoint == INVALID)) {
+ *codepoint = get_max ();
+ return *codepoint != INVALID;
+ }
+
+ page_map_t map = {get_major (*codepoint), 0};
+ unsigned int i;
+ page_map.bfind (map, &i, HB_BFIND_NOT_FOUND_STORE_CLOSEST);
+ if (i < page_map.length && page_map[i].major == map.major)
+ {
+ if (pages[page_map[i].index].previous (codepoint))
+ {
+ *codepoint += page_map[i].major * page_t::PAGE_BITS;
+ return true;
+ }
+ }
+ i--;
+ for (; (int) i >= 0; i--)
+ {
+ hb_codepoint_t m = pages[page_map[i].index].get_max ();
+ if (m != INVALID)
+ {
+ *codepoint = page_map[i].major * page_t::PAGE_BITS + m;
+ return true;
+ }
+ }
+ *codepoint = INVALID;
+ return false;
+ }
+ bool next_range (hb_codepoint_t *first, hb_codepoint_t *last) const
+ {
+ hb_codepoint_t i;
+
+ i = *last;
+ if (!next (&i))
+ {
+ *last = *first = INVALID;
+ return false;
+ }
+
+ /* TODO Speed up. */
+ *last = *first = i;
+ while (next (&i) && i == *last + 1)
+ (*last)++;
+
+ return true;
+ }
+ bool previous_range (hb_codepoint_t *first, hb_codepoint_t *last) const
+ {
+ hb_codepoint_t i;
+
+ i = *first;
+ if (!previous (&i))
+ {
+ *last = *first = INVALID;
+ return false;
+ }
+
+ /* TODO Speed up. */
+ *last = *first = i;
+ while (previous (&i) && i == *first - 1)
+ (*first)--;
+
+ return true;
+ }
+
+ unsigned int get_population () const
+ {
+ if (population != (unsigned int) -1)
+ return population;
+
+ unsigned int pop = 0;
+ unsigned int count = pages.length;
+ for (unsigned int i = 0; i < count; i++)
+ pop += pages[i].get_population ();
+
+ population = pop;
+ return pop;
+ }
+ hb_codepoint_t get_min () const
+ {
+ unsigned int count = pages.length;
+ for (unsigned int i = 0; i < count; i++)
+ if (!page_at (i).is_empty ())
+ return page_map[i].major * page_t::PAGE_BITS + page_at (i).get_min ();
+ return INVALID;
+ }
+ hb_codepoint_t get_max () const
+ {
+ unsigned int count = pages.length;
+ for (int i = count - 1; i >= 0; i++)
+ if (!page_at (i).is_empty ())
+ return page_map[(unsigned) i].major * page_t::PAGE_BITS + page_at (i).get_max ();
+ return INVALID;
+ }
+
+ static constexpr hb_codepoint_t INVALID = HB_SET_VALUE_INVALID;
+
+ /*
+ * Iterator implementation.
+ */
+ struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t>
+ {
+ static constexpr bool is_sorted_iterator = true;
+ iter_t (const hb_set_t &s_ = Null(hb_set_t)) :
+ s (&s_), v (INVALID), l (s->get_population () + 1) { __next__ (); }
+
+ typedef hb_codepoint_t __item_t__;
+ hb_codepoint_t __item__ () const { return v; }
+ bool __more__ () const { return v != INVALID; }
+ void __next__ () { s->next (&v); if (l) l--; }
+ void __prev__ () { s->previous (&v); }
+ unsigned __len__ () const { return l; }
+ iter_t end () const { return iter_t (*s); }
+ bool operator != (const iter_t& o) const
+ { return s != o.s || v != o.v; }
+
+ protected:
+ const hb_set_t *s;
+ hb_codepoint_t v;
+ unsigned l;
+ };
+ iter_t iter () const { return iter_t (*this); }
+ operator iter_t () const { return iter (); }
+
+ protected:
+
+ page_t *page_for_insert (hb_codepoint_t g)
+ {
+ page_map_t map = {get_major (g), pages.length};
+ unsigned int i;
+ if (!page_map.bfind (map, &i, HB_BFIND_NOT_FOUND_STORE_CLOSEST))
+ {
+ if (!resize (pages.length + 1))
+ return nullptr;
+
+ pages[map.index].init0 ();
+ memmove (page_map + i + 1,
+ page_map + i,
+ (page_map.length - 1 - i) * page_map.item_size);
+ page_map[i] = map;
+ }
+ return &pages[page_map[i].index];
+ }
+ page_t *page_for (hb_codepoint_t g)
+ {
+ page_map_t key = {get_major (g)};
+ const page_map_t *found = page_map.bsearch (key);
+ if (found)
+ return &pages[found->index];
+ return nullptr;
+ }
+ const page_t *page_for (hb_codepoint_t g) const
+ {
+ page_map_t key = {get_major (g)};
+ const page_map_t *found = page_map.bsearch (key);
+ if (found)
+ return &pages[found->index];
+ return nullptr;
+ }
+ page_t &page_at (unsigned int i) { return pages[page_map[i].index]; }
+ const page_t &page_at (unsigned int i) const { return pages[page_map[i].index]; }
+ unsigned int get_major (hb_codepoint_t g) const { return g / page_t::PAGE_BITS; }
+ hb_codepoint_t major_start (unsigned int major) const { return major * page_t::PAGE_BITS; }
+};
+
+
+#endif /* HB_SET_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shape-plan-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-shape-plan-private.hh
deleted file mode 100644
index aa0413a272..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-shape-plan-private.hh
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright © 2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_SHAPE_PLAN_PRIVATE_HH
-#define HB_SHAPE_PLAN_PRIVATE_HH
-
-#include "hb-private.hh"
-#include "hb-object-private.hh"
-#include "hb-shaper-private.hh"
-
-
-struct hb_shape_plan_t
-{
- hb_object_header_t header;
- ASSERT_POD ();
-
- hb_bool_t default_shaper_list;
- hb_face_t *face_unsafe; /* We don't carry a reference to face. */
- hb_segment_properties_t props;
-
- hb_shape_func_t *shaper_func;
- const char *shaper_name;
-
- hb_feature_t *user_features;
- unsigned int num_user_features;
-
- int *coords;
- unsigned int num_coords;
-
- struct hb_shaper_data_t shaper_data;
-};
-
-#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS \
- , const hb_feature_t *user_features \
- , unsigned int num_user_features \
- , const int *coords \
- , unsigned int num_coords
-#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, shape_plan);
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
-#undef HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
-
-
-#endif /* HB_SHAPE_PLAN_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc b/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc
index 6eeba2b3d1..ffd723d083 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.cc
@@ -24,64 +24,136 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-private.hh"
-#include "hb-debug.hh"
-#include "hb-shape-plan-private.hh"
-#include "hb-shaper-private.hh"
-#include "hb-font-private.hh"
-#include "hb-buffer-private.hh"
-
-
-static void
-hb_shape_plan_plan (hb_shape_plan_t *shape_plan,
- const hb_feature_t *user_features,
- unsigned int num_user_features,
- const int *coords,
- unsigned int num_coords,
- const char * const *shaper_list)
+#include "hb.hh"
+#include "hb-shape-plan.hh"
+#include "hb-shaper.hh"
+#include "hb-font.hh"
+#include "hb-buffer.hh"
+
+
+/**
+ * SECTION:hb-shape-plan
+ * @title: hb-shape-plan
+ * @short_description: Object representing a shaping plan
+ * @include: hb.h
+ *
+ * Shape plans are not used for shaping directly, but can be access to query
+ * certain information about how shaping will perform given a set of input
+ * parameters (script, language, direction, features, etc.)
+ * Most client would not need to deal with shape plans directly.
+ **/
+
+
+/*
+ * hb_shape_plan_key_t
+ */
+
+bool
+hb_shape_plan_key_t::init (bool copy,
+ hb_face_t *face,
+ const hb_segment_properties_t *props,
+ const hb_feature_t *user_features,
+ unsigned int num_user_features,
+ const int *coords,
+ unsigned int num_coords,
+ const char * const *shaper_list)
{
- DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan,
- "num_features=%d num_coords=%d shaper_list=%p",
- num_user_features,
- num_coords,
- shaper_list);
+ hb_feature_t *features = nullptr;
+ if (copy && num_user_features && !(features = (hb_feature_t *) calloc (num_user_features, sizeof (hb_feature_t))))
+ goto bail;
+
+ this->props = *props;
+ this->num_user_features = num_user_features;
+ this->user_features = copy ? features : user_features;
+ if (copy && num_user_features)
+ {
+ memcpy (features, user_features, num_user_features * sizeof (hb_feature_t));
+ /* Make start/end uniform to easier catch bugs. */
+ for (unsigned int i = 0; i < num_user_features; i++)
+ {
+ if (features[0].start != HB_FEATURE_GLOBAL_START)
+ features[0].start = 1;
+ if (features[0].end != HB_FEATURE_GLOBAL_END)
+ features[0].end = 2;
+ }
+ }
+ this->shaper_func = nullptr;
+ this->shaper_name = nullptr;
+#ifndef HB_NO_OT_SHAPE
+ this->ot.init (face, coords, num_coords);
+#endif
- const hb_shaper_pair_t *shapers = _hb_shapers_get ();
+ /*
+ * Choose shaper.
+ */
#define HB_SHAPER_PLAN(shaper) \
HB_STMT_START { \
- if (hb_##shaper##_shaper_face_data_ensure (shape_plan->face_unsafe)) { \
- HB_SHAPER_DATA (shaper, shape_plan) = \
- HB_SHAPER_DATA_CREATE_FUNC (shaper, shape_plan) (shape_plan, \
- user_features, num_user_features, \
- coords, num_coords); \
- shape_plan->shaper_func = _hb_##shaper##_shape; \
- shape_plan->shaper_name = #shaper; \
- return; \
+ if (face->data.shaper) \
+ { \
+ this->shaper_func = _hb_##shaper##_shape; \
+ this->shaper_name = #shaper; \
+ return true; \
} \
} HB_STMT_END
- if (likely (!shaper_list)) {
- for (unsigned int i = 0; i < HB_SHAPERS_COUNT; i++)
- if (0)
+ if (unlikely (shaper_list))
+ {
+ for (; *shaper_list; shaper_list++)
+ if (false)
;
#define HB_SHAPER_IMPLEMENT(shaper) \
- else if (shapers[i].func == _hb_##shaper##_shape) \
+ else if (0 == strcmp (*shaper_list, #shaper)) \
HB_SHAPER_PLAN (shaper);
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
- } else {
- for (; *shaper_list; shaper_list++)
- if (0)
+ }
+ else
+ {
+ const hb_shaper_entry_t *shapers = _hb_shapers_get ();
+ for (unsigned int i = 0; i < HB_SHAPERS_COUNT; i++)
+ if (false)
;
#define HB_SHAPER_IMPLEMENT(shaper) \
- else if (0 == strcmp (*shaper_list, #shaper)) \
+ else if (shapers[i].func == _hb_##shaper##_shape) \
HB_SHAPER_PLAN (shaper);
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
}
-
#undef HB_SHAPER_PLAN
+
+bail:
+ ::free (features);
+ return false;
+}
+
+bool
+hb_shape_plan_key_t::user_features_match (const hb_shape_plan_key_t *other)
+{
+ if (this->num_user_features != other->num_user_features)
+ return false;
+ for (unsigned int i = 0; i < num_user_features; i++)
+ {
+ if (this->user_features[i].tag != other->user_features[i].tag ||
+ this->user_features[i].value != other->user_features[i].value ||
+ (this->user_features[i].start == HB_FEATURE_GLOBAL_START &&
+ this->user_features[i].end == HB_FEATURE_GLOBAL_END) !=
+ (other->user_features[i].start == HB_FEATURE_GLOBAL_START &&
+ other->user_features[i].end == HB_FEATURE_GLOBAL_END))
+ return false;
+ }
+ return true;
+}
+
+bool
+hb_shape_plan_key_t::equal (const hb_shape_plan_key_t *other)
+{
+ return hb_segment_properties_equal (&this->props, &other->props) &&
+ this->user_features_match (other) &&
+#ifndef HB_NO_OT_SHAPE
+ this->ot.equal (&other->ot) &&
+#endif
+ this->shaper_func == other->shaper_func;
}
@@ -89,15 +161,16 @@ hb_shape_plan_plan (hb_shape_plan_t *shape_plan,
* hb_shape_plan_t
*/
+
/**
* hb_shape_plan_create: (Xconstructor)
- * @face:
- * @props:
+ * @face:
+ * @props:
* @user_features: (array length=num_user_features):
- * @num_user_features:
+ * @num_user_features:
* @shaper_list: (array zero-terminated=1):
*
- *
+ *
*
* Return value: (transfer full):
*
@@ -121,7 +194,7 @@ hb_shape_plan_create2 (hb_face_t *face,
const hb_segment_properties_t *props,
const hb_feature_t *user_features,
unsigned int num_user_features,
- const int *orig_coords,
+ const int *coords,
unsigned int num_coords,
const char * const *shaper_list)
{
@@ -132,94 +205,66 @@ hb_shape_plan_create2 (hb_face_t *face,
num_coords,
shaper_list);
+ assert (props->direction != HB_DIRECTION_INVALID);
+
hb_shape_plan_t *shape_plan;
- hb_feature_t *features = nullptr;
- int *coords = nullptr;
- if (unlikely (!face))
- face = hb_face_get_empty ();
if (unlikely (!props))
- return hb_shape_plan_get_empty ();
- if (num_user_features && !(features = (hb_feature_t *) calloc (num_user_features, sizeof (hb_feature_t))))
- return hb_shape_plan_get_empty ();
- if (num_coords && !(coords = (int *) calloc (num_coords, sizeof (int))))
- {
- free (features);
- return hb_shape_plan_get_empty ();
- }
+ goto bail;
if (!(shape_plan = hb_object_create<hb_shape_plan_t> ()))
- {
- free (coords);
- free (features);
- return hb_shape_plan_get_empty ();
- }
-
- assert (props->direction != HB_DIRECTION_INVALID);
+ goto bail;
+ if (unlikely (!face))
+ face = hb_face_get_empty ();
hb_face_make_immutable (face);
- shape_plan->default_shaper_list = !shaper_list;
shape_plan->face_unsafe = face;
- shape_plan->props = *props;
- shape_plan->num_user_features = num_user_features;
- shape_plan->user_features = features;
- if (num_user_features)
- memcpy (features, user_features, num_user_features * sizeof (hb_feature_t));
- shape_plan->num_coords = num_coords;
- shape_plan->coords = coords;
- if (num_coords)
- memcpy (coords, orig_coords, num_coords * sizeof (int));
- hb_shape_plan_plan (shape_plan,
- user_features, num_user_features,
- coords, num_coords,
- shaper_list);
+ if (unlikely (!shape_plan->key.init (true,
+ face,
+ props,
+ user_features,
+ num_user_features,
+ coords,
+ num_coords,
+ shaper_list)))
+ goto bail2;
+#ifndef HB_NO_OT_SHAPE
+ if (unlikely (!shape_plan->ot.init0 (face, &shape_plan->key)))
+ goto bail3;
+#endif
return shape_plan;
+
+#ifndef HB_NO_OT_SHAPE
+bail3:
+#endif
+ shape_plan->key.free ();
+bail2:
+ free (shape_plan);
+bail:
+ return hb_shape_plan_get_empty ();
}
/**
* hb_shape_plan_get_empty:
*
- *
+ *
*
* Return value: (transfer full):
*
* Since: 0.9.7
**/
hb_shape_plan_t *
-hb_shape_plan_get_empty (void)
+hb_shape_plan_get_empty ()
{
- static const hb_shape_plan_t _hb_shape_plan_nil = {
- HB_OBJECT_HEADER_STATIC,
-
- true, /* default_shaper_list */
- nullptr, /* face */
- HB_SEGMENT_PROPERTIES_DEFAULT, /* props */
-
- nullptr, /* shaper_func */
- nullptr, /* shaper_name */
-
- nullptr, /* user_features */
- 0, /* num_user_featurs */
-
- nullptr, /* coords */
- 0, /* num_coords */
-
- {
-#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
- }
- };
-
- return const_cast<hb_shape_plan_t *> (&_hb_shape_plan_nil);
+ return const_cast<hb_shape_plan_t *> (&Null(hb_shape_plan_t));
}
/**
* hb_shape_plan_reference: (skip)
* @shape_plan: a shape plan.
*
- *
+ *
*
* Return value: (transfer full):
*
@@ -235,7 +280,7 @@ hb_shape_plan_reference (hb_shape_plan_t *shape_plan)
* hb_shape_plan_destroy: (skip)
* @shape_plan: a shape plan.
*
- *
+ *
*
* Since: 0.9.7
**/
@@ -244,27 +289,24 @@ hb_shape_plan_destroy (hb_shape_plan_t *shape_plan)
{
if (!hb_object_destroy (shape_plan)) return;
-#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, shape_plan);
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
-
- free (shape_plan->user_features);
- free (shape_plan->coords);
-
+#ifndef HB_NO_OT_SHAPE
+ shape_plan->ot.fini ();
+#endif
+ shape_plan->key.free ();
free (shape_plan);
}
/**
* hb_shape_plan_set_user_data: (skip)
* @shape_plan: a shape plan.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.7
**/
@@ -281,9 +323,9 @@ hb_shape_plan_set_user_data (hb_shape_plan_t *shape_plan,
/**
* hb_shape_plan_get_user_data: (skip)
* @shape_plan: a shape plan.
- * @key:
+ * @key:
+ *
*
- *
*
* Return value: (transfer none):
*
@@ -296,6 +338,22 @@ hb_shape_plan_get_user_data (hb_shape_plan_t *shape_plan,
return hb_object_get_user_data (shape_plan, key);
}
+/**
+ * hb_shape_plan_get_shaper:
+ * @shape_plan: a shape plan.
+ *
+ *
+ *
+ * Return value: (transfer none):
+ *
+ * Since: 0.9.7
+ **/
+const char *
+hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan)
+{
+ return shape_plan->key.shaper_name;
+}
+
/**
* hb_shape_plan_execute:
@@ -303,11 +361,11 @@ hb_shape_plan_get_user_data (hb_shape_plan_t *shape_plan,
* @font: a font.
* @buffer: a buffer.
* @features: (array length=num_features):
- * @num_features:
+ * @num_features:
+ *
*
- *
*
- * Return value:
+ * Return value:
*
* Since: 0.9.7
**/
@@ -321,32 +379,31 @@ hb_shape_plan_execute (hb_shape_plan_t *shape_plan,
DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan,
"num_features=%d shaper_func=%p, shaper_name=%s",
num_features,
- shape_plan->shaper_func,
- shape_plan->shaper_name);
+ shape_plan->key.shaper_func,
+ shape_plan->key.shaper_name);
if (unlikely (!buffer->len))
return true;
- assert (!hb_object_is_inert (buffer));
+ assert (!hb_object_is_immutable (buffer));
assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE);
if (unlikely (hb_object_is_inert (shape_plan)))
return false;
assert (shape_plan->face_unsafe == font->face);
- assert (hb_segment_properties_equal (&shape_plan->props, &buffer->props));
+ assert (hb_segment_properties_equal (&shape_plan->key.props, &buffer->props));
#define HB_SHAPER_EXECUTE(shaper) \
HB_STMT_START { \
- return HB_SHAPER_DATA (shaper, shape_plan) && \
- hb_##shaper##_shaper_font_data_ensure (font) && \
+ return font->data.shaper && \
_hb_##shaper##_shape (shape_plan, font, buffer, features, num_features); \
} HB_STMT_END
- if (0)
+ if (false)
;
#define HB_SHAPER_IMPLEMENT(shaper) \
- else if (shape_plan->shaper_func == _hb_##shaper##_shape) \
+ else if (shape_plan->key.shaper_func == _hb_##shaper##_shape) \
HB_SHAPER_EXECUTE (shaper);
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
@@ -358,101 +415,18 @@ hb_shape_plan_execute (hb_shape_plan_t *shape_plan,
/*
- * caching
+ * Caching
*/
-#if 0
-static unsigned int
-hb_shape_plan_hash (const hb_shape_plan_t *shape_plan)
-{
- return hb_segment_properties_hash (&shape_plan->props) +
- shape_plan->default_shaper_list ? 0 : (intptr_t) shape_plan->shaper_func;
-}
-#endif
-
-/* User-feature caching is currently somewhat dumb:
- * it only finds matches where the feature array is identical,
- * not cases where the feature lists would be compatible for plan purposes
- * but have different ranges, for example.
- */
-struct hb_shape_plan_proposal_t
-{
- const hb_segment_properties_t props;
- const char * const *shaper_list;
- const hb_feature_t *user_features;
- unsigned int num_user_features;
- const int *coords;
- unsigned int num_coords;
- hb_shape_func_t *shaper_func;
-};
-
-static inline hb_bool_t
-hb_shape_plan_user_features_match (const hb_shape_plan_t *shape_plan,
- const hb_shape_plan_proposal_t *proposal)
-{
- if (proposal->num_user_features != shape_plan->num_user_features)
- return false;
- for (unsigned int i = 0, n = proposal->num_user_features; i < n; i++)
- if (proposal->user_features[i].tag != shape_plan->user_features[i].tag ||
- proposal->user_features[i].value != shape_plan->user_features[i].value ||
- proposal->user_features[i].start != shape_plan->user_features[i].start ||
- proposal->user_features[i].end != shape_plan->user_features[i].end)
- return false;
- return true;
-}
-
-static inline hb_bool_t
-hb_shape_plan_coords_match (const hb_shape_plan_t *shape_plan,
- const hb_shape_plan_proposal_t *proposal)
-{
- if (proposal->num_coords != shape_plan->num_coords)
- return false;
- for (unsigned int i = 0, n = proposal->num_coords; i < n; i++)
- if (proposal->coords[i] != shape_plan->coords[i])
- return false;
- return true;
-}
-
-static hb_bool_t
-hb_shape_plan_matches (const hb_shape_plan_t *shape_plan,
- const hb_shape_plan_proposal_t *proposal)
-{
- return hb_segment_properties_equal (&shape_plan->props, &proposal->props) &&
- hb_shape_plan_user_features_match (shape_plan, proposal) &&
- hb_shape_plan_coords_match (shape_plan, proposal) &&
- ((shape_plan->default_shaper_list && !proposal->shaper_list) ||
- (shape_plan->shaper_func == proposal->shaper_func));
-}
-
-static inline hb_bool_t
-hb_non_global_user_features_present (const hb_feature_t *user_features,
- unsigned int num_user_features)
-{
- while (num_user_features) {
- if (user_features->start != 0 || user_features->end != (unsigned int) -1)
- return true;
- num_user_features--;
- user_features++;
- }
- return false;
-}
-
-static inline hb_bool_t
-hb_coords_present (const int *coords,
- unsigned int num_coords)
-{
- return num_coords != 0;
-}
-
/**
* hb_shape_plan_create_cached:
- * @face:
- * @props:
+ * @face:
+ * @props:
* @user_features: (array length=num_user_features):
- * @num_user_features:
+ * @num_user_features:
* @shaper_list: (array zero-terminated=1):
*
- *
+ *
*
* Return value: (transfer full):
*
@@ -486,62 +460,38 @@ hb_shape_plan_create_cached2 (hb_face_t *face,
num_user_features,
shaper_list);
- hb_shape_plan_proposal_t proposal = {
- *props,
- shaper_list,
- user_features,
- num_user_features,
- nullptr
- };
-
- if (shaper_list) {
- /* Choose shaper. Adapted from hb_shape_plan_plan().
- * Must choose shaper exactly the same way as that function. */
- for (const char * const *shaper_item = shaper_list; *shaper_item; shaper_item++)
- if (0)
- ;
-#define HB_SHAPER_IMPLEMENT(shaper) \
- else if (0 == strcmp (*shaper_item, #shaper) && \
- hb_##shaper##_shaper_face_data_ensure (face)) \
- { \
- proposal.shaper_func = _hb_##shaper##_shape; \
- break; \
- }
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
-
- if (unlikely (!proposal.shaper_func))
- return hb_shape_plan_get_empty ();
- }
+retry:
+ hb_face_t::plan_node_t *cached_plan_nodes = face->shape_plans;
+ bool dont_cache = hb_object_is_inert (face);
-retry:
- hb_face_t::plan_node_t *cached_plan_nodes = (hb_face_t::plan_node_t *) hb_atomic_ptr_get (&face->shape_plans);
+ if (likely (!dont_cache))
+ {
+ hb_shape_plan_key_t key;
+ if (!key.init (false,
+ face,
+ props,
+ user_features,
+ num_user_features,
+ coords,
+ num_coords,
+ shaper_list))
+ return hb_shape_plan_get_empty ();
- /* Don't look for plan in the cache if there were variation coordinates XXX Fix me. */
- if (!hb_coords_present (coords, num_coords))
for (hb_face_t::plan_node_t *node = cached_plan_nodes; node; node = node->next)
- if (hb_shape_plan_matches (node->shape_plan, &proposal))
+ if (node->shape_plan->key.equal (&key))
{
- DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache");
- return hb_shape_plan_reference (node->shape_plan);
+ DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache");
+ return hb_shape_plan_reference (node->shape_plan);
}
+ }
- /* Not found. */
hb_shape_plan_t *shape_plan = hb_shape_plan_create2 (face, props,
user_features, num_user_features,
coords, num_coords,
shaper_list);
- /* Don't add to the cache if face is inert. */
- if (unlikely (hb_object_is_inert (face)))
- return shape_plan;
-
- /* Don't add the plan to the cache if there were user features with non-global ranges */
- if (hb_non_global_user_features_present (user_features, num_user_features))
- return shape_plan;
- /* Don't add the plan to the cache if there were variation coordinates XXX Fix me. */
- if (hb_coords_present (coords, num_coords))
+ if (unlikely (dont_cache))
return shape_plan;
hb_face_t::plan_node_t *node = (hb_face_t::plan_node_t *) calloc (1, sizeof (hb_face_t::plan_node_t));
@@ -551,7 +501,8 @@ retry:
node->shape_plan = shape_plan;
node->next = cached_plan_nodes;
- if (!hb_atomic_ptr_cmpexch (&face->shape_plans, cached_plan_nodes, node)) {
+ if (unlikely (!face->shape_plans.cmpexch (cached_plan_nodes, node)))
+ {
hb_shape_plan_destroy (shape_plan);
free (node);
goto retry;
@@ -560,19 +511,3 @@ retry:
return hb_shape_plan_reference (shape_plan);
}
-
-/**
- * hb_shape_plan_get_shaper:
- * @shape_plan: a shape plan.
- *
- *
- *
- * Return value: (transfer none):
- *
- * Since: 0.9.7
- **/
-const char *
-hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan)
-{
- return shape_plan->shaper_name;
-}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.hh b/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.hh
new file mode 100644
index 0000000000..6da7edb2f8
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-shape-plan.hh
@@ -0,0 +1,76 @@
+/*
+ * Copyright © 2012,2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_SHAPE_PLAN_HH
+#define HB_SHAPE_PLAN_HH
+
+#include "hb.hh"
+#include "hb-shaper.hh"
+#include "hb-ot-shape.hh"
+
+
+struct hb_shape_plan_key_t
+{
+ hb_segment_properties_t props;
+
+ const hb_feature_t *user_features;
+ unsigned int num_user_features;
+
+#ifndef HB_NO_OT_SHAPE
+ hb_ot_shape_plan_key_t ot;
+#endif
+
+ hb_shape_func_t *shaper_func;
+ const char *shaper_name;
+
+ HB_INTERNAL bool init (bool copy,
+ hb_face_t *face,
+ const hb_segment_properties_t *props,
+ const hb_feature_t *user_features,
+ unsigned int num_user_features,
+ const int *coords,
+ unsigned int num_coords,
+ const char * const *shaper_list);
+
+ HB_INTERNAL void free () { ::free ((void *) user_features); }
+
+ HB_INTERNAL bool user_features_match (const hb_shape_plan_key_t *other);
+
+ HB_INTERNAL bool equal (const hb_shape_plan_key_t *other);
+};
+
+struct hb_shape_plan_t
+{
+ hb_object_header_t header;
+ hb_face_t *face_unsafe; /* We don't carry a reference to face. */
+ hb_shape_plan_key_t key;
+#ifndef HB_NO_OT_SHAPE
+ hb_ot_shape_plan_t ot;
+#endif
+};
+
+
+#endif /* HB_SHAPE_PLAN_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shape.cc b/src/3rdparty/harfbuzz-ng/src/hb-shape.cc
index 39355b337d..cf4e1525a2 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-shape.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-shape.cc
@@ -26,35 +26,70 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-private.hh"
+#include "hb.hh"
+
+#include "hb-shaper.hh"
+#include "hb-shape-plan.hh"
+#include "hb-buffer.hh"
+#include "hb-font.hh"
+#include "hb-machinery.hh"
-#include "hb-shaper-private.hh"
-#include "hb-shape-plan-private.hh"
-#include "hb-buffer-private.hh"
-#include "hb-font-private.hh"
/**
* SECTION:hb-shape
- * @title: Shaping
+ * @title: hb-shape
* @short_description: Conversion of text strings into positioned glyphs
* @include: hb.h
*
* Shaping is the central operation of HarfBuzz. Shaping operates on buffers,
* which are sequences of Unicode characters that use the same font and have
- * the same text direction, script and language. After shaping the buffer
+ * the same text direction, script, and language. After shaping the buffer
* contains the output glyphs and their positions.
**/
-static const char **static_shaper_list;
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
+static void free_static_shaper_list ();
+#endif
+
+static const char *nil_shaper_list[] = {nullptr};
+
+static struct hb_shaper_list_lazy_loader_t : hb_lazy_loader_t<const char *,
+ hb_shaper_list_lazy_loader_t>
+{
+ static const char ** create ()
+ {
+ const char **shaper_list = (const char **) calloc (1 + HB_SHAPERS_COUNT, sizeof (const char *));
+ if (unlikely (!shaper_list))
+ return nullptr;
+
+ const hb_shaper_entry_t *shapers = _hb_shapers_get ();
+ unsigned int i;
+ for (i = 0; i < HB_SHAPERS_COUNT; i++)
+ shaper_list[i] = shapers[i].name;
+ shaper_list[i] = nullptr;
+
+#if HB_USE_ATEXIT
+ atexit (free_static_shaper_list);
+#endif
+
+ return shaper_list;
+ }
+ static void destroy (const char **l)
+ { free (l); }
+ static const char ** get_null ()
+ { return nil_shaper_list; }
+} static_shaper_list;
+
+#if HB_USE_ATEXIT
static
-void free_static_shaper_list (void)
+void free_static_shaper_list ()
{
- free (static_shaper_list);
+ static_shaper_list.free_instance ();
}
#endif
+
/**
* hb_shape_list_shapers:
*
@@ -66,37 +101,9 @@ void free_static_shaper_list (void)
* Since: 0.9.2
**/
const char **
-hb_shape_list_shapers (void)
+hb_shape_list_shapers ()
{
-retry:
- const char **shaper_list = (const char **) hb_atomic_ptr_get (&static_shaper_list);
-
- if (unlikely (!shaper_list))
- {
- /* Not found; allocate one. */
- shaper_list = (const char **) calloc (1 + HB_SHAPERS_COUNT, sizeof (const char *));
- if (unlikely (!shaper_list)) {
- static const char *nil_shaper_list[] = {nullptr};
- return nil_shaper_list;
- }
-
- const hb_shaper_pair_t *shapers = _hb_shapers_get ();
- unsigned int i;
- for (i = 0; i < HB_SHAPERS_COUNT; i++)
- shaper_list[i] = shapers[i].name;
- shaper_list[i] = nullptr;
-
- if (!hb_atomic_ptr_cmpexch (&static_shaper_list, nullptr, shaper_list)) {
- free (shaper_list);
- goto retry;
- }
-
-#ifdef HB_USE_ATEXIT
- atexit (free_static_shaper_list); /* First person registers atexit() callback. */
-#endif
- }
-
- return shaper_list;
+ return static_shaper_list.get_unconst ();
}
@@ -147,7 +154,9 @@ hb_shape_full (hb_font_t *font,
*
* Shapes @buffer using @font turning its Unicode characters content to
* positioned glyphs. If @features is not %NULL, it will be used to control the
- * features applied during shaping.
+ * features applied during shaping. If two @features have the same tag but
+ * overlapping ranges the value of the feature with the higher index takes
+ * precedence.
*
* Since: 0.9.2
**/
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shaper-impl-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-shaper-impl-private.hh
deleted file mode 100644
index 7844081e95..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-shaper-impl-private.hh
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright © 2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_SHAPER_IMPL_PRIVATE_HH
-#define HB_SHAPER_IMPL_PRIVATE_HH
-
-#include "hb-private.hh"
-
-#include "hb-shaper-private.hh"
-#include "hb-shape-plan-private.hh"
-#include "hb-font-private.hh"
-#include "hb-buffer-private.hh"
-
-
-#ifdef HB_SHAPER
-#define HB_SHAPER_DATA_GET(object) HB_SHAPER_DATA (HB_SHAPER, object)
-#endif
-
-
-#endif /* HB_SHAPER_IMPL_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shaper-impl.hh b/src/3rdparty/harfbuzz-ng/src/hb-shaper-impl.hh
new file mode 100644
index 0000000000..b674fceb6a
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-shaper-impl.hh
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_SHAPER_IMPL_HH
+#define HB_SHAPER_IMPL_HH
+
+#include "hb.hh"
+
+#include "hb-shaper.hh"
+#include "hb-face.hh"
+#include "hb-font.hh"
+#include "hb-shape-plan.hh"
+#include "hb-buffer.hh"
+
+#endif /* HB_SHAPER_IMPL_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh b/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh
index b0835d31ab..0d63933a76 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh
@@ -28,18 +28,17 @@
#define HB_SHAPER_LIST_HH
#endif /* HB_SHAPER_LIST_HH */ /* Dummy header guards */
+#ifndef HB_NO_SHAPER
+
+
/* v--- Add new shapers in the right place here. */
#ifdef HAVE_GRAPHITE2
/* Only picks up fonts that have a "Silf" table. */
HB_SHAPER_IMPLEMENT (graphite2)
#endif
-#ifdef HAVE_CORETEXT
-/* Only picks up fonts that have a "mort" or "morx" table. */
-HB_SHAPER_IMPLEMENT (coretext_aat)
-#endif
-#ifdef HAVE_OT
+#ifndef HB_NO_OT_SHAPE
HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main OpenType shaper. */
#endif
@@ -53,6 +52,9 @@ HB_SHAPER_IMPLEMENT (directwrite)
HB_SHAPER_IMPLEMENT (coretext)
#endif
-#ifdef HAVE_FALLBACK
+#ifndef HB_NO_FALLBACK_SHAPE
HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */
#endif
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shaper-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-shaper-private.hh
deleted file mode 100644
index ce2d9f2839..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-shaper-private.hh
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright © 2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_SHAPER_PRIVATE_HH
-#define HB_SHAPER_PRIVATE_HH
-
-#include "hb-private.hh"
-
-typedef hb_bool_t hb_shape_func_t (hb_shape_plan_t *shape_plan,
- hb_font_t *font,
- hb_buffer_t *buffer,
- const hb_feature_t *features,
- unsigned int num_features);
-
-#define HB_SHAPER_IMPLEMENT(name) \
- extern "C" HB_INTERNAL hb_shape_func_t _hb_##name##_shape;
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
-
-struct hb_shaper_pair_t {
- char name[16];
- hb_shape_func_t *func;
-};
-
-HB_INTERNAL const hb_shaper_pair_t *
-_hb_shapers_get (void);
-
-
-/* For embedding in face / font / ... */
-struct hb_shaper_data_t {
-#define HB_SHAPER_IMPLEMENT(shaper) void *shaper;
-#include "hb-shaper-list.hh"
-#undef HB_SHAPER_IMPLEMENT
-};
-
-#define HB_SHAPERS_COUNT (sizeof (hb_shaper_data_t) / sizeof (void *))
-
-/* Means: succeeded, but don't need to keep any data. */
-#define HB_SHAPER_DATA_SUCCEEDED ((void *) +1)
-
-/* Means: tried but failed to create. */
-#define HB_SHAPER_DATA_INVALID ((void *) -1)
-#define HB_SHAPER_DATA_IS_INVALID(data) ((void *) (data) == HB_SHAPER_DATA_INVALID)
-
-#define HB_SHAPER_DATA_TYPE_NAME(shaper, object) hb_##shaper##_shaper_##object##_data_t
-#define HB_SHAPER_DATA_TYPE(shaper, object) struct HB_SHAPER_DATA_TYPE_NAME(shaper, object)
-#define HB_SHAPER_DATA_INSTANCE(shaper, object, instance) (* (HB_SHAPER_DATA_TYPE(shaper, object) **) &(instance)->shaper_data.shaper)
-#define HB_SHAPER_DATA(shaper, object) HB_SHAPER_DATA_INSTANCE(shaper, object, object)
-#define HB_SHAPER_DATA_CREATE_FUNC(shaper, object) _hb_##shaper##_shaper_##object##_data_create
-#define HB_SHAPER_DATA_DESTROY_FUNC(shaper, object) _hb_##shaper##_shaper_##object##_data_destroy
-#define HB_SHAPER_DATA_ENSURE_FUNC(shaper, object) hb_##shaper##_shaper_##object##_data_ensure
-
-#define HB_SHAPER_DATA_PROTOTYPE(shaper, object) \
- HB_SHAPER_DATA_TYPE (shaper, object); /* Type forward declaration. */ \
- extern "C" HB_INTERNAL HB_SHAPER_DATA_TYPE (shaper, object) * \
- HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (hb_##object##_t *object HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS); \
- extern "C" HB_INTERNAL void \
- HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA_TYPE (shaper, object) *data); \
- extern "C" HB_INTERNAL bool \
- HB_SHAPER_DATA_ENSURE_FUNC (shaper, object) (hb_##object##_t *object)
-
-#define HB_SHAPER_DATA_DESTROY(shaper, object) \
- if (HB_SHAPER_DATA_TYPE (shaper, object) *data = HB_SHAPER_DATA (shaper, object)) \
- if (data != HB_SHAPER_DATA_INVALID && data != HB_SHAPER_DATA_SUCCEEDED) \
- HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data);
-
-#define HB_SHAPER_DATA_ENSURE_DEFINE(shaper, object) \
- HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(shaper, object, true)
-
-#define HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(shaper, object, condition) \
-bool \
-HB_SHAPER_DATA_ENSURE_FUNC(shaper, object) (hb_##object##_t *object) \
-{\
- retry: \
- HB_SHAPER_DATA_TYPE (shaper, object) *data = (HB_SHAPER_DATA_TYPE (shaper, object) *) hb_atomic_ptr_get (&HB_SHAPER_DATA (shaper, object)); \
- if (likely (data) && !(condition)) { \
- /* Drop and recreate. */ \
- /* If someone dropped it in the mean time, throw it away and don't touch it. \
- * Otherwise, destruct it. */ \
- if (hb_atomic_ptr_cmpexch (&HB_SHAPER_DATA (shaper, object), data, nullptr)) { \
- HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data); \
- } \
- goto retry; \
- } \
- if (unlikely (!data)) { \
- data = HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (object); \
- if (unlikely (!data)) \
- data = (HB_SHAPER_DATA_TYPE (shaper, object) *) HB_SHAPER_DATA_INVALID; \
- if (!hb_atomic_ptr_cmpexch (&HB_SHAPER_DATA (shaper, object), nullptr, data)) { \
- if (data && \
- data != HB_SHAPER_DATA_INVALID && \
- data != HB_SHAPER_DATA_SUCCEEDED) \
- HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data); \
- goto retry; \
- } \
- } \
- return data != nullptr && !HB_SHAPER_DATA_IS_INVALID (data); \
-}
-
-
-#endif /* HB_SHAPER_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shaper.cc b/src/3rdparty/harfbuzz-ng/src/hb-shaper.cc
index 2c44cf2653..0ea68ad1f5 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-shaper.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-shaper.cc
@@ -24,58 +24,44 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-private.hh"
-#include "hb-shaper-private.hh"
-#include "hb-atomic-private.hh"
+#include "hb.hh"
+#include "hb-shaper.hh"
+#include "hb-machinery.hh"
-static const hb_shaper_pair_t all_shapers[] = {
+static const hb_shaper_entry_t all_shapers[] = {
#define HB_SHAPER_IMPLEMENT(name) {#name, _hb_##name##_shape},
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
};
+#ifndef HB_NO_SHAPER
+static_assert (0 != ARRAY_LENGTH_CONST (all_shapers), "No shaper enabled.");
+#endif
-
-/* Thread-safe, lock-free, shapers */
-
-static const hb_shaper_pair_t *static_shapers;
-
-#ifdef HB_USE_ATEXIT
-static
-void free_static_shapers (void)
-{
- if (unlikely (static_shapers != all_shapers))
- free ((void *) static_shapers);
-}
+#if HB_USE_ATEXIT
+static void free_static_shapers ();
#endif
-const hb_shaper_pair_t *
-_hb_shapers_get (void)
+static struct hb_shapers_lazy_loader_t : hb_lazy_loader_t<const hb_shaper_entry_t,
+ hb_shapers_lazy_loader_t>
{
-retry:
- hb_shaper_pair_t *shapers = (hb_shaper_pair_t *) hb_atomic_ptr_get (&static_shapers);
-
- if (unlikely (!shapers))
+ static hb_shaper_entry_t *create ()
{
char *env = getenv ("HB_SHAPER_LIST");
- if (!env || !*env) {
- (void) hb_atomic_ptr_cmpexch (&static_shapers, nullptr, &all_shapers[0]);
- return (const hb_shaper_pair_t *) all_shapers;
- }
+ if (!env || !*env)
+ return nullptr;
- /* Not found; allocate one. */
- shapers = (hb_shaper_pair_t *) calloc (1, sizeof (all_shapers));
- if (unlikely (!shapers)) {
- (void) hb_atomic_ptr_cmpexch (&static_shapers, nullptr, &all_shapers[0]);
- return (const hb_shaper_pair_t *) all_shapers;
- }
+ hb_shaper_entry_t *shapers = (hb_shaper_entry_t *) calloc (1, sizeof (all_shapers));
+ if (unlikely (!shapers))
+ return nullptr;
memcpy (shapers, all_shapers, sizeof (all_shapers));
/* Reorder shaper list to prefer requested shapers. */
unsigned int i = 0;
char *end, *p = env;
- for (;;) {
+ for (;;)
+ {
end = strchr (p, ',');
if (!end)
end = p + strlen (p);
@@ -85,7 +71,7 @@ retry:
0 == strncmp (shapers[j].name, p, end - p))
{
/* Reorder this shaper to position i */
- struct hb_shaper_pair_t t = shapers[j];
+ struct hb_shaper_entry_t t = shapers[j];
memmove (&shapers[i + 1], &shapers[i], sizeof (shapers[i]) * (j - i));
shapers[i] = t;
i++;
@@ -97,15 +83,26 @@ retry:
p = end + 1;
}
- if (!hb_atomic_ptr_cmpexch (&static_shapers, nullptr, shapers)) {
- free (shapers);
- goto retry;
- }
-
-#ifdef HB_USE_ATEXIT
- atexit (free_static_shapers); /* First person registers atexit() callback. */
+#if HB_USE_ATEXIT
+ atexit (free_static_shapers);
#endif
+
+ return shapers;
}
+ static void destroy (const hb_shaper_entry_t *p) { free ((void *) p); }
+ static const hb_shaper_entry_t *get_null () { return all_shapers; }
+} static_shapers;
- return shapers;
+#if HB_USE_ATEXIT
+static
+void free_static_shapers ()
+{
+ static_shapers.free_instance ();
+}
+#endif
+
+const hb_shaper_entry_t *
+_hb_shapers_get ()
+{
+ return static_shapers.get_unconst ();
}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shaper.hh b/src/3rdparty/harfbuzz-ng/src/hb-shaper.hh
new file mode 100644
index 0000000000..79dc5d07e0
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-shaper.hh
@@ -0,0 +1,134 @@
+/*
+ * Copyright © 2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_SHAPER_HH
+#define HB_SHAPER_HH
+
+#include "hb.hh"
+#include "hb-machinery.hh"
+
+typedef hb_bool_t hb_shape_func_t (hb_shape_plan_t *shape_plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer,
+ const hb_feature_t *features,
+ unsigned int num_features);
+
+#define HB_SHAPER_IMPLEMENT(name) \
+ extern "C" HB_INTERNAL hb_shape_func_t _hb_##name##_shape;
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+
+struct hb_shaper_entry_t {
+ char name[16];
+ hb_shape_func_t *func;
+};
+
+HB_INTERNAL const hb_shaper_entry_t *
+_hb_shapers_get ();
+
+
+template <typename Data, unsigned int WheresData, typename T>
+struct hb_shaper_lazy_loader_t;
+
+#define HB_SHAPER_ORDER(Shaper) \
+ HB_PASTE (HB_SHAPER_ORDER_, Shaper)
+enum hb_shaper_order_t
+{
+ _HB_SHAPER_ORDER_ORDER_ZERO,
+#define HB_SHAPER_IMPLEMENT(Shaper) \
+ HB_SHAPER_ORDER (Shaper),
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+ _HB_SHAPERS_COUNT_PLUS_ONE,
+ HB_SHAPERS_COUNT = _HB_SHAPERS_COUNT_PLUS_ONE - 1,
+};
+
+template <enum hb_shaper_order_t order, typename Object> struct hb_shaper_object_data_type_t;
+
+#define HB_SHAPER_DATA_SUCCEEDED ((void *) +1)
+#define HB_SHAPER_DATA_TYPE(shaper, object) hb_##shaper##_##object##_data_t
+#define HB_SHAPER_DATA_CREATE_FUNC(shaper, object) _hb_##shaper##_shaper_##object##_data_create
+#define HB_SHAPER_DATA_DESTROY_FUNC(shaper, object) _hb_##shaper##_shaper_##object##_data_destroy
+
+#define HB_SHAPER_DATA_INSTANTIATE_SHAPERS(shaper, object) \
+ \
+ struct HB_SHAPER_DATA_TYPE (shaper, object); /* Type forward declaration. */ \
+ extern "C" HB_INTERNAL HB_SHAPER_DATA_TYPE (shaper, object) * \
+ HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (hb_##object##_t *object); \
+ extern "C" HB_INTERNAL void \
+ HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA_TYPE (shaper, object) *shaper##_##object); \
+ \
+ template <> \
+ struct hb_shaper_object_data_type_t<HB_SHAPER_ORDER (shaper), hb_##object##_t> \
+ { \
+ typedef HB_SHAPER_DATA_TYPE(shaper, object) value; \
+ }; \
+ \
+ template <unsigned int WheresData> \
+ struct hb_shaper_lazy_loader_t<hb_##object##_t, WheresData, HB_SHAPER_DATA_TYPE(shaper, object)> \
+ : hb_lazy_loader_t<HB_SHAPER_DATA_TYPE(shaper, object), \
+ hb_shaper_lazy_loader_t<hb_##object##_t, \
+ WheresData, \
+ HB_SHAPER_DATA_TYPE(shaper, object)>, \
+ hb_##object##_t, WheresData> \
+ { \
+ typedef HB_SHAPER_DATA_TYPE(shaper, object) Type; \
+ static Type* create (hb_##object##_t *data) \
+ { return HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (data); } \
+ static Type *get_null () { return nullptr; } \
+ static void destroy (Type *p) { HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (p); } \
+ }; \
+ \
+ static_assert (true, "") /* Require semicolon. */
+
+
+template <typename Object>
+struct hb_shaper_object_dataset_t
+{
+ void init0 (Object *parent_data)
+ {
+ this->parent_data = parent_data;
+#define HB_SHAPER_IMPLEMENT(shaper) shaper.init0 ();
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+ }
+ void fini ()
+ {
+#define HB_SHAPER_IMPLEMENT(shaper) shaper.fini ();
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+ }
+
+ Object *parent_data; /* MUST be JUST before the lazy loaders. */
+#define HB_SHAPER_IMPLEMENT(shaper) \
+ hb_shaper_lazy_loader_t<Object, HB_SHAPER_ORDER(shaper), \
+ typename hb_shaper_object_data_type_t<HB_SHAPER_ORDER(shaper), Object>::value \
+ > shaper;
+#include "hb-shaper-list.hh"
+#undef HB_SHAPER_IMPLEMENT
+};
+
+#endif /* HB_SHAPER_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-static.cc b/src/3rdparty/harfbuzz-ng/src/hb-static.cc
new file mode 100644
index 0000000000..08a2f21363
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-static.cc
@@ -0,0 +1,76 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb-open-type.hh"
+#include "hb-face.hh"
+
+#include "hb-aat-layout-common.hh"
+#include "hb-aat-layout-feat-table.hh"
+#include "hb-ot-layout-common.hh"
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-head-table.hh"
+#include "hb-ot-maxp-table.hh"
+
+#ifndef HB_NO_VISIBILITY
+#include "hb-ot-name-language-static.hh"
+
+uint64_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (uint64_t) - 1) / sizeof (uint64_t)] = {};
+/*thread_local*/ uint64_t _hb_CrapPool[(HB_NULL_POOL_SIZE + sizeof (uint64_t) - 1) / sizeof (uint64_t)] = {};
+
+DEFINE_NULL_NAMESPACE_BYTES (OT, Index) = {0xFF,0xFF};
+DEFINE_NULL_NAMESPACE_BYTES (OT, LangSys) = {0x00,0x00, 0xFF,0xFF, 0x00,0x00};
+DEFINE_NULL_NAMESPACE_BYTES (OT, RangeRecord) = {0x00,0x01, 0x00,0x00, 0x00, 0x00};
+DEFINE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup) = {0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00};
+DEFINE_NULL_NAMESPACE_BYTES (AAT, SettingName) = {0xFF,0xFF, 0xFF,0xFF};
+/* Hand-coded because Lookup is a template. Sad. */
+const unsigned char _hb_Null_AAT_Lookup[2] = {0xFF, 0xFF};
+
+
+unsigned int
+hb_face_t::load_num_glyphs () const
+{
+ hb_sanitize_context_t c = hb_sanitize_context_t ();
+ c.set_num_glyphs (0); /* So we don't recurse ad infinitum. */
+ hb_blob_t *maxp_blob = c.reference_table<OT::maxp> (this);
+ const OT::maxp *maxp_table = maxp_blob->as<OT::maxp> ();
+
+ unsigned int ret = maxp_table->get_num_glyphs ();
+ num_glyphs.set_relaxed (ret);
+ hb_blob_destroy (maxp_blob);
+ return ret;
+}
+
+unsigned int
+hb_face_t::load_upem () const
+{
+ unsigned int ret = table.head->get_upem ();
+ upem.set_relaxed (ret);
+ return ret;
+}
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-string-array.hh b/src/3rdparty/harfbuzz-ng/src/hb-string-array.hh
index ba829b0cf0..1c67ab4d7c 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-string-array.hh
+++ b/src/3rdparty/harfbuzz-ng/src/hb-string-array.hh
@@ -29,7 +29,7 @@
#define HB_STRING_ARRAY_HH
#endif
-#include "hb-private.hh"
+#include "hb.hh"
/* Based on Bruno Haible's code in Appendix B of Ulrich Drepper's dsohowto.pdf:
* https://software.intel.com/sites/default/files/m/a/1/e/dsohowto.pdf */
@@ -42,13 +42,13 @@ static const union HB_STRING_ARRAY_TYPE_NAME {
struct {
/* I like to avoid storing the nul-termination byte since we don't need it,
* but C++ does not allow that.
- * https://stackoverflow.com/questions/28433862/why-initializer-string-for-array-of-chars-is-too-long-compiles-fine-in-c-not
+ * https://stackoverflow.com/q/28433862
*/
#define _S(s) char HB_PASTE (str, __LINE__)[sizeof (s)];
#include HB_STRING_ARRAY_LIST
#undef _S
} st;
- char str[VAR];
+ char str[HB_VAR_ARRAY];
}
HB_STRING_ARRAY_POOL_NAME =
{
@@ -66,12 +66,12 @@ static const unsigned int HB_STRING_ARRAY_OFFS_NAME[] =
sizeof (HB_STRING_ARRAY_TYPE_NAME)
};
-static inline hb_string_t
+static inline hb_bytes_t
HB_STRING_ARRAY_NAME (unsigned int i)
{
assert (i < ARRAY_LENGTH (HB_STRING_ARRAY_OFFS_NAME) - 1);
- return hb_string_t (HB_STRING_ARRAY_POOL_NAME.str + HB_STRING_ARRAY_OFFS_NAME[i],
- HB_STRING_ARRAY_OFFS_NAME[i + 1] - HB_STRING_ARRAY_OFFS_NAME[i] - 1);
+ return hb_bytes_t (HB_STRING_ARRAY_POOL_NAME.str + HB_STRING_ARRAY_OFFS_NAME[i],
+ HB_STRING_ARRAY_OFFS_NAME[i + 1] - HB_STRING_ARRAY_OFFS_NAME[i] - 1);
}
#undef HB_STRING_ARRAY_TYPE_NAME
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc
new file mode 100644
index 0000000000..c9a880ad50
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc
@@ -0,0 +1,227 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_SUBSET_CFF
+
+#include "hb-ot-cff-common.hh"
+#include "hb-ot-cff2-table.hh"
+#include "hb-subset-cff-common.hh"
+
+/* Disable FDSelect format 0 for compatibility with fonttools which doesn't seem choose it.
+ * Rarely any/much smaller than format 3 anyway. */
+#define CFF_SERIALIZE_FDSELECT_0 0
+
+using namespace CFF;
+
+/**
+ * hb_plan_subset_cff_fdselect
+ * Determine an optimal FDSelect format according to a provided plan.
+ *
+ * Return value: FDSelect format, size, and ranges for the most compact subset FDSelect
+ * along with a font index remapping table
+ **/
+
+bool
+hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan,
+ unsigned int fdCount,
+ const FDSelect &src, /* IN */
+ unsigned int &subset_fd_count /* OUT */,
+ unsigned int &subset_fdselect_size /* OUT */,
+ unsigned int &subset_fdselect_format /* OUT */,
+ hb_vector_t<code_pair_t> &fdselect_ranges /* OUT */,
+ hb_inc_bimap_t &fdmap /* OUT */)
+{
+ subset_fd_count = 0;
+ subset_fdselect_size = 0;
+ subset_fdselect_format = 0;
+ unsigned int num_ranges = 0;
+
+ unsigned int subset_num_glyphs = plan->num_output_glyphs ();
+ if (subset_num_glyphs == 0)
+ return true;
+
+ {
+ /* use hb_set to determine the subset of font dicts */
+ hb_set_t *set = hb_set_create ();
+ if (unlikely (set == &Null (hb_set_t))) return false;
+ hb_codepoint_t prev_fd = CFF_UNDEF_CODE;
+ for (hb_codepoint_t i = 0; i < subset_num_glyphs; i++)
+ {
+ hb_codepoint_t glyph;
+ hb_codepoint_t fd;
+ if (!plan->old_gid_for_new_gid (i, &glyph))
+ {
+ /* fonttools retains FDSelect & font dicts for missing glyphs. do the same */
+ glyph = i;
+ }
+ fd = src.get_fd (glyph);
+ set->add (fd);
+
+ if (fd != prev_fd)
+ {
+ num_ranges++;
+ prev_fd = fd;
+ code_pair_t pair = { fd, i };
+ fdselect_ranges.push (pair);
+ }
+ }
+
+ subset_fd_count = set->get_population ();
+ if (subset_fd_count == fdCount)
+ {
+ /* all font dicts belong to the subset. no need to subset FDSelect & FDArray */
+ fdmap.identity (fdCount);
+ hb_set_destroy (set);
+ }
+ else
+ {
+ /* create a fdmap */
+ fdmap.reset ();
+
+ hb_codepoint_t fd = CFF_UNDEF_CODE;
+ while (set->next (&fd))
+ fdmap.add (fd);
+ hb_set_destroy (set);
+ if (unlikely (fdmap.get_population () != subset_fd_count))
+ return false;
+ }
+
+ /* update each font dict index stored as "code" in fdselect_ranges */
+ for (unsigned int i = 0; i < fdselect_ranges.length; i++)
+ fdselect_ranges[i].code = fdmap[fdselect_ranges[i].code];
+ }
+
+ /* determine which FDSelect format is most compact */
+ if (subset_fd_count > 0xFF)
+ {
+ if (unlikely (src.format != 4))
+ return false;
+ subset_fdselect_format = 4;
+ subset_fdselect_size = FDSelect::min_size + FDSelect4::min_size + FDSelect4_Range::static_size * num_ranges + HBUINT32::static_size;
+ }
+ else
+ {
+#if CFF_SERIALIZE_FDSELECT_0
+ unsigned int format0_size = FDSelect::min_size + FDSelect0::min_size + HBUINT8::static_size * subset_num_glyphs;
+#endif
+ unsigned int format3_size = FDSelect::min_size + FDSelect3::min_size + FDSelect3_Range::static_size * num_ranges + HBUINT16::static_size;
+
+#if CFF_SERIALIZE_FDSELECT_0
+ if (format0_size <= format3_size)
+ {
+ // subset_fdselect_format = 0;
+ subset_fdselect_size = format0_size;
+ }
+ else
+#endif
+ {
+ subset_fdselect_format = 3;
+ subset_fdselect_size = format3_size;
+ }
+ }
+
+ return true;
+}
+
+template <typename FDSELECT3_4>
+static inline bool
+serialize_fdselect_3_4 (hb_serialize_context_t *c,
+ const unsigned int num_glyphs,
+ const FDSelect &src,
+ unsigned int size,
+ const hb_vector_t<code_pair_t> &fdselect_ranges)
+{
+ TRACE_SERIALIZE (this);
+ FDSELECT3_4 *p = c->allocate_size<FDSELECT3_4> (size);
+ if (unlikely (p == nullptr)) return_trace (false);
+ p->nRanges () = fdselect_ranges.length;
+ for (unsigned int i = 0; i < fdselect_ranges.length; i++)
+ {
+ p->ranges[i].first = fdselect_ranges[i].glyph;
+ p->ranges[i].fd = fdselect_ranges[i].code;
+ }
+ p->sentinel () = num_glyphs;
+ return_trace (true);
+}
+
+/**
+ * hb_serialize_cff_fdselect
+ * Serialize a subset FDSelect format planned above.
+ **/
+bool
+hb_serialize_cff_fdselect (hb_serialize_context_t *c,
+ const unsigned int num_glyphs,
+ const FDSelect &src,
+ unsigned int fd_count,
+ unsigned int fdselect_format,
+ unsigned int size,
+ const hb_vector_t<code_pair_t> &fdselect_ranges)
+{
+ TRACE_SERIALIZE (this);
+ FDSelect *p = c->allocate_min<FDSelect> ();
+ if (unlikely (p == nullptr)) return_trace (false);
+ p->format = fdselect_format;
+ size -= FDSelect::min_size;
+
+ switch (fdselect_format)
+ {
+#if CFF_SERIALIZE_FDSELECT_0
+ case 0:
+ {
+ FDSelect0 *p = c->allocate_size<FDSelect0> (size);
+ if (unlikely (p == nullptr)) return_trace (false);
+ unsigned int range_index = 0;
+ unsigned int fd = fdselect_ranges[range_index++].code;
+ for (unsigned int i = 0; i < num_glyphs; i++)
+ {
+ if ((range_index < fdselect_ranges.len) &&
+ (i >= fdselect_ranges[range_index].glyph))
+ {
+ fd = fdselect_ranges[range_index++].code;
+ }
+ p->fds[i] = fd;
+ }
+ return_trace (true);
+ }
+#endif /* CFF_SERIALIZE_FDSELECT_0 */
+
+ case 3:
+ return serialize_fdselect_3_4<FDSelect3> (c, num_glyphs, src,
+ size, fdselect_ranges);
+
+ case 4:
+ return serialize_fdselect_3_4<FDSelect4> (c, num_glyphs, src,
+ size, fdselect_ranges);
+
+ default:
+ return_trace (false);
+ }
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.hh b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.hh
new file mode 100644
index 0000000000..3c66119603
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.hh
@@ -0,0 +1,1025 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_SUBSET_CFF_COMMON_HH
+#define HB_SUBSET_CFF_COMMON_HH
+
+#include "hb.hh"
+
+#include "hb-subset-plan.hh"
+#include "hb-cff-interp-cs-common.hh"
+
+namespace CFF {
+
+/* Used for writing a temporary charstring */
+struct str_encoder_t
+{
+ str_encoder_t (str_buff_t &buff_)
+ : buff (buff_), error (false) {}
+
+ void reset () { buff.resize (0); }
+
+ void encode_byte (unsigned char b)
+ {
+ if (unlikely (buff.push (b) == &Crap(unsigned char)))
+ set_error ();
+ }
+
+ void encode_int (int v)
+ {
+ if ((-1131 <= v) && (v <= 1131))
+ {
+ if ((-107 <= v) && (v <= 107))
+ encode_byte (v + 139);
+ else if (v > 0)
+ {
+ v -= 108;
+ encode_byte ((v >> 8) + OpCode_TwoBytePosInt0);
+ encode_byte (v & 0xFF);
+ }
+ else
+ {
+ v = -v - 108;
+ encode_byte ((v >> 8) + OpCode_TwoByteNegInt0);
+ encode_byte (v & 0xFF);
+ }
+ }
+ else
+ {
+ if (unlikely (v < -32768))
+ v = -32768;
+ else if (unlikely (v > 32767))
+ v = 32767;
+ encode_byte (OpCode_shortint);
+ encode_byte ((v >> 8) & 0xFF);
+ encode_byte (v & 0xFF);
+ }
+ }
+
+ void encode_num (const number_t& n)
+ {
+ if (n.in_int_range ())
+ {
+ encode_int (n.to_int ());
+ }
+ else
+ {
+ int32_t v = n.to_fixed ();
+ encode_byte (OpCode_fixedcs);
+ encode_byte ((v >> 24) & 0xFF);
+ encode_byte ((v >> 16) & 0xFF);
+ encode_byte ((v >> 8) & 0xFF);
+ encode_byte (v & 0xFF);
+ }
+ }
+
+ void encode_op (op_code_t op)
+ {
+ if (Is_OpCode_ESC (op))
+ {
+ encode_byte (OpCode_escape);
+ encode_byte (Unmake_OpCode_ESC (op));
+ }
+ else
+ encode_byte (op);
+ }
+
+ void copy_str (const byte_str_t &str)
+ {
+ unsigned int offset = buff.length;
+ buff.resize (offset + str.length);
+ if (unlikely (buff.length < offset + str.length))
+ {
+ set_error ();
+ return;
+ }
+ memcpy (&buff[offset], &str[0], str.length);
+ }
+
+ bool is_error () const { return error; }
+
+ protected:
+ void set_error () { error = true; }
+
+ str_buff_t &buff;
+ bool error;
+};
+
+struct cff_sub_table_offsets_t {
+ cff_sub_table_offsets_t () : privateDictsOffset (0)
+ {
+ topDictInfo.init ();
+ FDSelectInfo.init ();
+ FDArrayInfo.init ();
+ charStringsInfo.init ();
+ globalSubrsInfo.init ();
+ localSubrsInfos.init ();
+ }
+
+ ~cff_sub_table_offsets_t () { localSubrsInfos.fini (); }
+
+ table_info_t topDictInfo;
+ table_info_t FDSelectInfo;
+ table_info_t FDArrayInfo;
+ table_info_t charStringsInfo;
+ unsigned int privateDictsOffset;
+ table_info_t globalSubrsInfo;
+ hb_vector_t<table_info_t> localSubrsInfos;
+};
+
+template <typename OPSTR=op_str_t>
+struct cff_top_dict_op_serializer_t : op_serializer_t
+{
+ bool serialize (hb_serialize_context_t *c,
+ const OPSTR &opstr,
+ const cff_sub_table_offsets_t &offsets) const
+ {
+ TRACE_SERIALIZE (this);
+
+ switch (opstr.op)
+ {
+ case OpCode_CharStrings:
+ return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.charStringsInfo.offset));
+
+ case OpCode_FDArray:
+ return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.FDArrayInfo.offset));
+
+ case OpCode_FDSelect:
+ return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.FDSelectInfo.offset));
+
+ default:
+ return_trace (copy_opstr (c, opstr));
+ }
+ return_trace (true);
+ }
+
+ unsigned int calculate_serialized_size (const OPSTR &opstr) const
+ {
+ switch (opstr.op)
+ {
+ case OpCode_CharStrings:
+ case OpCode_FDArray:
+ case OpCode_FDSelect:
+ return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (opstr.op);
+
+ default:
+ return opstr.str.length;
+ }
+ }
+};
+
+struct cff_font_dict_op_serializer_t : op_serializer_t
+{
+ bool serialize (hb_serialize_context_t *c,
+ const op_str_t &opstr,
+ const table_info_t &privateDictInfo) const
+ {
+ TRACE_SERIALIZE (this);
+
+ if (opstr.op == OpCode_Private)
+ {
+ /* serialize the private dict size & offset as 2-byte & 4-byte integers */
+ if (unlikely (!UnsizedByteStr::serialize_int2 (c, privateDictInfo.size) ||
+ !UnsizedByteStr::serialize_int4 (c, privateDictInfo.offset)))
+ return_trace (false);
+
+ /* serialize the opcode */
+ HBUINT8 *p = c->allocate_size<HBUINT8> (1);
+ if (unlikely (p == nullptr)) return_trace (false);
+ *p = OpCode_Private;
+
+ return_trace (true);
+ }
+ else
+ {
+ HBUINT8 *d = c->allocate_size<HBUINT8> (opstr.str.length);
+ if (unlikely (d == nullptr)) return_trace (false);
+ memcpy (d, &opstr.str[0], opstr.str.length);
+ }
+ return_trace (true);
+ }
+
+ unsigned int calculate_serialized_size (const op_str_t &opstr) const
+ {
+ if (opstr.op == OpCode_Private)
+ return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Private);
+ else
+ return opstr.str.length;
+ }
+};
+
+struct cff_private_dict_op_serializer_t : op_serializer_t
+{
+ cff_private_dict_op_serializer_t (bool desubroutinize_, bool drop_hints_)
+ : desubroutinize (desubroutinize_), drop_hints (drop_hints_) {}
+
+ bool serialize (hb_serialize_context_t *c,
+ const op_str_t &opstr,
+ const unsigned int subrsOffset) const
+ {
+ TRACE_SERIALIZE (this);
+
+ if (drop_hints && dict_opset_t::is_hint_op (opstr.op))
+ return true;
+ if (opstr.op == OpCode_Subrs)
+ {
+ if (desubroutinize || (subrsOffset == 0))
+ return_trace (true);
+ else
+ return_trace (FontDict::serialize_offset2_op (c, opstr.op, subrsOffset));
+ }
+ else
+ return_trace (copy_opstr (c, opstr));
+ }
+
+ unsigned int calculate_serialized_size (const op_str_t &opstr,
+ bool has_localsubr=true) const
+ {
+ if (drop_hints && dict_opset_t::is_hint_op (opstr.op))
+ return 0;
+ if (opstr.op == OpCode_Subrs)
+ {
+ if (desubroutinize || !has_localsubr)
+ return 0;
+ else
+ return OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (opstr.op);
+ }
+ else
+ return opstr.str.length;
+ }
+
+ protected:
+ const bool desubroutinize;
+ const bool drop_hints;
+};
+
+struct flatten_param_t
+{
+ str_buff_t &flatStr;
+ bool drop_hints;
+};
+
+template <typename ACC, typename ENV, typename OPSET, op_code_t endchar_op=OpCode_Invalid>
+struct subr_flattener_t
+{
+ subr_flattener_t (const ACC &acc_,
+ const hb_subset_plan_t *plan_)
+ : acc (acc_), plan (plan_) {}
+
+ bool flatten (str_buff_vec_t &flat_charstrings)
+ {
+ if (!flat_charstrings.resize (plan->num_output_glyphs ()))
+ return false;
+ for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
+ flat_charstrings[i].init ();
+ for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
+ {
+ hb_codepoint_t glyph;
+ if (!plan->old_gid_for_new_gid (i, &glyph))
+ {
+ /* add an endchar only charstring for a missing glyph if CFF1 */
+ if (endchar_op != OpCode_Invalid) flat_charstrings[i].push (endchar_op);
+ continue;
+ }
+ const byte_str_t str = (*acc.charStrings)[glyph];
+ unsigned int fd = acc.fdSelect->get_fd (glyph);
+ if (unlikely (fd >= acc.fdCount))
+ return false;
+ cs_interpreter_t<ENV, OPSET, flatten_param_t> interp;
+ interp.env.init (str, acc, fd);
+ flatten_param_t param = { flat_charstrings[i], plan->drop_hints };
+ if (unlikely (!interp.interpret (param)))
+ return false;
+ }
+ return true;
+ }
+
+ const ACC &acc;
+ const hb_subset_plan_t *plan;
+};
+
+struct subr_closures_t
+{
+ subr_closures_t () : valid (false), global_closure (nullptr)
+ { local_closures.init (); }
+
+ void init (unsigned int fd_count)
+ {
+ valid = true;
+ global_closure = hb_set_create ();
+ if (global_closure == hb_set_get_empty ())
+ valid = false;
+ if (!local_closures.resize (fd_count))
+ valid = false;
+
+ for (unsigned int i = 0; i < local_closures.length; i++)
+ {
+ local_closures[i] = hb_set_create ();
+ if (local_closures[i] == hb_set_get_empty ())
+ valid = false;
+ }
+ }
+
+ void fini ()
+ {
+ hb_set_destroy (global_closure);
+ for (unsigned int i = 0; i < local_closures.length; i++)
+ hb_set_destroy (local_closures[i]);
+ local_closures.fini ();
+ }
+
+ void reset ()
+ {
+ hb_set_clear (global_closure);
+ for (unsigned int i = 0; i < local_closures.length; i++)
+ hb_set_clear (local_closures[i]);
+ }
+
+ bool is_valid () const { return valid; }
+ bool valid;
+ hb_set_t *global_closure;
+ hb_vector_t<hb_set_t *> local_closures;
+};
+
+struct parsed_cs_op_t : op_str_t
+{
+ void init (unsigned int subr_num_ = 0)
+ {
+ op_str_t::init ();
+ subr_num = subr_num_;
+ drop_flag = false;
+ keep_flag = false;
+ skip_flag = false;
+ }
+
+ void fini () { op_str_t::fini (); }
+
+ bool for_drop () const { return drop_flag; }
+ void set_drop () { if (!for_keep ()) drop_flag = true; }
+
+ bool for_keep () const { return keep_flag; }
+ void set_keep () { keep_flag = true; }
+
+ bool for_skip () const { return skip_flag; }
+ void set_skip () { skip_flag = true; }
+
+ unsigned int subr_num;
+
+ protected:
+ bool drop_flag : 1;
+ bool keep_flag : 1;
+ bool skip_flag : 1;
+};
+
+struct parsed_cs_str_t : parsed_values_t<parsed_cs_op_t>
+{
+ void init ()
+ {
+ SUPER::init ();
+ parsed = false;
+ hint_dropped = false;
+ has_prefix_ = false;
+ }
+
+ void add_op (op_code_t op, const byte_str_ref_t& str_ref)
+ {
+ if (!is_parsed ())
+ SUPER::add_op (op, str_ref);
+ }
+
+ void add_call_op (op_code_t op, const byte_str_ref_t& str_ref, unsigned int subr_num)
+ {
+ if (!is_parsed ())
+ {
+ unsigned int parsed_len = get_count ();
+ if (likely (parsed_len > 0))
+ values[parsed_len-1].set_skip ();
+
+ parsed_cs_op_t val;
+ val.init (subr_num);
+ SUPER::add_op (op, str_ref, val);
+ }
+ }
+
+ void set_prefix (const number_t &num, op_code_t op = OpCode_Invalid)
+ {
+ has_prefix_ = true;
+ prefix_op_ = op;
+ prefix_num_ = num;
+ }
+
+ bool at_end (unsigned int pos) const
+ {
+ return ((pos + 1 >= values.length) /* CFF2 */
+ || (values[pos + 1].op == OpCode_return));
+ }
+
+ bool is_parsed () const { return parsed; }
+ void set_parsed () { parsed = true; }
+
+ bool is_hint_dropped () const { return hint_dropped; }
+ void set_hint_dropped () { hint_dropped = true; }
+
+ bool is_vsindex_dropped () const { return vsindex_dropped; }
+ void set_vsindex_dropped () { vsindex_dropped = true; }
+
+ bool has_prefix () const { return has_prefix_; }
+ op_code_t prefix_op () const { return prefix_op_; }
+ const number_t &prefix_num () const { return prefix_num_; }
+
+ protected:
+ bool parsed;
+ bool hint_dropped;
+ bool vsindex_dropped;
+ bool has_prefix_;
+ op_code_t prefix_op_;
+ number_t prefix_num_;
+
+ private:
+ typedef parsed_values_t<parsed_cs_op_t> SUPER;
+};
+
+struct parsed_cs_str_vec_t : hb_vector_t<parsed_cs_str_t>
+{
+ void init (unsigned int len_ = 0)
+ {
+ SUPER::init ();
+ resize (len_);
+ for (unsigned int i = 0; i < length; i++)
+ (*this)[i].init ();
+ }
+ void fini () { SUPER::fini_deep (); }
+
+ private:
+ typedef hb_vector_t<parsed_cs_str_t> SUPER;
+};
+
+struct subr_subset_param_t
+{
+ void init (parsed_cs_str_t *parsed_charstring_,
+ parsed_cs_str_vec_t *parsed_global_subrs_, parsed_cs_str_vec_t *parsed_local_subrs_,
+ hb_set_t *global_closure_, hb_set_t *local_closure_,
+ bool drop_hints_)
+ {
+ parsed_charstring = parsed_charstring_;
+ current_parsed_str = parsed_charstring;
+ parsed_global_subrs = parsed_global_subrs_;
+ parsed_local_subrs = parsed_local_subrs_;
+ global_closure = global_closure_;
+ local_closure = local_closure_;
+ drop_hints = drop_hints_;
+ }
+
+ parsed_cs_str_t *get_parsed_str_for_context (call_context_t &context)
+ {
+ switch (context.type)
+ {
+ case CSType_CharString:
+ return parsed_charstring;
+
+ case CSType_LocalSubr:
+ if (likely (context.subr_num < parsed_local_subrs->length))
+ return &(*parsed_local_subrs)[context.subr_num];
+ break;
+
+ case CSType_GlobalSubr:
+ if (likely (context.subr_num < parsed_global_subrs->length))
+ return &(*parsed_global_subrs)[context.subr_num];
+ break;
+ }
+ return nullptr;
+ }
+
+ template <typename ENV>
+ void set_current_str (ENV &env, bool calling)
+ {
+ parsed_cs_str_t *parsed_str = get_parsed_str_for_context (env.context);
+ if (likely (parsed_str != nullptr))
+ {
+ /* If the called subroutine is parsed partially but not completely yet,
+ * it must be because we are calling it recursively.
+ * Handle it as an error. */
+ if (unlikely (calling && !parsed_str->is_parsed () && (parsed_str->values.length > 0)))
+ env.set_error ();
+ else
+ current_parsed_str = parsed_str;
+ }
+ else
+ env.set_error ();
+ }
+
+ parsed_cs_str_t *current_parsed_str;
+
+ parsed_cs_str_t *parsed_charstring;
+ parsed_cs_str_vec_t *parsed_global_subrs;
+ parsed_cs_str_vec_t *parsed_local_subrs;
+ hb_set_t *global_closure;
+ hb_set_t *local_closure;
+ bool drop_hints;
+};
+
+struct subr_remap_t : hb_inc_bimap_t
+{
+ void create (hb_set_t *closure)
+ {
+ /* create a remapping of subroutine numbers from old to new.
+ * no optimization based on usage counts. fonttools doesn't appear doing that either.
+ */
+
+ hb_codepoint_t old_num = HB_SET_VALUE_INVALID;
+ while (hb_set_next (closure, &old_num))
+ add (old_num);
+
+ if (get_population () < 1240)
+ bias = 107;
+ else if (get_population () < 33900)
+ bias = 1131;
+ else
+ bias = 32768;
+ }
+
+ int biased_num (unsigned int old_num) const
+ {
+ hb_codepoint_t new_num = get (old_num);
+ return (int)new_num - bias;
+ }
+
+ protected:
+ int bias;
+};
+
+struct subr_remaps_t
+{
+ subr_remaps_t ()
+ {
+ global_remap.init ();
+ local_remaps.init ();
+ }
+
+ ~subr_remaps_t () { fini (); }
+
+ void init (unsigned int fdCount)
+ {
+ local_remaps.resize (fdCount);
+ for (unsigned int i = 0; i < fdCount; i++)
+ local_remaps[i].init ();
+ }
+
+ void create (subr_closures_t& closures)
+ {
+ global_remap.create (closures.global_closure);
+ for (unsigned int i = 0; i < local_remaps.length; i++)
+ local_remaps[i].create (closures.local_closures[i]);
+ }
+
+ void fini ()
+ {
+ global_remap.fini ();
+ local_remaps.fini_deep ();
+ }
+
+ subr_remap_t global_remap;
+ hb_vector_t<subr_remap_t> local_remaps;
+};
+
+template <typename SUBSETTER, typename SUBRS, typename ACC, typename ENV, typename OPSET, op_code_t endchar_op=OpCode_Invalid>
+struct subr_subsetter_t
+{
+ subr_subsetter_t (ACC &acc_, const hb_subset_plan_t *plan_)
+ : acc (acc_), plan (plan_)
+ {
+ parsed_charstrings.init ();
+ parsed_global_subrs.init ();
+ parsed_local_subrs.init ();
+ }
+
+ ~subr_subsetter_t ()
+ {
+ closures.fini ();
+ remaps.fini ();
+ parsed_charstrings.fini_deep ();
+ parsed_global_subrs.fini_deep ();
+ parsed_local_subrs.fini_deep ();
+ }
+
+ /* Subroutine subsetting with --no-desubroutinize runs in phases:
+ *
+ * 1. execute charstrings/subroutines to determine subroutine closures
+ * 2. parse out all operators and numbers
+ * 3. mark hint operators and operands for removal if --no-hinting
+ * 4. re-encode all charstrings and subroutines with new subroutine numbers
+ *
+ * Phases #1 and #2 are done at the same time in collect_subrs ().
+ * Phase #3 walks charstrings/subroutines forward then backward (hence parsing required),
+ * because we can't tell if a number belongs to a hint op until we see the first moveto.
+ *
+ * Assumption: a callsubr/callgsubr operator must immediately follow a (biased) subroutine number
+ * within the same charstring/subroutine, e.g., not split across a charstring and a subroutine.
+ */
+ bool subset (void)
+ {
+ closures.init (acc.fdCount);
+ remaps.init (acc.fdCount);
+
+ parsed_charstrings.init (plan->num_output_glyphs ());
+ parsed_global_subrs.init (acc.globalSubrs->count);
+ parsed_local_subrs.resize (acc.fdCount);
+ for (unsigned int i = 0; i < acc.fdCount; i++)
+ {
+ parsed_local_subrs[i].init (acc.privateDicts[i].localSubrs->count);
+ }
+ if (unlikely (!closures.valid))
+ return false;
+
+ /* phase 1 & 2 */
+ for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
+ {
+ hb_codepoint_t glyph;
+ if (!plan->old_gid_for_new_gid (i, &glyph))
+ continue;
+ const byte_str_t str = (*acc.charStrings)[glyph];
+ unsigned int fd = acc.fdSelect->get_fd (glyph);
+ if (unlikely (fd >= acc.fdCount))
+ return false;
+
+ cs_interpreter_t<ENV, OPSET, subr_subset_param_t> interp;
+ interp.env.init (str, acc, fd);
+
+ subr_subset_param_t param;
+ param.init (&parsed_charstrings[i],
+ &parsed_global_subrs, &parsed_local_subrs[fd],
+ closures.global_closure, closures.local_closures[fd],
+ plan->drop_hints);
+
+ if (unlikely (!interp.interpret (param)))
+ return false;
+
+ /* finalize parsed string esp. copy CFF1 width or CFF2 vsindex to the parsed charstring for encoding */
+ SUBSETTER::finalize_parsed_str (interp.env, param, parsed_charstrings[i]);
+ }
+
+ if (plan->drop_hints)
+ {
+ /* mark hint ops and arguments for drop */
+ for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
+ {
+ hb_codepoint_t glyph;
+ if (!plan->old_gid_for_new_gid (i, &glyph))
+ continue;
+ unsigned int fd = acc.fdSelect->get_fd (glyph);
+ if (unlikely (fd >= acc.fdCount))
+ return false;
+ subr_subset_param_t param;
+ param.init (&parsed_charstrings[i],
+ &parsed_global_subrs, &parsed_local_subrs[fd],
+ closures.global_closure, closures.local_closures[fd],
+ plan->drop_hints);
+
+ drop_hints_param_t drop;
+ if (drop_hints_in_str (parsed_charstrings[i], param, drop))
+ {
+ parsed_charstrings[i].set_hint_dropped ();
+ if (drop.vsindex_dropped)
+ parsed_charstrings[i].set_vsindex_dropped ();
+ }
+ }
+
+ /* after dropping hints recreate closures of actually used subrs */
+ closures.reset ();
+ for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
+ {
+ hb_codepoint_t glyph;
+ if (!plan->old_gid_for_new_gid (i, &glyph))
+ continue;
+ unsigned int fd = acc.fdSelect->get_fd (glyph);
+ if (unlikely (fd >= acc.fdCount))
+ return false;
+ subr_subset_param_t param;
+ param.init (&parsed_charstrings[i],
+ &parsed_global_subrs, &parsed_local_subrs[fd],
+ closures.global_closure, closures.local_closures[fd],
+ plan->drop_hints);
+ collect_subr_refs_in_str (parsed_charstrings[i], param);
+ }
+ }
+
+ remaps.create (closures);
+
+ return true;
+ }
+
+ bool encode_charstrings (str_buff_vec_t &buffArray) const
+ {
+ if (unlikely (!buffArray.resize (plan->num_output_glyphs ())))
+ return false;
+ for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
+ {
+ hb_codepoint_t glyph;
+ if (!plan->old_gid_for_new_gid (i, &glyph))
+ {
+ /* add an endchar only charstring for a missing glyph if CFF1 */
+ if (endchar_op != OpCode_Invalid) buffArray[i].push (endchar_op);
+ continue;
+ }
+ unsigned int fd = acc.fdSelect->get_fd (glyph);
+ if (unlikely (fd >= acc.fdCount))
+ return false;
+ if (unlikely (!encode_str (parsed_charstrings[i], fd, buffArray[i])))
+ return false;
+ }
+ return true;
+ }
+
+ bool encode_subrs (const parsed_cs_str_vec_t &subrs, const subr_remap_t& remap, unsigned int fd, str_buff_vec_t &buffArray) const
+ {
+ unsigned int count = remap.get_population ();
+
+ if (unlikely (!buffArray.resize (count)))
+ return false;
+ for (unsigned int old_num = 0; old_num < subrs.length; old_num++)
+ {
+ hb_codepoint_t new_num = remap[old_num];
+ if (new_num != CFF_UNDEF_CODE)
+ {
+ if (unlikely (!encode_str (subrs[old_num], fd, buffArray[new_num])))
+ return false;
+ }
+ }
+ return true;
+ }
+
+ bool encode_globalsubrs (str_buff_vec_t &buffArray)
+ {
+ return encode_subrs (parsed_global_subrs, remaps.global_remap, 0, buffArray);
+ }
+
+ bool encode_localsubrs (unsigned int fd, str_buff_vec_t &buffArray) const
+ {
+ return encode_subrs (parsed_local_subrs[fd], remaps.local_remaps[fd], fd, buffArray);
+ }
+
+ protected:
+ struct drop_hints_param_t
+ {
+ drop_hints_param_t ()
+ : seen_moveto (false),
+ ends_in_hint (false),
+ all_dropped (false),
+ vsindex_dropped (false) {}
+
+ bool seen_moveto;
+ bool ends_in_hint;
+ bool all_dropped;
+ bool vsindex_dropped;
+ };
+
+ bool drop_hints_in_subr (parsed_cs_str_t &str, unsigned int pos,
+ parsed_cs_str_vec_t &subrs, unsigned int subr_num,
+ const subr_subset_param_t &param, drop_hints_param_t &drop)
+ {
+ drop.ends_in_hint = false;
+ bool has_hint = drop_hints_in_str (subrs[subr_num], param, drop);
+
+ /* if this subr ends with a stem hint (i.e., not a number; potential argument for moveto),
+ * then this entire subroutine must be a hint. drop its call. */
+ if (drop.ends_in_hint)
+ {
+ str.values[pos].set_drop ();
+ /* if this subr call is at the end of the parent subr, propagate the flag
+ * otherwise reset the flag */
+ if (!str.at_end (pos))
+ drop.ends_in_hint = false;
+ }
+ else if (drop.all_dropped)
+ {
+ str.values[pos].set_drop ();
+ }
+
+ return has_hint;
+ }
+
+ /* returns true if it sees a hint op before the first moveto */
+ bool drop_hints_in_str (parsed_cs_str_t &str, const subr_subset_param_t &param, drop_hints_param_t &drop)
+ {
+ bool seen_hint = false;
+
+ for (unsigned int pos = 0; pos < str.values.length; pos++)
+ {
+ bool has_hint = false;
+ switch (str.values[pos].op)
+ {
+ case OpCode_callsubr:
+ has_hint = drop_hints_in_subr (str, pos,
+ *param.parsed_local_subrs, str.values[pos].subr_num,
+ param, drop);
+ break;
+
+ case OpCode_callgsubr:
+ has_hint = drop_hints_in_subr (str, pos,
+ *param.parsed_global_subrs, str.values[pos].subr_num,
+ param, drop);
+ break;
+
+ case OpCode_rmoveto:
+ case OpCode_hmoveto:
+ case OpCode_vmoveto:
+ drop.seen_moveto = true;
+ break;
+
+ case OpCode_hintmask:
+ case OpCode_cntrmask:
+ if (drop.seen_moveto)
+ {
+ str.values[pos].set_drop ();
+ break;
+ }
+ HB_FALLTHROUGH;
+
+ case OpCode_hstemhm:
+ case OpCode_vstemhm:
+ case OpCode_hstem:
+ case OpCode_vstem:
+ has_hint = true;
+ str.values[pos].set_drop ();
+ if (str.at_end (pos))
+ drop.ends_in_hint = true;
+ break;
+
+ case OpCode_dotsection:
+ str.values[pos].set_drop ();
+ break;
+
+ default:
+ /* NONE */
+ break;
+ }
+ if (has_hint)
+ {
+ for (int i = pos - 1; i >= 0; i--)
+ {
+ parsed_cs_op_t &csop = str.values[(unsigned)i];
+ if (csop.for_drop ())
+ break;
+ csop.set_drop ();
+ if (csop.op == OpCode_vsindexcs)
+ drop.vsindex_dropped = true;
+ }
+ seen_hint |= has_hint;
+ }
+ }
+
+ /* Raise all_dropped flag if all operators except return are dropped from a subr.
+ * It may happen even after seeing the first moveto if a subr contains
+ * only (usually one) hintmask operator, then calls to this subr can be dropped.
+ */
+ drop.all_dropped = true;
+ for (unsigned int pos = 0; pos < str.values.length; pos++)
+ {
+ parsed_cs_op_t &csop = str.values[pos];
+ if (csop.op == OpCode_return)
+ break;
+ if (!csop.for_drop ())
+ {
+ drop.all_dropped = false;
+ break;
+ }
+ }
+
+ return seen_hint;
+ }
+
+ void collect_subr_refs_in_subr (parsed_cs_str_t &str, unsigned int pos,
+ unsigned int subr_num, parsed_cs_str_vec_t &subrs,
+ hb_set_t *closure,
+ const subr_subset_param_t &param)
+ {
+ closure->add (subr_num);
+ collect_subr_refs_in_str (subrs[subr_num], param);
+ }
+
+ void collect_subr_refs_in_str (parsed_cs_str_t &str, const subr_subset_param_t &param)
+ {
+ for (unsigned int pos = 0; pos < str.values.length; pos++)
+ {
+ if (!str.values[pos].for_drop ())
+ {
+ switch (str.values[pos].op)
+ {
+ case OpCode_callsubr:
+ collect_subr_refs_in_subr (str, pos,
+ str.values[pos].subr_num, *param.parsed_local_subrs,
+ param.local_closure, param);
+ break;
+
+ case OpCode_callgsubr:
+ collect_subr_refs_in_subr (str, pos,
+ str.values[pos].subr_num, *param.parsed_global_subrs,
+ param.global_closure, param);
+ break;
+
+ default: break;
+ }
+ }
+ }
+ }
+
+ bool encode_str (const parsed_cs_str_t &str, const unsigned int fd, str_buff_t &buff) const
+ {
+ buff.init ();
+ str_encoder_t encoder (buff);
+ encoder.reset ();
+ /* if a prefix (CFF1 width or CFF2 vsindex) has been removed along with hints,
+ * re-insert it at the beginning of charstreing */
+ if (str.has_prefix () && str.is_hint_dropped ())
+ {
+ encoder.encode_num (str.prefix_num ());
+ if (str.prefix_op () != OpCode_Invalid)
+ encoder.encode_op (str.prefix_op ());
+ }
+ for (unsigned int i = 0; i < str.get_count(); i++)
+ {
+ const parsed_cs_op_t &opstr = str.values[i];
+ if (!opstr.for_drop () && !opstr.for_skip ())
+ {
+ switch (opstr.op)
+ {
+ case OpCode_callsubr:
+ encoder.encode_int (remaps.local_remaps[fd].biased_num (opstr.subr_num));
+ encoder.encode_op (OpCode_callsubr);
+ break;
+
+ case OpCode_callgsubr:
+ encoder.encode_int (remaps.global_remap.biased_num (opstr.subr_num));
+ encoder.encode_op (OpCode_callgsubr);
+ break;
+
+ default:
+ encoder.copy_str (opstr.str);
+ break;
+ }
+ }
+ }
+ return !encoder.is_error ();
+ }
+
+ protected:
+ const ACC &acc;
+ const hb_subset_plan_t *plan;
+
+ subr_closures_t closures;
+
+ parsed_cs_str_vec_t parsed_charstrings;
+ parsed_cs_str_vec_t parsed_global_subrs;
+ hb_vector_t<parsed_cs_str_vec_t> parsed_local_subrs;
+
+ subr_remaps_t remaps;
+
+ private:
+ typedef typename SUBRS::count_type subr_count_type;
+};
+
+} /* namespace CFF */
+
+HB_INTERNAL bool
+hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan,
+ unsigned int fdCount,
+ const CFF::FDSelect &src, /* IN */
+ unsigned int &subset_fd_count /* OUT */,
+ unsigned int &subset_fdselect_size /* OUT */,
+ unsigned int &subset_fdselect_format /* OUT */,
+ hb_vector_t<CFF::code_pair_t> &fdselect_ranges /* OUT */,
+ hb_inc_bimap_t &fdmap /* OUT */);
+
+HB_INTERNAL bool
+hb_serialize_cff_fdselect (hb_serialize_context_t *c,
+ unsigned int num_glyphs,
+ const CFF::FDSelect &src,
+ unsigned int fd_count,
+ unsigned int fdselect_format,
+ unsigned int size,
+ const hb_vector_t<CFF::code_pair_t> &fdselect_ranges);
+
+#endif /* HB_SUBSET_CFF_COMMON_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.cc b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.cc
new file mode 100644
index 0000000000..e9e075749e
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.cc
@@ -0,0 +1,1127 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_SUBSET_CFF
+
+#include "hb-open-type.hh"
+#include "hb-ot-cff1-table.hh"
+#include "hb-set.h"
+#include "hb-bimap.hh"
+#include "hb-subset-cff1.hh"
+#include "hb-subset-plan.hh"
+#include "hb-subset-cff-common.hh"
+#include "hb-cff1-interp-cs.hh"
+
+using namespace CFF;
+
+struct remap_sid_t : hb_inc_bimap_t
+{
+ unsigned int add (unsigned int sid)
+ {
+ if ((sid != CFF_UNDEF_SID) && !is_std_std (sid))
+ return offset_sid (hb_inc_bimap_t::add (unoffset_sid (sid)));
+ else
+ return sid;
+ }
+
+ unsigned int operator[] (unsigned int sid) const
+ {
+ if (is_std_std (sid) || (sid == CFF_UNDEF_SID))
+ return sid;
+ else
+ return offset_sid (get (unoffset_sid (sid)));
+ }
+
+ static const unsigned int num_std_strings = 391;
+
+ static bool is_std_std (unsigned int sid) { return sid < num_std_strings; }
+ static unsigned int offset_sid (unsigned int sid) { return sid + num_std_strings; }
+ static unsigned int unoffset_sid (unsigned int sid) { return sid - num_std_strings; }
+};
+
+struct cff1_sub_table_offsets_t : cff_sub_table_offsets_t
+{
+ cff1_sub_table_offsets_t ()
+ : cff_sub_table_offsets_t (),
+ nameIndexOffset (0),
+ encodingOffset (0)
+ {
+ stringIndexInfo.init ();
+ charsetInfo.init ();
+ privateDictInfo.init ();
+ }
+
+ unsigned int nameIndexOffset;
+ table_info_t stringIndexInfo;
+ unsigned int encodingOffset;
+ table_info_t charsetInfo;
+ table_info_t privateDictInfo;
+};
+
+/* a copy of a parsed out cff1_top_dict_values_t augmented with additional operators */
+struct cff1_top_dict_values_mod_t : cff1_top_dict_values_t
+{
+ void init (const cff1_top_dict_values_t *base_= &Null(cff1_top_dict_values_t))
+ {
+ SUPER::init ();
+ base = base_;
+ }
+
+ void fini () { SUPER::fini (); }
+
+ unsigned get_count () const { return base->get_count () + SUPER::get_count (); }
+ const cff1_top_dict_val_t &get_value (unsigned int i) const
+ {
+ if (i < base->get_count ())
+ return (*base)[i];
+ else
+ return SUPER::values[i - base->get_count ()];
+ }
+ const cff1_top_dict_val_t &operator [] (unsigned int i) const { return get_value (i); }
+
+ void reassignSIDs (const remap_sid_t& sidmap)
+ {
+ for (unsigned int i = 0; i < name_dict_values_t::ValCount; i++)
+ nameSIDs[i] = sidmap[base->nameSIDs[i]];
+ }
+
+ protected:
+ typedef cff1_top_dict_values_t SUPER;
+ const cff1_top_dict_values_t *base;
+};
+
+struct top_dict_modifiers_t
+{
+ top_dict_modifiers_t (const cff1_sub_table_offsets_t &offsets_,
+ const unsigned int (&nameSIDs_)[name_dict_values_t::ValCount])
+ : offsets (offsets_),
+ nameSIDs (nameSIDs_)
+ {}
+
+ const cff1_sub_table_offsets_t &offsets;
+ const unsigned int (&nameSIDs)[name_dict_values_t::ValCount];
+};
+
+struct cff1_top_dict_op_serializer_t : cff_top_dict_op_serializer_t<cff1_top_dict_val_t>
+{
+ bool serialize (hb_serialize_context_t *c,
+ const cff1_top_dict_val_t &opstr,
+ const top_dict_modifiers_t &mod) const
+ {
+ TRACE_SERIALIZE (this);
+
+ op_code_t op = opstr.op;
+ switch (op)
+ {
+ case OpCode_charset:
+ return_trace (FontDict::serialize_offset4_op(c, op, mod.offsets.charsetInfo.offset));
+
+ case OpCode_Encoding:
+ return_trace (FontDict::serialize_offset4_op(c, op, mod.offsets.encodingOffset));
+
+ case OpCode_Private:
+ {
+ if (unlikely (!UnsizedByteStr::serialize_int2 (c, mod.offsets.privateDictInfo.size)))
+ return_trace (false);
+ if (unlikely (!UnsizedByteStr::serialize_int4 (c, mod.offsets.privateDictInfo.offset)))
+ return_trace (false);
+ HBUINT8 *p = c->allocate_size<HBUINT8> (1);
+ if (unlikely (p == nullptr)) return_trace (false);
+ *p = OpCode_Private;
+ }
+ break;
+
+ case OpCode_version:
+ case OpCode_Notice:
+ case OpCode_Copyright:
+ case OpCode_FullName:
+ case OpCode_FamilyName:
+ case OpCode_Weight:
+ case OpCode_PostScript:
+ case OpCode_BaseFontName:
+ case OpCode_FontName:
+ return_trace (FontDict::serialize_offset2_op(c, op, mod.nameSIDs[name_dict_values_t::name_op_to_index (op)]));
+
+ case OpCode_ROS:
+ {
+ /* for registry & ordering, reassigned SIDs are serialized
+ * for supplement, the original byte string is copied along with the op code */
+ op_str_t supp_op;
+ supp_op.op = op;
+ if ( unlikely (!(opstr.str.length >= opstr.last_arg_offset + 3)))
+ return_trace (false);
+ supp_op.str = byte_str_t (&opstr.str + opstr.last_arg_offset, opstr.str.length - opstr.last_arg_offset);
+ return_trace (UnsizedByteStr::serialize_int2 (c, mod.nameSIDs[name_dict_values_t::registry]) &&
+ UnsizedByteStr::serialize_int2 (c, mod.nameSIDs[name_dict_values_t::ordering]) &&
+ copy_opstr (c, supp_op));
+ }
+ default:
+ return_trace (cff_top_dict_op_serializer_t<cff1_top_dict_val_t>::serialize (c, opstr, mod.offsets));
+ }
+ return_trace (true);
+ }
+
+ unsigned int calculate_serialized_size (const cff1_top_dict_val_t &opstr) const
+ {
+ op_code_t op = opstr.op;
+ switch (op)
+ {
+ case OpCode_charset:
+ case OpCode_Encoding:
+ return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (op);
+
+ case OpCode_Private:
+ return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Private);
+
+ case OpCode_version:
+ case OpCode_Notice:
+ case OpCode_Copyright:
+ case OpCode_FullName:
+ case OpCode_FamilyName:
+ case OpCode_Weight:
+ case OpCode_PostScript:
+ case OpCode_BaseFontName:
+ case OpCode_FontName:
+ return OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (op);
+
+ case OpCode_ROS:
+ return ((OpCode_Size (OpCode_shortint) + 2) * 2) + (opstr.str.length - opstr.last_arg_offset)/* supplement + op */;
+
+ default:
+ return cff_top_dict_op_serializer_t<cff1_top_dict_val_t>::calculate_serialized_size (opstr);
+ }
+ }
+};
+
+struct font_dict_values_mod_t
+{
+ void init (const cff1_font_dict_values_t *base_,
+ unsigned int fontName_,
+ const table_info_t &privateDictInfo_)
+ {
+ base = base_;
+ fontName = fontName_;
+ privateDictInfo = privateDictInfo_;
+ }
+
+ unsigned get_count () const { return base->get_count (); }
+
+ const op_str_t &operator [] (unsigned int i) const { return (*base)[i]; }
+
+ const cff1_font_dict_values_t *base;
+ table_info_t privateDictInfo;
+ unsigned int fontName;
+};
+
+struct cff1_font_dict_op_serializer_t : cff_font_dict_op_serializer_t
+{
+ bool serialize (hb_serialize_context_t *c,
+ const op_str_t &opstr,
+ const font_dict_values_mod_t &mod) const
+ {
+ TRACE_SERIALIZE (this);
+
+ if (opstr.op == OpCode_FontName)
+ return_trace (FontDict::serialize_uint2_op (c, opstr.op, mod.fontName));
+ else
+ return_trace (SUPER::serialize (c, opstr, mod.privateDictInfo));
+ }
+
+ unsigned int calculate_serialized_size (const op_str_t &opstr) const
+ {
+ if (opstr.op == OpCode_FontName)
+ return OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_FontName);
+ else
+ return SUPER::calculate_serialized_size (opstr);
+ }
+
+ private:
+ typedef cff_font_dict_op_serializer_t SUPER;
+};
+
+struct cff1_cs_opset_flatten_t : cff1_cs_opset_t<cff1_cs_opset_flatten_t, flatten_param_t>
+{
+ static void flush_args_and_op (op_code_t op, cff1_cs_interp_env_t &env, flatten_param_t& param)
+ {
+ if (env.arg_start > 0)
+ flush_width (env, param);
+
+ switch (op)
+ {
+ case OpCode_hstem:
+ case OpCode_hstemhm:
+ case OpCode_vstem:
+ case OpCode_vstemhm:
+ case OpCode_hintmask:
+ case OpCode_cntrmask:
+ case OpCode_dotsection:
+ if (param.drop_hints)
+ {
+ env.clear_args ();
+ return;
+ }
+ HB_FALLTHROUGH;
+
+ default:
+ SUPER::flush_args_and_op (op, env, param);
+ break;
+ }
+ }
+ static void flush_args (cff1_cs_interp_env_t &env, flatten_param_t& param)
+ {
+ str_encoder_t encoder (param.flatStr);
+ for (unsigned int i = env.arg_start; i < env.argStack.get_count (); i++)
+ encoder.encode_num (env.eval_arg (i));
+ SUPER::flush_args (env, param);
+ }
+
+ static void flush_op (op_code_t op, cff1_cs_interp_env_t &env, flatten_param_t& param)
+ {
+ str_encoder_t encoder (param.flatStr);
+ encoder.encode_op (op);
+ }
+
+ static void flush_width (cff1_cs_interp_env_t &env, flatten_param_t& param)
+ {
+ assert (env.has_width);
+ str_encoder_t encoder (param.flatStr);
+ encoder.encode_num (env.width);
+ }
+
+ static void flush_hintmask (op_code_t op, cff1_cs_interp_env_t &env, flatten_param_t& param)
+ {
+ SUPER::flush_hintmask (op, env, param);
+ if (!param.drop_hints)
+ {
+ str_encoder_t encoder (param.flatStr);
+ for (unsigned int i = 0; i < env.hintmask_size; i++)
+ encoder.encode_byte (env.str_ref[i]);
+ }
+ }
+
+ private:
+ typedef cff1_cs_opset_t<cff1_cs_opset_flatten_t, flatten_param_t> SUPER;
+};
+
+struct range_list_t : hb_vector_t<code_pair_t>
+{
+ /* replace the first glyph ID in the "glyph" field each range with a nLeft value */
+ bool finalize (unsigned int last_glyph)
+ {
+ bool two_byte = false;
+ for (unsigned int i = (*this).length; i > 0; i--)
+ {
+ code_pair_t &pair = (*this)[i - 1];
+ unsigned int nLeft = last_glyph - pair.glyph - 1;
+ if (nLeft >= 0x100)
+ two_byte = true;
+ last_glyph = pair.glyph;
+ pair.glyph = nLeft;
+ }
+ return two_byte;
+ }
+};
+
+struct cff1_cs_opset_subr_subset_t : cff1_cs_opset_t<cff1_cs_opset_subr_subset_t, subr_subset_param_t>
+{
+ static void process_op (op_code_t op, cff1_cs_interp_env_t &env, subr_subset_param_t& param)
+ {
+ switch (op) {
+
+ case OpCode_return:
+ param.current_parsed_str->add_op (op, env.str_ref);
+ param.current_parsed_str->set_parsed ();
+ env.return_from_subr ();
+ param.set_current_str (env, false);
+ break;
+
+ case OpCode_endchar:
+ param.current_parsed_str->add_op (op, env.str_ref);
+ param.current_parsed_str->set_parsed ();
+ SUPER::process_op (op, env, param);
+ break;
+
+ case OpCode_callsubr:
+ process_call_subr (op, CSType_LocalSubr, env, param, env.localSubrs, param.local_closure);
+ break;
+
+ case OpCode_callgsubr:
+ process_call_subr (op, CSType_GlobalSubr, env, param, env.globalSubrs, param.global_closure);
+ break;
+
+ default:
+ SUPER::process_op (op, env, param);
+ param.current_parsed_str->add_op (op, env.str_ref);
+ break;
+ }
+ }
+
+ protected:
+ static void process_call_subr (op_code_t op, cs_type_t type,
+ cff1_cs_interp_env_t &env, subr_subset_param_t& param,
+ cff1_biased_subrs_t& subrs, hb_set_t *closure)
+ {
+ byte_str_ref_t str_ref = env.str_ref;
+ env.call_subr (subrs, type);
+ param.current_parsed_str->add_call_op (op, str_ref, env.context.subr_num);
+ closure->add (env.context.subr_num);
+ param.set_current_str (env, true);
+ }
+
+ private:
+ typedef cff1_cs_opset_t<cff1_cs_opset_subr_subset_t, subr_subset_param_t> SUPER;
+};
+
+struct cff1_subr_subsetter_t : subr_subsetter_t<cff1_subr_subsetter_t, CFF1Subrs, const OT::cff1::accelerator_subset_t, cff1_cs_interp_env_t, cff1_cs_opset_subr_subset_t, OpCode_endchar>
+{
+ cff1_subr_subsetter_t (const OT::cff1::accelerator_subset_t &acc_, const hb_subset_plan_t *plan_)
+ : subr_subsetter_t (acc_, plan_) {}
+
+ static void finalize_parsed_str (cff1_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring)
+ {
+ /* insert width at the beginning of the charstring as necessary */
+ if (env.has_width)
+ charstring.set_prefix (env.width);
+
+ /* subroutines/charstring left on the call stack are legally left unmarked
+ * unmarked when a subroutine terminates with endchar. mark them.
+ */
+ param.current_parsed_str->set_parsed ();
+ for (unsigned int i = 0; i < env.callStack.get_count (); i++)
+ {
+ parsed_cs_str_t *parsed_str = param.get_parsed_str_for_context (env.callStack[i]);
+ if (likely (parsed_str != nullptr))
+ parsed_str->set_parsed ();
+ else
+ env.set_error ();
+ }
+ }
+};
+
+struct cff_subset_plan {
+ cff_subset_plan ()
+ : final_size (0),
+ offsets (),
+ orig_fdcount (0),
+ subset_fdcount (1),
+ subset_fdselect_format (0),
+ drop_hints (false),
+ desubroutinize(false)
+ {
+ topdict_sizes.init ();
+ topdict_sizes.resize (1);
+ topdict_mod.init ();
+ subset_fdselect_ranges.init ();
+ fdmap.init ();
+ subset_charstrings.init ();
+ subset_globalsubrs.init ();
+ subset_localsubrs.init ();
+ fontdicts_mod.init ();
+ subset_enc_code_ranges.init ();
+ subset_enc_supp_codes.init ();
+ subset_charset_ranges.init ();
+ sidmap.init ();
+ for (unsigned int i = 0; i < name_dict_values_t::ValCount; i++)
+ topDictModSIDs[i] = CFF_UNDEF_SID;
+ }
+
+ ~cff_subset_plan ()
+ {
+ topdict_sizes.fini ();
+ topdict_mod.fini ();
+ subset_fdselect_ranges.fini ();
+ fdmap.fini ();
+ subset_charstrings.fini_deep ();
+ subset_globalsubrs.fini_deep ();
+ subset_localsubrs.fini_deep ();
+ fontdicts_mod.fini ();
+ subset_enc_code_ranges.fini ();
+ subset_enc_supp_codes.fini ();
+ subset_charset_ranges.fini ();
+ sidmap.fini ();
+ }
+
+ unsigned int plan_subset_encoding (const OT::cff1::accelerator_subset_t &acc, hb_subset_plan_t *plan)
+ {
+ const Encoding *encoding = acc.encoding;
+ unsigned int size0, size1, supp_size;
+ hb_codepoint_t code, last_code = CFF_UNDEF_CODE;
+ hb_vector_t<hb_codepoint_t> supp_codes;
+
+ subset_enc_code_ranges.resize (0);
+ supp_size = 0;
+ supp_codes.init ();
+
+ subset_enc_num_codes = plan->num_output_glyphs () - 1;
+ unsigned int glyph;
+ for (glyph = 1; glyph < plan->num_output_glyphs (); glyph++)
+ {
+ hb_codepoint_t old_glyph;
+ if (!plan->old_gid_for_new_gid (glyph, &old_glyph))
+ {
+ /* Retain the code for the old missing glyph ID */
+ old_glyph = glyph;
+ }
+ code = acc.glyph_to_code (old_glyph);
+ if (code == CFF_UNDEF_CODE)
+ {
+ subset_enc_num_codes = glyph - 1;
+ break;
+ }
+
+ if ((last_code == CFF_UNDEF_CODE) || (code != last_code + 1))
+ {
+ code_pair_t pair = { code, glyph };
+ subset_enc_code_ranges.push (pair);
+ }
+ last_code = code;
+
+ if (encoding != &Null(Encoding))
+ {
+ hb_codepoint_t sid = acc.glyph_to_sid (old_glyph);
+ encoding->get_supplement_codes (sid, supp_codes);
+ for (unsigned int i = 0; i < supp_codes.length; i++)
+ {
+ code_pair_t pair = { supp_codes[i], sid };
+ subset_enc_supp_codes.push (pair);
+ }
+ supp_size += SuppEncoding::static_size * supp_codes.length;
+ }
+ }
+ supp_codes.fini ();
+
+ subset_enc_code_ranges.finalize (glyph);
+
+ assert (subset_enc_num_codes <= 0xFF);
+ size0 = Encoding0::min_size + HBUINT8::static_size * subset_enc_num_codes;
+ size1 = Encoding1::min_size + Encoding1_Range::static_size * subset_enc_code_ranges.length;
+
+ if (size0 < size1)
+ subset_enc_format = 0;
+ else
+ subset_enc_format = 1;
+
+ return Encoding::calculate_serialized_size (
+ subset_enc_format,
+ subset_enc_format? subset_enc_code_ranges.length: subset_enc_num_codes,
+ subset_enc_supp_codes.length);
+ }
+
+ unsigned int plan_subset_charset (const OT::cff1::accelerator_subset_t &acc, hb_subset_plan_t *plan)
+ {
+ unsigned int size0, size_ranges;
+ hb_codepoint_t sid, last_sid = CFF_UNDEF_CODE;
+
+ subset_charset_ranges.resize (0);
+ unsigned int glyph;
+ for (glyph = 1; glyph < plan->num_output_glyphs (); glyph++)
+ {
+ hb_codepoint_t old_glyph;
+ if (!plan->old_gid_for_new_gid (glyph, &old_glyph))
+ {
+ /* Retain the SID for the old missing glyph ID */
+ old_glyph = glyph;
+ }
+ sid = acc.glyph_to_sid (old_glyph);
+
+ if (!acc.is_CID ())
+ sid = sidmap.add (sid);
+
+ if ((last_sid == CFF_UNDEF_CODE) || (sid != last_sid + 1))
+ {
+ code_pair_t pair = { sid, glyph };
+ subset_charset_ranges.push (pair);
+ }
+ last_sid = sid;
+ }
+
+ bool two_byte = subset_charset_ranges.finalize (glyph);
+
+ size0 = Charset0::min_size + HBUINT16::static_size * (plan->num_output_glyphs () - 1);
+ if (!two_byte)
+ size_ranges = Charset1::min_size + Charset1_Range::static_size * subset_charset_ranges.length;
+ else
+ size_ranges = Charset2::min_size + Charset2_Range::static_size * subset_charset_ranges.length;
+
+ if (size0 < size_ranges)
+ subset_charset_format = 0;
+ else if (!two_byte)
+ subset_charset_format = 1;
+ else
+ subset_charset_format = 2;
+
+ return Charset::calculate_serialized_size (
+ subset_charset_format,
+ subset_charset_format? subset_charset_ranges.length: plan->num_output_glyphs ());
+ }
+
+ bool collect_sids_in_dicts (const OT::cff1::accelerator_subset_t &acc)
+ {
+ sidmap.reset ();
+
+ for (unsigned int i = 0; i < name_dict_values_t::ValCount; i++)
+ {
+ unsigned int sid = acc.topDict.nameSIDs[i];
+ if (sid != CFF_UNDEF_SID)
+ {
+ (void)sidmap.add (sid);
+ topDictModSIDs[i] = sidmap[sid];
+ }
+ }
+
+ if (acc.fdArray != &Null(CFF1FDArray))
+ for (unsigned int i = 0; i < orig_fdcount; i++)
+ if (fdmap.has (i))
+ (void)sidmap.add (acc.fontDicts[i].fontName);
+
+ return true;
+ }
+
+ bool create (const OT::cff1::accelerator_subset_t &acc,
+ hb_subset_plan_t *plan)
+ {
+ /* make sure notdef is first */
+ hb_codepoint_t old_glyph;
+ if (!plan->old_gid_for_new_gid (0, &old_glyph) || (old_glyph != 0)) return false;
+
+ final_size = 0;
+ num_glyphs = plan->num_output_glyphs ();
+ orig_fdcount = acc.fdCount;
+ drop_hints = plan->drop_hints;
+ desubroutinize = plan->desubroutinize;
+
+ /* check whether the subset renumbers any glyph IDs */
+ gid_renum = false;
+ for (hb_codepoint_t new_glyph = 0; new_glyph < plan->num_output_glyphs (); new_glyph++)
+ {
+ if (!plan->old_gid_for_new_gid(new_glyph, &old_glyph))
+ continue;
+ if (new_glyph != old_glyph) {
+ gid_renum = true;
+ break;
+ }
+ }
+
+ subset_charset = gid_renum || !acc.is_predef_charset ();
+ subset_encoding = !acc.is_CID() && !acc.is_predef_encoding ();
+
+ /* CFF header */
+ final_size += OT::cff1::static_size;
+
+ /* Name INDEX */
+ offsets.nameIndexOffset = final_size;
+ final_size += acc.nameIndex->get_size ();
+
+ /* top dict INDEX */
+ {
+ /* Add encoding/charset to a (copy of) top dict as necessary */
+ topdict_mod.init (&acc.topDict);
+ bool need_to_add_enc = (subset_encoding && !acc.topDict.has_op (OpCode_Encoding));
+ bool need_to_add_set = (subset_charset && !acc.topDict.has_op (OpCode_charset));
+ if (need_to_add_enc || need_to_add_set)
+ {
+ if (need_to_add_enc)
+ topdict_mod.add_op (OpCode_Encoding);
+ if (need_to_add_set)
+ topdict_mod.add_op (OpCode_charset);
+ }
+ offsets.topDictInfo.offset = final_size;
+ cff1_top_dict_op_serializer_t topSzr;
+ unsigned int topDictSize = TopDict::calculate_serialized_size (topdict_mod, topSzr);
+ offsets.topDictInfo.offSize = calcOffSize(topDictSize);
+ if (unlikely (offsets.topDictInfo.offSize > 4))
+ return false;
+ final_size += CFF1IndexOf<TopDict>::calculate_serialized_size<cff1_top_dict_values_mod_t>
+ (offsets.topDictInfo.offSize,
+ &topdict_mod, 1, topdict_sizes, topSzr);
+ }
+
+ /* Determine re-mapping of font index as fdmap among other info */
+ if (acc.fdSelect != &Null(CFF1FDSelect))
+ {
+ if (unlikely (!hb_plan_subset_cff_fdselect (plan,
+ orig_fdcount,
+ *acc.fdSelect,
+ subset_fdcount,
+ offsets.FDSelectInfo.size,
+ subset_fdselect_format,
+ subset_fdselect_ranges,
+ fdmap)))
+ return false;
+ }
+ else
+ fdmap.identity (1);
+
+ /* remove unused SIDs & reassign SIDs */
+ {
+ /* SIDs for name strings in dicts are added before glyph names so they fit in 16-bit int range */
+ if (unlikely (!collect_sids_in_dicts (acc)))
+ return false;
+ if (unlikely (sidmap.get_population () > 0x8000)) /* assumption: a dict won't reference that many strings */
+ return false;
+ if (subset_charset)
+ offsets.charsetInfo.size = plan_subset_charset (acc, plan);
+
+ topdict_mod.reassignSIDs (sidmap);
+ }
+
+ /* String INDEX */
+ {
+ offsets.stringIndexInfo.offset = final_size;
+ offsets.stringIndexInfo.size = acc.stringIndex->calculate_serialized_size (offsets.stringIndexInfo.offSize, sidmap);
+ final_size += offsets.stringIndexInfo.size;
+ }
+
+ if (desubroutinize)
+ {
+ /* Flatten global & local subrs */
+ subr_flattener_t<const OT::cff1::accelerator_subset_t, cff1_cs_interp_env_t, cff1_cs_opset_flatten_t, OpCode_endchar>
+ flattener(acc, plan);
+ if (!flattener.flatten (subset_charstrings))
+ return false;
+
+ /* no global/local subroutines */
+ offsets.globalSubrsInfo.size = CFF1Subrs::calculate_serialized_size (1, 0, 0);
+ }
+ else
+ {
+ cff1_subr_subsetter_t subr_subsetter (acc, plan);
+
+ /* Subset subrs: collect used subroutines, leaving all unused ones behind */
+ if (!subr_subsetter.subset ())
+ return false;
+
+ /* encode charstrings, global subrs, local subrs with new subroutine numbers */
+ if (!subr_subsetter.encode_charstrings (subset_charstrings))
+ return false;
+
+ if (!subr_subsetter.encode_globalsubrs (subset_globalsubrs))
+ return false;
+
+ /* global subrs */
+ unsigned int dataSize = subset_globalsubrs.total_size ();
+ offsets.globalSubrsInfo.offSize = calcOffSize (dataSize);
+ if (unlikely (offsets.globalSubrsInfo.offSize > 4))
+ return false;
+ offsets.globalSubrsInfo.size = CFF1Subrs::calculate_serialized_size (offsets.globalSubrsInfo.offSize, subset_globalsubrs.length, dataSize);
+
+ /* local subrs */
+ if (!offsets.localSubrsInfos.resize (orig_fdcount))
+ return false;
+ if (!subset_localsubrs.resize (orig_fdcount))
+ return false;
+ for (unsigned int fd = 0; fd < orig_fdcount; fd++)
+ {
+ subset_localsubrs[fd].init ();
+ offsets.localSubrsInfos[fd].init ();
+ if (fdmap.has (fd))
+ {
+ if (!subr_subsetter.encode_localsubrs (fd, subset_localsubrs[fd]))
+ return false;
+
+ unsigned int dataSize = subset_localsubrs[fd].total_size ();
+ if (dataSize > 0)
+ {
+ offsets.localSubrsInfos[fd].offset = final_size;
+ offsets.localSubrsInfos[fd].offSize = calcOffSize (dataSize);
+ if (unlikely (offsets.localSubrsInfos[fd].offSize > 4))
+ return false;
+ offsets.localSubrsInfos[fd].size = CFF1Subrs::calculate_serialized_size (offsets.localSubrsInfos[fd].offSize, subset_localsubrs[fd].length, dataSize);
+ }
+ }
+ }
+ }
+
+ /* global subrs */
+ offsets.globalSubrsInfo.offset = final_size;
+ final_size += offsets.globalSubrsInfo.size;
+
+ /* Encoding */
+ if (!subset_encoding)
+ offsets.encodingOffset = acc.topDict.EncodingOffset;
+ else
+ {
+ offsets.encodingOffset = final_size;
+ final_size += plan_subset_encoding (acc, plan);
+ }
+
+ /* Charset */
+ if (!subset_charset && acc.is_predef_charset ())
+ offsets.charsetInfo.offset = acc.topDict.CharsetOffset;
+ else
+ offsets.charsetInfo.offset = final_size;
+ final_size += offsets.charsetInfo.size;
+
+ /* FDSelect */
+ if (acc.fdSelect != &Null(CFF1FDSelect))
+ {
+ offsets.FDSelectInfo.offset = final_size;
+ final_size += offsets.FDSelectInfo.size;
+ }
+
+ /* FDArray (FDIndex) */
+ if (acc.fdArray != &Null(CFF1FDArray)) {
+ offsets.FDArrayInfo.offset = final_size;
+ cff1_font_dict_op_serializer_t fontSzr;
+ unsigned int dictsSize = 0;
+ for (unsigned int i = 0; i < acc.fontDicts.length; i++)
+ if (fdmap.has (i))
+ dictsSize += FontDict::calculate_serialized_size (acc.fontDicts[i], fontSzr);
+
+ offsets.FDArrayInfo.offSize = calcOffSize (dictsSize);
+ if (unlikely (offsets.FDArrayInfo.offSize > 4))
+ return false;
+ final_size += CFF1Index::calculate_serialized_size (offsets.FDArrayInfo.offSize, subset_fdcount, dictsSize);
+ }
+
+ /* CharStrings */
+ {
+ offsets.charStringsInfo.offset = final_size;
+ unsigned int dataSize = subset_charstrings.total_size ();
+ offsets.charStringsInfo.offSize = calcOffSize (dataSize);
+ if (unlikely (offsets.charStringsInfo.offSize > 4))
+ return false;
+ final_size += CFF1CharStrings::calculate_serialized_size (offsets.charStringsInfo.offSize, plan->num_output_glyphs (), dataSize);
+ }
+
+ /* private dicts & local subrs */
+ offsets.privateDictInfo.offset = final_size;
+ for (unsigned int i = 0; i < orig_fdcount; i++)
+ {
+ if (fdmap.has (i))
+ {
+ bool has_localsubrs = offsets.localSubrsInfos[i].size > 0;
+ cff_private_dict_op_serializer_t privSzr (desubroutinize, plan->drop_hints);
+ unsigned int priv_size = PrivateDict::calculate_serialized_size (acc.privateDicts[i], privSzr, has_localsubrs);
+ table_info_t privInfo = { final_size, priv_size, 0 };
+ font_dict_values_mod_t fontdict_mod;
+ if (!acc.is_CID ())
+ fontdict_mod.init ( &Null(cff1_font_dict_values_t), CFF_UNDEF_SID, privInfo );
+ else
+ fontdict_mod.init ( &acc.fontDicts[i], sidmap[acc.fontDicts[i].fontName], privInfo );
+ fontdicts_mod.push (fontdict_mod);
+ final_size += privInfo.size;
+
+ if (!plan->desubroutinize && has_localsubrs)
+ {
+ offsets.localSubrsInfos[i].offset = final_size;
+ final_size += offsets.localSubrsInfos[i].size;
+ }
+ }
+ }
+
+ if (!acc.is_CID ())
+ offsets.privateDictInfo = fontdicts_mod[0].privateDictInfo;
+
+ return ((subset_charstrings.length == plan->num_output_glyphs ())
+ && (fontdicts_mod.length == subset_fdcount));
+ }
+
+ unsigned int get_final_size () const { return final_size; }
+
+ unsigned int final_size;
+ hb_vector_t<unsigned int> topdict_sizes;
+ cff1_top_dict_values_mod_t topdict_mod;
+ cff1_sub_table_offsets_t offsets;
+
+ unsigned int num_glyphs;
+ unsigned int orig_fdcount;
+ unsigned int subset_fdcount;
+ unsigned int subset_fdselect_format;
+ hb_vector_t<code_pair_t> subset_fdselect_ranges;
+
+ /* font dict index remap table from fullset FDArray to subset FDArray.
+ * set to CFF_UNDEF_CODE if excluded from subset */
+ hb_inc_bimap_t fdmap;
+
+ str_buff_vec_t subset_charstrings;
+ str_buff_vec_t subset_globalsubrs;
+ hb_vector_t<str_buff_vec_t> subset_localsubrs;
+ hb_vector_t<font_dict_values_mod_t> fontdicts_mod;
+
+ bool drop_hints;
+
+ bool gid_renum;
+ bool subset_encoding;
+ uint8_t subset_enc_format;
+ unsigned int subset_enc_num_codes;
+ range_list_t subset_enc_code_ranges;
+ hb_vector_t<code_pair_t> subset_enc_supp_codes;
+
+ uint8_t subset_charset_format;
+ range_list_t subset_charset_ranges;
+ bool subset_charset;
+
+ remap_sid_t sidmap;
+ unsigned int topDictModSIDs[name_dict_values_t::ValCount];
+
+ bool desubroutinize;
+};
+
+static inline bool _write_cff1 (const cff_subset_plan &plan,
+ const OT::cff1::accelerator_subset_t &acc,
+ unsigned int num_glyphs,
+ unsigned int dest_sz,
+ void *dest)
+{
+ hb_serialize_context_t c (dest, dest_sz);
+
+ OT::cff1 *cff = c.start_serialize<OT::cff1> ();
+ if (unlikely (!c.extend_min (*cff)))
+ return false;
+
+ /* header */
+ cff->version.major = 0x01;
+ cff->version.minor = 0x00;
+ cff->nameIndex = cff->min_size;
+ cff->offSize = 4; /* unused? */
+
+ /* name INDEX */
+ {
+ assert (cff->nameIndex == (unsigned) (c.head - c.start));
+ CFF1NameIndex *dest = c.start_embed<CFF1NameIndex> ();
+ if (unlikely (dest == nullptr)) return false;
+ if (unlikely (!dest->serialize (&c, *acc.nameIndex)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF name INDEX");
+ return false;
+ }
+ }
+
+ /* top dict INDEX */
+ {
+ assert (plan.offsets.topDictInfo.offset == (unsigned) (c.head - c.start));
+ CFF1IndexOf<TopDict> *dest = c.start_embed< CFF1IndexOf<TopDict>> ();
+ if (dest == nullptr) return false;
+ cff1_top_dict_op_serializer_t topSzr;
+ top_dict_modifiers_t modifier (plan.offsets, plan.topDictModSIDs);
+ if (unlikely (!dest->serialize (&c, plan.offsets.topDictInfo.offSize,
+ &plan.topdict_mod, 1,
+ plan.topdict_sizes, topSzr, modifier)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF top dict");
+ return false;
+ }
+ }
+
+ /* String INDEX */
+ {
+ assert (plan.offsets.stringIndexInfo.offset == (unsigned) (c.head - c.start));
+ CFF1StringIndex *dest = c.start_embed<CFF1StringIndex> ();
+ if (unlikely (dest == nullptr)) return false;
+ if (unlikely (!dest->serialize (&c, *acc.stringIndex, plan.offsets.stringIndexInfo.offSize, plan.sidmap)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF string INDEX");
+ return false;
+ }
+ }
+
+ /* global subrs */
+ {
+ assert (plan.offsets.globalSubrsInfo.offset != 0);
+ assert (plan.offsets.globalSubrsInfo.offset == (unsigned) (c.head - c.start));
+
+ CFF1Subrs *dest = c.start_embed <CFF1Subrs> ();
+ if (unlikely (dest == nullptr)) return false;
+ if (unlikely (!dest->serialize (&c, plan.offsets.globalSubrsInfo.offSize, plan.subset_globalsubrs)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize global subroutines");
+ return false;
+ }
+ }
+
+ /* Encoding */
+ if (plan.subset_encoding)
+ {
+ assert (plan.offsets.encodingOffset == (unsigned) (c.head - c.start));
+ Encoding *dest = c.start_embed<Encoding> ();
+ if (unlikely (dest == nullptr)) return false;
+ if (unlikely (!dest->serialize (&c,
+ plan.subset_enc_format,
+ plan.subset_enc_num_codes,
+ plan.subset_enc_code_ranges,
+ plan.subset_enc_supp_codes)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize Encoding");
+ return false;
+ }
+ }
+
+ /* Charset */
+ if (plan.subset_charset)
+ {
+ assert (plan.offsets.charsetInfo.offset == (unsigned) (c.head - c.start));
+ Charset *dest = c.start_embed<Charset> ();
+ if (unlikely (dest == nullptr)) return false;
+ if (unlikely (!dest->serialize (&c,
+ plan.subset_charset_format,
+ plan.num_glyphs,
+ plan.subset_charset_ranges)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize Charset");
+ return false;
+ }
+ }
+
+ /* FDSelect */
+ if (acc.fdSelect != &Null(CFF1FDSelect))
+ {
+ assert (plan.offsets.FDSelectInfo.offset == (unsigned) (c.head - c.start));
+
+ if (unlikely (!hb_serialize_cff_fdselect (&c, num_glyphs, *acc.fdSelect, acc.fdCount,
+ plan.subset_fdselect_format, plan.offsets.FDSelectInfo.size,
+ plan.subset_fdselect_ranges)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF subset FDSelect");
+ return false;
+ }
+ }
+
+ /* FDArray (FD Index) */
+ if (acc.fdArray != &Null(CFF1FDArray))
+ {
+ assert (plan.offsets.FDArrayInfo.offset == (unsigned) (c.head - c.start));
+ CFF1FDArray *fda = c.start_embed<CFF1FDArray> ();
+ if (unlikely (fda == nullptr)) return false;
+ cff1_font_dict_op_serializer_t fontSzr;
+ if (unlikely (!fda->serialize (&c, plan.offsets.FDArrayInfo.offSize,
+ plan.fontdicts_mod,
+ fontSzr)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF FDArray");
+ return false;
+ }
+ }
+
+ /* CharStrings */
+ {
+ assert (plan.offsets.charStringsInfo.offset == (unsigned) (c.head - c.start));
+ CFF1CharStrings *cs = c.start_embed<CFF1CharStrings> ();
+ if (unlikely (cs == nullptr)) return false;
+ if (unlikely (!cs->serialize (&c, plan.offsets.charStringsInfo.offSize, plan.subset_charstrings)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF CharStrings");
+ return false;
+ }
+ }
+
+ /* private dicts & local subrs */
+ assert (plan.offsets.privateDictInfo.offset == (unsigned) (c.head - c.start));
+ for (unsigned int i = 0; i < acc.privateDicts.length; i++)
+ {
+ if (plan.fdmap.has (i))
+ {
+ PrivateDict *pd = c.start_embed<PrivateDict> ();
+ if (unlikely (pd == nullptr)) return false;
+ unsigned int priv_size = plan.fontdicts_mod[plan.fdmap[i]].privateDictInfo.size;
+ bool result;
+ cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints);
+ /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */
+ unsigned int subroffset = (plan.offsets.localSubrsInfos[i].size > 0) ? priv_size : 0;
+ result = pd->serialize (&c, acc.privateDicts[i], privSzr, subroffset);
+ if (unlikely (!result))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF Private Dict[%d]", i);
+ return false;
+ }
+ if (plan.offsets.localSubrsInfos[i].size > 0)
+ {
+ CFF1Subrs *dest = c.start_embed <CFF1Subrs> ();
+ if (unlikely (dest == nullptr)) return false;
+ if (unlikely (!dest->serialize (&c, plan.offsets.localSubrsInfos[i].offSize, plan.subset_localsubrs[i])))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize local subroutines");
+ return false;
+ }
+ }
+ }
+ }
+
+ assert (c.head == c.end);
+ c.end_serialize ();
+
+ return true;
+}
+
+static inline bool
+_hb_subset_cff1 (const OT::cff1::accelerator_subset_t &acc,
+ const char *data,
+ hb_subset_plan_t *plan,
+ hb_blob_t **prime /* OUT */)
+{
+ cff_subset_plan cff_plan;
+
+ if (unlikely (!cff_plan.create (acc, plan)))
+ {
+ DEBUG_MSG(SUBSET, nullptr, "Failed to generate a cff subsetting plan.");
+ return false;
+ }
+
+ unsigned int cff_prime_size = cff_plan.get_final_size ();
+ char *cff_prime_data = (char *) calloc (1, cff_prime_size);
+
+ if (unlikely (!_write_cff1 (cff_plan, acc, plan->num_output_glyphs (),
+ cff_prime_size, cff_prime_data))) {
+ DEBUG_MSG(SUBSET, nullptr, "Failed to write a subset cff.");
+ free (cff_prime_data);
+ return false;
+ }
+
+ *prime = hb_blob_create (cff_prime_data,
+ cff_prime_size,
+ HB_MEMORY_MODE_READONLY,
+ cff_prime_data,
+ free);
+ return true;
+}
+
+/**
+ * hb_subset_cff1:
+ * Subsets the CFF table according to a provided plan.
+ *
+ * Return value: subsetted cff table.
+ **/
+bool
+hb_subset_cff1 (hb_subset_plan_t *plan,
+ hb_blob_t **prime /* OUT */)
+{
+ hb_blob_t *cff_blob = hb_sanitize_context_t().reference_table<CFF::cff1> (plan->source);
+ const char *data = hb_blob_get_data(cff_blob, nullptr);
+
+ OT::cff1::accelerator_subset_t acc;
+ acc.init(plan->source);
+ bool result = likely (acc.is_valid ()) &&
+ _hb_subset_cff1 (acc, data, plan, prime);
+ hb_blob_destroy (cff_blob);
+ acc.fini ();
+
+ return result;
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.hh b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.hh
new file mode 100644
index 0000000000..1ec8678845
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.hh
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_SUBSET_CFF1_HH
+#define HB_SUBSET_CFF1_HH
+
+#include "hb.hh"
+
+#include "hb-subset-plan.hh"
+
+HB_INTERNAL bool
+hb_subset_cff1 (hb_subset_plan_t *plan,
+ hb_blob_t **cff_prime /* OUT */);
+
+#endif /* HB_SUBSET_CFF1_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.cc b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.cc
new file mode 100644
index 0000000000..7edc3f5153
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.cc
@@ -0,0 +1,632 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_SUBSET_CFF
+
+#include "hb-open-type.hh"
+#include "hb-ot-cff2-table.hh"
+#include "hb-set.h"
+#include "hb-subset-cff2.hh"
+#include "hb-subset-plan.hh"
+#include "hb-subset-cff-common.hh"
+#include "hb-cff2-interp-cs.hh"
+
+using namespace CFF;
+
+struct cff2_sub_table_offsets_t : cff_sub_table_offsets_t
+{
+ cff2_sub_table_offsets_t ()
+ : cff_sub_table_offsets_t (),
+ varStoreOffset (0)
+ {}
+
+ unsigned int varStoreOffset;
+};
+
+struct cff2_top_dict_op_serializer_t : cff_top_dict_op_serializer_t<>
+{
+ bool serialize (hb_serialize_context_t *c,
+ const op_str_t &opstr,
+ const cff2_sub_table_offsets_t &offsets) const
+ {
+ TRACE_SERIALIZE (this);
+
+ switch (opstr.op)
+ {
+ case OpCode_vstore:
+ return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.varStoreOffset));
+
+ default:
+ return_trace (cff_top_dict_op_serializer_t<>::serialize (c, opstr, offsets));
+ }
+ }
+
+ unsigned int calculate_serialized_size (const op_str_t &opstr) const
+ {
+ switch (opstr.op)
+ {
+ case OpCode_vstore:
+ return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (opstr.op);
+
+ default:
+ return cff_top_dict_op_serializer_t<>::calculate_serialized_size (opstr);
+ }
+ }
+};
+
+struct cff2_cs_opset_flatten_t : cff2_cs_opset_t<cff2_cs_opset_flatten_t, flatten_param_t>
+{
+ static void flush_args_and_op (op_code_t op, cff2_cs_interp_env_t &env, flatten_param_t& param)
+ {
+ switch (op)
+ {
+ case OpCode_return:
+ case OpCode_endchar:
+ /* dummy opcodes in CFF2. ignore */
+ break;
+
+ case OpCode_hstem:
+ case OpCode_hstemhm:
+ case OpCode_vstem:
+ case OpCode_vstemhm:
+ case OpCode_hintmask:
+ case OpCode_cntrmask:
+ if (param.drop_hints)
+ {
+ env.clear_args ();
+ return;
+ }
+ HB_FALLTHROUGH;
+
+ default:
+ SUPER::flush_args_and_op (op, env, param);
+ break;
+ }
+ }
+
+ static void flush_args (cff2_cs_interp_env_t &env, flatten_param_t& param)
+ {
+ for (unsigned int i = 0; i < env.argStack.get_count ();)
+ {
+ const blend_arg_t &arg = env.argStack[i];
+ if (arg.blending ())
+ {
+ if (unlikely (!((arg.numValues > 0) && (env.argStack.get_count () >= arg.numValues))))
+ {
+ env.set_error ();
+ return;
+ }
+ flatten_blends (arg, i, env, param);
+ i += arg.numValues;
+ }
+ else
+ {
+ str_encoder_t encoder (param.flatStr);
+ encoder.encode_num (arg);
+ i++;
+ }
+ }
+ SUPER::flush_args (env, param);
+ }
+
+ static void flatten_blends (const blend_arg_t &arg, unsigned int i, cff2_cs_interp_env_t &env, flatten_param_t& param)
+ {
+ /* flatten the default values */
+ str_encoder_t encoder (param.flatStr);
+ for (unsigned int j = 0; j < arg.numValues; j++)
+ {
+ const blend_arg_t &arg1 = env.argStack[i + j];
+ if (unlikely (!((arg1.blending () && (arg.numValues == arg1.numValues) && (arg1.valueIndex == j) &&
+ (arg1.deltas.length == env.get_region_count ())))))
+ {
+ env.set_error ();
+ return;
+ }
+ encoder.encode_num (arg1);
+ }
+ /* flatten deltas for each value */
+ for (unsigned int j = 0; j < arg.numValues; j++)
+ {
+ const blend_arg_t &arg1 = env.argStack[i + j];
+ for (unsigned int k = 0; k < arg1.deltas.length; k++)
+ encoder.encode_num (arg1.deltas[k]);
+ }
+ /* flatten the number of values followed by blend operator */
+ encoder.encode_int (arg.numValues);
+ encoder.encode_op (OpCode_blendcs);
+ }
+
+ static void flush_op (op_code_t op, cff2_cs_interp_env_t &env, flatten_param_t& param)
+ {
+ switch (op)
+ {
+ case OpCode_return:
+ case OpCode_endchar:
+ return;
+ default:
+ str_encoder_t encoder (param.flatStr);
+ encoder.encode_op (op);
+ }
+ }
+
+ private:
+ typedef cff2_cs_opset_t<cff2_cs_opset_flatten_t, flatten_param_t> SUPER;
+ typedef cs_opset_t<blend_arg_t, cff2_cs_opset_flatten_t, cff2_cs_opset_flatten_t, cff2_cs_interp_env_t, flatten_param_t> CSOPSET;
+};
+
+struct cff2_cs_opset_subr_subset_t : cff2_cs_opset_t<cff2_cs_opset_subr_subset_t, subr_subset_param_t>
+{
+ static void process_op (op_code_t op, cff2_cs_interp_env_t &env, subr_subset_param_t& param)
+ {
+ switch (op) {
+
+ case OpCode_return:
+ param.current_parsed_str->set_parsed ();
+ env.return_from_subr ();
+ param.set_current_str (env, false);
+ break;
+
+ case OpCode_endchar:
+ param.current_parsed_str->set_parsed ();
+ SUPER::process_op (op, env, param);
+ break;
+
+ case OpCode_callsubr:
+ process_call_subr (op, CSType_LocalSubr, env, param, env.localSubrs, param.local_closure);
+ break;
+
+ case OpCode_callgsubr:
+ process_call_subr (op, CSType_GlobalSubr, env, param, env.globalSubrs, param.global_closure);
+ break;
+
+ default:
+ SUPER::process_op (op, env, param);
+ param.current_parsed_str->add_op (op, env.str_ref);
+ break;
+ }
+ }
+
+ protected:
+ static void process_call_subr (op_code_t op, cs_type_t type,
+ cff2_cs_interp_env_t &env, subr_subset_param_t& param,
+ cff2_biased_subrs_t& subrs, hb_set_t *closure)
+ {
+ byte_str_ref_t str_ref = env.str_ref;
+ env.call_subr (subrs, type);
+ param.current_parsed_str->add_call_op (op, str_ref, env.context.subr_num);
+ closure->add (env.context.subr_num);
+ param.set_current_str (env, true);
+ }
+
+ private:
+ typedef cff2_cs_opset_t<cff2_cs_opset_subr_subset_t, subr_subset_param_t> SUPER;
+};
+
+struct cff2_subr_subsetter_t : subr_subsetter_t<cff2_subr_subsetter_t, CFF2Subrs, const OT::cff2::accelerator_subset_t, cff2_cs_interp_env_t, cff2_cs_opset_subr_subset_t>
+{
+ cff2_subr_subsetter_t (const OT::cff2::accelerator_subset_t &acc_, const hb_subset_plan_t *plan_)
+ : subr_subsetter_t (acc_, plan_) {}
+
+ static void finalize_parsed_str (cff2_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring)
+ {
+ /* vsindex is inserted at the beginning of the charstring as necessary */
+ if (env.seen_vsindex ())
+ {
+ number_t ivs;
+ ivs.set_int ((int)env.get_ivs ());
+ charstring.set_prefix (ivs, OpCode_vsindexcs);
+ }
+ }
+};
+
+struct cff2_subset_plan {
+ cff2_subset_plan ()
+ : final_size (0),
+ orig_fdcount (0),
+ subset_fdcount(1),
+ subset_fdselect_format (0),
+ drop_hints (false),
+ desubroutinize (false)
+ {
+ subset_fdselect_ranges.init ();
+ fdmap.init ();
+ subset_charstrings.init ();
+ subset_globalsubrs.init ();
+ subset_localsubrs.init ();
+ privateDictInfos.init ();
+ }
+
+ ~cff2_subset_plan ()
+ {
+ subset_fdselect_ranges.fini ();
+ fdmap.fini ();
+ subset_charstrings.fini_deep ();
+ subset_globalsubrs.fini_deep ();
+ subset_localsubrs.fini_deep ();
+ privateDictInfos.fini ();
+ }
+
+ bool create (const OT::cff2::accelerator_subset_t &acc,
+ hb_subset_plan_t *plan)
+ {
+ final_size = 0;
+ orig_fdcount = acc.fdArray->count;
+
+ drop_hints = plan->drop_hints;
+ desubroutinize = plan->desubroutinize;
+
+ /* CFF2 header */
+ final_size += OT::cff2::static_size;
+
+ /* top dict */
+ {
+ cff2_top_dict_op_serializer_t topSzr;
+ offsets.topDictInfo.size = TopDict::calculate_serialized_size (acc.topDict, topSzr);
+ final_size += offsets.topDictInfo.size;
+ }
+
+ if (desubroutinize)
+ {
+ /* Flatten global & local subrs */
+ subr_flattener_t<const OT::cff2::accelerator_subset_t, cff2_cs_interp_env_t, cff2_cs_opset_flatten_t>
+ flattener(acc, plan);
+ if (!flattener.flatten (subset_charstrings))
+ return false;
+
+ /* no global/local subroutines */
+ offsets.globalSubrsInfo.size = CFF2Subrs::calculate_serialized_size (1, 0, 0);
+ }
+ else
+ {
+ cff2_subr_subsetter_t subr_subsetter (acc, plan);
+
+ /* Subset subrs: collect used subroutines, leaving all unused ones behind */
+ if (!subr_subsetter.subset ())
+ return false;
+
+ /* encode charstrings, global subrs, local subrs with new subroutine numbers */
+ if (!subr_subsetter.encode_charstrings (subset_charstrings))
+ return false;
+
+ if (!subr_subsetter.encode_globalsubrs (subset_globalsubrs))
+ return false;
+
+ /* global subrs */
+ unsigned int dataSize = subset_globalsubrs.total_size ();
+ offsets.globalSubrsInfo.offSize = calcOffSize (dataSize);
+ offsets.globalSubrsInfo.size = CFF2Subrs::calculate_serialized_size (offsets.globalSubrsInfo.offSize, subset_globalsubrs.length, dataSize);
+
+ /* local subrs */
+ if (!offsets.localSubrsInfos.resize (orig_fdcount))
+ return false;
+ if (!subset_localsubrs.resize (orig_fdcount))
+ return false;
+ for (unsigned int fd = 0; fd < orig_fdcount; fd++)
+ {
+ subset_localsubrs[fd].init ();
+ offsets.localSubrsInfos[fd].init ();
+ if (!subr_subsetter.encode_localsubrs (fd, subset_localsubrs[fd]))
+ return false;
+
+ unsigned int dataSize = subset_localsubrs[fd].total_size ();
+ if (dataSize > 0)
+ {
+ offsets.localSubrsInfos[fd].offset = final_size;
+ offsets.localSubrsInfos[fd].offSize = calcOffSize (dataSize);
+ offsets.localSubrsInfos[fd].size = CFF2Subrs::calculate_serialized_size (offsets.localSubrsInfos[fd].offSize, subset_localsubrs[fd].length, dataSize);
+ }
+ }
+ }
+
+ /* global subrs */
+ offsets.globalSubrsInfo.offset = final_size;
+ final_size += offsets.globalSubrsInfo.size;
+
+ /* variation store */
+ if (acc.varStore != &Null(CFF2VariationStore))
+ {
+ offsets.varStoreOffset = final_size;
+ final_size += acc.varStore->get_size ();
+ }
+
+ /* FDSelect */
+ if (acc.fdSelect != &Null(CFF2FDSelect))
+ {
+ offsets.FDSelectInfo.offset = final_size;
+ if (unlikely (!hb_plan_subset_cff_fdselect (plan,
+ orig_fdcount,
+ *(const FDSelect *)acc.fdSelect,
+ subset_fdcount,
+ offsets.FDSelectInfo.size,
+ subset_fdselect_format,
+ subset_fdselect_ranges,
+ fdmap)))
+ return false;
+
+ final_size += offsets.FDSelectInfo.size;
+ }
+ else
+ fdmap.identity (1);
+
+ /* FDArray (FDIndex) */
+ {
+ offsets.FDArrayInfo.offset = final_size;
+ cff_font_dict_op_serializer_t fontSzr;
+ unsigned int dictsSize = 0;
+ for (unsigned int i = 0; i < acc.fontDicts.length; i++)
+ if (fdmap.has (i))
+ dictsSize += FontDict::calculate_serialized_size (acc.fontDicts[i], fontSzr);
+
+ offsets.FDArrayInfo.offSize = calcOffSize (dictsSize);
+ final_size += CFF2Index::calculate_serialized_size (offsets.FDArrayInfo.offSize, subset_fdcount, dictsSize);
+ }
+
+ /* CharStrings */
+ {
+ offsets.charStringsInfo.offset = final_size;
+ unsigned int dataSize = subset_charstrings.total_size ();
+ offsets.charStringsInfo.offSize = calcOffSize (dataSize);
+ final_size += CFF2CharStrings::calculate_serialized_size (offsets.charStringsInfo.offSize, plan->num_output_glyphs (), dataSize);
+ }
+
+ /* private dicts & local subrs */
+ offsets.privateDictsOffset = final_size;
+ for (unsigned int i = 0; i < orig_fdcount; i++)
+ {
+ if (fdmap.has (i))
+ {
+ bool has_localsubrs = offsets.localSubrsInfos[i].size > 0;
+ cff_private_dict_op_serializer_t privSzr (desubroutinize, drop_hints);
+ unsigned int priv_size = PrivateDict::calculate_serialized_size (acc.privateDicts[i], privSzr, has_localsubrs);
+ table_info_t privInfo = { final_size, priv_size, 0 };
+ privateDictInfos.push (privInfo);
+ final_size += privInfo.size;
+
+ if (!plan->desubroutinize && has_localsubrs)
+ {
+ offsets.localSubrsInfos[i].offset = final_size;
+ final_size += offsets.localSubrsInfos[i].size;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ unsigned int get_final_size () const { return final_size; }
+
+ unsigned int final_size;
+ cff2_sub_table_offsets_t offsets;
+
+ unsigned int orig_fdcount;
+ unsigned int subset_fdcount;
+ unsigned int subset_fdselect_format;
+ hb_vector_t<code_pair_t> subset_fdselect_ranges;
+
+ hb_inc_bimap_t fdmap;
+
+ str_buff_vec_t subset_charstrings;
+ str_buff_vec_t subset_globalsubrs;
+ hb_vector_t<str_buff_vec_t> subset_localsubrs;
+ hb_vector_t<table_info_t> privateDictInfos;
+
+ bool drop_hints;
+ bool desubroutinize;
+};
+
+static inline bool _write_cff2 (const cff2_subset_plan &plan,
+ const OT::cff2::accelerator_subset_t &acc,
+ unsigned int num_glyphs,
+ unsigned int dest_sz,
+ void *dest)
+{
+ hb_serialize_context_t c (dest, dest_sz);
+
+ OT::cff2 *cff2 = c.start_serialize<OT::cff2> ();
+ if (unlikely (!c.extend_min (*cff2)))
+ return false;
+
+ /* header */
+ cff2->version.major = 0x02;
+ cff2->version.minor = 0x00;
+ cff2->topDict = OT::cff2::static_size;
+
+ /* top dict */
+ {
+ assert (cff2->topDict == (unsigned) (c.head - c.start));
+ cff2->topDictSize = plan.offsets.topDictInfo.size;
+ TopDict &dict = cff2 + cff2->topDict;
+ cff2_top_dict_op_serializer_t topSzr;
+ if (unlikely (!dict.serialize (&c, acc.topDict, topSzr, plan.offsets)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 top dict");
+ return false;
+ }
+ }
+
+ /* global subrs */
+ {
+ assert (cff2->topDict + plan.offsets.topDictInfo.size == (unsigned) (c.head - c.start));
+ CFF2Subrs *dest = c.start_embed <CFF2Subrs> ();
+ if (unlikely (dest == nullptr)) return false;
+ if (unlikely (!dest->serialize (&c, plan.offsets.globalSubrsInfo.offSize, plan.subset_globalsubrs)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize global subroutines");
+ return false;
+ }
+ }
+
+ /* variation store */
+ if (acc.varStore != &Null(CFF2VariationStore))
+ {
+ assert (plan.offsets.varStoreOffset == (unsigned) (c.head - c.start));
+ CFF2VariationStore *dest = c.start_embed<CFF2VariationStore> ();
+ if (unlikely (!dest->serialize (&c, acc.varStore)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 Variation Store");
+ return false;
+ }
+ }
+
+ /* FDSelect */
+ if (acc.fdSelect != &Null(CFF2FDSelect))
+ {
+ assert (plan.offsets.FDSelectInfo.offset == (unsigned) (c.head - c.start));
+
+ if (unlikely (!hb_serialize_cff_fdselect (&c, num_glyphs, *(const FDSelect *)acc.fdSelect, acc.fdArray->count,
+ plan.subset_fdselect_format, plan.offsets.FDSelectInfo.size,
+ plan.subset_fdselect_ranges)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 subset FDSelect");
+ return false;
+ }
+ }
+
+ /* FDArray (FD Index) */
+ {
+ assert (plan.offsets.FDArrayInfo.offset == (unsigned) (c.head - c.start));
+ CFF2FDArray *fda = c.start_embed<CFF2FDArray> ();
+ if (unlikely (fda == nullptr)) return false;
+ cff_font_dict_op_serializer_t fontSzr;
+ if (unlikely (!fda->serialize (&c, plan.offsets.FDArrayInfo.offSize,
+ acc.fontDicts, plan.subset_fdcount, plan.fdmap,
+ fontSzr, plan.privateDictInfos)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 FDArray");
+ return false;
+ }
+ }
+
+ /* CharStrings */
+ {
+ assert (plan.offsets.charStringsInfo.offset == (unsigned) (c.head - c.start));
+ CFF2CharStrings *cs = c.start_embed<CFF2CharStrings> ();
+ if (unlikely (cs == nullptr)) return false;
+ if (unlikely (!cs->serialize (&c, plan.offsets.charStringsInfo.offSize, plan.subset_charstrings)))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 CharStrings");
+ return false;
+ }
+ }
+
+ /* private dicts & local subrs */
+ assert (plan.offsets.privateDictsOffset == (unsigned) (c.head - c.start));
+ for (unsigned int i = 0; i < acc.privateDicts.length; i++)
+ {
+ if (plan.fdmap.has (i))
+ {
+ PrivateDict *pd = c.start_embed<PrivateDict> ();
+ if (unlikely (pd == nullptr)) return false;
+ unsigned int priv_size = plan.privateDictInfos[plan.fdmap[i]].size;
+ bool result;
+ cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints);
+ /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */
+ unsigned int subroffset = (plan.offsets.localSubrsInfos[i].size > 0) ? priv_size : 0;
+ result = pd->serialize (&c, acc.privateDicts[i], privSzr, subroffset);
+ if (unlikely (!result))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF Private Dict[%d]", i);
+ return false;
+ }
+ if (plan.offsets.localSubrsInfos[i].size > 0)
+ {
+ CFF2Subrs *dest = c.start_embed <CFF2Subrs> ();
+ if (unlikely (dest == nullptr)) return false;
+ if (unlikely (!dest->serialize (&c, plan.offsets.localSubrsInfos[i].offSize, plan.subset_localsubrs[i])))
+ {
+ DEBUG_MSG (SUBSET, nullptr, "failed to serialize local subroutines");
+ return false;
+ }
+ }
+ }
+ }
+
+ assert (c.head == c.end);
+ c.end_serialize ();
+
+ return true;
+}
+
+static inline bool
+_hb_subset_cff2 (const OT::cff2::accelerator_subset_t &acc,
+ const char *data,
+ hb_subset_plan_t *plan,
+ hb_blob_t **prime /* OUT */)
+{
+ cff2_subset_plan cff2_plan;
+
+ if (unlikely (!cff2_plan.create (acc, plan)))
+ {
+ DEBUG_MSG(SUBSET, nullptr, "Failed to generate a cff2 subsetting plan.");
+ return false;
+ }
+
+ unsigned int cff2_prime_size = cff2_plan.get_final_size ();
+ char *cff2_prime_data = (char *) calloc (1, cff2_prime_size);
+
+ if (unlikely (!_write_cff2 (cff2_plan, acc, plan->num_output_glyphs (),
+ cff2_prime_size, cff2_prime_data))) {
+ DEBUG_MSG(SUBSET, nullptr, "Failed to write a subset cff2.");
+ free (cff2_prime_data);
+ return false;
+ }
+
+ *prime = hb_blob_create (cff2_prime_data,
+ cff2_prime_size,
+ HB_MEMORY_MODE_READONLY,
+ cff2_prime_data,
+ free);
+ return true;
+}
+
+/**
+ * hb_subset_cff2:
+ * Subsets the CFF2 table according to a provided plan.
+ *
+ * Return value: subsetted cff2 table.
+ **/
+bool
+hb_subset_cff2 (hb_subset_plan_t *plan,
+ hb_blob_t **prime /* OUT */)
+{
+ hb_blob_t *cff2_blob = hb_sanitize_context_t().reference_table<CFF::cff2> (plan->source);
+ const char *data = hb_blob_get_data(cff2_blob, nullptr);
+
+ OT::cff2::accelerator_subset_t acc;
+ acc.init(plan->source);
+ bool result = likely (acc.is_valid ()) &&
+ _hb_subset_cff2 (acc, data, plan, prime);
+
+ hb_blob_destroy (cff2_blob);
+ acc.fini ();
+
+ return result;
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.hh b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.hh
new file mode 100644
index 0000000000..a07dc290e5
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.hh
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_SUBSET_CFF2_HH
+#define HB_SUBSET_CFF2_HH
+
+#include "hb.hh"
+
+#include "hb-subset-plan.hh"
+
+HB_INTERNAL bool
+hb_subset_cff2 (hb_subset_plan_t *plan,
+ hb_blob_t **cff2_prime /* OUT */);
+
+#endif /* HB_SUBSET_CFF2_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-input.cc b/src/3rdparty/harfbuzz-ng/src/hb-subset-input.cc
new file mode 100644
index 0000000000..d92f33ffed
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-input.cc
@@ -0,0 +1,208 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Rod Sheeter, Behdad Esfahbod
+ */
+
+#include "hb-subset.hh"
+#include "hb-set.hh"
+
+/**
+ * hb_subset_input_create_or_fail:
+ *
+ * Return value: New subset input.
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_input_t *
+hb_subset_input_create_or_fail ()
+{
+ hb_subset_input_t *input = hb_object_create<hb_subset_input_t>();
+
+ if (unlikely (!input))
+ return nullptr;
+
+ input->unicodes = hb_set_create ();
+ input->glyphs = hb_set_create ();
+ input->name_ids = hb_set_create ();
+ hb_set_add_range (input->name_ids, 0, 6);
+ input->drop_tables = hb_set_create ();
+ input->drop_hints = false;
+ input->desubroutinize = false;
+ input->retain_gids = false;
+
+ hb_tag_t default_drop_tables[] = {
+ // Layout disabled by default
+ HB_TAG ('G', 'S', 'U', 'B'),
+ HB_TAG ('G', 'P', 'O', 'S'),
+ HB_TAG ('G', 'D', 'E', 'F'),
+ HB_TAG ('m', 'o', 'r', 'x'),
+ HB_TAG ('m', 'o', 'r', 't'),
+ HB_TAG ('k', 'e', 'r', 'x'),
+ HB_TAG ('k', 'e', 'r', 'n'),
+
+ // Copied from fontTools:
+ HB_TAG ('B', 'A', 'S', 'E'),
+ HB_TAG ('J', 'S', 'T', 'F'),
+ HB_TAG ('D', 'S', 'I', 'G'),
+ HB_TAG ('E', 'B', 'D', 'T'),
+ HB_TAG ('E', 'B', 'L', 'C'),
+ HB_TAG ('E', 'B', 'S', 'C'),
+ HB_TAG ('S', 'V', 'G', ' '),
+ HB_TAG ('P', 'C', 'L', 'T'),
+ HB_TAG ('L', 'T', 'S', 'H'),
+ // Graphite tables
+ HB_TAG ('F', 'e', 'a', 't'),
+ HB_TAG ('G', 'l', 'a', 't'),
+ HB_TAG ('G', 'l', 'o', 'c'),
+ HB_TAG ('S', 'i', 'l', 'f'),
+ HB_TAG ('S', 'i', 'l', 'l'),
+ // Colour
+ HB_TAG ('s', 'b', 'i', 'x')
+ };
+
+ input->drop_tables->add_array (default_drop_tables, ARRAY_LENGTH (default_drop_tables));
+
+ return input;
+}
+
+/**
+ * hb_subset_input_reference: (skip)
+ * @subset_input: a subset_input.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_input_t *
+hb_subset_input_reference (hb_subset_input_t *subset_input)
+{
+ return hb_object_reference (subset_input);
+}
+
+/**
+ * hb_subset_input_destroy:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+void
+hb_subset_input_destroy (hb_subset_input_t *subset_input)
+{
+ if (!hb_object_destroy (subset_input)) return;
+
+ hb_set_destroy (subset_input->unicodes);
+ hb_set_destroy (subset_input->glyphs);
+ hb_set_destroy (subset_input->name_ids);
+ hb_set_destroy (subset_input->drop_tables);
+
+ free (subset_input);
+}
+
+/**
+ * hb_subset_input_unicode_set:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_set_t *
+hb_subset_input_unicode_set (hb_subset_input_t *subset_input)
+{
+ return subset_input->unicodes;
+}
+
+/**
+ * hb_subset_input_glyph_set:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_set_t *
+hb_subset_input_glyph_set (hb_subset_input_t *subset_input)
+{
+ return subset_input->glyphs;
+}
+
+HB_EXTERN hb_set_t *
+hb_subset_input_nameid_set (hb_subset_input_t *subset_input)
+{
+ return subset_input->name_ids;
+}
+
+HB_EXTERN hb_set_t *
+hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input)
+{
+ return subset_input->drop_tables;
+}
+
+HB_EXTERN void
+hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input,
+ hb_bool_t drop_hints)
+{
+ subset_input->drop_hints = drop_hints;
+}
+
+HB_EXTERN hb_bool_t
+hb_subset_input_get_drop_hints (hb_subset_input_t *subset_input)
+{
+ return subset_input->drop_hints;
+}
+
+HB_EXTERN void
+hb_subset_input_set_desubroutinize (hb_subset_input_t *subset_input,
+ hb_bool_t desubroutinize)
+{
+ subset_input->desubroutinize = desubroutinize;
+}
+
+HB_EXTERN hb_bool_t
+hb_subset_input_get_desubroutinize (hb_subset_input_t *subset_input)
+{
+ return subset_input->desubroutinize;
+}
+
+/**
+ * hb_subset_input_set_retain_gids:
+ * @subset_input: a subset_input.
+ * @retain_gids: If true the subsetter will not renumber glyph ids.
+ * Since: 2.4.0
+ **/
+HB_EXTERN void
+hb_subset_input_set_retain_gids (hb_subset_input_t *subset_input,
+ hb_bool_t retain_gids)
+{
+ subset_input->retain_gids = retain_gids;
+}
+
+/**
+ * hb_subset_input_get_retain_gids:
+ * Returns: value of retain_gids.
+ * Since: 2.4.0
+ **/
+HB_EXTERN hb_bool_t
+hb_subset_input_get_retain_gids (hb_subset_input_t *subset_input)
+{
+ return subset_input->retain_gids;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh b/src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh
new file mode 100644
index 0000000000..f6dd4ac319
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh
@@ -0,0 +1,59 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Roderick Sheeter
+ */
+
+#ifndef HB_SUBSET_INPUT_HH
+#define HB_SUBSET_INPUT_HH
+
+
+#include "hb.hh"
+
+#include "hb-subset.h"
+
+#include "hb-font.hh"
+
+struct hb_subset_input_t
+{
+ hb_object_header_t header;
+
+ hb_set_t *unicodes;
+ hb_set_t *glyphs;
+ hb_set_t *name_ids;
+ hb_set_t *drop_tables;
+
+ bool drop_hints;
+ bool desubroutinize;
+ bool retain_gids;
+ /* TODO
+ *
+ * features
+ * lookups
+ * name_ids
+ * ...
+ */
+};
+
+
+#endif /* HB_SUBSET_INPUT_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.cc b/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.cc
new file mode 100644
index 0000000000..f4912f86ba
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.cc
@@ -0,0 +1,266 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Roderick Sheeter
+ */
+
+#include "hb-subset-plan.hh"
+#include "hb-map.hh"
+#include "hb-set.hh"
+
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-ot-cff1-table.hh"
+#include "hb-ot-var-fvar-table.hh"
+#include "hb-ot-stat-table.hh"
+
+#ifndef HB_NO_SUBSET_CFF
+static inline void
+_add_cff_seac_components (const OT::cff1::accelerator_t &cff,
+ hb_codepoint_t gid,
+ hb_set_t *gids_to_retain)
+{
+ hb_codepoint_t base_gid, accent_gid;
+ if (cff.get_seac_components (gid, &base_gid, &accent_gid))
+ {
+ gids_to_retain->add (base_gid);
+ gids_to_retain->add (accent_gid);
+ }
+}
+#endif
+
+#ifndef HB_NO_SUBSET_LAYOUT
+static inline void
+_gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain)
+{
+ hb_set_t lookup_indices;
+ hb_ot_layout_collect_lookups (face,
+ HB_OT_TAG_GSUB,
+ nullptr,
+ nullptr,
+ nullptr,
+ &lookup_indices);
+ hb_ot_layout_lookups_substitute_closure (face,
+ &lookup_indices,
+ gids_to_retain);
+}
+#endif
+
+static inline void
+_cmap_closure (hb_face_t *face,
+ const hb_set_t *unicodes,
+ hb_set_t *glyphset)
+{
+ OT::cmap::accelerator_t cmap;
+ cmap.init (face);
+ cmap.table->closure_glyphs (unicodes, glyphset);
+ cmap.fini ();
+}
+
+static inline void
+_remove_invalid_gids (hb_set_t *glyphs,
+ unsigned int num_glyphs)
+{
+ hb_codepoint_t gid = HB_SET_VALUE_INVALID;
+ while (glyphs->next (&gid))
+ {
+ if (gid >= num_glyphs)
+ glyphs->del (gid);
+ }
+}
+
+static void
+_populate_gids_to_retain (hb_subset_plan_t* plan,
+ const hb_set_t *unicodes,
+ const hb_set_t *input_glyphs_to_retain,
+ bool close_over_gsub)
+{
+ OT::cmap::accelerator_t cmap;
+ OT::glyf::accelerator_t glyf;
+ OT::cff1::accelerator_t cff;
+ cmap.init (plan->source);
+ glyf.init (plan->source);
+ cff.init (plan->source);
+
+ plan->_glyphset_gsub->add (0); // Not-def
+ hb_set_union (plan->_glyphset_gsub, input_glyphs_to_retain);
+
+ hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+ while (unicodes->next (&cp))
+ {
+ hb_codepoint_t gid;
+ if (!cmap.get_nominal_glyph (cp, &gid))
+ {
+ DEBUG_MSG(SUBSET, nullptr, "Drop U+%04X; no gid", cp);
+ continue;
+ }
+ plan->unicodes->add (cp);
+ plan->codepoint_to_glyph->set (cp, gid);
+ plan->_glyphset_gsub->add (gid);
+ }
+
+ _cmap_closure (plan->source, plan->unicodes, plan->_glyphset_gsub);
+
+#ifndef HB_NO_SUBSET_LAYOUT
+ if (close_over_gsub)
+ // Add all glyphs needed for GSUB substitutions.
+ _gsub_closure (plan->source, plan->_glyphset_gsub);
+#endif
+ _remove_invalid_gids (plan->_glyphset_gsub, plan->source->get_num_glyphs ());
+
+ // Populate a full set of glyphs to retain by adding all referenced
+ // composite glyphs.
+ hb_codepoint_t gid = HB_SET_VALUE_INVALID;
+ while (plan->_glyphset_gsub->next (&gid))
+ {
+ glyf.add_gid_and_children (gid, plan->_glyphset);
+#ifndef HB_NO_SUBSET_CFF
+ if (cff.is_valid ())
+ _add_cff_seac_components (cff, gid, plan->_glyphset);
+#endif
+ }
+
+ _remove_invalid_gids (plan->_glyphset, plan->source->get_num_glyphs ());
+
+ cff.fini ();
+ glyf.fini ();
+ cmap.fini ();
+}
+
+static void
+_create_old_gid_to_new_gid_map (const hb_face_t *face,
+ bool retain_gids,
+ const hb_set_t *all_gids_to_retain,
+ hb_map_t *glyph_map, /* OUT */
+ hb_map_t *reverse_glyph_map, /* OUT */
+ unsigned int *num_glyphs /* OUT */)
+{
+ if (!retain_gids)
+ {
+ + hb_enumerate (hb_iter (all_gids_to_retain), (hb_codepoint_t) 0)
+ | hb_sink (reverse_glyph_map)
+ ;
+ *num_glyphs = reverse_glyph_map->get_population ();
+ } else {
+ + hb_iter (all_gids_to_retain)
+ | hb_map ([] (hb_codepoint_t _) {
+ return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (_, _);
+ })
+ | hb_sink (reverse_glyph_map)
+ ;
+
+ unsigned max_glyph =
+ + hb_iter (all_gids_to_retain)
+ | hb_reduce (hb_max, 0u)
+ ;
+ *num_glyphs = max_glyph + 1;
+ }
+
+ + reverse_glyph_map->iter ()
+ | hb_map (&hb_pair_t<hb_codepoint_t, hb_codepoint_t>::reverse)
+ | hb_sink (glyph_map)
+ ;
+}
+
+static void
+_nameid_closure (hb_face_t *face,
+ hb_set_t *nameids)
+{
+#ifndef HB_NO_STAT
+ face->table.STAT->collect_name_ids (nameids);
+#endif
+#ifndef HB_NO_VAR
+ face->table.fvar->collect_name_ids (nameids);
+#endif
+}
+
+/**
+ * hb_subset_plan_create:
+ * Computes a plan for subsetting the supplied face according
+ * to a provided input. The plan describes
+ * which tables and glyphs should be retained.
+ *
+ * Return value: New subset plan.
+ *
+ * Since: 1.7.5
+ **/
+hb_subset_plan_t *
+hb_subset_plan_create (hb_face_t *face,
+ hb_subset_input_t *input)
+{
+ hb_subset_plan_t *plan = hb_object_create<hb_subset_plan_t> ();
+
+ plan->drop_hints = input->drop_hints;
+ plan->desubroutinize = input->desubroutinize;
+ plan->retain_gids = input->retain_gids;
+ plan->unicodes = hb_set_create ();
+ plan->name_ids = hb_set_reference (input->name_ids);
+ _nameid_closure (face, plan->name_ids);
+ plan->drop_tables = hb_set_reference (input->drop_tables);
+ plan->source = hb_face_reference (face);
+ plan->dest = hb_face_builder_create ();
+
+ plan->_glyphset = hb_set_create ();
+ plan->_glyphset_gsub = hb_set_create ();
+ plan->codepoint_to_glyph = hb_map_create ();
+ plan->glyph_map = hb_map_create ();
+ plan->reverse_glyph_map = hb_map_create ();
+
+ _populate_gids_to_retain (plan,
+ input->unicodes,
+ input->glyphs,
+ !input->drop_tables->has (HB_OT_TAG_GSUB));
+
+ _create_old_gid_to_new_gid_map (face,
+ input->retain_gids,
+ plan->_glyphset,
+ plan->glyph_map,
+ plan->reverse_glyph_map,
+ &plan->_num_output_glyphs);
+
+ return plan;
+}
+
+/**
+ * hb_subset_plan_destroy:
+ *
+ * Since: 1.7.5
+ **/
+void
+hb_subset_plan_destroy (hb_subset_plan_t *plan)
+{
+ if (!hb_object_destroy (plan)) return;
+
+ hb_set_destroy (plan->unicodes);
+ hb_set_destroy (plan->name_ids);
+ hb_set_destroy (plan->drop_tables);
+ hb_face_destroy (plan->source);
+ hb_face_destroy (plan->dest);
+ hb_map_destroy (plan->codepoint_to_glyph);
+ hb_map_destroy (plan->glyph_map);
+ hb_map_destroy (plan->reverse_glyph_map);
+ hb_set_destroy (plan->_glyphset);
+ hb_set_destroy (plan->_glyphset_gsub);
+
+ free (plan);
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.hh b/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.hh
new file mode 100644
index 0000000000..af2337e494
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.hh
@@ -0,0 +1,165 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Roderick Sheeter
+ */
+
+#ifndef HB_SUBSET_PLAN_HH
+#define HB_SUBSET_PLAN_HH
+
+#include "hb.hh"
+
+#include "hb-subset.h"
+#include "hb-subset-input.hh"
+
+#include "hb-map.hh"
+#include "hb-set.hh"
+
+struct hb_subset_plan_t
+{
+ hb_object_header_t header;
+
+ bool drop_hints : 1;
+ bool desubroutinize : 1;
+ bool retain_gids : 1;
+
+ // For each cp that we'd like to retain maps to the corresponding gid.
+ hb_set_t *unicodes;
+
+ // name_ids we would like to retain
+ hb_set_t *name_ids;
+
+ // Tables which should be dropped.
+ hb_set_t *drop_tables;
+
+ // The glyph subset
+ hb_map_t *codepoint_to_glyph;
+
+ // Old -> New glyph id mapping
+ hb_map_t *glyph_map;
+ hb_map_t *reverse_glyph_map;
+
+ // Plan is only good for a specific source/dest so keep them with it
+ hb_face_t *source;
+ hb_face_t *dest;
+
+ unsigned int _num_output_glyphs;
+ hb_set_t *_glyphset;
+ hb_set_t *_glyphset_gsub;
+
+ public:
+
+ /*
+ * The set of input glyph ids which will be retained in the subset.
+ * Does NOT include ids kept due to retain_gids. You probably want to use
+ * glyph_map/reverse_glyph_map.
+ */
+ inline const hb_set_t *
+ glyphset () const
+ {
+ return _glyphset;
+ }
+
+ /*
+ * The set of input glyph ids which will be retained in the subset.
+ */
+ inline const hb_set_t *
+ glyphset_gsub () const
+ {
+ return _glyphset_gsub;
+ }
+
+ /*
+ * The total number of output glyphs in the final subset.
+ */
+ inline unsigned int
+ num_output_glyphs () const
+ {
+ return _num_output_glyphs;
+ }
+
+ /*
+ * Given an output gid , returns true if that glyph id is an empty
+ * glyph (ie. it's a gid that we are dropping all data for).
+ */
+ inline bool is_empty_glyph (hb_codepoint_t gid) const
+ {
+ return !_glyphset->has (gid);
+ }
+
+ inline bool new_gid_for_codepoint (hb_codepoint_t codepoint,
+ hb_codepoint_t *new_gid) const
+ {
+ hb_codepoint_t old_gid = codepoint_to_glyph->get (codepoint);
+ if (old_gid == HB_MAP_VALUE_INVALID)
+ return false;
+
+ return new_gid_for_old_gid (old_gid, new_gid);
+ }
+
+ inline bool new_gid_for_old_gid (hb_codepoint_t old_gid,
+ hb_codepoint_t *new_gid) const
+ {
+ hb_codepoint_t gid = glyph_map->get (old_gid);
+ if (gid == HB_MAP_VALUE_INVALID)
+ return false;
+
+ *new_gid = gid;
+ return true;
+ }
+
+ inline bool old_gid_for_new_gid (hb_codepoint_t new_gid,
+ hb_codepoint_t *old_gid) const
+ {
+ hb_codepoint_t gid = reverse_glyph_map->get (new_gid);
+ if (gid == HB_MAP_VALUE_INVALID)
+ return false;
+
+ *old_gid = gid;
+ return true;
+ }
+
+ inline bool
+ add_table (hb_tag_t tag,
+ hb_blob_t *contents)
+ {
+ hb_blob_t *source_blob = source->reference_table (tag);
+ DEBUG_MSG(SUBSET, nullptr, "add table %c%c%c%c, dest %d bytes, source %d bytes",
+ HB_UNTAG(tag),
+ hb_blob_get_length (contents),
+ hb_blob_get_length (source_blob));
+ hb_blob_destroy (source_blob);
+ return hb_face_builder_add_table (dest, tag, contents);
+ }
+};
+
+typedef struct hb_subset_plan_t hb_subset_plan_t;
+
+HB_INTERNAL hb_subset_plan_t *
+hb_subset_plan_create (hb_face_t *face,
+ hb_subset_input_t *input);
+
+HB_INTERNAL void
+hb_subset_plan_destroy (hb_subset_plan_t *plan);
+
+#endif /* HB_SUBSET_PLAN_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset.cc b/src/3rdparty/harfbuzz-ng/src/hb-subset.cc
new file mode 100644
index 0000000000..ec2f8892fd
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset.cc
@@ -0,0 +1,309 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Rod Sheeter, Behdad Esfahbod
+ */
+
+#include "hb.hh"
+#include "hb-open-type.hh"
+
+#include "hb-subset.hh"
+
+#include "hb-open-file.hh"
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-ot-hdmx-table.hh"
+#include "hb-ot-head-table.hh"
+#include "hb-ot-hhea-table.hh"
+#include "hb-ot-hmtx-table.hh"
+#include "hb-ot-maxp-table.hh"
+#include "hb-ot-os2-table.hh"
+#include "hb-ot-post-table.hh"
+#include "hb-ot-cff1-table.hh"
+#include "hb-ot-cff2-table.hh"
+#include "hb-ot-vorg-table.hh"
+#include "hb-ot-name-table.hh"
+#include "hb-ot-layout-gsub-table.hh"
+#include "hb-ot-layout-gpos-table.hh"
+
+
+HB_UNUSED static inline unsigned int
+_plan_estimate_subset_table_size (hb_subset_plan_t *plan,
+ unsigned int table_len);
+static inline unsigned int
+_plan_estimate_subset_table_size (hb_subset_plan_t *plan,
+ unsigned int table_len)
+{
+ unsigned int src_glyphs = plan->source->get_num_glyphs ();
+ unsigned int dst_glyphs = plan->glyphset ()->get_population ();
+
+ if (unlikely (!src_glyphs))
+ return 512 + table_len;
+
+ return 512 + (unsigned int) (table_len * sqrt ((double) dst_glyphs / src_glyphs));
+}
+
+template<typename TableType>
+static bool
+_subset2 (hb_subset_plan_t *plan)
+{
+ bool result = false;
+ hb_blob_t *source_blob = hb_sanitize_context_t ().reference_table<TableType> (plan->source);
+ const TableType *table = source_blob->as<TableType> ();
+
+ hb_tag_t tag = TableType::tableTag;
+ if (source_blob->data)
+ {
+ hb_vector_t<char> buf;
+ /* TODO Not all tables are glyph-related. 'name' table size for example should not be
+ * affected by number of glyphs. Accommodate that. */
+ unsigned int buf_size = _plan_estimate_subset_table_size (plan, source_blob->length);
+ DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c initial estimated table size: %u bytes.", HB_UNTAG (tag), buf_size);
+ if (unlikely (!buf.alloc (buf_size)))
+ {
+ DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c failed to allocate %u bytes.", HB_UNTAG (tag), buf_size);
+ hb_blob_destroy (source_blob);
+ return false;
+ }
+ retry:
+ hb_serialize_context_t serializer ((void *) buf, buf_size);
+ serializer.start_serialize<TableType> ();
+ hb_subset_context_t c (plan, &serializer);
+ bool needed = table->subset (&c);
+ if (serializer.ran_out_of_room)
+ {
+ buf_size += (buf_size >> 1) + 32;
+ DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c ran out of room; reallocating to %u bytes.", HB_UNTAG (tag), buf_size);
+ if (unlikely (!buf.alloc (buf_size)))
+ {
+ DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c failed to reallocate %u bytes.", HB_UNTAG (tag), buf_size);
+ hb_blob_destroy (source_blob);
+ return false;
+ }
+ goto retry;
+ }
+ serializer.end_serialize ();
+
+ result = !serializer.in_error ();
+
+ if (result)
+ {
+ if (needed)
+ {
+ hb_blob_t *dest_blob = serializer.copy_blob ();
+ DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c final subset table size: %u bytes.", HB_UNTAG (tag), dest_blob->length);
+ result = c.plan->add_table (tag, dest_blob);
+ hb_blob_destroy (dest_blob);
+ }
+ else
+ {
+ DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset table subsetted to empty.", HB_UNTAG (tag));
+ }
+ }
+ }
+ else
+ DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset sanitize failed on source table.", HB_UNTAG (tag));
+
+ hb_blob_destroy (source_blob);
+ DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset %s", HB_UNTAG (tag), result ? "success" : "FAILED!");
+ return result;
+}
+
+template<typename TableType>
+static bool
+_subset (hb_subset_plan_t *plan)
+{
+ hb_blob_t *source_blob = hb_sanitize_context_t ().reference_table<TableType> (plan->source);
+ const TableType *table = source_blob->as<TableType> ();
+
+ hb_tag_t tag = TableType::tableTag;
+ hb_bool_t result = false;
+ if (source_blob->data)
+ result = table->subset (plan);
+ else
+ DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset sanitize failed on source table.", HB_UNTAG (tag));
+
+ hb_blob_destroy (source_blob);
+ DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset %s", HB_UNTAG (tag), result ? "success" : "FAILED!");
+ return result;
+}
+
+
+static bool
+_subset_table (hb_subset_plan_t *plan,
+ hb_tag_t tag)
+{
+ DEBUG_MSG(SUBSET, nullptr, "begin subset %c%c%c%c", HB_UNTAG (tag));
+ bool result = true;
+ switch (tag) {
+ case HB_OT_TAG_glyf:
+ result = _subset2<const OT::glyf> (plan);
+ break;
+ case HB_OT_TAG_hdmx:
+ result = _subset2<const OT::hdmx> (plan);
+ break;
+ case HB_OT_TAG_name:
+ result = _subset2<const OT::name> (plan);
+ break;
+ case HB_OT_TAG_head:
+ // TODO that won't work well if there is no glyf
+ DEBUG_MSG(SUBSET, nullptr, "skip head, handled by glyf");
+ result = true;
+ break;
+ case HB_OT_TAG_hhea:
+ DEBUG_MSG(SUBSET, nullptr, "skip hhea handled by hmtx");
+ return true;
+ case HB_OT_TAG_hmtx:
+ result = _subset2<const OT::hmtx> (plan);
+ break;
+ case HB_OT_TAG_vhea:
+ DEBUG_MSG(SUBSET, nullptr, "skip vhea handled by vmtx");
+ return true;
+ case HB_OT_TAG_vmtx:
+ result = _subset2<const OT::vmtx> (plan);
+ break;
+ case HB_OT_TAG_maxp:
+ result = _subset2<const OT::maxp> (plan);
+ break;
+ case HB_OT_TAG_loca:
+ DEBUG_MSG(SUBSET, nullptr, "skip loca handled by glyf");
+ return true;
+ case HB_OT_TAG_cmap:
+ result = _subset2<const OT::cmap> (plan);
+ break;
+ case HB_OT_TAG_OS2:
+ result = _subset2<const OT::OS2> (plan);
+ break;
+ case HB_OT_TAG_post:
+ result = _subset2<const OT::post> (plan);
+ break;
+
+#ifndef HB_NO_SUBSET_CFF
+ case HB_OT_TAG_cff1:
+ result = _subset<const OT::cff1> (plan);
+ break;
+ case HB_OT_TAG_cff2:
+ result = _subset<const OT::cff2> (plan);
+ break;
+ case HB_OT_TAG_VORG:
+ result = _subset2<const OT::VORG> (plan);
+ break;
+#endif
+
+#ifndef HB_NO_SUBSET_LAYOUT
+ case HB_OT_TAG_GDEF:
+ result = _subset2<const OT::GDEF> (plan);
+ break;
+ case HB_OT_TAG_GSUB:
+ result = _subset2<const OT::GSUB> (plan);
+ break;
+ case HB_OT_TAG_GPOS:
+ result = _subset2<const OT::GPOS> (plan);
+ break;
+#endif
+
+ default:
+ hb_blob_t *source_table = hb_face_reference_table (plan->source, tag);
+ if (likely (source_table))
+ result = plan->add_table (tag, source_table);
+ else
+ result = false;
+ hb_blob_destroy (source_table);
+ break;
+ }
+ DEBUG_MSG(SUBSET, nullptr, "subset %c%c%c%c %s", HB_UNTAG (tag), result ? "ok" : "FAILED");
+ return result;
+}
+
+static bool
+_should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
+{
+ if (plan->drop_tables->has (tag))
+ return true;
+
+ switch (tag) {
+ case HB_TAG ('c', 'v', 'a', 'r'): /* hint table, fallthrough */
+ case HB_TAG ('c', 'v', 't', ' '): /* hint table, fallthrough */
+ case HB_TAG ('f', 'p', 'g', 'm'): /* hint table, fallthrough */
+ case HB_TAG ('p', 'r', 'e', 'p'): /* hint table, fallthrough */
+ case HB_TAG ('h', 'd', 'm', 'x'): /* hint table, fallthrough */
+ case HB_TAG ('V', 'D', 'M', 'X'): /* hint table, fallthrough */
+ return plan->drop_hints;
+
+#ifdef HB_NO_SUBSET_LAYOUT
+ // Drop Layout Tables if requested.
+ case HB_OT_TAG_GDEF:
+ case HB_OT_TAG_GPOS:
+ case HB_OT_TAG_GSUB:
+ case HB_TAG ('m', 'o', 'r', 'x'):
+ case HB_TAG ('m', 'o', 'r', 't'):
+ case HB_TAG ('k', 'e', 'r', 'x'):
+ case HB_TAG ('k', 'e', 'r', 'n'):
+ return true;
+#endif
+
+ default:
+ return false;
+ }
+}
+
+/**
+ * hb_subset:
+ * @source: font face data to be subset.
+ * @input: input to use for the subsetting.
+ *
+ * Subsets a font according to provided input.
+ **/
+hb_face_t *
+hb_subset (hb_face_t *source,
+ hb_subset_input_t *input)
+{
+ if (unlikely (!input || !source)) return hb_face_get_empty ();
+
+ hb_subset_plan_t *plan = hb_subset_plan_create (source, input);
+
+ hb_tag_t table_tags[32];
+ unsigned int offset = 0, count;
+ bool success = true;
+ hb_set_t tags_set;
+ do {
+ count = ARRAY_LENGTH (table_tags);
+ hb_face_get_table_tags (source, offset, &count, table_tags);
+ for (unsigned int i = 0; i < count; i++)
+ {
+ hb_tag_t tag = table_tags[i];
+ if (_should_drop_table (plan, tag) && !tags_set.has (tag))
+ {
+ DEBUG_MSG(SUBSET, nullptr, "drop %c%c%c%c", HB_UNTAG (tag));
+ continue;
+ }
+ tags_set.add (tag);
+ success = success && _subset_table (plan, tag);
+ }
+ offset += count;
+ } while (success && count == ARRAY_LENGTH (table_tags));
+
+ hb_face_t *result = success ? hb_face_reference (plan->dest) : hb_face_get_empty ();
+ hb_subset_plan_destroy (plan);
+ return result;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset.h b/src/3rdparty/harfbuzz-ng/src/hb-subset.h
new file mode 100644
index 0000000000..960afefa5b
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Rod Sheeter
+ */
+
+#ifndef HB_SUBSET_H
+#define HB_SUBSET_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+/*
+ * hb_subset_input_t
+ *
+ * Things that change based on the input. Characters to keep, etc.
+ */
+
+typedef struct hb_subset_input_t hb_subset_input_t;
+
+HB_EXTERN hb_subset_input_t *
+hb_subset_input_create_or_fail (void);
+
+HB_EXTERN hb_subset_input_t *
+hb_subset_input_reference (hb_subset_input_t *subset_input);
+
+HB_EXTERN void
+hb_subset_input_destroy (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
+hb_subset_input_unicode_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
+hb_subset_input_glyph_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
+hb_subset_input_nameid_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
+hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN void
+hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input,
+ hb_bool_t drop_hints);
+HB_EXTERN hb_bool_t
+hb_subset_input_get_drop_hints (hb_subset_input_t *subset_input);
+
+HB_EXTERN void
+hb_subset_input_set_desubroutinize (hb_subset_input_t *subset_input,
+ hb_bool_t desubroutinize);
+HB_EXTERN hb_bool_t
+hb_subset_input_get_desubroutinize (hb_subset_input_t *subset_input);
+
+HB_EXTERN void
+hb_subset_input_set_retain_gids (hb_subset_input_t *subset_input,
+ hb_bool_t retain_gids);
+HB_EXTERN hb_bool_t
+hb_subset_input_get_retain_gids (hb_subset_input_t *subset_input);
+
+/* hb_subset () */
+HB_EXTERN hb_face_t *
+hb_subset (hb_face_t *source, hb_subset_input_t *input);
+
+
+HB_END_DECLS
+
+#endif /* HB_SUBSET_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset.hh b/src/3rdparty/harfbuzz-ng/src/hb-subset.hh
new file mode 100644
index 0000000000..b8dd07ab28
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-subset.hh
@@ -0,0 +1,69 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Roderick Sheeter
+ */
+
+#ifndef HB_SUBSET_HH
+#define HB_SUBSET_HH
+
+
+#include "hb.hh"
+
+#include "hb-subset.h"
+
+#include "hb-machinery.hh"
+#include "hb-subset-input.hh"
+#include "hb-subset-plan.hh"
+
+struct hb_subset_context_t :
+ hb_dispatch_context_t<hb_subset_context_t, bool, HB_DEBUG_SUBSET>
+{
+ const char *get_name () { return "SUBSET"; }
+ static return_t default_return_value () { return true; }
+
+ private:
+ template <typename T, typename ...Ts> auto
+ _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN
+ ( obj.subset (this, hb_forward<Ts> (ds)...) )
+ template <typename T, typename ...Ts> auto
+ _dispatch (const T &obj, hb_priority<0>, Ts&&... ds) HB_AUTO_RETURN
+ ( obj.dispatch (this, hb_forward<Ts> (ds)...) )
+ public:
+ template <typename T, typename ...Ts> auto
+ dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN
+ ( _dispatch (obj, hb_prioritize, hb_forward<Ts> (ds)...) )
+
+ hb_subset_plan_t *plan;
+ hb_serialize_context_t *serializer;
+ unsigned int debug_depth;
+
+ hb_subset_context_t (hb_subset_plan_t *plan_,
+ hb_serialize_context_t *serializer_) :
+ plan (plan_),
+ serializer (serializer_),
+ debug_depth (0) {}
+};
+
+
+#endif /* HB_SUBSET_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ucd-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ucd-table.hh
new file mode 100644
index 0000000000..8b7d648a93
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ucd-table.hh
@@ -0,0 +1,6696 @@
+/* == Start of generated table == */
+/*
+ * The following table is generated by running:
+ *
+ * ./gen-ucd-table.py ucd.nounihan.grouped.xml
+ *
+ * on file with this description: Unicode 12.1.0
+ */
+
+#ifndef HB_UCD_TABLE_HH
+#define HB_UCD_TABLE_HH
+
+#include "hb.hh"
+
+static const hb_script_t
+_hb_ucd_sc_map[153] =
+{
+ HB_SCRIPT_COMMON, HB_SCRIPT_INHERITED,
+ HB_SCRIPT_UNKNOWN, HB_SCRIPT_ARABIC,
+ HB_SCRIPT_ARMENIAN, HB_SCRIPT_BENGALI,
+ HB_SCRIPT_CYRILLIC, HB_SCRIPT_DEVANAGARI,
+ HB_SCRIPT_GEORGIAN, HB_SCRIPT_GREEK,
+ HB_SCRIPT_GUJARATI, HB_SCRIPT_GURMUKHI,
+ HB_SCRIPT_HANGUL, HB_SCRIPT_HAN,
+ HB_SCRIPT_HEBREW, HB_SCRIPT_HIRAGANA,
+ HB_SCRIPT_KANNADA, HB_SCRIPT_KATAKANA,
+ HB_SCRIPT_LAO, HB_SCRIPT_LATIN,
+ HB_SCRIPT_MALAYALAM, HB_SCRIPT_ORIYA,
+ HB_SCRIPT_TAMIL, HB_SCRIPT_TELUGU,
+ HB_SCRIPT_THAI, HB_SCRIPT_TIBETAN,
+ HB_SCRIPT_BOPOMOFO, HB_SCRIPT_BRAILLE,
+ HB_SCRIPT_CANADIAN_SYLLABICS, HB_SCRIPT_CHEROKEE,
+ HB_SCRIPT_ETHIOPIC, HB_SCRIPT_KHMER,
+ HB_SCRIPT_MONGOLIAN, HB_SCRIPT_MYANMAR,
+ HB_SCRIPT_OGHAM, HB_SCRIPT_RUNIC,
+ HB_SCRIPT_SINHALA, HB_SCRIPT_SYRIAC,
+ HB_SCRIPT_THAANA, HB_SCRIPT_YI,
+ HB_SCRIPT_DESERET, HB_SCRIPT_GOTHIC,
+ HB_SCRIPT_OLD_ITALIC, HB_SCRIPT_BUHID,
+ HB_SCRIPT_HANUNOO, HB_SCRIPT_TAGALOG,
+ HB_SCRIPT_TAGBANWA, HB_SCRIPT_CYPRIOT,
+ HB_SCRIPT_LIMBU, HB_SCRIPT_LINEAR_B,
+ HB_SCRIPT_OSMANYA, HB_SCRIPT_SHAVIAN,
+ HB_SCRIPT_TAI_LE, HB_SCRIPT_UGARITIC,
+ HB_SCRIPT_BUGINESE, HB_SCRIPT_COPTIC,
+ HB_SCRIPT_GLAGOLITIC, HB_SCRIPT_KHAROSHTHI,
+ HB_SCRIPT_NEW_TAI_LUE, HB_SCRIPT_OLD_PERSIAN,
+ HB_SCRIPT_SYLOTI_NAGRI, HB_SCRIPT_TIFINAGH,
+ HB_SCRIPT_BALINESE, HB_SCRIPT_CUNEIFORM,
+ HB_SCRIPT_NKO, HB_SCRIPT_PHAGS_PA,
+ HB_SCRIPT_PHOENICIAN, HB_SCRIPT_CARIAN,
+ HB_SCRIPT_CHAM, HB_SCRIPT_KAYAH_LI,
+ HB_SCRIPT_LEPCHA, HB_SCRIPT_LYCIAN,
+ HB_SCRIPT_LYDIAN, HB_SCRIPT_OL_CHIKI,
+ HB_SCRIPT_REJANG, HB_SCRIPT_SAURASHTRA,
+ HB_SCRIPT_SUNDANESE, HB_SCRIPT_VAI,
+ HB_SCRIPT_AVESTAN, HB_SCRIPT_BAMUM,
+ HB_SCRIPT_EGYPTIAN_HIEROGLYPHS, HB_SCRIPT_IMPERIAL_ARAMAIC,
+ HB_SCRIPT_INSCRIPTIONAL_PAHLAVI, HB_SCRIPT_INSCRIPTIONAL_PARTHIAN,
+ HB_SCRIPT_JAVANESE, HB_SCRIPT_KAITHI,
+ HB_SCRIPT_LISU, HB_SCRIPT_MEETEI_MAYEK,
+ HB_SCRIPT_OLD_SOUTH_ARABIAN, HB_SCRIPT_OLD_TURKIC,
+ HB_SCRIPT_SAMARITAN, HB_SCRIPT_TAI_THAM,
+ HB_SCRIPT_TAI_VIET, HB_SCRIPT_BATAK,
+ HB_SCRIPT_BRAHMI, HB_SCRIPT_MANDAIC,
+ HB_SCRIPT_CHAKMA, HB_SCRIPT_MEROITIC_CURSIVE,
+ HB_SCRIPT_MEROITIC_HIEROGLYPHS, HB_SCRIPT_MIAO,
+ HB_SCRIPT_SHARADA, HB_SCRIPT_SORA_SOMPENG,
+ HB_SCRIPT_TAKRI, HB_SCRIPT_BASSA_VAH,
+ HB_SCRIPT_CAUCASIAN_ALBANIAN, HB_SCRIPT_DUPLOYAN,
+ HB_SCRIPT_ELBASAN, HB_SCRIPT_GRANTHA,
+ HB_SCRIPT_KHOJKI, HB_SCRIPT_KHUDAWADI,
+ HB_SCRIPT_LINEAR_A, HB_SCRIPT_MAHAJANI,
+ HB_SCRIPT_MANICHAEAN, HB_SCRIPT_MENDE_KIKAKUI,
+ HB_SCRIPT_MODI, HB_SCRIPT_MRO,
+ HB_SCRIPT_NABATAEAN, HB_SCRIPT_OLD_NORTH_ARABIAN,
+ HB_SCRIPT_OLD_PERMIC, HB_SCRIPT_PAHAWH_HMONG,
+ HB_SCRIPT_PALMYRENE, HB_SCRIPT_PAU_CIN_HAU,
+ HB_SCRIPT_PSALTER_PAHLAVI, HB_SCRIPT_SIDDHAM,
+ HB_SCRIPT_TIRHUTA, HB_SCRIPT_WARANG_CITI,
+ HB_SCRIPT_AHOM, HB_SCRIPT_ANATOLIAN_HIEROGLYPHS,
+ HB_SCRIPT_HATRAN, HB_SCRIPT_MULTANI,
+ HB_SCRIPT_OLD_HUNGARIAN, HB_SCRIPT_SIGNWRITING,
+ HB_SCRIPT_ADLAM, HB_SCRIPT_BHAIKSUKI,
+ HB_SCRIPT_MARCHEN, HB_SCRIPT_OSAGE,
+ HB_SCRIPT_TANGUT, HB_SCRIPT_NEWA,
+ HB_SCRIPT_MASARAM_GONDI, HB_SCRIPT_NUSHU,
+ HB_SCRIPT_SOYOMBO, HB_SCRIPT_ZANABAZAR_SQUARE,
+ HB_SCRIPT_DOGRA, HB_SCRIPT_GUNJALA_GONDI,
+ HB_SCRIPT_HANIFI_ROHINGYA, HB_SCRIPT_MAKASAR,
+ HB_SCRIPT_MEDEFAIDRIN, HB_SCRIPT_OLD_SOGDIAN,
+ HB_SCRIPT_SOGDIAN, HB_SCRIPT_ELYMAIC,
+ HB_SCRIPT_NANDINAGARI, HB_SCRIPT_NYIAKENG_PUACHUE_HMONG,
+ HB_SCRIPT_WANCHO,
+};
+static const uint16_t
+_hb_ucd_dm1_p0_map[825] =
+{
+ 0x003Bu, 0x004Bu, 0x0060u, 0x00B4u, 0x00B7u, 0x00C5u, 0x02B9u, 0x0300u,
+ 0x0301u, 0x0313u, 0x0385u, 0x0386u, 0x0388u, 0x0389u, 0x038Au, 0x038Cu,
+ 0x038Eu, 0x038Fu, 0x0390u, 0x03A9u, 0x03ACu, 0x03ADu, 0x03AEu, 0x03AFu,
+ 0x03B0u, 0x03B9u, 0x03CCu, 0x03CDu, 0x03CEu, 0x2002u, 0x2003u, 0x3008u,
+ 0x3009u, 0x349Eu, 0x34B9u, 0x34BBu, 0x34DFu, 0x3515u, 0x36EEu, 0x36FCu,
+ 0x3781u, 0x382Fu, 0x3862u, 0x387Cu, 0x38C7u, 0x38E3u, 0x391Cu, 0x393Au,
+ 0x3A2Eu, 0x3A6Cu, 0x3AE4u, 0x3B08u, 0x3B19u, 0x3B49u, 0x3B9Du, 0x3C18u,
+ 0x3C4Eu, 0x3D33u, 0x3D96u, 0x3EACu, 0x3EB8u, 0x3F1Bu, 0x3FFCu, 0x4008u,
+ 0x4018u, 0x4039u, 0x4046u, 0x4096u, 0x40E3u, 0x412Fu, 0x4202u, 0x4227u,
+ 0x42A0u, 0x4301u, 0x4334u, 0x4359u, 0x43D5u, 0x43D9u, 0x440Bu, 0x446Bu,
+ 0x452Bu, 0x455Du, 0x4561u, 0x456Bu, 0x45D7u, 0x45F9u, 0x4635u, 0x46BEu,
+ 0x46C7u, 0x4995u, 0x49E6u, 0x4A6Eu, 0x4A76u, 0x4AB2u, 0x4B33u, 0x4BCEu,
+ 0x4CCEu, 0x4CEDu, 0x4CF8u, 0x4D56u, 0x4E0Du, 0x4E26u, 0x4E32u, 0x4E38u,
+ 0x4E39u, 0x4E3Du, 0x4E41u, 0x4E82u, 0x4E86u, 0x4EAEu, 0x4EC0u, 0x4ECCu,
+ 0x4EE4u, 0x4F60u, 0x4F80u, 0x4F86u, 0x4F8Bu, 0x4FAEu, 0x4FBBu, 0x4FBFu,
+ 0x5002u, 0x502Bu, 0x507Au, 0x5099u, 0x50CFu, 0x50DAu, 0x50E7u, 0x5140u,
+ 0x5145u, 0x514Du, 0x5154u, 0x5164u, 0x5167u, 0x5168u, 0x5169u, 0x516Du,
+ 0x5177u, 0x5180u, 0x518Du, 0x5192u, 0x5195u, 0x5197u, 0x51A4u, 0x51ACu,
+ 0x51B5u, 0x51B7u, 0x51C9u, 0x51CCu, 0x51DCu, 0x51DEu, 0x51F5u, 0x5203u,
+ 0x5207u, 0x5217u, 0x5229u, 0x523Au, 0x523Bu, 0x5246u, 0x5272u, 0x5277u,
+ 0x5289u, 0x529Bu, 0x52A3u, 0x52B3u, 0x52C7u, 0x52C9u, 0x52D2u, 0x52DEu,
+ 0x52E4u, 0x52F5u, 0x52FAu, 0x5305u, 0x5306u, 0x5317u, 0x533Fu, 0x5349u,
+ 0x5351u, 0x535Au, 0x5373u, 0x5375u, 0x537Du, 0x537Fu, 0x53C3u, 0x53CAu,
+ 0x53DFu, 0x53E5u, 0x53EBu, 0x53F1u, 0x5406u, 0x540Fu, 0x541Du, 0x5438u,
+ 0x5442u, 0x5448u, 0x5468u, 0x549Eu, 0x54A2u, 0x54BDu, 0x54F6u, 0x5510u,
+ 0x5553u, 0x5555u, 0x5563u, 0x5584u, 0x5587u, 0x5599u, 0x559Du, 0x55ABu,
+ 0x55B3u, 0x55C0u, 0x55C2u, 0x55E2u, 0x5606u, 0x5651u, 0x5668u, 0x5674u,
+ 0x56F9u, 0x5716u, 0x5717u, 0x578Bu, 0x57CEu, 0x57F4u, 0x580Du, 0x5831u,
+ 0x5832u, 0x5840u, 0x585Au, 0x585Eu, 0x58A8u, 0x58ACu, 0x58B3u, 0x58D8u,
+ 0x58DFu, 0x58EEu, 0x58F2u, 0x58F7u, 0x5906u, 0x591Au, 0x5922u, 0x5944u,
+ 0x5948u, 0x5951u, 0x5954u, 0x5962u, 0x5973u, 0x59D8u, 0x59ECu, 0x5A1Bu,
+ 0x5A27u, 0x5A62u, 0x5A66u, 0x5AB5u, 0x5B08u, 0x5B28u, 0x5B3Eu, 0x5B85u,
+ 0x5BC3u, 0x5BD8u, 0x5BE7u, 0x5BEEu, 0x5BF3u, 0x5BFFu, 0x5C06u, 0x5C22u,
+ 0x5C3Fu, 0x5C60u, 0x5C62u, 0x5C64u, 0x5C65u, 0x5C6Eu, 0x5C8Du, 0x5CC0u,
+ 0x5D19u, 0x5D43u, 0x5D50u, 0x5D6Bu, 0x5D6Eu, 0x5D7Cu, 0x5DB2u, 0x5DBAu,
+ 0x5DE1u, 0x5DE2u, 0x5DFDu, 0x5E28u, 0x5E3Du, 0x5E69u, 0x5E74u, 0x5EA6u,
+ 0x5EB0u, 0x5EB3u, 0x5EB6u, 0x5EC9u, 0x5ECAu, 0x5ED2u, 0x5ED3u, 0x5ED9u,
+ 0x5EECu, 0x5EFEu, 0x5F04u, 0x5F22u, 0x5F53u, 0x5F62u, 0x5F69u, 0x5F6Bu,
+ 0x5F8Bu, 0x5F9Au, 0x5FA9u, 0x5FADu, 0x5FCDu, 0x5FD7u, 0x5FF5u, 0x5FF9u,
+ 0x6012u, 0x601Cu, 0x6075u, 0x6081u, 0x6094u, 0x60C7u, 0x60D8u, 0x60E1u,
+ 0x6108u, 0x6144u, 0x6148u, 0x614Cu, 0x614Eu, 0x6160u, 0x6168u, 0x617Au,
+ 0x618Eu, 0x6190u, 0x61A4u, 0x61AFu, 0x61B2u, 0x61DEu, 0x61F2u, 0x61F6u,
+ 0x6200u, 0x6210u, 0x621Bu, 0x622Eu, 0x6234u, 0x625Du, 0x62B1u, 0x62C9u,
+ 0x62CFu, 0x62D3u, 0x62D4u, 0x62FCu, 0x62FEu, 0x633Du, 0x6350u, 0x6368u,
+ 0x637Bu, 0x6383u, 0x63A0u, 0x63A9u, 0x63C4u, 0x63C5u, 0x63E4u, 0x641Cu,
+ 0x6422u, 0x6452u, 0x6469u, 0x6477u, 0x647Eu, 0x649Au, 0x649Du, 0x64C4u,
+ 0x654Fu, 0x6556u, 0x656Cu, 0x6578u, 0x6599u, 0x65C5u, 0x65E2u, 0x65E3u,
+ 0x6613u, 0x6649u, 0x6674u, 0x6688u, 0x6691u, 0x669Cu, 0x66B4u, 0x66C6u,
+ 0x66F4u, 0x66F8u, 0x6700u, 0x6717u, 0x671Bu, 0x6721u, 0x674Eu, 0x6753u,
+ 0x6756u, 0x675Eu, 0x677Bu, 0x6785u, 0x6797u, 0x67F3u, 0x67FAu, 0x6817u,
+ 0x681Fu, 0x6852u, 0x6881u, 0x6885u, 0x688Eu, 0x68A8u, 0x6914u, 0x6942u,
+ 0x69A3u, 0x69EAu, 0x6A02u, 0x6A13u, 0x6AA8u, 0x6AD3u, 0x6ADBu, 0x6B04u,
+ 0x6B21u, 0x6B54u, 0x6B72u, 0x6B77u, 0x6B79u, 0x6B9Fu, 0x6BAEu, 0x6BBAu,
+ 0x6BBBu, 0x6C4Eu, 0x6C67u, 0x6C88u, 0x6CBFu, 0x6CCCu, 0x6CCDu, 0x6CE5u,
+ 0x6D16u, 0x6D1Bu, 0x6D1Eu, 0x6D34u, 0x6D3Eu, 0x6D41u, 0x6D69u, 0x6D6Au,
+ 0x6D77u, 0x6D78u, 0x6D85u, 0x6DCBu, 0x6DDAu, 0x6DEAu, 0x6DF9u, 0x6E1Au,
+ 0x6E2Fu, 0x6E6Eu, 0x6E9Cu, 0x6EBAu, 0x6EC7u, 0x6ECBu, 0x6ED1u, 0x6EDBu,
+ 0x6F0Fu, 0x6F22u, 0x6F23u, 0x6F6Eu, 0x6FC6u, 0x6FEBu, 0x6FFEu, 0x701Bu,
+ 0x701Eu, 0x7039u, 0x704Au, 0x7070u, 0x7077u, 0x707Du, 0x7099u, 0x70ADu,
+ 0x70C8u, 0x70D9u, 0x7145u, 0x7149u, 0x716Eu, 0x719Cu, 0x71CEu, 0x71D0u,
+ 0x7210u, 0x721Bu, 0x7228u, 0x722Bu, 0x7235u, 0x7250u, 0x7262u, 0x7280u,
+ 0x7295u, 0x72AFu, 0x72C0u, 0x72FCu, 0x732Au, 0x7375u, 0x737Au, 0x7387u,
+ 0x738Bu, 0x73A5u, 0x73B2u, 0x73DEu, 0x7406u, 0x7409u, 0x7422u, 0x7447u,
+ 0x745Cu, 0x7469u, 0x7471u, 0x7485u, 0x7489u, 0x7498u, 0x74CAu, 0x7506u,
+ 0x7524u, 0x753Bu, 0x753Eu, 0x7559u, 0x7565u, 0x7570u, 0x75E2u, 0x7610u,
+ 0x761Du, 0x761Fu, 0x7642u, 0x7669u, 0x76CAu, 0x76DBu, 0x76E7u, 0x76F4u,
+ 0x7701u, 0x771Eu, 0x771Fu, 0x7740u, 0x774Au, 0x778Bu, 0x77A7u, 0x784Eu,
+ 0x786Bu, 0x788Cu, 0x7891u, 0x78CAu, 0x78CCu, 0x78FBu, 0x792Au, 0x793Cu,
+ 0x793Eu, 0x7948u, 0x7949u, 0x7950u, 0x7956u, 0x795Du, 0x795Eu, 0x7965u,
+ 0x797Fu, 0x798Du, 0x798Eu, 0x798Fu, 0x79AEu, 0x79CAu, 0x79EBu, 0x7A1Cu,
+ 0x7A40u, 0x7A4Au, 0x7A4Fu, 0x7A81u, 0x7AB1u, 0x7ACBu, 0x7AEEu, 0x7B20u,
+ 0x7BC0u, 0x7BC6u, 0x7BC9u, 0x7C3Eu, 0x7C60u, 0x7C7Bu, 0x7C92u, 0x7CBEu,
+ 0x7CD2u, 0x7CD6u, 0x7CE3u, 0x7CE7u, 0x7CE8u, 0x7D00u, 0x7D10u, 0x7D22u,
+ 0x7D2Fu, 0x7D5Bu, 0x7D63u, 0x7DA0u, 0x7DBEu, 0x7DC7u, 0x7DF4u, 0x7E02u,
+ 0x7E09u, 0x7E37u, 0x7E41u, 0x7E45u, 0x7F3Eu, 0x7F72u, 0x7F79u, 0x7F7Au,
+ 0x7F85u, 0x7F95u, 0x7F9Au, 0x7FBDu, 0x7FFAu, 0x8001u, 0x8005u, 0x8046u,
+ 0x8060u, 0x806Fu, 0x8070u, 0x807Eu, 0x808Bu, 0x80ADu, 0x80B2u, 0x8103u,
+ 0x813Eu, 0x81D8u, 0x81E8u, 0x81EDu, 0x8201u, 0x8204u, 0x8218u, 0x826Fu,
+ 0x8279u, 0x828Bu, 0x8291u, 0x829Du, 0x82B1u, 0x82B3u, 0x82BDu, 0x82E5u,
+ 0x82E6u, 0x831Du, 0x8323u, 0x8336u, 0x8352u, 0x8353u, 0x8363u, 0x83ADu,
+ 0x83BDu, 0x83C9u, 0x83CAu, 0x83CCu, 0x83DCu, 0x83E7u, 0x83EFu, 0x83F1u,
+ 0x843Du, 0x8449u, 0x8457u, 0x84EEu, 0x84F1u, 0x84F3u, 0x84FCu, 0x8516u,
+ 0x8564u, 0x85CDu, 0x85FAu, 0x8606u, 0x8612u, 0x862Du, 0x863Fu, 0x8650u,
+ 0x865Cu, 0x8667u, 0x8669u, 0x8688u, 0x86A9u, 0x86E2u, 0x870Eu, 0x8728u,
+ 0x876Bu, 0x8779u, 0x8786u, 0x87BAu, 0x87E1u, 0x8801u, 0x881Fu, 0x884Cu,
+ 0x8860u, 0x8863u, 0x88C2u, 0x88CFu, 0x88D7u, 0x88DEu, 0x88E1u, 0x88F8u,
+ 0x88FAu, 0x8910u, 0x8941u, 0x8964u, 0x8986u, 0x898Bu, 0x8996u, 0x8AA0u,
+ 0x8AAAu, 0x8ABFu, 0x8ACBu, 0x8AD2u, 0x8AD6u, 0x8AEDu, 0x8AF8u, 0x8AFEu,
+ 0x8B01u, 0x8B39u, 0x8B58u, 0x8B80u, 0x8B8Au, 0x8C48u, 0x8C55u, 0x8CABu,
+ 0x8CC1u, 0x8CC2u, 0x8CC8u, 0x8CD3u, 0x8D08u, 0x8D1Bu, 0x8D77u, 0x8DBCu,
+ 0x8DCBu, 0x8DEFu, 0x8DF0u, 0x8ECAu, 0x8ED4u, 0x8F26u, 0x8F2Au, 0x8F38u,
+ 0x8F3Bu, 0x8F62u, 0x8F9Eu, 0x8FB0u, 0x8FB6u, 0x9023u, 0x9038u, 0x9072u,
+ 0x907Cu, 0x908Fu, 0x9094u, 0x90CEu, 0x90DEu, 0x90F1u, 0x90FDu, 0x9111u,
+ 0x911Bu, 0x916Au, 0x9199u, 0x91B4u, 0x91CCu, 0x91CFu, 0x91D1u, 0x9234u,
+ 0x9238u, 0x9276u, 0x927Cu, 0x92D7u, 0x92D8u, 0x9304u, 0x934Au, 0x93F9u,
+ 0x9415u, 0x958Bu, 0x95ADu, 0x95B7u, 0x962Eu, 0x964Bu, 0x964Du, 0x9675u,
+ 0x9678u, 0x967Cu, 0x9686u, 0x96A3u, 0x96B7u, 0x96B8u, 0x96C3u, 0x96E2u,
+ 0x96E3u, 0x96F6u, 0x96F7u, 0x9723u, 0x9732u, 0x9748u, 0x9756u, 0x97DBu,
+ 0x97E0u, 0x97FFu, 0x980Bu, 0x9818u, 0x9829u, 0x983Bu, 0x985Eu, 0x98E2u,
+ 0x98EFu, 0x98FCu, 0x9928u, 0x9929u, 0x99A7u, 0x99C2u, 0x99F1u, 0x99FEu,
+ 0x9A6Au, 0x9B12u, 0x9B6Fu, 0x9C40u, 0x9C57u, 0x9CFDu, 0x9D67u, 0x9DB4u,
+ 0x9DFAu, 0x9E1Eu, 0x9E7Fu, 0x9E97u, 0x9E9Fu, 0x9EBBu, 0x9ECEu, 0x9EF9u,
+ 0x9EFEu, 0x9F05u, 0x9F0Fu, 0x9F16u, 0x9F3Bu, 0x9F43u, 0x9F8Du, 0x9F8Eu,
+ 0x9F9Cu,
+};
+static const uint16_t
+_hb_ucd_dm1_p2_map[110] =
+{
+ 0x0122u, 0x051Cu, 0x0525u, 0x054Bu, 0x063Au, 0x0804u, 0x08DEu, 0x0A2Cu,
+ 0x0B63u, 0x14E4u, 0x16A8u, 0x16EAu, 0x19C8u, 0x1B18u, 0x1D0Bu, 0x1DE4u,
+ 0x1DE6u, 0x2183u, 0x219Fu, 0x2331u, 0x26D4u, 0x2844u, 0x284Au, 0x2B0Cu,
+ 0x2BF1u, 0x300Au, 0x32B8u, 0x335Fu, 0x3393u, 0x339Cu, 0x33C3u, 0x33D5u,
+ 0x346Du, 0x36A3u, 0x38A7u, 0x3A8Du, 0x3AFAu, 0x3CBCu, 0x3D1Eu, 0x3ED1u,
+ 0x3F5Eu, 0x3F8Eu, 0x4263u, 0x42EEu, 0x43ABu, 0x4608u, 0x4735u, 0x4814u,
+ 0x4C36u, 0x4C92u, 0x4FA1u, 0x4FB8u, 0x5044u, 0x50F2u, 0x50F3u, 0x5119u,
+ 0x5133u, 0x5249u, 0x541Du, 0x5626u, 0x569Au, 0x56C5u, 0x597Cu, 0x5AA7u,
+ 0x5BABu, 0x5C80u, 0x5CD0u, 0x5F86u, 0x61DAu, 0x6228u, 0x6247u, 0x62D9u,
+ 0x633Eu, 0x64DAu, 0x6523u, 0x65A8u, 0x67A7u, 0x67B5u, 0x6B3Cu, 0x6C36u,
+ 0x6CD5u, 0x6D6Bu, 0x6F2Cu, 0x6FB1u, 0x70D2u, 0x73CAu, 0x7667u, 0x78AEu,
+ 0x7966u, 0x7CA8u, 0x7ED3u, 0x7F2Fu, 0x85D2u, 0x85EDu, 0x872Eu, 0x8BFAu,
+ 0x8D77u, 0x9145u, 0x91DFu, 0x921Au, 0x940Au, 0x9496u, 0x95B6u, 0x9B30u,
+ 0xA0CEu, 0xA105u, 0xA20Eu, 0xA291u, 0xA392u, 0xA600u,
+};
+static const uint32_t
+_hb_ucd_dm2_u32_map[638] =
+{
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x003Cu, 0x0338u, 0x226Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x003Du, 0x0338u, 0x2260u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x003Eu, 0x0338u, 0x226Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0300u, 0x00C0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0301u, 0x00C1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0302u, 0x00C2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0303u, 0x00C3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0304u, 0x0100u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0306u, 0x0102u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0307u, 0x0226u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0308u, 0x00C4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0309u, 0x1EA2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x030Au, 0x00C5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x030Cu, 0x01CDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x030Fu, 0x0200u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0311u, 0x0202u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0323u, 0x1EA0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0325u, 0x1E00u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0328u, 0x0104u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0042u, 0x0307u, 0x1E02u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0042u, 0x0323u, 0x1E04u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0042u, 0x0331u, 0x1E06u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0301u, 0x0106u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0302u, 0x0108u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0307u, 0x010Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x030Cu, 0x010Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0327u, 0x00C7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0307u, 0x1E0Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x030Cu, 0x010Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0323u, 0x1E0Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0327u, 0x1E10u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x032Du, 0x1E12u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0331u, 0x1E0Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0300u, 0x00C8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0301u, 0x00C9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0302u, 0x00CAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0303u, 0x1EBCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0304u, 0x0112u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0306u, 0x0114u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0307u, 0x0116u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0308u, 0x00CBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0309u, 0x1EBAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x030Cu, 0x011Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x030Fu, 0x0204u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0311u, 0x0206u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0323u, 0x1EB8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0327u, 0x0228u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0328u, 0x0118u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x032Du, 0x1E18u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0330u, 0x1E1Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0046u, 0x0307u, 0x1E1Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0301u, 0x01F4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0302u, 0x011Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0304u, 0x1E20u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0306u, 0x011Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0307u, 0x0120u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x030Cu, 0x01E6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0327u, 0x0122u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0302u, 0x0124u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0307u, 0x1E22u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0308u, 0x1E26u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x030Cu, 0x021Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0323u, 0x1E24u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0327u, 0x1E28u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x032Eu, 0x1E2Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0300u, 0x00CCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0301u, 0x00CDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0302u, 0x00CEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0303u, 0x0128u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0304u, 0x012Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0306u, 0x012Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0307u, 0x0130u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0308u, 0x00CFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0309u, 0x1EC8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x030Cu, 0x01CFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x030Fu, 0x0208u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0311u, 0x020Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0323u, 0x1ECAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0328u, 0x012Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0330u, 0x1E2Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Au, 0x0302u, 0x0134u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0301u, 0x1E30u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x030Cu, 0x01E8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0323u, 0x1E32u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0327u, 0x0136u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0331u, 0x1E34u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0301u, 0x0139u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x030Cu, 0x013Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0323u, 0x1E36u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0327u, 0x013Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x032Du, 0x1E3Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0331u, 0x1E3Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Du, 0x0301u, 0x1E3Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Du, 0x0307u, 0x1E40u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Du, 0x0323u, 0x1E42u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0300u, 0x01F8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0301u, 0x0143u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0303u, 0x00D1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0307u, 0x1E44u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x030Cu, 0x0147u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0323u, 0x1E46u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0327u, 0x0145u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x032Du, 0x1E4Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0331u, 0x1E48u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0300u, 0x00D2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0301u, 0x00D3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0302u, 0x00D4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0303u, 0x00D5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0304u, 0x014Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0306u, 0x014Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0307u, 0x022Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0308u, 0x00D6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0309u, 0x1ECEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x030Bu, 0x0150u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x030Cu, 0x01D1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x030Fu, 0x020Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0311u, 0x020Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x031Bu, 0x01A0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0323u, 0x1ECCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0328u, 0x01EAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0050u, 0x0301u, 0x1E54u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0050u, 0x0307u, 0x1E56u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0301u, 0x0154u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0307u, 0x1E58u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x030Cu, 0x0158u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x030Fu, 0x0210u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0311u, 0x0212u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0323u, 0x1E5Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0327u, 0x0156u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0331u, 0x1E5Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0301u, 0x015Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0302u, 0x015Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0307u, 0x1E60u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x030Cu, 0x0160u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0323u, 0x1E62u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0326u, 0x0218u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0327u, 0x015Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0307u, 0x1E6Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x030Cu, 0x0164u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0323u, 0x1E6Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0326u, 0x021Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0327u, 0x0162u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x032Du, 0x1E70u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0331u, 0x1E6Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0300u, 0x00D9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0301u, 0x00DAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0302u, 0x00DBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0303u, 0x0168u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0304u, 0x016Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0306u, 0x016Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0308u, 0x00DCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0309u, 0x1EE6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Au, 0x016Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Bu, 0x0170u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Cu, 0x01D3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Fu, 0x0214u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0311u, 0x0216u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x031Bu, 0x01AFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0323u, 0x1EE4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0324u, 0x1E72u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0328u, 0x0172u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x032Du, 0x1E76u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0330u, 0x1E74u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0056u, 0x0303u, 0x1E7Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0056u, 0x0323u, 0x1E7Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0300u, 0x1E80u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0301u, 0x1E82u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0302u, 0x0174u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0307u, 0x1E86u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0308u, 0x1E84u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0323u, 0x1E88u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0058u, 0x0307u, 0x1E8Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0058u, 0x0308u, 0x1E8Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0300u, 0x1EF2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0301u, 0x00DDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0302u, 0x0176u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0303u, 0x1EF8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0304u, 0x0232u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0307u, 0x1E8Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0308u, 0x0178u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0309u, 0x1EF6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0323u, 0x1EF4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0301u, 0x0179u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0302u, 0x1E90u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0307u, 0x017Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x030Cu, 0x017Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0323u, 0x1E92u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0331u, 0x1E94u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0300u, 0x00E0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0301u, 0x00E1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0302u, 0x00E2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0303u, 0x00E3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0304u, 0x0101u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0306u, 0x0103u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0307u, 0x0227u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0308u, 0x00E4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0309u, 0x1EA3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x030Au, 0x00E5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x030Cu, 0x01CEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x030Fu, 0x0201u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0311u, 0x0203u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0323u, 0x1EA1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0325u, 0x1E01u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0328u, 0x0105u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0062u, 0x0307u, 0x1E03u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0062u, 0x0323u, 0x1E05u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0062u, 0x0331u, 0x1E07u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0301u, 0x0107u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0302u, 0x0109u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0307u, 0x010Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x030Cu, 0x010Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0327u, 0x00E7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0307u, 0x1E0Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x030Cu, 0x010Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0323u, 0x1E0Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0327u, 0x1E11u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x032Du, 0x1E13u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0331u, 0x1E0Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0300u, 0x00E8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0301u, 0x00E9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0302u, 0x00EAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0303u, 0x1EBDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0304u, 0x0113u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0306u, 0x0115u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0307u, 0x0117u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0308u, 0x00EBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0309u, 0x1EBBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x030Cu, 0x011Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x030Fu, 0x0205u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0311u, 0x0207u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0323u, 0x1EB9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0327u, 0x0229u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0328u, 0x0119u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x032Du, 0x1E19u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0330u, 0x1E1Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0066u, 0x0307u, 0x1E1Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0301u, 0x01F5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0302u, 0x011Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0304u, 0x1E21u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0306u, 0x011Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0307u, 0x0121u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x030Cu, 0x01E7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0327u, 0x0123u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0302u, 0x0125u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0307u, 0x1E23u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0308u, 0x1E27u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x030Cu, 0x021Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0323u, 0x1E25u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0327u, 0x1E29u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x032Eu, 0x1E2Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0331u, 0x1E96u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0300u, 0x00ECu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0301u, 0x00EDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0302u, 0x00EEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0303u, 0x0129u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0304u, 0x012Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0306u, 0x012Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0308u, 0x00EFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0309u, 0x1EC9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x030Cu, 0x01D0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x030Fu, 0x0209u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0311u, 0x020Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0323u, 0x1ECBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0328u, 0x012Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0330u, 0x1E2Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Au, 0x0302u, 0x0135u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Au, 0x030Cu, 0x01F0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0301u, 0x1E31u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x030Cu, 0x01E9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0323u, 0x1E33u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0327u, 0x0137u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0331u, 0x1E35u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0301u, 0x013Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x030Cu, 0x013Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0323u, 0x1E37u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0327u, 0x013Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x032Du, 0x1E3Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0331u, 0x1E3Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Du, 0x0301u, 0x1E3Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Du, 0x0307u, 0x1E41u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Du, 0x0323u, 0x1E43u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0300u, 0x01F9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0301u, 0x0144u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0303u, 0x00F1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0307u, 0x1E45u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x030Cu, 0x0148u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0323u, 0x1E47u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0327u, 0x0146u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x032Du, 0x1E4Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0331u, 0x1E49u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0300u, 0x00F2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0301u, 0x00F3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0302u, 0x00F4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0303u, 0x00F5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0304u, 0x014Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0306u, 0x014Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0307u, 0x022Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0308u, 0x00F6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0309u, 0x1ECFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x030Bu, 0x0151u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x030Cu, 0x01D2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x030Fu, 0x020Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0311u, 0x020Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x031Bu, 0x01A1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0323u, 0x1ECDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0328u, 0x01EBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0070u, 0x0301u, 0x1E55u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0070u, 0x0307u, 0x1E57u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0301u, 0x0155u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0307u, 0x1E59u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x030Cu, 0x0159u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x030Fu, 0x0211u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0311u, 0x0213u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0323u, 0x1E5Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0327u, 0x0157u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0331u, 0x1E5Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0301u, 0x015Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0302u, 0x015Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0307u, 0x1E61u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x030Cu, 0x0161u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0323u, 0x1E63u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0326u, 0x0219u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0327u, 0x015Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0307u, 0x1E6Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0308u, 0x1E97u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x030Cu, 0x0165u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0323u, 0x1E6Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0326u, 0x021Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0327u, 0x0163u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x032Du, 0x1E71u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0331u, 0x1E6Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0300u, 0x00F9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0301u, 0x00FAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0302u, 0x00FBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0303u, 0x0169u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0304u, 0x016Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0306u, 0x016Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0308u, 0x00FCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0309u, 0x1EE7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Au, 0x016Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Bu, 0x0171u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Cu, 0x01D4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Fu, 0x0215u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0311u, 0x0217u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x031Bu, 0x01B0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0323u, 0x1EE5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0324u, 0x1E73u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0328u, 0x0173u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x032Du, 0x1E77u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0330u, 0x1E75u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0076u, 0x0303u, 0x1E7Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0076u, 0x0323u, 0x1E7Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0300u, 0x1E81u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0301u, 0x1E83u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0302u, 0x0175u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0307u, 0x1E87u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0308u, 0x1E85u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x030Au, 0x1E98u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0323u, 0x1E89u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0078u, 0x0307u, 0x1E8Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0078u, 0x0308u, 0x1E8Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0300u, 0x1EF3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0301u, 0x00FDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0302u, 0x0177u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0303u, 0x1EF9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0304u, 0x0233u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0307u, 0x1E8Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0308u, 0x00FFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0309u, 0x1EF7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x030Au, 0x1E99u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0323u, 0x1EF5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0301u, 0x017Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0302u, 0x1E91u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0307u, 0x017Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x030Cu, 0x017Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0323u, 0x1E93u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0331u, 0x1E95u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8u, 0x0300u, 0x1FEDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8u, 0x0301u, 0x0385u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8u, 0x0342u, 0x1FC1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0300u, 0x1EA6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0301u, 0x1EA4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0303u, 0x1EAAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0309u, 0x1EA8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00C4u, 0x0304u, 0x01DEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00C5u, 0x0301u, 0x01FAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00C6u, 0x0301u, 0x01FCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00C6u, 0x0304u, 0x01E2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00C7u, 0x0301u, 0x1E08u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0300u, 0x1EC0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0301u, 0x1EBEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0303u, 0x1EC4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0309u, 0x1EC2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00CFu, 0x0301u, 0x1E2Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0300u, 0x1ED2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0301u, 0x1ED0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0303u, 0x1ED6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0309u, 0x1ED4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5u, 0x0301u, 0x1E4Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5u, 0x0304u, 0x022Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5u, 0x0308u, 0x1E4Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00D6u, 0x0304u, 0x022Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00D8u, 0x0301u, 0x01FEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x0300u, 0x01DBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x0301u, 0x01D7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x0304u, 0x01D5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x030Cu, 0x01D9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0300u, 0x1EA7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0301u, 0x1EA5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0303u, 0x1EABu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0309u, 0x1EA9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00E4u, 0x0304u, 0x01DFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00E5u, 0x0301u, 0x01FBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00E6u, 0x0301u, 0x01FDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00E6u, 0x0304u, 0x01E3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00E7u, 0x0301u, 0x1E09u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0300u, 0x1EC1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0301u, 0x1EBFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0303u, 0x1EC5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0309u, 0x1EC3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00EFu, 0x0301u, 0x1E2Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0300u, 0x1ED3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0301u, 0x1ED1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0303u, 0x1ED7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0309u, 0x1ED5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5u, 0x0301u, 0x1E4Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5u, 0x0304u, 0x022Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5u, 0x0308u, 0x1E4Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00F6u, 0x0304u, 0x022Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00F8u, 0x0301u, 0x01FFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x0300u, 0x01DCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x0301u, 0x01D8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x0304u, 0x01D6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x030Cu, 0x01DAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0300u, 0x1EB0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0301u, 0x1EAEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0303u, 0x1EB4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0309u, 0x1EB2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0300u, 0x1EB1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0301u, 0x1EAFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0303u, 0x1EB5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0309u, 0x1EB3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0112u, 0x0300u, 0x1E14u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0112u, 0x0301u, 0x1E16u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0113u, 0x0300u, 0x1E15u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0113u, 0x0301u, 0x1E17u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x014Cu, 0x0300u, 0x1E50u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x014Cu, 0x0301u, 0x1E52u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x014Du, 0x0300u, 0x1E51u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x014Du, 0x0301u, 0x1E53u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x015Au, 0x0307u, 0x1E64u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x015Bu, 0x0307u, 0x1E65u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0160u, 0x0307u, 0x1E66u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0161u, 0x0307u, 0x1E67u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0168u, 0x0301u, 0x1E78u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0169u, 0x0301u, 0x1E79u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x016Au, 0x0308u, 0x1E7Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x016Bu, 0x0308u, 0x1E7Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x017Fu, 0x0307u, 0x1E9Bu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0300u, 0x1EDCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0301u, 0x1EDAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0303u, 0x1EE0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0309u, 0x1EDEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0323u, 0x1EE2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0300u, 0x1EDDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0301u, 0x1EDBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0303u, 0x1EE1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0309u, 0x1EDFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0323u, 0x1EE3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0300u, 0x1EEAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0301u, 0x1EE8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0303u, 0x1EEEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0309u, 0x1EECu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0323u, 0x1EF0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0300u, 0x1EEBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0301u, 0x1EE9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0303u, 0x1EEFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0309u, 0x1EEDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0323u, 0x1EF1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01B7u, 0x030Cu, 0x01EEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01EAu, 0x0304u, 0x01ECu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x01EBu, 0x0304u, 0x01EDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0226u, 0x0304u, 0x01E0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0227u, 0x0304u, 0x01E1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0228u, 0x0306u, 0x1E1Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0229u, 0x0306u, 0x1E1Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x022Eu, 0x0304u, 0x0230u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x022Fu, 0x0304u, 0x0231u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0292u, 0x030Cu, 0x01EFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0308u, 0x0301u, 0x0000u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0300u, 0x1FBAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0301u, 0x0386u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0304u, 0x1FB9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0306u, 0x1FB8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0313u, 0x1F08u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0314u, 0x1F09u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0345u, 0x1FBCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0300u, 0x1FC8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0301u, 0x0388u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0313u, 0x1F18u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0314u, 0x1F19u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0300u, 0x1FCAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0301u, 0x0389u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0313u, 0x1F28u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0314u, 0x1F29u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0345u, 0x1FCCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0300u, 0x1FDAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0301u, 0x038Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0304u, 0x1FD9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0306u, 0x1FD8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0308u, 0x03AAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0313u, 0x1F38u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0314u, 0x1F39u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0300u, 0x1FF8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0301u, 0x038Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0313u, 0x1F48u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0314u, 0x1F49u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A1u, 0x0314u, 0x1FECu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0300u, 0x1FEAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0301u, 0x038Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0304u, 0x1FE9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0306u, 0x1FE8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0308u, 0x03ABu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0314u, 0x1F59u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0300u, 0x1FFAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0301u, 0x038Fu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0313u, 0x1F68u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0314u, 0x1F69u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0345u, 0x1FFCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03ACu, 0x0345u, 0x1FB4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03AEu, 0x0345u, 0x1FC4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0300u, 0x1F70u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0301u, 0x03ACu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0304u, 0x1FB1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0306u, 0x1FB0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0313u, 0x1F00u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0314u, 0x1F01u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0342u, 0x1FB6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0345u, 0x1FB3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0300u, 0x1F72u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0301u, 0x03ADu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0313u, 0x1F10u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0314u, 0x1F11u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0300u, 0x1F74u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0301u, 0x03AEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0313u, 0x1F20u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0314u, 0x1F21u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0342u, 0x1FC6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0345u, 0x1FC3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0300u, 0x1F76u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0301u, 0x03AFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0304u, 0x1FD1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0306u, 0x1FD0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0308u, 0x03CAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0313u, 0x1F30u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0314u, 0x1F31u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0342u, 0x1FD6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0300u, 0x1F78u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0301u, 0x03CCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0313u, 0x1F40u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0314u, 0x1F41u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C1u, 0x0313u, 0x1FE4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C1u, 0x0314u, 0x1FE5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0300u, 0x1F7Au),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0301u, 0x03CDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0304u, 0x1FE1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0306u, 0x1FE0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0308u, 0x03CBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0313u, 0x1F50u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0314u, 0x1F51u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0342u, 0x1FE6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0300u, 0x1F7Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0301u, 0x03CEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0313u, 0x1F60u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0314u, 0x1F61u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0342u, 0x1FF6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0345u, 0x1FF3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03CAu, 0x0300u, 0x1FD2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03CAu, 0x0301u, 0x0390u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03CAu, 0x0342u, 0x1FD7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03CBu, 0x0300u, 0x1FE2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03CBu, 0x0301u, 0x03B0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03CBu, 0x0342u, 0x1FE7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03CEu, 0x0345u, 0x1FF4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03D2u, 0x0301u, 0x03D3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x03D2u, 0x0308u, 0x03D4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0406u, 0x0308u, 0x0407u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0410u, 0x0306u, 0x04D0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0410u, 0x0308u, 0x04D2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0413u, 0x0301u, 0x0403u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0415u, 0x0300u, 0x0400u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0415u, 0x0306u, 0x04D6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0415u, 0x0308u, 0x0401u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0416u, 0x0306u, 0x04C1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0416u, 0x0308u, 0x04DCu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0417u, 0x0308u, 0x04DEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0300u, 0x040Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0304u, 0x04E2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0306u, 0x0419u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0308u, 0x04E4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x041Au, 0x0301u, 0x040Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x041Eu, 0x0308u, 0x04E6u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x0304u, 0x04EEu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x0306u, 0x040Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x0308u, 0x04F0u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x030Bu, 0x04F2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0427u, 0x0308u, 0x04F4u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x042Bu, 0x0308u, 0x04F8u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x042Du, 0x0308u, 0x04ECu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0430u, 0x0306u, 0x04D1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0430u, 0x0308u, 0x04D3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0433u, 0x0301u, 0x0453u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0435u, 0x0300u, 0x0450u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0435u, 0x0306u, 0x04D7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0435u, 0x0308u, 0x0451u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0436u, 0x0306u, 0x04C2u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0436u, 0x0308u, 0x04DDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0437u, 0x0308u, 0x04DFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0300u, 0x045Du),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0304u, 0x04E3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0306u, 0x0439u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0308u, 0x04E5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x043Au, 0x0301u, 0x045Cu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x043Eu, 0x0308u, 0x04E7u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x0304u, 0x04EFu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x0306u, 0x045Eu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x0308u, 0x04F1u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x030Bu, 0x04F3u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0447u, 0x0308u, 0x04F5u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x044Bu, 0x0308u, 0x04F9u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x044Du, 0x0308u, 0x04EDu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0456u, 0x0308u, 0x0457u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0474u, 0x030Fu, 0x0476u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x0475u, 0x030Fu, 0x0477u),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x04D8u, 0x0308u, 0x04DAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x04D9u, 0x0308u, 0x04DBu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x04E8u, 0x0308u, 0x04EAu),
+ HB_CODEPOINT_ENCODE3_11_7_14 (0x04E9u, 0x0308u, 0x04EBu),
+};
+static const uint64_t
+_hb_ucd_dm2_u64_map[387] =
+{
+ HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B8u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D1u, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05D1u, 0x05BFu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D2u, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05D3u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D4u, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05D5u, 0x05B9u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D5u, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05D6u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D8u, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05D9u, 0x05B4u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D9u, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05DAu, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05DBu, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05DBu, 0x05BFu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05DCu, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05DEu, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E0u, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05E1u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E3u, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05E4u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E4u, 0x05BFu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05E6u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E7u, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05E8u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05C1u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05C2u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x05EAu, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05F2u, 0x05B7u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0627u, 0x0653u, 0x0622u), HB_CODEPOINT_ENCODE3 (0x0627u, 0x0654u, 0x0623u),
+ HB_CODEPOINT_ENCODE3 (0x0627u, 0x0655u, 0x0625u), HB_CODEPOINT_ENCODE3 (0x0648u, 0x0654u, 0x0624u),
+ HB_CODEPOINT_ENCODE3 (0x064Au, 0x0654u, 0x0626u), HB_CODEPOINT_ENCODE3 (0x06C1u, 0x0654u, 0x06C2u),
+ HB_CODEPOINT_ENCODE3 (0x06D2u, 0x0654u, 0x06D3u), HB_CODEPOINT_ENCODE3 (0x06D5u, 0x0654u, 0x06C0u),
+ HB_CODEPOINT_ENCODE3 (0x0915u, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0916u, 0x093Cu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0917u, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x091Cu, 0x093Cu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0921u, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0922u, 0x093Cu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0928u, 0x093Cu, 0x0929u), HB_CODEPOINT_ENCODE3 (0x092Bu, 0x093Cu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x092Fu, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0930u, 0x093Cu, 0x0931u),
+ HB_CODEPOINT_ENCODE3 (0x0933u, 0x093Cu, 0x0934u), HB_CODEPOINT_ENCODE3 (0x09A1u, 0x09BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x09A2u, 0x09BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x09AFu, 0x09BCu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x09C7u, 0x09BEu, 0x09CBu), HB_CODEPOINT_ENCODE3 (0x09C7u, 0x09D7u, 0x09CCu),
+ HB_CODEPOINT_ENCODE3 (0x0A16u, 0x0A3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0A17u, 0x0A3Cu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0A1Cu, 0x0A3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0A2Bu, 0x0A3Cu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0A32u, 0x0A3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0A38u, 0x0A3Cu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0B21u, 0x0B3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0B22u, 0x0B3Cu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B3Eu, 0x0B4Bu), HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B56u, 0x0B48u),
+ HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B57u, 0x0B4Cu), HB_CODEPOINT_ENCODE3 (0x0B92u, 0x0BD7u, 0x0B94u),
+ HB_CODEPOINT_ENCODE3 (0x0BC6u, 0x0BBEu, 0x0BCAu), HB_CODEPOINT_ENCODE3 (0x0BC6u, 0x0BD7u, 0x0BCCu),
+ HB_CODEPOINT_ENCODE3 (0x0BC7u, 0x0BBEu, 0x0BCBu), HB_CODEPOINT_ENCODE3 (0x0C46u, 0x0C56u, 0x0C48u),
+ HB_CODEPOINT_ENCODE3 (0x0CBFu, 0x0CD5u, 0x0CC0u), HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CC2u, 0x0CCAu),
+ HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CD5u, 0x0CC7u), HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CD6u, 0x0CC8u),
+ HB_CODEPOINT_ENCODE3 (0x0CCAu, 0x0CD5u, 0x0CCBu), HB_CODEPOINT_ENCODE3 (0x0D46u, 0x0D3Eu, 0x0D4Au),
+ HB_CODEPOINT_ENCODE3 (0x0D46u, 0x0D57u, 0x0D4Cu), HB_CODEPOINT_ENCODE3 (0x0D47u, 0x0D3Eu, 0x0D4Bu),
+ HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DCAu, 0x0DDAu), HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DCFu, 0x0DDCu),
+ HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DDFu, 0x0DDEu), HB_CODEPOINT_ENCODE3 (0x0DDCu, 0x0DCAu, 0x0DDDu),
+ HB_CODEPOINT_ENCODE3 (0x0F40u, 0x0FB5u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F42u, 0x0FB7u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0F4Cu, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F51u, 0x0FB7u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0F56u, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F5Bu, 0x0FB7u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F72u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F74u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F80u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F90u, 0x0FB5u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0F92u, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F9Cu, 0x0FB7u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0FA1u, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0FA6u, 0x0FB7u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0FABu, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0FB2u, 0x0F80u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x0FB3u, 0x0F80u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1025u, 0x102Eu, 0x1026u),
+ HB_CODEPOINT_ENCODE3 (0x1B05u, 0x1B35u, 0x1B06u), HB_CODEPOINT_ENCODE3 (0x1B07u, 0x1B35u, 0x1B08u),
+ HB_CODEPOINT_ENCODE3 (0x1B09u, 0x1B35u, 0x1B0Au), HB_CODEPOINT_ENCODE3 (0x1B0Bu, 0x1B35u, 0x1B0Cu),
+ HB_CODEPOINT_ENCODE3 (0x1B0Du, 0x1B35u, 0x1B0Eu), HB_CODEPOINT_ENCODE3 (0x1B11u, 0x1B35u, 0x1B12u),
+ HB_CODEPOINT_ENCODE3 (0x1B3Au, 0x1B35u, 0x1B3Bu), HB_CODEPOINT_ENCODE3 (0x1B3Cu, 0x1B35u, 0x1B3Du),
+ HB_CODEPOINT_ENCODE3 (0x1B3Eu, 0x1B35u, 0x1B40u), HB_CODEPOINT_ENCODE3 (0x1B3Fu, 0x1B35u, 0x1B41u),
+ HB_CODEPOINT_ENCODE3 (0x1B42u, 0x1B35u, 0x1B43u), HB_CODEPOINT_ENCODE3 (0x1E36u, 0x0304u, 0x1E38u),
+ HB_CODEPOINT_ENCODE3 (0x1E37u, 0x0304u, 0x1E39u), HB_CODEPOINT_ENCODE3 (0x1E5Au, 0x0304u, 0x1E5Cu),
+ HB_CODEPOINT_ENCODE3 (0x1E5Bu, 0x0304u, 0x1E5Du), HB_CODEPOINT_ENCODE3 (0x1E62u, 0x0307u, 0x1E68u),
+ HB_CODEPOINT_ENCODE3 (0x1E63u, 0x0307u, 0x1E69u), HB_CODEPOINT_ENCODE3 (0x1EA0u, 0x0302u, 0x1EACu),
+ HB_CODEPOINT_ENCODE3 (0x1EA0u, 0x0306u, 0x1EB6u), HB_CODEPOINT_ENCODE3 (0x1EA1u, 0x0302u, 0x1EADu),
+ HB_CODEPOINT_ENCODE3 (0x1EA1u, 0x0306u, 0x1EB7u), HB_CODEPOINT_ENCODE3 (0x1EB8u, 0x0302u, 0x1EC6u),
+ HB_CODEPOINT_ENCODE3 (0x1EB9u, 0x0302u, 0x1EC7u), HB_CODEPOINT_ENCODE3 (0x1ECCu, 0x0302u, 0x1ED8u),
+ HB_CODEPOINT_ENCODE3 (0x1ECDu, 0x0302u, 0x1ED9u), HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0300u, 0x1F02u),
+ HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0301u, 0x1F04u), HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0342u, 0x1F06u),
+ HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0345u, 0x1F80u), HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0300u, 0x1F03u),
+ HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0301u, 0x1F05u), HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0342u, 0x1F07u),
+ HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0345u, 0x1F81u), HB_CODEPOINT_ENCODE3 (0x1F02u, 0x0345u, 0x1F82u),
+ HB_CODEPOINT_ENCODE3 (0x1F03u, 0x0345u, 0x1F83u), HB_CODEPOINT_ENCODE3 (0x1F04u, 0x0345u, 0x1F84u),
+ HB_CODEPOINT_ENCODE3 (0x1F05u, 0x0345u, 0x1F85u), HB_CODEPOINT_ENCODE3 (0x1F06u, 0x0345u, 0x1F86u),
+ HB_CODEPOINT_ENCODE3 (0x1F07u, 0x0345u, 0x1F87u), HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0300u, 0x1F0Au),
+ HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0301u, 0x1F0Cu), HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0342u, 0x1F0Eu),
+ HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0345u, 0x1F88u), HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0300u, 0x1F0Bu),
+ HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0301u, 0x1F0Du), HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0342u, 0x1F0Fu),
+ HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0345u, 0x1F89u), HB_CODEPOINT_ENCODE3 (0x1F0Au, 0x0345u, 0x1F8Au),
+ HB_CODEPOINT_ENCODE3 (0x1F0Bu, 0x0345u, 0x1F8Bu), HB_CODEPOINT_ENCODE3 (0x1F0Cu, 0x0345u, 0x1F8Cu),
+ HB_CODEPOINT_ENCODE3 (0x1F0Du, 0x0345u, 0x1F8Du), HB_CODEPOINT_ENCODE3 (0x1F0Eu, 0x0345u, 0x1F8Eu),
+ HB_CODEPOINT_ENCODE3 (0x1F0Fu, 0x0345u, 0x1F8Fu), HB_CODEPOINT_ENCODE3 (0x1F10u, 0x0300u, 0x1F12u),
+ HB_CODEPOINT_ENCODE3 (0x1F10u, 0x0301u, 0x1F14u), HB_CODEPOINT_ENCODE3 (0x1F11u, 0x0300u, 0x1F13u),
+ HB_CODEPOINT_ENCODE3 (0x1F11u, 0x0301u, 0x1F15u), HB_CODEPOINT_ENCODE3 (0x1F18u, 0x0300u, 0x1F1Au),
+ HB_CODEPOINT_ENCODE3 (0x1F18u, 0x0301u, 0x1F1Cu), HB_CODEPOINT_ENCODE3 (0x1F19u, 0x0300u, 0x1F1Bu),
+ HB_CODEPOINT_ENCODE3 (0x1F19u, 0x0301u, 0x1F1Du), HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0300u, 0x1F22u),
+ HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0301u, 0x1F24u), HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0342u, 0x1F26u),
+ HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0345u, 0x1F90u), HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0300u, 0x1F23u),
+ HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0301u, 0x1F25u), HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0342u, 0x1F27u),
+ HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0345u, 0x1F91u), HB_CODEPOINT_ENCODE3 (0x1F22u, 0x0345u, 0x1F92u),
+ HB_CODEPOINT_ENCODE3 (0x1F23u, 0x0345u, 0x1F93u), HB_CODEPOINT_ENCODE3 (0x1F24u, 0x0345u, 0x1F94u),
+ HB_CODEPOINT_ENCODE3 (0x1F25u, 0x0345u, 0x1F95u), HB_CODEPOINT_ENCODE3 (0x1F26u, 0x0345u, 0x1F96u),
+ HB_CODEPOINT_ENCODE3 (0x1F27u, 0x0345u, 0x1F97u), HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0300u, 0x1F2Au),
+ HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0301u, 0x1F2Cu), HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0342u, 0x1F2Eu),
+ HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0345u, 0x1F98u), HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0300u, 0x1F2Bu),
+ HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0301u, 0x1F2Du), HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0342u, 0x1F2Fu),
+ HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0345u, 0x1F99u), HB_CODEPOINT_ENCODE3 (0x1F2Au, 0x0345u, 0x1F9Au),
+ HB_CODEPOINT_ENCODE3 (0x1F2Bu, 0x0345u, 0x1F9Bu), HB_CODEPOINT_ENCODE3 (0x1F2Cu, 0x0345u, 0x1F9Cu),
+ HB_CODEPOINT_ENCODE3 (0x1F2Du, 0x0345u, 0x1F9Du), HB_CODEPOINT_ENCODE3 (0x1F2Eu, 0x0345u, 0x1F9Eu),
+ HB_CODEPOINT_ENCODE3 (0x1F2Fu, 0x0345u, 0x1F9Fu), HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0300u, 0x1F32u),
+ HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0301u, 0x1F34u), HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0342u, 0x1F36u),
+ HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0300u, 0x1F33u), HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0301u, 0x1F35u),
+ HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0342u, 0x1F37u), HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0300u, 0x1F3Au),
+ HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0301u, 0x1F3Cu), HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0342u, 0x1F3Eu),
+ HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0300u, 0x1F3Bu), HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0301u, 0x1F3Du),
+ HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0342u, 0x1F3Fu), HB_CODEPOINT_ENCODE3 (0x1F40u, 0x0300u, 0x1F42u),
+ HB_CODEPOINT_ENCODE3 (0x1F40u, 0x0301u, 0x1F44u), HB_CODEPOINT_ENCODE3 (0x1F41u, 0x0300u, 0x1F43u),
+ HB_CODEPOINT_ENCODE3 (0x1F41u, 0x0301u, 0x1F45u), HB_CODEPOINT_ENCODE3 (0x1F48u, 0x0300u, 0x1F4Au),
+ HB_CODEPOINT_ENCODE3 (0x1F48u, 0x0301u, 0x1F4Cu), HB_CODEPOINT_ENCODE3 (0x1F49u, 0x0300u, 0x1F4Bu),
+ HB_CODEPOINT_ENCODE3 (0x1F49u, 0x0301u, 0x1F4Du), HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0300u, 0x1F52u),
+ HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0301u, 0x1F54u), HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0342u, 0x1F56u),
+ HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0300u, 0x1F53u), HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0301u, 0x1F55u),
+ HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0342u, 0x1F57u), HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0300u, 0x1F5Bu),
+ HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0301u, 0x1F5Du), HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0342u, 0x1F5Fu),
+ HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0300u, 0x1F62u), HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0301u, 0x1F64u),
+ HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0342u, 0x1F66u), HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0345u, 0x1FA0u),
+ HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0300u, 0x1F63u), HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0301u, 0x1F65u),
+ HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0342u, 0x1F67u), HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0345u, 0x1FA1u),
+ HB_CODEPOINT_ENCODE3 (0x1F62u, 0x0345u, 0x1FA2u), HB_CODEPOINT_ENCODE3 (0x1F63u, 0x0345u, 0x1FA3u),
+ HB_CODEPOINT_ENCODE3 (0x1F64u, 0x0345u, 0x1FA4u), HB_CODEPOINT_ENCODE3 (0x1F65u, 0x0345u, 0x1FA5u),
+ HB_CODEPOINT_ENCODE3 (0x1F66u, 0x0345u, 0x1FA6u), HB_CODEPOINT_ENCODE3 (0x1F67u, 0x0345u, 0x1FA7u),
+ HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0300u, 0x1F6Au), HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0301u, 0x1F6Cu),
+ HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0342u, 0x1F6Eu), HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0345u, 0x1FA8u),
+ HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0300u, 0x1F6Bu), HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0301u, 0x1F6Du),
+ HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0342u, 0x1F6Fu), HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0345u, 0x1FA9u),
+ HB_CODEPOINT_ENCODE3 (0x1F6Au, 0x0345u, 0x1FAAu), HB_CODEPOINT_ENCODE3 (0x1F6Bu, 0x0345u, 0x1FABu),
+ HB_CODEPOINT_ENCODE3 (0x1F6Cu, 0x0345u, 0x1FACu), HB_CODEPOINT_ENCODE3 (0x1F6Du, 0x0345u, 0x1FADu),
+ HB_CODEPOINT_ENCODE3 (0x1F6Eu, 0x0345u, 0x1FAEu), HB_CODEPOINT_ENCODE3 (0x1F6Fu, 0x0345u, 0x1FAFu),
+ HB_CODEPOINT_ENCODE3 (0x1F70u, 0x0345u, 0x1FB2u), HB_CODEPOINT_ENCODE3 (0x1F74u, 0x0345u, 0x1FC2u),
+ HB_CODEPOINT_ENCODE3 (0x1F7Cu, 0x0345u, 0x1FF2u), HB_CODEPOINT_ENCODE3 (0x1FB6u, 0x0345u, 0x1FB7u),
+ HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0300u, 0x1FCDu), HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0301u, 0x1FCEu),
+ HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0342u, 0x1FCFu), HB_CODEPOINT_ENCODE3 (0x1FC6u, 0x0345u, 0x1FC7u),
+ HB_CODEPOINT_ENCODE3 (0x1FF6u, 0x0345u, 0x1FF7u), HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0300u, 0x1FDDu),
+ HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0301u, 0x1FDEu), HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0342u, 0x1FDFu),
+ HB_CODEPOINT_ENCODE3 (0x2190u, 0x0338u, 0x219Au), HB_CODEPOINT_ENCODE3 (0x2192u, 0x0338u, 0x219Bu),
+ HB_CODEPOINT_ENCODE3 (0x2194u, 0x0338u, 0x21AEu), HB_CODEPOINT_ENCODE3 (0x21D0u, 0x0338u, 0x21CDu),
+ HB_CODEPOINT_ENCODE3 (0x21D2u, 0x0338u, 0x21CFu), HB_CODEPOINT_ENCODE3 (0x21D4u, 0x0338u, 0x21CEu),
+ HB_CODEPOINT_ENCODE3 (0x2203u, 0x0338u, 0x2204u), HB_CODEPOINT_ENCODE3 (0x2208u, 0x0338u, 0x2209u),
+ HB_CODEPOINT_ENCODE3 (0x220Bu, 0x0338u, 0x220Cu), HB_CODEPOINT_ENCODE3 (0x2223u, 0x0338u, 0x2224u),
+ HB_CODEPOINT_ENCODE3 (0x2225u, 0x0338u, 0x2226u), HB_CODEPOINT_ENCODE3 (0x223Cu, 0x0338u, 0x2241u),
+ HB_CODEPOINT_ENCODE3 (0x2243u, 0x0338u, 0x2244u), HB_CODEPOINT_ENCODE3 (0x2245u, 0x0338u, 0x2247u),
+ HB_CODEPOINT_ENCODE3 (0x2248u, 0x0338u, 0x2249u), HB_CODEPOINT_ENCODE3 (0x224Du, 0x0338u, 0x226Du),
+ HB_CODEPOINT_ENCODE3 (0x2261u, 0x0338u, 0x2262u), HB_CODEPOINT_ENCODE3 (0x2264u, 0x0338u, 0x2270u),
+ HB_CODEPOINT_ENCODE3 (0x2265u, 0x0338u, 0x2271u), HB_CODEPOINT_ENCODE3 (0x2272u, 0x0338u, 0x2274u),
+ HB_CODEPOINT_ENCODE3 (0x2273u, 0x0338u, 0x2275u), HB_CODEPOINT_ENCODE3 (0x2276u, 0x0338u, 0x2278u),
+ HB_CODEPOINT_ENCODE3 (0x2277u, 0x0338u, 0x2279u), HB_CODEPOINT_ENCODE3 (0x227Au, 0x0338u, 0x2280u),
+ HB_CODEPOINT_ENCODE3 (0x227Bu, 0x0338u, 0x2281u), HB_CODEPOINT_ENCODE3 (0x227Cu, 0x0338u, 0x22E0u),
+ HB_CODEPOINT_ENCODE3 (0x227Du, 0x0338u, 0x22E1u), HB_CODEPOINT_ENCODE3 (0x2282u, 0x0338u, 0x2284u),
+ HB_CODEPOINT_ENCODE3 (0x2283u, 0x0338u, 0x2285u), HB_CODEPOINT_ENCODE3 (0x2286u, 0x0338u, 0x2288u),
+ HB_CODEPOINT_ENCODE3 (0x2287u, 0x0338u, 0x2289u), HB_CODEPOINT_ENCODE3 (0x2291u, 0x0338u, 0x22E2u),
+ HB_CODEPOINT_ENCODE3 (0x2292u, 0x0338u, 0x22E3u), HB_CODEPOINT_ENCODE3 (0x22A2u, 0x0338u, 0x22ACu),
+ HB_CODEPOINT_ENCODE3 (0x22A8u, 0x0338u, 0x22ADu), HB_CODEPOINT_ENCODE3 (0x22A9u, 0x0338u, 0x22AEu),
+ HB_CODEPOINT_ENCODE3 (0x22ABu, 0x0338u, 0x22AFu), HB_CODEPOINT_ENCODE3 (0x22B2u, 0x0338u, 0x22EAu),
+ HB_CODEPOINT_ENCODE3 (0x22B3u, 0x0338u, 0x22EBu), HB_CODEPOINT_ENCODE3 (0x22B4u, 0x0338u, 0x22ECu),
+ HB_CODEPOINT_ENCODE3 (0x22B5u, 0x0338u, 0x22EDu), HB_CODEPOINT_ENCODE3 (0x2ADDu, 0x0338u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x3046u, 0x3099u, 0x3094u), HB_CODEPOINT_ENCODE3 (0x304Bu, 0x3099u, 0x304Cu),
+ HB_CODEPOINT_ENCODE3 (0x304Du, 0x3099u, 0x304Eu), HB_CODEPOINT_ENCODE3 (0x304Fu, 0x3099u, 0x3050u),
+ HB_CODEPOINT_ENCODE3 (0x3051u, 0x3099u, 0x3052u), HB_CODEPOINT_ENCODE3 (0x3053u, 0x3099u, 0x3054u),
+ HB_CODEPOINT_ENCODE3 (0x3055u, 0x3099u, 0x3056u), HB_CODEPOINT_ENCODE3 (0x3057u, 0x3099u, 0x3058u),
+ HB_CODEPOINT_ENCODE3 (0x3059u, 0x3099u, 0x305Au), HB_CODEPOINT_ENCODE3 (0x305Bu, 0x3099u, 0x305Cu),
+ HB_CODEPOINT_ENCODE3 (0x305Du, 0x3099u, 0x305Eu), HB_CODEPOINT_ENCODE3 (0x305Fu, 0x3099u, 0x3060u),
+ HB_CODEPOINT_ENCODE3 (0x3061u, 0x3099u, 0x3062u), HB_CODEPOINT_ENCODE3 (0x3064u, 0x3099u, 0x3065u),
+ HB_CODEPOINT_ENCODE3 (0x3066u, 0x3099u, 0x3067u), HB_CODEPOINT_ENCODE3 (0x3068u, 0x3099u, 0x3069u),
+ HB_CODEPOINT_ENCODE3 (0x306Fu, 0x3099u, 0x3070u), HB_CODEPOINT_ENCODE3 (0x306Fu, 0x309Au, 0x3071u),
+ HB_CODEPOINT_ENCODE3 (0x3072u, 0x3099u, 0x3073u), HB_CODEPOINT_ENCODE3 (0x3072u, 0x309Au, 0x3074u),
+ HB_CODEPOINT_ENCODE3 (0x3075u, 0x3099u, 0x3076u), HB_CODEPOINT_ENCODE3 (0x3075u, 0x309Au, 0x3077u),
+ HB_CODEPOINT_ENCODE3 (0x3078u, 0x3099u, 0x3079u), HB_CODEPOINT_ENCODE3 (0x3078u, 0x309Au, 0x307Au),
+ HB_CODEPOINT_ENCODE3 (0x307Bu, 0x3099u, 0x307Cu), HB_CODEPOINT_ENCODE3 (0x307Bu, 0x309Au, 0x307Du),
+ HB_CODEPOINT_ENCODE3 (0x309Du, 0x3099u, 0x309Eu), HB_CODEPOINT_ENCODE3 (0x30A6u, 0x3099u, 0x30F4u),
+ HB_CODEPOINT_ENCODE3 (0x30ABu, 0x3099u, 0x30ACu), HB_CODEPOINT_ENCODE3 (0x30ADu, 0x3099u, 0x30AEu),
+ HB_CODEPOINT_ENCODE3 (0x30AFu, 0x3099u, 0x30B0u), HB_CODEPOINT_ENCODE3 (0x30B1u, 0x3099u, 0x30B2u),
+ HB_CODEPOINT_ENCODE3 (0x30B3u, 0x3099u, 0x30B4u), HB_CODEPOINT_ENCODE3 (0x30B5u, 0x3099u, 0x30B6u),
+ HB_CODEPOINT_ENCODE3 (0x30B7u, 0x3099u, 0x30B8u), HB_CODEPOINT_ENCODE3 (0x30B9u, 0x3099u, 0x30BAu),
+ HB_CODEPOINT_ENCODE3 (0x30BBu, 0x3099u, 0x30BCu), HB_CODEPOINT_ENCODE3 (0x30BDu, 0x3099u, 0x30BEu),
+ HB_CODEPOINT_ENCODE3 (0x30BFu, 0x3099u, 0x30C0u), HB_CODEPOINT_ENCODE3 (0x30C1u, 0x3099u, 0x30C2u),
+ HB_CODEPOINT_ENCODE3 (0x30C4u, 0x3099u, 0x30C5u), HB_CODEPOINT_ENCODE3 (0x30C6u, 0x3099u, 0x30C7u),
+ HB_CODEPOINT_ENCODE3 (0x30C8u, 0x3099u, 0x30C9u), HB_CODEPOINT_ENCODE3 (0x30CFu, 0x3099u, 0x30D0u),
+ HB_CODEPOINT_ENCODE3 (0x30CFu, 0x309Au, 0x30D1u), HB_CODEPOINT_ENCODE3 (0x30D2u, 0x3099u, 0x30D3u),
+ HB_CODEPOINT_ENCODE3 (0x30D2u, 0x309Au, 0x30D4u), HB_CODEPOINT_ENCODE3 (0x30D5u, 0x3099u, 0x30D6u),
+ HB_CODEPOINT_ENCODE3 (0x30D5u, 0x309Au, 0x30D7u), HB_CODEPOINT_ENCODE3 (0x30D8u, 0x3099u, 0x30D9u),
+ HB_CODEPOINT_ENCODE3 (0x30D8u, 0x309Au, 0x30DAu), HB_CODEPOINT_ENCODE3 (0x30DBu, 0x3099u, 0x30DCu),
+ HB_CODEPOINT_ENCODE3 (0x30DBu, 0x309Au, 0x30DDu), HB_CODEPOINT_ENCODE3 (0x30EFu, 0x3099u, 0x30F7u),
+ HB_CODEPOINT_ENCODE3 (0x30F0u, 0x3099u, 0x30F8u), HB_CODEPOINT_ENCODE3 (0x30F1u, 0x3099u, 0x30F9u),
+ HB_CODEPOINT_ENCODE3 (0x30F2u, 0x3099u, 0x30FAu), HB_CODEPOINT_ENCODE3 (0x30FDu, 0x3099u, 0x30FEu),
+ HB_CODEPOINT_ENCODE3 (0xFB49u, 0x05C1u, 0x0000u), HB_CODEPOINT_ENCODE3 (0xFB49u, 0x05C2u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x11099u, 0x110BAu, 0x1109Au),HB_CODEPOINT_ENCODE3 (0x1109Bu, 0x110BAu, 0x1109Cu),
+ HB_CODEPOINT_ENCODE3 (0x110A5u, 0x110BAu, 0x110ABu),HB_CODEPOINT_ENCODE3 (0x11131u, 0x11127u, 0x1112Eu),
+ HB_CODEPOINT_ENCODE3 (0x11132u, 0x11127u, 0x1112Fu),HB_CODEPOINT_ENCODE3 (0x11347u, 0x1133Eu, 0x1134Bu),
+ HB_CODEPOINT_ENCODE3 (0x11347u, 0x11357u, 0x1134Cu),HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114B0u, 0x114BCu),
+ HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114BAu, 0x114BBu),HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114BDu, 0x114BEu),
+ HB_CODEPOINT_ENCODE3 (0x115B8u, 0x115AFu, 0x115BAu),HB_CODEPOINT_ENCODE3 (0x115B9u, 0x115AFu, 0x115BBu),
+ HB_CODEPOINT_ENCODE3 (0x1D157u, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D158u, 0x1D165u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Eu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Fu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D170u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D171u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D172u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1B9u, 0x1D165u, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x1D1BAu, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Eu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Fu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Eu, 0x0000u),
+ HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Fu, 0x0000u),
+};
+
+#ifndef HB_OPTIMIZE_SIZE
+
+static const uint8_t
+_hb_ucd_u8[32102] =
+{
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 28,
+ 29, 26, 30, 31, 32, 33, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 34, 35, 35, 35, 35,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ 26, 57, 58, 59, 59, 59, 59, 59, 26, 26, 60, 59, 59, 59, 59, 59,
+ 59, 59, 26, 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 26, 62, 59, 63, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 64, 26, 65, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 66, 67, 59, 59, 59, 59, 68, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 69, 70, 71, 72, 73, 74, 59, 59,
+ 75, 76, 59, 59, 77, 59, 78, 79, 80, 81, 73, 82, 83, 84, 59, 59,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 85, 26, 26, 26, 26, 26, 26, 26, 86, 87, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 88, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 89, 59, 59, 59, 59, 59, 59, 26, 90, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 91, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 93,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 29, 21, 21, 21, 23, 21, 21, 21, 22, 18, 21, 25, 21, 17, 21, 21,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 25, 25, 25, 21,
+ 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 21, 18, 24, 16,
+ 24, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 25, 18, 25, 0,
+ 29, 21, 23, 23, 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24,
+ 26, 25, 15, 15, 24, 5, 21, 21, 24, 15, 7, 19, 15, 15, 15, 21,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 25, 9, 9, 9, 9, 9, 9, 9, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 5, 5,
+ 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
+ 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9,
+ 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5,
+ 9, 5, 9, 5, 9, 5, 9, 5, 9, 9, 5, 9, 5, 9, 5, 5,
+ 5, 9, 9, 5, 9, 5, 9, 9, 5, 9, 9, 9, 5, 5, 9, 9,
+ 9, 9, 5, 9, 9, 5, 9, 9, 9, 5, 5, 5, 9, 9, 5, 9,
+ 9, 5, 9, 5, 9, 5, 9, 9, 5, 9, 5, 5, 9, 5, 9, 9,
+ 5, 9, 9, 9, 5, 9, 5, 9, 9, 5, 5, 7, 9, 5, 5, 5,
+ 7, 7, 7, 7, 9, 8, 5, 9, 8, 5, 9, 8, 5, 9, 5, 9,
+ 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5,
+ 5, 9, 8, 5, 9, 5, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5,
+ 9, 5, 9, 5, 5, 5, 5, 5, 5, 5, 9, 9, 5, 9, 9, 5,
+ 5, 9, 5, 9, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
+ 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 24, 24, 24, 24, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 6, 6, 6, 6, 6, 24, 24, 24, 24, 24, 24, 24, 6, 24, 6, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 9, 5, 9, 5, 6, 24, 9, 5, 2, 2, 6, 5, 5, 5, 21, 9,
+ 2, 2, 2, 2, 24, 24, 9, 21, 9, 9, 9, 2, 9, 2, 9, 9,
+ 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9,
+ 5, 5, 9, 9, 9, 5, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5,
+ 5, 5, 5, 5, 9, 5, 25, 9, 5, 9, 9, 5, 5, 9, 9, 9,
+ 9, 5, 26, 12, 12, 12, 12, 12, 11, 11, 9, 5, 9, 5, 9, 5,
+ 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 5,
+ 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 2, 2, 6, 21, 21, 21, 21, 21, 21,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 17, 2, 2, 26, 26, 23,
+ 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 17, 12,
+ 21, 12, 12, 21, 12, 12, 21, 12, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7,
+ 7, 7, 7, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 25, 25, 25, 21, 21, 23, 21, 21, 26, 26,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 21, 1, 2, 21, 21,
+ 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 7, 7,
+ 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 21, 7, 12, 12, 12, 12, 12, 12, 12, 1, 26, 12,
+ 12, 12, 12, 12, 12, 6, 6, 12, 12, 26, 12, 12, 12, 12, 7, 7,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 26, 26, 7,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 1,
+ 7, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 6, 6, 26, 21, 21, 21, 6, 2, 2, 12, 23, 23,
+ 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 6, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 6, 12, 12, 12, 6, 12, 12, 12, 12, 12, 2, 2,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 2, 2, 21, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2,
+ 2, 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 12, 7, 10, 10,
+ 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 12, 10, 10,
+ 7, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 12, 12, 21, 21, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 21, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7,
+ 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7,
+ 7, 2, 7, 2, 2, 2, 7, 7, 7, 7, 2, 2, 12, 7, 10, 10,
+ 10, 12, 12, 12, 12, 2, 2, 10, 10, 2, 2, 10, 10, 12, 7, 2,
+ 2, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 7, 7, 2, 7,
+ 7, 7, 12, 12, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 7, 7, 23, 23, 15, 15, 15, 15, 15, 15, 26, 23, 7, 21, 12, 2,
+ 2, 12, 12, 10, 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7,
+ 7, 2, 7, 7, 2, 7, 7, 2, 7, 7, 2, 2, 12, 2, 10, 10,
+ 10, 12, 12, 2, 2, 2, 2, 12, 12, 2, 2, 12, 12, 12, 2, 2,
+ 2, 12, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 2, 7, 2,
+ 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 12, 12, 7, 7, 7, 12, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 12, 12, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7,
+ 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 10,
+ 10, 12, 12, 12, 12, 12, 2, 12, 12, 10, 2, 10, 10, 12, 2, 2,
+ 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 21, 23, 2, 2, 2, 2, 2, 2, 2, 7, 12, 12, 12, 12, 12, 12,
+ 2, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7,
+ 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 12,
+ 10, 12, 12, 12, 12, 2, 2, 10, 10, 2, 2, 10, 10, 12, 2, 2,
+ 2, 2, 2, 2, 2, 2, 12, 10, 2, 2, 2, 2, 7, 7, 2, 7,
+ 26, 7, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 12, 7, 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 7, 7,
+ 7, 2, 7, 7, 7, 7, 2, 2, 2, 7, 7, 2, 7, 2, 7, 7,
+ 2, 2, 2, 7, 7, 2, 2, 2, 7, 7, 7, 2, 2, 2, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 10, 10,
+ 12, 10, 10, 2, 2, 2, 10, 10, 10, 2, 10, 10, 10, 12, 2, 2,
+ 7, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2,
+ 15, 15, 15, 26, 26, 26, 26, 26, 26, 23, 26, 2, 2, 2, 2, 2,
+ 12, 10, 10, 10, 12, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7,
+ 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 7, 12, 12,
+ 12, 10, 10, 10, 10, 2, 12, 12, 12, 2, 12, 12, 12, 12, 2, 2,
+ 2, 2, 2, 2, 2, 12, 12, 2, 7, 7, 7, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 21, 15, 15, 15, 15, 15, 15, 15, 26,
+ 7, 12, 10, 10, 21, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7,
+ 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 12,
+ 10, 10, 10, 10, 10, 2, 12, 10, 10, 2, 10, 10, 12, 12, 2, 2,
+ 2, 2, 2, 2, 2, 10, 10, 2, 2, 2, 2, 2, 2, 2, 7, 2,
+ 2, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 12, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 7, 10, 10,
+ 10, 12, 12, 12, 12, 2, 10, 10, 10, 2, 10, 10, 10, 12, 7, 26,
+ 2, 2, 2, 2, 7, 7, 7, 10, 15, 15, 15, 15, 15, 15, 15, 7,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 7, 7, 7, 7, 7, 7,
+ 2, 2, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 7, 7, 7, 7, 7, 7,
+ 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 12, 2, 2, 2, 2, 10,
+ 10, 10, 12, 12, 12, 2, 12, 2, 10, 10, 10, 10, 10, 10, 10, 10,
+ 2, 2, 10, 10, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 12, 7, 7, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 23,
+ 7, 7, 7, 7, 7, 7, 6, 12, 12, 12, 12, 12, 12, 12, 12, 21,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 2, 2, 2, 2,
+ 2, 7, 7, 2, 7, 2, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7,
+ 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 12, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 2, 2,
+ 7, 7, 7, 7, 7, 2, 6, 2, 12, 12, 12, 12, 12, 12, 2, 2,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 7, 7, 7, 7,
+ 7, 26, 26, 26, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 26, 21, 26, 26, 26, 12, 12, 26, 26, 26, 26, 26, 26,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 26, 12, 26, 12, 26, 12, 22, 18, 22, 18, 10, 10,
+ 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2,
+ 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10,
+ 12, 12, 12, 12, 12, 21, 12, 12, 7, 7, 7, 7, 7, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 26, 26,
+ 26, 26, 26, 26, 26, 26, 12, 26, 26, 26, 26, 26, 26, 2, 26, 26,
+ 21, 21, 21, 21, 21, 26, 26, 26, 26, 21, 21, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 12, 12, 12,
+ 12, 10, 12, 12, 12, 12, 12, 12, 10, 12, 12, 10, 10, 12, 12, 7,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 21, 21,
+ 7, 7, 7, 7, 7, 7, 10, 10, 12, 12, 7, 7, 7, 7, 12, 12,
+ 12, 7, 10, 10, 10, 7, 7, 10, 10, 10, 10, 10, 10, 10, 7, 7,
+ 7, 12, 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 12, 10, 10, 12, 12, 10, 10, 10, 10, 10, 10, 12, 7, 10,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 12, 26, 26,
+ 9, 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, 2, 2, 9, 2, 2,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 6, 5, 5, 5,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 2, 2,
+ 7, 2, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 2,
+ 7, 2, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 12,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2,
+ 9, 9, 9, 9, 9, 9, 2, 2, 5, 5, 5, 5, 5, 5, 2, 2,
+ 17, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 26, 21, 7,
+ 29, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 22, 18, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 21, 21, 14, 14,
+ 14, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7,
+ 7, 7, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 12, 12, 12, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 2, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 12, 12, 10, 12, 12, 12, 12, 12, 12, 12, 10, 10,
+ 10, 10, 10, 10, 10, 10, 12, 10, 10, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 21, 21, 21, 6, 21, 21, 21, 23, 7, 12, 2, 2,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2,
+ 21, 21, 21, 21, 21, 21, 17, 21, 21, 21, 21, 12, 12, 12, 1, 2,
+ 7, 7, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 7, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2,
+ 12, 12, 12, 10, 10, 10, 10, 12, 12, 10, 10, 10, 2, 2, 2, 2,
+ 10, 10, 12, 10, 10, 10, 10, 10, 10, 12, 12, 12, 2, 2, 2, 2,
+ 26, 2, 2, 2, 21, 21, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2,
+ 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 2, 2, 2, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 7, 7, 7, 7, 7, 7, 7, 12, 12, 10, 10, 12, 2, 2, 21, 21,
+ 7, 7, 7, 7, 7, 10, 12, 10, 12, 12, 12, 12, 12, 12, 12, 2,
+ 12, 10, 12, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10,
+ 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 12,
+ 21, 21, 21, 21, 21, 21, 21, 6, 21, 21, 21, 21, 21, 21, 2, 2,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 2,
+ 12, 12, 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 12, 10, 12, 12, 12, 12, 12, 10, 12, 10, 10, 10,
+ 10, 10, 12, 10, 10, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2,
+ 21, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2,
+ 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 10, 12, 12, 12, 12, 10, 10, 12, 12, 10, 12, 12, 12, 7, 7,
+ 7, 7, 7, 7, 7, 7, 12, 10, 12, 12, 10, 10, 10, 12, 10, 12,
+ 12, 12, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21,
+ 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 12, 12,
+ 12, 12, 12, 12, 10, 10, 12, 12, 2, 2, 2, 21, 21, 21, 21, 21,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 21, 21,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9,
+ 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2,
+ 12, 12, 12, 21, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 10, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 12, 7, 7,
+ 7, 7, 7, 7, 12, 7, 7, 10, 12, 12, 7, 2, 2, 2, 2, 2,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12,
+ 9, 5, 9, 5, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9,
+ 5, 5, 5, 5, 5, 5, 2, 2, 9, 9, 9, 9, 9, 9, 2, 2,
+ 5, 5, 5, 5, 5, 5, 5, 5, 2, 9, 2, 9, 2, 9, 2, 9,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2,
+ 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8,
+ 5, 5, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 5, 24,
+ 24, 24, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 24, 24,
+ 5, 5, 5, 5, 2, 2, 5, 5, 9, 9, 9, 9, 2, 24, 24, 24,
+ 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 24, 24, 24,
+ 2, 2, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 24, 2,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 1, 1, 1, 1, 1,
+ 17, 17, 17, 17, 17, 17, 21, 21, 20, 19, 22, 20, 20, 19, 22, 20,
+ 21, 21, 21, 21, 21, 21, 21, 21, 27, 28, 1, 1, 1, 1, 1, 29,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 19, 21, 21, 21, 21, 16,
+ 16, 21, 21, 21, 25, 22, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 25, 21, 16, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 29,
+ 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 15, 6, 2, 2, 15, 15, 15, 15, 15, 15, 25, 25, 25, 22, 18, 6,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 25, 25, 25, 22, 18, 2,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11,
+ 11, 12, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 26, 9, 26, 26, 26, 26, 9, 26, 26, 5, 9, 9, 9, 5, 5,
+ 9, 9, 9, 5, 26, 9, 26, 26, 25, 9, 9, 9, 9, 9, 26, 26,
+ 26, 26, 26, 26, 9, 26, 9, 26, 9, 26, 9, 9, 9, 9, 26, 5,
+ 9, 9, 9, 9, 5, 7, 7, 7, 7, 5, 26, 26, 5, 5, 9, 9,
+ 25, 25, 25, 25, 25, 9, 5, 5, 5, 5, 26, 25, 26, 26, 5, 26,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 9, 5, 14, 14, 14, 14, 15, 26, 26, 2, 2, 2, 2,
+ 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 25, 25, 26, 26, 26, 26,
+ 25, 26, 26, 25, 26, 26, 25, 26, 26, 26, 26, 26, 26, 26, 25, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25,
+ 26, 26, 25, 26, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 26, 26, 26, 26, 26, 26, 26, 26, 22, 18, 22, 18, 26, 26, 26, 26,
+ 25, 25, 26, 26, 26, 26, 26, 26, 26, 22, 18, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25,
+ 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 15, 15, 15, 15,
+ 26, 26, 26, 26, 26, 26, 26, 25, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25,
+ 26, 26, 26, 26, 26, 26, 26, 26, 22, 18, 22, 18, 22, 18, 22, 18,
+ 22, 18, 22, 18, 22, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 25, 25, 25, 25, 25, 22, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18,
+ 25, 25, 25, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22,
+ 18, 22, 18, 22, 18, 22, 18, 22, 18, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 22, 18, 22, 18, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 22, 18, 25, 25,
+ 25, 25, 25, 25, 25, 26, 26, 25, 25, 25, 25, 25, 25, 26, 26, 26,
+ 26, 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2,
+ 9, 5, 9, 9, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9, 9, 9,
+ 9, 5, 9, 5, 5, 9, 5, 5, 5, 5, 5, 5, 6, 6, 9, 9,
+ 9, 5, 9, 5, 5, 26, 26, 26, 26, 26, 26, 9, 5, 9, 5, 12,
+ 12, 12, 9, 5, 2, 2, 2, 2, 2, 21, 21, 21, 21, 15, 21, 21,
+ 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 2, 2, 5, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 6,
+ 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12,
+ 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 2,
+ 21, 21, 20, 19, 20, 19, 21, 21, 21, 20, 19, 21, 20, 19, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 17, 21, 21, 17, 21, 20, 19, 21, 21,
+ 20, 19, 22, 18, 22, 18, 22, 18, 22, 18, 21, 21, 21, 21, 21, 6,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 17, 17, 21, 21, 21, 21,
+ 17, 21, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2,
+ 29, 21, 21, 21, 26, 6, 7, 14, 22, 18, 22, 18, 22, 18, 22, 18,
+ 22, 18, 26, 26, 22, 18, 22, 18, 22, 18, 22, 18, 17, 22, 18, 18,
+ 26, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 10, 10,
+ 17, 6, 6, 6, 6, 6, 26, 26, 14, 14, 14, 6, 7, 21, 26, 26,
+ 7, 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 24, 24, 6, 6, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 6, 6, 6, 7,
+ 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 26, 26, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 15, 15, 15, 15, 15, 15,
+ 26, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 7, 7, 7, 7, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 21, 21, 21,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 2, 2, 2, 2,
+ 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 7, 12,
+ 11, 11, 11, 21, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 21, 6,
+ 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 6, 6, 12, 12,
+ 7, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 12, 12, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2,
+ 24, 24, 24, 24, 24, 24, 24, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 24, 24, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
+ 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
+ 6, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, 9, 5, 9, 9, 5,
+ 9, 5, 9, 5, 9, 5, 9, 5, 6, 24, 24, 9, 5, 9, 5, 7,
+ 9, 5, 9, 5, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
+ 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 9, 9, 9, 9, 5,
+ 9, 9, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
+ 2, 2, 9, 5, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 7, 6, 6, 5, 7, 7, 7, 7, 7,
+ 7, 7, 12, 7, 7, 7, 12, 7, 7, 7, 7, 12, 7, 7, 7, 7,
+ 7, 7, 7, 10, 10, 12, 12, 10, 26, 26, 26, 26, 2, 2, 2, 2,
+ 15, 15, 15, 15, 15, 15, 26, 26, 23, 26, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2,
+ 10, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21,
+ 12, 12, 7, 7, 7, 7, 7, 7, 21, 21, 21, 7, 21, 7, 7, 12,
+ 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 21, 21,
+ 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21,
+ 7, 7, 7, 12, 10, 10, 12, 12, 12, 12, 10, 10, 12, 12, 10, 10,
+ 10, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 6,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 21, 21,
+ 7, 7, 7, 7, 7, 12, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 7, 7, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 10,
+ 10, 12, 12, 10, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 12, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 2, 2,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 21, 21, 21, 21,
+ 6, 7, 7, 7, 7, 7, 7, 26, 26, 26, 7, 10, 12, 10, 7, 7,
+ 12, 7, 12, 12, 12, 7, 7, 12, 12, 7, 7, 7, 7, 7, 12, 12,
+ 7, 12, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 6, 21, 21,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 12, 12, 10, 10,
+ 21, 21, 7, 6, 6, 10, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 2,
+ 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 24, 6, 6, 6, 6,
+ 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 10, 10, 12, 10, 10, 12, 10, 10, 21, 10, 12, 2, 2,
+ 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7, 7, 7, 7, 7,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 7, 12, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 7, 2,
+ 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 18, 22,
+ 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 23, 26, 2, 2,
+ 21, 21, 21, 21, 21, 21, 21, 22, 18, 21, 2, 2, 2, 2, 2, 2,
+ 21, 17, 17, 16, 16, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22,
+ 18, 22, 18, 22, 18, 21, 21, 22, 18, 21, 21, 21, 21, 16, 16, 16,
+ 21, 21, 21, 2, 21, 21, 21, 21, 17, 22, 18, 22, 18, 22, 18, 21,
+ 21, 21, 25, 17, 25, 25, 25, 2, 21, 23, 21, 21, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 1,
+ 2, 21, 21, 21, 23, 21, 21, 21, 22, 18, 21, 25, 21, 17, 21, 21,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 25, 18, 25, 22,
+ 18, 21, 22, 18, 21, 21, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6,
+ 2, 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7,
+ 2, 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 2, 2, 2,
+ 23, 23, 25, 24, 26, 23, 23, 2, 26, 25, 25, 25, 25, 26, 26, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 26, 26, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7,
+ 21, 21, 21, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 14, 14, 14, 14, 14, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 26, 26, 26, 2,
+ 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 2, 2,
+ 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2,
+ 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7,
+ 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 14, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 21,
+ 7, 7, 7, 7, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7,
+ 21, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5,
+ 9, 9, 9, 9, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2,
+ 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21,
+ 7, 7, 7, 7, 7, 7, 2, 2, 7, 2, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 2, 2, 7, 2, 2, 7,
+ 7, 7, 7, 7, 7, 7, 2, 21, 15, 15, 15, 15, 15, 15, 15, 15,
+ 7, 7, 7, 7, 7, 7, 7, 26, 26, 15, 15, 15, 15, 15, 15, 15,
+ 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 7, 7, 7, 2, 7, 7, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15,
+ 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 2, 2, 2, 21,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 21,
+ 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 15, 15, 7, 7,
+ 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 7, 12, 12, 12, 2, 12, 12, 2, 2, 2, 2, 2, 12, 12, 12, 12,
+ 7, 7, 7, 7, 2, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 12, 2, 2, 2, 2, 12,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 21,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 15,
+ 7, 7, 7, 7, 7, 7, 7, 7, 26, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 12, 12, 2, 2, 2, 2, 15, 15, 15, 15, 15,
+ 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 2, 2, 2, 21, 21, 21, 21, 21, 21, 21,
+ 7, 7, 7, 7, 7, 7, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15,
+ 7, 7, 7, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15,
+ 7, 7, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15,
+ 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15,
+ 7, 7, 7, 7, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2,
+ 15, 15, 15, 15, 15, 15, 15, 7, 2, 2, 2, 2, 2, 2, 2, 2,
+ 12, 15, 15, 15, 15, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2,
+ 10, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 21, 21, 21, 21, 21, 21, 21, 2, 2,
+ 15, 15, 15, 15, 15, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12,
+ 10, 10, 10, 12, 12, 12, 12, 10, 10, 12, 12, 21, 21, 1, 21, 21,
+ 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2,
+ 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 10, 12, 12, 12,
+ 12, 12, 12, 12, 12, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 21, 21, 21, 21, 7, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 12, 21, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10,
+ 10, 7, 7, 7, 7, 21, 21, 21, 21, 12, 12, 12, 12, 21, 2, 2,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 21, 7, 21, 21, 21,
+ 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 12,
+ 12, 12, 10, 10, 12, 10, 12, 12, 21, 21, 21, 21, 21, 21, 12, 2,
+ 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 2, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12,
+ 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2,
+ 12, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7,
+ 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 12, 12, 7, 10, 10,
+ 12, 10, 10, 10, 10, 2, 2, 10, 10, 2, 2, 10, 10, 10, 2, 2,
+ 7, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 7, 7, 7,
+ 7, 7, 10, 10, 2, 2, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2,
+ 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12,
+ 10, 10, 12, 12, 12, 10, 12, 7, 7, 7, 7, 21, 21, 21, 21, 21,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 21, 2, 21, 12, 7,
+ 10, 10, 10, 12, 12, 12, 12, 12, 12, 10, 12, 10, 10, 10, 10, 12,
+ 12, 10, 12, 12, 7, 7, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10,
+ 10, 10, 12, 12, 12, 12, 2, 2, 10, 10, 10, 10, 12, 12, 10, 12,
+ 12, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 7, 7, 7, 7, 12, 12, 2, 2,
+ 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 12, 10, 12,
+ 12, 21, 21, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 12, 10, 10,
+ 12, 12, 12, 12, 12, 12, 10, 12, 7, 2, 2, 2, 2, 2, 2, 2,
+ 10, 10, 12, 12, 12, 12, 10, 12, 12, 12, 12, 12, 2, 2, 2, 2,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 21, 21, 21, 26,
+ 12, 12, 12, 12, 12, 12, 12, 12, 10, 12, 12, 21, 2, 2, 2, 2,
+ 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7,
+ 7, 10, 10, 10, 12, 12, 12, 12, 2, 2, 12, 12, 10, 10, 10, 10,
+ 12, 7, 21, 7, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 7,
+ 7, 7, 7, 12, 12, 12, 12, 12, 12, 10, 7, 12, 12, 12, 12, 21,
+ 21, 21, 21, 21, 21, 21, 21, 12, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 12, 12, 12, 12, 12, 12, 10, 10, 12, 12, 12, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 10, 12, 12, 21, 21, 21, 7, 21, 21,
+ 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 10, 12,
+ 7, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 21, 21, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 2, 10, 12, 12, 12, 12, 12, 12,
+ 12, 10, 12, 12, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7,
+ 7, 12, 12, 12, 12, 12, 12, 2, 2, 2, 12, 2, 12, 12, 2, 12,
+ 12, 12, 12, 12, 12, 12, 7, 12, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 2,
+ 12, 12, 2, 10, 10, 12, 10, 12, 7, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 12, 12, 10, 10, 21, 21, 2, 2, 2, 2, 2, 2, 2,
+ 15, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 23, 23, 23,
+ 23, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2,
+ 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
+ 12, 12, 12, 12, 12, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 12, 12, 12, 12, 12, 12, 12, 21, 21, 21, 21, 21, 26, 26, 26, 26,
+ 6, 6, 6, 6, 21, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 15, 15, 15, 15, 15,
+ 15, 15, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 7, 7, 7,
+ 15, 15, 15, 15, 15, 15, 15, 21, 21, 21, 21, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 12,
+ 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 12,
+ 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 21, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 26, 12, 12, 21,
+ 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 26, 26, 26, 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 10, 10, 12, 12, 12, 26, 26, 26, 10, 10, 10,
+ 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12,
+ 12, 12, 12, 26, 26, 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 12, 12, 12, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2,
+ 26, 26, 12, 12, 12, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5,
+ 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 2, 9, 9,
+ 2, 2, 9, 2, 2, 9, 9, 2, 2, 9, 9, 9, 9, 2, 9, 9,
+ 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 2, 5, 2, 5, 5, 5,
+ 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 9, 9, 2, 9, 9, 9, 9, 2, 2, 9, 9, 9,
+ 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 2, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 2, 9, 9, 9, 9, 2,
+ 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, 9, 9, 9, 9, 9, 9,
+ 9, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 2, 2, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5,
+ 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25,
+ 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 9, 5, 2, 2, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, 26, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 26, 26, 26,
+ 26, 26, 26, 26, 26, 12, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 12, 26, 26, 21, 21, 21, 21, 21, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 12, 12, 12, 12, 12,
+ 12, 12, 2, 12, 12, 2, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2,
+ 12, 12, 12, 12, 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 2, 2,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 7, 26,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 23,
+ 7, 7, 7, 7, 7, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 5, 5, 5, 5, 12, 12, 12, 12, 12, 12, 12, 6, 2, 2, 2, 2,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 15, 15, 15,
+ 23, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2,
+ 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 2, 7, 7, 2, 7, 2, 2, 7, 2, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 2, 7, 2, 2, 2, 2,
+ 2, 2, 7, 2, 2, 2, 2, 7, 2, 7, 2, 7, 2, 7, 7, 7,
+ 2, 7, 7, 2, 7, 2, 2, 7, 2, 7, 2, 7, 2, 7, 2, 7,
+ 2, 7, 7, 2, 7, 2, 2, 7, 7, 7, 7, 2, 7, 7, 7, 7,
+ 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 2,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7,
+ 2, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7,
+ 25, 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 24, 24, 24, 24, 24,
+ 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 26, 26, 26,
+ 26, 26, 2, 26, 26, 26, 26, 2, 2, 2, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 2, 2, 2, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 26, 26, 26,
+ 26, 26, 26, 26, 2, 2, 2, 2, 26, 26, 26, 2, 2, 2, 2, 2,
+ 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0,
+ 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 0, 0, 15, 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, 0, 0,
+ 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 0, 0,
+ 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, 31, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 33, 0,
+ 0, 34, 35, 36, 0, 0, 0, 0, 0, 0, 37, 0, 0, 38, 0, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 0, 51, 52, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 56, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 58, 54, 59, 0, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6,
+ 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 10, 11, 12, 0, 0, 0, 0, 13, 0, 0, 14, 15,
+ 0, 16, 0, 0, 0, 0, 0, 17, 18, 0, 0, 19, 0, 20, 21, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26,
+ 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 0, 0, 0, 30, 31, 32,
+ 0, 0, 0, 0, 0, 30, 31, 0, 0, 33, 0, 0, 0, 30, 31, 0,
+ 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, 30, 31, 0,
+ 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 31, 34,
+ 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, 35, 31, 0,
+ 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 37, 38, 0,
+ 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 41, 0, 42, 0, 0,
+ 0, 43, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0,
+ 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 49, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0,
+ 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 57, 49, 0,
+ 58, 59, 0, 0, 60, 0, 0, 0, 61, 62, 0, 0, 0, 63, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 64, 65, 66, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 67, 68, 1, 69, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 70, 71, 72, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 73, 74, 0, 0, 0, 0, 0, 0,
+ 0, 75, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 76, 0, 0, 0,
+ 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 73, 78, 0, 79, 0, 0, 0, 0, 0, 74, 80, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 49, 0, 1, 74, 0, 0, 81, 0, 0, 82,
+ 0, 0, 0, 0, 0, 83, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 84, 85, 0, 0, 80, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 86, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0,
+ 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 91, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 88,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0,
+ 0, 75, 0, 0, 0, 95, 0, 0, 0, 0, 96, 0, 0, 97, 0, 0,
+ 0, 83, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 99, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0,101, 31, 0,
+ 102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 33,
+ 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 75,106, 0, 0, 0, 0, 0, 0, 75, 0, 0,
+ 0, 0, 0, 0, 0,107, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 49,109, 0,
+ 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 0,
+ 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 0, 0,113, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 115,116,117, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,121,122, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,123, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,124, 0, 0, 0, 0, 0, 0,125, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230,
+ 230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,232,
+ 220,220,220,220,232,216,220,220,220,220,220,202,202,220,220,220,
+ 220,202,202,220,220,220,220,220,220,220,220,220,220,220, 1, 1,
+ 1, 1, 1,220,220,220,220,230,230,230,230,230,230,230,230,240,
+ 230,220,220,220,230,230,230,220,220, 0,230,230,230,220,220,220,
+ 220,230,232,220,220,230,233,234,234,233,234,234,233,230,230,230,
+ 230,230,230,230,230,230,230,230,230,230, 0, 0, 0,230,230,230,
+ 230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,230,230,230,230,
+ 220,230,230,230,222,220,230,230,230,230,230,230,220,220,220,220,
+ 220,220,230,230,220,230,230,222,228,230, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0,230,220,
+ 0, 18, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230,
+ 230,230, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,
+ 220,230,230,230,230,230,220,230,230,220, 35, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 230,230,230,230,230,230,230, 0, 0,230,230,230,230,220,230, 0,
+ 0,230,230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,220,230,230,220,230,
+ 230,220,220,220,230,220,220,230,220,230,230,230,220,230,220,230,
+ 220,230,220,230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,230,230,230,230,230,230,230,220,230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 0,
+ 230,230,230,230, 0,230,230,230,230,230,230,230,230,230, 0,230,
+ 230,230, 0,230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,220,220,220, 0, 0, 0, 0, 0, 0, 0,220,230,230,
+ 230,230,230,230,230,230,230,230,230,230,230,230, 0,220,230,230,
+ 220,230,230,220,230,230,230,220,220,220, 27, 28, 29,230,230,230,
+ 220,230,230,220,220,230,230,230,230,230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230,230, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 84,
+ 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,103,103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,107,107,107,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,118,118, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,122,122,122,122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,220,220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,
+ 0,220, 0,216, 0, 0, 0, 0, 0, 0, 0,129,130, 0,132, 0,
+ 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,230,230, 9, 0,
+ 230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,230,230,230, 0, 0, 0, 0, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,222,230,220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,230,220, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,
+ 230,230,230,230,230,230,230, 0, 0,220,230,230,230,230,230,220,
+ 220,220,220,220,220,230,230,220, 0, 0, 0, 0, 0, 0, 7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,230,220,230,230,230,230,230,230,230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230, 0, 1,220,
+ 220,220,220,220,230,230,220,220,220,220,230, 0, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0,220, 0, 0, 0, 0, 0, 0,230, 0,
+ 0, 0,230,230, 0, 0, 0, 0, 0, 0,230,230,220,230,230,230,
+ 230,230,230,230,220,230,230,234,214,220,202,230,230,230,230,230,
+ 230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+ 232,228,228,220, 0,230,233,220,230,220,230,230, 1, 1,230,230,
+ 230,230, 1, 1, 1,230,230, 0, 0, 0, 0,230, 0, 0, 0, 1,
+ 1,230,220,230, 1, 1,220,220,220,220,230, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,218,228,232,222,224,224, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,
+ 230,230,230,230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,230,230, 0, 0, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,220,220,220, 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 0,230,230,220, 0,
+ 0,230,230, 0, 0, 0, 0, 0,230,230, 0,230, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 26, 0,230,230,230,230,230,230,
+ 230,220,220,220,220,220,220,220,230,230,220, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,220, 0,230, 0, 0, 0, 0, 0, 0,
+ 0, 0,230, 1,220, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,230,
+ 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,
+ 230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 220,220,230,230,230,220,230,220,220,220, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 7, 0, 0, 0, 0, 0,230,230,230, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 230,230,230,230,230,230,230, 0, 0, 0,230,230,230,230,230, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+ 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230,
+ 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,216,
+ 216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0, 0, 0,
+ 0, 0, 0, 0, 0,220,220,220,220,220,220,220,220, 0, 0,230,
+ 230,230,230,230,220,220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,230,230,230,230, 0, 0, 0, 0,230,230,230, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230,
+ 230, 0,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
+ 230,230,230, 0, 0,230,230,230,230,230,230,230, 0,230,230, 0,
+ 230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,230,230,230,230,220,220,220,220,220,220,
+ 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,
+ 230,230,230,230, 7, 0, 0, 0, 0, 0, 16, 17, 17, 17, 17, 17,
+ 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,129,169,
+ 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17,237, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+ 3, 4, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 0, 13,
+ 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, 7, 1,
+ 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, 21, 0,
+ 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, 1, 7,
+ 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 20, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 21, 32, 4, 0, 10,
+ 0, 33, 7, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 34, 34, 35, 36, 34,
+ 37, 0, 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8, 21, 1,
+ 20, 0, 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 8, 21, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21,
+ 0, 42, 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, 0, 0,
+ 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 1, 20,
+ 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+ 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+ 3, 4, 0, 0, 0, 0, 0, 0, 3, 4, 0, 1, 2, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 17, 19, 20,
+ 21, 22, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 28, 28, 29, 30, 31, 32,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
+ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 35, 35, 35,
+ 35, 35, 59, 59, 60, 35, 35, 35, 35, 35, 35, 35, 61, 62, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 63, 64,
+ 35, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 66, 68,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 69, 70, 35, 35, 35, 35, 71, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 72, 73, 74, 75, 76, 77, 35, 35, 78, 79, 35, 35, 80, 35,
+ 81, 82, 83, 84, 17, 85, 86, 87, 35, 35, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 88, 25, 25,
+ 25, 25, 25, 25, 25, 89, 90, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 91, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 92,
+ 35, 35, 35, 35, 35, 35, 25, 93, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 94, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19,
+ 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9,
+ 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, 2, 2,
+ 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 0, 4, 2, 2, 4, 4, 4, 2, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 14, 14, 14, 14, 14,
+ 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
+ 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 3, 0, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, 95, 95,
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+ 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
+ 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1,
+ 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5,
+ 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, 2, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, 5, 2,
+ 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 2, 2, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, 2, 2,
+ 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, 5, 5,
+ 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, 11, 11,
+ 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, 2, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2, 11, 11,
+ 2, 11, 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 11, 11, 2,
+ 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, 2, 2,
+ 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, 2, 2,
+ 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10,
+ 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10,
+ 2, 10, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 2, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10,
+ 2, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 2,
+ 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, 21, 21,
+ 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2, 21, 21,
+ 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 2, 2, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, 2, 2,
+ 2, 2, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, 21, 21,
+ 2, 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 22,
+ 2, 22, 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2, 22, 22,
+ 22, 22, 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2, 2, 22,
+ 22, 2, 2, 2, 22, 22, 22, 2, 2, 2, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 22, 22, 2,
+ 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 22, 2, 2, 2,
+ 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23,
+ 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, 2, 2,
+ 2, 23, 23, 2, 23, 23, 23, 2, 2, 2, 2, 2, 23, 23, 23, 23,
+ 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 2, 2, 2,
+ 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 2, 16, 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 2, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, 2, 2,
+ 2, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 2, 16, 16, 16, 16,
+ 2, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 20, 20, 20,
+ 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 2, 2, 2, 2,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 36, 36,
+ 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 36, 36, 36, 36,
+ 36, 36, 36, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36, 36, 36,
+ 36, 2, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, 2,
+ 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 36, 36,
+ 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, 18, 2,
+ 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, 18, 18,
+ 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 2, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25,
+ 25, 0, 0, 0, 0, 25, 25, 2, 2, 2, 2, 2, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 2, 8, 2, 2, 2, 2, 2, 8, 2, 2, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, 30, 30,
+ 30, 30, 30, 2, 30, 2, 30, 30, 30, 30, 2, 2, 30, 2, 30, 30,
+ 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 2, 30, 30,
+ 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 2, 2, 2, 2, 2, 2, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 2, 2, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 2, 2, 2, 2, 2, 2, 2, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 2, 45, 45, 45, 45, 45, 45,
+ 45, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2, 46, 46,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 2, 2, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32, 0, 0,
+ 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 2, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28, 28, 28,
+ 28, 28, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 2, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2, 2, 2,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 2, 2, 52, 52, 52, 52,
+ 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 2, 2, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 2, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 2, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 2, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
+ 2, 2, 2, 2, 2, 2, 2, 2, 93, 93, 93, 93, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 2, 2, 8, 8, 8, 76, 76, 76, 76,
+ 76, 76, 76, 76, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
+ 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19, 19, 19,
+ 19, 19, 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, 19, 19,
+ 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 9, 9, 9, 9,
+ 9, 9, 2, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9,
+ 9, 9, 9, 9, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9,
+ 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 2, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 2, 2, 9, 9,
+ 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 2, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, 1, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, 19, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0,
+ 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 2, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 61, 30, 30, 30, 30,
+ 30, 30, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 30, 30, 30, 30,
+ 30, 30, 30, 2, 30, 30, 30, 30, 30, 30, 30, 2, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 13, 13,
+ 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 13, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, 0, 0, 0, 0,
+ 0, 0, 0, 0, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 2, 2, 2, 2,
+ 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17,
+ 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39, 39, 39,
+ 39, 39, 39, 2, 2, 2, 2, 2, 2, 2, 2, 2, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, 2, 2, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 0, 0, 0, 19, 19, 19, 19, 19, 2, 2, 19, 19,
+ 19, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 19, 19, 19, 19, 19, 19, 19, 19, 19, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 2, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 2, 2, 2, 2, 2, 2, 2, 2, 2, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 2, 2, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 2, 2, 68, 68, 68, 68, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, 92, 92, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 30, 30, 30,
+ 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 2, 2, 30, 30, 30,
+ 30, 30, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 9, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12,
+ 12, 12, 12, 2, 2, 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19,
+ 19, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4,
+ 4, 4, 4, 4, 2, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 2, 14, 14, 14, 14, 14, 2, 14, 2, 14, 14, 2, 14,
+ 14, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 3, 3, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 2, 2, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0, 0, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2, 3, 3, 3, 3,
+ 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 2, 2, 12, 12,
+ 12, 12, 12, 12, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2, 12, 12,
+ 12, 12, 12, 12, 2, 2, 12, 12, 12, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 2, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 2, 2, 2, 2, 2, 0, 0, 0, 2,
+ 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,118,118,118,118,
+ 118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
+ 118,118,118,118,118,118,118, 2, 2, 2, 2, 2, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 2, 2, 2, 2, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 2, 2, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 2, 2, 2, 2, 2, 2,135,135,135,135,
+ 135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+ 2, 2, 2, 2,135,135,135,135,135,135,135,135,135,135,135,135,
+ 135,135,135,135,135,135,135,135, 2, 2, 2, 2,106,106,106,106,
+ 106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
+ 106,106,106,106, 2, 2, 2, 2, 2, 2, 2, 2,104,104,104,104,
+ 104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,104,110,110,110,110,
+ 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+ 110,110,110, 2, 2, 2, 2, 2, 2, 2, 2, 2,110,110,110,110,
+ 110,110, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,110,110,110,110,
+ 110,110,110,110, 2, 2, 2, 2, 2, 2, 2, 2, 47, 47, 47, 47,
+ 47, 47, 2, 2, 47, 2, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 2, 81, 81, 81, 81, 81, 81, 81, 81, 81,120,120,120,120,
+ 120,120,120,120,120,120,120,120,120,120,120,120,116,116,116,116,
+ 116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
+ 116,116,116,116,116,116,116,116,116,116,116, 2, 2, 2, 2, 2,
+ 2, 2, 2,116,116,116,116,116,116,116,116,116,128,128,128,128,
+ 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 2,
+ 128,128, 2, 2, 2, 2, 2,128,128,128,128,128, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 2, 72, 98, 98, 98, 98,
+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97,
+ 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
+ 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, 97, 97, 2, 2, 97, 97,
+ 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 57, 57, 57, 57,
+ 2, 57, 57, 2, 2, 2, 2, 2, 57, 57, 57, 57, 57, 57, 57, 57,
+ 2, 57, 57, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,117,117,117,117,
+ 117,117,117,117,117,117,117,117,117,117,117,117,112,112,112,112,
+ 112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+ 112,112,112, 2, 2, 2, 2,112,112,112,112,112,112,112,112,112,
+ 112,112,112, 2, 2, 2, 2, 2, 2, 2, 2, 2, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 2, 2, 2, 78, 78, 78, 78, 78, 78, 78, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 2, 2, 83, 83, 83, 83, 83, 83, 83, 83, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 2,
+ 2, 2, 2, 2, 82, 82, 82, 82, 82, 82, 82, 82,122,122,122,122,
+ 122,122,122,122,122,122,122,122,122,122,122,122,122,122, 2, 2,
+ 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2,122,122,122,122,122,122,122, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,
+ 130,130,130,130,130,130,130,130,130,130,130,130,130,130,130, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,130,130,130, 2,
+ 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,144,144,144,144,
+ 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
+ 144,144,144,144, 2, 2, 2, 2, 2, 2, 2, 2,144,144,144,144,
+ 144,144,144,144,144,144, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2,147,147,147,147,
+ 147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
+ 147,147,147,147, 2, 2, 2, 2, 2, 2, 2, 2,148,148,148,148,
+ 148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+ 148,148,148,148,148,148, 2, 2, 2, 2, 2, 2,149,149,149,149,
+ 149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+ 149,149,149, 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101,101,101,
+ 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,
+ 101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101,101,101,
+ 101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 2, 2, 2, 2, 2, 2, 2, 2, 2,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111, 2, 2, 2, 2, 2, 2, 2, 2, 2,100,100,100,100,
+ 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+ 100,100,100,100,100,100,100,100,100,100, 2, 2, 2, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108, 2,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108, 2,129,129,129,129,
+ 129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129,129,129,
+ 129,129,129,129,129,129,129,129,129,129, 2,129,129,129,129,129,
+ 129,129,129,129,129,129, 2, 2, 2, 2, 2, 2,109,109,109,109,
+ 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
+ 109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109,109,109,
+ 109,109,109,109,109,109, 2, 2, 2, 2, 2, 2,107,107,107,107,
+ 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2, 2,107,
+ 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+ 107,107,107,107,107, 2,107,107,107,107,107,107,107, 2,107,107,
+ 2,107,107,107,107,107, 2, 1,107,107,107,107,107,107,107,107,
+ 107, 2, 2,107,107, 2, 2,107,107,107, 2, 2,107, 2, 2, 2,
+ 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107,107,107,
+ 2, 2,107,107,107,107,107,107,107, 2, 2, 2,107,107,107,107,
+ 107, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,137,137,137,137,
+ 137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+ 137,137,137,137,137,137, 2,137, 2,137,137,137,124,124,124,124,
+ 124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
+ 124,124,124,124, 2, 2, 2, 2, 2, 2, 2, 2,124,124,124,124,
+ 124,124,124,124,124,124, 2, 2, 2, 2, 2, 2,123,123,123,123,
+ 123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+ 123,123, 2, 2,123,123,123,123,123,123,123,123,123,123,123,123,
+ 123,123,123,123,123,123,123,123,123,123, 2, 2,114,114,114,114,
+ 114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
+ 114, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,114,114,114,114,
+ 114,114,114,114,114,114, 2, 2, 2, 2, 2, 2, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 2,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102, 2, 2, 2, 2, 2, 2, 2,102,102,102,102,
+ 102,102,102,102,102,102, 2, 2, 2, 2, 2, 2,126,126,126,126,
+ 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
+ 126,126,126,126,126,126,126, 2, 2,126,126,126,126,126,126,126,
+ 126,126,126,126,126,126,126,126, 2, 2, 2, 2,142,142,142,142,
+ 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+ 142,142,142,142,142,142,142,142, 2, 2, 2, 2,125,125,125,125,
+ 125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125,150,150,150,150,
+ 150,150,150,150, 2, 2,150,150,150,150,150,150,150,150,150,150,
+ 150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
+ 150, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,141,141,141,141,
+ 141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+ 141,141,141,141, 2, 2, 2, 2, 2, 2, 2, 2,140,140,140,140,
+ 140,140,140,140,140,140,140,140,140,140,140,140,140,140,140, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,121,121,121,121,
+ 121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
+ 121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2,133,133,133,133,
+ 133,133,133,133,133, 2,133,133,133,133,133,133,133,133,133,133,
+ 133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+ 133,133,133, 2,133,133,133,133,133,133,133,133,133,133,133,133,
+ 133,133, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,133,133,133,133,
+ 133,133,133,133,133,133,133,133,133, 2, 2, 2,134,134,134,134,
+ 134,134,134,134,134,134,134,134,134,134,134,134, 2, 2,134,134,
+ 134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+ 134,134,134,134, 2,134,134,134,134,134,134,134,134,134,134,134,
+ 134,134,134, 2, 2, 2, 2, 2, 2, 2, 2, 2,138,138,138,138,
+ 138,138,138, 2,138,138, 2,138,138,138,138,138,138,138,138,138,
+ 138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+ 138,138,138, 2, 2, 2,138, 2,138,138, 2,138,138,138,138,138,
+ 138,138,138,138, 2, 2, 2, 2, 2, 2, 2, 2,138,138,138,138,
+ 138,138,138,138,138,138, 2, 2, 2, 2, 2, 2,143,143,143,143,
+ 143,143, 2,143,143, 2,143,143,143,143,143,143,143,143,143,143,
+ 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+ 143,143,143,143,143,143,143,143,143,143,143, 2,143,143, 2,143,
+ 143,143,143,143,143, 2, 2, 2, 2, 2, 2, 2,143,143,143,143,
+ 143,143,143,143,143,143, 2, 2, 2, 2, 2, 2,145,145,145,145,
+ 145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
+ 145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 2, 63, 63, 63, 63,
+ 63, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 2, 2, 2, 2, 2, 2, 2,127,127,127,127,
+ 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
+ 127,127,127, 2, 2, 2, 2, 2, 2, 2, 2, 2, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 2, 2, 2, 2, 2, 2, 2,115,115,115,115,
+ 115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+ 115,115,115,115,115,115,115,115,115,115,115, 2,115,115,115,115,
+ 115,115,115,115,115,115, 2, 2, 2, 2,115,115,103,103,103,103,
+ 103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
+ 103,103,103,103,103,103,103,103,103,103, 2, 2,103,103,103,103,
+ 103,103, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,119,119,119,119,
+ 119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+ 119,119, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,119,119,119,119,
+ 119,119,119,119,119,119, 2,119,119,119,119,119,119,119, 2,119,
+ 119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+ 119,119,119,119, 2, 2, 2, 2, 2,119,119,119,146,146,146,146,
+ 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
+ 146,146,146,146,146,146,146, 2, 2, 2, 2, 2, 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, 2, 2, 2, 2, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 2, 2, 2, 2, 2, 2, 2, 99,136,139, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,136,136,136,136,
+ 136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+ 136,136,136,136, 2, 2, 2, 2, 2, 2, 2, 2,136,136,136, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 15, 15, 15, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 17, 17, 17, 17, 2, 2, 2, 2, 2, 2, 2, 2,139,139,139,139,
+ 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+ 139,139,139,139,139,139,139,139, 2, 2, 2, 2,105,105,105,105,
+ 105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,
+ 105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105,105,105,
+ 105,105,105,105,105,105,105,105,105, 2, 2, 2,105,105,105,105,
+ 105,105,105,105,105, 2, 2, 2, 2, 2, 2, 2,105,105,105,105,
+ 105,105,105,105,105,105, 2, 2,105,105,105,105, 0, 0, 0, 0,
+ 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9,
+ 9, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 2,
+ 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0,131,131,131,131,
+ 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+ 131,131,131,131,131,131,131,131, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131,131,131,
+ 131,131,131,131,131,131,131,131,131,131,131,131, 56, 56, 56, 56,
+ 56, 56, 56, 2, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56, 2, 56,
+ 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2,151,151,151,151,
+ 151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
+ 151,151,151,151,151,151,151,151,151, 2, 2, 2,151,151,151,151,
+ 151,151,151,151,151,151,151,151,151,151, 2, 2,151,151,151,151,
+ 151,151,151,151,151,151, 2, 2, 2, 2,151,151,152,152,152,152,
+ 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
+ 152,152,152,152,152,152, 2, 2, 2, 2, 2,152,113,113,113,113,
+ 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+ 113, 2, 2,113,113,113,113,113,113,113,113,113,113,113,113,113,
+ 113,113,113, 2, 2, 2, 2, 2, 2, 2, 2, 2,132,132,132,132,
+ 132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+ 132,132,132,132,132,132,132,132, 2, 2, 2, 2,132,132,132,132,
+ 132,132,132,132,132,132, 2, 2, 2, 2,132,132, 0, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 3, 3, 3, 3,
+ 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 2,
+ 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2,
+ 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 3, 2,
+ 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 3, 2,
+ 3, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 2,
+ 3, 2, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2,
+ 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3,
+ 2, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0,
+ 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+ 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 13, 13,
+ 13, 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 13, 13,
+ 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1,
+ 2, 3, 4, 5, 6, 0, 0, 0, 0, 7, 8, 9, 10, 11, 0, 12,
+ 0, 0, 0, 0, 13, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15, 16, 0, 17, 18, 19, 0, 0, 0, 20, 21, 22, 0, 23, 0, 24,
+ 0, 25, 0, 26, 0, 0, 0, 0, 0, 27, 28, 0, 29, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 0,
+ 41, 0, 42, 43, 44, 45, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 52,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,
+ 64, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 66, 0,
+ 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 68, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74,
+ 75, 76, 77, 78, 79, 0,
+};
+static const uint16_t
+_hb_ucd_u16[11168] =
+{
+ 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12,
+ 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23,
+ 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31,
+ 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39,
+ 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13,
+ 13, 13, 13, 42, 9, 43, 11, 11, 44, 45, 32, 46, 47, 48, 49, 50,
+ 51, 52, 48, 48, 53, 32, 54, 55, 48, 48, 48, 48, 48, 56, 57, 58,
+ 59, 60, 48, 32, 61, 48, 48, 48, 48, 48, 62, 63, 64, 48, 65, 66,
+ 48, 67, 68, 69, 48, 70, 71, 72, 72, 72, 48, 73, 72, 74, 75, 32,
+ 76, 48, 48, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
+ 90, 83, 84, 91, 92, 93, 94, 95, 96, 97, 84, 98, 99, 100, 88, 101,
+ 102, 83, 84, 103, 104, 105, 88, 106, 107, 108, 109, 110, 111, 112, 94, 113,
+ 114, 115, 84, 116, 117, 118, 88, 119, 120, 115, 84, 121, 122, 123, 88, 124,
+ 125, 115, 48, 126, 127, 128, 88, 129, 130, 131, 48, 132, 133, 134, 94, 135,
+ 136, 48, 48, 137, 138, 139, 72, 72, 140, 48, 141, 142, 143, 144, 72, 72,
+ 145, 146, 147, 148, 149, 48, 150, 151, 152, 153, 32, 154, 155, 156, 72, 72,
+ 48, 48, 157, 158, 159, 160, 161, 162, 163, 164, 9, 9, 165, 11, 11, 166,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 167, 168, 48, 48, 167, 48, 48, 169, 170, 171, 48, 48,
+ 48, 170, 48, 48, 48, 172, 173, 174, 48, 175, 9, 9, 9, 9, 9, 176,
+ 177, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 178, 48, 179, 180, 48, 48, 48, 48, 181, 182,
+ 183, 184, 48, 185, 48, 186, 183, 187, 48, 48, 48, 188, 189, 190, 191, 192,
+ 193, 191, 48, 48, 194, 48, 48, 195, 196, 48, 197, 48, 48, 48, 48, 198,
+ 48, 199, 200, 201, 202, 48, 203, 204, 48, 48, 205, 48, 206, 207, 208, 208,
+ 48, 209, 48, 48, 48, 210, 211, 212, 191, 191, 213, 214, 72, 72, 72, 72,
+ 215, 48, 48, 216, 217, 159, 218, 219, 220, 48, 221, 64, 48, 48, 222, 223,
+ 48, 48, 224, 225, 226, 64, 48, 227, 228, 9, 9, 229, 230, 231, 232, 233,
+ 11, 11, 234, 27, 27, 27, 235, 236, 11, 237, 27, 27, 32, 32, 32, 238,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 239, 13, 13, 13, 13, 13, 13,
+ 240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249,
+ 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260, 72, 261, 262, 263,
+ 264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276,
+ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ 278, 208, 279, 208, 208, 208, 208, 280, 208, 281, 277, 282, 208, 283, 284, 208,
+ 208, 208, 285, 72, 286, 72, 269, 269, 269, 287, 208, 208, 208, 208, 288, 269,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 289, 290, 208, 208, 291,
+ 208, 208, 208, 208, 208, 208, 292, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+ 208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+ 277, 277, 277, 277, 277, 277, 277, 277, 298, 299, 277, 277, 277, 300, 277, 301,
+ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ 208, 208, 208, 277, 302, 208, 208, 303, 208, 304, 208, 208, 208, 208, 208, 208,
+ 9, 9, 305, 11, 11, 306, 307, 308, 13, 13, 13, 13, 13, 13, 309, 310,
+ 11, 11, 311, 48, 48, 48, 312, 313, 48, 314, 315, 315, 315, 315, 32, 32,
+ 316, 317, 318, 319, 320, 72, 72, 72, 208, 321, 208, 208, 208, 208, 208, 322,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 72, 324,
+ 325, 326, 327, 328, 136, 48, 48, 48, 48, 329, 177, 48, 48, 48, 48, 330,
+ 331, 48, 48, 136, 48, 48, 48, 48, 199, 332, 48, 71, 208, 208, 322, 48,
+ 208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 198, 208, 208, 208, 208,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 72,
+ 48, 337, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 150, 208, 208, 208, 285, 48, 48, 227,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 338, 48, 339, 72, 13, 13, 340, 341, 13, 342, 48, 48, 48, 48, 343, 344,
+ 31, 345, 346, 347, 13, 13, 13, 348, 349, 350, 351, 352, 353, 72, 72, 354,
+ 355, 48, 356, 357, 48, 48, 48, 358, 359, 48, 48, 360, 361, 191, 32, 362,
+ 64, 48, 363, 48, 364, 365, 48, 150, 76, 48, 48, 366, 367, 368, 369, 370,
+ 48, 48, 371, 372, 373, 374, 48, 375, 48, 48, 48, 376, 377, 378, 379, 380,
+ 381, 382, 315, 11, 11, 383, 384, 11, 11, 11, 11, 11, 48, 48, 385, 191,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 386, 48, 387, 48, 48, 205,
+ 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388,
+ 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 203, 48, 48, 48, 48, 48, 48, 206, 72, 72,
+ 390, 391, 392, 393, 394, 48, 48, 48, 48, 48, 48, 395, 396, 397, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 398, 72, 48, 48, 48, 48, 399, 48, 48, 400, 72, 72, 401,
+ 32, 402, 32, 403, 404, 405, 406, 407, 48, 48, 48, 48, 48, 48, 48, 408,
+ 409, 2, 3, 4, 5, 410, 411, 412, 48, 413, 48, 199, 414, 415, 416, 417,
+ 418, 48, 171, 419, 203, 203, 72, 72, 48, 48, 48, 48, 48, 48, 48, 71,
+ 420, 269, 269, 421, 270, 270, 270, 422, 423, 324, 424, 72, 72, 208, 208, 425,
+ 72, 72, 72, 72, 72, 72, 72, 72, 48, 150, 48, 48, 48, 100, 426, 427,
+ 48, 48, 428, 48, 429, 48, 48, 430, 48, 431, 48, 48, 432, 433, 72, 72,
+ 9, 9, 434, 11, 11, 48, 48, 48, 48, 203, 191, 9, 9, 435, 11, 436,
+ 48, 48, 400, 48, 48, 48, 437, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 314, 48, 198, 400, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 438, 48, 48, 439, 48, 440, 48, 441, 48, 199, 442, 72, 72, 72, 48, 443,
+ 48, 444, 48, 445, 72, 72, 72, 72, 48, 48, 48, 446, 269, 447, 269, 269,
+ 448, 449, 48, 450, 451, 452, 48, 453, 48, 454, 72, 72, 455, 48, 456, 457,
+ 48, 48, 48, 458, 48, 459, 48, 460, 48, 461, 462, 72, 72, 72, 72, 72,
+ 48, 48, 48, 48, 195, 72, 72, 72, 9, 9, 9, 463, 11, 11, 11, 464,
+ 48, 48, 465, 191, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 269, 466, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 454, 467, 48, 62, 468, 72, 72, 72, 72, 72, 72, 72, 72, 48, 314,
+ 469, 48, 48, 470, 471, 447, 472, 473, 220, 48, 48, 474, 475, 48, 195, 191,
+ 476, 48, 477, 478, 479, 48, 48, 480, 220, 48, 48, 481, 482, 483, 484, 485,
+ 48, 97, 486, 487, 72, 72, 72, 72, 488, 489, 490, 48, 48, 491, 492, 191,
+ 493, 83, 84, 494, 495, 496, 497, 498, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 48, 48, 499, 500, 501, 72, 72, 48, 48, 48, 502, 503, 191, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 48, 48, 504, 505, 506, 507, 72, 72,
+ 48, 48, 48, 508, 509, 191, 510, 72, 48, 48, 511, 512, 191, 72, 72, 72,
+ 48, 172, 513, 514, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 48, 486, 515, 72, 72, 72, 72, 72, 72, 9, 9, 11, 11, 147, 516,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 517, 48, 48, 518, 519, 72,
+ 520, 48, 48, 521, 522, 523, 48, 48, 524, 525, 526, 72, 48, 48, 48, 195,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 84, 48, 504, 527, 528, 147, 174, 529, 48, 530, 531, 532, 72, 72, 72, 72,
+ 533, 48, 48, 534, 535, 191, 536, 48, 537, 538, 191, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 539,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 269, 540, 541, 542,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 206, 72, 72, 72, 72, 72, 72,
+ 270, 270, 270, 270, 270, 270, 543, 544, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 386, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 48, 199, 545, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 48, 48, 48, 314, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 48, 48, 195, 48, 199, 368, 72, 72, 72, 72, 72, 72, 48, 203, 546,
+ 48, 48, 48, 547, 548, 549, 550, 551, 48, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 9, 9, 11, 11, 269, 552, 72, 72, 72, 72, 72, 72,
+ 48, 48, 48, 48, 553, 554, 555, 555, 556, 557, 72, 72, 72, 72, 558, 72,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 400,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 559,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 199, 72, 72, 72, 559, 560, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 205,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 48, 48, 48, 48, 48, 71, 150, 195, 561, 562, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323,
+ 208, 208, 563, 208, 208, 208, 564, 565, 566, 208, 567, 208, 208, 208, 568, 72,
+ 208, 208, 208, 208, 569, 72, 72, 72, 72, 72, 72, 72, 72, 72, 269, 570,
+ 208, 208, 208, 208, 208, 285, 269, 451, 72, 72, 72, 72, 72, 72, 72, 72,
+ 9, 571, 11, 572, 573, 574, 240, 9, 575, 576, 577, 578, 579, 9, 571, 11,
+ 580, 581, 11, 582, 583, 584, 585, 9, 586, 11, 9, 571, 11, 572, 573, 11,
+ 240, 9, 575, 585, 9, 586, 11, 9, 571, 11, 587, 9, 588, 589, 590, 591,
+ 11, 592, 9, 593, 594, 595, 596, 11, 597, 9, 598, 11, 599, 600, 600, 600,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+ 32, 32, 32, 601, 32, 32, 602, 603, 604, 605, 45, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 606, 607, 608, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 48, 150, 609, 610, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 48, 611, 612,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 613, 614, 72, 72,
+ 9, 9, 575, 11, 615, 368, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 484, 269, 269, 616, 617, 72, 72, 72, 72,
+ 484, 269, 618, 619, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 620, 48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205, 72, 72, 72, 629,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323,
+ 174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631, 72, 72, 72, 632, 208,
+ 633, 208, 208, 324, 568, 634, 323, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 635,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 631, 286,
+ 208, 208, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 568, 324, 72,
+ 324, 208, 208, 208, 636, 175, 208, 208, 636, 208, 637, 72, 72, 72, 72, 72,
+ 638, 208, 208, 208, 208, 208, 208, 639, 208, 208, 640, 208, 641, 208, 208, 208,
+ 208, 208, 208, 208, 208, 322, 637, 642, 633, 323, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 314, 72, 72,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 203, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 643, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 72,
+ 48, 203, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 644, 72, 645, 645, 645, 645, 645, 645, 72, 72, 72, 72, 72, 72, 72, 72,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 646,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 647,
+ 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, 4, 5, 4, 5,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 0, 0, 7, 0,
+ 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 12, 11, 11, 11, 13, 11,
+ 14, 14, 14, 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 16, 17, 18, 17, 17, 19, 20, 21, 21, 22, 21, 23, 24,
+ 25, 26, 27, 27, 28, 29, 27, 30, 27, 27, 27, 27, 27, 31, 27, 27,
+ 32, 33, 33, 33, 34, 27, 27, 27, 35, 35, 35, 36, 37, 37, 37, 38,
+ 39, 39, 40, 41, 42, 43, 44, 45, 45, 45, 27, 46, 45, 47, 48, 27,
+ 49, 49, 49, 49, 49, 50, 51, 49, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
+ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
+ 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
+ 108, 109, 110, 110, 111, 112, 113, 110, 114, 115, 116, 117, 118, 119, 120, 121,
+ 122, 123, 123, 124, 123, 125, 45, 45, 126, 127, 128, 129, 130, 131, 45, 45,
+ 132, 132, 132, 132, 133, 132, 134, 135, 132, 133, 132, 136, 136, 137, 45, 45,
+ 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 140, 139, 139, 141,
+ 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+ 143, 143, 143, 143, 144, 145, 143, 143, 144, 143, 143, 146, 147, 148, 143, 143,
+ 143, 147, 143, 143, 143, 149, 143, 150, 143, 151, 152, 152, 152, 152, 152, 153,
+ 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+ 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+ 154, 154, 154, 154, 154, 154, 154, 154, 155, 156, 157, 157, 157, 157, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 168, 168, 168, 169, 170, 170,
+ 171, 172, 173, 173, 173, 173, 173, 174, 173, 173, 175, 154, 154, 154, 154, 176,
+ 177, 178, 179, 179, 180, 181, 182, 183, 184, 184, 185, 184, 186, 187, 168, 168,
+ 188, 189, 190, 190, 190, 191, 190, 192, 193, 193, 194, 195, 45, 45, 45, 45,
+ 196, 196, 196, 196, 197, 196, 196, 198, 199, 199, 199, 199, 200, 200, 200, 201,
+ 202, 202, 202, 203, 204, 205, 205, 205, 206, 139, 139, 207, 208, 209, 210, 211,
+ 4, 4, 212, 4, 4, 213, 214, 215, 4, 4, 4, 216, 8, 8, 8, 217,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 11, 218, 11, 11, 218, 219, 11, 220, 11, 11, 11, 221, 221, 222, 11, 223,
+ 224, 0, 0, 0, 0, 0, 225, 226, 227, 228, 0, 0, 45, 8, 8, 229,
+ 0, 0, 230, 231, 232, 0, 4, 4, 233, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 234, 45, 235, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 237, 0, 238, 0, 0, 0, 0, 0, 0,
+ 239, 239, 240, 239, 239, 240, 4, 4, 241, 241, 241, 241, 241, 241, 241, 242,
+ 139, 139, 140, 243, 243, 243, 244, 245, 143, 246, 247, 247, 247, 247, 14, 14,
+ 0, 0, 0, 0, 0, 45, 45, 45, 248, 249, 248, 248, 248, 248, 248, 250,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 45, 252,
+ 253, 0, 254, 255, 256, 257, 257, 257, 257, 258, 259, 260, 260, 260, 260, 261,
+ 262, 263, 263, 264, 142, 142, 142, 142, 265, 0, 263, 266, 0, 0, 267, 260,
+ 142, 265, 0, 0, 0, 0, 142, 268, 0, 0, 0, 0, 0, 260, 260, 269,
+ 260, 260, 260, 260, 260, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 0, 0, 0, 0,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 45,
+ 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271,
+ 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271,
+ 271, 271, 271, 271, 271, 271, 271, 271, 272, 271, 271, 271, 273, 274, 274, 274,
+ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
+ 275, 275, 276, 45, 14, 14, 14, 14, 14, 14, 277, 277, 277, 277, 277, 278,
+ 0, 0, 279, 4, 4, 4, 4, 4, 280, 4, 4, 4, 281, 45, 45, 282,
+ 283, 283, 284, 285, 286, 286, 286, 287, 288, 288, 288, 288, 289, 290, 49, 49,
+ 291, 291, 292, 293, 293, 294, 142, 295, 296, 296, 296, 296, 297, 298, 138, 299,
+ 300, 300, 300, 301, 302, 303, 138, 138, 304, 304, 304, 304, 305, 306, 307, 308,
+ 309, 310, 247, 4, 4, 311, 312, 152, 152, 152, 152, 152, 307, 307, 313, 314,
+ 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 315, 142, 316, 142, 142, 317,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 318, 248, 248, 248, 248, 248, 248, 319, 45, 45,
+ 320, 321, 21, 322, 323, 27, 27, 27, 27, 27, 27, 27, 324, 47, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 325, 45, 27, 27, 27, 27, 326, 27, 27, 327, 45, 45, 328,
+ 8, 285, 329, 0, 0, 330, 331, 332, 27, 27, 27, 27, 27, 27, 27, 333,
+ 334, 0, 1, 2, 1, 2, 335, 259, 260, 336, 142, 265, 337, 338, 339, 340,
+ 341, 342, 343, 344, 345, 345, 45, 45, 342, 342, 342, 342, 342, 342, 342, 346,
+ 347, 0, 0, 348, 11, 11, 11, 11, 349, 252, 350, 45, 45, 0, 0, 351,
+ 45, 45, 45, 45, 45, 45, 45, 45, 352, 353, 354, 354, 354, 355, 356, 252,
+ 357, 357, 358, 359, 360, 361, 361, 362, 363, 364, 365, 365, 366, 367, 45, 45,
+ 368, 368, 368, 368, 368, 369, 369, 369, 370, 371, 372, 373, 373, 374, 373, 375,
+ 376, 376, 377, 378, 378, 378, 379, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 381, 380, 382, 383, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 384, 385, 385, 386, 387, 388, 389, 389, 390, 391, 392, 45, 45, 45, 393, 394,
+ 395, 396, 397, 398, 45, 45, 45, 45, 399, 399, 400, 401, 400, 402, 400, 400,
+ 403, 404, 405, 406, 407, 407, 408, 408, 409, 409, 45, 45, 410, 410, 411, 412,
+ 413, 413, 413, 414, 415, 416, 417, 418, 419, 420, 421, 45, 45, 45, 45, 45,
+ 422, 422, 422, 422, 423, 45, 45, 45, 424, 424, 424, 425, 424, 424, 424, 426,
+ 427, 427, 428, 429, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 27, 430, 45, 45, 45, 45, 45, 45, 45, 45,
+ 431, 431, 432, 433, 433, 434, 45, 45, 45, 45, 45, 45, 45, 45, 435, 436,
+ 437, 437, 437, 437, 438, 439, 437, 440, 441, 441, 441, 441, 442, 443, 444, 445,
+ 446, 446, 446, 447, 448, 449, 449, 450, 451, 451, 451, 451, 452, 451, 453, 454,
+ 455, 456, 455, 457, 45, 45, 45, 45, 458, 459, 460, 461, 461, 461, 462, 463,
+ 464, 465, 466, 467, 468, 469, 470, 471, 45, 45, 45, 45, 45, 45, 45, 45,
+ 472, 472, 472, 472, 472, 473, 45, 45, 474, 474, 474, 474, 475, 476, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 477, 477, 477, 478, 477, 479, 45, 45,
+ 480, 480, 480, 480, 481, 482, 483, 45, 484, 484, 484, 485, 486, 45, 45, 45,
+ 487, 488, 489, 487, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 490, 490, 490, 491, 45, 45, 45, 45, 45, 45, 492, 492, 492, 492, 492, 493,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 494, 495, 495, 494, 496, 45,
+ 497, 497, 497, 497, 498, 499, 499, 499, 499, 499, 500, 45, 501, 501, 501, 502,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 503, 504, 504, 505, 506, 504, 507, 508, 508, 509, 510, 511, 45, 45, 45, 45,
+ 512, 513, 513, 514, 515, 516, 517, 518, 519, 520, 521, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 522, 523,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 524, 524, 524, 525,
+ 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 526, 526, 527, 45, 45, 45, 45, 45, 45,
+ 526, 526, 526, 526, 526, 526, 528, 529, 526, 526, 526, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 530, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531,
+ 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531,
+ 531, 531, 532, 533, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534,
+ 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534,
+ 534, 534, 534, 534, 535, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 536, 537, 538, 539, 45, 45, 45, 45, 45, 45, 540, 541, 542,
+ 543, 543, 543, 543, 544, 545, 546, 547, 543, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 548, 548, 548, 548, 548, 549, 45, 45, 45, 45, 45, 45,
+ 550, 550, 550, 550, 551, 550, 550, 550, 552, 550, 45, 45, 45, 45, 553, 45,
+ 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 555,
+ 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 556,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 557, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 558, 45, 45, 45, 559, 560, 561, 561, 561, 561, 561, 561, 561, 561, 561,
+ 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 562,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 563, 563, 563, 563, 563, 563, 564, 565, 566, 567, 267, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568,
+ 0, 0, 569, 0, 0, 0, 570, 571, 572, 0, 573, 0, 0, 0, 574, 45,
+ 11, 11, 11, 11, 575, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 267,
+ 0, 0, 0, 0, 0, 234, 0, 574, 45, 45, 45, 45, 45, 45, 45, 45,
+ 0, 0, 0, 0, 0, 225, 0, 0, 0, 576, 577, 578, 579, 0, 0, 0,
+ 580, 581, 0, 582, 583, 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 0, 0, 0,
+ 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586,
+ 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586,
+ 586, 586, 586, 586, 586, 586, 586, 586, 587, 588, 589, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 590, 591, 592, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 593, 593, 594, 595, 596, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 597, 597, 597, 598,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 600, 601, 45, 45,
+ 602, 602, 602, 602, 603, 604, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 334, 0, 0, 0, 605, 45, 45, 45, 45,
+ 334, 0, 0, 606, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 607, 27, 608, 609, 610, 611, 612, 613, 614, 615, 616, 615, 45, 45, 45, 324,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 0, 0, 252, 0, 0, 0, 0, 0, 0, 267, 227, 334, 334, 334, 0, 568,
+ 617, 0, 0, 0, 0, 0, 617, 0, 0, 0, 617, 45, 45, 45, 618, 0,
+ 619, 0, 0, 252, 574, 620, 568, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 617, 235,
+ 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 574, 252, 45,
+ 252, 0, 0, 0, 621, 285, 0, 0, 621, 0, 606, 45, 45, 45, 45, 45,
+ 622, 0, 0, 0, 0, 0, 0, 623, 0, 0, 624, 0, 625, 0, 0, 0,
+ 0, 0, 0, 0, 0, 267, 606, 626, 627, 568, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 628, 45, 45,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 629, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 318, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 630, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 631, 45,
+ 248, 318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 632, 45, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008,
+ 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0,
+ 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193,
+ 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303,
+ 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149,
+ 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175,
+ 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199,
+ 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0,
+ 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231,
+ 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258,
+ 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275,
+ 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093,
+ 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010,
+ 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347,
+ 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424,
+ 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365,
+ 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238,
+ 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182,
+ 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232,
+ 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461,
+ 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486,
+ 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0,
+ 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553,
+ 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560,
+ 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0,
+ 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0,
+ 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0,
+ 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0,
+ 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0,
+ 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0,
+ 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153,
+ 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171,
+ 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356,
+ 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214,
+ 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363,
+ 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251,
+ 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266,
+ 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287,
+ 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302,
+ 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0,
+ 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375,
+ 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353,
+ 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234,
+ 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403,
+ 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412,
+ 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0,
+ 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721,
+ 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0,
+ 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757,
+ 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776,
+ 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0,
+ 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793,
+ 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814,
+ 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0,
+ 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728,
+ 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764,
+ 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821,
+ 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0,
+ 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828,
+ 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833,
+ 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3,
+ 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0,
+ 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938,
+ 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0,
+ 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0,
+ 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0,
+ 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0,
+ 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0,
+ 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0,
+ 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0,
+ 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0,
+ 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601,
+ 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662,
+ 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168,
+ 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758,
+ 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585,
+ 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259,
+ 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697,
+ 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170,
+ 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330,
+ 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473,
+ 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603,
+ 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411,
+ 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583,
+ 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269,
+ 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510,
+ 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156,
+ 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0,
+ 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0,
+ 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773,
+ 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329,
+ 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548,
+ 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651,
+ 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0,
+ 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243,
+ 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362,
+ 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490,
+ 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586,
+ 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706,
+ 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848,
+ 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575,
+ 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0,
+ 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1948,1949,
+ 1950,1951,1952,1953,1954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1955,1956,1957,1959,1958,
+ 1960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131,
+ 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37,
+ 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179,
+ 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195,
+ 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216,
+ 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244,
+ 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259,
+ 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276,
+ 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934,
+ 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312,
+ 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334,
+ 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361,
+ 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381,
+ 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399,
+ 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417,
+ 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433,
+ 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460,
+ 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870,
+ 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505,
+ 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64,
+ 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538,
+ 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567,
+ 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592,
+ 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611,
+ 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627,
+ 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651,
+ 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83,
+ 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85,
+ 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696,
+ 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728,
+ 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90,
+ 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787,
+ 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807,
+ 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+static const int16_t
+_hb_ucd_i16[196] =
+{
+ 0, 0, 0, 0, 1, -1, 0, 0, 2, 0, -2, 0, 0, 0, 0, 2,
+ 0, -2, 0, 0, 0, 0, 0, 16, 0, 0, 0, -16, 0, 0, 1, -1,
+ 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 0, 3, 3, 3, -3,
+ -3, -3, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 2527, 1923, 1914, 1918, 0,
+ 2250, 0, 0, 0, 0, 0, 0, 138, 0, 7, 0, 0, -7, 0, 0, 0,
+ 1, -1, 1, -1, -1, 1, -1, 0, 1824, 0, 0, 0, 0, 0, 2104, 0,
+ 2108, 2106, 0, 2106, 1316, 0, 0, 0, 0, 1, -1, 1, -1, -138, 0, 0,
+ 1, -1, 8, 8, 8, 0, 7, 7, 0, 0, -8, -8, -8, -7, -7, 0,
+ 1, -1, 0, 2,-1316, 1, -1, 0, -1, 1, -1, 1, -1, 3, 1, -1,
+ -3, 1, -1, 1, -1, 0, 0,-1914,-1918, 0, 0,-1923,-1824, 0, 0, 0,
+ 0,-2016, 0, 0, 1, -1, 0, 1, 0, 0,-2104, 0, 0, 0, 0,-2106,
+ -2108,-2106, 0, 0, 1, -1,-2250, 0, 0, 0,-2527, 0, 0, -2, 0, 1,
+ -1, 0, 1, -1,
+};
+
+static inline uint_fast8_t
+_hb_ucd_gc (unsigned u)
+{
+ return u<1114110u?_hb_ucd_u8[2176+(((_hb_ucd_u16[((_hb_ucd_u8[u>>4>>5])<<5)+((u>>4)&31u)])<<4)+((u)&15u))]:2;
+}
+static inline uint_fast8_t
+_hb_ucd_ccc (unsigned u)
+{
+ return u<125259u?_hb_ucd_u8[14026+(((_hb_ucd_u8[13034+(((_hb_ucd_u8[12544+(u>>4>>4)])<<4)+((u>>4)&15u))])<<4)+((u)&15u))]:0;
+}
+static inline unsigned
+_hb_ucd_b4 (const uint8_t* a, unsigned i)
+{
+ return (a[i>>1]>>((i&1u)<<2))&15u;
+}
+static inline int_fast16_t
+_hb_ucd_bmg (unsigned u)
+{
+ return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[16170+(((_hb_ucd_b4(16042+_hb_ucd_u8,u>>2>>6))<<6)+((u>>2)&63u))])<<2)+((u)&3u)]:0;
+}
+static inline uint_fast8_t
+_hb_ucd_sc (unsigned u)
+{
+ return u<918000u?_hb_ucd_u8[18924+(((_hb_ucd_u16[3008+(((_hb_ucd_u8[17130+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:2;
+}
+static inline uint_fast16_t
+_hb_ucd_dm (unsigned u)
+{
+ return u<195102u?_hb_ucd_u16[6048+(((_hb_ucd_u8[29052+(u>>6)])<<6)+((u)&63u))]:0;
+}
+
+
+#elif !defined(HB_NO_UCD_UNASSIGNED)
+
+static const uint8_t
+_hb_ucd_u8[17198] =
+{
+ 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 14, 14, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 21, 23, 21, 21, 21, 21, 24, 7, 7,
+ 25, 26, 21, 21, 21, 21, 27, 28, 21, 21, 29, 30, 31, 32, 33, 34,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 35, 7, 36, 37, 7, 38, 7, 7, 7, 39, 21, 40,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 41, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 42,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 43,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43,
+ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 69, 72, 73,
+ 69, 69, 64, 74, 64, 64, 75, 76, 77, 78, 79, 80, 81, 82, 69, 83,
+ 84, 85, 86, 87, 88, 89, 69, 69, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 90, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 91,
+ 92, 34, 34, 34, 34, 34, 34, 34, 34, 93, 34, 34, 94, 95, 96, 97,
+ 98, 99,100,101,102,103,104,105, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,106,
+ 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108, 34, 34,109,110,111,112, 34, 34,113,114,115,116,117,118,
+ 119,120,121,122,123,124,125,126,127,128,129,123, 34, 34,130,123,
+ 131,132,133,134,135,136,137,138,139,140,141,123,142,123,143,144,
+ 145,146,147,148,149,150,151,123,152,153,123,154,155,156,157,123,
+ 158,159,123,160,161,162,123,123,163,164,165,166,123,167,123,168,
+ 34, 34, 34, 34, 34, 34, 34,169,170, 34,171,123,123,123,123,123,
+ 123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
+ 34, 34, 34, 34, 34, 34, 34, 34,172,123,123,123,123,123,123,123,
+ 123,123,123,123,123,123,123,123, 34, 34, 34, 34,173,123,123,123,
+ 34, 34, 34, 34,174,175,176,177,123,123,123,123,178,179,180,181,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,182,
+ 34, 34, 34, 34, 34,183,123,123,123,123,123,123,123,123,123,123,
+ 34, 34,184, 34, 34,185,123,123,123,123,123,123,123,123,123,123,
+ 123,123,123,123,123,123,123,123,186,187,123,123,123,123,123,123,
+ 69,188,189,190,191,192,193,123,194,195,196,197,198,199,200,201,
+ 69, 69, 69, 69,202,203,123,123,123,123,123,123,123,123,123,123,
+ 204,123,205,123,123,206,123,123,123,123,123,123,123,123,123,123,
+ 34,207,208,123,123,123,123,123,209,210,211,123,212,213,123,123,
+ 214,215,216,217,218,123, 69,219, 69, 69, 69, 69, 69,220,221,222,
+ 223,224,225,226,227,228,123,123,123,123,123,123,123,123,123,123,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,229, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,230, 34,
+ 231, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,232, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34,233,123,123,123,123,123,123,123,123,
+ 34, 34, 34, 34,234,123,123,123,123,123,123,123,123,123,123,123,
+ 235,123,236,237,123,123,123,123,123,123,123,123,123,123,123,123,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,238,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,239,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2,
+ 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 17, 18, 19, 1, 20, 20, 21, 22, 23, 24, 25,
+ 26, 27, 15, 2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32,
+ 32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11,
+ 11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11,
+ 34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34,
+ 34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32,
+ 32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32,
+ 16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41,
+ 40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41,
+ 43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 44, 45, 16, 10,
+ 44, 44, 41, 46, 11, 47, 47, 11, 34, 11, 11, 11, 11, 11, 11, 11,
+ 11, 48, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34,
+ 16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 49, 34, 32, 34, 11,
+ 32, 50, 43, 43, 51, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16,
+ 48, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 47, 52, 2, 2, 2,
+ 16, 16, 16, 16, 53, 54, 55, 56, 57, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 58, 59, 60, 43, 59, 44, 44, 44, 44,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 62,
+ 36, 63, 64, 44, 44, 44, 44, 44, 65, 65, 65, 8, 9, 66, 2, 67,
+ 43, 43, 43, 43, 43, 60, 68, 2, 69, 36, 36, 36, 36, 70, 43, 43,
+ 7, 7, 7, 7, 7, 2, 2, 36, 71, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 72, 43, 43, 43, 73, 50, 43, 43, 74, 75, 76, 43, 43, 36,
+ 7, 7, 7, 7, 7, 36, 77, 78, 2, 2, 2, 2, 2, 2, 2, 79,
+ 70, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 80, 62, 36,
+ 36, 36, 36, 43, 43, 43, 43, 43, 71, 44, 44, 44, 44, 44, 44, 44,
+ 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43,
+ 43, 43, 40, 21, 2, 81, 57, 20, 36, 36, 36, 43, 43, 75, 43, 43,
+ 43, 43, 75, 43, 75, 43, 43, 44, 2, 2, 2, 2, 2, 2, 2, 64,
+ 36, 36, 36, 36, 70, 43, 44, 64, 36, 36, 36, 36, 36, 61, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 61, 36, 36, 36, 36, 44,
+ 44, 57, 43, 43, 43, 43, 43, 43, 43, 82, 43, 43, 43, 43, 43, 43,
+ 43, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 71, 84,
+ 85, 43, 43, 43, 83, 84, 85, 84, 70, 43, 43, 43, 36, 36, 36, 36,
+ 36, 43, 2, 7, 7, 7, 7, 7, 86, 36, 36, 36, 36, 36, 36, 36,
+ 70, 84, 62, 36, 36, 36, 61, 62, 61, 62, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 61, 36, 36, 36, 61, 61, 44, 36, 36, 44, 71, 84,
+ 85, 43, 80, 87, 88, 87, 85, 61, 44, 44, 44, 87, 44, 44, 36, 62,
+ 36, 43, 44, 7, 7, 7, 7, 7, 36, 20, 27, 27, 27, 56, 63, 80,
+ 57, 83, 62, 36, 36, 61, 44, 62, 61, 36, 62, 61, 36, 44, 80, 84,
+ 85, 80, 44, 57, 80, 57, 43, 44, 57, 44, 44, 44, 62, 36, 61, 61,
+ 44, 44, 44, 7, 7, 7, 7, 7, 43, 36, 70, 64, 44, 44, 44, 44,
+ 57, 83, 62, 36, 36, 36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36,
+ 61, 36, 62, 36, 36, 44, 71, 84, 85, 43, 43, 57, 83, 87, 85, 44,
+ 61, 44, 44, 44, 44, 44, 44, 44, 66, 44, 44, 44, 62, 43, 43, 43,
+ 57, 84, 62, 36, 36, 36, 61, 62, 61, 36, 62, 36, 36, 44, 71, 85,
+ 85, 43, 80, 87, 88, 87, 85, 44, 44, 44, 44, 83, 44, 44, 36, 62,
+ 78, 27, 27, 27, 44, 44, 44, 44, 44, 71, 62, 36, 36, 61, 44, 36,
+ 61, 36, 36, 44, 62, 61, 61, 36, 44, 62, 61, 44, 36, 61, 44, 36,
+ 36, 36, 36, 36, 36, 44, 44, 84, 83, 88, 44, 84, 88, 84, 85, 44,
+ 61, 44, 44, 87, 44, 44, 44, 44, 27, 89, 67, 67, 56, 90, 44, 44,
+ 83, 84, 71, 36, 36, 36, 61, 36, 61, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 44, 62, 43, 83, 84, 88, 43, 80, 43, 43, 44,
+ 44, 44, 57, 80, 36, 61, 44, 44, 44, 44, 44, 91, 27, 27, 27, 89,
+ 70, 84, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 85,
+ 84, 84, 88, 83, 88, 84, 43, 44, 44, 44, 87, 88, 44, 44, 44, 61,
+ 62, 61, 44, 44, 44, 44, 44, 44, 43, 84, 62, 36, 36, 36, 61, 36,
+ 36, 36, 36, 36, 36, 70, 71, 84, 85, 43, 80, 84, 88, 84, 85, 77,
+ 44, 44, 36, 92, 27, 27, 27, 93, 27, 27, 27, 27, 89, 36, 36, 36,
+ 44, 84, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36,
+ 36, 62, 36, 36, 36, 36, 62, 44, 36, 36, 36, 61, 44, 80, 44, 87,
+ 84, 43, 80, 80, 84, 84, 84, 84, 44, 84, 64, 44, 44, 44, 44, 44,
+ 62, 36, 36, 36, 36, 36, 36, 36, 70, 36, 43, 43, 43, 80, 44, 94,
+ 36, 36, 36, 75, 43, 43, 43, 60, 7, 7, 7, 7, 7, 2, 44, 44,
+ 62, 61, 61, 36, 36, 61, 36, 36, 36, 36, 62, 62, 36, 36, 36, 36,
+ 70, 36, 43, 43, 43, 43, 71, 44, 36, 36, 61, 81, 43, 43, 43, 44,
+ 7, 7, 7, 7, 7, 44, 36, 36, 77, 67, 2, 2, 2, 2, 2, 2,
+ 2, 95, 95, 67, 43, 67, 67, 67, 7, 7, 7, 7, 7, 27, 27, 27,
+ 27, 27, 50, 50, 50, 4, 4, 84, 36, 36, 36, 36, 62, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 61, 44, 57, 43, 43, 43, 43, 43, 43, 83,
+ 43, 43, 60, 43, 36, 36, 70, 43, 43, 43, 43, 43, 57, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 80, 67, 67, 67, 67, 76, 67, 67, 90, 67,
+ 2, 2, 95, 67, 21, 64, 44, 44, 36, 36, 36, 36, 36, 92, 85, 43,
+ 83, 43, 43, 43, 85, 83, 85, 71, 7, 7, 7, 7, 7, 2, 2, 2,
+ 36, 36, 36, 84, 43, 36, 36, 43, 71, 84, 96, 92, 84, 84, 84, 36,
+ 70, 43, 71, 36, 36, 36, 36, 36, 36, 83, 85, 83, 84, 84, 85, 92,
+ 7, 7, 7, 7, 7, 84, 85, 67, 11, 11, 11, 48, 44, 44, 48, 44,
+ 16, 16, 16, 16, 16, 53, 45, 16, 36, 36, 36, 36, 61, 36, 36, 44,
+ 36, 36, 36, 61, 61, 36, 36, 44, 61, 36, 36, 44, 36, 36, 36, 61,
+ 61, 36, 36, 44, 36, 36, 36, 36, 36, 36, 36, 61, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 61, 57, 43, 2, 2, 2, 2, 97, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 98, 44, 67, 67, 67, 67, 67, 44, 44, 44,
+ 11, 11, 11, 44, 16, 16, 16, 44, 99, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 77, 72,100, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36,101,102, 44, 36, 36, 36, 36, 36, 63, 2,103,
+ 104, 36, 36, 36, 61, 44, 44, 44, 36, 36, 36, 36, 36, 36, 61, 36,
+ 36, 43, 80, 44, 44, 44, 44, 44, 36, 43, 60, 64, 44, 44, 44, 44,
+ 36, 43, 44, 44, 44, 44, 44, 44, 61, 43, 44, 44, 44, 44, 44, 44,
+ 36, 36, 43, 85, 43, 43, 43, 84, 84, 84, 84, 83, 85, 43, 43, 43,
+ 43, 43, 2, 86, 2, 66, 70, 44, 7, 7, 7, 7, 7, 44, 44, 44,
+ 27, 27, 27, 27, 27, 44, 44, 44, 2, 2, 2,105, 2, 59, 43, 68,
+ 36,106, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 44, 44,
+ 36, 36, 70, 71, 36, 36, 36, 36, 36, 36, 36, 36, 70, 61, 44, 44,
+ 36, 36, 36, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 61,
+ 43, 83, 84, 85, 83, 84, 44, 44, 84, 83, 84, 84, 85, 43, 44, 44,
+ 90, 44, 2, 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 44,
+ 36, 36, 61, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 44, 44,
+ 36, 36, 36, 36, 36, 44, 44, 44, 7, 7, 7, 7, 7, 98, 44, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 36, 36, 36, 70, 83, 85, 44, 2,
+ 36, 36, 92, 83, 43, 43, 43, 80, 83, 83, 85, 43, 43, 43, 83, 84,
+ 84, 85, 43, 43, 43, 43, 80, 57, 2, 2, 2, 86, 2, 2, 2, 44,
+ 43, 43, 43, 43, 43, 43, 43,107, 43, 43, 96, 36, 36, 36, 36, 36,
+ 36, 36, 83, 43, 43, 83, 83, 84, 84, 83, 96, 36, 36, 36, 44, 44,
+ 95, 67, 67, 67, 67, 50, 43, 43, 43, 43, 67, 67, 67, 67, 90, 44,
+ 43, 96, 36, 36, 36, 36, 36, 36, 92, 43, 43, 84, 43, 85, 43, 36,
+ 36, 36, 36, 83, 43, 84, 85, 85, 43, 84, 44, 44, 44, 44, 2, 2,
+ 36, 36, 84, 84, 84, 84, 43, 43, 43, 43, 84, 43, 44, 91, 2, 2,
+ 7, 7, 7, 7, 7, 44, 62, 36, 36, 36, 36, 36, 40, 40, 40, 2,
+ 16, 16, 16, 16,108, 44, 44, 44, 11, 11, 11, 11, 11, 47, 48, 11,
+ 2, 2, 2, 2, 44, 44, 44, 44, 43, 60, 43, 43, 43, 43, 43, 43,
+ 83, 43, 43, 43, 71, 36, 70, 36, 36, 36, 71, 92, 43, 61, 44, 44,
+ 16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 45, 16, 16,
+ 16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16,109, 40, 40,
+ 43, 43, 43, 43, 43, 57, 43, 43, 32, 32, 32, 16, 16, 16, 16, 32,
+ 16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 44, 11, 11, 11, 44,
+ 16, 16, 16, 16, 48, 48, 48, 48, 16, 16, 16, 16, 16, 16, 16, 44,
+ 16, 16, 16, 16,110,110,110,110, 16, 16,108, 16, 11, 11,111,112,
+ 41, 16,108, 16, 11, 11,111, 41, 16, 16, 44, 16, 11, 11,113, 41,
+ 16, 16, 16, 16, 11, 11,114, 41, 44, 16,108, 16, 11, 11,111,115,
+ 116,116,116,116,116,117, 65, 65,118,118,118, 2,119,120,119,120,
+ 2, 2, 2, 2,121, 65, 65,122, 2, 2, 2, 2,123,124, 2,125,
+ 126, 2,127,128, 2, 2, 2, 2, 2, 9,126, 2, 2, 2, 2,129,
+ 65, 65, 68, 65, 65, 65, 65, 65,130, 44, 27, 27, 27, 8,127,131,
+ 27, 27, 27, 27, 27, 8,127,102, 40, 40, 40, 40, 40, 40, 81, 44,
+ 20, 20, 20, 20, 20, 20, 20, 20, 43, 43, 43, 43, 43, 43,132, 51,
+ 133, 51,133, 43, 43, 43, 43, 43, 80, 44, 44, 44, 44, 44, 44, 44,
+ 67,134, 67,135, 67, 34, 11, 16, 11, 32,135, 67, 49, 11, 11, 67,
+ 67, 67,134,134,134, 11, 11,136, 11, 11, 35, 36, 39, 67, 16, 11,
+ 8, 8, 49, 16, 16, 26, 67,137, 27, 27, 27, 27, 27, 27, 27, 27,
+ 103,103,103,103,103,103,103,103,103,138,139,103,140, 67, 44, 44,
+ 8, 8,141, 67, 67, 8, 67, 67,141, 26, 67,141, 67, 67, 67,141,
+ 67, 67, 67, 67, 67, 67, 67, 8, 67,141,141, 67, 67, 67, 67, 67,
+ 67, 67, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 67, 67, 67, 67, 4, 4, 67, 67, 8, 67, 67, 67,142,143, 67, 67,
+ 67, 67, 67, 67, 67, 67,141, 67, 67, 67, 67, 67, 67, 26, 8, 8,
+ 8, 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8,
+ 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44,
+ 67, 67, 67, 67, 67, 90, 44, 44, 27, 27, 27, 27, 27, 27, 67, 67,
+ 67, 67, 67, 67, 67, 27, 27, 27, 67, 67, 67, 26, 67, 67, 67, 67,
+ 26, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 8,
+ 67, 67, 67, 67, 67, 67, 67, 26, 67, 67, 67, 67, 4, 4, 4, 4,
+ 4, 4, 4, 27, 27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67,
+ 8, 8,127,144, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4,
+ 8,127,145,145,145,145,145,145,145,145,145,145,144, 8, 8, 8,
+ 8, 8, 8, 8, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8,
+ 8, 8,141, 26, 8, 8,141, 67, 67, 67, 44, 67, 67, 67, 67, 67,
+ 67, 67, 67, 44, 67, 67, 67, 67, 11, 11, 11, 11, 11, 11, 11, 47,
+ 16, 16, 16, 16, 16, 16, 16,108, 32, 11, 32, 34, 34, 34, 34, 11,
+ 32, 32, 34, 16, 16, 16, 40, 11, 32, 32,137, 67, 67,135, 34,146,
+ 43, 32, 44, 44, 91, 2, 97, 2, 16, 16, 16,147, 44, 44,147, 44,
+ 36, 36, 36, 36, 44, 44, 44, 52, 64, 44, 44, 44, 44, 44, 44, 57,
+ 36, 36, 36, 61, 44, 44, 44, 44, 36, 36, 36, 61, 36, 36, 36, 61,
+ 2,119,119, 2,123,124,119, 2, 2, 2, 2, 6, 2,105,119, 2,
+ 119, 4, 4, 4, 4, 2, 2, 86, 2, 2, 2, 2, 2,118, 2, 2,
+ 105,148, 2, 2, 2, 2, 2, 2, 67, 67, 67, 67, 67, 55, 67, 67,
+ 67, 67, 44, 44, 44, 44, 44, 44, 67, 67, 67, 44, 44, 44, 44, 44,
+ 67, 67, 67, 67, 67, 67, 44, 44, 1, 2,149,150, 4, 4, 4, 4,
+ 4, 67, 4, 4, 4, 4,151,152,153,103,103,103,103, 43, 43, 84,
+ 154, 40, 40, 67,103,155, 63, 67, 36, 36, 36, 61, 57,156,157, 69,
+ 36, 36, 36, 36, 36, 63, 40, 69, 44, 44, 62, 36, 36, 36, 36, 36,
+ 67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90,
+ 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27,
+ 158, 27, 27, 27, 27, 27, 27, 27, 36, 36,106, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36,159, 2, 7, 7, 7, 7, 7, 36, 44, 44,
+ 32, 32, 32, 32, 32, 32, 32, 70, 51,160, 43, 43, 43, 43, 43, 86,
+ 32, 32, 32, 32, 32, 32, 40, 43, 36, 36, 36,103,103,103,103,103,
+ 43, 2, 2, 2, 44, 44, 44, 44, 41, 41, 41,157, 40, 40, 40, 40,
+ 41, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, 32, 32,
+ 45, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42,161, 34, 35,
+ 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 11, 11, 32,
+ 11, 11, 32, 32, 32, 32, 32, 32, 44, 32, 11, 47, 44, 44, 44, 44,
+ 44, 44, 44, 62, 40, 35, 36, 36, 36, 71, 36, 71, 36, 70, 36, 36,
+ 36, 92, 85, 83, 67, 67, 44, 44, 27, 27, 27, 67,162, 44, 44, 44,
+ 36, 36, 2, 2, 44, 44, 44, 44, 84, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 84, 84, 84, 84, 84, 84, 84, 84, 43, 44, 44, 44, 44, 2,
+ 43, 36, 36, 36, 2, 72, 72, 70, 36, 36, 36, 43, 43, 43, 43, 2,
+ 36, 36, 36, 70, 43, 43, 43, 43, 43, 84, 44, 44, 44, 44, 44, 91,
+ 36, 70, 84, 43, 43, 84, 43, 84,163, 2, 2, 2, 2, 2, 2, 52,
+ 7, 7, 7, 7, 7, 44, 44, 2, 36, 36, 70, 69, 36, 36, 36, 36,
+ 7, 7, 7, 7, 7, 36, 36, 61, 36, 36, 36, 36, 70, 43, 43, 83,
+ 85, 83, 85, 80, 44, 44, 44, 44, 36, 70, 36, 36, 36, 36, 83, 44,
+ 7, 7, 7, 7, 7, 44, 2, 2, 69, 36, 36, 77, 67, 92, 83, 36,
+ 71, 43, 71, 70, 71, 36, 36, 43, 70, 61, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 62,106, 2, 36, 36, 36, 36, 36, 92, 43, 84,
+ 2,106,164, 80, 44, 44, 44, 44, 62, 36, 36, 61, 62, 36, 36, 61,
+ 62, 36, 36, 61, 44, 44, 44, 44, 16, 16, 16, 16, 16,112, 40, 40,
+ 16, 16, 16, 16, 44, 44, 44, 44, 36, 92, 85, 84, 83,163, 85, 44,
+ 36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 44, 62, 36, 36,
+ 165,165,165,165,165,165,165,165,166,166,166,166,166,166,166,166,
+ 16, 16, 16,108, 44, 44, 44, 44, 44,147, 16, 16, 44, 44, 62, 71,
+ 36, 36, 36, 36,167, 36, 36, 36, 36, 36, 36, 61, 36, 36, 61, 61,
+ 36, 62, 61, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41,
+ 41, 44, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36,145, 44, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36,162, 44,
+ 2, 2, 2,168,128, 44, 44, 44, 6,169,170,145,145,145,145,145,
+ 145,145,128,168,128, 2,125,171, 2, 64, 2, 2,151,145,145,128,
+ 2,172, 8,173, 66, 2, 44, 44, 36, 36, 61, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 61, 79, 91, 2, 3, 2, 4, 5, 6, 2,
+ 16, 16, 16, 16, 16, 17, 18,127,128, 4, 2, 36, 36, 36, 36, 36,
+ 69, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40,
+ 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 61, 44,
+ 20,174, 56,175, 26, 8,141, 90, 44, 44, 44, 44, 79, 65, 67, 44,
+ 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 61, 36, 62,
+ 2, 64, 44,176, 27, 27, 27, 27, 27, 27, 44, 55, 67, 67, 67, 67,
+ 103,103,140, 27, 89, 67, 67, 67, 67, 67, 67, 67, 67, 27, 67, 90,
+ 90, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 50, 44,
+ 177, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 44, 44,
+ 27, 27, 44, 44, 44, 44, 62, 36,150, 36, 36, 36, 36,178, 44, 44,
+ 36, 36, 36, 43, 43, 80, 44, 44, 36, 36, 36, 36, 36, 36, 36, 91,
+ 36, 36, 44, 44, 36, 36, 36, 36,179,103,103, 44, 44, 44, 44, 44,
+ 11, 11, 11, 11, 16, 16, 16, 16, 11, 11, 44, 44, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 44, 44, 36, 36, 44, 44, 44, 44, 44, 91,
+ 36, 36, 36, 44, 61, 36, 36, 36, 36, 36, 36, 62, 61, 44, 61, 62,
+ 36, 36, 36, 91, 27, 27, 27, 27, 36, 36, 36, 77,158, 27, 27, 27,
+ 44, 44, 44,176, 27, 27, 27, 27, 36, 61, 36, 44, 44,176, 27, 27,
+ 36, 36, 36, 27, 27, 27, 44, 91, 36, 36, 36, 36, 36, 44, 44, 91,
+ 36, 36, 36, 36, 44, 44, 27, 36, 44, 27, 27, 27, 27, 27, 27, 27,
+ 70, 43, 57, 80, 44, 44, 43, 43, 36, 36, 62, 36, 62, 36, 36, 36,
+ 36, 36, 36, 44, 43, 80, 44, 57, 27, 27, 27, 27, 98, 44, 44, 44,
+ 2, 2, 2, 2, 64, 44, 44, 44, 36, 36, 36, 36, 36, 36,180, 30,
+ 36, 36, 36, 36, 36, 36,180, 27, 36, 36, 36, 36, 78, 36, 36, 36,
+ 36, 36, 70, 80, 44,176, 27, 27, 2, 2, 2, 64, 44, 44, 44, 44,
+ 36, 36, 36, 44, 91, 2, 2, 2, 36, 36, 36, 44, 27, 27, 27, 27,
+ 36, 61, 44, 44, 27, 27, 27, 27, 36, 44, 44, 44, 91, 2, 64, 44,
+ 44, 44, 44, 44,176, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44,
+ 16,108, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44,
+ 27, 27, 27, 27, 27, 27, 27, 98, 27, 27, 27, 93, 44, 44, 44, 44,
+ 177, 27, 30, 2, 2, 44, 44, 44, 85, 96, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 60, 2, 2, 2, 44,
+ 27, 27, 27, 7, 7, 7, 7, 7, 44, 44, 44, 44, 44, 44, 44, 57,
+ 84, 85, 43, 83, 85, 60,181, 2, 2, 44, 44, 44, 44, 44, 79, 44,
+ 43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 85, 43,
+ 43, 43, 80, 7, 7, 7, 7, 7, 2, 2, 92, 88, 44, 44, 44, 44,
+ 36, 70, 2, 61, 44, 44, 44, 44, 36, 92, 84, 43, 43, 43, 43, 83,
+ 96, 36, 63, 2, 59, 43, 60, 44, 7, 7, 7, 7, 7, 63, 63, 2,
+ 176, 27, 27, 27, 27, 27, 27, 27, 27, 27, 98, 44, 44, 44, 44, 44,
+ 36, 36, 36, 36, 36, 36, 84, 85, 43, 84, 83, 43, 2, 2, 2, 80,
+ 36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62,
+ 36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70,
+ 84, 85, 43, 43, 43, 80, 44, 44, 43, 84, 62, 36, 36, 36, 61, 62,
+ 61, 36, 62, 36, 36, 57, 71, 84, 83, 84, 88, 87, 88, 87, 84, 44,
+ 61, 44, 44, 87, 44, 44, 62, 36, 36, 84, 44, 43, 43, 43, 80, 44,
+ 43, 43, 80, 44, 44, 44, 44, 44, 36, 36, 92, 84, 43, 43, 43, 43,
+ 84, 43, 83, 71, 36, 63, 2, 2, 7, 7, 7, 7, 7, 91, 91, 71,
+ 84, 85, 43, 43, 83, 83, 84, 85, 83, 43, 36, 72, 44, 44, 44, 44,
+ 36, 36, 36, 36, 36, 36, 36, 92, 84, 43, 43, 44, 84, 84, 43, 85,
+ 60, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 43, 44,
+ 84, 85, 43, 43, 43, 83, 85, 85, 60, 2, 61, 44, 44, 44, 44, 44,
+ 2, 2, 2, 2, 2, 2, 64, 44, 36, 36, 36, 36, 36, 70, 85, 84,
+ 43, 43, 43, 85, 61, 44, 44, 44, 84, 43, 43, 85, 43, 43, 44, 44,
+ 7, 7, 7, 7, 7, 27, 2, 95, 43, 43, 43, 43, 85, 60, 44, 44,
+ 27, 98, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 44, 36, 36, 36,
+ 92, 84, 43, 43, 44, 43, 84, 84, 71, 72, 88, 44, 44, 44, 44, 44,
+ 70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 83, 70, 43, 60,
+ 2, 2, 2, 59, 44, 44, 44, 44, 70, 43, 43, 83, 85, 43, 36, 36,
+ 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 83, 43, 2, 72, 2,
+ 2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 85,
+ 63, 2, 2, 44, 44, 44, 44, 44, 2, 36, 36, 36, 36, 36, 36, 36,
+ 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 87, 43, 43, 43,
+ 83, 43, 85, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36,
+ 70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44,
+ 36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 84, 84, 88,
+ 43, 87, 85, 85, 61, 44, 44, 44, 36, 70, 83,163, 64, 44, 44, 44,
+ 27, 27, 89, 67, 67, 67, 56, 20,162, 67, 67, 67, 67, 67, 67, 67,
+ 67, 44, 44, 44, 44, 44, 44, 91,103,103,103,103,103,103,103,178,
+ 2, 2, 64, 44, 44, 44, 44, 44, 65, 65, 65, 65, 68, 44, 44, 44,
+ 43, 43, 60, 44, 44, 44, 44, 44, 43, 43, 43, 60, 2, 2, 67, 67,
+ 40, 40, 95, 44, 44, 44, 44, 44, 7, 7, 7, 7, 7,176, 27, 27,
+ 27, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 62, 36,
+ 27, 27, 27, 30, 2, 64, 44, 44, 36, 36, 36, 36, 36, 61, 44, 57,
+ 92, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 44, 44, 44, 57, 43, 74, 40, 40, 40, 40, 40, 40,
+ 40, 86, 44, 44, 44, 44, 44, 44, 36, 61, 44, 44, 44, 44, 44, 44,
+ 44, 44, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 44, 50, 60,
+ 65, 65, 44, 44, 44, 44, 44, 44, 67, 67, 67, 90, 55, 67, 67, 67,
+ 67, 67,182, 85, 43, 67,182, 84, 84,183, 65, 65, 65, 82, 43, 43,
+ 43, 76, 50, 43, 43, 43, 67, 67, 67, 67, 67, 67, 67, 43, 43, 67,
+ 67, 67, 67, 67, 90, 44, 44, 44, 67, 43, 76, 44, 44, 44, 44, 44,
+ 27, 27, 44, 44, 44, 44, 44, 44, 11, 11, 11, 11, 11, 16, 16, 16,
+ 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16,
+ 16, 16,108, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 47, 11, 44, 47, 48, 47, 48, 11, 47, 11,
+ 11, 11, 11, 16, 16,147,147, 16, 16, 16,147, 16, 16, 16, 16, 16,
+ 16, 16, 11, 48, 11, 47, 48, 11, 11, 11, 47, 11, 11, 11, 47, 16,
+ 16, 16, 16, 16, 11, 48, 11, 47, 11, 11, 47, 47, 44, 11, 11, 11,
+ 47, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11,
+ 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 44, 11, 11, 11, 11,
+ 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16,
+ 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16,
+ 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16,
+ 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 44, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 43, 43, 43, 76, 67, 50, 43, 43,
+ 43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67,
+ 67, 67, 76, 21, 2, 2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43,
+ 43, 43, 43, 80, 43, 43, 43, 43, 43, 43, 43, 43, 80, 57, 43, 43,
+ 43, 57, 80, 43, 43, 80, 44, 44, 43, 43, 43, 74, 40, 40, 40, 44,
+ 7, 7, 7, 7, 7, 44, 44, 77, 36, 36, 36, 36, 36, 36, 43, 43,
+ 7, 7, 7, 7, 7, 44, 44, 94, 36, 36, 61,176, 27, 27, 27, 27,
+ 43, 43, 43, 80, 44, 44, 44, 44, 16, 16, 43, 43, 43, 74, 44, 44,
+ 27, 27, 27, 27, 27, 27,158, 27,184, 27, 98, 44, 44, 44, 44, 44,
+ 27, 27, 27, 27, 27, 27, 27,158, 27, 27, 27, 27, 27, 27, 27, 44,
+ 36, 36, 62, 36, 36, 36, 36, 36, 62, 61, 61, 62, 62, 36, 36, 36,
+ 36, 61, 36, 36, 62, 62, 44, 44, 44, 61, 44, 62, 62, 62, 62, 36,
+ 62, 61, 61, 62, 62, 62, 62, 62, 62, 61, 61, 62, 36, 61, 36, 36,
+ 36, 61, 36, 36, 62, 36, 61, 61, 36, 36, 36, 36, 36, 62, 36, 36,
+ 62, 36, 62, 36, 36, 62, 36, 36, 8, 44, 44, 44, 44, 44, 44, 44,
+ 55, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44,
+ 44, 44, 44, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, 44, 44,
+ 67, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 25, 41, 41,
+ 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 67, 44,
+ 67, 67, 67, 67, 67, 67, 55, 67, 67, 55, 67, 90, 44, 67, 67, 67,
+ 67, 90, 55, 67, 67, 90, 44, 67, 67, 67, 67, 67, 67, 90, 55, 67,
+ 67, 67, 44, 44, 67, 90, 44, 44, 36, 44, 44, 44, 44, 44, 44, 44,
+ 79, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65, 65, 65, 65, 65,
+ 166,166,166,166,166,166,166, 44,166,166,166,166,166,166,166, 0,
+ 0, 0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13,
+ 25, 25, 25, 21, 21, 9, 9, 9, 9, 22, 21, 18, 24, 16, 24, 5,
+ 5, 5, 5, 22, 25, 18, 25, 0, 23, 23, 26, 21, 24, 26, 7, 20,
+ 25, 1, 26, 24, 26, 25, 15, 15, 24, 15, 7, 19, 15, 21, 9, 25,
+ 9, 5, 5, 25, 5, 9, 5, 7, 7, 7, 9, 8, 8, 5, 7, 5,
+ 6, 6, 24, 24, 6, 24, 12, 12, 2, 2, 6, 5, 9, 21, 9, 2,
+ 2, 9, 25, 9, 26, 12, 11, 11, 2, 6, 5, 21, 17, 2, 2, 26,
+ 26, 23, 2, 12, 17, 12, 21, 12, 12, 21, 7, 2, 2, 7, 7, 21,
+ 21, 2, 1, 1, 21, 23, 26, 26, 1, 2, 6, 7, 7, 12, 12, 7,
+ 21, 7, 12, 1, 12, 6, 6, 12, 12, 26, 7, 26, 26, 7, 2, 1,
+ 12, 2, 6, 2, 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 2, 10,
+ 10, 2, 15, 26, 26, 2, 2, 21, 7, 10, 15, 7, 2, 23, 21, 26,
+ 10, 7, 21, 15, 15, 2, 17, 7, 29, 7, 7, 22, 18, 2, 14, 14,
+ 14, 7, 17, 21, 7, 6, 11, 2, 5, 2, 5, 6, 8, 8, 8, 24,
+ 5, 24, 2, 24, 9, 24, 24, 2, 29, 29, 29, 1, 17, 17, 20, 19,
+ 22, 20, 27, 28, 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22,
+ 18, 21, 21, 29, 15, 6, 18, 6, 12, 11, 11, 12, 9, 26, 26, 9,
+ 26, 5, 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26,
+ 18, 25, 18, 22, 5, 12, 2, 5, 22, 21, 26, 6, 7, 14, 17, 22,
+ 18, 18, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, 6, 21,
+ 11, 21, 24, 9, 23, 26, 10, 21, 6, 10, 4, 4, 3, 3, 7, 25,
+ 21, 22, 17, 16, 16, 22, 16, 16, 25, 17, 25, 2, 25, 24, 23, 2,
+ 2, 15, 12, 15, 14, 2, 21, 14, 7, 15, 21, 1, 26, 10, 10, 1,
+ 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12,
+ 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20,
+ 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+ 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0,
+ 0, 0, 38, 39, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 0, 0, 6, 7, 8, 0, 9, 0, 10, 11, 0, 0, 12, 13,
+ 14, 15, 16, 0, 0, 0, 0, 17, 18, 19, 20, 0, 0, 0, 21, 22,
+ 0, 23, 24, 0, 0, 23, 25, 26, 0, 23, 25, 0, 0, 23, 25, 0,
+ 0, 23, 25, 0, 0, 0, 25, 0, 0, 0, 27, 0, 0, 23, 25, 0,
+ 0, 28, 25, 0, 0, 0, 29, 0, 0, 30, 31, 0, 0, 32, 33, 0,
+ 34, 35, 0, 36, 37, 0, 38, 0, 0, 39, 0, 0, 40, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 42, 42, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 44, 0, 0,
+ 0, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, 47, 0, 48, 0, 0,
+ 0, 49, 50, 51, 0, 52, 0, 53, 0, 54, 0, 0, 0, 0, 55, 56,
+ 0, 0, 0, 0, 0, 0, 57, 58, 0, 0, 0, 0, 0, 0, 59, 60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,
+ 0, 0, 0, 62, 0, 0, 0, 63, 0, 64, 0, 0, 65, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 67, 0, 0, 68,
+ 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 50, 70,
+ 0, 71, 72, 0, 0, 73, 74, 0, 0, 0, 0, 0, 0, 75, 76, 77,
+ 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0,
+ 78, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 81,
+ 0, 0, 0, 82, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 85,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 69, 62, 0, 88, 0, 0,
+ 89, 90, 0, 73, 0, 0, 91, 0, 0, 92, 0, 0, 0, 0, 0, 93,
+ 0, 94, 25, 95, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 97, 0,
+ 0, 0, 0, 0, 0, 62, 98, 0, 0, 62, 0, 0, 0, 99, 0, 0,
+ 0,100, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 74, 0, 42,101, 0,102, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0,
+ 0, 0,103, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,
+ 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,108,109,110, 0, 0, 0, 0,111, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,112,113, 0, 0, 0, 0, 0, 0,
+ 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 0,
+ 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10,
+ 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 0, 0, 0, 0,
+ 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 1,
+ 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36,
+ 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 38, 1, 39,
+ 14, 39, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0,
+ 0, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 0, 0,
+ 0, 0, 19, 1, 21, 0, 0, 47, 0, 0, 0, 0, 0, 38, 48, 1,
+ 1, 49, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0,
+ 0, 0, 0, 0, 52, 1, 1, 1, 53, 21, 43, 54, 55, 21, 35, 1,
+ 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 57, 58, 59, 0, 0,
+ 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,
+ 0, 0, 0, 57, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63,
+ 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0,
+ 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0,
+ 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0,
+ 0, 0, 0, 0, 0, 70, 71, 0, 0, 0, 0, 0, 72, 73, 74, 75,
+ 76, 77, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 79, 80, 0, 0, 0, 0, 47, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 63, 0, 0,
+ 0, 0, 0, 0, 64, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 19, 84, 0,
+ 63, 0, 0, 0, 0, 49, 1, 85, 0, 0, 0, 0, 1, 54, 15, 41,
+ 0, 0, 0, 0, 0, 56, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0,
+ 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0,
+ 0, 87, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0,
+ 0, 0, 0, 0, 88, 9, 12, 4, 89, 8, 90, 47, 0, 59, 50, 0,
+ 21, 1, 21, 91, 92, 1, 1, 1, 1, 1, 1, 1, 1, 93, 94, 95,
+ 0, 0, 0, 0, 96, 1, 97, 59, 81, 98, 99, 4, 59, 0, 0, 0,
+ 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,100,101, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,102, 0, 0, 0, 0, 19, 0, 1, 1, 50,
+ 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 50, 0, 0, 0,
+ 0, 64, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 50, 0, 0, 0,
+ 0, 0, 52, 69, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0,
+ 0, 0, 0, 0, 79, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,103,104, 59, 38, 81, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,
+ 1, 14, 4, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47,
+ 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 88, 0,
+ 0, 0, 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 62,
+ 0,108, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+ 0,109, 14, 54, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 0,
+ 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 0, 0,
+ 63, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 0, 0,
+ 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 56,
+ 0, 38, 1, 59, 1, 59, 0, 0, 64, 87, 0, 0, 0, 0, 0, 60,
+ 112, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,112, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0,
+ 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0,
+ 87,113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0,
+ 0, 0, 0, 0, 8, 90, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,114, 0,115,116,117,118, 0, 52, 4,
+ 119, 49, 23, 0, 0, 0, 0, 0, 0, 0, 38, 50, 0, 0, 0, 0,
+ 38, 59, 0, 0, 0, 0, 0, 0, 1, 88, 1, 1, 1, 1, 39, 1,
+ 48,103, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4,119, 0, 0, 0, 1,120, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,230,230,230,230,230,232,220,220,220,220,232,216,
+ 220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220,
+ 1, 1, 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220,
+ 220,220,230,230,230,220,220, 0,230,230,230,220,220,220,220,230,
+ 232,220,220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230,
+ 0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220,
+ 230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20,
+ 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0,
+ 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230,
+ 220,230,230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230,
+ 230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230,
+ 220,220,230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0,
+ 230,230, 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220,
+ 0, 0, 0,220,230,230, 0,220,230,220,220,220, 27, 28, 29,230,
+ 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0,
+ 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0,
+ 0, 0, 9, 0,103,103, 9, 0,107,107,107,107,118,118, 9, 0,
+ 122,122,122,122,220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0,
+ 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0,
+ 130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7,
+ 0, 9, 9, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220,
+ 220, 0, 0, 0,230, 0, 0,220, 0, 0, 9, 9, 0, 0, 7, 0,
+ 230,230,230, 0,230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,
+ 202,230,230,230,230,230,232,228,228,220, 0,230,233,220,230,220,
+ 230,230, 1, 1, 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1,
+ 0, 0,218,228,232,222,224,224, 0, 8, 8, 0,230, 0,230,230,
+ 220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0,
+ 0,230,220, 0, 0, 0,220,220, 0, 9, 7, 0, 0, 7, 9, 0,
+ 0, 0, 9, 7, 9, 9, 0, 0, 0, 0, 1, 0, 0,216,216, 1,
+ 1, 1, 0, 0, 0,226,216,216,216,216,216, 0,220,220,220, 0,
+ 230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19,
+ 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20,
+ 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, 0, 27, 0, 28,
+ 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 0, 0,
+ 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38,
+ 0, 0, 0, 0, 1, 2, 39, 40, 0, 1, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0,
+ 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0,
+ 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 11, 12,
+ 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19,
+ 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8,
+ 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27,
+ 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0,
+ 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 20, 20,
+ 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20,
+ 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20,
+ 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0,
+ 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, 0, 1, 0, 0,
+ 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45,
+ 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1,
+ 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 20, 20,
+ 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 12, 12, 12, 12, 13, 14,
+ 14, 14, 14, 15, 16, 17, 18, 19, 20, 14, 21, 14, 22, 14, 14, 14,
+ 14, 23, 24, 24, 25, 26, 14, 14, 14, 14, 27, 28, 14, 14, 29, 30,
+ 31, 32, 33, 34, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 35, 7, 36, 37, 7, 38, 7, 7,
+ 7, 39, 14, 40, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 41, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37,
+ 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59,
+ 59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65,
+ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 79, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 82,
+ 83, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
+ 97, 97, 97, 97, 97, 97, 97, 97, 70, 70, 98, 99,100,101,102,102,
+ 103,104,105,106,107,108,109,110,111,112, 97,113,114,115,116,117,
+ 118, 97,119,119,120, 97,121,122,123,124,125,126,127,128,129,130,
+ 131, 97,132, 97,133,134,135,136,137,138,139,140,141, 97,142,143,
+ 97,144,145,146,147, 97,148,149, 97,150,151,152, 97, 97,153,154,
+ 155,156, 97,157, 97,158,159,159,159,159,159,159,159,160,161,159,
+ 162, 97, 97, 97, 97, 97,163,163,163,163,163,163,163,163,164, 97,
+ 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,165,165,
+ 165,165,166, 97, 97, 97,167,167,167,167,168,169,170,171, 97, 97,
+ 97, 97,172,173,174,175,176,176,176,176,176,176,176,176,176,176,
+ 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+ 176,176,176,176,176,177,176,176,176,176,176,178, 97, 97, 97, 97,
+ 97, 97, 97, 97, 97, 97,179,180,181,182,182,183, 97, 97, 97, 97,
+ 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,184,185,
+ 97, 97, 97, 97, 97, 97, 59,186,187,188,189,190,191, 97,192,193,
+ 194, 59, 59,195, 59,196,197,197,197,197,197,198, 97, 97, 97, 97,
+ 97, 97, 97, 97, 97, 97,199, 97,200, 97, 97,201, 97, 97, 97, 97,
+ 97, 97, 97, 97, 97, 97,202,203,204, 97, 97, 97, 97, 97,205,206,
+ 207, 97,208,209, 97, 97,210,211,212,213,214, 97, 59, 59, 59, 59,
+ 59, 59, 59,215,216,217,218,219,220,221,222,223, 97, 97, 97, 97,
+ 97, 97, 97, 97, 97, 97, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70,224, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70,225, 70,226, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70,227, 70, 70, 70, 70, 70, 70, 70, 70, 70,228, 97, 97,
+ 97, 97, 97, 97, 97, 97, 70, 70, 70, 70,229, 97, 97, 97, 97, 97,
+ 97, 97, 97, 97, 97, 97,230, 97,231,232, 0, 1, 2, 2, 0, 1,
+ 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19,
+ 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19,
+ 19, 19, 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1,
+ 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2,
+ 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9,
+ 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 2, 9, 9, 9, 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 1, 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 0,
+ 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14,
+ 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3,
+ 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 3, 0, 0, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37,
+ 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95,
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37,
+ 37, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3,
+ 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
+ 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1,
+ 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 5, 5,
+ 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2,
+ 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2,
+ 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5,
+ 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2,
+ 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5,
+ 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11,
+ 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2,
+ 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2,
+ 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11,
+ 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11,
+ 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2,
+ 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 10,
+ 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10,
+ 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2,
+ 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10,
+ 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2,
+ 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10,
+ 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21,
+ 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2,
+ 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2,
+ 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21,
+ 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2,
+ 2, 2, 2, 2, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21,
+ 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22,
+ 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22,
+ 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 2,
+ 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22,
+ 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23,
+ 2, 2, 2, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2,
+ 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 2, 2, 2, 23, 23,
+ 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16,
+ 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2,
+ 2, 2, 2, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 2, 16, 16,
+ 16, 16, 2, 2, 16, 16, 2, 16, 16, 2, 2, 2, 2, 2, 20, 20,
+ 20, 20, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2,
+ 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 2, 2,
+ 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36,
+ 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, 2,
+ 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2,
+ 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18,
+ 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18,
+ 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18,
+ 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 25, 25,
+ 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25,
+ 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 8, 2, 2,
+ 2, 2, 2, 8, 2, 2, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12,
+ 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30, 2,
+ 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30,
+ 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30,
+ 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 2,
+ 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 2, 45, 45, 45, 45, 45, 45, 45, 2, 2, 2, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, 2, 2, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2,
+ 46, 46, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 2, 2, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32,
+ 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 2,
+ 2, 2, 2, 2, 2, 2, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28,
+ 28, 28, 28, 28, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 2, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2,
+ 2, 2, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 2, 2, 52, 52, 52, 52, 52, 2, 2, 2, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58,
+ 2, 2, 2, 2, 2, 2, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91,
+ 91, 91, 91, 2, 2, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91,
+ 91, 91, 91, 91, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 2, 62, 62,
+ 62, 62, 62, 2, 2, 2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 2, 2, 2, 2, 2, 2,
+ 2, 2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 2, 2,
+ 2, 70, 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73,
+ 73, 73, 73, 73, 73, 73, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8,
+ 8, 2, 2, 8, 8, 8, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19,
+ 19, 19, 19, 19, 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 9, 9, 9, 9,
+ 9, 19, 19, 19, 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 9, 1, 1, 2, 1, 1, 1, 1, 1, 9, 9,
+ 9, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9,
+ 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9,
+ 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19,
+ 19, 19, 19, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 19, 0, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0,
+ 0, 2, 2, 2, 2, 2, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0,
+ 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 2, 55, 55,
+ 55, 55, 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61,
+ 61, 61, 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2,
+ 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13,
+ 13, 13, 13, 13, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0,
+ 0, 0, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 1, 1, 1, 1, 12, 12, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 0, 0, 17, 17, 17, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 2, 26, 26, 26, 2, 2, 2, 2, 2, 12, 12,
+ 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, 17, 0, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39,
+ 39, 39, 39, 39, 39, 2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, 2, 2, 79, 79,
+ 79, 79, 79, 79, 79, 79, 0, 0, 19, 19, 19, 19, 19, 19, 0, 0,
+ 0, 19, 19, 19, 19, 19, 2, 2, 19, 19, 19, 19, 19, 2, 2, 2,
+ 2, 2, 2, 2, 2, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 65, 65,
+ 65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75,
+ 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 12, 12,
+ 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33,
+ 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 2, 68, 68, 68, 68, 68, 68, 2, 2, 68, 68,
+ 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 2, 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, 92, 92, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 30,
+ 30, 30, 30, 30, 30, 2, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 9, 19, 19, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87,
+ 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2,
+ 2, 12, 12, 12, 12, 12, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19,
+ 19, 19, 19, 19, 19, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2,
+ 2, 2, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 14, 14,
+ 14, 14, 14, 2, 14, 2, 14, 14, 2, 14, 14, 2, 14, 14, 3, 3,
+ 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 0, 0, 2, 2,
+ 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0,
+ 0, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 2, 2, 0, 2, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17,
+ 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2,
+ 12, 12, 12, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 2, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49,
+ 49, 49, 49, 49, 2, 2, 49, 49, 49, 2, 2, 2, 2, 2, 0, 0,
+ 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 9, 2,
+ 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 1, 0,
+ 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,118,118,
+ 118,118,118,118,118,118,118,118,118, 2, 2, 2, 2, 2, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 2, 2, 2, 2, 59, 59,
+ 59, 59, 59, 59, 2, 2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51,
+ 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 2, 2, 50, 50, 2, 2, 2, 2, 2, 2,135,135,
+ 135,135,135,135,135,135,135,135,135,135, 2, 2, 2, 2,106,106,
+ 106,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104,
+ 104,104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,104,110,110,
+ 110,110,110,110,110,110,110,110,110,110,110,110,110, 2,110,110,
+ 110,110,110,110, 2, 2, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 2, 81,120,120,
+ 120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116,
+ 116,116,116,116,116, 2, 2, 2, 2, 2, 2, 2, 2,116,128,128,
+ 128,128,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2,
+ 2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97,
+ 97, 97, 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, 97, 97, 2, 2,
+ 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 2,
+ 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, 57, 57, 2, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 2,
+ 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, 88, 88, 88, 88,117,117,
+ 117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112,
+ 112,112,112,112,112, 2, 2, 2, 2,112,112,112,112,112, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78,
+ 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 2, 2, 2, 2, 2,122,122,122,122,122,122,122,122,122,122,
+ 2, 2, 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2,122,
+ 122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89, 2,
+ 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,130,130,130,130,
+ 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,144,144,
+ 144,144,144,144,144,144,144,144, 2, 2, 2, 2, 2, 2, 3, 3,
+ 3, 3, 3, 3, 3, 2,147,147,147,147,147,147,147,147,148,148,
+ 148,148,148,148,148,148,148,148, 2, 2, 2, 2, 2, 2,149,149,
+ 149,149,149,149,149,149,149,149,149,149,149,149,149, 2, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2,
+ 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 85, 2, 2,101,101,101,101,101,101,101,101,101, 2,
+ 2, 2, 2, 2, 2, 2,101,101, 2, 2, 2, 2, 2, 2, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 2,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111, 2,100,100,100,100,100,100,100,100,100,100,
+ 100,100,100,100, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 2, 2, 2,108,108,108,108,108,108,108,108,108,108,
+ 2,108,108,108,108,108,108,108,108,108,108,108,108, 2,129,129,
+ 129,129,129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129,
+ 129,129,129,129,129,129,129,129,129,129,129,129, 2,129,129,129,
+ 2, 2, 2, 2, 2, 2,109,109,109,109,109,109,109,109,109,109,
+ 109, 2, 2, 2, 2, 2,109,109, 2, 2, 2, 2, 2, 2,107,107,
+ 107,107, 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2,
+ 2,107,107,107,107,107,107,107,107,107,107,107,107,107,107, 2,
+ 107,107,107,107,107,107,107, 2,107,107, 2,107,107,107,107,107,
+ 2, 1,107,107,107,107,107, 2, 2,107,107,107, 2, 2,107, 2,
+ 2, 2, 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107,
+ 107,107, 2, 2,107,107,107,107,107,107,107, 2, 2, 2,137,137,
+ 137,137,137,137,137,137,137,137, 2,137, 2,137,137,137,124,124,
+ 124,124,124,124,124,124,124,124, 2, 2, 2, 2, 2, 2,123,123,
+ 123,123,123,123,123,123,123,123,123,123,123,123, 2, 2,114,114,
+ 114,114,114,114,114,114,114,114,114,114,114, 2, 2, 2,114,114,
+ 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, 32, 2, 2, 2,102,102,
+ 102,102,102,102,102,102,102, 2, 2, 2, 2, 2, 2, 2,102,102,
+ 2, 2, 2, 2, 2, 2,126,126,126,126,126,126,126,126,126,126,
+ 126, 2, 2,126,126,126,126,126,126,126, 2, 2, 2, 2,142,142,
+ 142,142,142,142,142,142,142,142,142,142, 2, 2, 2, 2,125,125,
+ 125,125,125,125,125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2,125,150,150,150,150,150,150,150,150, 2, 2,
+ 150,150,150,150,150,150,150,150,150,150,150, 2, 2, 2,141,141,
+ 141,141,141,141,141,141,140,140,140,140,140,140,140,140,140,140,
+ 140, 2, 2, 2, 2, 2,121,121,121,121,121,121,121,121,121, 2,
+ 2, 2, 2, 2, 2, 2,133,133,133,133,133,133,133,133,133, 2,
+ 133,133,133,133,133,133,133,133,133,133,133,133,133, 2,133,133,
+ 133,133,133,133, 2, 2,133,133,133,133,133, 2, 2, 2,134,134,
+ 134,134,134,134,134,134, 2, 2,134,134,134,134,134,134, 2,134,
+ 134,134,134,134,134,134,134,134,134,134,134,134,134, 2,138,138,
+ 138,138,138,138,138, 2,138,138, 2,138,138,138,138,138,138,138,
+ 138,138,138,138,138,138, 2, 2,138, 2,138,138, 2,138,138,138,
+ 2, 2, 2, 2, 2, 2,143,143,143,143,143,143, 2,143,143, 2,
+ 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+ 143,143,143,143,143, 2,143,143, 2,143,143,143,143,143,143, 2,
+ 2, 2, 2, 2, 2, 2,143,143, 2, 2, 2, 2, 2, 2,145,145,
+ 145,145,145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2, 22, 22,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63,
+ 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63,
+ 63, 63, 2, 2, 2, 2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 2, 80, 2, 2, 2, 2, 2, 2, 2,127,127,
+ 127,127,127,127,127,127,127,127,127,127,127,127,127, 2, 79, 2,
+ 2, 2, 2, 2, 2, 2,115,115,115,115,115,115,115,115,115,115,
+ 115,115,115,115,115, 2,115,115, 2, 2, 2, 2,115,115,103,103,
+ 103,103,103,103,103,103,103,103,103,103,103,103, 2, 2,119,119,
+ 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2,119,119,
+ 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119,146,146,
+ 146,146,146,146,146,146,146,146,146, 2, 2, 2, 2, 2, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 2, 2,
+ 2, 2, 2, 2, 2, 99,136,139, 0, 0, 2, 2, 2, 2,136,136,
+ 136,136,136,136,136,136,136,136,136, 2, 2, 2, 2, 2, 17, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 17, 17, 17, 17,139,139,139,139,139,139,139,139,139,139,
+ 139,139, 2, 2, 2, 2,105,105,105,105,105,105,105,105,105,105,
+ 105, 2, 2, 2, 2, 2,105,105,105,105,105, 2, 2, 2,105, 2,
+ 2, 2, 2, 2, 2, 2,105,105, 2, 2,105,105,105,105, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
+ 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0,
+ 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0,
+ 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 0, 0, 0, 0,131,131,131,131,131,131,131,131,131,131,
+ 131,131, 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131,
+ 131,131,131,131,131,131, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56,
+ 2, 56, 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2,151,151,
+ 151,151,151,151,151,151,151,151,151,151,151, 2, 2, 2,151,151,
+ 151,151,151,151, 2, 2,151,151, 2, 2, 2, 2,151,151,152,152,
+ 152,152,152,152,152,152,152,152, 2, 2, 2, 2, 2,152,113,113,
+ 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113,
+ 113,113,113,113,113, 2,132,132,132,132,132,132,132,132,132,132,
+ 132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2,132,132, 0, 0,
+ 0, 0, 0, 2, 2, 2, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3,
+ 3, 2, 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2,
+ 3, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3,
+ 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3,
+ 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3,
+ 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0,
+ 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 13, 13,
+ 13, 13, 13, 13, 13, 2, 13, 13, 13, 13, 13, 2, 2, 2, 13, 2,
+ 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 16, 50,
+ 84,118, 88, 89, 90, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 91, 85, 85,
+ 220, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 94, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 15, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32,
+ 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0,
+ 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0,
+ 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0,
+ 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0,
+ 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68,
+ 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 104, 0, 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0,
+ 109, 0,110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0,
+ 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,118,119,120,121, 0,122,123,124,125,126, 0,127, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129,
+ 130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,
+ 146,147,148,149,150,151,152,153,154,155,156,157, 0, 0, 0,158,
+ 159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0,
+ 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,168,169, 0, 0, 0, 0,170,171, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172,173,
+ 174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,
+ 190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4,
+};
+static const uint16_t
+_hb_ucd_u16[8944] =
+{
+ 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12,
+ 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23,
+ 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31,
+ 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39,
+ 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13,
+ 13, 13, 13, 42, 9, 43, 11, 11, 44, 45, 32, 46, 47, 48, 49, 50,
+ 51, 52, 48, 48, 53, 32, 54, 55, 48, 48, 48, 48, 48, 56, 57, 58,
+ 59, 60, 48, 32, 61, 48, 48, 48, 48, 48, 62, 63, 64, 48, 65, 66,
+ 48, 67, 68, 69, 48, 70, 71, 72, 72, 72, 48, 73, 72, 74, 75, 32,
+ 76, 48, 48, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
+ 90, 83, 84, 91, 92, 93, 94, 95, 96, 97, 84, 98, 99, 100, 88, 101,
+ 102, 83, 84, 103, 104, 105, 88, 106, 107, 108, 109, 110, 111, 112, 94, 113,
+ 114, 115, 84, 116, 117, 118, 88, 119, 120, 115, 84, 121, 122, 123, 88, 124,
+ 125, 115, 48, 126, 127, 128, 88, 129, 130, 131, 48, 132, 133, 134, 94, 135,
+ 136, 48, 48, 137, 138, 139, 72, 72, 140, 48, 141, 142, 143, 144, 72, 72,
+ 145, 146, 147, 148, 149, 48, 150, 151, 152, 153, 32, 154, 155, 156, 72, 72,
+ 48, 48, 157, 158, 159, 160, 161, 162, 163, 164, 9, 9, 165, 11, 11, 166,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 167, 168, 48, 48,
+ 167, 48, 48, 169, 170, 171, 48, 48, 48, 170, 48, 48, 48, 172, 173, 174,
+ 48, 175, 9, 9, 9, 9, 9, 176, 177, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 178, 48, 179, 180, 48, 48, 48, 48, 181, 182,
+ 183, 184, 48, 185, 48, 186, 183, 187, 48, 48, 48, 188, 189, 190, 191, 192,
+ 193, 191, 48, 48, 194, 48, 48, 195, 196, 48, 197, 48, 48, 48, 48, 198,
+ 48, 199, 200, 201, 202, 48, 203, 204, 48, 48, 205, 48, 206, 207, 208, 208,
+ 48, 209, 48, 48, 48, 210, 211, 212, 191, 191, 213, 214, 72, 72, 72, 72,
+ 215, 48, 48, 216, 217, 159, 218, 219, 220, 48, 221, 64, 48, 48, 222, 223,
+ 48, 48, 224, 225, 226, 64, 48, 227, 228, 9, 9, 229, 230, 231, 232, 233,
+ 11, 11, 234, 27, 27, 27, 235, 236, 11, 237, 27, 27, 32, 32, 32, 238,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 239, 13, 13, 13, 13, 13, 13,
+ 240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249,
+ 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260, 72, 261, 262, 263,
+ 264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276,
+ 277, 277, 277, 277, 277, 277, 277, 277, 278, 208, 279, 208, 208, 208, 208, 280,
+ 208, 281, 277, 282, 208, 283, 284, 208, 208, 208, 285, 72, 286, 72, 269, 269,
+ 269, 287, 208, 208, 208, 208, 288, 269, 208, 208, 208, 208, 208, 208, 208, 208,
+ 208, 208, 208, 289, 290, 208, 208, 291, 208, 208, 208, 208, 208, 208, 292, 208,
+ 208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277,
+ 298, 299, 277, 277, 277, 300, 277, 301, 208, 208, 208, 277, 302, 208, 208, 303,
+ 208, 304, 208, 208, 208, 208, 208, 208, 9, 9, 305, 11, 11, 306, 307, 308,
+ 13, 13, 13, 13, 13, 13, 309, 310, 11, 11, 311, 48, 48, 48, 312, 313,
+ 48, 314, 315, 315, 315, 315, 32, 32, 316, 317, 318, 319, 320, 72, 72, 72,
+ 208, 321, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 323, 72, 324,
+ 325, 326, 327, 328, 136, 48, 48, 48, 48, 329, 177, 48, 48, 48, 48, 330,
+ 331, 48, 48, 136, 48, 48, 48, 48, 199, 332, 48, 71, 208, 208, 322, 48,
+ 208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208,
+ 48, 48, 48, 198, 208, 208, 208, 208, 48, 48, 48, 48, 48, 48, 48, 72,
+ 48, 337, 48, 48, 48, 48, 48, 48, 150, 208, 208, 208, 285, 48, 48, 227,
+ 338, 48, 339, 72, 13, 13, 340, 341, 13, 342, 48, 48, 48, 48, 343, 344,
+ 31, 345, 346, 347, 13, 13, 13, 348, 349, 350, 351, 352, 353, 72, 72, 354,
+ 355, 48, 356, 357, 48, 48, 48, 358, 359, 48, 48, 360, 361, 191, 32, 362,
+ 64, 48, 363, 48, 364, 365, 48, 150, 76, 48, 48, 366, 367, 368, 369, 370,
+ 48, 48, 371, 372, 373, 374, 48, 375, 48, 48, 48, 376, 377, 378, 379, 380,
+ 381, 382, 315, 11, 11, 383, 384, 11, 11, 11, 11, 11, 48, 48, 385, 191,
+ 48, 48, 386, 48, 387, 48, 48, 205, 388, 388, 388, 388, 388, 388, 388, 388,
+ 389, 389, 389, 389, 389, 389, 389, 389, 48, 48, 48, 48, 48, 48, 203, 48,
+ 48, 48, 48, 48, 48, 206, 72, 72, 390, 391, 392, 393, 394, 48, 48, 48,
+ 48, 48, 48, 395, 396, 397, 48, 48, 48, 48, 48, 398, 72, 48, 48, 48,
+ 48, 399, 48, 48, 400, 72, 72, 401, 32, 402, 32, 403, 404, 405, 406, 407,
+ 48, 48, 48, 48, 48, 48, 48, 408, 409, 2, 3, 4, 5, 410, 411, 412,
+ 48, 413, 48, 199, 414, 415, 416, 417, 418, 48, 171, 419, 203, 203, 72, 72,
+ 48, 48, 48, 48, 48, 48, 48, 71, 420, 269, 269, 421, 270, 270, 270, 422,
+ 423, 324, 424, 72, 72, 208, 208, 425, 72, 72, 72, 72, 72, 72, 72, 72,
+ 48, 150, 48, 48, 48, 100, 426, 427, 48, 48, 428, 48, 429, 48, 48, 430,
+ 48, 431, 48, 48, 432, 433, 72, 72, 9, 9, 434, 11, 11, 48, 48, 48,
+ 48, 203, 191, 9, 9, 435, 11, 436, 48, 48, 400, 48, 48, 48, 437, 72,
+ 48, 48, 48, 314, 48, 198, 400, 72, 438, 48, 48, 439, 48, 440, 48, 441,
+ 48, 199, 442, 72, 72, 72, 48, 443, 48, 444, 48, 445, 72, 72, 72, 72,
+ 48, 48, 48, 446, 269, 447, 269, 269, 448, 449, 48, 450, 451, 452, 48, 453,
+ 48, 454, 72, 72, 455, 48, 456, 457, 48, 48, 48, 458, 48, 459, 48, 460,
+ 48, 461, 462, 72, 72, 72, 72, 72, 48, 48, 48, 48, 195, 72, 72, 72,
+ 9, 9, 9, 463, 11, 11, 11, 464, 48, 48, 465, 191, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 269, 466, 48, 454, 467, 48, 62, 468, 72, 72,
+ 72, 72, 72, 72, 72, 72, 48, 314, 469, 48, 48, 470, 471, 447, 472, 473,
+ 220, 48, 48, 474, 475, 48, 195, 191, 476, 48, 477, 478, 479, 48, 48, 480,
+ 220, 48, 48, 481, 482, 483, 484, 485, 48, 97, 486, 487, 72, 72, 72, 72,
+ 488, 489, 490, 48, 48, 491, 492, 191, 493, 83, 84, 494, 495, 496, 497, 498,
+ 48, 48, 48, 499, 500, 501, 72, 72, 48, 48, 48, 502, 503, 191, 72, 72,
+ 48, 48, 504, 505, 506, 507, 72, 72, 48, 48, 48, 508, 509, 191, 510, 72,
+ 48, 48, 511, 512, 191, 72, 72, 72, 48, 172, 513, 514, 72, 72, 72, 72,
+ 48, 48, 486, 515, 72, 72, 72, 72, 72, 72, 9, 9, 11, 11, 147, 516,
+ 72, 72, 517, 48, 48, 518, 519, 72, 520, 48, 48, 521, 522, 523, 48, 48,
+ 524, 525, 526, 72, 48, 48, 48, 195, 84, 48, 504, 527, 528, 147, 174, 529,
+ 48, 530, 531, 532, 72, 72, 72, 72, 533, 48, 48, 534, 535, 191, 536, 48,
+ 537, 538, 191, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 539,
+ 72, 72, 72, 72, 269, 540, 541, 542, 48, 206, 72, 72, 72, 72, 72, 72,
+ 270, 270, 270, 270, 270, 270, 543, 544, 48, 48, 48, 48, 386, 72, 72, 72,
+ 48, 48, 199, 545, 72, 72, 72, 72, 48, 48, 48, 48, 314, 72, 72, 72,
+ 48, 48, 48, 195, 48, 199, 368, 72, 72, 72, 72, 72, 72, 48, 203, 546,
+ 48, 48, 48, 547, 548, 549, 550, 551, 48, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 9, 9, 11, 11, 269, 552, 72, 72, 72, 72, 72, 72,
+ 48, 48, 48, 48, 553, 554, 555, 555, 556, 557, 72, 72, 72, 72, 558, 72,
+ 48, 48, 48, 48, 48, 48, 48, 400, 48, 48, 48, 48, 48, 48, 48, 559,
+ 48, 199, 72, 72, 72, 559, 560, 48, 48, 48, 48, 48, 48, 48, 48, 205,
+ 48, 48, 48, 48, 48, 48, 71, 150, 195, 561, 562, 72, 72, 72, 72, 72,
+ 208, 208, 208, 208, 208, 208, 208, 323, 208, 208, 563, 208, 208, 208, 564, 565,
+ 566, 208, 567, 208, 208, 208, 568, 72, 208, 208, 208, 208, 569, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 269, 570, 208, 208, 208, 208, 208, 285, 269, 451,
+ 9, 571, 11, 572, 573, 574, 240, 9, 575, 576, 577, 578, 579, 9, 571, 11,
+ 580, 581, 11, 582, 583, 584, 585, 9, 586, 11, 9, 571, 11, 572, 573, 11,
+ 240, 9, 575, 585, 9, 586, 11, 9, 571, 11, 587, 9, 588, 589, 590, 591,
+ 11, 592, 9, 593, 594, 595, 596, 11, 597, 9, 598, 11, 599, 600, 600, 600,
+ 32, 32, 32, 601, 32, 32, 602, 603, 604, 605, 45, 72, 72, 72, 72, 72,
+ 606, 607, 608, 72, 72, 72, 72, 72, 48, 48, 150, 609, 610, 72, 72, 72,
+ 72, 72, 72, 72, 48, 48, 611, 612, 48, 48, 48, 48, 613, 614, 72, 72,
+ 9, 9, 575, 11, 615, 368, 72, 72, 72, 72, 72, 72, 72, 72, 72, 484,
+ 269, 269, 616, 617, 72, 72, 72, 72, 484, 269, 618, 619, 72, 72, 72, 72,
+ 620, 48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205, 72, 72, 72, 629,
+ 208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323,
+ 174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631, 72, 72, 72, 632, 208,
+ 633, 208, 208, 324, 568, 634, 323, 72, 208, 208, 208, 208, 208, 208, 208, 635,
+ 208, 208, 208, 208, 208, 323, 631, 286, 208, 208, 208, 208, 208, 208, 208, 322,
+ 208, 208, 208, 208, 208, 568, 324, 72, 324, 208, 208, 208, 636, 175, 208, 208,
+ 636, 208, 637, 72, 72, 72, 72, 72, 638, 208, 208, 208, 208, 208, 208, 639,
+ 208, 208, 640, 208, 641, 208, 208, 208, 208, 208, 208, 208, 208, 322, 637, 642,
+ 633, 323, 72, 72, 72, 72, 72, 72, 48, 48, 48, 48, 48, 314, 72, 72,
+ 48, 48, 48, 204, 48, 48, 48, 48, 48, 203, 48, 48, 48, 48, 48, 48,
+ 48, 48, 643, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 72,
+ 48, 203, 72, 72, 72, 72, 72, 72, 644, 72, 645, 645, 645, 645, 645, 645,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72,
+ 389, 389, 389, 389, 389, 389, 389, 646, 389, 389, 389, 389, 389, 389, 389, 647,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3,
+ 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11,
+ 12, 13, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 20, 21, 21, 21, 22, 20, 21, 21, 21, 21,
+ 21, 23, 24, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 27, 28, 26,
+ 29, 30, 31, 32, 31, 31, 31, 31, 33, 34, 35, 31, 31, 31, 36, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 31, 31, 31, 31,
+ 37, 38, 37, 37, 37, 37, 37, 37, 37, 39, 31, 31, 31, 31, 31, 31,
+ 40, 40, 40, 40, 40, 40, 41, 26, 42, 42, 42, 42, 42, 42, 42, 43,
+ 44, 44, 44, 44, 44, 45, 44, 46, 47, 47, 47, 48, 37, 49, 26, 26,
+ 26, 26, 26, 26, 31, 31, 50, 51, 26, 26, 52, 31, 53, 31, 31, 31,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 54, 56, 54, 54, 54,
+ 57, 58, 59, 60, 60, 61, 62, 63, 58, 64, 65, 66, 67, 60, 60, 68,
+ 69, 70, 71, 72, 72, 73, 74, 75, 70, 76, 77, 78, 79, 72, 80, 26,
+ 81, 82, 83, 84, 84, 85, 86, 87, 82, 88, 89, 26, 90, 84, 91, 92,
+ 93, 94, 95, 96, 96, 97, 98, 99, 94, 100, 101, 102, 103, 96, 96, 26,
+ 104, 105, 106, 107, 108, 105, 109, 110, 105, 106, 111, 26, 112, 109, 109, 113,
+ 114, 115, 116, 114, 114, 116, 114, 117, 115, 118, 119, 120, 121, 114, 122, 114,
+ 123, 124, 125, 123, 123, 125, 126, 127, 124, 128, 129, 130, 131, 123, 132, 26,
+ 133, 134, 135, 136, 136, 136, 136, 136, 134, 135, 137, 136, 138, 136, 136, 136,
+ 139, 140, 141, 142, 140, 140, 143, 144, 141, 145, 146, 140, 147, 140, 148, 26,
+ 149, 150, 150, 150, 150, 150, 150, 151, 150, 150, 150, 152, 26, 26, 26, 26,
+ 153, 154, 155, 155, 156, 155, 155, 157, 158, 157, 155, 159, 26, 26, 26, 26,
+ 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160, 162, 161, 160,
+ 160, 160, 160, 161, 160, 160, 160, 163, 160, 163, 164, 165, 26, 26, 26, 26,
+ 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+ 166, 166, 166, 166, 167, 167, 167, 167, 168, 169, 167, 167, 167, 167, 167, 170,
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+ 172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 174, 173, 172, 172, 172, 172,
+ 172, 173, 172, 172, 172, 172, 173, 174, 173, 172, 174, 172, 172, 172, 172, 172,
+ 172, 172, 173, 172, 172, 172, 172, 172, 172, 172, 172, 175, 172, 172, 172, 176,
+ 172, 172, 172, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 179,
+ 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
+ 181, 181, 181, 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 183, 185,
+ 186, 187, 188, 26, 189, 189, 190, 26, 191, 191, 192, 26, 193, 194, 195, 26,
+ 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 196, 198, 196, 198,
+ 199, 200, 201, 202, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 203,
+ 201, 201, 201, 201, 201, 204, 180, 180, 180, 180, 180, 180, 180, 180, 205, 26,
+ 206, 206, 206, 207, 206, 208, 206, 208, 209, 206, 210, 210, 210, 211, 212, 26,
+ 213, 213, 213, 213, 213, 214, 213, 213, 213, 215, 213, 216, 196, 196, 196, 196,
+ 217, 217, 217, 218, 219, 219, 219, 219, 219, 219, 219, 220, 219, 219, 219, 221,
+ 219, 222, 219, 222, 219, 223, 9, 224, 26, 26, 26, 26, 26, 26, 26, 26,
+ 225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 225, 225, 225, 225, 225, 227,
+ 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 230, 231,
+ 232, 232, 232, 232, 232, 232, 232, 233, 232, 234, 235, 235, 235, 235, 235, 235,
+ 18, 236, 167, 167, 167, 167, 167, 237, 228, 26, 238, 9, 239, 240, 241, 242,
+ 2, 2, 2, 2, 243, 244, 2, 2, 2, 2, 2, 245, 246, 247, 2, 248,
+ 2, 2, 2, 2, 2, 2, 2, 249, 9, 9, 9, 9, 9, 9, 9, 250,
+ 14, 14, 251, 251, 14, 14, 14, 14, 251, 251, 14, 252, 14, 14, 14, 251,
+ 14, 14, 14, 14, 14, 14, 253, 14, 253, 14, 254, 255, 14, 14, 256, 257,
+ 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 260, 261,
+ 0, 262, 2, 263, 0, 0, 0, 0, 26, 26, 9, 9, 9, 9, 264, 26,
+ 0, 0, 0, 0, 265, 266, 4, 0, 0, 267, 0, 0, 2, 2, 2, 2,
+ 2, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 262, 26, 26, 26, 0, 269, 26, 26, 0, 0, 0, 0,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0,
+ 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 273, 273, 273, 273, 273, 274, 273, 273, 273, 273, 273, 274, 2, 2, 2, 2,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 275, 276,
+ 167, 167, 167, 167, 168, 169, 277, 277, 277, 277, 277, 277, 277, 278, 279, 278,
+ 172, 172, 174, 26, 174, 174, 174, 174, 174, 174, 174, 174, 18, 18, 18, 18,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26,
+ 280, 280, 280, 281, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 282, 26,
+ 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+ 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 26, 26, 26, 0, 284,
+ 285, 0, 0, 0, 286, 287, 0, 288, 289, 290, 290, 290, 290, 290, 290, 290,
+ 290, 290, 291, 292, 293, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 295,
+ 296, 297, 297, 297, 297, 297, 298, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+ 171, 299, 0, 0, 297, 297, 297, 300, 0, 0, 0, 0, 284, 26, 294, 294,
+ 171, 171, 171, 299, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 301,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 294, 294, 294, 294, 302,
+ 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 0, 0, 0, 0, 0,
+ 280, 280, 280, 280, 280, 280, 283, 26, 0, 0, 0, 0, 0, 0, 0, 0,
+ 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 26, 26,
+ 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
+ 303, 304, 303, 303, 303, 303, 303, 303, 305, 26, 306, 306, 306, 306, 306, 306,
+ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
+ 307, 307, 307, 307, 307, 308, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 26,
+ 0, 0, 0, 0, 310, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 311, 2, 2, 2, 2, 2, 2, 312, 26, 26, 26, 26, 26, 313, 2,
+ 314, 314, 314, 314, 314, 315, 0, 316, 317, 317, 317, 317, 317, 317, 317, 26,
+ 318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 318, 321, 54, 54, 54, 54,
+ 322, 322, 322, 322, 322, 323, 324, 324, 324, 324, 325, 326, 171, 171, 171, 327,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 329, 328, 330, 166, 166, 166, 331,
+ 332, 332, 332, 332, 332, 332, 333, 26, 332, 334, 332, 335, 166, 166, 166, 166,
+ 336, 336, 336, 336, 336, 336, 336, 336, 337, 26, 26, 338, 339, 339, 340, 26,
+ 341, 341, 341, 26, 174, 174, 2, 2, 2, 2, 2, 342, 343, 26, 178, 178,
+ 178, 178, 178, 178, 178, 178, 178, 178, 339, 339, 339, 339, 339, 344, 339, 345,
+ 171, 171, 171, 171, 346, 26, 171, 171, 299, 347, 171, 171, 171, 171, 171, 346,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 280, 280,
+ 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 348, 26, 26, 26, 26,
+ 349, 26, 350, 351, 25, 25, 352, 353, 354, 25, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 355, 26, 52, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 356, 26, 26, 31, 31, 31, 31, 31, 31,
+ 31, 31, 357, 31, 31, 31, 31, 31, 31, 26, 26, 26, 26, 26, 31, 51,
+ 9, 9, 0, 316, 9, 358, 0, 0, 0, 0, 359, 0, 262, 284, 50, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 360,
+ 361, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 362, 294, 293, 294,
+ 294, 294, 294, 363, 171, 171, 171, 299, 364, 364, 364, 365, 262, 262, 26, 366,
+ 367, 368, 367, 367, 369, 367, 367, 370, 367, 371, 367, 371, 26, 26, 26, 26,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 372,
+ 373, 0, 0, 0, 0, 0, 374, 0, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 257, 0, 284, 375, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 376,
+ 377, 377, 377, 378, 379, 379, 379, 379, 379, 379, 380, 26, 381, 0, 0, 284,
+ 382, 382, 382, 382, 383, 384, 385, 385, 385, 386, 387, 387, 387, 387, 387, 388,
+ 389, 389, 389, 390, 391, 391, 391, 391, 392, 391, 393, 26, 26, 26, 26, 26,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 395, 395, 395, 395, 395,
+ 396, 396, 396, 397, 396, 398, 399, 399, 399, 399, 400, 399, 399, 399, 399, 400,
+ 401, 401, 401, 401, 401, 26, 402, 402, 402, 402, 402, 402, 403, 404, 26, 26,
+ 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405,
+ 405, 405, 405, 405, 405, 405, 406, 26, 405, 405, 407, 26, 405, 26, 26, 26,
+ 408, 409, 410, 410, 410, 410, 411, 412, 413, 413, 414, 413, 415, 415, 415, 415,
+ 416, 416, 416, 417, 418, 416, 26, 26, 26, 26, 26, 26, 419, 419, 420, 421,
+ 422, 422, 422, 423, 424, 424, 424, 425, 26, 26, 26, 26, 26, 26, 26, 26,
+ 426, 426, 426, 426, 427, 427, 427, 428, 427, 427, 429, 427, 427, 427, 427, 427,
+ 430, 431, 432, 433, 434, 434, 435, 436, 434, 437, 434, 437, 438, 438, 438, 438,
+ 439, 439, 439, 439, 26, 26, 26, 26, 440, 440, 440, 440, 441, 442, 441, 26,
+ 443, 443, 443, 443, 443, 443, 444, 445, 446, 446, 447, 446, 448, 448, 449, 448,
+ 450, 450, 451, 452, 26, 453, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 454, 454, 454, 454, 454, 454, 454, 454, 454, 455, 26, 26, 26, 26, 26, 26,
+ 456, 456, 456, 456, 456, 456, 457, 26, 456, 456, 456, 456, 456, 456, 457, 458,
+ 459, 459, 459, 459, 459, 26, 459, 460, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 461,
+ 462, 462, 462, 462, 462, 26, 463, 463, 463, 463, 463, 464, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 465, 465, 466, 26,
+ 467, 467, 467, 467, 467, 467, 467, 467, 467, 468, 469, 467, 467, 467, 26, 470,
+ 471, 471, 471, 471, 471, 471, 471, 471, 472, 473, 474, 474, 474, 475, 474, 476,
+ 477, 477, 477, 477, 477, 477, 478, 477, 479, 26, 480, 480, 480, 480, 481, 26,
+ 482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 482, 482, 484, 140, 485, 26,
+ 486, 486, 487, 486, 486, 486, 486, 488, 26, 26, 26, 26, 26, 26, 26, 26,
+ 489, 490, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 494, 495, 494, 496,
+ 497, 498, 499, 500, 500, 501, 502, 503, 498, 504, 505, 506, 507, 508, 508, 26,
+ 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 510, 26, 26, 26, 26,
+ 511, 511, 511, 511, 511, 511, 511, 511, 511, 26, 511, 512, 26, 26, 26, 26,
+ 513, 513, 513, 513, 513, 513, 514, 513, 513, 513, 513, 514, 26, 26, 26, 26,
+ 515, 515, 515, 515, 515, 515, 515, 515, 516, 26, 515, 517, 201, 518, 26, 26,
+ 519, 519, 519, 519, 519, 519, 519, 520, 519, 521, 26, 26, 26, 26, 26, 26,
+ 522, 522, 522, 523, 522, 524, 522, 522, 26, 26, 26, 26, 26, 26, 26, 26,
+ 525, 525, 525, 525, 525, 525, 525, 526, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 528, 529,
+ 26, 26, 26, 26, 530, 531, 530, 530, 530, 530, 530, 531, 532, 26, 26, 26,
+ 533, 533, 533, 533, 533, 533, 533, 533, 533, 26, 534, 534, 534, 534, 534, 534,
+ 534, 534, 534, 534, 535, 26, 26, 26, 536, 536, 536, 536, 536, 536, 536, 537,
+ 538, 539, 538, 538, 538, 538, 540, 538, 541, 26, 538, 538, 538, 542, 543, 543,
+ 543, 543, 544, 543, 543, 545, 546, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 547, 548, 549, 549, 549, 549, 547, 550, 549, 26, 549, 551, 552, 553, 554, 554,
+ 554, 555, 556, 557, 554, 558, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 559, 559, 559, 560,
+ 26, 26, 26, 26, 26, 26, 26, 26, 109, 109, 109, 109, 109, 109, 561, 562,
+ 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 564, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 565, 566, 26,
+ 563, 563, 563, 563, 563, 563, 563, 563, 567, 26, 26, 26, 26, 26, 26, 26,
+ 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 569, 568, 570, 26, 26, 26, 26, 26, 26, 26, 26,
+ 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571,
+ 571, 571, 571, 571, 571, 571, 571, 571, 572, 26, 26, 26, 26, 26, 26, 26,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 573, 574, 574, 574, 575, 574, 576, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 577, 577, 577, 578, 578, 26,
+ 579, 579, 579, 579, 579, 579, 579, 579, 580, 26, 579, 581, 581, 579, 579, 582,
+ 579, 579, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 584, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 585, 585, 585, 585, 585, 585, 585, 585, 585, 586, 585, 585, 585, 585, 585, 585,
+ 585, 587, 585, 585, 26, 26, 26, 26, 26, 26, 26, 26, 588, 26, 26, 26,
+ 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589,
+ 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 26,
+ 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 26,
+ 591, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
+ 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
+ 290, 290, 290, 291, 26, 26, 26, 26, 26, 26, 592, 26, 593, 26, 594, 594,
+ 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594,
+ 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595,
+ 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 596, 598,
+ 596, 599, 596, 600, 284, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26,
+ 0, 0, 0, 0, 262, 361, 0, 0, 0, 0, 0, 0, 601, 602, 0, 603,
+ 604, 605, 0, 0, 0, 606, 0, 0, 0, 0, 0, 0, 0, 607, 26, 26,
+ 14, 14, 14, 14, 14, 14, 14, 14, 251, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 284, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 26, 0, 0, 0, 607,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0,
+ 0, 0, 0, 259, 608, 609, 0, 610, 611, 0, 0, 0, 0, 0, 0, 0,
+ 612, 613, 259, 259, 0, 0, 0, 614, 615, 616, 617, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, 0, 0,
+ 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618,
+ 618, 619, 26, 620, 621, 618, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 274, 273, 273, 622, 623, 624, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 625, 625, 625, 625, 625, 626, 625, 627, 625, 628, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 629, 629, 629, 629, 629, 629, 629, 630,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 632, 631, 633, 26, 26, 26, 26, 26,
+ 634, 634, 634, 634, 634, 634, 634, 634, 634, 635, 634, 636, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 361, 0,
+ 0, 0, 0, 0, 0, 0, 637, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 361, 0, 0, 0, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26,
+ 638, 31, 31, 31, 639, 640, 641, 642, 643, 644, 639, 645, 639, 641, 641, 646,
+ 31, 647, 31, 648, 649, 647, 31, 648, 26, 26, 26, 26, 26, 26, 355, 26,
+ 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 284, 26, 0, 262, 361, 0, 361, 0, 361, 0, 0, 0, 272, 26,
+ 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0,
+ 0, 0, 0, 0, 0, 637, 26, 26, 26, 26, 26, 26, 650, 0, 0, 0,
+ 651, 26, 0, 0, 0, 0, 0, 284, 0, 607, 316, 26, 272, 26, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, 0, 637, 0, 269,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 284, 26, 26,
+ 0, 284, 0, 0, 0, 0, 0, 0, 0, 26, 0, 316, 0, 0, 0, 0,
+ 0, 26, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 614, 616,
+ 0, 0, 0, 0, 613, 652, 0, 0, 0, 613, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, 0, 272, 284, 269,
+ 269, 26, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 653, 26, 26, 26, 26, 26,
+ 280, 280, 280, 280, 280, 280, 654, 26, 280, 280, 280, 280, 280, 280, 280, 280,
+ 280, 280, 280, 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+ 280, 280, 280, 280, 348, 26, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+ 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 655, 26, 26, 26,
+ 280, 280, 280, 283, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 656, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008,
+ 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0,
+ 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193,
+ 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303,
+ 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149,
+ 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175,
+ 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199,
+ 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0,
+ 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231,
+ 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258,
+ 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275,
+ 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0,
+ 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093,
+ 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010,
+ 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347,
+ 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424,
+ 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365,
+ 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238,
+ 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182,
+ 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232,
+ 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461,
+ 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486,
+ 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0,
+ 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0,
+ 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0,
+ 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553,
+ 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560,
+ 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0,
+ 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0,
+ 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627,
+ 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0,
+ 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0,
+ 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0,
+ 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0,
+ 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0,
+ 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0,
+ 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0,
+ 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0,
+ 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153,
+ 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171,
+ 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356,
+ 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214,
+ 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363,
+ 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251,
+ 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266,
+ 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287,
+ 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302,
+ 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0,
+ 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375,
+ 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353,
+ 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234,
+ 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403,
+ 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412,
+ 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0,
+ 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721,
+ 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0,
+ 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757,
+ 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776,
+ 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0,
+ 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793,
+ 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814,
+ 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0,
+ 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728,
+ 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764,
+ 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821,
+ 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0,
+ 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828,
+ 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833,
+ 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3,
+ 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0,
+ 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838,
+ 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0,
+ 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0,
+ 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938,
+ 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0,
+ 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870,
+ 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0,
+ 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0,
+ 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0,
+ 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0,
+ 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0,
+ 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0,
+ 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0,
+ 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0,
+ 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0,
+ 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601,
+ 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662,
+ 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168,
+ 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758,
+ 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585,
+ 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259,
+ 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697,
+ 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170,
+ 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330,
+ 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473,
+ 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603,
+ 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411,
+ 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583,
+ 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269,
+ 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510,
+ 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156,
+ 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0,
+ 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0,
+ 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773,
+ 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329,
+ 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548,
+ 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651,
+ 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0,
+ 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243,
+ 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362,
+ 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490,
+ 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586,
+ 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706,
+ 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848,
+ 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575,
+ 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0,
+ 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1948,1949,
+ 1950,1951,1952,1953,1954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1955,1956,1957,1959,1958,
+ 1960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131,
+ 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37,
+ 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179,
+ 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195,
+ 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216,
+ 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244,
+ 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259,
+ 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276,
+ 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934,
+ 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312,
+ 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334,
+ 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361,
+ 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381,
+ 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399,
+ 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417,
+ 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433,
+ 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460,
+ 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870,
+ 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505,
+ 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64,
+ 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538,
+ 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567,
+ 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592,
+ 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611,
+ 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627,
+ 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651,
+ 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83,
+ 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85,
+ 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696,
+ 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728,
+ 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90,
+ 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787,
+ 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807,
+ 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0,
+};
+static const int16_t
+_hb_ucd_i16[196] =
+{
+ 0, 0, 0, 0, 1, -1, 0, 0, 2, 0, -2, 0, 0, 0, 0, 2,
+ 0, -2, 0, 0, 0, 0, 0, 16, 0, 0, 0, -16, 0, 0, 1, -1,
+ 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 0, 3, 3, 3, -3,
+ -3, -3, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 2527, 1923, 1914, 1918, 0,
+ 2250, 0, 0, 0, 0, 0, 0, 138, 0, 7, 0, 0, -7, 0, 0, 0,
+ 1, -1, 1, -1, -1, 1, -1, 0, 1824, 0, 0, 0, 0, 0, 2104, 0,
+ 2108, 2106, 0, 2106, 1316, 0, 0, 0, 0, 1, -1, 1, -1, -138, 0, 0,
+ 1, -1, 8, 8, 8, 0, 7, 7, 0, 0, -8, -8, -8, -7, -7, 0,
+ 1, -1, 0, 2,-1316, 1, -1, 0, -1, 1, -1, 1, -1, 3, 1, -1,
+ -3, 1, -1, 1, -1, 0, 0,-1914,-1918, 0, 0,-1923,-1824, 0, 0, 0,
+ 0,-2016, 0, 0, 1, -1, 0, 1, 0, 0,-2104, 0, 0, 0, 0,-2106,
+ -2108,-2106, 0, 0, 1, -1,-2250, 0, 0, 0,-2527, 0, 0, -2, 0, 1,
+ -1, 0, 1, -1,
+};
+
+static inline uint_fast8_t
+_hb_ucd_gc (unsigned u)
+{
+ return u<1114110u?_hb_ucd_u8[6432+(((_hb_ucd_u8[1248+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
+}
+static inline uint_fast8_t
+_hb_ucd_ccc (unsigned u)
+{
+ return u<125259u?_hb_ucd_u8[8640+(((_hb_ucd_u8[7704+(((_hb_ucd_u8[7048+(((_hb_ucd_u8[6802+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0;
+}
+static inline unsigned
+_hb_ucd_b4 (const uint8_t* a, unsigned i)
+{
+ return (a[i>>1]>>((i&1u)<<2))&15u;
+}
+static inline int_fast16_t
+_hb_ucd_bmg (unsigned u)
+{
+ return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9372+(((_hb_ucd_u8[9252+(((_hb_ucd_b4(9124+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0;
+}
+static inline uint_fast8_t
+_hb_ucd_sc (unsigned u)
+{
+ return u<918000u?_hb_ucd_u8[10822+(((_hb_ucd_u16[1920+(((_hb_ucd_u8[10150+(((_hb_ucd_u8[9700+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2;
+}
+static inline uint_fast16_t
+_hb_ucd_dm (unsigned u)
+{
+ return u<195102u?_hb_ucd_u16[5648+(((_hb_ucd_u8[16174+(((_hb_ucd_b4(16078+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0;
+}
+
+
+#else
+
+static const uint8_t
+_hb_ucd_u8[13072] =
+{
+ 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 5, 17, 15, 15, 18, 15, 19, 20, 21,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 34, 34, 34, 35, 36, 37, 34, 34, 34, 38, 39, 40, 41,
+ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 67, 70, 71,
+ 67, 67, 62, 72, 62, 62, 73, 67, 74, 75, 76, 77, 78, 67, 67, 67,
+ 79, 80, 34, 81, 82, 83, 67, 67, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 84, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 85, 34, 34, 34, 34, 34, 34, 34, 34, 86, 34, 34, 87, 88, 89, 90,
+ 91, 92, 93, 94, 95, 96, 97, 98, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+ 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+ 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+ 100,100, 34, 34, 34, 34,101,102, 34, 34,103,104,105,106,107,108,
+ 34, 34,109,110,111,112,113,114,115,116,117,111, 34, 34, 34,111,
+ 118,119,120,121,122,123,124,125, 34,126,127,111,128,111,129, 34,
+ 130,131,132,133,134,135,136,111,137,138,111,139,140,141,142,111,
+ 143,144,111,145,146,147,111,111,148,149,150,151,111,152,111,153,
+ 34, 34, 34, 34, 34, 34, 34, 34,154, 34, 34,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 34, 34, 34, 34, 34, 34, 34, 34,155,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111, 34, 34, 34, 34, 34,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 34, 34, 34, 34,156,157,158, 34,111,111,111,111,159,160,161,162,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,
+ 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111, 34,163,111,111,111,111,111,111,
+ 67, 67,164,165,166,128, 65,111,167,168,169,170,171,172,173,174,
+ 67, 67, 67, 67,175,176,111,111,111,111,111,111,111,111,111,111,
+ 177,111,178,111,111,179,111,111,111,111,111,111,111,111,111,111,
+ 34,180,181,111,111,111,111,111,128,182,183,111, 34,184,111,111,
+ 67, 67,185, 67, 67,111, 67,186, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67,111,111,111,111,111,111,111,111,111,111,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,111,
+ 187,111,177,177,111,111,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2,
+ 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 17, 18, 19, 1, 20, 20, 21, 22, 23, 24, 25,
+ 26, 27, 15, 2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32,
+ 32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11,
+ 11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11,
+ 34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34,
+ 34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32,
+ 32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32,
+ 16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41,
+ 40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41,
+ 43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 16, 44, 16, 10,
+ 41, 41, 41, 45, 11, 11, 11, 11, 34, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34,
+ 16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 46, 34, 32, 34, 11,
+ 32, 47, 43, 43, 48, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16,
+ 11, 11, 11, 11, 49, 2, 2, 2, 16, 16, 16, 16, 50, 51, 52, 53,
+ 54, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 55,
+ 56, 57, 43, 56, 43, 43, 43, 43, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 58, 2, 2, 2, 2, 2, 2, 59, 59, 59, 8, 9, 60, 2, 61,
+ 43, 43, 43, 43, 43, 57, 59, 2, 62, 36, 36, 36, 36, 63, 43, 43,
+ 7, 7, 7, 7, 7, 2, 2, 36, 64, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 65, 43, 43, 43, 66, 47, 43, 43, 67, 68, 69, 43, 43, 36,
+ 7, 7, 7, 7, 7, 36, 70, 71, 2, 2, 2, 2, 2, 2, 2, 72,
+ 63, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 64, 36,
+ 36, 36, 36, 43, 43, 43, 43, 43, 7, 7, 7, 7, 7, 36, 36, 36,
+ 36, 36, 36, 36, 36, 63, 43, 43, 43, 43, 40, 21, 2, 40, 68, 20,
+ 36, 36, 36, 43, 43, 68, 43, 43, 43, 43, 68, 43, 68, 43, 43, 43,
+ 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 36, 36, 63, 43, 43, 2,
+ 36, 63, 43, 43, 43, 43, 43, 43, 43, 73, 43, 43, 43, 43, 43, 43,
+ 43, 74, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 74, 64, 75,
+ 76, 43, 43, 43, 74, 75, 76, 75, 63, 43, 43, 43, 36, 36, 36, 36,
+ 36, 43, 2, 7, 7, 7, 7, 7, 77, 36, 36, 36, 36, 36, 36, 36,
+ 63, 75, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 75,
+ 76, 43, 43, 74, 75, 75, 76, 36, 36, 36, 36, 79, 75, 75, 36, 36,
+ 36, 43, 43, 7, 7, 7, 7, 7, 36, 20, 27, 27, 27, 53, 58, 43,
+ 43, 74, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 75,
+ 76, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 64, 36, 36, 36,
+ 36, 36, 36, 7, 7, 7, 7, 7, 43, 36, 63, 2, 2, 2, 2, 2,
+ 76, 43, 43, 43, 74, 75, 76, 43, 60, 20, 20, 20, 80, 43, 43, 43,
+ 43, 75, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 76,
+ 76, 43, 43, 74, 75, 75, 76, 43, 43, 43, 43, 74, 75, 75, 36, 36,
+ 71, 27, 27, 27, 27, 27, 27, 27, 43, 64, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 75, 74, 75, 75, 75, 75, 75, 76, 43,
+ 36, 36, 36, 79, 75, 75, 75, 75, 75, 75, 75, 7, 7, 7, 7, 7,
+ 27, 81, 61, 61, 53, 61, 61, 61, 74, 75, 64, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 43, 74, 75, 75, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 36, 36, 36, 36, 7, 7, 7, 82, 27, 27, 27, 81,
+ 63, 75, 65, 36, 36, 36, 36, 36, 75, 75, 75, 74, 75, 75, 43, 43,
+ 43, 43, 74, 75, 75, 75, 75, 36, 83, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 63, 64, 75, 76, 43, 43, 75, 75, 75, 76, 70,
+ 61, 61, 36, 79, 27, 27, 27, 84, 27, 27, 27, 27, 81, 36, 36, 36,
+ 75, 75, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 74,
+ 75, 43, 43, 43, 75, 75, 75, 75, 7, 75, 2, 2, 2, 2, 2, 2,
+ 63, 36, 43, 43, 43, 43, 43, 85, 36, 36, 36, 68, 43, 43, 43, 57,
+ 7, 7, 7, 7, 7, 2, 2, 2, 63, 36, 43, 43, 43, 43, 64, 36,
+ 36, 36, 36, 40, 43, 43, 43, 43, 7, 7, 7, 7, 7, 7, 36, 36,
+ 70, 61, 2, 2, 2, 2, 2, 2, 2, 86, 86, 61, 43, 61, 61, 61,
+ 7, 7, 7, 7, 7, 27, 27, 27, 27, 27, 47, 47, 47, 4, 4, 75,
+ 63, 43, 43, 43, 43, 43, 43, 74, 43, 43, 57, 43, 36, 36, 63, 43,
+ 43, 43, 43, 43, 43, 43, 43, 61, 61, 61, 61, 69, 61, 61, 61, 61,
+ 2, 2, 86, 61, 21, 2, 2, 2, 36, 36, 36, 36, 36, 79, 76, 43,
+ 74, 43, 43, 43, 76, 74, 76, 64, 36, 36, 36, 75, 43, 36, 36, 43,
+ 64, 75, 78, 79, 75, 75, 75, 36, 63, 43, 64, 36, 36, 36, 36, 36,
+ 36, 74, 76, 74, 75, 75, 76, 79, 7, 7, 7, 7, 7, 75, 76, 61,
+ 16, 16, 16, 16, 16, 50, 44, 16, 36, 36, 36, 36, 36, 36, 63, 43,
+ 2, 2, 2, 2, 87, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 61, 61, 61, 61, 61, 61, 61, 61, 11, 11, 11, 11, 16, 16, 16, 16,
+ 88, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 65,
+ 89, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 90, 91, 91,
+ 36, 36, 36, 36, 36, 58, 2, 92, 93, 36, 36, 36, 36, 36, 36, 36,
+ 36, 43, 43, 43, 43, 43, 43, 43, 36, 43, 57, 2, 2, 2, 2, 2,
+ 36, 36, 43, 76, 43, 43, 43, 75, 75, 75, 75, 74, 76, 43, 43, 43,
+ 43, 43, 2, 77, 2, 60, 63, 43, 7, 7, 7, 7, 7, 7, 7, 7,
+ 2, 2, 2, 94, 2, 56, 43, 59, 36, 95, 36, 36, 36, 36, 36, 36,
+ 36, 36, 63, 64, 36, 36, 36, 36, 36, 36, 36, 36, 63, 36, 36, 36,
+ 43, 74, 75, 76, 74, 75, 75, 75, 75, 74, 75, 75, 76, 43, 43, 43,
+ 61, 61, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 27, 27, 61,
+ 36, 36, 36, 63, 74, 76, 43, 2, 36, 36, 79, 74, 43, 43, 43, 43,
+ 74, 74, 76, 43, 43, 43, 74, 75, 75, 76, 43, 43, 43, 43, 43, 43,
+ 2, 2, 2, 77, 2, 2, 2, 2, 43, 43, 43, 43, 43, 43, 43, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 43, 43, 78, 36, 36, 36, 36, 36,
+ 36, 36, 74, 43, 43, 74, 74, 75, 75, 74, 78, 36, 36, 36, 36, 36,
+ 86, 61, 61, 61, 61, 47, 43, 43, 43, 43, 61, 61, 61, 61, 61, 61,
+ 43, 78, 36, 36, 36, 36, 36, 36, 79, 43, 43, 75, 43, 76, 43, 36,
+ 36, 36, 36, 74, 43, 75, 76, 76, 43, 75, 75, 75, 75, 75, 2, 2,
+ 36, 36, 75, 75, 75, 75, 43, 43, 43, 43, 75, 43, 43, 57, 2, 2,
+ 7, 7, 7, 7, 7, 7, 83, 36, 36, 36, 36, 36, 40, 40, 40, 2,
+ 43, 57, 43, 43, 43, 43, 43, 43, 74, 43, 43, 43, 64, 36, 63, 36,
+ 36, 36, 64, 79, 43, 36, 36, 36, 16, 16, 16, 16, 16, 16, 40, 40,
+ 40, 40, 40, 40, 40, 44, 16, 16, 16, 16, 16, 16, 44, 16, 16, 16,
+ 16, 16, 16, 16, 16, 96, 40, 40, 32, 32, 32, 16, 16, 16, 16, 32,
+ 16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 16, 34, 11, 11, 11,
+ 16, 16, 16, 16, 97, 97, 97, 97, 16, 16, 16, 16, 11, 11, 98, 99,
+ 41, 16, 16, 16, 11, 11, 98, 41, 16, 16, 16, 16, 11, 11,100, 41,
+ 101,101,101,101,101,102, 59, 59, 51, 51, 51, 2,103,104,103,104,
+ 2, 2, 2, 2,105, 59, 59,106, 2, 2, 2, 2,107,108, 2,109,
+ 110, 2,111,112, 2, 2, 2, 2, 2, 9,110, 2, 2, 2, 2,113,
+ 59, 59, 59, 59, 59, 59, 59, 59,114, 40, 27, 27, 27, 8,111,115,
+ 27, 27, 27, 27, 27, 8,111, 91, 20, 20, 20, 20, 20, 20, 20, 20,
+ 43, 43, 43, 43, 43, 43,116, 48,117, 48,117, 43, 43, 43, 43, 43,
+ 61,118, 61,119, 61, 34, 11, 16, 11, 32,119, 61, 46, 11, 11, 61,
+ 61, 61,118,118,118, 11, 11,120, 11, 11, 35, 36, 39, 61, 16, 11,
+ 8, 8, 46, 16, 16, 26, 61,121, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92,122,123, 92,124, 61, 61, 61, 8, 8,125, 61, 61, 8, 61, 61,
+ 125, 26, 61,125, 61, 61, 61,125, 61, 61, 61, 61, 61, 61, 61, 8,
+ 61,125,125, 61, 61, 61, 61, 61, 61, 61, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 61, 61, 61, 61, 4, 4, 61, 61,
+ 8, 61, 61, 61,126,127, 61, 61, 61, 61, 61, 61, 61, 61,125, 61,
+ 61, 61, 61, 61, 61, 26, 8, 8, 8, 8, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 8, 8, 8, 61, 61, 61, 61, 61, 61, 61,
+ 27, 27, 27, 27, 27, 27, 61, 61, 61, 61, 61, 61, 61, 27, 27, 27,
+ 61, 61, 61, 26, 61, 61, 61, 61, 26, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 8, 8, 8, 8, 61, 61, 61, 61, 61, 61, 61, 26,
+ 61, 61, 61, 61, 4, 4, 4, 4, 4, 4, 4, 27, 27, 27, 27, 27,
+ 27, 27, 61, 61, 61, 61, 61, 61, 8, 8,111,128, 8, 8, 8, 8,
+ 8, 8, 8, 4, 4, 4, 4, 4, 8,111,129,129,129,129,129,129,
+ 129,129,129,129,128, 8, 8, 8, 8, 8, 8, 8, 4, 4, 8, 8,
+ 8, 8, 8, 8, 8, 8, 4, 8, 8, 8,125, 26, 8, 8,125, 61,
+ 32, 11, 32, 34, 34, 34, 34, 11, 32, 32, 34, 16, 16, 16, 40, 11,
+ 32, 32,121, 61, 61,119, 34,130, 43, 32, 16, 16, 50, 2, 87, 2,
+ 36, 36, 36, 36, 36, 36, 36, 95, 2, 2, 2, 2, 2, 2, 2, 56,
+ 2,103,103, 2,107,108,103, 2, 2, 2, 2, 6, 2, 94,103, 2,
+ 103, 4, 4, 4, 4, 2, 2, 77, 2, 2, 2, 2, 2, 51, 2, 2,
+ 94,131, 2, 2, 2, 2, 2, 2, 1, 2,132,133, 4, 4, 4, 4,
+ 4, 61, 4, 4, 4, 4,134, 91,135, 92, 92, 92, 92, 43, 43, 75,
+ 136, 40, 40, 61, 92,137, 58, 61, 71, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 63,138,139, 62, 36, 36, 36, 36, 36, 58, 40, 62,
+ 61, 27, 27, 61, 61, 61, 61, 61, 27, 27, 27, 27, 27, 61, 61, 61,
+ 61, 61, 61, 61, 27, 27, 27, 27,140, 27, 27, 27, 27, 27, 27, 27,
+ 36, 36, 95, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,141, 2,
+ 32, 32, 32, 32, 32, 32, 32, 63, 48,142, 43, 43, 43, 43, 43, 77,
+ 32, 32, 32, 32, 32, 32, 40, 43, 36, 36, 36, 92, 92, 92, 92, 92,
+ 43, 2, 2, 2, 2, 2, 2, 2, 41, 41, 41,139, 40, 40, 40, 40,
+ 41, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, 32, 32,
+ 44, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42,143, 34, 35,
+ 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 11, 11, 32,
+ 11, 11, 32, 32, 32, 32, 32, 32, 16, 32, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11,144, 40, 35, 36, 36, 36, 64, 36, 64, 36, 63, 36, 36,
+ 36, 79, 76, 74, 61, 61, 61, 61, 27, 27, 27, 61,145, 61, 61, 61,
+ 36, 36, 2, 2, 2, 2, 2, 2, 75, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 75, 75, 75, 75, 75, 75, 75, 75, 43, 43, 43, 43, 43, 2,
+ 43, 36, 36, 36, 2, 65, 65, 63, 36, 36, 36, 43, 43, 43, 43, 2,
+ 36, 36, 36, 63, 43, 43, 43, 43, 43, 75, 75, 75, 75, 75, 75,146,
+ 36, 63, 75, 43, 43, 75, 43, 75,146, 2, 2, 2, 2, 2, 2, 77,
+ 7, 7, 7, 7, 7, 7, 7, 2, 36, 36, 63, 62, 36, 36, 36, 36,
+ 36, 36, 36, 36, 63, 43, 43, 74, 76, 74, 76, 43, 43, 43, 43, 43,
+ 36, 63, 36, 36, 36, 36, 74, 75, 7, 7, 7, 7, 7, 7, 2, 2,
+ 62, 36, 36, 70, 61, 79, 74, 36, 64, 43, 64, 63, 64, 36, 36, 43,
+ 36, 36, 36, 36, 36, 36, 95, 2, 36, 36, 36, 36, 36, 79, 43, 75,
+ 2, 95,147, 43, 43, 43, 43, 43, 16, 16, 16, 16, 16, 99, 40, 40,
+ 36, 79, 76, 75, 74,146, 76, 43,148,148,148,148,148,148,148,148,
+ 149,149,149,149,149,149,149,149, 16, 16, 16, 16, 16, 16, 35, 64,
+ 36, 36, 36, 36,150, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41,
+ 41,151, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,129,
+ 152,152,152,152,152,152,152,152, 36, 36, 36, 36, 36, 36,145, 61,
+ 2, 2, 2,153,112, 2, 2, 2, 6,154,155,129,129,129,129,129,
+ 129,129,112,153,112, 2,109,156, 2, 2, 2, 2,134,129,129,112,
+ 2,157, 8, 8, 60, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36,158,
+ 2, 2, 3, 2, 4, 5, 6, 2, 16, 16, 16, 16, 16, 17, 18,111,
+ 112, 4, 2, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 40, 20,159, 53, 20, 26, 8,125, 61,
+ 61, 61, 61, 61,160, 59, 61, 61, 2, 2, 2, 87, 27, 27, 27, 27,
+ 27, 27, 27, 81, 61, 61, 61, 61, 92, 92,124, 27, 81, 61, 61, 61,
+ 61, 61, 61, 61, 61, 27, 61, 61, 61, 61, 61, 61, 61, 61, 47, 43,
+ 161,161,161,161,161,161,161,161,162, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 84, 36,133, 36, 36, 36, 36, 92, 92, 92,
+ 36, 36, 36, 36, 36, 36, 36, 58,163, 92, 92, 92, 92, 92, 92, 92,
+ 36, 36, 36, 58, 27, 27, 27, 27, 36, 36, 36, 70,140, 27, 27, 27,
+ 36, 36, 36,164, 27, 27, 27, 27, 36, 36, 36, 36, 36,164, 27, 27,
+ 36, 36, 36, 27, 27, 27, 27, 30, 36, 36, 36, 36, 36, 36, 27, 36,
+ 63, 43, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 43, 43, 43, 43,
+ 36, 36, 36, 36, 36, 36,164, 30, 36, 36, 36, 36, 36, 36,164, 27,
+ 36, 36, 36, 36, 71, 36, 36, 36, 36, 36, 63, 43, 43,162, 27, 27,
+ 36, 36, 36, 36, 58, 2, 2, 2, 36, 36, 36, 36, 27, 27, 27, 27,
+ 16, 16, 16, 16, 16, 27, 27, 27, 36, 36, 43, 43, 43, 43, 43, 43,
+ 27, 27, 27, 84, 36, 36, 36, 36,162, 27, 30, 2, 2, 2, 2, 2,
+ 76, 78, 36, 36, 36, 36, 36, 36, 43, 43, 43, 57, 2, 2, 2, 2,
+ 2, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7,165, 75, 76, 43, 74, 76, 57, 72, 2,
+ 2, 2, 2, 2, 2, 2, 72, 59, 36, 36, 36, 63, 43, 43, 76, 43,
+ 43, 43, 43, 7, 7, 7, 7, 7, 2, 2, 79, 75, 75, 75, 75, 75,
+ 36, 63, 2, 36, 36, 36, 36, 36, 36, 79, 75, 43, 43, 43, 43, 74,
+ 78, 36, 58, 2, 56, 43, 57, 2, 7, 7, 7, 7, 7, 58, 58, 2,
+ 87, 27, 27, 27, 27, 27, 27, 27, 36, 36, 36, 36, 36, 36, 75, 76,
+ 43, 75, 74, 43, 2, 2, 2, 43, 36, 36, 36, 36, 36, 36, 36, 63,
+ 74, 75, 75, 75, 75, 75, 75, 75, 36, 36, 36, 79, 75, 75, 78, 36,
+ 36, 75, 75, 43, 43, 43, 43, 43, 36, 36, 79, 75, 43, 43, 43, 43,
+ 75, 43, 74, 64, 36, 58, 2, 2, 7, 7, 7, 7, 7, 82, 2, 64,
+ 75, 76, 43, 43, 74, 74, 75, 76, 74, 43, 36, 65, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 79, 75, 43, 43, 43, 75, 75, 43, 76,
+ 57, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 43, 43,
+ 75, 76, 43, 43, 43, 74, 76, 76, 57, 2, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 63, 76, 75, 43, 43, 43, 76, 36, 36, 36, 36,
+ 75, 43, 43, 76, 43, 43, 43, 43, 7, 7, 7, 7, 7, 27, 2, 86,
+ 43, 43, 43, 43, 76, 57, 2, 2, 27, 27, 27, 27, 27, 27, 27, 84,
+ 79, 75, 43, 43, 43, 43, 75, 75, 64, 65, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 75, 63, 43, 43, 43, 43, 64, 36, 36,
+ 36, 63, 43, 43, 74, 63, 43, 57, 2, 2, 2, 56, 43, 43, 43, 43,
+ 63, 43, 43, 74, 76, 43, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43,
+ 43, 43, 43, 74, 43, 2, 65, 2, 43, 43, 43, 43, 43, 43, 43, 76,
+ 58, 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36,
+ 43, 43, 43, 43, 74, 43, 43, 43, 74, 43, 76, 43, 43, 43, 43, 43,
+ 43, 43, 43, 63, 43, 43, 43, 43, 36, 36, 36, 36, 36, 75, 75, 75,
+ 43, 74, 76, 76, 36, 36, 36, 36, 36, 63, 74,146, 2, 2, 2, 2,
+ 27, 27, 81, 61, 61, 61, 53, 20,145, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 21, 43, 43, 57, 2, 2, 2, 2, 2,
+ 43, 43, 43, 57, 2, 2, 61, 61, 40, 40, 86, 61, 61, 61, 61, 61,
+ 7, 7, 7, 7, 7,166, 27, 27, 27, 84, 36, 36, 36, 36, 36, 36,
+ 27, 27, 27, 30, 2, 2, 2, 2, 79, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 76, 43, 67, 40, 40, 40, 40, 40, 40,
+ 40, 77, 40, 40, 40, 40, 40, 40, 36, 36, 36, 36, 36, 36, 47, 57,
+ 61, 61,167, 76, 43, 61,167, 75, 75,168, 59, 59, 59, 73, 43, 43,
+ 43, 69, 47, 43, 43, 43, 61, 61, 61, 61, 61, 61, 61, 43, 43, 61,
+ 61, 43, 69, 61, 61, 61, 61, 61, 11, 11, 11, 11, 11, 16, 16, 16,
+ 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16,
+ 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11,
+ 11, 11, 11, 16, 16, 16, 16, 16, 31, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11,
+ 11, 11, 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33,
+ 16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31,
+ 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16,
+ 16, 33, 16, 16, 16, 32, 16, 7, 43, 43, 43, 69, 61, 47, 43, 43,
+ 43, 43, 43, 43, 43, 43, 69, 61, 61, 61, 47, 61, 61, 61, 61, 61,
+ 61, 61, 69, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 56, 43, 43,
+ 43, 43, 43, 67, 40, 40, 40, 40, 7, 7, 7, 7, 7, 7, 7, 70,
+ 36, 36, 36, 36, 36, 36, 43, 43, 7, 7, 7, 7, 7, 7, 7,169,
+ 16, 16, 43, 43, 43, 67, 40, 40, 27, 27, 27, 27, 27, 27,140, 27,
+ 170, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,140,
+ 61, 61, 61, 61, 61, 25, 41, 41, 0, 0, 29, 21, 21, 21, 23, 21,
+ 22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21, 9, 9, 9,
+ 9, 22, 21, 18, 24, 16, 24, 5, 5, 5, 5, 22, 25, 18, 25, 0,
+ 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, 26, 25, 15, 15,
+ 24, 15, 7, 19, 15, 21, 9, 25, 9, 5, 5, 25, 5, 9, 5, 7,
+ 7, 7, 9, 8, 8, 5, 7, 5, 6, 6, 24, 24, 6, 24, 12, 12,
+ 6, 5, 9, 21, 25, 9, 26, 12, 11, 11, 9, 6, 5, 21, 17, 17,
+ 17, 26, 26, 23, 23, 12, 17, 12, 21, 12, 12, 21, 7, 21, 1, 1,
+ 21, 23, 26, 26, 6, 7, 7, 12, 12, 7, 21, 7, 12, 1, 12, 6,
+ 6, 12, 12, 26, 7, 26, 26, 7, 21, 1, 1, 12, 12, 10, 10, 10,
+ 10, 12, 21, 6, 10, 7, 7, 10, 23, 7, 15, 26, 13, 21, 13, 7,
+ 15, 7, 12, 23, 21, 26, 21, 15, 17, 7, 29, 7, 7, 22, 18, 18,
+ 14, 14, 14, 7, 17, 21, 7, 6, 5, 6, 8, 8, 8, 24, 5, 24,
+ 9, 24, 29, 29, 29, 1, 20, 19, 22, 20, 27, 28, 1, 29, 21, 20,
+ 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, 15, 6, 18, 6,
+ 12, 11, 11, 12, 9, 26, 26, 9, 26, 5, 5, 26, 14, 9, 5, 14,
+ 14, 15, 25, 26, 26, 22, 18, 26, 18, 25, 18, 22, 5, 12, 22, 21,
+ 26, 6, 7, 14, 17, 22, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6,
+ 26, 15, 6, 21, 11, 21, 24, 9, 9, 7, 23, 26, 10, 21, 6, 10,
+ 4, 4, 3, 3, 7, 25, 24, 7, 22, 22, 21, 22, 17, 16, 16, 22,
+ 16, 16, 25, 17, 7, 1, 25, 24, 26, 1, 2, 2, 12, 15, 21, 14,
+ 7, 15, 13, 12, 13, 15, 26, 10, 10, 1, 13, 23, 23, 15, 0, 1,
+ 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, 16, 9,
+ 17, 18, 19, 20, 21, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 23, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 24, 9, 9,
+ 9, 9, 25, 9, 9, 9, 26, 9, 27, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0,
+ 4, 5, 6, 7, 0, 8, 9, 10, 0, 11, 12, 13, 0, 14, 15, 16,
+ 15, 17, 15, 18, 15, 18, 15, 18, 0, 18, 0, 19, 15, 18, 20, 18,
+ 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, 31, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 36, 0,
+ 0, 0, 37, 38, 39, 0, 40, 41, 42, 43, 44, 0, 0, 45, 0, 0,
+ 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49,
+ 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 52, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 53, 54, 55, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59,
+ 60, 61, 0, 0, 62, 63, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 67, 0, 0, 0, 68, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 70, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0,
+ 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 74, 75, 0, 76, 60,
+ 0, 77, 78, 0, 0, 79, 80, 81, 0, 0, 0, 82, 0, 83, 0, 0,
+ 49, 84, 49, 0, 85, 0, 86, 0, 0, 0, 75, 0, 0, 0, 0, 0,
+ 0, 87, 88, 89, 90, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 91,
+ 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 93, 94, 0, 0, 0, 0, 0, 95, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,
+ 97, 0, 0, 98, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 94, 0,
+ 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0,101, 0,102,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,
+ 3, 4, 5, 6, 7, 0, 8, 0, 0, 0, 0, 9, 10, 11, 12, 0,
+ 0, 0, 0, 13, 0, 0, 14, 15, 0, 16, 0, 17, 18, 0, 0, 19,
+ 0, 20, 21, 0, 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26,
+ 0, 0, 0, 27, 28, 29, 0, 0, 0, 30, 31, 32, 0, 0, 31, 0,
+ 0, 33, 31, 0, 0, 0, 31, 34, 0, 0, 0, 0, 0, 35, 36, 0,
+ 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 39, 40, 0,
+ 0, 0, 0, 41, 0, 42, 0, 0, 0, 43, 44, 0, 0, 0, 45, 0,
+ 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 48, 0, 0, 0, 49,
+ 0, 49, 0, 50, 0, 0, 0, 0, 51, 0, 0, 0, 0, 52, 0, 53,
+ 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 57, 49, 0,
+ 58, 59, 0, 0, 60, 0, 0, 0, 61, 62, 0, 0, 0, 63, 0, 64,
+ 65, 66, 67, 68, 1, 69, 0, 70, 71, 72, 0, 0, 73, 74, 0, 0,
+ 0, 75, 0, 0, 1, 1, 0, 0, 76, 0, 0, 77, 0, 0, 0, 0,
+ 73, 78, 0, 79, 0, 0, 0, 0, 0, 74, 80, 0, 0, 0, 49, 0,
+ 1, 74, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, 83, 54, 0,
+ 0, 0, 0, 0, 0, 84, 85, 0, 0, 80, 0, 0, 31, 0, 0, 86,
+ 0, 0, 0, 0, 87, 0, 0, 0, 0, 47, 0, 0, 88, 0, 0, 0,
+ 0, 89, 90, 0, 0, 91, 0, 0, 92, 0, 0, 0, 93, 0, 94, 88,
+ 0, 0, 80, 0, 0, 75, 0, 0, 0, 95, 96, 0, 0, 97, 98, 0,
+ 0, 0, 0, 0, 0, 99, 0, 0,100, 0, 0, 0, 0,101, 31, 0,
+ 102,103,104, 33, 0, 0,105, 0, 0, 0,106, 0, 0, 0, 0, 0,
+ 0,107, 0, 0,108, 0, 0, 0, 54, 0, 0, 0, 0, 49,109, 0,
+ 0, 0, 0,110, 0, 0,111, 0, 0, 0, 0,109, 0, 0, 0, 0,
+ 0,112, 0, 0, 0,113, 0,114, 0, 0, 0, 0,115,116,117, 0,
+ 118, 0,119, 0, 0, 0,120,121,122, 0, 0, 0,123, 0, 0,124,
+ 0, 0,125, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2,
+ 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15,
+ 16, 17, 18, 1, 1, 1, 19, 1, 0, 0, 20, 21, 22, 1, 23, 4,
+ 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, 1, 1, 31, 0, 0, 0,
+ 32, 33, 34, 35, 1, 36, 37, 0, 0, 0, 0, 38, 1, 39, 14, 39,
+ 40, 41, 42, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0,
+ 19, 1, 21, 0, 0, 47, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0,
+ 51, 0, 52, 1, 1, 1, 53, 21, 43, 54, 55, 21, 35, 1, 0, 0,
+ 0, 56, 0, 0, 0, 57, 58, 59, 0, 0, 0, 0, 0, 60, 0, 61,
+ 0, 0, 0, 0, 62, 63, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0,
+ 66, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 69, 0, 0, 70,
+ 71, 0, 72, 73, 74, 75, 76, 77, 0, 0, 0, 78, 0, 0, 0, 79,
+ 80, 0, 0, 0, 0, 47, 0, 0, 0, 49, 0, 63, 0, 0, 64, 0,
+ 0, 81, 0, 0, 82, 0, 0, 0, 83, 0, 0, 19, 84, 0, 63, 0,
+ 0, 0, 0, 49, 1, 85, 1, 54, 15, 41, 0, 56, 0, 0, 0, 0,
+ 19, 10, 1, 0, 0, 0, 0, 0, 86, 0, 0, 87, 0, 0, 86, 0,
+ 0, 0, 0, 79, 0, 0, 88, 9, 12, 4, 89, 8, 90, 47, 0, 59,
+ 50, 0, 21, 1, 21, 91, 92, 1, 1, 1, 1, 93, 94, 95, 96, 1,
+ 97, 59, 81, 98, 99, 4, 59, 0, 0, 0, 0, 0, 0, 19, 50, 0,
+ 0, 0, 0, 0, 0, 62, 0, 0,100,101, 0, 0,102, 0, 0, 1,
+ 1, 50, 0, 0, 0, 38, 0, 64, 0, 0, 0, 0, 52, 69, 62, 0,
+ 0, 0, 79, 0, 0, 0,103,104, 59, 38, 81, 0, 0, 0, 0, 0,
+ 0,105, 1, 14, 4, 12, 84, 0, 0, 0, 0, 38, 88, 0, 0, 0,
+ 0,106, 0, 0,107, 62, 0,108, 0, 0, 0, 1, 0, 0, 0,109,
+ 14, 54, 0, 0,110, 0, 88, 0, 0, 0, 62, 63, 0, 0, 63, 0,
+ 87, 0, 0,110, 0, 0, 0, 0,111, 0, 0, 0, 79, 56, 0, 38,
+ 1, 59, 1, 59, 0, 0, 64, 87, 0, 0,112, 0, 0, 0, 56, 0,
+ 0, 0, 0,112, 0, 0, 0, 0, 62, 0, 0, 62, 0, 0, 0, 0,
+ 57, 0, 87,113, 0, 0, 8, 90, 0, 0, 1, 88, 0, 0, 0, 0,
+ 0,114, 0,115,116,117,118, 0, 52, 4,119, 49, 23, 0, 0, 0,
+ 38, 50, 38, 59, 0, 0, 1, 88, 1, 1, 1, 1, 39, 1, 48,103,
+ 88, 0, 0, 0, 0, 1, 4,119, 0, 0, 0, 1,120, 0, 0, 0,
+ 0, 0,230,230,230,230,230,232,220,220,220,220,232,216,220,220,
+ 220,220,220,202,202,220,220,220,220,202,202,220,220,220, 1, 1,
+ 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220,220,220,
+ 230,230,230,220,220, 0,230,230,230,220,220,220,220,230,232,220,
+ 220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230, 0,220,
+ 230,230,230,230,220,230,230,230,222,220,230,230,220,220,230,222,
+ 228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22,
+ 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, 0, 0,
+ 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230,220,230,
+ 230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230,230, 0,
+ 220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230,220,220,
+ 230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0,230,230,
+ 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220, 0, 0,
+ 0,220,230,230, 0,220,230,220,220,220, 27, 28, 29,230, 7, 0,
+ 0, 0, 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, 0, 0,
+ 230, 0, 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0,
+ 9, 0,103,103, 9, 0,107,107,107,107,118,118, 9, 0,122,122,
+ 122,122,220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, 0,129,
+ 130, 0,132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,
+ 230,230, 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, 0, 9,
+ 9, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220,220, 0,
+ 0, 0,230, 0, 0,220, 0, 0, 9, 9, 0, 0, 7, 0,230,230,
+ 230, 0,230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230,
+ 230,230,230,230,232,228,228,220, 0,230,233,220,230,220,230,230,
+ 1, 1, 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0,
+ 218,228,232,222,224,224, 0, 8, 8, 0,230, 0,230,230,220, 0,
+ 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, 0,230,
+ 220, 0, 0, 0,220,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0,
+ 9, 7, 9, 9, 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1,
+ 0, 0, 0,226,216,216,216,216,216, 0,220,220,220, 0,230,230,
+ 7, 0, 16, 17, 17, 33, 17, 49, 17, 17, 84, 97,135,145, 26, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17,177, 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 3, 3, 3,
+ 3, 3, 6, 7, 8, 3, 3, 3, 3, 3, 9, 10, 11, 12, 13, 3,
+ 3, 3, 3, 3, 3, 3, 3, 14, 3, 15, 3, 3, 3, 3, 3, 3,
+ 16, 17, 18, 19, 20, 21, 3, 3, 3, 22, 23, 3, 3, 3, 3, 3,
+ 3, 3, 24, 3, 3, 3, 3, 3, 3, 3, 3, 25, 3, 3, 26, 27,
+ 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0,
+ 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 0,
+ 0, 14, 15, 16, 6, 0, 17, 18, 19, 19, 19, 20, 21, 22, 23, 24,
+ 19, 25, 0, 26, 27, 19, 19, 28, 29, 30, 0, 31, 0, 0, 0, 8,
+ 0, 0, 0, 0, 0, 0, 0, 19, 28, 0, 32, 33, 9, 34, 35, 19,
+ 0, 0, 36, 37, 38, 39, 40, 19, 0, 41, 42, 43, 44, 31, 0, 1,
+ 45, 42, 0, 0, 0, 0, 0, 32, 14, 14, 0, 0, 0, 0, 14, 0,
+ 0, 46, 47, 47, 47, 47, 48, 49, 47, 47, 47, 47, 50, 51, 52, 53,
+ 43, 21, 0, 0, 0, 0, 0, 0, 0, 54, 6, 55, 0, 14, 19, 1,
+ 0, 0, 0, 19, 56, 31, 0, 0, 0, 0, 0, 0, 0, 57, 14, 0,
+ 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 58, 59, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 3, 0, 4,
+ 5, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 1, 1, 0, 0, 8,
+ 9, 0, 8, 9, 0, 0, 0, 0, 8, 9, 10, 11, 12, 0, 0, 0,
+ 13, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 1, 0, 0, 18,
+ 19, 0, 0, 0, 20, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1,
+ 1, 1, 1, 1, 0, 8, 21, 9, 0, 0, 22, 0, 0, 0, 0, 1,
+ 0, 23, 24, 25, 0, 0, 26, 0, 0, 0, 8, 21, 27, 0, 1, 0,
+ 0, 1, 1, 1, 1, 0, 1, 28, 29, 30, 0, 31, 32, 20, 1, 1,
+ 0, 0, 0, 8, 21, 9, 1, 4, 5, 0, 0, 0, 33, 9, 0, 1,
+ 1, 1, 0, 8, 21, 21, 21, 21, 34, 1, 35, 21, 21, 21, 9, 36,
+ 0, 0, 37, 38, 1, 0, 39, 0, 0, 0, 1, 0, 1, 0, 0, 0,
+ 0, 8, 21, 9, 1, 0, 0, 0, 40, 0, 8, 21, 21, 21, 21, 21,
+ 21, 21, 21, 9, 0, 1, 1, 1, 1, 8, 21, 21, 21, 9, 0, 0,
+ 0, 41, 0, 42, 43, 0, 0, 0, 1, 44, 0, 0, 0, 45, 8, 9,
+ 1, 0, 1, 0, 1, 1, 8, 21, 21, 9, 0, 4, 5, 8, 9, 1,
+ 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 11, 12, 12, 12,
+ 12, 13, 14, 15, 16, 17, 18, 12, 19, 12, 20, 12, 12, 12, 12, 21,
+ 22, 22, 22, 23, 12, 12, 12, 12, 24, 25, 12, 12, 26, 27, 28, 29,
+ 30, 31, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 32,
+ 12, 33, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 34, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 26, 27, 28, 29, 30, 31, 32, 32, 33, 33, 33, 34, 35, 35, 35, 35,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 2, 2, 51, 51, 52, 53, 54, 55, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 57, 57, 56, 56, 56, 56, 56, 56, 58, 59, 60, 61,
+ 56, 62, 62, 63, 64, 65, 66, 67, 68, 69, 70, 56, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 71,
+ 62, 62, 62, 62, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 74, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 62, 62, 62, 62, 88, 89, 89, 89, 90, 89,
+ 91, 92, 93, 94, 95, 95, 96, 97, 87, 98, 99,100,101,102,103, 87,
+ 104,104,104, 87,105,106,107,108,109,110,111,112,113,114,115, 87,
+ 89, 87,116,117,118,119,120,121,122,123,124, 87,125,126, 87,127,
+ 128,129,130, 87,131,132, 87,133,134,135, 87, 87,136,137,138,139,
+ 87,140, 87, 21,141,141,141,141,141,141,141,141,141,141,141, 87,
+ 87, 87, 87, 87,142,142,142,142,142,142,142,142,142, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,143,143,143,143,
+ 143, 87, 87, 87,144,144,144,144,145,146,147,147, 87, 87, 87, 87,
+ 148,148,149,150,151,151,151,151,151,151,151,151,151,151,151,151,
+ 151,151,151,151,151,151,151,151,151,151, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87,152,153,154,155,155,155, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,156,157, 87, 87,
+ 87, 87, 87, 87, 56, 56,158,159, 51, 56, 56, 87, 56, 56, 56, 56,
+ 56, 56, 56, 56,160,160,160,160,160,160, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87,161, 87,162, 87, 87,163, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87,164,164,165, 87, 87, 87, 87, 87, 56, 56, 56, 87,
+ 89, 89, 87, 87, 56, 56, 56, 56,166, 87, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 62, 62, 62, 62, 62, 62, 62, 62, 87, 87, 87, 87,
+ 87, 87, 87, 87, 62, 62, 62, 62, 62, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 56, 87,167,167, 0, 1, 2, 2, 0, 1, 2, 2,
+ 2, 3, 4, 5, 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3,
+ 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
+ 0, 0, 7, 0, 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 11, 11,
+ 11, 11, 12, 11, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 15, 16, 16, 16, 16, 17, 18, 19, 19,
+ 19, 19, 19, 19, 20, 21, 22, 22, 23, 24, 22, 25, 22, 22, 22, 22,
+ 22, 26, 22, 22, 27, 27, 27, 27, 27, 22, 22, 22, 28, 28, 28, 28,
+ 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 27, 27, 22, 22, 22, 22,
+ 22, 22, 32, 22, 33, 33, 33, 33, 33, 34, 35, 33, 36, 36, 36, 36,
+ 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38,
+ 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40,
+ 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42,
+ 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44,
+ 44, 44, 44, 44, 45, 45, 45, 46, 45, 45, 45, 45, 47, 47, 47, 47,
+ 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 49, 48, 48, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51,
+ 51, 51, 51, 52, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56,
+ 56, 56, 56, 56, 57, 57, 58, 58, 58, 58, 59, 58, 60, 60, 61, 62,
+ 63, 63, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 66, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 56, 56, 56, 56, 56, 68, 68, 68, 68,
+ 68, 69, 69, 69, 70, 70, 70, 70, 70, 70, 65, 65, 71, 71, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 8, 8, 8, 8, 8, 73, 73, 73, 73,
+ 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76,
+ 76, 77, 77, 77, 13, 51, 51, 51, 74, 78, 79, 80, 4, 4, 81, 4,
+ 4, 82, 83, 84, 4, 4, 4, 85, 8, 8, 8, 8, 11, 11, 11, 11,
+ 11, 11, 11, 11, 86, 0, 0, 0, 0, 0, 0, 87, 0, 4, 0, 0,
+ 0, 8, 8, 8, 0, 0, 88, 89, 90, 0, 4, 4, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, 91, 91,
+ 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 4, 4, 93, 93, 93, 93,
+ 93, 93, 93, 93, 51, 51, 51, 94, 94, 94, 94, 94, 54, 54, 54, 54,
+ 54, 54, 13, 13, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+ 95, 95, 95, 0, 96, 0, 97, 98, 99,100,100,100,100,101,102,103,
+ 103,103,103,104,105,105,105,106, 53, 53, 53, 53, 53, 0,105,105,
+ 0, 0, 0,103, 53, 53, 0, 0, 0, 0, 53,107, 0, 0, 0, 0,
+ 0,103,103,108,103,103,103,103,103,109, 0, 0, 95, 95, 95, 95,
+ 0, 0, 0, 0,110,110,110,110,110,110,110,110,110,110,110,110,
+ 110,111,111,111,112,112,112,112,112,112,112,112,112,112,112,112,
+ 13, 13, 13, 13, 13, 13,113,113,113,113,113,113, 0, 0,114, 4,
+ 4, 4, 4, 4,115, 4, 4, 4, 4, 4, 4, 4,116,116,116, 0,
+ 117,117,117,117,118,118,118,118,118,118, 33, 33,119,119,120,121,
+ 121,121, 53, 53,122,122,122,122,123,122, 50, 50,124,124,124,124,
+ 124,124, 50, 50,125,125,125,125,125,125,126,126, 54, 54, 54, 4,
+ 4,127,128, 55, 55, 55, 55, 55,126,126,126,126,129,129,129,129,
+ 129,129,129,129, 4,130, 19, 19, 19, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22,131, 0, 22, 22, 22, 8, 0,132, 0,
+ 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22,133, 0, 0, 1, 2,
+ 1, 2,134,102,103,135, 53, 53, 53, 53, 0, 0,136,136,136,136,
+ 136,136,136,136, 0, 0, 0, 0, 11, 11, 11, 11, 11, 0, 11, 11,
+ 11, 0, 0,137,138,138,139,139,139,139,140, 0,141,141,141,142,
+ 142,143,143,143,144,144,145,145,145,145,145,145,146,146,146,146,
+ 146,147,147,147,148,148,148,149,149,149,149,149,150,150,150,151,
+ 151,151,151,151,152,152,152,152,152,152,152,152,153,153,153,153,
+ 154,154,155,155,156,156,156,156,156,156,157,157,158,158,159,159,
+ 159,159,159,159,160,160,161,161,161,161,161,161,162,162,162,162,
+ 162,162,163,163,164,164,164,164,165,165,165,165,166,166,166,166,
+ 167,167,168,168,169,169,169,169,169,169,169,169,170,170,170,170,
+ 170,170,170,170,171,171,171,171,171,171,171,171,172,172,172,172,
+ 172,172,172,172,173,173,173,174,174,174,174,174,175,175,175,175,
+ 175,175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,
+ 177,178,178,178,179,179,179,179,179,180,180,180,181,181,181,181,
+ 181,181,182, 44,183,183,183,183,183,183,183,183,184,184,184,185,
+ 185,185,185,185,186,186,186,187,186,186,186,186,188,188,188,188,
+ 188,188,188,188,189,189,189,189,189,189,189,189,190,190,190,190,
+ 190,190,190,190,191,191,191,191,191,191, 67, 67,192,192,192,192,
+ 192,192,192,192,193,193,193,193,193,193,193,193,194,194,194,194,
+ 194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,
+ 196,196,196,196,197,197,197,197,197,198,198,198,198,198,198,198,
+ 199,199,199,199,200,200,200,200,200,200,200,201,201,201,201,201,
+ 201,201,201,201,202,202,202,202,202,202,203,203,203,203,203,203,
+ 203,203,203,203,204,204,204,204,204,204,204,204,205,205,205,205,
+ 205,205,205,205,206,206,206,206,206,206,206,206,207,207,207,207,
+ 207,207,207,207,113,113,113,113,113,113,113,113,113,113,113,113,
+ 208,208,208,208,209,209,209,209,209,209,209,209,210,210,210,210,
+ 210,210,210,210,211,211,211,211,211,211,211,211,212,212,212,212,
+ 212,212,212,212,212,212,212,212,212,212,213, 0,214,214,214,214,
+ 214,214,214,214,215,100,100,100,100,100,100,100,100,100,100,100,
+ 100,100,100,100,100,100,100,100,100,100,216,217,217,217,217,217,
+ 217,217,217,217,218,218,218,218,218,218,218,218,218,218, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219,220,221, 0,222, 0,
+ 0, 0, 0, 0,223,223,223,223,223,223,223,223, 92, 92, 92, 92,
+ 92, 92, 92, 92,224,224,224,224,224,224,224,224,225,225,225,225,
+ 225,225,225,225,226,226,226,226,226,226,226,226,227,227,227,227,
+ 227,227,227,227,228, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8,
+ 8, 8, 8, 8, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 3, 0,
+ 0, 0, 4, 0, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 5, 0,
+ 2, 5, 6, 0, 7, 7, 7, 7, 8, 9, 8, 10, 8, 11, 8, 8,
+ 8, 8, 8, 8, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 14, 14,
+ 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 17, 19, 20, 20, 20,
+ 20, 20, 20, 20, 21, 22, 21, 23, 21, 21, 24, 24, 21, 21, 21, 21,
+ 23, 21, 25, 7, 7, 26, 21, 21, 27, 21, 21, 21, 21, 21, 21, 22,
+ 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
+ 32, 32, 32, 32, 33, 21, 21, 21, 34, 34, 34, 34, 35, 36, 34, 34,
+ 34, 37, 34, 34, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40,
+ 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44,
+ 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 48,
+ 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 52, 50, 53, 53, 53, 53,
+ 54, 54, 54, 54, 54, 54, 55, 54, 56, 56, 56, 56, 57, 57, 57, 57,
+ 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61,
+ 61, 61, 62, 63, 64, 64, 64, 64, 65, 65, 65, 65, 65, 66, 0, 0,
+ 67, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 69, 70, 71, 72, 72,
+ 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75,
+ 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79,
+ 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, 83, 7, 7, 7,
+ 84, 7, 85, 86, 0, 85, 87, 0, 2, 88, 89, 2, 2, 2, 2, 90,
+ 91, 88, 92, 2, 2, 2, 93, 2, 2, 2, 2, 94, 0, 0, 0, 87,
+ 1, 0, 0, 95, 0, 96, 97, 0, 4, 0, 0, 0, 0, 0, 0, 4,
+ 98, 98, 98, 98, 99, 99, 99, 99, 13, 13, 13, 13,100,100,100,100,
+ 101,101,101,101, 0,102, 0, 0,103,101,104,105, 0, 0,101, 0,
+ 106,107,107,107,107,107,107,107,107,107,108,106,109,110,110,110,
+ 110,110,110,110,110,110,111,109,112,112,112,112,113, 56, 56, 56,
+ 56, 56, 56,114,110,110,110,111,110,110, 0, 0,115,115,115,115,
+ 116,116,116,116,117,117,117,117,118,118,118,118, 97, 2, 2, 2,
+ 2, 2, 95, 2,119,119,119,119,120,120,120,120,121,121,121,121,
+ 122,122,122,122,122,122,122,123,124,124,124,124,125,125,125,125,
+ 125,125,125,126,127,127,127,127,128,128,128,128,129,129,129,129,
+ 2, 2, 3, 2, 2,130, 2, 2,131,131,131,131,132, 17, 17, 19,
+ 21, 21, 21,133, 7, 7, 7,134, 21, 21, 21, 24, 0,135,110,110,
+ 110,110,110,136,137,137,137,137, 0, 0, 0,138,139,139,139,139,
+ 140,140,140,140, 85, 0, 0, 0,141,141,141,141,142,142,142,142,
+ 143,143,143,143,144,144,144,144,145,145,145,145,146,146,146,146,
+ 147,147,147,147,148,148,148,148,149,149,149,149,150,150,150,150,
+ 151,151,151,151,152,152,152,152,153,153,153,153,154,154,154,154,
+ 155,155,155,155,156,156,156,156,157,157,157,157,158,158,158,158,
+ 159,159,159,159,160,160,160,160,161,161,161,161,162,162,162,162,
+ 163,163,163,163,164,164,164,164,165,165,165,165,166,166,166,166,
+ 167,167,167,167,168,168,168,168,169,169,169,169,170,170,170,170,
+ 171,171,171,171,172,172,172,172,173,173,173,173,174,174,174,174,
+ 175,175,175,175,176,176,176,176,177,177,177,177,178,178,178,178,
+ 179,179,179,179,180,180,180,180,181,181,181,181,182, 46, 46, 46,
+ 183,183,183,183,184,184,184,184,185,185,185,185,186,186,186,186,
+ 186,186,187,186,188,188,188,188,189,189,189,189,190,190,190,190,
+ 191,191,191,191,192,192,192,192,193,193,193,193,194,194,194,194,
+ 195,195,195,195,196,196,196,196,197,197,197,197,198,198,198,198,
+ 199,199,199,199,200,200,200,200,201,201,201,201,202,202,202,202,
+ 203,203,203,203,204,204,204,204,205,205,205,205,206,206,206,206,
+ 207,207,207,207,208,208,208,208,209,209,209,209,210,210,210,210,
+ 211,211,211,211,212,212,212,212,213, 0, 0, 0,214,214,214,214,
+ 215,107,107,107,107,110,110,110,216,216,216,216,217,217,217,217,
+ 0,218, 87, 0, 0, 0,218, 7, 83,138, 7, 0, 0, 0,219, 87,
+ 220,220,220,220,221,221,221,221,222,222,222,222,223,223,223,223,
+ 224,224,224,224,225, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 0, 19, 0, 0, 0,
+ 0, 0, 26, 26, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9,
+ 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 55, 55, 55, 55, 55, 55,
+ 6, 6, 6, 6, 6, 1, 1, 6, 6, 4, 4, 4, 4, 4, 4, 4,
+ 4, 0, 4, 4, 4, 14, 14, 14, 14, 14, 14, 14, 3, 3, 3, 3,
+ 3, 0, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 1,
+ 1, 1, 3, 3, 1, 3, 3, 3, 37, 37, 37, 37, 38, 38, 38, 38,
+ 64, 64, 64, 64, 90, 90, 90, 90, 95, 95, 95, 95, 3, 3, 0, 3,
+ 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 0, 0, 7, 7,
+ 5, 5, 5, 5, 11, 11, 11, 11, 10, 10, 10, 10, 21, 21, 21, 21,
+ 22, 22, 22, 22, 23, 23, 23, 23, 16, 16, 16, 16, 20, 20, 20, 20,
+ 36, 36, 36, 36, 24, 24, 24, 24, 24, 24, 24, 0, 18, 18, 18, 18,
+ 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, 25, 25, 33, 33, 33, 33,
+ 8, 8, 8, 8, 8, 8, 8, 0, 12, 12, 12, 12, 30, 30, 30, 30,
+ 29, 29, 29, 29, 28, 28, 28, 28, 34, 34, 34, 34, 35, 35, 35, 35,
+ 35, 35, 35, 0, 0, 0, 35, 35, 45, 45, 45, 45, 44, 44, 44, 44,
+ 44, 0, 0, 0, 43, 43, 43, 43, 46, 46, 46, 46, 31, 31, 31, 31,
+ 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48,
+ 52, 52, 52, 52, 58, 58, 58, 58, 54, 54, 54, 54, 91, 91, 91, 91,
+ 62, 62, 62, 62, 76, 76, 76, 76, 93, 93, 93, 93, 70, 70, 70, 70,
+ 73, 73, 73, 73, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0,
+ 0, 1, 0, 0, 1, 1, 0, 0, 19, 19, 9, 9, 9, 9, 9, 6,
+ 19, 9, 9, 9, 9, 9, 19, 19, 9, 9, 9, 19, 6, 19, 19, 19,
+ 19, 19, 19, 9, 0, 0, 0, 19, 0, 0, 9, 0, 0, 0, 19, 19,
+ 27, 27, 27, 27, 56, 56, 56, 56, 61, 61, 61, 61, 13, 13, 13, 13,
+ 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12,
+ 0, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 0, 0, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 0, 26, 26, 26, 26, 26, 12, 12, 12,
+ 12, 12, 12, 0, 39, 39, 39, 39, 86, 86, 86, 86, 77, 77, 77, 77,
+ 79, 79, 79, 79, 60, 60, 60, 60, 65, 65, 65, 65, 75, 75, 75, 75,
+ 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 84, 84, 84, 84,
+ 84, 84, 84, 0, 68, 68, 68, 68, 92, 92, 92, 92, 87, 87, 87, 87,
+ 19, 9, 19, 19, 2, 2, 2, 2, 19, 19, 19, 4, 3, 3, 0, 0,
+ 1, 1, 6, 6, 0, 0, 17, 17, 17, 17, 0, 0, 49, 49, 49, 49,
+ 0, 1, 1, 1, 71, 71, 71, 71, 67, 67, 67, 67, 42, 42, 42, 42,
+ 41, 41, 41, 41,118,118,118,118, 53, 53, 53, 53, 59, 59, 59, 59,
+ 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50,135,135,135,135,
+ 106,106,106,106,104,104,104,104,110,110,110,110, 47, 47, 47, 47,
+ 81, 81, 81, 81,120,120,120,120,116,116,116,116,128,128,128,128,
+ 66, 66, 66, 66, 72, 72, 72, 72, 98, 98, 98, 98, 97, 97, 97, 97,
+ 57, 57, 57, 57, 88, 88, 88, 88,117,117,117,117,112,112,112,112,
+ 78, 78, 78, 78, 83, 83, 83, 83, 82, 82, 82, 82,122,122,122,122,
+ 89, 89, 89, 89,130,130,130,130,144,144,144,144,147,147,147,147,
+ 148,148,148,148,149,149,149,149, 94, 94, 94, 94, 85, 85, 85, 85,
+ 101,101,101,101, 96, 96, 96, 96,111,111,111,111,100,100,100,100,
+ 100, 36, 36, 36,108,108,108,108,129,129,129,129,109,109,109,109,
+ 107,107,107,107,107,107,107, 1,137,137,137,137,124,124,124,124,
+ 123,123,123,123,114,114,114,114,102,102,102,102,126,126,126,126,
+ 142,142,142,142,125,125,125,125,150,150,150,150,141,141,141,141,
+ 140,140,140,140,121,121,121,121,133,133,133,133,134,134,134,134,
+ 138,138,138,138,143,143,143,143,145,145,145,145, 63, 63, 63, 63,
+ 80, 80, 80, 80,127,127,127,127,115,115,115,115,103,103,103,103,
+ 119,119,119,119,146,146,146,146, 99, 99, 99, 99,136,139, 0, 0,
+ 136,136,136,136, 17, 15, 15, 15,139,139,139,139,105,105,105,105,
+ 0, 0, 0, 1, 0, 0, 1, 1,131,131,131,131,151,151,151,151,
+ 152,152,152,152,113,113,113,113,132,132,132,132, 15, 0, 0, 0,
+ 16, 50, 84,118, 88, 89, 90, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 91,
+ 85, 85,220, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 94, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 15,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0,
+ 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0,
+ 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0,
+ 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0,
+ 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0,
+ 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 68, 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
+ 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,
+ 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,104, 0, 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0,
+ 108, 0,109, 0,110, 0,111,112,113, 0,114, 0, 0, 0,115, 0,
+ 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,118,119,120,121, 0,122,123,124,125,126, 0,127,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,154,155,156,157, 0, 0,
+ 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0,
+ 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,168,169, 0, 0, 0, 0,170,171, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,
+ 188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,
+ 204,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4,
+};
+static const uint16_t
+_hb_ucd_u16[4800] =
+{
+ 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12,
+ 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23,
+ 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31,
+ 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39,
+ 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13,
+ 13, 13, 13, 35, 9, 42, 11, 11, 43, 44, 32, 45, 46, 47, 47, 48,
+ 49, 50, 47, 47, 51, 32, 52, 53, 47, 47, 47, 47, 47, 54, 55, 56,
+ 57, 58, 47, 32, 59, 47, 47, 47, 47, 47, 60, 53, 61, 47, 62, 63,
+ 47, 64, 65, 66, 47, 67, 47, 47, 47, 47, 47, 47, 47, 68, 69, 32,
+ 70, 47, 47, 71, 72, 73, 74, 75, 76, 47, 47, 77, 78, 79, 80, 81,
+ 82, 47, 47, 83, 84, 85, 86, 87, 82, 47, 47, 77, 88, 47, 80, 89,
+ 90, 47, 47, 91, 92, 93, 80, 94, 95, 47, 47, 96, 97, 98, 99, 100,
+ 101, 47, 47, 102, 103, 104, 80, 105, 106, 47, 47, 91, 107, 108, 80, 109,
+ 90, 47, 47, 110, 111, 112, 80, 113, 114, 47, 47, 47, 115, 116, 99, 117,
+ 47, 47, 47, 118, 119, 120, 66, 66, 47, 47, 47, 121, 122, 123, 47, 47,
+ 124, 125, 126, 127, 47, 47, 47, 128, 129, 32, 32, 130, 131, 132, 66, 66,
+ 47, 47, 133, 134, 120, 135, 136, 137, 138, 139, 9, 9, 9, 11, 11, 140,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 141, 142, 143,
+ 47, 144, 9, 9, 9, 9, 9, 145, 146, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 147, 47, 148, 149, 47, 47, 47, 47, 150, 151,
+ 47, 152, 47, 153, 47, 152, 47, 152, 47, 47, 47, 154, 155, 156, 157, 143,
+ 158, 157, 47, 47, 159, 47, 47, 47, 160, 47, 161, 47, 47, 47, 47, 47,
+ 47, 47, 162, 163, 164, 47, 47, 47, 47, 47, 47, 47, 47, 165, 144, 144,
+ 47, 166, 47, 47, 47, 167, 168, 169, 157, 157, 170, 171, 172, 172, 172, 172,
+ 173, 47, 47, 174, 175, 120, 176, 177, 178, 47, 179, 61, 47, 47, 180, 181,
+ 47, 47, 182, 183, 184, 61, 47, 185, 11, 9, 9, 9, 66, 186, 187, 188,
+ 11, 11, 189, 27, 27, 27, 190, 191, 11, 192, 27, 27, 32, 32, 32, 32,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 193, 13, 13, 13, 13, 13, 13,
+ 194, 194, 194, 194, 194, 195, 194, 11, 196, 196, 196, 197, 198, 199, 199, 198,
+ 200, 201, 202, 203, 204, 205, 206, 207, 208, 27, 209, 209, 209, 210, 211, 32,
+ 212, 213, 214, 215, 216, 143, 217, 217, 218, 219, 220, 144, 221, 222, 144, 223,
+ 224, 224, 224, 224, 224, 224, 224, 224, 225, 144, 226, 144, 144, 144, 144, 227,
+ 144, 228, 224, 229, 144, 230, 231, 144, 144, 144, 144, 144, 144, 144, 143, 143,
+ 143, 232, 144, 144, 144, 144, 233, 143, 144, 144, 144, 144, 144, 144, 144, 144,
+ 144, 144, 144, 234, 235, 144, 144, 236, 144, 144, 144, 144, 144, 144, 237, 144,
+ 144, 144, 144, 144, 144, 144, 238, 239, 143, 240, 144, 144, 241, 224, 242, 224,
+ 243, 244, 224, 224, 224, 245, 224, 246, 144, 144, 144, 224, 247, 144, 144, 144,
+ 9, 9, 9, 11, 11, 11, 248, 249, 13, 13, 13, 13, 13, 13, 250, 251,
+ 11, 11, 11, 47, 47, 47, 252, 253, 47, 47, 47, 47, 47, 47, 32, 32,
+ 254, 255, 256, 257, 258, 66, 66, 66, 259, 260, 261, 262, 263, 47, 47, 47,
+ 47, 264, 146, 47, 47, 47, 47, 265, 47, 266, 47, 47, 144, 144, 144, 47,
+ 144, 144, 267, 144, 268, 269, 144, 144, 267, 144, 144, 269, 144, 144, 144, 144,
+ 47, 47, 47, 47, 144, 144, 144, 144, 47, 270, 47, 47, 47, 47, 47, 47,
+ 47, 144, 144, 144, 144, 47, 47, 185, 271, 47, 61, 47, 13, 13, 272, 273,
+ 13, 274, 47, 47, 47, 47, 275, 276, 31, 277, 278, 279, 13, 13, 13, 280,
+ 281, 282, 283, 284, 285, 9, 9, 286, 287, 47, 288, 289, 47, 47, 47, 290,
+ 291, 47, 47, 292, 293, 157, 32, 294, 61, 47, 295, 47, 296, 297, 47, 47,
+ 70, 47, 47, 298, 299, 300, 301, 61, 47, 47, 302, 303, 304, 305, 47, 306,
+ 47, 47, 47, 307, 58, 308, 309, 310, 47, 47, 47, 11, 11, 311, 11, 11,
+ 11, 11, 11, 11, 47, 47, 312, 157, 313, 313, 313, 313, 313, 313, 313, 313,
+ 314, 314, 314, 314, 314, 314, 314, 314, 11, 315, 316, 47, 47, 47, 47, 47,
+ 47, 47, 47, 317, 31, 318, 47, 47, 47, 47, 47, 319, 320, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 321, 32, 322, 32, 323, 324, 325, 326, 47,
+ 47, 47, 47, 47, 47, 47, 47, 327, 328, 2, 3, 4, 5, 329, 330, 331,
+ 47, 332, 47, 47, 47, 47, 333, 334, 335, 143, 143, 336, 217, 217, 217, 337,
+ 338, 144, 144, 144, 144, 144, 144, 339, 340, 340, 340, 340, 340, 340, 340, 340,
+ 47, 47, 47, 47, 47, 47, 341, 143, 47, 47, 342, 47, 343, 47, 47, 60,
+ 47, 344, 47, 47, 47, 345, 217, 217, 9, 9, 145, 11, 11, 47, 47, 47,
+ 47, 47, 157, 9, 9, 145, 11, 11, 47, 47, 47, 47, 47, 47, 344, 66,
+ 47, 47, 47, 47, 47, 346, 47, 347, 47, 47, 348, 143, 143, 143, 47, 349,
+ 47, 350, 47, 344, 66, 66, 66, 66, 47, 47, 47, 351, 143, 143, 143, 143,
+ 352, 47, 47, 353, 143, 66, 47, 354, 47, 355, 143, 143, 356, 47, 357, 66,
+ 47, 47, 47, 358, 47, 359, 47, 359, 47, 358, 142, 143, 143, 143, 143, 143,
+ 9, 9, 9, 9, 11, 11, 11, 360, 47, 47, 361, 157, 157, 157, 157, 157,
+ 143, 143, 143, 143, 143, 143, 143, 143, 47, 355, 362, 47, 60, 363, 66, 66,
+ 364, 47, 47, 353, 365, 366, 367, 368, 178, 47, 47, 369, 370, 47, 47, 157,
+ 95, 47, 371, 372, 373, 47, 47, 374, 178, 47, 47, 375, 376, 377, 378, 143,
+ 47, 47, 379, 380, 32, 32, 32, 32, 47, 47, 358, 47, 47, 381, 169, 157,
+ 90, 47, 47, 110, 382, 383, 384, 32, 47, 47, 47, 385, 386, 387, 47, 47,
+ 47, 47, 47, 388, 389, 157, 157, 157, 47, 47, 390, 391, 392, 393, 32, 32,
+ 47, 47, 47, 394, 395, 157, 66, 66, 47, 47, 396, 397, 157, 157, 157, 157,
+ 47, 141, 398, 399, 144, 144, 144, 144, 47, 47, 379, 400, 66, 66, 66, 66,
+ 9, 9, 9, 9, 11, 11, 126, 401, 47, 47, 47, 47, 47, 402, 403, 404,
+ 405, 47, 47, 406, 407, 408, 47, 47, 409, 410, 66, 66, 47, 47, 47, 47,
+ 47, 47, 390, 411, 412, 126, 143, 413, 47, 152, 414, 415, 32, 32, 32, 32,
+ 47, 47, 47, 352, 416, 157, 47, 47, 417, 418, 157, 157, 157, 157, 157, 157,
+ 47, 47, 47, 47, 47, 47, 47, 419, 143, 143, 143, 143, 143, 420, 421, 422,
+ 217, 217, 217, 217, 217, 217, 217, 66, 47, 47, 47, 206, 206, 206, 206, 206,
+ 47, 47, 47, 47, 47, 47, 300, 66, 47, 47, 47, 47, 47, 47, 47, 423,
+ 47, 47, 47, 424, 425, 426, 427, 47, 9, 9, 9, 9, 9, 9, 11, 11,
+ 143, 428, 66, 66, 66, 66, 66, 66, 47, 47, 47, 47, 381, 429, 404, 404,
+ 430, 431, 27, 27, 27, 27, 432, 27, 47, 433, 206, 206, 206, 206, 206, 206,
+ 144, 144, 144, 144, 144, 144, 434, 435, 436, 144, 437, 144, 144, 144, 144, 144,
+ 144, 144, 144, 144, 438, 144, 144, 144, 9, 439, 11, 440, 441, 11, 194, 9,
+ 442, 443, 9, 444, 11, 9, 439, 11, 440, 441, 11, 194, 9, 442, 443, 9,
+ 444, 11, 9, 439, 11, 440, 441, 11, 194, 9, 442, 443, 9, 444, 11, 9,
+ 439, 11, 194, 9, 445, 446, 447, 448, 11, 449, 9, 450, 451, 452, 453, 11,
+ 454, 9, 455, 11, 456, 157, 157, 157, 32, 32, 32, 457, 32, 32, 458, 459,
+ 460, 461, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 47, 47, 47, 462, 463, 144, 144, 144, 47, 47, 47, 47, 47, 47, 464, 465,
+ 47, 47, 47, 47, 348, 32, 32, 32, 9, 9, 442, 11, 466, 300, 66, 66,
+ 143, 143, 467, 468, 143, 143, 143, 143, 143, 143, 469, 143, 143, 143, 143, 143,
+ 47, 47, 47, 47, 47, 47, 47, 224, 143, 144, 144, 144, 144, 144, 144, 144,
+ 144, 144, 144, 144, 144, 144, 144, 470, 206, 206, 206, 206, 206, 206, 206, 206,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008,
+ 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0,
+ 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193,
+ 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303,
+ 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149,
+ 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175,
+ 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199,
+ 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0,
+ 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231,
+ 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258,
+ 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275,
+ 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0,
+ 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093,
+ 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010,
+ 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347,
+ 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424,
+ 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365,
+ 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238,
+ 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182,
+ 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232,
+ 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461,
+ 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486,
+ 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0,
+ 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0,
+ 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0,
+ 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553,
+ 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560,
+ 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0,
+ 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0,
+ 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627,
+ 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0,
+ 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0,
+ 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0,
+ 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0,
+ 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0,
+ 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0,
+ 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0,
+ 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0,
+ 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153,
+ 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171,
+ 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356,
+ 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214,
+ 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363,
+ 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251,
+ 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266,
+ 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287,
+ 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302,
+ 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0,
+ 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375,
+ 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353,
+ 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234,
+ 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403,
+ 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412,
+ 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0,
+ 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721,
+ 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0,
+ 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757,
+ 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776,
+ 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0,
+ 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793,
+ 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814,
+ 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0,
+ 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728,
+ 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764,
+ 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821,
+ 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0,
+ 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828,
+ 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833,
+ 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3,
+ 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0,
+ 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838,
+ 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0,
+ 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0,
+ 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938,
+ 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0,
+ 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870,
+ 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0,
+ 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0,
+ 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0,
+ 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0,
+ 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0,
+ 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0,
+ 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0,
+ 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0,
+ 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0,
+ 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601,
+ 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662,
+ 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168,
+ 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758,
+ 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585,
+ 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259,
+ 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697,
+ 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170,
+ 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330,
+ 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473,
+ 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603,
+ 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411,
+ 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583,
+ 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269,
+ 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510,
+ 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156,
+ 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0,
+ 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0,
+ 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773,
+ 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329,
+ 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548,
+ 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651,
+ 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0,
+ 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243,
+ 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362,
+ 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490,
+ 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586,
+ 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706,
+ 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848,
+ 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575,
+ 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0,
+ 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1948,1949,
+ 1950,1951,1952,1953,1954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1955,1956,1957,1959,1958,
+ 1960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131,
+ 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37,
+ 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179,
+ 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195,
+ 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216,
+ 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244,
+ 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259,
+ 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276,
+ 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934,
+ 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312,
+ 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334,
+ 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361,
+ 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381,
+ 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399,
+ 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417,
+ 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433,
+ 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460,
+ 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870,
+ 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505,
+ 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64,
+ 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538,
+ 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567,
+ 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592,
+ 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611,
+ 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627,
+ 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651,
+ 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83,
+ 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85,
+ 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696,
+ 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728,
+ 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90,
+ 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787,
+ 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807,
+ 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0,
+};
+static const int16_t
+_hb_ucd_i16[92] =
+{
+ 0, 0, 1, -1, 2, 0, -2, 0, 0, 2, 0, -2, 0, 16, 0, -16,
+ 0, 1, -1, 0, 3, 3, 3, -3, -3, -3, 0, 2016, 0, 2527, 1923, 1914,
+ 1918, 0, 2250, 0, 0, 138, 0, 7, -7, 0, -1, 1, 1824, 0, 2104, 0,
+ 2108, 2106, 0, 2106, 1316, 0, -1, -138, 8, 8, 8, 0, 7, 7, -8, -8,
+ -8, -7,-1316, 1, -1, 3, -3, 1, 0,-1914,-1918, 0, 0,-1923,-1824, 0,
+ 0,-2016,-2104, 0, 0,-2106,-2108,-2106,-2250, 0,-2527, 0,
+};
+
+static inline uint_fast8_t
+_hb_ucd_gc (unsigned u)
+{
+ return u<1114112u?_hb_ucd_u8[4840+(((_hb_ucd_u8[1072+(((_hb_ucd_u16[((_hb_ucd_u8[272+(((_hb_ucd_u8[u>>1>>3>>3>>5])<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
+}
+static inline uint_fast8_t
+_hb_ucd_ccc (unsigned u)
+{
+ return u<125259u?_hb_ucd_u8[6670+(((_hb_ucd_u8[6166+(((_hb_ucd_u8[5754+(((_hb_ucd_u8[5306+(((_hb_ucd_u8[5182+(u>>2>>2>>2>>4)])<<4)+((u>>2>>2>>2)&15u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
+}
+static inline unsigned
+_hb_ucd_b4 (const uint8_t* a, unsigned i)
+{
+ return (a[i>>1]>>((i&1u)<<2))&15u;
+}
+static inline int_fast16_t
+_hb_ucd_bmg (unsigned u)
+{
+ return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7538+(((_hb_ucd_u8[7314+(((_hb_ucd_u8[7218+(((_hb_ucd_b4(7154+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0;
+}
+static inline uint_fast8_t
+_hb_ucd_sc (unsigned u)
+{
+ return u<918016u?_hb_ucd_u8[11048+(((_hb_ucd_u8[10132+(((_hb_ucd_u8[8788+(((_hb_ucd_u8[8228+(((_hb_ucd_u8[7778+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2;
+}
+static inline uint_fast16_t
+_hb_ucd_dm (unsigned u)
+{
+ return u<195102u?_hb_ucd_u16[1504+(((_hb_ucd_u8[12048+(((_hb_ucd_b4(11952+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0;
+}
+
+#endif
+
+
+#endif /* HB_UCD_TABLE_HH */
+
+/* == End of generated table == */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ucd.cc b/src/3rdparty/harfbuzz-ng/src/hb-ucd.cc
new file mode 100644
index 0000000000..b29f2a9c7d
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-ucd.cc
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2012 Grigori Goronzy <greg@kinoho.net>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "hb.hh"
+#include "hb-unicode.hh"
+#include "hb-machinery.hh"
+
+#include "hb-ucd-table.hh"
+
+static hb_unicode_combining_class_t
+hb_ucd_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+{
+ return (hb_unicode_combining_class_t) _hb_ucd_ccc (unicode);
+}
+
+static hb_unicode_general_category_t
+hb_ucd_general_category (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+{
+ return (hb_unicode_general_category_t) _hb_ucd_gc (unicode);
+}
+
+static hb_codepoint_t
+hb_ucd_mirroring (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+{
+ return unicode + _hb_ucd_bmg (unicode);
+}
+
+static hb_script_t
+hb_ucd_script (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t unicode,
+ void *user_data HB_UNUSED)
+{
+ return _hb_ucd_sc_map[_hb_ucd_sc (unicode)];
+}
+
+
+#define SBASE 0xAC00u
+#define LBASE 0x1100u
+#define VBASE 0x1161u
+#define TBASE 0x11A7u
+#define SCOUNT 11172u
+#define LCOUNT 19u
+#define VCOUNT 21u
+#define TCOUNT 28u
+#define NCOUNT (VCOUNT * TCOUNT)
+
+static inline bool
+_hb_ucd_decompose_hangul (hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b)
+{
+ unsigned si = ab - SBASE;
+
+ if (si >= SCOUNT)
+ return false;
+
+ if (si % TCOUNT)
+ {
+ /* LV,T */
+ *a = SBASE + (si / TCOUNT) * TCOUNT;
+ *b = TBASE + (si % TCOUNT);
+ return true;
+ } else {
+ /* L,V */
+ *a = LBASE + (si / NCOUNT);
+ *b = VBASE + (si % NCOUNT) / TCOUNT;
+ return true;
+ }
+}
+
+static inline bool
+_hb_ucd_compose_hangul (hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab)
+{
+ if (a >= SBASE && a < (SBASE + SCOUNT) && b > TBASE && b < (TBASE + TCOUNT) &&
+ !((a - SBASE) % TCOUNT))
+ {
+ /* LV,T */
+ *ab = a + (b - TBASE);
+ return true;
+ }
+ else if (a >= LBASE && a < (LBASE + LCOUNT) && b >= VBASE && b < (VBASE + VCOUNT))
+ {
+ /* L,V */
+ int li = a - LBASE;
+ int vi = b - VBASE;
+ *ab = SBASE + li * NCOUNT + vi * TCOUNT;
+ return true;
+ }
+ else
+ return false;
+}
+
+static int
+_cmp_pair (const void *_key, const void *_item)
+{
+ uint64_t& a = * (uint64_t*) _key;
+ uint64_t b = (* (uint64_t*) _item) & HB_CODEPOINT_ENCODE3(0x1FFFFFu, 0x1FFFFFu, 0);
+
+ return a < b ? -1 : a > b ? +1 : 0;
+}
+static int
+_cmp_pair_11_7_14 (const void *_key, const void *_item)
+{
+ uint32_t& a = * (uint32_t*) _key;
+ uint32_t b = (* (uint32_t*) _item) & HB_CODEPOINT_ENCODE3_11_7_14(0x1FFFFFu, 0x1FFFFFu, 0);
+
+ return a < b ? -1 : a > b ? +1 : 0;
+}
+
+static hb_bool_t
+hb_ucd_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab,
+ void *user_data HB_UNUSED)
+{
+ if (_hb_ucd_compose_hangul (a, b, ab)) return true;
+
+ hb_codepoint_t u = 0;
+
+ if ((a & 0xFFFFF800u) == 0x0000u && (b & 0xFFFFFF80) == 0x0300u)
+ {
+ uint32_t k = HB_CODEPOINT_ENCODE3_11_7_14 (a, b, 0);
+ uint32_t *v = (uint32_t*) hb_bsearch (&k, _hb_ucd_dm2_u32_map,
+ ARRAY_LENGTH (_hb_ucd_dm2_u32_map),
+ sizeof (*_hb_ucd_dm2_u32_map),
+ _cmp_pair_11_7_14);
+ if (likely (!v)) return false;
+ u = HB_CODEPOINT_DECODE3_11_7_14_3 (*v);
+ }
+ else
+ {
+ uint64_t k = HB_CODEPOINT_ENCODE3 (a, b, 0);
+ uint64_t *v = (uint64_t*) hb_bsearch (&k, _hb_ucd_dm2_u64_map,
+ ARRAY_LENGTH (_hb_ucd_dm2_u64_map),
+ sizeof (*_hb_ucd_dm2_u64_map),
+ _cmp_pair);
+ if (likely (!v)) return false;
+ u = HB_CODEPOINT_DECODE3_3 (*v);
+ }
+
+ if (unlikely (!u)) return false;
+ *ab = u;
+ return true;
+}
+
+static hb_bool_t
+hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
+ hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b,
+ void *user_data HB_UNUSED)
+{
+ if (_hb_ucd_decompose_hangul (ab, a, b)) return true;
+
+ unsigned i = _hb_ucd_dm (ab);
+
+ if (likely (!i)) return false;
+ i--;
+
+ if (i < ARRAY_LENGTH (_hb_ucd_dm1_p0_map) + ARRAY_LENGTH (_hb_ucd_dm1_p2_map))
+ {
+ if (i < ARRAY_LENGTH (_hb_ucd_dm1_p0_map))
+ *a = _hb_ucd_dm1_p0_map[i];
+ else
+ {
+ i -= ARRAY_LENGTH (_hb_ucd_dm1_p0_map);
+ *a = 0x20000 | _hb_ucd_dm1_p2_map[i];
+ }
+ *b = 0;
+ return true;
+ }
+ i -= ARRAY_LENGTH (_hb_ucd_dm1_p0_map) + ARRAY_LENGTH (_hb_ucd_dm1_p2_map);
+
+ if (i < ARRAY_LENGTH (_hb_ucd_dm2_u32_map))
+ {
+ uint32_t v = _hb_ucd_dm2_u32_map[i];
+ *a = HB_CODEPOINT_DECODE3_11_7_14_1 (v);
+ *b = HB_CODEPOINT_DECODE3_11_7_14_2 (v);
+ return true;
+ }
+ i -= ARRAY_LENGTH (_hb_ucd_dm2_u32_map);
+
+ uint64_t v = _hb_ucd_dm2_u64_map[i];
+ *a = HB_CODEPOINT_DECODE3_1 (v);
+ *b = HB_CODEPOINT_DECODE3_2 (v);
+ return true;
+}
+
+
+#if HB_USE_ATEXIT
+static void free_static_ucd_funcs ();
+#endif
+
+static struct hb_ucd_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_ucd_unicode_funcs_lazy_loader_t>
+{
+ static hb_unicode_funcs_t *create ()
+ {
+ hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr);
+
+ hb_unicode_funcs_set_combining_class_func (funcs, hb_ucd_combining_class, nullptr, nullptr);
+ hb_unicode_funcs_set_general_category_func (funcs, hb_ucd_general_category, nullptr, nullptr);
+ hb_unicode_funcs_set_mirroring_func (funcs, hb_ucd_mirroring, nullptr, nullptr);
+ hb_unicode_funcs_set_script_func (funcs, hb_ucd_script, nullptr, nullptr);
+ hb_unicode_funcs_set_compose_func (funcs, hb_ucd_compose, nullptr, nullptr);
+ hb_unicode_funcs_set_decompose_func (funcs, hb_ucd_decompose, nullptr, nullptr);
+
+ hb_unicode_funcs_make_immutable (funcs);
+
+#if HB_USE_ATEXIT
+ atexit (free_static_ucd_funcs);
+#endif
+
+ return funcs;
+ }
+} static_ucd_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_ucd_funcs ()
+{
+ static_ucd_funcs.free_instance ();
+}
+#endif
+
+hb_unicode_funcs_t *
+hb_ucd_get_unicode_funcs ()
+{
+#ifdef HB_NO_UCD
+ return hb_unicode_funcs_get_empty ();
+#endif
+ return static_ucd_funcs.get_unconst ();
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-unicode-emoji-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-unicode-emoji-table.hh
new file mode 100644
index 0000000000..1ff79c9778
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-unicode-emoji-table.hh
@@ -0,0 +1,78 @@
+/* == Start of generated table == */
+/*
+ * The following tables are generated by running:
+ *
+ * ./gen-emoji-table.py emoji-data.txt
+ *
+ * on file with this header:
+ *
+ * # emoji-data.txt
+ * # Date: 2019-01-15, 12:10:05 GMT
+ * # © 2019 Unicode®, Inc.
+ * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+ * # For terms of use, see http://www.unicode.org/terms_of_use.html
+ * #
+ * # Emoji Data for UTS #51
+ * # Version: 12.0
+ * #
+ * # For documentation and usage, see http://www.unicode.org/reports/tr51
+ */
+
+#ifndef HB_UNICODE_EMOJI_TABLE_HH
+#define HB_UNICODE_EMOJI_TABLE_HH
+
+#include "hb-unicode.hh"
+
+static const uint8_t
+_hb_emoji_u8[448] =
+{
+ 0, 0, 0, 0, 33, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,118,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 3,
+ 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 7, 9, 10, 11, 0,
+ 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0,
+ 7, 7, 7, 14, 15, 16, 17, 18, 19, 20, 7, 7, 7, 7, 7, 21,
+ 7, 7, 7, 7, 22, 23, 7, 7, 7, 24, 7, 14, 0, 25, 0, 26,
+ 27, 28, 29, 14, 30, 31, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 22,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 1, 0, 2, 0, 0,
+ 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 7, 3,
+ 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,
+ 159,255,243,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 31, 0,255,255,255,255,255,255, 31,255, 3, 0, 0, 0, 8, 0,
+ 0, 0, 24, 0,120, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 16, 0, 96, 0, 0, 8, 0, 0, 0, 0,
+ 255,255,255,255,255,255,255,127, 0, 96, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,240, 1, 64, 0, 0,254, 3, 0,224,255,255,
+ 255,255,255,255, 31, 0, 0, 0,254,127, 0, 0, 0, 0,252,115,
+ 0,254,255,255,255,255,255,255,255,255,255,255,255,255,255, 3,
+ 255,255,255,255,255,255,255, 31,192,255,255,255,255,255,255,255,
+ 255,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,127,
+ 0, 0,224,255,255,255,255,127, 0,112, 0, 0, 0, 0, 0, 0,
+ 0,127, 0,124, 0, 0, 0, 0, 0,127, 0, 0, 0,192,255,255,
+ 0,240,255,255,255,255,255,243,159,255,255,255,255,255,255,255,
+};
+
+static inline unsigned
+_hb_emoji_b4 (const uint8_t* a, unsigned i)
+{
+ return (a[i>>1]>>((i&1u)<<2))&15u;
+}
+static inline unsigned
+_hb_emoji_b1 (const uint8_t* a, unsigned i)
+{
+ return (a[i>>3]>>((i&7u)<<0))&1u;
+}
+static inline uint_fast8_t
+_hb_emoji_is_Extended_Pictographic (unsigned u)
+{
+ return u<131069u?_hb_emoji_b1(192+_hb_emoji_u8,((_hb_emoji_u8[64+(((_hb_emoji_b4(_hb_emoji_u8,u>>6>>4))<<4)+((u>>6)&15u))])<<6)+((u)&63u)):0;
+}
+
+
+#endif /* HB_UNICODE_EMOJI_TABLE_HH */
+
+/* == End of generated table == */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-unicode-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-unicode-private.hh
deleted file mode 100644
index 82bb9a4ddc..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-unicode-private.hh
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- * Copyright © 2011 Codethink Limited
- * Copyright © 2010,2011,2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- * Codethink Author(s): Ryan Lortie
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_UNICODE_PRIVATE_HH
-#define HB_UNICODE_PRIVATE_HH
-
-#include "hb-private.hh"
-#include "hb-object-private.hh"
-
-
-extern HB_INTERNAL const uint8_t _hb_modified_combining_class[256];
-
-/*
- * hb_unicode_funcs_t
- */
-
-#define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS \
- HB_UNICODE_FUNC_IMPLEMENT (combining_class) \
- HB_UNICODE_FUNC_IMPLEMENT (eastasian_width) \
- HB_UNICODE_FUNC_IMPLEMENT (general_category) \
- HB_UNICODE_FUNC_IMPLEMENT (mirroring) \
- HB_UNICODE_FUNC_IMPLEMENT (script) \
- HB_UNICODE_FUNC_IMPLEMENT (compose) \
- HB_UNICODE_FUNC_IMPLEMENT (decompose) \
- HB_UNICODE_FUNC_IMPLEMENT (decompose_compatibility) \
- /* ^--- Add new callbacks here */
-
-/* Simple callbacks are those taking a hb_codepoint_t and returning a hb_codepoint_t */
-#define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE \
- HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_combining_class_t, combining_class) \
- HB_UNICODE_FUNC_IMPLEMENT (unsigned int, eastasian_width) \
- HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_general_category_t, general_category) \
- HB_UNICODE_FUNC_IMPLEMENT (hb_codepoint_t, mirroring) \
- HB_UNICODE_FUNC_IMPLEMENT (hb_script_t, script) \
- /* ^--- Add new simple callbacks here */
-
-struct hb_unicode_funcs_t {
- hb_object_header_t header;
- ASSERT_POD ();
-
- hb_unicode_funcs_t *parent;
-
- bool immutable;
-
-#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name) \
- inline return_type name (hb_codepoint_t unicode) { return func.name (this, unicode, user_data.name); }
-HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
-#undef HB_UNICODE_FUNC_IMPLEMENT
-
- inline hb_bool_t compose (hb_codepoint_t a, hb_codepoint_t b,
- hb_codepoint_t *ab)
- {
- *ab = 0;
- if (unlikely (!a || !b)) return false;
- return func.compose (this, a, b, ab, user_data.compose);
- }
-
- inline hb_bool_t decompose (hb_codepoint_t ab,
- hb_codepoint_t *a, hb_codepoint_t *b)
- {
- *a = ab; *b = 0;
- return func.decompose (this, ab, a, b, user_data.decompose);
- }
-
- inline unsigned int decompose_compatibility (hb_codepoint_t u,
- hb_codepoint_t *decomposed)
- {
- unsigned int ret = func.decompose_compatibility (this, u, decomposed, user_data.decompose_compatibility);
- if (ret == 1 && u == decomposed[0]) {
- decomposed[0] = 0;
- return 0;
- }
- decomposed[ret] = 0;
- return ret;
- }
-
-
- inline unsigned int
- modified_combining_class (hb_codepoint_t unicode)
- {
- /* XXX This hack belongs to the Myanmar shaper. */
- if (unlikely (unicode == 0x1037u)) unicode = 0x103Au;
-
- /* XXX This hack belongs to the USE shaper (for Tai Tham):
- * Reorder SAKOT to ensure it comes after any tone marks. */
- if (unlikely (unicode == 0x1A60u)) return 254;
-
- /* XXX This hack belongs to the Tibetan shaper:
- * Reorder PADMA to ensure it comes after any vowel marks. */
- if (unlikely (unicode == 0x0FC6u)) return 254;
- /* Reorder TSA -PHRU to reorder before U+0F74 */
- if (unlikely (unicode == 0x0F39u)) return 127;
-
- return _hb_modified_combining_class[combining_class (unicode)];
- }
-
- static inline hb_bool_t
- is_variation_selector (hb_codepoint_t unicode)
- {
- /* U+180B..180D MONGOLIAN FREE VARIATION SELECTORs are handled in the
- * Arabic shaper. No need to match them here. */
- return unlikely (hb_in_ranges<hb_codepoint_t> (unicode,
- 0xFE00u, 0xFE0Fu, /* VARIATION SELECTOR-1..16 */
- 0xE0100u, 0xE01EFu)); /* VARIATION SELECTOR-17..256 */
- }
-
- /* Default_Ignorable codepoints:
- *
- * Note: While U+115F, U+1160, U+3164 and U+FFA0 are Default_Ignorable,
- * we do NOT want to hide them, as the way Uniscribe has implemented them
- * is with regular spacing glyphs, and that's the way fonts are made to work.
- * As such, we make exceptions for those four.
- * Also ignoring U+1BCA0..1BCA3. https://github.com/harfbuzz/harfbuzz/issues/503
- *
- * Unicode 7.0:
- * $ grep '; Default_Ignorable_Code_Point ' DerivedCoreProperties.txt | sed 's/;.*#/#/'
- * 00AD # Cf SOFT HYPHEN
- * 034F # Mn COMBINING GRAPHEME JOINER
- * 061C # Cf ARABIC LETTER MARK
- * 115F..1160 # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER
- * 17B4..17B5 # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
- * 180B..180D # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
- * 180E # Cf MONGOLIAN VOWEL SEPARATOR
- * 200B..200F # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK
- * 202A..202E # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
- * 2060..2064 # Cf [5] WORD JOINER..INVISIBLE PLUS
- * 2065 # Cn <reserved-2065>
- * 2066..206F # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES
- * 3164 # Lo HANGUL FILLER
- * FE00..FE0F # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
- * FEFF # Cf ZERO WIDTH NO-BREAK SPACE
- * FFA0 # Lo HALFWIDTH HANGUL FILLER
- * FFF0..FFF8 # Cn [9] <reserved-FFF0>..<reserved-FFF8>
- * 1BCA0..1BCA3 # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
- * 1D173..1D17A # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
- * E0000 # Cn <reserved-E0000>
- * E0001 # Cf LANGUAGE TAG
- * E0002..E001F # Cn [30] <reserved-E0002>..<reserved-E001F>
- * E0020..E007F # Cf [96] TAG SPACE..CANCEL TAG
- * E0080..E00FF # Cn [128] <reserved-E0080>..<reserved-E00FF>
- * E0100..E01EF # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
- * E01F0..E0FFF # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
- */
- static inline hb_bool_t
- is_default_ignorable (hb_codepoint_t ch)
- {
- hb_codepoint_t plane = ch >> 16;
- if (likely (plane == 0))
- {
- /* BMP */
- hb_codepoint_t page = ch >> 8;
- switch (page) {
- case 0x00: return unlikely (ch == 0x00ADu);
- case 0x03: return unlikely (ch == 0x034Fu);
- case 0x06: return unlikely (ch == 0x061Cu);
- case 0x17: return hb_in_range<hb_codepoint_t> (ch, 0x17B4u, 0x17B5u);
- case 0x18: return hb_in_range<hb_codepoint_t> (ch, 0x180Bu, 0x180Eu);
- case 0x20: return hb_in_ranges<hb_codepoint_t> (ch, 0x200Bu, 0x200Fu,
- 0x202Au, 0x202Eu,
- 0x2060u, 0x206Fu);
- case 0xFE: return hb_in_range<hb_codepoint_t> (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu;
- case 0xFF: return hb_in_range<hb_codepoint_t> (ch, 0xFFF0u, 0xFFF8u);
- default: return false;
- }
- }
- else
- {
- /* Other planes */
- switch (plane) {
- case 0x01: return hb_in_range<hb_codepoint_t> (ch, 0x1D173u, 0x1D17Au);
- case 0x0E: return hb_in_range<hb_codepoint_t> (ch, 0xE0000u, 0xE0FFFu);
- default: return false;
- }
- }
- }
-
- /* Space estimates based on:
- * http://www.unicode.org/charts/PDF/U2000.pdf
- * https://www.microsoft.com/typography/developers/fdsspec/spaces.aspx
- */
- enum space_t {
- NOT_SPACE = 0,
- SPACE_EM = 1,
- SPACE_EM_2 = 2,
- SPACE_EM_3 = 3,
- SPACE_EM_4 = 4,
- SPACE_EM_5 = 5,
- SPACE_EM_6 = 6,
- SPACE_EM_16 = 16,
- SPACE_4_EM_18, /* 4/18th of an EM! */
- SPACE,
- SPACE_FIGURE,
- SPACE_PUNCTUATION,
- SPACE_NARROW,
- };
- static inline space_t
- space_fallback_type (hb_codepoint_t u)
- {
- switch (u)
- {
- /* All GC=Zs chars that can use a fallback. */
- default: return NOT_SPACE; /* U+1680 OGHAM SPACE MARK */
- case 0x0020u: return SPACE; /* U+0020 SPACE */
- case 0x00A0u: return SPACE; /* U+00A0 NO-BREAK SPACE */
- case 0x2000u: return SPACE_EM_2; /* U+2000 EN QUAD */
- case 0x2001u: return SPACE_EM; /* U+2001 EM QUAD */
- case 0x2002u: return SPACE_EM_2; /* U+2002 EN SPACE */
- case 0x2003u: return SPACE_EM; /* U+2003 EM SPACE */
- case 0x2004u: return SPACE_EM_3; /* U+2004 THREE-PER-EM SPACE */
- case 0x2005u: return SPACE_EM_4; /* U+2005 FOUR-PER-EM SPACE */
- case 0x2006u: return SPACE_EM_6; /* U+2006 SIX-PER-EM SPACE */
- case 0x2007u: return SPACE_FIGURE; /* U+2007 FIGURE SPACE */
- case 0x2008u: return SPACE_PUNCTUATION; /* U+2008 PUNCTUATION SPACE */
- case 0x2009u: return SPACE_EM_5; /* U+2009 THIN SPACE */
- case 0x200Au: return SPACE_EM_16; /* U+200A HAIR SPACE */
- case 0x202Fu: return SPACE_NARROW; /* U+202F NARROW NO-BREAK SPACE */
- case 0x205Fu: return SPACE_4_EM_18; /* U+205F MEDIUM MATHEMATICAL SPACE */
- case 0x3000u: return SPACE_EM; /* U+3000 IDEOGRAPHIC SPACE */
- }
- }
-
- struct {
-#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_func_t name;
- HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_UNICODE_FUNC_IMPLEMENT
- } func;
-
- struct {
-#define HB_UNICODE_FUNC_IMPLEMENT(name) void *name;
- HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_UNICODE_FUNC_IMPLEMENT
- } user_data;
-
- struct {
-#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_destroy_func_t name;
- HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_UNICODE_FUNC_IMPLEMENT
- } destroy;
-};
-
-
-extern HB_INTERNAL const hb_unicode_funcs_t _hb_unicode_funcs_nil;
-
-
-/* Modified combining marks */
-
-/* Hebrew
- *
- * We permute the "fixed-position" classes 10-26 into the order
- * described in the SBL Hebrew manual:
- *
- * http://www.sbl-site.org/Fonts/SBLHebrewUserManual1.5x.pdf
- *
- * (as recommended by:
- * http://forum.fontlab.com/archive-old-microsoft-volt-group/vista-and-diacritic-ordering-t6751.0.html)
- *
- * More details here:
- * https://bugzilla.mozilla.org/show_bug.cgi?id=662055
- */
-#define HB_MODIFIED_COMBINING_CLASS_CCC10 22 /* sheva */
-#define HB_MODIFIED_COMBINING_CLASS_CCC11 15 /* hataf segol */
-#define HB_MODIFIED_COMBINING_CLASS_CCC12 16 /* hataf patah */
-#define HB_MODIFIED_COMBINING_CLASS_CCC13 17 /* hataf qamats */
-#define HB_MODIFIED_COMBINING_CLASS_CCC14 23 /* hiriq */
-#define HB_MODIFIED_COMBINING_CLASS_CCC15 18 /* tsere */
-#define HB_MODIFIED_COMBINING_CLASS_CCC16 19 /* segol */
-#define HB_MODIFIED_COMBINING_CLASS_CCC17 20 /* patah */
-#define HB_MODIFIED_COMBINING_CLASS_CCC18 21 /* qamats */
-#define HB_MODIFIED_COMBINING_CLASS_CCC19 14 /* holam */
-#define HB_MODIFIED_COMBINING_CLASS_CCC20 24 /* qubuts */
-#define HB_MODIFIED_COMBINING_CLASS_CCC21 12 /* dagesh */
-#define HB_MODIFIED_COMBINING_CLASS_CCC22 25 /* meteg */
-#define HB_MODIFIED_COMBINING_CLASS_CCC23 13 /* rafe */
-#define HB_MODIFIED_COMBINING_CLASS_CCC24 10 /* shin dot */
-#define HB_MODIFIED_COMBINING_CLASS_CCC25 11 /* sin dot */
-#define HB_MODIFIED_COMBINING_CLASS_CCC26 26 /* point varika */
-
-/*
- * Arabic
- *
- * Modify to move Shadda (ccc=33) before other marks. See:
- * http://unicode.org/faq/normalization.html#8
- * http://unicode.org/faq/normalization.html#9
- */
-#define HB_MODIFIED_COMBINING_CLASS_CCC27 28 /* fathatan */
-#define HB_MODIFIED_COMBINING_CLASS_CCC28 29 /* dammatan */
-#define HB_MODIFIED_COMBINING_CLASS_CCC29 30 /* kasratan */
-#define HB_MODIFIED_COMBINING_CLASS_CCC30 31 /* fatha */
-#define HB_MODIFIED_COMBINING_CLASS_CCC31 32 /* damma */
-#define HB_MODIFIED_COMBINING_CLASS_CCC32 33 /* kasra */
-#define HB_MODIFIED_COMBINING_CLASS_CCC33 27 /* shadda */
-#define HB_MODIFIED_COMBINING_CLASS_CCC34 34 /* sukun */
-#define HB_MODIFIED_COMBINING_CLASS_CCC35 35 /* superscript alef */
-
-/* Syriac */
-#define HB_MODIFIED_COMBINING_CLASS_CCC36 36 /* superscript alaph */
-
-/* Telugu
- *
- * Modify Telugu length marks (ccc=84, ccc=91).
- * These are the only matras in the main Indic scripts range that have
- * a non-zero ccc. That makes them reorder with the Halant that is
- * ccc=9. Just zero them, we don't need them in our Indic shaper.
- */
-#define HB_MODIFIED_COMBINING_CLASS_CCC84 0 /* length mark */
-#define HB_MODIFIED_COMBINING_CLASS_CCC91 0 /* ai length mark */
-
-/* Thai
- *
- * Modify U+0E38 and U+0E39 (ccc=103) to be reordered before U+0E3A (ccc=9).
- * Assign 3, which is unassigned otherwise.
- * Uniscribe does this reordering too.
- */
-#define HB_MODIFIED_COMBINING_CLASS_CCC103 3 /* sara u / sara uu */
-#define HB_MODIFIED_COMBINING_CLASS_CCC107 107 /* mai * */
-
-/* Lao */
-#define HB_MODIFIED_COMBINING_CLASS_CCC118 118 /* sign u / sign uu */
-#define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */
-
-/* Tibetan
- *
- * In case of multiple vowel-signs, use u first (but after achung)
- * this allows Dzongkha multi-vowel shortcuts to render correctly
- */
-#define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */
-#define HB_MODIFIED_COMBINING_CLASS_CCC130 132 /* sign i */
-#define HB_MODIFIED_COMBINING_CLASS_CCC132 131 /* sign u */
-
-/* Misc */
-
-#define HB_UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat) \
- (FLAG_UNSAFE (gen_cat) & \
- (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
- FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
- FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
-
-#define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL(gen_cat) \
- (FLAG_UNSAFE (gen_cat) & \
- (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
- FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \
- FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL)))
-
-#endif /* HB_UNICODE_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-unicode.cc b/src/3rdparty/harfbuzz-ng/src/hb-unicode.cc
index 726baeb0f1..08a4054cd0 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-unicode.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-unicode.cc
@@ -28,11 +28,25 @@
* Google Author(s): Behdad Esfahbod
*/
-#include "hb-private.hh"
+#include "hb.hh"
-#include "hb-unicode-private.hh"
+#include "hb-unicode.hh"
+/**
+ * SECTION: hb-unicode
+ * @title: hb-unicode
+ * @short_description: Unicode character property access
+ * @include: hb.h
+ *
+ * Unicode functions are used to access Unicode character properties.
+ * Client can pass its own Unicode functions to HarfBuzz, or access
+ * the built-in Unicode functions that come with HarfBuzz.
+ *
+ * With the Unicode functions, one can query variour Unicode character
+ * properties, such as General Category, Script, Combining Class, etc.
+ **/
+
/*
* hb_unicode_funcs_t
@@ -46,6 +60,7 @@ hb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED;
}
+#ifndef HB_DISABLE_DEPRECATED
static unsigned int
hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
hb_codepoint_t unicode HB_UNUSED,
@@ -53,6 +68,7 @@ hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
{
return 1;
}
+#endif
static hb_unicode_general_category_t
hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
@@ -64,7 +80,7 @@ hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
static hb_codepoint_t
hb_unicode_mirroring_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
- hb_codepoint_t unicode HB_UNUSED,
+ hb_codepoint_t unicode,
void *user_data HB_UNUSED)
{
return unicode;
@@ -99,6 +115,7 @@ hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
}
+#ifndef HB_DISABLE_DEPRECATED
static unsigned int
hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
hb_codepoint_t u HB_UNUSED,
@@ -107,54 +124,40 @@ hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED
{
return 0;
}
+#endif
-
-#define HB_UNICODE_FUNCS_IMPLEMENT_SET \
- HB_UNICODE_FUNCS_IMPLEMENT (glib) \
- HB_UNICODE_FUNCS_IMPLEMENT (icu) \
- HB_UNICODE_FUNCS_IMPLEMENT (ucdn) \
- HB_UNICODE_FUNCS_IMPLEMENT (nil) \
- /* ^--- Add new callbacks before nil */
-
-#define hb_nil_get_unicode_funcs hb_unicode_funcs_get_empty
-
-/* Prototype them all */
-#define HB_UNICODE_FUNCS_IMPLEMENT(set) \
-extern "C" hb_unicode_funcs_t *hb_##set##_get_unicode_funcs (void);
-HB_UNICODE_FUNCS_IMPLEMENT_SET
-#undef HB_UNICODE_FUNCS_IMPLEMENT
-
+#if !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_GLIB)
+#include "hb-glib.h"
+#endif
+#if !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
+#include "hb-icu.h"
+#endif
hb_unicode_funcs_t *
-hb_unicode_funcs_get_default (void)
+hb_unicode_funcs_get_default ()
{
-#define HB_UNICODE_FUNCS_IMPLEMENT(set) \
- return hb_##set##_get_unicode_funcs ();
-
-#if defined(HAVE_UCDN)
- HB_UNICODE_FUNCS_IMPLEMENT(ucdn)
-#elif defined(HAVE_GLIB)
- HB_UNICODE_FUNCS_IMPLEMENT(glib)
-#elif defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
- HB_UNICODE_FUNCS_IMPLEMENT(icu)
+#if !defined(HB_NO_UNICODE_FUNCS) && !defined(HB_NO_UCD)
+ return hb_ucd_get_unicode_funcs ();
+#elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_GLIB)
+ return hb_glib_get_unicode_funcs ();
+#elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
+ return hb_icu_get_unicode_funcs ();
#else
#define HB_UNICODE_FUNCS_NIL 1
- HB_UNICODE_FUNCS_IMPLEMENT(nil)
+ return hb_unicode_funcs_get_empty ();
#endif
-
-#undef HB_UNICODE_FUNCS_IMPLEMENT
}
#if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL)
#error "Could not find any Unicode functions implementation, you have to provide your own"
-#error "Consider building hb-ucdn.c. If you absolutely want to build without any, check the code."
+#error "Consider building hb-ucd.cc. If you absolutely want to build without any, check the code."
#endif
/**
* hb_unicode_funcs_create: (Xconstructor)
* @parent: (nullable):
*
- *
+ *
*
* Return value: (transfer full):
*
@@ -185,11 +188,11 @@ hb_unicode_funcs_create (hb_unicode_funcs_t *parent)
}
-const hb_unicode_funcs_t _hb_unicode_funcs_nil = {
+DEFINE_NULL_INSTANCE (hb_unicode_funcs_t) =
+{
HB_OBJECT_HEADER_STATIC,
nullptr, /* parent */
- true, /* immutable */
{
#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil,
HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
@@ -200,23 +203,23 @@ const hb_unicode_funcs_t _hb_unicode_funcs_nil = {
/**
* hb_unicode_funcs_get_empty:
*
- *
+ *
*
* Return value: (transfer full):
*
* Since: 0.9.2
**/
hb_unicode_funcs_t *
-hb_unicode_funcs_get_empty (void)
+hb_unicode_funcs_get_empty ()
{
- return const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil);
+ return const_cast<hb_unicode_funcs_t *> (&Null(hb_unicode_funcs_t));
}
/**
* hb_unicode_funcs_reference: (skip)
* @ufuncs: Unicode functions.
*
- *
+ *
*
* Return value: (transfer full):
*
@@ -232,7 +235,7 @@ hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
* hb_unicode_funcs_destroy: (skip)
* @ufuncs: Unicode functions.
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -254,22 +257,22 @@ hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
/**
* hb_unicode_funcs_set_user_data: (skip)
* @ufuncs: Unicode functions.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @key:
+ * @data:
+ * @destroy:
+ * @replace:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
hb_bool_t
hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
- hb_user_data_key_t *key,
- void * data,
- hb_destroy_func_t destroy,
+ hb_user_data_key_t *key,
+ void * data,
+ hb_destroy_func_t destroy,
hb_bool_t replace)
{
return hb_object_set_user_data (ufuncs, key, data, destroy, replace);
@@ -278,9 +281,9 @@ hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
/**
* hb_unicode_funcs_get_user_data: (skip)
* @ufuncs: Unicode functions.
- * @key:
+ * @key:
+ *
*
- *
*
* Return value: (transfer none):
*
@@ -288,7 +291,7 @@ hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
**/
void *
hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
- hb_user_data_key_t *key)
+ hb_user_data_key_t *key)
{
return hb_object_get_user_data (ufuncs, key);
}
@@ -298,42 +301,42 @@ hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
* hb_unicode_funcs_make_immutable:
* @ufuncs: Unicode functions.
*
- *
+ *
*
* Since: 0.9.2
**/
void
hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
{
- if (unlikely (hb_object_is_inert (ufuncs)))
+ if (hb_object_is_immutable (ufuncs))
return;
- ufuncs->immutable = true;
+ hb_object_make_immutable (ufuncs);
}
/**
* hb_unicode_funcs_is_immutable:
* @ufuncs: Unicode functions.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
hb_bool_t
hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs)
{
- return ufuncs->immutable;
+ return hb_object_is_immutable (ufuncs);
}
/**
* hb_unicode_funcs_get_parent:
* @ufuncs: Unicode functions.
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -352,7 +355,7 @@ hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \
void *user_data, \
hb_destroy_func_t destroy) \
{ \
- if (ufuncs->immutable) \
+ if (hb_object_is_immutable (ufuncs)) \
return; \
\
if (ufuncs->destroy.name) \
@@ -387,13 +390,13 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
/**
* hb_unicode_compose:
* @ufuncs: Unicode functions.
- * @a:
- * @b:
+ * @a:
+ * @b:
* @ab: (out):
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -409,13 +412,13 @@ hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
/**
* hb_unicode_decompose:
* @ufuncs: Unicode functions.
- * @ab:
+ * @ab:
* @a: (out):
* @b: (out):
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -428,17 +431,19 @@ hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
return ufuncs->decompose (ab, a, b);
}
+#ifndef HB_DISABLE_DEPRECATED
/**
* hb_unicode_decompose_compatibility:
* @ufuncs: Unicode functions.
- * @u:
+ * @u:
* @decomposed: (out):
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
+ * Deprecated: 2.0.0
**/
unsigned int
hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
@@ -447,9 +452,11 @@ hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
{
return ufuncs->decompose_compatibility (u, decomposed);
}
+#endif
-/* See hb-unicode-private.hh for details. */
+#ifndef HB_NO_OT_SHAPE
+/* See hb-unicode.hh for details. */
const uint8_t
_hb_modified_combining_class[256] =
{
@@ -561,3 +568,19 @@ _hb_modified_combining_class[256] =
241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
255, /* HB_UNICODE_COMBINING_CLASS_INVALID */
};
+#endif
+
+
+/*
+ * Emoji
+ */
+#ifndef HB_NO_EMOJI_SEQUENCES
+
+#include "hb-unicode-emoji-table.hh"
+
+bool
+_hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp)
+{
+ return _hb_emoji_is_Extended_Pictographic (cp);
+}
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-unicode.h b/src/3rdparty/harfbuzz-ng/src/hb-unicode.h
index 2657f48130..61b1b0ba1f 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-unicode.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-unicode.h
@@ -40,6 +40,14 @@
HB_BEGIN_DECLS
+/**
+ * HB_UNICODE_MAX
+ *
+ * Since: 1.9.0
+ **/
+#define HB_UNICODE_MAX 0x10FFFFu
+
+
/* hb_unicode_general_category_t */
/* Unicode Character Database property: General_Category (gc) */
@@ -192,15 +200,15 @@ hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs);
HB_EXTERN hb_bool_t
hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
- hb_user_data_key_t *key,
- void * data,
- hb_destroy_func_t destroy,
+ hb_user_data_key_t *key,
+ void * data,
+ hb_destroy_func_t destroy,
hb_bool_t replace);
HB_EXTERN void *
hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
- hb_user_data_key_t *key);
+ hb_user_data_key_t *key);
HB_EXTERN void
@@ -222,9 +230,6 @@ hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs);
typedef hb_unicode_combining_class_t (*hb_unicode_combining_class_func_t) (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode,
void *user_data);
-typedef unsigned int (*hb_unicode_eastasian_width_func_t) (hb_unicode_funcs_t *ufuncs,
- hb_codepoint_t unicode,
- void *user_data);
typedef hb_unicode_general_category_t (*hb_unicode_general_category_func_t) (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode,
void *user_data);
@@ -246,32 +251,6 @@ typedef hb_bool_t (*hb_unicode_decompose_func_t) (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t *b,
void *user_data);
-/**
- * hb_unicode_decompose_compatibility_func_t:
- * @ufuncs: a Unicode function structure
- * @u: codepoint to decompose
- * @decomposed: address of codepoint array (of length %HB_UNICODE_MAX_DECOMPOSITION_LEN) to write decomposition into
- * @user_data: user data pointer as passed to hb_unicode_funcs_set_decompose_compatibility_func()
- *
- * Fully decompose @u to its Unicode compatibility decomposition. The codepoints of the decomposition will be written to @decomposed.
- * The complete length of the decomposition will be returned.
- *
- * If @u has no compatibility decomposition, zero should be returned.
- *
- * The Unicode standard guarantees that a buffer of length %HB_UNICODE_MAX_DECOMPOSITION_LEN codepoints will always be sufficient for any
- * compatibility decomposition plus an terminating value of 0. Consequently, @decompose must be allocated by the caller to be at least this length. Implementations
- * of this function type must ensure that they do not write past the provided array.
- *
- * Return value: number of codepoints in the full compatibility decomposition of @u, or 0 if no decomposition available.
- */
-typedef unsigned int (*hb_unicode_decompose_compatibility_func_t) (hb_unicode_funcs_t *ufuncs,
- hb_codepoint_t u,
- hb_codepoint_t *decomposed,
- void *user_data);
-
-/* See Unicode 6.1 for details on the maximum decomposition length. */
-#define HB_UNICODE_MAX_DECOMPOSITION_LEN (18+1) /* codepoints */
-
/* setters */
/**
@@ -281,7 +260,7 @@ typedef unsigned int (*hb_unicode_decompose_compatibility_func_t) (hb_unicode_
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -291,29 +270,13 @@ hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
void *user_data, hb_destroy_func_t destroy);
/**
- * hb_unicode_funcs_set_eastasian_width_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
- *
- *
- * Since: 0.9.2
- **/
-HB_EXTERN void
-hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
- hb_unicode_eastasian_width_func_t func,
- void *user_data, hb_destroy_func_t destroy);
-
-/**
* hb_unicode_funcs_set_general_category_func:
* @ufuncs: a Unicode function structure
* @func: (closure user_data) (destroy destroy) (scope notified):
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -329,7 +292,7 @@ hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -345,7 +308,7 @@ hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -361,7 +324,7 @@ hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -377,7 +340,7 @@ hb_unicode_funcs_set_compose_func (hb_unicode_funcs_t *ufuncs,
* @user_data:
* @destroy:
*
- *
+ *
*
* Since: 0.9.2
**/
@@ -386,22 +349,6 @@ hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_decompose_func_t func,
void *user_data, hb_destroy_func_t destroy);
-/**
- * hb_unicode_funcs_set_decompose_compatibility_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
- *
- *
- * Since: 0.9.2
- **/
-HB_EXTERN void
-hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs,
- hb_unicode_decompose_compatibility_func_t func,
- void *user_data, hb_destroy_func_t destroy);
-
/* accessors */
/**
@@ -414,15 +361,6 @@ hb_unicode_combining_class (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode);
/**
- * hb_unicode_eastasian_width:
- *
- * Since: 0.9.2
- **/
-HB_EXTERN unsigned int
-hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs,
- hb_codepoint_t unicode);
-
-/**
* hb_unicode_general_category:
*
* Since: 0.9.2
@@ -461,11 +399,6 @@ hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t *a,
hb_codepoint_t *b);
-HB_EXTERN unsigned int
-hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
- hb_codepoint_t u,
- hb_codepoint_t *decomposed);
-
HB_END_DECLS
#endif /* HB_UNICODE_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-unicode.hh b/src/3rdparty/harfbuzz-ng/src/hb-unicode.hh
new file mode 100644
index 0000000000..0c355f1113
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-unicode.hh
@@ -0,0 +1,398 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ * Copyright © 2011 Codethink Limited
+ * Copyright © 2010,2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Codethink Author(s): Ryan Lortie
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_UNICODE_HH
+#define HB_UNICODE_HH
+
+#include "hb.hh"
+
+
+extern HB_INTERNAL const uint8_t _hb_modified_combining_class[256];
+
+/*
+ * hb_unicode_funcs_t
+ */
+
+#define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS \
+ HB_UNICODE_FUNC_IMPLEMENT (combining_class) \
+ HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (eastasian_width)) \
+ HB_UNICODE_FUNC_IMPLEMENT (general_category) \
+ HB_UNICODE_FUNC_IMPLEMENT (mirroring) \
+ HB_UNICODE_FUNC_IMPLEMENT (script) \
+ HB_UNICODE_FUNC_IMPLEMENT (compose) \
+ HB_UNICODE_FUNC_IMPLEMENT (decompose) \
+ HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (decompose_compatibility)) \
+ /* ^--- Add new callbacks here */
+
+/* Simple callbacks are those taking a hb_codepoint_t and returning a hb_codepoint_t */
+#define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE \
+ HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_combining_class_t, combining_class) \
+ HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (unsigned int, eastasian_width)) \
+ HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_general_category_t, general_category) \
+ HB_UNICODE_FUNC_IMPLEMENT (hb_codepoint_t, mirroring) \
+ HB_UNICODE_FUNC_IMPLEMENT (hb_script_t, script) \
+ /* ^--- Add new simple callbacks here */
+
+struct hb_unicode_funcs_t
+{
+ hb_object_header_t header;
+
+ hb_unicode_funcs_t *parent;
+
+#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name) \
+ return_type name (hb_codepoint_t unicode) { return func.name (this, unicode, user_data.name); }
+HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
+#undef HB_UNICODE_FUNC_IMPLEMENT
+
+ hb_bool_t compose (hb_codepoint_t a, hb_codepoint_t b,
+ hb_codepoint_t *ab)
+ {
+ *ab = 0;
+ if (unlikely (!a || !b)) return false;
+ return func.compose (this, a, b, ab, user_data.compose);
+ }
+
+ hb_bool_t decompose (hb_codepoint_t ab,
+ hb_codepoint_t *a, hb_codepoint_t *b)
+ {
+ *a = ab; *b = 0;
+ return func.decompose (this, ab, a, b, user_data.decompose);
+ }
+
+ unsigned int decompose_compatibility (hb_codepoint_t u,
+ hb_codepoint_t *decomposed)
+ {
+#ifdef HB_DISABLE_DEPRECATED
+ unsigned int ret = 0;
+#else
+ unsigned int ret = func.decompose_compatibility (this, u, decomposed, user_data.decompose_compatibility);
+#endif
+ if (ret == 1 && u == decomposed[0]) {
+ decomposed[0] = 0;
+ return 0;
+ }
+ decomposed[ret] = 0;
+ return ret;
+ }
+
+ unsigned int
+ modified_combining_class (hb_codepoint_t u)
+ {
+ /* XXX This hack belongs to the USE shaper (for Tai Tham):
+ * Reorder SAKOT to ensure it comes after any tone marks. */
+ if (unlikely (u == 0x1A60u)) return 254;
+
+ /* XXX This hack belongs to the Tibetan shaper:
+ * Reorder PADMA to ensure it comes after any vowel marks. */
+ if (unlikely (u == 0x0FC6u)) return 254;
+ /* Reorder TSA -PHRU to reorder before U+0F74 */
+ if (unlikely (u == 0x0F39u)) return 127;
+
+ return _hb_modified_combining_class[combining_class (u)];
+ }
+
+ static hb_bool_t
+ is_variation_selector (hb_codepoint_t unicode)
+ {
+ /* U+180B..180D MONGOLIAN FREE VARIATION SELECTORs are handled in the
+ * Arabic shaper. No need to match them here. */
+ return unlikely (hb_in_ranges<hb_codepoint_t> (unicode,
+ 0xFE00u, 0xFE0Fu, /* VARIATION SELECTOR-1..16 */
+ 0xE0100u, 0xE01EFu)); /* VARIATION SELECTOR-17..256 */
+ }
+
+ /* Default_Ignorable codepoints:
+ *
+ * Note: While U+115F, U+1160, U+3164 and U+FFA0 are Default_Ignorable,
+ * we do NOT want to hide them, as the way Uniscribe has implemented them
+ * is with regular spacing glyphs, and that's the way fonts are made to work.
+ * As such, we make exceptions for those four.
+ * Also ignoring U+1BCA0..1BCA3. https://github.com/harfbuzz/harfbuzz/issues/503
+ *
+ * Unicode 7.0:
+ * $ grep '; Default_Ignorable_Code_Point ' DerivedCoreProperties.txt | sed 's/;.*#/#/'
+ * 00AD # Cf SOFT HYPHEN
+ * 034F # Mn COMBINING GRAPHEME JOINER
+ * 061C # Cf ARABIC LETTER MARK
+ * 115F..1160 # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER
+ * 17B4..17B5 # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+ * 180B..180D # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+ * 180E # Cf MONGOLIAN VOWEL SEPARATOR
+ * 200B..200F # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK
+ * 202A..202E # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+ * 2060..2064 # Cf [5] WORD JOINER..INVISIBLE PLUS
+ * 2065 # Cn <reserved-2065>
+ * 2066..206F # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES
+ * 3164 # Lo HANGUL FILLER
+ * FE00..FE0F # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+ * FEFF # Cf ZERO WIDTH NO-BREAK SPACE
+ * FFA0 # Lo HALFWIDTH HANGUL FILLER
+ * FFF0..FFF8 # Cn [9] <reserved-FFF0>..<reserved-FFF8>
+ * 1BCA0..1BCA3 # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
+ * 1D173..1D17A # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+ * E0000 # Cn <reserved-E0000>
+ * E0001 # Cf LANGUAGE TAG
+ * E0002..E001F # Cn [30] <reserved-E0002>..<reserved-E001F>
+ * E0020..E007F # Cf [96] TAG SPACE..CANCEL TAG
+ * E0080..E00FF # Cn [128] <reserved-E0080>..<reserved-E00FF>
+ * E0100..E01EF # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+ * E01F0..E0FFF # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
+ */
+ static hb_bool_t
+ is_default_ignorable (hb_codepoint_t ch)
+ {
+ hb_codepoint_t plane = ch >> 16;
+ if (likely (plane == 0))
+ {
+ /* BMP */
+ hb_codepoint_t page = ch >> 8;
+ switch (page) {
+ case 0x00: return unlikely (ch == 0x00ADu);
+ case 0x03: return unlikely (ch == 0x034Fu);
+ case 0x06: return unlikely (ch == 0x061Cu);
+ case 0x17: return hb_in_range<hb_codepoint_t> (ch, 0x17B4u, 0x17B5u);
+ case 0x18: return hb_in_range<hb_codepoint_t> (ch, 0x180Bu, 0x180Eu);
+ case 0x20: return hb_in_ranges<hb_codepoint_t> (ch, 0x200Bu, 0x200Fu,
+ 0x202Au, 0x202Eu,
+ 0x2060u, 0x206Fu);
+ case 0xFE: return hb_in_range<hb_codepoint_t> (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu;
+ case 0xFF: return hb_in_range<hb_codepoint_t> (ch, 0xFFF0u, 0xFFF8u);
+ default: return false;
+ }
+ }
+ else
+ {
+ /* Other planes */
+ switch (plane) {
+ case 0x01: return hb_in_range<hb_codepoint_t> (ch, 0x1D173u, 0x1D17Au);
+ case 0x0E: return hb_in_range<hb_codepoint_t> (ch, 0xE0000u, 0xE0FFFu);
+ default: return false;
+ }
+ }
+ }
+
+ /* Space estimates based on:
+ * https://unicode.org/charts/PDF/U2000.pdf
+ * https://docs.microsoft.com/en-us/typography/develop/character-design-standards/whitespace
+ */
+ enum space_t {
+ NOT_SPACE = 0,
+ SPACE_EM = 1,
+ SPACE_EM_2 = 2,
+ SPACE_EM_3 = 3,
+ SPACE_EM_4 = 4,
+ SPACE_EM_5 = 5,
+ SPACE_EM_6 = 6,
+ SPACE_EM_16 = 16,
+ SPACE_4_EM_18, /* 4/18th of an EM! */
+ SPACE,
+ SPACE_FIGURE,
+ SPACE_PUNCTUATION,
+ SPACE_NARROW,
+ };
+ static space_t
+ space_fallback_type (hb_codepoint_t u)
+ {
+ switch (u)
+ {
+ /* All GC=Zs chars that can use a fallback. */
+ default: return NOT_SPACE; /* U+1680 OGHAM SPACE MARK */
+ case 0x0020u: return SPACE; /* U+0020 SPACE */
+ case 0x00A0u: return SPACE; /* U+00A0 NO-BREAK SPACE */
+ case 0x2000u: return SPACE_EM_2; /* U+2000 EN QUAD */
+ case 0x2001u: return SPACE_EM; /* U+2001 EM QUAD */
+ case 0x2002u: return SPACE_EM_2; /* U+2002 EN SPACE */
+ case 0x2003u: return SPACE_EM; /* U+2003 EM SPACE */
+ case 0x2004u: return SPACE_EM_3; /* U+2004 THREE-PER-EM SPACE */
+ case 0x2005u: return SPACE_EM_4; /* U+2005 FOUR-PER-EM SPACE */
+ case 0x2006u: return SPACE_EM_6; /* U+2006 SIX-PER-EM SPACE */
+ case 0x2007u: return SPACE_FIGURE; /* U+2007 FIGURE SPACE */
+ case 0x2008u: return SPACE_PUNCTUATION; /* U+2008 PUNCTUATION SPACE */
+ case 0x2009u: return SPACE_EM_5; /* U+2009 THIN SPACE */
+ case 0x200Au: return SPACE_EM_16; /* U+200A HAIR SPACE */
+ case 0x202Fu: return SPACE_NARROW; /* U+202F NARROW NO-BREAK SPACE */
+ case 0x205Fu: return SPACE_4_EM_18; /* U+205F MEDIUM MATHEMATICAL SPACE */
+ case 0x3000u: return SPACE_EM; /* U+3000 IDEOGRAPHIC SPACE */
+ }
+ }
+
+ struct {
+#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_func_t name;
+ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_UNICODE_FUNC_IMPLEMENT
+ } func;
+
+ struct {
+#define HB_UNICODE_FUNC_IMPLEMENT(name) void *name;
+ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_UNICODE_FUNC_IMPLEMENT
+ } user_data;
+
+ struct {
+#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_destroy_func_t name;
+ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_UNICODE_FUNC_IMPLEMENT
+ } destroy;
+};
+DECLARE_NULL_INSTANCE (hb_unicode_funcs_t);
+
+
+/*
+ * Modified combining marks
+ */
+
+/* Hebrew
+ *
+ * We permute the "fixed-position" classes 10-26 into the order
+ * described in the SBL Hebrew manual:
+ *
+ * https://www.sbl-site.org/Fonts/SBLHebrewUserManual1.5x.pdf
+ *
+ * (as recommended by:
+ * https://forum.fontlab.com/archive-old-microsoft-volt-group/vista-and-diacritic-ordering/msg22823/)
+ *
+ * More details here:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=662055
+ */
+#define HB_MODIFIED_COMBINING_CLASS_CCC10 22 /* sheva */
+#define HB_MODIFIED_COMBINING_CLASS_CCC11 15 /* hataf segol */
+#define HB_MODIFIED_COMBINING_CLASS_CCC12 16 /* hataf patah */
+#define HB_MODIFIED_COMBINING_CLASS_CCC13 17 /* hataf qamats */
+#define HB_MODIFIED_COMBINING_CLASS_CCC14 23 /* hiriq */
+#define HB_MODIFIED_COMBINING_CLASS_CCC15 18 /* tsere */
+#define HB_MODIFIED_COMBINING_CLASS_CCC16 19 /* segol */
+#define HB_MODIFIED_COMBINING_CLASS_CCC17 20 /* patah */
+#define HB_MODIFIED_COMBINING_CLASS_CCC18 21 /* qamats */
+#define HB_MODIFIED_COMBINING_CLASS_CCC19 14 /* holam */
+#define HB_MODIFIED_COMBINING_CLASS_CCC20 24 /* qubuts */
+#define HB_MODIFIED_COMBINING_CLASS_CCC21 12 /* dagesh */
+#define HB_MODIFIED_COMBINING_CLASS_CCC22 25 /* meteg */
+#define HB_MODIFIED_COMBINING_CLASS_CCC23 13 /* rafe */
+#define HB_MODIFIED_COMBINING_CLASS_CCC24 10 /* shin dot */
+#define HB_MODIFIED_COMBINING_CLASS_CCC25 11 /* sin dot */
+#define HB_MODIFIED_COMBINING_CLASS_CCC26 26 /* point varika */
+
+/*
+ * Arabic
+ *
+ * Modify to move Shadda (ccc=33) before other marks. See:
+ * https://unicode.org/faq/normalization.html#8
+ * https://unicode.org/faq/normalization.html#9
+ */
+#define HB_MODIFIED_COMBINING_CLASS_CCC27 28 /* fathatan */
+#define HB_MODIFIED_COMBINING_CLASS_CCC28 29 /* dammatan */
+#define HB_MODIFIED_COMBINING_CLASS_CCC29 30 /* kasratan */
+#define HB_MODIFIED_COMBINING_CLASS_CCC30 31 /* fatha */
+#define HB_MODIFIED_COMBINING_CLASS_CCC31 32 /* damma */
+#define HB_MODIFIED_COMBINING_CLASS_CCC32 33 /* kasra */
+#define HB_MODIFIED_COMBINING_CLASS_CCC33 27 /* shadda */
+#define HB_MODIFIED_COMBINING_CLASS_CCC34 34 /* sukun */
+#define HB_MODIFIED_COMBINING_CLASS_CCC35 35 /* superscript alef */
+
+/* Syriac */
+#define HB_MODIFIED_COMBINING_CLASS_CCC36 36 /* superscript alaph */
+
+/* Telugu
+ *
+ * Modify Telugu length marks (ccc=84, ccc=91).
+ * These are the only matras in the main Indic scripts range that have
+ * a non-zero ccc. That makes them reorder with the Halant (ccc=9).
+ * Assign 5 and 6, which are otherwise unassigned.
+ */
+#define HB_MODIFIED_COMBINING_CLASS_CCC84 5 /* length mark */
+#define HB_MODIFIED_COMBINING_CLASS_CCC91 6 /* ai length mark */
+
+/* Thai
+ *
+ * Modify U+0E38 and U+0E39 (ccc=103) to be reordered before U+0E3A (ccc=9).
+ * Assign 3, which is unassigned otherwise.
+ * Uniscribe does this reordering too.
+ */
+#define HB_MODIFIED_COMBINING_CLASS_CCC103 3 /* sara u / sara uu */
+#define HB_MODIFIED_COMBINING_CLASS_CCC107 107 /* mai * */
+
+/* Lao */
+#define HB_MODIFIED_COMBINING_CLASS_CCC118 118 /* sign u / sign uu */
+#define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */
+
+/* Tibetan
+ *
+ * In case of multiple vowel-signs, use u first (but after achung)
+ * this allows Dzongkha multi-vowel shortcuts to render correctly
+ */
+#define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */
+#define HB_MODIFIED_COMBINING_CLASS_CCC130 132 /* sign i */
+#define HB_MODIFIED_COMBINING_CLASS_CCC132 131 /* sign u */
+
+/* Misc */
+
+#define HB_UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat) \
+ (FLAG_UNSAFE (gen_cat) & \
+ (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
+
+
+/*
+ * Ranges, used for bsearch tables.
+ */
+
+struct hb_unicode_range_t
+{
+ static int
+ cmp (const void *_key, const void *_item)
+ {
+ hb_codepoint_t cp = *((hb_codepoint_t *) _key);
+ const hb_unicode_range_t *range = (hb_unicode_range_t *) _item;
+
+ if (cp < range->start)
+ return -1;
+ else if (cp <= range->end)
+ return 0;
+ else
+ return +1;
+ }
+
+ hb_codepoint_t start;
+ hb_codepoint_t end;
+};
+
+/*
+ * Emoji.
+ */
+
+HB_INTERNAL bool
+_hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp);
+
+
+extern "C" HB_INTERNAL hb_unicode_funcs_t *hb_ucd_get_unicode_funcs ();
+
+
+#endif /* HB_UNICODE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-uniscribe.cc b/src/3rdparty/harfbuzz-ng/src/hb-uniscribe.cc
new file mode 100644
index 0000000000..e93cf7f419
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-uniscribe.cc
@@ -0,0 +1,1027 @@
+/*
+ * Copyright © 2011,2012,2013 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#ifdef HAVE_UNISCRIBE
+
+#ifdef HB_NO_OT_TAG
+#error "Cannot compile 'uniscribe' shaper with HB_NO_OT_TAG."
+#endif
+
+#include "hb-shaper-impl.hh"
+
+#include <windows.h>
+#include <usp10.h>
+#include <rpc.h>
+
+#ifndef E_NOT_SUFFICIENT_BUFFER
+#define E_NOT_SUFFICIENT_BUFFER HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER)
+#endif
+
+#include "hb-uniscribe.h"
+
+#include "hb-open-file.hh"
+#include "hb-ot-name-table.hh"
+#include "hb-ot-layout.h"
+
+
+/**
+ * SECTION:hb-uniscribe
+ * @title: hb-uniscribe
+ * @short_description: Windows integration
+ * @include: hb-uniscribe.h
+ *
+ * Functions for using HarfBuzz with the Windows fonts.
+ **/
+
+typedef HRESULT (WINAPI *SIOT) /*ScriptItemizeOpenType*/(
+ const WCHAR *pwcInChars,
+ int cInChars,
+ int cMaxItems,
+ const SCRIPT_CONTROL *psControl,
+ const SCRIPT_STATE *psState,
+ SCRIPT_ITEM *pItems,
+ OPENTYPE_TAG *pScriptTags,
+ int *pcItems
+);
+
+typedef HRESULT (WINAPI *SSOT) /*ScriptShapeOpenType*/(
+ HDC hdc,
+ SCRIPT_CACHE *psc,
+ SCRIPT_ANALYSIS *psa,
+ OPENTYPE_TAG tagScript,
+ OPENTYPE_TAG tagLangSys,
+ int *rcRangeChars,
+ TEXTRANGE_PROPERTIES **rpRangeProperties,
+ int cRanges,
+ const WCHAR *pwcChars,
+ int cChars,
+ int cMaxGlyphs,
+ WORD *pwLogClust,
+ SCRIPT_CHARPROP *pCharProps,
+ WORD *pwOutGlyphs,
+ SCRIPT_GLYPHPROP *pOutGlyphProps,
+ int *pcGlyphs
+);
+
+typedef HRESULT (WINAPI *SPOT) /*ScriptPlaceOpenType*/(
+ HDC hdc,
+ SCRIPT_CACHE *psc,
+ SCRIPT_ANALYSIS *psa,
+ OPENTYPE_TAG tagScript,
+ OPENTYPE_TAG tagLangSys,
+ int *rcRangeChars,
+ TEXTRANGE_PROPERTIES **rpRangeProperties,
+ int cRanges,
+ const WCHAR *pwcChars,
+ WORD *pwLogClust,
+ SCRIPT_CHARPROP *pCharProps,
+ int cChars,
+ const WORD *pwGlyphs,
+ const SCRIPT_GLYPHPROP *pGlyphProps,
+ int cGlyphs,
+ int *piAdvance,
+ GOFFSET *pGoffset,
+ ABC *pABC
+);
+
+
+/* Fallback implementations. */
+
+static HRESULT WINAPI
+hb_ScriptItemizeOpenType(
+ const WCHAR *pwcInChars,
+ int cInChars,
+ int cMaxItems,
+ const SCRIPT_CONTROL *psControl,
+ const SCRIPT_STATE *psState,
+ SCRIPT_ITEM *pItems,
+ OPENTYPE_TAG *pScriptTags,
+ int *pcItems
+)
+{
+{
+ return ScriptItemize (pwcInChars,
+ cInChars,
+ cMaxItems,
+ psControl,
+ psState,
+ pItems,
+ pcItems);
+}
+}
+
+static HRESULT WINAPI
+hb_ScriptShapeOpenType(
+ HDC hdc,
+ SCRIPT_CACHE *psc,
+ SCRIPT_ANALYSIS *psa,
+ OPENTYPE_TAG tagScript,
+ OPENTYPE_TAG tagLangSys,
+ int *rcRangeChars,
+ TEXTRANGE_PROPERTIES **rpRangeProperties,
+ int cRanges,
+ const WCHAR *pwcChars,
+ int cChars,
+ int cMaxGlyphs,
+ WORD *pwLogClust,
+ SCRIPT_CHARPROP *pCharProps,
+ WORD *pwOutGlyphs,
+ SCRIPT_GLYPHPROP *pOutGlyphProps,
+ int *pcGlyphs
+)
+{
+ SCRIPT_VISATTR *psva = (SCRIPT_VISATTR *) pOutGlyphProps;
+ return ScriptShape (hdc,
+ psc,
+ pwcChars,
+ cChars,
+ cMaxGlyphs,
+ psa,
+ pwOutGlyphs,
+ pwLogClust,
+ psva,
+ pcGlyphs);
+}
+
+static HRESULT WINAPI
+hb_ScriptPlaceOpenType(
+ HDC hdc,
+ SCRIPT_CACHE *psc,
+ SCRIPT_ANALYSIS *psa,
+ OPENTYPE_TAG tagScript,
+ OPENTYPE_TAG tagLangSys,
+ int *rcRangeChars,
+ TEXTRANGE_PROPERTIES **rpRangeProperties,
+ int cRanges,
+ const WCHAR *pwcChars,
+ WORD *pwLogClust,
+ SCRIPT_CHARPROP *pCharProps,
+ int cChars,
+ const WORD *pwGlyphs,
+ const SCRIPT_GLYPHPROP *pGlyphProps,
+ int cGlyphs,
+ int *piAdvance,
+ GOFFSET *pGoffset,
+ ABC *pABC
+)
+{
+ SCRIPT_VISATTR *psva = (SCRIPT_VISATTR *) pGlyphProps;
+ return ScriptPlace (hdc,
+ psc,
+ pwGlyphs,
+ cGlyphs,
+ psva,
+ psa,
+ piAdvance,
+ pGoffset,
+ pABC);
+}
+
+
+struct hb_uniscribe_shaper_funcs_t
+{
+ SIOT ScriptItemizeOpenType;
+ SSOT ScriptShapeOpenType;
+ SPOT ScriptPlaceOpenType;
+
+ void init ()
+ {
+ HMODULE hinstLib;
+ this->ScriptItemizeOpenType = nullptr;
+ this->ScriptShapeOpenType = nullptr;
+ this->ScriptPlaceOpenType = nullptr;
+
+ hinstLib = GetModuleHandle (TEXT ("usp10.dll"));
+ if (hinstLib)
+ {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-function-type"
+ this->ScriptItemizeOpenType = (SIOT) GetProcAddress (hinstLib, "ScriptItemizeOpenType");
+ this->ScriptShapeOpenType = (SSOT) GetProcAddress (hinstLib, "ScriptShapeOpenType");
+ this->ScriptPlaceOpenType = (SPOT) GetProcAddress (hinstLib, "ScriptPlaceOpenType");
+#pragma GCC diagnostic pop
+ }
+ if (!this->ScriptItemizeOpenType ||
+ !this->ScriptShapeOpenType ||
+ !this->ScriptPlaceOpenType)
+ {
+ DEBUG_MSG (UNISCRIBE, nullptr, "OpenType versions of functions not found; falling back.");
+ this->ScriptItemizeOpenType = hb_ScriptItemizeOpenType;
+ this->ScriptShapeOpenType = hb_ScriptShapeOpenType;
+ this->ScriptPlaceOpenType = hb_ScriptPlaceOpenType;
+ }
+ }
+};
+
+#if HB_USE_ATEXIT
+static void free_static_uniscribe_shaper_funcs ();
+#endif
+
+static struct hb_uniscribe_shaper_funcs_lazy_loader_t : hb_lazy_loader_t<hb_uniscribe_shaper_funcs_t,
+ hb_uniscribe_shaper_funcs_lazy_loader_t>
+{
+ static hb_uniscribe_shaper_funcs_t *create ()
+ {
+ hb_uniscribe_shaper_funcs_t *funcs = (hb_uniscribe_shaper_funcs_t *) calloc (1, sizeof (hb_uniscribe_shaper_funcs_t));
+ if (unlikely (!funcs))
+ return nullptr;
+
+ funcs->init ();
+
+#if HB_USE_ATEXIT
+ atexit (free_static_uniscribe_shaper_funcs);
+#endif
+
+ return funcs;
+ }
+ static void destroy (hb_uniscribe_shaper_funcs_t *p)
+ {
+ free ((void *) p);
+ }
+ static hb_uniscribe_shaper_funcs_t *get_null ()
+ {
+ return nullptr;
+ }
+} static_uniscribe_shaper_funcs;
+
+#if HB_USE_ATEXIT
+static
+void free_static_uniscribe_shaper_funcs ()
+{
+ static_uniscribe_shaper_funcs.free_instance ();
+}
+#endif
+
+static hb_uniscribe_shaper_funcs_t *
+hb_uniscribe_shaper_get_funcs ()
+{
+ return static_uniscribe_shaper_funcs.get_unconst ();
+}
+
+
+struct active_feature_t {
+ OPENTYPE_FEATURE_RECORD rec;
+ unsigned int order;
+
+ HB_INTERNAL static int cmp (const void *pa, const void *pb) {
+ const active_feature_t *a = (const active_feature_t *) pa;
+ const active_feature_t *b = (const active_feature_t *) pb;
+ return a->rec.tagFeature < b->rec.tagFeature ? -1 : a->rec.tagFeature > b->rec.tagFeature ? 1 :
+ a->order < b->order ? -1 : a->order > b->order ? 1 :
+ a->rec.lParameter < b->rec.lParameter ? -1 : a->rec.lParameter > b->rec.lParameter ? 1 :
+ 0;
+ }
+ bool operator== (const active_feature_t *f)
+ { return cmp (this, f) == 0; }
+};
+
+struct feature_event_t {
+ unsigned int index;
+ bool start;
+ active_feature_t feature;
+
+ HB_INTERNAL static int cmp (const void *pa, const void *pb)
+ {
+ const feature_event_t *a = (const feature_event_t *) pa;
+ const feature_event_t *b = (const feature_event_t *) pb;
+ return a->index < b->index ? -1 : a->index > b->index ? 1 :
+ a->start < b->start ? -1 : a->start > b->start ? 1 :
+ active_feature_t::cmp (&a->feature, &b->feature);
+ }
+};
+
+struct range_record_t {
+ TEXTRANGE_PROPERTIES props;
+ unsigned int index_first; /* == start */
+ unsigned int index_last; /* == end - 1 */
+};
+
+
+/*
+ * shaper face data
+ */
+
+struct hb_uniscribe_face_data_t {
+ HANDLE fh;
+ hb_uniscribe_shaper_funcs_t *funcs;
+ wchar_t face_name[LF_FACESIZE];
+};
+
+/* face_name should point to a wchar_t[LF_FACESIZE] object. */
+static void
+_hb_generate_unique_face_name (wchar_t *face_name, unsigned int *plen)
+{
+ /* We'll create a private name for the font from a UUID using a simple,
+ * somewhat base64-like encoding scheme */
+ const char *enc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-";
+ UUID id;
+ UuidCreate ((UUID*) &id);
+ static_assert ((2 + 3 * (16/2) < LF_FACESIZE), "");
+ unsigned int name_str_len = 0;
+ face_name[name_str_len++] = 'F';
+ face_name[name_str_len++] = '_';
+ unsigned char *p = (unsigned char *) &id;
+ for (unsigned int i = 0; i < 16; i += 2)
+ {
+ /* Spread the 16 bits from two bytes of the UUID across three chars of face_name,
+ * using the bits in groups of 5,5,6 to select chars from enc.
+ * This will generate 24 characters; with the 'F_' prefix we already provided,
+ * the name will be 26 chars (plus the NUL terminator), so will always fit within
+ * face_name (LF_FACESIZE = 32). */
+ face_name[name_str_len++] = enc[p[i] >> 3];
+ face_name[name_str_len++] = enc[((p[i] << 2) | (p[i + 1] >> 6)) & 0x1f];
+ face_name[name_str_len++] = enc[p[i + 1] & 0x3f];
+ }
+ face_name[name_str_len] = 0;
+ if (plen)
+ *plen = name_str_len;
+}
+
+/* Destroys blob. */
+static hb_blob_t *
+_hb_rename_font (hb_blob_t *blob, wchar_t *new_name)
+{
+ /* Create a copy of the font data, with the 'name' table replaced by a
+ * table that names the font with our private F_* name created above.
+ * For simplicity, we just append a new 'name' table and update the
+ * sfnt directory; the original table is left in place, but unused.
+ *
+ * The new table will contain just 5 name IDs: family, style, unique,
+ * full, PS. All of them point to the same name data with our unique name.
+ */
+
+ blob = hb_sanitize_context_t ().sanitize_blob<OT::OpenTypeFontFile> (blob);
+
+ unsigned int length, new_length, name_str_len;
+ const char *orig_sfnt_data = hb_blob_get_data (blob, &length);
+
+ _hb_generate_unique_face_name (new_name, &name_str_len);
+
+ static const uint16_t name_IDs[] = { 1, 2, 3, 4, 6 };
+
+ unsigned int name_table_length = OT::name::min_size +
+ ARRAY_LENGTH (name_IDs) * OT::NameRecord::static_size +
+ name_str_len * 2; /* for name data in UTF16BE form */
+ unsigned int padded_name_table_length = ((name_table_length + 3) & ~3);
+ unsigned int name_table_offset = (length + 3) & ~3;
+
+ new_length = name_table_offset + padded_name_table_length;
+ void *new_sfnt_data = calloc (1, new_length);
+ if (!new_sfnt_data)
+ {
+ hb_blob_destroy (blob);
+ return nullptr;
+ }
+
+ memcpy(new_sfnt_data, orig_sfnt_data, length);
+
+ OT::name &name = StructAtOffset<OT::name> (new_sfnt_data, name_table_offset);
+ name.format = 0;
+ name.count = ARRAY_LENGTH (name_IDs);
+ name.stringOffset = name.get_size ();
+ for (unsigned int i = 0; i < ARRAY_LENGTH (name_IDs); i++)
+ {
+ OT::NameRecord &record = name.nameRecordZ[i];
+ record.platformID = 3;
+ record.encodingID = 1;
+ record.languageID = 0x0409u; /* English */
+ record.nameID = name_IDs[i];
+ record.length = name_str_len * 2;
+ record.offset = 0;
+ }
+
+ /* Copy string data from new_name, converting wchar_t to UTF16BE. */
+ unsigned char *p = &StructAfter<unsigned char> (name);
+ for (unsigned int i = 0; i < name_str_len; i++)
+ {
+ *p++ = new_name[i] >> 8;
+ *p++ = new_name[i] & 0xff;
+ }
+
+ /* Adjust name table entry to point to new name table */
+ const OT::OpenTypeFontFile &file = * (OT::OpenTypeFontFile *) (new_sfnt_data);
+ unsigned int face_count = file.get_face_count ();
+ for (unsigned int face_index = 0; face_index < face_count; face_index++)
+ {
+ /* Note: doing multiple edits (ie. TTC) can be unsafe. There may be
+ * toe-stepping. But we don't really care. */
+ const OT::OpenTypeFontFace &face = file.get_face (face_index);
+ unsigned int index;
+ if (face.find_table_index (HB_OT_TAG_name, &index))
+ {
+ OT::TableRecord &record = const_cast<OT::TableRecord &> (face.get_table (index));
+ record.checkSum.set_for_data (&name, padded_name_table_length);
+ record.offset = name_table_offset;
+ record.length = name_table_length;
+ }
+ else if (face_index == 0) /* Fail if first face doesn't have 'name' table. */
+ {
+ free (new_sfnt_data);
+ hb_blob_destroy (blob);
+ return nullptr;
+ }
+ }
+
+ /* The checkSumAdjustment field in the 'head' table is now wrong,
+ * but that doesn't actually seem to cause any problems so we don't
+ * bother. */
+
+ hb_blob_destroy (blob);
+ return hb_blob_create ((const char *) new_sfnt_data, new_length,
+ HB_MEMORY_MODE_WRITABLE, nullptr, free);
+}
+
+hb_uniscribe_face_data_t *
+_hb_uniscribe_shaper_face_data_create (hb_face_t *face)
+{
+ hb_uniscribe_face_data_t *data = (hb_uniscribe_face_data_t *) calloc (1, sizeof (hb_uniscribe_face_data_t));
+ if (unlikely (!data))
+ return nullptr;
+
+ data->funcs = hb_uniscribe_shaper_get_funcs ();
+ if (unlikely (!data->funcs))
+ {
+ free (data);
+ return nullptr;
+ }
+
+ hb_blob_t *blob = hb_face_reference_blob (face);
+ if (unlikely (!hb_blob_get_length (blob)))
+ DEBUG_MSG (UNISCRIBE, face, "Face has empty blob");
+
+ blob = _hb_rename_font (blob, data->face_name);
+ if (unlikely (!blob))
+ {
+ free (data);
+ return nullptr;
+ }
+
+ DWORD num_fonts_installed;
+ data->fh = AddFontMemResourceEx ((void *) hb_blob_get_data (blob, nullptr),
+ hb_blob_get_length (blob),
+ 0, &num_fonts_installed);
+ if (unlikely (!data->fh))
+ {
+ DEBUG_MSG (UNISCRIBE, face, "Face AddFontMemResourceEx() failed");
+ free (data);
+ return nullptr;
+ }
+
+ return data;
+}
+
+void
+_hb_uniscribe_shaper_face_data_destroy (hb_uniscribe_face_data_t *data)
+{
+ RemoveFontMemResourceEx (data->fh);
+ free (data);
+}
+
+
+/*
+ * shaper font data
+ */
+
+struct hb_uniscribe_font_data_t
+{
+ HDC hdc;
+ mutable LOGFONTW log_font;
+ HFONT hfont;
+ mutable SCRIPT_CACHE script_cache;
+ double x_mult, y_mult; /* From LOGFONT space to HB space. */
+};
+
+static bool
+populate_log_font (LOGFONTW *lf,
+ hb_font_t *font,
+ unsigned int font_size)
+{
+ memset (lf, 0, sizeof (*lf));
+ lf->lfHeight = - (int) font_size;
+ lf->lfCharSet = DEFAULT_CHARSET;
+
+ memcpy (lf->lfFaceName, font->face->data.uniscribe->face_name, sizeof (lf->lfFaceName));
+
+ return true;
+}
+
+hb_uniscribe_font_data_t *
+_hb_uniscribe_shaper_font_data_create (hb_font_t *font)
+{
+ hb_uniscribe_font_data_t *data = (hb_uniscribe_font_data_t *) calloc (1, sizeof (hb_uniscribe_font_data_t));
+ if (unlikely (!data))
+ return nullptr;
+
+ int font_size = font->face->get_upem (); /* Default... */
+ /* No idea if the following is even a good idea. */
+ if (font->y_ppem)
+ font_size = font->y_ppem;
+
+ if (font_size < 0)
+ font_size = -font_size;
+ data->x_mult = (double) font->x_scale / font_size;
+ data->y_mult = (double) font->y_scale / font_size;
+
+ data->hdc = GetDC (nullptr);
+
+ if (unlikely (!populate_log_font (&data->log_font, font, font_size))) {
+ DEBUG_MSG (UNISCRIBE, font, "Font populate_log_font() failed");
+ _hb_uniscribe_shaper_font_data_destroy (data);
+ return nullptr;
+ }
+
+ data->hfont = CreateFontIndirectW (&data->log_font);
+ if (unlikely (!data->hfont)) {
+ DEBUG_MSG (UNISCRIBE, font, "Font CreateFontIndirectW() failed");
+ _hb_uniscribe_shaper_font_data_destroy (data);
+ return nullptr;
+ }
+
+ if (!SelectObject (data->hdc, data->hfont)) {
+ DEBUG_MSG (UNISCRIBE, font, "Font SelectObject() failed");
+ _hb_uniscribe_shaper_font_data_destroy (data);
+ return nullptr;
+ }
+
+ return data;
+}
+
+void
+_hb_uniscribe_shaper_font_data_destroy (hb_uniscribe_font_data_t *data)
+{
+ if (data->hdc)
+ ReleaseDC (nullptr, data->hdc);
+ if (data->hfont)
+ DeleteObject (data->hfont);
+ if (data->script_cache)
+ ScriptFreeCache (&data->script_cache);
+ free (data);
+}
+
+LOGFONTW *
+hb_uniscribe_font_get_logfontw (hb_font_t *font)
+{
+ const hb_uniscribe_font_data_t *data = font->data.uniscribe;
+ return data ? &data->log_font : nullptr;
+}
+
+HFONT
+hb_uniscribe_font_get_hfont (hb_font_t *font)
+{
+ const hb_uniscribe_font_data_t *data = font->data.uniscribe;
+ return data ? data->hfont : nullptr;
+}
+
+
+/*
+ * shaper
+ */
+
+
+hb_bool_t
+_hb_uniscribe_shape (hb_shape_plan_t *shape_plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer,
+ const hb_feature_t *features,
+ unsigned int num_features)
+{
+ hb_face_t *face = font->face;
+ const hb_uniscribe_face_data_t *face_data = face->data.uniscribe;
+ const hb_uniscribe_font_data_t *font_data = font->data.uniscribe;
+ hb_uniscribe_shaper_funcs_t *funcs = face_data->funcs;
+
+ /*
+ * Set up features.
+ */
+ hb_vector_t<OPENTYPE_FEATURE_RECORD> feature_records;
+ hb_vector_t<range_record_t> range_records;
+ if (num_features)
+ {
+ /* Sort features by start/end events. */
+ hb_vector_t<feature_event_t> feature_events;
+ for (unsigned int i = 0; i < num_features; i++)
+ {
+ active_feature_t feature;
+ feature.rec.tagFeature = hb_uint32_swap (features[i].tag);
+ feature.rec.lParameter = features[i].value;
+ feature.order = i;
+
+ feature_event_t *event;
+
+ event = feature_events.push ();
+ event->index = features[i].start;
+ event->start = true;
+ event->feature = feature;
+
+ event = feature_events.push ();
+ event->index = features[i].end;
+ event->start = false;
+ event->feature = feature;
+ }
+ feature_events.qsort ();
+ /* Add a strategic final event. */
+ {
+ active_feature_t feature;
+ feature.rec.tagFeature = 0;
+ feature.rec.lParameter = 0;
+ feature.order = num_features + 1;
+
+ feature_event_t *event = feature_events.push ();
+ event->index = 0; /* This value does magic. */
+ event->start = false;
+ event->feature = feature;
+ }
+
+ /* Scan events and save features for each range. */
+ hb_vector_t<active_feature_t> active_features;
+ unsigned int last_index = 0;
+ for (unsigned int i = 0; i < feature_events.length; i++)
+ {
+ feature_event_t *event = &feature_events[i];
+
+ if (event->index != last_index)
+ {
+ /* Save a snapshot of active features and the range. */
+ range_record_t *range = range_records.push ();
+
+ unsigned int offset = feature_records.length;
+
+ active_features.qsort ();
+ for (unsigned int j = 0; j < active_features.length; j++)
+ {
+ if (!j || active_features[j].rec.tagFeature != feature_records[feature_records.length - 1].tagFeature)
+ {
+ feature_records.push (active_features[j].rec);
+ }
+ else
+ {
+ /* Overrides value for existing feature. */
+ feature_records[feature_records.length - 1].lParameter = active_features[j].rec.lParameter;
+ }
+ }
+
+ /* Will convert to pointer after all is ready, since feature_records.array
+ * may move as we grow it. */
+ range->props.potfRecords = reinterpret_cast<OPENTYPE_FEATURE_RECORD *> (offset);
+ range->props.cotfRecords = feature_records.length - offset;
+ range->index_first = last_index;
+ range->index_last = event->index - 1;
+
+ last_index = event->index;
+ }
+
+ if (event->start)
+ {
+ active_features.push (event->feature);
+ }
+ else
+ {
+ active_feature_t *feature = active_features.find (&event->feature);
+ if (feature)
+ active_features.remove (feature - active_features.arrayZ);
+ }
+ }
+
+ if (!range_records.length) /* No active feature found. */
+ num_features = 0;
+
+ /* Fixup the pointers. */
+ for (unsigned int i = 0; i < range_records.length; i++)
+ {
+ range_record_t *range = &range_records[i];
+ range->props.potfRecords = (OPENTYPE_FEATURE_RECORD *) feature_records + reinterpret_cast<uintptr_t> (range->props.potfRecords);
+ }
+ }
+
+#define FAIL(...) \
+ HB_STMT_START { \
+ DEBUG_MSG (UNISCRIBE, nullptr, __VA_ARGS__); \
+ return false; \
+ } HB_STMT_END
+
+ HRESULT hr;
+
+retry:
+
+ unsigned int scratch_size;
+ hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size);
+
+#define ALLOCATE_ARRAY(Type, name, len) \
+ Type *name = (Type *) scratch; \
+ do { \
+ unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \
+ assert (_consumed <= scratch_size); \
+ scratch += _consumed; \
+ scratch_size -= _consumed; \
+ } while (0)
+
+#define utf16_index() var1.u32
+
+ ALLOCATE_ARRAY (WCHAR, pchars, buffer->len * 2);
+
+ unsigned int chars_len = 0;
+ for (unsigned int i = 0; i < buffer->len; i++)
+ {
+ hb_codepoint_t c = buffer->info[i].codepoint;
+ buffer->info[i].utf16_index() = chars_len;
+ if (likely (c <= 0xFFFFu))
+ pchars[chars_len++] = c;
+ else if (unlikely (c > 0x10FFFFu))
+ pchars[chars_len++] = 0xFFFDu;
+ else {
+ pchars[chars_len++] = 0xD800u + ((c - 0x10000u) >> 10);
+ pchars[chars_len++] = 0xDC00u + ((c - 0x10000u) & ((1u << 10) - 1));
+ }
+ }
+
+ ALLOCATE_ARRAY (WORD, log_clusters, chars_len);
+ ALLOCATE_ARRAY (SCRIPT_CHARPROP, char_props, chars_len);
+
+ if (num_features)
+ {
+ /* Need log_clusters to assign features. */
+ chars_len = 0;
+ for (unsigned int i = 0; i < buffer->len; i++)
+ {
+ hb_codepoint_t c = buffer->info[i].codepoint;
+ unsigned int cluster = buffer->info[i].cluster;
+ log_clusters[chars_len++] = cluster;
+ if (hb_in_range (c, 0x10000u, 0x10FFFFu))
+ log_clusters[chars_len++] = cluster; /* Surrogates. */
+ }
+ }
+
+ /* The -2 in the following is to compensate for possible
+ * alignment needed after the WORD array. sizeof(WORD) == 2. */
+ unsigned int glyphs_size = (scratch_size * sizeof (int) - 2)
+ / (sizeof (WORD) +
+ sizeof (SCRIPT_GLYPHPROP) +
+ sizeof (int) +
+ sizeof (GOFFSET) +
+ sizeof (uint32_t));
+
+ ALLOCATE_ARRAY (WORD, glyphs, glyphs_size);
+ ALLOCATE_ARRAY (SCRIPT_GLYPHPROP, glyph_props, glyphs_size);
+ ALLOCATE_ARRAY (int, advances, glyphs_size);
+ ALLOCATE_ARRAY (GOFFSET, offsets, glyphs_size);
+ ALLOCATE_ARRAY (uint32_t, vis_clusters, glyphs_size);
+
+ /* Note:
+ * We can't touch the contents of glyph_props. Our fallback
+ * implementations of Shape and Place functions use that buffer
+ * by casting it to a different type. It works because they
+ * both agree about it, but if we want to access it here we
+ * need address that issue first.
+ */
+
+#undef ALLOCATE_ARRAY
+
+#define MAX_ITEMS 256
+
+ SCRIPT_ITEM items[MAX_ITEMS + 1];
+ SCRIPT_CONTROL bidi_control = {0};
+ SCRIPT_STATE bidi_state = {0};
+ ULONG script_tags[MAX_ITEMS];
+ int item_count;
+
+ /* MinGW32 doesn't define fMergeNeutralItems, so we bruteforce */
+ //bidi_control.fMergeNeutralItems = true;
+ *(uint32_t*)&bidi_control |= 1u<<24;
+
+ bidi_state.uBidiLevel = HB_DIRECTION_IS_FORWARD (buffer->props.direction) ? 0 : 1;
+ bidi_state.fOverrideDirection = 1;
+
+ hr = funcs->ScriptItemizeOpenType (pchars,
+ chars_len,
+ MAX_ITEMS,
+ &bidi_control,
+ &bidi_state,
+ items,
+ script_tags,
+ &item_count);
+ if (unlikely (FAILED (hr)))
+ FAIL ("ScriptItemizeOpenType() failed: 0x%08lx", hr);
+
+#undef MAX_ITEMS
+
+ hb_tag_t lang_tag;
+ unsigned int lang_count = 1;
+ hb_ot_tags_from_script_and_language (buffer->props.script,
+ buffer->props.language,
+ nullptr, nullptr,
+ &lang_count, &lang_tag);
+ OPENTYPE_TAG language_tag = hb_uint32_swap (lang_count ? lang_tag : HB_TAG_NONE);
+ hb_vector_t<TEXTRANGE_PROPERTIES*> range_properties;
+ hb_vector_t<int> range_char_counts;
+
+ unsigned int glyphs_offset = 0;
+ unsigned int glyphs_len;
+ bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
+ for (int i = 0; i < item_count; i++)
+ {
+ unsigned int chars_offset = items[i].iCharPos;
+ unsigned int item_chars_len = items[i + 1].iCharPos - chars_offset;
+
+ if (num_features)
+ {
+ range_properties.shrink (0);
+ range_char_counts.shrink (0);
+
+ range_record_t *last_range = &range_records[0];
+
+ for (unsigned int k = chars_offset; k < chars_offset + item_chars_len; k++)
+ {
+ range_record_t *range = last_range;
+ while (log_clusters[k] < range->index_first)
+ range--;
+ while (log_clusters[k] > range->index_last)
+ range++;
+ if (!range_properties.length ||
+ &range->props != range_properties[range_properties.length - 1])
+ {
+ TEXTRANGE_PROPERTIES **props = range_properties.push ();
+ int *c = range_char_counts.push ();
+ if (unlikely (!props || !c))
+ {
+ range_properties.shrink (0);
+ range_char_counts.shrink (0);
+ break;
+ }
+ *props = &range->props;
+ *c = 1;
+ }
+ else
+ {
+ range_char_counts[range_char_counts.length - 1]++;
+ }
+
+ last_range = range;
+ }
+ }
+
+ /* Asking for glyphs in logical order circumvents at least
+ * one bug in Uniscribe. */
+ items[i].a.fLogicalOrder = true;
+
+ retry_shape:
+ hr = funcs->ScriptShapeOpenType (font_data->hdc,
+ &font_data->script_cache,
+ &items[i].a,
+ script_tags[i],
+ language_tag,
+ range_char_counts.arrayZ,
+ range_properties.arrayZ,
+ range_properties.length,
+ pchars + chars_offset,
+ item_chars_len,
+ glyphs_size - glyphs_offset,
+ /* out */
+ log_clusters + chars_offset,
+ char_props + chars_offset,
+ glyphs + glyphs_offset,
+ glyph_props + glyphs_offset,
+ (int *) &glyphs_len);
+
+ if (unlikely (items[i].a.fNoGlyphIndex))
+ FAIL ("ScriptShapeOpenType() set fNoGlyphIndex");
+ if (unlikely (hr == E_OUTOFMEMORY || hr == E_NOT_SUFFICIENT_BUFFER))
+ {
+ if (unlikely (!buffer->ensure (buffer->allocated * 2)))
+ FAIL ("Buffer resize failed");
+ goto retry;
+ }
+ if (unlikely (hr == USP_E_SCRIPT_NOT_IN_FONT))
+ {
+ if (items[i].a.eScript == SCRIPT_UNDEFINED)
+ FAIL ("ScriptShapeOpenType() failed: Font doesn't support script");
+ items[i].a.eScript = SCRIPT_UNDEFINED;
+ goto retry_shape;
+ }
+ if (unlikely (FAILED (hr)))
+ {
+ FAIL ("ScriptShapeOpenType() failed: 0x%08lx", hr);
+ }
+
+ for (unsigned int j = chars_offset; j < chars_offset + item_chars_len; j++)
+ log_clusters[j] += glyphs_offset;
+
+ hr = funcs->ScriptPlaceOpenType (font_data->hdc,
+ &font_data->script_cache,
+ &items[i].a,
+ script_tags[i],
+ language_tag,
+ range_char_counts.arrayZ,
+ range_properties.arrayZ,
+ range_properties.length,
+ pchars + chars_offset,
+ log_clusters + chars_offset,
+ char_props + chars_offset,
+ item_chars_len,
+ glyphs + glyphs_offset,
+ glyph_props + glyphs_offset,
+ glyphs_len,
+ /* out */
+ advances + glyphs_offset,
+ offsets + glyphs_offset,
+ nullptr);
+ if (unlikely (FAILED (hr)))
+ FAIL ("ScriptPlaceOpenType() failed: 0x%08lx", hr);
+
+ if (DEBUG_ENABLED (UNISCRIBE))
+ fprintf (stderr, "Item %d RTL %d LayoutRTL %d LogicalOrder %d ScriptTag %c%c%c%c\n",
+ i,
+ items[i].a.fRTL,
+ items[i].a.fLayoutRTL,
+ items[i].a.fLogicalOrder,
+ HB_UNTAG (hb_uint32_swap (script_tags[i])));
+
+ glyphs_offset += glyphs_len;
+ }
+ glyphs_len = glyphs_offset;
+
+ /* Ok, we've got everything we need, now compose output buffer,
+ * very, *very*, carefully! */
+
+ /* Calculate visual-clusters. That's what we ship. */
+ for (unsigned int i = 0; i < glyphs_len; i++)
+ vis_clusters[i] = (uint32_t) -1;
+ for (unsigned int i = 0; i < buffer->len; i++) {
+ uint32_t *p = &vis_clusters[log_clusters[buffer->info[i].utf16_index()]];
+ *p = hb_min (*p, buffer->info[i].cluster);
+ }
+ for (unsigned int i = 1; i < glyphs_len; i++)
+ if (vis_clusters[i] == (uint32_t) -1)
+ vis_clusters[i] = vis_clusters[i - 1];
+
+#undef utf16_index
+
+ if (unlikely (!buffer->ensure (glyphs_len)))
+ FAIL ("Buffer in error");
+
+#undef FAIL
+
+ /* Set glyph infos */
+ buffer->len = 0;
+ for (unsigned int i = 0; i < glyphs_len; i++)
+ {
+ hb_glyph_info_t *info = &buffer->info[buffer->len++];
+
+ info->codepoint = glyphs[i];
+ info->cluster = vis_clusters[i];
+
+ /* The rest is crap. Let's store position info there for now. */
+ info->mask = advances[i];
+ info->var1.i32 = offsets[i].du;
+ info->var2.i32 = offsets[i].dv;
+ }
+
+ /* Set glyph positions */
+ buffer->clear_positions ();
+ double x_mult = font_data->x_mult, y_mult = font_data->y_mult;
+ for (unsigned int i = 0; i < glyphs_len; i++)
+ {
+ hb_glyph_info_t *info = &buffer->info[i];
+ hb_glyph_position_t *pos = &buffer->pos[i];
+
+ /* TODO vertical */
+ pos->x_advance = x_mult * (int32_t) info->mask;
+ pos->x_offset = x_mult * (backward ? -info->var1.i32 : info->var1.i32);
+ pos->y_offset = y_mult * info->var2.i32;
+ }
+
+ if (backward)
+ hb_buffer_reverse (buffer);
+
+ buffer->unsafe_to_break_all ();
+
+ /* Wow, done! */
+ return true;
+}
+
+
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-uniscribe.h b/src/3rdparty/harfbuzz-ng/src/hb-uniscribe.h
new file mode 100644
index 0000000000..4e4ef9986a
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-uniscribe.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_UNISCRIBE_H
+#define HB_UNISCRIBE_H
+
+#include "hb.h"
+
+#include <windows.h>
+
+HB_BEGIN_DECLS
+
+
+HB_EXTERN LOGFONTW *
+hb_uniscribe_font_get_logfontw (hb_font_t *font);
+
+HB_EXTERN HFONT
+hb_uniscribe_font_get_hfont (hb_font_t *font);
+
+
+HB_END_DECLS
+
+#endif /* HB_UNISCRIBE_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-utf-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-utf-private.hh
deleted file mode 100644
index 211eb4dc02..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-utf-private.hh
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright © 2011,2012,2014 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_UTF_PRIVATE_HH
-#define HB_UTF_PRIVATE_HH
-
-#include "hb-private.hh"
-
-
-struct hb_utf8_t
-{
- typedef uint8_t codepoint_t;
-
- static inline const uint8_t *
- next (const uint8_t *text,
- const uint8_t *end,
- hb_codepoint_t *unicode,
- hb_codepoint_t replacement)
- {
- /* Written to only accept well-formed sequences.
- * Based on ideas from ICU's U8_NEXT.
- * Generates one "replacement" for each ill-formed byte. */
-
- hb_codepoint_t c = *text++;
-
- if (c > 0x7Fu)
- {
- if (hb_in_range<hb_codepoint_t> (c, 0xC2u, 0xDFu)) /* Two-byte */
- {
- unsigned int t1;
- if (likely (text < end &&
- (t1 = text[0] - 0x80u) <= 0x3Fu))
- {
- c = ((c&0x1Fu)<<6) | t1;
- text++;
- }
- else
- goto error;
- }
- else if (hb_in_range<hb_codepoint_t> (c, 0xE0u, 0xEFu)) /* Three-byte */
- {
- unsigned int t1, t2;
- if (likely (1 < end - text &&
- (t1 = text[0] - 0x80u) <= 0x3Fu &&
- (t2 = text[1] - 0x80u) <= 0x3Fu))
- {
- c = ((c&0xFu)<<12) | (t1<<6) | t2;
- if (unlikely (c < 0x0800u || hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
- goto error;
- text += 2;
- }
- else
- goto error;
- }
- else if (hb_in_range<hb_codepoint_t> (c, 0xF0u, 0xF4u)) /* Four-byte */
- {
- unsigned int t1, t2, t3;
- if (likely (2 < end - text &&
- (t1 = text[0] - 0x80u) <= 0x3Fu &&
- (t2 = text[1] - 0x80u) <= 0x3Fu &&
- (t3 = text[2] - 0x80u) <= 0x3Fu))
- {
- c = ((c&0x7u)<<18) | (t1<<12) | (t2<<6) | t3;
- if (unlikely (!hb_in_range<hb_codepoint_t> (c, 0x10000u, 0x10FFFFu)))
- goto error;
- text += 3;
- }
- else
- goto error;
- }
- else
- goto error;
- }
-
- *unicode = c;
- return text;
-
- error:
- *unicode = replacement;
- return text;
- }
-
- static inline const uint8_t *
- prev (const uint8_t *text,
- const uint8_t *start,
- hb_codepoint_t *unicode,
- hb_codepoint_t replacement)
- {
- const uint8_t *end = text--;
- while (start < text && (*text & 0xc0) == 0x80 && end - text < 4)
- text--;
-
- if (likely (next (text, end, unicode, replacement) == end))
- return text;
-
- *unicode = replacement;
- return end - 1;
- }
-
- static inline unsigned int
- strlen (const uint8_t *text)
- {
- return ::strlen ((const char *) text);
- }
-};
-
-
-struct hb_utf16_t
-{
- typedef uint16_t codepoint_t;
-
- static inline const uint16_t *
- next (const uint16_t *text,
- const uint16_t *end,
- hb_codepoint_t *unicode,
- hb_codepoint_t replacement)
- {
- hb_codepoint_t c = *text++;
-
- if (likely (!hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
- {
- *unicode = c;
- return text;
- }
-
- if (likely (c <= 0xDBFFu && text < end))
- {
- /* High-surrogate in c */
- hb_codepoint_t l = *text;
- if (likely (hb_in_range<hb_codepoint_t> (l, 0xDC00u, 0xDFFFu)))
- {
- /* Low-surrogate in l */
- *unicode = (c << 10) + l - ((0xD800u << 10) - 0x10000u + 0xDC00u);
- text++;
- return text;
- }
- }
-
- /* Lonely / out-of-order surrogate. */
- *unicode = replacement;
- return text;
- }
-
- static inline const uint16_t *
- prev (const uint16_t *text,
- const uint16_t *start,
- hb_codepoint_t *unicode,
- hb_codepoint_t replacement)
- {
- hb_codepoint_t c = *--text;
-
- if (likely (!hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
- {
- *unicode = c;
- return text;
- }
-
- if (likely (c >= 0xDC00u && start < text))
- {
- /* Low-surrogate in c */
- hb_codepoint_t h = text[-1];
- if (likely (hb_in_range<hb_codepoint_t> (h, 0xD800u, 0xDBFFu)))
- {
- /* High-surrogate in h */
- *unicode = (h << 10) + c - ((0xD800u << 10) - 0x10000u + 0xDC00u);
- text--;
- return text;
- }
- }
-
- /* Lonely / out-of-order surrogate. */
- *unicode = replacement;
- return text;
- }
-
-
- static inline unsigned int
- strlen (const uint16_t *text)
- {
- unsigned int l = 0;
- while (*text++) l++;
- return l;
- }
-};
-
-
-template <bool validate=true>
-struct hb_utf32_t
-{
- typedef uint32_t codepoint_t;
-
- static inline const uint32_t *
- next (const uint32_t *text,
- const uint32_t *end HB_UNUSED,
- hb_codepoint_t *unicode,
- hb_codepoint_t replacement)
- {
- hb_codepoint_t c = *unicode = *text++;
- if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
- *unicode = replacement;
- return text;
- }
-
- static inline const uint32_t *
- prev (const uint32_t *text,
- const uint32_t *start HB_UNUSED,
- hb_codepoint_t *unicode,
- hb_codepoint_t replacement)
- {
- hb_codepoint_t c = *unicode = *--text;
- if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
- *unicode = replacement;
- return text;
- }
-
- static inline unsigned int
- strlen (const uint32_t *text)
- {
- unsigned int l = 0;
- while (*text++) l++;
- return l;
- }
-};
-
-
-struct hb_latin1_t
-{
- typedef uint8_t codepoint_t;
-
- static inline const uint8_t *
- next (const uint8_t *text,
- const uint8_t *end HB_UNUSED,
- hb_codepoint_t *unicode,
- hb_codepoint_t replacement HB_UNUSED)
- {
- *unicode = *text++;
- return text;
- }
-
- static inline const uint8_t *
- prev (const uint8_t *text,
- const uint8_t *start HB_UNUSED,
- hb_codepoint_t *unicode,
- hb_codepoint_t replacement)
- {
- *unicode = *--text;
- return text;
- }
-
- static inline unsigned int
- strlen (const uint8_t *text)
- {
- unsigned int l = 0;
- while (*text++) l++;
- return l;
- }
-};
-
-#endif /* HB_UTF_PRIVATE_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-utf.hh b/src/3rdparty/harfbuzz-ng/src/hb-utf.hh
new file mode 100644
index 0000000000..ff5712d16d
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-utf.hh
@@ -0,0 +1,453 @@
+/*
+ * Copyright © 2011,2012,2014 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_UTF_HH
+#define HB_UTF_HH
+
+#include "hb.hh"
+
+#include "hb-open-type.hh"
+
+
+struct hb_utf8_t
+{
+ typedef uint8_t codepoint_t;
+
+ static const codepoint_t *
+ next (const codepoint_t *text,
+ const codepoint_t *end,
+ hb_codepoint_t *unicode,
+ hb_codepoint_t replacement)
+ {
+ /* Written to only accept well-formed sequences.
+ * Based on ideas from ICU's U8_NEXT.
+ * Generates one "replacement" for each ill-formed byte. */
+
+ hb_codepoint_t c = *text++;
+
+ if (c > 0x7Fu)
+ {
+ if (hb_in_range<hb_codepoint_t> (c, 0xC2u, 0xDFu)) /* Two-byte */
+ {
+ unsigned int t1;
+ if (likely (text < end &&
+ (t1 = text[0] - 0x80u) <= 0x3Fu))
+ {
+ c = ((c&0x1Fu)<<6) | t1;
+ text++;
+ }
+ else
+ goto error;
+ }
+ else if (hb_in_range<hb_codepoint_t> (c, 0xE0u, 0xEFu)) /* Three-byte */
+ {
+ unsigned int t1, t2;
+ if (likely (1 < end - text &&
+ (t1 = text[0] - 0x80u) <= 0x3Fu &&
+ (t2 = text[1] - 0x80u) <= 0x3Fu))
+ {
+ c = ((c&0xFu)<<12) | (t1<<6) | t2;
+ if (unlikely (c < 0x0800u || hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
+ goto error;
+ text += 2;
+ }
+ else
+ goto error;
+ }
+ else if (hb_in_range<hb_codepoint_t> (c, 0xF0u, 0xF4u)) /* Four-byte */
+ {
+ unsigned int t1, t2, t3;
+ if (likely (2 < end - text &&
+ (t1 = text[0] - 0x80u) <= 0x3Fu &&
+ (t2 = text[1] - 0x80u) <= 0x3Fu &&
+ (t3 = text[2] - 0x80u) <= 0x3Fu))
+ {
+ c = ((c&0x7u)<<18) | (t1<<12) | (t2<<6) | t3;
+ if (unlikely (!hb_in_range<hb_codepoint_t> (c, 0x10000u, 0x10FFFFu)))
+ goto error;
+ text += 3;
+ }
+ else
+ goto error;
+ }
+ else
+ goto error;
+ }
+
+ *unicode = c;
+ return text;
+
+ error:
+ *unicode = replacement;
+ return text;
+ }
+
+ static const codepoint_t *
+ prev (const codepoint_t *text,
+ const codepoint_t *start,
+ hb_codepoint_t *unicode,
+ hb_codepoint_t replacement)
+ {
+ const codepoint_t *end = text--;
+ while (start < text && (*text & 0xc0) == 0x80 && end - text < 4)
+ text--;
+
+ if (likely (next (text, end, unicode, replacement) == end))
+ return text;
+
+ *unicode = replacement;
+ return end - 1;
+ }
+
+ static unsigned int
+ strlen (const codepoint_t *text)
+ { return ::strlen ((const char *) text); }
+
+ static unsigned int
+ encode_len (hb_codepoint_t unicode)
+ {
+ if (unicode < 0x0080u) return 1;
+ if (unicode < 0x0800u) return 2;
+ if (unicode < 0x10000u) return 3;
+ if (unicode < 0x110000u) return 4;
+ return 3;
+ }
+
+ static codepoint_t *
+ encode (codepoint_t *text,
+ const codepoint_t *end,
+ hb_codepoint_t unicode)
+ {
+ if (unlikely (unicode >= 0xD800u && (unicode <= 0xDFFFu || unicode > 0x10FFFFu)))
+ unicode = 0xFFFDu;
+ if (unicode < 0x0080u)
+ *text++ = unicode;
+ else if (unicode < 0x0800u)
+ {
+ if (end - text >= 2)
+ {
+ *text++ = 0xC0u + (0x1Fu & (unicode >> 6));
+ *text++ = 0x80u + (0x3Fu & (unicode ));
+ }
+ }
+ else if (unicode < 0x10000u)
+ {
+ if (end - text >= 3)
+ {
+ *text++ = 0xE0u + (0x0Fu & (unicode >> 12));
+ *text++ = 0x80u + (0x3Fu & (unicode >> 6));
+ *text++ = 0x80u + (0x3Fu & (unicode ));
+ }
+ }
+ else
+ {
+ if (end - text >= 4)
+ {
+ *text++ = 0xF0u + (0x07u & (unicode >> 18));
+ *text++ = 0x80u + (0x3Fu & (unicode >> 12));
+ *text++ = 0x80u + (0x3Fu & (unicode >> 6));
+ *text++ = 0x80u + (0x3Fu & (unicode ));
+ }
+ }
+ return text;
+ }
+};
+
+
+template <typename TCodepoint>
+struct hb_utf16_xe_t
+{
+ static_assert (sizeof (TCodepoint) == 2, "");
+ typedef TCodepoint codepoint_t;
+
+ static const codepoint_t *
+ next (const codepoint_t *text,
+ const codepoint_t *end,
+ hb_codepoint_t *unicode,
+ hb_codepoint_t replacement)
+ {
+ hb_codepoint_t c = *text++;
+
+ if (likely (!hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
+ {
+ *unicode = c;
+ return text;
+ }
+
+ if (likely (c <= 0xDBFFu && text < end))
+ {
+ /* High-surrogate in c */
+ hb_codepoint_t l = *text;
+ if (likely (hb_in_range<hb_codepoint_t> (l, 0xDC00u, 0xDFFFu)))
+ {
+ /* Low-surrogate in l */
+ *unicode = (c << 10) + l - ((0xD800u << 10) - 0x10000u + 0xDC00u);
+ text++;
+ return text;
+ }
+ }
+
+ /* Lonely / out-of-order surrogate. */
+ *unicode = replacement;
+ return text;
+ }
+
+ static const codepoint_t *
+ prev (const codepoint_t *text,
+ const codepoint_t *start,
+ hb_codepoint_t *unicode,
+ hb_codepoint_t replacement)
+ {
+ hb_codepoint_t c = *--text;
+
+ if (likely (!hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
+ {
+ *unicode = c;
+ return text;
+ }
+
+ if (likely (c >= 0xDC00u && start < text))
+ {
+ /* Low-surrogate in c */
+ hb_codepoint_t h = text[-1];
+ if (likely (hb_in_range<hb_codepoint_t> (h, 0xD800u, 0xDBFFu)))
+ {
+ /* High-surrogate in h */
+ *unicode = (h << 10) + c - ((0xD800u << 10) - 0x10000u + 0xDC00u);
+ text--;
+ return text;
+ }
+ }
+
+ /* Lonely / out-of-order surrogate. */
+ *unicode = replacement;
+ return text;
+ }
+
+
+ static unsigned int
+ strlen (const codepoint_t *text)
+ {
+ unsigned int l = 0;
+ while (*text++) l++;
+ return l;
+ }
+
+ static unsigned int
+ encode_len (hb_codepoint_t unicode)
+ {
+ return unicode < 0x10000 ? 1 : 2;
+ }
+
+ static codepoint_t *
+ encode (codepoint_t *text,
+ const codepoint_t *end,
+ hb_codepoint_t unicode)
+ {
+ if (unlikely (unicode >= 0xD800u && (unicode <= 0xDFFFu || unicode > 0x10FFFFu)))
+ unicode = 0xFFFDu;
+ if (unicode < 0x10000u)
+ *text++ = unicode;
+ else if (end - text >= 2)
+ {
+ unicode -= 0x10000u;
+ *text++ = 0xD800u + (unicode >> 10);
+ *text++ = 0xDC00u + (unicode & 0x03FFu);
+ }
+ return text;
+ }
+};
+
+typedef hb_utf16_xe_t<uint16_t> hb_utf16_t;
+typedef hb_utf16_xe_t<OT::HBUINT16> hb_utf16_be_t;
+
+
+template <typename TCodepoint, bool validate=true>
+struct hb_utf32_xe_t
+{
+ static_assert (sizeof (TCodepoint) == 4, "");
+ typedef TCodepoint codepoint_t;
+
+ static const TCodepoint *
+ next (const TCodepoint *text,
+ const TCodepoint *end HB_UNUSED,
+ hb_codepoint_t *unicode,
+ hb_codepoint_t replacement)
+ {
+ hb_codepoint_t c = *unicode = *text++;
+ if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
+ *unicode = replacement;
+ return text;
+ }
+
+ static const TCodepoint *
+ prev (const TCodepoint *text,
+ const TCodepoint *start HB_UNUSED,
+ hb_codepoint_t *unicode,
+ hb_codepoint_t replacement)
+ {
+ hb_codepoint_t c = *unicode = *--text;
+ if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
+ *unicode = replacement;
+ return text;
+ }
+
+ static unsigned int
+ strlen (const TCodepoint *text)
+ {
+ unsigned int l = 0;
+ while (*text++) l++;
+ return l;
+ }
+
+ static unsigned int
+ encode_len (hb_codepoint_t unicode HB_UNUSED)
+ {
+ return 1;
+ }
+
+ static codepoint_t *
+ encode (codepoint_t *text,
+ const codepoint_t *end HB_UNUSED,
+ hb_codepoint_t unicode)
+ {
+ if (validate && unlikely (unicode >= 0xD800u && (unicode <= 0xDFFFu || unicode > 0x10FFFFu)))
+ unicode = 0xFFFDu;
+ *text++ = unicode;
+ return text;
+ }
+};
+
+typedef hb_utf32_xe_t<uint32_t> hb_utf32_t;
+typedef hb_utf32_xe_t<uint32_t, false> hb_utf32_novalidate_t;
+
+
+struct hb_latin1_t
+{
+ typedef uint8_t codepoint_t;
+
+ static const codepoint_t *
+ next (const codepoint_t *text,
+ const codepoint_t *end HB_UNUSED,
+ hb_codepoint_t *unicode,
+ hb_codepoint_t replacement HB_UNUSED)
+ {
+ *unicode = *text++;
+ return text;
+ }
+
+ static const codepoint_t *
+ prev (const codepoint_t *text,
+ const codepoint_t *start HB_UNUSED,
+ hb_codepoint_t *unicode,
+ hb_codepoint_t replacement HB_UNUSED)
+ {
+ *unicode = *--text;
+ return text;
+ }
+
+ static unsigned int
+ strlen (const codepoint_t *text)
+ {
+ unsigned int l = 0;
+ while (*text++) l++;
+ return l;
+ }
+
+ static unsigned int
+ encode_len (hb_codepoint_t unicode HB_UNUSED)
+ {
+ return 1;
+ }
+
+ static codepoint_t *
+ encode (codepoint_t *text,
+ const codepoint_t *end HB_UNUSED,
+ hb_codepoint_t unicode)
+ {
+ if (unlikely (unicode >= 0x0100u))
+ unicode = '?';
+ *text++ = unicode;
+ return text;
+ }
+};
+
+
+struct hb_ascii_t
+{
+ typedef uint8_t codepoint_t;
+
+ static const codepoint_t *
+ next (const codepoint_t *text,
+ const codepoint_t *end HB_UNUSED,
+ hb_codepoint_t *unicode,
+ hb_codepoint_t replacement HB_UNUSED)
+ {
+ *unicode = *text++;
+ if (*unicode >= 0x0080u)
+ *unicode = replacement;
+ return text;
+ }
+
+ static const codepoint_t *
+ prev (const codepoint_t *text,
+ const codepoint_t *start HB_UNUSED,
+ hb_codepoint_t *unicode,
+ hb_codepoint_t replacement)
+ {
+ *unicode = *--text;
+ if (*unicode >= 0x0080u)
+ *unicode = replacement;
+ return text;
+ }
+
+ static unsigned int
+ strlen (const codepoint_t *text)
+ {
+ unsigned int l = 0;
+ while (*text++) l++;
+ return l;
+ }
+
+ static unsigned int
+ encode_len (hb_codepoint_t unicode HB_UNUSED)
+ {
+ return 1;
+ }
+
+ static codepoint_t *
+ encode (codepoint_t *text,
+ const codepoint_t *end HB_UNUSED,
+ hb_codepoint_t unicode)
+ {
+ if (unlikely (unicode >= 0x0080u))
+ unicode = '?';
+ *text++ = unicode;
+ return text;
+ }
+};
+
+#endif /* HB_UTF_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-vector.hh b/src/3rdparty/harfbuzz-ng/src/hb-vector.hh
new file mode 100644
index 0000000000..7b150fba05
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-vector.hh
@@ -0,0 +1,310 @@
+/*
+ * Copyright © 2017,2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_VECTOR_HH
+#define HB_VECTOR_HH
+
+#include "hb.hh"
+#include "hb-array.hh"
+#include "hb-null.hh"
+
+
+template <typename Type>
+struct hb_vector_t
+{
+ typedef Type item_t;
+ static constexpr unsigned item_size = hb_static_size (Type);
+
+ hb_vector_t () { init (); }
+ hb_vector_t (const hb_vector_t &o)
+ {
+ init ();
+ alloc (o.length);
+ hb_copy (o, *this);
+ }
+ hb_vector_t (hb_vector_t &&o)
+ {
+ allocated = o.allocated;
+ length = o.length;
+ arrayZ = o.arrayZ;
+ o.init ();
+ }
+ ~hb_vector_t () { fini (); }
+
+ private:
+ int allocated; /* == -1 means allocation failed. */
+ public:
+ unsigned int length;
+ public:
+ Type *arrayZ;
+
+ void init ()
+ {
+ allocated = length = 0;
+ arrayZ = nullptr;
+ }
+
+ void fini ()
+ {
+ free (arrayZ);
+ init ();
+ }
+ void fini_deep ()
+ {
+ unsigned int count = length;
+ for (unsigned int i = 0; i < count; i++)
+ arrayZ[i].fini ();
+ fini ();
+ }
+
+ void reset () { resize (0); }
+
+ hb_vector_t& operator = (const hb_vector_t &o)
+ {
+ reset ();
+ alloc (o.length);
+ hb_copy (o, *this);
+ return *this;
+ }
+ hb_vector_t& operator = (hb_vector_t &&o)
+ {
+ fini ();
+ allocated = o.allocated;
+ length = o.length;
+ arrayZ = o.arrayZ;
+ o.init ();
+ return *this;
+ }
+
+ hb_bytes_t as_bytes () const
+ { return hb_bytes_t ((const char *) arrayZ, length * item_size); }
+
+ bool operator == (const hb_vector_t &o) const { return as_array () == o.as_array (); }
+ bool operator != (const hb_vector_t &o) const { return !(*this == o); }
+ uint32_t hash () const { return as_array ().hash (); }
+
+ Type& operator [] (int i_)
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i >= length))
+ return Crap (Type);
+ return arrayZ[i];
+ }
+ const Type& operator [] (int i_) const
+ {
+ unsigned int i = (unsigned int) i_;
+ if (unlikely (i >= length))
+ return Null(Type);
+ return arrayZ[i];
+ }
+
+ Type& tail () { return (*this)[length - 1]; }
+ const Type& tail () const { return (*this)[length - 1]; }
+
+ explicit operator bool () const { return length; }
+ unsigned get_size () const { return length * item_size; }
+
+ /* Sink interface. */
+ template <typename T>
+ hb_vector_t& operator << (T&& v) { push (hb_forward<T> (v)); return *this; }
+
+ hb_array_t< Type> as_array () { return hb_array (arrayZ, length); }
+ hb_array_t<const Type> as_array () const { return hb_array (arrayZ, length); }
+
+ /* Iterator. */
+ typedef hb_array_t<const Type> iter_t;
+ typedef hb_array_t< Type> writer_t;
+ iter_t iter () const { return as_array (); }
+ writer_t writer () { return as_array (); }
+ operator iter_t () const { return iter (); }
+ operator writer_t () { return writer (); }
+
+ hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+ { return as_array ().sub_array (start_offset, count); }
+ hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
+ { return as_array ().sub_array (start_offset, count); }
+ hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+ { return as_array ().sub_array (start_offset, count); }
+ hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
+ { return as_array ().sub_array (start_offset, count); }
+
+ hb_sorted_array_t<Type> as_sorted_array ()
+ { return hb_sorted_array (arrayZ, length); }
+ hb_sorted_array_t<const Type> as_sorted_array () const
+ { return hb_sorted_array (arrayZ, length); }
+
+ template <typename T> explicit operator T * () { return arrayZ; }
+ template <typename T> explicit operator const T * () const { return arrayZ; }
+
+ Type * operator + (unsigned int i) { return arrayZ + i; }
+ const Type * operator + (unsigned int i) const { return arrayZ + i; }
+
+ Type *push ()
+ {
+ if (unlikely (!resize (length + 1)))
+ return &Crap(Type);
+ return &arrayZ[length - 1];
+ }
+ template <typename T>
+ Type *push (T&& v)
+ {
+ Type *p = push ();
+ *p = hb_forward<T> (v);
+ return p;
+ }
+
+ bool in_error () const { return allocated < 0; }
+
+ /* Allocate for size but don't adjust length. */
+ bool alloc (unsigned int size)
+ {
+ if (unlikely (allocated < 0))
+ return false;
+
+ if (likely (size <= (unsigned) allocated))
+ return true;
+
+ /* Reallocate */
+
+ unsigned int new_allocated = allocated;
+ while (size >= new_allocated)
+ new_allocated += (new_allocated >> 1) + 8;
+
+ Type *new_array = nullptr;
+ bool overflows =
+ (int) new_allocated < 0 ||
+ (new_allocated < (unsigned) allocated) ||
+ hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
+ if (likely (!overflows))
+ new_array = (Type *) realloc (arrayZ, new_allocated * sizeof (Type));
+
+ if (unlikely (!new_array))
+ {
+ allocated = -1;
+ return false;
+ }
+
+ arrayZ = new_array;
+ allocated = new_allocated;
+
+ return true;
+ }
+
+ bool resize (int size_)
+ {
+ unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
+ if (!alloc (size))
+ return false;
+
+ if (size > length)
+ memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ));
+
+ length = size;
+ return true;
+ }
+
+ Type pop ()
+ {
+ if (!length) return Null(Type);
+ return hb_move (arrayZ[--length]); /* Does this move actually work? */
+ }
+
+ void remove (unsigned int i)
+ {
+ if (unlikely (i >= length))
+ return;
+ memmove (static_cast<void *> (&arrayZ[i]),
+ static_cast<void *> (&arrayZ[i + 1]),
+ (length - i - 1) * sizeof (Type));
+ length--;
+ }
+
+ void shrink (int size_)
+ {
+ unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
+ if (size < length)
+ length = size;
+ }
+
+ template <typename T>
+ Type *find (T v)
+ {
+ for (unsigned int i = 0; i < length; i++)
+ if (arrayZ[i] == v)
+ return &arrayZ[i];
+ return nullptr;
+ }
+ template <typename T>
+ const Type *find (T v) const
+ {
+ for (unsigned int i = 0; i < length; i++)
+ if (arrayZ[i] == v)
+ return &arrayZ[i];
+ return nullptr;
+ }
+
+ void qsort (int (*cmp)(const void*, const void*))
+ { as_array ().qsort (cmp); }
+ void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1)
+ { as_array ().qsort (start, end); }
+
+ template <typename T>
+ Type *lsearch (const T &x, Type *not_found = nullptr)
+ { return as_array ().lsearch (x, not_found); }
+ template <typename T>
+ const Type *lsearch (const T &x, const Type *not_found = nullptr) const
+ { return as_array ().lsearch (x, not_found); }
+};
+
+template <typename Type>
+struct hb_sorted_vector_t : hb_vector_t<Type>
+{
+ hb_sorted_array_t< Type> as_array () { return hb_sorted_array (this->arrayZ, this->length); }
+ hb_sorted_array_t<const Type> as_array () const { return hb_sorted_array (this->arrayZ, this->length); }
+
+ /* Iterator. */
+ typedef hb_sorted_array_t<const Type> const_iter_t;
+ typedef hb_sorted_array_t< Type> iter_t;
+ const_iter_t iter () const { return as_array (); }
+ const_iter_t citer () const { return as_array (); }
+ iter_t iter () { return as_array (); }
+ operator iter_t () { return iter (); }
+ operator const_iter_t () const { return iter (); }
+
+ template <typename T>
+ Type *bsearch (const T &x, Type *not_found = nullptr)
+ { return as_array ().bsearch (x, not_found); }
+ template <typename T>
+ const Type *bsearch (const T &x, const Type *not_found = nullptr) const
+ { return as_array ().bsearch (x, not_found); }
+ template <typename T>
+ bool bfind (const T &x, unsigned int *i = nullptr,
+ hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+ unsigned int to_store = (unsigned int) -1) const
+ { return as_array ().bfind (x, i, not_found, to_store); }
+};
+
+#endif /* HB_VECTOR_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-version.h b/src/3rdparty/harfbuzz-ng/src/hb-version.h
index fc81b66b40..a564e9f5e1 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-version.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb-version.h
@@ -36,11 +36,11 @@
HB_BEGIN_DECLS
-#define HB_VERSION_MAJOR 1
-#define HB_VERSION_MINOR 7
+#define HB_VERSION_MAJOR 2
+#define HB_VERSION_MINOR 6
#define HB_VERSION_MICRO 4
-#define HB_VERSION_STRING "1.7.4"
+#define HB_VERSION_STRING "2.6.4"
#define HB_VERSION_ATLEAST(major,minor,micro) \
((major)*10000+(minor)*100+(micro) <= \
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-version.h.in b/src/3rdparty/harfbuzz-ng/src/hb-version.h.in
new file mode 100644
index 0000000000..0ffd889b27
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb-version.h.in
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_VERSION_H
+#define HB_VERSION_H
+
+#include "hb-common.h"
+
+HB_BEGIN_DECLS
+
+
+#define HB_VERSION_MAJOR @HB_VERSION_MAJOR@
+#define HB_VERSION_MINOR @HB_VERSION_MINOR@
+#define HB_VERSION_MICRO @HB_VERSION_MICRO@
+
+#define HB_VERSION_STRING "@HB_VERSION@"
+
+#define HB_VERSION_ATLEAST(major,minor,micro) \
+ ((major)*10000+(minor)*100+(micro) <= \
+ HB_VERSION_MAJOR*10000+HB_VERSION_MINOR*100+HB_VERSION_MICRO)
+
+
+HB_EXTERN void
+hb_version (unsigned int *major,
+ unsigned int *minor,
+ unsigned int *micro);
+
+HB_EXTERN const char *
+hb_version_string (void);
+
+HB_EXTERN hb_bool_t
+hb_version_atleast (unsigned int major,
+ unsigned int minor,
+ unsigned int micro);
+
+
+HB_END_DECLS
+
+#endif /* HB_VERSION_H */
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-warning.cc b/src/3rdparty/harfbuzz-ng/src/hb-warning.cc
deleted file mode 100644
index 8f322bcb10..0000000000
--- a/src/3rdparty/harfbuzz-ng/src/hb-warning.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright © 2012 Google, Inc.
- *
- * This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#include "hb-atomic-private.hh"
-#include "hb-mutex-private.hh"
-
-
-#if defined(HB_ATOMIC_INT_NIL)
-#error "Could not find any system to define atomic_int macros, library WILL NOT be thread-safe"
-#error "Check hb-atomic-private.hh for possible resolutions."
-#endif
-
-#if defined(HB_MUTEX_IMPL_NIL)
-#error "Could not find any system to define mutex macros, library WILL NOT be thread-safe"
-#error "Check hb-mutex-private.hh for possible resolutions."
-#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/hb.h b/src/3rdparty/harfbuzz-ng/src/hb.h
index 7402034f43..c5e7072fba 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb.h
+++ b/src/3rdparty/harfbuzz-ng/src/hb.h
@@ -28,16 +28,13 @@
#define HB_H
#define HB_H_IN
-#ifndef HB_EXTERN
-#define HB_EXTERN extern
-#endif
-
#include "hb-blob.h"
#include "hb-buffer.h"
#include "hb-common.h"
#include "hb-deprecated.h"
#include "hb-face.h"
#include "hb-font.h"
+#include "hb-map.h"
#include "hb-set.h"
#include "hb-shape.h"
#include "hb-shape-plan.h"
diff --git a/src/3rdparty/harfbuzz-ng/src/hb.hh b/src/3rdparty/harfbuzz-ng/src/hb.hh
new file mode 100644
index 0000000000..fcbd330588
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/hb.hh
@@ -0,0 +1,616 @@
+/*
+ * Copyright © 2007,2008,2009 Red Hat, Inc.
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_HH
+#define HB_HH
+
+
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC
+#ifdef _MSC_VER
+#pragma warning( disable: 4068 ) /* Unknown pragma */
+#endif
+#if defined(__GNUC__) || defined(__clang__)
+/* Rules:
+ *
+ * - All pragmas are declared GCC even if they are clang ones. Otherwise GCC
+ * nags, even though we instruct it to ignore -Wunknown-pragmas. ¯\_(ツ)_/¯
+ *
+ * - Within each category, keep sorted.
+ *
+ * - Warnings whose scope can be expanded in future compiler versions shall
+ * be declared as "warning". Otherwise, either ignored or error.
+ */
+
+/* Setup. Don't sort order within this category. */
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING
+#pragma GCC diagnostic warning "-Wall"
+#pragma GCC diagnostic warning "-Wextra"
+#endif
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
+#pragma GCC diagnostic ignored "-Wpragmas"
+#pragma GCC diagnostic ignored "-Wunknown-pragmas"
+#pragma GCC diagnostic ignored "-Wunknown-warning-option"
+#endif
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING
+//#pragma GCC diagnostic warning "-Weverything"
+#endif
+
+/* Error. Should never happen. */
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_ERROR
+#pragma GCC diagnostic error "-Wc++11-narrowing"
+#pragma GCC diagnostic error "-Wcast-align"
+#pragma GCC diagnostic error "-Wcast-function-type"
+#pragma GCC diagnostic error "-Wdelete-non-virtual-dtor"
+#pragma GCC diagnostic error "-Wembedded-directive"
+#pragma GCC diagnostic error "-Wextra-semi-stmt"
+#pragma GCC diagnostic error "-Wformat-security"
+#pragma GCC diagnostic error "-Wimplicit-function-declaration"
+#pragma GCC diagnostic error "-Winit-self"
+#pragma GCC diagnostic error "-Winjected-class-name"
+#pragma GCC diagnostic error "-Wmissing-braces"
+#pragma GCC diagnostic error "-Wmissing-declarations"
+#pragma GCC diagnostic error "-Wmissing-prototypes"
+#pragma GCC diagnostic error "-Wnested-externs"
+#pragma GCC diagnostic error "-Wold-style-definition"
+#pragma GCC diagnostic error "-Wpointer-arith"
+#pragma GCC diagnostic error "-Wredundant-decls"
+#pragma GCC diagnostic error "-Wreorder"
+#pragma GCC diagnostic error "-Wsign-compare"
+#pragma GCC diagnostic error "-Wstrict-prototypes"
+#pragma GCC diagnostic error "-Wstring-conversion"
+#pragma GCC diagnostic error "-Wswitch-enum"
+#pragma GCC diagnostic error "-Wtautological-overlap-compare"
+#pragma GCC diagnostic error "-Wunneeded-internal-declaration"
+#pragma GCC diagnostic error "-Wunused"
+#pragma GCC diagnostic error "-Wunused-local-typedefs"
+#pragma GCC diagnostic error "-Wunused-value"
+#pragma GCC diagnostic error "-Wunused-variable"
+#pragma GCC diagnostic error "-Wvla"
+#pragma GCC diagnostic error "-Wwrite-strings"
+#endif
+
+/* Warning. To be investigated if happens. */
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING
+#pragma GCC diagnostic warning "-Wbuiltin-macro-redefined"
+#pragma GCC diagnostic warning "-Wdeprecated"
+#pragma GCC diagnostic warning "-Wdeprecated-declarations"
+#pragma GCC diagnostic warning "-Wdisabled-optimization"
+#pragma GCC diagnostic warning "-Wdouble-promotion"
+#pragma GCC diagnostic warning "-Wformat=2"
+#pragma GCC diagnostic warning "-Wignored-pragma-optimize"
+#pragma GCC diagnostic warning "-Wlogical-op"
+#pragma GCC diagnostic warning "-Wmaybe-uninitialized"
+#pragma GCC diagnostic warning "-Wmissing-format-attribute"
+#pragma GCC diagnostic warning "-Wundef"
+#endif
+
+/* Ignored currently, but should be fixed at some point. */
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
+#pragma GCC diagnostic ignored "-Wconversion" // TODO fix
+#pragma GCC diagnostic ignored "-Wformat-signedness" // TODO fix
+#pragma GCC diagnostic ignored "-Wshadow" // TODO fix
+#pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations" // TODO fix
+#pragma GCC diagnostic ignored "-Wunused-parameter" // TODO fix
+#endif
+
+/* Ignored intentionally. */
+#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
+#pragma GCC diagnostic ignored "-Wclass-memaccess"
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+#pragma GCC diagnostic ignored "-Wformat-zero-length"
+#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+#pragma GCC diagnostic ignored "-Wpacked" // Erratic impl in clang
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic ignored "-Wtype-limits"
+#pragma GCC diagnostic ignored "-Wc++11-compat" // only gcc raises it
+#endif
+
+#endif
+#endif
+
+
+#include "hb-config.hh"
+
+
+/*
+ * Following added based on what AC_USE_SYSTEM_EXTENSIONS adds to
+ * config.h.in. Copied here for the convenience of those embedding
+ * HarfBuzz and not using our build system.
+ */
+/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+# define _ALL_SOURCE 1
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+/* Enable threading extensions on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# define _POSIX_PTHREAD_SEMANTICS 1
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# define _TANDEM_SOURCE 1
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
+
+#if defined (_MSC_VER) && defined (HB_DLL_EXPORT)
+#define HB_EXTERN __declspec (dllexport) extern
+#endif
+
+#include "hb.h"
+#define HB_H_IN
+#include "hb-ot.h"
+#define HB_OT_H_IN
+#include "hb-aat.h"
+#define HB_AAT_H_IN
+
+#include <limits.h>
+#include <math.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <assert.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__)
+#ifdef __MINGW32_VERSION
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN 1
+#endif
+#include <windows.h>
+#else
+#include <intrin.h>
+#endif
+#endif
+
+#define HB_PASTE1(a,b) a##b
+#define HB_PASTE(a,b) HB_PASTE1(a,b)
+
+
+/* Compile-time custom allocator support. */
+
+#if defined(hb_malloc_impl) \
+ && defined(hb_calloc_impl) \
+ && defined(hb_realloc_impl) \
+ && defined(hb_free_impl)
+extern "C" void* hb_malloc_impl(size_t size);
+extern "C" void* hb_calloc_impl(size_t nmemb, size_t size);
+extern "C" void* hb_realloc_impl(void *ptr, size_t size);
+extern "C" void hb_free_impl(void *ptr);
+#define malloc hb_malloc_impl
+#define calloc hb_calloc_impl
+#define realloc hb_realloc_impl
+#define free hb_free_impl
+#endif
+
+
+/*
+ * Compiler attributes
+ */
+
+#if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__)
+#define likely(expr) (__builtin_expect (!!(expr), 1))
+#define unlikely(expr) (__builtin_expect (!!(expr), 0))
+#else
+#define likely(expr) (expr)
+#define unlikely(expr) (expr)
+#endif
+
+#if !defined(__GNUC__) && !defined(__clang__)
+#undef __attribute__
+#define __attribute__(x)
+#endif
+
+#if defined(__GNUC__) && (__GNUC__ >= 3)
+#define HB_PURE_FUNC __attribute__((pure))
+#define HB_CONST_FUNC __attribute__((const))
+#define HB_PRINTF_FUNC(format_idx, arg_idx) __attribute__((__format__ (__printf__, format_idx, arg_idx)))
+#else
+#define HB_PURE_FUNC
+#define HB_CONST_FUNC
+#define HB_PRINTF_FUNC(format_idx, arg_idx)
+#endif
+#if defined(__GNUC__) && (__GNUC__ >= 4) || (__clang__)
+#define HB_UNUSED __attribute__((unused))
+#elif defined(_MSC_VER) /* https://github.com/harfbuzz/harfbuzz/issues/635 */
+#define HB_UNUSED __pragma(warning(suppress: 4100 4101))
+#else
+#define HB_UNUSED
+#endif
+
+#ifndef HB_INTERNAL
+# if !defined(HB_NO_VISIBILITY) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(_MSC_VER) && !defined(__SUNPRO_CC)
+# define HB_INTERNAL __attribute__((__visibility__("hidden")))
+# elif defined(__MINGW32__)
+ /* We use -export-symbols on mingw32, since it does not support visibility attributes. */
+# define HB_INTERNAL
+# elif defined (_MSC_VER) && defined (HB_DLL_EXPORT)
+ /* We do not try to export internal symbols on Visual Studio */
+# define HB_INTERNAL
+#else
+# define HB_INTERNAL
+# define HB_NO_VISIBILITY 1
+# endif
+#endif
+
+/* https://github.com/harfbuzz/harfbuzz/issues/1651 */
+#if defined(__clang__) && __clang_major__ < 10
+#define static_const static
+#else
+#define static_const static const
+#endif
+
+#if defined(__GNUC__) && (__GNUC__ >= 3)
+#define HB_FUNC __PRETTY_FUNCTION__
+#elif defined(_MSC_VER)
+#define HB_FUNC __FUNCSIG__
+#else
+#define HB_FUNC __func__
+#endif
+
+#if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5140)
+/* https://github.com/harfbuzz/harfbuzz/issues/630 */
+#define __restrict
+#endif
+
+/*
+ * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
+ * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
+ * cases that fall through without a break or return statement. HB_FALLTHROUGH
+ * is only needed on cases that have code:
+ *
+ * switch (foo) {
+ * case 1: // These cases have no code. No fallthrough annotations are needed.
+ * case 2:
+ * case 3:
+ * foo = 4; // This case has code, so a fallthrough annotation is needed:
+ * HB_FALLTHROUGH;
+ * default:
+ * return foo;
+ * }
+ */
+#if defined(__clang__) && __cplusplus >= 201103L
+ /* clang's fallthrough annotations are only available starting in C++11. */
+# define HB_FALLTHROUGH [[clang::fallthrough]]
+#elif defined(__GNUC__) && (__GNUC__ >= 7)
+ /* GNU fallthrough attribute is available from GCC7 */
+# define HB_FALLTHROUGH __attribute__((fallthrough))
+#elif defined(_MSC_VER)
+ /*
+ * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
+ * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx
+ */
+# include <sal.h>
+# define HB_FALLTHROUGH __fallthrough
+#else
+# define HB_FALLTHROUGH /* FALLTHROUGH */
+#endif
+
+/* https://github.com/harfbuzz/harfbuzz/issues/1852 */
+#if defined(__clang__) && !(defined(_AIX) && (defined(__IBMCPP__) || defined(__ibmxl__)))
+/* Disable certain sanitizer errors. */
+/* https://github.com/harfbuzz/harfbuzz/issues/1247 */
+#define HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW __attribute__((no_sanitize("signed-integer-overflow")))
+#else
+#define HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW
+#endif
+
+
+#ifdef _WIN32
+ /* We need Windows Vista for both Uniscribe backend and for
+ * MemoryBarrier. We don't support compiling on Windows XP,
+ * though we run on it fine. */
+# if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0600
+# undef _WIN32_WINNT
+# endif
+# ifndef _WIN32_WINNT
+# if !defined(WINAPI_FAMILY) || !(WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+# define _WIN32_WINNT 0x0600
+# endif
+# endif
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN 1
+# endif
+# ifndef STRICT
+# define STRICT 1
+# endif
+
+# if defined(_WIN32_WCE)
+ /* Some things not defined on Windows CE. */
+# define vsnprintf _vsnprintf
+# ifndef HB_NO_GETENV
+# define HB_NO_GETENV
+# endif
+# if _WIN32_WCE < 0x800
+# define HB_NO_SETLOCALE
+# define HB_NO_ERRNO
+# endif
+# elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+# ifndef HB_NO_GETENV
+# define HB_NO_GETENV
+# endif
+# endif
+# if defined(_MSC_VER) && _MSC_VER < 1900
+# define snprintf _snprintf
+# endif
+#endif
+
+#ifdef HB_NO_GETENV
+#define getenv(Name) nullptr
+#endif
+
+#ifndef HB_NO_ERRNO
+# include <errno.h>
+#else
+static int HB_UNUSED _hb_errno = 0;
+# undef errno
+# define errno _hb_errno
+#endif
+
+#if defined(HAVE_ATEXIT) && !defined(HB_USE_ATEXIT)
+/* atexit() is only safe to be called from shared libraries on certain
+ * platforms. Whitelist.
+ * https://bugs.freedesktop.org/show_bug.cgi?id=82246 */
+# if defined(__linux) && defined(__GLIBC_PREREQ)
+# if __GLIBC_PREREQ(2,3)
+/* From atexit() manpage, it's safe with glibc 2.2.3 on Linux. */
+# define HB_USE_ATEXIT 1
+# endif
+# elif defined(_MSC_VER) || defined(__MINGW32__)
+/* For MSVC:
+ * https://msdn.microsoft.com/en-us/library/tze57ck3.aspx
+ * https://msdn.microsoft.com/en-us/library/zk17ww08.aspx
+ * mingw32 headers say atexit is safe to use in shared libraries.
+ */
+# define HB_USE_ATEXIT 1
+# elif defined(__ANDROID__)
+/* This is available since Android NKD r8 or r8b:
+ * https://issuetracker.google.com/code/p/android/issues/detail?id=6455
+ */
+# define HB_USE_ATEXIT 1
+# elif defined(__APPLE__)
+/* For macOS and related platforms, the atexit man page indicates
+ * that it will be invoked when the library is unloaded, not only
+ * at application exit.
+ */
+# define HB_USE_ATEXIT 1
+# endif
+#endif
+#ifdef HB_NO_ATEXIT
+# undef HB_USE_ATEXIT
+#endif
+#ifndef HB_USE_ATEXIT
+# define HB_USE_ATEXIT 0
+#endif
+
+#define HB_STMT_START do
+#define HB_STMT_END while (0)
+
+/* Static-assert as expression. */
+template <unsigned int cond> class hb_assert_constant_t;
+template <> class hb_assert_constant_t<1> {};
+#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
+
+/* Lets assert int types. Saves trouble down the road. */
+static_assert ((sizeof (int8_t) == 1), "");
+static_assert ((sizeof (uint8_t) == 1), "");
+static_assert ((sizeof (int16_t) == 2), "");
+static_assert ((sizeof (uint16_t) == 2), "");
+static_assert ((sizeof (int32_t) == 4), "");
+static_assert ((sizeof (uint32_t) == 4), "");
+static_assert ((sizeof (int64_t) == 8), "");
+static_assert ((sizeof (uint64_t) == 8), "");
+static_assert ((sizeof (hb_codepoint_t) == 4), "");
+static_assert ((sizeof (hb_position_t) == 4), "");
+static_assert ((sizeof (hb_mask_t) == 4), "");
+static_assert ((sizeof (hb_var_int_t) == 4), "");
+
+#define HB_DELETE_COPY_ASSIGN(TypeName) \
+ TypeName(const TypeName&) = delete; \
+ void operator=(const TypeName&) = delete
+#define HB_DELETE_CREATE_COPY_ASSIGN(TypeName) \
+ TypeName() = delete; \
+ TypeName(const TypeName&) = delete; \
+ void operator=(const TypeName&) = delete
+
+
+/* Flags */
+
+/* Enable bitwise ops on enums marked as flags_t */
+/* To my surprise, looks like the function resolver is happy to silently cast
+ * one enum to another... So this doesn't provide the type-checking that I
+ * originally had in mind... :(.
+ *
+ * For MSVC warnings, see: https://github.com/harfbuzz/harfbuzz/pull/163
+ */
+#ifdef _MSC_VER
+# pragma warning(disable:4200)
+# pragma warning(disable:4800)
+#endif
+#define HB_MARK_AS_FLAG_T(T) \
+ extern "C++" { \
+ static inline T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
+ static inline T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
+ static inline T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \
+ static inline T operator ~ (T r) { return T (~(unsigned int) r); } \
+ static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
+ static inline T& operator &= (T& l, T r) { l = l & r; return l; } \
+ static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \
+ } \
+ static_assert (true, "")
+
+/* Useful for set-operations on small enums.
+ * For example, for testing "x ∈ {x1, x2, x3}" use:
+ * (FLAG_UNSAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
+ */
+#define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
+#define FLAG_UNSAFE(x) ((unsigned)(x) < 32 ? (((uint32_t) 1U) << (unsigned)(x)) : 0)
+#define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(x))
+#define FLAG64(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 64) + (((uint64_t) 1ULL) << (unsigned)(x)))
+#define FLAG64_UNSAFE(x) ((unsigned)(x) < 64 ? (((uint64_t) 1ULL) << (unsigned)(x)) : 0)
+
+
+/* Size signifying variable-sized array */
+#ifndef HB_VAR_ARRAY
+#define HB_VAR_ARRAY 1
+#endif
+
+static inline double
+_hb_roundf (float x)
+{
+ return x >= 0 ? floor ((double) x + .5) : ceil ((double) x - .5);
+}
+#ifndef HAVE_ROUNDF
+#define roundf(x) _hb_roundf(x)
+#endif
+
+/* Endian swap, used in Windows related backends */
+static inline uint16_t hb_uint16_swap (const uint16_t v)
+{ return (v >> 8) | (v << 8); }
+static inline uint32_t hb_uint32_swap (const uint32_t v)
+{ return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
+
+/*
+ * Big-endian integers. Here because fundamental.
+ */
+
+template <typename Type, int Bytes> struct BEInt;
+
+template <typename Type>
+struct BEInt<Type, 1>
+{
+ public:
+ BEInt<Type, 1>& operator = (Type V)
+ {
+ v = V;
+ return *this;
+ }
+ operator Type () const { return v; }
+ private: uint8_t v;
+};
+template <typename Type>
+struct BEInt<Type, 2>
+{
+ public:
+ BEInt<Type, 2>& operator = (Type V)
+ {
+ v[0] = (V >> 8) & 0xFF;
+ v[1] = (V ) & 0xFF;
+ return *this;
+ }
+ operator Type () const
+ {
+#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \
+ defined(__BYTE_ORDER) && \
+ (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN)
+ /* Spoon-feed the compiler a big-endian integer with alignment 1.
+ * https://github.com/harfbuzz/harfbuzz/pull/1398 */
+ struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ return __builtin_bswap16 (((packed_uint16_t *) this)->v);
+#else /* __BYTE_ORDER == __BIG_ENDIAN */
+ return ((packed_uint16_t *) this)->v;
+#endif
+#endif
+ return (v[0] << 8)
+ + (v[1] );
+ }
+ private: uint8_t v[2];
+};
+template <typename Type>
+struct BEInt<Type, 3>
+{
+ public:
+ BEInt<Type, 3>& operator = (Type V)
+ {
+ v[0] = (V >> 16) & 0xFF;
+ v[1] = (V >> 8) & 0xFF;
+ v[2] = (V ) & 0xFF;
+ return *this;
+ }
+ operator Type () const
+ {
+ return (v[0] << 16)
+ + (v[1] << 8)
+ + (v[2] );
+ }
+ private: uint8_t v[3];
+};
+template <typename Type>
+struct BEInt<Type, 4>
+{
+ public:
+ BEInt<Type, 4>& operator = (Type V)
+ {
+ v[0] = (V >> 24) & 0xFF;
+ v[1] = (V >> 16) & 0xFF;
+ v[2] = (V >> 8) & 0xFF;
+ v[3] = (V ) & 0xFF;
+ return *this;
+ }
+ operator Type () const
+ {
+ return (v[0] << 24)
+ + (v[1] << 16)
+ + (v[2] << 8)
+ + (v[3] );
+ }
+ private: uint8_t v[4];
+};
+
+
+/*
+ * For lack of a better place, put Zawgyi script hack here.
+ * https://github.com/harfbuzz/harfbuzz/issues/1162
+ */
+
+#define HB_SCRIPT_MYANMAR_ZAWGYI ((hb_script_t) HB_TAG ('Q','a','a','g'))
+
+
+/* Headers we include for everyone. Keep topologically sorted by dependency.
+ * They express dependency amongst themselves, but no other file should include
+ * them directly.*/
+#include "hb-meta.hh"
+#include "hb-mutex.hh"
+#include "hb-number.hh"
+#include "hb-atomic.hh" // Requires: hb-meta
+#include "hb-null.hh" // Requires: hb-meta
+#include "hb-algs.hh" // Requires: hb-meta hb-null hb-number
+#include "hb-iter.hh" // Requires: hb-algs hb-meta
+#include "hb-debug.hh" // Requires: hb-algs hb-atomic
+#include "hb-array.hh" // Requires: hb-algs hb-iter hb-null
+#include "hb-vector.hh" // Requires: hb-array hb-null
+#include "hb-object.hh" // Requires: hb-atomic hb-mutex hb-vector
+
+#endif /* HB_HH */
diff --git a/src/3rdparty/harfbuzz-ng/src/main.cc b/src/3rdparty/harfbuzz-ng/src/main.cc
new file mode 100644
index 0000000000..983cb557db
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/main.cc
@@ -0,0 +1,207 @@
+/*
+ * Copyright © 2007,2008,2009 Red Hat, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ */
+
+#include "hb-static.cc"
+#include "hb-open-file.hh"
+#include "hb-ot-layout-gdef-table.hh"
+#include "hb-ot-layout-gsubgpos.hh"
+
+#ifdef HAVE_GLIB
+#include <glib.h>
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+
+
+using namespace OT;
+
+#ifdef HB_NO_OPEN
+#define hb_blob_create_from_file(x) hb_blob_get_empty ()
+#endif
+
+int
+main (int argc, char **argv)
+{
+ if (argc != 2)
+ {
+ fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]);
+ exit (1);
+ }
+
+ hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+ unsigned int len;
+ const char *font_data = hb_blob_get_data (blob, &len);
+ printf ("Opened font file %s: %d bytes long\n", argv[1], len);
+
+ hb_blob_t *font_blob = hb_sanitize_context_t().sanitize_blob<OpenTypeFontFile> (blob);
+ const OpenTypeFontFile* sanitized = font_blob->as<OpenTypeFontFile> ();
+ if (!font_blob->data)
+ {
+ printf ("Sanitization of the file wasn't successful. Exit");
+ return 1;
+ }
+ const OpenTypeFontFile& ot = *sanitized;
+
+
+ switch (ot.get_tag ())
+ {
+ case OpenTypeFontFile::TrueTypeTag:
+ printf ("OpenType font with TrueType outlines\n");
+ break;
+ case OpenTypeFontFile::CFFTag:
+ printf ("OpenType font with CFF (Type1) outlines\n");
+ break;
+ case OpenTypeFontFile::TTCTag:
+ printf ("TrueType Collection of OpenType fonts\n");
+ break;
+ case OpenTypeFontFile::TrueTag:
+ printf ("Obsolete Apple TrueType font\n");
+ break;
+ case OpenTypeFontFile::Typ1Tag:
+ printf ("Obsolete Apple Type1 font in SFNT container\n");
+ break;
+ case OpenTypeFontFile::DFontTag:
+ printf ("DFont Mac Resource Fork\n");
+ break;
+ default:
+ printf ("Unknown font format\n");
+ break;
+ }
+
+ int num_fonts = ot.get_face_count ();
+ printf ("%d font(s) found in file\n", num_fonts);
+ for (int n_font = 0; n_font < num_fonts; n_font++)
+ {
+ const OpenTypeFontFace &font = ot.get_face (n_font);
+ printf ("Font %d of %d:\n", n_font, num_fonts);
+
+ int num_tables = font.get_table_count ();
+ printf (" %d table(s) found in font\n", num_tables);
+ for (int n_table = 0; n_table < num_tables; n_table++)
+ {
+ const OpenTypeTable &table = font.get_table (n_table);
+ printf (" Table %2d of %2d: %.4s (0x%08x+0x%08x)\n", n_table, num_tables,
+ (const char *) table.tag,
+ (unsigned int) table.offset,
+ (unsigned int) table.length);
+
+ switch (table.tag)
+ {
+
+ case HB_OT_TAG_GSUB:
+ case HB_OT_TAG_GPOS:
+ {
+
+ const GSUBGPOS &g = *CastP<GSUBGPOS> (font_data + table.offset);
+
+ int num_scripts = g.get_script_count ();
+ printf (" %d script(s) found in table\n", num_scripts);
+ for (int n_script = 0; n_script < num_scripts; n_script++)
+ {
+ const Script &script = g.get_script (n_script);
+ printf (" Script %2d of %2d: %.4s\n", n_script, num_scripts,
+ (const char *)g.get_script_tag(n_script));
+
+ if (!script.has_default_lang_sys())
+ printf (" No default language system\n");
+ int num_langsys = script.get_lang_sys_count ();
+ printf (" %d language system(s) found in script\n", num_langsys);
+ for (int n_langsys = script.has_default_lang_sys() ? -1 : 0; n_langsys < num_langsys; n_langsys++) {
+ const LangSys &langsys = n_langsys == -1
+ ? script.get_default_lang_sys ()
+ : script.get_lang_sys (n_langsys);
+ if (n_langsys == -1)
+ printf (" Default Language System\n");
+ else
+ printf (" Language System %2d of %2d: %.4s\n", n_langsys, num_langsys,
+ (const char *)script.get_lang_sys_tag (n_langsys));
+ if (!langsys.has_required_feature ())
+ printf (" No required feature\n");
+ else
+ printf (" Required feature index: %d\n",
+ langsys.get_required_feature_index ());
+
+ int num_features = langsys.get_feature_count ();
+ printf (" %d feature(s) found in language system\n", num_features);
+ for (int n_feature = 0; n_feature < num_features; n_feature++)
+ {
+ printf (" Feature index %2d of %2d: %d\n", n_feature, num_features,
+ langsys.get_feature_index (n_feature));
+ }
+ }
+ }
+
+ int num_features = g.get_feature_count ();
+ printf (" %d feature(s) found in table\n", num_features);
+ for (int n_feature = 0; n_feature < num_features; n_feature++)
+ {
+ const Feature &feature = g.get_feature (n_feature);
+ int num_lookups = feature.get_lookup_count ();
+ printf (" Feature %2d of %2d: %c%c%c%c\n", n_feature, num_features,
+ HB_UNTAG(g.get_feature_tag(n_feature)));
+
+ printf (" %d lookup(s) found in feature\n", num_lookups);
+ for (int n_lookup = 0; n_lookup < num_lookups; n_lookup++) {
+ printf (" Lookup index %2d of %2d: %d\n", n_lookup, num_lookups,
+ feature.get_lookup_index (n_lookup));
+ }
+ }
+
+ int num_lookups = g.get_lookup_count ();
+ printf (" %d lookup(s) found in table\n", num_lookups);
+ for (int n_lookup = 0; n_lookup < num_lookups; n_lookup++)
+ {
+ const Lookup &lookup = g.get_lookup (n_lookup);
+ printf (" Lookup %2d of %2d: type %d, props 0x%04X\n", n_lookup, num_lookups,
+ lookup.get_type(), lookup.get_props());
+ }
+
+ }
+ break;
+
+ case GDEF::tableTag:
+ {
+
+ const GDEF &gdef = *CastP<GDEF> (font_data + table.offset);
+
+ printf (" Has %sglyph classes\n",
+ gdef.has_glyph_classes () ? "" : "no ");
+ printf (" Has %smark attachment types\n",
+ gdef.has_mark_attachment_types () ? "" : "no ");
+ printf (" Has %sattach points\n",
+ gdef.has_attach_points () ? "" : "no ");
+ printf (" Has %slig carets\n",
+ gdef.has_lig_carets () ? "" : "no ");
+ printf (" Has %smark sets\n",
+ gdef.has_mark_sets () ? "" : "no ");
+ break;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test-algs.cc b/src/3rdparty/harfbuzz-ng/src/test-algs.cc
new file mode 100644
index 0000000000..f8b8ff6668
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-algs.cc
@@ -0,0 +1,95 @@
+/*
+ * Copyright © 2019 Facebook, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Facebook Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+#include "hb-algs.hh"
+
+
+static char *
+test_func (int a, char **b)
+{
+ return b ? b[a] : nullptr;
+}
+
+struct A
+{
+ void a () {}
+};
+
+int
+main (int argc, char **argv)
+{
+ int i = 1;
+ auto p = hb_pair (1, i);
+
+ p.second = 2;
+ assert (i == 2);
+
+ const int c = 3;
+ auto pc = hb_pair (1, c);
+ assert (pc.second == 3);
+
+ auto q = p;
+ assert (&q != &p);
+ q.second = 4;
+ assert (i == 4);
+
+ hb_invoke (test_func, 0, nullptr);
+
+ A a;
+ hb_invoke (&A::a, a);
+
+ assert (1 == hb_min (8, 1));
+ assert (8 == hb_max (8, 1));
+
+ int x = 1, y = 2;
+ hb_min (x, 3);
+ hb_min (3, x);
+ hb_min (x, 4 + 3);
+ int &z = hb_min (x, y);
+ z = 3;
+ assert (x == 3);
+
+ hb_pair_t<const int*, int> xp = hb_pair_t<int *, long> (nullptr, 0);
+ xp = hb_pair_t<int *, double> (nullptr, 1);
+ xp = hb_pair_t<const int*, int> (nullptr, 1);
+
+ assert (3 == hb_partial (hb_min, 3) (4));
+ assert (3 == hb_partial<1> (hb_min, 4) (3));
+
+ auto M0 = hb_partial<2> (hb_max, 0);
+ assert (M0 (-2) == 0);
+ assert (M0 (+2) == 2);
+
+ assert (hb_add (2) (5) == 7);
+ assert (hb_add (5) (2) == 7);
+
+ x = 1;
+ assert (++hb_inc (x) == 3);
+ assert (x == 3);
+
+ return 0;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test-bimap.cc b/src/3rdparty/harfbuzz-ng/src/test-bimap.cc
new file mode 100644
index 0000000000..1253d0c1df
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-bimap.cc
@@ -0,0 +1,76 @@
+/*
+ * Copyright © 2019 Adobe, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb.hh"
+#include "hb-bimap.hh"
+
+int
+main (int argc, char **argv)
+{
+ hb_bimap_t bm;
+
+ assert (bm.is_empty () == true);
+ bm.set (1, 4);
+ bm.set (2, 5);
+ bm.set (3, 6);
+ assert (bm.get_population () == 3);
+ assert (bm.has (1) == true);
+ assert (bm.has (4) == false);
+ assert (bm[2] == 5);
+ assert (bm.backward (6) == 3);
+ bm.del (1);
+ assert (bm.has (1) == false);
+ assert (bm.has (3) == true);
+ bm.clear ();
+ assert (bm.get_population () == 0);
+
+ hb_inc_bimap_t ibm;
+
+ assert (ibm.add (13) == 0);
+ assert (ibm.add (8) == 1);
+ assert (ibm.add (10) == 2);
+ assert (ibm.add (8) == 1);
+ assert (ibm.add (7) == 3);
+ assert (ibm.get_population () == 4);
+ assert (ibm[7] == 3);
+
+ ibm.sort ();
+ assert (ibm.get_population () == 4);
+ assert (ibm[7] == 0);
+ assert (ibm[13] == 3);
+
+ ibm.identity (3);
+ assert (ibm.get_population () == 3);
+ assert (ibm[0] == 0);
+ assert (ibm[1] == 1);
+ assert (ibm[2] == 2);
+ assert (ibm.backward (0) == 0);
+ assert (ibm.backward (1) == 1);
+ assert (ibm.backward (2) == 2);
+ assert (ibm.has (4) == false);
+
+ return 0;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test-buffer-serialize.cc b/src/3rdparty/harfbuzz-ng/src/test-buffer-serialize.cc
new file mode 100644
index 0000000000..6393f0b7f6
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-buffer-serialize.cc
@@ -0,0 +1,98 @@
+/*
+ * Copyright © 2010,2011,2013 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb.h"
+#include "hb-ot.h"
+#ifdef HAVE_FREETYPE
+#include "hb-ft.h"
+#endif
+
+#include <stdio.h>
+
+#ifdef HB_NO_OPEN
+#define hb_blob_create_from_file(x) hb_blob_get_empty ()
+#endif
+
+int
+main (int argc, char **argv)
+{
+ bool ret = true;
+
+#ifndef HB_NO_BUFFER_SERIALIZE
+
+ if (argc != 2) {
+ fprintf (stderr, "usage: %s font-file\n", argv[0]);
+ exit (1);
+ }
+
+ hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+ hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+ hb_blob_destroy (blob);
+ blob = nullptr;
+
+ unsigned int upem = hb_face_get_upem (face);
+ hb_font_t *font = hb_font_create (face);
+ hb_face_destroy (face);
+ hb_font_set_scale (font, upem, upem);
+ hb_ot_font_set_funcs (font);
+#ifdef HAVE_FREETYPE
+ //hb_ft_font_set_funcs (font);
+#endif
+
+ hb_buffer_t *buf;
+ buf = hb_buffer_create ();
+
+ char line[BUFSIZ], out[BUFSIZ];
+ while (fgets (line, sizeof(line), stdin) != nullptr)
+ {
+ hb_buffer_clear_contents (buf);
+
+ const char *p = line;
+ while (hb_buffer_deserialize_glyphs (buf,
+ p, -1, &p,
+ font,
+ HB_BUFFER_SERIALIZE_FORMAT_JSON))
+ ;
+ if (*p && *p != '\n')
+ ret = false;
+
+ hb_buffer_serialize_glyphs (buf, 0, hb_buffer_get_length (buf),
+ out, sizeof (out), nullptr,
+ font, HB_BUFFER_SERIALIZE_FORMAT_JSON,
+ HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
+ puts (out);
+ }
+
+ hb_buffer_destroy (buf);
+
+ hb_font_destroy (font);
+
+#endif
+
+ return !ret;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test-gpos-size-params.cc b/src/3rdparty/harfbuzz-ng/src/test-gpos-size-params.cc
new file mode 100644
index 0000000000..ad10ed40d4
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-gpos-size-params.cc
@@ -0,0 +1,63 @@
+/*
+ * Copyright © 2010,2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb.h"
+#include "hb-ot.h"
+
+#include <stdio.h>
+
+#ifdef HB_NO_OPEN
+#define hb_blob_create_from_file(x) hb_blob_get_empty ()
+#endif
+
+int
+main (int argc, char **argv)
+{
+ if (argc != 2) {
+ fprintf (stderr, "usage: %s font-file\n", argv[0]);
+ exit (1);
+ }
+
+ /* Create the face */
+ hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+ hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+ hb_blob_destroy (blob);
+ blob = nullptr;
+
+ bool ret = true;
+
+#ifndef HB_NO_LAYOUT_FEATURE_PARAMS
+ unsigned int p[5];
+ ret = hb_ot_layout_get_size_params (face, p, p+1, (p+2), p+3, p+4);
+ printf ("%g %u %u %g %g\n", p[0]/10., p[1], p[2], p[3]/10., p[4]/10.);
+#endif
+
+ hb_face_destroy (face);
+
+ return !ret;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test-gsub-would-substitute.cc b/src/3rdparty/harfbuzz-ng/src/test-gsub-would-substitute.cc
new file mode 100644
index 0000000000..7ad9e084cb
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-gsub-would-substitute.cc
@@ -0,0 +1,68 @@
+/*
+ * Copyright © 2010,2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb.h"
+#include "hb-ot.h"
+
+#include <stdio.h>
+
+#ifdef HAVE_FREETYPE
+#include "hb-ft.h"
+#endif
+
+#ifdef HB_NO_OPEN
+#define hb_blob_create_from_file(x) hb_blob_get_empty ()
+#endif
+
+int
+main (int argc, char **argv)
+{
+ if (argc != 4 && argc != 5) {
+ fprintf (stderr, "usage: %s font-file lookup-index first-glyph [second-glyph]\n", argv[0]);
+ exit (1);
+ }
+
+ /* Create the face */
+ hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+ hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+ hb_blob_destroy (blob);
+ blob = nullptr;
+
+ hb_font_t *font = hb_font_create (face);
+#ifdef HAVE_FREETYPE
+ hb_ft_font_set_funcs (font);
+#endif
+
+ unsigned int len = argc - 3;
+ hb_codepoint_t glyphs[2];
+ if (!hb_font_glyph_from_string (font, argv[3], -1, &glyphs[0]) ||
+ (argc > 4 &&
+ !hb_font_glyph_from_string (font, argv[4], -1, &glyphs[1])))
+ return 2;
+ return !hb_ot_layout_lookup_would_substitute (face, strtol (argv[2], nullptr, 0), glyphs, len, false);
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test-iter.cc b/src/3rdparty/harfbuzz-ng/src/test-iter.cc
new file mode 100644
index 0000000000..9c83171889
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-iter.cc
@@ -0,0 +1,286 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+#include "hb-iter.hh"
+
+#include "hb-array.hh"
+#include "hb-set.hh"
+#include "hb-ot-layout-common.hh"
+
+
+template <typename T>
+struct array_iter_t : hb_iter_with_fallback_t<array_iter_t<T>, T&>
+{
+ array_iter_t (hb_array_t<T> arr_) : arr (arr_) {}
+
+ typedef T& __item_t__;
+ static constexpr bool is_random_access_iterator = true;
+ T& __item_at__ (unsigned i) const { return arr[i]; }
+ void __forward__ (unsigned n) { arr += n; }
+ void __rewind__ (unsigned n) { arr -= n; }
+ unsigned __len__ () const { return arr.length; }
+ bool operator != (const array_iter_t& o) { return arr != o.arr; }
+
+ private:
+ hb_array_t<T> arr;
+};
+
+template <typename T>
+struct some_array_t
+{
+ some_array_t (hb_array_t<T> arr_) : arr (arr_) {}
+
+ typedef array_iter_t<T> iter_t;
+ array_iter_t<T> iter () { return array_iter_t<T> (arr); }
+ operator array_iter_t<T> () { return iter (); }
+ operator hb_iter_t<array_iter_t<T>> () { return iter (); }
+
+ private:
+ hb_array_t<T> arr;
+};
+
+
+template <typename Iter,
+ hb_requires (hb_is_iterator (Iter))>
+static void
+test_iterator_non_default_constructable (Iter it)
+{
+ /* Iterate over a copy of it. */
+ for (auto c = it.iter (); c; c++)
+ *c;
+
+ /* Same. */
+ for (auto c = +it; c; c++)
+ *c;
+
+ /* Range-based for over a copy. */
+ for (auto _ : +it)
+ (void) _;
+
+ it += it.len ();
+ it = it + 10;
+ it = 10 + it;
+
+ assert (*it == it[0]);
+
+ static_assert (true || it.is_random_access_iterator, "");
+ static_assert (true || it.is_sorted_iterator, "");
+}
+
+template <typename Iter,
+ hb_requires (hb_is_iterator (Iter))>
+static void
+test_iterator (Iter it)
+{
+ Iter default_constructed;
+ assert (!default_constructed);
+
+ test_iterator_non_default_constructable (it);
+}
+
+template <typename Iterable,
+ hb_requires (hb_is_iterable (Iterable))>
+static void
+test_iterable (const Iterable &lst = Null(Iterable))
+{
+ for (auto _ : lst)
+ (void) _;
+
+ // Test that can take iterator from.
+ test_iterator (lst.iter ());
+}
+
+int
+main (int argc, char **argv)
+{
+ const int src[10] = {};
+ int dst[20];
+ hb_vector_t<int> v;
+
+ array_iter_t<const int> s (src); /* Implicit conversion from static array. */
+ array_iter_t<const int> s2 (v); /* Implicit conversion from vector. */
+ array_iter_t<int> t (dst);
+
+ static_assert (array_iter_t<int>::is_random_access_iterator, "");
+
+ some_array_t<const int> a (src);
+
+ s2 = s;
+
+ hb_iter (src);
+ hb_iter (src, 2);
+
+ hb_fill (t, 42);
+ hb_copy (s, t);
+ hb_copy (a.iter (), t);
+
+ test_iterable (v);
+ hb_set_t st;
+ st << 1 << 15 << 43;
+ test_iterable (st);
+ hb_sorted_array_t<int> sa;
+ (void) static_cast<hb_iter_t<hb_sorted_array_t<int>, hb_sorted_array_t<int>::item_t>&> (sa);
+ (void) static_cast<hb_iter_t<hb_sorted_array_t<int>, hb_sorted_array_t<int>::__item_t__>&> (sa);
+ (void) static_cast<hb_iter_t<hb_sorted_array_t<int>, int&>&>(sa);
+ (void) static_cast<hb_iter_t<hb_sorted_array_t<int>>&>(sa);
+ (void) static_cast<hb_iter_t<hb_array_t<int>, int&>&> (sa);
+ test_iterable (sa);
+
+ test_iterable<hb_array_t<int>> ();
+ test_iterable<hb_sorted_array_t<const int>> ();
+ test_iterable<hb_vector_t<float>> ();
+ test_iterable<hb_set_t> ();
+ test_iterable<OT::Coverage> ();
+
+ test_iterator (hb_zip (st, v));
+ test_iterator_non_default_constructable (hb_enumerate (st));
+ test_iterator_non_default_constructable (hb_enumerate (st, -5));
+ test_iterator_non_default_constructable (hb_enumerate (hb_iter (st)));
+ test_iterator_non_default_constructable (hb_enumerate (hb_iter (st) + 1));
+ test_iterator_non_default_constructable (hb_iter (st) | hb_filter ());
+ test_iterator_non_default_constructable (hb_iter (st) | hb_map (hb_lidentity));
+
+ assert (true == hb_all (st));
+ assert (false == hb_all (st, 42u));
+ assert (true == hb_any (st));
+ assert (false == hb_any (st, 14u));
+ assert (true == hb_any (st, 14u, [] (unsigned _) { return _ - 1u; }));
+ assert (true == hb_any (st, [] (unsigned _) { return _ == 15u; }));
+ assert (true == hb_any (st, 15u));
+ assert (false == hb_none (st));
+ assert (false == hb_none (st, 15u));
+ assert (true == hb_none (st, 17u));
+
+ hb_array_t<hb_vector_t<int>> pa;
+ pa->as_array ();
+
+ hb_map_t m;
+
+ hb_iter (st);
+ hb_iter (&st);
+
+ + hb_iter (src)
+ | hb_map (m)
+ | hb_map (&m)
+ | hb_filter ()
+ | hb_filter (st)
+ | hb_filter (&st)
+ | hb_filter (hb_bool)
+ | hb_filter (hb_bool, hb_identity)
+ | hb_sink (st)
+ ;
+
+ + hb_iter (src)
+ | hb_sink (hb_array (dst))
+ ;
+
+ + hb_iter (src)
+ | hb_apply (&st)
+ ;
+
+ + hb_iter (src)
+ | hb_map ([] (int i) { return 1; })
+ | hb_reduce ([=] (int acc, int value) { return acc; }, 2)
+ ;
+
+ using map_pair_t = hb_item_type<hb_map_t>;
+ + hb_iter (m)
+ | hb_map ([] (map_pair_t p) { return p.first * p.second; })
+ ;
+
+ m.keys ();
+ using map_key_t = decltype (*m.keys());
+ + hb_iter (m.keys ())
+ | hb_filter ([] (map_key_t k) { return k < 42; })
+ | hb_drain
+ ;
+
+ m.values ();
+ using map_value_t = decltype (*m.values());
+ + hb_iter (m.values ())
+ | hb_filter ([] (map_value_t k) { return k < 42; })
+ | hb_drain
+ ;
+
+ unsigned int temp1 = 10;
+ unsigned int temp2 = 0;
+ hb_map_t *result =
+ + hb_iter (src)
+ | hb_map ([&] (int i) -> hb_set_t *
+ {
+ hb_set_t *set = hb_set_create ();
+ for (unsigned int i = 0; i < temp1; ++i)
+ hb_set_add (set, i);
+ temp1++;
+ return set;
+ })
+ | hb_reduce ([&] (hb_map_t *acc, hb_set_t *value) -> hb_map_t *
+ {
+ hb_map_set (acc, temp2++, hb_set_get_population (value));
+ /* This is not a memory managed language, take care! */
+ hb_set_destroy (value);
+ return acc;
+ }, hb_map_create ())
+ ;
+ /* The result should be something like 0->10, 1->11, ..., 9->19 */
+ assert (hb_map_get (result, 9) == 19);
+
+ unsigned int temp3 = 0;
+ + hb_iter(src)
+ | hb_map([&] (int i) { return ++temp3; })
+ | hb_reduce([&] (float acc, int value) { return acc + value; }, 0)
+ ;
+ hb_map_destroy (result);
+
+ + hb_iter (src)
+ | hb_drain
+ ;
+
+ t << 1;
+ long vl;
+ s >> vl;
+
+ hb_iota ();
+ hb_iota (3);
+ hb_iota (3, 2);
+ assert ((&vl) + 1 == *++hb_iota (&vl, hb_inc));
+ hb_range ();
+ hb_repeat (7u);
+ hb_repeat (nullptr);
+ hb_repeat (vl) | hb_chop (3);
+ assert (hb_len (hb_range (10) | hb_take (3)) == 3);
+ assert (hb_range (9).len () == 9);
+ assert (hb_range (2, 9).len () == 7);
+ assert (hb_range (2, 9, 3).len () == 3);
+ assert (hb_range (2, 8, 3).len () == 2);
+ assert (hb_range (2, 7, 3).len () == 2);
+ assert (hb_range (-2, -9, -3).len () == 3);
+ assert (hb_range (-2, -8, -3).len () == 2);
+ assert (hb_range (-2, -7, -3).len () == 2);
+
+ return 0;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test-meta.cc b/src/3rdparty/harfbuzz-ng/src/test-meta.cc
new file mode 100644
index 0000000000..0b6e02c269
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-meta.cc
@@ -0,0 +1,128 @@
+/*
+ * Copyright © 2019 Facebook, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Facebook Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+#include "hb-meta.hh"
+
+#include <type_traits>
+
+int
+main (int argc, char **argv)
+{
+ static_assert (hb_is_convertible (void, void), "");
+ static_assert (hb_is_convertible (void, const void), "");
+ static_assert (hb_is_convertible (const void, void), "");
+
+ static_assert (hb_is_convertible (int, int), "");
+ static_assert (hb_is_convertible (char, int), "");
+ static_assert (hb_is_convertible (long, int), "");
+
+ static_assert (hb_is_convertible (int, int), "");
+
+ static_assert (hb_is_convertible (const int, int), "");
+ static_assert (hb_is_convertible (int, const int), "");
+ static_assert (hb_is_convertible (const int, const int), "");
+
+ static_assert (hb_is_convertible (int&, int), "");
+ static_assert (!hb_is_convertible (int, int&), "");
+
+ static_assert (hb_is_convertible (int, const int&), "");
+ static_assert (!hb_is_convertible (const int, int&), "");
+ static_assert (hb_is_convertible (const int, const int&), "");
+ static_assert (hb_is_convertible (int&, const int), "");
+ static_assert (hb_is_convertible (const int&, int), "");
+ static_assert (hb_is_convertible (const int&, const int), "");
+ static_assert (hb_is_convertible (const int&, const int), "");
+
+ struct X {};
+ struct Y : X {};
+
+ static_assert (hb_is_convertible (const X &, const X), "");
+ static_assert (hb_is_convertible (X &, const X), "");
+ static_assert (hb_is_convertible (X &, const X &), "");
+ static_assert (hb_is_convertible (X, const X &), "");
+ static_assert (hb_is_convertible (const X, const X &), "");
+ static_assert (!hb_is_convertible (const X, X &), "");
+ static_assert (!hb_is_convertible (X, X &), "");
+ static_assert (hb_is_convertible (X &, X &), "");
+
+ static_assert (hb_is_convertible (int&, long), "");
+ static_assert (!hb_is_convertible (int&, long&), "");
+
+ static_assert (hb_is_convertible (int *, int *), "");
+ static_assert (hb_is_convertible (int *, const int *), "");
+ static_assert (!hb_is_convertible (const int *, int *), "");
+ static_assert (!hb_is_convertible (int *, long *), "");
+ static_assert (hb_is_convertible (int *, void *), "");
+ static_assert (!hb_is_convertible (void *, int *), "");
+
+ static_assert (hb_is_base_of (void, void), "");
+ static_assert (hb_is_base_of (void, int), "");
+ static_assert (!hb_is_base_of (int, void), "");
+
+ static_assert (hb_is_base_of (int, int), "");
+ static_assert (hb_is_base_of (const int, int), "");
+ static_assert (hb_is_base_of (int, const int), "");
+
+ static_assert (hb_is_base_of (X, X), "");
+ static_assert (hb_is_base_of (X, Y), "");
+ static_assert (hb_is_base_of (const X, Y), "");
+ static_assert (hb_is_base_of (X, const Y), "");
+ static_assert (!hb_is_base_of (Y, X), "");
+
+ static_assert (hb_is_constructible (int), "");
+ static_assert (hb_is_constructible (int, int), "");
+ static_assert (hb_is_constructible (int, char), "");
+ static_assert (hb_is_constructible (int, long), "");
+ static_assert (!hb_is_constructible (int, X), "");
+ static_assert (!hb_is_constructible (int, int, int), "");
+ static_assert (hb_is_constructible (X), "");
+ static_assert (!hb_is_constructible (X, int), "");
+ static_assert (hb_is_constructible (X, X), "");
+ static_assert (!hb_is_constructible (X, X, X), "");
+ static_assert (hb_is_constructible (X, Y), "");
+ static_assert (!hb_is_constructible (Y, X), "");
+
+ static_assert (hb_is_trivially_default_constructible (X), "");
+ static_assert (hb_is_trivially_default_constructible (Y), "");
+ static_assert (hb_is_trivially_copy_constructible (X), "");
+ static_assert (hb_is_trivially_copy_constructible (Y), "");
+ static_assert (hb_is_trivially_move_constructible (X), "");
+ static_assert (hb_is_trivially_move_constructible (Y), "");
+ static_assert (hb_is_trivially_destructible (Y), "");
+
+ static_assert (hb_is_trivially_copyable (int), "");
+ static_assert (hb_is_trivially_copyable (X), "");
+ static_assert (hb_is_trivially_copyable (Y), "");
+
+ static_assert (hb_is_trivial (int), "");
+ static_assert (hb_is_trivial (X), "");
+ static_assert (hb_is_trivial (Y), "");
+
+ /* TODO Add more meaningful tests. */
+
+ return 0;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test-number.cc b/src/3rdparty/harfbuzz-ng/src/test-number.cc
new file mode 100644
index 0000000000..3591b13f27
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-number.cc
@@ -0,0 +1,253 @@
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#include "hb.hh"
+#include "hb-number.hh"
+#include "hb-number-parser.hh"
+
+
+int
+main (int argc, char **argv)
+{
+ {
+ const char str[] = "123";
+ const char *pp = str;
+ const char *end = str + 3;
+
+ int pv;
+ assert (hb_parse_int (&pp, end, &pv));
+ assert (pv == 123);
+ assert (pp - str == 3);
+ assert (end - pp == 0);
+ assert (!*end);
+ }
+
+ {
+ const char str[] = "123";
+ const char *pp = str;
+ const char *end = str + strlen (str);
+
+ unsigned int pv;
+ assert (hb_parse_uint (&pp, end, &pv));
+ assert (pv == 123);
+ assert (pp - str == 3);
+ assert (end - pp == 0);
+ assert (!*end);
+ }
+
+ {
+ const char str[] = "12F";
+ const char *pp = str;
+ const char *end = str + 3;
+
+ unsigned int pv;
+ assert (hb_parse_uint (&pp, end, &pv, true, 16));
+ assert (pv == 0x12F);
+ assert (pp - str == 3);
+ assert (end - pp == 0);
+ assert (!*end);
+ }
+
+ {
+ const char str[] = "12Fq";
+ const char *pp = str;
+ const char *end = str + 4;
+
+ unsigned int pv;
+ assert (!hb_parse_uint (&pp, end, &pv, true, 16));
+ assert (hb_parse_uint (&pp, end, &pv, false, 16));
+ assert (pv == 0x12F);
+ assert (pp - str == 3);
+ assert (end - pp == 1);
+ assert (!*end);
+ }
+
+ {
+ const char str[] = "-123";
+ const char *pp = str;
+ const char *end = str + 4;
+
+ int pv;
+ assert (hb_parse_int (&pp, end, &pv));
+ assert (pv == -123);
+ assert (pp - str == 4);
+ assert (end - pp == 0);
+ assert (!*end);
+ }
+
+ {
+ const char str[] = "123";
+ const char *pp = str;
+ assert (ARRAY_LENGTH (str) == 4);
+ const char *end = str + ARRAY_LENGTH (str);
+
+ unsigned int pv;
+ assert (hb_parse_uint (&pp, end, &pv));
+ assert (pv == 123);
+ assert (pp - str == 3);
+ assert (end - pp == 1);
+ }
+
+ {
+ const char str[] = "123\0";
+ const char *pp = str;
+ assert (ARRAY_LENGTH (str) == 5);
+ const char *end = str + ARRAY_LENGTH (str);
+
+ unsigned int pv;
+ assert (hb_parse_uint (&pp, end, &pv));
+ assert (pv == 123);
+ assert (pp - str == 3);
+ assert (end - pp == 2);
+ }
+
+ {
+ const char str[] = "123V";
+ const char *pp = str;
+ assert (ARRAY_LENGTH (str) == 5);
+ const char *end = str + ARRAY_LENGTH (str);
+
+ unsigned int pv;
+ assert (hb_parse_uint (&pp, end, &pv));
+ assert (pv == 123);
+ assert (pp - str == 3);
+ assert (end - pp == 2);
+ }
+
+ {
+ const char str[] = ".123";
+ const char *pp = str;
+ const char *end = str + ARRAY_LENGTH (str);
+
+ double pv;
+ assert (hb_parse_double (&pp, end, &pv));
+ assert ((int) roundf (pv * 1000.) == 123);
+ assert (pp - str == 4);
+ assert (end - pp == 1);
+
+ /* Test strtod_rl even if libc's strtod_l is used */
+ char *pend;
+ assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == 123);
+ assert (pend - str == 4);
+ }
+
+ {
+ const char str[] = "0.123";
+ const char *pp = str;
+ const char *end = str + ARRAY_LENGTH (str) - 1;
+
+ double pv;
+ assert (hb_parse_double (&pp, end, &pv));
+ assert ((int) roundf (pv * 1000.) == 123);
+ assert (pp - str == 5);
+ assert (end - pp == 0);
+
+ char *pend;
+ assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == 123);
+ assert (pend - str == 5);
+ }
+
+ {
+ const char str[] = "0.123e0";
+ const char *pp = str;
+ const char *end = str + ARRAY_LENGTH (str) - 1;
+
+ double pv;
+ assert (hb_parse_double (&pp, end, &pv));
+ assert ((int) roundf (pv * 1000.) == 123);
+ assert (pp - str == 7);
+ assert (end - pp == 0);
+
+ char *pend;
+ assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == 123);
+ assert (pend - str == 7);
+ }
+
+ {
+ const char str[] = "123e-3";
+ const char *pp = str;
+ const char *end = str + ARRAY_LENGTH (str) - 1;
+
+ double pv;
+ assert (hb_parse_double (&pp, end, &pv));
+ assert ((int) roundf (pv * 1000.) == 123);
+ assert (pp - str == 6);
+ assert (end - pp == 0);
+
+ char *pend;
+ assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == 123);
+ assert (pend - str == 6);
+ }
+
+ {
+ const char str[] = ".000123e+3";
+ const char *pp = str;
+ const char *end = str + ARRAY_LENGTH (str) - 1;
+
+ double pv;
+ assert (hb_parse_double (&pp, end, &pv));
+ assert ((int) roundf (pv * 1000.) == 123);
+ assert (pp - str == 10);
+ assert (end - pp == 0);
+
+ char *pend;
+ assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == 123);
+ assert (pend - str == 10);
+ }
+
+ {
+ const char str[] = "-.000000123e6";
+ const char *pp = str;
+ const char *end = str + ARRAY_LENGTH (str) - 1;
+
+ double pv;
+ assert (hb_parse_double (&pp, end, &pv));
+ assert ((int) roundf (pv * 1000.) == -123);
+ assert (pp - str == 13);
+ assert (end - pp == 0);
+
+ char *pend;
+ assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == -123);
+ assert (pend - str == 13);
+ }
+
+ {
+ const char str[] = "-1.23E-1";
+ const char *pp = str;
+ const char *end = str + ARRAY_LENGTH (str) - 1;
+
+ double pv;
+ assert (hb_parse_double (&pp, end, &pv));
+ assert ((int) roundf (pv * 1000.) == -123);
+ assert (pp - str == 8);
+ assert (end - pp == 0);
+
+ char *pend;
+ assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == -123);
+ assert (pend - str == 8);
+ }
+
+ return 0;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test-ot-color.cc b/src/3rdparty/harfbuzz-ng/src/test-ot-color.cc
new file mode 100644
index 0000000000..88924b4473
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-ot-color.cc
@@ -0,0 +1,348 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ * Copyright © 2018 Khaled Hosny
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb.hh"
+
+#include <cairo.h>
+
+#ifdef HB_NO_OPEN
+#define hb_blob_create_from_file(x) hb_blob_get_empty ()
+#endif
+
+#if !defined(HB_NO_COLOR) && defined(CAIRO_HAS_SVG_SURFACE)
+
+#include "hb-ot.h"
+
+#include "hb-ft.h"
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_GLYPH_H
+
+#include <cairo-ft.h>
+#include <cairo-svg.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+static void
+svg_dump (hb_face_t *face, unsigned int face_index)
+{
+ unsigned glyph_count = hb_face_get_glyph_count (face);
+
+ for (unsigned int glyph_id = 0; glyph_id < glyph_count; glyph_id++)
+ {
+ hb_blob_t *blob = hb_ot_color_glyph_reference_svg (face, glyph_id);
+
+ if (hb_blob_get_length (blob) == 0) continue;
+
+ unsigned int length;
+ const char *data = hb_blob_get_data (blob, &length);
+
+ char output_path[255];
+ sprintf (output_path, "out/svg-%u-%u.svg%s",
+ glyph_id,
+ face_index,
+ // append "z" if the content is gzipped, https://stackoverflow.com/a/6059405
+ (length > 2 && (data[0] == '\x1F') && (data[1] == '\x8B')) ? "z" : "");
+
+ FILE *f = fopen (output_path, "wb");
+ fwrite (data, 1, length, f);
+ fclose (f);
+
+ hb_blob_destroy (blob);
+ }
+}
+
+/* _png API is so easy to use unlike the below code, don't get confused */
+static void
+png_dump (hb_face_t *face, unsigned int face_index)
+{
+ unsigned glyph_count = hb_face_get_glyph_count (face);
+ hb_font_t *font = hb_font_create (face);
+
+ /* scans the font for strikes */
+ unsigned int sample_glyph_id;
+ /* we don't care about different strikes for different glyphs at this point */
+ for (sample_glyph_id = 0; sample_glyph_id < glyph_count; sample_glyph_id++)
+ {
+ hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, sample_glyph_id);
+ unsigned int blob_length = hb_blob_get_length (blob);
+ hb_blob_destroy (blob);
+ if (blob_length != 0)
+ break;
+ }
+
+ unsigned int upem = hb_face_get_upem (face);
+ unsigned int blob_length = 0;
+ unsigned int strike = 0;
+ for (unsigned int ppem = 1; ppem < upem; ppem++)
+ {
+ hb_font_set_ppem (font, ppem, ppem);
+ hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, sample_glyph_id);
+ unsigned int new_blob_length = hb_blob_get_length (blob);
+ hb_blob_destroy (blob);
+ if (new_blob_length != blob_length)
+ {
+ for (unsigned int glyph_id = 0; glyph_id < glyph_count; glyph_id++)
+ {
+ hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, glyph_id);
+
+ if (hb_blob_get_length (blob) == 0) continue;
+
+ unsigned int length;
+ const char *data = hb_blob_get_data (blob, &length);
+
+ char output_path[255];
+ sprintf (output_path, "out/png-%u-%u-%u.png", glyph_id, strike, face_index);
+
+ FILE *f = fopen (output_path, "wb");
+ fwrite (data, 1, length, f);
+ fclose (f);
+
+ hb_blob_destroy (blob);
+ }
+
+ strike++;
+ blob_length = new_blob_length;
+ }
+ }
+
+ hb_font_destroy (font);
+}
+
+static void
+layered_glyph_dump (hb_face_t *face, cairo_font_face_t *cairo_face, unsigned int face_index)
+{
+ unsigned int upem = hb_face_get_upem (face);
+
+ unsigned glyph_count = hb_face_get_glyph_count (face);
+ for (hb_codepoint_t gid = 0; gid < glyph_count; ++gid)
+ {
+ unsigned int num_layers = hb_ot_color_glyph_get_layers (face, gid, 0, nullptr, nullptr);
+ if (!num_layers)
+ continue;
+
+ hb_ot_color_layer_t *layers = (hb_ot_color_layer_t*) malloc (num_layers * sizeof (hb_ot_color_layer_t));
+
+ hb_ot_color_glyph_get_layers (face, gid, 0, &num_layers, layers);
+ if (num_layers)
+ {
+ // Measure
+ cairo_text_extents_t extents;
+ {
+ cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
+ cairo_t *cr = cairo_create (surface);
+ cairo_set_font_face (cr, cairo_face);
+ cairo_set_font_size (cr, upem);
+
+ cairo_glyph_t *glyphs = (cairo_glyph_t *) calloc (num_layers, sizeof (cairo_glyph_t));
+ for (unsigned int j = 0; j < num_layers; ++j)
+ glyphs[j].index = layers[j].glyph;
+ cairo_glyph_extents (cr, glyphs, num_layers, &extents);
+ free (glyphs);
+ cairo_surface_destroy (surface);
+ cairo_destroy (cr);
+ }
+
+ // Add a slight margin
+ extents.width += extents.width / 10;
+ extents.height += extents.height / 10;
+ extents.x_bearing -= extents.width / 20;
+ extents.y_bearing -= extents.height / 20;
+
+ // Render
+ unsigned int palette_count = hb_ot_color_palette_get_count (face);
+ for (unsigned int palette = 0; palette < palette_count; palette++)
+ {
+ unsigned int num_colors = hb_ot_color_palette_get_colors (face, palette, 0, nullptr, nullptr);
+ if (!num_colors)
+ continue;
+
+ hb_color_t *colors = (hb_color_t*) calloc (num_colors, sizeof (hb_color_t));
+ hb_ot_color_palette_get_colors (face, palette, 0, &num_colors, colors);
+ if (num_colors)
+ {
+ char output_path[255];
+ sprintf (output_path, "out/colr-%u-%u-%u.svg", gid, palette, face_index);
+
+ cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
+ cairo_t *cr = cairo_create (surface);
+ cairo_set_font_face (cr, cairo_face);
+ cairo_set_font_size (cr, upem);
+
+ for (unsigned int layer = 0; layer < num_layers; ++layer)
+ {
+ hb_color_t color = 0x000000FF;
+ if (layers[layer].color_index != 0xFFFF)
+ color = colors[layers[layer].color_index];
+ cairo_set_source_rgba (cr,
+ hb_color_get_red (color) / 255.,
+ hb_color_get_green (color) / 255.,
+ hb_color_get_blue (color) / 255.,
+ hb_color_get_alpha (color) / 255.);
+
+ cairo_glyph_t glyph;
+ glyph.index = layers[layer].glyph;
+ glyph.x = -extents.x_bearing;
+ glyph.y = -extents.y_bearing;
+ cairo_show_glyphs (cr, &glyph, 1);
+ }
+
+ cairo_surface_destroy (surface);
+ cairo_destroy (cr);
+ }
+ free (colors);
+ }
+ }
+
+ free (layers);
+ }
+}
+
+static void
+dump_glyphs (cairo_font_face_t *cairo_face, unsigned int upem,
+ unsigned int num_glyphs, unsigned int face_index)
+{
+ for (unsigned int i = 0; i < num_glyphs; ++i)
+ {
+ cairo_text_extents_t extents;
+ cairo_glyph_t glyph = {0};
+ glyph.index = i;
+
+ // Measure
+ {
+ cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
+ cairo_t *cr = cairo_create (surface);
+ cairo_set_font_face (cr, cairo_face);
+ cairo_set_font_size (cr, upem);
+
+ cairo_glyph_extents (cr, &glyph, 1, &extents);
+ cairo_surface_destroy (surface);
+ cairo_destroy (cr);
+ }
+
+ // Add a slight margin
+ extents.width += extents.width / 10;
+ extents.height += extents.height / 10;
+ extents.x_bearing -= extents.width / 20;
+ extents.y_bearing -= extents.height / 20;
+
+ // Render
+ {
+ char output_path[255];
+ sprintf (output_path, "out/%u-%u.svg", face_index, i);
+ cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
+ cairo_t *cr = cairo_create (surface);
+ cairo_set_font_face (cr, cairo_face);
+ cairo_set_font_size (cr, upem);
+ glyph.x = -extents.x_bearing;
+ glyph.y = -extents.y_bearing;
+ cairo_show_glyphs (cr, &glyph, 1);
+ cairo_surface_destroy (surface);
+ cairo_destroy (cr);
+ }
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ if (argc != 2) {
+ fprintf (stderr, "usage: %s font-file.ttf\n"
+ "run it like `rm -rf out && mkdir out && %s font-file.ttf`\n",
+ argv[0], argv[0]);
+ exit (1);
+ }
+
+
+ FILE *font_name_file = fopen ("out/.dumped_font_name", "r");
+ if (font_name_file != nullptr)
+ {
+ fprintf (stderr, "Purge or move ./out folder in order to run a new dump\n");
+ exit (1);
+ }
+
+ font_name_file = fopen ("out/.dumped_font_name", "w");
+ if (font_name_file == nullptr)
+ {
+ fprintf (stderr, "./out is not accessible as a folder, create it please\n");
+ exit (1);
+ }
+ fwrite (argv[1], 1, strlen (argv[1]), font_name_file);
+ fclose (font_name_file);
+
+ hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+ unsigned int num_faces = hb_face_count (blob);
+ if (num_faces == 0)
+ {
+ fprintf (stderr, "error: The file (%s) was corrupted, empty or not found", argv[1]);
+ exit (1);
+ }
+
+ for (unsigned int face_index = 0; face_index < hb_face_count (blob); face_index++)
+ {
+ hb_face_t *face = hb_face_create (blob, face_index);
+ hb_font_t *font = hb_font_create (face);
+
+ if (hb_ot_color_has_png (face)) printf ("Dumping png (cbdt/sbix)...\n");
+ png_dump (face, face_index);
+
+ if (hb_ot_color_has_svg (face)) printf ("Dumping svg...\n");
+ svg_dump (face, face_index);
+
+ cairo_font_face_t *cairo_face;
+ {
+ FT_Library library;
+ FT_Init_FreeType (&library);
+ FT_Face ft_face;
+ FT_New_Face (library, argv[1], 0, &ft_face);
+ cairo_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0);
+ }
+ if (hb_ot_color_has_layers (face) && hb_ot_color_has_palettes (face))
+ printf ("Dumping layered color glyphs...\n");
+ layered_glyph_dump (face, cairo_face, face_index);
+
+ unsigned int num_glyphs = hb_face_get_glyph_count (face);
+ unsigned int upem = hb_face_get_upem (face);
+
+ // disabled when color font as cairo rendering of NotoColorEmoji is soooo slow
+ if (!hb_ot_color_has_layers (face) &&
+ !hb_ot_color_has_png (face) &&
+ !hb_ot_color_has_svg (face))
+ dump_glyphs (cairo_face, upem, num_glyphs, face_index);
+
+ hb_font_destroy (font);
+ hb_face_destroy (face);
+ }
+
+ hb_blob_destroy (blob);
+
+ return 0;
+}
+
+#else
+int main (int argc, char **argv) { return 0; }
+#endif
diff --git a/src/3rdparty/harfbuzz-ng/src/test-ot-meta.cc b/src/3rdparty/harfbuzz-ng/src/test-ot-meta.cc
new file mode 100644
index 0000000000..1045007f7d
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-ot-meta.cc
@@ -0,0 +1,70 @@
+/*
+ * Copyright © 2019 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb.hh"
+#include "hb-ot.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef HB_NO_OPEN
+#define hb_blob_create_from_file(x) hb_blob_get_empty ()
+#endif
+
+int
+main (int argc, char **argv)
+{
+ if (argc != 2) {
+ fprintf (stderr, "usage: %s font-file\n", argv[0]);
+ exit (1);
+ }
+
+ hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+ hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+ hb_blob_destroy (blob);
+ blob = nullptr;
+
+ unsigned int count = 0;
+
+#ifndef HB_NO_META
+ count = hb_ot_meta_get_entry_tags (face, 0, nullptr, nullptr);
+
+ hb_ot_meta_tag_t *tags = (hb_ot_meta_tag_t *)
+ malloc (sizeof (hb_ot_meta_tag_t) * count);
+ hb_ot_meta_get_entry_tags (face, 0, &count, tags);
+ for (unsigned i = 0; i < count; ++i)
+ {
+ hb_blob_t *entry = hb_ot_meta_reference_entry (face, tags[i]);
+ printf ("%c%c%c%c, size: %d: %.*s\n",
+ HB_UNTAG (tags[i]), hb_blob_get_length (entry),
+ hb_blob_get_length (entry), hb_blob_get_data (entry, nullptr));
+ hb_blob_destroy (entry);
+ }
+ free (tags);
+#endif
+
+ hb_face_destroy (face);
+
+ return !count;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test-ot-name.cc b/src/3rdparty/harfbuzz-ng/src/test-ot-name.cc
new file mode 100644
index 0000000000..4a484c6d66
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-ot-name.cc
@@ -0,0 +1,76 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+#include "hb-ot.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef HB_NO_OPEN
+#define hb_blob_create_from_file(x) hb_blob_get_empty ()
+#endif
+
+int
+main (int argc, char **argv)
+{
+ if (argc != 2) {
+ fprintf (stderr, "usage: %s font-file\n", argv[0]);
+ exit (1);
+ }
+
+ hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+ hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+ hb_blob_destroy (blob);
+ blob = nullptr;
+
+ unsigned int count = 0;
+
+#ifndef HB_NO_NAME
+ const hb_ot_name_entry_t *entries = hb_ot_name_list_names (face, &count);
+
+ for (unsigned int i = 0; i < count; i++)
+ {
+ printf ("%u %s ",
+ entries[i].name_id,
+ hb_language_to_string (entries[i].language));
+
+ char buf[64];
+ unsigned int buf_size = sizeof (buf);
+ hb_ot_name_get_utf8 (face,
+ entries[i].name_id,
+ entries[i].language,
+ &buf_size,
+ buf);
+
+ printf ("%s\n", buf);
+ }
+#endif
+
+ hb_face_destroy (face);
+
+ return count ? 0 : 1;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test-unicode-ranges.cc b/src/3rdparty/harfbuzz-ng/src/test-unicode-ranges.cc
new file mode 100644
index 0000000000..33cac6b715
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test-unicode-ranges.cc
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger
+ */
+
+#include "hb.hh"
+#include "hb-ot-os2-unicode-ranges.hh"
+
+static void
+test (hb_codepoint_t cp, unsigned int bit)
+{
+ if (OT::_hb_ot_os2_get_unicode_range_bit (cp) != bit)
+ {
+ fprintf (stderr, "got incorrect bit (%d) for cp 0x%X. Should have been %d.",
+ OT::_hb_ot_os2_get_unicode_range_bit (cp),
+ cp,
+ bit);
+ abort();
+ }
+}
+
+static void
+test_get_unicode_range_bit ()
+{
+ test (0x0000, 0);
+ test (0x0042, 0);
+ test (0x007F, 0);
+ test (0x0080, 1);
+
+ test (0x30A0, 50);
+ test (0x30B1, 50);
+ test (0x30FF, 50);
+
+ test (0x10FFFD, 90);
+
+ test (0x30000, -1);
+ test (0x110000, -1);
+}
+
+int
+main ()
+{
+ test_get_unicode_range_bit ();
+ return 0;
+}
diff --git a/src/3rdparty/harfbuzz-ng/src/test.cc b/src/3rdparty/harfbuzz-ng/src/test.cc
new file mode 100644
index 0000000000..65b469feb7
--- /dev/null
+++ b/src/3rdparty/harfbuzz-ng/src/test.cc
@@ -0,0 +1,98 @@
+/*
+ * Copyright © 2010,2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb.hh"
+
+#include "hb.h"
+
+#include <stdio.h>
+
+#ifdef HAVE_FREETYPE
+#include "hb-ft.h"
+#endif
+
+#ifdef HB_NO_OPEN
+#define hb_blob_create_from_file(x) hb_blob_get_empty ()
+#endif
+
+int
+main (int argc, char **argv)
+{
+ if (argc != 2) {
+ fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]);
+ exit (1);
+ }
+
+ hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+ printf ("Opened font file %s: %u bytes long\n", argv[1], hb_blob_get_length (blob));
+
+ /* Create the face */
+ hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+ hb_blob_destroy (blob);
+ blob = nullptr;
+ unsigned int upem = hb_face_get_upem (face);
+
+ hb_font_t *font = hb_font_create (face);
+ hb_font_set_scale (font, upem, upem);
+
+#ifdef HAVE_FREETYPE
+ hb_ft_font_set_funcs (font);
+#endif
+
+ hb_buffer_t *buffer = hb_buffer_create ();
+
+ hb_buffer_add_utf8 (buffer, "\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\x95", -1, 0, -1);
+ hb_buffer_guess_segment_properties (buffer);
+
+ hb_shape (font, buffer, nullptr, 0);
+
+ unsigned int count = hb_buffer_get_length (buffer);
+ hb_glyph_info_t *infos = hb_buffer_get_glyph_infos (buffer, nullptr);
+ hb_glyph_position_t *positions = hb_buffer_get_glyph_positions (buffer, nullptr);
+
+ for (unsigned int i = 0; i < count; i++)
+ {
+ hb_glyph_info_t *info = &infos[i];
+ hb_glyph_position_t *pos = &positions[i];
+
+ printf ("cluster %d glyph 0x%x at (%d,%d)+(%d,%d)\n",
+ info->cluster,
+ info->codepoint,
+ pos->x_offset,
+ pos->y_offset,
+ pos->x_advance,
+ pos->y_advance);
+
+ }
+
+ hb_buffer_destroy (buffer);
+ hb_font_destroy (font);
+ hb_face_destroy (face);
+
+ return 0;
+}
+
+
diff --git a/src/3rdparty/harfbuzz/.gitignore b/src/3rdparty/harfbuzz/.gitignore
deleted file mode 100644
index 572243facd..0000000000
--- a/src/3rdparty/harfbuzz/.gitignore
+++ /dev/null
@@ -1,20 +0,0 @@
-INSTALL
-Makefile.in
-aclocal.m4
-autom4te.cache
-config.guess
-config.h.in
-config.sub
-config.h
-configure
-depcomp
-install-sh
-ltmain.sh
-missing
-Makefile
-config.status
-config.log
-libtool
-stamp-h1
-compile
-build
diff --git a/src/3rdparty/harfbuzz/AUTHORS b/src/3rdparty/harfbuzz/AUTHORS
deleted file mode 100644
index 023488a5b9..0000000000
--- a/src/3rdparty/harfbuzz/AUTHORS
+++ /dev/null
@@ -1,6 +0,0 @@
-David Turner
-Werner Lemberg
-Owen Taylor
-Behdad Esfahbod
-Lars Knoll
-Simon Hausmann
diff --git a/src/3rdparty/harfbuzz/COPYING b/src/3rdparty/harfbuzz/COPYING
deleted file mode 100644
index 820a9e6808..0000000000
--- a/src/3rdparty/harfbuzz/COPYING
+++ /dev/null
@@ -1,24 +0,0 @@
-HarfBuzz was previously licensed under different licenses. This was
-changed in January 2008. If you need to relicense your old copies,
-consult the announcement of the license change on the internet.
-Other than that, each copy of HarfBuzz is licensed under the COPYING
-file included with it. The actual license follows:
-
-
-Permission is hereby granted, without written agreement and without
-license or royalty fees, to use, copy, modify, and distribute this
-software and its documentation for any purpose, provided that the
-above copyright notice and the following two paragraphs appear in
-all copies of this software.
-
-IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
-DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
-ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
-IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
-ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
-PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
diff --git a/src/3rdparty/harfbuzz/Makefile.am b/src/3rdparty/harfbuzz/Makefile.am
deleted file mode 100644
index 776b947eee..0000000000
--- a/src/3rdparty/harfbuzz/Makefile.am
+++ /dev/null
@@ -1,2 +0,0 @@
-
-SUBDIRS = src tests
diff --git a/src/3rdparty/harfbuzz/README b/src/3rdparty/harfbuzz/README
deleted file mode 100644
index ca2546ae02..0000000000
--- a/src/3rdparty/harfbuzz/README
+++ /dev/null
@@ -1,7 +0,0 @@
-This is HarfBuzz, an OpenType Layout engine library.
-
-To report bugs or post to discussion mailing list, see:
-
- http://freedesktop.org/wiki/Software/HarfBuzz
-
-For license information, see the file COPYING.
diff --git a/src/3rdparty/harfbuzz/autogen.sh b/src/3rdparty/harfbuzz/autogen.sh
deleted file mode 100755
index 7fa1c3df61..0000000000
--- a/src/3rdparty/harfbuzz/autogen.sh
+++ /dev/null
@@ -1,116 +0,0 @@
-#!/bin/sh
-# Run this to generate all the initial makefiles, etc.
-
-set -e
-
-srcdir=`dirname $0`
-test -z "$srcdir" && srcdir=.
-
-ORIGDIR=`pwd`
-cd $srcdir
-PROJECT=harfbuzz
-TEST_TYPE=-f
-FILE=src/harfbuzz.h
-ACLOCAL=${ACLOCAL-aclocal}
-LIBTOOLIZE=${LIBTOOLIZE-libtoolize}
-AUTOMAKE=${AUTOMAKE-automake}
-AUTOHEADER=${AUTOHEADER-autoheader}
-AUTOCONF=${AUTOCONF-autoconf}
-LIBTOOLIZE_FLAGS="--copy --force"
-
-DIE=0
-
-have_libtool=false
-if $LIBTOOLIZE --version < /dev/null > /dev/null 2>&1 ; then
- libtool_version=`$LIBTOOLIZE --version | sed 's/^[^0-9]*\([0-9].[0-9.]*\).*/\1/'`
- case $libtool_version in
- 1.4*|1.5*|1.6*|1.7*|2*)
- have_libtool=true
- ;;
- esac
-fi
-if $have_libtool ; then : ; else
- echo
- echo "You must have libtool 1.4 installed to compile $PROJECT."
- echo "Install the appropriate package for your distribution,"
- echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
- DIE=1
-fi
-
-($AUTOCONF --version) < /dev/null > /dev/null 2>&1 || {
- echo
- echo "You must have autoconf installed to compile $PROJECT."
- echo "libtool the appropriate package for your distribution,"
- echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
- DIE=1
-}
-
-have_automake=false
-need_libtoolize=true
-if $AUTOMAKE --version < /dev/null > /dev/null 2>&1 ; then
- automake_version=`$AUTOMAKE --version | grep 'automake (GNU automake)' | sed 's/^[^0-9]*\(.*\)/\1/'`
- case $automake_version in
- 1.2*|1.3*|1.4)
- ;;
- 1.4*)
- have_automake=true
- need_libtoolize=false
- ;;
- *)
- have_automake=true
- ;;
- esac
-fi
-if $have_automake ; then : ; else
- echo
- echo "You must have automake 1.4-p1 installed to compile $PROJECT."
- echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.4-p1.tar.gz"
- echo "(or a newer version if it is available)"
- DIE=1
-fi
-
-if test "$DIE" -eq 1; then
- exit 1
-fi
-
-test $TEST_TYPE $FILE || {
- echo "You must run this script in the top-level $PROJECT directory"
- exit 1
-}
-
-if test -z "$AUTOGEN_SUBDIR_MODE"; then
- if test -z "$*"; then
- echo "I am going to run ./configure with no arguments - if you wish "
- echo "to pass any to it, please specify them on the $0 command line."
- fi
-fi
-
-echo Running $ACLOCAL $ACLOCAL_FLAGS
-$ACLOCAL $ACLOCAL_FLAGS
-
-# optionally run autoheader
-if $AUTOHEADER --version < /dev/null > /dev/null 2>&1; then
- echo Running $AUTOHEADER
- $AUTOHEADER
-fi
-
-case $need_libtoolize in
- true)
- echo Running $LIBTOOLIZE $LIBTOOLIZE_FLAGS
- $LIBTOOLIZE $LIBTOOLIZE_FLAGS
- ;;
-esac
-
-echo Running $AUTOMAKE -a $am_opt
-$AUTOMAKE -a $am_opt
-echo Running $AUTOCONF
-$AUTOCONF
-cd $ORIGDIR
-
-if test -z "$AUTOGEN_SUBDIR_MODE"; then
- echo Running $srcdir/configure "$@"
- $srcdir/configure "$@"
-
- echo
- echo "Now type 'make' to compile $PROJECT."
-fi
diff --git a/src/3rdparty/harfbuzz/configure.ac b/src/3rdparty/harfbuzz/configure.ac
deleted file mode 100644
index 8519279738..0000000000
--- a/src/3rdparty/harfbuzz/configure.ac
+++ /dev/null
@@ -1,54 +0,0 @@
-AC_INIT(README)
-AM_INIT_AUTOMAKE(harfbuzz, 0.1)
-AC_PROG_CC
-AC_PROG_CXX
-AM_PROG_LIBTOOL
-PKG_PROG_PKG_CONFIG
-AM_CONFIG_HEADER(config.h)
-
-if test "x$ac_compiler_gnu" = xyes; then
- CFLAGS="$CFLAGS -Wall -W -pedantic -ansi"
- CXXFLAGS="$CXXFLAGS -Wall -W"
-fi
-
-AC_PATH_PROG(ft_config,freetype-config,no)
-if test "$ft_config" = "no"; then
- AC_MSG_ERROR([You must have freetype installed; see http://www.freetype.org/])
-fi
-
-FREETYPE_CFLAGS="`$ft_config --cflags`"
-FREETYPE_LIBS="`$ft_config --libs`"
-
-AC_SUBST(FREETYPE_LIBS)
-AC_SUBST(FREETYPE_CFLAGS)
-
-AC_ARG_ENABLE(qt, AS_HELP_STRING([--disable-qt], [Build Qt support (default: auto)]), [QT=$enableval], [QT=auto])
-
-if test "x$QT" = xauto; then
- PKG_CHECK_MODULES(QT, [QtGui >= 4.3], [QT=yes], [QT=no])
-fi
-if test "x$QT" = xyes; then
- PKG_CHECK_MODULES(QT_GUI, [QtGui >= 4.3])
- PKG_CHECK_MODULES(QT_QTEST, [QtTest >= 4.3])
-
- _PKG_CONFIG(QT_INCDIR, [variable=includedir], [QtGui >= 4.3])
- QT_GUI_CFLAGS="$QT_GUI_CFLAGS -I$pkg_cv_QT_INCDIR/../Qt"
-
- AC_SUBST(QT_GUI_CFLAGS)
- AC_SUBST(QT_GUI_LIBS)
- AC_SUBST(QT_QTEST_CFLAGS)
- AC_SUBST(QT_QTEST_LIBS)
-
- _PKG_CONFIG(QT_MOC, [variable=moc_location], [QtGui >= 4.3])
- QT_MOC=$pkg_cv_QT_MOC
- AC_SUBST(QT_MOC)
-fi
-AM_CONDITIONAL(QT, [test "x$QT" = xyes])
-
-AC_OUTPUT([
-Makefile
-src/Makefile
-tests/Makefile
-tests/linebreaking/Makefile
-tests/shaping/Makefile
-])
diff --git a/src/3rdparty/harfbuzz/qt_attribution.json b/src/3rdparty/harfbuzz/qt_attribution.json
deleted file mode 100644
index 986171fb7b..0000000000
--- a/src/3rdparty/harfbuzz/qt_attribution.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "Id": "harfbuzz",
- "Name": "HarfBuzz",
- "QDocModule": "qtgui",
- "QtUsage": "Optionally used in Qt GUI. Configure with -system-harfbuzz to force the use of the system library, or -no-harfbuzz to disable the use of HarfBuzz entirely.",
-
- "License": "MIT License",
- "LicenseId": "MIT",
- "LicenseFile": "COPYING",
- "Copyright": "Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies)
-Copyright © 2006 Behdad Esfahbod
-Copyright © 2005 David Turner
-Copyright © 2004,2007,2008,2009,2010 Red Hat, Inc.
-Copyright © 1998-2004 David Turner and Werner Lemberg"
-}
diff --git a/src/3rdparty/harfbuzz/src/.gitignore b/src/3rdparty/harfbuzz/src/.gitignore
deleted file mode 100644
index 74de98b140..0000000000
--- a/src/3rdparty/harfbuzz/src/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-*.o
-*.lo
-Makefile
-*.la
-.deps
-.libs
-*~
diff --git a/src/3rdparty/harfbuzz/src/Makefile.am b/src/3rdparty/harfbuzz/src/Makefile.am
deleted file mode 100644
index 51d06525da..0000000000
--- a/src/3rdparty/harfbuzz/src/Makefile.am
+++ /dev/null
@@ -1,69 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-noinst_LTLIBRARIES = libharfbuzz-1.la
-
-MAINSOURCES = \
- harfbuzz-buffer.c \
- harfbuzz-stream.c \
- harfbuzz-dump.c \
- harfbuzz-gdef.c \
- harfbuzz-gpos.c \
- harfbuzz-gsub.c \
- harfbuzz-impl.c \
- harfbuzz-open.c \
- harfbuzz-shaper.cpp \
- harfbuzz-greek.c \
- harfbuzz-tibetan.c \
- harfbuzz-khmer.c \
- harfbuzz-indic.cpp \
- harfbuzz-hebrew.c \
- harfbuzz-arabic.c \
- harfbuzz-hangul.c \
- harfbuzz-myanmar.c \
- harfbuzz-thai.c
-
-EXTRA_SOURCES = harfbuzz.c
-
-PUBLICHEADERS = \
- harfbuzz.h \
- harfbuzz-buffer.h \
- harfbuzz-dump.h \
- harfbuzz-gdef.h \
- harfbuzz-gpos.h \
- harfbuzz-gsub.h \
- harfbuzz-open.h \
- harfbuzz-global.h \
- harfbuzz-external.h \
- harfbuzz-shaper.h \
- harfbuzz-stream.h
-
-PRIVATEHEADERS = \
- harfbuzz-impl.h \
- harfbuzz-buffer-private.h \
- harfbuzz-stream-private.h \
- harfbuzz-gdef-private.h \
- harfbuzz-gpos-private.h \
- harfbuzz-gsub-private.h \
- harfbuzz-open-private.h \
- harfbuzz-shaper-private.h
-
-libharfbuzz_1_la_SOURCES = \
- $(MAINSOURCES) \
- $(PUBLICHEADERS) \
- $(PRIVATEHEADERS)
-
-#noinst_PROGRAMS = harfbuzz-dump
-#
-#harfbuzz_dump_SOURCES = \
-# harfbuzz-dump-main.c
-#
-#harfbuzz_dump_LDADD = \
-# libharfbuzz-1.la
-
-EXTRA_DIST = \
- README \
- COPYING.FTL \
- COPYING.GPL \
- COPYING \
- $(EXTRA_SOURCES)
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-arabic.c b/src/3rdparty/harfbuzz/src/harfbuzz-arabic.c
deleted file mode 100644
index 966537ffa0..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-arabic.c
+++ /dev/null
@@ -1,1153 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-
-static const HB_UChar16 ReplacementCharacter = 0xfffd;
-
-typedef struct {
- unsigned char shape;
- unsigned char justification;
-} HB_ArabicProperties;
-
-typedef enum {
- XIsolated,
- XFinal,
- XInitial,
- XMedial,
- /* intermediate state */
- XCausing
-} ArabicShape;
-
-/*
-// these groups correspond to the groups defined in the Unicode standard.
-// Some of these groups are equal with regards to both joining and line breaking behaviour,
-// and thus have the same enum value
-//
-// I'm not sure the mapping of syriac to arabic enums is correct with regards to justification, but as
-// I couldn't find any better document I'll hope for the best.
-*/
-typedef enum {
- /* NonJoining */
- ArabicNone,
- ArabicSpace,
- /* Transparent */
- Transparent,
- /* Causing */
- Center,
- Kashida,
-
- /* Arabic */
- /* Dual */
- Beh,
- Noon,
- Nya = Noon,
- Meem = Noon,
- Heh = Noon,
- KnottedHeh = Noon,
- HehGoal = Noon,
- SwashKaf = Noon,
- Yeh,
- FarsiYeh = Yeh,
- Hah,
- Seen,
- Sad = Seen,
- Tah,
- Kaf = Tah,
- Gaf = Tah,
- Lam = Tah,
- Ain,
- Feh = Ain,
- Qaf = Ain,
- /* Right */
- Alef,
- Waw,
- Dal,
- TehMarbuta = Dal,
- Reh,
- TehMarbutaGoal,
- HamzaOnHehGoal = TehMarbutaGoal, /* has been retained as a property value alias */
- YehWithTail = TehMarbutaGoal,
- YehBarree = TehMarbutaGoal,
-
- /* Syriac */
- /* Dual */
- Beth = Beh,
- Gamal = Ain,
- Heth = Noon,
- Teth = Hah,
- Yudh = Noon,
- Khaph = Noon,
- Lamadh = Lam,
- Mim = Noon,
- Nun = Noon,
- Semkath = Noon,
- FinalSemkath = Noon,
- SyriacE = Ain,
- Pe = Ain,
- ReversedPe = Hah,
- Qaph = Noon,
- Shin = Noon,
- Fe = Ain,
-
- /* Right */
- Alaph = Alef,
- DalathRish = Dal,
- He = Dal,
- SyriacWaw = Waw,
- Zhain = Alef,
- YudhHe = Waw,
- Sadhe = TehMarbutaGoal,
- Taw = Dal,
-
- /* Compiler bug? Otherwise ArabicGroupsEnd would be equal to Dal + 1. */
- Dummy = TehMarbutaGoal,
- ArabicGroupsEnd
-} ArabicGroup;
-
-static const unsigned char arabic_group[0x150] = {
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-
- Transparent, Transparent, Transparent, Transparent,
- Transparent, Transparent, Transparent, Transparent,
- Transparent, Transparent, Transparent, ArabicNone,
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-
- Yeh, ArabicNone, Alef, Alef,
- Waw, Alef, Yeh, Alef,
- Beh, TehMarbuta, Beh, Beh,
- Hah, Hah, Hah, Dal,
-
- Dal, Reh, Reh, Seen,
- Seen, Sad, Sad, Tah,
- Tah, Ain, Ain, Gaf,
- Gaf, FarsiYeh, FarsiYeh, FarsiYeh,
-
- /* 0x640 */
- Kashida, Feh, Qaf, Kaf,
- Lam, Meem, Noon, Heh,
- Waw, Yeh, Yeh, Transparent,
- Transparent, Transparent, Transparent, Transparent,
-
- Transparent, Transparent, Transparent, Transparent,
- Transparent, Transparent, Transparent, Transparent,
- Transparent, Transparent, Transparent, Transparent,
- Transparent, Transparent, Transparent, Transparent,
-
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
- ArabicNone, ArabicNone, Beh, Qaf,
-
- Transparent, Alef, Alef, Alef,
- ArabicNone, Alef, Waw, Waw,
- Yeh, Beh, Beh, Beh,
- Beh, Beh, Beh, Beh,
-
- /* 0x680 */
- Beh, Hah, Hah, Hah,
- Hah, Hah, Hah, Hah,
- Dal, Dal, Dal, Dal,
- Dal, Dal, Dal, Dal,
-
- Dal, Reh, Reh, Reh,
- Reh, Reh, Reh, Reh,
- Reh, Reh, Seen, Seen,
- Seen, Sad, Sad, Tah,
-
- Ain, Feh, Feh, Feh,
- Feh, Feh, Feh, Qaf,
- Qaf, Gaf, SwashKaf, Gaf,
- Kaf, Kaf, Kaf, Gaf,
-
- Gaf, Gaf, Gaf, Gaf,
- Gaf, Lam, Lam, Lam,
- Lam, Noon, Noon, Noon,
- Noon, Nya, KnottedHeh, Hah,
-
- /* 0x6c0 */
- TehMarbuta, HehGoal, HehGoal, TehMarbutaGoal,
- Waw, Waw, Waw, Waw,
- Waw, Waw, Waw, Waw,
- FarsiYeh, YehWithTail, FarsiYeh, Waw,
-
- Yeh, Yeh, YehBarree, YehBarree,
- ArabicNone, TehMarbuta, Transparent, Transparent,
- Transparent, Transparent, Transparent, Transparent,
- Transparent, ArabicNone, ArabicNone, Transparent,
-
- Transparent, Transparent, Transparent, Transparent,
- Transparent, ArabicNone, ArabicNone, Transparent,
- Transparent, ArabicNone, Transparent, Transparent,
- Transparent, Transparent, Dal, Reh,
-
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
- ArabicNone, ArabicNone, Seen, Sad,
- Ain, ArabicNone, ArabicNone, KnottedHeh,
-
- /* 0x700 */
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
- ArabicNone, ArabicNone, ArabicNone, ArabicNone,
- ArabicNone, ArabicNone, ArabicNone, Transparent,
-
- Alaph, Transparent, Beth, Gamal,
- Gamal, DalathRish, DalathRish, He,
- SyriacWaw, Zhain, Heth, Teth,
- Teth, Yudh, YudhHe, Khaph,
-
- Lamadh, Mim, Nun, Semkath,
- FinalSemkath, SyriacE, Pe, ReversedPe,
- Sadhe, Qaph, DalathRish, Shin,
- Taw, Beth, Gamal, DalathRish,
-
- Transparent, Transparent, Transparent, Transparent,
- Transparent, Transparent, Transparent, Transparent,
- Transparent, Transparent, Transparent, Transparent,
- Transparent, Transparent, Transparent, Transparent,
-
- Transparent, Transparent, Transparent, Transparent,
- Transparent, Transparent, Transparent, Transparent,
- Transparent, Transparent, Transparent, ArabicNone,
- ArabicNone, Zhain, Khaph, Fe,
-};
-
-static ArabicGroup arabicGroup(unsigned short uc)
-{
- if (uc >= 0x0600 && uc < 0x750)
- return (ArabicGroup) arabic_group[uc-0x600];
- else if (uc == 0x200d)
- return Center;
- else if (HB_GetUnicodeCharCategory(uc) == HB_Separator_Space)
- return ArabicSpace;
- else
- return ArabicNone;
-}
-
-
-/*
- Arabic shaping obeys a number of rules according to the joining classes (see Unicode book, section on
- arabic).
-
- Each unicode char has a joining class (right, dual (left&right), center (joincausing) or transparent).
- transparent joining is not encoded in HB_UChar16::joining(), but applies to all combining marks and format marks.
-
- Right join-causing: dual + center
- Left join-causing: dual + right + center
-
- Rules are as follows (for a string already in visual order, as we have it here):
-
- R1 Transparent characters do not affect joining behaviour.
- R2 A right joining character, that has a right join-causing char on the right will get form XRight
- (R3 A left joining character, that has a left join-causing char on the left will get form XLeft)
- Note: the above rule is meaningless, as there are no pure left joining characters defined in Unicode
- R4 A dual joining character, that has a left join-causing char on the left and a right join-causing char on
- the right will get form XMedial
- R5 A dual joining character, that has a right join causing char on the right, and no left join causing char on the left
- will get form XRight
- R6 A dual joining character, that has a left join causing char on the left, and no right join causing char on the right
- will get form XLeft
- R7 Otherwise the character will get form XIsolated
-
- Additionally we have to do the minimal ligature support for lam-alef ligatures:
-
- L1 Transparent characters do not affect ligature behaviour.
- L2 Any sequence of Alef(XRight) + Lam(XMedial) will form the ligature Alef.Lam(XLeft)
- L3 Any sequence of Alef(XRight) + Lam(XLeft) will form the ligature Alef.Lam(XIsolated)
-
- The state table below handles rules R1-R7.
-*/
-
-typedef enum {
- JNone,
- JCausing,
- JDual,
- JRight,
- JTransparent
-} Joining;
-
-static const Joining joining_for_group[ArabicGroupsEnd] = {
- /* NonJoining */
- JNone, /* ArabicNone */
- JNone, /* ArabicSpace */
- /* Transparent */
- JTransparent, /* Transparent */
- /* Causing */
- JCausing, /* Center */
- JCausing, /* Kashida */
- /* Dual */
- JDual, /* Beh */
- JDual, /* Noon */
- JDual, /* Yeh */
- JDual, /* Hah */
- JDual, /* Seen */
- JDual, /* Tah */
- JDual, /* Ain */
- /* Right */
- JRight, /* Alef */
- JRight, /* Waw */
- JRight, /* Dal */
- JRight, /* Reh */
- JRight /* TehMarbutaGoal */
-};
-
-
-typedef struct {
- ArabicShape form1;
- ArabicShape form2;
-} JoiningPair;
-
-static const JoiningPair joining_table[5][4] =
-/* None, Causing, Dual, Right */
-{
- { { XIsolated, XIsolated }, { XIsolated, XCausing }, { XIsolated, XInitial }, { XIsolated, XIsolated } }, /* XIsolated */
- { { XFinal, XIsolated }, { XFinal, XCausing }, { XFinal, XInitial }, { XFinal, XIsolated } }, /* XFinal */
- { { XIsolated, XIsolated }, { XInitial, XCausing }, { XInitial, XMedial }, { XInitial, XFinal } }, /* XInitial */
- { { XFinal, XIsolated }, { XMedial, XCausing }, { XMedial, XMedial }, { XMedial, XFinal } }, /* XMedial */
- { { XIsolated, XIsolated }, { XIsolated, XCausing }, { XIsolated, XMedial }, { XIsolated, XFinal } }, /* XCausing */
-};
-
-
-/*
-According to http://www.microsoft.com/middleeast/Arabicdev/IE6/KBase.asp
-
-1. Find the priority of the connecting opportunities in each word
-2. Add expansion at the highest priority connection opportunity
-3. If more than one connection opportunity have the same highest value,
- use the opportunity closest to the end of the word.
-
-Following is a chart that provides the priority for connection
-opportunities and where expansion occurs. The character group names
-are those in table 6.6 of the UNICODE 2.0 book.
-
-
-PrioritY Glyph Condition Kashida Location
-
-Arabic_Kashida User inserted Kashida The user entered a Kashida in a position. After the user
- (Shift+j or Shift+[E with hat]) Thus, it is the highest priority to insert an inserted kashida
- automatic kashida.
-
-Arabic_Seen Seen, Sad Connecting to the next character. After the character.
- (Initial or medial form).
-
-Arabic_HaaDal Teh Marbutah, Haa, Dal Connecting to previous character. Before the final form
- of these characters.
-
-Arabic_Alef Alef, Tah, Lam, Connecting to previous character. Before the final form
- Kaf and Gaf of these characters.
-
-Arabic_BaRa Reh, Yeh Connected to medial Beh Before preceding medial Baa
-
-Arabic_Waw Waw, Ain, Qaf, Feh Connecting to previous character. Before the final form of
- these characters.
-
-Arabic_Normal Other connecting Connecting to previous character. Before the final form
- characters of these characters.
-
-
-
-This seems to imply that we have at most one kashida point per arabic word.
-
-*/
-
-static void getArabicProperties(const unsigned short *chars, int len, HB_ArabicProperties *properties)
-{
-/* qDebug("arabicSyriacOpenTypeShape: properties:"); */
- int lastPos = 0;
- int lastGroup = ArabicNone;
- int i = 0;
-
- ArabicGroup group = arabicGroup(chars[0]);
- Joining j = joining_for_group[group];
- ArabicShape shape = joining_table[XIsolated][j].form2;
- properties[0].justification = HB_NoJustification;
-
- for (i = 1; i < len; ++i) {
- /* #### fix handling for spaces and punktuation */
- properties[i].justification = HB_NoJustification;
-
- group = arabicGroup(chars[i]);
- j = joining_for_group[group];
-
- if (j == JTransparent) {
- properties[i].shape = XIsolated;
- continue;
- }
-
- properties[lastPos].shape = joining_table[shape][j].form1;
- shape = joining_table[shape][j].form2;
-
- switch(lastGroup) {
- case Seen:
- if (properties[lastPos].shape == XInitial || properties[lastPos].shape == XMedial)
- properties[i-1].justification = HB_Arabic_Seen;
- break;
- case Hah:
- if (properties[lastPos].shape == XFinal)
- properties[lastPos-1].justification = HB_Arabic_HaaDal;
- break;
- case Alef:
- if (properties[lastPos].shape == XFinal)
- properties[lastPos-1].justification = HB_Arabic_Alef;
- break;
- case Ain:
- if (properties[lastPos].shape == XFinal)
- properties[lastPos-1].justification = HB_Arabic_Waw;
- break;
- case Noon:
- if (properties[lastPos].shape == XFinal)
- properties[lastPos-1].justification = HB_Arabic_Normal;
- break;
- case ArabicNone:
- break;
-
- default:
- assert(FALSE);
- }
-
- lastGroup = ArabicNone;
-
- switch(group) {
- case ArabicNone:
- case Transparent:
- /* ### Center should probably be treated as transparent when it comes to justification. */
- case Center:
- break;
- case ArabicSpace:
- properties[i].justification = HB_Arabic_Space;
- break;
- case Kashida:
- properties[i].justification = HB_Arabic_Kashida;
- break;
- case Seen:
- lastGroup = Seen;
- break;
-
- case Hah:
- case Dal:
- lastGroup = Hah;
- break;
-
- case Alef:
- case Tah:
- lastGroup = Alef;
- break;
-
- case Yeh:
- case Reh:
- if (properties[lastPos].shape == XMedial && arabicGroup(chars[lastPos]) == Beh)
- properties[lastPos-1].justification = HB_Arabic_BaRa;
- break;
-
- case Ain:
- case Waw:
- lastGroup = Ain;
- break;
-
- case Noon:
- case Beh:
- case TehMarbutaGoal:
- lastGroup = Noon;
- break;
- case ArabicGroupsEnd:
- assert(FALSE);
- }
-
- lastPos = i;
- }
- properties[lastPos].shape = joining_table[shape][JNone].form1;
-
-
- /*
- for (int i = 0; i < len; ++i)
- qDebug("arabic properties(%d): uc=%x shape=%d, justification=%d", i, chars[i], properties[i].shape, properties[i].justification);
- */
-}
-
-static Joining getNkoJoining(unsigned short uc)
-{
- if (uc < 0x7ca)
- return JNone;
- if (uc <= 0x7ea)
- return JDual;
- if (uc <= 0x7f3)
- return JTransparent;
- if (uc <= 0x7f9)
- return JNone;
- if (uc == 0x7fa)
- return JCausing;
- return JNone;
-}
-
-static void getNkoProperties(const unsigned short *chars, int len, HB_ArabicProperties *properties)
-{
- int lastPos = 0;
- int i = 0;
-
- Joining j = getNkoJoining(chars[0]);
- ArabicShape shape = joining_table[XIsolated][j].form2;
- properties[0].justification = HB_NoJustification;
-
- for (i = 1; i < len; ++i) {
- properties[i].justification = (HB_GetUnicodeCharCategory(chars[i]) == HB_Separator_Space) ?
- ArabicSpace : ArabicNone;
-
- j = getNkoJoining(chars[i]);
-
- if (j == JTransparent) {
- properties[i].shape = XIsolated;
- continue;
- }
-
- properties[lastPos].shape = joining_table[shape][j].form1;
- shape = joining_table[shape][j].form2;
-
-
- lastPos = i;
- }
- properties[lastPos].shape = joining_table[shape][JNone].form1;
-
-
- /*
- for (int i = 0; i < len; ++i)
- qDebug("nko properties(%d): uc=%x shape=%d, justification=%d", i, chars[i], properties[i].shape, properties[i].justification);
- */
-}
-
-/*
-// The unicode to unicode shaping codec.
-// does only presentation forms B at the moment, but that should be enough for
-// simple display
-*/
-static const hb_uint16 arabicUnicodeMapping[256][2] = {
- /* base of shaped forms, and number-1 of them (0 for non shaping,
- 1 for right binding and 3 for dual binding */
-
- /* These are just the glyphs available in Unicode,
- some characters are in R class, but have no glyphs in Unicode. */
-
- { 0x0600, 0 }, /* 0x0600 */
- { 0x0601, 0 }, /* 0x0601 */
- { 0x0602, 0 }, /* 0x0602 */
- { 0x0603, 0 }, /* 0x0603 */
- { 0x0604, 0 }, /* 0x0604 */
- { 0x0605, 0 }, /* 0x0605 */
- { 0x0606, 0 }, /* 0x0606 */
- { 0x0607, 0 }, /* 0x0607 */
- { 0x0608, 0 }, /* 0x0608 */
- { 0x0609, 0 }, /* 0x0609 */
- { 0x060A, 0 }, /* 0x060A */
- { 0x060B, 0 }, /* 0x060B */
- { 0x060C, 0 }, /* 0x060C */
- { 0x060D, 0 }, /* 0x060D */
- { 0x060E, 0 }, /* 0x060E */
- { 0x060F, 0 }, /* 0x060F */
-
- { 0x0610, 0 }, /* 0x0610 */
- { 0x0611, 0 }, /* 0x0611 */
- { 0x0612, 0 }, /* 0x0612 */
- { 0x0613, 0 }, /* 0x0613 */
- { 0x0614, 0 }, /* 0x0614 */
- { 0x0615, 0 }, /* 0x0615 */
- { 0x0616, 0 }, /* 0x0616 */
- { 0x0617, 0 }, /* 0x0617 */
- { 0x0618, 0 }, /* 0x0618 */
- { 0x0619, 0 }, /* 0x0619 */
- { 0x061A, 0 }, /* 0x061A */
- { 0x061B, 0 }, /* 0x061B */
- { 0x061C, 0 }, /* 0x061C */
- { 0x061D, 0 }, /* 0x061D */
- { 0x061E, 0 }, /* 0x061E */
- { 0x061F, 0 }, /* 0x061F */
-
- { 0x0620, 0 }, /* 0x0620 */
- { 0xFE80, 0 }, /* 0x0621 HAMZA */
- { 0xFE81, 1 }, /* 0x0622 R ALEF WITH MADDA ABOVE */
- { 0xFE83, 1 }, /* 0x0623 R ALEF WITH HAMZA ABOVE */
- { 0xFE85, 1 }, /* 0x0624 R WAW WITH HAMZA ABOVE */
- { 0xFE87, 1 }, /* 0x0625 R ALEF WITH HAMZA BELOW */
- { 0xFE89, 3 }, /* 0x0626 D YEH WITH HAMZA ABOVE */
- { 0xFE8D, 1 }, /* 0x0627 R ALEF */
- { 0xFE8F, 3 }, /* 0x0628 D BEH */
- { 0xFE93, 1 }, /* 0x0629 R TEH MARBUTA */
- { 0xFE95, 3 }, /* 0x062A D TEH */
- { 0xFE99, 3 }, /* 0x062B D THEH */
- { 0xFE9D, 3 }, /* 0x062C D JEEM */
- { 0xFEA1, 3 }, /* 0x062D D HAH */
- { 0xFEA5, 3 }, /* 0x062E D KHAH */
- { 0xFEA9, 1 }, /* 0x062F R DAL */
-
- { 0xFEAB, 1 }, /* 0x0630 R THAL */
- { 0xFEAD, 1 }, /* 0x0631 R REH */
- { 0xFEAF, 1 }, /* 0x0632 R ZHAIN */
- { 0xFEB1, 3 }, /* 0x0633 D SEEN */
- { 0xFEB5, 3 }, /* 0x0634 D SHEEN */
- { 0xFEB9, 3 }, /* 0x0635 D SAD */
- { 0xFEBD, 3 }, /* 0x0636 D DAD */
- { 0xFEC1, 3 }, /* 0x0637 D TAH */
- { 0xFEC5, 3 }, /* 0x0638 D ZAH */
- { 0xFEC9, 3 }, /* 0x0639 D AIN */
- { 0xFECD, 3 }, /* 0x063A D GHAIN */
- { 0x063B, 0 }, /* 0x063B */
- { 0x063C, 0 }, /* 0x063C */
- { 0x063D, 0 }, /* 0x063D */
- { 0x063E, 0 }, /* 0x063E */
- { 0x063F, 0 }, /* 0x063F */
-
- { 0x0640, 0 }, /* 0x0640 C TATWEEL // ### Join Causing, only one glyph */
- { 0xFED1, 3 }, /* 0x0641 D FEH */
- { 0xFED5, 3 }, /* 0x0642 D QAF */
- { 0xFED9, 3 }, /* 0x0643 D KAF */
- { 0xFEDD, 3 }, /* 0x0644 D LAM */
- { 0xFEE1, 3 }, /* 0x0645 D MEEM */
- { 0xFEE5, 3 }, /* 0x0646 D NOON */
- { 0xFEE9, 3 }, /* 0x0647 D HEH */
- { 0xFEED, 1 }, /* 0x0648 R WAW */
- { 0x0649, 3 }, /* 0x0649 ALEF MAKSURA // ### Dual, glyphs not consecutive, handle in code. */
- { 0xFEF1, 3 }, /* 0x064A D YEH */
- { 0x064B, 0 }, /* 0x064B */
- { 0x064C, 0 }, /* 0x064C */
- { 0x064D, 0 }, /* 0x064D */
- { 0x064E, 0 }, /* 0x064E */
- { 0x064F, 0 }, /* 0x064F */
-
- { 0x0650, 0 }, /* 0x0650 */
- { 0x0651, 0 }, /* 0x0651 */
- { 0x0652, 0 }, /* 0x0652 */
- { 0x0653, 0 }, /* 0x0653 */
- { 0x0654, 0 }, /* 0x0654 */
- { 0x0655, 0 }, /* 0x0655 */
- { 0x0656, 0 }, /* 0x0656 */
- { 0x0657, 0 }, /* 0x0657 */
- { 0x0658, 0 }, /* 0x0658 */
- { 0x0659, 0 }, /* 0x0659 */
- { 0x065A, 0 }, /* 0x065A */
- { 0x065B, 0 }, /* 0x065B */
- { 0x065C, 0 }, /* 0x065C */
- { 0x065D, 0 }, /* 0x065D */
- { 0x065E, 0 }, /* 0x065E */
- { 0x065F, 0 }, /* 0x065F */
-
- { 0x0660, 0 }, /* 0x0660 */
- { 0x0661, 0 }, /* 0x0661 */
- { 0x0662, 0 }, /* 0x0662 */
- { 0x0663, 0 }, /* 0x0663 */
- { 0x0664, 0 }, /* 0x0664 */
- { 0x0665, 0 }, /* 0x0665 */
- { 0x0666, 0 }, /* 0x0666 */
- { 0x0667, 0 }, /* 0x0667 */
- { 0x0668, 0 }, /* 0x0668 */
- { 0x0669, 0 }, /* 0x0669 */
- { 0x066A, 0 }, /* 0x066A */
- { 0x066B, 0 }, /* 0x066B */
- { 0x066C, 0 }, /* 0x066C */
- { 0x066D, 0 }, /* 0x066D */
- { 0x066E, 0 }, /* 0x066E */
- { 0x066F, 0 }, /* 0x066F */
-
- { 0x0670, 0 }, /* 0x0670 */
- { 0xFB50, 1 }, /* 0x0671 R ALEF WASLA */
- { 0x0672, 0 }, /* 0x0672 */
- { 0x0673, 0 }, /* 0x0673 */
- { 0x0674, 0 }, /* 0x0674 */
- { 0x0675, 0 }, /* 0x0675 */
- { 0x0676, 0 }, /* 0x0676 */
- { 0x0677, 0 }, /* 0x0677 */
- { 0x0678, 0 }, /* 0x0678 */
- { 0xFB66, 3 }, /* 0x0679 D TTEH */
- { 0xFB5E, 3 }, /* 0x067A D TTEHEH */
- { 0xFB52, 3 }, /* 0x067B D BEEH */
- { 0x067C, 0 }, /* 0x067C */
- { 0x067D, 0 }, /* 0x067D */
- { 0xFB56, 3 }, /* 0x067E D PEH */
- { 0xFB62, 3 }, /* 0x067F D TEHEH */
-
- { 0xFB5A, 3 }, /* 0x0680 D BEHEH */
- { 0x0681, 0 }, /* 0x0681 */
- { 0x0682, 0 }, /* 0x0682 */
- { 0xFB76, 3 }, /* 0x0683 D NYEH */
- { 0xFB72, 3 }, /* 0x0684 D DYEH */
- { 0x0685, 0 }, /* 0x0685 */
- { 0xFB7A, 3 }, /* 0x0686 D TCHEH */
- { 0xFB7E, 3 }, /* 0x0687 D TCHEHEH */
- { 0xFB88, 1 }, /* 0x0688 R DDAL */
- { 0x0689, 0 }, /* 0x0689 */
- { 0x068A, 0 }, /* 0x068A */
- { 0x068B, 0 }, /* 0x068B */
- { 0xFB84, 1 }, /* 0x068C R DAHAL */
- { 0xFB82, 1 }, /* 0x068D R DDAHAL */
- { 0xFB86, 1 }, /* 0x068E R DUL */
- { 0x068F, 0 }, /* 0x068F */
-
- { 0x0690, 0 }, /* 0x0690 */
- { 0xFB8C, 1 }, /* 0x0691 R RREH */
- { 0x0692, 0 }, /* 0x0692 */
- { 0x0693, 0 }, /* 0x0693 */
- { 0x0694, 0 }, /* 0x0694 */
- { 0x0695, 0 }, /* 0x0695 */
- { 0x0696, 0 }, /* 0x0696 */
- { 0x0697, 0 }, /* 0x0697 */
- { 0xFB8A, 1 }, /* 0x0698 R JEH */
- { 0x0699, 0 }, /* 0x0699 */
- { 0x069A, 0 }, /* 0x069A */
- { 0x069B, 0 }, /* 0x069B */
- { 0x069C, 0 }, /* 0x069C */
- { 0x069D, 0 }, /* 0x069D */
- { 0x069E, 0 }, /* 0x069E */
- { 0x069F, 0 }, /* 0x069F */
-
- { 0x06A0, 0 }, /* 0x06A0 */
- { 0x06A1, 0 }, /* 0x06A1 */
- { 0x06A2, 0 }, /* 0x06A2 */
- { 0x06A3, 0 }, /* 0x06A3 */
- { 0xFB6A, 3 }, /* 0x06A4 D VEH */
- { 0x06A5, 0 }, /* 0x06A5 */
- { 0xFB6E, 3 }, /* 0x06A6 D PEHEH */
- { 0x06A7, 0 }, /* 0x06A7 */
- { 0x06A8, 0 }, /* 0x06A8 */
- { 0xFB8E, 3 }, /* 0x06A9 D KEHEH */
- { 0x06AA, 0 }, /* 0x06AA */
- { 0x06AB, 0 }, /* 0x06AB */
- { 0x06AC, 0 }, /* 0x06AC */
- { 0xFBD3, 3 }, /* 0x06AD D NG */
- { 0x06AE, 0 }, /* 0x06AE */
- { 0xFB92, 3 }, /* 0x06AF D GAF */
-
- { 0x06B0, 0 }, /* 0x06B0 */
- { 0xFB9A, 3 }, /* 0x06B1 D NGOEH */
- { 0x06B2, 0 }, /* 0x06B2 */
- { 0xFB96, 3 }, /* 0x06B3 D GUEH */
- { 0x06B4, 0 }, /* 0x06B4 */
- { 0x06B5, 0 }, /* 0x06B5 */
- { 0x06B6, 0 }, /* 0x06B6 */
- { 0x06B7, 0 }, /* 0x06B7 */
- { 0x06B8, 0 }, /* 0x06B8 */
- { 0x06B9, 0 }, /* 0x06B9 */
- { 0xFB9E, 1 }, /* 0x06BA R NOON GHUNNA */
- { 0xFBA0, 3 }, /* 0x06BB D RNOON */
- { 0x06BC, 0 }, /* 0x06BC */
- { 0x06BD, 0 }, /* 0x06BD */
- { 0xFBAA, 3 }, /* 0x06BE D HEH DOACHASHMEE */
- { 0x06BF, 0 }, /* 0x06BF */
-
- { 0xFBA4, 1 }, /* 0x06C0 R HEH WITH YEH ABOVE */
- { 0xFBA6, 3 }, /* 0x06C1 D HEH GOAL */
- { 0x06C2, 0 }, /* 0x06C2 */
- { 0x06C3, 0 }, /* 0x06C3 */
- { 0x06C4, 0 }, /* 0x06C4 */
- { 0xFBE0, 1 }, /* 0x06C5 R KIRGHIZ OE */
- { 0xFBD9, 1 }, /* 0x06C6 R OE */
- { 0xFBD7, 1 }, /* 0x06C7 R U */
- { 0xFBDB, 1 }, /* 0x06C8 R YU */
- { 0xFBE2, 1 }, /* 0x06C9 R KIRGHIZ YU */
- { 0x06CA, 0 }, /* 0x06CA */
- { 0xFBDE, 1 }, /* 0x06CB R VE */
- { 0xFBFC, 3 }, /* 0x06CC D FARSI YEH */
- { 0x06CD, 0 }, /* 0x06CD */
- { 0x06CE, 0 }, /* 0x06CE */
- { 0x06CF, 0 }, /* 0x06CF */
-
- { 0xFBE4, 3 }, /* 0x06D0 D E */
- { 0x06D1, 0 }, /* 0x06D1 */
- { 0xFBAE, 1 }, /* 0x06D2 R YEH BARREE */
- { 0xFBB0, 1 }, /* 0x06D3 R YEH BARREE WITH HAMZA ABOVE */
- { 0x06D4, 0 }, /* 0x06D4 */
- { 0x06D5, 0 }, /* 0x06D5 */
- { 0x06D6, 0 }, /* 0x06D6 */
- { 0x06D7, 0 }, /* 0x06D7 */
- { 0x06D8, 0 }, /* 0x06D8 */
- { 0x06D9, 0 }, /* 0x06D9 */
- { 0x06DA, 0 }, /* 0x06DA */
- { 0x06DB, 0 }, /* 0x06DB */
- { 0x06DC, 0 }, /* 0x06DC */
- { 0x06DD, 0 }, /* 0x06DD */
- { 0x06DE, 0 }, /* 0x06DE */
- { 0x06DF, 0 }, /* 0x06DF */
-
- { 0x06E0, 0 }, /* 0x06E0 */
- { 0x06E1, 0 }, /* 0x06E1 */
- { 0x06E2, 0 }, /* 0x06E2 */
- { 0x06E3, 0 }, /* 0x06E3 */
- { 0x06E4, 0 }, /* 0x06E4 */
- { 0x06E5, 0 }, /* 0x06E5 */
- { 0x06E6, 0 }, /* 0x06E6 */
- { 0x06E7, 0 }, /* 0x06E7 */
- { 0x06E8, 0 }, /* 0x06E8 */
- { 0x06E9, 0 }, /* 0x06E9 */
- { 0x06EA, 0 }, /* 0x06EA */
- { 0x06EB, 0 }, /* 0x06EB */
- { 0x06EC, 0 }, /* 0x06EC */
- { 0x06ED, 0 }, /* 0x06ED */
- { 0x06EE, 0 }, /* 0x06EE */
- { 0x06EF, 0 }, /* 0x06EF */
-
- { 0x06F0, 0 }, /* 0x06F0 */
- { 0x06F1, 0 }, /* 0x06F1 */
- { 0x06F2, 0 }, /* 0x06F2 */
- { 0x06F3, 0 }, /* 0x06F3 */
- { 0x06F4, 0 }, /* 0x06F4 */
- { 0x06F5, 0 }, /* 0x06F5 */
- { 0x06F6, 0 }, /* 0x06F6 */
- { 0x06F7, 0 }, /* 0x06F7 */
- { 0x06F8, 0 }, /* 0x06F8 */
- { 0x06F9, 0 }, /* 0x06F9 */
- { 0x06FA, 0 }, /* 0x06FA */
- { 0x06FB, 0 }, /* 0x06FB */
- { 0x06FC, 0 }, /* 0x06FC */
- { 0x06FD, 0 }, /* 0x06FD */
- { 0x06FE, 0 }, /* 0x06FE */
- { 0x06FF, 0 } /* 0x06FF */
-};
-
-/* the arabicUnicodeMapping does not work for U+0649 ALEF MAKSURA, this table does */
-static const hb_uint16 alefMaksura[4] = {0xFEEF, 0xFEF0, 0xFBE8, 0xFBE9};
-
-/*
-// this is a bit tricky. Alef always binds to the right, so the second parameter descibing the shape
-// of the lam can be either initial of medial. So initial maps to the isolated form of the ligature,
-// medial to the final form
-*/
-static const hb_uint16 arabicUnicodeLamAlefMapping[6][4] = {
- { 0xfffd, 0xfffd, 0xfef5, 0xfef6 }, /* 0x622 R Alef with Madda above */
- { 0xfffd, 0xfffd, 0xfef7, 0xfef8 }, /* 0x623 R Alef with Hamza above */
- { 0xfffd, 0xfffd, 0xfffd, 0xfffd }, /* 0x624 // Just to fill the table ;-) */
- { 0xfffd, 0xfffd, 0xfef9, 0xfefa }, /* 0x625 R Alef with Hamza below */
- { 0xfffd, 0xfffd, 0xfffd, 0xfffd }, /* 0x626 // Just to fill the table ;-) */
- { 0xfffd, 0xfffd, 0xfefb, 0xfefc } /* 0x627 R Alef */
-};
-
-static int getShape(hb_uint8 cell, int shape)
-{
- /* the arabicUnicodeMapping does not work for U+0649 ALEF MAKSURA, handle this here */
- int ch = (cell != 0x49)
- ? (shape ? arabicUnicodeMapping[cell][0] + shape : 0x600+cell)
- : alefMaksura[shape] ;
- return ch;
-}
-
-
-/*
- Two small helper functions for arabic shaping.
-*/
-static HB_UChar16 prevChar(const HB_UChar16 *str, int pos)
-{
- /*qDebug("leftChar: pos=%d", pos); */
- const HB_UChar16 *ch = str + pos - 1;
- pos--;
- while(pos > -1) {
- if(HB_GetUnicodeCharCategory(*ch) != HB_Mark_NonSpacing)
- return *ch;
- pos--;
- ch--;
- }
- return ReplacementCharacter;
-}
-
-static HB_UChar16 nextChar(const HB_UChar16 *str, hb_uint32 len, hb_uint32 pos)
-{
- const HB_UChar16 *ch = str + pos + 1;
- pos++;
- while(pos < len) {
- /*qDebug("rightChar: %d isLetter=%d, joining=%d", pos, ch.isLetter(), ch.joining()); */
- if(HB_GetUnicodeCharCategory(*ch) != HB_Mark_NonSpacing)
- return *ch;
- /* assume it's a transparent char, this might not be 100% correct */
- pos++;
- ch++;
- }
- return ReplacementCharacter;
-}
-
-static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32 from, hb_uint32 len, HB_UChar16 *shapeBuffer, int *shapedLength,
- HB_Bool reverse, HB_GlyphAttributes *attributes, unsigned short *logClusters)
-{
- HB_ArabicProperties *properties;
- hb_int32 f = from;
- hb_uint32 l = len;
- const HB_UChar16 *ch;
- HB_UChar16 *data;
- int clusterStart;
- hb_uint32 i;
- HB_STACKARRAY(HB_ArabicProperties, props, len + 2);
- properties = props;
-
- assert(stringLength >= from + len);
-
- if(len == 0) {
- *shapedLength = 0;
- return;
- }
-
- if (from > 0) {
- --f;
- ++l;
- ++properties;
- }
- if (f + l < stringLength)
- ++l;
- getArabicProperties(uc+f, l, props);
-
- ch = uc + from;
- data = shapeBuffer;
- clusterStart = 0;
-
- for (i = 0; i < len; i++) {
- hb_uint8 r = *ch >> 8;
- const int gpos = int(data - shapeBuffer);
-
- if (r != 0x06) {
- if (r == 0x20) {
- if (*ch == 0x200c || *ch == 0x200d)
- /* remove ZWJ and ZWNJ */
- goto skip;
- }
- if (reverse)
- *data = HB_GetMirroredChar(*ch);
- else
- *data = *ch;
- } else {
- hb_uint8 c = *ch & 0xff;
- int pos = i + from;
- int shape = properties[i].shape;
-/* qDebug("mapping U+%x to shape %d glyph=0x%x", ch->unicode(), shape, getShape(c, shape)); */
- /* take care of lam-alef ligatures (lam right of alef) */
- hb_uint16 map;
- switch (c) {
- case 0x44: { /* lam */
- const HB_UChar16 pch = nextChar(uc, stringLength, pos);
- if ((pch >> 8) == 0x06) {
- switch (pch & 0xff) {
- case 0x22:
- case 0x23:
- case 0x25:
- case 0x27:
-/* qDebug(" lam of lam-alef ligature"); */
- map = arabicUnicodeLamAlefMapping[(pch & 0xff) - 0x22][shape];
- goto next;
- default:
- break;
- }
- }
- break;
- }
- case 0x22: /* alef with madda */
- case 0x23: /* alef with hamza above */
- case 0x25: /* alef with hamza below */
- case 0x27: /* alef */
- if (prevChar(uc, pos) == 0x0644) {
- /* have a lam alef ligature */
- /*qDebug(" alef of lam-alef ligature"); */
- goto skip;
- }
- default:
- break;
- }
- map = getShape(c, shape);
- next:
- *data = map;
- }
- /* ##### Fixme */
- /*glyphs[gpos].attributes.zeroWidth = zeroWidth; */
- if (HB_GetUnicodeCharCategory(*ch) == HB_Mark_NonSpacing) {
- attributes[gpos].mark = TRUE;
-/* qDebug("glyph %d (char %d) is mark!", gpos, i); */
- } else {
- attributes[gpos].mark = FALSE;
- clusterStart = int(data - shapeBuffer);
- }
- attributes[gpos].clusterStart = !attributes[gpos].mark;
- attributes[gpos].combiningClass = HB_GetUnicodeCharCombiningClass(*ch);
- attributes[gpos].justification = properties[i].justification;
-/* qDebug("data[%d] = %x (from %x)", gpos, (uint)data->unicode(), ch->unicode());*/
- data++;
- skip:
- ch++;
- logClusters[i] = clusterStart;
- }
- *shapedLength = int(data - shapeBuffer);
-
- HB_FREE_STACKARRAY(props);
-}
-
-#ifndef NO_OPENTYPE
-
-static const HB_OpenTypeFeature arabic_features[] = {
- { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
- { HB_MAKE_TAG('i', 's', 'o', 'l'), IsolProperty },
- { HB_MAKE_TAG('f', 'i', 'n', 'a'), FinaProperty },
- { HB_MAKE_TAG('m', 'e', 'd', 'i'), MediProperty },
- { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty },
- { HB_MAKE_TAG('r', 'l', 'i', 'g'), RligProperty },
- { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty },
- { HB_MAKE_TAG('l', 'i', 'g', 'a'), LigaProperty },
- { HB_MAKE_TAG('d', 'l', 'i', 'g'), DligProperty },
- { HB_MAKE_TAG('c', 's', 'w', 'h'), CswhProperty },
- /* mset is used in old Win95 fonts that don't have a 'mark' positioning table. */
- { HB_MAKE_TAG('m', 's', 'e', 't'), MsetProperty },
- {0, 0}
-};
-
-static const HB_OpenTypeFeature syriac_features[] = {
- { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
- { HB_MAKE_TAG('i', 's', 'o', 'l'), IsolProperty },
- { HB_MAKE_TAG('f', 'i', 'n', 'a'), FinaProperty },
- { HB_MAKE_TAG('f', 'i', 'n', '2'), FinaProperty },
- { HB_MAKE_TAG('f', 'i', 'n', '3'), FinaProperty },
- { HB_MAKE_TAG('m', 'e', 'd', 'i'), MediProperty },
- { HB_MAKE_TAG('m', 'e', 'd', '2'), MediProperty },
- { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty },
- { HB_MAKE_TAG('r', 'l', 'i', 'g'), RligProperty },
- { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty },
- { HB_MAKE_TAG('l', 'i', 'g', 'a'), LigaProperty },
- { HB_MAKE_TAG('d', 'l', 'i', 'g'), DligProperty },
- {0, 0}
-};
-
-static HB_Bool arabicSyriacOpenTypeShape(HB_ShaperItem *item, HB_Bool *ot_ok)
-{
- const HB_UChar16 *uc;
- const int nglyphs = item->num_glyphs;
- hb_int32 f;
- hb_uint32 l;
- HB_ArabicProperties *properties;
- HB_DECLARE_STACKARRAY(HB_ArabicProperties, props)
- HB_DECLARE_STACKARRAY(hb_uint32, apply)
- HB_Bool shaped;
- int i = 0;
-
- *ot_ok = TRUE;
-
- if (!HB_ConvertStringToGlyphIndices(item))
- return FALSE;
- HB_HeuristicSetGlyphAttributes(item);
-
- HB_INIT_STACKARRAY(HB_ArabicProperties, props, item->item.length + 2);
- HB_INIT_STACKARRAY(hb_uint32, apply, item->num_glyphs);
-
- uc = item->string + item->item.pos;
-
- properties = props;
- f = 0;
- l = item->item.length;
- if (item->item.pos > 0) {
- --f;
- ++l;
- ++properties;
- }
- if (f + l + item->item.pos < item->stringLength) {
- ++l;
- }
- if (item->item.script == HB_Script_Nko)
- getNkoProperties(uc+f, l, props);
- else
- getArabicProperties(uc+f, l, props);
-
- for (i = 0; i < (int)item->num_glyphs; i++) {
- apply[i] = 0;
-
- if (properties[i].shape == XIsolated)
- apply[i] |= MediProperty|FinaProperty|InitProperty;
- else if (properties[i].shape == XMedial)
- apply[i] |= IsolProperty|FinaProperty|InitProperty;
- else if (properties[i].shape == XFinal)
- apply[i] |= IsolProperty|MediProperty|InitProperty;
- else if (properties[i].shape == XInitial)
- apply[i] |= IsolProperty|MediProperty|FinaProperty;
-
- item->attributes[i].justification = properties[i].justification;
- }
-
- HB_FREE_STACKARRAY(props);
-
- shaped = HB_OpenTypeShape(item, apply);
-
- HB_FREE_STACKARRAY(apply);
-
- if (!shaped) {
- *ot_ok = FALSE;
- return FALSE;
- }
- return HB_OpenTypePosition(item, nglyphs, /*doLogClusters*/TRUE);
-}
-
-#endif
-
-/* #### stil missing: identify invalid character combinations */
-HB_Bool HB_ArabicShape(HB_ShaperItem *item)
-{
- int slen;
- HB_Bool haveGlyphs;
- HB_STACKARRAY(HB_UChar16, shapedChars, item->item.length);
-
- assert(item->item.script == HB_Script_Arabic || item->item.script == HB_Script_Syriac
- || item->item.script == HB_Script_Nko);
-
-#ifndef NO_OPENTYPE
-
- if (HB_SelectScript(item, item->item.script == HB_Script_Arabic ? arabic_features : syriac_features)) {
- HB_Bool ot_ok;
- if (arabicSyriacOpenTypeShape(item, &ot_ok)) {
- HB_FREE_STACKARRAY(shapedChars);
- return TRUE;
- }
- if (ot_ok) {
- HB_FREE_STACKARRAY(shapedChars);
- return FALSE;
- /* fall through to the non OT code*/
- }
- }
-#endif
-
- if (item->item.script != HB_Script_Arabic) {
- HB_FREE_STACKARRAY(shapedChars);
- return HB_BasicShape(item);
- }
-
- shapedString(item->string, item->stringLength, item->item.pos, item->item.length, shapedChars, &slen,
- item->item.bidiLevel % 2,
- item->attributes, item->log_clusters);
-
- haveGlyphs = item->font->klass
- ->convertStringToGlyphIndices(item->font,
- shapedChars, slen,
- item->glyphs, &item->num_glyphs,
- item->item.bidiLevel % 2);
-
- HB_FREE_STACKARRAY(shapedChars);
-
- if (!haveGlyphs)
- return FALSE;
-
- HB_HeuristicPosition(item);
- return TRUE;
-}
-
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-buffer-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-buffer-private.h
deleted file mode 100644
index 5065f2e031..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-buffer-private.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2004,2007 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- */
-
-#ifndef HARFBUZZ_BUFFER_PRIVATE_H
-#define HARFBUZZ_BUFFER_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-buffer.h"
-
-HB_BEGIN_HEADER
-
-#define HB_GLYPH_PROPERTIES_UNKNOWN 0xFFFF
-
-HB_INTERNAL void
-_hb_buffer_swap( HB_Buffer buffer );
-
-HB_INTERNAL void
-_hb_buffer_clear_output( HB_Buffer buffer );
-
-HB_INTERNAL HB_Error
-_hb_buffer_clear_positions( HB_Buffer buffer );
-
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyphs( HB_Buffer buffer,
- HB_UShort num_in,
- HB_UShort num_out,
- HB_UShort *glyph_data,
- HB_UShort component,
- HB_UShort ligID );
-
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyph ( HB_Buffer buffer,
- HB_UInt glyph_index,
- HB_UShort component,
- HB_UShort ligID );
-
-HB_INTERNAL HB_Error
-_hb_buffer_copy_output_glyph ( HB_Buffer buffer );
-
-HB_INTERNAL HB_Error
-_hb_buffer_replace_output_glyph ( HB_Buffer buffer,
- HB_UInt glyph_index,
- HB_Bool inplace );
-
-HB_INTERNAL HB_UShort
-_hb_buffer_allocate_ligid( HB_Buffer buffer );
-
-
-/* convenience macros */
-
-#define IN_GLYPH( pos ) (buffer->in_string[(pos)].gindex)
-#define IN_ITEM( pos ) (&buffer->in_string[(pos)])
-#define IN_CURGLYPH() (buffer->in_string[buffer->in_pos].gindex)
-#define IN_CURITEM() (&buffer->in_string[buffer->in_pos])
-#define IN_PROPERTIES( pos ) (buffer->in_string[(pos)].properties)
-#define IN_LIGID( pos ) (buffer->in_string[(pos)].ligID)
-#define IN_COMPONENT( pos ) (buffer->in_string[(pos)].component)
-#define POSITION( pos ) (&buffer->positions[(pos)])
-#define OUT_GLYPH( pos ) (buffer->out_string[(pos)].gindex)
-#define OUT_ITEM( pos ) (&buffer->out_string[(pos)])
-
-#define CHECK_Property( gdef, index, flags, property ) \
- ( ( error = _HB_GDEF_Check_Property( (gdef), (index), (flags), \
- (property) ) ) != HB_Err_Ok )
-
-#define ADD_String( buffer, num_in, num_out, glyph_data, component, ligID ) \
- ( ( error = _hb_buffer_add_output_glyphs( (buffer), \
- (num_in), (num_out), \
- (glyph_data), (component), (ligID) \
- ) ) != HB_Err_Ok )
-#define ADD_Glyph( buffer, glyph_index, component, ligID ) \
- ( ( error = _hb_buffer_add_output_glyph( (buffer), \
- (glyph_index), (component), (ligID) \
- ) ) != HB_Err_Ok )
-#define REPLACE_Glyph( buffer, glyph_index, nesting_level ) \
- ( ( error = _hb_buffer_replace_output_glyph( (buffer), (glyph_index), \
- (nesting_level) == 1 ) ) != HB_Err_Ok )
-#define COPY_Glyph( buffer ) \
- ( (error = _hb_buffer_copy_output_glyph ( buffer ) ) != HB_Err_Ok )
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_BUFFER_PRIVATE_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-buffer.c b/src/3rdparty/harfbuzz/src/harfbuzz-buffer.c
deleted file mode 100644
index 4d4c16717f..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-buffer.c
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2004,2007 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-buffer-private.h"
-#include "harfbuzz-gsub-private.h"
-#include "harfbuzz-gpos-private.h"
-
-/* Here is how the buffer works internally:
- *
- * There are two string pointers: in_string and out_string. They
- * always have same allocated size, but different length and positions.
- *
- * As an optimization, both in_string and out_string may point to the
- * same piece of memory, which is owned by in_string. This remains the
- * case as long as:
- *
- * - copy_glyph() is called
- * - replace_glyph() is called with inplace=TRUE
- * - add_output_glyph() and add_output_glyphs() are not called
- *
- * In that case swap(), and copy_glyph(), and replace_glyph() are all
- * mostly no-op.
- *
- * As soon an add_output_glyph[s]() or replace_glyph() with inplace=FALSE is
- * called, out_string is moved over to an alternate buffer (alt_string), and
- * its current contents (out_length entries) are copied to the alt buffer.
- * This should all remain transparent to the user. swap() then switches
- * in_string and alt_string. alt_string is not allocated until its needed,
- * but after that it's grown with in_string unconditionally.
- *
- * The buffer->separate_out boolean keeps status of whether out_string points
- * to in_string (FALSE) or alt_string (TRUE).
- */
-
-/* Internal API */
-
-static HB_Error
-hb_buffer_ensure( HB_Buffer buffer,
- HB_UInt size )
-{
- HB_UInt new_allocated = buffer->allocated;
-
- if (size > new_allocated)
- {
- HB_Error error;
-
- while (size > new_allocated)
- new_allocated += (new_allocated >> 1) + 8;
-
- if ( buffer->positions )
- {
- if ( REALLOC_ARRAY( buffer->positions, new_allocated, HB_PositionRec ) )
- return error;
- }
-
- if ( REALLOC_ARRAY( buffer->in_string, new_allocated, HB_GlyphItemRec ) )
- return error;
-
- if ( buffer->separate_out )
- {
- if ( REALLOC_ARRAY( buffer->alt_string, new_allocated, HB_GlyphItemRec ) )
- return error;
-
- buffer->out_string = buffer->alt_string;
- }
- else
- {
- buffer->out_string = buffer->in_string;
-
- if ( buffer->alt_string )
- {
- if ( REALLOC_ARRAY( buffer->alt_string, new_allocated, HB_GlyphItemRec ) )
- return error;
- }
- }
-
- buffer->allocated = new_allocated;
- }
-
- return HB_Err_Ok;
-}
-
-static HB_Error
-hb_buffer_duplicate_out_buffer( HB_Buffer buffer )
-{
- if ( !buffer->alt_string )
- {
- HB_Error error;
-
- if ( ALLOC_ARRAY( buffer->alt_string, buffer->allocated, HB_GlyphItemRec ) )
- return error;
- }
-
- buffer->out_string = buffer->alt_string;
- memcpy( buffer->out_string, buffer->in_string, buffer->out_length * sizeof (buffer->out_string[0]) );
- buffer->separate_out = TRUE;
-
- return HB_Err_Ok;
-}
-
-/* Public API */
-
-HB_Error
-hb_buffer_new( HB_Buffer *pbuffer )
-{
- HB_Buffer buffer;
- HB_Error error;
-
- if ( ALLOC( buffer, sizeof( HB_BufferRec ) ) )
- return error;
-
- buffer->allocated = 0;
- buffer->in_string = NULL;
- buffer->alt_string = NULL;
- buffer->positions = NULL;
-
- hb_buffer_clear( buffer );
-
- *pbuffer = buffer;
-
- return HB_Err_Ok;
-}
-
-void
-hb_buffer_free( HB_Buffer buffer )
-{
- FREE( buffer->in_string );
- FREE( buffer->alt_string );
- buffer->out_string = NULL;
- FREE( buffer->positions );
- FREE( buffer );
-}
-
-void
-hb_buffer_clear( HB_Buffer buffer )
-{
- buffer->in_length = 0;
- buffer->out_length = 0;
- buffer->in_pos = 0;
- buffer->out_pos = 0;
- buffer->out_string = buffer->in_string;
- buffer->separate_out = FALSE;
- buffer->max_ligID = 0;
-}
-
-HB_Error
-hb_buffer_add_glyph( HB_Buffer buffer,
- HB_UInt glyph_index,
- HB_UInt properties,
- HB_UInt cluster )
-{
- HB_Error error;
- HB_GlyphItem glyph;
-
- error = hb_buffer_ensure( buffer, buffer->in_length + 1 );
- if ( error )
- return error;
-
- glyph = &buffer->in_string[buffer->in_length];
- glyph->gindex = glyph_index;
- glyph->properties = properties;
- glyph->cluster = cluster;
- glyph->component = 0;
- glyph->ligID = 0;
- glyph->gproperties = HB_GLYPH_PROPERTIES_UNKNOWN;
-
- buffer->in_length++;
-
- return HB_Err_Ok;
-}
-
-/* HarfBuzz-Internal API */
-
-HB_INTERNAL void
-_hb_buffer_clear_output( HB_Buffer buffer )
-{
- buffer->out_length = 0;
- buffer->out_pos = 0;
- buffer->out_string = buffer->in_string;
- buffer->separate_out = FALSE;
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_clear_positions( HB_Buffer buffer )
-{
- if ( !buffer->positions )
- {
- HB_Error error;
-
- if ( ALLOC_ARRAY( buffer->positions, buffer->allocated, HB_PositionRec ) )
- return error;
- }
-
- memset (buffer->positions, 0, sizeof (buffer->positions[0]) * buffer->in_length);
-
- return HB_Err_Ok;
-}
-
-HB_INTERNAL void
-_hb_buffer_swap( HB_Buffer buffer )
-{
- HB_GlyphItem tmp_string;
- int tmp_length;
- int tmp_pos;
-
- if ( buffer->separate_out )
- {
- tmp_string = buffer->in_string;
- buffer->in_string = buffer->out_string;
- buffer->out_string = tmp_string;
- buffer->alt_string = buffer->out_string;
- }
-
- tmp_length = buffer->in_length;
- buffer->in_length = buffer->out_length;
- buffer->out_length = tmp_length;
-
- tmp_pos = buffer->in_pos;
- buffer->in_pos = buffer->out_pos;
- buffer->out_pos = tmp_pos;
-}
-
-/* The following function copies `num_out' elements from `glyph_data'
- to `buffer->out_string', advancing the in array pointer in the structure
- by `num_in' elements, and the out array pointer by `num_out' elements.
- Finally, it sets the `length' field of `out' equal to
- `pos' of the `out' structure.
-
- If `component' is 0xFFFF, the component value from buffer->in_pos
- will copied `num_out' times, otherwise `component' itself will
- be used to fill the `component' fields.
-
- If `ligID' is 0xFFFF, the ligID value from buffer->in_pos
- will copied `num_out' times, otherwise `ligID' itself will
- be used to fill the `ligID' fields.
-
- The properties for all replacement glyphs are taken
- from the glyph at position `buffer->in_pos'.
-
- The cluster value for the glyph at position buffer->in_pos is used
- for all replacement glyphs */
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyphs( HB_Buffer buffer,
- HB_UShort num_in,
- HB_UShort num_out,
- HB_UShort *glyph_data,
- HB_UShort component,
- HB_UShort ligID )
-{
- HB_Error error;
- HB_UShort i;
- HB_UInt properties;
- HB_UInt cluster;
-
- error = hb_buffer_ensure( buffer, buffer->out_pos + num_out );
- if ( error )
- return error;
-
- if ( !buffer->separate_out )
- {
- error = hb_buffer_duplicate_out_buffer( buffer );
- if ( error )
- return error;
- }
-
- properties = buffer->in_string[buffer->in_pos].properties;
- cluster = buffer->in_string[buffer->in_pos].cluster;
- if ( component == 0xFFFF )
- component = buffer->in_string[buffer->in_pos].component;
- if ( ligID == 0xFFFF )
- ligID = buffer->in_string[buffer->in_pos].ligID;
-
- for ( i = 0; i < num_out; i++ )
- {
- HB_GlyphItem item = &buffer->out_string[buffer->out_pos + i];
-
- item->gindex = glyph_data[i];
- item->properties = properties;
- item->cluster = cluster;
- item->component = component;
- item->ligID = ligID;
- item->gproperties = HB_GLYPH_PROPERTIES_UNKNOWN;
- }
-
- buffer->in_pos += num_in;
- buffer->out_pos += num_out;
-
- buffer->out_length = buffer->out_pos;
-
- return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyph( HB_Buffer buffer,
- HB_UInt glyph_index,
- HB_UShort component,
- HB_UShort ligID )
-{
- HB_UShort glyph_data = glyph_index;
-
- return _hb_buffer_add_output_glyphs ( buffer, 1, 1,
- &glyph_data, component, ligID );
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_copy_output_glyph ( HB_Buffer buffer )
-{
- HB_Error error;
-
- error = hb_buffer_ensure( buffer, buffer->out_pos + 1 );
- if ( error )
- return error;
-
- if ( buffer->separate_out )
- {
- buffer->out_string[buffer->out_pos] = buffer->in_string[buffer->in_pos];
- }
-
- buffer->in_pos++;
- buffer->out_pos++;
- buffer->out_length = buffer->out_pos;
-
- return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_replace_output_glyph( HB_Buffer buffer,
- HB_UInt glyph_index,
- HB_Bool inplace )
-{
-
- HB_Error error;
-
- if ( inplace )
- {
- error = _hb_buffer_copy_output_glyph ( buffer );
- if ( error )
- return error;
-
- buffer->out_string[buffer->out_pos-1].gindex = glyph_index;
- }
- else
- {
- return _hb_buffer_add_output_glyph( buffer, glyph_index, 0xFFFF, 0xFFFF );
- }
-
- return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_UShort
-_hb_buffer_allocate_ligid( HB_Buffer buffer )
-{
- buffer->max_ligID++;
- if (HB_UNLIKELY (buffer->max_ligID == 0))
- buffer->max_ligID++;
-
- return buffer->max_ligID;
-}
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h b/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h
deleted file mode 100644
index 0d631b20a6..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2004,2007 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- */
-
-#ifndef HARFBUZZ_BUFFER_H
-#define HARFBUZZ_BUFFER_H
-
-#include "harfbuzz-global.h"
-
-HB_BEGIN_HEADER
-
-typedef struct HB_GlyphItemRec_ {
- HB_UInt gindex;
- HB_UInt properties;
- HB_UInt cluster;
- HB_UShort component;
- HB_UShort ligID;
- HB_UShort gproperties;
-} HB_GlyphItemRec, *HB_GlyphItem;
-
-typedef struct HB_PositionRec_ {
- HB_Fixed x_pos;
- HB_Fixed y_pos;
- HB_Fixed x_advance;
- HB_Fixed y_advance;
- HB_UShort back; /* number of glyphs to go back
- for drawing current glyph */
- HB_Short cursive_chain; /* character to which this connects,
- may be positive or negative; used
- only internally */
- HB_Bool new_advance; /* if set, the advance width values are
- absolute, i.e., they won't be
- added to the original glyph's value
- but rather replace them. */
-} HB_PositionRec, *HB_Position;
-
-
-typedef struct HB_BufferRec_{
- HB_UInt allocated;
-
- HB_UInt in_length;
- HB_UInt out_length;
- HB_UInt in_pos;
- HB_UInt out_pos;
-
- HB_GlyphItem in_string;
- HB_GlyphItem out_string;
- HB_GlyphItem alt_string;
- HB_Position positions;
- HB_UShort max_ligID;
- HB_Bool separate_out;
-} HB_BufferRec, *HB_Buffer;
-
-HB_Error
-hb_buffer_new( HB_Buffer *buffer );
-
-void
-hb_buffer_free( HB_Buffer buffer );
-
-void
-hb_buffer_clear( HB_Buffer buffer );
-
-HB_Error
-hb_buffer_add_glyph( HB_Buffer buffer,
- HB_UInt glyph_index,
- HB_UInt properties,
- HB_UInt cluster );
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_BUFFER_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-dump-main.c b/src/3rdparty/harfbuzz/src/harfbuzz-dump-main.c
deleted file mode 100644
index dfb35fbaaf..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-dump-main.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2000 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "harfbuzz.h"
-#include "harfbuzz-dump.h"
-
-#define N_ELEMENTS(arr) (sizeof(arr)/ sizeof((arr)[0]))
-
-static int
-croak (const char *situation, HB_Error error)
-{
- fprintf (stderr, "%s: Error %d\n", situation, error);
-
- exit (1);
-}
-
-int
-main (int argc, char **argv)
-{
- HB_Error error;
- FT_Library library;
- HB_Font font;
- HB_GSUB gsub;
- HB_GPOS gpos;
-
- if (argc != 2)
- {
- fprintf (stderr, "Usage: harfbuzz-dump MYFONT.TTF\n");
- exit(1);
- }
-
- if ((error = FT_Init_FreeType (&library)))
- croak ("FT_Init_FreeType", error);
-
- if ((error = FT_New_Face (library, argv[1], 0, &font)))
- croak ("FT_New_Face", error);
-
- printf ("<?xml version=\"1.0\"?>\n");
- printf ("<OpenType>\n");
-
- if (!(error = HB_Load_GSUB_Table (font, &gsub, NULL)))
- {
- HB_Dump_GSUB_Table (gsub, stdout);
-
- if ((error = HB_Done_GSUB_Table (gsub)))
- croak ("HB_Done_GSUB_Table", error);
- }
- else if (error != HB_Err_Not_Covered)
- fprintf (stderr, "HB_Load_GSUB_Table: error 0x%x\n", error);
-
- if (!(error = HB_Load_GPOS_Table (font, &gpos, NULL)))
- {
- HB_Dump_GPOS_Table (gpos, stdout);
-
- if ((error = HB_Done_GPOS_Table (gpos)))
- croak ("HB_Done_GPOS_Table", error);
- }
- else if (error != HB_Err_Not_Covered)
- fprintf (stderr, "HB_Load_GPOS_Table: error 0x%x\n", error);
-
- printf ("</OpenType>\n");
-
- if ((error = FT_Done_Face (font)))
- croak ("FT_Done_Face", error);
-
- if ((error = FT_Done_FreeType (library)))
- croak ("FT_Done_FreeType", error);
-
- return 0;
-}
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-dump.c b/src/3rdparty/harfbuzz/src/harfbuzz-dump.c
deleted file mode 100644
index 54d42e93d4..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-dump.c
+++ /dev/null
@@ -1,767 +0,0 @@
-/*
- * Copyright (C) 2000, 2007 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-dump.h"
-#include "harfbuzz-gdef-private.h"
-#include "harfbuzz-gsub-private.h"
-#include "harfbuzz-gpos-private.h"
-#include "harfbuzz-open-private.h"
-#include <stdarg.h>
-
-#define DUMP(format) dump (stream, indent, format)
-#define DUMP1(format, arg1) dump (stream, indent, format, arg1)
-#define DUMP2(format, arg1, arg2) dump (stream, indent, format, arg1, arg2)
-#define DUMP3(format, arg1, arg2, arg3) dump (stream, indent, format, arg1, arg2, arg3)
-
-#define DUMP_FINT(strct,fld) dump (stream, indent, "<" #fld ">%d</" #fld ">\n", (strct)->fld)
-#define DUMP_FUINT(strct,fld) dump (stream, indent, "<" #fld ">%u</" #fld ">\n", (strct)->fld)
-#define DUMP_FGLYPH(strct,fld) dump (stream, indent, "<" #fld ">%#06x</" #fld ">\n", (strct)->fld)
-#define DUMP_FGLYPH(strct,fld) dump (stream, indent, "<" #fld ">%#06x</" #fld ">\n", (strct)->fld)
-#define DUMP_USHORT_ARRAY(strct,fld,cnt) Dump_UShort_Array ((strct)->fld, cnt, #fld, stream, indent);
-
-#define DEF_DUMP(type) static void Dump_ ## type (HB_ ## type *type, FILE *stream, int indent, HB_Type hb_type)
-#define RECURSE(name, type, val) do { DUMP ("<" #name ">\n"); Dump_ ## type (val, stream, indent + 1, hb_type); DUMP ("</" #name ">\n"); } while (0)
-#define RECURSE_NUM(name, i, type, val) do { DUMP1 ("<" #name "> <!-- %d -->\n", i); Dump_ ## type (val, stream, indent + 1, hb_type); DUMP ("</" #name ">\n"); } while (0)
-#define DUMP_VALUE_RECORD(val, frmt) do { DUMP ("<ValueRecord>\n"); Dump_ValueRecord (val, stream, indent + 1, hb_type, frmt); DUMP ("</ValueRecord>\n"); } while (0)
-
-static void
-do_indent (FILE *stream, int indent)
-{
- fprintf (stream, "%*s", indent * 3, "");
-}
-
-static void
-dump (FILE *stream, int indent, const char *format, ...)
-{
- va_list list;
-
- do_indent (stream, indent);
-
- va_start (list, format);
- vfprintf (stream, format, list);
- va_end (list);
-}
-
-static void
-Dump_UShort_Array (HB_UShort *array, int count, const char *name, FILE *stream, int indent)
-{
- int i;
-
- do_indent (stream, indent);
-
- fprintf (stream, "<%s>", name);
- for (i = 0; i < count; i++)
- fprintf (stream, "%d%s", array[i], i == 0 ? "" : " ");
- fprintf (stream, "</%s>\n", name);
-}
-
-static void
-Print_Tag (HB_UInt tag, FILE *stream)
-{
- fprintf (stream, "%c%c%c%c",
- (unsigned char)(tag >> 24),
- (unsigned char)((tag >> 16) & 0xff),
- (unsigned char)((tag >> 8) & 0xff),
- (unsigned char)(tag & 0xff));
-}
-
-DEF_DUMP (LangSys)
-{
- int i;
-
- HB_UNUSED(hb_type);
-
- DUMP_FUINT (LangSys, LookupOrderOffset);
- DUMP_FUINT (LangSys, ReqFeatureIndex);
- DUMP_FUINT (LangSys, FeatureCount);
-
- for (i=0; i < LangSys->FeatureCount; i++)
- DUMP1("<FeatureIndex>%d</FeatureIndex>\n", LangSys->FeatureIndex[i]);
-}
-
-DEF_DUMP (ScriptTable)
-{
- int i;
-
- RECURSE (DefaultLangSys, LangSys, &ScriptTable->DefaultLangSys);
-
- DUMP_FUINT (ScriptTable, LangSysCount);
-
- for (i=0; i < ScriptTable->LangSysCount; i++)
- {
- do_indent (stream, indent);
- fprintf (stream, "<LangSysTag>");
- Print_Tag (ScriptTable->LangSysRecord[i].LangSysTag, stream);
- fprintf (stream, "</LangSysTag>\n");
- RECURSE_NUM (LangSys, i, LangSys, &ScriptTable->LangSysRecord[i].LangSys);
- }
-}
-
-DEF_DUMP (ScriptList)
-{
- int i;
-
- DUMP_FUINT (ScriptList, ScriptCount);
-
- for (i=0; i < ScriptList->ScriptCount; i++)
- {
- do_indent (stream, indent);
- fprintf (stream, "<ScriptTag>");
- Print_Tag (ScriptList->ScriptRecord[i].ScriptTag, stream);
- fprintf (stream, "</ScriptTag>\n");
- RECURSE_NUM (Script, i, ScriptTable, &ScriptList->ScriptRecord[i].Script);
- }
-}
-
-DEF_DUMP (Feature)
-{
- int i;
-
- HB_UNUSED(hb_type);
-
- DUMP_FUINT (Feature, FeatureParams);
- DUMP_FUINT (Feature, LookupListCount);
-
- for (i=0; i < Feature->LookupListCount; i++)
- DUMP1("<LookupIndex>%d</LookupIndex>\n", Feature->LookupListIndex[i]);
-}
-
-DEF_DUMP (MarkRecord)
-{
- HB_UNUSED(hb_type);
-
- DUMP_FUINT (MarkRecord, Class);
- DUMP1("<Anchor>%d</Anchor>\n", MarkRecord->MarkAnchor.PosFormat );
-}
-
-DEF_DUMP (MarkArray)
-{
- int i;
-
- DUMP_FUINT (MarkArray, MarkCount);
-
- for (i=0; i < MarkArray->MarkCount; i++)
- RECURSE_NUM (MarkRecord, i, MarkRecord, &MarkArray->MarkRecord[i]);
-}
-
-DEF_DUMP (FeatureList)
-{
- int i;
-
- DUMP_FUINT (FeatureList, FeatureCount);
-
- for (i=0; i < FeatureList->FeatureCount; i++)
- {
- do_indent (stream, indent);
- fprintf (stream, "<FeatureTag>");
- Print_Tag (FeatureList->FeatureRecord[i].FeatureTag, stream);
- fprintf (stream, "</FeatureTag> <!-- %d -->\n", i);
- RECURSE_NUM (Feature, i, Feature, &FeatureList->FeatureRecord[i].Feature);
- }
-}
-
-DEF_DUMP (Coverage)
-{
- HB_UNUSED(hb_type);
-
- DUMP_FUINT (Coverage, CoverageFormat);
-
- if (Coverage->CoverageFormat == 1)
- {
- int i;
- DUMP_FUINT (&Coverage->cf.cf1, GlyphCount);
-
- for (i = 0; i < Coverage->cf.cf1.GlyphCount; i++)
- DUMP2("<Glyph>%#06x</Glyph> <!-- %d -->\n",
- Coverage->cf.cf1.GlyphArray[i], i);
- }
- else
- {
- int i;
- DUMP_FUINT (&Coverage->cf.cf2, RangeCount);
-
- for ( i = 0; i < Coverage->cf.cf2.RangeCount; i++ )
- DUMP3("<Glyph>%#06x - %#06x</Glyph> <!-- %d -->\n",
- Coverage->cf.cf2.RangeRecord[i].Start,
- Coverage->cf.cf2.RangeRecord[i].End, i);
- }
-}
-
-DEF_DUMP (ClassRangeRecord)
-{
- HB_UNUSED(hb_type);
-
- DUMP_FGLYPH (ClassRangeRecord, Start);
- DUMP_FGLYPH (ClassRangeRecord, End);
- DUMP_FUINT (ClassRangeRecord, Class);
-}
-
-DEF_DUMP (ClassDefinition)
-{
- HB_UNUSED(hb_type);
-
- DUMP_FUINT( ClassDefinition, ClassFormat);
- DUMP_FUINT( ClassDefinition, loaded);
-
- if (ClassDefinition->ClassFormat == 1)
- {
- int i;
- HB_ClassDefFormat1 *ClassDefFormat1 = &ClassDefinition->cd.cd1;
- DUMP("<ClassDefinition>\n");
- DUMP_FUINT (ClassDefFormat1, StartGlyph );
- DUMP_FUINT (ClassDefFormat1, GlyphCount );
- for (i = 0; i < ClassDefFormat1->GlyphCount; i++)
- DUMP2(" <Class>%d</Class> <!-- %#06x -->", ClassDefFormat1->ClassValueArray[i],
- ClassDefFormat1->StartGlyph+i );
- }
- else if (ClassDefinition->ClassFormat == 2)
- {
- int i;
- HB_ClassDefFormat2 *ClassDefFormat2 = &ClassDefinition->cd.cd2;
- DUMP_FUINT (ClassDefFormat2, ClassRangeCount);
-
- for (i = 0; i < ClassDefFormat2->ClassRangeCount; i++)
- RECURSE_NUM (ClassRangeRecord, i, ClassRangeRecord, &ClassDefFormat2->ClassRangeRecord[i]);
- }
- else
- fprintf(stderr, "invalid class def table!!!\n");
-}
-
-DEF_DUMP (SubstLookupRecord)
-{
- HB_UNUSED(hb_type);
-
- DUMP_FUINT (SubstLookupRecord, SequenceIndex);
- DUMP_FUINT (SubstLookupRecord, LookupListIndex);
-}
-
-DEF_DUMP (ChainSubClassRule)
-{
- int i;
-
- DUMP_USHORT_ARRAY (ChainSubClassRule, Backtrack, ChainSubClassRule->BacktrackGlyphCount);
- DUMP_USHORT_ARRAY (ChainSubClassRule, Input, ChainSubClassRule->InputGlyphCount - 1);
- DUMP_USHORT_ARRAY (ChainSubClassRule, Lookahead, ChainSubClassRule->LookaheadGlyphCount);
-
- for (i = 0; i < ChainSubClassRule->SubstCount; i++)
- RECURSE_NUM (SubstLookupRecord, i, SubstLookupRecord, &ChainSubClassRule->SubstLookupRecord[i]);
-
- indent--;
-}
-
-DEF_DUMP (ChainSubClassSet)
-{
- int i;
-
- DUMP_FUINT( ChainSubClassSet, ChainSubClassRuleCount );
- for (i = 0; i < ChainSubClassSet->ChainSubClassRuleCount; i++)
- RECURSE_NUM (ChainSubClassRule, i, ChainSubClassRule, &ChainSubClassSet->ChainSubClassRule[i]);
-}
-
-static void
-Dump_GSUB_Lookup_Single (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type)
-{
- HB_SingleSubst *SingleSubst = &subtable->st.gsub.single;
-
- DUMP_FUINT (SingleSubst, SubstFormat);
- RECURSE (Coverage, Coverage, &SingleSubst->Coverage);
-
- if (SingleSubst->SubstFormat == 1)
- {
- DUMP_FINT (&SingleSubst->ssf.ssf1, DeltaGlyphID);
- }
- else
- {
- int i;
-
- DUMP_FINT (&SingleSubst->ssf.ssf2, GlyphCount);
- for (i=0; i < SingleSubst->ssf.ssf2.GlyphCount; i++)
- DUMP2("<Substitute>%#06x</Substitute> <!-- %d -->\n", SingleSubst->ssf.ssf2.Substitute[i], i);
- }
-}
-
-DEF_DUMP (Ligature)
-{
- int i;
-
- HB_UNUSED(hb_type);
-
- DUMP_FGLYPH (Ligature, LigGlyph);
- DUMP_FUINT (Ligature, ComponentCount);
-
- for (i=0; i < Ligature->ComponentCount - 1; i++)
- DUMP1("<Component>%#06x</Component>\n", Ligature->Component[i]);
-}
-
-DEF_DUMP (LigatureSet)
-{
- int i;
-
- DUMP_FUINT (LigatureSet, LigatureCount);
-
- for (i=0; i < LigatureSet->LigatureCount; i++)
- RECURSE_NUM (Ligature, i, Ligature, &LigatureSet->Ligature[i]);
-}
-
-static void
-Dump_GSUB_Lookup_Ligature (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type)
-{
- int i;
- HB_LigatureSubst *LigatureSubst = &subtable->st.gsub.ligature;
-
- DUMP_FUINT (LigatureSubst, SubstFormat);
- RECURSE (Coverage, Coverage, &LigatureSubst->Coverage);
-
- DUMP_FUINT (LigatureSubst, LigatureSetCount);
-
- for (i=0; i < LigatureSubst->LigatureSetCount; i++)
- RECURSE_NUM (LigatureSet, i, LigatureSet, &LigatureSubst->LigatureSet[i]);
-}
-
-DEF_DUMP (ContextSubstFormat1)
-{
- HB_UNUSED(hb_type);
- HB_UNUSED(ContextSubstFormat1);
-
-
- DUMP("<!-- Not implemented!!! -->\n");
-}
-
-DEF_DUMP (ContextSubstFormat2)
-{
- DUMP_FUINT (ContextSubstFormat2, MaxContextLength);
- RECURSE (Coverage, Coverage, &ContextSubstFormat2->Coverage);
- RECURSE (ClassDefinition, ClassDefinition, &ContextSubstFormat2->ClassDef);
-}
-
-DEF_DUMP (ContextSubstFormat3)
-{
- HB_UNUSED(hb_type);
- HB_UNUSED(ContextSubstFormat3);
-
- DUMP("<!-- Not implemented!!! -->\n");
-}
-
-static void
-Dump_GSUB_Lookup_Context (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type)
-{
- HB_ContextSubst *ContextSubst = &subtable->st.gsub.context;
-
- DUMP_FUINT (ContextSubst, SubstFormat);
- switch( ContextSubst->SubstFormat )
- {
- case 1:
- Dump_ContextSubstFormat1 (&ContextSubst->csf.csf1, stream, indent+2, hb_type);
- break;
- case 2:
- Dump_ContextSubstFormat2 (&ContextSubst->csf.csf2, stream, indent+2, hb_type);
- break;
- case 3:
- Dump_ContextSubstFormat3 (&ContextSubst->csf.csf3, stream, indent+2, hb_type);
- break;
- default:
- fprintf(stderr, "invalid subformat!!!!!\n");
- }
-}
-
-DEF_DUMP (ChainContextSubstFormat1)
-{
- HB_UNUSED(hb_type);
- HB_UNUSED(ChainContextSubstFormat1);
-
- DUMP("<!-- Not implemented!!! -->\n");
-}
-
-DEF_DUMP (ChainContextSubstFormat2)
-{
- int i;
-
- RECURSE (Coverage, Coverage, &ChainContextSubstFormat2->Coverage);
- DUMP_FUINT (ChainContextSubstFormat2, MaxBacktrackLength);
- RECURSE (ClassDefinition, ClassDefinition, &ChainContextSubstFormat2->BacktrackClassDef);
- DUMP_FUINT (ChainContextSubstFormat2, MaxInputLength);
- RECURSE (ClassDefinition, ClassDefinition, &ChainContextSubstFormat2->InputClassDef);
- DUMP_FUINT (ChainContextSubstFormat2, MaxLookaheadLength);
- RECURSE (ClassDefinition, ClassDefinition, &ChainContextSubstFormat2->LookaheadClassDef);
-
- DUMP_FUINT (ChainContextSubstFormat2, ChainSubClassSetCount);
- for (i = 0; i < ChainContextSubstFormat2->ChainSubClassSetCount; i++)
- RECURSE (ChainSubClassSet, ChainSubClassSet, &ChainContextSubstFormat2->ChainSubClassSet[i]);
-}
-
-DEF_DUMP (ChainContextSubstFormat3)
-{
- int i;
-
- DUMP_FUINT (ChainContextSubstFormat3, BacktrackGlyphCount);
- for (i = 0; i < ChainContextSubstFormat3->BacktrackGlyphCount; i++)
- RECURSE (BacktrackCoverage, Coverage, &ChainContextSubstFormat3->BacktrackCoverage[i]);
- DUMP_FUINT (ChainContextSubstFormat3, InputGlyphCount);
- for (i = 0; i < ChainContextSubstFormat3->InputGlyphCount; i++)
- RECURSE (InputCoverage, Coverage, &ChainContextSubstFormat3->InputCoverage[i]);
- DUMP_FUINT (ChainContextSubstFormat3, LookaheadGlyphCount);
- for (i = 0; i < ChainContextSubstFormat3->LookaheadGlyphCount; i++)
- RECURSE (LookaheadCoverage, Coverage, &ChainContextSubstFormat3->LookaheadCoverage[i]);
-
- for (i = 0; i < ChainContextSubstFormat3->SubstCount; i++)
- RECURSE_NUM (SubstLookupRecord, i, SubstLookupRecord, &ChainContextSubstFormat3->SubstLookupRecord[i]);
-
-}
-
-static void
-Dump_GSUB_Lookup_Chain (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type)
-{
- HB_ChainContextSubst *chain = &subtable->st.gsub.chain;
-
- DUMP_FUINT (chain, SubstFormat);
- switch (chain->SubstFormat)
- {
- case 1:
- Dump_ChainContextSubstFormat1 (&chain->ccsf.ccsf1, stream, indent+2, hb_type);
- break;
- case 2:
- Dump_ChainContextSubstFormat2 (&chain->ccsf.ccsf2, stream, indent+2, hb_type);
- break;
- case 3:
- Dump_ChainContextSubstFormat3 (&chain->ccsf.ccsf3, stream, indent+2, hb_type);
- break;
- default:
- fprintf(stderr, "invalid subformat!!!!!\n");
- }
-}
-
-static void
-Dump_Device (HB_Device *Device, FILE *stream, int indent, HB_Type hb_type)
-{
- int i;
- int bits;
- int n_per;
- unsigned int mask;
-
- HB_UNUSED(hb_type);
-
- DUMP_FUINT (Device, StartSize);
- DUMP_FUINT (Device, EndSize);
- DUMP_FUINT (Device, DeltaFormat);
- switch (Device->DeltaFormat)
- {
- case 1:
- bits = 2;
- break;
- case 2:
- bits = 4;
- break;
- case 3:
- bits = 8;
- break;
- default:
- bits = 0;
- break;
- }
-
- DUMP ("<DeltaValue>");
- if (!bits)
- {
-
- fprintf(stderr, "invalid DeltaFormat!!!!!\n");
- }
- else
- {
- n_per = 16 / bits;
- mask = (1 << bits) - 1;
- mask = mask << (16 - bits);
-
- for (i = Device->StartSize; i <= Device->EndSize ; i++)
- {
- HB_UShort val = Device->DeltaValue[i / n_per];
- HB_Short signed_val = ((val << ((i % n_per) * bits)) & mask);
- dump (stream, indent, "%d", signed_val >> (16 - bits));
- if (i != Device->EndSize)
- DUMP (", ");
- }
- }
- DUMP ("</DeltaValue>\n");
-}
-
-static void
-Dump_ValueRecord (HB_ValueRecord *ValueRecord, FILE *stream, int indent, HB_Type hb_type, HB_UShort value_format)
-{
- if (value_format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT)
- DUMP_FINT (ValueRecord, XPlacement);
- if (value_format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT)
- DUMP_FINT (ValueRecord, YPlacement);
- if (value_format & HB_GPOS_FORMAT_HAVE_X_ADVANCE)
- DUMP_FINT (ValueRecord, XAdvance);
- if (value_format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE)
- DUMP_FINT (ValueRecord, XAdvance);
- if (value_format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE)
- RECURSE (Device, Device, &*ValueRecord->DeviceTables[VR_X_PLACEMENT_DEVICE]);
- if (value_format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE)
- RECURSE (Device, Device, &*ValueRecord->DeviceTables[VR_Y_PLACEMENT_DEVICE]);
- if (value_format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE)
- RECURSE (Device, Device, &*ValueRecord->DeviceTables[VR_X_ADVANCE_DEVICE]);
- if (value_format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE)
- RECURSE (Device, Device, &*ValueRecord->DeviceTables[VR_Y_ADVANCE_DEVICE]);
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- if (value_format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT)
- DUMP_FUINT (ValueRecord, XIdPlacement);
- if (value_format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT)
- DUMP_FUINT (ValueRecord, YIdPlacement);
- if (value_format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE)
- DUMP_FUINT (ValueRecord, XIdAdvance);
- if (value_format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE)
- DUMP_FUINT (ValueRecord, XIdAdvance);
-#endif
-}
-
-static void
-Dump_GPOS_Lookup_Single (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type)
-{
- HB_SinglePos *SinglePos = &subtable->st.gpos.single;
-
- DUMP_FUINT (SinglePos, PosFormat);
- RECURSE (Coverage, Coverage, &SinglePos->Coverage);
-
- DUMP_FUINT (SinglePos, ValueFormat);
-
- if (SinglePos->PosFormat == 1)
- {
- DUMP_VALUE_RECORD (&SinglePos->spf.spf1.Value, SinglePos->ValueFormat);
- }
- else
- {
- int i;
-
- DUMP_FUINT (&SinglePos->spf.spf2, ValueCount);
- for (i = 0; i < SinglePos->spf.spf2.ValueCount; i++)
- DUMP_VALUE_RECORD (&SinglePos->spf.spf2.Value[i], SinglePos->ValueFormat);
- }
-}
-
-static void
-Dump_PairValueRecord (HB_PairValueRecord *PairValueRecord, FILE *stream, int indent, HB_Type hb_type, HB_UShort ValueFormat1, HB_UShort ValueFormat2)
-{
- DUMP_FUINT (PairValueRecord, SecondGlyph);
- DUMP_VALUE_RECORD (&PairValueRecord->Value1, ValueFormat1);
- DUMP_VALUE_RECORD (&PairValueRecord->Value2, ValueFormat2);
-}
-
-static void
-Dump_PairSet (HB_PairSet *PairSet, FILE *stream, int indent, HB_Type hb_type, HB_UShort ValueFormat1, HB_UShort ValueFormat2)
-{
- int i;
- DUMP_FUINT (PairSet, PairValueCount);
-
- for (i = 0; i < PairSet->PairValueCount; i++)
- {
- DUMP ("<PairValueRecord>\n");
- Dump_PairValueRecord (&PairSet->PairValueRecord[i], stream, indent + 1, hb_type, ValueFormat1, ValueFormat2);
- DUMP ("</PairValueRecord>\n");
- }
-}
-
-static void
-Dump_GPOS_Lookup_Pair (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type)
-{
- HB_PairPos *PairPos = &subtable->st.gpos.pair;
-
- DUMP_FUINT (PairPos, PosFormat);
- RECURSE (Coverage, Coverage, &PairPos->Coverage);
-
- DUMP_FUINT (PairPos, ValueFormat1);
- DUMP_FUINT (PairPos, ValueFormat2);
-
- if (PairPos->PosFormat == 1)
- {
- int i;
-
- DUMP_FUINT (&PairPos->ppf.ppf1, PairSetCount);
- for (i = 0; i < PairPos->ppf.ppf1.PairSetCount; i++)
- {
- DUMP ("<PairSet>\n");
- Dump_PairSet (&PairPos->ppf.ppf1.PairSet[i], stream, indent + 1, hb_type, PairPos->ValueFormat1, PairPos->ValueFormat2);
- DUMP ("</PairSet>\n");
- }
- }
- else
- {
- }
-}
-
-static void
-Dump_GPOS_Lookup_Markbase (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type)
-{
- int i;
- HB_MarkBasePos *markbase = &subtable->st.gpos.markbase;
-
- DUMP_FUINT (markbase, PosFormat);
- RECURSE (Coverage, Coverage, &markbase->MarkCoverage);
- RECURSE (Coverage, Coverage, &markbase->BaseCoverage);
- DUMP_FUINT (markbase, ClassCount);
- RECURSE (MarkArray, MarkArray, &markbase->MarkArray);
-
- DUMP ("<BaseArray>\n");
- indent++;
-
- DUMP_FUINT (&markbase->BaseArray, BaseCount);
- for (i = 0; i < markbase->BaseArray.BaseCount; i++)
- {
- int j;
- HB_BaseRecord *r = &markbase->BaseArray.BaseRecord[i];
- DUMP1 ("<BaseRecord> <!-- %d -->\n", i);
- for (j = 0; j < markbase->ClassCount; j++)
- DUMP1 (" <Anchor>%d</Anchor>\n", r->BaseAnchor->PosFormat);
- DUMP ("<BaseRecord>\n");
- }
-
- indent--;
- DUMP ("</BaseArray>\n");
-}
-
-DEF_DUMP (Lookup)
-{
- int i;
- const char *lookup_name;
- void (*lookup_func) (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) = NULL;
-
- if (hb_type == HB_Type_GSUB)
- {
- switch (Lookup->LookupType)
- {
- case HB_GSUB_LOOKUP_SINGLE:
- lookup_name = "SINGLE";
- lookup_func = Dump_GSUB_Lookup_Single;
- break;
- case HB_GSUB_LOOKUP_MULTIPLE:
- lookup_name = "MULTIPLE";
- break;
- case HB_GSUB_LOOKUP_ALTERNATE:
- lookup_name = "ALTERNATE";
- break;
- case HB_GSUB_LOOKUP_LIGATURE:
- lookup_name = "LIGATURE";
- lookup_func = Dump_GSUB_Lookup_Ligature;
- break;
- case HB_GSUB_LOOKUP_CONTEXT:
- lookup_name = "CONTEXT";
- lookup_func = Dump_GSUB_Lookup_Context;
- break;
- case HB_GSUB_LOOKUP_CHAIN:
- lookup_name = "CHAIN";
- lookup_func = Dump_GSUB_Lookup_Chain;
- break;
- default:
- lookup_name = "(unknown)";
- lookup_func = NULL;
- break;
- }
- }
- else
- {
- switch (Lookup->LookupType)
- {
- case HB_GPOS_LOOKUP_SINGLE:
- lookup_name = "SINGLE";
- lookup_func = Dump_GPOS_Lookup_Single;
- break;
- case HB_GPOS_LOOKUP_PAIR:
- lookup_name = "PAIR";
- lookup_func = Dump_GPOS_Lookup_Pair;
- break;
- case HB_GPOS_LOOKUP_CURSIVE:
- lookup_name = "CURSIVE";
- break;
- case HB_GPOS_LOOKUP_MARKBASE:
- lookup_name = "MARKBASE";
- lookup_func = Dump_GPOS_Lookup_Markbase;
- break;
- case HB_GPOS_LOOKUP_MARKLIG:
- lookup_name = "MARKLIG";
- break;
- case HB_GPOS_LOOKUP_MARKMARK:
- lookup_name = "MARKMARK";
- break;
- case HB_GPOS_LOOKUP_CONTEXT:
- lookup_name = "CONTEXT";
- break;
- case HB_GPOS_LOOKUP_CHAIN:
- lookup_name = "CHAIN";
- break;
- default:
- lookup_name = "(unknown)";
- lookup_func = NULL;
- break;
- }
- }
-
- DUMP2("<LookupType>%s</LookupType> <!-- %d -->\n", lookup_name, Lookup->LookupType);
- DUMP1("<LookupFlag>%#06x</LookupFlag>\n", Lookup->LookupFlag);
-
- for (i=0; i < Lookup->SubTableCount; i++)
- {
- DUMP ("<Subtable>\n");
- if (lookup_func)
- (*lookup_func) (&Lookup->SubTable[i], stream, indent + 1, hb_type);
- DUMP ("</Subtable>\n");
- }
-}
-
-DEF_DUMP (LookupList)
-{
- int i;
-
- DUMP_FUINT (LookupList, LookupCount);
-
- for (i=0; i < LookupList->LookupCount; i++)
- RECURSE_NUM (Lookup, i, Lookup, &LookupList->Lookup[i]);
-}
-
-void
-HB_Dump_GSUB_Table (HB_GSUB gsub, FILE *stream)
-{
- int indent = 1;
- HB_Type hb_type = HB_Type_GSUB;
-
- do_indent (stream, indent);
- fprintf(stream, "<!-- GSUB -->\n");
- RECURSE (ScriptList, ScriptList, &gsub->ScriptList);
- RECURSE (FeatureList, FeatureList, &gsub->FeatureList);
- RECURSE (LookupList, LookupList, &gsub->LookupList);
-}
-
-void
-HB_Dump_GPOS_Table (HB_GPOS gpos, FILE *stream)
-{
- int indent = 1;
- HB_Type hb_type = HB_Type_GPOS;
-
- do_indent (stream, indent);
- fprintf(stream, "<!-- GPOS -->\n");
- RECURSE (ScriptList, ScriptList, &gpos->ScriptList);
- RECURSE (FeatureList, FeatureList, &gpos->FeatureList);
- RECURSE (LookupList, LookupList, &gpos->LookupList);
-}
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-dump.h b/src/3rdparty/harfbuzz/src/harfbuzz-dump.h
deleted file mode 100644
index ea4a62b2e1..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-dump.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2000, 2007 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- */
-
-#ifndef HARFBUZZ_DUMP_H
-#define HARFBUZZ_DUMP_H
-
-#include <stdio.h>
-#include "harfbuzz-gsub.h"
-#include "harfbuzz-gpos.h"
-
-HB_BEGIN_HEADER
-
-void HB_Dump_GSUB_Table (HB_GSUB gsub, FILE *stream);
-void HB_Dump_GPOS_Table (HB_GPOS gpos, FILE *stream);
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_DUMP_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-external.h b/src/3rdparty/harfbuzz/src/harfbuzz-external.h
deleted file mode 100644
index 53592c3c46..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-external.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_EXTERNAL_H
-#define HARFBUZZ_EXTERNAL_H
-
-#include "harfbuzz-global.h"
-
-HB_BEGIN_HEADER
-
-/* This header contains some methods that are not part of
- Harfbuzz itself, but referenced by it.
- They need to be provided by the application/library
-*/
-
-typedef enum
-{
- HB_Mark_NonSpacing, /* Mn */
- HB_Mark_SpacingCombining, /* Mc */
- HB_Mark_Enclosing, /* Me */
-
- HB_Number_DecimalDigit, /* Nd */
- HB_Number_Letter, /* Nl */
- HB_Number_Other, /* No */
-
- HB_Separator_Space, /* Zs */
- HB_Separator_Line, /* Zl */
- HB_Separator_Paragraph, /* Zp */
-
- HB_Other_Control, /* Cc */
- HB_Other_Format, /* Cf */
- HB_Other_Surrogate, /* Cs */
- HB_Other_PrivateUse, /* Co */
- HB_Other_NotAssigned, /* Cn */
-
- HB_Letter_Uppercase, /* Lu */
- HB_Letter_Lowercase, /* Ll */
- HB_Letter_Titlecase, /* Lt */
- HB_Letter_Modifier, /* Lm */
- HB_Letter_Other, /* Lo */
-
- HB_Punctuation_Connector, /* Pc */
- HB_Punctuation_Dash, /* Pd */
- HB_Punctuation_Open, /* Ps */
- HB_Punctuation_Close, /* Pe */
- HB_Punctuation_InitialQuote, /* Pi */
- HB_Punctuation_FinalQuote, /* Pf */
- HB_Punctuation_Other, /* Po */
-
- HB_Symbol_Math, /* Sm */
- HB_Symbol_Currency, /* Sc */
- HB_Symbol_Modifier, /* Sk */
- HB_Symbol_Other /* So */
-} HB_CharCategory;
-
-void HB_GetUnicodeCharProperties(HB_UChar32 ch, HB_CharCategory *category, int *combiningClass);
-HB_CharCategory HB_GetUnicodeCharCategory(HB_UChar32 ch);
-int HB_GetUnicodeCharCombiningClass(HB_UChar32 ch);
-HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch);
-
-void (*HB_Library_Resolve(const char *library, int version, const char *symbol))();
-
-HB_END_HEADER
-
-#endif
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h
deleted file mode 100644
index 94e9b43e61..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GDEF_PRIVATE_H
-#define HARFBUZZ_GDEF_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-stream-private.h"
-#include "harfbuzz-buffer-private.h"
-#include "harfbuzz-gdef.h"
-
-HB_BEGIN_HEADER
-
-/* Attachment related structures */
-
-struct HB_AttachPoint_
-{
- HB_UShort* PointIndex; /* array of contour points */
- HB_UShort PointCount; /* size of the PointIndex array */
-};
-
-/* Ligature Caret related structures */
-
-struct HB_CaretValueFormat1_
-{
- HB_Short Coordinate; /* x or y value (in design units) */
-};
-
-typedef struct HB_CaretValueFormat1_ HB_CaretValueFormat1;
-
-
-struct HB_CaretValueFormat2_
-{
- HB_UShort CaretValuePoint; /* contour point index on glyph */
-};
-
-typedef struct HB_CaretValueFormat2_ HB_CaretValueFormat2;
-
-
-struct HB_CaretValueFormat3_
-{
- HB_Device* Device; /* Device table for x or y value */
- HB_Short Coordinate; /* x or y value (in design units) */
-};
-
-typedef struct HB_CaretValueFormat3_ HB_CaretValueFormat3;
-
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-struct HB_CaretValueFormat4_
-{
- HB_UShort IdCaretValue; /* metric ID */
-};
-
-typedef struct HB_CaretValueFormat4_ HB_CaretValueFormat4;
-#endif
-
-
-struct HB_CaretValue_
-{
- union
- {
- HB_CaretValueFormat1 cvf1;
- HB_CaretValueFormat2 cvf2;
- HB_CaretValueFormat3 cvf3;
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- HB_CaretValueFormat4 cvf4;
-#endif
- } cvf;
-
- HB_Byte CaretValueFormat; /* 1, 2, 3, or 4 */
-};
-
-typedef struct HB_CaretValue_ HB_CaretValue;
-
-
-struct HB_LigGlyph_
-{
- HB_CaretValue* CaretValue; /* array of caret values */
- HB_UShort CaretCount; /* number of caret values */
- HB_Bool loaded;
-};
-
-
-HB_INTERNAL HB_Error
-_HB_GDEF_Add_Glyph_Property( HB_GDEFHeader* gdef,
- HB_UShort glyphID,
- HB_UShort property );
-
-HB_INTERNAL HB_Error
-_HB_GDEF_Check_Property( HB_GDEFHeader* gdef,
- HB_GlyphItem item,
- HB_UShort flags,
- HB_UShort* property );
-
-HB_INTERNAL HB_Error
-_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef,
- HB_Stream input,
- HB_Lookup* lo,
- HB_UShort num_lookups );
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GDEF_PRIVATE_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.c b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.c
deleted file mode 100644
index a4bf9352c7..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.c
+++ /dev/null
@@ -1,1163 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-gdef-private.h"
-#include "harfbuzz-open-private.h"
-
-static HB_Error Load_AttachList( HB_AttachList* al,
- HB_Stream stream );
-static HB_Error Load_LigCaretList( HB_LigCaretList* lcl,
- HB_Stream stream );
-
-static void Free_AttachList( HB_AttachList* al);
-static void Free_LigCaretList( HB_LigCaretList* lcl);
-
-static void Free_NewGlyphClasses( HB_GDEFHeader* gdef);
-
-
-
-/* GDEF glyph classes */
-
-#define UNCLASSIFIED_GLYPH 0
-#define SIMPLE_GLYPH 1
-#define LIGATURE_GLYPH 2
-#define MARK_GLYPH 3
-#define COMPONENT_GLYPH 4
-
-
-
-
-
-
-HB_Error HB_New_GDEF_Table( HB_GDEFHeader** retptr )
-{
- HB_Error error;
-
- HB_GDEFHeader* gdef;
-
- if ( !retptr )
- return ERR(HB_Err_Invalid_Argument);
-
- if ( ALLOC( gdef, sizeof( *gdef ) ) )
- return error;
-
- gdef->GlyphClassDef.loaded = FALSE;
- gdef->AttachList.loaded = FALSE;
- gdef->LigCaretList.loaded = FALSE;
- gdef->MarkAttachClassDef_offset = 0;
- gdef->MarkAttachClassDef.loaded = FALSE;
-
- gdef->LastGlyph = 0;
- gdef->NewGlyphClasses = NULL;
-
- *retptr = gdef;
-
- return HB_Err_Ok;
-}
-
-
-HB_Error HB_Load_GDEF_Table( HB_Stream stream,
- HB_GDEFHeader** retptr )
-{
- HB_Error error = HB_Err_Ok;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_GDEFHeader* gdef;
-
-
- if ( !retptr )
- return ERR(HB_Err_Invalid_Argument);
-
- if ( GOTO_Table( TTAG_GDEF ) )
- return error;
-
- if (( error = HB_New_GDEF_Table ( &gdef ) ))
- return error;
-
- base_offset = FILE_Pos();
-
- /* skip version */
-
- if ( FILE_Seek( base_offset + 4L ) ||
- ACCESS_Frame( 2L ) )
- goto Fail0;
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- /* all GDEF subtables are optional */
-
- if ( new_offset )
- {
- new_offset += base_offset;
-
- /* only classes 1-4 are allowed here */
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_ClassDefinition( &gdef->GlyphClassDef, 5,
- stream ) ) != HB_Err_Ok )
- goto Fail0;
- (void)FILE_Seek( cur_offset );
- }
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- {
- new_offset += base_offset;
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_AttachList( &gdef->AttachList,
- stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- {
- new_offset += base_offset;
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_LigCaretList( &gdef->LigCaretList,
- stream ) ) != HB_Err_Ok )
- goto Fail2;
- (void)FILE_Seek( cur_offset );
- }
-
- /* OpenType 1.2 has introduced the `MarkAttachClassDef' field. We
- first have to scan the LookupFlag values to find out whether we
- must load it or not. Here we only store the offset of the table. */
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- gdef->MarkAttachClassDef_offset = new_offset + base_offset;
- else
- gdef->MarkAttachClassDef_offset = 0;
-
- *retptr = gdef;
-
- return HB_Err_Ok;
-
-Fail3:
- Free_LigCaretList( &gdef->LigCaretList );
-
-Fail2:
- Free_AttachList( &gdef->AttachList );
-
-Fail1:
- _HB_OPEN_Free_ClassDefinition( &gdef->GlyphClassDef );
-
-Fail0:
- FREE( gdef );
-
- return error;
-}
-
-
-HB_Error HB_Done_GDEF_Table ( HB_GDEFHeader* gdef )
-{
- Free_LigCaretList( &gdef->LigCaretList );
- Free_AttachList( &gdef->AttachList );
- _HB_OPEN_Free_ClassDefinition( &gdef->GlyphClassDef );
- _HB_OPEN_Free_ClassDefinition( &gdef->MarkAttachClassDef );
-
- Free_NewGlyphClasses( gdef );
-
- FREE( gdef );
-
- return HB_Err_Ok;
-}
-
-
-
-
-/*******************************
- * AttachList related functions
- *******************************/
-
-
-/* AttachPoint */
-
-static HB_Error Load_AttachPoint( HB_AttachPoint* ap,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
- HB_UShort* pi;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = ap->PointCount = GET_UShort();
-
- FORGET_Frame();
-
- ap->PointIndex = NULL;
-
- if ( count )
- {
- if ( ALLOC_ARRAY( ap->PointIndex, count, HB_UShort ) )
- return error;
-
- pi = ap->PointIndex;
-
- if ( ACCESS_Frame( count * 2L ) )
- {
- FREE( pi );
- return error;
- }
-
- for ( n = 0; n < count; n++ )
- pi[n] = GET_UShort();
-
- FORGET_Frame();
- }
-
- return HB_Err_Ok;
-}
-
-
-static void Free_AttachPoint( HB_AttachPoint* ap )
-{
- FREE( ap->PointIndex );
-}
-
-
-/* AttachList */
-
-static HB_Error Load_AttachList( HB_AttachList* al,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_AttachPoint* ap;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &al->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = al->GlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- al->AttachPoint = NULL;
-
- if ( ALLOC_ARRAY( al->AttachPoint, count, HB_AttachPoint ) )
- goto Fail2;
-
- ap = al->AttachPoint;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_AttachPoint( &ap[n], stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- al->loaded = TRUE;
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_AttachPoint( &ap[m] );
-
- FREE( ap );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &al->Coverage );
- return error;
-}
-
-
-static void Free_AttachList( HB_AttachList* al)
-{
- HB_UShort n, count;
-
- HB_AttachPoint* ap;
-
-
- if ( !al->loaded )
- return;
-
- if ( al->AttachPoint )
- {
- count = al->GlyphCount;
- ap = al->AttachPoint;
-
- for ( n = 0; n < count; n++ )
- Free_AttachPoint( &ap[n] );
-
- FREE( ap );
- }
-
- _HB_OPEN_Free_Coverage( &al->Coverage );
-}
-
-
-
-/*********************************
- * LigCaretList related functions
- *********************************/
-
-
-/* CaretValueFormat1 */
-/* CaretValueFormat2 */
-/* CaretValueFormat3 */
-/* CaretValueFormat4 */
-
-static HB_Error Load_CaretValue( HB_CaretValue* cv,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UInt cur_offset, new_offset, base_offset;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- cv->CaretValueFormat = GET_UShort();
-
- FORGET_Frame();
-
- switch ( cv->CaretValueFormat )
- {
- case 1:
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- cv->cvf.cvf1.Coordinate = GET_Short();
-
- FORGET_Frame();
-
- break;
-
- case 2:
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- cv->cvf.cvf2.CaretValuePoint = GET_UShort();
-
- FORGET_Frame();
-
- break;
-
- case 3:
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- cv->cvf.cvf3.Coordinate = GET_Short();
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Device( &cv->cvf.cvf3.Device,
- stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- break;
-
- case 4:
- if ( ACCESS_Frame( 2L ) )
- return error;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- cv->cvf.cvf4.IdCaretValue = GET_UShort();
-#else
- (void) GET_UShort();
-#endif
-
- FORGET_Frame();
- break;
-
- default:
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok;
-}
-
-
-static void Free_CaretValue( HB_CaretValue* cv)
-{
- if ( cv->CaretValueFormat == 3 )
- _HB_OPEN_Free_Device( cv->cvf.cvf3.Device );
-}
-
-
-/* LigGlyph */
-
-static HB_Error Load_LigGlyph( HB_LigGlyph* lg,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_CaretValue* cv;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = lg->CaretCount = GET_UShort();
-
- FORGET_Frame();
-
- lg->CaretValue = NULL;
-
- if ( ALLOC_ARRAY( lg->CaretValue, count, HB_CaretValue ) )
- return error;
-
- cv = lg->CaretValue;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_CaretValue( &cv[n], stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_CaretValue( &cv[m] );
-
- FREE( cv );
- return error;
-}
-
-
-static void Free_LigGlyph( HB_LigGlyph* lg)
-{
- HB_UShort n, count;
-
- HB_CaretValue* cv;
-
-
- if ( lg->CaretValue )
- {
- count = lg->CaretCount;
- cv = lg->CaretValue;
-
- for ( n = 0; n < count; n++ )
- Free_CaretValue( &cv[n] );
-
- FREE( cv );
- }
-}
-
-
-/* LigCaretList */
-
-static HB_Error Load_LigCaretList( HB_LigCaretList* lcl,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort m, n, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_LigGlyph* lg;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &lcl->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = lcl->LigGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- lcl->LigGlyph = NULL;
-
- if ( ALLOC_ARRAY( lcl->LigGlyph, count, HB_LigGlyph ) )
- goto Fail2;
-
- lg = lcl->LigGlyph;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_LigGlyph( &lg[n], stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- lcl->loaded = TRUE;
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_LigGlyph( &lg[m] );
-
- FREE( lg );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &lcl->Coverage );
- return error;
-}
-
-
-static void Free_LigCaretList( HB_LigCaretList* lcl )
-{
- HB_UShort n, count;
-
- HB_LigGlyph* lg;
-
-
- if ( !lcl->loaded )
- return;
-
- if ( lcl->LigGlyph )
- {
- count = lcl->LigGlyphCount;
- lg = lcl->LigGlyph;
-
- for ( n = 0; n < count; n++ )
- Free_LigGlyph( &lg[n] );
-
- FREE( lg );
- }
-
- _HB_OPEN_Free_Coverage( &lcl->Coverage );
-}
-
-
-
-/***********
- * GDEF API
- ***********/
-
-
-static HB_UShort Get_New_Class( HB_GDEFHeader* gdef,
- HB_UShort glyphID,
- HB_UShort index )
-{
- HB_UShort glyph_index, array_index, count;
- HB_UShort byte, bits;
-
- HB_ClassRangeRecord* gcrr;
- HB_UShort** ngc;
-
-
- if ( glyphID >= gdef->LastGlyph )
- return 0;
-
- count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount;
- gcrr = gdef->GlyphClassDef.cd.cd2.ClassRangeRecord;
- ngc = gdef->NewGlyphClasses;
-
- if ( index < count && glyphID < gcrr[index].Start )
- {
- array_index = index;
- if ( index == 0 )
- glyph_index = glyphID;
- else
- glyph_index = glyphID - gcrr[index - 1].End - 1;
- }
- else
- {
- array_index = index + 1;
- glyph_index = glyphID - gcrr[index].End - 1;
- }
-
- byte = ngc[array_index][glyph_index / 4];
- bits = byte >> ( 16 - ( glyph_index % 4 + 1 ) * 4 );
-
- return bits & 0x000F;
-}
-
-
-
-HB_Error HB_GDEF_Get_Glyph_Property( HB_GDEFHeader* gdef,
- HB_UShort glyphID,
- HB_UShort* property )
-{
- HB_UShort class = 0, index = 0; /* shut compiler up */
-
- HB_Error error;
-
-
- if ( !gdef || !property )
- return ERR(HB_Err_Invalid_Argument);
-
- /* first, we check for mark attach classes */
-
- if ( gdef->MarkAttachClassDef.loaded )
- {
- error = _HB_OPEN_Get_Class( &gdef->MarkAttachClassDef, glyphID, &class, &index );
- if ( error && error != HB_Err_Not_Covered )
- return error;
- if ( !error )
- {
- *property = class << 8;
- return HB_Err_Ok;
- }
- }
-
- error = _HB_OPEN_Get_Class( &gdef->GlyphClassDef, glyphID, &class, &index );
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- /* if we have a constructed class table, check whether additional
- values have been assigned */
-
- if ( error == HB_Err_Not_Covered && gdef->NewGlyphClasses )
- class = Get_New_Class( gdef, glyphID, index );
-
- switch ( class )
- {
- default:
- case UNCLASSIFIED_GLYPH:
- *property = 0;
- break;
-
- case SIMPLE_GLYPH:
- *property = HB_GDEF_BASE_GLYPH;
- break;
-
- case LIGATURE_GLYPH:
- *property = HB_GDEF_LIGATURE;
- break;
-
- case MARK_GLYPH:
- *property = HB_GDEF_MARK;
- break;
-
- case COMPONENT_GLYPH:
- *property = HB_GDEF_COMPONENT;
- break;
- }
-
- return HB_Err_Ok;
-}
-
-
-static HB_Error Make_ClassRange( HB_ClassDefinition* cd,
- HB_UShort start,
- HB_UShort end,
- HB_UShort class )
-{
- HB_Error error;
- HB_UShort index;
-
- HB_ClassDefFormat2* cdf2;
- HB_ClassRangeRecord* crr;
-
-
- cdf2 = &cd->cd.cd2;
-
- if ( REALLOC_ARRAY( cdf2->ClassRangeRecord,
- cdf2->ClassRangeCount + 1 ,
- HB_ClassRangeRecord ) )
- return error;
-
- cdf2->ClassRangeCount++;
-
- crr = cdf2->ClassRangeRecord;
- index = cdf2->ClassRangeCount - 1;
-
- crr[index].Start = start;
- crr[index].End = end;
- crr[index].Class = class;
-
- return HB_Err_Ok;
-}
-
-
-
-HB_Error HB_GDEF_Build_ClassDefinition( HB_GDEFHeader* gdef,
- HB_UShort num_glyphs,
- HB_UShort glyph_count,
- HB_UShort* glyph_array,
- HB_UShort* class_array )
-{
- HB_UShort start, curr_glyph, curr_class;
- HB_UShort n, m, count;
- HB_Error error;
-
- HB_ClassDefinition* gcd;
- HB_ClassRangeRecord* gcrr;
- HB_UShort** ngc;
-
-
- if ( !gdef || !glyph_array || !class_array )
- return ERR(HB_Err_Invalid_Argument);
-
- gcd = &gdef->GlyphClassDef;
-
- /* We build a format 2 table */
-
- gcd->ClassFormat = 2;
-
- gcd->cd.cd2.ClassRangeCount = 0;
- gcd->cd.cd2.ClassRangeRecord = NULL;
-
- start = glyph_array[0];
- curr_class = class_array[0];
- curr_glyph = start;
-
- if ( curr_class >= 5 )
- {
- error = ERR(HB_Err_Invalid_Argument);
- goto Fail4;
- }
-
- glyph_count--;
-
- for ( n = 0; n < glyph_count + 1; n++ )
- {
- if ( curr_glyph == glyph_array[n] && curr_class == class_array[n] )
- {
- if ( n == glyph_count )
- {
- if ( ( error = Make_ClassRange( gcd, start,
- curr_glyph,
- curr_class) ) != HB_Err_Ok )
- goto Fail3;
- }
- else
- {
- if ( curr_glyph == 0xFFFF )
- {
- error = ERR(HB_Err_Invalid_Argument);
- goto Fail3;
- }
- else
- curr_glyph++;
- }
- }
- else
- {
- if ( ( error = Make_ClassRange( gcd, start,
- curr_glyph - 1,
- curr_class) ) != HB_Err_Ok )
- goto Fail3;
-
- if ( curr_glyph > glyph_array[n] )
- {
- error = ERR(HB_Err_Invalid_Argument);
- goto Fail3;
- }
-
- start = glyph_array[n];
- curr_class = class_array[n];
- curr_glyph = start;
-
- if ( curr_class >= 5 )
- {
- error = ERR(HB_Err_Invalid_Argument);
- goto Fail3;
- }
-
- if ( n == glyph_count )
- {
- if ( ( error = Make_ClassRange( gcd, start,
- curr_glyph,
- curr_class) ) != HB_Err_Ok )
- goto Fail3;
- }
- else
- {
- if ( curr_glyph == 0xFFFF )
- {
- error = ERR(HB_Err_Invalid_Argument);
- goto Fail3;
- }
- else
- curr_glyph++;
- }
- }
- }
-
- /* now prepare the arrays for class values assigned during the lookup
- process */
-
- if ( ALLOC_ARRAY( gdef->NewGlyphClasses,
- gcd->cd.cd2.ClassRangeCount + 1, HB_UShort* ) )
- goto Fail3;
-
- count = gcd->cd.cd2.ClassRangeCount;
- gcrr = gcd->cd.cd2.ClassRangeRecord;
- ngc = gdef->NewGlyphClasses;
-
- /* We allocate arrays for all glyphs not covered by the class range
- records. Each element holds four class values. */
-
- if ( count > 0 )
- {
- if ( gcrr[0].Start )
- {
- if ( ALLOC_ARRAY( ngc[0], ( gcrr[0].Start + 3 ) / 4, HB_UShort ) )
- goto Fail2;
- }
-
- for ( n = 1; n < count; n++ )
- {
- if ( gcrr[n].Start - gcrr[n - 1].End > 1 )
- if ( ALLOC_ARRAY( ngc[n],
- ( gcrr[n].Start - gcrr[n - 1].End + 2 ) / 4,
- HB_UShort ) )
- goto Fail1;
- }
-
- if ( gcrr[count - 1].End != num_glyphs - 1 )
- {
- if ( ALLOC_ARRAY( ngc[count],
- ( num_glyphs - gcrr[count - 1].End + 2 ) / 4,
- HB_UShort ) )
- goto Fail1;
- }
- }
- else if ( num_glyphs > 0 )
- {
- if ( ALLOC_ARRAY( ngc[count],
- ( num_glyphs + 3 ) / 4,
- HB_UShort ) )
- goto Fail2;
- }
-
- gdef->LastGlyph = num_glyphs - 1;
-
- gdef->MarkAttachClassDef_offset = 0L;
- gdef->MarkAttachClassDef.loaded = FALSE;
-
- gcd->loaded = TRUE;
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- FREE( ngc[m] );
-
-Fail2:
- FREE( gdef->NewGlyphClasses );
-
-Fail3:
- FREE( gcd->cd.cd2.ClassRangeRecord );
-
-Fail4:
- return error;
-}
-
-
-static void Free_NewGlyphClasses( HB_GDEFHeader* gdef )
-{
- HB_UShort** ngc;
- HB_UShort n, count;
-
-
- if ( gdef->NewGlyphClasses )
- {
- count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount + 1;
- ngc = gdef->NewGlyphClasses;
-
- for ( n = 0; n < count; n++ )
- FREE( ngc[n] );
-
- FREE( ngc );
- }
-}
-
-
-HB_INTERNAL HB_Error
-_HB_GDEF_Add_Glyph_Property( HB_GDEFHeader* gdef,
- HB_UShort glyphID,
- HB_UShort property )
-{
- HB_Error error;
- HB_UShort class, new_class, index = 0; /* shut compiler up */
- HB_UShort byte, bits, mask;
- HB_UShort array_index, glyph_index, count;
-
- HB_ClassRangeRecord* gcrr;
- HB_UShort** ngc;
-
-
- error = _HB_OPEN_Get_Class( &gdef->GlyphClassDef, glyphID, &class, &index );
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- /* we don't accept glyphs covered in `GlyphClassDef' */
-
- if ( !error )
- return HB_Err_Not_Covered;
-
- switch ( property )
- {
- case 0:
- new_class = UNCLASSIFIED_GLYPH;
- break;
-
- case HB_GDEF_BASE_GLYPH:
- new_class = SIMPLE_GLYPH;
- break;
-
- case HB_GDEF_LIGATURE:
- new_class = LIGATURE_GLYPH;
- break;
-
- case HB_GDEF_MARK:
- new_class = MARK_GLYPH;
- break;
-
- case HB_GDEF_COMPONENT:
- new_class = COMPONENT_GLYPH;
- break;
-
- default:
- return ERR(HB_Err_Invalid_Argument);
- }
-
- count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount;
- gcrr = gdef->GlyphClassDef.cd.cd2.ClassRangeRecord;
- ngc = gdef->NewGlyphClasses;
-
- if ( index < count && glyphID < gcrr[index].Start )
- {
- array_index = index;
- if ( index == 0 )
- glyph_index = glyphID;
- else
- glyph_index = glyphID - gcrr[index - 1].End - 1;
- }
- else
- {
- array_index = index + 1;
- glyph_index = glyphID - gcrr[index].End - 1;
- }
-
- byte = ngc[array_index][glyph_index / 4];
- bits = byte >> ( 16 - ( glyph_index % 4 + 1 ) * 4 );
- class = bits & 0x000F;
-
- /* we don't overwrite existing entries */
-
- if ( !class )
- {
- bits = new_class << ( 16 - ( glyph_index % 4 + 1 ) * 4 );
- mask = ~( 0x000F << ( 16 - ( glyph_index % 4 + 1 ) * 4 ) );
-
- ngc[array_index][glyph_index / 4] &= mask;
- ngc[array_index][glyph_index / 4] |= bits;
- }
-
- return HB_Err_Ok;
-}
-
-
-HB_INTERNAL HB_Error
-_HB_GDEF_Check_Property( HB_GDEFHeader* gdef,
- HB_GlyphItem gitem,
- HB_UShort flags,
- HB_UShort* property )
-{
- HB_Error error;
-
- if ( gdef )
- {
- HB_UShort basic_glyph_class;
- HB_UShort desired_attachment_class;
-
- if ( gitem->gproperties == HB_GLYPH_PROPERTIES_UNKNOWN )
- {
- error = HB_GDEF_Get_Glyph_Property( gdef, gitem->gindex, &gitem->gproperties );
- if ( error )
- return error;
- }
-
- *property = gitem->gproperties;
-
- /* If the glyph was found in the MarkAttachmentClass table,
- * then that class value is the high byte of the result,
- * otherwise the low byte contains the basic type of the glyph
- * as defined by the GlyphClassDef table.
- */
- if ( *property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS )
- basic_glyph_class = HB_GDEF_MARK;
- else
- basic_glyph_class = *property;
-
- /* Return Not_Covered, if, for example, basic_glyph_class
- * is HB_GDEF_LIGATURE and LookFlags includes HB_LOOKUP_FLAG_IGNORE_LIGATURES
- */
- if ( flags & basic_glyph_class )
- return HB_Err_Not_Covered;
-
- /* The high byte of LookupFlags has the meaning
- * "ignore marks of attachment type different than
- * the attachment type specified."
- */
- desired_attachment_class = flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS;
- if ( desired_attachment_class )
- {
- if ( basic_glyph_class == HB_GDEF_MARK &&
- *property != desired_attachment_class )
- return HB_Err_Not_Covered;
- }
- } else {
- *property = 0;
- }
-
- return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_Error
-_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef,
- HB_Stream stream,
- HB_Lookup* lo,
- HB_UShort num_lookups)
-{
- HB_Error error = HB_Err_Ok;
- HB_UShort i;
-
- /* We now check the LookupFlags for values larger than 0xFF to find
- out whether we need to load the `MarkAttachClassDef' field of the
- GDEF table -- this hack is necessary for OpenType 1.2 tables since
- the version field of the GDEF table hasn't been incremented.
-
- For constructed GDEF tables, we only load it if
- `MarkAttachClassDef_offset' is not zero (nevertheless, a build of
- a constructed mark attach table is not supported currently). */
-
- if ( gdef &&
- gdef->MarkAttachClassDef_offset && !gdef->MarkAttachClassDef.loaded )
- {
- for ( i = 0; i < num_lookups; i++ )
- {
-
- if ( lo[i].LookupFlag & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS )
- {
- if ( FILE_Seek( gdef->MarkAttachClassDef_offset ) ||
- ( error = _HB_OPEN_Load_ClassDefinition( &gdef->MarkAttachClassDef,
- 256, stream ) ) != HB_Err_Ok )
- goto Done;
-
- break;
- }
- }
- }
-
-Done:
- return error;
-}
-
-/* END */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h
deleted file mode 100644
index ccb6bf9734..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GDEF_H
-#define HARFBUZZ_GDEF_H
-
-#include "harfbuzz-open.h"
-#include "harfbuzz-stream.h"
-
-HB_BEGIN_HEADER
-
-/* GDEF glyph properties. Note that HB_GDEF_COMPONENT has no corresponding
- * flag in the LookupFlag field. */
-#define HB_GDEF_BASE_GLYPH 0x0002
-#define HB_GDEF_LIGATURE 0x0004
-#define HB_GDEF_MARK 0x0008
-#define HB_GDEF_COMPONENT 0x0010
-
-
-typedef struct HB_AttachPoint_ HB_AttachPoint;
-
-
-struct HB_AttachList_
-{
- HB_AttachPoint* AttachPoint; /* array of AttachPoint tables */
- HB_Coverage Coverage; /* Coverage table */
- HB_UShort GlyphCount; /* number of glyphs with
- attachments */
- HB_Bool loaded;
-};
-
-typedef struct HB_AttachList_ HB_AttachList;
-
-typedef struct HB_LigGlyph_ HB_LigGlyph;
-
-struct HB_LigCaretList_
-{
- HB_LigGlyph* LigGlyph; /* array of LigGlyph tables */
- HB_Coverage Coverage; /* Coverage table */
- HB_UShort LigGlyphCount; /* number of ligature glyphs */
- HB_Bool loaded;
-};
-
-typedef struct HB_LigCaretList_ HB_LigCaretList;
-
-
-
-/* The `NewGlyphClasses' field is not defined in the TTO specification.
- We use it for fonts with a constructed `GlyphClassDef' structure
- (i.e., which don't have a GDEF table) to collect glyph classes
- assigned during the lookup process. The number of arrays in this
- pointer array is GlyphClassDef->cd.cd2.ClassRangeCount+1; the nth
- array then contains the glyph class values of the glyphs not covered
- by the ClassRangeRecords structures with index n-1 and n. We store
- glyph class values for four glyphs in a single array element.
-
- `LastGlyph' is identical to the number of glyphs minus one in the
- font; we need it only if `NewGlyphClasses' is not NULL (to have an
- upper bound for the last array).
-
- Note that we first store the file offset to the `MarkAttachClassDef'
- field (which has been introduced in OpenType 1.2) -- since the
- `Version' field value hasn't been increased to indicate that we have
- one more field for some obscure reason, we must parse the GSUB table
- to find out whether class values refer to this table. Only then we
- can finally load the MarkAttachClassDef structure if necessary. */
-
-struct HB_GDEFHeader_
-{
- HB_UShort** NewGlyphClasses;
- HB_UInt offset;
- HB_UInt MarkAttachClassDef_offset;
-
- HB_16Dot16 Version;
-
- HB_ClassDefinition GlyphClassDef;
- HB_AttachList AttachList;
- HB_LigCaretList LigCaretList;
- HB_ClassDefinition MarkAttachClassDef; /* new in OT 1.2 */
-
- HB_UShort LastGlyph;
-};
-
-typedef struct HB_GDEFHeader_ HB_GDEFHeader;
-typedef struct HB_GDEFHeader_* HB_GDEF;
-
-
-HB_Error HB_New_GDEF_Table( HB_GDEFHeader** retptr );
-
-
-HB_Error HB_Load_GDEF_Table( HB_Stream stream,
- HB_GDEFHeader** gdef );
-
-
-HB_Error HB_Done_GDEF_Table ( HB_GDEFHeader* gdef );
-
-
-HB_Error HB_GDEF_Get_Glyph_Property( HB_GDEFHeader* gdef,
- HB_UShort glyphID,
- HB_UShort* property );
-
-HB_Error HB_GDEF_Build_ClassDefinition( HB_GDEFHeader* gdef,
- HB_UShort num_glyphs,
- HB_UShort glyph_count,
- HB_UShort* glyph_array,
- HB_UShort* class_array );
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GDEF_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-global.h b/src/3rdparty/harfbuzz/src/harfbuzz-global.h
deleted file mode 100644
index 69e0666b8a..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-global.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#ifndef HARFBUZZ_GLOBAL_H
-#define HARFBUZZ_GLOBAL_H
-
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef __cplusplus
-#define HB_BEGIN_HEADER extern "C" {
-#define HB_END_HEADER }
-#else
-#define HB_BEGIN_HEADER /* nothing */
-#define HB_END_HEADER /* nothing */
-#endif
-
-HB_BEGIN_HEADER
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#ifndef TRUE
-#define TRUE (!FALSE)
-#endif
-
-#define HB_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
- ( ( (HB_UInt)_x1 << 24 ) | \
- ( (HB_UInt)_x2 << 16 ) | \
- ( (HB_UInt)_x3 << 8 ) | \
- (HB_UInt)_x4 )
-
-typedef char hb_int8;
-typedef unsigned char hb_uint8;
-typedef short hb_int16;
-typedef unsigned short hb_uint16;
-typedef int hb_int32;
-typedef unsigned int hb_uint32;
-
-typedef hb_uint8 HB_Bool;
-
-typedef hb_uint8 HB_Byte;
-typedef hb_uint16 HB_UShort;
-typedef hb_uint32 HB_UInt;
-typedef hb_int8 HB_Char;
-typedef hb_int16 HB_Short;
-typedef hb_int32 HB_Int;
-
-typedef hb_uint16 HB_UChar16;
-typedef hb_uint32 HB_UChar32;
-typedef hb_uint32 HB_Glyph;
-typedef hb_int32 HB_Fixed; /* 26.6 */
-
-#define HB_FIXED_CONSTANT(v) ((v) * 64)
-#define HB_FIXED_ROUND(v) (((v)+32) & -64)
-
-typedef hb_int32 HB_16Dot16; /* 16.16 */
-
-typedef void * HB_Pointer;
-typedef hb_uint32 HB_Tag;
-
-typedef enum {
- /* no error */
- HB_Err_Ok = 0x0000,
- HB_Err_Not_Covered = 0xFFFF,
-
- /* _hb_err() is called whenever returning the following errors,
- * and in a couple places for HB_Err_Not_Covered too. */
-
- /* programmer error */
- HB_Err_Invalid_Argument = 0x1A66,
-
- /* font error */
- HB_Err_Invalid_SubTable_Format = 0x157F,
- HB_Err_Invalid_SubTable = 0x1570,
- HB_Err_Read_Error = 0x6EAD,
-
- /* system error */
- HB_Err_Out_Of_Memory = 0xDEAD
-} HB_Error;
-
-typedef struct {
- HB_Fixed x;
- HB_Fixed y;
-} HB_FixedPoint;
-
-typedef struct HB_Font_ *HB_Font;
-typedef struct HB_StreamRec_ *HB_Stream;
-typedef struct HB_FaceRec_ *HB_Face;
-
-HB_END_HEADER
-
-#endif
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h
deleted file mode 100644
index 9f0fecd61e..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h
+++ /dev/null
@@ -1,733 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GPOS_PRIVATE_H
-#define HARFBUZZ_GPOS_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-stream-private.h"
-#include "harfbuzz-gpos.h"
-
-HB_BEGIN_HEADER
-
-/* shared tables */
-
-#define VR_X_PLACEMENT_DEVICE 0
-#define VR_Y_PLACEMENT_DEVICE 1
-#define VR_X_ADVANCE_DEVICE 2
-#define VR_Y_ADVANCE_DEVICE 3
-
-#ifndef HB_SUPPORT_MULTIPLE_MASTER
-# define HB_USE_FLEXIBLE_VALUE_RECORD
-#endif
-
-struct HB_ValueRecord_
-{
- HB_Short XPlacement; /* horizontal adjustment for
- placement */
- HB_Short YPlacement; /* vertical adjustment for
- placement */
- HB_Short XAdvance; /* horizontal adjustment for
- advance */
- HB_Short YAdvance; /* vertical adjustment for
- advance */
-
- HB_Device** DeviceTables; /* device tables for placement
- and advance */
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- HB_UShort XIdPlacement; /* horizontal placement metric ID */
- HB_UShort YIdPlacement; /* vertical placement metric ID */
- HB_UShort XIdAdvance; /* horizontal advance metric ID */
- HB_UShort YIdAdvance; /* vertical advance metric ID */
-#endif
-};
-
-typedef struct HB_ValueRecord_ HB_ValueRecord;
-
-
-/* Mask values to scan the value format of the ValueRecord structure.
- We always expand compressed ValueRecords of the font. */
-
-#define HB_GPOS_FORMAT_HAVE_DEVICE_TABLES 0x00F0
-
-#define HB_GPOS_FORMAT_HAVE_X_PLACEMENT 0x0001
-#define HB_GPOS_FORMAT_HAVE_Y_PLACEMENT 0x0002
-#define HB_GPOS_FORMAT_HAVE_X_ADVANCE 0x0004
-#define HB_GPOS_FORMAT_HAVE_Y_ADVANCE 0x0008
-#define HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE 0x0010
-#define HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE 0x0020
-#define HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE 0x0040
-#define HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE 0x0080
-#define HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT 0x0100
-#define HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT 0x0200
-#define HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE 0x0400
-#define HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE 0x0800
-
-
-struct HB_AnchorFormat1_
-{
- HB_Short XCoordinate; /* horizontal value */
- HB_Short YCoordinate; /* vertical value */
-};
-
-typedef struct HB_AnchorFormat1_ HB_AnchorFormat1;
-
-
-struct HB_AnchorFormat2_
-{
- HB_Short XCoordinate; /* horizontal value */
- HB_Short YCoordinate; /* vertical value */
- HB_UShort AnchorPoint; /* index to glyph contour point */
-};
-
-typedef struct HB_AnchorFormat2_ HB_AnchorFormat2;
-
-#define AF3_X_DEVICE_TABLE 0
-#define AF3_Y_DEVICE_TABLE 1
-
-struct HB_AnchorFormat3_
-{
- HB_Short XCoordinate; /* horizontal value */
- HB_Short YCoordinate; /* vertical value */
- HB_Device** DeviceTables; /* device tables for coordinates */
-};
-
-typedef struct HB_AnchorFormat3_ HB_AnchorFormat3;
-
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-struct HB_AnchorFormat4_
-{
- HB_UShort XIdAnchor; /* horizontal metric ID */
- HB_UShort YIdAnchor; /* vertical metric ID */
-};
-
-typedef struct HB_AnchorFormat4_ HB_AnchorFormat4;
-#endif
-
-
-struct HB_Anchor_
-{
- HB_Byte PosFormat; /* 1, 2, 3, or 4 -- 0 indicates
- that there is no Anchor table */
-
- union
- {
- HB_AnchorFormat1 af1;
- HB_AnchorFormat2 af2;
- HB_AnchorFormat3 af3;
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- HB_AnchorFormat4 af4;
-#endif
- } af;
-};
-
-typedef struct HB_Anchor_ HB_Anchor;
-
-
-struct HB_MarkRecord_
-{
- HB_UShort Class; /* mark class */
- HB_Anchor MarkAnchor; /* anchor table */
-};
-
-typedef struct HB_MarkRecord_ HB_MarkRecord;
-
-
-struct HB_MarkArray_
-{
- HB_UShort MarkCount; /* number of MarkRecord tables */
- HB_MarkRecord* MarkRecord; /* array of MarkRecord tables */
-};
-
-typedef struct HB_MarkArray_ HB_MarkArray;
-
-
-/* LookupType 1 */
-
-struct HB_SinglePosFormat1_
-{
- HB_ValueRecord Value; /* ValueRecord for all covered
- glyphs */
-};
-
-typedef struct HB_SinglePosFormat1_ HB_SinglePosFormat1;
-
-
-struct HB_SinglePosFormat2_
-{
- HB_UShort ValueCount; /* number of ValueRecord tables */
- HB_ValueRecord* Value; /* array of ValueRecord tables */
-};
-
-typedef struct HB_SinglePosFormat2_ HB_SinglePosFormat2;
-
-
-struct HB_SinglePos_
-{
- HB_Byte PosFormat; /* 1 or 2 */
- HB_Coverage Coverage; /* Coverage table */
-
- HB_UShort ValueFormat; /* format of ValueRecord table */
-
- union
- {
- HB_SinglePosFormat1 spf1;
- HB_SinglePosFormat2 spf2;
- } spf;
-};
-
-typedef struct HB_SinglePos_ HB_SinglePos;
-
-
-/* LookupType 2 */
-
-struct HB_PairValueRecord_
-{
- HB_UShort SecondGlyph; /* glyph ID for second glyph */
- HB_ValueRecord Value1; /* pos. data for first glyph */
- HB_ValueRecord Value2; /* pos. data for second glyph */
-};
-
-typedef struct HB_PairValueRecord_ HB_PairValueRecord;
-
-
-struct HB_PairSet_
-{
- HB_UShort PairValueCount;
- /* number of PairValueRecord tables */
-#ifndef HB_USE_FLEXIBLE_VALUE_RECORD
- HB_PairValueRecord* PairValueRecord;
- /* array of PairValueRecord tables */
-#else
- HB_Short* ValueRecords;
-#endif
-};
-
-typedef struct HB_PairSet_ HB_PairSet;
-
-
-struct HB_PairPosFormat1_
-{
- HB_UShort PairSetCount; /* number of PairSet tables */
- HB_PairSet* PairSet; /* array of PairSet tables */
-};
-
-typedef struct HB_PairPosFormat1_ HB_PairPosFormat1;
-
-
-struct HB_Class2Record_
-{
- HB_ValueRecord Value1; /* pos. data for first glyph */
- HB_ValueRecord Value2; /* pos. data for second glyph */
-};
-
-typedef struct HB_Class2Record_ HB_Class2Record;
-
-
-struct HB_Class1Record_
-{
- hb_uint8 IsFlexible;
- union {
- HB_Class2Record* Class2Record; /* array of Class2Record tables */
- HB_Short* ValueRecords;
- } c2r;
-};
-
-typedef struct HB_Class1Record_ HB_Class1Record;
-
-
-struct HB_PairPosFormat2_
-{
- HB_ClassDefinition ClassDef1; /* class def. for first glyph */
- HB_ClassDefinition ClassDef2; /* class def. for second glyph */
- HB_UShort Class1Count; /* number of classes in ClassDef1
- table */
- HB_UShort Class2Count; /* number of classes in ClassDef2
- table */
- HB_Class1Record* Class1Record; /* array of Class1Record tables */
-};
-
-typedef struct HB_PairPosFormat2_ HB_PairPosFormat2;
-
-
-struct HB_PairPos_
-{
- HB_Byte PosFormat; /* 1 or 2 */
- HB_Coverage Coverage; /* Coverage table */
- HB_UShort ValueFormat1; /* format of ValueRecord table
- for first glyph */
- HB_UShort ValueFormat2; /* format of ValueRecord table
- for second glyph */
-
- union
- {
- HB_PairPosFormat1 ppf1;
- HB_PairPosFormat2 ppf2;
- } ppf;
-};
-
-typedef struct HB_PairPos_ HB_PairPos;
-
-
-/* LookupType 3 */
-
-struct HB_EntryExitRecord_
-{
- HB_Anchor EntryAnchor; /* entry Anchor table */
- HB_Anchor ExitAnchor; /* exit Anchor table */
-};
-
-
-typedef struct HB_EntryExitRecord_ HB_EntryExitRecord;
-
-struct HB_CursivePos_
-{
- HB_UShort PosFormat; /* always 1 */
- HB_Coverage Coverage; /* Coverage table */
- HB_UShort EntryExitCount;
- /* number of EntryExitRecord tables */
- HB_EntryExitRecord* EntryExitRecord;
- /* array of EntryExitRecord tables */
-};
-
-typedef struct HB_CursivePos_ HB_CursivePos;
-
-
-/* LookupType 4 */
-
-struct HB_BaseRecord_
-{
- HB_Anchor* BaseAnchor; /* array of base glyph anchor
- tables */
-};
-
-typedef struct HB_BaseRecord_ HB_BaseRecord;
-
-
-struct HB_BaseArray_
-{
- HB_UShort BaseCount; /* number of BaseRecord tables */
- HB_BaseRecord* BaseRecord; /* array of BaseRecord tables */
-};
-
-typedef struct HB_BaseArray_ HB_BaseArray;
-
-
-struct HB_MarkBasePos_
-{
- HB_UShort PosFormat; /* always 1 */
- HB_Coverage MarkCoverage; /* mark glyph coverage table */
- HB_Coverage BaseCoverage; /* base glyph coverage table */
- HB_UShort ClassCount; /* number of mark classes */
- HB_MarkArray MarkArray; /* mark array table */
- HB_BaseArray BaseArray; /* base array table */
-};
-
-typedef struct HB_MarkBasePos_ HB_MarkBasePos;
-
-
-/* LookupType 5 */
-
-struct HB_ComponentRecord_
-{
- HB_Anchor* LigatureAnchor; /* array of ligature glyph anchor
- tables */
-};
-
-typedef struct HB_ComponentRecord_ HB_ComponentRecord;
-
-
-struct HB_LigatureAttach_
-{
- HB_UShort ComponentCount;
- /* number of ComponentRecord tables */
- HB_ComponentRecord* ComponentRecord;
- /* array of ComponentRecord tables */
-};
-
-typedef struct HB_LigatureAttach_ HB_LigatureAttach;
-
-
-struct HB_LigatureArray_
-{
- HB_UShort LigatureCount; /* number of LigatureAttach tables */
- HB_LigatureAttach* LigatureAttach;
- /* array of LigatureAttach tables */
-};
-
-typedef struct HB_LigatureArray_ HB_LigatureArray;
-
-
-struct HB_MarkLigPos_
-{
- HB_UShort PosFormat; /* always 1 */
- HB_Coverage MarkCoverage; /* mark glyph coverage table */
- HB_Coverage LigatureCoverage;
- /* ligature glyph coverage table */
- HB_UShort ClassCount; /* number of mark classes */
- HB_MarkArray MarkArray; /* mark array table */
- HB_LigatureArray LigatureArray; /* ligature array table */
-};
-
-typedef struct HB_MarkLigPos_ HB_MarkLigPos;
-
-
-/* LookupType 6 */
-
-struct HB_Mark2Record_
-{
- HB_Anchor* Mark2Anchor; /* array of mark glyph anchor
- tables */
-};
-
-typedef struct HB_Mark2Record_ HB_Mark2Record;
-
-
-struct HB_Mark2Array_
-{
- HB_UShort Mark2Count; /* number of Mark2Record tables */
- HB_Mark2Record* Mark2Record; /* array of Mark2Record tables */
-};
-
-typedef struct HB_Mark2Array_ HB_Mark2Array;
-
-
-struct HB_MarkMarkPos_
-{
- HB_UShort PosFormat; /* always 1 */
- HB_Coverage Mark1Coverage; /* first mark glyph coverage table */
- HB_Coverage Mark2Coverage; /* second mark glyph coverave table */
- HB_UShort ClassCount; /* number of combining mark classes */
- HB_MarkArray Mark1Array; /* MarkArray table for first mark */
- HB_Mark2Array Mark2Array; /* MarkArray table for second mark */
-};
-
-typedef struct HB_MarkMarkPos_ HB_MarkMarkPos;
-
-
-/* needed by both lookup type 7 and 8 */
-
-struct HB_PosLookupRecord_
-{
- HB_UShort SequenceIndex; /* index into current
- glyph sequence */
- HB_UShort LookupListIndex; /* Lookup to apply to that pos. */
-};
-
-typedef struct HB_PosLookupRecord_ HB_PosLookupRecord;
-
-
-/* LookupType 7 */
-
-struct HB_PosRule_
-{
- HB_UShort GlyphCount; /* total number of input glyphs */
- HB_UShort PosCount; /* number of PosLookupRecord tables */
- HB_UShort* Input; /* array of input glyph IDs */
- HB_PosLookupRecord* PosLookupRecord;
- /* array of PosLookupRecord tables */
-};
-
-typedef struct HB_PosRule_ HB_PosRule;
-
-
-struct HB_PosRuleSet_
-{
- HB_UShort PosRuleCount; /* number of PosRule tables */
- HB_PosRule* PosRule; /* array of PosRule tables */
-};
-
-typedef struct HB_PosRuleSet_ HB_PosRuleSet;
-
-
-struct HB_ContextPosFormat1_
-{
- HB_Coverage Coverage; /* Coverage table */
- HB_UShort PosRuleSetCount; /* number of PosRuleSet tables */
- HB_PosRuleSet* PosRuleSet; /* array of PosRuleSet tables */
-};
-
-typedef struct HB_ContextPosFormat1_ HB_ContextPosFormat1;
-
-
-struct HB_PosClassRule_
-{
- HB_UShort GlyphCount; /* total number of context classes */
- HB_UShort PosCount; /* number of PosLookupRecord tables */
- HB_UShort* Class; /* array of classes */
- HB_PosLookupRecord* PosLookupRecord;
- /* array of PosLookupRecord tables */
-};
-
-typedef struct HB_PosClassRule_ HB_PosClassRule;
-
-
-struct HB_PosClassSet_
-{
- HB_UShort PosClassRuleCount;
- /* number of PosClassRule tables */
- HB_PosClassRule* PosClassRule; /* array of PosClassRule tables */
-};
-
-typedef struct HB_PosClassSet_ HB_PosClassSet;
-
-
-/* The `MaxContextLength' field is not defined in the TTO specification
- but simplifies the implementation of this format. It holds the
- maximal context length used in the context rules. */
-
-struct HB_ContextPosFormat2_
-{
- HB_UShort MaxContextLength;
- /* maximal context length */
- HB_Coverage Coverage; /* Coverage table */
- HB_ClassDefinition ClassDef; /* ClassDef table */
- HB_UShort PosClassSetCount;
- /* number of PosClassSet tables */
- HB_PosClassSet* PosClassSet; /* array of PosClassSet tables */
-};
-
-typedef struct HB_ContextPosFormat2_ HB_ContextPosFormat2;
-
-
-struct HB_ContextPosFormat3_
-{
- HB_UShort GlyphCount; /* number of input glyphs */
- HB_UShort PosCount; /* number of PosLookupRecord tables */
- HB_Coverage* Coverage; /* array of Coverage tables */
- HB_PosLookupRecord* PosLookupRecord;
- /* array of PosLookupRecord tables */
-};
-
-typedef struct HB_ContextPosFormat3_ HB_ContextPosFormat3;
-
-
-struct HB_ContextPos_
-{
- HB_Byte PosFormat; /* 1, 2, or 3 */
-
- union
- {
- HB_ContextPosFormat1 cpf1;
- HB_ContextPosFormat2 cpf2;
- HB_ContextPosFormat3 cpf3;
- } cpf;
-};
-
-typedef struct HB_ContextPos_ HB_ContextPos;
-
-
-/* LookupType 8 */
-
-struct HB_ChainPosRule_
-{
- HB_UShort* Backtrack; /* array of backtrack glyph IDs */
- HB_UShort* Input; /* array of input glyph IDs */
- HB_UShort* Lookahead; /* array of lookahead glyph IDs */
- HB_PosLookupRecord* PosLookupRecord;
- /* array of PosLookupRecords */
- HB_UShort BacktrackGlyphCount;
- /* total number of backtrack glyphs */
- HB_UShort InputGlyphCount;
- /* total number of input glyphs */
- HB_UShort LookaheadGlyphCount;
- /* total number of lookahead glyphs */
- HB_UShort PosCount; /* number of PosLookupRecords */
-};
-
-typedef struct HB_ChainPosRule_ HB_ChainPosRule;
-
-
-struct HB_ChainPosRuleSet_
-{
- HB_UShort ChainPosRuleCount;
- /* number of ChainPosRule tables */
- HB_ChainPosRule* ChainPosRule; /* array of ChainPosRule tables */
-};
-
-typedef struct HB_ChainPosRuleSet_ HB_ChainPosRuleSet;
-
-
-struct HB_ChainContextPosFormat1_
-{
- HB_Coverage Coverage; /* Coverage table */
- HB_UShort ChainPosRuleSetCount;
- /* number of ChainPosRuleSet tables */
- HB_ChainPosRuleSet* ChainPosRuleSet;
- /* array of ChainPosRuleSet tables */
-};
-
-typedef struct HB_ChainContextPosFormat1_ HB_ChainContextPosFormat1;
-
-
-struct HB_ChainPosClassRule_
-{
- HB_UShort* Backtrack; /* array of backtrack classes */
- HB_UShort* Input; /* array of context classes */
- HB_UShort* Lookahead; /* array of lookahead classes */
- HB_PosLookupRecord* PosLookupRecord;
- /* array of substitution lookups */
- HB_UShort BacktrackGlyphCount;
- /* total number of backtrack
- classes */
- HB_UShort InputGlyphCount;
- /* total number of context classes */
- HB_UShort LookaheadGlyphCount;
- /* total number of lookahead
- classes */
- HB_UShort PosCount; /* number of PosLookupRecords */
-};
-
-typedef struct HB_ChainPosClassRule_ HB_ChainPosClassRule;
-
-
-struct HB_ChainPosClassSet_
-{
- HB_UShort ChainPosClassRuleCount;
- /* number of ChainPosClassRule
- tables */
- HB_ChainPosClassRule* ChainPosClassRule;
- /* array of ChainPosClassRule
- tables */
-};
-
-typedef struct HB_ChainPosClassSet_ HB_ChainPosClassSet;
-
-
-/* The `MaxXXXLength' fields are not defined in the TTO specification
- but simplifies the implementation of this format. It holds the
- maximal context length used in the specific context rules. */
-
-struct HB_ChainContextPosFormat2_
-{
- HB_Coverage Coverage; /* Coverage table */
-
- HB_UShort MaxBacktrackLength;
- /* maximal backtrack length */
- HB_ClassDefinition BacktrackClassDef;
- /* BacktrackClassDef table */
- HB_UShort MaxInputLength;
- /* maximal input length */
- HB_ClassDefinition InputClassDef;
- /* InputClassDef table */
- HB_UShort MaxLookaheadLength;
- /* maximal lookahead length */
- HB_ClassDefinition LookaheadClassDef;
- /* LookaheadClassDef table */
-
- HB_UShort ChainPosClassSetCount;
- /* number of ChainPosClassSet
- tables */
- HB_ChainPosClassSet* ChainPosClassSet;
- /* array of ChainPosClassSet
- tables */
-};
-
-typedef struct HB_ChainContextPosFormat2_ HB_ChainContextPosFormat2;
-
-
-struct HB_ChainContextPosFormat3_
-{
- HB_UShort BacktrackGlyphCount;
- /* number of backtrack glyphs */
- HB_Coverage* BacktrackCoverage;
- /* array of backtrack Coverage
- tables */
- HB_UShort InputGlyphCount;
- /* number of input glyphs */
- HB_Coverage* InputCoverage;
- /* array of input coverage
- tables */
- HB_UShort LookaheadGlyphCount;
- /* number of lookahead glyphs */
- HB_Coverage* LookaheadCoverage;
- /* array of lookahead coverage
- tables */
- HB_UShort PosCount; /* number of PosLookupRecords */
- HB_PosLookupRecord* PosLookupRecord;
- /* array of substitution lookups */
-};
-
-typedef struct HB_ChainContextPosFormat3_ HB_ChainContextPosFormat3;
-
-
-struct HB_ChainContextPos_
-{
- HB_Byte PosFormat; /* 1, 2, or 3 */
-
- union
- {
- HB_ChainContextPosFormat1 ccpf1;
- HB_ChainContextPosFormat2 ccpf2;
- HB_ChainContextPosFormat3 ccpf3;
- } ccpf;
-};
-
-typedef struct HB_ChainContextPos_ HB_ChainContextPos;
-
-
-#if 0
-/* LookupType 10 */
-struct HB_ExtensionPos_
-{
- HB_UShort PosFormat; /* always 1 */
- HB_UShort LookuptType; /* lookup-type of referenced subtable */
- HB_GPOS_SubTable *subtable; /* referenced subtable */
-};
-
-typedef struct HB_ExtensionPos_ HB_ExtensionPos;
-#endif
-
-
-union HB_GPOS_SubTable_
-{
- HB_SinglePos single;
- HB_PairPos pair;
- HB_CursivePos cursive;
- HB_MarkBasePos markbase;
- HB_MarkLigPos marklig;
- HB_MarkMarkPos markmark;
- HB_ContextPos context;
- HB_ChainContextPos chain;
-};
-
-typedef union HB_GPOS_SubTable_ HB_GPOS_SubTable;
-
-
-
-HB_INTERNAL HB_Error
-_HB_GPOS_Load_SubTable( HB_GPOS_SubTable* st,
- HB_Stream stream,
- HB_UShort lookup_type );
-
-HB_INTERNAL void
-_HB_GPOS_Free_SubTable( HB_GPOS_SubTable* st,
- HB_UShort lookup_type );
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GPOS_PRIVATE_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c
deleted file mode 100644
index 90e31a589c..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c
+++ /dev/null
@@ -1,6275 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-gpos-private.h"
-#include "harfbuzz-open-private.h"
-#include "harfbuzz-gdef-private.h"
-#include "harfbuzz-shaper.h"
-
-struct GPOS_Instance_
-{
- HB_GPOSHeader* gpos;
- HB_Font font;
- HB_Bool dvi;
- HB_UShort load_flags; /* how the glyph should be loaded */
- HB_Bool r2l;
-
- HB_UShort last; /* the last valid glyph -- used
- with cursive positioning */
- HB_Fixed anchor_x; /* the coordinates of the anchor point */
- HB_Fixed anchor_y; /* of the last valid glyph */
-};
-
-typedef struct GPOS_Instance_ GPOS_Instance;
-
-
-static HB_Error GPOS_Do_Glyph_Lookup( GPOS_Instance* gpi,
- HB_UShort lookup_index,
- HB_Buffer buffer,
- HB_UShort context_length,
- int nesting_level );
-
-
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-/* the client application must replace this with something more
- meaningful if multiple master fonts are to be supported. */
-
-static HB_Error default_mmfunc( HB_Font font,
- HB_UShort metric_id,
- HB_Fixed* metric_value,
- void* data )
-{
- HB_UNUSED(font);
- HB_UNUSED(metric_id);
- HB_UNUSED(metric_value);
- HB_UNUSED(data);
- return ERR(HB_Err_Not_Covered); /* ERR() call intended */
-}
-#endif
-
-
-
-HB_Error HB_Load_GPOS_Table( HB_Stream stream,
- HB_GPOSHeader** retptr,
- HB_GDEFHeader* gdef,
- HB_Stream gdefStream )
-{
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_GPOSHeader* gpos;
-
- HB_Error error = HB_Err_Ok;
-
-
- if ( !retptr )
- return ERR(HB_Err_Invalid_Argument);
-
- if ( GOTO_Table( TTAG_GPOS ) )
- return error;
-
- base_offset = FILE_Pos();
-
- if ( ALLOC ( gpos, sizeof( *gpos ) ) )
- return error;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- gpos->mmfunc = default_mmfunc;
-#endif
-
- /* skip version */
-
- if ( FILE_Seek( base_offset + 4L ) ||
- ACCESS_Frame( 2L ) )
- goto Fail4;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_ScriptList( &gpos->ScriptList,
- stream ) ) != HB_Err_Ok )
- goto Fail4;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_FeatureList( &gpos->FeatureList,
- stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_LookupList( &gpos->LookupList,
- stream, HB_Type_GPOS ) ) != HB_Err_Ok )
- goto Fail2;
-
- gpos->gdef = gdef; /* can be NULL */
-
- if ( ( error = _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( gdef, gdefStream,
- gpos->LookupList.Lookup,
- gpos->LookupList.LookupCount ) ) )
- goto Fail1;
-
- *retptr = gpos;
-
- return HB_Err_Ok;
-
-Fail1:
- _HB_OPEN_Free_LookupList( &gpos->LookupList, HB_Type_GPOS );
-
-Fail2:
- _HB_OPEN_Free_FeatureList( &gpos->FeatureList );
-
-Fail3:
- _HB_OPEN_Free_ScriptList( &gpos->ScriptList );
-
-Fail4:
- FREE( gpos );
-
- return error;
-}
-
-
-HB_Error HB_Done_GPOS_Table( HB_GPOSHeader* gpos )
-{
- _HB_OPEN_Free_LookupList( &gpos->LookupList, HB_Type_GPOS );
- _HB_OPEN_Free_FeatureList( &gpos->FeatureList );
- _HB_OPEN_Free_ScriptList( &gpos->ScriptList );
-
- FREE( gpos );
-
- return HB_Err_Ok;
-}
-
-static HB_UInt Calculate_Class2RecordSize(HB_UShort format1, HB_UShort format2)
-{
- // Return number of 16 bit values in two value records with given formats
- return (format1 & 0x01) + (format2 & 0x01)
- + ((format1 & 0x02) >> 1) + ((format2 & 0x02) >> 1)
- + ((format1 & 0x04) >> 2) + ((format2 & 0x04) >> 2)
- + ((format1 & 0x08) >> 3) + ((format2 & 0x08) >> 3)
- + ((format1 & 0x10) >> 4) + ((format2 & 0x10) >> 4)
- + ((format1 & 0x20) >> 5) + ((format2 & 0x20) >> 5)
- + ((format1 & 0x40) >> 6) + ((format2 & 0x40) >> 6)
- + ((format1 & 0x80) >> 7) + ((format2 & 0x80) >> 7);
-}
-
-/*****************************
- * SubTable related functions
- *****************************/
-
-/* shared tables */
-
-/* ValueRecord */
-
-static HB_Error Get_FlexibleValueRecord( GPOS_Instance* gpi,
- HB_Short* vr,
- HB_UShort format,
- HB_Position gd )
-{
- HB_Error error = HB_Err_Ok;
-
- HB_16Dot16 x_scale, y_scale;
-
- if ( !format )
- return HB_Err_Ok;
-
- x_scale = gpi->font->x_scale;
- y_scale = gpi->font->y_scale;
-
- /* design units -> fractional pixel */
-
- if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT ) {
- gd->x_pos += *vr * x_scale / 0x10000;
- vr++;
- }
- if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT ) {
- gd->y_pos += *vr * y_scale / 0x10000;
- vr++;
- }
- if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE ) {
- gd->x_advance += *vr * x_scale / 0x10000;
- vr++;
- }
- if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE ) {
- gd->y_advance += *vr * y_scale / 0x10000;
- vr++;
- }
-
- return error;
-}
-
-/* There is a subtle difference in the specs between a `table' and a
- `record' -- offsets for device tables in ValueRecords are taken from
- the parent table and not the parent record. */
-
-static HB_Error Load_ValueRecord( HB_ValueRecord* vr,
- HB_UShort format,
- HB_UInt base_offset,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UInt cur_offset, new_offset;
-
-
- if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT )
- {
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- vr->XPlacement = GET_Short();
-
- FORGET_Frame();
- }
- else
- vr->XPlacement = 0;
-
- if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT )
- {
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- vr->YPlacement = GET_Short();
-
- FORGET_Frame();
- }
- else
- vr->YPlacement = 0;
-
- if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE )
- {
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- vr->XAdvance = GET_Short();
-
- FORGET_Frame();
- }
- else
- vr->XAdvance = 0;
-
- if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE )
- {
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- vr->YAdvance = GET_Short();
-
- FORGET_Frame();
- }
- else
- vr->YAdvance = 0;
-
- if ( format & HB_GPOS_FORMAT_HAVE_DEVICE_TABLES )
- {
- if ( ALLOC_ARRAY( vr->DeviceTables, 4, HB_Device ) )
- return error;
- vr->DeviceTables[VR_X_ADVANCE_DEVICE] = 0;
- vr->DeviceTables[VR_Y_ADVANCE_DEVICE] = 0;
- vr->DeviceTables[VR_X_PLACEMENT_DEVICE] = 0;
- vr->DeviceTables[VR_Y_PLACEMENT_DEVICE] = 0;
- }
- else
- {
- vr->DeviceTables = 0;
- }
-
- if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail4;
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- {
- new_offset += base_offset;
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_X_PLACEMENT_DEVICE],
- stream ) ) != HB_Err_Ok )
- goto Fail4;
- (void)FILE_Seek( cur_offset );
- }
- }
-
- if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- {
- new_offset += base_offset;
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_Y_PLACEMENT_DEVICE],
- stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
- }
- }
-
- if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- {
- new_offset += base_offset;
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_X_ADVANCE_DEVICE],
- stream ) ) != HB_Err_Ok )
- goto Fail2;
- (void)FILE_Seek( cur_offset );
- }
- }
-
- if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- {
- new_offset += base_offset;
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_Y_ADVANCE_DEVICE],
- stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
- }
-
- if ( format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- vr->XIdPlacement = GET_UShort();
-#else
- (void) GET_UShort();
-#endif
-
- FORGET_Frame();
- }
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- else
- vr->XIdPlacement = 0;
-#endif
-
- if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- vr->YIdPlacement = GET_UShort();
-#else
- (void) GET_UShort();
-#endif
-
- FORGET_Frame();
- }
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- else
- vr->YIdPlacement = 0;
-#endif
-
- if ( format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- vr->XIdAdvance = GET_UShort();
-#else
- (void) GET_UShort();
-#endif
-
- FORGET_Frame();
- }
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- else
- vr->XIdAdvance = 0;
-#endif
-
- if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- vr->YIdAdvance = GET_UShort();
-#else
- (void) GET_UShort();
-#endif
-
- FORGET_Frame();
- }
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- else
- vr->YIdAdvance = 0;
-#endif
-
- return HB_Err_Ok;
-
-Fail1:
- if ( vr->DeviceTables )
- _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_ADVANCE_DEVICE] );
-
-Fail2:
- if ( vr->DeviceTables )
- _HB_OPEN_Free_Device( vr->DeviceTables[VR_X_ADVANCE_DEVICE] );
-
-Fail3:
- if ( vr->DeviceTables )
- _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_PLACEMENT_DEVICE] );
-
-Fail4:
- FREE( vr->DeviceTables );
- return error;
-}
-
-
-static void Free_ValueRecord( HB_ValueRecord* vr,
- HB_UShort format )
-{
- if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE )
- _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_ADVANCE_DEVICE] );
- if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE )
- _HB_OPEN_Free_Device( vr->DeviceTables[VR_X_ADVANCE_DEVICE] );
- if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE )
- _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_PLACEMENT_DEVICE] );
- if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE )
- _HB_OPEN_Free_Device( vr->DeviceTables[VR_X_PLACEMENT_DEVICE] );
- FREE( vr->DeviceTables );
-}
-
-
-static HB_Error Get_ValueRecord( GPOS_Instance* gpi,
- HB_ValueRecord* vr,
- HB_UShort format,
- HB_Position gd )
-{
- HB_Short pixel_value;
- HB_Error error = HB_Err_Ok;
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- HB_GPOSHeader* gpos = gpi->gpos;
- HB_Fixed value;
-#endif
-
- HB_UShort x_ppem, y_ppem;
- HB_16Dot16 x_scale, y_scale;
-
-
- if ( !format )
- return HB_Err_Ok;
-
- x_ppem = gpi->font->x_ppem;
- y_ppem = gpi->font->y_ppem;
- x_scale = gpi->font->x_scale;
- y_scale = gpi->font->y_scale;
-
- /* design units -> fractional pixel */
-
- if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT )
- gd->x_pos += x_scale * vr->XPlacement / 0x10000;
- if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT )
- gd->y_pos += y_scale * vr->YPlacement / 0x10000;
- if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE )
- gd->x_advance += x_scale * vr->XAdvance / 0x10000;
- if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE )
- gd->y_advance += y_scale * vr->YAdvance / 0x10000;
-
- if ( !gpi->dvi )
- {
- /* pixel -> fractional pixel */
-
- if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE )
- {
- _HB_OPEN_Get_Device( vr->DeviceTables[VR_X_PLACEMENT_DEVICE], x_ppem, &pixel_value );
- gd->x_pos += pixel_value << 6;
- }
- if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE )
- {
- _HB_OPEN_Get_Device( vr->DeviceTables[VR_Y_PLACEMENT_DEVICE], y_ppem, &pixel_value );
- gd->y_pos += pixel_value << 6;
- }
- if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE )
- {
- _HB_OPEN_Get_Device( vr->DeviceTables[VR_X_ADVANCE_DEVICE], x_ppem, &pixel_value );
- gd->x_advance += pixel_value << 6;
- }
- if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE )
- {
- _HB_OPEN_Get_Device( vr->DeviceTables[VR_Y_ADVANCE_DEVICE], y_ppem, &pixel_value );
- gd->y_advance += pixel_value << 6;
- }
- }
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- /* values returned from mmfunc() are already in fractional pixels */
-
- if ( format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT )
- {
- error = (gpos->mmfunc)( gpi->font, vr->XIdPlacement,
- &value, gpos->data );
- if ( error )
- return error;
- gd->x_pos += value;
- }
- if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT )
- {
- error = (gpos->mmfunc)( gpi->font, vr->YIdPlacement,
- &value, gpos->data );
- if ( error )
- return error;
- gd->y_pos += value;
- }
- if ( format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE )
- {
- error = (gpos->mmfunc)( gpi->font, vr->XIdAdvance,
- &value, gpos->data );
- if ( error )
- return error;
- gd->x_advance += value;
- }
- if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE )
- {
- error = (gpos->mmfunc)( gpi->font, vr->YIdAdvance,
- &value, gpos->data );
- if ( error )
- return error;
- gd->y_advance += value;
- }
-#endif
-
- return error;
-}
-
-
-/* AnchorFormat1 */
-/* AnchorFormat2 */
-/* AnchorFormat3 */
-/* AnchorFormat4 */
-
-static HB_Error Load_Anchor( HB_Anchor* an,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UInt cur_offset, new_offset, base_offset;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- an->PosFormat = GET_UShort();
-
- FORGET_Frame();
-
- switch ( an->PosFormat )
- {
- case 1:
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- an->af.af1.XCoordinate = GET_Short();
- an->af.af1.YCoordinate = GET_Short();
-
- FORGET_Frame();
- break;
-
- case 2:
- if ( ACCESS_Frame( 6L ) )
- return error;
-
- an->af.af2.XCoordinate = GET_Short();
- an->af.af2.YCoordinate = GET_Short();
- an->af.af2.AnchorPoint = GET_UShort();
-
- FORGET_Frame();
- break;
-
- case 3:
- if ( ACCESS_Frame( 6L ) )
- return error;
-
- an->af.af3.XCoordinate = GET_Short();
- an->af.af3.YCoordinate = GET_Short();
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- {
- if ( ALLOC_ARRAY( an->af.af3.DeviceTables, 2, HB_Device ) )
- return error;
-
- an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] = 0;
- an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE] = 0;
-
- new_offset += base_offset;
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Device( &an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE],
- stream ) ) != HB_Err_Ok )
- goto Fail2;
- (void)FILE_Seek( cur_offset );
- }
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- {
- if ( !an->af.af3.DeviceTables )
- {
- if ( ALLOC_ARRAY( an->af.af3.DeviceTables, 2, HB_Device ) )
- return error;
-
- an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] = 0;
- an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE] = 0;
- }
-
- new_offset += base_offset;
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Device( &an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE],
- stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
- break;
-
- case 4:
- if ( ACCESS_Frame( 4L ) )
- return error;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- an->af.af4.XIdAnchor = GET_UShort();
- an->af.af4.YIdAnchor = GET_UShort();
-#else
- (void) GET_UShort();
- (void) GET_UShort();
-#endif
-
- FORGET_Frame();
- break;
-
- default:
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok;
-
-Fail:
- if ( an->af.af3.DeviceTables )
- _HB_OPEN_Free_Device( an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] );
-
-Fail2:
- FREE( an->af.af3.DeviceTables );
- return error;
-}
-
-
-static void Free_Anchor( HB_Anchor* an)
-{
- if ( an->PosFormat == 3 && an->af.af3.DeviceTables )
- {
- _HB_OPEN_Free_Device( an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] );
- _HB_OPEN_Free_Device( an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE] );
- FREE( an->af.af3.DeviceTables );
- }
-}
-
-
-static HB_Error Get_Anchor( GPOS_Instance* gpi,
- HB_Anchor* an,
- HB_UShort glyph_index,
- HB_Fixed* x_value,
- HB_Fixed* y_value )
-{
- HB_Error error = HB_Err_Ok;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- HB_GPOSHeader* gpos = gpi->gpos;
-#endif
- HB_UShort ap;
-
- HB_Short pixel_value;
-
- HB_UShort x_ppem, y_ppem;
- HB_16Dot16 x_scale, y_scale;
-
-
- x_ppem = gpi->font->x_ppem;
- y_ppem = gpi->font->y_ppem;
- x_scale = gpi->font->x_scale;
- y_scale = gpi->font->y_scale;
-
- switch ( an->PosFormat )
- {
- case 0:
- /* The special case of an empty AnchorTable */
- default:
-
- return HB_Err_Not_Covered;
-
- case 1:
- *x_value = x_scale * an->af.af1.XCoordinate / 0x10000;
- *y_value = y_scale * an->af.af1.YCoordinate / 0x10000;
- break;
-
- case 2:
- if ( !gpi->dvi )
- {
- hb_uint32 n_points = 0;
- ap = an->af.af2.AnchorPoint;
- if (!gpi->font->klass->getPointInOutline)
- goto no_contour_point;
- error = gpi->font->klass->getPointInOutline(gpi->font, glyph_index, gpi->load_flags, ap, x_value, y_value, &n_points);
- if (error)
- return error;
- /* if n_points is set to zero, we use the design coordinate value pair.
- * This can happen e.g. for sbit glyphs. */
- if (!n_points)
- goto no_contour_point;
- }
- else
- {
- no_contour_point:
- *x_value = x_scale * an->af.af3.XCoordinate / 0x10000;
- *y_value = y_scale * an->af.af3.YCoordinate / 0x10000;
- }
- break;
-
- case 3:
- if ( !gpi->dvi )
- {
- _HB_OPEN_Get_Device( an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE], x_ppem, &pixel_value );
- *x_value = pixel_value << 6;
- _HB_OPEN_Get_Device( an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE], y_ppem, &pixel_value );
- *y_value = pixel_value << 6;
- }
- else
- *x_value = *y_value = 0;
-
- *x_value += x_scale * an->af.af3.XCoordinate / 0x10000;
- *y_value += y_scale * an->af.af3.YCoordinate / 0x10000;
- break;
-
- case 4:
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- error = (gpos->mmfunc)( gpi->font, an->af.af4.XIdAnchor,
- x_value, gpos->data );
- if ( error )
- return error;
-
- error = (gpos->mmfunc)( gpi->font, an->af.af4.YIdAnchor,
- y_value, gpos->data );
- if ( error )
- return error;
- break;
-#else
- return ERR(HB_Err_Not_Covered);
-#endif
- }
-
- return error;
-}
-
-
-/* MarkArray */
-
-static HB_Error Load_MarkArray ( HB_MarkArray* ma,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_MarkRecord* mr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = ma->MarkCount = GET_UShort();
-
- FORGET_Frame();
-
- ma->MarkRecord = NULL;
-
- if ( ALLOC_ARRAY( ma->MarkRecord, count, HB_MarkRecord ) )
- return error;
-
- mr = ma->MarkRecord;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 4L ) )
- goto Fail;
-
- mr[n].Class = GET_UShort();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_Anchor( &mr[n].MarkAnchor, stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_Anchor( &mr[m].MarkAnchor );
-
- FREE( mr );
- return error;
-}
-
-
-static void Free_MarkArray( HB_MarkArray* ma )
-{
- HB_UShort n, count;
-
- HB_MarkRecord* mr;
-
-
- if ( ma->MarkRecord )
- {
- count = ma->MarkCount;
- mr = ma->MarkRecord;
-
- for ( n = 0; n < count; n++ )
- Free_Anchor( &mr[n].MarkAnchor );
-
- FREE( mr );
- }
-}
-
-
-/* LookupType 1 */
-
-/* SinglePosFormat1 */
-/* SinglePosFormat2 */
-
-static HB_Error Load_SinglePos( HB_GPOS_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_SinglePos* sp = &st->single;
-
- HB_UShort n, m, count, format;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_ValueRecord* vr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 6L ) )
- return error;
-
- sp->PosFormat = GET_UShort();
- new_offset = GET_UShort() + base_offset;
-
- format = sp->ValueFormat = GET_UShort();
-
- FORGET_Frame();
-
- if ( !format )
- return ERR(HB_Err_Invalid_SubTable);
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &sp->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- switch ( sp->PosFormat )
- {
- case 1:
- error = Load_ValueRecord( &sp->spf.spf1.Value, format,
- base_offset, stream );
- if ( error )
- goto Fail2;
- break;
-
- case 2:
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = sp->spf.spf2.ValueCount = GET_UShort();
-
- FORGET_Frame();
-
- sp->spf.spf2.Value = NULL;
-
- if ( ALLOC_ARRAY( sp->spf.spf2.Value, count, HB_ValueRecord ) )
- goto Fail2;
-
- vr = sp->spf.spf2.Value;
-
- for ( n = 0; n < count; n++ )
- {
- error = Load_ValueRecord( &vr[n], format, base_offset, stream );
- if ( error )
- goto Fail1;
- }
- break;
-
- default:
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_ValueRecord( &vr[m], format );
-
- FREE( vr );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &sp->Coverage );
- return error;
-}
-
-
-static void Free_SinglePos( HB_GPOS_SubTable* st )
-{
- HB_UShort n, count, format;
- HB_SinglePos* sp = &st->single;
-
- HB_ValueRecord* v;
-
-
- format = sp->ValueFormat;
-
- switch ( sp->PosFormat )
- {
- case 1:
- Free_ValueRecord( &sp->spf.spf1.Value, format );
- break;
-
- case 2:
- if ( sp->spf.spf2.Value )
- {
- count = sp->spf.spf2.ValueCount;
- v = sp->spf.spf2.Value;
-
- for ( n = 0; n < count; n++ )
- Free_ValueRecord( &v[n], format );
-
- FREE( v );
- }
- break;
- default:
- break;
- }
-
- _HB_OPEN_Free_Coverage( &sp->Coverage );
-}
-
-static HB_Error Lookup_SinglePos( GPOS_Instance* gpi,
- HB_GPOS_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, property;
- HB_Error error;
- HB_GPOSHeader* gpos = gpi->gpos;
- HB_SinglePos* sp = &st->single;
-
- HB_UNUSED(nesting_level);
-
- if ( context_length != 0xFFFF && context_length < 1 )
- return HB_Err_Not_Covered;
-
- if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &sp->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- switch ( sp->PosFormat )
- {
- case 1:
- error = Get_ValueRecord( gpi, &sp->spf.spf1.Value,
- sp->ValueFormat, POSITION( buffer->in_pos ) );
- if ( error )
- return error;
- break;
-
- case 2:
- if ( index >= sp->spf.spf2.ValueCount )
- return ERR(HB_Err_Invalid_SubTable);
- error = Get_ValueRecord( gpi, &sp->spf.spf2.Value[index],
- sp->ValueFormat, POSITION( buffer->in_pos ) );
- if ( error )
- return error;
- break;
-
- default:
- return ERR(HB_Err_Invalid_SubTable);
- }
-
- (buffer->in_pos)++;
-
- return HB_Err_Ok;
-}
-
-/* LookupType 2 */
-
-/* PairSet */
-
-static HB_Error Load_PairSet ( HB_PairSet* ps,
- HB_UShort format1,
- HB_UShort format2,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
-
-#ifdef HB_USE_FLEXIBLE_VALUE_RECORD
- HB_UInt record_size = 0;
- HB_Short *vr;
-#else
- HB_UInt base_offset;
- HB_PairValueRecord* pvr;
-
- base_offset = FILE_Pos();
-#endif
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = ps->PairValueCount = GET_UShort();
-
- FORGET_Frame();
-
-#ifndef HB_USE_FLEXIBLE_VALUE_RECORD
- ps->PairValueRecord = NULL;
-
- if ( ALLOC_ARRAY( ps->PairValueRecord, count, HB_PairValueRecord ) )
- return error;
-
- pvr = ps->PairValueRecord;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- pvr[n].SecondGlyph = GET_UShort();
-
- FORGET_Frame();
-
- if ( format1 )
- {
- error = Load_ValueRecord( &pvr[n].Value1, format1,
- base_offset, stream );
- if ( error )
- goto Fail;
- }
- if ( format2 )
- {
- error = Load_ValueRecord( &pvr[n].Value2, format2,
- base_offset, stream );
- if ( error )
- {
- if ( format1 )
- Free_ValueRecord( &pvr[n].Value1, format1 );
- goto Fail;
- }
- }
- }
-#else
- ps->ValueRecords = 0;
-
- // Add one for the SecondGlyph part of each record
- record_size = Calculate_Class2RecordSize( format1, format2 ) + 1;
-
- if ( ALLOC_ARRAY( ps->ValueRecords, record_size * count, HB_Short ) )
- return error;
-
- vr = ps->ValueRecords;
-
- for ( n = 0; n < count; n++ )
- {
- for ( m = 0; m < record_size; m++ ) {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- *(vr++) = GET_Short();
-
- FORGET_Frame();
- }
- }
-#endif
-
-
- return HB_Err_Ok;
-
-Fail:
-#ifndef HB_USE_FLEXIBLE_VALUE_RECORD
- for ( m = 0; m < n; m++ )
- {
- if ( format1 )
- Free_ValueRecord( &pvr[m].Value1, format1 );
- if ( format2 )
- Free_ValueRecord( &pvr[m].Value2, format2 );
- }
-
- FREE( pvr );
-#else
- FREE ( ps->ValueRecords );
-#endif
-
- return error;
-}
-
-
-static void Free_PairSet( HB_PairSet* ps,
- HB_UShort format1,
- HB_UShort format2)
-{
-#ifndef HB_USE_FLEXIBLE_VALUE_RECORD
- HB_UShort n, count;
-
- HB_PairValueRecord* pvr;
-
- if ( ps->PairValueRecord )
- {
- count = ps->PairValueCount;
- pvr = ps->PairValueRecord;
-
- for ( n = 0; n < count; n++ )
- {
- if ( format1 )
- Free_ValueRecord( &pvr[n].Value1, format1 );
- if ( format2 )
- Free_ValueRecord( &pvr[n].Value2, format2 );
- }
-
- FREE( pvr );
- }
-#else
- (void)format1; // unused
- (void)format2; // unused
-
- if ( ps->ValueRecords )
- {
- FREE( ps->ValueRecords );
- }
-#endif
-}
-
-
-/* PairPosFormat1 */
-
-static HB_Error Load_PairPos1( HB_PairPosFormat1* ppf1,
- HB_UShort format1,
- HB_UShort format2,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_PairSet* ps;
-
-
- base_offset = FILE_Pos() - 8L;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = ppf1->PairSetCount = GET_UShort();
-
- FORGET_Frame();
-
- ppf1->PairSet = NULL;
-
- if ( ALLOC_ARRAY( ppf1->PairSet, count, HB_PairSet ) )
- return error;
-
- ps = ppf1->PairSet;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_PairSet( &ps[n], format1,
- format2, stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_PairSet( &ps[m], format1, format2 );
-
- FREE( ps );
- return error;
-}
-
-
-static void Free_PairPos1( HB_PairPosFormat1* ppf1,
- HB_UShort format1,
- HB_UShort format2 )
-{
- HB_UShort n, count;
-
- HB_PairSet* ps;
-
-
- if ( ppf1->PairSet )
- {
- count = ppf1->PairSetCount;
- ps = ppf1->PairSet;
-
- for ( n = 0; n < count; n++ )
- Free_PairSet( &ps[n], format1, format2 );
-
- FREE( ps );
- }
-}
-
-
-/* PairPosFormat2 */
-
-static HB_Error Load_PairPos2( HB_PairPosFormat2* ppf2,
- HB_UShort format1,
- HB_UShort format2,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort m, n, k, count1, count2;
- HB_UInt cur_offset, new_offset1, new_offset2, base_offset, cls2_record_size = 0;
-
- HB_Class1Record* c1r;
- HB_Class2Record* c2r;
-
- HB_Short* vr;
-
- hb_uint8 use_flexible_value_records;
-
- base_offset = FILE_Pos() - 8L;
-
- if ( ACCESS_Frame( 8L ) )
- return error;
-
- new_offset1 = GET_UShort() + base_offset;
- new_offset2 = GET_UShort() + base_offset;
-
- /* `Class1Count' and `Class2Count' are the upper limits for class
- values, thus we read it now to make additional safety checks. */
-
- count1 = ppf2->Class1Count = GET_UShort();
- count2 = ppf2->Class2Count = GET_UShort();
-
-#ifndef HB_USE_FLEXIBLE_VALUE_RECORD
- use_flexible_value_records = 0;
-#else
- use_flexible_value_records = !((format1 & HB_GPOS_FORMAT_HAVE_DEVICE_TABLES) ||
- (format2 & HB_GPOS_FORMAT_HAVE_DEVICE_TABLES));
-#endif
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset1 ) ||
- ( error = _HB_OPEN_Load_ClassDefinition( &ppf2->ClassDef1, count1,
- stream ) ) != HB_Err_Ok )
- return error;
- if ( FILE_Seek( new_offset2 ) ||
- ( error = _HB_OPEN_Load_ClassDefinition( &ppf2->ClassDef2, count2,
- stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
-
- ppf2->Class1Record = NULL;
-
- if ( ALLOC_ARRAY( ppf2->Class1Record, count1, HB_Class1Record ) )
- goto Fail2;
-
- c1r = ppf2->Class1Record;
-
- if ( use_flexible_value_records )
- cls2_record_size = Calculate_Class2RecordSize(format1, format2);
-
- for ( m = 0; m < count1; m++ )
- {
- c1r[m].IsFlexible = use_flexible_value_records;
- if ( use_flexible_value_records ) {
- c1r[m].c2r.ValueRecords = NULL;
-
- if ( ALLOC_ARRAY( c1r[m].c2r.ValueRecords, count2 * cls2_record_size, HB_UShort ) )
- goto Fail1;
-
- vr = c1r[m].c2r.ValueRecords;
-
- if ( ACCESS_Frame( count2 * cls2_record_size * 2L ))
- goto Fail1;
-
- for ( n = 0; n < count2 * cls2_record_size; n++ )
- vr[n] = GET_Short();
-
- FORGET_Frame();
- } else {
- c1r[m].c2r.Class2Record = NULL;
-
- if ( ALLOC_ARRAY( c1r[m].c2r.Class2Record, count2, HB_Class2Record ) )
- goto Fail1;
-
- c2r = c1r[m].c2r.Class2Record;
- for ( n = 0; n < count2; n++ )
- {
- if ( format1 )
- {
- error = Load_ValueRecord( &c2r[n].Value1, format1,
- base_offset, stream );
- if ( error )
- goto Fail0;
- }
- if ( format2 )
- {
- error = Load_ValueRecord( &c2r[n].Value2, format2,
- base_offset, stream );
- if ( error )
- {
- if ( format1 )
- Free_ValueRecord( &c2r[n].Value1, format1 );
- goto Fail0;
- }
- }
- }
- }
-
- continue;
-
- Fail0:
- for ( k = 0; k < n; k++ )
- {
- if ( format1 )
- Free_ValueRecord( &c2r[k].Value1, format1 );
- if ( format2 )
- Free_ValueRecord( &c2r[k].Value2, format2 );
- }
- goto Fail1;
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( k = 0; k < m; k++ )
- {
- if ( !use_flexible_value_records ) {
- c2r = c1r[k].c2r.Class2Record;
-
- for ( n = 0; n < count2; n++ )
- {
- if ( format1 )
- Free_ValueRecord( &c2r[n].Value1, format1 );
- if ( format2 )
- Free_ValueRecord( &c2r[n].Value2, format2 );
- }
-
- FREE( c2r );
- } else {
- FREE( c1r[k].c2r.ValueRecords );
- }
- }
-
- FREE( c1r );
-Fail2:
-
- _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef2 );
-
-Fail3:
- _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef1 );
- return error;
-}
-
-
-static void Free_PairPos2( HB_PairPosFormat2* ppf2,
- HB_UShort format1,
- HB_UShort format2)
-{
- HB_UShort m, n, count1, count2;
-
- HB_Class1Record* c1r;
- HB_Class2Record* c2r;
-
-
- if ( ppf2->Class1Record )
- {
- c1r = ppf2->Class1Record;
- count1 = ppf2->Class1Count;
- count2 = ppf2->Class2Count;
-
- for ( m = 0; m < count1; m++ )
- {
- if ( !c1r[m].IsFlexible ) {
- c2r = c1r[m].c2r.Class2Record;
-
- for ( n = 0; n < count2; n++ )
- {
- if ( format1 )
- Free_ValueRecord( &c2r[n].Value1, format1 );
- if ( format2 )
- Free_ValueRecord( &c2r[n].Value2, format2 );
- }
-
- FREE( c2r );
- } else {
- FREE( c1r[m].c2r.ValueRecords );
- }
- }
-
- FREE( c1r );
-
- _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef2 );
- _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef1 );
- }
-}
-
-
-static HB_Error Load_PairPos( HB_GPOS_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_PairPos* pp = &st->pair;
-
- HB_UShort format1, format2;
- HB_UInt cur_offset, new_offset, base_offset;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 8L ) )
- return error;
-
- pp->PosFormat = GET_UShort();
- new_offset = GET_UShort() + base_offset;
-
- format1 = pp->ValueFormat1 = GET_UShort();
- format2 = pp->ValueFormat2 = GET_UShort();
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &pp->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- switch ( pp->PosFormat )
- {
- case 1:
- error = Load_PairPos1( &pp->ppf.ppf1, format1, format2, stream );
- if ( error )
- goto Fail;
- break;
-
- case 2:
- error = Load_PairPos2( &pp->ppf.ppf2, format1, format2, stream );
- if ( error )
- goto Fail;
- break;
-
- default:
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok;
-
-Fail:
- _HB_OPEN_Free_Coverage( &pp->Coverage );
- return error;
-}
-
-
-static void Free_PairPos( HB_GPOS_SubTable* st )
-{
- HB_UShort format1, format2;
- HB_PairPos* pp = &st->pair;
-
-
- format1 = pp->ValueFormat1;
- format2 = pp->ValueFormat2;
-
- switch ( pp->PosFormat )
- {
- case 1:
- Free_PairPos1( &pp->ppf.ppf1, format1, format2 );
- break;
-
- case 2:
- Free_PairPos2( &pp->ppf.ppf2, format1, format2 );
- break;
-
- default:
- break;
- }
-
- _HB_OPEN_Free_Coverage( &pp->Coverage );
-}
-
-static HB_Error Lookup_PairPos1( GPOS_Instance* gpi,
- HB_PairPosFormat1* ppf1,
- HB_Buffer buffer,
- HB_UInt first_pos,
- HB_UShort index,
- HB_UShort format1,
- HB_UShort format2 )
-{
- HB_Error error;
- HB_UShort numpvr, glyph2;
-
-#ifndef HB_USE_FLEXIBLE_VALUE_RECORD
- HB_PairValueRecord* pvr;
-#else
- HB_Short *vr;
- HB_UShort second_glyph;
- HB_UInt record_size1, record_size2;
-#endif
-
- if ( index >= ppf1->PairSetCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- if (!ppf1->PairSet[index].PairValueCount)
- return HB_Err_Not_Covered;
-
- glyph2 = IN_CURGLYPH();
-
-#ifndef HB_USE_FLEXIBLE_VALUE_RECORD
- pvr = ppf1->PairSet[index].PairValueRecord;
- if ( !pvr )
- return ERR(HB_Err_Invalid_SubTable);
-
- for ( numpvr = ppf1->PairSet[index].PairValueCount;
- numpvr;
- numpvr--, pvr++ )
- {
- if ( glyph2 == pvr->SecondGlyph )
- {
- error = Get_ValueRecord( gpi, &pvr->Value1, format1,
- POSITION( first_pos ) );
- if ( error )
- return error;
- return Get_ValueRecord( gpi, &pvr->Value2, format2,
- POSITION( buffer->in_pos ) );
- }
- }
-#else
- vr = ppf1->PairSet[index].ValueRecords;
- if ( !vr )
- return ERR(HB_Err_Invalid_SubTable);
-
- record_size1 = Calculate_Class2RecordSize( format1, 0 );
- record_size2 = Calculate_Class2RecordSize( format2, 0 );
-
- for ( numpvr = ppf1->PairSet[index].PairValueCount; numpvr; numpvr-- )
- {
- second_glyph = *((HB_UShort *)vr);
- vr++;
- if ( glyph2 == second_glyph )
- {
- error = Get_FlexibleValueRecord( gpi, vr, format1, POSITION( first_pos ) );
- if ( error )
- return error;
- vr += record_size1;
-
- return Get_FlexibleValueRecord( gpi, vr, format2, POSITION( buffer->in_pos ) );
- }
- else
- {
- vr += record_size1 + record_size2;
- }
- }
-#endif
-
- return HB_Err_Not_Covered;
-}
-
-
-static HB_Error Lookup_PairPos2( GPOS_Instance* gpi,
- HB_PairPosFormat2* ppf2,
- HB_Buffer buffer,
- HB_UInt first_pos,
- HB_UShort format1,
- HB_UShort format2 )
-{
- HB_Error error;
- HB_UShort cl1 = 0, cl2 = 0; /* shut compiler up */
-
- HB_Class1Record* c1r;
- HB_Class2Record* c2r;
- HB_Short* vr;
-
- HB_UShort vr1_size;
- HB_UShort vr2_size;
-
-
- error = _HB_OPEN_Get_Class( &ppf2->ClassDef1, IN_GLYPH( first_pos ),
- &cl1, NULL );
- if ( error && error != HB_Err_Not_Covered )
- return error;
- error = _HB_OPEN_Get_Class( &ppf2->ClassDef2, IN_CURGLYPH(),
- &cl2, NULL );
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- c1r = &ppf2->Class1Record[cl1];
- if ( !c1r )
- return ERR(HB_Err_Invalid_SubTable);
-
- if ( !c1r->IsFlexible ) {
- c2r = &c1r->c2r.Class2Record[cl2];
-
- error = Get_ValueRecord( gpi, &c2r->Value1, format1, POSITION( first_pos ) );
- if ( error )
- return error;
- return Get_ValueRecord( gpi, &c2r->Value2, format2, POSITION( buffer->in_pos ) );
- } else {
- vr1_size = Calculate_Class2RecordSize( format1, 0 );
- vr2_size = Calculate_Class2RecordSize( format2, 0 );
-
- vr = c1r->c2r.ValueRecords + (cl2 * ( vr1_size + vr2_size ));
-
- error = Get_FlexibleValueRecord( gpi, vr, format1, POSITION( first_pos ) );
- if ( error )
- return error;
- vr += vr1_size; // Skip to second record
- return Get_FlexibleValueRecord( gpi, vr, format2, POSITION( buffer->in_pos ) );
- }
-}
-
-static HB_Error Lookup_PairPos( GPOS_Instance* gpi,
- HB_GPOS_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_Error error;
- HB_UShort index, property;
- HB_UInt first_pos;
- HB_GPOSHeader* gpos = gpi->gpos;
- HB_PairPos* pp = &st->pair;
-
- HB_UNUSED(nesting_level);
-
- if ( buffer->in_pos >= buffer->in_length - 1 )
- return HB_Err_Not_Covered; /* Not enough glyphs in stream */
-
- if ( context_length != 0xFFFF && context_length < 2 )
- return HB_Err_Not_Covered;
-
- if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &pp->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- /* second glyph */
-
- first_pos = buffer->in_pos;
- (buffer->in_pos)++;
-
- while ( CHECK_Property( gpos->gdef, IN_CURITEM(),
- flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( buffer->in_pos == buffer->in_length )
- {
- buffer->in_pos = first_pos;
- return HB_Err_Not_Covered;
- }
- (buffer->in_pos)++;
-
- }
-
- switch ( pp->PosFormat )
- {
- case 1:
- error = Lookup_PairPos1( gpi, &pp->ppf.ppf1, buffer,
- first_pos, index,
- pp->ValueFormat1, pp->ValueFormat2 );
- break;
-
- case 2:
- error = Lookup_PairPos2( gpi, &pp->ppf.ppf2, buffer, first_pos,
- pp->ValueFormat1, pp->ValueFormat2 );
- break;
-
- default:
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- /* if we don't have coverage for the second glyph don't skip it for
- further lookups but reset in_pos back to the first_glyph and let
- the caller in Do_String_Lookup increment in_pos */
- if ( error == HB_Err_Not_Covered )
- buffer->in_pos = first_pos;
-
- /* adjusting the `next' glyph */
-
- if ( pp->ValueFormat2 )
- (buffer->in_pos)++;
-
- return error;
-}
-
-
-/* LookupType 3 */
-
-/* CursivePosFormat1 */
-
-static HB_Error Load_CursivePos( HB_GPOS_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_CursivePos* cp = &st->cursive;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_EntryExitRecord* eer;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- cp->PosFormat = GET_UShort();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &cp->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = cp->EntryExitCount = GET_UShort();
-
- FORGET_Frame();
-
- cp->EntryExitRecord = NULL;
-
- if ( ALLOC_ARRAY( cp->EntryExitRecord, count, HB_EntryExitRecord ) )
- goto Fail2;
-
- eer = cp->EntryExitRecord;
-
- for ( n = 0; n < count; n++ )
- {
- HB_UInt entry_offset;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- entry_offset = new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- {
- new_offset += base_offset;
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_Anchor( &eer[n].EntryAnchor,
- stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
- else
- eer[n].EntryAnchor.PosFormat = 0;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- {
- new_offset += base_offset;
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_Anchor( &eer[n].ExitAnchor,
- stream ) ) != HB_Err_Ok )
- {
- if ( entry_offset )
- Free_Anchor( &eer[n].EntryAnchor );
- goto Fail1;
- }
- (void)FILE_Seek( cur_offset );
- }
- else
- eer[n].ExitAnchor.PosFormat = 0;
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- {
- Free_Anchor( &eer[m].EntryAnchor );
- Free_Anchor( &eer[m].ExitAnchor );
- }
-
- FREE( eer );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &cp->Coverage );
- return error;
-}
-
-
-static void Free_CursivePos( HB_GPOS_SubTable* st )
-{
- HB_UShort n, count;
- HB_CursivePos* cp = &st->cursive;
-
- HB_EntryExitRecord* eer;
-
-
- if ( cp->EntryExitRecord )
- {
- count = cp->EntryExitCount;
- eer = cp->EntryExitRecord;
-
- for ( n = 0; n < count; n++ )
- {
- Free_Anchor( &eer[n].EntryAnchor );
- Free_Anchor( &eer[n].ExitAnchor );
- }
-
- FREE( eer );
- }
-
- _HB_OPEN_Free_Coverage( &cp->Coverage );
-}
-
-
-static HB_Error Lookup_CursivePos( GPOS_Instance* gpi,
- HB_GPOS_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, property;
- HB_Error error;
- HB_GPOSHeader* gpos = gpi->gpos;
- HB_CursivePos* cp = &st->cursive;
-
- HB_EntryExitRecord* eer;
- HB_Fixed entry_x, entry_y;
- HB_Fixed exit_x, exit_y;
-
- HB_UNUSED(nesting_level);
-
- if ( context_length != 0xFFFF && context_length < 1 )
- {
- gpi->last = 0xFFFF;
- return HB_Err_Not_Covered;
- }
-
- /* Glyphs not having the right GDEF properties will be ignored, i.e.,
- gpi->last won't be reset (contrary to user defined properties). */
-
- if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- /* We don't handle mark glyphs here. According to Andrei, this isn't
- possible, but who knows... */
-
- if ( property == HB_GDEF_MARK )
- {
- gpi->last = 0xFFFF;
- return HB_Err_Not_Covered;
- }
-
- error = _HB_OPEN_Coverage_Index( &cp->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- {
- gpi->last = 0xFFFF;
- return error;
- }
-
- if ( index >= cp->EntryExitCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- eer = &cp->EntryExitRecord[index];
-
- /* Now comes the messiest part of the whole OpenType
- specification. At first glance, cursive connections seem easy
- to understand, but there are pitfalls! The reason is that
- the specs don't mention how to compute the advance values
- resp. glyph offsets. I was told it would be an omission, to
- be fixed in the next OpenType version... Again many thanks to
- Andrei Burago <andreib@microsoft.com> for clarifications.
-
- Consider the following example:
-
- | xadv1 |
- +---------+
- | |
- +-----+--+ 1 |
- | | .| |
- | 0+--+------+
- | 2 |
- | |
- 0+--------+
- | xadv2 |
-
- glyph1: advance width = 12
- anchor point = (3,1)
-
- glyph2: advance width = 11
- anchor point = (9,4)
-
- LSB is 1 for both glyphs (so the boxes drawn above are glyph
- bboxes). Writing direction is R2L; `0' denotes the glyph's
- coordinate origin.
-
- Now the surprising part: The advance width of the *left* glyph
- (resp. of the *bottom* glyph) will be modified, no matter
- whether the writing direction is L2R or R2L (resp. T2B or
- B2T)! This assymetry is caused by the fact that the glyph's
- coordinate origin is always the lower left corner for all
- writing directions.
-
- Continuing the above example, we can compute the new
- (horizontal) advance width of glyph2 as
-
- 9 - 3 = 6 ,
-
- and the new vertical offset of glyph2 as
-
- 1 - 4 = -3 .
-
-
- Vertical writing direction is far more complicated:
-
- a) Assuming that we recompute the advance height of the lower glyph:
-
- --
- +---------+
- -- | |
- +-----+--+ 1 | yadv1
- | | .| |
- yadv2 | 0+--+------+ -- BSB1 --
- | 2 | -- -- y_offset
- | |
- BSB2 -- 0+--------+ --
- -- --
-
- glyph1: advance height = 6
- anchor point = (3,1)
-
- glyph2: advance height = 7
- anchor point = (9,4)
-
- TSB is 1 for both glyphs; writing direction is T2B.
-
-
- BSB1 = yadv1 - (TSB1 + ymax1)
- BSB2 = yadv2 - (TSB2 + ymax2)
- y_offset = y2 - y1
-
- vertical advance width of glyph2
- = y_offset + BSB2 - BSB1
- = (y2 - y1) + (yadv2 - (TSB2 + ymax2)) - (yadv1 - (TSB1 + ymax1))
- = y2 - y1 + yadv2 - TSB2 - ymax2 - (yadv1 - TSB1 - ymax1)
- = y2 - y1 + yadv2 - TSB2 - ymax2 - yadv1 + TSB1 + ymax1
-
-
- b) Assuming that we recompute the advance height of the upper glyph:
-
- -- --
- +---------+ -- TSB1
- -- -- | |
- TSB2 -- +-----+--+ 1 | yadv1 ymax1
- | | .| |
- yadv2 | 0+--+------+ -- --
- ymax2 | 2 | -- y_offset
- | |
- -- 0+--------+ --
- --
-
- glyph1: advance height = 6
- anchor point = (3,1)
-
- glyph2: advance height = 7
- anchor point = (9,4)
-
- TSB is 1 for both glyphs; writing direction is T2B.
-
- y_offset = y2 - y1
-
- vertical advance width of glyph2
- = TSB1 + ymax1 + y_offset - (TSB2 + ymax2)
- = TSB1 + ymax1 + y2 - y1 - TSB2 - ymax2
-
-
- Comparing a) with b) shows that b) is easier to compute. I'll wait
- for a reply from Andrei to see what should really be implemented...
-
- Since horizontal advance widths or vertical advance heights
- can be used alone but not together, no ambiguity occurs. */
-
- if ( gpi->last == 0xFFFF )
- goto end;
-
- /* Get_Anchor() returns HB_Err_Not_Covered if there is no anchor
- table. */
-
- error = Get_Anchor( gpi, &eer->EntryAnchor, IN_CURGLYPH(),
- &entry_x, &entry_y );
- if ( error == HB_Err_Not_Covered )
- goto end;
- if ( error )
- return error;
-
- if ( gpi->r2l )
- {
- POSITION( buffer->in_pos )->x_advance = entry_x - gpi->anchor_x;
- POSITION( buffer->in_pos )->new_advance = TRUE;
- }
- else
- {
- POSITION( gpi->last )->x_advance = gpi->anchor_x - entry_x;
- POSITION( gpi->last )->new_advance = TRUE;
- }
-
- if ( flags & HB_LOOKUP_FLAG_RIGHT_TO_LEFT )
- {
- POSITION( gpi->last )->cursive_chain = gpi->last - buffer->in_pos;
- POSITION( gpi->last )->y_pos = entry_y - gpi->anchor_y;
- }
- else
- {
- POSITION( buffer->in_pos )->cursive_chain = buffer->in_pos - gpi->last;
- POSITION( buffer->in_pos )->y_pos = gpi->anchor_y - entry_y;
- }
-
-end:
- error = Get_Anchor( gpi, &eer->ExitAnchor, IN_CURGLYPH(),
- &exit_x, &exit_y );
- if ( error == HB_Err_Not_Covered )
- gpi->last = 0xFFFF;
- else
- {
- gpi->last = buffer->in_pos;
- gpi->anchor_x = exit_x;
- gpi->anchor_y = exit_y;
- }
- if ( error )
- return error;
-
- (buffer->in_pos)++;
-
- return HB_Err_Ok;
-}
-
-
-/* LookupType 4 */
-
-/* BaseArray */
-
-static HB_Error Load_BaseArray( HB_BaseArray* ba,
- HB_UShort num_classes,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort m, n, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_BaseRecord *br;
- HB_Anchor *ban, *bans;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = ba->BaseCount = GET_UShort();
-
- FORGET_Frame();
-
- ba->BaseRecord = NULL;
-
- if ( ALLOC_ARRAY( ba->BaseRecord, count, HB_BaseRecord ) )
- return error;
-
- br = ba->BaseRecord;
-
- bans = NULL;
-
- if ( ALLOC_ARRAY( bans, count * num_classes, HB_Anchor ) )
- goto Fail;
-
- for ( m = 0; m < count; m++ )
- {
- br[m].BaseAnchor = NULL;
-
- ban = br[m].BaseAnchor = bans + m * num_classes;
-
- for ( n = 0; n < num_classes; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- if (new_offset == base_offset) {
- /* XXX
- * Doulos SIL Regular is buggy and has zero offsets here.
- * Skip it
- */
- ban[n].PosFormat = 0;
- continue;
- }
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_Anchor( &ban[n], stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
- }
-
- return HB_Err_Ok;
-
-Fail:
- FREE( bans );
- FREE( br );
- return error;
-}
-
-
-static void Free_BaseArray( HB_BaseArray* ba,
- HB_UShort num_classes )
-{
- HB_BaseRecord *br;
- HB_Anchor *bans;
-
- if ( ba->BaseRecord )
- {
- br = ba->BaseRecord;
-
- if ( ba->BaseCount )
- {
- HB_UShort i, count;
- count = num_classes * ba->BaseCount;
- bans = br[0].BaseAnchor;
- for (i = 0; i < count; i++)
- Free_Anchor (&bans[i]);
- FREE( bans );
- }
-
- FREE( br );
- }
-}
-
-
-/* MarkBasePosFormat1 */
-
-static HB_Error Load_MarkBasePos( HB_GPOS_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_MarkBasePos* mbp = &st->markbase;
-
- HB_UInt cur_offset, new_offset, base_offset;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- mbp->PosFormat = GET_UShort();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- if (mbp->PosFormat != 1)
- return ERR(HB_Err_Invalid_SubTable_Format);
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &mbp->MarkCoverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &mbp->BaseCoverage, stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 4L ) )
- goto Fail2;
-
- mbp->ClassCount = GET_UShort();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_MarkArray( &mbp->MarkArray, stream ) ) != HB_Err_Ok )
- goto Fail2;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_BaseArray( &mbp->BaseArray, mbp->ClassCount,
- stream ) ) != HB_Err_Ok )
- goto Fail1;
-
- return HB_Err_Ok;
-
-Fail1:
- Free_MarkArray( &mbp->MarkArray );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &mbp->BaseCoverage );
-
-Fail3:
- _HB_OPEN_Free_Coverage( &mbp->MarkCoverage );
- return error;
-}
-
-
-static void Free_MarkBasePos( HB_GPOS_SubTable* st )
-{
- HB_MarkBasePos* mbp = &st->markbase;
-
- Free_BaseArray( &mbp->BaseArray, mbp->ClassCount );
- Free_MarkArray( &mbp->MarkArray );
- _HB_OPEN_Free_Coverage( &mbp->BaseCoverage );
- _HB_OPEN_Free_Coverage( &mbp->MarkCoverage );
-}
-
-
-static HB_Error Lookup_MarkBasePos( GPOS_Instance* gpi,
- HB_GPOS_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort i, j, mark_index, base_index, property, class;
- HB_Fixed x_mark_value, y_mark_value, x_base_value, y_base_value;
- HB_Error error;
- HB_GPOSHeader* gpos = gpi->gpos;
- HB_MarkBasePos* mbp = &st->markbase;
-
- HB_MarkArray* ma;
- HB_BaseArray* ba;
- HB_BaseRecord* br;
- HB_Anchor* mark_anchor;
- HB_Anchor* base_anchor;
-
- HB_Position o;
-
- HB_UNUSED(nesting_level);
-
- if ( context_length != 0xFFFF && context_length < 1 )
- return HB_Err_Not_Covered;
-
- if ( flags & HB_LOOKUP_FLAG_IGNORE_BASE_GLYPHS )
- return HB_Err_Not_Covered;
-
- if ( CHECK_Property( gpos->gdef, IN_CURITEM(),
- flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &mbp->MarkCoverage, IN_CURGLYPH(),
- &mark_index );
- if ( error )
- return error;
-
- /* now we search backwards for a non-mark glyph */
-
- i = 1;
- j = buffer->in_pos - 1;
-
- while ( i <= buffer->in_pos )
- {
- error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ),
- &property );
- if ( error )
- return error;
-
- if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) )
- break;
-
- i++;
- j--;
- }
-
- /* The following assertion is too strong -- at least for mangal.ttf. */
-#if 0
- if ( property != HB_GDEF_BASE_GLYPH )
- return HB_Err_Not_Covered;
-#endif
-
- if ( i > buffer->in_pos )
- return HB_Err_Not_Covered;
-
- error = _HB_OPEN_Coverage_Index( &mbp->BaseCoverage, IN_GLYPH( j ),
- &base_index );
- if ( error )
- return error;
-
- ma = &mbp->MarkArray;
-
- if ( mark_index >= ma->MarkCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- class = ma->MarkRecord[mark_index].Class;
- mark_anchor = &ma->MarkRecord[mark_index].MarkAnchor;
-
- if ( class >= mbp->ClassCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- ba = &mbp->BaseArray;
-
- if ( base_index >= ba->BaseCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- br = &ba->BaseRecord[base_index];
- base_anchor = &br->BaseAnchor[class];
-
- error = Get_Anchor( gpi, mark_anchor, IN_CURGLYPH(),
- &x_mark_value, &y_mark_value );
- if ( error )
- return error;
-
- error = Get_Anchor( gpi, base_anchor, IN_GLYPH( j ),
- &x_base_value, &y_base_value );
- if ( error )
- return error;
-
- /* anchor points are not cumulative */
-
- o = POSITION( buffer->in_pos );
-
- o->x_pos = x_base_value - x_mark_value;
- o->y_pos = y_base_value - y_mark_value;
- o->x_advance = 0;
- o->y_advance = 0;
- o->back = i;
-
- (buffer->in_pos)++;
-
- return HB_Err_Ok;
-}
-
-
-/* LookupType 5 */
-
-/* LigatureAttach */
-
-static HB_Error Load_LigatureAttach( HB_LigatureAttach* lat,
- HB_UShort num_classes,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort m, n, k, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_ComponentRecord* cr;
- HB_Anchor* lan;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = lat->ComponentCount = GET_UShort();
-
- FORGET_Frame();
-
- lat->ComponentRecord = NULL;
-
- if ( ALLOC_ARRAY( lat->ComponentRecord, count, HB_ComponentRecord ) )
- return error;
-
- cr = lat->ComponentRecord;
-
- for ( m = 0; m < count; m++ )
- {
- cr[m].LigatureAnchor = NULL;
-
- if ( ALLOC_ARRAY( cr[m].LigatureAnchor, num_classes, HB_Anchor ) )
- goto Fail;
-
- lan = cr[m].LigatureAnchor;
-
- for ( n = 0; n < num_classes; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail0;
-
- new_offset = GET_UShort();
-
- FORGET_Frame();
-
- if ( new_offset )
- {
- new_offset += base_offset;
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_Anchor( &lan[n], stream ) ) != HB_Err_Ok )
- goto Fail0;
- (void)FILE_Seek( cur_offset );
- }
- else
- lan[n].PosFormat = 0;
- }
-
- continue;
- Fail0:
- for ( k = 0; k < n; k++ )
- Free_Anchor( &lan[k] );
- goto Fail;
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( k = 0; k < m; k++ )
- {
- lan = cr[k].LigatureAnchor;
-
- for ( n = 0; n < num_classes; n++ )
- Free_Anchor( &lan[n] );
-
- FREE( lan );
- }
-
- FREE( cr );
- return error;
-}
-
-
-static void Free_LigatureAttach( HB_LigatureAttach* lat,
- HB_UShort num_classes )
-{
- HB_UShort m, n, count;
-
- HB_ComponentRecord* cr;
- HB_Anchor* lan;
-
-
- if ( lat->ComponentRecord )
- {
- count = lat->ComponentCount;
- cr = lat->ComponentRecord;
-
- for ( m = 0; m < count; m++ )
- {
- lan = cr[m].LigatureAnchor;
-
- for ( n = 0; n < num_classes; n++ )
- Free_Anchor( &lan[n] );
-
- FREE( lan );
- }
-
- FREE( cr );
- }
-}
-
-
-/* LigatureArray */
-
-static HB_Error Load_LigatureArray( HB_LigatureArray* la,
- HB_UShort num_classes,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_LigatureAttach* lat;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = la->LigatureCount = GET_UShort();
-
- FORGET_Frame();
-
- la->LigatureAttach = NULL;
-
- if ( ALLOC_ARRAY( la->LigatureAttach, count, HB_LigatureAttach ) )
- return error;
-
- lat = la->LigatureAttach;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_LigatureAttach( &lat[n], num_classes,
- stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_LigatureAttach( &lat[m], num_classes );
-
- FREE( lat );
- return error;
-}
-
-
-static void Free_LigatureArray( HB_LigatureArray* la,
- HB_UShort num_classes )
-{
- HB_UShort n, count;
-
- HB_LigatureAttach* lat;
-
-
- if ( la->LigatureAttach )
- {
- count = la->LigatureCount;
- lat = la->LigatureAttach;
-
- for ( n = 0; n < count; n++ )
- Free_LigatureAttach( &lat[n], num_classes );
-
- FREE( lat );
- }
-}
-
-
-/* MarkLigPosFormat1 */
-
-static HB_Error Load_MarkLigPos( HB_GPOS_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_MarkLigPos* mlp = &st->marklig;
-
- HB_UInt cur_offset, new_offset, base_offset;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- mlp->PosFormat = GET_UShort();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &mlp->MarkCoverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &mlp->LigatureCoverage,
- stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 4L ) )
- goto Fail2;
-
- mlp->ClassCount = GET_UShort();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_MarkArray( &mlp->MarkArray, stream ) ) != HB_Err_Ok )
- goto Fail2;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_LigatureArray( &mlp->LigatureArray, mlp->ClassCount,
- stream ) ) != HB_Err_Ok )
- goto Fail1;
-
- return HB_Err_Ok;
-
-Fail1:
- Free_MarkArray( &mlp->MarkArray );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &mlp->LigatureCoverage );
-
-Fail3:
- _HB_OPEN_Free_Coverage( &mlp->MarkCoverage );
- return error;
-}
-
-
-static void Free_MarkLigPos( HB_GPOS_SubTable* st)
-{
- HB_MarkLigPos* mlp = &st->marklig;
-
- Free_LigatureArray( &mlp->LigatureArray, mlp->ClassCount );
- Free_MarkArray( &mlp->MarkArray );
- _HB_OPEN_Free_Coverage( &mlp->LigatureCoverage );
- _HB_OPEN_Free_Coverage( &mlp->MarkCoverage );
-}
-
-
-static HB_Error Lookup_MarkLigPos( GPOS_Instance* gpi,
- HB_GPOS_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort i, j, mark_index, lig_index, property, class;
- HB_UShort mark_glyph;
- HB_Fixed x_mark_value, y_mark_value, x_lig_value, y_lig_value;
- HB_Error error;
- HB_GPOSHeader* gpos = gpi->gpos;
- HB_MarkLigPos* mlp = &st->marklig;
-
- HB_MarkArray* ma;
- HB_LigatureArray* la;
- HB_LigatureAttach* lat;
- HB_ComponentRecord* cr;
- HB_UShort comp_index;
- HB_Anchor* mark_anchor;
- HB_Anchor* lig_anchor;
-
- HB_Position o;
-
- HB_UNUSED(nesting_level);
-
- if ( context_length != 0xFFFF && context_length < 1 )
- return HB_Err_Not_Covered;
-
- if ( flags & HB_LOOKUP_FLAG_IGNORE_LIGATURES )
- return HB_Err_Not_Covered;
-
- mark_glyph = IN_CURGLYPH();
-
- if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &mlp->MarkCoverage, mark_glyph, &mark_index );
- if ( error )
- return error;
-
- /* now we search backwards for a non-mark glyph */
-
- i = 1;
- j = buffer->in_pos - 1;
-
- while ( i <= buffer->in_pos )
- {
- error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ),
- &property );
- if ( error )
- return error;
-
- if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) )
- break;
-
- i++;
- j--;
- }
-
- /* Similar to Lookup_MarkBasePos(), I suspect that this assertion is
- too strong, thus it is commented out. */
-#if 0
- if ( property != HB_GDEF_LIGATURE )
- return HB_Err_Not_Covered;
-#endif
-
- if ( i > buffer->in_pos )
- return HB_Err_Not_Covered;
-
- error = _HB_OPEN_Coverage_Index( &mlp->LigatureCoverage, IN_GLYPH( j ),
- &lig_index );
- if ( error )
- return error;
-
- ma = &mlp->MarkArray;
-
- if ( mark_index >= ma->MarkCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- class = ma->MarkRecord[mark_index].Class;
- mark_anchor = &ma->MarkRecord[mark_index].MarkAnchor;
-
- if ( class >= mlp->ClassCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- la = &mlp->LigatureArray;
-
- if ( lig_index >= la->LigatureCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- lat = &la->LigatureAttach[lig_index];
-
- /* We must now check whether the ligature ID of the current mark glyph
- is identical to the ligature ID of the found ligature. If yes, we
- can directly use the component index. If not, we attach the mark
- glyph to the last component of the ligature. */
-
- if ( IN_LIGID( j ) == IN_LIGID( buffer->in_pos) )
- {
- comp_index = IN_COMPONENT( buffer->in_pos );
- if ( comp_index >= lat->ComponentCount )
- return HB_Err_Not_Covered;
- }
- else
- comp_index = lat->ComponentCount - 1;
-
- cr = &lat->ComponentRecord[comp_index];
- lig_anchor = &cr->LigatureAnchor[class];
-
- error = Get_Anchor( gpi, mark_anchor, IN_CURGLYPH(),
- &x_mark_value, &y_mark_value );
- if ( error )
- return error;
- error = Get_Anchor( gpi, lig_anchor, IN_GLYPH( j ),
- &x_lig_value, &y_lig_value );
- if ( error )
- return error;
-
- /* anchor points are not cumulative */
-
- o = POSITION( buffer->in_pos );
-
- o->x_pos = x_lig_value - x_mark_value;
- o->y_pos = y_lig_value - y_mark_value;
- o->x_advance = 0;
- o->y_advance = 0;
- o->back = i;
-
- (buffer->in_pos)++;
-
- return HB_Err_Ok;
-}
-
-
-/* LookupType 6 */
-
-/* Mark2Array */
-
-static HB_Error Load_Mark2Array( HB_Mark2Array* m2a,
- HB_UShort num_classes,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort m, n, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_Mark2Record *m2r;
- HB_Anchor *m2an, *m2ans;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = m2a->Mark2Count = GET_UShort();
-
- FORGET_Frame();
-
- m2a->Mark2Record = NULL;
-
- if ( ALLOC_ARRAY( m2a->Mark2Record, count, HB_Mark2Record ) )
- return error;
-
- m2r = m2a->Mark2Record;
-
- m2ans = NULL;
-
- if ( ALLOC_ARRAY( m2ans, count * num_classes, HB_Anchor ) )
- goto Fail;
-
- for ( m = 0; m < count; m++ )
- {
- m2an = m2r[m].Mark2Anchor = m2ans + m * num_classes;
-
- for ( n = 0; n < num_classes; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- if (new_offset == base_offset) {
- /* Anchor table not provided. Skip loading.
- * Some versions of FreeSans hit this. */
- m2an[n].PosFormat = 0;
- continue;
- }
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_Anchor( &m2an[n], stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
- }
-
- return HB_Err_Ok;
-
-Fail:
- FREE( m2ans );
- FREE( m2r );
- return error;
-}
-
-
-static void Free_Mark2Array( HB_Mark2Array* m2a,
- HB_UShort num_classes )
-{
- HB_Mark2Record *m2r;
- HB_Anchor *m2ans;
-
- HB_UNUSED(num_classes);
-
- if ( m2a->Mark2Record )
- {
- m2r = m2a->Mark2Record;
-
- if ( m2a->Mark2Count )
- {
- m2ans = m2r[0].Mark2Anchor;
- FREE( m2ans );
- }
-
- FREE( m2r );
- }
-}
-
-
-/* MarkMarkPosFormat1 */
-
-static HB_Error Load_MarkMarkPos( HB_GPOS_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_MarkMarkPos* mmp = &st->markmark;
-
- HB_UInt cur_offset, new_offset, base_offset;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- mmp->PosFormat = GET_UShort();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &mmp->Mark1Coverage,
- stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &mmp->Mark2Coverage,
- stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 4L ) )
- goto Fail2;
-
- mmp->ClassCount = GET_UShort();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_MarkArray( &mmp->Mark1Array, stream ) ) != HB_Err_Ok )
- goto Fail2;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_Mark2Array( &mmp->Mark2Array, mmp->ClassCount,
- stream ) ) != HB_Err_Ok )
- goto Fail1;
-
- return HB_Err_Ok;
-
-Fail1:
- Free_MarkArray( &mmp->Mark1Array );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &mmp->Mark2Coverage );
-
-Fail3:
- _HB_OPEN_Free_Coverage( &mmp->Mark1Coverage );
- return error;
-}
-
-
-static void Free_MarkMarkPos( HB_GPOS_SubTable* st)
-{
- HB_MarkMarkPos* mmp = &st->markmark;
-
- Free_Mark2Array( &mmp->Mark2Array, mmp->ClassCount );
- Free_MarkArray( &mmp->Mark1Array );
- _HB_OPEN_Free_Coverage( &mmp->Mark2Coverage );
- _HB_OPEN_Free_Coverage( &mmp->Mark1Coverage );
-}
-
-
-static HB_Error Lookup_MarkMarkPos( GPOS_Instance* gpi,
- HB_GPOS_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort i, j, mark1_index, mark2_index, property, class;
- HB_Fixed x_mark1_value, y_mark1_value,
- x_mark2_value, y_mark2_value;
- HB_Error error;
- HB_GPOSHeader* gpos = gpi->gpos;
- HB_MarkMarkPos* mmp = &st->markmark;
-
- HB_MarkArray* ma1;
- HB_Mark2Array* ma2;
- HB_Mark2Record* m2r;
- HB_Anchor* mark1_anchor;
- HB_Anchor* mark2_anchor;
-
- HB_Position o;
-
- HB_UNUSED(nesting_level);
-
- if ( context_length != 0xFFFF && context_length < 1 )
- return HB_Err_Not_Covered;
-
- if ( flags & HB_LOOKUP_FLAG_IGNORE_MARKS )
- return HB_Err_Not_Covered;
-
- if ( CHECK_Property( gpos->gdef, IN_CURITEM(),
- flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &mmp->Mark1Coverage, IN_CURGLYPH(),
- &mark1_index );
- if ( error )
- return error;
-
- /* now we search backwards for a suitable mark glyph until a non-mark
- glyph */
-
- if ( buffer->in_pos == 0 )
- return HB_Err_Not_Covered;
-
- i = 1;
- j = buffer->in_pos - 1;
- while ( i <= buffer->in_pos )
- {
- error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ),
- &property );
- if ( error )
- return error;
-
- if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) )
- return HB_Err_Not_Covered;
-
- if ( flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS )
- {
- if ( property == (flags & 0xFF00) )
- break;
- }
- else
- break;
-
- i++;
- j--;
- }
-
- if ( i > buffer->in_pos )
- return HB_Err_Not_Covered;
-
- error = _HB_OPEN_Coverage_Index( &mmp->Mark2Coverage, IN_GLYPH( j ),
- &mark2_index );
- if ( error )
- return error;
-
- ma1 = &mmp->Mark1Array;
-
- if ( mark1_index >= ma1->MarkCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- class = ma1->MarkRecord[mark1_index].Class;
- mark1_anchor = &ma1->MarkRecord[mark1_index].MarkAnchor;
-
- if ( class >= mmp->ClassCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- ma2 = &mmp->Mark2Array;
-
- if ( mark2_index >= ma2->Mark2Count )
- return ERR(HB_Err_Invalid_SubTable);
-
- m2r = &ma2->Mark2Record[mark2_index];
- mark2_anchor = &m2r->Mark2Anchor[class];
-
- error = Get_Anchor( gpi, mark1_anchor, IN_CURGLYPH(),
- &x_mark1_value, &y_mark1_value );
- if ( error )
- return error;
- error = Get_Anchor( gpi, mark2_anchor, IN_GLYPH( j ),
- &x_mark2_value, &y_mark2_value );
- if ( error )
- return error;
-
- /* anchor points are not cumulative */
-
- o = POSITION( buffer->in_pos );
-
- o->x_pos = x_mark2_value - x_mark1_value;
- o->y_pos = y_mark2_value - y_mark1_value;
- o->x_advance = 0;
- o->y_advance = 0;
- o->back = 1;
-
- (buffer->in_pos)++;
-
- return HB_Err_Ok;
-}
-
-
-/* Do the actual positioning for a context positioning (either format
- 7 or 8). This is only called after we've determined that the stream
- matches the subrule. */
-
-static HB_Error Do_ContextPos( GPOS_Instance* gpi,
- HB_UShort GlyphCount,
- HB_UShort PosCount,
- HB_PosLookupRecord* pos,
- HB_Buffer buffer,
- int nesting_level )
-{
- HB_Error error;
- HB_UInt i, old_pos;
-
-
- i = 0;
-
- while ( i < GlyphCount )
- {
- if ( PosCount && i == pos->SequenceIndex )
- {
- old_pos = buffer->in_pos;
-
- /* Do a positioning */
-
- error = GPOS_Do_Glyph_Lookup( gpi, pos->LookupListIndex, buffer,
- GlyphCount, nesting_level );
-
- if ( error )
- return error;
-
- pos++;
- PosCount--;
- i += buffer->in_pos - old_pos;
- }
- else
- {
- i++;
- (buffer->in_pos)++;
- }
- }
-
- return HB_Err_Ok;
-}
-
-
-/* LookupType 7 */
-
-/* PosRule */
-
-static HB_Error Load_PosRule( HB_PosRule* pr,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
- HB_UShort* i;
-
- HB_PosLookupRecord* plr;
-
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- pr->GlyphCount = GET_UShort();
- pr->PosCount = GET_UShort();
-
- FORGET_Frame();
-
- pr->Input = NULL;
-
- count = pr->GlyphCount - 1; /* only GlyphCount - 1 elements */
-
- if ( ALLOC_ARRAY( pr->Input, count, HB_UShort ) )
- return error;
-
- i = pr->Input;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail2;
-
- for ( n = 0; n < count; n++ )
- i[n] = GET_UShort();
-
- FORGET_Frame();
-
- pr->PosLookupRecord = NULL;
-
- count = pr->PosCount;
-
- if ( ALLOC_ARRAY( pr->PosLookupRecord, count, HB_PosLookupRecord ) )
- goto Fail2;
-
- plr = pr->PosLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- plr[n].SequenceIndex = GET_UShort();
- plr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( plr );
-
-Fail2:
- FREE( i );
- return error;
-}
-
-
-static void Free_PosRule( HB_PosRule* pr )
-{
- FREE( pr->PosLookupRecord );
- FREE( pr->Input );
-}
-
-
-/* PosRuleSet */
-
-static HB_Error Load_PosRuleSet( HB_PosRuleSet* prs,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_PosRule* pr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = prs->PosRuleCount = GET_UShort();
-
- FORGET_Frame();
-
- prs->PosRule = NULL;
-
- if ( ALLOC_ARRAY( prs->PosRule, count, HB_PosRule ) )
- return error;
-
- pr = prs->PosRule;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_PosRule( &pr[n], stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_PosRule( &pr[m] );
-
- FREE( pr );
- return error;
-}
-
-
-static void Free_PosRuleSet( HB_PosRuleSet* prs )
-{
- HB_UShort n, count;
-
- HB_PosRule* pr;
-
-
- if ( prs->PosRule )
- {
- count = prs->PosRuleCount;
- pr = prs->PosRule;
-
- for ( n = 0; n < count; n++ )
- Free_PosRule( &pr[n] );
-
- FREE( pr );
- }
-}
-
-
-/* ContextPosFormat1 */
-
-static HB_Error Load_ContextPos1( HB_ContextPosFormat1* cpf1,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_PosRuleSet* prs;
-
-
- base_offset = FILE_Pos() - 2L;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &cpf1->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = cpf1->PosRuleSetCount = GET_UShort();
-
- FORGET_Frame();
-
- cpf1->PosRuleSet = NULL;
-
- if ( ALLOC_ARRAY( cpf1->PosRuleSet, count, HB_PosRuleSet ) )
- goto Fail2;
-
- prs = cpf1->PosRuleSet;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_PosRuleSet( &prs[n], stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_PosRuleSet( &prs[m] );
-
- FREE( prs );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &cpf1->Coverage );
- return error;
-}
-
-
-static void Free_ContextPos1( HB_ContextPosFormat1* cpf1 )
-{
- HB_UShort n, count;
-
- HB_PosRuleSet* prs;
-
-
- if ( cpf1->PosRuleSet )
- {
- count = cpf1->PosRuleSetCount;
- prs = cpf1->PosRuleSet;
-
- for ( n = 0; n < count; n++ )
- Free_PosRuleSet( &prs[n] );
-
- FREE( prs );
- }
-
- _HB_OPEN_Free_Coverage( &cpf1->Coverage );
-}
-
-
-/* PosClassRule */
-
-static HB_Error Load_PosClassRule( HB_ContextPosFormat2* cpf2,
- HB_PosClassRule* pcr,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
-
- HB_UShort* c;
- HB_PosLookupRecord* plr;
-
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- pcr->GlyphCount = GET_UShort();
- pcr->PosCount = GET_UShort();
-
- FORGET_Frame();
-
- if ( pcr->GlyphCount > cpf2->MaxContextLength )
- cpf2->MaxContextLength = pcr->GlyphCount;
-
- pcr->Class = NULL;
-
- count = pcr->GlyphCount - 1; /* only GlyphCount - 1 elements */
-
- if ( ALLOC_ARRAY( pcr->Class, count, HB_UShort ) )
- return error;
-
- c = pcr->Class;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail2;
-
- for ( n = 0; n < count; n++ )
- c[n] = GET_UShort();
-
- FORGET_Frame();
-
- pcr->PosLookupRecord = NULL;
-
- count = pcr->PosCount;
-
- if ( ALLOC_ARRAY( pcr->PosLookupRecord, count, HB_PosLookupRecord ) )
- goto Fail2;
-
- plr = pcr->PosLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- plr[n].SequenceIndex = GET_UShort();
- plr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( plr );
-
-Fail2:
- FREE( c );
- return error;
-}
-
-
-static void Free_PosClassRule( HB_PosClassRule* pcr )
-{
- FREE( pcr->PosLookupRecord );
- FREE( pcr->Class );
-}
-
-
-/* PosClassSet */
-
-static HB_Error Load_PosClassSet( HB_ContextPosFormat2* cpf2,
- HB_PosClassSet* pcs,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_PosClassRule* pcr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = pcs->PosClassRuleCount = GET_UShort();
-
- FORGET_Frame();
-
- pcs->PosClassRule = NULL;
-
- if ( ALLOC_ARRAY( pcs->PosClassRule, count, HB_PosClassRule ) )
- return error;
-
- pcr = pcs->PosClassRule;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_PosClassRule( cpf2, &pcr[n],
- stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_PosClassRule( &pcr[m] );
-
- FREE( pcr );
- return error;
-}
-
-
-static void Free_PosClassSet( HB_PosClassSet* pcs )
-{
- HB_UShort n, count;
-
- HB_PosClassRule* pcr;
-
-
- if ( pcs->PosClassRule )
- {
- count = pcs->PosClassRuleCount;
- pcr = pcs->PosClassRule;
-
- for ( n = 0; n < count; n++ )
- Free_PosClassRule( &pcr[n] );
-
- FREE( pcr );
- }
-}
-
-
-/* ContextPosFormat2 */
-
-static HB_Error Load_ContextPos2( HB_ContextPosFormat2* cpf2,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_PosClassSet* pcs;
-
-
- base_offset = FILE_Pos() - 2;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &cpf2->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 4L ) )
- goto Fail3;
-
- new_offset = GET_UShort() + base_offset;
-
- /* `PosClassSetCount' is the upper limit for class values, thus we
- read it now to make an additional safety check. */
-
- count = cpf2->PosClassSetCount = GET_UShort();
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_ClassDefinition( &cpf2->ClassDef, count,
- stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
-
- cpf2->PosClassSet = NULL;
- cpf2->MaxContextLength = 0;
-
- if ( ALLOC_ARRAY( cpf2->PosClassSet, count, HB_PosClassSet ) )
- goto Fail2;
-
- pcs = cpf2->PosClassSet;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- if ( new_offset != base_offset ) /* not a NULL offset */
- {
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_PosClassSet( cpf2, &pcs[n],
- stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
- else
- {
- /* we create a PosClassSet table with no entries */
-
- cpf2->PosClassSet[n].PosClassRuleCount = 0;
- cpf2->PosClassSet[n].PosClassRule = NULL;
- }
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_PosClassSet( &pcs[m] );
-
- FREE( pcs );
-
-Fail2:
- _HB_OPEN_Free_ClassDefinition( &cpf2->ClassDef );
-
-Fail3:
- _HB_OPEN_Free_Coverage( &cpf2->Coverage );
- return error;
-}
-
-
-static void Free_ContextPos2( HB_ContextPosFormat2* cpf2 )
-{
- HB_UShort n, count;
-
- HB_PosClassSet* pcs;
-
-
- if ( cpf2->PosClassSet )
- {
- count = cpf2->PosClassSetCount;
- pcs = cpf2->PosClassSet;
-
- for ( n = 0; n < count; n++ )
- Free_PosClassSet( &pcs[n] );
-
- FREE( pcs );
- }
-
- _HB_OPEN_Free_ClassDefinition( &cpf2->ClassDef );
- _HB_OPEN_Free_Coverage( &cpf2->Coverage );
-}
-
-
-/* ContextPosFormat3 */
-
-static HB_Error Load_ContextPos3( HB_ContextPosFormat3* cpf3,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_Coverage* c;
- HB_PosLookupRecord* plr;
-
-
- base_offset = FILE_Pos() - 2L;
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- cpf3->GlyphCount = GET_UShort();
- cpf3->PosCount = GET_UShort();
-
- FORGET_Frame();
-
- cpf3->Coverage = NULL;
-
- count = cpf3->GlyphCount;
-
- if ( ALLOC_ARRAY( cpf3->Coverage, count, HB_Coverage ) )
- return error;
-
- c = cpf3->Coverage;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &c[n], stream ) ) != HB_Err_Ok )
- goto Fail2;
- (void)FILE_Seek( cur_offset );
- }
-
- cpf3->PosLookupRecord = NULL;
-
- count = cpf3->PosCount;
-
- if ( ALLOC_ARRAY( cpf3->PosLookupRecord, count, HB_PosLookupRecord ) )
- goto Fail2;
-
- plr = cpf3->PosLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- plr[n].SequenceIndex = GET_UShort();
- plr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( plr );
-
-Fail2:
- for ( n = 0; n < count; n++ )
- _HB_OPEN_Free_Coverage( &c[n] );
-
- FREE( c );
- return error;
-}
-
-
-static void Free_ContextPos3( HB_ContextPosFormat3* cpf3 )
-{
- HB_UShort n, count;
-
- HB_Coverage* c;
-
-
- FREE( cpf3->PosLookupRecord );
-
- if ( cpf3->Coverage )
- {
- count = cpf3->GlyphCount;
- c = cpf3->Coverage;
-
- for ( n = 0; n < count; n++ )
- _HB_OPEN_Free_Coverage( &c[n] );
-
- FREE( c );
- }
-}
-
-
-/* ContextPos */
-
-static HB_Error Load_ContextPos( HB_GPOS_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_ContextPos* cp = &st->context;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- cp->PosFormat = GET_UShort();
-
- FORGET_Frame();
-
- switch ( cp->PosFormat )
- {
- case 1:
- return Load_ContextPos1( &cp->cpf.cpf1, stream );
-
- case 2:
- return Load_ContextPos2( &cp->cpf.cpf2, stream );
-
- case 3:
- return Load_ContextPos3( &cp->cpf.cpf3, stream );
-
- default:
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok; /* never reached */
-}
-
-
-static void Free_ContextPos( HB_GPOS_SubTable* st )
-{
- HB_ContextPos* cp = &st->context;
-
- switch ( cp->PosFormat )
- {
- case 1: Free_ContextPos1( &cp->cpf.cpf1 ); break;
- case 2: Free_ContextPos2( &cp->cpf.cpf2 ); break;
- case 3: Free_ContextPos3( &cp->cpf.cpf3 ); break;
- default: break;
- }
-}
-
-
-static HB_Error Lookup_ContextPos1( GPOS_Instance* gpi,
- HB_ContextPosFormat1* cpf1,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, property;
- HB_UShort i, j, k, numpr;
- HB_Error error;
- HB_GPOSHeader* gpos = gpi->gpos;
-
- HB_PosRule* pr;
- HB_GDEFHeader* gdef;
-
-
- gdef = gpos->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &cpf1->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- pr = cpf1->PosRuleSet[index].PosRule;
- numpr = cpf1->PosRuleSet[index].PosRuleCount;
-
- for ( k = 0; k < numpr; k++ )
- {
- if ( context_length != 0xFFFF && context_length < pr[k].GlyphCount )
- goto next_posrule;
-
- if ( buffer->in_pos + pr[k].GlyphCount > buffer->in_length )
- goto next_posrule; /* context is too long */
-
- for ( i = 1, j = buffer->in_pos + 1; i < pr[k].GlyphCount; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + pr[k].GlyphCount - i == (HB_Int)buffer->in_length )
- goto next_posrule;
- j++;
- }
-
- if ( IN_GLYPH( j ) != pr[k].Input[i - 1] )
- goto next_posrule;
- }
-
- return Do_ContextPos( gpi, pr[k].GlyphCount,
- pr[k].PosCount, pr[k].PosLookupRecord,
- buffer,
- nesting_level );
-
- next_posrule:
- ;
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-static HB_Error Lookup_ContextPos2( GPOS_Instance* gpi,
- HB_ContextPosFormat2* cpf2,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, property;
- HB_Error error;
- HB_UShort i, j, k, known_classes;
-
- HB_UShort* classes;
- HB_UShort* cl;
- HB_GPOSHeader* gpos = gpi->gpos;
-
- HB_PosClassSet* pcs;
- HB_PosClassRule* pr;
- HB_GDEFHeader* gdef;
-
-
- gdef = gpos->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- /* Note: The coverage table in format 2 doesn't give an index into
- anything. It just lets us know whether or not we need to
- do any lookup at all. */
-
- error = _HB_OPEN_Coverage_Index( &cpf2->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- if (cpf2->MaxContextLength < 1)
- return HB_Err_Not_Covered;
-
- if ( ALLOC_ARRAY( classes, cpf2->MaxContextLength, HB_UShort ) )
- return error;
-
- error = _HB_OPEN_Get_Class( &cpf2->ClassDef, IN_CURGLYPH(),
- &classes[0], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End;
- known_classes = 0;
-
- pcs = &cpf2->PosClassSet[classes[0]];
- if ( !pcs )
- {
- error = ERR(HB_Err_Invalid_SubTable);
- goto End;
- }
-
- for ( k = 0; k < pcs->PosClassRuleCount; k++ )
- {
- pr = &pcs->PosClassRule[k];
-
- if ( context_length != 0xFFFF && context_length < pr->GlyphCount )
- goto next_posclassrule;
-
- if ( buffer->in_pos + pr->GlyphCount > buffer->in_length )
- goto next_posclassrule; /* context is too long */
-
- cl = pr->Class;
-
- /* Start at 1 because [0] is implied */
-
- for ( i = 1, j = buffer->in_pos + 1; i < pr->GlyphCount; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- goto End;
-
- if ( j + pr->GlyphCount - i == (HB_Int)buffer->in_length )
- goto next_posclassrule;
- j++;
- }
-
- if ( i > known_classes )
- {
- /* Keeps us from having to do this for each rule */
-
- error = _HB_OPEN_Get_Class( &cpf2->ClassDef, IN_GLYPH( j ), &classes[i], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End;
- known_classes = i;
- }
-
- if ( cl[i - 1] != classes[i] )
- goto next_posclassrule;
- }
-
- error = Do_ContextPos( gpi, pr->GlyphCount,
- pr->PosCount, pr->PosLookupRecord,
- buffer,
- nesting_level );
- goto End;
-
- next_posclassrule:
- ;
- }
-
- error = HB_Err_Not_Covered;
-
-End:
- FREE( classes );
- return error;
-}
-
-
-static HB_Error Lookup_ContextPos3( GPOS_Instance* gpi,
- HB_ContextPosFormat3* cpf3,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_Error error;
- HB_UShort index, i, j, property;
- HB_GPOSHeader* gpos = gpi->gpos;
-
- HB_Coverage* c;
- HB_GDEFHeader* gdef;
-
-
- gdef = gpos->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- if ( context_length != 0xFFFF && context_length < cpf3->GlyphCount )
- return HB_Err_Not_Covered;
-
- if ( buffer->in_pos + cpf3->GlyphCount > buffer->in_length )
- return HB_Err_Not_Covered; /* context is too long */
-
- c = cpf3->Coverage;
-
- for ( i = 1, j = 1; i < cpf3->GlyphCount; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + cpf3->GlyphCount - i == (HB_Int)buffer->in_length )
- return HB_Err_Not_Covered;
- j++;
- }
-
- error = _HB_OPEN_Coverage_Index( &c[i], IN_GLYPH( j ), &index );
- if ( error )
- return error;
- }
-
- return Do_ContextPos( gpi, cpf3->GlyphCount,
- cpf3->PosCount, cpf3->PosLookupRecord,
- buffer,
- nesting_level );
-}
-
-
-static HB_Error Lookup_ContextPos( GPOS_Instance* gpi,
- HB_GPOS_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_ContextPos* cp = &st->context;
-
- switch ( cp->PosFormat )
- {
- case 1:
- return Lookup_ContextPos1( gpi, &cp->cpf.cpf1, buffer,
- flags, context_length, nesting_level );
-
- case 2:
- return Lookup_ContextPos2( gpi, &cp->cpf.cpf2, buffer,
- flags, context_length, nesting_level );
-
- case 3:
- return Lookup_ContextPos3( gpi, &cp->cpf.cpf3, buffer,
- flags, context_length, nesting_level );
-
- default:
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok; /* never reached */
-}
-
-
-/* LookupType 8 */
-
-/* ChainPosRule */
-
-static HB_Error Load_ChainPosRule( HB_ChainPosRule* cpr,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
- HB_UShort* b;
- HB_UShort* i;
- HB_UShort* l;
-
- HB_PosLookupRecord* plr;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- cpr->BacktrackGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- cpr->Backtrack = NULL;
-
- count = cpr->BacktrackGlyphCount;
-
- if ( ALLOC_ARRAY( cpr->Backtrack, count, HB_UShort ) )
- return error;
-
- b = cpr->Backtrack;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail4;
-
- for ( n = 0; n < count; n++ )
- b[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail4;
-
- cpr->InputGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- cpr->Input = NULL;
-
- count = cpr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */
-
- if ( ALLOC_ARRAY( cpr->Input, count, HB_UShort ) )
- goto Fail4;
-
- i = cpr->Input;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail3;
-
- for ( n = 0; n < count; n++ )
- i[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- cpr->LookaheadGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- cpr->Lookahead = NULL;
-
- count = cpr->LookaheadGlyphCount;
-
- if ( ALLOC_ARRAY( cpr->Lookahead, count, HB_UShort ) )
- goto Fail3;
-
- l = cpr->Lookahead;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail2;
-
- for ( n = 0; n < count; n++ )
- l[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- cpr->PosCount = GET_UShort();
-
- FORGET_Frame();
-
- cpr->PosLookupRecord = NULL;
-
- count = cpr->PosCount;
-
- if ( ALLOC_ARRAY( cpr->PosLookupRecord, count, HB_PosLookupRecord ) )
- goto Fail2;
-
- plr = cpr->PosLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- plr[n].SequenceIndex = GET_UShort();
- plr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( plr );
-
-Fail2:
- FREE( l );
-
-Fail3:
- FREE( i );
-
-Fail4:
- FREE( b );
- return error;
-}
-
-
-static void Free_ChainPosRule( HB_ChainPosRule* cpr )
-{
- FREE( cpr->PosLookupRecord );
- FREE( cpr->Lookahead );
- FREE( cpr->Input );
- FREE( cpr->Backtrack );
-}
-
-
-/* ChainPosRuleSet */
-
-static HB_Error Load_ChainPosRuleSet( HB_ChainPosRuleSet* cprs,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_ChainPosRule* cpr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = cprs->ChainPosRuleCount = GET_UShort();
-
- FORGET_Frame();
-
- cprs->ChainPosRule = NULL;
-
- if ( ALLOC_ARRAY( cprs->ChainPosRule, count, HB_ChainPosRule ) )
- return error;
-
- cpr = cprs->ChainPosRule;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_ChainPosRule( &cpr[n], stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_ChainPosRule( &cpr[m] );
-
- FREE( cpr );
- return error;
-}
-
-
-static void Free_ChainPosRuleSet( HB_ChainPosRuleSet* cprs )
-{
- HB_UShort n, count;
-
- HB_ChainPosRule* cpr;
-
-
- if ( cprs->ChainPosRule )
- {
- count = cprs->ChainPosRuleCount;
- cpr = cprs->ChainPosRule;
-
- for ( n = 0; n < count; n++ )
- Free_ChainPosRule( &cpr[n] );
-
- FREE( cpr );
- }
-}
-
-
-/* ChainContextPosFormat1 */
-
-static HB_Error Load_ChainContextPos1( HB_ChainContextPosFormat1* ccpf1,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_ChainPosRuleSet* cprs;
-
-
- base_offset = FILE_Pos() - 2L;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &ccpf1->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = ccpf1->ChainPosRuleSetCount = GET_UShort();
-
- FORGET_Frame();
-
- ccpf1->ChainPosRuleSet = NULL;
-
- if ( ALLOC_ARRAY( ccpf1->ChainPosRuleSet, count, HB_ChainPosRuleSet ) )
- goto Fail2;
-
- cprs = ccpf1->ChainPosRuleSet;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_ChainPosRuleSet( &cprs[n], stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_ChainPosRuleSet( &cprs[m] );
-
- FREE( cprs );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &ccpf1->Coverage );
- return error;
-}
-
-
-static void Free_ChainContextPos1( HB_ChainContextPosFormat1* ccpf1 )
-{
- HB_UShort n, count;
-
- HB_ChainPosRuleSet* cprs;
-
-
- if ( ccpf1->ChainPosRuleSet )
- {
- count = ccpf1->ChainPosRuleSetCount;
- cprs = ccpf1->ChainPosRuleSet;
-
- for ( n = 0; n < count; n++ )
- Free_ChainPosRuleSet( &cprs[n] );
-
- FREE( cprs );
- }
-
- _HB_OPEN_Free_Coverage( &ccpf1->Coverage );
-}
-
-
-/* ChainPosClassRule */
-
-static HB_Error Load_ChainPosClassRule(
- HB_ChainContextPosFormat2* ccpf2,
- HB_ChainPosClassRule* cpcr,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
-
- HB_UShort* b;
- HB_UShort* i;
- HB_UShort* l;
- HB_PosLookupRecord* plr;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- cpcr->BacktrackGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- if ( cpcr->BacktrackGlyphCount > ccpf2->MaxBacktrackLength )
- ccpf2->MaxBacktrackLength = cpcr->BacktrackGlyphCount;
-
- cpcr->Backtrack = NULL;
-
- count = cpcr->BacktrackGlyphCount;
-
- if ( ALLOC_ARRAY( cpcr->Backtrack, count, HB_UShort ) )
- return error;
-
- b = cpcr->Backtrack;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail4;
-
- for ( n = 0; n < count; n++ )
- b[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail4;
-
- cpcr->InputGlyphCount = GET_UShort();
-
- if ( cpcr->InputGlyphCount > ccpf2->MaxInputLength )
- ccpf2->MaxInputLength = cpcr->InputGlyphCount;
-
- FORGET_Frame();
-
- cpcr->Input = NULL;
-
- count = cpcr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */
-
- if ( ALLOC_ARRAY( cpcr->Input, count, HB_UShort ) )
- goto Fail4;
-
- i = cpcr->Input;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail3;
-
- for ( n = 0; n < count; n++ )
- i[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- cpcr->LookaheadGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- if ( cpcr->LookaheadGlyphCount > ccpf2->MaxLookaheadLength )
- ccpf2->MaxLookaheadLength = cpcr->LookaheadGlyphCount;
-
- cpcr->Lookahead = NULL;
-
- count = cpcr->LookaheadGlyphCount;
-
- if ( ALLOC_ARRAY( cpcr->Lookahead, count, HB_UShort ) )
- goto Fail3;
-
- l = cpcr->Lookahead;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail2;
-
- for ( n = 0; n < count; n++ )
- l[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- cpcr->PosCount = GET_UShort();
-
- FORGET_Frame();
-
- cpcr->PosLookupRecord = NULL;
-
- count = cpcr->PosCount;
-
- if ( ALLOC_ARRAY( cpcr->PosLookupRecord, count, HB_PosLookupRecord ) )
- goto Fail2;
-
- plr = cpcr->PosLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- plr[n].SequenceIndex = GET_UShort();
- plr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( plr );
-
-Fail2:
- FREE( l );
-
-Fail3:
- FREE( i );
-
-Fail4:
- FREE( b );
- return error;
-}
-
-
-static void Free_ChainPosClassRule( HB_ChainPosClassRule* cpcr )
-{
- FREE( cpcr->PosLookupRecord );
- FREE( cpcr->Lookahead );
- FREE( cpcr->Input );
- FREE( cpcr->Backtrack );
-}
-
-
-/* PosClassSet */
-
-static HB_Error Load_ChainPosClassSet(
- HB_ChainContextPosFormat2* ccpf2,
- HB_ChainPosClassSet* cpcs,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_ChainPosClassRule* cpcr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = cpcs->ChainPosClassRuleCount = GET_UShort();
-
- FORGET_Frame();
-
- cpcs->ChainPosClassRule = NULL;
-
- if ( ALLOC_ARRAY( cpcs->ChainPosClassRule, count,
- HB_ChainPosClassRule ) )
- return error;
-
- cpcr = cpcs->ChainPosClassRule;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_ChainPosClassRule( ccpf2, &cpcr[n],
- stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_ChainPosClassRule( &cpcr[m] );
-
- FREE( cpcr );
- return error;
-}
-
-
-static void Free_ChainPosClassSet( HB_ChainPosClassSet* cpcs )
-{
- HB_UShort n, count;
-
- HB_ChainPosClassRule* cpcr;
-
-
- if ( cpcs->ChainPosClassRule )
- {
- count = cpcs->ChainPosClassRuleCount;
- cpcr = cpcs->ChainPosClassRule;
-
- for ( n = 0; n < count; n++ )
- Free_ChainPosClassRule( &cpcr[n] );
-
- FREE( cpcr );
- }
-}
-
-
-/* ChainContextPosFormat2 */
-
-static HB_Error Load_ChainContextPos2( HB_ChainContextPosFormat2* ccpf2,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
- HB_UInt backtrack_offset, input_offset, lookahead_offset;
-
- HB_ChainPosClassSet* cpcs;
-
-
- base_offset = FILE_Pos() - 2;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &ccpf2->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 8L ) )
- goto Fail5;
-
- backtrack_offset = GET_UShort();
- input_offset = GET_UShort();
- lookahead_offset = GET_UShort();
-
- /* `ChainPosClassSetCount' is the upper limit for input class values,
- thus we read it now to make an additional safety check. No limit
- is known or needed for the other two class definitions */
-
- count = ccpf2->ChainPosClassSetCount = GET_UShort();
-
- FORGET_Frame();
-
- if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->BacktrackClassDef, 65535,
- backtrack_offset, base_offset,
- stream ) ) != HB_Err_Ok )
- goto Fail5;
- if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->InputClassDef, count,
- input_offset, base_offset,
- stream ) ) != HB_Err_Ok )
- goto Fail4;
- if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->LookaheadClassDef, 65535,
- lookahead_offset, base_offset,
- stream ) ) != HB_Err_Ok )
- goto Fail3;
-
- ccpf2->ChainPosClassSet = NULL;
- ccpf2->MaxBacktrackLength = 0;
- ccpf2->MaxInputLength = 0;
- ccpf2->MaxLookaheadLength = 0;
-
- if ( ALLOC_ARRAY( ccpf2->ChainPosClassSet, count, HB_ChainPosClassSet ) )
- goto Fail2;
-
- cpcs = ccpf2->ChainPosClassSet;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- if ( new_offset != base_offset ) /* not a NULL offset */
- {
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_ChainPosClassSet( ccpf2, &cpcs[n],
- stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
- else
- {
- /* we create a ChainPosClassSet table with no entries */
-
- ccpf2->ChainPosClassSet[n].ChainPosClassRuleCount = 0;
- ccpf2->ChainPosClassSet[n].ChainPosClassRule = NULL;
- }
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_ChainPosClassSet( &cpcs[m] );
-
- FREE( cpcs );
-
-Fail2:
- _HB_OPEN_Free_ClassDefinition( &ccpf2->LookaheadClassDef );
-
-Fail3:
- _HB_OPEN_Free_ClassDefinition( &ccpf2->InputClassDef );
-
-Fail4:
- _HB_OPEN_Free_ClassDefinition( &ccpf2->BacktrackClassDef );
-
-Fail5:
- _HB_OPEN_Free_Coverage( &ccpf2->Coverage );
- return error;
-}
-
-
-static void Free_ChainContextPos2( HB_ChainContextPosFormat2* ccpf2 )
-{
- HB_UShort n, count;
-
- HB_ChainPosClassSet* cpcs;
-
-
- if ( ccpf2->ChainPosClassSet )
- {
- count = ccpf2->ChainPosClassSetCount;
- cpcs = ccpf2->ChainPosClassSet;
-
- for ( n = 0; n < count; n++ )
- Free_ChainPosClassSet( &cpcs[n] );
-
- FREE( cpcs );
- }
-
- _HB_OPEN_Free_ClassDefinition( &ccpf2->LookaheadClassDef );
- _HB_OPEN_Free_ClassDefinition( &ccpf2->InputClassDef );
- _HB_OPEN_Free_ClassDefinition( &ccpf2->BacktrackClassDef );
-
- _HB_OPEN_Free_Coverage( &ccpf2->Coverage );
-}
-
-
-/* ChainContextPosFormat3 */
-
-static HB_Error Load_ChainContextPos3( HB_ChainContextPosFormat3* ccpf3,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, nb, ni, nl, m, count;
- HB_UShort backtrack_count, input_count, lookahead_count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_Coverage* b;
- HB_Coverage* i;
- HB_Coverage* l;
- HB_PosLookupRecord* plr;
-
-
- base_offset = FILE_Pos() - 2L;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- ccpf3->BacktrackGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- ccpf3->BacktrackCoverage = NULL;
-
- backtrack_count = ccpf3->BacktrackGlyphCount;
-
- if ( ALLOC_ARRAY( ccpf3->BacktrackCoverage, backtrack_count,
- HB_Coverage ) )
- return error;
-
- b = ccpf3->BacktrackCoverage;
-
- for ( nb = 0; nb < backtrack_count; nb++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail4;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok )
- goto Fail4;
- (void)FILE_Seek( cur_offset );
- }
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail4;
-
- ccpf3->InputGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- ccpf3->InputCoverage = NULL;
-
- input_count = ccpf3->InputGlyphCount;
-
- if ( ALLOC_ARRAY( ccpf3->InputCoverage, input_count, HB_Coverage ) )
- goto Fail4;
-
- i = ccpf3->InputCoverage;
-
- for ( ni = 0; ni < input_count; ni++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &i[ni], stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
- }
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- ccpf3->LookaheadGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- ccpf3->LookaheadCoverage = NULL;
-
- lookahead_count = ccpf3->LookaheadGlyphCount;
-
- if ( ALLOC_ARRAY( ccpf3->LookaheadCoverage, lookahead_count,
- HB_Coverage ) )
- goto Fail3;
-
- l = ccpf3->LookaheadCoverage;
-
- for ( nl = 0; nl < lookahead_count; nl++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok )
- goto Fail2;
- (void)FILE_Seek( cur_offset );
- }
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- ccpf3->PosCount = GET_UShort();
-
- FORGET_Frame();
-
- ccpf3->PosLookupRecord = NULL;
-
- count = ccpf3->PosCount;
-
- if ( ALLOC_ARRAY( ccpf3->PosLookupRecord, count, HB_PosLookupRecord ) )
- goto Fail2;
-
- plr = ccpf3->PosLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- plr[n].SequenceIndex = GET_UShort();
- plr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( plr );
-
-Fail2:
- for ( m = 0; m < nl; m++ )
- _HB_OPEN_Free_Coverage( &l[m] );
-
- FREE( l );
-
-Fail3:
- for ( m = 0; m < ni; m++ )
- _HB_OPEN_Free_Coverage( &i[m] );
-
- FREE( i );
-
-Fail4:
- for ( m = 0; m < nb; m++ )
- _HB_OPEN_Free_Coverage( &b[m] );
-
- FREE( b );
- return error;
-}
-
-
-static void Free_ChainContextPos3( HB_ChainContextPosFormat3* ccpf3 )
-{
- HB_UShort n, count;
-
- HB_Coverage* c;
-
-
- FREE( ccpf3->PosLookupRecord );
-
- if ( ccpf3->LookaheadCoverage )
- {
- count = ccpf3->LookaheadGlyphCount;
- c = ccpf3->LookaheadCoverage;
-
- for ( n = 0; n < count; n++ )
- _HB_OPEN_Free_Coverage( &c[n] );
-
- FREE( c );
- }
-
- if ( ccpf3->InputCoverage )
- {
- count = ccpf3->InputGlyphCount;
- c = ccpf3->InputCoverage;
-
- for ( n = 0; n < count; n++ )
- _HB_OPEN_Free_Coverage( &c[n] );
-
- FREE( c );
- }
-
- if ( ccpf3->BacktrackCoverage )
- {
- count = ccpf3->BacktrackGlyphCount;
- c = ccpf3->BacktrackCoverage;
-
- for ( n = 0; n < count; n++ )
- _HB_OPEN_Free_Coverage( &c[n] );
-
- FREE( c );
- }
-}
-
-
-/* ChainContextPos */
-
-static HB_Error Load_ChainContextPos( HB_GPOS_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_ChainContextPos* ccp = &st->chain;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- ccp->PosFormat = GET_UShort();
-
- FORGET_Frame();
-
- switch ( ccp->PosFormat )
- {
- case 1:
- return Load_ChainContextPos1( &ccp->ccpf.ccpf1, stream );
-
- case 2:
- return Load_ChainContextPos2( &ccp->ccpf.ccpf2, stream );
-
- case 3:
- return Load_ChainContextPos3( &ccp->ccpf.ccpf3, stream );
-
- default:
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok; /* never reached */
-}
-
-
-static void Free_ChainContextPos( HB_GPOS_SubTable* st )
-{
- HB_ChainContextPos* ccp = &st->chain;
-
- switch ( ccp->PosFormat )
- {
- case 1: Free_ChainContextPos1( &ccp->ccpf.ccpf1 ); break;
- case 2: Free_ChainContextPos2( &ccp->ccpf.ccpf2 ); break;
- case 3: Free_ChainContextPos3( &ccp->ccpf.ccpf3 ); break;
- default: break;
- }
-}
-
-
-static HB_Error Lookup_ChainContextPos1(
- GPOS_Instance* gpi,
- HB_ChainContextPosFormat1* ccpf1,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, property;
- HB_UShort i, j, k, num_cpr;
- HB_UShort bgc, igc, lgc;
- HB_Error error;
- HB_GPOSHeader* gpos = gpi->gpos;
-
- HB_ChainPosRule* cpr;
- HB_ChainPosRule curr_cpr;
- HB_GDEFHeader* gdef;
-
-
- gdef = gpos->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &ccpf1->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- cpr = ccpf1->ChainPosRuleSet[index].ChainPosRule;
- num_cpr = ccpf1->ChainPosRuleSet[index].ChainPosRuleCount;
-
- for ( k = 0; k < num_cpr; k++ )
- {
- curr_cpr = cpr[k];
- bgc = curr_cpr.BacktrackGlyphCount;
- igc = curr_cpr.InputGlyphCount;
- lgc = curr_cpr.LookaheadGlyphCount;
-
- if ( context_length != 0xFFFF && context_length < igc )
- goto next_chainposrule;
-
- /* check whether context is too long; it is a first guess only */
-
- if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length )
- goto next_chainposrule;
-
- if ( bgc )
- {
- /* Since we don't know in advance the number of glyphs to inspect,
- we search backwards for matches in the backtrack glyph array */
-
- for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + 1 == bgc - i )
- goto next_chainposrule;
- j--;
- }
-
- /* In OpenType 1.3, it is undefined whether the offsets of
- backtrack glyphs is in logical order or not. Version 1.4
- will clarify this:
-
- Logical order - a b c d e f g h i j
- i
- Input offsets - 0 1
- Backtrack offsets - 3 2 1 0
- Lookahead offsets - 0 1 2 3 */
-
- if ( IN_GLYPH( j ) != curr_cpr.Backtrack[i] )
- goto next_chainposrule;
- }
- }
-
- /* Start at 1 because [0] is implied */
-
- for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
- goto next_chainposrule;
- j++;
- }
-
- if ( IN_GLYPH( j ) != curr_cpr.Input[i - 1] )
- goto next_chainposrule;
- }
-
- /* we are starting to check for lookahead glyphs right after the
- last context glyph */
-
- for ( i = 0; i < lgc; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + lgc - i == (HB_Int)buffer->in_length )
- goto next_chainposrule;
- j++;
- }
-
- if ( IN_GLYPH( j ) != curr_cpr.Lookahead[i] )
- goto next_chainposrule;
- }
-
- return Do_ContextPos( gpi, igc,
- curr_cpr.PosCount,
- curr_cpr.PosLookupRecord,
- buffer,
- nesting_level );
-
- next_chainposrule:
- ;
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-static HB_Error Lookup_ChainContextPos2(
- GPOS_Instance* gpi,
- HB_ChainContextPosFormat2* ccpf2,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, property;
- HB_Error error;
- HB_UShort i, j, k;
- HB_UShort bgc, igc, lgc;
- HB_UShort known_backtrack_classes,
- known_input_classes,
- known_lookahead_classes;
-
- HB_UShort* backtrack_classes;
- HB_UShort* input_classes;
- HB_UShort* lookahead_classes;
-
- HB_UShort* bc;
- HB_UShort* ic;
- HB_UShort* lc;
- HB_GPOSHeader* gpos = gpi->gpos;
-
- HB_ChainPosClassSet* cpcs;
- HB_ChainPosClassRule cpcr;
- HB_GDEFHeader* gdef;
-
-
- gdef = gpos->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- /* Note: The coverage table in format 2 doesn't give an index into
- anything. It just lets us know whether or not we need to
- do any lookup at all. */
-
- error = _HB_OPEN_Coverage_Index( &ccpf2->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- if (ccpf2->MaxInputLength < 1)
- return HB_Err_Not_Covered;
-
- if ( ALLOC_ARRAY( backtrack_classes, ccpf2->MaxBacktrackLength, HB_UShort ) )
- return error;
- known_backtrack_classes = 0;
-
- if ( ALLOC_ARRAY( input_classes, ccpf2->MaxInputLength, HB_UShort ) )
- goto End3;
- known_input_classes = 1;
-
- if ( ALLOC_ARRAY( lookahead_classes, ccpf2->MaxLookaheadLength, HB_UShort ) )
- goto End2;
- known_lookahead_classes = 0;
-
- error = _HB_OPEN_Get_Class( &ccpf2->InputClassDef, IN_CURGLYPH(),
- &input_classes[0], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
-
- cpcs = &ccpf2->ChainPosClassSet[input_classes[0]];
- if ( !cpcs )
- {
- error = ERR(HB_Err_Invalid_SubTable);
- goto End1;
- }
-
- for ( k = 0; k < cpcs->ChainPosClassRuleCount; k++ )
- {
- cpcr = cpcs->ChainPosClassRule[k];
- bgc = cpcr.BacktrackGlyphCount;
- igc = cpcr.InputGlyphCount;
- lgc = cpcr.LookaheadGlyphCount;
-
- if ( context_length != 0xFFFF && context_length < igc )
- goto next_chainposclassrule;
-
- /* check whether context is too long; it is a first guess only */
-
- if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length )
- goto next_chainposclassrule;
-
- if ( bgc )
- {
- /* Since we don't know in advance the number of glyphs to inspect,
- we search backwards for matches in the backtrack glyph array.
- Note that `known_backtrack_classes' starts at index 0. */
-
- bc = cpcr.Backtrack;
-
- for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
-
- if ( j + 1 == bgc - i )
- goto next_chainposclassrule;
- j++;
- }
-
- if ( i >= known_backtrack_classes )
- {
- /* Keeps us from having to do this for each rule */
-
- error = _HB_OPEN_Get_Class( &ccpf2->BacktrackClassDef, IN_GLYPH( j ),
- &backtrack_classes[i], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
- known_backtrack_classes = i;
- }
-
- if ( bc[i] != backtrack_classes[i] )
- goto next_chainposclassrule;
- }
- }
-
- ic = cpcr.Input;
-
- /* Start at 1 because [0] is implied */
-
- for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
-
- if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
- goto next_chainposclassrule;
- j++;
- }
-
- if ( i >= known_input_classes )
- {
- error = _HB_OPEN_Get_Class( &ccpf2->InputClassDef, IN_GLYPH( j ),
- &input_classes[i], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
- known_input_classes = i;
- }
-
- if ( ic[i - 1] != input_classes[i] )
- goto next_chainposclassrule;
- }
-
- /* we are starting to check for lookahead glyphs right after the
- last context glyph */
-
- lc = cpcr.Lookahead;
-
- for ( i = 0; i < lgc; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
-
- if ( j + lgc - i == (HB_Int)buffer->in_length )
- goto next_chainposclassrule;
- j++;
- }
-
- if ( i >= known_lookahead_classes )
- {
- error = _HB_OPEN_Get_Class( &ccpf2->LookaheadClassDef, IN_GLYPH( j ),
- &lookahead_classes[i], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
- known_lookahead_classes = i;
- }
-
- if ( lc[i] != lookahead_classes[i] )
- goto next_chainposclassrule;
- }
-
- error = Do_ContextPos( gpi, igc,
- cpcr.PosCount,
- cpcr.PosLookupRecord,
- buffer,
- nesting_level );
- goto End1;
-
- next_chainposclassrule:
- ;
- }
-
- error = HB_Err_Not_Covered;
-
-End1:
- FREE( lookahead_classes );
-
-End2:
- FREE( input_classes );
-
-End3:
- FREE( backtrack_classes );
- return error;
-}
-
-
-static HB_Error Lookup_ChainContextPos3(
- GPOS_Instance* gpi,
- HB_ChainContextPosFormat3* ccpf3,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, i, j, property;
- HB_UShort bgc, igc, lgc;
- HB_Error error;
- HB_GPOSHeader* gpos = gpi->gpos;
-
- HB_Coverage* bc;
- HB_Coverage* ic;
- HB_Coverage* lc;
- HB_GDEFHeader* gdef;
-
-
- gdef = gpos->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- bgc = ccpf3->BacktrackGlyphCount;
- igc = ccpf3->InputGlyphCount;
- lgc = ccpf3->LookaheadGlyphCount;
-
- if ( context_length != 0xFFFF && context_length < igc )
- return HB_Err_Not_Covered;
-
- /* check whether context is too long; it is a first guess only */
-
- if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length )
- return HB_Err_Not_Covered;
-
- if ( bgc )
- {
- /* Since we don't know in advance the number of glyphs to inspect,
- we search backwards for matches in the backtrack glyph array */
-
- bc = ccpf3->BacktrackCoverage;
-
- for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + 1 == bgc - i )
- return HB_Err_Not_Covered;
- j--;
- }
-
- error = _HB_OPEN_Coverage_Index( &bc[i], IN_GLYPH( j ), &index );
- if ( error )
- return error;
- }
- }
-
- ic = ccpf3->InputCoverage;
-
- for ( i = 0, j = buffer->in_pos; i < igc; i++, j++ )
- {
- /* We already called CHECK_Property for IN_GLYPH ( buffer->in_pos ) */
- while ( j > buffer->in_pos && CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
- return HB_Err_Not_Covered;
- j++;
- }
-
- error = _HB_OPEN_Coverage_Index( &ic[i], IN_GLYPH( j ), &index );
- if ( error )
- return error;
- }
-
- /* we are starting to check for lookahead glyphs right after the
- last context glyph */
-
- lc = ccpf3->LookaheadCoverage;
-
- for ( i = 0; i < lgc; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + lgc - i == (HB_Int)buffer->in_length )
- return HB_Err_Not_Covered;
- j++;
- }
-
- error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index );
- if ( error )
- return error;
- }
-
- return Do_ContextPos( gpi, igc,
- ccpf3->PosCount,
- ccpf3->PosLookupRecord,
- buffer,
- nesting_level );
-}
-
-
-static HB_Error Lookup_ChainContextPos(
- GPOS_Instance* gpi,
- HB_GPOS_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_ChainContextPos* ccp = &st->chain;
-
- switch ( ccp->PosFormat )
- {
- case 1:
- return Lookup_ChainContextPos1( gpi, &ccp->ccpf.ccpf1, buffer,
- flags, context_length,
- nesting_level );
-
- case 2:
- return Lookup_ChainContextPos2( gpi, &ccp->ccpf.ccpf2, buffer,
- flags, context_length,
- nesting_level );
-
- case 3:
- return Lookup_ChainContextPos3( gpi, &ccp->ccpf.ccpf3, buffer,
- flags, context_length,
- nesting_level );
-
- default:
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok; /* never reached */
-}
-
-
-
-/***********
- * GPOS API
- ***********/
-
-
-
-HB_Error HB_GPOS_Select_Script( HB_GPOSHeader* gpos,
- HB_UInt script_tag,
- HB_UShort* script_index )
-{
- HB_UShort n;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
-
-
- if ( !gpos || !script_index )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gpos->ScriptList;
- sr = sl->ScriptRecord;
-
- for ( n = 0; n < sl->ScriptCount; n++ )
- if ( script_tag == sr[n].ScriptTag )
- {
- *script_index = n;
-
- return HB_Err_Ok;
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-
-HB_Error HB_GPOS_Select_Language( HB_GPOSHeader* gpos,
- HB_UInt language_tag,
- HB_UShort script_index,
- HB_UShort* language_index,
- HB_UShort* req_feature_index )
-{
- HB_UShort n;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
- HB_ScriptTable* s;
- HB_LangSysRecord* lsr;
-
-
- if ( !gpos || !language_index || !req_feature_index )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gpos->ScriptList;
- sr = sl->ScriptRecord;
-
- if ( script_index >= sl->ScriptCount )
- return ERR(HB_Err_Invalid_Argument);
-
- s = &sr[script_index].Script;
- lsr = s->LangSysRecord;
-
- for ( n = 0; n < s->LangSysCount; n++ )
- if ( language_tag == lsr[n].LangSysTag )
- {
- *language_index = n;
- *req_feature_index = lsr[n].LangSys.ReqFeatureIndex;
-
- return HB_Err_Ok;
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-/* selecting 0xFFFF for language_index asks for the values of the
- default language (DefaultLangSys) */
-
-
-HB_Error HB_GPOS_Select_Feature( HB_GPOSHeader* gpos,
- HB_UInt feature_tag,
- HB_UShort script_index,
- HB_UShort language_index,
- HB_UShort* feature_index )
-{
- HB_UShort n;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
- HB_ScriptTable* s;
- HB_LangSysRecord* lsr;
- HB_LangSys* ls;
- HB_UShort* fi;
-
- HB_FeatureList* fl;
- HB_FeatureRecord* fr;
-
-
- if ( !gpos || !feature_index )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gpos->ScriptList;
- sr = sl->ScriptRecord;
-
- fl = &gpos->FeatureList;
- fr = fl->FeatureRecord;
-
- if ( script_index >= sl->ScriptCount )
- return ERR(HB_Err_Invalid_Argument);
-
- s = &sr[script_index].Script;
- lsr = s->LangSysRecord;
-
- if ( language_index == 0xFFFF )
- ls = &s->DefaultLangSys;
- else
- {
- if ( language_index >= s->LangSysCount )
- return ERR(HB_Err_Invalid_Argument);
-
- ls = &lsr[language_index].LangSys;
- }
-
- fi = ls->FeatureIndex;
-
- for ( n = 0; n < ls->FeatureCount; n++ )
- {
- if ( fi[n] >= fl->FeatureCount )
- return ERR(HB_Err_Invalid_SubTable_Format);
-
- if ( feature_tag == fr[fi[n]].FeatureTag )
- {
- *feature_index = fi[n];
-
- return HB_Err_Ok;
- }
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-/* The next three functions return a null-terminated list */
-
-
-HB_Error HB_GPOS_Query_Scripts( HB_GPOSHeader* gpos,
- HB_UInt** script_tag_list )
-{
- HB_Error error;
- HB_UShort n;
- HB_UInt* stl;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
-
-
- if ( !gpos || !script_tag_list )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gpos->ScriptList;
- sr = sl->ScriptRecord;
-
- if ( ALLOC_ARRAY( stl, sl->ScriptCount + 1, HB_UInt ) )
- return error;
-
- for ( n = 0; n < sl->ScriptCount; n++ )
- stl[n] = sr[n].ScriptTag;
- stl[n] = 0;
-
- *script_tag_list = stl;
-
- return HB_Err_Ok;
-}
-
-
-
-HB_Error HB_GPOS_Query_Languages( HB_GPOSHeader* gpos,
- HB_UShort script_index,
- HB_UInt** language_tag_list )
-{
- HB_Error error;
- HB_UShort n;
- HB_UInt* ltl;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
- HB_ScriptTable* s;
- HB_LangSysRecord* lsr;
-
-
- if ( !gpos || !language_tag_list )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gpos->ScriptList;
- sr = sl->ScriptRecord;
-
- if ( script_index >= sl->ScriptCount )
- return ERR(HB_Err_Invalid_Argument);
-
- s = &sr[script_index].Script;
- lsr = s->LangSysRecord;
-
- if ( ALLOC_ARRAY( ltl, s->LangSysCount + 1, HB_UInt ) )
- return error;
-
- for ( n = 0; n < s->LangSysCount; n++ )
- ltl[n] = lsr[n].LangSysTag;
- ltl[n] = 0;
-
- *language_tag_list = ltl;
-
- return HB_Err_Ok;
-}
-
-
-/* selecting 0xFFFF for language_index asks for the values of the
- default language (DefaultLangSys) */
-
-
-HB_Error HB_GPOS_Query_Features( HB_GPOSHeader* gpos,
- HB_UShort script_index,
- HB_UShort language_index,
- HB_UInt** feature_tag_list )
-{
- HB_UShort n;
- HB_Error error;
- HB_UInt* ftl;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
- HB_ScriptTable* s;
- HB_LangSysRecord* lsr;
- HB_LangSys* ls;
- HB_UShort* fi;
-
- HB_FeatureList* fl;
- HB_FeatureRecord* fr;
-
-
- if ( !gpos || !feature_tag_list )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gpos->ScriptList;
- sr = sl->ScriptRecord;
-
- fl = &gpos->FeatureList;
- fr = fl->FeatureRecord;
-
- if ( script_index >= sl->ScriptCount )
- return ERR(HB_Err_Invalid_Argument);
-
- s = &sr[script_index].Script;
- lsr = s->LangSysRecord;
-
- if ( language_index == 0xFFFF )
- ls = &s->DefaultLangSys;
- else
- {
- if ( language_index >= s->LangSysCount )
- return ERR(HB_Err_Invalid_Argument);
-
- ls = &lsr[language_index].LangSys;
- }
-
- fi = ls->FeatureIndex;
-
- if ( ALLOC_ARRAY( ftl, ls->FeatureCount + 1, HB_UInt ) )
- return error;
-
- for ( n = 0; n < ls->FeatureCount; n++ )
- {
- if ( fi[n] >= fl->FeatureCount )
- {
- FREE( ftl );
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
- ftl[n] = fr[fi[n]].FeatureTag;
- }
- ftl[n] = 0;
-
- *feature_tag_list = ftl;
-
- return HB_Err_Ok;
-}
-
-
-/* Do an individual subtable lookup. Returns HB_Err_Ok if positioning
- has been done, or HB_Err_Not_Covered if not. */
-static HB_Error GPOS_Do_Glyph_Lookup( GPOS_Instance* gpi,
- HB_UShort lookup_index,
- HB_Buffer buffer,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_Error error = HB_Err_Not_Covered;
- HB_UShort i, flags, lookup_count;
- HB_GPOSHeader* gpos = gpi->gpos;
- HB_Lookup* lo;
- int lookup_type;
-
-
- nesting_level++;
-
- if ( nesting_level > HB_MAX_NESTING_LEVEL )
- return ERR(HB_Err_Not_Covered); /* ERR() call intended */
-
- lookup_count = gpos->LookupList.LookupCount;
- if (lookup_index >= lookup_count)
- return error;
-
- lo = &gpos->LookupList.Lookup[lookup_index];
- flags = lo->LookupFlag;
- lookup_type = lo->LookupType;
-
- for ( i = 0; i < lo->SubTableCount; i++ )
- {
- HB_GPOS_SubTable *st = &lo->SubTable[i].st.gpos;
-
- switch (lookup_type) {
- case HB_GPOS_LOOKUP_SINGLE:
- error = Lookup_SinglePos ( gpi, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GPOS_LOOKUP_PAIR:
- error = Lookup_PairPos ( gpi, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GPOS_LOOKUP_CURSIVE:
- error = Lookup_CursivePos ( gpi, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GPOS_LOOKUP_MARKBASE:
- error = Lookup_MarkBasePos ( gpi, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GPOS_LOOKUP_MARKLIG:
- error = Lookup_MarkLigPos ( gpi, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GPOS_LOOKUP_MARKMARK:
- error = Lookup_MarkMarkPos ( gpi, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GPOS_LOOKUP_CONTEXT:
- error = Lookup_ContextPos ( gpi, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GPOS_LOOKUP_CHAIN:
- error = Lookup_ChainContextPos ( gpi, st, buffer, flags, context_length, nesting_level ); break;
- /*case HB_GPOS_LOOKUP_EXTENSION:
- error = Lookup_ExtensionPos ( gpi, st, buffer, flags, context_length, nesting_level ); break;*/
- default:
- error = HB_Err_Not_Covered;
- }
-
- /* Check whether we have a successful positioning or an error other
- than HB_Err_Not_Covered */
- if ( error != HB_Err_Not_Covered )
- return error;
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-HB_INTERNAL HB_Error
-_HB_GPOS_Load_SubTable( HB_GPOS_SubTable* st,
- HB_Stream stream,
- HB_UShort lookup_type )
-{
- switch ( lookup_type ) {
- case HB_GPOS_LOOKUP_SINGLE: return Load_SinglePos ( st, stream );
- case HB_GPOS_LOOKUP_PAIR: return Load_PairPos ( st, stream );
- case HB_GPOS_LOOKUP_CURSIVE: return Load_CursivePos ( st, stream );
- case HB_GPOS_LOOKUP_MARKBASE: return Load_MarkBasePos ( st, stream );
- case HB_GPOS_LOOKUP_MARKLIG: return Load_MarkLigPos ( st, stream );
- case HB_GPOS_LOOKUP_MARKMARK: return Load_MarkMarkPos ( st, stream );
- case HB_GPOS_LOOKUP_CONTEXT: return Load_ContextPos ( st, stream );
- case HB_GPOS_LOOKUP_CHAIN: return Load_ChainContextPos ( st, stream );
- /*case HB_GPOS_LOOKUP_EXTENSION: return Load_ExtensionPos ( st, stream );*/
- default: return ERR(HB_Err_Invalid_SubTable_Format);
- }
-}
-
-
-HB_INTERNAL void
-_HB_GPOS_Free_SubTable( HB_GPOS_SubTable* st,
- HB_UShort lookup_type )
-{
- switch ( lookup_type ) {
- case HB_GPOS_LOOKUP_SINGLE: Free_SinglePos ( st ); return;
- case HB_GPOS_LOOKUP_PAIR: Free_PairPos ( st ); return;
- case HB_GPOS_LOOKUP_CURSIVE: Free_CursivePos ( st ); return;
- case HB_GPOS_LOOKUP_MARKBASE: Free_MarkBasePos ( st ); return;
- case HB_GPOS_LOOKUP_MARKLIG: Free_MarkLigPos ( st ); return;
- case HB_GPOS_LOOKUP_MARKMARK: Free_MarkMarkPos ( st ); return;
- case HB_GPOS_LOOKUP_CONTEXT: Free_ContextPos ( st ); return;
- case HB_GPOS_LOOKUP_CHAIN: Free_ChainContextPos ( st ); return;
- /*case HB_GPOS_LOOKUP_EXTENSION: Free_ExtensionPos ( st ); return;*/
- default: return;
- }
-}
-
-
-/* apply one lookup to the input string object */
-
-static HB_Error GPOS_Do_String_Lookup( GPOS_Instance* gpi,
- HB_UShort lookup_index,
- HB_Buffer buffer )
-{
- HB_Error error, retError = HB_Err_Not_Covered;
- HB_GPOSHeader* gpos = gpi->gpos;
-
- HB_UInt* properties = gpos->LookupList.Properties;
-
- const int nesting_level = 0;
- /* 0xFFFF indicates that we don't have a context length yet */
- const HB_UShort context_length = 0xFFFF;
-
-
- gpi->last = 0xFFFF; /* no last valid glyph for cursive pos. */
-
- buffer->in_pos = 0;
- while ( buffer->in_pos < buffer->in_length )
- {
- if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] )
- {
- /* Note that the connection between mark and base glyphs hold
- exactly one (string) lookup. For example, it would be possible
- that in the first lookup, mark glyph X is attached to base
- glyph A, and in the next lookup it is attached to base glyph B.
- It is up to the font designer to provide meaningful lookups and
- lookup order. */
-
- error = GPOS_Do_Glyph_Lookup( gpi, lookup_index, buffer, context_length, nesting_level );
- if ( error && error != HB_Err_Not_Covered )
- return error;
- }
- else
- {
- /* Contrary to properties defined in GDEF, user-defined properties
- will always stop a possible cursive positioning. */
- gpi->last = 0xFFFF;
-
- error = HB_Err_Not_Covered;
- }
-
- if ( error == HB_Err_Not_Covered )
- (buffer->in_pos)++;
- else
- retError = error;
- }
-
- return retError;
-}
-
-
-static HB_Error Position_CursiveChain ( HB_Buffer buffer )
-{
- HB_UInt i, j;
- HB_Position positions = buffer->positions;
-
- /* First handle all left-to-right connections */
- for (j = 0; j < buffer->in_length; j++)
- {
- if (positions[j].cursive_chain > 0)
- positions[j].y_pos += positions[j - positions[j].cursive_chain].y_pos;
- }
-
- /* Then handle all right-to-left connections */
- for (i = buffer->in_length; i > 0; i--)
- {
- j = i - 1;
-
- if (positions[j].cursive_chain < 0)
- positions[j].y_pos += positions[j - positions[j].cursive_chain].y_pos;
- }
-
- return HB_Err_Ok;
-}
-
-
-HB_Error HB_GPOS_Add_Feature( HB_GPOSHeader* gpos,
- HB_UShort feature_index,
- HB_UInt property )
-{
- HB_UShort i;
-
- HB_Feature feature;
- HB_UInt* properties;
- HB_UShort* index;
- HB_UShort lookup_count;
-
- /* Each feature can only be added once */
-
- if ( !gpos ||
- feature_index >= gpos->FeatureList.FeatureCount ||
- gpos->FeatureList.ApplyCount == gpos->FeatureList.FeatureCount )
- return ERR(HB_Err_Invalid_Argument);
-
- gpos->FeatureList.ApplyOrder[gpos->FeatureList.ApplyCount++] = feature_index;
-
- properties = gpos->LookupList.Properties;
-
- feature = gpos->FeatureList.FeatureRecord[feature_index].Feature;
- index = feature.LookupListIndex;
- lookup_count = gpos->LookupList.LookupCount;
-
- for ( i = 0; i < feature.LookupListCount; i++ )
- {
- HB_UShort lookup_index = index[i];
- if (lookup_index < lookup_count)
- properties[lookup_index] |= property;
- }
-
- return HB_Err_Ok;
-}
-
-
-
-HB_Error HB_GPOS_Clear_Features( HB_GPOSHeader* gpos )
-{
- HB_UShort i;
-
- HB_UInt* properties;
-
-
- if ( !gpos )
- return ERR(HB_Err_Invalid_Argument);
-
- gpos->FeatureList.ApplyCount = 0;
-
- properties = gpos->LookupList.Properties;
-
- for ( i = 0; i < gpos->LookupList.LookupCount; i++ )
- properties[i] = 0;
-
- return HB_Err_Ok;
-}
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-HB_Error HB_GPOS_Register_MM_Function( HB_GPOSHeader* gpos,
- HB_MMFunction mmfunc,
- void* data )
-{
- if ( !gpos )
- return ERR(HB_Err_Invalid_Argument);
-
- gpos->mmfunc = mmfunc;
- gpos->data = data;
-
- return HB_Err_Ok;
-}
-#endif
-
-/* If `dvi' is TRUE, glyph contour points for anchor points and device
- tables are ignored -- you will get device independent values. */
-
-
-HB_Error HB_GPOS_Apply_String( HB_Font font,
- HB_GPOSHeader* gpos,
- HB_UShort load_flags,
- HB_Buffer buffer,
- HB_Bool dvi,
- HB_Bool r2l )
-{
- HB_Error error, retError = HB_Err_Not_Covered;
- GPOS_Instance gpi;
- int i, j, lookup_count, num_features;
-
- if ( !font || !gpos || !buffer )
- return ERR(HB_Err_Invalid_Argument);
-
- if ( buffer->in_length == 0 )
- return HB_Err_Not_Covered;
-
- gpi.font = font;
- gpi.gpos = gpos;
- gpi.load_flags = load_flags;
- gpi.r2l = r2l;
- gpi.dvi = dvi;
-
- lookup_count = gpos->LookupList.LookupCount;
- num_features = gpos->FeatureList.ApplyCount;
-
- if ( num_features )
- {
- error = _hb_buffer_clear_positions( buffer );
- if ( error )
- return error;
- }
-
- for ( i = 0; i < num_features; i++ )
- {
- HB_UShort feature_index = gpos->FeatureList.ApplyOrder[i];
- HB_Feature feature = gpos->FeatureList.FeatureRecord[feature_index].Feature;
-
- for ( j = 0; j < feature.LookupListCount; j++ )
- {
- HB_UShort lookup_index = feature.LookupListIndex[j];
-
- /* Skip nonexistant lookups */
- if (lookup_index >= lookup_count)
- continue;
-
- error = GPOS_Do_String_Lookup( &gpi, lookup_index, buffer );
- if ( error )
- {
- if ( error != HB_Err_Not_Covered )
- return error;
- }
- else
- retError = error;
- }
- }
-
- if ( num_features )
- {
- error = Position_CursiveChain ( buffer );
- if ( error )
- return error;
- }
-
- return retError;
-}
-
-/* END */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.h b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.h
deleted file mode 100644
index 92bff84a94..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GPOS_H
-#define HARFBUZZ_GPOS_H
-
-#include "harfbuzz-gdef.h"
-#include "harfbuzz-buffer.h"
-
-HB_BEGIN_HEADER
-
-
-/* Lookup types for glyph positioning */
-
-#define HB_GPOS_LOOKUP_SINGLE 1
-#define HB_GPOS_LOOKUP_PAIR 2
-#define HB_GPOS_LOOKUP_CURSIVE 3
-#define HB_GPOS_LOOKUP_MARKBASE 4
-#define HB_GPOS_LOOKUP_MARKLIG 5
-#define HB_GPOS_LOOKUP_MARKMARK 6
-#define HB_GPOS_LOOKUP_CONTEXT 7
-#define HB_GPOS_LOOKUP_CHAIN 8
-#define HB_GPOS_LOOKUP_EXTENSION 9
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-/* A pointer to a function which accesses the PostScript interpreter.
- Multiple Master fonts need this interface to convert a metric ID
- (as stored in an OpenType font version 1.2 or higher) `metric_id'
- into a metric value (returned in `metric_value').
-
- `data' points to the user-defined structure specified during a
- call to HB_GPOS_Register_MM_Function().
-
- `metric_value' must be returned as a scaled value (but shouldn't
- be rounded). */
-
-typedef HB_Error (*HB_MMFunction)(HB_Font font,
- HB_UShort metric_id,
- HB_Fixed* metric_value,
- void* data );
-#endif
-
-
-struct HB_GPOSHeader_
-{
- HB_16Dot16 Version;
-
- HB_ScriptList ScriptList;
- HB_FeatureList FeatureList;
- HB_LookupList LookupList;
-
- HB_GDEFHeader* gdef;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
- /* this is OpenType 1.2 -- Multiple Master fonts need this
- callback function to get various metric values from the
- PostScript interpreter. */
-
- HB_MMFunction mmfunc;
- void* data;
-#endif
-};
-
-typedef struct HB_GPOSHeader_ HB_GPOSHeader;
-typedef HB_GPOSHeader* HB_GPOS;
-
-
-HB_Error HB_Load_GPOS_Table( HB_Stream stream,
- HB_GPOSHeader** gpos,
- HB_GDEFHeader* gdef,
- HB_Stream gdefStream );
-
-
-HB_Error HB_Done_GPOS_Table( HB_GPOSHeader* gpos );
-
-
-HB_Error HB_GPOS_Select_Script( HB_GPOSHeader* gpos,
- HB_UInt script_tag,
- HB_UShort* script_index );
-
-HB_Error HB_GPOS_Select_Language( HB_GPOSHeader* gpos,
- HB_UInt language_tag,
- HB_UShort script_index,
- HB_UShort* language_index,
- HB_UShort* req_feature_index );
-
-HB_Error HB_GPOS_Select_Feature( HB_GPOSHeader* gpos,
- HB_UInt feature_tag,
- HB_UShort script_index,
- HB_UShort language_index,
- HB_UShort* feature_index );
-
-
-HB_Error HB_GPOS_Query_Scripts( HB_GPOSHeader* gpos,
- HB_UInt** script_tag_list );
-
-HB_Error HB_GPOS_Query_Languages( HB_GPOSHeader* gpos,
- HB_UShort script_index,
- HB_UInt** language_tag_list );
-
-HB_Error HB_GPOS_Query_Features( HB_GPOSHeader* gpos,
- HB_UShort script_index,
- HB_UShort language_index,
- HB_UInt** feature_tag_list );
-
-
-HB_Error HB_GPOS_Add_Feature( HB_GPOSHeader* gpos,
- HB_UShort feature_index,
- HB_UInt property );
-
-HB_Error HB_GPOS_Clear_Features( HB_GPOSHeader* gpos );
-
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-HB_Error HB_GPOS_Register_MM_Function( HB_GPOSHeader* gpos,
- HB_MMFunction mmfunc,
- void* data );
-#endif
-
-/* If `dvi' is TRUE, glyph contour points for anchor points and device
- tables are ignored -- you will get device independent values. */
-
-
-HB_Error HB_GPOS_Apply_String( HB_Font font,
- HB_GPOSHeader* gpos,
- HB_UShort load_flags,
- HB_Buffer buffer,
- HB_Bool dvi,
- HB_Bool r2l );
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GPOS_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-greek.c b/src/3rdparty/harfbuzz/src/harfbuzz-greek.c
deleted file mode 100644
index 05ee06cdeb..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-greek.c
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-#include <assert.h>
-
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature greek_features[] = {
- { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
- { HB_MAKE_TAG('l', 'i', 'g', 'a'), CcmpProperty },
- { HB_MAKE_TAG('c', 'l', 'i', 'g'), CcmpProperty },
- {0, 0}
-};
-#endif
-
-/*
- Greek decompositions
-*/
-
-
-typedef struct _hb_greek_decomposition {
- HB_UChar16 composed;
- HB_UChar16 base;
-} hb_greek_decomposition;
-
-static const hb_greek_decomposition decompose_0x300[] = {
- { 0x1FBA, 0x0391 },
- { 0x1FC8, 0x0395 },
- { 0x1FCA, 0x0397 },
- { 0x1FDA, 0x0399 },
- { 0x1FF8, 0x039F },
- { 0x1FEA, 0x03A5 },
- { 0x1FFA, 0x03A9 },
- { 0x1F70, 0x03B1 },
- { 0x1F72, 0x03B5 },
- { 0x1F74, 0x03B7 },
- { 0x1F76, 0x03B9 },
- { 0x1F78, 0x03BF },
- { 0x1F7A, 0x03C5 },
- { 0x1F7C, 0x03C9 },
- { 0x1FD2, 0x03CA },
- { 0x1FE2, 0x03CB },
- { 0x1F02, 0x1F00 },
- { 0, 0 }
-};
-
-static HB_UChar16 compose_0x300(HB_UChar16 base)
-{
- if ((base ^ 0x1f00) < 0x100) {
- if (base <= 0x1f69 && !(base & 0x6))
- return base + 2;
- if (base == 0x1fbf)
- return 0x1fcd;
- if (base == 0x1ffe)
- return 0x1fdd;
- return 0;
- }
- {
- const hb_greek_decomposition *d = decompose_0x300;
- while (d->base && d->base != base)
- ++d;
- return d->composed;
- }
-}
-
-static const hb_greek_decomposition decompose_0x301[] = {
- { 0x0386, 0x0391 },
- { 0x0388, 0x0395 },
- { 0x0389, 0x0397 },
- { 0x038A, 0x0399 },
- { 0x038C, 0x039F },
- { 0x038E, 0x03A5 },
- { 0x038F, 0x03A9 },
- { 0x03AC, 0x03B1 },
- { 0x03AD, 0x03B5 },
- { 0x03AE, 0x03B7 },
- { 0x03AF, 0x03B9 },
- { 0x03CC, 0x03BF },
- { 0x03CD, 0x03C5 },
- { 0x03CE, 0x03C9 },
- { 0x0390, 0x03CA },
- { 0x03B0, 0x03CB },
- { 0x03D3, 0x03D2 },
- { 0, 0 }
-};
-
-
-static HB_UChar16 compose_0x301(HB_UChar16 base)
-{
- if ((base ^ 0x1f00) < 0x100) {
- if (base <= 0x1f69 && !(base & 0x6))
- return base + 4;
- if (base == 0x1fbf)
- return 0x1fce;
- if (base == 0x1ffe)
- return 0x1fde;
- }
- {
- const hb_greek_decomposition *d = decompose_0x301;
- while (d->base && d->base != base)
- ++d;
- return d->composed;
- }
-}
-
-static const hb_greek_decomposition decompose_0x304[] = {
- { 0x1FB9, 0x0391 },
- { 0x1FD9, 0x0399 },
- { 0x1FE9, 0x03A5 },
- { 0x1FB1, 0x03B1 },
- { 0x1FD1, 0x03B9 },
- { 0x1FE1, 0x03C5 },
- { 0, 0 }
-};
-
-static HB_UChar16 compose_0x304(HB_UChar16 base)
-{
- const hb_greek_decomposition *d = decompose_0x304;
- while (d->base && d->base != base)
- ++d;
- return d->composed;
-}
-
-static const hb_greek_decomposition decompose_0x306[] = {
- { 0x1FB8, 0x0391 },
- { 0x1FD8, 0x0399 },
- { 0x1FE8, 0x03A5 },
- { 0x1FB0, 0x03B1 },
- { 0x1FD0, 0x03B9 },
- { 0x1FE0, 0x03C5 },
- { 0, 0 }
-};
-
-static HB_UChar16 compose_0x306(HB_UChar16 base)
-{
- const hb_greek_decomposition *d = decompose_0x306;
- while (d->base && d->base != base)
- ++d;
- return d->composed;
-}
-
-static const hb_greek_decomposition decompose_0x308[] = {
- { 0x03AA, 0x0399 },
- { 0x03AB, 0x03A5 },
- { 0x03CA, 0x03B9 },
- { 0x03CB, 0x03C5 },
- { 0x03D4, 0x03D2 },
- { 0, 0 }
-};
-
-static HB_UChar16 compose_0x308(HB_UChar16 base)
-{
- const hb_greek_decomposition *d = decompose_0x308;
- while (d->base && d->base != base)
- ++d;
- return d->composed;
-}
-
-
-static const hb_greek_decomposition decompose_0x313[] = {
- { 0x1F08, 0x0391 },
- { 0x1F18, 0x0395 },
- { 0x1F28, 0x0397 },
- { 0x1F38, 0x0399 },
- { 0x1F48, 0x039F },
- { 0x1F68, 0x03A9 },
- { 0x1F00, 0x03B1 },
- { 0x1F10, 0x03B5 },
- { 0x1F20, 0x03B7 },
- { 0x1F30, 0x03B9 },
- { 0x1F40, 0x03BF },
- { 0x1FE4, 0x03C1 },
- { 0x1F50, 0x03C5 },
- { 0x1F60, 0x03C9 },
- { 0, 0 }
-};
-
-static HB_UChar16 compose_0x313(HB_UChar16 base)
-{
- const hb_greek_decomposition *d = decompose_0x313;
- while (d->base && d->base != base)
- ++d;
- return d->composed;
-}
-
-static const hb_greek_decomposition decompose_0x314[] = {
- { 0x1F09, 0x0391 },
- { 0x1F19, 0x0395 },
- { 0x1F29, 0x0397 },
- { 0x1F39, 0x0399 },
- { 0x1F49, 0x039F },
- { 0x1FEC, 0x03A1 },
- { 0x1F59, 0x03A5 },
- { 0x1F69, 0x03A9 },
- { 0x1F01, 0x03B1 },
- { 0x1F11, 0x03B5 },
- { 0x1F21, 0x03B7 },
- { 0x1F31, 0x03B9 },
- { 0x1F41, 0x03BF },
- { 0x1FE5, 0x03C1 },
- { 0x1F51, 0x03C5 },
- { 0x1F61, 0x03C9 },
- { 0, 0 }
-};
-
-static HB_UChar16 compose_0x314(HB_UChar16 base)
-{
- const hb_greek_decomposition *d = decompose_0x314;
- while (d->base && d->base != base)
- ++d;
- return d->composed;
-}
-
-static const hb_greek_decomposition decompose_0x342[] = {
- { 0x1FB6, 0x03B1 },
- { 0x1FC6, 0x03B7 },
- { 0x1FD6, 0x03B9 },
- { 0x1FE6, 0x03C5 },
- { 0x1FF6, 0x03C9 },
- { 0x1FD7, 0x03CA },
- { 0x1FE7, 0x03CB },
- { 0x1F06, 0x1F00 },
- { 0x1F07, 0x1F01 },
- { 0x1F0E, 0x1F08 },
- { 0x1F0F, 0x1F09 },
- { 0x1F26, 0x1F20 },
- { 0x1F27, 0x1F21 },
- { 0x1F2E, 0x1F28 },
- { 0x1F2F, 0x1F29 },
- { 0x1F36, 0x1F30 },
- { 0x1F37, 0x1F31 },
- { 0x1F3E, 0x1F38 },
- { 0x1F3F, 0x1F39 },
- { 0x1F56, 0x1F50 },
- { 0x1F57, 0x1F51 },
- { 0x1F5F, 0x1F59 },
- { 0x1F66, 0x1F60 },
- { 0x1F67, 0x1F61 },
- { 0x1F6E, 0x1F68 },
- { 0x1F6F, 0x1F69 },
- { 0x1FCF, 0x1FBF },
- { 0x1FDF, 0x1FFE },
- { 0, 0 }
-};
-
-static HB_UChar16 compose_0x342(HB_UChar16 base)
-{
- const hb_greek_decomposition *d = decompose_0x342;
- while (d->base && d->base != base)
- ++d;
- return d->composed;
-}
-
-static const hb_greek_decomposition decompose_0x345[] = {
- { 0x1FBC, 0x0391 },
- { 0x1FCC, 0x0397 },
- { 0x1FFC, 0x03A9 },
- { 0x1FB4, 0x03AC },
- { 0x1FC4, 0x03AE },
- { 0x1FB3, 0x03B1 },
- { 0x1FC3, 0x03B7 },
- { 0x1FF3, 0x03C9 },
- { 0x1FF4, 0x03CE },
- { 0x1F80, 0x1F00 },
- { 0x1F81, 0x1F01 },
- { 0x1F82, 0x1F02 },
- { 0x1F83, 0x1F03 },
- { 0x1F84, 0x1F04 },
- { 0x1F85, 0x1F05 },
- { 0x1F86, 0x1F06 },
- { 0x1F87, 0x1F07 },
- { 0x1F88, 0x1F08 },
- { 0x1F89, 0x1F09 },
- { 0x1F8A, 0x1F0A },
- { 0x1F8B, 0x1F0B },
- { 0x1F8C, 0x1F0C },
- { 0x1F8D, 0x1F0D },
- { 0x1F8E, 0x1F0E },
- { 0x1F8F, 0x1F0F },
- { 0x1F90, 0x1F20 },
- { 0x1F91, 0x1F21 },
- { 0x1F92, 0x1F22 },
- { 0x1F93, 0x1F23 },
- { 0x1F94, 0x1F24 },
- { 0x1F95, 0x1F25 },
- { 0x1F96, 0x1F26 },
- { 0x1F97, 0x1F27 },
- { 0x1F98, 0x1F28 },
- { 0x1F99, 0x1F29 },
- { 0x1F9A, 0x1F2A },
- { 0x1F9B, 0x1F2B },
- { 0x1F9C, 0x1F2C },
- { 0x1F9D, 0x1F2D },
- { 0x1F9E, 0x1F2E },
- { 0x1F9F, 0x1F2F },
- { 0x1FA0, 0x1F60 },
- { 0x1FA1, 0x1F61 },
- { 0x1FA2, 0x1F62 },
- { 0x1FA3, 0x1F63 },
- { 0x1FA4, 0x1F64 },
- { 0x1FA5, 0x1F65 },
- { 0x1FA6, 0x1F66 },
- { 0x1FA7, 0x1F67 },
- { 0x1FA8, 0x1F68 },
- { 0x1FA9, 0x1F69 },
- { 0x1FAA, 0x1F6A },
- { 0x1FAB, 0x1F6B },
- { 0x1FAC, 0x1F6C },
- { 0x1FAD, 0x1F6D },
- { 0x1FAE, 0x1F6E },
- { 0x1FAF, 0x1F6F },
- { 0x1FB2, 0x1F70 },
- { 0x1FC2, 0x1F74 },
- { 0x1FF2, 0x1F7C },
- { 0x1FB7, 0x1FB6 },
- { 0x1FC7, 0x1FC6 },
- { 0x1FF7, 0x1FF6 },
- { 0, 0 }
-};
-
-static HB_UChar16 compose_0x345(HB_UChar16 base)
-{
- const hb_greek_decomposition *d = decompose_0x345;
- while (d->base && d->base != base)
- ++d;
- return d->composed;
-}
-
-/*
- Greek shaping. Heuristic positioning can't render polytonic greek correctly. We're a lot
- better off mapping greek chars with diacritics to the characters in the extended greek
- region in Unicode if possible.
-*/
-HB_Bool HB_GreekShape(HB_ShaperItem *shaper_item)
-{
- const int availableGlyphs = shaper_item->num_glyphs;
- const HB_UChar16 *uc = shaper_item->string + shaper_item->item.pos;
- unsigned short *logClusters = shaper_item->log_clusters;
- HB_GlyphAttributes *attributes = shaper_item->attributes;
-
- HB_Bool haveGlyphs;
- int slen = 1;
- int cluster_start = 0;
- hb_uint32 i;
-
- HB_STACKARRAY(HB_UChar16, shapedChars, 2 * shaper_item->item.length);
-
- assert(shaper_item->item.script == HB_Script_Greek);
-
- *shapedChars = *uc;
- logClusters[0] = 0;
-
- attributes[0].mark = false;
- attributes[0].clusterStart = true;
- attributes[0].dontPrint = false;
-
- for (i = 1; i < shaper_item->item.length; ++i) {
- hb_uint16 base = shapedChars[slen-1];
- hb_uint16 shaped = 0;
- if (uc[i] == 0x300)
- shaped = compose_0x300(base);
- else if (uc[i] == 0x301)
- shaped = compose_0x301(base);
- else if (uc[i] == 0x304)
- shaped = compose_0x304(base);
- else if (uc[i] == 0x306)
- shaped = compose_0x306(base);
- else if (uc[i] == 0x308)
- shaped = compose_0x308(base);
- else if (uc[i] == 0x313)
- shaped = compose_0x313(base);
- else if (uc[i] == 0x314)
- shaped = compose_0x314(base);
- else if (uc[i] == 0x342)
- shaped = compose_0x342(base);
- else if (uc[i] == 0x345)
- shaped = compose_0x345(base);
-
- if (shaped) {
- if (shaper_item->font->klass->canRender(shaper_item->font, (HB_UChar16 *)&shaped, 1)) {
- shapedChars[slen-1] = shaped;
- } else {
- shaped = 0;
- }
- }
-
- if (!shaped) {
- HB_CharCategory category;
- int cmb;
- shapedChars[slen] = uc[i];
- HB_GetUnicodeCharProperties(uc[i], &category, &cmb);
- if (category != HB_Mark_NonSpacing) {
- attributes[slen].clusterStart = TRUE;
- attributes[slen].mark = FALSE;
- attributes[slen].combiningClass = 0;
- attributes[slen].dontPrint = HB_IsControlChar(uc[i]);
- cluster_start = slen;
- } else {
- attributes[slen].clusterStart = FALSE;
- attributes[slen].mark = TRUE;
- attributes[slen].combiningClass = cmb;
- }
- ++slen;
- }
- logClusters[i] = cluster_start;
- }
-
- haveGlyphs = shaper_item->font->klass
- ->convertStringToGlyphIndices(shaper_item->font,
- shapedChars, slen,
- shaper_item->glyphs, &shaper_item->num_glyphs,
- shaper_item->item.bidiLevel % 2);
-
- HB_FREE_STACKARRAY(shapedChars);
-
- if (!haveGlyphs)
- return FALSE;
-
-#ifndef NO_OPENTYPE
- if (HB_SelectScript(shaper_item, greek_features)) {
- HB_OpenTypeShape(shaper_item, /*properties*/0);
- return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/TRUE);
- }
-#endif
- HB_HeuristicPosition(shaper_item);
-
- return TRUE;
-}
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h
deleted file mode 100644
index df0c3f639f..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GSUB_PRIVATE_H
-#define HARFBUZZ_GSUB_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-stream-private.h"
-#include "harfbuzz-gsub.h"
-
-HB_BEGIN_HEADER
-
-typedef union HB_GSUB_SubTable_ HB_GSUB_SubTable;
-
-/* LookupType 1 */
-
-struct HB_SingleSubstFormat1_
-{
- HB_Short DeltaGlyphID; /* constant added to get
- substitution glyph index */
-};
-
-typedef struct HB_SingleSubstFormat1_ HB_SingleSubstFormat1;
-
-
-struct HB_SingleSubstFormat2_
-{
- HB_UShort* Substitute; /* array of substitute glyph IDs */
- HB_UShort GlyphCount; /* number of glyph IDs in
- Substitute array */
-};
-
-typedef struct HB_SingleSubstFormat2_ HB_SingleSubstFormat2;
-
-
-struct HB_SingleSubst_
-{
- union
- {
- HB_SingleSubstFormat1 ssf1;
- HB_SingleSubstFormat2 ssf2;
- } ssf;
-
- HB_Coverage Coverage; /* Coverage table */
- HB_Byte SubstFormat; /* 1 or 2 */
-};
-
-typedef struct HB_SingleSubst_ HB_SingleSubst;
-
-
-/* LookupType 2 */
-
-struct HB_Sequence_
-{
- HB_UShort* Substitute; /* string of glyph IDs to
- substitute */
- HB_UShort GlyphCount; /* number of glyph IDs in the
- Substitute array */
-};
-
-typedef struct HB_Sequence_ HB_Sequence;
-
-
-struct HB_MultipleSubst_
-{
- HB_Sequence* Sequence; /* array of Sequence tables */
- HB_Coverage Coverage; /* Coverage table */
- HB_UShort SubstFormat; /* always 1 */
- HB_UShort SequenceCount; /* number of Sequence tables */
-};
-
-typedef struct HB_MultipleSubst_ HB_MultipleSubst;
-
-
-/* LookupType 3 */
-
-struct HB_AlternateSet_
-{
- HB_UShort* Alternate; /* array of alternate glyph IDs */
- HB_UShort GlyphCount; /* number of glyph IDs in the
- Alternate array */
-};
-
-typedef struct HB_AlternateSet_ HB_AlternateSet;
-
-
-struct HB_AlternateSubst_
-{
- HB_AlternateSet* AlternateSet; /* array of AlternateSet tables */
- HB_Coverage Coverage; /* Coverage table */
- HB_UShort SubstFormat; /* always 1 */
- HB_UShort AlternateSetCount;
- /* number of AlternateSet tables */
-};
-
-typedef struct HB_AlternateSubst_ HB_AlternateSubst;
-
-
-/* LookupType 4 */
-
-struct HB_Ligature_
-{
- HB_UShort* Component; /* array of component glyph IDs */
- HB_UShort LigGlyph; /* glyphID of ligature
- to substitute */
- HB_UShort ComponentCount; /* number of components in ligature */
-};
-
-typedef struct HB_Ligature_ HB_Ligature;
-
-
-struct HB_LigatureSet_
-{
- HB_Ligature* Ligature; /* array of Ligature tables */
- HB_UShort LigatureCount; /* number of Ligature tables */
-};
-
-typedef struct HB_LigatureSet_ HB_LigatureSet;
-
-
-struct HB_LigatureSubst_
-{
- HB_LigatureSet* LigatureSet; /* array of LigatureSet tables */
- HB_Coverage Coverage; /* Coverage table */
- HB_UShort SubstFormat; /* always 1 */
- HB_UShort LigatureSetCount; /* number of LigatureSet tables */
-};
-
-typedef struct HB_LigatureSubst_ HB_LigatureSubst;
-
-
-/* needed by both lookup type 5 and 6 */
-
-struct HB_SubstLookupRecord_
-{
- HB_UShort SequenceIndex; /* index into current
- glyph sequence */
- HB_UShort LookupListIndex; /* Lookup to apply to that pos. */
-};
-
-typedef struct HB_SubstLookupRecord_ HB_SubstLookupRecord;
-
-
-/* LookupType 5 */
-
-struct HB_SubRule_
-{
- HB_UShort* Input; /* array of input glyph IDs */
- HB_SubstLookupRecord* SubstLookupRecord;
- /* array of SubstLookupRecord
- tables */
- HB_UShort GlyphCount; /* total number of input glyphs */
- HB_UShort SubstCount; /* number of SubstLookupRecord
- tables */
-};
-
-typedef struct HB_SubRule_ HB_SubRule;
-
-
-struct HB_SubRuleSet_
-{
- HB_SubRule* SubRule; /* array of SubRule tables */
- HB_UShort SubRuleCount; /* number of SubRule tables */
-};
-
-typedef struct HB_SubRuleSet_ HB_SubRuleSet;
-
-
-struct HB_ContextSubstFormat1_
-{
- HB_SubRuleSet* SubRuleSet; /* array of SubRuleSet tables */
- HB_Coverage Coverage; /* Coverage table */
- HB_UShort SubRuleSetCount; /* number of SubRuleSet tables */
-};
-
-typedef struct HB_ContextSubstFormat1_ HB_ContextSubstFormat1;
-
-
-struct HB_SubClassRule_
-{
- HB_UShort* Class; /* array of classes */
- HB_SubstLookupRecord* SubstLookupRecord;
- /* array of SubstLookupRecord
- tables */
- HB_UShort GlyphCount; /* total number of context classes */
- HB_UShort SubstCount; /* number of SubstLookupRecord
- tables */
-};
-
-typedef struct HB_SubClassRule_ HB_SubClassRule;
-
-
-struct HB_SubClassSet_
-{
- HB_SubClassRule* SubClassRule; /* array of SubClassRule tables */
- HB_UShort SubClassRuleCount;
- /* number of SubClassRule tables */
-};
-
-typedef struct HB_SubClassSet_ HB_SubClassSet;
-
-
-/* The `MaxContextLength' field is not defined in the TTO specification
- but simplifies the implementation of this format. It holds the
- maximal context length used in the context rules. */
-
-struct HB_ContextSubstFormat2_
-{
- HB_SubClassSet* SubClassSet; /* array of SubClassSet tables */
- HB_Coverage Coverage; /* Coverage table */
- HB_ClassDefinition ClassDef; /* ClassDef table */
- HB_UShort SubClassSetCount;
- /* number of SubClassSet tables */
- HB_UShort MaxContextLength;
- /* maximal context length */
-};
-
-typedef struct HB_ContextSubstFormat2_ HB_ContextSubstFormat2;
-
-
-struct HB_ContextSubstFormat3_
-{
- HB_Coverage* Coverage; /* array of Coverage tables */
- HB_SubstLookupRecord* SubstLookupRecord;
- /* array of substitution lookups */
- HB_UShort GlyphCount; /* number of input glyphs */
- HB_UShort SubstCount; /* number of SubstLookupRecords */
-};
-
-typedef struct HB_ContextSubstFormat3_ HB_ContextSubstFormat3;
-
-
-struct HB_ContextSubst_
-{
- union
- {
- HB_ContextSubstFormat1 csf1;
- HB_ContextSubstFormat2 csf2;
- HB_ContextSubstFormat3 csf3;
- } csf;
-
- HB_Byte SubstFormat; /* 1, 2, or 3 */
-};
-
-typedef struct HB_ContextSubst_ HB_ContextSubst;
-
-
-/* LookupType 6 */
-
-struct HB_ChainSubRule_
-{
- HB_UShort* Backtrack; /* array of backtrack glyph IDs */
- HB_UShort* Input; /* array of input glyph IDs */
- HB_UShort* Lookahead; /* array of lookahead glyph IDs */
- HB_SubstLookupRecord* SubstLookupRecord;
- /* array of SubstLookupRecords */
- HB_UShort BacktrackGlyphCount;
- /* total number of backtrack glyphs */
- HB_UShort InputGlyphCount;
- /* total number of input glyphs */
- HB_UShort LookaheadGlyphCount;
- /* total number of lookahead glyphs */
- HB_UShort SubstCount; /* number of SubstLookupRecords */
-};
-
-typedef struct HB_ChainSubRule_ HB_ChainSubRule;
-
-
-struct HB_ChainSubRuleSet_
-{
- HB_ChainSubRule* ChainSubRule; /* array of ChainSubRule tables */
- HB_UShort ChainSubRuleCount;
- /* number of ChainSubRule tables */
-};
-
-typedef struct HB_ChainSubRuleSet_ HB_ChainSubRuleSet;
-
-
-struct HB_ChainContextSubstFormat1_
-{
- HB_ChainSubRuleSet* ChainSubRuleSet;
- /* array of ChainSubRuleSet tables */
- HB_Coverage Coverage; /* Coverage table */
- HB_UShort ChainSubRuleSetCount;
- /* number of ChainSubRuleSet tables */
-};
-
-typedef struct HB_ChainContextSubstFormat1_ HB_ChainContextSubstFormat1;
-
-
-struct HB_ChainSubClassRule_
-{
- HB_UShort* Backtrack; /* array of backtrack classes */
- HB_UShort* Input; /* array of context classes */
- HB_UShort* Lookahead; /* array of lookahead classes */
- HB_SubstLookupRecord* SubstLookupRecord;
- /* array of substitution lookups */
- HB_UShort BacktrackGlyphCount;
- /* total number of backtrack
- classes */
- HB_UShort InputGlyphCount;
- /* total number of context classes */
- HB_UShort LookaheadGlyphCount;
- /* total number of lookahead
- classes */
- HB_UShort SubstCount; /* number of SubstLookupRecords */
-};
-
-typedef struct HB_ChainSubClassRule_ HB_ChainSubClassRule;
-
-
-struct HB_ChainSubClassSet_
-{
- HB_ChainSubClassRule* ChainSubClassRule;
- /* array of ChainSubClassRule
- tables */
- HB_UShort ChainSubClassRuleCount;
- /* number of ChainSubClassRule
- tables */
-};
-
-typedef struct HB_ChainSubClassSet_ HB_ChainSubClassSet;
-
-
-/* The `MaxXXXLength' fields are not defined in the TTO specification
- but simplifies the implementation of this format. It holds the
- maximal context length used in the specific context rules. */
-
-struct HB_ChainContextSubstFormat2_
-{
- HB_ChainSubClassSet* ChainSubClassSet;
- /* array of ChainSubClassSet
- tables */
- HB_Coverage Coverage; /* Coverage table */
-
- HB_ClassDefinition BacktrackClassDef;
- /* BacktrackClassDef table */
- HB_ClassDefinition InputClassDef;
- /* InputClassDef table */
- HB_ClassDefinition LookaheadClassDef;
- /* LookaheadClassDef table */
-
- HB_UShort ChainSubClassSetCount;
- /* number of ChainSubClassSet
- tables */
- HB_UShort MaxBacktrackLength;
- /* maximal backtrack length */
- HB_UShort MaxLookaheadLength;
- /* maximal lookahead length */
- HB_UShort MaxInputLength;
- /* maximal input length */
-};
-
-typedef struct HB_ChainContextSubstFormat2_ HB_ChainContextSubstFormat2;
-
-
-struct HB_ChainContextSubstFormat3_
-{
- HB_Coverage* BacktrackCoverage;
- /* array of backtrack Coverage
- tables */
- HB_Coverage* InputCoverage;
- /* array of input coverage
- tables */
- HB_Coverage* LookaheadCoverage;
- /* array of lookahead coverage
- tables */
- HB_SubstLookupRecord* SubstLookupRecord;
- /* array of substitution lookups */
- HB_UShort BacktrackGlyphCount;
- /* number of backtrack glyphs */
- HB_UShort InputGlyphCount;
- /* number of input glyphs */
- HB_UShort LookaheadGlyphCount;
- /* number of lookahead glyphs */
- HB_UShort SubstCount; /* number of SubstLookupRecords */
-};
-
-typedef struct HB_ChainContextSubstFormat3_ HB_ChainContextSubstFormat3;
-
-
-struct HB_ChainContextSubst_
-{
- union
- {
- HB_ChainContextSubstFormat1 ccsf1;
- HB_ChainContextSubstFormat2 ccsf2;
- HB_ChainContextSubstFormat3 ccsf3;
- } ccsf;
-
- HB_Byte SubstFormat; /* 1, 2, or 3 */
-};
-
-typedef struct HB_ChainContextSubst_ HB_ChainContextSubst;
-
-
-#if 0
-/* LookupType 7 */
-struct HB_ExtensionSubst_
-{
- HB_GSUB_SubTable *subtable; /* referenced subtable */
- HB_UShort SubstFormat; /* always 1 */
- HB_UShort LookuptType; /* lookup-type of referenced subtable */
-};
-
-typedef struct HB_ExtensionSubst_ HB_ExtensionSubst;
-#endif
-
-
-/* LookupType 8 */
-struct HB_ReverseChainContextSubst_
-{
- HB_Coverage* LookaheadCoverage; /* array of lookahead Coverage
- tables */
- HB_UShort* Substitute; /* array of substitute Glyph ID */
- HB_Coverage* BacktrackCoverage; /* array of backtrack Coverage
- tables */
- HB_Coverage Coverage; /* coverage table for input glyphs */
- HB_UShort SubstFormat; /* always 1 */
- HB_UShort BacktrackGlyphCount; /* number of backtrack glyphs */
- HB_UShort LookaheadGlyphCount; /* number of lookahead glyphs */
- HB_UShort GlyphCount; /* number of Glyph IDs */
-};
-
-typedef struct HB_ReverseChainContextSubst_ HB_ReverseChainContextSubst;
-
-
-union HB_GSUB_SubTable_
-{
- HB_SingleSubst single;
- HB_MultipleSubst multiple;
- HB_AlternateSubst alternate;
- HB_LigatureSubst ligature;
- HB_ContextSubst context;
- HB_ChainContextSubst chain;
- HB_ReverseChainContextSubst reverse;
-};
-
-
-
-
-HB_INTERNAL HB_Error
-_HB_GSUB_Load_SubTable( HB_GSUB_SubTable* st,
- HB_Stream stream,
- HB_UShort lookup_type );
-
-HB_INTERNAL void
-_HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st,
- HB_UShort lookup_type );
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GSUB_PRIVATE_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gsub.c b/src/3rdparty/harfbuzz/src/harfbuzz-gsub.c
deleted file mode 100644
index 89875d1d24..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gsub.c
+++ /dev/null
@@ -1,4329 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-gsub-private.h"
-#include "harfbuzz-open-private.h"
-#include "harfbuzz-gdef-private.h"
-
-static HB_Error GSUB_Do_Glyph_Lookup( HB_GSUBHeader* gsub,
- HB_UShort lookup_index,
- HB_Buffer buffer,
- HB_UShort context_length,
- int nesting_level );
-
-
-
-/**********************
- * Auxiliary functions
- **********************/
-
-
-
-HB_Error HB_Load_GSUB_Table( HB_Stream stream,
- HB_GSUBHeader** retptr,
- HB_GDEFHeader* gdef,
- HB_Stream gdefStream )
-{
- HB_Error error = HB_Err_Ok;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_GSUBHeader* gsub;
-
- if ( !retptr )
- return ERR(HB_Err_Invalid_Argument);
-
- if ( GOTO_Table( TTAG_GSUB ) )
- return error;
-
- base_offset = FILE_Pos();
-
- if ( ALLOC ( gsub, sizeof( *gsub ) ) )
- return error;
-
-
- /* skip version */
-
- if ( FILE_Seek( base_offset + 4L ) ||
- ACCESS_Frame( 2L ) )
- goto Fail4;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_ScriptList( &gsub->ScriptList,
- stream ) ) != HB_Err_Ok )
- goto Fail4;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_FeatureList( &gsub->FeatureList,
- stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_LookupList( &gsub->LookupList,
- stream, HB_Type_GSUB ) ) != HB_Err_Ok )
- goto Fail2;
-
- gsub->gdef = gdef; /* can be NULL */
-
- if ( ( error = _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( gdef, gdefStream,
- gsub->LookupList.Lookup,
- gsub->LookupList.LookupCount ) ) )
- goto Fail1;
-
- *retptr = gsub;
-
- return HB_Err_Ok;
-
-Fail1:
- _HB_OPEN_Free_LookupList( &gsub->LookupList, HB_Type_GSUB );
-
-Fail2:
- _HB_OPEN_Free_FeatureList( &gsub->FeatureList );
-
-Fail3:
- _HB_OPEN_Free_ScriptList( &gsub->ScriptList );
-
-Fail4:
- FREE ( gsub );
-
-
- return error;
-}
-
-
-HB_Error HB_Done_GSUB_Table( HB_GSUBHeader* gsub )
-{
- _HB_OPEN_Free_LookupList( &gsub->LookupList, HB_Type_GSUB );
- _HB_OPEN_Free_FeatureList( &gsub->FeatureList );
- _HB_OPEN_Free_ScriptList( &gsub->ScriptList );
-
- FREE( gsub );
-
- return HB_Err_Ok;
-}
-
-/*****************************
- * SubTable related functions
- *****************************/
-
-
-/* LookupType 1 */
-
-/* SingleSubstFormat1 */
-/* SingleSubstFormat2 */
-
-static HB_Error Load_SingleSubst( HB_GSUB_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_SingleSubst* ss = &st->single;
-
- HB_UShort n, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_UShort* s;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- ss->SubstFormat = GET_UShort();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &ss->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- switch ( ss->SubstFormat )
- {
- case 1:
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- ss->ssf.ssf1.DeltaGlyphID = GET_UShort();
-
- FORGET_Frame();
-
- break;
-
- case 2:
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = ss->ssf.ssf2.GlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- ss->ssf.ssf2.Substitute = NULL;
-
- if ( ALLOC_ARRAY( ss->ssf.ssf2.Substitute, count, HB_UShort ) )
- goto Fail2;
-
- s = ss->ssf.ssf2.Substitute;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- s[n] = GET_UShort();
-
- FORGET_Frame();
-
- break;
-
- default:
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( s );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &ss->Coverage );
- return error;
-}
-
-
-static void Free_SingleSubst( HB_GSUB_SubTable* st )
-{
- HB_SingleSubst* ss = &st->single;
-
- switch ( ss->SubstFormat )
- {
- case 1:
- break;
-
- case 2:
- FREE( ss->ssf.ssf2.Substitute );
- break;
-
- default:
- break;
- }
-
- _HB_OPEN_Free_Coverage( &ss->Coverage );
-}
-
-
-static HB_Error Lookup_SingleSubst( HB_GSUBHeader* gsub,
- HB_GSUB_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, value, property;
- HB_Error error;
- HB_SingleSubst* ss = &st->single;
- HB_GDEFHeader* gdef = gsub->gdef;
-
- HB_UNUSED(nesting_level);
-
- if ( context_length != 0xFFFF && context_length < 1 )
- return HB_Err_Not_Covered;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &ss->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- switch ( ss->SubstFormat )
- {
- case 1:
- value = ( IN_CURGLYPH() + ss->ssf.ssf1.DeltaGlyphID ) & 0xFFFF;
- if ( REPLACE_Glyph( buffer, value, nesting_level ) )
- return error;
- break;
-
- case 2:
- if ( index >= ss->ssf.ssf2.GlyphCount )
- return ERR(HB_Err_Invalid_SubTable);
- value = ss->ssf.ssf2.Substitute[index];
- if ( REPLACE_Glyph( buffer, value, nesting_level ) )
- return error;
- break;
-
- default:
- return ERR(HB_Err_Invalid_SubTable);
- }
-
- if ( gdef && gdef->NewGlyphClasses )
- {
- /* we inherit the old glyph class to the substituted glyph */
-
- error = _HB_GDEF_Add_Glyph_Property( gdef, value, property );
- if ( error && error != HB_Err_Not_Covered )
- return error;
- }
-
- return HB_Err_Ok;
-}
-
-
-/* LookupType 2 */
-
-/* Sequence */
-
-static HB_Error Load_Sequence( HB_Sequence* s,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
- HB_UShort* sub;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = s->GlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- s->Substitute = NULL;
-
- if ( count )
- {
- if ( ALLOC_ARRAY( s->Substitute, count, HB_UShort ) )
- return error;
-
- sub = s->Substitute;
-
- if ( ACCESS_Frame( count * 2L ) )
- {
- FREE( sub );
- return error;
- }
-
- for ( n = 0; n < count; n++ )
- sub[n] = GET_UShort();
-
- FORGET_Frame();
- }
-
- return HB_Err_Ok;
-}
-
-
-static void Free_Sequence( HB_Sequence* s )
-{
- FREE( s->Substitute );
-}
-
-
-/* MultipleSubstFormat1 */
-
-static HB_Error Load_MultipleSubst( HB_GSUB_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_MultipleSubst* ms = &st->multiple;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_Sequence* s;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- ms->SubstFormat = GET_UShort(); /* should be 1 */
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &ms->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = ms->SequenceCount = GET_UShort();
-
- FORGET_Frame();
-
- ms->Sequence = NULL;
-
- if ( ALLOC_ARRAY( ms->Sequence, count, HB_Sequence ) )
- goto Fail2;
-
- s = ms->Sequence;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_Sequence( &s[n], stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_Sequence( &s[m] );
-
- FREE( s );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &ms->Coverage );
- return error;
-}
-
-
-static void Free_MultipleSubst( HB_GSUB_SubTable* st )
-{
- HB_UShort n, count;
- HB_MultipleSubst* ms = &st->multiple;
-
- HB_Sequence* s;
-
-
- if ( ms->Sequence )
- {
- count = ms->SequenceCount;
- s = ms->Sequence;
-
- for ( n = 0; n < count; n++ )
- Free_Sequence( &s[n] );
-
- FREE( s );
- }
-
- _HB_OPEN_Free_Coverage( &ms->Coverage );
-}
-
-
-static HB_Error Lookup_MultipleSubst( HB_GSUBHeader* gsub,
- HB_GSUB_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_Error error;
- HB_UShort index, property, n, count;
- HB_UShort*s;
- HB_MultipleSubst* ms = &st->multiple;
- HB_GDEFHeader* gdef = gsub->gdef;
-
- HB_UNUSED(nesting_level);
-
- if ( context_length != 0xFFFF && context_length < 1 )
- return HB_Err_Not_Covered;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &ms->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- if ( index >= ms->SequenceCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- count = ms->Sequence[index].GlyphCount;
- s = ms->Sequence[index].Substitute;
-
- if ( ADD_String( buffer, 1, count, s, 0xFFFF, 0xFFFF ) )
- return error;
-
- if ( gdef && gdef->NewGlyphClasses )
- {
- /* this is a guess only ... */
-
- if ( property == HB_GDEF_LIGATURE )
- property = HB_GDEF_BASE_GLYPH;
-
- for ( n = 0; n < count; n++ )
- {
- error = _HB_GDEF_Add_Glyph_Property( gdef, s[n], property );
- if ( error && error != HB_Err_Not_Covered )
- return error;
- }
- }
-
- return HB_Err_Ok;
-}
-
-
-/* LookupType 3 */
-
-/* AlternateSet */
-
-static HB_Error Load_AlternateSet( HB_AlternateSet* as,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
- HB_UShort* a;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = as->GlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- as->Alternate = NULL;
-
- if ( ALLOC_ARRAY( as->Alternate, count, HB_UShort ) )
- return error;
-
- a = as->Alternate;
-
- if ( ACCESS_Frame( count * 2L ) )
- {
- FREE( a );
- return error;
- }
-
- for ( n = 0; n < count; n++ )
- a[n] = GET_UShort();
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-}
-
-
-static void Free_AlternateSet( HB_AlternateSet* as )
-{
- FREE( as->Alternate );
-}
-
-
-/* AlternateSubstFormat1 */
-
-static HB_Error Load_AlternateSubst( HB_GSUB_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_AlternateSubst* as = &st->alternate;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_AlternateSet* aset;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- as->SubstFormat = GET_UShort(); /* should be 1 */
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &as->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = as->AlternateSetCount = GET_UShort();
-
- FORGET_Frame();
-
- as->AlternateSet = NULL;
-
- if ( ALLOC_ARRAY( as->AlternateSet, count, HB_AlternateSet ) )
- goto Fail2;
-
- aset = as->AlternateSet;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_AlternateSet( &aset[n], stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_AlternateSet( &aset[m] );
-
- FREE( aset );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &as->Coverage );
- return error;
-}
-
-
-static void Free_AlternateSubst( HB_GSUB_SubTable* st )
-{
- HB_UShort n, count;
- HB_AlternateSubst* as = &st->alternate;
-
- HB_AlternateSet* aset;
-
-
- if ( as->AlternateSet )
- {
- count = as->AlternateSetCount;
- aset = as->AlternateSet;
-
- for ( n = 0; n < count; n++ )
- Free_AlternateSet( &aset[n] );
-
- FREE( aset );
- }
-
- _HB_OPEN_Free_Coverage( &as->Coverage );
-}
-
-
-static HB_Error Lookup_AlternateSubst( HB_GSUBHeader* gsub,
- HB_GSUB_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_Error error;
- HB_UShort index, value, alt_index, property;
- HB_AlternateSubst* as = &st->alternate;
- HB_GDEFHeader* gdef = gsub->gdef;
- HB_AlternateSet aset;
-
- HB_UNUSED(nesting_level);
-
- if ( context_length != 0xFFFF && context_length < 1 )
- return HB_Err_Not_Covered;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &as->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- aset = as->AlternateSet[index];
-
- /* we use a user-defined callback function to get the alternate index */
-
- if ( gsub->altfunc )
- alt_index = (gsub->altfunc)( buffer->out_pos, IN_CURGLYPH(),
- aset.GlyphCount, aset.Alternate,
- gsub->data );
- else
- alt_index = 0;
-
- value = aset.Alternate[alt_index];
- if ( REPLACE_Glyph( buffer, value, nesting_level ) )
- return error;
-
- if ( gdef && gdef->NewGlyphClasses )
- {
- /* we inherit the old glyph class to the substituted glyph */
-
- error = _HB_GDEF_Add_Glyph_Property( gdef, value, property );
- if ( error && error != HB_Err_Not_Covered )
- return error;
- }
-
- return HB_Err_Ok;
-}
-
-
-/* LookupType 4 */
-
-/* Ligature */
-
-static HB_Error Load_Ligature( HB_Ligature* l,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
- HB_UShort* c;
-
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- l->LigGlyph = GET_UShort();
- l->ComponentCount = GET_UShort();
-
- FORGET_Frame();
-
- l->Component = NULL;
-
- count = l->ComponentCount - 1; /* only ComponentCount - 1 elements */
-
- if ( ALLOC_ARRAY( l->Component, count, HB_UShort ) )
- return error;
-
- c = l->Component;
-
- if ( ACCESS_Frame( count * 2L ) )
- {
- FREE( c );
- return error;
- }
-
- for ( n = 0; n < count; n++ )
- c[n] = GET_UShort();
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-}
-
-
-static void Free_Ligature( HB_Ligature* l )
-{
- FREE( l->Component );
-}
-
-
-/* LigatureSet */
-
-static HB_Error Load_LigatureSet( HB_LigatureSet* ls,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_Ligature* l;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = ls->LigatureCount = GET_UShort();
-
- FORGET_Frame();
-
- ls->Ligature = NULL;
-
- if ( ALLOC_ARRAY( ls->Ligature, count, HB_Ligature ) )
- return error;
-
- l = ls->Ligature;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_Ligature( &l[n], stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_Ligature( &l[m] );
-
- FREE( l );
- return error;
-}
-
-
-static void Free_LigatureSet( HB_LigatureSet* ls )
-{
- HB_UShort n, count;
-
- HB_Ligature* l;
-
-
- if ( ls->Ligature )
- {
- count = ls->LigatureCount;
- l = ls->Ligature;
-
- for ( n = 0; n < count; n++ )
- Free_Ligature( &l[n] );
-
- FREE( l );
- }
-}
-
-
-/* LigatureSubstFormat1 */
-
-static HB_Error Load_LigatureSubst( HB_GSUB_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_LigatureSubst* ls = &st->ligature;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_LigatureSet* lset;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- ls->SubstFormat = GET_UShort(); /* should be 1 */
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &ls->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = ls->LigatureSetCount = GET_UShort();
-
- FORGET_Frame();
-
- ls->LigatureSet = NULL;
-
- if ( ALLOC_ARRAY( ls->LigatureSet, count, HB_LigatureSet ) )
- goto Fail2;
-
- lset = ls->LigatureSet;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_LigatureSet( &lset[n], stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_LigatureSet( &lset[m] );
-
- FREE( lset );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &ls->Coverage );
- return error;
-}
-
-
-static void Free_LigatureSubst( HB_GSUB_SubTable* st )
-{
- HB_UShort n, count;
- HB_LigatureSubst* ls = &st->ligature;
-
- HB_LigatureSet* lset;
-
-
- if ( ls->LigatureSet )
- {
- count = ls->LigatureSetCount;
- lset = ls->LigatureSet;
-
- for ( n = 0; n < count; n++ )
- Free_LigatureSet( &lset[n] );
-
- FREE( lset );
- }
-
- _HB_OPEN_Free_Coverage( &ls->Coverage );
-}
-
-
-static HB_Error Lookup_LigatureSubst( HB_GSUBHeader* gsub,
- HB_GSUB_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, property;
- HB_Error error;
- HB_UShort numlig, i, j, is_mark, first_is_mark = FALSE;
- HB_UShort* c;
- HB_LigatureSubst* ls = &st->ligature;
- HB_GDEFHeader* gdef = gsub->gdef;
-
- HB_Ligature* lig;
-
- HB_UNUSED(nesting_level);
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- if ( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS )
- first_is_mark = TRUE;
-
- error = _HB_OPEN_Coverage_Index( &ls->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- if ( index >= ls->LigatureSetCount )
- return ERR(HB_Err_Invalid_SubTable);
-
- lig = ls->LigatureSet[index].Ligature;
-
- for ( numlig = ls->LigatureSet[index].LigatureCount;
- numlig;
- numlig--, lig++ )
- {
- if ( buffer->in_pos + lig->ComponentCount > buffer->in_length )
- goto next_ligature; /* Not enough glyphs in input */
-
- c = lig->Component;
-
- is_mark = first_is_mark;
-
- if ( context_length != 0xFFFF && context_length < lig->ComponentCount )
- break;
-
- for ( i = 1, j = buffer->in_pos + 1; i < lig->ComponentCount; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + lig->ComponentCount - i == (HB_Int)buffer->in_length )
- goto next_ligature;
- j++;
- }
-
- if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) )
- is_mark = FALSE;
-
- if ( IN_GLYPH( j ) != c[i - 1] )
- goto next_ligature;
- }
-
- if ( gdef && gdef->NewGlyphClasses )
- {
- /* this is just a guess ... */
-
- error = _HB_GDEF_Add_Glyph_Property( gdef, lig->LigGlyph,
- is_mark ? HB_GDEF_MARK : HB_GDEF_LIGATURE );
- if ( error && error != HB_Err_Not_Covered )
- return error;
- }
-
- if ( j == buffer->in_pos + i ) /* No input glyphs skipped */
- {
- /* We don't use a new ligature ID if there are no skipped
- glyphs and the ligature already has an ID. */
-
- if ( IN_LIGID( buffer->in_pos ) )
- {
- if ( ADD_String( buffer, i, 1, &lig->LigGlyph,
- 0xFFFF, 0xFFFF ) )
- return error;
- }
- else
- {
- HB_UShort ligID = _hb_buffer_allocate_ligid( buffer );
- if ( ADD_String( buffer, i, 1, &lig->LigGlyph,
- 0xFFFF, ligID ) )
- return error;
- }
- }
- else
- {
- HB_UShort ligID = _hb_buffer_allocate_ligid( buffer );
- if ( ADD_Glyph( buffer, lig->LigGlyph, 0xFFFF, ligID ) )
- return error;
-
- /* Now we must do a second loop to copy the skipped glyphs to
- `out' and assign component values to it. We start with the
- glyph after the first component. Glyphs between component
- i and i+1 belong to component i. Together with the ligID
- value it is later possible to check whether a specific
- component value really belongs to a given ligature. */
-
- for ( i = 0; i < lig->ComponentCount - 1; i++ )
- {
- while ( CHECK_Property( gdef, IN_CURITEM(),
- flags, &property ) )
- if ( ADD_Glyph( buffer, IN_CURGLYPH(), i, ligID ) )
- return error;
-
- (buffer->in_pos)++;
- }
- }
-
- return HB_Err_Ok;
-
- next_ligature:
- ;
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-/* Do the actual substitution for a context substitution (either format
- 5 or 6). This is only called after we've determined that the input
- matches the subrule. */
-
-static HB_Error Do_ContextSubst( HB_GSUBHeader* gsub,
- HB_UShort GlyphCount,
- HB_UShort SubstCount,
- HB_SubstLookupRecord* subst,
- HB_Buffer buffer,
- int nesting_level )
-{
- HB_Error error;
- HB_UInt i, old_pos;
-
-
- i = 0;
-
- while ( i < GlyphCount )
- {
- if ( SubstCount && i == subst->SequenceIndex )
- {
- old_pos = buffer->in_pos;
-
- /* Do a substitution */
-
- error = GSUB_Do_Glyph_Lookup( gsub, subst->LookupListIndex, buffer,
- GlyphCount, nesting_level );
-
- subst++;
- SubstCount--;
- i += buffer->in_pos - old_pos;
-
- if ( error == HB_Err_Not_Covered )
- {
- if ( COPY_Glyph( buffer ) )
- return error;
- i++;
- }
- else if ( error )
- return error;
- }
- else
- {
- /* No substitution for this index */
-
- if ( COPY_Glyph( buffer ) )
- return error;
- i++;
- }
- }
-
- return HB_Err_Ok;
-}
-
-
-/* LookupType 5 */
-
-/* SubRule */
-
-static HB_Error Load_SubRule( HB_SubRule* sr,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
- HB_UShort* i;
-
- HB_SubstLookupRecord* slr;
-
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- sr->GlyphCount = GET_UShort();
- sr->SubstCount = GET_UShort();
-
- FORGET_Frame();
-
- sr->Input = NULL;
-
- count = sr->GlyphCount - 1; /* only GlyphCount - 1 elements */
-
- if ( ALLOC_ARRAY( sr->Input, count, HB_UShort ) )
- return error;
-
- i = sr->Input;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail2;
-
- for ( n = 0; n < count; n++ )
- i[n] = GET_UShort();
-
- FORGET_Frame();
-
- sr->SubstLookupRecord = NULL;
-
- count = sr->SubstCount;
-
- if ( ALLOC_ARRAY( sr->SubstLookupRecord, count, HB_SubstLookupRecord ) )
- goto Fail2;
-
- slr = sr->SubstLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- slr[n].SequenceIndex = GET_UShort();
- slr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( slr );
-
-Fail2:
- FREE( i );
- return error;
-}
-
-
-static void Free_SubRule( HB_SubRule* sr )
-{
- FREE( sr->SubstLookupRecord );
- FREE( sr->Input );
-}
-
-
-/* SubRuleSet */
-
-static HB_Error Load_SubRuleSet( HB_SubRuleSet* srs,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_SubRule* sr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = srs->SubRuleCount = GET_UShort();
-
- FORGET_Frame();
-
- srs->SubRule = NULL;
-
- if ( ALLOC_ARRAY( srs->SubRule, count, HB_SubRule ) )
- return error;
-
- sr = srs->SubRule;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_SubRule( &sr[n], stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_SubRule( &sr[m] );
-
- FREE( sr );
- return error;
-}
-
-
-static void Free_SubRuleSet( HB_SubRuleSet* srs )
-{
- HB_UShort n, count;
-
- HB_SubRule* sr;
-
-
- if ( srs->SubRule )
- {
- count = srs->SubRuleCount;
- sr = srs->SubRule;
-
- for ( n = 0; n < count; n++ )
- Free_SubRule( &sr[n] );
-
- FREE( sr );
- }
-}
-
-
-/* ContextSubstFormat1 */
-
-static HB_Error Load_ContextSubst1( HB_ContextSubstFormat1* csf1,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_SubRuleSet* srs;
-
-
- base_offset = FILE_Pos() - 2L;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &csf1->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = csf1->SubRuleSetCount = GET_UShort();
-
- FORGET_Frame();
-
- csf1->SubRuleSet = NULL;
-
- if ( ALLOC_ARRAY( csf1->SubRuleSet, count, HB_SubRuleSet ) )
- goto Fail2;
-
- srs = csf1->SubRuleSet;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_SubRuleSet( &srs[n], stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_SubRuleSet( &srs[m] );
-
- FREE( srs );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &csf1->Coverage );
- return error;
-}
-
-
-static void Free_ContextSubst1( HB_ContextSubstFormat1* csf1 )
-{
- HB_UShort n, count;
-
- HB_SubRuleSet* srs;
-
-
- if ( csf1->SubRuleSet )
- {
- count = csf1->SubRuleSetCount;
- srs = csf1->SubRuleSet;
-
- for ( n = 0; n < count; n++ )
- Free_SubRuleSet( &srs[n] );
-
- FREE( srs );
- }
-
- _HB_OPEN_Free_Coverage( &csf1->Coverage );
-}
-
-
-/* SubClassRule */
-
-static HB_Error Load_SubClassRule( HB_ContextSubstFormat2* csf2,
- HB_SubClassRule* scr,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
-
- HB_UShort* c;
- HB_SubstLookupRecord* slr;
-
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- scr->GlyphCount = GET_UShort();
- scr->SubstCount = GET_UShort();
-
- if ( scr->GlyphCount > csf2->MaxContextLength )
- csf2->MaxContextLength = scr->GlyphCount;
-
- FORGET_Frame();
-
- scr->Class = NULL;
-
- count = scr->GlyphCount - 1; /* only GlyphCount - 1 elements */
-
- if ( ALLOC_ARRAY( scr->Class, count, HB_UShort ) )
- return error;
-
- c = scr->Class;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail2;
-
- for ( n = 0; n < count; n++ )
- c[n] = GET_UShort();
-
- FORGET_Frame();
-
- scr->SubstLookupRecord = NULL;
-
- count = scr->SubstCount;
-
- if ( ALLOC_ARRAY( scr->SubstLookupRecord, count, HB_SubstLookupRecord ) )
- goto Fail2;
-
- slr = scr->SubstLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- slr[n].SequenceIndex = GET_UShort();
- slr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( slr );
-
-Fail2:
- FREE( c );
- return error;
-}
-
-
-static void Free_SubClassRule( HB_SubClassRule* scr )
-{
- FREE( scr->SubstLookupRecord );
- FREE( scr->Class );
-}
-
-
-/* SubClassSet */
-
-static HB_Error Load_SubClassSet( HB_ContextSubstFormat2* csf2,
- HB_SubClassSet* scs,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_SubClassRule* scr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = scs->SubClassRuleCount = GET_UShort();
-
- FORGET_Frame();
-
- scs->SubClassRule = NULL;
-
- if ( ALLOC_ARRAY( scs->SubClassRule, count, HB_SubClassRule ) )
- return error;
-
- scr = scs->SubClassRule;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_SubClassRule( csf2, &scr[n],
- stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_SubClassRule( &scr[m] );
-
- FREE( scr );
- return error;
-}
-
-
-static void Free_SubClassSet( HB_SubClassSet* scs )
-{
- HB_UShort n, count;
-
- HB_SubClassRule* scr;
-
-
- if ( scs->SubClassRule )
- {
- count = scs->SubClassRuleCount;
- scr = scs->SubClassRule;
-
- for ( n = 0; n < count; n++ )
- Free_SubClassRule( &scr[n] );
-
- FREE( scr );
- }
-}
-
-
-/* ContextSubstFormat2 */
-
-static HB_Error Load_ContextSubst2( HB_ContextSubstFormat2* csf2,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_SubClassSet* scs;
-
-
- base_offset = FILE_Pos() - 2;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &csf2->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 4L ) )
- goto Fail3;
-
- new_offset = GET_UShort() + base_offset;
-
- /* `SubClassSetCount' is the upper limit for class values, thus we
- read it now to make an additional safety check. */
-
- count = csf2->SubClassSetCount = GET_UShort();
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_ClassDefinition( &csf2->ClassDef, count,
- stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
-
- csf2->SubClassSet = NULL;
- csf2->MaxContextLength = 0;
-
- if ( ALLOC_ARRAY( csf2->SubClassSet, count, HB_SubClassSet ) )
- goto Fail2;
-
- scs = csf2->SubClassSet;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- if ( new_offset != base_offset ) /* not a NULL offset */
- {
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_SubClassSet( csf2, &scs[n],
- stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
- else
- {
- /* we create a SubClassSet table with no entries */
-
- csf2->SubClassSet[n].SubClassRuleCount = 0;
- csf2->SubClassSet[n].SubClassRule = NULL;
- }
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_SubClassSet( &scs[m] );
-
- FREE( scs );
-
-Fail2:
- _HB_OPEN_Free_ClassDefinition( &csf2->ClassDef );
-
-Fail3:
- _HB_OPEN_Free_Coverage( &csf2->Coverage );
- return error;
-}
-
-
-static void Free_ContextSubst2( HB_ContextSubstFormat2* csf2 )
-{
- HB_UShort n, count;
-
- HB_SubClassSet* scs;
-
-
- if ( csf2->SubClassSet )
- {
- count = csf2->SubClassSetCount;
- scs = csf2->SubClassSet;
-
- for ( n = 0; n < count; n++ )
- Free_SubClassSet( &scs[n] );
-
- FREE( scs );
- }
-
- _HB_OPEN_Free_ClassDefinition( &csf2->ClassDef );
- _HB_OPEN_Free_Coverage( &csf2->Coverage );
-}
-
-
-/* ContextSubstFormat3 */
-
-static HB_Error Load_ContextSubst3( HB_ContextSubstFormat3* csf3,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_Coverage* c;
- HB_SubstLookupRecord* slr;
-
-
- base_offset = FILE_Pos() - 2L;
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- csf3->GlyphCount = GET_UShort();
- csf3->SubstCount = GET_UShort();
-
- FORGET_Frame();
-
- csf3->Coverage = NULL;
-
- count = csf3->GlyphCount;
-
- if ( ALLOC_ARRAY( csf3->Coverage, count, HB_Coverage ) )
- return error;
-
- c = csf3->Coverage;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &c[n], stream ) ) != HB_Err_Ok )
- goto Fail2;
- (void)FILE_Seek( cur_offset );
- }
-
- csf3->SubstLookupRecord = NULL;
-
- count = csf3->SubstCount;
-
- if ( ALLOC_ARRAY( csf3->SubstLookupRecord, count,
- HB_SubstLookupRecord ) )
- goto Fail2;
-
- slr = csf3->SubstLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- slr[n].SequenceIndex = GET_UShort();
- slr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( slr );
-
-Fail2:
- for ( m = 0; m < n; m++ )
- _HB_OPEN_Free_Coverage( &c[m] );
-
- FREE( c );
- return error;
-}
-
-
-static void Free_ContextSubst3( HB_ContextSubstFormat3* csf3 )
-{
- HB_UShort n, count;
-
- HB_Coverage* c;
-
-
- FREE( csf3->SubstLookupRecord );
-
- if ( csf3->Coverage )
- {
- count = csf3->GlyphCount;
- c = csf3->Coverage;
-
- for ( n = 0; n < count; n++ )
- _HB_OPEN_Free_Coverage( &c[n] );
-
- FREE( c );
- }
-}
-
-
-/* ContextSubst */
-
-static HB_Error Load_ContextSubst( HB_GSUB_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_ContextSubst* cs = &st->context;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- cs->SubstFormat = GET_UShort();
-
- FORGET_Frame();
-
- switch ( cs->SubstFormat )
- {
- case 1: return Load_ContextSubst1( &cs->csf.csf1, stream );
- case 2: return Load_ContextSubst2( &cs->csf.csf2, stream );
- case 3: return Load_ContextSubst3( &cs->csf.csf3, stream );
- default: return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok; /* never reached */
-}
-
-
-static void Free_ContextSubst( HB_GSUB_SubTable* st )
-{
- HB_ContextSubst* cs = &st->context;
-
- switch ( cs->SubstFormat )
- {
- case 1: Free_ContextSubst1( &cs->csf.csf1 ); break;
- case 2: Free_ContextSubst2( &cs->csf.csf2 ); break;
- case 3: Free_ContextSubst3( &cs->csf.csf3 ); break;
- default: break;
- }
-}
-
-
-static HB_Error Lookup_ContextSubst1( HB_GSUBHeader* gsub,
- HB_ContextSubstFormat1* csf1,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, property;
- HB_UShort i, j, k, numsr;
- HB_Error error;
-
- HB_SubRule* sr;
- HB_GDEFHeader* gdef;
-
-
- gdef = gsub->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &csf1->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- sr = csf1->SubRuleSet[index].SubRule;
- numsr = csf1->SubRuleSet[index].SubRuleCount;
-
- for ( k = 0; k < numsr; k++ )
- {
- if ( context_length != 0xFFFF && context_length < sr[k].GlyphCount )
- goto next_subrule;
-
- if ( buffer->in_pos + sr[k].GlyphCount > buffer->in_length )
- goto next_subrule; /* context is too long */
-
- for ( i = 1, j = buffer->in_pos + 1; i < sr[k].GlyphCount; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + sr[k].GlyphCount - i == (HB_Int)buffer->in_length )
- goto next_subrule;
- j++;
- }
-
- if ( IN_GLYPH( j ) != sr[k].Input[i - 1] )
- goto next_subrule;
- }
-
- return Do_ContextSubst( gsub, sr[k].GlyphCount,
- sr[k].SubstCount, sr[k].SubstLookupRecord,
- buffer,
- nesting_level );
- next_subrule:
- ;
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-static HB_Error Lookup_ContextSubst2( HB_GSUBHeader* gsub,
- HB_ContextSubstFormat2* csf2,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, property;
- HB_Error error;
- HB_UShort i, j, k, known_classes;
-
- HB_UShort* classes;
- HB_UShort* cl;
-
- HB_SubClassSet* scs;
- HB_SubClassRule* sr;
- HB_GDEFHeader* gdef;
-
-
- gdef = gsub->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- /* Note: The coverage table in format 2 doesn't give an index into
- anything. It just lets us know whether or not we need to
- do any lookup at all. */
-
- error = _HB_OPEN_Coverage_Index( &csf2->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- if (csf2->MaxContextLength < 1)
- return HB_Err_Not_Covered;
-
- if ( ALLOC_ARRAY( classes, csf2->MaxContextLength, HB_UShort ) )
- return error;
-
- error = _HB_OPEN_Get_Class( &csf2->ClassDef, IN_CURGLYPH(),
- &classes[0], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End;
- known_classes = 0;
-
- scs = &csf2->SubClassSet[classes[0]];
- if ( !scs )
- {
- error = ERR(HB_Err_Invalid_SubTable);
- goto End;
- }
-
- for ( k = 0; k < scs->SubClassRuleCount; k++ )
- {
- sr = &scs->SubClassRule[k];
-
- if ( context_length != 0xFFFF && context_length < sr->GlyphCount )
- goto next_subclassrule;
-
- if ( buffer->in_pos + sr->GlyphCount > buffer->in_length )
- goto next_subclassrule; /* context is too long */
-
- cl = sr->Class;
-
- /* Start at 1 because [0] is implied */
-
- for ( i = 1, j = buffer->in_pos + 1; i < sr->GlyphCount; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- goto End;
-
- if ( j + sr->GlyphCount - i < (HB_Int)buffer->in_length )
- goto next_subclassrule;
- j++;
- }
-
- if ( i > known_classes )
- {
- /* Keeps us from having to do this for each rule */
-
- error = _HB_OPEN_Get_Class( &csf2->ClassDef, IN_GLYPH( j ), &classes[i], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End;
- known_classes = i;
- }
-
- if ( cl[i - 1] != classes[i] )
- goto next_subclassrule;
- }
-
- error = Do_ContextSubst( gsub, sr->GlyphCount,
- sr->SubstCount, sr->SubstLookupRecord,
- buffer,
- nesting_level );
- goto End;
-
- next_subclassrule:
- ;
- }
-
- error = HB_Err_Not_Covered;
-
-End:
- FREE( classes );
- return error;
-}
-
-
-static HB_Error Lookup_ContextSubst3( HB_GSUBHeader* gsub,
- HB_ContextSubstFormat3* csf3,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_Error error;
- HB_UShort index, i, j, property;
-
- HB_Coverage* c;
- HB_GDEFHeader* gdef;
-
-
- gdef = gsub->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- if ( context_length != 0xFFFF && context_length < csf3->GlyphCount )
- return HB_Err_Not_Covered;
-
- if ( buffer->in_pos + csf3->GlyphCount > buffer->in_length )
- return HB_Err_Not_Covered; /* context is too long */
-
- c = csf3->Coverage;
-
- for ( i = 1, j = buffer->in_pos + 1; i < csf3->GlyphCount; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + csf3->GlyphCount - i == (HB_Int)buffer->in_length )
- return HB_Err_Not_Covered;
- j++;
- }
-
- error = _HB_OPEN_Coverage_Index( &c[i], IN_GLYPH( j ), &index );
- if ( error )
- return error;
- }
-
- return Do_ContextSubst( gsub, csf3->GlyphCount,
- csf3->SubstCount, csf3->SubstLookupRecord,
- buffer,
- nesting_level );
-}
-
-
-static HB_Error Lookup_ContextSubst( HB_GSUBHeader* gsub,
- HB_GSUB_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_ContextSubst* cs = &st->context;
-
- switch ( cs->SubstFormat )
- {
- case 1: return Lookup_ContextSubst1( gsub, &cs->csf.csf1, buffer, flags, context_length, nesting_level );
- case 2: return Lookup_ContextSubst2( gsub, &cs->csf.csf2, buffer, flags, context_length, nesting_level );
- case 3: return Lookup_ContextSubst3( gsub, &cs->csf.csf3, buffer, flags, context_length, nesting_level );
- default: return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok; /* never reached */
-}
-
-
-/* LookupType 6 */
-
-/* ChainSubRule */
-
-static HB_Error Load_ChainSubRule( HB_ChainSubRule* csr,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
- HB_UShort* b;
- HB_UShort* i;
- HB_UShort* l;
-
- HB_SubstLookupRecord* slr;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- csr->BacktrackGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- csr->Backtrack = NULL;
-
- count = csr->BacktrackGlyphCount;
-
- if ( ALLOC_ARRAY( csr->Backtrack, count, HB_UShort ) )
- return error;
-
- b = csr->Backtrack;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail4;
-
- for ( n = 0; n < count; n++ )
- b[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail4;
-
- csr->InputGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- csr->Input = NULL;
-
- count = csr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */
-
- if ( ALLOC_ARRAY( csr->Input, count, HB_UShort ) )
- goto Fail4;
-
- i = csr->Input;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail3;
-
- for ( n = 0; n < count; n++ )
- i[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- csr->LookaheadGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- csr->Lookahead = NULL;
-
- count = csr->LookaheadGlyphCount;
-
- if ( ALLOC_ARRAY( csr->Lookahead, count, HB_UShort ) )
- goto Fail3;
-
- l = csr->Lookahead;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail2;
-
- for ( n = 0; n < count; n++ )
- l[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- csr->SubstCount = GET_UShort();
-
- FORGET_Frame();
-
- csr->SubstLookupRecord = NULL;
-
- count = csr->SubstCount;
-
- if ( ALLOC_ARRAY( csr->SubstLookupRecord, count, HB_SubstLookupRecord ) )
- goto Fail2;
-
- slr = csr->SubstLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- slr[n].SequenceIndex = GET_UShort();
- slr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( slr );
-
-Fail2:
- FREE( l );
-
-Fail3:
- FREE( i );
-
-Fail4:
- FREE( b );
- return error;
-}
-
-
-static void Free_ChainSubRule( HB_ChainSubRule* csr )
-{
- FREE( csr->SubstLookupRecord );
- FREE( csr->Lookahead );
- FREE( csr->Input );
- FREE( csr->Backtrack );
-}
-
-
-/* ChainSubRuleSet */
-
-static HB_Error Load_ChainSubRuleSet( HB_ChainSubRuleSet* csrs,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_ChainSubRule* csr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = csrs->ChainSubRuleCount = GET_UShort();
-
- FORGET_Frame();
-
- csrs->ChainSubRule = NULL;
-
- if ( ALLOC_ARRAY( csrs->ChainSubRule, count, HB_ChainSubRule ) )
- return error;
-
- csr = csrs->ChainSubRule;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_ChainSubRule( &csr[n], stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_ChainSubRule( &csr[m] );
-
- FREE( csr );
- return error;
-}
-
-
-static void Free_ChainSubRuleSet( HB_ChainSubRuleSet* csrs )
-{
- HB_UShort n, count;
-
- HB_ChainSubRule* csr;
-
-
- if ( csrs->ChainSubRule )
- {
- count = csrs->ChainSubRuleCount;
- csr = csrs->ChainSubRule;
-
- for ( n = 0; n < count; n++ )
- Free_ChainSubRule( &csr[n] );
-
- FREE( csr );
- }
-}
-
-
-/* ChainContextSubstFormat1 */
-
-static HB_Error Load_ChainContextSubst1(
- HB_ChainContextSubstFormat1* ccsf1,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_ChainSubRuleSet* csrs;
-
-
- base_offset = FILE_Pos() - 2L;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &ccsf1->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = ccsf1->ChainSubRuleSetCount = GET_UShort();
-
- FORGET_Frame();
-
- ccsf1->ChainSubRuleSet = NULL;
-
- if ( ALLOC_ARRAY( ccsf1->ChainSubRuleSet, count, HB_ChainSubRuleSet ) )
- goto Fail2;
-
- csrs = ccsf1->ChainSubRuleSet;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_ChainSubRuleSet( &csrs[n], stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_ChainSubRuleSet( &csrs[m] );
-
- FREE( csrs );
-
-Fail2:
- _HB_OPEN_Free_Coverage( &ccsf1->Coverage );
- return error;
-}
-
-
-static void Free_ChainContextSubst1( HB_ChainContextSubstFormat1* ccsf1 )
-{
- HB_UShort n, count;
-
- HB_ChainSubRuleSet* csrs;
-
-
- if ( ccsf1->ChainSubRuleSet )
- {
- count = ccsf1->ChainSubRuleSetCount;
- csrs = ccsf1->ChainSubRuleSet;
-
- for ( n = 0; n < count; n++ )
- Free_ChainSubRuleSet( &csrs[n] );
-
- FREE( csrs );
- }
-
- _HB_OPEN_Free_Coverage( &ccsf1->Coverage );
-}
-
-
-/* ChainSubClassRule */
-
-static HB_Error Load_ChainSubClassRule(
- HB_ChainContextSubstFormat2* ccsf2,
- HB_ChainSubClassRule* cscr,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
-
- HB_UShort* b;
- HB_UShort* i;
- HB_UShort* l;
- HB_SubstLookupRecord* slr;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- cscr->BacktrackGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- if ( cscr->BacktrackGlyphCount > ccsf2->MaxBacktrackLength )
- ccsf2->MaxBacktrackLength = cscr->BacktrackGlyphCount;
-
- cscr->Backtrack = NULL;
-
- count = cscr->BacktrackGlyphCount;
-
- if ( ALLOC_ARRAY( cscr->Backtrack, count, HB_UShort ) )
- return error;
-
- b = cscr->Backtrack;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail4;
-
- for ( n = 0; n < count; n++ )
- b[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail4;
-
- cscr->InputGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- if ( cscr->InputGlyphCount > ccsf2->MaxInputLength )
- ccsf2->MaxInputLength = cscr->InputGlyphCount;
-
- cscr->Input = NULL;
-
- count = cscr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */
-
- if ( ALLOC_ARRAY( cscr->Input, count, HB_UShort ) )
- goto Fail4;
-
- i = cscr->Input;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail3;
-
- for ( n = 0; n < count; n++ )
- i[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- cscr->LookaheadGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- if ( cscr->LookaheadGlyphCount > ccsf2->MaxLookaheadLength )
- ccsf2->MaxLookaheadLength = cscr->LookaheadGlyphCount;
-
- cscr->Lookahead = NULL;
-
- count = cscr->LookaheadGlyphCount;
-
- if ( ALLOC_ARRAY( cscr->Lookahead, count, HB_UShort ) )
- goto Fail3;
-
- l = cscr->Lookahead;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail2;
-
- for ( n = 0; n < count; n++ )
- l[n] = GET_UShort();
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- cscr->SubstCount = GET_UShort();
-
- FORGET_Frame();
-
- cscr->SubstLookupRecord = NULL;
-
- count = cscr->SubstCount;
-
- if ( ALLOC_ARRAY( cscr->SubstLookupRecord, count,
- HB_SubstLookupRecord ) )
- goto Fail2;
-
- slr = cscr->SubstLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- slr[n].SequenceIndex = GET_UShort();
- slr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( slr );
-
-Fail2:
- FREE( l );
-
-Fail3:
- FREE( i );
-
-Fail4:
- FREE( b );
- return error;
-}
-
-
-static void Free_ChainSubClassRule( HB_ChainSubClassRule* cscr )
-{
- FREE( cscr->SubstLookupRecord );
- FREE( cscr->Lookahead );
- FREE( cscr->Input );
- FREE( cscr->Backtrack );
-}
-
-
-/* SubClassSet */
-
-static HB_Error Load_ChainSubClassSet(
- HB_ChainContextSubstFormat2* ccsf2,
- HB_ChainSubClassSet* cscs,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_ChainSubClassRule* cscr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = cscs->ChainSubClassRuleCount = GET_UShort();
-
- FORGET_Frame();
-
- cscs->ChainSubClassRule = NULL;
-
- if ( ALLOC_ARRAY( cscs->ChainSubClassRule, count,
- HB_ChainSubClassRule ) )
- return error;
-
- cscr = cscs->ChainSubClassRule;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_ChainSubClassRule( ccsf2, &cscr[n],
- stream ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_ChainSubClassRule( &cscr[m] );
-
- FREE( cscr );
- return error;
-}
-
-
-static void Free_ChainSubClassSet( HB_ChainSubClassSet* cscs )
-{
- HB_UShort n, count;
-
- HB_ChainSubClassRule* cscr;
-
-
- if ( cscs->ChainSubClassRule )
- {
- count = cscs->ChainSubClassRuleCount;
- cscr = cscs->ChainSubClassRule;
-
- for ( n = 0; n < count; n++ )
- Free_ChainSubClassRule( &cscr[n] );
-
- FREE( cscr );
- }
-}
-
-
-/* ChainContextSubstFormat2 */
-
-static HB_Error Load_ChainContextSubst2(
- HB_ChainContextSubstFormat2* ccsf2,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n = 0, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
- HB_UInt backtrack_offset, input_offset, lookahead_offset;
-
- HB_ChainSubClassSet* cscs;
-
-
- base_offset = FILE_Pos() - 2;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &ccsf2->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
- if ( ACCESS_Frame( 8L ) )
- goto Fail5;
-
- backtrack_offset = GET_UShort();
- input_offset = GET_UShort();
- lookahead_offset = GET_UShort();
-
- /* `ChainSubClassSetCount' is the upper limit for input class values,
- thus we read it now to make an additional safety check. No limit
- is known or needed for the other two class definitions */
-
- count = ccsf2->ChainSubClassSetCount = GET_UShort();
-
- FORGET_Frame();
-
- if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->BacktrackClassDef, 65535,
- backtrack_offset, base_offset,
- stream ) ) != HB_Err_Ok )
- goto Fail5;
-
- if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->InputClassDef, count,
- input_offset, base_offset,
- stream ) ) != HB_Err_Ok )
- goto Fail4;
- if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->LookaheadClassDef, 65535,
- lookahead_offset, base_offset,
- stream ) ) != HB_Err_Ok )
- goto Fail3;
-
- ccsf2->ChainSubClassSet = NULL;
- ccsf2->MaxBacktrackLength = 0;
- ccsf2->MaxInputLength = 0;
- ccsf2->MaxLookaheadLength = 0;
-
- if ( ALLOC_ARRAY( ccsf2->ChainSubClassSet, count, HB_ChainSubClassSet ) )
- goto Fail2;
-
- cscs = ccsf2->ChainSubClassSet;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- if ( new_offset != base_offset ) /* not a NULL offset */
- {
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_ChainSubClassSet( ccsf2, &cscs[n],
- stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
- else
- {
- /* we create a ChainSubClassSet table with no entries */
-
- ccsf2->ChainSubClassSet[n].ChainSubClassRuleCount = 0;
- ccsf2->ChainSubClassSet[n].ChainSubClassRule = NULL;
- }
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_ChainSubClassSet( &cscs[m] );
-
- FREE( cscs );
-
-Fail2:
- _HB_OPEN_Free_ClassDefinition( &ccsf2->LookaheadClassDef );
-
-Fail3:
- _HB_OPEN_Free_ClassDefinition( &ccsf2->InputClassDef );
-
-Fail4:
- _HB_OPEN_Free_ClassDefinition( &ccsf2->BacktrackClassDef );
-
-Fail5:
- _HB_OPEN_Free_Coverage( &ccsf2->Coverage );
- return error;
-}
-
-
-static void Free_ChainContextSubst2( HB_ChainContextSubstFormat2* ccsf2 )
-{
- HB_UShort n, count;
-
- HB_ChainSubClassSet* cscs;
-
-
- if ( ccsf2->ChainSubClassSet )
- {
- count = ccsf2->ChainSubClassSetCount;
- cscs = ccsf2->ChainSubClassSet;
-
- for ( n = 0; n < count; n++ )
- Free_ChainSubClassSet( &cscs[n] );
-
- FREE( cscs );
- }
-
- _HB_OPEN_Free_ClassDefinition( &ccsf2->LookaheadClassDef );
- _HB_OPEN_Free_ClassDefinition( &ccsf2->InputClassDef );
- _HB_OPEN_Free_ClassDefinition( &ccsf2->BacktrackClassDef );
-
- _HB_OPEN_Free_Coverage( &ccsf2->Coverage );
-}
-
-
-/* ChainContextSubstFormat3 */
-
-static HB_Error Load_ChainContextSubst3(
- HB_ChainContextSubstFormat3* ccsf3,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, nb = 0, ni =0, nl = 0, m, count;
- HB_UShort backtrack_count, input_count, lookahead_count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_Coverage* b;
- HB_Coverage* i;
- HB_Coverage* l;
- HB_SubstLookupRecord* slr;
-
-
- base_offset = FILE_Pos() - 2L;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- ccsf3->BacktrackGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- ccsf3->BacktrackCoverage = NULL;
-
- backtrack_count = ccsf3->BacktrackGlyphCount;
-
- if ( ALLOC_ARRAY( ccsf3->BacktrackCoverage, backtrack_count,
- HB_Coverage ) )
- return error;
-
- b = ccsf3->BacktrackCoverage;
-
- for ( nb = 0; nb < backtrack_count; nb++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail4;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok )
- goto Fail4;
- (void)FILE_Seek( cur_offset );
- }
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail4;
-
- ccsf3->InputGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- ccsf3->InputCoverage = NULL;
-
- input_count = ccsf3->InputGlyphCount;
-
- if ( ALLOC_ARRAY( ccsf3->InputCoverage, input_count, HB_Coverage ) )
- goto Fail4;
-
- i = ccsf3->InputCoverage;
-
- for ( ni = 0; ni < input_count; ni++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &i[ni], stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
- }
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- ccsf3->LookaheadGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- ccsf3->LookaheadCoverage = NULL;
-
- lookahead_count = ccsf3->LookaheadGlyphCount;
-
- if ( ALLOC_ARRAY( ccsf3->LookaheadCoverage, lookahead_count,
- HB_Coverage ) )
- goto Fail3;
-
- l = ccsf3->LookaheadCoverage;
-
- for ( nl = 0; nl < lookahead_count; nl++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok )
- goto Fail2;
- (void)FILE_Seek( cur_offset );
- }
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- ccsf3->SubstCount = GET_UShort();
-
- FORGET_Frame();
-
- ccsf3->SubstLookupRecord = NULL;
-
- count = ccsf3->SubstCount;
-
- if ( ALLOC_ARRAY( ccsf3->SubstLookupRecord, count,
- HB_SubstLookupRecord ) )
- goto Fail2;
-
- slr = ccsf3->SubstLookupRecord;
-
- if ( ACCESS_Frame( count * 4L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- {
- slr[n].SequenceIndex = GET_UShort();
- slr[n].LookupListIndex = GET_UShort();
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( slr );
-
-Fail2:
- for ( m = 0; m < nl; m++ )
- _HB_OPEN_Free_Coverage( &l[m] );
-
- FREE( l );
-
-Fail3:
- for ( m = 0; m < ni; m++ )
- _HB_OPEN_Free_Coverage( &i[m] );
-
- FREE( i );
-
-Fail4:
- for ( m = 0; m < nb; m++ )
- _HB_OPEN_Free_Coverage( &b[m] );
-
- FREE( b );
- return error;
-}
-
-
-static void Free_ChainContextSubst3( HB_ChainContextSubstFormat3* ccsf3 )
-{
- HB_UShort n, count;
-
- HB_Coverage* c;
-
-
- FREE( ccsf3->SubstLookupRecord );
-
- if ( ccsf3->LookaheadCoverage )
- {
- count = ccsf3->LookaheadGlyphCount;
- c = ccsf3->LookaheadCoverage;
-
- for ( n = 0; n < count; n++ )
- _HB_OPEN_Free_Coverage( &c[n] );
-
- FREE( c );
- }
-
- if ( ccsf3->InputCoverage )
- {
- count = ccsf3->InputGlyphCount;
- c = ccsf3->InputCoverage;
-
- for ( n = 0; n < count; n++ )
- _HB_OPEN_Free_Coverage( &c[n] );
-
- FREE( c );
- }
-
- if ( ccsf3->BacktrackCoverage )
- {
- count = ccsf3->BacktrackGlyphCount;
- c = ccsf3->BacktrackCoverage;
-
- for ( n = 0; n < count; n++ )
- _HB_OPEN_Free_Coverage( &c[n] );
-
- FREE( c );
- }
-}
-
-
-/* ChainContextSubst */
-
-static HB_Error Load_ChainContextSubst( HB_GSUB_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_ChainContextSubst* ccs = &st->chain;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- ccs->SubstFormat = GET_UShort();
-
- FORGET_Frame();
-
- switch ( ccs->SubstFormat ) {
- case 1: return Load_ChainContextSubst1( &ccs->ccsf.ccsf1, stream );
- case 2: return Load_ChainContextSubst2( &ccs->ccsf.ccsf2, stream );
- case 3: return Load_ChainContextSubst3( &ccs->ccsf.ccsf3, stream );
- default: return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok; /* never reached */
-}
-
-
-static void Free_ChainContextSubst( HB_GSUB_SubTable* st )
-{
- HB_ChainContextSubst* ccs = &st->chain;
-
- switch ( ccs->SubstFormat ) {
- case 1: Free_ChainContextSubst1( &ccs->ccsf.ccsf1 ); break;
- case 2: Free_ChainContextSubst2( &ccs->ccsf.ccsf2 ); break;
- case 3: Free_ChainContextSubst3( &ccs->ccsf.ccsf3 ); break;
- default: break;
- }
-}
-
-
-static HB_Error Lookup_ChainContextSubst1( HB_GSUBHeader* gsub,
- HB_ChainContextSubstFormat1* ccsf1,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, property;
- HB_UShort i, j, k, num_csr;
- HB_UShort bgc, igc, lgc;
- HB_Error error;
-
- HB_ChainSubRule* csr;
- HB_ChainSubRule curr_csr;
- HB_GDEFHeader* gdef;
-
-
- gdef = gsub->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- error = _HB_OPEN_Coverage_Index( &ccsf1->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- csr = ccsf1->ChainSubRuleSet[index].ChainSubRule;
- num_csr = ccsf1->ChainSubRuleSet[index].ChainSubRuleCount;
-
- for ( k = 0; k < num_csr; k++ )
- {
- curr_csr = csr[k];
- bgc = curr_csr.BacktrackGlyphCount;
- igc = curr_csr.InputGlyphCount;
- lgc = curr_csr.LookaheadGlyphCount;
-
- if ( context_length != 0xFFFF && context_length < igc )
- goto next_chainsubrule;
-
- /* check whether context is too long; it is a first guess only */
-
- if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length )
- goto next_chainsubrule;
-
- if ( bgc )
- {
- /* since we don't know in advance the number of glyphs to inspect,
- we search backwards for matches in the backtrack glyph array */
-
- for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- )
- {
- while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + 1 == bgc - i )
- goto next_chainsubrule;
- j--;
- }
-
- /* In OpenType 1.3, it is undefined whether the offsets of
- backtrack glyphs is in logical order or not. Version 1.4
- will clarify this:
-
- Logical order - a b c d e f g h i j
- i
- Input offsets - 0 1
- Backtrack offsets - 3 2 1 0
- Lookahead offsets - 0 1 2 3 */
-
- if ( OUT_GLYPH( j ) != curr_csr.Backtrack[i] )
- goto next_chainsubrule;
- }
- }
-
- /* Start at 1 because [0] is implied */
-
- for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
- goto next_chainsubrule;
- j++;
- }
-
- if ( IN_GLYPH( j ) != curr_csr.Input[i - 1] )
- goto next_chainsubrule;
- }
-
- /* we are starting to check for lookahead glyphs right after the
- last context glyph */
-
- for ( i = 0; i < lgc; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + lgc - i == (HB_Int)buffer->in_length )
- goto next_chainsubrule;
- j++;
- }
-
- if ( IN_GLYPH( j ) != curr_csr.Lookahead[i] )
- goto next_chainsubrule;
- }
-
- return Do_ContextSubst( gsub, igc,
- curr_csr.SubstCount,
- curr_csr.SubstLookupRecord,
- buffer,
- nesting_level );
-
- next_chainsubrule:
- ;
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-static HB_Error Lookup_ChainContextSubst2( HB_GSUBHeader* gsub,
- HB_ChainContextSubstFormat2* ccsf2,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, property;
- HB_Error error;
- HB_UShort i, j, k;
- HB_UShort bgc, igc, lgc;
- HB_UShort known_backtrack_classes,
- known_input_classes,
- known_lookahead_classes;
-
- HB_UShort* backtrack_classes;
- HB_UShort* input_classes;
- HB_UShort* lookahead_classes;
-
- HB_UShort* bc;
- HB_UShort* ic;
- HB_UShort* lc;
-
- HB_ChainSubClassSet* cscs;
- HB_ChainSubClassRule ccsr;
- HB_GDEFHeader* gdef;
-
-
- gdef = gsub->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- /* Note: The coverage table in format 2 doesn't give an index into
- anything. It just lets us know whether or not we need to
- do any lookup at all. */
-
- error = _HB_OPEN_Coverage_Index( &ccsf2->Coverage, IN_CURGLYPH(), &index );
- if ( error )
- return error;
-
- if (ccsf2->MaxInputLength < 1)
- return HB_Err_Not_Covered;
-
- if ( ALLOC_ARRAY( backtrack_classes, ccsf2->MaxBacktrackLength, HB_UShort ) )
- return error;
- known_backtrack_classes = 0;
-
- if ( ALLOC_ARRAY( input_classes, ccsf2->MaxInputLength, HB_UShort ) )
- goto End3;
- known_input_classes = 1;
-
- if ( ALLOC_ARRAY( lookahead_classes, ccsf2->MaxLookaheadLength, HB_UShort ) )
- goto End2;
- known_lookahead_classes = 0;
-
- error = _HB_OPEN_Get_Class( &ccsf2->InputClassDef, IN_CURGLYPH(),
- &input_classes[0], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
-
- cscs = &ccsf2->ChainSubClassSet[input_classes[0]];
- if ( !cscs )
- {
- error = ERR(HB_Err_Invalid_SubTable);
- goto End1;
- }
-
- for ( k = 0; k < cscs->ChainSubClassRuleCount; k++ )
- {
- ccsr = cscs->ChainSubClassRule[k];
- bgc = ccsr.BacktrackGlyphCount;
- igc = ccsr.InputGlyphCount;
- lgc = ccsr.LookaheadGlyphCount;
-
- if ( context_length != 0xFFFF && context_length < igc )
- goto next_chainsubclassrule;
-
- /* check whether context is too long; it is a first guess only */
-
- if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length )
- goto next_chainsubclassrule;
-
- if ( bgc )
- {
- /* Since we don't know in advance the number of glyphs to inspect,
- we search backwards for matches in the backtrack glyph array.
- Note that `known_backtrack_classes' starts at index 0. */
-
- bc = ccsr.Backtrack;
-
- for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- )
- {
- while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
-
- if ( j + 1 == bgc - i )
- goto next_chainsubclassrule;
- j--;
- }
-
- if ( i >= known_backtrack_classes )
- {
- /* Keeps us from having to do this for each rule */
-
- error = _HB_OPEN_Get_Class( &ccsf2->BacktrackClassDef, OUT_GLYPH( j ),
- &backtrack_classes[i], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
- known_backtrack_classes = i;
- }
-
- if ( bc[i] != backtrack_classes[i] )
- goto next_chainsubclassrule;
- }
- }
-
- ic = ccsr.Input;
-
- /* Start at 1 because [0] is implied */
-
- for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
-
- if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
- goto next_chainsubclassrule;
- j++;
- }
-
- if ( i >= known_input_classes )
- {
- error = _HB_OPEN_Get_Class( &ccsf2->InputClassDef, IN_GLYPH( j ),
- &input_classes[i], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
- known_input_classes = i;
- }
-
- if ( ic[i - 1] != input_classes[i] )
- goto next_chainsubclassrule;
- }
-
- /* we are starting to check for lookahead glyphs right after the
- last context glyph */
-
- lc = ccsr.Lookahead;
-
- for ( i = 0; i < lgc; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
-
- if ( j + lgc - i == (HB_Int)buffer->in_length )
- goto next_chainsubclassrule;
- j++;
- }
-
- if ( i >= known_lookahead_classes )
- {
- error = _HB_OPEN_Get_Class( &ccsf2->LookaheadClassDef, IN_GLYPH( j ),
- &lookahead_classes[i], NULL );
- if ( error && error != HB_Err_Not_Covered )
- goto End1;
- known_lookahead_classes = i;
- }
-
- if ( lc[i] != lookahead_classes[i] )
- goto next_chainsubclassrule;
- }
-
- error = Do_ContextSubst( gsub, igc,
- ccsr.SubstCount,
- ccsr.SubstLookupRecord,
- buffer,
- nesting_level );
- goto End1;
-
- next_chainsubclassrule:
- ;
- }
-
- error = HB_Err_Not_Covered;
-
-End1:
- FREE( lookahead_classes );
-
-End2:
- FREE( input_classes );
-
-End3:
- FREE( backtrack_classes );
- return error;
-}
-
-
-static HB_Error Lookup_ChainContextSubst3( HB_GSUBHeader* gsub,
- HB_ChainContextSubstFormat3* ccsf3,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, i, j, property;
- HB_UShort bgc, igc, lgc;
- HB_Error error;
-
- HB_Coverage* bc;
- HB_Coverage* ic;
- HB_Coverage* lc;
- HB_GDEFHeader* gdef;
-
-
- gdef = gsub->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- bgc = ccsf3->BacktrackGlyphCount;
- igc = ccsf3->InputGlyphCount;
- lgc = ccsf3->LookaheadGlyphCount;
-
- if ( context_length != 0xFFFF && context_length < igc )
- return HB_Err_Not_Covered;
-
- /* check whether context is too long; it is a first guess only */
-
- if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length )
- return HB_Err_Not_Covered;
-
- if ( bgc )
- {
- /* Since we don't know in advance the number of glyphs to inspect,
- we search backwards for matches in the backtrack glyph array */
-
- bc = ccsf3->BacktrackCoverage;
-
- for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- )
- {
- while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + 1 == bgc - i )
- return HB_Err_Not_Covered;
- j--;
- }
-
- error = _HB_OPEN_Coverage_Index( &bc[i], OUT_GLYPH( j ), &index );
- if ( error )
- return error;
- }
- }
-
- ic = ccsf3->InputCoverage;
-
- for ( i = 0, j = buffer->in_pos; i < igc; i++, j++ )
- {
- /* We already called CHECK_Property for IN_GLYPH( buffer->in_pos ) */
- while ( j > buffer->in_pos && CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
- return HB_Err_Not_Covered;
- j++;
- }
-
- error = _HB_OPEN_Coverage_Index( &ic[i], IN_GLYPH( j ), &index );
- if ( error )
- return error;
- }
-
- /* we are starting for lookahead glyphs right after the last context
- glyph */
-
- lc = ccsf3->LookaheadCoverage;
-
- for ( i = 0; i < lgc; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + lgc - i == (HB_Int)buffer->in_length )
- return HB_Err_Not_Covered;
- j++;
- }
-
- error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index );
- if ( error )
- return error;
- }
-
- return Do_ContextSubst( gsub, igc,
- ccsf3->SubstCount,
- ccsf3->SubstLookupRecord,
- buffer,
- nesting_level );
-}
-
-
-static HB_Error Lookup_ChainContextSubst( HB_GSUBHeader* gsub,
- HB_GSUB_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_ChainContextSubst* ccs = &st->chain;
-
- switch ( ccs->SubstFormat ) {
- case 1: return Lookup_ChainContextSubst1( gsub, &ccs->ccsf.ccsf1, buffer, flags, context_length, nesting_level );
- case 2: return Lookup_ChainContextSubst2( gsub, &ccs->ccsf.ccsf2, buffer, flags, context_length, nesting_level );
- case 3: return Lookup_ChainContextSubst3( gsub, &ccs->ccsf.ccsf3, buffer, flags, context_length, nesting_level );
- default: return ERR(HB_Err_Invalid_SubTable_Format);
- }
-}
-
-
-static HB_Error Load_ReverseChainContextSubst( HB_GSUB_SubTable* st,
- HB_Stream stream )
-{
- HB_Error error;
- HB_ReverseChainContextSubst* rccs = &st->reverse;
-
- HB_UShort m, count;
-
- HB_UShort nb = 0, nl = 0, n;
- HB_UShort backtrack_count, lookahead_count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_Coverage* b;
- HB_Coverage* l;
- HB_UShort* sub;
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- rccs->SubstFormat = GET_UShort();
-
- if ( rccs->SubstFormat != 1 )
- return ERR(HB_Err_Invalid_SubTable_Format);
-
- FORGET_Frame();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &rccs->Coverage, stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
-
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail4;
-
- rccs->BacktrackGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- rccs->BacktrackCoverage = NULL;
-
- backtrack_count = rccs->BacktrackGlyphCount;
-
- if ( ALLOC_ARRAY( rccs->BacktrackCoverage, backtrack_count,
- HB_Coverage ) )
- goto Fail4;
-
- b = rccs->BacktrackCoverage;
-
- for ( nb = 0; nb < backtrack_count; nb++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok )
- goto Fail3;
- (void)FILE_Seek( cur_offset );
- }
-
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail3;
-
- rccs->LookaheadGlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- rccs->LookaheadCoverage = NULL;
-
- lookahead_count = rccs->LookaheadGlyphCount;
-
- if ( ALLOC_ARRAY( rccs->LookaheadCoverage, lookahead_count,
- HB_Coverage ) )
- goto Fail3;
-
- l = rccs->LookaheadCoverage;
-
- for ( nl = 0; nl < lookahead_count; nl++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok )
- goto Fail2;
- (void)FILE_Seek( cur_offset );
- }
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- rccs->GlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- rccs->Substitute = NULL;
-
- count = rccs->GlyphCount;
-
- if ( ALLOC_ARRAY( rccs->Substitute, count,
- HB_UShort ) )
- goto Fail2;
-
- sub = rccs->Substitute;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail1;
-
- for ( n = 0; n < count; n++ )
- sub[n] = GET_UShort();
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( sub );
-
-Fail2:
- for ( m = 0; m < nl; m++ )
- _HB_OPEN_Free_Coverage( &l[m] );
-
- FREE( l );
-
-Fail3:
- for ( m = 0; m < nb; m++ )
- _HB_OPEN_Free_Coverage( &b[m] );
-
- FREE( b );
-
-Fail4:
- _HB_OPEN_Free_Coverage( &rccs->Coverage );
- return error;
-}
-
-
-static void Free_ReverseChainContextSubst( HB_GSUB_SubTable* st )
-{
- HB_UShort n, count;
- HB_ReverseChainContextSubst* rccs = &st->reverse;
-
- HB_Coverage* c;
-
- _HB_OPEN_Free_Coverage( &rccs->Coverage );
-
- if ( rccs->LookaheadCoverage )
- {
- count = rccs->LookaheadGlyphCount;
- c = rccs->LookaheadCoverage;
-
- for ( n = 0; n < count; n++ )
- _HB_OPEN_Free_Coverage( &c[n] );
-
- FREE( c );
- }
-
- if ( rccs->BacktrackCoverage )
- {
- count = rccs->BacktrackGlyphCount;
- c = rccs->BacktrackCoverage;
-
- for ( n = 0; n < count; n++ )
- _HB_OPEN_Free_Coverage( &c[n] );
-
- FREE( c );
- }
-
- FREE ( rccs->Substitute );
-}
-
-
-static HB_Error Lookup_ReverseChainContextSubst( HB_GSUBHeader* gsub,
- HB_GSUB_SubTable* st,
- HB_Buffer buffer,
- HB_UShort flags,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_UShort index, input_index, i, j, property;
- HB_UShort bgc, lgc;
- HB_Error error;
-
- HB_ReverseChainContextSubst* rccs = &st->reverse;
- HB_Coverage* bc;
- HB_Coverage* lc;
- HB_GDEFHeader* gdef;
-
- if ( nesting_level != 1 || context_length != 0xFFFF )
- return HB_Err_Not_Covered;
-
- gdef = gsub->gdef;
-
- if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
- return error;
-
- bgc = rccs->BacktrackGlyphCount;
- lgc = rccs->LookaheadGlyphCount;
-
- /* check whether context is too long; it is a first guess only */
-
- if ( bgc > buffer->in_pos || buffer->in_pos + 1 + lgc > buffer->in_length )
- return HB_Err_Not_Covered;
-
- if ( bgc )
- {
- /* Since we don't know in advance the number of glyphs to inspect,
- we search backwards for matches in the backtrack glyph array */
-
- bc = rccs->BacktrackCoverage;
-
- for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + 1 == bgc - i )
- return HB_Err_Not_Covered;
- j--;
- }
-
- error = _HB_OPEN_Coverage_Index( &bc[i], IN_GLYPH( j ), &index );
- if ( error )
- return error;
- }
- }
-
- j = buffer->in_pos;
-
- error = _HB_OPEN_Coverage_Index( &rccs->Coverage, IN_GLYPH( j ), &input_index );
- if ( error )
- return error;
-
- lc = rccs->LookaheadCoverage;
-
- for ( i = 0, j = buffer->in_pos + 1; i < lgc; i++, j++ )
- {
- while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
- {
- if ( error && error != HB_Err_Not_Covered )
- return error;
-
- if ( j + lgc - i == (HB_Int)buffer->in_length )
- return HB_Err_Not_Covered;
- j++;
- }
-
- error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index );
- if ( error )
- return error;
- }
-
- IN_CURGLYPH() = rccs->Substitute[input_index];
- buffer->in_pos--; /* Reverse! */
-
- return error;
-}
-
-
-
-/***********
- * GSUB API
- ***********/
-
-
-
-HB_Error HB_GSUB_Select_Script( HB_GSUBHeader* gsub,
- HB_UInt script_tag,
- HB_UShort* script_index )
-{
- HB_UShort n;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
-
-
- if ( !gsub || !script_index )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gsub->ScriptList;
- sr = sl->ScriptRecord;
-
- for ( n = 0; n < sl->ScriptCount; n++ )
- if ( script_tag == sr[n].ScriptTag )
- {
- *script_index = n;
-
- return HB_Err_Ok;
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-
-HB_Error HB_GSUB_Select_Language( HB_GSUBHeader* gsub,
- HB_UInt language_tag,
- HB_UShort script_index,
- HB_UShort* language_index,
- HB_UShort* req_feature_index )
-{
- HB_UShort n;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
- HB_ScriptTable* s;
- HB_LangSysRecord* lsr;
-
-
- if ( !gsub || !language_index || !req_feature_index )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gsub->ScriptList;
- sr = sl->ScriptRecord;
-
- if ( script_index >= sl->ScriptCount )
- return ERR(HB_Err_Invalid_Argument);
-
- s = &sr[script_index].Script;
- lsr = s->LangSysRecord;
-
- for ( n = 0; n < s->LangSysCount; n++ )
- if ( language_tag == lsr[n].LangSysTag )
- {
- *language_index = n;
- *req_feature_index = lsr[n].LangSys.ReqFeatureIndex;
-
- return HB_Err_Ok;
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-/* selecting 0xFFFF for language_index asks for the values of the
- default language (DefaultLangSys) */
-
-
-HB_Error HB_GSUB_Select_Feature( HB_GSUBHeader* gsub,
- HB_UInt feature_tag,
- HB_UShort script_index,
- HB_UShort language_index,
- HB_UShort* feature_index )
-{
- HB_UShort n;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
- HB_ScriptTable* s;
- HB_LangSysRecord* lsr;
- HB_LangSys* ls;
- HB_UShort* fi;
-
- HB_FeatureList* fl;
- HB_FeatureRecord* fr;
-
-
- if ( !gsub || !feature_index )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gsub->ScriptList;
- sr = sl->ScriptRecord;
-
- fl = &gsub->FeatureList;
- fr = fl->FeatureRecord;
-
- if ( script_index >= sl->ScriptCount )
- return ERR(HB_Err_Invalid_Argument);
-
- s = &sr[script_index].Script;
- lsr = s->LangSysRecord;
-
- if ( language_index == 0xFFFF )
- ls = &s->DefaultLangSys;
- else
- {
- if ( language_index >= s->LangSysCount )
- return ERR(HB_Err_Invalid_Argument);
-
- ls = &lsr[language_index].LangSys;
- }
-
- fi = ls->FeatureIndex;
-
- for ( n = 0; n < ls->FeatureCount; n++ )
- {
- if ( fi[n] >= fl->FeatureCount )
- return ERR(HB_Err_Invalid_SubTable_Format);
-
- if ( feature_tag == fr[fi[n]].FeatureTag )
- {
- *feature_index = fi[n];
-
- return HB_Err_Ok;
- }
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-/* The next three functions return a null-terminated list */
-
-
-HB_Error HB_GSUB_Query_Scripts( HB_GSUBHeader* gsub,
- HB_UInt** script_tag_list )
-{
- HB_UShort n;
- HB_Error error;
- HB_UInt* stl;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
-
-
- if ( !gsub || !script_tag_list )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gsub->ScriptList;
- sr = sl->ScriptRecord;
-
- if ( ALLOC_ARRAY( stl, sl->ScriptCount + 1, HB_UInt ) )
- return error;
-
- for ( n = 0; n < sl->ScriptCount; n++ )
- stl[n] = sr[n].ScriptTag;
- stl[n] = 0;
-
- *script_tag_list = stl;
-
- return HB_Err_Ok;
-}
-
-
-
-HB_Error HB_GSUB_Query_Languages( HB_GSUBHeader* gsub,
- HB_UShort script_index,
- HB_UInt** language_tag_list )
-{
- HB_UShort n;
- HB_Error error;
- HB_UInt* ltl;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
- HB_ScriptTable* s;
- HB_LangSysRecord* lsr;
-
-
- if ( !gsub || !language_tag_list )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gsub->ScriptList;
- sr = sl->ScriptRecord;
-
- if ( script_index >= sl->ScriptCount )
- return ERR(HB_Err_Invalid_Argument);
-
- s = &sr[script_index].Script;
- lsr = s->LangSysRecord;
-
- if ( ALLOC_ARRAY( ltl, s->LangSysCount + 1, HB_UInt ) )
- return error;
-
- for ( n = 0; n < s->LangSysCount; n++ )
- ltl[n] = lsr[n].LangSysTag;
- ltl[n] = 0;
-
- *language_tag_list = ltl;
-
- return HB_Err_Ok;
-}
-
-
-/* selecting 0xFFFF for language_index asks for the values of the
- default language (DefaultLangSys) */
-
-
-HB_Error HB_GSUB_Query_Features( HB_GSUBHeader* gsub,
- HB_UShort script_index,
- HB_UShort language_index,
- HB_UInt** feature_tag_list )
-{
- HB_UShort n;
- HB_Error error;
- HB_UInt* ftl;
-
- HB_ScriptList* sl;
- HB_ScriptRecord* sr;
- HB_ScriptTable* s;
- HB_LangSysRecord* lsr;
- HB_LangSys* ls;
- HB_UShort* fi;
-
- HB_FeatureList* fl;
- HB_FeatureRecord* fr;
-
-
- if ( !gsub || !feature_tag_list )
- return ERR(HB_Err_Invalid_Argument);
-
- sl = &gsub->ScriptList;
- sr = sl->ScriptRecord;
-
- fl = &gsub->FeatureList;
- fr = fl->FeatureRecord;
-
- if ( script_index >= sl->ScriptCount )
- return ERR(HB_Err_Invalid_Argument);
-
- s = &sr[script_index].Script;
- lsr = s->LangSysRecord;
-
- if ( language_index == 0xFFFF )
- ls = &s->DefaultLangSys;
- else
- {
- if ( language_index >= s->LangSysCount )
- return ERR(HB_Err_Invalid_Argument);
-
- ls = &lsr[language_index].LangSys;
- }
-
- fi = ls->FeatureIndex;
-
- if ( ALLOC_ARRAY( ftl, ls->FeatureCount + 1, HB_UInt ) )
- return error;
-
- for ( n = 0; n < ls->FeatureCount; n++ )
- {
- if ( fi[n] >= fl->FeatureCount )
- {
- FREE( ftl );
- return ERR(HB_Err_Invalid_SubTable_Format);
- }
- ftl[n] = fr[fi[n]].FeatureTag;
- }
- ftl[n] = 0;
-
- *feature_tag_list = ftl;
-
- return HB_Err_Ok;
-}
-
-
-/* Do an individual subtable lookup. Returns HB_Err_Ok if substitution
- has been done, or HB_Err_Not_Covered if not. */
-static HB_Error GSUB_Do_Glyph_Lookup( HB_GSUBHeader* gsub,
- HB_UShort lookup_index,
- HB_Buffer buffer,
- HB_UShort context_length,
- int nesting_level )
-{
- HB_Error error = HB_Err_Not_Covered;
- HB_UShort i, flags, lookup_count;
- HB_Lookup* lo;
- int lookup_type;
-
- nesting_level++;
-
- if ( nesting_level > HB_MAX_NESTING_LEVEL )
- return ERR(HB_Err_Not_Covered); /* ERR() call intended */
-
- lookup_count = gsub->LookupList.LookupCount;
- if (lookup_index >= lookup_count)
- return error;
-
- lo = &gsub->LookupList.Lookup[lookup_index];
- flags = lo->LookupFlag;
- lookup_type = lo->LookupType;
-
- for ( i = 0; i < lo->SubTableCount; i++ )
- {
- HB_GSUB_SubTable *st = &lo->SubTable[i].st.gsub;
-
- switch (lookup_type) {
- case HB_GSUB_LOOKUP_SINGLE:
- error = Lookup_SingleSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GSUB_LOOKUP_MULTIPLE:
- error = Lookup_MultipleSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GSUB_LOOKUP_ALTERNATE:
- error = Lookup_AlternateSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GSUB_LOOKUP_LIGATURE:
- error = Lookup_LigatureSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GSUB_LOOKUP_CONTEXT:
- error = Lookup_ContextSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break;
- case HB_GSUB_LOOKUP_CHAIN:
- error = Lookup_ChainContextSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break;
- /*case HB_GSUB_LOOKUP_EXTENSION:
- error = Lookup_ExtensionSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break;*/
- case HB_GSUB_LOOKUP_REVERSE_CHAIN:
- error = Lookup_ReverseChainContextSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break;
- default:
- error = HB_Err_Not_Covered;
- };
-
- /* Check whether we have a successful substitution or an error other
- than HB_Err_Not_Covered */
- if ( error != HB_Err_Not_Covered )
- return error;
- }
-
- return HB_Err_Not_Covered;
-}
-
-
-HB_INTERNAL HB_Error
-_HB_GSUB_Load_SubTable( HB_GSUB_SubTable* st,
- HB_Stream stream,
- HB_UShort lookup_type )
-{
- switch (lookup_type) {
- case HB_GSUB_LOOKUP_SINGLE: return Load_SingleSubst ( st, stream );
- case HB_GSUB_LOOKUP_MULTIPLE: return Load_MultipleSubst ( st, stream );
- case HB_GSUB_LOOKUP_ALTERNATE: return Load_AlternateSubst ( st, stream );
- case HB_GSUB_LOOKUP_LIGATURE: return Load_LigatureSubst ( st, stream );
- case HB_GSUB_LOOKUP_CONTEXT: return Load_ContextSubst ( st, stream );
- case HB_GSUB_LOOKUP_CHAIN: return Load_ChainContextSubst ( st, stream );
- /*case HB_GSUB_LOOKUP_EXTENSION: return Load_ExtensionSubst ( st, stream );*/
- case HB_GSUB_LOOKUP_REVERSE_CHAIN: return Load_ReverseChainContextSubst ( st, stream );
- default: return ERR(HB_Err_Invalid_SubTable_Format);
- };
-}
-
-
-HB_INTERNAL void
-_HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st,
- HB_UShort lookup_type )
-{
- switch ( lookup_type ) {
- case HB_GSUB_LOOKUP_SINGLE: Free_SingleSubst ( st ); return;
- case HB_GSUB_LOOKUP_MULTIPLE: Free_MultipleSubst ( st ); return;
- case HB_GSUB_LOOKUP_ALTERNATE: Free_AlternateSubst ( st ); return;
- case HB_GSUB_LOOKUP_LIGATURE: Free_LigatureSubst ( st ); return;
- case HB_GSUB_LOOKUP_CONTEXT: Free_ContextSubst ( st ); return;
- case HB_GSUB_LOOKUP_CHAIN: Free_ChainContextSubst ( st ); return;
- /*case HB_GSUB_LOOKUP_EXTENSION: Free_ExtensionSubst ( st ); return;*/
- case HB_GSUB_LOOKUP_REVERSE_CHAIN: Free_ReverseChainContextSubst ( st ); return;
- default: return;
- };
-}
-
-
-
-/* apply one lookup to the input string object */
-
-static HB_Error GSUB_Do_String_Lookup( HB_GSUBHeader* gsub,
- HB_UShort lookup_index,
- HB_Buffer buffer )
-{
- HB_Error error, retError = HB_Err_Not_Covered;
-
- HB_UInt* properties = gsub->LookupList.Properties;
- int lookup_type = gsub->LookupList.Lookup[lookup_index].LookupType;
-
- const int nesting_level = 0;
- /* 0xFFFF indicates that we don't have a context length yet */
- const HB_UShort context_length = 0xFFFF;
-
- switch (lookup_type) {
-
- case HB_GSUB_LOOKUP_SINGLE:
- case HB_GSUB_LOOKUP_MULTIPLE:
- case HB_GSUB_LOOKUP_ALTERNATE:
- case HB_GSUB_LOOKUP_LIGATURE:
- case HB_GSUB_LOOKUP_CONTEXT:
- case HB_GSUB_LOOKUP_CHAIN:
- /* in/out forward substitution (implemented lazy) */
-
- _hb_buffer_clear_output ( buffer );
- buffer->in_pos = 0;
- while ( buffer->in_pos < buffer->in_length )
- {
- if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] )
- {
- error = GSUB_Do_Glyph_Lookup( gsub, lookup_index, buffer, context_length, nesting_level );
- if ( error )
- {
- if ( error != HB_Err_Not_Covered )
- return error;
- }
- else
- retError = error;
- }
- else
- error = HB_Err_Not_Covered;
-
- if ( error == HB_Err_Not_Covered )
- if ( COPY_Glyph ( buffer ) )
- return error;
- }
- /* we shouldn't swap if error occurred.
- *
- * also don't swap if nothing changed (ie HB_Err_Not_Covered).
- * shouldn't matter in that case though.
- */
- if ( retError == HB_Err_Ok )
- _hb_buffer_swap( buffer );
-
- return retError;
-
- case HB_GSUB_LOOKUP_REVERSE_CHAIN:
- /* in-place backward substitution */
-
- buffer->in_pos = buffer->in_length - 1;
- do
- {
- if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] )
- {
- error = GSUB_Do_Glyph_Lookup( gsub, lookup_index, buffer, context_length, nesting_level );
- if ( error )
- {
- if ( error != HB_Err_Not_Covered )
- return error;
- }
- else
- retError = error;
- }
- else
- error = HB_Err_Not_Covered;
-
- if ( error == HB_Err_Not_Covered )
- buffer->in_pos--;
- }
- while ((HB_Int) buffer->in_pos >= 0);
-
- return retError;
-
- /*case HB_GSUB_LOOKUP_EXTENSION:*/
- default:
- return retError;
- };
-}
-
-
-HB_Error HB_GSUB_Add_Feature( HB_GSUBHeader* gsub,
- HB_UShort feature_index,
- HB_UInt property )
-{
- HB_UShort i;
-
- HB_Feature feature;
- HB_UInt* properties;
- HB_UShort* index;
- HB_UShort lookup_count;
-
- /* Each feature can only be added once */
-
- if ( !gsub ||
- feature_index >= gsub->FeatureList.FeatureCount ||
- gsub->FeatureList.ApplyCount == gsub->FeatureList.FeatureCount )
- return ERR(HB_Err_Invalid_Argument);
-
- gsub->FeatureList.ApplyOrder[gsub->FeatureList.ApplyCount++] = feature_index;
-
- properties = gsub->LookupList.Properties;
-
- feature = gsub->FeatureList.FeatureRecord[feature_index].Feature;
- index = feature.LookupListIndex;
- lookup_count = gsub->LookupList.LookupCount;
-
- for ( i = 0; i < feature.LookupListCount; i++ )
- {
- HB_UShort lookup_index = index[i];
- if (lookup_index < lookup_count)
- properties[lookup_index] |= property;
- }
-
- return HB_Err_Ok;
-}
-
-
-
-HB_Error HB_GSUB_Clear_Features( HB_GSUBHeader* gsub )
-{
- HB_UShort i;
-
- HB_UInt* properties;
-
-
- if ( !gsub )
- return ERR(HB_Err_Invalid_Argument);
-
- gsub->FeatureList.ApplyCount = 0;
-
- properties = gsub->LookupList.Properties;
-
- for ( i = 0; i < gsub->LookupList.LookupCount; i++ )
- properties[i] = 0;
-
- return HB_Err_Ok;
-}
-
-
-
-HB_Error HB_GSUB_Register_Alternate_Function( HB_GSUBHeader* gsub,
- HB_AltFunction altfunc,
- void* data )
-{
- if ( !gsub )
- return ERR(HB_Err_Invalid_Argument);
-
- gsub->altfunc = altfunc;
- gsub->data = data;
-
- return HB_Err_Ok;
-}
-
-/* returns error if one happened, otherwise returns HB_Err_Not_Covered if no
- * feature were applied, or HB_Err_Ok otherwise.
- */
-HB_Error HB_GSUB_Apply_String( HB_GSUBHeader* gsub,
- HB_Buffer buffer )
-{
- HB_Error error, retError = HB_Err_Not_Covered;
- int i, j, lookup_count, num_features;
-
- if ( !gsub ||
- !buffer)
- return ERR(HB_Err_Invalid_Argument);
-
- if ( buffer->in_length == 0 )
- return retError;
-
- lookup_count = gsub->LookupList.LookupCount;
- num_features = gsub->FeatureList.ApplyCount;
-
- for ( i = 0; i < num_features; i++)
- {
- HB_UShort feature_index = gsub->FeatureList.ApplyOrder[i];
- HB_Feature feature = gsub->FeatureList.FeatureRecord[feature_index].Feature;
-
- for ( j = 0; j < feature.LookupListCount; j++ )
- {
- HB_UShort lookup_index = feature.LookupListIndex[j];
-
- /* Skip nonexistant lookups */
- if (lookup_index >= lookup_count)
- continue;
-
- error = GSUB_Do_String_Lookup( gsub, lookup_index, buffer );
- if ( error )
- {
- if ( error != HB_Err_Not_Covered )
- return error;
- }
- else
- retError = error;
- }
- }
-
- error = retError;
-
- return error;
-}
-
-
-/* END */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h b/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h
deleted file mode 100644
index 6e452bdb35..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GSUB_H
-#define HARFBUZZ_GSUB_H
-
-#include "harfbuzz-gdef.h"
-#include "harfbuzz-buffer.h"
-
-HB_BEGIN_HEADER
-
-/* Lookup types for glyph substitution */
-
-#define HB_GSUB_LOOKUP_SINGLE 1
-#define HB_GSUB_LOOKUP_MULTIPLE 2
-#define HB_GSUB_LOOKUP_ALTERNATE 3
-#define HB_GSUB_LOOKUP_LIGATURE 4
-#define HB_GSUB_LOOKUP_CONTEXT 5
-#define HB_GSUB_LOOKUP_CHAIN 6
-#define HB_GSUB_LOOKUP_EXTENSION 7
-#define HB_GSUB_LOOKUP_REVERSE_CHAIN 8
-
-
-/* A pointer to a function which selects the alternate glyph. `pos' is
- the position of the glyph with index `glyphID', `num_alternates'
- gives the number of alternates in the `alternates' array. `data'
- points to the user-defined structure specified during a call to
- HB_GSUB_Register_Alternate_Function(). The function must return an
- index into the `alternates' array. */
-
-typedef HB_UShort (*HB_AltFunction)(HB_UInt pos,
- HB_UShort glyphID,
- HB_UShort num_alternates,
- HB_UShort* alternates,
- void* data );
-
-
-struct HB_GSUBHeader_
-{
- HB_GDEFHeader* gdef;
-
- /* the next two fields are used for an alternate substitution callback
- function to select the proper alternate glyph. */
-
- void* data;
- HB_AltFunction altfunc;
-
- HB_UInt offset;
-
- HB_16Dot16 Version;
-
- HB_ScriptList ScriptList;
- HB_FeatureList FeatureList;
- HB_LookupList LookupList;
-};
-
-typedef struct HB_GSUBHeader_ HB_GSUBHeader;
-typedef HB_GSUBHeader* HB_GSUB;
-
-
-HB_Error HB_Load_GSUB_Table( HB_Stream stream,
- HB_GSUBHeader** gsub,
- HB_GDEFHeader* gdef,
- HB_Stream gdefStream );
-
-
-HB_Error HB_Done_GSUB_Table( HB_GSUBHeader* gsub );
-
-
-HB_Error HB_GSUB_Select_Script( HB_GSUBHeader* gsub,
- HB_UInt script_tag,
- HB_UShort* script_index );
-
-HB_Error HB_GSUB_Select_Language( HB_GSUBHeader* gsub,
- HB_UInt language_tag,
- HB_UShort script_index,
- HB_UShort* language_index,
- HB_UShort* req_feature_index );
-
-HB_Error HB_GSUB_Select_Feature( HB_GSUBHeader* gsub,
- HB_UInt feature_tag,
- HB_UShort script_index,
- HB_UShort language_index,
- HB_UShort* feature_index );
-
-
-HB_Error HB_GSUB_Query_Scripts( HB_GSUBHeader* gsub,
- HB_UInt** script_tag_list );
-
-HB_Error HB_GSUB_Query_Languages( HB_GSUBHeader* gsub,
- HB_UShort script_index,
- HB_UInt** language_tag_list );
-
-HB_Error HB_GSUB_Query_Features( HB_GSUBHeader* gsub,
- HB_UShort script_index,
- HB_UShort language_index,
- HB_UInt** feature_tag_list );
-
-
-HB_Error HB_GSUB_Add_Feature( HB_GSUBHeader* gsub,
- HB_UShort feature_index,
- HB_UInt property );
-
-HB_Error HB_GSUB_Clear_Features( HB_GSUBHeader* gsub );
-
-
-HB_Error HB_GSUB_Register_Alternate_Function( HB_GSUBHeader* gsub,
- HB_AltFunction altfunc,
- void* data );
-
-
-HB_Error HB_GSUB_Apply_String( HB_GSUBHeader* gsub,
- HB_Buffer buffer );
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GSUB_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-hangul.c b/src/3rdparty/harfbuzz/src/harfbuzz-hangul.c
deleted file mode 100644
index 41d5545898..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-hangul.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-
-/*
-// Hangul is a syllable based script. Unicode reserves a large range
-// for precomposed hangul, where syllables are already precomposed to
-// their final glyph shape. In addition, a so called jamo range is
-// defined, that can be used to express old Hangul. Modern hangul
-// syllables can also be expressed as jamo, and should be composed
-// into syllables. The operation is rather simple and mathematical.
-
-// Every hangul jamo is classified as being either a Leading consonant
-// (L), and intermediat Vowel (V) or a trailing consonant (T). Modern
-// hangul syllables (the ones in the precomposed area can be of type
-// LV or LVT.
-//
-// Syllable breaks do _not_ occur between:
-//
-// L L, V or precomposed
-// V, LV V, T
-// LVT, T T
-//
-// A standard syllable is of the form L+V+T*. The above rules allow
-// nonstandard syllables L*V*T*. To transform them into standard
-// syllables fill characters L_f and V_f can be inserted.
-*/
-
-enum {
- Hangul_SBase = 0xac00,
- Hangul_LBase = 0x1100,
- Hangul_VBase = 0x1161,
- Hangul_TBase = 0x11a7,
- Hangul_SCount = 11172,
- Hangul_LCount = 19,
- Hangul_VCount = 21,
- Hangul_TCount = 28,
- Hangul_NCount = 21*28
-};
-
-#define hangul_isPrecomposed(uc) \
- (uc >= Hangul_SBase && uc < Hangul_SBase + Hangul_SCount)
-
-#define hangul_isLV(uc) \
- ((uc - Hangul_SBase) % Hangul_TCount == 0)
-
-typedef enum {
- L,
- V,
- T,
- LV,
- LVT,
- X
-} HangulType;
-
-static HangulType hangul_type(unsigned short uc) {
- if (uc > Hangul_SBase && uc < Hangul_SBase + Hangul_SCount)
- return hangul_isLV(uc) ? LV : LVT;
- if (uc < Hangul_LBase || uc > 0x11ff)
- return X;
- if (uc < Hangul_VBase)
- return L;
- if (uc < Hangul_TBase)
- return V;
- return T;
-}
-
-static int hangul_nextSyllableBoundary(const HB_UChar16 *s, int start, int end)
-{
- const HB_UChar16 *uc = s + start;
-
- HangulType state = hangul_type(*uc);
- int pos = 1;
-
- while (pos < end - start) {
- HangulType newState = hangul_type(uc[pos]);
- switch(newState) {
- case X:
- goto finish;
- case L:
- case V:
- case T:
- if (state > newState)
- goto finish;
- state = newState;
- break;
- case LV:
- if (state > L)
- goto finish;
- state = V;
- break;
- case LVT:
- if (state > L)
- goto finish;
- state = T;
- }
- ++pos;
- }
-
- finish:
- return start+pos;
-}
-
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature hangul_features [] = {
- { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
- { HB_MAKE_TAG('l', 'j', 'm', 'o'), CcmpProperty },
- { HB_MAKE_TAG('v', 'j', 'm', 'o'), CcmpProperty },
- { HB_MAKE_TAG('t', 'j', 'm', 'o'), CcmpProperty },
- { 0, 0 }
-};
-#endif
-
-static HB_Bool hangul_shape_syllable(HB_ShaperItem *item, HB_Bool openType)
-{
- const HB_UChar16 *ch = item->string + item->item.pos;
- int len = item->item.length;
-#ifndef NO_OPENTYPE
- const int availableGlyphs = item->num_glyphs;
-#endif
-
- int i;
- HB_UChar16 composed = 0;
- /* see if we can compose the syllable into a modern hangul */
- if (item->item.length == 2) {
- int LIndex = ch[0] - Hangul_LBase;
- int VIndex = ch[1] - Hangul_VBase;
- if (LIndex >= 0 && LIndex < Hangul_LCount &&
- VIndex >= 0 && VIndex < Hangul_VCount)
- composed = (LIndex * Hangul_VCount + VIndex) * Hangul_TCount + Hangul_SBase;
- } else if (item->item.length == 3) {
- int LIndex = ch[0] - Hangul_LBase;
- int VIndex = ch[1] - Hangul_VBase;
- int TIndex = ch[2] - Hangul_TBase;
- if (LIndex >= 0 && LIndex < Hangul_LCount &&
- VIndex >= 0 && VIndex < Hangul_VCount &&
- TIndex >= 0 && TIndex < Hangul_TCount)
- composed = (LIndex * Hangul_VCount + VIndex) * Hangul_TCount + TIndex + Hangul_SBase;
- }
-
-
-
- /* if we have a modern hangul use the composed form */
- if (composed) {
- ch = &composed;
- len = 1;
- }
-
- if (!item->font->klass->convertStringToGlyphIndices(item->font,
- ch, len,
- item->glyphs, &item->num_glyphs,
- item->item.bidiLevel % 2))
- return FALSE;
- for (i = 0; i < len; i++) {
- item->attributes[i].mark = FALSE;
- item->attributes[i].clusterStart = FALSE;
- item->attributes[i].justification = 0;
- item->attributes[i].zeroWidth = FALSE;
- /*IDEBUG(" %d: %4x", i, ch[i].unicode()); */
- }
-
-#ifndef NO_OPENTYPE
- if (!composed && openType) {
- HB_Bool positioned;
-
- HB_STACKARRAY(unsigned short, logClusters, len);
- for (i = 0; i < len; ++i)
- logClusters[i] = i;
- item->log_clusters = logClusters;
-
- HB_OpenTypeShape(item, /*properties*/0);
-
- positioned = HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE);
-
- HB_FREE_STACKARRAY(logClusters);
-
- if (!positioned)
- return FALSE;
- } else {
- HB_HeuristicPosition(item);
- }
-#endif
-
- item->attributes[0].clusterStart = TRUE;
- return TRUE;
-}
-
-HB_Bool HB_HangulShape(HB_ShaperItem *item)
-{
- const HB_UChar16 *uc = item->string + item->item.pos;
- HB_Bool allPrecomposed = TRUE;
- int i;
-
- assert(item->item.script == HB_Script_Hangul);
-
- for (i = 0; i < (int)item->item.length; ++i) {
- if (!hangul_isPrecomposed(uc[i])) {
- allPrecomposed = FALSE;
- break;
- }
- }
-
- if (!allPrecomposed) {
- HB_Bool openType = FALSE;
- unsigned short *logClusters = item->log_clusters;
- HB_ShaperItem syllable;
- int first_glyph = 0;
- int sstart = item->item.pos;
- int end = sstart + item->item.length;
-
-#ifndef NO_OPENTYPE
- openType = HB_SelectScript(item, hangul_features);
-#endif
- syllable = *item;
-
- while (sstart < end) {
- int send = hangul_nextSyllableBoundary(item->string, sstart, end);
-
- syllable.item.pos = sstart;
- syllable.item.length = send-sstart;
- syllable.glyphs = item->glyphs + first_glyph;
- syllable.attributes = item->attributes + first_glyph;
- syllable.offsets = item->offsets + first_glyph;
- syllable.advances = item->advances + first_glyph;
- syllable.num_glyphs = item->num_glyphs - first_glyph;
- if (!hangul_shape_syllable(&syllable, openType)) {
- item->num_glyphs += syllable.num_glyphs;
- return FALSE;
- }
- /* fix logcluster array */
- for (i = sstart; i < send; ++i)
- logClusters[i-item->item.pos] = first_glyph;
- sstart = send;
- first_glyph += syllable.num_glyphs;
- }
- item->num_glyphs = first_glyph;
- return TRUE;
- }
-
- return HB_BasicShape(item);
-}
-
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-hebrew.c b/src/3rdparty/harfbuzz/src/harfbuzz-hebrew.c
deleted file mode 100644
index a96ab39285..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-hebrew.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-#include <assert.h>
-
-/*
-// Uniscribe also defines dlig for Hebrew, but we leave this out for now, as it's mostly
-// ligatures one does not want in modern Hebrew (as lam-alef ligatures).
-*/
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature hebrew_features[] = {
- { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
- {0, 0}
-};
-#endif
-
-/* Hebrew shaping. In the non opentype case we try to use the
- presentation forms specified for Hebrew. Especially for the
- ligatures with Dagesh this gives much better results than we could
- achieve manually.
-*/
-HB_Bool HB_HebrewShape(HB_ShaperItem *shaper_item)
-{
- enum {
- Dagesh = 0x5bc,
- ShinDot = 0x5c1,
- SinDot = 0x5c2,
- Patah = 0x5b7,
- Qamats = 0x5b8,
- Holam = 0x5b9,
- Rafe = 0x5bf
- };
-
- assert(shaper_item->item.script == HB_Script_Hebrew);
-
-#ifndef NO_OPENTYPE
- if (HB_SelectScript(shaper_item, hebrew_features)) {
-
- const int availableGlyphs = shaper_item->num_glyphs;
- if (!HB_ConvertStringToGlyphIndices(shaper_item))
- return FALSE;
-
- HB_HeuristicSetGlyphAttributes(shaper_item);
- HB_OpenTypeShape(shaper_item, /*properties*/0);
- return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/TRUE);
- }
-#endif
-
- {
- const HB_UChar16 *uc = shaper_item->string + shaper_item->item.pos;
- unsigned short *logClusters = shaper_item->log_clusters;
- HB_GlyphAttributes *attributes = shaper_item->attributes;
-
- HB_Bool haveGlyphs;
- int slen = 1;
- int cluster_start = 0;
- hb_uint32 i;
-
- HB_STACKARRAY(HB_UChar16, shapedChars, 2 * shaper_item->item.length);
- *shapedChars = *uc;
- logClusters[0] = 0;
-
- for (i = 1; i < shaper_item->item.length; ++i) {
- hb_uint16 base = shapedChars[cluster_start];
- hb_uint16 shaped = 0;
- HB_Bool invalid = FALSE;
- if (uc[i] == Dagesh) {
- if (base >= 0x5d0
- && base <= 0x5ea
- && base != 0x5d7
- && base != 0x5dd
- && base != 0x5df
- && base != 0x5e2
- && base != 0x5e5) {
- shaped = base - 0x5d0 + 0xfb30;
- } else if (base == 0xfb2a || base == 0xfb2b /* Shin with Shin or Sin dot */) {
- shaped = base + 2;
- } else {
- invalid = TRUE;
- }
- } else if (uc[i] == ShinDot) {
- if (base == 0x05e9)
- shaped = 0xfb2a;
- else if (base == 0xfb49)
- shaped = 0xfb2c;
- else
- invalid = TRUE;
- } else if (uc[i] == SinDot) {
- if (base == 0x05e9)
- shaped = 0xfb2b;
- else if (base == 0xfb49)
- shaped = 0xfb2d;
- else
- invalid = TRUE;
- } else if (uc[i] == Patah) {
- if (base == 0x5d0)
- shaped = 0xfb2e;
- } else if (uc[i] == Qamats) {
- if (base == 0x5d0)
- shaped = 0xfb2f;
- } else if (uc[i] == Holam) {
- if (base == 0x5d5)
- shaped = 0xfb4b;
- } else if (uc[i] == Rafe) {
- if (base == 0x5d1)
- shaped = 0xfb4c;
- else if (base == 0x5db)
- shaped = 0xfb4d;
- else if (base == 0x5e4)
- shaped = 0xfb4e;
- }
-
- if (invalid) {
- shapedChars[slen] = 0x25cc;
- attributes[slen].clusterStart = TRUE;
- attributes[slen].mark = FALSE;
- attributes[slen].combiningClass = 0;
- cluster_start = slen;
- ++slen;
- }
- if (shaped) {
- if (shaper_item->font->klass->canRender(shaper_item->font, (HB_UChar16 *)&shaped, 1)) {
- shapedChars[cluster_start] = shaped;
- } else
- shaped = 0;
- }
- if (!shaped) {
- HB_CharCategory category;
- int cmb;
- shapedChars[slen] = uc[i];
- HB_GetUnicodeCharProperties(uc[i], &category, &cmb);
- if (category != HB_Mark_NonSpacing) {
- attributes[slen].clusterStart = TRUE;
- attributes[slen].mark = FALSE;
- attributes[slen].combiningClass = 0;
- attributes[slen].dontPrint = HB_IsControlChar(uc[i]);
- cluster_start = slen;
- } else {
- attributes[slen].clusterStart = FALSE;
- attributes[slen].mark = TRUE;
- attributes[slen].combiningClass = cmb;
- }
- ++slen;
- }
- logClusters[i] = cluster_start;
- }
-
- haveGlyphs = shaper_item->font->klass
- ->convertStringToGlyphIndices(shaper_item->font,
- shapedChars, slen,
- shaper_item->glyphs, &shaper_item->num_glyphs,
- shaper_item->item.bidiLevel % 2);
-
- HB_FREE_STACKARRAY(shapedChars);
-
- if (!haveGlyphs)
- return FALSE;
-
- HB_HeuristicPosition(shaper_item);
- }
-
- return TRUE;
-}
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-impl.c b/src/3rdparty/harfbuzz/src/harfbuzz-impl.c
deleted file mode 100644
index 8f7edcece3..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-impl.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2015 The Qt Company Ltd
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-
-
-HB_INTERNAL HB_Pointer
-_hb_alloc(size_t size,
- HB_Error *perror )
-{
- HB_Error error = (HB_Error)0;
- HB_Pointer block = NULL;
-
- if ( size > 0 )
- {
- block = calloc( 1, size );
- if ( !block )
- error = ERR(HB_Err_Out_Of_Memory);
- }
-
- *perror = error;
- return block;
-}
-
-
-HB_INTERNAL HB_Pointer
-_hb_realloc(HB_Pointer block,
- size_t new_size,
- HB_Error *perror )
-{
- HB_Pointer block2 = NULL;
- HB_Error error = (HB_Error)0;
-
- block2 = realloc( block, new_size );
- if ( block2 == NULL && new_size != 0 )
- error = ERR(HB_Err_Out_Of_Memory);
-
- if ( !error )
- block = block2;
-
- *perror = error;
- return block;
-}
-
-
-HB_INTERNAL void
-_hb_free( HB_Pointer block )
-{
- if ( block )
- free( block );
-}
-
-
-/* helper func to set a breakpoint on */
-HB_INTERNAL HB_Error
-_hb_err (HB_Error code)
-{
- return code;
-}
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-impl.h b/src/3rdparty/harfbuzz/src/harfbuzz-impl.h
deleted file mode 100644
index f98594ac91..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-impl.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_IMPL_H
-#define HARFBUZZ_IMPL_H
-
-#include "harfbuzz-global.h"
-
-#include <stdlib.h>
-
-HB_BEGIN_HEADER
-
-#ifndef HB_INTERNAL
-# define HB_INTERNAL
-#endif
-
-#ifndef NULL
-# define NULL ((void *)0)
-#endif
-
-#ifndef FALSE
-# define FALSE 0
-#endif
-
-#ifndef TRUE
-# define TRUE 1
-#endif
-
-#ifndef TTAG_GDEF
-# define TTAG_GDEF HB_MAKE_TAG( 'G', 'D', 'E', 'F' )
-#endif
-#ifndef TTAG_GPOS
-# define TTAG_GPOS HB_MAKE_TAG( 'G', 'P', 'O', 'S' )
-#endif
-#ifndef TTAG_GSUB
-# define TTAG_GSUB HB_MAKE_TAG( 'G', 'S', 'U', 'B' )
-#endif
-
-#ifndef HB_UNUSED
-# define HB_UNUSED(arg) ((void)(arg))
-#endif
-
-#define HB_LIKELY(cond) (cond)
-#define HB_UNLIKELY(cond) (cond)
-
-#define ARRAY_LEN(Array) ((int)(sizeof (Array) / sizeof (Array)[0]))
-
-
-
-#define HB_IsHighSurrogate(ucs) \
- (((ucs) & 0xfc00) == 0xd800)
-
-#define HB_IsLowSurrogate(ucs) \
- (((ucs) & 0xfc00) == 0xdc00)
-
-#define HB_SurrogateToUcs4(high, low) \
- (((HB_UChar32)(high))<<10) + (low) - 0x35fdc00;
-
-
-
-
-
-#define ALLOC(_ptr,_size) \
- ( (_ptr) = _hb_alloc( _size, &error ), error != 0 )
-
-#define REALLOC(_ptr,_newsz) \
- ( (_ptr) = _hb_realloc( (_ptr), (_newsz), &error ), error != 0 )
-
-#define FREE(_ptr) \
- do { \
- if ( (_ptr) ) \
- { \
- _hb_free( _ptr ); \
- _ptr = NULL; \
- } \
- } while (0)
-
-#define ALLOC_ARRAY(_ptr,_count,_type) \
- ALLOC(_ptr,(_count)*sizeof(_type))
-
-#define REALLOC_ARRAY(_ptr,_newcnt,_type) \
- REALLOC(_ptr,(_newcnt)*sizeof(_type))
-
-#define MEM_Copy(dest,source,count) memcpy( (char*)(dest), (const char*)(source), (size_t)(count) )
-
-#define ERR(err) _hb_err (err)
-
-
-HB_INTERNAL HB_Pointer
-_hb_alloc( size_t size,
- HB_Error *perror_ );
-
-HB_INTERNAL HB_Pointer
-_hb_realloc( HB_Pointer block,
- size_t new_size,
- HB_Error *perror_ );
-
-HB_INTERNAL void
-_hb_free( HB_Pointer block );
-
-
-/* helper func to set a breakpoint on */
-HB_INTERNAL HB_Error
-_hb_err (HB_Error code);
-
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_IMPL_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp
deleted file mode 100644
index de3bcb2bbf..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp
+++ /dev/null
@@ -1,1899 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-#define FLAG(x) (1 << (x))
-
-static HB_Bool isLetter(HB_UChar16 ucs)
-{
- const int test = FLAG(HB_Letter_Uppercase) |
- FLAG(HB_Letter_Lowercase) |
- FLAG(HB_Letter_Titlecase) |
- FLAG(HB_Letter_Modifier) |
- FLAG(HB_Letter_Other);
- return !!(FLAG(HB_GetUnicodeCharCategory(ucs)) & test);
-}
-
-static HB_Bool isMark(HB_UChar16 ucs)
-{
- const int test = FLAG(HB_Mark_NonSpacing) |
- FLAG(HB_Mark_SpacingCombining) |
- FLAG(HB_Mark_Enclosing);
- return !!(FLAG(HB_GetUnicodeCharCategory(ucs)) & test);
-}
-
-enum Form {
- Invalid = 0x0,
- UnknownForm = Invalid,
- Consonant,
- Nukta,
- Halant,
- Matra,
- VowelMark,
- StressMark,
- IndependentVowel,
- LengthMark,
- Control,
- Other
-};
-
-static const unsigned char indicForms[0xe00-0x900] = {
- // Devangari
- Invalid, VowelMark, VowelMark, VowelMark,
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, UnknownForm, UnknownForm,
- Nukta, Other, Matra, Matra,
-
- Matra, Matra, Matra, Matra,
- Matra, Matra, Matra, Matra,
- Matra, Matra, Matra, Matra,
- Matra, Halant, UnknownForm, UnknownForm,
-
- Other, StressMark, StressMark, StressMark,
- StressMark, UnknownForm, UnknownForm, UnknownForm,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- IndependentVowel, IndependentVowel, VowelMark, VowelMark,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Consonant,
- Consonant, Consonant /* ??? */, Consonant, Consonant,
-
- // Bengali
- Invalid, VowelMark, VowelMark, VowelMark,
- Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, Invalid, Invalid, IndependentVowel,
-
- IndependentVowel, Invalid, Invalid, IndependentVowel,
- IndependentVowel, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Invalid, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Invalid, Consonant, Invalid,
- Invalid, Invalid, Consonant, Consonant,
- Consonant, Consonant, UnknownForm, UnknownForm,
- Nukta, Other, Matra, Matra,
-
- Matra, Matra, Matra, Matra,
- Matra, Invalid, Invalid, Matra,
- Matra, Invalid, Invalid, Matra,
- Matra, Halant, Consonant, UnknownForm,
-
- Invalid, Invalid, Invalid, Invalid,
- Invalid, Invalid, Invalid, VowelMark,
- Invalid, Invalid, Invalid, Invalid,
- Consonant, Consonant, Invalid, Consonant,
-
- IndependentVowel, IndependentVowel, VowelMark, VowelMark,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- Consonant, Consonant, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- // Gurmukhi
- Invalid, VowelMark, VowelMark, VowelMark,
- Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, Invalid,
- Invalid, Invalid, Invalid, IndependentVowel,
-
- IndependentVowel, Invalid, Invalid, IndependentVowel,
- IndependentVowel, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Invalid, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Invalid, Consonant, Consonant,
- Invalid, Consonant, Consonant, Invalid,
- Consonant, Consonant, UnknownForm, UnknownForm,
- Nukta, Other, Matra, Matra,
-
- Matra, Matra, Matra, Invalid,
- Invalid, Invalid, Invalid, Matra,
- Matra, Invalid, Invalid, Matra,
- Matra, Halant, UnknownForm, UnknownForm,
-
- Invalid, Invalid, Invalid, Invalid,
- Invalid, UnknownForm, UnknownForm, UnknownForm,
- Invalid, Consonant, Consonant, Consonant,
- Consonant, Invalid, Consonant, Invalid,
-
- Other, Other, Invalid, Invalid,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- StressMark, StressMark, Consonant, Consonant,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- // Gujarati
- Invalid, VowelMark, VowelMark, VowelMark,
- Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, Invalid, IndependentVowel,
-
- IndependentVowel, IndependentVowel, Invalid, IndependentVowel,
- IndependentVowel, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Invalid, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Invalid, Consonant, Consonant,
- Invalid, Consonant, Consonant, Consonant,
- Consonant, Consonant, UnknownForm, UnknownForm,
- Nukta, Other, Matra, Matra,
-
- Matra, Matra, Matra, Matra,
- Matra, Matra, Invalid, Matra,
- Matra, Matra, Invalid, Matra,
- Matra, Halant, UnknownForm, UnknownForm,
-
- Other, UnknownForm, UnknownForm, UnknownForm,
- UnknownForm, UnknownForm, UnknownForm, UnknownForm,
- UnknownForm, UnknownForm, UnknownForm, UnknownForm,
- UnknownForm, UnknownForm, UnknownForm, UnknownForm,
-
- IndependentVowel, IndependentVowel, VowelMark, VowelMark,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- // Oriya
- Invalid, VowelMark, VowelMark, VowelMark,
- Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, Invalid, Invalid, IndependentVowel,
-
- IndependentVowel, Invalid, Invalid, IndependentVowel,
- IndependentVowel, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Invalid, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Invalid, Consonant, Consonant,
- Invalid, Consonant, Consonant, Consonant,
- Consonant, Consonant, UnknownForm, UnknownForm,
- Nukta, Other, Matra, Matra,
-
- Matra, Matra, Matra, Matra,
- Invalid, Invalid, Invalid, Matra,
- Matra, Invalid, Invalid, Matra,
- Matra, Halant, UnknownForm, UnknownForm,
-
- Other, Invalid, Invalid, Invalid,
- Invalid, UnknownForm, LengthMark, LengthMark,
- Invalid, Invalid, Invalid, Invalid,
- Consonant, Consonant, Invalid, Consonant,
-
- IndependentVowel, IndependentVowel, Invalid, Invalid,
- Invalid, Invalid, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- Other, Consonant, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- //Tamil
- Invalid, Invalid, VowelMark, Other,
- Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, Invalid,
- Invalid, Invalid, IndependentVowel, IndependentVowel,
-
- IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
- IndependentVowel, Consonant, Invalid, Invalid,
- Invalid, Consonant, Consonant, Invalid,
- Consonant, Invalid, Consonant, Consonant,
-
- Invalid, Invalid, Invalid, Consonant,
- Consonant, Invalid, Invalid, Invalid,
- Consonant, Consonant, Consonant, Invalid,
- Invalid, Invalid, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, UnknownForm, UnknownForm,
- Invalid, Invalid, Matra, Matra,
-
- Matra, Matra, Matra, Invalid,
- Invalid, Invalid, Matra, Matra,
- Matra, Invalid, Matra, Matra,
- Matra, Halant, Invalid, Invalid,
-
- Invalid, Invalid, Invalid, Invalid,
- Invalid, Invalid, Invalid, LengthMark,
- Invalid, Invalid, Invalid, Invalid,
- Invalid, Invalid, Invalid, Invalid,
-
- Invalid, Invalid, Invalid, Invalid,
- Invalid, Invalid, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- // Telugu
- Invalid, VowelMark, VowelMark, VowelMark,
- Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
-
- IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
- IndependentVowel, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Invalid, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Invalid, Consonant, Consonant, Consonant,
- Consonant, Consonant, UnknownForm, UnknownForm,
- Invalid, Invalid, Matra, Matra,
-
- Matra, Matra, Matra, Matra,
- Matra, Invalid, Matra, Matra,
- Matra, Invalid, Matra, Matra,
- Matra, Halant, Invalid, Invalid,
-
- Invalid, Invalid, Invalid, Invalid,
- Invalid, LengthMark, Matra, Invalid,
- Invalid, Invalid, Invalid, Invalid,
- Invalid, Invalid, Invalid, Invalid,
-
- IndependentVowel, IndependentVowel, Invalid, Invalid,
- Invalid, Invalid, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- // Kannada
- Invalid, Invalid, VowelMark, VowelMark,
- Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
-
- IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
- IndependentVowel, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Invalid, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Invalid, Consonant, Consonant, Consonant,
- Consonant, Consonant, UnknownForm, UnknownForm,
- Nukta, Other, Matra, Matra,
-
- Matra, Matra, Matra, Matra,
- Matra, Invalid, Matra, Matra,
- Matra, Invalid, Matra, Matra,
- Matra, Halant, Invalid, Invalid,
-
- Invalid, Invalid, Invalid, Invalid,
- Invalid, LengthMark, LengthMark, Invalid,
- Invalid, Invalid, Invalid, Invalid,
- Invalid, Invalid, Consonant, Invalid,
-
- IndependentVowel, IndependentVowel, VowelMark, VowelMark,
- Invalid, Invalid, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- // Malayalam
- Invalid, Invalid, VowelMark, VowelMark,
- Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
-
- IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
- IndependentVowel, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Invalid, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, UnknownForm, UnknownForm,
- Invalid, Invalid, Matra, Matra,
-
- Matra, Matra, Matra, Matra,
- Invalid, Invalid, Matra, Matra,
- Matra, Invalid, Matra, Matra,
- Matra, Halant, Invalid, Invalid,
-
- Invalid, Invalid, Invalid, Invalid,
- Invalid, Invalid, Invalid, Matra,
- Invalid, Invalid, Invalid, Invalid,
- Invalid, Invalid, Invalid, Invalid,
-
- IndependentVowel, IndependentVowel, Invalid, Invalid,
- Invalid, Invalid, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-
- // Sinhala
- Invalid, Invalid, VowelMark, VowelMark,
- Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-
- IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
- IndependentVowel, IndependentVowel, IndependentVowel, Invalid,
- Invalid, Invalid, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
-
- Consonant, Consonant, Invalid, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Consonant,
- Invalid, Consonant, Invalid, Invalid,
-
- Consonant, Consonant, Consonant, Consonant,
- Consonant, Consonant, Consonant, Invalid,
- Invalid, Invalid, Halant, Invalid,
- Invalid, Invalid, Invalid, Matra,
-
- Matra, Matra, Matra, Matra,
- Matra, Invalid, Matra, Invalid,
- Matra, Matra, Matra, Matra,
- Matra, Matra, Matra, Matra,
-
- Invalid, Invalid, Invalid, Invalid,
- Invalid, Invalid, Invalid, Invalid,
- Invalid, Invalid, Invalid, Invalid,
- Invalid, Invalid, Invalid, Invalid,
-
- Invalid, Invalid, Matra, Matra,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
- Other, Other, Other, Other,
-};
-
-enum Position {
- None,
- Pre,
- Above,
- Below,
- Post,
- Split,
- Base,
- Reph,
- Vattu,
- Inherit
-};
-
-static const unsigned char indicPosition[0xe00-0x900] = {
- // Devanagari
- None, Above, Above, Post,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- Below, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, Post, Pre,
-
- Post, Below, Below, Below,
- Below, Above, Above, Above,
- Above, Post, Post, Post,
- Post, None, None, None,
-
- None, Above, Below, Above,
- Above, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, Below, Below,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- // Bengali
- None, Above, Post, Post,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- Below, None, None, Post,
-
- Below, None, None, None,
- None, None, None, None,
- None, None, None, None,
- Below, None, Post, Pre,
-
- Post, Below, Below, Below,
- Below, None, None, Pre,
- Pre, None, None, Split,
- Split, Below, None, None,
-
- None, None, None, None,
- None, None, None, Post,
- None, None, None, None,
- None, None, None, None,
-
- None, None, Below, Below,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- Below, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- // Gurmukhi
- None, Above, Above, Post,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, Post,
-
- Below, None, None, None,
- None, Below, None, None,
- None, Below, None, None,
- Below, None, Post, Pre,
-
- Post, Below, Below, None,
- None, None, None, Above,
- Above, None, None, Above,
- Above, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- Above, Above, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- // Gujarati
- None, Above, Above, Post,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- Below, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, Post, Pre,
-
- Post, Below, Below, Below,
- Below, Above, None, Above,
- Above, Post, None, Post,
- Post, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, Below, Below,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- // Oriya
- None, Above, Post, Post,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, Below, Below, Below,
- Below, Below, Below, Below,
- Below, Below, None, Below,
-
- Below, Below, Below, Below,
- Below, Below, Below, Below,
- Below, None, Below, Below,
- Below, Below, Below, Post,
-
- Below, None, Below, Below,
- None, Below, Below, Below,
- Below, Below, None, None,
- None, None, Post, Above,
-
- Post, Below, Below, Below,
- None, None, None, Pre,
- Split, None, None, Split,
- Split, None, None, None,
-
- None, None, None, None,
- None, None, Above, Post,
- None, None, None, None,
- None, None, None, Post,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, Below, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- // Tamil
- None, None, Above, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, Post, Post,
-
- Above, Below, Below, None,
- None, None, Pre, Pre,
- Pre, None, Split, Split,
- Split, Halant, None, None,
-
- None, None, None, None,
- None, None, None, Post,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- // Telugu
- None, Post, Post, Post,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, Below, Below, Below,
- Below, Below, Below, Below,
- Below, Below, Below, Below,
-
- Below, Below, Below, Below,
- Below, Below, Below, Below,
- Below, None, Below, Below,
- Below, Below, Below, Below,
-
- Below, None, Below, Below,
- None, Below, Below, Below,
- Below, Below, None, None,
- None, None, Post, Above,
-
- Above, Post, Post, Post,
- Post, None, Above, Above,
- Split, None, Post, Above,
- Above, Halant, None, None,
-
- None, None, None, None,
- None, Above, Below, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- // Kannada
- None, None, Post, Post,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, Below, Below, Below,
- Below, Below, Below, Below,
- Below, Below, Below, Below,
-
- Below, Below, Below, Below,
- Below, Below, Below, Below,
- Below, Below, Below, Below,
- Below, Below, Below, Below,
-
- Below, None, Below, Below,
- None, Below, Below, Below,
- Below, Below, None, None,
- None, None, Post, Above,
-
- Split, Post, Post, Post,
- Post, None, Above, Split,
- Split, None, Split, Split,
- Above, Halant, None, None,
-
- None, None, None, None,
- None, Post, Post, None,
- None, None, None, None,
- None, None, Below, None,
-
- None, None, Below, Below,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- // Malayalam
- None, None, Post, Post,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, Post,
-
- Pre, None, Below, None,
- None, Post, None, None,
- None, None, None, None,
- None, None, Post, Post,
-
- Post, Post, Post, Post,
- None, None, Pre, Pre,
- Pre, None, Split, Split,
- Split, Halant, None, None,
-
- None, None, None, None,
- None, None, None, Post,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- // Sinhala
- None, None, Post, Post,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, Post,
-
- Post, Post, Above, Above,
- Below, None, Below, None,
- Post, Pre, Split, Pre,
- Split, Split, Split, Post,
-
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None,
-
- None, None, Post, Post,
- None, None, None, None,
- None, None, None, None,
- None, None, None, None
-};
-
-static inline Form form(unsigned short uc) {
- if (uc < 0x900 || uc > 0xdff) {
- if (uc == 0x25cc)
- return Consonant;
- if (uc == 0x200c || uc == 0x200d)
- return Control;
- return Other;
- }
- return (Form)indicForms[uc-0x900];
-}
-
-static inline Position indic_position(unsigned short uc) {
- if (uc < 0x900 || uc > 0xdff)
- return None;
- return (Position) indicPosition[uc-0x900];
-}
-
-
-enum IndicScriptProperties {
- HasReph = 0x01,
- HasSplit = 0x02
-};
-
-const hb_uint8 scriptProperties[10] = {
- // Devanagari,
- HasReph,
- // Bengali,
- HasReph|HasSplit,
- // Gurmukhi,
- 0,
- // Gujarati,
- HasReph,
- // Oriya,
- HasReph|HasSplit,
- // Tamil,
- HasSplit,
- // Telugu,
- HasSplit,
- // Kannada,
- HasSplit|HasReph,
- // Malayalam,
- HasSplit,
- // Sinhala,
- HasSplit
-};
-
-struct IndicOrdering {
- Form form;
- Position position;
-};
-
-static const IndicOrdering devanagari_order [] = {
- { Consonant, Below },
- { Matra, Below },
- { VowelMark, Below },
- { StressMark, Below },
- { Matra, Above },
- { Matra, Post },
- { Consonant, Reph },
- { VowelMark, Above },
- { StressMark, Above },
- { VowelMark, Post },
- { (Form)0, None }
-};
-
-static const IndicOrdering bengali_order [] = {
- { Consonant, Below },
- { Matra, Below },
- { Matra, Above },
- { Consonant, Reph },
- { VowelMark, Above },
- { Consonant, Post },
- { Matra, Post },
- { VowelMark, Post },
- { (Form)0, None }
-};
-
-static const IndicOrdering gurmukhi_order [] = {
- { Consonant, Below },
- { Matra, Below },
- { Matra, Above },
- { Consonant, Post },
- { Matra, Post },
- { VowelMark, Above },
- { (Form)0, None }
-};
-
-static const IndicOrdering tamil_order [] = {
- { Matra, Above },
- { Matra, Post },
- { VowelMark, Post },
- { (Form)0, None }
-};
-
-static const IndicOrdering telugu_order [] = {
- { Matra, Above },
- { Matra, Below },
- { Matra, Post },
- { Consonant, Below },
- { Consonant, Post },
- { VowelMark, Post },
- { (Form)0, None }
-};
-
-static const IndicOrdering kannada_order [] = {
- { Matra, Above },
- { Matra, Post },
- { Consonant, Below },
- { Consonant, Post },
- { LengthMark, Post },
- { Consonant, Reph },
- { VowelMark, Post },
- { (Form)0, None }
-};
-
-static const IndicOrdering malayalam_order [] = {
- { Consonant, Below },
- { Matra, Below },
- { Consonant, Reph },
- { Consonant, Post },
- { Matra, Post },
- { VowelMark, Post },
- { (Form)0, None }
-};
-
-static const IndicOrdering sinhala_order [] = {
- { Matra, Below },
- { Matra, Above },
- { Matra, Post },
- { VowelMark, Post },
- { (Form)0, None }
-};
-
-static const IndicOrdering * const indic_order[] = {
- devanagari_order, // Devanagari
- bengali_order, // Bengali
- gurmukhi_order, // Gurmukhi
- devanagari_order, // Gujarati
- bengali_order, // Oriya
- tamil_order, // Tamil
- telugu_order, // Telugu
- kannada_order, // Kannada
- malayalam_order, // Malayalam
- sinhala_order // Sinhala
-};
-
-
-
-// vowel matras that have to be split into two parts.
-static const unsigned short split_matras[] = {
- // matra, split1, split2, split3
-
- // bengalis
- 0x9cb, 0x9c7, 0x9be, 0x0,
- 0x9cc, 0x9c7, 0x9d7, 0x0,
- // oriya
- 0xb48, 0xb47, 0xb56, 0x0,
- 0xb4b, 0xb47, 0xb3e, 0x0,
- 0xb4c, 0xb47, 0xb57, 0x0,
- // tamil
- 0xbca, 0xbc6, 0xbbe, 0x0,
- 0xbcb, 0xbc7, 0xbbe, 0x0,
- 0xbcc, 0xbc6, 0xbd7, 0x0,
- // telugu
- 0xc48, 0xc46, 0xc56, 0x0,
- // kannada
- 0xcc0, 0xcbf, 0xcd5, 0x0,
- 0xcc7, 0xcc6, 0xcd5, 0x0,
- 0xcc8, 0xcc6, 0xcd6, 0x0,
- 0xcca, 0xcc6, 0xcc2, 0x0,
- 0xccb, 0xcc6, 0xcc2, 0xcd5,
- // malayalam
- 0xd4a, 0xd46, 0xd3e, 0x0,
- 0xd4b, 0xd47, 0xd3e, 0x0,
- 0xd4c, 0xd46, 0xd57, 0x0,
- // sinhala
- 0xdda, 0xdd9, 0xdca, 0x0,
- 0xddc, 0xdd9, 0xdcf, 0x0,
- 0xddd, 0xdd9, 0xdcf, 0xdca,
- 0xdde, 0xdd9, 0xddf, 0x0,
- 0xffff
-};
-
-static inline void splitMatra(unsigned short *reordered, int matra, int &len)
-{
- unsigned short matra_uc = reordered[matra];
- //qDebug("matra=%d, reordered[matra]=%x", matra, reordered[matra]);
-
- const unsigned short *split = split_matras;
- while (split[0] < matra_uc)
- split += 4;
-
- assert(*split == matra_uc);
- ++split;
-
- int added_chars = split[2] == 0x0 ? 1 : 2;
-
- memmove(reordered + matra + added_chars, reordered + matra, (len-matra)*sizeof(unsigned short));
- reordered[matra] = split[0];
- reordered[matra+1] = split[1];
- if(added_chars == 2)
- reordered[matra+2] = split[2];
- len += added_chars;
-}
-
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature indic_features[] = {
- { HB_MAKE_TAG('l', 'o', 'c', 'a'), LocaProperty },
- { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
- { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty },
- { HB_MAKE_TAG('n', 'u', 'k', 't'), NuktaProperty },
- { HB_MAKE_TAG('a', 'k', 'h', 'n'), AkhantProperty },
- { HB_MAKE_TAG('r', 'p', 'h', 'f'), RephProperty },
- { HB_MAKE_TAG('b', 'l', 'w', 'f'), BelowFormProperty },
- { HB_MAKE_TAG('h', 'a', 'l', 'f'), HalfFormProperty },
- { HB_MAKE_TAG('p', 's', 't', 'f'), PostFormProperty },
- { HB_MAKE_TAG('c', 'j', 'c', 't'), ConjunctFormProperty },
- { HB_MAKE_TAG('v', 'a', 't', 'u'), VattuProperty },
- { HB_MAKE_TAG('p', 'r', 'e', 's'), PreSubstProperty },
- { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty },
- { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty },
- { HB_MAKE_TAG('p', 's', 't', 's'), PostSubstProperty },
- { HB_MAKE_TAG('h', 'a', 'l', 'n'), HalantProperty },
- { HB_MAKE_TAG('c', 'a', 'l', 't'), IndicCaltProperty },
- { 0, 0 }
-};
-#endif
-
-// #define INDIC_DEBUG
-#ifdef INDIC_DEBUG
-#define IDEBUG hb_debug
-#include <stdarg.h>
-
-static void hb_debug(const char *msg, ...)
-{
- va_list ap;
- va_start(ap, msg); // use variable arg list
- vfprintf(stderr, msg, ap);
- va_end(ap);
- fprintf(stderr, "\n");
-}
-
-#else
-#define IDEBUG if(0) printf
-#endif
-
-#if 0 //def INDIC_DEBUG
-static QString propertiesToString(int properties)
-{
- QString res;
- properties = ~properties;
- if (properties & LocaProperty)
- res += "Loca ";
- if (properties & CcmpProperty)
- res += "Ccmp ";
- if (properties & InitProperty)
- res += "Init ";
- if (properties & NuktaProperty)
- res += "Nukta ";
- if (properties & AkhantProperty)
- res += "Akhant ";
- if (properties & RephProperty)
- res += "Reph ";
- if (properties & PreFormProperty)
- res += "PreForm ";
- if (properties & BelowFormProperty)
- res += "BelowForm ";
- if (properties & AboveFormProperty)
- res += "AboveForm ";
- if (properties & HalfFormProperty)
- res += "HalfForm ";
- if (properties & PostFormProperty)
- res += "PostForm ";
- if (properties & ConjunctFormProperty)
- res += "PostForm ";
- if (properties & VattuProperty)
- res += "Vattu ";
- if (properties & PreSubstProperty)
- res += "PreSubst ";
- if (properties & BelowSubstProperty)
- res += "BelowSubst ";
- if (properties & AboveSubstProperty)
- res += "AboveSubst ";
- if (properties & PostSubstProperty)
- res += "PostSubst ";
- if (properties & HalantProperty)
- res += "Halant ";
- if (properties & CligProperty)
- res += "Clig ";
- if (properties & IndicCaltProperty)
- res += "Calt ";
- return res;
-}
-#endif
-
-static bool indic_shape_syllable(HB_Bool openType, HB_ShaperItem *item, bool invalid)
-{
- HB_Script script = item->item.script;
- assert(script >= HB_Script_Devanagari && script <= HB_Script_Sinhala);
- const unsigned short script_base = 0x0900 + 0x80*(script-HB_Script_Devanagari);
- const unsigned short ra = script_base + 0x30;
- const unsigned short halant = script_base + 0x4d;
- const unsigned short nukta = script_base + 0x3c;
- bool control = false;
-
- int len = (int)item->item.length;
- IDEBUG(">>>>> indic shape: from=%d, len=%d invalid=%d", item->item.pos, item->item.length, invalid);
-
- if ((int)item->num_glyphs < len+4) {
- item->num_glyphs = len+4;
- return false;
- }
-
- HB_STACKARRAY(HB_UChar16, reordered, len + 4);
- HB_STACKARRAY(hb_uint8, position, len + 4);
-
- unsigned char properties = scriptProperties[script-HB_Script_Devanagari];
-
- if (invalid) {
- *reordered = 0x25cc;
- memcpy(reordered+1, item->string + item->item.pos, len*sizeof(HB_UChar16));
- len++;
- } else {
- memcpy(reordered, item->string + item->item.pos, len*sizeof(HB_UChar16));
- }
- if (reordered[len-1] == 0x200c) // zero width non joiner
- len--;
-
- int i;
- int base = 0;
- int reph = -1;
-
-#ifdef INDIC_DEBUG
- IDEBUG("original:");
- for (i = 0; i < len; i++) {
- IDEBUG(" %d: %4x", i, reordered[i]);
- }
-#endif
-
- if (len != 1) {
- HB_UChar16 *uc = reordered;
- bool beginsWithRa = false;
-
- // Rule 1: find base consonant
- //
- // The shaping engine finds the base consonant of the
- // syllable, using the following algorithm: starting from the
- // end of the syllable, move backwards until a consonant is
- // found that does not have a below-base or post-base form
- // (post-base forms have to follow below-base forms), or
- // arrive at the first consonant. The consonant stopped at
- // will be the base.
- //
- // * If the syllable starts with Ra + H (in a script that has
- // 'Reph'), Ra is excluded from candidates for base
- // consonants.
- //
- // * In Kannada and Telugu, the base consonant cannot be
- // farther than 3 consonants from the end of the syllable.
- // #### replace the HasReph property by testing if the feature exists in the font!
- if (form(*uc) == Consonant || (script == HB_Script_Bengali && form(*uc) == IndependentVowel)) {
- if ((properties & HasReph) && (len > 2) &&
- (*uc == ra || *uc == 0x9f0) && *(uc+1) == halant)
- beginsWithRa = true;
-
- if (beginsWithRa && form(*(uc+2)) == Control)
- beginsWithRa = false;
-
- base = (beginsWithRa ? 2 : 0);
- IDEBUG(" length = %d, beginsWithRa = %d, base=%d", len, beginsWithRa, base);
-
- int lastConsonant = 0;
- int matra = -1;
- // we remember:
- // * the last consonant since we need it for rule 2
- // * the matras position for rule 3 and 4
-
- // figure out possible base glyphs
- memset(position, 0, len);
- if (script == HB_Script_Devanagari || script == HB_Script_Gujarati) {
- bool vattu = false;
- for (i = base; i < len; ++i) {
- position[i] = form(uc[i]);
- if (position[i] == Consonant) {
- lastConsonant = i;
- vattu = (!vattu && uc[i] == ra);
- if (vattu) {
- IDEBUG("excluding vattu glyph at %d from base candidates", i);
- position[i] = Vattu;
- }
- } else if (position[i] == Matra) {
- matra = i;
- }
- }
- } else {
- for (i = base; i < len; ++i) {
- position[i] = form(uc[i]);
- if (position[i] == Consonant)
- lastConsonant = i;
- else if (matra < 0 && position[i] == Matra)
- matra = i;
- }
- }
- int skipped = 0;
- Position pos = Post;
- for (i = len-1; i >= base; i--) {
- if (position[i] != Consonant && (position[i] != Control || script == HB_Script_Kannada))
- continue;
-
- if (i < len-1 && position[i] == Control && position[i+1] == Consonant) {
- base = i+1;
- break;
- }
-
- Position charPosition = indic_position(uc[i]);
- if (pos == Post && charPosition == Post) {
- pos = Post;
- } else if ((pos == Post || pos == Below) && charPosition == Below) {
- if (script == HB_Script_Devanagari || script == HB_Script_Gujarati)
- base = i;
- pos = Below;
- } else {
- base = i;
- break;
- }
- if (skipped == 2 && (script == HB_Script_Kannada || script == HB_Script_Telugu)) {
- base = i;
- break;
- }
- ++skipped;
- }
-
- IDEBUG(" base consonant at %d skipped=%d, lastConsonant=%d", base, skipped, lastConsonant);
-
- // Rule 2:
- //
- // If the base consonant is not the last one, Uniscribe
- // moves the halant from the base consonant to the last
- // one.
- if (lastConsonant > base) {
- int halantPos = 0;
- if (uc[base+1] == halant)
- halantPos = base + 1;
- else if (uc[base+1] == nukta && uc[base+2] == halant)
- halantPos = base + 2;
- if (halantPos > 0) {
- IDEBUG(" moving halant from %d to %d!", base+1, lastConsonant);
- for (i = halantPos; i < lastConsonant; i++)
- uc[i] = uc[i+1];
- uc[lastConsonant] = halant;
- }
- }
-
- // Rule 3:
- //
- // If the syllable starts with Ra + H, Uniscribe moves
- // this combination so that it follows either:
-
- // * the post-base 'matra' (if any) or the base consonant
- // (in scripts that show similarity to Devanagari, i.e.,
- // Devanagari, Gujarati, Bengali)
- // * the base consonant (other scripts)
- // * the end of the syllable (Kannada)
-
- Position matra_position = None;
- if (matra > 0)
- matra_position = indic_position(uc[matra]);
- IDEBUG(" matra at %d with form %d, base=%d", matra, matra_position, base);
-
- if (beginsWithRa && base != 0) {
- int toPos = base+1;
- if (toPos < len && uc[toPos] == nukta)
- toPos++;
- if (toPos < len && uc[toPos] == halant)
- toPos++;
- if (toPos < len && uc[toPos] == 0x200d)
- toPos++;
- if (toPos < len-1 && uc[toPos] == ra && uc[toPos+1] == halant)
- toPos += 2;
- if (script == HB_Script_Devanagari || script == HB_Script_Gujarati || script == HB_Script_Bengali) {
- if (matra_position == Post || matra_position == Split) {
- toPos = matra+1;
- matra -= 2;
- }
- } else if (script == HB_Script_Kannada) {
- toPos = len;
- matra -= 2;
- }
-
- IDEBUG("moving leading ra+halant to position %d", toPos);
- for (i = 2; i < toPos; i++)
- uc[i-2] = uc[i];
- uc[toPos-2] = ra;
- uc[toPos-1] = halant;
- base -= 2;
- if (properties & HasReph)
- reph = toPos-2;
- }
-
- // Rule 4:
-
- // Uniscribe splits two- or three-part matras into their
- // parts. This splitting is a character-to-character
- // operation).
- //
- // Uniscribe describes some moving operations for these
- // matras here. For shaping however all pre matras need
- // to be at the beginning of the syllable, so we just move
- // them there now.
- if (matra_position == Split) {
- splitMatra(uc, matra, len);
- // Handle three-part matras (0xccb in Kannada)
- matra_position = indic_position(uc[matra]);
- }
-
- if (matra_position == Pre) {
- unsigned short m = uc[matra];
- while (matra--)
- uc[matra+1] = uc[matra];
- uc[0] = m;
- base++;
- }
- }
-
- // Rule 5:
- //
- // Uniscribe classifies consonants and 'matra' parts as
- // pre-base, above-base (Reph), below-base or post-base. This
- // classification exists on the character code level and is
- // language-dependent, not font-dependent.
- for (i = 0; i < base; ++i)
- position[i] = Pre;
- position[base] = Base;
- for (i = base+1; i < len; ++i) {
- position[i] = indic_position(uc[i]);
- // #### replace by adjusting table
- if (uc[i] == nukta || uc[i] == halant)
- position[i] = Inherit;
- }
- if (reph > 0) {
- // recalculate reph, it might have changed.
- for (i = base+1; i < len; ++i)
- if (uc[i] == ra)
- reph = i;
- position[reph] = Reph;
- position[reph+1] = Inherit;
- }
-
- // all reordering happens now to the chars after the base
- int fixed = base+1;
- if (fixed < len && uc[fixed] == nukta)
- fixed++;
- if (fixed < len && uc[fixed] == halant)
- fixed++;
- if (fixed < len && uc[fixed] == 0x200d)
- fixed++;
-
-#ifdef INDIC_DEBUG
- for (i = fixed; i < len; ++i)
- IDEBUG("position[%d] = %d, form=%d uc=%x", i, position[i], form(uc[i]), uc[i]);
-#endif
- // we continuosly position the matras and vowel marks and increase the fixed
- // until we reached the end.
- const IndicOrdering *finalOrder = indic_order[script-HB_Script_Devanagari];
-
- IDEBUG(" reordering pass:");
- IDEBUG(" base=%d fixed=%d", base, fixed);
- int toMove = 0;
- while (finalOrder[toMove].form && fixed < len-1) {
- IDEBUG(" fixed = %d, toMove=%d, moving form %d with pos %d", fixed, toMove, finalOrder[toMove].form, finalOrder[toMove].position);
- for (i = fixed; i < len; i++) {
-// IDEBUG() << " i=" << i << "uc=" << Qt::hex << uc[i] << "form=" << form(uc[i])
-// << "position=" << position[i];
- if (form(uc[i]) == finalOrder[toMove].form &&
- position[i] == finalOrder[toMove].position) {
- // need to move this glyph
- int to = fixed;
- if (i < len-1 && position[i+1] == Inherit) {
- IDEBUG(" moving two chars from %d to %d", i, to);
- unsigned short ch = uc[i];
- unsigned short ch2 = uc[i+1];
- unsigned char pos = position[i];
- for (int j = i+1; j > to+1; j--) {
- uc[j] = uc[j-2];
- position[j] = position[j-2];
- }
- uc[to] = ch;
- uc[to+1] = ch2;
- position[to] = pos;
- position[to+1] = pos;
- fixed += 2;
- } else {
- IDEBUG(" moving one char from %d to %d", i, to);
- unsigned short ch = uc[i];
- unsigned char pos = position[i];
- for (int j = i; j > to; j--) {
- uc[j] = uc[j-1];
- position[j] = position[j-1];
- }
- uc[to] = ch;
- position[to] = pos;
- fixed++;
- }
- }
- }
- toMove++;
- }
-
- }
-
- if (reph > 0) {
- // recalculate reph, it might have changed.
- for (i = base+1; i < len; ++i)
- if (reordered[i] == ra)
- reph = i;
- }
-
-#ifndef NO_OPENTYPE
- const int availableGlyphs = item->num_glyphs;
-#endif
- if (!item->font->klass->convertStringToGlyphIndices(item->font,
- reordered, len,
- item->glyphs, &item->num_glyphs,
- item->item.bidiLevel % 2))
- goto error;
-
-
- IDEBUG(" base=%d, reph=%d", base, reph);
- IDEBUG("reordered:");
- for (i = 0; i < len; i++) {
- item->attributes[i].mark = false;
- item->attributes[i].clusterStart = false;
- item->attributes[i].justification = 0;
- item->attributes[i].zeroWidth = false;
- IDEBUG(" %d: %4x", i, reordered[i]);
- }
-
- // now we have the syllable in the right order, and can start running it through open type.
-
- for (i = 0; i < len; ++i)
- control |= (form(reordered[i]) == Control);
-
-#ifndef NO_OPENTYPE
- if (openType) {
-
- // we need to keep track of where the base glyph is for some
- // scripts and use the cluster feature for this. This
- // also means we have to correct the logCluster output from
- // the open type engine manually afterwards. for indic this
- // is rather simple, as all chars just point to the first
- // glyph in the syllable.
- HB_STACKARRAY(unsigned short, clusters, len);
- HB_STACKARRAY(unsigned int, properties, len);
-
- for (i = 0; i < len; ++i)
- clusters[i] = i;
-
- // features we should always apply
- for (i = 0; i < len; ++i)
- properties[i] = ~(LocaProperty
- | CcmpProperty
- | NuktaProperty
- | VattuProperty
- | ConjunctFormProperty
- | PreSubstProperty
- | BelowSubstProperty
- | AboveSubstProperty
- | PostSubstProperty
- | HalantProperty
- | IndicCaltProperty
- | PositioningProperties);
-
- // Loca always applies
- // Ccmp always applies
- // Init
- if (item->item.pos == 0
- || !(isLetter(item->string[item->item.pos-1]) || isMark(item->string[item->item.pos-1])))
- properties[0] &= ~InitProperty;
-
- // Nukta always applies
- // Akhant
- for (i = 0; i <= base; ++i)
- properties[i] &= ~AkhantProperty;
- // Reph
- if (reph >= 0) {
- properties[reph] &= ~RephProperty;
- properties[reph+1] &= ~RephProperty;
- }
- // BelowForm
- for (i = base+1; i < len; ++i)
- properties[i] &= ~BelowFormProperty;
-
- if (script == HB_Script_Devanagari || script == HB_Script_Gujarati) {
- // vattu glyphs need this aswell
- bool vattu = false;
- for (i = base-2; i > 1; --i) {
- if (form(reordered[i]) == Consonant) {
- vattu = (!vattu && reordered[i] == ra);
- if (vattu) {
- IDEBUG("forming vattu ligature at %d", i);
- properties[i] &= ~BelowFormProperty;
- properties[i+1] &= ~BelowFormProperty;
- }
- }
- }
- }
- // HalfFormProperty
- for (i = 0; i < base; ++i)
- properties[i] &= ~HalfFormProperty;
- if (control) {
- for (i = 2; i < len; ++i) {
- if (reordered[i] == 0x200d /* ZWJ */) {
- properties[i-1] &= ~HalfFormProperty;
- properties[i-2] &= ~HalfFormProperty;
- } else if (reordered[i] == 0x200c /* ZWNJ */) {
- properties[i-1] &= ~HalfFormProperty;
- properties[i-2] &= ~HalfFormProperty;
- }
- }
- }
- // PostFormProperty
- for (i = base+1; i < len; ++i)
- properties[i] &= ~PostFormProperty;
- // vattu always applies
- // pres always applies
- // blws always applies
- // abvs always applies
- // psts always applies
- // halant always applies
- // calt always applies
-
-#ifdef INDIC_DEBUG
-// {
-// IDEBUG("OT properties:");
-// for (int i = 0; i < len; ++i)
-// qDebug(" i: %s", ::propertiesToString(properties[i]).toLatin1().data());
-// }
-#endif
-
- // initialize
- item->log_clusters = clusters;
- HB_OpenTypeShape(item, properties);
-
- int newLen = item->face->buffer->in_length;
- HB_GlyphItem otl_glyphs = item->face->buffer->in_string;
-
- // move the left matra back to its correct position in malayalam and tamil
- if ((script == HB_Script_Malayalam || script == HB_Script_Tamil) && (form(reordered[0]) == Matra)) {
-// qDebug("reordering matra, len=%d", newLen);
- // need to find the base in the shaped string and move the matra there
- int basePos = 0;
- while (basePos < newLen && (int)otl_glyphs[basePos].cluster <= base)
- basePos++;
- --basePos;
- if (basePos < newLen && basePos > 1) {
-// qDebug("moving prebase matra to position %d in syllable newlen=%d", basePos, newLen);
- HB_GlyphItemRec m = otl_glyphs[0];
- --basePos;
- for (i = 0; i < basePos; ++i)
- otl_glyphs[i] = otl_glyphs[i+1];
- otl_glyphs[basePos] = m;
- }
- }
-
- HB_Bool positioned = HB_OpenTypePosition(item, availableGlyphs, false);
-
- HB_FREE_STACKARRAY(clusters);
- HB_FREE_STACKARRAY(properties);
-
- if (!positioned)
- goto error;
-
- if (control) {
- IDEBUG("found a control char in the syllable");
- hb_uint32 i = 0, j = 0;
- while (i < item->num_glyphs) {
- if (form(reordered[otl_glyphs[i].cluster]) == Control) {
- ++i;
- if (i >= item->num_glyphs)
- break;
- }
- item->glyphs[j] = item->glyphs[i];
- item->attributes[j] = item->attributes[i];
- item->offsets[j] = item->offsets[i];
- item->advances[j] = item->advances[i];
- ++i;
- ++j;
- }
- item->num_glyphs = j;
- }
-
- } else {
- HB_HeuristicPosition(item);
- }
-#endif // NO_OPENTYPE
- item->attributes[0].clusterStart = true;
-
- HB_FREE_STACKARRAY(reordered);
- HB_FREE_STACKARRAY(position);
-
- IDEBUG("<<<<<<");
- return true;
-
-error:
- HB_FREE_STACKARRAY(reordered);
- HB_FREE_STACKARRAY(position);
- return false;
-}
-
-/* syllables are of the form:
-
- (Consonant Nukta? Halant)* Consonant Matra? VowelMark? StressMark?
- (Consonant Nukta? Halant)* Consonant Halant
- IndependentVowel VowelMark? StressMark?
-
- We return syllable boundaries on invalid combinations aswell
-*/
-static int indic_nextSyllableBoundary(HB_Script script, const HB_UChar16 *s, int start, int end, bool *invalid)
-{
- *invalid = false;
- IDEBUG("indic_nextSyllableBoundary: start=%d, end=%d", start, end);
- const HB_UChar16 *uc = s+start;
-
- int pos = 0;
- Form state = form(uc[pos]);
- IDEBUG("state[%d]=%d (uc=%4x)", pos, state, uc[pos]);
- pos++;
-
- if (state != Consonant && state != IndependentVowel) {
- if (state != Other)
- *invalid = true;
- goto finish;
- }
-
- while (pos < end - start) {
- Form newState = form(uc[pos]);
- IDEBUG("state[%d]=%d (uc=%4x)", pos, newState, uc[pos]);
- switch(newState) {
- case Control:
- newState = state;
- if (state == Halant && uc[pos] == 0x200d /* ZWJ */)
- break;
- // the control character should be the last char in the item
- if (state == Consonant && script == HB_Script_Bengali && uc[pos-1] == 0x09B0 && uc[pos] == 0x200d /* ZWJ */)
- break;
- if (state == Consonant && script == HB_Script_Kannada && uc[pos-1] == 0x0CB0 && uc[pos] == 0x200d /* ZWJ */)
- break;
- // Bengali and Kannada has a special exception for rendering yaphala with ra (to avoid reph) see http://www.unicode.org/faq/indic.html#15
- ++pos;
- goto finish;
- case Consonant:
- if (state == Halant && (script != HB_Script_Sinhala || uc[pos-1] == 0x200d /* ZWJ */))
- break;
- goto finish;
- case Halant:
- if (state == Nukta || state == Consonant)
- break;
- // Bengali has a special exception allowing the combination Vowel_A/E + Halant + Ya
- if (script == HB_Script_Bengali && pos == 1 &&
- (uc[0] == 0x0985 || uc[0] == 0x098f))
- break;
- // Sinhala uses the Halant as a component of certain matras. Allow these, but keep the state on Matra.
- if (script == HB_Script_Sinhala && state == Matra) {
- ++pos;
- continue;
- }
- if (script == HB_Script_Malayalam && state == Matra && uc[pos-1] == 0x0d41) {
- ++pos;
- continue;
- }
- goto finish;
- case Nukta:
- if (state == Consonant)
- break;
- goto finish;
- case StressMark:
- if (state == VowelMark)
- break;
- // fall through
- case VowelMark:
- if (state == Matra || state == LengthMark || state == IndependentVowel)
- break;
- // fall through
- case Matra:
- if (state == Consonant || state == Nukta)
- break;
- if (state == Matra) {
- // ### needs proper testing for correct two/three part matras
- break;
- }
- // ### not sure if this is correct. If it is, does it apply only to Bengali or should
- // it work for all Indic languages?
- // the combination Independent_A + Vowel Sign AA is allowed.
- if (script == HB_Script_Bengali && uc[pos] == 0x9be && uc[pos-1] == 0x985)
- break;
- if (script == HB_Script_Tamil && state == Matra) {
- if (uc[pos-1] == 0x0bc6 &&
- (uc[pos] == 0xbbe || uc[pos] == 0xbd7))
- break;
- if (uc[pos-1] == 0x0bc7 && uc[pos] == 0xbbe)
- break;
- }
- goto finish;
-
- case LengthMark:
- if (state == Matra) {
- // ### needs proper testing for correct two/three part matras
- break;
- }
- case IndependentVowel:
- case Invalid:
- case Other:
- goto finish;
- }
- state = newState;
- pos++;
- }
- finish:
- return pos+start;
-}
-
-HB_Bool HB_IndicShape(HB_ShaperItem *item)
-{
- assert(item->item.script >= HB_Script_Devanagari && item->item.script <= HB_Script_Sinhala);
-
- HB_Bool openType = false;
-#ifndef NO_OPENTYPE
- openType = HB_SelectScript(item, indic_features);
-#endif
- unsigned short *logClusters = item->log_clusters;
-
- HB_ShaperItem syllable = *item;
- int first_glyph = 0;
-
- int sstart = item->item.pos;
- int end = sstart + item->item.length;
- IDEBUG("indic_shape: from %d length %d", item->item.pos, item->item.length);
- while (sstart < end) {
- bool invalid;
- int send = indic_nextSyllableBoundary(item->item.script, item->string, sstart, end, &invalid);
- IDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart,
- invalid ? "true" : "false");
- syllable.item.pos = sstart;
- syllable.item.length = send-sstart;
- syllable.glyphs = item->glyphs + first_glyph;
- syllable.attributes = item->attributes + first_glyph;
- syllable.offsets = item->offsets + first_glyph;
- syllable.advances = item->advances + first_glyph;
- syllable.num_glyphs = item->num_glyphs - first_glyph;
- if (!indic_shape_syllable(openType, &syllable, invalid)) {
- IDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs);
- item->num_glyphs += syllable.num_glyphs;
- return false;
- }
- // fix logcluster array
- IDEBUG("syllable:");
- hb_uint32 g;
- for (g = first_glyph; g < first_glyph + syllable.num_glyphs; ++g)
- IDEBUG(" %d -> glyph %x", g, item->glyphs[g]);
- IDEBUG(" logclusters:");
- int i;
- for (i = sstart; i < send; ++i) {
- IDEBUG(" %d -> glyph %d", i, first_glyph);
- logClusters[i-item->item.pos] = first_glyph;
- }
- sstart = send;
- first_glyph += syllable.num_glyphs;
- }
- item->num_glyphs = first_glyph;
- return true;
-}
-
-void HB_IndicAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes)
-{
- int end = from + len;
- const HB_UChar16 *uc = text + from;
- attributes += from;
- hb_uint32 i = 0;
- while (i < len) {
- bool invalid;
- hb_uint32 boundary = indic_nextSyllableBoundary(script, text, from+i, end, &invalid) - from;
- attributes[i].graphemeBoundary = true;
-
- if (boundary > len-1) boundary = len;
- i++;
- while (i < boundary) {
- attributes[i].graphemeBoundary = false;
- ++uc;
- ++i;
- }
- assert(i == boundary);
- }
-
-
-}
-
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-khmer.c b/src/3rdparty/harfbuzz/src/harfbuzz-khmer.c
deleted file mode 100644
index 809a55b863..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-khmer.c
+++ /dev/null
@@ -1,667 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-/*
-// Vocabulary
-// Base -> A consonant or an independent vowel in its full (not subscript) form. It is the
-// center of the syllable, it can be surrounded by coeng (subscript) consonants, vowels,
-// split vowels, signs... but there is only one base in a syllable, it has to be coded as
-// the first character of the syllable.
-// split vowel --> vowel that has two parts placed separately (e.g. Before and after the consonant).
-// Khmer language has five of them. Khmer split vowels either have one part before the
-// base and one after the base or they have a part before the base and a part above the base.
-// The first part of all Khmer split vowels is the same character, identical to
-// the glyph of Khmer dependent vowel SRA EI
-// coeng --> modifier used in Khmer to construct coeng (subscript) consonants
-// Differently than indian languages, the coeng modifies the consonant that follows it,
-// not the one preceding it Each consonant has two forms, the base form and the subscript form
-// the base form is the normal one (using the consonants code-point), the subscript form is
-// displayed when the combination coeng + consonant is encountered.
-// Consonant of type 1 -> A consonant which has subscript for that only occupies space under a base consonant
-// Consonant of type 2.-> Its subscript form occupies space under and before the base (only one, RO)
-// Consonant of Type 3 -> Its subscript form occupies space under and after the base (KHO, CHHO, THHO, BA, YO, SA)
-// Consonant shifter -> Khmer has to series of consonants. The same dependent vowel has different sounds
-// if it is attached to a consonant of the first series or a consonant of the second series
-// Most consonants have an equivalent in the other series, but some of theme exist only in
-// one series (for example SA). If we want to use the consonant SA with a vowel sound that
-// can only be done with a vowel sound that corresponds to a vowel accompanying a consonant
-// of the other series, then we need to use a consonant shifter: TRIISAP or MUSIKATOAN
-// x17C9 y x17CA. TRIISAP changes a first series consonant to second series sound and
-// MUSIKATOAN a second series consonant to have a first series vowel sound.
-// Consonant shifter are both normally supercript marks, but, when they are followed by a
-// superscript, they change shape and take the form of subscript dependent vowel SRA U.
-// If they are in the same syllable as a coeng consonant, Unicode 3.0 says that they
-// should be typed before the coeng. Unicode 4.0 breaks the standard and says that it should
-// be placed after the coeng consonant.
-// Dependent vowel -> In khmer dependent vowels can be placed above, below, before or after the base
-// Each vowel has its own position. Only one vowel per syllable is allowed.
-// Signs -> Khmer has above signs and post signs. Only one above sign and/or one post sign are
-// Allowed in a syllable.
-//
-//
-// order is important here! This order must be the same that is found in each horizontal
-// line in the statetable for Khmer (see khmerStateTable) .
-*/
-enum KhmerCharClassValues {
- CC_RESERVED = 0,
- CC_CONSONANT = 1, /* Consonant of type 1 or independent vowel */
- CC_CONSONANT2 = 2, /* Consonant of type 2 */
- CC_CONSONANT3 = 3, /* Consonant of type 3 */
- CC_ZERO_WIDTH_NJ_MARK = 4, /* Zero Width non joiner character (0x200C) */
- CC_CONSONANT_SHIFTER = 5,
- CC_ROBAT = 6, /* Khmer special diacritic accent -treated differently in state table */
- CC_COENG = 7, /* Subscript consonant combining character */
- CC_DEPENDENT_VOWEL = 8,
- CC_SIGN_ABOVE = 9,
- CC_SIGN_AFTER = 10,
- CC_ZERO_WIDTH_J_MARK = 11, /* Zero width joiner character */
- CC_COUNT = 12 /* This is the number of character classes */
-};
-
-
-enum KhmerCharClassFlags {
- CF_CLASS_MASK = 0x0000FFFF,
-
- CF_CONSONANT = 0x01000000, /* flag to speed up comparing */
- CF_SPLIT_VOWEL = 0x02000000, /* flag for a split vowel -> the first part is added in front of the syllable */
- CF_DOTTED_CIRCLE = 0x04000000, /* add a dotted circle if a character with this flag is the first in a syllable */
- CF_COENG = 0x08000000, /* flag to speed up comparing */
- CF_SHIFTER = 0x10000000, /* flag to speed up comparing */
- CF_ABOVE_VOWEL = 0x20000000, /* flag to speed up comparing */
-
- /* position flags */
- CF_POS_BEFORE = 0x00080000,
- CF_POS_BELOW = 0x00040000,
- CF_POS_ABOVE = 0x00020000,
- CF_POS_AFTER = 0x00010000,
- CF_POS_MASK = 0x000f0000
-};
-
-
-/* Characters that get referred to by name */
-enum KhmerChar {
- C_SIGN_ZWNJ = 0x200C,
- C_SIGN_ZWJ = 0x200D,
- C_RO = 0x179A,
- C_VOWEL_AA = 0x17B6,
- C_SIGN_NIKAHIT = 0x17C6,
- C_VOWEL_E = 0x17C1,
- C_COENG = 0x17D2
-};
-
-
-/*
-// simple classes, they are used in the statetable (in this file) to control the length of a syllable
-// they are also used to know where a character should be placed (location in reference to the base character)
-// and also to know if a character, when independently displayed, should be displayed with a dotted-circle to
-// indicate error in syllable construction
-*/
-enum {
- _xx = CC_RESERVED,
- _sa = CC_SIGN_ABOVE | CF_DOTTED_CIRCLE | CF_POS_ABOVE,
- _sp = CC_SIGN_AFTER | CF_DOTTED_CIRCLE| CF_POS_AFTER,
- _c1 = CC_CONSONANT | CF_CONSONANT,
- _c2 = CC_CONSONANT2 | CF_CONSONANT,
- _c3 = CC_CONSONANT3 | CF_CONSONANT,
- _rb = CC_ROBAT | CF_POS_ABOVE | CF_DOTTED_CIRCLE,
- _cs = CC_CONSONANT_SHIFTER | CF_DOTTED_CIRCLE | CF_SHIFTER,
- _dl = CC_DEPENDENT_VOWEL | CF_POS_BEFORE | CF_DOTTED_CIRCLE,
- _db = CC_DEPENDENT_VOWEL | CF_POS_BELOW | CF_DOTTED_CIRCLE,
- _da = CC_DEPENDENT_VOWEL | CF_POS_ABOVE | CF_DOTTED_CIRCLE | CF_ABOVE_VOWEL,
- _dr = CC_DEPENDENT_VOWEL | CF_POS_AFTER | CF_DOTTED_CIRCLE,
- _co = CC_COENG | CF_COENG | CF_DOTTED_CIRCLE,
-
- /* split vowel */
- _va = _da | CF_SPLIT_VOWEL,
- _vr = _dr | CF_SPLIT_VOWEL
-};
-
-
-/*
-// Character class: a character class value
-// ORed with character class flags.
-*/
-typedef unsigned long KhmerCharClass;
-
-
-/*
-// Character class tables
-// _xx character does not combine into syllable, such as numbers, puntuation marks, non-Khmer signs...
-// _sa Sign placed above the base
-// _sp Sign placed after the base
-// _c1 Consonant of type 1 or independent vowel (independent vowels behave as type 1 consonants)
-// _c2 Consonant of type 2 (only RO)
-// _c3 Consonant of type 3
-// _rb Khmer sign robat u17CC. combining mark for subscript consonants
-// _cd Consonant-shifter
-// _dl Dependent vowel placed before the base (left of the base)
-// _db Dependent vowel placed below the base
-// _da Dependent vowel placed above the base
-// _dr Dependent vowel placed behind the base (right of the base)
-// _co Khmer combining mark COENG u17D2, combines with the consonant or independent vowel following
-// it to create a subscript consonant or independent vowel
-// _va Khmer split vowel in which the first part is before the base and the second one above the base
-// _vr Khmer split vowel in which the first part is before the base and the second one behind (right of) the base
-*/
-static const KhmerCharClass khmerCharClasses[] = {
- _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, /* 1780 - 178F */
- _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c2, _c1, _c1, _c1, _c3, _c3, /* 1790 - 179F */
- _c1, _c3, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, /* 17A0 - 17AF */
- _c1, _c1, _c1, _c1, _dr, _dr, _dr, _da, _da, _da, _da, _db, _db, _db, _va, _vr, /* 17B0 - 17BF */
- _vr, _dl, _dl, _dl, _vr, _vr, _sa, _sp, _sp, _cs, _cs, _sa, _rb, _sa, _sa, _sa, /* 17C0 - 17CF */
- _sa, _sa, _co, _sa, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _sa, _xx, _xx /* 17D0 - 17DF */
-};
-
-/* this enum must reflect the range of khmerCharClasses */
-enum KhmerCharClassesRange {
- KhmerFirstChar = 0x1780,
- KhmerLastChar = 0x17df
-};
-
-/*
-// Below we define how a character in the input string is either in the khmerCharClasses table
-// (in which case we get its type back), a ZWJ or ZWNJ (two characters that may appear
-// within the syllable, but are not in the table) we also get their type back, or an unknown object
-// in which case we get _xx (CC_RESERVED) back
-*/
-static KhmerCharClass getKhmerCharClass(HB_UChar16 uc)
-{
- if (uc == C_SIGN_ZWJ) {
- return CC_ZERO_WIDTH_J_MARK;
- }
-
- if (uc == C_SIGN_ZWNJ) {
- return CC_ZERO_WIDTH_NJ_MARK;
- }
-
- if (uc < KhmerFirstChar || uc > KhmerLastChar) {
- return CC_RESERVED;
- }
-
- return khmerCharClasses[uc - KhmerFirstChar];
-}
-
-
-/*
-// The stateTable is used to calculate the end (the length) of a well
-// formed Khmer Syllable.
-//
-// Each horizontal line is ordered exactly the same way as the values in KhmerClassTable
-// CharClassValues. This coincidence of values allows the follow up of the table.
-//
-// Each line corresponds to a state, which does not necessarily need to be a type
-// of component... for example, state 2 is a base, with is always a first character
-// in the syllable, but the state could be produced a consonant of any type when
-// it is the first character that is analysed (in ground state).
-//
-// Differentiating 3 types of consonants is necessary in order to
-// forbid the use of certain combinations, such as having a second
-// coeng after a coeng RO,
-// The inexistent possibility of having a type 3 after another type 3 is permitted,
-// eliminating it would very much complicate the table, and it does not create typing
-// problems, as the case above.
-//
-// The table is quite complex, in order to limit the number of coeng consonants
-// to 2 (by means of the table).
-//
-// There a peculiarity, as far as Unicode is concerned:
-// - The consonant-shifter is considered in two possible different
-// locations, the one considered in Unicode 3.0 and the one considered in
-// Unicode 4.0. (there is a backwards compatibility problem in this standard).
-//
-//
-// xx independent character, such as a number, punctuation sign or non-khmer char
-//
-// c1 Khmer consonant of type 1 or an independent vowel
-// that is, a letter in which the subscript for is only under the
-// base, not taking any space to the right or to the left
-//
-// c2 Khmer consonant of type 2, the coeng form takes space under
-// and to the left of the base (only RO is of this type)
-//
-// c3 Khmer consonant of type 3. Its subscript form takes space under
-// and to the right of the base.
-//
-// cs Khmer consonant shifter
-//
-// rb Khmer robat
-//
-// co coeng character (u17D2)
-//
-// dv dependent vowel (including split vowels, they are treated in the same way).
-// even if dv is not defined above, the component that is really tested for is
-// KhmerClassTable::CC_DEPENDENT_VOWEL, which is common to all dependent vowels
-//
-// zwj Zero Width joiner
-//
-// zwnj Zero width non joiner
-//
-// sa above sign
-//
-// sp post sign
-//
-// there are lines with equal content but for an easier understanding
-// (and maybe change in the future) we did not join them
-*/
-static const signed char khmerStateTable[][CC_COUNT] =
-{
- /* xx c1 c2 c3 zwnj cs rb co dv sa sp zwj */
- { 1, 2, 2, 2, 1, 1, 1, 6, 1, 1, 1, 2}, /* 0 - ground state */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 1 - exit state (or sign to the right of the syllable) */
- {-1, -1, -1, -1, 3, 4, 5, 6, 16, 17, 1, -1}, /* 2 - Base consonant */
- {-1, -1, -1, -1, -1, 4, -1, -1, 16, -1, -1, -1}, /* 3 - First ZWNJ before a register shifter It can only be followed by a shifter or a vowel */
- {-1, -1, -1, -1, 15, -1, -1, 6, 16, 17, 1, 14}, /* 4 - First register shifter */
- {-1, -1, -1, -1, -1, -1, -1, -1, 20, -1, 1, -1}, /* 5 - Robat */
- {-1, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1}, /* 6 - First Coeng */
- {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, /* 7 - First consonant of type 1 after coeng */
- {-1, -1, -1, -1, 12, 13, -1, -1, 16, 17, 1, 14}, /* 8 - First consonant of type 2 after coeng */
- {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, /* 9 - First consonant or type 3 after ceong */
- {-1, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1}, /* 10 - Second Coeng (no register shifter before) */
- {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, /* 11 - Second coeng consonant (or ind. vowel) no register shifter before */
- {-1, -1, -1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, /* 12 - Second ZWNJ before a register shifter */
- {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, /* 13 - Second register shifter */
- {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, /* 14 - ZWJ before vowel */
- {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, /* 15 - ZWNJ before vowel */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 1, 18}, /* 16 - dependent vowel */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 18}, /* 17 - sign above */
- {-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1}, /* 18 - ZWJ after vowel */
- {-1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 19 - Third coeng */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, /* 20 - dependent vowel after a Robat */
-};
-
-
-/* #define KHMER_DEBUG */
-#ifdef KHMER_DEBUG
-#define KHDEBUG qDebug
-#else
-#define KHDEBUG if(0) printf
-#endif
-
-/*
-// Given an input string of characters and a location in which to start looking
-// calculate, using the state table, which one is the last character of the syllable
-// that starts in the starting position.
-*/
-static int khmer_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid)
-{
- const HB_UChar16 *uc = s + start;
- int state = 0;
- int pos = start;
- *invalid = FALSE;
-
- while (pos < end) {
- KhmerCharClass charClass = getKhmerCharClass(*uc);
- if (pos == start) {
- *invalid = (charClass > 0) && ! (charClass & CF_CONSONANT);
- }
- state = khmerStateTable[state][charClass & CF_CLASS_MASK];
-
- KHDEBUG("state[%d]=%d class=%8lx (uc=%4x)", pos - start, state,
- charClass, *uc );
-
- if (state < 0) {
- break;
- }
- ++uc;
- ++pos;
- }
- return pos;
-}
-
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature khmer_features[] = {
- { HB_MAKE_TAG( 'p', 'r', 'e', 'f' ), PreFormProperty },
- { HB_MAKE_TAG( 'b', 'l', 'w', 'f' ), BelowFormProperty },
- { HB_MAKE_TAG( 'a', 'b', 'v', 'f' ), AboveFormProperty },
- { HB_MAKE_TAG( 'p', 's', 't', 'f' ), PostFormProperty },
- { HB_MAKE_TAG( 'p', 'r', 'e', 's' ), PreSubstProperty },
- { HB_MAKE_TAG( 'b', 'l', 'w', 's' ), BelowSubstProperty },
- { HB_MAKE_TAG( 'a', 'b', 'v', 's' ), AboveSubstProperty },
- { HB_MAKE_TAG( 'p', 's', 't', 's' ), PostSubstProperty },
- { HB_MAKE_TAG( 'c', 'l', 'i', 'g' ), CligProperty },
- { 0, 0 }
-};
-#endif
-
-
-static HB_Bool khmer_shape_syllable(HB_Bool openType, HB_ShaperItem *item)
-{
-/* KHDEBUG("syllable from %d len %d, str='%s'", item->from, item->length,
- item->string->mid(item->from, item->length).toUtf8().data()); */
-
- int len = 0;
- int syllableEnd = item->item.pos + item->item.length;
- unsigned short reordered[16];
- unsigned char properties[16];
- enum {
- AboveForm = 0x01,
- PreForm = 0x02,
- PostForm = 0x04,
- BelowForm = 0x08
- };
-#ifndef NO_OPENTYPE
- const int availableGlyphs = item->num_glyphs;
-#endif
- int coengRo;
- int i;
-
- /* according to the specs this is the max length one can get
- ### the real value should be smaller */
- assert(item->item.length < 13);
-
- memset(properties, 0, 16*sizeof(unsigned char));
-
-#ifdef KHMER_DEBUG
- qDebug("original:");
- for (int i = from; i < syllableEnd; i++) {
- qDebug(" %d: %4x", i, string[i]);
- }
-#endif
-
- /*
- // write a pre vowel or the pre part of a split vowel first
- // and look out for coeng + ro. RO is the only vowel of type 2, and
- // therefore the only one that requires saving space before the base.
- */
- coengRo = -1; /* There is no Coeng Ro, if found this value will change */
- for (i = item->item.pos; i < syllableEnd; i += 1) {
- KhmerCharClass charClass = getKhmerCharClass(item->string[i]);
-
- /* if a split vowel, write the pre part. In Khmer the pre part
- is the same for all split vowels, same glyph as pre vowel C_VOWEL_E */
- if (charClass & CF_SPLIT_VOWEL) {
- reordered[len] = C_VOWEL_E;
- properties[len] = PreForm;
- ++len;
- break; /* there can be only one vowel */
- }
- /* if a vowel with pos before write it out */
- if (charClass & CF_POS_BEFORE) {
- reordered[len] = item->string[i];
- properties[len] = PreForm;
- ++len;
- break; /* there can be only one vowel */
- }
- /* look for coeng + ro and remember position
- works because coeng + ro is always in front of a vowel (if there is a vowel)
- and because CC_CONSONANT2 is enough to identify it, as it is the only consonant
- with this flag */
- if ( (charClass & CF_COENG) && (i + 1 < syllableEnd) &&
- ( (getKhmerCharClass(item->string[i+1]) & CF_CLASS_MASK) == CC_CONSONANT2) ) {
- coengRo = i;
- }
- }
-
- /* write coeng + ro if found */
- if (coengRo > -1) {
- reordered[len] = C_COENG;
- properties[len] = PreForm;
- ++len;
- reordered[len] = C_RO;
- properties[len] = PreForm;
- ++len;
- }
-
- /*
- shall we add a dotted circle?
- If in the position in which the base should be (first char in the string) there is
- a character that has the Dotted circle flag (a character that cannot be a base)
- then write a dotted circle */
- if (getKhmerCharClass(item->string[item->item.pos]) & CF_DOTTED_CIRCLE) {
- reordered[len] = C_DOTTED_CIRCLE;
- ++len;
- }
-
- /* copy what is left to the output, skipping before vowels and
- coeng Ro if they are present */
- for (i = item->item.pos; i < syllableEnd; i += 1) {
- HB_UChar16 uc = item->string[i];
- KhmerCharClass charClass = getKhmerCharClass(uc);
-
- /* skip a before vowel, it was already processed */
- if (charClass & CF_POS_BEFORE) {
- continue;
- }
-
- /* skip coeng + ro, it was already processed */
- if (i == coengRo) {
- i += 1;
- continue;
- }
-
- switch (charClass & CF_POS_MASK)
- {
- case CF_POS_ABOVE :
- reordered[len] = uc;
- properties[len] = AboveForm;
- ++len;
- break;
-
- case CF_POS_AFTER :
- reordered[len] = uc;
- properties[len] = PostForm;
- ++len;
- break;
-
- case CF_POS_BELOW :
- reordered[len] = uc;
- properties[len] = BelowForm;
- ++len;
- break;
-
- default:
- /* assign the correct flags to a coeng consonant
- Consonants of type 3 are taged as Post forms and those type 1 as below forms */
- if ( (charClass & CF_COENG) && i + 1 < syllableEnd ) {
- unsigned char property = (getKhmerCharClass(item->string[i+1]) & CF_CLASS_MASK) == CC_CONSONANT3 ?
- PostForm : BelowForm;
- reordered[len] = uc;
- properties[len] = property;
- ++len;
- i += 1;
- reordered[len] = item->string[i];
- properties[len] = property;
- ++len;
- break;
- }
-
- /* if a shifter is followed by an above vowel change the shifter to below form,
- an above vowel can have two possible positions i + 1 or i + 3
- (position i+1 corresponds to unicode 3, position i+3 to Unicode 4)
- and there is an extra rule for C_VOWEL_AA + C_SIGN_NIKAHIT also for two
- different positions, right after the shifter or after a vowel (Unicode 4) */
- if ( (charClass & CF_SHIFTER) && (i + 1 < syllableEnd) ) {
- if (getKhmerCharClass(item->string[i+1]) & CF_ABOVE_VOWEL ) {
- reordered[len] = uc;
- properties[len] = BelowForm;
- ++len;
- break;
- }
- if (i + 2 < syllableEnd &&
- (item->string[i+1] == C_VOWEL_AA) &&
- (item->string[i+2] == C_SIGN_NIKAHIT) )
- {
- reordered[len] = uc;
- properties[len] = BelowForm;
- ++len;
- break;
- }
- if (i + 3 < syllableEnd && (getKhmerCharClass(item->string[i+3]) & CF_ABOVE_VOWEL) ) {
- reordered[len] = uc;
- properties[len] = BelowForm;
- ++len;
- break;
- }
- if (i + 4 < syllableEnd &&
- (item->string[i+3] == C_VOWEL_AA) &&
- (item->string[i+4] == C_SIGN_NIKAHIT) )
- {
- reordered[len] = uc;
- properties[len] = BelowForm;
- ++len;
- break;
- }
- }
-
- /* default - any other characters */
- reordered[len] = uc;
- ++len;
- break;
- } /* switch */
- } /* for */
-
- if (!item->font->klass->convertStringToGlyphIndices(item->font,
- reordered, len,
- item->glyphs, &item->num_glyphs,
- item->item.bidiLevel % 2))
- return FALSE;
-
-
- KHDEBUG("after shaping: len=%d", len);
- for (i = 0; i < len; i++) {
- item->attributes[i].mark = FALSE;
- item->attributes[i].clusterStart = FALSE;
- item->attributes[i].justification = 0;
- item->attributes[i].zeroWidth = FALSE;
- KHDEBUG(" %d: %4x property=%x", i, reordered[i], properties[i]);
- }
-
- /* now we have the syllable in the right order, and can start running it through open type. */
-
-#ifndef NO_OPENTYPE
- if (openType) {
- hb_uint32 where[16];
- for (i = 0; i < len; ++i) {
- where[i] = ~(PreSubstProperty
- | BelowSubstProperty
- | AboveSubstProperty
- | PostSubstProperty
- | CligProperty
- | PositioningProperties);
- if (properties[i] == PreForm)
- where[i] &= ~PreFormProperty;
- else if (properties[i] == BelowForm)
- where[i] &= ~BelowFormProperty;
- else if (properties[i] == AboveForm)
- where[i] &= ~AboveFormProperty;
- else if (properties[i] == PostForm)
- where[i] &= ~PostFormProperty;
- }
-
- HB_OpenTypeShape(item, where);
- if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE))
- return FALSE;
- } else
-#endif
- {
- KHDEBUG("Not using openType");
- HB_HeuristicPosition(item);
- }
-
- item->attributes[0].clusterStart = TRUE;
- return TRUE;
-}
-
-HB_Bool HB_KhmerShape(HB_ShaperItem *item)
-{
- HB_Bool openType = FALSE;
- unsigned short *logClusters = item->log_clusters;
- int i;
-
- HB_ShaperItem syllable = *item;
- int first_glyph = 0;
-
- int sstart = item->item.pos;
- int end = sstart + item->item.length;
-
- assert(item->item.script == HB_Script_Khmer);
-
-#ifndef NO_OPENTYPE
- openType = HB_SelectScript(item, khmer_features);
-#endif
-
- KHDEBUG("khmer_shape: from %d length %d", item->item.pos, item->item.length);
- while (sstart < end) {
- HB_Bool invalid;
- int send = khmer_nextSyllableBoundary(item->string, sstart, end, &invalid);
- KHDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart,
- invalid ? "TRUE" : "FALSE");
- syllable.item.pos = sstart;
- syllable.item.length = send-sstart;
- syllable.glyphs = item->glyphs + first_glyph;
- syllable.attributes = item->attributes + first_glyph;
- syllable.offsets = item->offsets + first_glyph;
- syllable.advances = item->advances + first_glyph;
- syllable.num_glyphs = item->num_glyphs - first_glyph;
- if (!khmer_shape_syllable(openType, &syllable)) {
- KHDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs);
- item->num_glyphs += syllable.num_glyphs;
- return FALSE;
- }
- /* fix logcluster array */
- KHDEBUG("syllable:");
- for (i = first_glyph; i < first_glyph + (int)syllable.num_glyphs; ++i)
- KHDEBUG(" %d -> glyph %x", i, item->glyphs[i]);
- KHDEBUG(" logclusters:");
- for (i = sstart; i < send; ++i) {
- KHDEBUG(" %d -> glyph %d", i, first_glyph);
- logClusters[i-item->item.pos] = first_glyph;
- }
- sstart = send;
- first_glyph += syllable.num_glyphs;
- }
- item->num_glyphs = first_glyph;
- return TRUE;
-}
-
-void HB_KhmerAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes)
-{
- int end = from + len;
- const HB_UChar16 *uc = text + from;
- hb_uint32 i = 0;
- HB_UNUSED(script);
- attributes += from;
- while ( i < len ) {
- HB_Bool invalid;
- hb_uint32 boundary = khmer_nextSyllableBoundary( text, from+i, end, &invalid ) - from;
-
- attributes[i].graphemeBoundary = TRUE;
-
- if ( boundary > len-1 ) boundary = len;
- i++;
- while ( i < boundary ) {
- attributes[i].graphemeBoundary = FALSE;
- ++uc;
- ++i;
- }
- assert( i == boundary );
- }
-}
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-myanmar.c b/src/3rdparty/harfbuzz/src/harfbuzz-myanmar.c
deleted file mode 100644
index 1d02346cd9..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-myanmar.c
+++ /dev/null
@@ -1,538 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-enum MymrCharClassValues
-{
- Mymr_CC_RESERVED = 0,
- Mymr_CC_CONSONANT = 1, /* Consonant of type 1, that has subscript form */
- Mymr_CC_CONSONANT2 = 2, /* Consonant of type 2, that has no subscript form */
- Mymr_CC_NGA = 3, /* Consonant NGA */
- Mymr_CC_YA = 4, /* Consonant YA */
- Mymr_CC_RA = 5, /* Consonant RA */
- Mymr_CC_WA = 6, /* Consonant WA */
- Mymr_CC_HA = 7, /* Consonant HA */
- Mymr_CC_IND_VOWEL = 8, /* Independent vowel */
- Mymr_CC_ZERO_WIDTH_NJ_MARK = 9, /* Zero Width non joiner character (0x200C) */
- Mymr_CC_VIRAMA = 10, /* Subscript consonant combining character */
- Mymr_CC_PRE_VOWEL = 11, /* Dependent vowel, prebase (Vowel e) */
- Mymr_CC_BELOW_VOWEL = 12, /* Dependent vowel, prebase (Vowel u, uu) */
- Mymr_CC_ABOVE_VOWEL = 13, /* Dependent vowel, prebase (Vowel i, ii, ai) */
- Mymr_CC_POST_VOWEL = 14, /* Dependent vowel, prebase (Vowel aa) */
- Mymr_CC_SIGN_ABOVE = 15,
- Mymr_CC_SIGN_BELOW = 16,
- Mymr_CC_SIGN_AFTER = 17,
- Mymr_CC_ZERO_WIDTH_J_MARK = 18, /* Zero width joiner character */
- Mymr_CC_COUNT = 19 /* This is the number of character classes */
-};
-
-enum MymrCharClassFlags
-{
- Mymr_CF_CLASS_MASK = 0x0000FFFF,
-
- Mymr_CF_CONSONANT = 0x01000000, /* flag to speed up comparing */
- Mymr_CF_MEDIAL = 0x02000000, /* flag to speed up comparing */
- Mymr_CF_IND_VOWEL = 0x04000000, /* flag to speed up comparing */
- Mymr_CF_DEP_VOWEL = 0x08000000, /* flag to speed up comparing */
- Mymr_CF_DOTTED_CIRCLE = 0x10000000, /* add a dotted circle if a character with this flag is the first in a syllable */
- Mymr_CF_VIRAMA = 0x20000000, /* flag to speed up comparing */
-
- /* position flags */
- Mymr_CF_POS_BEFORE = 0x00080000,
- Mymr_CF_POS_BELOW = 0x00040000,
- Mymr_CF_POS_ABOVE = 0x00020000,
- Mymr_CF_POS_AFTER = 0x00010000,
- Mymr_CF_POS_MASK = 0x000f0000,
-
- Mymr_CF_AFTER_KINZI = 0x00100000
-};
-
-/* Characters that get refrered to by name */
-enum MymrChar
-{
- Mymr_C_SIGN_ZWNJ = 0x200C,
- Mymr_C_SIGN_ZWJ = 0x200D,
- Mymr_C_DOTTED_CIRCLE = 0x25CC,
- Mymr_C_RA = 0x101B,
- Mymr_C_YA = 0x101A,
- Mymr_C_NGA = 0x1004,
- Mymr_C_VOWEL_E = 0x1031,
- Mymr_C_VIRAMA = 0x1039
-};
-
-enum
-{
- Mymr_xx = Mymr_CC_RESERVED,
- Mymr_c1 = Mymr_CC_CONSONANT | Mymr_CF_CONSONANT | Mymr_CF_POS_BELOW,
- Mymr_c2 = Mymr_CC_CONSONANT2 | Mymr_CF_CONSONANT,
- Mymr_ng = Mymr_CC_NGA | Mymr_CF_CONSONANT | Mymr_CF_POS_ABOVE,
- Mymr_ya = Mymr_CC_YA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_AFTER | Mymr_CF_AFTER_KINZI,
- Mymr_ra = Mymr_CC_RA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BEFORE,
- Mymr_wa = Mymr_CC_WA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW,
- Mymr_ha = Mymr_CC_HA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW,
- Mymr_id = Mymr_CC_IND_VOWEL | Mymr_CF_IND_VOWEL,
- Mymr_vi = Mymr_CC_VIRAMA | Mymr_CF_VIRAMA | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE,
- Mymr_dl = Mymr_CC_PRE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BEFORE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
- Mymr_db = Mymr_CC_BELOW_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
- Mymr_da = Mymr_CC_ABOVE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
- Mymr_dr = Mymr_CC_POST_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
- Mymr_sa = Mymr_CC_SIGN_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_ABOVE | Mymr_CF_AFTER_KINZI,
- Mymr_sb = Mymr_CC_SIGN_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_BELOW | Mymr_CF_AFTER_KINZI,
- Mymr_sp = Mymr_CC_SIGN_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI
-};
-
-
-typedef int MymrCharClass;
-
-
-static const MymrCharClass mymrCharClasses[] =
-{
- Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_ng, Mymr_c1, Mymr_c1, Mymr_c1,
- Mymr_c1, Mymr_c1, Mymr_c2, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, /* 1000 - 100F */
- Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1,
- Mymr_c1, Mymr_c1, Mymr_ya, Mymr_ra, Mymr_c1, Mymr_wa, Mymr_c1, Mymr_ha, /* 1010 - 101F */
- Mymr_c2, Mymr_c2, Mymr_xx, Mymr_id, Mymr_id, Mymr_id, Mymr_id, Mymr_id,
- Mymr_xx, Mymr_id, Mymr_id, Mymr_xx, Mymr_dr, Mymr_da, Mymr_da, Mymr_db, /* 1020 - 102F */
- Mymr_db, Mymr_dl, Mymr_da, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_sa, Mymr_sb,
- Mymr_sp, Mymr_vi, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1030 - 103F */
- Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx,
- Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1040 - 104F */
- Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx,
- Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1050 - 105F */
-};
-
-static MymrCharClass
-getMyanmarCharClass (HB_UChar16 ch)
-{
- if (ch == Mymr_C_SIGN_ZWJ)
- return Mymr_CC_ZERO_WIDTH_J_MARK;
-
- if (ch == Mymr_C_SIGN_ZWNJ)
- return Mymr_CC_ZERO_WIDTH_NJ_MARK;
-
- if (ch < 0x1000 || ch > 0x105f)
- return Mymr_CC_RESERVED;
-
- return mymrCharClasses[ch - 0x1000];
-}
-
-static const signed char mymrStateTable[][Mymr_CC_COUNT] =
-{
-/* xx c1, c2 ng ya ra wa ha id zwnj vi dl db da dr sa sb sp zwj */
- { 1, 4, 4, 2, 4, 4, 4, 4, 24, 1, 27, 17, 18, 19, 20, 21, 1, 1, 4}, /* 0 - ground state */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 1 - exit state (or sp to the right of the syllable) */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 17, 18, 19, 20, 21, -1, -1, 4}, /* 2 - NGA */
- {-1, 4, 4, 4, 4, 4, 4, 4, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 3 - Virama after NGA */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 17, 18, 19, 20, 21, 1, 1, -1}, /* 4 - Base consonant */
- {-2, 6, -2, -2, 7, 8, 9, 10, -2, 23, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 5 - First virama */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, 17, 18, 19, 20, 21, -1, -1, -1}, /* 6 - c1 after virama */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 7 - ya after virama */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 8 - ra after virama */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 9 - wa after virama */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 10 - ha after virama */
- {-1, -1, -1, -1, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 11 - Virama after NGA+zwj */
- {-2, -2, -2, -2, -2, -2, 13, 14, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 12 - Second virama */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 17, 18, 19, 20, 21, -1, -1, -1}, /* 13 - wa after virama */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 14 - ha after virama */
- {-2, -2, -2, -2, -2, -2, -2, 16, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 15 - Third virama */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 16 - ha after virama */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, 21, 1, 1, -1}, /* 17 - dl, Dependent vowel e */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, 21, 1, 1, -1}, /* 18 - db, Dependent vowel u,uu */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1}, /* 19 - da, Dependent vowel i,ii,ai */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, 1, 1, -1}, /* 20 - dr, Dependent vowel aa */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1}, /* 21 - sa, Sign anusvara */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 22 - atha */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1}, /* 23 - zwnj for atha */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, /* 24 - Independent vowel */
- {-2, -2, -2, -2, 26, 26, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 25 - Virama after subscript consonant */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, 1, -1}, /* 26 - ra/ya after subscript consonant + virama */
- {-1, 6, -1, -1, 7, 8, 9, 10, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 27 - Virama after ground state */
-/* exit state -2 is for invalid order of medials and combination of invalids
- with virama where virama should treat as start of next syllable
- */
-};
-
-
-
-/*#define MYANMAR_DEBUG */
-#ifdef MYANMAR_DEBUG
-#define MMDEBUG qDebug
-#else
-#define MMDEBUG if(0) printf
-#endif
-
-/*
-// Given an input string of characters and a location in which to start looking
-// calculate, using the state table, which one is the last character of the syllable
-// that starts in the starting position.
-*/
-static int myanmar_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid)
-{
- const HB_UChar16 *uc = s + start;
- int state = 0;
- int pos = start;
- *invalid = FALSE;
-
- while (pos < end) {
- MymrCharClass charClass = getMyanmarCharClass(*uc);
- state = mymrStateTable[state][charClass & Mymr_CF_CLASS_MASK];
- if (pos == start)
- *invalid = (HB_Bool)(charClass & Mymr_CF_DOTTED_CIRCLE);
-
- MMDEBUG("state[%d]=%d class=%8x (uc=%4x)", pos - start, state, charClass, *uc);
-
- if (state < 0) {
- if (state < -1)
- --pos;
- break;
- }
- ++uc;
- ++pos;
- }
- return pos;
-}
-
-#ifndef NO_OPENTYPE
-/* ###### might have to change order of above and below forms and substitutions,
- but according to Unicode below comes before above */
-static const HB_OpenTypeFeature myanmar_features[] = {
- { HB_MAKE_TAG('p', 'r', 'e', 'f'), PreFormProperty },
- { HB_MAKE_TAG('b', 'l', 'w', 'f'), BelowFormProperty },
- { HB_MAKE_TAG('a', 'b', 'v', 'f'), AboveFormProperty },
- { HB_MAKE_TAG('p', 's', 't', 'f'), PostFormProperty },
- { HB_MAKE_TAG('p', 'r', 'e', 's'), PreSubstProperty },
- { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty },
- { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty },
- { HB_MAKE_TAG('p', 's', 't', 's'), PostSubstProperty },
- { HB_MAKE_TAG('r', 'l', 'i', 'g'), CligProperty }, /* Myanmar1 uses this instead of the other features */
- { 0, 0 }
-};
-#endif
-
-
-/*
-// Visual order before shaping should be:
-//
-// [Vowel Mark E]
-// [Virama + Medial Ra]
-// [Base]
-// [Virama + Consonant]
-// [Nga + Virama] (Kinzi) ### should probably come before post forms (medial ya)
-// [Vowels]
-// [Marks]
-//
-// This means that we can keep the logical order apart from having to
-// move the pre vowel, medial ra and kinzi
-*/
-
-static HB_Bool myanmar_shape_syllable(HB_Bool openType, HB_ShaperItem *item, HB_Bool invalid)
-{
- /*
-// MMDEBUG("\nsyllable from %d len %d, str='%s'", item->item.pos, item->item.length,
-// item->string->mid(item->from, item->length).toUtf8().data());
- */
-
-#ifndef NO_OPENTYPE
- const int availableGlyphs = item->num_glyphs;
-#endif
- const HB_UChar16 *uc = item->string + item->item.pos;
- int vowel_e = -1;
- int kinzi = -1;
- int medial_ra = -1;
- int base = -1;
- int i;
- int len = 0;
- unsigned short reordered[32];
- unsigned char properties[32];
- enum {
- AboveForm = 0x01,
- PreForm = 0x02,
- PostForm = 0x04,
- BelowForm = 0x08
- };
- HB_Bool lastWasVirama = FALSE;
- int basePos = -1;
-
- memset(properties, 0, 32*sizeof(unsigned char));
-
- /* according to the table the max length of a syllable should be around 14 chars */
- assert(item->item.length < 32);
-
-#ifdef MYANMAR_DEBUG
- printf("original:");
- for (i = 0; i < (int)item->item.length; i++) {
- printf(" %d: %4x", i, uc[i]);
- }
-#endif
- for (i = 0; i < (int)item->item.length; ++i) {
- HB_UChar16 chr = uc[i];
-
- if (chr == Mymr_C_VOWEL_E) {
- vowel_e = i;
- continue;
- }
- if (i == 0
- && chr == Mymr_C_NGA
- && i + 2 < (int)item->item.length
- && uc[i+1] == Mymr_C_VIRAMA) {
- int mc = getMyanmarCharClass(uc[i+2]);
- /*MMDEBUG("maybe kinzi: mc=%x", mc);*/
- if ((mc & Mymr_CF_CONSONANT) == Mymr_CF_CONSONANT) {
- kinzi = i;
- continue;
- }
- }
- if (base >= 0
- && chr == Mymr_C_VIRAMA
- && i + 1 < (int)item->item.length
- && uc[i+1] == Mymr_C_RA) {
- medial_ra = i;
- continue;
- }
- if (base < 0)
- base = i;
- }
-
- MMDEBUG("\n base=%d, vowel_e=%d, kinzi=%d, medial_ra=%d", base, vowel_e, kinzi, medial_ra);
- /* write vowel_e if found */
- if (vowel_e >= 0) {
- reordered[0] = Mymr_C_VOWEL_E;
- len = 1;
- }
- /* write medial_ra */
- if (medial_ra >= 0) {
- reordered[len] = Mymr_C_VIRAMA;
- reordered[len+1] = Mymr_C_RA;
- properties[len] = PreForm;
- properties[len+1] = PreForm;
- len += 2;
- }
-
- /* shall we add a dotted circle?
- If in the position in which the base should be (first char in the string) there is
- a character that has the Dotted circle flag (a character that cannot be a base)
- then write a dotted circle */
- if (invalid) {
- reordered[len] = C_DOTTED_CIRCLE;
- ++len;
- }
-
- /* copy the rest of the syllable to the output, inserting the kinzi
- at the correct place */
- for (i = 0; i < (int)item->item.length; ++i) {
- hb_uint16 chr = uc[i];
- MymrCharClass cc;
- if (i == vowel_e)
- continue;
- if (i == medial_ra || i == kinzi) {
- ++i;
- continue;
- }
-
- cc = getMyanmarCharClass(uc[i]);
- if (kinzi >= 0 && i > base && (cc & Mymr_CF_AFTER_KINZI)) {
- reordered[len] = Mymr_C_NGA;
- reordered[len+1] = Mymr_C_VIRAMA;
- if (len > 0)
- properties[len-1] = AboveForm;
- properties[len] = AboveForm;
- len += 2;
- kinzi = -1;
- }
-
- if (lastWasVirama) {
- int prop = 0;
- switch(cc & Mymr_CF_POS_MASK) {
- case Mymr_CF_POS_BEFORE:
- prop = PreForm;
- break;
- case Mymr_CF_POS_BELOW:
- prop = BelowForm;
- break;
- case Mymr_CF_POS_ABOVE:
- prop = AboveForm;
- break;
- case Mymr_CF_POS_AFTER:
- prop = PostForm;
- break;
- default:
- break;
- }
- properties[len-1] = prop;
- properties[len] = prop;
- if(basePos >= 0 && basePos == len-2)
- properties[len-2] = prop;
- }
- lastWasVirama = (chr == Mymr_C_VIRAMA);
- if(i == base)
- basePos = len;
-
- if ((chr != Mymr_C_SIGN_ZWNJ && chr != Mymr_C_SIGN_ZWJ) || !len) {
- reordered[len] = chr;
- ++len;
- }
- }
- if (kinzi >= 0) {
- reordered[len] = Mymr_C_NGA;
- reordered[len+1] = Mymr_C_VIRAMA;
- properties[len] = AboveForm;
- properties[len+1] = AboveForm;
- len += 2;
- }
-
- if (!item->font->klass->convertStringToGlyphIndices(item->font,
- reordered, len,
- item->glyphs, &item->num_glyphs,
- item->item.bidiLevel % 2))
- return FALSE;
-
- MMDEBUG("after shaping: len=%d", len);
- for (i = 0; i < len; i++) {
- item->attributes[i].mark = FALSE;
- item->attributes[i].clusterStart = FALSE;
- item->attributes[i].justification = 0;
- item->attributes[i].zeroWidth = FALSE;
- MMDEBUG(" %d: %4x property=%x", i, reordered[i], properties[i]);
- }
-
- /* now we have the syllable in the right order, and can start running it through open type. */
-
-#ifndef NO_OPENTYPE
- if (openType) {
- hb_uint32 where[32];
-
- for (i = 0; i < len; ++i) {
- where[i] = ~(PreSubstProperty
- | BelowSubstProperty
- | AboveSubstProperty
- | PostSubstProperty
- | CligProperty
- | PositioningProperties);
- if (properties[i] & PreForm)
- where[i] &= ~PreFormProperty;
- if (properties[i] & BelowForm)
- where[i] &= ~BelowFormProperty;
- if (properties[i] & AboveForm)
- where[i] &= ~AboveFormProperty;
- if (properties[i] & PostForm)
- where[i] &= ~PostFormProperty;
- }
-
- HB_OpenTypeShape(item, where);
- if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE))
- return FALSE;
- } else
-#endif
- {
- MMDEBUG("Not using openType");
- HB_HeuristicPosition(item);
- }
-
- item->attributes[0].clusterStart = TRUE;
- return TRUE;
-}
-
-HB_Bool HB_MyanmarShape(HB_ShaperItem *item)
-{
- HB_Bool openType = FALSE;
- unsigned short *logClusters = item->log_clusters;
-
- HB_ShaperItem syllable = *item;
- int first_glyph = 0;
-
- int sstart = item->item.pos;
- int end = sstart + item->item.length;
- int i = 0;
-
- assert(item->item.script == HB_Script_Myanmar);
-#ifndef NO_OPENTYPE
- openType = HB_SelectScript(item, myanmar_features);
-#endif
-
- MMDEBUG("myanmar_shape: from %d length %d", item->item.pos, item->item.length);
- while (sstart < end) {
- HB_Bool invalid;
- int send = myanmar_nextSyllableBoundary(item->string, sstart, end, &invalid);
- MMDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart,
- invalid ? "TRUE" : "FALSE");
- syllable.item.pos = sstart;
- syllable.item.length = send-sstart;
- syllable.glyphs = item->glyphs + first_glyph;
- syllable.attributes = item->attributes + first_glyph;
- syllable.advances = item->advances + first_glyph;
- syllable.offsets = item->offsets + first_glyph;
- syllable.num_glyphs = item->num_glyphs - first_glyph;
- if (!myanmar_shape_syllable(openType, &syllable, invalid)) {
- MMDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs);
- item->num_glyphs += syllable.num_glyphs;
- return FALSE;
- }
-
- /* fix logcluster array */
- MMDEBUG("syllable:");
- for (i = first_glyph; i < first_glyph + (int)syllable.num_glyphs; ++i)
- MMDEBUG(" %d -> glyph %x", i, item->glyphs[i]);
- MMDEBUG(" logclusters:");
- for (i = sstart; i < send; ++i) {
- MMDEBUG(" %d -> glyph %d", i, first_glyph);
- logClusters[i-item->item.pos] = first_glyph;
- }
- sstart = send;
- first_glyph += syllable.num_glyphs;
- }
- item->num_glyphs = first_glyph;
- return TRUE;
-}
-
-void HB_MyanmarAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes)
-{
- int end = from + len;
- const HB_UChar16 *uc = text + from;
- hb_uint32 i = 0;
- HB_UNUSED(script);
- attributes += from;
- while (i < len) {
- HB_Bool invalid;
- hb_uint32 boundary = myanmar_nextSyllableBoundary(text, from+i, end, &invalid) - from;
-
- attributes[i].graphemeBoundary = TRUE;
- attributes[i].lineBreak = TRUE;
-
- if (boundary > len-1)
- boundary = len;
- i++;
- while (i < boundary) {
- attributes[i].graphemeBoundary = FALSE;
- ++uc;
- ++i;
- }
- assert(i == boundary);
- }
-}
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-open-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-open-private.h
deleted file mode 100644
index f1ca27809b..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-open-private.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_OPEN_PRIVATE_H
-#define HARFBUZZ_OPEN_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-open.h"
-#include "harfbuzz-gsub-private.h"
-#include "harfbuzz-gpos-private.h"
-
-HB_BEGIN_HEADER
-
-
-struct HB_SubTable_
-{
- union
- {
- HB_GSUB_SubTable gsub;
- HB_GPOS_SubTable gpos;
- } st;
-};
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_ScriptList( HB_ScriptList* sl,
- HB_Stream input );
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_FeatureList( HB_FeatureList* fl,
- HB_Stream input );
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_LookupList( HB_LookupList* ll,
- HB_Stream input,
- HB_Type type );
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_Coverage( HB_Coverage* c,
- HB_Stream input );
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd,
- HB_UShort limit,
- HB_Stream input );
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_EmptyOrClassDefinition( HB_ClassDefinition* cd,
- HB_UShort limit,
- HB_UInt class_offset,
- HB_UInt base_offset,
- HB_Stream input );
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_Device( HB_Device** d,
- HB_Stream input );
-
-HB_INTERNAL void _HB_OPEN_Free_ScriptList( HB_ScriptList* sl );
-HB_INTERNAL void _HB_OPEN_Free_FeatureList( HB_FeatureList* fl );
-HB_INTERNAL void _HB_OPEN_Free_LookupList( HB_LookupList* ll,
- HB_Type type );
-
-HB_INTERNAL void _HB_OPEN_Free_Coverage( HB_Coverage* c );
-HB_INTERNAL void _HB_OPEN_Free_ClassDefinition( HB_ClassDefinition* cd );
-HB_INTERNAL void _HB_OPEN_Free_Device( HB_Device* d );
-
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Coverage_Index( HB_Coverage* c,
- HB_UShort glyphID,
- HB_UShort* index );
-HB_INTERNAL HB_Error
-_HB_OPEN_Get_Class( HB_ClassDefinition* cd,
- HB_UShort glyphID,
- HB_UShort* klass,
- HB_UShort* index );
-HB_INTERNAL HB_Error
-_HB_OPEN_Get_Device( HB_Device* d,
- HB_UShort size,
- HB_Short* value );
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_OPEN_PRIVATE_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-open.c b/src/3rdparty/harfbuzz/src/harfbuzz-open.c
deleted file mode 100644
index f12f5b7f08..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-open.c
+++ /dev/null
@@ -1,1433 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-open-private.h"
-
-
-/***************************
- * Script related functions
- ***************************/
-
-
-/* LangSys */
-
-static HB_Error Load_LangSys( HB_LangSys* ls,
- HB_Stream stream )
-{
- HB_Error error;
- HB_UShort n, count;
- HB_UShort* fi;
-
-
- if ( ACCESS_Frame( 6L ) )
- return error;
-
- ls->LookupOrderOffset = GET_UShort(); /* should be 0 */
- ls->ReqFeatureIndex = GET_UShort();
- count = ls->FeatureCount = GET_UShort();
-
- FORGET_Frame();
-
- ls->FeatureIndex = NULL;
-
- if ( ALLOC_ARRAY( ls->FeatureIndex, count, HB_UShort ) )
- return error;
-
- if ( ACCESS_Frame( count * 2L ) )
- {
- FREE( ls->FeatureIndex );
- return error;
- }
-
- fi = ls->FeatureIndex;
-
- for ( n = 0; n < count; n++ )
- fi[n] = GET_UShort();
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-}
-
-
-static void Free_LangSys( HB_LangSys* ls )
-{
- FREE( ls->FeatureIndex );
-}
-
-
-/* Script */
-
-static HB_Error Load_Script( HB_ScriptTable* s,
- HB_Stream stream )
-{
- HB_Error error;
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_LangSysRecord* lsr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- if ( new_offset != base_offset ) /* not a NULL offset */
- {
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_LangSys( &s->DefaultLangSys,
- stream ) ) != HB_Err_Ok )
- return error;
- (void)FILE_Seek( cur_offset );
- }
- else
- {
- /* we create a DefaultLangSys table with no entries */
-
- s->DefaultLangSys.LookupOrderOffset = 0;
- s->DefaultLangSys.ReqFeatureIndex = 0xFFFF;
- s->DefaultLangSys.FeatureCount = 0;
- s->DefaultLangSys.FeatureIndex = NULL;
- }
-
- if ( ACCESS_Frame( 2L ) )
- goto Fail2;
-
- count = s->LangSysCount = GET_UShort();
-
- /* safety check; otherwise the official handling of TrueType Open
- fonts won't work */
-
- if ( s->LangSysCount == 0 && s->DefaultLangSys.FeatureCount == 0 )
- {
- error = HB_Err_Not_Covered;
- goto Fail2;
- }
-
- FORGET_Frame();
-
- s->LangSysRecord = NULL;
-
- if ( ALLOC_ARRAY( s->LangSysRecord, count, HB_LangSysRecord ) )
- goto Fail2;
-
- lsr = s->LangSysRecord;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 6L ) )
- goto Fail1;
-
- lsr[n].LangSysTag = GET_ULong();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_LangSys( &lsr[n].LangSys, stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_LangSys( &lsr[m].LangSys );
-
- FREE( s->LangSysRecord );
-
-Fail2:
- Free_LangSys( &s->DefaultLangSys );
- return error;
-}
-
-
-static void Free_Script( HB_ScriptTable* s )
-{
- HB_UShort n, count;
-
- HB_LangSysRecord* lsr;
-
-
- Free_LangSys( &s->DefaultLangSys );
-
- if ( s->LangSysRecord )
- {
- count = s->LangSysCount;
- lsr = s->LangSysRecord;
-
- for ( n = 0; n < count; n++ )
- Free_LangSys( &lsr[n].LangSys );
-
- FREE( lsr );
- }
-}
-
-
-/* ScriptList */
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_ScriptList( HB_ScriptList* sl,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, script_count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_ScriptRecord* sr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- script_count = GET_UShort();
-
- FORGET_Frame();
-
- sl->ScriptRecord = NULL;
-
- if ( ALLOC_ARRAY( sl->ScriptRecord, script_count, HB_ScriptRecord ) )
- return error;
-
- sr = sl->ScriptRecord;
-
- sl->ScriptCount= 0;
- for ( n = 0; n < script_count; n++ )
- {
- if ( ACCESS_Frame( 6L ) )
- goto Fail;
-
- sr[sl->ScriptCount].ScriptTag = GET_ULong();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
-
- if ( FILE_Seek( new_offset ) )
- goto Fail;
-
- error = Load_Script( &sr[sl->ScriptCount].Script, stream );
- if ( error == HB_Err_Ok )
- sl->ScriptCount += 1;
- else if ( error != HB_Err_Not_Covered )
- goto Fail;
-
- (void)FILE_Seek( cur_offset );
- }
-
- /* Empty tables are harmless and generated by fontforge.
- * See http://bugzilla.gnome.org/show_bug.cgi?id=347073
- */
-#if 0
- if ( sl->ScriptCount == 0 )
- {
- error = ERR(HB_Err_Invalid_SubTable);
- goto Fail;
- }
-#endif
-
- return HB_Err_Ok;
-
-Fail:
- for ( n = 0; n < sl->ScriptCount; n++ )
- Free_Script( &sr[n].Script );
-
- FREE( sl->ScriptRecord );
- return error;
-}
-
-
-HB_INTERNAL void
-_HB_OPEN_Free_ScriptList( HB_ScriptList* sl )
-{
- HB_UShort n, count;
-
- HB_ScriptRecord* sr;
-
-
- if ( sl->ScriptRecord )
- {
- count = sl->ScriptCount;
- sr = sl->ScriptRecord;
-
- for ( n = 0; n < count; n++ )
- Free_Script( &sr[n].Script );
-
- FREE( sr );
- }
-}
-
-
-
-/*********************************
- * Feature List related functions
- *********************************/
-
-
-/* Feature */
-
-static HB_Error Load_Feature( HB_Feature* f,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
-
- HB_UShort* lli;
-
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- f->FeatureParams = GET_UShort(); /* should be 0 */
- count = f->LookupListCount = GET_UShort();
-
- FORGET_Frame();
-
- f->LookupListIndex = NULL;
-
- if ( ALLOC_ARRAY( f->LookupListIndex, count, HB_UShort ) )
- return error;
-
- lli = f->LookupListIndex;
-
- if ( ACCESS_Frame( count * 2L ) )
- {
- FREE( f->LookupListIndex );
- return error;
- }
-
- for ( n = 0; n < count; n++ )
- lli[n] = GET_UShort();
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-}
-
-
-static void Free_Feature( HB_Feature* f )
-{
- FREE( f->LookupListIndex );
-}
-
-
-/* FeatureList */
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_FeatureList( HB_FeatureList* fl,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_FeatureRecord* fr;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = fl->FeatureCount = GET_UShort();
-
- FORGET_Frame();
-
- fl->FeatureRecord = NULL;
-
- if ( ALLOC_ARRAY( fl->FeatureRecord, count, HB_FeatureRecord ) )
- return error;
- if ( ALLOC_ARRAY( fl->ApplyOrder, count, HB_UShort ) )
- goto Fail2;
-
- fl->ApplyCount = 0;
-
- fr = fl->FeatureRecord;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 6L ) )
- goto Fail1;
-
- fr[n].FeatureTag = GET_ULong();
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_Feature( &fr[n].Feature, stream ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail1:
- for ( m = 0; m < n; m++ )
- Free_Feature( &fr[m].Feature );
-
- FREE( fl->ApplyOrder );
-
-Fail2:
- FREE( fl->FeatureRecord );
-
- return error;
-}
-
-
-HB_INTERNAL void
-_HB_OPEN_Free_FeatureList( HB_FeatureList* fl )
-{
- HB_UShort n, count;
-
- HB_FeatureRecord* fr;
-
-
- if ( fl->FeatureRecord )
- {
- count = fl->FeatureCount;
- fr = fl->FeatureRecord;
-
- for ( n = 0; n < count; n++ )
- Free_Feature( &fr[n].Feature );
-
- FREE( fr );
- }
-
- FREE( fl->ApplyOrder );
-}
-
-
-
-/********************************
- * Lookup List related functions
- ********************************/
-
-/* the subroutines of the following two functions are defined in
- ftxgsub.c and ftxgpos.c respectively */
-
-
-/* SubTable */
-
-static HB_Error Load_SubTable( HB_SubTable* st,
- HB_Stream stream,
- HB_Type table_type,
- HB_UShort lookup_type )
-{
- if ( table_type == HB_Type_GSUB )
- return _HB_GSUB_Load_SubTable ( &st->st.gsub, stream, lookup_type );
- else
- return _HB_GPOS_Load_SubTable ( &st->st.gpos, stream, lookup_type );
-}
-
-
-static void Free_SubTable( HB_SubTable* st,
- HB_Type table_type,
- HB_UShort lookup_type )
-{
- if ( table_type == HB_Type_GSUB )
- _HB_GSUB_Free_SubTable ( &st->st.gsub, lookup_type );
- else
- _HB_GPOS_Free_SubTable ( &st->st.gpos, lookup_type );
-}
-
-
-/* Lookup */
-
-static HB_Error Load_Lookup( HB_Lookup* l,
- HB_Stream stream,
- HB_Type type )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_SubTable* st;
-
- HB_Bool is_extension = FALSE;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 6L ) )
- return error;
-
- l->LookupType = GET_UShort();
- l->LookupFlag = GET_UShort();
- count = l->SubTableCount = GET_UShort();
-
- FORGET_Frame();
-
- l->SubTable = NULL;
-
- if ( ALLOC_ARRAY( l->SubTable, count, HB_SubTable ) )
- return error;
-
- st = l->SubTable;
-
- if ( ( type == HB_Type_GSUB && l->LookupType == HB_GSUB_LOOKUP_EXTENSION ) ||
- ( type == HB_Type_GPOS && l->LookupType == HB_GPOS_LOOKUP_EXTENSION ) )
- is_extension = TRUE;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
-
- if ( is_extension )
- {
- if ( FILE_Seek( new_offset ) || ACCESS_Frame( 8L ) )
- goto Fail;
-
- if (GET_UShort() != 1) /* format should be 1 */
- goto Fail;
-
- l->LookupType = GET_UShort();
- new_offset += GET_ULong();
-
- FORGET_Frame();
- }
-
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_SubTable( &st[n], stream,
- type, l->LookupType ) ) != HB_Err_Ok )
- goto Fail;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail:
- for ( m = 0; m < n; m++ )
- Free_SubTable( &st[m], type, l->LookupType );
-
- FREE( l->SubTable );
- return error;
-}
-
-
-static void Free_Lookup( HB_Lookup* l,
- HB_Type type)
-{
- HB_UShort n, count;
-
- HB_SubTable* st;
-
-
- if ( l->SubTable )
- {
- count = l->SubTableCount;
- st = l->SubTable;
-
- for ( n = 0; n < count; n++ )
- Free_SubTable( &st[n], type, l->LookupType );
-
- FREE( st );
- }
-}
-
-
-/* LookupList */
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_LookupList( HB_LookupList* ll,
- HB_Stream stream,
- HB_Type type )
-{
- HB_Error error;
-
- HB_UShort n, m, count;
- HB_UInt cur_offset, new_offset, base_offset;
-
- HB_Lookup* l;
-
-
- base_offset = FILE_Pos();
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = ll->LookupCount = GET_UShort();
-
- FORGET_Frame();
-
- ll->Lookup = NULL;
-
- if ( ALLOC_ARRAY( ll->Lookup, count, HB_Lookup ) )
- return error;
- if ( ALLOC_ARRAY( ll->Properties, count, HB_UInt ) )
- goto Fail2;
-
- l = ll->Lookup;
-
- for ( n = 0; n < count; n++ )
- {
- if ( ACCESS_Frame( 2L ) )
- goto Fail1;
-
- new_offset = GET_UShort() + base_offset;
-
- FORGET_Frame();
-
- cur_offset = FILE_Pos();
- if ( FILE_Seek( new_offset ) ||
- ( error = Load_Lookup( &l[n], stream, type ) ) != HB_Err_Ok )
- goto Fail1;
- (void)FILE_Seek( cur_offset );
- }
-
- return HB_Err_Ok;
-
-Fail1:
- FREE( ll->Properties );
-
- for ( m = 0; m < n; m++ )
- Free_Lookup( &l[m], type );
-
-Fail2:
- FREE( ll->Lookup );
- return error;
-}
-
-
-HB_INTERNAL void
-_HB_OPEN_Free_LookupList( HB_LookupList* ll,
- HB_Type type )
-{
- HB_UShort n, count;
-
- HB_Lookup* l;
-
-
- FREE( ll->Properties );
-
- if ( ll->Lookup )
- {
- count = ll->LookupCount;
- l = ll->Lookup;
-
- for ( n = 0; n < count; n++ )
- Free_Lookup( &l[n], type );
-
- FREE( l );
- }
-}
-
-
-
-/*****************************
- * Coverage related functions
- *****************************/
-
-
-/* CoverageFormat1 */
-
-static HB_Error Load_Coverage1( HB_CoverageFormat1* cf1,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
-
- HB_UShort* ga;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = cf1->GlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- cf1->GlyphArray = NULL;
-
- if ( ALLOC_ARRAY( cf1->GlyphArray, count, HB_UShort ) )
- return error;
-
- ga = cf1->GlyphArray;
-
- if ( ACCESS_Frame( count * 2L ) )
- {
- FREE( cf1->GlyphArray );
- return error;
- }
-
- for ( n = 0; n < count; n++ )
- ga[n] = GET_UShort();
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-}
-
-
-static void Free_Coverage1( HB_CoverageFormat1* cf1)
-{
- FREE( cf1->GlyphArray );
-}
-
-
-/* CoverageFormat2 */
-
-static HB_Error Load_Coverage2( HB_CoverageFormat2* cf2,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
-
- HB_RangeRecord* rr;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = cf2->RangeCount = GET_UShort();
-
- FORGET_Frame();
-
- cf2->RangeRecord = NULL;
-
- if ( ALLOC_ARRAY( cf2->RangeRecord, count, HB_RangeRecord ) )
- return error;
-
- rr = cf2->RangeRecord;
-
- if ( ACCESS_Frame( count * 6L ) )
- goto Fail;
-
- for ( n = 0; n < count; n++ )
- {
- rr[n].Start = GET_UShort();
- rr[n].End = GET_UShort();
- rr[n].StartCoverageIndex = GET_UShort();
-
- /* sanity check; we are limited to 16bit integers */
- if ( rr[n].Start > rr[n].End ||
- ( rr[n].End - rr[n].Start + (long)rr[n].StartCoverageIndex ) >=
- 0x10000L )
- {
- error = ERR(HB_Err_Invalid_SubTable);
- goto Fail;
- }
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail:
- FREE( cf2->RangeRecord );
- return error;
-}
-
-
-static void Free_Coverage2( HB_CoverageFormat2* cf2 )
-{
- FREE( cf2->RangeRecord );
-}
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_Coverage( HB_Coverage* c,
- HB_Stream stream )
-{
- HB_Error error;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- c->CoverageFormat = GET_UShort();
-
- FORGET_Frame();
-
- switch ( c->CoverageFormat )
- {
- case 1: return Load_Coverage1( &c->cf.cf1, stream );
- case 2: return Load_Coverage2( &c->cf.cf2, stream );
- default: return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok; /* never reached */
-}
-
-
-HB_INTERNAL void
-_HB_OPEN_Free_Coverage( HB_Coverage* c )
-{
- switch ( c->CoverageFormat )
- {
- case 1: Free_Coverage1( &c->cf.cf1 ); break;
- case 2: Free_Coverage2( &c->cf.cf2 ); break;
- default: break;
- }
-}
-
-
-static HB_Error Coverage_Index1( HB_CoverageFormat1* cf1,
- HB_UShort glyphID,
- HB_UShort* index )
-{
- HB_UShort min, max, new_min, new_max, middle;
-
- HB_UShort* array = cf1->GlyphArray;
-
-
- /* binary search */
-
- if ( cf1->GlyphCount == 0 )
- return HB_Err_Not_Covered;
-
- new_min = 0;
- new_max = cf1->GlyphCount - 1;
-
- do
- {
- min = new_min;
- max = new_max;
-
- /* we use (min + max) / 2 = max - (max - min) / 2 to avoid
- overflow and rounding errors */
-
- middle = max - ( ( max - min ) >> 1 );
-
- if ( glyphID == array[middle] )
- {
- *index = middle;
- return HB_Err_Ok;
- }
- else if ( glyphID < array[middle] )
- {
- if ( middle == min )
- break;
- new_max = middle - 1;
- }
- else
- {
- if ( middle == max )
- break;
- new_min = middle + 1;
- }
- } while ( min < max );
-
- return HB_Err_Not_Covered;
-}
-
-
-static HB_Error Coverage_Index2( HB_CoverageFormat2* cf2,
- HB_UShort glyphID,
- HB_UShort* index )
-{
- HB_UShort min, max, new_min, new_max, middle;
-
- HB_RangeRecord* rr = cf2->RangeRecord;
-
-
- /* binary search */
-
- if ( cf2->RangeCount == 0 )
- return HB_Err_Not_Covered;
-
- new_min = 0;
- new_max = cf2->RangeCount - 1;
-
- do
- {
- min = new_min;
- max = new_max;
-
- /* we use (min + max) / 2 = max - (max - min) / 2 to avoid
- overflow and rounding errors */
-
- middle = max - ( ( max - min ) >> 1 );
-
- if ( glyphID >= rr[middle].Start && glyphID <= rr[middle].End )
- {
- *index = rr[middle].StartCoverageIndex + glyphID - rr[middle].Start;
- return HB_Err_Ok;
- }
- else if ( glyphID < rr[middle].Start )
- {
- if ( middle == min )
- break;
- new_max = middle - 1;
- }
- else
- {
- if ( middle == max )
- break;
- new_min = middle + 1;
- }
- } while ( min < max );
-
- return HB_Err_Not_Covered;
-}
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Coverage_Index( HB_Coverage* c,
- HB_UShort glyphID,
- HB_UShort* index )
-{
- switch ( c->CoverageFormat )
- {
- case 1: return Coverage_Index1( &c->cf.cf1, glyphID, index );
- case 2: return Coverage_Index2( &c->cf.cf2, glyphID, index );
- default: return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok; /* never reached */
-}
-
-
-
-/*************************************
- * Class Definition related functions
- *************************************/
-
-
-/* ClassDefFormat1 */
-
-static HB_Error Load_ClassDef1( HB_ClassDefinition* cd,
- HB_UShort limit,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
-
- HB_UShort* cva;
-
- HB_ClassDefFormat1* cdf1;
-
-
- cdf1 = &cd->cd.cd1;
-
- if ( ACCESS_Frame( 4L ) )
- return error;
-
- cdf1->StartGlyph = GET_UShort();
- count = cdf1->GlyphCount = GET_UShort();
-
- FORGET_Frame();
-
- /* sanity check; we are limited to 16bit integers */
-
- if ( cdf1->StartGlyph + (long)count >= 0x10000L )
- return ERR(HB_Err_Invalid_SubTable);
-
- cdf1->ClassValueArray = NULL;
-
- if ( ALLOC_ARRAY( cdf1->ClassValueArray, count, HB_UShort ) )
- return error;
-
- cva = cdf1->ClassValueArray;
-
- if ( ACCESS_Frame( count * 2L ) )
- goto Fail;
-
- for ( n = 0; n < count; n++ )
- {
- cva[n] = GET_UShort();
- if ( cva[n] >= limit )
- {
- error = ERR(HB_Err_Invalid_SubTable);
- goto Fail;
- }
- }
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-
-Fail:
- FREE( cva );
-
- return error;
-}
-
-
-static void Free_ClassDef1( HB_ClassDefFormat1* cdf1 )
-{
- FREE( cdf1->ClassValueArray );
-}
-
-
-/* ClassDefFormat2 */
-
-static HB_Error Load_ClassDef2( HB_ClassDefinition* cd,
- HB_UShort limit,
- HB_Stream stream )
-{
- HB_Error error;
-
- HB_UShort n, count;
-
- HB_ClassRangeRecord* crr;
-
- HB_ClassDefFormat2* cdf2;
-
-
- cdf2 = &cd->cd.cd2;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- count = GET_UShort();
- cdf2->ClassRangeCount = 0; /* zero for now. we fill with the number of good entries later */
-
- FORGET_Frame();
-
- cdf2->ClassRangeRecord = NULL;
-
- if ( ALLOC_ARRAY( cdf2->ClassRangeRecord, count, HB_ClassRangeRecord ) )
- return error;
-
- crr = cdf2->ClassRangeRecord;
-
- if ( ACCESS_Frame( count * 6L ) )
- goto Fail;
-
- for ( n = 0; n < count; n++ )
- {
- crr[n].Start = GET_UShort();
- crr[n].End = GET_UShort();
- crr[n].Class = GET_UShort();
-
- /* sanity check */
-
- if ( crr[n].Start > crr[n].End ||
- crr[n].Class >= limit )
- {
- /* XXX
- * Corrupt entry. Skip it.
- * This is hit by Nafees Nastaliq font for example
- */
- n--;
- count--;
- }
- }
-
- FORGET_Frame();
-
- cdf2->ClassRangeCount = count;
-
- return HB_Err_Ok;
-
-Fail:
- FREE( crr );
-
- return error;
-}
-
-
-static void Free_ClassDef2( HB_ClassDefFormat2* cdf2 )
-{
- FREE( cdf2->ClassRangeRecord );
-}
-
-
-/* ClassDefinition */
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd,
- HB_UShort limit,
- HB_Stream stream )
-{
- HB_Error error;
-
- if ( ACCESS_Frame( 2L ) )
- return error;
-
- cd->ClassFormat = GET_UShort();
-
- FORGET_Frame();
-
- switch ( cd->ClassFormat )
- {
- case 1: error = Load_ClassDef1( cd, limit, stream ); break;
- case 2: error = Load_ClassDef2( cd, limit, stream ); break;
- default: error = ERR(HB_Err_Invalid_SubTable_Format); break;
- }
-
- if ( error )
- return error;
-
- cd->loaded = TRUE;
-
- return HB_Err_Ok;
-}
-
-
-static HB_Error
-_HB_OPEN_Load_EmptyClassDefinition( HB_ClassDefinition* cd )
-{
- HB_Error error;
-
- cd->ClassFormat = 1; /* Meaningless */
-
- if ( ALLOC_ARRAY( cd->cd.cd1.ClassValueArray, 1, HB_UShort ) )
- return error;
-
- cd->loaded = TRUE;
-
- return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_EmptyOrClassDefinition( HB_ClassDefinition* cd,
- HB_UShort limit,
- HB_UInt class_offset,
- HB_UInt base_offset,
- HB_Stream stream )
-{
- HB_Error error;
- HB_UInt cur_offset;
-
- cur_offset = FILE_Pos();
-
- if ( class_offset )
- {
- if ( !FILE_Seek( class_offset + base_offset ) )
- error = _HB_OPEN_Load_ClassDefinition( cd, limit, stream );
- }
- else
- error = _HB_OPEN_Load_EmptyClassDefinition ( cd );
-
- if (error == HB_Err_Ok)
- (void)FILE_Seek( cur_offset ); /* Changes error as a side-effect */
-
- return error;
-}
-
-HB_INTERNAL void
-_HB_OPEN_Free_ClassDefinition( HB_ClassDefinition* cd )
-{
- if ( !cd->loaded )
- return;
-
- switch ( cd->ClassFormat )
- {
- case 1: Free_ClassDef1( &cd->cd.cd1 ); break;
- case 2: Free_ClassDef2( &cd->cd.cd2 ); break;
- default: break;
- }
-}
-
-
-static HB_Error Get_Class1( HB_ClassDefFormat1* cdf1,
- HB_UShort glyphID,
- HB_UShort* klass,
- HB_UShort* index )
-{
- HB_UShort* cva = cdf1->ClassValueArray;
-
-
- if ( index )
- *index = 0;
-
- if ( glyphID >= cdf1->StartGlyph &&
- glyphID < cdf1->StartGlyph + cdf1->GlyphCount )
- {
- *klass = cva[glyphID - cdf1->StartGlyph];
- return HB_Err_Ok;
- }
- else
- {
- *klass = 0;
- return HB_Err_Not_Covered;
- }
-}
-
-
-/* we need the index value of the last searched class range record
- in case of failure for constructed GDEF tables */
-
-static HB_Error Get_Class2( HB_ClassDefFormat2* cdf2,
- HB_UShort glyphID,
- HB_UShort* klass,
- HB_UShort* index )
-{
- HB_Error error = HB_Err_Ok;
- HB_UShort min, max, new_min, new_max, middle;
-
- HB_ClassRangeRecord* crr = cdf2->ClassRangeRecord;
-
-
- /* binary search */
-
- if ( cdf2->ClassRangeCount == 0 )
- {
- *klass = 0;
- if ( index )
- *index = 0;
-
- return HB_Err_Not_Covered;
- }
-
- new_min = 0;
- new_max = cdf2->ClassRangeCount - 1;
-
- do
- {
- min = new_min;
- max = new_max;
-
- /* we use (min + max) / 2 = max - (max - min) / 2 to avoid
- overflow and rounding errors */
-
- middle = max - ( ( max - min ) >> 1 );
-
- if ( glyphID >= crr[middle].Start && glyphID <= crr[middle].End )
- {
- *klass = crr[middle].Class;
- error = HB_Err_Ok;
- break;
- }
- else if ( glyphID < crr[middle].Start )
- {
- if ( middle == min )
- {
- *klass = 0;
- error = HB_Err_Not_Covered;
- break;
- }
- new_max = middle - 1;
- }
- else
- {
- if ( middle == max )
- {
- *klass = 0;
- error = HB_Err_Not_Covered;
- break;
- }
- new_min = middle + 1;
- }
- } while ( min < max );
-
- if ( index )
- *index = middle;
-
- return error;
-}
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Get_Class( HB_ClassDefinition* cd,
- HB_UShort glyphID,
- HB_UShort* klass,
- HB_UShort* index )
-{
- switch ( cd->ClassFormat )
- {
- case 1: return Get_Class1( &cd->cd.cd1, glyphID, klass, index );
- case 2: return Get_Class2( &cd->cd.cd2, glyphID, klass, index );
- default: return ERR(HB_Err_Invalid_SubTable_Format);
- }
-
- return HB_Err_Ok; /* never reached */
-}
-
-
-
-/***************************
- * Device related functions
- ***************************/
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_Device( HB_Device** device,
- HB_Stream stream )
-{
- HB_Device* d;
- HB_Error error;
-
- HB_UShort n, count;
-
- HB_UShort* dv;
-
-
- if ( ACCESS_Frame( 6L ) )
- return error;
-
- if ( ALLOC( *device, sizeof(HB_Device)) )
- {
- *device = 0;
- return error;
- }
-
- d = *device;
-
- d->StartSize = GET_UShort();
- d->EndSize = GET_UShort();
- d->DeltaFormat = GET_UShort();
-
- FORGET_Frame();
-
- d->DeltaValue = NULL;
-
- if ( d->StartSize > d->EndSize ||
- d->DeltaFormat == 0 || d->DeltaFormat > 3 )
- {
- /* XXX
- * I've seen fontforge generate DeltaFormat == 0.
- * Just return Ok and let the NULL DeltaValue disable
- * this table.
- */
- return HB_Err_Ok;
- }
-
- count = ( ( d->EndSize - d->StartSize + 1 ) >>
- ( 4 - d->DeltaFormat ) ) + 1;
-
- if ( ALLOC_ARRAY( d->DeltaValue, count, HB_UShort ) )
- {
- FREE( *device );
- *device = 0;
- return error;
- }
-
- if ( ACCESS_Frame( count * 2L ) )
- {
- FREE( d->DeltaValue );
- FREE( *device );
- *device = 0;
- return error;
- }
-
- dv = d->DeltaValue;
-
- for ( n = 0; n < count; n++ )
- dv[n] = GET_UShort();
-
- FORGET_Frame();
-
- return HB_Err_Ok;
-}
-
-
-HB_INTERNAL void
-_HB_OPEN_Free_Device( HB_Device* d )
-{
- if ( d )
- {
- FREE( d->DeltaValue );
- FREE( d );
- }
-}
-
-
-/* Since we have the delta values stored in compressed form, we must
- uncompress it now. To simplify the interface, the function always
- returns a meaningful value in `value'; the error is just for
- information.
- | |
- format = 1: 0011223344556677|8899101112131415|...
- | |
- byte 1 byte 2
-
- 00: (byte >> 14) & mask
- 11: (byte >> 12) & mask
- ...
-
- mask = 0x0003
- | |
- format = 2: 0000111122223333|4444555566667777|...
- | |
- byte 1 byte 2
-
- 0000: (byte >> 12) & mask
- 1111: (byte >> 8) & mask
- ...
-
- mask = 0x000F
- | |
- format = 3: 0000000011111111|2222222233333333|...
- | |
- byte 1 byte 2
-
- 00000000: (byte >> 8) & mask
- 11111111: (byte >> 0) & mask
- ....
-
- mask = 0x00FF */
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Get_Device( HB_Device* d,
- HB_UShort size,
- HB_Short* value )
-{
- HB_UShort byte, bits, mask, s;
-
- if ( d && d->DeltaValue && size >= d->StartSize && size <= d->EndSize )
- {
- HB_UShort f = d->DeltaFormat;
- s = size - d->StartSize;
- byte = d->DeltaValue[s >> ( 4 - f )];
- bits = byte >> ( 16 - ( ( s % ( 1 << ( 4 - f ) ) + 1 ) << f ) );
- mask = 0xFFFF >> ( 16 - ( 1 << f ) );
-
- *value = (HB_Short)( bits & mask );
-
- /* conversion to a signed value */
-
- if ( *value >= ( ( mask + 1 ) >> 1 ) )
- *value -= mask + 1;
-
- return HB_Err_Ok;
- }
- else
- {
- *value = 0;
- return HB_Err_Not_Covered;
- }
-}
-
-
-/* END */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-open.h b/src/3rdparty/harfbuzz/src/harfbuzz-open.h
deleted file mode 100644
index 9ad7c98b2c..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-open.h
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_OPEN_H
-#define HARFBUZZ_OPEN_H
-
-#include "harfbuzz-global.h"
-
-HB_BEGIN_HEADER
-
-/* Use this if a feature applies to all glyphs */
-#define HB_ALL_GLYPHS 0xFFFF
-
-#define HB_DEFAULT_LANGUAGE 0xFFFF
-
-#define HB_MAX_NESTING_LEVEL 100
-
-
-/* Script list related structures */
-
-struct HB_LangSys_
-{
- HB_UShort* FeatureIndex; /* array of Feature indices */
- HB_UShort LookupOrderOffset; /* always 0 for TT Open 1.0 */
- HB_UShort ReqFeatureIndex; /* required FeatureIndex */
- HB_UShort FeatureCount; /* number of Feature indices */
-};
-
-typedef struct HB_LangSys_ HB_LangSys;
-
-
-struct HB_LangSysRecord_
-{
- HB_LangSys LangSys; /* LangSys table */
- HB_UInt LangSysTag; /* LangSysTag identifier */
-};
-
-typedef struct HB_LangSysRecord_ HB_LangSysRecord;
-
-
-struct HB_ScriptTable_
-{
- HB_LangSysRecord* LangSysRecord; /* array of LangSysRecords */
- HB_LangSys DefaultLangSys; /* DefaultLangSys table */
- HB_UShort LangSysCount; /* number of LangSysRecords */
-};
-
-typedef struct HB_ScriptTable_ HB_ScriptTable;
-
-
-struct HB_ScriptRecord_
-{
- HB_UInt ScriptTag; /* ScriptTag identifier */
- HB_ScriptTable Script; /* Script table */
-};
-
-typedef struct HB_ScriptRecord_ HB_ScriptRecord;
-
-
-struct HB_ScriptList_
-{
- HB_ScriptRecord* ScriptRecord; /* array of ScriptRecords */
- HB_UShort ScriptCount; /* number of ScriptRecords */
-};
-
-typedef struct HB_ScriptList_ HB_ScriptList;
-
-
-/* Feature list related structures */
-
-struct HB_Feature_
-{
- HB_UShort* LookupListIndex; /* array of LookupList indices */
- HB_UShort FeatureParams; /* always 0 for TT Open 1.0 */
- HB_UShort LookupListCount; /* number of LookupList indices */
-};
-
-typedef struct HB_Feature_ HB_Feature;
-
-
-struct HB_FeatureRecord_
-{
- HB_UInt FeatureTag; /* FeatureTag identifier */
- HB_Feature Feature; /* Feature table */
-};
-
-typedef struct HB_FeatureRecord_ HB_FeatureRecord;
-
-
-struct HB_FeatureList_
-{
- HB_UShort* ApplyOrder; /* order to apply features */
- HB_FeatureRecord* FeatureRecord; /* array of FeatureRecords */
- HB_UShort FeatureCount; /* number of FeatureRecords */
- HB_UShort ApplyCount; /* number of elements in ApplyOrder */
-};
-
-typedef struct HB_FeatureList_ HB_FeatureList;
-
-
-/* Lookup list related structures */
-
-typedef struct HB_SubTable_ HB_SubTable;
-
-
-struct HB_Lookup_
-{
- HB_SubTable* SubTable; /* array of SubTables */
- HB_UShort LookupType; /* Lookup type */
- HB_UShort LookupFlag; /* Lookup qualifiers */
- HB_UShort SubTableCount; /* number of SubTables */
-};
-
-typedef struct HB_Lookup_ HB_Lookup;
-
-
-/* The `Properties' field is not defined in the OpenType specification but
- is needed for processing lookups. If properties[n] is > 0, the
- functions HB_GSUB_Apply_String() resp. HB_GPOS_Apply_String() will
- process Lookup[n] for glyphs which have the specific bit not set in
- the `properties' field of the input string object. */
-
-struct HB_LookupList_
-{
- HB_Lookup* Lookup; /* array of Lookup records */
- HB_UInt* Properties; /* array of flags */
- HB_UShort LookupCount; /* number of Lookups */
-};
-
-typedef struct HB_LookupList_ HB_LookupList;
-
-
-/* Possible LookupFlag bit masks. `HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS' comes from the
- OpenType 1.2 specification; HB_LOOKUP_FLAG_RIGHT_TO_LEFT has been (re)introduced in
- OpenType 1.3 -- if set, the last glyph in a cursive attachment
- sequence has to be positioned on the baseline -- regardless of the
- writing direction. */
-
-#define HB_LOOKUP_FLAG_RIGHT_TO_LEFT 0x0001
-#define HB_LOOKUP_FLAG_IGNORE_BASE_GLYPHS 0x0002
-#define HB_LOOKUP_FLAG_IGNORE_LIGATURES 0x0004
-#define HB_LOOKUP_FLAG_IGNORE_MARKS 0x0008
-#define HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS 0xFF00
-
-
-struct HB_CoverageFormat1_
-{
- HB_UShort* GlyphArray; /* array of glyph IDs */
- HB_UShort GlyphCount; /* number of glyphs in GlyphArray */
-};
-
-typedef struct HB_CoverageFormat1_ HB_CoverageFormat1;
-
-
-struct HB_RangeRecord_
-{
- HB_UShort Start; /* first glyph ID in the range */
- HB_UShort End; /* last glyph ID in the range */
- HB_UShort StartCoverageIndex; /* coverage index of first
- glyph ID in the range */
-};
-
-typedef struct HB_RangeRecord_ HB_RangeRecord;
-
-
-struct HB_CoverageFormat2_
-{
- HB_RangeRecord* RangeRecord; /* array of RangeRecords */
- HB_UShort RangeCount; /* number of RangeRecords */
-};
-
-typedef struct HB_CoverageFormat2_ HB_CoverageFormat2;
-
-
-struct HB_Coverage_
-{
- HB_Byte CoverageFormat; /* 1 or 2 */
-
- union
- {
- HB_CoverageFormat1 cf1;
- HB_CoverageFormat2 cf2;
- } cf;
-};
-
-typedef struct HB_Coverage_ HB_Coverage;
-
-
-struct HB_ClassDefFormat1_
-{
- HB_UShort* ClassValueArray; /* array of class values */
- HB_UShort StartGlyph; /* first glyph ID of the
- ClassValueArray */
- HB_UShort GlyphCount; /* size of the ClassValueArray */
-};
-
-typedef struct HB_ClassDefFormat1_ HB_ClassDefFormat1;
-
-
-struct HB_ClassRangeRecord_
-{
- HB_UShort Start; /* first glyph ID in the range */
- HB_UShort End; /* last glyph ID in the range */
- HB_UShort Class; /* applied to all glyphs in range */
-};
-
-typedef struct HB_ClassRangeRecord_ HB_ClassRangeRecord;
-
-
-struct HB_ClassDefFormat2_
-{
- HB_ClassRangeRecord* ClassRangeRecord;
- /* array of ClassRangeRecords */
- HB_UShort ClassRangeCount;
- /* number of ClassRangeRecords */
-};
-
-typedef struct HB_ClassDefFormat2_ HB_ClassDefFormat2;
-
-
-struct HB_ClassDefinition_
-{
- union
- {
- HB_ClassDefFormat1 cd1;
- HB_ClassDefFormat2 cd2;
- } cd;
-
- HB_Byte ClassFormat; /* 1 or 2 */
- HB_Bool loaded;
-};
-
-typedef struct HB_ClassDefinition_ HB_ClassDefinition;
-
-
-struct HB_Device_
-{
- HB_UShort* DeltaValue; /* array of compressed data */
- HB_UShort StartSize; /* smallest size to correct */
- HB_UShort EndSize; /* largest size to correct */
- HB_Byte DeltaFormat; /* DeltaValue array data format:
- 1, 2, or 3 */
-};
-
-typedef struct HB_Device_ HB_Device;
-
-
-enum HB_Type_
-{
- HB_Type_GSUB,
- HB_Type_GPOS
-};
-
-typedef enum HB_Type_ HB_Type;
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_OPEN_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shape.h b/src/3rdparty/harfbuzz/src/harfbuzz-shape.h
deleted file mode 100644
index e4b5f9ad8a..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-shape.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2006 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor
- */
-
-#include <stdint.h>
-
-/* Base Types */
-
-typedef hb_uint16 HB_CodePoint; /* UTF-16 codepoint (not character ) */
-typedef char HB_Boolean;
-typedef hb_uint32 HB_Fixed; /* 26.6 */
-typedef hb_uint32 HB_Glyph;
-typedef hb_uint32 HB_Unichar;
-
-/* Metrics reported by the font backend for use of the shaper */
-typedef struct _HB_GlyphMetrics HB_GlyphMetrics;
-struct _HB_GlyphMetrics
-{
- HB_Fixed advance;
-
- /* Do we need ink/logical extents for the glyph here? */
-};
-
-/*
- * HB_Font: Abstract font interface.
- * First pass of this might just have FT_Face *getFace();
- */
-typedef struct _HB_Font HB_Font;
-typedef struct _HB_FontClass HB_FontClass;
-
-struct HB_FontClass {
- HB_Glyph (*charToGlyph)(HB_Font *font, HB_Unichar chr);
- void (*getMetrics)(HB_Font *font, HB_Glyph glyph, HB_GlyphMetrics *metrics);
- HB_Boolean (*getSFontTable)(HB_Font *font, void **cookie, char **start, int *len);
- HB_Boolean (*freeSFontTable)(void **cookie);
-};
-
-struct _HB_Font {
- HB_FontClass *clazz;
-};
-
-/*
- * Language tags, of the form en-us; represented as interned, canonicalized
- * strings. hb_language_from_string("en_US"), hb_language_from_string("en-us")
- * both return the same (pointer-comparable) HB_Language).
- */
-typedef struct HB_Language_ *HB_Language;
-
-HB_Language hb_language_from_string(const char *str);
-const char *hb_language_to_string(HB_Language language);
-
-/* Special treatment for the edges of runs.
- */
-typedef enum {
- HB_RUN_EDGE_LINE_VISUAL_EDGE = 1 << 0,
- HB_RUN_EDGE_LINE_LOGICAL_EDGE = 1 << 1,
- HB_RUN_EDGE_LINE_ADD_HYPHEN = 1 << 2 /* ???? */
-} HB_RunEdge;
-
-/* Defines optional informaiton in HB_ShapeInput; this allows extension
- * of HB_ShapeInput while keeping binary compatibility
- */
-typedef enum {
- HB_SHAPE_START_TYPE = 1 << 0,
- HB_SHAPE_END_TYPE = 1 << 1
-} HB_ShapeFlags;
-
-/* Attributes types are described by "interned strings"; this is a little
- * annoying if you want to write a switch statement, but keeps things
- * simple.
- */
-typedef struct _HB_AttributeType *HB_AttributeType;
-
-HB_AttributeType hb_attribute_type_from_string(const char *str);
-const char *hb_attribute_type_to_string(HB_AttributeType attribute_type);
-
-struct HB_Attribute {
- HB_AttributeType type;
- int start;
- int end;
-};
-
-
-/**
- * You could handle this like HB_Language, but an enum seems a little nicer;
- * another approach would be to use OpenType script tags.
- */
-typedef enum {
- HB_SCRIPT_LATIN
- /* ... */
-} HB_ShapeScript;
-
-/* This is just the subset of direction information needed by the shaper */
-typedef enum {
- HB_DIRECTION_LTR,
- HB_DIRECTION_RTL,
- HB_DIRECTION_TTB
-} HB_Direction;
-
-typedef struct _HB_ShapeInput HB_ShapeInput;
-struct _HB_ShapeInput {
- /* Defines what fields the caller has initialized - fields not in
- * the enum are mandatory.
- */
- HB_ShapeFlags flags;
-
- HB_CodePoint *text;
- int length; /* total length of text to shape */
- int shape_offset; /* start of section to shape */
- int shape_length; /* number of code points to shape */
-
- HB_Direction direction;
- HB_ShapeScript script;
- HB_Language language;
-
- HB_AttributeType *attributes;
- int n_attributes;
-
- HB_RunEdge start_type;
- HB_RunEdge end_type;
-};
-
-struct HB_GlyphItem {
- HB_Glyph glyph;
-
- HB_Fixed x_offset;
- HB_Fixed y_offset;
- HB_Fixed advance;
-
- /* Add kashida information, etc, here */
-};
-
-typedef enum {
- HB_RESULT_SUCCESS,
- HB_RESULT_NO_MEMORY,
- HB_SHAPE_RESULT_FAILED
-} HB_Result;
-
-/*
- * Buffer for output
- */
-typedef struct _HB_GlyphBuffer HB_GlyphBuffer;
-struct _HB_GlyphBuffer {
- int glyph_item_size;
- int total_glyphs;
-
- int *log_clusters; /* Uniscribe style */
- int cluster_space;
-
- int glyph_space;
- void *glyph_buffer;
-};
-
-/* Making this self-allocating simplifies writing shapers and
- * also keeps things easier for caller. item_size passed in
- * must be at least sizeof(HB_GlyphItem) but can be bigger,
- * to accomodate application structures that extend HB_GlyphItem.
- * The allocated items will be zero-initialized.
- *
- * (Hack: Harfbuzz could choose to use even a *bigger* item size
- * and stick internal information before the public item structure.
- * This hack could possibly be used to unify this with HB_Buffer)
- */
-HB_GlyphBuffer *hb_glyph_buffer_new (size_t item_size);
-void hb_glyph_buffer_clear (HB_GlyphBuffer *buf);
-HB_Result hb_glyph_buffer_extend_glyphs (HB_GlyphBuffer *buf, int n_items);
-HB_Result hb_glyph_buffer_extend_clusters (HB_GlyphBuffer *buf, int n_clusters);
-void hb_glyph_buffer_free (HB_GlyphBuffer *buf);
-
-
-/* Accessor for a particular glyph */
-#define HB_GLYPH_BUFFER_ITEM(buffer, index)
-
-/*
- * Main shaping function
- */
-HB_Result hb_shape(HB_ShapeInput *input, HB_GlyphBuffer *output);
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper-all.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-shaper-all.cpp
deleted file mode 100644
index 773f948164..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper-all.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.cpp"
-#include "harfbuzz-indic.cpp"
-extern "C" {
-#include "harfbuzz-greek.c"
-#include "harfbuzz-tibetan.c"
-#include "harfbuzz-khmer.c"
-#include "harfbuzz-hebrew.c"
-#include "harfbuzz-arabic.c"
-#include "harfbuzz-hangul.c"
-#include "harfbuzz-myanmar.c"
-#include "harfbuzz-thai.c"
-}
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-shaper-private.h
deleted file mode 100644
index 870e9df01c..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper-private.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_SHAPER_PRIVATE_H
-#define HARFBUZZ_SHAPER_PRIVATE_H
-
-HB_BEGIN_HEADER
-
-enum {
- C_DOTTED_CIRCLE = 0x25CC
-};
-
-typedef enum
-{
- HB_Combining_BelowLeftAttached = 200,
- HB_Combining_BelowAttached = 202,
- HB_Combining_BelowRightAttached = 204,
- HB_Combining_LeftAttached = 208,
- HB_Combining_RightAttached = 210,
- HB_Combining_AboveLeftAttached = 212,
- HB_Combining_AboveAttached = 214,
- HB_Combining_AboveRightAttached = 216,
-
- HB_Combining_BelowLeft = 218,
- HB_Combining_Below = 220,
- HB_Combining_BelowRight = 222,
- HB_Combining_Left = 224,
- HB_Combining_Right = 226,
- HB_Combining_AboveLeft = 228,
- HB_Combining_Above = 230,
- HB_Combining_AboveRight = 232,
-
- HB_Combining_DoubleBelow = 233,
- HB_Combining_DoubleAbove = 234,
- HB_Combining_IotaSubscript = 240
-} HB_CombiningClass;
-
-typedef enum {
- LocaProperty = 0x1,
- CcmpProperty = 0x2,
- InitProperty = 0x4,
- IsolProperty = 0x8,
- FinaProperty = 0x10,
- MediProperty = 0x20,
- RligProperty = 0x40,
- CaltProperty = 0x80,
- LigaProperty = 0x100,
- DligProperty = 0x200,
- CswhProperty = 0x400,
- MsetProperty = 0x800,
-
- /* used by indic and myanmar shaper */
- NuktaProperty = 0x8,
- AkhantProperty = 0x10,
- RephProperty = 0x20,
- PreFormProperty = 0x40,
- BelowFormProperty = 0x80,
- AboveFormProperty = 0x100,
- HalfFormProperty = 0x200,
- PostFormProperty = 0x400,
- ConjunctFormProperty = 0x800,
- VattuProperty = 0x1000,
- PreSubstProperty = 0x2000,
- BelowSubstProperty = 0x4000,
- AboveSubstProperty = 0x8000,
- PostSubstProperty = 0x10000,
- HalantProperty = 0x20000,
- CligProperty = 0x40000,
- IndicCaltProperty = 0x80000
-
-} HB_OpenTypeProperty;
-
-/* return true if ok. */
-typedef HB_Bool (*HB_ShapeFunction)(HB_ShaperItem *shaper_item);
-typedef void (*HB_AttributeFunction)(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
-
-typedef struct {
- HB_ShapeFunction shape;
- HB_AttributeFunction charAttributes;
-} HB_ScriptEngine;
-
-extern const HB_ScriptEngine hb_scriptEngines[];
-
-extern HB_Bool HB_BasicShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_GreekShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_TibetanShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_HebrewShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_ArabicShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_HangulShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_MyanmarShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_KhmerShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_IndicShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_ThaiShape(HB_ShaperItem *shaper_item);
-
-extern void HB_TibetanAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
-
-extern void HB_MyanmarAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
-
-extern void HB_KhmerAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
-
-extern void HB_IndicAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
-
-extern void HB_ThaiAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
-
-#ifndef NO_OPENTYPE
-typedef struct {
- hb_uint32 tag;
- hb_uint32 property;
-} HB_OpenTypeFeature;
-
-#define PositioningProperties 0x80000000
-
-HB_Bool HB_SelectScript(HB_ShaperItem *item, const HB_OpenTypeFeature *features);
-
-HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties);
-HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool doLogClusters);
-#endif // NO_OPENTYPE
-
-void HB_HeuristicPosition(HB_ShaperItem *item);
-void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item);
-
-#define HB_IsControlChar(uc) \
- ((uc >= 0x200b && uc <= 0x200f /* ZW Space, ZWNJ, ZWJ, LRM and RLM */) \
- || (uc >= 0x2028 && uc <= 0x202e /* LS, PS, LRE, RLE, PDF, LRO, RLO */) \
- || (uc >= 0x206a && uc <= 0x206f /* ISS, ASS, IAFS, AFS, NADS, NODS */))
-
-HB_Bool HB_ConvertStringToGlyphIndices(HB_ShaperItem *shaper_item);
-
-#define HB_GetGlyphAdvances(shaper_item) \
- shaper_item->font->klass->getGlyphAdvances(shaper_item->font, \
- shaper_item->glyphs, shaper_item->num_glyphs, \
- shaper_item->advances, \
- shaper_item->face->current_flags);
-
-#define HB_DECLARE_STACKARRAY(Type, Name) \
- Type stack##Name[512]; \
- Type *Name = stack##Name;
-
-#define HB_INIT_STACKARRAY(Type, Name, Length) \
- if ((Length) >= 512) \
- Name = (Type *)malloc((Length) * sizeof(Type));
-
-#define HB_STACKARRAY(Type, Name, Length) \
- HB_DECLARE_STACKARRAY(Type, Name) \
- HB_INIT_STACKARRAY(Type, Name, Length)
-
-#define HB_FREE_STACKARRAY(Name) \
- if (stack##Name != Name) \
- free(Name);
-
-HB_END_HEADER
-
-#endif
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp
deleted file mode 100644
index 82977db5e7..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp
+++ /dev/null
@@ -1,1111 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include "harfbuzz-stream-private.h"
-#include <assert.h>
-#include <stdio.h>
-
-#define HB_MIN(a, b) ((a) < (b) ? (a) : (b))
-#define HB_MAX(a, b) ((a) > (b) ? (a) : (b))
-
-// --------------------------------------------------------------------------------------------------------------------------------------------
-//
-// Basic processing
-//
-// --------------------------------------------------------------------------------------------------------------------------------------------
-
-static inline void positionCluster(HB_ShaperItem *item, int gfrom, int glast)
-{
- int nmarks = glast - gfrom;
- assert(nmarks > 0);
-
- HB_Glyph *glyphs = item->glyphs;
- HB_GlyphAttributes *attributes = item->attributes;
-
- HB_GlyphMetrics baseMetrics;
- item->font->klass->getGlyphMetrics(item->font, glyphs[gfrom], &baseMetrics);
-
- if (item->item.script == HB_Script_Hebrew
- && (-baseMetrics.y) > baseMetrics.height)
- // we need to attach below the baseline, because of the hebrew iud.
- baseMetrics.height = -baseMetrics.y;
-
-// qDebug("---> positionCluster: cluster from %d to %d", gfrom, glast);
-// qDebug("baseInfo: %f/%f (%f/%f) off=%f/%f", baseInfo.x, baseInfo.y, baseInfo.width, baseInfo.height, baseInfo.xoff, baseInfo.yoff);
-
- HB_Fixed size = item->font->klass->getFontMetric(item->font, HB_FontAscent) / 10;
- HB_Fixed offsetBase = HB_FIXED_CONSTANT(1) + (size - HB_FIXED_CONSTANT(4)) / 4;
- if (size > HB_FIXED_CONSTANT(4))
- offsetBase += HB_FIXED_CONSTANT(4);
- else
- offsetBase += size;
- //qreal offsetBase = (size - 4) / 4 + qMin<qreal>(size, 4) + 1;
-// qDebug("offset = %f", offsetBase);
-
- // To fix some Thai character heights check for two above glyphs
- if (nmarks == 2 && (attributes[gfrom+1].combiningClass == HB_Combining_AboveRight ||
- attributes[gfrom+1].combiningClass == HB_Combining_AboveLeft ||
- attributes[gfrom+1].combiningClass == HB_Combining_Above))
- if (attributes[gfrom+2].combiningClass == 23 ||
- attributes[gfrom+2].combiningClass == 24 ||
- attributes[gfrom+2].combiningClass == 25 ||
- attributes[gfrom+2].combiningClass == 27 ||
- attributes[gfrom+2].combiningClass == 28 ||
- attributes[gfrom+2].combiningClass == 30 ||
- attributes[gfrom+2].combiningClass == 31 ||
- attributes[gfrom+2].combiningClass == 33 ||
- attributes[gfrom+2].combiningClass == 34 ||
- attributes[gfrom+2].combiningClass == 35 ||
- attributes[gfrom+2].combiningClass == 36 ||
- attributes[gfrom+2].combiningClass == 107 ||
- attributes[gfrom+2].combiningClass == 122) {
- // Two above glyphs, check total height
- int markTotalHeight = baseMetrics.height;
- HB_GlyphMetrics markMetrics;
- item->font->klass->getGlyphMetrics(item->font, glyphs[gfrom+1], &markMetrics);
- markTotalHeight += markMetrics.height;
- item->font->klass->getGlyphMetrics(item->font, glyphs[gfrom+2], &markMetrics);
- markTotalHeight += markMetrics.height;
- if ((markTotalHeight + 2 * offsetBase) > (size * 10))
- offsetBase = ((size * 10) - markTotalHeight) / 2; // Use offset that just fits
- }
-
- const bool rightToLeft = (item->item.bidiLevel % 2) != 0;
-
- int i;
- unsigned char lastCmb = 0;
- HB_GlyphMetrics attachmentRect;
- memset(&attachmentRect, 0, sizeof(attachmentRect));
-
- for(i = 1; i <= nmarks; i++) {
- HB_Glyph mark = glyphs[gfrom+i];
- HB_GlyphMetrics markMetrics;
- item->font->klass->getGlyphMetrics(item->font, mark, &markMetrics);
- HB_FixedPoint p;
- p.x = p.y = 0;
-// qDebug("markInfo: %f/%f (%f/%f) off=%f/%f", markInfo.x, markInfo.y, markInfo.width, markInfo.height, markInfo.xoff, markInfo.yoff);
-
- HB_Fixed offset = offsetBase;
- unsigned char cmb = attributes[gfrom+i].combiningClass;
-
- // ### maybe the whole position determination should move down to heuristicSetGlyphAttributes. Would save some
- // bits in the glyphAttributes structure.
- if (cmb < 200) {
- // fixed position classes. We approximate by mapping to one of the others.
- // currently I added only the ones for arabic, hebrew, lao and thai.
-
- // for Lao and Thai marks with class 0, see below (heuristicSetGlyphAttributes)
-
- // add a bit more offset to arabic, a bit hacky
- if (cmb >= 27 && cmb <= 36 && offset < 3)
- offset +=1;
- // below
- if ((cmb >= 10 && cmb <= 18) ||
- cmb == 20 || cmb == 22 ||
- cmb == 29 || cmb == 32)
- cmb = HB_Combining_Below;
- // above
- else if (cmb == 23 || cmb == 27 || cmb == 28 ||
- cmb == 30 || cmb == 31 || (cmb >= 33 && cmb <= 36))
- cmb = HB_Combining_Above;
- //below-right
- else if (cmb == 9 || cmb == 103 || cmb == 118)
- cmb = HB_Combining_BelowRight;
- // above-right
- else if (cmb == 24 || cmb == 107 || cmb == 122)
- cmb = HB_Combining_AboveRight;
- else if (cmb == 25)
- cmb = HB_Combining_AboveLeft;
- // fixed:
- // 19 21
-
- }
-
- // combining marks of different class don't interact. Reset the rectangle.
- if (cmb != lastCmb) {
- //qDebug("resetting rect");
- attachmentRect = baseMetrics;
- }
-
- switch(cmb) {
- case HB_Combining_DoubleBelow:
- // ### wrong in rtl context!
- case HB_Combining_BelowLeft:
- p.y += offset;
- // fall through
- case HB_Combining_BelowLeftAttached:
- p.x += attachmentRect.x - markMetrics.x;
- p.y += (attachmentRect.y + attachmentRect.height) - markMetrics.y;
- break;
- case HB_Combining_Below:
- p.y += offset;
- // fall through
- case HB_Combining_BelowAttached:
- p.x += attachmentRect.x - markMetrics.x;
- p.y += (attachmentRect.y + attachmentRect.height) - markMetrics.y;
-
- p.x += (attachmentRect.width - markMetrics.width) / 2;
- break;
- case HB_Combining_BelowRight:
- p.y += offset;
- // fall through
- case HB_Combining_BelowRightAttached:
- p.x += attachmentRect.x + attachmentRect.width - markMetrics.width - markMetrics.x;
- p.y += attachmentRect.y + attachmentRect.height - markMetrics.y;
- break;
- case HB_Combining_Left:
- p.x -= offset;
- // fall through
- case HB_Combining_LeftAttached:
- break;
- case HB_Combining_Right:
- p.x += offset;
- // fall through
- case HB_Combining_RightAttached:
- break;
- case HB_Combining_DoubleAbove:
- // ### wrong in RTL context!
- case HB_Combining_AboveLeft:
- p.y -= offset;
- // fall through
- case HB_Combining_AboveLeftAttached:
- p.x += attachmentRect.x - markMetrics.x;
- p.y += attachmentRect.y - markMetrics.y - markMetrics.height;
- break;
- case HB_Combining_Above:
- p.y -= offset;
- // fall through
- case HB_Combining_AboveAttached:
- p.x += attachmentRect.x - markMetrics.x;
- p.y += attachmentRect.y - markMetrics.y - markMetrics.height;
-
- p.x += (attachmentRect.width - markMetrics.width) / 2;
- break;
- case HB_Combining_AboveRight:
- p.y -= offset;
- // fall through
- case HB_Combining_AboveRightAttached:
- p.x += attachmentRect.x + attachmentRect.width - markMetrics.x - markMetrics.width;
- p.y += attachmentRect.y - markMetrics.y - markMetrics.height;
- break;
-
- case HB_Combining_IotaSubscript:
- default:
- break;
- }
-// qDebug("char=%x combiningClass = %d offset=%f/%f", mark, cmb, p.x(), p.y());
- markMetrics.x += p.x;
- markMetrics.y += p.y;
-
- HB_GlyphMetrics unitedAttachmentRect = attachmentRect;
- unitedAttachmentRect.x = HB_MIN(attachmentRect.x, markMetrics.x);
- unitedAttachmentRect.y = HB_MIN(attachmentRect.y, markMetrics.y);
- unitedAttachmentRect.width = HB_MAX(attachmentRect.x + attachmentRect.width, markMetrics.x + markMetrics.width) - unitedAttachmentRect.x;
- unitedAttachmentRect.height = HB_MAX(attachmentRect.y + attachmentRect.height, markMetrics.y + markMetrics.height) - unitedAttachmentRect.y;
- attachmentRect = unitedAttachmentRect;
-
- lastCmb = cmb;
- if (rightToLeft) {
- item->offsets[gfrom+i].x = p.x;
- item->offsets[gfrom+i].y = p.y;
- } else {
- item->offsets[gfrom+i].x = p.x - baseMetrics.xOffset;
- item->offsets[gfrom+i].y = p.y - baseMetrics.yOffset;
- }
- item->advances[gfrom+i] = 0;
- }
-}
-
-void HB_HeuristicPosition(HB_ShaperItem *item)
-{
- HB_GetGlyphAdvances(item);
- HB_GlyphAttributes *attributes = item->attributes;
-
- int cEnd = -1;
- int i = item->num_glyphs;
- while (i--) {
- if (cEnd == -1 && attributes[i].mark) {
- cEnd = i;
- } else if (cEnd != -1 && !attributes[i].mark) {
- positionCluster(item, i, cEnd);
- cEnd = -1;
- }
- }
-}
-
-// set the glyph attributes heuristically. Assumes a 1 to 1 relationship between chars and glyphs
-// and no reordering.
-// also computes logClusters heuristically
-void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item)
-{
- const HB_UChar16 *uc = item->string + item->item.pos;
- hb_uint32 length = item->item.length;
-
- // ### zeroWidth and justification are missing here!!!!!
-
- assert(item->num_glyphs <= length);
-
-// qDebug("QScriptEngine::heuristicSetGlyphAttributes, num_glyphs=%d", item->num_glyphs);
- HB_GlyphAttributes *attributes = item->attributes;
- unsigned short *logClusters = item->log_clusters;
-
- hb_uint32 glyph_pos = 0;
- hb_uint32 i;
- for (i = 0; i < length; i++) {
- if (HB_IsHighSurrogate(uc[i]) && i < length - 1
- && HB_IsLowSurrogate(uc[i + 1])) {
- logClusters[i] = glyph_pos;
- logClusters[++i] = glyph_pos;
- } else {
- logClusters[i] = glyph_pos;
- }
- ++glyph_pos;
- }
- assert(glyph_pos == item->num_glyphs);
-
- // first char in a run is never (treated as) a mark
- int cStart = 0;
- const bool symbolFont = item->face->isSymbolFont != 0;
- attributes[0].mark = false;
- attributes[0].clusterStart = true;
- attributes[0].dontPrint = (!symbolFont && uc[0] == 0x00ad) || HB_IsControlChar(uc[0]);
-
- int pos = 0;
- HB_CharCategory lastCat;
- int dummy;
- HB_GetUnicodeCharProperties(uc[0], &lastCat, &dummy);
- for (i = 1; i < length; ++i) {
- if (logClusters[i] == pos)
- // same glyph
- continue;
- ++pos;
- while (pos < logClusters[i]) {
- attributes[pos] = attributes[pos-1];
- ++pos;
- }
- // hide soft-hyphens by default
- if ((!symbolFont && uc[i] == 0x00ad) || HB_IsControlChar(uc[i]))
- attributes[pos].dontPrint = true;
- HB_CharCategory cat;
- int cmb;
- HB_GetUnicodeCharProperties(uc[i], &cat, &cmb);
- if (cat != HB_Mark_NonSpacing) {
- attributes[pos].mark = false;
- attributes[pos].clusterStart = true;
- attributes[pos].combiningClass = 0;
- cStart = logClusters[i];
- } else {
- if (cmb == 0) {
- // Fix 0 combining classes
- if ((uc[pos] & 0xff00) == 0x0e00) {
- // thai or lao
- if (uc[pos] == 0xe31 ||
- uc[pos] == 0xe34 ||
- uc[pos] == 0xe35 ||
- uc[pos] == 0xe36 ||
- uc[pos] == 0xe37 ||
- uc[pos] == 0xe47 ||
- uc[pos] == 0xe4c ||
- uc[pos] == 0xe4d ||
- uc[pos] == 0xe4e) {
- cmb = HB_Combining_AboveRight;
- } else if (uc[pos] == 0xeb1 ||
- uc[pos] == 0xeb4 ||
- uc[pos] == 0xeb5 ||
- uc[pos] == 0xeb6 ||
- uc[pos] == 0xeb7 ||
- uc[pos] == 0xebb ||
- uc[pos] == 0xecc ||
- uc[pos] == 0xecd) {
- cmb = HB_Combining_Above;
- } else if (uc[pos] == 0xebc) {
- cmb = HB_Combining_Below;
- }
- }
- }
-
- attributes[pos].mark = true;
- attributes[pos].clusterStart = false;
- attributes[pos].combiningClass = cmb;
- logClusters[i] = cStart;
- }
- // one gets an inter character justification point if the current char is not a non spacing mark.
- // as then the current char belongs to the last one and one gets a space justification point
- // after the space char.
- if (lastCat == HB_Separator_Space)
- attributes[pos-1].justification = HB_Space;
- else if (cat != HB_Mark_NonSpacing)
- attributes[pos-1].justification = HB_Character;
- else
- attributes[pos-1].justification = HB_NoJustification;
-
- lastCat = cat;
- }
- pos = logClusters[length-1];
- if (lastCat == HB_Separator_Space)
- attributes[pos].justification = HB_Space;
- else
- attributes[pos].justification = HB_Character;
-}
-
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature basic_features[] = {
- { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
- { HB_MAKE_TAG('l', 'i', 'g', 'a'), LigaProperty },
- { HB_MAKE_TAG('c', 'l', 'i', 'g'), CligProperty },
- {0, 0}
-};
-
-static const HB_OpenTypeFeature disabled_features[] = {
- { HB_MAKE_TAG('c', 'p', 'c', 't'), PositioningProperties },
- { HB_MAKE_TAG('h', 'a', 'l', 't'), PositioningProperties },
- // TODO: we need to add certain HB_ShaperFlag for vertical
- // writing mode to enable these vertical writing features:
- { HB_MAKE_TAG('v', 'a', 'l', 't'), PositioningProperties },
- { HB_MAKE_TAG('v', 'h', 'a', 'l'), PositioningProperties },
- { HB_MAKE_TAG('v', 'k', 'r', 'n'), PositioningProperties },
- { HB_MAKE_TAG('v', 'p', 'a', 'l'), PositioningProperties },
- {0, 0}
-};
-#endif
-
-HB_Bool HB_ConvertStringToGlyphIndices(HB_ShaperItem *shaper_item)
-{
- if (shaper_item->glyphIndicesPresent) {
- shaper_item->num_glyphs = shaper_item->initialGlyphCount;
- shaper_item->glyphIndicesPresent = false;
- return true;
- }
- return shaper_item->font->klass
- ->convertStringToGlyphIndices(shaper_item->font,
- shaper_item->string + shaper_item->item.pos, shaper_item->item.length,
- shaper_item->glyphs, &shaper_item->num_glyphs,
- shaper_item->item.bidiLevel % 2);
-}
-
-HB_Bool HB_BasicShape(HB_ShaperItem *shaper_item)
-{
-#ifndef NO_OPENTYPE
- const int availableGlyphs = shaper_item->num_glyphs;
-#endif
-
- if (!HB_ConvertStringToGlyphIndices(shaper_item))
- return false;
-
- HB_HeuristicSetGlyphAttributes(shaper_item);
-
-#ifndef NO_OPENTYPE
- if (HB_SelectScript(shaper_item, basic_features)) {
- HB_OpenTypeShape(shaper_item, /*properties*/0);
- return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/true);
- }
-#endif
-
- HB_HeuristicPosition(shaper_item);
- return true;
-}
-
-const HB_ScriptEngine HB_ScriptEngines[] = {
- // Common
- { HB_BasicShape, 0},
- // Greek
- { HB_GreekShape, 0},
- // Cyrillic
- { HB_BasicShape, 0},
- // Armenian
- { HB_BasicShape, 0},
- // Hebrew
- { HB_HebrewShape, 0 },
- // Arabic
- { HB_ArabicShape, 0},
- // Syriac
- { HB_ArabicShape, 0},
- // Thaana
- { HB_BasicShape, 0 },
- // Devanagari
- { HB_IndicShape, HB_IndicAttributes },
- // Bengali
- { HB_IndicShape, HB_IndicAttributes },
- // Gurmukhi
- { HB_IndicShape, HB_IndicAttributes },
- // Gujarati
- { HB_IndicShape, HB_IndicAttributes },
- // Oriya
- { HB_IndicShape, HB_IndicAttributes },
- // Tamil
- { HB_IndicShape, HB_IndicAttributes },
- // Telugu
- { HB_IndicShape, HB_IndicAttributes },
- // Kannada
- { HB_IndicShape, HB_IndicAttributes },
- // Malayalam
- { HB_IndicShape, HB_IndicAttributes },
- // Sinhala
- { HB_IndicShape, HB_IndicAttributes },
- // Thai
- { HB_ThaiShape, HB_ThaiAttributes },
- // Lao
- { HB_BasicShape, 0 },
- // Tibetan
- { HB_TibetanShape, HB_TibetanAttributes },
- // Myanmar
- { HB_MyanmarShape, HB_MyanmarAttributes },
- // Georgian
- { HB_BasicShape, 0 },
- // Hangul
- { HB_HangulShape, 0 },
- // Ogham
- { HB_BasicShape, 0 },
- // Runic
- { HB_BasicShape, 0 },
- // Khmer
- { HB_KhmerShape, HB_KhmerAttributes },
- // N'Ko
- { HB_ArabicShape, 0}
-};
-
-void HB_GetTailoredCharAttributes(const HB_UChar16 *string, hb_uint32 stringLength,
- const HB_ScriptItem *items, hb_uint32 numItems,
- HB_CharAttributes *attributes)
-{
- if (stringLength == 0)
- return;
- for (hb_uint32 i = 0; i < numItems; ++i) {
- HB_Script script = items[i].script;
- if (script == HB_Script_Inherited)
- script = HB_Script_Common;
- HB_AttributeFunction attributeFunction = HB_ScriptEngines[script].charAttributes;
- if (!attributeFunction)
- continue;
- attributeFunction(script, string, items[i].pos, items[i].length, attributes);
- }
-}
-
-
-static inline char *tag_to_string(HB_UInt tag)
-{
- static char string[5];
- string[0] = (tag >> 24)&0xff;
- string[1] = (tag >> 16)&0xff;
- string[2] = (tag >> 8)&0xff;
- string[3] = tag&0xff;
- string[4] = 0;
- return string;
-}
-
-#ifdef OT_DEBUG
-static void dump_string(HB_Buffer buffer)
-{
- for (uint i = 0; i < buffer->in_length; ++i) {
- qDebug(" %x: cluster=%d", buffer->in_string[i].gindex, buffer->in_string[i].cluster);
- }
-}
-#define DEBUG printf
-#else
-#define DEBUG if (1) ; else printf
-#endif
-
-#define DefaultLangSys 0xffff
-#define DefaultScript HB_MAKE_TAG('D', 'F', 'L', 'T')
-
-enum {
- RequiresGsub = 1,
- RequiresGpos = 2
-};
-
-struct OTScripts {
- unsigned int tag;
- int flags;
-};
-static const OTScripts ot_scripts [] = {
- // Common
- { HB_MAKE_TAG('l', 'a', 't', 'n'), 0 },
- // Greek
- { HB_MAKE_TAG('g', 'r', 'e', 'k'), 0 },
- // Cyrillic
- { HB_MAKE_TAG('c', 'y', 'r', 'l'), 0 },
- // Armenian
- { HB_MAKE_TAG('a', 'r', 'm', 'n'), 0 },
- // Hebrew
- { HB_MAKE_TAG('h', 'e', 'b', 'r'), 1 },
- // Arabic
- { HB_MAKE_TAG('a', 'r', 'a', 'b'), 1 },
- // Syriac
- { HB_MAKE_TAG('s', 'y', 'r', 'c'), 1 },
- // Thaana
- { HB_MAKE_TAG('t', 'h', 'a', 'a'), 1 },
- // Devanagari
- { HB_MAKE_TAG('d', 'e', 'v', 'a'), 1 },
- // Bengali
- { HB_MAKE_TAG('b', 'e', 'n', 'g'), 1 },
- // Gurmukhi
- { HB_MAKE_TAG('g', 'u', 'r', 'u'), 1 },
- // Gujarati
- { HB_MAKE_TAG('g', 'u', 'j', 'r'), 1 },
- // Oriya
- { HB_MAKE_TAG('o', 'r', 'y', 'a'), 1 },
- // Tamil
- { HB_MAKE_TAG('t', 'a', 'm', 'l'), 1 },
- // Telugu
- { HB_MAKE_TAG('t', 'e', 'l', 'u'), 1 },
- // Kannada
- { HB_MAKE_TAG('k', 'n', 'd', 'a'), 1 },
- // Malayalam
- { HB_MAKE_TAG('m', 'l', 'y', 'm'), 1 },
- // Sinhala
- { HB_MAKE_TAG('s', 'i', 'n', 'h'), 1 },
- // Thai
- { HB_MAKE_TAG('t', 'h', 'a', 'i'), 1 },
- // Lao
- { HB_MAKE_TAG('l', 'a', 'o', ' '), 1 },
- // Tibetan
- { HB_MAKE_TAG('t', 'i', 'b', 't'), 1 },
- // Myanmar
- { HB_MAKE_TAG('m', 'y', 'm', 'r'), 1 },
- // Georgian
- { HB_MAKE_TAG('g', 'e', 'o', 'r'), 0 },
- // Hangul
- { HB_MAKE_TAG('h', 'a', 'n', 'g'), 1 },
- // Ogham
- { HB_MAKE_TAG('o', 'g', 'a', 'm'), 0 },
- // Runic
- { HB_MAKE_TAG('r', 'u', 'n', 'r'), 0 },
- // Khmer
- { HB_MAKE_TAG('k', 'h', 'm', 'r'), 1 },
- // N'Ko
- { HB_MAKE_TAG('n', 'k', 'o', ' '), 1 }
-};
-enum { NumOTScripts = sizeof(ot_scripts)/sizeof(OTScripts) };
-
-static HB_Bool checkScript(HB_Face face, int script)
-{
- assert(script < HB_ScriptCount);
-
- if (!face->gsub && !face->gpos)
- return false;
-
- unsigned int tag = ot_scripts[script].tag;
- int requirements = ot_scripts[script].flags;
-
- if (requirements & RequiresGsub) {
- if (!face->gsub)
- return false;
-
- HB_UShort script_index;
- HB_Error error = HB_GSUB_Select_Script(face->gsub, tag, &script_index);
- if (error) {
- DEBUG("could not select script %d in GSub table: %d", (int)script, error);
- error = HB_GSUB_Select_Script(face->gsub, HB_MAKE_TAG('D', 'F', 'L', 'T'), &script_index);
- if (error)
- return false;
- }
- }
-
- if (requirements & RequiresGpos) {
- if (!face->gpos)
- return false;
-
- HB_UShort script_index;
- HB_Error error = HB_GPOS_Select_Script(face->gpos, script, &script_index);
- if (error) {
- DEBUG("could not select script in gpos table: %d", error);
- error = HB_GPOS_Select_Script(face->gpos, HB_MAKE_TAG('D', 'F', 'L', 'T'), &script_index);
- if (error)
- return false;
- }
-
- }
- return true;
-}
-
-static HB_Stream getTableStream(void *font, HB_GetFontTableFunc tableFunc, HB_Tag tag)
-{
- HB_Error error;
- HB_UInt length = 0;
- HB_Stream stream = 0;
-
- if (!font)
- return 0;
-
- error = tableFunc(font, tag, 0, &length);
- if (error)
- return 0;
- stream = (HB_Stream)malloc(sizeof(HB_StreamRec));
- if (!stream)
- return 0;
- stream->base = (HB_Byte*)malloc(length);
- if (!stream->base) {
- free(stream);
- return 0;
- }
- error = tableFunc(font, tag, stream->base, &length);
- if (error) {
- _hb_close_stream(stream);
- return 0;
- }
- stream->size = length;
- stream->pos = 0;
- stream->cursor = NULL;
- return stream;
-}
-
-HB_Face HB_AllocFace(void *font, HB_GetFontTableFunc tableFunc)
-{
- HB_Face face = (HB_Face )malloc(sizeof(HB_FaceRec));
- if (!face)
- return 0;
-
- face->isSymbolFont = false;
- face->gdef = 0;
- face->gpos = 0;
- face->gsub = 0;
- face->current_script = HB_ScriptCount;
- face->current_flags = HB_ShaperFlag_Default;
- face->has_opentype_kerning = false;
- face->tmpAttributes = 0;
- face->tmpLogClusters = 0;
- face->glyphs_substituted = false;
- face->buffer = 0;
- face->font_for_init = font;
- face->get_font_table_func = tableFunc;
-
- return face;
-}
-
-HB_Face HB_NewFace(void *font, HB_GetFontTableFunc tableFunc)
-{
- HB_Face face = HB_AllocFace(font, tableFunc);
- if (face)
- face = HB_LoadFace(face);
- return face;
-}
-
-HB_Face HB_LoadFace(HB_Face face)
-{
- void *font = face->font_for_init;
- if (!font)
- return face;
-
- HB_GetFontTableFunc tableFunc = face->get_font_table_func;
-
- face->get_font_table_func = 0;
- face->font_for_init = 0;
-
- HB_Error error = HB_Err_Ok;
- HB_Stream stream;
- HB_Stream gdefStream;
-
- gdefStream = getTableStream(font, tableFunc, TTAG_GDEF);
- error = HB_Err_Not_Covered;
- if (!gdefStream || (error = HB_Load_GDEF_Table(gdefStream, &face->gdef))) {
- //DEBUG("error loading gdef table: %d", error);
- face->gdef = 0;
- }
-
- //DEBUG() << "trying to load gsub table";
- stream = getTableStream(font, tableFunc, TTAG_GSUB);
- error = HB_Err_Not_Covered;
- if (!stream || (error = HB_Load_GSUB_Table(stream, &face->gsub, face->gdef, gdefStream))) {
- face->gsub = 0;
- if (error != HB_Err_Not_Covered) {
- //DEBUG("error loading gsub table: %d", error);
- } else {
- //DEBUG("face doesn't have a gsub table");
- }
- }
- _hb_close_stream(stream);
-
- stream = getTableStream(font, tableFunc, TTAG_GPOS);
- error = HB_Err_Not_Covered;
- if (!stream || (error = HB_Load_GPOS_Table(stream, &face->gpos, face->gdef, gdefStream))) {
- face->gpos = 0;
- DEBUG("error loading gpos table: %d", error);
- }
- _hb_close_stream(stream);
-
- _hb_close_stream(gdefStream);
-
- for (unsigned int i = 0; i < HB_ScriptCount; ++i)
- face->supported_scripts[i] = checkScript(face, i);
-
- if (hb_buffer_new(&face->buffer) != HB_Err_Ok) {
- HB_FreeFace(face);
- return 0;
- }
-
- return face;
-}
-
-void HB_FreeFace(HB_Face face)
-{
- if (!face)
- return;
- if (face->gpos)
- HB_Done_GPOS_Table(face->gpos);
- if (face->gsub)
- HB_Done_GSUB_Table(face->gsub);
- if (face->gdef)
- HB_Done_GDEF_Table(face->gdef);
- if (face->buffer)
- hb_buffer_free(face->buffer);
- if (face->tmpAttributes)
- free(face->tmpAttributes);
- if (face->tmpLogClusters)
- free(face->tmpLogClusters);
- free(face);
-}
-
-#ifndef NO_OPENTYPE
-HB_Bool HB_SelectScript(HB_ShaperItem *shaper_item, const HB_OpenTypeFeature *features)
-{
- HB_Script script = shaper_item->item.script;
-
- HB_Face face = shaper_item->face;
- if (face->current_script == script && face->current_flags == shaper_item->shaperFlags)
- return shaper_item->face->supported_scripts[script] ? true : false;
-
- face->current_script = script;
- face->current_flags = shaper_item->shaperFlags;
-
- if (!shaper_item->face->supported_scripts[script])
- return false;
-
- assert(script < HB_ScriptCount);
- // find script in our list of supported scripts.
- unsigned int tag = ot_scripts[script].tag;
-
- if (face->gsub && features) {
-#ifdef OT_DEBUG
- {
- HB_FeatureList featurelist = face->gsub->FeatureList;
- int numfeatures = featurelist.FeatureCount;
- DEBUG("gsub table has %d features", numfeatures);
- for (int i = 0; i < numfeatures; i++) {
- HB_FeatureRecord *r = featurelist.FeatureRecord + i;
- DEBUG(" feature '%s'", tag_to_string(r->FeatureTag));
- }
- }
-#endif
- HB_GSUB_Clear_Features(face->gsub);
- HB_UShort script_index;
- HB_Error error = HB_GSUB_Select_Script(face->gsub, tag, &script_index);
- if (!error) {
- DEBUG("script %s has script index %d", tag_to_string(script), script_index);
- while (features->tag) {
- HB_UShort feature_index;
- error = HB_GSUB_Select_Feature(face->gsub, features->tag, script_index, 0xffff, &feature_index);
- if (!error) {
- DEBUG(" adding feature %s", tag_to_string(features->tag));
- HB_GSUB_Add_Feature(face->gsub, feature_index, features->property);
- }
- ++features;
- }
- }
- }
-
- // reset
- face->has_opentype_kerning = false;
-
- if (face->gpos) {
- HB_GPOS_Clear_Features(face->gpos);
- HB_UShort script_index;
- HB_Error error = HB_GPOS_Select_Script(face->gpos, tag, &script_index);
- if (!error) {
-#ifdef OT_DEBUG
- {
- HB_FeatureList featurelist = face->gpos->FeatureList;
- int numfeatures = featurelist.FeatureCount;
- DEBUG("gpos table has %d features", numfeatures);
- for(int i = 0; i < numfeatures; i++) {
- HB_FeatureRecord *r = featurelist.FeatureRecord + i;
- HB_UShort feature_index;
- HB_GPOS_Select_Feature(face->gpos, r->FeatureTag, script_index, 0xffff, &feature_index);
- DEBUG(" feature '%s'", tag_to_string(r->FeatureTag));
- }
- }
-#endif
- HB_UInt *feature_tag_list_buffer;
- error = HB_GPOS_Query_Features(face->gpos, script_index, 0xffff, &feature_tag_list_buffer);
- if (!error) {
- HB_UInt *feature_tag_list = feature_tag_list_buffer;
- while (*feature_tag_list) {
- HB_UShort feature_index;
- bool skip = false;
- if (*feature_tag_list == HB_MAKE_TAG('k', 'e', 'r', 'n')) {
- if (face->current_flags & HB_ShaperFlag_NoKerning)
- skip = true;
- else
- face->has_opentype_kerning = true;
- }
- features = disabled_features;
- while (features->tag) {
- if (*feature_tag_list == features->tag) {
- skip = true;
- break;
- }
- ++features;
- }
- // 'palt' should be turned off by default unless 'kern' is on
- if (!face->has_opentype_kerning &&
- *feature_tag_list == HB_MAKE_TAG('p', 'a', 'l', 't'))
- skip = true;
-
- if (skip) {
- ++feature_tag_list;
- continue;
- }
- error = HB_GPOS_Select_Feature(face->gpos, *feature_tag_list, script_index, 0xffff, &feature_index);
- if (!error)
- HB_GPOS_Add_Feature(face->gpos, feature_index, PositioningProperties);
- ++feature_tag_list;
- }
- FREE(feature_tag_list_buffer);
- }
- }
- }
-
- return true;
-}
-
-static HB_Bool containsSurrogates(HB_ShaperItem *item)
-{
- for (hb_uint32 i=item->item.pos; i<item->item.pos+item->item.length; ++i) {
- HB_UChar16 ucs = item->string[i];
- if ( HB_IsHighSurrogate(ucs) || HB_IsLowSurrogate(ucs) )
- return true;
- }
-
- return false;
-}
-
-HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties)
-{
- HB_GlyphAttributes *tmpAttributes;
- unsigned int *tmpLogClusters;
-
- HB_Face face = item->face;
-
- face->length = item->num_glyphs;
-
- hb_buffer_clear(face->buffer);
-
- tmpAttributes = (HB_GlyphAttributes *) realloc(face->tmpAttributes, face->length*sizeof(HB_GlyphAttributes));
- if (!tmpAttributes)
- return false;
- face->tmpAttributes = tmpAttributes;
-
- tmpLogClusters = (unsigned int *) realloc(face->tmpLogClusters, face->length*sizeof(unsigned int));
- if (!tmpLogClusters)
- return false;
- face->tmpLogClusters = tmpLogClusters;
-
- for (int i = 0; i < face->length; ++i) {
- hb_buffer_add_glyph(face->buffer, item->glyphs[i], properties ? properties[i] : 0, i);
- face->tmpAttributes[i] = item->attributes[i];
- face->tmpLogClusters[i] = item->log_clusters[i];
- }
-
-#ifdef OT_DEBUG
- DEBUG("-----------------------------------------");
-// DEBUG("log clusters before shaping:");
-// for (int j = 0; j < length; j++)
-// DEBUG(" log[%d] = %d", j, item->log_clusters[j]);
- DEBUG("original glyphs: %p", item->glyphs);
- for (int i = 0; i < length; ++i)
- DEBUG(" glyph=%4x", hb_buffer->in_string[i].gindex);
-// dump_string(hb_buffer);
-#endif
-
- face->glyphs_substituted = false;
- if (face->gsub && !containsSurrogates(item)) {
- unsigned int error = HB_GSUB_Apply_String(face->gsub, face->buffer);
- if (error && error != HB_Err_Not_Covered)
- return false;
- face->glyphs_substituted = (error != HB_Err_Not_Covered);
- }
-
-#ifdef OT_DEBUG
-// DEBUG("log clusters before shaping:");
-// for (int j = 0; j < length; j++)
-// DEBUG(" log[%d] = %d", j, item->log_clusters[j]);
- DEBUG("shaped glyphs:");
- for (int i = 0; i < length; ++i)
- DEBUG(" glyph=%4x", hb_buffer->in_string[i].gindex);
- DEBUG("-----------------------------------------");
-// dump_string(hb_buffer);
-#endif
-
- return true;
-}
-
-HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool doLogClusters)
-{
- HB_Face face = item->face;
-
- bool glyphs_positioned = false;
- if (face->gpos) {
- if (face->buffer->positions)
- memset(face->buffer->positions, 0, face->buffer->in_length*sizeof(HB_PositionRec));
- // #### check that passing "false,false" is correct
- glyphs_positioned = HB_GPOS_Apply_String(item->font, face->gpos, face->current_flags, face->buffer, false, false) != HB_Err_Not_Covered;
- }
-
- if (!face->glyphs_substituted && !glyphs_positioned) {
- HB_HeuristicPosition(item);
- return true; // nothing to do for us
- }
-
- // make sure we have enough space to write everything back
- if (availableGlyphs < (int)face->buffer->in_length) {
- item->num_glyphs = face->buffer->in_length;
- return false;
- }
-
- HB_Glyph *glyphs = item->glyphs;
- HB_GlyphAttributes *attributes = item->attributes;
-
- for (unsigned int i = 0; i < face->buffer->in_length; ++i) {
- glyphs[i] = face->buffer->in_string[i].gindex;
- attributes[i] = face->tmpAttributes[face->buffer->in_string[i].cluster];
- if (i && face->buffer->in_string[i].cluster == face->buffer->in_string[i-1].cluster)
- attributes[i].clusterStart = false;
- }
- item->num_glyphs = face->buffer->in_length;
-
- if (doLogClusters && face->glyphs_substituted) {
- // we can't do this for indic, as we pass the stuf in syllables and it's easier to do it in the shaper.
- unsigned short *logClusters = item->log_clusters;
- int clusterStart = 0;
- int oldCi = 0;
- // #### the reconstruction of the logclusters currently does not work if the original string
- // contains surrogate pairs
- for (unsigned int i = 0; i < face->buffer->in_length; ++i) {
- int ci = face->buffer->in_string[i].cluster;
- // DEBUG(" ci[%d] = %d mark=%d, cmb=%d, cs=%d",
- // i, ci, glyphAttributes[i].mark, glyphAttributes[i].combiningClass, glyphAttributes[i].clusterStart);
- if (!attributes[i].mark && attributes[i].clusterStart && ci != oldCi) {
- for (int j = oldCi; j < ci; j++)
- logClusters[j] = clusterStart;
- clusterStart = i;
- oldCi = ci;
- }
- }
- for (int j = oldCi; j < face->length; j++)
- logClusters[j] = clusterStart;
- }
-
- // calulate the advances for the shaped glyphs
-// DEBUG("unpositioned: ");
-
- // positioning code:
- if (glyphs_positioned) {
- HB_GetGlyphAdvances(item);
- HB_Position positions = face->buffer->positions;
- HB_Fixed *advances = item->advances;
-
-// DEBUG("positioned glyphs:");
- for (unsigned int i = 0; i < face->buffer->in_length; i++) {
-// DEBUG(" %d:\t orig advance: (%d/%d)\tadv=(%d/%d)\tpos=(%d/%d)\tback=%d\tnew_advance=%d", i,
-// glyphs[i].advance.x.toInt(), glyphs[i].advance.y.toInt(),
-// (int)(positions[i].x_advance >> 6), (int)(positions[i].y_advance >> 6),
-// (int)(positions[i].x_pos >> 6), (int)(positions[i].y_pos >> 6),
-// positions[i].back, positions[i].new_advance);
-
- HB_Fixed adjustment = positions[i].x_advance;
-
- if (!(face->current_flags & HB_ShaperFlag_UseDesignMetrics))
- adjustment = HB_FIXED_ROUND(adjustment);
-
- if (positions[i].new_advance) {
- ; //advances[i] = adjustment;
- } else {
- advances[i] += adjustment;
- }
-
- int back = 0;
- HB_FixedPoint *offsets = item->offsets;
- offsets[i].x = positions[i].x_pos;
- offsets[i].y = positions[i].y_pos;
- while (positions[i - back].back) {
- back += positions[i - back].back;
- offsets[i].x += positions[i - back].x_pos;
- offsets[i].y += positions[i - back].y_pos;
- }
- offsets[i].y = -offsets[i].y;
-
- if (item->item.bidiLevel % 2) {
- // ### may need to go back multiple glyphs like in ltr
- back = positions[i].back;
- while (back--)
- offsets[i].x -= advances[i-back];
- } else {
- back = 0;
- while (positions[i - back].back) {
- back += positions[i - back].back;
- offsets[i].x -= advances[i-back];
- }
- }
-// DEBUG(" ->\tadv=%d\tpos=(%d/%d)",
-// glyphs[i].advance.x.toInt(), glyphs[i].offset.x.toInt(), glyphs[i].offset.y.toInt());
- }
- item->kerning_applied = face->has_opentype_kerning;
- } else {
- HB_HeuristicPosition(item);
- }
-
-#ifdef OT_DEBUG
- if (doLogClusters) {
- DEBUG("log clusters after shaping:\n");
- for (unsigned int j = 0; j < item->item.length; j++)
- DEBUG(" log[%d] = %d\n", j, item->log_clusters[j]);
- }
- DEBUG("final glyphs:\n");
- for (unsigned int i = 0; i < item->num_glyphs; ++i)
- DEBUG(" glyph=%4x char_index=%d mark: %d cmp: %d, clusterStart: %d advance=%d offset=%d/%d\n",
- glyphs[i], face->buffer->in_string[i].cluster, attributes[i].mark,
- attributes[i].combiningClass, attributes[i].clusterStart,
- item->advances[i] >> 6,
- item->offsets[i].x >> 6, item->offsets[i].y >> 6);
- DEBUG("-----------------------------------------\n");
-#endif
- return true;
-}
-#endif // NO_OPENTYPE
-
-HB_Bool HB_ShapeItem(HB_ShaperItem *shaper_item)
-{
- HB_Bool result = false;
- if (shaper_item->num_glyphs < shaper_item->item.length) {
- shaper_item->num_glyphs = shaper_item->item.length;
- return false;
- }
- assert(shaper_item->item.script < HB_ScriptCount);
- result = HB_ScriptEngines[shaper_item->item.script].shape(shaper_item);
- shaper_item->glyphIndicesPresent = false;
- return result;
-}
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h
deleted file mode 100644
index 9f210cb0d9..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_SHAPER_H
-#define HARFBUZZ_SHAPER_H
-
-#include "harfbuzz-global.h"
-#include "harfbuzz-gdef.h"
-#include "harfbuzz-gpos.h"
-#include "harfbuzz-gsub.h"
-#include "harfbuzz-external.h"
-#include "harfbuzz-stream-private.h"
-
-HB_BEGIN_HEADER
-
-/*
- using anything else than signed or unsigned for bitfields in C is non standard,
- but accepted by almost all compilers. And it gives a significant reduction in
- memory consumption as HB_CharAttributes and HB_GlyphAttributes will not have
- a 4 byte alignment
-*/
-#ifdef __xlC__
-typedef unsigned hb_bitfield;
-#else
-typedef hb_uint8 hb_bitfield;
-#endif
-
-typedef enum {
- HB_Script_Common,
- HB_Script_Greek,
- HB_Script_Cyrillic,
- HB_Script_Armenian,
- HB_Script_Hebrew,
- HB_Script_Arabic,
- HB_Script_Syriac,
- HB_Script_Thaana,
- HB_Script_Devanagari,
- HB_Script_Bengali,
- HB_Script_Gurmukhi,
- HB_Script_Gujarati,
- HB_Script_Oriya,
- HB_Script_Tamil,
- HB_Script_Telugu,
- HB_Script_Kannada,
- HB_Script_Malayalam,
- HB_Script_Sinhala,
- HB_Script_Thai,
- HB_Script_Lao,
- HB_Script_Tibetan,
- HB_Script_Myanmar,
- HB_Script_Georgian,
- HB_Script_Hangul,
- HB_Script_Ogham,
- HB_Script_Runic,
- HB_Script_Khmer,
- HB_Script_Nko,
- HB_Script_Inherited,
- HB_ScriptCount = HB_Script_Inherited
- /*
- HB_Script_Latin = Common,
- HB_Script_Ethiopic = Common,
- HB_Script_Cherokee = Common,
- HB_Script_CanadianAboriginal = Common,
- HB_Script_Mongolian = Common,
- HB_Script_Hiragana = Common,
- HB_Script_Katakana = Common,
- HB_Script_Bopomofo = Common,
- HB_Script_Han = Common,
- HB_Script_Yi = Common,
- HB_Script_OldItalic = Common,
- HB_Script_Gothic = Common,
- HB_Script_Deseret = Common,
- HB_Script_Tagalog = Common,
- HB_Script_Hanunoo = Common,
- HB_Script_Buhid = Common,
- HB_Script_Tagbanwa = Common,
- HB_Script_Limbu = Common,
- HB_Script_TaiLe = Common,
- HB_Script_LinearB = Common,
- HB_Script_Ugaritic = Common,
- HB_Script_Shavian = Common,
- HB_Script_Osmanya = Common,
- HB_Script_Cypriot = Common,
- HB_Script_Braille = Common,
- HB_Script_Buginese = Common,
- HB_Script_Coptic = Common,
- HB_Script_NewTaiLue = Common,
- HB_Script_Glagolitic = Common,
- HB_Script_Tifinagh = Common,
- HB_Script_SylotiNagri = Common,
- HB_Script_OldPersian = Common,
- HB_Script_Kharoshthi = Common,
- HB_Script_Balinese = Common,
- HB_Script_Cuneiform = Common,
- HB_Script_Phoenician = Common,
- HB_Script_PhagsPa = Common,
- */
-} HB_Script;
-
-typedef struct
-{
- hb_uint32 pos;
- hb_uint32 length;
- HB_Script script;
- hb_uint8 bidiLevel;
-} HB_ScriptItem;
-
-
-typedef struct {
- hb_bitfield graphemeBoundary : 1; /* Valid cursor position (for left/right arrow) */
- hb_bitfield wordBreak : 1;
- hb_bitfield sentenceBoundary : 1;
- hb_bitfield lineBreak : 1;
- hb_bitfield whiteSpace : 1; /* A unicode whitespace character */
- hb_bitfield wordStart : 1;
- hb_bitfield wordEnd : 1;
- hb_bitfield mandatoryBreak : 1;
-} HB_CharAttributes;
-
-void HB_GetTailoredCharAttributes(const HB_UChar16 *string, hb_uint32 stringLength,
- const HB_ScriptItem *items, hb_uint32 numItems,
- HB_CharAttributes *attributes);
-
-
-typedef enum {
- HB_LeftToRight = 0,
- HB_RightToLeft = 1
-} HB_StringToGlyphsFlags;
-
-typedef enum {
- HB_ShaperFlag_Default = 0,
- HB_ShaperFlag_NoKerning = 1,
- HB_ShaperFlag_UseDesignMetrics = 2
-} HB_ShaperFlag;
-
-/*
- highest value means highest priority for justification. Justification is done by first inserting kashidas
- starting with the highest priority positions, then stretching spaces, afterwards extending inter char
- spacing, and last spacing between arabic words.
- NoJustification is for example set for arabic where no Kashida can be inserted or for diacritics.
-*/
-typedef enum {
- HB_NoJustification= 0, /* Justification can't be applied after this glyph */
- HB_Arabic_Space = 1, /* This glyph represents a space inside arabic text */
- HB_Character = 2, /* Inter-character justification point follows this glyph */
- HB_Space = 4, /* This glyph represents a blank outside an Arabic run */
- HB_Arabic_Normal = 7, /* Normal Middle-Of-Word glyph that connects to the right (begin) */
- HB_Arabic_Waw = 8, /* Next character is final form of Waw/Ain/Qaf/Fa */
- HB_Arabic_BaRa = 9, /* Next two chars are Ba + Ra/Ya/AlefMaksura */
- HB_Arabic_Alef = 10, /* Next character is final form of Alef/Tah/Lam/Kaf/Gaf */
- HB_Arabic_HaaDal = 11, /* Next character is final form of Haa/Dal/Taa Marbutah */
- HB_Arabic_Seen = 12, /* Initial or Medial form Of Seen/Sad */
- HB_Arabic_Kashida = 13 /* Kashida(U+640) in middle of word */
-} HB_JustificationClass;
-
-/* This structure is binary compatible with Uniscribe's SCRIPT_VISATTR. Would be nice to keep
- * it like that. If this is a problem please tell Trolltech :)
- */
-typedef struct {
- hb_bitfield justification :4; /* Justification class */
- hb_bitfield clusterStart :1; /* First glyph of representation of cluster */
- hb_bitfield mark :1; /* needs to be positioned around base char */
- hb_bitfield zeroWidth :1; /* ZWJ, ZWNJ etc, with no width */
- hb_bitfield dontPrint :1;
- hb_bitfield combiningClass :8;
-} HB_GlyphAttributes;
-
-typedef HB_Error (*HB_GetFontTableFunc)(void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length);
-
-typedef struct HB_FaceRec_ {
- HB_Bool isSymbolFont;
-
- HB_GDEF gdef;
- HB_GSUB gsub;
- HB_GPOS gpos;
- HB_Bool supported_scripts[HB_ScriptCount];
- HB_Buffer buffer;
- HB_Script current_script;
- int current_flags; /* HB_ShaperFlags */
- HB_Bool has_opentype_kerning;
- HB_Bool glyphs_substituted;
- HB_GlyphAttributes *tmpAttributes;
- unsigned int *tmpLogClusters;
- int length;
- int orig_nglyphs;
- void *font_for_init;
- HB_GetFontTableFunc get_font_table_func;
-} HB_FaceRec;
-
-
-
-HB_Face HB_NewFace(void *font, HB_GetFontTableFunc tableFunc);
-HB_Face HB_AllocFace(void *font, HB_GetFontTableFunc tableFunc);
-HB_Face HB_LoadFace(HB_Face face);
-void HB_FreeFace(HB_Face face);
-
-typedef struct {
- HB_Fixed x, y;
- HB_Fixed width, height;
- HB_Fixed xOffset, yOffset;
-} HB_GlyphMetrics;
-
-typedef enum {
- HB_FontAscent
-} HB_FontMetric;
-
-typedef struct {
- HB_Bool (*convertStringToGlyphIndices)(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool rightToLeft);
- void (*getGlyphAdvances)(HB_Font font, const HB_Glyph *glyphs, hb_uint32 numGlyphs, HB_Fixed *advances, int flags /*HB_ShaperFlag*/);
- HB_Bool (*canRender)(HB_Font font, const HB_UChar16 *string, hb_uint32 length);
- /* implementation needs to make sure to load a scaled glyph, so /no/ FT_LOAD_NO_SCALE */
- HB_Error (*getPointInOutline)(HB_Font font, HB_Glyph glyph, int flags /*HB_ShaperFlag*/, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints);
- void (*getGlyphMetrics)(HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *metrics);
- HB_Fixed (*getFontMetric)(HB_Font font, HB_FontMetric metric);
-} HB_FontClass;
-
-typedef struct HB_Font_ {
- const HB_FontClass *klass;
-
- /* Metrics */
- HB_UShort x_ppem, y_ppem;
- HB_16Dot16 x_scale, y_scale;
-
- void *userData;
-} HB_FontRec;
-
-typedef struct HB_ShaperItem_ HB_ShaperItem;
-
-struct HB_ShaperItem_ {
- const HB_UChar16 *string; /* input: the Unicode UTF16 text to be shaped */
- hb_uint32 stringLength; /* input: the length of the input in 16-bit words */
- HB_ScriptItem item; /* input: the current run to be shaped: a run of text all in the same script that is a substring of <string> */
- HB_Font font; /* input: the font: scale, units and function pointers supplying glyph indices and metrics */
- HB_Face face; /* input: the shaper state; current script, access to the OpenType tables , etc. */
- int shaperFlags; /* input (unused) should be set to 0; intended to support flags defined in HB_ShaperFlag */
- HB_Bool glyphIndicesPresent; /* input: true if the <glyphs> array contains glyph indices ready to be shaped */
- hb_uint32 initialGlyphCount; /* input: if glyphIndicesPresent is true, the number of glyph indices in the <glyphs> array */
-
- hb_uint32 num_glyphs; /* input: capacity of output arrays <glyphs>, <attributes>, <advances>, <offsets>, and <log_clusters>; */
- /* output: required capacity (may be larger than actual capacity) */
-
- HB_Glyph *glyphs; /* output: <num_glyphs> indices of shaped glyphs */
- HB_GlyphAttributes *attributes; /* output: <num_glyphs> glyph attributes */
- HB_Fixed *advances; /* output: <num_glyphs> advances */
- HB_FixedPoint *offsets; /* output: <num_glyphs> offsets */
- unsigned short *log_clusters; /* output: for each output glyph, the index in the input of the start of its logical cluster */
-
- /* internal */
- HB_Bool kerning_applied; /* output: true if kerning was applied by the shaper */
-};
-
-HB_Bool HB_ShapeItem(HB_ShaperItem *item);
-
-HB_END_HEADER
-
-#endif
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-stream-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-stream-private.h
deleted file mode 100644
index fbd9f81379..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-stream-private.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_STREAM_PRIVATE_H
-#define HARFBUZZ_STREAM_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-stream.h"
-
-HB_BEGIN_HEADER
-
-HB_INTERNAL void
-_hb_close_stream( HB_Stream stream );
-
-HB_INTERNAL HB_Int
-_hb_stream_pos( HB_Stream stream );
-
-HB_INTERNAL HB_Error
-_hb_stream_seek( HB_Stream stream,
- HB_UInt pos );
-
-HB_INTERNAL HB_Error
-_hb_stream_frame_enter( HB_Stream stream,
- HB_UInt size );
-
-HB_INTERNAL void
-_hb_stream_frame_exit( HB_Stream stream );
-
-/* convenience macros */
-
-#define SET_ERR(c) ( (error = (c)) != 0 )
-
-#define GOTO_Table(tag) (0)
-#define FILE_Pos() _hb_stream_pos( stream )
-#define FILE_Seek(pos) SET_ERR( _hb_stream_seek( stream, pos ) )
-#define ACCESS_Frame(size) SET_ERR( _hb_stream_frame_enter( stream, size ) )
-#define FORGET_Frame() _hb_stream_frame_exit( stream )
-
-#define GET_Byte() (*stream->cursor++)
-#define GET_Short() (stream->cursor += 2, (HB_Short)( \
- (*(((HB_Byte*)stream->cursor)-2) << 8) | \
- *(((HB_Byte*)stream->cursor)-1) \
- ))
-#define GET_Long() (stream->cursor += 4, (HB_Int)( \
- (*(((HB_Byte*)stream->cursor)-4) << 24) | \
- (*(((HB_Byte*)stream->cursor)-3) << 16) | \
- (*(((HB_Byte*)stream->cursor)-2) << 8) | \
- *(((HB_Byte*)stream->cursor)-1) \
- ))
-
-
-#define GET_Char() ((HB_Char)GET_Byte())
-#define GET_UShort() ((HB_UShort)GET_Short())
-#define GET_ULong() ((HB_UInt)GET_Long())
-#define GET_Tag4() GET_ULong()
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_STREAM_PRIVATE_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-stream.c b/src/3rdparty/harfbuzz/src/harfbuzz-stream.c
deleted file mode 100644
index 643a258df7..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-stream.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2005 David Turner
- * Copyright (C) 2015 The Qt Company Ltd
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-stream-private.h"
-#include <stdlib.h>
-
-#if 0
-#include <stdio.h>
-#define LOG(x) _hb_log x
-
-static void
-_hb_log( const char* format, ... )
-{
- va_list ap;
-
- va_start( ap, format );
- vfprintf( stderr, format, ap );
- va_end( ap );
-}
-
-#else
-#define LOG(x) do {} while (0)
-#endif
-
-HB_INTERNAL void
-_hb_close_stream( HB_Stream stream )
-{
- if (!stream)
- return;
- free(stream->base);
- free(stream);
-}
-
-
-HB_INTERNAL HB_Int
-_hb_stream_pos( HB_Stream stream )
-{
- LOG(( "_hb_stream_pos() -> %ld\n", stream->pos ));
- return stream->pos;
-}
-
-
-HB_INTERNAL HB_Error
-_hb_stream_seek( HB_Stream stream,
- HB_UInt pos )
-{
- HB_Error error = (HB_Error)0;
-
- stream->pos = pos;
- if (pos > stream->size)
- error = ERR(HB_Err_Read_Error);
-
- LOG(( "_hb_stream_seek(%ld) -> 0x%04X\n", pos, error ));
- return error;
-}
-
-
-HB_INTERNAL HB_Error
-_hb_stream_frame_enter( HB_Stream stream,
- HB_UInt count )
-{
- HB_Error error = HB_Err_Ok;
-
- /* check new position, watch for overflow */
- if (HB_UNLIKELY (stream->pos + count > stream->size ||
- stream->pos + count < stream->pos))
- {
- error = ERR(HB_Err_Read_Error);
- goto Exit;
- }
-
- /* set cursor */
- stream->cursor = stream->base + stream->pos;
- stream->pos += count;
-
-Exit:
- LOG(( "_hb_stream_frame_enter(%ld) -> 0x%04X\n", count, error ));
- return error;
-}
-
-
-HB_INTERNAL void
-_hb_stream_frame_exit( HB_Stream stream )
-{
- stream->cursor = NULL;
-
- LOG(( "_hb_stream_frame_exit()\n" ));
-}
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-stream.h b/src/3rdparty/harfbuzz/src/harfbuzz-stream.h
deleted file mode 100644
index d6dd94a7ea..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-stream.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2005 David Turner
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_STREAM_H
-#define HARFBUZZ_STREAM_H
-
-#include "harfbuzz-global.h"
-
-HB_BEGIN_HEADER
-
-typedef struct HB_StreamRec_
-{
- HB_Byte* base;
- HB_Byte* cursor;
- HB_UInt size;
- HB_UInt pos;
-} HB_StreamRec;
-
-HB_END_HEADER
-
-#endif
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-thai.c b/src/3rdparty/harfbuzz/src/harfbuzz-thai.c
deleted file mode 100644
index fe3296e887..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-thai.c
+++ /dev/null
@@ -1,460 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-#include "harfbuzz-external.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-#define LIBTHAI_MAJOR 0
-
-/*
- * if libthai changed please update these codes too.
- */
-struct thcell_t {
- unsigned char base; /**< base character */
- unsigned char hilo; /**< upper/lower vowel/diacritic */
- unsigned char top; /**< top-level mark */
-};
-typedef int (*th_brk_def) (const unsigned char*, int*, size_t);
-typedef int (*th_render_cell_tis_def) (struct thcell_t cell, unsigned char res[], size_t res_sz, int is_decomp_am);
-typedef int (*th_render_cell_win_def) (struct thcell_t cell, unsigned char res[], size_t res_sz, int is_decomp_am);
-typedef int (*th_render_cell_mac_def) (struct thcell_t cell, unsigned char res[], size_t res_sz, int is_decomp_am);
-typedef size_t (*th_next_cell_def) (const unsigned char *, size_t, struct thcell_t *, int);
-
-/* libthai releated function handles */
-static th_brk_def th_brk = 0;
-static th_next_cell_def th_next_cell = 0;
-static th_render_cell_tis_def th_render_cell_tis = 0;
-static th_render_cell_win_def th_render_cell_win = 0;
-static th_render_cell_mac_def th_render_cell_mac = 0;
-
-static int init_libthai() {
- static HB_Bool initialized = false;
- if (!initialized && (!th_brk || !th_next_cell || !th_render_cell_tis || !th_render_cell_win || !th_render_cell_mac)) {
- th_brk = (th_brk_def) HB_Library_Resolve("thai", (int)LIBTHAI_MAJOR, "th_brk");
- th_next_cell = (th_next_cell_def)HB_Library_Resolve("thai", LIBTHAI_MAJOR, "th_next_cell");
- th_render_cell_tis = (th_render_cell_tis_def) HB_Library_Resolve("thai", (int)LIBTHAI_MAJOR, "th_render_cell_tis");
- th_render_cell_win = (th_render_cell_win_def) HB_Library_Resolve("thai", (int)LIBTHAI_MAJOR, "th_render_cell_win");
- th_render_cell_mac = (th_render_cell_mac_def) HB_Library_Resolve("thai", (int)LIBTHAI_MAJOR, "th_render_cell_mac");
- initialized = true;
- }
- if (th_brk && th_next_cell && th_render_cell_tis && th_render_cell_win && th_render_cell_mac)
- return 1;
- else
- return 0;
-}
-
-static void to_tis620(const HB_UChar16 *string, hb_uint32 len, char *cstr)
-{
- hb_uint32 i;
- unsigned char *result = (unsigned char *)cstr;
-
- for (i = 0; i < len; ++i) {
- if (string[i] <= 0xa0)
- result[i] = (unsigned char)string[i];
- else if (string[i] >= 0xe01 && string[i] <= 0xe5b)
- result[i] = (unsigned char)(string[i] - 0xe00 + 0xa0);
- else
- result[i] = (unsigned char)~0; // Same encoding as libthai uses for invalid chars
- }
-
- result[len] = 0;
-}
-
-/*
- * ---------------------------------------------------------------------------
- * Thai Shaper / Attributes
- * ---------------------------------------------------------------------------
- */
-
-/*
- * USe basic_features prepare for future adding.
- */
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature thai_features[] = {
- { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
- { HB_MAKE_TAG('l', 'i', 'g', 'a'), CcmpProperty },
- { HB_MAKE_TAG('c', 'l', 'i', 'g'), CcmpProperty },
- {0, 0}
-};
-#endif
-
-/* TIS-to-Unicode glyph maps for characters 0x80-0xff */
-static int tis620_0[128] = {
- /**/ 0, 0, 0, 0, 0, 0, 0, 0,
- /**/ 0, 0, 0, 0, 0, 0, 0, 0,
- /**/ 0, 0, 0, 0, 0, 0, 0, 0,
- /**/ 0, 0, 0, 0, 0, 0, 0, 0,
- 0x0020, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07,
- 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
- 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17,
- 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
- 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27,
- 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
- 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37,
- 0x0e38, 0x0e39, 0x0e3a, 0, 0, 0, 0, 0x0e3f,
- 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
- 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
- 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57,
- 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0, 0, 0, 0
-};
-
-static int tis620_1[128] = {
- 0xf89e, 0, 0, 0xf88c, 0xf88f, 0xf892, 0xf895, 0xf898,
- 0xf88b, 0xf88e, 0xf891, 0xf894, 0xf897, 0, 0, 0xf899,
- 0xf89a, 0, 0xf884, 0xf889, 0xf885, 0xf886, 0xf887, 0xf888,
- 0xf88a, 0xf88d, 0xf890, 0xf893, 0xf896, 0, 0, 0,
- /**/ 0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07,
- 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
- 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17,
- 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
- 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27,
- 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
- 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37,
- 0x0e38, 0x0e39, 0x0e3a, 0, 0, 0, 0, 0x0e3f,
- 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
- 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0, 0x0e4f,
- 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57,
- 0x0e58, 0x0e59, 0, 0, 0xf89b, 0xf89c, 0xf89d, 0
-};
-
-static int tis620_2[128] = {
- 0xf700, 0xf701, 0xf702, 0xf703, 0xf704, 0x2026, 0xf705, 0xf706,
- 0xf707, 0xf708, 0xf709, 0xf70a, 0xf70b, 0xf70c, 0xf70d, 0xf70e,
- 0xf70f, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
- 0xf710, 0xf711, 0xf712, 0xf713, 0xf714, 0xf715, 0xf716, 0xf717,
- 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07,
- 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
- 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17,
- 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
- 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27,
- 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
- 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37,
- 0x0e38, 0x0e39, 0x0e3a, 0, 0, 0, 0, 0x0e3f,
- 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
- 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
- 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57,
- 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0xf718, 0xf719, 0xf71a, 0
-};
-
-enum ThaiFontType {
- TIS,
- WIN,
- MAC
-};
-
-static int thai_get_glyph_index (ThaiFontType font_type, unsigned char c)
-{
- switch (font_type){
- case TIS: return (c & 0x80) ? tis620_0[c & 0x7f] : c;
- case WIN: return (c & 0x80) ? tis620_1[c & 0x7f] : c;
- case MAC: return (c & 0x80) ? tis620_2[c & 0x7f] : c;
- default: return 0;
- }
-}
-
-static int thai_contain_glyphs (HB_ShaperItem *shaper_item, const int glyph_map[128])
-{
- unsigned char c;
-
- for (c = 0; c < 0x80; c++) {
- if ( glyph_map[c] ) {
- if ( !shaper_item->font->klass->canRender (shaper_item->font, (const HB_UChar16 *) &glyph_map[c], 1) )
- return 0;
- }
- }
- return 1;
-}
-
-static ThaiFontType getThaiFontType(HB_ShaperItem *shaper_item)
-{
- if ( thai_contain_glyphs (shaper_item, tis620_2) )
- return MAC;
- else if ( thai_contain_glyphs (shaper_item, tis620_1) )
- return WIN;
- else
- return TIS;
-}
-
-/*
- * convert to the correct display level of THAI vowels and marks.
- */
-static HB_Bool HB_ThaiConvertStringToGlyphIndices (HB_ShaperItem *item)
-{
- char s[128];
- char *cstr = s;
- const HB_UChar16 *string = item->string + item->item.pos;
- const hb_uint32 len = item->item.length;
- unsigned short *logClusters = item->log_clusters;
- hb_uint32 i = 0, slen = 0;
-
- if (!init_libthai())
- return HB_BasicShape (item);
-
- if (len >= 128)
- cstr = (char *)malloc(len*sizeof(char) + 1);
-
- if (!cstr)
- return HB_BasicShape (item);
-
- to_tis620(string, len, cstr);
-
- /* Get font type */
- static ThaiFontType font_type;
- static HB_Font itemFont;
- if (itemFont != item->font) {
- font_type = getThaiFontType (item);
- itemFont = item->font;
- }
-
- /* allocate temporary glyphs buffers */
- HB_STACKARRAY (HB_UChar16, glyphString, (item->item.length * 2));
-
- while (i < item->item.length) {
- struct thcell_t tis_cell;
- unsigned char rglyphs[4];
- int cell_length;
- int lgn = 0;
- HB_Bool haveSaraAm = false;
-
- cell_length = (int)(th_next_cell ((const unsigned char *)cstr + i, len - i, &tis_cell, true)); /* !item->fixedPitch); */
- haveSaraAm = (cstr[i + cell_length - 1] == (char)0xd3);
-
- /* set shaper item's log_clusters */
- logClusters[i] = slen;
- for (int j = 1; j < cell_length; j++) {
- logClusters[i + j] = logClusters[i];
- }
-
- /* Find Logical Glyphs by font type */
- switch (font_type) {
- case TIS: lgn = th_render_cell_tis (tis_cell, rglyphs, sizeof(rglyphs) / sizeof(rglyphs[0]), true); break;
- case WIN: lgn = th_render_cell_mac (tis_cell, rglyphs, sizeof(rglyphs) / sizeof(rglyphs[0]), true); break;
- case MAC: lgn = th_render_cell_win (tis_cell, rglyphs, sizeof(rglyphs) / sizeof(rglyphs[0]), true); break;
- }
-
- /* Add glyphs to glyphs string and setting some attributes */
- for (int lgi = 0; lgi < lgn; lgi++) {
- if ( rglyphs[lgi] == 0xdd/*TH_BLANK_BASE_GLYPH*/ ) {
- glyphString[slen++] = C_DOTTED_CIRCLE;
- } else if ((unsigned char)cstr[i] == (unsigned char)~0) {
- // The only glyphs that should be passed to this function that cannot be mapped to
- // tis620 are the ones of type Inherited class. Pass these glyphs untouched.
- glyphString[slen++] = string[i];
- if (string[i] == 0x200D || string[i] == 0x200C) {
- // Check that we do not run out of bounds when setting item->attributes. If we do
- // run out of bounds then this function will return false, the necessary amount of
- // memory is reallocated, and this function will then be called again.
- if (slen <= item->num_glyphs)
- item->attributes[slen-1].dontPrint = true; // Hide ZWJ and ZWNJ characters
- }
- } else {
- glyphString[slen++] = (HB_UChar16) thai_get_glyph_index (font_type, rglyphs[lgi]);
- }
- }
-
- /* Special case to handle U+0E33 (SARA AM): SARA AM is normally written at the end of a
- * word with a base character and an optional top character before it. For example, U+0E0B
- * (base), U+0E49 (top), U+0E33 (SARA AM). The sequence should be converted to 4 glyphs:
- * base, hilo (the little circle in the top left part of SARA AM, NIKHAHIT), top, then the
- * right part of SARA AM (SARA AA).
- *
- * The painting process finds out the starting glyph and ending glyph of a character
- * sequence by checking the logClusters array. In this case, logClusters array should
- * ideally be [ 0, 1, 3 ] so that glyphsStart = 0 and glyphsEnd = 3 (slen - 1) to paint out
- * all the glyphs generated.
- *
- * A special case in this special case is when we have no base character. When an isolated
- * SARA AM is processed (cell_length = 1), libthai will produce 3 glyphs: dotted circle
- * (indicates that the base is empty), NIKHAHIT then SARA AA. If logClusters[0] = 1, it will
- * paint from the second glyph in the glyphs array. So in this case logClusters[0] should
- * point to the first glyph it produces, aka. the dotted circle. */
- if (haveSaraAm) {
- logClusters[i + cell_length - 1] = cell_length == 1 ? slen - 3 : slen - 1;
- if (tis_cell.top != 0) {
- if (cell_length > 1) {
- /* set the logClusters[top character] to slen - 2 as it points to the second to
- * lastglyph (slen - 2) */
- logClusters[i + cell_length - 2] = slen - 2;
- }
- }
- /* check for overflow */
- if (logClusters[i + cell_length - 1] > slen)
- logClusters[i + cell_length - 1] = 0;
- }
-
- i += cell_length;
- }
- glyphString[slen] = (HB_UChar16) '\0';
-
- /* for check, should reallocate space or not */
- HB_Bool spaceOK = (item->num_glyphs >= slen);
-
- /* Convert to Glyph indices */
- HB_Bool haveGlyphs = item->font->klass->convertStringToGlyphIndices (
- item->font,
- glyphString, slen,
- item->glyphs, &item->num_glyphs,
- item->shaperFlags);
-
- HB_FREE_STACKARRAY (glyphString);
-
- if (len >= 128)
- free(cstr);
-
- return (haveGlyphs && spaceOK);
-}
-
-/*
- * set the glyph attributes heuristically.
- */
-static void HB_ThaiHeuristicSetGlyphAttributes (HB_ShaperItem *item)
-{
- /* Set Glyph Attributes */
- hb_uint32 iCluster = 0;
- hb_uint32 length = item->item.length;
- while (iCluster < length) {
- int cluster_start = item->log_clusters[iCluster];
- ++iCluster;
- while (iCluster < length && item->log_clusters[iCluster] == cluster_start) {
- ++iCluster;
- }
- int cluster_end = (iCluster < length) ? item->log_clusters[iCluster] : item->num_glyphs;
- item->attributes[cluster_start].clusterStart = true;
- for (int i = cluster_start + 1; i < cluster_end; i++) {
- item->attributes[i].clusterStart = false;
- }
- }
-}
-
-/*
- * THAI Shaping.
- */
-HB_Bool HB_ThaiShape (HB_ShaperItem *shaper_item)
-{
- if ( !HB_ThaiConvertStringToGlyphIndices (shaper_item) )
- return false;
-
- HB_ThaiHeuristicSetGlyphAttributes (shaper_item);
-
-#ifndef NO_OPENTYPE
- const int availableGlyphs = shaper_item->num_glyphs;
- if ( HB_SelectScript (shaper_item, thai_features) ) {
- HB_OpenTypeShape (shaper_item, /*properties*/0);
- return HB_OpenTypePosition (shaper_item, availableGlyphs, /*doLogClusters*/true);
- }
-#endif
-
- HB_HeuristicPosition (shaper_item);
- return true;
-}
-
-/*
- * Thai Attributes: computes Word Break, Word Boundary and Char stop for THAI.
- */
-static void HB_ThaiAssignAttributes(const HB_UChar16 *string, hb_uint32 len, HB_CharAttributes *attributes)
-{
- char s[128];
- char *cstr = s;
- int *break_positions = 0;
- int brp[128];
- int brp_size = 0;
- hb_uint32 numbreaks, i, j, cell_length;
- struct thcell_t tis_cell;
-
- if (!init_libthai())
- return ;
-
- if (len >= 128)
- cstr = (char *)malloc(len*sizeof(char) + 1);
-
- to_tis620(string, len, cstr);
-
- for (i = 0; i < len; ++i) {
- attributes[i].wordBreak = FALSE;
- attributes[i].wordStart = FALSE;
- attributes[i].wordEnd = FALSE;
- attributes[i].lineBreak = FALSE;
- }
-
- if (len > 128) {
- break_positions = (int*) malloc (sizeof(int) * len);
- memset (break_positions, 0, sizeof(int) * len);
- brp_size = len;
- }
- else {
- break_positions = brp;
- brp_size = 128;
- }
-
- if (break_positions) {
- attributes[0].wordBreak = TRUE;
- attributes[0].wordStart = TRUE;
- attributes[0].wordEnd = FALSE;
- numbreaks = th_brk((const unsigned char *)cstr, break_positions, brp_size);
- for (i = 0; i < numbreaks; ++i) {
- attributes[break_positions[i]].wordBreak = TRUE;
- attributes[break_positions[i]].wordStart = TRUE;
- attributes[break_positions[i]].wordEnd = TRUE;
- attributes[break_positions[i]].lineBreak = TRUE;
- }
- if (numbreaks > 0)
- attributes[break_positions[numbreaks - 1]].wordStart = FALSE;
-
- if (break_positions != brp)
- free(break_positions);
- }
-
- /* manage grapheme boundaries */
- i = 0;
- while (i < len) {
- cell_length = (hb_uint32)(th_next_cell((const unsigned char *)cstr + i, len - i, &tis_cell, true));
-
- attributes[i].graphemeBoundary = true;
- for (j = 1; j < cell_length; j++)
- attributes[i + j].graphemeBoundary = false;
-
- /* Set graphemeBoundary for SARA AM */
- if (cstr[i + cell_length - 1] == (char)0xd3)
- attributes[i + cell_length - 1].graphemeBoundary = true;
-
- i += cell_length;
- }
-
- if (len >= 128)
- free(cstr);
-}
-
-void HB_ThaiAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes)
-{
- assert(script == HB_Script_Thai);
- const HB_UChar16 *uc = text + from;
- attributes += from;
- HB_UNUSED(script);
- HB_ThaiAssignAttributes(uc, len, attributes);
-}
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-tibetan.c b/src/3rdparty/harfbuzz/src/harfbuzz-tibetan.c
deleted file mode 100644
index e39fd0e1f2..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz-tibetan.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-
-/*
- tibetan syllables are of the form:
- head position consonant
- first sub-joined consonant
- ....intermediate sub-joined consonants (if any)
- last sub-joined consonant
- sub-joined vowel (a-chung U+0F71)
- standard or compound vowel sign (or 'virama' for devanagari transliteration)
-*/
-
-typedef enum {
- TibetanOther,
- TibetanHeadConsonant,
- TibetanSubjoinedConsonant,
- TibetanSubjoinedVowel,
- TibetanVowel
-} TibetanForm;
-
-/* this table starts at U+0f40 */
-static const unsigned char tibetanForm[0x80] = {
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
- TibetanOther, TibetanOther, TibetanOther, TibetanOther,
-
- TibetanOther, TibetanVowel, TibetanVowel, TibetanVowel,
- TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
- TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
- TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
-
- TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
- TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
- TibetanOther, TibetanOther, TibetanOther, TibetanOther,
- TibetanOther, TibetanOther, TibetanOther, TibetanOther,
-
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
- TibetanSubjoinedConsonant, TibetanOther, TibetanOther, TibetanOther
-};
-
-
-#define tibetan_form(c) \
- ((c) >= 0x0f40 && (c) < 0x0fc0 ? (TibetanForm)tibetanForm[(c) - 0x0f40] : TibetanOther)
-
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature tibetan_features[] = {
- { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
- { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty },
- { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty },
- { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty },
- {0, 0}
-};
-#endif
-
-static HB_Bool tibetan_shape_syllable(HB_Bool openType, HB_ShaperItem *item, HB_Bool invalid)
-{
- hb_uint32 i;
- const HB_UChar16 *str = item->string + item->item.pos;
- int len = item->item.length;
-#ifndef NO_OPENTYPE
- const int availableGlyphs = item->num_glyphs;
-#endif
- HB_Bool haveGlyphs;
- HB_STACKARRAY(HB_UChar16, reordered, len + 4);
-
- if (item->num_glyphs < item->item.length + 4) {
- item->num_glyphs = item->item.length + 4;
- HB_FREE_STACKARRAY(reordered);
- return FALSE;
- }
-
- if (invalid) {
- *reordered = 0x25cc;
- memcpy(reordered+1, str, len*sizeof(HB_UChar16));
- len++;
- str = reordered;
- }
-
- haveGlyphs = item->font->klass->convertStringToGlyphIndices(item->font,
- str, len,
- item->glyphs, &item->num_glyphs,
- item->item.bidiLevel % 2);
-
- HB_FREE_STACKARRAY(reordered);
-
- if (!haveGlyphs)
- return FALSE;
-
- for (i = 0; i < item->item.length; i++) {
- item->attributes[i].mark = FALSE;
- item->attributes[i].clusterStart = FALSE;
- item->attributes[i].justification = 0;
- item->attributes[i].zeroWidth = FALSE;
-/* IDEBUG(" %d: %4x", i, str[i]); */
- }
-
- /* now we have the syllable in the right order, and can start running it through open type. */
-
-#ifndef NO_OPENTYPE
- if (openType) {
- HB_OpenTypeShape(item, /*properties*/0);
- if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE))
- return FALSE;
- } else {
- HB_HeuristicPosition(item);
- }
-#endif
-
- item->attributes[0].clusterStart = TRUE;
- return TRUE;
-}
-
-
-static int tibetan_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid)
-{
- const HB_UChar16 *uc = s + start;
-
- int pos = 0;
- TibetanForm state = tibetan_form(*uc);
-
-/* qDebug("state[%d]=%d (uc=%4x)", pos, state, uc[pos]);*/
- pos++;
-
- if (state != TibetanHeadConsonant) {
- if (state != TibetanOther)
- *invalid = TRUE;
- goto finish;
- }
-
- while (pos < end - start) {
- TibetanForm newState = tibetan_form(uc[pos]);
- switch(newState) {
- case TibetanSubjoinedConsonant:
- case TibetanSubjoinedVowel:
- if (state != TibetanHeadConsonant &&
- state != TibetanSubjoinedConsonant)
- goto finish;
- state = newState;
- break;
- case TibetanVowel:
- if (state != TibetanHeadConsonant &&
- state != TibetanSubjoinedConsonant &&
- state != TibetanSubjoinedVowel)
- goto finish;
- break;
- case TibetanOther:
- case TibetanHeadConsonant:
- goto finish;
- }
- pos++;
- }
-
-finish:
- *invalid = FALSE;
- return start+pos;
-}
-
-HB_Bool HB_TibetanShape(HB_ShaperItem *item)
-{
-
- HB_Bool openType = FALSE;
- unsigned short *logClusters = item->log_clusters;
-
- HB_ShaperItem syllable = *item;
- int first_glyph = 0;
-
- int sstart = item->item.pos;
- int end = sstart + item->item.length;
-
- assert(item->item.script == HB_Script_Tibetan);
-
-#ifndef NO_OPENTYPE
- openType = HB_SelectScript(item, tibetan_features);
-#endif
-
- while (sstart < end) {
- HB_Bool invalid;
- int i;
- int send = tibetan_nextSyllableBoundary(item->string, sstart, end, &invalid);
-/* IDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart,
- invalid ? "TRUE" : "FALSE"); */
- syllable.item.pos = sstart;
- syllable.item.length = send-sstart;
- syllable.glyphs = item->glyphs + first_glyph;
- syllable.attributes = item->attributes + first_glyph;
- syllable.offsets = item->offsets + first_glyph;
- syllable.advances = item->advances + first_glyph;
- syllable.num_glyphs = item->num_glyphs - first_glyph;
- if (!tibetan_shape_syllable(openType, &syllable, invalid)) {
- item->num_glyphs += syllable.num_glyphs;
- return FALSE;
- }
- /* fix logcluster array */
- for (i = sstart; i < send; ++i)
- logClusters[i-item->item.pos] = first_glyph;
- sstart = send;
- first_glyph += syllable.num_glyphs;
- }
- item->num_glyphs = first_glyph;
- return TRUE;
-}
-
-void HB_TibetanAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes)
-{
- int end = from + len;
- const HB_UChar16 *uc = text + from;
- hb_uint32 i = 0;
- HB_UNUSED(script);
- attributes += from;
- while (i < len) {
- HB_Bool invalid;
- hb_uint32 boundary = tibetan_nextSyllableBoundary(text, from+i, end, &invalid) - from;
-
- attributes[i].graphemeBoundary = TRUE;
-
- if (boundary > len-1) boundary = len;
- i++;
- while (i < boundary) {
- attributes[i].graphemeBoundary = FALSE;
- ++uc;
- ++i;
- }
- assert(i == boundary);
- }
-}
-
-
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz.c b/src/3rdparty/harfbuzz/src/harfbuzz.c
deleted file mode 100644
index 3e4a30a125..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#define HB_INTERNAL static
-#include "harfbuzz-buffer.c"
-#include "harfbuzz-gdef.c"
-#include "harfbuzz-gsub.c"
-#include "harfbuzz-gpos.c"
-#include "harfbuzz-impl.c"
-#include "harfbuzz-open.c"
-#include "harfbuzz-stream.c"
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz.h b/src/3rdparty/harfbuzz/src/harfbuzz.h
deleted file mode 100644
index e91a33eb71..0000000000
--- a/src/3rdparty/harfbuzz/src/harfbuzz.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 1998-2004 David Turner and Werner Lemberg
- * Copyright (C) 2006 Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_H
-#define HARFBUZZ_H
-
-#include "harfbuzz-external.h"
-#include "harfbuzz-global.h"
-#include "harfbuzz-buffer.h"
-#include "harfbuzz-gdef.h"
-#include "harfbuzz-gsub.h"
-#include "harfbuzz-gpos.h"
-#include "harfbuzz-open.h"
-#include "harfbuzz-shaper.h"
-
-#endif /* HARFBUZZ_OPEN_H */
diff --git a/src/3rdparty/harfbuzz/tests/Makefile.am b/src/3rdparty/harfbuzz/tests/Makefile.am
deleted file mode 100644
index 9196ad730f..0000000000
--- a/src/3rdparty/harfbuzz/tests/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-
-SUBDIRS =
-
-if QT
-SUBDIRS += shaping
-endif
-
diff --git a/src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc b/src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc
deleted file mode 100644
index 133577a09c..0000000000
--- a/src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc
+++ /dev/null
@@ -1,124 +0,0 @@
-// This is a fuzzing harness for Harfbuzz. Since Harfbuzz's input is generally
-// expected to be controlled by a remote party it's a possible vector for
-// security issues.
-//
-// Fuzzing is a black-box testing scheme where the black-box (Harfbuzz's shaping
-// engine in this case) is fed random input to see if it will misbehave.
-// Misbehaviours can often be turned into security or crash issues.
-//
-// It's expected that one will generally run this under valgrind in order to get
-// better detection of problems.
-
-#include <stdint.h>
-#include <stdio.h>
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-#include "../../src/harfbuzz-shaper.h"
-#include "../../src/harfbuzz-global.h"
-#include "../../src/harfbuzz-gpos.h"
-
-extern "C" {
-#include "../../contrib/harfbuzz-unicode.h"
-#include "../../contrib/harfbuzz-freetype.h"
-}
-
-static FT_Library freetype;
-
-static FT_Face loadFace(const char *path)
-{
- FT_Face face;
-
- if (FT_New_Face(freetype, path, /* index */ 0, &face))
- return 0;
- return face;
-}
-
-static const int kWidth = 100;
-static const int kHeight = 100;
-
-static int
-usage(const char *argv0) {
- fprintf(stderr, "Usage: %s <TTF file>\n", argv0);
- return 1;
-}
-
-int
-main(int argc, char **argv) {
- FT_Init_FreeType(&freetype);
-
- if (argc != 2)
- return usage(argv[0]);
-
- FT_Face face;
- if (FT_New_Face(freetype, argv[1], 0 /* face index */, &face)) {
- fprintf(stderr, "Failed to load font file\n");
- return 1;
- }
-
- HB_Face hbFace = HB_NewFace(face, hb_freetype_table_sfnt_get);
-
- HB_FontRec hbFont;
- hbFont.klass = &hb_freetype_class;
- hbFont.userData = face;
- hbFont.x_ppem = face->size->metrics.x_ppem;
- hbFont.y_ppem = face->size->metrics.y_ppem;
- hbFont.x_scale = face->size->metrics.x_scale;
- hbFont.y_scale = face->size->metrics.y_scale;
-
- // This is the maximum number of bytes of input which we'll feed to Harfbuzz
- // in one shot. We also overload it and make it the size of the output arrays
- // as well. (Must be a power of two.)
- static const unsigned kMaxInputBytes = 1024;
- uint8_t str[kMaxInputBytes];
-
- HB_ShaperItem shaper_item;
- shaper_item.kerning_applied = false;
- shaper_item.string = (HB_UChar16 *) str;
- shaper_item.stringLength = 0;
- shaper_item.item.bidiLevel = 0;
- shaper_item.shaperFlags = 0;
- shaper_item.font = &hbFont;
- shaper_item.face = hbFace;
- shaper_item.glyphIndicesPresent = false;
- shaper_item.initialGlyphCount = 0;
-
- HB_Glyph out_glyphs[kMaxInputBytes];
- HB_GlyphAttributes out_attrs[kMaxInputBytes];
- HB_Fixed out_advs[kMaxInputBytes];
- HB_FixedPoint out_offsets[kMaxInputBytes];
- unsigned short out_logClusters[kMaxInputBytes];
-
- shaper_item.glyphs = out_glyphs;
- shaper_item.attributes = out_attrs;
- shaper_item.advances = out_advs;
- shaper_item.offsets = out_offsets;
- shaper_item.log_clusters = out_logClusters;
- shaper_item.num_glyphs = kMaxInputBytes;
-
- FILE *urandom = fopen("/dev/urandom", "rb");
- if (!urandom) {
- fprintf(stderr, "Cannot open /dev/urandom\n");
- return 1;
- }
-
- for (;;) {
- uint16_t len;
- fread(&len, sizeof(len), 1, urandom);
- len &= (kMaxInputBytes - 1);
- len &= ~1;
- fread(str, len, 1, urandom);
-
- ssize_t iterator = 0;
-
- for (;;) {
- if (!hb_utf16_script_run_next(NULL, &shaper_item.item, (uint16_t *) str, len >> 1, &iterator))
- break;
-
- HB_ShapeItem(&shaper_item);
- }
- }
-
- HB_FreeFace(hbFace);
-}
diff --git a/src/3rdparty/harfbuzz/tests/shaping/.gitignore b/src/3rdparty/harfbuzz/tests/shaping/.gitignore
deleted file mode 100644
index 3f32cbeb9a..0000000000
--- a/src/3rdparty/harfbuzz/tests/shaping/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-harfbuzz-test-fonts-0.1.tar.bz2
-fonts
diff --git a/src/3rdparty/harfbuzz/tests/shaping/Makefile.am b/src/3rdparty/harfbuzz/tests/shaping/Makefile.am
deleted file mode 100644
index 5a7da0abf3..0000000000
--- a/src/3rdparty/harfbuzz/tests/shaping/Makefile.am
+++ /dev/null
@@ -1,14 +0,0 @@
-
-check_PROGRAMS = shaping
-
-shaping_SOURCES = main.cpp harfbuzz-qt.cpp
-shaping_LDADD = $(QT_GUI_LIBS) $(QT_QTEST_LIBS) ../../src/libharfbuzz-1.la
-
-main.o: main.moc
-
-main.moc: $(srcdir)/main.cpp
- $(QT_MOC) -o main.moc $(srcdir)/main.cpp
-
-INCLUDES = -I$(top_srcdir)/src $(FREETYPE_CFLAGS) $(QT_GUI_CFLAGS) $(QT_QTEST_CFLAGS)
-AM_CPPFLAGS = -DQT_GUI_LIB -DSRCDIR=\"$(srcdir)\"
-
diff --git a/src/3rdparty/harfbuzz/tests/shaping/README b/src/3rdparty/harfbuzz/tests/shaping/README
deleted file mode 100644
index 1db1c5a708..0000000000
--- a/src/3rdparty/harfbuzz/tests/shaping/README
+++ /dev/null
@@ -1,9 +0,0 @@
-These shaper tests need some specific TrueType fonts. You can get a package of
-them from
-
- http://people.freedesktop.org/~hausmann/harfbuzz-test-fonts-0.1.tar.bz2
-
-In addition you may need two fonts (Mangal and Tunga) from Microsoft Windows
-for some of the test cases. These fonts are not freely redistributable.
-
-The test program looks for them in a fonts/ subdirectory.
diff --git a/src/3rdparty/harfbuzz/tests/shaping/harfbuzz-qt.cpp b/src/3rdparty/harfbuzz/tests/shaping/harfbuzz-qt.cpp
deleted file mode 100644
index c44f52752e..0000000000
--- a/src/3rdparty/harfbuzz/tests/shaping/harfbuzz-qt.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include <harfbuzz-external.h>
-#include <QChar>
-#include <QLibrary>
-
-extern "C" {
-
-void HB_GetUnicodeCharProperties(HB_UChar32 ch, HB_CharCategory *category, int *combiningClass)
-{
- *category = (HB_CharCategory)QChar::category(ch);
- *combiningClass = QChar::combiningClass(ch);
-}
-
-HB_CharCategory HB_GetUnicodeCharCategory(HB_UChar32 ch)
-{
- return (HB_CharCategory)QChar::category(ch);
-}
-
-int HB_GetUnicodeCharCombiningClass(HB_UChar32 ch)
-{
- return QChar::combiningClass(ch);
-}
-
-HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch)
-{
- return QChar::mirroredChar(ch);
-}
-
-void (*HB_Library_Resolve(const char *library, int version, const char *symbol))()
-{
- return QLibrary::resolve(library, version, symbol);
-}
-
-}
diff --git a/src/3rdparty/harfbuzz/tests/shaping/main.cpp b/src/3rdparty/harfbuzz/tests/shaping/main.cpp
deleted file mode 100644
index 16f469029b..0000000000
--- a/src/3rdparty/harfbuzz/tests/shaping/main.cpp
+++ /dev/null
@@ -1,1317 +0,0 @@
-/*
- * Copyright (C) 2015 The Qt Company Ltd
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include <QtTest/QtTest>
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_TRUETYPE_TABLES_H
-
-#include <harfbuzz-shaper.h>
-#include <harfbuzz-global.h>
-#include <harfbuzz-gpos.h>
-
-static FT_Library freetype;
-
-static FT_Face loadFace(const char *name)
-{
- FT_Face face;
- char path[256];
-
- strcpy(path, SRCDIR);
- strcat(path, "/fonts/");
- strcat(path, name);
-
- if (FT_New_Face(freetype, path, /*index*/0, &face))
- return 0;
- return face;
-}
-
-static HB_UChar32 getChar(const HB_UChar16 *string, hb_uint32 length, hb_uint32 &i)
-{
- HB_UChar32 ch;
- if (HB_IsHighSurrogate(string[i])
- && i < length - 1
- && HB_IsLowSurrogate(string[i + 1])) {
- ch = HB_SurrogateToUcs4(string[i], string[i + 1]);
- ++i;
- } else {
- ch = string[i];
- }
- return ch;
-}
-
-static HB_Bool hb_stringToGlyphs(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool /*rightToLeft*/)
-{
- FT_Face face = (FT_Face)font->userData;
- if (length > *numGlyphs)
- return false;
-
- int glyph_pos = 0;
- for (hb_uint32 i = 0; i < length; ++i) {
- glyphs[glyph_pos] = FT_Get_Char_Index(face, getChar(string, length, i));
- ++glyph_pos;
- }
-
- *numGlyphs = glyph_pos;
-
- return true;
-}
-
-static void hb_getAdvances(HB_Font /*font*/, const HB_Glyph * /*glyphs*/, hb_uint32 numGlyphs, HB_Fixed *advances, int /*flags*/)
-{
- for (hb_uint32 i = 0; i < numGlyphs; ++i)
- advances[i] = 0; // ### not tested right now
-}
-
-static HB_Bool hb_canRender(HB_Font font, const HB_UChar16 *string, hb_uint32 length)
-{
- FT_Face face = (FT_Face)font->userData;
-
- for (hb_uint32 i = 0; i < length; ++i)
- if (!FT_Get_Char_Index(face, getChar(string, length, i)))
- return false;
-
- return true;
-}
-
-static HB_Error hb_getSFntTable(void *font, HB_Tag tableTag, HB_Byte *buffer, HB_UInt *length)
-{
- FT_Face face = (FT_Face)font;
- FT_ULong ftlen = *length;
- FT_Error error = 0;
-
- if (!FT_IS_SFNT(face))
- return HB_Err_Invalid_Argument;
-
- error = FT_Load_Sfnt_Table(face, tableTag, 0, buffer, &ftlen);
- *length = ftlen;
- return (HB_Error)error;
-}
-
-HB_Error hb_getPointInOutline(HB_Font font, HB_Glyph glyph, int flags, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints)
-{
- HB_Error error = HB_Err_Ok;
- FT_Face face = (FT_Face)font->userData;
-
- int load_flags = (flags & HB_ShaperFlag_UseDesignMetrics) ? FT_LOAD_NO_HINTING : FT_LOAD_DEFAULT;
-
- if ((error = (HB_Error)FT_Load_Glyph(face, glyph, load_flags)))
- return error;
-
- if (face->glyph->format != ft_glyph_format_outline)
- return (HB_Error)HB_Err_Invalid_SubTable;
-
- *nPoints = face->glyph->outline.n_points;
- if (!(*nPoints))
- return HB_Err_Ok;
-
- if (point > *nPoints)
- return (HB_Error)HB_Err_Invalid_SubTable;
-
- *xpos = face->glyph->outline.points[point].x;
- *ypos = face->glyph->outline.points[point].y;
-
- return HB_Err_Ok;
-}
-
-void hb_getGlyphMetrics(HB_Font, HB_Glyph, HB_GlyphMetrics *metrics)
-{
- // ###
- metrics->x = metrics->y = metrics->width = metrics->height = metrics->xOffset = metrics->yOffset = 0;
-}
-
-HB_Fixed hb_getFontMetric(HB_Font, HB_FontMetric )
-{
- return 0; // ####
-}
-
-const HB_FontClass hb_fontClass = {
- hb_stringToGlyphs, hb_getAdvances, hb_canRender,
- hb_getPointInOutline, hb_getGlyphMetrics, hb_getFontMetric
-};
-
-
-class tst_QScriptEngine : public QObject
-{
-Q_OBJECT
-
-public:
- tst_QScriptEngine();
- virtual ~tst_QScriptEngine();
-
-
-public slots:
- void initTestCase();
- void cleanupTestCase();
-private slots:
- void greek();
-
- void devanagari();
- void bengali();
- void gurmukhi();
- // gujarati missing
- void oriya();
- void tamil();
- void telugu();
- void kannada();
- void malayalam();
- void sinhala();
-
- void khmer();
- void nko();
- void linearB();
-};
-
-tst_QScriptEngine::tst_QScriptEngine()
-{
-}
-
-tst_QScriptEngine::~tst_QScriptEngine()
-{
-}
-
-void tst_QScriptEngine::initTestCase()
-{
- FT_Init_FreeType(&freetype);
-}
-
-void tst_QScriptEngine::cleanupTestCase()
-{
- FT_Done_FreeType(freetype);
-}
-
-class Shaper
-{
-public:
- Shaper(FT_Face face, HB_Script script, const QString &str);
-
- HB_FontRec hbFont;
- HB_ShaperItem shaper_item;
- QVarLengthArray<HB_Glyph> hb_glyphs;
- QVarLengthArray<HB_GlyphAttributes> hb_attributes;
- QVarLengthArray<HB_Fixed> hb_advances;
- QVarLengthArray<HB_FixedPoint> hb_offsets;
- QVarLengthArray<unsigned short> hb_logClusters;
-
-};
-
-Shaper::Shaper(FT_Face face, HB_Script script, const QString &str)
-{
- HB_Face hbFace = HB_NewFace(face, hb_getSFntTable);
-
- hbFont.klass = &hb_fontClass;
- hbFont.userData = face;
- hbFont.x_ppem = face->size->metrics.x_ppem;
- hbFont.y_ppem = face->size->metrics.y_ppem;
- hbFont.x_scale = face->size->metrics.x_scale;
- hbFont.y_scale = face->size->metrics.y_scale;
-
- shaper_item.kerning_applied = false;
- shaper_item.string = reinterpret_cast<const HB_UChar16 *>(str.constData());
- shaper_item.stringLength = str.length();
- shaper_item.item.script = script;
- shaper_item.item.pos = 0;
- shaper_item.item.length = shaper_item.stringLength;
- shaper_item.item.bidiLevel = 0; // ###
- shaper_item.shaperFlags = 0;
- shaper_item.font = &hbFont;
- shaper_item.face = hbFace;
- shaper_item.num_glyphs = shaper_item.item.length;
- shaper_item.glyphIndicesPresent = false;
- shaper_item.initialGlyphCount = 0;
-
-
- while (1) {
- hb_glyphs.resize(shaper_item.num_glyphs);
- hb_attributes.resize(shaper_item.num_glyphs);
- hb_advances.resize(shaper_item.num_glyphs);
- hb_offsets.resize(shaper_item.num_glyphs);
- hb_logClusters.resize(shaper_item.num_glyphs);
-
- memset(hb_glyphs.data(), 0, hb_glyphs.size() * sizeof(HB_Glyph));
- memset(hb_attributes.data(), 0, hb_attributes.size() * sizeof(HB_GlyphAttributes));
- memset(hb_advances.data(), 0, hb_advances.size() * sizeof(HB_Fixed));
- memset(hb_offsets.data(), 0, hb_offsets.size() * sizeof(HB_FixedPoint));
-
- shaper_item.glyphs = hb_glyphs.data();
- shaper_item.attributes = hb_attributes.data();
- shaper_item.advances = hb_advances.data();
- shaper_item.offsets = hb_offsets.data();
- shaper_item.log_clusters = hb_logClusters.data();
-
- if (HB_ShapeItem(&shaper_item))
- break;
- }
-
- HB_FreeFace(hbFace);
-}
-
-
-static bool decomposedShaping(FT_Face face, HB_Script script, const QChar &ch)
-{
- QString uc = QString().append(ch);
- Shaper shaper(face, script, uc);
-
- uc = uc.normalized(QString::NormalizationForm_D);
- Shaper decomposed(face, script, uc);
-
- if( shaper.shaper_item.num_glyphs != decomposed.shaper_item.num_glyphs )
- goto error;
-
- for (unsigned int i = 0; i < shaper.shaper_item.num_glyphs; ++i) {
- if ((shaper.shaper_item.glyphs[i]&0xffffff) != (decomposed.shaper_item.glyphs[i]&0xffffff))
- goto error;
- }
- return true;
- error:
- QString str = "";
- int i = 0;
- while (i < uc.length()) {
- str += QString("%1 ").arg(uc[i].unicode(), 4, 16);
- ++i;
- }
- qDebug("%s: decomposedShaping of char %4x failed\n decomposedString: %s\n nglyphs=%d, decomposed nglyphs %d",
- face->family_name,
- ch.unicode(), str.toLatin1().data(),
- shaper.shaper_item.num_glyphs,
- decomposed.shaper_item.num_glyphs);
-
- str = "";
- i = 0;
- while (i < shaper.shaper_item.num_glyphs) {
- str += QString("%1 ").arg(shaper.shaper_item.glyphs[i], 4, 16);
- ++i;
- }
- qDebug(" composed glyph result = %s", str.toLatin1().constData());
- str = "";
- i = 0;
- while (i < decomposed.shaper_item.num_glyphs) {
- str += QString("%1 ").arg(decomposed.shaper_item.glyphs[i], 4, 16);
- ++i;
- }
- qDebug(" decomposed glyph result = %s", str.toLatin1().constData());
- return false;
-}
-
-struct ShapeTable {
- unsigned short unicode[16];
- unsigned short glyphs[16];
-};
-
-static bool shaping(FT_Face face, const ShapeTable *s, HB_Script script)
-{
- Shaper shaper(face, script, QString::fromUtf16( s->unicode ));
-
- hb_uint32 nglyphs = 0;
- const unsigned short *g = s->glyphs;
- while ( *g ) {
- nglyphs++;
- g++;
- }
-
- if( nglyphs != shaper.shaper_item.num_glyphs )
- goto error;
-
- for (hb_uint32 i = 0; i < nglyphs; ++i) {
- if ((shaper.shaper_item.glyphs[i]&0xffffff) != s->glyphs[i])
- goto error;
- }
- return true;
- error:
- QString str = "";
- const unsigned short *uc = s->unicode;
- while (*uc) {
- str += QString("%1 ").arg(*uc, 4, 16);
- ++uc;
- }
- qDebug("%s: shaping of string %s failed, nglyphs=%d, expected %d",
- face->family_name,
- str.toLatin1().constData(),
- shaper.shaper_item.num_glyphs, nglyphs);
-
- str = "";
- hb_uint32 i = 0;
- while (i < shaper.shaper_item.num_glyphs) {
- str += QString("%1 ").arg(shaper.shaper_item.glyphs[i], 4, 16);
- ++i;
- }
- qDebug(" glyph result = %s", str.toLatin1().constData());
- return false;
-}
-
-
-void tst_QScriptEngine::greek()
-{
- FT_Face face = loadFace("DejaVuSans.ttf");
- if (face) {
- for (int uc = 0x1f00; uc <= 0x1fff; ++uc) {
- QString str;
- str.append(uc);
- if (str.normalized(QString::NormalizationForm_D).normalized(QString::NormalizationForm_C) != str) {
- //qDebug() << "skipping" << Qt::hex << uc;
- continue;
- }
- if (uc == 0x1fc1 || uc == 0x1fed)
- continue;
- QVERIFY( decomposedShaping(face, HB_Script_Greek, QChar(uc)) );
- }
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find DejaVu Sans");
- }
-
-
- face = loadFace("SBL_grk.ttf");
- if (face) {
- for (int uc = 0x1f00; uc <= 0x1fff; ++uc) {
- QString str;
- str.append(uc);
- if (str.normalized(QString::NormalizationForm_D).normalized(QString::NormalizationForm_C) != str) {
- //qDebug() << "skipping" << Qt::hex << uc;
- continue;
- }
- if (uc == 0x1fc1 || uc == 0x1fed)
- continue;
- QVERIFY( decomposedShaping(face, HB_Script_Greek, QChar(uc)) );
-
- }
-
- const ShapeTable shape_table [] = {
- { { 0x3b1, 0x300, 0x313, 0x0 },
- { 0xb8, 0x3d3, 0x3c7, 0x0 } },
- { { 0x3b1, 0x313, 0x300, 0x0 },
- { 0xd4, 0x0 } },
-
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Greek) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find DejaVu Sans");
- }
-}
-
-
-void tst_QScriptEngine::devanagari()
-{
- {
- FT_Face face = loadFace("raghu.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- // Ka
- { { 0x0915, 0x0 },
- { 0x0080, 0x0 } },
- // Ka Halant
- { { 0x0915, 0x094d, 0x0 },
- { 0x0080, 0x0051, 0x0 } },
- // Ka Halant Ka
- { { 0x0915, 0x094d, 0x0915, 0x0 },
- { 0x00c8, 0x0080, 0x0 } },
- // Ka MatraI
- { { 0x0915, 0x093f, 0x0 },
- { 0x01d1, 0x0080, 0x0 } },
- // Ra Halant Ka
- { { 0x0930, 0x094d, 0x0915, 0x0 },
- { 0x0080, 0x005b, 0x0 } },
- // Ra Halant Ka MatraI
- { { 0x0930, 0x094d, 0x0915, 0x093f, 0x0 },
- { 0x01d1, 0x0080, 0x005b, 0x0 } },
- // MatraI
- { { 0x093f, 0x0 },
- { 0x01d4, 0x029c, 0x0 } },
- // Ka Nukta
- { { 0x0915, 0x093c, 0x0 },
- { 0x00a4, 0x0 } },
- // Ka Halant Ra
- { { 0x0915, 0x094d, 0x0930, 0x0 },
- { 0x0110, 0x0 } },
- // Ka Halant Ra Halant Ka
- { { 0x0915, 0x094d, 0x0930, 0x094d, 0x0915, 0x0 },
- { 0x0158, 0x0080, 0x0 } },
- { { 0x0930, 0x094d, 0x200d, 0x0 },
- { 0x00e2, 0x0 } },
- { { 0x0915, 0x094d, 0x0930, 0x094d, 0x200d, 0x0 },
- { 0x0158, 0x0 } },
-
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Devanagari) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find raghu.ttf");
- }
- }
-
- {
- FT_Face face = loadFace("mangal.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- // Ka
- { { 0x0915, 0x0 },
- { 0x0080, 0x0 } },
- // Ka Halant
- { { 0x0915, 0x094d, 0x0 },
- { 0x0080, 0x0051, 0x0 } },
- // Ka Halant Ka
- { { 0x0915, 0x094d, 0x0915, 0x0 },
- { 0x00c8, 0x0080, 0x0 } },
- // Ka MatraI
- { { 0x0915, 0x093f, 0x0 },
- { 0x01d1, 0x0080, 0x0 } },
- // Ra Halant Ka
- { { 0x0930, 0x094d, 0x0915, 0x0 },
- { 0x0080, 0x005b, 0x0 } },
- // Ra Halant Ka MatraI
- { { 0x0930, 0x094d, 0x0915, 0x093f, 0x0 },
- { 0x01d1, 0x0080, 0x005b, 0x0 } },
- // MatraI
- { { 0x093f, 0x0 },
- { 0x01d4, 0x029c, 0x0 } },
- // Ka Nukta
- { { 0x0915, 0x093c, 0x0 },
- { 0x00a4, 0x0 } },
- // Ka Halant Ra
- { { 0x0915, 0x094d, 0x0930, 0x0 },
- { 0x0110, 0x0 } },
- // Ka Halant Ra Halant Ka
- { { 0x0915, 0x094d, 0x0930, 0x094d, 0x0915, 0x0 },
- { 0x0158, 0x0080, 0x0 } },
-
- { { 0x92b, 0x94d, 0x930, 0x0 },
- { 0x125, 0x0 } },
- { { 0x92b, 0x93c, 0x94d, 0x930, 0x0 },
- { 0x149, 0x0 } },
- { {0}, {0} }
- };
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Devanagari) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couldn't find mangal.ttf");
- }
- }
-}
-
-void tst_QScriptEngine::bengali()
-{
- {
- FT_Face face = loadFace("AkaashNormal.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- // Ka
- { { 0x0995, 0x0 },
- { 0x0151, 0x0 } },
- // Ka Halant
- { { 0x0995, 0x09cd, 0x0 },
- { 0x0151, 0x017d, 0x0 } },
- // Ka Halant Ka
- { { 0x0995, 0x09cd, 0x0995, 0x0 },
- { 0x019b, 0x0 } },
- // Ka MatraI
- { { 0x0995, 0x09bf, 0x0 },
- { 0x0173, 0x0151, 0x0 } },
- // Ra Halant Ka
- { { 0x09b0, 0x09cd, 0x0995, 0x0 },
- { 0x0151, 0x0276, 0x0 } },
- // Ra Halant Ka MatraI
- { { 0x09b0, 0x09cd, 0x0995, 0x09bf, 0x0 },
- { 0x0173, 0x0151, 0x0276, 0x0 } },
- // Ka Nukta
- { { 0x0995, 0x09bc, 0x0 },
- { 0x0151, 0x0171, 0x0 } },
- // Ka Halant Ra
- { { 0x0995, 0x09cd, 0x09b0, 0x0 },
- { 0x01f4, 0x0 } },
- // Ka Halant Ra Halant Ka
- { { 0x0995, 0x09cd, 0x09b0, 0x09cd, 0x0995, 0x0 },
- { 0x025c, 0x0276, 0x0151, 0x0 } },
- // Ya + Halant
- { { 0x09af, 0x09cd, 0x0 },
- { 0x016a, 0x017d, 0x0 } },
- // Da Halant Ya -> Da Ya-Phala
- { { 0x09a6, 0x09cd, 0x09af, 0x0 },
- { 0x01e5, 0x0 } },
- // A Halant Ya -> A Ya-phala
- { { 0x0985, 0x09cd, 0x09af, 0x0 },
- { 0x0145, 0x01cf, 0x0 } },
- // Na Halant Ka
- { { 0x09a8, 0x09cd, 0x0995, 0x0 },
- { 0x026f, 0x0151, 0x0 } },
- // Na Halant ZWNJ Ka
- { { 0x09a8, 0x09cd, 0x200c, 0x0995, 0x0 },
- { 0x0164, 0x017d, 0x0151, 0x0 } },
- // Na Halant ZWJ Ka
- { { 0x09a8, 0x09cd, 0x200d, 0x0995, 0x0 },
- { 0x026f, 0x0151, 0x0 } },
- // Ka Halant ZWNJ Ka
- { { 0x0995, 0x09cd, 0x200c, 0x0995, 0x0 },
- { 0x0151, 0x017d, 0x0151, 0x0 } },
- // Ka Halant ZWJ Ka
- { { 0x0995, 0x09cd, 0x200d, 0x0995, 0x0 },
- { 0x025c, 0x0151, 0x0 } },
- // Na Halant Ra
- { { 0x09a8, 0x09cd, 0x09b0, 0x0 },
- { 0x0207, 0x0 } },
- // Na Halant ZWNJ Ra
- { { 0x09a8, 0x09cd, 0x200c, 0x09b0, 0x0 },
- { 0x0164, 0x017d, 0x016b, 0x0 } },
- // Na Halant ZWJ Ra
- { { 0x09a8, 0x09cd, 0x200d, 0x09b0, 0x0 },
- { 0x026f, 0x016b, 0x0 } },
- // Na Halant Ba
- { { 0x09a8, 0x09cd, 0x09ac, 0x0 },
- { 0x022f, 0x0 } },
- // Na Halant ZWNJ Ba
- { { 0x09a8, 0x09cd, 0x200c, 0x09ac, 0x0 },
- { 0x0164, 0x017d, 0x0167, 0x0 } },
- // Na Halant ZWJ Ba
- { { 0x09a8, 0x09cd, 0x200d, 0x09ac, 0x0 },
- { 0x026f, 0x0167, 0x0 } },
- // Na Halant Dha
- { { 0x09a8, 0x09cd, 0x09a7, 0x0 },
- { 0x01d3, 0x0 } },
- // Na Halant ZWNJ Dha
- { { 0x09a8, 0x09cd, 0x200c, 0x09a7, 0x0 },
- { 0x0164, 0x017d, 0x0163, 0x0 } },
- // Na Halant ZWJ Dha
- { { 0x09a8, 0x09cd, 0x200d, 0x09a7, 0x0 },
- { 0x026f, 0x0163, 0x0 } },
- // Ra Halant Ka MatraAU
- { { 0x09b0, 0x09cd, 0x0995, 0x09cc, 0x0 },
- { 0x0179, 0x0151, 0x0276, 0x017e, 0x0 } },
- // Ra Halant Ba Halant Ba
- { { 0x09b0, 0x09cd, 0x09ac, 0x09cd, 0x09ac, 0x0 },
- { 0x0232, 0x0276, 0x0 } },
- { { 0x9b0, 0x9cd, 0x995, 0x9be, 0x982, 0x0 },
- { 0x151, 0x276, 0x172, 0x143, 0x0 } },
- { { 0x9b0, 0x9cd, 0x995, 0x9be, 0x983, 0x0 },
- { 0x151, 0x276, 0x172, 0x144, 0x0 } },
- // test decomposed two parts matras
- { { 0x995, 0x9c7, 0x9be, 0x0 },
- { 0x179, 0x151, 0x172, 0x0 } },
- { { 0x995, 0x9c7, 0x9d7, 0x0 },
- { 0x179, 0x151, 0x17e, 0x0 } },
- { { 0x9b0, 0x9cd, 0x9ad, 0x0 },
- { 0x168, 0x276, 0x0 } },
- { { 0x9f0, 0x9cd, 0x9ad, 0x0 },
- { 0x168, 0x276, 0x0 } },
- { { 0x9f1, 0x9cd, 0x9ad, 0x0 },
- { 0x191, 0x17d, 0x168, 0x0 } },
-
- // Ra ZWJ Halant Ya
- { { 0x09b0, 0x200d, 0x09cd, 0x09af, 0x0 },
- { 0x016b, 0x01cf, 0x0 } },
-
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Bengali) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find AkaashNormal.ttf");
- }
- }
- {
- FT_Face face = loadFace("MuktiNarrow.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- // Ka
- { { 0x0995, 0x0 },
- { 0x0073, 0x0 } },
- // Ka Halant
- { { 0x0995, 0x09cd, 0x0 },
- { 0x00b9, 0x0 } },
- // Ka Halant Ka
- { { 0x0995, 0x09cd, 0x0995, 0x0 },
- { 0x0109, 0x0 } },
- // Ka MatraI
- { { 0x0995, 0x09bf, 0x0 },
- { 0x0095, 0x0073, 0x0 } },
- // Ra Halant Ka
- { { 0x09b0, 0x09cd, 0x0995, 0x0 },
- { 0x0073, 0x00e1, 0x0 } },
- // Ra Halant Ka MatraI
- { { 0x09b0, 0x09cd, 0x0995, 0x09bf, 0x0 },
- { 0x0095, 0x0073, 0x00e1, 0x0 } },
- // MatraI
- { { 0x09bf, 0x0 },
- { 0x0095, 0x01c8, 0x0 } },
- // Ka Nukta
- { { 0x0995, 0x09bc, 0x0 },
- { 0x0073, 0x0093, 0x0 } },
- // Ka Halant Ra
- { { 0x0995, 0x09cd, 0x09b0, 0x0 },
- { 0x00e5, 0x0 } },
- // Ka Halant Ra Halant Ka
- { { 0x995, 0x9cd, 0x9b0, 0x9cd, 0x995, 0x0 },
- { 0x234, 0x24e, 0x73, 0x0 } },
- // Ya + Halant
- { { 0x09af, 0x09cd, 0x0 },
- { 0x00d2, 0x0 } },
- // Da Halant Ya -> Da Ya-Phala
- { { 0x09a6, 0x09cd, 0x09af, 0x0 },
- { 0x0084, 0x00e2, 0x0 } },
- // A Halant Ya -> A Ya-phala
- { { 0x0985, 0x09cd, 0x09af, 0x0 },
- { 0x0067, 0x00e2, 0x0 } },
- // Na Halant Ka
- { { 0x09a8, 0x09cd, 0x0995, 0x0 },
- { 0x0188, 0x0 } },
- // Na Halant ZWNJ Ka
- { { 0x9a8, 0x9cd, 0x200c, 0x995, 0x0 },
- { 0xcc, 0x73, 0x0 } },
- // Na Halant ZWJ Ka
- { { 0x9a8, 0x9cd, 0x200d, 0x995, 0x0 },
- { 0x247, 0x73, 0x0 } },
- // Ka Halant ZWNJ Ka
- { { 0x9a8, 0x9cd, 0x200d, 0x995, 0x0 },
- { 0x247, 0x73, 0x0 } },
- // Ka Halant ZWJ Ka
- { { 0x9a8, 0x9cd, 0x200d, 0x995, 0x0 },
- { 0x247, 0x73, 0x0 } },
- // Na Halant Ra
- { { 0x09a8, 0x09cd, 0x09b0, 0x0 },
- { 0x00f8, 0x0 } },
- // Na Halant ZWNJ Ra
- { { 0x09a8, 0x09cd, 0x200c, 0x09b0, 0x0 },
- { 0xcc, 0x8d, 0x0 } },
- // Na Halant ZWJ Ra
- { { 0x9a8, 0x9cd, 0x200d, 0x9b0, 0x0 },
- { 0x247, 0x8d, 0x0 } },
- // Na Halant Ba
- { { 0x09a8, 0x09cd, 0x09ac, 0x0 },
- { 0x0139, 0x0 } },
- // Na Halant ZWNJ Ba
- { { 0x9a8, 0x9cd, 0x200c, 0x9ac, 0x0 },
- { 0xcc, 0x89, 0x0 } },
- // Na Halant ZWJ Ba
- { { 0x9a8, 0x9cd, 0x200d, 0x9ac, 0x0 },
- { 0x247, 0x89, 0x0 } },
- // Na Halant Dha
- { { 0x09a8, 0x09cd, 0x09a7, 0x0 },
- { 0x0145, 0x0 } },
- // Na Halant ZWNJ Dha
- { { 0x09a8, 0x09cd, 0x200c, 0x09a7, 0x0 },
- { 0xcc, 0x85, 0x0 } },
- // Na Halant ZWJ Dha
- { { 0x09a8, 0x09cd, 0x200d, 0x09a7, 0x0 },
- { 0x247, 0x85, 0x0 } },
- // Ra Halant Ka MatraAU
- { { 0x9b0, 0x9cd, 0x995, 0x9cc, 0x0 },
- { 0x232, 0x73, 0xe1, 0xa0, 0x0 } },
- // Ra Halant Ba Halant Ba
- { { 0x09b0, 0x09cd, 0x09ac, 0x09cd, 0x09ac, 0x0 },
- { 0x013b, 0x00e1, 0x0 } },
-
- // Init feature for vowel sign E should only be
- // applied when it's initial character (QTBUG-13620)
- { { 0x09a8, 0x09c7, 0x0 },
- { 0x0232, 0x0086, 0x0 } },
- { { 0x09a8, 0x09a8, 0x09c7, 0x0 },
- { 0x0086, 0x009b, 0x0086, 0x0 } },
-
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Bengali) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find MuktiNarrow.ttf");
- }
- }
- {
- FT_Face face = loadFace("LikhanNormal.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0x09a8, 0x09cd, 0x09af, 0x0 },
- { 0x01ca, 0x0 } },
- { { 0x09b8, 0x09cd, 0x09af, 0x0 },
- { 0x020e, 0x0 } },
- { { 0x09b6, 0x09cd, 0x09af, 0x0 },
- { 0x01f4, 0x0 } },
- { { 0x09b7, 0x09cd, 0x09af, 0x0 },
- { 0x01fe, 0x0 } },
- { { 0x09b0, 0x09cd, 0x09a8, 0x09cd, 0x200d, 0x0 },
- { 0x10b, 0x167, 0x0 } },
- { { 0x9b0, 0x9cd, 0x9ad, 0x0 },
- { 0xa1, 0x167, 0x0 } },
- { { 0x9f0, 0x9cd, 0x9ad, 0x0 },
- { 0xa1, 0x167, 0x0 } },
- { { 0x9f1, 0x9cd, 0x9ad, 0x0 },
- { 0x11c, 0xa1, 0x0 } },
-
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Bengali) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find LikhanNormal.ttf");
- }
- }
-}
-
-void tst_QScriptEngine::gurmukhi()
-{
- {
- FT_Face face = loadFace("lohit_pa.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0xA15, 0xA4D, 0xa39, 0x0 },
- { 0x3b, 0x8b, 0x0 } },
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Gurmukhi) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find lohit.punjabi.1.1.ttf");
- }
- }
-}
-
-void tst_QScriptEngine::oriya()
-{
- {
- FT_Face face = loadFace("utkalm.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0xb15, 0xb4d, 0xb24, 0xb4d, 0xb30, 0x0 },
- { 0x150, 0x125, 0x0 } },
- { { 0xb24, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0x0 },
- { 0x151, 0x120, 0x0 } },
- { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0x0 },
- { 0x152, 0x120, 0x0 } },
- { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0x0 },
- { 0x152, 0x120, 0x0 } },
- { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb30, 0x0 },
- { 0x176, 0x0 } },
- { { 0xb38, 0xb4d, 0xb24, 0xb4d, 0xb30, 0x0 },
- { 0x177, 0x0 } },
- { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb30, 0xb4d, 0xb2f, 0x0 },
- { 0x176, 0x124, 0x0 } },
-
- // QTBUG-13542
- { { 0x0b2c, 0x0b4d, 0x0b21, 0x0 },
- { 0x0089, 0x00fc, 0x0 } },
- { { 0x0b36, 0x0b4d, 0x0b2b, 0x0 },
- { 0x0092, 0x0105, 0x0 } },
- { { 0x0b36, 0x0b4d, 0x0b1f, 0x0 },
- { 0x0092, 0x00fa, 0x0 } },
- { { 0x0b39, 0x0b4d, 0x0b1f, 0x0 },
- { 0x0095, 0x00fa, 0x0 } },
- { { 0x0b15, 0x0b4d, 0x0b16, 0x0 },
- { 0x0073, 0x00f1, 0x0 } },
-
- { {0}, {0} }
-
- };
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Oriya) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find utkalm.ttf");
- }
- }
-}
-
-
-void tst_QScriptEngine::tamil()
-{
- {
- FT_Face face = loadFace("akruti1.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0x0b95, 0x0bc2, 0x0 },
- { 0x004e, 0x0 } },
- { { 0x0bae, 0x0bc2, 0x0 },
- { 0x009e, 0x0 } },
- { { 0x0b9a, 0x0bc2, 0x0 },
- { 0x0058, 0x0 } },
- { { 0x0b99, 0x0bc2, 0x0 },
- { 0x0053, 0x0 } },
- { { 0x0bb0, 0x0bc2, 0x0 },
- { 0x00a8, 0x0 } },
- { { 0x0ba4, 0x0bc2, 0x0 },
- { 0x008e, 0x0 } },
- { { 0x0b9f, 0x0bc2, 0x0 },
- { 0x0062, 0x0 } },
- { { 0x0b95, 0x0bc6, 0x0 },
- { 0x000a, 0x0031, 0x0 } },
- { { 0x0b95, 0x0bca, 0x0 },
- { 0x000a, 0x0031, 0x0007, 0x0 } },
- { { 0x0b95, 0x0bc6, 0x0bbe, 0x0 },
- { 0x000a, 0x0031, 0x007, 0x0 } },
- { { 0x0b95, 0x0bcd, 0x0bb7, 0x0 },
- { 0x0049, 0x0 } },
- { { 0x0b95, 0x0bcd, 0x0bb7, 0x0bca, 0x0 },
- { 0x000a, 0x0049, 0x007, 0x0 } },
- { { 0x0b95, 0x0bcd, 0x0bb7, 0x0bc6, 0x0bbe, 0x0 },
- { 0x000a, 0x0049, 0x007, 0x0 } },
- { { 0x0b9f, 0x0bbf, 0x0 },
- { 0x005f, 0x0 } },
- { { 0x0b9f, 0x0bc0, 0x0 },
- { 0x0060, 0x0 } },
- { { 0x0bb2, 0x0bc0, 0x0 },
- { 0x00ab, 0x0 } },
- { { 0x0bb2, 0x0bbf, 0x0 },
- { 0x00aa, 0x0 } },
- { { 0x0bb0, 0x0bcd, 0x0 },
- { 0x00a4, 0x0 } },
- { { 0x0bb0, 0x0bbf, 0x0 },
- { 0x00a5, 0x0 } },
- { { 0x0bb0, 0x0bc0, 0x0 },
- { 0x00a6, 0x0 } },
- { { 0x0b83, 0x0 },
- { 0x0025, 0x0 } },
- { { 0x0b83, 0x0b95, 0x0 },
- { 0x0025, 0x0031, 0x0 } },
-
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Tamil) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find akruti1.ttf");
- }
- }
-}
-
-
-void tst_QScriptEngine::telugu()
-{
- {
- FT_Face face = loadFace("Pothana2000.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0xc15, 0xc4d, 0x0 },
- { 0xbb, 0x0 } },
- { { 0xc15, 0xc4d, 0xc37, 0x0 },
- { 0x4b, 0x0 } },
- { { 0xc15, 0xc4d, 0xc37, 0xc4d, 0x0 },
- { 0xe0, 0x0 } },
- { { 0xc15, 0xc4d, 0xc37, 0xc4d, 0xc23, 0x0 },
- { 0x4b, 0x91, 0x0 } },
- { { 0xc15, 0xc4d, 0xc30, 0x0 },
- { 0x5a, 0xb2, 0x0 } },
- { { 0xc15, 0xc4d, 0xc30, 0xc4d, 0x0 },
- { 0xbb, 0xb2, 0x0 } },
- { { 0xc15, 0xc4d, 0xc30, 0xc4d, 0xc15, 0x0 },
- { 0x5a, 0xb2, 0x83, 0x0 } },
- { { 0xc15, 0xc4d, 0xc30, 0xc3f, 0x0 },
- { 0xe2, 0xb2, 0x0 } },
- { { 0xc15, 0xc4d, 0xc15, 0xc48, 0x0 },
- { 0xe6, 0xb3, 0x83, 0x0 } },
- { { 0xc15, 0xc4d, 0xc30, 0xc48, 0x0 },
- { 0xe6, 0xb3, 0x9f, 0x0 } },
- { { 0xc15, 0xc46, 0xc56, 0x0 },
- { 0xe6, 0xb3, 0x0 } },
- { {0}, {0} }
- };
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Telugu) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find Pothana2000.ttf");
- }
- }
-}
-
-
-void tst_QScriptEngine::kannada()
-{
- {
- FT_Face face = loadFace("Sampige.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0x0ca8, 0x0ccd, 0x0ca8, 0x0 },
- { 0x0049, 0x00ba, 0x0 } },
- { { 0x0ca8, 0x0ccd, 0x0ca1, 0x0 },
- { 0x0049, 0x00b3, 0x0 } },
- { { 0x0caf, 0x0cc2, 0x0 },
- { 0x004f, 0x005d, 0x0 } },
- { { 0x0ce0, 0x0 },
- { 0x006a, 0x0 } },
- { { 0x0ce6, 0x0ce7, 0x0ce8, 0x0 },
- { 0x006b, 0x006c, 0x006d, 0x0 } },
- { { 0x0cb5, 0x0ccb, 0x0 },
- { 0x015f, 0x0067, 0x0 } },
- { { 0x0cb0, 0x0ccd, 0x0cae, 0x0 },
- { 0x004e, 0x0082, 0x0 } },
- { { 0x0cb0, 0x0ccd, 0x0c95, 0x0 },
- { 0x0036, 0x0082, 0x0 } },
- { { 0x0c95, 0x0ccd, 0x0cb0, 0x0 },
- { 0x0036, 0x00c1, 0x0 } },
- { { 0x0cb0, 0x0ccd, 0x200d, 0x0c95, 0x0 },
- { 0x0050, 0x00a7, 0x0 } },
-
- // Kaphala
- { { 0x0cb0, 0x200d, 0x0ccd, 0x0c95, 0x0 },
- { 0x0050, 0x00a7, 0x0 } },
-
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Kannada) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find Sampige.ttf");
- }
- }
- {
- FT_Face face = loadFace("tunga.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0x0cb7, 0x0cc6, 0x0 },
- { 0x00b0, 0x006c, 0x0 } },
- { { 0x0cb7, 0x0ccd, 0x0 },
- { 0x0163, 0x0 } },
- { { 0xc95, 0xcbf, 0xcd5, 0x0 },
- { 0x114, 0x73, 0x0 } },
- { { 0xc95, 0xcc6, 0xcd5, 0x0 },
- { 0x90, 0x6c, 0x73, 0x0 } },
- { { 0xc95, 0xcc6, 0xcd6, 0x0 },
- { 0x90, 0x6c, 0x74, 0x0 } },
- { { 0xc95, 0xcc6, 0xcc2, 0x0 },
- { 0x90, 0x6c, 0x69, 0x0 } },
- { { 0xc95, 0xcca, 0xcd5, 0x0 },
- { 0x90, 0x6c, 0x69, 0x73, 0x0 } },
-
-
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Kannada) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find tunga.ttf");
- }
- }
-}
-
-
-
-void tst_QScriptEngine::malayalam()
-{
- {
- FT_Face face = loadFace("AkrutiMal2Normal.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0x0d15, 0x0d46, 0x0 },
- { 0x005e, 0x0034, 0x0 } },
- { { 0x0d15, 0x0d47, 0x0 },
- { 0x005f, 0x0034, 0x0 } },
- { { 0x0d15, 0x0d4b, 0x0 },
- { 0x005f, 0x0034, 0x0058, 0x0 } },
- { { 0x0d15, 0x0d48, 0x0 },
- { 0x0060, 0x0034, 0x0 } },
- { { 0x0d15, 0x0d4a, 0x0 },
- { 0x005e, 0x0034, 0x0058, 0x0 } },
- { { 0x0d30, 0x0d4d, 0x0d15, 0x0 },
- { 0x009e, 0x0034, 0x0 } },
- { { 0x0d15, 0x0d4d, 0x0d35, 0x0 },
- { 0x0034, 0x007a, 0x0 } },
- { { 0x0d15, 0x0d4d, 0x0d2f, 0x0 },
- { 0x0034, 0x00a2, 0x0 } },
- { { 0x0d1f, 0x0d4d, 0x0d1f, 0x0 },
- { 0x0069, 0x0 } },
- { { 0x0d26, 0x0d4d, 0x0d26, 0x0 },
- { 0x0074, 0x0 } },
- { { 0x0d30, 0x0d4d, 0x0 },
- { 0x009e, 0x0 } },
- { { 0x0d30, 0x0d4d, 0x200c, 0x0 },
- { 0x009e, 0x0 } },
- { { 0x0d30, 0x0d4d, 0x200d, 0x0 },
- { 0x009e, 0x0 } },
- { { 0xd15, 0xd46, 0xd3e, 0x0 },
- { 0x5e, 0x34, 0x58, 0x0 } },
- { { 0xd15, 0xd47, 0xd3e, 0x0 },
- { 0x5f, 0x34, 0x58, 0x0 } },
- { { 0xd15, 0xd46, 0xd57, 0x0 },
- { 0x5e, 0x34, 0x65, 0x0 } },
- { { 0xd15, 0xd57, 0x0 },
- { 0x34, 0x65, 0x0 } },
- { { 0xd1f, 0xd4d, 0xd1f, 0xd41, 0xd4d, 0x0 },
- { 0x69, 0x5b, 0x64, 0x0 } },
-
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Malayalam) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find AkrutiMal2Normal.ttf");
- }
- }
-
- {
- FT_Face face = loadFace("Rachana.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0xd37, 0xd4d, 0xd1f, 0xd4d, 0xd30, 0xd40, 0x0 },
- { 0x385, 0xa3, 0x0 } },
- { { 0xd2f, 0xd4d, 0xd15, 0xd4d, 0xd15, 0xd41, 0x0 },
- { 0x2ff, 0x0 } },
- { { 0xd33, 0xd4d, 0xd33, 0x0 },
- { 0x3f8, 0x0 } },
- { { 0xd2f, 0xd4d, 0xd15, 0xd4d, 0xd15, 0xd41, 0x0 },
- { 0x2ff, 0x0 } },
- { { 0xd30, 0xd4d, 0x200d, 0xd35, 0xd4d, 0xd35, 0x0 },
- { 0xf3, 0x350, 0x0 } },
-
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Malayalam) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find Rachana.ttf");
- }
- }
-
-}
-
-void tst_QScriptEngine::sinhala()
-{
- {
- FT_Face face = loadFace("FM-MalithiUW46.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0xd9a, 0xdd9, 0xdcf, 0x0 },
- { 0x4a, 0x61, 0x42, 0x0 } },
- { { 0xd9a, 0xdd9, 0xddf, 0x0 },
- { 0x4a, 0x61, 0x50, 0x0 } },
- { { 0xd9a, 0xdd9, 0xdca, 0x0 },
- { 0x4a, 0x62, 0x0 } },
- { { 0xd9a, 0xddc, 0xdca, 0x0 },
- { 0x4a, 0x61, 0x42, 0x41, 0x0 } },
- { { 0xd9a, 0xdda, 0x0 },
- { 0x4a, 0x62, 0x0 } },
- { { 0xd9a, 0xddd, 0x0 },
- { 0x4a, 0x61, 0x42, 0x41, 0x0 } },
- { {0}, {0} }
- };
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Sinhala) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find FM-MalithiUW46.ttf");
- }
- }
-}
-
-
-void tst_QScriptEngine::khmer()
-{
- {
- FT_Face face = loadFace("KhmerOS.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0x179a, 0x17cd, 0x0 },
- { 0x24c, 0x27f, 0x0 } },
- { { 0x179f, 0x17c5, 0x0 },
- { 0x273, 0x203, 0x0 } },
- { { 0x1790, 0x17d2, 0x1784, 0x17c3, 0x0 },
- { 0x275, 0x242, 0x182, 0x0 } },
- { { 0x179a, 0x0 },
- { 0x24c, 0x0 } },
- { { 0x1781, 0x17d2, 0x1798, 0x17c2, 0x0 },
- { 0x274, 0x233, 0x197, 0x0 } },
- { { 0x1798, 0x17b6, 0x0 },
- { 0x1cb, 0x0 } },
- { { 0x179a, 0x17b8, 0x0 },
- { 0x24c, 0x26a, 0x0 } },
- { { 0x1787, 0x17b6, 0x0 },
- { 0x1ba, 0x0 } },
- { { 0x1798, 0x17d2, 0x1796, 0x17bb, 0x0 },
- { 0x24a, 0x195, 0x26d, 0x0 } },
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Khmer) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find KhmerOS.ttf");
- }
- }
-}
-
-void tst_QScriptEngine::nko()
-{
- {
- FT_Face face = loadFace("DejaVuSans.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0x7ca, 0x0 },
- { 0x5c1, 0x0 } },
- { { 0x7ca, 0x7ca, 0x0 },
- { 0x14db, 0x14d9, 0x0 } },
- { { 0x7ca, 0x7fa, 0x7ca, 0x0 },
- { 0x14db, 0x5ec, 0x14d9, 0x0 } },
- { { 0x7ca, 0x7f3, 0x7ca, 0x0 },
- { 0x14db, 0x5e7, 0x14d9, 0x0 } },
- { { 0x7ca, 0x7f3, 0x7fa, 0x7ca, 0x0 },
- { 0x14db, 0x5e7, 0x5ec, 0x14d9, 0x0 } },
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Nko) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find DejaVuSans.ttf");
- }
- }
-}
-
-
-void tst_QScriptEngine::linearB()
-{
- {
- FT_Face face = loadFace("penuture.ttf");
- if (face) {
- const ShapeTable shape_table [] = {
- { { 0xd800, 0xdc01, 0xd800, 0xdc02, 0xd800, 0xdc03, 0 },
- { 0x5, 0x6, 0x7, 0 } },
- { {0}, {0} }
- };
-
-
- const ShapeTable *s = shape_table;
- while (s->unicode[0]) {
- QVERIFY( shaping(face, s, HB_Script_Common) );
- ++s;
- }
-
- FT_Done_Face(face);
- } else {
- QSKIP("couln't find PENUTURE.TTF");
- }
- }
-}
-
-
-QTEST_MAIN(tst_QScriptEngine)
-#include "main.moc"
diff --git a/src/3rdparty/libpng/CMakeLists.txt b/src/3rdparty/libpng/CMakeLists.txt
new file mode 100644
index 0000000000..d1c5cea164
--- /dev/null
+++ b/src/3rdparty/libpng/CMakeLists.txt
@@ -0,0 +1,54 @@
+# Generated from libpng.pro.
+
+#####################################################################
+## BundledLibpng Generic Library:
+#####################################################################
+
+qt_add_3rdparty_library(BundledLibpng
+ STATIC
+ INSTALL
+ SOURCES
+ png.c
+ pngerror.c
+ pngget.c
+ pngmem.c
+ pngpread.c
+ pngread.c
+ pngrio.c
+ pngrtran.c
+ pngrutil.c
+ pngset.c
+ pngtrans.c
+ pngwio.c
+ pngwrite.c
+ pngwtran.c
+ pngwutil.c
+ DEFINES
+ PNG_ARM_NEON_OPT=0
+ PNG_POWERPC_VSX_OPT=0
+ PUBLIC_INCLUDE_DIRECTORIES
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+)
+qt_disable_warnings(BundledLibpng)
+qt_set_symbol_visibility_hidden(BundledLibpng)
+
+#### Keys ignored in scope 1:.:.:libpng.pro:<TRUE>:
+# TR_EXCLUDE = "$$PWD/*"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(BundledLibpng CONDITION QT_FEATURE_system_zlib
+ LIBRARIES
+ ZLIB::ZLIB
+)
+
+qt_extend_target(BundledLibpng CONDITION NOT QT_FEATURE_system_zlib
+ INCLUDE_DIRECTORIES
+ ../zlib/src
+)
+
+qt_extend_target(BundledLibpng CONDITION NOT QT_FEATURE_system_zlib AND NOT no_core_dep
+ LIBRARIES
+ Qt::Core
+)
diff --git a/src/3rdparty/pcre2/CMakeLists.txt b/src/3rdparty/pcre2/CMakeLists.txt
new file mode 100644
index 0000000000..b73f0bff9e
--- /dev/null
+++ b/src/3rdparty/pcre2/CMakeLists.txt
@@ -0,0 +1,72 @@
+# Generated from pcre2.pro.
+
+#####################################################################
+## BundledPcre2 Generic Library:
+#####################################################################
+
+qt_add_3rdparty_library(BundledPcre2
+ STATIC
+ SOURCES
+ src/config.h
+ src/pcre2.h
+ src/pcre2_auto_possess.c
+ src/pcre2_chartables.c
+ src/pcre2_compile.c
+ src/pcre2_config.c
+ src/pcre2_context.c
+ src/pcre2_dfa_match.c
+ src/pcre2_error.c
+ src/pcre2_extuni.c
+ src/pcre2_find_bracket.c
+ src/pcre2_internal.h
+ src/pcre2_intmodedep.h
+ src/pcre2_jit_compile.c
+ src/pcre2_maketables.c
+ src/pcre2_match.c
+ src/pcre2_match_data.c
+ src/pcre2_newline.c
+ src/pcre2_ord2utf.c
+ src/pcre2_pattern_info.c
+ src/pcre2_script_run.c
+ src/pcre2_serialize.c
+ src/pcre2_string_utils.c
+ src/pcre2_study.c
+ src/pcre2_substitute.c
+ src/pcre2_substring.c
+ src/pcre2_tables.c
+ src/pcre2_ucd.c
+ src/pcre2_ucp.h
+ src/pcre2_valid_utf.c
+ src/pcre2_xclass.c
+ DEFINES
+ HAVE_CONFIG_H
+ PUBLIC_DEFINES
+ PCRE2_CODE_UNIT_WIDTH=16
+ PUBLIC_INCLUDE_DIRECTORIES
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
+)
+qt_disable_warnings(BundledPcre2)
+qt_set_symbol_visibility_hidden(BundledPcre2)
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(BundledPcre2 CONDITION QNX OR UIKIT OR WINRT
+ DEFINES
+ PCRE2_DISABLE_JIT
+)
+
+qt_extend_target(BundledPcre2 CONDITION (TEST_architecture_arch STREQUAL "arm") AND WIN32
+ DEFINES
+ PCRE2_DISABLE_JIT
+)
+
+qt_extend_target(BundledPcre2 CONDITION (TEST_architecture_arch STREQUAL "arm64") AND WIN32
+ DEFINES
+ PCRE2_DISABLE_JIT
+)
+
+qt_extend_target(BundledPcre2 CONDITION WIN32
+ PUBLIC_DEFINES
+ PCRE2_STATIC
+)
diff --git a/src/3rdparty/pcre2/pcre2.pri b/src/3rdparty/pcre2/pcre2.pri
new file mode 100644
index 0000000000..fa901f783f
--- /dev/null
+++ b/src/3rdparty/pcre2/pcre2.pri
@@ -0,0 +1,41 @@
+MODULE_INCLUDEPATH += $$PWD/src
+
+MODULE_DEFINES += PCRE2_CODE_UNIT_WIDTH=16
+win32: MODULE_DEFINES += PCRE2_STATIC
+
+DEFINES += HAVE_CONFIG_H
+
+SOURCES += \
+ $$PWD/src/pcre2_auto_possess.c \
+ $$PWD/src/pcre2_chartables.c \
+ $$PWD/src/pcre2_compile.c \
+ $$PWD/src/pcre2_config.c \
+ $$PWD/src/pcre2_context.c \
+ $$PWD/src/pcre2_dfa_match.c \
+ $$PWD/src/pcre2_error.c \
+ $$PWD/src/pcre2_extuni.c \
+ $$PWD/src/pcre2_find_bracket.c \
+ $$PWD/src/pcre2_jit_compile.c \
+ $$PWD/src/pcre2_maketables.c \
+ $$PWD/src/pcre2_match.c \
+ $$PWD/src/pcre2_match_data.c \
+ $$PWD/src/pcre2_newline.c \
+ $$PWD/src/pcre2_ord2utf.c \
+ $$PWD/src/pcre2_pattern_info.c \
+ $$PWD/src/pcre2_script_run.c \
+ $$PWD/src/pcre2_serialize.c \
+ $$PWD/src/pcre2_string_utils.c \
+ $$PWD/src/pcre2_study.c \
+ $$PWD/src/pcre2_substitute.c \
+ $$PWD/src/pcre2_substring.c \
+ $$PWD/src/pcre2_tables.c \
+ $$PWD/src/pcre2_ucd.c \
+ $$PWD/src/pcre2_valid_utf.c \
+ $$PWD/src/pcre2_xclass.c
+
+HEADERS += \
+ $$PWD/src/config.h \
+ $$PWD/src/pcre2.h \
+ $$PWD/src/pcre2_internal.h \
+ $$PWD/src/pcre2_intmodedep.h \
+ $$PWD/src/pcre2_ucp.h
diff --git a/src/3rdparty/pcre2/pcre2.pro b/src/3rdparty/pcre2/pcre2.pro
index 56790f34c5..a3915fa2fa 100644
--- a/src/3rdparty/pcre2/pcre2.pro
+++ b/src/3rdparty/pcre2/pcre2.pro
@@ -5,51 +5,11 @@ CONFIG += \
hide_symbols \
exceptions_off rtti_off warn_off
-
-MODULE_DEFINES += PCRE2_CODE_UNIT_WIDTH=16
-win32: MODULE_DEFINES += PCRE2_STATIC
-MODULE_INCLUDEPATH += $$PWD/src
-
-load(qt_helper_lib)
-
-DEFINES += HAVE_CONFIG_H
+include(pcre2.pri)
# platform/compiler specific definitions
uikit|qnx|winrt: DEFINES += PCRE2_DISABLE_JIT
win32:contains(QT_ARCH, "arm"): DEFINES += PCRE2_DISABLE_JIT
win32:contains(QT_ARCH, "arm64"): DEFINES += PCRE2_DISABLE_JIT
-SOURCES += \
- $$PWD/src/pcre2_auto_possess.c \
- $$PWD/src/pcre2_chartables.c \
- $$PWD/src/pcre2_compile.c \
- $$PWD/src/pcre2_config.c \
- $$PWD/src/pcre2_context.c \
- $$PWD/src/pcre2_dfa_match.c \
- $$PWD/src/pcre2_error.c \
- $$PWD/src/pcre2_extuni.c \
- $$PWD/src/pcre2_find_bracket.c \
- $$PWD/src/pcre2_jit_compile.c \
- $$PWD/src/pcre2_maketables.c \
- $$PWD/src/pcre2_match.c \
- $$PWD/src/pcre2_match_data.c \
- $$PWD/src/pcre2_newline.c \
- $$PWD/src/pcre2_ord2utf.c \
- $$PWD/src/pcre2_pattern_info.c \
- $$PWD/src/pcre2_script_run.c \
- $$PWD/src/pcre2_serialize.c \
- $$PWD/src/pcre2_string_utils.c \
- $$PWD/src/pcre2_study.c \
- $$PWD/src/pcre2_substitute.c \
- $$PWD/src/pcre2_substring.c \
- $$PWD/src/pcre2_tables.c \
- $$PWD/src/pcre2_ucd.c \
- $$PWD/src/pcre2_valid_utf.c \
- $$PWD/src/pcre2_xclass.c
-
-HEADERS += \
- $$PWD/src/config.h \
- $$PWD/src/pcre2.h \
- $$PWD/src/pcre2_internal.h \
- $$PWD/src/pcre2_intmodedep.h \
- $$PWD/src/pcre2_ucp.h
+load(qt_helper_lib)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000000..4b1c28de25
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,70 @@
+# special case skip regeneration
+
+# We need to include the features of a few modules before they are actually declared.
+# The feature values are used as conditions for deciding whether bundled 3rd party libraries
+# should be built.
+# The order of evaluation matters.
+qt_feature_evaluate_features("${CMAKE_CURRENT_SOURCE_DIR}/corelib/configure.cmake")
+qt_feature_evaluate_features("${CMAKE_CURRENT_SOURCE_DIR}/network/configure.cmake")
+qt_feature_evaluate_features("${CMAKE_CURRENT_SOURCE_DIR}/gui/configure.cmake")
+
+add_subdirectory(3rdparty)
+
+function(find_or_build_bootstrap_names)
+ if (QT_WILL_BUILD_TOOLS)
+ add_subdirectory(tools/bootstrap) # bootstrap library
+ endif()
+ add_subdirectory(tools/moc)
+ add_subdirectory(tools/rcc)
+ add_subdirectory(tools/tracegen)
+ add_subdirectory(tools/cmake_automoc_parser)
+endfunction()
+
+find_or_build_bootstrap_names()
+
+add_subdirectory(corelib)
+if (QT_FEATURE_concurrent)
+ add_subdirectory(concurrent)
+endif()
+if (QT_FEATURE_sql)
+ add_subdirectory(sql)
+endif()
+if (QT_FEATURE_network)
+ add_subdirectory(network)
+endif()
+if (QT_FEATURE_xml)
+ add_subdirectory(xml)
+endif()
+add_subdirectory(tools)
+
+if (QT_FEATURE_dbus)
+ add_subdirectory(dbus)
+endif()
+if(QT_FEATURE_gui)
+ add_subdirectory(gui)
+
+ if(QT_FEATURE_opengl)
+ add_subdirectory(opengl)
+ add_subdirectory(openglextensions)
+ endif()
+
+ if(QT_FEATURE_widgets)
+ add_subdirectory(widgets)
+ if(QT_FEATURE_opengl)
+ add_subdirectory(openglwidgets)
+ endif()
+ endif()
+ add_subdirectory(platformsupport)
+ add_subdirectory(platformheaders)
+endif()
+if (QT_FEATURE_testlib)
+ add_subdirectory(testlib)
+endif()
+if(QT_FEATURE_gui AND QT_FEATURE_widgets)
+ add_subdirectory(printsupport)
+endif()
+add_subdirectory(plugins)
+
+add_subdirectory(winmain)
+
+add_subdirectory(android)
diff --git a/src/android/CMakeLists.txt b/src/android/CMakeLists.txt
new file mode 100644
index 0000000000..a821cee44b
--- /dev/null
+++ b/src/android/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Generated from android.pro.
+
+# special case skip regeneration
+# special case begin
+# Only build jars during Android build and install the templates for the
+# androiddeployqt tool.
+# android
+if (ANDROID)
+ add_subdirectory(jar)
+ add_subdirectory(java)
+ add_subdirectory(templates)
+endif()
+# special case end
+
diff --git a/src/android/jar/.prev_CMakeLists.txt b/src/android/jar/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..f4c807c33a
--- /dev/null
+++ b/src/android/jar/.prev_CMakeLists.txt
@@ -0,0 +1,30 @@
+# Generated from jar.pro.
+
+set(java_sources
+ src/org/qtproject/qt5/android//accessibility/QtAccessibilityDelegate.java
+ src/org/qtproject/qt5/android//accessibility/QtNativeAccessibility.java
+ src/org/qtproject/qt5/android//CursorHandle.java
+ src/org/qtproject/qt5/android//EditContextView.java
+ src/org/qtproject/qt5/android//EditPopupMenu.java
+ src/org/qtproject/qt5/android//ExtractStyle.java
+ src/org/qtproject/qt5/android//QtActivityDelegate.java
+ src/org/qtproject/qt5/android//QtEditText.java
+ src/org/qtproject/qt5/android//QtInputConnection.java
+ src/org/qtproject/qt5/android//QtLayout.java
+ src/org/qtproject/qt5/android//QtMessageDialogHelper.java
+ src/org/qtproject/qt5/android//QtNative.java
+ src/org/qtproject/qt5/android//QtNativeLibrariesDir.java
+ src/org/qtproject/qt5/android//QtSurface.java
+ src/org/qtproject/qt5/android//QtThread.java
+)
+
+add_jar(QtAndroid
+ INCLUDE_JARS ${QT_ANDROID_JAR}
+ SOURCES ${java_sources}
+)
+
+install_jar(QtAndroid
+ DESTINATION jar
+ COMPONENT Devel
+)
+
diff --git a/src/android/jar/CMakeLists.txt b/src/android/jar/CMakeLists.txt
new file mode 100644
index 0000000000..61af168a67
--- /dev/null
+++ b/src/android/jar/CMakeLists.txt
@@ -0,0 +1,31 @@
+# Generated from jar.pro.
+
+set(java_sources
+ src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java
+ src/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java
+ src/org/qtproject/qt5/android/CursorHandle.java
+ src/org/qtproject/qt5/android/EditContextView.java
+ src/org/qtproject/qt5/android/EditPopupMenu.java
+ src/org/qtproject/qt5/android/ExtractStyle.java
+ src/org/qtproject/qt5/android/QtActivityDelegate.java
+ src/org/qtproject/qt5/android/QtEditText.java
+ src/org/qtproject/qt5/android/QtInputConnection.java
+ src/org/qtproject/qt5/android/QtLayout.java
+ src/org/qtproject/qt5/android/QtMessageDialogHelper.java
+ src/org/qtproject/qt5/android/QtNative.java
+ src/org/qtproject/qt5/android/QtNativeLibrariesDir.java
+ src/org/qtproject/qt5/android/QtSurface.java
+ src/org/qtproject/qt5/android/QtThread.java
+ src/org/qtproject/qt5/android/QtServiceDelegate.java # special case
+)
+
+add_jar(QtAndroid
+ INCLUDE_JARS ${QT_ANDROID_JAR}
+ SOURCES ${java_sources}
+)
+
+install_jar(QtAndroid
+ DESTINATION jar
+ COMPONENT Devel
+)
+
diff --git a/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java b/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java
index e6de354ac4..ae06506c96 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java
@@ -673,7 +673,7 @@ public class ExtractStyle {
json.put("gradient",gradientStateClass.getField("mGradient").getInt(obj));
GradientDrawable.Orientation orientation=(Orientation) gradientStateClass.getField("mOrientation").get(obj);
json.put("orientation",orientation.name());
- int [] intArray=(int[]) gradientStateClass.getField((Build.VERSION.SDK_INT < 23) ? "mColors" : "mGradientColors").get(obj);
+ int [] intArray=(int[]) gradientStateClass.getField("mGradientColors").get(obj);
if (intArray != null)
json.put("colors",getJsonArray(intArray, 0, intArray.length));
json.put("positions",getJsonArray((float[]) gradientStateClass.getField("mPositions").get(obj)));
@@ -1089,9 +1089,7 @@ public class ExtractStyle {
{
try {
InsetDrawable d = (InsetDrawable)drawable;
- // mInsetState changed to mState in Android 5.1 (22)
- Object mInsetStateObject = getAccessibleField(InsetDrawable.class, (Build.VERSION.SDK_INT > 21) ? "mState"
- : "mInsetState").get(d);
+ Object mInsetStateObject = getAccessibleField(InsetDrawable.class, "mState").get(d);
Rect _padding = new Rect();
boolean hasPadding = d.getPadding(_padding);
return getDrawable(getAccessibleField(mInsetStateObject.getClass(), "mDrawable").get(mInsetStateObject), filename, hasPadding ? _padding : null);
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
index 2df2ed9a1d..0db9441749 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
@@ -121,6 +121,10 @@ public class QtActivityDelegate
private static final String EXTRACT_STYLE_KEY = "extract.android.style";
private static final String EXTRACT_STYLE_MINIMAL_KEY = "extract.android.style.option";
+ public static final int SYSTEM_UI_VISIBILITY_NORMAL = 0;
+ public static final int SYSTEM_UI_VISIBILITY_FULLSCREEN = 1;
+ public static final int SYSTEM_UI_VISIBILITY_TRANSLUCENT = 2;
+
private static String m_environmentVariables = null;
private static String m_applicationParameters = null;
@@ -131,7 +135,7 @@ public class QtActivityDelegate
private long m_metaState;
private int m_lastChar = 0;
private int m_softInputMode = 0;
- private boolean m_fullScreen = false;
+ private int m_systemUiVisibility = SYSTEM_UI_VISIBILITY_NORMAL;
private boolean m_started = false;
private HashMap<Integer, QtSurface> m_surfaces = null;
private HashMap<Integer, View> m_nativeViews = null;
@@ -153,38 +157,51 @@ public class QtActivityDelegate
private CursorHandle m_rightSelectionHandle;
private EditPopupMenu m_editPopupMenu;
- public void setFullScreen(boolean enterFullScreen)
+
+ public void setSystemUiVisibility(int systemUiVisibility)
{
- if (m_fullScreen == enterFullScreen)
+ if (m_systemUiVisibility == systemUiVisibility)
return;
- if (m_fullScreen = enterFullScreen) {
+ m_systemUiVisibility = systemUiVisibility;
+
+ int systemUiVisibilityFlags = 0;
+ switch (m_systemUiVisibility) {
+ case SYSTEM_UI_VISIBILITY_NORMAL:
+ m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
+ m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ systemUiVisibilityFlags = View.SYSTEM_UI_FLAG_VISIBLE;
+ break;
+ case SYSTEM_UI_VISIBILITY_FULLSCREEN:
m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
- try {
- int flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
- flags |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
- flags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
- flags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
- flags |= View.SYSTEM_UI_FLAG_FULLSCREEN;
- flags |= View.class.getDeclaredField("SYSTEM_UI_FLAG_IMMERSIVE_STICKY").getInt(null);
- m_activity.getWindow().getDecorView().setSystemUiVisibility(flags | View.INVISIBLE);
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else {
- m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
+ systemUiVisibilityFlags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+ | View.INVISIBLE;
+ break;
+ case SYSTEM_UI_VISIBILITY_TRANSLUCENT:
+ m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
+ | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION
+ | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
- m_activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
- }
+ systemUiVisibilityFlags = View.SYSTEM_UI_FLAG_VISIBLE;
+ break;
+ };
+
+ m_activity.getWindow().getDecorView().setSystemUiVisibility(systemUiVisibilityFlags);
+
m_layout.requestLayout();
}
public void updateFullScreen()
{
- if (m_fullScreen) {
- m_fullScreen = false;
- setFullScreen(true);
+ if (m_systemUiVisibility == SYSTEM_UI_VISIBILITY_FULLSCREEN) {
+ m_systemUiVisibility = SYSTEM_UI_VISIBILITY_NORMAL;
+ setSystemUiVisibility(SYSTEM_UI_VISIBILITY_FULLSCREEN);
}
}
@@ -943,7 +960,7 @@ public class QtActivityDelegate
} catch (Exception e) {
e.printStackTrace();
}
- outState.putBoolean("FullScreen", m_fullScreen);
+ outState.putInt("SystemUiVisibility", m_systemUiVisibility);
outState.putBoolean("Started", m_started);
// It should never
}
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
index f22b8176c8..63993f81b5 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
@@ -46,6 +46,7 @@ import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
+import android.view.WindowInsets;
public class QtLayout extends ViewGroup
{
@@ -69,10 +70,32 @@ public class QtLayout extends ViewGroup
@Override
protected void onSizeChanged (int w, int h, int oldw, int oldh)
{
- DisplayMetrics metrics = new DisplayMetrics();
- ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
- QtNative.setApplicationDisplayMetrics(metrics.widthPixels, metrics.heightPixels, w, h,
- metrics.xdpi, metrics.ydpi, metrics.scaledDensity, metrics.density);
+ WindowInsets insets = getRootWindowInsets();
+
+ DisplayMetrics realMetrics = new DisplayMetrics();
+ ((Activity) getContext()).getWindowManager().getDefaultDisplay().getRealMetrics(realMetrics);
+
+ boolean isFullScreenView = h == realMetrics.heightPixels;
+
+ int insetLeft = isFullScreenView ? insets.getSystemWindowInsetLeft() : 0;
+ int insetTop = isFullScreenView ? insets.getSystemWindowInsetTop() : 0;
+ int insetRight = isFullScreenView ? insets.getSystemWindowInsetRight() : 0;
+ int insetBottom = isFullScreenView ? insets.getSystemWindowInsetBottom() : 0;
+
+ int usableAreaWidth = w - insetLeft - insetRight;
+ int usableAreaHeight = h - insetTop - insetBottom;
+
+ QtNative.setApplicationDisplayMetrics(realMetrics.widthPixels,
+ realMetrics.heightPixels,
+ insetLeft,
+ insetTop,
+ usableAreaWidth,
+ usableAreaHeight,
+ realMetrics.xdpi,
+ realMetrics.ydpi,
+ realMetrics.scaledDensity,
+ realMetrics.density);
+
if (m_startApplicationRunnable != null) {
m_startApplicationRunnable.run();
m_startApplicationRunnable = null;
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
index 76ecbe043b..b9457af6ef 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
@@ -96,8 +96,10 @@ public class QtNative
private static boolean m_started = false;
private static int m_displayMetricsScreenWidthPixels = 0;
private static int m_displayMetricsScreenHeightPixels = 0;
- private static int m_displayMetricsDesktopWidthPixels = 0;
- private static int m_displayMetricsDesktopHeightPixels = 0;
+ private static int m_displayMetricsAvailableLeftPixels = 0;
+ private static int m_displayMetricsAvailableTopPixels = 0;
+ private static int m_displayMetricsAvailableWidthPixels = 0;
+ private static int m_displayMetricsAvailableHeightPixels = 0;
private static double m_displayMetricsXDpi = .0;
private static double m_displayMetricsYDpi = .0;
private static double m_displayMetricsScaledDensity = 1.0;
@@ -485,8 +487,10 @@ public class QtNative
res[0] = startQtAndroidPlugin(qtParams, environment);
setDisplayMetrics(m_displayMetricsScreenWidthPixels,
m_displayMetricsScreenHeightPixels,
- m_displayMetricsDesktopWidthPixels,
- m_displayMetricsDesktopHeightPixels,
+ m_displayMetricsAvailableLeftPixels,
+ m_displayMetricsAvailableTopPixels,
+ m_displayMetricsAvailableWidthPixels,
+ m_displayMetricsAvailableHeightPixels,
m_displayMetricsXDpi,
m_displayMetricsYDpi,
m_displayMetricsScaledDensity,
@@ -507,8 +511,10 @@ public class QtNative
public static void setApplicationDisplayMetrics(int screenWidthPixels,
int screenHeightPixels,
- int desktopWidthPixels,
- int desktopHeightPixels,
+ int availableLeftPixels,
+ int availableTopPixels,
+ int availableWidthPixels,
+ int availableHeightPixels,
double XDpi,
double YDpi,
double scaledDensity,
@@ -524,8 +530,10 @@ public class QtNative
if (m_started) {
setDisplayMetrics(screenWidthPixels,
screenHeightPixels,
- desktopWidthPixels,
- desktopHeightPixels,
+ availableLeftPixels,
+ availableTopPixels,
+ availableWidthPixels,
+ availableHeightPixels,
XDpi,
YDpi,
scaledDensity,
@@ -533,8 +541,10 @@ public class QtNative
} else {
m_displayMetricsScreenWidthPixels = screenWidthPixels;
m_displayMetricsScreenHeightPixels = screenHeightPixels;
- m_displayMetricsDesktopWidthPixels = desktopWidthPixels;
- m_displayMetricsDesktopHeightPixels = desktopHeightPixels;
+ m_displayMetricsAvailableLeftPixels = availableLeftPixels;
+ m_displayMetricsAvailableTopPixels = availableTopPixels;
+ m_displayMetricsAvailableWidthPixels = availableWidthPixels;
+ m_displayMetricsAvailableHeightPixels = availableHeightPixels;
m_displayMetricsXDpi = XDpi;
m_displayMetricsYDpi = YDpi;
m_displayMetricsScaledDensity = scaledDensity;
@@ -709,14 +719,9 @@ public class QtNative
synchronized (m_mainActivityMutex) {
Context context = getContext();
try {
- if (Build.VERSION.SDK_INT >= 23) {
- if (m_checkSelfPermissionMethod == null)
- m_checkSelfPermissionMethod = Context.class.getMethod("checkSelfPermission", String.class);
- perm = (Integer)m_checkSelfPermissionMethod.invoke(context, permission);
- } else {
- final PackageManager pm = context.getPackageManager();
- perm = pm.checkPermission(permission, context.getApplicationContext().getPackageName());
- }
+ if (m_checkSelfPermissionMethod == null)
+ m_checkSelfPermissionMethod = Context.class.getMethod("checkSelfPermission", String.class);
+ perm = (Integer)m_checkSelfPermissionMethod.invoke(context, permission);
} catch (Exception e) {
e.printStackTrace();
}
@@ -795,13 +800,13 @@ public class QtNative
});
}
- private static void setFullScreen(final boolean fullScreen)
+ private static void setSystemUiVisibility(final int systemUiVisibility)
{
runAction(new Runnable() {
@Override
public void run() {
if (m_activityDelegate != null) {
- m_activityDelegate.setFullScreen(fullScreen);
+ m_activityDelegate.setSystemUiVisibility(systemUiVisibility);
}
updateWindow();
}
@@ -1172,8 +1177,10 @@ public class QtNative
// screen methods
public static native void setDisplayMetrics(int screenWidthPixels,
int screenHeightPixels,
- int desktopWidthPixels,
- int desktopHeightPixels,
+ int availableLeftPixels,
+ int availableTopPixels,
+ int availableWidthPixels,
+ int availableHeightPixels,
double XDpi,
double YDpi,
double scaledDensity,
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java
index 33bcb364de..4cceab50c7 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java
@@ -115,7 +115,7 @@ public class QtServiceDelegate
QtNative.setService(m_service, this);
QtNative.setClassLoader(classLoader);
- QtNative.setApplicationDisplayMetrics(10, 10, 10, 10, 120, 120, 1.0, 1.0);
+ QtNative.setApplicationDisplayMetrics(10, 10, 0, 0, 10, 10, 120, 120, 1.0, 1.0);
if (loaderParams.containsKey(STATIC_INIT_CLASSES_KEY)) {
for (String className: loaderParams.getStringArray(STATIC_INIT_CLASSES_KEY)) {
diff --git a/src/android/java/CMakeLists.txt b/src/android/java/CMakeLists.txt
new file mode 100644
index 0000000000..1c24bd5e82
--- /dev/null
+++ b/src/android/java/CMakeLists.txt
@@ -0,0 +1,12 @@
+# Android Java Resource files
+
+# special case skip regeneration
+# special case begin
+set(resource_directories
+ res
+ src)
+
+qt_install(DIRECTORY ${resource_directories}
+ DESTINATION src/android/java
+ COMPONENT Devel)
+# special case end
diff --git a/src/android/java/res/layout/splash.xml b/src/android/java/res/layout/splash.xml
deleted file mode 100644
index 476d91a844..0000000000
--- a/src/android/java/res/layout/splash.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
index 3348527b3c..86775619ec 100644
--- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
+++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
@@ -93,13 +93,8 @@ public class QtActivity extends Activity
public QtActivity()
{
m_loader = new QtActivityLoader(this);
- if (Build.VERSION.SDK_INT >= 21) {
- QT_ANDROID_THEMES = new String[] {"Theme_Holo_Light"};
- QT_ANDROID_DEFAULT_THEME = "Theme_Holo_Light";
- } else {
- QT_ANDROID_THEMES = new String[] {"Theme_DeviceDefault_Light"};
- QT_ANDROID_DEFAULT_THEME = "Theme_DeviceDefault_Light";
- }
+ QT_ANDROID_THEMES = new String[] {"Theme_Holo_Light"};
+ QT_ANDROID_DEFAULT_THEME = "Theme_Holo_Light";
}
diff --git a/src/android/templates/CMakeLists.txt b/src/android/templates/CMakeLists.txt
new file mode 100644
index 0000000000..8e007b7215
--- /dev/null
+++ b/src/android/templates/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Android template files
+
+# special case skip regeneration
+# special case begin
+set(template_files
+ AndroidManifest.xml
+ build.gradle)
+
+set(template_directories
+ res)
+
+qt_install(FILES ${template_files}
+ DESTINATION src/android/templates
+ COMPONENT Devel)
+
+qt_install(DIRECTORY ${template_directories}
+ DESTINATION src/android/templates
+ COMPONENT Devel)
+# special case end
diff --git a/src/angle/src/config.pri b/src/angle/src/config.pri
index af53d4c621..c64a59a91f 100644
--- a/src/angle/src/config.pri
+++ b/src/angle/src/config.pri
@@ -12,14 +12,6 @@ isEmpty(ANGLE_DIR) {
error("$$ANGLE_DIR does not contain ANGLE")
}
-equals(QMAKE_HOST.os, Windows) {
- gnutools.value = $$absolute_path(../../../../gnuwin32/bin)
- exists($$gnutools.value/gperf.exe) {
- gnutools.name = PATH
- gnutools.CONFIG = always_prepend
- }
-}
-
defineReplace(addGnuPath) {
gnuPath = $$1
!isEmpty(gnuPath):!isEmpty(gnutools.name) {
diff --git a/src/concurrent/CMakeLists.txt b/src/concurrent/CMakeLists.txt
new file mode 100644
index 0000000000..23208b253e
--- /dev/null
+++ b/src/concurrent/CMakeLists.txt
@@ -0,0 +1,50 @@
+# Generated from concurrent.pro.
+
+#####################################################################
+## Concurrent Module:
+#####################################################################
+
+qt_add_module(Concurrent
+ EXCEPTIONS
+ SOURCES
+ qtaskbuilder.h
+ qtconcurrent_global.h
+ qtconcurrentcompilertest.h
+ qtconcurrentexception.h
+ qtconcurrentfilter.cpp qtconcurrentfilter.h
+ qtconcurrentfilterkernel.h
+ qtconcurrentfunctionwrappers.h
+ qtconcurrentiteratekernel.cpp qtconcurrentiteratekernel.h
+ qtconcurrentmap.cpp qtconcurrentmap.h
+ qtconcurrentmapkernel.h
+ qtconcurrentmedian.h
+ qtconcurrentreducekernel.h
+ qtconcurrentrun.cpp qtconcurrentrun.h
+ qtconcurrentrunbase.h
+ qtconcurrentstoredfunctioncall.h
+ qtconcurrenttask.h
+ qtconcurrentthreadengine.cpp qtconcurrentthreadengine.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+ PRECOMPILED_HEADER
+ "../corelib/global/qt_pch.h"
+)
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(Concurrent CONDITION MSVC AND (TEST_architecture_arch STREQUAL "i386")
+ LINK_OPTIONS
+ "/BASE:0x66000000"
+)
+qt_add_docs(Concurrent
+ doc/qtconcurrent.qdocconf
+)
+
diff --git a/src/concurrent/concurrent.pro b/src/concurrent/concurrent.pro
index 18510e38a1..6e9b22d2e4 100644
--- a/src/concurrent/concurrent.pro
+++ b/src/concurrent/concurrent.pro
@@ -15,7 +15,7 @@ SOURCES += \
qtconcurrentmap.cpp \
qtconcurrentrun.cpp \
qtconcurrentthreadengine.cpp \
- qtconcurrentiteratekernel.cpp \
+ qtconcurrentiteratekernel.cpp
HEADERS += \
qtconcurrent_global.h \
@@ -32,7 +32,9 @@ HEADERS += \
qtconcurrentrun.h \
qtconcurrentrunbase.h \
qtconcurrentstoredfunctioncall.h \
- qtconcurrentthreadengine.h
+ qtconcurrentthreadengine.h \
+ qtaskbuilder.h \
+ qtconcurrenttask.h
# private headers
HEADERS += \
diff --git a/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentfilter.cpp b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentfilter.cpp
index 3cc1fe836c..ef87a60080 100644
--- a/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentfilter.cpp
+++ b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentfilter.cpp
@@ -158,8 +158,6 @@ struct StartsWith
StartsWith(const QString &string)
: m_string(string) { }
- typedef bool result_type;
-
bool operator()(const QString &testString)
{
return testString.startsWith(m_string);
@@ -183,3 +181,57 @@ QFuture<QString> fooString =
StartsWith(QLatin1String("Foo")),
StringTransform());
//! [14]
+
+//! [15]
+// keep only even integers
+QVector<int> vector { 1, 2, 3, 4 };
+QtConcurrent::blockingFilter(vector, [](int n) { return (n & 1) == 0; });
+
+// retrieve only even integers
+QVector<int> vector2 { 1, 2, 3, 4 };
+QFuture<int> future = QtConcurrent::filtered(vector2, [](int x) {
+ return (x & 1) == 0;
+});
+QVector<int> results = future.results();
+
+// add up all even integers
+QVector<int> vector3 { 1, 2, 3, 4 };
+int sum = QtConcurrent::filteredReduced<int>(vector3,
+ [](int x) {
+ return (x & 1) == 0;
+ },
+ [](int &sum, int x) {
+ sum += x;
+ }
+);
+//! [15]
+
+//! [16]
+void intSumReduce(int &sum, int x)
+{
+ sum += x;
+}
+
+QVector<int> vector { 1, 2, 3, 4 };
+int sum = QtConcurrent::filteredReduced(vector,
+ [] (int x) {
+ return (x & 1) == 0;
+ },
+ intSumReduce
+);
+//! [16]
+
+//! [17]
+bool keepEvenIntegers(int x)
+{
+ return (x & 1) == 0;
+}
+
+QVector<int> vector { 1, 2, 3, 4 };
+int sum = QtConcurrent::filteredReduced<int>(vector,
+ keepEvenIntegers,
+ [](int &sum, int x) {
+ sum += x;
+ }
+);
+//! [17]
diff --git a/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentmap.cpp b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentmap.cpp
index fc574302d2..dd3e0103bb 100644
--- a/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentmap.cpp
+++ b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentmap.cpp
@@ -130,7 +130,8 @@ QFuture<void> squeezedStrings = QtConcurrent::map(strings, &QString::squeeze);
// Swap the rgb values of all pixels on a list of images.
QList<QImage> images = ...;
-QFuture<QImage> bgrImages = QtConcurrent::mapped(images, &QImage::rgbSwapped);
+QFuture<QImage> bgrImages = QtConcurrent::mapped(images,
+ static_cast<QImage (QImage::*)() const &>(&QImage::rgbSwapped));
// Create a set of the lengths of all strings in a list.
QStringList strings = ...;
@@ -197,3 +198,37 @@ struct Scaled
QList<QImage> images = ...;
QFuture<QImage> thumbnails = QtConcurrent::mapped(images, Scaled(100));
//! [14]
+
+//! [15]
+QVector<int> vector { 1, 2, 3, 4 };
+QtConcurrent::blockingMap(vector, [](int &x) { x *= 2; });
+
+int size = 100;
+QVector<QImage> images = ...;
+
+QVector<QImage> thumbnails = QtConcurrent::mapped(images,
+ [&size](const QImage &image) {
+ return image.scaled(size, size);
+ }
+ ).results();
+//! [15]
+
+//! [16]
+QVector<QImage> collage = QtConcurrent::mappedReduced(images,
+ [&size](const QImage &image) {
+ return image.scaled(size, size);
+ },
+ addToCollage
+ ).results();
+//! [16]
+
+//! [17]
+QVector<QImage> collage = QtConcurrent::mappedReduced<QImage>(images,
+ [&size](const QImage &image) {
+ return image.scaled(size, size);
+ },
+ [](QImage &result, const QImage &value) {
+ // do some transformation
+ }
+ ).results();
+//! [17]
diff --git a/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentrun.cpp b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentrun.cpp
index 5437822842..0b82766054 100644
--- a/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentrun.cpp
+++ b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentrun.cpp
@@ -93,7 +93,7 @@ QString result = future.result();
//! [4]
// call 'QList<QByteArray> QByteArray::split(char sep) const' in a separate thread
QByteArray bytearray = "hello world";
-QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
+QFuture<QList<QByteArray> > future = QtConcurrent::run(&QByteArray::split, bytearray, ',');
...
QList<QByteArray> result = future.result();
//! [4]
@@ -101,16 +101,46 @@ QList<QByteArray> result = future.result();
//! [5]
// call 'void QImage::invertPixels(InvertMode mode)' in a separate thread
QImage image = ...;
-QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba);
+QFuture<void> future = QtConcurrent::run(&QImage::invertPixels, &image, QImage::InvertRgba);
...
future.waitForFinished();
// At this point, the pixels in 'image' have been inverted
//! [5]
-
//! [6]
QFuture<void> future = QtConcurrent::run([=]() {
// Code in this block will run in another thread
});
...
//! [6]
+
+//! [7]
+static void addOne(int &n) { ++n; }
+...
+int n = 42;
+QtConcurrent::run(&addOne, std::ref(n)).waitForFinished(); // n == 43
+//! [7]
+
+//! [8]
+struct TestClass
+{
+ void operator()(int s1) { s = s1; }
+ int s = 42;
+};
+
+...
+
+TestClass o;
+
+// Modify original object
+QtConcurrent::run(std::ref(o), 15).waitForFinished(); // o.s == 15
+
+// Modify a copy of the original object
+QtConcurrent::run(o, 42).waitForFinished(); // o.s == 15
+
+// Use a temporary object
+QtConcurrent::run(TestClass(), 42).waitForFinished();
+
+// Ill-formed
+QtConcurrent::run(&o, 42).waitForFinished(); // compilation error
+//! [8]
diff --git a/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrenttask.cpp b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrenttask.cpp
new file mode 100644
index 0000000000..b067b49e7e
--- /dev/null
+++ b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrenttask.cpp
@@ -0,0 +1,131 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//! [0]
+QtConcurrent::task([]{ qDebug("Hello, world!"); }).spawn();
+//! [0]
+
+//! [1]
+auto task = [](const QString &s){ qDebug() << ("Hello, " + s); };
+QtConcurrent::task(std::move(task))
+ .withArguments("world!")
+ .spawn();
+//! [1]
+
+//! [2]
+QString s("Hello, ");
+QtConcurrent::task([](QString &s){ s.append("world!"); })
+ .withArguments(std::ref(s))
+ .spawn();
+//! [2]
+
+//! [3]
+auto future = QtConcurrent::task([]{ return 42; }).spawn();
+auto result = future.result(); // result == 42
+//! [3]
+
+//! [4]
+std::is_invocable_v<std::decay_t<Task>, std::decay_t<Args>...>
+//! [4]
+
+//! [5]
+QVariant value(42);
+auto result = QtConcurrent::task(&qvariant_cast<int>)
+ .withArguments(value)
+ .spawn()
+ .result(); // result == 42
+//! [5]
+
+//! [6]
+QString result("Hello, world!");
+
+QtConcurrent::task(&QString::chop)
+ .withArguments(&result, 8)
+ .spawn()
+ .waitForFinished(); // result == "Hello"
+//! [6]
+
+//! [7]
+auto result = QtConcurrent::task(std::plus<int>())
+ .withArguments(40, 2)
+ .spawn()
+ .result() // result == 42
+//! [7]
+
+//! [8]
+struct CallableWithState
+{
+ void operator()(int newState) { state = newState; }
+
+ // ...
+};
+
+// ...
+
+CallableWithState object;
+
+QtConcurrent::task(std::ref(object))
+ .withArguments(42)
+ .spawn()
+ .waitForFinished(); // The object's state is set to 42
+//! [8]
+
+//! [9]
+QThreadPool pool;
+QtConcurrent::task([]{ return 42; }).onThreadPool(pool).spawn();
+//! [9]
+
+//! [10]
+QtConcurrent::task([]{ return 42; }).withPriority(10).spawn();
+//! [10]
+
+//! [11]
+QtConcurrent::task([]{ qDebug("Hello, world!"); }).spawn(FutureResult::Ignore);
+//! [11]
diff --git a/src/concurrent/doc/src/qtconcurrent-index.qdoc b/src/concurrent/doc/src/qtconcurrent-index.qdoc
index 3e4aa791f1..666eec533b 100644
--- a/src/concurrent/doc/src/qtconcurrent-index.qdoc
+++ b/src/concurrent/doc/src/qtconcurrent-index.qdoc
@@ -79,6 +79,13 @@
another thread.
\endlist
+ \li \l {Concurrent Task}
+ \list
+ \li \l {QtConcurrent::task}{QtConcurrent::task()} creates an instance
+ of QtConcurrent::QTaskBuilder. This object can be used for adjusting
+ parameters and for kicking off a task in a separate thread.
+ \endlist
+
\li QFuture represents the result of an asynchronous computation.
\li QFutureIterator allows iterating through results available via QFuture.
@@ -115,7 +122,7 @@
\li Supported
\row
\li Bidirectional Iterator
- \li QLinkedList, std::list
+ \li std::list
\li Supported
\row
\li Random Access Iterator
diff --git a/src/concurrent/qtaskbuilder.h b/src/concurrent/qtaskbuilder.h
new file mode 100644
index 0000000000..074dad1c6b
--- /dev/null
+++ b/src/concurrent/qtaskbuilder.h
@@ -0,0 +1,172 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtConcurrent module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTBASE_QTTASKBUILDER_H
+#define QTBASE_QTTASKBUILDER_H
+
+#include <memory>
+
+#if !defined(QT_NO_CONCURRENT) || defined(Q_CLANG_QDOC)
+
+#include <QtConcurrent/qtconcurrentstoredfunctioncall.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifdef Q_CLANG_QDOC
+
+namespace QtConcurrent {
+
+enum class FutureResult { Ignore };
+
+using InvokeResultType = int;
+
+template <class Task, class ...Args>
+class QTaskBuilder
+{
+public:
+ [[nodiscard]]
+ QFuture<InvokeResultType> spawn();
+
+ void spawn(FutureResult);
+
+ template <class ...ExtraArgs>
+ [[nodiscard]]
+ QTaskBuilder<Task, ExtraArgs...> withArguments(ExtraArgs &&...args);
+
+ [[nodiscard]]
+ QTaskBuilder<Task, Args...> &onThreadPool(QThreadPool &newThreadPool);
+
+ [[nodiscard]]
+ QTaskBuilder<Task, Args...> &withPriority(int newPriority);
+};
+
+} // namespace QtConcurrent
+
+#else
+
+namespace QtConcurrent {
+
+enum class FutureResult { Ignore };
+
+template <class Task, class ...Args>
+class QTaskBuilder
+{
+public:
+ [[nodiscard]]
+ auto spawn()
+ {
+ return (new StoredFunctionCall<Task, Args...>(std::move(taskWithArgs)))
+ ->start(startParameters);
+ }
+
+ void spawn(FutureResult)
+ {
+ (new StoredFunctionCall<Task, Args...>(std::move(taskWithArgs)))
+ ->start(startParameters);
+ }
+
+ template <class ...ExtraArgs>
+ [[nodiscard]]
+ constexpr auto withArguments(ExtraArgs &&...args)
+ {
+ static_assert(std::tuple_size_v<TaskWithArgs> == 1,
+ "This function cannot be invoked if "
+ "arguments have already been passed.");
+
+ static_assert(sizeof...(ExtraArgs) >= 1,
+ "One or more arguments must be passed.");
+
+ // We have to re-create a builder, because the type has changed
+ return QTaskBuilder<Task, ExtraArgs...>(
+ startParameters,
+ std::get<0>(std::move(taskWithArgs)),
+ std::forward<ExtraArgs>(args)...
+ );
+ }
+
+ [[nodiscard]]
+ constexpr auto &onThreadPool(QThreadPool &newThreadPool)
+ {
+ startParameters.threadPool = &newThreadPool;
+ return *this;
+ }
+
+ [[nodiscard]]
+ constexpr auto &withPriority(int newPriority)
+ {
+ startParameters.priority = newPriority;
+ return *this;
+ }
+
+protected: // Methods
+ constexpr explicit QTaskBuilder(Task &&task, Args &&...arguments)
+ : taskWithArgs{std::forward<Task>(task), std::forward<Args>(arguments)...}
+ {}
+
+ constexpr QTaskBuilder(
+ const TaskStartParameters &parameters, Task &&task, Args &&...arguments)
+ : taskWithArgs{std::forward<Task>(task), std::forward<Args>(arguments)...}
+ , startParameters{parameters}
+ {}
+
+private: // Methods
+ // Required for creating a builder from "task" function
+ template <class T>
+ friend constexpr auto task(T &&t);
+
+ // Required for creating a new builder from "withArguments" function
+ template <class T, class ...A>
+ friend class QTaskBuilder;
+
+private: // Data
+ using TaskWithArgs = DecayedTuple<Task, Args...>;
+
+ TaskWithArgs taskWithArgs;
+ TaskStartParameters startParameters;
+};
+
+} // namespace QtConcurrent
+
+#endif // Q_CLANG_QDOC
+
+QT_END_NAMESPACE
+
+#endif // !defined(QT_NO_CONCURRENT)
+
+#endif //QTBASE_QTTASKBUILDER_H
diff --git a/src/concurrent/qtaskbuilder.qdoc b/src/concurrent/qtaskbuilder.qdoc
new file mode 100644
index 0000000000..1340307806
--- /dev/null
+++ b/src/concurrent/qtaskbuilder.qdoc
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \class QtConcurrent::QTaskBuilder
+ \inmodule QtConcurrent
+ \brief The QTaskBuilder class is used for adjusting task parameters.
+ \since 6.0
+
+ \ingroup thread
+
+ It's not possible to create an object of this class manually. See
+ \l {Concurrent Task} for more details and usage examples.
+*/
+
+/*!
+ \fn template <class Task, class ...Args> [[nodiscard]] QFuture<InvokeResultType> QtConcurrent::QTaskBuilder<Task, Args...>::spawn()
+
+ Runs the task in a separate thread and returns a future object immediately.
+ This is a non-blocking call. The task might not start immediately.
+*/
+
+/*!
+ \fn template <class Task, class ...Args> void QtConcurrent::QTaskBuilder<Task, Args...>::spawn(QtConcurrent::FutureResult)
+
+ Runs the task in a separate thread. This is a non-blocking call.
+ The task might not start immediately.
+*/
+
+/*!
+ \fn template <class Task, class ...Args> template <class ...ExtraArgs> [[nodiscard]] QTaskBuilder<Task, ExtraArgs...> QtConcurrent::QTaskBuilder<Task, Args...>::withArguments(ExtraArgs &&...args)
+
+ Sets the arguments \a args the task will be invoked with. The code is ill-formed
+ (causes compilation errors) if:
+ \list
+ \li This function is invoked more than once.
+ \li The arguments count is zero.
+ \endlist
+*/
+
+/*!
+ \fn template <class Task, class ...Args> [[nodiscard]] QTaskBuilder<Task, Args...> &QtConcurrent::QTaskBuilder<Task, Args...>::onThreadPool(QThreadPool &newThreadPool)
+
+ Sets the thread pool \a newThreadPool that the task will be invoked on.
+*/
+
+/*!
+ \fn template <class Task, class ...Args> [[nodiscard]] QTaskBuilder<Task, Args...> &QtConcurrent::QTaskBuilder<Task, Args...>::withPriority(int newPriority)
+
+ Sets the priority \a newPriority that the task will be invoked with.
+*/
+
+/*!
+ \typedef InvokeResultType
+ \relates QtConcurrent::QTaskBuilder
+
+ The simplified definition of this type looks like this:
+ \code
+ template <class Task, class ...Args>
+ using InvokeResultType = std::invoke_result_t<std::decay_t<Task>, std::decay_t<Args>...>;
+ \endcode
+
+ The real implementation also contains a compile-time check for
+ whether the task can be invoked with the specified arguments or not.
+*/
+
+/*!
+ \enum QtConcurrent::FutureResult
+
+ This enum type is used to invoke a special overload of
+ QtConcurrent::QTaskBuilder::spawn(QtConcurrent::FutureResult)
+ that doesn't return a future object.
+
+ \value Ignore
+ An auxiliary tag which introduced to improve code
+ readability.
+*/
diff --git a/src/concurrent/qtconcurrentcompilertest.h b/src/concurrent/qtconcurrentcompilertest.h
index 72cf1670a0..8292d5c504 100644
--- a/src/concurrent/qtconcurrentcompilertest.h
+++ b/src/concurrent/qtconcurrentcompilertest.h
@@ -48,16 +48,26 @@ QT_BEGIN_NAMESPACE
namespace QtPrivate {
-template<class T>
-class HasResultType {
- typedef char Yes;
- typedef void *No;
- template<typename U> static Yes test(int, const typename U::result_type * = nullptr);
- template<typename U> static No test(double);
-public:
- enum { Value = (sizeof(test<T>(0)) == sizeof(Yes)) };
-};
+ template <class T, typename = void>
+ struct IsIterable : std::false_type {};
+ template <class T>
+ struct IsIterable<T, std::void_t<decltype(std::begin(std::declval<T>())),
+ decltype(std::end(std::declval<T>()))>>
+ : std::true_type
+ { };
+ template <class T>
+ inline constexpr bool IsIterableValue = IsIterable<T>::value;
+
+ template <class T, typename = void>
+ struct IsDereferenceable : std::false_type {};
+ template <class T>
+ struct IsDereferenceable<T, std::void_t<decltype(*std::declval<T>())>>
+ : std::true_type
+ { };
+
+ template <class T>
+ inline constexpr bool IsDereferenceableValue = IsDereferenceable<T>::value;
}
QT_END_NAMESPACE
diff --git a/src/concurrent/qtconcurrentfilter.cpp b/src/concurrent/qtconcurrentfilter.cpp
index 606a9dbe03..789188911e 100644
--- a/src/concurrent/qtconcurrentfilter.cpp
+++ b/src/concurrent/qtconcurrentfilter.cpp
@@ -93,7 +93,7 @@
\section1 Concurrent Filter-Reduce
QtConcurrent::filteredReduced() is similar to QtConcurrent::filtered(),
- but instead of returing a sequence with the filtered results, the results
+ but instead of returning a sequence with the filtered results, the results
are combined into a single value using a reduce function.
The reduce function must be of the form:
@@ -144,8 +144,7 @@
QtConcurrent::filter(), QtConcurrent::filtered(), and
QtConcurrent::filteredReduced() accept function objects
for the filter function. These function objects can be used to
- add state to a function call. The result_type typedef must define the
- result type of the function call operator:
+ add state to a function call:
\snippet code/src_concurrent_qtconcurrentfilter.cpp 13
@@ -155,6 +154,26 @@
\snippet code/src_concurrent_qtconcurrentfilter.cpp 14
+ \section2 Using Lambda Expressions
+
+ QtConcurrent::filter(), QtConcurrent::filtered(), and
+ QtConcurrent::filteredReduced() accept lambda expressions for the filter and
+ reduce function:
+
+ \snippet code/src_concurrent_qtconcurrentfilter.cpp 15
+
+ When using QtConcurrent::filteredReduced() or
+ QtConcurrent::blockingFilteredReduced(), you can mix the use of normal
+ functions, member functions and lambda expressions freely.
+
+ \snippet code/src_concurrent_qtconcurrentfilter.cpp 16
+
+ For the reduce function, lambda expressions are not directly supported.
+ Lambda expressions can, however, be used when the type of the reduction
+ result is explicitly specified:
+
+ \snippet code/src_concurrent_qtconcurrentfilter.cpp 17
+
\section2 Wrapping Functions that Take Multiple Arguments
If you want to use a filter function takes more than one argument, you can
@@ -267,6 +286,27 @@
*/
/*!
+ \fn template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor, typename InitialValueType> QFuture<ResultType> QtConcurrent::filteredReduced(const Sequence &sequence, KeepFunctor filterFunction, ReduceFunctor reduceFunction, InitialValueType &&initialValue, QtConcurrent::ReduceOptions reduceOptions)
+
+ Calls \a filterFunction once for each item in \a sequence. If
+ \a filterFunction returns \c true for an item, that item is then passed to
+ \a reduceFunction. In other words, the return value is the result of
+ \a reduceFunction for each item where \a filterFunction returns \c true.
+ The result value is initialized to \a initialValue when the function is
+ called, and the first call to \a reduceFunction will operate on
+ this value.
+
+ Note that while \a filterFunction is called concurrently, only one thread
+ at a time will call \a reduceFunction. The order in which \a reduceFunction
+ is called is undefined if \a reduceOptions is
+ QtConcurrent::UnorderedReduce. If \a reduceOptions is
+ QtConcurrent::OrderedReduce, \a reduceFunction is called in the order of
+ the original sequence.
+
+ \sa {Concurrent Filter and Filter-Reduce}
+*/
+
+/*!
\fn template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor> QFuture<ResultType> QtConcurrent::filteredReduced(Iterator begin, Iterator end, KeepFunctor filterFunction, ReduceFunctor reduceFunction, QtConcurrent::ReduceOptions reduceOptions)
Calls \a filterFunction once for each item from \a begin to \a end. If
@@ -285,6 +325,27 @@
*/
/*!
+ \fn template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor, typename InitialValueType> QFuture<ResultType> QtConcurrent::filteredReduced(Iterator begin, Iterator end, KeepFunctor filterFunction, ReduceFunctor reduceFunction, InitialValueType &&initialValue, QtConcurrent::ReduceOptions reduceOptions)
+
+ Calls \a filterFunction once for each item from \a begin to \a end. If
+ \a filterFunction returns \c true for an item, that item is then passed to
+ \a reduceFunction. In other words, the return value is the result of
+ \a reduceFunction for each item where \a filterFunction returns \c true.
+ The result value is initialized to \a initialValue when the function is
+ called, and the first call to \a reduceFunction will operate on
+ this value.
+
+ Note that while \a filterFunction is called concurrently, only one thread
+ at a time will call \a reduceFunction. The order in which
+ \a reduceFunction is called is undefined if \a reduceOptions is
+ QtConcurrent::UnorderedReduce. If \a reduceOptions is
+ QtConcurrent::OrderedReduce, the \a reduceFunction is called in the order
+ of the original sequence.
+
+ \sa {Concurrent Filter and Filter-Reduce}
+*/
+
+/*!
\fn template <typename Sequence, typename KeepFunctor> void QtConcurrent::blockingFilter(Sequence &sequence, KeepFunctor filterFunction)
Calls \a filterFunction once for each item in \a sequence. If
@@ -344,6 +405,29 @@
*/
/*!
+ \fn template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor, typename InitialValueType> ResultType QtConcurrent::blockingFilteredReduced(const Sequence &sequence, KeepFunctor filterFunction, ReduceFunctor reduceFunction, InitialValueType &&initialValue, QtConcurrent::ReduceOptions reduceOptions)
+
+ Calls \a filterFunction once for each item in \a sequence. If
+ \a filterFunction returns \c true for an item, that item is then passed to
+ \a reduceFunction. In other words, the return value is the result of
+ \a reduceFunction for each item where \a filterFunction returns \c true.
+ The result value is initialized to \a initialValue when the function is
+ called, and the first call to \a reduceFunction will operate on
+ this value.
+
+ Note that while \a filterFunction is called concurrently, only one thread
+ at a time will call \a reduceFunction. The order in which \a reduceFunction
+ is called is undefined if \a reduceOptions is
+ QtConcurrent::UnorderedReduce. If \a reduceOptions is
+ QtConcurrent::OrderedReduce, \a reduceFunction is called in the order of
+ the original sequence.
+
+ \note This function will block until all items in the sequence have been processed.
+
+ \sa filteredReduced(), {Concurrent Filter and Filter-Reduce}
+*/
+
+/*!
\fn template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor> ResultType QtConcurrent::blockingFilteredReduced(Iterator begin, Iterator end, KeepFunctor filterFunction, ReduceFunctor reduceFunction, QtConcurrent::ReduceOptions reduceOptions)
Calls \a filterFunction once for each item from \a begin to \a end. If
@@ -365,6 +449,30 @@
*/
/*!
+ \fn template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor, typename InitialValueType> ResultType QtConcurrent::blockingFilteredReduced(Iterator begin, Iterator end, KeepFunctor filterFunction, ReduceFunctor reduceFunction, InitialValueType &&initialValue, QtConcurrent::ReduceOptions reduceOptions)
+
+ Calls \a filterFunction once for each item from \a begin to \a end. If
+ \a filterFunction returns \c true for an item, that item is then passed to
+ \a reduceFunction. In other words, the return value is the result of
+ \a reduceFunction for each item where \a filterFunction returns \c true.
+ The result value is initialized to \a initialValue when the function is
+ called, and the first call to \a reduceFunction will operate on
+ this value.
+
+ Note that while \a filterFunction is called concurrently, only one thread
+ at a time will call \a reduceFunction. The order in which
+ \a reduceFunction is called is undefined if \a reduceOptions is
+ QtConcurrent::UnorderedReduce. If \a reduceOptions is
+ QtConcurrent::OrderedReduce, the \a reduceFunction is called in the order
+ of the original sequence.
+
+ \note This function will block until the iterator reaches the end of the
+ sequence being processed.
+
+ \sa filteredReduced(), {Concurrent Filter and Filter-Reduce}
+*/
+
+/*!
\fn [QtConcurrent-2] ThreadEngineStarter<typename qValueType<Iterator>::value_type> QtConcurrent::startFiltered(Iterator begin, Iterator end, KeepFunctor functor)
\internal
*/
@@ -384,3 +492,12 @@
\internal
*/
+/*!
+ \fn [QtConcurrent-6] ThreadEngineStarter<ResultType> QtConcurrent::startFilteredReduced(Iterator begin, Iterator end, MapFunctor mapFunctor, ReduceFunctor reduceFunctor, ResultType initialValue, ReduceOptions options)
+ \internal
+*/
+
+/*!
+ \fn [QtConcurrent-7] ThreadEngineStarter<ResultType> QtConcurrent::startFilteredReduced(Iterator begin, Iterator end, MapFunctor mapFunctor, ReduceFunctor reduceFunctor, ResultType initialValue, ReduceOptions options)
+ \internal
+*/
diff --git a/src/concurrent/qtconcurrentfilter.h b/src/concurrent/qtconcurrentfilter.h
index d01b351ad0..df4c9ed384 100644
--- a/src/concurrent/qtconcurrentfilter.h
+++ b/src/concurrent/qtconcurrentfilter.h
@@ -63,7 +63,7 @@ ThreadEngineStarter<void> filterInternal(Sequence &sequence, KeepFunctor keep, R
template <typename Sequence, typename KeepFunctor>
QFuture<void> filter(Sequence &sequence, KeepFunctor keep)
{
- return filterInternal(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::PushBackWrapper());
+ return filterInternal(sequence, keep, QtPrivate::PushBackWrapper());
}
// filteredReduced() on sequences
@@ -73,7 +73,21 @@ QFuture<ResultType> filteredReduced(const Sequence &sequence,
ReduceFunctor reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
{
- return startFilteredReduced<ResultType>(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::createFunctionWrapper(reduce), options);
+ return startFilteredReduced<ResultType>(sequence, keep, reduce, options);
+}
+
+template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+QFuture<ResultType> filteredReduced(const Sequence &sequence, KeepFunctor keep,
+ ReduceFunctor reduce, InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startFilteredReduced<ResultType>(
+ sequence, keep,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
}
#ifndef Q_CLANG_QDOC
@@ -85,10 +99,25 @@ QFuture<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> filtere
{
return startFilteredReduced<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
(sequence,
- QtPrivate::createFunctionWrapper(keep),
- QtPrivate::createFunctionWrapper(reduce),
+ keep,
+ reduce,
options);
}
+
+template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+QFuture<ResultType> filteredReduced(const Sequence &sequence, KeepFunctor keep,
+ ReduceFunctor reduce, InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startFilteredReduced<ResultType>(
+ sequence, keep,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+}
#endif
// filteredReduced() on iterators
@@ -99,7 +128,21 @@ QFuture<ResultType> filteredReduced(Iterator begin,
ReduceFunctor reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
{
- return startFilteredReduced<ResultType>(begin, end, QtPrivate::createFunctionWrapper(keep), QtPrivate::createFunctionWrapper(reduce), options);
+ return startFilteredReduced<ResultType>(begin, end, keep, reduce, options);
+}
+
+template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+QFuture<ResultType> filteredReduced(Iterator begin, Iterator end, KeepFunctor keep,
+ ReduceFunctor reduce, InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startFilteredReduced<ResultType>(
+ begin, end, keep,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
}
#ifndef Q_CLANG_QDOC
@@ -112,31 +155,46 @@ QFuture<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> filtere
{
return startFilteredReduced<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
(begin, end,
- QtPrivate::createFunctionWrapper(keep),
- QtPrivate::createFunctionWrapper(reduce),
+ keep,
+ reduce,
options);
}
+
+template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
+ typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+QFuture<ResultType> filteredReduced(Iterator begin, Iterator end, KeepFunctor keep,
+ ReduceFunctor reduce, InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startFilteredReduced<ResultType>(
+ begin, end, keep,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+}
#endif
// filtered() on sequences
template <typename Sequence, typename KeepFunctor>
QFuture<typename Sequence::value_type> filtered(const Sequence &sequence, KeepFunctor keep)
{
- return startFiltered(sequence, QtPrivate::createFunctionWrapper(keep));
+ return startFiltered(sequence, keep);
}
// filtered() on iterators
template <typename Iterator, typename KeepFunctor>
QFuture<typename qValueType<Iterator>::value_type> filtered(Iterator begin, Iterator end, KeepFunctor keep)
{
- return startFiltered(begin, end, QtPrivate::createFunctionWrapper(keep));
+ return startFiltered(begin, end, keep);
}
// blocking filter() on sequences
template <typename Sequence, typename KeepFunctor>
void blockingFilter(Sequence &sequence, KeepFunctor keep)
{
- filterInternal(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::PushBackWrapper()).startBlocking();
+ filterInternal(sequence, keep, QtPrivate::PushBackWrapper()).startBlocking();
}
// blocking filteredReduced() on sequences
@@ -146,10 +204,25 @@ ResultType blockingFilteredReduced(const Sequence &sequence,
ReduceFunctor reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
{
- return startFilteredReduced<ResultType>(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::createFunctionWrapper(reduce), options)
+ return startFilteredReduced<ResultType>(sequence, keep, reduce, options)
.startBlocking();
}
+template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ResultType blockingFilteredReduced(const Sequence &sequence, KeepFunctor keep, ReduceFunctor reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startFilteredReduced<ResultType>(
+ sequence, keep,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options)
+ .startBlocking();
+}
+
#ifndef Q_CLANG_QDOC
template <typename Sequence, typename KeepFunctor, typename ReduceFunctor>
typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType blockingFilteredReduced(const Sequence &sequence,
@@ -157,11 +230,27 @@ typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType blockingFiltered
ReduceFunctor reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
{
- return blockingFilteredReduced<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
+ return startFilteredReduced<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
(sequence,
- QtPrivate::createFunctionWrapper(keep),
- QtPrivate::createFunctionWrapper(reduce),
- options);
+ keep,
+ reduce,
+ options).startBlocking();
+}
+
+template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ResultType blockingFilteredReduced(const Sequence &sequence, KeepFunctor keep, ReduceFunctor reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startFilteredReduced<ResultType>(
+ sequence, keep,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options)
+ .startBlocking();
}
#endif
@@ -175,12 +264,27 @@ ResultType blockingFilteredReduced(Iterator begin,
{
return startFilteredReduced<ResultType>
(begin, end,
- QtPrivate::createFunctionWrapper(keep),
- QtPrivate::createFunctionWrapper(reduce),
+ keep,
+ reduce,
options)
.startBlocking();
}
+template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ResultType blockingFilteredReduced(Iterator begin, Iterator end, KeepFunctor keep,
+ ReduceFunctor reduce, InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startFilteredReduced<ResultType>(
+ begin, end, keep,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options)
+ .startBlocking();
+}
+
#ifndef Q_CLANG_QDOC
template <typename Iterator, typename KeepFunctor, typename ReduceFunctor>
typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType blockingFilteredReduced(Iterator begin,
@@ -191,18 +295,34 @@ typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType blockingFiltered
{
return startFilteredReduced<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
(begin, end,
- QtPrivate::createFunctionWrapper(keep),
- QtPrivate::createFunctionWrapper(reduce),
+ keep,
+ reduce,
options)
.startBlocking();
}
+
+template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
+ typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ResultType blockingFilteredReduced(Iterator begin, Iterator end, KeepFunctor keep,
+ ReduceFunctor reduce, InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startFilteredReduced<ResultType>(
+ begin, end, keep,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options)
+ .startBlocking();
+}
#endif
// blocking filtered() on sequences
template <typename Sequence, typename KeepFunctor>
Sequence blockingFiltered(const Sequence &sequence, KeepFunctor keep)
{
- return startFilteredReduced<Sequence>(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::PushBackWrapper(), OrderedReduce).startBlocking();
+ return startFilteredReduced<Sequence>(sequence, keep, QtPrivate::PushBackWrapper(), OrderedReduce).startBlocking();
}
// blocking filtered() on iterators
@@ -210,7 +330,7 @@ template <typename OutputSequence, typename Iterator, typename KeepFunctor>
OutputSequence blockingFiltered(Iterator begin, Iterator end, KeepFunctor keep)
{
return startFilteredReduced<OutputSequence>(begin, end,
- QtPrivate::createFunctionWrapper(keep),
+ keep,
QtPrivate::PushBackWrapper(),
OrderedReduce).startBlocking();
}
diff --git a/src/concurrent/qtconcurrentfilterkernel.h b/src/concurrent/qtconcurrentfilterkernel.h
index e921a3d51a..babd173ff8 100644
--- a/src/concurrent/qtconcurrentfilterkernel.h
+++ b/src/concurrent/qtconcurrentfilterkernel.h
@@ -78,7 +78,7 @@ class FilterKernel : public IterateKernel<typename Sequence::const_iterator, voi
{
typedef ReduceKernel<ReduceFunctor, Sequence, typename Sequence::value_type> Reducer;
typedef IterateKernel<typename Sequence::const_iterator, void> IterateKernelType;
- typedef typename ReduceFunctor::result_type T;
+ typedef void T;
Sequence reducedResult;
Sequence &sequence;
@@ -101,11 +101,11 @@ public:
results.begin = index;
results.end = index + 1;
- if (keep(*it))
- results.vector.append(*it);
+ if (std::invoke(keep, *it))
+ results.vector.append(*it);
- reducer.runReduce(reduce, reducedResult, results);
- return false;
+ reducer.runReduce(reduce, reducedResult, results);
+ return false;
}
bool runIterations(typename Sequence::const_iterator sequenceBeginIterator, int begin, int end, T *) override
@@ -119,7 +119,7 @@ public:
typename Sequence::const_iterator it = sequenceBeginIterator;
std::advance(it, begin);
for (int i = begin; i < end; ++i) {
- if (keep(*it))
+ if (std::invoke(keep, *it))
results.vector.append(*it);
std::advance(it, 1);
}
@@ -173,14 +173,15 @@ public:
: IterateKernelType(begin, end), reducedResult(), keep(_keep), reduce(_reduce), reducer(reduceOption)
{ }
-#if 0
- FilteredReducedKernel(ReducedResultType initialValue,
- KeepFunctor keep,
- ReduceFunctor reduce,
- ReduceOption reduceOption)
- : reducedResult(initialValue), keep(keep), reduce(reduce), reducer(reduceOption)
- { }
-#endif
+ FilteredReducedKernel(Iterator begin, Iterator end, KeepFunctor _keep, ReduceFunctor _reduce,
+ ReducedResultType &&initialValue, ReduceOptions reduceOption)
+ : IterateKernelType(begin, end),
+ reducedResult(std::forward<ReducedResultType>(initialValue)),
+ keep(_keep),
+ reduce(_reduce),
+ reducer(reduceOption)
+ {
+ }
bool runIteration(Iterator it, int index, ReducedResultType *) override
{
@@ -188,7 +189,7 @@ public:
results.begin = index;
results.end = index + 1;
- if (keep(*it))
+ if (std::invoke(keep, *it))
results.vector.append(*it);
reducer.runReduce(reduce, reducedResult, results);
@@ -205,7 +206,7 @@ public:
Iterator it = sequenceBeginIterator;
std::advance(it, begin);
for (int i = begin; i < end; ++i) {
- if (keep(*it))
+ if (std::invoke(keep, *it))
results.vector.append(*it);
std::advance(it, 1);
}
@@ -263,7 +264,7 @@ public:
bool runIteration(Iterator it, int index, T *) override
{
- if (keep(*it))
+ if (std::invoke(keep, *it))
this->reportResult(&(*it), index);
else
this->reportResult(nullptr, index);
@@ -281,7 +282,7 @@ public:
Iterator it = sequenceBeginIterator;
std::advance(it, begin);
for (int i = begin; i < end; ++i) {
- if (keep(*it))
+ if (std::invoke(keep, *it))
results.vector.append(*it);
std::advance(it, 1);
}
@@ -337,6 +338,33 @@ inline ThreadEngineStarter<ResultType> startFilteredReduced(Iterator begin, Iter
return startThreadEngine(new FilteredReduceType(begin, end, mapFunctor, reduceFunctor, options));
}
+// Repeat the two functions above, but now with an initial value!
+//! [QtConcurrent-6]
+template <typename ResultType, typename Sequence, typename MapFunctor, typename ReduceFunctor>
+inline ThreadEngineStarter<ResultType> startFilteredReduced(const Sequence & sequence,
+ MapFunctor mapFunctor, ReduceFunctor reduceFunctor,
+ ResultType &&initialValue,
+ ReduceOptions options)
+{
+ typedef typename Sequence::const_iterator Iterator;
+ typedef ReduceKernel<ReduceFunctor, ResultType, typename qValueType<Iterator>::value_type > Reducer;
+ typedef FilteredReducedKernel<ResultType, Iterator, MapFunctor, ReduceFunctor, Reducer> FilteredReduceType;
+ typedef SequenceHolder2<Sequence, FilteredReduceType, MapFunctor, ReduceFunctor> SequenceHolderType;
+ return startThreadEngine(new SequenceHolderType(sequence, mapFunctor, reduceFunctor, std::forward<ResultType>(initialValue), options));
+}
+
+//! [QtConcurrent-7]
+template <typename ResultType, typename Iterator, typename MapFunctor, typename ReduceFunctor>
+inline ThreadEngineStarter<ResultType> startFilteredReduced(Iterator begin, Iterator end,
+ MapFunctor mapFunctor, ReduceFunctor reduceFunctor,
+ ResultType &&initialValue,
+ ReduceOptions options)
+{
+ typedef ReduceKernel<ReduceFunctor, ResultType, typename qValueType<Iterator>::value_type> Reducer;
+ typedef FilteredReducedKernel<ResultType, Iterator, MapFunctor, ReduceFunctor, Reducer> FilteredReduceType;
+ return startThreadEngine(new FilteredReduceType(begin, end, mapFunctor, reduceFunctor, std::forward<ResultType>(initialValue), options));
+}
+
} // namespace QtConcurrent
diff --git a/src/concurrent/qtconcurrentfunctionwrappers.h b/src/concurrent/qtconcurrentfunctionwrappers.h
index 7ba6720e03..34bbe89c86 100644
--- a/src/concurrent/qtconcurrentfunctionwrappers.h
+++ b/src/concurrent/qtconcurrentfunctionwrappers.h
@@ -43,199 +43,64 @@
#include <QtConcurrent/qtconcurrentcompilertest.h>
#include <QtCore/QStringList>
+#include <tuple>
+
#if !defined(QT_NO_CONCURRENT) || defined(Q_CLANG_QDOC)
QT_BEGIN_NAMESPACE
-namespace QtConcurrent {
+namespace QtPrivate {
-template <typename T>
-class FunctionWrapper0
+struct PushBackWrapper
{
-public:
- typedef T (*FunctionPointerType)();
- typedef T result_type;
- inline FunctionWrapper0(FunctionPointerType _functionPointer)
- :functionPointer(_functionPointer) { }
-
- inline T operator()()
+ template <class C, class U>
+ inline void operator()(C &c, const U &u) const
{
- return functionPointer();
+ return c.push_back(u);
}
-private:
- FunctionPointerType functionPointer;
-};
-template <typename T, typename U>
-class FunctionWrapper1
-{
-public:
- typedef T (*FunctionPointerType)(U u);
- typedef T result_type;
- inline FunctionWrapper1(FunctionPointerType _functionPointer)
- :functionPointer(_functionPointer) { }
-
- inline T operator()(U u)
+ template <class C, class U>
+ inline void operator()(C &c, U &&u) const
{
- return functionPointer(u);
+ return c.push_back(u);
}
-
-private:
- FunctionPointerType functionPointer;
};
-template <typename T, typename U, typename V>
-class FunctionWrapper2
-{
-public:
- typedef T (*FunctionPointerType)(U u, V v);
- typedef T result_type;
- inline FunctionWrapper2(FunctionPointerType _functionPointer)
- :functionPointer(_functionPointer) { }
-
- inline T operator()(U u, V v)
- {
- return functionPointer(u, v);
- }
-private:
- FunctionPointerType functionPointer;
-};
+// -- MapResultType
-template <typename T, typename C>
-class MemberFunctionWrapper
+template <class T, class Enable = void>
+struct Argument
{
-public:
- typedef T (C::*FunctionPointerType)();
- typedef T result_type;
- inline MemberFunctionWrapper(FunctionPointerType _functionPointer)
- :functionPointer(_functionPointer) { }
-
- inline T operator()(C &c)
- {
- return (c.*functionPointer)();
- }
-private:
- FunctionPointerType functionPointer;
+ using Type = void;
};
-template <typename T, typename C, typename U>
-class MemberFunctionWrapper1
+template <class Sequence>
+struct Argument<Sequence, typename std::enable_if<IsIterableValue<Sequence>>::type>
{
-public:
- typedef T (C::*FunctionPointerType)(U);
- typedef T result_type;
-
- inline MemberFunctionWrapper1(FunctionPointerType _functionPointer)
- : functionPointer(_functionPointer)
- { }
-
- inline T operator()(C &c, U u)
- {
- return (c.*functionPointer)(u);
- }
-
-private:
- FunctionPointerType functionPointer;
+ using Type = std::decay_t<decltype(*std::begin(std::declval<Sequence>()))>;
};
-template <typename T, typename C>
-class ConstMemberFunctionWrapper
+template <class Iterator>
+struct Argument<Iterator, typename std::enable_if<IsDereferenceableValue<Iterator>>::type>
{
-public:
- typedef T (C::*FunctionPointerType)() const;
- typedef T result_type;
- inline ConstMemberFunctionWrapper(FunctionPointerType _functionPointer)
- :functionPointer(_functionPointer) { }
-
- inline T operator()(const C &c) const
- {
- return (c.*functionPointer)();
- }
-private:
- FunctionPointerType functionPointer;
+ using Type = std::decay_t<decltype(*std::declval<Iterator>())>;
};
-} // namespace QtConcurrent.
-
-namespace QtPrivate {
-
-template <typename T>
-const T& createFunctionWrapper(const T& t)
-{
- return t;
-}
-
-template <typename T, typename U>
-QtConcurrent::FunctionWrapper1<T, U> createFunctionWrapper(T (*func)(U))
-{
- return QtConcurrent::FunctionWrapper1<T, U>(func);
-}
-
-template <typename T, typename C>
-QtConcurrent::MemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func)())
-{
- return QtConcurrent::MemberFunctionWrapper<T, C>(func);
-}
-
-template <typename T, typename C, typename U>
-QtConcurrent::MemberFunctionWrapper1<T, C, U> createFunctionWrapper(T (C::*func)(U))
-{
- return QtConcurrent::MemberFunctionWrapper1<T, C, U>(func);
-}
-
-template <typename T, typename C>
-QtConcurrent::ConstMemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func)() const)
-{
- return QtConcurrent::ConstMemberFunctionWrapper<T, C>(func);
-}
-
-#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
-template <typename T, typename U>
-QtConcurrent::FunctionWrapper1<T, U> createFunctionWrapper(T (*func)(U) noexcept)
-{
- return QtConcurrent::FunctionWrapper1<T, U>(func);
-}
-
-template <typename T, typename C>
-QtConcurrent::MemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func)() noexcept)
-{
- return QtConcurrent::MemberFunctionWrapper<T, C>(func);
-}
-
-template <typename T, typename C, typename U>
-QtConcurrent::MemberFunctionWrapper1<T, C, U> createFunctionWrapper(T (C::*func)(U) noexcept)
-{
- return QtConcurrent::MemberFunctionWrapper1<T, C, U>(func);
-}
-
-template <typename T, typename C>
-QtConcurrent::ConstMemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func)() const noexcept)
-{
- return QtConcurrent::ConstMemberFunctionWrapper<T, C>(func);
-}
-#endif
+template <class T>
+using ArgumentType = typename Argument<T>::Type;
-struct PushBackWrapper
+template <class T, class MapFunctor>
+struct MapResult
{
- typedef void result_type;
-
- template <class C, class U>
- inline void operator()(C &c, const U &u) const
- {
- return c.push_back(u);
- }
-
- template <class C, class U>
- inline void operator()(C &c, U &&u) const
- {
- return c.push_back(u);
- }
+ static_assert(std::is_invocable_v<std::decay_t<MapFunctor>, ArgumentType<T>>,
+ "It's not possible to invoke the function with passed argument.");
+ using Type = std::invoke_result_t<std::decay_t<MapFunctor>, ArgumentType<T>>;
};
-template <typename Functor, bool foo = HasResultType<Functor>::Value>
-struct LazyResultType { typedef typename Functor::result_type Type; };
-template <typename Functor>
-struct LazyResultType<Functor, false> { typedef void Type; };
+template <class T, class MapFunctor>
+using MapResultType = typename MapResult<T, MapFunctor>::Type;
+
+// -- ReduceResultType
template <class T>
struct ReduceResultType;
@@ -252,121 +117,52 @@ struct ReduceResultType<T(C::*)(U)>
typedef C ResultType;
};
-#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
-template <class U, class V>
-struct ReduceResultType<void(*)(U&,V) noexcept>
-{
- typedef U ResultType;
-};
-
-template <class T, class C, class U>
-struct ReduceResultType<T(C::*)(U) noexcept>
-{
- typedef C ResultType;
-};
-#endif
-
-template <class InputSequence, class MapFunctor>
-struct MapResultType
-{
- typedef typename LazyResultType<MapFunctor>::Type ResultType;
-};
-
template <class U, class V>
-struct MapResultType<void, U (*)(V)>
+struct ReduceResultType<std::function<void(U&, V)>>
{
typedef U ResultType;
};
-template <class T, class C>
-struct MapResultType<void, T(C::*)() const>
+template <typename R, typename ...A>
+struct ReduceResultType<R(*)(A...)>
{
- typedef T ResultType;
+ using ResultType = typename std::tuple_element<0, std::tuple<A...>>::type;
};
#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
template <class U, class V>
-struct MapResultType<void, U (*)(V) noexcept>
+struct ReduceResultType<void(*)(U&,V) noexcept>
{
typedef U ResultType;
};
-template <class T, class C>
-struct MapResultType<void, T(C::*)() const noexcept>
+template <class T, class C, class U>
+struct ReduceResultType<T(C::*)(U) noexcept>
{
- typedef T ResultType;
+ typedef C ResultType;
};
#endif
-#ifndef QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
-
-template <template <typename> class InputSequence, typename MapFunctor, typename T>
-struct MapResultType<InputSequence<T>, MapFunctor>
-{
- typedef InputSequence<typename LazyResultType<MapFunctor>::Type> ResultType;
-};
+// -- MapSequenceResultType
-template <template <typename> class InputSequence, class T, class U, class V>
-struct MapResultType<InputSequence<T>, U (*)(V)>
-{
- typedef InputSequence<U> ResultType;
-};
-
-template <template <typename> class InputSequence, class T, class U, class C>
-struct MapResultType<InputSequence<T>, U(C::*)() const>
-{
- typedef InputSequence<U> ResultType;
-};
-
-#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
-
-template <template <typename> class InputSequence, class T, class U, class V>
-struct MapResultType<InputSequence<T>, U (*)(V) noexcept>
-{
- typedef InputSequence<U> ResultType;
-};
-
-template <template <typename> class InputSequence, class T, class U, class C>
-struct MapResultType<InputSequence<T>, U(C::*)() const noexcept>
-{
- typedef InputSequence<U> ResultType;
-};
-#endif
-
-#endif // QT_NO_TEMPLATE_TEMPLATE_PARAMETER
+template <class InputSequence, class MapFunctor>
+struct MapSequenceResultType;
template <class MapFunctor>
-struct MapResultType<QStringList, MapFunctor>
+struct MapSequenceResultType<QStringList, MapFunctor>
{
- typedef QList<typename LazyResultType<MapFunctor>::Type> ResultType;
+ typedef QList<QtPrivate::MapResultType<QStringList, MapFunctor>> ResultType;
};
-template <class U, class V>
-struct MapResultType<QStringList, U (*)(V)>
-{
- typedef QList<U> ResultType;
-};
-
-template <class U, class C>
-struct MapResultType<QStringList, U(C::*)() const>
-{
- typedef QList<U> ResultType;
-};
-
-#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
+#ifndef QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
-template <class U, class V>
-struct MapResultType<QStringList, U (*)(V) noexcept>
+template <template <typename> class InputSequence, typename MapFunctor, typename T>
+struct MapSequenceResultType<InputSequence<T>, MapFunctor>
{
- typedef QList<U> ResultType;
+ typedef InputSequence<QtPrivate::MapResultType<InputSequence<T>, MapFunctor>> ResultType;
};
-template <class U, class C>
-struct MapResultType<QStringList, U(C::*)() const noexcept>
-{
- typedef QList<U> ResultType;
-};
-#endif
+#endif // QT_NO_TEMPLATE_TEMPLATE_PARAMETER
} // namespace QtPrivate.
diff --git a/src/concurrent/qtconcurrentiteratekernel.cpp b/src/concurrent/qtconcurrentiteratekernel.cpp
index b65f712547..45b54ecfdc 100644
--- a/src/concurrent/qtconcurrentiteratekernel.cpp
+++ b/src/concurrent/qtconcurrentiteratekernel.cpp
@@ -48,8 +48,7 @@
QT_BEGIN_NAMESPACE
enum {
- TargetRatio = 100,
- MedianSize = 7
+ TargetRatio = 100
};
static qint64 getticks()
@@ -71,24 +70,12 @@ namespace QtConcurrent {
*/
/*!
- \class QtConcurrent::MedianDouble
- \inmodule QtConcurrent
- \internal
- */
-
-/*!
\class QtConcurrent::BlockSizeManager
\inmodule QtConcurrent
\internal
*/
/*!
- \class QtConcurrent::BlockSizeManagerV2
- \inmodule QtConcurrent
- \internal
- */
-
-/*!
\class QtConcurrent::ResultReporter
\inmodule QtConcurrent
\internal
@@ -116,66 +103,13 @@ namespace QtConcurrent {
*/
BlockSizeManager::BlockSizeManager(int iterationCount)
-: maxBlockSize(iterationCount / (QThreadPool::globalInstance()->maxThreadCount() * 2)),
- beforeUser(0), afterUser(0),
- controlPartElapsed(MedianSize), userPartElapsed(MedianSize),
- m_blockSize(1)
-{ }
-
-// Records the time before user code.
-void BlockSizeManager::timeBeforeUser()
-{
- if (blockSizeMaxed())
- return;
-
- beforeUser = getticks();
- controlPartElapsed.addValue(elapsed(beforeUser, afterUser));
-}
-
- // Records the time after user code and adjust the block size if we are spending
- // to much time in the for control code compared with the user code.
-void BlockSizeManager::timeAfterUser()
-{
- if (blockSizeMaxed())
- return;
-
- afterUser = getticks();
- userPartElapsed.addValue(elapsed(afterUser, beforeUser));
-
- if (controlPartElapsed.isMedianValid() == false)
- return;
-
- if (controlPartElapsed.median() * TargetRatio < userPartElapsed.median())
- return;
-
- m_blockSize = qMin(m_blockSize * 2, maxBlockSize);
-
-#ifdef QTCONCURRENT_FOR_DEBUG
- qDebug() << QThread::currentThread() << "adjusting block size" << controlPartElapsed.median() << userPartElapsed.median() << m_blockSize;
-#endif
-
- // Reset the medians after adjusting the block size so we get
- // new measurements with the new block size.
- controlPartElapsed.reset();
- userPartElapsed.reset();
-}
-
-int BlockSizeManager::blockSize()
-{
- return m_blockSize;
-}
-
-/*! \internal
-
-*/
-BlockSizeManagerV2::BlockSizeManagerV2(int iterationCount)
: maxBlockSize(iterationCount / (QThreadPool::globalInstance()->maxThreadCount() * 2)),
beforeUser(0), afterUser(0),
m_blockSize(1)
{ }
// Records the time before user code.
-void BlockSizeManagerV2::timeBeforeUser()
+void BlockSizeManager::timeBeforeUser()
{
if (blockSizeMaxed())
return;
@@ -186,7 +120,7 @@ void BlockSizeManagerV2::timeBeforeUser()
// Records the time after user code and adjust the block size if we are spending
// to much time in the for control code compared with the user code.
-void BlockSizeManagerV2::timeAfterUser()
+void BlockSizeManager::timeAfterUser()
{
if (blockSizeMaxed())
return;
@@ -212,7 +146,7 @@ void BlockSizeManagerV2::timeAfterUser()
userPartElapsed.reset();
}
-int BlockSizeManagerV2::blockSize()
+int BlockSizeManager::blockSize()
{
return m_blockSize;
}
diff --git a/src/concurrent/qtconcurrentiteratekernel.h b/src/concurrent/qtconcurrentiteratekernel.h
index 3095c9ff52..09009efedc 100644
--- a/src/concurrent/qtconcurrentiteratekernel.h
+++ b/src/concurrent/qtconcurrentiteratekernel.h
@@ -61,37 +61,13 @@ namespace QtConcurrent {
reserve and process at a time. This is done by measuring the time spent
in the user code versus the control part code, and then increasing
the block size if the ratio between them is to small. The block size
- management is done on the basis of the median of several timing measuremens,
- and it is done induvidualy for each thread.
+ management is done on the basis of the median of several timing measurements,
+ and it is done individually for each thread.
*/
class Q_CONCURRENT_EXPORT BlockSizeManager
{
public:
- BlockSizeManager(int iterationCount);
- void timeBeforeUser();
- void timeAfterUser();
- int blockSize();
-private:
- inline bool blockSizeMaxed()
- {
- return (m_blockSize >= maxBlockSize);
- }
-
- const int maxBlockSize;
- qint64 beforeUser;
- qint64 afterUser;
- Median<double> controlPartElapsed;
- Median<double> userPartElapsed;
- int m_blockSize;
-
- Q_DISABLE_COPY(BlockSizeManager)
-};
-
-// ### Qt6: Replace BlockSizeManager with V2 implementation
-class Q_CONCURRENT_EXPORT BlockSizeManagerV2
-{
-public:
- explicit BlockSizeManagerV2(int iterationCount);
+ explicit BlockSizeManager(int iterationCount);
void timeBeforeUser();
void timeAfterUser();
@@ -106,11 +82,11 @@ private:
const int maxBlockSize;
qint64 beforeUser;
qint64 afterUser;
- MedianDouble controlPartElapsed;
- MedianDouble userPartElapsed;
+ Median controlPartElapsed;
+ Median userPartElapsed;
int m_blockSize;
- Q_DISABLE_COPY(BlockSizeManagerV2)
+ Q_DISABLE_COPY(BlockSizeManager)
};
template <typename T>
@@ -221,7 +197,7 @@ public:
ThreadFunctionResult forThreadFunction()
{
- BlockSizeManagerV2 blockSizeManager(iterationCount);
+ BlockSizeManager blockSizeManager(iterationCount);
ResultReporter<T> resultReporter(this);
for(;;) {
diff --git a/src/concurrent/qtconcurrentmap.cpp b/src/concurrent/qtconcurrentmap.cpp
index 157ea14b32..2ad5483540 100644
--- a/src/concurrent/qtconcurrentmap.cpp
+++ b/src/concurrent/qtconcurrentmap.cpp
@@ -119,6 +119,16 @@
*/
/*!
+ \fn [qtconcurrentmapkernel-6] ThreadEngineStarter<ResultType> QtConcurrent::startMappedReduced(const Sequence & sequence, MapFunctor mapFunctor, ReduceFunctor reduceFunctor, ResultType &&initialValue, ReduceOptions options)
+ \internal
+*/
+
+/*!
+ \fn [qtconcurrentmapkernel-7] ThreadEngineStarter<ResultType> QtConcurrent::startMappedReduced(Iterator begin, Iterator end, MapFunctor mapFunctor, ReduceFunctor reduceFunctor, ResultType &&initialValue, ReduceOptions options)
+ \internal
+*/
+
+/*!
\enum QtConcurrent::ReduceOption
This enum specifies the order of which results from the map or filter
function are passed to the reduce function.
@@ -260,8 +270,7 @@
QtConcurrent::map(), QtConcurrent::mapped(), and
QtConcurrent::mappedReduced() accept function objects
for the map function. These function objects can be used to
- add state to a function call. The result_type typedef must define the
- result type of the function call operator:
+ add state to a function call:
\snippet code/src_concurrent_qtconcurrentmap.cpp 14
@@ -271,6 +280,26 @@
\snippet code/src_concurrent_qtconcurrentmap.cpp 11
+ \section2 Using Lambda Expressions
+
+ QtConcurrent::map(), QtConcurrent::mapped(), and
+ QtConcurrent::mappedReduced() accept lambda expressions for the map and
+ reduce function:
+
+ \snippet code/src_concurrent_qtconcurrentmap.cpp 15
+
+ When using QtConcurrent::mappedReduced() or
+ QtConcurrent::blockingMappedReduced(), you can mix the use of normal
+ functions, member functions and lambda expressions freely.
+
+ \snippet code/src_concurrent_qtconcurrentmap.cpp 16
+
+ For the reduce function, lambda expressions are not directly supported.
+ Lambda expressions can, however, be used when the type of the reduction
+ result is explicitly specified:
+
+ \snippet code/src_concurrent_qtconcurrentmap.cpp 17
+
\section2 Wrapping Functions that Take Multiple Arguments
If you want to use a map function that takes more than one argument you can
@@ -311,7 +340,7 @@
*/
/*!
- \fn template <typename Sequence, typename MapFunctor> QFuture<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType> QtConcurrent::mapped(const Sequence &sequence, MapFunctor function)
+ \fn template <typename Sequence, typename MapFunctor> QFuture<QtPrivate::MapResultType<Sequence, MapFunctor>> QtConcurrent::mapped(const Sequence &sequence, MapFunctor function)
Calls \a function once for each item in \a sequence and returns a future
with each mapped item as a result. You can use QFuture::const_iterator or
@@ -321,7 +350,7 @@
*/
/*!
- \fn template <typename Iterator, typename MapFunctor> QFuture<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType> QtConcurrent::mapped(Iterator begin, Iterator end, MapFunctor function)
+ \fn template <typename Iterator, typename MapFunctor> QFuture<QtPrivate::MapResultType<Iterator, MapFunctor>> QtConcurrent::mapped(Iterator begin, Iterator end, MapFunctor function)
Calls \a function once for each item from \a begin to \a end and returns a
future with each mapped item as a result. You can use
@@ -344,6 +373,22 @@
*/
/*!
+ \fn template <typename ResultType, typename Sequence, typename MapFunctor, typename ReduceFunctor, typename InitialValueType> QFuture<ResultType> QtConcurrent::mappedReduced(const Sequence &sequence, MapFunctor mapFunction, ReduceFunctor reduceFunction, InitialValueType &&initialValue, QtConcurrent::ReduceOptions reduceOptions)
+
+ Calls \a mapFunction once for each item in \a sequence. The return value of
+ each \a mapFunction is passed to \a reduceFunction.
+ The result value is initialized to \a initialValue when the function is
+ called, and the first call to \a reduceFunction will operate on
+ this value.
+
+ Note that while \a mapFunction is called concurrently, only one thread at a
+ time will call \a reduceFunction. The order in which \a reduceFunction is
+ called is determined by \a reduceOptions.
+
+ \sa {Concurrent Map and Map-Reduce}
+*/
+
+/*!
\fn template <typename ResultType, typename Iterator, typename MapFunctor, typename ReduceFunctor> QFuture<ResultType> QtConcurrent::mappedReduced(Iterator begin, Iterator end, MapFunctor mapFunction, ReduceFunctor reduceFunction, QtConcurrent::ReduceOptions reduceOptions)
Calls \a mapFunction once for each item from \a begin to \a end. The return
@@ -359,6 +404,24 @@
*/
/*!
+ \fn template <typename ResultType, typename Iterator, typename MapFunctor, typename ReduceFunctor, typename InitialValueType> QFuture<ResultType> QtConcurrent::mappedReduced(Iterator begin, Iterator end, MapFunctor mapFunction, ReduceFunctor reduceFunction, InitialValueType &&initialValue, QtConcurrent::ReduceOptions reduceOptions)
+
+ Calls \a mapFunction once for each item from \a begin to \a end. The return
+ value of each \a mapFunction is passed to \a reduceFunction.
+ The result value is initialized to \a initialValue when the function is
+ called, and the first call to \a reduceFunction will operate on
+ this value.
+
+ Note that while \a mapFunction is called concurrently, only one thread at a
+ time will call \a reduceFunction. By default, the order in which
+ \a reduceFunction is called is undefined.
+
+ \note QtConcurrent::OrderedReduce results in the ordered reduction.
+
+ \sa {Concurrent Map and Map-Reduce}
+*/
+
+/*!
\fn template <typename Sequence, typename MapFunctor> void QtConcurrent::blockingMap(Sequence &sequence, MapFunctor function)
Calls \a function once for each item in \a sequence. The \a function is
@@ -427,6 +490,24 @@
*/
/*!
+ \fn template <typename ResultType, typename Sequence, typename MapFunctor, typename ReduceFunctor, typename InitialValueType> ResultType QtConcurrent::blockingMappedReduced(const Sequence &sequence, MapFunctor mapFunction, ReduceFunctor reduceFunction, InitialValueType &&initialValue, QtConcurrent::ReduceOptions reduceOptions)
+
+ Calls \a mapFunction once for each item in \a sequence. The return value of
+ each \a mapFunction is passed to \a reduceFunction.
+ The result value is initialized to \a initialValue when the function is
+ called, and the first call to \a reduceFunction will operate on
+ this value.
+
+ Note that while \a mapFunction is called concurrently, only one thread at a
+ time will call \a reduceFunction. The order in which \a reduceFunction is
+ called is determined by \a reduceOptions.
+
+ \note This function will block until all items in the sequence have been processed.
+
+ \sa mapped(), {Concurrent Map and Map-Reduce}
+*/
+
+/*!
\fn template <typename ResultType, typename Iterator, typename MapFunctor, typename ReduceFunctor> ResultType QtConcurrent::blockingMappedReduced(Iterator begin, Iterator end, MapFunctor mapFunction, ReduceFunctor reduceFunction, QtConcurrent::ReduceOptions reduceOptions)
Calls \a mapFunction once for each item from \a begin to \a end. The return
@@ -443,37 +524,20 @@
*/
/*!
- \class QtConcurrent::FunctionWrapper0
- \inmodule QtConcurrent
- \internal
-*/
+ \fn template <typename ResultType, typename Iterator, typename MapFunctor, typename ReduceFunctor, typename InitialValueType> ResultType QtConcurrent::blockingMappedReduced(Iterator begin, Iterator end, MapFunctor mapFunction, ReduceFunctor reduceFunction, InitialValueType &&initialValue, QtConcurrent::ReduceOptions reduceOptions)
-/*!
- \class QtConcurrent::FunctionWrapper1
- \inmodule QtConcurrent
- \internal
-*/
-
-/*!
- \class QtConcurrent::FunctionWrapper2
- \inmodule QtConcurrent
- \internal
-*/
+ Calls \a mapFunction once for each item from \a begin to \a end. The return
+ value of each \a mapFunction is passed to \a reduceFunction.
+ The result value is initialized to \a initialValue when the function is
+ called, and the first call to \a reduceFunction will operate on
+ this value.
-/*!
- \class QtConcurrent::MemberFunctionWrapper
- \inmodule QtConcurrent
- \internal
-*/
+ Note that while \a mapFunction is called concurrently, only one thread at a
+ time will call \a reduceFunction. The order in which \a reduceFunction is
+ called is undefined.
-/*!
- \class QtConcurrent::MemberFunctionWrapper1
- \inmodule QtConcurrent
- \internal
-*/
+ \note This function will block until the iterator reaches the end of the
+ sequence being processed.
-/*!
- \class QtConcurrent::ConstMemberFunctionWrapper
- \inmodule QtConcurrent
- \internal
+ \sa blockingMappedReduced(), {Concurrent Map and Map-Reduce}
*/
diff --git a/src/concurrent/qtconcurrentmap.h b/src/concurrent/qtconcurrentmap.h
index 151f03cf56..9b8ccc3eaf 100644
--- a/src/concurrent/qtconcurrentmap.h
+++ b/src/concurrent/qtconcurrentmap.h
@@ -59,14 +59,14 @@ namespace QtConcurrent {
template <typename Sequence, typename MapFunctor>
QFuture<void> map(Sequence &sequence, MapFunctor map)
{
- return startMap(sequence.begin(), sequence.end(), QtPrivate::createFunctionWrapper(map));
+ return startMap(sequence.begin(), sequence.end(), map);
}
// map() on iterators
template <typename Iterator, typename MapFunctor>
QFuture<void> map(Iterator begin, Iterator end, MapFunctor map)
{
- return startMap(begin, end, QtPrivate::createFunctionWrapper(map));
+ return startMap(begin, end, map);
}
// mappedReduced() for sequences.
@@ -76,26 +76,58 @@ QFuture<ResultType> mappedReduced(const Sequence &sequence,
ReduceFunctor reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
{
- return startMappedReduced<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType, ResultType>
+ return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>, ResultType>
(sequence,
- QtPrivate::createFunctionWrapper(map),
- QtPrivate::createFunctionWrapper(reduce),
+ map,
+ reduce,
options);
}
+template <typename ResultType, typename Sequence, typename MapFunctor, typename ReduceFunctor,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+QFuture<ResultType> mappedReduced(const Sequence &sequence, MapFunctor map, ReduceFunctor reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>,
+ ResultType>(sequence, map,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)),
+ options);
+}
+
template <typename Sequence, typename MapFunctor, typename ReduceFunctor>
QFuture<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> mappedReduced(const Sequence &sequence,
MapFunctor map,
ReduceFunctor reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
{
- return startMappedReduced<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType, typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
+ return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>,
+ typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
(sequence,
- QtPrivate::createFunctionWrapper(map),
- QtPrivate::createFunctionWrapper(reduce),
+ map,
+ reduce,
options);
}
+template <typename Sequence, typename MapFunctor, typename ReduceFunctor,
+ typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+QFuture<ResultType> mappedReduced(const Sequence &sequence, MapFunctor map, ReduceFunctor reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>,
+ typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>(
+ sequence, map,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+}
+
// mappedReduced() for iterators
template <typename ResultType, typename Iterator, typename MapFunctor, typename ReduceFunctor>
QFuture<ResultType> mappedReduced(Iterator begin,
@@ -104,13 +136,28 @@ QFuture<ResultType> mappedReduced(Iterator begin,
ReduceFunctor reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
{
- return startMappedReduced<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType, ResultType>
+ return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType>
(begin, end,
- QtPrivate::createFunctionWrapper(map),
- QtPrivate::createFunctionWrapper(reduce),
+ map,
+ reduce,
options);
}
+template <typename ResultType, typename Iterator, typename MapFunctor, typename ReduceFunctor,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+QFuture<ResultType> mappedReduced(Iterator begin, Iterator end, MapFunctor map,
+ ReduceFunctor reduce, InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>,
+ ResultType>(begin, end, map,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)),
+ options);
+}
+
template <typename Iterator, typename MapFunctor, typename ReduceFunctor>
QFuture<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> mappedReduced(Iterator begin,
Iterator end,
@@ -118,39 +165,56 @@ QFuture<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> mappedR
ReduceFunctor reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
{
- return startMappedReduced<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType, typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
+ return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>,
+ typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
(begin, end,
- QtPrivate::createFunctionWrapper(map),
- QtPrivate::createFunctionWrapper(reduce),
+ map,
+ reduce,
options);
}
+template <typename Iterator, typename MapFunctor, typename ReduceFunctor,
+ typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+QFuture<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> mappedReduced(
+ Iterator begin, Iterator end, MapFunctor map, ReduceFunctor reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
+{
+ return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>,
+ typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>(
+ begin, end, map,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+}
+
// mapped() for sequences
template <typename Sequence, typename MapFunctor>
-QFuture<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType> mapped(const Sequence &sequence, MapFunctor map)
+QFuture<QtPrivate::MapResultType<Sequence, MapFunctor>> mapped(const Sequence &sequence, MapFunctor map)
{
- return startMapped<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType>(sequence, QtPrivate::createFunctionWrapper(map));
+ return startMapped<QtPrivate::MapResultType<Sequence, MapFunctor>>(sequence, map);
}
// mapped() for iterator ranges.
template <typename Iterator, typename MapFunctor>
-QFuture<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType> mapped(Iterator begin, Iterator end, MapFunctor map)
+QFuture<QtPrivate::MapResultType<Iterator, MapFunctor>> mapped(Iterator begin, Iterator end, MapFunctor map)
{
- return startMapped<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType>(begin, end, QtPrivate::createFunctionWrapper(map));
+ return startMapped<QtPrivate::MapResultType<Iterator, MapFunctor>>(begin, end, map);
}
// blockingMap() for sequences
template <typename Sequence, typename MapFunctor>
void blockingMap(Sequence &sequence, MapFunctor map)
{
- startMap(sequence.begin(), sequence.end(), QtPrivate::createFunctionWrapper(map)).startBlocking();
+ startMap(sequence.begin(), sequence.end(), map).startBlocking();
}
// blockingMap() for iterator ranges
template <typename Iterator, typename MapFunctor>
void blockingMap(Iterator begin, Iterator end, MapFunctor map)
{
- startMap(begin, end, QtPrivate::createFunctionWrapper(map)).startBlocking();
+ startMap(begin, end, map).startBlocking();
}
// blockingMappedReduced() for sequences
@@ -160,28 +224,63 @@ ResultType blockingMappedReduced(const Sequence &sequence,
ReduceFunctor reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
{
- return QtConcurrent::startMappedReduced<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType, ResultType>
+ return QtConcurrent::startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>, ResultType>
(sequence,
- QtPrivate::createFunctionWrapper(map),
- QtPrivate::createFunctionWrapper(reduce),
+ map,
+ reduce,
options)
.startBlocking();
}
+template <typename ResultType, typename Sequence, typename MapFunctor, typename ReduceFunctor,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ResultType blockingMappedReduced(const Sequence &sequence, MapFunctor map, ReduceFunctor reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return QtConcurrent::startMappedReduced<
+ QtPrivate::MapResultType<Sequence, MapFunctor>, ResultType>(
+ sequence, map,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options)
+ .startBlocking();
+}
+
template <typename MapFunctor, typename ReduceFunctor, typename Sequence>
typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType blockingMappedReduced(const Sequence &sequence,
MapFunctor map,
ReduceFunctor reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
{
- return QtConcurrent::startMappedReduced<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType, typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
+ return QtConcurrent::startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>,
+ typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
(sequence,
- QtPrivate::createFunctionWrapper(map),
- QtPrivate::createFunctionWrapper(reduce),
+ map,
+ reduce,
options)
.startBlocking();
}
+template <typename MapFunctor, typename ReduceFunctor, typename Sequence,
+ typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType blockingMappedReduced(
+ const Sequence &sequence, MapFunctor map, ReduceFunctor reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
+{
+ return QtConcurrent::startMappedReduced<
+ QtPrivate::MapResultType<Sequence, MapFunctor>,
+ typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>(
+ sequence, map,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options)
+ .startBlocking();
+}
+
// blockingMappedReduced() for iterator ranges
template <typename ResultType, typename Iterator, typename MapFunctor, typename ReduceFunctor>
ResultType blockingMappedReduced(Iterator begin,
@@ -190,14 +289,31 @@ ResultType blockingMappedReduced(Iterator begin,
ReduceFunctor reduce,
QtConcurrent::ReduceOptions options = QtConcurrent::ReduceOptions(QtConcurrent::UnorderedReduce | QtConcurrent::SequentialReduce))
{
- return QtConcurrent::startMappedReduced<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType, ResultType>
+ return QtConcurrent::startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType>
(begin, end,
- QtPrivate::createFunctionWrapper(map),
- QtPrivate::createFunctionWrapper(reduce),
+ map,
+ reduce,
options)
.startBlocking();
}
+template <typename ResultType, typename Iterator, typename MapFunctor, typename ReduceFunctor,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ResultType blockingMappedReduced(Iterator begin, Iterator end, MapFunctor map, ReduceFunctor reduce,
+ InitialValueType &&initialValue,
+ QtConcurrent::ReduceOptions options = QtConcurrent::ReduceOptions(
+ QtConcurrent::UnorderedReduce
+ | QtConcurrent::SequentialReduce))
+{
+ return QtConcurrent::startMappedReduced<
+ QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType>(
+ begin, end, map,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options)
+ .startBlocking();
+}
+
template <typename Iterator, typename MapFunctor, typename ReduceFunctor>
typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType blockingMappedReduced(Iterator begin,
Iterator end,
@@ -205,32 +321,52 @@ typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType blockingMappedRe
ReduceFunctor reduce,
QtConcurrent::ReduceOptions options = QtConcurrent::ReduceOptions(QtConcurrent::UnorderedReduce | QtConcurrent::SequentialReduce))
{
- return QtConcurrent::startMappedReduced<typename QtPrivate::MapResultType<void, MapFunctor>::ResultType, typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
+ return QtConcurrent::startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>,
+ typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
(begin, end,
- QtPrivate::createFunctionWrapper(map),
- QtPrivate::createFunctionWrapper(reduce),
+ map,
+ reduce,
options)
.startBlocking();
}
+template <typename Iterator, typename MapFunctor, typename ReduceFunctor,
+ typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ typename InitialValueType,
+ std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType blockingMappedReduced(
+ Iterator begin, Iterator end, MapFunctor map, ReduceFunctor reduce,
+ InitialValueType &&initialValue,
+ QtConcurrent::ReduceOptions options = QtConcurrent::ReduceOptions(
+ QtConcurrent::UnorderedReduce | QtConcurrent::SequentialReduce))
+{
+ return QtConcurrent::startMappedReduced<
+ QtPrivate::MapResultType<Iterator, MapFunctor>,
+ typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>(
+ begin, end, map,
+ reduce,
+ ResultType(std::forward<InitialValueType>(initialValue)), options)
+ .startBlocking();
+}
+
// mapped() for sequences with a different putput sequence type.
template <typename OutputSequence, typename InputSequence, typename MapFunctor>
OutputSequence blockingMapped(const InputSequence &sequence, MapFunctor map)
{
return blockingMappedReduced<OutputSequence>
(sequence,
- QtPrivate::createFunctionWrapper(map),
+ map,
QtPrivate::PushBackWrapper(),
QtConcurrent::OrderedReduce);
}
template <typename MapFunctor, typename InputSequence>
-typename QtPrivate::MapResultType<InputSequence, MapFunctor>::ResultType blockingMapped(const InputSequence &sequence, MapFunctor map)
+auto blockingMapped(const InputSequence &sequence, MapFunctor map)
{
- typedef typename QtPrivate::MapResultType<InputSequence, MapFunctor>::ResultType OutputSequence;
+ using OutputSequence = typename QtPrivate::MapSequenceResultType<InputSequence, MapFunctor>::ResultType;
return blockingMappedReduced<OutputSequence>
(sequence,
- QtPrivate::createFunctionWrapper(map),
+ map,
QtPrivate::PushBackWrapper(),
QtConcurrent::OrderedReduce);
}
@@ -241,18 +377,18 @@ Sequence blockingMapped(Iterator begin, Iterator end, MapFunctor map)
{
return blockingMappedReduced<Sequence>
(begin, end,
- QtPrivate::createFunctionWrapper(map),
+ map,
QtPrivate::PushBackWrapper(),
QtConcurrent::OrderedReduce);
}
template <typename Iterator, typename MapFunctor>
-typename QtPrivate::MapResultType<Iterator, MapFunctor>::ResultType blockingMapped(Iterator begin, Iterator end, MapFunctor map)
+auto blockingMapped(Iterator begin, Iterator end, MapFunctor map)
{
- typedef typename QtPrivate::MapResultType<Iterator, MapFunctor>::ResultType OutputSequence;
+ using OutputSequence = QtPrivate::MapResultType<Iterator, MapFunctor>;
return blockingMappedReduced<OutputSequence>
(begin, end,
- QtPrivate::createFunctionWrapper(map),
+ map,
QtPrivate::PushBackWrapper(),
QtConcurrent::OrderedReduce);
}
diff --git a/src/concurrent/qtconcurrentmapkernel.h b/src/concurrent/qtconcurrentmapkernel.h
index 7c9538a015..346ffbfc7f 100644
--- a/src/concurrent/qtconcurrentmapkernel.h
+++ b/src/concurrent/qtconcurrentmapkernel.h
@@ -46,6 +46,7 @@
#include <QtConcurrent/qtconcurrentiteratekernel.h>
#include <QtConcurrent/qtconcurrentreducekernel.h>
+#include <QtConcurrent/qtconcurrentfunctionwrappers.h>
QT_BEGIN_NAMESPACE
@@ -65,7 +66,7 @@ public:
bool runIteration(Iterator it, int, void *) override
{
- map(*it);
+ std::invoke(map, *it);
return false;
}
@@ -88,39 +89,45 @@ template <typename ReducedResultType,
typename ReduceFunctor,
typename Reducer = ReduceKernel<ReduceFunctor,
ReducedResultType,
- typename MapFunctor::result_type> >
+ QtPrivate::MapResultType<Iterator, MapFunctor>>>
class MappedReducedKernel : public IterateKernel<Iterator, ReducedResultType>
{
ReducedResultType reducedResult;
MapFunctor map;
ReduceFunctor reduce;
Reducer reducer;
+ using IntermediateResultsType = QtPrivate::MapResultType<Iterator, MapFunctor>;
+
public:
typedef ReducedResultType ReturnType;
MappedReducedKernel(Iterator begin, Iterator end, MapFunctor _map, ReduceFunctor _reduce, ReduceOptions reduceOptions)
: IterateKernel<Iterator, ReducedResultType>(begin, end), reducedResult(), map(_map), reduce(_reduce), reducer(reduceOptions)
{ }
- MappedReducedKernel(ReducedResultType initialValue,
- MapFunctor _map,
- ReduceFunctor _reduce)
- : reducedResult(initialValue), map(_map), reduce(_reduce)
- { }
+ MappedReducedKernel(Iterator begin, Iterator end, MapFunctor _map, ReduceFunctor _reduce,
+ ReducedResultType &&initialValue, ReduceOptions reduceOptions)
+ : IterateKernel<Iterator, ReducedResultType>(begin, end),
+ reducedResult(std::forward<ReducedResultType>(initialValue)),
+ map(_map),
+ reduce(_reduce),
+ reducer(reduceOptions)
+ {
+ }
bool runIteration(Iterator it, int index, ReducedResultType *) override
{
- IntermediateResults<typename MapFunctor::result_type> results;
+ IntermediateResults<IntermediateResultsType> results;
results.begin = index;
results.end = index + 1;
- results.vector.append(map(*it));
+ results.vector.append(std::invoke(map, *it));
reducer.runReduce(reduce, reducedResult, results);
return false;
}
bool runIterations(Iterator sequenceBeginIterator, int beginIndex, int endIndex, ReducedResultType *) override
{
- IntermediateResults<typename MapFunctor::result_type> results;
+ IntermediateResults<IntermediateResultsType> results;
results.begin = beginIndex;
results.end = endIndex;
results.vector.reserve(endIndex - beginIndex);
@@ -128,7 +135,7 @@ public:
Iterator it = sequenceBeginIterator;
std::advance(it, beginIndex);
for (int i = beginIndex; i < endIndex; ++i) {
- results.vector.append(map(*(it)));
+ results.vector.append(std::invoke(map, *it));
std::advance(it, 1);
}
@@ -159,20 +166,18 @@ public:
};
template <typename Iterator, typename MapFunctor>
-class MappedEachKernel : public IterateKernel<Iterator, typename MapFunctor::result_type>
+class MappedEachKernel : public IterateKernel<Iterator, QtPrivate::MapResultType<Iterator, MapFunctor>>
{
MapFunctor map;
- typedef typename MapFunctor::result_type T;
-public:
- typedef T ReturnType;
- typedef T ResultType;
+ using T = QtPrivate::MapResultType<Iterator, MapFunctor>;
+public:
MappedEachKernel(Iterator begin, Iterator end, MapFunctor _map)
: IterateKernel<Iterator, T>(begin, end), map(_map) { }
bool runIteration(Iterator it, int, T *result) override
{
- *result = map(*it);
+ *result = std::invoke(map, *it);
return true;
}
@@ -261,6 +266,41 @@ inline ThreadEngineStarter<ResultType> startMappedReduced(Iterator begin, Iterat
return startThreadEngine(new MappedReduceType(begin, end, mapFunctor, reduceFunctor, options));
}
+//! [qtconcurrentmapkernel-6]
+template <typename IntermediateType, typename ResultType, typename Sequence, typename MapFunctor,
+ typename ReduceFunctor>
+inline ThreadEngineStarter<ResultType> startMappedReduced(const Sequence &sequence,
+ MapFunctor mapFunctor,
+ ReduceFunctor reduceFunctor,
+ ResultType &&initialValue,
+ ReduceOptions options)
+{
+ typedef typename Sequence::const_iterator Iterator;
+ typedef ReduceKernel<ReduceFunctor, ResultType, IntermediateType> Reducer;
+ typedef MappedReducedKernel<ResultType, Iterator, MapFunctor, ReduceFunctor, Reducer>
+ MappedReduceType;
+ typedef SequenceHolder2<Sequence, MappedReduceType, MapFunctor, ReduceFunctor>
+ SequenceHolderType;
+ return startThreadEngine(new SequenceHolderType(
+ sequence, mapFunctor, reduceFunctor, std::forward<ResultType>(initialValue), options));
+}
+
+//! [qtconcurrentmapkernel-7]
+template <typename IntermediateType, typename ResultType, typename Iterator, typename MapFunctor,
+ typename ReduceFunctor>
+inline ThreadEngineStarter<ResultType> startMappedReduced(Iterator begin, Iterator end,
+ MapFunctor mapFunctor,
+ ReduceFunctor reduceFunctor,
+ ResultType &&initialValue,
+ ReduceOptions options)
+{
+ typedef ReduceKernel<ReduceFunctor, ResultType, IntermediateType> Reducer;
+ typedef MappedReducedKernel<ResultType, Iterator, MapFunctor, ReduceFunctor, Reducer>
+ MappedReduceType;
+ return startThreadEngine(new MappedReduceType(begin, end, mapFunctor, reduceFunctor,
+ std::forward<ResultType>(initialValue), options));
+}
+
} // namespace QtConcurrent
diff --git a/src/concurrent/qtconcurrentmedian.h b/src/concurrent/qtconcurrentmedian.h
index cec2431d6f..aab80794d9 100644
--- a/src/concurrent/qtconcurrentmedian.h
+++ b/src/concurrent/qtconcurrentmedian.h
@@ -42,97 +42,21 @@
#include <QtConcurrent/qtconcurrent_global.h>
-#if !defined(QT_NO_CONCURRENT) ||defined(Q_CLANG_QDOC)
-
-#include <QtCore/qvector.h>
+#if !defined(QT_NO_CONCURRENT) || defined(Q_CLANG_QDOC)
#include <algorithm>
+#include <cstring>
QT_BEGIN_NAMESPACE
-
-
namespace QtConcurrent {
-template <typename T>
class Median
{
public:
- Median(int _bufferSize)
- : currentMedian(), bufferSize(_bufferSize), currentIndex(0), valid(false), dirty(true)
- {
- values.resize(bufferSize);
- }
-
- void reset()
- {
- values.fill(0);
- currentIndex = 0;
- valid = false;
- dirty = true;
- }
-
- void addValue(T value)
- {
- currentIndex = ((currentIndex + 1) % bufferSize);
- if (valid == false && currentIndex % bufferSize == 0)
- valid = true;
-
- // Only update the cached median value when we have to, that
- // is when the new value is on then other side of the median
- // compared to the current value at the index.
- const T currentIndexValue = values[currentIndex];
- if ((currentIndexValue > currentMedian && currentMedian > value)
- || (currentMedian > currentIndexValue && value > currentMedian)) {
- dirty = true;
- }
-
- values[currentIndex] = value;
- }
-
- bool isMedianValid() const
- {
- return valid;
- }
-
- T median()
- {
- if (dirty) {
- dirty = false;
-
-// This is a workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58800
-// Avoid using std::nth_element for the affected stdlibc++ releases 4.7.3 and 4.8.2.
-// Note that the official __GLIBCXX__ value of the releases is not used since that
-// one might be patched on some GNU/Linux distributions.
-#if defined(__GLIBCXX__) && __GLIBCXX__ <= 20140107
- QVector<T> sorted = values;
- std::sort(sorted.begin(), sorted.end());
- currentMedian = sorted.at(bufferSize / 2);
-#else
- QVector<T> copy = values;
- typename QVector<T>::iterator begin = copy.begin(), mid = copy.begin() + bufferSize/2, end = copy.end();
- std::nth_element(begin, mid, end);
- currentMedian = *mid;
-#endif
- }
- return currentMedian;
- }
-private:
- QVector<T> values;
- T currentMedian;
- int bufferSize;
- int currentIndex;
- bool valid;
- bool dirty;
-};
-
-// ### Qt6: Drop Median<double> in favor of this faster MedianDouble
-class MedianDouble
-{
-public:
enum { BufferSize = 7 };
- MedianDouble()
+ Median()
: currentMedian(), currentIndex(0), valid(false), dirty(true)
{
std::fill_n(values, static_cast<int>(BufferSize), 0.0);
@@ -195,7 +119,6 @@ private:
} // namespace QtConcurrent
-
QT_END_NAMESPACE
#endif // QT_NO_CONCURRENT
diff --git a/src/concurrent/qtconcurrentreducekernel.h b/src/concurrent/qtconcurrentreducekernel.h
index 8f9a938952..a487ec26a2 100644
--- a/src/concurrent/qtconcurrentreducekernel.h
+++ b/src/concurrent/qtconcurrentreducekernel.h
@@ -124,7 +124,7 @@ class ReduceKernel
const IntermediateResults<T> &result)
{
for (int i = 0; i < result.vector.size(); ++i) {
- reduce(r, result.vector.at(i));
+ std::invoke(reduce, r, result.vector.at(i));
}
}
@@ -232,6 +232,16 @@ struct SequenceHolder2 : public Base
sequence(_sequence)
{ }
+ template <typename InitialValueType>
+ SequenceHolder2(const Sequence &_sequence,
+ Functor1 functor1,
+ Functor2 functor2,
+ InitialValueType &&initialValue,
+ ReduceOptions reduceOptions)
+ : Base(_sequence.begin(), _sequence.end(), functor1, functor2, std::forward<InitialValueType>(initialValue), reduceOptions),
+ sequence(_sequence)
+ { }
+
Sequence sequence;
void finish() override
diff --git a/src/concurrent/qtconcurrentrun.cpp b/src/concurrent/qtconcurrentrun.cpp
index d9867e1f1a..c5f2e113a2 100644
--- a/src/concurrent/qtconcurrentrun.cpp
+++ b/src/concurrent/qtconcurrentrun.cpp
@@ -112,6 +112,14 @@
Calling a lambda function is done like this:
\snippet code/src_concurrent_qtconcurrentrun.cpp 6
+
+ Calling a function modifies an object passed by reference is done like this:
+
+ \snippet code/src_concurrent_qtconcurrentrun.cpp 7
+
+ Using callable object is done like this:
+
+ \snippet code/src_concurrent_qtconcurrentrun.cpp 8
*/
/*!
diff --git a/src/concurrent/qtconcurrentrun.h b/src/concurrent/qtconcurrentrun.h
index 22dae70460..4f583a343c 100644
--- a/src/concurrent/qtconcurrentrun.h
+++ b/src/concurrent/qtconcurrentrun.h
@@ -37,7 +37,6 @@
**
****************************************************************************/
-// Generated code, do not edit! Use generator at tools/qtconcurrent/generaterun/
#ifndef QTCONCURRENT_RUN_H
#define QTCONCURRENT_RUN_H
@@ -68,847 +67,21 @@ namespace QtConcurrent {
namespace QtConcurrent {
-template <typename T>
-QFuture<T> run(T (*functionPointer)())
+template <class Function, class ...Args>
+[[nodiscard]]
+auto run(QThreadPool *pool, Function &&f, Args &&...args)
{
- return (new StoredFunctorCall0<T, T (*)()>(functionPointer))->start();
-}
-template <typename T, typename Param1, typename Arg1>
-QFuture<T> run(T (*functionPointer)(Param1), const Arg1 &arg1)
-{
- return (new StoredFunctorCall1<T, T (*)(Param1), Arg1>(functionPointer, arg1))->start();
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(T (*functionPointer)(Param1, Param2), const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new StoredFunctorCall2<T, T (*)(Param1, Param2), Arg1, Arg2>(functionPointer, arg1, arg2))->start();
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(T (*functionPointer)(Param1, Param2, Param3), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new StoredFunctorCall3<T, T (*)(Param1, Param2, Param3), Arg1, Arg2, Arg3>(functionPointer, arg1, arg2, arg3))->start();
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(T (*functionPointer)(Param1, Param2, Param3, Param4), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new StoredFunctorCall4<T, T (*)(Param1, Param2, Param3, Param4), Arg1, Arg2, Arg3, Arg4>(functionPointer, arg1, arg2, arg3, arg4))->start();
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(T (*functionPointer)(Param1, Param2, Param3, Param4, Param5), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new StoredFunctorCall5<T, T (*)(Param1, Param2, Param3, Param4, Param5), Arg1, Arg2, Arg3, Arg4, Arg5>(functionPointer, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-template <typename Functor>
-auto run(Functor functor) -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor())>>::type
-{
- typedef decltype(functor()) result_type;
- return (new StoredFunctorCall0<result_type, Functor>(functor))->start();
-}
-
-template <typename Functor, typename Arg1>
-auto run(Functor functor, const Arg1 &arg1)
- -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1))>>::type
-{
- typedef decltype(functor(arg1)) result_type;
- return (new StoredFunctorCall1<result_type, Functor, Arg1>(functor, arg1))->start();
-}
-
-template <typename Functor, typename Arg1, typename Arg2>
-auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2)
- -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2))>>::type
-{
- typedef decltype(functor(arg1, arg2)) result_type;
- return (new StoredFunctorCall2<result_type, Functor, Arg1, Arg2>(functor, arg1, arg2))->start();
-}
-
-template <typename Functor, typename Arg1, typename Arg2, typename Arg3>
-auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
- -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2, arg3))>>::type
-{
- typedef decltype(functor(arg1, arg2, arg3)) result_type;
- return (new StoredFunctorCall3<result_type, Functor, Arg1, Arg2, Arg3>(functor, arg1, arg2, arg3))->start();
-}
-
-template <typename Functor, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
- -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2, arg3, arg4))>>::type
-{
- typedef decltype(functor(arg1, arg2, arg3, arg4)) result_type;
- return (new StoredFunctorCall4<result_type, Functor, Arg1, Arg2, Arg3, Arg4>(functor, arg1, arg2, arg3, arg4))->start();
-}
-
-template <typename Functor, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
-auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
- -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2, arg3, arg4, arg5))>>::type
-{
- typedef decltype(functor(arg1, arg2, arg3, arg4, arg5)) result_type;
- return (new StoredFunctorCall5<result_type, Functor, Arg1, Arg2, Arg3, Arg4, Arg5>(functor, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-template <typename FunctionObject>
-QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject)
-{
- return (new StoredFunctorCall0<typename FunctionObject::result_type, FunctionObject>(functionObject))->start();
-}
-template <typename FunctionObject, typename Arg1>
-QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject, const Arg1 &arg1)
-{
- return (new StoredFunctorCall1<typename FunctionObject::result_type, FunctionObject, Arg1>(functionObject, arg1))->start();
-}
-template <typename FunctionObject, typename Arg1, typename Arg2>
-QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new StoredFunctorCall2<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2>(functionObject, arg1, arg2))->start();
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3>
-QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new StoredFunctorCall3<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3>(functionObject, arg1, arg2, arg3))->start();
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new StoredFunctorCall4<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4>(functionObject, arg1, arg2, arg3, arg4))->start();
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
-QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new StoredFunctorCall5<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4, Arg5>(functionObject, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-template <typename FunctionObject>
-QFuture<typename FunctionObject::result_type> run(FunctionObject *functionObject)
-{
- return (new typename SelectStoredFunctorPointerCall0<typename FunctionObject::result_type, FunctionObject>::type(functionObject))->start();
-}
-template <typename FunctionObject, typename Arg1>
-QFuture<typename FunctionObject::result_type> run(FunctionObject *functionObject, const Arg1 &arg1)
-{
- return (new typename SelectStoredFunctorPointerCall1<typename FunctionObject::result_type, FunctionObject, Arg1>::type(functionObject, arg1))->start();
-}
-template <typename FunctionObject, typename Arg1, typename Arg2>
-QFuture<typename FunctionObject::result_type> run(FunctionObject *functionObject, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredFunctorPointerCall2<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2>::type(functionObject, arg1, arg2))->start();
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3>
-QFuture<typename FunctionObject::result_type> run(FunctionObject *functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredFunctorPointerCall3<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3>::type(functionObject, arg1, arg2, arg3))->start();
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-QFuture<typename FunctionObject::result_type> run(FunctionObject *functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredFunctorPointerCall4<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4>::type(functionObject, arg1, arg2, arg3, arg4))->start();
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
-QFuture<typename FunctionObject::result_type> run(FunctionObject *functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredFunctorPointerCall5<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4, Arg5>::type(functionObject, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-template <typename T, typename Class>
-QFuture<T> run(const Class &object, T (Class::*fn)())
-{
- return (new typename SelectStoredMemberFunctionCall0<T, Class>::type(fn, object))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1), const Arg1 &arg1)
-{
- return (new typename SelectStoredMemberFunctionCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2), const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-template <typename T, typename Class>
-QFuture<T> run(const Class &object, T (Class::*fn)() const)
-{
- return (new typename SelectStoredConstMemberFunctionCall0<T, Class>::type(fn, object))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1) const, const Arg1 &arg1)
-{
- return (new typename SelectStoredConstMemberFunctionCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2) const, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredConstMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredConstMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredConstMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredConstMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-template <typename T, typename Class>
-QFuture<T> run(Class *object, T (Class::*fn)())
-{
- return (new typename SelectStoredMemberFunctionPointerCall0<T, Class>::type(fn, object))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(Class *object, T (Class::*fn)(Param1), const Arg1 &arg1)
-{
- return (new typename SelectStoredMemberFunctionPointerCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(Class *object, T (Class::*fn)(Param1, Param2), const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(Class *object, T (Class::*fn)(Param1, Param2, Param3), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-template <typename T, typename Class>
-QFuture<T> run(const Class *object, T (Class::*fn)() const)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall0<T, Class>::type(fn, object))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(const Class *object, T (Class::*fn)(Param1) const, const Arg1 &arg1)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(const Class *object, T (Class::*fn)(Param1, Param2) const, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(const Class *object, T (Class::*fn)(Param1, Param2, Param3) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(const Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(const Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-// ...and the same with a QThreadPool *pool argument...
-// generate from the above by c'n'p and s/run(/run(QThreadPool *pool, / and s/start()/start(pool)/
-
-template <typename T>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)())
-{
- return (new StoredFunctorCall0<T, T (*)()>(functionPointer))->start(pool);
-}
-template <typename T, typename Param1, typename Arg1>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)(Param1), const Arg1 &arg1)
-{
- return (new StoredFunctorCall1<T, T (*)(Param1), Arg1>(functionPointer, arg1))->start(pool);
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)(Param1, Param2), const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new StoredFunctorCall2<T, T (*)(Param1, Param2), Arg1, Arg2>(functionPointer, arg1, arg2))->start(pool);
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)(Param1, Param2, Param3), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new StoredFunctorCall3<T, T (*)(Param1, Param2, Param3), Arg1, Arg2, Arg3>(functionPointer, arg1, arg2, arg3))->start(pool);
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)(Param1, Param2, Param3, Param4), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new StoredFunctorCall4<T, T (*)(Param1, Param2, Param3, Param4), Arg1, Arg2, Arg3, Arg4>(functionPointer, arg1, arg2, arg3, arg4))->start(pool);
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)(Param1, Param2, Param3, Param4, Param5), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new StoredFunctorCall5<T, T (*)(Param1, Param2, Param3, Param4, Param5), Arg1, Arg2, Arg3, Arg4, Arg5>(functionPointer, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-template <typename Functor>
-auto run(QThreadPool *pool, Functor functor) -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor())>>::type
-{
- typedef decltype(functor()) result_type;
- return (new StoredFunctorCall0<result_type, Functor>(functor))->start(pool);
-}
-
-template <typename Functor, typename Arg1>
-auto run(QThreadPool *pool, Functor functor, const Arg1 &arg1)
- -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1))>>::type
-{
- typedef decltype(functor(arg1)) result_type;
- return (new StoredFunctorCall1<result_type, Functor, Arg1>(functor, arg1))->start(pool);
-}
-
-template <typename Functor, typename Arg1, typename Arg2>
-auto run(QThreadPool *pool, Functor functor, const Arg1 &arg1, const Arg2 &arg2)
- -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2))>>::type
-{
- typedef decltype(functor(arg1, arg2)) result_type;
- return (new StoredFunctorCall2<result_type, Functor, Arg1, Arg2>(functor, arg1, arg2))->start(pool);
+ return (new StoredFunctionCall<Function, Args...>(
+ std::forward<Function>(f), std::forward<Args>(args)...))
+ ->start(pool);
}
-template <typename Functor, typename Arg1, typename Arg2, typename Arg3>
-auto run(QThreadPool *pool, Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
- -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2, arg3))>>::type
-{
- typedef decltype(functor(arg1, arg2, arg3)) result_type;
- return (new StoredFunctorCall3<result_type, Functor, Arg1, Arg2, Arg3>(functor, arg1, arg2, arg3))->start(pool);
-}
-
-template <typename Functor, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-auto run(QThreadPool *pool, Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
- -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2, arg3, arg4))>>::type
-{
- typedef decltype(functor(arg1, arg2, arg3, arg4)) result_type;
- return (new StoredFunctorCall4<result_type, Functor, Arg1, Arg2, Arg3, Arg4>(functor, arg1, arg2, arg3, arg4))->start(pool);
-}
-
-template <typename Functor, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
-auto run(QThreadPool *pool, Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
- -> typename std::enable_if<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2, arg3, arg4, arg5))>>::type
-{
- typedef decltype(functor(arg1, arg2, arg3, arg4, arg5)) result_type;
- return (new StoredFunctorCall5<result_type, Functor, Arg1, Arg2, Arg3, Arg4, Arg5>(functor, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-template <typename FunctionObject>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject functionObject)
-{
- return (new StoredFunctorCall0<typename FunctionObject::result_type, FunctionObject>(functionObject))->start(pool);
-}
-template <typename FunctionObject, typename Arg1>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject functionObject, const Arg1 &arg1)
-{
- return (new StoredFunctorCall1<typename FunctionObject::result_type, FunctionObject, Arg1>(functionObject, arg1))->start(pool);
-}
-template <typename FunctionObject, typename Arg1, typename Arg2>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new StoredFunctorCall2<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2>(functionObject, arg1, arg2))->start(pool);
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new StoredFunctorCall3<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3>(functionObject, arg1, arg2, arg3))->start(pool);
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new StoredFunctorCall4<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4>(functionObject, arg1, arg2, arg3, arg4))->start(pool);
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new StoredFunctorCall5<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4, Arg5>(functionObject, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-template <typename FunctionObject>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject *functionObject)
-{
- return (new typename SelectStoredFunctorPointerCall0<typename FunctionObject::result_type, FunctionObject>::type(functionObject))->start(pool);
-}
-template <typename FunctionObject, typename Arg1>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject *functionObject, const Arg1 &arg1)
-{
- return (new typename SelectStoredFunctorPointerCall1<typename FunctionObject::result_type, FunctionObject, Arg1>::type(functionObject, arg1))->start(pool);
-}
-template <typename FunctionObject, typename Arg1, typename Arg2>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject *functionObject, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredFunctorPointerCall2<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2>::type(functionObject, arg1, arg2))->start(pool);
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject *functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredFunctorPointerCall3<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3>::type(functionObject, arg1, arg2, arg3))->start(pool);
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject *functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredFunctorPointerCall4<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4>::type(functionObject, arg1, arg2, arg3, arg4))->start(pool);
-}
-template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
-QFuture<typename FunctionObject::result_type> run(QThreadPool *pool, FunctionObject *functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredFunctorPointerCall5<typename FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4, Arg5>::type(functionObject, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-template <typename T, typename Class>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)())
-{
- return (new typename SelectStoredMemberFunctionCall0<T, Class>::type(fn, object))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1), const Arg1 &arg1)
-{
- return (new typename SelectStoredMemberFunctionCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2), const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
+template <class Function, class ...Args>
+[[nodiscard]]
+auto run(Function &&f, Args &&...args)
{
- return (new typename SelectStoredMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start(pool);
+ return run(QThreadPool::globalInstance(), std::forward<Function>(f), std::forward<Args>(args)...);
}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-template <typename T, typename Class>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)() const)
-{
- return (new typename SelectStoredConstMemberFunctionCall0<T, Class>::type(fn, object))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1) const, const Arg1 &arg1)
-{
- return (new typename SelectStoredConstMemberFunctionCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2) const, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredConstMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredConstMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredConstMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredConstMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-template <typename T, typename Class>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)())
-{
- return (new typename SelectStoredMemberFunctionPointerCall0<T, Class>::type(fn, object))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)(Param1), const Arg1 &arg1)
-{
- return (new typename SelectStoredMemberFunctionPointerCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)(Param1, Param2), const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)(Param1, Param2, Param3), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-template <typename T, typename Class>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)() const)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall0<T, Class>::type(fn, object))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)(Param1) const, const Arg1 &arg1)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)(Param1, Param2) const, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)(Param1, Param2, Param3) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredConstMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
-template <typename T>
-QFuture<T> run(T (*functionPointer)() noexcept)
-{
- return (new StoredFunctorCall0<T, T (*)() noexcept>(functionPointer))->start();
-}
-template <typename T, typename Param1, typename Arg1>
-QFuture<T> run(T (*functionPointer)(Param1) noexcept, const Arg1 &arg1)
-{
- return (new StoredFunctorCall1<T, T (*)(Param1) noexcept, Arg1>(functionPointer, arg1))->start();
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(T (*functionPointer)(Param1, Param2) noexcept, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new StoredFunctorCall2<T, T (*)(Param1, Param2) noexcept, Arg1, Arg2>(functionPointer, arg1, arg2))->start();
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(T (*functionPointer)(Param1, Param2, Param3) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new StoredFunctorCall3<T, T (*)(Param1, Param2, Param3) noexcept, Arg1, Arg2, Arg3>(functionPointer, arg1, arg2, arg3))->start();
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(T (*functionPointer)(Param1, Param2, Param3, Param4) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new StoredFunctorCall4<T, T (*)(Param1, Param2, Param3, Param4) noexcept, Arg1, Arg2, Arg3, Arg4>(functionPointer, arg1, arg2, arg3, arg4))->start();
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(T (*functionPointer)(Param1, Param2, Param3, Param4, Param5) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new StoredFunctorCall5<T, T (*)(Param1, Param2, Param3, Param4, Param5) noexcept, Arg1, Arg2, Arg3, Arg4, Arg5>(functionPointer, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-template <typename T, typename Class>
-QFuture<T> run(const Class &object, T (Class::*fn)() noexcept)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall0<T, Class>::type(fn, object))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1) noexcept, const Arg1 &arg1)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2) noexcept, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-template <typename T, typename Class>
-QFuture<T> run(const Class &object, T (Class::*fn)() const noexcept)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall0<T, Class>::type(fn, object))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1) const noexcept, const Arg1 &arg1)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2) const noexcept, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-template <typename T, typename Class>
-QFuture<T> run(Class *object, T (Class::*fn)() noexcept)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall0<T, Class>::type(fn, object))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(Class *object, T (Class::*fn)(Param1) noexcept, const Arg1 &arg1)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(Class *object, T (Class::*fn)(Param1, Param2) noexcept, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(Class *object, T (Class::*fn)(Param1, Param2, Param3) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start();
-}
-
-template <typename T, typename Class>
-QFuture<T> run(const Class *object, T (Class::*fn)() const noexcept)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall0<T, Class>::type(fn, object))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(const Class *object, T (Class::*fn)(Param1) const noexcept, const Arg1 &arg1)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(const Class *object, T (Class::*fn)(Param1, Param2) const noexcept, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(const Class *object, T (Class::*fn)(Param1, Param2, Param3) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(const Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start();
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(const Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start();
-}
-template <typename T>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)() noexcept)
-{
- return (new StoredFunctorCall0<T, T (*)() noexcept>(functionPointer))->start(pool);
-}
-template <typename T, typename Param1, typename Arg1>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)(Param1) noexcept, const Arg1 &arg1)
-{
- return (new StoredFunctorCall1<T, T (*)(Param1) noexcept, Arg1>(functionPointer, arg1))->start(pool);
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)(Param1, Param2) noexcept, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new StoredFunctorCall2<T, T (*)(Param1, Param2) noexcept, Arg1, Arg2>(functionPointer, arg1, arg2))->start(pool);
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)(Param1, Param2, Param3) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new StoredFunctorCall3<T, T (*)(Param1, Param2, Param3) noexcept, Arg1, Arg2, Arg3>(functionPointer, arg1, arg2, arg3))->start(pool);
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)(Param1, Param2, Param3, Param4) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new StoredFunctorCall4<T, T (*)(Param1, Param2, Param3, Param4) noexcept, Arg1, Arg2, Arg3, Arg4>(functionPointer, arg1, arg2, arg3, arg4))->start(pool);
-}
-template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(QThreadPool *pool, T (*functionPointer)(Param1, Param2, Param3, Param4, Param5) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new StoredFunctorCall5<T, T (*)(Param1, Param2, Param3, Param4, Param5) noexcept, Arg1, Arg2, Arg3, Arg4, Arg5>(functionPointer, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-template <typename T, typename Class>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)() noexcept)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall0<T, Class>::type(fn, object))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1) noexcept, const Arg1 &arg1)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2) noexcept, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredNoExceptMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-template <typename T, typename Class>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)() const noexcept)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall0<T, Class>::type(fn, object))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1) const noexcept, const Arg1 &arg1)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2) const noexcept, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(QThreadPool *pool, const Class &object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-template <typename T, typename Class>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)() noexcept)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall0<T, Class>::type(fn, object))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)(Param1) noexcept, const Arg1 &arg1)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)(Param1, Param2) noexcept, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)(Param1, Param2, Param3) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(QThreadPool *pool, Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredNoExceptMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-
-template <typename T, typename Class>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)() const noexcept)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall0<T, Class>::type(fn, object))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)(Param1) const noexcept, const Arg1 &arg1)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall1<T, Class, Param1, Arg1>::type(fn, object, arg1))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)(Param1, Param2) const noexcept, const Arg1 &arg1, const Arg2 &arg2)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2>::type(fn, object, arg1, arg2))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)(Param1, Param2, Param3) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>::type(fn, object, arg1, arg2, arg3))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>::type(fn, object, arg1, arg2, arg3, arg4))->start(pool);
-}
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-QFuture<T> run(QThreadPool *pool, const Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const noexcept, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
-{
- return (new typename SelectStoredConstNoExceptMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>::type(fn, object, arg1, arg2, arg3, arg4, arg5))->start(pool);
-}
-#endif
} //namespace QtConcurrent
diff --git a/src/concurrent/qtconcurrentrunbase.h b/src/concurrent/qtconcurrentrunbase.h
index aaa1245856..5e9fa0aa00 100644
--- a/src/concurrent/qtconcurrentrunbase.h
+++ b/src/concurrent/qtconcurrentrunbase.h
@@ -48,6 +48,9 @@
#include <QtCore/qrunnable.h>
#include <QtCore/qthreadpool.h>
+#include <type_traits>
+#include <utility>
+
QT_BEGIN_NAMESPACE
@@ -69,25 +72,34 @@ struct SelectSpecialization<void>
struct Type { typedef Void type; };
};
+struct TaskStartParameters
+{
+ QThreadPool *threadPool = QThreadPool::globalInstance();
+ int priority = 0;
+};
+
template <typename T>
class RunFunctionTaskBase : public QFutureInterface<T> , public QRunnable
{
public:
QFuture<T> start()
{
- return start(QThreadPool::globalInstance());
+ return start(TaskStartParameters());
}
- QFuture<T> start(QThreadPool *pool)
+ QFuture<T> start(const TaskStartParameters &parameters)
{
- this->setThreadPool(pool);
+ this->setThreadPool(parameters.threadPool);
this->setRunnable(this);
this->reportStarted();
QFuture<T> theFuture = this->future();
- pool->start(this, /*m_priority*/ 0);
+ parameters.threadPool->start(this, parameters.priority);
return theFuture;
}
+ // For backward compatibility
+ QFuture<T> start(QThreadPool *pool) { return start({pool, 0}); }
+
void run() override {}
virtual void runFunctor() = 0;
};
@@ -114,7 +126,11 @@ public:
}
#endif
- this->reportResult(result);
+ if constexpr (std::is_move_constructible_v<T>)
+ this->reportAndMoveResult(std::move(result));
+ else if constexpr (std::is_copy_constructible_v<T>)
+ this->reportResult(result);
+
this->reportFinished();
}
T result;
diff --git a/src/concurrent/qtconcurrentstoredfunctioncall.h b/src/concurrent/qtconcurrentstoredfunctioncall.h
index 209832e5bb..b879e8af45 100644
--- a/src/concurrent/qtconcurrentstoredfunctioncall.h
+++ b/src/concurrent/qtconcurrentstoredfunctioncall.h
@@ -37,7 +37,6 @@
**
****************************************************************************/
-// Generated code, do not edit! Use generator at tools/qtconcurrent/generaterun/
#ifndef QTCONCURRENT_STOREDFUNCTIONCALL_H
#define QTCONCURRENT_STOREDFUNCTIONCALL_H
@@ -45,2210 +44,53 @@
#ifndef QT_NO_CONCURRENT
#include <QtConcurrent/qtconcurrentrunbase.h>
+#include <type_traits>
QT_BEGIN_NAMESPACE
-
#ifndef Q_QDOC
namespace QtConcurrent {
-template <typename T, typename FunctionPointer>
-struct StoredFunctorCall0: public RunFunctionTask<T>
-{
- inline StoredFunctorCall0(FunctionPointer _function)
- : function(_function) {}
- void runFunctor() override { this->result = function(); }
- FunctionPointer function;
-
-};
-
-template <typename FunctionPointer>
-struct StoredFunctorCall0<void, FunctionPointer>: public RunFunctionTask<void>
-{
- inline StoredFunctorCall0(FunctionPointer _function)
- : function(_function) {}
- void runFunctor() override { function(); }
- FunctionPointer function;
-
-};
-
-template <typename T, typename FunctionPointer>
-struct StoredFunctorPointerCall0: public RunFunctionTask<T>
-{
- inline StoredFunctorPointerCall0(FunctionPointer * _function)
- : function(_function) {}
- void runFunctor() override { this->result =(*function)(); }
- FunctionPointer * function;
-
-};
-
-template <typename T, typename FunctionPointer>
-struct VoidStoredFunctorPointerCall0: public RunFunctionTask<T>
-{
- inline VoidStoredFunctorPointerCall0(FunctionPointer * _function)
- : function(_function) {}
- void runFunctor() override { (*function)(); }
- FunctionPointer * function;
-
-};
-
-template <typename T, typename FunctionPointer>
-struct SelectStoredFunctorPointerCall0
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredFunctorPointerCall0 <T, FunctionPointer>,
- VoidStoredFunctorPointerCall0<T, FunctionPointer> >::type type;
-};
-template <typename T, typename Class>
-class StoredMemberFunctionCall0 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionCall0(T (Class::*_fn)(), const Class &_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)();
- }
-private:
- T (Class::*fn)();
- Class object;
-
-};
-template <typename T, typename Class>
-class VoidStoredMemberFunctionCall0 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionCall0(T (Class::*_fn)(), const Class &_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- (object.*fn)();
- }
-private:
- T (Class::*fn)();
- Class object;
-
-};
-template <typename T, typename Class>
-struct SelectStoredMemberFunctionCall0
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionCall0 <T, Class>,
- VoidStoredMemberFunctionCall0<T, Class> >::type type;
-};
-template <typename T, typename Class>
-class StoredConstMemberFunctionCall0 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionCall0(T (Class::*_fn)() const, const Class &_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)();
- }
-private:
- T (Class::*fn)() const;
- const Class object;
-
-};
-template <typename T, typename Class>
-class VoidStoredConstMemberFunctionCall0 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionCall0(T (Class::*_fn)() const, const Class &_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- (object.*fn)();
- }
-private:
- T (Class::*fn)() const;
- const Class object;
-
-};
-template <typename T, typename Class>
-struct SelectStoredConstMemberFunctionCall0
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionCall0 <T, Class>,
- VoidStoredConstMemberFunctionCall0<T, Class> >::type type;
-};
-template <typename T, typename Class>
-class StoredMemberFunctionPointerCall0 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionPointerCall0(T (Class::*_fn)(), Class *_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)();
- }
-private:
- T (Class::*fn)();
- Class *object;
-
-};
-template <typename T, typename Class>
-class VoidStoredMemberFunctionPointerCall0 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionPointerCall0(T (Class::*_fn)(), Class *_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- (object->*fn)();
- }
-private:
- T (Class::*fn)();
- Class *object;
-
-};
-template <typename T, typename Class>
-struct SelectStoredMemberFunctionPointerCall0
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionPointerCall0 <T, Class>,
- VoidStoredMemberFunctionPointerCall0<T, Class> >::type type;
-};
-template <typename T, typename Class>
-class StoredConstMemberFunctionPointerCall0 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionPointerCall0(T (Class::*_fn)() const, Class const *_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)();
- }
-private:
- T (Class::*fn)() const;
- Class const *object;
-
-};
-template <typename T, typename Class>
-class VoidStoredConstMemberFunctionPointerCall0 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionPointerCall0(T (Class::*_fn)() const, Class const *_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- (object->*fn)();
- }
-private:
- T (Class::*fn)() const;
- Class const *object;
-
-};
-template <typename T, typename Class>
-struct SelectStoredConstMemberFunctionPointerCall0
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionPointerCall0 <T, Class>,
- VoidStoredConstMemberFunctionPointerCall0<T, Class> >::type type;
-};
-#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
-template <typename T, typename Class>
-class StoredNoExceptMemberFunctionCall0 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionCall0(T (Class::*_fn)() noexcept, const Class &_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)();
- }
-private:
- T (Class::*fn)() noexcept;
- Class object;
-
-};
-template <typename T, typename Class>
-class VoidStoredNoExceptMemberFunctionCall0 : public RunFunctionTask<T>
-{
-public:
- VoidStoredNoExceptMemberFunctionCall0(T (Class::*_fn)() noexcept, const Class &_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- (object.*fn)();
- }
-private:
- T (Class::*fn)() noexcept;
- Class object;
-
-};
-template <typename T, typename Class>
-struct SelectStoredNoExceptMemberFunctionCall0
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionCall0 <T, Class>,
- VoidStoredNoExceptMemberFunctionCall0<T, Class> >::type type;
-};
-template <typename T, typename Class>
-class StoredConstNoExceptMemberFunctionCall0 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionCall0(T (Class::*_fn)() const noexcept, const Class &_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)();
- }
-private:
- T (Class::*fn)() const noexcept;
- const Class object;
-
-};
-template <typename T, typename Class>
-class VoidStoredConstNoExceptMemberFunctionCall0 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionCall0(T (Class::*_fn)() const noexcept, const Class &_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- (object.*fn)();
- }
-private:
- T (Class::*fn)() const noexcept;
- const Class object;
-
-};
-template <typename T, typename Class>
-struct SelectStoredConstNoExceptMemberFunctionCall0
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionCall0 <T, Class>,
- VoidStoredConstNoExceptMemberFunctionCall0<T, Class> >::type type;
-};
-template <typename T, typename Class>
-class StoredNoExceptMemberFunctionPointerCall0 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionPointerCall0(T (Class::*_fn)() noexcept, Class *_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)();
- }
-private:
- T (Class::*fn)() noexcept;
- Class *object;
-
-};
-template <typename T, typename Class>
-class VoidStoredNoExceptMemberFunctionPointerCall0 : public RunFunctionTask<T>
-{
-public:
- VoidStoredNoExceptMemberFunctionPointerCall0(T (Class::*_fn)() noexcept, Class *_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- (object->*fn)();
- }
-private:
- T (Class::*fn)() noexcept;
- Class *object;
-
-};
-template <typename T, typename Class>
-struct SelectStoredNoExceptMemberFunctionPointerCall0
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionPointerCall0 <T, Class>,
- VoidStoredNoExceptMemberFunctionPointerCall0<T, Class> >::type type;
-};
-template <typename T, typename Class>
-class StoredConstNoExceptMemberFunctionPointerCall0 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionPointerCall0(T (Class::*_fn)() const noexcept, Class const *_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)();
- }
-private:
- T (Class::*fn)() const noexcept;
- Class const *object;
-
-};
-template <typename T, typename Class>
-class VoidStoredConstNoExceptMemberFunctionPointerCall0 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionPointerCall0(T (Class::*_fn)() const noexcept, Class const *_object)
- : fn(_fn), object(_object){ }
-
- void runFunctor() override
- {
- (object->*fn)();
- }
-private:
- T (Class::*fn)() const noexcept;
- Class const *object;
-
-};
-template <typename T, typename Class>
-struct SelectStoredConstNoExceptMemberFunctionPointerCall0
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionPointerCall0 <T, Class>,
- VoidStoredConstNoExceptMemberFunctionPointerCall0<T, Class> >::type type;
-};
-#endif
-
-template <typename T, typename FunctionPointer, typename Arg1>
-struct StoredFunctorCall1: public RunFunctionTask<T>
-{
- inline StoredFunctorCall1(FunctionPointer _function, const Arg1 &_arg1)
- : function(_function), arg1(_arg1) {}
- void runFunctor() override { this->result = function(arg1); }
- FunctionPointer function;
- Arg1 arg1;
-};
-
-template <typename FunctionPointer, typename Arg1>
-struct StoredFunctorCall1<void, FunctionPointer, Arg1>: public RunFunctionTask<void>
-{
- inline StoredFunctorCall1(FunctionPointer _function, const Arg1 &_arg1)
- : function(_function), arg1(_arg1) {}
- void runFunctor() override { function(arg1); }
- FunctionPointer function;
- Arg1 arg1;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1>
-struct StoredFunctorPointerCall1: public RunFunctionTask<T>
-{
- inline StoredFunctorPointerCall1(FunctionPointer * _function, const Arg1 &_arg1)
- : function(_function), arg1(_arg1) {}
- void runFunctor() override { this->result =(*function)(arg1); }
- FunctionPointer * function;
- Arg1 arg1;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1>
-struct VoidStoredFunctorPointerCall1: public RunFunctionTask<T>
-{
- inline VoidStoredFunctorPointerCall1(FunctionPointer * _function, const Arg1 &_arg1)
- : function(_function), arg1(_arg1) {}
- void runFunctor() override { (*function)(arg1); }
- FunctionPointer * function;
- Arg1 arg1;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1>
-struct SelectStoredFunctorPointerCall1
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredFunctorPointerCall1 <T, FunctionPointer, Arg1>,
- VoidStoredFunctorPointerCall1<T, FunctionPointer, Arg1> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class StoredMemberFunctionCall1 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionCall1(T (Class::*_fn)(Param1), const Class &_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1);
- Class object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class VoidStoredMemberFunctionCall1 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionCall1(T (Class::*_fn)(Param1), const Class &_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1);
- Class object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-struct SelectStoredMemberFunctionCall1
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionCall1 <T, Class, Param1, Arg1>,
- VoidStoredMemberFunctionCall1<T, Class, Param1, Arg1> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class StoredConstMemberFunctionCall1 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionCall1(T (Class::*_fn)(Param1) const, const Class &_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) const;
- const Class object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class VoidStoredConstMemberFunctionCall1 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionCall1(T (Class::*_fn)(Param1) const, const Class &_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) const;
- const Class object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-struct SelectStoredConstMemberFunctionCall1
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionCall1 <T, Class, Param1, Arg1>,
- VoidStoredConstMemberFunctionCall1<T, Class, Param1, Arg1> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class StoredMemberFunctionPointerCall1 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionPointerCall1(T (Class::*_fn)(Param1), Class *_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1);
- Class *object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class VoidStoredMemberFunctionPointerCall1 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionPointerCall1(T (Class::*_fn)(Param1), Class *_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1);
- Class *object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-struct SelectStoredMemberFunctionPointerCall1
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionPointerCall1 <T, Class, Param1, Arg1>,
- VoidStoredMemberFunctionPointerCall1<T, Class, Param1, Arg1> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class StoredConstMemberFunctionPointerCall1 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionPointerCall1(T (Class::*_fn)(Param1) const, Class const *_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) const;
- Class const *object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class VoidStoredConstMemberFunctionPointerCall1 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionPointerCall1(T (Class::*_fn)(Param1) const, Class const *_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) const;
- Class const *object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-struct SelectStoredConstMemberFunctionPointerCall1
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionPointerCall1 <T, Class, Param1, Arg1>,
- VoidStoredConstMemberFunctionPointerCall1<T, Class, Param1, Arg1> >::type type;
-};
-#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
-template <typename T, typename Class, typename Param1, typename Arg1>
-class StoredNoExceptMemberFunctionCall1 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionCall1(T (Class::*_fn)(Param1) noexcept, const Class &_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) noexcept;
- Class object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class VoidStoredNoExceptMemberFunctionCall1 : public RunFunctionTask<T>
-{
-public:
- VoidStoredNoExceptMemberFunctionCall1(T (Class::*_fn)(Param1) noexcept, const Class &_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) noexcept;
- Class object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-struct SelectStoredNoExceptMemberFunctionCall1
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionCall1 <T, Class, Param1, Arg1>,
- VoidStoredNoExceptMemberFunctionCall1<T, Class, Param1, Arg1> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class StoredConstNoExceptMemberFunctionCall1 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionCall1(T (Class::*_fn)(Param1) const noexcept, const Class &_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) const noexcept;
- const Class object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class VoidStoredConstNoExceptMemberFunctionCall1 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionCall1(T (Class::*_fn)(Param1) const noexcept, const Class &_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) const noexcept;
- const Class object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-struct SelectStoredConstNoExceptMemberFunctionCall1
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionCall1 <T, Class, Param1, Arg1>,
- VoidStoredConstNoExceptMemberFunctionCall1<T, Class, Param1, Arg1> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class StoredNoExceptMemberFunctionPointerCall1 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionPointerCall1(T (Class::*_fn)(Param1) noexcept, Class *_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) noexcept;
- Class *object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class VoidStoredNoExceptMemberFunctionPointerCall1 : public RunFunctionTask<T>
-{
-public:
- VoidStoredNoExceptMemberFunctionPointerCall1(T (Class::*_fn)(Param1) noexcept, Class *_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) noexcept;
- Class *object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-struct SelectStoredNoExceptMemberFunctionPointerCall1
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionPointerCall1 <T, Class, Param1, Arg1>,
- VoidStoredNoExceptMemberFunctionPointerCall1<T, Class, Param1, Arg1> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class StoredConstNoExceptMemberFunctionPointerCall1 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionPointerCall1(T (Class::*_fn)(Param1) const noexcept, Class const *_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) const noexcept;
- Class const *object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-class VoidStoredConstNoExceptMemberFunctionPointerCall1 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionPointerCall1(T (Class::*_fn)(Param1) const noexcept, Class const *_object, const Arg1 &_arg1)
- : fn(_fn), object(_object), arg1(_arg1){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1);
- }
-private:
- T (Class::*fn)(Param1) const noexcept;
- Class const *object;
- Arg1 arg1;
-};
-template <typename T, typename Class, typename Param1, typename Arg1>
-struct SelectStoredConstNoExceptMemberFunctionPointerCall1
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionPointerCall1 <T, Class, Param1, Arg1>,
- VoidStoredConstNoExceptMemberFunctionPointerCall1<T, Class, Param1, Arg1> >::type type;
-};
-#endif
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2>
-struct StoredFunctorCall2: public RunFunctionTask<T>
-{
- inline StoredFunctorCall2(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2)
- : function(_function), arg1(_arg1), arg2(_arg2) {}
- void runFunctor() override { this->result = function(arg1, arg2); }
- FunctionPointer function;
- Arg1 arg1; Arg2 arg2;
-};
-
-template <typename FunctionPointer, typename Arg1, typename Arg2>
-struct StoredFunctorCall2<void, FunctionPointer, Arg1, Arg2>: public RunFunctionTask<void>
-{
- inline StoredFunctorCall2(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2)
- : function(_function), arg1(_arg1), arg2(_arg2) {}
- void runFunctor() override { function(arg1, arg2); }
- FunctionPointer function;
- Arg1 arg1; Arg2 arg2;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2>
-struct StoredFunctorPointerCall2: public RunFunctionTask<T>
-{
- inline StoredFunctorPointerCall2(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2)
- : function(_function), arg1(_arg1), arg2(_arg2) {}
- void runFunctor() override { this->result =(*function)(arg1, arg2); }
- FunctionPointer * function;
- Arg1 arg1; Arg2 arg2;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2>
-struct VoidStoredFunctorPointerCall2: public RunFunctionTask<T>
-{
- inline VoidStoredFunctorPointerCall2(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2)
- : function(_function), arg1(_arg1), arg2(_arg2) {}
- void runFunctor() override { (*function)(arg1, arg2); }
- FunctionPointer * function;
- Arg1 arg1; Arg2 arg2;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2>
-struct SelectStoredFunctorPointerCall2
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredFunctorPointerCall2 <T, FunctionPointer, Arg1, Arg2>,
- VoidStoredFunctorPointerCall2<T, FunctionPointer, Arg1, Arg2> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class StoredMemberFunctionCall2 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionCall2(T (Class::*_fn)(Param1, Param2), const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2);
- Class object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class VoidStoredMemberFunctionCall2 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionCall2(T (Class::*_fn)(Param1, Param2), const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2);
- Class object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-struct SelectStoredMemberFunctionCall2
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionCall2 <T, Class, Param1, Arg1, Param2, Arg2>,
- VoidStoredMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class StoredConstMemberFunctionCall2 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionCall2(T (Class::*_fn)(Param1, Param2) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) const;
- const Class object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class VoidStoredConstMemberFunctionCall2 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionCall2(T (Class::*_fn)(Param1, Param2) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) const;
- const Class object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-struct SelectStoredConstMemberFunctionCall2
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionCall2 <T, Class, Param1, Arg1, Param2, Arg2>,
- VoidStoredConstMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class StoredMemberFunctionPointerCall2 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2), Class *_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2);
- Class *object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class VoidStoredMemberFunctionPointerCall2 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2), Class *_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2);
- Class *object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-struct SelectStoredMemberFunctionPointerCall2
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionPointerCall2 <T, Class, Param1, Arg1, Param2, Arg2>,
- VoidStoredMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class StoredConstMemberFunctionPointerCall2 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) const;
- Class const *object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class VoidStoredConstMemberFunctionPointerCall2 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) const;
- Class const *object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-struct SelectStoredConstMemberFunctionPointerCall2
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionPointerCall2 <T, Class, Param1, Arg1, Param2, Arg2>,
- VoidStoredConstMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2> >::type type;
-};
-#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class StoredNoExceptMemberFunctionCall2 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionCall2(T (Class::*_fn)(Param1, Param2) noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) noexcept;
- Class object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class VoidStoredNoExceptMemberFunctionCall2 : public RunFunctionTask<T>
-{
-public:
- VoidStoredNoExceptMemberFunctionCall2(T (Class::*_fn)(Param1, Param2) noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) noexcept;
- Class object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-struct SelectStoredNoExceptMemberFunctionCall2
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionCall2 <T, Class, Param1, Arg1, Param2, Arg2>,
- VoidStoredNoExceptMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class StoredConstNoExceptMemberFunctionCall2 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionCall2(T (Class::*_fn)(Param1, Param2) const noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) const noexcept;
- const Class object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class VoidStoredConstNoExceptMemberFunctionCall2 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionCall2(T (Class::*_fn)(Param1, Param2) const noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) const noexcept;
- const Class object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-struct SelectStoredConstNoExceptMemberFunctionCall2
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionCall2 <T, Class, Param1, Arg1, Param2, Arg2>,
- VoidStoredConstNoExceptMemberFunctionCall2<T, Class, Param1, Arg1, Param2, Arg2> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class StoredNoExceptMemberFunctionPointerCall2 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2) noexcept, Class *_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) noexcept;
- Class *object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class VoidStoredNoExceptMemberFunctionPointerCall2 : public RunFunctionTask<T>
-{
-public:
- VoidStoredNoExceptMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2) noexcept, Class *_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) noexcept;
- Class *object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-struct SelectStoredNoExceptMemberFunctionPointerCall2
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionPointerCall2 <T, Class, Param1, Arg1, Param2, Arg2>,
- VoidStoredNoExceptMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class StoredConstNoExceptMemberFunctionPointerCall2 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2) const noexcept, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) const noexcept;
- Class const *object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-class VoidStoredConstNoExceptMemberFunctionPointerCall2 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionPointerCall2(T (Class::*_fn)(Param1, Param2) const noexcept, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2);
- }
-private:
- T (Class::*fn)(Param1, Param2) const noexcept;
- Class const *object;
- Arg1 arg1; Arg2 arg2;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
-struct SelectStoredConstNoExceptMemberFunctionPointerCall2
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionPointerCall2 <T, Class, Param1, Arg1, Param2, Arg2>,
- VoidStoredConstNoExceptMemberFunctionPointerCall2<T, Class, Param1, Arg1, Param2, Arg2> >::type type;
-};
-#endif
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3>
-struct StoredFunctorCall3: public RunFunctionTask<T>
-{
- inline StoredFunctorCall3(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3) {}
- void runFunctor() override { this->result = function(arg1, arg2, arg3); }
- FunctionPointer function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-
-template <typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3>
-struct StoredFunctorCall3<void, FunctionPointer, Arg1, Arg2, Arg3>: public RunFunctionTask<void>
-{
- inline StoredFunctorCall3(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3) {}
- void runFunctor() override { function(arg1, arg2, arg3); }
- FunctionPointer function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3>
-struct StoredFunctorPointerCall3: public RunFunctionTask<T>
-{
- inline StoredFunctorPointerCall3(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3) {}
- void runFunctor() override { this->result =(*function)(arg1, arg2, arg3); }
- FunctionPointer * function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3>
-struct VoidStoredFunctorPointerCall3: public RunFunctionTask<T>
-{
- inline VoidStoredFunctorPointerCall3(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3) {}
- void runFunctor() override { (*function)(arg1, arg2, arg3); }
- FunctionPointer * function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3>
-struct SelectStoredFunctorPointerCall3
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredFunctorPointerCall3 <T, FunctionPointer, Arg1, Arg2, Arg3>,
- VoidStoredFunctorPointerCall3<T, FunctionPointer, Arg1, Arg2, Arg3> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class StoredMemberFunctionCall3 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3), const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3);
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class VoidStoredMemberFunctionCall3 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3), const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3);
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-struct SelectStoredMemberFunctionCall3
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionCall3 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>,
- VoidStoredMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class StoredConstMemberFunctionCall3 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) const;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class VoidStoredConstMemberFunctionCall3 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) const;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-struct SelectStoredConstMemberFunctionCall3
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionCall3 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>,
- VoidStoredConstMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class StoredMemberFunctionPointerCall3 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3), Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3);
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class VoidStoredMemberFunctionPointerCall3 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3), Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3);
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-struct SelectStoredMemberFunctionPointerCall3
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionPointerCall3 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>,
- VoidStoredMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class StoredConstMemberFunctionPointerCall3 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) const;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class VoidStoredConstMemberFunctionPointerCall3 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) const;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-struct SelectStoredConstMemberFunctionPointerCall3
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionPointerCall3 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>,
- VoidStoredConstMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3> >::type type;
-};
-#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class StoredNoExceptMemberFunctionCall3 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3) noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) noexcept;
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class VoidStoredNoExceptMemberFunctionCall3 : public RunFunctionTask<T>
-{
-public:
- VoidStoredNoExceptMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3) noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) noexcept;
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-struct SelectStoredNoExceptMemberFunctionCall3
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionCall3 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>,
- VoidStoredNoExceptMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class StoredConstNoExceptMemberFunctionCall3 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3) const noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) const noexcept;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class VoidStoredConstNoExceptMemberFunctionCall3 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionCall3(T (Class::*_fn)(Param1, Param2, Param3) const noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) const noexcept;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-struct SelectStoredConstNoExceptMemberFunctionCall3
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionCall3 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>,
- VoidStoredConstNoExceptMemberFunctionCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class StoredNoExceptMemberFunctionPointerCall3 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3) noexcept, Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) noexcept;
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class VoidStoredNoExceptMemberFunctionPointerCall3 : public RunFunctionTask<T>
-{
-public:
- VoidStoredNoExceptMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3) noexcept, Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) noexcept;
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-struct SelectStoredNoExceptMemberFunctionPointerCall3
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionPointerCall3 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>,
- VoidStoredNoExceptMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class StoredConstNoExceptMemberFunctionPointerCall3 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3) const noexcept, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) const noexcept;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-class VoidStoredConstNoExceptMemberFunctionPointerCall3 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionPointerCall3(T (Class::*_fn)(Param1, Param2, Param3) const noexcept, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3) const noexcept;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
-struct SelectStoredConstNoExceptMemberFunctionPointerCall3
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionPointerCall3 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3>,
- VoidStoredConstNoExceptMemberFunctionPointerCall3<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3> >::type type;
-};
-#endif
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-struct StoredFunctorCall4: public RunFunctionTask<T>
-{
- inline StoredFunctorCall4(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4) {}
- void runFunctor() override { this->result = function(arg1, arg2, arg3, arg4); }
- FunctionPointer function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-
-template <typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-struct StoredFunctorCall4<void, FunctionPointer, Arg1, Arg2, Arg3, Arg4>: public RunFunctionTask<void>
-{
- inline StoredFunctorCall4(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4) {}
- void runFunctor() override { function(arg1, arg2, arg3, arg4); }
- FunctionPointer function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-struct StoredFunctorPointerCall4: public RunFunctionTask<T>
-{
- inline StoredFunctorPointerCall4(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4) {}
- void runFunctor() override { this->result =(*function)(arg1, arg2, arg3, arg4); }
- FunctionPointer * function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-struct VoidStoredFunctorPointerCall4: public RunFunctionTask<T>
-{
- inline VoidStoredFunctorPointerCall4(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4) {}
- void runFunctor() override { (*function)(arg1, arg2, arg3, arg4); }
- FunctionPointer * function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-struct SelectStoredFunctorPointerCall4
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredFunctorPointerCall4 <T, FunctionPointer, Arg1, Arg2, Arg3, Arg4>,
- VoidStoredFunctorPointerCall4<T, FunctionPointer, Arg1, Arg2, Arg3, Arg4> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class StoredMemberFunctionCall4 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4), const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4);
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class VoidStoredMemberFunctionCall4 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4), const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4);
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-struct SelectStoredMemberFunctionCall4
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionCall4 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>,
- VoidStoredMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class StoredConstMemberFunctionCall4 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) const;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class VoidStoredConstMemberFunctionCall4 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) const;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-struct SelectStoredConstMemberFunctionCall4
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionCall4 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>,
- VoidStoredConstMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class StoredMemberFunctionPointerCall4 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4), Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4);
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class VoidStoredMemberFunctionPointerCall4 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4), Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4);
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-struct SelectStoredMemberFunctionPointerCall4
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionPointerCall4 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>,
- VoidStoredMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class StoredConstMemberFunctionPointerCall4 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) const;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class VoidStoredConstMemberFunctionPointerCall4 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) const;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-struct SelectStoredConstMemberFunctionPointerCall4
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionPointerCall4 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>,
- VoidStoredConstMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4> >::type type;
-};
-#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class StoredNoExceptMemberFunctionCall4 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) noexcept;
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class VoidStoredNoExceptMemberFunctionCall4 : public RunFunctionTask<T>
-{
-public:
- VoidStoredNoExceptMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) noexcept;
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-struct SelectStoredNoExceptMemberFunctionCall4
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionCall4 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>,
- VoidStoredNoExceptMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class StoredConstNoExceptMemberFunctionCall4 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) const noexcept;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class VoidStoredConstNoExceptMemberFunctionCall4 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) const noexcept;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-struct SelectStoredConstNoExceptMemberFunctionCall4
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionCall4 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>,
- VoidStoredConstNoExceptMemberFunctionCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class StoredNoExceptMemberFunctionPointerCall4 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) noexcept, Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) noexcept;
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class VoidStoredNoExceptMemberFunctionPointerCall4 : public RunFunctionTask<T>
-{
-public:
- VoidStoredNoExceptMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) noexcept, Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) noexcept;
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-struct SelectStoredNoExceptMemberFunctionPointerCall4
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionPointerCall4 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>,
- VoidStoredNoExceptMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class StoredConstNoExceptMemberFunctionPointerCall4 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const noexcept, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) const noexcept;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-class VoidStoredConstNoExceptMemberFunctionPointerCall4 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionPointerCall4(T (Class::*_fn)(Param1, Param2, Param3, Param4) const noexcept, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3, arg4);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4) const noexcept;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
-struct SelectStoredConstNoExceptMemberFunctionPointerCall4
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionPointerCall4 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4>,
- VoidStoredConstNoExceptMemberFunctionPointerCall4<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4> >::type type;
-};
-#endif
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
-struct StoredFunctorCall5: public RunFunctionTask<T>
-{
- inline StoredFunctorCall5(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5) {}
- void runFunctor() override { this->result = function(arg1, arg2, arg3, arg4, arg5); }
- FunctionPointer function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-
-template <typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
-struct StoredFunctorCall5<void, FunctionPointer, Arg1, Arg2, Arg3, Arg4, Arg5>: public RunFunctionTask<void>
-{
- inline StoredFunctorCall5(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5) {}
- void runFunctor() override { function(arg1, arg2, arg3, arg4, arg5); }
- FunctionPointer function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
-struct StoredFunctorPointerCall5: public RunFunctionTask<T>
-{
- inline StoredFunctorPointerCall5(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5) {}
- void runFunctor() override { this->result =(*function)(arg1, arg2, arg3, arg4, arg5); }
- FunctionPointer * function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
-struct VoidStoredFunctorPointerCall5: public RunFunctionTask<T>
-{
- inline VoidStoredFunctorPointerCall5(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5) {}
- void runFunctor() override { (*function)(arg1, arg2, arg3, arg4, arg5); }
- FunctionPointer * function;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-
-template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
-struct SelectStoredFunctorPointerCall5
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredFunctorPointerCall5 <T, FunctionPointer, Arg1, Arg2, Arg3, Arg4, Arg5>,
- VoidStoredFunctorPointerCall5<T, FunctionPointer, Arg1, Arg2, Arg3, Arg4, Arg5> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class StoredMemberFunctionCall5 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5), const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5);
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class VoidStoredMemberFunctionCall5 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5), const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5);
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-struct SelectStoredMemberFunctionCall5
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionCall5 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>,
- VoidStoredMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class StoredConstMemberFunctionCall5 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class VoidStoredConstMemberFunctionCall5 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
-
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-struct SelectStoredConstMemberFunctionCall5
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionCall5 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>,
- VoidStoredConstMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class StoredMemberFunctionPointerCall5 : public RunFunctionTask<T>
-{
-public:
- StoredMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5), Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5);
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class VoidStoredMemberFunctionPointerCall5 : public RunFunctionTask<T>
-{
-public:
- VoidStoredMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5), Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5);
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-struct SelectStoredMemberFunctionPointerCall5
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredMemberFunctionPointerCall5 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>,
- VoidStoredMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class StoredConstMemberFunctionPointerCall5 : public RunFunctionTask<T>
-{
-public:
- StoredConstMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
-
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class VoidStoredConstMemberFunctionPointerCall5 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
-
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-struct SelectStoredConstMemberFunctionPointerCall5
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstMemberFunctionPointerCall5 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>,
- VoidStoredConstMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5> >::type type;
-};
-#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class StoredNoExceptMemberFunctionCall5 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
-
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) noexcept;
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class VoidStoredNoExceptMemberFunctionCall5 : public RunFunctionTask<T>
+template <class Function, class ...Args>
+struct InvokeResult
{
-public:
- VoidStoredNoExceptMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
+ static_assert(std::is_invocable_v<std::decay_t<Function>, std::decay_t<Args>...>,
+ "It's not possible to invoke the function with passed arguments.");
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) noexcept;
- Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
+ using Type = std::invoke_result_t<std::decay_t<Function>, std::decay_t<Args>...>;
};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-struct SelectStoredNoExceptMemberFunctionCall5
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionCall5 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>,
- VoidStoredNoExceptMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class StoredConstNoExceptMemberFunctionCall5 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
- void runFunctor() override
- {
- this->result = (object.*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const noexcept;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class VoidStoredConstNoExceptMemberFunctionCall5 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const noexcept, const Class &_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
+template <class Function, class ...Args>
+using InvokeResultType = typename InvokeResult<Function, Args...>::Type;
- void runFunctor() override
- {
- (object.*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const noexcept;
- const Class object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-struct SelectStoredConstNoExceptMemberFunctionCall5
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionCall5 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>,
- VoidStoredConstNoExceptMemberFunctionCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class StoredNoExceptMemberFunctionPointerCall5 : public RunFunctionTask<T>
-{
-public:
- StoredNoExceptMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) noexcept, Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
+template <class ...Types>
+using DecayedTuple = std::tuple<std::decay_t<Types>...>;
- void runFunctor() override
- {
- this->result = (object->*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) noexcept;
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class VoidStoredNoExceptMemberFunctionPointerCall5 : public RunFunctionTask<T>
+template <class Function, class ...Args>
+struct StoredFunctionCall : public RunFunctionTask<InvokeResultType<Function, Args...>>
{
-public:
- VoidStoredNoExceptMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) noexcept, Class *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
+ StoredFunctionCall(Function &&f, Args &&...args)
+ : data{std::forward<Function>(f), std::forward<Args>(args)...}
+ {}
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) noexcept;
- Class *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-struct SelectStoredNoExceptMemberFunctionPointerCall5
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredNoExceptMemberFunctionPointerCall5 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>,
- VoidStoredNoExceptMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5> >::type type;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class StoredConstNoExceptMemberFunctionPointerCall5 : public RunFunctionTask<T>
-{
-public:
- StoredConstNoExceptMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const noexcept, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
+ StoredFunctionCall(DecayedTuple<Function, Args...> &&_data)
+ : data(std::move(_data))
+ {}
void runFunctor() override
{
- this->result = (object->*fn)(arg1, arg2, arg3, arg4, arg5);
- }
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const noexcept;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-class VoidStoredConstNoExceptMemberFunctionPointerCall5 : public RunFunctionTask<T>
-{
-public:
- VoidStoredConstNoExceptMemberFunctionPointerCall5(T (Class::*_fn)(Param1, Param2, Param3, Param4, Param5) const noexcept, Class const *_object, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5)
- : fn(_fn), object(_object), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5){ }
+ constexpr auto invoke = &std::invoke<std::decay_t<Function>,
+ std::decay_t<Args>...>;
- void runFunctor() override
- {
- (object->*fn)(arg1, arg2, arg3, arg4, arg5);
+ if constexpr (std::is_void_v<InvokeResultType<Function, Args...>>)
+ std::apply(invoke, std::move(data));
+ else
+ this->result = std::apply(invoke, std::move(data));
}
-private:
- T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const noexcept;
- Class const *object;
- Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
-};
-template <typename T, typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
-struct SelectStoredConstNoExceptMemberFunctionPointerCall5
-{
- typedef typename SelectSpecialization<T>::template
- Type<StoredConstNoExceptMemberFunctionPointerCall5 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>,
- VoidStoredConstNoExceptMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5> >::type type;
-};
-#endif
-template <typename T, typename Functor>
-class StoredFunctorCall : public RunFunctionTask<T>
-{
-public:
- StoredFunctorCall(const Functor &f) : functor(f) { }
- void runFunctor() override
- {
- this->result = functor();
- }
-private:
- Functor functor;
+ DecayedTuple<Function, Args...> data;
};
-template <typename Functor>
-class StoredFunctorCall<void, Functor> : public RunFunctionTask<void>
-{
-public:
- StoredFunctorCall(const Functor &f) : functor(f) { }
- void runFunctor() override
- {
- functor();
- }
-private:
- Functor functor;
-};
-
} //namespace QtConcurrent
diff --git a/src/concurrent/qtconcurrenttask.h b/src/concurrent/qtconcurrenttask.h
new file mode 100644
index 0000000000..ff55df7748
--- /dev/null
+++ b/src/concurrent/qtconcurrenttask.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtConcurrent module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTCONCURRENTTASK_H
+#define QTCONCURRENTTASK_H
+
+#if !defined(QT_NO_CONCURRENT)
+
+#include <QtConcurrent/qtaskbuilder.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifdef Q_CLANG_QDOC
+
+namespace QtConcurrent {
+
+template <class Task>
+[[nodiscard]]
+QTaskBuilder<Task> task(Task &&task);
+
+} // namespace QtConcurrent
+
+#else
+
+namespace QtConcurrent {
+
+template <class Task>
+[[nodiscard]]
+constexpr auto task(Task &&t) { return QTaskBuilder(std::forward<Task>(t)); }
+
+} // namespace QtConcurrent
+
+#endif // Q_CLANG_QDOC
+
+QT_END_NAMESPACE
+
+#endif // !defined(QT_NO_CONCURRENT)
+
+#endif // QTCONCURRENTTASK_H
diff --git a/src/concurrent/qtconcurrenttask.qdoc b/src/concurrent/qtconcurrenttask.qdoc
new file mode 100644
index 0000000000..9000b424fe
--- /dev/null
+++ b/src/concurrent/qtconcurrenttask.qdoc
@@ -0,0 +1,161 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qtconcurrenttask.html
+ \title Concurrent Task
+ \ingroup thread
+
+ QtConcurrent::task provides an alternative interface for running a
+ task in a separate thread. The return value of the function is made
+ available through the QFuture API.
+
+ If you want to just run a function in a separate thread without adjusting
+ any parameters, use QtConcurrent::run as that lets you write less code.
+ The QtConcurrent::task is designed for cases where you need to perform
+ extra configurations steps.
+
+ This function is a part of the \l {Qt Concurrent} framework.
+
+ \section1 Fluent interface
+
+ The QtConcurrent::task returns an instance of an auxiliary class called
+ QtConcurrent::QTaskBuilder. Normally, you don't need to create an instance
+ of this class manually. The QtConcurrent::QTaskBuilder provides an interface
+ to adjust different task parameters in a chain-like manner. This approach
+ is known as a
+ \l {https://en.wikipedia.org/wiki/Fluent_interface}{fluent interface}.
+
+ You can just set the parameters you need and then kick a task off.
+ In order to finalize the configuration of a task you must invoke
+ QtConcurrent::QTaskBuilder::spawn. This function is non-blocking (i.e.
+ returns a future object immediately), but it's not guaranteed that the
+ task starts immediately. You can use the QFuture and QFutureWatcher classes
+ to monitor the status of the task.
+
+ See more examples and explanations below.
+
+ \section1 Running a task in a separate thread
+
+ To run a function in another thread, use QtConcurrent::QTaskBuilder::spawn:
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 0
+
+ This will run a lambda function in a separate thread obtained from
+ the default QThreadPool.
+
+ \section1 Passing arguments to the task
+
+ Invoking a function with arguments is done by passing them to
+ QtConcurrent::QTaskBuilder::withArguments:
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 1
+
+ A copy of each argument is made at the point where
+ QtConcurrent::QTaskBuilder::withArguments is called, and these values
+ are passed to the thread when it begins executing the task. Changes made
+ to the arguments after calling QtConcurrent::QTaskBuilder::withArguments
+ are not visible to the thread.
+
+ If you want to run a function that accepts arguments by reference, you
+ should use \l {https://en.cppreference.com/w/cpp/utility/functional/ref}
+ {std::ref/cref} auxiliary functions. These functions create thin wrappers
+ around passed arguments:
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 2
+
+ Make sure that all wrapped objects live long enough. It is possible to
+ get undefined behavior if a task outlives the object wrapped by
+ std::ref/cref.
+
+ \section1 Returning values from the task
+
+ You can obtain the result of a task with the QFuture API:
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 3
+
+ Note that QFuture::result() is a blocking call, it waits for the
+ result to become available. Use QFutureWatcher to get a notification
+ when the task has finished execution and the result is available.
+
+ In case you want to pass a result to another asynchronous task, you can
+ use QFuture::then() to create a chain of dependent tasks. See the QFuture
+ documentation for more details.
+
+ \section1 Additional API features
+
+ \section2 Using different types of callable objects
+
+ Strictly speaking, you can use any type of tasks and arguments that
+ satisfy the following condition:
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 4
+
+ You can use a free function:
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 5
+
+ You can use a member function:
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 6
+
+ You can use a callable object with an operator():
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 7
+
+ If you want to use an existing callable object, you need to either
+ copy/move it to QtConcurrent::task or wrap it with std::ref/cref:
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 8
+
+ \section2 Using custom thread pool
+
+ You can specify a custom thread pool:
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 9
+
+ \section2 Setting priority for a task
+
+ You can set the priority for a task:
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 10
+
+ If you don't need a future object, you can call
+ QtConcurrent::QTaskBuilder::spawn(QtConcurrent::FutureResult::Ignore):
+
+ \snippet code/src_concurrent_qtconcurrenttask.cpp 11
+*/
+
+/*!
+ \fn template <typename Task> [[nodiscard]] QTaskBuilder<Task> QtConcurrent::task(Task &&task);
+ \since 6.0
+
+ Creates an instance of QtConcurrent::QTaskBuilder. This object can be used
+ to adjust some parameters and run \a task in a separate thread.
+
+ \sa {Concurrent Task}, QtConcurrent::QTaskBuilder
+*/
diff --git a/src/concurrent/qtconcurrentthreadengine.cpp b/src/concurrent/qtconcurrentthreadengine.cpp
index 7f91a2ba68..cf424912b3 100644
--- a/src/concurrent/qtconcurrentthreadengine.cpp
+++ b/src/concurrent/qtconcurrentthreadengine.cpp
@@ -322,10 +322,13 @@ void ThreadEngineBase::run() // implements QRunnable.
void ThreadEngineBase::handleException(const QException &exception)
{
- if (futureInterface)
+ if (futureInterface) {
futureInterface->reportException(exception);
- else
- exceptionStore.setException(exception);
+ } else {
+ QMutexLocker lock(&mutex);
+ if (!exceptionStore.hasException())
+ exceptionStore.setException(exception);
+ }
}
#endif
diff --git a/src/concurrent/qtconcurrentthreadengine.h b/src/concurrent/qtconcurrentthreadengine.h
index af413707e4..b7be48d612 100644
--- a/src/concurrent/qtconcurrentthreadengine.h
+++ b/src/concurrent/qtconcurrentthreadengine.h
@@ -121,6 +121,7 @@ protected:
QThreadPool *threadPool;
ThreadEngineBarrier barrier;
QtPrivate::ExceptionStore exceptionStore;
+ QBasicMutex mutex;
};
diff --git a/src/corelib/.prev_CMakeLists.txt b/src/corelib/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..15b76decd5
--- /dev/null
+++ b/src/corelib/.prev_CMakeLists.txt
@@ -0,0 +1,1124 @@
+# Generated from corelib.pro.
+
+#####################################################################
+## Core Module:
+#####################################################################
+
+qt_add_module(Core
+ GENERATE_METATYPES
+ QMAKE_MODULE_CONFIG moc resources
+ EXCEPTIONS
+ SOURCES
+ codecs/qtextcodec_p.h
+ codecs/qutfcodec.cpp codecs/qutfcodec_p.h
+ global/archdetect.cpp
+ global/qcompilerdetection.h
+ global/qendian.cpp global/qendian.h global/qendian_p.h
+ global/qflags.h
+ global/qfloat16.cpp global/qfloat16.h
+ global/qglobal.cpp global/qglobal.h
+ global/qglobalstatic.h
+ global/qhooks.cpp global/qhooks_p.h
+ global/qisenum.h
+ global/qlibraryinfo.cpp global/qlibraryinfo.h
+ global/qlogging.cpp global/qlogging.h
+ global/qmalloc.cpp
+ global/qmemory_p.h
+ global/qnamespace.h
+ global/qnumeric.cpp global/qnumeric.h global/qnumeric_p.h
+ global/qoperatingsystemversion.cpp global/qoperatingsystemversion.h global/qoperatingsystemversion_p.h
+ global/qprocessordetection.h
+ global/qrandom.cpp global/qrandom.h global/qrandom_p.h
+ global/qsimd.cpp global/qsimd.h global/qsimd_p.h
+ global/qsysinfo.h
+ global/qsystemdetection.h
+ global/qtypeinfo.h
+ global/qtypetraits.h
+ global/qversiontagging.h
+ io/qabstractfileengine.cpp io/qabstractfileengine_p.h
+ io/qbuffer.cpp io/qbuffer.h
+ io/qdataurl.cpp io/qdataurl_p.h
+ io/qdebug.cpp io/qdebug.h io/qdebug_p.h
+ io/qdir.cpp io/qdir.h io/qdir_p.h
+ io/qdiriterator.cpp io/qdiriterator.h
+ io/qfile.cpp io/qfile.h
+ io/qfiledevice.cpp io/qfiledevice.h io/qfiledevice_p.h
+ io/qfileinfo.cpp io/qfileinfo.h io/qfileinfo_p.h
+ io/qfileselector.cpp io/qfileselector.h io/qfileselector_p.h
+ io/qfilesystemengine.cpp io/qfilesystemengine_p.h
+ io/qfilesystementry.cpp io/qfilesystementry_p.h
+ io/qfilesystemiterator_p.h
+ io/qfilesystemmetadata_p.h
+ io/qfsfileengine.cpp io/qfsfileengine_p.h
+ io/qfsfileengine_iterator.cpp io/qfsfileengine_iterator_p.h
+ io/qiodevice.cpp io/qiodevice.h io/qiodevice_p.h
+ io/qipaddress.cpp io/qipaddress_p.h
+ io/qlockfile.cpp io/qlockfile.h io/qlockfile_p.h
+ io/qloggingcategory.cpp io/qloggingcategory.h
+ io/qloggingregistry.cpp io/qloggingregistry_p.h
+ io/qnoncontiguousbytedevice.cpp io/qnoncontiguousbytedevice_p.h
+ io/qresource.cpp io/qresource_p.h
+ io/qresource_iterator.cpp io/qresource_iterator_p.h
+ io/qsavefile.cpp io/qsavefile.h
+ io/qstandardpaths.cpp io/qstandardpaths.h
+ io/qstorageinfo.cpp io/qstorageinfo.h io/qstorageinfo_p.h
+ io/qtemporarydir.cpp io/qtemporarydir.h
+ io/qtemporaryfile.cpp io/qtemporaryfile.h io/qtemporaryfile_p.h
+ io/qurl.cpp io/qurl.h io/qurl_p.h
+ io/qurlidna.cpp
+ io/qurlquery.cpp io/qurlquery.h
+ io/qurlrecode.cpp
+ itemmodels/qabstractitemmodel.cpp itemmodels/qabstractitemmodel.h itemmodels/qabstractitemmodel_p.h
+ itemmodels/qitemselectionmodel.cpp itemmodels/qitemselectionmodel.h itemmodels/qitemselectionmodel_p.h
+ kernel/qabstracteventdispatcher.cpp kernel/qabstracteventdispatcher.h kernel/qabstracteventdispatcher_p.h
+ kernel/qabstractnativeeventfilter.cpp kernel/qabstractnativeeventfilter.h
+ kernel/qbasictimer.cpp kernel/qbasictimer.h
+ kernel/qcoreapplication.cpp kernel/qcoreapplication.h kernel/qcoreapplication_p.h
+ kernel/qcorecmdlineargs_p.h
+ kernel/qcoreevent.cpp kernel/qcoreevent.h
+ kernel/qcoreglobaldata.cpp kernel/qcoreglobaldata_p.h
+ kernel/qdeadlinetimer.cpp kernel/qdeadlinetimer.h kernel/qdeadlinetimer_p.h
+ kernel/qelapsedtimer.cpp kernel/qelapsedtimer.h
+ kernel/qeventloop.cpp kernel/qeventloop.h
+ kernel/qfunctions_p.h
+ kernel/qmath.cpp kernel/qmath.h
+ kernel/qmetaobject.cpp kernel/qmetaobject.h kernel/qmetaobject_p.h
+ kernel/qmetaobject_moc_p.h
+ kernel/qmetaobjectbuilder.cpp kernel/qmetaobjectbuilder_p.h
+ kernel/qmetatype.cpp kernel/qmetatype.h kernel/qmetatype_p.h
+ kernel/qmetatypeswitcher_p.h
+ kernel/qmimedata.cpp kernel/qmimedata.h
+ kernel/qobject.cpp kernel/qobject.h kernel/qobject_p.h
+ kernel/qobject_impl.h
+ kernel/qobjectcleanuphandler.cpp kernel/qobjectcleanuphandler.h
+ kernel/qobjectdefs.h
+ kernel/qobjectdefs_impl.h
+ kernel/qpointer.cpp kernel/qpointer.h
+ kernel/qproperty.cpp kernel/qproperty.h kernel/qproperty_p.h
+ kernel/qpropertybinding.cpp kernel/qpropertybinding_p.h
+ kernel/qpropertyprivate.h
+ kernel/qsharedmemory.cpp kernel/qsharedmemory.h kernel/qsharedmemory_p.h
+ kernel/qsignalmapper.cpp kernel/qsignalmapper.h
+ kernel/qsocketnotifier.cpp kernel/qsocketnotifier.h
+ kernel/qsystemerror.cpp kernel/qsystemerror_p.h
+ kernel/qsystemsemaphore.cpp kernel/qsystemsemaphore.h kernel/qsystemsemaphore_p.h
+ kernel/qtestsupport_core.cpp kernel/qtestsupport_core.h
+ kernel/qtimer.cpp kernel/qtimer.h
+ kernel/qtranslator.cpp kernel/qtranslator.h kernel/qtranslator_p.h
+ kernel/qvariant.cpp kernel/qvariant.h kernel/qvariant_p.h
+ plugin/qfactoryinterface.cpp plugin/qfactoryinterface.h
+ plugin/qfactoryloader.cpp plugin/qfactoryloader_p.h
+ plugin/qplugin.h plugin/qplugin_p.h
+ plugin/qpluginloader.cpp plugin/qpluginloader.h
+ plugin/quuid.cpp plugin/quuid.h
+ serialization/qcborarray.h
+ serialization/qcborcommon.cpp serialization/qcborcommon.h serialization/qcborcommon_p.h
+ serialization/qcbordiagnostic.cpp
+ serialization/qcbormap.h
+ serialization/qcborstream.h
+ serialization/qcborvalue.cpp serialization/qcborvalue.h serialization/qcborvalue_p.h
+ serialization/qdatastream.cpp serialization/qdatastream.h serialization/qdatastream_p.h
+ serialization/qjson_p.h
+ serialization/qjsonarray.cpp serialization/qjsonarray.h
+ serialization/qjsoncbor.cpp
+ serialization/qjsondocument.cpp serialization/qjsondocument.h
+ serialization/qjsonobject.cpp serialization/qjsonobject.h
+ serialization/qjsonparser.cpp serialization/qjsonparser_p.h
+ serialization/qjsonvalue.cpp serialization/qjsonvalue.h
+ serialization/qjsonwriter.cpp serialization/qjsonwriter_p.h
+ serialization/qtextstream.cpp serialization/qtextstream.h serialization/qtextstream_p.h
+ serialization/qxmlstream.cpp serialization/qxmlstream.h serialization/qxmlstream_p.h
+ serialization/qxmlutils.cpp serialization/qxmlutils_p.h
+ statemachine/qabstractstate.cpp statemachine/qabstractstate.h statemachine/qabstractstate_p.h
+ statemachine/qabstracttransition.cpp statemachine/qabstracttransition.h statemachine/qabstracttransition_p.h
+ statemachine/qfinalstate.cpp statemachine/qfinalstate.h statemachine/qfinalstate_p.h
+ statemachine/qhistorystate.cpp statemachine/qhistorystate.h statemachine/qhistorystate_p.h
+ statemachine/qsignaleventgenerator_p.h
+ statemachine/qsignaltransition.cpp statemachine/qsignaltransition.h statemachine/qsignaltransition_p.h
+ statemachine/qstate.cpp statemachine/qstate.h statemachine/qstate_p.h
+ statemachine/qstatemachine.cpp statemachine/qstatemachine.h statemachine/qstatemachine_p.h
+ text/qbytearray.cpp text/qbytearray.h text/qbytearray_p.h
+ text/qbytearraylist.cpp text/qbytearraylist.h
+ text/qbytearraymatcher.cpp text/qbytearraymatcher.h
+ text/qbytedata_p.h
+ text/qchar.h
+ text/qcollator.cpp text/qcollator.h text/qcollator_p.h
+ text/qdoublescanprint_p.h
+ text/qlocale.cpp text/qlocale.h text/qlocale_p.h
+ text/qlocale_data_p.h
+ text/qlocale_tools.cpp text/qlocale_tools_p.h
+ text/qregexp.cpp text/qregexp.h
+ text/qstring.cpp text/qstring.h
+ text/qstring_compat.cpp
+ text/qstringalgorithms.h text/qstringalgorithms_p.h
+ text/qstringbuilder.cpp text/qstringbuilder.h
+ text/qstringiterator_p.h
+ text/qstringlist.cpp text/qstringlist.h
+ text/qstringliteral.h
+ text/qstringmatcher.h
+ text/qstringview.cpp text/qstringview.h
+ text/qtextboundaryfinder.cpp text/qtextboundaryfinder.h
+ text/qunicodetables_p.h
+ text/qunicodetools.cpp text/qunicodetools_p.h
+ text/qvsnprintf.cpp
+ thread/qmutex.h
+ thread/qreadwritelock.h
+ thread/qrunnable.cpp thread/qrunnable.h
+ thread/qthread.cpp thread/qthread.h
+ thread/qthreadstorage.h
+ thread/qwaitcondition.h thread/qwaitcondition_p.h
+ time/qcalendar.cpp time/qcalendar.h
+ time/qcalendarbackend_p.h
+ time/qcalendarmath_p.h
+ time/qdatetime.cpp time/qdatetime.h time/qdatetime_p.h
+ time/qgregoriancalendar.cpp time/qgregoriancalendar_p.h
+ time/qjuliancalendar.cpp time/qjuliancalendar_p.h
+ time/qmilankoviccalendar.cpp time/qmilankoviccalendar_p.h
+ time/qromancalendar.cpp time/qromancalendar_p.h
+ time/qromancalendar_data_p.h
+ tools/qalgorithms.h
+ tools/qarraydata.cpp tools/qarraydata.h
+ tools/qarraydataops.h
+ tools/qarraydatapointer.h
+ tools/qbitarray.cpp tools/qbitarray.h
+ tools/qcache.h
+ tools/qcontainerfwd.h
+ tools/qcontainertools_impl.h
+ tools/qcontiguouscache.cpp tools/qcontiguouscache.h
+ tools/qcryptographichash.cpp tools/qcryptographichash.h
+ tools/qduplicatetracker_p.h
+ tools/qflatmap_p.h
+ tools/qfreelist.cpp tools/qfreelist_p.h
+ tools/qhash.cpp tools/qhash.h
+ tools/qhashfunctions.h
+ tools/qiterator.h
+ tools/qline.cpp tools/qline.h
+ tools/qlist.cpp tools/qlist.h
+ tools/qmakearray_p.h
+ tools/qmap.cpp tools/qmap.h
+ tools/qmargins.cpp tools/qmargins.h
+ tools/qmessageauthenticationcode.cpp tools/qmessageauthenticationcode.h
+ tools/qoffsetstringarray_p.h
+ tools/qpair.h
+ tools/qpoint.cpp tools/qpoint.h
+ tools/qqueue.h
+ tools/qrect.cpp tools/qrect.h
+ tools/qrefcount.cpp tools/qrefcount.h
+ tools/qringbuffer.cpp tools/qringbuffer_p.h
+ tools/qscopedpointer.h tools/qscopedpointer_p.h
+ tools/qscopedvaluerollback.h
+ tools/qscopeguard.h
+ tools/qset.h
+ tools/qshareddata.cpp tools/qshareddata.h
+ tools/qsharedpointer.cpp tools/qsharedpointer.h
+ tools/qsharedpointer_impl.h
+ tools/qsize.cpp tools/qsize.h
+ tools/qstack.h
+ tools/qtaggedpointer.h
+ tools/qtools_p.h
+ tools/qvarlengtharray.h
+ tools/qvector.h
+ tools/qversionnumber.cpp tools/qversionnumber.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ INCLUDE_DIRECTORIES
+ ${PROJECT_BINARY_DIR}/src/corelib/global
+ ../3rdparty/md4
+ ../3rdparty/md5
+ ../3rdparty/sha3
+ ../3rdparty/tinycbor/src
+ PRECOMPILED_HEADER
+ "global/qt_pch.h"
+ NO_PCH_SOURCES
+ "text/qstring_compat.cpp"
+)
+
+
+qt_add_simd_part(Core SIMD mips_dsp
+ SOURCES
+ ../gui/painting/qt_mips_asm_dsp_p.h
+ text/qstring_mips_dsp_asm.S
+)
+
+if(QT_FEATURE_reduce_relocations AND UNIX AND GCC)
+ target_link_options(Core PRIVATE
+ "LINKER:--dynamic-list=${CMAKE_CURRENT_LIST_DIR}/QtCore.dynlist")
+endif()
+
+if(ANDROID)
+ set_property(TARGET Core APPEND PROPERTY QT_ANDROID_BUNDLED_JAR_DEPENDENCIES
+ jar/QtAndroid.jar
+ )
+ set_property(TARGET Core APPEND PROPERTY QT_ANDROID_LIB_DEPENDENCIES
+ plugins/platforms/libplugins_platforms_qtforandroid.so
+ )
+ set_property(TARGET Core APPEND PROPERTY QT_ANDROID_PERMISSIONS
+ android.permission.INTERNET android.permission.WRITE_EXTERNAL_STORAGE
+ )
+endif()
+
+#### Keys ignored in scope 1:.:.:corelib.pro:<TRUE>:
+# CMAKE_DISABLED_FEATURES = "$$join(QT_DISABLED_FEATURES, "$$escape_expand(\\n) ")"
+# CMAKE_HOST_DATA_DIR = "$$cmakeRelativePath($$[QT_HOST_DATA/src], $$[QT_INSTALL_PREFIX])"
+# CMAKE_INSTALL_DATA_DIR = "$$cmakeRelativePath($$[QT_HOST_DATA], $$[QT_INSTALL_PREFIX])"
+# HOST_BINS = "$$[QT_HOST_BINS]"
+# INSTALLS = "ctest_qt5_module_files" "cmake_qt5_umbrella_module_files"
+# MODULE = "core"
+# MODULE_CONFIG = "moc" "resources"
+# QMAKE_DSYM_DEBUG_SCRIPT = "$$PWD/debug_script.py"
+# QMAKE_PKGCONFIG_VARIABLES = "host_bins" "qt_conf"
+# QMAKE_SUBSTITUTES = "ctest_macros_file" "cmake_umbrella_config_file" "cmake_umbrella_config_module_location" "cmake_umbrella_config_module_location_for_install" "cmake_umbrella_config_version_file" "cmake_extras_mkspec_dir" "cmake_extras_mkspec_dir_for_install"
+# cmake_extras_mkspec_dir.input = "$$PWD/Qt5CoreConfigExtrasMkspecDir.cmake.in"
+# cmake_extras_mkspec_dir.output = "$$DESTDIR/cmake/Qt5Core/Qt5CoreConfigExtrasMkspecDir.cmake"
+# cmake_extras_mkspec_dir_for_install.input = "$$PWD/Qt5CoreConfigExtrasMkspecDirForInstall.cmake.in"
+# cmake_extras_mkspec_dir_for_install.output = "$$DESTDIR/cmake/install/Qt5Core/Qt5CoreConfigExtrasMkspecDir.cmake"
+# cmake_qt5_umbrella_module_files.files = "$$cmake_umbrella_config_file.output" "$$cmake_umbrella_config_version_file.output" "$$cmake_umbrella_config_module_location_for_install.output"
+# cmake_qt5_umbrella_module_files.path = "$$[QT_INSTALL_LIBS]/cmake/Qt5"
+# cmake_umbrella_config_file.input = "$$PWD/Qt5Config.cmake.in"
+# cmake_umbrella_config_file.output = "$$DESTDIR/cmake/Qt5/Qt5Config.cmake"
+# cmake_umbrella_config_module_location.input = "$$PWD/Qt5ModuleLocation.cmake.in"
+# cmake_umbrella_config_module_location.output = "$$DESTDIR/cmake/Qt5/Qt5ModuleLocation.cmake"
+# cmake_umbrella_config_module_location_for_install.input = "$$PWD/Qt5ModuleLocationForInstall.cmake.in"
+# cmake_umbrella_config_module_location_for_install.output = "$$DESTDIR/cmake/install/Qt5/Qt5ModuleLocation.cmake"
+# cmake_umbrella_config_version_file.input = "$$PWD/../../mkspecs/features/data/cmake/Qt5ConfigVersion.cmake.in"
+# cmake_umbrella_config_version_file.output = "$$DESTDIR/cmake/Qt5/Qt5ConfigVersion.cmake"
+# ctest_macros_file.CONFIG = "verbatim"
+# ctest_macros_file.input = "$$PWD/Qt5CTestMacros.cmake"
+# ctest_macros_file.output = "$$DESTDIR/cmake/Qt5Core/Qt5CTestMacros.cmake"
+# ctest_qt5_module_files.files = "$$ctest_macros_file.output" "$$cmake_extras_mkspec_dir_for_install.output"
+# ctest_qt5_module_files.path = "$$[QT_INSTALL_LIBS]/cmake/Qt5Core"
+# host_bins.name = "host_bins"
+# host_bins.variable = "HOST_BINS"
+# qt_conf.name = "qt_config"
+# qt_conf.variable = "QT_CONFIG"
+
+## Scopes:
+#####################################################################
+
+#### Keys ignored in scope 2:.:.:corelib.pro:QT_FEATURE_gc_binaries:
+# MODULE_CONFIG = "gc_binaries"
+
+qt_extend_target(Core CONDITION NOT QT_NAMESPACE_ISEMPTY
+ PUBLIC_DEFINES
+ QT_NAMESPACE=
+)
+
+qt_extend_target(Core CONDITION ANDROID
+ SOURCES
+ kernel/qsharedmemory_android.cpp
+ kernel/qsystemsemaphore_android.cpp
+ DEFINES
+ LIBS_SUFFIX="_${CMAKE_SYSTEM_PROCESSOR}.so"
+)
+
+qt_extend_target(Core CONDITION MSVC AND (TEST_architecture_arch STREQUAL "i386")
+ LINK_OPTIONS
+ "/BASE:0x67000000"
+)
+
+#### Keys ignored in scope 6:.:.:corelib.pro:FREEBSD OR OPENBSD:
+# QMAKE_LFLAGS_NOUNDEF = <EMPTY>
+
+qt_extend_target(Core CONDITION QT_FEATURE_animation
+ SOURCES
+ animation/qabstractanimation.cpp animation/qabstractanimation.h animation/qabstractanimation_p.h
+ animation/qanimationgroup.cpp animation/qanimationgroup.h animation/qanimationgroup_p.h
+ animation/qparallelanimationgroup.cpp animation/qparallelanimationgroup.h animation/qparallelanimationgroup_p.h
+ animation/qpauseanimation.cpp animation/qpauseanimation.h
+ animation/qpropertyanimation.cpp animation/qpropertyanimation.h animation/qpropertyanimation_p.h
+ animation/qsequentialanimationgroup.cpp animation/qsequentialanimationgroup.h animation/qsequentialanimationgroup_p.h
+ animation/qvariantanimation.cpp animation/qvariantanimation.h animation/qvariantanimation_p.h
+)
+
+qt_extend_target(Core CONDITION WIN32
+ SOURCES
+ global/qoperatingsystemversion_win.cpp global/qoperatingsystemversion_win_p.h
+ io/qfilesystemengine_win.cpp
+ io/qfsfileengine_win.cpp
+ io/qlockfile_win.cpp
+ kernel/qcoreapplication_win.cpp
+ kernel/qelapsedtimer_win.cpp
+ kernel/qsharedmemory_win.cpp
+ kernel/qsystemsemaphore_win.cpp
+ kernel/qwineventnotifier.cpp kernel/qwineventnotifier.h kernel/qwineventnotifier_p.h
+ plugin/qsystemlibrary.cpp plugin/qsystemlibrary_p.h
+ thread/qatomic_msvc.h
+ thread/qthread_win.cpp
+ DEFINES
+ -QT_NO_CAST_TO_ASCII
+ LIBRARIES
+ ws2_32
+)
+
+qt_extend_target(Core CONDITION WIN32 AND NOT WINRT
+ SOURCES
+ io/qstandardpaths_win.cpp
+ io/qstorageinfo_win.cpp
+ io/qwindowspipereader.cpp io/qwindowspipereader_p.h
+ io/qwindowspipewriter.cpp io/qwindowspipewriter_p.h
+ kernel/qeventdispatcher_win.cpp kernel/qeventdispatcher_win_p.h
+ kernel/qwinregistry.cpp kernel/qwinregistry_p.h
+ LIBRARIES
+ advapi32
+ kernel32
+ netapi32
+ ole32
+ shell32
+ user32
+ uuid
+ version
+ winmm
+ PUBLIC_LIBRARIES
+ mpr
+ userenv
+)
+
+qt_extend_target(Core CONDITION APPLE
+ SOURCES
+ global/qoperatingsystemversion_darwin.mm
+ io/qfilesystemengine_mac.mm
+ io/qstandardpaths_mac.mm
+ io/qstorageinfo_mac.cpp
+ kernel/qcfsocketnotifier.cpp kernel/qcfsocketnotifier_p.h
+ kernel/qcore_foundation.mm
+ kernel/qcore_mac.mm kernel/qcore_mac_p.h
+ kernel/qcoreapplication_mac.cpp
+ kernel/qeventdispatcher_cf.mm kernel/qeventdispatcher_cf_p.h
+ LIBRARIES
+ ${FWCoreFoundation}
+ ${FWFoundation}
+)
+
+qt_extend_target(Core CONDITION MACOS
+ LIBRARIES
+ ${FWAppKit}
+ ${FWApplicationServices}
+ ${FWCoreServices}
+ ${FWSecurity}
+ PUBLIC_LIBRARIES
+ ${FWDiskArbitration}
+ ${FWIOKit}
+)
+
+qt_extend_target(Core CONDITION INTEGRITY
+ LIBRARIES
+ ivfs
+ net
+ posix
+ shm_client
+ socket
+ COMPILE_OPTIONS
+ --pending_instantiations=128
+)
+
+#### Keys ignored in scope 15:.:.:corelib.pro:pathIsAbsolute(_ss_CMAKE_HOST_DATA_DIR):
+# CMAKE_HOST_DATA_DIR = "$$[QT_HOST_DATA/src]/"
+# CMAKE_HOST_DATA_DIR_IS_ABSOLUTE = "True"
+
+#### Keys ignored in scope 16:.:.:corelib.pro:pathIsAbsolute(_ss_CMAKE_INSTALL_DATA_DIR):
+# CMAKE_INSTALL_DATA_DIR = "$$[QT_HOST_DATA]/"
+# CMAKE_INSTALL_DATA_DIR_IS_ABSOLUTE = "True"
+
+#### Keys ignored in scope 21:.:global:global/global.pri:QT_CPU_FEATURES__ss_QT_ARCH___contains___f16c:
+# f16c_cxx = "true"
+
+#### Keys ignored in scope 23:.:global:global/global.pri:CLANG OR intel_icl OR ICC:
+# f16c_cxx = "false"
+
+#### Keys ignored in scope 25:.:global:global/global.pri:GCC AND f16c AND x86SimdAlways:
+# f16c_cxx = "true"
+
+#### Keys ignored in scope 27:.:global:global/global.pri:MSVC AND QT_CPU_FEATURES__ss_QT_ARCH___contains___avx:
+# f16c_cxx = "true"
+
+#### Keys ignored in scope 28:.:global:global/global.pri:else:
+# f16c_cxx = "false"
+
+qt_extend_target(Core CONDITION _ss_f16c_cxx
+ DEFINES
+ QFLOAT16_INCLUDE_FAST
+)
+
+if(NOT _ss_f16c_cxx)
+ qt_add_simd_part(Core SIMD f16c
+ SOURCES
+ global/qfloat16_f16c.c
+ )
+endif()
+
+qt_extend_target(Core CONDITION NOT CMAKE_CROSSCOMPILING AND NOT _x_-armcc_x_ AND NOT static AND (hurd_x_ OR linux_x_)
+ DEFINES
+ ELF_INTERPRETER=\\\"=Creadelf-l/bin/ls|perl-n-e\'['quote', ['if', ['/program', 'interpreter:', ['.*'], ']/'], '{', 'print', '$1;', '}']]\'\\\"
+ LINK_OPTIONS
+ "-Wl,-e,qt_core_boilerplate"
+)
+
+qt_extend_target(Core CONDITION LINUX AND NOT static
+ SOURCES
+ global/minimum-linux_p.h
+)
+
+#### Keys ignored in scope 35:.:global:global/global.pri:precompile_header:
+# NO_PCH_ASM = "global/minimum-linux.S"
+# QMAKE_EXTRA_COMPILERS = "no_pch_assembler"
+# no_pch_assembler.commands = "$$QMAKE_CC" "-c" "$(CFLAGS)" "$(INCPATH)" "${QMAKE_FILE_IN}" "-o" "${QMAKE_FILE_OUT}"
+# no_pch_assembler.dependency_type = "TYPE_C"
+# no_pch_assembler.input = "NO_PCH_ASM"
+# no_pch_assembler.name = "compiling[no_pch]" "${QMAKE_FILE_IN}"
+# no_pch_assembler.output = "${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${firstQMAKE_EXT_OBJ}"
+
+#### Keys ignored in scope 36:.:global:global/global.pri:silent:
+# no_pch_assembler.commands = "@echo" "compiling[no_pch]" "${QMAKE_FILE_IN}" "&&"
+
+qt_extend_target(Core CONDITION LINUX AND NOT precompile_header AND NOT static
+ SOURCES
+ global/minimum-linux.S
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_slog2
+ LIBRARIES
+ Slog2::Slog2
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_journald
+ LIBRARIES
+ PkgConfig::Libsystemd
+)
+
+#### Keys ignored in scope 40:.:global:global/global.pri:GCC AND ltcg:
+# QMAKE_EXTRA_COMPILERS = "versiontagging_compiler"
+# versiontagging_compiler.commands = "$$QMAKE_CXX" "-c" "$(CXXFLAGS)" "$(INCPATH)" "-fno-lto" "-o" "${QMAKE_FILE_OUT}" "${QMAKE_FILE_IN}"
+# versiontagging_compiler.dependency_type = "TYPE_C"
+# versiontagging_compiler.input = "VERSIONTAGGING_SOURCES"
+# versiontagging_compiler.name = "compiling[versiontagging]" "${QMAKE_FILE_IN}"
+# versiontagging_compiler.output = "${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${firstQMAKE_EXT_OBJ}"
+# versiontagging_compiler.variable_out = "OBJECTS"
+
+#### Keys ignored in scope 41:.:global:global/global.pri:silent:
+# versiontagging_compiler.commands = "@echo" "compiling[versiontagging]" "${QMAKE_FILE_IN}" "&&"
+
+qt_extend_target(Core CONDITION NOT GCC OR NOT ltcg
+ SOURCES
+ global/qversiontagging.cpp
+)
+
+qt_extend_target(Core CONDITION UNIX
+ SOURCES
+ io/qfilesystemengine_unix.cpp
+ io/qfilesystemiterator_unix.cpp
+ io/qfsfileengine_unix.cpp
+ io/qlockfile_unix.cpp
+ kernel/qcore_unix.cpp kernel/qcore_unix_p.h
+ kernel/qeventdispatcher_unix.cpp kernel/qeventdispatcher_unix_p.h
+ kernel/qpoll_p.h
+ kernel/qtimerinfo_unix.cpp kernel/qtimerinfo_unix_p.h
+ thread/qthread_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_thread
+ SOURCES
+ thread/qatomic.cpp thread/qatomic.h
+ thread/qatomic_bootstrap.h
+ thread/qatomic_cxx11.h
+ thread/qbasicatomic.h
+ thread/qfutex_p.h
+ thread/qgenericatomic.h
+ thread/qlocking_p.h
+ thread/qmutex.cpp thread/qmutex_p.h
+ thread/qorderedmutexlocker_p.h
+ thread/qreadwritelock.cpp thread/qreadwritelock_p.h
+ thread/qsemaphore.cpp thread/qsemaphore.h
+ thread/qthread_p.h
+ thread/qthreadpool.cpp thread/qthreadpool.h thread/qthreadpool_p.h
+ thread/qthreadstorage.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_thread AND WIN32
+ SOURCES
+ thread/qmutex_win.cpp
+ thread/qwaitcondition_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_thread AND UNIX
+ SOURCES
+ thread/qwaitcondition_unix.cpp
+)
+
+qt_extend_target(Core CONDITION APPLE AND QT_FEATURE_thread
+ SOURCES
+ thread/qmutex_mac.cpp
+)
+
+qt_extend_target(Core CONDITION LINUX AND QT_FEATURE_thread
+ SOURCES
+ thread/qmutex_linux.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_thread AND UNIX AND NOT APPLE AND NOT LINUX
+ SOURCES
+ thread/qmutex_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_future
+ SOURCES
+ thread/qexception.cpp thread/qexception.h
+ thread/qfuture.h
+ thread/qfuture_impl.h
+ thread/qfutureinterface.cpp thread/qfutureinterface.h thread/qfutureinterface_p.h
+ thread/qfuturesynchronizer.h
+ thread/qfuturewatcher.cpp thread/qfuturewatcher.h thread/qfuturewatcher_p.h
+ thread/qresultstore.cpp thread/qresultstore.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_std_atomic64
+ PUBLIC_LIBRARIES
+ Atomic
+)
+
+qt_extend_target(Core CONDITION ICC
+ COMPILE_OPTIONS
+ -fp-model
+ strict
+)
+
+qt_extend_target(Core CONDITION MSVC
+ SOURCES
+ tools/qvector_msvc.cpp
+ NO_PCH_SOURCES
+ "tools/qvector_msvc.cpp"
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_system_zlib
+ LIBRARIES
+ ZLIB::ZLIB
+)
+
+qt_extend_target(Core CONDITION NOT QT_FEATURE_system_zlib
+ SOURCES
+ ../3rdparty/zlib/src/adler32.c
+ ../3rdparty/zlib/src/compress.c
+ ../3rdparty/zlib/src/crc32.c
+ ../3rdparty/zlib/src/deflate.c
+ ../3rdparty/zlib/src/gzclose.c
+ ../3rdparty/zlib/src/gzlib.c
+ ../3rdparty/zlib/src/gzread.c
+ ../3rdparty/zlib/src/gzwrite.c
+ ../3rdparty/zlib/src/infback.c
+ ../3rdparty/zlib/src/inffast.c
+ ../3rdparty/zlib/src/inflate.c
+ ../3rdparty/zlib/src/inftrees.c
+ ../3rdparty/zlib/src/trees.c
+ ../3rdparty/zlib/src/uncompr.c
+ ../3rdparty/zlib/src/zutil.c
+ INCLUDE_DIRECTORIES
+ ../3rdparty/zlib/src
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_commandlineparser
+ SOURCES
+ tools/qcommandlineoption.cpp tools/qcommandlineoption.h
+ tools/qcommandlineparser.cpp tools/qcommandlineparser.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_system_doubleconversion
+ LIBRARIES
+ WrapDoubleConversion::WrapDoubleConversion
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_doubleconversion AND NOT QT_FEATURE_system_doubleconversion
+ SOURCES
+ ../3rdparty/double-conversion/bignum.cc ../3rdparty/double-conversion/bignum.h
+ ../3rdparty/double-conversion/bignum-dtoa.cc ../3rdparty/double-conversion/bignum-dtoa.h
+ ../3rdparty/double-conversion/cached-powers.cc ../3rdparty/double-conversion/cached-powers.h
+ ../3rdparty/double-conversion/diy-fp.cc ../3rdparty/double-conversion/diy-fp.h
+ ../3rdparty/double-conversion/double-conversion.cc
+ ../3rdparty/double-conversion/fast-dtoa.cc ../3rdparty/double-conversion/fast-dtoa.h
+ ../3rdparty/double-conversion/fixed-dtoa.cc ../3rdparty/double-conversion/fixed-dtoa.h
+ ../3rdparty/double-conversion/ieee.h
+ ../3rdparty/double-conversion/include/double-conversion/double-conversion.h
+ ../3rdparty/double-conversion/include/double-conversion/utils.h
+ ../3rdparty/double-conversion/strtod.cc ../3rdparty/double-conversion/strtod.h
+ INCLUDE_DIRECTORIES
+ ../3rdparty/double-conversion/..
+ ../3rdparty/double-conversion/include
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_easingcurve
+ SOURCES
+ tools/qeasingcurve.cpp tools/qeasingcurve.h
+ tools/qtimeline.cpp tools/qtimeline.h
+)
+
+qt_extend_target(Core CONDITION UNIX AND NOT HAIKU AND NOT INTEGRITY AND NOT VXWORKS AND NOT WASM AND (NOT ICC OR NOT MACOS)
+ LIBRARIES
+ m
+)
+
+qt_extend_target(Core CONDITION APPLE AND NOT NACL
+ SOURCES
+ kernel/qelapsedtimer_mac.cpp
+ text/qlocale_mac.mm
+)
+
+qt_extend_target(Core CONDITION UNIX AND (NACL OR NOT APPLE)
+ SOURCES
+ text/qlocale_unix.cpp
+)
+
+qt_extend_target(Core CONDITION WIN32 AND (NACL OR NOT APPLE)
+ SOURCES
+ text/qlocale_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_icu
+ SOURCES
+ text/qcollator_icu.cpp
+ text/qlocale_icu.cpp
+ LIBRARIES
+ ICU::i18n ICU::uc ICU::data
+)
+
+qt_extend_target(Core CONDITION WIN32 AND NOT QT_FEATURE_icu
+ SOURCES
+ text/qcollator_win.cpp
+)
+
+qt_extend_target(Core CONDITION MACOS AND NOT QT_FEATURE_icu
+ SOURCES
+ text/qcollator_macx.cpp
+)
+
+qt_extend_target(Core CONDITION UNIX AND NOT MACOS AND NOT QT_FEATURE_icu
+ SOURCES
+ text/qcollator_posix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_regularexpression
+ SOURCES
+ text/qregularexpression.cpp text/qregularexpression.h
+ LIBRARIES
+ WrapPCRE2::WrapPCRE2
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_hijricalendar
+ SOURCES
+ time/qhijricalendar.cpp time/qhijricalendar_p.h
+ time/qhijricalendar_data_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_islamiccivilcalendar
+ SOURCES
+ time/qislamiccivilcalendar.cpp time/qislamiccivilcalendar_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_jalalicalendar
+ SOURCES
+ time/qjalalicalendar.cpp time/qjalalicalendar_p.h
+ time/qjalalicalendar_data_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_timezone
+ SOURCES
+ time/qtimezone.cpp time/qtimezone.h
+ time/qtimezoneprivate.cpp time/qtimezoneprivate_p.h
+ time/qtimezoneprivate_data_p.h
+)
+
+qt_extend_target(Core CONDITION APPLE AND QT_FEATURE_timezone AND NOT NACL
+ SOURCES
+ time/qtimezoneprivate_mac.mm
+)
+
+qt_extend_target(Core CONDITION ANDROID AND QT_FEATURE_timezone AND NOT ANDROID_EMBEDDED AND (NACL OR NOT APPLE)
+ SOURCES
+ time/qtimezoneprivate_android.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_timezone AND UNIX AND (ANDROID_EMBEDDED OR NOT ANDROID) AND (NACL OR NOT APPLE)
+ SOURCES
+ time/qtimezoneprivate_tz.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_icu AND QT_FEATURE_timezone AND UNIX AND (ANDROID_EMBEDDED OR NOT ANDROID) AND (NACL OR NOT APPLE)
+ SOURCES
+ time/qtimezoneprivate_icu.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_icu AND QT_FEATURE_timezone AND WIN32 AND (ANDROID_EMBEDDED OR NOT ANDROID) AND (NACL OR NOT APPLE)
+ SOURCES
+ time/qtimezoneprivate_icu.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_timezone AND WIN32 AND NOT QT_FEATURE_icu AND (ANDROID_EMBEDDED OR NOT ANDROID) AND (NACL OR NOT APPLE)
+ SOURCES
+ time/qtimezoneprivate_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_datetimeparser
+ SOURCES
+ time/qdatetimeparser.cpp time/qdatetimeparser_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_zstd
+ LIBRARIES
+ ZSTD::ZSTD
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_filesystemwatcher
+ SOURCES
+ io/qfilesystemwatcher.cpp io/qfilesystemwatcher.h io/qfilesystemwatcher_p.h
+ io/qfilesystemwatcher_polling.cpp io/qfilesystemwatcher_polling_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_filesystemwatcher AND WIN32
+ SOURCES
+ io/qfilesystemwatcher_win.cpp io/qfilesystemwatcher_win_p.h
+)
+
+qt_extend_target(Core CONDITION MACOS AND QT_FEATURE_filesystemwatcher
+ SOURCES
+ io/qfilesystemwatcher_fsevents.mm io/qfilesystemwatcher_fsevents_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_filesystemwatcher AND QT_FEATURE_inotify AND UNIX AND NOT MACOS
+ SOURCES
+ io/qfilesystemwatcher_inotify.cpp io/qfilesystemwatcher_inotify_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_filesystemwatcher AND UNIX AND NOT MACOS AND NOT QT_FEATURE_inotify AND (APPLE OR FREEBSD OR NETBSD OR OPENBSD)
+ SOURCES
+ io/qfilesystemwatcher_kqueue.cpp io/qfilesystemwatcher_kqueue_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_processenvironment
+ SOURCES
+ io/qprocess.cpp io/qprocess.h io/qprocess_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_processenvironment AND WIN32 AND NOT WINRT
+ SOURCES
+ io/qprocess_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_processenvironment AND UNIX
+ SOURCES
+ io/qprocess_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_settings
+ SOURCES
+ io/qsettings.cpp io/qsettings.h io/qsettings_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_settings AND WIN32 AND NOT WINRT
+ SOURCES
+ io/qsettings_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_settings AND WINRT
+ SOURCES
+ io/qsettings_winrt.cpp
+)
+
+qt_extend_target(Core CONDITION APPLE AND QT_FEATURE_settings AND NOT NACL
+ SOURCES
+ io/qsettings_mac.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_settings AND WASM
+ SOURCES
+ io/qsettings_wasm.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_filesystemiterator AND WIN32
+ SOURCES
+ io/qfilesystemiterator_win.cpp
+)
+
+qt_extend_target(Core CONDITION WINRT
+ SOURCES
+ io/qstandardpaths_winrt.cpp
+ io/qstorageinfo_stub.cpp
+ kernel/qeventdispatcher_winrt.cpp kernel/qeventdispatcher_winrt_p.h
+ kernel/qfunctions_fake_env_p.h
+ kernel/qfunctions_winrt.cpp kernel/qfunctions_winrt.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_process AND UNIX
+ SOURCES
+ ../3rdparty/forkfd/forkfd.h
+ io/forkfd_qt.cpp
+ INCLUDE_DIRECTORIES
+ ../3rdparty/forkfd
+)
+
+qt_extend_target(Core CONDITION APPLE AND QT_FEATURE_processenvironment
+ SOURCES
+ io/qprocess_darwin.mm
+)
+
+qt_extend_target(Core CONDITION APPLE AND NOT MACOS
+ PUBLIC_LIBRARIES
+ ${FWMobileCoreServices}
+)
+
+qt_extend_target(Core CONDITION ANDROID AND NOT ANDROID_EMBEDDED
+ SOURCES
+ io/qstandardpaths_android.cpp
+ io/qstorageinfo_unix.cpp
+ kernel/qjni.cpp kernel/qjni_p.h
+ kernel/qjnihelpers.cpp kernel/qjnihelpers_p.h
+ kernel/qjnionload.cpp
+)
+
+qt_extend_target(Core CONDITION HAIKU AND (ANDROID_EMBEDDED OR NOT ANDROID)
+ SOURCES
+ io/qstandardpaths_haiku.cpp
+ io/qstorageinfo_unix.cpp
+ PUBLIC_LIBRARIES
+ be
+)
+
+qt_extend_target(Core CONDITION UNIX AND NOT APPLE AND NOT HAIKU AND (ANDROID_EMBEDDED OR NOT ANDROID)
+ SOURCES
+ io/qstandardpaths_unix.cpp
+ io/qstorageinfo_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_proxymodel
+ SOURCES
+ itemmodels/qabstractproxymodel.cpp itemmodels/qabstractproxymodel.h itemmodels/qabstractproxymodel_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_concatenatetablesproxymodel AND QT_FEATURE_proxymodel
+ SOURCES
+ itemmodels/qconcatenatetablesproxymodel.cpp itemmodels/qconcatenatetablesproxymodel.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_identityproxymodel AND QT_FEATURE_proxymodel
+ SOURCES
+ itemmodels/qidentityproxymodel.cpp itemmodels/qidentityproxymodel.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_proxymodel AND QT_FEATURE_sortfilterproxymodel
+ SOURCES
+ itemmodels/qsortfilterproxymodel.cpp itemmodels/qsortfilterproxymodel.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_proxymodel AND QT_FEATURE_transposeproxymodel
+ SOURCES
+ itemmodels/qtransposeproxymodel.cpp itemmodels/qtransposeproxymodel.h itemmodels/qtransposeproxymodel_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_stringlistmodel
+ SOURCES
+ itemmodels/qstringlistmodel.cpp itemmodels/qstringlistmodel.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_library
+ SOURCES
+ plugin/qelfparser_p.cpp plugin/qelfparser_p.h
+ plugin/qlibrary.cpp plugin/qlibrary.h plugin/qlibrary_p.h
+ plugin/qmachparser.cpp plugin/qmachparser_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_library AND UNIX
+ SOURCES
+ plugin/qlibrary_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_library AND WIN32
+ SOURCES
+ plugin/qlibrary_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_dlopen AND QT_FEATURE_library
+ LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
+
+qt_extend_target(Core CONDITION APPLE AND (IOS OR TVOS)
+ LIBRARIES
+ ${FWUIKit}
+)
+
+qt_extend_target(Core CONDITION WATCHOS
+ LIBRARIES
+ ${FWWatchKit}
+)
+
+qt_extend_target(Core CONDITION NACL
+ SOURCES
+ kernel/qfunctions_nacl.cpp kernel/qfunctions_nacl.h
+)
+
+qt_extend_target(Core CONDITION INTEGRITY OR (NACL AND UNIX) OR (UNIX AND NOT APPLE)
+ SOURCES
+ kernel/qelapsedtimer_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_poll_select AND UNIX
+ SOURCES
+ kernel/qpoll.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_glib AND UNIX
+ SOURCES
+ kernel/qeventdispatcher_glib.cpp kernel/qeventdispatcher_glib_p.h
+ LIBRARIES
+ GLIB2::GLIB2
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_clock_gettime AND UNIX
+ LIBRARIES
+ WrapRt
+)
+
+qt_extend_target(Core CONDITION UNIX AND NOT ANDROID
+ SOURCES
+ kernel/qsharedmemory_posix.cpp
+ kernel/qsharedmemory_systemv.cpp
+ kernel/qsharedmemory_unix.cpp
+ kernel/qsystemsemaphore_posix.cpp
+ kernel/qsystemsemaphore_systemv.cpp
+ kernel/qsystemsemaphore_unix.cpp
+)
+
+qt_extend_target(Core CONDITION VXWORKS
+ SOURCES
+ kernel/qfunctions_vxworks.cpp kernel/qfunctions_vxworks.h
+)
+
+qt_extend_target(Core CONDITION QNX AND QT_FEATURE_qqnx_pps
+ SOURCES
+ kernel/qppsattribute.cpp kernel/qppsattribute_p.h
+ kernel/qppsattributeprivate_p.h
+ kernel/qppsobject.cpp kernel/qppsobject_p.h
+ kernel/qppsobjectprivate_p.h
+ LIBRARIES
+ PPS::PPS
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_textcodec
+ SOURCES
+ codecs/qlatincodec.cpp codecs/qlatincodec_p.h
+ codecs/qsimplecodec.cpp codecs/qsimplecodec_p.h
+ codecs/qtextcodec.cpp codecs/qtextcodec.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_codecs AND QT_FEATURE_textcodec
+ SOURCES
+ codecs/qisciicodec.cpp codecs/qisciicodec_p.h
+ codecs/qtsciicodec.cpp codecs/qtsciicodec_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_icu AND QT_FEATURE_textcodec
+ SOURCES
+ codecs/qicucodec.cpp codecs/qicucodec_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_big_codecs AND QT_FEATURE_textcodec AND NOT QT_FEATURE_icu
+ SOURCES
+ codecs/qbig5codec.cpp codecs/qbig5codec_p.h
+ codecs/qeucjpcodec.cpp codecs/qeucjpcodec_p.h
+ codecs/qeuckrcodec.cpp codecs/qeuckrcodec_p.h
+ codecs/qgb18030codec.cpp codecs/qgb18030codec_p.h
+ codecs/qjiscodec.cpp codecs/qjiscodec_p.h
+ codecs/qjpunicode.cpp
+ codecs/qsjiscodec.cpp codecs/qsjiscodec_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_iconv AND QT_FEATURE_textcodec AND NOT QT_FEATURE_icu
+ SOURCES
+ codecs/qiconvcodec.cpp codecs/qiconvcodec_p.h
+ LIBRARIES
+ iconv
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_textcodec AND WIN32 AND NOT QT_FEATURE_icu
+ SOURCES
+ codecs/qwindowscodec.cpp codecs/qwindowscodec_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_cborstreamreader
+ SOURCES
+ serialization/qcborstreamreader.cpp serialization/qcborstreamreader.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_cborstreamwriter
+ SOURCES
+ serialization/qcborstreamwriter.cpp serialization/qcborstreamwriter.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_binaryjson
+ SOURCES
+ serialization/qbinaryjson.cpp serialization/qbinaryjson_p.h
+ serialization/qbinaryjsonarray.cpp serialization/qbinaryjsonarray_p.h
+ serialization/qbinaryjsonobject.cpp serialization/qbinaryjsonobject_p.h
+ serialization/qbinaryjsonvalue.cpp serialization/qbinaryjsonvalue_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_qeventtransition
+ SOURCES
+ statemachine/qeventtransition.cpp statemachine/qeventtransition.h statemachine/qeventtransition_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_mimetype
+ SOURCES
+ mimetypes/qmimedatabase.cpp mimetypes/qmimedatabase.h mimetypes/qmimedatabase_p.h
+ mimetypes/qmimeglobpattern.cpp mimetypes/qmimeglobpattern_p.h
+ mimetypes/qmimemagicrule.cpp mimetypes/qmimemagicrule_p.h
+ mimetypes/qmimemagicrulematcher.cpp mimetypes/qmimemagicrulematcher_p.h
+ mimetypes/qmimeprovider.cpp mimetypes/qmimeprovider_p.h
+ mimetypes/qmimetype.cpp mimetypes/qmimetype.h mimetypes/qmimetype_p.h
+ mimetypes/qmimetypeparser.cpp mimetypes/qmimetypeparser_p.h
+)
+
+#### Keys ignored in scope 197:.:mimetypes:mimetypes/mimetypes.pri:QT_FEATURE_mimetype:
+# MIME_DATABASE = "mimetypes/mime/packages/freedesktop.org.xml"
+# OTHER_FILES = "$$MIME_DATABASE"
+
+qt_extend_target(Core CONDITION QT_FEATURE_mimetype AND QT_FEATURE_mimetype_database
+ INCLUDE_DIRECTORIES
+ .rcc
+)
+
+#### Keys ignored in scope 198:.:mimetypes:mimetypes/mimetypes.pri:QT_FEATURE_mimetype_database:
+# QMAKE_EXTRA_COMPILERS = "mimedb"
+# mimedb.commands = "${QMAKE_FILE_IN}" ">" "${QMAKE_FILE_OUT}"
+# mimedb.depends = "$$PWD/mime/generate.pl"
+# mimedb.input = "MIME_DATABASE"
+# mimedb.output = "$$outpath/qmimeprovider_database.cpp"
+# mimedb.variable_out = "INCLUDED_SOURCES"
+
+#### Keys ignored in scope 199:.:mimetypes:mimetypes/mimetypes.pri:ANDROID:
+# outpath = "$$outpath/$${QT_ARCH}"
+
+#### Keys ignored in scope 201:.:mimetypes:mimetypes/mimetypes.pri:(CMAKE_BUILD_TYPE STREQUAL Debug):
+# outpath = "$$outpath/debug"
+
+#### Keys ignored in scope 202:.:mimetypes:mimetypes/mimetypes.pri:else:
+# outpath = "$$outpath/release"
+
+#### Keys ignored in scope 203:.:mimetypes:mimetypes/mimetypes.pri:MAKEFILE_GENERATOR___equals___MSVC.NET OR MAKEFILE_GENERATOR___equals___MSBUILD OR QMAKE_SH_ISEMPTY:
+# mimedb.commands = "cmd" "/c" "$$shell_path($$PWD/mime/generate.bat)"
+# mimedb.depends = "$$PWD/mime/generate.bat" "$$PWD/mime/hexdump.ps1"
+
+#### Keys ignored in scope 204:.:mimetypes:mimetypes/mimetypes.pri:else:
+# mimedb.commands = "perl" "$${mimedb.depends}"
+
+#### Keys ignored in scope 205:.:mimetypes:mimetypes/mimetypes.pri:QT_FEATURE_zstd:
+# mimedb.commands = "--zstd"
+
+qt_extend_target(Core CONDITION WASM
+ SOURCES
+ platform/wasm/qstdweb.cpp platform/wasm/qstdweb_p.h
+)
+
+
+qt_create_tracepoints(Core qtcore.tracepoints)
+qt_add_docs(Core
+ doc/qtcore.qdocconf
+)
+
diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt
new file mode 100644
index 0000000000..911772faca
--- /dev/null
+++ b/src/corelib/CMakeLists.txt
@@ -0,0 +1,1316 @@
+# Generated from corelib.pro.
+
+# special case begin
+qt_find_package(Threads PROVIDED_TARGETS Threads::Threads)
+qt_find_package(WrapPCRE2 PROVIDED_TARGETS WrapPCRE2::WrapPCRE2)
+
+
+# compute the reverse relative path from QtCoreConfigExtras to the install prefix
+# this is used in QtCoreConfigExtras to make its install paths relocatable
+if(QT_WILL_INSTALL)
+ get_filename_component(_clean_prefix "${CMAKE_INSTALL_PREFIX}/${QT_CONFIG_INSTALL_DIR}" ABSOLUTE)
+else()
+ get_filename_component(_clean_prefix "${QT_CONFIG_BUILD_DIR}" ABSOLUTE)
+endif()
+file(RELATIVE_PATH QT_INVERSE_CONFIG_INSTALL_DIR ${_clean_prefix} ${CMAKE_INSTALL_PREFIX})
+
+# special case end
+
+#####################################################################
+## Core Module:
+#####################################################################
+
+qt_add_module(Core
+ GENERATE_METATYPES
+ QMAKE_MODULE_CONFIG moc resources
+ EXCEPTIONS
+ SOURCES
+ codecs/qtextcodec_p.h
+ codecs/qutfcodec.cpp codecs/qutfcodec_p.h
+ global/archdetect.cpp
+ global/qcompilerdetection.h
+ global/qendian.cpp global/qendian.h global/qendian_p.h
+ global/qflags.h
+ global/qfloat16.cpp global/qfloat16.h
+ global/qglobal.cpp global/qglobal.h
+ global/qglobalstatic.h
+ global/qhooks.cpp global/qhooks_p.h
+ global/qisenum.h
+ global/qlibraryinfo.cpp global/qlibraryinfo.h
+ global/qlogging.cpp global/qlogging.h
+ global/qmalloc.cpp
+ global/qmemory_p.h
+ # global/qnamespace.h # special case
+ global/qnumeric.cpp global/qnumeric.h global/qnumeric_p.h
+ global/qoperatingsystemversion.cpp global/qoperatingsystemversion.h global/qoperatingsystemversion_p.h
+ global/qprocessordetection.h
+ global/qrandom.cpp global/qrandom.h global/qrandom_p.h
+ global/qsimd.cpp global/qsimd.h global/qsimd_p.h
+ global/qsysinfo.h
+ global/qsystemdetection.h
+ global/qtypeinfo.h
+ global/qtypetraits.h
+ global/qversiontagging.cpp global/qversiontagging.h # special case
+ io/qabstractfileengine.cpp io/qabstractfileengine_p.h
+ io/qbuffer.cpp io/qbuffer.h
+ io/qdataurl.cpp io/qdataurl_p.h
+ io/qdebug.cpp io/qdebug.h io/qdebug_p.h
+ io/qdir.cpp io/qdir.h io/qdir_p.h
+ io/qdiriterator.cpp io/qdiriterator.h
+ io/qfile.cpp io/qfile.h
+ io/qfiledevice.cpp io/qfiledevice.h io/qfiledevice_p.h
+ io/qfileinfo.cpp io/qfileinfo.h io/qfileinfo_p.h
+ io/qfileselector.cpp io/qfileselector.h io/qfileselector_p.h
+ io/qfilesystemengine.cpp io/qfilesystemengine_p.h
+ io/qfilesystementry.cpp io/qfilesystementry_p.h
+ io/qfilesystemiterator_p.h
+ io/qfilesystemmetadata_p.h
+ io/qfsfileengine.cpp io/qfsfileengine_p.h
+ io/qfsfileengine_iterator.cpp io/qfsfileengine_iterator_p.h
+ io/qiodevice.cpp io/qiodevice.h io/qiodevice_p.h
+ io/qipaddress.cpp io/qipaddress_p.h
+ io/qlockfile.cpp io/qlockfile.h io/qlockfile_p.h
+ io/qloggingcategory.cpp io/qloggingcategory.h
+ io/qloggingregistry.cpp io/qloggingregistry_p.h
+ io/qnoncontiguousbytedevice.cpp io/qnoncontiguousbytedevice_p.h
+ io/qresource.cpp io/qresource_p.h
+ io/qresource_iterator.cpp io/qresource_iterator_p.h
+ io/qsavefile.cpp io/qsavefile.h
+ io/qstandardpaths.cpp io/qstandardpaths.h
+ io/qstorageinfo.cpp io/qstorageinfo.h io/qstorageinfo_p.h
+ io/qtemporarydir.cpp io/qtemporarydir.h
+ io/qtemporaryfile.cpp io/qtemporaryfile.h io/qtemporaryfile_p.h
+ io/qurl.cpp io/qurl.h io/qurl_p.h
+ io/qurlidna.cpp
+ io/qurlquery.cpp io/qurlquery.h
+ io/qurlrecode.cpp
+ itemmodels/qabstractitemmodel.cpp itemmodels/qabstractitemmodel.h itemmodels/qabstractitemmodel_p.h
+ itemmodels/qitemselectionmodel.cpp itemmodels/qitemselectionmodel.h itemmodels/qitemselectionmodel_p.h
+ kernel/qabstracteventdispatcher.cpp kernel/qabstracteventdispatcher.h kernel/qabstracteventdispatcher_p.h
+ kernel/qabstractnativeeventfilter.cpp kernel/qabstractnativeeventfilter.h
+ kernel/qbasictimer.cpp kernel/qbasictimer.h
+ kernel/qcoreapplication.cpp kernel/qcoreapplication.h kernel/qcoreapplication_p.h
+ kernel/qcorecmdlineargs_p.h
+ kernel/qcoreevent.cpp kernel/qcoreevent.h
+ kernel/qcoreglobaldata.cpp kernel/qcoreglobaldata_p.h
+ kernel/qdeadlinetimer.cpp kernel/qdeadlinetimer.h kernel/qdeadlinetimer_p.h
+ kernel/qelapsedtimer.cpp kernel/qelapsedtimer.h
+ kernel/qeventloop.cpp kernel/qeventloop.h
+ kernel/qfunctions_p.h
+ kernel/qmath.cpp kernel/qmath.h
+ kernel/qmetaobject.cpp kernel/qmetaobject.h kernel/qmetaobject_p.h
+ kernel/qmetaobject_moc_p.h
+ kernel/qmetaobjectbuilder.cpp kernel/qmetaobjectbuilder_p.h
+ kernel/qmetatype.cpp kernel/qmetatype.h kernel/qmetatype_p.h
+ kernel/qmetatypeswitcher_p.h
+ kernel/qmimedata.cpp kernel/qmimedata.h
+ # kernel/qobject.cpp kernel/qobject.h kernel/qobject_p.h # special case
+ kernel/qobject_impl.h
+ kernel/qobjectcleanuphandler.cpp kernel/qobjectcleanuphandler.h
+ kernel/qobjectdefs.h
+ kernel/qobjectdefs_impl.h
+ kernel/qpointer.cpp kernel/qpointer.h
+ kernel/qproperty.cpp kernel/qproperty.h kernel/qproperty_p.h
+ kernel/qpropertybinding.cpp kernel/qpropertybinding_p.h
+ kernel/qpropertyprivate.h
+ kernel/qsharedmemory.cpp kernel/qsharedmemory.h kernel/qsharedmemory_p.h
+ kernel/qsignalmapper.cpp kernel/qsignalmapper.h
+ kernel/qsocketnotifier.cpp kernel/qsocketnotifier.h
+ kernel/qsystemerror.cpp kernel/qsystemerror_p.h
+ kernel/qsystemsemaphore.cpp kernel/qsystemsemaphore.h kernel/qsystemsemaphore_p.h
+ kernel/qtestsupport_core.cpp kernel/qtestsupport_core.h
+ kernel/qtimer.cpp kernel/qtimer.h
+ kernel/qtranslator.cpp kernel/qtranslator.h kernel/qtranslator_p.h
+ kernel/qvariant.cpp kernel/qvariant.h kernel/qvariant_p.h
+ plugin/qfactoryinterface.cpp plugin/qfactoryinterface.h
+ plugin/qfactoryloader.cpp plugin/qfactoryloader_p.h
+ plugin/qplugin.h plugin/qplugin_p.h
+ plugin/qpluginloader.cpp plugin/qpluginloader.h
+ plugin/quuid.cpp plugin/quuid.h
+ serialization/qcborarray.h
+ serialization/qcborcommon.cpp serialization/qcborcommon.h serialization/qcborcommon_p.h
+ serialization/qcbordiagnostic.cpp
+ serialization/qcbormap.h
+ serialization/qcborstream.h
+ serialization/qcborvalue.cpp serialization/qcborvalue.h serialization/qcborvalue_p.h
+ serialization/qdatastream.cpp serialization/qdatastream.h serialization/qdatastream_p.h
+ serialization/qjson_p.h
+ serialization/qjsonarray.cpp serialization/qjsonarray.h
+ serialization/qjsoncbor.cpp
+ serialization/qjsondocument.cpp serialization/qjsondocument.h
+ serialization/qjsonobject.cpp serialization/qjsonobject.h
+ serialization/qjsonparser.cpp serialization/qjsonparser_p.h
+ serialization/qjsonvalue.cpp serialization/qjsonvalue.h
+ serialization/qjsonwriter.cpp serialization/qjsonwriter_p.h
+ serialization/qtextstream.cpp serialization/qtextstream.h serialization/qtextstream_p.h
+ serialization/qxmlstream.cpp serialization/qxmlstream.h serialization/qxmlstream_p.h
+ serialization/qxmlutils.cpp serialization/qxmlutils_p.h
+ statemachine/qabstractstate.cpp statemachine/qabstractstate.h statemachine/qabstractstate_p.h
+ statemachine/qabstracttransition.cpp statemachine/qabstracttransition.h statemachine/qabstracttransition_p.h
+ statemachine/qfinalstate.cpp statemachine/qfinalstate.h statemachine/qfinalstate_p.h
+ statemachine/qhistorystate.cpp statemachine/qhistorystate.h statemachine/qhistorystate_p.h
+ statemachine/qsignaleventgenerator_p.h
+ statemachine/qsignaltransition.cpp statemachine/qsignaltransition.h statemachine/qsignaltransition_p.h
+ statemachine/qstate.cpp statemachine/qstate.h statemachine/qstate_p.h
+ statemachine/qstatemachine.cpp statemachine/qstatemachine.h statemachine/qstatemachine_p.h
+ text/qbytearray.cpp text/qbytearray.h text/qbytearray_p.h
+ text/qbytearraylist.cpp text/qbytearraylist.h
+ text/qbytearraymatcher.cpp text/qbytearraymatcher.h
+ text/qbytedata_p.h
+ text/qchar.h
+ text/qcollator.cpp text/qcollator.h text/qcollator_p.h
+ text/qdoublescanprint_p.h
+ text/qlocale.cpp text/qlocale.h text/qlocale_p.h
+ text/qlocale_data_p.h
+ text/qlocale_tools.cpp text/qlocale_tools_p.h
+ text/qregexp.cpp text/qregexp.h
+ text/qstring.cpp text/qstring.h
+ text/qstring_compat.cpp
+ text/qstringalgorithms.h text/qstringalgorithms_p.h
+ text/qstringbuilder.cpp text/qstringbuilder.h
+ text/qstringiterator_p.h
+ text/qstringlist.cpp text/qstringlist.h
+ text/qstringliteral.h
+ text/qstringmatcher.h
+ text/qstringview.cpp text/qstringview.h
+ text/qtextboundaryfinder.cpp text/qtextboundaryfinder.h
+ text/qunicodetables_p.h
+ text/qunicodetools.cpp text/qunicodetools_p.h
+ text/qvsnprintf.cpp
+ thread/qmutex.h
+ thread/qreadwritelock.h
+ thread/qrunnable.cpp thread/qrunnable.h
+ thread/qthread.cpp thread/qthread.h
+ thread/qthreadstorage.h
+ thread/qwaitcondition.h thread/qwaitcondition_p.h
+ time/qcalendar.cpp time/qcalendar.h
+ time/qcalendarbackend_p.h
+ time/qcalendarmath_p.h
+ time/qdatetime.cpp time/qdatetime.h time/qdatetime_p.h
+ time/qgregoriancalendar.cpp time/qgregoriancalendar_p.h
+ time/qjuliancalendar.cpp time/qjuliancalendar_p.h
+ time/qmilankoviccalendar.cpp time/qmilankoviccalendar_p.h
+ time/qromancalendar.cpp time/qromancalendar_p.h
+ time/qromancalendar_data_p.h
+ tools/qalgorithms.h
+ tools/qarraydata.cpp tools/qarraydata.h
+ tools/qarraydataops.h
+ tools/qarraydatapointer.h
+ tools/qbitarray.cpp tools/qbitarray.h
+ tools/qcache.h
+ tools/qcontainerfwd.h
+ tools/qcontainertools_impl.h
+ tools/qcontiguouscache.cpp tools/qcontiguouscache.h
+ tools/qcryptographichash.cpp tools/qcryptographichash.h
+ tools/qduplicatetracker_p.h
+ tools/qflatmap_p.h
+ tools/qfreelist.cpp tools/qfreelist_p.h
+ tools/qhash.cpp tools/qhash.h
+ tools/qhashfunctions.h
+ tools/qiterator.h
+ tools/qline.cpp tools/qline.h
+ tools/qlist.cpp tools/qlist.h
+ tools/qmakearray_p.h
+ tools/qmap.cpp tools/qmap.h
+ tools/qmargins.cpp tools/qmargins.h
+ tools/qmessageauthenticationcode.cpp tools/qmessageauthenticationcode.h
+ tools/qoffsetstringarray_p.h
+ tools/qpair.h
+ tools/qpoint.cpp tools/qpoint.h
+ tools/qqueue.h
+ tools/qrect.cpp tools/qrect.h
+ tools/qrefcount.cpp tools/qrefcount.h
+ tools/qringbuffer.cpp tools/qringbuffer_p.h
+ tools/qscopedpointer.h tools/qscopedpointer_p.h
+ tools/qscopedvaluerollback.h
+ tools/qscopeguard.h
+ tools/qset.h
+ tools/qshareddata.cpp tools/qshareddata.h
+ tools/qsharedpointer.cpp tools/qsharedpointer.h
+ tools/qsharedpointer_impl.h
+ tools/qsize.cpp tools/qsize.h
+ tools/qstack.h
+ tools/qtaggedpointer.h
+ tools/qtools_p.h
+ tools/qvarlengtharray.h
+ tools/qvector.h
+ tools/qversionnumber.cpp tools/qversionnumber.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ INCLUDE_DIRECTORIES
+ "${CMAKE_CURRENT_BINARY_DIR}/global" # special case
+ # ../3rdparty/md4 # special case remove
+ # ../3rdparty/md5 # special case remove
+ # ../3rdparty/sha3 # special case remove
+ ../3rdparty/tinycbor/src
+ PRECOMPILED_HEADER
+ global/qt_pch.h
+ NO_PCH_SOURCES
+ "text/qstring_compat.cpp"
+ LIBRARIES
+ Qt::GlobalConfigPrivate # special case
+ Threads::Threads # special case
+ PUBLIC_LIBRARIES # special case:
+ Qt::Platform # special case:
+)
+
+# special case begin
+add_dependencies(Core ${QT_CMAKE_EXPORT_NAMESPACE}::moc)
+add_dependencies(Core ${QT_CMAKE_EXPORT_NAMESPACE}::rcc)
+add_dependencies(CorePrivate ${QT_CMAKE_EXPORT_NAMESPACE}::moc)
+add_dependencies(CorePrivate ${QT_CMAKE_EXPORT_NAMESPACE}::rcc)
+
+if (QT_NAMESPACE STREQUAL "")
+else()
+ target_compile_definitions(Core PUBLIC "QT_NAMESPACE=${QT_NAMESPACE}")
+endif()
+
+qt_generate_qconfig_cpp()
+
+# Handle QObject: Automoc does not work for this as it would
+# require to spill internals into users:
+qt_add_module(Core_qobject STATIC
+ NO_SYNC_QT
+ NO_CONFIG_HEADER_FILE
+ NO_MODULE_HEADERS
+ INTERNAL_MODULE
+ SKIP_DEPENDS_INCLUDE
+)
+set_target_properties(Core_qobject PROPERTIES AUTOMOC OFF)
+qt_manual_moc(qobject_moc_files OUTPUT_MOC_JSON_FILES core_qobject_metatypes_json_list kernel/qobject.h global/qnamespace.h)
+set_source_files_properties(${qobject_moc_files} PROPERTIES HEADER_FILE_ONLY ON)
+target_sources(Core_qobject PRIVATE
+ global/qnamespace.h
+ kernel/qobject.cpp kernel/qobject.h kernel/qobject_p.h ${qobject_moc_files})
+set_target_properties(Core_qobject PROPERTIES
+ COMPILE_OPTIONS $<TARGET_PROPERTY:Core,COMPILE_OPTIONS>
+ COMPILE_DEFINITIONS $<TARGET_PROPERTY:Core,COMPILE_DEFINITIONS>
+ INCLUDE_DIRECTORIES $<TARGET_PROPERTY:Core,INCLUDE_DIRECTORIES>
+)
+target_include_directories(Core_qobject PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/kernel") # for moc_qobject.cpp
+target_link_libraries(Core_qobject PRIVATE Qt::Platform Qt::GlobalConfig)
+extend_target(Core LIBRARIES Qt::Core_qobject)
+add_dependencies(Core_qobject ${QT_CMAKE_EXPORT_NAMESPACE}::moc)
+
+set(core_qobject_metatypes_json_args)
+if (NOT QT_WILL_INSTALL)
+ set(core_qobject_metatypes_json_args INSTALL_DIR "${QT_BUILD_DIR}/${INSTALL_LIBDIR}/metatypes")
+endif()
+
+qt6_generate_meta_types_json_file(Core_qobject
+ MANUAL_MOC_JSON_FILES ${core_qobject_metatypes_json_list}
+ ${core_qobject_metatypes_json_args}
+)
+
+# Core_qobject is never exported so we need to duplicate the metatypes file
+# interface on Core
+get_target_property(core_qobject_metatypes_file_genex_build Core_qobject QT_MODULE_META_TYPES_FILE_GENEX_BUILD)
+get_target_property(core_qobject_metatypes_file_genex_install Core_qobject QT_MODULE_META_TYPES_FILE_GENEX_INSTALL)
+target_sources(Core INTERFACE
+ ${core_qobject_metatypes_file_genex_build}
+ ${core_qobject_metatypes_file_genex_install}
+)
+
+set_property(TARGET Core APPEND PROPERTY
+ PUBLIC_HEADER "${CMAKE_CURRENT_BINARY_DIR}/global/qconfig.h")
+set_property(TARGET Core APPEND PROPERTY
+ PRIVATE_HEADER "${CMAKE_CURRENT_BINARY_DIR}/global/qconfig_p.h")
+
+# Find ELF interpreter and define a macro for that:
+if (LINUX AND NOT CMAKE_CROSSCOMPILING AND BUILD_SHARED_LIBS)
+ if (NOT DEFINED ELF_INTERPRETER)
+ execute_process(COMMAND ${CMAKE_COMMAND} -E env LC_ALL=C readelf -l /bin/ls
+ RESULT_VARIABLE readelf_ok
+ OUTPUT_VARIABLE readelf_output
+ )
+ if ("${readelf_ok}" STREQUAL "0"
+ AND "${readelf_output}" MATCHES "program interpreter: (.*)]")
+ set(ELF_INTERPRETER "${CMAKE_MATCH_1}" CACHE INTERNAL "ELF interpreter location")
+ else()
+ set(ELF_INTERPRETER "" CACHE INTERNAL "ELF interpreter location")
+ endif()
+ endif()
+ if (ELF_INTERPRETER)
+ target_link_options(Core PRIVATE "-Wl,-e,qt_core_boilerplate")
+ target_compile_definitions(Core PRIVATE ELF_INTERPRETER="${ELF_INTERPRETER}")
+ endif()
+endif()
+# special case end
+
+qt_add_simd_part(Core SIMD mips_dsp
+ SOURCES
+ ../gui/painting/qt_mips_asm_dsp_p.h
+ text/qstring_mips_dsp_asm.S
+)
+
+if(QT_FEATURE_reduce_relocations AND UNIX AND GCC)
+ target_link_options(Core PRIVATE
+ "LINKER:--dynamic-list=${CMAKE_CURRENT_LIST_DIR}/QtCore.dynlist")
+endif()
+
+if(ANDROID)
+ set_property(TARGET Core APPEND PROPERTY QT_ANDROID_BUNDLED_JAR_DEPENDENCIES
+ jar/QtAndroid.jar
+ )
+ set_property(TARGET Core APPEND PROPERTY QT_ANDROID_LIB_DEPENDENCIES
+ plugins/platforms/libplugins_platforms_qtforandroid.so
+ )
+ set_property(TARGET Core APPEND PROPERTY QT_ANDROID_PERMISSIONS
+ android.permission.INTERNET android.permission.WRITE_EXTERNAL_STORAGE
+ )
+endif()
+
+#### Keys ignored in scope 1:.:.:corelib.pro:<TRUE>:
+# CMAKE_DISABLED_FEATURES = "$$join(QT_DISABLED_FEATURES, "$$escape_expand(\\n) ")"
+# CMAKE_HOST_DATA_DIR = "$$cmakeRelativePath($$[QT_HOST_DATA/src], $$[QT_INSTALL_PREFIX])"
+# CMAKE_INSTALL_DATA_DIR = "$$cmakeRelativePath($$[QT_HOST_DATA], $$[QT_INSTALL_PREFIX])"
+# HOST_BINS = "$$[QT_HOST_BINS]"
+# INSTALLS = "ctest_qt5_module_files" "cmake_qt5_umbrella_module_files"
+# MODULE = "core"
+# MODULE_CONFIG = "moc" "resources"
+# QMAKE_DSYM_DEBUG_SCRIPT = "$$PWD/debug_script.py"
+# QMAKE_PKGCONFIG_VARIABLES = "host_bins" "qt_conf"
+# QMAKE_SUBSTITUTES = "ctest_macros_file" "cmake_umbrella_config_file" "cmake_umbrella_config_module_location" "cmake_umbrella_config_module_location_for_install" "cmake_umbrella_config_version_file" "cmake_extras_mkspec_dir" "cmake_extras_mkspec_dir_for_install"
+# cmake_extras_mkspec_dir.input = "$$PWD/Qt5CoreConfigExtrasMkspecDir.cmake.in"
+# cmake_extras_mkspec_dir.output = "$$DESTDIR/cmake/Qt5Core/Qt5CoreConfigExtrasMkspecDir.cmake"
+# cmake_extras_mkspec_dir_for_install.input = "$$PWD/Qt5CoreConfigExtrasMkspecDirForInstall.cmake.in"
+# cmake_extras_mkspec_dir_for_install.output = "$$DESTDIR/cmake/install/Qt5Core/Qt5CoreConfigExtrasMkspecDir.cmake"
+# cmake_qt5_umbrella_module_files.files = "$$cmake_umbrella_config_file.output" "$$cmake_umbrella_config_version_file.output" "$$cmake_umbrella_config_module_location_for_install.output"
+# cmake_qt5_umbrella_module_files.path = "$$[QT_INSTALL_LIBS]/cmake/Qt5"
+# cmake_umbrella_config_file.input = "$$PWD/Qt5Config.cmake.in"
+# cmake_umbrella_config_file.output = "$$DESTDIR/cmake/Qt5/Qt5Config.cmake"
+# cmake_umbrella_config_module_location.input = "$$PWD/Qt5ModuleLocation.cmake.in"
+# cmake_umbrella_config_module_location.output = "$$DESTDIR/cmake/Qt5/Qt5ModuleLocation.cmake"
+# cmake_umbrella_config_module_location_for_install.input = "$$PWD/Qt5ModuleLocationForInstall.cmake.in"
+# cmake_umbrella_config_module_location_for_install.output = "$$DESTDIR/cmake/install/Qt5/Qt5ModuleLocation.cmake"
+# cmake_umbrella_config_version_file.input = "$$PWD/../../mkspecs/features/data/cmake/Qt5ConfigVersion.cmake.in"
+# cmake_umbrella_config_version_file.output = "$$DESTDIR/cmake/Qt5/Qt5ConfigVersion.cmake"
+# ctest_macros_file.CONFIG = "verbatim"
+# ctest_macros_file.input = "$$PWD/Qt5CTestMacros.cmake"
+# ctest_macros_file.output = "$$DESTDIR/cmake/Qt5Core/Qt5CTestMacros.cmake"
+# ctest_qt5_module_files.files = "$$ctest_macros_file.output" "$$cmake_extras_mkspec_dir_for_install.output"
+# ctest_qt5_module_files.path = "$$[QT_INSTALL_LIBS]/cmake/Qt5Core"
+# host_bins.name = "host_bins"
+# host_bins.variable = "HOST_BINS"
+# qt_conf.name = "qt_config"
+# qt_conf.variable = "QT_CONFIG"
+
+## Scopes:
+#####################################################################
+
+#### Keys ignored in scope 2:.:.:corelib.pro:QT_FEATURE_gc_binaries:
+# MODULE_CONFIG = "gc_binaries"
+
+# special case begin
+# remove because it's handled manually
+#qt_extend_target(Core CONDITION NOT QT_NAMESPACE_ISEMPTY
+# PUBLIC_DEFINES
+# QT_NAMESPACE=
+#)
+# special case end
+
+qt_extend_target(Core CONDITION ANDROID
+ SOURCES
+ kernel/qsharedmemory_android.cpp
+ kernel/qsystemsemaphore_android.cpp
+ DEFINES
+ LIBS_SUFFIX="_${CMAKE_SYSTEM_PROCESSOR}.so"
+)
+
+qt_extend_target(Core CONDITION MSVC AND (TEST_architecture_arch STREQUAL "i386")
+ LINK_OPTIONS
+ "/BASE:0x67000000"
+)
+
+#### Keys ignored in scope 6:.:.:corelib.pro:FREEBSD OR OPENBSD:
+# QMAKE_LFLAGS_NOUNDEF = <EMPTY>
+
+qt_extend_target(Core CONDITION QT_FEATURE_animation
+ SOURCES
+ animation/qabstractanimation.cpp animation/qabstractanimation.h animation/qabstractanimation_p.h
+ animation/qanimationgroup.cpp animation/qanimationgroup.h animation/qanimationgroup_p.h
+ animation/qparallelanimationgroup.cpp animation/qparallelanimationgroup.h animation/qparallelanimationgroup_p.h
+ animation/qpauseanimation.cpp animation/qpauseanimation.h
+ animation/qpropertyanimation.cpp animation/qpropertyanimation.h animation/qpropertyanimation_p.h
+ animation/qsequentialanimationgroup.cpp animation/qsequentialanimationgroup.h animation/qsequentialanimationgroup_p.h
+ animation/qvariantanimation.cpp animation/qvariantanimation.h animation/qvariantanimation_p.h
+)
+
+qt_extend_target(Core CONDITION WIN32
+ SOURCES
+ global/qoperatingsystemversion_win.cpp global/qoperatingsystemversion_win_p.h
+ io/qfilesystemengine_win.cpp
+ io/qfsfileengine_win.cpp
+ io/qlockfile_win.cpp
+ kernel/qcoreapplication_win.cpp
+ kernel/qelapsedtimer_win.cpp
+ kernel/qsharedmemory_win.cpp
+ kernel/qsystemsemaphore_win.cpp
+ kernel/qwineventnotifier.cpp kernel/qwineventnotifier.h kernel/qwineventnotifier_p.h
+ plugin/qsystemlibrary.cpp plugin/qsystemlibrary_p.h
+ thread/qatomic_msvc.h
+ thread/qthread_win.cpp
+ # DEFINES # special case: remove
+ LIBRARIES
+ ws2_32
+)
+
+qt_extend_target(Core CONDITION WIN32 AND NOT WINRT
+ SOURCES
+ io/qstandardpaths_win.cpp
+ io/qstorageinfo_win.cpp
+ io/qwindowspipereader.cpp io/qwindowspipereader_p.h
+ io/qwindowspipewriter.cpp io/qwindowspipewriter_p.h
+ kernel/qeventdispatcher_win.cpp kernel/qeventdispatcher_win_p.h
+ kernel/qwinregistry.cpp kernel/qwinregistry_p.h
+ LIBRARIES
+ advapi32
+ kernel32
+ netapi32
+ ole32
+ shell32
+ user32
+ uuid
+ version
+ winmm
+ PUBLIC_LIBRARIES
+ mpr
+ userenv
+)
+
+qt_extend_target(Core CONDITION APPLE
+ SOURCES
+ global/qoperatingsystemversion_darwin.mm
+ io/qfilesystemengine_mac.mm
+ io/qstandardpaths_mac.mm
+ io/qstorageinfo_mac.cpp
+ kernel/qcfsocketnotifier.cpp kernel/qcfsocketnotifier_p.h
+ kernel/qcore_foundation.mm
+ kernel/qcore_mac.mm kernel/qcore_mac_p.h
+ kernel/qcoreapplication_mac.cpp
+ kernel/qeventdispatcher_cf.mm kernel/qeventdispatcher_cf_p.h
+ LIBRARIES
+ ${FWCoreFoundation}
+ ${FWFoundation}
+)
+
+qt_extend_target(Core CONDITION MACOS
+ LIBRARIES
+ ${FWAppKit}
+ ${FWApplicationServices}
+ ${FWCoreServices}
+ ${FWSecurity}
+ PUBLIC_LIBRARIES
+ ${FWDiskArbitration}
+ ${FWIOKit}
+)
+
+qt_extend_target(Core CONDITION INTEGRITY
+ LIBRARIES
+ ivfs
+ net
+ posix
+ shm_client
+ socket
+ COMPILE_OPTIONS
+ --pending_instantiations=128
+)
+
+#### Keys ignored in scope 15:.:.:corelib.pro:pathIsAbsolute(_ss_CMAKE_HOST_DATA_DIR):
+# CMAKE_HOST_DATA_DIR = "$$[QT_HOST_DATA/src]/"
+# CMAKE_HOST_DATA_DIR_IS_ABSOLUTE = "True"
+
+#### Keys ignored in scope 16:.:.:corelib.pro:pathIsAbsolute(_ss_CMAKE_INSTALL_DATA_DIR):
+# CMAKE_INSTALL_DATA_DIR = "$$[QT_HOST_DATA]/"
+# CMAKE_INSTALL_DATA_DIR_IS_ABSOLUTE = "True"
+
+#### Keys ignored in scope 21:.:global:global/global.pri:QT_CPU_FEATURES__ss_QT_ARCH___contains___f16c:
+# f16c_cxx = "true"
+
+#### Keys ignored in scope 23:.:global:global/global.pri:CLANG OR intel_icl OR ICC:
+# f16c_cxx = "false"
+
+#### Keys ignored in scope 25:.:global:global/global.pri:GCC AND f16c AND x86SimdAlways:
+# f16c_cxx = "true"
+
+#### Keys ignored in scope 27:.:global:global/global.pri:MSVC AND QT_CPU_FEATURES__ss_QT_ARCH___contains___avx:
+# f16c_cxx = "true"
+
+#### Keys ignored in scope 28:.:global:global/global.pri:else:
+# f16c_cxx = "false"
+
+# extend_target(Core CONDITION _ss_f16c_cxx ... # special case remove: Handled manually
+
+# special case begin
+# Remove this because it's handled manually
+#extend_target(Core CONDITION NOT _x_-armcc_x_ AND NOT cross_compile AND NOT static AND (hurd_x_ OR linux_x_)
+# DEFINES
+# ELF_INTERPRETER=\\\"=Creadelf-l/bin/ls|perl-n-e\'['quote', ['if', ['/program', 'interpreter:', ['.*'], ']/'], '{', 'print', '$1;', '}']]\'\\\"
+# LINK_OPTIONS
+# "-Wl,-e,qt_core_boilerplate"
+#)
+# special case end
+
+qt_extend_target(Core CONDITION LINUX AND NOT static
+ SOURCES
+ global/minimum-linux_p.h
+)
+
+#### Keys ignored in scope 35:.:global:global/global.pri:precompile_header:
+# NO_PCH_ASM = "global/minimum-linux.S"
+# QMAKE_EXTRA_COMPILERS = "no_pch_assembler"
+# no_pch_assembler.commands = "$$QMAKE_CC" "-c" "$(CFLAGS)" "$(INCPATH)" "${QMAKE_FILE_IN}" "-o" "${QMAKE_FILE_OUT}"
+# no_pch_assembler.dependency_type = "TYPE_C"
+# no_pch_assembler.input = "NO_PCH_ASM"
+# no_pch_assembler.name = "compiling[no_pch]" "${QMAKE_FILE_IN}"
+# no_pch_assembler.output = "${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${firstQMAKE_EXT_OBJ}"
+
+#### Keys ignored in scope 36:.:global:global/global.pri:silent:
+# no_pch_assembler.commands = "@echo" "compiling[no_pch]" "${QMAKE_FILE_IN}" "&&"
+
+qt_extend_target(Core CONDITION LINUX AND NOT precompile_header AND NOT static
+ SOURCES
+ global/minimum-linux.S
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_slog2
+ LIBRARIES
+ Slog2::Slog2
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_journald
+ LIBRARIES
+ PkgConfig::Libsystemd
+)
+
+#### Keys ignored in scope 40:.:global:global/global.pri:GCC AND ltcg:
+# QMAKE_EXTRA_COMPILERS = "versiontagging_compiler"
+# versiontagging_compiler.commands = "$$QMAKE_CXX" "-c" "$(CXXFLAGS)" "$(INCPATH)" "-fno-lto" "-o" "${QMAKE_FILE_OUT}" "${QMAKE_FILE_IN}"
+# versiontagging_compiler.dependency_type = "TYPE_C"
+# versiontagging_compiler.input = "VERSIONTAGGING_SOURCES"
+# versiontagging_compiler.name = "compiling[versiontagging]" "${QMAKE_FILE_IN}"
+# versiontagging_compiler.output = "${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${firstQMAKE_EXT_OBJ}"
+# versiontagging_compiler.variable_out = "OBJECTS"
+
+#### Keys ignored in scope 41:.:global:global/global.pri:silent:
+# versiontagging_compiler.commands = "@echo" "compiling[versiontagging]" "${QMAKE_FILE_IN}" "&&"
+
+qt_extend_target(Core CONDITION NOT GCC OR NOT ltcg
+ SOURCES
+ global/qversiontagging.cpp
+)
+
+qt_extend_target(Core CONDITION UNIX
+ SOURCES
+ io/qfilesystemengine_unix.cpp
+ io/qfilesystemiterator_unix.cpp
+ io/qfsfileengine_unix.cpp
+ io/qlockfile_unix.cpp
+ kernel/qcore_unix.cpp kernel/qcore_unix_p.h
+ kernel/qeventdispatcher_unix.cpp kernel/qeventdispatcher_unix_p.h
+ kernel/qpoll_p.h
+ kernel/qtimerinfo_unix.cpp kernel/qtimerinfo_unix_p.h
+ thread/qthread_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_thread
+ SOURCES
+ thread/qatomic.cpp thread/qatomic.h
+ thread/qatomic_bootstrap.h
+ thread/qatomic_cxx11.h
+ thread/qbasicatomic.h
+ thread/qfutex_p.h
+ thread/qgenericatomic.h
+ thread/qlocking_p.h
+ thread/qmutex.cpp thread/qmutex_p.h
+ thread/qorderedmutexlocker_p.h
+ thread/qreadwritelock.cpp thread/qreadwritelock_p.h
+ thread/qsemaphore.cpp thread/qsemaphore.h
+ thread/qthread_p.h
+ thread/qthreadpool.cpp thread/qthreadpool.h thread/qthreadpool_p.h
+ thread/qthreadstorage.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_thread AND WIN32
+ SOURCES
+ thread/qmutex_win.cpp
+ thread/qwaitcondition_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_thread AND UNIX
+ SOURCES
+ thread/qwaitcondition_unix.cpp
+)
+
+qt_extend_target(Core CONDITION APPLE AND QT_FEATURE_thread
+ SOURCES
+ thread/qmutex_mac.cpp
+)
+
+qt_extend_target(Core CONDITION LINUX AND QT_FEATURE_thread
+ SOURCES
+ thread/qmutex_linux.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_thread AND UNIX AND NOT APPLE AND NOT LINUX
+ SOURCES
+ thread/qmutex_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_future
+ SOURCES
+ thread/qexception.cpp thread/qexception.h
+ thread/qfuture.h
+ thread/qfuture_impl.h
+ thread/qfutureinterface.cpp thread/qfutureinterface.h thread/qfutureinterface_p.h
+ thread/qfuturesynchronizer.h
+ thread/qfuturewatcher.cpp thread/qfuturewatcher.h thread/qfuturewatcher_p.h
+ thread/qresultstore.cpp thread/qresultstore.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_std_atomic64
+ PUBLIC_LIBRARIES
+ Atomic
+)
+
+qt_extend_target(Core CONDITION ICC
+ COMPILE_OPTIONS
+ -fp-model
+ strict
+)
+
+qt_extend_target(Core CONDITION MSVC
+ SOURCES
+ tools/qvector_msvc.cpp
+ NO_PCH_SOURCES
+ "tools/qvector_msvc.cpp"
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_system_zlib
+ LIBRARIES
+ ZLIB::ZLIB
+)
+
+qt_extend_target(Core CONDITION NOT QT_FEATURE_system_zlib
+ SOURCES
+ ../3rdparty/zlib/src/adler32.c
+ ../3rdparty/zlib/src/compress.c
+ ../3rdparty/zlib/src/crc32.c
+ ../3rdparty/zlib/src/deflate.c
+ ../3rdparty/zlib/src/gzclose.c
+ ../3rdparty/zlib/src/gzlib.c
+ ../3rdparty/zlib/src/gzread.c
+ ../3rdparty/zlib/src/gzwrite.c
+ ../3rdparty/zlib/src/infback.c
+ ../3rdparty/zlib/src/inffast.c
+ ../3rdparty/zlib/src/inflate.c
+ ../3rdparty/zlib/src/inftrees.c
+ ../3rdparty/zlib/src/trees.c
+ ../3rdparty/zlib/src/uncompr.c
+ ../3rdparty/zlib/src/zutil.c
+ INCLUDE_DIRECTORIES
+ ../3rdparty/zlib/src
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_commandlineparser
+ SOURCES
+ tools/qcommandlineoption.cpp tools/qcommandlineoption.h
+ tools/qcommandlineparser.cpp tools/qcommandlineparser.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_system_doubleconversion
+ LIBRARIES
+ WrapDoubleConversion::WrapDoubleConversion
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_doubleconversion AND NOT QT_FEATURE_system_doubleconversion
+ SOURCES
+ ../3rdparty/double-conversion/bignum.cc ../3rdparty/double-conversion/bignum.h
+ ../3rdparty/double-conversion/bignum-dtoa.cc ../3rdparty/double-conversion/bignum-dtoa.h
+ ../3rdparty/double-conversion/cached-powers.cc ../3rdparty/double-conversion/cached-powers.h
+ ../3rdparty/double-conversion/diy-fp.cc ../3rdparty/double-conversion/diy-fp.h
+ ../3rdparty/double-conversion/double-conversion.cc
+ ../3rdparty/double-conversion/fast-dtoa.cc ../3rdparty/double-conversion/fast-dtoa.h
+ ../3rdparty/double-conversion/fixed-dtoa.cc ../3rdparty/double-conversion/fixed-dtoa.h
+ ../3rdparty/double-conversion/ieee.h
+ ../3rdparty/double-conversion/include/double-conversion/double-conversion.h
+ ../3rdparty/double-conversion/include/double-conversion/utils.h
+ ../3rdparty/double-conversion/strtod.cc ../3rdparty/double-conversion/strtod.h
+ INCLUDE_DIRECTORIES
+ ../3rdparty/double-conversion/..
+ ../3rdparty/double-conversion/include
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_easingcurve
+ SOURCES
+ tools/qeasingcurve.cpp tools/qeasingcurve.h
+ tools/qtimeline.cpp tools/qtimeline.h
+)
+
+qt_extend_target(Core CONDITION UNIX AND NOT HAIKU AND NOT INTEGRITY AND NOT VXWORKS AND NOT WASM AND (NOT ICC OR NOT MACOS)
+ LIBRARIES
+ m
+)
+
+qt_extend_target(Core CONDITION APPLE AND NOT NACL
+ SOURCES
+ kernel/qelapsedtimer_mac.cpp
+ text/qlocale_mac.mm
+)
+
+qt_extend_target(Core CONDITION UNIX AND (NACL OR NOT APPLE)
+ SOURCES
+ text/qlocale_unix.cpp
+)
+
+qt_extend_target(Core CONDITION WIN32 AND (NACL OR NOT APPLE)
+ SOURCES
+ text/qlocale_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_icu
+ SOURCES
+ text/qcollator_icu.cpp
+ text/qlocale_icu.cpp
+ LIBRARIES
+ ICU::i18n ICU::uc ICU::data
+)
+
+qt_extend_target(Core CONDITION WIN32 AND NOT QT_FEATURE_icu
+ SOURCES
+ text/qcollator_win.cpp
+)
+
+qt_extend_target(Core CONDITION MACOS AND NOT QT_FEATURE_icu
+ SOURCES
+ text/qcollator_macx.cpp
+)
+
+qt_extend_target(Core CONDITION UNIX AND NOT MACOS AND NOT QT_FEATURE_icu
+ SOURCES
+ text/qcollator_posix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_regularexpression
+ SOURCES
+ text/qregularexpression.cpp text/qregularexpression.h
+ LIBRARIES
+ WrapPCRE2::WrapPCRE2
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_hijricalendar
+ SOURCES
+ time/qhijricalendar.cpp time/qhijricalendar_p.h
+ time/qhijricalendar_data_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_islamiccivilcalendar
+ SOURCES
+ time/qislamiccivilcalendar.cpp time/qislamiccivilcalendar_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_jalalicalendar
+ SOURCES
+ time/qjalalicalendar.cpp time/qjalalicalendar_p.h
+ time/qjalalicalendar_data_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_timezone
+ SOURCES
+ time/qtimezone.cpp time/qtimezone.h
+ time/qtimezoneprivate.cpp time/qtimezoneprivate_p.h
+ time/qtimezoneprivate_data_p.h
+)
+
+qt_extend_target(Core CONDITION APPLE AND QT_FEATURE_timezone AND NOT NACL
+ SOURCES
+ time/qtimezoneprivate_mac.mm
+)
+
+qt_extend_target(Core CONDITION ANDROID AND QT_FEATURE_timezone AND NOT ANDROID_EMBEDDED AND (NACL OR NOT APPLE)
+ SOURCES
+ time/qtimezoneprivate_android.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_timezone AND UNIX AND (ANDROID_EMBEDDED OR NOT ANDROID) AND (NACL OR NOT APPLE)
+ SOURCES
+ time/qtimezoneprivate_tz.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_icu AND QT_FEATURE_timezone AND UNIX AND (ANDROID_EMBEDDED OR NOT ANDROID) AND (NACL OR NOT APPLE)
+ SOURCES
+ time/qtimezoneprivate_icu.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_icu AND QT_FEATURE_timezone AND WIN32 AND (ANDROID_EMBEDDED OR NOT ANDROID) AND (NACL OR NOT APPLE)
+ SOURCES
+ time/qtimezoneprivate_icu.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_timezone AND WIN32 AND NOT QT_FEATURE_icu AND (ANDROID_EMBEDDED OR NOT ANDROID) AND (NACL OR NOT APPLE)
+ SOURCES
+ time/qtimezoneprivate_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_datetimeparser
+ SOURCES
+ time/qdatetimeparser.cpp time/qdatetimeparser_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_zstd
+ LIBRARIES
+ ZSTD::ZSTD
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_filesystemwatcher
+ SOURCES
+ io/qfilesystemwatcher.cpp io/qfilesystemwatcher.h io/qfilesystemwatcher_p.h
+ io/qfilesystemwatcher_polling.cpp io/qfilesystemwatcher_polling_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_filesystemwatcher AND WIN32
+ SOURCES
+ io/qfilesystemwatcher_win.cpp io/qfilesystemwatcher_win_p.h
+)
+
+qt_extend_target(Core CONDITION MACOS AND QT_FEATURE_filesystemwatcher
+ SOURCES
+ io/qfilesystemwatcher_fsevents.mm io/qfilesystemwatcher_fsevents_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_filesystemwatcher AND QT_FEATURE_inotify AND UNIX AND NOT MACOS
+ SOURCES
+ io/qfilesystemwatcher_inotify.cpp io/qfilesystemwatcher_inotify_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_filesystemwatcher AND UNIX AND NOT MACOS AND NOT QT_FEATURE_inotify AND (APPLE OR FREEBSD OR NETBSD OR OPENBSD)
+ SOURCES
+ io/qfilesystemwatcher_kqueue.cpp io/qfilesystemwatcher_kqueue_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_processenvironment
+ SOURCES
+ io/qprocess.cpp io/qprocess.h io/qprocess_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_processenvironment AND WIN32 AND NOT WINRT
+ SOURCES
+ io/qprocess_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_processenvironment AND UNIX
+ SOURCES
+ io/qprocess_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_settings
+ SOURCES
+ io/qsettings.cpp io/qsettings.h io/qsettings_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_settings AND WIN32 AND NOT WINRT
+ SOURCES
+ io/qsettings_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_settings AND WINRT
+ SOURCES
+ io/qsettings_winrt.cpp
+)
+
+qt_extend_target(Core CONDITION APPLE AND QT_FEATURE_settings AND NOT NACL
+ SOURCES
+ io/qsettings_mac.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_settings AND WASM
+ SOURCES
+ io/qsettings_wasm.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_filesystemiterator AND WIN32
+ SOURCES
+ io/qfilesystemiterator_win.cpp
+)
+
+qt_extend_target(Core CONDITION WINRT
+ SOURCES
+ io/qstandardpaths_winrt.cpp
+ io/qstorageinfo_stub.cpp
+ kernel/qeventdispatcher_winrt.cpp kernel/qeventdispatcher_winrt_p.h
+ kernel/qfunctions_fake_env_p.h
+ kernel/qfunctions_winrt.cpp kernel/qfunctions_winrt.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_process AND UNIX
+ SOURCES
+ ../3rdparty/forkfd/forkfd.h
+ io/forkfd_qt.cpp
+ INCLUDE_DIRECTORIES
+ ../3rdparty/forkfd
+)
+
+qt_extend_target(Core CONDITION APPLE AND QT_FEATURE_processenvironment
+ SOURCES
+ io/qprocess_darwin.mm
+)
+
+qt_extend_target(Core CONDITION APPLE AND NOT MACOS
+ PUBLIC_LIBRARIES
+ ${FWMobileCoreServices}
+)
+
+qt_extend_target(Core CONDITION ANDROID AND NOT ANDROID_EMBEDDED
+ SOURCES
+ io/qstandardpaths_android.cpp
+ io/qstorageinfo_unix.cpp
+ kernel/qjni.cpp kernel/qjni_p.h
+ kernel/qjnihelpers.cpp kernel/qjnihelpers_p.h
+ kernel/qjnionload.cpp
+)
+
+qt_extend_target(Core CONDITION HAIKU AND (ANDROID_EMBEDDED OR NOT ANDROID)
+ SOURCES
+ io/qstandardpaths_haiku.cpp
+ io/qstorageinfo_unix.cpp
+ PUBLIC_LIBRARIES
+ be
+)
+
+qt_extend_target(Core CONDITION UNIX AND NOT APPLE AND NOT HAIKU AND (ANDROID_EMBEDDED OR NOT ANDROID)
+ SOURCES
+ io/qstandardpaths_unix.cpp
+ io/qstorageinfo_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_proxymodel
+ SOURCES
+ itemmodels/qabstractproxymodel.cpp itemmodels/qabstractproxymodel.h itemmodels/qabstractproxymodel_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_concatenatetablesproxymodel AND QT_FEATURE_proxymodel
+ SOURCES
+ itemmodels/qconcatenatetablesproxymodel.cpp itemmodels/qconcatenatetablesproxymodel.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_identityproxymodel AND QT_FEATURE_proxymodel
+ SOURCES
+ itemmodels/qidentityproxymodel.cpp itemmodels/qidentityproxymodel.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_proxymodel AND QT_FEATURE_sortfilterproxymodel
+ SOURCES
+ itemmodels/qsortfilterproxymodel.cpp itemmodels/qsortfilterproxymodel.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_proxymodel AND QT_FEATURE_transposeproxymodel
+ SOURCES
+ itemmodels/qtransposeproxymodel.cpp itemmodels/qtransposeproxymodel.h itemmodels/qtransposeproxymodel_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_stringlistmodel
+ SOURCES
+ itemmodels/qstringlistmodel.cpp itemmodels/qstringlistmodel.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_library
+ SOURCES
+ plugin/qelfparser_p.cpp plugin/qelfparser_p.h
+ plugin/qlibrary.cpp plugin/qlibrary.h plugin/qlibrary_p.h
+ plugin/qmachparser.cpp plugin/qmachparser_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_library AND UNIX
+ SOURCES
+ plugin/qlibrary_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_library AND WIN32
+ SOURCES
+ plugin/qlibrary_win.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_dlopen AND QT_FEATURE_library
+ LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
+
+qt_extend_target(Core CONDITION APPLE AND (IOS OR TVOS)
+ LIBRARIES
+ ${FWUIKit}
+)
+
+qt_extend_target(Core CONDITION WATCHOS
+ LIBRARIES
+ ${FWWatchKit}
+)
+
+qt_extend_target(Core CONDITION NACL
+ SOURCES
+ kernel/qfunctions_nacl.cpp kernel/qfunctions_nacl.h
+)
+
+qt_extend_target(Core CONDITION INTEGRITY OR (NACL AND UNIX) OR (UNIX AND NOT APPLE)
+ SOURCES
+ kernel/qelapsedtimer_unix.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_poll_select AND UNIX
+ SOURCES
+ kernel/qpoll.cpp
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_glib AND UNIX
+ SOURCES
+ kernel/qeventdispatcher_glib.cpp kernel/qeventdispatcher_glib_p.h
+ LIBRARIES
+ GLIB2::GLIB2
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_clock_gettime AND UNIX
+ LIBRARIES
+ WrapRt
+)
+
+qt_extend_target(Core CONDITION UNIX AND NOT ANDROID
+ SOURCES
+ kernel/qsharedmemory_posix.cpp
+ kernel/qsharedmemory_systemv.cpp
+ kernel/qsharedmemory_unix.cpp
+ kernel/qsystemsemaphore_posix.cpp
+ kernel/qsystemsemaphore_systemv.cpp
+ kernel/qsystemsemaphore_unix.cpp
+)
+
+qt_extend_target(Core CONDITION VXWORKS
+ SOURCES
+ kernel/qfunctions_vxworks.cpp kernel/qfunctions_vxworks.h
+)
+
+qt_extend_target(Core CONDITION QNX AND QT_FEATURE_qqnx_pps
+ SOURCES
+ kernel/qppsattribute.cpp kernel/qppsattribute_p.h
+ kernel/qppsattributeprivate_p.h
+ kernel/qppsobject.cpp kernel/qppsobject_p.h
+ kernel/qppsobjectprivate_p.h
+ LIBRARIES
+ PPS::PPS
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_textcodec
+ SOURCES
+ codecs/qlatincodec.cpp codecs/qlatincodec_p.h
+ codecs/qsimplecodec.cpp codecs/qsimplecodec_p.h
+ codecs/qtextcodec.cpp codecs/qtextcodec.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_codecs AND QT_FEATURE_textcodec
+ SOURCES
+ codecs/qisciicodec.cpp codecs/qisciicodec_p.h
+ codecs/qtsciicodec.cpp codecs/qtsciicodec_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_icu AND QT_FEATURE_textcodec
+ SOURCES
+ codecs/qicucodec.cpp codecs/qicucodec_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_big_codecs AND QT_FEATURE_textcodec AND NOT QT_FEATURE_icu
+ SOURCES
+ codecs/qbig5codec.cpp codecs/qbig5codec_p.h
+ codecs/qeucjpcodec.cpp codecs/qeucjpcodec_p.h
+ codecs/qeuckrcodec.cpp codecs/qeuckrcodec_p.h
+ codecs/qgb18030codec.cpp codecs/qgb18030codec_p.h
+ codecs/qjiscodec.cpp codecs/qjiscodec_p.h
+ codecs/qjpunicode.cpp
+ codecs/qsjiscodec.cpp codecs/qsjiscodec_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_iconv AND QT_FEATURE_textcodec AND NOT QT_FEATURE_icu
+ SOURCES
+ codecs/qiconvcodec.cpp codecs/qiconvcodec_p.h
+ LIBRARIES
+ iconv
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_textcodec AND WIN32 AND NOT QT_FEATURE_icu
+ SOURCES
+ codecs/qwindowscodec.cpp codecs/qwindowscodec_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_cborstreamreader
+ SOURCES
+ serialization/qcborstreamreader.cpp serialization/qcborstreamreader.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_cborstreamwriter
+ SOURCES
+ serialization/qcborstreamwriter.cpp serialization/qcborstreamwriter.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_binaryjson
+ SOURCES
+ serialization/qbinaryjson.cpp serialization/qbinaryjson_p.h
+ serialization/qbinaryjsonarray.cpp serialization/qbinaryjsonarray_p.h
+ serialization/qbinaryjsonobject.cpp serialization/qbinaryjsonobject_p.h
+ serialization/qbinaryjsonvalue.cpp serialization/qbinaryjsonvalue_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_qeventtransition
+ SOURCES
+ statemachine/qeventtransition.cpp statemachine/qeventtransition.h statemachine/qeventtransition_p.h
+)
+
+qt_extend_target(Core CONDITION QT_FEATURE_mimetype
+ SOURCES
+ mimetypes/qmimedatabase.cpp mimetypes/qmimedatabase.h mimetypes/qmimedatabase_p.h
+ mimetypes/qmimeglobpattern.cpp mimetypes/qmimeglobpattern_p.h
+ mimetypes/qmimemagicrule.cpp mimetypes/qmimemagicrule_p.h
+ mimetypes/qmimemagicrulematcher.cpp mimetypes/qmimemagicrulematcher_p.h
+ mimetypes/qmimeprovider.cpp mimetypes/qmimeprovider_p.h
+ mimetypes/qmimetype.cpp mimetypes/qmimetype.h mimetypes/qmimetype_p.h
+ mimetypes/qmimetypeparser.cpp mimetypes/qmimetypeparser_p.h
+)
+
+#### Keys ignored in scope 197:.:mimetypes:mimetypes/mimetypes.pri:QT_FEATURE_mimetype:
+# MIME_DATABASE = "mimetypes/mime/packages/freedesktop.org.xml"
+# OTHER_FILES = "$$MIME_DATABASE"
+
+# special case begin
+# qt_extend_target(Core CONDITION QT_FEATURE_mimetype AND QT_FEATURE_mimetype_database
+# INCLUDE_DIRECTORIES
+# .rcc
+#)
+# special case end
+
+#### Keys ignored in scope 198:.:mimetypes:mimetypes/mimetypes.pri:QT_FEATURE_mimetype_database:
+# QMAKE_EXTRA_COMPILERS = "mimedb"
+# mimedb.commands = "${QMAKE_FILE_IN}" ">" "${QMAKE_FILE_OUT}"
+# mimedb.depends = "$$PWD/mime/generate.pl"
+# mimedb.input = "MIME_DATABASE"
+# mimedb.output = "$$outpath/qmimeprovider_database.cpp"
+# mimedb.variable_out = "INCLUDED_SOURCES"
+
+#### Keys ignored in scope 199:.:mimetypes:mimetypes/mimetypes.pri:ANDROID:
+# outpath = "$$outpath/$${QT_ARCH}"
+
+#### Keys ignored in scope 201:.:mimetypes:mimetypes/mimetypes.pri:(CMAKE_BUILD_TYPE STREQUAL Debug):
+# outpath = "$$outpath/debug"
+
+#### Keys ignored in scope 202:.:mimetypes:mimetypes/mimetypes.pri:else:
+# outpath = "$$outpath/release"
+
+#### Keys ignored in scope 203:.:mimetypes:mimetypes/mimetypes.pri:MAKEFILE_GENERATOR___equals___MSVC.NET OR MAKEFILE_GENERATOR___equals___MSBUILD OR QMAKE_SH_ISEMPTY:
+# mimedb.commands = "cmd" "/c" "$$shell_path($$PWD/mime/generate.bat)"
+# mimedb.depends = "$$PWD/mime/generate.bat" "$$PWD/mime/hexdump.ps1"
+
+#### Keys ignored in scope 204:.:mimetypes:mimetypes/mimetypes.pri:else:
+# mimedb.commands = "perl" "$${mimedb.depends}"
+
+#### Keys ignored in scope 205:.:mimetypes:mimetypes/mimetypes.pri:QT_FEATURE_zstd:
+# mimedb.commands = "--zstd"
+# Resources:
+# special case begin
+# We can't specify the resources directly as we have unit tests that
+# depend on these as well and we no longer support the use of hand
+# edited qrc files.
+if(QT_FEATURE_mimetype AND QT_FEATURE_mimetype_database)
+ include(${CMAKE_CURRENT_SOURCE_DIR}/mimetypes/mimetypes_resources.cmake)
+ corelib_add_mimetypes_resources(Core)
+
+# Generate qmimeprovider_database.cpp
+ set(qmimeprovider_db_output "${CMAKE_CURRENT_BINARY_DIR}/.rcc/qmimeprovider_database.cpp")
+ set(command_args "")
+ set(mime_dir "${CMAKE_CURRENT_SOURCE_DIR}/mimetypes/mime")
+ set(command_depends "${mime_dir}/generate.pl" "${corelib_mimetypes_resource_file}")
+ if (MSVC)
+ list(APPEND command_args "${mime_dir}/generate.bat")
+ list(APPEND command_depends "${mime_dir}/generate.bat" "${mime_dir}/hexdump.ps1" )
+ else()
+ list(APPEND command_args perl "${mime_dir}/generate.pl" )
+ endif()
+
+ if (QT_FEATURE_zstd)
+ list(APPEND command_args "--zstd")
+ endif()
+
+ list(APPEND command_args "${corelib_mimetypes_resource_file}" ">" "${qmimeprovider_db_output}")
+
+ add_custom_command(OUTPUT "${qmimeprovider_db_output}"
+ DEPENDS ${command_depends}
+ COMMAND ${command_args}
+ COMMENT "Generating ${qmimeprovider_db_output}"
+ )
+
+ target_sources(Core PRIVATE ${qmimeprovider_db_output})
+ set_source_files_properties(${qmimeprovider_db_output} PROPERTIES HEADER_FILE_ONLY TRUE)
+ target_include_directories(Core PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/.rcc")
+endif()
+
+# special case end
+
+qt_extend_target(Core CONDITION WASM
+ SOURCES
+ platform/wasm/qstdweb.cpp platform/wasm/qstdweb_p.h
+)
+
+# special case begin
+# needs refinement for the other compiler specific cases.
+if(TEST_arch_${TEST_architecture_arch}_subarch_f16c)
+ # Equivalent to contains(QT_CPU_FEATURES.$$QT_ARCH, f16c)
+ extend_target(Core
+ DEFINES
+ QFLOAT16_INCLUDE_FAST
+ )
+else()
+ qt_add_simd_part(Core SIMD f16c
+ SOURCES
+ global/qfloat16_f16c.c
+ )
+endif()
+
+set_source_files_properties(
+ thread/qmutex_linux.cpp
+ thread/qmutex_mac.cpp
+ thread/qmutex_unix.cpp
+ thread/qmutex_win.cpp
+ PROPERTIES HEADER_FILE_ONLY ON) # special case: These files are included by qmutex.cpp!
+
+
+# Remove QT_NO_CAST_TO_ASCII to ensure that the symbols are included in the library.
+if(WIN32)
+ get_target_property(defines Core COMPILE_DEFINITIONS)
+ list(REMOVE_ITEM defines QT_NO_CAST_TO_ASCII)
+ set_target_properties(Core PROPERTIES COMPILE_DEFINITIONS "${defines}")
+endif()
+
+qt_internal_add_link_flags_gc_sections(Core PRIVATE)
+
+if(WIN32)
+ set(isExe $<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>)
+ set(isWin32 $<BOOL:$<TARGET_PROPERTY:WIN32_EXECUTABLE>>)
+ set(isNotExcluded $<NOT:$<BOOL:$<TARGET_PROPERTY:Qt5_NO_LINK_QTMAIN>>>)
+ set(isPolicyNEW $<TARGET_POLICY:CMP0020>)
+
+ target_link_libraries(Core INTERFACE $<$<AND:${isExe},${isWin32},${isNotExcluded},${isPolicyNEW}>:Qt::WinMain>)
+ qt_record_extra_qt_package_dependency(Core WinMain "${PROJECT_VERSION}")
+endif()
+# special case end
+
+qt_create_tracepoints(Core qtcore.tracepoints)
+qt_add_docs(Core
+ doc/qtcore.qdocconf
+)
+
+# special case begin
+# Handle qtzlib.pro to create headers for the
+# QtZlibPrivate target, equivalent to Qt += zlib-private
+if(NOT QT_FEATURE_system_zlib)
+ qt_add_module(Zlib
+ INTERNAL_MODULE
+ HEADER_MODULE
+ NO_CONFIG_HEADER_FILE
+ )
+endif()
+# special case end
diff --git a/src/corelib/Qt5AndroidSupport.cmake b/src/corelib/Qt5AndroidSupport.cmake
index 4db38f3957..662dd87c1f 100644
--- a/src/corelib/Qt5AndroidSupport.cmake
+++ b/src/corelib/Qt5AndroidSupport.cmake
@@ -18,7 +18,7 @@ if (NOT ${PROJECT_NAME}-MultiAbiBuild)
option(ANDROID_BUILD_ABI_${abi} "Enable the build for Android ${abi}" ${abi_initial_value})
endif()
endforeach()
- option(ANDROID_MIN_SDK_VERSION "Android minimum SDK version" "21")
+ option(ANDROID_MIN_SDK_VERSION "Android minimum SDK version" "23")
option(ANDROID_TARGET_SDK_VERSION "Android target SDK version" "28")
# Make sure to delete the "android-build" directory, which contains all the
diff --git a/src/corelib/Qt5CoreConfigExtras.cmake.in b/src/corelib/Qt5CoreConfigExtras.cmake.in
deleted file mode 100644
index 4c1c3a612b..0000000000
--- a/src/corelib/Qt5CoreConfigExtras.cmake.in
+++ /dev/null
@@ -1,203 +0,0 @@
-if(NOT DEFINED QT_DEFAULT_MAJOR_VERSION)
- set(QT_DEFAULT_MAJOR_VERSION 5)
-endif()
-
-if (NOT TARGET Qt5::qmake)
- add_executable(Qt5::qmake IMPORTED)
-
-!!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
- set(imported_location \"${_qt5Core_install_prefix}/$${CMAKE_BIN_DIR}qmake$$CMAKE_BIN_SUFFIX\")
-!!ELSE
- set(imported_location \"$${CMAKE_BIN_DIR}qmake$$CMAKE_BIN_SUFFIX\")
-!!ENDIF
- _qt5_Core_check_file_exists(${imported_location})
-
- set_target_properties(Qt5::qmake PROPERTIES
- IMPORTED_LOCATION ${imported_location}
- )
-endif()
-
-if (NOT TARGET Qt5::moc)
- add_executable(Qt5::moc IMPORTED)
-
-!!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
- set(imported_location \"${_qt5Core_install_prefix}/$${CMAKE_BIN_DIR}moc$$CMAKE_BIN_SUFFIX\")
-!!ELSE
- set(imported_location \"$${CMAKE_BIN_DIR}moc$$CMAKE_BIN_SUFFIX\")
-!!ENDIF
- _qt5_Core_check_file_exists(${imported_location})
-
- set_target_properties(Qt5::moc PROPERTIES
- IMPORTED_LOCATION ${imported_location}
- )
- # For CMake automoc feature
- get_target_property(QT_MOC_EXECUTABLE Qt5::moc LOCATION)
-endif()
-
-if (NOT TARGET Qt5::rcc)
- add_executable(Qt5::rcc IMPORTED)
-
-!!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
- set(imported_location \"${_qt5Core_install_prefix}/$${CMAKE_BIN_DIR}rcc$$CMAKE_BIN_SUFFIX\")
-!!ELSE
- set(imported_location \"$${CMAKE_BIN_DIR}rcc$$CMAKE_BIN_SUFFIX\")
-!!ENDIF
- _qt5_Core_check_file_exists(${imported_location})
-
- set_target_properties(Qt5::rcc PROPERTIES
- IMPORTED_LOCATION ${imported_location}
- )
-endif()
-
-set(CMAKE_AUTOMOC_MACRO_NAMES "Q_OBJECT" "Q_GADGET" "Q_NAMESPACE" "Q_NAMESPACE_EXPORT")
-
-set(Qt5Core_QMAKE_EXECUTABLE Qt5::qmake)
-set(Qt5Core_MOC_EXECUTABLE Qt5::moc)
-set(Qt5Core_RCC_EXECUTABLE Qt5::rcc)
-
-set_property(TARGET Qt5::Core PROPERTY INTERFACE_QT_MAJOR_VERSION 5)
-set_property(TARGET Qt5::Core PROPERTY INTERFACE_QT_COORD_TYPE $$QT_COORD_TYPE)
-set_property(TARGET Qt5::Core APPEND PROPERTY
- COMPATIBLE_INTERFACE_STRING QT_MAJOR_VERSION QT_COORD_TYPE
-)
-
-include(\"${CMAKE_CURRENT_LIST_DIR}/Qt5CoreConfigExtrasMkspecDir.cmake\")
-
-foreach(_dir ${_qt5_corelib_extra_includes})
- _qt5_Core_check_file_exists(${_dir})
-endforeach()
-
-list(APPEND Qt5Core_INCLUDE_DIRS ${_qt5_corelib_extra_includes})
-set_property(TARGET Qt5::Core APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${_qt5_corelib_extra_includes})
-set(_qt5_corelib_extra_includes)
-
-# Targets using Qt need to use the POSITION_INDEPENDENT_CODE property. The
-# Qt5_POSITION_INDEPENDENT_CODE variable is used in the # qt5_use_module
-# macro to add it.
-set(Qt5_POSITION_INDEPENDENT_CODE True)
-
-# On x86 and x86-64 systems with ELF binaries (especially Linux), due to
-# a new optimization in GCC 5.x in combination with a recent version of
-# GNU binutils, compiling Qt applications with -fPIE is no longer
-# enough.
-# Applications now need to be compiled with the -fPIC option if the Qt option
-# \"reduce relocations\" is active. For backward compatibility only, Qt accepts
-# the use of -fPIE for GCC 4.x versions.
-set_property(TARGET Qt5::Core APPEND PROPERTY INTERFACE_COMPILE_OPTIONS $$QMAKE_CXXFLAGS_APP)
-
-# TODO Qt6: Remove
-set(Qt5Core_EXECUTABLE_COMPILE_FLAGS \"\")
-
-!!IF !isEmpty(QT_NAMESPACE)
-list(APPEND Qt5Core_DEFINITIONS -DQT_NAMESPACE=$$QT_NAMESPACE)
-list(APPEND Qt5Core_COMPILE_DEFINITIONS QT_NAMESPACE=$$QT_NAMESPACE)
-set_property(TARGET Qt5::Core APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS QT_NAMESPACE=$$QT_NAMESPACE)
-!!ENDIF
-
-!!IF !isEmpty(CMAKE_DISABLED_FEATURES)
-set(Qt5_DISABLED_FEATURES
- $$CMAKE_DISABLED_FEATURES
-)
-!!ENDIF
-
-set_property(TARGET Qt5::Core APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS $<$<NOT:$<CONFIG:Debug>>:QT_NO_DEBUG>)
-
-set_property(TARGET Qt5::Core PROPERTY INTERFACE_COMPILE_FEATURES cxx_decltype)
-
-!!IF qtConfig(reduce_exports)
-set(QT_VISIBILITY_AVAILABLE \"True\")
-!!ENDIF
-
-!!IF !isEmpty(QT_LIBINFIX)
-set(QT_LIBINFIX \"$${QT_LIBINFIX}\")
-!!ENDIF
-
-!!IF !isEmpty(CMAKE_WINDOWS_BUILD)
-set(Qt5Core_QTMAIN_LIBRARIES Qt5::WinMain)
-
-if (NOT TARGET Qt5::WinMain)
- add_library(Qt5::WinMain STATIC IMPORTED)
-
-!!IF !isEmpty(CMAKE_RELEASE_TYPE)
- set_property(TARGET Qt5::WinMain APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
-!!IF isEmpty(CMAKE_LIB_DIR_IS_ABSOLUTE)
- set(imported_location \"${_qt5Core_install_prefix}/$${CMAKE_LIB_DIR}$${CMAKE_WINMAIN_FILE_LOCATION_RELEASE}\")
-!!ELSE
- set(imported_location \"$${CMAKE_LIB_DIR}$${CMAKE_WINMAIN_FILE_LOCATION_RELEASE}\")
-!!ENDIF
-
- set_target_properties(Qt5::WinMain PROPERTIES
- IMPORTED_LOCATION_RELEASE ${imported_location}
- )
-!!ENDIF
-
-!!IF !isEmpty(CMAKE_DEBUG_TYPE)
- set_property(TARGET Qt5::WinMain APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
-
-!!IF isEmpty(CMAKE_LIB_DIR_IS_ABSOLUTE)
- set(imported_location \"${_qt5Core_install_prefix}/$${CMAKE_LIB_DIR}$${CMAKE_WINMAIN_FILE_LOCATION_DEBUG}\")
-!!ELSE
- set(imported_location \"$${CMAKE_LIB_DIR}$${CMAKE_WINMAIN_FILE_LOCATION_DEBUG}\")
-!!ENDIF
-
- set_target_properties(Qt5::WinMain PROPERTIES
- IMPORTED_LOCATION_DEBUG ${imported_location}
- )
-!!ENDIF
-
- if (NOT Qt5_NO_LINK_QTMAIN)
- set(_isExe $<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>)
- set(_isWin32 $<BOOL:$<TARGET_PROPERTY:WIN32_EXECUTABLE>>)
- set(_isNotExcluded $<NOT:$<BOOL:$<TARGET_PROPERTY:Qt5_NO_LINK_QTMAIN>>>)
- set(_isPolicyNEW $<TARGET_POLICY:CMP0020>)
- get_target_property(_configs Qt5::Core IMPORTED_CONFIGURATIONS)
- set_property(TARGET Qt5::Core APPEND PROPERTY
- INTERFACE_LINK_LIBRARIES
- $<$<AND:${_isExe},${_isWin32},${_isNotExcluded},${_isPolicyNEW}>:Qt5::WinMain>
- )
- # For backward compatibility with CMake < 2.8.12
- foreach(_config ${_configs})
- set_property(TARGET Qt5::Core APPEND PROPERTY
- IMPORTED_LINK_INTERFACE_LIBRARIES_${_config}
- $<$<AND:${_isExe},${_isWin32},${_isNotExcluded},${_isPolicyNEW}>:Qt5::WinMain>
- )
- endforeach()
- unset(_configs)
- unset(_isExe)
- unset(_isWin32)
- unset(_isNotExcluded)
- unset(_isPolicyNEW)
- endif()
-endif()
-!!ENDIF
-
-get_filename_component(_Qt5CoreConfigDir ${CMAKE_CURRENT_LIST_FILE} PATH)
-
-set(_Qt5CTestMacros \"${_Qt5CoreConfigDir}/Qt5CTestMacros.cmake\")
-
-if (ANDROID_PLATFORM)
- include(\"${CMAKE_CURRENT_LIST_DIR}/Qt5AndroidSupport.cmake\")
-endif()
-
-_qt5_Core_check_file_exists(${_Qt5CTestMacros})
-
-# Create versionless tool targets.
-foreach(__qt_tool qmake moc rcc)
- if(NOT \"${QT_NO_CREATE_VERSIONLESS_TARGETS}\" AND NOT TARGET Qt::${__qt_tool}
- AND TARGET Qt5::${__qt_tool})
- add_executable(Qt::${__qt_tool} IMPORTED)
- get_target_property(__qt_imported_location Qt5::${__qt_tool} IMPORTED_LOCATION)
- set_target_properties(Qt::${__qt_tool}
- PROPERTIES IMPORTED_LOCATION \"${__qt_imported_location}\")
- endif()
-endforeach()
-
-!!IF !isEmpty(CMAKE_WINDOWS_BUILD)
-# Add a versionless target for WinMain.
-if(NOT \"${QT_NO_CREATE_VERSIONLESS_TARGETS}\" AND NOT TARGET Qt::WinMain)
- add_library(Qt::WinMain INTERFACE IMPORTED)
- set_target_properties(Qt::WinMain PROPERTIES
- INTERFACE_LINK_LIBRARIES \"Qt5::WinMain\"
- )
-endif()
-!!ENDIF
diff --git a/src/corelib/Qt5CTestMacros.cmake b/src/corelib/Qt6CTestMacros.cmake
index 962d49d6b2..962d49d6b2 100644
--- a/src/corelib/Qt5CTestMacros.cmake
+++ b/src/corelib/Qt6CTestMacros.cmake
diff --git a/src/corelib/Qt5Config.cmake.in b/src/corelib/Qt6Config.cmake.in
index 6b6544f932..6b6544f932 100644
--- a/src/corelib/Qt5Config.cmake.in
+++ b/src/corelib/Qt6Config.cmake.in
diff --git a/src/corelib/Qt6CoreConfigExtras.cmake.in b/src/corelib/Qt6CoreConfigExtras.cmake.in
new file mode 100644
index 0000000000..984980b5dc
--- /dev/null
+++ b/src/corelib/Qt6CoreConfigExtras.cmake.in
@@ -0,0 +1,44 @@
+if(NOT DEFINED QT_DEFAULT_MAJOR_VERSION)
+ set(QT_DEFAULT_MAJOR_VERSION 6)
+endif()
+
+# include(\"${CMAKE_CURRENT_LIST_DIR}/Qt5CoreConfigExtrasMkspecDir.cmake\")
+#
+# foreach(_dir ${_qt5_corelib_extra_includes})
+# _qt5_Core_check_file_exists(${_dir})
+# endforeach()
+
+# list(APPEND Qt5Core_INCLUDE_DIRS ${_qt5_corelib_extra_includes})
+# set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::Core APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${_qt5_corelib_extra_includes})
+# set(_qt5_corelib_extra_includes)
+
+if (NOT QT_NO_CREATE_TARGETS)
+ set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::Core PROPERTY INTERFACE_QT_MAJOR_VERSION @PROJECT_VERSION_MAJOR@)
+ set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::Core PROPERTY INTERFACE_QT_COORD_TYPE @QT_COORD_TYPE@)
+ set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::Core APPEND PROPERTY
+ COMPATIBLE_INTERFACE_STRING QT_MAJOR_VERSION QT_COORD_TYPE
+ )
+ if (NOT "@QT_NAMESPACE@" STREQUAL "")
+ set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::Core APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS QT_NAMESPACE=@QT_NAMESPACE@)
+ endif()
+ set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::Core APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS $<$<NOT:$<CONFIG:Debug>>:QT_NO_DEBUG>)
+ set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::Core PROPERTY INTERFACE_COMPILE_FEATURES cxx_decltype)
+endif()
+
+set(CMAKE_AUTOMOC_MACRO_NAMES "Q_OBJECT" "Q_GADGET" "Q_NAMESPACE" "Q_NAMESPACE_EXPORT")
+
+# install layout information, following what qmake -query provides
+get_filename_component(QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX ${CMAKE_CURRENT_LIST_DIR}/../@QT_INVERSE_CONFIG_INSTALL_DIR@ ABSOLUTE)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_ARCHDATA ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_ARCHDATADIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_BINS ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_BINDIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_CONFIGURATION ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_SYSCONFDIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_DATA ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_DATADIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_DOCS ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_DOCDIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_EXAMPLES ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_EXAMPLESDIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_HEADERS ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_INCLUDEDIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_LIBS ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_LIBDIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_LIBEXECS ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_LIBEXECDIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_PLUGINS ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_PLUGINSDIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_QML ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_QMLDIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_TESTS ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_TESTSDIR@)
+set(QT@PROJECT_VERSION_MAJOR@_INSTALL_TRANSLATIONS ${QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX}/@INSTALL_TRANSLATIONSDIR@)
diff --git a/src/corelib/Qt5CoreConfigExtrasMkspecDir.cmake.in b/src/corelib/Qt6CoreConfigExtrasMkspecDir.cmake.in
index c357237d0e..c357237d0e 100644
--- a/src/corelib/Qt5CoreConfigExtrasMkspecDir.cmake.in
+++ b/src/corelib/Qt6CoreConfigExtrasMkspecDir.cmake.in
diff --git a/src/corelib/Qt5CoreConfigExtrasMkspecDirForInstall.cmake.in b/src/corelib/Qt6CoreConfigExtrasMkspecDirForInstall.cmake.in
index 706304cf34..706304cf34 100644
--- a/src/corelib/Qt5CoreConfigExtrasMkspecDirForInstall.cmake.in
+++ b/src/corelib/Qt6CoreConfigExtrasMkspecDirForInstall.cmake.in
diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake
new file mode 100644
index 0000000000..29b3239215
--- /dev/null
+++ b/src/corelib/Qt6CoreMacros.cmake
@@ -0,0 +1,1137 @@
+#=============================================================================
+# Copyright 2005-2011 Kitware, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# * Neither the name of Kitware, Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#=============================================================================
+
+######################################
+#
+# Macros for building Qt files
+#
+######################################
+
+include(CMakeParseArguments)
+
+# macro used to create the names of output files preserving relative dirs
+macro(qt6_make_output_file infile prefix ext outfile )
+ string(LENGTH ${CMAKE_CURRENT_BINARY_DIR} _binlength)
+ string(LENGTH ${infile} _infileLength)
+ set(_checkinfile ${CMAKE_CURRENT_SOURCE_DIR})
+ if(_infileLength GREATER _binlength)
+ string(SUBSTRING "${infile}" 0 ${_binlength} _checkinfile)
+ if(_checkinfile STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
+ file(RELATIVE_PATH rel ${CMAKE_CURRENT_BINARY_DIR} ${infile})
+ else()
+ file(RELATIVE_PATH rel ${CMAKE_CURRENT_SOURCE_DIR} ${infile})
+ endif()
+ else()
+ file(RELATIVE_PATH rel ${CMAKE_CURRENT_SOURCE_DIR} ${infile})
+ endif()
+ if(WIN32 AND rel MATCHES "^([a-zA-Z]):(.*)$") # absolute path
+ set(rel "${CMAKE_MATCH_1}_${CMAKE_MATCH_2}")
+ endif()
+ set(_outfile "${CMAKE_CURRENT_BINARY_DIR}/${rel}")
+ string(REPLACE ".." "__" _outfile ${_outfile})
+ get_filename_component(outpath ${_outfile} PATH)
+ if(CMAKE_VERSION VERSION_LESS "3.14")
+ get_filename_component(_outfile_ext ${_outfile} EXT)
+ get_filename_component(_outfile_ext ${_outfile_ext} NAME_WE)
+ get_filename_component(_outfile ${_outfile} NAME_WE)
+ string(APPEND _outfile ${_outfile_ext})
+ else()
+ get_filename_component(_outfile ${_outfile} NAME_WLE)
+ endif()
+ file(MAKE_DIRECTORY ${outpath})
+ set(${outfile} ${outpath}/${prefix}${_outfile}.${ext})
+endmacro()
+
+
+macro(qt6_get_moc_flags _moc_flags)
+ set(${_moc_flags})
+ get_directory_property(_inc_DIRS INCLUDE_DIRECTORIES)
+
+ if(CMAKE_INCLUDE_CURRENT_DIR)
+ list(APPEND _inc_DIRS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+ endif()
+
+ foreach(_current ${_inc_DIRS})
+ if("${_current}" MATCHES "\\.framework/?$")
+ string(REGEX REPLACE "/[^/]+\\.framework" "" framework_path "${_current}")
+ set(${_moc_flags} ${${_moc_flags}} "-F${framework_path}")
+ else()
+ set(${_moc_flags} ${${_moc_flags}} "-I${_current}")
+ endif()
+ endforeach()
+
+ get_directory_property(_defines COMPILE_DEFINITIONS)
+ foreach(_current ${_defines})
+ set(${_moc_flags} ${${_moc_flags}} "-D${_current}")
+ endforeach()
+
+ if(WIN32)
+ set(${_moc_flags} ${${_moc_flags}} -DWIN32)
+ endif()
+ if (MSVC)
+ set(${_moc_flags} ${${_moc_flags}} --compiler-flavor=msvc)
+ endif()
+endmacro()
+
+
+# helper macro to set up a moc rule
+function(qt6_create_moc_command infile outfile moc_flags moc_options moc_target moc_depends)
+ # Pass the parameters in a file. Set the working directory to
+ # be that containing the parameters file and reference it by
+ # just the file name. This is necessary because the moc tool on
+ # MinGW builds does not seem to handle spaces in the path to the
+ # file given with the @ syntax.
+ get_filename_component(_moc_outfile_name "${outfile}" NAME)
+ get_filename_component(_moc_outfile_dir "${outfile}" PATH)
+ if(_moc_outfile_dir)
+ set(_moc_working_dir WORKING_DIRECTORY ${_moc_outfile_dir})
+ endif()
+ set (_moc_parameters_file ${outfile}_parameters)
+ set (_moc_parameters ${moc_flags} ${moc_options} -o "${outfile}" "${infile}")
+ string (REPLACE ";" "\n" _moc_parameters "${_moc_parameters}")
+
+ if(moc_target)
+ set(_moc_parameters_file ${_moc_parameters_file}$<$<BOOL:$<CONFIGURATION>>:_$<CONFIGURATION>>)
+ set(targetincludes "$<TARGET_PROPERTY:${moc_target},INCLUDE_DIRECTORIES>")
+ set(targetdefines "$<TARGET_PROPERTY:${moc_target},COMPILE_DEFINITIONS>")
+
+ set(targetincludes "$<$<BOOL:${targetincludes}>:-I$<JOIN:${targetincludes},\n-I>\n>")
+ set(targetdefines "$<$<BOOL:${targetdefines}>:-D$<JOIN:${targetdefines},\n-D>\n>")
+
+ file (GENERATE
+ OUTPUT ${_moc_parameters_file}
+ CONTENT "${targetdefines}${targetincludes}${_moc_parameters}\n"
+ )
+
+ set(targetincludes)
+ set(targetdefines)
+ else()
+ file(WRITE ${_moc_parameters_file} "${_moc_parameters}\n")
+ endif()
+
+ set(_moc_extra_parameters_file @${_moc_parameters_file})
+ add_custom_command(OUTPUT ${outfile}
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::moc ${_moc_extra_parameters_file}
+ DEPENDS ${infile} ${moc_depends}
+ ${_moc_working_dir}
+ VERBATIM)
+ set_source_files_properties(${infile} PROPERTIES SKIP_AUTOMOC ON)
+ set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOMOC ON)
+ set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOUIC ON)
+endfunction()
+
+
+function(qt6_generate_moc infile outfile )
+ # get include dirs and flags
+ qt6_get_moc_flags(moc_flags)
+ get_filename_component(abs_infile ${infile} ABSOLUTE)
+ set(_outfile "${outfile}")
+ if(NOT IS_ABSOLUTE "${outfile}")
+ set(_outfile "${CMAKE_CURRENT_BINARY_DIR}/${outfile}")
+ endif()
+ if ("x${ARGV2}" STREQUAL "xTARGET")
+ set(moc_target ${ARGV3})
+ endif()
+ qt6_create_moc_command(${abs_infile} ${_outfile} "${moc_flags}" "" "${moc_target}" "")
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_generate_moc)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_generate_moc(${ARGV})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_generate_moc(${ARGV})
+ endif()
+ endfunction()
+endif()
+
+
+# qt6_wrap_cpp(outfiles inputfile ... )
+
+function(qt6_wrap_cpp outfiles )
+ # get include dirs
+ qt6_get_moc_flags(moc_flags)
+
+ set(options)
+ set(oneValueArgs TARGET)
+ set(multiValueArgs OPTIONS DEPENDS)
+
+ cmake_parse_arguments(_WRAP_CPP "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+ set(moc_files ${_WRAP_CPP_UNPARSED_ARGUMENTS})
+ set(moc_options ${_WRAP_CPP_OPTIONS})
+ set(moc_target ${_WRAP_CPP_TARGET})
+ set(moc_depends ${_WRAP_CPP_DEPENDS})
+
+ foreach(it ${moc_files})
+ get_filename_component(it ${it} ABSOLUTE)
+ qt6_make_output_file(${it} moc_ cpp outfile)
+ qt6_create_moc_command(${it} ${outfile} "${moc_flags}" "${moc_options}" "${moc_target}" "${moc_depends}")
+ list(APPEND ${outfiles} ${outfile})
+ endforeach()
+ set(${outfiles} ${${outfiles}} PARENT_SCOPE)
+endfunction()
+
+# This will override the CMake upstream command, because that one is for Qt 3.
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_wrap_cpp outfiles)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_wrap_cpp("${outfiles}" ${ARGN})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_wrap_cpp("${outfiles}" ${ARGN})
+ endif()
+ set("${outfiles}" "${${outfiles}}" PARENT_SCOPE)
+ endfunction()
+endif()
+
+
+# _qt6_parse_qrc_file(infile _out_depends _rc_depends)
+# internal
+
+function(_qt6_parse_qrc_file infile _out_depends _rc_depends)
+ get_filename_component(rc_path ${infile} PATH)
+
+ if(EXISTS "${infile}")
+ # parse file for dependencies
+ # all files are absolute paths or relative to the location of the qrc file
+ file(READ "${infile}" RC_FILE_CONTENTS)
+ string(REGEX MATCHALL "<file[^<]+" RC_FILES "${RC_FILE_CONTENTS}")
+ foreach(RC_FILE ${RC_FILES})
+ string(REGEX REPLACE "^<file[^>]*>" "" RC_FILE "${RC_FILE}")
+ if(NOT IS_ABSOLUTE "${RC_FILE}")
+ set(RC_FILE "${rc_path}/${RC_FILE}")
+ endif()
+ set(RC_DEPENDS ${RC_DEPENDS} "${RC_FILE}")
+ endforeach()
+ # Since this cmake macro is doing the dependency scanning for these files,
+ # let's make a configured file and add it as a dependency so cmake is run
+ # again when dependencies need to be recomputed.
+ qt6_make_output_file("${infile}" "" "qrc.depends" out_depends)
+ configure_file("${infile}" "${out_depends}" COPYONLY)
+ else()
+ # The .qrc file does not exist (yet). Let's add a dependency and hope
+ # that it will be generated later
+ set(out_depends)
+ endif()
+
+ set(${_out_depends} ${out_depends} PARENT_SCOPE)
+ set(${_rc_depends} ${RC_DEPENDS} PARENT_SCOPE)
+endfunction()
+
+
+# qt6_add_binary_resources(target inputfiles ... )
+
+function(qt6_add_binary_resources target )
+
+ set(options)
+ set(oneValueArgs DESTINATION)
+ set(multiValueArgs OPTIONS)
+
+ cmake_parse_arguments(_RCC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+ set(rcc_files ${_RCC_UNPARSED_ARGUMENTS})
+ set(rcc_options ${_RCC_OPTIONS})
+ set(rcc_destination ${_RCC_DESTINATION})
+
+ if(NOT rcc_destination)
+ set(rcc_destination ${CMAKE_CURRENT_BINARY_DIR}/${target}.rcc)
+ endif()
+
+ foreach(it ${rcc_files})
+ get_filename_component(infile ${it} ABSOLUTE)
+
+ _qt6_parse_qrc_file(${infile} _out_depends _rc_depends)
+ set_source_files_properties(${infile} PROPERTIES SKIP_AUTORCC ON)
+ set(infiles ${infiles} ${infile})
+ set(out_depends ${out_depends} ${_out_depends})
+ set(rc_depends ${rc_depends} ${_rc_depends})
+ endforeach()
+
+ add_custom_command(OUTPUT ${rcc_destination}
+ DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
+ ARGS ${rcc_options} --binary --name ${target} --output ${rcc_destination} ${infiles}
+ DEPENDS
+ ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
+ ${rc_depends}
+ ${out_depends}
+ ${infiles}
+ VERBATIM)
+
+ add_custom_target(${target} ALL DEPENDS ${rcc_destination})
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_add_binary_resources)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_add_binary_resources(${ARGV})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_add_binary_resources(${ARGV})
+ endif()
+ endfunction()
+endif()
+
+
+# qt6_add_resources(target resourcename ...
+# or
+# qt6_add_resources(outfiles inputfile ... )
+
+function(qt6_add_resources outfiles )
+ if (TARGET ${outfiles})
+ cmake_parse_arguments(arg "" "OUTPUT_TARGETS" "" ${ARGN})
+ qt6_process_resource(${ARGV})
+ if (arg_OUTPUT_TARGETS)
+ set(${arg_OUTPUT_TARGETS} ${${arg_OUTPUT_TARGETS}} PARENT_SCOPE)
+ endif()
+ else()
+ set(options)
+ set(oneValueArgs)
+ set(multiValueArgs OPTIONS)
+
+ cmake_parse_arguments(_RCC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+ set(rcc_files ${_RCC_UNPARSED_ARGUMENTS})
+ set(rcc_options ${_RCC_OPTIONS})
+
+ if("${rcc_options}" MATCHES "-binary")
+ message(WARNING "Use qt6_add_binary_resources for binary option")
+ endif()
+
+ foreach(it ${rcc_files})
+ get_filename_component(outfilename ${it} NAME_WE)
+ get_filename_component(infile ${it} ABSOLUTE)
+ set(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.cpp)
+
+ _qt6_parse_qrc_file(${infile} _out_depends _rc_depends)
+ set_source_files_properties(${infile} PROPERTIES SKIP_AUTORCC ON)
+
+ add_custom_command(OUTPUT ${outfile}
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
+ ARGS ${rcc_options} --name ${outfilename} --output ${outfile} ${infile}
+ MAIN_DEPENDENCY ${infile}
+ DEPENDS ${_rc_depends} "${_out_depends}" ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
+ VERBATIM)
+ set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOMOC ON)
+ set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOUIC ON)
+ list(APPEND ${outfiles} ${outfile})
+ endforeach()
+ set(${outfiles} ${${outfiles}} PARENT_SCOPE)
+ endif()
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_add_resources outfiles)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_add_resources("${outfiles}" ${ARGN})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_add_resources("${outfiles}" ${ARGN})
+ endif()
+ if(NOT TARGET ${outfiles})
+ set("${outfiles}" "${${outfiles}}" PARENT_SCOPE)
+ endif()
+ endfunction()
+endif()
+
+
+# qt6_add_big_resources(outfiles inputfile ... )
+
+function(qt6_add_big_resources outfiles )
+ if (CMAKE_VERSION VERSION_LESS 3.9)
+ message(FATAL_ERROR, "qt6_add_big_resources requires CMake 3.9 or newer")
+ endif()
+
+ set(options)
+ set(oneValueArgs)
+ set(multiValueArgs OPTIONS)
+
+ cmake_parse_arguments(_RCC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+ set(rcc_files ${_RCC_UNPARSED_ARGUMENTS})
+ set(rcc_options ${_RCC_OPTIONS})
+
+ if("${rcc_options}" MATCHES "-binary")
+ message(WARNING "Use qt6_add_binary_resources for binary option")
+ endif()
+
+ foreach(it ${rcc_files})
+ get_filename_component(outfilename ${it} NAME_WE)
+ get_filename_component(infile ${it} ABSOLUTE)
+ set(tmpoutfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}tmp.cpp)
+ set(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.o)
+
+ _qt6_parse_qrc_file(${infile} _out_depends _rc_depends)
+ set_source_files_properties(${infile} PROPERTIES SKIP_AUTORCC ON)
+ add_custom_command(OUTPUT ${tmpoutfile}
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::rcc ${rcc_options} --name ${outfilename} --pass 1 --output ${tmpoutfile} ${infile}
+ DEPENDS ${infile} ${_rc_depends} "${out_depends}" ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
+ VERBATIM)
+ add_custom_target(big_resources_${outfilename} ALL DEPENDS ${tmpoutfile})
+ add_library(rcc_object_${outfilename} OBJECT ${tmpoutfile})
+ set_target_properties(rcc_object_${outfilename} PROPERTIES AUTOMOC OFF)
+ set_target_properties(rcc_object_${outfilename} PROPERTIES AUTOUIC OFF)
+ add_dependencies(rcc_object_${outfilename} big_resources_${outfilename})
+ # The modification of TARGET_OBJECTS needs the following change in cmake
+ # https://gitlab.kitware.com/cmake/cmake/commit/93c89bc75ceee599ba7c08b8fe1ac5104942054f
+ add_custom_command(OUTPUT ${outfile}
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
+ ARGS ${rcc_options} --name ${outfilename} --pass 2 --temp $<TARGET_OBJECTS:rcc_object_${outfilename}> --output ${outfile} ${infile}
+ DEPENDS rcc_object_${outfilename} ${QT_CMAKE_EXPORT_NAMESPACE}::rcc
+ VERBATIM)
+ list(APPEND ${outfiles} ${outfile})
+ endforeach()
+ set(${outfiles} ${${outfiles}} PARENT_SCOPE)
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_add_big_resources outfiles)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_add_big_resources(${outfiles} ${ARGN})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_add_big_resources(${outfiles} ${ARGN})
+ endif()
+ set("${outfiles}" "${${outfiles}}" PARENT_SCOPE)
+ endfunction()
+endif()
+
+set(_Qt6_COMPONENT_PATH "${CMAKE_CURRENT_LIST_DIR}/..")
+
+function(add_qt_gui_executable target)
+ if(ANDROID)
+ add_library("${target}" MODULE ${ARGN})
+ # On our qmake builds we do don't compile the executables with
+ # visibility=hidden. Not having this flag set will cause the
+ # executable to have main() hidden and can then no longer be loaded
+ # through dlopen()
+ set_property(TARGET "${target}" PROPERTY C_VISIBILITY_PRESET default)
+ set_property(TARGET "${target}" PROPERTY CXX_VISIBILITY_PRESET default)
+ qt_android_apply_arch_suffix("${target}")
+ else()
+ add_executable("${target}" WIN32 MACOSX_BUNDLE ${ARGN})
+ endif()
+ target_link_libraries("${target}" PRIVATE Qt::Core)
+ if(TARGET Qt::Gui)
+ target_link_libraries("${target}" PRIVATE Qt::Gui)
+ endif()
+
+ if (WIN32)
+ qt6_generate_win32_rc_file(${target})
+ endif()
+
+ if(ANDROID)
+ qt_android_generate_deployment_settings("${target}")
+ qt_android_add_apk_target("${target}")
+ endif()
+endfunction()
+
+function(_qt_get_plugin_name_with_version target out_var)
+ string(REGEX REPLACE "^Qt::(.+)" "Qt${QT_DEFAULT_MAJOR_VERSION}::\\1"
+ qt_plugin_with_version "${target}")
+ if(TARGET "${qt_plugin_with_version}")
+ set("${out_var}" "${qt_plugin_with_version}" PARENT_SCOPE)
+ else()
+ set("${out_var}" "" PARENT_SCOPE)
+ endif()
+endfunction()
+
+macro(_qt_import_plugin target plugin)
+ set(_final_plugin_name "${plugin}")
+ if(NOT TARGET "${plugin}")
+ _qt_get_plugin_name_with_version("${plugin}" _qt_plugin_with_version_name)
+ if(TARGET "${_qt_plugin_with_version_name}")
+ set(_final_plugin_name "${_qt_plugin_with_version_name}")
+ endif()
+ endif()
+
+ if(NOT TARGET "${_final_plugin_name}")
+ message(
+ "Warning: plug-in ${_final_plugin_name} is not known to the current Qt installation.")
+ else()
+ get_target_property(_plugin_class_name "${_final_plugin_name}" QT_PLUGIN_CLASS_NAME)
+ if(_plugin_class_name)
+ set_property(TARGET "${target}" APPEND PROPERTY QT_PLUGINS "${plugin}")
+ endif()
+ endif()
+endmacro()
+
+# This function is used to indicate which plug-ins are going to be
+# used by a given target.
+# This allows static linking to a correct set of plugins.
+# Options :
+# NO_DEFAULT: disable linking against any plug-in by default for that target, e.g. no platform plug-in.
+# INCLUDE <list of additional plug-ins to be linked against>
+# EXCLUDE <list of plug-ins to be removed from the default set>
+# INCLUDE_BY_TYPE <type> <included plugins>
+# EXCLUDE_BY_TYPE <type to be excluded>
+#
+# Example :
+# qt_import_plugins(myapp
+# INCLUDE Qt::QCocoaIntegrationPlugin
+# EXCLUDE Qt::QMinimalIntegrationPlugin
+# INCLUDE_BY_TYPE imageformats Qt::QGifPlugin Qt::QJpegPlugin
+# EXCLUDE_BY_TYPE sqldrivers
+# )
+
+# TODO : support qml plug-ins.
+function(qt6_import_plugins target)
+ cmake_parse_arguments(arg "NO_DEFAULT" "" "INCLUDE;EXCLUDE;INCLUDE_BY_TYPE;EXCLUDE_BY_TYPE" ${ARGN})
+
+ # Handle NO_DEFAULT
+ if(${arg_NO_DEFAULT})
+ set_target_properties(${target} PROPERTIES QT_DEFAULT_PLUGINS 0)
+ endif()
+
+ # Handle INCLUDE
+ foreach(plugin ${arg_INCLUDE})
+ _qt_import_plugin("${target}" "${plugin}")
+ endforeach()
+
+ # Handle EXCLUDE
+ foreach(plugin ${arg_EXCLUDE})
+ set_property(TARGET "${target}" APPEND PROPERTY QT_NO_PLUGINS "${plugin}")
+ endforeach()
+
+ # Handle INCLUDE_BY_TYPE
+ set(_current_type "")
+ foreach(_arg ${arg_INCLUDE_BY_TYPE})
+ string(REGEX REPLACE "[-/]" "_" _plugin_type "${_arg}")
+ list(FIND QT_ALL_PLUGIN_TYPES_FOUND_VIA_FIND_PACKAGE "${_plugin_type}" _has_plugin_type)
+
+ if(${_has_plugin_type} GREATER_EQUAL 0)
+ set(_current_type "${_plugin_type}")
+ else()
+ if("${_current_type}" STREQUAL "")
+ message(FATAL_ERROR "qt_import_plugins: invalid syntax for INCLUDE_BY_TYPE")
+ endif()
+
+ # Check if passed plugin target name is a version-less one, and make a version-full
+ # one.
+ _qt_get_plugin_name_with_version("${_arg}" qt_plugin_with_version)
+ if(TARGET "${_arg}" OR TARGET "${qt_plugin_with_version}")
+ set_property(TARGET "${target}" APPEND PROPERTY "QT_PLUGINS_${_current_type}" "${_arg}")
+ else()
+ message("Warning: plug-in ${_arg} is not known to the current Qt installation.")
+ endif()
+ endif()
+ endforeach()
+
+ # Handle EXCLUDE_BY_TYPE
+ foreach(_arg ${arg_EXCLUDE_BY_TYPE})
+ string(REGEX REPLACE "[-/]" "_" _plugin_type "${_arg}")
+ set_property(TARGET "${target}" PROPERTY "QT_PLUGINS_${_plugin_type}" "-")
+ endforeach()
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_import_plugins)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_import_plugins(${ARGV})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_import_plugins(${ARGV})
+ endif()
+ endfunction()
+endif()
+
+
+# Generate Qt metatypes.json for a target. By default we check whether AUTOMOC
+# has been enabled and we extract the information from that target. Should you
+# not wish to use automoc you need to pass in all the generated json files via the
+# MANUAL_MOC_JSON_FILES parameter. The latter can be obtained by running moc with
+# the --output-json parameter.
+# Params:
+# INSTALL_DIR: Location where to install the metatypes file (Optional)
+# COPY_OVER_INSTALL: When present will install the file via a post build step
+# copy rather than using install
+function(qt6_generate_meta_types_json_file target)
+
+ get_target_property(existing_meta_types_file ${target} INTERFACE_QT_META_TYPES_BUILD_FILE)
+ if (existing_meta_types_file)
+ return()
+ endif()
+
+ cmake_parse_arguments(arg "COPY_OVER_INSTALL" "INSTALL_DIR" "MANUAL_MOC_JSON_FILES" ${ARGN})
+
+ if (NOT QT_BUILDING_QT)
+ if (NOT arg_INSTALL_DIR)
+ message(FATAL_ERROR "Please specify an install directory using INSTALL_DIR")
+ endif()
+ else()
+ # Automatically fill install args when building qt
+ set(metatypes_install_dir ${INSTALL_LIBDIR}/metatypes)
+ set(args)
+ if (NOT QT_WILL_INSTALL)
+ set(arg_COPY_OVER_INSTALL TRUE)
+ endif()
+ if (NOT arg_INSTALL_DIR)
+ set(arg_INSTALL_DIR "${metatypes_install_dir}")
+ endif()
+ endif()
+
+ get_target_property(target_type ${target} TYPE)
+ if (target_type STREQUAL "INTERFACE_LIBRARY")
+ message(FATAL_ERROR "Meta types generation does not work on interface libraries")
+ return()
+ endif()
+
+ if (CMAKE_VERSION VERSION_LESS "3.16.0")
+ message(FATAL_ERROR "Meta types generation requires CMake >= 3.16")
+ return()
+ endif()
+
+ get_target_property(target_binary_dir ${target} BINARY_DIR)
+ set(type_list_file "${target_binary_dir}/meta_types/${target}_json_file_list.txt")
+ set(type_list_file_manual "${target_binary_dir}/meta_types/${target}_json_file_list_manual.txt")
+
+ get_target_property(uses_automoc ${target} AUTOMOC)
+ set(automoc_args)
+ set(automoc_dependencies)
+ #Handle automoc generated data
+ if (uses_automoc)
+ # Tell automoc to output json files)
+ set_property(TARGET "${target}" APPEND PROPERTY
+ AUTOMOC_MOC_OPTIONS "--output-json"
+ )
+
+ if(CMAKE_BUILD_TYPE)
+ set(cmake_autogen_cache_file
+ "${target_binary_dir}/CMakeFiles/${target}_autogen.dir/ParseCache.txt")
+ set(mutli_config_args
+ --cmake-autogen-include-dir-path "${target_binary_dir}/${target}_autogen/include"
+ )
+ else()
+ set(cmake_autogen_cache_file
+ "${target_binary_dir}/CMakeFiles/${target}_autogen.dir/ParseCache_$<CONFIG>.txt")
+ set(mutli_config_args
+ --cmake-autogen-include-dir-path "${target_binary_dir}/${target}_autogen/include_$<CONFIG>"
+ "--cmake-multi-config")
+ endif()
+
+ set(cmake_autogen_info_file
+ "${target_binary_dir}/CMakeFiles/${target}_autogen.dir/AutogenInfo.json")
+
+ set (use_dep_files FALSE)
+ if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.17") # Requires automoc changes present only in 3.17
+ if(CMAKE_GENERATOR STREQUAL "Ninja" OR CMAKE_GENERATOR STREQUAL "Ninja Multi-Config")
+ set(use_dep_files TRUE)
+ endif()
+ endif()
+
+ if (NOT use_dep_files)
+ add_custom_target(${target}_automoc_json_extraction
+ DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::cmake_automoc_parser
+ BYPRODUCTS ${type_list_file}
+ COMMAND
+ ${QT_CMAKE_EXPORT_NAMESPACE}::cmake_automoc_parser
+ --cmake-autogen-cache-file "${cmake_autogen_cache_file}"
+ --cmake-autogen-info-file "${cmake_autogen_info_file}"
+ --output-file-path "${type_list_file}"
+ ${mutli_config_args}
+ COMMENT "Running Automoc file extraction"
+ COMMAND_EXPAND_LISTS
+ )
+ add_dependencies(${target}_automoc_json_extraction ${target}_autogen)
+ else()
+ set(cmake_autogen_timestamp_file
+ "${target_binary_dir}/${target}_autogen/timestamp"
+ )
+
+ add_custom_command(OUTPUT ${type_list_file}
+ DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::cmake_automoc_parser
+ ${cmake_autogen_timestamp_file}
+ COMMAND
+ ${QT_CMAKE_EXPORT_NAMESPACE}::cmake_automoc_parser
+ --cmake-autogen-cache-file "${cmake_autogen_cache_file}"
+ --cmake-autogen-info-file "${cmake_autogen_info_file}"
+ --output-file-path "${type_list_file}"
+ ${mutli_config_args}
+ COMMENT "Running Automoc file extraction"
+ COMMAND_EXPAND_LISTS
+ )
+
+ endif()
+ set(automoc_args "@${type_list_file}")
+ set(automoc_dependencies "${type_list_file}")
+ endif()
+
+ set(manual_args)
+ set(manual_dependencies)
+ if(arg_MANUAL_MOC_JSON_FILES)
+ list(REMOVE_DUPLICATES arg_MANUAL_MOC_JSON_FILES)
+ file(GENERATE
+ OUTPUT ${type_list_file_manual}
+ CONTENT "$<JOIN:$<GENEX_EVAL:${arg_MANUAL_MOC_JSON_FILES}>,\n>"
+ )
+ list(APPEND manual_dependencies ${arg_MANUAL_MOC_JSON_FILES} ${type_list_file_manual})
+ set(manual_args "@${type_list_file_manual}")
+ endif()
+
+ if (NOT manual_args AND NOT automoc_args)
+ message(FATAL_ERROR "Metatype generation requires either the use of AUTOMOC or a manual list of generated json files")
+ endif()
+
+ if (CMAKE_BUILD_TYPE)
+ string(TOLOWER ${target}_${CMAKE_BUILD_TYPE} target_lowercase)
+ else()
+ string(TOLOWER ${target} target_lowercase)
+ endif()
+
+ set(metatypes_file_name "qt6${target_lowercase}_metatypes.json")
+ set(metatypes_file "${target_binary_dir}/meta_types/${metatypes_file_name}")
+ set(metatypes_file_gen "${target_binary_dir}/meta_types/${metatypes_file_name}.gen")
+
+ set(metatypes_dep_file_name "qt6${target_lowercase}_metatypes_dep.txt")
+ set(metatypes_dep_file "${target_binary_dir}/meta_types/${metatypes_dep_file_name}")
+
+ # Due to generated source file dependency rules being tied to the directory
+ # scope in which they are created it is not possible for other targets which
+ # are defined in a separate scope to see these rules. This leads to failures
+ # in locating the generated source files.
+ # To work around this we write a dummy file to disk to make sure targets
+ # which link against the current target do not produce the error. This dummy
+ # file is then replaced with the contents of the generated file during
+ # build.
+ if (NOT EXISTS ${metatypes_file})
+ file(MAKE_DIRECTORY "${target_binary_dir}/meta_types")
+ file(TOUCH ${metatypes_file})
+ endif()
+
+ # Need to make the path absolute during a Qt non-prefix build, otherwise files are written
+ # to the source dir because the paths are relative to the source dir when using file(TOUCH).
+ if(arg_COPY_OVER_INSTALL AND NOT IS_ABSOLUTE "${arg_INSTALL_DIR}/${metatypes_file_name}")
+ set(arg_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${arg_INSTALL_DIR}")
+ endif()
+
+ if (arg_COPY_OVER_INSTALL AND NOT EXISTS ${arg_INSTALL_DIR}/${metatypes_file_name})
+ file(MAKE_DIRECTORY "${arg_INSTALL_DIR}")
+ file(TOUCH "${arg_INSTALL_DIR}/${metatypes_file_name}")
+ endif()
+ add_custom_command(OUTPUT ${metatypes_file_gen} ${metatypes_file}
+ DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::moc ${automoc_dependencies} ${manual_dependencies}
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::moc
+ -o ${metatypes_file_gen}
+ --collect-json ${automoc_args} ${manual_args}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ ${metatypes_file_gen}
+ ${metatypes_file}
+ COMMENT "Runing automoc with --collect-json"
+ )
+
+ # We still need to add this file as a source of Core, otherwise the file
+ # rule above is not triggered. INTERFACE_SOURCES do not properly register
+ # as dependencies to build the current target.
+ target_sources(${target} PRIVATE ${metatypes_file_gen})
+ set(metatypes_file_genex_build)
+ set(metatypes_file_genex_install)
+ if (arg_COPY_OVER_INSTALL)
+ set(metatypes_file_genex_build
+ "$<BUILD_INTERFACE:$<$<BOOL:$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>:${arg_INSTALL_DIR}/${metatypes_file_name}>>"
+ )
+ else()
+ set(metatypes_file_genex_build
+ "$<BUILD_INTERFACE:$<$<BOOL:$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>:${metatypes_file}>>"
+ )
+ set(metatypes_file_genex_install
+ "$<INSTALL_INTERFACE:$<$<BOOL:$<TARGET_PROPERTY:QT_CONSUMES_METATYPES>>:$<INSTALL_PREFIX>/${arg_INSTALL_DIR}/${metatypes_file_name}>>"
+ )
+ endif()
+ set_source_files_properties(${metatypes_file} PROPERTIES HEADER_FILE_ONLY TRUE)
+
+ set_target_properties(${target} PROPERTIES
+ INTERFACE_QT_MODULE_HAS_META_TYPES YES
+ INTERFACE_QT_MODULE_META_TYPES_FROM_BUILD YES
+ INTERFACE_QT_META_TYPES_BUILD_FILE ${metatypes_file}
+ QT_MODULE_META_TYPES_FILE_GENEX_BUILD "${metatypes_file_genex_build}"
+ QT_MODULE_META_TYPES_FILE_GENEX_INSTALL "${metatypes_file_genex_install}"
+ )
+ target_sources(${target} INTERFACE ${metatypes_file_genex_build} ${metatypes_file_genex_install})
+
+ if (arg_COPY_OVER_INSTALL)
+ get_target_property(target_type ${target} TYPE)
+ set(command_args
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ "${metatypes_file}"
+ "${arg_INSTALL_DIR}/${metatypes_file_name}"
+ )
+ if (target_type STREQUAL "OBJECT_LIBRARY")
+ add_custom_target(${target}_metatypes_copy
+ DEPENDS "${metatypes_file}"
+ ${command_args}
+ )
+ add_dependencies(${target} ${target}_metatypes_copy)
+ else()
+ add_custom_command(TARGET ${target} POST_BUILD
+ ${command_args}
+ )
+ endif()
+ else()
+ install(FILES "${metatypes_file}"
+ DESTINATION "${arg_INSTALL_DIR}"
+ )
+ endif()
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_generate_meta_types_json_file)
+ qt6_generate_meta_types_json_file(${ARGV})
+ endfunction()
+endif()
+
+# Generate Win32 RC files for a target. All entries in the RC file are generated
+# from target prorties:
+#
+# QT_TARGET_COMPANY_NAME: RC Company name
+# QT_TARGET_DESCRIPTION: RC File Description
+# QT_TARGET_VERSION: RC File and Product Version
+# QT_TARGET_COPYRIGHT: RC LegalCopyright
+# QT_TARGET_PRODUCT_NAME: RC ProductName
+# QT_TARGET_RC_ICONS: List of paths to icon files
+#
+# If you don not wish to auto-generate rc files, it's possible to provide your
+# own RC file by setting the property QT_TARGET_WINDOWS_RC_FILE with a path to
+# an existing rc file.
+#
+function(qt6_generate_win32_rc_file target)
+
+ get_target_property(target_type ${target} TYPE)
+ if (target_type STREQUAL "INTERFACE_LIBRARY")
+ return()
+ endif()
+
+ get_target_property(target_binary_dir ${target} BINARY_DIR)
+
+ get_target_property(target_rc_file ${target} QT_TARGET_WINDOWS_RC_FILE)
+ get_target_property(target_version ${target} QT_TARGET_VERSION)
+
+ if (NOT target_rc_file AND NOT target_version)
+ return()
+ endif()
+
+ if (NOT target_rc_file)
+ # Generate RC File
+ set(rc_file_output "${target_binary_dir}/${target}_resource.rc")
+ set(target_rc_file "${rc_file_output}")
+
+ set(company_name "")
+ get_target_property(target_company_name ${target} QT_TARGET_COMPANY_NAME)
+ if (target_company_name)
+ set(company_name "${target_company_name}")
+ endif()
+
+ set(file_description "")
+ get_target_property(target_description ${target} QT_TARGET_DESCRIPTION)
+ if (target_description)
+ set(file_description "${target_description}")
+ endif()
+
+ set(legal_copyright "")
+ get_target_property(target_copyright ${target} QT_TARGET_COPYRIGHT)
+ if (target_copyright)
+ set(legal_copyright "${target_copyright}")
+ endif()
+
+ set(product_name "")
+ get_target_property(target_product_name ${target} QT_TARGET_PRODUCT_NAME)
+ if (target_product_name)
+ set(product_name "${target_product_name}")
+ else()
+ set(product_name "${target}")
+ endif()
+
+ set(product_version "")
+ if (target_version)
+ if(target_version MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+")
+ # nothing to do
+ elseif(target_version MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+")
+ set(target_version "${target_version}.0")
+ elseif(target_version MATCHES "[0-9]+\\.[0-9]+")
+ set(target_version "${target_version}.0.0")
+ elseif (target_version MATCHES "[0-9]+")
+ set(target_version "${target_version}.0.0.0")
+ else()
+ message(FATAL_ERROR "Invalid version format")
+ endif()
+ set(product_version "${target_version}")
+ else()
+ set(product_version "0.0.0.0")
+ endif()
+
+ set(file_version "${product_version}")
+ set(original_file_name "$<TARGET_FILE_NAME:${target}>")
+ string(REPLACE "." "," version_comma ${product_version})
+
+ set(icons "")
+ get_target_property(target_icons ${target} QT_TARGET_RC_ICONS)
+ if (target_icons)
+ set(index 1)
+ foreach( icon IN LISTS target_icons)
+ string(APPEND icons "IDI_ICON${index} ICON DISCARDABLE \"${icon}\"\n")
+ math(EXPR index "${index} +1")
+ endforeach()
+ endif()
+
+ set(contents "#include <windows.h>
+${incons}
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION ${version_comma}
+PRODUCTVERSION ${version_comma}
+FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0x0L
+#endif
+FILEOS VOS__WINDOWS32
+FILETYPE VFT_DLL
+FILESUBTYPE 0x0L
+BEGIN
+ BLOCK \"StringFileInfo\"
+ BEGIN
+ BLOCK \"040904b0\"
+ BEGIN
+ VALUE \"CompanyName\", \"${company_name}\"
+ VALUE \"FileDescription\", \"${file_description}\"
+ VALUE \"FileVersion\", \"${file_version}\"
+ VALUE \"LegalCopyright\", \"${legal_copyright}\"
+ VALUE \"OriginalFilename\", \"${original_file_name}\"
+ VALUE \"ProductName\", \"${product_name}\"
+ VALUE \"ProductVersion\", \"${product_version}\"
+ END
+ END
+ BLOCK \"VarFileInfo\"
+ BEGIN
+ VALUE \"Translation\", 0x0409, 1200
+ END
+END
+/* End of Version info */\n"
+ )
+
+ # We can't use the output of file generate as source so we work around
+ # this by generating the file under a different name and then copying
+ # the file in place using add custom command.
+ file(GENERATE OUTPUT "${rc_file_output}.tmp"
+ CONTENT "${contents}"
+ )
+
+ add_custom_command(OUTPUT "${target_rc_file}"
+ DEPENDS "${rc_file_output}.tmp"
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ "${target_rc_file}.tmp"
+ "${target_rc_file}"
+ )
+ endif()
+
+ target_sources(${target} PRIVATE ${target_rc_file})
+
+endfunction()
+
+function(__qt_get_relative_resource_path_for_file output_alias file)
+ get_property(alias SOURCE ${file} PROPERTY QT_RESOURCE_ALIAS)
+ if (NOT alias)
+ set(alias "${file}")
+ endif()
+ set(${output_alias} ${alias} PARENT_SCOPE)
+endfunction()
+
+function(__qt_propagate_generated_resource target resource_name generated_source_code output_generated_target)
+ get_target_property(type ${target} TYPE)
+ if(type STREQUAL STATIC_LIBRARY)
+ set(resource_target "${target}_resources_${resourceName}")
+ add_library("${resource_target}" OBJECT "${generated_source_code}")
+
+ # Use TARGET_NAME genex to map to the correct prefixed target name when it is exported
+ # via qt_install(EXPORT), so that the consumers of the target can find the object library
+ # as well.
+ target_link_libraries(${target} INTERFACE
+ "$<TARGET_OBJECTS:$<TARGET_NAME:${resource_target}>>")
+ set(${output_generated_target} "${resource_target}" PARENT_SCOPE)
+ else()
+ set(${output_generated_target} "" PARENT_SCOPE)
+ target_sources(${target} PRIVATE ${generated_source_code})
+ endif()
+endfunction()
+
+
+#
+# Process resources via file path instead of QRC files. Behind the
+# scnenes, it will generate a qrc file and apply post processing steps
+# when applicable. (e.g.: QtQuickCompiler)
+#
+# The QRC Prefix is set via the PREFIX parameter.
+#
+# Alias settings for files need to be set via the QT_RESOURCE_ALIAS property
+# via the set_soure_files_properties() command.
+#
+# When using this command with static libraries, one or more special targets
+# will be generated. Should you wish to perform additional processing on these
+# targets pass a value to the OUTPUT_TARGETS parameter.
+#
+function(QT6_PROCESS_RESOURCE target resourceName)
+
+ cmake_parse_arguments(rcc "" "PREFIX;LANG;BASE;OUTPUT_TARGETS" "FILES;OPTIONS" ${ARGN})
+
+ string(REPLACE "/" "_" resourceName ${resourceName})
+ string(REPLACE "." "_" resourceName ${resourceName})
+
+ set(output_targets "")
+ # Apply base to all files
+ if (rcc_BASE)
+ foreach(file IN LISTS rcc_FILES)
+ set(resource_file "${rcc_BASE}/${file}")
+ __qt_get_relative_resource_path_for_file(alias ${resource_file})
+ # Handle case where resources were generated from a directory
+ # different than the one where the main .pro file resides.
+ # Unless otherwise specified, we should use the original file path
+ # as alias.
+ if (alias STREQUAL resource_file)
+ set_source_files_properties(${resource_file} PROPERTIES QT_RESOURCE_ALIAS ${file})
+ endif()
+ file(TO_CMAKE_PATH ${resource_file} resource_file)
+ list(APPEND resource_files ${resource_file})
+ endforeach()
+ else()
+ set(resource_files ${rcc_FILES})
+ endif()
+
+ if(NOT rcc_PREFIX)
+ get_target_property(rcc_PREFIX ${target} QT_RESOURCE_PREFIX)
+ if (NOT rcc_PREFIX)
+ message(FATAL_ERROR "QT6_PROCESS_RESOURCE() was called without a PREFIX and the target does not provide QT_RESOURCE_PREFIX. Please either add a PREFIX or make the target ${target} provide a default.")
+ endif()
+ endif()
+
+ # Apply quick compiler pass. This is only enabled when Qt6QmlMacros is
+ # parsed.
+ if (QT6_ADD_RESOURCE_DECLARATIVE_EXTENSIONS)
+ qt6_quick_compiler_process_resources(${target} ${resourceName}
+ FILES ${resource_files}
+ PREFIX ${rcc_PREFIX}
+ OUTPUT_REMAINING_RESOURCES resources
+ OUTPUT_RESOURCE_NAME newResourceName
+ OUTPUT_GENERATED_TARGET output_target_quick
+ )
+ else()
+ set(newResourceName ${resourceName})
+ set(resources ${resource_files})
+ endif()
+
+ if (NOT resources)
+ if (rcc_OUTPUT_TARGETS)
+ set(${rcc_OUTPUT_TARGETS} "${output_target_quick}" PARENT_SCOPE)
+ endif()
+ return()
+ endif()
+ list(APPEND output_targets ${output_target_quick})
+ set(generatedResourceFile "${CMAKE_CURRENT_BINARY_DIR}/.rcc/generated_${newResourceName}.qrc")
+ set(generatedSourceCode "${CMAKE_CURRENT_BINARY_DIR}/.rcc/qrc_${newResourceName}.cpp")
+
+ # Generate .qrc file:
+
+ # <RCC><qresource ...>
+ set(qrcContents "<RCC>\n <qresource")
+ if (rcc_PREFIX)
+ string(APPEND qrcContents " prefix=\"${rcc_PREFIX}\"")
+ endif()
+ if (rcc_LANG)
+ string(APPEND qrcContents " lang=\"${rcc_LANG}\"")
+ endif()
+ string(APPEND qrcContents ">\n")
+
+ set(resource_dependencies)
+ foreach(file IN LISTS resources)
+ __qt_get_relative_resource_path_for_file(file_resource_path ${file})
+
+ if (NOT IS_ABSOLUTE ${file})
+ set(file "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
+ endif()
+
+ ### FIXME: escape file paths to be XML conform
+ # <file ...>...</file>
+ string(APPEND qrcContents " <file alias=\"${file_resource_path}\">")
+ string(APPEND qrcContents "${file}</file>\n")
+ list(APPEND files "${file}")
+
+ get_source_file_property(target_dependency ${file} QT_RESOURCE_TARGET_DEPENDENCY)
+ if (NOT target_dependency)
+ list(APPEND resource_dependencies ${file})
+ else()
+ if (NOT TARGET ${target_dependency})
+ message(FATAL_ERROR "Target dependency on resource file ${file} is not a cmake target.")
+ endif()
+ list(APPEND resource_dependencies ${target_dependency})
+ endif()
+ endforeach()
+
+ # </qresource></RCC>
+ string(APPEND qrcContents " </qresource>\n</RCC>\n")
+
+ file(GENERATE OUTPUT "${generatedResourceFile}" CONTENT "${qrcContents}")
+
+ set(rccArgs --name "${newResourceName}"
+ --output "${generatedSourceCode}" "${generatedResourceFile}")
+ if(rcc_OPTIONS)
+ list(APPEND rccArgs ${rcc_OPTIONS})
+ endif()
+
+ # When cross-building, we use host tools to generate target code. If the host rcc was compiled
+ # with zstd support, it expects the target QtCore to be able to decompress zstd compressed
+ # content. This might be true with qmake where host tools are built as part of the
+ # cross-compiled Qt, but with CMake we build tools separate from the cross-compiled Qt.
+ # If the target does not support zstd (feature is disabled), tell rcc not to generate
+ # zstd related code.
+ if(NOT QT_FEATURE_zstd)
+ list(APPEND rccArgs "--no-zstd")
+ endif()
+
+ # Process .qrc file:
+ add_custom_command(OUTPUT "${generatedSourceCode}"
+ COMMAND "${QT_CMAKE_EXPORT_NAMESPACE}::rcc"
+ ARGS ${rccArgs}
+ DEPENDS
+ ${resource_dependencies}
+ ${generatedResourceFile}
+ "${QT_CMAKE_EXPORT_NAMESPACE}::rcc"
+ COMMENT "RCC ${newResourceName}"
+ VERBATIM)
+
+ get_target_property(type "${target}" TYPE)
+ # Only do this if newResourceName is the same as resourceName, since
+ # the resource will be chainloaded by the qt quickcompiler
+ # qml cache loader
+ if(newResourceName STREQUAL resourceName)
+ __qt_propagate_generated_resource(${target} ${resourceName} "${generatedSourceCode}" output_target)
+ list(APPEND output_targets ${output_target})
+ else()
+ target_sources(${target} PRIVATE "${generatedSourceCode}")
+ endif()
+ if (rcc_OUTPUT_TARGETS)
+ set(${rcc_OUTPUT_TARGETS} "${output_targets}" PARENT_SCOPE)
+ endif()
+endfunction()
diff --git a/src/corelib/Qt5ModuleLocation.cmake.in b/src/corelib/Qt6ModuleLocation.cmake.in
index cf70f6bc0e..cf70f6bc0e 100644
--- a/src/corelib/Qt5ModuleLocation.cmake.in
+++ b/src/corelib/Qt6ModuleLocation.cmake.in
diff --git a/src/corelib/Qt5ModuleLocationForInstall.cmake.in b/src/corelib/Qt6ModuleLocationForInstall.cmake.in
index 8751e4acbc..8751e4acbc 100644
--- a/src/corelib/Qt5ModuleLocationForInstall.cmake.in
+++ b/src/corelib/Qt6ModuleLocationForInstall.cmake.in
diff --git a/src/corelib/codecs/qutfcodec.cpp b/src/corelib/codecs/qutfcodec.cpp
index 8561f908b9..9419ce8d84 100644
--- a/src/corelib/codecs/qutfcodec.cpp
+++ b/src/corelib/codecs/qutfcodec.cpp
@@ -972,6 +972,25 @@ QString QUtf32::convertToUnicode(const char *chars, int len, QTextCodec::Convert
return result;
}
+QString qFromUtfEncoded(const QByteArray &ba)
+{
+ const int arraySize = ba.size();
+ const uchar *buf = reinterpret_cast<const uchar *>(ba.constData());
+ const uint bom = 0xfeff;
+
+ if (arraySize > 3) {
+ uint uc = qFromUnaligned<uint>(buf);
+ if (uc == qToBigEndian(bom) || uc == qToLittleEndian(bom))
+ return QUtf32::convertToUnicode(ba.constData(), ba.length(), nullptr); // utf-32
+ }
+
+ if (arraySize > 1) {
+ ushort uc = qFromUnaligned<ushort>(buf);
+ if (uc == qToBigEndian(ushort(bom)) || qToLittleEndian(ushort(bom)))
+ return QUtf16::convertToUnicode(ba.constData(), ba.length(), nullptr); // utf-16
+ }
+ return QUtf8::convertToUnicode(ba.constData(), ba.length());
+}
#if QT_CONFIG(textcodec)
diff --git a/src/corelib/codecs/qutfcodec_p.h b/src/corelib/codecs/qutfcodec_p.h
index 083e16317a..b1c7a23d4f 100644
--- a/src/corelib/codecs/qutfcodec_p.h
+++ b/src/corelib/codecs/qutfcodec_p.h
@@ -54,6 +54,7 @@
#include <QtCore/qstring.h>
#include <QtCore/qlist.h>
+#include <QtCore/qendian.h>
#if QT_CONFIG(textcodec)
#include "QtCore/qtextcodec.h"
@@ -317,6 +318,13 @@ struct QUtf32
static QByteArray convertFromUnicode(const QChar *, int, QTextCodec::ConverterState *, DataEndianness = DetectEndianness);
};
+/*
+ Converts from different utf encodings looking at a possible byte order mark at the
+ beginning of the string. If no BOM exists, utf-8 is assumed.
+ */
+QString Q_CORE_EXPORT qFromUtfEncoded(const QByteArray &ba);
+
+
#if QT_CONFIG(textcodec)
class QUtf8Codec : public QTextCodec {
diff --git a/src/corelib/configure.cmake b/src/corelib/configure.cmake
new file mode 100644
index 0000000000..4622f73c0f
--- /dev/null
+++ b/src/corelib/configure.cmake
@@ -0,0 +1,1048 @@
+
+
+#### Inputs
+
+# input doubleconversion
+set(INPUT_doubleconversion "undefined" CACHE STRING "")
+set_property(CACHE INPUT_doubleconversion PROPERTY STRINGS undefined no qt system)
+
+# input iconv
+set(INPUT_iconv "undefined" CACHE STRING "")
+set_property(CACHE INPUT_iconv PROPERTY STRINGS undefined no yes posix sun gnu)
+
+
+
+#### Libraries
+
+qt_find_package(WrapDoubleConversion PROVIDED_TARGETS WrapDoubleConversion::WrapDoubleConversion)
+qt_find_package(GLIB2 PROVIDED_TARGETS GLIB2::GLIB2)
+qt_find_package(ICU COMPONENTS i18n uc data PROVIDED_TARGETS ICU::i18n ICU::uc ICU::data)
+qt_find_package(Libsystemd PROVIDED_TARGETS PkgConfig::Libsystemd)
+qt_find_package(Atomic PROVIDED_TARGETS Atomic)
+qt_find_package(WrapRt PROVIDED_TARGETS WrapRt)
+qt_find_package(LTTngUST PROVIDED_TARGETS LTTng::UST)
+qt_find_package(WrapSystemPCRE2 PROVIDED_TARGETS WrapSystemPCRE2::WrapSystemPCRE2)
+set_package_properties(WrapPCRE2 PROPERTIES TYPE REQUIRED)
+if((QNX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(PPS PROVIDED_TARGETS PPS::PPS)
+endif()
+qt_find_package(Slog2 PROVIDED_TARGETS Slog2::Slog2)
+
+
+#### Tests
+
+# atomicfptr
+qt_config_compile_test(atomicfptr
+ LABEL "working std::atomic for function pointers"
+ CODE
+"
+#include <atomic>
+typedef void (*fptr)(int);
+typedef std::atomic<fptr> atomicfptr;
+void testfunction(int) { }
+void test(volatile atomicfptr &a)
+{
+ fptr v = a.load(std::memory_order_acquire);
+ while (!a.compare_exchange_strong(v, &testfunction,
+ std::memory_order_acq_rel,
+ std::memory_order_acquire)) {
+ v = a.exchange(&testfunction);
+ }
+ a.store(&testfunction, std::memory_order_release);
+}
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+atomicfptr fptr(testfunction);
+test(fptr);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# clock-monotonic
+qt_config_compile_test(clock_monotonic
+ LABEL "POSIX monotonic clock"
+ LIBRARIES
+ WrapRt
+ CODE
+"
+#include <unistd.h>
+#include <time.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+#if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK-0 >= 0)
+timespec ts;
+clock_gettime(CLOCK_MONOTONIC, &ts);
+#else
+# error Feature _POSIX_MONOTONIC_CLOCK not available
+#endif
+ /* END TEST: */
+ return 0;
+}
+")
+
+# cloexec
+qt_config_compile_test(cloexec
+ LABEL "O_CLOEXEC"
+ CODE
+"#define _GNU_SOURCE 1
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+int pipes[2];
+(void) pipe2(pipes, O_CLOEXEC | O_NONBLOCK);
+(void) fcntl(0, F_DUPFD_CLOEXEC, 0);
+(void) dup3(0, 3, O_CLOEXEC);
+#if defined(__NetBSD__)
+(void) paccept(0, 0, 0, NULL, SOCK_CLOEXEC | SOCK_NONBLOCK);
+#else
+(void) accept4(0, 0, 0, SOCK_CLOEXEC | SOCK_NONBLOCK);
+#endif
+ /* END TEST: */
+ return 0;
+}
+")
+
+# cxx11_future
+if (UNIX)
+ set(cxx11_future_TEST_LIBRARIES pthread)
+endif()
+qt_config_compile_test(cxx11_future
+ LABEL "C++11 <future>"
+ LIBRARIES
+ "${cxx11_future_TEST_LIBRARIES}"
+ CODE
+"
+#include <future>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+std::future<int> f = std::async([]() { return 42; });
+(void)f.get();
+ /* END TEST: */
+ return 0;
+}
+")
+
+# cxx11_random
+qt_config_compile_test(cxx11_random
+ LABEL "C++11 <random>"
+ CODE
+"
+#include <random>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+std::mt19937 mt(0);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# cxx17_filesystem
+qt_config_compile_test(cxx17_filesystem
+ LABEL "C++17 <filesystem>"
+ CODE
+"
+#include <filesystem>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+std::filesystem::copy(
+ std::filesystem::path(\"./file\"),
+ std::filesystem::path(\"./other\"));
+ /* END TEST: */
+ return 0;
+}
+"# FIXME: qmake: CONFIG += c++17
+)
+
+# eventfd
+qt_config_compile_test(eventfd
+ LABEL "eventfd"
+ CODE
+"
+#include <sys/eventfd.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+eventfd_t value;
+int fd = eventfd(0, EFD_CLOEXEC);
+eventfd_read(fd, &value);
+eventfd_write(fd, value);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# futimens
+qt_config_compile_test(futimens
+ LABEL "futimens()"
+ CODE
+"
+#include <sys/stat.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+futimens(-1, 0);
+ /* END TEST: */
+ return 0;
+}
+"# FIXME: qmake: ["# Block futimens() on Apple platforms unless it's available on ALL", '# deployment targets. This simplifies the logic at the call site', "# dramatically, as it isn't strictly needed compared to futimes().", 'darwin: QMAKE_CXXFLAGS += -Werror=unguarded-availability']
+)
+
+# futimes
+qt_config_compile_test(futimes
+ LABEL "futimes()"
+ CODE
+"
+#include <sys/time.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+futimes(-1, 0);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# getauxval
+qt_config_compile_test(getauxval
+ LABEL "getauxval()"
+ CODE
+"
+#include <sys/auxv.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+(void) getauxval(AT_NULL);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# getentropy
+qt_config_compile_test(getentropy
+ LABEL "getentropy()"
+ CODE
+"
+#include <unistd.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+char buf[32];
+(void) getentropy(buf, sizeof(buf));
+ /* END TEST: */
+ return 0;
+}
+")
+
+# glibc
+qt_config_compile_test(glibc
+ LABEL "GNU libc"
+ CODE
+"
+#include <stdlib.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+return __GLIBC__;
+ /* END TEST: */
+ return 0;
+}
+")
+
+# inotify
+qt_config_compile_test(inotify
+ LABEL "inotify"
+ CODE
+"
+#include <sys/inotify.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+inotify_init();
+inotify_add_watch(0, \"foobar\", IN_ACCESS);
+inotify_rm_watch(0, 1);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# ipc_sysv
+qt_config_compile_test(ipc_sysv
+ LABEL "SysV IPC"
+ CODE
+"
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <sys/shm.h>
+#include <fcntl.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+key_t unix_key = ftok(\"test\", 'Q');
+semctl(semget(unix_key, 1, 0666 | IPC_CREAT | IPC_EXCL), 0, IPC_RMID, 0);
+shmget(unix_key, 0, 0666 | IPC_CREAT | IPC_EXCL);
+shmctl(0, 0, (struct shmid_ds *)(0));
+ /* END TEST: */
+ return 0;
+}
+")
+
+# ipc_posix
+if (LINUX)
+ set(ipc_posix_TEST_LIBRARIES pthread rt)
+endif()
+qt_config_compile_test(ipc_posix
+ LABEL "POSIX IPC"
+ LIBRARIES
+ "${ipc_posix_TEST_LIBRARIES}"
+ CODE
+"
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <semaphore.h>
+#include <fcntl.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+sem_close(sem_open(\"test\", O_CREAT | O_EXCL, 0666, 0));
+shm_open(\"test\", O_RDWR | O_CREAT | O_EXCL, 0666);
+shm_unlink(\"test\");
+ /* END TEST: */
+ return 0;
+}
+")
+
+# linkat
+qt_config_compile_test(linkat
+ LABEL "linkat()"
+ CODE
+"#define _ATFILE_SOURCE 1
+#include <fcntl.h>
+#include <unistd.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+linkat(AT_FDCWD, \"foo\", AT_FDCWD, \"bar\", AT_SYMLINK_FOLLOW);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# ppoll
+qt_config_compile_test(ppoll
+ LABEL "ppoll()"
+ CODE
+"
+#include <signal.h>
+#include <poll.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+struct pollfd pfd;
+struct timespec ts;
+sigset_t sig;
+ppoll(&pfd, 1, &ts, &sig);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# pollts
+qt_config_compile_test(pollts
+ LABEL "pollts()"
+ CODE
+"
+#include <poll.h>
+#include <signal.h>
+#include <time.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+struct pollfd pfd;
+struct timespec ts;
+sigset_t sig;
+pollts(&pfd, 1, &ts, &sig);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# poll
+qt_config_compile_test(poll
+ LABEL "poll()"
+ CODE
+"
+#include <poll.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+struct pollfd pfd;
+poll(&pfd, 1, 0);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# renameat2
+qt_config_compile_test(renameat2
+ LABEL "renameat2()"
+ CODE
+"#define _ATFILE_SOURCE 1
+#include <fcntl.h>
+#include <stdio.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+renameat2(AT_FDCWD, argv[1], AT_FDCWD, argv[2], RENAME_NOREPLACE | RENAME_WHITEOUT);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# statx
+qt_config_compile_test(statx
+ LABEL "statx() in libc"
+ CODE
+"#define _ATFILE_SOURCE 1
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+struct statx statxbuf;
+unsigned int mask = STATX_BASIC_STATS;
+return statx(AT_FDCWD, \"\", AT_STATX_SYNC_AS_STAT, mask, &statxbuf);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# syslog
+qt_config_compile_test(syslog
+ LABEL "syslog"
+ CODE
+"
+#include <syslog.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+openlog(\"qt\", 0, LOG_USER);
+syslog(LOG_INFO, \"configure\");
+closelog();
+ /* END TEST: */
+ return 0;
+}
+")
+
+# xlocalescanprint
+qt_config_compile_test(xlocalescanprint
+ LABEL "xlocale.h (or equivalents)"
+ CODE
+"
+
+#define QT_BEGIN_NAMESPACE
+#define QT_END_NAMESPACE
+
+#ifdef _MSVC_VER
+#define Q_CC_MSVC _MSVC_VER
+#endif
+
+#define QT_NO_DOUBLECONVERSION
+
+#include QDSP_P_H
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+#ifdef _MSVC_VER
+_locale_t invalidLocale = NULL;
+#else
+locale_t invalidLocale = NULL;
+#endif
+double a = 3.4;
+qDoubleSnprintf(argv[0], 1, invalidLocale, \"invalid format\", a);
+qDoubleSscanf(argv[0], invalidLocale, \"invalid format\", &a, &argc);
+ /* END TEST: */
+ return 0;
+}
+"# FIXME: qmake: DEFINES += QDSP_P_H=$$shell_quote(\"@PWD@/text/qdoublescanprint_p.h\")
+)
+
+
+
+#### Features
+
+qt_feature("clock-gettime" PRIVATE
+ LABEL "clock_gettime()"
+ CONDITION UNIX AND WrapRt_FOUND
+)
+qt_feature("clock-monotonic" PUBLIC
+ LABEL "POSIX monotonic clock"
+ CONDITION QT_FEATURE_clock_gettime AND TEST_clock_monotonic
+)
+qt_feature_definition("clock-monotonic" "QT_NO_CLOCK_MONOTONIC" NEGATE VALUE "1")
+qt_feature("doubleconversion" PUBLIC PRIVATE
+ LABEL "DoubleConversion"
+)
+qt_feature_definition("doubleconversion" "QT_NO_DOUBLECONVERSION" NEGATE VALUE "1")
+qt_feature("system-doubleconversion" PRIVATE
+ LABEL " Using system DoubleConversion"
+ CONDITION QT_FEATURE_doubleconversion AND WrapDoubleConversion_FOUND
+ ENABLE INPUT_doubleconversion STREQUAL 'system'
+ DISABLE INPUT_doubleconversion STREQUAL 'qt'
+)
+qt_feature("cxx11_future" PUBLIC
+ LABEL "C++11 <future>"
+ CONDITION TEST_cxx11_future
+)
+qt_feature("cxx17_filesystem" PUBLIC
+ LABEL "C++17 <filesystem>"
+ CONDITION TEST_cxx17_filesystem
+)
+qt_feature("eventfd" PUBLIC
+ LABEL "eventfd"
+ CONDITION NOT WASM AND TEST_eventfd
+)
+qt_feature_definition("eventfd" "QT_NO_EVENTFD" NEGATE VALUE "1")
+qt_feature("futimens" PRIVATE
+ LABEL "futimens()"
+ CONDITION NOT WIN32 AND TEST_futimens
+)
+qt_feature("futimes" PRIVATE
+ LABEL "futimes()"
+ CONDITION NOT WIN32 AND NOT QT_FEATURE_futimens AND TEST_futimes
+)
+qt_feature("getauxval" PRIVATE
+ LABEL "getauxval()"
+ CONDITION LINUX AND TEST_getauxval
+)
+qt_feature("getentropy" PRIVATE
+ LABEL "getentropy()"
+ CONDITION UNIX AND TEST_getentropy
+)
+qt_feature("glib" PUBLIC PRIVATE
+ LABEL "GLib"
+ AUTODETECT NOT WIN32
+ CONDITION GLIB2_FOUND
+)
+qt_feature_definition("glib" "QT_NO_GLIB" NEGATE VALUE "1")
+qt_feature("glibc" PRIVATE
+ LABEL "GNU libc"
+ AUTODETECT LINUX
+ CONDITION TEST_glibc
+)
+qt_feature("iconv" PUBLIC PRIVATE
+ SECTION "Internationalization"
+ LABEL "iconv"
+ PURPOSE "Provides internationalization on Unix."
+ CONDITION NOT QT_FEATURE_icu AND QT_FEATURE_textcodec AND ( TEST_posix_iconv OR TEST_sun_iconv )
+)
+qt_feature_definition("iconv" "QT_NO_ICONV" NEGATE VALUE "1")
+qt_feature("posix-libiconv" PRIVATE
+ LABEL "POSIX iconv"
+ CONDITION NOT WIN32 AND NOT QNX AND NOT ANDROID AND NOT APPLE AND TEST_posix_iconv AND TEST_iconv_needlib
+ ENABLE TEST_posix_iconv AND TEST_iconv_needlib
+ DISABLE NOT TEST_posix_iconv OR NOT TEST_iconv_needlib
+)
+qt_feature("sun-libiconv"
+ LABEL "SUN iconv"
+ CONDITION NOT WIN32 AND NOT QNX AND NOT ANDROID AND NOT APPLE AND TEST_sun_iconv
+ ENABLE TEST_sun_iconv
+ DISABLE NOT TEST_sun_iconv
+)
+qt_feature("gnu-libiconv" PRIVATE
+ LABEL "GNU iconv"
+ CONDITION NOT WIN32 AND NOT QNX AND NOT ANDROID AND NOT APPLE AND TEST_posix_iconv AND NOT TEST_iconv_needlib
+ ENABLE TEST_posix_iconv AND NOT TEST_iconv_needlib
+ DISABLE NOT TEST_posix_iconv OR TEST_iconv_needlib
+)
+qt_feature("icu" PRIVATE
+ LABEL "ICU"
+ AUTODETECT NOT WIN32
+ CONDITION ICU_FOUND
+)
+qt_feature("inotify" PUBLIC PRIVATE
+ LABEL "inotify"
+ CONDITION TEST_inotify
+)
+qt_feature_definition("inotify" "QT_NO_INOTIFY" NEGATE VALUE "1")
+qt_feature("ipc_posix"
+ LABEL "Using POSIX IPC"
+ AUTODETECT NOT WIN32
+ CONDITION NOT TEST_ipc_sysv AND TEST_ipc_posix
+)
+qt_feature_definition("ipc_posix" "QT_POSIX_IPC")
+qt_feature("journald" PRIVATE
+ LABEL "journald"
+ AUTODETECT OFF
+ CONDITION Libsystemd_FOUND
+)
+# Currently only used by QTemporaryFile; linkat() exists on Android, but hardlink creation fails due to security rules
+qt_feature("linkat" PRIVATE
+ LABEL "linkat()"
+ AUTODETECT LINUX AND NOT ANDROID
+ CONDITION TEST_linkat
+)
+qt_feature("std-atomic64" PUBLIC
+ LABEL "64 bit atomic operations"
+ CONDITION Atomic_FOUND
+)
+qt_feature("mimetype" PUBLIC
+ SECTION "Utilities"
+ LABEL "Mimetype handling"
+ PURPOSE "Provides MIME type handling."
+ CONDITION QT_FEATURE_textcodec
+)
+qt_feature_definition("mimetype" "QT_NO_MIMETYPE" NEGATE VALUE "1")
+qt_feature("mimetype-database" PRIVATE
+ LABEL "Built-in copy of the MIME database"
+ CONDITION QT_FEATURE_mimetype
+)
+qt_feature("pcre2"
+ LABEL "PCRE2"
+ ENABLE INPUT_pcre STREQUAL 'qt'
+ DISABLE INPUT_pcre STREQUAL 'no' OR INPUT_pcre STREQUAL 'system'
+)
+qt_feature_config("pcre2" QMAKE_PRIVATE_CONFIG)
+qt_feature("system-pcre2" PRIVATE
+ LABEL " Using system PCRE2"
+ CONDITION WrapSystemPCRE2_FOUND
+ ENABLE INPUT_pcre STREQUAL 'system'
+ DISABLE INPUT_pcre STREQUAL 'no' OR INPUT_pcre STREQUAL 'qt'
+)
+qt_feature("poll_ppoll" PRIVATE
+ LABEL "Native ppoll()"
+ CONDITION NOT WASM AND TEST_ppoll
+ EMIT_IF NOT WIN32
+)
+qt_feature("poll_pollts" PRIVATE
+ LABEL "Native pollts()"
+ CONDITION NOT QT_FEATURE_poll_ppoll AND TEST_pollts
+ EMIT_IF NOT WIN32
+)
+qt_feature("poll_poll" PRIVATE
+ LABEL "Native poll()"
+ CONDITION NOT QT_FEATURE_poll_ppoll AND NOT QT_FEATURE_poll_pollts AND TEST_poll
+ EMIT_IF NOT WIN32
+)
+qt_feature("poll_select" PRIVATE
+ LABEL "Emulated poll()"
+ CONDITION NOT QT_FEATURE_poll_ppoll AND NOT QT_FEATURE_poll_pollts AND NOT QT_FEATURE_poll_poll
+ EMIT_IF NOT WIN32
+)
+qt_feature_definition("poll_select" "QT_NO_NATIVE_POLL")
+qt_feature("qqnx_pps" PRIVATE
+ LABEL "PPS"
+ CONDITION PPS_FOUND
+ EMIT_IF QNX
+)
+qt_feature("renameat2" PRIVATE
+ LABEL "renameat2()"
+ CONDITION LINUX AND TEST_renameat2
+)
+qt_feature("slog2" PRIVATE
+ LABEL "slog2"
+ CONDITION Slog2_FOUND
+)
+qt_feature("statx" PRIVATE
+ LABEL "statx() in libc"
+ CONDITION LINUX AND TEST_statx
+)
+qt_feature("syslog" PRIVATE
+ LABEL "syslog"
+ AUTODETECT OFF
+ CONDITION TEST_syslog
+)
+qt_feature("threadsafe-cloexec"
+ LABEL "Threadsafe pipe creation"
+ CONDITION TEST_cloexec
+)
+qt_feature_definition("threadsafe-cloexec" "QT_THREADSAFE_CLOEXEC" VALUE "1")
+qt_feature_config("threadsafe-cloexec" QMAKE_PUBLIC_QT_CONFIG)
+qt_feature("properties" PUBLIC
+ SECTION "Kernel"
+ LABEL "Properties"
+ PURPOSE "Supports scripting Qt-based applications."
+)
+qt_feature_definition("properties" "QT_NO_PROPERTIES" NEGATE VALUE "1")
+qt_feature("regularexpression" PUBLIC
+ SECTION "Kernel"
+ LABEL "QRegularExpression"
+ PURPOSE "Provides an API to Perl-compatible regular expressions."
+ CONDITION QT_FEATURE_system_pcre2 OR QT_FEATURE_pcre2
+)
+qt_feature_definition("regularexpression" "QT_NO_REGULAREXPRESSION" NEGATE VALUE "1")
+qt_feature("sharedmemory" PUBLIC
+ SECTION "Kernel"
+ LABEL "QSharedMemory"
+ PURPOSE "Provides access to a shared memory segment."
+ CONDITION ( ANDROID OR WIN32 OR ( NOT VXWORKS AND ( TEST_ipc_sysv OR TEST_ipc_posix ) ) )
+)
+qt_feature_definition("sharedmemory" "QT_NO_SHAREDMEMORY" NEGATE VALUE "1")
+qt_feature("shortcut" PUBLIC
+ SECTION "Kernel"
+ LABEL "QShortcut"
+ PURPOSE "Provides keyboard accelerators and shortcuts."
+)
+qt_feature_definition("shortcut" "QT_NO_SHORTCUT" NEGATE VALUE "1")
+qt_feature("systemsemaphore" PUBLIC
+ SECTION "Kernel"
+ LABEL "QSystemSemaphore"
+ PURPOSE "Provides a general counting system semaphore."
+ CONDITION ( NOT INTEGRITY AND NOT VXWORKS AND NOT rtems ) AND ( ANDROID OR WIN32 OR TEST_ipc_sysv OR TEST_ipc_posix )
+)
+qt_feature_definition("systemsemaphore" "QT_NO_SYSTEMSEMAPHORE" NEGATE VALUE "1")
+qt_feature("xmlstream" PUBLIC
+ SECTION "Kernel"
+ LABEL "XML Streaming APIs"
+ PURPOSE "Provides a simple streaming API for XML."
+)
+qt_feature_definition("xmlstream" "QT_NO_XMLSTREAM" NEGATE VALUE "1")
+qt_feature("xmlstreamreader" PUBLIC
+ SECTION "Kernel"
+ LABEL "QXmlStreamReader"
+ PURPOSE "Provides a well-formed XML parser with a simple streaming API."
+ CONDITION QT_FEATURE_xmlstream
+)
+qt_feature_definition("xmlstreamreader" "QT_NO_XMLSTREAMREADER" NEGATE VALUE "1")
+qt_feature("xmlstreamwriter" PUBLIC
+ SECTION "Kernel"
+ LABEL "QXmlStreamWriter"
+ PURPOSE "Provides a XML writer with a simple streaming API."
+ CONDITION QT_FEATURE_xmlstream
+)
+qt_feature_definition("xmlstreamwriter" "QT_NO_XMLSTREAMWRITER" NEGATE VALUE "1")
+qt_feature("textdate" PUBLIC
+ SECTION "Data structures"
+ LABEL "Text Date"
+ PURPOSE "Supports month and day names in dates."
+)
+qt_feature_definition("textdate" "QT_NO_TEXTDATE" NEGATE VALUE "1")
+qt_feature("datestring" PUBLIC
+ SECTION "Data structures"
+ LABEL "QDate/QTime/QDateTime"
+ PURPOSE "Provides conversion between dates and strings."
+ CONDITION QT_FEATURE_textdate
+)
+qt_feature_definition("datestring" "QT_NO_DATESTRING" NEGATE VALUE "1")
+qt_feature("process" PUBLIC
+ SECTION "File I/O"
+ LABEL "QProcess"
+ PURPOSE "Supports external process invocation."
+ CONDITION QT_FEATURE_processenvironment AND ( QT_FEATURE_thread OR NOT UNIX ) AND NOT WINRT AND NOT UIKIT AND NOT INTEGRITY AND NOT VXWORKS AND NOT rtems
+)
+qt_feature_definition("process" "QT_NO_PROCESS" NEGATE VALUE "1")
+qt_feature("processenvironment" PUBLIC
+ SECTION "File I/O"
+ LABEL "QProcessEnvironment"
+ PURPOSE "Provides a higher-level abstraction of environment variables."
+ CONDITION NOT WINRT AND NOT INTEGRITY AND NOT rtems
+)
+qt_feature("temporaryfile" PUBLIC
+ SECTION "File I/O"
+ LABEL "QTemporaryFile"
+ PURPOSE "Provides an I/O device that operates on temporary files."
+)
+qt_feature_definition("temporaryfile" "QT_NO_TEMPORARYFILE" NEGATE VALUE "1")
+qt_feature("library" PUBLIC
+ SECTION "File I/O"
+ LABEL "QLibrary"
+ PURPOSE "Provides a wrapper for dynamically loaded libraries."
+ CONDITION WIN32 OR HPUX OR ( NOT NACL AND QT_FEATURE_dlopen )
+)
+qt_feature_definition("library" "QT_NO_LIBRARY" NEGATE VALUE "1")
+qt_feature("settings" PUBLIC
+ SECTION "File I/O"
+ LABEL "QSettings"
+ PURPOSE "Provides persistent application settings."
+)
+qt_feature_definition("settings" "QT_NO_SETTINGS" NEGATE VALUE "1")
+qt_feature("filesystemwatcher" PUBLIC
+ SECTION "File I/O"
+ LABEL "QFileSystemWatcher"
+ PURPOSE "Provides an interface for monitoring files and directories for modifications."
+ CONDITION NOT WINRT
+)
+qt_feature_definition("filesystemwatcher" "QT_NO_FILESYSTEMWATCHER" NEGATE VALUE "1")
+qt_feature("filesystemiterator" PUBLIC
+ SECTION "File I/O"
+ LABEL "QFileSystemIterator"
+ PURPOSE "Provides fast file system iteration."
+)
+qt_feature_definition("filesystemiterator" "QT_NO_FILESYSTEMITERATOR" NEGATE VALUE "1")
+qt_feature("itemmodel" PUBLIC
+ SECTION "ItemViews"
+ LABEL "Qt Item Model"
+ PURPOSE "Provides the item model for item views"
+)
+qt_feature_definition("itemmodel" "QT_NO_ITEMMODEL" NEGATE VALUE "1")
+qt_feature("proxymodel" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QAbstractProxyModel"
+ PURPOSE "Supports processing of data passed between another model and a view."
+ CONDITION QT_FEATURE_itemmodel
+)
+qt_feature_definition("proxymodel" "QT_NO_PROXYMODEL" NEGATE VALUE "1")
+qt_feature("sortfilterproxymodel" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QSortFilterProxyModel"
+ PURPOSE "Supports sorting and filtering of data passed between another model and a view."
+ CONDITION QT_FEATURE_proxymodel
+)
+qt_feature_definition("sortfilterproxymodel" "QT_NO_SORTFILTERPROXYMODEL" NEGATE VALUE "1")
+qt_feature("identityproxymodel" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QIdentityProxyModel"
+ PURPOSE "Supports proxying a source model unmodified."
+ CONDITION QT_FEATURE_proxymodel
+)
+qt_feature_definition("identityproxymodel" "QT_NO_IDENTITYPROXYMODEL" NEGATE VALUE "1")
+qt_feature("transposeproxymodel" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QTransposeProxyModel"
+ PURPOSE "Provides a proxy to swap rows and columns of a model."
+ CONDITION QT_FEATURE_proxymodel
+)
+qt_feature_definition("transposeproxymodel" "QT_NO_TRANSPOSEPROXYMODEL" NEGATE VALUE "1")
+qt_feature("concatenatetablesproxymodel" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QConcatenateTablesProxyModel"
+ PURPOSE "Supports concatenating source models."
+ CONDITION QT_FEATURE_proxymodel
+)
+qt_feature_definition("concatenatetablesproxymodel" "QT_NO_CONCATENATETABLESPROXYMODEL" NEGATE VALUE "1")
+qt_feature("stringlistmodel" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QStringListModel"
+ PURPOSE "Provides a model that supplies strings to views."
+ CONDITION QT_FEATURE_itemmodel
+)
+qt_feature_definition("stringlistmodel" "QT_NO_STRINGLISTMODEL" NEGATE VALUE "1")
+qt_feature("translation" PUBLIC
+ SECTION "Internationalization"
+ LABEL "Translation"
+ PURPOSE "Supports translations using QObject::tr()."
+)
+qt_feature_definition("translation" "QT_NO_TRANSLATION" NEGATE VALUE "1")
+qt_feature("textcodec" PUBLIC
+ SECTION "Internationalization"
+ LABEL "QTextCodec"
+ PURPOSE "Supports conversions between text encodings."
+)
+qt_feature_definition("textcodec" "QT_NO_TEXTCODEC" NEGATE VALUE "1")
+qt_feature("codecs" PUBLIC
+ SECTION "Internationalization"
+ LABEL "Codecs"
+ PURPOSE "Supports non-unicode text conversions."
+ CONDITION QT_FEATURE_textcodec
+)
+qt_feature_definition("codecs" "QT_NO_CODECS" NEGATE VALUE "1")
+qt_feature("big_codecs" PUBLIC
+ SECTION "Internationalization"
+ LABEL "Big Codecs"
+ PURPOSE "Supports big codecs, e.g. CJK."
+ CONDITION QT_FEATURE_textcodec
+)
+qt_feature_definition("big_codecs" "QT_NO_BIG_CODECS" NEGATE VALUE "1")
+qt_feature("easingcurve" PUBLIC
+ SECTION "Utilities"
+ LABEL "Easing curve"
+ PURPOSE "Provides easing curve."
+)
+qt_feature("animation" PUBLIC
+ SECTION "Utilities"
+ LABEL "Animation"
+ PURPOSE "Provides a framework for animations."
+ CONDITION QT_FEATURE_properties AND QT_FEATURE_easingcurve
+)
+qt_feature_definition("animation" "QT_NO_ANIMATION" NEGATE VALUE "1")
+qt_feature("statemachine" PUBLIC
+ SECTION "Utilities"
+ LABEL "State machine"
+ PURPOSE "Provides hierarchical finite state machines."
+ CONDITION QT_FEATURE_properties
+)
+qt_feature_definition("statemachine" "QT_NO_STATEMACHINE" NEGATE VALUE "1")
+qt_feature("qeventtransition" PUBLIC
+ LABEL "QEventTransition class"
+ CONDITION QT_FEATURE_statemachine
+)
+qt_feature("gestures" PUBLIC
+ SECTION "Utilities"
+ LABEL "Gesture"
+ PURPOSE "Provides a framework for gestures."
+)
+qt_feature_definition("gestures" "QT_NO_GESTURES" NEGATE VALUE "1")
+qt_feature("sha3-fast" PRIVATE
+ SECTION "Utilities"
+ LABEL "Speed optimized SHA3"
+ PURPOSE "Optimizes SHA3 for speed instead of size."
+)
+qt_feature("jalalicalendar" PUBLIC
+ SECTION "Utilities"
+ LABEL "QJalaliCalendar"
+ PURPOSE "Support the Jalali (Persian) calendar"
+)
+qt_feature("hijricalendar" PRIVATE
+ SECTION "Utilities"
+ LABEL "QHijriCalendar"
+ PURPOSE "Generic basis for Islamic calendars, providing shared locale data"
+)
+qt_feature("islamiccivilcalendar" PUBLIC
+ SECTION "Utilities"
+ LABEL "QIslamicCivilCalendar"
+ PURPOSE "Support the Islamic Civil calendar"
+ CONDITION QT_FEATURE_hijricalendar
+)
+qt_feature("timezone" PUBLIC
+ SECTION "Utilities"
+ LABEL "QTimeZone"
+ PURPOSE "Provides support for time-zone handling."
+)
+qt_feature("datetimeparser" PRIVATE
+ SECTION "Utilities"
+ LABEL "QDateTimeParser"
+ PURPOSE "Provides support for parsing date-time texts."
+)
+qt_feature("commandlineparser" PUBLIC
+ SECTION "Utilities"
+ LABEL "QCommandlineParser"
+ PURPOSE "Provides support for command line parsing."
+)
+qt_feature("lttng" PRIVATE
+ LABEL "LTTNG"
+ AUTODETECT OFF
+ CONDITION LINUX AND LTTNGUST_FOUND
+ ENABLE INPUT_trace STREQUAL 'lttng' OR ( INPUT_trace STREQUAL 'yes' AND LINUX )
+ DISABLE INPUT_trace STREQUAL 'etw' OR INPUT_trace STREQUAL 'no'
+)
+qt_feature("etw" PRIVATE
+ LABEL "ETW"
+ AUTODETECT OFF
+ CONDITION WIN32
+ ENABLE INPUT_trace STREQUAL 'etw' OR ( INPUT_trace STREQUAL 'yes' AND WIN32 )
+ DISABLE INPUT_trace STREQUAL 'lttng' OR INPUT_trace STREQUAL 'no'
+)
+qt_feature("win32_system_libs"
+ LABEL "Windows System Libraries"
+ CONDITION WIN32 AND libs.advapi32 AND libs.gdi32 AND libs.kernel32 AND libs.netapi32 AND libs.ole32 AND libs.shell32 AND libs.uuid AND libs.user32 AND libs.winmm AND libs.ws2_32 OR FIXME
+)
+qt_feature("cborstreamreader" PUBLIC
+ SECTION "Utilities"
+ LABEL "CBOR stream reading"
+ PURPOSE "Provides support for reading the CBOR binary format. Note that this is required for plugin loading. Qt GUI needs QPA plugins for basic operation."
+)
+qt_feature("cborstreamwriter" PUBLIC
+ SECTION "Utilities"
+ LABEL "CBOR stream writing"
+ PURPOSE "Provides support for writing the CBOR binary format."
+)
+qt_feature("binaryjson" PUBLIC
+ SECTION "Utilities"
+ LABEL "Binary JSON (deprecated)"
+ PURPOSE "Provides support for the deprecated binary JSON format."
+)
+qt_configure_add_summary_section(NAME "Qt Core")
+qt_configure_add_summary_entry(ARGS "doubleconversion")
+qt_configure_add_summary_entry(ARGS "system-doubleconversion")
+qt_configure_add_summary_entry(ARGS "glib")
+qt_configure_add_summary_entry(ARGS "iconv")
+qt_configure_add_summary_entry(ARGS "icu")
+qt_configure_add_summary_entry(ARGS "mimetype-database")
+qt_configure_add_summary_entry(
+ TYPE "firstAvailableFeature"
+ ARGS "etw lttng"
+ MESSAGE "Tracing backend"
+)
+qt_configure_add_summary_section(NAME "Logging backends")
+qt_configure_add_summary_entry(ARGS "journald")
+qt_configure_add_summary_entry(ARGS "syslog")
+qt_configure_add_summary_entry(ARGS "slog2")
+qt_configure_end_summary_section() # end of "Logging backends" section
+qt_configure_add_summary_entry(
+ ARGS "qqnx_pps"
+ CONDITION QNX
+)
+qt_configure_add_summary_entry(ARGS "pcre2")
+qt_configure_add_summary_entry(ARGS "system-pcre2")
+qt_configure_end_summary_section() # end of "Qt Core" section
+qt_configure_add_report_entry(
+ TYPE NOTE
+ MESSAGE "journald, syslog or slog2 integration is enabled. If your users intend to develop applications against this build, ensure that the IDEs they use either set QT_FORCE_STDERR_LOGGING to 1 or are able to read the logged output from journald, syslog or slog2."
+ CONDITION QT_FEATURE_journald OR QT_FEATURE_syslog OR ( QNX AND QT_FEATURE_slog2 )
+)
+qt_configure_add_report_entry(
+ TYPE ERROR
+ MESSAGE "C++11 <random> is required and is missing or failed to compile."
+ CONDITION NOT TEST_cxx11_random
+)
+qt_configure_add_report_entry(
+ TYPE ERROR
+ MESSAGE "Your C library does not provide sscanf_l or snprintf_l. You need to use libdouble-conversion for double/string conversion."
+ CONDITION INPUT_doubleconversion STREQUAL 'no' AND NOT TEST_xlocalescanprint
+)
+qt_configure_add_report_entry(
+ TYPE ERROR
+ MESSAGE "detected a std::atomic implementation that fails for function pointers. Please apply the patch corresponding to your Standard Library vendor, found in qtbase/config.tests/atomicfptr"
+ CONDITION NOT TEST_atomicfptr
+)
+qt_configure_add_report_entry(
+ TYPE ERROR
+ MESSAGE "Qt requires poll(), ppoll(), poll_ts() or select() on this platform"
+ CONDITION ( UNIX OR INTEGRITY ) AND ( NOT QT_FEATURE_poll_ppoll ) AND ( NOT QT_FEATURE_poll_pollts ) AND ( NOT QT_FEATURE_poll_poll ) AND ( NOT QT_FEATURE_poll_select )
+)
diff --git a/src/corelib/configure.json b/src/corelib/configure.json
index c5e0423273..4d34089295 100644
--- a/src/corelib/configure.json
+++ b/src/corelib/configure.json
@@ -366,6 +366,19 @@
"main": "std::mt19937 mt(0);"
}
},
+ "cxx17_filesystem": {
+ "label": "C++17 <filesystem>",
+ "type": "compile",
+ "test": {
+ "include": "filesystem",
+ "main": [
+ "std::filesystem::copy(",
+ " std::filesystem::path(\"./file\"),",
+ " std::filesystem::path(\"./other\"));"
+ ],
+ "qmake": "CONFIG += c++17"
+ }
+ },
"eventfd": {
"label": "eventfd",
"type": "compile",
@@ -614,6 +627,13 @@
"condition": "tests.cxx11_future",
"output": [ "publicFeature" ]
},
+ "cxx17_filesystem": {
+ "label": "C++17 <filesystem>",
+ "condition": "tests.cxx17_filesystem",
+ "output": [
+ "publicFeature"
+ ]
+ },
"eventfd": {
"label": "eventfd",
"condition": "!config.wasm && tests.eventfd",
@@ -771,11 +791,6 @@
"condition": "libs.pps",
"output": [ "privateFeature" ]
},
- "qeventtransition": {
- "label": "QEventTransition class",
- "condition": "features.statemachine",
- "output": [ "publicFeature" ]
- },
"renameat2": {
"label": "renameat2()",
"condition": "config.linux && tests.renameat2",
@@ -827,6 +842,12 @@
],
"output": [ "publicFeature", "feature" ]
},
+ "shortcut": {
+ "label": "QShortcut",
+ "purpose": "Provides keyboard accelerators and shortcuts.",
+ "section": "Kernel",
+ "output": [ "publicFeature", "feature" ]
+ },
"systemsemaphore": {
"label": "QSystemSemaphore",
"purpose": "Provides a general counting system semaphore.",
@@ -874,7 +895,7 @@
"label": "QProcess",
"purpose": "Supports external process invocation.",
"section": "File I/O",
- "condition": "features.processenvironment && !config.winrt && !config.uikit && !config.integrity && !config.vxworks && !config.rtems",
+ "condition": "features.processenvironment && (features.thread || !config.unix) && !config.winrt && !config.uikit && !config.integrity && !config.vxworks && !config.rtems",
"output": [ "publicFeature", "feature" ]
},
"processenvironment": {
@@ -1010,6 +1031,11 @@
"condition": "features.properties",
"output": [ "publicFeature", "feature" ]
},
+ "qeventtransition": {
+ "label": "QEventTransition class",
+ "condition": "features.statemachine",
+ "output": [ "publicFeature" ]
+ },
"gestures": {
"label": "Gesture",
"purpose": "Provides a framework for gestures.",
@@ -1075,15 +1101,6 @@
"condition": "config.win32",
"output": [ "privateFeature" ]
},
- "topleveldomain": {
- "label": "QUrl::topLevelDomain()",
- "purpose": "Provides support for extracting the top level domain from URLs.
-
-If enabled, a binary dump of the Public Suffix List (http://www.publicsuffix.org,
-Mozilla License) is included. The data is then also used in QNetworkCookieJar::validateCookie.",
- "section": "Utilities",
- "output": [ "publicFeature" ]
- },
"win32_system_libs": {
"label": "Windows System Libraries",
"condition": "config.win32 && libs.advapi32 && libs.gdi32 && libs.kernel32 && libs.netapi32 && libs.ole32 && libs.shell32 && libs.uuid && libs.user32 && libs.winmm && libs.ws2_32"
@@ -1114,10 +1131,7 @@ Note that this is required for plugin loading. Qt GUI needs QPA plugins for basi
{
"type": "note",
"condition": "features.journald || features.syslog || (config.qnx && features.slog2)",
- "message": "journald, syslog or slog2 integration is enabled.
-If your users intend to develop applications against this build,
-ensure that the IDEs they use either set QT_FORCE_STDERR_LOGGING to 1
-or are able to read the logged output from journald, syslog or slog2."
+ "message": "journald, syslog or slog2 integration is enabled. If your users intend to develop applications against this build, ensure that the IDEs they use either set QT_FORCE_STDERR_LOGGING to 1 or are able to read the logged output from journald, syslog or slog2."
},
{
"type": "error",
@@ -1127,15 +1141,12 @@ or are able to read the logged output from journald, syslog or slog2."
{
"type": "error",
"condition": "input.doubleconversion == 'no' && !tests.xlocalescanprint",
- "message": "Your C library does not provide sscanf_l or snprintf_l.
-You need to use libdouble-conversion for double/string conversion."
+ "message": "Your C library does not provide sscanf_l or snprintf_l. You need to use libdouble-conversion for double/string conversion."
},
{
"type": "error",
"condition": "!tests.atomicfptr",
- "message": "detected a std::atomic implementation that fails for function pointers.
-Please apply the patch corresponding to your Standard Library vendor, found in
- qtbase/config.tests/atomicfptr"
+ "message": "detected a std::atomic implementation that fails for function pointers. Please apply the patch corresponding to your Standard Library vendor, found in qtbase/config.tests/atomicfptr"
},
{
"type": "error",
diff --git a/src/corelib/doc/snippets/code/doc_src_containers.cpp b/src/corelib/doc/snippets/code/doc_src_containers.cpp
index 84935580c9..9b23a9056c 100644
--- a/src/corelib/doc/snippets/code/doc_src_containers.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_containers.cpp
@@ -205,35 +205,35 @@ for (i = splitter->sizes().begin();
//! [15]
-QLinkedList<QString> list;
+QVector<QString> values;
...
QString str;
-foreach (str, list)
+foreach (str, values)
qDebug() << str;
//! [15]
//! [16]
-QLinkedList<QString> list;
+QVector<QString> values;
...
-QLinkedListIterator<QString> i(list);
+QVectorIterator<QString> i(values);
while (i.hasNext())
qDebug() << i.next();
//! [16]
//! [17]
-QLinkedList<QString> list;
+QVector<QString> values;
...
-foreach (const QString &str, list)
+foreach (const QString &str, values)
qDebug() << str;
//! [17]
//! [18]
-QLinkedList<QString> list;
+QVector<QString> values;
...
-foreach (const QString &str, list) {
+foreach (const QString &str, values) {
if (str.isEmpty())
break;
qDebug() << str;
diff --git a/src/corelib/doc/snippets/code/doc_src_properties.cpp b/src/corelib/doc/snippets/code/doc_src_properties.cpp
index a67945bbcf..e026a47e23 100644
--- a/src/corelib/doc/snippets/code/doc_src_properties.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_properties.cpp
@@ -54,7 +54,7 @@ Q_PROPERTY(type name
MEMBER memberName [(READ getFunction | WRITE setFunction)])
[RESET resetFunction]
[NOTIFY notifySignal]
- [REVISION int]
+ [REVISION int | REVISION(int[, int])]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool]
diff --git a/src/corelib/doc/snippets/code/doc_src_qiterator.cpp b/src/corelib/doc/snippets/code/doc_src_qiterator.cpp
index 58f4166c3e..0d0b864a83 100644
--- a/src/corelib/doc/snippets/code/doc_src_qiterator.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_qiterator.cpp
@@ -64,24 +64,6 @@ while (i.hasPrevious())
qDebug() << i.previous();
//! [1]
-
-//! [2]
-QLinkedList<float> list;
-...
-QLinkedListIterator<float> i(list);
-while (i.hasNext())
- qDebug() << i.next();
-//! [2]
-
-
-//! [3]
-QLinkedListIterator<float> i(list);
-i.toBack();
-while (i.hasPrevious())
- qDebug() << i.previous();
-//! [3]
-
-
//! [4]
QVector<float> vector;
...
@@ -145,37 +127,6 @@ while (i.hasNext()) {
}
//! [10]
-
-//! [11]
-QLinkedList<float> list;
-...
-QMutableLinkedListIterator<float> i(list);
-while (i.hasNext())
- qDebug() << i.next();
-//! [11]
-
-
-//! [12]
-QMutableLinkedListIterator<float> i(list);
-i.toBack();
-while (i.hasPrevious())
- qDebug() << i.previous();
-//! [12]
-
-
-//! [13]
-QMutableLinkedListIterator<int> i(list);
-while (i.hasNext()) {
- int val = i.next();
- if (val < 0) {
- i.setValue(-val);
- } else if (val == 0) {
- i.remove();
- }
-}
-//! [13]
-
-
//! [14]
QVector<float> vector;
...
@@ -184,7 +135,6 @@ while (i.hasNext())
qDebug() << i.next();
//! [14]
-
//! [15]
QMutableVectorIterator<float> i(vector);
i.toBack();
@@ -232,17 +182,6 @@ while (i.hasNext()) {
}
//! [19]
-
-//! [20]
-QMutableLinkedListIterator<int> i(list);
-while (i.hasNext()) {
- int val = i.next();
- if (val < -32768 || val > 32767)
- i.remove();
-}
-//! [20]
-
-
//! [21]
QMutableVectorIterator<int> i(vector);
while (i.hasNext()) {
@@ -271,16 +210,6 @@ while (i.hasNext()) {
}
//! [23]
-
-//! [24]
-QMutableLinkedListIterator<double> i(list);
-while (i.hasNext()) {
- double val = i.next();
- i.setValue(std::sqrt(val));
-}
-//! [24]
-
-
//! [25]
QMutableVectorIterator<double> i(list);
while (i.hasNext()) {
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qdebug.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qdebug.cpp
index 14e72e99dd..5154dc5d68 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qdebug.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qdebug.cpp
@@ -93,3 +93,8 @@
ba = QByteArray("a\0b", 3);
qDebug() << ba // prints: "\a\x00""b"
//! [1]
+
+//! [toString]
+ QTRY_VERIFY2(list.isEmpty(), qPrintable(QString::fromLatin1(
+ "Expected list to be empty, but it has the following items: %1")).arg(QDebug::toString(list)));
+//! [toString]
diff --git a/src/corelib/doc/snippets/code/src_corelib_serialization_qcborstream.cpp b/src/corelib/doc/snippets/code/src_corelib_serialization_qcborstream.cpp
index 6ddb5a9365..973ae75847 100644
--- a/src/corelib/doc/snippets/code/src_corelib_serialization_qcborstream.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_serialization_qcborstream.cpp
@@ -208,10 +208,10 @@
//! [19]
//! [20]
- void appendList(QCborStreamWriter &writer, const QLinkedList<QString> &list)
+ void appendList(QCborStreamWriter &writer, const QVector<QString> &values)
{
writer.startArray();
- for (const QString &s : list)
+ for (const QString &s : values)
writer.append(s);
writer.endArray();
}
@@ -228,10 +228,10 @@
//! [21]
//! [22]
- void appendMap(QCborStreamWriter &writer, const QLinkedList<QPair<int, QString>> &list)
+ void appendMap(QCborStreamWriter &writer, const QVector<QPair<int, QString>> &values)
{
writer.startMap();
- for (const auto pair : list) {
+ for (const auto pair : values) {
writer.append(pair.first)
writer.append(pair.second);
}
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp
index dfa9b670e7..66fa62f6b3 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp
@@ -72,3 +72,106 @@ i.toBack();
while (i.hasPrevious())
qDebug() << i.previous();
//! [2]
+
+//! [3]
+using NetworkReply = std::variant<QByteArray, QNetworkReply::NetworkError>;
+
+enum class IOError { FailedToRead, FailedToWrite };
+using IOResult = std::variant<QString, IOError>;
+//! [3]
+
+//! [4]
+QFuture<IOResult> future = QtConcurrent::run([url] {
+ ...
+ return NetworkReply(QNetworkReply::TimeoutError);
+}).then([](NetworkReply reply) {
+ if (auto error = std::get_if<QNetworkReply::NetworkError>(&reply))
+ return IOResult(IOError::FailedToRead);
+
+ auto data = std::get_if<QByteArray>(&reply);
+ // try to write *data and return IOError::FailedToWrite on failure
+ ...
+});
+
+auto result = future.result();
+if (auto filePath = std::get_if<QString>(&result)) {
+ // do something with *filePath
+else
+ // process the error
+//! [4]
+
+//! [5]
+QFuture<int> future = ...;
+ future.then([](QFuture<int> f) {
+ try {
+ ...
+ auto result = f.result();
+ ...
+ } catch (QException &e) {
+ // handle the exception
+ }
+ }).then(...);
+//! [5]
+
+//! [6]
+QFuture<int> parentFuture = ...;
+auto continuation = parentFuture.then([](int res1){ ... }).then([](int res2){ ... })...
+...
+// parentFuture throws an exception
+try {
+ auto result = continuation.result();
+} catch (QException &e) {
+ // handle the exception
+}
+//! [6]
+
+//! [7]
+QFuture<int> future = ...;
+auto resultFuture = future.then([](int res) {
+ ...
+ throw Error();
+ ...
+}).onFailed([](const Error &e) {
+ // Handle exceptions of type Error
+ ...
+ return -1;
+}).onFailed([] {
+ // Handle all other types of errors
+ ...
+ return -1;
+});
+
+auto result = resultFuture.result(); // result is -1
+//! [7]
+
+//! [8]
+QFuture<int> future = ...;
+future.then([](int res) {
+ ...
+ throw std::runtime_error("message");
+ ...
+}).onFailed([](const std::exception &e) {
+ // This handler will be invoked
+}).onFailed([](const std::runtime_error &e) {
+ // This handler won't be invoked, because of the handler above.
+});
+//! [8]
+
+//! [9]
+QFuture<int> future = ...;
+auto resultFuture = future.then([](int res) {
+ ...
+ throw Error("message");
+ ...
+}).onFailed([](const std::exception &e) {
+ // Won't be invoked
+}).onFailed([](const QException &e) {
+ // Won't be invoked
+});
+
+try {
+ auto result = resultFuture.result();
+} catch(...) {
+ // Handle the exception
+}
+//! [9]
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp
index 01f620cf08..9c07a2e92c 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp
@@ -372,16 +372,13 @@ a = str.toFloat(&ok); // a == 0, ok == false
//! [39]
QByteArray text("Qt is great!");
text.toBase64(); // returns "UXQgaXMgZ3JlYXQh"
-//! [39]
-//! [39bis]
QByteArray text("<p>Hello?</p>");
text.toBase64(QByteArray::Base64Encoding | QByteArray::OmitTrailingEquals); // returns "PHA+SGVsbG8/PC9wPg"
text.toBase64(QByteArray::Base64Encoding); // returns "PHA+SGVsbG8/PC9wPg=="
text.toBase64(QByteArray::Base64UrlEncoding); // returns "PHA-SGVsbG8_PC9wPg=="
text.toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); // returns "PHA-SGVsbG8_PC9wPg"
-//! [39bis]
-
+//! [39]
//! [40]
QByteArray ba;
@@ -422,9 +419,7 @@ QDataStream in(&data, QIODevice::ReadOnly);
//! [44]
QByteArray text = QByteArray::fromBase64("UXQgaXMgZ3JlYXQh");
text.data(); // returns "Qt is great!"
-//! [44]
-//! [44bis]
QByteArray::fromBase64("PHA+SGVsbG8/PC9wPg==", QByteArray::Base64Encoding); // returns "<p>Hello?</p>"
QByteArray::fromBase64("PHA-SGVsbG8_PC9wPg==", QByteArray::Base64UrlEncoding); // returns "<p>Hello?</p>"
//! [44bis]
@@ -442,7 +437,6 @@ if (result.decodingStatus == QByteArray::Base64DecodingStatus::Ok)
process(result.decoded);
//! [44quater]
-
//! [45]
QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data(); // returns "Qt is great!"
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp
index d30ad50ffc..1f2c505a02 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp
@@ -149,7 +149,7 @@ inline bool operator==(const Employee &e1, const Employee &e2)
&& e1.dateOfBirth() == e2.dateOfBirth();
}
-inline uint qHash(const Employee &key, uint seed)
+inline size_t qHash(const Employee &key, size_t seed)
{
return qHash(key.name(), seed) ^ key.dateOfBirth().day();
}
@@ -312,7 +312,7 @@ qDeleteAll(hash2.keyBegin(), hash2.keyEnd());
//! [28]
//! [qhashbits]
-inline uint qHash(const std::vector<int> &key, uint seed = 0)
+inline size_t qHash(const std::vector<int> &key, size_t seed = 0)
{
if (key.empty())
return seed;
@@ -322,14 +322,14 @@ inline uint qHash(const std::vector<int> &key, uint seed = 0)
//! [qhashbits]
//! [qhashrange]
-inline uint qHash(const std::vector<int> &key, uint seed = 0)
+inline size_t qHash(const std::vector<int> &key, size_t seed = 0)
{
return qHashRange(key.begin(), key.end(), seed);
}
//! [qhashrange]
//! [qhashrangecommutative]
-inline uint qHash(const std::unordered_set<int> &key, uint seed = 0)
+inline size_t qHash(const std::unordered_set<int> &key, size_t seed = 0)
{
return qHashRangeCommutative(key.begin(), key.end(), seed);
}
@@ -348,9 +348,9 @@ qHash(qMakePair(key.first, key.second), seed);
//! [31]
//! [32]
-uint qHash(K key);
-uint qHash(const K &key);
+size_t qHash(K key);
+size_t qHash(const K &key);
-uint qHash(K key, uint seed);
-uint qHash(const K &key, uint seed);
+size_t qHash(K key, size_t seed);
+size_t qHash(const K &key, size_t seed);
//! [32]
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qlinkedlist.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qlinkedlist.cpp
deleted file mode 100644
index e8754a5f34..0000000000
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qlinkedlist.cpp
+++ /dev/null
@@ -1,214 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
-QLinkedList<int> integerList;
-QLinkedList<QTime> timeList;
-//! [0]
-
-
-//! [1]
-QLinkedList<QString> list;
-list << "one" << "two" << "three";
-// list: ["one", "two", "three"]
-//! [1]
-
-
-//! [2]
-QLinkedList<QWidget *> list;
-...
-while (!list.isEmpty())
- delete list.takeFirst();
-//! [2]
-
-
-//! [3]
-QLinkedList<QString> list;
-list.append("one");
-list.append("two");
-list.append("three");
-// list: ["one", "two", "three"]
-//! [3]
-
-
-//! [4]
-QLinkedList<QString> list;
-list.prepend("one");
-list.prepend("two");
-list.prepend("three");
-// list: ["three", "two", "one"]
-//! [4]
-
-
-//! [5]
-QList<QString> list;
-list << "sun" << "cloud" << "sun" << "rain";
-list.removeAll("sun");
-// list: ["cloud", "rain"]
-//! [5]
-
-
-//! [6]
-QList<QString> list;
-list << "sun" << "cloud" << "sun" << "rain";
-list.removeOne("sun");
-// list: ["cloud", "sun", "rain"]
-//! [6]
-
-
-//! [7]
-QLinkedList<QString> list;
-list.append("January");
-list.append("February");
-...
-list.append("December");
-
-QLinkedList<QString>::iterator i;
-for (i = list.begin(); i != list.end(); ++i)
- cout << *i << Qt::endl;
-//! [7]
-
-
-//! [8]
-QLinkedList<QString> list;
-...
-QLinkedList<QString>::iterator it = std::find(list.begin(),
- list.end(), "Joel");
-if (it != list.end())
- cout << "Found Joel" << Qt::endl;
-//! [8]
-
-
-//! [9]
-QLinkedList<int>::iterator i;
-for (i = list.begin(); i != list.end(); ++i)
- *i += 2;
-//! [9]
-
-
-//! [10]
-QLinkedList<QString> list;
-...
-QLinkedList<QString>::iterator i = list.begin();
-while (i != list.end()) {
- if ((*i).startsWith('_'))
- i = list.erase(i);
- else
- ++i;
-}
-//! [10]
-
-
-//! [11]
-QLinkedList<QString>::iterator i = list.begin();
-while (i != list.end()) {
- QLinkedList<QString>::iterator previous = i;
- ++i;
- if ((*previous).startsWith('_'))
- list.erase(previous);
-}
-//! [11]
-
-
-//! [12]
-// WRONG
-while (i != list.end()) {
- if ((*i).startsWith('_'))
- list.erase(i);
- ++i;
-}
-//! [12]
-
-
-//! [13]
-if (*it == "Hello")
- *it = "Bonjour";
-//! [13]
-
-
-//! [14]
-QLinkedList<QString> list;
-list.append("January");
-list.append("February");
-...
-list.append("December");
-
-QLinkedList<QString>::const_iterator i;
-for (i = list.constBegin(); i != list.constEnd(); ++i)
- cout << *i << Qt::endl;
-//! [14]
-
-
-//! [15]
-QLinkedList<QString> list;
-...
-QLinkedList<QString>::const_iterator it = std::find(list.constBegin(),
- list.constEnd(), "Joel");
-if (it != list.constEnd())
- cout << "Found Joel" << Qt::endl;
-//! [15]
-
-
-//! [16]
-std::list<double> stdlist;
-list.push_back(1.2);
-list.push_back(0.5);
-list.push_back(3.14);
-
-QLinkedList<double> list = QLinkedList<double>::fromStdList(stdlist);
-//! [16]
-
-
-//! [17]
-QLinkedList<double> list;
-list << 1.2 << 0.5 << 3.14;
-
-std::list<double> stdlist = list.toStdList();
-//! [17]
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qregexp.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qregexp.cpp
index 433b01b21a..8339ea413e 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qregexp.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qregexp.cpp
@@ -232,3 +232,12 @@ s2 = QRegExp::escape("f(x)"); // s2 == "f\\(x\\)"
QRegExp rx("(" + QRegExp::escape(name) +
"|" + QRegExp::escape(alias) + ")");
//! [20]
+
+{
+//! [21]
+QString p("a .*|pattern");
+
+// re matches exactly the pattern string p
+QRegularExpression re(QRegularExpression::anchoredPattern(p));
+//! [21]
+}
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp
index 99cd4ea7a2..b451ed5253 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp
@@ -285,15 +285,6 @@ if (!invalidRe.isValid()) {
}
{
-//! [24]
-QString p("a .*|pattern");
-
-// re matches exactly the pattern string p
-QRegularExpression re(QRegularExpression::anchoredPattern(p));
-//! [24]
-}
-
-{
//! [26]
QString escaped = QRegularExpression::escape("a(x) = f(x) + g(x)");
// escaped == "a\\(x\\)\\ \\=\\ f\\(x\\)\\ \\+\\ g\\(x\\)"
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qvector.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qvector.cpp
index a05233049f..76a8d68f64 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qvector.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qvector.cpp
@@ -115,6 +115,29 @@ vector.append(std::move(three));
//! [move-append]
+//! [emplace]
+QVector<QString> vector{"a", "ccc"};
+vector.emplace(1, 2, 'b');
+// vector: ["a", "bb", "ccc"]
+//! [emplace]
+
+
+//! [emplace-back]
+QVector<QString> vector{"one", "two"};
+vector.emplaceBack(3, 'a');
+qDebug() << vector;
+// vector: ["one", "two", "aaa"]
+//! [emplace-back]
+
+
+//! [emplace-back-ref]
+QVector<QString> vector;
+auto &ref = vector.emplaceBack();
+ref = "one";
+// vector: ["one"]
+//! [emplace-back-ref]
+
+
//! [8]
QVector<QString> vector;
vector.prepend("one");
diff --git a/src/corelib/doc/snippets/qmetaobject-revision/window.h b/src/corelib/doc/snippets/qmetaobject-revision/window.h
index f93d253b6b..f519a6f2dc 100644
--- a/src/corelib/doc/snippets/qmetaobject-revision/window.h
+++ b/src/corelib/doc/snippets/qmetaobject-revision/window.h
@@ -58,7 +58,7 @@ class Window : public QWidget
{
Q_OBJECT
Q_PROPERTY(int normalProperty READ normalProperty)
- Q_PROPERTY(int newProperty READ newProperty REVISION 1)
+ Q_PROPERTY(int newProperty READ newProperty REVISION(2, 1))
public:
Window();
@@ -66,7 +66,7 @@ public:
int newProperty();
public slots:
void normalMethod();
- Q_REVISION(1) void newMethod();
+ Q_REVISION(2, 1) void newMethod();
};
//! [Window class with revision]
diff --git a/src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp b/src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp
index 1a12a3cc58..2a7b310716 100644
--- a/src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp
+++ b/src/corelib/doc/snippets/qsortfilterproxymodel-details/main.cpp
@@ -94,8 +94,7 @@ Widget::Widget(QWidget *parent)
//! [4]
proxyModel->sort(2, Qt::AscendingOrder);
//! [4] //! [5]
- proxyModel->setFilterRegExp(QRegExp(".png", Qt::CaseInsensitive,
- QRegExp::FixedString));
+ proxyModel->setFilterRegularExpression(QRegularExpression("\.png", QRegularExpression::CaseInsensitiveOption));
proxyModel->setFilterKeyColumn(1);
//! [5]
}
diff --git a/src/corelib/doc/snippets/qstring/main.cpp b/src/corelib/doc/snippets/qstring/main.cpp
index 58d68d9375..271b6d7afc 100644
--- a/src/corelib/doc/snippets/qstring/main.cpp
+++ b/src/corelib/doc/snippets/qstring/main.cpp
@@ -433,14 +433,12 @@ void Widget::firstIndexOfFunction()
//! [93]
QString str = "the minimum";
str.indexOf(QRegularExpression("m[aeiou]"), 0); // returns 4
- //! [93]
- //! [99]
QString str = "the minimum";
QRegularExpressionMatch match;
str.indexOf(QRegularExpression("m[aeiou]"), 0, &match); // returns 4
// match.captured() == mi
- //! [99]
+ //! [93]
}
void Widget::insertFunction()
@@ -490,14 +488,12 @@ void Widget::lastIndexOfFunction()
//! [94]
QString str = "the minimum";
str.lastIndexOf(QRegularExpression("m[aeiou]")); // returns 8
- //! [94]
- //! [100]
QString str = "the minimum";
QRegularExpressionMatch match;
str.lastIndexOf(QRegularExpression("m[aeiou]"), -1, &match); // returns 8
// match.captured() == mu
- //! [100]
+ //! [94]
}
void Widget::leftFunction()
diff --git a/src/corelib/doc/src/containers.qdoc b/src/corelib/doc/src/containers.qdoc
index 4c7cb32aac..537bd8c884 100644
--- a/src/corelib/doc/src/containers.qdoc
+++ b/src/corelib/doc/src/containers.qdoc
@@ -74,12 +74,10 @@
\section1 The Container Classes
- Qt provides the following sequential containers: QList,
- QLinkedList, QVector, QStack, and QQueue. For most
- applications, QList is the best type to use. Although it is
- implemented as an array-list, it provides very fast prepends and
- appends. If you really need a linked-list, use QLinkedList; if you
- want your items to occupy consecutive memory locations, use QVector.
+ Qt provides the following sequential containers: QVector,
+ QStack, and QQueue. For most
+ applications, QVector is the best type to use. It provides very fast
+ appends. If you really need a linked-list, use std::list.
QStack and QQueue are convenience classes that provide LIFO and
FIFO semantics.
@@ -95,30 +93,11 @@
\table
\header \li Class \li Summary
- \row \li \l{QList}<T>
+ \row \li \l{QVector}<T>
\li This is by far the most commonly used container class. It
stores a list of values of a given type (T) that can be accessed
- by index. Internally, the QList is implemented using an array,
- ensuring that index-based access is very fast.
-
- Items can be added at either end of the list using
- QList::append() and QList::prepend(), or they can be inserted in
- the middle using QList::insert(). More than any other container
- class, QList is highly optimized to expand to as little code as
- possible in the executable. QStringList inherits from
- QList<QString>.
-
- \row \li \l{QLinkedList}<T>
- \li This is similar to QList, except that it uses
- iterators rather than integer indexes to access items. It also
- provides better performance than QList when inserting in the
- middle of a huge list, and it has nicer iterator semantics.
- (Iterators pointing to an item in a QLinkedList remain valid as
- long as the item exists, whereas iterators to a QList can become
- invalid after any insertion or removal.)
-
- \row \li \l{QVector}<T>
- \li This stores an array of values of a given type at adjacent
+ by index. Internally, it stores an array of values of a
+ given type at adjacent
positions in memory. Inserting at the front or in the middle of
a vector can be quite slow, because it can lead to large numbers
of items having to be moved by one position in memory.
@@ -135,9 +114,9 @@
and \l{QStack::top()}{top()}.
\row \li \l{QQueue}<T>
- \li This is a convenience subclass of QList that provides
+ \li This is a convenience subclass of QVector that provides
"first in, first out" (FIFO) semantics. It adds the following
- functions to those already present in QList:
+ functions to those already present in QQVector:
\l{QQueue::enqueue()}{enqueue()},
\l{QQueue::dequeue()}{dequeue()}, and \l{QQueue::head()}{head()}.
@@ -168,11 +147,11 @@
\endtable
Containers can be nested. For example, it is perfectly possible
- to use a QMap<QString, QList<int>>, where the key type is
- QString and the value type QList<int>.
+ to use a QMap<QString, QVector<int>>, where the key type is
+ QString and the value type QVector<int>.
The containers are defined in individual header files with the
- same name as the container (e.g., \c <QLinkedList>). For
+ same name as the container (e.g., \c <QVector>). For
convenience, the containers are forward declared in \c
<QtContainerFwd>.
@@ -188,10 +167,10 @@
double, pointer types, and Qt data types such as QString, QDate,
and QTime, but it doesn't cover QObject or any QObject subclass
(QWidget, QDialog, QTimer, etc.). If you attempt to instantiate a
- QList<QWidget>, the compiler will complain that QWidget's copy
+ QVector<QWidget>, the compiler will complain that QWidget's copy
constructor and assignment operators are disabled. If you want to
store these kinds of objects in a container, store them as
- pointers, for example as QList<QWidget *>.
+ pointers, for example as QVector<QWidget *>.
Here's an example custom data type that meets the requirement of
an assignable data type:
@@ -264,11 +243,8 @@
\table
\header \li Containers \li Read-only iterator
\li Read-write iterator
- \row \li QList<T>, QQueue<T> \li QListIterator<T>
\li QMutableListIterator<T>
- \row \li QLinkedList<T> \li QLinkedListIterator<T>
- \li QMutableLinkedListIterator<T>
- \row \li QVector<T>, QStack<T> \li QVectorIterator<T>
+ \row \li QVector<T>, QStack<T>, QQueue<T> \li QVectorIterator<T>
\li QMutableVectorIterator<T>
\row \li QSet<T> \li QSetIterator<T>
\li QMutableSetIterator<T>
@@ -278,9 +254,9 @@
\li QMutableHashIterator<Key, T>
\endtable
- In this discussion, we will concentrate on QList and QMap. The
- iterator types for QLinkedList, QVector, and QSet have exactly
- the same interface as QList's iterators; similarly, the iterator
+ In this discussion, we will concentrate on QVector and QMap. The
+ iterator types for QSet have exactly
+ the same interface as QVector's iterators; similarly, the iterator
types for QHash have the same interface as QMap's iterators.
Unlike STL-style iterators (covered \l{STL-style
@@ -295,59 +271,59 @@
\image javaiterators1.png
Here's a typical loop for iterating through all the elements of a
- QList<QString> in order and printing them to the console:
+ QVector<QString> in order and printing them to the console:
\snippet code/doc_src_containers.cpp 1
- It works as follows: The QList to iterate over is passed to the
- QListIterator constructor. At that point, the iterator is located
+ It works as follows: The QVector to iterate over is passed to the
+ QVectorIterator constructor. At that point, the iterator is located
just in front of the first item in the list (before item "A").
- Then we call \l{QListIterator::hasNext()}{hasNext()} to
+ Then we call \l{QVectorIterator::hasNext()}{hasNext()} to
check whether there is an item after the iterator. If there is, we
- call \l{QListIterator::next()}{next()} to jump over that
+ call \l{QVectorIterator::next()}{next()} to jump over that
item. The next() function returns the item that it jumps over. For
- a QList<QString>, that item is of type QString.
+ a QVector<QString>, that item is of type QString.
- Here's how to iterate backward in a QList:
+ Here's how to iterate backward in a QVector:
\snippet code/doc_src_containers.cpp 2
The code is symmetric with iterating forward, except that we
- start by calling \l{QListIterator::toBack()}{toBack()}
+ start by calling \l{QVectorIterator::toBack()}{toBack()}
to move the iterator after the last item in the list.
The diagram below illustrates the effect of calling
- \l{QListIterator::next()}{next()} and
- \l{QListIterator::previous()}{previous()} on an iterator:
+ \l{QVectorIterator::next()}{next()} and
+ \l{QVectorIterator::previous()}{previous()} on an iterator:
\image javaiterators2.png
- The following table summarizes the QListIterator API:
+ The following table summarizes the QVectorIterator API:
\table
\header \li Function \li Behavior
- \row \li \l{QListIterator::toFront()}{toFront()}
+ \row \li \l{QVectorIterator::toFront()}{toFront()}
\li Moves the iterator to the front of the list (before the first item)
- \row \li \l{QListIterator::toBack()}{toBack()}
+ \row \li \l{QVectorIterator::toBack()}{toBack()}
\li Moves the iterator to the back of the list (after the last item)
- \row \li \l{QListIterator::hasNext()}{hasNext()}
+ \row \li \l{QVectorIterator::hasNext()}{hasNext()}
\li Returns \c true if the iterator isn't at the back of the list
- \row \li \l{QListIterator::next()}{next()}
+ \row \li \l{QVectorIterator::next()}{next()}
\li Returns the next item and advances the iterator by one position
- \row \li \l{QListIterator::peekNext()}{peekNext()}
+ \row \li \l{QVectorIterator::peekNext()}{peekNext()}
\li Returns the next item without moving the iterator
- \row \li \l{QListIterator::hasPrevious()}{hasPrevious()}
+ \row \li \l{QVectorIterator::hasPrevious()}{hasPrevious()}
\li Returns \c true if the iterator isn't at the front of the list
- \row \li \l{QListIterator::previous()}{previous()}
+ \row \li \l{QVectorIterator::previous()}{previous()}
\li Returns the previous item and moves the iterator back by one position
- \row \li \l{QListIterator::peekPrevious()}{peekPrevious()}
+ \row \li \l{QVectorIterator::peekPrevious()}{peekPrevious()}
\li Returns the previous item without moving the iterator
\endtable
- QListIterator provides no functions to insert or remove items
+ QVectorIterator provides no functions to insert or remove items
from the list as we iterate. To accomplish this, you must use
QMutableListIterator. Here's an example where we remove all
- odd numbers from a QList<int> using QMutableListIterator:
+ odd numbers from a QVector<int> using QMutableListIterator:
\snippet code/doc_src_containers.cpp 3
@@ -380,12 +356,12 @@
\snippet code/doc_src_containers.cpp 6
- As mentioned above, QLinkedList's, QVector's, and QSet's iterator
- classes have exactly the same API as QList's. We will now turn to
+ As mentioned above QSet's iterator
+ classes have exactly the same API as QVector's. We will now turn to
QMapIterator, which is somewhat different because it iterates on
(key, value) pairs.
- Like QListIterator, QMapIterator provides
+ Like QVectorIterator, QMapIterator provides
\l{QMapIterator::toFront()}{toFront()},
\l{QMapIterator::toBack()}{toBack()},
\l{QMapIterator::hasNext()}{hasNext()},
@@ -433,11 +409,7 @@
\table
\header \li Containers \li Read-only iterator
\li Read-write iterator
- \row \li QList<T>, QQueue<T> \li QList<T>::const_iterator
- \li QList<T>::iterator
- \row \li QLinkedList<T> \li QLinkedList<T>::const_iterator
- \li QLinkedList<T>::iterator
- \row \li QVector<T>, QStack<T> \li QVector<T>::const_iterator
+ \row \li QVector<T>, QStack<T>, QQueue<T> \li QVector<T>::const_iterator
\li QVector<T>::iterator
\row \li QSet<T> \li QSet<T>::const_iterator
\li QSet<T>::iterator
@@ -456,24 +428,24 @@
and the \l{QVector::iterator}{const_iterator} type is
just a typedef for \c{const T *}.
- In this discussion, we will concentrate on QList and QMap. The
- iterator types for QLinkedList, QVector, and QSet have exactly
- the same interface as QList's iterators; similarly, the iterator
+ In this discussion, we will concentrate on QVector and QMap. The
+ iterator types for QSet have exactly
+ the same interface as QVector's iterators; similarly, the iterator
types for QHash have the same interface as QMap's iterators.
Here's a typical loop for iterating through all the elements of a
- QList<QString> in order and converting them to lowercase:
+ QVector<QString> in order and converting them to lowercase:
\snippet code/doc_src_containers.cpp 10
Unlike \l{Java-style iterators}, STL-style iterators point
- directly at items. The \l{QList::begin()}{begin()} function of a container returns an
+ directly at items. The \l{QVector::begin()}{begin()} function of a container returns an
iterator that points to the first item in the container. The
- \l{QList::end()}{end()} function of a container returns an iterator to the
+ \l{QVector::end()}{end()} function of a container returns an iterator to the
imaginary item one position past the last item in the container.
- \l {QList::end()}{end()} marks an invalid position; it must never be dereferenced.
+ \l {QVector::end()}{end()} marks an invalid position; it must never be dereferenced.
It is typically used in a loop's break condition. If the list is
- empty, \l{QList::begin}{begin()} equals \l{QList::end()}{end()}, so we never execute the loop.
+ empty, \l{QVector::begin}{begin()} equals \l{QVector::end()}{end()}, so we never execute the loop.
The diagram below shows the valid iterator positions as red
arrows for a vector containing four items:
@@ -490,8 +462,8 @@
compilers also allow us to write \c{i->toLower()}, but some
don't.
- For read-only access, you can use const_iterator, \l{QList::constBegin}{constBegin()},
- and \l{QList::constEnd()}{constEnd()}. For example:
+ For read-only access, you can use const_iterator, \l{QVector::constBegin}{constBegin()},
+ and \l{QVector::constEnd()}{constEnd()}. For example:
\snippet code/doc_src_containers.cpp 12
@@ -529,7 +501,7 @@
Thanks to \l{implicit sharing}, it is very inexpensive for a
function to return a container per value. The Qt API contains
- dozens of functions that return a QList or QStringList per value
+ dozens of functions that return a QVector or QStringList per value
(e.g., QSplitter::sizes()). If you want to iterate over these
using an STL iterator, you should always take a copy of the
container and iterate over the copy. For example:
@@ -562,7 +534,7 @@
Its syntax is: \c foreach (\e variable, \e container) \e
statement. For example, here's how to use \c foreach to iterate
- over a QLinkedList<QString>:
+ over a QVector<QString>:
\snippet code/doc_src_containers.cpp 15
@@ -647,9 +619,9 @@
Algorithmic complexity is concerned about how fast (or slow) each
function is as the number of items in the container grow. For
- example, inserting an item in the middle of a QLinkedList is an
+ example, inserting an item in the middle of a std::list is an
extremely fast operation, irrespective of the number of items
- stored in the QLinkedList. On the other hand, inserting an item
+ stored in the list. On the other hand, inserting an item
in the middle of a QVector is potentially very expensive if the
QVector contains many items, since half of the items must be
moved one position in memory.
@@ -667,7 +639,7 @@
\li \b{Constant time:} O(1). A function is said to run in constant
time if it requires the same amount of time no matter how many
items are present in the container. One example is
- QLinkedList::insert().
+ QVector::push_back().
\li \b{Logarithmic time:} O(log \e n). A function that runs in
logarithmic time is a function whose running time is
@@ -689,13 +661,11 @@
number of items stored in the container.
\endlist
- The following table summarizes the algorithmic complexity of Qt's
- sequential container classes:
+ The following table summarizes the algorithmic complexity of the sequential
+ container QVector<T>:
\table
\header \li \li Index lookup \li Insertion \li Prepending \li Appending
- \row \li QLinkedList<T> \li O(\e n) \li O(1) \li O(1) \li O(1)
- \row \li QList<T> \li O(1) \li O(n) \li Amort. O(1) \li Amort. O(1)
\row \li QVector<T> \li O(1) \li O(n) \li O(n) \li Amort. O(1)
\endtable
@@ -726,11 +696,8 @@
\section1 Growth Strategies
QVector<T>, QString, and QByteArray store their items
- contiguously in memory; QList<T> maintains an array of pointers
- to the items it stores to provide fast index-based access (unless
- T is a pointer type or a basic type of the size of a pointer, in
- which case the value itself is stored in the array); QHash<Key,
- T> keeps a hash table whose size is proportional to the number
+ contiguously in memory; QHash<Key, T> keeps a
+ hash table whose size is proportional to the number
of items in the hash. To avoid reallocating the data every single
time an item is added at the end of the container, these classes
typically allocate more memory than necessary.
@@ -764,7 +731,7 @@
on the first and last pages actually needs to be copied.
\endlist
- QByteArray and QList<T> use more or less the same algorithm as
+ QByteArray uses more or less the same algorithm as
QString.
QVector<T> also uses that algorithm for data types that can be
diff --git a/src/corelib/doc/src/datastreamformat.qdoc b/src/corelib/doc/src/datastreamformat.qdoc
index d6b60f10ce..1e23b19c1f 100644
--- a/src/corelib/doc/src/datastreamformat.qdoc
+++ b/src/corelib/doc/src/datastreamformat.qdoc
@@ -66,8 +66,6 @@
\li QIcon
\li QImage
\li QKeySequence
- \li QLinkedList<T>
- \li QList<T>
\li QMap<Key, T>
\li QMargins
\li QMatrix4x4
@@ -79,7 +77,6 @@
\li QPoint
\li QQuaternion
\li QRect
- \li QRegExp
\li QRegularExpression
\li QRegion
\li QSize
diff --git a/src/corelib/doc/src/dontdocument.qdoc b/src/corelib/doc/src/dontdocument.qdoc
index 0150d07019..9ed5345777 100644
--- a/src/corelib/doc/src/dontdocument.qdoc
+++ b/src/corelib/doc/src/dontdocument.qdoc
@@ -29,14 +29,14 @@
\dontdocument (QMacAutoReleasePool QIncompatibleFlag QGenericAtomicOps QAtomicTraits
QAtomicOps QBasicAtomicInteger QBasicAtomicPointer QBasicMutex QInternal
QArgument QReturnArgument QArrayData QTypedArrayData QStaticByteArrayData
- QByteRef QStaticStringData QListSpecialMethods QListData QScopedPointerDeleter
+ QStaticStringData QListSpecialMethods QListData QScopedPointerDeleter
QScopedPointerArrayDeleter QScopedPointerPodDeleter QScopedPointerObjectDeleteLater
QMetaTypeId2 QObjectData QObjectUserData QMapNodeBase QMapNode QMapDataBase
QMapData QHashData QHashNode QArrayDataPointer QTextStreamManipulator
QContiguousCacheData QContiguousCacheTypedData QNoDebug QUrlTwoFlags
QCborValueRef QDeferredDeleteEvent QSpecialInteger QLittleEndianStorageType
QBigEndianStorageType QFactoryInterface QFutureWatcherBase QJsonValuePtr
- QJsonValueRefPtr QLinkedListNode QAbstractConcatenable QStringBuilderCommon
+ QJsonValueRefPtr QAbstractConcatenable QStringBuilderCommon
QTextCodec::ConverterState QThreadStorageData QTextStreamManipulator)
*/
diff --git a/src/corelib/doc/src/includes/qdebug-toString.qdocinc b/src/corelib/doc/src/includes/qdebug-toString.qdocinc
new file mode 100644
index 0000000000..db1e1ab453
--- /dev/null
+++ b/src/corelib/doc/src/includes/qdebug-toString.qdocinc
@@ -0,0 +1,9 @@
+Streams \a object into a QDebug instance that operates on a string,
+and then returns that string.
+
+This function is useful for cases where you need the textual representation
+of an object for debugging, but cannot use \c {operator<<}. For example:
+
+\snippet code/src_corelib_io_qdebug.cpp toString
+
+The string is streamed using \l nospace().
diff --git a/src/corelib/doc/src/objectmodel/properties.qdoc b/src/corelib/doc/src/objectmodel/properties.qdoc
index 680e5598f0..abeb9b7a54 100644
--- a/src/corelib/doc/src/objectmodel/properties.qdoc
+++ b/src/corelib/doc/src/objectmodel/properties.qdoc
@@ -102,8 +102,8 @@
re-evaluated in QML, for example. Qt emits automatically that signal when
needed for MEMBER properties that do not have an explicit setter.
- \li A \c REVISION number is optional. If included, it defines
- the property and its notifier signal to be used in a particular
+ \li A \c REVISION number or \c REVISION() macro is optional. If included,
+ it defines the property and its notifier signal to be used in a particular
revision of the API (usually for exposure to QML). If not included, it
defaults to 0.
diff --git a/src/corelib/global/global.pri b/src/corelib/global/global.pri
index 1da69aba9b..6ba39d41bd 100644
--- a/src/corelib/global/global.pri
+++ b/src/corelib/global/global.pri
@@ -20,6 +20,8 @@ HEADERS += \
global/qtypeinfo.h \
global/qsysinfo.h \
global/qisenum.h \
+ global/qsimd.h \
+ global/qsimd_p.h \
global/qtypetraits.h \
global/qflags.h \
global/qrandom.h \
@@ -38,6 +40,7 @@ SOURCES += \
global/qoperatingsystemversion.cpp \
global/qlogging.cpp \
global/qrandom.cpp \
+ global/qsimd.cpp \
global/qhooks.cpp
# To get listed in IDEs
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h
index ebffe74188..075d7c5c65 100644
--- a/src/corelib/global/qcompilerdetection.h
+++ b/src/corelib/global/qcompilerdetection.h
@@ -91,8 +91,6 @@
# define Q_OUTOFLINE_TEMPLATE inline
# define Q_COMPILER_MANGLES_RETURN_TYPE
# define Q_FUNC_INFO __FUNCSIG__
-# define Q_ALIGNOF(type) __alignof(type)
-# define Q_DECL_ALIGN(n) __declspec(align(n))
# define Q_ASSUME_IMPL(expr) __assume(expr)
# define Q_UNREACHABLE_IMPL() __assume(0)
# define Q_NORETURN __declspec(noreturn)
@@ -222,10 +220,8 @@
# endif
# define Q_FUNC_INFO __PRETTY_FUNCTION__
-# define Q_ALIGNOF(type) __alignof__(type)
# define Q_TYPEOF(expr) __typeof__(expr)
# define Q_DECL_DEPRECATED __attribute__ ((__deprecated__))
-# define Q_DECL_ALIGN(n) __attribute__((__aligned__(n)))
# define Q_DECL_UNUSED __attribute__((__unused__))
# define Q_LIKELY(expr) __builtin_expect(!!(expr), true)
# define Q_UNLIKELY(expr) __builtin_expect(!!(expr), false)
@@ -272,9 +268,7 @@
# if __xlC__ < 0x400
# error "Compiler not supported"
# elif __xlC__ >= 0x0600
-# define Q_ALIGNOF(type) __alignof__(type)
# define Q_TYPEOF(expr) __typeof__(expr)
-# define Q_DECL_ALIGN(n) __attribute__((__aligned__(n)))
# define Q_PACKED __attribute__((__packed__))
# endif
@@ -352,7 +346,6 @@
# define Q_PACKED __attribute__ ((__packed__))
# define Q_FUNC_INFO __PRETTY_FUNCTION__
# define Q_TYPEOF(expr) __typeof__(expr)
-# define Q_ALIGNOF(type) __alignof__(type)
# define Q_UNREACHABLE_IMPL()
# if defined(__cplusplus)
# define Q_COMPILER_AUTO_TYPE
@@ -449,9 +442,7 @@
# define QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
/* see http://developers.sun.com/sunstudio/support/Ccompare.html */
# if __SUNPRO_CC >= 0x590
-# define Q_ALIGNOF(type) __alignof__(type)
# define Q_TYPEOF(expr) __typeof__(expr)
-# define Q_DECL_ALIGN(n) __attribute__((__aligned__(n)))
# endif
# if __SUNPRO_CC >= 0x550
# define Q_DECL_EXPORT __global
@@ -488,9 +479,6 @@
# define Q_DECL_EXPORT __declspec(dllexport)
# define Q_DECL_IMPORT __declspec(dllimport)
# endif
-# if __HP_aCC-0 >= 061200
-# define Q_DECL_ALIGN(n) __attribute__((aligned(n)))
-# endif
# if __HP_aCC-0 >= 062000
# define Q_DECL_EXPORT __attribute__((visibility("default")))
# define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
@@ -1133,14 +1121,12 @@
#endif
#define Q_DECL_NOTHROW Q_DECL_NOEXCEPT
-#if defined(Q_COMPILER_ALIGNOF)
-# undef Q_ALIGNOF
-# define Q_ALIGNOF(x) alignof(x)
+#ifndef Q_ALIGNOF
+# define Q_ALIGNOF(x) alignof(x)
#endif
-#if defined(Q_COMPILER_ALIGNAS)
-# undef Q_DECL_ALIGN
-# define Q_DECL_ALIGN(n) alignas(n)
+#ifndef Q_DECL_ALIGN
+# define Q_DECL_ALIGN(n) alignas(n)
#endif
#if __has_cpp_attribute(nodiscard) && !defined(Q_CC_CLANG) // P0188R1
diff --git a/src/corelib/global/qconfig-bootstrapped.h b/src/corelib/global/qconfig-bootstrapped.h
index b3daf43c04..0185ad566c 100644
--- a/src/corelib/global/qconfig-bootstrapped.h
+++ b/src/corelib/global/qconfig-bootstrapped.h
@@ -79,6 +79,7 @@
#define QT_FEATURE_cborstreamwriter 1
#define QT_CRYPTOGRAPHICHASH_ONLY_SHA1
#define QT_FEATURE_cxx11_random (__has_include(<random>) ? 1 : -1)
+#define QT_FEATURE_cxx17_filesystem -1
#define QT_NO_DATASTREAM
#define QT_FEATURE_datestring 1
#define QT_FEATURE_datetimeparser -1
@@ -105,13 +106,18 @@
#define QT_FEATURE_lttng -1
#define QT_NO_QOBJECT
#define QT_FEATURE_process -1
+#ifndef QT_BUILD_QMAKE
+#define QT_FEATURE_regularexpression 1
+#else
#define QT_FEATURE_regularexpression -1
+#endif
#ifdef __GLIBC_PREREQ
# define QT_FEATURE_renameat2 (__GLIBC_PREREQ(2, 28) ? 1 : -1)
#else
# define QT_FEATURE_renameat2 -1
#endif
#define QT_FEATURE_sharedmemory -1
+#define QT_FEATURE_shortcut -1
#define QT_FEATURE_signaling_nan -1
#define QT_FEATURE_slog2 -1
#ifdef __GLIBC_PREREQ
diff --git a/src/corelib/global/qconfig.cpp.in b/src/corelib/global/qconfig.cpp.in
new file mode 100644
index 0000000000..7fa21bcfed
--- /dev/null
+++ b/src/corelib/global/qconfig.cpp.in
@@ -0,0 +1,32 @@
+/* Installation date */
+static const char qt_configure_installation [12+11] = "qt_instdate=2012-12-20";
+/* Installation Info */
+static const char qt_configure_prefix_path_str [12+256] = "qt_prfxpath=@CMAKE_INSTALL_PREFIX@";
+#ifdef QT_BUILD_QMAKE
+static const char qt_configure_ext_prefix_path_str [12+256] = "qt_epfxpath=@CMAKE_INSTALL_PREFIX@";
+static const char qt_configure_host_prefix_path_str [12+256] = "qt_hpfxpath=@CMAKE_INSTALL_PREFIX@";
+#endif
+static const short qt_configure_str_offsets[] = {
+@QT_CONFIG_STR_OFFSETS_FIRST@
+#ifdef QT_BUILD_QMAKE
+@QT_CONFIG_STR_OFFSETS_SECOND@
+#endif
+};
+static const char qt_configure_strs[] =
+@QT_CONFIG_STRS_FIRST@
+#ifdef QT_BUILD_QMAKE
+@QT_CONFIG_STRS_SECOND@
+#endif
+;
+#define QT_CONFIGURE_SETTINGS_PATH "@QT_DEFAULT_SYS_CONF_DIR@"
+#define QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH "@QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH@"
+#define QT_CONFIGURE_HOSTBINDIR_TO_EXTPREFIX_PATH "@QT_CONFIGURE_HOSTBINDIR_TO_EXTPREFIX_PATH@"
+#define QT_CONFIGURE_HOSTBINDIR_TO_HOSTPREFIX_PATH "@QT_CONFIGURE_HOSTBINDIR_TO_HOSTPREFIX_PATH@"
+#ifdef QT_BUILD_QMAKE
+# define QT_CONFIGURE_SYSROOTIFY_PREFIX false
+#endif
+#define QT_CONFIGURE_PREFIX_PATH qt_configure_prefix_path_str + 12
+#ifdef QT_BUILD_QMAKE
+# define QT_CONFIGURE_EXT_PREFIX_PATH qt_configure_ext_prefix_path_str + 12
+# define QT_CONFIGURE_HOST_PREFIX_PATH qt_configure_host_prefix_path_str + 12
+#endif
diff --git a/src/corelib/global/qendian.cpp b/src/corelib/global/qendian.cpp
index eb08b2f848..c69572cccf 100644
--- a/src/corelib/global/qendian.cpp
+++ b/src/corelib/global/qendian.cpp
@@ -764,7 +764,7 @@ QT_BEGIN_NAMESPACE
#if defined(__SSSE3__)
using ShuffleMask = uchar[16];
-Q_DECL_ALIGN(16) static const ShuffleMask shuffleMasks[3] = {
+alignas(16) static const ShuffleMask shuffleMasks[3] = {
// 16-bit
{1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14},
// 32-bit
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index 62c6e64abb..2b2a03cc76 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -1215,11 +1215,14 @@ bool qSharedBuild() noexcept
the application is compiled (32 or 64).
*/
+#if QT_DEPRECATED_SINCE(5, 9)
/*!
\deprecated
\variable QSysInfo::WindowsVersion
\brief the version of the Windows operating system on which the
application is run.
+
+ Use QOperatingSystemVersion::current() instead.
*/
/*!
@@ -1227,6 +1230,8 @@ bool qSharedBuild() noexcept
\fn QSysInfo::WindowsVersion QSysInfo::windowsVersion()
\since 4.4
+ Use QOperatingSystemVersion::current() instead.
+
Returns the version of the Windows operating system on which the
application is run, or WV_None if the operating system is not
Windows.
@@ -1237,16 +1242,21 @@ bool qSharedBuild() noexcept
\variable QSysInfo::MacintoshVersion
\brief the version of the Macintosh operating system on which
the application is run.
+
+ Use QOperatingSystemVersion::current() instead.
*/
/*!
\deprecated
\fn QSysInfo::MacVersion QSysInfo::macVersion()
+ Use QOperatingSystemVersion::current() instead.
+
Returns the version of Darwin (\macos or iOS) on which the
application is run, or MV_None if the operating system
is not a version of Darwin.
*/
+#endif
/*!
\enum QSysInfo::Endian
@@ -1257,10 +1267,13 @@ bool qSharedBuild() noexcept
the platform's byte order.
*/
+#if QT_DEPRECATED_SINCE(5, 9)
/*!
\deprecated
\enum QSysInfo::WinVersion
+ Use the versions defined in QOperatingSystemVersion instead.
+
This enum provides symbolic names for the various versions of the
Windows operating system. On Windows, the
QSysInfo::WindowsVersion variable gives the version of the system
@@ -1318,6 +1331,8 @@ bool qSharedBuild() noexcept
\deprecated
\enum QSysInfo::MacVersion
+ Use the versions defined in QOperatingSystemVersion instead.
+
This enum provides symbolic names for the various versions of the
Darwin operating system, covering both \macos and iOS. The
QSysInfo::MacintoshVersion variable gives the version of the
@@ -1388,6 +1403,7 @@ bool qSharedBuild() noexcept
\sa WinVersion
*/
+#endif
/*!
\macro Q_OS_DARWIN
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 35c0482768..31f482dd8d 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -86,14 +86,9 @@
#define QT_CONFIG(feature) (1/QT_FEATURE_##feature == 1)
#define QT_REQUIRE_CONFIG(feature) Q_STATIC_ASSERT_X(QT_FEATURE_##feature == 1, "Required feature " #feature " for file " __FILE__ " not available.")
-#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
-# define QT_NO_UNSHARABLE_CONTAINERS
-# define QT6_VIRTUAL virtual
-# define QT6_NOT_VIRTUAL
-#else
-# define QT6_VIRTUAL
-# define QT6_NOT_VIRTUAL virtual
-#endif
+// ### Clean those up, once all code is adjusted
+#define QT6_VIRTUAL virtual
+#define QT6_NOT_VIRTUAL
/* These two macros makes it possible to turn the builtin line expander into a
* string literal. */
@@ -376,11 +371,19 @@ typedef double qreal;
# define QT_DEPRECATED_VERSION_5_15
#endif
+#if QT_DEPRECATED_WARNINGS_SINCE >= QT_VERSION_CHECK(6, 0, 0)
+# define QT_DEPRECATED_VERSION_X_6_0(text) QT_DEPRECATED_X(text)
+# define QT_DEPRECATED_VERSION_6_0 QT_DEPRECATED
+#else
+# define QT_DEPRECATED_VERSION_X_6_0(text)
+# define QT_DEPRECATED_VERSION_6_0
+#endif
+
#define QT_DEPRECATED_VERSION_X_5(minor, text) QT_DEPRECATED_VERSION_X_5_##minor(text)
-#define QT_DEPRECATED_VERSION_X(major, minor, text) QT_DEPRECATED_VERSION_X_##major(minor, text)
+#define QT_DEPRECATED_VERSION_X(major, minor, text) QT_DEPRECATED_VERSION_X_##major##_##minor(text)
#define QT_DEPRECATED_VERSION_5(minor) QT_DEPRECATED_VERSION_5_##minor
-#define QT_DEPRECATED_VERSION(major, minor) QT_DEPRECATED_VERSION_##major(minor)
+#define QT_DEPRECATED_VERSION(major, minor) QT_DEPRECATED_VERSION_##major##_##minor
#ifdef __cplusplus
// A tag to help mark stuff deprecated (cf. QStringViewLiteral)
@@ -498,53 +501,6 @@ Q_CORE_EXPORT Q_DECL_CONST_FUNCTION const char *qVersion(void) Q_DECL_NOEXCEPT;
# define Q_DESTRUCTOR_FUNCTION(AFUNC) Q_DESTRUCTOR_FUNCTION0(AFUNC)
#endif
-namespace QtPrivate {
- template <class T>
- struct AlignOfHelper
- {
- char c;
- T type;
-
- AlignOfHelper();
- ~AlignOfHelper();
- };
-
- template <class T>
- struct AlignOf_Default
- {
- enum { Value = sizeof(AlignOfHelper<T>) - sizeof(T) };
- };
-
- template <class T> struct AlignOf : AlignOf_Default<T> { };
- template <class T> struct AlignOf<T &> : AlignOf<T> {};
- template <class T> struct AlignOf<T &&> : AlignOf<T> {};
- template <size_t N, class T> struct AlignOf<T[N]> : AlignOf<T> {};
-
-#if defined(Q_PROCESSOR_X86_32) && !defined(Q_OS_WIN)
- template <class T> struct AlignOf_WorkaroundForI386Abi { enum { Value = sizeof(T) }; };
-
- // x86 ABI weirdness
- // Alignment of naked type is 8, but inside struct has alignment 4.
- template <> struct AlignOf<double> : AlignOf_WorkaroundForI386Abi<double> {};
- template <> struct AlignOf<qint64> : AlignOf_WorkaroundForI386Abi<qint64> {};
- template <> struct AlignOf<quint64> : AlignOf_WorkaroundForI386Abi<quint64> {};
-#ifdef Q_CC_CLANG
- // GCC and Clang seem to disagree wrt to alignment of arrays
- template <size_t N> struct AlignOf<double[N]> : AlignOf_Default<double> {};
- template <size_t N> struct AlignOf<qint64[N]> : AlignOf_Default<qint64> {};
- template <size_t N> struct AlignOf<quint64[N]> : AlignOf_Default<quint64> {};
-#endif
-#endif
-} // namespace QtPrivate
-
-#define QT_EMULATED_ALIGNOF(T) \
- (size_t(QT_PREPEND_NAMESPACE(QtPrivate)::AlignOf<T>::Value))
-
-#ifndef Q_ALIGNOF
-#define Q_ALIGNOF(T) QT_EMULATED_ALIGNOF(T)
-#endif
-
-
/*
quintptr and qptrdiff is guaranteed to be the same size as a pointer, i.e.
diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp
index f1d7832e46..82c255348f 100644
--- a/src/corelib/global/qlibraryinfo.cpp
+++ b/src/corelib/global/qlibraryinfo.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
@@ -419,7 +419,6 @@ static const struct {
#endif
{ "Binaries", "bin" },
{ "Plugins", "plugins" }, // should be ${ArchData}/plugins
- { "Imports", "imports" }, // should be ${ArchData}/imports
{ "Qml2Imports", "qml" }, // should be ${ArchData}/qml
{ "ArchData", "." },
{ "Data", "." },
@@ -671,6 +670,8 @@ static QString getPrefix(
# if QT_CONFIGURE_CROSSBUILD
if (group == QLibraryInfo::DevicePaths)
return QString::fromLocal8Bit(QT_CONFIGURE_PREFIX_PATH);
+# else
+ Q_UNUSED(group);
# endif
return getExtPrefixFromHostBinDir();
#elif QT_CONFIG(relocatable)
@@ -901,7 +902,6 @@ QStringList QLibraryInfo::platformPluginArguments(const QString &platformName)
\value LibraryExecutablesPath The location of installed executables required by libraries at runtime.
\value BinariesPath The location of installed Qt binaries (tools and applications).
\value PluginsPath The location of installed Qt plugins.
- \value ImportsPath The location of installed QML extensions to import (QML 1.x).
\value Qml2ImportsPath The location of installed QML extensions to import (QML 2.x).
\value ArchDataPath The location of general architecture-dependent Qt data.
\value DataPath The location of general architecture-independent Qt data.
diff --git a/src/corelib/global/qlibraryinfo.h b/src/corelib/global/qlibraryinfo.h
index ed60b170a5..031dfe37e2 100644
--- a/src/corelib/global/qlibraryinfo.h
+++ b/src/corelib/global/qlibraryinfo.h
@@ -79,7 +79,6 @@ public:
LibraryExecutablesPath,
BinariesPath,
PluginsPath,
- ImportsPath,
Qml2ImportsPath,
ArchDataPath,
DataPath,
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index 89f49324c0..db4224db91 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -101,6 +101,11 @@
#include <emscripten/emscripten.h>
#endif
+#if QT_CONFIG(slog2)
+extern char *__progname;
+#endif
+
+#ifndef QT_BOOTSTRAPPED
#if QT_CONFIG(regularexpression)
# ifdef __UCLIBC__
# if __UCLIBC_HAS_BACKTRACE__
@@ -111,11 +116,6 @@
# endif
#endif
-#if QT_CONFIG(slog2)
-extern char *__progname;
-#endif
-
-#ifndef QT_BOOTSTRAPPED
#if defined(Q_OS_LINUX) && (defined(__GLIBC__) || __has_include(<sys/syscall.h>))
# include <sys/syscall.h>
@@ -1307,7 +1307,7 @@ static QStringList backtraceFramesForLogMessage(int frameCount)
QString function = m.captured(2);
// skip the trace from QtCore that are because of the qDebug itself
- if (!numberPrinted && library.contains(QLatin1String("Qt5Core"))
+ if (!numberPrinted && library.contains(QLatin1String("Qt6Core"))
&& (function.isEmpty() || function.contains(QLatin1String("Message"), Qt::CaseInsensitive)
|| function.contains(QLatin1String("QDebug")))) {
continue;
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index b745d0de7e..87e5153964 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -41,6 +41,7 @@
#define QNAMESPACE_H
#include <QtCore/qglobal.h>
+#include <QtCore/qtmetamacros.h>
#if defined(__OBJC__) && !defined(__cplusplus)
# warning "File built in Objective-C mode (.m), but using Qt requires Objective-C++ (.mm)"
@@ -48,29 +49,10 @@
QT_BEGIN_NAMESPACE
-#if !defined(Q_QDOC) && !defined(Q_MOC_RUN)
struct QMetaObject;
-const QMetaObject *qt_getQtMetaObject() noexcept; // defined in qobject.h (which can't be included here)
-#define QT_Q_ENUM(ENUM) \
- inline const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return qt_getQtMetaObject(); } \
- inline Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) noexcept { return #ENUM; }
-#define QT_Q_FLAG(ENUM) QT_Q_ENUM(ENUM)
-#else
-#define QT_Q_ENUM Q_ENUM
-#define QT_Q_FLAG Q_FLAG
-#endif
-
-#ifndef Q_MOC_RUN
-namespace
-#else
-class Q_CORE_EXPORT
-#endif
-Qt {
-#if defined(Q_MOC_RUN)
- Q_OBJECT
-public:
-#endif
+namespace Qt {
+ Q_NAMESPACE_EXPORT(Q_CORE_EXPORT)
enum GlobalColor {
color0,
@@ -546,7 +528,7 @@ public:
AA_DisableShaderDiskCache = 27,
AA_DontShowShortcutsInContextMenus = 28,
AA_CompressTabletEvents = 29,
- AA_DisableWindowContextHelpButton = 30, // ### Qt 6: remove me
+ // AA_DisableWindowContextHelpButton = 30,
AA_DisableSessionManager = 31,
// Add new attributes before this line
@@ -1578,12 +1560,12 @@ public:
MatchContains = 1,
MatchStartsWith = 2,
MatchEndsWith = 3,
+ MatchRegularExpression = 4,
#if QT_DEPRECATED_SINCE(5, 15)
- MatchRegExp Q_DECL_ENUMERATOR_DEPRECATED_X("MatchRegExp is deprecated. Use MatchRegularExpression instead") = 4,
+ MatchRegExp Q_DECL_ENUMERATOR_DEPRECATED_X("MatchRegExp is deprecated. Use MatchRegularExpression instead") = MatchRegularExpression,
#endif
MatchWildcard = 5,
MatchFixedString = 8,
- MatchRegularExpression = 9,
MatchCaseSensitive = 16,
MatchWrap = 32,
MatchRecursive = 64
@@ -1773,102 +1755,96 @@ public:
enum ReturnByValueConstant { ReturnByValue }; // ### Qt 7: Remove me
#ifndef Q_QDOC
- // NOTE: Generally, do not add QT_Q_ENUM if a corresponding Q_Q_FLAG exists.
- QT_Q_ENUM(ScrollBarPolicy)
- QT_Q_ENUM(FocusPolicy)
- QT_Q_ENUM(ContextMenuPolicy)
- QT_Q_ENUM(ArrowType)
- QT_Q_ENUM(ToolButtonStyle)
- QT_Q_ENUM(PenStyle)
- QT_Q_ENUM(PenCapStyle)
- QT_Q_ENUM(PenJoinStyle)
- QT_Q_ENUM(BrushStyle)
- QT_Q_ENUM(FillRule)
- QT_Q_ENUM(MaskMode)
- QT_Q_ENUM(BGMode)
- QT_Q_ENUM(ClipOperation)
- QT_Q_ENUM(SizeMode)
- QT_Q_ENUM(Axis)
- QT_Q_ENUM(Corner)
- QT_Q_ENUM(Edge)
- QT_Q_ENUM(LayoutDirection)
- QT_Q_ENUM(SizeHint)
- QT_Q_ENUM(Orientation)
- QT_Q_ENUM(DropAction)
- QT_Q_FLAG(Alignment)
- QT_Q_ENUM(TextFlag)
- QT_Q_FLAG(Orientations)
- QT_Q_FLAG(SplitBehavior)
- QT_Q_FLAG(DropActions)
- QT_Q_FLAG(Edges)
- QT_Q_FLAG(DockWidgetAreas)
- QT_Q_FLAG(ToolBarAreas)
- QT_Q_ENUM(DockWidgetArea)
- QT_Q_ENUM(ToolBarArea)
- QT_Q_ENUM(TextFormat)
- QT_Q_ENUM(TextElideMode)
- QT_Q_ENUM(DateFormat)
- QT_Q_ENUM(TimeSpec)
- QT_Q_ENUM(DayOfWeek)
- QT_Q_ENUM(CursorShape)
- QT_Q_ENUM(GlobalColor)
- QT_Q_ENUM(AspectRatioMode)
- QT_Q_ENUM(TransformationMode)
- QT_Q_FLAG(ImageConversionFlags)
- QT_Q_ENUM(Key)
- QT_Q_ENUM(ShortcutContext)
- QT_Q_ENUM(TextInteractionFlag)
- QT_Q_FLAG(TextInteractionFlags)
- QT_Q_ENUM(ItemSelectionMode)
- QT_Q_ENUM(ItemSelectionOperation)
- QT_Q_FLAG(ItemFlags)
- QT_Q_ENUM(CheckState)
- QT_Q_ENUM(ItemDataRole)
- QT_Q_ENUM(SortOrder)
- QT_Q_ENUM(CaseSensitivity)
- QT_Q_FLAG(MatchFlags)
- QT_Q_FLAG(KeyboardModifiers)
- QT_Q_FLAG(MouseButtons)
- QT_Q_ENUM(WindowType)
- QT_Q_ENUM(WindowState)
- QT_Q_ENUM(WindowModality)
- QT_Q_ENUM(WidgetAttribute)
- QT_Q_ENUM(ApplicationAttribute)
- QT_Q_FLAG(WindowFlags)
- QT_Q_FLAG(WindowStates)
- QT_Q_ENUM(FocusReason)
- QT_Q_ENUM(InputMethodHint)
- QT_Q_ENUM(InputMethodQuery)
- QT_Q_FLAG(InputMethodHints)
- QT_Q_ENUM(EnterKeyType)
- QT_Q_FLAG(InputMethodQueries)
- QT_Q_FLAG(TouchPointStates)
- QT_Q_ENUM(ScreenOrientation)
- QT_Q_FLAG(ScreenOrientations)
- QT_Q_ENUM(ConnectionType)
- QT_Q_ENUM(ApplicationState)
+ // NOTE: Generally, do not add Q_ENUM_NS if a corresponding Q_FLAG_NS exists.
+ Q_ENUM_NS(ScrollBarPolicy)
+ Q_ENUM_NS(FocusPolicy)
+ Q_ENUM_NS(ContextMenuPolicy)
+ Q_ENUM_NS(ArrowType)
+ Q_ENUM_NS(ToolButtonStyle)
+ Q_ENUM_NS(PenStyle)
+ Q_ENUM_NS(PenCapStyle)
+ Q_ENUM_NS(PenJoinStyle)
+ Q_ENUM_NS(BrushStyle)
+ Q_ENUM_NS(FillRule)
+ Q_ENUM_NS(MaskMode)
+ Q_ENUM_NS(BGMode)
+ Q_ENUM_NS(ClipOperation)
+ Q_ENUM_NS(SizeMode)
+ Q_ENUM_NS(Axis)
+ Q_ENUM_NS(Corner)
+ Q_ENUM_NS(Edge)
+ Q_ENUM_NS(LayoutDirection)
+ Q_ENUM_NS(SizeHint)
+ Q_ENUM_NS(Orientation)
+ Q_ENUM_NS(DropAction)
+ Q_FLAG_NS(Alignment)
+ Q_ENUM_NS(TextFlag)
+ Q_FLAG_NS(Orientations)
+ Q_FLAG_NS(SplitBehavior)
+ Q_FLAG_NS(DropActions)
+ Q_FLAG_NS(Edges)
+ Q_FLAG_NS(DockWidgetAreas)
+ Q_FLAG_NS(ToolBarAreas)
+ Q_ENUM_NS(DockWidgetArea)
+ Q_ENUM_NS(ToolBarArea)
+ Q_ENUM_NS(TextFormat)
+ Q_ENUM_NS(TextElideMode)
+ Q_ENUM_NS(DateFormat)
+ Q_ENUM_NS(TimeSpec)
+ Q_ENUM_NS(DayOfWeek)
+ Q_ENUM_NS(CursorShape)
+ Q_ENUM_NS(GlobalColor)
+ Q_ENUM_NS(AspectRatioMode)
+ Q_ENUM_NS(TransformationMode)
+ Q_FLAG_NS(ImageConversionFlags)
+ Q_ENUM_NS(Key)
+ Q_ENUM_NS(ShortcutContext)
+ Q_ENUM_NS(TextInteractionFlag)
+ Q_FLAG_NS(TextInteractionFlags)
+ Q_ENUM_NS(ItemSelectionMode)
+ Q_ENUM_NS(ItemSelectionOperation)
+ Q_FLAG_NS(ItemFlags)
+ Q_ENUM_NS(CheckState)
+ Q_ENUM_NS(ItemDataRole)
+ Q_ENUM_NS(SortOrder)
+ Q_ENUM_NS(CaseSensitivity)
+ Q_FLAG_NS(MatchFlags)
+ Q_FLAG_NS(KeyboardModifiers)
+ Q_FLAG_NS(MouseButtons)
+ Q_ENUM_NS(WindowType)
+ Q_ENUM_NS(WindowState)
+ Q_ENUM_NS(WindowModality)
+ Q_ENUM_NS(WidgetAttribute)
+ Q_ENUM_NS(ApplicationAttribute)
+ Q_FLAG_NS(WindowFlags)
+ Q_FLAG_NS(WindowStates)
+ Q_ENUM_NS(FocusReason)
+ Q_ENUM_NS(InputMethodHint)
+ Q_ENUM_NS(InputMethodQuery)
+ Q_FLAG_NS(InputMethodHints)
+ Q_ENUM_NS(EnterKeyType)
+ Q_FLAG_NS(InputMethodQueries)
+ Q_FLAG_NS(TouchPointStates)
+ Q_ENUM_NS(ScreenOrientation)
+ Q_FLAG_NS(ScreenOrientations)
+ Q_ENUM_NS(ConnectionType)
+ Q_ENUM_NS(ApplicationState)
#ifndef QT_NO_GESTURES
- QT_Q_ENUM(GestureState)
- QT_Q_ENUM(GestureType)
- QT_Q_ENUM(NativeGestureType)
+ Q_ENUM_NS(GestureState)
+ Q_ENUM_NS(GestureType)
+ Q_ENUM_NS(NativeGestureType)
#endif
- QT_Q_ENUM(CursorMoveStyle)
- QT_Q_ENUM(TimerType)
- QT_Q_ENUM(ScrollPhase)
- QT_Q_ENUM(MouseEventSource)
- QT_Q_FLAG(MouseEventFlag)
- QT_Q_ENUM(ChecksumType)
- QT_Q_ENUM(HighDpiScaleFactorRoundingPolicy)
- QT_Q_ENUM(TabFocusBehavior)
+ Q_ENUM_NS(CursorMoveStyle)
+ Q_ENUM_NS(TimerType)
+ Q_ENUM_NS(ScrollPhase)
+ Q_ENUM_NS(MouseEventSource)
+ Q_FLAG_NS(MouseEventFlag)
+ Q_ENUM_NS(ChecksumType)
+ Q_ENUM_NS(HighDpiScaleFactorRoundingPolicy)
+ Q_ENUM_NS(TabFocusBehavior)
#endif // Q_DOC
}
-#ifdef Q_MOC_RUN
- ;
-#endif
-
-#undef QT_Q_ENUM
-#undef QT_Q_FLAG
typedef bool (*qInternalCallback)(void **);
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc
index 2fe019f372..73c3f8c483 100644
--- a/src/corelib/global/qnamespace.qdoc
+++ b/src/corelib/global/qnamespace.qdoc
@@ -280,12 +280,6 @@
\e glProgramBinary(). In the unlikely event of this being problematic,
set this attribute to disable all disk-based caching of shaders.
- \value AA_DisableWindowContextHelpButton Disables the WindowContextHelpButtonHint
- by default on Qt::Sheet and Qt::Dialog widgets. This hides the \gui ? button
- on Windows, which only makes sense if you use \l QWhatsThis functionality.
- This value was added in Qt 5.10. In Qt 6, WindowContextHelpButtonHint
- will not be set by default.
-
\value AA_DisableSessionManager Disables the QSessionManager.
By default Qt will connect to a running session manager for a GUI
application on supported platforms, use of a session manager may be
@@ -2875,8 +2869,7 @@
\value MatchStartsWith The search term matches the start of the item.
\value MatchEndsWith The search term matches the end of the item.
\value MatchCaseSensitive The search is case sensitive.
- \value MatchRegExp Performs string-based matching using a regular
- expression as the search term. Uses the deprecated QRegExp class.
+ \value MatchRegExp Same as MatchRegularExpression
\e{This enum value is deprecated since Qt 5.15.}
\value MatchRegularExpression Performs string-based matching using a regular
expression as the search term. Uses QRegularExpression.
@@ -2892,7 +2885,7 @@
the first item and continues until all items have been examined.
\value MatchRecursive Searches the entire hierarchy.
- \sa QString::compare(), QRegExp, QRegularExpression
+ \sa QString::compare(), QRegularExpression
*/
/*!
diff --git a/src/corelib/global/qnumeric_p.h b/src/corelib/global/qnumeric_p.h
index 7418579fe0..7a03e32699 100644
--- a/src/corelib/global/qnumeric_p.h
+++ b/src/corelib/global/qnumeric_p.h
@@ -202,7 +202,7 @@ namespace {
This function works for v containing infinities, but not NaN. It's the
caller's responsibility to exclude that possibility before calling it.
*/
-template <typename T> static inline bool convertDoubleTo(double v, T *value)
+template <typename T> static inline bool convertDoubleTo(double v, T *value, bool allow_precision_upgrade = true)
{
Q_STATIC_ASSERT(std::numeric_limits<T>::is_integer);
@@ -227,6 +227,10 @@ template <typename T> static inline bool convertDoubleTo(double v, T *value)
supremum = -2.0 * std::numeric_limits<ST>::min(); // -2 * (-2^63) = 2^64, exact (for T = quint64)
v = fabs(v);
}
+ if (std::is_integral<T>::value && sizeof(T) > 4 && !allow_precision_upgrade) {
+ if (v > double(Q_INT64_C(1)<<53) || v < double(-((Q_INT64_C(1)<<53) + 1)))
+ return false;
+ }
*value = std::numeric_limits<T>::max();
if (v >= supremum)
diff --git a/src/corelib/global/qrandom.cpp b/src/corelib/global/qrandom.cpp
index 10672c1f92..3dc024e301 100644
--- a/src/corelib/global/qrandom.cpp
+++ b/src/corelib/global/qrandom.cpp
@@ -355,7 +355,7 @@ struct QRandomGenerator::SystemAndGlobalGenerators
// the state in case another thread tries to lock the mutex. It's not
// a common scenario, but since sizeof(QRandomGenerator) >= 2560, the
// overhead is actually acceptable.
- // 2) We use both Q_DECL_ALIGN and std::aligned_storage<..., 64> because
+ // 2) We use both alignas and std::aligned_storage<..., 64> because
// some implementations of std::aligned_storage can't align to more
// than a primitive type's alignment.
// 3) We don't store the entire system QRandomGenerator, only the space
@@ -364,7 +364,7 @@ struct QRandomGenerator::SystemAndGlobalGenerators
QBasicMutex globalPRNGMutex;
struct ShortenedSystem { uint type; } system_;
SystemGenerator sys;
- Q_DECL_ALIGN(64) std::aligned_storage<sizeof(QRandomGenerator64), 64>::type global_;
+ alignas(64) std::aligned_storage<sizeof(QRandomGenerator64), 64>::type global_;
#ifdef Q_COMPILER_CONSTEXPR
constexpr SystemAndGlobalGenerators()
diff --git a/src/corelib/global/qrandom.h b/src/corelib/global/qrandom.h
index 445b520c76..e1494ab523 100644
--- a/src/corelib/global/qrandom.h
+++ b/src/corelib/global/qrandom.h
@@ -196,7 +196,7 @@ private:
RandomEngine &engine() { return twister; }
const RandomEngine &engine() const { return twister; }
#else
- std::aligned_storage<sizeof(RandomEngine), Q_ALIGNOF(RandomEngine)>::type buffer;
+ std::aligned_storage<sizeof(RandomEngine), alignof(RandomEngine)>::type buffer;
RandomEngine &engine() { return reinterpret_cast<RandomEngine &>(buffer); }
const RandomEngine &engine() const { return reinterpret_cast<const RandomEngine &>(buffer); }
#endif
diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/global/qsimd.cpp
index 75c380ee8a..75c380ee8a 100644
--- a/src/corelib/tools/qsimd.cpp
+++ b/src/corelib/global/qsimd.cpp
diff --git a/src/corelib/global/qsimd.h b/src/corelib/global/qsimd.h
new file mode 100644
index 0000000000..325faf123a
--- /dev/null
+++ b/src/corelib/global/qsimd.h
@@ -0,0 +1,157 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Copyright (C) 2018 Intel Corporation.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSIMD_H
+#define QSIMD_H
+
+#include <QtCore/qglobal.h>
+
+/*
+ * qconfig.h defines the QT_COMPILER_SUPPORTS_XXX macros.
+ * They mean the compiler supports the necessary flags and the headers
+ * for the x86 and ARM intrinsics.
+ *
+ * Supported instruction set extensions are:
+ * Flag | Arch
+ * neon | ARM
+ * mips_dsp | mips
+ * mips_dspr2 | mips
+ * sse2 | x86
+ * sse4_1 | x86
+ * sse4_2 | x86
+ * avx | x86
+ *
+ * Code can use the following constructs to determine compiler support & status:
+ * - #if QT_COMPILER_USES(XXX) (e.g: #if QT_COMPILER_USES(neon) or QT_COMPILER_USES(sse4_1)
+ * If this test passes, then the compiler is already generating code using the
+ * given instruction set. The intrinsics for those instructions are
+ * #included and can be used without restriction or runtime check.
+ *
+ * Code that requires runtime detection and different code paths at runtime is
+ * currently not supported here, have a look at qsimd_p.h for support.
+ */
+
+#define QT_COMPILER_USES(feature) (1/QT_COMPILER_USES_##feature == 1)
+
+#if defined(Q_PROCESSOR_ARM) && defined(__ARM_NEON) || defined(__ARM_NEON__)
+# include <arm_neon.h>
+# define QT_COMPILER_USES_neon 1
+#else
+# define QT_COMPILER_USES_neon -1
+#endif
+
+#if defined(Q_PROCESSOR_MIPS) && (defined(__MIPS_DSP__) || (defined(__mips_dsp) && defined(Q_PROCESSOR_MIPS_32)))
+# define QT_COMPILER_USES_mips_dsp 1
+#else
+# define QT_COMPILER_USES_mips_dsp -1
+#endif
+
+#if defined(Q_PROCESSOR_MIPS) && (defined(__MIPS_DSPR2__) || (defined(__mips_dspr2) && defined(Q_PROCESSOR_MIPS_32)))
+# define QT_COMPILER_USES_mips_dspr2 1
+#else
+# define QT_COMPILER_USES_mips_dspr2 -1
+#endif
+
+#if defined(Q_PROCESSOR_X86)
+#if defined(Q_CC_MSVC)
+// MSVC doesn't define __SSE2__, so do it ourselves
+# if (defined(_M_X64) || _M_IX86_FP >= 2)
+# define __SSE__ 1
+# define __SSE2__ 1
+# endif
+#if (defined(_M_AVX) || defined(__AVX__))
+// Visual Studio defines __AVX__ when /arch:AVX is passed, but not the earlier macros
+// See: https://msdn.microsoft.com/en-us/library/b0084kay.aspx
+# define __SSE3__ 1
+# define __SSSE3__ 1
+# define __SSE4_1__ 1
+# define __SSE4_2__ 1
+# ifndef __AVX__
+# define __AVX__ 1
+# endif
+# endif
+# ifdef __SSE2__
+# define QT_VECTORCALL __vectorcall
+# endif
+#endif
+#endif
+
+#if defined(Q_PROCESSOR_X86) && defined(__SSE2__)
+# include <immintrin.h>
+# define QT_COMPILER_USES_sse2 1
+#else
+# define QT_COMPILER_USES_sse2 -1
+#endif
+
+#if defined(Q_PROCESSOR_X86) && defined(__SSE3__)
+# define QT_COMPILER_USES_sse3 1
+#else
+# define QT_COMPILER_USES_sse3 -1
+#endif
+
+#if defined(Q_PROCESSOR_X86) && defined(__SSSE3__)
+# define QT_COMPILER_USES_ssse3 1
+#else
+# define QT_COMPILER_USES_ssse3 -1
+#endif
+
+#if defined(Q_PROCESSOR_X86) && defined(__SSE4_1__)
+# define QT_COMPILER_USES_sse4_1 1
+#else
+# define QT_COMPILER_USES_sse4_1 -1
+#endif
+
+#if defined(Q_PROCESSOR_X86) && defined(__SSE4_2__)
+# define QT_COMPILER_USES_sse4_2 1
+#else
+# define QT_COMPILER_USES_sse4_2 -1
+#endif
+
+#if defined(Q_PROCESSOR_X86) && defined(__AVX__)
+# define QT_COMPILER_USES_avx 1
+#else
+# define QT_COMPILER_USES_avx -1
+#endif
+
+#ifndef QT_VECTORCALL
+#define QT_VECTORCALL
+#endif
+
+#endif // QSIMD_H
diff --git a/src/corelib/global/qsimd_p.h b/src/corelib/global/qsimd_p.h
new file mode 100644
index 0000000000..2f2d49348f
--- /dev/null
+++ b/src/corelib/global/qsimd_p.h
@@ -0,0 +1,377 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2018 Intel Corporation.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSIMD_P_H
+#define QSIMD_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/private/qglobal_p.h>
+#include <QtCore/qsimd.h>
+
+/*
+ * qt_module_config.prf defines the QT_COMPILER_SUPPORTS_XXX macros.
+ * They mean the compiler supports the necessary flags and the headers
+ * for the x86 and ARM intrinsics:
+ * - GCC: the -mXXX or march=YYY flag is necessary before #include
+ * up to 4.8; GCC >= 4.9 can include unconditionally
+ * - Intel CC: #include can happen unconditionally
+ * - MSVC: #include can happen unconditionally
+ * - RVCT: ???
+ *
+ * We will try to include all headers possible under this configuration.
+ *
+ * MSVC does not define __SSE2__ & family, so we will define them. MSVC 2013 &
+ * up do define __AVX__ if the -arch:AVX option is passed on the command-line.
+ *
+ * Supported XXX are:
+ * Flag | Arch | GCC | Intel CC | MSVC |
+ * ARM_NEON | ARM | I & C | None | ? |
+ * SSE2 | x86 | I & C | I & C | I & C |
+ * SSE3 | x86 | I & C | I & C | I only |
+ * SSSE3 | x86 | I & C | I & C | I only |
+ * SSE4_1 | x86 | I & C | I & C | I only |
+ * SSE4_2 | x86 | I & C | I & C | I only |
+ * AVX | x86 | I & C | I & C | I & C |
+ * AVX2 | x86 | I & C | I & C | I only |
+ * AVX512xx | x86 | I & C | I & C | I only |
+ * I = intrinsics; C = code generation
+ *
+ * Code can use the following constructs to determine compiler support & status:
+ * - #ifdef __XXX__ (e.g: #ifdef __AVX__ or #ifdef __ARM_NEON__)
+ * If this test passes, then the compiler is already generating code for that
+ * given sub-architecture. The intrinsics for that sub-architecture are
+ * #included and can be used without restriction or runtime check.
+ *
+ * - #if QT_COMPILER_SUPPORTS(XXX)
+ * If this test passes, then the compiler is able to generate code for that
+ * given sub-architecture in another translation unit, given the right set of
+ * flags. Use of the intrinsics is not guaranteed. This is useful with
+ * runtime detection (see below).
+ *
+ * - #if QT_COMPILER_SUPPORTS_HERE(XXX)
+ * If this test passes, then the compiler is able to generate code for that
+ * given sub-architecture in this translation unit, even if it is not doing
+ * that now (it might be). Individual functions may be tagged with
+ * QT_FUNCTION_TARGET(XXX) to cause the compiler to generate code for that
+ * sub-arch. Only inside such functions is the use of the intrisics
+ * guaranteed to work. This is useful with runtime detection (see below).
+ *
+ * Runtime detection of a CPU sub-architecture can be done with the
+ * qCpuHasFeature(XXX) function. There are two strategies for generating
+ * optimized code like that:
+ *
+ * 1) place the optimized code in a different translation unit (C or assembly
+ * sources) and pass the correct flags to the compiler to enable support. Those
+ * sources must not include qglobal.h, which means they cannot include this
+ * file either. The dispatcher function would look like this:
+ *
+ * void foo()
+ * {
+ * #if QT_COMPILER_SUPPORTS(XXX)
+ * if (qCpuHasFeature(XXX)) {
+ * foo_optimized_xxx();
+ * return;
+ * }
+ * #endif
+ * foo_plain();
+ * }
+ *
+ * 2) place the optimized code in a function tagged with QT_FUNCTION_TARGET and
+ * surrounded by #if QT_COMPILER_SUPPORTS_HERE(XXX). That code can freely use
+ * other Qt code. The dispatcher function would look like this:
+ *
+ * void foo()
+ * {
+ * #if QT_COMPILER_SUPPORTS_HERE(XXX)
+ * if (qCpuHasFeature(XXX)) {
+ * foo_optimized_xxx();
+ * return;
+ * }
+ * #endif
+ * foo_plain();
+ * }
+ */
+
+#if defined(__MINGW64_VERSION_MAJOR) || defined(Q_CC_MSVC)
+#include <intrin.h>
+#endif
+
+#define QT_COMPILER_SUPPORTS(x) (QT_COMPILER_SUPPORTS_ ## x - 0)
+
+#if defined(Q_PROCESSOR_ARM)
+# define QT_COMPILER_SUPPORTS_HERE(x) (__ARM_FEATURE_ ## x)
+# if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 600
+ /* GCC requires attributes for a function */
+# define QT_FUNCTION_TARGET(x) __attribute__((__target__(QT_FUNCTION_TARGET_STRING_ ## x)))
+# else
+# define QT_FUNCTION_TARGET(x)
+# endif
+# if !defined(__ARM_FEATURE_NEON) && defined(__ARM_NEON__)
+# define __ARM_FEATURE_NEON // also support QT_COMPILER_SUPPORTS_HERE(NEON)
+# endif
+#elif defined(Q_PROCESSOR_MIPS)
+# define QT_COMPILER_SUPPORTS_HERE(x) (__ ## x ## __)
+# define QT_FUNCTION_TARGET(x)
+# if !defined(__MIPS_DSP__) && defined(__mips_dsp) && defined(Q_PROCESSOR_MIPS_32)
+# define __MIPS_DSP__
+# endif
+# if !defined(__MIPS_DSPR2__) && defined(__mips_dspr2) && defined(Q_PROCESSOR_MIPS_32)
+# define __MIPS_DSPR2__
+# endif
+#elif defined(Q_PROCESSOR_X86) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS)
+# define QT_COMPILER_SUPPORTS_HERE(x) ((__ ## x ## __) || QT_COMPILER_SUPPORTS(x))
+# if defined(Q_CC_GNU) && !defined(Q_CC_INTEL)
+ /* GCC requires attributes for a function */
+# define QT_FUNCTION_TARGET(x) __attribute__((__target__(QT_FUNCTION_TARGET_STRING_ ## x)))
+# else
+# define QT_FUNCTION_TARGET(x)
+# endif
+#else
+# define QT_COMPILER_SUPPORTS_HERE(x) (__ ## x ## __)
+# define QT_FUNCTION_TARGET(x)
+#endif
+
+#ifdef Q_PROCESSOR_X86
+/* -- x86 intrinsic support -- */
+
+# if defined(Q_CC_MSVC) && (defined(_M_X64) || _M_IX86_FP >= 2)
+// MSVC doesn't define __SSE2__, so do it ourselves
+# define __SSE__ 1
+# endif
+
+# if defined(Q_CC_GNU) && !defined(Q_CC_INTEL)
+// GCC 4.4 and Clang 2.8 added a few more intrinsics there
+# include <x86intrin.h>
+# endif
+
+# if defined(__SSE4_2__) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS) && (defined(Q_CC_INTEL) || defined(Q_CC_MSVC))
+// POPCNT instructions:
+// All processors that support SSE4.2 support POPCNT
+// (but neither MSVC nor the Intel compiler define this macro)
+# define __POPCNT__ 1
+# endif
+
+// AVX intrinsics
+# if defined(__AVX__) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS) && (defined(Q_CC_INTEL) || defined(Q_CC_MSVC))
+// AES, PCLMULQDQ instructions:
+// All processors that support AVX support PCLMULQDQ
+// (but neither MSVC nor the Intel compiler define this macro)
+# define __PCLMUL__ 1
+# endif
+
+# if defined(__AVX2__) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS) && (defined(Q_CC_INTEL) || defined(Q_CC_MSVC))
+// F16C & RDRAND instructions:
+// All processors that support AVX2 support F16C & RDRAND:
+// (but neither MSVC nor the Intel compiler define these macros)
+# define __F16C__ 1
+# define __RDRND__ 1
+# endif
+
+# if defined(__BMI__) && !defined(__BMI2__) && defined(Q_CC_INTEL)
+// BMI2 instructions:
+// All processors that support BMI support BMI2 (and AVX2)
+// (but neither MSVC nor the Intel compiler define this macro)
+# define __BMI2__ 1
+# endif
+
+# include "qsimd_x86_p.h"
+
+// Haswell sub-architecture
+//
+// The Intel Core 4th generation was codenamed "Haswell" and introduced AVX2,
+// BMI1, BMI2, FMA, LZCNT, MOVBE, which makes it a good divider for a
+// sub-target for us. The first AMD processor with AVX2 support (Zen) has the
+// same features.
+//
+// macOS's fat binaries support the "x86_64h" sub-architecture and the GNU libc
+// ELF loader also supports a "haswell/" subdir (e.g., /usr/lib/haswell).
+# define QT_FUNCTION_TARGET_STRING_ARCH_HASWELL "arch=haswell"
+# if defined(__AVX2__) && defined(__BMI__) && defined(__BMI2__) && defined(__F16C__) && \
+ defined(__FMA__) && defined(__LZCNT__) && defined(__RDRND__)
+# define __haswell__ 1
+# endif
+
+// This constant does not include all CPU features found in a Haswell, only
+// those that we'd have optimized code for.
+// Note: must use Q_CONSTEXPR here, as this file may be compiled in C mode.
+QT_BEGIN_NAMESPACE
+static const quint64 CpuFeatureArchHaswell = 0
+ | CpuFeatureSSE2
+ | CpuFeatureSSE3
+ | CpuFeatureSSSE3
+ | CpuFeatureSSE4_1
+ | CpuFeatureSSE4_2
+ | CpuFeatureFMA
+ | CpuFeaturePOPCNT
+ | CpuFeatureAVX
+ | CpuFeatureF16C
+ | CpuFeatureAVX2
+ | CpuFeatureBMI
+ | CpuFeatureBMI2;
+QT_END_NAMESPACE
+
+#endif /* Q_PROCESSOR_X86 */
+
+// Clang compiler fix, see http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20160222/151168.html
+// This should be tweaked with an "upper version" of clang once we know which release fixes the
+// issue. At that point we can rely on __ARM_FEATURE_CRC32 again.
+#if defined(Q_CC_CLANG) && defined(Q_OS_DARWIN) && defined (__ARM_FEATURE_CRC32)
+# undef __ARM_FEATURE_CRC32
+#endif
+
+// NEON intrinsics
+// note: as of GCC 4.9, does not support function targets for ARM
+#if defined(__ARM_NEON) || defined(__ARM_NEON__)
+#define QT_FUNCTION_TARGET_STRING_NEON "+neon" // unused: gcc doesn't support function targets on non-aarch64, and on Aarch64 NEON is always available.
+#ifndef __ARM_NEON__
+// __ARM_NEON__ is not defined on AArch64, but we need it in our NEON detection.
+#define __ARM_NEON__
+#endif
+#endif
+// AArch64/ARM64
+#if defined(Q_PROCESSOR_ARM_V8) && defined(__ARM_FEATURE_CRC32)
+#if defined(Q_PROCESSOR_ARM_64)
+// only available on aarch64
+#define QT_FUNCTION_TARGET_STRING_CRC32 "+crc"
+#endif
+# include <arm_acle.h>
+#endif
+
+#ifdef __cplusplus
+#include <qatomic.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef Q_PROCESSOR_X86
+enum CPUFeatures {
+#if defined(Q_PROCESSOR_ARM)
+ CpuFeatureNEON = 2,
+ CpuFeatureARM_NEON = CpuFeatureNEON,
+ CpuFeatureCRC32 = 4,
+#elif defined(Q_PROCESSOR_MIPS)
+ CpuFeatureDSP = 2,
+ CpuFeatureDSPR2 = 4,
+#endif
+
+ // used only to indicate that the CPU detection was initialised
+ QSimdInitialized = 1
+};
+
+static const quint64 qCompilerCpuFeatures = 0
+#if defined __ARM_NEON__
+ | CpuFeatureNEON
+#endif
+#if defined __ARM_FEATURE_CRC32
+ | CpuFeatureCRC32
+#endif
+#if defined __mips_dsp
+ | CpuFeatureDSP
+#endif
+#if defined __mips_dspr2
+ | CpuFeatureDSPR2
+#endif
+ ;
+#endif
+
+#ifdef Q_ATOMIC_INT64_IS_SUPPORTED
+extern Q_CORE_EXPORT QBasicAtomicInteger<quint64> qt_cpu_features[1];
+#else
+extern Q_CORE_EXPORT QBasicAtomicInteger<unsigned> qt_cpu_features[2];
+#endif
+Q_CORE_EXPORT quint64 qDetectCpuFeatures();
+
+#if defined(Q_PROCESSOR_X86) && QT_COMPILER_SUPPORTS_HERE(RDRND) && !defined(QT_BOOTSTRAPPED)
+Q_CORE_EXPORT qsizetype qRandomCpu(void *, qsizetype) noexcept;
+#else
+static inline qsizetype qRandomCpu(void *, qsizetype) noexcept
+{
+ return 0;
+}
+#endif
+
+static inline quint64 qCpuFeatures()
+{
+ quint64 features = qt_cpu_features[0].loadRelaxed();
+#ifndef Q_ATOMIC_INT64_IS_SUPPORTED
+ features |= quint64(qt_cpu_features[1].loadRelaxed()) << 32;
+#endif
+ if (Q_UNLIKELY(features == 0)) {
+ features = qDetectCpuFeatures();
+ Q_ASSUME(features != 0);
+ }
+ return features;
+}
+
+#define qCpuHasFeature(feature) (((qCompilerCpuFeatures & CpuFeature ## feature) == CpuFeature ## feature) \
+ || ((qCpuFeatures() & CpuFeature ## feature) == CpuFeature ## feature))
+
+inline bool qHasHwrng()
+{
+#if defined(Q_PROCESSOR_X86) && QT_COMPILER_SUPPORTS_HERE(RDRND)
+ return qCpuHasFeature(RDRND);
+#else
+ return false;
+#endif
+}
+
+#define ALIGNMENT_PROLOGUE_16BYTES(ptr, i, length) \
+ for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((4 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x3)) & 0x3))); ++i)
+
+#define ALIGNMENT_PROLOGUE_32BYTES(ptr, i, length) \
+ for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((8 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x7)) & 0x7))); ++i)
+
+QT_END_NAMESPACE
+
+#endif // __cplusplus
+
+#define SIMD_EPILOGUE(i, length, max) \
+ for (int _i = 0; _i < max && i < length; ++i, ++_i)
+
+#endif // QSIMD_P_H
diff --git a/src/corelib/global/qsimd_x86.cpp b/src/corelib/global/qsimd_x86.cpp
new file mode 100644
index 0000000000..be17f44c09
--- /dev/null
+++ b/src/corelib/global/qsimd_x86.cpp
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Intel Corporation.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This is a generated file. DO NOT EDIT.
+// Please see util/x86simdgen/generate.pl
+#include "qsimd_p.h"
+
+static const char features_string[] =
+ " sse2\0"
+ " sse3\0"
+ " ssse3\0"
+ " fma\0"
+ " sse4.1\0"
+ " sse4.2\0"
+ " movbe\0"
+ " popcnt\0"
+ " aes\0"
+ " avx\0"
+ " f16c\0"
+ " rdrnd\0"
+ " bmi\0"
+ " hle\0"
+ " avx2\0"
+ " bmi2\0"
+ " rtm\0"
+ " avx512f\0"
+ " avx512dq\0"
+ " rdseed\0"
+ " avx512ifma\0"
+ " avx512pf\0"
+ " avx512er\0"
+ " avx512cd\0"
+ " sha\0"
+ " avx512bw\0"
+ " avx512vl\0"
+ " avx512vbmi\0"
+ " avx512vbmi2\0"
+ " gfni\0"
+ " vaes\0"
+ " avx512vnni\0"
+ " avx512bitalg\0"
+ " avx512vpopcntdq\0"
+ " avx5124nniw\0"
+ " avx5124fmaps\0"
+ "\0";
+
+static const quint16 features_indices[] = {
+ 306, 0, 6, 12, 19, 24, 32, 40,
+ 47, 55, 60, 65, 71, 78, 83, 88,
+ 94, 100, 105, 114, 124, 132, 144, 154,
+ 164, 174, 179, 189, 199, 211, 224, 230,
+ 236, 248, 262, 279, 292
+};
+
+enum X86CpuidLeaves {
+ Leaf1ECX,
+ Leaf1EDX,
+ Leaf7_0EBX,
+ Leaf7_0ECX,
+ Leaf7_0EDX,
+ X86CpuidMaxLeaf
+};
+
+static const quint8 x86_locators[] = {
+ Leaf1EDX*32 + 26, // sse2
+ Leaf1ECX*32 + 0, // sse3
+ Leaf1ECX*32 + 9, // ssse3
+ Leaf1ECX*32 + 12, // fma
+ Leaf1ECX*32 + 19, // sse4.1
+ Leaf1ECX*32 + 20, // sse4.2
+ Leaf1ECX*32 + 22, // movbe
+ Leaf1ECX*32 + 23, // popcnt
+ Leaf1ECX*32 + 25, // aes
+ Leaf1ECX*32 + 28, // avx
+ Leaf1ECX*32 + 29, // f16c
+ Leaf1ECX*32 + 30, // rdrnd
+ Leaf7_0EBX*32 + 3, // bmi
+ Leaf7_0EBX*32 + 4, // hle
+ Leaf7_0EBX*32 + 5, // avx2
+ Leaf7_0EBX*32 + 8, // bmi2
+ Leaf7_0EBX*32 + 11, // rtm
+ Leaf7_0EBX*32 + 16, // avx512f
+ Leaf7_0EBX*32 + 17, // avx512dq
+ Leaf7_0EBX*32 + 18, // rdseed
+ Leaf7_0EBX*32 + 21, // avx512ifma
+ Leaf7_0EBX*32 + 26, // avx512pf
+ Leaf7_0EBX*32 + 27, // avx512er
+ Leaf7_0EBX*32 + 28, // avx512cd
+ Leaf7_0EBX*32 + 29, // sha
+ Leaf7_0EBX*32 + 30, // avx512bw
+ Leaf7_0EBX*32 + 31, // avx512vl
+ Leaf7_0ECX*32 + 1, // avx512vbmi
+ Leaf7_0ECX*32 + 6, // avx512vbmi2
+ Leaf7_0ECX*32 + 8, // gfni
+ Leaf7_0ECX*32 + 9, // vaes
+ Leaf7_0ECX*32 + 11, // avx512vnni
+ Leaf7_0ECX*32 + 12, // avx512bitalg
+ Leaf7_0ECX*32 + 14, // avx512vpopcntdq
+ Leaf7_0EDX*32 + 2, // avx5124nniw
+ Leaf7_0EDX*32 + 3 // avx5124fmaps
+};
+
+// List of AVX512 features (see detectProcessorFeatures())
+static const quint64 AllAVX512 = 0
+ | CpuFeatureAVX512F
+ | CpuFeatureAVX512DQ
+ | CpuFeatureAVX512IFMA
+ | CpuFeatureAVX512PF
+ | CpuFeatureAVX512ER
+ | CpuFeatureAVX512CD
+ | CpuFeatureAVX512BW
+ | CpuFeatureAVX512VL
+ | CpuFeatureAVX512VBMI
+ | CpuFeatureAVX512VBMI2
+ | CpuFeatureAVX512VNNI
+ | CpuFeatureAVX512BITALG
+ | CpuFeatureAVX512VPOPCNTDQ
+ | CpuFeatureAVX5124NNIW
+ | CpuFeatureAVX5124FMAPS;
diff --git a/src/corelib/global/qsimd_x86_p.h b/src/corelib/global/qsimd_x86_p.h
new file mode 100644
index 0000000000..82e3008a24
--- /dev/null
+++ b/src/corelib/global/qsimd_x86_p.h
@@ -0,0 +1,261 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Intel Corporation.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This is a generated file. DO NOT EDIT.
+// Please see util/x86simdgen/generate.pl
+#ifndef QSIMD_P_H
+# error "Please include <private/qsimd_p.h> instead"
+#endif
+#ifndef QSIMD_X86_P_H
+#define QSIMD_X86_P_H
+
+#include "qsimd_p.h"
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+// used only to indicate that the CPU detection was initialized
+#define QSimdInitialized (Q_UINT64_C(1) << 0)
+
+// in CPUID Leaf 1, EDX:
+#define CpuFeatureSSE2 (Q_UINT64_C(1) << 1)
+#define QT_FUNCTION_TARGET_STRING_SSE2 "sse2"
+
+// in CPUID Leaf 1, ECX:
+#define CpuFeatureSSE3 (Q_UINT64_C(1) << 2)
+#define QT_FUNCTION_TARGET_STRING_SSE3 "sse3"
+#define CpuFeatureSSSE3 (Q_UINT64_C(1) << 3)
+#define QT_FUNCTION_TARGET_STRING_SSSE3 "ssse3"
+#define CpuFeatureFMA (Q_UINT64_C(1) << 4)
+#define QT_FUNCTION_TARGET_STRING_FMA "fma"
+#define CpuFeatureSSE4_1 (Q_UINT64_C(1) << 5)
+#define QT_FUNCTION_TARGET_STRING_SSE4_1 "sse4.1"
+#define CpuFeatureSSE4_2 (Q_UINT64_C(1) << 6)
+#define QT_FUNCTION_TARGET_STRING_SSE4_2 "sse4.2"
+#define CpuFeatureMOVBE (Q_UINT64_C(1) << 7)
+#define QT_FUNCTION_TARGET_STRING_MOVBE "movbe"
+#define CpuFeaturePOPCNT (Q_UINT64_C(1) << 8)
+#define QT_FUNCTION_TARGET_STRING_POPCNT "popcnt"
+#define CpuFeatureAES (Q_UINT64_C(1) << 9)
+#define QT_FUNCTION_TARGET_STRING_AES "aes,sse4.2"
+#define CpuFeatureAVX (Q_UINT64_C(1) << 10)
+#define QT_FUNCTION_TARGET_STRING_AVX "avx"
+#define CpuFeatureF16C (Q_UINT64_C(1) << 11)
+#define QT_FUNCTION_TARGET_STRING_F16C "f16c"
+#define CpuFeatureRDRND (Q_UINT64_C(1) << 12)
+#define QT_FUNCTION_TARGET_STRING_RDRND "rdrnd"
+
+// in CPUID Leaf 7, Sub-leaf 0, EBX:
+#define CpuFeatureBMI (Q_UINT64_C(1) << 13)
+#define QT_FUNCTION_TARGET_STRING_BMI "bmi"
+#define CpuFeatureHLE (Q_UINT64_C(1) << 14)
+#define QT_FUNCTION_TARGET_STRING_HLE "hle"
+#define CpuFeatureAVX2 (Q_UINT64_C(1) << 15)
+#define QT_FUNCTION_TARGET_STRING_AVX2 "avx2"
+#define CpuFeatureBMI2 (Q_UINT64_C(1) << 16)
+#define QT_FUNCTION_TARGET_STRING_BMI2 "bmi2"
+#define CpuFeatureRTM (Q_UINT64_C(1) << 17)
+#define QT_FUNCTION_TARGET_STRING_RTM "rtm"
+#define CpuFeatureAVX512F (Q_UINT64_C(1) << 18)
+#define QT_FUNCTION_TARGET_STRING_AVX512F "avx512f"
+#define CpuFeatureAVX512DQ (Q_UINT64_C(1) << 19)
+#define QT_FUNCTION_TARGET_STRING_AVX512DQ "avx512dq"
+#define CpuFeatureRDSEED (Q_UINT64_C(1) << 20)
+#define QT_FUNCTION_TARGET_STRING_RDSEED "rdseed"
+#define CpuFeatureAVX512IFMA (Q_UINT64_C(1) << 21)
+#define QT_FUNCTION_TARGET_STRING_AVX512IFMA "avx512ifma"
+#define CpuFeatureAVX512PF (Q_UINT64_C(1) << 22)
+#define QT_FUNCTION_TARGET_STRING_AVX512PF "avx512pf"
+#define CpuFeatureAVX512ER (Q_UINT64_C(1) << 23)
+#define QT_FUNCTION_TARGET_STRING_AVX512ER "avx512er"
+#define CpuFeatureAVX512CD (Q_UINT64_C(1) << 24)
+#define QT_FUNCTION_TARGET_STRING_AVX512CD "avx512cd"
+#define CpuFeatureSHA (Q_UINT64_C(1) << 25)
+#define QT_FUNCTION_TARGET_STRING_SHA "sha"
+#define CpuFeatureAVX512BW (Q_UINT64_C(1) << 26)
+#define QT_FUNCTION_TARGET_STRING_AVX512BW "avx512bw"
+#define CpuFeatureAVX512VL (Q_UINT64_C(1) << 27)
+#define QT_FUNCTION_TARGET_STRING_AVX512VL "avx512vl"
+
+// in CPUID Leaf 7, Sub-leaf 0, ECX:
+#define CpuFeatureAVX512VBMI (Q_UINT64_C(1) << 28)
+#define QT_FUNCTION_TARGET_STRING_AVX512VBMI "avx512vbmi"
+#define CpuFeatureAVX512VBMI2 (Q_UINT64_C(1) << 29)
+#define QT_FUNCTION_TARGET_STRING_AVX512VBMI2 "avx512vbmi2"
+#define CpuFeatureGFNI (Q_UINT64_C(1) << 30)
+#define QT_FUNCTION_TARGET_STRING_GFNI "gfni"
+#define CpuFeatureVAES (Q_UINT64_C(1) << 31)
+#define QT_FUNCTION_TARGET_STRING_VAES "vaes"
+#define CpuFeatureAVX512VNNI (Q_UINT64_C(1) << 32)
+#define QT_FUNCTION_TARGET_STRING_AVX512VNNI "avx512vnni"
+#define CpuFeatureAVX512BITALG (Q_UINT64_C(1) << 33)
+#define QT_FUNCTION_TARGET_STRING_AVX512BITALG "avx512bitalg"
+#define CpuFeatureAVX512VPOPCNTDQ (Q_UINT64_C(1) << 34)
+#define QT_FUNCTION_TARGET_STRING_AVX512VPOPCNTDQ "avx512vpopcntdq"
+
+// in CPUID Leaf 7, Sub-leaf 0, EDX:
+#define CpuFeatureAVX5124NNIW (Q_UINT64_C(1) << 35)
+#define QT_FUNCTION_TARGET_STRING_AVX5124NNIW "avx5124nniw"
+#define CpuFeatureAVX5124FMAPS (Q_UINT64_C(1) << 36)
+#define QT_FUNCTION_TARGET_STRING_AVX5124FMAPS "avx5124fmaps"
+
+static const quint64 qCompilerCpuFeatures = 0
+#ifdef __SSE2__
+ | CpuFeatureSSE2
+#endif
+#ifdef __SSE3__
+ | CpuFeatureSSE3
+#endif
+#ifdef __SSSE3__
+ | CpuFeatureSSSE3
+#endif
+#ifdef __FMA__
+ | CpuFeatureFMA
+#endif
+#ifdef __SSE4_1__
+ | CpuFeatureSSE4_1
+#endif
+#ifdef __SSE4_2__
+ | CpuFeatureSSE4_2
+#endif
+#ifdef __MOVBE__
+ | CpuFeatureMOVBE
+#endif
+#ifdef __POPCNT__
+ | CpuFeaturePOPCNT
+#endif
+#ifdef __AES__
+ | CpuFeatureAES
+#endif
+#ifdef __AVX__
+ | CpuFeatureAVX
+#endif
+#ifdef __F16C__
+ | CpuFeatureF16C
+#endif
+#ifdef __RDRND__
+ | CpuFeatureRDRND
+#endif
+#ifdef __BMI__
+ | CpuFeatureBMI
+#endif
+#ifdef __HLE__
+ | CpuFeatureHLE
+#endif
+#ifdef __AVX2__
+ | CpuFeatureAVX2
+#endif
+#ifdef __BMI2__
+ | CpuFeatureBMI2
+#endif
+#ifdef __RTM__
+ | CpuFeatureRTM
+#endif
+#ifdef __AVX512F__
+ | CpuFeatureAVX512F
+#endif
+#ifdef __AVX512DQ__
+ | CpuFeatureAVX512DQ
+#endif
+#ifdef __RDSEED__
+ | CpuFeatureRDSEED
+#endif
+#ifdef __AVX512IFMA__
+ | CpuFeatureAVX512IFMA
+#endif
+#ifdef __AVX512PF__
+ | CpuFeatureAVX512PF
+#endif
+#ifdef __AVX512ER__
+ | CpuFeatureAVX512ER
+#endif
+#ifdef __AVX512CD__
+ | CpuFeatureAVX512CD
+#endif
+#ifdef __SHA__
+ | CpuFeatureSHA
+#endif
+#ifdef __AVX512BW__
+ | CpuFeatureAVX512BW
+#endif
+#ifdef __AVX512VL__
+ | CpuFeatureAVX512VL
+#endif
+#ifdef __AVX512VBMI__
+ | CpuFeatureAVX512VBMI
+#endif
+#ifdef __AVX512VBMI2__
+ | CpuFeatureAVX512VBMI2
+#endif
+#ifdef __GFNI__
+ | CpuFeatureGFNI
+#endif
+#ifdef __VAES__
+ | CpuFeatureVAES
+#endif
+#ifdef __AVX512VNNI__
+ | CpuFeatureAVX512VNNI
+#endif
+#ifdef __AVX512BITALG__
+ | CpuFeatureAVX512BITALG
+#endif
+#ifdef __AVX512VPOPCNTDQ__
+ | CpuFeatureAVX512VPOPCNTDQ
+#endif
+#ifdef __AVX5124NNIW__
+ | CpuFeatureAVX5124NNIW
+#endif
+#ifdef __AVX5124FMAPS__
+ | CpuFeatureAVX5124FMAPS
+#endif
+ ;
+
+QT_END_NAMESPACE
+
+#endif // QSIMD_X86_P_H
diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h
index 30be47296e..34cf1de4f5 100644
--- a/src/corelib/global/qtypeinfo.h
+++ b/src/corelib/global/qtypeinfo.h
@@ -209,7 +209,6 @@ public: \
}; \
}
-Q_DECLARE_MOVABLE_CONTAINER(QList);
Q_DECLARE_MOVABLE_CONTAINER(QVector);
Q_DECLARE_MOVABLE_CONTAINER(QQueue);
Q_DECLARE_MOVABLE_CONTAINER(QStack);
diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri
index a33ffe75f2..97b7f3970c 100644
--- a/src/corelib/io/io.pri
+++ b/src/corelib/io/io.pri
@@ -32,8 +32,6 @@ HEADERS += \
io/qurl.h \
io/qurl_p.h \
io/qurlquery.h \
- io/qurltlds_p.h \
- io/qtldurl_p.h \
io/qfsfileengine_p.h \
io/qfsfileengine_iterator_p.h \
io/qfilesystementry_p.h \
@@ -49,7 +47,6 @@ SOURCES += \
io/qabstractfileengine.cpp \
io/qbuffer.cpp \
io/qdataurl.cpp \
- io/qtldurl.cpp \
io/qdebug.cpp \
io/qdir.cpp \
io/qdiriterator.cpp \
@@ -173,7 +170,7 @@ win32 {
io/qlockfile_unix.cpp \
io/qfilesystemiterator_unix.cpp
- !integrity:!uikit:!rtems {
+ qtConfig(process) {
SOURCES += io/forkfd_qt.cpp
HEADERS += \
../3rdparty/forkfd/forkfd.h
diff --git a/src/corelib/io/qdebug.cpp b/src/corelib/io/qdebug.cpp
index d13e94e096..11f2b9f3c9 100644
--- a/src/corelib/io/qdebug.cpp
+++ b/src/corelib/io/qdebug.cpp
@@ -714,6 +714,20 @@ QDebug &QDebug::resetFormat()
*/
/*!
+ \fn template <class T> QString QDebug::toString(const T &object)
+ \since 6.0
+
+ \include qdebug-toString.qdocinc
+*/
+
+/*!
+ \fn template <class T> QString QDebug::toString(const T *object)
+ \since 6.0
+
+ \include qdebug-toString.qdocinc
+*/
+
+/*!
\fn template <class T> QDebug operator<<(QDebug debug, const QList<T> &list)
\relates QDebug
diff --git a/src/corelib/io/qdebug.h b/src/corelib/io/qdebug.h
index 421c5d933b..aa69a1ae23 100644
--- a/src/corelib/io/qdebug.h
+++ b/src/corelib/io/qdebug.h
@@ -111,10 +111,10 @@ class Q_CORE_EXPORT QDebug
void putString(const QChar *begin, size_t length);
void putByteArray(const char *begin, size_t length, Latin1Content content);
public:
- inline QDebug(QIODevice *device) : stream(new Stream(device)) {}
- inline QDebug(QString *string) : stream(new Stream(string)) {}
- inline QDebug(QtMsgType t) : stream(new Stream(t)) {}
- inline QDebug(const QDebug &o):stream(o.stream) { ++stream->ref; }
+ explicit QDebug(QIODevice *device) : stream(new Stream(device)) {}
+ explicit QDebug(QString *string) : stream(new Stream(string)) {}
+ explicit QDebug(QtMsgType t) : stream(new Stream(t)) {}
+ QDebug(const QDebug &o) : stream(o.stream) { ++stream->ref; }
QDebug(QDebug &&other) noexcept : stream{qExchange(other.stream, nullptr)} {}
inline QDebug &operator=(const QDebug &other);
QDebug &operator=(QDebug &&other) noexcept
@@ -173,6 +173,24 @@ public:
inline QDebug &operator<<(QTextStreamManipulator m)
{ stream->ts << m; return *this; }
+
+ template <typename T>
+ static QString toString(const T &object)
+ {
+ QString buffer;
+ QDebug stream(&buffer);
+ stream.nospace() << object;
+ return buffer;
+ }
+
+ template <typename T>
+ static QString toString(const T *object)
+ {
+ QString buffer;
+ QDebug stream(&buffer);
+ stream.nospace() << object;
+ return buffer;
+ }
};
Q_DECLARE_SHARED(QDebug)
@@ -234,12 +252,6 @@ inline QDebug printSequentialContainer(QDebug debug, const char *which, const Se
} // namespace QtPrivate
-template <class T>
-inline QDebug operator<<(QDebug debug, const QList<T> &list)
-{
- return QtPrivate::printSequentialContainer(debug, "" /*for historical reasons*/, list);
-}
-
template <typename T>
inline QDebug operator<<(QDebug debug, const QVector<T> &vec)
{
@@ -344,6 +356,16 @@ inline QDebug operator<<(QDebug debug, const QSharedPointer<T> &ptr)
return debug;
}
+template <typename T, typename Tag> class QTaggedPointer;
+
+template <typename T, typename Tag>
+inline QDebug operator<<(QDebug debug, const QTaggedPointer<T, Tag> &ptr)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "QTaggedPointer(" << ptr.pointer() << ", " << ptr.tag() << ")";
+ return debug;
+}
+
Q_CORE_EXPORT void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, int value);
template <typename Int>
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp
index 5ce3fbcca8..fa559a22bb 100644
--- a/src/corelib/io/qdir.cpp
+++ b/src/corelib/io/qdir.cpp
@@ -585,8 +585,8 @@ QDir::QDir(const QString &path) : d_ptr(new QDirPrivate(path))
also sorts the names using \a sort.
The default \a nameFilter is an empty string, which excludes
- nothing; the default \a filters is \l AllEntries, which also means
- exclude nothing. The default \a sort is \l Name | \l IgnoreCase,
+ nothing; the default \a filters is \l AllEntries, which also
+ excludes nothing. The default \a sort is \l Name | \l IgnoreCase,
i.e. sort by name case-insensitively.
If \a path is an empty string, QDir uses "." (the current
@@ -2150,7 +2150,6 @@ bool QDir::match(const QStringList &filters, const QString &fileName)
{
for (QStringList::ConstIterator sit = filters.constBegin(); sit != filters.constEnd(); ++sit) {
// Insensitive exact match
- // (see Notes for QRegExp Users in QRegularExpression's documentation)
QRegularExpression rx(QRegularExpression::wildcardToRegularExpression(*sit),
QRegularExpression::CaseInsensitiveOption);
if (rx.match(fileName).hasMatch())
@@ -2551,4 +2550,65 @@ QDebug operator<<(QDebug debug, const QDir &dir)
}
#endif // QT_NO_DEBUG_STREAM
+/*!
+ \fn QDir::QDir(const std::filesystem::path &path)
+ \since 6.0
+ Constructs a QDir pointing to the given directory \a path. If path
+ is empty the program's working directory, ("."), is used.
+
+ \sa currentPath()
+*/
+/*!
+ \fn QDir::QDir(const std::filesystem::path &path,
+ const QString &nameFilter,
+ SortFlags sort,
+ Filters filters)
+ \since 6.0
+
+ Constructs a QDir with path \a path, that filters its entries by
+ name using \a nameFilter and by attributes using \a filters. It
+ also sorts the names using \a sort.
+
+ The default \a nameFilter is an empty string, which excludes
+ nothing; the default \a filters is \l AllEntries, which also
+ excludes nothing. The default \a sort is \l Name | \l IgnoreCase,
+ i.e. sort by name case-insensitively.
+
+ If \a path is empty, QDir uses "." (the current
+ directory). If \a nameFilter is an empty string, QDir uses the
+ name filter "*" (all files).
+
+ Note that \a path need not exist.
+
+ \sa exists(), setPath(), setNameFilters(), setFilter(), setSorting()
+*/
+/*!
+ \fn void QDir::setPath(const std::filesystem::path &path)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn void QDir::addSearchPath(const QString &prefix, const std::filesystem::path &path)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn std::filesystem::path QDir::filesystemPath() const
+ \since 6.0
+ Returns path() as \c{std::filesystem::path}.
+ \sa path()
+*/
+/*!
+ \fn std::filesystem::path QDir::filesystemAbsolutePath() const
+ \since 6.0
+ Returns absolutePath() as \c{std::filesystem::path}.
+ \sa absolutePath()
+*/
+/*!
+ \fn std::filesystem::path QDir::filesystemCanonicalPath() const
+ \since 6.0
+ Returns canonicalPath() as \c{std::filesystem::path}.
+ \sa canonicalPath()
+*/
+
QT_END_NAMESPACE
diff --git a/src/corelib/io/qdir.h b/src/corelib/io/qdir.h
index 45a40995f8..f0dda73ebb 100644
--- a/src/corelib/io/qdir.h
+++ b/src/corelib/io/qdir.h
@@ -41,13 +41,13 @@
#define QDIR_H
#include <QtCore/qstring.h>
+#include <QtCore/qfile.h>
#include <QtCore/qfileinfo.h>
#include <QtCore/qstringlist.h>
#include <QtCore/qshareddata.h>
QT_BEGIN_NAMESPACE
-
class QDirIterator;
class QDirPrivate;
@@ -102,6 +102,22 @@ public:
QDir(const QString &path = QString());
QDir(const QString &path, const QString &nameFilter,
SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries);
+#ifdef Q_CLANG_QDOC
+ QDir(const std::filesystem::path &path);
+ QDir(const std::filesystem::path &path, const QString &nameFilter,
+ SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QDir(const T &path) : QDir(QtPrivate::fromFilesystemPath(path))
+ {
+ }
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QDir(const T &path, const QString &nameFilter,
+ SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries)
+ : QDir(QtPrivate::fromFilesystemPath(path), nameFilter, sort, filter)
+ {
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
~QDir();
QDir &operator=(const QDir &);
@@ -115,9 +131,26 @@ public:
{ qSwap(d_ptr, other.d_ptr); }
void setPath(const QString &path);
+#ifdef Q_CLANG_QDOC
+ void setPath(const std::filesystem::path &path);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ void setPath(const T &path)
+ {
+ setPath(QtPrivate::fromFilesystemPath(path));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
QString path() const;
QString absolutePath() const;
QString canonicalPath() const;
+#if QT_CONFIG(cxx17_filesystem)
+ std::filesystem::path filesystemPath() const
+ { return QtPrivate::toFilesystemPath(path()); }
+ std::filesystem::path filesystemAbsolutePath() const
+ { return QtPrivate::toFilesystemPath(absolutePath()); }
+ std::filesystem::path filesystemCanonicalPath() const
+ { return QtPrivate::toFilesystemPath(canonicalPath()); }
+#endif // QT_CONFIG(cxx17_filesystem)
#if QT_DEPRECATED_SINCE(5, 13)
QT_DEPRECATED_X("Use QDir::addSearchPath() instead")
@@ -126,6 +159,15 @@ public:
static void setSearchPaths(const QString &prefix, const QStringList &searchPaths);
static void addSearchPath(const QString &prefix, const QString &path);
+#ifdef Q_CLANG_QDOC
+ static void addSearchPath(const QString &prefix, const std::filesystem::path &path);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ static void addSearchPath(const QString &prefix, const T &path)
+ {
+ addSearchPath(prefix, QtPrivate::fromFilesystemPath(path));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
static QStringList searchPaths(const QString &prefix);
QString dirName() const;
diff --git a/src/corelib/io/qdiriterator.cpp b/src/corelib/io/qdiriterator.cpp
index 1cf6b1be08..bd4f1fd583 100644
--- a/src/corelib/io/qdiriterator.cpp
+++ b/src/corelib/io/qdiriterator.cpp
@@ -93,7 +93,9 @@
#include "qdir_p.h"
#include "qabstractfileengine_p.h"
+#ifdef QT_BOOTSTRAPPED
#include <QtCore/qregexp.h>
+#endif
#include <QtCore/qset.h>
#include <QtCore/qstack.h>
#include <QtCore/qvariant.h>
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 0cdc5bd6d3..2a9c24bbd5 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -1210,6 +1210,56 @@ qint64 QFile::size() const
return QFileDevice::size(); // for now
}
+/*!
+ \fn QFile::QFile(const std::filesystem::path &name)
+ \since 6.0
+
+ Constructs a new file object to represent the file with the given \a name.
+*/
+/*!
+ \fn QFile::QFile(const std::filesystem::path &name, QObject *parent)
+ \since 6.0
+
+ Constructs a new file object with the given \a parent to represent the
+ file with the specified \a name.
+*/
+/*!
+ \fn std::filesystem::path QFile::filesystemFileName() const
+ \since 6.0
+ Returns fileName() as \c{std::filesystem::path}.
+*/
+/*!
+ \fn void QFile::setFileName(const std::filesystem::path &name)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn bool QFile::rename(const std::filesystem::path &newName)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn bool QFile::link(const std::filesystem::path &newName)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn bool QFile::copy(const std::filesystem::path &newName)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn QFile::Permissions QFile::permissions(const std::filesystem::path &filename)
+ \since 6.0
+ \overload
+*/
+/*!
+ \fn bool QFile::setPermissions(const std::filesystem::path &filename, Permissions permissionSpec)
+ \since 6.0
+ \overload
+*/
+
+
QT_END_NAMESPACE
#ifndef QT_NO_QOBJECT
diff --git a/src/corelib/io/qfile.h b/src/corelib/io/qfile.h
index 917fec4e1a..dab20b85a1 100644
--- a/src/corelib/io/qfile.h
+++ b/src/corelib/io/qfile.h
@@ -45,12 +45,44 @@
#include <QtCore/qstring.h>
#include <stdio.h>
+#if QT_CONFIG(cxx17_filesystem)
+#include <filesystem>
+#endif
+
#ifdef open
#error qfile.h must be included before any header file that defines open
#endif
QT_BEGIN_NAMESPACE
+#if QT_CONFIG(cxx17_filesystem)
+namespace QtPrivate {
+inline QString fromFilesystemPath(const std::filesystem::path &path)
+{
+#ifdef Q_OS_WIN
+ return QString::fromStdWString(path.native());
+#else
+ return QString::fromStdString(path.native());
+#endif
+}
+
+inline std::filesystem::path toFilesystemPath(const QString &path)
+{
+#ifdef Q_OS_WIN
+ return std::filesystem::path(path.toStdU16String());
+#else
+ return std::filesystem::path(path.toStdString());
+#endif
+}
+
+// Both std::filesystem::path and QString (without QT_NO_CAST_FROM_ASCII) can be implicitly
+// constructed from string literals so we force the std::fs::path parameter to only
+// accept std::fs::path with no implicit conversions.
+template<typename T>
+using ForceFilesystemPath = typename std::enable_if_t<std::is_same_v<std::filesystem::path, T>, int>;
+}
+#endif // QT_CONFIG(cxx17_filesystem)
+
class QTemporaryFile;
class QFilePrivate;
@@ -64,14 +96,45 @@ class Q_CORE_EXPORT QFile : public QFileDevice
public:
QFile();
QFile(const QString &name);
+#ifdef Q_CLANG_QDOC
+ QFile(const std::filesystem::path &name);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QFile(const T &name) : QFile(QtPrivate::fromFilesystemPath(name))
+ {
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
+
#ifndef QT_NO_QOBJECT
explicit QFile(QObject *parent);
QFile(const QString &name, QObject *parent);
-#endif
+
+#ifdef Q_CLANG_QDOC
+ QFile(const std::filesystem::path &path, QObject *parent);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QFile(const T &path, QObject *parent) : QFile(QtPrivate::fromFilesystemPath(path), parent)
+ {
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
+#endif // !QT_NO_QOBJECT
~QFile();
QString fileName() const override;
+#if QT_CONFIG(cxx17_filesystem)
+ std::filesystem::path filesystemFileName() const
+ { return QtPrivate::toFilesystemPath(fileName()); }
+#endif
void setFileName(const QString &name);
+#ifdef Q_CLANG_QDOC
+ void setFileName(const std::filesystem::path &name);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ void setFileName(const T &name)
+ {
+ setFileName(QtPrivate::fromFilesystemPath(name));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
#if defined(Q_OS_DARWIN)
// Mac always expects filenames in UTF-8... and decomposed...
@@ -129,12 +192,39 @@ public:
static bool moveToTrash(const QString &fileName, QString *pathInTrash = nullptr);
bool rename(const QString &newName);
+#ifdef Q_CLANG_QDOC
+ bool rename(const std::filesystem::path &newName);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ bool rename(const T &newName)
+ {
+ return rename(QtPrivate::fromFilesystemPath(newName));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
static bool rename(const QString &oldName, const QString &newName);
bool link(const QString &newName);
+#ifdef Q_CLANG_QDOC
+ bool link(const std::filesystem::path &newName);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ bool link(const T &newName)
+ {
+ return link(QtPrivate::fromFilesystemPath(newName));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
static bool link(const QString &oldname, const QString &newName);
bool copy(const QString &newName);
+#ifdef Q_CLANG_QDOC
+ bool copy(const std::filesystem::path &newName);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ bool copy(const T &newName)
+ {
+ return copy(QtPrivate::fromFilesystemPath(newName));
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
static bool copy(const QString &fileName, const QString &newName);
bool open(OpenMode flags) override;
@@ -150,6 +240,21 @@ public:
static Permissions permissions(const QString &filename);
bool setPermissions(Permissions permissionSpec) override;
static bool setPermissions(const QString &filename, Permissions permissionSpec);
+#ifdef Q_CLANG_QDOC
+ static Permissions permissions(const std::filesystem::path &filename);
+ static bool setPermissions(const std::filesystem::path &filename, Permissions permissionSpec);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ static Permissions permissions(const T &filename)
+ {
+ return permissions(QtPrivate::fromFilesystemPath(filename));
+ }
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ static bool setPermissions(const T &filename, Permissions permissionSpec)
+ {
+ return setPermissions(QtPrivate::fromFilesystemPath(filename), permissionSpec);
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
protected:
#ifdef QT_NO_QOBJECT
diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp
index 84bca6e993..824215d1d9 100644
--- a/src/corelib/io/qfileinfo.cpp
+++ b/src/corelib/io/qfileinfo.cpp
@@ -363,7 +363,7 @@ QFileInfo::QFileInfo(const QFile &file) : d_ptr(new QFileInfoPrivate(file.fileNa
/*!
Constructs a new QFileInfo that gives information about the given
- \a file in the directory \a dir.
+ \a file relative to the directory \a dir.
If \a dir has a relative path, the QFileInfo will also have a
relative path.
@@ -1576,4 +1576,83 @@ QDebug operator<<(QDebug dbg, const QFileInfo &fi)
}
#endif
+/*!
+ \fn QFileInfo::QFileInfo(const std::filesystem::path &file)
+ \since 6.0
+
+ Constructs a new QFileInfo that gives information about the given
+ \a file.
+
+ \sa setFile(), isRelative(), QDir::setCurrent(), QDir::isRelativePath()
+*/
+/*!
+ \fn QFileInfo::QFileInfo(const QDir &dir, const std::filesystem::path &file)
+ \since 6.0
+
+ Constructs a new QFileInfo that gives information about the given
+ \a file relative to the directory \a dir.
+
+ If \a dir has a relative path, the QFileInfo will also have a
+ relative path.
+
+ If \a file is an absolute path, then the directory specified
+ by \a dir will be disregarded.
+*/
+/*!
+ \fn void QFileInfo::setFile(const std::filesystem::path &file)
+ \since 6.0
+
+ Sets the file that the QFileInfo provides information about to \a
+ file.
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemFilePath() const
+ \since 6.0
+
+ Returns filePath() as a \c{std::filesystem::path}.
+ \sa filePath()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemAbsoluteFilePath() const
+ \since 6.0
+
+ Returns absoluteFilePath() as a \c{std::filesystem::path}.
+ \sa absoluteFilePath()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemCanonicalFilePath() const
+ \since 6.0
+
+ Returns canonicalFilePath() as a \c{std::filesystem::path}.
+ \sa canonicalFilePath()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemPath() const
+ \since 6.0
+
+ Returns path() as a \c{std::filesystem::path}.
+ \sa path()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemAbsolutePath() const
+ \since 6.0
+
+ Returns absolutePath() as a \c{std::filesystem::path}.
+ \sa absolutePath()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemCanonicalPath() const
+ \since 6.0
+
+ Returns canonicalPath() as a \c{std::filesystem::path}.
+ \sa canonicalPath()
+*/
+/*!
+ \fn std::filesystem::path QFileInfo::filesystemSymLinkTarget() const
+ \since 6.0
+
+ Returns symLinkTarget() as a \c{std::filesystem::path}.
+ \sa symLinkTarget()
+*/
+
QT_END_NAMESPACE
diff --git a/src/corelib/io/qfileinfo.h b/src/corelib/io/qfileinfo.h
index 7c7ff56ae4..2bed64eb1a 100644
--- a/src/corelib/io/qfileinfo.h
+++ b/src/corelib/io/qfileinfo.h
@@ -64,6 +64,18 @@ public:
QFileInfo(const QFile &file);
QFileInfo(const QDir &dir, const QString &file);
QFileInfo(const QFileInfo &fileinfo);
+#ifdef Q_CLANG_QDOC
+ QFileInfo(const std::filesystem::path &file);
+ QFileInfo(const QDir &dir, const std::filesystem::path &file);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QFileInfo(const T &file) : QFileInfo(QtPrivate::fromFilesystemPath(file)) { }
+
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ QFileInfo(const QDir &dir, const T &file) : QFileInfo(dir, QtPrivate::fromFilesystemPath(file))
+ {
+ }
+#endif // QT_CONFIG(cxx17_filesystem)
~QFileInfo();
QFileInfo &operator=(const QFileInfo &fileinfo);
@@ -78,6 +90,13 @@ public:
void setFile(const QString &file);
void setFile(const QFile &file);
void setFile(const QDir &dir, const QString &file);
+#ifdef Q_CLANG_QDOC
+ void setFile(const std::filesystem::path &file);
+#elif QT_CONFIG(cxx17_filesystem)
+ template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
+ void setFile(const T &file) { setFile(QtPrivate::fromFilesystemPath(file)); }
+#endif // QT_CONFIG(cxx17_filesystem)
+
bool exists() const;
static bool exists(const QString &file);
void refresh();
@@ -85,6 +104,14 @@ public:
QString filePath() const;
QString absoluteFilePath() const;
QString canonicalFilePath() const;
+#if QT_CONFIG(cxx17_filesystem)
+ std::filesystem::path filesystemFilePath() const
+ { return QtPrivate::toFilesystemPath(filePath()); }
+ std::filesystem::path filesystemAbsoluteFilePath() const
+ { return QtPrivate::toFilesystemPath(absoluteFilePath()); }
+ std::filesystem::path filesystemCanonicalFilePath() const
+ { return QtPrivate::toFilesystemPath(canonicalFilePath()); }
+#endif // QT_CONFIG(cxx17_filesystem)
QString fileName() const;
QString baseName() const;
QString completeBaseName() const;
@@ -95,6 +122,13 @@ public:
QString path() const;
QString absolutePath() const;
QString canonicalPath() const;
+#if QT_CONFIG(cxx17_filesystem)
+ std::filesystem::path filesystemPath() const { return QtPrivate::toFilesystemPath(path()); }
+ std::filesystem::path filesystemAbsolutePath() const
+ { return QtPrivate::toFilesystemPath(absolutePath()); }
+ std::filesystem::path filesystemCanonicalPath() const
+ { return QtPrivate::toFilesystemPath(canonicalPath()); }
+#endif // QT_CONFIG(cxx17_filesystem)
QDir dir() const;
QDir absoluteDir() const;
@@ -122,6 +156,10 @@ public:
QString readLink() const;
#endif
QString symLinkTarget() const;
+#if QT_CONFIG(cxx17_filesystem)
+ std::filesystem::path filesystemSymLinkTarget() const
+ { return QtPrivate::toFilesystemPath(symLinkTarget()); }
+#endif // QT_CONFIG(cxx17_filesystem)
QString owner() const;
uint ownerId() const;
diff --git a/src/corelib/io/qfileselector.cpp b/src/corelib/io/qfileselector.cpp
index ee378f6434..0c42a98b37 100644
--- a/src/corelib/io/qfileselector.cpp
+++ b/src/corelib/io/qfileselector.cpp
@@ -342,7 +342,6 @@ void QFileSelectorPrivate::updateSelectors()
QStringList QFileSelectorPrivate::platformSelectors()
{
// similar, but not identical to QSysInfo::osType
- // ### Qt6: remove macOS fallbacks to "mac" and the future compatibility
QStringList ret;
#if defined(Q_OS_WIN)
ret << QStringLiteral("windows");
@@ -355,16 +354,10 @@ QStringList QFileSelectorPrivate::platformSelectors()
# if !defined(Q_OS_ANDROID) && !defined(Q_OS_QNX)
// we don't want "linux" for Android or two instances of "qnx" for QNX
ret << QSysInfo::kernelType();
-# ifdef Q_OS_MAC
- ret << QStringLiteral("mac"); // compatibility, since kernelType() is "darwin"
-# endif
# endif
QString productName = QSysInfo::productType();
if (productName != QLatin1String("unknown"))
ret << productName; // "opensuse", "fedora", "osx", "ios", "android"
-# if defined(Q_OS_MACOS)
- ret << QStringLiteral("macos"); // future compatibility
-# endif
#endif
return ret;
}
diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp
index 6ad123f3b6..75ad5d3cc5 100644
--- a/src/corelib/io/qfilesystemengine_win.cpp
+++ b/src/corelib/io/qfilesystemengine_win.cpp
@@ -53,6 +53,9 @@
#include "qdatetime.h"
#include "qt_windows.h"
#include "qvector.h"
+#if QT_CONFIG(regularexpression)
+#include "qregularexpression.h"
+#endif
#include <sys/types.h>
#include <direct.h>
@@ -329,15 +332,17 @@ static QString readSymLink(const QFileSystemEntry &link)
free(rdb);
CloseHandle(handle);
-#if QT_CONFIG(fslibs)
+#if QT_CONFIG(fslibs) && QT_CONFIG(regularexpression)
initGlobalSid();
- QRegExp matchVolName(QLatin1String("^Volume\\{([a-z]|[0-9]|-)+\\}\\\\"), Qt::CaseInsensitive);
- if (matchVolName.indexIn(result) == 0) {
+ QRegularExpression matchVolumeRe(QLatin1String("^Volume\\{([a-z]|[0-9]|-)+\\}\\\\"), QRegularExpression::CaseInsensitiveOption);
+ auto matchVolume = matchVolumeRe.match(result);
+ if (matchVolume.hasMatch()) {
+ Q_ASSERT(matchVolume.capturedStart() == 0);
DWORD len;
wchar_t buffer[MAX_PATH];
- const QString volumeName = QLatin1String("\\\\?\\") + result.leftRef(matchVolName.matchedLength());
+ const QString volumeName = QLatin1String("\\\\?\\") + matchVolume.captured();
if (GetVolumePathNamesForVolumeName(reinterpret_cast<LPCWSTR>(volumeName.utf16()), buffer, MAX_PATH, &len) != 0)
- result.replace(0,matchVolName.matchedLength(), QString::fromWCharArray(buffer));
+ result.replace(0, matchVolume.capturedLength(), QString::fromWCharArray(buffer));
}
#endif // QT_CONFIG(fslibs)
}
diff --git a/src/corelib/io/qfilesystemiterator_unix.cpp b/src/corelib/io/qfilesystemiterator_unix.cpp
index 74b7e820d9..ceea3a467c 100644
--- a/src/corelib/io/qfilesystemiterator_unix.cpp
+++ b/src/corelib/io/qfilesystemiterator_unix.cpp
@@ -85,7 +85,11 @@ static bool checkNameDecodable(const char *d_name, qsizetype len)
codec->toUnicode(d_name, len, &cs);
return cs.invalidChars == 0 && cs.remainingChars == 0;
#else
+ Q_UNUSED(d_name);
+ Q_UNUSED(len);
// if we have no text codecs, then QString::fromLocal8Bit is fromLatin1
+ Q_UNUSED(d_name)
+ Q_UNUSED(len)
return true;
#endif
}
diff --git a/src/corelib/io/qfilesystemwatcher_polling.cpp b/src/corelib/io/qfilesystemwatcher_polling.cpp
index e07b02f7c2..6920eab258 100644
--- a/src/corelib/io/qfilesystemwatcher_polling.cpp
+++ b/src/corelib/io/qfilesystemwatcher_polling.cpp
@@ -111,37 +111,40 @@ QStringList QPollingFileSystemWatcherEngine::removePaths(const QStringList &path
void QPollingFileSystemWatcherEngine::timeout()
{
for (auto it = files.begin(), end = files.end(); it != end; /*erasing*/) {
- auto x = it++;
- QString path = x.key();
+ QString path = it.key();
QFileInfo fi(path);
if (!fi.exists()) {
- files.erase(x);
+ it = files.erase(it);
emit fileChanged(path, true);
- } else if (x.value() != fi) {
- x.value() = fi;
+ continue;
+ } else if (it.value() != fi) {
+ it.value() = fi;
emit fileChanged(path, false);
}
+ ++it;
}
for (auto it = directories.begin(), end = directories.end(); it != end; /*erasing*/) {
- auto x = it++;
- QString path = x.key();
+ QString path = it.key();
QFileInfo fi(path);
if (!path.endsWith(QLatin1Char('/')))
fi = QFileInfo(path + QLatin1Char('/'));
if (!fi.exists()) {
- directories.erase(x);
+ it = directories.erase(it);
emit directoryChanged(path, true);
- } else if (x.value() != fi) {
+ continue;
+ } else if (it.value() != fi) {
fi.refresh();
if (!fi.exists()) {
- directories.erase(x);
+ it = directories.erase(it);
emit directoryChanged(path, true);
+ continue;
} else {
- x.value() = fi;
+ it.value() = fi;
emit directoryChanged(path, false);
}
}
+ ++it;
}
}
diff --git a/src/corelib/io/qfilesystemwatcher_win.cpp b/src/corelib/io/qfilesystemwatcher_win.cpp
index 3b67dd61c7..2f0a209b76 100644
--- a/src/corelib/io/qfilesystemwatcher_win.cpp
+++ b/src/corelib/io/qfilesystemwatcher_win.cpp
@@ -81,7 +81,7 @@ static Qt::HANDLE createChangeNotification(const QString &path, uint flags)
nativePath.append(QLatin1Char('\\'));
const HANDLE result = FindFirstChangeNotification(reinterpret_cast<const wchar_t *>(nativePath.utf16()),
FALSE, flags);
- DEBUG() << __FUNCTION__ << nativePath << Qt::hex <<showbase << flags << "returns" << result;
+ DEBUG() << __FUNCTION__ << nativePath << Qt::hex << Qt::showbase << flags << "returns" << result;
return result;
}
@@ -697,21 +697,20 @@ void QWindowsFileSystemWatcherEngineThread::run()
qErrnoWarning(error, "%ls", qUtf16Printable(msgFindNextFailed(h)));
}
- for (auto it = h.begin(), end = h.end(); it != end; /*erasing*/ ) {
- auto x = it++;
- QString absolutePath = x.value().absolutePath;
- QFileInfo fileInfo(x.value().path);
- DEBUG() << "checking" << x.key();
+ for (auto it = h.begin(); it != h.end(); /*erasing*/ ) {
+ QString absolutePath = it.value().absolutePath;
+ QFileInfo fileInfo(it.value().path);
+ DEBUG() << "checking" << it.key();
// i'm not completely sure the fileInfo.exist() check will ever work... see QTBUG-2331
// ..however, I'm not completely sure enough to remove it.
if (fakeRemove || !fileInfo.exists()) {
- DEBUG() << x.key() << "removed!";
- if (x.value().isDir)
- emit directoryChanged(x.value().path, true);
+ DEBUG() << it.key() << "removed!";
+ if (it.value().isDir)
+ emit directoryChanged(it.value().path, true);
else
- emit fileChanged(x.value().path, true);
- h.erase(x);
+ emit fileChanged(it.value().path, true);
+ it = h.erase(it);
// close the notification handle if the directory has been removed
if (h.isEmpty()) {
@@ -726,15 +725,17 @@ void QWindowsFileSystemWatcherEngineThread::run()
// h is now invalid
break;
}
- } else if (x.value().isDir) {
- DEBUG() << x.key() << "directory changed!";
- emit directoryChanged(x.value().path, false);
- x.value() = fileInfo;
- } else if (x.value() != fileInfo) {
- DEBUG() << x.key() << "file changed!";
- emit fileChanged(x.value().path, false);
- x.value() = fileInfo;
+ continue;
+ } else if (it.value().isDir) {
+ DEBUG() << it.key() << "directory changed!";
+ emit directoryChanged(it.value().path, false);
+ it.value() = fileInfo;
+ } else if (it.value() != fileInfo) {
+ DEBUG() << it.key() << "file changed!";
+ emit fileChanged(it.value().path, false);
+ it.value() = fileInfo;
}
+ ++it;
}
}
} else {
diff --git a/src/corelib/io/qfilesystemwatcher_win_p.h b/src/corelib/io/qfilesystemwatcher_win_p.h
index 272591ce7a..9d74ca3f61 100644
--- a/src/corelib/io/qfilesystemwatcher_win_p.h
+++ b/src/corelib/io/qfilesystemwatcher_win_p.h
@@ -142,7 +142,7 @@ public:
Q_DECLARE_TYPEINFO(QFileSystemWatcherPathKey, Q_MOVABLE_TYPE);
-inline uint qHash(const QFileSystemWatcherPathKey &key) { return qHash(key.toCaseFolded()); }
+inline size_t qHash(const QFileSystemWatcherPathKey &key) { return qHash(key.toCaseFolded()); }
class QWindowsFileSystemWatcherEngineThread : public QThread
{
diff --git a/src/corelib/io/qipaddress.cpp b/src/corelib/io/qipaddress.cpp
index ddc5b6607f..15f759156d 100644
--- a/src/corelib/io/qipaddress.cpp
+++ b/src/corelib/io/qipaddress.cpp
@@ -47,7 +47,7 @@ namespace QIPAddressUtils {
static QString number(quint8 val, int base = 10)
{
- QChar zero(0x30);
+ QString zero = QStringLiteral("0");
return val ? qulltoa(val, base, zero) : zero;
}
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp
index 4500467ac2..1f4be24913 100644
--- a/src/corelib/io/qprocess.cpp
+++ b/src/corelib/io/qprocess.cpp
@@ -810,16 +810,6 @@ void QProcessPrivate::Channel::clear()
\a newState argument is the state QProcess changed to.
*/
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \fn void QProcess::finished(int exitCode)
- \obsolete
- \overload
-
- Use finished(int exitCode, QProcess::ExitStatus status) instead.
-*/
-#endif
-
/*!
\fn void QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus)
@@ -1175,12 +1165,6 @@ bool QProcessPrivate::_q_processDied()
//emit q->standardOutputClosed();
//emit q->standardErrorClosed();
-#if QT_DEPRECATED_SINCE(5, 13)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- emit q->finished(exitCode);
-QT_WARNING_POP
-#endif
emit q->finished(exitCode, exitStatus);
}
#if defined QPROCESS_DEBUG
@@ -1676,17 +1660,6 @@ qint64 QProcess::processId() const
#endif
}
-/*! \reimp
-
- This function operates on the current read channel.
-
- \sa readChannel(), setReadChannel()
-*/
-bool QProcess::canReadLine() const
-{
- return QIODevice::canReadLine();
-}
-
/*!
Closes all communication with the process and kills it. After calling this
function, QProcess will no longer emit readyRead(), and data can no
@@ -1705,16 +1678,6 @@ void QProcess::close()
}
/*! \reimp
-
- Returns \c true if the process is not running, and no more data is available
- for reading; otherwise returns \c false.
-*/
-bool QProcess::atEnd() const
-{
- return QIODevice::atEnd();
-}
-
-/*! \reimp
*/
bool QProcess::isSequential() const
{
@@ -1723,13 +1686,6 @@ bool QProcess::isSequential() const
/*! \reimp
*/
-qint64 QProcess::bytesAvailable() const
-{
- return QIODevice::bytesAvailable();
-}
-
-/*! \reimp
-*/
qint64 QProcess::bytesToWrite() const
{
qint64 size = QIODevice::bytesToWrite();
@@ -2558,18 +2514,6 @@ bool QProcess::startDetached(const QString &program,
}
/*!
- \internal
-*/
-bool QProcess::startDetached(const QString &program,
- const QStringList &arguments)
-{
- QProcess process;
- process.setProgram(program);
- process.setArguments(arguments);
- return process.startDetached();
-}
-
-/*!
\obsolete
\overload startDetached()
diff --git a/src/corelib/io/qprocess.h b/src/corelib/io/qprocess.h
index 8c55080252..ee83c93cf8 100644
--- a/src/corelib/io/qprocess.h
+++ b/src/corelib/io/qprocess.h
@@ -248,12 +248,9 @@ public:
QProcess::ExitStatus exitStatus() const;
// QIODevice
- qint64 bytesAvailable() const override; // ### Qt6: remove trivial override
qint64 bytesToWrite() const override;
bool isSequential() const override;
- bool canReadLine() const override; // ### Qt6: remove trivial override
void close() override;
- bool atEnd() const override; // ### Qt6: remove trivial override
static int execute(const QString &program, const QStringList &arguments);
#if QT_DEPRECATED_SINCE(5, 15)
@@ -263,14 +260,7 @@ public:
static int execute(const QString &command);
#endif
static bool startDetached(const QString &program, const QStringList &arguments,
- const QString &workingDirectory
-#if defined(Q_QDOC)
- = QString()
-#endif
- , qint64 *pid = nullptr);
-#if !defined(Q_QDOC)
- static bool startDetached(const QString &program, const QStringList &arguments); // ### Qt6: merge overloads
-#endif
+ const QString &workingDirectory = QString(), qint64 *pid = nullptr);
#if QT_DEPRECATED_SINCE(5, 15)
QT_DEPRECATED_X(
"Use QProcess::startDetached(const QString &program, const QStringList &arguments) instead"
@@ -290,11 +280,7 @@ public Q_SLOTS:
Q_SIGNALS:
void started(QPrivateSignal);
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use QProcess::finished(int, QProcess::ExitStatus) instead")
- void finished(int exitCode); // ### Qt 6: merge the two signals with a default value
-#endif
- void finished(int exitCode, QProcess::ExitStatus exitStatus);
+ void finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit);
#if QT_DEPRECATED_SINCE(5, 6)
QT_DEPRECATED_X("Use QProcess::errorOccurred(QProcess::ProcessError) instead")
void error(QProcess::ProcessError error);
diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp
index 8bf63e8a63..9a2fd196a2 100644
--- a/src/corelib/io/qresource.cpp
+++ b/src/corelib/io/qresource.cpp
@@ -1241,14 +1241,8 @@ bool QDynamicFileResourceRoot::registerSelf(const QString &f)
uchar *data = nullptr;
qsizetype data_len = 0;
-#ifdef QT_USE_MMAP
- int fd = QT_OPEN(QFile::encodeName(f), O_RDONLY,
-#if defined(Q_OS_WIN)
- _S_IREAD | _S_IWRITE
-#else
- 0666
-#endif
- );
+#if defined(QT_USE_MMAP)
+ int fd = QT_OPEN(QFile::encodeName(f), O_RDONLY, 0666);
if (fd >= 0) {
QT_STATBUF st;
if (!QT_FSTAT(fd, &st) && st.st_size <= std::numeric_limits<qsizetype>::max()) {
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp
index c69ec908ed..6840b9686c 100644
--- a/src/corelib/io/qsettings.cpp
+++ b/src/corelib/io/qsettings.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -409,14 +409,16 @@ QString QSettingsPrivate::variantToString(const QVariant &v)
break;
}
+#if QT_CONFIG(shortcut)
+ case QMetaType::QKeySequence:
+#endif
case QMetaType::QString:
case QMetaType::LongLong:
case QMetaType::ULongLong:
case QMetaType::Int:
case QMetaType::UInt:
case QMetaType::Bool:
- case QMetaType::Double:
- case QMetaType::QKeySequence: {
+ case QMetaType::Double: {
result = v.toString();
if (result.contains(QChar::Null))
result = QLatin1String("@String(") + result + QLatin1Char(')');
diff --git a/src/corelib/io/qstandardpaths.cpp b/src/corelib/io/qstandardpaths.cpp
index 04aff3d11b..d95c9015cc 100644
--- a/src/corelib/io/qstandardpaths.cpp
+++ b/src/corelib/io/qstandardpaths.cpp
@@ -348,6 +348,8 @@ QT_BEGIN_NAMESPACE
\note On Android 6.0 (API 23) or higher, the "WRITE_EXTERNAL_STORAGE" permission must be
requested at runtime when using QStandardPaths::writableLocation or QStandardPaths::standardLocations.
+ \note On Android, reading/writing to GenericDataLocation needs the READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE permission granted.
+
\note On iOS, if you do pass \c {QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).last()}
as argument to \l{QFileDialog::setDirectory()},
a native image picker dialog will be used for accessing the user's photo album.
diff --git a/src/corelib/io/qtldurl.cpp b/src/corelib/io/qtldurl.cpp
deleted file mode 100644
index 3301a76011..0000000000
--- a/src/corelib/io/qtldurl.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qglobal.h>
-
-#if QT_CONFIG(topleveldomain)
-
-#include "qplatformdefs.h"
-#include "qurl.h"
-#include "private/qurltlds_p.h"
-#include "private/qtldurl_p.h"
-#include "QtCore/qstring.h"
-#include "QtCore/qvector.h"
-
-QT_BEGIN_NAMESPACE
-
-enum TLDMatchType {
- ExactMatch,
- SuffixMatch,
- ExceptionMatch,
-};
-
-static bool containsTLDEntry(QStringView entry, TLDMatchType match)
-{
- const QStringView matchSymbols[] = {
- u"",
- u"*",
- u"!",
- };
- const auto symbol = matchSymbols[match];
- int index = qt_hash(entry, qt_hash(symbol)) % tldCount;
-
- // select the right chunk from the big table
- short chunk = 0;
- uint chunkIndex = tldIndices[index], offset = 0;
- while (chunk < tldChunkCount && tldIndices[index] >= tldChunks[chunk]) {
- chunkIndex -= tldChunks[chunk];
- offset += tldChunks[chunk];
- chunk++;
- }
-
- // check all the entries from the given index
- while (chunkIndex < tldIndices[index+1] - offset) {
- const auto utf8 = tldData[chunk] + chunkIndex;
- if ((symbol.isEmpty() || QLatin1Char(*utf8) == symbol) && entry == QString::fromUtf8(utf8 + symbol.size()))
- return true;
- chunkIndex += qstrlen(utf8) + 1; // +1 for the ending \0
- }
- return false;
-}
-
-/*!
- \internal
-
- Return the top-level-domain per Qt's copy of the Mozilla public suffix list of
- \a domain.
-*/
-
-Q_CORE_EXPORT QString qTopLevelDomain(const QString &domain)
-{
- const QString domainLower = domain.toLower();
- QVector<QStringRef> sections = domainLower.splitRef(QLatin1Char('.'), Qt::SkipEmptyParts);
- if (sections.isEmpty())
- return QString();
-
- QString level, tld;
- for (int j = sections.count() - 1; j >= 0; --j) {
- level.prepend(QLatin1Char('.') + sections.at(j));
- if (qIsEffectiveTLD(level.rightRef(level.size() - 1)))
- tld = level;
- }
- return tld;
-}
-
-/*!
- \internal
-
- Return true if \a domain is a top-level-domain per Qt's copy of the Mozilla public suffix list.
-*/
-
-Q_CORE_EXPORT bool qIsEffectiveTLD(const QStringRef &domain)
-{
- // for domain 'foo.bar.com':
- // 1. return if TLD table contains 'foo.bar.com'
- // 2. else if table contains '*.bar.com',
- // 3. test that table does not contain '!foo.bar.com'
-
- if (containsTLDEntry(domain, ExactMatch)) // 1
- return true;
-
- const int dot = domain.indexOf(QLatin1Char('.'));
- if (dot < 0) // Actual TLD: may be effective if the subject of a wildcard rule:
- return containsTLDEntry(QString(QLatin1Char('.') + domain), SuffixMatch);
- if (containsTLDEntry(domain.mid(dot), SuffixMatch)) // 2
- return !containsTLDEntry(domain, ExceptionMatch); // 3
- return false;
-}
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/corelib/io/qtldurl_p.h b/src/corelib/io/qtldurl_p.h
deleted file mode 100644
index 4636f18874..0000000000
--- a/src/corelib/io/qtldurl_p.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QTLDURL_P_H
-#define QTLDURL_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of qDecodeDataUrl. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-#include "QtCore/qurl.h"
-#include "QtCore/qstring.h"
-
-QT_REQUIRE_CONFIG(topleveldomain);
-
-QT_BEGIN_NAMESPACE
-
-Q_CORE_EXPORT QString qTopLevelDomain(const QString &domain);
-Q_CORE_EXPORT bool qIsEffectiveTLD(const QStringRef &domain);
-inline bool qIsEffectiveTLD(const QString &domain)
-{
- return qIsEffectiveTLD(QStringRef(&domain));
-}
-
-QT_END_NAMESPACE
-
-#endif // QDATAURL_P_H
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index 104161bc33..49570697ef 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -415,9 +415,6 @@
#include "qhash.h"
#include "qdir.h" // for QDir::fromNativeSeparators
#include "qdatastream.h"
-#if QT_CONFIG(topleveldomain) // ### Qt6: Remove section
-#include "qtldurl_p.h"
-#endif
#include "private/qipaddress_p.h"
#include "qurlquery.h"
#include "private/qdir_p.h"
@@ -979,7 +976,7 @@ inline bool QUrlPrivate::setScheme(const QString &value, int len, bool doSetErro
// validate it:
int needsLowercasing = -1;
- const ushort *p = reinterpret_cast<const ushort *>(value.constData());
+ const ushort *p = value.utf16();
for (int i = 0; i < len; ++i) {
if (p[i] >= 'a' && p[i] <= 'z')
continue;
@@ -3149,46 +3146,6 @@ bool QUrl::hasFragment() const
return d->hasFragment();
}
-#if QT_DEPRECATED_SINCE(5, 15)
-#if QT_CONFIG(topleveldomain)
-/*!
- \since 4.8
-
- \deprecated
-
- Returns the TLD (Top-Level Domain) of the URL, (e.g. .co.uk, .net).
- Note that the return value is prefixed with a '.' unless the
- URL does not contain a valid TLD, in which case the function returns
- an empty string.
-
- Note that this function considers a TLD to be any domain that allows users
- to register subdomains under, including many home, dynamic DNS websites and
- blogging providers. This is useful for determining whether two websites
- belong to the same infrastructure and communication should be allowed, such
- as browser cookies: two domains should be considered part of the same
- website if they share at least one label in addition to the value
- returned by this function.
-
- \list
- \li \c{foo.co.uk} and \c{foo.com} do not share a top-level domain
- \li \c{foo.co.uk} and \c{bar.co.uk} share the \c{.co.uk} domain, but the next label is different
- \li \c{www.foo.co.uk} and \c{ftp.foo.co.uk} share the same top-level domain and one more label,
- so they are considered part of the same site
- \endlist
-
- If \a options includes EncodeUnicode, the returned string will be in
- ASCII Compatible Encoding.
-*/
-QString QUrl::topLevelDomain(ComponentFormattingOptions options) const
-{
- QString tld = qTopLevelDomain(host());
- if (options & EncodeUnicode) {
- return qt_ACE_do(tld, ToAceOnly, AllowLeadingDot);
- }
- return tld;
-}
-#endif
-#endif // QT_DEPRECATED_SINCE(5, 15)
/*!
Returns the result of the merge of this URL with \a relative. This
URL is used as a base to convert \a relative to an absolute URL.
@@ -4159,7 +4116,7 @@ QList<QUrl> QUrl::fromStringList(const QStringList &urls, ParsingMode mode)
\relates QHash
\since 5.0
*/
-uint qHash(const QUrl &url, uint seed) noexcept
+size_t qHash(const QUrl &url, size_t seed) noexcept
{
if (!url.d)
return qHash(-1, seed); // the hash of an unset port (-1)
diff --git a/src/corelib/io/qurl.h b/src/corelib/io/qurl.h
index eb7fb8087c..0425502a52 100644
--- a/src/corelib/io/qurl.h
+++ b/src/corelib/io/qurl.h
@@ -119,7 +119,7 @@ class QTypeInfo<QUrlTwoFlags<E1, E2> > : public QTypeInfoMerger<QUrlTwoFlags<E1,
class QUrl;
// qHash is a friend, but we can't use default arguments for friends (§8.3.6.4)
-Q_CORE_EXPORT uint qHash(const QUrl &url, uint seed = 0) noexcept;
+Q_CORE_EXPORT size_t qHash(const QUrl &url, size_t seed = 0) noexcept;
class Q_CORE_EXPORT QUrl
{
@@ -233,11 +233,6 @@ public:
void setHost(const QString &host, ParsingMode mode = DecodedMode);
QString host(ComponentFormattingOptions = FullyDecoded) const;
-#if QT_DEPRECATED_SINCE(5, 15)
-#if QT_CONFIG(topleveldomain)
- QT_DEPRECATED QString topLevelDomain(ComponentFormattingOptions options = FullyDecoded) const;
-#endif
-#endif // QT_DEPRECATED_SINCE(5, 15)
void setPort(int port);
int port(int defaultPort = -1) const;
@@ -361,7 +356,7 @@ public:
static QList<QUrl> fromStringList(const QStringList &uris, ParsingMode mode = TolerantMode);
static void setIdnWhitelist(const QStringList &);
- friend Q_CORE_EXPORT uint qHash(const QUrl &url, uint seed) noexcept;
+ friend Q_CORE_EXPORT size_t qHash(const QUrl &url, size_t seed) noexcept;
private:
QUrlPrivate *d;
diff --git a/src/corelib/io/qurlquery.cpp b/src/corelib/io/qurlquery.cpp
index 8d80a2d8bd..325a0c2ba3 100644
--- a/src/corelib/io/qurlquery.cpp
+++ b/src/corelib/io/qurlquery.cpp
@@ -434,7 +434,7 @@ bool QUrlQuery::operator ==(const QUrlQuery &other) const
Returns the hash value for \a key,
using \a seed to seed the calculation.
*/
-uint qHash(const QUrlQuery &key, uint seed) noexcept
+size_t qHash(const QUrlQuery &key, size_t seed) noexcept
{
if (const QUrlQueryPrivate *d = key.d) {
QtPrivate::QHashCombine hash;
diff --git a/src/corelib/io/qurlquery.h b/src/corelib/io/qurlquery.h
index 89d0f88059..0be2cafb0b 100644
--- a/src/corelib/io/qurlquery.h
+++ b/src/corelib/io/qurlquery.h
@@ -52,7 +52,7 @@
QT_BEGIN_NAMESPACE
-Q_CORE_EXPORT uint qHash(const QUrlQuery &key, uint seed = 0) noexcept;
+Q_CORE_EXPORT size_t qHash(const QUrlQuery &key, size_t seed = 0) noexcept;
class QUrlQueryPrivate;
class Q_CORE_EXPORT QUrlQuery
@@ -109,7 +109,7 @@ public:
private:
friend class QUrl;
- friend Q_CORE_EXPORT uint qHash(const QUrlQuery &key, uint seed) noexcept;
+ friend Q_CORE_EXPORT size_t qHash(const QUrlQuery &key, size_t seed) noexcept;
QSharedDataPointer<QUrlQueryPrivate> d;
public:
typedef QSharedDataPointer<QUrlQueryPrivate> DataPtr;
diff --git a/src/corelib/io/qurltlds_p.h b/src/corelib/io/qurltlds_p.h
deleted file mode 100644
index 1f2589c34a..0000000000
--- a/src/corelib/io/qurltlds_p.h
+++ /dev/null
@@ -1,14467 +0,0 @@
-// License: MPL 2.0/GPL 2.0/LGPL 3
-//
-// The contents of this file are subject to the Mozilla Public License Version
-// 2.0 (the "License"); you may not use this file except in compliance with
-// the License. You may obtain a copy of the License at
-// http://www.mozilla.org/MPL/
-//
-// Software distributed under the License is distributed on an "AS IS" basis,
-// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-// for the specific language governing rights and limitations under the
-// License.
-//
-// The Original Code is the Public Suffix List.
-//
-// The Initial Developer of the Original Code is
-// Jo Hermans <jo.hermans@gmail.com>.
-// Portions created by the Initial Developer are Copyright (C) 2007
-// the Initial Developer. All Rights Reserved.
-//
-// Contributor(s):
-// Ruben Arakelyan <ruben@wackomenace.co.uk>
-// Gervase Markham <gerv@gerv.net>
-// Pamela Greene <pamg.bugs@gmail.com>
-// David Triendl <david@triendl.name>
-// Jothan Frakes <jothan@gmail.com>
-// The kind representatives of many TLD registries
-//
-// Alternatively, the contents of this file may be used under the terms of
-// either the GNU General Public License Version 2 or later (the "GPL"), or
-// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-// in which case the provisions of the GPL or the LGPL are applicable instead
-// of those above. If you wish to allow use of your version of this file only
-// under the terms of either the GPL or the LGPL, and not to allow others to
-// use your version of this file under the terms of the MPL, indicate your
-// decision by deleting the provisions above and replace them with the notice
-// and other provisions required by the GPL or the LGPL. If you do not delete
-// the provisions above, a recipient may use your version of this file under
-// the terms of any one of the MPL, the GPL or the LGPL.
-//
-
-#ifndef QURLTLD_P_H
-#define QURLTLD_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of the Network Access and Core framework. This header file may change from
-// version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-
-QT_BEGIN_NAMESPACE
-
-// note to maintainer:
-// this file should be updated before each release ->
-// for instructions see the program at
-// util/corelib/qurl-generateTLDs/
-
-static const quint16 tldCount = 8830;
-static const quint32 tldIndices[] = {
-0,
-16,
-28,
-45,
-45,
-45,
-78,
-78,
-106,
-128,
-169,
-202,
-220,
-237,
-237,
-260,
-260,
-270,
-270,
-281,
-302,
-302,
-302,
-302,
-328,
-337,
-369,
-369,
-382,
-382,
-396,
-409,
-422,
-422,
-422,
-422,
-439,
-454,
-472,
-506,
-506,
-506,
-506,
-552,
-552,
-565,
-565,
-570,
-604,
-604,
-604,
-604,
-618,
-636,
-641,
-656,
-656,
-656,
-660,
-670,
-670,
-670,
-674,
-674,
-707,
-714,
-768,
-792,
-815,
-821,
-873,
-873,
-883,
-883,
-893,
-893,
-893,
-893,
-899,
-899,
-909,
-917,
-925,
-949,
-949,
-962,
-962,
-962,
-975,
-1011,
-1011,
-1048,
-1064,
-1064,
-1064,
-1071,
-1085,
-1085,
-1113,
-1149,
-1157,
-1157,
-1157,
-1176,
-1176,
-1176,
-1176,
-1191,
-1212,
-1217,
-1228,
-1256,
-1256,
-1256,
-1274,
-1274,
-1301,
-1354,
-1386,
-1386,
-1430,
-1450,
-1450,
-1450,
-1450,
-1450,
-1472,
-1472,
-1491,
-1491,
-1500,
-1500,
-1531,
-1531,
-1539,
-1551,
-1561,
-1588,
-1588,
-1603,
-1620,
-1640,
-1640,
-1650,
-1650,
-1680,
-1680,
-1680,
-1680,
-1680,
-1685,
-1704,
-1704,
-1704,
-1710,
-1722,
-1722,
-1722,
-1732,
-1732,
-1754,
-1754,
-1769,
-1791,
-1803,
-1803,
-1803,
-1809,
-1809,
-1845,
-1866,
-1900,
-1912,
-1912,
-1919,
-1935,
-1935,
-1944,
-1944,
-1944,
-1944,
-1951,
-1970,
-1970,
-1998,
-1998,
-2012,
-2017,
-2017,
-2017,
-2022,
-2030,
-2030,
-2036,
-2060,
-2065,
-2065,
-2088,
-2118,
-2157,
-2177,
-2177,
-2177,
-2193,
-2202,
-2219,
-2219,
-2219,
-2219,
-2219,
-2229,
-2229,
-2229,
-2229,
-2229,
-2229,
-2238,
-2238,
-2238,
-2238,
-2238,
-2238,
-2238,
-2252,
-2273,
-2291,
-2291,
-2295,
-2295,
-2308,
-2308,
-2308,
-2313,
-2353,
-2353,
-2353,
-2353,
-2378,
-2378,
-2397,
-2397,
-2402,
-2416,
-2434,
-2459,
-2466,
-2473,
-2491,
-2513,
-2513,
-2513,
-2518,
-2526,
-2526,
-2541,
-2557,
-2566,
-2566,
-2583,
-2599,
-2610,
-2610,
-2625,
-2643,
-2643,
-2676,
-2711,
-2711,
-2728,
-2728,
-2738,
-2738,
-2746,
-2746,
-2759,
-2792,
-2792,
-2812,
-2812,
-2820,
-2831,
-2831,
-2837,
-2864,
-2884,
-2915,
-2919,
-2919,
-2919,
-2925,
-2932,
-2960,
-2960,
-2964,
-2983,
-3007,
-3037,
-3046,
-3046,
-3062,
-3071,
-3092,
-3100,
-3100,
-3143,
-3143,
-3143,
-3167,
-3167,
-3167,
-3167,
-3167,
-3174,
-3183,
-3192,
-3201,
-3221,
-3221,
-3253,
-3269,
-3286,
-3310,
-3310,
-3324,
-3336,
-3336,
-3336,
-3336,
-3352,
-3391,
-3391,
-3420,
-3426,
-3441,
-3441,
-3441,
-3448,
-3466,
-3466,
-3481,
-3493,
-3526,
-3526,
-3551,
-3558,
-3558,
-3583,
-3583,
-3583,
-3583,
-3620,
-3620,
-3620,
-3626,
-3646,
-3646,
-3690,
-3729,
-3736,
-3736,
-3776,
-3798,
-3818,
-3836,
-3857,
-3857,
-3880,
-3880,
-3890,
-3908,
-3908,
-3908,
-3917,
-3933,
-3933,
-3933,
-3955,
-3955,
-3968,
-3982,
-3999,
-3999,
-4006,
-4024,
-4059,
-4059,
-4059,
-4075,
-4092,
-4092,
-4108,
-4138,
-4138,
-4138,
-4138,
-4138,
-4165,
-4171,
-4177,
-4184,
-4202,
-4222,
-4222,
-4238,
-4261,
-4268,
-4268,
-4287,
-4293,
-4306,
-4312,
-4326,
-4383,
-4401,
-4413,
-4448,
-4453,
-4476,
-4512,
-4522,
-4559,
-4575,
-4575,
-4575,
-4575,
-4575,
-4593,
-4652,
-4652,
-4652,
-4652,
-4675,
-4685,
-4685,
-4696,
-4727,
-4739,
-4739,
-4746,
-4746,
-4767,
-4779,
-4799,
-4799,
-4805,
-4805,
-4812,
-4812,
-4826,
-4846,
-4846,
-4862,
-4868,
-4887,
-4887,
-4887,
-4887,
-4887,
-4915,
-4933,
-4950,
-4968,
-4972,
-4985,
-4985,
-4985,
-4985,
-4997,
-5003,
-5003,
-5019,
-5019,
-5028,
-5053,
-5059,
-5059,
-5059,
-5059,
-5078,
-5078,
-5091,
-5124,
-5151,
-5180,
-5220,
-5220,
-5239,
-5263,
-5274,
-5274,
-5288,
-5303,
-5313,
-5330,
-5347,
-5384,
-5384,
-5401,
-5407,
-5423,
-5423,
-5423,
-5429,
-5451,
-5474,
-5496,
-5518,
-5530,
-5540,
-5540,
-5562,
-5591,
-5597,
-5597,
-5614,
-5618,
-5647,
-5657,
-5657,
-5657,
-5679,
-5696,
-5696,
-5705,
-5712,
-5735,
-5735,
-5764,
-5764,
-5764,
-5764,
-5764,
-5772,
-5776,
-5791,
-5806,
-5812,
-5833,
-5853,
-5873,
-5873,
-5891,
-5903,
-5916,
-5916,
-5916,
-5936,
-5954,
-5964,
-5964,
-5975,
-5975,
-5985,
-6020,
-6043,
-6056,
-6056,
-6056,
-6067,
-6067,
-6077,
-6077,
-6083,
-6092,
-6101,
-6111,
-6132,
-6149,
-6155,
-6159,
-6159,
-6217,
-6226,
-6226,
-6226,
-6286,
-6286,
-6286,
-6298,
-6336,
-6336,
-6336,
-6392,
-6392,
-6401,
-6425,
-6433,
-6444,
-6466,
-6483,
-6493,
-6493,
-6505,
-6516,
-6540,
-6547,
-6547,
-6564,
-6564,
-6604,
-6604,
-6604,
-6612,
-6612,
-6633,
-6633,
-6633,
-6660,
-6681,
-6681,
-6681,
-6681,
-6699,
-6756,
-6768,
-6799,
-6817,
-6817,
-6838,
-6838,
-6838,
-6853,
-6875,
-6875,
-6875,
-6887,
-6887,
-6893,
-6893,
-6893,
-6933,
-6933,
-6940,
-6947,
-6969,
-6983,
-6983,
-6983,
-6983,
-7017,
-7017,
-7024,
-7024,
-7042,
-7051,
-7058,
-7058,
-7066,
-7066,
-7066,
-7092,
-7092,
-7092,
-7092,
-7092,
-7116,
-7132,
-7132,
-7139,
-7172,
-7205,
-7205,
-7217,
-7217,
-7217,
-7225,
-7225,
-7225,
-7236,
-7247,
-7258,
-7258,
-7265,
-7276,
-7317,
-7322,
-7362,
-7382,
-7382,
-7382,
-7387,
-7387,
-7387,
-7387,
-7387,
-7387,
-7415,
-7474,
-7486,
-7486,
-7495,
-7511,
-7524,
-7549,
-7581,
-7591,
-7591,
-7591,
-7591,
-7598,
-7598,
-7634,
-7643,
-7668,
-7668,
-7675,
-7697,
-7697,
-7697,
-7706,
-7773,
-7804,
-7814,
-7814,
-7828,
-7828,
-7828,
-7828,
-7848,
-7848,
-7865,
-7884,
-7899,
-7906,
-7924,
-7924,
-7955,
-8003,
-8020,
-8034,
-8073,
-8073,
-8073,
-8073,
-8073,
-8073,
-8073,
-8083,
-8098,
-8120,
-8137,
-8144,
-8144,
-8175,
-8186,
-8186,
-8210,
-8217,
-8217,
-8217,
-8217,
-8244,
-8249,
-8249,
-8249,
-8249,
-8267,
-8267,
-8267,
-8267,
-8280,
-8280,
-8280,
-8302,
-8330,
-8357,
-8357,
-8388,
-8424,
-8424,
-8444,
-8451,
-8468,
-8484,
-8500,
-8500,
-8500,
-8518,
-8518,
-8518,
-8518,
-8518,
-8544,
-8563,
-8582,
-8592,
-8592,
-8607,
-8627,
-8654,
-8723,
-8723,
-8744,
-8744,
-8763,
-8811,
-8811,
-8811,
-8824,
-8846,
-8891,
-8909,
-8939,
-8939,
-8939,
-8974,
-8984,
-8996,
-8996,
-8996,
-9003,
-9023,
-9035,
-9052,
-9052,
-9052,
-9062,
-9075,
-9075,
-9093,
-9093,
-9106,
-9112,
-9112,
-9142,
-9155,
-9159,
-9159,
-9159,
-9166,
-9173,
-9187,
-9217,
-9239,
-9256,
-9256,
-9277,
-9302,
-9302,
-9322,
-9341,
-9353,
-9353,
-9353,
-9366,
-9370,
-9382,
-9382,
-9382,
-9382,
-9382,
-9401,
-9401,
-9415,
-9427,
-9448,
-9483,
-9500,
-9551,
-9582,
-9582,
-9582,
-9594,
-9625,
-9635,
-9645,
-9674,
-9701,
-9701,
-9701,
-9731,
-9743,
-9753,
-9803,
-9820,
-9820,
-9820,
-9820,
-9846,
-9861,
-9873,
-9873,
-9873,
-9897,
-9904,
-9920,
-9928,
-9928,
-9928,
-9950,
-9950,
-9950,
-9950,
-9950,
-9950,
-9950,
-9965,
-9984,
-9984,
-9991,
-9991,
-10010,
-10054,
-10061,
-10061,
-10061,
-10061,
-10061,
-10061,
-10115,
-10115,
-10122,
-10126,
-10126,
-10126,
-10126,
-10137,
-10137,
-10143,
-10143,
-10170,
-10170,
-10186,
-10186,
-10186,
-10186,
-10186,
-10186,
-10186,
-10193,
-10201,
-10201,
-10201,
-10216,
-10225,
-10225,
-10262,
-10269,
-10284,
-10305,
-10352,
-10370,
-10379,
-10399,
-10399,
-10399,
-10399,
-10399,
-10410,
-10430,
-10436,
-10436,
-10436,
-10464,
-10464,
-10464,
-10475,
-10492,
-10513,
-10513,
-10522,
-10541,
-10551,
-10569,
-10575,
-10599,
-10599,
-10618,
-10618,
-10618,
-10641,
-10641,
-10641,
-10641,
-10641,
-10659,
-10659,
-10677,
-10677,
-10713,
-10713,
-10713,
-10756,
-10771,
-10785,
-10801,
-10819,
-10837,
-10837,
-10837,
-10841,
-10841,
-10863,
-10882,
-10882,
-10898,
-10898,
-10905,
-10905,
-10905,
-10905,
-10915,
-10915,
-10919,
-10928,
-10948,
-10970,
-10980,
-10992,
-10992,
-11002,
-11002,
-11002,
-11018,
-11018,
-11043,
-11043,
-11043,
-11060,
-11067,
-11086,
-11104,
-11109,
-11109,
-11109,
-11147,
-11147,
-11178,
-11185,
-11185,
-11194,
-11194,
-11194,
-11199,
-11199,
-11236,
-11261,
-11261,
-11270,
-11333,
-11343,
-11343,
-11354,
-11354,
-11354,
-11354,
-11366,
-11366,
-11401,
-11401,
-11401,
-11401,
-11422,
-11445,
-11445,
-11445,
-11445,
-11471,
-11478,
-11500,
-11500,
-11500,
-11504,
-11516,
-11524,
-11560,
-11560,
-11566,
-11578,
-11578,
-11578,
-11610,
-11610,
-11632,
-11632,
-11643,
-11643,
-11643,
-11643,
-11652,
-11652,
-11652,
-11697,
-11720,
-11724,
-11745,
-11761,
-11772,
-11808,
-11808,
-11823,
-11863,
-11883,
-11883,
-11896,
-11896,
-11908,
-11930,
-11936,
-11942,
-11942,
-11987,
-12003,
-12029,
-12029,
-12049,
-12068,
-12083,
-12083,
-12121,
-12121,
-12121,
-12132,
-12136,
-12136,
-12136,
-12136,
-12136,
-12148,
-12148,
-12163,
-12170,
-12170,
-12188,
-12202,
-12208,
-12208,
-12213,
-12225,
-12242,
-12242,
-12242,
-12264,
-12264,
-12297,
-12312,
-12335,
-12335,
-12344,
-12375,
-12375,
-12384,
-12406,
-12406,
-12406,
-12406,
-12406,
-12406,
-12406,
-12406,
-12412,
-12424,
-12424,
-12424,
-12424,
-12434,
-12440,
-12440,
-12479,
-12494,
-12505,
-12505,
-12520,
-12526,
-12526,
-12526,
-12526,
-12570,
-12588,
-12600,
-12612,
-12631,
-12631,
-12631,
-12631,
-12631,
-12631,
-12647,
-12659,
-12659,
-12668,
-12708,
-12736,
-12741,
-12741,
-12741,
-12753,
-12753,
-12753,
-12759,
-12767,
-12786,
-12794,
-12810,
-12836,
-12836,
-12848,
-12888,
-12899,
-12914,
-12914,
-12914,
-12921,
-12943,
-12953,
-12978,
-12989,
-12989,
-12989,
-13006,
-13006,
-13022,
-13035,
-13073,
-13097,
-13118,
-13168,
-13177,
-13191,
-13200,
-13200,
-13214,
-13234,
-13234,
-13234,
-13234,
-13276,
-13282,
-13311,
-13321,
-13321,
-13321,
-13327,
-13334,
-13361,
-13378,
-13397,
-13412,
-13420,
-13426,
-13444,
-13444,
-13444,
-13467,
-13467,
-13467,
-13467,
-13479,
-13479,
-13502,
-13502,
-13502,
-13514,
-13535,
-13543,
-13596,
-13596,
-13596,
-13596,
-13596,
-13596,
-13603,
-13603,
-13603,
-13636,
-13647,
-13647,
-13647,
-13657,
-13698,
-13698,
-13698,
-13716,
-13716,
-13723,
-13741,
-13751,
-13751,
-13762,
-13762,
-13762,
-13762,
-13762,
-13762,
-13770,
-13803,
-13812,
-13812,
-13838,
-13855,
-13866,
-13866,
-13866,
-13900,
-13900,
-13947,
-13960,
-13960,
-13972,
-13990,
-13990,
-14040,
-14054,
-14073,
-14073,
-14073,
-14082,
-14131,
-14145,
-14166,
-14166,
-14166,
-14203,
-14210,
-14234,
-14250,
-14261,
-14286,
-14286,
-14286,
-14290,
-14336,
-14367,
-14367,
-14383,
-14409,
-14409,
-14409,
-14415,
-14441,
-14441,
-14457,
-14465,
-14484,
-14484,
-14484,
-14484,
-14495,
-14514,
-14521,
-14521,
-14521,
-14521,
-14539,
-14549,
-14568,
-14568,
-14593,
-14606,
-14613,
-14649,
-14676,
-14708,
-14708,
-14712,
-14734,
-14752,
-14765,
-14782,
-14830,
-14830,
-14830,
-14838,
-14838,
-14855,
-14898,
-14898,
-14920,
-14967,
-14967,
-14967,
-14999,
-15009,
-15009,
-15009,
-15018,
-15047,
-15047,
-15047,
-15070,
-15083,
-15093,
-15099,
-15139,
-15139,
-15146,
-15165,
-15165,
-15187,
-15217,
-15222,
-15244,
-15244,
-15268,
-15296,
-15302,
-15308,
-15308,
-15308,
-15308,
-15308,
-15308,
-15317,
-15324,
-15336,
-15355,
-15355,
-15355,
-15355,
-15355,
-15372,
-15372,
-15391,
-15403,
-15414,
-15446,
-15446,
-15453,
-15459,
-15463,
-15500,
-15500,
-15513,
-15513,
-15522,
-15542,
-15599,
-15617,
-15624,
-15654,
-15668,
-15688,
-15688,
-15718,
-15718,
-15718,
-15725,
-15725,
-15741,
-15756,
-15756,
-15817,
-15817,
-15856,
-15856,
-15874,
-15884,
-15884,
-15893,
-15922,
-15940,
-15958,
-15967,
-15967,
-15967,
-15967,
-15967,
-15967,
-15967,
-15967,
-15967,
-15980,
-15980,
-15980,
-16017,
-16051,
-16051,
-16051,
-16062,
-16062,
-16062,
-16069,
-16073,
-16073,
-16087,
-16103,
-16103,
-16103,
-16128,
-16128,
-16152,
-16201,
-16228,
-16228,
-16228,
-16268,
-16277,
-16296,
-16337,
-16357,
-16397,
-16397,
-16397,
-16397,
-16419,
-16462,
-16462,
-16469,
-16493,
-16493,
-16493,
-16493,
-16502,
-16502,
-16502,
-16536,
-16544,
-16575,
-16575,
-16575,
-16649,
-16649,
-16674,
-16674,
-16674,
-16674,
-16686,
-16686,
-16731,
-16754,
-16768,
-16768,
-16776,
-16783,
-16783,
-16783,
-16799,
-16819,
-16838,
-16838,
-16863,
-16884,
-16893,
-16915,
-16915,
-16931,
-16931,
-16946,
-16971,
-16975,
-17003,
-17013,
-17026,
-17041,
-17041,
-17041,
-17041,
-17069,
-17115,
-17151,
-17151,
-17151,
-17155,
-17155,
-17155,
-17177,
-17230,
-17237,
-17244,
-17258,
-17258,
-17299,
-17304,
-17304,
-17331,
-17370,
-17383,
-17389,
-17397,
-17417,
-17417,
-17438,
-17443,
-17443,
-17443,
-17453,
-17486,
-17486,
-17504,
-17522,
-17522,
-17539,
-17556,
-17556,
-17576,
-17596,
-17596,
-17596,
-17606,
-17610,
-17617,
-17617,
-17621,
-17625,
-17630,
-17660,
-17676,
-17691,
-17701,
-17754,
-17781,
-17804,
-17804,
-17824,
-17839,
-17850,
-17850,
-17850,
-17850,
-17856,
-17856,
-17856,
-17879,
-17879,
-17929,
-17929,
-17934,
-17956,
-17956,
-17956,
-17956,
-17956,
-17962,
-17984,
-18008,
-18008,
-18008,
-18008,
-18019,
-18019,
-18030,
-18030,
-18051,
-18070,
-18070,
-18082,
-18082,
-18123,
-18123,
-18130,
-18144,
-18181,
-18257,
-18257,
-18267,
-18267,
-18267,
-18267,
-18281,
-18320,
-18327,
-18345,
-18348,
-18351,
-18377,
-18380,
-18396,
-18396,
-18404,
-18404,
-18409,
-18424,
-18427,
-18444,
-18465,
-18497,
-18518,
-18524,
-18527,
-18555,
-18573,
-18576,
-18582,
-18594,
-18597,
-18603,
-18635,
-18635,
-18638,
-18674,
-18694,
-18738,
-18761,
-18764,
-18770,
-18776,
-18776,
-18782,
-18788,
-18791,
-18809,
-18822,
-18850,
-18853,
-18856,
-18859,
-18862,
-18862,
-18885,
-18919,
-18919,
-18938,
-18944,
-18958,
-18961,
-18974,
-18991,
-19004,
-19026,
-19033,
-19047,
-19098,
-19161,
-19161,
-19174,
-19194,
-19211,
-19211,
-19214,
-19221,
-19231,
-19261,
-19270,
-19273,
-19306,
-19306,
-19320,
-19320,
-19357,
-19357,
-19357,
-19363,
-19377,
-19418,
-19425,
-19437,
-19437,
-19437,
-19466,
-19485,
-19485,
-19485,
-19502,
-19506,
-19509,
-19509,
-19512,
-19518,
-19518,
-19521,
-19524,
-19535,
-19558,
-19561,
-19564,
-19564,
-19582,
-19628,
-19638,
-19680,
-19680,
-19700,
-19703,
-19706,
-19709,
-19712,
-19734,
-19738,
-19761,
-19761,
-19794,
-19798,
-19801,
-19805,
-19808,
-19811,
-19811,
-19811,
-19858,
-19861,
-19861,
-19867,
-19873,
-19902,
-19912,
-19930,
-19930,
-19930,
-19951,
-19954,
-19957,
-19960,
-19963,
-19963,
-19973,
-20023,
-20026,
-20029,
-20052,
-20052,
-20052,
-20065,
-20076,
-20091,
-20135,
-20140,
-20152,
-20152,
-20155,
-20175,
-20185,
-20193,
-20215,
-20221,
-20243,
-20283,
-20304,
-20304,
-20336,
-20345,
-20367,
-20367,
-20382,
-20385,
-20385,
-20388,
-20418,
-20424,
-20436,
-20459,
-20459,
-20459,
-20462,
-20481,
-20512,
-20523,
-20526,
-20564,
-20564,
-20600,
-20600,
-20641,
-20644,
-20663,
-20669,
-20675,
-20686,
-20689,
-20699,
-20715,
-20729,
-20729,
-20732,
-20759,
-20764,
-20785,
-20794,
-20824,
-20839,
-20842,
-20906,
-20927,
-20942,
-20948,
-20991,
-21000,
-21030,
-21051,
-21051,
-21054,
-21094,
-21094,
-21097,
-21129,
-21136,
-21158,
-21223,
-21234,
-21237,
-21252,
-21272,
-21291,
-21306,
-21318,
-21335,
-21342,
-21359,
-21359,
-21367,
-21367,
-21376,
-21395,
-21445,
-21445,
-21470,
-21505,
-21505,
-21552,
-21571,
-21579,
-21582,
-21585,
-21625,
-21670,
-21684,
-21704,
-21707,
-21731,
-21734,
-21764,
-21772,
-21779,
-21815,
-21839,
-21842,
-21873,
-21885,
-21885,
-21885,
-21885,
-21885,
-21885,
-21885,
-21897,
-21920,
-21940,
-21943,
-21961,
-21972,
-21991,
-21999,
-21999,
-22012,
-22025,
-22034,
-22056,
-22059,
-22059,
-22062,
-22065,
-22081,
-22084,
-22096,
-22163,
-22193,
-22206,
-22209,
-22224,
-22249,
-22271,
-22274,
-22277,
-22317,
-22325,
-22325,
-22328,
-22334,
-22340,
-22351,
-22374,
-22383,
-22410,
-22436,
-22446,
-22469,
-22480,
-22483,
-22523,
-22540,
-22547,
-22563,
-22566,
-22591,
-22594,
-22594,
-22616,
-22622,
-22622,
-22656,
-22659,
-22667,
-22667,
-22681,
-22698,
-22705,
-22705,
-22721,
-22754,
-22770,
-22770,
-22795,
-22837,
-22854,
-22854,
-22884,
-22894,
-22894,
-22946,
-22946,
-22981,
-22989,
-22989,
-23005,
-23005,
-23034,
-23040,
-23058,
-23082,
-23097,
-23108,
-23108,
-23108,
-23108,
-23108,
-23119,
-23146,
-23154,
-23175,
-23175,
-23192,
-23215,
-23232,
-23270,
-23270,
-23270,
-23270,
-23297,
-23312,
-23330,
-23350,
-23354,
-23354,
-23361,
-23361,
-23361,
-23361,
-23361,
-23382,
-23382,
-23382,
-23392,
-23405,
-23405,
-23420,
-23420,
-23438,
-23438,
-23438,
-23450,
-23471,
-23483,
-23493,
-23493,
-23496,
-23496,
-23496,
-23510,
-23518,
-23537,
-23557,
-23564,
-23599,
-23618,
-23652,
-23659,
-23676,
-23676,
-23676,
-23690,
-23709,
-23737,
-23737,
-23755,
-23765,
-23765,
-23788,
-23792,
-23792,
-23792,
-23803,
-23821,
-23863,
-23863,
-23863,
-23879,
-23886,
-23911,
-23931,
-23944,
-23955,
-23955,
-23970,
-23974,
-23980,
-24006,
-24038,
-24044,
-24044,
-24044,
-24052,
-24052,
-24063,
-24063,
-24116,
-24135,
-24152,
-24193,
-24199,
-24223,
-24245,
-24245,
-24251,
-24272,
-24288,
-24288,
-24303,
-24323,
-24354,
-24360,
-24360,
-24391,
-24391,
-24391,
-24406,
-24406,
-24406,
-24415,
-24415,
-24433,
-24464,
-24464,
-24489,
-24506,
-24514,
-24524,
-24524,
-24545,
-24574,
-24587,
-24587,
-24593,
-24599,
-24626,
-24664,
-24664,
-24679,
-24688,
-24688,
-24688,
-24694,
-24712,
-24712,
-24724,
-24756,
-24794,
-24836,
-24836,
-24850,
-24880,
-24893,
-24902,
-24902,
-24943,
-24943,
-24965,
-24991,
-25023,
-25034,
-25034,
-25034,
-25051,
-25059,
-25059,
-25079,
-25089,
-25095,
-25102,
-25102,
-25102,
-25121,
-25121,
-25121,
-25128,
-25156,
-25166,
-25194,
-25201,
-25246,
-25246,
-25274,
-25274,
-25281,
-25302,
-25318,
-25326,
-25334,
-25356,
-25369,
-25369,
-25385,
-25385,
-25385,
-25385,
-25385,
-25385,
-25385,
-25385,
-25397,
-25430,
-25437,
-25480,
-25501,
-25501,
-25508,
-25573,
-25602,
-25621,
-25641,
-25665,
-25729,
-25734,
-25752,
-25783,
-25783,
-25783,
-25806,
-25821,
-25821,
-25838,
-25838,
-25856,
-25856,
-25861,
-25861,
-25867,
-25895,
-25895,
-25895,
-25902,
-25902,
-25910,
-25910,
-25917,
-25928,
-25944,
-25951,
-25965,
-25965,
-25972,
-25980,
-25984,
-25984,
-25984,
-26007,
-26042,
-26060,
-26070,
-26091,
-26102,
-26102,
-26124,
-26124,
-26144,
-26161,
-26161,
-26161,
-26176,
-26201,
-26232,
-26250,
-26287,
-26293,
-26316,
-26364,
-26371,
-26409,
-26409,
-26409,
-26409,
-26422,
-26422,
-26427,
-26427,
-26449,
-26449,
-26455,
-26460,
-26466,
-26483,
-26483,
-26502,
-26517,
-26529,
-26529,
-26548,
-26548,
-26590,
-26610,
-26645,
-26645,
-26658,
-26658,
-26694,
-26700,
-26715,
-26715,
-26715,
-26722,
-26730,
-26730,
-26730,
-26755,
-26755,
-26772,
-26772,
-26772,
-26792,
-26823,
-26823,
-26846,
-26846,
-26846,
-26846,
-26846,
-26846,
-26872,
-26920,
-26920,
-26920,
-26954,
-26954,
-26961,
-26970,
-26970,
-26976,
-26976,
-27005,
-27005,
-27049,
-27068,
-27068,
-27098,
-27112,
-27116,
-27116,
-27116,
-27116,
-27120,
-27139,
-27139,
-27139,
-27149,
-27170,
-27177,
-27198,
-27198,
-27234,
-27261,
-27261,
-27311,
-27311,
-27317,
-27317,
-27317,
-27351,
-27355,
-27355,
-27355,
-27355,
-27376,
-27376,
-27398,
-27398,
-27398,
-27427,
-27444,
-27444,
-27444,
-27454,
-27490,
-27503,
-27503,
-27517,
-27517,
-27527,
-27527,
-27545,
-27560,
-27566,
-27566,
-27566,
-27574,
-27574,
-27660,
-27667,
-27667,
-27720,
-27720,
-27732,
-27751,
-27751,
-27773,
-27782,
-27791,
-27791,
-27803,
-27815,
-27815,
-27828,
-27828,
-27868,
-27868,
-27868,
-27868,
-27868,
-27868,
-27868,
-27884,
-27884,
-27884,
-27895,
-27895,
-27914,
-27914,
-27919,
-27919,
-27962,
-27962,
-27962,
-28010,
-28017,
-28032,
-28058,
-28058,
-28063,
-28063,
-28063,
-28094,
-28106,
-28106,
-28156,
-28165,
-28175,
-28210,
-28263,
-28285,
-28285,
-28303,
-28323,
-28323,
-28323,
-28329,
-28350,
-28388,
-28413,
-28461,
-28461,
-28474,
-28497,
-28512,
-28522,
-28522,
-28551,
-28551,
-28581,
-28597,
-28597,
-28597,
-28597,
-28612,
-28624,
-28624,
-28652,
-28652,
-28657,
-28657,
-28685,
-28685,
-28685,
-28685,
-28685,
-28699,
-28720,
-28742,
-28742,
-28742,
-28742,
-28742,
-28755,
-28767,
-28767,
-28767,
-28767,
-28779,
-28779,
-28797,
-28819,
-28861,
-28868,
-28868,
-28902,
-28902,
-28902,
-28906,
-28925,
-28925,
-28941,
-28959,
-28959,
-28959,
-28981,
-28981,
-28994,
-28998,
-28998,
-29004,
-29004,
-29004,
-29016,
-29016,
-29016,
-29016,
-29016,
-29030,
-29047,
-29047,
-29047,
-29065,
-29080,
-29080,
-29093,
-29127,
-29157,
-29171,
-29191,
-29191,
-29202,
-29224,
-29224,
-29247,
-29247,
-29264,
-29277,
-29277,
-29281,
-29281,
-29281,
-29281,
-29296,
-29337,
-29350,
-29350,
-29357,
-29364,
-29373,
-29373,
-29383,
-29383,
-29383,
-29392,
-29402,
-29448,
-29448,
-29466,
-29466,
-29492,
-29492,
-29500,
-29544,
-29544,
-29564,
-29599,
-29612,
-29612,
-29625,
-29639,
-29648,
-29676,
-29689,
-29701,
-29701,
-29701,
-29701,
-29743,
-29750,
-29750,
-29750,
-29761,
-29797,
-29812,
-29812,
-29812,
-29812,
-29812,
-29839,
-29839,
-29845,
-29845,
-29851,
-29851,
-29887,
-29908,
-29908,
-29908,
-29926,
-29938,
-29938,
-29949,
-29949,
-29972,
-29972,
-29972,
-29991,
-29997,
-29997,
-29997,
-29997,
-30004,
-30004,
-30004,
-30017,
-30025,
-30025,
-30025,
-30032,
-30032,
-30032,
-30032,
-30032,
-30032,
-30032,
-30032,
-30054,
-30054,
-30072,
-30088,
-30102,
-30102,
-30102,
-30106,
-30106,
-30122,
-30122,
-30141,
-30141,
-30141,
-30165,
-30187,
-30187,
-30187,
-30193,
-30193,
-30203,
-30203,
-30214,
-30221,
-30235,
-30235,
-30235,
-30242,
-30268,
-30268,
-30277,
-30277,
-30307,
-30314,
-30319,
-30336,
-30336,
-30363,
-30363,
-30363,
-30363,
-30363,
-30395,
-30401,
-30401,
-30401,
-30410,
-30431,
-30446,
-30446,
-30484,
-30484,
-30484,
-30484,
-30527,
-30546,
-30546,
-30560,
-30571,
-30612,
-30635,
-30646,
-30657,
-30657,
-30688,
-30703,
-30703,
-30735,
-30735,
-30752,
-30760,
-30786,
-30786,
-30786,
-30805,
-30805,
-30815,
-30836,
-30836,
-30836,
-30836,
-30861,
-30869,
-30876,
-30876,
-30915,
-30937,
-30943,
-30958,
-30979,
-30979,
-30979,
-30979,
-30979,
-30994,
-31023,
-31023,
-31040,
-31065,
-31075,
-31109,
-31116,
-31116,
-31157,
-31178,
-31227,
-31255,
-31255,
-31262,
-31287,
-31287,
-31306,
-31313,
-31313,
-31333,
-31333,
-31333,
-31333,
-31333,
-31348,
-31348,
-31364,
-31364,
-31364,
-31364,
-31364,
-31364,
-31383,
-31402,
-31418,
-31433,
-31445,
-31467,
-31474,
-31505,
-31549,
-31549,
-31556,
-31586,
-31586,
-31621,
-31631,
-31631,
-31665,
-31678,
-31678,
-31721,
-31721,
-31760,
-31786,
-31786,
-31796,
-31811,
-31854,
-31854,
-31871,
-31871,
-31871,
-31881,
-31918,
-31918,
-31928,
-31928,
-31928,
-31937,
-31937,
-31937,
-31937,
-31937,
-31937,
-31937,
-31945,
-31958,
-31972,
-31984,
-31991,
-31991,
-32000,
-32000,
-32008,
-32008,
-32008,
-32032,
-32062,
-32062,
-32104,
-32120,
-32147,
-32158,
-32158,
-32174,
-32212,
-32222,
-32241,
-32252,
-32260,
-32282,
-32282,
-32286,
-32327,
-32346,
-32384,
-32384,
-32396,
-32396,
-32415,
-32415,
-32415,
-32415,
-32432,
-32432,
-32442,
-32452,
-32489,
-32506,
-32519,
-32573,
-32573,
-32590,
-32597,
-32604,
-32604,
-32620,
-32643,
-32650,
-32660,
-32680,
-32713,
-32750,
-32773,
-32780,
-32780,
-32780,
-32813,
-32833,
-32864,
-32874,
-32874,
-32893,
-32903,
-32910,
-32923,
-32969,
-32994,
-32994,
-33001,
-33008,
-33015,
-33022,
-33032,
-33045,
-33052,
-33113,
-33139,
-33150,
-33171,
-33183,
-33206,
-33264,
-33307,
-33319,
-33319,
-33338,
-33345,
-33364,
-33388,
-33388,
-33400,
-33400,
-33400,
-33414,
-33457,
-33464,
-33476,
-33503,
-33550,
-33550,
-33560,
-33573,
-33573,
-33580,
-33585,
-33585,
-33585,
-33607,
-33607,
-33614,
-33622,
-33669,
-33710,
-33710,
-33736,
-33760,
-33760,
-33771,
-33792,
-33804,
-33823,
-33823,
-33823,
-33830,
-33867,
-33872,
-33889,
-33894,
-33900,
-33900,
-33924,
-33924,
-33953,
-33978,
-33997,
-34005,
-34017,
-34024,
-34048,
-34087,
-34093,
-34118,
-34130,
-34139,
-34146,
-34161,
-34180,
-34197,
-34204,
-34214,
-34221,
-34221,
-34238,
-34254,
-34261,
-34261,
-34268,
-34275,
-34280,
-34310,
-34326,
-34350,
-34419,
-34426,
-34466,
-34476,
-34506,
-34506,
-34520,
-34520,
-34527,
-34527,
-34534,
-34546,
-34546,
-34560,
-34590,
-34599,
-34612,
-34612,
-34612,
-34628,
-34647,
-34659,
-34702,
-34751,
-34772,
-34799,
-34815,
-34815,
-34860,
-34903,
-34915,
-34915,
-34932,
-34947,
-34947,
-34953,
-34953,
-34967,
-34983,
-34993,
-35016,
-35033,
-35077,
-35086,
-35103,
-35125,
-35143,
-35150,
-35150,
-35150,
-35150,
-35177,
-35177,
-35177,
-35204,
-35239,
-35246,
-35253,
-35253,
-35265,
-35277,
-35328,
-35328,
-35348,
-35355,
-35385,
-35385,
-35397,
-35397,
-35397,
-35397,
-35408,
-35463,
-35463,
-35463,
-35463,
-35480,
-35487,
-35511,
-35553,
-35553,
-35560,
-35591,
-35591,
-35606,
-35625,
-35645,
-35657,
-35696,
-35703,
-35710,
-35717,
-35744,
-35764,
-35771,
-35785,
-35785,
-35785,
-35827,
-35852,
-35892,
-35918,
-35918,
-35924,
-35954,
-35976,
-35986,
-35986,
-36029,
-36042,
-36047,
-36047,
-36092,
-36132,
-36132,
-36153,
-36163,
-36174,
-36180,
-36203,
-36203,
-36218,
-36218,
-36225,
-36255,
-36255,
-36262,
-36285,
-36307,
-36333,
-36356,
-36396,
-36410,
-36433,
-36433,
-36473,
-36480,
-36528,
-36535,
-36551,
-36563,
-36577,
-36602,
-36638,
-36648,
-36663,
-36679,
-36679,
-36707,
-36707,
-36721,
-36721,
-36733,
-36757,
-36773,
-36802,
-36839,
-36883,
-36899,
-36911,
-36931,
-36954,
-36954,
-36969,
-37016,
-37034,
-37034,
-37053,
-37065,
-37080,
-37104,
-37136,
-37136,
-37152,
-37159,
-37177,
-37223,
-37254,
-37280,
-37298,
-37312,
-37319,
-37355,
-37380,
-37380,
-37406,
-37431,
-37455,
-37470,
-37476,
-37503,
-37542,
-37561,
-37561,
-37573,
-37596,
-37615,
-37634,
-37634,
-37653,
-37660,
-37660,
-37713,
-37738,
-37751,
-37794,
-37824,
-37837,
-37837,
-37853,
-37853,
-37859,
-37859,
-37888,
-37895,
-37895,
-37911,
-37933,
-37940,
-37959,
-37976,
-37988,
-38000,
-38033,
-38040,
-38040,
-38040,
-38046,
-38075,
-38075,
-38089,
-38098,
-38102,
-38145,
-38158,
-38165,
-38193,
-38193,
-38228,
-38275,
-38279,
-38290,
-38300,
-38300,
-38320,
-38320,
-38340,
-38363,
-38363,
-38370,
-38381,
-38386,
-38397,
-38412,
-38412,
-38422,
-38422,
-38464,
-38491,
-38491,
-38491,
-38491,
-38510,
-38510,
-38519,
-38519,
-38519,
-38519,
-38526,
-38552,
-38573,
-38612,
-38618,
-38618,
-38636,
-38641,
-38641,
-38646,
-38658,
-38670,
-38688,
-38695,
-38719,
-38746,
-38746,
-38774,
-38774,
-38778,
-38790,
-38795,
-38795,
-38838,
-38838,
-38849,
-38849,
-38849,
-38849,
-38862,
-38862,
-38862,
-38862,
-38878,
-38918,
-38926,
-38941,
-38941,
-38951,
-38976,
-38993,
-38999,
-39017,
-39033,
-39051,
-39051,
-39051,
-39051,
-39065,
-39107,
-39107,
-39107,
-39112,
-39125,
-39143,
-39160,
-39181,
-39199,
-39210,
-39224,
-39224,
-39228,
-39247,
-39255,
-39255,
-39297,
-39297,
-39297,
-39311,
-39320,
-39337,
-39337,
-39361,
-39370,
-39370,
-39376,
-39385,
-39391,
-39391,
-39397,
-39403,
-39423,
-39427,
-39437,
-39463,
-39463,
-39487,
-39487,
-39487,
-39487,
-39501,
-39501,
-39514,
-39520,
-39527,
-39527,
-39527,
-39531,
-39531,
-39560,
-39560,
-39593,
-39593,
-39593,
-39617,
-39630,
-39647,
-39660,
-39660,
-39676,
-39686,
-39699,
-39737,
-39761,
-39761,
-39769,
-39792,
-39810,
-39845,
-39854,
-39878,
-39900,
-39906,
-39906,
-39951,
-39951,
-39951,
-39951,
-39975,
-40011,
-40011,
-40044,
-40062,
-40062,
-40062,
-40062,
-40090,
-40100,
-40115,
-40115,
-40115,
-40115,
-40119,
-40124,
-40154,
-40174,
-40178,
-40182,
-40182,
-40182,
-40182,
-40182,
-40216,
-40216,
-40216,
-40216,
-40216,
-40216,
-40231,
-40242,
-40261,
-40267,
-40290,
-40302,
-40327,
-40353,
-40353,
-40357,
-40374,
-40408,
-40408,
-40408,
-40412,
-40412,
-40443,
-40464,
-40464,
-40464,
-40464,
-40474,
-40474,
-40493,
-40514,
-40514,
-40514,
-40532,
-40568,
-40593,
-40593,
-40593,
-40610,
-40624,
-40645,
-40655,
-40655,
-40675,
-40694,
-40699,
-40699,
-40699,
-40738,
-40738,
-40758,
-40770,
-40776,
-40776,
-40793,
-40817,
-40823,
-40828,
-40866,
-40891,
-40904,
-40933,
-40944,
-40953,
-40953,
-40963,
-40969,
-40969,
-40969,
-40976,
-40976,
-40976,
-40976,
-40983,
-40983,
-40998,
-40998,
-41016,
-41016,
-41026,
-41044,
-41070,
-41105,
-41116,
-41162,
-41177,
-41223,
-41223,
-41223,
-41223,
-41231,
-41231,
-41231,
-41231,
-41257,
-41273,
-41273,
-41292,
-41308,
-41308,
-41331,
-41346,
-41364,
-41364,
-41364,
-41376,
-41376,
-41382,
-41388,
-41388,
-41388,
-41388,
-41388,
-41401,
-41417,
-41433,
-41446,
-41466,
-41488,
-41488,
-41521,
-41534,
-41577,
-41577,
-41593,
-41604,
-41625,
-41665,
-41665,
-41678,
-41678,
-41678,
-41696,
-41720,
-41737,
-41755,
-41771,
-41805,
-41811,
-41811,
-41830,
-41891,
-41891,
-41920,
-41920,
-41926,
-41947,
-41999,
-41999,
-41999,
-41999,
-42010,
-42042,
-42042,
-42048,
-42059,
-42076,
-42076,
-42093,
-42100,
-42100,
-42120,
-42120,
-42128,
-42151,
-42168,
-42181,
-42215,
-42233,
-42233,
-42233,
-42233,
-42233,
-42233,
-42239,
-42268,
-42297,
-42312,
-42318,
-42326,
-42326,
-42331,
-42345,
-42356,
-42356,
-42356,
-42374,
-42382,
-42400,
-42409,
-42409,
-42423,
-42423,
-42441,
-42470,
-42470,
-42482,
-42495,
-42513,
-42513,
-42520,
-42524,
-42541,
-42541,
-42596,
-42609,
-42609,
-42616,
-42635,
-42651,
-42681,
-42725,
-42744,
-42767,
-42767,
-42773,
-42805,
-42805,
-42805,
-42805,
-42805,
-42805,
-42830,
-42841,
-42852,
-42866,
-42883,
-42883,
-42883,
-42883,
-42883,
-42894,
-42932,
-42932,
-42975,
-42975,
-43001,
-43009,
-43009,
-43009,
-43009,
-43019,
-43035,
-43035,
-43055,
-43055,
-43055,
-43061,
-43061,
-43061,
-43067,
-43073,
-43096,
-43120,
-43136,
-43136,
-43160,
-43160,
-43160,
-43160,
-43160,
-43169,
-43169,
-43169,
-43181,
-43195,
-43204,
-43216,
-43240,
-43261,
-43290,
-43290,
-43307,
-43324,
-43337,
-43337,
-43337,
-43337,
-43346,
-43357,
-43398,
-43409,
-43417,
-43428,
-43467,
-43467,
-43467,
-43467,
-43488,
-43497,
-43538,
-43550,
-43571,
-43571,
-43586,
-43606,
-43606,
-43606,
-43606,
-43634,
-43634,
-43668,
-43668,
-43668,
-43668,
-43682,
-43713,
-43733,
-43733,
-43740,
-43760,
-43760,
-43780,
-43815,
-43833,
-43879,
-43904,
-43904,
-43904,
-43920,
-43927,
-43933,
-43933,
-43933,
-43951,
-43956,
-43978,
-43978,
-43978,
-44003,
-44003,
-44023,
-44034,
-44054,
-44054,
-44060,
-44075,
-44075,
-44089,
-44089,
-44089,
-44110,
-44128,
-44134,
-44155,
-44162,
-44189,
-44189,
-44189,
-44189,
-44212,
-44240,
-44240,
-44240,
-44255,
-44255,
-44255,
-44265,
-44297,
-44297,
-44297,
-44304,
-44304,
-44304,
-44304,
-44304,
-44304,
-44332,
-44332,
-44347,
-44347,
-44347,
-44368,
-44389,
-44407,
-44407,
-44451,
-44467,
-44486,
-44486,
-44486,
-44486,
-44503,
-44503,
-44547,
-44559,
-44570,
-44570,
-44570,
-44582,
-44610,
-44610,
-44610,
-44620,
-44620,
-44620,
-44620,
-44632,
-44632,
-44636,
-44642,
-44649,
-44699,
-44699,
-44720,
-44733,
-44738,
-44750,
-44750,
-44750,
-44750,
-44750,
-44750,
-44750,
-44765,
-44765,
-44765,
-44774,
-44774,
-44774,
-44774,
-44774,
-44787,
-44798,
-44798,
-44798,
-44813,
-44846,
-44846,
-44867,
-44867,
-44867,
-44867,
-44867,
-44867,
-44877,
-44889,
-44896,
-44896,
-44896,
-44896,
-44896,
-44896,
-44896,
-44896,
-44907,
-44920,
-44931,
-44944,
-44944,
-44951,
-44956,
-44956,
-44975,
-44975,
-44999,
-45017,
-45017,
-45017,
-45034,
-45034,
-45034,
-45034,
-45038,
-45044,
-45048,
-45048,
-45060,
-45093,
-45093,
-45112,
-45121,
-45121,
-45121,
-45128,
-45128,
-45157,
-45157,
-45157,
-45178,
-45190,
-45190,
-45190,
-45190,
-45204,
-45220,
-45239,
-45239,
-45260,
-45283,
-45295,
-45309,
-45345,
-45352,
-45352,
-45352,
-45352,
-45352,
-45352,
-45352,
-45357,
-45357,
-45357,
-45357,
-45371,
-45371,
-45371,
-45371,
-45438,
-45449,
-45467,
-45497,
-45522,
-45530,
-45535,
-45544,
-45544,
-45554,
-45574,
-45574,
-45590,
-45614,
-45614,
-45614,
-45618,
-45638,
-45653,
-45671,
-45687,
-45687,
-45687,
-45709,
-45739,
-45746,
-45746,
-45752,
-45763,
-45781,
-45803,
-45803,
-45821,
-45821,
-45843,
-45867,
-45867,
-45867,
-45885,
-45885,
-45885,
-45912,
-45912,
-45917,
-45934,
-45944,
-45944,
-45953,
-45996,
-46009,
-46016,
-46031,
-46051,
-46051,
-46070,
-46086,
-46086,
-46096,
-46109,
-46115,
-46115,
-46115,
-46115,
-46115,
-46119,
-46119,
-46119,
-46127,
-46140,
-46150,
-46159,
-46169,
-46190,
-46190,
-46194,
-46203,
-46211,
-46226,
-46226,
-46226,
-46240,
-46279,
-46290,
-46302,
-46324,
-46331,
-46350,
-46368,
-46390,
-46390,
-46434,
-46434,
-46457,
-46473,
-46484,
-46484,
-46484,
-46484,
-46534,
-46534,
-46540,
-46553,
-46596,
-46596,
-46596,
-46596,
-46625,
-46625,
-46661,
-46661,
-46661,
-46669,
-46704,
-46704,
-46721,
-46731,
-46731,
-46731,
-46731,
-46731,
-46799,
-46805,
-46834,
-46845,
-46845,
-46858,
-46868,
-46885,
-46924,
-46946,
-46946,
-46965,
-46981,
-46981,
-46992,
-46992,
-46992,
-46992,
-46992,
-47006,
-47006,
-47015,
-47015,
-47019,
-47019,
-47031,
-47031,
-47031,
-47058,
-47058,
-47078,
-47078,
-47106,
-47142,
-47142,
-47142,
-47142,
-47142,
-47184,
-47208,
-47247,
-47254,
-47269,
-47279,
-47286,
-47298,
-47298,
-47298,
-47298,
-47322,
-47336,
-47350,
-47367,
-47367,
-47388,
-47406,
-47445,
-47472,
-47472,
-47484,
-47522,
-47530,
-47537,
-47547,
-47547,
-47547,
-47582,
-47582,
-47592,
-47608,
-47627,
-47642,
-47642,
-47642,
-47649,
-47649,
-47649,
-47694,
-47714,
-47733,
-47747,
-47761,
-47779,
-47779,
-47790,
-47798,
-47798,
-47798,
-47809,
-47809,
-47809,
-47814,
-47814,
-47822,
-47839,
-47864,
-47882,
-47889,
-47924,
-47935,
-47935,
-47946,
-47946,
-47963,
-47963,
-47967,
-47967,
-47967,
-47989,
-47989,
-48024,
-48024,
-48024,
-48024,
-48035,
-48047,
-48053,
-48065,
-48065,
-48094,
-48113,
-48118,
-48118,
-48118,
-48118,
-48137,
-48173,
-48196,
-48196,
-48196,
-48217,
-48226,
-48244,
-48251,
-48280,
-48290,
-48290,
-48305,
-48337,
-48358,
-48369,
-48378,
-48378,
-48393,
-48398,
-48398,
-48403,
-48424,
-48431,
-48431,
-48431,
-48431,
-48431,
-48437,
-48437,
-48455,
-48461,
-48470,
-48470,
-48470,
-48486,
-48496,
-48514,
-48514,
-48528,
-48556,
-48611,
-48615,
-48624,
-48656,
-48656,
-48667,
-48667,
-48667,
-48684,
-48697,
-48732,
-48760,
-48773,
-48796,
-48812,
-48836,
-48836,
-48870,
-48892,
-48899,
-48899,
-48899,
-48927,
-48943,
-48943,
-48948,
-48948,
-48953,
-48969,
-48982,
-49001,
-49015,
-49033,
-49033,
-49048,
-49054,
-49070,
-49070,
-49106,
-49117,
-49134,
-49148,
-49148,
-49148,
-49154,
-49164,
-49164,
-49199,
-49199,
-49199,
-49230,
-49230,
-49230,
-49245,
-49255,
-49272,
-49282,
-49282,
-49316,
-49328,
-49328,
-49342,
-49355,
-49423,
-49450,
-49450,
-49476,
-49476,
-49476,
-49476,
-49476,
-49502,
-49502,
-49514,
-49514,
-49514,
-49519,
-49525,
-49549,
-49559,
-49559,
-49606,
-49615,
-49630,
-49642,
-49648,
-49648,
-49689,
-49689,
-49700,
-49707,
-49720,
-49727,
-49727,
-49744,
-49744,
-49744,
-49757,
-49775,
-49789,
-49789,
-49803,
-49823,
-49831,
-49831,
-49831,
-49831,
-49831,
-49855,
-49866,
-49866,
-49875,
-49888,
-49888,
-49896,
-49896,
-49896,
-49896,
-49896,
-49896,
-49917,
-49917,
-49922,
-49942,
-49942,
-49956,
-49962,
-49962,
-49988,
-50007,
-50007,
-50040,
-50040,
-50040,
-50071,
-50071,
-50071,
-50071,
-50071,
-50071,
-50079,
-50115,
-50145,
-50168,
-50168,
-50168,
-50188,
-50204,
-50204,
-50204,
-50204,
-50211,
-50211,
-50231,
-50237,
-50247,
-50247,
-50283,
-50283,
-50289,
-50289,
-50311,
-50328,
-50344,
-50344,
-50355,
-50366,
-50366,
-50372,
-50399,
-50399,
-50399,
-50405,
-50405,
-50405,
-50440,
-50440,
-50461,
-50461,
-50461,
-50486,
-50486,
-50486,
-50493,
-50511,
-50526,
-50554,
-50554,
-50554,
-50554,
-50554,
-50554,
-50554,
-50581,
-50581,
-50606,
-50635,
-50635,
-50641,
-50677,
-50700,
-50700,
-50721,
-50731,
-50731,
-50731,
-50731,
-50761,
-50769,
-50769,
-50791,
-50807,
-50845,
-50845,
-50845,
-50857,
-50876,
-50876,
-50887,
-50887,
-50912,
-50912,
-50912,
-50932,
-50969,
-50969,
-51000,
-51010,
-51010,
-51015,
-51015,
-51015,
-51015,
-51032,
-51032,
-51032,
-51065,
-51080,
-51116,
-51116,
-51116,
-51132,
-51132,
-51158,
-51164,
-51171,
-51171,
-51171,
-51190,
-51190,
-51201,
-51226,
-51226,
-51241,
-51254,
-51254,
-51273,
-51279,
-51279,
-51288,
-51307,
-51307,
-51312,
-51312,
-51326,
-51333,
-51355,
-51378,
-51425,
-51448,
-51460,
-51474,
-51479,
-51499,
-51528,
-51528,
-51528,
-51541,
-51541,
-51548,
-51596,
-51616,
-51616,
-51623,
-51651,
-51651,
-51658,
-51658,
-51677,
-51677,
-51695,
-51702,
-51718,
-51733,
-51733,
-51769,
-51791,
-51798,
-51816,
-51839,
-51855,
-51884,
-51888,
-51895,
-51908,
-51936,
-51949,
-51956,
-51975,
-51982,
-51992,
-51992,
-51992,
-51992,
-51992,
-52016,
-52016,
-52049,
-52063,
-52070,
-52070,
-52082,
-52099,
-52118,
-52144,
-52158,
-52167,
-52183,
-52183,
-52216,
-52216,
-52238,
-52283,
-52290,
-52303,
-52312,
-52337,
-52354,
-52370,
-52384,
-52427,
-52427,
-52448,
-52458,
-52458,
-52511,
-52518,
-52518,
-52533,
-52549,
-52557,
-52568,
-52615,
-52656,
-52719,
-52719,
-52735,
-52748,
-52773,
-52785,
-52785,
-52790,
-52790,
-52805,
-52805,
-52814,
-52838,
-52867,
-52867,
-52873,
-52931,
-52931,
-52968,
-52976,
-52976,
-52976,
-52983,
-52983,
-53001,
-53024,
-53024,
-53024,
-53038,
-53074,
-53084,
-53091,
-53114,
-53114,
-53136,
-53143,
-53173,
-53196,
-53196,
-53213,
-53225,
-53263,
-53281,
-53281,
-53281,
-53309,
-53330,
-53330,
-53348,
-53348,
-53355,
-53368,
-53368,
-53385,
-53410,
-53417,
-53424,
-53424,
-53439,
-53439,
-53439,
-53462,
-53462,
-53462,
-53462,
-53462,
-53462,
-53480,
-53497,
-53534,
-53556,
-53583,
-53583,
-53602,
-53602,
-53624,
-53628,
-53648,
-53659,
-53663,
-53663,
-53682,
-53689,
-53704,
-53716,
-53727,
-53762,
-53769,
-53769,
-53778,
-53778,
-53785,
-53824,
-53878,
-53889,
-53918,
-53918,
-53918,
-53953,
-53975,
-53975,
-53992,
-54020,
-54042,
-54049,
-54056,
-54078,
-54085,
-54085,
-54113,
-54124,
-54131,
-54138,
-54144,
-54184,
-54211,
-54211,
-54217,
-54224,
-54231,
-54270,
-54277,
-54316,
-54349,
-54349,
-54365,
-54372,
-54393,
-54416,
-54416,
-54464,
-54470,
-54470,
-54484,
-54491,
-54491,
-54501,
-54501,
-54530,
-54530,
-54537,
-54555,
-54568,
-54603,
-54603,
-54624,
-54658,
-54662,
-54675,
-54685,
-54691,
-54696,
-54696,
-54711,
-54711,
-54711,
-54751,
-54778,
-54782,
-54789,
-54796,
-54810,
-54823,
-54823,
-54823,
-54861,
-54868,
-54875,
-54882,
-54882,
-54902,
-54908,
-54946,
-54953,
-54953,
-54953,
-54953,
-54978,
-54978,
-54989,
-55015,
-55015,
-55015,
-55015,
-55029,
-55037,
-55037,
-55093,
-55106,
-55129,
-55129,
-55129,
-55149,
-55172,
-55172,
-55211,
-55220,
-55227,
-55249,
-55263,
-55295,
-55314,
-55321,
-55335,
-55361,
-55361,
-55382,
-55398,
-55405,
-55441,
-55469,
-55484,
-55484,
-55500,
-55500,
-55515,
-55522,
-55532,
-55532,
-55551,
-55558,
-55583,
-55590,
-55590,
-55611,
-55618,
-55649,
-55656,
-55720,
-55740,
-55777,
-55777,
-55802,
-55802,
-55827,
-55873,
-55889,
-55889,
-55889,
-55896,
-55896,
-55896,
-55915,
-55925,
-55925,
-55934,
-55972,
-55979,
-55989,
-55996,
-55996,
-55996,
-56024,
-56039,
-56078,
-56096,
-56111,
-56146,
-56192,
-56202,
-56222,
-56236,
-56277,
-56291,
-56335,
-56376,
-56376,
-56402,
-56402,
-56417,
-56425,
-56435,
-56468,
-56476,
-56488,
-56499,
-56506,
-56506,
-56531,
-56538,
-56561,
-56561,
-56561,
-56561,
-56561,
-56561,
-56561,
-56561,
-56569,
-56569,
-56577,
-56585,
-56594,
-56594,
-56594,
-56617,
-56625,
-56650,
-56660,
-56673,
-56716,
-56740,
-56745,
-56757,
-56769,
-56769,
-56769,
-56797,
-56822,
-56838,
-56838,
-56858,
-56858,
-56867,
-56879,
-56879,
-56911,
-56955,
-56976,
-57002,
-57027,
-57034,
-57054,
-57064,
-57064,
-57064,
-57078,
-57085,
-57085,
-57114,
-57114,
-57121,
-57121,
-57121,
-57121,
-57129,
-57155,
-57155,
-57193,
-57220,
-57224,
-57244,
-57244,
-57272,
-57287,
-57305,
-57348,
-57348,
-57355,
-57366,
-57412,
-57420,
-57455,
-57455,
-57455,
-57455,
-57466,
-57477,
-57477,
-57477,
-57497,
-57508,
-57523,
-57539,
-57566,
-57582,
-57612,
-57616,
-57616,
-57634,
-57634,
-57662,
-57686,
-57686,
-57698,
-57708,
-57745,
-57759,
-57798,
-57798,
-57827,
-57840,
-57840,
-57840,
-57850,
-57876,
-57876,
-57876,
-57918,
-57927,
-57927,
-57940,
-57986,
-57994,
-58009,
-58029,
-58029,
-58045,
-58045,
-58071,
-58071,
-58071,
-58093,
-58114,
-58114,
-58114,
-58150,
-58150,
-58174,
-58174,
-58207,
-58217,
-58225,
-58241,
-58258,
-58281,
-58292,
-58304,
-58319,
-58329,
-58351,
-58407,
-58417,
-58439,
-58439,
-58439,
-58475,
-58483,
-58504,
-58513,
-58523,
-58523,
-58527,
-58558,
-58602,
-58602,
-58625,
-58625,
-58649,
-58692,
-58721,
-58721,
-58721,
-58729,
-58739,
-58739,
-58758,
-58771,
-58802,
-58802,
-58802,
-58819,
-58841,
-58854,
-58872,
-58889,
-58910,
-58921,
-58921,
-58921,
-58921,
-58957,
-58957,
-58965,
-58971,
-58971,
-58979,
-58979,
-58979,
-59003,
-59003,
-59022,
-59032,
-59032,
-59032,
-59057,
-59068,
-59068,
-59068,
-59068,
-59068,
-59068,
-59068,
-59076,
-59080,
-59103,
-59120,
-59120,
-59120,
-59120,
-59126,
-59135,
-59151,
-59158,
-59158,
-59184,
-59216,
-59244,
-59259,
-59265,
-59277,
-59284,
-59306,
-59338,
-59338,
-59363,
-59363,
-59363,
-59377,
-59386,
-59386,
-59386,
-59386,
-59411,
-59433,
-59453,
-59480,
-59489,
-59489,
-59495,
-59513,
-59526,
-59548,
-59548,
-59556,
-59566,
-59566,
-59566,
-59583,
-59594,
-59622,
-59643,
-59643,
-59643,
-59648,
-59648,
-59700,
-59740,
-59740,
-59758,
-59769,
-59774,
-59774,
-59774,
-59774,
-59787,
-59822,
-59837,
-59837,
-59845,
-59850,
-59863,
-59863,
-59863,
-59869,
-59869,
-59928,
-59936,
-59953,
-59966,
-59981,
-59981,
-59997,
-60012,
-60049,
-60049,
-60108,
-60123,
-60123,
-60130,
-60164,
-60171,
-60171,
-60171,
-60171,
-60171,
-60171,
-60176,
-60199,
-60217,
-60229,
-60240,
-60240,
-60240,
-60240,
-60248,
-60262,
-60262,
-60284,
-60309,
-60324,
-60329,
-60412,
-60421,
-60421,
-60436,
-60436,
-60457,
-60481,
-60481,
-60481,
-60517,
-60525,
-60525,
-60541,
-60567,
-60575,
-60613,
-60613,
-60642,
-60663,
-60691,
-60727,
-60727,
-60744,
-60759,
-60778,
-60794,
-60809,
-60824,
-60824,
-60834,
-60834,
-60853,
-60878,
-60878,
-60878,
-60878,
-60907,
-60907,
-60907,
-60907,
-60937,
-60948,
-60990,
-60990,
-61014,
-61041,
-61041,
-61049,
-61049,
-61049,
-61062,
-61062,
-61062,
-61078,
-61078,
-61078,
-61092,
-61098,
-61132,
-61150,
-61150,
-61150,
-61150,
-61156,
-61170,
-61178,
-61187,
-61187,
-61187,
-61187,
-61194,
-61217,
-61234,
-61257,
-61257,
-61257,
-61285,
-61285,
-61292,
-61309,
-61333,
-61371,
-61371,
-61386,
-61393,
-61426,
-61450,
-61450,
-61450,
-61466,
-61466,
-61466,
-61481,
-61481,
-61481,
-61481,
-61481,
-61481,
-61500,
-61538,
-61538,
-61538,
-61584,
-61592,
-61624,
-61651,
-61651,
-61651,
-61685,
-61696,
-61711,
-61711,
-61711,
-61711,
-61761,
-61767,
-61783,
-61817,
-61842,
-61842,
-61842,
-61856,
-61856,
-61896,
-61896,
-61896,
-61959,
-61959,
-61959,
-61968,
-61992,
-62025,
-62025,
-62025,
-62040,
-62072,
-62072,
-62072,
-62072,
-62072,
-62078,
-62078,
-62099,
-62123,
-62131,
-62171,
-62171,
-62171,
-62171,
-62171,
-62171,
-62180,
-62233,
-62233,
-62253,
-62253,
-62284,
-62303,
-62318,
-62318,
-62331,
-62338,
-62378,
-62378,
-62378,
-62378,
-62390,
-62395,
-62395,
-62395,
-62395,
-62395,
-62402,
-62402,
-62423,
-62430,
-62447,
-62454,
-62454,
-62486,
-62486,
-62486,
-62509,
-62522,
-62522,
-62522,
-62522,
-62522,
-62547,
-62547,
-62575,
-62597,
-62644,
-62669,
-62686,
-62692,
-62700,
-62736,
-62782,
-62782,
-62812,
-62812,
-62830,
-62834,
-62834,
-62847,
-62866,
-62878,
-62897,
-62912,
-62928,
-62928,
-62928,
-62928,
-62945,
-62952,
-62987,
-62987,
-63023,
-63023,
-63044,
-63044,
-63044,
-63054,
-63065,
-63081,
-63081,
-63081,
-63095,
-63126,
-63154,
-63154,
-63171,
-63171,
-63185,
-63185,
-63185,
-63231,
-63231,
-63252,
-63252,
-63261,
-63261,
-63261,
-63261,
-63269,
-63269,
-63297,
-63297,
-63321,
-63342,
-63342,
-63377,
-63388,
-63401,
-63414,
-63432,
-63432,
-63432,
-63439,
-63439,
-63444,
-63487,
-63497,
-63516,
-63516,
-63545,
-63567,
-63574,
-63585,
-63599,
-63626,
-63626,
-63650,
-63650,
-63709,
-63709,
-63736,
-63757,
-63787,
-63806,
-63821,
-63838,
-63861,
-63868,
-63875,
-63875,
-63891,
-63940,
-63940,
-63940,
-63959,
-63973,
-63973,
-64013,
-64020,
-64020,
-64049,
-64081,
-64099,
-64099,
-64118,
-64118,
-64143,
-64143,
-64155,
-64155,
-64155,
-64155,
-64173,
-64173,
-64193,
-64214,
-64227,
-64227,
-64234,
-64252,
-64262,
-64297,
-64332,
-64349,
-64356,
-64363,
-64370,
-64380,
-64387,
-64394,
-64412,
-64419,
-64436,
-64447,
-64472,
-64472,
-64501,
-64515,
-64515,
-64515,
-64529,
-64547,
-64556,
-64563,
-64573,
-64580,
-64580,
-64580,
-64659,
-64666,
-64688,
-64688,
-64688,
-64695,
-64709,
-64736,
-64736,
-64736,
-64751,
-64751,
-64758,
-64789,
-64799,
-64799,
-64826,
-64849,
-64856,
-64876,
-64899,
-64910,
-64916,
-64923,
-64947,
-64957,
-64993,
-65010,
-65055,
-65055,
-65066,
-65083,
-65101,
-65105,
-65125,
-65129,
-65167,
-65181,
-65188,
-65188,
-65198,
-65229,
-65264,
-65271,
-65306,
-65333,
-65340,
-65340,
-65395,
-65395,
-65395,
-65411,
-65420,
-65437,
-65448,
-65455,
-65462,
-65479,
-65489,
-65489,
-65489,
-65514,
-65514,
-65514,
-65514,
-65532,
-65532,
-65537,
-65556,
-65567,
-65574,
-65609,
-65623,
-65645,
-65659,
-65659,
-65659,
-65659,
-65687,
-65694,
-65713,
-65720,
-65720,
-65727,
-65727,
-65734,
-65741,
-65748,
-65766,
-65800,
-65800,
-65800,
-65826,
-65826,
-65847,
-65854,
-65854,
-65878,
-65895,
-65916,
-65954,
-65973,
-66014,
-66037,
-66037,
-66037,
-66050,
-66070,
-66084,
-66084,
-66084,
-66091,
-66098,
-66122,
-66129,
-66129,
-66182,
-66189,
-66196,
-66214,
-66221,
-66221,
-66221,
-66249,
-66249,
-66249,
-66270,
-66286,
-66286,
-66286,
-66312,
-66312,
-66352,
-66397,
-66397,
-66403,
-66432,
-66432,
-66439,
-66449,
-66471,
-66493,
-66502,
-66520,
-66530,
-66585,
-66585,
-66595,
-66612,
-66647,
-66654,
-66680,
-66699,
-66724,
-66750,
-66750,
-66777,
-66804,
-66811,
-66839,
-66873,
-66914,
-66914,
-66937,
-66960,
-66979,
-67006,
-67024,
-67031,
-67038,
-67038,
-67045,
-67066,
-67109,
-67116,
-67123,
-67139,
-67160,
-67206,
-67225,
-67225,
-67225,
-67270,
-67297,
-67329,
-67357,
-67371,
-67385,
-67421,
-67455,
-67479,
-67479,
-67495,
-67504,
-67504,
-67527,
-67536,
-67543,
-67553,
-67576,
-67576,
-67576,
-67576,
-67576,
-67576,
-67614,
-67614,
-67621,
-67645,
-67645,
-67645,
-67662,
-67698,
-67698,
-67703,
-67707,
-67742,
-67808,
-67808,
-67815,
-67856,
-67863,
-67880,
-67899,
-67905,
-67912,
-67928,
-67948,
-67960,
-67975,
-67982,
-67996,
-68025,
-68025,
-68045,
-68078,
-68085,
-68085,
-68095,
-68104,
-68116,
-68147,
-68153,
-68170,
-68170,
-68183,
-68183,
-68206,
-68206,
-68206,
-68224,
-68235,
-68241,
-68248,
-68265,
-68286,
-68286,
-68303,
-68315,
-68339,
-68346,
-68353,
-68360,
-68387,
-68418,
-68437,
-68451,
-68463,
-68463,
-68463,
-68475,
-68482,
-68482,
-68509,
-68524,
-68524,
-68534,
-68541,
-68562,
-68574,
-68579,
-68586,
-68596,
-68603,
-68610,
-68641,
-68653,
-68671,
-68678,
-68699,
-68706,
-68724,
-68749,
-68762,
-68779,
-68786,
-68791,
-68791,
-68832,
-68876,
-68876,
-68904,
-68933,
-68964,
-68964,
-68964,
-68964,
-68964,
-68964,
-68964,
-68991,
-68991,
-69046,
-69063,
-69074,
-69074,
-69115,
-69167,
-69183,
-69192,
-69192,
-69209,
-69209,
-69209,
-69209,
-69243,
-69275,
-69275,
-69282,
-69282,
-69302,
-69318,
-69318,
-69318,
-69332,
-69345,
-69368,
-69380,
-69416,
-69453,
-69453,
-69459,
-69482,
-69489,
-69525,
-69525,
-69525,
-69542,
-69542,
-69542,
-69553,
-69560,
-69588,
-69588,
-69588,
-69588,
-69611,
-69634,
-69634,
-69634,
-69645,
-69645,
-69645,
-69677,
-69683,
-69693,
-69700,
-69723,
-69734,
-69744,
-69751,
-69751,
-69773,
-69773,
-69773,
-69773,
-69786,
-69819,
-69819,
-69819,
-69837,
-69848,
-69858,
-69858,
-69877,
-69877,
-69877,
-69877,
-69897,
-69897,
-69897,
-69905,
-69911,
-69911,
-69915,
-69941,
-69941,
-69964,
-69964,
-69964,
-69971,
-69971,
-69987,
-70000,
-70000,
-70000,
-70000,
-70011,
-70011,
-70018,
-70018,
-70028,
-70028,
-70028,
-70028,
-70065,
-70072,
-70086,
-70086,
-70086,
-70086,
-70110,
-70110,
-70110,
-70122,
-70145,
-70160,
-70160,
-70172,
-70193,
-70201,
-70201,
-70241,
-70247,
-70289,
-70289,
-70289,
-70311,
-70311,
-70311,
-70327,
-70334,
-70334,
-70352,
-70366,
-70366,
-70366,
-70366,
-70366,
-70366,
-70366,
-70366,
-70380,
-70380,
-70408,
-70418,
-70434,
-70438,
-70438,
-70438,
-70464,
-70481,
-70496,
-70496,
-70510,
-70510,
-70510,
-70510,
-70530,
-70530,
-70551,
-70551,
-70589,
-70604,
-70617,
-70634,
-70634,
-70634,
-70634,
-70634,
-70645,
-70645,
-70645,
-70662,
-70669,
-70716,
-70738,
-70738,
-70738,
-70738,
-70738,
-70748,
-70748,
-70772,
-70799,
-70813,
-70855,
-70886,
-70895,
-70911,
-70937,
-70937,
-70955,
-70955,
-70965,
-70975,
-70975,
-70986,
-71004,
-71004,
-71031,
-71031,
-71053,
-71068,
-71086,
-71086,
-71086,
-71101,
-71117,
-71117,
-71117,
-71151,
-71165,
-71199,
-71199,
-71199,
-71199,
-71199,
-71199,
-71219,
-71232,
-71255,
-71255,
-71255,
-71255,
-71255,
-71255,
-71255,
-71255,
-71283,
-71307,
-71307,
-71314,
-71332,
-71343,
-71347,
-71384,
-71411,
-71428,
-71428,
-71445,
-71450,
-71450,
-71450,
-71462,
-71462,
-71462,
-71462,
-71462,
-71477,
-71488,
-71488,
-71488,
-71488,
-71488,
-71488,
-71501,
-71530,
-71530,
-71567,
-71586,
-71586,
-71586,
-71603,
-71632,
-71632,
-71632,
-71632,
-71663,
-71672,
-71672,
-71682,
-71707,
-71707,
-71707,
-71714,
-71714,
-71719,
-71727,
-71727,
-71727,
-71727,
-71734,
-71734,
-71734,
-71762,
-71770,
-71770,
-71781,
-71801,
-71812,
-71821,
-71854,
-71871,
-71871,
-71879,
-71896,
-71910,
-71922,
-71959,
-71966,
-71984,
-71990,
-72040,
-72053,
-72087,
-72115,
-72143,
-72169,
-72169,
-72169,
-72179,
-72195,
-72195,
-72195,
-72195,
-72195,
-72195,
-72212,
-72212,
-72212,
-72212,
-72212,
-72222,
-72233,
-72233,
-72233,
-72242,
-72270,
-72277,
-72293,
-72319,
-72360,
-72373,
-72392,
-72409,
-72419,
-72419,
-72440,
-72479,
-72479,
-72489,
-72504,
-72513,
-72530,
-72530,
-72530,
-72530,
-72551,
-72559,
-72559,
-72559,
-72591,
-72615,
-72665,
-72665,
-72672,
-72699,
-72699,
-72709,
-72709,
-72709,
-72709,
-72709,
-72709,
-72753,
-72753,
-72773,
-72780,
-72780,
-72780,
-72805,
-72817,
-72817,
-72830,
-72830,
-72840,
-72866,
-72879,
-72879,
-72888,
-72895,
-72895,
-72895,
-72910,
-72921,
-72921,
-72928,
-72958,
-72986,
-72997,
-73009,
-73024,
-73024,
-73024,
-73024,
-73024,
-73052,
-73062,
-73087,
-73097,
-73097,
-73107,
-73107,
-73122,
-73140,
-73150,
-73159,
-73166,
-73166,
-73166,
-73176,
-73204,
-73234,
-73258,
-73258,
-73258,
-73258,
-73258,
-73258,
-73268,
-73296,
-73319,
-73319,
-73319,
-73319,
-73319,
-73319,
-73319,
-73347,
-73356,
-73365,
-73393,
-73403,
-73403,
-73428,
-73451,
-73451,
-73451,
-73461,
-73471,
-73505,
-73520,
-73520,
-73537,
-73537,
-73550,
-73596,
-73629,
-73629,
-73629,
-73629,
-73641,
-73641,
-73658,
-73658,
-73665,
-73665,
-73665,
-73665,
-73677,
-73690,
-73710,
-73727,
-73764,
-73778,
-73791,
-73811,
-73831,
-73868,
-73876,
-73876,
-73876,
-73876,
-73887,
-73907,
-73928,
-73928,
-73928,
-73928,
-73954,
-73961,
-73961,
-73961,
-73988,
-73992,
-74006,
-74049,
-74049,
-74079,
-74079,
-74098,
-74098,
-74098,
-74098,
-74140,
-74140,
-74140,
-74140,
-74192,
-74216,
-74232,
-74232,
-74260,
-74281,
-74281,
-74287,
-74310,
-74310,
-74326,
-74326,
-74326,
-74326,
-74326,
-74351,
-74370,
-74382,
-74408,
-74408,
-74408,
-74408,
-74450,
-74450,
-74450,
-74450,
-74466,
-74495,
-74534,
-74544,
-74560,
-74576,
-74576,
-74588,
-74588,
-74588,
-74606,
-74626,
-74626,
-74647,
-74691,
-74706,
-74724,
-74729,
-74737,
-74744,
-74750,
-74779,
-74833,
-74833,
-74851,
-74851,
-74851,
-74851,
-74851,
-74851,
-74871,
-74909,
-74932,
-74940,
-74971,
-74971,
-74990,
-74990,
-75008,
-75008,
-75021,
-75036,
-75054,
-75060,
-75060,
-75060,
-75060,
-75060,
-75079,
-75079,
-75079,
-75085,
-75085,
-75119,
-75124,
-75133,
-75133,
-75133,
-75139,
-75153,
-75162,
-75175,
-75175,
-75182,
-75182,
-75188,
-75212,
-75229,
-75229,
-75254,
-75260,
-75260,
-75260,
-75271,
-75271,
-75291,
-75291,
-75291,
-75291,
-75304,
-75304,
-75334,
-75351,
-75364,
-75364,
-75374,
-75374,
-75386,
-75386,
-75413,
-75447,
-75454,
-75472,
-75483,
-75483,
-75483,
-75488,
-75488,
-75488,
-75501,
-75539,
-75539,
-75571,
-75571,
-75599,
-75599,
-75637,
-75656,
-75656,
-75656,
-75656,
-75656,
-75676,
-75692,
-75710,
-75732,
-75766,
-75788,
-75799,
-75799,
-75818,
-75848,
-75860,
-75886,
-75902,
-75902,
-75912,
-75912,
-75919,
-75919,
-75919,
-75941,
-75941,
-75941,
-75976,
-75993,
-75993,
-76007,
-76022,
-76022,
-76022,
-76051,
-76077,
-76103,
-76103,
-76125,
-76136,
-76136,
-76146,
-76146,
-76167,
-76174,
-76174,
-76174,
-76181,
-76181,
-76200,
-76209,
-76237,
-76237,
-76254,
-76285,
-76300,
-76300,
-76318,
-76354,
-76363,
-76376,
-76403,
-76403,
-76403,
-76403,
-76403,
-76403,
-76421,
-76421,
-76421,
-76421,
-76459,
-76459,
-76466,
-76476,
-76484,
-76484,
-76484,
-76484,
-76484,
-76484,
-76484,
-76500,
-76500,
-76513,
-76521,
-76563,
-76570,
-76580,
-76587,
-76587,
-76613,
-76628,
-76628,
-76628,
-76628,
-76639,
-76655,
-76655,
-76655,
-76669,
-76696,
-76696,
-76696,
-76702,
-76717,
-76717,
-76717,
-76728,
-76728,
-76728,
-76768,
-76768,
-76768,
-76768,
-76768,
-76773,
-76793,
-76793,
-76813,
-76841,
-76841,
-76885,
-76913,
-76913,
-76920,
-76920,
-76920,
-76938,
-76938,
-76952,
-76952,
-76982,
-76989,
-76989,
-76989,
-76998,
-77032,
-77049,
-77049,
-77068,
-77085,
-77093,
-77093,
-77102,
-77102,
-77115,
-77135,
-77161,
-77161,
-77173,
-77189,
-77202,
-77202,
-77202,
-77202,
-77202,
-77215,
-77215,
-77215,
-77226,
-77247,
-77270,
-77270,
-77270,
-77270,
-77292,
-77316,
-77316,
-77316,
-77326,
-77375,
-77375,
-77375,
-77375,
-77375,
-77408,
-77431,
-77442,
-77442,
-77449,
-77467,
-77516,
-77528,
-77555,
-77574,
-77574,
-77588,
-77588,
-77603,
-77603,
-77603,
-77624,
-77624,
-77643,
-77643,
-77651,
-77662,
-77662,
-77662,
-77677,
-77677,
-77684,
-77765,
-77783,
-77819,
-77838,
-77838,
-77838,
-77851,
-77851,
-77863,
-77863,
-77863,
-77875,
-77899,
-77899,
-77915,
-77915,
-77915,
-77946,
-77946,
-77946,
-77946,
-77946,
-77956,
-77956,
-77978,
-77978,
-77978,
-77994,
-77994,
-77994,
-78010,
-78023,
-78054,
-78076,
-78096,
-78096,
-78096,
-78096,
-78128,
-78128,
-78128,
-78160,
-78182,
-78195,
-78195,
-78223,
-78223,
-78223,
-78223,
-78223,
-78233,
-78267,
-78279,
-78279,
-78279,
-78279,
-78279,
-78319,
-78350,
-78350,
-78363,
-78363,
-78373,
-78373,
-78373,
-78408,
-78443,
-78456,
-78474,
-78494,
-78494,
-78507,
-78525,
-78541,
-78541,
-78586,
-78598,
-78610,
-78626,
-78632,
-78632,
-78656,
-78698,
-78725,
-78760,
-78760,
-78798,
-78822,
-78847,
-78847,
-78847,
-78865,
-78917,
-78934,
-78934,
-78934,
-78934,
-78962,
-78981,
-78981,
-78981,
-78981,
-78988,
-79001,
-79001,
-79001,
-79009,
-79009,
-79009,
-79009,
-79033,
-79033,
-79055,
-79067,
-79067,
-79067,
-79084,
-79099,
-79099,
-79112,
-79112,
-79112,
-79123,
-79123,
-79123,
-79123,
-79123,
-79144,
-79152,
-79152,
-79165,
-79165,
-79180,
-79186,
-79196,
-79196,
-79196,
-79221,
-79235,
-79235,
-79249,
-79264,
-79274,
-79290,
-79300,
-79346,
-79346,
-79346,
-79346,
-79346,
-79367,
-79383,
-79390,
-79390,
-79447,
-79447,
-79470,
-79470,
-79493,
-79493,
-79493,
-79516,
-79548,
-79548,
-79579,
-79589,
-79603,
-79603,
-79603,
-79609,
-79609,
-79609,
-79609,
-79609,
-79609,
-79616,
-79626,
-79626,
-79636,
-79643,
-79688,
-79703,
-79720,
-79739,
-79746,
-79763,
-79778,
-79791,
-79791,
-79805,
-79805,
-79818,
-79818,
-79824,
-79836,
-79856,
-79877,
-79883,
-79900,
-79900,
-79900,
-79918,
-79934,
-79944,
-79982,
-79982,
-80001,
-80014,
-80014,
-80022,
-80022,
-80034,
-80047,
-80047,
-80047,
-80057,
-80064,
-80064,
-80086,
-80115,
-80115,
-80123,
-80123,
-80149,
-80170,
-80182,
-80182,
-80200,
-80226,
-80270,
-80310,
-80344,
-80344,
-80344,
-80344,
-80344,
-80344,
-80359,
-80359,
-80369,
-80369,
-80391,
-80409,
-80409,
-80439,
-80439,
-80439,
-80458,
-80458,
-80469,
-80469,
-80520,
-80520,
-80520,
-80520,
-80520,
-80520,
-80543,
-80593,
-80603,
-80603,
-80603,
-80620,
-80634,
-80669,
-80675,
-80675,
-80675,
-80675,
-80685,
-80704,
-80731,
-80731,
-80741,
-80760,
-80760,
-80760,
-80760,
-80778,
-80778,
-80778,
-80806,
-80826,
-80826,
-80826,
-80826,
-80826,
-80852,
-80852,
-80864,
-80872,
-80878,
-80878,
-80887,
-80887,
-80899,
-80938,
-80955,
-80955,
-80962,
-80979,
-80979,
-80992,
-80999,
-81022,
-81022,
-81022,
-81054,
-81104,
-81163,
-81163,
-81170,
-81170,
-81202,
-81202,
-81249,
-81249,
-81256,
-81256,
-81262,
-81301,
-81307,
-81345,
-81345,
-81345,
-81345,
-81345,
-81367,
-81367,
-81392,
-81392,
-81412,
-81452,
-81462,
-81468,
-81468,
-81477,
-81491,
-81527,
-81547,
-81582,
-81599,
-81599,
-81618,
-81641,
-81646,
-81646,
-81652,
-81658,
-81680,
-81688,
-81724,
-81760,
-81776,
-81783,
-81798,
-81798,
-81798,
-81804,
-81810,
-81810,
-81810,
-81810,
-81810,
-81816,
-81816,
-81816,
-81816,
-81816,
-81816,
-81841,
-81874,
-81880,
-81886,
-81886,
-81908,
-81908,
-81920,
-81933,
-81933,
-81940,
-81940,
-81940,
-81954,
-81972,
-81972,
-82038,
-82053,
-82068,
-82080,
-82080,
-82102,
-82120,
-82129,
-82129,
-82171,
-82191,
-82191,
-82211,
-82211,
-82244,
-82267,
-82267,
-82279,
-82290,
-82290,
-82290,
-82290,
-82318,
-82323,
-82323,
-82350,
-82367,
-82385,
-82395,
-82425,
-82425,
-82471,
-82471,
-82494,
-82494,
-82513,
-82519,
-82539,
-82539,
-82551,
-82551,
-82557,
-82557,
-82569,
-82577,
-82596,
-82596,
-82596,
-82596,
-82602,
-82610,
-82638,
-82655,
-82655,
-82666,
-82676,
-82683,
-82683,
-82683,
-82688,
-82713,
-82719,
-82740,
-82746,
-82752,
-82764,
-82770,
-82795,
-82801,
-82807,
-82813,
-82822,
-82873,
-82881,
-82894,
-82894,
-82900,
-82906,
-82936,
-82936,
-82969,
-82969,
-82997,
-82997,
-83039,
-83085,
-83092,
-83107,
-83129,
-83134,
-83152,
-83152,
-83152,
-83158,
-83174,
-83174,
-83174,
-83174,
-83182,
-83199,
-83199,
-83209,
-83209,
-83209,
-83209,
-83209,
-83253,
-83259,
-83275,
-83284,
-83299,
-83328,
-83328,
-83328,
-83334,
-83334,
-83334,
-83334,
-83339,
-83383,
-83383,
-83400,
-83434,
-83440,
-83456,
-83512,
-83527,
-83533,
-83533,
-83533,
-83540,
-83540,
-83546,
-83563,
-83574,
-83586,
-83593,
-83653,
-83653,
-83653,
-83653,
-83659,
-83679,
-83685,
-83702,
-83734,
-83740,
-83740,
-83774,
-83774,
-83781,
-83837,
-83837,
-83852,
-83852,
-83852,
-83867,
-83867,
-83867,
-83867,
-83867,
-83895,
-83901,
-83901,
-83919,
-83925,
-83925,
-83934,
-83944,
-83944,
-83944,
-83951,
-83969,
-83990,
-83990,
-84000,
-84000,
-84013,
-84013,
-84029,
-84049,
-84049,
-84080,
-84085,
-84085,
-84085,
-84111,
-84128,
-84145,
-84164,
-84176,
-84206,
-84206,
-84244,
-84244,
-84255,
-84276,
-84297,
-84297,
-84297,
-84297,
-84297,
-84310,
-84326,
-84332,
-84348,
-84395,
-84434,
-84459,
-84459,
-84459,
-84459,
-84472,
-84494,
-84494,
-84494,
-84501,
-84521,
-84521,
-84538,
-84538,
-84585,
-84585,
-84610,
-84615,
-84615,
-84615,
-84658,
-84658,
-84668,
-84691,
-84712,
-84726,
-84726,
-84733,
-84733,
-84739,
-84751,
-84751,
-84751,
-84757,
-84772,
-84802,
-84809,
-84835,
-84841,
-84862,
-84883,
-84883,
-84889,
-84918,
-84918,
-84931,
-84942,
-84942,
-84984,
-84993,
-85023,
-85029,
-85073,
-85113,
-85120,
-85137,
-85187,
-85187,
-85187,
-85225,
-85231,
-85248,
-85261,
-85261,
-85282,
-85313,
-85340,
-85369,
-85385,
-85395,
-85412,
-85419,
-85442,
-85471,
-85501,
-85560,
-85576,
-85611,
-85611,
-85611,
-85618,
-85618,
-85618,
-85625,
-85632,
-85686,
-85704,
-85704,
-85711,
-85738,
-85745,
-85795,
-85795,
-85826,
-85833,
-85840,
-85845,
-85845,
-85860,
-85867,
-85874,
-85881,
-85881,
-85881,
-85892,
-85910,
-85960,
-85980,
-86001,
-86001,
-86057,
-86057,
-86064,
-86064,
-86071,
-86071,
-86096,
-86123,
-86123,
-86139,
-86146,
-86146,
-86159,
-86159,
-86159,
-86177,
-86195,
-86202,
-86230,
-86230,
-86250,
-86273,
-86282,
-86289,
-86303,
-86303,
-86303,
-86327,
-86337,
-86355,
-86355,
-86355,
-86362,
-86369,
-86402,
-86402,
-86444,
-86451,
-86451,
-86458,
-86480,
-86480,
-86508,
-86508,
-86530,
-86530,
-86530,
-86551,
-86561,
-86594,
-86614,
-86614,
-86636,
-86651,
-86658,
-86665,
-86678,
-86702,
-86702,
-86709,
-86709,
-86739,
-86759,
-86775,
-86787,
-86855,
-86891,
-86891,
-86904,
-86904,
-86927,
-86935,
-86950,
-86950,
-86950,
-86978,
-86983,
-86983,
-86999,
-86999,
-87008,
-87022,
-87029,
-87039,
-87060,
-87060,
-87076,
-87076,
-87089,
-87116,
-87123,
-87130,
-87130,
-87130,
-87150,
-87157,
-87173,
-87199,
-87217,
-87234,
-87257,
-87257,
-87266,
-87279,
-87289,
-87289,
-87289,
-87289,
-87315,
-87322,
-87332,
-87332,
-87342,
-87342,
-87363,
-87381,
-87450,
-87450,
-87464,
-87511,
-87518,
-87535,
-87557,
-87564,
-87575,
-87589,
-87596,
-87613,
-87620,
-87620,
-87641,
-87648,
-87655,
-87662,
-87669,
-87690,
-87708,
-87708,
-87718,
-87725,
-87725,
-87734,
-87741,
-87748,
-87792,
-87792,
-87799,
-87813,
-87834,
-87834,
-87847,
-87847,
-87854,
-87871,
-87878,
-87893,
-87900,
-87942,
-87971,
-88003,
-88017,
-88045,
-88052,
-88059,
-88073,
-88101,
-88125,
-88132,
-88132,
-88132,
-88132,
-88132,
-88143,
-88143,
-88151,
-88158,
-88175,
-88175,
-88195,
-88212,
-88219,
-88219,
-88237,
-88244,
-88266,
-88266,
-88273,
-88273,
-88296,
-88296,
-88318,
-88318,
-88318,
-88324,
-88344,
-88368,
-88368,
-88375,
-88400,
-88400,
-88407,
-88443,
-88443,
-88466,
-88497,
-88497,
-88504,
-88511,
-88584,
-88591,
-88609,
-88629,
-88629,
-88629,
-88643,
-88660,
-88666,
-88691,
-88691,
-88691,
-88691,
-88691,
-88691,
-88691,
-88704,
-88704,
-88713,
-88726,
-88726,
-88774,
-88789,
-88837,
-88837,
-88837,
-88846,
-88868,
-88881,
-88881,
-88888,
-88937,
-88961,
-88987,
-89030,
-89043,
-89101,
-89150,
-89150,
-89187,
-89203,
-89210,
-89224,
-89260,
-89267,
-89267,
-89267,
-89274,
-89288,
-89295,
-89311,
-89318,
-89330,
-89351,
-89358,
-89388,
-89388,
-89398,
-89405,
-89412,
-89432,
-89474,
-89481,
-89508,
-89523,
-89552,
-89563,
-89584,
-89612,
-89612,
-89629,
-89636,
-89662,
-89681,
-89687,
-89702,
-89711,
-89727,
-89742,
-89754,
-89773,
-89783,
-89849,
-89856,
-89856,
-89863,
-89877,
-89900,
-89907,
-89907,
-89907,
-89921,
-89921,
-89938,
-89938,
-89961,
-89980,
-90000,
-90021,
-90070,
-90070,
-90086,
-90086,
-90146,
-90178,
-90178,
-90187,
-90209,
-90209,
-90209,
-90215,
-90240,
-90247,
-90256,
-90256,
-90290,
-90290,
-90298,
-90298,
-90305,
-90329,
-90329,
-90353,
-90388,
-90403,
-90409,
-90409,
-90409,
-90416,
-90416,
-90416,
-90436,
-90436,
-90436,
-90461,
-90470,
-90475,
-90475,
-90499,
-90540,
-90540,
-90583,
-90590,
-90608,
-90623,
-90623,
-90643,
-90643,
-90651,
-90718,
-90725,
-90731,
-90731,
-90757,
-90780,
-90780,
-90806,
-90829,
-90845,
-90855,
-90891,
-90891,
-90906,
-90926,
-90960,
-90975,
-90975,
-90994,
-91017,
-91017,
-91024,
-91024,
-91024,
-91034,
-91034,
-91034,
-91052,
-91052,
-91067,
-91103,
-91135,
-91172,
-91188,
-91188,
-91202,
-91221,
-91245,
-91245,
-91245,
-91245,
-91245,
-91245,
-91245,
-91245,
-91245,
-91258,
-91258,
-91276,
-91293,
-91293,
-91328,
-91349,
-91363,
-91372,
-91372,
-91393,
-91393,
-91393,
-91393,
-91393,
-91393,
-91393,
-91412,
-91445,
-91445,
-91463,
-91479,
-91497,
-91512,
-91543,
-91549,
-91549,
-91572,
-91572,
-91589,
-91613,
-91629,
-91655,
-91687,
-91703,
-91703,
-91723,
-91741,
-91741,
-91741,
-91767,
-91778,
-91778,
-91778,
-91791,
-91797,
-91797,
-91806,
-91806,
-91820,
-91836,
-91855,
-91855,
-91855,
-91855,
-91862,
-91900,
-91906,
-91948,
-91948,
-91948,
-91956,
-91956,
-91956,
-91966,
-91989,
-91989,
-92007,
-92007,
-92043,
-92049,
-92066,
-92082,
-92088,
-92088,
-92106,
-92106,
-92106,
-92106,
-92121,
-92121,
-92121,
-92121,
-92132,
-92132,
-92141,
-92160,
-92160,
-92160,
-92160,
-92167,
-92183,
-92192,
-92207,
-92227,
-92242,
-92254,
-92254,
-92284,
-92297,
-92318,
-92318,
-92337,
-92346,
-92386,
-92386,
-92386,
-92386,
-92411,
-92439,
-92454,
-92486,
-92486,
-92512,
-92512,
-92529,
-92529,
-92529,
-92534,
-92534,
-92573,
-92601,
-92621,
-92628,
-92648,
-92657,
-92657,
-92657,
-92657,
-92663,
-92675,
-92700,
-92722,
-92736,
-92742,
-92742,
-92762,
-92762,
-92783,
-92783,
-92878,
-92891,
-92891,
-92901,
-92907,
-92922,
-92937,
-92943,
-92979,
-92990,
-93025,
-93043,
-93043,
-93043,
-93043,
-93043,
-93065,
-93078,
-93105,
-93129,
-93140,
-93140,
-93151,
-93170,
-93170,
-93181,
-93181,
-93181,
-93188,
-93198,
-93198,
-93198,
-93231,
-93231,
-93249,
-93258,
-93272,
-93272,
-93295,
-93302,
-93307,
-93307,
-93323,
-93323,
-93333,
-93333,
-93360,
-93369,
-93404,
-93413,
-93430,
-93430,
-93430,
-93447,
-93467,
-93467,
-93521,
-93528,
-93546,
-93546,
-93571,
-93602,
-93628,
-93639,
-93658,
-93689,
-93703,
-93722,
-93729,
-93729,
-93736,
-93794,
-93812,
-93819,
-93819,
-93819,
-93819,
-93844,
-93851,
-93874,
-93874,
-93888,
-93895,
-93922,
-93922,
-93922,
-93930,
-93930,
-93930,
-93937,
-93937,
-93944,
-93966,
-93966,
-93966,
-93966,
-93966,
-93997,
-94011,
-94018,
-94025,
-94043,
-94043,
-94050,
-94067,
-94074,
-94074,
-94081,
-94081,
-94081,
-94088,
-94114,
-94125,
-94125,
-94125,
-94125,
-94162,
-94174,
-94174,
-94206,
-94224,
-94240,
-94283,
-94283,
-94283,
-94283,
-94290,
-94302,
-94302,
-94302,
-94308,
-94308,
-94344,
-94354,
-94369,
-94374,
-94374,
-94441,
-94482,
-94482,
-94508,
-94526,
-94526,
-94532,
-94539,
-94555,
-94562,
-94577,
-94584,
-94584,
-94598,
-94598,
-94620,
-94638,
-94666,
-94672,
-94672,
-94718,
-94718,
-94725,
-94742,
-94742,
-94749,
-94749,
-94771,
-94771,
-94771,
-94780,
-94805,
-94815,
-94815,
-94820,
-94820,
-94841,
-94841,
-94851,
-94851,
-94851,
-94871,
-94902,
-94902,
-94924,
-94935,
-94942,
-94949,
-94966,
-94966,
-94966,
-94973,
-94973,
-94973,
-94987,
-94987,
-94987,
-95007,
-95037,
-95037,
-95037,
-95037,
-95044,
-95044,
-95044,
-95061,
-95084,
-95084,
-95104,
-95126,
-95126,
-95165,
-95187,
-95194,
-95200,
-95216,
-95223,
-95230,
-95237,
-95237,
-95237,
-95260,
-95273,
-95324,
-95331,
-95338,
-95353,
-95377,
-95388,
-95388,
-95388,
-95403,
-95403,
-95410,
-95417,
-95417,
-95434,
-95476,
-95483,
-95493,
-95500,
-95505,
-95512,
-95519,
-95519,
-95554,
-95568,
-95568,
-95592,
-95592,
-95645,
-95668,
-95668,
-95701,
-95727,
-95768,
-95795,
-95829,
-95844,
-95853,
-95862,
-95862,
-95875,
-95882,
-95882,
-95907,
-95907,
-95907,
-95925,
-95925,
-95925,
-95925,
-95925,
-95951,
-95967,
-95967,
-96018,
-96047,
-96069,
-96087,
-96107,
-96107,
-96107,
-96107,
-96114,
-96142,
-96164,
-96205,
-96205,
-96205,
-96212,
-96236,
-96236,
-96243,
-96243,
-96250,
-96286,
-96293,
-96332,
-96339,
-96353,
-96359,
-96375,
-96389,
-96414,
-96436,
-96446,
-96446,
-96454,
-96466,
-96471,
-96499,
-96554,
-96564,
-96586,
-96603,
-96614,
-96614,
-96629,
-96629,
-96640,
-96662,
-96680,
-96680,
-96700,
-96722,
-96742,
-96742,
-96749,
-96756,
-96802,
-96824,
-96831,
-96840,
-96847,
-96874,
-96874,
-96886,
-96893,
-96900,
-96900,
-96907,
-96914,
-96924,
-96931,
-96944,
-96996,
-97024,
-97024,
-97045,
-97062,
-97062,
-97069,
-97096,
-97096,
-97096,
-97134,
-97134,
-97141,
-97141,
-97148,
-97155,
-97155,
-97162,
-97186,
-97205,
-97240,
-97240,
-97240,
-97240,
-97246,
-97251,
-97251,
-97267,
-97267,
-97309,
-97325,
-97341,
-97363,
-97363,
-97377,
-97392,
-97392,
-97392,
-97433,
-97443,
-97443,
-97457,
-97457,
-97479,
-97479,
-97488,
-97500,
-97516,
-97527,
-97527,
-97534,
-97534,
-97534,
-97534,
-97534,
-97534,
-97548,
-97548,
-97548,
-97548,
-97548,
-97583,
-97583,
-97583,
-97604,
-97604,
-97604,
-97604,
-97618,
-97633,
-97633,
-97642,
-97662,
-97662,
-97662,
-97662,
-97662,
-97662,
-97662,
-97662,
-97668,
-97668,
-97702,
-97702,
-97702,
-97719,
-97729,
-97729,
-97729,
-97729,
-97729,
-97729,
-97736,
-97736,
-97768,
-97775,
-97790,
-97790,
-97814,
-97824,
-97849,
-97849,
-97849,
-97849,
-97849,
-97849,
-97878,
-97878,
-97962,
-97974,
-97974,
-97974,
-98020,
-98031,
-98031,
-98031,
-98031,
-98044,
-98059,
-98059,
-98059,
-98059,
-98059,
-98077,
-98087,
-98097,
-98104,
-98104,
-98104,
-98120,
-98126,
-98169,
-98169,
-98190,
-98190,
-98206,
-98206,
-98230,
-98241,
-98241,
-98248,
-98280,
-98280,
-98297,
-98297,
-98312,
-98327,
-98342,
-98380,
-98380,
-98389,
-98408,
-98408,
-98408,
-98432,
-98446,
-98461,
-98520,
-98520,
-98533,
-98553,
-98575,
-98575,
-98575,
-98594,
-98594,
-98625,
-98636,
-98636,
-98636,
-98653,
-98672,
-98672,
-98685,
-98685,
-98691,
-98699,
-98699,
-98707,
-98737,
-98748,
-98748,
-98766,
-98799,
-98799,
-98799,
-98799,
-98799,
-98799,
-98817,
-98817,
-98817,
-98847,
-98847,
-98859,
-98894,
-98894,
-98894,
-98929,
-98947,
-98947,
-98979,
-98988,
-99005,
-99005,
-99037,
-99037,
-99037,
-99037,
-99037,
-99037,
-99062,
-99067,
-99077,
-99097,
-99097,
-99110,
-99110,
-99158,
-99209,
-99224,
-99224,
-99224,
-99224,
-99247,
-99247,
-99271,
-99271,
-99276,
-99281,
-99299,
-99322,
-99322,
-99330,
-99340,
-99356,
-99367,
-99377,
-99388,
-99388,
-99388,
-99388,
-99388,
-99388,
-99388,
-99437,
-99470,
-99503,
-99516,
-99549,
-99549,
-99555,
-99555,
-99555,
-99555,
-99570,
-99570,
-99577,
-99577,
-99597,
-99597,
-99597,
-99627,
-99658,
-99663,
-99663,
-99675,
-99719,
-99719,
-99719,
-99719,
-99737,
-99744,
-99744,
-99776,
-99791,
-99812,
-99837,
-99850,
-99871,
-99871,
-99871,
-99879,
-99889,
-99889,
-99899,
-99899,
-99899,
-99904,
-99925,
-99925,
-99947,
-99960,
-99960,
-99973,
-99973,
-100005,
-100005,
-100026,
-100026,
-100031,
-100062,
-100079,
-100079,
-100084,
-100100,
-100148,
-100148,
-100199,
-100199,
-100207,
-100235,
-100262,
-100296,
-100296,
-100322,
-100328,
-100328,
-100328,
-100351,
-100361,
-100361,
-100367,
-100367,
-100367,
-100377,
-100377,
-100421,
-100421,
-100435,
-100435,
-100481,
-100481,
-100481,
-100489,
-100489,
-100502,
-100509,
-100525,
-100540,
-100540,
-100560,
-100560,
-100611,
-100620,
-100640,
-100653,
-100653,
-100653,
-100685,
-100685,
-100698,
-100712,
-100721,
-100726,
-100726,
-100726,
-100741,
-100741,
-100751,
-100782,
-100792,
-100801,
-100808,
-100813,
-100850,
-100850,
-100863,
-100873,
-100892,
-100892,
-100892,
-100892,
-100892,
-100909,
-100925,
-100936,
-100955,
-100969,
-100978,
-100978,
-100978,
-101008,
-101036,
-101036,
-101071,
-101071,
-101102,
-101127,
-101151,
-101151,
-101158,
-101170,
-101189,
-101205,
-101205,
-101205,
-101234,
-101248,
-101248,
-101248,
-101248,
-101248,
-101275,
-101275,
-101287,
-101314,
-101314,
-101356,
-101366,
-101366,
-101366,
-101374,
-101382,
-101389,
-101408,
-101408,
-101426,
-101426,
-101443,
-101443,
-101459,
-101459,
-101459,
-101459,
-101476,
-101476,
-101504,
-101504,
-101504,
-101529,
-101567,
-101591,
-101638,
-101638,
-101645,
-101673,
-101711,
-101739,
-101787,
-101787,
-101787,
-101797,
-101814,
-101834,
-101834,
-101834,
-101899,
-101907,
-101914,
-101914,
-101914,
-101936,
-101948,
-101948,
-101948,
-101987,
-101987,
-101987,
-101997,
-102027,
-102027,
-102034,
-102034,
-102042,
-102053,
-102068,
-102086,
-102091,
-102099,
-102099,
-102125,
-102138,
-102151,
-102151,
-102151,
-102160,
-102199,
-102199,
-102199,
-102199,
-102216,
-102216,
-102233,
-102255,
-102268,
-102286,
-102302,
-102323,
-102332,
-102339,
-102351,
-102351,
-102351,
-102356,
-102395,
-102395,
-102430,
-102447,
-102447,
-102447,
-102457,
-102457,
-102457,
-102493,
-102493,
-102493,
-102493,
-102502,
-102536,
-102543,
-102543,
-102543,
-102543,
-102566,
-102596,
-102596,
-102625,
-102654,
-102660,
-102678,
-102678,
-102678,
-102678,
-102701,
-102701,
-102701,
-102717,
-102717,
-102723,
-102734,
-102734,
-102750,
-102766,
-102766,
-102766,
-102801,
-102807,
-102807,
-102833,
-102849,
-102849,
-102868,
-102868,
-102881,
-102887,
-102904,
-102924,
-102924,
-102980,
-102980,
-103013,
-103073,
-103073,
-103079,
-103079,
-103085,
-103115,
-103115,
-103115,
-103128,
-103128,
-103128,
-103143,
-103206,
-103231,
-103241,
-103263,
-103263,
-103271,
-103271,
-103309,
-103350,
-103350,
-103379,
-103398,
-103406,
-103425,
-103425,
-103459,
-103468,
-103491,
-103491,
-103491,
-103508,
-103525,
-103525,
-103536,
-103536,
-103536,
-103550,
-103550,
-103573,
-103578,
-103578,
-103578,
-103591,
-103601,
-103612,
-103612,
-103630,
-103630,
-103630,
-103630,
-103659,
-103659,
-103666,
-103684,
-103696,
-103696,
-103719,
-103763,
-103778,
-103778,
-103778,
-103778,
-103834,
-103834,
-103841,
-103868,
-103868
-};
-
-static const char *tldData[] = {
-"sakurai.nara.jp\0"
-"filegear.me\0"
-"maibara.shiga.jp\0"
-"consultant.aero\0mykolaiv.ua\0visa\0"
-"usarts.museum\0servebeer.com\0"
-"eniwa.hokkaido.jp\0abb\0"
-"abc\0s3.dualstack.eu-west-3.amazonaws.com\0"
-"ichinomiya.aichi.jp\0lawyer\0za.bz\0"
-"beardu.no\0fl\xc3\xa5.no\0"
-"nishi.fukuoka.jp\0"
-"sanagochi.tokushima.jp\0"
-"genova.it\0"
-"pescara.it\0"
-"naustdal.no\0co.place\0"
-"aurland.no\0vipsinaapp.com\0"
-"samsclub\0"
-"from-ms.com\0from-nc.com\0i234.me\0"
-"moto\0origins\0"
-"1337.pictures\0"
-"iyo.ehime.jp\0"
-"ddnsking.com\0"
-"*.cns.joyent.com\0"
-"veterinaire.fr\0"
-"circus.museum\0aco\0"
-"monza-brianza.it\0koganei.tokyo.jp\0"
-"taranto.it\0chitose.hokkaido.jp\0hara.nagano.jp\0"
-"yao.osaka.jp\0"
-"*.bd\0"
-"act.au\0meland.no\0\xec\x82\xbc\xec\x84\xb1\0\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91\0"
-"educator.aero\0"
-"yahiko.niigata.jp\0"
-"viva\0"
-"kawagoe.mie.jp\0"
-"ads\0"
-"veneto.it\0"
-"aeg\0"
-"static.observableusercontent.com\0"
-"\xe3\x82\xb3\xe3\x83\xa0\0"
-"grp.lk\0austin.museum\0karasjohka.no\0sc.ug\0barsy.online\0"
-"hachioji.tokyo.jp\0xerox\0"
-"luster.no\0tinn.no\0vivo\0"
-"sc.tz\0"
-"*.ck\0m\xc3\xa1latvuopmi.no\0cisco\0app.os.fedoraproject.org\0"
-"myjino.ru\0"
-"community\0"
-"sc.us\0"
-"\xe0\xb8\x84\xe0\xb8\xad\xe0\xb8\xa1\0"
-"weather\0"
-"science\0"
-"fukuroi.shizuoka.jp\0afl\0"
-"suedtirol.it\0"
-"blogsite.org\0"
-"kuromatsunai.hokkaido.jp\0of.fashion\0"
-"mo.cn\0zentsuji.kagawa.jp\0usa.oita.jp\0"
-"frana.no\0\xd5\xb0\xd5\xa1\xd5\xb5\0"
-"mormon\0"
-"sch.zm\0office\0"
-"krodsherad.no\0snillfjord.no\0"
-"kamishihoro.hokkaido.jp\0oji.nara.jp\0"
-"asso.re\0"
-"kaita.hiroshima.jp\0"
-"akita.akita.jp\0"
-"mt.eu.org\0loginto.me\0"
-"*.er\0"
-"m\xc3\xa5s\xc3\xb8y.no\0"
-"trentin-s\xc3\xbc""dtirol.it\0flickr\0"
-"o.bg\0eigersund.no\0"
-"research.aero\0b.se\0fhsk.se\0"
-"hachirogata.akita.jp\0keisen.fukuoka.jp\0marriott\0reit\0"
-"*.fk\0cc.or.us\0dyndns-office.com\0"
-"saskatchewan.museum\0uzhgorod.ua\0investments\0"
-"kanegasaki.iwate.jp\0"
-"aig\0trycloudflare.com\0"
-"bugatti\0cupcake.is\0"
-"ngrok.io\0"
-"int.eu.org\0securitytactics.com\0"
-"arte.bo\0"
-"ogi.saga.jp\0"
-"s\xc3\xa1lat.no\0"
-"ginowan.okinawa.jp\0citadel\0"
-"usercontent.jp\0"
-"hob\xc3\xb8l.no\0hermes\0"
-"kitaura.miyazaki.jp\0"
-"to.gov.br\0"
-"lucca.it\0shintoku.hokkaido.jp\0"
-"pccw\0"
-"\xeb\x8b\xb7\xec\xbb\xb4\0now-dns.net\0"
-"ga.us\0"
-"am.br\0sp.it\0"
-"raholt.no\0"
-"is-an-entertainer.com\0"
-"asso.nc\0natura\0"
-"monzaedellabrianza.it\0"
-"from-in.com\0"
-"ci.it\0"
-"shitara.aichi.jp\0saigawa.fukuoka.jp\0"
-"fastly-terrarium.com\0"
-"hashima.gifu.jp\0maniwa.okayama.jp\0"
-"*.on-k3s.io\0"
-"george\0"
-"ninohe.iwate.jp\0"
-"sejny.pl\0"
-"walter\0"
-"oslo.no\0bygland.no\0"
-"*.jm\0badajoz.museum\0lanxess\0"
-"cleverapps.io\0"
-"gift\0"
-"zone\0"
-"roma.it\0"
-"mo.it\0"
-"barsy.bg\0dnsupdate.info\0"
-"*.kh\0"
-"toyosato.shiga.jp\0rent\0"
-"nyny.museum\0is-a-musician.com\0"
-"ntr.br\0aso.kumamoto.jp\0kouhoku.saga.jp\0"
-"preservation.museum\0"
-"akashi.hyogo.jp\0"
-"barsy.ca\0"
-"fastpanel.direct\0"
-"utazas.hu\0"
-"helsinki\0"
-"is-a-chef.net\0"
-"myphotos.cc\0barsy.de\0"
-"kizu.kyoto.jp\0anz\0"
-"aol\0"
-"ostrowiec.pl\0"
-"*.mm\0"
-"rishirifuji.hokkaido.jp\0utazu.kagawa.jp\0"
-"omi.niigata.jp\0khplay.nl\0"
-"\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0"
-"aarp\0"
-"quebec.museum\0"
-"cloudycluster.net\0"
-"s\xc3\xa1l\xc3\xa1t.no\0\xe7\xb5\x84\xe7\xb9\x94.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"market\0"
-"ltd.cy\0"
-"ueno.gunma.jp\0app\0"
-"gallery.museum\0yachts\0"
-"*.np\0"
-"asso.km\0"
-"dyn-o-saur.com\0"
-"oguchi.aichi.jp\0"
-"barsy.eu\0"
-"cc.gu.us\0website\0"
-"otaki.nagano.jp\0"
-"karacol.su\0"
-"ontario.museum\0"
-"hanamaki.iwate.jp\0"
-"\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x90\xe0\xb8\x9a\xe0\xb8\xb2\xe0\xb8\xa5.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0bar\0"
-"commune.am\0bbc\0north-kazakhstan.su\0"
-"my.eu.org\0oya.to\0"
-"finnoy.no\0"
-"surgery\0"
-"asso.mc\0*.pg\0"
-"morotsuka.miyazaki.jp\0uzs.gov.pl\0"
-"aoki.nagano.jp\0rest\0"
-"pila.pl\0"
-"sunndal.no\0"
-"ok.us\0"
-"kimino.wakayama.jp\0art\0bbt\0"
-"dev-myqnapcloud.com\0"
-"fortal.br\0miyashiro.saitama.jp\0"
-"bcg\0"
-"forex\0"
-"zappos\0"
-"mantova.it\0yasaka.nagano.jp\0"
-"bcn\0"
-"ltd.gi\0unj\xc3\xa1rga.no\0"
-"lc.it\0iwata.shizuoka.jp\0"
-"\xc3\xa1lt\xc3\xa1.no\0melhus.no\0vagsoy.no\0"
-"discount\0"
-"taira.toyama.jp\0"
-"dedyn.io\0"
-"omaezaki.shizuoka.jp\0"
-"latrobe\0"
-"navigation.aero\0web.bo\0vgs.no\0homeunix.org\0"
-"adult.ht\0ogata.akita.jp\0"
-"ltd.hk\0"
-"barsy.in\0"
-"barsy.io\0"
-"bytom.pl\0"
-"*.elb.amazonaws.com\0"
-"7.bg\0monticello.museum\0vefsn.no\0"
-"perspecta.cloud\0"
-"web.co\0verdal.no\0"
-"vi.it\0tsuiki.fukuoka.jp\0"
-"sango.nara.jp\0"
-"author.aero\0"
-"dyndns-free.com\0"
-"ichikawa.hyogo.jp\0nakanoto.ishikawa.jp\0"
-"monza-e-della-brianza.it\0bet\0"
-"tm.cy\0"
-"knx-server.net\0"
-"web.do\0"
-"desa.id\0ma.leg.br\0"
-"shinjo.nara.jp\0"
-"sandcats.io\0"
-"olbia-tempio.it\0hamatama.saga.jp\0"
-"higashiyodogawa.osaka.jp\0"
-"\xe5\x81\xa5\xe5\xba\xb7\0"
-"nl.ca\0app.banzaicloud.io\0"
-"plaza.museum\0divttasvuotna.no\0za.com\0"
-"gmail\0"
-"homesecuritymac.com\0"
-"furniture.museum\0tiaa\0daplie.me\0shacknet.nu\0"
-"minamata.kumamoto.jp\0yokoze.saitama.jp\0"
-"camera\0"
-"passenger-association.aero\0axa\0property\0"
-"wakayama.jp\0\xe5\x9f\xbc\xe7\x8e\x89.jp\0"
-"\xc3\xa1k\xc5\x8boluokta.no\0aws\0"
-"oseto.nagasaki.jp\0"
-"vaksdal.no\0nl.eu.org\0"
-"*.ocs.customer-oci.com\0"
-"k12.oh.us\0"
-"rebun.hokkaido.jp\0"
-"volda.no\0"
-"tm.fr\0gov.nc.tr\0"
-"ltd.lk\0shopitsite.com\0"
-"temp-dns.com\0"
-"\xe5\xba\x83\xe5\xb3\xb6.jp\0bid\0"
-"lib.ri.us\0schule\0"
-"cruise\0"
-"!city.kawasaki.jp\0"
-"cyber.museum\0o.se\0mo.us\0troitsk.su\0"
-"forli-cesena.it\0"
-"skedsmokorset.no\0"
-"web.gu\0able\0bio\0"
-"yabu.hyogo.jp\0tanabe.kyoto.jp\0"
-"drud.io\0members.linode.com\0"
-"hk.cn\0"
-"sa.au\0"
-"gsm.pl\0"
-"homeoffice.gov.uk\0"
-"biz\0\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\0"
-"ascolipiceno.it\0"
-"michigan.museum\0ltd.ng\0"
-"web.id\0"
-"bifuka.hokkaido.jp\0"
-"tm.hu\0"
-"nara.nara.jp\0"
-"citic\0"
-"val-daosta.it\0"
-"lyngdal.no\0sor-varanger.no\0trana.no\0tynset.no\0""001www.com\0"
-"tamamura.gunma.jp\0"
-"*.dweb.link\0"
-"toride.ibaraki.jp\0nagawa.nagano.jp\0"
-"*.ye\0"
-"kawaminami.miyazaki.jp\0"
-"name\0us-west-2.elasticbeanstalk.com\0"
-"mincom.tn\0"
-"myasustor.com\0*.ocp.customer-oci.com\0"
-"yazu.tottori.jp\0"
-"endofinternet.org\0"
-"sa.cr\0cesena-forli.it\0nakagawa.hokkaido.jp\0hannan.osaka.jp\0"
-"reggio-emilia.it\0poker\0"
-"k12.sc.us\0"
-"bolivia.bo\0"
-"bj.cn\0higashi.okinawa.jp\0hyatt\0"
-"glug.org.uk\0"
-"eu.org\0"
-"is-not-certified.com\0"
-"hashbang.sh\0"
-"museet.museum\0chase\0"
-"tours\0"
-"degree\0"
-"tm.km\0eng.pro\0"
-"ota.gunma.jp\0in.net\0"
-"kyuragi.saga.jp\0"
-"style\0"
-"sakata.yamagata.jp\0"
-"nationalheritage.museum\0bms\0"
-"joetsu.niigata.jp\0"
-"web.lk\0ng.eu.org\0"
-"nakama.fukuoka.jp\0"
-"bmw\0"
-"altoadige.it\0"
-"zakopane.pl\0"
-"ks.ua\0"
-"tm.mc\0k12.md.us\0"
-"broadway\0"
-"kamisunagawa.hokkaido.jp\0"
-"tm.mg\0"
-"\xd9\x85\xd9\x88\xd8\xb1\xd9\x8a\xd8\xaa\xd8\xa7\xd9\x86\xd9\x8a\xd8\xa7\0"
-"hyllestad.no\0"
-"ibigawa.gifu.jp\0misato.miyagi.jp\0"
-"kids.museum\0resindevice.io\0"
-"semine.miyagi.jp\0pinb.gov.pl\0"
-"stjordalshalsen.no\0bom\0is-a-blogger.com\0"
-"snasa.no\0ks.us\0boo\0"
-"yuu.yamaguchi.jp\0web.nf\0"
-"\xc3\xa5""fjord.no\0"
-"web.ni\0africa\0"
-"bot\0vistaprint\0"
-"reklam.hu\0"
-"df.gov.br\0church\0"
-"hanggliding.aero\0"
-"koga.fukuoka.jp\0nanbu.tottori.jp\0box\0"
-"nakano.nagano.jp\0"
-"tm.no\0"
-"nogi.tochigi.jp\0"
-"ox.rs\0"
-"obanazawa.yamagata.jp\0"
-"contemporaryart.museum\0"
-"chikuma.nagano.jp\0cab\0"
-"diskussionsbereich.de\0"
-"brindisi.it\0"
-"\xe5\x80\x8b\xe4\xba\xba.hk\0"
-"bharti\0forsale\0ltd.ua\0"
-"\xe5\xa4\xa7\xe9\x98\xaa.jp\0toba.mie.jp\0virgin\0"
-"vi.us\0"
-"fantasyleague.cc\0"
-"cal\0"
-"tecnologia.bo\0drammen.no\0cam\0"
-"avocat.fr\0"
-"natural.bo\0ltd.uk\0cba\0"
-"udono.mie.jp\0car\0"
-"cat\0imdb\0"
-"web.pk\0"
-"sa.it\0ojiya.niigata.jp\0"
-"tm.pl\0mazowsze.pl\0republican\0"
-"vaga.no\0"
-"cbn\0"
-"firmdale\0forum\0"
-"oki.fukuoka.jp\0"
-"nl.no\0"
-"\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0limited\0"
-"cbs\0ferrari\0hs.zone\0"
-"itoigawa.niigata.jp\0"
-"friulivegiulia.it\0"
-"from-mn.com\0"
-"oita.oita.jp\0"
-"firewall-gateway.de\0"
-"futsu.nagasaki.jp\0"
-"v\xc3\xa5g\xc3\xa5.no\0"
-"unjarga.no\0"
-"nt.edu.au\0"
-"sumoto.kumamoto.jp\0chino.nagano.jp\0"
-"pagespeedmobilizer.com\0"
-"feste-ip.net\0"
-"press.aero\0"
-"meldal.no\0"
-"tm.ro\0"
-"grainger\0"
-"cc.ca.us\0"
-"\xe9\x9d\x99\xe5\xb2\xa1.jp\0"
-"firewall-gateway.com\0"
-"cesena-forl\xc3\xac.it\0"
-"tm.se\0"
-"ceb\0"
-"suzu.ishikawa.jp\0shizuoka.shizuoka.jp\0yoshida.shizuoka.jp\0"
-"sport.hu\0"
-"showa.gunma.jp\0tomakomai.hokkaido.jp\0rybnik.pl\0myeffect.net\0"
-"flakstad.no\0"
-"akaiwa.okayama.jp\0wajiki.tokushima.jp\0"
-"malatvuopmi.no\0ceo\0navy\0s3.ap-northeast-2.amazonaws.com\0"
-"\xd0\xb1\xd0\xb3\0cfa\0"
-"minamioguni.kumamoto.jp\0"
-"vega.no\0"
-"web.tj\0cfd\0"
-"kunstunddesign.museum\0"
-"pistoia.it\0vv.it\0"
-"pueblo.bo\0"
-"buy\0drud.us\0"
-"messina.it\0"
-"public.museum\0r\xc3\xb8ros.no\0"
-"web.tr\0"
-"satte.saitama.jp\0"
-"minami.fukuoka.jp\0teshikaga.hokkaido.jp\0"
-"careers\0"
-"namsos.no\0ringebu.no\0"
-"goto.nagasaki.jp\0pulawy.pl\0"
-"cv.ua\0arkhangelsk.su\0"
-"deals\0definima.io\0"
-"shika.ishikawa.jp\0gushikami.okinawa.jp\0oguni.yamagata.jp\0"
-"web.ve\0tips\0"
-"cn-north-1.eb.amazonaws.com.cn\0"
-"sande.vestfold.no\0"
-"communication.museum\0"
-"boleslawiec.pl\0"
-"decorativearts.museum\0"
-"cern\0""2ix.at\0"
-"pu.it\0"
-"trust.museum\0s3-us-west-2.amazonaws.com\0"
-"clinic\0"
-"biz.bb\0"
-"gs.va.no\0is-slick.com\0"
-"qsl.br\0biz.at\0"
-"honbetsu.hokkaido.jp\0zachpomor.pl\0"
-"biz.az\0"
-"katsuragi.nara.jp\0"
-"flora.no\0"
-"2ix.ch\0"
-"aero.tt\0"
-"bilbao.museum\0levanger.no\0"
-"naruto.tokushima.jp\0bzh\0"
-"parti.se\0gratis\0"
-"2ix.de\0"
-"kushima.miyazaki.jp\0t3l3p0rt.net\0"
-"stateofdelaware.museum\0lib.as.us\0"
-"tananger.no\0"
-"aero.mv\0"
-"boxfuse.io\0"
-"palermo.it\0"
-"meraker.no\0"
-"biz.cy\0"
-"creditcard\0"
-"web.za\0\xe9\xa6\x99\xe6\xa0\xbc\xe9\x87\x8c\xe6\x8b\x89\0biz.dk\0co.technology\0"
-"\xd0\xb5\xd1\x8e\0"
-"air.museum\0krager\xc3\xb8.no\0skedsmo.no\0tm.za\0"
-"ichiba.tokushima.jp\0"
-"immo\0"
-"baths.museum\0virtuel.museum\0"
-"andria-trani-barletta.it\0shiroishi.miyagi.jp\0arita.saga.jp\0"
-"from-oh.com\0"
-"tokke.no\0"
-"sn.cn\0\xe5\xaf\x8c\xe5\xb1\xb1.jp\0"
-"is-found.org\0"
-"valled-aosta.it\0fbxos.fr\0"
-"pasadena.museum\0is-an-actor.com\0"
-"mielec.pl\0"
-"biz.et\0"
-"tawaramoto.nara.jp\0starostwo.gov.pl\0"
-"fjell.no\0"
-"kimitsu.chiba.jp\0fashion\0"
-"biz.fj\0"
-"comunica\xc3\xa7\xc3\xb5""es.museum\0"
-"lomza.pl\0"
-"*.alces.network\0ap-northeast-3.elasticbeanstalk.com\0webspace.rocks\0"
-"komono.mie.jp\0hiraya.nagano.jp\0"
-"k12.ca.us\0"
-"kv\xc3\xa6nangen.no\0"
-"donetsk.ua\0cc.va.us\0"
-"frankfurt.museum\0"
-"kotohira.kagawa.jp\0"
-"openair.museum\0"
-"biz.gl\0"
-"adac\0togliatti.su\0"
-"schoenbrunn.museum\0tree.museum\0"
-"friuliveneziagiulia.it\0kurotaki.nara.jp\0beep.pl\0"
-"az.us\0university\0"
-"dontexist.net\0"
-"software.aero\0dattoweb.com\0now-dns.org\0"
-"edunet.tn\0"
-"filegear-gb.me\0"
-"sakuragawa.ibaraki.jp\0"
-"in-addr.arpa\0com\0"
-"eti.br\0"
-"chiba.jp\0tanagura.fukushima.jp\0"
-"cpa\0juegos\0"
-"pagefrontapp.com\0hk.org\0"
-"biz.id\0"
-"rj.gov.br\0yamada.toyama.jp\0"
-"m.bg\0"
-"\xc3\xb8ystre-slidre.no\0"
-"naval.museum\0"
-"hofu.yamaguchi.jp\0dad\0"
-"viking.museum\0\xd0\xbe\xd0\xb1\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0"
-"sarufutsu.hokkaido.jp\0buzz\0"
-"hirata.fukushima.jp\0czeladz.pl\0"
-"stj\xc3\xb8rdalshalsen.no\0askoy.no\0cbg.ru\0"
-"is-a-bookkeeper.com\0"
-"leg.br\0"
-"\xc3\xb8ksnes.no\0loans\0"
-"ito.shizuoka.jp\0"
-"khmelnitskiy.ua\0"
-"ikeda.hokkaido.jp\0"
-"r\xc3\xa5holt.no\0tvedestrand.no\0"
-"hidaka.wakayama.jp\0"
-"biz.ki\0day\0fujitsu\0"
-"mg.leg.br\0"
-"handa.aichi.jp\0"
-"fishing\0from-ri.com\0"
-"ibaraki.ibaraki.jp\0intl.tn\0"
-"tydal.no\0s3.dualstack.ap-southeast-1.amazonaws.com\0barsyonline.co.uk\0"
-"\xe4\xb8\xaa\xe4\xba\xba.hk\0dr\xc3\xb8""bak.no\0"
-"crs\0csc\0obninsk.su\0"
-"tachikawa.tokyo.jp\0\xe0\xb8\x98\xe0\xb8\xb8\xe0\xb8\xa3\xe0\xb8\x81\xe0\xb8\xb4\xe0\xb8\x88.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"lorenskog.no\0"
-"hayakawa.yamanashi.jp\0"
-"luxembourg.museum\0holtalen.no\0\xd9\x83\xd8\xa7\xd8\xab\xd9\x88\xd9\x84\xd9\x8a\xd9\x83\0"
-"fukaya.saitama.jp\0"
-"missoula.museum\0vardo.no\0kpmg\0"
-"trentino-suedtirol.it\0siteleaf.net\0"
-"police.uk\0"
-"ribeirao.br\0"
-"biz.ls\0"
-"nakatsugawa.gifu.jp\0"
-"dsmynas.com\0"
-"izumo.shimane.jp\0"
-"kl\xc3\xa6""bu.no\0"
-"\xe0\xb2\xad\xe0\xb2\xbe\xe0\xb2\xb0\xe0\xb2\xa4\0"
-"takata.fukuoka.jp\0"
-"\xe0\xac\xad\xe0\xac\xbe\xe0\xac\xb0\xe0\xac\xa4\0"
-"macys\0"
-"info\0kvinnherad.no\0barsy.mobi\0"
-"\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa6\xa4\0"
-"dds\0"
-"biz.mv\0"
-"biz.mw\0"
-"santoandre.br\0"
-"biz.ni\0vagan.no\0jdevcloud.com\0"
-"asahikawa.hokkaido.jp\0"
-"giehtavuoatna.no\0"
-"southcarolina.museum\0"
-"trentinoaadige.it\0dealer\0"
-"minami.tokushima.jp\0"
-"k12.ks.us\0bargains\0"
-"biz.nr\0\xd1\x80\xd1\x84\0"
-"ddnsgeek.com\0"
-"dev\0"
-"dagestan.ru\0"
-"tobishima.aichi.jp\0"
-"fuso.aichi.jp\0"
-"sinaapp.com\0"
-"kurashiki.okayama.jp\0"
-"groundhandling.aero\0bo.nordland.no\0"
-"cloudaccess.host\0"
-"beauxarts.museum\0sandnessjoen.no\0cc.mt.us\0cc.nd.us\0"
-"oyamazaki.kyoto.jp\0szczecin.pl\0"
-"dagestan.su\0"
-"kawai.nara.jp\0okutama.tokyo.jp\0"
-"mandal.no\0"
-"no-ip.biz\0"
-"tingvoll.no\0biz.pk\0k12.va.us\0"
-"kikonai.hokkaido.jp\0biz.pl\0"
-"nature.museum\0myqnapcloud.com\0"
-"casacam.net\0"
-"fuel.aero\0"
-"kasamatsu.gifu.jp\0fujimi.saitama.jp\0biz.pr\0\xe5\xb9\xbf\xe4\xb8\x9c\0"
-"fortworth.museum\0"
-"hitachi\0cloud.goog\0hzc.io\0"
-"motosu.gifu.jp\0"
-"sauherad.no\0"
-"wassamu.hokkaido.jp\0dhl\0"
-"lab.ms\0"
-"muroto.kochi.jp\0"
-"metlife\0"
-"shimabara.nagasaki.jp\0"
-"loginline.site\0"
-"shimamoto.osaka.jp\0"
-"\xe5\x95\x86\xe5\x9f\x8e\0"
-"hirado.nagasaki.jp\0"
-"eisenbahn.museum\0bplaced.de\0qualifioapp.com\0"
-"maison\0"
-"kamoenai.hokkaido.jp\0miyoshi.tokushima.jp\0crown\0weber\0"
-"lom.it\0"
-"diy\0"
-"golffan.us\0"
-"ws.na\0"
-"h\xc3\xb8ylandet.no\0ny.us\0\xe5\x9c\xa8\xe7\xba\xbf\0"
-"biz.ss\0cc.ri.us\0"
-"biz.tj\0"
-"guam.gu\0"
-"ustka.pl\0quest\0"
-"cc.ar.us\0"
-"plc.co.im\0civilization.museum\0biz.ua\0"
-"biz.tr\0"
-"on-aptible.com\0"
-"biz.tt\0barsy.support\0"
-"b\xc3\xa1id\xc3\xa1r.no\0s3-website.eu-west-2.amazonaws.com\0"
-"tamayu.shimane.jp\0"
-"is-by.us\0"
-"yamato.fukushima.jp\0"
-"tas.gov.au\0"
-"shiraoka.saitama.jp\0"
-"movie\0"
-"omotego.fukushima.jp\0\xe5\xa8\xb1\xe4\xb9\x90\0"
-"5.bg\0bible\0"
-"kui.hiroshima.jp\0"
-"issmarterthanyou.com\0"
-"romsa.no\0"
-"chikuho.fukuoka.jp\0"
-"sa.gov.au\0"
-"nagahama.shiga.jp\0"
-"click\0"
-"otaki.saitama.jp\0biz.vn\0"
-"tsukui.kanagawa.jp\0"
-"flesberg.no\0nesseby.no\0"
-"notogawa.shiga.jp\0"
-"usr.cloud.muni.cz\0"
-"yamaga.kumamoto.jp\0wakuya.miyagi.jp\0"
-"national.museum\0kongsvinger.no\0merseine.nu\0"
-"dnp\0cistron.nl\0"
-"accesscam.org\0"
-"otsuki.kochi.jp\0"
-"lom.no\0komforb.se\0"
-"kitakami.iwate.jp\0"
-"dog\0"
-"r\xc3\xb8yrvik.no\0lib.ga.us\0"
-"aikawa.kanagawa.jp\0"
-"kamo.niigata.jp\0"
-"waw.pl\0"
-"goldpoint\0"
-"dot\0"
-"gs.tr.no\0"
-"trentino-s-tirol.it\0"
-"agents.aero\0k12.nv.us\0"
-"rr.gov.br\0"
-"my-vigor.de\0"
-"hisamitsu\0"
-"yahaba.iwate.jp\0"
-"la-spezia.it\0oristano.it\0"
-"s3.amazonaws.com\0"
-"slz.br\0"
-"z.bg\0brasil.museum\0"
-"sasayama.hyogo.jp\0"
-"m.se\0"
-"fukuchi.fukuoka.jp\0uchinomi.kagawa.jp\0"
-"oshima.yamaguchi.jp\0immobilien\0"
-"biz.zm\0"
-"skien.no\0"
-"rich\0"
-"hi.cn\0anpachi.gifu.jp\0ketrzyn.pl\0eat\0"
-"berlin.museum\0jolster.no\0"
-"dyroy.no\0"
-"rs.gov.br\0sc.gov.br\0tajiri.osaka.jp\0arai.shizuoka.jp\0\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\0"
-"flor\xc3\xb8.no\0"
-"norddal.no\0"
-"ternopil.ua\0"
-"castres.museum\0symantec\0barsy.info\0"
-"loppa.no\0cherkasy.ua\0"
-"oto.fukuoka.jp\0hotmail\0"
-"neustar\0scrapper-site.net\0"
-"qc.com\0"
-"furudono.fukushima.jp\0"
-"eco\0"
-"stargard.pl\0"
-"etne.no\0"
-"crotone.it\0reggio-calabria.it\0epson\0"
-"smart\0"
-"sorreisa.no\0"
-"cng.br\0ashikaga.tochigi.jp\0land\0"
-"ct.it\0manno.kagawa.jp\0"
-"defense.tn\0"
-"prato.it\0"
-"juedisches.museum\0lib.ut.us\0is-a-teacher.com\0"
-"kasugai.aichi.jp\0onion\0"
-"edu\0"
-"valle-d-aosta.it\0dtv\0"
-"wallonie.museum\0"
-"gwangju.kr\0"
-"artsandcrafts.museum\0vossevangen.no\0"
-"chintai\0photos\0"
-"rokunohe.aomori.jp\0shimogo.fukushima.jp\0"
-"cloudcontrolapp.com\0"
-"touch.museum\0"
-"time.museum\0"
-"tokuyama.yamaguchi.jp\0"
-"ak.us\0"
-"ln.cn\0"
-"ba.gov.br\0azumino.nagano.jp\0koza.wakayama.jp\0"
-"egyptian.museum\0"
-"hachinohe.aomori.jp\0final\0"
-"katsushika.tokyo.jp\0"
-"jogasz.hu\0gs.sf.no\0"
-"konan.aichi.jp\0"
-"kimobetsu.hokkaido.jp\0jelenia-gora.pl\0"
-"\xc3\xa5seral.no\0"
-"dvr\0"
-"dali.museum\0"
-"wpdevcloud.com\0"
-"health\0"
-"hiranai.aomori.jp\0"
-"sula.no\0la.us\0"
-"fm.br\0"
-"chat\0"
-"nesodden.no\0"
-"toyama.toyama.jp\0"
-"lexus\0is-uberleet.com\0"
-"botany.museum\0fastvps-server.com\0"
-"rn.gov.br\0gmbh\0"
-"bjarkoy.no\0skjervoy.no\0"
-"belau.pw\0"
-"nagano.nagano.jp\0serveblog.net\0"
-"busan.kr\0"
-"hapmir.no\0from-vt.com\0"
-"qc.ca\0"
-"trentino.it\0"
-"scjohnson\0"
-"ro.im\0"
-"balsfjord.no\0nes.akershus.no\0github.io\0"
-"kanra.gunma.jp\0"
-"lavagis.no\0"
-"missile.museum\0"
-"ro.it\0"
-"ro.gov.br\0miura.kanagawa.jp\0osaki.miyagi.jp\0"
-"copenhagen.museum\0"
-"does-it.net\0"
-"karasjok.no\0"
-"mimata.miyazaki.jp\0"
-"numata.gunma.jp\0"
-"j\xc3\xb8lster.no\0"
-"masoy.no\0"
-"global.prod.fastly.net\0*.ex.ortsinfo.at\0"
-"baidar.no\0sortland.no\0azure\0"
-"kred\0"
-"farm.museum\0"
-"cheap\0"
-"watches\0"
-"ogasawara.tokyo.jp\0"
-"nctu.me\0"
-"midori.gunma.jp\0"
-"tr.eu.org\0*.r.appspot.com\0"
-"from-sd.com\0"
-"samukawa.kanagawa.jp\0iwafune.tochigi.jp\0"
-"lug.org.uk\0"
-"himi.toyama.jp\0"
-"unicom\0"
-"nozawaonsen.nagano.jp\0"
-"snaase.no\0"
-"kamisu.ibaraki.jp\0\xe5\x98\x89\xe9\x87\x8c\0"
-"sand\xc3\xb8y.no\0"
-"fujioka.gunma.jp\0"
-"takko.aomori.jp\0"
-"north.museum\0"
-"ikusaka.nagano.jp\0yoshinogari.saga.jp\0"
-"*.dev.adobeaemcloud.com\0"
-"higashi.fukushima.jp\0"
-"lardal.no\0s3.dualstack.eu-central-1.amazonaws.com\0"
-"belem.br\0"
-"servegame.com\0"
-"uni5.net\0"
-"noda.chiba.jp\0"
-"lib.ms.us\0lib.nc.us\0"
-"countryestate.museum\0navuotna.no\0diamonds\0"
-"vt.it\0"
-"klabu.no\0r\xc3\xb8""d\xc3\xb8y.no\0cc.me.us\0"
-"am.gov.br\0"
-"edeka\0"
-"ong.br\0"
-"og.ao\0tula.su\0arvo.network\0"
-"aquila.it\0\xe5\x8f\xb0\xe6\xb9\xbe\0"
-"m\xc3\xa1tta-v\xc3\xa1rjjat.no\0"
-"\xd8\xa7\xd8\xaa\xd8\xb5\xd8\xa7\xd9\x84\xd8\xa7\xd8\xaa\0"
-"whoswho\0"
-"fm.it\0"
-"gos.pk\0africa.com\0"
-"makinohara.shizuoka.jp\0"
-"verbania.it\0"
-"futtsu.chiba.jp\0aid.pl\0"
-"sor-fron.no\0"
-"aostavalley.it\0earth\0"
-"amot.no\0"
-"sukagawa.fukushima.jp\0tone.ibaraki.jp\0kami.miyagi.jp\0"
-"london\0"
-"aero\0flatanger.no\0ct.us\0softbank\0"
-"ravenna.it\0"
-"oksnes.no\0"
-"trentino-s\xc3\xbc""dtirol.it\0nango.fukushima.jp\0"
-"manchester.museum\0"
-"eid.no\0"
-"dell-ogliastra.it\0"
-"statefarm\0"
-"utwente.io\0"
-"2038.io\0"
-"psc.br\0fan\0custom.metacentrum.cz\0"
-"plumbing\0"
-"orsta.no\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd9\x87\0"
-"maizuru.kyoto.jp\0"
-"z.se\0nj.us\0"
-"funabashi.chiba.jp\0asago.hyogo.jp\0"
-"shoo.okayama.jp\0higashine.yamagata.jp\0turen.tn\0"
-"scrapping.cc\0"
-"notaires.km\0"
-"oguni.kumamoto.jp\0"
-"kawaba.gunma.jp\0higashikagawa.kagawa.jp\0kuokgroup\0"
-"hagebostad.no\0"
-"kitaaiki.nagano.jp\0"
-"raisa.no\0"
-"miki.hyogo.jp\0mitsue.nara.jp\0higashiomi.shiga.jp\0"
-"dontexist.org\0"
-"cloud.metacentrum.cz\0"
-"journalist.aero\0aknoluokta.no\0dating\0"
-"\xe6\xbe\xb3\xe9\x96\x80\0"
-"exhibition.museum\0fm.no\0"
-"harima.hyogo.jp\0"
-"leirvik.no\0"
-"sayama.saitama.jp\0gda.pl\0"
-"esq\0"
-"aizuwakamatsu.fukushima.jp\0ise.mie.jp\0schmidt\0"
-"sor-aurdal.no\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0"
-"federation.aero\0"
-"ap.gov.br\0miyazu.kyoto.jp\0"
-"hi.us\0"
-"wodzislaw.pl\0\xd8\xa7\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\0"
-"vallee-aoste.it\0"
-"fusa.no\0"
-"yoshimi.saitama.jp\0"
-"sdn.gov.pl\0"
-"siellak.no\0hamburg\0"
-"cnt.br\0"
-"nagai.yamagata.jp\0"
-"lerdal.no\0"
-"furukawa.miyagi.jp\0"
-"hakata.fukuoka.jp\0abbott\0"
-"pimienta.org\0"
-"\xe8\xb0\xb7\xe6\xad\x8c\0"
-"sciencesnaturelles.museum\0lib.wi.us\0"
-"esan.hokkaido.jp\0ap.gov.pl\0"
-"trysil.no\0airbus\0dattorelay.com\0"
-"eus\0"
-"tarumizu.kagoshima.jp\0"
-"sherbrooke.museum\0"
-"fastlylb.net\0"
-"b\xc3\xa1hccavuotna.no\0"
-"se.gov.br\0kumenan.okayama.jp\0mielno.pl\0ddns.net\0"
-"aca.pro\0"
-"r\xc3\xa1hkker\xc3\xa1vju.no\0"
-"andria-barletta-trani.it\0yasugi.shimane.jp\0"
-"og.it\0annaka.gunma.jp\0"
-"services.aero\0transport.museum\0training\0\xeb\x8b\xb7\xeb\x84\xb7\0"
-"alessandria.it\0fuji.shizuoka.jp\0"
-"stockholm\0"
-"store.nf\0"
-"k12.nm.us\0east-kazakhstan.su\0"
-"yamatsuri.fukushima.jp\0"
-"alstahaug.no\0"
-"landrover\0"
-"tires\0"
-"isernia.it\0kadena.okinawa.jp\0pup.gov.pl\0"
-"mus.br\0"
-"midatlantic.museum\0"
-"sciencecenters.museum\0"
-"yashio.saitama.jp\0playstation\0"
-"k.bg\0"
-"nakagawa.tokushima.jp\0"
-"chippubetsu.hokkaido.jp\0"
-"s3.ap-south-1.amazonaws.com\0"
-"rehab\0"
-"locus\0"
-"\xc3\xb8yer.no\0"
-"sos.pl\0"
-"from-ne.com\0"
-"shibukawa.gunma.jp\0"
-"jerusalem.museum\0"
-"gs.mr.no\0gjovik.no\0"
-"kiwa.mie.jp\0"
-"healthcare\0"
-"bsb.br\0miyada.nagano.jp\0wroc.pl\0"
-"\xe6\xbe\xb3\xe9\x97\xa8\0"
-"vt.us\0"
-"fit\0"
-"s3.dualstack.eu-west-1.amazonaws.com\0"
-"vevelstad.no\0"
-"caa.aero\0"
-"matsuda.kanagawa.jp\0"
-"medical.museum\0sa-east-1.elasticbeanstalk.com\0dnshome.de\0"
-"tanohata.iwate.jp\0"
-"latino\0"
-"yabuki.fukushima.jp\0museum.tt\0"
-"dnsupdater.de\0"
-"shikaoi.hokkaido.jp\0"
-"musica.ar\0chikusei.ibaraki.jp\0"
-"ngo.lk\0"
-"maryland.museum\0"
-"taketa.oita.jp\0"
-"trentin-suedtirol.it\0kahoku.ishikawa.jp\0hayashima.okayama.jp\0"
-"ce.it\0gotsu.shimane.jp\0nakano.tokyo.jp\0"
-"shingu.fukuoka.jp\0"
-"musica.bo\0"
-"lighting\0"
-"yamamoto.miyagi.jp\0sa.gov.pl\0"
-"iveco\0from-wv.com\0"
-"azurewebsites.net\0"
-"hdfcbank\0"
-"ide.kyoto.jp\0"
-"civilisation.museum\0ngo.ng\0pgfog.com\0"
-"takarazuka.hyogo.jp\0kita.osaka.jp\0"
-"leksvik.no\0"
-"inf.br\0"
-"fly\0"
-"nsupdate.info\0"
-"oizumi.gunma.jp\0"
-"2000.hu\0vik.no\0k12.ky.us\0"
-"historyofscience.museum\0"
-"kuriyama.hokkaido.jp\0higashimatsuyama.saitama.jp\0"
-"chocolate.museum\0uk.eu.org\0"
-"saijo.ehime.jp\0fujiyoshida.yamanashi.jp\0"
-"delivery\0"
-"miyoshi.saitama.jp\0"
-"gliding.aero\0koebenhavn.museum\0orland.no\0"
-"mashiki.kumamoto.jp\0"
-"inf.cu\0balena-devices.com\0test-iserv.de\0"
-"archaeological.museum\0"
-"buzen.fukuoka.jp\0saka.hiroshima.jp\0android\0"
-"ngo.ph\0"
-"ulm.museum\0mydobiss.com\0"
-"store.ve\0"
-"chikujo.fukuoka.jp\0miyake.nara.jp\0"
-"corsica\0"
-"s3.cn-north-1.amazonaws.com.cn\0"
-"tozsde.hu\0school.na\0holmestrand.no\0foo\0s3-website.us-east-2.amazonaws.com\0"
-"farmstead.museum\0jewelry\0"
-"vanylven.no\0"
-"museumvereniging.museum\0phoenix.museum\0bu.no\0"
-"nagasu.kumamoto.jp\0fox\0"
-"tx.us\0noip.us\0"
-"lviv.ua\0"
-"target\0"
-"g\xc3\xa1\xc5\x8bgaviika.no\0"
-"isahaya.nagasaki.jp\0"
-"fresenius\0reliance\0"
-"berlevag.no\0bjerkreim.no\0"
-"bolzano-altoadige.it\0"
-"froya.no\0"
-"inami.toyama.jp\0canon\0"
-"school.nz\0tirol\0"
-"tokai.aichi.jp\0"
-"frog.museum\0porsgrunn.no\0"
-"gal\0"
-"fitness\0is-a-linux-user.org\0"
-"\xe9\xab\x98\xe7\x9f\xa5.jp\0"
-"homeunix.com\0"
-"wroclaw.pl\0gap\0"
-"res.in\0fukagawa.hokkaido.jp\0"
-"certification.aero\0jorpeland.no\0game-host.org\0"
-"forl\xc3\xac-cesena.it\0okegawa.saitama.jp\0"
-"gay\0"
-"akishima.tokyo.jp\0frl\0"
-"muncie.museum\0evenassi.no\0vestby.no\0wellbeingzone.eu\0"
-"vix.br\0"
-"br.com\0"
-"zj.cn\0rnrt.tn\0"
-"isehara.kanagawa.jp\0takaharu.miyazaki.jp\0"
-"vote\0"
-"pilot.aero\0presidio.museum\0"
-"ashibetsu.hokkaido.jp\0kawakami.nara.jp\0"
-"\xc3\xa5krehamn.no\0"
-"jetzt\0"
-"ferrero\0"
-"tabuse.yamaguchi.jp\0"
-"wakayama.wakayama.jp\0"
-"voto\0"
-"museum.mv\0"
-"museum.mw\0store.ro\0meteorapp.com\0"
-"m\xc3\xa5lselv.no\0if.ua\0"
-"tainai.niigata.jp\0"
-"hanno.saitama.jp\0"
-"dreamhosters.com\0"
-"museum.no\0institute\0"
-"minamiboso.chiba.jp\0"
-"stokke.no\0"
-"gdn\0"
-"quebec\0"
-"gea\0"
-"ftr\0"
-"3.bg\0"
-"gotemba.shizuoka.jp\0warmia.pl\0"
-"heritage.museum\0"
-"ve.it\0store.st\0"
-"museum.om\0"
-"moroyama.saitama.jp\0kaneyama.yamagata.jp\0cloudns.biz\0"
-"s3.eu-west-2.amazonaws.com\0"
-"mat.br\0!city.sendai.jp\0"
-"fujimino.saitama.jp\0"
-"nordre-land.no\0"
-"adm.br\0fun\0"
-"en.it\0"
-"gb.com\0dyndns-work.com\0"
-"sande.m\xc3\xb8re-og-romsdal.no\0\xd0\xb1\xd0\xb5\xd0\xbb\0virtualserver.io\0"
-"news\0"
-"horokanai.hokkaido.jp\0"
-"shoes\0"
-"aridagawa.wakayama.jp\0"
-"praxi\0dh.bytemark.co.uk\0"
-"ybo.review\0"
-"\xc3\xb8rland.no\0"
-"panasonic\0gotdns.org\0"
-"noda.iwate.jp\0next\0"
-"ot.it\0pd.it\0"
-"trentino-sued-tirol.it\0iizuka.fukuoka.jp\0"
-"\xe5\x85\xab\xe5\x8d\xa6\0"
-"inf.mk\0moscow\0"
-"hekinan.aichi.jp\0yonabaru.okinawa.jp\0"
-"chernovtsy.ua\0mk.ua\0from-ia.com\0is-very-evil.org\0ilovecollege.info\0dyn53.io\0"
-"frosta.no\0"
-"kirovograd.ua\0"
-"oga.akita.jp\0\xe0\xb4\xad\xe0\xb4\xbe\xe0\xb4\xb0\xe0\xb4\xa4\xe0\xb4\x82\0\xe4\xba\x9a\xe9\xa9\xac\xe9\x80\x8a\0"
-"ngo.za\0"
-"uonuma.niigata.jp\0"
-"ac\0"
-"ad\0"
-"ae\0\xe7\xb5\x84\xe7\xbb\x87.hk\0drayddns.com\0"
-"af\0"
-"ag\0kvanangen.no\0"
-"ai\0x.bg\0"
-"k.se\0"
-"al\0nagasaki.jp\0"
-"am\0"
-"futurehosting.at\0"
-"ao\0namsskogan.no\0fyi\0"
-"obama.nagasaki.jp\0saiki.oita.jp\0"
-"emergency.aero\0aq\0ba\0"
-"ar\0bb\0"
-"as\0"
-"at\0higashiagatsuma.gunma.jp\0"
-"au\0be\0iraq.museum\0"
-"bf\0"
-"aw\0bg\0"
-"ax\0bh\0is.it\0"
-"bi\0"
-"az\0bj\0"
-"intelligence.museum\0citi\0online\0"
-"bm\0"
-"bn\0valleaosta.it\0tottori.tottori.jp\0"
-"bo\0santacruz.museum\0"
-"kaisei.kanagawa.jp\0itoman.okinawa.jp\0swatch\0"
-"ca\0pics\0diskstation.me\0"
-"br\0"
-"bs\0cc\0"
-"bt\0cd\0"
-"bv\0cf\0"
-"bw\0cg\0"
-"ch\0"
-"by\0ci\0stjordal.no\0"
-"bz\0matera.it\0"
-"lillehammer.no\0lund.no\0city\0"
-"cl\0"
-"cm\0"
-"cn\0"
-"co\0"
-"noip.me\0diskstation.eu\0"
-"cr\0sicilia.it\0balsan-s\xc3\xbc""dtirol.it\0"
-"bozen-s\xc3\xbc""dtirol.it\0"
-"cu\0de\0"
-"cv\0restaurant\0"
-"cw\0"
-"cx\0\xe7\xa7\x8b\xe7\x94\xb0.jp\0"
-"cy\0london.museum\0"
-"cz\0dj\0sic.it\0"
-"dk\0afamilycompany\0gle\0"
-"trd.br\0"
-"dm\0capitalone\0"
-"cr.it\0shiriuchi.hokkaido.jp\0nyc.mn\0yandexcloud.net\0"
-"do\0burghof.museum\0balestrand.no\0lancia\0de.com\0servesarcasm.com\0"
-"remotewd.com\0"
-"chikuhoku.nagano.jp\0"
-"ec\0dallas.museum\0"
-"ee\0"
-"prd.fr\0"
-"eg\0\xe5\x8f\xb0\xe7\x81\xa3\0"
-"bizen.okayama.jp\0servebbs.net\0"
-"lutsk.ua\0"
-"dz\0"
-"imageandsound.museum\0jessheim.no\0"
-"cloudera.site\0"
-"karlsoy.no\0barrell-of-knowledge.info\0"
-"email\0"
-"es\0fuoisku.no\0"
-"et\0kuzumaki.iwate.jp\0odawara.kanagawa.jp\0"
-"eu\0gmo\0"
-"notaires.fr\0"
-"fi\0coldwar.museum\0storj.farm\0"
-"fj\0ohda.shimane.jp\0"
-"fm\0mining.museum\0"
-"gmx\0"
-"fo\0"
-"ga\0"
-"fr\0gb\0"
-"gd\0"
-"ge\0"
-"gf\0bpl.biz\0"
-"gg\0bokn.no\0wmflabs.org\0"
-"gh\0"
-"gi\0"
-"v\xc3\xa5ler.hedmark.no\0"
-"gl\0barlettatraniandria.it\0hokuryu.hokkaido.jp\0"
-"gm\0inf.ua\0"
-"gn\0pesaro-urbino.it\0nishihara.kumamoto.jp\0"
-"gp\0aomori.aomori.jp\0"
-"gq\0"
-"gr\0"
-"gs\0"
-"gt\0"
-"skydiving.aero\0gu\0goo\0"
-"gop\0"
-"gw\0santabarbara.museum\0"
-"gy\0fribourg.museum\0herokuapp.com\0"
-"got\0"
-"hk\0"
-"gov\0"
-"hm\0"
-"hn\0"
-"dinosaur.museum\0egersund.no\0osaka\0rackmaze.com\0"
-"hr\0"
-"ht\0id\0"
-"hu\0ie\0"
-"umi.fukuoka.jp\0joyo.kyoto.jp\0"
-"orkdal.no\0"
-"minano.saitama.jp\0"
-"newyork.museum\0radio\0"
-"il\0"
-"im\0"
-"in\0"
-"io\0"
-"iq\0prd.km\0"
-"ir\0fujisato.akita.jp\0sukumo.kochi.jp\0gyeongnam.kr\0"
-"is\0"
-"it\0"
-"je\0mx.na\0servehttp.com\0"
-"rm.it\0\xe5\x85\xac\xe5\x8f\xb8\0"
-"pointto.us\0"
-"gold\0leczna.pl\0"
-"americanantiques.museum\0booking\0spacekit.io\0"
-"golf\0"
-"orkanger.no\0"
-"jo\0"
-"jp\0akiruno.tokyo.jp\0"
-"marker.no\0"
-"name.hr\0"
-"sn\xc3\xa5""ase.no\0prvcy.page\0"
-"av.it\0"
-"ke\0bananarepublic\0hbo\0"
-"inashiki.ibaraki.jp\0kainan.tokushima.jp\0"
-"kg\0adobeaemcloud.com\0"
-"video.hu\0ki\0hobol.no\0lolipop.io\0"
-"store.bb\0"
-"logistics.aero\0prd.mg\0"
-"km\0dnsdojo.org\0"
-"kn\0"
-"kp\0"
-"la\0supply\0*.landing.myjino.ru\0"
-"kr\0lb\0"
-"lc\0cc.sd.us\0"
-"name.et\0kiyama.saga.jp\0"
-"kw\0"
-"trentino-stirol.it\0"
-"ky\0li\0illustration.museum\0java\0"
-"name.fj\0kz\0"
-"lk\0"
-"tv.bb\0hitachiota.ibaraki.jp\0ntdll.top\0"
-"gouv.fr\0kumejima.okinawa.jp\0agakhan\0"
-"mihama.chiba.jp\0ritto.shiga.jp\0hicam.net\0"
-"ma\0"
-"okaya.nagano.jp\0lr\0"
-"ls\0mc\0"
-"lt\0md\0"
-"lu\0me\0ping\0"
-"lv\0"
-"mg\0own.pm\0"
-"mh\0\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa7\xb0\xe0\xa6\xa4\0"
-"tv.bo\0ly\0pink\0"
-"mk\0"
-"tv.br\0yakumo.shimane.jp\0ml\0"
-"goog\0"
-"mn\0a.prod.fastly.net\0"
-"mo\0nokia\0"
-"ashiya.fukuoka.jp\0mp\0barefoot\0"
-"mq\0na\0gs.aa.no\0"
-"mr\0"
-"plc.ly\0ms\0nc\0lib.ne.us\0s3-ap-northeast-1.amazonaws.com\0store.dk\0"
-"yoshioka.gunma.jp\0mt\0"
-"mu\0ne\0\xc3\xa5mot.no\0"
-"mv\0nf\0"
-"philadelphiaarea.museum\0mw\0ng\0lima-city.de\0"
-"vr.it\0mx\0"
-"name.cy\0my\0ni\0*.vps.myjino.ru\0"
-"kawanishi.nara.jp\0mz\0"
-"nl\0"
-"freemasonry.museum\0*.spectrum.myjino.ru\0"
-"no\0"
-"gouv.ht\0prochowice.pl\0pa.leg.br\0"
-"per.la\0"
-"toyohashi.aichi.jp\0nr\0"
-"isleofman.museum\0valley.museum\0\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0"
-"beskidy.pl\0"
-"nu\0"
-"otoyo.kochi.jp\0"
-"name.eg\0grimstad.no\0"
-"fujiidera.osaka.jp\0"
-"app.render.com\0"
-"nz\0etisalat\0"
-"cr.ua\0apartments\0"
-"\xe5\x85\xac\xe7\x9b\x8a\0"
-"om\0\xe6\x95\x99\xe8\x82\xb2.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"hosting\0"
-"nu.ca\0pa\0"
-"esashi.hokkaido.jp\0"
-"tcm.museum\0cc.wi.us\0s3-ca-central-1.amazonaws.com\0"
-"pe\0dyn.home-webserver.de\0"
-"gouv.bj\0jeonnam.kr\0pf\0lima-city.at\0"
-"liguria.it\0takamatsu.kagawa.jp\0ph\0ostroleka.pl\0"
-"silk.museum\0tennis\0"
-"name.az\0"
-"pk\0"
-"pl\0"
-"pm\0s3.dualstack.us-east-2.amazonaws.com\0"
-"semboku.akita.jp\0pn\0democrat\0istanbul\0mattel\0"
-"*.transurl.be\0"
-"\xe5\xb2\xa9\xe6\x89\x8b.jp\0pb.leg.br\0"
-"qa\0"
-"wakkanai.hokkaido.jp\0pr\0"
-"ps\0"
-"abeno.osaka.jp\0wuoz.gov.pl\0pt\0"
-"gouv.ci\0"
-"per.nf\0"
-"pw\0works\0mydatto.com\0hobby-site.org\0"
-"taiki.hokkaido.jp\0world\0"
-"py\0"
-"kariwa.niigata.jp\0lima-city.ch\0"
-"id.au\0yk.ca\0"
-"griw.gov.pl\0"
-"austrheim.no\0marketing\0"
-"hokuto.yamanashi.jp\0"
-"re\0"
-"emilia-romagna.it\0"
-"x.se\0nh.us\0"
-"musashino.tokyo.jp\0"
-"rentals\0"
-"cymru.museum\0"
-"capetown\0hiv\0"
-"\xd9\x85\xd9\x88\xd9\x82\xd8\xb9\0"
-"nakaniikawa.toyama.jp\0"
-"ro\0"
-"sa\0"
-"sb\0"
-"iris.arpa\0rs\0sc\0"
-"sd\0"
-"ru\0se\0reise\0"
-"carrara-massa.it\0kamagaya.chiba.jp\0rifu.miyagi.jp\0ookuwa.nagano.jp\0"
-"americana.museum\0rw\0sg\0hockey\0"
-"wegrow.pl\0sh\0"
-"si\0"
-"sj\0for-the.biz\0"
-"otago.museum\0gs.ol.no\0sk\0"
-"kashiwara.osaka.jp\0sl\0"
-"sm\0"
-"sn\0"
-"so\0fed.us\0s3.eu-central-1.amazonaws.com\0"
-"amsw.nl\0"
-"sr\0"
-"ss\0tc\0"
-"st\0td\0"
-"su\0ebiz.tw\0"
-"arao.kumamoto.jp\0sv\0tf\0"
-"tv.im\0tg\0"
-"abashiri.hokkaido.jp\0sx\0th\0"
-"skole.museum\0sy\0lib.la.us\0"
-"sz\0tj\0hkt\0"
-"surgeonshall.museum\0tk\0"
-"tl\0""64-b.it\0"
-"tm\0"
-"siena.it\0tv.it\0fujikawa.yamanashi.jp\0tn\0"
-"to\0*.transurl.eu\0"
-"ens.tn\0"
-"ua\0paris.eu.org\0"
-"tr\0"
-"audnedaln.no\0*.on-rio.io\0"
-"tt\0"
-"saitama.saitama.jp\0tv\0"
-"tw\0ug\0"
-"\xe7\xbb\x84\xe7\xbb\x87.hk\0synology-diskstation.de\0"
-"tz\0"
-"uk\0wang\0"
-"labour.museum\0"
-"caltanissetta.it\0"
-"claims\0"
-"va\0krasnodar.su\0"
-"reggioemilia.it\0olsztyn.pl\0av.tr\0"
-"hasvik.no\0us\0vc\0"
-"seaport.museum\0plc.uk\0ve\0"
-"morioka.iwate.jp\0locker\0*.bzz.dapps.earth\0"
-"per.sg\0vg\0\xe5\xa4\xa7\xe6\x8b\xbf\0"
-"uy\0vi\0lego\0u2-local.xnbay.com\0"
-"laz.it\0uz\0"
-"ce.gov.br\0lazio.it\0moriguchi.osaka.jp\0tarnobrzeg.pl\0"
-"hanamigawa.chiba.jp\0pruszkow.pl\0vn\0"
-"hyundai\0"
-"stuff-4-sale.us\0"
-"\xe6\x94\xbf\xe5\xba\x9c.hk\0planetarium.museum\0"
-"nu.it\0"
-"vu\0googlecode.com\0"
-"tsushima.nagasaki.jp\0wf\0"
-"b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0"
-"schaeffler\0"
-"skierva.no\0"
-"gob.ar\0hikari.yamaguchi.jp\0"
-"priv.hu\0"
-"nakadomari.aomori.jp\0"
-"kakuda.miyagi.jp\0"
-"ws\0cooking\0from-ma.com\0"
-"nanmoku.gunma.jp\0"
-"broadcast.museum\0ulvik.no\0netlify.com\0"
-"servegame.org\0myiphost.com\0"
-"hot\0swiftcover\0"
-"i.bg\0gob.bo\0tv.na\0"
-"ecn.br\0sosnowiec.pl\0"
-"how\0"
-"us.org\0"
-"tokamachi.niigata.jp\0"
-"k12.wy.us\0"
-"gob.cl\0id.ir\0"
-"suwa.nagano.jp\0"
-"ogawara.miyagi.jp\0"
-"zhytomyr.ua\0"
-"trentinosuedtirol.it\0"
-"from-il.com\0"
-"allfinanz\0"
-"yt\0"
-"gildesk\xc3\xa5l.no\0"
-"walmart\0"
-"hopto.me\0hopto.org\0"
-"miyawaka.fukuoka.jp\0"
-"gob.do\0"
-"kurume.fukuoka.jp\0koya.wakayama.jp\0"
-"zm\0withyoutube.com\0"
-"honai.ehime.jp\0hokuto.hokkaido.jp\0"
-"gob.ec\0"
-"otsuchi.iwate.jp\0"
-"ibm\0*.otap.co\0"
-"arakawa.saitama.jp\0"
-"television.museum\0christmas\0"
-"sondre-land.no\0zw\0"
-"\xe5\xb1\xb1\xe6\xa2\xa8.jp\0"
-"aosta-valley.it\0\xd8\xb9\xd8\xb1\xd8\xa8\0"
-"ice\0"
-"cosenza.it\0"
-"gob.es\0istmein.de\0"
-"bs.it\0chikushino.fukuoka.jp\0yasu.shiga.jp\0"
-"home.dyndns.org\0"
-"red.sv\0"
-"vic.edu.au\0sevastopol.ua\0"
-"rimini.it\0\xe9\x95\xb7\xe5\xb4\x8e.jp\0"
-"council.aero\0"
-"incheon.kr\0"
-"sue.fukuoka.jp\0"
-"icu\0"
-"id.lv\0"
-"ushistory.museum\0odesa.ua\0"
-"nasu.tochigi.jp\0name.vn\0priv.at\0"
-"id.ly\0"
-"firm.ht\0"
-"barsy.club\0"
-"izena.okinawa.jp\0tosu.saga.jp\0naklo.pl\0*.transurl.nl\0"
-"oregontrail.museum\0"
-"ujiie.tochigi.jp\0"
-"linz.museum\0likescandy.com\0*.triton.zone\0"
-"mi.it\0"
-"delaware.museum\0politie\0"
-"ind.br\0firm.in\0nowruz\0"
-"tv.sd\0"
-"airtraffic.aero\0aigo\0"
-"gob.gt\0saarland\0"
-"inagi.tokyo.jp\0"
-"is-a-celticsfan.org\0"
-"nagato.yamaguchi.jp\0oum.gov.pl\0"
-"beats\0"
-"bill.museum\0cn.com\0from-or.com\0"
-"gob.hn\0name.tj\0"
-"dovre.no\0"
-"lib.nv.us\0guitars\0"
-"kamikawa.hokkaido.jp\0pi.leg.br\0"
-"chiyoda.tokyo.jp\0name.tr\0"
-"samnanger.no\0ifm\0"
-"name.tt\0"
-"zapto.org\0"
-"fedorainfracloud.org\0"
-"kiryu.gunma.jp\0ochi.kochi.jp\0"
-"\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89\0"
-"pb.ao\0"
-"tv.tr\0"
-"firm.co\0cc.na\0u2.xnbay.com\0"
-"ogaki.gifu.jp\0nishiawakura.okayama.jp\0"
-"or.at\0verisign\0"
-"redstone\0"
-"tv.tz\0"
-"or.bi\0potager.org\0"
-"iron.museum\0"
-"bergamo.it\0nishihara.okinawa.jp\0"
-"guernsey.museum\0firm.dk\0freeboxos.com\0"
-"kiyosato.hokkaido.jp\0fujisawa.kanagawa.jp\0"
-"wzmiuw.gov.pl\0"
-"california.museum\0from-al.com\0"
-"kagoshima.jp\0"
-"cc.wv.us\0"
-"forum.hu\0settlement.museum\0dontexist.com\0"
-"sex.hu\0georgia.museum\0"
-"kamakura.kanagawa.jp\0rmit\0"
-"or.ci\0fylkesbibl.no\0from-sc.com\0"
-"saotome.st\0"
-"annefrank.museum\0"
-"gouv.sn\0"
-"hirokawa.fukuoka.jp\0"
-"aejrie.no\0"
-"or.cr\0"
-"\xd2\x9b\xd0\xb0\xd0\xb7\0"
-"agematsu.nagano.jp\0"
-"emerck\0"
-"ag.it\0\xe5\xae\xae\xe5\xb4\x8e.jp\0upow.gov.pl\0"
-"ee.eu.org\0"
-"belluno.it\0isa.kagoshima.jp\0"
-"vuelos\0"
-"toyonaka.osaka.jp\0higashichichibu.saitama.jp\0"
-"riobranco.br\0okawa.kochi.jp\0"
-"ind.gt\0"
-"lib.sc.us\0bukhara.su\0"
-"karatsu.saga.jp\0"
-"name.qa\0"
-"name.pr\0"
-"culturalcenter.museum\0"
-"familyds.net\0"
-"joso.ibaraki.jp\0"
-"oirm.gov.pl\0"
-"uslivinghistory.museum\0jondal.no\0"
-"imamat\0"
-"name.na\0lifestyle\0dyn.ddnss.de\0tashkent.su\0"
-"toyotomi.hokkaido.jp\0"
-"gob.mx\0"
-"gob.ni\0b\xc3\xa5tsfjord.no\0school.za\0dyndns-mail.com\0dyndns-remote.com\0"
-"kawaguchi.saitama.jp\0name.mv\0"
-"name.ng\0cuisinella\0"
-"ind.in\0ogliastra.it\0"
-"name.my\0mymailer.com.tw\0"
-"nagasaki.nagasaki.jp\0kumagaya.saitama.jp\0kudamatsu.yamaguchi.jp\0"
-"i.ng\0"
-"yasuoka.nagano.jp\0"
-"eu-west-1.elasticbeanstalk.com\0"
-"shiga.jp\0ouchi.saga.jp\0"
-"railway.museum\0"
-"gamvik.no\0viajes\0"
-"automotive.museum\0"
-"1.bg\0"
-"id.us\0"
-"valle-aosta.it\0vc.it\0hu.net\0"
-"gob.pa\0"
-"courses\0"
-"gob.pe\0"
-"boomla.net\0"
-"dyndns-wiki.com\0"
-"soccer\0"
-"health.museum\0"
-"gob.pk\0"
-"cricket\0"
-"inc\0"
-"takahama.aichi.jp\0i.ph\0"
-"childrens.museum\0coupons\0ing\0cc.ua\0"
-"tonaki.okinawa.jp\0"
-"k12.ct.us\0"
-"or.id\0town\0pe.leg.br\0"
-"ind.kw\0ink\0"
-"nf.ca\0virtual-user.de\0"
-"localhost.daplie.me\0"
-"inazawa.aichi.jp\0"
-"geology.museum\0"
-"int\0fukui.jp\0dnsdojo.net\0"
-"name.mk\0sn\xc3\xa5sa.no\0cloud66.zone\0"
-"campidanomedio.it\0"
-"s3.dualstack.sa-east-1.amazonaws.com\0"
-"mi.th\0"
-"american.museum\0taipei\0"
-"or.it\0kumano.hiroshima.jp\0chigasaki.kanagawa.jp\0"
-"sydney\0"
-"furubira.hokkaido.jp\0urawa.saitama.jp\0"
-"ako.hyogo.jp\0"
-"hair\0"
-"kanna.gunma.jp\0sex.pl\0"
-"or.jp\0"
-"itau\0"
-"dabur\0"
-"name.jo\0bod\xc3\xb8.no\0"
-"or.ke\0kvinesdal.no\0"
-"otaki.chiba.jp\0"
-"is-gone.com\0"
-"transporte.bo\0toys\0"
-"v.bg\0england.museum\0us.na\0nes.buskerud.no\0"
-"ohtawara.tochigi.jp\0"
-"gouv.km\0epilepsy.museum\0i.se\0mi.us\0"
-"servebbs.org\0"
-"ushuaia.museum\0mer\xc3\xa5ker.no\0rovno.ua\0"
-"or.kr\0"
-"indiana.museum\0"
-"gob.sv\0"
-"firm.ve\0"
-"he.cn\0taki.mie.jp\0now.sh\0"
-"ono.fukushima.jp\0"
-"vestv\xc3\xa5g\xc3\xb8y.no\0nico\0"
-"go.gov.br\0mombetsu.hokkaido.jp\0"
-"repair\0sandvikcoromant\0"
-"komatsushima.tokushima.jp\0"
-"s3.dualstack.ap-south-1.amazonaws.com\0spdns.org\0"
-"nakatane.kagoshima.jp\0gouv.ml\0jcb\0"
-"select\0"
-"barum.no\0"
-"or.na\0"
-"bushey.museum\0is-a-llama.com\0"
-"or.mu\0honefoss.no\0gob.ve\0pictures\0cyon.link\0"
-"sasebo.nagasaki.jp\0"
-"tosa.kochi.jp\0asahi.nagano.jp\0"
-"aircraft.aero\0"
-"jcp\0"
-"ist\0"
-"sorum.no\0ooguy.com\0"
-"nagano.jp\0"
-"sciencecenter.museum\0"
-"mar.it\0"
-"nombre.bo\0no-ip.info\0"
-"gs.hl.no\0s3-eu-west-2.amazonaws.com\0"
-"satsumasendai.kagoshima.jp\0"
-"genoa.it\0yawata.kyoto.jp\0kiwi.nz\0azure-mobile.net\0"
-"e4.cz\0"
-"press.museum\0nissedal.no\0cc.tn.us\0"
-"itv\0"
-"ishinomaki.miyagi.jp\0"
-"chonan.chiba.jp\0coach\0"
-"aukra.no\0college\0vladimir.su\0"
-"gonohe.aomori.jp\0"
-"ro.eu.org\0"
-"hidaka.hokkaido.jp\0bando.ibaraki.jp\0"
-"freight.aero\0"
-"firm.ro\0km.ua\0"
-"vacations\0"
-"cards\0contractors\0"
-"daito.osaka.jp\0"
-"or.pw\0"
-"priv.pl\0"
-"tsumagoi.gunma.jp\0higashiyama.kyoto.jp\0ind.tn\0*.compute.amazonaws.com.cn\0rackmaze.net\0"
-"review\0"
-"historisch.museum\0naturalhistorymuseum.museum\0dep.no\0"
-"dyndns.info\0"
-"matsubara.osaka.jp\0"
-"shirataka.yamagata.jp\0"
-"cc.nm.us\0"
-"radom.pl\0"
-"piedmont.it\0"
-"rhcloud.com\0"
-"songdalen.no\0"
-"salem.museum\0k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0k12.vt.us\0"
-"fi.cr\0pr.leg.br\0"
-"pubtls.org\0"
-"estate\0vladimir.ru\0"
-"play\0"
-"priv.no\0s3-website-us-east-1.amazonaws.com\0"
-"pordenone.it\0kurate.fukuoka.jp\0kunisaki.oita.jp\0"
-"\xc3\xa5l.no\0"
-"miyagi.jp\0lgbt\0"
-"lyngen.no\0americanexpress\0"
-"nike\0"
-"kitahata.saga.jp\0firm.nf\0or.th\0"
-"jio\0firm.ng\0"
-"student.aero\0media.hu\0meeres.museum\0rsc.cdn77.org\0"
-"padua.it\0"
-"si.eu.org\0"
-"muko.kyoto.jp\0izumozaki.niigata.jp\0"
-"s3.dualstack.eu-west-2.amazonaws.com\0is-a-soxfan.org\0"
-"tomigusuku.okinawa.jp\0"
-"nakamura.kochi.jp\0"
-"riodejaneiro.museum\0"
-"at.it\0"
-"theater.museum\0or.ug\0"
-"campania.it\0fukuchiyama.kyoto.jp\0club\0"
-"medicina.bo\0wales.museum\0"
-"iwanai.hokkaido.jp\0minamidaito.okinawa.jp\0or.tz\0"
-"dynalias.net\0"
-"naturalsciences.museum\0"
-"toga.toyama.jp\0"
-"k12.al.us\0"
-"tec.ve\0services\0\xe3\x82\xb0\xe3\x83\xbc\xe3\x82\xb0\xe3\x83\xab\0"
-"priv.me\0or.us\0forgot.her.name\0"
-"mitaka.tokyo.jp\0"
-"genkai.saga.jp\0"
-"kalmykia.su\0"
-"aland.fi\0deloitte\0cn.eu.org\0"
-"haus\0"
-"louvre.museum\0pvt.k12.ma.us\0"
-"konskowola.pl\0"
-"education.tas.edu.au\0"
-"ranzan.saitama.jp\0jll\0"
-"kraanghke.no\0"
-"nowaruda.pl\0"
-"telebit.app\0"
-"otobe.hokkaido.jp\0"
-"catholic\0flynnhub.com\0"
-"katsuura.chiba.jp\0higashiizumo.shimane.jp\0"
-"insure\0"
-"trainer.aero\0flekkefjord.no\0yahoo\0"
-"jmp\0"
-"sa.edu.au\0cc.ma.us\0"
-"cymru\0sk.eu.org\0"
-"erimo.hokkaido.jp\0"
-"agrar.hu\0dnsalias.com\0"
-"cloudns.asia\0"
-"jnj\0"
-"fi.it\0"
-"kalmykia.ru\0"
-"kuwana.mie.jp\0"
-"workisboring.com\0"
-"trentinostirol.it\0"
-"ns.ca\0tolga.no\0"
-"storfjord.no\0"
-"vibo-valentia.it\0niihama.ehime.jp\0"
-"architecture.museum\0recht.pro\0"
-"parliament.nz\0"
-"washingtondc.museum\0"
-"square7.de\0"
-"uw.gov.pl\0warszawa.pl\0"
-"ragusa.it\0lukow.pl\0jot\0"
-"po.it\0daejeon.kr\0"
-"sykkylven.no\0"
-"joy\0"
-"lajolla.museum\0"
-"anamizu.ishikawa.jp\0namerikawa.toyama.jp\0"
-"neat-url.com\0"
-"abo.pa\0"
-"pro.az\0"
-"mckinsey\0"
-"komvux.se\0"
-"media.pl\0"
-"lur\xc3\xb8y.no\0"
-"pro.br\0minoh.osaka.jp\0mizuho.tokyo.jp\0noho.st\0"
-"ooshika.nagano.jp\0"
-"trentinoa-adige.it\0\xe1\x83\x92\xe1\x83\x94\0"
-"florist\0"
-"gjerstad.no\0hammerfest.no\0abogado\0cy.eu.org\0"
-"ru.eu.org\0se.eu.org\0"
-"santamaria.br\0yoshikawa.saitama.jp\0"
-"omaha.museum\0"
-"stavanger.no\0"
-"akdn\0observer\0"
-"bykle.no\0"
-"tahara.aichi.jp\0vapor.cloud\0"
-"press\0ae.org\0"
-"dscloud.biz\0"
-"seranishi.hiroshima.jp\0shimoji.okinawa.jp\0"
-"pro.cy\0"
-"square7.ch\0"
-"aremark.no\0karaganda.su\0barsy.co.uk\0"
-"tome.miyagi.jp\0"
-"amusement.aero\0pro.ec\0v.ua\0"
-"bd.se\0"
-"tt.im\0"
-"gs.jan-mayen.no\0lib.ks.us\0cz.eu.org\0"
-"hidaka.kochi.jp\0jeep\0"
-"gu.us\0appspot.com\0"
-"sh.cn\0ud.it\0"
-"shimane.jp\0"
-"higashiyoshino.nara.jp\0"
-"entertainment.aero\0"
-"lupin\0"
-"pro.fj\0"
-"ddnslive.com\0"
-"edu.krd\0"
-"off.ai\0"
-"dk.eu.org\0pokrovsk.su\0"
-"gaular.no\0netbank\0"
-"sowa.ibaraki.jp\0"
-"\xe5\x95\x86\xe5\xba\x97\0iki.fi\0"
-"kfh\0"
-"carraramassa.it\0"
-"assabu.hokkaido.jp\0"
-"*.compute.amazonaws.com\0"
-"daegu.kr\0cloudapp.net\0"
-"weibo\0"
-"k12.ma.us\0"
-"georgia.su\0"
-"etc.br\0"
-"os.hedmark.no\0"
-"pro.ht\0"
-"b\xc3\xa1jddar.no\0\xe5\x80\x8b\xe4\xba\xba.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"*.s5y.io\0"
-"fuettertdasnetz.de\0dscloud.me\0"
-"slg.br\0"
-"g.bg\0"
-"towada.aomori.jp\0"
-"nogata.fukuoka.jp\0sklep.pl\0"
-"jewelry.museum\0*.compute.estate\0"
-"faith\0"
-"graphics\0"
-"gniezno.pl\0homedepot\0"
-"n\xc3\xa6r\xc3\xb8y.no\0kia\0"
-"portland.museum\0troandin.no\0kurgan.su\0"
-"garden.museum\0gjemnes.no\0grong.no\0""4lima.de\0"
-"nishitosa.kochi.jp\0"
-"moonscale.net\0"
-"eidskog.no\0"
-"trani-andria-barletta.it\0voorloper.cloud\0"
-"pvt.ge\0bonn.museum\0kim\0"
-"webhop.biz\0"
-"forsand.no\0"
-"browsersafetymark.io\0de.eu.org\0"
-"\xd9\xbe\xd8\xa7\xd9\x83\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0"
-"takahama.fukui.jp\0malopolska.pl\0"
-"hachijo.tokyo.jp\0"
-"charity\0"
-"sannan.hyogo.jp\0elblag.pl\0"
-"force.museum\0audio\0"
-"\xe7\xae\x87\xe4\xba\xba.hk\0"
-"matsumae.hokkaido.jp\0"
-"shimonoseki.yamaguchi.jp\0"
-"windows\0"
-"author\0"
-"itano.tokushima.jp\0gangwon.kr\0""4lima.at\0"
-"is-a-conservative.com\0"
-"ca.it\0"
-"lincoln.museum\0"
-"ninomiya.kanagawa.jp\0"
-"ciscofreak.com\0"
-"kuroiso.tochigi.jp\0lowicz.pl\0"
-"minamiise.mie.jp\0"
-"insurance.aero\0mus.mi.us\0"
-"dnsup.net\0"
-"kunstsammlung.museum\0rennes\xc3\xb8y.no\0"
-"gru.br\0"
-"ishikawa.jp\0\xe6\xb2\x96\xe7\xb8\x84.jp\0mitou.yamaguchi.jp\0"
-"online.museum\0pro.na\0"
-"tsukiyono.gunma.jp\0fujishiro.ibaraki.jp\0""4lima.ch\0"
-"science-fiction.museum\0plus\0"
-"ass.km\0"
-"pro.mv\0*.ex.futurecms.at\0"
-"katashina.gunma.jp\0"
-"otsuka\0"
-"cloudcontrolled.com\0"
-"inzai.chiba.jp\0"
-"koge.tottori.jp\0"
-"serveminecraft.net\0"
-"is-a-therapist.com\0"
-"konsulat.gov.pl\0"
-"pharmaciens.km\0"
-"hokkaido.jp\0"
-"even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0pro.om\0"
-"anquan\0"
-"lib.oh.us\0room\0sells-for-u.com\0"
-"caxias.br\0seiyo.ehime.jp\0toyotsu.fukuoka.jp\0"
-"xihuan\0"
-"\xe6\x95\x8e\xe8\x82\xb2.hk\0tranby.no\0pramerica\0"
-"industria.bo\0andasuolo.no\0cc.mn.us\0"
-"fbx-os.fr\0"
-"onna.okinawa.jp\0kosai.shizuoka.jp\0"
-"familyds.org\0"
-"arts.museum\0eastafrica.museum\0\xe9\x9b\xbb\xe8\xa8\x8a\xe7\x9b\x88\xe7\xa7\x91\0"
-"chesapeakebay.museum\0ca.na\0nittedal.no\0"
-"embaixada.st\0cloud\0garden\0"
-"microsoft\0"
-"lucerne.museum\0"
-"omura.nagasaki.jp\0chuo.yamanashi.jp\0pro.pr\0"
-"chiyoda.gunma.jp\0"
-"aseral.no\0"
-"noshiro.akita.jp\0kakinoki.shimane.jp\0"
-"olecko.pl\0"
-"ddnss.de\0"
-"bari.it\0"
-"spydeberg.no\0"
-"arezzo.it\0kpn\0"
-"aarborte.no\0"
-"emr.it\0"
-"tychy.pl\0"
-"jeju.kr\0"
-"santafe.museum\0valle.no\0"
-"forl\xc3\xac""cesena.it\0oyodo.nara.jp\0"
-"fukushima.hokkaido.jp\0shimizu.hokkaido.jp\0"
-"undersea.museum\0"
-"saku.nagano.jp\0blogspot.vn\0"
-"bus.museum\0"
-"s\xc3\xb8ndre-land.no\0"
-"tateyama.chiba.jp\0\xd1\x81\xd0\xb0\xd0\xb9\xd1\x82\0memset.net\0"
-"ca.eu.org\0"
-"shimonita.gunma.jp\0"
-"net.eu.org\0"
-"krd\0lat\0"
-"myactivedirectory.com\0"
-"law\0"
-"hitachinaka.ibaraki.jp\0atami.shizuoka.jp\0"
-"delmenhorst.museum\0"
-"urayasu.chiba.jp\0kakegawa.shizuoka.jp\0"
-"from-co.net\0"
-"tsuwano.shimane.jp\0"
-"itako.ibaraki.jp\0"
-"\xe5\xbe\xb3\xe5\xb3\xb6.jp\0"
-"alfaromeo\0"
-"trentinoaltoadige.it\0sakawa.kochi.jp\0"
-"starnberg.museum\0"
-"yamaguchi.jp\0"
-"r\xc3\xa5""de.no\0cc.al.us\0b-data.io\0myddns.rocks\0serveirc.com\0"
-"is-very-good.org\0"
-"pro.tt\0"
-"com.ac\0"
-"rotorcraft.aero\0"
-"com.af\0shingu.hyogo.jp\0"
-"com.ag\0"
-"um.gov.pl\0"
-"com.ai\0texas.museum\0"
-"vibovalentia.it\0isesaki.gunma.jp\0"
-"staging.onred.one\0homesecuritypc.com\0"
-"com.al\0vall\xc3\xa9""eaoste.it\0"
-"com.am\0"
-"tagawa.fukuoka.jp\0anan.nagano.jp\0"
-"com.ba\0bremanger.no\0"
-"com.ar\0com.bb\0urbino-pesaro.it\0"
-"lib.md.us\0"
-"com.au\0rennesoy.no\0"
-"torino.it\0"
-"com.aw\0"
-"com.bh\0va.it\0"
-"com.bi\0savannahga.museum\0fage\0lds\0blogspot.re\0"
-"com.az\0kashihara.nara.jp\0"
-"pro.vn\0"
-"com.bm\0"
-"com.bn\0"
-"com.bo\0"
-"aomori.jp\0"
-"hoylandet.no\0"
-"com.br\0"
-"com.bs\0sandoy.no\0s3-ap-northeast-2.amazonaws.com\0blogspot.ro\0"
-"com.bt\0dazaifu.fukuoka.jp\0"
-"revista.bo\0"
-"kinokawa.wakayama.jp\0"
-"blogspot.rs\0"
-"sagamihara.kanagawa.jp\0"
-"com.by\0com.ci\0athleta\0from-mo.com\0blogspot.ru\0blogspot.se\0"
-"com.bz\0ichinomiya.chiba.jp\0settsu.osaka.jp\0"
-"blogspot.sg\0"
-"com.cm\0blogspot.si\0"
-"com.cn\0"
-"com.co\0blogspot.sk\0"
-"creditunion\0olayangroup\0"
-"blogspot.sn\0"
-"com.cu\0com.de\0"
-"hakodate.hokkaido.jp\0nishimera.miyazaki.jp\0"
-"com.cw\0"
-"blogspot.td\0"
-"com.cy\0afjord.no\0tromso.no\0"
-"hirono.fukushima.jp\0ebina.kanagawa.jp\0cnpy.gdn\0"
-"macapa.br\0"
-"com.dm\0ca.us\0"
-"com.do\0"
-"fail\0"
-"com.ec\0jamison.museum\0"
-"com.ee\0"
-"juniper\0"
-"com.eg\0comsec\0cd.eu.org\0cust.prod.thingdust.io\0"
-"tsuno.kochi.jp\0ohira.miyagi.jp\0us.gov.pl\0"
-"com.dz\0friulive-giulia.it\0"
-"blogspot.tw\0blogspot.ug\0"
-"alesund.no\0"
-"yokosuka.kanagawa.jp\0"
-"from-wi.com\0"
-"medio-campidano.it\0"
-"com.es\0"
-"com.et\0furano.hokkaido.jp\0jeonbuk.kr\0"
-"t.bg\0"
-"weir\0blogspot.mr\0"
-"g.se\0"
-"xj.cn\0"
-"com.fj\0oiso.kanagawa.jp\0"
-"inuyama.aichi.jp\0blogspot.mx\0"
-"l\xc3\xa4ns.museum\0blogspot.my\0"
-"yamagata.nagano.jp\0"
-"cruises\0"
-"blogspot.nl\0"
-"e12.ve\0"
-"com.fr\0iijima.nagano.jp\0"
-"va.no\0abbvie\0homelinux.com\0blogspot.no\0"
-"gs.cn\0"
-"com.ge\0home-webserver.de\0"
-"uppo.gov.pl\0"
-"sogne.no\0"
-"com.gh\0"
-"com.gi\0bestbuy\0"
-"amami.kagoshima.jp\0"
-"discovery.museum\0"
-"com.gl\0"
-"k12.gu.us\0"
-"com.gn\0"
-"com.gp\0ms.leg.br\0"
-"conference.aero\0"
-"com.gr\0"
-"com.gt\0"
-"com.gu\0"
-"lidl\0"
-"magazine.aero\0davvenj\xc3\xa1rga.no\0"
-"daisen.akita.jp\0"
-"com.gy\0ally\0blogspot.pe\0"
-"art.br\0uryu.hokkaido.jp\0kikugawa.shizuoka.jp\0nanyo.yamagata.jp\0solar\0"
-"com.hk\0"
-"tozawa.yamagata.jp\0firewall-gateway.net\0"
-"dnsfor.me\0"
-"com.hn\0massa-carrara.it\0te.it\0"
-"user.srcf.net\0"
-"com.hr\0"
-"com.ht\0"
-"blogspot.qa\0"
-"plants.museum\0"
-"tohnosho.chiba.jp\0blogspot.pt\0"
-"hdfc\0llc\0"
-"cn.it\0career\0"
-"com.im\0asnes.no\0"
-"narashino.chiba.jp\0"
-"com.io\0life\0"
-"togo.aichi.jp\0numazu.shizuoka.jp\0mt.leg.br\0"
-"com.iq\0eastcoast.museum\0sebastopol.ua\0cloud66.ws\0"
-"matsuura.nagasaki.jp\0"
-"parliament.cy\0com.is\0apple\0"
-"minato.osaka.jp\0"
-"echizen.fukui.jp\0shichikashuku.miyagi.jp\0llp\0"
-"art.do\0fans\0is-a-bulls-fan.com\0blogspot.is\0"
-"blogspot.it\0"
-"zama.kanagawa.jp\0"
-"acct.pro\0smile\0"
-"stada\0"
-"com.jo\0ryukyu\0"
-"ureshino.mie.jp\0"
-"wa.gov.au\0"
-"art.dz\0mihara.kochi.jp\0"
-"barcelona.museum\0"
-"mt.it\0northwesternmutual\0blogspot.jp\0za.net\0"
-"cc.de.us\0"
-"sanjo.niigata.jp\0"
-"com.kg\0atlanta.museum\0"
-"kamigori.hyogo.jp\0"
-"com.ki\0"
-"fie.ee\0com.km\0blogsyte.com\0"
-"kosuge.yamanashi.jp\0com.kp\0"
-"com.la\0s3-ap-south-1.amazonaws.com\0"
-"com.lb\0"
-"com.lc\0"
-"bjark\xc3\xb8y.no\0"
-"blogspot.kr\0"
-"com.kw\0australia.museum\0skanland.no\0apps.fbsbx.com\0"
-"com.ky\0v\xc3\xa1rgg\xc3\xa1t.no\0"
-"com.kz\0"
-"com.lk\0malvik.no\0dynalias.org\0"
-"blogspot.li\0"
-"in-vpn.org\0"
-"osakikamijima.hiroshima.jp\0iiyama.nagano.jp\0com.lr\0lol\0"
-"com.lv\0ic.gov.pl\0"
-"com.mg\0"
-"blogspot.lt\0blogspot.md\0"
-"\xe7\xb6\xb2\xe7\xbb\x9c.hk\0com.ly\0blogspot.lu\0*.sys.qcx.io\0"
-"com.mk\0"
-"aizumisato.fukushima.jp\0com.ml\0"
-"tomika.gifu.jp\0"
-"com.mo\0blogspot.mk\0"
-"fujieda.shizuoka.jp\0"
-"com.na\0farm\0"
-"kouzushima.tokyo.jp\0\xd9\xbe\xd8\xa7\xda\xa9\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0lpl\0"
-"com.ms\0"
-"com.mt\0"
-"com.mu\0"
-"ono.hyogo.jp\0com.mv\0com.nf\0"
-"com.mw\0com.ng\0va.us\0"
-"com.mx\0"
-"com.my\0com.ni\0"
-"art.ht\0kamo.kyoto.jp\0kitayama.wakayama.jp\0"
-"l-o-g-i-n.de\0blogspot.fi\0"
-"izumiotsu.osaka.jp\0funagata.yamagata.jp\0"
-"like\0beta.bounty-full.com\0"
-"drive\0"
-"rikuzentakata.iwate.jp\0com.nr\0"
-"blog.bo\0webhosting.be\0"
-"ri.it\0man\0"
-"blog.br\0namie.fukushima.jp\0map\0blogspot.fr\0"
-"forde.no\0mba\0"
-"fast\0"
-"nanae.hokkaido.jp\0tsurugi.ishikawa.jp\0dental\0"
-"association.museum\0inderoy.no\0lenvik.no\0"
-"com.om\0dyn-berlin.de\0"
-"ac.leg.br\0"
-"co.network\0"
-"ar.it\0"
-"com.pa\0washtenaw.mi.us\0"
-"allstate\0gifts\0"
-"com.pe\0"
-"brescia.it\0com.pf\0blogspot.gr\0"
-"com.ph\0"
-"children.museum\0aramco\0"
-"tondabayashi.osaka.jp\0"
-"gj\xc3\xb8vik.no\0com.pk\0mypi.co\0"
-"aogaki.hyogo.jp\0com.pl\0"
-"ballooning.aero\0works.aero\0is-a-cpa.com\0"
-"!city.kobe.jp\0"
-"lind\xc3\xa5s.no\0blogspot.hk\0"
-"halsa.no\0com.qa\0photography\0abkhazia.su\0"
-"com.pr\0"
-"gs.oslo.no\0br\xc3\xb8nn\xc3\xb8y.no\0com.ps\0myshopblocks.com\0"
-"com.pt\0"
-"columbia.museum\0"
-"blogspot.hr\0"
-"tuxfamily.org\0"
-"kasukabe.saitama.jp\0amex\0"
-"com.py\0limo\0blogspot.hu\0blogspot.ie\0"
-"jl.cn\0ltd\0"
-"dattolocal.com\0"
-"kunohe.iwate.jp\0"
-"hikone.shiga.jp\0urown.cloud\0"
-"vald-aosta.it\0"
-"blogspot.in\0"
-"devices.resinstaging.io\0"
-"tenkawa.nara.jp\0"
-"com.re\0link\0safe\0blogspot.ba\0"
-"trentin-sud-tirol.it\0hinode.tokyo.jp\0"
-"sokndal.no\0from-ak.com\0couchpotatofries.org\0"
-"asahi.toyama.jp\0"
-"blogspot.be\0"
-"moka.tochigi.jp\0med\0"
-"associates\0blogspot.bg\0"
-"hamburg.museum\0"
-"fukuoka.jp\0kawazu.shizuoka.jp\0cool\0blogspot.bj\0"
-"com.ro\0dyndns1.de\0"
-"skierv\xc3\xa1.no\0com.sa\0"
-"coop\0com.sb\0"
-"gran.no\0com.sc\0"
-"com.sd\0men\0thruhere.net\0"
-"aetna\0com.se\0com.ru\0blogspot.ca\0"
-"com.sg\0clinique\0"
-"com.sh\0"
-"lancashire.museum\0"
-"tagajo.miyagi.jp\0sakaki.nagano.jp\0blogspot.cf\0"
-"air-traffic-control.aero\0te.ua\0"
-"adv.br\0com.sl\0blogspot.ch\0"
-"k12.tn.us\0trading\0"
-"udi.br\0com.sn\0"
-"com.so\0"
-"fg.it\0setagaya.tokyo.jp\0blogspot.cl\0"
-"hemsedal.no\0servebbs.com\0"
-"kommunalforbund.se\0com.ss\0"
-"ayagawa.kagawa.jp\0com.st\0"
-"nodebalancer.linode.com\0"
-"com.sv\0for.men\0"
-"cn.ua\0"
-"akita.jp\0kasuga.fukuoka.jp\0"
-"com.sy\0is-a-landscaper.com\0blogspot.de\0"
-"com.tj\0blogspot.cv\0"
-"mydatto.net\0"
-"muenchen.museum\0com.tm\0"
-"com.tn\0blogspot.cz\0"
-"com.to\0blogspot.dk\0"
-"eidfjord.no\0com.ua\0"
-"com.tr\0"
-"mino.gifu.jp\0ibara.okayama.jp\0izu.shizuoka.jp\0com.tt\0"
-"newjersey.museum\0tuva.su\0"
-"\xd8\xa7\xd8\xb1\xd8\xa7\xd9\x85\xd9\x83\xd9\x88\0"
-"mjondalen.no\0laakesvuemie.no\0com.tw\0com.ug\0"
-"ogawa.nagano.jp\0travelchannel\0"
-"h\xc3\xb8nefoss.no\0"
-"dyndns-home.com\0"
-"codes\0"
-"palmsprings.museum\0oppdal.no\0"
-"design\0"
-"monzabrianza.it\0"
-"rost.no\0com.vc\0\xe6\x94\xbf\xe5\x8a\xa1\0"
-"art.pl\0"
-"com.ve\0from-nj.com\0"
-"omigawa.chiba.jp\0"
-"hokksund.no\0"
-"sorocaba.br\0"
-"timekeeping.museum\0com.uy\0com.vi\0"
-"com.uz\0"
-"place\0"
-"hiratsuka.kanagawa.jp\0com.vn\0"
-"*.webhare.dev\0"
-"galsa.no\0"
-"mil\0"
-"zoological.museum\0sund.no\0t.se\0mt.us\0nd.us\0"
-"ora.gunma.jp\0"
-"com.vu\0"
-"ogano.saitama.jp\0piw.gov.pl\0"
-"bulsan-sudtirol.it\0koga.ibaraki.jp\0"
-"histoire.museum\0vikna.no\0githubusercontent.com\0"
-"mit\0"
-"nrw.museum\0"
-"es.gov.br\0"
-"gyokuto.kumamoto.jp\0"
-"kitamoto.saitama.jp\0"
-"bolt.hu\0western.museum\0"
-"com.ws\0"
-"skoczow.pl\0"
-"sale\0"
-"tochigi.jp\0"
-"davvenjarga.no\0"
-"k12.id.us\0"
-"from-ct.com\0codespot.com\0official.academy\0"
-"niigata.jp\0sakura.chiba.jp\0"
-"tsubame.niigata.jp\0"
-"stcgroup\0"
-"art.sn\0"
-"\xe5\x98\x89\xe9\x87\x8c\xe5\xa4\xa7\xe9\x85\x92\xe5\xba\x97\0glitch.me\0"
-"miyoshi.aichi.jp\0mlb\0"
-"\xc3\xb8stre-toten.no\0q-a.eu.org\0blogspot.ae\0"
-"tr.it\0"
-"ichikawa.chiba.jp\0"
-"erni\0"
-"live\0"
-"blogspot.al\0"
-"blogspot.am\0"
-"hinohara.tokyo.jp\0"
-"\xe6\x9b\xb8\xe7\xb1\x8d\0"
-"misato.saitama.jp\0bosch\0"
-"helsinki.museum\0bnpparibas\0"
-"malselv.no\0mma\0yolasite.com\0"
-"mls\0"
-"londrina.br\0"
-"guge\0"
-"com.zm\0ap-northeast-2.elasticbeanstalk.com\0"
-"folldal.no\0"
-"ri.us\0\xe9\xa3\x9f\xe5\x93\x81\0"
-"bahccavuotna.no\0"
-"abruzzo.it\0kumatori.osaka.jp\0grajewo.pl\0"
-"goip.de\0"
-"buyshouses.net\0"
-"\xe4\xb8\x89\xe9\x87\x8d.jp\0"
-"airguard.museum\0varoy.no\0"
-"yoita.niigata.jp\0"
-"ar.us\0"
-"*.cryptonomic.net\0"
-"aquarium.museum\0"
-"saito.miyazaki.jp\0"
-"meinforum.net\0"
-"stream\0s3-website-us-west-2.amazonaws.com\0"
-"pohl\0"
-"hurum.no\0moe\0"
-"takaishi.osaka.jp\0"
-"arboretum.museum\0"
-"kozagawa.wakayama.jp\0"
-"hawaii.museum\0moi\0"
-"mup.gov.pl\0"
-"mayfirst.info\0"
-"mom\0"
-"hitachi.ibaraki.jp\0"
-"sandvik\0"
-"e.bg\0ostre-toten.no\0ch.eu.org\0ybo.science\0"
-"homelinux.net\0"
-"cc.oh.us\0"
-"mov\0for-more.biz\0"
-"catanzaro.it\0cieszyn.pl\0"
-"mytis.ru\0"
-"vn.ua\0"
-"guardian\0"
-"ac.ae\0"
-"tr.no\0"
-"gd.cn\0"
-"knightpoint.systems\0"
-"nab\0"
-"lunner.no\0"
-"urasoe.okinawa.jp\0isla.pr\0"
-"kayabe.hokkaido.jp\0sarl\0"
-"tarui.gifu.jp\0"
-"ac.at\0emp.br\0"
-"ac.be\0"
-"adv.mz\0"
-"nba\0"
-"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xd8\xa9\0productions\0"
-"eu-4.evennode.com\0synology-ds.de\0"
-"imabari.ehime.jp\0iwi.nz\0"
-"cherkassy.ua\0"
-"kashiwa.chiba.jp\0"
-"idv.hk\0mango\0"
-"bounty-full.com\0"
-"\xe7\xa6\x8f\xe5\xb3\xb6.jp\0"
-"s\xc3\xb8r-odal.no\0"
-"\xe9\x95\xb7\xe9\x87\x8e.jp\0kuchinotsu.nagasaki.jp\0help\0"
-"ac.ci\0condos\0extraspace\0"
-"avianca\0"
-"trentinos-tirol.it\0msd\0"
-"motorcycle.museum\0"
-"ac.cn\0bo.it\0shirakawa.fukushima.jp\0"
-"bradesco\0"
-"makurazaki.kagoshima.jp\0"
-"moareke.no\0mypep.link\0"
-"ac.cr\0"
-"shishikui.tokushima.jp\0\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe\0"
-"mihama.aichi.jp\0prof.pr\0"
-"ac.cy\0vantaa.museum\0stufftoread.com\0"
-"air-surveillance.aero\0elverum.no\0"
-"misaki.okayama.jp\0"
-"nakanojo.gunma.jp\0al.leg.br\0"
-"patria.bo\0"
-"sakai.fukui.jp\0"
-"mtn\0"
-"save\0"
-"lu.it\0me.it\0tendo.yamagata.jp\0"
-"chiropractic.museum\0"
-"mtr\0"
-"nec\0"
-"andriatranibarletta.it\0\xd8\xa8\xda\xbe\xd8\xa7\xd8\xb1\xd8\xaa\0"
-"linkyard.cloud\0"
-"qbuser.com\0"
-"yachiyo.ibaraki.jp\0"
-"me.ke\0"
-"ac.fj\0ogawa.saitama.jp\0"
-"uk0.bigv.io\0"
-"net\0univ.sn\0co.financial\0"
-"oldnavy\0eu-3.evennode.com\0"
-"new\0"
-"tatsuno.hyogo.jp\0"
-"rahkkeravju.no\0is-a-socialist.com\0"
-"nfl\0"
-"kiho.mie.jp\0showa.yamanashi.jp\0"
-"vodka\0geekgalaxy.com\0"
-"k12.vi.us\0"
-"sf.no\0n\xc3\xa1vuotna.no\0"
-"ac.gn\0fudai.iwate.jp\0"
-"saxo\0servep2p.com\0"
-"hasama.oita.jp\0nishikata.tochigi.jp\0"
-"naturhistorisches.museum\0"
-"futuremailing.at\0"
-"k12.fl.us\0ngo\0"
-"tatebayashi.gunma.jp\0"
-"at.eu.org\0"
-"on.ca\0assisi.museum\0"
-"kokubunji.tokyo.jp\0"
-"here\0"
-"cookingchannel\0website.yandexcloud.net\0"
-"hatogaya.saitama.jp\0"
-"berg.no\0nhk\0"
-"ac.id\0"
-"noheji.aomori.jp\0"
-"bearalv\xc3\xa1hki.no\0for.mom\0"
-"pz.it\0"
-"tube\0"
-"misato.akita.jp\0global.ssl.fastly.net\0"
-"karate.museum\0uklugs.org\0"
-"ac.il\0mol.it\0"
-"ac.im\0pittsburgh.museum\0guru\0"
-"ac.in\0porn\0"
-"gs.vf.no\0"
-"k12.or.us\0"
-"ac.ir\0"
-"bir.ru\0"
-"za.org\0"
-"damnserver.com\0"
-"eu-2.evennode.com\0"
-"homesense\0"
-"vercelli.it\0ac.jp\0"
-"educational.museum\0alstom\0"
-"mikasa.hokkaido.jp\0sado.niigata.jp\0"
-"dyn-vpn.de\0"
-"andriabarlettatrani.it\0post\0router.management\0"
-"ac.ke\0hamar.no\0"
-"otama.fukushima.jp\0minamiashigara.kanagawa.jp\0"
-"oita.jp\0"
-"kitahiroshima.hokkaido.jp\0"
-"horology.museum\0"
-"is-a-nascarfan.com\0"
-"ac.kr\0a.run.app\0"
-"matsumoto.kagoshima.jp\0"
-"brand.se\0prime\0"
-"virtueeldomein.nl\0"
-"duckdns.org\0"
-"ac.lk\0"
-"tc.br\0"
-"ac.ma\0shouji\0"
-"onjuku.chiba.jp\0"
-"ac.ls\0\xe7\xb6\xb2\xe8\xb7\xaf.tw\0"
-"pomorskie.pl\0"
-"ac.me\0kr\xc3\xa5""anghke.no\0"
-"shimotsuma.ibaraki.jp\0"
-"tokushima.jp\0shikabe.hokkaido.jp\0"
-"pixolino.com\0"
-"livorno.it\0kira.aichi.jp\0onagawa.miyagi.jp\0"
-"masaki.ehime.jp\0"
-"camdvr.org\0"
-"kembuchi.hokkaido.jp\0"
-"ringsaker.no\0rv.ua\0is-a-hard-worker.com\0"
-"appchizi.com\0"
-"kitagawa.kochi.jp\0"
-"ac.mu\0birthplace.museum\0"
-"a.ssl.fastly.net\0"
-"graz.museum\0ac.mw\0"
-"miho.ibaraki.jp\0"
-"group.aero\0ac.ni\0bostik\0insurance\0"
-"ac.mz\0"
-"hiraizumi.iwate.jp\0"
-"environmentalconservation.museum\0eu-1.evennode.com\0myftp.org\0"
-"naroy.no\0www.ro\0ftpaccess.cc\0"
-"nb.ca\0"
-"fuefuki.yamanashi.jp\0"
-"bergbau.museum\0francaise.museum\0me.so\0delta\0tiffany\0"
-"mywire.org\0"
-"geometre-expert.fr\0sells-it.net\0"
-"ac.nz\0"
-"ravendb.me\0"
-"kamitsue.oita.jp\0"
-"arakawa.tokyo.jp\0"
-"idv.tw\0"
-"hellas.museum\0ac.pa\0"
-"kyiv.ua\0"
-"\xe8\x8c\xa8\xe5\x9f\x8e.jp\0soni.nara.jp\0"
-"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xdb\x83\0"
-"*.sapporo.jp\0"
-"k12.mn.us\0family\0myhome-server.de\0"
-"sera.hiroshima.jp\0"
-"me.tz\0"
-"lierne.no\0me.uk\0lundbeck\0now\0"
-"fukumitsu.toyama.jp\0download\0"
-"3utilities.com\0"
-"ac.pr\0"
-"!www.ck\0"
-"r.bg\0"
-"tobe.ehime.jp\0"
-"e.se\0me.us\0"
-"sites.static.land\0"
-"d.gv.vc\0"
-"motegi.tochigi.jp\0"
-"\xd8\xb4\xd8\xa8\xd9\x83\xd8\xa9\0"
-"qld.au\0villas\0"
-"journalism.museum\0"
-"chizu.tottori.jp\0ravendb.run\0"
-"ha.cn\0im.it\0"
-"\xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\0"
-"hiroo.hokkaido.jp\0"
-"lel.br\0"
-"nra\0"
-"kodaira.tokyo.jp\0"
-"higashi.fukuoka.jp\0kawara.fukuoka.jp\0hikawa.shimane.jp\0"
-"basel.museum\0"
-"\xe7\x8f\xa0\xe5\xae\x9d\0"
-"yakumo.hokkaido.jp\0"
-"inder\xc3\xb8y.no\0obi\0"
-"otofuke.hokkaido.jp\0frontdoor\0"
-"heroy.more-og-romsdal.no\0ac.rs\0onrender.com\0"
-"haboro.hokkaido.jp\0"
-"enebakk.no\0ac.se\0ac.ru\0"
-"ac.rw\0"
-"asakuchi.okayama.jp\0calvinklein\0"
-"ss.it\0yamashina.kyoto.jp\0"
-"nrw\0uy.com\0"
-"in-vpn.net\0"
-"azerbaijan.su\0"
-"soo.kagoshima.jp\0"
-"ddr.museum\0"
-"vda.it\0kyoto.jp\0fuchu.toyama.jp\0ac.th\0"
-"cl.it\0hatsukaichi.hiroshima.jp\0ac.sz\0ac.tj\0"
-"shingu.wakayama.jp\0boston\0"
-"time.no\0"
-"co.events\0"
-"sano.tochigi.jp\0"
-"inatsuki.fukuoka.jp\0"
-"ac.ug\0"
-"ac.tz\0"
-"ac.uk\0"
-"sassari.it\0ntt\0theater\0"
-"crew.aero\0ullensvang.no\0"
-"wazuka.kyoto.jp\0"
-"yamanakako.yamanashi.jp\0"
-"cc.dc.us\0"
-"lubartow.pl\0"
-"brunel.museum\0"
-"jgora.pl\0"
-"york.museum\0"
-"friulivenezia-giulia.it\0"
-"\xc3\xa5rdal.no\0lelux.site\0"
-"cci.fr\0chungbuk.kr\0ac.vn\0off\0"
-"tadaoka.osaka.jp\0"
-"rochester.museum\0"
-"\xd8\xa7\xd8\xa8\xd9\x88\xd8\xb8\xd8\xa8\xd9\x8a\0"
-"vanguard\0"
-"budejju.no\0"
-"wiih.gov.pl\0privatizehealthinsurance.net\0"
-"erotica.hu\0"
-"clubmed\0"
-"*.awdev.ca\0"
-"yugawa.fukushima.jp\0nagaoka.niigata.jp\0"
-"yamanouchi.nagano.jp\0"
-"lakas.hu\0"
-"minakami.gunma.jp\0yoka.hyogo.jp\0gov.scot\0"
-"nfshost.com\0"
-"koshigaya.saitama.jp\0"
-"ina.ibaraki.jp\0"
-"is-an-anarchist.com\0"
-"ciencia.bo\0traeumtgerade.de\0"
-"riik.ee\0maritimo.museum\0""1kapp.com\0"
-"spreadbetting\0"
-"sanda.hyogo.jp\0ikeda.nagano.jp\0"
-"franziskaner.museum\0"
-"crd.co\0"
-"nagareyama.chiba.jp\0"
-"shimoda.shizuoka.jp\0"
-"s3-website-sa-east-1.amazonaws.com\0"
-"kasuya.fukuoka.jp\0"
-"nyc\0s3.dualstack.ap-northeast-1.amazonaws.com\0"
-"biella.it\0kosei.shiga.jp\0"
-"groks-this.info\0"
-"social\0"
-"ac.za\0"
-"riopreto.br\0rg.it\0"
-"data\0"
-"kawamata.fukushima.jp\0"
-"date\0au.eu.org\0be.eu.org\0"
-"*.hosting.myjino.ru\0"
-"treviso.it\0"
-"anthro.museum\0ac.zm\0"
-"mr.no\0"
-"ap.it\0parma.it\0"
-"chuo.chiba.jp\0"
-"is-an-accountant.com\0"
-"sannohe.aomori.jp\0"
-"ac.zw\0"
-"trentinosud-tirol.it\0"
-"\xe9\xa4\x90\xe5\x8e\x85\0"
-"yoro.gifu.jp\0worse-than.tv\0"
-"sardegna.it\0\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86\0"
-"mitsubishi\0is-certified.com\0"
-"oe.yamagata.jp\0"
-"lib.ca.us\0"
-"aju.br\0shinkamigoto.nagasaki.jp\0"
-"ar.com\0"
-"veg\xc3\xa5rshei.no\0homelinux.org\0"
-"whaling.museum\0"
-"minamiaiki.nagano.jp\0"
-"handson.museum\0ha.no\0"
-"soma.fukushima.jp\0"
-"kasuga.hyogo.jp\0ryuoh.shiga.jp\0\xe0\xa8\xad\xe0\xa8\xbe\xe0\xa8\xb0\xe0\xa8\xa4\0"
-"civilwar.museum\0"
-"susono.shizuoka.jp\0"
-"naie.hokkaido.jp\0"
-"tachiarai.fukuoka.jp\0tokushima.tokushima.jp\0"
-"birkenes.no\0"
-"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86\0"
-"k\xc3\xa5""fjord.no\0"
-"gunma.jp\0saroma.hokkaido.jp\0"
-"bg.eu.org\0"
-"one\0x443.pw\0"
-"ong\0"
-"fe.it\0"
-"gok.pk\0"
-"mifune.kumamoto.jp\0aguni.okinawa.jp\0ostrowwlkp.pl\0"
-"laspezia.it\0onl\0scor\0"
-"ringerike.no\0"
-"scot\0"
-"blogdns.org\0"
-"yaotsu.gifu.jp\0"
-"mortgage\0"
-"cam.it\0actor\0"
-"fhs.no\0ooo\0"
-"tempioolbia.it\0"
-"trader.aero\0cc.fl.us\0dyn-ip24.de\0"
-"act.edu.au\0larvik.no\0"
-"k12.ny.us\0"
-"now-dns.top\0"
-"vic.au\0"
-"vpnplus.to\0"
-"iz.hr\0durban\0"
-"nationwide\0"
-"\xe7\xbb\x84\xe7\xbb\x87\xe6\x9c\xba\xe6\x9e\x84\0"
-"nic.in\0"
-"r.se\0"
-"halden.no\0cc.pr.us\0"
-"iveland.no\0tr\xc3\xb8gstad.no\0"
-"trafficplex.cloud\0"
-"sci.eg\0tec.mi.us\0"
-"org\0"
-"hn.cn\0"
-"pay\0"
-"dynserv.org\0"
-"\xe6\x96\xb0\xe6\xbd\x9f.jp\0fujinomiya.shizuoka.jp\0"
-"yatsuka.shimane.jp\0"
-"gs.of.no\0"
-"the.br\0"
-"minamiawaji.hyogo.jp\0comcast\0"
-"network\0soundcast.me\0"
-"*.sendai.jp\0"
-"chuo.osaka.jp\0"
-"mallorca.museum\0"
-"nanbu.yamanashi.jp\0"
-"nikon\0map.fastly.net\0"
-"money.museum\0hr.eu.org\0"
-"sd.cn\0tp.it\0"
-"stjohn.museum\0"
-"yatsushiro.kumamoto.jp\0ouda.nara.jp\0"
-"rogers\0"
-"wien\0"
-"seto.aichi.jp\0"
-"gujo.gifu.jp\0mitoyo.kagawa.jp\0nishikawa.yamagata.jp\0malbork.pl\0ott\0"
-"torsken.no\0"
-"torahime.shiga.jp\0"
-"engine.aero\0lib.va.us\0xfinity\0"
-"yokoshibahikari.chiba.jp\0"
-"tcp4.me\0"
-"rsvp\0"
-"clothing\0"
-"dst.mi.us\0"
-"chijiwa.nagasaki.jp\0"
-"iki.nagasaki.jp\0"
-"airforce\0operaunite.com\0"
-"pet\0"
-"is-with-theband.com\0"
-"cesenaforli.it\0"
-"entomology.museum\0"
-"no.it\0ovh\0trust\0"
-"naturalhistory.museum\0"
-"potenza.it\0hosting-cluster.nl\0"
-"\xe9\xa6\x99\xe6\xb8\xaf\0"
-"kv.ua\0"
-"basketball\0"
-"k12.me.us\0staples\0"
-"kushimoto.wakayama.jp\0"
-"tsuruta.aomori.jp\0"
-"karasuyama.tochigi.jp\0"
-"database.museum\0for.one\0"
-"static-access.net\0"
-"politica.bo\0\xc3\xb8vre-eiker.no\0"
-"c.bg\0"
-"flog.br\0*.nom.br\0"
-"in-brb.de\0"
-"cc.nv.us\0"
-"bulsan-s\xc3\xbc""dtirol.it\0phd\0eating-organic.net\0"
-"leikanger.no\0"
-"med.br\0"
-"withgoogle.com\0"
-"okuizumo.shimane.jp\0"
-"chikugo.fukuoka.jp\0"
-"dyndns.ddnss.de\0"
-"cyon.site\0"
-"ama.aichi.jp\0"
-"bingo\0"
-"pid\0"
-"theatre\0"
-"\xe9\xb9\xbf\xe5\x85\x90\xe5\xb3\xb6.jp\0"
-"ruovat.no\0"
-"\xd0\xb4\xd0\xb5\xd1\x82\xd0\xb8\0"
-"vads\xc3\xb8.no\0"
-"omihachiman.shiga.jp\0"
-"pin\0"
-"ip6.arpa\0"
-"vlog.br\0"
-"bo.telemark.no\0"
-"suzuka.mie.jp\0"
-"computer.museum\0russia.museum\0supplies\0"
-"lezajsk.pl\0"
-"med.ec\0wiki\0"
-"qh.cn\0sakae.nagano.jp\0"
-"med.ee\0"
-"mihama.wakayama.jp\0"
-"dyndns-server.com\0"
-"tel.tr\0senseering.net\0"
-"latina.it\0kuju.oita.jp\0tokashiki.okinawa.jp\0"
-"yasuda.kochi.jp\0datsun\0"
-"wildlife.museum\0"
-"trieste.it\0"
-"\xe6\xbb\x8b\xe8\xb3\x80.jp\0sakae.chiba.jp\0kikuchi.kumamoto.jp\0hgtv\0"
-"irish\0"
-"isa-geek.org\0"
-"nasushiobara.tochigi.jp\0mikawa.yamagata.jp\0"
-"kamaishi.iwate.jp\0vlaanderen\0"
-"kozaki.chiba.jp\0setouchi.okayama.jp\0"
-"qa2.com\0"
-"curitiba.br\0fukushima.fukushima.jp\0"
-"\xe7\xbd\x91\xe7\xbb\x9c.cn\0nic.tj\0"
-"grozny.su\0"
-"mizunami.gifu.jp\0kamikitayama.nara.jp\0nagatoro.saitama.jp\0*.stg.dev\0"
-"black\0"
-"mc.it\0rzeszow.pl\0workers.dev\0"
-"l\xc3\xa1hppi.no\0"
-"stadt.museum\0"
-"szkola.pl\0"
-"skiptvet.no\0wine\0"
-"kobayashi.miyazaki.jp\0tonami.toyama.jp\0"
-"pharmacy.museum\0lease\0"
-"nhs.uk\0accountants\0"
-"wakasa.fukui.jp\0"
-"vicenza.it\0"
-"brumunddal.no\0"
-"gs.ah.no\0"
-"pnc\0"
-"no-ip.co.uk\0"
-"ma.gov.br\0med.ht\0\xe7\xbe\xa4\xe9\xa6\xac.jp\0"
-"hakusan.ishikawa.jp\0"
-"minamimaki.nagano.jp\0\xe9\x9b\x86\xe5\x9b\xa2\0"
-"usdecorativearts.museum\0from-va.com\0"
-"shinshinotsu.hokkaido.jp\0fujimi.nagano.jp\0"
-"wiki.bo\0nebraska.museum\0"
-"fr.it\0shunan.yamaguchi.jp\0serveftp.net\0"
-"lib.ee\0"
-"wiki.br\0credit\0"
-"grozny.ru\0"
-"\xd0\xba\xd0\xbe\xd0\xbc\0"
-"doomdns.org\0"
-"brandywinevalley.museum\0"
-"kita.tokyo.jp\0"
-"mj\xc3\xb8ndalen.no\0"
-"shirako.chiba.jp\0"
-"sunagawa.hokkaido.jp\0"
-"championship.aero\0"
-"rikubetsu.hokkaido.jp\0hanyu.saitama.jp\0"
-"mesaverde.museum\0amsterdam\0"
-"v-info.info\0"
-"rieti.it\0joboji.iwate.jp\0\xe5\xa4\xa7\xe4\xbc\x97\xe6\xb1\xbd\xe8\xbd\xa6\0"
-"aure.no\0"
-"direct\0"
-"bievat.no\0"
-"okayama.jp\0kawasaki.miyagi.jp\0seat\0"
-"varese.it\0"
-"b\xc3\xb8.telemark.no\0"
-"hirosaki.aomori.jp\0"
-"\xe7\xbd\x91\xe7\xbb\x9c.hk\0baby\0"
-"bas.it\0"
-"s3.dualstack.ca-central-1.amazonaws.com\0c.la\0"
-"trentinsuedtirol.it\0"
-"lewismiller.museum\0"
-"anjo.aichi.jp\0"
-"nic.za\0living\0"
-"shinjo.okayama.jp\0"
-"boehringer\0"
-"compare\0"
-"kaszuby.pl\0"
-"dclk\0"
-"game.tw\0"
-"vall\xc3\xa9""edaoste.it\0"
-"country\0is-a-patsfan.org\0"
-"mizusawa.iwate.jp\0"
-"med.ly\0"
-"nikko.tochigi.jp\0linkyard-cloud.ch\0"
-"pro\0mobile\0"
-"arendal.no\0"
-"r\xc3\xa1isa.no\0ru.com\0"
-"pru\0"
-"trentin-sued-tirol.it\0"
-"yoichi.hokkaido.jp\0uto.kumamoto.jp\0"
-"podhale.pl\0"
-"ecologia.bo\0"
-"green\0"
-"\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0"
-"portal.museum\0schweiz.museum\0"
-"okuma.fukushima.jp\0"
-"seek\0"
-"travelersinsurance\0"
-"9guacu.br\0soja.okayama.jp\0sp.leg.br\0"
-"scientist.aero\0wanggou\0"
-"rankoshi.hokkaido.jp\0"
-"ventures\0"
-"tadotsu.kagawa.jp\0"
-"med.om\0"
-"mitsuke.niigata.jp\0kg.kr\0pub\0"
-"termez.su\0"
-"med.pa\0frogans\0"
-"umaji.kochi.jp\0unnan.shimane.jp\0"
-"farmequipment.museum\0"
-"tottori.jp\0"
-"rissa.no\0"
-"readthedocs.io\0"
-"prod\0"
-"prof\0"
-"gjerdrum.no\0barclays\0"
-"med.pl\0"
-"aa.no\0"
-"sd.us\0redumbrella\0"
-"mp.br\0"
-"cc.ut.us\0"
-"sayama.osaka.jp\0"
-"b\xc3\xa6rum.no\0"
-"obira.hokkaido.jp\0"
-"loginline.dev\0"
-"verran.no\0organic\0\xe6\xb7\xa1\xe9\xa9\xac\xe9\x94\xa1\0"
-"inagawa.hyogo.jp\0matsushima.miyagi.jp\0at-band-camp.net\0"
-"pwc\0"
-"zagan.pl\0"
-"haugesund.no\0company\0technology\0"
-"biev\xc3\xa1t.no\0"
-"tokai.ibaraki.jp\0"
-"mayfirst.org\0"
-"siracusa.it\0yaizu.shizuoka.jp\0ruhr\0"
-"rivne.ua\0k12.mt.us\0security\0"
-"taku.saga.jp\0"
-"rennebu.no\0from-dc.com\0"
-"choshi.chiba.jp\0"
-"il.eu.org\0nh-serv.co.uk\0"
-"coloradoplateau.museum\0kommune.no\0"
-"matsubushi.saitama.jp\0"
-"med.sa\0"
-"shibecha.hokkaido.jp\0med.sd\0"
-"firebaseapp.com\0"
-"p.bg\0"
-"c.se\0"
-"bato.tochigi.jp\0"
-"isa-geek.com\0"
-"okoppe.hokkaido.jp\0"
-"servepics.com\0"
-"tsunan.niigata.jp\0"
-"sabae.fukui.jp\0"
-"go.ci\0"
-"kosaka.akita.jp\0"
-"kanmaki.nara.jp\0kamikawa.saitama.jp\0"
-"webhop.org\0"
-"kijo.miyazaki.jp\0"
-"aktyubinsk.su\0"
-"go.cr\0"
-"ris\xc3\xb8r.no\0"
-"leangaviika.no\0hu.eu.org\0ie.eu.org\0"
-"higashiyamato.tokyo.jp\0netflix\0"
-"luroy.no\0wi.us\0"
-"powiat.pl\0"
-"dynamic-dns.info\0"
-"fujixerox\0"
-"tatsuno.nagano.jp\0ikaruga.nara.jp\0"
-"from-fl.com\0"
-"pors\xc3\xa1\xc5\x8bgu.no\0"
-"shima.mie.jp\0"
-"s3-external-1.amazonaws.com\0s3-website.ap-northeast-2.amazonaws.com\0"
-"realestate.pl\0kmpsp.gov.pl\0"
-"ta.it\0sko.gov.pl\0sopot.pl\0"
-"*.compute-1.amazonaws.com\0"
-"town.museum\0"
-"band\0"
-"ol.no\0"
-"bz.it\0bibai.hokkaido.jp\0"
-"directory\0"
-"asmatart.museum\0humanities.museum\0kongsberg.no\0"
-"other.nf\0"
-"cog.mi.us\0bank\0"
-"florence.it\0"
-"space\0"
-"livinghistory.museum\0k12.ar.us\0lib.tn.us\0"
-"nsw.edu.au\0"
-"gb.net\0"
-"space.museum\0"
-"berlin\0"
-"kaga.ishikawa.jp\0"
-"dscloud.mobi\0"
-"tomobe.ibaraki.jp\0"
-"\xe6\x94\xbf\xe5\xba\x9c.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"celtic.museum\0"
-"kamisato.saitama.jp\0"
-"bentley\0"
-"chihayaakasaka.osaka.jp\0"
-"gjesdal.no\0"
-"gs.rl.no\0"
-"ando.nara.jp\0"
-"dentist\0"
-"ancona.it\0accountant\0"
-"arab\0"
-"contemporary.museum\0"
-"aeroclub.aero\0"
-"go.id\0"
-"jinsekikogen.hiroshima.jp\0"
-"bnr.la\0from-pr.com\0"
-"skj\xc3\xa5k.no\0singles\0quicksytes.com\0"
-"higashinaruse.akita.jp\0zuerich\0"
-"muni.il\0"
-"british.museum\0kvitsoy.no\0voagat.no\0"
-"go.it\0inawashiro.fukushima.jp\0"
-"direct.quickconnect.to\0"
-"huissier-justice.fr\0"
-"backplaneapp.io\0"
-"\xe4\xbd\x9b\xe5\xb1\xb1\0"
-"indianmarket.museum\0"
-"go.jp\0"
-"algard.no\0"
-"webredirect.org\0outsystemscloud.com\0"
-"go.ke\0"
-"moscow.museum\0flowers\0"
-"doctor\0lublin.pl\0"
-"corvette.museum\0"
-"draydns.de\0"
-"volkswagen\0"
-"re.it\0"
-"her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0"
-"go.kr\0"
-"pubol.museum\0cust.dev.thingdust.io\0"
-"systems\0versicherung\0"
-"an.it\0yachimata.chiba.jp\0"
-"tattoo\0"
-"kujukuri.chiba.jp\0"
-"alabama.museum\0"
-"ashiya.hyogo.jp\0blogdns.net\0"
-"tas.edu.au\0finearts.museum\0"
-"sande.more-og-romsdal.no\0"
-"pomorze.pl\0principe.st\0tatar\0"
-"re.kr\0"
-"s3-fips-us-gov-west-1.amazonaws.com\0"
-"kasumigaura.ibaraki.jp\0"
-"miyazaki.miyazaki.jp\0"
-"byen.site\0"
-"schlesisches.museum\0gr.eu.org\0"
-"capital\0"
-"tamakawa.fukushima.jp\0"
-"maritime.museum\0"
-"uenohara.yamanashi.jp\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xa4\0"
-"is-leet.com\0"
-"nakagawa.nagano.jp\0"
-"opoczno.pl\0"
-"miasta.pl\0blogspot.co.at\0"
-"family.museum\0dubai\0"
-"kunitomi.miyazaki.jp\0cloudaccess.net\0"
-"nagaokakyo.kyoto.jp\0global\0red\0"
-"lib.nm.us\0"
-"8.bg\0"
-"stuff-4-sale.org\0"
-"perso.ht\0haibara.shizuoka.jp\0ren\0"
-"vladikavkaz.ru\0"
-"misawa.aomori.jp\0ashoro.hokkaido.jp\0"
-"qvc\0from-me.org\0"
-"luzern.museum\0cechire.com\0"
-"fc.it\0"
-"uk.com\0"
-"atsugi.kanagawa.jp\0"
-"wsa.gov.pl\0"
-"berkeley.museum\0fedje.no\0"
-"vladikavkaz.su\0"
-"bydgoszcz.pl\0"
-"shinonsen.hyogo.jp\0"
-"go.pw\0"
-"cc.wa.us\0"
-"hioki.kagoshima.jp\0"
-"deal\0"
-"campobasso.it\0"
-"gov.ac\0"
-"fukushima.jp\0hotel.tz\0"
-"gov.ae\0is-a-player.com\0"
-"gov.af\0tamano.okayama.jp\0tokorozawa.saitama.jp\0"
-"\xe0\xb0\xad\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\xa4\xe0\xb1\x8d\0ras.ru\0"
-"nm.cn\0pi.it\0"
-"go.dyndns.org\0"
-"loan\0"
-"sexy\0virtualuser.de\0"
-"gov.al\0es.kr\0\xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xa0\xe0\xa4\xa8\0"
-"khakassia.su\0"
-"gov.ba\0"
-"gov.ar\0gov.bb\0kaminoyama.yamagata.jp\0\xd8\xb3\xd9\x88\xd8\xaf\xd8\xa7\xd9\x86\0"
-"gov.as\0jan-mayen.no\0"
-"gov.au\0"
-"gov.bf\0carbonia-iglesias.it\0"
-"gov.bh\0"
-"gov.az\0r.cdn77.net\0"
-"\xe5\xb7\xa5\xe8\xa1\x8c\0nhlfan.net\0"
-"gov.bm\0"
-"gov.bn\0lecco.it\0"
-"norfolk.museum\0"
-"aurskog-holand.no\0holt\xc3\xa5len.no\0p.se\0"
-"gov.br\0iwate.iwate.jp\0"
-"gov.bs\0"
-"gov.bt\0gov.cd\0ril\0"
-"\xd9\x82\xd8\xb7\xd8\xb1\0dyndns-blog.com\0"
-"otari.nagano.jp\0"
-"andebu.no\0commbank\0rio\0oy.lc\0"
-"rip\0"
-"gov.by\0"
-"gov.bz\0nadex\0"
-"show.aero\0capebreton.museum\0"
-"gov.cl\0go.th\0"
-"gov.cm\0"
-"gov.cn\0hl.cn\0go.tj\0"
-"gov.co\0"
-"mg.gov.br\0"
-"gov.cu\0gs.nt.no\0leka.no\0"
-"zoology.museum\0naturbruksgymn.se\0"
-"gov.cx\0\xd0\xbc\xd0\xba\xd0\xb4\0"
-"gov.cy\0"
-"go.ug\0wv.us\0"
-"karumai.iwate.jp\0"
-"gov.dm\0konyvelo.hu\0"
-"namegata.ibaraki.jp\0go.tz\0"
-"gov.do\0pri.ee\0"
-"tgory.pl\0"
-"pantheonsite.io\0"
-"arts.co\0gov.ec\0lib.ky.us\0temasek\0"
-"gov.ee\0carrier.museum\0"
-"kitami.hokkaido.jp\0dyndns.biz\0blogspot.co.id\0"
-"gov.eg\0"
-"tn.it\0tjmaxx\0"
-"showtime\0"
-"gov.dz\0takaoka.toyama.jp\0"
-"army\0from-ks.com\0"
-"yamazoe.nara.jp\0"
-"square.museum\0"
-"campinagrande.br\0en-root.fr\0blogspot.co.il\0"
-"hirogawa.wakayama.jp\0"
-"kaluga.su\0"
-"fuossko.no\0altervista.org\0s3-sa-east-1.amazonaws.com\0"
-"gov.et\0"
-"konan.shiga.jp\0"
-"ann-arbor.mi.us\0"
-"nara.jp\0"
-"sogndal.no\0"
-"gov.fj\0tokoname.aichi.jp\0from-la.net\0sytes.net\0"
-"detroit.museum\0and\xc3\xb8y.no\0loten.no\0fin.ci\0"
-"trentino-sud-tirol.it\0nakamichi.yamanashi.jp\0*.in.futurecms.at\0"
-"oshima.tokyo.jp\0"
-"in-berlin.de\0"
-"matsukawa.nagano.jp\0loft\0"
-"blackfriday\0"
-"arpa\0"
-"gov.ge\0ismaili\0"
-"press.cy\0"
-"gov.gh\0wanouchi.gifu.jp\0"
-"wa.edu.au\0gov.gi\0cody.museum\0"
-"ninja\0"
-"\xe6\x84\x9b\xe5\xaa\x9b.jp\0sanuki.kagawa.jp\0iheya.okinawa.jp\0swiebodzin.pl\0"
-"fst.br\0gov.gn\0przeworsk.pl\0myftp.biz\0"
-"toshiba\0"
-"gov.gr\0"
-"date.fukushima.jp\0"
-"fin.ec\0gov.gu\0hotel.lk\0"
-"oshu.iwate.jp\0"
-"gov.gy\0vaapste.no\0us-4.evennode.com\0"
-"zapto.xyz\0"
-"gov.hk\0"
-"kasai.hyogo.jp\0jobs.tt\0"
-"jpmorgan\0isa-geek.net\0"
-"sec.ps\0"
-"nonoichi.ishikawa.jp\0\xd8\xb9\xd9\x85\xd8\xa7\xd9\x86\0"
-"os.hordaland.no\0\xd0\xbc\xd0\xbe\xd0\xbd\0"
-"lib.or.us\0\xe6\x96\xb0\xe9\x97\xbb\0"
-"ipifony.net\0"
-"a.bg\0gov.ie\0history.museum\0spy.museum\0"
-"motoyama.kochi.jp\0"
-"hattfjelldal.no\0motorcycles\0"
-"shizukuishi.iwate.jp\0"
-"gov.il\0bolzano.it\0"
-"gov.in\0"
-"uz.ua\0hughes\0"
-"gov.iq\0k12.wa.us\0"
-"gov.ir\0iwanuma.miyagi.jp\0"
-"gov.is\0"
-"gov.it\0"
-"chofu.tokyo.jp\0"
-"tank.museum\0h\xc3\xa1pmir.no\0"
-"gov.jo\0kharkiv.ua\0"
-"!city.sapporo.jp\0"
-"bmoattachments.org\0*.platformsh.site\0"
-"kawanehon.shizuoka.jp\0"
-"asda\0alpha-myqnapcloud.com\0"
-"\xc3\xa5s.no\0eidsberg.no\0"
-"gov.kg\0skodje.no\0arte\0"
-"sap\0"
-"gov.ki\0s\xc3\xb8rreisa.no\0"
-"caserta.it\0"
-"sas\0"
-"gov.km\0co.business\0"
-"gov.kn\0"
-"village.museum\0"
-"gov.kp\0dell\0"
-"gov.la\0sbi\0"
-"nakai.kanagawa.jp\0gov.lb\0to.leg.br\0"
-"gov.lc\0"
-"partners\0"
-"gov.kw\0"
-"kamikoani.akita.jp\0funahashi.toyama.jp\0"
-"accident-prevention.aero\0gov.ky\0sca\0us-3.evennode.com\0"
-"gov.kz\0scb\0"
-"gov.lk\0historical.museum\0sbs\0"
-"mutsuzawa.chiba.jp\0mibu.tochigi.jp\0"
-"hotel.hu\0serveftp.org\0"
-"gov.ma\0\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\x9f\0"
-"kitakata.miyazaki.jp\0gov.lr\0"
-"gov.ls\0hemnes.no\0bbva\0"
-"gov.lt\0"
-"gov.me\0"
-"gov.lv\0\xd8\xa7\xd9\x84\xd8\xb9\xd9\x84\xd9\x8a\xd8\xa7\xd9\x86\0"
-"gov.mg\0"
-"gov.ly\0attorney\0protonet.io\0"
-"gorizia.it\0"
-"gov.mk\0"
-"gov.ml\0"
-"omega\0"
-"sennan.osaka.jp\0oyama.tochigi.jp\0gov.mn\0"
-"gov.mo\0s\xc3\xb8mna.no\0lib.ct.us\0"
-"today\0"
-"gov.mr\0"
-"gov.ms\0"
-"biratori.hokkaido.jp\0kasama.ibaraki.jp\0"
-"gov.mu\0"
-"viterbo.it\0gov.mv\0wielun.pl\0selfip.net\0"
-"gov.mw\0gov.ng\0is-a-candidate.org\0"
-"gov.my\0roros.no\0"
-"gov.mz\0"
-"ed.ao\0society.museum\0"
-"shinanomachi.nagano.jp\0"
-"\xe7\xb6\xb2\xe7\xb5\xa1.cn\0fujikawaguchiko.yamanashi.jp\0demon.nl\0"
-"hl.no\0"
-"pyatigorsk.ru\0"
-"gov.nr\0"
-"\xe5\x85\xac\xe5\x8f\xb8.cn\0"
-"yuzawa.niigata.jp\0reisen\0run\0"
-"poa.br\0"
-"lib.mn.us\0arts.ve\0"
-"\xe5\x92\x8c\xe6\xad\x8c\xe5\xb1\xb1.jp\0"
-"beeldengeluid.museum\0habmer.no\0ses\0"
-"suisse.museum\0gov.om\0"
-"shimamaki.hokkaido.jp\0wios.gov.pl\0"
-"sew\0"
-"cuneo.it\0sex\0"
-"\xe5\x85\xac\xe5\x8f\xb8.hk\0"
-"tmall\0"
-"asia\0"
-"ed.ci\0sveio.no\0"
-"cesenaforl\xc3\xac.it\0niiza.saitama.jp\0gov.ph\0"
-"abudhabi\0us-2.evennode.com\0"
-"sfr\0"
-"gov.pk\0"
-"gov.pl\0"
-"royken.no\0rwe\0"
-"ed.cr\0gov.pn\0"
-"gov.qa\0ivano-frankivsk.ua\0bloxcms.com\0"
-"gov.pr\0"
-"gov.ps\0"
-"gov.pt\0"
-"hanawa.fukushima.jp\0"
-"tn.us\0"
-"takasago.hyogo.jp\0mishima.shizuoka.jp\0"
-"gov.py\0"
-"odessa.ua\0blogspot.co.uk\0"
-"karm\xc3\xb8y.no\0"
-"honjo.saitama.jp\0perso.sn\0"
-"shop.ht\0pv.it\0"
-"shop.hu\0"
-"bellevue.museum\0s3-website-ap-northeast-1.amazonaws.com\0"
-"asahi.mie.jp\0"
-"watch-and-clock.museum\0"
-"tokigawa.saitama.jp\0"
-"solund.no\0desi\0mycd.eu\0"
-"info.gu\0us-east-1.elasticbeanstalk.com\0"
-"perso.tn\0"
-"gov.sa\0"
-"ariake.saga.jp\0gov.sb\0"
-"gov.rs\0gov.sc\0"
-"como.it\0takagi.nagano.jp\0gov.sd\0"
-"gov.ru\0forumz.info\0"
-"search\0"
-"gov.rw\0gov.sg\0"
-"ohkura.yamagata.jp\0gov.sh\0"
-"kiyokawa.kanagawa.jp\0"
-"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0wales\0"
-"gov.sl\0"
-"movimiento.bo\0scotland.museum\0nm.us\0"
-"info.ht\0yawatahama.ehime.jp\0"
-"info.hu\0gov.so\0"
-"mansions.museum\0"
-"arts.ro\0gov.ss\0"
-"gov.st\0"
-"presse.km\0"
-"environment.museum\0"
-"gov.sx\0"
-"gov.sy\0us-1.evennode.com\0"
-"gov.tj\0"
-"bieszczady.pl\0gov.tl\0"
-"gov.tm\0"
-"info.et\0valle-daosta.it\0gov.tn\0"
-"gov.to\0"
-"higashihiroshima.hiroshima.jp\0daigo.ibaraki.jp\0iizuna.nagano.jp\0"
-"stryn.no\0gov.ua\0ski\0"
-"takatori.nara.jp\0hita.oita.jp\0gov.tr\0"
-"info.fj\0kagawa.jp\0gov.tt\0"
-"minamiyamashiro.kyoto.jp\0"
-"gov.tw\0shriram\0eu-west-2.elasticbeanstalk.com\0"
-"yoshino.nara.jp\0"
-"gov.uk\0"
-"shiojiri.nagano.jp\0"
-"suldal.no\0"
-"love\0sky\0"
-"tsugaru.aomori.jp\0mihara.hiroshima.jp\0"
-"gov.vc\0"
-"presse.ml\0"
-"gov.ve\0"
-"osakasayama.osaka.jp\0broker\0"
-"servequake.com\0"
-"iglesias-carbonia.it\0zushi.kanagawa.jp\0"
-"sb.ua\0homeftp.org\0"
-"valledaosta.it\0"
-"agro.bo\0erotika.hu\0donostia.museum\0"
-"taishin.fukushima.jp\0kep.tr\0gov.vn\0webhop.net\0"
-"casino.hu\0"
-"iitate.fukushima.jp\0"
-"ullensaker.no\0"
-"meguro.tokyo.jp\0b.ssl.fastly.net\0info.cx\0"
-"crafts.museum\0"
-"barletta-trani-andria.it\0hongo.hiroshima.jp\0"
-"judygarland.museum\0os\xc3\xb8yro.no\0onyourside\0"
-"deporte.bo\0blogspot.co.ke\0"
-"lib.vt.us\0yoga\0"
-"arts.nf\0"
-"us.eu.org\0"
-"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0ed.jp\0kwpsp.gov.pl\0"
-"info.ec\0"
-"myfritz.net\0"
-"edugit.org\0"
-"fin.tn\0"
-"trani-barletta-andria.it\0"
-"gov.ws\0"
-"kawachinagano.osaka.jp\0"
-"info.bb\0"
-"info.at\0"
-"info.au\0"
-"frontier\0"
-"britishcolumbia.museum\0"
-"info.az\0"
-"stat.no\0br\xc3\xb8nn\xc3\xb8ysund.no\0"
-"palmas.br\0"
-"leirfjord.no\0"
-"friulivgiulia.it\0higashisumiyoshi.osaka.jp\0"
-"info.bo\0kopervik.no\0spa\0"
-"fiat\0"
-"kvits\xc3\xb8y.no\0"
-"blockbuster\0"
-"vestre-toten.no\0ashgabad.su\0"
-"nakatombetsu.hokkaido.jp\0"
-"n.bg\0gov.za\0soy\0"
-"a.se\0press.se\0ma.us\0"
-"cc.pa.us\0"
-"campinas.br\0"
-"okinoshima.shimane.jp\0lancaster\0"
-"info.co\0gateway.museum\0shaw\0lima-city.rocks\0"
-"uwajima.ehime.jp\0tab\0"
-"windmill.museum\0lib.al.us\0"
-"otaru.hokkaido.jp\0\xe6\x89\x8b\xe8\xa1\xa8\0"
-"gov.zm\0"
-"mizumaki.fukuoka.jp\0"
-"drobak.no\0"
-"loginline.app\0"
-"\xe8\x87\xba\xe7\x81\xa3\0"
-"production.aero\0leadpages.co\0"
-"gov.zw\0"
-"rade.no\0"
-"debian.net\0blogspot.co.nz\0"
-"greta.fr\0oarai.ibaraki.jp\0umig.gov.pl\0"
-"medizinhistorisches.museum\0"
-"tax\0"
-"is-a-republican.com\0"
-"americanart.museum\0holdings\0"
-"ostroda.pl\0srl\0"
-"batsfjord.no\0fido\0"
-"kamifurano.hokkaido.jp\0ichinoseki.iwate.jp\0"
-"hs.run\0"
-"stranda.no\0"
-"saobernardo.br\0so.it\0kochi.kochi.jp\0gdansk.pl\0"
-"szex.hu\0"
-"chirurgiens-dentistes-en-france.fr\0"
-"homeip.net\0"
-"pub.sa\0tci\0"
-"akkeshi.hokkaido.jp\0"
-"can.museum\0"
-"ch.it\0targi.pl\0"
-"sweetpepper.org\0"
-"ericsson\0office-on-the.net\0"
-"rugby\0fr.eu.org\0"
-"suginami.tokyo.jp\0swidnica.pl\0"
-"stc\0"
-"is-very-sweet.org\0"
-"h\xc3\xb8yanger.no\0nedre-eiker.no\0"
-"bmd.br\0omiya.saitama.jp\0"
-"gets-it.net\0"
-"ed.pw\0tdk\0"
-"ryugasaki.ibaraki.jp\0obuse.nagano.jp\0"
-"ovre-eiker.no\0"
-"nahari.kochi.jp\0\xe0\xb9\x80\xe0\xb8\x99\xe0\xb9\x87\xe0\xb8\x95.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"\xe0\xb8\xad\xe0\xb8\x87\xe0\xb8\x84\xe0\xb9\x8c\xe0\xb8\x81\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"gildeskal.no\0"
-"ponpes.id\0"
-"sm\xc3\xb8la.no\0blogspot.com.cy\0"
-"mn.it\0mitake.gifu.jp\0mysecuritycamera.net\0"
-"cc.co.us\0"
-"ballangen.no\0"
-"shakotan.hokkaido.jp\0nishinomiya.hyogo.jp\0tel\0"
-"tickets\0"
-"awaji.hyogo.jp\0"
-"philadelphia.museum\0"
-"blogspot.com.ee\0"
-"lanbib.se\0blogspot.com.eg\0"
-"samegawa.fukushima.jp\0"
-"press.ma\0tonsberg.no\0"
-"trentino-aadige.it\0muika.niigata.jp\0"
-"friuli-veneziagiulia.it\0"
-"onojo.fukuoka.jp\0blogspot.com.ar\0"
-"dd-dns.de\0"
-"brother\0"
-"blogspot.com.au\0"
-"ham-radio-op.net\0"
-"masfjorden.no\0cc.ne.us\0"
-"catania.it\0"
-"nikolaev.ua\0"
-"uozu.toyama.jp\0"
-"fr\xc3\xa6na.no\0"
-"narusawa.yamanashi.jp\0"
-"spjelkavik.no\0selje.no\0est-mon-blogueur.com\0from-hi.com\0"
-"of.london\0"
-"matta-varjjat.no\0shia\0"
-"aibetsu.hokkaido.jp\0blogspot.com.br\0"
-"to.work\0"
-"zlg.br\0koto.shiga.jp\0"
-"balat.no\0"
-"is.gov.pl\0"
-"thd\0"
-"dyndns-web.com\0blogspot.com.by\0"
-"yoshida.saitama.jp\0minami-alps.yamanashi.jp\0"
-"frosinone.it\0df.leg.br\0"
-"!city.nagoya.jp\0realtor\0"
-"s3-us-west-1.amazonaws.com\0blogspot.com.co\0"
-"tono.iwate.jp\0redirectme.net\0"
-"genting\0"
-"marche.it\0"
-"nishiwaki.hyogo.jp\0"
-"austevoll.no\0"
-"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0yokkaichi.mie.jp\0"
-"education.museum\0"
-"rc.it\0in-the-band.net\0"
-"gorge.museum\0"
-"misasa.tottori.jp\0"
-"s\xc3\xb8r-varanger.no\0"
-"mishima.fukushima.jp\0"
-"svelvik.no\0"
-"assn.lk\0juif.museum\0k12.pa.us\0glade\0"
-"kaas.gg\0"
-"al.it\0"
-"channel\0"
-"floro.no\0myfirewall.org\0"
-"niepce.museum\0film\0"
-"\xe4\xbd\x90\xe8\xb3\x80.jp\0"
-"games.hu\0blogspot.com.es\0"
-"floripa.br\0"
-"info.ve\0"
-"tjx\0"
-"webcam\0azimuth.network\0"
-"flynnhosting.net\0"
-"kr.it\0"
-"cc.as.us\0"
-"info.vn\0shop.th\0"
-"\xd9\x83\xd9\x88\xd9\x85\0"
-"urn.arpa\0community-pro.de\0"
-"fujisawa.iwate.jp\0hino.tokyo.jp\0"
-"newport.museum\0overhalla.no\0"
-"ami.ibaraki.jp\0"
-"promo\0"
-"katowice.pl\0"
-"joburg\0"
-"takanezawa.tochigi.jp\0"
-"amsterdam.museum\0blogspot.co.za\0"
-"uvic.museum\0sarpsborg.no\0"
-"tamaki.mie.jp\0"
-"ipiranga\0"
-"6.bg\0essex.museum\0\xe5\x95\x86\xe6\xa0\x87\0"
-"fukuyama.hiroshima.jp\0"
-"gulen.no\0nflfan.org\0"
-"turystyka.pl\0on-the-web.tv\0"
-"cc.ky.us\0"
-"dance\0"
-"!city.yokohama.jp\0"
-"charter.aero\0"
-"utsunomiya.tochigi.jp\0"
-"info.tn\0"
-"k12.tx.us\0"
-"opole.pl\0info.tr\0"
-"edu.eu.org\0"
-"togakushi.nagano.jp\0info.tt\0"
-"gentapps.com\0shop.ro\0"
-"shop\0"
-"ozu.ehime.jp\0nirasaki.yamanashi.jp\0info.tz\0memorial\0"
-"city.hu\0k12.co.us\0lib.wy.us\0from-tx.com\0"
-"al.no\0homedns.org\0"
-"prudential\0"
-"show\0"
-"h\xc3\xa4kkinen.fi\0"
-"date.hokkaido.jp\0u.channelsdvr.net\0"
-"science.museum\0"
-"bauhaus\0"
-"maif\0"
-"r\xc3\xa6lingen.no\0"
-"pg.it\0"
-"jab.br\0saikai.nagasaki.jp\0shioya.tochigi.jp\0legnica.pl\0top\0"
-"info.ro\0"
-"iwama.ibaraki.jp\0"
-"fire\0ddns.me\0"
-"shop.pl\0\xe6\x8b\x9b\xe8\x81\x98\0"
-"info.sd\0exposed\0"
-"sibenik.museum\0"
-"iwakura.aichi.jp\0ishigaki.okinawa.jp\0"
-"toyone.aichi.jp\0minamitane.kagoshima.jp\0kunitachi.tokyo.jp\0"
-"tselinograd.su\0"
-"secure\0"
-"komoro.nagano.jp\0yaese.okinawa.jp\0"
-"\xd0\xbe\xd1\x80\xd0\xb3\0"
-"jobs\0"
-"kisarazu.chiba.jp\0fish\0"
-"n.se\0mn.us\0\xe4\xb8\xad\xe4\xbf\xa1\0"
-"wskr.gov.pl\0"
-"nalchik.ru\0"
-"info.pk\0"
-"info.pl\0nowtv\0"
-"hashimoto.wakayama.jp\0"
-"is-a-personaltrainer.com\0"
-"aisai.aichi.jp\0"
-"audi\0"
-"gz.cn\0friuli-venezia-giulia.it\0kameyama.mie.jp\0chungnam.kr\0starachowice.pl\0info.pr\0"
-"for.sale\0"
-"betainabox.com\0"
-"presse.ci\0nalchik.su\0"
-"iwate.jp\0ayabe.kyoto.jp\0"
-"ap-southeast-2.elasticbeanstalk.com\0"
-"pisz.pl\0"
-"blogspot.com.mt\0"
-"\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0misconfused.org\0"
-"agro.pl\0"
-"info.na\0ubs\0blogspot.com.ng\0my-wan.de\0"
-"svalbard.no\0valer.ostfold.no\0"
-"minowa.nagano.jp\0trv\0"
-"halloffame.museum\0v\xc3\xa5gan.no\0"
-"trentinosudtirol.it\0info.mv\0info.nf\0"
-"ohira.tochigi.jp\0"
-"info.ni\0voting\0"
-"aioi.hyogo.jp\0beer\0"
-"\xc4\x8d\xc3\xa1hcesuolo.no\0"
-"tamba.hyogo.jp\0"
-"reviews\0toyota\0"
-"\xc3\xb8rsta.no\0"
-"aurskog-h\xc3\xb8land.no\0"
-"kaizuka.osaka.jp\0info.nr\0"
-"rovigo.it\0nemuro.hokkaido.jp\0"
-"hiroshima.jp\0nagiso.nagano.jp\0"
-"gotdns.com\0"
-"piacenza.it\0rishiri.hokkaido.jp\0ng.school\0"
-"minamisanriku.miyagi.jp\0"
-"from-wy.com\0basicserver.io\0"
-"info.la\0"
-"ino.kochi.jp\0"
-"indigena.bo\0tui\0"
-"nabari.mie.jp\0"
-"baidu\0"
-"verm\xc3\xb6gensberater\0blogspot.com.tr\0"
-"foundation.museum\0"
-"al.us\0"
-"\xe6\x89\x8b\xe6\x9c\xba\0\xe7\xbd\x91\xe5\x9d\x80\0"
-"info.ls\0"
-"ehime.jp\0"
-"gen.in\0"
-"southwest.museum\0kr.ua\0"
-"ogimi.okinawa.jp\0"
-"house.museum\0k12.mi.us\0"
-"kanoya.kagoshima.jp\0schwarz\0"
-"nom.ad\0"
-"tvs\0we.bs\0nom.ae\0"
-"nyuzen.toyama.jp\0nom.af\0"
-"nom.ag\0s3-us-gov-west-1.amazonaws.com\0"
-"express\0nom.ai\0"
-"vision\0"
-"finland.museum\0thingdustdata.com\0"
-"goshiki.hyogo.jp\0nom.al\0"
-"bomlo.no\0\xd9\x85\xd8\xb5\xd8\xb1\0"
-"honjo.akita.jp\0"
-"shibata.niigata.jp\0"
-"info.ke\0hole.no\0kerrylogistics\0lefrak\0"
-"pharmacien.fr\0morimachi.shizuoka.jp\0rj.leg.br\0"
-"info.ki\0"
-"barueri.br\0yamakita.kanagawa.jp\0"
-"l\xc3\xb8""dingen.no\0dyndns-ip.com\0"
-"katsuragi.wakayama.jp\0homeftp.net\0"
-"selfip.org\0"
-"oharu.aichi.jp\0"
-"mihama.fukui.jp\0tomiya.miyagi.jp\0omachi.nagano.jp\0"
-"video\0"
-"narita.chiba.jp\0"
-"civilaviation.aero\0academy.museum\0"
-"bozen-sudtirol.it\0nom.cl\0"
-"nom.co\0agency\0"
-"divtasvuodna.no\0chrome\0glass\0ufcfan.org\0"
-"onomichi.hiroshima.jp\0tobetsu.hokkaido.jp\0shimodate.ibaraki.jp\0"
-"cc.ia.us\0"
-"hida.gifu.jp\0kartuzy.pl\0"
-"costume.museum\0plantation.museum\0"
-"shiso.hyogo.jp\0"
-"s3-ap-southeast-2.amazonaws.com\0"
-"bi.it\0"
-"yamagata.yamagata.jp\0"
-"jewishart.museum\0gen.ng\0"
-"lincoln\0"
-"oracle\0silk\0certmgr.org\0blogspot.com.uy\0"
-"smola.no\0"
-"shimokitayama.nara.jp\0adachi.tokyo.jp\0\xda\x80\xd8\xa7\xd8\xb1\xd8\xaa\0legal\0"
-"mashike.hokkaido.jp\0"
-"grosseto.it\0katsuyama.fukui.jp\0"
-"broker.aero\0nom.es\0"
-"odate.akita.jp\0"
-"for-some.biz\0"
-"reg.dk\0"
-"hakuba.nagano.jp\0toda.saitama.jp\0gen.nz\0"
-"js.cn\0lo.it\0"
-"sina\0"
-"nom.fr\0"
-"international\0nom.gd\0"
-"nom.ge\0"
-"suifu.ibaraki.jp\0"
-"sakura\0"
-"dynamisches-dns.de\0freeddns.org\0"
-"kiyosu.aichi.jp\0nom.gl\0"
-"vinnytsia.ua\0"
-"sjc.br\0motobu.okinawa.jp\0"
-"kanazawa.ishikawa.jp\0nom.gt\0"
-"foodnetwork\0mc.eu.org\0"
-"shiiba.miyazaki.jp\0blackbaudcdn.net\0ptplus.fit\0"
-"paderborn.museum\0osen.no\0"
-"ukiha.fukuoka.jp\0"
-"gripe\0"
-"16-b.it\0"
-"qld.gov.au\0barrel-of-knowledge.info\0"
-"higashishirakawa.gifu.jp\0kadogawa.miyazaki.jp\0"
-"aizubange.fukushima.jp\0nom.hn\0"
-"ayase.kanagawa.jp\0"
-"uno\0"
-"bible.museum\0"
-"ujitawara.kyoto.jp\0"
-"from-ky.com\0"
-"tsukuba.ibaraki.jp\0"
-"bristol.museum\0"
-"taishi.osaka.jp\0"
-"murata.miyagi.jp\0"
-"nom.im\0"
-"yuza.yamagata.jp\0center\0uol\0\xe6\x85\x88\xe5\x96\x84\0"
-"balsan-sudtirol.it\0isshiki.aichi.jp\0"
-"kudoyama.wakayama.jp\0"
-"lt.eu.org\0"
-"sondrio.it\0"
-"memorial.museum\0"
-"kicks-ass.net\0"
-"de.us\0tunes\0is-a-anarchist.com\0"
-"nx.cn\0pt.it\0midori.chiba.jp\0"
-"tsuruga.fukui.jp\0"
-"chuo.tokyo.jp\0"
-"cranbrook.museum\0kvam.no\0selbu.no\0from-id.com\0"
-"deatnu.no\0ups\0nom.ke\0"
-"frogn.no\0"
-"and.mom\0"
-"nom.km\0mysecuritycamera.org\0"
-"kviteseid.no\0tran\xc3\xb8y.no\0"
-"terni.it\0gen.tr\0best\0"
-"asahi.chiba.jp\0kibichuo.okayama.jp\0"
-"osteroy.no\0"
-"consulado.st\0"
-"uhren.museum\0"
-"yn.cn\0shizuoka.jp\0"
-"nom.li\0"
-"auto\0"
-"higashikawa.hokkaido.jp\0okayama.okayama.jp\0"
-"lib.ar.us\0"
-"kainan.wakayama.jp\0"
-"def.br\0trentino-altoadige.it\0"
-"site\0linkitools.space\0"
-"foz.br\0"
-"\xd9\x87\xd9\x85\xd8\xb1\xd8\xa7\xd9\x87\0"
-"cdn77-ssl.net\0"
-"baseball.museum\0gloppen.no\0"
-"nom.mg\0ambulance.museum\0"
-"historicalsociety.museum\0mansion.museum\0strand.no\0infiniti\0"
-"club.aero\0k12.ia.us\0nom.mk\0"
-"shikokuchuo.ehime.jp\0"
-"s3-eu-central-1.amazonaws.com\0"
-"mukawa.hokkaido.jp\0"
-"wafflecell.com\0"
-"watari.miyagi.jp\0"
-"sydney.museum\0esurance\0"
-"mie.jp\0"
-"nom.nc\0"
-"is-a-lawyer.com\0"
-"massacarrara.it\0miyama.mie.jp\0shiogama.miyagi.jp\0"
-"nom.ni\0dvrcam.info\0"
-"*.dapps.earth\0"
-"nachikatsuura.wakayama.jp\0*.telebit.xyz\0"
-"alipay\0"
-"cooperativa.bo\0mangyshlak.su\0"
-"kumamoto.kumamoto.jp\0suwalki.pl\0"
-"sellsyourhome.org\0"
-"evje-og-hornnes.no\0"
-"h\xc3\xa1mm\xc3\xa1rfeasta.no\0nom.nu\0"
-"enterprises\0"
-"is-a-designer.com\0"
-"stpetersburg.museum\0"
-"kumano.mie.jp\0ath.cx\0"
-"\xd9\x85\xd9\x84\xd9\x8a\xd8\xb3\xd9\x8a\xd8\xa7\0"
-"nom.pa\0"
-"kure.hiroshima.jp\0"
-"es.eu.org\0"
-"matsuyama.ehime.jp\0minami.kyoto.jp\0"
-"net.ac\0nom.pe\0is-into-cartoons.com\0"
-"wloclawek.pl\0vet\0"
-"net.ae\0"
-"net.af\0"
-"net.ag\0"
-"*.lcl.dev\0"
-"net.ai\0"
-"nom.pl\0"
-"fauske.no\0sola.no\0"
-"net.al\0"
-"net.am\0nesset.no\0"
-"on.fashion\0"
-"technology.museum\0nom.qa\0"
-"net.ba\0davvesiida.no\0club.tw\0"
-"net.ar\0net.bb\0"
-"net.au\0nom.pw\0"
-"anan.tokushima.jp\0"
-"gs.st.no\0"
-"net.bh\0"
-"k12.nh.us\0"
-"net.az\0"
-"net.bm\0asker.no\0b\xc3\xa1hcavuotna.no\0grue.no\0lilly\0is-a-painter.com\0freedesktop.org\0"
-"net.bn\0"
-"net.bo\0info.zm\0\xe7\xbd\x91\xe7\xab\x99\0"
-"net.br\0"
-"net.bs\0nom.re\0"
-"net.bt\0trentinsud-tirol.it\0"
-"l.bg\0myvnc.com\0"
-"net.ci\0"
-"net.bz\0rr.leg.br\0mymediapc.net\0"
-"marine.ru\0"
-"net.cm\0nom.ro\0serveftp.com\0"
-"net.cn\0yokote.akita.jp\0"
-"net.co\0"
-"carboniaiglesias.it\0"
-"v\xc3\xa6r\xc3\xb8y.no\0zara\0nom.rs\0"
-"twmail.net\0"
-"dr.na\0"
-"\xe4\xb8\x96\xe7\x95\x8c\0"
-"net.cu\0oystre-slidre.no\0"
-"padova.it\0"
-"net.cw\0vig\0builtwithdark.com\0nom.si\0"
-"machida.tokyo.jp\0"
-"net.cy\0s3-website.eu-central-1.amazonaws.com\0"
-"\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa7\0"
-"natori.miyagi.jp\0"
-"net.dm\0\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa9\0"
-"vin\0"
-"net.do\0app.lmpm.com\0"
-"vip\0"
-"archaeology.museum\0salat.no\0passagens\0"
-"eng.br\0nom.st\0"
-"net.ec\0"
-"osoyro.no\0"
-"nishi.osaka.jp\0oyabe.toyama.jp\0"
-"net.eg\0research.museum\0lugs.org.uk\0"
-"nom.tj\0"
-"s3-website-eu-west-1.amazonaws.com\0"
-"net.dz\0rs.leg.br\0sc.leg.br\0"
-"nom.tm\0"
-"cultural.museum\0historisches.museum\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa5\x8d\0"
-"kokonoe.oita.jp\0"
-"cc.in.us\0"
-"oirase.aomori.jp\0"
-"adygeya.su\0"
-"net.et\0"
-"nom.ug\0"
-"emiliaromagna.it\0"
-"tr\xc3\xa6na.no\0"
-"net.fj\0takasaki.gunma.jp\0"
-"hirakata.osaka.jp\0",
-
-"diet\0"
-"mordovia.su\0nom.vc\0"
-"tourism.tn\0"
-"taobao\0"
-"bihoro.hokkaido.jp\0instantcloud.cn\0"
-"net.ge\0nom.vg\0"
-"kamitonda.wakayama.jp\0"
-"net.gg\0nom.uy\0"
-"williamsburg.museum\0flights\0"
-"net.gl\0"
-"chattanooga.museum\0"
-"net.gn\0"
-"net.gp\0"
-"net.gr\0"
-"fet.no\0"
-"net.gt\0"
-"net.gu\0uber.space\0"
-"shisui.chiba.jp\0moriya.ibaraki.jp\0"
-"net.gy\0corporation.museum\0"
-"net.hk\0is-a-geek.com\0"
-"odo.br\0"
-"net.hn\0nisshin.aichi.jp\0"
-"msk.ru\0xnbay.com\0"
-"takazaki.miyazaki.jp\0"
-"from-de.com\0is-a-financialadvisor.com\0"
-"tomari.hokkaido.jp\0"
-"localhistory.museum\0mk.eu.org\0adygeya.ru\0"
-"net.ht\0net.id\0tokyo.jp\0"
-"apps.lair.io\0"
-"pa.gov.br\0ba.leg.br\0"
-"g\xc3\xa1ivuotna.no\0"
-"net.il\0"
-"net.im\0"
-"vet.br\0net.in\0novara.it\0"
-"msk.su\0"
-"net.iq\0muenster.museum\0cc.ms.us\0cc.nc.us\0mordovia.ru\0"
-"net.ir\0"
-"net.is\0"
-"neyagawa.osaka.jp\0"
-"net.je\0"
-"mediocampidano.it\0venice.it\0"
-"rauma.no\0mydrobo.com\0"
-"kadoma.osaka.jp\0"
-"net.jo\0nordkapp.no\0nom.za\0"
-"s3-website-ap-southeast-1.amazonaws.com\0"
-"!city.kitakyushu.jp\0kofu.yamanashi.jp\0makeup\0"
-"dr.tr\0"
-"app.os.stg.fedoraproject.org\0"
-"net.kg\0"
-"pb.gov.br\0"
-"pe.ca\0net.ki\0rygge.no\0"
-"rn.leg.br\0wedeploy.sh\0"
-"cc.wy.us\0"
-"asahi.yamagata.jp\0"
-"gen.mi.us\0"
-"ibaraki.jp\0ogose.saitama.jp\0nichinan.tottori.jp\0net.kn\0"
-"\xe6\x84\x9b\xe7\x9f\xa5.jp\0"
-"net.la\0lib.id.us\0"
-"pol.dz\0shichinohe.aomori.jp\0net.lb\0"
-"net.lc\0"
-"trento.it\0miasa.nagano.jp\0"
-"jprs\0mein-iserv.de\0"
-"ra.it\0takatsuki.osaka.jp\0"
-"net.kw\0volkenkunde.museum\0"
-"net.ky\0work\0readmyblog.org\0"
-"uchihara.ibaraki.jp\0net.kz\0"
-"net.lk\0"
-"\xe7\x86\x8a\xe6\x9c\xac.jp\0unazuki.toyama.jp\0"
-"it.ao\0cahcesuolo.no\0lifeinsurance\0"
-"higashikagura.hokkaido.jp\0ama.shimane.jp\0"
-"vao.it\0togane.chiba.jp\0"
-"net.ma\0amfam\0fi.eu.org\0"
-"miyazaki.jp\0net.lr\0"
-"net.ls\0lu.eu.org\0me.eu.org\0"
-"takayama.gunma.jp\0"
-"net.me\0"
-"net.lv\0"
-"amazon\0"
-"net.ly\0alaska.museum\0"
-"tohma.hokkaido.jp\0seika.kyoto.jp\0ro.leg.br\0"
-"net.mk\0"
-"net.ml\0"
-"volvo\0lpages.co\0"
-"takikawa.hokkaido.jp\0"
-"net.mo\0grandrapids.museum\0sweden.museum\0oh.us\0"
-"kinko.kagoshima.jp\0"
-"net.ms\0\xd8\xa8\xd8\xa7\xd8\xb2\xd8\xa7\xd8\xb1\0spdns.eu\0myforum.community\0"
-"aizumi.tokushima.jp\0net.mt\0"
-"net.mu\0labor.museum\0moskenes.no\0"
-"net.mv\0net.nf\0dynathome.net\0"
-"net.mw\0net.ng\0"
-"taa.it\0net.mx\0"
-"utah.museum\0net.my\0net.ni\0vard\xc3\xb8.no\0"
-"bologna.it\0uki.kumamoto.jp\0net.mz\0"
-"hol.no\0vestre-slidre.no\0"
-"diskstation.org\0"
-"anani.br\0"
-"\xe5\xa4\xa7\xe5\x88\x86.jp\0zgorzelec.pl\0"
-"catering\0"
-"net.nr\0"
-"lv.eu.org\0"
-"stalowa-wola.pl\0expert\0"
-"nanporo.hokkaido.jp\0net.nz\0wif.gov.pl\0"
-"pol.ht\0"
-"net.om\0travelers\0\xd1\x80\xd1\x83\xd1\x81\0"
-"nakagyo.kyoto.jp\0"
-"net.pa\0lib.ma.us\0realty\0chimkent.su\0"
-"4.bg\0"
-"wed\0"
-"plurinacional.bo\0froland.no\0net.pe\0"
-"tj.cn\0trentins\xc3\xbc""d-tirol.it\0niimi.okayama.jp\0kaminokawa.tochigi.jp\0"
-"net.ph\0"
-"harvestcelebration.museum\0judaica.museum\0"
-"airtel\0"
-"rad\xc3\xb8y.no\0net.pk\0"
-"net.pl\0static.land\0"
-"sm.ua\0"
-"net.pn\0"
-"gotpantheon.com\0"
-"trentins\xc3\xbc""dtirol.it\0"
-"net.qa\0cyou\0"
-"net.pr\0""32-b.it\0"
-"net.ps\0"
-"net.pt\0jp.net\0"
-"baltimore.museum\0ralingen.no\0"
-"indianapolis.museum\0"
-"*.elb.amazonaws.com.cn\0am.leg.br\0"
-"net.py\0"
-"k12.de.us\0"
-"repl.run\0"
-"kirkenes.no\0"
-"yurihonjo.akita.jp\0rzgw.gov.pl\0"
-"lotte\0"
-"savona.it\0rocher\0"
-"yufu.oita.jp\0"
-"slask.pl\0cloudeity.net\0"
-"marylhurst.museum\0"
-"laquila.it\0"
-"lotto\0"
-"hiphop\0"
-"association.aero\0"
-"pe.it\0wada.nagano.jp\0"
-"noto.ishikawa.jp\0"
-"s\xc3\xb8rfold.no\0"
-"tourism.pl\0flir\0monster\0"
-"net.sa\0"
-"net.sb\0"
-"net.sc\0"
-"toyoura.hokkaido.jp\0net.sd\0"
-"k12.ok.us\0is-a-geek.org\0net.ru\0"
-"tmp.br\0winb.gov.pl\0"
-"net.rw\0net.sg\0"
-"net.sh\0skin\0"
-"from-md.com\0"
-"net.sl\0"
-"hasami.nagasaki.jp\0support\0"
-"aaa.pro\0net.so\0"
-"lindas.no\0"
-"bhz.br\0"
-"y.bg\0net.ss\0spdns.de\0"
-"net.st\0dish\0"
-"l.se\0"
-"pfizer\0"
-"marshalls\0"
-"net.th\0"
-"net.sy\0"
-"iwaizumi.iwate.jp\0pe.kr\0net.tj\0"
-"*.stolos.io\0"
-"sakado.saitama.jp\0"
-"net.tm\0"
-"naples.it\0net.tn\0win\0"
-"net.to\0"
-"tonosho.kagawa.jp\0"
-"vf.no\0net.ua\0\xd0\xbe\xd0\xb4.\xd1\x81\xd1\x80\xd0\xb1\0"
-"gx.cn\0net.tr\0"
-"paragliding.aero\0"
-"net.tt\0"
-"ltda\0"
-"ing.pa\0net.tw\0simple-url.com\0wedeploy.me\0"
-"trentinoalto-adige.it\0shiranuka.hokkaido.jp\0"
-"maebashi.gunma.jp\0gdynia.pl\0"
-"langevag.no\0net.uk\0k12.il.us\0"
-"sodegaura.chiba.jp\0psse.gov.pl\0"
-"\xe7\xbd\x91\xe7\xb5\xa1.hk\0net.vc\0dynns.com\0"
-"hjelmeland.no\0net.ve\0ca-central-1.elasticbeanstalk.com\0"
-"ibaraki.osaka.jp\0"
-"ivanovo.su\0"
-"community.museum\0f\xc3\xb8rde.no\0net.uy\0net.vi\0"
-"napoli.it\0matsudo.chiba.jp\0namikata.ehime.jp\0net.uz\0"
-"krokstadelva.no\0"
-"engineer\0"
-"net.vn\0\xe3\x82\xb9\xe3\x83\x88\xe3\x82\xa2\0"
-"kusu.oita.jp\0takahata.yamagata.jp\0"
-"historichouses.museum\0kr.eu.org\0"
-"net.vu\0"
-"steam.museum\0h\xc3\xa5.no\0"
-"cs.it\0ap.leg.br\0"
-"kicks-ass.org\0"
-"dnsalias.net\0"
-"monmouth.museum\0voyage\0"
-"yamagata.jp\0"
-"ap-northeast-1.elasticbeanstalk.com\0"
-"hakone.kanagawa.jp\0kumiyama.kyoto.jp\0"
-"my.id\0"
-"government.aero\0net.ws\0"
-"int.ar\0"
-"sandnessj\xc3\xb8""en.no\0wme\0dyn.cosidns.de\0"
-"yachiyo.chiba.jp\0"
-"telebit.io\0"
-"int.az\0"
-"lib.fl.us\0is-a-rockstar.com\0"
-"int.bo\0barsyonline.com\0"
-"elk.pl\0development.run\0"
-"varggat.no\0"
-"pi.gov.br\0shinichi.hiroshima.jp\0"
-"linde\0"
-"se.leg.br\0"
-"int.ci\0"
-"nishiaizu.fukushima.jp\0"
-"b\xc3\xa1l\xc3\xa1t.no\0"
-"online.th\0"
-"co.com\0"
-"int.co\0net.za\0mine.nu\0"
-"shell.museum\0"
-"shimada.shizuoka.jp\0freeboxos.fr\0"
-"vm.bytemark.co.uk\0"
-"mmafan.biz\0"
-"tysvar.no\0"
-"\xd0\xb0\xd0\xba.\xd1\x81\xd1\x80\xd0\xb1\0net.zm\0"
-"arna.no\0rightathome\0"
-"asti.it\0"
-"0e.vc\0"
-"wow\0"
-"nishinoomote.kagoshima.jp\0"
-"chiryu.aichi.jp\0pol.tr\0"
-"\xd1\x81\xd1\x80\xd0\xb1\0"
-"microlight.aero\0"
-"ohi.fukui.jp\0"
-"selfip.biz\0"
-"chanel\0"
-"\xe4\xba\xac\xe9\x83\xbd.jp\0"
-"minamiuonuma.niigata.jp\0definima.net\0"
-"circle\0"
-"gamo.shiga.jp\0"
-"rn.it\0shikatsu.aichi.jp\0"
-"oster\xc3\xb8y.no\0"
-"miyakonojo.miyazaki.jp\0"
-"textile.museum\0"
-"getmyip.com\0"
-"tsuruoka.yamagata.jp\0"
-"winners\0"
-"risor.no\0us-east-2.elasticbeanstalk.com\0"
-"bg.it\0"
-"s3.dualstack.ap-southeast-2.amazonaws.com\0"
-"nakagusuku.okinawa.jp\0"
-"freiburg.museum\0"
-"abr.it\0"
-"sugito.saitama.jp\0"
-"theworkpc.com\0"
-"taifun-dns.de\0"
-"montreal.museum\0sumy.ua\0wtc\0"
-"ybo.faith\0"
-"hareid.no\0rocks\0"
-"wtf\0"
-"yosemite.museum\0\xe5\x95\x86\xe6\xa5\xad.tw\0"
-"uruma.okinawa.jp\0"
-"h\xc3\xa6gebostad.no\0"
-"vaporcloud.io\0"
-"newhampshire.museum\0"
-"war.museum\0bloomberg\0"
-"int.is\0eu-west-3.elasticbeanstalk.com\0"
-"alwaysdata.net\0"
-"amber.museum\0"
-"gobo.wakayama.jp\0"
-"troms\xc3\xb8.no\0"
-"map.fastlylb.net\0"
-"mod.gi\0"
-"tw.cn\0vs.it\0takayama.nagano.jp\0hino.tottori.jp\0"
-"chernigov.ua\0cc.md.us\0"
-"pe.gov.br\0"
-"noboribetsu.hokkaido.jp\0"
-"artgallery.museum\0sochi.su\0"
-"wolterskluwer\0"
-"encyclopedic.museum\0pilots.museum\0of.work\0"
-"kamikawa.hyogo.jp\0kinghost.net\0"
-"lenug.su\0"
-"milan.it\0mutual\0"
-"isteingeek.de\0wedeploy.io\0"
-"int.la\0sk\xc3\xa1nit.no\0"
-"richardli\0"
-"barsy.net\0"
-"eurovision\0"
-"ravendb.community\0"
-"salud.bo\0art.museum\0energy\0"
-"int.lk\0bahcavuotna.no\0"
-"fuchu.tokyo.jp\0"
-"dnipropetrovsk.ua\0"
-"obama.fukui.jp\0"
-"of.by\0lib.gu.us\0"
-"nishiarita.saga.jp\0for-better.biz\0"
-"dc.us\0lasalle\0"
-"pr.it\0higashimatsushima.miyagi.jp\0"
-"chikuzen.fukuoka.jp\0"
-"in-butter.de\0"
-"tranibarlettaandria.it\0"
-"yanaizu.fukushima.jp\0int.mv\0"
-"int.mw\0stage.nodeart.io\0"
-"int.ni\0"
-"ebino.miyazaki.jp\0"
-"askvoll.no\0"
-"xin\0"
-"stockholm.museum\0mosj\xc3\xb8""en.no\0shiksha\0"
-"\xe7\x9f\xb3\xe5\xb7\x9d.jp\0okazaki.aichi.jp\0"
-"manx.museum\0y.se\0"
-"homegoods\0\xd7\xa7\xd7\x95\xd7\x9d\0"
-"host\0"
-"from-ga.com\0"
-"val-d-aosta.it\0"
-"farsund.no\0"
-"is-saved.org\0"
-"maringa.br\0yamada.fukuoka.jp\0"
-"omi.nagano.jp\0nerima.tokyo.jp\0olayan\0"
-"is-an-engineer.com\0"
-"glogow.pl\0report\0"
-"sk.ca\0durham.museum\0donna.no\0"
-"flanders.museum\0florida.museum\0"
-"goodyear\0"
-"pa.gov.pl\0"
-"customer.speedpartner.de\0"
-"int.pt\0"
-"meet\0"
-"alta.no\0"
-"aip.ee\0"
-"itami.hyogo.jp\0ota.tokyo.jp\0"
-"jur.pro\0"
-"grondar.za\0"
-"yokaichiba.chiba.jp\0"
-"twmail.org\0"
-"kochi.jp\0"
-"union.aero\0vinnica.ua\0armenia.su\0"
-"eiheiji.fukui.jp\0"
-"caravan\0"
-"sel.no\0firestone\0"
-"kuji.iwate.jp\0"
-"from-ca.com\0"
-"toya.hokkaido.jp\0kagamino.okayama.jp\0"
-"url.tw\0"
-"shiroishi.saga.jp\0"
-"rodeo\0"
-"biei.hokkaido.jp\0takasu.hokkaido.jp\0koryo.nara.jp\0"
-"journal.aero\0"
-"kasahara.gifu.jp\0tomioka.gunma.jp\0"
-"avocat.pro\0paroch.k12.ma.us\0"
-"abu.yamaguchi.jp\0klodzko.pl\0"
-"kiev.ua\0int.ru\0selfip.com\0"
-"mazury.pl\0"
-"stalbans.museum\0"
-"astronomy.museum\0"
-"health.nz\0"
-"l\xc3\xa6rdal.no\0"
-"konin.pl\0"
-"leitungsen.de\0myravendb.com\0"
-"int.tj\0"
-"columbus.museum\0"
-"nomi.ishikawa.jp\0seoul.kr\0"
-"computerhistory.museum\0stord.no\0cleaning\0"
-"lplfinancial\0"
-"here-for-more.info\0"
-"myoko.niigata.jp\0"
-"lima.zone\0"
-"j.bg\0settlers.museum\0"
-"eco.br\0minamifurano.hokkaido.jp\0int.tt\0"
-"pr.gov.br\0"
-"miniserver.com\0"
-"baseball\0"
-"minnesota.museum\0"
-"nesna.no\0progressive\0"
-"banamex\0"
-"westfalen.museum\0is-a-nurse.com\0"
-"chosei.chiba.jp\0orx.biz\0"
-"scienceandindustry.museum\0us-east-1.amazonaws.com\0"
-"int.ve\0"
-"salvador.br\0ikeda.fukui.jp\0"
-"\xe9\xb3\xa5\xe5\x8f\x96.jp\0"
-"toyokawa.aichi.jp\0kotoura.tottori.jp\0int.vn\0"
-"futaba.fukushima.jp\0"
-"eu.com\0"
-"sayo.hyogo.jp\0bielawa.pl\0"
-"v\xc3\xa5gs\xc3\xb8y.no\0"
-"t\xc3\xb8nsberg.no\0"
-"gitlab.io\0"
-"inabe.mie.jp\0co.education\0"
-"fam.pk\0fl.us\0"
-"cc.il.us\0"
-"jdf.br\0"
-"pacific.museum\0"
-"perugia.it\0"
-"abc.br\0"
-"n\xc3\xa5\xc3\xa5mesjevuemie.no\0k12.ri.us\0"
-"kanuma.tochigi.jp\0poznan.pl\0"
-"of.no\0meme\0"
-"ah.cn\0bt.it\0"
-"frei.no\0spb.ru\0"
-"ferrara.it\0kusatsu.shiga.jp\0"
-"barsy.pro\0"
-"management\0is-a-geek.net\0"
-"melbourne\0"
-"horten.no\0"
-"pr.us\0\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0"
-"ozora.hokkaido.jp\0"
-"accenture\0"
-"radio.br\0"
-"spb.su\0"
-"slupsk.pl\0"
-"bruxelles.museum\0kafjord.no\0"
-"himeshima.oita.jp\0limanowa.pl\0"
-"kragero.no\0stj\xc3\xb8rdal.no\0"
-"sirdal.no\0"
-"friuliv-giulia.it\0\xe9\xa6\x99\xe5\xb7\x9d.jp\0"
-"menu\0is-an-actress.com\0"
-"kota.aichi.jp\0mihama.mie.jp\0"
-"andoy.no\0"
-"zgora.pl\0"
-"living.museum\0gwiddle.co.uk\0"
-"barsy.pub\0"
-"shinyoshitomi.fukuoka.jp\0"
-"fredrikstad.no\0markets\0"
-"health.vn\0"
-"l\xc3\xb8ten.no\0"
-"kamogawa.chiba.jp\0shinto.gunma.jp\0"
-"freebox-os.com\0"
-"is-very-nice.org\0"
-"gaivuotna.no\0"
-"mochizuki.nagano.jp\0shinjo.yamagata.jp\0\xe8\x81\x94\xe9\x80\x9a\0"
-"film.hu\0skanit.no\0*.moonscale.io\0"
-"from-ar.com\0"
-"bindal.no\0giving\0"
-"coffee\0"
-"from-wa.com\0"
-"yamanashi.jp\0"
-"catering.aero\0dp.ua\0"
-"johana.toyama.jp\0"
-"s3.dualstack.us-east-1.amazonaws.com\0"
-"toon.ehime.jp\0"
-"nannestad.no\0"
-"takahagi.ibaraki.jp\0"
-"stavern.no\0business\0"
-"tochio.niigata.jp\0barclaycard\0\xe6\x94\xbf\xe5\xba\x9c\0"
-"bodo.no\0"
-"bryansk.su\0"
-"shimizu.shizuoka.jp\0"
-"cadaques.museum\0bike\0"
-"cust.testing.thingdust.io\0"
-"ggf.br\0"
-"natuurwetenschappen.museum\0"
-"xxx\0"
-"l\xc3\xb8renskog.no\0"
-"takehara.hiroshima.jp\0horonobe.hokkaido.jp\0"
-"cremona.it\0nishiazai.shiga.jp\0"
-"haebaru.okinawa.jp\0"
-"yatomi.aichi.jp\0shibata.miyagi.jp\0hangout\0"
-"pesarourbino.it\0kushiro.hokkaido.jp\0toyono.osaka.jp\0"
-"shopping\0land-4-sale.us\0"
-"kiyose.tokyo.jp\0"
-"tsurugashima.saitama.jp\0xyz\0"
-"is-a-libertarian.com\0"
-"nv.us\0"
-"kashiwazaki.niigata.jp\0"
-"yame.fukuoka.jp\0"
-"aver\xc3\xb8y.no\0namdalseid.no\0"
-"koshu.yamanashi.jp\0"
-"is-lost.org\0"
-"toyama.jp\0haga.tochigi.jp\0"
-"karpacz.pl\0\xd1\x83\xd0\xba\xd1\x80\0storage.yandexcloud.net\0"
-"kaho.fukuoka.jp\0"
-"vic.gov.au\0gratangen.no\0bing\0"
-"shintomi.miyazaki.jp\0unzen.nagasaki.jp\0"
-"k12.in.us\0"
-"himeji.hyogo.jp\0"
-"sandiego.museum\0"
-"salangen.no\0"
-"hasuda.saitama.jp\0"
-"artanddesign.museum\0"
-"elasticbeanstalk.com\0"
-"kumamoto.jp\0sakai.osaka.jp\0kurobe.toyama.jp\0"
-"bronnoysund.no\0"
-"hagi.yamaguchi.jp\0"
-"2.bg\0"
-"contact\0"
-"tienda\0"
-"sx.cn\0"
-"fundacio.museum\0tjeldsund.no\0"
-"tako.chiba.jp\0tsukumi.oita.jp\0usuki.oita.jp\0fhapp.xyz\0"
-"tsuno.miyazaki.jp\0"
-"yotsukaido.chiba.jp\0"
-"hembygdsforbund.museum\0s\xc3\xb8r-aurdal.no\0"
-"cq.cn\0akagi.shimane.jp\0"
-"krym.ua\0"
-"otoineppu.hokkaido.jp\0czest.pl\0"
-"komagane.nagano.jp\0"
-"shikama.miyagi.jp\0"
-"\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0"
-"k12.dc.us\0luxe\0"
-"kanonji.kagawa.jp\0"
-"ah.no\0"
-"fuchu.hiroshima.jp\0"
-"kyoto\0"
-"hoteles\0tatamotors\0point2this.com\0"
-"xbox\0"
-"fidelity\0"
-"pc.it\0"
-"my-gateway.de\0"
-"dynu.net\0"
-"s\xc3\xb8r-fron.no\0"
-"physio\0"
-"gv.ao\0"
-"po.gov.pl\0freebox-os.fr\0"
-"botanical.museum\0"
-"mosjoen.no\0you\0nohost.me\0"
-"gv.at\0"
-"logoip.com\0"
-"\xe7\xb6\xb2\xe7\xb5\xa1.\xe9\xa6\x99\xe6\xb8\xaf\0miami\0"
-"dnsalias.org\0"
-"w.bg\0vennesla.no\0scholarships\0"
-"ofunato.iwate.jp\0"
-"bashkiria.ru\0"
-"karmoy.no\0"
-"design.aero\0"
-"marburg.museum\0selfip.info\0"
-"hazu.aichi.jp\0itayanagi.aomori.jp\0"
-"ng.ink\0"
-"ginoza.okinawa.jp\0"
-"seljord.no\0"
-"sncf\0"
-"bashkiria.su\0"
-"tsuyama.okayama.jp\0okinawa.okinawa.jp\0"
-"toei.aichi.jp\0ichinohe.iwate.jp\0"
-"hiji.oita.jp\0cancerresearch\0"
-"trentinsued-tirol.it\0kamioka.akita.jp\0"
-"boston.museum\0kddi\0"
-"bungotakada.oita.jp\0"
-"kristiansand.no\0"
-"reggiocalabria.it\0"
-"barcelona\0asso.eu.org\0"
-"nagara.chiba.jp\0hidaka.saitama.jp\0"
-"building.museum\0amica\0"
-"dnsking.ch\0"
-"kitaakita.akita.jp\0"
-"arteducation.museum\0barsy.org\0"
-"of.football\0"
-"medecin.km\0zaporizhzhe.ua\0"
-"kihoku.ehime.jp\0"
-"bedzin.pl\0"
-"pmn.it\0"
-"soc.lk\0filegear-au.me\0"
-"ogori.fukuoka.jp\0naka.hiroshima.jp\0"
-"usculture.museum\0"
-"\xd1\x83\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0"
-"cloudfront.net\0"
-"gs.hm.no\0fr\xc3\xb8ya.no\0tysnes.no\0"
-"pvh.br\0kounosu.saitama.jp\0"
-"lib.vi.us\0is-a-techie.com\0"
-"virginia.museum\0homes\0"
-"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0"
-"maceio.br\0"
-"yukuhashi.fukuoka.jp\0"
-"hk.com\0"
-"intuit\0"
-"nakijin.okinawa.jp\0"
-"woodside\0"
-"kamiamakusa.kumamoto.jp\0yun\0"
-"omuta.fukuoka.jp\0"
-"wa.au\0user.party.eus\0in-dsl.de\0"
-"pc.pl\0turek.pl\0"
-"katagami.akita.jp\0"
-"klepp.no\0realestate\0is-a-doctor.com\0"
-"ilawa.pl\0"
-"trondheim.no\0"
-"shiki.saitama.jp\0ce.leg.br\0"
-"tagami.niigata.jp\0"
-"nishiokoppe.hokkaido.jp\0hizen.saga.jp\0"
-"ppg.br\0"
-"bergen.no\0"
-"from.hr\0"
-"figueres.museum\0"
-"nordreisa.no\0"
-"digital\0"
-"pizza\0s3-website.ap-south-1.amazonaws.com\0"
-"\xe7\xbd\x91\xe7\xbb\x9c\0"
-"jp.eu.org\0"
-"cri.br\0"
-"fj.cn\0ishikawa.okinawa.jp\0"
-"artdeco.museum\0"
-"agdenes.no\0"
-"pp.az\0avoues.fr\0"
-"cinema.museum\0"
-"verona.it\0kameoka.kyoto.jp\0"
-"ut.us\0"
-"asuke.aichi.jp\0"
-"r\xc3\xb8yken.no\0"
-"namegawa.saitama.jp\0minobu.yamanashi.jp\0"
-"zero\0"
-"miyako.iwate.jp\0zip\0"
-"pavia.it\0venezia.it\0"
-"conf.au\0\xe7\x82\xb9\xe7\x9c\x8b\0*.advisor.ws\0"
-"county.museum\0forgot.his.name\0keymachine.de\0"
-"hadano.kanagawa.jp\0olawa.pl\0"
-"rec.br\0"
-"steiermark.museum\0"
-"oxford.museum\0"
-"oceanographic.museum\0yombo.me\0"
-"madrid\0"
-"no-ip.ca\0"
-"lapy.pl\0\xe0\xb8\xa8\xe0\xb8\xb6\xe0\xb8\x81\xe0\xb8\xa9\xe0\xb8\xb2.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"rec.co\0k12.ak.us\0"
-"writesthisblog.com\0"
-"kusatsu.gunma.jp\0"
-"okinawa\0"
-"cc.sc.us\0"
-"my-router.de\0"
-"chichibu.saitama.jp\0"
-"control.aero\0oppeg\xc3\xa5rd.no\0"
-"trogstad.no\0"
-"onga.fukuoka.jp\0"
-"lindesnes.no\0"
-"aki.kochi.jp\0"
-"karelia.su\0"
-"kakamigahara.gifu.jp\0"
-"botanicalgarden.museum\0"
-"christiansburg.museum\0"
-"food\0freetls.fastly.net\0"
-"statebank\0"
-"ena.gifu.jp\0achi.nagano.jp\0minamiizu.shizuoka.jp\0"
-"lib.mt.us\0lib.nd.us\0svn-repos.de\0"
-"iida.nagano.jp\0govt.nz\0"
-"harstad.no\0"
-"its.me\0"
-"isen.kagoshima.jp\0"
-"railroad.museum\0her\xc3\xb8y.nordland.no\0onthewifi.com\0"
-"gyeonggi.kr\0"
-"is-a-green.com\0webhop.info\0"
-"trentinsudtirol.it\0"
-"ina.nagano.jp\0"
-"heguri.nara.jp\0"
-"baghdad.museum\0rl.no\0"
-"nt.au\0gop.pk\0lipsy\0"
-"grocery\0"
-"salerno.it\0"
-"stor-elvdal.no\0"
-"studio\0"
-"monzaebrianza.it\0*.nagoya.jp\0hitachiomiya.ibaraki.jp\0yono.saitama.jp\0podzone.net\0"
-"hitra.no\0nodum.co\0"
-"kitadaito.okinawa.jp\0ikeda.osaka.jp\0"
-"trading.aero\0nt.ca\0"
-"construction\0"
-"square7.net\0"
-"coal.museum\0"
-"mw.gov.pl\0zarow.pl\0ford\0"
-"imizu.toyama.jp\0"
-"nativeamerican.museum\0cc.ga.us\0"
-"ownip.net\0"
-"tsukigata.hokkaido.jp\0"
-"nesoddtangen.no\0"
-"urbinopesaro.it\0"
-"vestvagoy.no\0"
-"morena.br\0miyoshi.hiroshima.jp\0"
-"express.aero\0nodum.io\0"
-"iwatsuki.saitama.jp\0"
-"kunigami.okinawa.jp\0ugim.gov.pl\0"
-"gs.svalbard.no\0eidsvoll.no\0w.se\0"
-"xz.cn\0geisei.kochi.jp\0"
-"langev\xc3\xa5g.no\0"
-"herad.no\0sells-for-less.com\0"
-"ms.gov.br\0"
-"aerodrome.aero\0loginline.services\0"
-"szczytno.pl\0"
-"sciencehistory.museum\0fyresdal.no\0honda\0"
-"togitsu.nagasaki.jp\0pgafan.net\0"
-"gyeongbuk.kr\0"
-"foggia.it\0"
-"us-gov-west-1.elasticbeanstalk.com\0"
-"happou.akita.jp\0*.on-rancher.cloud\0"
-"randaberg.no\0"
-"seirou.niigata.jp\0"
-"elburg.museum\0tushu\0"
-"nord-fron.no\0"
-"hirara.okinawa.jp\0"
-"usgarden.museum\0"
-"gangaviika.no\0us-west-1.elasticbeanstalk.com\0"
-"nerdpol.ovh\0"
-"blogdns.com\0"
-"nagi.okayama.jp\0"
-"gv.vc\0"
-"cloud.fedoraproject.org\0"
-"mt.gov.br\0dellogliastra.it\0kin.okinawa.jp\0"
-"s3-eu-west-1.amazonaws.com\0"
-"basilicata.it\0kunneppu.hokkaido.jp\0"
-"godo.gifu.jp\0sakura.tochigi.jp\0cri.nz\0"
-"feedback\0vana\0giize.com\0"
-"\xe0\xaa\xad\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xaa\xa4\0williamhill\0"
-"cologne\0twmail.cc\0"
-"kanzaki.saga.jp\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\0\xe0\xb8\x97\xe0\xb8\xab\xe0\xb8\xb2\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"jefferson.museum\0"
-"badaddja.no\0doesntexist.com\0"
-"ichikai.tochigi.jp\0"
-"rec.nf\0"
-"chernihiv.ua\0"
-"enna.it\0"
-"tuscany.it\0s\xc3\xbc""dtirol.it\0"
-"kitakata.fukushima.jp\0"
-"narviika.no\0"
-"sener\0barsy.shop\0"
-"trolley.museum\0"
-"shiftedit.io\0"
-"medecin.fr\0"
-"watchandclock.museum\0"
-"run.app\0"
-"fvg.it\0watch\0"
-"shiwa.iwate.jp\0"
-"paris\0"
-"dynv6.net\0"
-"tj\xc3\xb8me.no\0sohu\0jambyl.su\0"
-"zao.miyagi.jp\0"
-"babia-gora.pl\0"
-"h.bg\0hsbc\0icbc\0"
-"half.host\0"
-"consulting.aero\0"
-"wnext.app\0"
-"childrensgarden.museum\0school.museum\0cc.ok.us\0"
-"takanabe.miyazaki.jp\0"
-"is-a-knight.org\0"
-"agr.br\0"
-"yugawara.kanagawa.jp\0tarama.okinawa.jp\0shinjuku.tokyo.jp\0"
-"sakaiminato.tottori.jp\0"
-"higashiizu.shizuoka.jp\0"
-"pp.se\0pp.ru\0mlbfan.org\0"
-"sakegawa.yamagata.jp\0vpndns.net\0"
-"nosegawa.nara.jp\0se.net\0ru.net\0"
-"k12.ga.us\0"
-"ikeda.gifu.jp\0"
-"wa.us\0"
-"rec.ro\0"
-"ac.gov.br\0"
-"go.leg.br\0"
-"fla.no\0"
-"naoshima.kagawa.jp\0arida.wakayama.jp\0nome.pt\0"
-"ambulance.aero\0"
-"si.it\0tsu.mie.jp\0"
-"\xe3\x83\x95\xe3\x82\xa1\xe3\x83\x83\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0"
-"kaufen\0"
-"teaches-yoga.com\0"
-"hs.kr\0merckmsd\0"
-"edgestack.me\0"
-"conf.se\0pp.ua\0"
-"steinkjer.no\0"
-"nt.no\0"
-"br.it\0cb.it\0"
-"mill.museum\0domains\0"
-"etajima.hiroshima.jp\0"
-"store\0"
-"yashiro.hyogo.jp\0"
-"tysfjord.no\0tokyo\0"
-"aya.miyazaki.jp\0"
-"k12.az.us\0"
-"trentin-sudtirol.it\0pippu.hokkaido.jp\0"
-"ryokami.saitama.jp\0"
-"neues.museum\0"
-"amli.no\0"
-"satx.museum\0"
-"ine.kyoto.jp\0"
-"lib.co.us\0"
-"abarth\0"
-"iwamizawa.hokkaido.jp\0"
-"e164.arpa\0\xe5\x85\xac\xe5\x8f\xb8.\xe9\xa6\x99\xe6\xb8\xaf\0song\0"
-"moss.no\0"
-"equipment.aero\0qld.edu.au\0"
-"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0de.cool\0"
-"notodden.no\0"
-"resistance.museum\0"
-"sar.it\0kawagoe.saitama.jp\0"
-"soundandvision.museum\0rec.ve\0filegear-ie.me\0"
-"numata.hokkaido.jp\0shijonawate.osaka.jp\0"
-"catholic.edu.au\0naamesjevuemie.no\0"
-"sony\0is.eu.org\0"
-"ybo.party\0"
-"akrehamn.no\0lib.ny.us\0"
-"sardinia.it\0koeln\0"
-"tsuchiura.ibaraki.jp\0\xd8\xa8\xd8\xa7\xd8\xb1\xd8\xaa\0"
-"cc.mo.us\0solutions\0"
-"midsund.no\0"
-"ap-south-1.elasticbeanstalk.com\0dyndns-at-home.com\0"
-"rindal.no\0nt.ro\0sa.com\0"
-"kawakami.nagano.jp\0kitagata.saga.jp\0otsu.shiga.jp\0"
-"dynvpn.de\0"
-"nankoku.kochi.jp\0"
-"nsn.us\0c66.me\0"
-"takahashi.okayama.jp\0koto.tokyo.jp\0"
-"dn.ua\0"
-"it.eu.org\0"
-"yusui.kagoshima.jp\0"
-"maintenance.aero\0narvik.no\0"
-"mel\xc3\xb8y.no\0"
-"koori.fukushima.jp\0"
-"hyuga.miyazaki.jp\0"
-"tksat.bo\0drangedal.no\0autos\0"
-"akabira.hokkaido.jp\0"
-"\xd8\xa8\xd9\x8a\xd8\xaa\xd9\x83\0is-a-liberal.com\0"
-"surnadal.no\0"
-"mail.pl\0"
-"od.ua\0"
-"agric.za\0"
-"from-nm.com\0"
-"niikappu.hokkaido.jp\0taiji.wakayama.jp\0"
-"newmexico.museum\0"
-"plo.ps\0"
-"iide.yamagata.jp\0"
-"saga.saga.jp\0"
-"racing\0"
-"kagoshima.kagoshima.jp\0"
-"s3-ap-southeast-1.amazonaws.com\0"
-"fussa.tokyo.jp\0cn-northwest-1.eb.amazonaws.com.cn\0"
-"schools.nsw.edu.au\0parts\0eu-central-1.elasticbeanstalk.com\0"
-"inc.hk\0"
-"museum\0git-repos.de\0brasilia.me\0"
-"tysv\xc3\xa6r.no\0party\0verm\xc3\xb6gensberatung\0barsy.site\0"
-"\xe4\xb8\xad\xe5\x9b\xbd\0"
-"co.ae\0"
-"minamiminowa.nagano.jp\0wake.okayama.jp\0"
-"co.ag\0"
-"kuroishi.aomori.jp\0*.sensiosite.cloud\0"
-"co.am\0hvaler.no\0gives\0"
-"co.ao\0dyndns-at-work.com\0"
-"state.museum\0\xe4\xb8\xad\xe5\x9c\x8b\0"
-"co.bb\0rep.kp\0group\0*.kunden.ortsinfo.at\0"
-"in.eu.org\0"
-"co.at\0"
-"feira.br\0"
-"herokussl.com\0"
-"lig.it\0lodi.it\0shobara.hiroshima.jp\0"
-"co.bi\0hasura-app.io\0"
-"katori.chiba.jp\0user.aseinet.ne.jp\0"
-"cambridge.museum\0"
-"skjak.no\0lib.me.us\0"
-"matsusaka.mie.jp\0co.bn\0"
-"0.bg\0"
-"co.ca\0"
-"vb.it\0"
-"nord-odal.no\0cc.ks.us\0"
-"conf.lv\0"
-"*.sch.uk\0software\0is-into-games.com\0"
-"yamanashi.yamanashi.jp\0bialystok.pl\0"
-"co.bw\0idrett.no\0"
-"est.pr\0"
-"co.ci\0rodoy.no\0"
-"co.cl\0"
-"co.cm\0"
-"co.cr\0"
-"srv.br\0yusuhara.kochi.jp\0"
-"suli.hu\0stange.no\0loseyourip.com\0"
-"co.cz\0"
-"co.dk\0"
-"clock.museum\0cc.vi.us\0"
-"dsmynas.org\0"
-"broke-it.net\0"
-"gallup\0"
-"xen.prgmr.com\0"
-"yawara.ibaraki.jp\0"
-"pa.it\0tosashimizu.kochi.jp\0izunokuni.shizuoka.jp\0edogawa.tokyo.jp\0"
-"project.museum\0"
-"kiso.nagano.jp\0"
-"\xc3\xa5lesund.no\0"
-"\xd7\x99\xd7\xa8\xd7\x95\xd7\xa9\xd7\x9c\xd7\x99\xd7\x9d.museum\0"
-"vallee-d-aoste.it\0"
-"gs.tm.no\0"
-"fortmissoula.museum\0k12.mo.us\0from-tn.com\0"
-"cim.br\0lombardia.it\0"
-"oshino.yamanashi.jp\0"
-"chita.aichi.jp\0tomisato.chiba.jp\0"
-"j\xc3\xb8rpeland.no\0modum.no\0"
-"bern.museum\0"
-"niteroi.br\0"
-"chuo.fukuoka.jp\0uda.nara.jp\0"
-"u.bg\0"
-"h.se\0stackhero-network.com\0"
-"fukudomi.saga.jp\0"
-"usantiques.museum\0"
-"teramo.it\0"
-"media.museum\0is-a-caterer.com\0"
-"co.gg\0gub.uy\0barsycenter.com\0eu.meteorapp.com\0"
-"vang.no\0collegefan.org\0"
-"kvafjord.no\0nov.ru\0"
-"co.gl\0"
-"madrid.museum\0gucci\0"
-"docs\0sanofi\0"
-"gallo\0"
-"lans.museum\0"
-"web.app\0"
-"gs.nl.no\0crimea.ua\0"
-"co.gy\0"
-"coop.ht\0"
-"slattum.no\0tranoy.no\0nov.su\0"
-"vall\xc3\xa9""e-aoste.it\0"
-"swidnik.pl\0"
-"fitjar.no\0"
-"\xe5\xbe\xae\xe5\x8d\x9a\0"
-"game\0"
-"co.id\0tenei.fukushima.jp\0"
-"co.hu\0"
-"yonezawa.yamagata.jp\0"
-"bc.ca\0"
-"sv.it\0"
-"podzone.org\0"
-"sharp\0"
-"vlaanderen.museum\0\xe7\xbd\x91\xe5\xba\x97\0"
-"co.il\0"
-"co.im\0"
-"co.in\0"
-"bardu.no\0"
-"chambagri.fr\0\xe5\xae\xae\xe5\x9f\x8e.jp\0yanagawa.fukuoka.jp\0yamaxun\0"
-"ivgu.no\0"
-"g12.br\0co.ir\0"
-"co.it\0"
-"co.je\0"
-"al.gov.br\0yamagata.ibaraki.jp\0"
-"coop.br\0london.cloudapps.digital\0"
-"shimosuwa.nagano.jp\0auction\0"
-"kakogawa.hyogo.jp\0ome.tokyo.jp\0mragowo.pl\0"
-"c.cdn77.org\0*.customer-oci.com\0api.stdlib.com\0"
-"uk.net\0"
-"net-freaks.com\0"
-"co.jp\0toyota.aichi.jp\0"
-"blog\0"
-"misato.shimane.jp\0"
-"co.ke\0"
-"soka.saitama.jp\0"
-"free.hr\0"
-"\xe8\xb4\xad\xe7\x89\xa9\0yodobashi\0"
-"s\xc3\xb8rum.no\0"
-"izumizaki.fukushima.jp\0co.kr\0better-than.tv\0"
-"co.lc\0"
-"kariya.aichi.jp\0"
-"tjome.no\0"
-"ainan.ehime.jp\0"
-"dyndns-pics.com\0for-our.info\0"
-"ne.jp\0"
-"spot\0"
-"parachuting.aero\0ne.ke\0\xe7\xb5\x84\xe7\xb9\x94.tw\0consulting\0"
-"co.ma\0usa.museum\0"
-"kagami.kochi.jp\0mugi.tokushima.jp\0"
-"co.ls\0"
-"minato.tokyo.jp\0"
-"co.me\0assassination.museum\0paleo.museum\0hammarfeasta.no\0"
-"*.futurecms.at\0"
-"co.mg\0"
-"caseih\0"
-"ne.kr\0"
-"bci.dnstrace.pro\0"
-"psp.gov.pl\0"
-"bahn.museum\0"
-"kosher\0"
-"botanicgarden.museum\0co.na\0k12.wi.us\0is-a-cubicle-slave.com\0"
-"co.mu\0"
-"embetsu.hokkaido.jp\0"
-"co.mw\0"
-"kitagata.gifu.jp\0"
-"flight.aero\0co.ni\0hb.cldmail.ru\0"
-"co.mz\0"
-"ichikawamisato.yamanashi.jp\0co.nl\0"
-"teo.br\0"
-"sanfrancisco.museum\0tele.amune.org\0co.no\0groks-the.info\0"
-"bearalvahki.no\0"
-"kawaue.gifu.jp\0"
-"k12.ec\0endoftheinternet.org\0"
-"co.nz\0"
-"ichihara.chiba.jp\0"
-"co.om\0"
-"uri.arpa\0"
-"financial\0"
-"luxury\0"
-"oketo.hokkaido.jp\0"
-"modalen.no\0orskog.no\0"
-"k12.pr.us\0"
-"kv\xc3\xa6""fjord.no\0"
-"tunk.org\0nym.by\0"
-"monash\0co.pl\0nym.bz\0"
-"kashima.saga.jp\0co.pn\0discover\0"
-"blue\0"
-"kitashiobara.fukushima.jp\0"
-"glas.museum\0free\0"
-"yaita.tochigi.jp\0"
-"leasing.aero\0games\0"
-"contagem.br\0"
-"co.pw\0pa.us\0azurecontainer.io\0"
-"museumcenter.museum\0opencraft.hosting\0"
-"properties\0"
-"uchinada.ishikawa.jp\0"
-"law.pro\0homelink.one\0"
-"aparecida.br\0"
-"workshop.museum\0"
-"li.it\0"
-"cc.az.us\0nym.ec\0"
-"nanao.ishikawa.jp\0gorlice.pl\0community-pro.net\0"
-"\xc3\xa5snes.no\0pharmacy\0shangrila\0\xe3\x82\xbb\xe3\x83\xbc\xe3\x83\xab\0"
-"valleedaoste.it\0lubin.pl\0"
-"seki.gifu.jp\0"
-"stuttgart.museum\0mini\0"
-"tra.kp\0"
-"estate.museum\0ne.pw\0"
-"romskog.no\0co.rs\0"
-"geelvinck.museum\0lacaixa\0alpha.bounty-full.com\0"
-"mo-i-rana.no\0co.rw\0vegas\0"
-"mint\0"
-"dgca.aero\0kristiansund.no\0dielddanuorri.no\0"
-"kozow.com\0"
-"\xe6\x9d\xb1\xe4\xba\xac.jp\0walbrzych.pl\0"
-"panama.museum\0alsace\0"
-"alto-adige.it\0"
-"k12.il\0"
-"co.st\0"
-"kvalsund.no\0"
-"co.th\0"
-"clinton.museum\0"
-"shirakawa.gifu.jp\0co.sz\0co.tj\0"
-"gon.pk\0"
-"\xe5\xb1\xb1\xe5\x8f\xa3.jp\0shiroi.chiba.jp\0"
-"co.tm\0"
-"kawatana.nagasaki.jp\0"
-"mysecuritycamera.com\0"
-"co.ua\0"
-"kazo.saitama.jp\0blogsite.xyz\0"
-"co.tt\0nym.gr\0"
-"industries\0"
-"colonialwilliamsburg.museum\0co.ug\0leclerc\0"
-"turin.it\0"
-"s3.ca-central-1.amazonaws.com\0"
-"co.tz\0"
-"interactive.museum\0co.uk\0nym.gy\0dray-dns.de\0"
-"trentinos\xc3\xbc""dtirol.it\0yomitan.okinawa.jp\0"
-"nym.hk\0"
-"shibuya.tokyo.jp\0"
-"lib.hi.us\0s3-website-ap-southeast-2.amazonaws.com\0"
-"sekigahara.gifu.jp\0omitama.ibaraki.jp\0"
-"co.us\0"
-"pn.it\0kwp.gov.pl\0"
-"org.ac\0co.ve\0"
-"org.ae\0safety\0nym.ie\0"
-"org.af\0kumakogen.ehime.jp\0gbiz\0"
-"org.ag\0palace.museum\0co.vi\0"
-"minamiechizen.fukui.jp\0co.uz\0"
-"org.ai\0yalta.ua\0"
-"\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"valer.hedmark.no\0"
-"org.al\0"
-"org.am\0salzburg.museum\0"
-"trentino-a-adige.it\0aoste.it\0"
-"stathelle.no\0g\xc3\xa1ls\xc3\xa1.no\0ne.ug\0"
-"sumoto.hyogo.jp\0yamatokoriyama.nara.jp\0otsuki.yamanashi.jp\0"
-"org.ba\0builders\0"
-"org.ar\0org.bb\0tajimi.gifu.jp\0ne.tz\0"
-"org.au\0"
-"org.bh\0"
-"org.bi\0"
-"org.az\0kami.kochi.jp\0aga.niigata.jp\0itabashi.tokyo.jp\0"
-"u.se\0ne.us\0nagoya\0"
-"org.bm\0"
-"org.bn\0tsubata.ishikawa.jp\0"
-"org.bo\0"
-"friuli-v-giulia.it\0olbiatempio.it\0tempio-olbia.it\0"
-"org.br\0kisofukushima.nagano.jp\0"
-"org.bs\0"
-"org.bt\0"
-"\xce\xb5\xce\xbb\0"
-"org.bw\0philips\0"
-"fot.br\0"
-"org.ci\0"
-"org.bz\0"
-"stordal.no\0"
-"org.cn\0okinawa.jp\0"
-"empresa.bo\0org.co\0bale.museum\0ski.no\0med.pro\0\xce\xb5\xcf\x85\0"
-"sasaguri.fukuoka.jp\0"
-"nym.la\0mo-siemens.io\0"
-"eun.eg\0sologne.museum\0ieee\0ollo\0talk\0from-nh.com\0nym.lc\0"
-"org.cu\0"
-"org.cw\0"
-"org.cy\0ibestad.no\0nym.li\0"
-"imakane.hokkaido.jp\0nym.kz\0"
-"taishi.hyogo.jp\0"
-"org.dm\0"
-"org.do\0co.za\0"
-"ts.it\0witd.gov.pl\0"
-"ekloges.cy\0org.ec\0"
-"nym.lt\0"
-"org.ee\0fhv.se\0nym.lu\0nym.me\0"
-"org.eg\0loginline.io\0"
-"recife.br\0soc.srcf.net\0"
-"haram.no\0"
-"org.dz\0"
-"coop.rw\0co.zm\0"
-"yura.wakayama.jp\0nym.mn\0"
-"muosat.no\0"
-"masuda.shimane.jp\0"
-"org.es\0"
-"org.et\0"
-"co.zw\0s3.eu-west-3.amazonaws.com\0"
-"anthropology.museum\0coastaldefence.museum\0"
-"nym.mx\0"
-"org.fj\0"
-"cloudns.pro\0mypets.ws\0"
-"modern.museum\0n\xc3\xb8tter\xc3\xb8y.no\0"
-"landes.museum\0repl.co\0"
-"nichinan.miyazaki.jp\0"
-"onred.one\0"
-"*.yokohama.jp\0aogashima.tokyo.jp\0"
-"org.ge\0dni.us\0trade\0"
-"org.gg\0radoy.no\0as.us\0"
-"org.gh\0coop.tt\0"
-"org.gi\0"
-"nym.nz\0"
-"marnardal.no\0"
-"org.gl\0ascoli-piceno.it\0"
-"org.gn\0"
-"org.gp\0traniandriabarletta.it\0"
-"bamble.no\0k12.nj.us\0"
-"org.gr\0hospital\0"
-"academia.bo\0"
-"org.gt\0gojome.akita.jp\0marumori.miyagi.jp\0nishikatsura.yamanashi.jp\0"
-"org.gu\0ingatlan.hu\0no-ip.org\0nym.pe\0"
-"blogspot.com\0"
-"org.gy\0evenes.no\0fh.se\0"
-"coop.mv\0"
-"org.hk\0coop.mw\0"
-"org.hn\0nishiizu.shizuoka.jp\0"
-"f.bg\0"
-"ky.us\0pt.eu.org\0"
-"cc.ny.us\0"
-"org.ht\0nym.pt\0"
-"org.hu\0"
-"iserv.dev\0"
-"townnews-staging.com\0"
-"\xd0\xb8\xd0\xba\xd0\xbe\xd0\xbc.museum\0"
-"xs4all.space\0"
-"org.il\0nakagawa.fukuoka.jp\0"
-"org.im\0"
-"org.in\0"
-"org.iq\0youth.museum\0"
-"org.ir\0"
-"org.is\0sauda.no\0"
-"not.br\0niigata.niigata.jp\0"
-"org.je\0finn\xc3\xb8y.no\0"
-"modena.it\0k12.tr\0"
-"alvdal.no\0\xc3\xb8ygarden.no\0"
-"res.aero\0"
-"gehirn.ne.jp\0"
-"mosvik.no\0"
-"org.jo\0zhitomir.ua\0nym.ro\0"
-"kinder\0"
-"\xe7\xb5\x84\xe7\xb9\x94.hk\0"
-"lib.in.us\0"
-"\xc3\xa5mli.no\0eaton.mi.us\0"
-"yakage.okayama.jp\0"
-"mil.ac\0org.kg\0jfk.museum\0posts-and-telecommunications.museum\0finance\0"
-"mil.ae\0org.ki\0"
-"hisayama.fukuoka.jp\0sekikawa.niigata.jp\0nissan\0"
-"nym.sk\0"
-"soeda.fukuoka.jp\0"
-"org.km\0coop.py\0k12.vi\0"
-"org.kn\0"
-"bronnoy.no\0"
-"mil.al\0org.kp\0"
-"org.la\0"
-"manaus.br\0org.lb\0"
-"org.lc\0"
-"mil.ba\0nissay\0nym.su\0"
-"mil.ar\0"
-"org.kw\0"
-"nym.sx\0"
-"org.ky\0"
-"taka.hyogo.jp\0org.kz\0"
-"org.lk\0muos\xc3\xa1t.no\0"
-"lib.tx.us\0"
-"mil.az\0"
-"monza.it\0"
-"org.ma\0"
-"org.lr\0"
-"mil.bo\0org.ls\0larsson.museum\0virtual.museum\0"
-"org.me\0"
-"mil.br\0org.lv\0"
-"org.mg\0alt.za\0nym.tw\0"
-"org.ly\0zt.ua\0"
-"org.mk\0"
-"\xe9\x9d\x92\xe6\xa3\xae.jp\0org.ml\0"
-"mil.by\0"
-"port.fr\0org.mn\0"
-"org.mo\0"
-"mil.cl\0watarai.mie.jp\0*.magentosite.cloud\0"
-"coop.km\0org.na\0iamallama.com\0"
-"mil.cn\0hamatonbetsu.hokkaido.jp\0"
-"mil.co\0org.ms\0"
-"kitagawa.miyazaki.jp\0org.mt\0"
-"org.mu\0"
-"org.mv\0"
-"org.mw\0org.ng\0"
-"takamori.kumamoto.jp\0org.mx\0"
-"org.my\0org.ni\0loabat.no\0"
-"org.mz\0"
-"vestnes.no\0"
-"bar.pro\0"
-"org.nr\0"
-"mil.do\0lib.ok.us\0"
-"lillesand.no\0\xe4\xbf\xa1\xe6\x81\xaf\0"
-"shingo.aomori.jp\0"
-"mil.ec\0"
-"losangeles.museum\0"
-"org.nz\0"
-"mil.eg\0rockart.museum\0"
-"org.om\0"
-"servecounterstrike.com\0"
-"org.pa\0k12.ut.us\0taxi\0"
-"ge.it\0"
-"org.pe\0ddnsfree.com\0"
-"yorii.saitama.jp\0org.pf\0"
-"org.ph\0"
-"and.museum\0center.museum\0"
-"org.pk\0"
-"seiro.niigata.jp\0org.pl\0augustow.pl\0"
-"mil.fj\0osaka.jp\0org.pn\0"
-"notteroy.no\0saltdal.no\0farmers\0"
-"org.qa\0"
-"org.pr\0"
-"brussel.museum\0org.ps\0\xd8\xa7\xd9\x84\xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1\0kindle\0from-mi.com\0is-an-artist.com\0"
-"org.pt\0"
-"cartoonart.museum\0"
-"friuli-ve-giulia.it\0"
-"mil.ge\0org.py\0"
-"ogawa.ibaraki.jp\0"
-"ubank\0"
-"mil.gh\0tsushima.aichi.jp\0"
-"airport.aero\0"
-"grane.no\0"
-"meiwa.mie.jp\0"
-"mil.gt\0abira.hokkaido.jp\0higashikurume.tokyo.jp\0"
-"culture.museum\0"
-"kyonan.chiba.jp\0sakahogi.gifu.jp\0ueda.nagano.jp\0"
-"skaun.no\0"
-"joinville.br\0sanok.pl\0"
-"org.ro\0dy.fi\0"
-"org.sa\0"
-"mil.hn\0kani.gifu.jp\0shimotsuke.tochigi.jp\0org.sb\0"
-"org.rs\0org.sc\0lib.sd.us\0"
-"shinagawa.tokyo.jp\0org.sd\0"
-"ethnology.museum\0org.se\0lamborghini\0org.ru\0"
-"ad.jp\0bayern\0"
-"aerobatic.aero\0exchange.aero\0fineart.museum\0org.rw\0org.sg\0"
-"mil.id\0shimoichi.nara.jp\0nanjo.okinawa.jp\0org.sh\0"
-"koka.shiga.jp\0wiw.gov.pl\0dsmynas.net\0"
-"mozilla-iot.org\0"
-"org.sl\0"
-"mein-vigor.de\0"
-"pug.it\0shimokawa.hokkaido.jp\0org.sn\0"
-"org.so\0"
-"mil.in\0"
-"hof.no\0org.ss\0"
-"org.st\0"
-"mil.iq\0cc.ak.us\0"
-"org.sv\0"
-"mo\xc3\xa5reke.no\0"
-"saitama.jp\0mypsx.net\0"
-"org.sy\0"
-"usui.fukuoka.jp\0org.sz\0org.tj\0"
-"\xe9\xa3\x9e\xe5\x88\xa9\xe6\xb5\xa6\0"
-"org.tm\0"
-"org.tn\0"
-"music.museum\0org.to\0"
-"taxi.br\0toho.fukuoka.jp\0inami.wakayama.jp\0"
-"org.ua\0"
-"cagliari.it\0org.tr\0kitchen\0"
-"mil.jo\0recipes\0"
-"kaneyama.fukushima.jp\0org.tt\0"
-"loab\xc3\xa1t.no\0"
-"takinoue.hokkaido.jp\0"
-"indian.museum\0org.tw\0org.ug\0"
-"guovdageaidnu.no\0"
-"ato.br\0"
-"mil.kg\0org.uk\0doomdns.com\0"
-"takashima.shiga.jp\0"
-"ia.us\0"
-"valleeaoste.it\0"
-"cc.la.us\0"
-"*.statics.cloud\0"
-"mil.km\0komatsu\0"
-"piemonte.it\0"
-"org.vc\0cloudns.org\0"
-"\xe7\xa6\x8f\xe4\xba\x95.jp\0"
-"democracia.bo\0uscountryestate.museum\0org.ve\0health-carereform.com\0"
-"mil.kr\0"
-"ven.it\0"
-"org.uy\0org.vi\0"
-"komaki.aichi.jp\0org.uz\0"
-"law.za\0"
-"mil.kz\0org.vn\0"
-"kamimine.saga.jp\0"
-"tamatsukuri.ibaraki.jp\0"
-"ardal.no\0lib.wa.us\0"
-"oishida.yamagata.jp\0"
-"engineer.aero\0org.vu\0"
-"minokamo.gifu.jp\0matsumoto.nagano.jp\0from-az.net\0"
-"kazuno.akita.jp\0"
-"kanie.aichi.jp\0shinshiro.aichi.jp\0kashima.ibaraki.jp\0mil.lv\0"
-"modelling.aero\0mil.mg\0beiarn.no\0"
-"carrd.co\0"
-"tabayama.yamanashi.jp\0"
-"tools\0"
-"musashimurayama.tokyo.jp\0"
-"org.ws\0"
-"nuoro.it\0"
-"kurogi.fukuoka.jp\0ozu.kumamoto.jp\0"
-"auspost\0"
-"mil.mv\0"
-"ski.museum\0mil.ng\0lv.ua\0"
-"mil.my\0mil.ni\0k12.ne.us\0"
-"\xe5\xb3\xb6\xe6\xa0\xb9.jp\0shonai.fukuoka.jp\0mil.mz\0"
-"filegear-jp.me\0"
-"salon\0"
-"mil.no\0"
-"kannami.shizuoka.jp\0"
-"farmers.museum\0fosnes.no\0"
-"lecce.it\0"
-"s.bg\0"
-"f.se\0*.quipelements.com\0"
-"amagasaki.hyogo.jp\0oi.kanagawa.jp\0mil.nz\0"
-"niyodogawa.kochi.jp\0mamurogawa.yamagata.jp\0"
-"org.za\0"
-"moriyama.shiga.jp\0"
-"station.museum\0"
-"caa.li\0ui.nabu.casa\0"
-"lier.no\0"
-"eu.int\0valdaosta.it\0matsuzaki.shizuoka.jp\0higashimurayama.tokyo.jp\0"
-"mil.pe\0"
-"hb.cn\0"
-"tanabe.wakayama.jp\0mil.ph\0"
-"b\xc3\xb8.nordland.no\0org.zm\0"
-"godaddy\0money\0balashov.su\0"
-"misaki.osaka.jp\0mil.pl\0"
-"khmelnytskyi.ua\0"
-"kalisz.pl\0"
-"ap-southeast-1.elasticbeanstalk.com\0"
-"mil.qa\0kids.us\0"
-"es.leg.br\0on-web.fr\0"
-"org.zw\0cityeats\0space-to-rent.com\0"
-"ina.saitama.jp\0"
-"nayoro.hokkaido.jp\0"
-"brussels.museum\0""4u.com\0"
-"mil.py\0"
-"\xe3\x81\xbf\xe3\x82\x93\xe3\x81\xaa\0"
-"midtre-gauldal.no\0"
-"read-books.org\0"
-"kamijima.ehime.jp\0flt.cloud.muni.cz\0"
-"s\xc3\xb8gne.no\0is-a-photographer.com\0"
-"friuli-vegiulia.it\0miyako.fukuoka.jp\0"
-"bofa\0dyndns.org\0"
-"\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x81\xd1\x80\xd0\xb1\0"
-"kahoku.yamagata.jp\0"
-"jpn.com\0knowsitall.info\0"
-"toki.gifu.jp\0"
-"trapani.it\0school\0"
-"k12.as.us\0mil.ru\0"
-"mil.rw\0from-ok.com\0ditchyourip.com\0"
-"ginan.gifu.jp\0mil.sh\0"
-"miners.museum\0"
-"iobb.net\0"
-"yamatotakada.nara.jp\0"
-"in.na\0sucks\0viking\0"
-"rome.it\0zamami.okinawa.jp\0mil.st\0"
-"ms.it\0from-ny.net\0"
-"cc.ct.us\0us.com\0"
-"jaworzno.pl\0build\0"
-"odda.no\0mil.sy\0"
-"kagamiishi.fukushima.jp\0mil.tj\0"
-"in.ni\0"
-"aviation.museum\0mil.tm\0"
-"mil.to\0k12.la.us\0"
-"daiwa.hiroshima.jp\0qpon\0"
-"\xe7\xbb\x84\xe7\xb9\x94.hk\0boats\0"
-"mil.tr\0cloudfunctions.net\0"
-"kunst.museum\0is-a-bruinsfan.org\0"
-"bunkyo.tokyo.jp\0"
-"hatoyama.saitama.jp\0"
-"bajddar.no\0mil.tw\0"
-"doshi.yamanashi.jp\0mil.tz\0"
-"poltava.ua\0"
-"ono.fukui.jp\0"
-"sling\0"
-"cc.nj.us\0"
-"mil.vc\0beauty\0"
-"ms.kr\0in.london\0"
-"mil.ve\0from-ut.com\0"
-"mil.uy\0"
-"naka.ibaraki.jp\0pioneer\0*.platform.sh\0"
-"st.no\0"
-"gr.it\0ushiku.ibaraki.jp\0warabi.saitama.jp\0"
-"gallery\0"
-"osasco.br\0"
-"*.oci.customer-oci.com\0"
-"git-pages.rit.edu\0"
-"lavangen.no\0engineering\0dnsdojo.com\0"
-"gr.jp\0"
-"hadsel.no\0col.ng\0"
-"geek.nz\0test.tj\0"
-"archi\0"
-"bridgestone\0skype\0"
-"denmark.museum\0"
-"sandnes.no\0"
-"cc.hi.us\0"
-"takatsuki.shiga.jp\0"
-"\xe6\x9c\xba\xe6\x9e\x84\0"
-"creation.museum\0"
-"realm.cz\0"
-"filegear-de.me\0"
-"balsan-suedtirol.it\0"
-"trustee.museum\0"
-"aq.it\0ba.it\0"
-"susaki.kochi.jp\0tama.tokyo.jp\0"
-"in.rs\0nis.za\0"
-"trentino-sudtirol.it\0"
-"izumisano.osaka.jp\0"
-"gs.fm.no\0"
-"iwaki.fukushima.jp\0nishigo.fukushima.jp\0"
-"kyowa.akita.jp\0no-ip.net\0"
-"nord-aurdal.no\0porsanger.no\0"
-"tomi.nagano.jp\0"
-"telekommunikation.museum\0mil.za\0"
-"topology.museum\0analytics\0"
-"bryne.no\0test.ru\0"
-"bond\0"
-"aeroport.fr\0fujikawa.shizuoka.jp\0in.th\0"
-"ssl.origin.cdn77-secure.org\0"
-"sobetsu.hokkaido.jp\0"
-"mil.zm\0"
-"imb.br\0poniatowa.pl\0"
-"r\xc3\xb8st.no\0"
-"in.ua\0"
-"boavista.br\0"
-"cust.disrec.thingdust.io\0"
-"koriyama.fukushima.jp\0"
-"gol.no\0mil.zw\0"
-"lg.jp\0"
-"futbol\0bounceme.net\0"
-"nakayama.yamagata.jp\0"
-"showa.fukushima.jp\0tsubetsu.hokkaido.jp\0kisosaki.mie.jp\0misugi.mie.jp\0taiwa.miyagi.jp\0computer\0"
-"academy\0book\0"
-"lib.nh.us\0"
-"intel\0"
-"dnsiskinky.com\0"
-"isumi.chiba.jp\0"
-"in.us\0"
-"shibetsu.hokkaido.jp\0taito.tokyo.jp\0"
-"cargo.aero\0"
-"kawai.iwate.jp\0tateshina.nagano.jp\0"
-"est-le-patron.com\0"
-"gose.nara.jp\0gmina.pl\0"
-"depot.museum\0"
-"aichi.jp\0choyo.kumamoto.jp\0"
-"from-mt.com\0from-nd.com\0"
-"foundation\0"
-"toscana.it\0"
-"v\xc3\xa5ler.\xc3\xb8stfold.no\0"
-"*.0emm.com\0"
-"travel\0"
-"aquarelle\0"
-"naganohara.gunma.jp\0dunlop\0ricoh\0"
-"matsue.shimane.jp\0"
-"cc.vt.us\0"
-"*.kawasaki.jp\0"
-"nikaho.akita.jp\0tsk.tr\0"
-"edu.ac\0"
-"raid\0"
-"edu.af\0jampa.br\0"
-"balsan.it\0"
-"toyoake.aichi.jp\0equipment\0"
-"brussels\0"
-"edu.al\0gokase.miyazaki.jp\0wlocl.pl\0"
-"giske.no\0"
-"suzaka.nagano.jp\0"
-"edu.ba\0ask\xc3\xb8y.no\0"
-"edu.ar\0edu.bb\0nc.tr\0"
-"uji.kyoto.jp\0agano.niigata.jp\0tateyama.toyama.jp\0star\0"
-"edu.au\0"
-"mima.tokushima.jp\0"
-"edu.bh\0hamada.shimane.jp\0"
-"edu.bi\0berlev\xc3\xa5g.no\0etnedal.no\0"
-"edu.az\0kasaoka.okayama.jp\0"
-"cloudns.eu\0"
-"misato.wakayama.jp\0"
-"edu.bm\0b\xc3\xb8mlo.no\0chernivtsi.ua\0"
-"edu.bn\0co.krd\0"
-"edu.bo\0kustanai.ru\0"
-"tos.it\0"
-"edu.br\0"
-"edu.bs\0heroy.nordland.no\0vadso.no\0s.se\0ms.us\0nc.us\0nid.io\0"
-"edu.bt\0firenze.it\0"
-"qcx.io\0"
-"edu.ci\0elvendrell.museum\0"
-"edu.bz\0"
-"emb.kw\0lib.az.us\0horse\0"
-"exeter.museum\0"
-"edu.cn\0"
-"edu.co\0mex.com\0kustanai.su\0"
-"rexroth\0"
-"edu.cu\0"
-"edu.cw\0"
-"koshimizu.hokkaido.jp\0"
-"edu.dm\0cincinnati.museum\0wy.us\0"
-"bialowieza.pl\0"
-"edu.do\0"
-"jus.br\0"
-"is-a-democrat.com\0"
-"edu.ec\0"
-"gosen.niigata.jp\0"
-"edu.ee\0"
-"edu.eg\0"
-"edu.dz\0"
-"averoy.no\0zaporizhzhia.ua\0"
-"krasnik.pl\0"
-"miyama.fukuoka.jp\0wajima.ishikawa.jp\0"
-"film.museum\0"
-"edu.es\0dynalias.com\0scrysec.com\0"
-"edu.et\0cloudns.in\0"
-"lea\xc5\x8bgaviika.no\0"
-"cz.it\0iruma.saitama.jp\0toyota.yamaguchi.jp\0"
-"bbs.tr\0"
-"bplaced.com\0"
-"shell\0"
-"bozen-suedtirol.it\0takayama.gifu.jp\0"
-"hurdal.no\0"
-"ikawa.akita.jp\0"
-"kiwi\0"
-"accident-investigation.aero\0edu.ge\0oceanographique.museum\0cc.tx.us\0"
-"jor.br\0mito.ibaraki.jp\0cloudapps.digital\0"
-"edu.gh\0yamato.kanagawa.jp\0"
-"edu.gi\0cloudns.cc\0"
-"md.ci\0"
-"edu.gl\0"
-"bjugn.no\0orange\0"
-"edu.gn\0"
-"hobby-site.com\0"
-"edu.gp\0"
-"edu.gr\0dupont\0"
-"edu.gt\0swinoujscie.pl\0"
-"edu.gu\0fetsund.no\0"
-"umbria.it\0sagae.yamagata.jp\0"
-"lg.ua\0"
-"edu.gy\0saintlouis.museum\0oygarden.no\0volyn.ua\0"
-"edu.hk\0"
-"esp.br\0molise.it\0"
-"edu.hn\0"
-"shirahama.wakayama.jp\0"
-"gs.bu.no\0"
-"edu.ht\0kyotango.kyoto.jp\0"
-"lib.pa.us\0"
-"d.bg\0"
-"gc.ca\0chicago.museum\0"
-"in-vpn.de\0"
-"edu.in\0polkowice.pl\0"
-"sciences.museum\0filegear-sg.me\0"
-"edu.iq\0discourse.team\0"
-"barreau.bj\0"
-"edu.is\0"
-"edu.it\0"
-"is-into-cars.com\0"
-"\xe4\xbc\x81\xe4\xb8\x9a\0"
-"vindafjord.no\0"
-"urakawa.hokkaido.jp\0"
-"edu.jo\0roma.museum\0\xc3\xb8rskog.no\0"
-"sld.do\0"
-"mobi.gp\0hyogo.jp\0"
-"edu.kg\0is-a-hunter.com\0"
-"edu.ki\0applinzi.com\0"
-"kawanishi.yamagata.jp\0"
-"kutchan.hokkaido.jp\0kawanishi.hyogo.jp\0"
-"edu.km\0giessen.museum\0"
-"edu.kn\0"
-"ab.ca\0"
-"natal.br\0edu.kp\0"
-"edu.la\0"
-"edu.lb\0"
-"edu.lc\0"
-"goiania.br\0macerata.it\0"
-"edu.kw\0pl.ua\0"
-"honjyo.akita.jp\0hashikami.aomori.jp\0\xd0\xba\xd0\xb0\xd1\x82\xd0\xbe\xd0\xbb\xd0\xb8\xd0\xba\0"
-"edu.ky\0"
-"edu.kz\0"
-"edu.lk\0rana.no\0"
-"bn.it\0kyowa.hokkaido.jp\0"
-"in-dsl.org\0"
-"kanan.osaka.jp\0"
-"edu.lr\0"
-"edu.ls\0"
-"edu.me\0fjaler.no\0"
-"nantan.kyoto.jp\0satosho.okayama.jp\0edu.lv\0"
-"edu.mg\0"
-"\xe5\x85\xb5\xe5\xba\xab.jp\0"
-"edu.ly\0"
-"fund\0"
-"edu.mk\0"
-"edu.ml\0"
-"kawanabe.kagoshima.jp\0edu.mn\0sport\0"
-"nsw.au\0edu.mo\0"
-"design.museum\0lib.dc.us\0"
-"edu.ms\0schokoladen.museum\0s3-eu-west-3.amazonaws.com\0"
-"mutsu.aomori.jp\0edu.mt\0"
-"jx.cn\0lt.it\0edu.mv\0mydissent.net\0"
-"safety.aero\0edu.mw\0edu.ng\0"
-"toyako.hokkaido.jp\0edu.mx\0kepno.pl\0adult\0"
-"edu.my\0edu.ni\0\xe5\xae\xb6\xe9\x9b\xbb\0ua.rs\0"
-"higashiosaka.osaka.jp\0edu.mz\0gent\0"
-"skygearapp.com\0"
-"fermo.it\0"
-"exnet.su\0"
-"hornindal.no\0"
-"umb.it\0"
-"edu.nr\0rnu.tn\0hasura.app\0"
-"workinggroup.aero\0"
-"kitanakagusuku.okinawa.jp\0"
-"loyalist.museum\0"
-"h\xc3\xa1""bmer.no\0edu.om\0from-nv.com\0saves-the-whales.com\0"
-"bandai.fukushima.jp\0kutno.pl\0"
-"folkebibl.no\0scapp.io\0"
-"habikino.osaka.jp\0"
-"edu.pa\0mytuleap.com\0"
-"edu.pe\0"
-"ishikari.hokkaido.jp\0edu.pf\0"
-"molde.no\0study\0\xe9\x80\x9a\xe8\xb2\xa9\0"
-"okawa.fukuoka.jp\0niki.hokkaido.jp\0edu.ph\0"
-"edu.pk\0"
-"sakai.ibaraki.jp\0edu.pl\0"
-"edu.pn\0"
-"bel.tr\0"
-"versailles.museum\0edu.qa\0vologda.su\0"
-"edu.pr\0"
-"casadelamoneda.museum\0rollag.no\0edu.ps\0"
-"edu.pt\0"
-"castle.museum\0"
-"lamer\0"
-"doesntexist.org\0"
-"freesite.host\0"
-"edu.py\0is-into-anime.com\0"
-"trentin-s\xc3\xbc""d-tirol.it\0"
-"pl.eu.org\0"
-"news.hu\0"
-"syncloud.it\0"
-"team\0"
-"mashiko.tochigi.jp\0clan.rip\0"
-"scienceandhistory.museum\0hjartdal.no\0lib.il.us\0samsung\0"
-"travel.pl\0"
-"wedding\0lebtimnetz.de\0"
-"matsuno.ehime.jp\0"
-"hamaroy.no\0"
-"americanfamily\0"
-"cloudns.us\0"
-"rel.ht\0sakyo.kyoto.jp\0"
-"collection.museum\0"
-"oppegard.no\0audible\0"
-"ishikawa.fukushima.jp\0"
-"ltd.co.im\0dyr\xc3\xb8y.no\0"
-"edu.sa\0"
-"edu.sb\0"
-"porsangu.no\0edu.rs\0edu.sc\0est-a-la-maison.com\0"
-"edu.sd\0schokokeks.net\0"
-"edu.ru\0"
-"sampa.br\0"
-"edu.sg\0"
-"forlicesena.it\0podlasie.pl\0"
-"psi.br\0tech\0"
-"no.com\0"
-"edu.sl\0"
-"edu.sn\0"
-"edu.so\0"
-"pony.club\0"
-"google\0"
-"cloudns.club\0"
-"university.museum\0edu.ss\0s3-us-east-2.amazonaws.com\0"
-"murayama.yamagata.jp\0edu.st\0"
-"toyo.kochi.jp\0edu.sv\0"
-"newspaper.museum\0"
-"edu.sy\0"
-"iglesiascarbonia.it\0edu.tj\0"
-"heimatunduhren.museum\0edu.tm\0maserati\0"
-"edu.to\0"
-"edu.ua\0"
-"edu.tr\0"
-"edu.tt\0"
-"canada.museum\0utsira.no\0"
-"vall\xc3\xa9""e-d-aoste.it\0"
-"rakkestad.no\0edu.tw\0cafe\0apigee.io\0"
-"phone\0"
-"open\0"
-"nishio.aichi.jp\0"
-"saogonca.br\0lucania.it\0kishiwada.osaka.jp\0"
-"lib.mi.us\0toray\0"
-"yokawa.hyogo.jp\0"
-"edu.vc\0bitballoon.com\0"
-"sld.pa\0edu.ve\0"
-"publ.pt\0tkmaxx\0"
-"salvadordali.museum\0edu.uy\0casino\0gr.com\0"
-"travel.tt\0"
-"sosa.chiba.jp\0"
-"izumi.osaka.jp\0edu.vn\0"
-"bozen.it\0"
-"murmansk.su\0"
-"katano.osaka.jp\0"
-"media.aero\0"
-"edu.vu\0"
-"is-a-guru.com\0"
-"shimane.shimane.jp\0discourse.group\0"
-"surrey.museum\0edu.ws\0"
-"torino.museum\0"
-"meiwa.gunma.jp\0"
-"\xd8\xb9\xd8\xb1\xd8\xa7\xd9\x82\0"
-"field.museum\0uwu.ai\0"
-"lt.ua\0"
-"bauern.museum\0k12.ms.us\0k12.nc.us\0"
-"toyooka.hyogo.jp\0"
-"al.eu.org\0"
-"kr.com\0"
-"profesional.bo\0lib.pr.us\0edu.za\0"
-"rel.pl\0"
-"q.bg\0logoip.de\0"
-"d.se\0md.us\0hepforge.org\0"
-"olkusz.pl\0"
-"kerryhotels\0\xe3\x82\xa2\xe3\x83\x9e\xe3\x82\xbe\xe3\x83\xb3\0"
-"moma.museum\0lib.ak.us\0edu.zm\0"
-"antiques.museum\0granvin.no\0s3.us-east-2.amazonaws.com\0game-server.cc\0service.gov.uk\0"
-"rawa-maz.pl\0"
-"my-firewall.org\0applicationcloud.io\0ybo.trade\0"
-"protection\0"
-"agrigento.it\0"
-"kr\xc3\xb8""dsherad.no\0"
-"call\0crafting.xyz\0"
-"enonic.io\0"
-"\xe5\xb2\x90\xe9\x98\x9c.jp\0"
-"hotels\0"
-"kuki.saitama.jp\0"
-"photo\0"
-"miharu.fukushima.jp\0pcloud.host\0gliwice.pl\0"
-"arq.br\0kita.kyoto.jp\0"
-"owani.aomori.jp\0"
-"sr.it\0yuasa.wakayama.jp\0"
-"sorfold.no\0"
-"n4t.co\0"
-"cuiaba.br\0trentinosued-tirol.it\0"
-"camp\0bplaced.net\0"
-"omachi.saga.jp\0"
-"*.uberspace.de\0"
-"ikata.ehime.jp\0"
-"communications.museum\0snoasa.no\0media\0"
-"hemne.no\0"
-"kazimierz-dolny.pl\0"
-"cloudns.pw\0familyds.com\0"
-"beppu.oita.jp\0"
-"birdart.museum\0"
-"higashitsuno.kochi.jp\0aisho.shiga.jp\0hamamatsu.shizuoka.jp\0"
-"dlugoleka.pl\0"
-"est-a-la-masion.com\0"
-"ikoma.nara.jp\0auto.pl\0"
-"customer.enonic.io\0"
-"a\xc3\xa9roport.ci\0embroidery.museum\0"
-"nextdirect\0"
-"karikatur.museum\0"
-"urausu.hokkaido.jp\0"
-"kppsp.gov.pl\0"
-"na.it\0"
-"alibaba\0"
-"ng.city\0"
-"\xe7\xa6\x8f\xe5\xb2\xa1.jp\0yonaguni.okinawa.jp\0"
-"gausdal.no\0"
-"kh.ua\0poivron.org\0"
-"atsuma.hokkaido.jp\0nose.osaka.jp\0"
-"seihi.nagasaki.jp\0"
-"steigen.no\0hu.com\0awsmppl.com\0"
-"hoyanger.no\0"
-"tur.ar\0calabria.it\0takino.hyogo.jp\0"
-"s3-website-us-west-1.amazonaws.com\0"
-"zp.gov.pl\0mobi.tt\0"
-"tsuru.yamanashi.jp\0\xd8\xa7\xd9\x84\xd9\x85\xd8\xba\xd8\xb1\xd8\xa8\0"
-"cc.nh.us\0"
-"yamagata.gifu.jp\0"
-"nieruchomosci.pl\0mobi.tz\0jaguar\0"
-"tur.br\0hakui.ishikawa.jp\0"
-"care\0"
-"krakow.pl\0"
-"oz.au\0oregon.museum\0"
-"\xd0\xbe\xd0\xbd\xd0\xbb\xd0\xb0\xd0\xb9\xd0\xbd\0"
-"nore-og-uvdal.no\0chtr.k12.ma.us\0internet-dns.de\0"
-"\xe5\x8c\x97\xe6\xb5\xb7\xe9\x81\x93.jp\0murakami.niigata.jp\0iwade.wakayama.jp\0"
-"googleapis.com\0"
-"casa\0isa-hockeynut.com\0"
-"\xe6\x95\x99\xe8\x82\xb2.hk\0cars\0yokohama\0"
-"case\0"
-"surf\0"
-"lpusercontent.com\0"
-"friuli-vgiulia.it\0cash\0"
-"gifu.jp\0"
-"lib.ia.us\0"
-"dev.static.land\0"
-"gleeze.com\0"
-"*.kobe.jp\0"
-"barsy.menu\0"
-"sicily.it\0oamishirasato.chiba.jp\0sumida.tokyo.jp\0"
-"gemological.museum\0\xc3\xa1laheadju.no\0"
-"benevento.it\0obihiro.hokkaido.jp\0"
-"servemp3.com\0"
-"\xe5\xb2\xa1\xe5\xb1\xb1.jp\0mobara.chiba.jp\0atm.pl\0"
-"ao.it\0"
-"dattolocal.net\0"
-"idf.il\0"
-"bulsan-suedtirol.it\0"
-"cheltenham.museum\0\xc3\xa5lg\xc3\xa5rd.no\0"
-"\xe5\xa5\x88\xe8\x89\xaf.jp\0asakawa.fukushima.jp\0"
-"ggee\0"
-"noticias.bo\0"
-"lombardy.it\0moseushi.hokkaido.jp\0wolomin.pl\0"
-"hikimi.shimane.jp\0"
-"events\0"
-"svizzera.museum\0is-very-bad.org\0"
-"nysa.pl\0pictet\0"
-"dolls.museum\0mobi.na\0"
-"le.it\0lixil\0\xd0\xbc\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0\0"
-"alaheadju.no\0"
-"shirosato.ibaraki.jp\0"
-"mobi.ng\0"
-"sp.gov.br\0"
-"lebork.pl\0"
-"teva\0"
-"kawakita.ishikawa.jp\0"
-"experts-comptables.fr\0"
-"glass.museum\0"
-"skjerv\xc3\xb8y.no\0"
-"storage\0fedorapeople.org\0js.org\0"
-"lib.nj.us\0syno-ds.de\0"
-"9.bg\0"
-"itakura.gunma.jp\0imari.saga.jp\0"
-"lebesby.no\0il.us\0"
-"page\0"
-"channelsdvr.net\0"
-"correios-e-telecomunica\xc3\xa7\xc3\xb5""es.museum\0kherson.ua\0"
-"sch.ae\0philately.museum\0yorkshire.museum\0furniture\0"
-"myds.me\0"
-"kouyama.kagoshima.jp\0nat.tn\0"
-"tana.no\0no.eu.org\0navoi.su\0"
-"yuki.ibaraki.jp\0agrinet.tn\0norton\0"
-"mitane.akita.jp\0m\xc4\x81ori.nz\0"
-"ikano\0"
-"tara.saga.jp\0gotdns.ch\0"
-"fairwinds\0"
-"ck.ua\0"
-"\xe5\x8d\x83\xe8\x91\x89.jp\0"
-"takamori.nagano.jp\0tenri.nara.jp\0in-dsl.net\0"
-"kobierzyce.pl\0"
-"ebetsu.hokkaido.jp\0muroran.hokkaido.jp\0\xe6\x97\xb6\xe5\xb0\x9a\0"
-"oyer.no\0"
-"airline.aero\0"
-"cal.it\0"
-"military.museum\0"
-"fukui.fukui.jp\0"
-"bulsan.it\0so.gov.pl\0"
-"kyotamba.kyoto.jp\0sakuho.nagano.jp\0nanto.toyama.jp\0"
-"boutique\0"
-"higashiura.aichi.jp\0"
-"cloudns.info\0"
-"udine.it\0asaminami.hiroshima.jp\0"
-"gifu.gifu.jp\0"
-"globo\0""12hp.de\0"
-"aosta.it\0"
-"mobi\0"
-"suita.osaka.jp\0"
-"milano.it\0"
-"mobi.ke\0naumburg.museum\0\xe6\xb8\xb8\xe6\x88\x8f\0"
-"puglia.it\0"
-"meloy.no\0"
-"bio.br\0"
-"duck\0"
-"shonai.yamagata.jp\0adobeaemcloud.net\0"
-"\xe7\xa5\x9e\xe5\xa5\x88\xe5\xb7\x9d.jp\0"
-"\xe5\xa4\xa9\xe4\xb8\xbb\xe6\x95\x99\0"
-"marugame.kagawa.jp\0"
-"dominic.ua\0nexus\0"
-"sumita.iwate.jp\0"
-"nyc.museum\0"
-"shimofusa.chiba.jp\0"
-"cipriani\0moda\0"
-"maori.nz\0"
-"mulhouse.museum\0cpa.pro\0guide\0"
-"owariasahi.aichi.jp\0""12hp.at\0"
-"fukusaki.hyogo.jp\0asahi.ibaraki.jp\0"
-"abiko.chiba.jp\0naha.okinawa.jp\0"
-"asn.au\0xenapponazure.com\0"
-"matsushige.tokushima.jp\0"
-"coupon\0"
-"from-pa.com\0"
-"otake.hiroshima.jp\0"
-"recreation.aero\0"
-"tochigi.tochigi.jp\0dyndns.tv\0"
-"is-a-chef.org\0"
-"kamiichi.toyama.jp\0""12hp.ch\0"
-"sc.cn\0to.it\0"
-"homebuilt.aero\0rendalen.no\0"
-"artcenter.museum\0convent.museum\0nz.eu.org\0"
-"chieti.it\0"
-"holiday\0"
-"asso.fr\0"
-"tas.au\0"
-"okagaki.fukuoka.jp\0"
-"gamagori.aichi.jp\0"
-"togura.nagano.jp\0"
-"uchiko.ehime.jp\0"
-"tsuga.tochigi.jp\0"
-"asso.gp\0kawajima.saitama.jp\0"
-"mb.ca\0enterprisecloud.nu\0"
-"karuizawa.nagano.jp\0wakasa.tottori.jp\0"
-"nationalfirearms.museum\0"
-"nakasatsunai.hokkaido.jp\0utashinai.hokkaido.jp\0"
-"sch.id\0"
-"jevnaker.no\0kerryproperties\0"
-"kamiizumi.saitama.jp\0kai.yamanashi.jp\0"
-"tromsa.no\0serveexchange.com\0"
-"izumi.kagoshima.jp\0nobeoka.miyazaki.jp\0football\0"
-"dyndns.ws\0"
-"\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xae\0\xe7\xa7\xbb\xe5\x8a\xa8\0"
-"wellbeingzone.co.uk\0"
-"asso.ht\0kunimi.fukushima.jp\0amakusa.kumamoto.jp\0bungoono.oita.jp\0"
-"youtube\0"
-"sch.ir\0"
-"axis.museum\0sigdal.no\0"
-"tado.mie.jp\0"
-"repbody.aero\0siljan.no\0cable-modem.org\0"
-"education\0"
-"r\xc3\xb8mskog.no\0unusualperson.com\0"
-"sch.jo\0"
-"roan.no\0"
-"imperia.it\0"
-"b.bg\0webhop.me\0"
-"endofinternet.net\0"
-"cbre\0"
-"asso.bj\0"
-"newholland\0weatherchannel\0"
-"paris.museum\0"
-"homeunix.net\0"
-"barsy.me\0"
-"b.br\0obu.aichi.jp\0yamanobe.yamagata.jp\0"
-"fnd.br\0\xe6\xa0\x83\xe6\x9c\xa8.jp\0"
-"oumu.hokkaido.jp\0"
-"asso.ci\0is-a-chef.com\0"
-"taiki.mie.jp\0"
-"servehalflife.com\0"
-"hichiso.gifu.jp\0"
-"lesja.no\0freeddns.us\0"
-"ulsan.kr\0"
-"sch.lk\0"
-"avellino.it\0"
-"pars\0"
-"campidano-medio.it\0munakata.fukuoka.jp\0"
-"moriyoshi.akita.jp\0kashiba.nara.jp\0"
-"publishproxy.com\0"
-"sr.gov.pl\0"
-"sch.ly\0house\0suzuki\0servehumour.com\0"
-"cc.id.us\0"
-"chirurgiens-dentistes.fr\0budapest\0"
-"cya.gg\0"
-"jewish.museum\0somna.no\0"
-"miyota.nagano.jp\0fedex\0yandex\0"
-"asso.dz\0iwakuni.yamaguchi.jp\0"
-"sch.ng\0royrvik.no\0dvrdns.org\0"
-"bl.it\0"
-"askim.no\0penza.su\0"
-"sc.ke\0is-a-student.com\0"
-"hamura.tokyo.jp\0"
-"total\0"
-"kharkov.ua\0"
-"lcube-server.de\0"
-"hirono.iwate.jp\0"
-"s3-website.eu-west-3.amazonaws.com\0"
-"sc.kr\0"
-"*.kitakyushu.jp\0\xe8\xaf\xba\xe5\x9f\xba\xe4\xba\x9a\0"
-"zp.ua\0lib.de.us\0"
-"agriculture.museum\0"
-"vegarshei.no\0"
-"mb.it\0"
-"lahppi.no\0isa.us\0"
-"kawahara.tottori.jp\0"
-"trentino-s\xc3\xbc""d-tirol.it\0nago.okinawa.jp\0asaka.saitama.jp\0"
-"komatsu.ishikawa.jp\0kolobrzeg.pl\0"
-"economia.bo\0d\xc3\xb8nna.no\0s3-website.ca-central-1.amazonaws.com\0"
-"sc.ls\0"
-"hm.no\0"
-"far.br\0yamada.iwate.jp\0rns.tn\0"
-"sch.qa\0swiss\0"
-"komae.tokyo.jp\0"
-"portlligat.museum\0boldlygoingnowhere.org\0ddnss.org\0synology.me\0"
-"yonago.tottori.jp\0asn.lv\0"
-"lib.mo.us\0"
-"trentinos\xc3\xbc""d-tirol.it\0"
-"saga.jp\0"
-"kanagawa.jp\0shiraoi.hokkaido.jp\0seven\0"
-"koeln.museum\0photography.museum\0cc.mi.us\0"
-"filatelia.museum\0lodingen.no\0"
-"yamato.kumamoto.jp\0"
-"voss.no\0"
-"kyotanabe.kyoto.jp\0"
-"rio.br\0pisa.it\0akune.kagoshima.jp\0"
-"exchange\0"
-"trentino-alto-adige.it\0"
-"sor-odal.no\0dvag\0"
-"ube.yamaguchi.jp\0"
-"bss.design\0"
-"sandefjord.no\0"
-"sch.sa\0ownprovider.com\0"
-"read\0"
-"sk\xc3\xa5nland.no\0"
-"ug.gov.pl\0"
-"lugansk.ua\0"
-"dnepropetrovsk.ua\0"
-"veterinaire.km\0kautokeino.no\0"
-"sch.so\0"
-"shari.hokkaido.jp\0"
-"engerdal.no\0"
-"omasvuotna.no\0barsy.uk\0"
-"taketomi.okinawa.jp\0nishinoshima.shimane.jp\0"
-"mad.museum\0aaa\0"
-"s3.dualstack.ap-northeast-2.amazonaws.com\0likes-pie.com\0"
-"\xed\x95\x9c\xea\xb5\xad\0"
-"\xe5\xb1\xb1\xe5\xbd\xa2.jp\0toshima.tokyo.jp\0"
-};
-
-static const quint16 tldChunkCount = 2;
-static const quint32 tldChunks[] = {65532, 103868};
-
-QT_END_NAMESPACE
-
-#endif // QURLTLD_P_H
diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp
index d88960ba0c..3bc3b546da 100644
--- a/src/corelib/itemmodels/qabstractitemmodel.cpp
+++ b/src/corelib/itemmodels/qabstractitemmodel.cpp
@@ -46,7 +46,9 @@
#include <qdebug.h>
#include <qvector.h>
#include <qregexp.h>
-#include <qregularexpression.h>
+#if QT_CONFIG(regularexpression)
+# include <qregularexpression.h>
+#endif
#include <qstack.h>
#include <qbitarray.h>
#include <qdatetime.h>
@@ -63,7 +65,7 @@ QPersistentModelIndexData *QPersistentModelIndexData::create(const QModelIndex &
Q_ASSERT(index.isValid()); // we will _never_ insert an invalid index in the list
QPersistentModelIndexData *d = nullptr;
QAbstractItemModel *model = const_cast<QAbstractItemModel *>(index.model());
- QHash<QModelIndex, QPersistentModelIndexData *> &indexes = model->d_func()->persistent.indexes;
+ QMultiHash<QModelIndex, QPersistentModelIndexData *> &indexes = model->d_func()->persistent.indexes;
const auto it = indexes.constFind(index);
if (it != indexes.cend()) {
d = (*it);
@@ -665,8 +667,7 @@ void QAbstractItemModelPrivate::rowsAboutToBeInserted(const QModelIndex &parent,
Q_UNUSED(last);
QVector<QPersistentModelIndexData *> persistent_moved;
if (first < q->rowCount(parent)) {
- for (QHash<QModelIndex, QPersistentModelIndexData *>::const_iterator it = persistent.indexes.constBegin();
- it != persistent.indexes.constEnd(); ++it) {
+ for (auto it = persistent.indexes.constBegin(); it != persistent.indexes.constEnd(); ++it) {
QPersistentModelIndexData *data = *it;
const QModelIndex &index = data->index;
if (index.row() >= first && index.isValid() && index.parent() == parent) {
@@ -702,14 +703,13 @@ void QAbstractItemModelPrivate::itemsAboutToBeMoved(const QModelIndex &srcParent
QVector<QPersistentModelIndexData *> persistent_moved_in_source;
QVector<QPersistentModelIndexData *> persistent_moved_in_destination;
- QHash<QModelIndex, QPersistentModelIndexData *>::const_iterator it;
- const QHash<QModelIndex, QPersistentModelIndexData *>::const_iterator begin = persistent.indexes.constBegin();
- const QHash<QModelIndex, QPersistentModelIndexData *>::const_iterator end = persistent.indexes.constEnd();
+ const auto begin = persistent.indexes.constBegin();
+ const auto end = persistent.indexes.constEnd();
const bool sameParent = (srcParent == destinationParent);
const bool movingUp = (srcFirst > destinationChild);
- for ( it = begin; it != end; ++it) {
+ for (auto it = begin; it != end; ++it) {
QPersistentModelIndexData *data = *it;
const QModelIndex &index = data->index;
const QModelIndex &parent = index.parent();
@@ -814,8 +814,7 @@ void QAbstractItemModelPrivate::rowsAboutToBeRemoved(const QModelIndex &parent,
QVector<QPersistentModelIndexData *> persistent_invalidated;
// find the persistent indexes that are affected by the change, either by being in the removed subtree
// or by being on the same level and below the removed rows
- for (QHash<QModelIndex, QPersistentModelIndexData *>::const_iterator it = persistent.indexes.constBegin();
- it != persistent.indexes.constEnd(); ++it) {
+ for (auto it = persistent.indexes.constBegin(); it != persistent.indexes.constEnd(); ++it) {
QPersistentModelIndexData *data = *it;
bool level_changed = false;
QModelIndex current = data->index;
@@ -858,7 +857,9 @@ void QAbstractItemModelPrivate::rowsRemoved(const QModelIndex &parent,
for (QVector<QPersistentModelIndexData *>::const_iterator it = persistent_invalidated.constBegin();
it != persistent_invalidated.constEnd(); ++it) {
QPersistentModelIndexData *data = *it;
- persistent.indexes.erase(persistent.indexes.constFind(data->index));
+ auto pit = persistent.indexes.constFind(data->index);
+ if (pit != persistent.indexes.cend())
+ persistent.indexes.erase(pit);
data->index = QModelIndex();
}
}
@@ -870,8 +871,7 @@ void QAbstractItemModelPrivate::columnsAboutToBeInserted(const QModelIndex &pare
Q_UNUSED(last);
QVector<QPersistentModelIndexData *> persistent_moved;
if (first < q->columnCount(parent)) {
- for (QHash<QModelIndex, QPersistentModelIndexData *>::const_iterator it = persistent.indexes.constBegin();
- it != persistent.indexes.constEnd(); ++it) {
+ for (auto it = persistent.indexes.constBegin(); it != persistent.indexes.constEnd(); ++it) {
QPersistentModelIndexData *data = *it;
const QModelIndex &index = data->index;
if (index.column() >= first && index.isValid() && index.parent() == parent)
@@ -907,8 +907,7 @@ void QAbstractItemModelPrivate::columnsAboutToBeRemoved(const QModelIndex &paren
QVector<QPersistentModelIndexData *> persistent_invalidated;
// find the persistent indexes that are affected by the change, either by being in the removed subtree
// or by being on the same level and to the right of the removed columns
- for (QHash<QModelIndex, QPersistentModelIndexData *>::const_iterator it = persistent.indexes.constBegin();
- it != persistent.indexes.constEnd(); ++it) {
+ for (auto it = persistent.indexes.constBegin(); it != persistent.indexes.constEnd(); ++it) {
QPersistentModelIndexData *data = *it;
bool level_changed = false;
QModelIndex current = data->index;
@@ -952,7 +951,9 @@ void QAbstractItemModelPrivate::columnsRemoved(const QModelIndex &parent,
for (QVector<QPersistentModelIndexData *>::const_iterator it = persistent_invalidated.constBegin();
it != persistent_invalidated.constEnd(); ++it) {
QPersistentModelIndexData *data = *it;
- persistent.indexes.erase(persistent.indexes.constFind(data->index));
+ auto index = persistent.indexes.constFind(data->index);
+ if (index != persistent.indexes.constEnd())
+ persistent.indexes.erase(index);
data->index = QModelIndex();
}
}
@@ -2362,7 +2363,9 @@ QModelIndexList QAbstractItemModel::match(const QModelIndex &start, int role,
bool wrap = flags & Qt::MatchWrap;
bool allHits = (hits == -1);
QString text; // only convert to a string if it is needed
+#if QT_CONFIG(regularexpression)
QRegularExpression rx; // only create it if needed
+#endif
const int column = start.column();
QModelIndex p = parent(start);
int from = start.row();
@@ -2380,6 +2383,7 @@ QModelIndexList QAbstractItemModel::match(const QModelIndex &start, int role,
if (value == v)
result.append(idx);
} else { // QString or regular expression based matching
+#if QT_CONFIG(regularexpression)
if (matchType == Qt::MatchRegularExpression) {
if (rx.pattern().isEmpty()) {
if (value.userType() == QMetaType::QRegularExpression) {
@@ -2395,25 +2399,23 @@ QModelIndexList QAbstractItemModel::match(const QModelIndex &start, int role,
rx.setPattern(QRegularExpression::wildcardToRegularExpression(value.toString()));
if (cs == Qt::CaseInsensitive)
rx.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
- } else {
+ } else
+#endif
+ {
if (text.isEmpty()) // lazy conversion
text = value.toString();
}
QString t = v.toString();
switch (matchType) {
-#if QT_DEPRECATED_SINCE(5, 15)
- case Qt::MatchRegExp:
- if (QRegExp(text, cs).exactMatch(t))
- result.append(idx);
- break;
-#endif
+#if QT_CONFIG(regularexpression)
case Qt::MatchRegularExpression:
Q_FALLTHROUGH();
case Qt::MatchWildcard:
if (t.contains(rx))
result.append(idx);
break;
+#endif
case Qt::MatchStartsWith:
if (t.startsWith(text, cs))
result.append(idx);
@@ -3297,7 +3299,11 @@ void QAbstractItemModel::endResetModel()
{
Q_D(QAbstractItemModel);
d->invalidatePersistentIndexes();
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ resetInternalData();
+#else
QMetaObject::invokeMethod(this, "resetInternalData");
+#endif
emit modelReset(QPrivateSignal());
}
@@ -3375,8 +3381,7 @@ QModelIndexList QAbstractItemModel::persistentIndexList() const
Q_D(const QAbstractItemModel);
QModelIndexList result;
result.reserve(d->persistent.indexes.count());
- for (QHash<QModelIndex, QPersistentModelIndexData *>::const_iterator it = d->persistent.indexes.constBegin();
- it != d->persistent.indexes.constEnd(); ++it) {
+ for (auto it = d->persistent.indexes.constBegin(); it != d->persistent.indexes.constEnd(); ++it) {
QPersistentModelIndexData *data = *it;
result.append(data->index);
}
@@ -3973,7 +3978,7 @@ bool QAbstractListModel::dropMimeData(const QMimeData *data, Qt::DropAction acti
*/
/*!
- \fn uint qHash(const QPersistentModelIndex &index, uint seed = 0)
+ \fn size_t qHash(const QPersistentModelIndex &index, size_t seed = 0)
\since 5.0
\relates QPersistentModelIndex
@@ -3994,8 +3999,8 @@ bool QAbstractListModel::dropMimeData(const QMimeData *data, Qt::DropAction acti
*/
void QAbstractItemModelPrivate::Persistent::insertMultiAtEnd(const QModelIndex& key, QPersistentModelIndexData *data)
{
- QHash<QModelIndex,QPersistentModelIndexData *>::iterator newIt = indexes.insert(key, data);
- QHash<QModelIndex,QPersistentModelIndexData *>::iterator it = newIt;
+ auto newIt = indexes.insert(key, data);
+ auto it = newIt;
++it;
while (it != indexes.end() && it.key() == key) {
qSwap(*newIt,*it);
diff --git a/src/corelib/itemmodels/qabstractitemmodel.h b/src/corelib/itemmodels/qabstractitemmodel.h
index 43649cf79b..86ff361ccb 100644
--- a/src/corelib/itemmodels/qabstractitemmodel.h
+++ b/src/corelib/itemmodels/qabstractitemmodel.h
@@ -103,7 +103,7 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QModelIndex &);
class QPersistentModelIndexData;
// qHash is a friend, but we can't use default arguments for friends (§8.3.6.4)
-uint qHash(const QPersistentModelIndex &index, uint seed = 0) noexcept;
+size_t qHash(const QPersistentModelIndex &index, size_t seed = 0) noexcept;
class Q_CORE_EXPORT QPersistentModelIndex
{
@@ -141,14 +141,14 @@ public:
bool isValid() const;
private:
QPersistentModelIndexData *d;
- friend uint qHash(const QPersistentModelIndex &, uint seed) noexcept;
+ friend size_t qHash(const QPersistentModelIndex &, size_t seed) noexcept;
#ifndef QT_NO_DEBUG_STREAM
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QPersistentModelIndex &);
#endif
};
Q_DECLARE_SHARED(QPersistentModelIndex)
-inline uint qHash(const QPersistentModelIndex &index, uint seed) noexcept
+inline size_t qHash(const QPersistentModelIndex &index, size_t seed) noexcept
{ return qHash(index.d, seed); }
@@ -156,7 +156,6 @@ inline uint qHash(const QPersistentModelIndex &index, uint seed) noexcept
Q_CORE_EXPORT QDebug operator<<(QDebug, const QPersistentModelIndex &);
#endif
-template<typename T> class QList;
typedef QList<QModelIndex> QModelIndexList;
class QMimeData;
@@ -462,8 +461,8 @@ inline QVariant QModelIndex::data(int arole) const
inline Qt::ItemFlags QModelIndex::flags() const
{ return m ? m->flags(*this) : Qt::ItemFlags(); }
-inline uint qHash(const QModelIndex &index) noexcept
-{ return uint((uint(index.row()) << 4) + index.column() + index.internalId()); }
+inline size_t qHash(const QModelIndex &index, size_t seed) noexcept
+{ return size_t((size_t(index.row()) << 4) + size_t(index.column()) + index.internalId()) ^ seed; }
QT_END_NAMESPACE
diff --git a/src/corelib/itemmodels/qabstractproxymodel.h b/src/corelib/itemmodels/qabstractproxymodel.h
index c9a73b6a31..f6f6e45c1a 100644
--- a/src/corelib/itemmodels/qabstractproxymodel.h
+++ b/src/corelib/itemmodels/qabstractproxymodel.h
@@ -103,7 +103,11 @@ Q_SIGNALS:
void sourceModelChanged(QPrivateSignal);
protected Q_SLOTS:
- void resetInternalData();
+ void resetInternalData()
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ override
+#endif
+ ;
protected:
QAbstractProxyModel(QAbstractProxyModelPrivate &, QObject *parent);
diff --git a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp
index a2597faa93..0e29714677 100644
--- a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp
+++ b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp
@@ -642,7 +642,7 @@ void QConcatenateTablesProxyModelPrivate::_q_slotSourceLayoutAboutToBeChanged(co
layoutChangePersistentIndexes.reserve(persistentIndexList.size());
layoutChangeProxyIndexes.reserve(persistentIndexList.size());
- for (const QPersistentModelIndex &proxyPersistentIndex : persistentIndexList) {
+ for (const QModelIndex &proxyPersistentIndex : persistentIndexList) {
layoutChangeProxyIndexes.append(proxyPersistentIndex);
Q_ASSERT(proxyPersistentIndex.isValid());
const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
diff --git a/src/corelib/itemmodels/qidentityproxymodel.cpp b/src/corelib/itemmodels/qidentityproxymodel.cpp
index f5684c6eda..8210e27f8a 100644
--- a/src/corelib/itemmodels/qidentityproxymodel.cpp
+++ b/src/corelib/itemmodels/qidentityproxymodel.cpp
@@ -532,7 +532,7 @@ void QIdentityProxyModelPrivate::_q_sourceLayoutAboutToBeChanged(const QList<QPe
emit q->layoutAboutToBeChanged(parents, hint);
const auto proxyPersistentIndexes = q->persistentIndexList();
- for (const QPersistentModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
+ for (const QModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
proxyIndexes << proxyPersistentIndex;
Q_ASSERT(proxyPersistentIndex.isValid());
const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
diff --git a/src/corelib/itemmodels/qitemselectionmodel.h b/src/corelib/itemmodels/qitemselectionmodel.h
index 5820695592..a1badc7693 100644
--- a/src/corelib/itemmodels/qitemselectionmodel.h
+++ b/src/corelib/itemmodels/qitemselectionmodel.h
@@ -223,9 +223,6 @@ private:
Q_DECLARE_OPERATORS_FOR_FLAGS(QItemSelectionModel::SelectionFlags)
-// dummy implentation of qHash() necessary for instantiating QList<QItemSelectionRange>::toSet() with MSVC
-inline uint qHash(const QItemSelectionRange &) { return 0; }
-
#ifdef Q_CC_MSVC
/*
@@ -241,7 +238,7 @@ inline uint qHash(const QItemSelectionRange &) { return 0; }
# define Q_TEMPLATE_EXTERN extern
# endif
# endif
-Q_TEMPLATE_EXTERN template class Q_CORE_EXPORT QList<QItemSelectionRange>;
+Q_TEMPLATE_EXTERN template class Q_CORE_EXPORT QVector<QItemSelectionRange>;
#endif // Q_CC_MSVC
class Q_CORE_EXPORT QItemSelection : public QList<QItemSelectionRange>
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
index 4f5593e0a0..79a9875073 100644
--- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp
+++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
@@ -142,145 +142,24 @@ private:
int end;
};
-class RegularExpressionData {
-
-private:
- enum class ExpressionType {
- RegExp,
-#if QT_CONFIG(regularexpression)
- RegularExpression
-#endif
- };
-
-public:
- RegularExpressionData() :
- m_type(ExpressionType::RegExp)
- {}
-
-#if QT_CONFIG(regularexpression)
- QRegularExpression regularExpression() const
- {
- if (m_type == ExpressionType::RegularExpression)
- return m_regularExpression;
- return QRegularExpression();
- }
-
- void setRegularExpression(const QRegularExpression &rx)
- {
- m_type = ExpressionType::RegularExpression;
- m_regularExpression = rx;
- m_regExp = QRegExp();
- }
-#endif
-
- QRegExp regExp() const
- {
- if (m_type == ExpressionType::RegExp)
- return m_regExp;
- return QRegExp();
- }
-
- void setRegExp(const QRegExp &rx)
- {
- m_type = ExpressionType::RegExp;
- m_regExp = rx;
-#if QT_CONFIG(regularexpression)
- m_regularExpression = QRegularExpression();
-#endif
-
- }
-
- bool isEmpty() const
- {
- bool result = true;
- switch (m_type) {
- case ExpressionType::RegExp:
- result = m_regExp.isEmpty();
- break;
-#if QT_CONFIG(regularexpression)
- case ExpressionType::RegularExpression:
- result = m_regularExpression.pattern().isEmpty();
- break;
-#endif
- }
- return result;
- }
-
- Qt::CaseSensitivity caseSensitivity() const
- {
- Qt::CaseSensitivity sensitivity = Qt::CaseInsensitive;
- switch (m_type) {
- case ExpressionType::RegExp:
- sensitivity = m_regExp.caseSensitivity();
- break;
-#if QT_CONFIG(regularexpression)
- case ExpressionType::RegularExpression:
- {
- QRegularExpression::PatternOptions options = m_regularExpression.patternOptions();
- if (!(options & QRegularExpression::CaseInsensitiveOption))
- sensitivity = Qt::CaseSensitive;
- }
- break;
-#endif
- }
- return sensitivity;
- }
-
- void setCaseSensitivity(Qt::CaseSensitivity cs)
- {
- switch (m_type) {
- case ExpressionType::RegExp:
- m_regExp.setCaseSensitivity(cs);
- break;
-#if QT_CONFIG(regularexpression)
- case ExpressionType::RegularExpression:
- {
- QRegularExpression::PatternOptions options = m_regularExpression.patternOptions();
- options.setFlag(QRegularExpression::CaseInsensitiveOption, cs == Qt::CaseSensitive);
- m_regularExpression.setPatternOptions(options);
- }
- break;
-#endif
- }
- }
-
- bool hasMatch(const QString &str) const
- {
- bool result = false;
- switch (m_type) {
- case ExpressionType::RegExp:
- result = str.contains(m_regExp);
- break;
-#if QT_CONFIG(regularexpression)
- case ExpressionType::RegularExpression:
- result = str.contains(m_regularExpression);
- break;
-#endif
- }
- return result;
- }
-
-private:
- ExpressionType m_type;
- QRegExp m_regExp;
-#if QT_CONFIG(regularexpression)
- QRegularExpression m_regularExpression;
-#endif
-};
-
-
class QSortFilterProxyModelPrivate : public QAbstractProxyModelPrivate
{
Q_DECLARE_PUBLIC(QSortFilterProxyModel)
public:
+ enum class Direction {
+ Rows = 1,
+ Columns = 2,
+ All = Rows | Columns
+ };
+
struct Mapping {
QVector<int> source_rows;
QVector<int> source_columns;
QVector<int> proxy_rows;
QVector<int> proxy_columns;
QVector<QModelIndex> mapped_children;
- QHash<QModelIndex, Mapping *>::const_iterator map_iter;
+ QModelIndex source_parent;
};
mutable QHash<QModelIndex, Mapping*> source_index_mapping;
@@ -294,7 +173,7 @@ public:
int filter_column;
int filter_role;
- RegularExpressionData filter_data;
+ QRegularExpression filter_data;
QModelIndex last_top_source;
bool filter_recursive;
@@ -321,7 +200,7 @@ public:
const void *p = proxy_index.internalPointer();
Q_ASSERT(p);
QHash<QModelIndex, Mapping *>::const_iterator it =
- static_cast<const Mapping*>(p)->map_iter;
+ source_index_mapping.constFind(static_cast<const Mapping*>(p)->source_parent);
Q_ASSERT(it != source_index_mapping.constEnd());
Q_ASSERT(it.value());
return it;
@@ -397,8 +276,8 @@ public:
QVector<int> &source_to_proxy, QVector<int> &proxy_to_source,
int proxy_start, int proxy_end, const QModelIndex &proxy_parent,
Qt::Orientation orient, bool emit_signal = true);
- void build_source_to_proxy_mapping(
- const QVector<int> &proxy_to_source, QVector<int> &source_to_proxy) const;
+ static inline void build_source_to_proxy_mapping(
+ const QVector<int> &proxy_to_source, QVector<int> &source_to_proxy, int start = 0);
void source_items_inserted(const QModelIndex &source_parent,
int start, int end, Qt::Orientation orient);
void source_items_about_to_be_removed(const QModelIndex &source_parent,
@@ -413,7 +292,7 @@ public:
void update_persistent_indexes(const QModelIndexPairList &source_indexes);
void filter_about_to_be_changed(const QModelIndex &source_parent = QModelIndex());
- void filter_changed(const QModelIndex &source_parent = QModelIndex());
+ void filter_changed(Direction dir, const QModelIndex &source_parent = QModelIndex());
QSet<int> handle_filter_changed(
QVector<int> &source_to_proxy, QVector<int> &proxy_to_source,
const QModelIndex &source_parent, Qt::Orientation orient);
@@ -431,6 +310,11 @@ public:
typedef QHash<QModelIndex, QSortFilterProxyModelPrivate::Mapping *> IndexMap;
+static bool operator&(QSortFilterProxyModelPrivate::Direction a, QSortFilterProxyModelPrivate::Direction b)
+{
+ return int(a) & int(b);
+}
+
void QSortFilterProxyModelPrivate::_q_sourceModelDestroyed()
{
QAbstractProxyModelPrivate::_q_sourceModelDestroyed();
@@ -517,8 +401,7 @@ IndexMap::const_iterator QSortFilterProxyModelPrivate::create_mapping(
m->proxy_columns.resize(source_cols);
build_source_to_proxy_mapping(m->source_columns, m->proxy_columns);
- it = IndexMap::const_iterator(source_index_mapping.insert(source_parent, m));
- m->map_iter = it;
+ m->source_parent = source_parent;
if (source_parent.isValid()) {
QModelIndex source_grand_parent = source_parent.parent();
@@ -527,6 +410,7 @@ IndexMap::const_iterator QSortFilterProxyModelPrivate::create_mapping(
it2.value()->mapped_children.append(source_parent);
}
+ it = IndexMap::const_iterator(source_index_mapping.insert(source_parent, m));
Q_ASSERT(it != source_index_mapping.constEnd());
Q_ASSERT(it.value());
@@ -787,9 +671,11 @@ void QSortFilterProxyModelPrivate::remove_proxy_interval(
}
// Remove items from proxy-to-source mapping
+ for (int i = proxy_start; i <= proxy_end; ++i)
+ source_to_proxy[proxy_to_source.at(i)] = -1;
proxy_to_source.remove(proxy_start, proxy_end - proxy_start + 1);
- build_source_to_proxy_mapping(proxy_to_source, source_to_proxy);
+ build_source_to_proxy_mapping(proxy_to_source, source_to_proxy, proxy_start);
if (emit_signal) {
if (orient == Qt::Vertical)
@@ -915,7 +801,7 @@ void QSortFilterProxyModelPrivate::insert_source_items(
for (int i = 0; i < source_items.size(); ++i)
proxy_to_source.insert(proxy_start + i, source_items.at(i));
- build_source_to_proxy_mapping(proxy_to_source, source_to_proxy);
+ build_source_to_proxy_mapping(proxy_to_source, source_to_proxy, proxy_start);
if (emit_signal) {
if (orient == Qt::Vertical)
@@ -1169,7 +1055,8 @@ void QSortFilterProxyModelPrivate::updateChildrenMapping(const QModelIndex &sour
// reinsert moved, mapped indexes
QVector<QPair<QModelIndex, Mapping*> >::iterator it = moved_source_index_mappings.begin();
for (; it != moved_source_index_mappings.end(); ++it) {
- (*it).second->map_iter = QHash<QModelIndex, Mapping *>::const_iterator(source_index_mapping.insert((*it).first, (*it).second));
+ it->second->source_parent = it->first;
+ source_index_mapping.insert(it->first, it->second);
}
}
@@ -1196,11 +1083,12 @@ void QSortFilterProxyModelPrivate::proxy_item_range(
\internal
*/
void QSortFilterProxyModelPrivate::build_source_to_proxy_mapping(
- const QVector<int> &proxy_to_source, QVector<int> &source_to_proxy) const
+ const QVector<int> &proxy_to_source, QVector<int> &source_to_proxy, int start)
{
- source_to_proxy.fill(-1);
- int proxy_count = proxy_to_source.size();
- for (int i = 0; i < proxy_count; ++i)
+ if (start == 0)
+ source_to_proxy.fill(-1);
+ const int proxy_count = proxy_to_source.size();
+ for (int i = start; i < proxy_count; ++i)
source_to_proxy[proxy_to_source.at(i)] = i;
}
@@ -1256,7 +1144,7 @@ void QSortFilterProxyModelPrivate::update_persistent_indexes(
*/
void QSortFilterProxyModelPrivate::filter_about_to_be_changed(const QModelIndex &source_parent)
{
- if (!filter_data.isEmpty() &&
+ if (!filter_data.pattern().isEmpty() &&
source_index_mapping.constFind(source_parent) == source_index_mapping.constEnd())
create_mapping(source_parent);
}
@@ -1268,14 +1156,14 @@ void QSortFilterProxyModelPrivate::filter_about_to_be_changed(const QModelIndex
Updates the proxy model (adds/removes rows) based on the
new filter.
*/
-void QSortFilterProxyModelPrivate::filter_changed(const QModelIndex &source_parent)
+void QSortFilterProxyModelPrivate::filter_changed(Direction dir, const QModelIndex &source_parent)
{
IndexMap::const_iterator it = source_index_mapping.constFind(source_parent);
if (it == source_index_mapping.constEnd())
return;
Mapping *m = it.value();
- QSet<int> rows_removed = handle_filter_changed(m->proxy_rows, m->source_rows, source_parent, Qt::Vertical);
- QSet<int> columns_removed = handle_filter_changed(m->proxy_columns, m->source_columns, source_parent, Qt::Horizontal);
+ const QSet<int> rows_removed = (dir & Direction::Rows) ? handle_filter_changed(m->proxy_rows, m->source_rows, source_parent, Qt::Vertical) : QSet<int>();
+ const QSet<int> columns_removed = (dir & Direction::Columns) ? handle_filter_changed(m->proxy_columns, m->source_columns, source_parent, Qt::Horizontal) : QSet<int>();
// We need to iterate over a copy of m->mapped_children because otherwise it may be changed by other code, invalidating
// the iterator it2.
@@ -1289,7 +1177,7 @@ void QSortFilterProxyModelPrivate::filter_changed(const QModelIndex &source_pare
indexesToRemove.push_back(i);
remove_from_mapping(source_child_index);
} else {
- filter_changed(source_child_index);
+ filter_changed(dir, source_child_index);
}
}
QVector<int>::const_iterator removeIt = indexesToRemove.constEnd();
@@ -1919,9 +1807,9 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsMoved(
\section1 Filtering
In addition to sorting, QSortFilterProxyModel can be used to hide items
- that do not match a certain filter. The filter is specified using a QRegExp
+ that do not match a certain filter. The filter is specified using a QRegularExpression
object and is applied to the filterRole() (Qt::DisplayRole by default) of
- each item, for a given column. The QRegExp object can be used to match a
+ each item, for a given column. The QRegularExpression object can be used to match a
regular expression, a wildcard pattern, or a fixed string. For example:
\snippet qsortfilterproxymodel-details/main.cpp 5
@@ -1970,21 +1858,6 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsMoved(
\note Some general guidelines for subclassing models are available in the
\l{Model Subclassing Reference}.
- \note With Qt 5, regular expression support has been improved through the
- QRegularExpression class. QSortFilterProxyModel dating back prior to that
- class creation, it originally supported only QRegExp. Since Qt 5.12,
- QRegularExpression APIs have been added. Therefore, QRegExp APIs should be
- considered deprecated and the QRegularExpression version should be used in
- place.
-
- \warning Don't mix calls to the getters and setters of different regexp types
- as this will lead to unexpected results. For maximum compatibility, the original
- implementation has been kept. Therefore, if, for example, a call to
- setFilterRegularExpression is made followed by another one to
- setFilterFixedString, the first call will setup a QRegularExpression object
- to use as filter while the second will setup a QRegExp in FixedString mode.
- However, this is an implementation detail that might change in the future.
-
\sa QAbstractProxyModel, QAbstractItemModel, {Model/View Programming},
{Basic Sort/Filter Model Example}, {Custom Sort/Filter Model Example}, QIdentityProxyModel
*/
@@ -2580,33 +2453,6 @@ Qt::SortOrder QSortFilterProxyModel::sortOrder() const
return d->sort_order;
}
-/*!
- \property QSortFilterProxyModel::filterRegExp
- \brief the QRegExp used to filter the contents of the source model
-
- Setting this property overwrites the current
- \l{QSortFilterProxyModel::filterCaseSensitivity}{filterCaseSensitivity}.
- By default, the QRegExp is an empty string matching all contents.
-
- If no QRegExp or an empty string is set, everything in the source model
- will be accepted.
-
- \sa filterCaseSensitivity, setFilterWildcard(), setFilterFixedString()
-*/
-QRegExp QSortFilterProxyModel::filterRegExp() const
-{
- Q_D(const QSortFilterProxyModel);
- return d->filter_data.regExp();
-}
-
-void QSortFilterProxyModel::setFilterRegExp(const QRegExp &regExp)
-{
- Q_D(QSortFilterProxyModel);
- d->filter_about_to_be_changed();
- d->filter_data.setRegExp(regExp);
- d->filter_changed();
-}
-
#if QT_CONFIG(regularexpression)
/*!
\since 5.12
@@ -2625,15 +2471,15 @@ void QSortFilterProxyModel::setFilterRegExp(const QRegExp &regExp)
QRegularExpression QSortFilterProxyModel::filterRegularExpression() const
{
Q_D(const QSortFilterProxyModel);
- return d->filter_data.regularExpression();
+ return d->filter_data;
}
void QSortFilterProxyModel::setFilterRegularExpression(const QRegularExpression &regularExpression)
{
Q_D(QSortFilterProxyModel);
d->filter_about_to_be_changed();
- d->filter_data.setRegularExpression(regularExpression);
- d->filter_changed();
+ d->filter_data = regularExpression;
+ d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
}
#endif
@@ -2656,18 +2502,18 @@ void QSortFilterProxyModel::setFilterKeyColumn(int column)
Q_D(QSortFilterProxyModel);
d->filter_about_to_be_changed();
d->filter_column = column;
- d->filter_changed();
+ d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
}
/*!
\property QSortFilterProxyModel::filterCaseSensitivity
- \brief the case sensitivity of the QRegExp pattern used to filter the
+ \brief the case sensitivity of the QRegularExpression pattern used to filter the
contents of the source model.
By default, the filter is case sensitive.
- \sa filterRegExp, sortCaseSensitivity
+ \sa filterRegularExpression, sortCaseSensitivity
*/
/*!
@@ -2679,17 +2525,21 @@ void QSortFilterProxyModel::setFilterKeyColumn(int column)
Qt::CaseSensitivity QSortFilterProxyModel::filterCaseSensitivity() const
{
Q_D(const QSortFilterProxyModel);
- return d->filter_data.caseSensitivity();
+ return d->filter_data.patternOptions() & QRegularExpression::CaseInsensitiveOption ?
+ Qt::CaseInsensitive : Qt::CaseSensitive;
}
void QSortFilterProxyModel::setFilterCaseSensitivity(Qt::CaseSensitivity cs)
{
Q_D(QSortFilterProxyModel);
- if (cs == d->filter_data.caseSensitivity())
+ QRegularExpression::PatternOptions o = QRegularExpression::NoPatternOption;
+ if (cs == Qt::CaseInsensitive)
+ o = QRegularExpression::CaseInsensitiveOption;
+ if (o == d->filter_data.patternOptions())
return;
d->filter_about_to_be_changed();
- d->filter_data.setCaseSensitivity(cs);
- d->filter_changed();
+ d->filter_data.setPatternOptions(o);
+ d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
emit filterCaseSensitivityChanged(cs);
}
@@ -2759,24 +2609,6 @@ void QSortFilterProxyModel::setSortLocaleAware(bool on)
emit sortLocaleAwareChanged(on);
}
-/*!
- \overload
-
- Sets the regular expression used to filter the contents
- of the source model to \a pattern.
-
- \sa setFilterCaseSensitivity(), setFilterWildcard(), setFilterFixedString(), filterRegExp()
-*/
-void QSortFilterProxyModel::setFilterRegExp(const QString &pattern)
-{
- Q_D(QSortFilterProxyModel);
- d->filter_about_to_be_changed();
- QRegExp rx(pattern);
- rx.setCaseSensitivity(d->filter_data.caseSensitivity());
- d->filter_data.setRegExp(rx);
- d->filter_changed();
-}
-
#if QT_CONFIG(regularexpression)
/*!
\since 5.12
@@ -2794,8 +2626,8 @@ void QSortFilterProxyModel::setFilterRegularExpression(const QString &pattern)
Q_D(QSortFilterProxyModel);
d->filter_about_to_be_changed();
QRegularExpression rx(pattern);
- d->filter_data.setRegularExpression(rx);
- d->filter_changed();
+ d->filter_data.setPattern(pattern);
+ d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
}
#endif
@@ -2803,30 +2635,29 @@ void QSortFilterProxyModel::setFilterRegularExpression(const QString &pattern)
Sets the wildcard expression used to filter the contents
of the source model to the given \a pattern.
- \sa setFilterCaseSensitivity(), setFilterRegExp(), setFilterFixedString(), filterRegExp()
+ \sa setFilterCaseSensitivity(), setFilterRegularExpression(), setFilterFixedString(), filterRegularExpression()
*/
void QSortFilterProxyModel::setFilterWildcard(const QString &pattern)
{
Q_D(QSortFilterProxyModel);
d->filter_about_to_be_changed();
- QRegExp rx(pattern, d->filter_data.caseSensitivity(), QRegExp::Wildcard);
- d->filter_data.setRegExp(rx);
- d->filter_changed();
+ QString p = QRegularExpression::wildcardToRegularExpression(pattern, QRegularExpression::UnanchoredWildcardConversion);
+ d->filter_data.setPattern(p);
+ d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
}
/*!
Sets the fixed string used to filter the contents
of the source model to the given \a pattern.
- \sa setFilterCaseSensitivity(), setFilterRegExp(), setFilterWildcard(), filterRegExp()
+ \sa setFilterCaseSensitivity(), setFilterRegularExpression(), setFilterWildcard(), filterRegularExpression()
*/
void QSortFilterProxyModel::setFilterFixedString(const QString &pattern)
{
Q_D(QSortFilterProxyModel);
d->filter_about_to_be_changed();
- QRegExp rx(pattern, d->filter_data.caseSensitivity(), QRegExp::FixedString);
- d->filter_data.setRegExp(rx);
- d->filter_changed();
+ d->filter_data.setPattern(QRegularExpression::escape(pattern));
+ d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
}
/*!
@@ -2920,7 +2751,7 @@ void QSortFilterProxyModel::setFilterRole(int role)
return;
d->filter_about_to_be_changed();
d->filter_role = role;
- d->filter_changed();
+ d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
emit filterRoleChanged(role);
}
@@ -2954,7 +2785,7 @@ void QSortFilterProxyModel::setRecursiveFilteringEnabled(bool recursive)
return;
d->filter_about_to_be_changed();
d->filter_recursive = recursive;
- d->filter_changed();
+ d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
emit recursiveFilteringEnabledChanged(recursive);
}
@@ -3005,11 +2836,57 @@ void QSortFilterProxyModel::filterChanged()
(e.g. filterAcceptsRow()), and your filter parameters have changed.
\sa invalidate()
+ \sa invalidateColumnsFilter()
+ \sa invalidateRowsFilter()
*/
void QSortFilterProxyModel::invalidateFilter()
{
Q_D(QSortFilterProxyModel);
- d->filter_changed();
+ d->filter_changed(QSortFilterProxyModelPrivate::Direction::All);
+}
+
+/*!
+ \since 6.0
+
+ Invalidates the current filtering for the columns.
+
+ This function should be called if you are implementing custom filtering
+ (by filterAcceptsColumn()), and your filter parameters have changed.
+ This differs from invalidateFilter() in that it will not invoke
+ filterAcceptsRow(), but only filterAcceptsColumn(). You can use this
+ instead of invalidateFilter() if you want to hide or show a column where
+ the rows don't change.
+
+ \sa invalidate()
+ \sa invalidateFilter()
+ \sa invalidateRowsFilter()
+*/
+void QSortFilterProxyModel::invalidateColumnsFilter()
+{
+ Q_D(QSortFilterProxyModel);
+ d->filter_changed(QSortFilterProxyModelPrivate::Direction::Columns);
+}
+
+/*!
+ \since 6.0
+
+ Invalidates the current filtering for the rows.
+
+ This function should be called if you are implementing custom filtering
+ (by filterAcceptsRow()), and your filter parameters have changed.
+ This differs from invalidateFilter() in that it will not invoke
+ filterAcceptsColumn(), but only filterAcceptsRow(). You can use this
+ instead of invalidateFilter() if you want to hide or show a row where
+ the columns don't change.
+
+ \sa invalidate()
+ \sa invalidateFilter()
+ \sa invalidateColumnsFilter()
+*/
+void QSortFilterProxyModel::invalidateRowsFilter()
+{
+ Q_D(QSortFilterProxyModel);
+ d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
}
/*!
@@ -3069,20 +2946,20 @@ bool QSortFilterProxyModel::lessThan(const QModelIndex &source_left, const QMode
should be accepted or not. This can be changed by setting the
\l{QSortFilterProxyModel::filterRole}{filterRole} property.
- \sa filterAcceptsColumn(), setFilterFixedString(), setFilterRegExp(), setFilterWildcard()
+ \sa filterAcceptsColumn(), setFilterFixedString(), setFilterRegularExpression(), setFilterWildcard()
*/
bool QSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
Q_D(const QSortFilterProxyModel);
- if (d->filter_data.isEmpty())
+ if (d->filter_data.pattern().isEmpty())
return true;
if (d->filter_column == -1) {
int column_count = d->model->columnCount(source_parent);
for (int column = 0; column < column_count; ++column) {
QModelIndex source_index = d->model->index(source_row, column, source_parent);
QString key = d->model->data(source_index, d->filter_role).toString();
- if (d->filter_data.hasMatch(key))
+ if (d->filter_data.match(key).hasMatch())
return true;
}
return false;
@@ -3091,7 +2968,7 @@ bool QSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &
if (!source_index.isValid()) // the column may not exist
return true;
QString key = d->model->data(source_index, d->filter_role).toString();
- return d->filter_data.hasMatch(key);
+ return d->filter_data.match(key).hasMatch();
}
/*!
@@ -3101,7 +2978,7 @@ bool QSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &
\note The default implementation always returns \c true. You must reimplement this
method to get the described behavior.
- \sa filterAcceptsRow(), setFilterFixedString(), setFilterRegExp(), setFilterWildcard()
+ \sa filterAcceptsRow(), setFilterFixedString(), setFilterRegularExpression(), setFilterWildcard()
*/
bool QSortFilterProxyModel::filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const
{
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.h b/src/corelib/itemmodels/qsortfilterproxymodel.h
index 91253dd601..b7d4e69cb9 100644
--- a/src/corelib/itemmodels/qsortfilterproxymodel.h
+++ b/src/corelib/itemmodels/qsortfilterproxymodel.h
@@ -41,7 +41,6 @@
#define QSORTFILTERPROXYMODEL_H
#include <QtCore/qabstractproxymodel.h>
-#include <QtCore/qregexp.h>
#if QT_CONFIG(regularexpression)
# include <QtCore/qregularexpression.h>
@@ -62,7 +61,6 @@ class Q_CORE_EXPORT QSortFilterProxyModel : public QAbstractProxyModel
friend class QSortFilterProxyModelGreaterThan;
Q_OBJECT
- Q_PROPERTY(QRegExp filterRegExp READ filterRegExp WRITE setFilterRegExp)
#if QT_CONFIG(regularexpression)
Q_PROPERTY(QRegularExpression filterRegularExpression READ filterRegularExpression WRITE setFilterRegularExpression)
#endif
@@ -87,8 +85,6 @@ public:
QItemSelection mapSelectionToSource(const QItemSelection &proxySelection) const override;
QItemSelection mapSelectionFromSource(const QItemSelection &sourceSelection) const override;
- QRegExp filterRegExp() const;
-
#if QT_CONFIG(regularexpression)
QRegularExpression filterRegularExpression() const;
#endif
@@ -121,8 +117,6 @@ public:
void setRecursiveFilteringEnabled(bool recursive);
public Q_SLOTS:
- void setFilterRegExp(const QString &pattern);
- void setFilterRegExp(const QRegExp &regExp);
#if QT_CONFIG(regularexpression)
void setFilterRegularExpression(const QString &pattern);
void setFilterRegularExpression(const QRegularExpression &regularExpression);
@@ -143,6 +137,8 @@ protected:
QT_DEPRECATED_X("Use QSortFilterProxyModel::invalidateFilter") void filterChanged();
#endif
void invalidateFilter();
+ void invalidateRowsFilter();
+ void invalidateColumnsFilter();
public:
using QObject::parent;
diff --git a/src/corelib/itemmodels/qtransposeproxymodel.cpp b/src/corelib/itemmodels/qtransposeproxymodel.cpp
index 4853f90632..207faa6151 100644
--- a/src/corelib/itemmodels/qtransposeproxymodel.cpp
+++ b/src/corelib/itemmodels/qtransposeproxymodel.cpp
@@ -92,7 +92,7 @@ void QTransposeProxyModelPrivate::onLayoutAboutToBeChanged(const QList<QPersiste
layoutChangePersistentIndexes.clear();
layoutChangeProxyIndexes.reserve(proxyPersistentIndexes.size());
layoutChangePersistentIndexes.reserve(proxyPersistentIndexes.size());
- for (const QPersistentModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
+ for (const QModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
layoutChangeProxyIndexes << proxyPersistentIndex;
Q_ASSERT(proxyPersistentIndex.isValid());
const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
diff --git a/src/corelib/kernel/kernel.pri b/src/corelib/kernel/kernel.pri
index 749672c899..76609894ba 100644
--- a/src/corelib/kernel/kernel.pri
+++ b/src/corelib/kernel/kernel.pri
@@ -43,7 +43,11 @@ HEADERS += \
kernel/qsystemerror_p.h \
kernel/qmetatype_p.h \
kernel/qmetatypeswitcher_p.h \
- kernel/qtestsupport_core.h
+ kernel/qtestsupport_core.h \
+ kernel/qproperty.h \
+ kernel/qpropertyprivate.h \
+ kernel/qproperty_p.h \
+ kernel/qpropertybinding_p.h
SOURCES += \
kernel/qabstracteventdispatcher.cpp \
@@ -71,7 +75,9 @@ SOURCES += \
kernel/qpointer.cpp \
kernel/qmath.cpp \
kernel/qsystemerror.cpp \
- kernel/qtestsupport_core.cpp
+ kernel/qtestsupport_core.cpp \
+ kernel/qproperty.cpp \
+ kernel/qpropertybinding.cpp
win32 {
SOURCES += \
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 5fdcc9b914..fe3aa454ab 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -138,10 +138,10 @@ QT_BEGIN_NAMESPACE
extern QString qAppFileName();
#endif
-#if QT_VERSION >= 0x060000
-# error "Bump QCoreApplicatoinPrivate::app_compile_version to 0x060000"
+#if QT_VERSION >= 0x070000
+# error "Bump QCoreApplicatoinPrivate::app_compile_version to 0x070000"
#endif
-int QCoreApplicationPrivate::app_compile_version = 0x050000; //we don't know exactly, but it's at least 5.0.0
+int QCoreApplicationPrivate::app_compile_version = 0x060000; //we don't know exactly, but it's at least 6.0.0
bool QCoreApplicationPrivate::setuidAllowed = false;
@@ -361,7 +361,8 @@ QAbstractEventDispatcher *QCoreApplicationPrivate::eventDispatcher = nullptr;
QCoreApplication *QCoreApplication::self = nullptr;
uint QCoreApplicationPrivate::attribs =
(1 << Qt::AA_SynthesizeMouseForUnhandledTouchEvents) |
- (1 << Qt::AA_SynthesizeMouseForUnhandledTabletEvents);
+ (1 << Qt::AA_SynthesizeMouseForUnhandledTabletEvents) |
+ (1 << Qt::AA_UseHighDpiPixmaps);
struct QCoreApplicationData {
QCoreApplicationData() noexcept {
diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp
index e841919600..d9b9d84e41 100644
--- a/src/corelib/kernel/qeventdispatcher_win.cpp
+++ b/src/corelib/kernel/qeventdispatcher_win.cpp
@@ -971,7 +971,7 @@ int QEventDispatcherWin32::remainingTime(int timerId)
void QEventDispatcherWin32::wakeUp()
{
Q_D(QEventDispatcherWin32);
- if (d->internalHwnd && d->wakeUps.testAndSetAcquire(0, 1)) {
+ if (d->internalHwnd && d->wakeUps.testAndSetRelaxed(0, 1)) {
// post a WM_QT_SENDPOSTEDEVENTS to this thread if there isn't one already pending
if (!PostMessage(d->internalHwnd, WM_QT_SENDPOSTEDEVENTS, 0, 0))
qErrnoWarning("QEventDispatcherWin32::wakeUp: Failed to post a message");
diff --git a/src/corelib/kernel/qmath.h b/src/corelib/kernel/qmath.h
index 305e9065e9..391d6d4282 100644
--- a/src/corelib/kernel/qmath.h
+++ b/src/corelib/kernel/qmath.h
@@ -243,14 +243,8 @@ Q_DECL_CONSTEXPR inline double qRadiansToDegrees(double radians)
return radians * (180 / M_PI);
}
-
-Q_DECL_RELAXED_CONSTEXPR inline quint32 qNextPowerOfTwo(quint32 v)
-{
-#if defined(QT_HAS_BUILTIN_CLZ)
- if (v == 0)
- return 1;
- return 2U << (31 ^ QAlgorithmsPrivate::qt_builtin_clz(v));
-#else
+namespace QtPrivate {
+constexpr inline quint32 qConstexprNextPowerOfTwo(quint32 v) {
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
@@ -258,16 +252,9 @@ Q_DECL_RELAXED_CONSTEXPR inline quint32 qNextPowerOfTwo(quint32 v)
v |= v >> 16;
++v;
return v;
-#endif
}
-Q_DECL_RELAXED_CONSTEXPR inline quint64 qNextPowerOfTwo(quint64 v)
-{
-#if defined(QT_HAS_BUILTIN_CLZLL)
- if (v == 0)
- return 1;
- return Q_UINT64_C(2) << (63 ^ QAlgorithmsPrivate::qt_builtin_clzll(v));
-#else
+constexpr inline quint64 qConstexprNextPowerOfTwo(quint64 v) {
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
@@ -276,15 +263,47 @@ Q_DECL_RELAXED_CONSTEXPR inline quint64 qNextPowerOfTwo(quint64 v)
v |= v >> 32;
++v;
return v;
+}
+
+constexpr inline quint32 qConstexprNextPowerOfTwo(qint32 v)
+{
+ return qConstexprNextPowerOfTwo(quint32(v));
+}
+
+constexpr inline quint64 qConstexprNextPowerOfTwo(qint64 v)
+{
+ return qConstexprNextPowerOfTwo(quint64(v));
+}
+} // namespace QtPrivate
+
+constexpr inline quint32 qNextPowerOfTwo(quint32 v)
+{
+#if defined(QT_HAS_BUILTIN_CLZ)
+ if (v == 0)
+ return 1;
+ return 2U << (31 ^ QAlgorithmsPrivate::qt_builtin_clz(v));
+#else
+ return QtPrivate::qConstexprNextPowerOfTwo(v);
+#endif
+}
+
+constexpr inline quint64 qNextPowerOfTwo(quint64 v)
+{
+#if defined(QT_HAS_BUILTIN_CLZLL)
+ if (v == 0)
+ return 1;
+ return Q_UINT64_C(2) << (63 ^ QAlgorithmsPrivate::qt_builtin_clzll(v));
+#else
+ return QtPrivate::qConstexprNextPowerOfTwo(v);
#endif
}
-Q_DECL_RELAXED_CONSTEXPR inline quint32 qNextPowerOfTwo(qint32 v)
+constexpr inline quint32 qNextPowerOfTwo(qint32 v)
{
return qNextPowerOfTwo(quint32(v));
}
-Q_DECL_RELAXED_CONSTEXPR inline quint64 qNextPowerOfTwo(qint64 v)
+constexpr inline quint64 qNextPowerOfTwo(qint64 v)
{
return qNextPowerOfTwo(quint64(v));
}
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index 62e626b187..7429f5a323 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -154,20 +154,29 @@ QT_BEGIN_NAMESPACE
static inline const QMetaObjectPrivate *priv(const uint* data)
{ return reinterpret_cast<const QMetaObjectPrivate*>(data); }
+static inline const char *rawStringData(const QMetaObject *mo, int index)
+{
+ Q_ASSERT(priv(mo->d.data)->revision >= 7);
+ uint offset = mo->d.stringdata[2*index];
+ return reinterpret_cast<const char *>(mo->d.stringdata) + offset;
+}
+
static inline const QByteArray stringData(const QMetaObject *mo, int index)
{
Q_ASSERT(priv(mo->d.data)->revision >= 7);
- const QByteArrayDataPtr data = { const_cast<QByteArrayData*>(&mo->d.stringdata[index]) };
- Q_ASSERT(data.ptr->ref.isStatic());
- Q_ASSERT(data.ptr->alloc == 0);
- Q_ASSERT(data.ptr->capacityReserved == 0);
- Q_ASSERT(data.ptr->size >= 0);
- return data;
+ uint offset = mo->d.stringdata[2*index];
+ uint length = mo->d.stringdata[2*index + 1];
+ const char *string = reinterpret_cast<const char *>(mo->d.stringdata) + offset;
+ return QByteArray::fromRawData(string, length);
}
-static inline const char *rawStringData(const QMetaObject *mo, int index)
+static inline const char *rawTypeNameFromTypeInfo(const QMetaObject *mo, uint typeInfo)
{
- return stringData(mo, index).data();
+ if (typeInfo & IsUnresolvedType) {
+ return rawStringData(mo, typeInfo & TypeNameIndexMask);
+ } else {
+ return QMetaType::typeName(typeInfo);
+ }
}
static inline QByteArray typeNameFromTypeInfo(const QMetaObject *mo, uint typeInfo)
@@ -181,16 +190,11 @@ static inline QByteArray typeNameFromTypeInfo(const QMetaObject *mo, uint typeIn
}
}
-static inline const char *rawTypeNameFromTypeInfo(const QMetaObject *mo, uint typeInfo)
-{
- return typeNameFromTypeInfo(mo, typeInfo).constData();
-}
-
static inline int typeFromTypeInfo(const QMetaObject *mo, uint typeInfo)
{
if (!(typeInfo & IsUnresolvedType))
return typeInfo;
- return QMetaType::type(stringData(mo, typeInfo & TypeNameIndexMask));
+ return QMetaType::type(rawStringData(mo, typeInfo & TypeNameIndexMask));
}
class QMetaMethodPrivate : public QMetaMethod
@@ -577,7 +581,7 @@ static bool methodMatch(const QMetaObject *m, int handle,
if (int(m->d.data[handle + 1]) != argc)
return false;
- if (stringData(m, m->d.data[handle]) != name)
+ if (rawStringData(m, m->d.data[handle]) != name)
return false;
int paramsIndex = m->d.data[handle + 2] + 1;
@@ -682,7 +686,9 @@ static void argumentTypesFromString(const char *str, const char *end,
--level;
++str;
}
- types += QArgumentType(QByteArray(begin, str - begin));
+ QByteArray argType(begin, str - begin);
+ argType.replace("QList<", "QVector<");
+ types += QArgumentType(std::move(argType));
}
}
@@ -1161,7 +1167,7 @@ QMetaProperty QMetaObject::property(int index) const
const QMetaObject *scope = nullptr;
if (qstrcmp(scope_name, "Qt") == 0)
- scope = &QObject::staticQtMetaObject;
+ scope = &Qt::staticMetaObject;
else
scope = QMetaObject_findMetaObject(this, scope_name);
if (scope)
@@ -1309,17 +1315,7 @@ static char *qNormalizeType(char *d, int &templdepth, QByteArray &result)
*/
QByteArray QMetaObject::normalizedType(const char *type)
{
- QByteArray result;
-
- if (!type || !*type)
- return result;
-
- QVarLengthArray<char> stackbuf(qstrlen(type) + 1);
- qRemoveWhitespace(type, stackbuf.data());
- int templdepth = 0;
- qNormalizeType(stackbuf.data(), templdepth, result);
-
- return result;
+ return normalizeTypeInternal(type, type + qstrlen(type));
}
/*!
@@ -2837,10 +2833,6 @@ QByteArray QMetaEnum::valueToKeys(int value) const
The enum needs to be declared with Q_ENUM.
*/
-static QByteArray qualifiedName(const QMetaEnum &e)
-{
- return QByteArray(e.scope()) + "::" + e.name();
-}
/*!
\class QMetaProperty
@@ -2931,65 +2923,45 @@ const char *QMetaProperty::typeName() const
Returns this property's type. The return value is one
of the values of the QVariant::Type enumeration.
- \sa userType(), typeName(), name()
+ \sa userType(), typeName(), name(), metaType()
*/
QVariant::Type QMetaProperty::type() const
{
- if (!mobj)
- return QVariant::Invalid;
- int handle = priv(mobj->d.data)->propertyData + 3*idx;
-
- Q_ASSERT(priv(mobj->d.data)->revision >= 7);
- uint type = typeFromTypeInfo(mobj, mobj->d.data[handle + 1]);
+ uint type = userType();
if (type >= QMetaType::User)
return QVariant::UserType;
- if (type != QMetaType::UnknownType)
- return QVariant::Type(type);
- if (isEnumType()) {
- int enumMetaTypeId = QMetaType::type(qualifiedName(menum));
- if (enumMetaTypeId == QMetaType::UnknownType)
- return QVariant::Int;
- }
-#ifdef QT_COORD_TYPE
- // qreal metatype must be resolved at runtime.
- if (strcmp(typeName(), "qreal") == 0)
- return QVariant::Type(qMetaTypeId<qreal>());
-#endif
-
- return QVariant::UserType;
+ return QVariant::Type(type);
}
/*!
\since 4.2
Returns this property's user type. The return value is one
- of the values that are registered with QMetaType, or QMetaType::UnknownType if
- the type is not registered.
+ of the values that are registered with QMetaType.
+
+ This is equivalent to metaType().id()
- \sa type(), QMetaType, typeName()
+ \sa type(), QMetaType, typeName(), metaType()
*/
int QMetaProperty::userType() const
{
if (!mobj)
return QMetaType::UnknownType;
- Q_ASSERT(priv(mobj->d.data)->revision >= 7);
- int handle = priv(mobj->d.data)->propertyData + 3*idx;
- int type = typeFromTypeInfo(mobj, mobj->d.data[handle + 1]);
- if (type != QMetaType::UnknownType)
- return type;
- if (isEnumType()) {
- type = QMetaType::type(qualifiedName(menum));
- if (type == QMetaType::UnknownType) {
- type = registerPropertyType();
- if (type == QMetaType::UnknownType)
- return QMetaType::Int; // Match behavior of QMetaType::type()
- }
- return type;
- }
- type = QMetaType::type(typeName());
- if (type != QMetaType::UnknownType)
- return type;
- return registerPropertyType();
+ return QMetaType(mobj->d.metaTypes[idx]).id();
+}
+
+/*!
+ \since 6.0
+
+ Returns this property's QMetaType.
+
+ \sa QMetaType
+ */
+QMetaType QMetaProperty::metaType() const
+{
+ if (!mobj)
+ return {};
+ return QMetaType(mobj->d.metaTypes[idx]);
}
/*!
@@ -3100,37 +3072,6 @@ QVariant QMetaProperty::read(const QObject *object) const
if (!object || !mobj)
return QVariant();
- uint t = QMetaType::Int;
- if (isEnumType()) {
- /*
- try to create a QVariant that can be converted to this enum
- type (only works if the enum has already been registered
- with QMetaType)
- */
- int enumMetaTypeId = QMetaType::type(qualifiedName(menum));
- if (enumMetaTypeId != QMetaType::UnknownType)
- t = enumMetaTypeId;
- } else {
- int handle = priv(mobj->d.data)->propertyData + 3*idx;
- const char *typeName = nullptr;
- Q_ASSERT(priv(mobj->d.data)->revision >= 7);
- uint typeInfo = mobj->d.data[handle + 1];
- if (!(typeInfo & IsUnresolvedType))
- t = typeInfo;
- else {
- typeName = rawStringData(mobj, typeInfo & TypeNameIndexMask);
- t = QMetaType::type(typeName);
- }
- if (t == QMetaType::UnknownType) {
- // Try to register the type and try again before reporting an error.
- t = registerPropertyType();
- if (t == QMetaType::UnknownType) {
- qWarning("QMetaProperty::read: Unable to handle unregistered datatype '%s' for property '%s::%s'", typeName, mobj->className(), name());
- return QVariant();
- }
- }
- }
-
// the status variable is changed by qt_metacall to indicate what it did
// this feature is currently only used by Qt D-Bus and should not be depended
// upon. Don't change it without looking into QDBusAbstractInterface first
@@ -3139,10 +3080,11 @@ QVariant QMetaProperty::read(const QObject *object) const
int status = -1;
QVariant value;
void *argv[] = { nullptr, &value, &status };
- if (t == QMetaType::QVariant) {
+ QMetaType t(mobj->d.metaTypes[idx]);
+ if (t == QMetaType::fromType<QVariant>()) {
argv[0] = &value;
} else {
- value = QVariant(t, (void*)nullptr);
+ value = QVariant(t, nullptr);
argv[0] = value.data();
}
if (priv(mobj->d.data)->flags & PropertyAccessInStaticMetaCall && mobj->d.static_metacall) {
@@ -3154,9 +3096,9 @@ QVariant QMetaProperty::read(const QObject *object) const
if (status != -1)
return value;
- if (t != QMetaType::QVariant && argv[0] != value.data())
+ if (t != QMetaType::fromType<QVariant>() && argv[0] != value.data())
// pointer or reference
- return QVariant((QVariant::Type)t, argv[0]);
+ return QVariant(t, argv[0]);
return value;
}
@@ -3177,9 +3119,10 @@ bool QMetaProperty::write(QObject *object, const QVariant &value) const
return false;
QVariant v = value;
- uint t = QMetaType::UnknownType;
- if (isEnumType()) {
- if (v.userType() == QMetaType::QString) {
+ QMetaType t(mobj->d.metaTypes[idx]);
+ if (t != QMetaType::fromType<QVariant>() && t != v.metaType()) {
+ if (isEnumType() && !t.metaObject() && v.userType() == QMetaType::QString) {
+ // Assigning a string to a property of type Q_ENUMS (instead of Q_ENUM)
bool ok;
if (isFlagType())
v = QVariant(menum.keysToValue(value.toByteArray(), &ok));
@@ -3187,39 +3130,14 @@ bool QMetaProperty::write(QObject *object, const QVariant &value) const
v = QVariant(menum.keyToValue(value.toByteArray(), &ok));
if (!ok)
return false;
- } else if (v.userType() != QMetaType::Int && v.userType() != QMetaType::UInt) {
- int enumMetaTypeId = QMetaType::type(qualifiedName(menum));
- if ((enumMetaTypeId == QMetaType::UnknownType) || (v.userType() != enumMetaTypeId) || !v.constData())
- return false;
- v = QVariant(*reinterpret_cast<const int *>(v.constData()));
- }
- v.convert(QMetaType::Int);
- } else {
- int handle = priv(mobj->d.data)->propertyData + 3*idx;
- const char *typeName = nullptr;
- Q_ASSERT(priv(mobj->d.data)->revision >= 7);
- uint typeInfo = mobj->d.data[handle + 1];
- if (!(typeInfo & IsUnresolvedType))
- t = typeInfo;
- else {
- typeName = rawStringData(mobj, typeInfo & TypeNameIndexMask);
- t = QMetaType::type(typeName);
- if (t == QMetaType::UnknownType)
- t = registerPropertyType();
- if (t == QMetaType::UnknownType)
- return false;
- }
- if (t != QMetaType::QVariant && int(t) != value.userType()) {
- if (!value.isValid()) {
- if (isResettable())
- return reset(object);
- v = QVariant(t, nullptr);
- } else if (!v.convert(t)) {
- return false;
- }
+ } else if (!value.isValid()) {
+ if (isResettable())
+ return reset(object);
+ v = QVariant(t, nullptr);
+ } else if (!v.convert(t.id())) {
+ return false;
}
}
-
// the status variable is changed by qt_metacall to indicate what it did
// this feature is currently only used by Qt D-Bus and should not be depended
// upon. Don't change it without looking into QDBusAbstractInterface first
@@ -3230,7 +3148,7 @@ bool QMetaProperty::write(QObject *object, const QVariant &value) const
// interception of property writes.
int flags = 0;
void *argv[] = { nullptr, &v, &status, &flags };
- if (t == QMetaType::QVariant)
+ if (t == QMetaType::fromType<QVariant>())
argv[0] = &v;
else
argv[0] = v.data();
@@ -3588,6 +3506,21 @@ bool QMetaProperty::isRequired() const
}
/*!
+ \since 6.0
+ Returns \c true if the property is implemented using a QProperty member; otherwise returns \c false.
+
+ This can be used to detect the availability of QProperty related meta-call types ahead of
+ performing the call itself.
+*/
+bool QMetaProperty::isQProperty() const
+{
+ if (!mobj)
+ return false;
+ int flags = mobj->d.data[handle + 2];
+ return flags & IsQProperty;
+}
+
+/*!
\obsolete
Returns \c true if the property is editable for the given \a object;
@@ -3672,6 +3605,21 @@ const char* QMetaClassInfo::value() const
}
/*!
+ \class QMethodRawArguments
+ \internal
+
+ A wrapper class for the void ** arguments array used by the meta
+ object system. If a slot uses a single argument of this type,
+ the meta object system will pass the raw arguments array directly
+ to the slot and set the arguments count in the slot description to
+ zero, so that any signal can connect to it.
+
+ This is used internally to implement signal relay functionality in
+ our state machine and dbus.
+*/
+
+
+/*!
\macro QGenericArgument Q_ARG(Type, const Type &value)
\relates QMetaObject
diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h
index 351fd5de10..819112dc45 100644
--- a/src/corelib/kernel/qmetaobject.h
+++ b/src/corelib/kernel/qmetaobject.h
@@ -46,9 +46,6 @@
QT_BEGIN_NAMESPACE
-
-template <typename T> class QList;
-
#define Q_METAMETHOD_INVOKE_MAX_ARGS 10
class Q_CORE_EXPORT QMetaMethod
@@ -253,6 +250,7 @@ public:
const char *typeName() const;
QVariant::Type type() const;
int userType() const;
+ QMetaType metaType() const;
int propertyIndex() const;
int relativePropertyIndex() const;
@@ -269,6 +267,7 @@ public:
bool isConstant() const;
bool isFinal() const;
bool isRequired() const;
+ bool isQProperty() const;
bool isFlagType() const;
bool isEnumType() const;
diff --git a/src/corelib/kernel/qmetaobject_moc_p.h b/src/corelib/kernel/qmetaobject_moc_p.h
index 8c7900767b..9770d9c576 100644
--- a/src/corelib/kernel/qmetaobject_moc_p.h
+++ b/src/corelib/kernel/qmetaobject_moc_p.h
@@ -52,167 +52,19 @@
// We mean it.
//
-#include <QtCore/private/qglobal_p.h>
+#include <QtCore/qbytearray.h>
QT_BEGIN_NAMESPACE
// This function is shared with moc.cpp. This file should be included where needed.
-static QByteArray normalizeTypeInternal(const char *t, const char *e, bool fixScope = false, bool adjustConst = true)
+static QByteArray normalizeTypeInternal(const char *t, const char *e)
{
- int len = e - t;
- /*
- Convert 'char const *' into 'const char *'. Start at index 1,
- not 0, because 'const char *' is already OK.
- */
- QByteArray constbuf;
- for (int i = 1; i < len; i++) {
- if ( t[i] == 'c'
- && strncmp(t + i + 1, "onst", 4) == 0
- && (i + 5 >= len || !is_ident_char(t[i + 5]))
- && !is_ident_char(t[i-1])
- ) {
- constbuf = QByteArray(t, len);
- if (is_space(t[i-1]))
- constbuf.remove(i-1, 6);
- else
- constbuf.remove(i, 5);
- constbuf.prepend("const ");
- t = constbuf.data();
- e = constbuf.data() + constbuf.length();
- break;
- }
- /*
- We mustn't convert 'char * const *' into 'const char **'
- and we must beware of 'Bar<const Bla>'.
- */
- if (t[i] == '&' || t[i] == '*' ||t[i] == '<')
- break;
- }
- if (adjustConst && e > t + 6 && strncmp("const ", t, 6) == 0) {
- if (*(e-1) == '&') { // treat const reference as value
- t += 6;
- --e;
- } else if (is_ident_char(*(e-1)) || *(e-1) == '>') { // treat const value as value
- t += 6;
- }
- }
- QByteArray result;
- result.reserve(len);
-
-#if 1
- // consume initial 'const '
- if (strncmp("const ", t, 6) == 0) {
- t+= 6;
- result += "const ";
- }
-#endif
-
- // some type substitutions for 'unsigned x'
- if (strncmp("unsigned", t, 8) == 0) {
- // make sure "unsigned" is an isolated word before making substitutions
- if (!t[8] || !is_ident_char(t[8])) {
- if (strncmp(" int", t+8, 4) == 0) {
- t += 8+4;
- result += "uint";
- } else if (strncmp(" long", t+8, 5) == 0) {
- if ((strlen(t + 8 + 5) < 4 || strncmp(t + 8 + 5, " int", 4) != 0) // preserve '[unsigned] long int'
- && (strlen(t + 8 + 5) < 5 || strncmp(t + 8 + 5, " long", 5) != 0) // preserve '[unsigned] long long'
- ) {
- t += 8+5;
- result += "ulong";
- }
- } else if (strncmp(" short", t+8, 6) != 0 // preserve unsigned short
- && strncmp(" char", t+8, 5) != 0) { // preserve unsigned char
- // treat rest (unsigned) as uint
- t += 8;
- result += "uint";
- }
- }
- } else {
- // discard 'struct', 'class', and 'enum'; they are optional
- // and we don't want them in the normalized signature
- struct {
- const char *keyword;
- int len;
- } optional[] = {
- { "struct ", 7 },
- { "class ", 6 },
- { "enum ", 5 },
- { nullptr, 0 }
- };
- int i = 0;
- do {
- if (strncmp(optional[i].keyword, t, optional[i].len) == 0) {
- t += optional[i].len;
- break;
- }
- } while (optional[++i].keyword != nullptr);
- }
-
- bool star = false;
- while (t != e) {
- char c = *t++;
- if (fixScope && c == ':' && *t == ':' ) {
- ++t;
- c = *t++;
- int i = result.size() - 1;
- while (i >= 0 && is_ident_char(result.at(i)))
- --i;
- result.resize(i + 1);
- }
- star = star || c == '*';
- result += c;
- if (c == '<') {
- //template recursion
- const char* tt = t;
- int templdepth = 1;
- int scopeDepth = 0;
- while (t != e) {
- c = *t++;
- if (c == '{' || c == '(' || c == '[')
- ++scopeDepth;
- if (c == '}' || c == ')' || c == ']')
- --scopeDepth;
- if (scopeDepth == 0) {
- if (c == '<')
- ++templdepth;
- if (c == '>')
- --templdepth;
- if (templdepth == 0 || (templdepth == 1 && c == ',')) {
- result += normalizeTypeInternal(tt, t-1, fixScope, false);
- result += c;
- if (templdepth == 0) {
- if (*t == '>')
- result += ' '; // avoid >>
- break;
- }
- tt = t;
- }
- }
- }
- }
-
- // cv qualifers can appear after the type as well
- if (!is_ident_char(c) && t != e && (e - t >= 5 && strncmp("const", t, 5) == 0)
- && (e - t == 5 || !is_ident_char(t[5]))) {
- t += 5;
- while (t != e && is_space(*t))
- ++t;
- if (adjustConst && t != e && *t == '&') {
- // treat const ref as value
- ++t;
- } else if (adjustConst && !star) {
- // treat const as value
- } else if (!star) {
- // move const to the front (but not if const comes after a *)
- result.prepend("const ");
- } else {
- // keep const after a *
- result += "const";
- }
- }
- }
-
+ int len = QtPrivate::qNormalizeType(t, e, nullptr);
+ if (len == 0)
+ return QByteArray();
+ QByteArray result(len, Qt::Uninitialized);
+ len = QtPrivate::qNormalizeType(t, e, result.data());
+ Q_ASSERT(len == result.size());
return result;
}
diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h
index 277109dac4..49c43e3d79 100644
--- a/src/corelib/kernel/qmetaobject_p.h
+++ b/src/corelib/kernel/qmetaobject_p.h
@@ -87,6 +87,7 @@ enum PropertyFlags {
Notify = 0x00400000,
Revisioned = 0x00800000,
Required = 0x01000000,
+ IsQProperty = 0x02000000
};
enum MethodFlags {
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp
index 0f018074e4..74e8af92df 100644
--- a/src/corelib/kernel/qmetaobjectbuilder.cpp
+++ b/src/corelib/kernel/qmetaobjectbuilder.cpp
@@ -1113,13 +1113,13 @@ int QMetaStringTable::enter(const QByteArray &value)
int QMetaStringTable::preferredAlignment()
{
- return Q_ALIGNOF(QByteArrayData);
+ return alignof(uint);
}
// Returns the size (in bytes) required for serializing this string table.
int QMetaStringTable::blobSize() const
{
- int size = m_entries.size() * sizeof(QByteArrayData);
+ int size = int(m_entries.size() * 2 * sizeof(uint));
Entries::const_iterator it;
for (it = m_entries.constBegin(); it != m_entries.constEnd(); ++it)
size += it.key().size() + 1;
@@ -1130,14 +1130,12 @@ static void writeString(char *out, int i, const QByteArray &str,
const int offsetOfStringdataMember, int &stringdataOffset)
{
int size = str.size();
- qptrdiff offset = offsetOfStringdataMember + stringdataOffset
- - i * sizeof(QByteArrayData);
- const QByteArrayData data =
- Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset);
+ int offset = offsetOfStringdataMember + stringdataOffset;
+ uint offsetLen[2] = { uint(offset), uint(size) };
- memcpy(out + i * sizeof(QByteArrayData), &data, sizeof(QByteArrayData));
+ memcpy(out + 2 * i * sizeof(uint), &offsetLen, 2*sizeof(uint));
- memcpy(out + offsetOfStringdataMember + stringdataOffset, str.constData(), size);
+ memcpy(out + offset, str.constData(), size);
out[offsetOfStringdataMember + stringdataOffset + size] = '\0';
stringdataOffset += size + 1;
@@ -1151,7 +1149,7 @@ void QMetaStringTable::writeBlob(char *out) const
{
Q_ASSERT(!(reinterpret_cast<quintptr>(out) & (preferredAlignment()-1)));
- int offsetOfStringdataMember = m_entries.size() * sizeof(QByteArrayData);
+ int offsetOfStringdataMember = int(m_entries.size() * 2 * sizeof(uint));
int stringdataOffset = 0;
// qt_metacast expects the first string in the string table to be the class name.
@@ -1208,6 +1206,7 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
if (!relocatable) meta->d.superdata = d->superClass;
meta->d.relatedMetaObjects = nullptr;
meta->d.extradata = nullptr;
+ meta->d.metaTypes = nullptr;
meta->d.static_metacall = d->staticMetacallFunction;
}
@@ -1292,10 +1291,10 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
char *str = reinterpret_cast<char *>(buf + size);
if (buf) {
if (relocatable) {
- meta->d.stringdata = reinterpret_cast<const QByteArrayData *>((quintptr)size);
+ meta->d.stringdata = reinterpret_cast<const uint *>((quintptr)size);
meta->d.data = reinterpret_cast<uint *>((quintptr)pmetaSize);
} else {
- meta->d.stringdata = reinterpret_cast<const QByteArrayData *>(str);
+ meta->d.stringdata = reinterpret_cast<const uint *>(str);
meta->d.data = reinterpret_cast<uint *>(data);
}
}
@@ -1486,6 +1485,20 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
size += sizeof(SuperData) * (d->relatedMetaObjects.size() + 1);
}
+ if (d->properties.size() > 0) {
+ ALIGN(size, QtPrivate::QMetaTypeInterface *);
+ auto types = reinterpret_cast<QtPrivate::QMetaTypeInterface **>(buf + size);
+ if (buf) {
+ meta->d.metaTypes = types;
+ for (const auto &prop : d->properties) {
+ QMetaType mt(QMetaType::type(prop.type));
+ *types = reinterpret_cast<QtPrivate::QMetaTypeInterface *&>(mt);
+ types++;
+ }
+ }
+ size += static_cast<int>(sizeof(QMetaType) * d->properties.size());
+ }
+
// Align the final size and return it.
ALIGN(size, void *);
Q_ASSERT(!buf || size == expectedSize);
@@ -1563,7 +1576,7 @@ void QMetaObjectBuilder::fromRelocatableData(QMetaObject *output,
quintptr dataOffset = (quintptr)dataMo->d.data;
output->d.superdata = superclass;
- output->d.stringdata = reinterpret_cast<const QByteArrayData *>(buf + stringdataOffset);
+ output->d.stringdata = reinterpret_cast<const uint *>(buf + stringdataOffset);
output->d.data = reinterpret_cast<const uint *>(buf + dataOffset);
output->d.extradata = nullptr;
output->d.relatedMetaObjects = nullptr;
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index 21254108e3..c34e442cdb 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -85,6 +85,9 @@
# include "qline.h"
#endif
+#include <bitset>
+#include <new>
+
QT_BEGIN_NAMESPACE
#define NS(x) QT_PREPEND_NAMESPACE(x)
@@ -97,6 +100,88 @@ struct DefinedTypesFilter {
static const bool IsAccepted = QtMetaTypePrivate::TypeDefinition<T>::IsAvailable && QModulesPrivate::QTypeModuleInfo<T>::IsCore;
};
};
+
+struct QMetaTypeCustomRegistry
+{
+ QReadWriteLock lock;
+ QVector<QtPrivate::QMetaTypeInterface *> registry;
+ QHash<QByteArray, QtPrivate::QMetaTypeInterface *> aliases;
+#ifndef QT_NO_DATASTREAM
+ struct DataStreamOps
+ {
+ QMetaType::SaveOperator saveOp;
+ QMetaType::LoadOperator loadOp;
+ };
+ QHash<int, DataStreamOps> dataStreamOp;
+#endif
+ // index of first empty (unregistered) type in registry, if any.
+ int firstEmpty = 0;
+
+ int registerCustomType(QtPrivate::QMetaTypeInterface *ti)
+ {
+ {
+ QWriteLocker l(&lock);
+ if (ti->typeId)
+ return ti->typeId;
+ QByteArray name =
+#ifndef QT_NO_QOBJECT
+ QMetaObject::normalizedType
+#endif
+ (ti->name);
+ if (auto ti2 = aliases.value(name)) {
+ ti->typeId.storeRelaxed(ti2->typeId.loadRelaxed());
+ return ti2->typeId;
+ }
+ aliases[name] = ti;
+ int size = registry.size();
+ while (firstEmpty < size && registry[firstEmpty])
+ ++firstEmpty;
+ if (firstEmpty < size) {
+ registry[firstEmpty] = ti;
+ ++firstEmpty;
+ } else {
+ registry.append(ti);
+ firstEmpty = registry.size();
+ }
+ ti->typeId = firstEmpty + QMetaType::User;
+ }
+ if (ti->legacyRegisterOp)
+ ti->legacyRegisterOp();
+ return ti->typeId;
+ };
+
+ void unregisterDynamicType(int id)
+ {
+ if (!id)
+ return;
+ Q_ASSERT(id > QMetaType::User);
+ QWriteLocker l(&lock);
+ int idx = id - QMetaType::User - 1;
+ auto &ti = registry[idx];
+
+ // We must unregister all names.
+ auto it = aliases.begin();
+ while (it != aliases.end()) {
+ if (it.value() == ti)
+ it = aliases.erase(it);
+ else
+ ++it;
+ }
+
+ ti = nullptr;
+
+ firstEmpty = std::min(firstEmpty, idx);
+ }
+
+ QtPrivate::QMetaTypeInterface *getCustomType(int id)
+ {
+ QReadLocker l(&lock);
+ return registry.value(id - QMetaType::User - 1);
+ }
+};
+
+Q_GLOBAL_STATIC(QMetaTypeCustomRegistry, customTypeRegistry)
+
} // namespace
/*!
@@ -153,7 +238,7 @@ struct DefinedTypesFilter {
\list
\li Pointers to classes derived from QObject
- \li QList<T>, QVector<T>, QQueue<T>, QStack<T>, QSet<T> or QLinkedList<T>
+ \li QList<T>, QVector<T>, QQueue<T>, QStack<T> or QSet<T>
where T is a registered meta type
\li QHash<T1, T2>, QMap<T1, T2> or QPair<T1, T2> where T1 and T2 are
registered meta types
@@ -282,7 +367,6 @@ struct DefinedTypesFilter {
\value QPixmap QPixmap
\value QLocale QLocale
\value QBitmap QBitmap
- \value QMatrix QMatrix
\value QTransform QTransform
\value QMatrix4x4 QMatrix4x4
\value QVector2D QVector2D
@@ -371,6 +455,10 @@ struct DefinedTypesFilter {
Returns \c true if this QMetaType object contains valid
information about a type, false otherwise.
*/
+bool QMetaType::isValid() const
+{
+ return d_ptr;
+}
/*!
\fn bool QMetaType::isRegistered() const
@@ -379,6 +467,10 @@ struct DefinedTypesFilter {
Returns \c true if this QMetaType object contains valid
information about a type, false otherwise.
*/
+bool QMetaType::isRegistered() const
+{
+ return d_ptr;
+}
/*!
\fn int QMetaType::id() const
@@ -386,6 +478,18 @@ struct DefinedTypesFilter {
Returns id type hold by this QMetatype instance.
*/
+int QMetaType::id() const
+{
+ if (d_ptr) {
+ if (d_ptr->typeId)
+ return d_ptr->typeId;
+ auto reg = customTypeRegistry();
+ if (reg) {
+ return reg->registerCustomType(d_ptr);
+ }
+ }
+ return 0;
+}
/*!
\fn bool QMetaType::sizeOf() const
@@ -400,6 +504,12 @@ struct DefinedTypesFilter {
\sa QMetaType::construct(), QMetaType::sizeOf()
*/
+int QMetaType::sizeOf() const
+{
+ if (d_ptr)
+ return d_ptr->size;
+ return 0;
+}
/*!
\fn TypeFlags QMetaType::flags() const
@@ -409,6 +519,12 @@ struct DefinedTypesFilter {
\sa QMetaType::TypeFlags, QMetaType::typeFlags()
*/
+QMetaType::TypeFlags QMetaType::flags() const
+{
+ if (d_ptr)
+ return TypeFlags(d_ptr->flags);
+ return {};
+}
/*!
\fn const QMetaObject *QMetaType::metaObject() const
@@ -430,6 +546,10 @@ struct DefinedTypesFilter {
\sa QMetaType::metaObjectForType(), QMetaType::flags()
*/
+const QMetaObject *QMetaType::metaObject() const
+{
+ return d_ptr ? d_ptr->metaObject : nullptr;
+}
/*!
\fn void *QMetaType::create(const void *copy = 0) const
@@ -441,6 +561,19 @@ struct DefinedTypesFilter {
\sa QMetaType::destroy()
*/
+void *QMetaType::create(const void *copy) const
+{
+ if (d_ptr) {
+ void *where =
+#ifdef __STDCPP_DEFAULT_NEW_ALIGNMENT__
+ d_ptr->alignment > __STDCPP_DEFAULT_NEW_ALIGNMENT__ ?
+ operator new(d_ptr->size, std::align_val_t(d_ptr->alignment)) :
+#endif
+ operator new(d_ptr->size);
+ return construct(where, copy);
+ }
+ return nullptr;
+}
/*!
\fn void QMetaType::destroy(void *data) const
@@ -451,18 +584,19 @@ struct DefinedTypesFilter {
\sa QMetaType::create()
*/
+void QMetaType::destroy(void *data) const
+{
+ if (d_ptr && d_ptr->dtor) {
+ d_ptr->dtor(d_ptr, data);
+ if (d_ptr->alignment > __STDCPP_DEFAULT_NEW_ALIGNMENT__) {
+ operator delete(data, std::align_val_t(d_ptr->alignment));
+ } else {
+ operator delete(data);
+ }
+ }
+}
/*!
- \fn void *QMetaType::construct(int type, const void *copy)
- \deprecated
-
- Constructs a value of the given type which is a copy of \a copy.
- The default value for \a copy is \nullptr.
-
- Deprecated, use the static function QMetaType::create(int type,
- const void *copy) instead.
-*/
-/*!
\fn void *QMetaType::construct(void *where, const void *copy = 0) const
\since 5.0
@@ -488,6 +622,21 @@ struct DefinedTypesFilter {
special hardware instructions (e.g., aligned SSE loads and stores
on x86).
*/
+void *QMetaType::construct(void *where, const void *copy) const
+{
+ if (!where)
+ return nullptr;
+ if (d_ptr) {
+ if (copy && d_ptr->copyCtr) {
+ d_ptr->copyCtr(d_ptr, where, copy);
+ return where;
+ } else if (!copy && d_ptr->defaultCtr) {
+ d_ptr->defaultCtr(d_ptr, where);
+ return where;
+ }
+ }
+ return nullptr;
+}
/*!
\fn void QMetaType::destruct(void *data) const
@@ -500,12 +649,53 @@ struct DefinedTypesFilter {
destructor, it doesn't invoke the delete operator.
\sa QMetaType::construct()
*/
+void QMetaType::destruct(void *data) const
+{
+ if (!data)
+ return;
+ if (d_ptr && d_ptr->dtor) {
+ d_ptr->dtor(d_ptr, data);
+ return;
+ }
+}
+
+void QtMetaTypePrivate::derefAndDestroy(NS(QtPrivate::QMetaTypeInterface) *d_ptr)
+{
+ if (d_ptr && !d_ptr->ref.deref()) {
+ if (auto reg = customTypeRegistry())
+ reg->unregisterDynamicType(d_ptr->typeId.loadRelaxed());
+ Q_ASSERT(d_ptr->deleteSelf);
+ d_ptr->deleteSelf(d_ptr);
+ }
+}
/*!
\fn QMetaType::~QMetaType()
Destructs this object.
*/
+QMetaType::~QMetaType()
+{
+ QtMetaTypePrivate::derefAndDestroy(d_ptr);
+}
+
+QMetaType::QMetaType(QtPrivate::QMetaTypeInterface *d) : d_ptr(d)
+{
+ if (d_ptr)
+ d_ptr->ref.ref();
+}
+
+QMetaType::QMetaType() : d_ptr(nullptr) {}
+
+QMetaType::QMetaType(const QMetaType &other) : QMetaType(other.d_ptr) {}
+QMetaType &QMetaType::operator=(const QMetaType &other)
+{
+ if (d_ptr != other.d_ptr) {
+ this->~QMetaType();
+ new (this) QMetaType(other.d_ptr);
+ }
+ return *this;
+}
/*!
\fn template<typename T> QMetaType QMetaType::fromType()
@@ -538,32 +728,26 @@ struct DefinedTypesFilter {
#define QT_ADD_STATIC_METATYPE_ALIASES_ITER(MetaTypeName, MetaTypeId, AliasingName, RealNameStr) \
{ RealNameStr, sizeof(RealNameStr) - 1, QMetaType::MetaTypeName },
-#define QT_ADD_STATIC_METATYPE_HACKS_ITER(MetaTypeName, TypeId, Name) \
- QT_ADD_STATIC_METATYPE(MetaTypeName, MetaTypeName, Name)
+
static const struct { const char * typeName; int typeNameLength; int type; } types[] = {
QT_FOR_EACH_STATIC_TYPE(QT_ADD_STATIC_METATYPE)
QT_FOR_EACH_STATIC_ALIAS_TYPE(QT_ADD_STATIC_METATYPE_ALIASES_ITER)
- QT_FOR_EACH_STATIC_HACKS_TYPE(QT_ADD_STATIC_METATYPE_HACKS_ITER)
+ QT_ADD_STATIC_METATYPE(_, QMetaTypeId2<qreal>::MetaType, qreal)
{nullptr, 0, QMetaType::UnknownType}
};
-Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeGuiHelper = nullptr;
-Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeWidgetsHelper = nullptr;
-Q_CORE_EXPORT const QMetaObject *qMetaObjectWidgetsHelper = nullptr;
+Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeGuiHelper = nullptr;
+Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeWidgetsHelper = nullptr;
-class QCustomTypeInfo : public QMetaTypeInterface
+static const QMetaTypeModuleHelper *qModuleHelperForType(int type)
{
-public:
- QCustomTypeInfo()
- : alias(-1)
- {
- QMetaTypeInterface empty = QT_METATYPE_INTERFACE_INIT(void);
- *static_cast<QMetaTypeInterface*>(this) = empty;
- }
- QByteArray typeName;
- int alias;
-};
+ if (type >= QMetaType::FirstGuiType && type <= QMetaType::LastGuiType)
+ return qMetaTypeGuiHelper;
+ else if (type >= QMetaType::FirstWidgetsType && type <= QMetaType::LastWidgetsType)
+ return qMetaTypeWidgetsHelper;
+ return nullptr;
+}
template<typename T, typename Key>
class QMetaTypeFunctionRegistry
@@ -615,12 +799,6 @@ QMetaTypeComparatorRegistry;
typedef QMetaTypeFunctionRegistry<QtPrivate::AbstractDebugStreamFunction,int>
QMetaTypeDebugStreamRegistry;
-Q_STATIC_ASSERT(std::is_trivial<QMetaTypeInterface>::value);
-Q_STATIC_ASSERT(std::is_standard_layout<QMetaTypeInterface>::value);
-
-Q_DECLARE_TYPEINFO(QCustomTypeInfo, Q_MOVABLE_TYPE);
-Q_GLOBAL_STATIC(QVector<QCustomTypeInfo>, customTypes)
-Q_GLOBAL_STATIC(QReadWriteLock, customTypesLock)
Q_GLOBAL_STATIC(QMetaTypeConverterRegistry, customTypesConversionRegistry)
Q_GLOBAL_STATIC(QMetaTypeComparatorRegistry, customTypesComparatorRegistry)
Q_GLOBAL_STATIC(QMetaTypeDebugStreamRegistry, customTypesDebugStreamRegistry)
@@ -863,13 +1041,11 @@ void QMetaType::registerStreamOperators(int idx, SaveOperator saveOp,
{
if (idx < User)
return; //builtin types should not be registered;
- QVector<QCustomTypeInfo> *ct = customTypes();
- if (!ct)
- return;
- QWriteLocker locker(customTypesLock());
- QCustomTypeInfo &inf = (*ct)[idx - User];
- inf.saveOp = saveOp;
- inf.loadOp = loadOp;
+
+ if (auto reg = customTypeRegistry()) {
+ QWriteLocker locker(&reg->lock);
+ reg->dataStreamOp[idx] = { saveOp, loadOp };
+ }
}
#endif // QT_NO_DATASTREAM
@@ -968,13 +1144,11 @@ const char *QMetaType::typeName(int typeId)
return nullptr; // It can happen when someone cast int to QVariant::Type, we should not crash...
}
- const QVector<QCustomTypeInfo> * const ct = customTypes();
- QReadLocker locker(customTypesLock());
- return ct && uint(ct->count()) > type - QMetaType::User && !ct->at(type - QMetaType::User).typeName.isEmpty()
- ? ct->at(type - QMetaType::User).typeName.constData()
- : nullptr;
-
-#undef QT_METATYPE_TYPEID_TYPENAME_CONVERTER
+ if (auto reg = customTypeRegistry()) {
+ if (auto ti = reg->getCustomType(typeId))
+ return ti->name;
+ }
+ return nullptr;
}
/*!
@@ -988,7 +1162,7 @@ const char *QMetaType::typeName(int typeId)
*/
QByteArray QMetaType::name() const
{
- return QMetaType::typeName(m_typeId);
+ return d_ptr ? d_ptr->name : nullptr;
}
/*
@@ -1007,338 +1181,40 @@ static inline int qMetaTypeStaticType(const char *typeName, int length)
/*
Similar to QMetaType::type(), but only looks in the custom set of
types, and doesn't lock the mutex.
- The extra \a firstInvalidIndex parameter is an easy way to avoid
- iterating over customTypes() a second time in registerNormalizedType().
-*/
-static int qMetaTypeCustomType_unlocked(const char *typeName, int length, int *firstInvalidIndex = nullptr)
-{
- const QVector<QCustomTypeInfo> * const ct = customTypes();
- if (!ct)
- return QMetaType::UnknownType;
-
- if (firstInvalidIndex)
- *firstInvalidIndex = -1;
- for (int v = 0; v < ct->count(); ++v) {
- const QCustomTypeInfo &customInfo = ct->at(v);
- if ((length == customInfo.typeName.size())
- && !memcmp(typeName, customInfo.typeName.constData(), length)) {
- if (customInfo.alias >= 0)
- return customInfo.alias;
- return v + QMetaType::User;
- }
- if (firstInvalidIndex && (*firstInvalidIndex < 0) && customInfo.typeName.isEmpty())
- *firstInvalidIndex = v;
- }
- return QMetaType::UnknownType;
-}
-
-/*!
- \internal
-
- This function is needed until existing code outside of qtbase
- has been changed to call the new version of registerType().
- */
-int QMetaType::registerType(const char *typeName, Deleter deleter,
- Creator creator)
-{
- return registerType(typeName, deleter, creator,
- QtMetaTypePrivate::QMetaTypeFunctionHelper<void>::Destruct,
- QtMetaTypePrivate::QMetaTypeFunctionHelper<void>::Construct, 0, TypeFlags(), nullptr);
-}
-
-/*!
- \internal
- \since 5.5
-
- Unregisters the user type with the given \a typeId and all its aliases.
- Returns \c true if the type was unregistered or \c false otherwise.
-
- This function was added for QML to be able to deregister types after
- they are unloaded to prevent an infinite increase in custom types for
- applications that are unloading/reloading components often.
- */
-bool QMetaType::unregisterType(int type)
-{
- QWriteLocker locker(customTypesLock());
- QVector<QCustomTypeInfo> *ct = customTypes();
-
- // check if user type
- if ((type < User) || ((type - User) >= ct->size()))
- return false;
-
- // only types without Q_DECLARE_METATYPE can be unregistered
- if (ct->data()[type - User].flags & WasDeclaredAsMetaType)
- return false;
-
- // invalidate type and all its alias entries
- for (int v = 0; v < ct->count(); ++v) {
- if (((v + User) == type) || (ct->at(v).alias == type))
- ct->data()[v].typeName.clear();
- }
- return true;
-}
-
-
-/*!
- \internal
- \since 5.0
-
- Registers a user type for marshalling, with \a typeName, a \a
- deleter, a \a creator, a \a destructor, a \a constructor, and
- a \a size. Returns the type's handle, or -1 if the type could
- not be registered.
- */
-int QMetaType::registerType(const char *typeName, Deleter deleter,
- Creator creator,
- Destructor destructor,
- Constructor constructor,
- int size, TypeFlags flags, const QMetaObject *metaObject)
-{
-#ifdef QT_NO_QOBJECT
- NS(QByteArray) normalizedTypeName = typeName;
-#else
- NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName);
-#endif
-
- return registerNormalizedType(normalizedTypeName, deleter, creator, destructor, constructor, size, flags, metaObject);
-}
-
-/*!
- \internal
- \since 5.12
-
- Registers a user type for marshalling, with \a typeName, a
- \a destructor, a \a constructor, and a \a size. Returns the
- type's handle, or -1 if the type could not be registered.
- */
-int QMetaType::registerType(const char *typeName,
- TypedDestructor destructor,
- TypedConstructor constructor,
- int size,
- TypeFlags flags,
- const QMetaObject *metaObject)
-{
-#ifdef QT_NO_QOBJECT
- NS(QByteArray) normalizedTypeName = typeName;
-#else
- NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName);
-#endif
-
- return registerNormalizedType(normalizedTypeName, destructor, constructor, size, flags, metaObject);
-}
-
-static int registerNormalizedType(const NS(QByteArray) &normalizedTypeName,
- QMetaType::Destructor destructor,
- QMetaType::Constructor constructor,
- QMetaType::TypedDestructor typedDestructor,
- QMetaType::TypedConstructor typedConstructor,
- int size, QMetaType::TypeFlags flags, const QMetaObject *metaObject)
+*/
+static int qMetaTypeCustomType_unlocked(const char *typeName, int length)
{
- QVector<QCustomTypeInfo> *ct = customTypes();
- if (!ct || normalizedTypeName.isEmpty() || (!destructor && !typedDestructor) || (!constructor && !typedConstructor))
- return -1;
-
- int idx = qMetaTypeStaticType(normalizedTypeName.constData(),
- normalizedTypeName.size());
-
- int previousSize = 0;
- QMetaType::TypeFlags::Int previousFlags = 0;
- if (idx == QMetaType::UnknownType) {
- QWriteLocker locker(customTypesLock());
- int posInVector = -1;
- idx = qMetaTypeCustomType_unlocked(normalizedTypeName.constData(),
- normalizedTypeName.size(),
- &posInVector);
- if (idx == QMetaType::UnknownType) {
- QCustomTypeInfo inf;
- inf.typeName = normalizedTypeName;
-#ifndef QT_NO_DATASTREAM
- inf.loadOp = nullptr;
- inf.saveOp = nullptr;
+ if (auto reg = customTypeRegistry()) {
+#if QT_CONFIG(thread)
+ Q_ASSERT(!reg->lock.tryLockForWrite());
#endif
- inf.alias = -1;
- inf.typedConstructor = typedConstructor;
- inf.typedDestructor = typedDestructor;
- inf.constructor = constructor;
- inf.destructor = destructor;
- inf.size = size;
- inf.flags = flags;
- inf.metaObject = metaObject;
- if (posInVector == -1) {
- idx = ct->size() + QMetaType::User;
- ct->append(inf);
- } else {
- idx = posInVector + QMetaType::User;
- ct->data()[posInVector] = inf;
- }
- return idx;
+ if (auto ti = reg->aliases.value(QByteArray(typeName, length), nullptr)) {
+ return ti->typeId;
}
-
- if (idx >= QMetaType::User) {
- previousSize = ct->at(idx - QMetaType::User).size;
- previousFlags = ct->at(idx - QMetaType::User).flags;
-
- // Set new/additional flags in case of old library/app.
- // Ensures that older code works in conjunction with new Qt releases
- // requiring the new flags.
- if (flags != previousFlags) {
- QCustomTypeInfo &inf = ct->data()[idx - QMetaType::User];
- inf.flags |= flags;
- if (metaObject)
- inf.metaObject = metaObject;
- }
- }
- }
-
- if (idx < QMetaType::User) {
- previousSize = QMetaType::sizeOf(idx);
- previousFlags = QMetaType::typeFlags(idx);
- }
-
- if (Q_UNLIKELY(previousSize != size)) {
- qFatal("QMetaType::registerType: Binary compatibility break "
- "-- Size mismatch for type '%s' [%i]. Previously registered "
- "size %i, now registering size %i.",
- normalizedTypeName.constData(), idx, previousSize, size);
}
-
- // these flags cannot change in a binary compatible way:
- const int binaryCompatibilityFlag = QMetaType::PointerToQObject | QMetaType::IsEnumeration | QMetaType::SharedPointerToQObject
- | QMetaType::WeakPointerToQObject | QMetaType::TrackingPointerToQObject;
- if (Q_UNLIKELY((previousFlags ^ flags) & binaryCompatibilityFlag)) {
-
- const char *msg = "QMetaType::registerType: Binary compatibility break. "
- "\nType flags for type '%s' [%i] don't match. Previously "
- "registered TypeFlags(0x%x), now registering TypeFlags(0x%x). ";
-
- qFatal(msg, normalizedTypeName.constData(), idx, previousFlags, int(flags));
- }
-
- return idx;
-}
-
-/*!
- \internal
- \since 5.0
- \overload
- Don't use, kept for binary compatibility
-
- ### TODO Qt6: remove me
-*/
-int QMetaType::registerNormalizedType(const NS(QByteArray) &normalizedTypeName, Deleter deleter,
- Creator creator,
- Destructor destructor,
- Constructor constructor,
- int size, TypeFlags flags, const QMetaObject *metaObject)
-{
- Q_UNUSED(deleter);
- Q_UNUSED(creator);
- return registerNormalizedType(normalizedTypeName, destructor, constructor, size, flags, metaObject);
-}
-
-
-/*!
- \internal
- \since 5.5
-
- Registers a user type for marshalling, with \a normalizedTypeName,
- a \a destructor, a \a constructor, and a \a size. Returns the type's
- handle, or -1 if the type could not be registered.
-
- \note normalizedTypeName is not checked for conformance with
- Qt's normalized format, so it must already conform.
-
- ### TODO Qt6: remove me
- */
-int QMetaType::registerNormalizedType(const NS(QByteArray) &normalizedTypeName,
- Destructor destructor,
- Constructor constructor,
- int size, TypeFlags flags, const QMetaObject *metaObject)
-{
- return NS(registerNormalizedType)(normalizedTypeName, destructor, constructor, nullptr, nullptr, size, flags, metaObject);
-}
-
-/*!
- \internal
- \since 5.12
-
- Registers a user type for marshalling, with \a normalizedTypeName,
- a \a destructor, a \a constructor, and a \a size. Returns the type's
- handle, or -1 if the type could not be registered.
-
- \note normalizedTypeName is not checked for conformance with
- Qt's normalized format, so it must already conform.
- */
-int QMetaType::registerNormalizedType(const NS(QByteArray) &normalizedTypeName,
- TypedDestructor destructor,
- TypedConstructor constructor,
- int size, TypeFlags flags, const QMetaObject *metaObject)
-{
- return NS(registerNormalizedType)(normalizedTypeName, nullptr, nullptr, destructor, constructor, size, flags, metaObject);
-}
-
-/*!
- \internal
- \since 4.7
-
- Registers a user type for marshalling, as an alias of another type (typedef)
-*/
-int QMetaType::registerTypedef(const char* typeName, int aliasId)
-{
-#ifdef QT_NO_QOBJECT
- NS(QByteArray) normalizedTypeName = typeName;
-#else
- NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName);
-#endif
-
- return registerNormalizedTypedef(normalizedTypeName, aliasId);
+ return QMetaType::UnknownType;
}
/*!
\internal
- \since 5.0
Registers a user type for marshalling, as an alias of another type (typedef).
Note that normalizedTypeName is not checked for conformance with Qt's normalized format,
so it must already conform.
*/
-int QMetaType::registerNormalizedTypedef(const NS(QByteArray) &normalizedTypeName, int aliasId)
+void QMetaType::registerNormalizedTypedef(const NS(QByteArray) & normalizedTypeName,
+ QMetaType metaType)
{
- QVector<QCustomTypeInfo> *ct = customTypes();
- if (!ct || normalizedTypeName.isEmpty())
- return -1;
-
- int idx = qMetaTypeStaticType(normalizedTypeName.constData(),
- normalizedTypeName.size());
-
- if (idx == UnknownType) {
- QWriteLocker locker(customTypesLock());
- int posInVector = -1;
- idx = qMetaTypeCustomType_unlocked(normalizedTypeName.constData(),
- normalizedTypeName.size(),
- &posInVector);
-
- if (idx == UnknownType) {
- QCustomTypeInfo inf;
- inf.typeName = normalizedTypeName;
- inf.alias = aliasId;
- if (posInVector == -1)
- ct->append(inf);
- else
- ct->data()[posInVector] = inf;
- return aliasId;
- }
- }
-
- if (idx != aliasId) {
- qWarning("QMetaType::registerTypedef: "
- "-- Type name '%s' previously registered as typedef of '%s' [%i], "
- "now registering as typedef of '%s' [%i].",
- normalizedTypeName.constData(), QMetaType::typeName(idx), idx,
- QMetaType::typeName(aliasId), aliasId);
+ if (!metaType.isValid())
+ return;
+ if (auto reg = customTypeRegistry()) {
+ QWriteLocker lock(&reg->lock);
+ auto &al = reg->aliases[normalizedTypeName];
+ if (al)
+ return;
+ al = metaType.d_ptr;
}
- return idx;
}
/*!
@@ -1349,16 +1225,7 @@ int QMetaType::registerNormalizedTypedef(const NS(QByteArray) &normalizedTypeNam
*/
bool QMetaType::isRegistered(int type)
{
- // predefined type
- if ((type >= FirstCoreType && type <= LastCoreType)
- || (type >= FirstGuiType && type <= LastGuiType)
- || (type >= FirstWidgetsType && type <= LastWidgetsType)) {
- return true;
- }
-
- QReadLocker locker(customTypesLock());
- const QVector<QCustomTypeInfo> * const ct = customTypes();
- return ((type >= User) && (ct && ct->count() > type - User) && !ct->at(type - User).typeName.isEmpty());
+ return QMetaType(type).isRegistered();
}
template <bool tryNormalizedType>
@@ -1368,7 +1235,7 @@ static inline int qMetaTypeTypeImpl(const char *typeName, int length)
return QMetaType::UnknownType;
int type = qMetaTypeStaticType(typeName, length);
if (type == QMetaType::UnknownType) {
- QReadLocker locker(customTypesLock());
+ QReadLocker locker(&customTypeRegistry()->lock);
type = qMetaTypeCustomType_unlocked(typeName, length);
#ifndef QT_NO_QOBJECT
if ((type == QMetaType::UnknownType) && tryNormalizedType) {
@@ -1423,7 +1290,6 @@ int QMetaType::type(const QT_PREPEND_NAMESPACE(QByteArray) &typeName)
}
#ifndef QT_NO_DATASTREAM
-
namespace
{
@@ -1467,30 +1333,29 @@ struct FilteredOperatorSwitch
return true;
}
};
+
template<typename T>
struct FilteredOperatorSwitch<T, /* IsAcceptedType = */ false>
{
- static const QMetaTypeInterface* getMetaTypeInterface(int type)
+ static const QMetaTypeModuleHelper *getMetaTypeInterface()
{
- if (QModulesPrivate::QTypeModuleInfo<T>::IsGui && qMetaTypeGuiHelper)
- return &qMetaTypeGuiHelper[type - QMetaType::FirstGuiType];
- else if (QModulesPrivate::QTypeModuleInfo<T>::IsWidget && qMetaTypeWidgetsHelper)
- return &qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType];
+ if (QModulesPrivate::QTypeModuleInfo<T>::IsGui)
+ return qMetaTypeGuiHelper;
+ else if (QModulesPrivate::QTypeModuleInfo<T>::IsWidget)
+ return qMetaTypeWidgetsHelper;
return nullptr;
}
static bool save(QDataStream &stream, const T *data, int type)
{
- if (auto interface = getMetaTypeInterface(type)) {
- interface->saveOp(stream, data);
- return true;
+ if (auto interface = getMetaTypeInterface()) {
+ return interface->save(stream, type, data);
}
return false;
}
static bool load(QDataStream &stream, T *data, int type)
{
- if (auto interface = getMetaTypeInterface(type)) {
- interface->loadOp(stream, data);
- return true;
+ if (auto interface = getMetaTypeInterface()) {
+ return interface->load(stream, type, data);
}
return false;
}
@@ -1525,17 +1390,17 @@ public:
}
bool delegate(const QMetaTypeSwitcher::NotBuiltinType *data)
{
- const QVector<QCustomTypeInfo> * const ct = customTypes();
+ auto ct = customTypeRegistry();
if (!ct)
return false;
- QMetaType::SaveOperator saveOp = nullptr;
+ QMetaType::SaveOperator op = nullptr;
{
- QReadLocker locker(customTypesLock());
- saveOp = ct->at(m_type - QMetaType::User).saveOp;
+ QReadLocker lock(&ct->lock);
+ op = ct->dataStreamOp.value(m_type).saveOp;
}
- if (!saveOp)
+ if (!op)
return false;
- saveOp(stream, data);
+ op(stream, data);
return true;
}
bool delegate(const void*) { return false; }
@@ -1576,17 +1441,17 @@ public:
}
bool delegate(const QMetaTypeSwitcher::NotBuiltinType *data)
{
- const QVector<QCustomTypeInfo> * const ct = customTypes();
+ auto ct = customTypeRegistry();
if (!ct)
return false;
- QMetaType::LoadOperator loadOp = nullptr;
+ QMetaType::LoadOperator op = nullptr;
{
- QReadLocker locker(customTypesLock());
- loadOp = ct->at(m_type - QMetaType::User).loadOp;
+ QReadLocker lock(&ct->lock);
+ op = ct->dataStreamOp.value(m_type).loadOp;
}
- if (!loadOp)
+ if (!op)
return false;
- loadOp(stream, const_cast<QMetaTypeSwitcher::NotBuiltinType*>(data));
+ op(stream, const_cast<QMetaTypeSwitcher::NotBuiltinType *>(data));
return true;
}
bool delegate(const void*) { return false; }
@@ -1647,10 +1512,7 @@ bool QMetaType::load(QDataStream &stream, int type, void *data)
*/
void *QMetaType::create(int type, const void *copy)
{
- QMetaType info(type);
- if (int size = info.sizeOf())
- return info.construct(operator new(size), copy);
- return nullptr;
+ return QMetaType(type).create(copy);
}
/*!
@@ -1660,73 +1522,9 @@ void *QMetaType::create(int type, const void *copy)
*/
void QMetaType::destroy(int type, void *data)
{
- QMetaType info(type);
- info.destruct(data);
- operator delete(data);
+ QMetaType(type).destroy(data);
}
-namespace {
-class TypeConstructor {
- template<typename T, bool IsAcceptedType = DefinedTypesFilter::Acceptor<T>::IsAccepted>
- struct ConstructorImpl {
- static void *Construct(const int /*type*/, void *where, const void *copy) { return QtMetaTypePrivate::QMetaTypeFunctionHelper<T>::Construct(where, copy); }
- };
- template<typename T>
- struct ConstructorImpl<T, /* IsAcceptedType = */ false> {
- static void *Construct(const int type, void *where, const void *copy)
- {
- if (QModulesPrivate::QTypeModuleInfo<T>::IsGui)
- return Q_LIKELY(qMetaTypeGuiHelper)
- ? qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].constructor(where, copy)
- : nullptr;
-
- if (QModulesPrivate::QTypeModuleInfo<T>::IsWidget)
- return Q_LIKELY(qMetaTypeWidgetsHelper)
- ? qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].constructor(where, copy)
- : nullptr;
-
- // This point can be reached only for known types that definition is not available, for example
- // in bootstrap mode. We have no other choice then ignore it.
- return nullptr;
- }
- };
-public:
- TypeConstructor(const int type, void *where)
- : m_type(type)
- , m_where(where)
- {}
-
- template<typename T>
- void *delegate(const T *copy) { return ConstructorImpl<T>::Construct(m_type, m_where, copy); }
- void *delegate(const void *) { return m_where; }
- void *delegate(const QMetaTypeSwitcher::UnknownType*) { return m_where; }
- void *delegate(const QMetaTypeSwitcher::NotBuiltinType *copy) { return customTypeConstructor(m_type, m_where, copy); }
-
-private:
- static void *customTypeConstructor(const int type, void *where, const void *copy)
- {
- QMetaType::Constructor ctor;
- QMetaType::TypedConstructor tctor;
- const QVector<QCustomTypeInfo> * const ct = customTypes();
- {
- QReadLocker locker(customTypesLock());
- if (Q_UNLIKELY(type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User))
- return nullptr;
- const auto &typeInfo = ct->at(type - QMetaType::User);
- ctor = typeInfo.constructor;
- tctor = typeInfo.typedConstructor;
- }
- Q_ASSERT_X((ctor || tctor) , "void *QMetaType::construct(int type, void *where, const void *copy)", "The type was not properly registered");
- if (Q_UNLIKELY(tctor))
- return tctor(type, where, copy);
- return ctor(where, copy);
- }
-
- const int m_type;
- void *m_where;
-};
-} // namespace
-
/*!
\since 5.0
@@ -1755,75 +1553,10 @@ private:
*/
void *QMetaType::construct(int type, void *where, const void *copy)
{
- if (!where)
- return nullptr;
- TypeConstructor constructor(type, where);
- return QMetaTypeSwitcher::switcher<void*>(constructor, type, copy);
+ return QMetaType(type).construct(where, copy);
}
-namespace {
-class TypeDestructor {
- template<typename T, bool IsAcceptedType = DefinedTypesFilter::Acceptor<T>::IsAccepted>
- struct DestructorImpl {
- static void Destruct(const int /* type */, void *where) { QtMetaTypePrivate::QMetaTypeFunctionHelper<T>::Destruct(where); }
- };
- template<typename T>
- struct DestructorImpl<T, /* IsAcceptedType = */ false> {
- static void Destruct(const int type, void *where)
- {
- if (QModulesPrivate::QTypeModuleInfo<T>::IsGui) {
- if (Q_LIKELY(qMetaTypeGuiHelper))
- qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].destructor(where);
- return;
- }
- if (QModulesPrivate::QTypeModuleInfo<T>::IsWidget) {
- if (Q_LIKELY(qMetaTypeWidgetsHelper))
- qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].destructor(where);
- return;
- }
- // This point can be reached only for known types that definition is not available, for example
- // in bootstrap mode. We have no other choice then ignore it.
- }
- };
-public:
- TypeDestructor(const int type)
- : m_type(type)
- {}
-
- template<typename T>
- void delegate(const T *where) { DestructorImpl<T>::Destruct(m_type, const_cast<T*>(where)); }
- // MSVC2013 and earlier can not const_cast a std::nullptr_t pointer.
- void delegate(const std::nullptr_t *) {}
- void delegate(const void *) {}
- void delegate(const QMetaTypeSwitcher::UnknownType*) {}
- void delegate(const QMetaTypeSwitcher::NotBuiltinType *where)
- { customTypeDestructor(m_type, const_cast<void *>(static_cast<const void *>(where))); }
-
-private:
- static void customTypeDestructor(const int type, void *where)
- {
- QMetaType::Destructor dtor;
- QMetaType::TypedDestructor tdtor;
- const QVector<QCustomTypeInfo> * const ct = customTypes();
- {
- QReadLocker locker(customTypesLock());
- if (Q_UNLIKELY(type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User))
- return;
- const auto &typeInfo = ct->at(type - QMetaType::User);
- dtor = typeInfo.destructor;
- tdtor = typeInfo.typedDestructor;
- }
- Q_ASSERT_X((dtor || tdtor), "void QMetaType::destruct(int type, void *where)", "The type was not properly registered");
- if (Q_UNLIKELY(tdtor))
- return tdtor(type, where);
- dtor(where);
- }
-
- const int m_type;
-};
-} // namespace
-
/*!
\since 5.0
@@ -1836,58 +1569,9 @@ private:
*/
void QMetaType::destruct(int type, void *where)
{
- if (!where)
- return;
- TypeDestructor destructor(type);
- QMetaTypeSwitcher::switcher<void>(destructor, type, where);
+ return QMetaType(type).destruct(where);
}
-
-namespace {
-class SizeOf {
- template<typename T, bool IsAcceptedType = DefinedTypesFilter::Acceptor<T>::IsAccepted>
- struct SizeOfImpl {
- static int Size(const int) { return QTypeInfo<T>::sizeOf; }
- };
- template<typename T>
- struct SizeOfImpl<T, /* IsAcceptedType = */ false> {
- static int Size(const int type)
- {
- if (QModulesPrivate::QTypeModuleInfo<T>::IsGui)
- return Q_LIKELY(qMetaTypeGuiHelper) ? qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].size : 0;
-
- if (QModulesPrivate::QTypeModuleInfo<T>::IsWidget)
- return Q_LIKELY(qMetaTypeWidgetsHelper) ? qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].size : 0;
-
- // This point can be reached only for known types that definition is not available, for example
- // in bootstrap mode. We have no other choice then ignore it.
- return 0;
- }
- };
-
-public:
- SizeOf(int type)
- : m_type(type)
- {}
-
- template<typename T>
- int delegate(const T*) { return SizeOfImpl<T>::Size(m_type); }
- int delegate(const QMetaTypeSwitcher::UnknownType*) { return 0; }
- int delegate(const QMetaTypeSwitcher::NotBuiltinType*) { return customTypeSizeOf(m_type); }
-private:
- static int customTypeSizeOf(const int type)
- {
- const QVector<QCustomTypeInfo> * const ct = customTypes();
- QReadLocker locker(customTypesLock());
- if (Q_UNLIKELY(type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User))
- return 0;
- return ct->at(type - QMetaType::User).size;
- }
-
- const int m_type;
-};
-} // namespace
-
/*!
\since 5.0
@@ -1901,61 +1585,9 @@ private:
*/
int QMetaType::sizeOf(int type)
{
- SizeOf sizeOf(type);
- return QMetaTypeSwitcher::switcher<int>(sizeOf, type);
+ return QMetaType(type).sizeOf();
}
-namespace {
-class Flags
-{
- template<typename T, bool IsAcceptedType = DefinedTypesFilter::Acceptor<T>::IsAccepted>
- struct FlagsImpl
- {
- static quint32 Flags(const int /* type */)
- {
- return QtPrivate::QMetaTypeTypeFlags<T>::Flags;
- }
- };
- template<typename T>
- struct FlagsImpl<T, /* IsAcceptedType = */ false>
- {
- static quint32 Flags(const int type)
- {
- if (QModulesPrivate::QTypeModuleInfo<T>::IsGui)
- return Q_LIKELY(qMetaTypeGuiHelper) ? qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].flags : 0;
-
- if (QModulesPrivate::QTypeModuleInfo<T>::IsWidget)
- return Q_LIKELY(qMetaTypeWidgetsHelper) ? qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].flags : 0;
-
- // This point can be reached only for known types that definition is not available, for example
- // in bootstrap mode. We have no other choice then ignore it.
- return 0;
- }
- };
-public:
- Flags(const int type)
- : m_type(type)
- {}
- template<typename T>
- quint32 delegate(const T*) { return FlagsImpl<T>::Flags(m_type); }
- quint32 delegate(const void*) { return 0; }
- quint32 delegate(const QMetaTypeSwitcher::UnknownType*) { return 0; }
- quint32 delegate(const QMetaTypeSwitcher::NotBuiltinType*) { return customTypeFlags(m_type); }
-private:
- const int m_type;
- static quint32 customTypeFlags(const int type)
- {
- const QVector<QCustomTypeInfo> * const ct = customTypes();
- if (Q_UNLIKELY(!ct || type < QMetaType::User))
- return 0;
- QReadLocker locker(customTypesLock());
- if (Q_UNLIKELY(ct->count() <= type - QMetaType::User))
- return 0;
- return ct->at(type - QMetaType::User).flags;
- }
-};
-} // namespace
-
/*!
\since 5.0
@@ -1965,61 +1597,9 @@ private:
*/
QMetaType::TypeFlags QMetaType::typeFlags(int type)
{
- Flags flags(type);
- return static_cast<QMetaType::TypeFlags>(QMetaTypeSwitcher::switcher<quint32>(flags, type));
+ return QMetaType(type).flags();
}
-#ifndef QT_BOOTSTRAPPED
-namespace {
-class MetaObject
-{
-public:
- MetaObject(const int type)
- : m_type(type)
- {}
-
- template<typename T, bool IsAcceptedType = DefinedTypesFilter::Acceptor<T>::IsAccepted>
- struct MetaObjectImpl
- {
- static const QMetaObject *MetaObject(int /*type*/)
- { return QtPrivate::MetaObjectForType<T>::value(); }
- };
- template<typename T>
- struct MetaObjectImpl<T, /* IsAcceptedType = */ false>
- {
- static const QMetaObject *MetaObject(int type) {
- if (QModulesPrivate::QTypeModuleInfo<T>::IsGui)
- return Q_LIKELY(qMetaTypeGuiHelper)
- ? qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].metaObject
- : nullptr;
- if (QModulesPrivate::QTypeModuleInfo<T>::IsWidget)
- return Q_LIKELY(qMetaTypeWidgetsHelper)
- ? qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].metaObject
- : nullptr;
- return nullptr;
- }
- };
-
- template <typename T>
- const QMetaObject *delegate(const T *) { return MetaObjectImpl<T>::MetaObject(m_type); }
- const QMetaObject *delegate(const void*) { return nullptr; }
- const QMetaObject *delegate(const QMetaTypeSwitcher::UnknownType*) { return nullptr; }
- const QMetaObject *delegate(const QMetaTypeSwitcher::NotBuiltinType*) { return customMetaObject(m_type); }
-private:
- const int m_type;
- static const QMetaObject *customMetaObject(const int type)
- {
- const QVector<QCustomTypeInfo> * const ct = customTypes();
- if (Q_UNLIKELY(!ct || type < QMetaType::User))
- return nullptr;
- QReadLocker locker(customTypesLock());
- if (Q_UNLIKELY(ct->count() <= type - QMetaType::User))
- return nullptr;
- return ct->at(type - QMetaType::User).metaObject;
- }
-};
-} // namespace
-#endif
/*!
\since 5.0
@@ -2030,13 +1610,7 @@ private:
*/
const QMetaObject *QMetaType::metaObjectForType(int type)
{
-#ifndef QT_BOOTSTRAPPED
- MetaObject mo(type);
- return QMetaTypeSwitcher::switcher<const QMetaObject*>(mo, type);
-#else
- Q_UNUSED(type);
- return nullptr;
-#endif
+ return QMetaType(type).metaObject();
}
/*!
@@ -2094,25 +1668,6 @@ const QMetaObject *QMetaType::metaObjectForType(int type)
\sa qRegisterMetaType(), QMetaType::isRegistered(), Q_DECLARE_METATYPE()
*/
-/*! \typedef QMetaType::Deleter
- \internal
-*/
-/*! \typedef QMetaType::Creator
- \internal
-*/
-/*! \typedef QMetaType::SaveOperator
- \internal
-*/
-/*! \typedef QMetaType::LoadOperator
- \internal
-*/
-/*! \typedef QMetaType::Destructor
- \internal
-*/
-/*! \typedef QMetaType::Constructor
- \internal
-*/
-
/*!
\fn int qRegisterMetaType()
\relates QMetaType
@@ -2169,85 +1724,24 @@ const QMetaObject *QMetaType::metaObjectForType(int type)
\sa Q_DECLARE_METATYPE(), QMetaType::type()
*/
-namespace {
-class TypeInfo {
- template<typename T, bool IsAcceptedType = DefinedTypesFilter::Acceptor<T>::IsAccepted>
- struct TypeInfoImpl
- {
- TypeInfoImpl(const uint /* type */, QMetaTypeInterface &info)
- {
- QMetaTypeInterface tmp = QT_METATYPE_INTERFACE_INIT_NO_DATASTREAM(T);
- info = tmp;
- }
- };
-
- template<typename T>
- struct TypeInfoImpl<T, /* IsAcceptedType = */ false>
- {
- TypeInfoImpl(const uint type, QMetaTypeInterface &info)
- {
- if (QModulesPrivate::QTypeModuleInfo<T>::IsGui) {
- if (Q_LIKELY(qMetaTypeGuiHelper))
- info = qMetaTypeGuiHelper[type - QMetaType::FirstGuiType];
- return;
- }
- if (QModulesPrivate::QTypeModuleInfo<T>::IsWidget) {
- if (Q_LIKELY(qMetaTypeWidgetsHelper))
- info = qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType];
- return;
- }
- }
- };
-public:
- QMetaTypeInterface info;
- TypeInfo(const uint type)
- : m_type(type)
- {
- QMetaTypeInterface tmp = QT_METATYPE_INTERFACE_INIT_EMPTY();
- info = tmp;
+static QtPrivate::QMetaTypeInterface *interfaceForType(int typeId)
+{
+ if (typeId >= QMetaType::User) {
+ if (auto reg = customTypeRegistry())
+ return reg->getCustomType(typeId);
}
- template<typename T>
- void delegate(const T*) { TypeInfoImpl<T>(m_type, info); }
- void delegate(const QMetaTypeSwitcher::UnknownType*) {}
- void delegate(const QMetaTypeSwitcher::NotBuiltinType*) { customTypeInfo(m_type); }
-private:
- void customTypeInfo(const uint type)
- {
- const QVector<QCustomTypeInfo> * const ct = customTypes();
- if (Q_UNLIKELY(!ct))
- return;
- QReadLocker locker(customTypesLock());
- if (Q_LIKELY(uint(ct->count()) > type - QMetaType::User))
- info = ct->at(type - QMetaType::User);
+ if (auto moduleHelper = qModuleHelperForType(typeId))
+ return moduleHelper->interfaceForType(typeId);
+
+ switch (typeId) {
+ QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_METATYPE_CONVERT_ID_TO_TYPE)
+ QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_METATYPE_CONVERT_ID_TO_TYPE)
+ QT_FOR_EACH_STATIC_CORE_CLASS(QT_METATYPE_CONVERT_ID_TO_TYPE)
+ QT_FOR_EACH_STATIC_CORE_POINTER(QT_METATYPE_CONVERT_ID_TO_TYPE)
+ QT_FOR_EACH_STATIC_CORE_TEMPLATE(QT_METATYPE_CONVERT_ID_TO_TYPE)
+ default:
+ return nullptr;
}
-
- const uint m_type;
-};
-} // namespace
-
-/*!
- \fn QMetaType QMetaType::typeInfo(const int type)
- \internal
-*/
-QMetaType QMetaType::typeInfo(const int type)
-{
- TypeInfo typeInfo(type);
- QMetaTypeSwitcher::switcher<void>(typeInfo, type);
- return (typeInfo.info.constructor || typeInfo.info.typedConstructor)
- ? QMetaType(static_cast<ExtensionFlag>(QMetaType::CreateEx | QMetaType::DestroyEx |
- (typeInfo.info.typedConstructor ? QMetaType::ConstructEx | QMetaType::DestructEx : 0))
- , static_cast<const QMetaTypeInterface *>(nullptr) // typeInfo::info is a temporary variable, we can't return address of it.
- , typeInfo.info.typedConstructor
- , typeInfo.info.typedDestructor
- , typeInfo.info.saveOp
- , typeInfo.info.loadOp
- , typeInfo.info.constructor
- , typeInfo.info.destructor
- , typeInfo.info.size
- , typeInfo.info.flags
- , type
- , typeInfo.info.metaObject)
- : QMetaType(UnknownType);
}
/*!
@@ -2258,212 +1752,24 @@ QMetaType QMetaType::typeInfo(const int type)
\note The default parameter was added in Qt 5.15.
*/
-QMetaType::QMetaType(const int typeId)
- : m_typeId(typeId)
-{
- if (Q_UNLIKELY(typeId == UnknownType)) {
- // Constructs invalid QMetaType instance.
- m_extensionFlags = 0xffffffff;
- Q_ASSERT(!isValid());
- } else {
- // TODO it can be better.
- *this = QMetaType::typeInfo(typeId);
- if (m_typeId == UnknownType)
- m_extensionFlags = 0xffffffff;
- else if (m_typeId == QMetaType::Void)
- m_extensionFlags = CreateEx | DestroyEx | ConstructEx | DestructEx;
- }
-}
-
-/*!
- \fn QMetaType::QMetaType(const QMetaType &other)
- \since 5.0
-
- Copy constructs a QMetaType object.
-*/
-QMetaType::QMetaType(const QMetaType &other)
- : m_typedConstructor(other.m_typedConstructor)
- , m_typedDestructor(other.m_typedDestructor)
- , m_saveOp(other.m_saveOp)
- , m_loadOp(other.m_loadOp)
- , m_constructor(other.m_constructor)
- , m_destructor(other.m_destructor)
- , m_extension(other.m_extension) // space reserved for future use
- , m_size(other.m_size)
- , m_typeFlags(other.m_typeFlags)
- , m_extensionFlags(other.m_extensionFlags)
- , m_typeId(other.m_typeId)
- , m_metaObject(other.m_metaObject)
-{}
-
-QMetaType &QMetaType::operator =(const QMetaType &other)
-{
- m_typedConstructor = other.m_typedConstructor;
- m_typedDestructor = other.m_typedDestructor;
- m_saveOp = other.m_saveOp;
- m_loadOp = other.m_loadOp;
- m_constructor = other.m_constructor;
- m_destructor = other.m_destructor;
- m_size = other.m_size;
- m_typeFlags = other.m_typeFlags;
- m_extensionFlags = other.m_extensionFlags;
- m_extension = other.m_extension; // space reserved for future use
- m_typeId = other.m_typeId;
- m_metaObject = other.m_metaObject;
- return *this;
-}
-
-/*!
- \fn void QMetaType::ctor(const QMetaTypeInterface *info)
- \internal
-
- Method used for future binary compatible extensions. The function may be
- called from within QMetaType's constructor to force a library call from
- inlined code.
-*/
-void QMetaType::ctor(const QMetaTypeInterface *info)
-{
- // Special case for Void type, the type is valid but not constructible.
- // In future we may consider to remove this assert and extend this function to initialize
- // differently m_extensionFlags for different types. Currently it is not needed.
- Q_ASSERT(m_typeId == QMetaType::Void);
- Q_UNUSED(info);
- m_extensionFlags = CreateEx | DestroyEx | ConstructEx | DestructEx;
-}
-
-/*!
- \fn void QMetaType::dtor()
- \internal
-
- Method used for future binary compatible extensions. The function may be
- called from within QMetaType's destructor to force a library call from
- inlined code.
-*/
-void QMetaType::dtor()
-{}
-
-/*!
- \fn void *QMetaType::createExtended(const void *copy) const
- \internal
-
- Method used for future binary compatible extensions. The function may be called
- during QMetaType::create to force library call from inlined code.
-
- ### TODO Qt6 remove the extension
-*/
-void *QMetaType::createExtended(const void *copy) const
-{
- if (m_typeId == QMetaType::UnknownType)
- return nullptr;
- if (Q_UNLIKELY(m_typedConstructor && !m_constructor))
- return m_typedConstructor(m_typeId, operator new(m_size), copy);
- return m_constructor(operator new(m_size), copy);
-}
-
-/*!
- \fn void QMetaType::destroyExtended(void *data) const
- \internal
-
- Method used for future binary compatible extensions. The function may be called
- during QMetaType::destroy to force library call from inlined code.
-
- ### TODO Qt6 remove the extension
-*/
-void QMetaType::destroyExtended(void *data) const
-{
- if (m_typeId == QMetaType::UnknownType)
- return;
- if (Q_UNLIKELY(m_typedDestructor && !m_destructor))
- m_typedDestructor(m_typeId, data);
- else
- m_destructor(data);
- operator delete(data);
-}
-
-/*!
- \fn void *QMetaType::constructExtended(void *where, const void *copy) const
- \internal
-
- Method used for future binary compatible extensions. The function may be called
- during QMetaType::construct to force library call from inlined code.
-*/
-void *QMetaType::constructExtended(void *where, const void *copy) const
-{
- if (m_typeId == QMetaType::UnknownType)
- return nullptr;
- if (m_typedConstructor && !m_constructor)
- return m_typedConstructor(m_typeId, where, copy);
- return nullptr;
-}
-
-/*!
- \fn void QMetaType::destructExtended(void *data) const
- \internal
-
- Method used for future binary compatible extensions. The function may be called
- during QMetaType::destruct to force library call from inlined code.
-*/
-void QMetaType::destructExtended(void *data) const
-{
- if (m_typeId == QMetaType::UnknownType)
- return;
- if (m_typedDestructor && !m_destructor)
- m_typedDestructor(m_typeId, data);
-}
-
-/*!
- \fn uint QMetaType::sizeExtended() const
- \internal
-
- Method used for future binary compatible extensions. The function may be
- called from within QMetaType::size to force a library call from
- inlined code.
-*/
-uint QMetaType::sizeExtended() const
-{
- return 0;
-}
-
-/*!
- \fn QMetaType::TypeFlags QMetaType::flagsExtended() const
- \internal
-
- Method used for future binary compatible extensions. The function may be
- called from within QMetaType::flags to force a library call from
- inlined code.
-*/
-QMetaType::TypeFlags QMetaType::flagsExtended() const
-{
- return { };
-}
-
-/*!
- \brief QMetaType::metaObjectExtended
- \internal
-
- Method used for future binary compatible extensions. The function may be
- called from within QMetaType::metaObject to force a library call from
- inlined code.
-*/
-const QMetaObject *QMetaType::metaObjectExtended() const
-{
- return nullptr;
-}
-
-
-namespace QtPrivate
-{
-const QMetaObject *metaObjectForQWidget()
-{
- if (!qMetaTypeWidgetsHelper)
- return nullptr;
- return qMetaObjectWidgetsHelper;
-}
-}
+QMetaType::QMetaType(int typeId) : QMetaType(interfaceForType(typeId)) {}
namespace QtMetaTypePrivate {
const bool VectorBoolElements::true_element = true;
const bool VectorBoolElements::false_element = false;
}
+namespace QtPrivate {
+#ifndef QT_BOOTSTRAPPED
+// Explicit instantiation definition
+#define QT_METATYPE_DECLARE_TEMPLATE_ITER(TypeName, Id, Name) template class QMetaTypeForType<Name>;
+QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_METATYPE_DECLARE_TEMPLATE_ITER)
+QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_METATYPE_DECLARE_TEMPLATE_ITER)
+QT_FOR_EACH_STATIC_CORE_CLASS(QT_METATYPE_DECLARE_TEMPLATE_ITER)
+QT_FOR_EACH_STATIC_CORE_POINTER(QT_METATYPE_DECLARE_TEMPLATE_ITER)
+QT_FOR_EACH_STATIC_CORE_TEMPLATE(QT_METATYPE_DECLARE_TEMPLATE_ITER)
+#undef QT_METATYPE_DECLARE_TEMPLATE_ITER
+#endif
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index 7c22ff1693..e956d497e9 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -46,11 +46,13 @@
#include <QtCore/qatomic.h>
#include <QtCore/qbytearray.h>
#include <QtCore/qvarlengtharray.h>
+#include <QtCore/qrefcount.h>
#ifndef QT_NO_QOBJECT
#include <QtCore/qobjectdefs.h>
#endif
-#include <new>
+#include <array>
+#include <new>
#include <vector>
#include <list>
#include <map>
@@ -109,6 +111,13 @@ inline Q_DECL_CONSTEXPR int qMetaTypeId();
#define QT_FOR_EACH_STATIC_ITEMMODEL_CLASS(F)
#endif
+#if QT_CONFIG(regularexpression)
+# define QT_FOR_EACH_STATIC_REGULAR_EXPRESSION(F) \
+ F(QRegularExpression, 44, QRegularExpression)
+#else
+# define QT_FOR_EACH_STATIC_REGULAR_EXPRESSION(F)
+#endif
+
#define QT_FOR_EACH_STATIC_CORE_CLASS(F)\
F(QChar, 7, QChar) \
F(QString, 10, QString) \
@@ -132,7 +141,7 @@ inline Q_DECL_CONSTEXPR int qMetaTypeId();
QT_FOR_EACH_STATIC_EASINGCURVE(F) \
F(QUuid, 30, QUuid) \
F(QVariant, 41, QVariant) \
- F(QRegularExpression, 44, QRegularExpression) \
+ QT_FOR_EACH_STATIC_REGULAR_EXPRESSION(F) \
F(QJsonValue, 45, QJsonValue) \
F(QJsonObject, 46, QJsonObject) \
F(QJsonArray, 47, QJsonArray) \
@@ -151,6 +160,13 @@ inline Q_DECL_CONSTEXPR int qMetaTypeId();
F(QVariantHash, 28, QVariantHash) \
F(QByteArrayList, 49, QByteArrayList) \
+#if QT_CONFIG(shortcut)
+#define QT_FOR_EACH_STATIC_KEYSEQUENCE_CLASS(F)\
+ F(QKeySequence, 75, QKeySequence)
+#else
+#define QT_FOR_EACH_STATIC_KEYSEQUENCE_CLASS(F)
+#endif
+
#define QT_FOR_EACH_STATIC_GUI_CLASS(F)\
F(QFont, 64, QFont) \
F(QPixmap, 65, QPixmap) \
@@ -163,11 +179,10 @@ inline Q_DECL_CONSTEXPR int qMetaTypeId();
F(QRegion, 72, QRegion) \
F(QBitmap, 73, QBitmap) \
F(QCursor, 74, QCursor) \
- F(QKeySequence, 75, QKeySequence) \
+ QT_FOR_EACH_STATIC_KEYSEQUENCE_CLASS(F) \
F(QPen, 76, QPen) \
F(QTextLength, 77, QTextLength) \
F(QTextFormat, 78, QTextFormat) \
- F(QMatrix, 79, QMatrix) \
F(QTransform, 80, QTransform) \
F(QMatrix4x4, 81, QMatrix4x4) \
F(QVector2D, 82, QVector2D) \
@@ -181,10 +196,6 @@ inline Q_DECL_CONSTEXPR int qMetaTypeId();
#define QT_FOR_EACH_STATIC_WIDGETS_CLASS(F)\
F(QSizePolicy, 121, QSizePolicy) \
-// ### FIXME kill that set
-#define QT_FOR_EACH_STATIC_HACKS_TYPE(F)\
- F(QMetaTypeId2<qreal>::MetaType, -1, qreal)
-
// F is a tuple: (QMetaType::TypeName, QMetaType::TypeNameID, AliasingType, "RealType")
#define QT_FOR_EACH_STATIC_ALIAS_TYPE(F)\
F(ULong, -1, ulong, "unsigned long") \
@@ -201,10 +212,11 @@ inline Q_DECL_CONSTEXPR int qMetaTypeId();
F(UInt, -1, uint, "quint32") \
F(LongLong, -1, qlonglong, "qint64") \
F(ULongLong, -1, qulonglong, "quint64") \
+ F(QVariantList, -1, QVariantList, "QVector<QVariant>") \
F(QVariantList, -1, QVariantList, "QList<QVariant>") \
F(QVariantMap, -1, QVariantMap, "QMap<QString,QVariant>") \
F(QVariantHash, -1, QVariantHash, "QHash<QString,QVariant>") \
- F(QByteArrayList, -1, QByteArrayList, "QList<QByteArray>") \
+ F(QByteArrayList, -1, QByteArrayList, "QVector<QByteArray>") \
#define QT_FOR_EACH_STATIC_TYPE(F)\
QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(F)\
@@ -219,7 +231,6 @@ inline Q_DECL_CONSTEXPR int qMetaTypeId();
TypeName = Id,
#define QT_FOR_EACH_AUTOMATIC_TEMPLATE_1ARG(F) \
- F(QList) \
F(QVector) \
F(QQueue) \
F(QStack) \
@@ -242,6 +253,9 @@ struct QMetaObject;
namespace QtPrivate
{
+
+class QMetaTypeInterface;
+
/*!
This template is used for implicit conversion from type From to type To.
\internal
@@ -421,13 +435,6 @@ struct ConverterFunctor : public AbstractConverterFunction
}
class Q_CORE_EXPORT QMetaType {
- enum ExtensionFlag { NoExtensionFlags,
- CreateEx = 0x1, DestroyEx = 0x2,
- ConstructEx = 0x4, DestructEx = 0x8,
- NameEx = 0x10, SizeEx = 0x20,
- CtorEx = 0x40, DtorEx = 0x80,
- FlagsEx = 0x100, MetaObjectEx = 0x200
- };
public:
#ifndef Q_CLANG_QDOC
// The code that actually gets compiled.
@@ -472,7 +479,7 @@ public:
QFont = 64, QPixmap = 65, QBrush = 66, QColor = 67, QPalette = 68,
QIcon = 69, QImage = 70, QPolygon = 71, QRegion = 72, QBitmap = 73,
QCursor = 74, QKeySequence = 75, QPen = 76, QTextLength = 77, QTextFormat = 78,
- QMatrix = 79, QTransform = 80, QMatrix4x4 = 81, QVector2D = 82,
+ QTransform = 80, QMatrix4x4 = 81, QVector2D = 82,
QVector3D = 83, QVector4D = 84, QQuaternion = 85, QPolygonF = 86, QColorSpace = 87,
// Widget types
@@ -494,20 +501,11 @@ public:
TrackingPointerToQObject = 0x80,
WasDeclaredAsMetaType = 0x100,
IsGadget = 0x200,
- PointerToGadget = 0x400
+ PointerToGadget = 0x400,
+ IsPointer = 0x800,
};
Q_DECLARE_FLAGS(TypeFlags, TypeFlag)
- typedef void (*Deleter)(void *);
- typedef void *(*Creator)(const void *);
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- typedef void (*Destructor)(void *);
- typedef void *(*Constructor)(void *, const void *); // TODO Qt6: remove me
-#endif
- typedef void (*TypedDestructor)(int, void *);
- typedef void *(*TypedConstructor)(int, void *, const void *);
-
typedef void (*SaveOperator)(QDataStream &, const void *);
typedef void (*LoadOperator)(QDataStream &, void *);
#ifndef QT_NO_DATASTREAM
@@ -516,41 +514,8 @@ public:
static void registerStreamOperators(int type, SaveOperator saveOp,
LoadOperator loadOp);
#endif
- static int registerType(const char *typeName, Deleter deleter,
- Creator creator);
- static int registerType(const char *typeName, Deleter deleter,
- Creator creator,
- Destructor destructor,
- Constructor constructor,
- int size,
- QMetaType::TypeFlags flags,
- const QMetaObject *metaObject);
- static int registerType(const char *typeName,
- TypedDestructor destructor,
- TypedConstructor constructor,
- int size,
- QMetaType::TypeFlags flags,
- const QMetaObject *metaObject);
- static bool unregisterType(int type);
- static int registerNormalizedType(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName, Deleter deleter,
- Creator creator,
- Destructor destructor,
- Constructor constructor,
- int size,
- QMetaType::TypeFlags flags,
- const QMetaObject *metaObject);
- static int registerNormalizedType(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName, Destructor destructor,
- Constructor constructor,
- int size,
- QMetaType::TypeFlags flags,
- const QMetaObject *metaObject);
- static int registerNormalizedType(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName, TypedDestructor destructor,
- TypedConstructor constructor,
- int size,
- QMetaType::TypeFlags flags,
- const QMetaObject *metaObject);
- static int registerTypedef(const char *typeName, int aliasId);
- static int registerNormalizedTypedef(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName, int aliasId);
+ static void registerNormalizedTypedef(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName, QMetaType type);
+
static int type(const char *typeName);
static int type(const QT_PREPEND_NAMESPACE(QByteArray) &typeName);
@@ -560,10 +525,6 @@ public:
static const QMetaObject *metaObjectForType(int type);
static bool isRegistered(int type);
static void *create(int type, const void *copy = nullptr);
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED static void *construct(int type, const void *copy = nullptr)
- { return create(type, copy); }
-#endif
static void destroy(int type, void *data);
static void *construct(int type, void *where, const void *copy);
static void destruct(int type, void *where);
@@ -573,32 +534,37 @@ public:
static bool load(QDataStream &stream, int type, void *data);
#endif
- explicit QMetaType(const int type = QMetaType::UnknownType); // ### Qt6: drop const
- inline ~QMetaType();
+ explicit QMetaType(int type);
+ explicit QMetaType(QtPrivate::QMetaTypeInterface *d);
+ QMetaType();
+ ~QMetaType();
+ QMetaType(const QMetaType &other);
+ QMetaType &operator=(const QMetaType &);
+ QMetaType(QMetaType &&other) : d_ptr(other.d_ptr) { other.d_ptr = nullptr; }
+ QMetaType &operator=(QMetaType &&other)
+ {
+ qSwap(d_ptr, other.d_ptr);
+ return *this;
+ }
- inline bool isValid() const;
- inline bool isRegistered() const;
- inline int id() const;
- inline int sizeOf() const;
- inline TypeFlags flags() const;
- inline const QMetaObject *metaObject() const;
+ bool isValid() const;
+ bool isRegistered() const;
+ int id() const;
+ int sizeOf() const;
+ TypeFlags flags() const;
+ const QMetaObject *metaObject() const;
QT_PREPEND_NAMESPACE(QByteArray) name() const;
- inline void *create(const void *copy = nullptr) const;
- inline void destroy(void *data) const;
- inline void *construct(void *where, const void *copy = nullptr) const;
- inline void destruct(void *data) const;
+ void *create(const void *copy = nullptr) const;
+ void destroy(void *data) const;
+ void *construct(void *where, const void *copy = nullptr) const;
+ void destruct(void *data) const;
template<typename T>
- static QMetaType fromType()
- { return QMetaType(qMetaTypeId<T>()); }
-
- friend bool operator==(const QMetaType &a, const QMetaType &b)
- { return a.m_typeId == b.m_typeId; }
-
- friend bool operator!=(const QMetaType &a, const QMetaType &b)
- { return a.m_typeId != b.m_typeId; }
+ static QMetaType fromType();
+ friend bool operator==(const QMetaType &a, const QMetaType &b) { return a.id() == b.id(); }
+ friend bool operator!=(const QMetaType &a, const QMetaType &b) { return !(a == b); }
public:
template<typename T>
@@ -716,41 +682,11 @@ public:
static bool hasRegisteredConverterFunction(int fromTypeId, int toTypeId);
-private:
- static QMetaType typeInfo(const int type);
- inline QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeInterface *info,
- TypedConstructor creator,
- TypedDestructor deleter,
- SaveOperator saveOp,
- LoadOperator loadOp,
- Constructor constructor,
- Destructor destructor,
- uint sizeOf,
- uint theTypeFlags,
- int typeId,
- const QMetaObject *metaObject);
- QMetaType(const QMetaType &other);
- QMetaType &operator =(const QMetaType &);
- inline bool isExtended(const ExtensionFlag flag) const { return m_extensionFlags & flag; }
-
- // Methods used for future binary compatible extensions
- void ctor(const QMetaTypeInterface *info);
- void dtor();
- uint sizeExtended() const;
- QMetaType::TypeFlags flagsExtended() const;
- const QMetaObject *metaObjectExtended() const;
- void *createExtended(const void *copy = nullptr) const;
- void destroyExtended(void *data) const;
- void *constructExtended(void *where, const void *copy = nullptr) const;
- void destructExtended(void *data) const;
-
static bool registerComparatorFunction(const QtPrivate::AbstractComparatorFunction *f, int type);
#ifndef QT_NO_DEBUG_STREAM
static bool registerDebugStreamOperatorFunction(const QtPrivate::AbstractDebugStreamFunction *f, int type);
#endif
-// ### Qt6: FIXME: Remove the special Q_CC_MSVC handling, it was introduced to maintain BC.
-#if !defined(Q_NO_TEMPLATE_FRIENDS) && !defined(Q_CC_MSVC)
#ifndef Q_CLANG_QDOC
template<typename, bool> friend struct QtPrivate::ValueTypeIsMetaType;
template<typename, typename> friend struct QtPrivate::ConverterMemberFunction;
@@ -760,25 +696,11 @@ private:
template<typename, bool> friend struct QtPrivate::IsMetaTypePair;
template<typename, typename> friend struct QtPrivate::MetaTypeSmartPointerHelper;
#endif
-#else
-public:
-#endif
static bool registerConverterFunction(const QtPrivate::AbstractConverterFunction *f, int from, int to);
static void unregisterConverterFunction(int from, int to);
private:
-
- TypedConstructor m_typedConstructor;
- TypedDestructor m_typedDestructor;
- SaveOperator m_saveOp;
- LoadOperator m_loadOp;
- Constructor m_constructor;
- Destructor m_destructor;
- void *m_extension; // space reserved for future use
- uint m_size;
- uint m_typeFlags;
- uint m_extensionFlags;
- int m_typeId;
- const QMetaObject *m_metaObject;
+ friend class QVariant;
+ QtPrivate::QMetaTypeInterface *d_ptr = nullptr;
};
#undef QT_DEFINE_METATYPE_ID
@@ -1052,10 +974,6 @@ struct ContainerAPI : CapabilitiesImpl<T>
};
template<typename T>
-struct ContainerAPI<QList<T> > : CapabilitiesImpl<QList<T> >
-{ static int size(const QList<T> *t) { return t->size(); } };
-
-template<typename T>
struct ContainerAPI<QVector<T> > : CapabilitiesImpl<QVector<T> >
{ static int size(const QVector<T> *t) { return t->size(); } };
@@ -1085,7 +1003,7 @@ public:
// uint _iteratorCapabilities:4;
// uint _revision:3;
// uint _containerCapabilities:4;
- // uint _unused:21;*/
+ // uint _unused:21;
typedef int(*sizeFunc)(const void *p);
typedef const void * (*atFunc)(const void *p, int);
typedef void (*moveIteratorFunc)(const void *p, void **);
@@ -1577,33 +1495,38 @@ namespace QtPrivate
template<typename T, typename Enable = void>
struct MetaObjectForType
{
- static inline const QMetaObject *value() { return nullptr; }
+ static constexpr inline const QMetaObject *value() { return nullptr; }
};
+#ifndef QT_NO_QOBJECT
template<>
struct MetaObjectForType<void>
{
- static inline const QMetaObject *value() { return nullptr; }
+ static constexpr inline const QMetaObject *value() { return nullptr; }
};
template<typename T>
struct MetaObjectForType<T*, typename std::enable_if<IsPointerToTypeDerivedFromQObject<T*>::Value>::type>
{
- static inline const QMetaObject *value() { return &T::staticMetaObject; }
+ static constexpr inline const QMetaObject *value() { return &T::staticMetaObject; }
};
template<typename T>
struct MetaObjectForType<T, typename std::enable_if<IsGadgetHelper<T>::IsGadgetOrDerivedFrom>::type>
{
- static inline const QMetaObject *value() { return &T::staticMetaObject; }
+ static constexpr inline const QMetaObject *value() { return &T::staticMetaObject; }
};
template<typename T>
struct MetaObjectForType<T, typename std::enable_if<IsPointerToGadgetHelper<T>::IsGadgetOrDerivedFrom>::type>
{
- static inline const QMetaObject *value() { return &IsPointerToGadgetHelper<T>::BaseType::staticMetaObject; }
+ static constexpr inline const QMetaObject *value()
+ {
+ return &IsPointerToGadgetHelper<T>::BaseType::staticMetaObject;
+ }
};
template<typename T>
struct MetaObjectForType<T, typename std::enable_if<IsQEnumHelper<T>::Value>::type >
{
- static inline const QMetaObject *value() { return qt_getEnumMetaObject(T()); }
+ static constexpr inline const QMetaObject *value() { return qt_getEnumMetaObject(T()); }
};
+#endif
template<typename T>
struct IsSharedPointerToTypeDerivedFromQObject
@@ -1810,6 +1733,7 @@ namespace QtPrivate {
| (std::is_enum<T>::value ? QMetaType::IsEnumeration : 0)
| (IsGadgetHelper<T>::IsGadgetOrDerivedFrom ? QMetaType::IsGadget : 0)
| (IsPointerToGadgetHelper<T>::IsGadgetOrDerivedFrom ? QMetaType::PointerToGadget : 0)
+ | (QTypeInfo<T>::isPointer ? QMetaType::IsPointer : 0)
};
};
@@ -1846,31 +1770,20 @@ namespace QtPrivate {
template <typename T>
int qRegisterNormalizedMetaType(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName
#ifndef Q_CLANG_QDOC
- , T * dummy = 0
- , typename QtPrivate::MetaTypeDefinedHelper<T, QMetaTypeId2<T>::Defined && !QMetaTypeId2<T>::IsBuiltIn>::DefinedType defined = QtPrivate::MetaTypeDefinedHelper<T, QMetaTypeId2<T>::Defined && !QMetaTypeId2<T>::IsBuiltIn>::Defined
+ , T * = 0
+ , typename QtPrivate::MetaTypeDefinedHelper<T, QMetaTypeId2<T>::Defined && !QMetaTypeId2<T>::IsBuiltIn>::DefinedType = QtPrivate::MetaTypeDefinedHelper<T, QMetaTypeId2<T>::Defined && !QMetaTypeId2<T>::IsBuiltIn>::Defined
#endif
)
{
#ifndef QT_NO_QOBJECT
Q_ASSERT_X(normalizedTypeName == QMetaObject::normalizedType(normalizedTypeName.constData()), "qRegisterNormalizedMetaType", "qRegisterNormalizedMetaType was called with a not normalized type name, please call qRegisterMetaType instead.");
#endif
- const int typedefOf = dummy ? -1 : QtPrivate::QMetaTypeIdHelper<T>::qt_metatype_id();
- if (typedefOf != -1)
- return QMetaType::registerNormalizedTypedef(normalizedTypeName, typedefOf);
-
- QMetaType::TypeFlags flags(QtPrivate::QMetaTypeTypeFlags<T>::Flags);
- if (defined)
- flags |= QMetaType::WasDeclaredAsMetaType;
-
- const int id = QMetaType::registerNormalizedType(normalizedTypeName,
- QtMetaTypePrivate::QMetaTypeFunctionHelper<T>::Destruct,
- QtMetaTypePrivate::QMetaTypeFunctionHelper<T>::Construct,
- int(sizeof(T)),
- flags,
- QtPrivate::MetaObjectForType<T>::value());
+ const QMetaType metaType = QMetaType::fromType<T>();
+ const int id = metaType.id();
if (id > 0) {
+ QMetaType::registerNormalizedTypedef(normalizedTypeName, metaType);
QtPrivate::SequentialContainerConverterHelper<T>::registerConverter(id);
QtPrivate::AssociativeContainerConverterHelper<T>::registerConverter(id);
QtPrivate::MetaTypePairHelper<T>::registerConverter(id);
@@ -1913,8 +1826,11 @@ void qRegisterMetaTypeStreamOperators(const char *typeName
template <typename T>
inline Q_DECL_CONSTEXPR int qMetaTypeId()
{
- Q_STATIC_ASSERT_X(QMetaTypeId2<T>::Defined, "Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system");
- return QMetaTypeId2<T>::qt_metatype_id();
+ if constexpr (bool(QMetaTypeId2<T>::IsBuiltIn)) {
+ return QMetaTypeId2<T>::MetaType;
+ } else {
+ return QMetaType::fromType<T>().id();
+ }
}
template <typename T>
@@ -2080,6 +1996,7 @@ inline int qRegisterMetaTypeStreamOperators()
{ \
enum { Defined = 1, IsBuiltIn = true, MetaType = METATYPEID }; \
static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return METATYPEID; } \
+ static constexpr const char * const name = #NAME; \
}; \
QT_END_NAMESPACE
@@ -2098,7 +2015,7 @@ typedef QHash<QString, QVariant> QVariantHash;
#ifdef Q_CLANG_QDOC
class QByteArrayList;
#else
-typedef QList<QByteArray> QByteArrayList;
+typedef QVector<QByteArray> QByteArrayList;
#endif
#define Q_DECLARE_METATYPE_TEMPLATE_1ARG(SINGLE_ARG_TEMPLATE) \
@@ -2121,8 +2038,6 @@ struct QMetaTypeId< SINGLE_ARG_TEMPLATE<T> > \
typeName.reserve(int(sizeof(#SINGLE_ARG_TEMPLATE)) + 1 + tNameLen + 1 + 1); \
typeName.append(#SINGLE_ARG_TEMPLATE, int(sizeof(#SINGLE_ARG_TEMPLATE)) - 1) \
.append('<').append(tName, tNameLen); \
- if (typeName.endsWith('>')) \
- typeName.append(' '); \
typeName.append('>'); \
const int newId = qRegisterNormalizedMetaType< SINGLE_ARG_TEMPLATE<T> >( \
typeName, \
@@ -2163,8 +2078,6 @@ struct QMetaTypeId< DOUBLE_ARG_TEMPLATE<T, U> > \
typeName.reserve(int(sizeof(#DOUBLE_ARG_TEMPLATE)) + 1 + tNameLen + 1 + uNameLen + 1 + 1); \
typeName.append(#DOUBLE_ARG_TEMPLATE, int(sizeof(#DOUBLE_ARG_TEMPLATE)) - 1) \
.append('<').append(tName, tNameLen).append(',').append(uName, uNameLen); \
- if (typeName.endsWith('>')) \
- typeName.append(' '); \
typeName.append('>'); \
const int newId = qRegisterNormalizedMetaType< DOUBLE_ARG_TEMPLATE<T, U> >(\
typeName, \
@@ -2298,104 +2211,6 @@ QT_BEGIN_NAMESPACE
#undef Q_DECLARE_METATYPE_TEMPLATE_SMART_POINTER_ITER
-inline QMetaType::QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeInterface *info,
- TypedConstructor creator,
- TypedDestructor deleter,
- SaveOperator saveOp,
- LoadOperator loadOp,
- Constructor constructor,
- Destructor destructor,
- uint size,
- uint theTypeFlags,
- int typeId,
- const QMetaObject *_metaObject)
- : m_typedConstructor(creator)
- , m_typedDestructor(deleter)
- , m_saveOp(saveOp)
- , m_loadOp(loadOp)
- , m_constructor(constructor)
- , m_destructor(destructor)
- , m_extension(nullptr)
- , m_size(size)
- , m_typeFlags(theTypeFlags)
- , m_extensionFlags(extensionFlags)
- , m_typeId(typeId)
- , m_metaObject(_metaObject)
-{
- if (Q_UNLIKELY(isExtended(CtorEx) || typeId == QMetaType::Void))
- ctor(info);
-}
-
-inline QMetaType::~QMetaType()
-{
- if (Q_UNLIKELY(isExtended(DtorEx)))
- dtor();
-}
-
-inline bool QMetaType::isValid() const
-{
- return m_typeId != UnknownType;
-}
-
-inline bool QMetaType::isRegistered() const
-{
- return isValid();
-}
-
-inline int QMetaType::id() const
-{
- return m_typeId;
-}
-
-inline void *QMetaType::create(const void *copy) const
-{
- // ### TODO Qt6 remove the extension
- return createExtended(copy);
-}
-
-inline void QMetaType::destroy(void *data) const
-{
- // ### TODO Qt6 remove the extension
- destroyExtended(data);
-}
-
-inline void *QMetaType::construct(void *where, const void *copy) const
-{
- if (Q_UNLIKELY(isExtended(ConstructEx)))
- return constructExtended(where, copy);
- return m_constructor(where, copy);
-}
-
-inline void QMetaType::destruct(void *data) const
-{
- if (Q_UNLIKELY(isExtended(DestructEx)))
- return destructExtended(data);
- if (Q_UNLIKELY(!data))
- return;
- m_destructor(data);
-}
-
-inline int QMetaType::sizeOf() const
-{
- if (Q_UNLIKELY(isExtended(SizeEx)))
- return sizeExtended();
- return m_size;
-}
-
-inline QMetaType::TypeFlags QMetaType::flags() const
-{
- if (Q_UNLIKELY(isExtended(FlagsEx)))
- return flagsExtended();
- return QMetaType::TypeFlags(m_typeFlags);
-}
-
-inline const QMetaObject *QMetaType::metaObject() const
-{
- if (Q_UNLIKELY(isExtended(MetaObjectEx)))
- return metaObjectExtended();
- return m_metaObject;
-}
-
QT_END_NAMESPACE
@@ -2457,6 +2272,532 @@ namespace QtPrivate {
};
}
+namespace QtPrivate {
+
+class QMetaTypeInterface
+{
+public:
+ uint revision; // 0 in Qt 6.0. Can increase if new field are added
+ uint size;
+ uint alignment;
+ uint flags;
+ const QMetaObject *metaObject;
+ const char *name;
+
+ QBasicAtomicInt typeId;
+ QtPrivate::RefCount ref;
+
+ // Called when the type is unregistered, to delete this
+ using DeleteSelf = void (*)(QMetaTypeInterface *);
+ DeleteSelf deleteSelf;
+
+ using DefaultCtrFn = void (*)(const QMetaTypeInterface *, void *);
+ DefaultCtrFn defaultCtr;
+ using CopyCtrFn = void (*)(const QMetaTypeInterface *, void *, const void *);
+ CopyCtrFn copyCtr;
+ using MoveCtrFn = void (*)(const QMetaTypeInterface *, void *, void *);
+ MoveCtrFn moveCtr;
+ using DtorFn = void (*)(const QMetaTypeInterface *, void *);
+ DtorFn dtor;
+
+ using LegacyRegisterOp = void (*)();
+ LegacyRegisterOp legacyRegisterOp;
+};
+
+struct QTypeNormalizer
+{
+ char *output;
+ int len = 0;
+ char last = 0;
+
+private:
+ static constexpr bool is_ident_char(char s)
+ {
+ return ((s >= 'a' && s <= 'z') || (s >= 'A' && s <= 'Z') || (s >= '0' && s <= '9')
+ || s == '_');
+ }
+ static constexpr bool is_space(char s) { return (s == ' ' || s == '\t' || s == '\n'); }
+ static constexpr bool is_number(char s) { return s >= '0' && s <= '9'; };
+ static constexpr bool starts_with_token(const char *b, const char *e, const char *token,
+ bool msvcKw = false)
+ {
+ while (b != e && *token && *b == *token) {
+ b++;
+ token++;
+ }
+ if (*token)
+ return false;
+#ifdef Q_CC_MSVC
+ /// On MSVC, keywords like class or struct are not separated with spaces in constexpr
+ /// context
+ if (msvcKw)
+ return true;
+#endif
+ Q_UNUSED(msvcKw);
+ return b == e || !is_ident_char(*b);
+ }
+ static constexpr bool skipToken(const char *&x, const char *e, const char *token,
+ bool msvcKw = false)
+ {
+ if (!starts_with_token(x, e, token, msvcKw))
+ return false;
+ while (*token++)
+ x++;
+ while (x != e && is_space(*x))
+ x++;
+ return true;
+ }
+ static constexpr const char *skipString(const char *x, const char *e)
+ {
+ char delim = *x;
+ x++;
+ while (x != e && *x != delim) {
+ if (*x == '\\') {
+ x++;
+ if (x == e)
+ return e;
+ }
+ x++;
+ }
+ if (x != e)
+ x++;
+ return x;
+ };
+ static constexpr const char *skipTemplate(const char *x, const char *e, bool stopAtComa = false)
+ {
+ int scopeDepth = 0;
+ int templateDepth = 0;
+ while (x != e) {
+ switch (*x) {
+ case '<':
+ if (!scopeDepth)
+ templateDepth++;
+ break;
+ case ',':
+ if (stopAtComa && !scopeDepth && !templateDepth)
+ return x;
+ break;
+ case '>':
+ if (!scopeDepth)
+ if (--templateDepth < 0)
+ return x;
+ break;
+ case '(':
+ case '[':
+ case '{':
+ scopeDepth++;
+ break;
+ case '}':
+ case ']':
+ case ')':
+ scopeDepth--;
+ break;
+ case '\'':
+ if (is_number(x[-1]))
+ break;
+ Q_FALLTHROUGH();
+ case '\"':
+ x = skipString(x, e);
+ continue;
+ }
+ x++;
+ }
+ return x;
+ };
+
+ constexpr void append(char x)
+ {
+ last = x;
+ len++;
+ if (output)
+ *output++ = x;
+ }
+
+ constexpr void appendStr(const char *x)
+ {
+ while (*x)
+ append(*x++);
+ };
+
+public:
+ constexpr int normalizeType(const char *begin, const char *end, bool adjustConst = true)
+ {
+ // Trim spaces
+ while (begin != end && is_space(*begin))
+ begin++;
+ while (begin != end && is_space(*(end - 1)))
+ end--;
+
+ // Convert 'char const *' into 'const char *'. Start at index 1,
+ // not 0, because 'const char *' is already OK.
+ const char *cst = begin + 1;
+ if (*begin == '\'' || *begin == '"')
+ cst = skipString(begin, end);
+ bool seenStar = false;
+ bool hasMiddleConst = false;
+ while (cst < end) {
+ if (*cst == '\"' || (*cst == '\'' && !is_number(cst[-1]))) {
+ cst = skipString(cst, end);
+ if (cst == end)
+ break;
+ }
+
+ // We mustn't convert 'char * const *' into 'const char **'
+ // and we must beware of 'Bar<const Bla>'.
+ if (*cst == '&' || *cst == '*' || *cst == '[') {
+ seenStar = *cst != '&' || cst != (end - 1);
+ break;
+ }
+ if (*cst == '<') {
+ cst = skipTemplate(cst + 1, end);
+ if (cst == end)
+ break;
+ }
+ cst++;
+ const char *skipedCst = cst;
+ if (!is_ident_char(*(cst - 1)) && skipToken(skipedCst, end, "const")) {
+ const char *testEnd = end;
+ while (skipedCst < testEnd--) {
+ if (*testEnd == '*' || *testEnd == '['
+ || (*testEnd == '&' && testEnd != (end - 1))) {
+ seenStar = true;
+ break;
+ }
+ if (*testEnd == '>')
+ break;
+ }
+ if (adjustConst && !seenStar) {
+ if (*(end - 1) == '&')
+ end--;
+ } else {
+ appendStr("const ");
+ }
+ normalizeType(begin, cst, false);
+ begin = skipedCst;
+ hasMiddleConst = true;
+ break;
+ }
+ }
+ if (skipToken(begin, end, "const")) {
+ if (adjustConst && !seenStar) {
+ if (*(end - 1) == '&')
+ end--;
+ } else {
+ appendStr("const ");
+ }
+ }
+ if (seenStar && adjustConst) {
+ const char *e = end;
+ if (*(end - 1) == '&' && *(end - 2) != '&')
+ e--;
+ while (begin != e && is_space(*(e - 1)))
+ e--;
+ const char *token = "tsnoc"; // 'const' reverse, to check if it ends with const
+ while (*token && begin != e && *(--e) == *token++)
+ ;
+ if (!*token && begin != e && !is_ident_char(*(e - 1))) {
+ while (begin != e && is_space(*(e - 1)))
+ e--;
+ end = e;
+ }
+ }
+
+ // discard 'struct', 'class', and 'enum'; they are optional
+ // and we don't want them in the normalized signature
+ skipToken(begin, end, "struct", true) || skipToken(begin, end, "class", true)
+ || skipToken(begin, end, "enum", true);
+
+#ifdef QT_NAMESPACE
+ const char *nsbeg = begin;
+ if (skipToken(nsbeg, end, QT_STRINGIFY(QT_NAMESPACE)) && nsbeg + 2 < end && nsbeg[0] == ':'
+ && nsbeg[1] == ':') {
+ begin = nsbeg + 2;
+ while (begin != end && is_space(*begin))
+ begin++;
+ }
+#endif
+
+ if (skipToken(begin, end, "QList")) {
+ // Replace QList by QVector
+ appendStr("QVector");
+ }
+ if (!hasMiddleConst) {
+ // Normalize the integer types
+ int numLong = 0;
+ int numSigned = 0;
+ int numUnsigned = 0;
+ int numInt = 0;
+ int numShort = 0;
+ int numChar = 0;
+ while (begin < end) {
+ if (skipToken(begin, end, "long")) {
+ numLong++;
+ continue;
+ }
+ if (skipToken(begin, end, "int")) {
+ numInt++;
+ continue;
+ }
+ if (skipToken(begin, end, "short")) {
+ numShort++;
+ continue;
+ }
+ if (skipToken(begin, end, "unsigned")) {
+ numUnsigned++;
+ continue;
+ }
+ if (skipToken(begin, end, "signed")) {
+ numSigned++;
+ continue;
+ }
+ if (skipToken(begin, end, "char")) {
+ numChar++;
+ continue;
+ }
+ break;
+ }
+ if (numChar || numShort) {
+ if (numSigned && numChar)
+ appendStr("signed ");
+ if (numUnsigned)
+ appendStr("unsigned ");
+ if (numChar)
+ appendStr("char");
+ else
+ appendStr("short");
+ } else if (numLong) {
+ if (numLong == 1) {
+ if (numUnsigned)
+ append('u');
+ appendStr("long");
+ } else {
+ if (numUnsigned)
+ appendStr("unsigned ");
+ appendStr("long long");
+ }
+ } else if (numUnsigned || numSigned || numInt) {
+ if (numUnsigned)
+ append('u');
+ appendStr("int");
+ }
+ }
+
+ bool spaceSkiped = true;
+ while (begin != end) {
+ char c = *begin++;
+ if (is_space(c)) {
+ spaceSkiped = true;
+ } else if ((c == '\'' && !is_number(last)) || c == '\"') {
+ begin--;
+ auto x = skipString(begin, end);
+ while (begin < x)
+ append(*begin++);
+ } else {
+ if (spaceSkiped && is_ident_char(last) && is_ident_char(c))
+ append(' ');
+ append(c);
+ spaceSkiped = false;
+ if (c == '<') {
+ do {
+ // template recursion
+ const char *tpl = skipTemplate(begin, end, true);
+ normalizeType(begin, tpl, false);
+ if (tpl == end)
+ return len;
+ append(*tpl);
+ begin = tpl;
+ } while (*begin++ == ',');
+ }
+ }
+ }
+ return len;
+ }
+};
+
+// Normalize the type between begin and end, and store the data in the output. Returns the length.
+// The idea is to first run this function with nullptr as output to allocate the output with the
+// size
+constexpr int qNormalizeType(const char *begin, const char *end, char *output)
+{
+ return QTypeNormalizer { output }.normalizeType(begin, end);
+}
+
+template<typename T>
+constexpr auto typenameHelper()
+{
+ constexpr auto prefix = sizeof(
+#ifdef QT_NAMESPACE
+ QT_STRINGIFY(QT_NAMESPACE) "::"
+#endif
+#ifdef Q_CC_MSVC
+ "auto __cdecl QtPrivate::typenameHelper<"
+#elif defined(Q_CC_CLANG)
+ "auto QtPrivate::typenameHelper() [T = "
+#else
+ "constexpr auto QtPrivate::typenameHelper() [with T = "
+#endif
+ ) - 1;
+#ifdef Q_CC_MSVC
+ constexpr int suffix = sizeof(">(void)");
+#else
+ constexpr int suffix = sizeof("]");
+#endif
+
+#if !(defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG))
+ constexpr auto func = Q_FUNC_INFO;
+ constexpr const char *begin = func + prefix;
+ constexpr const char *end = func + sizeof(Q_FUNC_INFO) - suffix;
+ constexpr int len = qNormalizeType(begin, end, nullptr);
+#else // GCC < 8.1 did not have Q_FUNC_INFO as constexpr, and GCC 9 has a precompiled header bug
+ auto func = Q_FUNC_INFO;
+ const char *begin = func + prefix;
+ const char *end = func + sizeof(Q_FUNC_INFO) - suffix;
+ // This is an upper bound of the size since the normalized signature should always be smaller
+ // (Unless there is a QList -> QVector change, but that should not happen)
+ constexpr int len = sizeof(Q_FUNC_INFO) - suffix - prefix;
+#endif
+ std::array<char, len + 1> result {};
+ qNormalizeType(begin, end, result.data());
+ return result;
+}
+
+template<typename T, typename = void>
+struct BuiltinMetaType : std::integral_constant<int, 0>
+{
+};
+template<typename T>
+struct BuiltinMetaType<T, std::enable_if_t<QMetaTypeId2<T>::IsBuiltIn>>
+ : std::integral_constant<int, QMetaTypeId2<T>::MetaType>
+{
+};
+
+template<typename T>
+class QMetaTypeForType
+{
+ static const decltype(typenameHelper<T>()) name;
+
+public:
+ static QMetaTypeInterface metaType;
+};
+
+#ifdef Q_CC_CLANG
+// Workaround for https://bugs.llvm.org/show_bug.cgi?id=44554 : Every lambda used for initializing
+// static members need a different signature for explicit instentiation
+#define QT_METATYPE_CONSTEXPRLAMDA(...) [](std::integral_constant<int, __COUNTER__> = {}) constexpr __VA_ARGS__ ()
+#elif defined(Q_CC_MSVC)
+// Workaround a bug with 'if constexpr' not working in lambda that are not generic in MSVC
+#define QT_METATYPE_CONSTEXPRLAMDA(...) [](auto) constexpr __VA_ARGS__ (0)
+#else
+#define QT_METATYPE_CONSTEXPRLAMDA(...) []() constexpr __VA_ARGS__ ()
+#endif
+
+template<typename T>
+QMetaTypeInterface QMetaTypeForType<T>::metaType = {
+ /*.revision=*/ 0,
+ /*.size=*/ sizeof(T),
+ /*.alignment=*/ alignof(T),
+ /*.flags=*/ QMetaTypeTypeFlags<T>::Flags,
+ /*.metaObject=*/ MetaObjectForType<T>::value(),
+ /*.name=*/ QT_METATYPE_CONSTEXPRLAMDA( -> const char * {
+ if constexpr (bool(QMetaTypeId2<T>::IsBuiltIn)) {
+ return QMetaTypeId2<T>::name;
+ } else {
+ return name.data();
+ }
+ }),
+ /*.typeId=*/ BuiltinMetaType<T>::value,
+ /*.ref=*/ Q_REFCOUNT_INITIALIZE_STATIC,
+ /*.deleteSelf=*/ nullptr,
+ /*.defaultCtr=*/ QT_METATYPE_CONSTEXPRLAMDA( -> QMetaTypeInterface::DefaultCtrFn {
+ if constexpr (std::is_default_constructible_v<T>) {
+ return [](const QMetaTypeInterface *, void *addr) { new (addr) T(); };
+ } else {
+ return nullptr;
+ }
+ }),
+ /*.copyCtr=*/ QT_METATYPE_CONSTEXPRLAMDA( -> QMetaTypeInterface::CopyCtrFn {
+ if constexpr (std::is_copy_constructible_v<T>) {
+ return [](const QMetaTypeInterface *, void *addr, const void *other) {
+ new (addr) T(*reinterpret_cast<const T *>(other));
+ };
+ } else {
+ return nullptr;
+ }
+ }),
+ /*.moveCtr=*/ QT_METATYPE_CONSTEXPRLAMDA( -> QMetaTypeInterface::MoveCtrFn {
+ if constexpr (std::is_move_constructible_v<T>) {
+ return [](const QMetaTypeInterface *, void *addr, void *other) {
+ new (addr) T(std::move(*reinterpret_cast<T *>(other)));
+ };
+ } else {
+ return nullptr;
+ }
+ }),
+ /*.dtor=*/ QT_METATYPE_CONSTEXPRLAMDA( -> QMetaTypeInterface::DtorFn {
+ if constexpr (std::is_destructible_v<T>)
+ return [](const QMetaTypeInterface *, void *addr) { reinterpret_cast<T *>(addr)->~T(); };
+ else
+ return nullptr;
+ }),
+ /*.legacyRegisterOp=*/ QT_METATYPE_CONSTEXPRLAMDA( -> QMetaTypeInterface::LegacyRegisterOp {
+ if constexpr (QMetaTypeId2<T>::Defined && !QMetaTypeId2<T>::IsBuiltIn) {
+ return []() { QMetaTypeId2<T>::qt_metatype_id(); };
+ } else {
+ return nullptr;
+ }
+ })
+};
+#undef QT_METATYPE_CONSTEXPRLAMDA
+
+template<typename T>
+constexpr const decltype(typenameHelper<T>()) QMetaTypeForType<T>::name = typenameHelper<T>();
+
+template<>
+class QMetaTypeForType<void>
+{
+};
+
+#ifndef QT_BOOTSTRAPPED
+#define QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER(TypeName, Id, Name) \
+ extern template class Q_CORE_EXPORT QMetaTypeForType<Name>;
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_MSVC(4910) // '__declspec(dllexport)' and 'extern' are incompatible on an explicit instantiation
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_GCC("-Wattributes") // false positive because of QMetaTypeForType<void>
+QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
+QT_WARNING_POP
+QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
+QT_FOR_EACH_STATIC_CORE_CLASS(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
+QT_FOR_EACH_STATIC_CORE_POINTER(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
+QT_FOR_EACH_STATIC_CORE_TEMPLATE(QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER)
+QT_WARNING_POP
+#undef QT_METATYPE_DECLARE_EXTERN_TEMPLATE_ITER
+#endif
+
+template<typename T>
+constexpr QMetaTypeInterface *qMetaTypeInterfaceForType()
+{
+ using Ty = std::remove_cv_t<std::remove_reference_t<T>>;
+ if constexpr (std::is_same_v<Ty, void>) {
+ return nullptr;
+ } else {
+ return &QMetaTypeForType<Ty>::metaType;
+ }
+}
+
+} // namespace QtPrivate
+
+template<typename T>
+QMetaType QMetaType::fromType()
+{
+ return QMetaType(QtPrivate::qMetaTypeInterfaceForType<T>());
+}
+
+template<typename... T>
+QtPrivate::QMetaTypeInterface *const qt_metaTypeArray[] = {
+ QtPrivate::qMetaTypeInterfaceForType<T>()...
+};
+
QT_END_NAMESPACE
#endif // QMETATYPE_H
diff --git a/src/corelib/kernel/qmetatype_p.h b/src/corelib/kernel/qmetatype_p.h
index d743d5a5c7..e4e2aa9e43 100644
--- a/src/corelib/kernel/qmetatype_p.h
+++ b/src/corelib/kernel/qmetatype_p.h
@@ -121,77 +121,15 @@ QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_DECLARE_WIDGETS_MODULE_TYPES_ITER)
#undef QT_DECLARE_GUI_MODULE_TYPES_ITER
#undef QT_DECLARE_WIDGETS_MODULE_TYPES_ITER
-class QMetaTypeInterface
+class QMetaTypeModuleHelper
{
public:
- QMetaType::SaveOperator saveOp;
- QMetaType::LoadOperator loadOp;
- QMetaType::Constructor constructor; // TODO Qt6: remove me
- QMetaType::Destructor destructor;
- int size;
- QMetaType::TypeFlags::Int flags;
- const QMetaObject *metaObject;
- QMetaType::TypedConstructor typedConstructor;
- QMetaType::TypedDestructor typedDestructor;
-};
-
+ virtual QtPrivate::QMetaTypeInterface *interfaceForType(int) const = 0;
#ifndef QT_NO_DATASTREAM
-# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \
- /*saveOp*/(QtMetaTypePrivate::QMetaTypeFunctionHelper<Type, QtMetaTypePrivate::TypeDefinition<Type>::IsAvailable>::Save), \
- /*loadOp*/(QtMetaTypePrivate::QMetaTypeFunctionHelper<Type, QtMetaTypePrivate::TypeDefinition<Type>::IsAvailable>::Load),
-# define QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type) \
- /*saveOp*/ nullptr, \
- /*loadOp*/ nullptr,
-#else
-# define QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type) \
- /*saveOp*/ nullptr, \
- /*loadOp*/ nullptr,
-# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \
- QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type)
-#endif
-
-#ifndef QT_BOOTSTRAPPED
-#define METAOBJECT_DELEGATE(Type) (QtPrivate::MetaObjectForType<Type>::value())
-#else
-#define METAOBJECT_DELEGATE(Type) nullptr
+ virtual bool save(QDataStream &stream, int type, const void *data) const = 0;
+ virtual bool load(QDataStream &stream, int type, void *data) const = 0;
#endif
-
-#define QT_METATYPE_INTERFACE_INIT_IMPL(Type, DATASTREAM_DELEGATE) \
-{ \
- DATASTREAM_DELEGATE(Type) \
- /*constructor*/(QtMetaTypePrivate::QMetaTypeFunctionHelper<Type, QtMetaTypePrivate::TypeDefinition<Type>::IsAvailable>::Construct), \
- /*destructor*/(QtMetaTypePrivate::QMetaTypeFunctionHelper<Type, QtMetaTypePrivate::TypeDefinition<Type>::IsAvailable>::Destruct), \
- /*size*/(QTypeInfo<Type>::sizeOf), \
- /*flags*/QtPrivate::QMetaTypeTypeFlags<Type>::Flags, \
- /*metaObject*/METAOBJECT_DELEGATE(Type), \
- /*typedConstructor*/ nullptr, \
- /*typedDestructor*/ nullptr \
-}
-
-
-/* These QT_METATYPE_INTERFACE_INIT* macros are used to initialize QMetaTypeInterface instance.
-
- - QT_METATYPE_INTERFACE_INIT(Type) -> It takes Type argument and creates all necessary wrapper functions for the Type,
- it detects if QT_NO_DATASTREAM was defined. Probably it is the macro that you want to use.
-
- - QT_METATYPE_INTERFACE_INIT_EMPTY() -> It initializes an empty QMetaTypeInterface instance.
-
- - QT_METATYPE_INTERFACE_INIT_NO_DATASTREAM(Type) -> Temporary workaround for missing auto-detection of data stream
- operators. It creates same instance as QT_METATYPE_INTERFACE_INIT(Type) but with null stream operators callbacks.
- */
-#define QT_METATYPE_INTERFACE_INIT(Type) QT_METATYPE_INTERFACE_INIT_IMPL(Type, QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL)
-#define QT_METATYPE_INTERFACE_INIT_NO_DATASTREAM(Type) QT_METATYPE_INTERFACE_INIT_IMPL(Type, QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL)
-#define QT_METATYPE_INTERFACE_INIT_EMPTY() \
-{ \
- QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(void) \
- /*constructor*/ nullptr, \
- /*destructor*/ nullptr, \
- /*size*/ 0, \
- /*flags*/ 0, \
- /*metaObject*/ nullptr , \
- /*typedConstructor*/ nullptr, \
- /*typedDestructor*/ nullptr \
-}
+};
namespace QtMetaTypePrivate {
template<typename T>
@@ -232,9 +170,6 @@ template<> struct TypeDefinition<QRegExp> { static const bool IsAvailable = fals
#if !QT_CONFIG(regularexpression)
template<> struct TypeDefinition<QRegularExpression> { static const bool IsAvailable = false; };
#endif
-#ifdef QT_NO_SHORTCUT
-template<> struct TypeDefinition<QKeySequence> { static const bool IsAvailable = false; };
-#endif
#ifdef QT_NO_CURSOR
template<> struct TypeDefinition<QCursor> { static const bool IsAvailable = false; };
#endif
@@ -256,6 +191,34 @@ template<> struct TypeDefinition<QQuaternion> { static const bool IsAvailable =
#ifdef QT_NO_ICON
template<> struct TypeDefinition<QIcon> { static const bool IsAvailable = false; };
#endif
+
+template<typename T>
+static QT_PREPEND_NAMESPACE(QtPrivate::QMetaTypeInterface) *getInterfaceFromType()
+{
+ if constexpr (std::is_same_v<T, void>) {
+ return nullptr;
+ } else if constexpr (QtMetaTypePrivate::TypeDefinition<T>::IsAvailable) {
+ return &QT_PREPEND_NAMESPACE(QtPrivate::QMetaTypeForType)<T>::metaType;
+ }
+ return nullptr;
+}
+
+#define QT_METATYPE_CONVERT_ID_TO_TYPE(MetaTypeName, MetaTypeId, RealName) \
+ case QMetaType::MetaTypeName: \
+ return QtMetaTypePrivate::getInterfaceFromType<RealName>();
+
+#define QT_METATYPE_DATASTREAM_SAVE(MetaTypeName, MetaTypeId, RealName) \
+ case QMetaType::MetaTypeName: \
+ QtMetaTypePrivate::QMetaTypeFunctionHelper<RealName, QtMetaTypePrivate::TypeDefinition<RealName>::IsAvailable>::Save(stream, data); \
+ return true;
+
+#define QT_METATYPE_DATASTREAM_LOAD(MetaTypeName, MetaTypeId, RealName) \
+ case QMetaType::MetaTypeName: \
+ QtMetaTypePrivate::QMetaTypeFunctionHelper<RealName, QtMetaTypePrivate::TypeDefinition<RealName>::IsAvailable>::Load(stream, data); \
+ return true;
+
+void derefAndDestroy(QT_PREPEND_NAMESPACE(QtPrivate::QMetaTypeInterface) *d_ptr);
+
} //namespace QtMetaTypePrivate
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 23e4e1163c..efa71470d4 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -50,7 +50,6 @@
#include "qloggingcategory.h"
#include "qvariant.h"
#include "qmetaobject.h"
-#include <qregexp.h>
#if QT_CONFIG(regularexpression)
# include <qregularexpression.h>
#endif
@@ -164,7 +163,6 @@ extern "C" Q_CORE_EXPORT void qt_removeObject(QObject *)
#endif
void (*QAbstractDeclarativeData::destroyed)(QAbstractDeclarativeData *, QObject *) = nullptr;
-void (*QAbstractDeclarativeData::destroyed_qml1)(QAbstractDeclarativeData *, QObject *) = nullptr;
void (*QAbstractDeclarativeData::parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *) = nullptr;
void (*QAbstractDeclarativeData::signalEmitted)(QAbstractDeclarativeData *, QObject *, int, void **) = nullptr;
int (*QAbstractDeclarativeData::receivers)(QAbstractDeclarativeData *, const QObject *, int) = nullptr;
@@ -229,10 +227,6 @@ QObjectPrivate::~QObjectPrivate()
if (metaObject) metaObject->objectDestroyed(q_ptr);
-#ifndef QT_NO_USERDATA
- if (extraData)
- qDeleteAll(extraData->userData);
-#endif
delete extraData;
}
@@ -992,15 +986,8 @@ QObject::~QObject()
emit destroyed(this);
}
- if (d->declarativeData) {
- if (static_cast<QAbstractDeclarativeDataImpl*>(d->declarativeData)->ownedByQml1) {
- if (QAbstractDeclarativeData::destroyed_qml1)
- QAbstractDeclarativeData::destroyed_qml1(d->declarativeData, this);
- } else {
- if (QAbstractDeclarativeData::destroyed)
- QAbstractDeclarativeData::destroyed(d->declarativeData, this);
- }
- }
+ if (d->declarativeData && QAbstractDeclarativeData::destroyed)
+ QAbstractDeclarativeData::destroyed(d->declarativeData, this);
QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed();
if (cd) {
@@ -1913,20 +1900,6 @@ void QObject::killTimer(int id)
*/
/*!
- \fn template<typename T> QList<T> QObject::findChildren(const QRegExp &regExp, Qt::FindChildOptions options) const
- \overload findChildren()
- \obsolete
-
- Returns the children of this object that can be cast to type T
- and that have names matching the regular expression \a regExp,
- or an empty list if there are no such objects.
- The search is performed recursively, unless \a options specifies the
- option FindDirectChildrenOnly.
-
- Use the findChildren overload taking a QRegularExpression instead.
-*/
-
-/*!
\fn QList<T> QObject::findChildren(const QRegularExpression &re, Qt::FindChildOptions options) const
\overload findChildren()
@@ -1972,21 +1945,6 @@ void QObject::killTimer(int id)
*/
/*!
- \fn template<typename T> QList<T> qFindChildren(const QObject *obj, const QRegExp &regExp)
- \relates QObject
- \overload qFindChildren()
-
- This function is equivalent to
- \a{obj}->\l{QObject::findChildren()}{findChildren}<T>(\a regExp).
-
- \note This function was provided as a workaround for MSVC 6
- which did not support member template functions. It is advised
- to use the other form in new code.
-
- \sa QObject::findChildren()
-*/
-
-/*!
\internal
*/
void qt_qFindChildren_helper(const QObject *parent, const QString &name,
@@ -2007,29 +1965,6 @@ void qt_qFindChildren_helper(const QObject *parent, const QString &name,
}
}
-#ifndef QT_NO_REGEXP
-/*!
- \internal
-*/
-void qt_qFindChildren_helper(const QObject *parent, const QRegExp &re,
- const QMetaObject &mo, QList<void*> *list, Qt::FindChildOptions options)
-{
- if (!parent || !list)
- return;
- const QObjectList &children = parent->children();
- QRegExp reCopy = re;
- QObject *obj;
- for (int i = 0; i < children.size(); ++i) {
- obj = children.at(i);
- if (mo.cast(obj) && reCopy.indexIn(obj->objectName()) != -1)
- list->append(obj);
-
- if (options & Qt::FindChildrenRecursively)
- qt_qFindChildren_helper(obj, re, mo, list, options);
- }
-}
-#endif // QT_NO_REGEXP
-
#if QT_CONFIG(regularexpression)
/*!
\internal
@@ -4277,58 +4212,6 @@ void QObject::dumpObjectInfo() const
}
}
-#ifndef QT_NO_USERDATA
-static QBasicAtomicInteger<uint> user_data_registration = Q_BASIC_ATOMIC_INITIALIZER(0);
-
-/*!
- \internal
- */
-uint QObject::registerUserData()
-{
- return user_data_registration.fetchAndAddRelaxed(1);
-}
-
-/*!
- \fn QObjectUserData::QObjectUserData()
- \internal
- */
-
-/*!
- \internal
- */
-QObjectUserData::~QObjectUserData()
-{
-}
-
-/*!
- \internal
- */
-void QObject::setUserData(uint id, QObjectUserData* data)
-{
- Q_D(QObject);
- if (!d->extraData)
- d->extraData = new QObjectPrivate::ExtraData;
-
- if (d->extraData->userData.size() <= (int) id)
- d->extraData->userData.resize((int) id + 1);
- d->extraData->userData[id] = data;
-}
-
-/*!
- \internal
- */
-QObjectUserData* QObject::userData(uint id) const
-{
- Q_D(const QObject);
- if (!d->extraData)
- return nullptr;
- if ((int)id < d->extraData->userData.size())
- return d->extraData->userData.at(id);
- return nullptr;
-}
-
-#endif // QT_NO_USERDATA
-
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QObject *o)
@@ -4634,6 +4517,23 @@ QDebug operator<<(QDebug dbg, const QObject *o)
*/
/*!
+ \macro Q_MOC_INCLUDE
+ \relates QObject
+ \since 6.0
+
+ The Q_MOC_INCLUDE macro can be used within or outside a class, and tell the
+ \l{moc}{Meta Object Compiler} to add an include.
+
+ \code
+ // Put this in your code and the generated code will include this header.
+ Q_MOC_INCLUDE("myheader.h")
+ \endcode
+
+ This is useful if the types you use as properties or signal/slots arguments
+ are forward declared.
+*/
+
+/*!
\macro Q_SIGNALS
\relates QObject
@@ -4748,10 +4648,15 @@ QDebug operator<<(QDebug dbg, const QObject *o)
Using the same Window class as the previous example, the newProperty and
newMethod would only be exposed in this code when the expected version is
- 1 or greater.
+ \c{2.1} or greater.
+
+ Since all methods are considered to be in revision \c{0} if untagged, a tag
+ of \c{Q_REVISION(0)} or \c{Q_REVISION(0, 0)} is invalid and ignored.
- Since all methods are considered to be in revision 0 if untagged, a tag
- of Q_REVISION(0) is invalid and ignored.
+ You can pass one or two integer parameters to \c{Q_REVISION}. If you pass
+ one parameter, it denotes the minor version only. This means that the major
+ version is unspecified. If you pass two, the first parameter is the major
+ version and the second parameter is the minor version.
This tag is not used by the meta-object system itself. Currently this is only
used by the QtQml module.
diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h
index f5d7c22e3a..556d975786 100644
--- a/src/corelib/kernel/qobject.h
+++ b/src/corelib/kernel/qobject.h
@@ -72,26 +72,15 @@ class QObject;
class QThread;
class QWidget;
class QAccessibleWidget;
-#ifndef QT_NO_REGEXP
-class QRegExp;
-#endif
#if QT_CONFIG(regularexpression)
class QRegularExpression;
#endif
-#if !QT_DEPRECATED_SINCE(5, 14) || QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
-# define QT_NO_USERDATA
-#endif
-#ifndef QT_NO_USERDATA
-class QObjectUserData;
-#endif
struct QDynamicMetaObjectData;
typedef QList<QObject*> QObjectList;
Q_CORE_EXPORT void qt_qFindChildren_helper(const QObject *parent, const QString &name,
const QMetaObject &mo, QList<void *> *list, Qt::FindChildOptions options);
-Q_CORE_EXPORT void qt_qFindChildren_helper(const QObject *parent, const QRegExp &re,
- const QMetaObject &mo, QList<void *> *list, Qt::FindChildOptions options);
Q_CORE_EXPORT void qt_qFindChildren_helper(const QObject *parent, const QRegularExpression &re,
const QMetaObject &mo, QList<void *> *list, Qt::FindChildOptions options);
Q_CORE_EXPORT QObject *qt_qFindChild_helper(const QObject *parent, const QString &name, const QMetaObject &mo, Qt::FindChildOptions options);
@@ -186,21 +175,6 @@ public:
return list;
}
-#ifndef QT_NO_REGEXP
-#if QT_DEPRECATED_SINCE(5, 13)
- template<typename T>
- QT_DEPRECATED_X("Use findChildren(const QRegularExpression &, ...) instead.")
- inline QList<T> findChildren(const QRegExp &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
- {
- typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
- QList<T> list;
- qt_qFindChildren_helper(this, re, ObjType::staticMetaObject,
- reinterpret_cast<QList<void *> *>(&list), options);
- return list;
- }
-#endif
-#endif
-
#if QT_CONFIG(regularexpression)
template<typename T>
inline QList<T> findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
@@ -408,15 +382,6 @@ public:
QList<QByteArray> dynamicPropertyNames() const;
#endif // QT_NO_PROPERTIES
-#ifndef QT_NO_USERDATA
- QT_DEPRECATED_VERSION_5_14
- static uint registerUserData();
- QT_DEPRECATED_VERSION_X_5_14("Use setProperty()")
- void setUserData(uint id, QObjectUserData* data);
- QT_DEPRECATED_VERSION_X_5_14("Use property()")
- QObjectUserData* userData(uint id) const;
-#endif // QT_NO_USERDATA
-
Q_SIGNALS:
void destroyed(QObject * = nullptr);
void objectNameChanged(const QString &objectName, QPrivateSignal);
@@ -449,9 +414,6 @@ protected:
protected:
QScopedPointer<QObjectData> d_ptr;
- static const QMetaObject staticQtMetaObject;
- friend inline const QMetaObject *qt_getQtMetaObject() noexcept;
-
friend struct QMetaObject;
friend struct QMetaObjectPrivate;
friend class QMetaCallEvent;
@@ -482,18 +444,6 @@ inline QMetaObject::Connection QObject::connect(const QObject *asender, const ch
const char *amember, Qt::ConnectionType atype) const
{ return connect(asender, asignal, this, amember, atype); }
-inline const QMetaObject *qt_getQtMetaObject() noexcept
-{ return &QObject::staticQtMetaObject; }
-
-#ifndef QT_NO_USERDATA
-class Q_CORE_EXPORT QObjectUserData {
- Q_DISABLE_COPY(QObjectUserData)
-public:
- QObjectUserData() = default;
- virtual ~QObjectUserData();
-};
-#endif
-
#if QT_DEPRECATED_SINCE(5, 0)
template<typename T>
inline QT_DEPRECATED T qFindChild(const QObject *o, const QString &name = QString())
@@ -505,14 +455,6 @@ inline QT_DEPRECATED QList<T> qFindChildren(const QObject *o, const QString &nam
return o->findChildren<T>(name);
}
-#if !defined(QT_NO_REGEXP) || defined(Q_CLANG_QDOC)
-template<typename T>
-inline QT_DEPRECATED QList<T> qFindChildren(const QObject *o, const QRegExp &re)
-{
- return o->findChildren<T>(re);
-}
-#endif
-
#endif //QT_DEPRECATED
template <class T>
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index 34b7447d5d..97b492360c 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -89,7 +89,6 @@ class Q_CORE_EXPORT QAbstractDeclarativeData
{
public:
static void (*destroyed)(QAbstractDeclarativeData *, QObject *);
- static void (*destroyed_qml1)(QAbstractDeclarativeData *, QObject *);
static void (*parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *);
static void (*signalEmitted)(QAbstractDeclarativeData *, QObject *, int, void **);
static int (*receivers)(QAbstractDeclarativeData *, const QObject *, int);
@@ -97,14 +96,6 @@ public:
static void (*setWidgetParent)(QObject *, QObject *); // Used by the QML engine to specify parents for widgets. Set by QtWidgets.
};
-// This is an implementation of QAbstractDeclarativeData that is identical with
-// the implementation in QtDeclarative and QtQml for the first bit
-struct QAbstractDeclarativeDataImpl : public QAbstractDeclarativeData
-{
- quint32 ownedByQml1:1;
- quint32 unused: 31;
-};
-
class Q_CORE_EXPORT QObjectPrivate : public QObjectData
{
Q_DECLARE_PUBLIC(QObject)
@@ -113,9 +104,6 @@ public:
struct ExtraData
{
ExtraData() {}
- #ifndef QT_NO_USERDATA
- QVector<QObjectUserData *> userData;
- #endif
QList<QByteArray> propertyNames;
QVector<QVariant> propertyValues;
QVector<int> runningTimers;
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
index becbb90a61..5ae4c47259 100644
--- a/src/corelib/kernel/qobjectdefs.h
+++ b/src/corelib/kernel/qobjectdefs.h
@@ -46,199 +46,15 @@
#endif
#include <QtCore/qnamespace.h>
-
#include <QtCore/qobjectdefs_impl.h>
+#include <QtCore/qtmetamacros.h>
QT_BEGIN_NAMESPACE
-
class QByteArray;
struct QArrayData;
-typedef QArrayData QByteArrayData;
class QString;
-#ifndef Q_MOC_OUTPUT_REVISION
-#define Q_MOC_OUTPUT_REVISION 67
-#endif
-
-// The following macros can be defined by tools that understand Qt
-// to have the information from the macro.
-#ifndef QT_ANNOTATE_CLASS
-# define QT_ANNOTATE_CLASS(type, ...)
-#endif
-#ifndef QT_ANNOTATE_CLASS2
-# define QT_ANNOTATE_CLASS2(type, a1, a2)
-#endif
-#ifndef QT_ANNOTATE_FUNCTION
-# define QT_ANNOTATE_FUNCTION(x)
-#endif
-#ifndef QT_ANNOTATE_ACCESS_SPECIFIER
-# define QT_ANNOTATE_ACCESS_SPECIFIER(x)
-#endif
-
-// The following macros are our "extensions" to C++
-// They are used, strictly speaking, only by the moc.
-
-#ifndef Q_MOC_RUN
-#ifndef QT_NO_META_MACROS
-# if defined(QT_NO_KEYWORDS)
-# define QT_NO_EMIT
-# else
-# ifndef QT_NO_SIGNALS_SLOTS_KEYWORDS
-# define slots Q_SLOTS
-# define signals Q_SIGNALS
-# endif
-# endif
-# define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot)
-# define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal)
-# define Q_PRIVATE_SLOT(d, signature) QT_ANNOTATE_CLASS2(qt_private_slot, d, signature)
-# define Q_EMIT
-#ifndef QT_NO_EMIT
-# define emit
-#endif
-#ifndef Q_CLASSINFO
-# define Q_CLASSINFO(name, value)
-#endif
-#define Q_PLUGIN_METADATA(x) QT_ANNOTATE_CLASS(qt_plugin_metadata, x)
-#define Q_INTERFACES(x) QT_ANNOTATE_CLASS(qt_interfaces, x)
-#define Q_PROPERTY(...) QT_ANNOTATE_CLASS(qt_property, __VA_ARGS__)
-#define Q_PRIVATE_PROPERTY(d, text) QT_ANNOTATE_CLASS2(qt_private_property, d, text)
-#ifndef Q_REVISION
-# define Q_REVISION(v)
-#endif
-#define Q_OVERRIDE(text) QT_ANNOTATE_CLASS(qt_override, text)
-#define QDOC_PROPERTY(text) QT_ANNOTATE_CLASS(qt_qdoc_property, text)
-#define Q_ENUMS(x) QT_ANNOTATE_CLASS(qt_enums, x)
-#define Q_FLAGS(x) QT_ANNOTATE_CLASS(qt_enums, x)
-#define Q_ENUM_IMPL(ENUM) \
- friend Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \
- friend Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) noexcept { return #ENUM; }
-#define Q_ENUM(x) Q_ENUMS(x) Q_ENUM_IMPL(x)
-#define Q_FLAG(x) Q_FLAGS(x) Q_ENUM_IMPL(x)
-#define Q_ENUM_NS_IMPL(ENUM) \
- inline Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \
- inline Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) noexcept { return #ENUM; }
-#define Q_ENUM_NS(x) Q_ENUMS(x) Q_ENUM_NS_IMPL(x)
-#define Q_FLAG_NS(x) Q_FLAGS(x) Q_ENUM_NS_IMPL(x)
-#define Q_SCRIPTABLE QT_ANNOTATE_FUNCTION(qt_scriptable)
-#define Q_INVOKABLE QT_ANNOTATE_FUNCTION(qt_invokable)
-#define Q_SIGNAL QT_ANNOTATE_FUNCTION(qt_signal)
-#define Q_SLOT QT_ANNOTATE_FUNCTION(qt_slot)
-#endif // QT_NO_META_MACROS
-
-#ifndef QT_NO_TRANSLATION
-// full set of tr functions
-# define QT_TR_FUNCTIONS \
- static inline QString tr(const char *s, const char *c = nullptr, int n = -1) \
- { return staticMetaObject.tr(s, c, n); } \
- QT_DEPRECATED static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) \
- { return staticMetaObject.tr(s, c, n); }
-#else
-// inherit the ones from QObject
-# define QT_TR_FUNCTIONS
-#endif
-
-#ifdef Q_CLANG_QDOC
-#define QT_TR_FUNCTIONS
-#endif
-
-// ### Qt6: remove
-#define Q_OBJECT_CHECK /* empty, unused since Qt 5.2 */
-
-#if defined(Q_CC_INTEL)
-// Cannot redefine the visibility of a method in an exported class
-# define Q_DECL_HIDDEN_STATIC_METACALL
-#else
-# define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN
-#endif
-
-#if defined(Q_CC_CLANG) && Q_CC_CLANG >= 306
-# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override")
-#elif defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 501
-# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_GCC("-Wsuggest-override")
-#else
-# define Q_OBJECT_NO_OVERRIDE_WARNING
-#endif
-
-#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 600
-# define Q_OBJECT_NO_ATTRIBUTES_WARNING QT_WARNING_DISABLE_GCC("-Wattributes")
-#else
-# define Q_OBJECT_NO_ATTRIBUTES_WARNING
-#endif
-
-/* qmake ignore Q_OBJECT */
-#define Q_OBJECT \
-public: \
- QT_WARNING_PUSH \
- Q_OBJECT_NO_OVERRIDE_WARNING \
- static const QMetaObject staticMetaObject; \
- virtual const QMetaObject *metaObject() const; \
- virtual void *qt_metacast(const char *); \
- virtual int qt_metacall(QMetaObject::Call, int, void **); \
- QT_TR_FUNCTIONS \
-private: \
- Q_OBJECT_NO_ATTRIBUTES_WARNING \
- Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
- QT_WARNING_POP \
- struct QPrivateSignal {}; \
- QT_ANNOTATE_CLASS(qt_qobject, "")
-
-/* qmake ignore Q_OBJECT */
-#define Q_OBJECT_FAKE Q_OBJECT QT_ANNOTATE_CLASS(qt_fake, "")
-
-#ifndef QT_NO_META_MACROS
-/* qmake ignore Q_GADGET */
-#define Q_GADGET \
-public: \
- static const QMetaObject staticMetaObject; \
- void qt_check_for_QGADGET_macro(); \
- typedef void QtGadgetHelper; \
-private: \
- QT_WARNING_PUSH \
- Q_OBJECT_NO_ATTRIBUTES_WARNING \
- Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
- QT_WARNING_POP \
- QT_ANNOTATE_CLASS(qt_qgadget, "") \
- /*end*/
-
-/* qmake ignore Q_NAMESPACE_EXPORT */
-#define Q_NAMESPACE_EXPORT(...) \
- extern __VA_ARGS__ const QMetaObject staticMetaObject; \
- QT_ANNOTATE_CLASS(qt_qnamespace, "") \
- /*end*/
-
-/* qmake ignore Q_NAMESPACE */
-#define Q_NAMESPACE Q_NAMESPACE_EXPORT() \
- /*end*/
-
-#endif // QT_NO_META_MACROS
-
-#else // Q_MOC_RUN
-#define slots slots
-#define signals signals
-#define Q_SLOTS Q_SLOTS
-#define Q_SIGNALS Q_SIGNALS
-#define Q_CLASSINFO(name, value) Q_CLASSINFO(name, value)
-#define Q_INTERFACES(x) Q_INTERFACES(x)
-#define Q_PROPERTY(text) Q_PROPERTY(text)
-#define Q_PRIVATE_PROPERTY(d, text) Q_PRIVATE_PROPERTY(d, text)
-#define Q_REVISION(v) Q_REVISION(v)
-#define Q_OVERRIDE(text) Q_OVERRIDE(text)
-#define Q_ENUMS(x) Q_ENUMS(x)
-#define Q_FLAGS(x) Q_FLAGS(x)
-#define Q_ENUM(x) Q_ENUM(x)
-#define Q_FLAGS(x) Q_FLAGS(x)
- /* qmake ignore Q_OBJECT */
-#define Q_OBJECT Q_OBJECT
- /* qmake ignore Q_OBJECT */
-#define Q_OBJECT_FAKE Q_OBJECT_FAKE
- /* qmake ignore Q_GADGET */
-#define Q_GADGET Q_GADGET
-#define Q_SCRIPTABLE Q_SCRIPTABLE
-#define Q_INVOKABLE Q_INVOKABLE
-#define Q_SIGNAL Q_SIGNAL
-#define Q_SLOT Q_SLOT
-#endif //Q_MOC_RUN
#ifndef QT_NO_META_MACROS
// macro for onaming members
@@ -285,6 +101,14 @@ class QMetaEnum;
class QMetaProperty;
class QMetaClassInfo;
+namespace QtPrivate {
+class QMetaTypeInterface;
+}
+
+struct QMethodRawArguments
+{
+ void **arguments;
+};
class Q_CORE_EXPORT QGenericArgument
{
@@ -566,7 +390,9 @@ struct Q_CORE_EXPORT QMetaObject
CreateInstance,
IndexOfMethod,
RegisterPropertyMetaType,
- RegisterMethodArgumentMetaType
+ RegisterMethodArgumentMetaType,
+ RegisterQPropertyObserver,
+ SetQPropertyBinding
};
int static_metacall(Call, int, void **) const;
@@ -603,11 +429,12 @@ struct Q_CORE_EXPORT QMetaObject
struct { // private data
SuperData superdata;
- const QByteArrayData *stringdata;
+ const uint *stringdata;
const uint *data;
typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **);
StaticMetacallFunction static_metacall;
const SuperData *relatedMetaObjects;
+ QtPrivate::QMetaTypeInterface *const *metaTypes;
void *extradata; //reserved for future use
} d;
diff --git a/src/corelib/kernel/qobjectdefs_impl.h b/src/corelib/kernel/qobjectdefs_impl.h
index aed50d6c5a..0624dd2584 100644
--- a/src/corelib/kernel/qobjectdefs_impl.h
+++ b/src/corelib/kernel/qobjectdefs_impl.h
@@ -257,55 +257,32 @@ namespace QtPrivate {
}
};
- /*
- Logic that checks if the underlying type of an enum is signed or not.
- Needs an external, explicit check that E is indeed an enum. Works
- around the fact that it's undefined behavior to instantiate
- std::underlying_type on non-enums (cf. §20.13.7.6 [meta.trans.other]).
- */
- template<typename E, typename Enable = void>
- struct IsEnumUnderlyingTypeSigned : std::false_type
- {
- };
-
- template<typename E>
- struct IsEnumUnderlyingTypeSigned<E, typename std::enable_if<std::is_enum<E>::value>::type>
- : std::integral_constant<bool, std::is_signed<typename std::underlying_type<E>::type>::value>
- {
- };
-
- /*
- Logic that checks if the argument of the slot does not narrow the
- argument of the signal when used in list initialization. Cf. §8.5.4.7
- [dcl.init.list] for the definition of narrowing.
- For incomplete From/To types, there's no narrowing.
- */
- template<typename From, typename To, typename Enable = void>
- struct AreArgumentsNarrowedBase : std::false_type
- {
- };
-
+ // Traits to detect if there is a conversion between two types,
+ // and that conversion does not include a narrowing conversion.
template <typename T>
- using is_bool = std::is_same<bool, typename std::decay<T>::type>;
-
- template<typename From, typename To>
- struct AreArgumentsNarrowedBase<From, To, typename std::enable_if<sizeof(From) && sizeof(To)>::type>
- : std::integral_constant<bool,
- (std::is_floating_point<From>::value && std::is_integral<To>::value) ||
- (std::is_floating_point<From>::value && std::is_floating_point<To>::value && sizeof(From) > sizeof(To)) ||
- ((std::is_pointer<From>::value || std::is_member_pointer<From>::value) && QtPrivate::is_bool<To>::value) ||
- ((std::is_integral<From>::value || std::is_enum<From>::value) && std::is_floating_point<To>::value) ||
- (std::is_integral<From>::value && std::is_integral<To>::value
- && (sizeof(From) > sizeof(To)
- || (std::is_signed<From>::value ? !std::is_signed<To>::value
- : (std::is_signed<To>::value && sizeof(From) == sizeof(To))))) ||
- (std::is_enum<From>::value && std::is_integral<To>::value
- && (sizeof(From) > sizeof(To)
- || (IsEnumUnderlyingTypeSigned<From>::value ? !std::is_signed<To>::value
- : (std::is_signed<To>::value && sizeof(From) == sizeof(To)))))
- >
- {
- };
+ struct NarrowingDetector { T t[1]; }; // from P0608
+
+ template <typename From, typename To, typename Enable = void>
+ struct IsConvertibleWithoutNarrowing : std::false_type {};
+
+ template <typename From, typename To>
+ struct IsConvertibleWithoutNarrowing<From, To,
+ std::void_t< decltype( NarrowingDetector<To>{ {std::declval<From>()} } ) >
+ > : std::true_type {};
+
+ // Check for the actual arguments. If they are exactly the same,
+ // then don't bother checking for narrowing; as a by-product,
+ // this solves the problem of incomplete types (which must be supported,
+ // or they would error out in the trait above).
+ template <typename From, typename To, typename Enable = void>
+ struct AreArgumentsConvertibleWithoutNarrowingBase : std::false_type {};
+
+ template <typename From, typename To>
+ struct AreArgumentsConvertibleWithoutNarrowingBase<From, To,
+ std::enable_if_t<
+ std::disjunction_v<std::is_same<From, To>, IsConvertibleWithoutNarrowing<From, To>>
+ >
+ > : std::true_type {};
/*
Logic that check if the arguments of the slot matches the argument of the signal.
@@ -318,8 +295,8 @@ namespace QtPrivate {
static const typename RemoveRef<A1>::Type &dummy();
enum { value = sizeof(test(dummy())) == sizeof(int) };
#ifdef QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
- using AreArgumentsNarrowed = AreArgumentsNarrowedBase<typename RemoveRef<A1>::Type, typename RemoveRef<A2>::Type>;
- Q_STATIC_ASSERT_X(!AreArgumentsNarrowed::value, "Signal and slot arguments are not compatible (narrowing)");
+ using AreArgumentsConvertibleWithoutNarrowing = AreArgumentsConvertibleWithoutNarrowingBase<std::decay_t<A1>, std::decay_t<A2>>;
+ Q_STATIC_ASSERT_X(AreArgumentsConvertibleWithoutNarrowing::value, "Signal and slot arguments are not compatible (narrowing)");
#endif
};
template<typename A1, typename A2> struct AreArgumentsCompatible<A1, A2&> { enum { value = false }; };
diff --git a/src/corelib/kernel/qproperty.cpp b/src/corelib/kernel/qproperty.cpp
new file mode 100644
index 0000000000..e249dcfb44
--- /dev/null
+++ b/src/corelib/kernel/qproperty.cpp
@@ -0,0 +1,693 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qproperty.h"
+#include "qproperty_p.h"
+#include "qpropertybinding_p.h"
+
+#include <qscopedvaluerollback.h>
+
+QT_BEGIN_NAMESPACE
+
+using namespace QtPrivate;
+
+QPropertyBase::QPropertyBase(QPropertyBase &&other, void *propertyDataPtr)
+{
+ std::swap(d_ptr, other.d_ptr);
+ QPropertyBasePointer d{this};
+ d.setFirstObserver(nullptr);
+ if (auto binding = d.bindingPtr())
+ binding->setProperty(propertyDataPtr);
+}
+
+void QPropertyBase::moveAssign(QPropertyBase &&other, void *propertyDataPtr)
+{
+ if (&other == this)
+ return;
+
+ QPropertyBasePointer d{this};
+ auto observer = d.firstObserver();
+ d.setFirstObserver(nullptr);
+
+ if (auto binding = d.bindingPtr()) {
+ binding->unlinkAndDeref();
+ d_ptr &= FlagMask;
+ }
+
+ std::swap(d_ptr, other.d_ptr);
+
+ if (auto binding = d.bindingPtr())
+ binding->setProperty(propertyDataPtr);
+
+ d.setFirstObserver(observer.ptr);
+
+ // The caller will have to notify observers.
+}
+
+QPropertyBase::~QPropertyBase()
+{
+ QPropertyBasePointer d{this};
+ if (auto observer = d.firstObserver())
+ observer.unlink();
+ if (auto binding = d.bindingPtr())
+ binding->unlinkAndDeref();
+}
+
+QUntypedPropertyBinding QPropertyBase::setBinding(const QUntypedPropertyBinding &binding, void *propertyDataPtr)
+{
+ QPropertyBindingPrivatePtr oldBinding;
+ QPropertyBindingPrivatePtr newBinding = binding.d;
+
+ QPropertyBasePointer d{this};
+
+ auto observer = d.firstObserver();
+ if (observer)
+ observer.unlink();
+
+ if (auto *existingBinding = d.bindingPtr()) {
+ if (existingBinding == newBinding.data())
+ return QUntypedPropertyBinding(oldBinding.data());
+ oldBinding = QPropertyBindingPrivatePtr(existingBinding);
+ oldBinding->unlinkAndDeref();
+ d_ptr &= FlagMask;
+ }
+ if (newBinding) {
+ newBinding.data()->ref.ref();
+ d_ptr = (d_ptr & FlagMask) | reinterpret_cast<quintptr>(newBinding.data());
+ d_ptr |= BindingBit;
+ newBinding->setDirty(true);
+ newBinding->setProperty(propertyDataPtr);
+ if (observer)
+ newBinding->prependObserver(observer);
+ } else {
+ d_ptr &= ~BindingBit;
+ }
+
+ return QUntypedPropertyBinding(oldBinding.data());
+}
+
+QPropertyBindingPrivate *QPropertyBase::binding()
+{
+ QPropertyBasePointer d{this};
+ if (auto binding = d.bindingPtr())
+ return binding;
+ return nullptr;
+}
+
+QPropertyBindingPrivate *QPropertyBasePointer::bindingPtr() const
+{
+ if (ptr->d_ptr & QPropertyBase::BindingBit)
+ return reinterpret_cast<QPropertyBindingPrivate*>(ptr->d_ptr & ~QPropertyBase::FlagMask);
+ return nullptr;
+}
+
+void QPropertyBasePointer::addObserver(QPropertyObserver *observer)
+{
+ if (auto *binding = bindingPtr()) {
+ observer->prev = &binding->firstObserver.ptr;
+ observer->next = binding->firstObserver.ptr;
+ if (observer->next)
+ observer->next->prev = &observer->next;
+ binding->firstObserver.ptr = observer;
+ } else {
+ auto firstObserver = reinterpret_cast<QPropertyObserver*>(ptr->d_ptr & ~QPropertyBase::FlagMask);
+ observer->prev = reinterpret_cast<QPropertyObserver**>(&ptr->d_ptr);
+ observer->next = firstObserver;
+ if (observer->next)
+ observer->next->prev = &observer->next;
+ }
+ setFirstObserver(observer);
+}
+
+void QPropertyBasePointer::setFirstObserver(QPropertyObserver *observer)
+{
+ if (auto *binding = bindingPtr()) {
+ binding->firstObserver.ptr = observer;
+ return;
+ }
+ ptr->d_ptr = reinterpret_cast<quintptr>(observer) | (ptr->d_ptr & QPropertyBase::FlagMask);
+}
+
+QPropertyObserverPointer QPropertyBasePointer::firstObserver() const
+{
+ if (auto *binding = bindingPtr())
+ return binding->firstObserver;
+ return {reinterpret_cast<QPropertyObserver*>(ptr->d_ptr & ~QPropertyBase::FlagMask)};
+}
+
+static thread_local BindingEvaluationState *currentBindingEvaluationState = nullptr;
+
+BindingEvaluationState::BindingEvaluationState(QPropertyBindingPrivate *binding)
+ : binding(binding)
+{
+ previousState = currentBindingEvaluationState;
+ currentBindingEvaluationState = this;
+ binding->clearDependencyObservers();
+}
+
+BindingEvaluationState::~BindingEvaluationState()
+{
+ currentBindingEvaluationState = previousState;
+}
+
+void QPropertyBase::evaluateIfDirty()
+{
+ QPropertyBasePointer d{this};
+ QPropertyBindingPrivate *binding = d.bindingPtr();
+ if (!binding)
+ return;
+ binding->evaluateIfDirtyAndReturnTrueIfValueChanged();
+}
+
+void QPropertyBase::removeBinding()
+{
+ QPropertyBasePointer d{this};
+
+ auto observer = d.firstObserver();
+ if (observer)
+ observer.unlink();
+
+ if (auto *existingBinding = d.bindingPtr()) {
+ existingBinding->unlinkAndDeref();
+ d_ptr &= FlagMask;
+ }
+ d_ptr &= ~BindingBit;
+
+ if (observer)
+ observer.observeProperty(d);
+}
+
+void QPropertyBase::registerWithCurrentlyEvaluatingBinding() const
+{
+ auto currentState = currentBindingEvaluationState;
+ if (!currentState)
+ return;
+
+ QPropertyBasePointer d{this};
+
+ QPropertyObserverPointer dependencyObserver = currentState->binding->allocateDependencyObserver();
+ dependencyObserver.setBindingToMarkDirty(currentState->binding);
+ dependencyObserver.observeProperty(d);
+}
+
+void QPropertyBase::notifyObservers(void *propertyDataPtr)
+{
+ QPropertyBasePointer d{this};
+ if (QPropertyObserverPointer observer = d.firstObserver())
+ observer.notify(d.bindingPtr(), propertyDataPtr);
+}
+
+int QPropertyBasePointer::observerCount() const
+{
+ int count = 0;
+ for (auto observer = firstObserver(); observer; observer = observer.nextObserver())
+ ++count;
+ return count;
+}
+
+QPropertyObserver::QPropertyObserver(void (*callback)(QPropertyObserver *, void *))
+{
+ QPropertyObserverPointer d{this};
+ d.setChangeHandler(callback);
+}
+
+void QPropertyObserver::setSource(QPropertyBase &property)
+{
+ QPropertyObserverPointer d{this};
+ QPropertyBasePointer propPrivate{&property};
+ d.observeProperty(propPrivate);
+}
+
+
+QPropertyObserver::~QPropertyObserver()
+{
+ QPropertyObserverPointer d{this};
+ d.unlink();
+}
+
+QPropertyObserver::QPropertyObserver() = default;
+
+QPropertyObserver::QPropertyObserver(QPropertyObserver &&other)
+{
+ std::swap(bindingToMarkDirty, other.bindingToMarkDirty);
+ std::swap(next, other.next);
+ std::swap(prev, other.prev);
+ if (next)
+ next->prev = &next;
+ if (prev)
+ prev.setPointer(this);
+}
+
+QPropertyObserver &QPropertyObserver::operator=(QPropertyObserver &&other)
+{
+ if (this == &other)
+ return *this;
+
+ QPropertyObserverPointer d{this};
+ d.unlink();
+ bindingToMarkDirty = nullptr;
+
+ std::swap(bindingToMarkDirty, other.bindingToMarkDirty);
+ std::swap(next, other.next);
+ std::swap(prev, other.prev);
+ if (next)
+ next->prev = &next;
+ if (prev)
+ prev.setPointer(this);
+
+ return *this;
+}
+
+void QPropertyObserverPointer::unlink()
+{
+ if (ptr->next)
+ ptr->next->prev = ptr->prev;
+ if (ptr->prev)
+ ptr->prev.setPointer(ptr->next.data());
+ ptr->next = nullptr;
+ ptr->prev.clear();
+}
+
+void QPropertyObserverPointer::setChangeHandler(void (*changeHandler)(QPropertyObserver *, void *))
+{
+ ptr->changeHandler = changeHandler;
+ ptr->next.setTag(QPropertyObserver::ObserverNotifiesChangeHandler);
+}
+
+void QPropertyObserverPointer::setBindingToMarkDirty(QPropertyBindingPrivate *binding)
+{
+ ptr->bindingToMarkDirty = binding;
+ ptr->next.setTag(QPropertyObserver::ObserverNotifiesBinding);
+}
+
+void QPropertyObserverPointer::notify(QPropertyBindingPrivate *triggeringBinding, void *propertyDataPtr)
+{
+ bool knownIfPropertyChanged = false;
+ bool propertyChanged =true;
+
+ auto observer = const_cast<QPropertyObserver*>(ptr);
+ while (observer) {
+ auto * const next = observer->next.data();
+ if (observer->next.tag() == QPropertyObserver::ObserverNotifiesChangeHandler) {
+ if (!knownIfPropertyChanged && triggeringBinding) {
+ knownIfPropertyChanged = true;
+
+ propertyChanged = triggeringBinding->evaluateIfDirtyAndReturnTrueIfValueChanged();
+ }
+ if (!propertyChanged)
+ return;
+
+ if (auto handlerToCall = std::exchange(observer->changeHandler, nullptr)) {
+ handlerToCall(observer, propertyDataPtr);
+ observer->changeHandler = handlerToCall;
+ }
+ } else {
+ if (observer->bindingToMarkDirty)
+ observer->bindingToMarkDirty->markDirtyAndNotifyObservers();
+ }
+ observer = next;
+ }
+}
+
+void QPropertyObserverPointer::observeProperty(QPropertyBasePointer property)
+{
+ unlink();
+ property.addObserver(ptr);
+}
+
+QPropertyBindingError::QPropertyBindingError(Type type)
+{
+ if (type != NoError) {
+ d = new QPropertyBindingErrorPrivate;
+ d->type = type;
+ }
+}
+
+QPropertyBindingError::QPropertyBindingError(const QPropertyBindingError &other)
+ : d(other.d)
+{
+}
+
+QPropertyBindingError &QPropertyBindingError::operator=(const QPropertyBindingError &other)
+{
+ d = other.d;
+ return *this;
+}
+
+QPropertyBindingError::QPropertyBindingError(QPropertyBindingError &&other)
+ : d(std::move(other.d))
+{
+}
+
+QPropertyBindingError &QPropertyBindingError::operator=(QPropertyBindingError &&other)
+{
+ d = std::move(other.d);
+ return *this;
+}
+
+QPropertyBindingError::~QPropertyBindingError()
+{
+}
+
+QPropertyBindingError::Type QPropertyBindingError::type() const
+{
+ if (!d)
+ return QPropertyBindingError::NoError;
+ return d->type;
+}
+
+void QPropertyBindingError::setDescription(const QString &description)
+{
+ if (!d)
+ d = new QPropertyBindingErrorPrivate;
+ d->description = description;
+}
+
+QString QPropertyBindingError::description() const
+{
+ if (!d)
+ return QString();
+ return d->description;
+}
+
+QPropertyBindingSourceLocation QPropertyBindingError::location() const
+{
+ if (!d)
+ return QPropertyBindingSourceLocation();
+ return d->location;
+}
+
+/*!
+ \class QProperty
+ \inmodule QtCore
+ \brief The QProperty class is a template class that enables automatic property bindings.
+
+ \ingroup tools
+
+ QProperty\<T\> is a generic container that holds an instance of T. You can assign
+ a value to it and you can read it via the value() function or the T conversion
+ operator. You can also tie the property to an expression that computes the value
+ dynamically, the binding expression. It is represented as a C++ lambda and
+ can be used to express relationships between different properties in your
+ application.
+
+ The binding expression computes the value by reading other QProperty values.
+ Behind the scenes this dependency is tracked. Whenever a change in any property's
+ dependency is detected, the binding expression is re-evaluated and the new
+ result is applied to the property. This happens lazily, by marking the binding
+ as dirty and evaluating it only when the property's value is requested. For example:
+
+ \code
+ QProperty<QString> firstname("John");
+ QProperty<QString> lastname("Smith");
+ QProperty<int> age(41);
+
+ QProperty<QString> fullname;
+ fullname.setBinding([&]() { return firstname.value() + " " + lastname.value() + " age:" + QString::number(age.value()); });
+
+ qDebug() << fullname.value(); // Prints "John Smith age: 41"
+
+ firstname = "Emma"; // Marks binding expression as dirty
+
+ qDebug() << fullname.value(); // Re-evaluates the binding expression and prints "Emma Smith age: 41"
+
+ // Birthday is coming up
+ age.setValue(age.value() + 1);
+
+ qDebug() << fullname.value(); // Re-evaluates the binding expression and prints "Emma Smith age: 42"
+ \endcode
+
+ When a new value is assigned to the \c firstname property, the binding
+ expression for \c fullname is marked as dirty. So when the last \c qDebug() statement
+ tries to read the name value of the \c fullname property, the expression is
+ evaluated again, \c firstname() will be called again and return the new value.
+
+ Since bindings are C++ lambda expressions, they may do anything that's possible
+ in C++. This includes calling other functions. If those functions access values
+ held by QProperty, they automatically become dependencies to the binding.
+
+ Binding expressions may use properties of any type, so in the above example the age
+ is an integer and folded into the string value using conversion to integer, but
+ the dependency is fully tracked.
+
+ \section1 Tracking properties
+
+ Sometimes the relationships between properties cannot be expressed using
+ bindings. Instead you may need to run custom code whenever the value of a property
+ changes and instead of assigning the value to another property, pass it to
+ other parts of your application. For example writing data into a network socket
+ or printing debug output. QProperty provides two mechanisms for tracking.
+
+ You can register for a callback function to be called whenever the value of
+ a property changes, by using onValueChanged(). If you want the callback to also
+ be called for the current value of the property, register your callback using
+ subscribe() instead.
+*/
+
+/*!
+ \fn template <typename T> QProperty<T>::QProperty()
+
+ Constructs a property with a default constructed instance of T.
+*/
+
+/*!
+ \fn template <typename T> explicit QProperty<T>::QProperty(const T &initialValue)
+
+ Constructs a property with the provided \a initialValue.
+*/
+
+/*!
+ \fn template <typename T> explicit QProperty<T>::QProperty(T &&initialValue)
+
+ Move-Constructs a property with the provided \a initialValue.
+*/
+
+/*!
+ \fn template <typename T> QProperty<T>::QProperty(QProperty<T> &&other)
+
+ Move-constructs a QProperty instance, making it point at the same object that
+ \a other was pointing to.
+*/
+
+/*!
+ \fn template <typename T> QProperty<T> &QProperty<T>::operator=(QProperty &&other)
+
+ Move-assigns \a other to this QProperty instance.
+*/
+
+/*!
+ \fn template <typename T> QProperty<T>::QProperty(const QPropertyBinding<T> &binding)
+
+ Constructs a property that is tied to the provided \a binding expression. The
+ first time the property value is read, the binding is evaluated. Whenever a
+ dependency of the binding changes, the binding will be re-evaluated the next
+ time the value of this property is read.
+*/
+
+/*!
+ \fn template <typename T> template <typename Functor> QProperty<T>::QProperty(Functor &&f)
+
+ Constructs a property that is tied to the provided binding expression \a f. The
+ first time the property value is read, the binding is evaluated. Whenever a
+ dependency of the binding changes, the binding will be re-evaluated the next
+ time the value of this property is read.
+*/
+
+/*!
+ \fn template <typename T> QProperty<T>::~QProperty()
+
+ Destroys the property.
+*/
+
+/*!
+ \fn template <typename T> T QProperty<T>::value() const
+
+ Returns the value of the property. This may evaluate a binding expression that
+ is tied to this property, before returning the value.
+*/
+
+/*!
+ \fn template <typename T> QProperty<T>::operator T() const
+
+ Returns the value of the property. This may evaluate a binding expression that
+ is tied to this property, before returning the value.
+*/
+
+/*!
+ \fn template <typename T> void QProperty<T>::setValue(const T &newValue)
+
+ Assigns \a newValue to this property and removes the property's associated
+ binding, if present.
+*/
+
+/*!
+ \fn template <typename T> void QProperty<T>::setValue(T &&newValue)
+ \overload
+
+ Assigns \a newValue to this property and removes the property's associated
+ binding, if present.
+*/
+
+/*!
+ \fn template <typename T> QProperty<T> &QProperty<T>::operator=(const T &newValue)
+
+ Assigns \a newValue to this property and returns a reference to this QProperty.
+*/
+
+/*!
+ \fn template <typename T> QProperty<T> &QProperty<T>::operator=(T &&newValue)
+ \overload
+
+ Assigns \a newValue to this property and returns a reference to this QProperty.
+*/
+
+/*!
+ \fn template <typename T> QProperty<T> &QProperty<T>::operator=(const QPropertyBinding<T> &newBinding)
+
+ Associates the value of this property with the provided \a newBinding
+ expression and returns a reference to this property. The first time the
+ property value is read, the binding is evaluated. Whenever a dependency of the
+ binding changes, the binding will be re-evaluated the next time the value of
+ this property is read.
+*/
+
+/*!
+ \fn template <typename T> QPropertyBinding<T> QProperty<T>::setBinding(const QPropertyBinding<T> &newBinding)
+
+ Associates the value of this property with the provided \a newBinding
+ expression and returns the previously associated binding. The first time the
+ property value is read, the binding is evaluated. Whenever a dependency of the
+ binding changes, the binding will be re-evaluated the next time the value of
+ this property is read.
+*/
+
+/*!
+ \fn template <typename T> template <typename Functor> QPropertyBinding<T> QProperty<T>::setBinding(Functor f)
+ \overload
+
+ Associates the value of this property with the provided functor \a f and
+ returns the previously associated binding. The first time the property value
+ is read, the binding is evaluated by invoking the call operator () of \a f.
+ Whenever a dependency of the binding changes, the binding will be re-evaluated
+ the next time the value of this property is read.
+*/
+
+/*!
+ \fn template <typename T> QPropertyBinding<T> QProperty<T>::setBinding(QPropertyBinding<T> &&newBinding)
+ \overload
+
+ Associates the value of this property with the provided \a newBinding
+ expression and returns the previously associated binding. The first time the
+ property value is read, the binding is evaluated. Whenever a dependency of the
+ binding changes, the binding will be re-evaluated the next time the value of
+ this property is read.
+*/
+
+/*!
+ \fn template <typename T> QPropertyBinding<T> bool QProperty<T>::setBinding(const QUntypedPropertyBinding &newBinding)
+ \overload
+
+ Associates the value of this property with the provided \a newBinding
+ expression. The first time the property value is read, the binding is evaluated.
+ Whenever a dependency of the binding changes, the binding will be re-evaluated
+ the next time the value of this property is read.
+
+ Returns true if the type of this property is the same as the type the binding
+ function returns; false otherwise.
+*/
+
+/*!
+ \fn template <typename T> QPropertyBinding<T> QProperty<T>::binding() const
+
+ Returns the binding expression that is associated with this property. A
+ default constructed QPropertyBinding<T> will be returned if no such
+ association exists.
+*/
+
+/*!
+ \fn template <typename T> QPropertyBinding<T> QProperty<T>::takeBinding()
+
+ Disassociates the binding expression from this property and returns it. After
+ calling this function, the value of the property will only change if you
+ assign a new value to it, or when a new binding is set.
+*/
+
+/*!
+ \fn template <typename T> template <typename Functor> QPropertyChangeHandler<T, Functor> QProperty<T>::onValueChanged(Functor f)
+
+ Registers the given functor \a f as a callback that shall be called whenever
+ the value of the property changes.
+
+ The callback \a f is expected to be a type that has a plain call operator () without any
+ parameters. This means that you can provide a C++ lambda expression, an std::function
+ or even a custom struct with a call operator.
+
+ The returned property change handler object keeps track of the registration. When it
+ goes out of scope, the callback is de-registered.
+*/
+
+/*!
+ \fn template <typename T> template <typename Functor> QPropertyChangeHandler<T, Functor> QProperty<T>::subscribe(Functor f)
+
+ Subscribes the given functor \a f as a callback that is called immediately and whenever
+ the value of the property changes in the future.
+
+ The callback \a f is expected to be a type that has a plain call operator () without any
+ parameters. This means that you can provide a C++ lambda expression, an std::function
+ or even a custom struct with a call operator.
+
+ The returned property change handler object keeps track of the subscription. When it
+ goes out of scope, the callback is unsubscribed.
+*/
+
+/*!
+ \class QPropertyChangeHandler
+ \inmodule QtCore
+ \brief The QPropertyChangeHandler class controls the lifecycle of change callback installed on a QProperty.
+
+ \ingroup tools
+
+ QPropertyChangeHandler\<PropertyType, Functor\> is created when registering a
+ callback on a QProperty to listen to changes to the property's value, using QProperty::onValueChanged
+ and QProperty::subscribe. As long as the change handler is alive, the callback remains installed.
+
+ A handler instance can be transferred between C++ scopes using move semantics.
+*/
+
+QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qproperty.h b/src/corelib/kernel/qproperty.h
new file mode 100644
index 0000000000..e43f59053d
--- /dev/null
+++ b/src/corelib/kernel/qproperty.h
@@ -0,0 +1,499 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPROPERTY_H
+#define QPROPERTY_H
+
+#include <QtCore/qglobal.h>
+#include <QtCore/QSharedDataPointer>
+#include <QtCore/QString>
+#include <QtCore/qmetatype.h>
+#include <functional>
+#include <type_traits>
+#include <variant>
+
+#include <QtCore/qpropertyprivate.h>
+
+#if __has_include(<source_location>) && __cplusplus >= 202002L && !defined(Q_CLANG_QDOC)
+#include <experimental/source_location>
+#define QT_PROPERTY_COLLECT_BINDING_LOCATION
+#define QT_PROPERTY_DEFAULT_BINDING_LOCATION QPropertyBindingSourceLocation(std::source_location::current())
+#elif __has_include(<experimental/source_location>) && __cplusplus >= 201703L && !defined(Q_CLANG_QDOC)
+#include <experimental/source_location>
+#define QT_PROPERTY_COLLECT_BINDING_LOCATION
+#define QT_PROPERTY_DEFAULT_BINDING_LOCATION QPropertyBindingSourceLocation(std::experimental::source_location::current())
+#else
+#define QT_PROPERTY_DEFAULT_BINDING_LOCATION QPropertyBindingSourceLocation()
+#endif
+
+QT_BEGIN_NAMESPACE
+
+struct Q_CORE_EXPORT QPropertyBindingSourceLocation
+{
+ const char *fileName = nullptr;
+ const char *functionName = nullptr;
+ quint32 line = 0;
+ quint32 column = 0;
+ QPropertyBindingSourceLocation() = default;
+#ifdef QT_PROPERTY_COLLECT_BINDING_LOCATION
+ QPropertyBindingSourceLocation(const std::experimental::source_location &cppLocation)
+ {
+ fileName = cppLocation.file_name();
+ functionName = cppLocation.function_name();
+ line = cppLocation.line();
+ column = cppLocation.column();
+ }
+#endif
+};
+
+template <typename Functor> class QPropertyChangeHandler;
+
+template <typename T> class QProperty;
+
+class QPropertyBindingErrorPrivate;
+
+class Q_CORE_EXPORT QPropertyBindingError
+{
+public:
+ enum Type {
+ NoError,
+ BindingLoop,
+ EvaluationError,
+ UnknownError
+ };
+
+ QPropertyBindingError(Type type = NoError);
+ QPropertyBindingError(const QPropertyBindingError &other);
+ QPropertyBindingError &operator=(const QPropertyBindingError &other);
+ QPropertyBindingError(QPropertyBindingError &&other);
+ QPropertyBindingError &operator=(QPropertyBindingError &&other);
+ ~QPropertyBindingError();
+
+ Type type() const;
+ void setDescription(const QString &description);
+ QString description() const;
+ QPropertyBindingSourceLocation location() const;
+
+private:
+ QSharedDataPointer<QPropertyBindingErrorPrivate> d;
+};
+
+class Q_CORE_EXPORT QUntypedPropertyBinding
+{
+public:
+ using BindingEvaluationResult = QPropertyBindingError;
+ // writes binding result into dataPtr
+ using BindingEvaluationFunction = std::function<BindingEvaluationResult(const QMetaType &metaType, void *dataPtr)>;
+
+ QUntypedPropertyBinding();
+ QUntypedPropertyBinding(const QMetaType &metaType, BindingEvaluationFunction function, const QPropertyBindingSourceLocation &location);
+ QUntypedPropertyBinding(QUntypedPropertyBinding &&other);
+ QUntypedPropertyBinding(const QUntypedPropertyBinding &other);
+ QUntypedPropertyBinding &operator=(const QUntypedPropertyBinding &other);
+ QUntypedPropertyBinding &operator=(QUntypedPropertyBinding &&other);
+ ~QUntypedPropertyBinding();
+
+ bool isNull() const;
+
+ QPropertyBindingError error() const;
+
+ QMetaType valueMetaType() const;
+
+ explicit QUntypedPropertyBinding(QPropertyBindingPrivate *priv);
+private:
+ friend class QtPrivate::QPropertyBase;
+ friend class QPropertyBindingPrivate;
+ template <typename> friend class QPropertyBinding;
+ QPropertyBindingPrivatePtr d;
+};
+
+template <typename PropertyType>
+class QPropertyBinding : public QUntypedPropertyBinding
+{
+ template <typename Functor>
+ struct BindingAdaptor
+ {
+ Functor impl;
+ QUntypedPropertyBinding::BindingEvaluationResult operator()(const QMetaType &/*metaType*/, void *dataPtr)
+ {
+ std::variant<PropertyType, QPropertyBindingError> result(impl());
+ if (auto errorPtr = std::get_if<QPropertyBindingError>(&result))
+ return *errorPtr;
+
+ if (auto valuePtr = std::get_if<PropertyType>(&result)) {
+ PropertyType *propertyPtr = reinterpret_cast<PropertyType *>(dataPtr);
+ *propertyPtr = std::move(*valuePtr);
+ return {};
+ }
+
+ return {};
+ }
+ };
+
+public:
+ QPropertyBinding() = default;
+
+ template<typename Functor>
+ QPropertyBinding(Functor &&f, const QPropertyBindingSourceLocation &location)
+ : QUntypedPropertyBinding(QMetaType::fromType<PropertyType>(), BindingAdaptor<Functor>{std::forward<Functor>(f)}, location)
+ {}
+
+ QPropertyBinding(const QProperty<PropertyType> &property)
+ : QUntypedPropertyBinding(property.d.priv.binding())
+ {}
+
+private:
+ // Internal
+ explicit QPropertyBinding(const QUntypedPropertyBinding &binding)
+ : QUntypedPropertyBinding(binding)
+ {}
+ friend class QProperty<PropertyType>;
+};
+
+namespace QtPrivate {
+ template<typename... Ts>
+ constexpr auto is_variant_v = false;
+ template<typename... Ts>
+ constexpr auto is_variant_v<std::variant<Ts...>> = true;
+}
+
+namespace Qt {
+ template <typename Functor>
+ auto makePropertyBinding(Functor &&f, const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION,
+ std::enable_if_t<std::is_invocable_v<Functor>> * = 0)
+ {
+ if constexpr (QtPrivate::is_variant_v<std::invoke_result_t<Functor>>) {
+ return QPropertyBinding<std::variant_alternative_t<0, std::invoke_result_t<Functor>>>(std::forward<Functor>(f), location);
+ } else {
+ return QPropertyBinding<std::invoke_result_t<Functor>>(std::forward<Functor>(f), location);
+ }
+ // Work around bogus warning
+ Q_UNUSED(QtPrivate::is_variant_v<bool>)
+ }
+}
+
+struct QPropertyBasePointer;
+
+template <typename T>
+class QProperty
+{
+public:
+ using value_type = T;
+
+ QProperty() = default;
+ explicit QProperty(const T &initialValue) : d(initialValue) {}
+ explicit QProperty(T &&initialValue) : d(std::move(initialValue)) {}
+ QProperty(QProperty &&other) : d(std::move(other.d)) { notify(); }
+ QProperty &operator=(QProperty &&other) { d = std::move(other.d); notify(); return *this; }
+ QProperty(const QPropertyBinding<T> &binding)
+ : QProperty()
+ { operator=(binding); }
+ QProperty(QPropertyBinding<T> &&binding)
+ : QProperty()
+ { operator=(std::move(binding)); }
+#ifndef Q_CLANG_QDOC
+ template <typename Functor>
+ explicit QProperty(Functor &&f, const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION,
+ typename std::enable_if_t<std::is_invocable_r_v<T, Functor&>> * = 0);
+#else
+ template <typename Functor>
+ explicit QProperty(Functor &&f);
+#endif
+ ~QProperty() = default;
+
+ T value() const
+ {
+ if (d.priv.hasBinding())
+ d.priv.evaluateIfDirty();
+ d.priv.registerWithCurrentlyEvaluatingBinding();
+ return d.getValue();
+ }
+
+ operator T() const
+ {
+ return value();
+ }
+
+ void setValue(T &&newValue)
+ {
+ if (d.setValueAndReturnTrueIfChanged(std::move(newValue)))
+ notify();
+ d.priv.removeBinding();
+ }
+
+ void setValue(const T &newValue)
+ {
+ if (d.setValueAndReturnTrueIfChanged(newValue))
+ notify();
+ d.priv.removeBinding();
+ }
+
+ QProperty<T> &operator=(T &&newValue)
+ {
+ setValue(std::move(newValue));
+ return *this;
+ }
+
+ QProperty<T> &operator=(const T &newValue)
+ {
+ setValue(newValue);
+ return *this;
+ }
+
+ QProperty<T> &operator=(const QPropertyBinding<T> &newBinding)
+ {
+ setBinding(newBinding);
+ return *this;
+ }
+
+ QProperty<T> &operator=(QPropertyBinding<T> &&newBinding)
+ {
+ setBinding(std::move(newBinding));
+ return *this;
+ }
+
+ QPropertyBinding<T> setBinding(const QPropertyBinding<T> &newBinding)
+ {
+ QPropertyBinding<T> oldBinding(d.priv.setBinding(newBinding, &d));
+ notify();
+ return oldBinding;
+ }
+
+ QPropertyBinding<T> setBinding(QPropertyBinding<T> &&newBinding)
+ {
+ QPropertyBinding<T> b(std::move(newBinding));
+ QPropertyBinding<T> oldBinding(d.priv.setBinding(b, &d));
+ notify();
+ return oldBinding;
+ }
+
+ bool setBinding(const QUntypedPropertyBinding &newBinding)
+ {
+ if (newBinding.valueMetaType().id() != qMetaTypeId<T>())
+ return false;
+ d.priv.setBinding(newBinding, &d);
+ notify();
+ return true;
+ }
+
+#ifndef Q_CLANG_QDOC
+ template <typename Functor>
+ QPropertyBinding<T> setBinding(Functor f,
+ const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION)
+ {
+ return setBinding(Qt::makePropertyBinding(f, location));
+ }
+#else
+ template <typename Functor>
+ QPropertyBinding<T> setBinding(Functor f);
+#endif
+
+ bool hasBinding() const { return d.priv.hasBinding(); }
+
+ QPropertyBinding<T> binding() const
+ {
+ return QPropertyBinding<T>(*this);
+ }
+
+ QPropertyBinding<T> takeBinding()
+ {
+ return QPropertyBinding<T>(d.priv.setBinding(QUntypedPropertyBinding(), &d));
+ }
+
+ template<typename Functor>
+ QPropertyChangeHandler<Functor> onValueChanged(Functor f);
+ template<typename Functor>
+ QPropertyChangeHandler<Functor> subscribe(Functor f);
+
+private:
+ void notify()
+ {
+ d.priv.notifyObservers(&d);
+ }
+
+ Q_DISABLE_COPY(QProperty)
+
+ friend struct QPropertyBasePointer;
+ friend class QPropertyBinding<T>;
+ friend class QPropertyObserver;
+ // Mutable because querying for the value may require evalating the binding expression, calling
+ // non-const functions on QPropertyBase.
+ mutable QtPrivate::QPropertyValueStorage<T> d;
+};
+
+#ifndef Q_CLANG_QDOC
+template <typename PropertyType>
+template <typename Functor>
+QProperty<PropertyType>::QProperty(Functor &&f, const QPropertyBindingSourceLocation &location,
+ typename std::enable_if_t<std::is_invocable_r_v<PropertyType, Functor&>> *)
+ : QProperty(QPropertyBinding<PropertyType>(std::forward<Functor>(f), location))
+{}
+#endif
+
+namespace Qt {
+ template <typename PropertyType>
+ QPropertyBinding<PropertyType> makePropertyBinding(const QProperty<PropertyType> &otherProperty,
+ const QPropertyBindingSourceLocation &location =
+ QT_PROPERTY_DEFAULT_BINDING_LOCATION)
+ {
+ return Qt::makePropertyBinding([&otherProperty]() -> PropertyType { return otherProperty; }, location);
+ }
+}
+
+struct QPropertyObserverPrivate;
+struct QPropertyObserverPointer;
+
+class Q_CORE_EXPORT QPropertyObserver
+{
+public:
+ // Internal
+ enum ObserverTag {
+ ObserverNotifiesBinding = 0x0,
+ ObserverNotifiesChangeHandler = 0x1,
+ };
+ Q_DECLARE_FLAGS(ObserverTags, ObserverTag)
+
+ QPropertyObserver();
+ QPropertyObserver(QPropertyObserver &&other);
+ QPropertyObserver &operator=(QPropertyObserver &&other);
+ ~QPropertyObserver();
+
+ template <typename PropertyType>
+ void setSource(const QProperty<PropertyType> &property)
+ { setSource(property.d.priv); }
+
+protected:
+ QPropertyObserver(void (*callback)(QPropertyObserver*, void *));
+
+private:
+ void setSource(QtPrivate::QPropertyBase &property);
+
+ QTaggedPointer<QPropertyObserver, ObserverTags> next;
+ // prev is a pointer to the "next" element within the previous node, or to the "firstObserverPtr" if it is the
+ // first node.
+ QtPrivate::QTagPreservingPointerToPointer<QPropertyObserver, ObserverTags> prev;
+
+ union {
+ QPropertyBindingPrivate *bindingToMarkDirty = nullptr;
+ void (*changeHandler)(QPropertyObserver*, void *);
+ };
+
+ QPropertyObserver(const QPropertyObserver &) = delete;
+ QPropertyObserver &operator=(const QPropertyObserver &) = delete;
+
+ friend struct QPropertyObserverPointer;
+ friend struct QPropertyBasePointer;
+ friend class QPropertyBindingPrivate;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QPropertyObserver::ObserverTags)
+
+template <typename Functor>
+class QPropertyChangeHandler : public QPropertyObserver
+{
+ Functor m_handler;
+public:
+ QPropertyChangeHandler(Functor handler)
+ : QPropertyObserver([](QPropertyObserver *self, void *) {
+ auto This = static_cast<QPropertyChangeHandler<Functor>*>(self);
+ This->m_handler();
+ })
+ , m_handler(handler)
+ {
+ }
+
+ template <typename PropertyType>
+ QPropertyChangeHandler(const QProperty<PropertyType> &property, Functor handler)
+ : QPropertyObserver([](QPropertyObserver *self, void *) {
+ auto This = static_cast<QPropertyChangeHandler<Functor>*>(self);
+ This->m_handler();
+ })
+ , m_handler(handler)
+ {
+ setSource(property);
+ }
+};
+
+template <typename T>
+template<typename Functor>
+QPropertyChangeHandler<Functor> QProperty<T>::onValueChanged(Functor f)
+{
+#if defined(__cpp_lib_is_invocable) && (__cpp_lib_is_invocable >= 201703L)
+ static_assert(std::is_invocable_v<Functor>, "Functor callback must be callable without any parameters");
+#endif
+ return QPropertyChangeHandler<Functor>(*this, f);
+}
+
+template <typename T>
+template<typename Functor>
+QPropertyChangeHandler<Functor> QProperty<T>::subscribe(Functor f)
+{
+#if defined(__cpp_lib_is_invocable) && (__cpp_lib_is_invocable >= 201703L)
+ static_assert(std::is_invocable_v<Functor>, "Functor callback must be callable without any parameters");
+#endif
+ f();
+ return onValueChanged(f);
+}
+
+template <auto propertyMember, auto callbackMember>
+struct QPropertyMemberChangeHandler;
+
+template<typename Class, typename PropertyType, PropertyType Class::* PropertyMember, void(Class::*Callback)()>
+struct QPropertyMemberChangeHandler<PropertyMember, Callback> : public QPropertyObserver
+{
+ QPropertyMemberChangeHandler(Class *obj)
+ : QPropertyObserver(notify)
+ {
+ setSource(obj->*PropertyMember);
+ }
+
+ static void notify(QPropertyObserver *, void *propertyDataPtr)
+ {
+ // memberOffset is the offset of the QProperty<> member within the class. We get the absolute address
+ // of that member and subtracting the relative offset gives us the address of the class instance.
+ const size_t memberOffset = reinterpret_cast<size_t>(&(static_cast<Class *>(nullptr)->*PropertyMember));
+ Class *obj = reinterpret_cast<Class *>(reinterpret_cast<char *>(propertyDataPtr) - memberOffset);
+ (obj->*Callback)();
+ }
+};
+
+
+QT_END_NAMESPACE
+
+#endif // QPROPERTY_H
diff --git a/src/corelib/kernel/qproperty_p.h b/src/corelib/kernel/qproperty_p.h
new file mode 100644
index 0000000000..13cdb311c1
--- /dev/null
+++ b/src/corelib/kernel/qproperty_p.h
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPROPERTY_P_H
+#define QPROPERTY_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of qapplication_*.cpp, qwidget*.cpp and qfiledialog.cpp. This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qglobal.h>
+#include <qvarlengtharray.h>
+
+#include "qproperty.h"
+
+QT_BEGIN_NAMESPACE
+
+// This is a helper "namespace"
+struct Q_AUTOTEST_EXPORT QPropertyBasePointer
+{
+ const QtPrivate::QPropertyBase *ptr = nullptr;
+
+ QPropertyBindingPrivate *bindingPtr() const;
+
+ void addObserver(QPropertyObserver *observer);
+ void setFirstObserver(QPropertyObserver *observer);
+ QPropertyObserverPointer firstObserver() const;
+
+ int observerCount() const;
+
+ template <typename T>
+ static QPropertyBasePointer get(QProperty<T> &property)
+ {
+ return QPropertyBasePointer{&property.d.priv};
+ }
+};
+
+// This is a helper "namespace"
+struct QPropertyObserverPointer
+{
+ QPropertyObserver *ptr = nullptr;
+
+ void unlink();
+
+ void setBindingToMarkDirty(QPropertyBindingPrivate *binding);
+ void setChangeHandler(void (*changeHandler)(QPropertyObserver *, void *));
+
+ void notify(QPropertyBindingPrivate *triggeringBinding, void *propertyDataPtr);
+ void observeProperty(QPropertyBasePointer property);
+
+ explicit operator bool() const { return ptr != nullptr; }
+
+ QPropertyObserverPointer nextObserver() const { return {ptr->next.data()}; }
+};
+
+class QPropertyBindingErrorPrivate : public QSharedData
+{
+public:
+ QPropertyBindingError::Type type = QPropertyBindingError::NoError;
+ QString description;
+ QPropertyBindingSourceLocation location;
+};
+
+struct BindingEvaluationState
+{
+ BindingEvaluationState(QPropertyBindingPrivate *binding);
+ ~BindingEvaluationState();
+ QPropertyBindingPrivate *binding;
+ BindingEvaluationState *previousState = nullptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QPROPERTY_P_H
diff --git a/src/corelib/kernel/qpropertybinding.cpp b/src/corelib/kernel/qpropertybinding.cpp
new file mode 100644
index 0000000000..29b1a4a69a
--- /dev/null
+++ b/src/corelib/kernel/qpropertybinding.cpp
@@ -0,0 +1,175 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qpropertybinding_p.h"
+#include "qproperty_p.h"
+
+#include <QScopedValueRollback>
+#include <QVariant>
+
+QT_BEGIN_NAMESPACE
+
+using namespace QtPrivate;
+
+QPropertyBindingPrivate::~QPropertyBindingPrivate()
+{
+ if (firstObserver)
+ firstObserver.unlink();
+}
+
+void QPropertyBindingPrivate::unlinkAndDeref()
+{
+ propertyDataPtr = nullptr;
+ if (!ref.deref())
+ delete this;
+}
+
+void QPropertyBindingPrivate::markDirtyAndNotifyObservers()
+{
+ dirty = true;
+ if (firstObserver)
+ firstObserver.notify(this, propertyDataPtr);
+}
+
+bool QPropertyBindingPrivate::evaluateIfDirtyAndReturnTrueIfValueChanged()
+{
+ if (!dirty)
+ return false;
+
+ if (updating) {
+ error = QPropertyBindingError(QPropertyBindingError::BindingLoop);
+ return false;
+ }
+
+ QScopedValueRollback<bool> updateGuard(updating, true);
+
+ BindingEvaluationState evaluationFrame(this);
+
+ QPropertyBindingError evalError;
+ QUntypedPropertyBinding::BindingEvaluationResult result;
+ bool changed = false;
+ if (metaType.id() == QMetaType::Bool) {
+ auto propertyPtr = reinterpret_cast<QPropertyBase *>(propertyDataPtr);
+ bool newValue = false;
+ evalError = evaluationFunction(metaType, &newValue);
+ if (evalError.type() == QPropertyBindingError::NoError) {
+ if (propertyPtr->extraBit() != newValue) {
+ propertyPtr->setExtraBit(newValue);
+ changed = true;
+ }
+ }
+ } else {
+ QVariant resultVariant(metaType.id(), nullptr);
+ evalError = evaluationFunction(metaType, resultVariant.data());
+ if (evalError.type() == QPropertyBindingError::NoError) {
+ int compareResult = 0;
+ if (!QMetaType::compare(propertyDataPtr, resultVariant.constData(), metaType.id(), &compareResult) || compareResult != 0) {
+ changed = true;
+ metaType.destruct(propertyDataPtr);
+ metaType.construct(propertyDataPtr, resultVariant.constData());
+ }
+ }
+ }
+
+ if (evalError.type() != QPropertyBindingError::NoError)
+ error = evalError;
+
+ dirty = false;
+ return changed;
+}
+
+QUntypedPropertyBinding::QUntypedPropertyBinding() = default;
+
+QUntypedPropertyBinding::QUntypedPropertyBinding(const QMetaType &metaType, QUntypedPropertyBinding::BindingEvaluationFunction function,
+ const QPropertyBindingSourceLocation &location)
+{
+ d = new QPropertyBindingPrivate(metaType, std::move(function), std::move(location));
+}
+
+QUntypedPropertyBinding::QUntypedPropertyBinding(QUntypedPropertyBinding &&other)
+ : d(std::move(other.d))
+{
+}
+
+QUntypedPropertyBinding::QUntypedPropertyBinding(const QUntypedPropertyBinding &other)
+ : d(other.d)
+{
+}
+
+QUntypedPropertyBinding &QUntypedPropertyBinding::operator=(const QUntypedPropertyBinding &other)
+{
+ d = other.d;
+ return *this;
+}
+
+QUntypedPropertyBinding &QUntypedPropertyBinding::operator=(QUntypedPropertyBinding &&other)
+{
+ d = std::move(other.d);
+ return *this;
+}
+
+QUntypedPropertyBinding::QUntypedPropertyBinding(QPropertyBindingPrivate *priv)
+ : d(priv)
+{
+}
+
+QUntypedPropertyBinding::~QUntypedPropertyBinding()
+{
+}
+
+bool QUntypedPropertyBinding::isNull() const
+{
+ return !d;
+}
+
+QPropertyBindingError QUntypedPropertyBinding::error() const
+{
+ if (!d)
+ return QPropertyBindingError();
+ return d->bindingError();
+}
+
+QMetaType QUntypedPropertyBinding::valueMetaType() const
+{
+ if (!d)
+ return QMetaType();
+ return d->valueMetaType();
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qpropertybinding_p.h b/src/corelib/kernel/qpropertybinding_p.h
new file mode 100644
index 0000000000..66e969547c
--- /dev/null
+++ b/src/corelib/kernel/qpropertybinding_p.h
@@ -0,0 +1,139 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPROPERTYBINDING_P_H
+#define QPROPERTYBINDING_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of qapplication_*.cpp, qwidget*.cpp and qfiledialog.cpp. This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+#include <QtCore/qshareddata.h>
+#include <QtCore/qscopedpointer.h>
+#include <vector>
+#include <functional>
+
+#include "qproperty_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class Q_CORE_EXPORT QPropertyBindingPrivate : public QSharedData
+{
+private:
+ friend struct QPropertyBasePointer;
+
+ QUntypedPropertyBinding::BindingEvaluationFunction evaluationFunction;
+
+ QPropertyObserverPointer firstObserver;
+ std::array<QPropertyObserver, 4> inlineDependencyObservers;
+ QScopedPointer<std::vector<QPropertyObserver>> heapObservers;
+
+ void *propertyDataPtr = nullptr;
+
+ QPropertyBindingSourceLocation location;
+ QPropertyBindingError error;
+
+ QMetaType metaType;
+
+ bool dirty = false;
+ bool updating = false;
+
+public:
+ // public because the auto-tests access it, too.
+ size_t dependencyObserverCount = 0;
+
+ QPropertyBindingPrivate(const QMetaType &metaType, QUntypedPropertyBinding::BindingEvaluationFunction evaluationFunction,
+ const QPropertyBindingSourceLocation &location)
+ : evaluationFunction(std::move(evaluationFunction))
+ , location(location)
+ , metaType(metaType)
+ {}
+ virtual ~QPropertyBindingPrivate();
+
+ void setDirty(bool d) { dirty = d; }
+ void setProperty(void *propertyPtr) { propertyDataPtr = propertyPtr; }
+ void prependObserver(QPropertyObserverPointer observer) {
+ observer.ptr->prev = const_cast<QPropertyObserver **>(&firstObserver.ptr);
+ firstObserver = observer;
+ }
+
+ void clearDependencyObservers() {
+ for (size_t i = 0; i < inlineDependencyObservers.size(); ++i) {
+ QPropertyObserver empty;
+ qSwap(inlineDependencyObservers[i], empty);
+ }
+ if (heapObservers)
+ heapObservers->clear();
+ dependencyObserverCount = 0;
+ }
+ QPropertyObserverPointer allocateDependencyObserver() {
+ if (dependencyObserverCount < inlineDependencyObservers.size()) {
+ ++dependencyObserverCount;
+ return {&inlineDependencyObservers[dependencyObserverCount - 1]};
+ }
+ ++dependencyObserverCount;
+ if (!heapObservers)
+ heapObservers.reset(new std::vector<QPropertyObserver>());
+ return {&heapObservers->emplace_back()};
+ }
+
+ QPropertyBindingSourceLocation sourceLocation() const { return location; }
+ QPropertyBindingError bindingError() const { return error; }
+ QMetaType valueMetaType() const { return metaType; }
+
+ void unlinkAndDeref();
+
+ void markDirtyAndNotifyObservers();
+ bool evaluateIfDirtyAndReturnTrueIfValueChanged();
+
+ static QPropertyBindingPrivate *get(const QUntypedPropertyBinding &binding)
+ { return binding.d.data(); }
+};
+
+QT_END_NAMESPACE
+
+#endif // QPROPERTYBINDING_P_H
diff --git a/src/corelib/kernel/qpropertyprivate.h b/src/corelib/kernel/qpropertyprivate.h
new file mode 100644
index 0000000000..4b0b09d9db
--- /dev/null
+++ b/src/corelib/kernel/qpropertyprivate.h
@@ -0,0 +1,215 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPROPERTYPRIVATE_H
+#define QPROPERTYPRIVATE_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of qapplication_*.cpp, qwidget*.cpp and qfiledialog.cpp. This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+#include <QtCore/QExplicitlySharedDataPointer>
+#include <QtCore/qtaggedpointer.h>
+
+QT_BEGIN_NAMESPACE
+
+class QUntypedPropertyBinding;
+class QPropertyBindingPrivate;
+using QPropertyBindingPrivatePtr = QExplicitlySharedDataPointer<QPropertyBindingPrivate>;
+struct QPropertyBasePointer;
+
+namespace QtPrivate {
+
+class Q_CORE_EXPORT QPropertyBase
+{
+ // Mutable because the address of the observer of the currently evaluating binding is stored here, for
+ // notification later when the value changes.
+ mutable quintptr d_ptr = 0;
+ friend struct QT_PREPEND_NAMESPACE(QPropertyBasePointer);
+public:
+ QPropertyBase() = default;
+ Q_DISABLE_COPY(QPropertyBase)
+ QPropertyBase(QPropertyBase &&other) = delete;
+ QPropertyBase(QPropertyBase &&other, void *propertyDataPtr);
+ QPropertyBase &operator=(QPropertyBase &&other) = delete;
+ ~QPropertyBase();
+
+ void moveAssign(QPropertyBase &&other, void *propertyDataPtr);
+
+ bool hasBinding() const { return d_ptr & BindingBit; }
+
+ QUntypedPropertyBinding setBinding(const QUntypedPropertyBinding &newBinding, void *propertyDataPtr);
+ QPropertyBindingPrivate *binding();
+
+ void evaluateIfDirty();
+ void removeBinding();
+
+ void registerWithCurrentlyEvaluatingBinding() const;
+ void notifyObservers(void *propertyDataPtr);
+
+ void setExtraBit(bool b)
+ {
+ if (b)
+ d_ptr |= ExtraBit;
+ else
+ d_ptr &= ~ExtraBit;
+ }
+
+ bool extraBit() const { return d_ptr & ExtraBit; }
+
+ static const quintptr ExtraBit = 0x1; // Used for QProperty<bool> specialization
+ static const quintptr BindingBit = 0x2; // Is d_ptr pointing to a binding (1) or list of notifiers (0)?
+ static const quintptr FlagMask = BindingBit | ExtraBit;
+};
+
+template <typename T>
+struct QPropertyValueStorage
+{
+private:
+ T value;
+public:
+ QPropertyBase priv;
+
+ QPropertyValueStorage() : value() {}
+ Q_DISABLE_COPY(QPropertyValueStorage)
+ explicit QPropertyValueStorage(const T &initialValue) : value(initialValue) {}
+ QPropertyValueStorage &operator=(const T &newValue) { value = newValue; return *this; }
+ explicit QPropertyValueStorage(T &&initialValue) : value(std::move(initialValue)) {}
+ QPropertyValueStorage &operator=(T &&newValue) { value = std::move(newValue); return *this; }
+ QPropertyValueStorage(QPropertyValueStorage &&other) : value(std::move(other.value)), priv(std::move(other.priv), this) {}
+ QPropertyValueStorage &operator=(QPropertyValueStorage &&other) { value = std::move(other.value); priv.moveAssign(std::move(other.priv), &value); return *this; }
+
+ T getValue() const { return value; }
+ bool setValueAndReturnTrueIfChanged(T &&v)
+ {
+ if (v == value)
+ return false;
+ value = std::move(v);
+ return true;
+ }
+ bool setValueAndReturnTrueIfChanged(const T &v)
+ {
+ if (v == value)
+ return false;
+ value = v;
+ return true;
+ }
+};
+
+template<>
+struct QPropertyValueStorage<bool>
+{
+ QPropertyBase priv;
+
+ QPropertyValueStorage() = default;
+ Q_DISABLE_COPY(QPropertyValueStorage)
+ explicit QPropertyValueStorage(bool initialValue) { priv.setExtraBit(initialValue); }
+ QPropertyValueStorage &operator=(bool newValue) { priv.setExtraBit(newValue); return *this; }
+ QPropertyValueStorage(QPropertyValueStorage &&other) : priv(std::move(other.priv), this) {}
+ QPropertyValueStorage &operator=(QPropertyValueStorage &&other) { priv.moveAssign(std::move(other.priv), this); return *this; }
+
+ bool getValue() const { return priv.extraBit(); }
+ bool setValueAndReturnTrueIfChanged(bool v)
+ {
+ if (v == priv.extraBit())
+ return false;
+ priv.setExtraBit(v);
+ return true;
+ }
+};
+
+template <typename T, typename Tag>
+class QTagPreservingPointerToPointer
+{
+public:
+ QTagPreservingPointerToPointer() = default;
+
+ QTagPreservingPointerToPointer(T **ptr)
+ : d(reinterpret_cast<quintptr*>(ptr))
+ {}
+
+ QTagPreservingPointerToPointer<T, Tag> &operator=(T **ptr)
+ {
+ d = reinterpret_cast<quintptr*>(ptr);
+ return *this;
+ }
+
+ QTagPreservingPointerToPointer<T, Tag> &operator=(QTaggedPointer<T, Tag> *ptr)
+ {
+ d = reinterpret_cast<quintptr*>(ptr);
+ return *this;
+ }
+
+ void clear()
+ {
+ d = nullptr;
+ }
+
+ void setPointer(T *ptr)
+ {
+ *d = (reinterpret_cast<quintptr>(ptr) & QTaggedPointer<T, Tag>::pointerMask()) | (*d & QTaggedPointer<T, Tag>::tagMask());
+ }
+
+ T *get() const
+ {
+ return reinterpret_cast<T*>(*d & QTaggedPointer<T, Tag>::pointerMask());
+ }
+
+ explicit operator bool() const
+ {
+ return d != nullptr;
+ }
+
+private:
+ quintptr *d = nullptr;
+};
+
+} // namespace QtPrivate
+
+QT_END_NAMESPACE
+
+#endif // QPROPERTYPRIVATE_H
diff --git a/src/corelib/kernel/qsignalmapper.cpp b/src/corelib/kernel/qsignalmapper.cpp
index dc0dfe8f40..8e690d15ff 100644
--- a/src/corelib/kernel/qsignalmapper.cpp
+++ b/src/corelib/kernel/qsignalmapper.cpp
@@ -60,28 +60,19 @@ public:
Q_Q(QSignalMapper);
auto it = mappedValues.find(sender);
- if (it != mappedValues.end()) {
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- Q_EMIT q->mapped(*it);
-QT_WARNING_POP
-#endif
+ if (it != mappedValues.end())
Q_EMIT (q->*signal)(*it);
- }
}
void emitMappedValues(QObject *sender)
{
emitMappedValue(sender, &QSignalMapper::mappedInt, intHash);
emitMappedValue(sender, &QSignalMapper::mappedString, stringHash);
- emitMappedValue(sender, &QSignalMapper::mappedWidget, widgetHash);
emitMappedValue(sender, &QSignalMapper::mappedObject, objectHash);
}
QHash<QObject *, int> intHash;
QHash<QObject *, QString> stringHash;
- QHash<QObject *, QWidget*> widgetHash;
QHash<QObject *, QObject*> objectHash;
};
@@ -102,8 +93,8 @@ QT_WARNING_POP
The class supports the mapping of particular strings, integers,
objects and widgets with particular objects using setMapping().
The objects' signals can then be connected to the map() slot which
- will emit a signal (it could be mappedInt(), mappedString(),
- mappedWidget() and mappedObject()) with a value associated with
+ will emit a signal (it could be mappedInt(), mappedString()
+ and mappedObject()) with a value associated with
the original signalling object. Mappings can be removed later using
removeMappings().
@@ -191,19 +182,6 @@ void QSignalMapper::setMapping(QObject *sender, const QString &text)
/*!
Adds a mapping so that when map() is signalled from the \a sender,
- the signal mappedWidget(\a widget ) is emitted.
-
- There may be at most one widget for each sender.
-*/
-void QSignalMapper::setMapping(QObject *sender, QWidget *widget)
-{
- Q_D(QSignalMapper);
- d->widgetHash.insert(sender, widget);
- connect(sender, SIGNAL(destroyed()), this, SLOT(_q_senderDestroyed()));
-}
-
-/*!
- Adds a mapping so that when map() is signalled from the \a sender,
the signal mappedObject(\a object ) is emitted.
There may be at most one object for each sender.
@@ -238,17 +216,6 @@ QObject *QSignalMapper::mapping(const QString &id) const
/*!
\overload mapping()
- Returns the sender QObject that is associated with the \a widget.
-*/
-QObject *QSignalMapper::mapping(QWidget *widget) const
-{
- Q_D(const QSignalMapper);
- return d->widgetHash.key(widget);
-}
-
-/*!
- \overload mapping()
-
Returns the sender QObject that is associated with the \a object.
*/
QObject *QSignalMapper::mapping(QObject *object) const
@@ -271,7 +238,6 @@ void QSignalMapper::removeMappings(QObject *sender)
d->intHash.remove(sender);
d->stringHash.remove(sender);
- d->widgetHash.remove(sender);
d->objectHash.remove(sender);
}
@@ -288,56 +254,6 @@ void QSignalMapper::map(QObject *sender)
d_func()->emitMappedValues(sender);
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \fn void QSignalMapper::mapped(int i)
- \obsolete
- \overload
-
- This signal is emitted when map() is signalled from an object that
- has an integer mapping set. The object's mapped integer is passed
- in \a i.
-
- \sa setMapping()
-*/
-
-/*!
- \fn void QSignalMapper::mapped(const QString &text)
- \obsolete
- \overload
-
- This signal is emitted when map() is signalled from an object that
- has a string mapping set. The object's mapped string is passed in
- \a text.
-
- \sa setMapping()
-*/
-
-/*!
- \fn void QSignalMapper::mapped(QWidget *widget)
- \obsolete
- \overload
-
- This signal is emitted when map() is signalled from an object that
- has a widget mapping set. The object's mapped widget is passed in
- \a widget.
-
- \sa setMapping()
-*/
-
-/*!
- \fn void QSignalMapper::mapped(QObject *object)
- \obsolete
- \overload
-
- This signal is emitted when map() is signalled from an object that
- has an object mapping set. The object provided by the map is passed in
- \a object.
-
- \sa setMapping()
-*/
-#endif
-
/*!
\fn void QSignalMapper::mappedInt(int i)
\since 5.15
@@ -361,17 +277,6 @@ void QSignalMapper::map(QObject *sender)
*/
/*!
- \fn void QSignalMapper::mappedWidget(QWidget *widget)
- \since 5.15
-
- This signal is emitted when map() is signalled from an object that
- has a widget mapping set. The object's mapped widget is passed in
- \a widget.
-
- \sa setMapping()
-*/
-
-/*!
\fn void QSignalMapper::mappedObject(QObject *object)
\since 5.15
diff --git a/src/corelib/kernel/qsignalmapper.h b/src/corelib/kernel/qsignalmapper.h
index 592986e6a5..e92b275428 100644
--- a/src/corelib/kernel/qsignalmapper.h
+++ b/src/corelib/kernel/qsignalmapper.h
@@ -56,29 +56,16 @@ public:
void setMapping(QObject *sender, int id);
void setMapping(QObject *sender, const QString &text);
- void setMapping(QObject *sender, QWidget *widget);
void setMapping(QObject *sender, QObject *object);
void removeMappings(QObject *sender);
QObject *mapping(int id) const;
QObject *mapping(const QString &text) const;
- QObject *mapping(QWidget *widget) const;
QObject *mapping(QObject *object) const;
Q_SIGNALS:
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedInt(int) instead")
- void mapped(int);
- QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedString(const QString&) instead")
- void mapped(const QString &);
- QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedWidget(QWidget *) instead")
- void mapped(QWidget *);
- QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedObject(QObject *) instead")
- void mapped(QObject *);
-#endif
void mappedInt(int);
void mappedString(const QString &);
- void mappedWidget(QWidget *);
void mappedObject(QObject *);
public Q_SLOTS:
diff --git a/src/corelib/kernel/qtestsupport_core.h b/src/corelib/kernel/qtestsupport_core.h
index c8209b5ae4..24399dd7a9 100644
--- a/src/corelib/kernel/qtestsupport_core.h
+++ b/src/corelib/kernel/qtestsupport_core.h
@@ -76,14 +76,14 @@ Q_REQUIRED_RESULT static bool qWaitFor(Functor predicate, int timeout = 5000)
QCoreApplication::processEvents(QEventLoop::AllEvents);
QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
- remaining = deadline.remainingTime();
+ remaining = int(deadline.remainingTime());
if (remaining > 0)
QTestPrivate::qSleep(qMin(10, remaining));
if (predicate())
return true;
- remaining = deadline.remainingTime();
+ remaining = int(deadline.remainingTime());
} while (remaining > 0);
return predicate(); // Last chance
diff --git a/src/corelib/kernel/qtmetamacros.h b/src/corelib/kernel/qtmetamacros.h
new file mode 100644
index 0000000000..2dcd6948aa
--- /dev/null
+++ b/src/corelib/kernel/qtmetamacros.h
@@ -0,0 +1,234 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2019 Olivier Goffart <ogoffart@woboq.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTMETAMACROS_H
+#define QTMETAMACROS_H
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef Q_MOC_OUTPUT_REVISION
+#define Q_MOC_OUTPUT_REVISION 67
+#endif
+
+// The following macros can be defined by tools that understand Qt
+// to have the information from the macro.
+#ifndef QT_ANNOTATE_CLASS
+# define QT_ANNOTATE_CLASS(type, ...)
+#endif
+#ifndef QT_ANNOTATE_CLASS2
+# define QT_ANNOTATE_CLASS2(type, a1, a2)
+#endif
+#ifndef QT_ANNOTATE_FUNCTION
+# define QT_ANNOTATE_FUNCTION(x)
+#endif
+#ifndef QT_ANNOTATE_ACCESS_SPECIFIER
+# define QT_ANNOTATE_ACCESS_SPECIFIER(x)
+#endif
+
+// The following macros are our "extensions" to C++
+// They are used, strictly speaking, only by the moc.
+
+#ifndef Q_MOC_RUN
+#ifndef QT_NO_META_MACROS
+# if defined(QT_NO_KEYWORDS)
+# define QT_NO_EMIT
+# else
+# ifndef QT_NO_SIGNALS_SLOTS_KEYWORDS
+# define slots Q_SLOTS
+# define signals Q_SIGNALS
+# endif
+# endif
+# define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot)
+# define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal)
+# define Q_PRIVATE_SLOT(d, signature) QT_ANNOTATE_CLASS2(qt_private_slot, d, signature)
+# define Q_EMIT
+#ifndef QT_NO_EMIT
+# define emit
+#endif
+#ifndef Q_CLASSINFO
+# define Q_CLASSINFO(name, value)
+#endif
+#define Q_PLUGIN_METADATA(x) QT_ANNOTATE_CLASS(qt_plugin_metadata, x)
+#define Q_INTERFACES(x) QT_ANNOTATE_CLASS(qt_interfaces, x)
+#define Q_PROPERTY(...) QT_ANNOTATE_CLASS(qt_property, __VA_ARGS__)
+#define Q_PRIVATE_PROPERTY(d, text) QT_ANNOTATE_CLASS2(qt_private_property, d, text)
+#ifndef Q_REVISION
+# define Q_REVISION(...)
+#endif
+#define Q_OVERRIDE(text) QT_ANNOTATE_CLASS(qt_override, text)
+#define QDOC_PROPERTY(text) QT_ANNOTATE_CLASS(qt_qdoc_property, text)
+#define Q_ENUMS(x) QT_ANNOTATE_CLASS(qt_enums, x)
+#define Q_FLAGS(x) QT_ANNOTATE_CLASS(qt_enums, x)
+#define Q_ENUM_IMPL(ENUM) \
+ friend Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \
+ friend Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) noexcept { return #ENUM; }
+#define Q_ENUM(x) Q_ENUMS(x) Q_ENUM_IMPL(x)
+#define Q_FLAG(x) Q_FLAGS(x) Q_ENUM_IMPL(x)
+#define Q_ENUM_NS_IMPL(ENUM) \
+ inline Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \
+ inline Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) noexcept { return #ENUM; }
+#define Q_ENUM_NS(x) Q_ENUMS(x) Q_ENUM_NS_IMPL(x)
+#define Q_FLAG_NS(x) Q_FLAGS(x) Q_ENUM_NS_IMPL(x)
+#define Q_SCRIPTABLE QT_ANNOTATE_FUNCTION(qt_scriptable)
+#define Q_INVOKABLE QT_ANNOTATE_FUNCTION(qt_invokable)
+#define Q_SIGNAL QT_ANNOTATE_FUNCTION(qt_signal)
+#define Q_SLOT QT_ANNOTATE_FUNCTION(qt_slot)
+#define Q_MOC_INCLUDE(...) QT_ANNOTATE_CLASS(qt_moc_include, __VA_ARGS__)
+#endif // QT_NO_META_MACROS
+
+#ifndef QT_NO_TRANSLATION
+// full set of tr functions
+# define QT_TR_FUNCTIONS \
+ static inline QString tr(const char *s, const char *c = nullptr, int n = -1) \
+ { return staticMetaObject.tr(s, c, n); } \
+ QT_DEPRECATED static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) \
+ { return staticMetaObject.tr(s, c, n); }
+#else
+// inherit the ones from QObject
+# define QT_TR_FUNCTIONS
+#endif
+
+#ifdef Q_CLANG_QDOC
+#define QT_TR_FUNCTIONS
+#endif
+
+// ### Qt6: remove
+#define Q_OBJECT_CHECK /* empty, unused since Qt 5.2 */
+
+#if defined(Q_CC_INTEL)
+// Cannot redefine the visibility of a method in an exported class
+# define Q_DECL_HIDDEN_STATIC_METACALL
+#else
+# define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN
+#endif
+
+#if defined(Q_CC_CLANG) && Q_CC_CLANG >= 306
+# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override")
+#elif defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 501
+# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_GCC("-Wsuggest-override")
+#else
+# define Q_OBJECT_NO_OVERRIDE_WARNING
+#endif
+
+#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 600
+# define Q_OBJECT_NO_ATTRIBUTES_WARNING QT_WARNING_DISABLE_GCC("-Wattributes")
+#else
+# define Q_OBJECT_NO_ATTRIBUTES_WARNING
+#endif
+
+/* qmake ignore Q_OBJECT */
+#define Q_OBJECT \
+public: \
+ QT_WARNING_PUSH \
+ Q_OBJECT_NO_OVERRIDE_WARNING \
+ static const QMetaObject staticMetaObject; \
+ virtual const QMetaObject *metaObject() const; \
+ virtual void *qt_metacast(const char *); \
+ virtual int qt_metacall(QMetaObject::Call, int, void **); \
+ QT_TR_FUNCTIONS \
+private: \
+ Q_OBJECT_NO_ATTRIBUTES_WARNING \
+ Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
+ QT_WARNING_POP \
+ struct QPrivateSignal {}; \
+ QT_ANNOTATE_CLASS(qt_qobject, "")
+
+/* qmake ignore Q_OBJECT */
+#define Q_OBJECT_FAKE Q_OBJECT QT_ANNOTATE_CLASS(qt_fake, "")
+
+#ifndef QT_NO_META_MACROS
+/* qmake ignore Q_GADGET */
+#define Q_GADGET \
+public: \
+ static const QMetaObject staticMetaObject; \
+ void qt_check_for_QGADGET_macro(); \
+ typedef void QtGadgetHelper; \
+private: \
+ QT_WARNING_PUSH \
+ Q_OBJECT_NO_ATTRIBUTES_WARNING \
+ Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
+ QT_WARNING_POP \
+ QT_ANNOTATE_CLASS(qt_qgadget, "") \
+ /*end*/
+
+/* qmake ignore Q_NAMESPACE_EXPORT */
+#define Q_NAMESPACE_EXPORT(...) \
+ extern __VA_ARGS__ const QMetaObject staticMetaObject; \
+ QT_ANNOTATE_CLASS(qt_qnamespace, "") \
+ /*end*/
+
+/* qmake ignore Q_NAMESPACE */
+#define Q_NAMESPACE Q_NAMESPACE_EXPORT() \
+ /*end*/
+
+#endif // QT_NO_META_MACROS
+
+#else // Q_MOC_RUN
+#define slots slots
+#define signals signals
+#define Q_SLOTS Q_SLOTS
+#define Q_SIGNALS Q_SIGNALS
+#define Q_CLASSINFO(name, value) Q_CLASSINFO(name, value)
+#define Q_INTERFACES(x) Q_INTERFACES(x)
+#define Q_PROPERTY(text) Q_PROPERTY(text)
+#define Q_PRIVATE_PROPERTY(d, text) Q_PRIVATE_PROPERTY(d, text)
+#define Q_REVISION(...) Q_REVISION(__VA_ARGS__)
+#define Q_OVERRIDE(text) Q_OVERRIDE(text)
+#define Q_ENUMS(x) Q_ENUMS(x)
+#define Q_FLAGS(x) Q_FLAGS(x)
+#define Q_ENUM(x) Q_ENUM(x)
+#define Q_FLAGS(x) Q_FLAGS(x)
+ /* qmake ignore Q_OBJECT */
+#define Q_OBJECT Q_OBJECT
+ /* qmake ignore Q_OBJECT */
+#define Q_OBJECT_FAKE Q_OBJECT_FAKE
+ /* qmake ignore Q_GADGET */
+#define Q_GADGET Q_GADGET
+#define Q_SCRIPTABLE Q_SCRIPTABLE
+#define Q_INVOKABLE Q_INVOKABLE
+#define Q_SIGNAL Q_SIGNAL
+#define Q_SLOT Q_SLOT
+#endif //Q_MOC_RUN
+
+QT_END_NAMESPACE
+
+#endif // QTMETAMACROS_H
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 2205366696..5767d52f6a 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -58,11 +58,11 @@
#include "qendian.h"
#include "qresource.h"
-#if defined(Q_OS_UNIX) && !defined(Q_OS_INTEGRITY)
-#define QT_USE_MMAP
-#include "private/qcore_unix_p.h"
+#if defined(Q_OS_UNIX) && !defined(Q_OS_NACL) && !defined(Q_OS_INTEGRITY)
+# define QT_USE_MMAP
+# include "private/qcore_unix_p.h"
// for mmap
-#include <sys/mman.h>
+# include <sys/mman.h>
#endif
#include <stdlib.h>
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp
index 3be9a02248..6d3c7b4831 100644
--- a/src/corelib/kernel/qvariant.cpp
+++ b/src/corelib/kernel/qvariant.cpp
@@ -118,22 +118,10 @@ struct CoreTypesFilter {
namespace { // annonymous used to hide QVariant handlers
-static void construct(QVariant::Private *x, const void *copy)
-{
- QVariantConstructor<CoreTypesFilter> constructor(x, copy);
- QMetaTypeSwitcher::switcher<void>(constructor, x->type);
-}
-
-static void clear(QVariant::Private *d)
-{
- QVariantDestructor<CoreTypesFilter> cleaner(d);
- QMetaTypeSwitcher::switcher<void>(cleaner, d->type);
-}
-
static bool isNull(const QVariant::Private *d)
{
QVariantIsNull<CoreTypesFilter> isNull(d);
- return QMetaTypeSwitcher::switcher<bool>(isNull, d->type);
+ return QMetaTypeSwitcher::switcher<bool>(isNull, d->type().id());
}
/*!
@@ -145,7 +133,7 @@ static bool isNull(const QVariant::Private *d)
static bool compare(const QVariant::Private *a, const QVariant::Private *b)
{
QVariantComparator<CoreTypesFilter> comparator(a, b);
- return QMetaTypeSwitcher::switcher<bool>(comparator, a->type);
+ return QMetaTypeSwitcher::switcher<bool>(comparator, a->type().id());
}
/*!
@@ -153,7 +141,7 @@ static bool compare(const QVariant::Private *a, const QVariant::Private *b)
*/
static qlonglong qMetaTypeNumber(const QVariant::Private *d)
{
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::Int:
return d->data.i;
case QMetaType::LongLong:
@@ -183,7 +171,7 @@ static qlonglong qMetaTypeNumber(const QVariant::Private *d)
static qulonglong qMetaTypeUNumber(const QVariant::Private *d)
{
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::UInt:
return d->data.u;
case QMetaType::ULongLong:
@@ -203,7 +191,7 @@ static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok)
{
*ok = true;
- switch (uint(d->type)) {
+ switch (uint(d->type().id())) {
case QMetaType::QString:
return v_cast<QString>(d)->toLongLong(ok);
case QMetaType::QChar:
@@ -240,8 +228,9 @@ static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok)
return qlonglong(qMetaTypeUNumber(d));
}
- QMetaType typeInfo(d->type);
- if (typeInfo.flags() & QMetaType::IsEnumeration || d->type == QMetaType::QCborSimpleType) {
+ QMetaType typeInfo = d->type();
+ if (typeInfo.flags() & QMetaType::IsEnumeration
+ || d->type().id() == QMetaType::QCborSimpleType) {
switch (typeInfo.sizeOf()) {
case 1:
return d->is_shared ? *reinterpret_cast<signed char *>(d->data.shared->ptr) : d->data.sc;
@@ -261,7 +250,7 @@ static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok)
static qreal qConvertToRealNumber(const QVariant::Private *d, bool *ok)
{
*ok = true;
- switch (uint(d->type)) {
+ switch (uint(d->type().id())) {
case QMetaType::Double:
return qreal(d->data.d);
case QMetaType::Float:
@@ -288,7 +277,7 @@ static qulonglong qConvertToUnsignedNumber(const QVariant::Private *d, bool *ok)
{
*ok = true;
- switch (uint(d->type)) {
+ switch (uint(d->type().id())) {
case QMetaType::QString:
return v_cast<QString>(d)->toULongLong(ok);
case QMetaType::QChar:
@@ -326,7 +315,7 @@ static qulonglong qConvertToUnsignedNumber(const QVariant::Private *d, bool *ok)
return qMetaTypeUNumber(d);
}
- QMetaType typeInfo(d->type);
+ QMetaType typeInfo = d->type();
if (typeInfo.flags() & QMetaType::IsEnumeration) {
switch (typeInfo.sizeOf()) {
case 1:
@@ -366,16 +355,14 @@ static const void *constData(const QVariant::Private &d)
\internal
returns a QMetaEnum for a given meta tape type id if possible
*/
-static QMetaEnum metaEnumFromType(int type)
+static QMetaEnum metaEnumFromType(QMetaType t)
{
- QMetaType t(type);
if (t.flags() & QMetaType::IsEnumeration) {
if (const QMetaObject *metaObject = t.metaObject()) {
- const char *enumName = QMetaType::typeName(type);
+ const QByteArray enumName = t.name();
const char *lastColon = std::strrchr(enumName, ':');
- if (lastColon)
- enumName = lastColon + 1;
- return metaObject->enumerator(metaObject->indexOfEnumerator(enumName));
+ return metaObject->enumerator(metaObject->indexOfEnumerator(
+ lastColon ? lastColon + 1 : enumName.constData()));
}
}
return QMetaEnum();
@@ -389,11 +376,11 @@ static QMetaEnum metaEnumFromType(int type)
*/
static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
{
- Q_ASSERT(d->type != uint(t));
+ Q_ASSERT(d->type().id() != t);
Q_ASSERT(result);
- if (d->type >= QMetaType::User || t >= QMetaType::User) {
- const bool isOk = QMetaType::convert(constData(*d), d->type, result, t);
+ if (d->type().id() >= QMetaType::User || t >= QMetaType::User) {
+ const bool isOk = QMetaType::convert(constData(*d), d->type().id(), result, t);
if (ok)
*ok = isOk;
if (isOk)
@@ -407,7 +394,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
switch (uint(t)) {
#ifndef QT_BOOTSTRAPPED
case QMetaType::QUrl:
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QString:
*static_cast<QUrl *>(result) = QUrl(*v_cast<QString>(d));
break;
@@ -424,7 +411,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
#endif // QT_BOOTSTRAPPED
#if QT_CONFIG(itemmodel)
case QMetaType::QModelIndex:
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QPersistentModelIndex:
*static_cast<QModelIndex *>(result) = QModelIndex(*v_cast<QPersistentModelIndex>(d));
break;
@@ -433,7 +420,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
case QMetaType::QPersistentModelIndex:
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QModelIndex:
*static_cast<QPersistentModelIndex *>(result) = QPersistentModelIndex(*v_cast<QModelIndex>(d));
break;
@@ -444,7 +431,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
#endif // QT_CONFIG(itemmodel)
case QMetaType::QString: {
QString *str = static_cast<QString *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QChar:
*str = *v_cast<QChar>(d);
break;
@@ -517,7 +504,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
default:
#ifndef QT_NO_QOBJECT
{
- QMetaEnum en = metaEnumFromType(d->type);
+ QMetaEnum en = metaEnumFromType(d->type());
if (en.isValid()) {
*str = QString::fromUtf8(en.valueToKey(qConvertToNumber(d, ok)));
return *ok;
@@ -530,7 +517,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
case QMetaType::QChar: {
QChar *c = static_cast<QChar *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::Int:
case QMetaType::LongLong:
case QMetaType::Char:
@@ -555,7 +542,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
#ifndef QT_NO_GEOM_VARIANT
case QMetaType::QSize: {
QSize *s = static_cast<QSize *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QSizeF:
*s = v_cast<QSizeF>(d)->toSize();
break;
@@ -567,7 +554,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::QSizeF: {
QSizeF *s = static_cast<QSizeF *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QSize:
*s = QSizeF(*(v_cast<QSize>(d)));
break;
@@ -579,7 +566,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::QLine: {
QLine *s = static_cast<QLine *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QLineF:
*s = v_cast<QLineF>(d)->toLine();
break;
@@ -591,7 +578,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::QLineF: {
QLineF *s = static_cast<QLineF *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QLine:
*s = QLineF(*(v_cast<QLine>(d)));
break;
@@ -602,14 +589,14 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
#endif
case QMetaType::QStringList:
- if (d->type == QMetaType::QVariantList) {
+ if (d->type().id() == QMetaType::QVariantList) {
QStringList *slst = static_cast<QStringList *>(result);
const QVariantList *list = v_cast<QVariantList >(d);
const int size = list->size();
slst->reserve(size);
for (int i = 0; i < size; ++i)
slst->append(list->at(i).toString());
- } else if (d->type == QMetaType::QString) {
+ } else if (d->type().id() == QMetaType::QString) {
QStringList *slst = static_cast<QStringList *>(result);
*slst = QStringList(*v_cast<QString>(d));
} else {
@@ -618,10 +605,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
case QMetaType::QDate: {
QDate *dt = static_cast<QDate *>(result);
- if (d->type == QMetaType::QDateTime)
+ if (d->type().id() == QMetaType::QDateTime)
*dt = v_cast<QDateTime>(d)->date();
#if QT_CONFIG(datestring)
- else if (d->type == QMetaType::QString)
+ else if (d->type().id() == QMetaType::QString)
*dt = QDate::fromString(*v_cast<QString>(d), Qt::ISODate);
#endif
else
@@ -631,7 +618,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
case QMetaType::QTime: {
QTime *t = static_cast<QTime *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QDateTime:
*t = v_cast<QDateTime>(d)->time();
break;
@@ -647,7 +634,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
case QMetaType::QDateTime: {
QDateTime *dt = static_cast<QDateTime *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
#if QT_CONFIG(datestring)
case QMetaType::QString:
*dt = QDateTime::fromString(*v_cast<QString>(d), Qt::ISODate);
@@ -671,7 +658,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
case QMetaType::QByteArray: {
QByteArray *ba = static_cast<QByteArray *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QString:
*ba = v_cast<QString>(d)->toUtf8();
break;
@@ -718,7 +705,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
default:
#ifndef QT_NO_QOBJECT
{
- QMetaEnum en = metaEnumFromType(d->type);
+ QMetaEnum en = metaEnumFromType(d->type());
if (en.isValid()) {
*ba = en.valueToKey(qConvertToNumber(d, ok));
return *ok;
@@ -765,7 +752,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
case QMetaType::Bool: {
bool *b = static_cast<bool *>(result);
- switch(d->type) {
+ switch (d->type().id()) {
case QMetaType::QByteArray:
*b = qt_convertToBool<QByteArray, const char*>(d);
break;
@@ -812,7 +799,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
case QMetaType::Double: {
double *f = static_cast<double *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QString:
*f = v_cast<QString>(d)->toDouble(ok);
break;
@@ -860,7 +847,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
case QMetaType::Float: {
float *f = static_cast<float *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QString:
*f = v_cast<QString>(d)->toFloat(ok);
break;
@@ -907,28 +894,25 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
}
case QMetaType::QVariantList:
- if (d->type == QMetaType::QStringList) {
+ if (d->type().id() == QMetaType::QStringList) {
QVariantList *lst = static_cast<QVariantList *>(result);
const QStringList *slist = v_cast<QStringList>(d);
const int size = slist->size();
lst->reserve(size);
for (int i = 0; i < size; ++i)
lst->append(QVariant(slist->at(i)));
- } else if (qstrcmp(QMetaType::typeName(d->type), "QList<QVariant>") == 0) {
- *static_cast<QVariantList *>(result) =
- *static_cast<QList<QVariant> *>(d->data.shared->ptr);
#ifndef QT_BOOTSTRAPPED
- } else if (d->type == QMetaType::QCborValue) {
+ } else if (d->type().id() == QMetaType::QCborValue) {
if (!v_cast<QCborValue>(d)->isArray())
return false;
*static_cast<QVariantList *>(result) = v_cast<QCborValue>(d)->toArray().toVariantList();
- } else if (d->type == QMetaType::QCborArray) {
+ } else if (d->type().id() == QMetaType::QCborArray) {
*static_cast<QVariantList *>(result) = v_cast<QCborArray>(d)->toVariantList();
- } else if (d->type == QMetaType::QJsonValue) {
+ } else if (d->type().id() == QMetaType::QJsonValue) {
if (!v_cast<QJsonValue>(d)->isArray())
return false;
*static_cast<QVariantList *>(result) = v_cast<QJsonValue>(d)->toArray().toVariantList();
- } else if (d->type == QMetaType::QJsonArray) {
+ } else if (d->type().id() == QMetaType::QJsonArray) {
*static_cast<QVariantList *>(result) = v_cast<QJsonArray>(d)->toVariantList();
#endif
} else {
@@ -936,27 +920,24 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
case QMetaType::QVariantMap:
- if (qstrcmp(QMetaType::typeName(d->type), "QMap<QString, QVariant>") == 0) {
- *static_cast<QVariantMap *>(result) =
- *static_cast<QMap<QString, QVariant> *>(d->data.shared->ptr);
- } else if (d->type == QMetaType::QVariantHash) {
+ if (d->type().id() == QMetaType::QVariantHash) {
QVariantMap *map = static_cast<QVariantMap *>(result);
const QVariantHash *hash = v_cast<QVariantHash>(d);
const auto end = hash->end();
for (auto it = hash->begin(); it != end; ++it)
static_cast<QMultiMap<QString, QVariant> *>(map)->insert(it.key(), it.value());
#ifndef QT_BOOTSTRAPPED
- } else if (d->type == QMetaType::QCborValue) {
+ } else if (d->type().id() == QMetaType::QCborValue) {
if (!v_cast<QCborValue>(d)->isMap())
return false;
*static_cast<QVariantMap *>(result) = v_cast<QCborValue>(d)->toMap().toVariantMap();
- } else if (d->type == QMetaType::QCborMap) {
+ } else if (d->type().id() == QMetaType::QCborMap) {
*static_cast<QVariantMap *>(result) = v_cast<QCborMap>(d)->toVariantMap();
- } else if (d->type == QMetaType::QJsonValue) {
+ } else if (d->type().id() == QMetaType::QJsonValue) {
if (!v_cast<QJsonValue>(d)->isObject())
return false;
*static_cast<QVariantMap *>(result) = v_cast<QJsonValue>(d)->toObject().toVariantMap();
- } else if (d->type == QMetaType::QJsonObject) {
+ } else if (d->type().id() == QMetaType::QJsonObject) {
*static_cast<QVariantMap *>(result) = v_cast<QJsonObject>(d)->toVariantMap();
#endif
} else {
@@ -964,27 +945,24 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
case QMetaType::QVariantHash:
- if (qstrcmp(QMetaType::typeName(d->type), "QHash<QString, QVariant>") == 0) {
- *static_cast<QVariantHash *>(result) =
- *static_cast<QHash<QString, QVariant> *>(d->data.shared->ptr);
- } else if (d->type == QMetaType::QVariantMap) {
+ if (d->type().id() == QMetaType::QVariantMap) {
QVariantHash *hash = static_cast<QVariantHash *>(result);
const QVariantMap *map = v_cast<QVariantMap>(d);
const auto end = map->end();
for (auto it = map->begin(); it != end; ++it)
- static_cast<QMultiHash<QString, QVariant> *>(hash)->insert(it.key(), it.value());
+ hash->insert(it.key(), it.value());
#ifndef QT_BOOTSTRAPPED
- } else if (d->type == QMetaType::QCborValue) {
+ } else if (d->type().id() == QMetaType::QCborValue) {
if (!v_cast<QCborValue>(d)->isMap())
return false;
*static_cast<QVariantHash *>(result) = v_cast<QCborValue>(d)->toMap().toVariantHash();
- } else if (d->type == QMetaType::QCborMap) {
+ } else if (d->type().id() == QMetaType::QCborMap) {
*static_cast<QVariantHash *>(result) = v_cast<QCborMap>(d)->toVariantHash();
- } else if (d->type == QMetaType::QJsonValue) {
+ } else if (d->type().id() == QMetaType::QJsonValue) {
if (!v_cast<QJsonValue>(d)->isObject())
return false;
*static_cast<QVariantHash *>(result) = v_cast<QJsonValue>(d)->toObject().toVariantHash();
- } else if (d->type == QMetaType::QJsonObject) {
+ } else if (d->type().id() == QMetaType::QJsonObject) {
*static_cast<QVariantHash *>(result) = v_cast<QJsonObject>(d)->toVariantHash();
#endif
} else {
@@ -993,25 +971,25 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
#ifndef QT_NO_GEOM_VARIANT
case QMetaType::QRect:
- if (d->type == QMetaType::QRectF)
+ if (d->type().id() == QMetaType::QRectF)
*static_cast<QRect *>(result) = (v_cast<QRectF>(d))->toRect();
else
return false;
break;
case QMetaType::QRectF:
- if (d->type == QMetaType::QRect)
+ if (d->type().id() == QMetaType::QRect)
*static_cast<QRectF *>(result) = *v_cast<QRect>(d);
else
return false;
break;
case QMetaType::QPointF:
- if (d->type == QMetaType::QPoint)
+ if (d->type().id() == QMetaType::QPoint)
*static_cast<QPointF *>(result) = *v_cast<QPoint>(d);
else
return false;
break;
case QMetaType::QPoint:
- if (d->type == QMetaType::QPointF)
+ if (d->type().id() == QMetaType::QPointF)
*static_cast<QPoint *>(result) = (v_cast<QPointF>(d))->toPoint();
else
return false;
@@ -1023,7 +1001,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
#endif
case QMetaType::QUuid:
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QString:
*static_cast<QUuid *>(result) = QUuid(*v_cast<QString>(d));
break;
@@ -1044,12 +1022,12 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::Nullptr:
*static_cast<std::nullptr_t *>(result) = nullptr;
if (QMetaType::typeFlags(t) & (QMetaType::PointerToGadget | QMetaType::PointerToQObject)
- || d->type == QMetaType::VoidStar) {
+ || d->type().id() == QMetaType::VoidStar) {
if (v_cast<const void *>(d) == nullptr)
break;
}
#ifndef QT_BOOTSTRAPPED
- if (d->type == QMetaType::QCborValue && v_cast<QCborValue>(d)->isNull())
+ if (d->type().id() == QMetaType::QCborValue && v_cast<QCborValue>(d)->isNull())
break;
#endif
return false;
@@ -1057,13 +1035,14 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
#ifndef QT_BOOTSTRAPPED
#if QT_CONFIG(regularexpression)
case QMetaType::QRegularExpression:
- if (d->type != QMetaType::QCborValue || !v_cast<QCborValue>(d)->isRegularExpression())
+ if (d->type().id() != QMetaType::QCborValue
+ || !v_cast<QCborValue>(d)->isRegularExpression())
return false;
*static_cast<QRegularExpression *>(result) = v_cast<QCborValue>(d)->toRegularExpression();
break;
#endif
case QMetaType::QJsonValue:
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::Nullptr:
*static_cast<QJsonValue *>(result) = QJsonValue(QJsonValue::Null);
break;
@@ -1127,7 +1106,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
case QMetaType::QJsonArray:
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QStringList:
*static_cast<QJsonArray *>(result) = QJsonArray::fromStringList(*v_cast<QStringList>(d));
break;
@@ -1157,7 +1136,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
case QMetaType::QJsonObject:
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QVariantMap:
*static_cast<QJsonObject *>(result) = QJsonObject::fromVariantMap(*v_cast<QVariantMap>(d));
break;
@@ -1187,13 +1166,13 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
case QMetaType::QCborSimpleType:
- if (d->type == QMetaType::QCborValue && v_cast<QCborValue>(d)->isSimpleType()) {
+ if (d->type().id() == QMetaType::QCborValue && v_cast<QCborValue>(d)->isSimpleType()) {
*static_cast<QCborSimpleType *>(result) = v_cast<QCborValue>(d)->toSimpleType();
break;
}
return false;
case QMetaType::QCborValue:
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::Nullptr:
*static_cast<QCborValue *>(result) = QCborValue(QCborValue::Null);
break;
@@ -1286,7 +1265,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
case QMetaType::QCborArray:
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QStringList:
*static_cast<QCborArray *>(result) = QCborArray::fromStringList(*v_cast<QStringList>(d));
break;
@@ -1316,7 +1295,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
case QMetaType::QCborMap:
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QVariantMap:
*static_cast<QCborMap *>(result) = QCborMap::fromVariantMap(*v_cast<QVariantMap>(d));
break;
@@ -1349,10 +1328,12 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
default:
#ifndef QT_NO_QOBJECT
- if (d->type == QMetaType::QString || d->type == QMetaType::QByteArray) {
- QMetaEnum en = metaEnumFromType(t);
+ if (d->type().id() == QMetaType::QString || d->type().id() == QMetaType::QByteArray) {
+ QMetaEnum en = metaEnumFromType(QMetaType(t));
if (en.isValid()) {
- QByteArray keys = (d->type == QMetaType::QString) ? v_cast<QString>(d)->toUtf8() : *v_cast<QByteArray>(d);
+ QByteArray keys = (d->type().id() == QMetaType::QString)
+ ? v_cast<QString>(d)->toUtf8()
+ : *v_cast<QByteArray>(d);
int value = en.keysToValue(keys.constData(), ok);
if (*ok) {
switch (QMetaType::sizeOf(t)) {
@@ -1373,7 +1354,8 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
}
#endif
- if (QMetaType::typeFlags(t) & QMetaType::IsEnumeration || d->type == QMetaType::QCborSimpleType) {
+ if (QMetaType::typeFlags(t) & QMetaType::IsEnumeration
+ || d->type().id() == QMetaType::QCborSimpleType) {
qlonglong value = qConvertToNumber(d, ok);
if (*ok) {
switch (QMetaType::sizeOf(t)) {
@@ -1403,13 +1385,11 @@ static void streamDebug(QDebug dbg, const QVariant &v)
{
QVariant::Private *d = const_cast<QVariant::Private *>(&v.data_ptr());
QVariantDebugStream<CoreTypesFilter> stream(dbg, d);
- QMetaTypeSwitcher::switcher<void>(stream, d->type);
+ QMetaTypeSwitcher::switcher<void>(stream, d->type().id());
}
#endif
const QVariant::Handler qt_kernel_variant_handler = {
- construct,
- clear,
isNull,
#ifndef QT_NO_DATASTREAM
nullptr,
@@ -1425,8 +1405,6 @@ const QVariant::Handler qt_kernel_variant_handler = {
#endif
};
-static void dummyConstruct(QVariant::Private *, const void *) { Q_ASSERT_X(false, "QVariant", "Trying to construct an unknown type"); }
-static void dummyClear(QVariant::Private *) { Q_ASSERT_X(false, "QVariant", "Trying to clear an unknown type"); }
static bool dummyIsNull(const QVariant::Private *d) { Q_ASSERT_X(false, "QVariant::isNull", "Trying to call isNull on an unknown type"); return d->is_null; }
static bool dummyCompare(const QVariant::Private *, const QVariant::Private *) { Q_ASSERT_X(false, "QVariant", "Trying to compare an unknown types"); return false; }
static bool dummyConvert(const QVariant::Private *, int, void *, bool *) { Q_ASSERT_X(false, "QVariant", "Trying to convert an unknown type"); return false; }
@@ -1434,8 +1412,6 @@ static bool dummyConvert(const QVariant::Private *, int, void *, bool *) { Q_ASS
static void dummyStreamDebug(QDebug, const QVariant &) { Q_ASSERT_X(false, "QVariant", "Trying to convert an unknown type"); }
#endif
const QVariant::Handler qt_dummy_variant_handler = {
- dummyConstruct,
- dummyClear,
dummyIsNull,
#ifndef QT_NO_DATASTREAM
nullptr,
@@ -1451,43 +1427,42 @@ const QVariant::Handler qt_dummy_variant_handler = {
#endif
};
+// the type of d has already been set, but other field are not set
static void customConstruct(QVariant::Private *d, const void *copy)
{
- const QMetaType type(d->type);
+ const QMetaType type = d->type();
const uint size = type.sizeOf();
if (!size) {
- qWarning("Trying to construct an instance of an invalid type, type id: %i", d->type);
- d->type = QMetaType::UnknownType;
+ *d = QVariant::Private();
return;
}
// this logic should match with QVariantIntegrator::CanUseInternalSpace
if (size <= sizeof(QVariant::Private::Data)
&& (type.flags() & (QMetaType::MovableType | QMetaType::IsEnumeration))) {
- type.construct(&d->data.ptr, copy);
- d->is_null = d->data.ptr == nullptr;
+ type.construct(&d->data, copy);
d->is_shared = false;
} else {
// Private::Data contains long long, and long double is the biggest standard type.
const size_t maxAlignment =
- qMax(Q_ALIGNOF(QVariant::Private::Data), Q_ALIGNOF(long double));
+ qMax(alignof(QVariant::Private::Data), alignof(long double));
const size_t s = sizeof(QVariant::PrivateShared);
const size_t offset = s + ((s * maxAlignment - s) % maxAlignment);
void *data = operator new(offset + size);
void *ptr = static_cast<char *>(data) + offset;
type.construct(ptr, copy);
- d->is_null = ptr == nullptr;
d->is_shared = true;
d->data.shared = new (data) QVariant::PrivateShared(ptr);
}
+ d->is_null = !copy;
}
static void customClear(QVariant::Private *d)
{
if (!d->is_shared) {
- QMetaType::destruct(d->type, &d->data.ptr);
+ d->type().destruct(&d->data);
} else {
- QMetaType::destruct(d->type, d->data.shared->ptr);
+ d->type().destruct(d->data.shared->ptr);
d->data.shared->~PrivateShared();
operator delete(d->data.shared);
}
@@ -1497,12 +1472,8 @@ static bool customIsNull(const QVariant::Private *d)
{
if (d->is_null)
return true;
- const char *const typeName = QMetaType::typeName(d->type);
- if (Q_UNLIKELY(!typeName) && Q_LIKELY(!QMetaType::isRegistered(d->type)))
- qFatal("QVariant::isNull: type %d unknown to QVariant.", d->type);
- uint typeNameLen = qstrlen(typeName);
- if (typeNameLen > 0 && typeName[typeNameLen - 1] == '*') {
- const void *d_ptr = d->is_shared ? d->data.shared->ptr : &(d->data.ptr);
+ if (d->type().flags() & QMetaType::IsPointer) {
+ const void *d_ptr = d->is_shared ? d->data.shared->ptr : &(d->data);
return *static_cast<void *const *>(d_ptr) == nullptr;
}
return false;
@@ -1510,27 +1481,19 @@ static bool customIsNull(const QVariant::Private *d)
static bool customCompare(const QVariant::Private *a, const QVariant::Private *b)
{
- const char *const typeName = QMetaType::typeName(a->type);
- if (Q_UNLIKELY(!typeName) && Q_LIKELY(!QMetaType::isRegistered(a->type)))
- qFatal("QVariant::compare: type %d unknown to QVariant.", a->type);
-
- const void *a_ptr = a->is_shared ? a->data.shared->ptr : &(a->data.ptr);
- const void *b_ptr = b->is_shared ? b->data.shared->ptr : &(b->data.ptr);
-
- uint typeNameLen = qstrlen(typeName);
- if (typeNameLen > 0 && typeName[typeNameLen - 1] == '*')
- return *static_cast<void *const *>(a_ptr) == *static_cast<void *const *>(b_ptr);
+ const void *a_ptr = a->is_shared ? a->data.shared->ptr : &(a->data);
+ const void *b_ptr = b->is_shared ? b->data.shared->ptr : &(b->data);
if (a->is_null && b->is_null)
return true;
- return !memcmp(a_ptr, b_ptr, QMetaType::sizeOf(a->type));
+ return !memcmp(a_ptr, b_ptr, a->type().sizeOf());
}
static bool customConvert(const QVariant::Private *d, int t, void *result, bool *ok)
{
- if (d->type >= QMetaType::User || t >= QMetaType::User) {
- if (QMetaType::convert(constData(*d), d->type, result, t)) {
+ if (d->type().id() >= QMetaType::User || t >= QMetaType::User) {
+ if (QMetaType::convert(constData(*d), d->type().id(), result, t)) {
if (ok)
*ok = true;
return true;
@@ -1553,8 +1516,6 @@ static void customStreamDebug(QDebug dbg, const QVariant &variant) {
#endif
const QVariant::Handler qt_custom_variant_handler = {
- customConstruct,
- customClear,
customIsNull,
#ifndef QT_NO_DATASTREAM
nullptr,
@@ -1573,6 +1534,7 @@ const QVariant::Handler qt_custom_variant_handler = {
} // annonymous used to hide QVariant handlers
static HandlersManager handlerManager;
+
Q_STATIC_ASSERT_X(!QModulesPrivate::Core, "Initialization assumes that ModulesNames::Core is 0");
const QVariant::Handler *HandlersManager::Handlers[QModulesPrivate::ModulesCount]
= { &qt_kernel_variant_handler, &qt_dummy_variant_handler,
@@ -1707,7 +1669,6 @@ Q_CORE_EXPORT void QVariantPrivate::registerHandler(const int /* Modules::Names
\value Locale a QLocale
\value LongLong a \l qlonglong
\value Map a QVariantMap
- \value Matrix a QMatrix
\value Transform a QTransform
\value Matrix4x4 a QMatrix4x4
\value Palette a QPalette
@@ -1807,8 +1768,11 @@ Q_CORE_EXPORT void QVariantPrivate::registerHandler(const int /* Modules::Names
void QVariant::create(int type, const void *copy)
{
- d.type = type;
- handlerManager[type]->construct(&d, copy);
+ d = Private(QMetaType(type));
+ if (Q_UNLIKELY(type && !d.type().isValid())) {
+ qWarning("Trying to construct an instance of an invalid type, type id: %i", type);
+ }
+ customConstruct(&d, copy);
}
/*!
@@ -1824,8 +1788,8 @@ void QVariant::create(int type, const void *copy)
QVariant::~QVariant()
{
- if ((d.is_shared && !d.data.shared->ref.deref()) || (!d.is_shared && d.type > Char))
- handlerManager[d.type]->clear(&d);
+ if ((d.is_shared && !d.data.shared->ref.deref()) || (!d.is_shared))
+ customClear(&d);
}
/*!
@@ -1840,8 +1804,8 @@ QVariant::QVariant(const QVariant &p)
{
if (d.is_shared) {
d.data.shared->ref.ref();
- } else if (p.d.type > Char) {
- handlerManager[d.type]->construct(&d, p.constData());
+ } else if (d.type().isValid()) {
+ customConstruct(&d, p.constData());
d.is_null = p.d.is_null;
}
}
@@ -1911,13 +1875,13 @@ QVariant::QVariant(const char *val)
*/
/*!
- \fn QVariant::QVariant(const QDate &val)
+ \fn QVariant::QVariant(QDate val)
Constructs a new variant with a date value, \a val.
*/
/*!
- \fn QVariant::QVariant(const QTime &val)
+ \fn QVariant::QVariant(QTime val)
Constructs a new variant with a time value, \a val.
*/
@@ -2128,8 +2092,6 @@ QVariant::QVariant(const char *val)
QVariant::QVariant(Type type)
{ create(type, nullptr); }
-QVariant::QVariant(int typeId, const void *copy)
-{ create(typeId, copy); d.is_null = false; }
/*!
\internal
@@ -2138,7 +2100,7 @@ QVariant::QVariant(int typeId, const void *copy)
QVariant::QVariant(int typeId, const void *copy, uint flags)
{
if (flags) { //type is a pointer type
- d.type = typeId;
+ d = Private(QMetaType(typeId));
d.data.ptr = *reinterpret_cast<void *const*>(copy);
} else {
create(typeId, copy);
@@ -2146,6 +2108,16 @@ QVariant::QVariant(int typeId, const void *copy, uint flags)
d.is_null = false;
}
+/*!
+ \internal
+ flags is true if it is a pointer type
+ */
+QVariant::QVariant(QMetaType type, const void *copy) : d(type)
+{
+ customConstruct(&d, copy);
+ d.is_null = false;
+}
+
QVariant::QVariant(int val)
: d(Int)
{ d.data.i = val; }
@@ -2187,10 +2159,10 @@ QVariant::QVariant(const QStringList &val)
: d(StringList)
{ v_construct<QStringList>(&d, val); }
-QVariant::QVariant(const QDate &val)
+QVariant::QVariant(QDate val)
: d(Date)
{ v_construct<QDate>(&d, val); }
-QVariant::QVariant(const QTime &val)
+QVariant::QVariant(QTime val)
: d(Time)
{ v_construct<QTime>(&d, val); }
QVariant::QVariant(const QDateTime &val)
@@ -2310,23 +2282,31 @@ QVariant::QVariant(const QPersistentModelIndex &modelIndex)
To test whether an instance of QVariant contains a data type that
is compatible with the data type you are interested in, use
canConvert().
-*/
+ \sa userType(), metaType()
+*/
QVariant::Type QVariant::type() const
{
- return d.type >= QMetaType::User ? UserType : static_cast<Type>(d.type);
+ int type = d.type().id();
+ return type >= QMetaType::User ? UserType : static_cast<Type>(type);
}
-
/*!
Returns the storage type of the value stored in the variant. For
non-user types, this is the same as type().
- \sa type()
+ \sa type(), metaType()
*/
-
int QVariant::userType() const
{
- return d.type;
+ return d.type().id();
+}
+
+/*!
+ Returns the QMetaType of the value stored in the variant.
+*/
+QMetaType QVariant::metaType() const
+{
+ return d.type();
}
/*!
@@ -2341,12 +2321,10 @@ QVariant& QVariant::operator=(const QVariant &variant)
if (variant.d.is_shared) {
variant.d.data.shared->ref.ref();
d = variant.d;
- } else if (variant.d.type > Char) {
- d.type = variant.d.type;
- handlerManager[d.type]->construct(&d, variant.constData());
- d.is_null = variant.d.is_null;
} else {
d = variant.d;
+ customConstruct(&d, reinterpret_cast<const void *>(&variant.d.data));
+ d.is_null = variant.d.is_null;
}
return *this;
@@ -2371,11 +2349,10 @@ void QVariant::detach()
if (!d.is_shared || d.data.shared->ref.loadRelaxed() == 1)
return;
- Private dd;
- dd.type = d.type;
- handlerManager[d.type]->construct(&dd, constData());
+ Private dd(d.type());
+ customConstruct(&dd, constData());
if (!d.data.shared->ref.deref())
- handlerManager[d.type]->clear(&d);
+ customClear(&d);
d.data.shared = dd.data.shared;
}
@@ -2393,7 +2370,8 @@ void QVariant::detach()
*/
const char *QVariant::typeName() const
{
- return QMetaType::typeName(d.type);
+ // Cannot use d.type().name because we must return a char*
+ return QMetaType::typeName(d.type().id());
}
/*!
@@ -2402,11 +2380,9 @@ const char *QVariant::typeName() const
*/
void QVariant::clear()
{
- if ((d.is_shared && !d.data.shared->ref.deref()) || (!d.is_shared && d.type > Char))
- handlerManager[d.type]->clear(&d);
- d.type = Invalid;
- d.is_null = true;
- d.is_shared = false;
+ if ((d.is_shared && !d.data.shared->ref.deref()) || (!d.is_shared))
+ customClear(&d);
+ d = {};
}
/*!
@@ -2469,7 +2445,11 @@ static const ushort mapIdFromQt3ToCurrent[MapFromThreeCount] =
QMetaType::QDateTime,
QMetaType::QByteArray,
QMetaType::QBitArray,
+#if QT_CONFIG(shortcut)
QMetaType::QKeySequence,
+#else
+ 0, // QKeySequence
+#endif
QMetaType::QPen,
QMetaType::LongLong,
QMetaType::ULongLong,
@@ -2505,7 +2485,7 @@ void QVariant::load(QDataStream &s)
typeId = QMetaType::QSizePolicy;
} else if (typeId > 75 && typeId <= 86) {
// and as a result these types received lower ids too
- // QKeySequence QPen QTextLength QTextFormat QMatrix QTransform QMatrix4x4 QVector2D QVector3D QVector4D QQuaternion
+ // QKeySequence QPen QTextLength QTextFormat QTransform QMatrix4x4 QVector2D QVector3D QVector4D QQuaternion
typeId -=1;
}
}
@@ -2537,9 +2517,9 @@ void QVariant::load(QDataStream &s)
}
// const cast is safe since we operate on a newly constructed variant
- if (!QMetaType::load(s, d.type, const_cast<void *>(constData()))) {
+ if (!QMetaType::load(s, d.type().id(), const_cast<void *>(constData()))) {
s.setStatus(QDataStream::ReadCorruptData);
- qWarning("QVariant::load: unable to load type %d.", d.type);
+ qWarning("QVariant::load: unable to load type %d.", d.type().id());
}
}
@@ -2551,7 +2531,9 @@ void QVariant::load(QDataStream &s)
*/
void QVariant::save(QDataStream &s) const
{
- quint32 typeId = d.type >= QMetaType::User ? QMetaType::User : userType();
+ quint32 typeId = d.type().id();
+ if (typeId >= QMetaType::User)
+ typeId = QMetaType::User;
bool fakeUserType = false;
if (s.version() < QDataStream::Qt_4_0) {
int i;
@@ -2574,7 +2556,11 @@ void QVariant::save(QDataStream &s) const
typeId += 97;
} else if (typeId == QMetaType::QSizePolicy) {
typeId = 75;
+#if QT_CONFIG(shortcut)
} else if (typeId >= QMetaType::QKeySequence && typeId <= QMetaType::QQuaternion) {
+#else
+ } else if (typeId >= QMetaType::QPen && typeId <= QMetaType::QQuaternion) {
+#endif
// and as a result these types received lower ids too
typeId +=1;
} else if (typeId == QMetaType::QPolygonF || typeId == QMetaType::QUuid) {
@@ -2586,7 +2572,7 @@ void QVariant::save(QDataStream &s) const
s << typeId;
if (s.version() >= QDataStream::Qt_4_2)
s << qint8(d.is_null);
- if (d.type >= QVariant::UserType || fakeUserType) {
+ if (d.type().id() >= int(QVariant::UserType) || fakeUserType) {
s << QMetaType::typeName(userType());
}
@@ -2596,8 +2582,9 @@ void QVariant::save(QDataStream &s) const
return;
}
- if (!QMetaType::save(s, d.type, constData())) {
- qWarning("QVariant::save: unable to save type '%s' (type id: %d).\n", QMetaType::typeName(d.type), d.type);
+ if (!QMetaType::save(s, d.type().id(), constData())) {
+ qWarning("QVariant::save: unable to save type '%s' (type id: %d).\n",
+ QMetaType::typeName(d.type().id()), d.type().id());
Q_ASSERT_X(false, "QVariant::save", "Invalid type to save");
}
}
@@ -2657,21 +2644,21 @@ QDataStream& operator<<(QDataStream &s, const QVariant::Type p)
QMetaType::UnknownType; otherwise returns \c false.
*/
-template <typename T>
-inline T qVariantToHelper(const QVariant::Private &d, const HandlersManager &handlerManager)
+template<typename T>
+inline T qVariantToHelper(const QVariant::Private &d, HandlersManager &)
{
- const uint targetType = qMetaTypeId<T>();
- if (d.type == targetType)
+ QMetaType targetType = QMetaType::fromType<T>();
+ if (d.type() == targetType)
return *v_cast<T>(&d);
T ret;
- if (d.type >= QMetaType::User || targetType >= QMetaType::User) {
+ if (d.type().id() >= QMetaType::User || targetType.id() >= QMetaType::User) {
const void * const from = constData(d);
- if (QMetaType::convert(from, d.type, &ret, targetType))
+ if (QMetaType::convert(from, d.type().id(), &ret, targetType.id()))
return ret;
}
- handlerManager[d.type]->convert(&d, targetType, &ret, nullptr);
+ handlerManager[d.type().id()]->convert(&d, targetType.id(), &ret, nullptr);
return ret;
}
@@ -3112,15 +3099,15 @@ inline T qNumVariantToHelper(const QVariant::Private &d,
if (ok)
*ok = true;
- if (d.type == t)
+ if (d.type().id() == t)
return val;
T ret = 0;
- if ((d.type >= QMetaType::User || t >= QMetaType::User)
- && QMetaType::convert(constData(d), d.type, &ret, t))
+ if ((d.type().id() >= QMetaType::User || t >= QMetaType::User)
+ && QMetaType::convert(constData(d), d.type().id(), &ret, t))
return ret;
- if (!handlerManager[d.type]->convert(&d, t, &ret, ok) && ok)
+ if (!handlerManager[d.type().id()]->convert(&d, t, &ret, ok) && ok)
*ok = false;
return ret;
}
@@ -3217,11 +3204,11 @@ qulonglong QVariant::toULongLong(bool *ok) const
*/
bool QVariant::toBool() const
{
- if (d.type == Bool)
+ if (d.type() == QMetaType::fromType<bool>())
return d.data.b;
bool res = false;
- handlerManager[d.type]->convert(&d, Bool, &res, nullptr);
+ handlerManager[d.type().id()]->convert(&d, Bool, &res, nullptr);
return res;
}
@@ -3496,45 +3483,45 @@ static bool canConvertMetaObject(int fromId, int toId, QObject *fromObject)
*/
bool QVariant::canConvert(int targetTypeId) const
{
- if (d.type == targetTypeId)
+ if (d.type().id() == targetTypeId)
return true;
#if QT_CONFIG(itemmodel)
- if ((targetTypeId == QMetaType::QModelIndex && d.type == QMetaType::QPersistentModelIndex)
- || (targetTypeId == QMetaType::QPersistentModelIndex && d.type == QMetaType::QModelIndex))
+ if ((targetTypeId == QMetaType::QModelIndex
+ && d.type().id() == QMetaType::QPersistentModelIndex)
+ || (targetTypeId == QMetaType::QPersistentModelIndex
+ && d.type().id() == QMetaType::QModelIndex))
return true;
#endif
if (targetTypeId == QMetaType::QVariantList
- && (d.type == QMetaType::QVariantList
- || d.type == QMetaType::QStringList
- || d.type == QMetaType::QByteArrayList
- || QMetaType::hasRegisteredConverterFunction(d.type,
- qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>()))) {
+ && (d.type().id() == QMetaType::QVariantList || d.type().id() == QMetaType::QStringList
+ || d.type().id() == QMetaType::QByteArrayList
+ || QMetaType::hasRegisteredConverterFunction(
+ d.type().id(), qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>()))) {
return true;
}
if ((targetTypeId == QMetaType::QVariantHash || targetTypeId == QMetaType::QVariantMap)
- && (d.type == QMetaType::QVariantMap
- || d.type == QMetaType::QVariantHash
- || QMetaType::hasRegisteredConverterFunction(d.type,
- qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>()))) {
+ && (d.type().id() == QMetaType::QVariantMap || d.type().id() == QMetaType::QVariantHash
+ || QMetaType::hasRegisteredConverterFunction(
+ d.type().id(), qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>()))) {
return true;
}
- if (targetTypeId == qMetaTypeId<QPair<QVariant, QVariant> >() &&
- QMetaType::hasRegisteredConverterFunction(d.type,
- qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>())) {
+ if (targetTypeId == qMetaTypeId<QPair<QVariant, QVariant>>()
+ && QMetaType::hasRegisteredConverterFunction(
+ d.type().id(), qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>())) {
return true;
}
- if ((d.type >= QMetaType::User || targetTypeId >= QMetaType::User)
- && QMetaType::hasRegisteredConverterFunction(d.type, targetTypeId)) {
+ if ((d.type().id() >= QMetaType::User || targetTypeId >= QMetaType::User)
+ && QMetaType::hasRegisteredConverterFunction(d.type().id(), targetTypeId)) {
return true;
}
// TODO Reimplement this function, currently it works but it is a historical mess.
- uint currentType = d.type;
+ uint currentType = d.type().id();
if (currentType == QMetaType::SChar || currentType == QMetaType::Char)
currentType = QMetaType::UInt;
if (targetTypeId == QMetaType::SChar || currentType == QMetaType::Char)
@@ -3619,7 +3606,9 @@ bool QVariant::canConvert(int targetTypeId) const
case QMetaType::QByteArray:
case QMetaType::QDateTime:
case QMetaType::QUrl:
+#if QT_CONFIG(regularexpression)
case QMetaType::QRegularExpression:
+#endif
case QMetaType::QUuid:
case QMetaType::QVariantList:
case QMetaType::QVariantMap:
@@ -3647,9 +3636,11 @@ bool QVariant::canConvert(int targetTypeId) const
if (currentType > int(QMetaType::QUuid) || targetTypeId > int(QMetaType::QUuid)) {
switch (uint(targetTypeId)) {
case QVariant::Int:
+#if QT_CONFIG(shortcut)
if (currentType == QVariant::KeySequence)
return true;
Q_FALLTHROUGH();
+#endif
case QVariant::UInt:
case QVariant::LongLong:
case QVariant::ULongLong:
@@ -3672,11 +3663,16 @@ bool QVariant::canConvert(int targetTypeId) const
return currentType == QVariant::Color || currentType == QMetaType::Nullptr
|| ((QMetaType::typeFlags(currentType) & QMetaType::IsEnumeration) && QMetaType::metaObjectForType(currentType));
case QVariant::String:
- return currentType == QVariant::KeySequence || currentType == QVariant::Font
- || currentType == QVariant::Color || currentType == QMetaType::Nullptr
- || ((QMetaType::typeFlags(currentType) & QMetaType::IsEnumeration) && QMetaType::metaObjectForType(currentType));
+ return currentType == QVariant::Font
+ || currentType == QVariant::Color || currentType == QMetaType::Nullptr
+#if QT_CONFIG(shortcut)
+ || currentType == QVariant::KeySequence
+#endif
+ || ((QMetaType::typeFlags(currentType) & QMetaType::IsEnumeration) && QMetaType::metaObjectForType(currentType));
+#if QT_CONFIG(shortcut)
case QVariant::KeySequence:
return currentType == QVariant::String || currentType == QVariant::Int;
+#endif
case QVariant::Font:
return currentType == QVariant::String;
case QVariant::Color:
@@ -3730,7 +3726,7 @@ bool QVariant::canConvert(int targetTypeId) const
bool QVariant::convert(int targetTypeId)
{
- if (d.type == uint(targetTypeId))
+ if (d.type().id() == targetTypeId)
return true;
QVariant oldValue = *this;
@@ -3741,7 +3737,7 @@ bool QVariant::convert(int targetTypeId)
create(targetTypeId, nullptr);
// Fail if the value is not initialized or was forced null by a previous failed convert.
- if (oldValue.d.is_null && oldValue.d.type != QMetaType::Nullptr)
+ if (oldValue.d.is_null && oldValue.d.type().id() != QMetaType::Nullptr)
return false;
if ((QMetaType::typeFlags(oldValue.userType()) & QMetaType::PointerToQObject) && (QMetaType::typeFlags(targetTypeId) & QMetaType::PointerToQObject)) {
@@ -3827,72 +3823,6 @@ bool QVariant::convert(const int type, void *ptr) const
QMetaType::registerComparators().
*/
-/*!
- \fn bool QVariant::operator<(const QVariant &v) const
- \obsolete
-
- Compares this QVariant with \a v and returns \c true if this is less than \a v.
-
- \note Comparability might not be availabe for the type stored in this QVariant
- or in \a v.
-
- \warning To make this function work with a custom type registered with
- qRegisterMetaType(), its comparison operator must be registered using
- QMetaType::registerComparators().
-
- This operator is deprecated as it cannot establish a total order required
- for most use of this operator, which is the reason you cannot use QVariant
- as the key of a QMap.
-*/
-
-/*!
- \fn bool QVariant::operator<=(const QVariant &v) const
- \obsolete
-
- Compares this QVariant with \a v and returns \c true if this is less or equal than \a v.
-
- \note Comparability might not be available for the type stored in this QVariant
- or in \a v.
-
- \warning To make this function work with a custom type registered with
- qRegisterMetaType(), its comparison operator must be registered using
- QMetaType::registerComparators().
-
- This operator is deprecated as it cannot establish a total order.
-*/
-
-/*!
- \fn bool QVariant::operator>(const QVariant &v) const
- \obsolete
-
- Compares this QVariant with \a v and returns \c true if this is larger than \a v.
-
- \note Comparability might not be available for the type stored in this QVariant
- or in \a v.
-
- \warning To make this function work with a custom type registered with
- qRegisterMetaType(), its comparison operator must be registered using
- QMetaType::registerComparators().
-
- This operator is deprecated as it cannot establish a total order.
-*/
-
-/*!
- \fn bool QVariant::operator>=(const QVariant &v) const
- \obsolete
-
- Compares this QVariant with \a v and returns \c true if this is larger or equal than \a v.
-
- \note Comparability might not be available for the type stored in this QVariant
- or in \a v.
-
- \warning To make this function work with a custom type registered with
- qRegisterMetaType(), its comparison operator must be registered using
- QMetaType::registerComparators().
-
- This operator is deprecated as it cannot establish a total order.
-*/
-
static bool qIsNumericType(uint tp)
{
static const qulonglong numericTypeBits =
@@ -4009,7 +3939,7 @@ static int integralCompare(uint promotedType, const QVariant::Private *d1, const
static int numericCompare(const QVariant::Private *d1, const QVariant::Private *d2)
{
- uint promotedType = numericTypePromotion(d1->type, d2->type);
+ uint promotedType = numericTypePromotion(d1->type().id(), d2->type().id());
if (promotedType != QMetaType::QReal)
return integralCompare(promotedType, d1, d2);
@@ -4038,33 +3968,33 @@ static int numericCompare(const QVariant::Private *d1, const QVariant::Private *
*/
bool QVariant::cmp(const QVariant &v) const
{
- auto cmp_helper = [] (const QVariant::Private &d1, const QVariant::Private &d2)
- {
- Q_ASSERT(d1.type == d2.type);
- if (d1.type >= QMetaType::User) {
+ auto cmp_helper = [](const QVariant::Private &d1, const QVariant::Private &d2) {
+ Q_ASSERT(d1.type() == d2.type());
+ if (d1.type().id() >= QMetaType::User) {
int result;
- if (QMetaType::equals(QT_PREPEND_NAMESPACE(constData(d1)), QT_PREPEND_NAMESPACE(constData(d2)), d1.type, &result))
+ if (QMetaType::equals(QT_PREPEND_NAMESPACE(constData(d1)),
+ QT_PREPEND_NAMESPACE(constData(d2)), d1.type().id(), &result))
return result == 0;
}
- return handlerManager[d1.type]->compare(&d1, &d2);
+ return handlerManager[d1.type().id()]->compare(&d1, &d2);
};
// try numerics first, with C++ type promotion rules (no conversion)
- if (qIsNumericType(d.type) && qIsNumericType(v.d.type))
+ if (qIsNumericType(d.type().id()) && qIsNumericType(v.d.type().id()))
return numericCompare(&d, &v.d) == 0;
- if (d.type == v.d.type)
+ if (d.type() == v.d.type())
return cmp_helper(d, v.d);
QVariant v1 = *this;
QVariant v2 = v;
- if (v2.canConvert(v1.d.type)) {
- if (!v2.convert(v1.d.type))
+ if (v2.canConvert(v1.d.type().id())) {
+ if (!v2.convert(v1.d.type().id()))
return false;
} else {
// try the opposite conversion, it might work
qSwap(v1, v2);
- if (!v2.convert(v1.d.type))
+ if (!v2.convert(v1.d.type().id()))
return false;
}
return cmp_helper(v1.d, v2.d);
@@ -4073,77 +4003,10 @@ bool QVariant::cmp(const QVariant &v) const
/*!
\internal
*/
-int QVariant::compare(const QVariant &v) const
-{
- // try numerics first, with C++ type promotion rules (no conversion)
- if (qIsNumericType(d.type) && qIsNumericType(v.d.type))
- return numericCompare(&d, &v.d);
-
- // check for equality next, as more types implement operator== than operator<
- if (cmp(v))
- return 0;
-
- const QVariant *v1 = this;
- const QVariant *v2 = &v;
- QVariant converted1;
- QVariant converted2;
-
- if (d.type != v.d.type) {
- // if both types differ, try to convert
- if (v2->canConvert(v1->d.type)) {
- converted2 = *v2;
- if (converted2.convert(v1->d.type))
- v2 = &converted2;
- }
- if (v1->d.type != v2->d.type && v1->canConvert(v2->d.type)) {
- converted1 = *v1;
- if (converted1.convert(v2->d.type))
- v1 = &converted1;
- }
- if (v1->d.type != v2->d.type) {
- // if conversion fails, default to toString
- int r = v1->toString().compare(v2->toString(), Qt::CaseInsensitive);
- if (r == 0) {
- // cmp(v) returned false, so we should try to agree with it.
- return (v1->d.type < v2->d.type) ? -1 : 1;
- }
- return r;
- }
-
- // did we end up with two numerics? If so, restart
- if (qIsNumericType(v1->d.type) && qIsNumericType(v2->d.type))
- return v1->compare(*v2);
- }
- if (v1->d.type >= QMetaType::User) {
- int result;
- if (QMetaType::compare(QT_PREPEND_NAMESPACE(constData(d)), QT_PREPEND_NAMESPACE(constData(v2->d)), d.type, &result))
- return result;
- }
- switch (v1->d.type) {
- case QVariant::Date:
- return v1->toDate() < v2->toDate() ? -1 : 1;
- case QVariant::Time:
- return v1->toTime() < v2->toTime() ? -1 : 1;
- case QVariant::DateTime:
- return v1->toDateTime() < v2->toDateTime() ? -1 : 1;
- case QVariant::StringList:
- return v1->toStringList() < v2->toStringList() ? -1 : 1;
- }
- int r = v1->toString().compare(v2->toString(), Qt::CaseInsensitive);
- if (r == 0) {
- // cmp(v) returned false, so we should try to agree with it.
- return (d.type < v.d.type) ? -1 : 1;
- }
- return r;
-}
-
-/*!
- \internal
- */
const void *QVariant::constData() const
{
- return d.is_shared ? d.data.shared->ptr : reinterpret_cast<const void *>(&d.data.ptr);
+ return d.is_shared ? d.data.shared->ptr : reinterpret_cast<const void *>(&d.data);
}
/*!
@@ -4176,14 +4039,14 @@ void* QVariant::data()
*/
bool QVariant::isNull() const
{
- return handlerManager[d.type]->isNull(&d);
+ return handlerManager[d.type().id()]->isNull(&d);
}
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QVariant &v)
{
QDebugStateSaver saver(dbg);
- const uint typeId = v.d.type;
+ const uint typeId = v.d.type().id();
dbg.nospace() << "QVariant(";
if (typeId != QMetaType::UnknownType) {
dbg << QMetaType::typeName(typeId) << ", ";
@@ -4246,8 +4109,8 @@ QDebug operator<<(QDebug dbg, const QVariant::Type p)
If the QVariant contains a pointer to a type derived from QObject then
\c{T} may be any QObject type. If the pointer stored in the QVariant can be
qobject_cast to T, then that result is returned. Otherwise \nullptr is
- returned. Note that this only works for QObject subclasses which use the
- Q_OBJECT macro.
+ returned. Note that this only works for QObject subclasses which use
+ the Q_OBJECT macro.
If the QVariant contains a sequential container and \c{T} is QVariantList, the
elements of the container will be converted into \l {QVariant}s and returned as a QVariantList.
@@ -5110,4 +4973,10 @@ QAssociativeIterable::const_iterator QAssociativeIterable::const_iterator::opera
return const_iterator(impl, new QAtomicInt(0));
}
+QVariant::Private::~Private()
+{
+ QtMetaTypePrivate::derefAndDestroy(
+ reinterpret_cast<QtPrivate::QMetaTypeInterface *>(packedType << 2));
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h
index 24657818c5..c519411fc1 100644
--- a/src/corelib/kernel/qvariant.h
+++ b/src/corelib/kernel/qvariant.h
@@ -72,7 +72,6 @@ class QEasingCurve;
class QLine;
class QLineF;
class QLocale;
-class QMatrix;
class QTransform;
class QStringList;
class QTime;
@@ -162,7 +161,9 @@ class Q_CORE_EXPORT QVariant
Point = QMetaType::QPoint,
PointF = QMetaType::QPointF,
RegExp = QMetaType::QRegExp,
+#if QT_CONFIG(regularexpression)
RegularExpression = QMetaType::QRegularExpression,
+#endif
Hash = QMetaType::QVariantHash,
#if QT_CONFIG(easingcurve)
EasingCurve = QMetaType::QEasingCurve,
@@ -184,11 +185,12 @@ class Q_CORE_EXPORT QVariant
Region = QMetaType::QRegion,
Bitmap = QMetaType::QBitmap,
Cursor = QMetaType::QCursor,
+#if QT_CONFIG(shortcut)
KeySequence = QMetaType::QKeySequence,
+#endif
Pen = QMetaType::QPen,
TextLength = QMetaType::QTextLength,
TextFormat = QMetaType::QTextFormat,
- Matrix = QMetaType::QMatrix,
Transform = QMetaType::QTransform,
Matrix4x4 = QMetaType::QMatrix4x4,
Vector2D = QMetaType::QVector2D,
@@ -208,8 +210,8 @@ class Q_CORE_EXPORT QVariant
QVariant() noexcept : d() {}
~QVariant();
QVariant(Type type);
- QVariant(int typeId, const void *copy);
- QVariant(int typeId, const void *copy, uint flags);
+ QVariant(int typeId, const void *copy, uint flags = 0); // ### Qt6 TODO deprecate
+ explicit QVariant(QMetaType type, const void *copy);
QVariant(const QVariant &other);
#ifndef QT_NO_DATASTREAM
@@ -233,8 +235,8 @@ class Q_CORE_EXPORT QVariant
QVariant(QLatin1String string);
QVariant(const QStringList &stringlist);
QVariant(QChar qchar);
- QVariant(const QDate &date);
- QVariant(const QTime &time);
+ QVariant(QDate date);
+ QVariant(QTime time);
QVariant(const QDateTime &datetime);
QVariant(const QList<QVariant> &list);
QVariant(const QMap<QString,QVariant> &map);
@@ -283,6 +285,7 @@ class Q_CORE_EXPORT QVariant
Type type() const;
int userType() const;
const char *typeName() const;
+ QMetaType metaType() const;
bool canConvert(int targetTypeId) const;
bool convert(int targetTypeId);
@@ -368,7 +371,9 @@ class Q_CORE_EXPORT QVariant
template<typename T>
static inline QVariant fromValue(const T &value)
- { return QVariant(qMetaTypeId<T>(), &value, QTypeInfo<T>::isPointer); }
+ {
+ return QVariant(QMetaType::fromType<T>(), &value);
+ }
#if (__has_include(<variant>) && __cplusplus >= 201703L) || defined(Q_CLANG_QDOC)
template<typename... Types>
@@ -393,23 +398,35 @@ class Q_CORE_EXPORT QVariant
};
struct Private
{
- inline Private() noexcept : type(Invalid), is_shared(false), is_null(true)
- { data.ptr = nullptr; }
-
- // Internal constructor for initialized variants.
- explicit inline Private(uint variantType) noexcept
- : type(variantType), is_shared(false), is_null(false)
- {}
+ Private() noexcept : packedType(0), is_shared(false), is_null(true) {}
+ explicit Private(const QMetaType &type) noexcept : is_shared(false), is_null(false)
+ {
+ if (type.d_ptr)
+ type.d_ptr->ref.ref();
+ quintptr mt = quintptr(type.d_ptr);
+ Q_ASSERT((mt & 0x3) == 0);
+ packedType = mt >> 2;
+ }
+ explicit Private(int type) noexcept : Private(QMetaType(type)) {}
+ Private(const Private &other) : Private(other.type())
+ {
+ data = other.data;
+ is_shared = other.is_shared;
+ is_null = other.is_null;
+ }
+ Private &operator=(const Private &other)
+ {
+ if (&other != this) {
+ this->~Private();
+ new (this) Private(other);
+ }
+ return *this;
+ }
+ Q_CORE_EXPORT ~Private();
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- Private(const Private &other) noexcept
- : data(other.data), type(other.type),
- is_shared(other.is_shared), is_null(other.is_null)
- {}
- Private &operator=(const Private &other) noexcept = default;
-#endif
union Data
{
+ void *threeptr[3] = { nullptr, nullptr, nullptr };
char c;
uchar uc;
short s;
@@ -429,13 +446,15 @@ class Q_CORE_EXPORT QVariant
void *ptr;
PrivateShared *shared;
} data;
- uint type : 30;
- uint is_shared : 1;
- uint is_null : 1;
+ quintptr packedType : sizeof(QMetaType) * 8 - 2;
+ quintptr is_shared : 1;
+ quintptr is_null : 1;
+ inline QMetaType type() const
+ {
+ return QMetaType(reinterpret_cast<QtPrivate::QMetaTypeInterface *>(packedType << 2));
+ }
};
public:
- typedef void (*f_construct)(Private *, const void *);
- typedef void (*f_clear)(Private *);
typedef bool (*f_null)(const Private *);
#ifndef QT_NO_DATASTREAM
typedef void (*f_load)(Private *, QDataStream &);
@@ -446,8 +465,6 @@ class Q_CORE_EXPORT QVariant
typedef bool (*f_canConvert)(const QVariant::Private *d, int t);
typedef void (*f_debugStream)(QDebug, const QVariant &);
struct Handler {
- f_construct construct;
- f_clear clear;
f_null isNull;
#ifndef QT_NO_DATASTREAM
f_load load;
@@ -463,16 +480,6 @@ class Q_CORE_EXPORT QVariant
{ return cmp(v); }
inline bool operator!=(const QVariant &v) const
{ return !cmp(v); }
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED inline bool operator<(const QVariant &v) const
- { return compare(v) < 0; }
- QT_DEPRECATED inline bool operator<=(const QVariant &v) const
- { return compare(v) <= 0; }
- QT_DEPRECATED inline bool operator>(const QVariant &v) const
- { return compare(v) > 0; }
- QT_DEPRECATED inline bool operator>=(const QVariant &v) const
- { return compare(v) >= 0; }
-#endif
protected:
friend inline bool operator==(const QVariant &, const QVariantComparisonHelper &);
@@ -491,7 +498,6 @@ public:
Private d;
void create(int type, const void *copy);
bool cmp(const QVariant &other) const;
- int compare(const QVariant &other) const;
bool convert(const int t, void *ptr) const; // ### Qt6: drop const
private:
@@ -554,22 +560,20 @@ inline QVariant QVariant::fromValue(const std::monostate &)
}
#endif
-inline bool QVariant::isValid() const { return d.type != Invalid; }
+inline bool QVariant::isValid() const
+{
+ return d.type().isValid();
+}
template<typename T>
inline void QVariant::setValue(const T &avalue)
{
+ QMetaType metaType = QMetaType::fromType<T>();
// If possible we reuse the current QVariant private.
- const uint type = qMetaTypeId<T>();
- if (isDetached() && (type == d.type || (type <= uint(QVariant::Char) && d.type <= uint(QVariant::Char)))) {
- d.type = type;
- d.is_null = false;
- T *old = reinterpret_cast<T*>(d.is_shared ? d.data.shared->ptr : &d.data.ptr);
- if (QTypeInfo<T>::isComplex)
- old->~T();
- new (old) T(avalue); // call the copy constructor
+ if (isDetached() && d.type() == metaType) {
+ *reinterpret_cast<T *>(data()) = avalue;
} else {
- *this = QVariant(type, &avalue, QTypeInfo<T>::isPointer);
+ *this = QVariant::fromValue<T>(avalue);
}
}
@@ -826,7 +830,7 @@ namespace QtPrivate {
QVariantHash l;
l.reserve(iter.size());
for (QAssociativeIterable::const_iterator it = iter.begin(), end = iter.end(); it != end; ++it)
- static_cast<QMultiHash<QString, QVariant> &>(l).insert(it.key().toString(), it.value());
+ l.insert(it.key().toString(), it.value());
return l;
}
return QVariantValueHelper<QVariantHash>::invoke(v);
diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h
index 94781a9957..aa89d42092 100644
--- a/src/corelib/kernel/qvariant_p.h
+++ b/src/corelib/kernel/qvariant_p.h
@@ -234,7 +234,7 @@ public:
QVariantComparator(const QVariant::Private *a, const QVariant::Private *b)
: m_a(a), m_b(b)
{
- Q_ASSERT(a->type == b->type);
+ Q_ASSERT(a->type() == b->type());
}
template<typename T>
@@ -346,113 +346,6 @@ protected:
const QVariant::Private *m_d;
};
-template<class Filter>
-class QVariantConstructor
-{
- template<typename T, bool IsAcceptedType = Filter::template Acceptor<T>::IsAccepted>
- struct FilteredConstructor {
- FilteredConstructor(const QVariantConstructor &tc)
- {
- v_construct<T>(tc.m_x, tc.m_copy);
- tc.m_x->is_null = !tc.m_copy;
- }
- };
- template<typename T>
- struct FilteredConstructor<T, /* IsAcceptedType = */ false> {
- FilteredConstructor(const QVariantConstructor &tc)
- {
- // ignore types that lives outside of the current library
- tc.m_x->type = QMetaType::UnknownType;
- }
- };
-public:
- QVariantConstructor(QVariant::Private *x, const void *copy)
- : m_x(x)
- , m_copy(copy)
- {}
-
- template<typename T>
- void delegate(const T*)
- {
- FilteredConstructor<T>(*this);
- }
-
- void delegate(const QMetaTypeSwitcher::NotBuiltinType*)
- {
- // QVariantConstructor is used only for built-in types.
- Q_ASSERT(false);
- }
-
- void delegate(const void*)
- {
- qWarning("Trying to create a QVariant instance of QMetaType::Void type, an invalid QVariant will be constructed instead");
- m_x->type = QMetaType::UnknownType;
- m_x->is_shared = false;
- m_x->is_null = !m_copy;
- }
-
- void delegate(const QMetaTypeSwitcher::UnknownType*)
- {
- if (m_x->type != QMetaType::UnknownType) {
- qWarning("Trying to construct an instance of an invalid type, type id: %i", m_x->type);
- m_x->type = QMetaType::UnknownType;
- }
- m_x->is_shared = false;
- m_x->is_null = !m_copy;
- }
-private:
- QVariant::Private *m_x;
- const void *m_copy;
-};
-
-template<class Filter>
-class QVariantDestructor
-{
- template<typename T, bool IsAcceptedType = Filter::template Acceptor<T>::IsAccepted>
- struct FilteredDestructor {
- FilteredDestructor(QVariant::Private *d)
- {
- v_clear<T>(d);
- }
- };
- template<typename T>
- struct FilteredDestructor<T, /* IsAcceptedType = */ false> {
- FilteredDestructor(QVariant::Private *)
- {
- // It is not possible to create not accepted type
- Q_ASSERT(false);
- }
- };
-
-public:
- QVariantDestructor(QVariant::Private *d)
- : m_d(d)
- {}
- ~QVariantDestructor()
- {
- m_d->type = QMetaType::UnknownType;
- m_d->is_null = true;
- m_d->is_shared = false;
- }
-
- template<typename T>
- void delegate(const T*)
- {
- FilteredDestructor<T> cleaner(m_d);
- }
-
- void delegate(const QMetaTypeSwitcher::NotBuiltinType*)
- {
- // QVariantDestructor class is used only for a built-in type
- Q_ASSERT(false);
- }
- // Ignore nonconstructible type
- void delegate(const QMetaTypeSwitcher::UnknownType*) {}
- void delegate(const void*) { Q_ASSERT(false); }
-private:
- QVariant::Private *m_d;
-};
-
namespace QVariantPrivate {
Q_CORE_EXPORT void registerHandler(const int /* Modules::Names */ name, const QVariant::Handler *handler);
}
diff --git a/src/corelib/mimetypes/mimetypes_resources.cmake b/src/corelib/mimetypes/mimetypes_resources.cmake
new file mode 100644
index 0000000000..a91d25cc2c
--- /dev/null
+++ b/src/corelib/mimetypes/mimetypes_resources.cmake
@@ -0,0 +1,21 @@
+# List of files that need to be packaged as resources.
+# This file exists solely because of unit tests that need access to this
+# information as well. This was previosly handled by referrencing a qrc
+# file with the same information
+
+set(corelib_mimetypes_resource_file
+ "${CMAKE_CURRENT_LIST_DIR}/mime/packages/freedesktop.org.xml"
+)
+
+function(corelib_add_mimetypes_resources target)
+ set(source_file "${corelib_mimetypes_resource_file}")
+ set_source_files_properties("${source_file}"
+ PROPERTIES QT_RESOURCE_ALIAS "freedesktop.org.xml"
+ )
+ qt_add_resource(${target} "mimetypes"
+ PREFIX
+ "/qt-project.org/qmime/packages"
+ FILES
+ "${source_file}"
+ )
+endfunction()
diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp
index 10b2190966..f1d0dc859e 100644
--- a/src/corelib/mimetypes/qmimedatabase.cpp
+++ b/src/corelib/mimetypes/qmimedatabase.cpp
@@ -91,8 +91,8 @@ bool QMimeDatabasePrivate::shouldCheck()
return true;
}
-#if defined(Q_OS_UNIX) && !defined(Q_OS_INTEGRITY)
-#define QT_USE_MMAP
+#if defined(Q_OS_UNIX) && !defined(Q_OS_NACL) && !defined(Q_OS_INTEGRITY)
+# define QT_USE_MMAP
#endif
void QMimeDatabasePrivate::loadProviders()
diff --git a/src/corelib/mimetypes/qmimedatabase_p.h b/src/corelib/mimetypes/qmimedatabase_p.h
index d9cf446d44..831390de1f 100644
--- a/src/corelib/mimetypes/qmimedatabase_p.h
+++ b/src/corelib/mimetypes/qmimedatabase_p.h
@@ -63,6 +63,7 @@ QT_REQUIRE_CONFIG(mimetype);
#include <QtCore/qmutex.h>
#include <QtCore/qvector.h>
+#include <vector>
#include <memory>
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/mimetypes/qmimetype.cpp b/src/corelib/mimetypes/qmimetype.cpp
index de450c68f4..17a6effe03 100644
--- a/src/corelib/mimetypes/qmimetype.cpp
+++ b/src/corelib/mimetypes/qmimetype.cpp
@@ -192,7 +192,7 @@ bool QMimeType::operator==(const QMimeType &other) const
Returns the hash value for \a key, using
\a seed to seed the calculation.
*/
-uint qHash(const QMimeType &key, uint seed) noexcept
+size_t qHash(const QMimeType &key, size_t seed) noexcept
{
return qHash(key.d->name, seed);
}
diff --git a/src/corelib/mimetypes/qmimetype.h b/src/corelib/mimetypes/qmimetype.h
index df1b60f2ce..5aabbb449e 100644
--- a/src/corelib/mimetypes/qmimetype.h
+++ b/src/corelib/mimetypes/qmimetype.h
@@ -55,7 +55,7 @@ QT_BEGIN_NAMESPACE
class QMimeTypePrivate;
class QMimeType;
-Q_CORE_EXPORT uint qHash(const QMimeType &key, uint seed = 0) noexcept;
+Q_CORE_EXPORT size_t qHash(const QMimeType &key, size_t seed = 0) noexcept;
class Q_CORE_EXPORT QMimeType
{
@@ -119,7 +119,7 @@ protected:
friend class QMimeXMLProvider;
friend class QMimeBinaryProvider;
friend class QMimeTypePrivate;
- friend Q_CORE_EXPORT uint qHash(const QMimeType &key, uint seed) noexcept;
+ friend Q_CORE_EXPORT size_t qHash(const QMimeType &key, size_t seed) noexcept;
QExplicitlySharedDataPointer<QMimeTypePrivate> d;
};
diff --git a/src/corelib/plugin/qfactoryinterface.cpp b/src/corelib/plugin/qfactoryinterface.cpp
index 353c2478f4..b503c245c5 100644
--- a/src/corelib/plugin/qfactoryinterface.cpp
+++ b/src/corelib/plugin/qfactoryinterface.cpp
@@ -43,7 +43,6 @@ QT_BEGIN_NAMESPACE
QFactoryInterface::~QFactoryInterface()
{
- // must be empty until ### Qt 6
}
QT_END_NAMESPACE
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index c94adc7a01..e512ff2c32 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -721,7 +721,7 @@ static bool qt_get_metadata(QLibraryPrivate *priv, QString *errMsg)
};
#else
auto getMetaData = [](QFunctionPointer fptr) {
- auto f = reinterpret_cast<QPair<const char *, size_t> (*)()>(fptr);
+ auto f = reinterpret_cast<QPluginMetaData (*)()>(fptr);
return f();
};
#endif
@@ -731,7 +731,7 @@ static bool qt_get_metadata(QLibraryPrivate *priv, QString *errMsg)
return false;
auto metaData = getMetaData(pfn);
- QJsonDocument doc = qJsonFromRawLibraryMetaData(metaData.first, metaData.second, errMsg);
+ QJsonDocument doc = qJsonFromRawLibraryMetaData(reinterpret_cast<const char *>(metaData.data), metaData.size, errMsg);
if (doc.isNull())
return false;
priv->metaData = doc.object();
diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp
index 83873edf6f..fc70ca1386 100644
--- a/src/corelib/plugin/quuid.cpp
+++ b/src/corelib/plugin/quuid.cpp
@@ -1089,7 +1089,7 @@ QDebug operator<<(QDebug dbg, const QUuid &id)
\relates QUuid
Returns a hash of the UUID \a uuid, using \a seed to seed the calculation.
*/
-uint qHash(const QUuid &uuid, uint seed) noexcept
+size_t qHash(const QUuid &uuid, size_t seed) noexcept
{
return uuid.data1 ^ uuid.data2 ^ (uuid.data3 << 16)
^ ((uuid.data4[0] << 24) | (uuid.data4[1] << 16) | (uuid.data4[2] << 8) | uuid.data4[3])
diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h
index 713ca070c8..bdd74f4b77 100644
--- a/src/corelib/plugin/quuid.h
+++ b/src/corelib/plugin/quuid.h
@@ -243,7 +243,7 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QUuid &);
Q_CORE_EXPORT QDebug operator<<(QDebug, const QUuid &);
#endif
-Q_CORE_EXPORT uint qHash(const QUuid &uuid, uint seed = 0) noexcept;
+Q_CORE_EXPORT size_t qHash(const QUuid &uuid, size_t seed = 0) noexcept;
inline bool operator<=(const QUuid &lhs, const QUuid &rhs) noexcept
{ return !(rhs < lhs); }
diff --git a/src/corelib/serialization/qbinaryjsonvalue.cpp b/src/corelib/serialization/qbinaryjsonvalue.cpp
index 5e3a01ad38..7d0bc3d366 100644
--- a/src/corelib/serialization/qbinaryjsonvalue.cpp
+++ b/src/corelib/serialization/qbinaryjsonvalue.cpp
@@ -63,12 +63,9 @@ QBinaryJsonValue::QBinaryJsonValue(QBinaryJsonPrivate::MutableData *data,
case QJsonValue::Double:
dbl = v.toDouble(parent);
break;
- case QJsonValue::String: {
- QString s = v.toString(parent);
- stringData = s.data_ptr();
- stringData->ref.ref();
+ case QJsonValue::String:
+ stringData = v.toString(parent);
break;
- }
case QJsonValue::Array:
case QJsonValue::Object:
d = data;
@@ -80,9 +77,9 @@ QBinaryJsonValue::QBinaryJsonValue(QBinaryJsonPrivate::MutableData *data,
}
QBinaryJsonValue::QBinaryJsonValue(QString string)
- : stringData(*reinterpret_cast<QStringData **>(&string)), t(QJsonValue::String)
+ : d(nullptr), t(QJsonValue::String)
{
- stringData->ref.ref();
+ stringData = std::move(string);
}
QBinaryJsonValue::QBinaryJsonValue(const QBinaryJsonArray &a)
@@ -101,9 +98,6 @@ QBinaryJsonValue::QBinaryJsonValue(const QBinaryJsonObject &o)
QBinaryJsonValue::~QBinaryJsonValue()
{
- if (t == QJsonValue::String && stringData && !stringData->ref.deref())
- free(stringData);
-
if (d && !d->ref.deref())
delete d;
}
@@ -134,9 +128,7 @@ QString QBinaryJsonValue::toString() const
{
if (t != QJsonValue::String)
return QString();
- stringData->ref.ref(); // the constructor below doesn't add a ref.
- QStringDataPtr holder = { stringData };
- return QString(holder);
+ return stringData;
}
void QBinaryJsonValue::detach()
diff --git a/src/corelib/serialization/qbinaryjsonvalue_p.h b/src/corelib/serialization/qbinaryjsonvalue_p.h
index 498fc62ecd..c3b943250c 100644
--- a/src/corelib/serialization/qbinaryjsonvalue_p.h
+++ b/src/corelib/serialization/qbinaryjsonvalue_p.h
@@ -86,6 +86,7 @@ public:
QBinaryJsonValue(QBinaryJsonValue &&other) noexcept
: ui(other.ui),
+ stringData(std::move(other.stringData)),
d(other.d),
t(other.t)
{
@@ -96,6 +97,7 @@ public:
QBinaryJsonValue &operator =(QBinaryJsonValue &&other) noexcept
{
+ qSwap(stringData, other.stringData);
qSwap(ui, other.ui);
qSwap(d, other.d);
qSwap(t, other.t);
@@ -122,9 +124,9 @@ private:
quint64 ui;
bool b;
double dbl;
- QStringData *stringData;
const QBinaryJsonPrivate::Base *base;
};
+ QString stringData;
QBinaryJsonPrivate::MutableData *d = nullptr; // needed for Objects and Arrays
QJsonValue::Type t = QJsonValue::Null;
};
diff --git a/src/corelib/serialization/qcborarray.cpp b/src/corelib/serialization/qcborarray.cpp
index ca0156e07d..3bb99176af 100644
--- a/src/corelib/serialization/qcborarray.cpp
+++ b/src/corelib/serialization/qcborarray.cpp
@@ -1200,7 +1200,7 @@ void QCborArray::detach(qsizetype reserved)
Returns the offset of this iterator relative to \a other.
*/
-uint qHash(const QCborArray &array, uint seed)
+size_t qHash(const QCborArray &array, size_t seed)
{
return qHashRange(array.begin(), array.end(), seed);
}
diff --git a/src/corelib/serialization/qcborarray.h b/src/corelib/serialization/qcborarray.h
index fe06b8630f..0438b920ab 100644
--- a/src/corelib/serialization/qcborarray.h
+++ b/src/corelib/serialization/qcborarray.h
@@ -294,7 +294,7 @@ inline QCborArray QCborValueRef::toArray(const QCborArray &a) const
return concrete().toArray(a);
}
-Q_CORE_EXPORT uint qHash(const QCborArray &array, uint seed = 0);
+Q_CORE_EXPORT size_t qHash(const QCborArray &array, size_t seed = 0);
#if !defined(QT_NO_DEBUG_STREAM)
Q_CORE_EXPORT QDebug operator<<(QDebug, const QCborArray &a);
diff --git a/src/corelib/serialization/qcborcommon.h b/src/corelib/serialization/qcborcommon.h
index bec46399ce..1497da3d2e 100644
--- a/src/corelib/serialization/qcborcommon.h
+++ b/src/corelib/serialization/qcborcommon.h
@@ -138,12 +138,12 @@ QDataStream &operator<<(QDataStream &ds, QCborSimpleType st);
QDataStream &operator>>(QDataStream &ds, QCborSimpleType &st);
#endif
-inline uint qHash(QCborSimpleType tag, uint seed = 0)
+inline size_t qHash(QCborSimpleType tag, size_t seed = 0)
{
return qHash(quint8(tag), seed);
}
-inline uint qHash(QCborTag tag, uint seed = 0)
+inline size_t qHash(QCborTag tag, size_t seed = 0)
{
return qHash(quint64(tag), seed);
}
diff --git a/src/corelib/serialization/qcbormap.cpp b/src/corelib/serialization/qcbormap.cpp
index 4b28ca4a2e..9a8a2c4417 100644
--- a/src/corelib/serialization/qcbormap.cpp
+++ b/src/corelib/serialization/qcbormap.cpp
@@ -1744,7 +1744,7 @@ void QCborMap::detach(qsizetype reserved)
\sa operator+=(), operator-()
*/
-uint qHash(const QCborMap &map, uint seed)
+size_t qHash(const QCborMap &map, size_t seed)
{
return qHashRange(map.begin(), map.end(), seed);
}
diff --git a/src/corelib/serialization/qcbormap.h b/src/corelib/serialization/qcbormap.h
index 6636ce776a..0609c0a39e 100644
--- a/src/corelib/serialization/qcbormap.h
+++ b/src/corelib/serialization/qcbormap.h
@@ -350,7 +350,7 @@ inline QCborMap QCborValueRef::toMap(const QCborMap &m) const
return concrete().toMap(m);
}
-Q_CORE_EXPORT uint qHash(const QCborMap &map, uint seed = 0);
+Q_CORE_EXPORT size_t qHash(const QCborMap &map, size_t seed = 0);
#if !defined(QT_NO_DEBUG_STREAM)
Q_CORE_EXPORT QDebug operator<<(QDebug, const QCborMap &m);
diff --git a/src/corelib/serialization/qcborstreamwriter.cpp b/src/corelib/serialization/qcborstreamwriter.cpp
index 9d78785416..c73c17aed1 100644
--- a/src/corelib/serialization/qcborstreamwriter.cpp
+++ b/src/corelib/serialization/qcborstreamwriter.cpp
@@ -729,7 +729,7 @@ void QCborStreamWriter::appendTextString(const char *utf8, qsizetype len)
length is implied by the elements contained in it. Note, however, that use
of indeterminate-length arrays is not compliant with canonical CBOR encoding.
- The following example appends elements from the linked list of strings
+ The following example appends elements from the vector of strings
passed as input:
\snippet code/src_corelib_serialization_qcborstream.cpp 20
@@ -802,7 +802,7 @@ bool QCborStreamWriter::endArray()
indeterminate-length maps is not compliant with canonical CBOR encoding
(canonical encoding also requires keys to be unique and in sorted order).
- The following example appends elements from the linked list of int and
+ The following example appends elements from the vector of int and
string pairs passed as input:
\snippet code/src_corelib_serialization_qcborstream.cpp 22
diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp
index c45a09ad99..a3f93e5eed 100644
--- a/src/corelib/serialization/qcborvalue.cpp
+++ b/src/corelib/serialization/qcborvalue.cpp
@@ -2542,7 +2542,7 @@ QCborValue QCborValue::fromCbor(const QByteArray &ba, QCborParserError *error)
\sa fromCbor(), fromVariant(), fromJsonValue()
*/
-QByteArray QCborValue::toCbor(EncodingOptions opt)
+QByteArray QCborValue::toCbor(EncodingOptions opt) const
{
QByteArray result;
QCborStreamWriter writer(&result);
@@ -2579,7 +2579,7 @@ QByteArray QCborValue::toCbor(EncodingOptions opt)
\sa fromCbor(), fromVariant(), fromJsonValue()
*/
-Q_NEVER_INLINE void QCborValue::toCbor(QCborStreamWriter &writer, EncodingOptions opt)
+Q_NEVER_INLINE void QCborValue::toCbor(QCborStreamWriter &writer, EncodingOptions opt) const
{
if (isContainer() || isTag())
return encodeToCbor(writer, container, -type(), opt);
@@ -2925,7 +2925,7 @@ inline QCborMap::QCborMap(QCborContainerPrivate &dd) noexcept
{
}
-uint qHash(const QCborValue &value, uint seed)
+size_t qHash(const QCborValue &value, size_t seed)
{
switch (value.type()) {
case QCborValue::Integer:
diff --git a/src/corelib/serialization/qcborvalue.h b/src/corelib/serialization/qcborvalue.h
index aa51e5da81..3fd03301a1 100644
--- a/src/corelib/serialization/qcborvalue.h
+++ b/src/corelib/serialization/qcborvalue.h
@@ -297,8 +297,8 @@ public:
{ return fromCbor(QByteArray(reinterpret_cast<const char *>(data), int(len)), error); }
#endif // QT_CONFIG(cborstreamreader)
#if QT_CONFIG(cborstreamwriter)
- QByteArray toCbor(EncodingOptions opt = NoTransformation);
- void toCbor(QCborStreamWriter &writer, EncodingOptions opt = NoTransformation);
+ QByteArray toCbor(EncodingOptions opt = NoTransformation) const;
+ void toCbor(QCborStreamWriter &writer, EncodingOptions opt = NoTransformation) const;
#endif
QString toDiagnosticNotation(DiagnosticNotationOptions opts = Compact) const;
@@ -480,7 +480,7 @@ private:
qsizetype i;
};
-Q_CORE_EXPORT uint qHash(const QCborValue &value, uint seed = 0);
+Q_CORE_EXPORT size_t qHash(const QCborValue &value, size_t seed = 0);
#if !defined(QT_NO_DEBUG_STREAM)
Q_CORE_EXPORT QDebug operator<<(QDebug, const QCborValue &v);
diff --git a/src/corelib/serialization/qcborvalue_p.h b/src/corelib/serialization/qcborvalue_p.h
index 041a20e746..1d686f118b 100644
--- a/src/corelib/serialization/qcborvalue_p.h
+++ b/src/corelib/serialization/qcborvalue_p.h
@@ -148,8 +148,8 @@ public:
qptrdiff offset = data.size();
// align offset
- offset += Q_ALIGNOF(QtCbor::ByteData) - 1;
- offset &= ~(Q_ALIGNOF(QtCbor::ByteData) - 1);
+ offset += alignof(QtCbor::ByteData) - 1;
+ offset &= ~(alignof(QtCbor::ByteData) - 1);
qptrdiff increment = qptrdiff(sizeof(QtCbor::ByteData)) + len;
@@ -171,7 +171,7 @@ public:
return nullptr;
size_t offset = size_t(e.value);
- Q_ASSERT((offset % Q_ALIGNOF(QtCbor::ByteData)) == 0);
+ Q_ASSERT((offset % alignof(QtCbor::ByteData)) == 0);
Q_ASSERT(offset + sizeof(QtCbor::ByteData) <= size_t(data.size()));
auto b = reinterpret_cast<const QtCbor::ByteData *>(data.constData() + offset);
@@ -215,7 +215,7 @@ public:
}
void insertAt(qsizetype idx, const QCborValue &value, ContainerDisposition disp = CopyContainer)
{
- replaceAt_internal(*elements.insert(elements.begin() + idx, {}), value, disp);
+ replaceAt_internal(*elements.insert(elements.begin() + int(idx), {}), value, disp);
}
void append(QtCbor::Undefined)
@@ -236,6 +236,15 @@ public:
elements.append(QtCbor::Element(addByteData(data, len), type,
QtCbor::Element::HasByteData | extraFlags));
}
+ void appendAsciiString(const QString &s);
+ void appendAsciiString(const char *str, qsizetype len)
+ {
+ appendByteData(str, len, QCborValue::String, QtCbor::Element::StringIsAscii);
+ }
+ void appendUtf8String(const char *str, qsizetype len)
+ {
+ appendByteData(str, len, QCborValue::String);
+ }
void append(QLatin1String s)
{
if (!QtPrivate::isAscii(s))
diff --git a/src/corelib/serialization/qdatastream.cpp b/src/corelib/serialization/qdatastream.cpp
index 5082a8cb0d..df286085bc 100644
--- a/src/corelib/serialization/qdatastream.cpp
+++ b/src/corelib/serialization/qdatastream.cpp
@@ -163,7 +163,7 @@ QT_BEGIN_NAMESPACE
\section1 Reading and Writing Qt Collection Classes
The Qt container classes can also be serialized to a QDataStream.
- These include QList, QLinkedList, QVector, QSet, QHash, and QMap.
+ These include QList, QVector, QSet, QHash, and QMap.
The stream operators are declared as non-members of the classes.
\target Serializing Qt Classes
diff --git a/src/corelib/serialization/qdatastream.h b/src/corelib/serialization/qdatastream.h
index bc05841b52..c7b0008039 100644
--- a/src/corelib/serialization/qdatastream.h
+++ b/src/corelib/serialization/qdatastream.h
@@ -43,6 +43,7 @@
#include <QtCore/qscopedpointer.h>
#include <QtCore/qiodevice.h>
#include <QtCore/qpair.h>
+#include <QtCore/qcontainerfwd.h>
#ifdef Status
#error qdatastream.h must be included before any header file that defines Status
@@ -54,12 +55,6 @@ class qfloat16;
class QByteArray;
class QIODevice;
-template <typename T> class QList;
-template <typename T> class QVector;
-template <typename T> class QSet;
-template <class Key, class T> class QHash;
-template <class Key, class T> class QMap;
-
#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
class QDataStreamPrivate;
namespace QtPrivate {
@@ -100,15 +95,9 @@ public:
Qt_5_12 = 18,
Qt_5_13 = 19,
Qt_5_14 = Qt_5_13,
-#if QT_VERSION >= 0x050f00
Qt_5_15 = Qt_5_14,
- Qt_DefaultCompiledVersion = Qt_5_15
-#elif QT_VERSION >= 0x060000
- Qt_6_0 = Qt_5_15,
+ Qt_6_0 = 20,
Qt_DefaultCompiledVersion = Qt_6_0
-#else
- Qt_DefaultCompiledVersion = Qt_5_14
-#endif
#if QT_VERSION >= 0x060100
#error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion
#endif
@@ -285,13 +274,6 @@ QDataStream &readListBasedContainer(QDataStream &s, Container &c)
return s;
}
-template <typename T>
-struct MultiContainer { using type = T; };
-template <typename K, typename V>
-struct MultiContainer<QMap<K, V>> { using type = QMultiMap<K, V>; };
-template <typename K, typename V>
-struct MultiContainer<QHash<K, V>> { using type = QMultiHash<K, V>; };
-
template <typename Container>
QDataStream &readAssociativeContainer(QDataStream &s, Container &c)
{
@@ -308,7 +290,7 @@ QDataStream &readAssociativeContainer(QDataStream &s, Container &c)
c.clear();
break;
}
- static_cast<typename MultiContainer<Container>::type &>(c).insert(k, t);
+ c.insert(k, t);
}
return s;
@@ -328,20 +310,20 @@ template <typename Container>
QDataStream &writeAssociativeContainer(QDataStream &s, const Container &c)
{
s << quint32(c.size());
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15)
- // Deserialization should occur in the reverse order.
- // Otherwise, value() will return the least recently inserted
- // value instead of the most recently inserted one.
- auto it = c.constEnd();
- auto begin = c.constBegin();
- while (it != begin) {
- QT_WARNING_PUSH
- QT_WARNING_DISABLE_DEPRECATED
- --it;
- QT_WARNING_POP
+ auto it = c.constBegin();
+ auto end = c.constEnd();
+ while (it != end) {
s << it.key() << it.value();
+ ++it;
}
-#else
+
+ return s;
+}
+
+template <typename Container>
+QDataStream &writeAssociativeMultiContainer(QDataStream &s, const Container &c)
+{
+ s << quint32(c.size());
auto it = c.constBegin();
auto end = c.constEnd();
while (it != end) {
@@ -354,7 +336,6 @@ QDataStream &writeAssociativeContainer(QDataStream &s, const Container &c)
s << next.key() << next.value();
}
}
-#endif
return s;
}
@@ -419,18 +400,6 @@ typename std::enable_if<std::is_enum<T>::value, QDataStream &>::type&
operator>>(QDataStream &s, T &t)
{ return s >> reinterpret_cast<typename std::underlying_type<T>::type &>(t); }
-template <typename T>
-inline QDataStream &operator>>(QDataStream &s, QList<T> &l)
-{
- return QtPrivate::readArrayBasedContainer(s, l);
-}
-
-template <typename T>
-inline QDataStream &operator<<(QDataStream &s, const QList<T> &l)
-{
- return QtPrivate::writeSequentialContainer(s, l);
-}
-
template<typename T>
inline QDataStream &operator>>(QDataStream &s, QVector<T> &v)
{
@@ -462,12 +431,25 @@ inline QDataStream &operator>>(QDataStream &s, QHash<Key, T> &hash)
}
template <class Key, class T>
+
inline QDataStream &operator<<(QDataStream &s, const QHash<Key, T> &hash)
{
return QtPrivate::writeAssociativeContainer(s, hash);
}
template <class Key, class T>
+inline QDataStream &operator>>(QDataStream &s, QMultiHash<Key, T> &hash)
+{
+ return QtPrivate::readAssociativeContainer(s, hash);
+}
+
+template <class Key, class T>
+inline QDataStream &operator<<(QDataStream &s, const QMultiHash<Key, T> &hash)
+{
+ return QtPrivate::writeAssociativeMultiContainer(s, hash);
+}
+
+template <class Key, class T>
inline QDataStream &operator>>(QDataStream &s, QMap<Key, T> &map)
{
return QtPrivate::readAssociativeContainer(s, map);
@@ -479,6 +461,18 @@ inline QDataStream &operator<<(QDataStream &s, const QMap<Key, T> &map)
return QtPrivate::writeAssociativeContainer(s, map);
}
+template <class Key, class T>
+inline QDataStream &operator>>(QDataStream &s, QMultiMap<Key, T> &map)
+{
+ return QtPrivate::readAssociativeContainer(s, map);
+}
+
+template <class Key, class T>
+inline QDataStream &operator<<(QDataStream &s, const QMultiMap<Key, T> &map)
+{
+ return QtPrivate::writeAssociativeMultiContainer(s, map);
+}
+
#ifndef QT_NO_DATASTREAM
template <class T1, class T2>
inline QDataStream& operator>>(QDataStream& s, QPair<T1, T2>& p)
diff --git a/src/corelib/serialization/qjsonarray.cpp b/src/corelib/serialization/qjsonarray.cpp
index 05138ad610..98ace021fc 100644
--- a/src/corelib/serialization/qjsonarray.cpp
+++ b/src/corelib/serialization/qjsonarray.cpp
@@ -1133,7 +1133,7 @@ void QJsonArray::compact()
a->compact(a->elements.size());
}
-uint qHash(const QJsonArray &array, uint seed)
+size_t qHash(const QJsonArray &array, size_t seed)
{
return qHashRange(array.begin(), array.end(), seed);
}
diff --git a/src/corelib/serialization/qjsonarray.h b/src/corelib/serialization/qjsonarray.h
index 22aa996a3e..d39522bd2f 100644
--- a/src/corelib/serialization/qjsonarray.h
+++ b/src/corelib/serialization/qjsonarray.h
@@ -49,7 +49,6 @@ QT_BEGIN_NAMESPACE
class QDebug;
class QStringList;
-template <typename T> class QList;
typedef QList<QVariant> QVariantList;
class Q_CORE_EXPORT QJsonArray
@@ -253,7 +252,7 @@ private:
Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QJsonArray)
-Q_CORE_EXPORT uint qHash(const QJsonArray &array, uint seed = 0);
+Q_CORE_EXPORT size_t qHash(const QJsonArray &array, size_t seed = 0);
#if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_JSON_READONLY)
Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonArray &);
diff --git a/src/corelib/serialization/qjsoncbor.cpp b/src/corelib/serialization/qjsoncbor.cpp
index ee4dd90416..000008db50 100644
--- a/src/corelib/serialization/qjsoncbor.cpp
+++ b/src/corelib/serialization/qjsoncbor.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 Intel Corporation.
+** Copyright (C) 2020 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -262,8 +262,7 @@ QJsonValue qt_convertToJson(QCborContainerPrivate *d, qsizetype idx)
const auto &e = d->elements.at(idx);
switch (e.type) {
case QCborValue::Integer:
- return QJsonPrivate::Value::fromTrustedCbor(e.value);
-
+ return QJsonValue(e.value);
case QCborValue::ByteArray:
case QCborValue::String:
case QCborValue::SimpleType:
@@ -370,7 +369,7 @@ QJsonValue QCborValue::toJsonValue() const
return false;
case Integer:
- return QJsonPrivate::Value::fromTrustedCbor(n);
+ return QJsonPrivate::Value::fromTrustedCbor(*this);
case True:
return true;
@@ -615,11 +614,9 @@ QCborValue QCborValue::fromJsonValue(const QJsonValue &v)
case QJsonValue::Bool:
return v.toBool();
case QJsonValue::Double: {
- qint64 i;
- const double dbl = v.toDouble();
- if (convertDoubleTo(dbl, &i))
- return i;
- return dbl;
+ if (v.t == Integer)
+ return v.toInteger();
+ return v.toDouble();
}
case QJsonValue::String:
return v.toString();
@@ -667,9 +664,7 @@ static void appendVariant(QCborContainerPrivate *d, const QVariant &variant)
\row \li \c bool \li Bool
\row \li \c std::nullptr_t \li Null
\row \li \c short, \c ushort, \c int, \c uint, \l qint64 \li Integer
- \row \li \l quint64 \li Integer, but they are cast to \c qint64 first so
- values higher than 2\sup{63}-1 (\c INT64_MAX) will
- be wrapped to negative
+ \row \li \l quint64 \li Integer, or Double if outside the range of qint64
\row \li \c float, \c double \li Double
\row \li \l QByteArray \li ByteArray
\row \li \l QDateTime \li DateTime
@@ -713,9 +708,12 @@ QCborValue QCborValue::fromVariant(const QVariant &variant)
case QMetaType::UShort:
case QMetaType::Int:
case QMetaType::LongLong:
- case QMetaType::ULongLong:
case QMetaType::UInt:
return variant.toLongLong();
+ case QMetaType::ULongLong:
+ if (variant.toULongLong() <= static_cast<uint64_t>(std::numeric_limits<qint64>::max()))
+ return variant.toLongLong();
+ Q_FALLTHROUGH();
case QMetaType::Float:
case QMetaType::Double:
return variant.toDouble();
diff --git a/src/corelib/serialization/qjsonobject.cpp b/src/corelib/serialization/qjsonobject.cpp
index 850e878571..a03855d4a3 100644
--- a/src/corelib/serialization/qjsonobject.cpp
+++ b/src/corelib/serialization/qjsonobject.cpp
@@ -1490,7 +1490,7 @@ void QJsonObject::removeAt(int index)
o->removeAt(index);
}
-uint qHash(const QJsonObject &object, uint seed)
+size_t qHash(const QJsonObject &object, size_t seed)
{
QtPrivate::QHashCombine hash;
for (auto it = object.begin(), end = object.end(); it != end; ++it) {
diff --git a/src/corelib/serialization/qjsonobject.h b/src/corelib/serialization/qjsonobject.h
index c31be0353d..dc449eecf4 100644
--- a/src/corelib/serialization/qjsonobject.h
+++ b/src/corelib/serialization/qjsonobject.h
@@ -302,7 +302,7 @@ private:
Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QJsonObject)
-Q_CORE_EXPORT uint qHash(const QJsonObject &object, uint seed = 0);
+Q_CORE_EXPORT size_t qHash(const QJsonObject &object, size_t seed = 0);
#if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_JSON_READONLY)
Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonObject &);
diff --git a/src/corelib/serialization/qjsonparser.cpp b/src/corelib/serialization/qjsonparser.cpp
index 6d0a92e094..d7ce702ff7 100644
--- a/src/corelib/serialization/qjsonparser.cpp
+++ b/src/corelib/serialization/qjsonparser.cpp
@@ -709,10 +709,11 @@ bool Parser::parseNumber()
// frac = decimal-point 1*DIGIT
if (json < end && *json == '.') {
- isInt = false;
++json;
- while (json < end && *json >= '0' && *json <= '9')
+ while (json < end && *json >= '0' && *json <= '9') {
+ isInt = isInt && *json == '0';
++json;
+ }
}
// exp = e [ minus / plus ] 1*DIGIT
@@ -893,9 +894,10 @@ bool Parser::parseString()
// no escape sequences, we are done
if (isUtf8) {
- container->appendByteData(start, json - start - 1, QCborValue::String,
- isAscii ? QtCbor::Element::StringIsAscii
- : QtCbor::Element::ValueFlags {});
+ if (isAscii)
+ container->appendAsciiString(start, json - start - 1);
+ else
+ container->appendUtf8String(start, json - start - 1);
END;
return true;
}
diff --git a/src/corelib/serialization/qjsonvalue.cpp b/src/corelib/serialization/qjsonvalue.cpp
index caf81c79ef..5eb33bd2a3 100644
--- a/src/corelib/serialization/qjsonvalue.cpp
+++ b/src/corelib/serialization/qjsonvalue.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -154,7 +154,9 @@ QJsonValue::QJsonValue(bool b)
QJsonValue::QJsonValue(double v)
: d(nullptr)
{
- if (convertDoubleTo(v, &n)) {
+ // Convert to integer if the number is an integer and changing wouldn't
+ // introduce additional digit precision not present in the double.
+ if (convertDoubleTo<qint64>(v, &n, false /* allow_precision_upgrade */)) {
t = QCborValue::Integer;
} else {
memcpy(&n, &v, sizeof(n));
@@ -449,12 +451,18 @@ QJsonValue QJsonValue::fromVariant(const QVariant &variant)
return QJsonValue(Null);
case QMetaType::Bool:
return QJsonValue(variant.toBool());
+ case QMetaType::Short:
+ case QMetaType::UShort:
case QMetaType::Int:
- case QMetaType::Float:
- case QMetaType::Double:
+ case QMetaType::UInt:
case QMetaType::LongLong:
+ return QJsonValue(variant.toLongLong());
case QMetaType::ULongLong:
- case QMetaType::UInt:
+ if (variant.toULongLong() <= static_cast<uint64_t>(std::numeric_limits<qint64>::max()))
+ return QJsonValue(variant.toLongLong());
+ Q_FALLTHROUGH();
+ case QMetaType::Float:
+ case QMetaType::Double:
return QJsonValue(variant.toDouble());
case QMetaType::QString:
return QJsonValue(variant.toString());
@@ -504,7 +512,7 @@ QJsonValue QJsonValue::fromVariant(const QVariant &variant)
\value Null QMetaType::Nullptr
\value Bool QMetaType::Bool
- \value Double QMetaType::Double
+ \value Double QMetaType::Double or QMetaType::LongLong
\value String QString
\value Array QVariantList
\value Object QVariantMap
@@ -520,6 +528,7 @@ QVariant QJsonValue::toVariant() const
case QCborValue::False:
return false;
case QCborValue::Integer:
+ return toInteger();
case QCborValue::Double:
return toDouble();
case QCborValue::String:
@@ -548,7 +557,8 @@ QVariant QJsonValue::toVariant() const
\value Null A Null value
\value Bool A boolean value. Use toBool() to convert to a bool.
- \value Double A double. Use toDouble() to convert to a double.
+ \value Double A number value. Use toDouble() to convert to a double,
+ or toInteger() to convert to a qint64.
\value String A string. Use toString() to convert to a QString.
\value Array An array. Use toArray() to convert to a QJsonArray.
\value Object An object. Use toObject() to convert to a QJsonObject.
@@ -613,18 +623,43 @@ int QJsonValue::toInt(int defaultValue) const
{
switch (t) {
case QCborValue::Double: {
- const double dbl = toDouble();
int dblInt;
- convertDoubleTo<int>(dbl, &dblInt);
- return dbl == dblInt ? dblInt : defaultValue;
+ if (convertDoubleTo<int>(toDouble(), &dblInt))
+ return dblInt;
+ break;
}
case QCborValue::Integer:
- return (n <= qint64(std::numeric_limits<int>::max())
- && n >= qint64(std::numeric_limits<int>::min()))
- ? n : defaultValue;
+ if (qint64(int(n)) == n)
+ return int(n);
+ break;
default:
- return defaultValue;
+ break;
}
+ return defaultValue;
+}
+
+/*!
+ \since 6.0
+ Converts the value to an integer and returns it.
+
+ If type() is not Double or the value is not a whole number
+ representable as qint64, the \a defaultValue will be returned.
+ */
+qint64 QJsonValue::toInteger(qint64 defaultValue) const
+{
+ switch (t) {
+ case QCborValue::Integer:
+ return n;
+ case QCborValue::Double: {
+ qint64 dblInt;
+ if (convertDoubleTo<qint64>(toDouble(), &dblInt))
+ return dblInt;
+ break;
+ }
+ default:
+ break;
+ }
+ return defaultValue;
}
/*!
@@ -641,7 +676,7 @@ double QJsonValue::toDouble(double defaultValue) const
return d;
}
case QCborValue::Integer:
- return n;
+ return double(n);
default:
return defaultValue;
}
@@ -787,8 +822,13 @@ const QJsonValue QJsonValue::operator[](int i) const
*/
bool QJsonValue::operator==(const QJsonValue &other) const
{
- if (t != other.t)
+ if (t != other.t) {
+ if (isDouble() && other.isDouble()) {
+ // One value Cbor integer, one Cbor double, should interact as doubles.
+ return toDouble() == other.toDouble();
+ }
return false;
+ }
switch (t) {
case QCborValue::Undefined:
@@ -903,7 +943,7 @@ QJsonValue QJsonValueRef::toValue() const
return o->valueAt(index);
}
-uint qHash(const QJsonValue &value, uint seed)
+size_t qHash(const QJsonValue &value, size_t seed)
{
switch (value.type()) {
case QJsonValue::Null:
@@ -929,32 +969,38 @@ uint qHash(const QJsonValue &value, uint seed)
QDebug operator<<(QDebug dbg, const QJsonValue &o)
{
QDebugStateSaver saver(dbg);
- switch (o.type()) {
- case QJsonValue::Undefined:
+ switch (o.t) {
+ case QCborValue::Undefined:
dbg << "QJsonValue(undefined)";
break;
- case QJsonValue::Null:
+ case QCborValue::Null:
dbg << "QJsonValue(null)";
break;
- case QJsonValue::Bool:
+ case QCborValue::True:
+ case QCborValue::False:
dbg.nospace() << "QJsonValue(bool, " << o.toBool() << ')';
break;
- case QJsonValue::Double:
+ case QCborValue::Integer:
+ dbg.nospace() << "QJsonValue(double, " << o.toInteger() << ')';
+ break;
+ case QCborValue::Double:
dbg.nospace() << "QJsonValue(double, " << o.toDouble() << ')';
break;
- case QJsonValue::String:
+ case QCborValue::String:
dbg.nospace() << "QJsonValue(string, " << o.toString() << ')';
break;
- case QJsonValue::Array:
+ case QCborValue::Array:
dbg.nospace() << "QJsonValue(array, ";
dbg << o.toArray();
dbg << ')';
break;
- case QJsonValue::Object:
+ case QCborValue::Map:
dbg.nospace() << "QJsonValue(object, ";
dbg << o.toObject();
dbg << ')';
break;
+ default:
+ Q_UNREACHABLE();
}
return dbg;
}
diff --git a/src/corelib/serialization/qjsonvalue.h b/src/corelib/serialization/qjsonvalue.h
index 5adcd64176..fa877ff7ee 100644
--- a/src/corelib/serialization/qjsonvalue.h
+++ b/src/corelib/serialization/qjsonvalue.h
@@ -112,6 +112,7 @@ public:
bool toBool(bool defaultValue = false) const;
int toInt(int defaultValue = 0) const;
+ qint64 toInteger(qint64 defaultValue = 0) const;
double toDouble(double defaultValue = 0) const;
QString toString() const;
QString toString(const QString &defaultValue) const;
@@ -231,7 +232,7 @@ public:
Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QJsonValue)
-Q_CORE_EXPORT uint qHash(const QJsonValue &value, uint seed = 0);
+Q_CORE_EXPORT size_t qHash(const QJsonValue &value, size_t seed = 0);
#if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_JSON_READONLY)
Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonValue &);
diff --git a/src/corelib/serialization/qjsonwriter.cpp b/src/corelib/serialization/qjsonwriter.cpp
index 627d1bbd62..590b59f09c 100644
--- a/src/corelib/serialization/qjsonwriter.cpp
+++ b/src/corelib/serialization/qjsonwriter.cpp
@@ -60,7 +60,8 @@ static inline uchar hexdig(uint u)
static QByteArray escapedString(const QString &s)
{
- QByteArray ba(s.length(), Qt::Uninitialized);
+ // give it a minimum size to ensure the resize() below always adds enough space
+ QByteArray ba(qMax(s.length(), 16), Qt::Uninitialized);
uchar *cursor = reinterpret_cast<uchar *>(const_cast<char *>(ba.constData()));
const uchar *ba_end = cursor + ba.length();
@@ -138,15 +139,14 @@ static void valueToJson(const QCborValue &v, QByteArray &json, int indent, bool
json += "false";
break;
case QCborValue::Integer:
+ json += QByteArray::number(v.toInteger());
+ break;
case QCborValue::Double: {
const double d = v.toDouble();
- if (qIsFinite(d)) {
- quint64 absInt;
- json += QByteArray::number(d, convertDoubleTo(std::abs(d), &absInt) ? 'f' : 'g',
- QLocale::FloatingPointShortest);
- } else {
+ if (qIsFinite(d))
+ json += QByteArray::number(d, 'g', QLocale::FloatingPointShortest);
+ else
json += "null"; // +INF || -INF || NaN (see RFC4627#section2.4)
- }
break;
}
case QCborValue::String:
diff --git a/src/corelib/statemachine/qabstracttransition.h b/src/corelib/statemachine/qabstracttransition.h
index 18e12d3eb6..357e829b6a 100644
--- a/src/corelib/statemachine/qabstracttransition.h
+++ b/src/corelib/statemachine/qabstracttransition.h
@@ -64,7 +64,7 @@ class Q_CORE_EXPORT QAbstractTransition : public QObject
Q_PROPERTY(QState* sourceState READ sourceState)
Q_PROPERTY(QAbstractState* targetState READ targetState WRITE setTargetState NOTIFY targetStateChanged)
Q_PROPERTY(QList<QAbstractState*> targetStates READ targetStates WRITE setTargetStates NOTIFY targetStatesChanged)
- Q_PROPERTY(TransitionType transitionType READ transitionType WRITE setTransitionType REVISION 1)
+ Q_PROPERTY(TransitionType transitionType READ transitionType WRITE setTransitionType REVISION(1, 1))
public:
enum TransitionType {
ExternalTransition,
diff --git a/src/corelib/statemachine/qsignaleventgenerator_p.h b/src/corelib/statemachine/qsignaleventgenerator_p.h
index 72592b8731..a9d5b96920 100644
--- a/src/corelib/statemachine/qsignaleventgenerator_p.h
+++ b/src/corelib/statemachine/qsignaleventgenerator_p.h
@@ -62,13 +62,12 @@ class QStateMachine;
class QSignalEventGenerator : public QObject
{
- Q_OBJECT_FAKE
+ Q_OBJECT
public:
QSignalEventGenerator(QStateMachine *parent);
-private:
-// slots
- void execute(void **_a);
+private Q_SLOTS:
+ void execute(QMethodRawArguments a);
private:
Q_DISABLE_COPY_MOVE(QSignalEventGenerator)
diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp
index a257cbc306..c1fa700959 100644
--- a/src/corelib/statemachine/qstatemachine.cpp
+++ b/src/corelib/statemachine/qstatemachine.cpp
@@ -3045,102 +3045,14 @@ void QStateMachine::removeDefaultAnimation(QAbstractAnimation *animation)
#endif // animation
-
-// Begin moc-generated code -- modify carefully (check "HAND EDIT" parts)!
-struct qt_meta_stringdata_QSignalEventGenerator_t {
- QByteArrayData data[3];
- char stringdata[32];
-};
-#define QT_MOC_LITERAL(idx, ofs, len) \
- Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
- offsetof(qt_meta_stringdata_QSignalEventGenerator_t, stringdata) + ofs \
- - idx * sizeof(QByteArrayData) \
- )
-static const qt_meta_stringdata_QSignalEventGenerator_t qt_meta_stringdata_QSignalEventGenerator = {
- {
-QT_MOC_LITERAL(0, 0, 21),
-QT_MOC_LITERAL(1, 22, 7),
-QT_MOC_LITERAL(2, 30, 0)
- },
- "QSignalEventGenerator\0execute\0\0"
-};
-#undef QT_MOC_LITERAL
-
-static const uint qt_meta_data_QSignalEventGenerator[] = {
-
- // content:
- 7, // revision
- 0, // classname
- 0, 0, // classinfo
- 1, 14, // methods
- 0, 0, // properties
- 0, 0, // enums/sets
- 0, 0, // constructors
- 0, // flags
- 0, // signalCount
-
- // slots: name, argc, parameters, tag, flags
- 1, 0, 19, 2, 0x0a,
-
- // slots: parameters
- QMetaType::Void,
-
- 0 // eod
-};
-
-void QSignalEventGenerator::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
-{
- if (_c == QMetaObject::InvokeMetaMethod) {
- Q_ASSERT(staticMetaObject.cast(_o));
- QSignalEventGenerator *_t = static_cast<QSignalEventGenerator *>(_o);
- switch (_id) {
- case 0: _t->execute(_a); break; // HAND EDIT: add the _a parameter
- default: ;
- }
- }
- Q_UNUSED(_a);
-}
-
-const QMetaObject QSignalEventGenerator::staticMetaObject = {
- { &QObject::staticMetaObject, qt_meta_stringdata_QSignalEventGenerator.data,
- qt_meta_data_QSignalEventGenerator, qt_static_metacall, nullptr, nullptr }
-};
-
-const QMetaObject *QSignalEventGenerator::metaObject() const
-{
- return &staticMetaObject;
-}
-
-void *QSignalEventGenerator::qt_metacast(const char *_clname)
-{
- if (!_clname) return nullptr;
- if (!strcmp(_clname, qt_meta_stringdata_QSignalEventGenerator.stringdata))
- return static_cast<void*>(const_cast< QSignalEventGenerator*>(this));
- return QObject::qt_metacast(_clname);
-}
-
-int QSignalEventGenerator::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
-{
- _id = QObject::qt_metacall(_c, _id, _a);
- if (_id < 0)
- return _id;
- if (_c == QMetaObject::InvokeMetaMethod) {
- if (_id < 1)
- qt_static_metacall(this, _c, _id, _a);
- _id -= 1;
- }
- return _id;
-}
-// End moc-generated code
-
-void QSignalEventGenerator::execute(void **_a)
+void QSignalEventGenerator::execute(QMethodRawArguments a)
{
auto machinePrivate = QStateMachinePrivate::get(qobject_cast<QStateMachine*>(parent()));
if (machinePrivate->state != QStateMachinePrivate::Running)
return;
int signalIndex = senderSignalIndex();
Q_ASSERT(signalIndex != -1);
- machinePrivate->handleTransitionSignal(sender(), signalIndex, _a);
+ machinePrivate->handleTransitionSignal(sender(), signalIndex, a.arguments);
}
QSignalEventGenerator::QSignalEventGenerator(QStateMachine *parent)
diff --git a/src/corelib/statemachine/qstatemachine_p.h b/src/corelib/statemachine/qstatemachine_p.h
index f140023e31..7018926bd3 100644
--- a/src/corelib/statemachine/qstatemachine_p.h
+++ b/src/corelib/statemachine/qstatemachine_p.h
@@ -216,12 +216,9 @@ public:
QPointer<QObject> guard;
QObject *obj;
QByteArray prop;
- // two overloads because friends can't have default arguments
- friend uint qHash(const RestorableId &key, uint seed)
+ friend size_t qHash(const RestorableId &key, size_t seed)
noexcept(noexcept(qHash(std::declval<QByteArray>())))
{ return qHash(qMakePair(key.obj, key.prop), seed); }
- friend uint qHash(const RestorableId &key) noexcept(noexcept(qHash(key, 0U)))
- { return qHash(key, 0U); }
friend bool operator==(const RestorableId &lhs, const RestorableId &rhs) noexcept
{ return lhs.obj == rhs.obj && lhs.prop == rhs.prop; }
friend bool operator!=(const RestorableId &lhs, const RestorableId &rhs) noexcept
diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp
index f0c903737f..b778316a15 100644
--- a/src/corelib/text/qbytearray.cpp
+++ b/src/corelib/text/qbytearray.cpp
@@ -65,7 +65,7 @@
#include <string.h>
#include <stdlib.h>
-#define IS_RAW_DATA(d) ((d)->offset != sizeof(QByteArrayData))
+#define IS_RAW_DATA(d) ((d)->flags() & QArrayData::RawDataType)
QT_BEGIN_NAMESPACE
@@ -558,28 +558,13 @@ static const quint16 crc_tbl[16] = {
/*!
\relates QByteArray
-
- Returns the CRC-16 checksum of the first \a len bytes of \a data.
-
- The checksum is independent of the byte order (endianness) and will be
- calculated accorded to the algorithm published in ISO 3309 (Qt::ChecksumIso3309).
-
- \note This function is a 16-bit cache conserving (16 entry table)
- implementation of the CRC-16-CCITT algorithm.
-*/
-quint16 qChecksum(const char *data, uint len)
-{
- return qChecksum(data, len, Qt::ChecksumIso3309);
-}
-
-/*!
- \relates QByteArray
\since 5.9
Returns the CRC-16 checksum of the first \a len bytes of \a data.
The checksum is independent of the byte order (endianness) and will
be calculated accorded to the algorithm published in \a standard.
+ By default the algorithm published in ISO 3309 (Qt::ChecksumIso3309) is used.
\note This function is a 16-bit cache conserving (16 entry table)
implementation of the CRC-16-CCITT algorithm.
@@ -748,27 +733,25 @@ QByteArray qUncompress(const uchar* data, int nbytes)
return invalidCompressedData();
}
- QScopedPointer<QByteArray::Data, QByteArrayDataDeleter> d(QByteArray::Data::allocate(expectedSize + 1));
+ QPair<QByteArray::Data *, char *> pair = QByteArray::Data::allocate(expectedSize + 1);
+ QScopedPointer<QByteArray::Data, QByteArrayDataDeleter> d(pair.first);
if (Q_UNLIKELY(d.data() == nullptr))
return invalidCompressedData();
- d->size = expectedSize;
forever {
ulong alloc = len;
- int res = ::uncompress((uchar*)d->data(), &len,
+ int res = ::uncompress((uchar*)pair.second, &len,
data+4, nbytes-4);
switch (res) {
- case Z_OK:
+ case Z_OK: {
Q_ASSERT(len <= alloc);
Q_UNUSED(alloc);
- d->size = len;
- d->data()[len] = 0;
- {
- QByteArrayDataPtr dataPtr = { d.take() };
- return QByteArray(dataPtr);
- }
+ QByteArray::DataPointer dataPtr = { d.take(), pair.second, uint(len) };
+ pair.second[len] = '\0';
+ return QByteArray(dataPtr);
+ }
case Z_MEM_ERROR:
qWarning("qUncompress: Z_MEM_ERROR: Not enough memory");
@@ -781,11 +764,12 @@ QByteArray qUncompress(const uchar* data, int nbytes)
return invalidCompressedData();
} else {
// grow the block
- QByteArray::Data *p = QByteArray::Data::reallocateUnaligned(d.data(), len + 1);
- if (Q_UNLIKELY(p == nullptr))
+ pair = QByteArray::Data::reallocateUnaligned(d.data(), pair.second, len + 1);
+ Q_CHECK_PTR(pair.first);
+ if (Q_UNLIKELY(pair.first == nullptr))
return invalidCompressedData();
d.take(); // don't free
- d.reset(p);
+ d.reset(pair.first);
}
continue;
@@ -1211,9 +1195,6 @@ QByteArray qUncompress(const uchar* data, int nbytes)
*/
QByteArray &QByteArray::operator=(const QByteArray & other) noexcept
{
- other.d->ref.ref();
- if (!d->ref.deref())
- Data::deallocate(d);
d = other.d;
return *this;
}
@@ -1227,25 +1208,23 @@ QByteArray &QByteArray::operator=(const QByteArray & other) noexcept
QByteArray &QByteArray::operator=(const char *str)
{
- Data *x;
- if (!str) {
- x = Data::sharedNull();
- } else if (!*str) {
- x = Data::allocate(0);
+ if (!str || !*str) {
+ QPair<Data *, char *> pair;
+ if (!str) {
+ pair = qMakePair(Data::sharedNull(), Data::sharedNullData());
+ } else {
+ pair = Data::allocate(0);
+ }
+ d = QByteArrayData(pair.first, pair.second, 0);
} else {
const int len = int(strlen(str));
- const uint fullLen = len + 1;
- if (d->ref.isShared() || fullLen > d->alloc
- || (len < d->size && fullLen < uint(d->alloc >> 1)))
+ const uint fullLen = uint(len) + 1;
+ if (d->needsDetach() || fullLen > d->allocatedCapacity()
+ || (len < size() && fullLen < (d->allocatedCapacity() >> 1)))
reallocData(fullLen, d->detachFlags());
- x = d;
- memcpy(x->data(), str, fullLen); // include null terminator
- x->size = len;
+ memcpy(d.data(), str, fullLen); // include null terminator
+ d.size = len;
}
- x->ref.ref();
- if (!d->ref.deref())
- Data::deallocate(d);
- d = x;
return *this;
}
@@ -1448,7 +1427,7 @@ QByteArray &QByteArray::operator=(const char *str)
\sa operator[]()
*/
-/*! \fn QByteRef QByteArray::operator[](int i)
+/*! \fn char &QByteArray::operator[](int i)
Returns the byte at index position \a i as a modifiable reference.
@@ -1459,21 +1438,6 @@ QByteArray &QByteArray::operator=(const char *str)
Example:
\snippet code/src_corelib_tools_qbytearray.cpp 9
- The return value is of type QByteRef, a helper class for
- QByteArray. When you get an object of type QByteRef, you can use
- it as if it were a char &. If you assign to it, the assignment
- will apply to the character in the QByteArray from which you got
- the reference.
-
- \note Before Qt 5.14 it was possible to use this operator to access
- a character at an out-of-bounds position in the byte array, and
- then assign to such a position, causing the byte array to be
- automatically resized. Furthermore, assigning a value to the
- returned QByteRef would cause a detach of the byte array, even if the
- byte array has been copied in the meanwhile (and the QByteRef kept
- alive while the copy was taken). These behaviors are deprecated,
- and will be changed in a future version of Qt.
-
\sa at()
*/
@@ -1484,16 +1448,6 @@ QByteArray &QByteArray::operator=(const char *str)
Same as at(\a i).
*/
-/*! \fn QByteRef QByteArray::operator[](uint i)
-
- \overload
-*/
-
-/*! \fn char QByteArray::operator[](uint i) const
-
- \overload
-*/
-
/*!
\fn char QByteArray::front() const
\since 5.10
@@ -1525,7 +1479,7 @@ QByteArray &QByteArray::operator=(const char *str)
*/
/*!
- \fn QByteRef QByteArray::front()
+ \fn char &QByteArray::front()
\since 5.10
Returns a reference to the first character in the byte array.
@@ -1540,7 +1494,7 @@ QByteArray &QByteArray::operator=(const char *str)
*/
/*!
- \fn QByteRef QByteArray::back()
+ \fn char &QByteArray::back()
\since 5.10
Returns a reference to the last character in the byte array.
@@ -1591,7 +1545,7 @@ QByteArray &QByteArray::operator=(const char *str)
*/
void QByteArray::truncate(int pos)
{
- if (pos < d->size)
+ if (pos < size())
resize(pos);
}
@@ -1611,7 +1565,7 @@ void QByteArray::truncate(int pos)
void QByteArray::chop(int n)
{
if (n > 0)
- resize(d->size - n);
+ resize(size() - n);
}
@@ -1715,19 +1669,13 @@ void QByteArray::chop(int n)
QByteArray::QByteArray(const char *data, int size)
{
if (!data) {
- d = Data::sharedNull();
+ d = DataPointer();
} else {
if (size < 0)
size = int(strlen(data));
- if (!size) {
- d = Data::allocate(0);
- } else {
- d = Data::allocate(uint(size) + 1u);
- Q_CHECK_PTR(d);
- d->size = size;
- memcpy(d->data(), data, size);
- d->data()[size] = '\0';
- }
+ d = DataPointer(Data::allocate(uint(size) + 1u), size);
+ memcpy(d.data(), data, size);
+ d.data()[size] = '\0';
}
}
@@ -1741,13 +1689,11 @@ QByteArray::QByteArray(const char *data, int size)
QByteArray::QByteArray(int size, char ch)
{
if (size <= 0) {
- d = Data::allocate(0);
+ d = DataPointer(Data::allocate(0), 0);
} else {
- d = Data::allocate(uint(size) + 1u);
- Q_CHECK_PTR(d);
- d->size = size;
- memset(d->data(), ch, size);
- d->data()[size] = '\0';
+ d = DataPointer(Data::allocate(uint(size) + 1u), size);
+ memset(d.data(), ch, size);
+ d.data()[size] = '\0';
}
}
@@ -1759,10 +1705,8 @@ QByteArray::QByteArray(int size, char ch)
QByteArray::QByteArray(int size, Qt::Initialization)
{
- d = Data::allocate(uint(size) + 1u);
- Q_CHECK_PTR(d);
- d->size = size;
- d->data()[size] = '\0';
+ d = DataPointer(Data::allocate(uint(size) + 1u), size);
+ d.data()[size] = '\0';
}
/*!
@@ -1782,31 +1726,21 @@ void QByteArray::resize(int size)
if (size < 0)
size = 0;
- if (IS_RAW_DATA(d) && !d->ref.isShared() && size < d->size) {
- d->size = size;
+ if (!d->isShared() && !d->isMutable() && size < int(d.size)) {
+ d.size = size;
return;
}
- if (d->size == 0 && d->ref.isStatic()) {
- //
- // Optimize the idiom:
- // QByteArray a;
- // a.resize(sz);
- // ...
- // which is used in place of the Qt 3 idiom:
- // QByteArray a(sz);
- //
- Data *x = Data::allocate(uint(size) + 1u);
- Q_CHECK_PTR(x);
- x->size = size;
- x->data()[size] = '\0';
- d = x;
+ if (size == 0 && !(d->flags() & Data::CapacityReserved)) {
+ d = DataPointer(Data::allocate(0), 0);
} else {
- if (d->ref.isShared() || uint(size) + 1u > d->alloc)
- reallocData(uint(size) + 1u, d->detachFlags() | Data::Grow);
- if (d->alloc) {
- d->size = size;
- d->data()[size] = '\0';
+ if (d->needsDetach() || size > capacity()
+ || (!(d->flags() & Data::CapacityReserved) && size < int(d.size)
+ && size < (capacity() >> 1)))
+ reallocData(uint(size) + 1u, d->detachFlags() | Data::GrowsForward);
+ d.size = size;
+ if (d->isMutable()) {
+ d.data()[size] = '\0';
}
}
}
@@ -1824,33 +1758,27 @@ void QByteArray::resize(int size)
QByteArray &QByteArray::fill(char ch, int size)
{
- resize(size < 0 ? d->size : size);
- if (d->size)
- memset(d->data(), ch, d->size);
+ resize(size < 0 ? this->size() : size);
+ if (this->size())
+ memset(d.data(), ch, this->size());
return *this;
}
-void QByteArray::reallocData(uint alloc, Data::AllocationOptions options)
+void QByteArray::reallocData(uint alloc, Data::ArrayOptions options)
{
- if (d->ref.isShared() || IS_RAW_DATA(d)) {
- Data *x = Data::allocate(alloc, options);
- Q_CHECK_PTR(x);
- x->size = qMin(int(alloc) - 1, d->size);
- ::memcpy(x->data(), d->data(), x->size);
- x->data()[x->size] = '\0';
- if (!d->ref.deref())
- Data::deallocate(d);
- d = x;
+ if (d->needsDetach()) {
+ DataPointer dd(Data::allocate(alloc, options), qMin(int(alloc) - 1, d.size));
+ ::memcpy(dd.data(), d.data(), dd.size);
+ dd.data()[dd.size] = 0;
+ d = dd;
} else {
- Data *x = Data::reallocateUnaligned(d, alloc, options);
- Q_CHECK_PTR(x);
- d = x;
+ d.reallocate(alloc, options);
}
}
void QByteArray::expand(int i)
{
- resize(qMax(i + 1, d->size));
+ resize(qMax(i + 1, size()));
}
/*!
@@ -1896,9 +1824,9 @@ QByteArray QByteArray::nulTerminated() const
QByteArray &QByteArray::prepend(const QByteArray &ba)
{
- if (d->size == 0 && d->ref.isStatic() && !IS_RAW_DATA(ba.d)) {
+ if (size() == 0 && d->isStatic() && !IS_RAW_DATA(ba.d)) {
*this = ba;
- } else if (ba.d->size != 0) {
+ } else if (ba.size() != 0) {
QByteArray tmp = *this;
*this = ba;
append(tmp);
@@ -1927,12 +1855,12 @@ QByteArray &QByteArray::prepend(const char *str)
QByteArray &QByteArray::prepend(const char *str, int len)
{
if (str) {
- if (d->ref.isShared() || uint(d->size + len) + 1u > d->alloc)
- reallocData(uint(d->size + len) + 1u, d->detachFlags() | Data::Grow);
- memmove(d->data()+len, d->data(), d->size);
- memcpy(d->data(), str, len);
- d->size += len;
- d->data()[d->size] = '\0';
+ if (d->needsDetach() || size() + len > capacity())
+ reallocData(uint(size() + len) + 1u, d->detachFlags() | Data::GrowsForward);
+ memmove(d.data()+len, d.data(), d.size);
+ memcpy(d.data(), str, len);
+ d.size += len;
+ d.data()[d.size] = '\0';
}
return *this;
}
@@ -1953,12 +1881,12 @@ QByteArray &QByteArray::prepend(const char *str, int len)
QByteArray &QByteArray::prepend(char ch)
{
- if (d->ref.isShared() || uint(d->size) + 2u > d->alloc)
- reallocData(uint(d->size) + 2u, d->detachFlags() | Data::Grow);
- memmove(d->data()+1, d->data(), d->size);
- d->data()[0] = ch;
- ++d->size;
- d->data()[d->size] = '\0';
+ if (d->needsDetach() || size() + 1 > capacity())
+ reallocData(uint(size()) + 2u, d->detachFlags() | Data::GrowsForward);
+ memmove(d.data()+1, d.data(), d.size);
+ d.data()[0] = ch;
+ ++d.size;
+ d.data()[d.size] = '\0';
return *this;
}
@@ -1988,14 +1916,14 @@ QByteArray &QByteArray::prepend(char ch)
QByteArray &QByteArray::append(const QByteArray &ba)
{
- if (d->size == 0 && d->ref.isStatic() && !IS_RAW_DATA(ba.d)) {
+ if (size() == 0 && d->isStatic() && !IS_RAW_DATA(ba.d)) {
*this = ba;
- } else if (ba.d->size != 0) {
- if (d->ref.isShared() || uint(d->size + ba.d->size) + 1u > d->alloc)
- reallocData(uint(d->size + ba.d->size) + 1u, d->detachFlags() | Data::Grow);
- memcpy(d->data() + d->size, ba.d->data(), ba.d->size);
- d->size += ba.d->size;
- d->data()[d->size] = '\0';
+ } else if (ba.size() != 0) {
+ if (d->needsDetach() || size() + ba.size() > capacity())
+ reallocData(uint(size() + ba.size()) + 1u, d->detachFlags() | Data::GrowsForward);
+ memcpy(d.data() + d.size, ba.data(), ba.size());
+ d.size += ba.size();
+ d.data()[d.size] = '\0';
}
return *this;
}
@@ -2023,10 +1951,10 @@ QByteArray& QByteArray::append(const char *str)
{
if (str) {
const int len = int(strlen(str));
- if (d->ref.isShared() || uint(d->size + len) + 1u > d->alloc)
- reallocData(uint(d->size + len) + 1u, d->detachFlags() | Data::Grow);
- memcpy(d->data() + d->size, str, len + 1); // include null terminator
- d->size += len;
+ if (d->needsDetach() || size() + len > capacity())
+ reallocData(uint(size() + len) + 1u, d->detachFlags() | Data::GrowsForward);
+ memcpy(d.data() + d.size, str, len + 1); // include null terminator
+ d.size += len;
}
return *this;
}
@@ -2048,11 +1976,11 @@ QByteArray &QByteArray::append(const char *str, int len)
if (len < 0)
len = qstrlen(str);
if (str && len) {
- if (d->ref.isShared() || uint(d->size + len) + 1u > d->alloc)
- reallocData(uint(d->size + len) + 1u, d->detachFlags() | Data::Grow);
- memcpy(d->data() + d->size, str, len); // include null terminator
- d->size += len;
- d->data()[d->size] = '\0';
+ if (d->needsDetach() || size() + len > capacity())
+ reallocData(uint(size() + len) + 1u, d->detachFlags() | Data::GrowsForward);
+ memcpy(d.data() + d.size, str, len);
+ d.size += len;
+ d.data()[d.size] = '\0';
}
return *this;
}
@@ -2076,10 +2004,10 @@ QByteArray &QByteArray::append(const char *str, int len)
QByteArray& QByteArray::append(char ch)
{
- if (d->ref.isShared() || uint(d->size) + 2u > d->alloc)
- reallocData(uint(d->size) + 2u, d->detachFlags() | Data::Grow);
- d->data()[d->size++] = ch;
- d->data()[d->size] = '\0';
+ if (d->needsDetach() || size() + 1 > capacity())
+ reallocData(uint(size()) + 2u, d->detachFlags() | Data::GrowsForward);
+ d.data()[d.size++] = ch;
+ d.data()[d.size] = '\0';
return *this;
}
@@ -2120,7 +2048,7 @@ static inline QByteArray &qbytearray_insert(QByteArray *ba,
QByteArray &QByteArray::insert(int i, const QByteArray &ba)
{
QByteArray copy(ba);
- return qbytearray_insert(this, i, copy.d->data(), copy.d->size);
+ return qbytearray_insert(this, i, copy.constData(), copy.size());
}
/*!
@@ -2202,7 +2130,7 @@ QByteArray &QByteArray::insert(int i, int count, char ch)
int oldsize = size();
resize(qMax(i, oldsize) + count);
- char *dst = d->data();
+ char *dst = d.data();
if (i > oldsize)
::memset(dst + oldsize, 0x20, i - oldsize);
else if (i < oldsize)
@@ -2227,14 +2155,14 @@ QByteArray &QByteArray::insert(int i, int count, char ch)
QByteArray &QByteArray::remove(int pos, int len)
{
- if (len <= 0 || uint(pos) >= uint(d->size))
+ if (len <= 0 || uint(pos) >= uint(size()))
return *this;
detach();
- if (len >= d->size - pos) {
+ if (len >= size() - pos) {
resize(pos);
} else {
- memmove(d->data() + pos, d->data() + pos + len, d->size - pos - len);
- resize(d->size - len);
+ memmove(d.data() + pos, d.data() + pos + len, size() - pos - len);
+ resize(size() - len);
}
return *this;
}
@@ -2251,9 +2179,9 @@ QByteArray &QByteArray::remove(int pos, int len)
QByteArray &QByteArray::replace(int pos, int len, const QByteArray &after)
{
- if (len == after.d->size && (pos + len <= d->size)) {
+ if (len == after.size() && (pos + len <= size())) {
detach();
- memmove(d->data() + pos, after.d->data(), len*sizeof(char));
+ memmove(d.data() + pos, after.data(), len*sizeof(char));
return *this;
} else {
QByteArray copy(after);
@@ -2288,9 +2216,9 @@ QByteArray &QByteArray::replace(int pos, int len, const char *after)
*/
QByteArray &QByteArray::replace(int pos, int len, const char *after, int alen)
{
- if (len == alen && (pos + len <= d->size)) {
+ if (len == alen && (pos + len <= size())) {
detach();
- memcpy(d->data() + pos, after, len*sizeof(char));
+ memcpy(d.data() + pos, after, len*sizeof(char));
return *this;
} else {
remove(pos, len);
@@ -2313,14 +2241,7 @@ QByteArray &QByteArray::replace(int pos, int len, const char *after, int alen)
QByteArray &QByteArray::replace(const QByteArray &before, const QByteArray &after)
{
- if (isNull() || before.d == after.d)
- return *this;
-
- QByteArray aft = after;
- if (after.d == d)
- aft.detach();
-
- return replace(before.constData(), before.size(), aft.constData(), aft.size());
+ return replace(before.constData(), before.size(), after.constData(), after.size());
}
/*!
@@ -2333,11 +2254,7 @@ QByteArray &QByteArray::replace(const QByteArray &before, const QByteArray &afte
QByteArray &QByteArray::replace(const char *c, const QByteArray &after)
{
- QByteArray aft = after;
- if (after.d == d)
- aft.detach();
-
- return replace(c, qstrlen(c), aft.constData(), aft.size());
+ return replace(c, qstrlen(c), after.constData(), after.size());
}
/*!
@@ -2357,13 +2274,13 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
// protect against before or after being part of this
const char *a = after;
const char *b = before;
- if (after >= d->data() && after < d->data() + d->size) {
+ if (after >= constBegin() && after < constEnd()) {
char *copy = (char *)malloc(asize);
Q_CHECK_PTR(copy);
memcpy(copy, after, asize);
a = copy;
}
- if (before >= d->data() && before < d->data() + d->size) {
+ if (before >= constBegin() && before < constEnd()) {
char *copy = (char *)malloc(bsize);
Q_CHECK_PTR(copy);
memcpy(copy, before, bsize);
@@ -2372,13 +2289,13 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
QByteArrayMatcher matcher(before, bsize);
int index = 0;
- int len = d->size;
- char *d = data();
+ int len = size();
+ char *d = data(); // detaches
if (bsize == asize) {
if (bsize) {
while ((index = matcher.indexIn(*this, index)) != -1) {
- memcpy(d + index, after, asize);
+ memcpy(d + index, a, asize);
index += bsize;
}
}
@@ -2397,7 +2314,7 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
to = index;
}
if (asize) {
- memcpy(d + to, after, asize);
+ memcpy(d + to, a, asize);
to += asize;
}
index += bsize;
@@ -2440,7 +2357,7 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
resize(newlen);
len = newlen;
}
- d = this->d->data();
+ d = this->d.data(); // data(), without the detach() check
while(pos) {
pos--;
@@ -2449,7 +2366,7 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
int moveto = insertstart + asize;
memmove(d + moveto, d + movestart, (moveend - movestart));
if (asize)
- memcpy(d + insertstart, after, asize);
+ memcpy(d + insertstart, a, asize);
moveend = movestart - bsize;
}
}
@@ -2512,8 +2429,7 @@ QByteArray &QByteArray::replace(const char *before, int bsize, const char *after
QByteArray &QByteArray::replace(char before, const QByteArray &after)
{
char b[2] = { before, '\0' };
- QByteArray cb = fromRawData(b, 1);
- return replace(cb, after);
+ return replace(b, 1, after.constData(), after.size());
}
/*! \fn QByteArray &QByteArray::replace(char before, const QString &after)
@@ -2547,9 +2463,9 @@ QByteArray &QByteArray::replace(char before, const QByteArray &after)
QByteArray &QByteArray::replace(char before, char after)
{
- if (d->size) {
+ if (!isEmpty()) {
char *i = data();
- char *e = i + d->size;
+ char *e = i + size();
for (; i != e; ++i)
if (*i == before)
* i = after;
@@ -2590,7 +2506,7 @@ QList<QByteArray> QByteArray::split(char sep) const
*/
QByteArray QByteArray::repeated(int times) const
{
- if (d->size == 0)
+ if (isEmpty())
return *this;
if (times <= 1) {
@@ -2599,27 +2515,27 @@ QByteArray QByteArray::repeated(int times) const
return QByteArray();
}
- const int resultSize = times * d->size;
+ const int resultSize = times * size();
QByteArray result;
result.reserve(resultSize);
- if (result.d->alloc != uint(resultSize) + 1u)
+ if (result.capacity() != resultSize)
return QByteArray(); // not enough memory
- memcpy(result.d->data(), d->data(), d->size);
+ memcpy(result.d.data(), data(), size());
- int sizeSoFar = d->size;
- char *end = result.d->data() + sizeSoFar;
+ int sizeSoFar = size();
+ char *end = result.d.data() + sizeSoFar;
const int halfResultSize = resultSize >> 1;
while (sizeSoFar <= halfResultSize) {
- memcpy(end, result.d->data(), sizeSoFar);
+ memcpy(end, result.d.data(), sizeSoFar);
end += sizeSoFar;
sizeSoFar <<= 1;
}
- memcpy(end, result.d->data(), resultSize - sizeSoFar);
- result.d->data()[resultSize] = '\0';
- result.d->size = resultSize;
+ memcpy(end, result.d.data(), resultSize - sizeSoFar);
+ result.d.data()[resultSize] = '\0';
+ result.d.size = resultSize;
return result;
}
@@ -2641,17 +2557,17 @@ QByteArray QByteArray::repeated(int times) const
int QByteArray::indexOf(const QByteArray &ba, int from) const
{
- const int ol = ba.d->size;
+ const int ol = ba.size();
if (ol == 0)
return from;
if (ol == 1)
- return indexOf(*ba.d->data(), from);
+ return indexOf(ba[0], from);
- const int l = d->size;
- if (from > d->size || ol + from > l)
+ const int l = size();
+ if (from > l || ol + from > l)
return -1;
- return qFindByteArray(d->data(), d->size, from, ba.d->data(), ol);
+ return qFindByteArray(data(), size(), from, ba.data(), ol);
}
/*! \fn int QByteArray::indexOf(const QString &str, int from) const
@@ -2685,13 +2601,13 @@ int QByteArray::indexOf(const char *c, int from) const
if (ol == 1)
return indexOf(*c, from);
- const int l = d->size;
- if (from > d->size || ol + from > l)
+ const int l = size();
+ if (from > l || ol + from > l)
return -1;
if (ol == 0)
return from;
- return qFindByteArray(d->data(), d->size, from, c, ol);
+ return qFindByteArray(data(), size(), from, c, ol);
}
/*!
@@ -2710,13 +2626,13 @@ int QByteArray::indexOf(const char *c, int from) const
int QByteArray::indexOf(char ch, int from) const
{
if (from < 0)
- from = qMax(from + d->size, 0);
- if (from < d->size) {
- const char *n = d->data() + from - 1;
- const char *e = d->data() + d->size;
+ from = qMax(from + size(), 0);
+ if (from < size()) {
+ const char *n = data() + from - 1;
+ const char *e = end();
while (++n != e)
if (*n == ch)
- return n - d->data();
+ return n - data();
}
return -1;
}
@@ -2771,11 +2687,11 @@ static int lastIndexOfHelper(const char *haystack, int l, const char *needle, in
int QByteArray::lastIndexOf(const QByteArray &ba, int from) const
{
- const int ol = ba.d->size;
+ const int ol = ba.size();
if (ol == 1)
- return lastIndexOf(*ba.d->data(), from);
+ return lastIndexOf(ba[0], from);
- return lastIndexOfHelper(d->data(), d->size, ba.d->data(), ol, from);
+ return lastIndexOfHelper(data(), size(), ba.data(), ol, from);
}
/*! \fn int QByteArray::lastIndexOf(const QString &str, int from) const
@@ -2810,7 +2726,7 @@ int QByteArray::lastIndexOf(const char *str, int from) const
if (ol == 1)
return lastIndexOf(*str, from);
- return lastIndexOfHelper(d->data(), d->size, str, ol, from);
+ return lastIndexOfHelper(data(), size(), str, ol, from);
}
/*!
@@ -2830,12 +2746,12 @@ int QByteArray::lastIndexOf(const char *str, int from) const
int QByteArray::lastIndexOf(char ch, int from) const
{
if (from < 0)
- from += d->size;
- else if (from > d->size)
- from = d->size-1;
+ from += size();
+ else if (from > size())
+ from = size()-1;
if (from >= 0) {
- const char *b = d->data();
- const char *n = d->data() + from + 1;
+ const char *b = data();
+ const char *n = b + from + 1;
while (n-- != b)
if (*n == ch)
return n - b;
@@ -2854,7 +2770,7 @@ int QByteArray::count(const QByteArray &ba) const
{
int num = 0;
int i = -1;
- if (d->size > 500 && ba.d->size > 5) {
+ if (size() > 500 && ba.size() > 5) {
QByteArrayMatcher matcher(ba);
while ((i = matcher.indexIn(*this, i + 1)) != -1)
++num;
@@ -2889,8 +2805,8 @@ int QByteArray::count(const char *str) const
int QByteArray::count(char ch) const
{
int num = 0;
- const char *i = d->data() + d->size;
- const char *b = d->data();
+ const char *i = end();
+ const char *b = begin();
while (i != b)
if (*--i == ch)
++num;
@@ -2940,11 +2856,11 @@ int QByteArray::count(char ch) const
*/
bool QByteArray::startsWith(const QByteArray &ba) const
{
- if (d == ba.d || ba.d->size == 0)
- return true;
- if (d->size < ba.d->size)
+ if (size() < ba.size())
return false;
- return memcmp(d->data(), ba.d->data(), ba.d->size) == 0;
+ if (data() == ba.data() || ba.size() == 0)
+ return true;
+ return memcmp(data(), ba.data(), ba.size()) == 0;
}
/*! \overload
@@ -2957,9 +2873,9 @@ bool QByteArray::startsWith(const char *str) const
if (!str || !*str)
return true;
const int len = int(strlen(str));
- if (d->size < len)
+ if (size() < len)
return false;
- return qstrncmp(d->data(), str, len) == 0;
+ return qstrncmp(data(), str, len) == 0;
}
/*! \overload
@@ -2969,9 +2885,9 @@ bool QByteArray::startsWith(const char *str) const
*/
bool QByteArray::startsWith(char ch) const
{
- if (d->size == 0)
+ if (size() == 0)
return false;
- return d->data()[0] == ch;
+ return data()[0] == ch;
}
/*!
@@ -2985,11 +2901,11 @@ bool QByteArray::startsWith(char ch) const
*/
bool QByteArray::endsWith(const QByteArray &ba) const
{
- if (d == ba.d || ba.d->size == 0)
- return true;
- if (d->size < ba.d->size)
+ if (size() < ba.size())
return false;
- return memcmp(d->data() + d->size - ba.d->size, ba.d->data(), ba.d->size) == 0;
+ if (end() == ba.end() || ba.size() == 0)
+ return true;
+ return memcmp(end() - ba.size(), ba.data(), ba.size()) == 0;
}
/*! \overload
@@ -3002,9 +2918,9 @@ bool QByteArray::endsWith(const char *str) const
if (!str || !*str)
return true;
const int len = int(strlen(str));
- if (d->size < len)
+ if (size() < len)
return false;
- return qstrncmp(d->data() + d->size - len, str, len) == 0;
+ return qstrncmp(end() - len, str, len) == 0;
}
/*
@@ -3086,9 +3002,9 @@ bool QByteArray::isLower() const
*/
bool QByteArray::endsWith(char ch) const
{
- if (d->size == 0)
+ if (size() == 0)
return false;
- return d->data()[d->size - 1] == ch;
+ return data()[size() - 1] == ch;
}
/*!
@@ -3106,11 +3022,11 @@ bool QByteArray::endsWith(char ch) const
QByteArray QByteArray::left(int len) const
{
- if (len >= d->size)
+ if (len >= size())
return *this;
if (len < 0)
len = 0;
- return QByteArray(d->data(), len);
+ return QByteArray(data(), len);
}
/*!
@@ -3128,11 +3044,11 @@ QByteArray QByteArray::left(int len) const
QByteArray QByteArray::right(int len) const
{
- if (len >= d->size)
+ if (len >= size())
return *this;
if (len < 0)
len = 0;
- return QByteArray(d->data() + d->size - len, len);
+ return QByteArray(end() - len, len);
}
/*!
@@ -3157,13 +3073,14 @@ QByteArray QByteArray::mid(int pos, int len) const
return QByteArray();
case QContainerImplHelper::Empty:
{
- QByteArrayDataPtr empty = { Data::allocate(0) };
+ auto alloc = Data::allocate(0);
+ QByteArray::DataPointer empty = { alloc.first, alloc.second, 0 };
return QByteArray(empty);
}
case QContainerImplHelper::Full:
return *this;
case QContainerImplHelper::Subset:
- return QByteArray(d->data() + pos, len);
+ return QByteArray(d.data() + pos, len);
}
Q_UNREACHABLE();
return QByteArray();
@@ -3266,9 +3183,7 @@ QByteArray QByteArray::toUpper_helper(QByteArray &a)
void QByteArray::clear()
{
- if (!d->ref.deref())
- Data::deallocate(d);
- d = Data::sharedNull();
+ d.clear();
}
#if !defined(QT_NO_DATASTREAM) || (defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE))
@@ -3745,13 +3660,13 @@ QByteArray QByteArray::trimmed_helper(QByteArray &a)
QByteArray QByteArray::leftJustified(int width, char fill, bool truncate) const
{
QByteArray result;
- int len = d->size;
+ int len = size();
int padlen = width - len;
if (padlen > 0) {
result.resize(len+padlen);
if (len)
- memcpy(result.d->data(), d->data(), len);
- memset(result.d->data()+len, fill, padlen);
+ memcpy(result.d.data(), data(), len);
+ memset(result.d.data()+len, fill, padlen);
} else {
if (truncate)
result = left(width);
@@ -3782,13 +3697,13 @@ QByteArray QByteArray::leftJustified(int width, char fill, bool truncate) const
QByteArray QByteArray::rightJustified(int width, char fill, bool truncate) const
{
QByteArray result;
- int len = d->size;
+ int len = size();
int padlen = width - len;
if (padlen > 0) {
result.resize(len+padlen);
if (len)
- memcpy(result.d->data()+padlen, data(), len);
- memset(result.d->data(), fill, padlen);
+ memcpy(result.d.data()+padlen, data(), len);
+ memset(result.d.data(), fill, padlen);
} else {
if (truncate)
result = left(width);
@@ -3798,7 +3713,10 @@ QByteArray QByteArray::rightJustified(int width, char fill, bool truncate) const
return result;
}
-bool QByteArray::isNull() const { return d == QArrayData::sharedNull(); }
+bool QByteArray::isNull() const
+{
+ return d->isNull();
+}
static qlonglong toIntegral_helper(const char *data, bool *ok, int base, qlonglong)
{
@@ -4105,26 +4023,11 @@ float QByteArray::toFloat(bool *ok) const
}
/*!
- Returns a copy of the byte array, encoded as Base64.
-
- \snippet code/src_corelib_tools_qbytearray.cpp 39
-
- The algorithm used to encode Base64-encoded data is defined in \l{RFC 4648}.
-
- \sa fromBase64()
-*/
-QByteArray QByteArray::toBase64() const
-{
- return toBase64(Base64Encoding);
-}
-
-/*!
\since 5.2
- \overload
Returns a copy of the byte array, encoded using the options \a options.
- \snippet code/src_corelib_tools_qbytearray.cpp 39bis
+ \snippet code/src_corelib_tools_qbytearray.cpp 39
The algorithm used to encode Base64-encoded data is defined in \l{RFC 4648}.
@@ -4140,19 +4043,19 @@ QByteArray QByteArray::toBase64(Base64Options options) const
const char padchar = '=';
int padlen = 0;
- QByteArray tmp((d->size + 2) / 3 * 4, Qt::Uninitialized);
+ QByteArray tmp((size() + 2) / 3 * 4, Qt::Uninitialized);
int i = 0;
char *out = tmp.data();
- while (i < d->size) {
+ while (i < size()) {
// encode 3 bytes at a time
int chunk = 0;
- chunk |= int(uchar(d->data()[i++])) << 16;
- if (i == d->size) {
+ chunk |= int(uchar(data()[i++])) << 16;
+ if (i == size()) {
padlen = 2;
} else {
- chunk |= int(uchar(d->data()[i++])) << 8;
- if (i == d->size)
+ chunk |= int(uchar(data()[i++])) << 8;
+ if (i == size())
padlen = 1;
else
chunk |= int(uchar(data()[i++]));
@@ -4482,17 +4385,14 @@ QByteArray QByteArray::number(double n, char f, int prec)
QByteArray QByteArray::fromRawData(const char *data, int size)
{
- Data *x;
+ QByteArray::DataPointer x;
if (!data) {
- x = Data::sharedNull();
} else if (!size) {
- x = Data::allocate(0);
+ x = DataPointer(Data::allocate(0), 0);
} else {
x = Data::fromRawData(data, size);
- Q_CHECK_PTR(x);
}
- QByteArrayDataPtr dataPtr = { x };
- return QByteArray(dataPtr);
+ return QByteArray(x);
}
/*!
@@ -4511,17 +4411,15 @@ QByteArray QByteArray::fromRawData(const char *data, int size)
*/
QByteArray &QByteArray::setRawData(const char *data, uint size)
{
- if (d->ref.isShared() || d->alloc) {
- *this = fromRawData(data, size);
- } else {
- if (data) {
- d->size = size;
- d->offset = data - reinterpret_cast<char *>(d);
- } else {
- d->offset = sizeof(QByteArrayData);
- d->size = 0;
- }
+ if (!data || !size) {
+ clear();
}
+// else if (d->isShared() || (d->flags() & Data::RawDataType) == 0) {
+ *this = fromRawData(data, size);
+// } else {
+// d.size = size;
+// d.data() = const_cast<char *>(data);
+// }
return *this;
}
@@ -4657,32 +4555,7 @@ QByteArray::FromBase64Result QByteArray::fromBase64Encoding(const QByteArray &ba
}
/*!
- \overload
-
- Returns a decoded copy of the Base64 array \a base64. Input is not checked
- for validity; invalid characters in the input are skipped, enabling the
- decoding process to continue with subsequent characters.
-
- For example:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 44
-
- The algorithm used to decode Base64-encoded data is defined in \l{RFC 4648}.
-
- \note The fromBase64Encoding() function is recommended in new code.
-
- \sa toBase64(), fromBase64Encoding()
-*/
-QByteArray QByteArray::fromBase64(const QByteArray &base64)
-{
- if (auto result = fromBase64Encoding(base64, Base64Encoding))
- return std::move(result.decoded);
- return QByteArray();
-}
-
-/*!
\since 5.2
- \overload
Returns a decoded copy of the Base64 array \a base64, using the options
defined by \a options. If \a options contains \c{IgnoreBase64DecodingErrors}
@@ -4694,7 +4567,7 @@ QByteArray QByteArray::fromBase64(const QByteArray &base64)
For example:
- \snippet code/src_corelib_tools_qbytearray.cpp 44bis
+ \snippet code/src_corelib_tools_qbytearray.cpp 44
The algorithm used to decode Base64-encoded data is defined in \l{RFC 4648}.
@@ -4748,21 +4621,7 @@ QByteArray QByteArray::fromHex(const QByteArray &hexEncoded)
return res;
}
-/*!
- Returns a hex encoded copy of the byte array. The hex encoding uses the numbers 0-9 and
- the letters a-f.
-
- \sa fromHex()
-*/
-QByteArray QByteArray::toHex() const
-{
- return toHex('\0');
-}
-
-/*! \overload
- \since 5.9
-
- Returns a hex encoded copy of the byte array. The hex encoding uses the numbers 0-9 and
+/*! Returns a hex encoded copy of the byte array. The hex encoding uses the numbers 0-9 and
the letters a-f.
If \a separator is not '\0', the separator character is inserted between the hex bytes.
@@ -4770,18 +4629,19 @@ QByteArray QByteArray::toHex() const
Example:
\snippet code/src_corelib_tools_qbytearray.cpp 50
+ \since 5.9
\sa fromHex()
*/
QByteArray QByteArray::toHex(char separator) const
{
- if (!d->size)
+ if (isEmpty())
return QByteArray();
- const int length = separator ? (d->size * 3 - 1) : (d->size * 2);
+ const int length = separator ? (size() * 3 - 1) : (size() * 2);
QByteArray hex(length, Qt::Uninitialized);
char *hexData = hex.data();
- const uchar *data = (const uchar *)d->data();
- for (int i = 0, o = 0; i < d->size; ++i) {
+ const uchar *data = (const uchar *)this->data();
+ for (int i = 0, o = 0; i < size(); ++i) {
hexData[o++] = QtMiscUtils::toHexLower(data[i] >> 4);
hexData[o++] = QtMiscUtils::toHexLower(data[i] & 0xf);
@@ -5093,42 +4953,6 @@ QByteArray QByteArray::toPercentEncoding(const QByteArray &exclude, const QByteA
\sa QStringLiteral
*/
-namespace QtPrivate {
-namespace DeprecatedRefClassBehavior {
-void warn(WarningType w, EmittingClass c)
-{
- static const char deprecatedBehaviorString[] =
- "The corresponding behavior is deprecated, and will be changed"
- " in a future version of Qt.";
-
- const char *emittingClassName = nullptr;
- const char *containerClassName = nullptr;
-
- switch (c) {
- case EmittingClass::QByteRef:
- emittingClassName = "QByteRef";
- containerClassName = "QByteArray";
- break;
- case EmittingClass::QCharRef:
- emittingClassName = "QCharRef";
- containerClassName = "QString";
- break;
- }
-
- switch (w) {
- case WarningType::OutOfRange:
- qWarning("Using %s with an index pointing outside the valid range of a %s. %s",
- emittingClassName, containerClassName, deprecatedBehaviorString);
- break;
- case WarningType::DelayedDetach:
- qWarning("Using %s with on a %s that is not already detached. %s",
- emittingClassName, containerClassName, deprecatedBehaviorString);
- break;
- }
-}
-} // namespace DeprecatedRefClassBehavior
-} // namespace QtPrivate
-
/*!
\class QByteArray::FromBase64Result
\inmodule QtCore
@@ -5204,7 +5028,7 @@ void warn(WarningType w, EmittingClass c)
Returns the hash value for \a key, using
\a seed to seed the calculation.
*/
-uint qHash(const QByteArray::FromBase64Result &key, uint seed) noexcept
+size_t qHash(const QByteArray::FromBase64Result &key, size_t seed) noexcept
{
QtPrivate::QHashCombine hash;
seed = hash(seed, key.decoded);
diff --git a/src/corelib/text/qbytearray.h b/src/corelib/text/qbytearray.h
index e3bb9ea937..55d4c87e92 100644
--- a/src/corelib/text/qbytearray.h
+++ b/src/corelib/text/qbytearray.h
@@ -44,6 +44,8 @@
#include <QtCore/qrefcount.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qarraydata.h>
+#include <QtCore/qarraydatapointer.h>
+#include <QtCore/qcontainerfwd.h>
#include <stdlib.h>
#include <string.h>
@@ -106,48 +108,23 @@ Q_CORE_EXPORT int qvsnprintf(char *str, size_t n, const char *fmt, va_list ap);
Q_CORE_EXPORT int qsnprintf(char *str, size_t n, const char *fmt, ...);
// qChecksum: Internet checksum
-Q_CORE_EXPORT quint16 qChecksum(const char *s, uint len); // ### Qt 6: Remove
-Q_CORE_EXPORT quint16 qChecksum(const char *s, uint len, Qt::ChecksumType standard); // ### Qt 6: Use Qt::ChecksumType standard = Qt::ChecksumIso3309
+Q_CORE_EXPORT quint16 qChecksum(const char *s, uint len,
+ Qt::ChecksumType standard = Qt::ChecksumIso3309);
-class QByteRef;
class QString;
class QDataStream;
-template <typename T> class QList;
-typedef QArrayData QByteArrayData;
-
-template<int N> struct QStaticByteArrayData
-{
- QByteArrayData ba;
- char data[N + 1];
-
- QByteArrayData *data_ptr() const
- {
- Q_ASSERT(ba.ref.isStatic());
- return const_cast<QByteArrayData *>(&ba);
- }
-};
-
-struct QByteArrayDataPtr
-{
- QByteArrayData *ptr;
-};
-
-#define Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset) \
- Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset)
- /**/
-
-#define Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER(size) \
- Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, sizeof(QByteArrayData)) \
- /**/
+using QByteArrayData = QArrayDataPointer<char>;
# define QByteArrayLiteral(str) \
([]() -> QByteArray { \
enum { Size = sizeof(str) - 1 }; \
- static const QStaticByteArrayData<Size> qbytearray_literal = { \
- Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER(Size), \
- str }; \
- QByteArrayDataPtr holder = { qbytearray_literal.data_ptr() }; \
+ static const QArrayData qbytearray_literal = { \
+ Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }; \
+ QByteArrayData holder = { \
+ static_cast<QTypedArrayData<char> *>(const_cast<QArrayData *>(&qbytearray_literal)), \
+ const_cast<char *>(str), \
+ Size }; \
const QByteArray ba(holder); \
return ba; \
}()) \
@@ -155,10 +132,14 @@ struct QByteArrayDataPtr
class Q_CORE_EXPORT QByteArray
{
+public:
+ using DataPointer = QByteArrayData;
private:
typedef QTypedArrayData<char> Data;
+ DataPointer d;
public:
+
enum Base64Option {
Base64Encoding = 0,
Base64UrlEncoding = 1,
@@ -187,14 +168,13 @@ public:
QByteArray &operator=(const QByteArray &) noexcept;
QByteArray &operator=(const char *str);
- inline QByteArray(QByteArray && other) noexcept : d(other.d) { other.d = Data::sharedNull(); }
+ inline QByteArray(QByteArray && other) noexcept
+ { qSwap(d, other.d); }
inline QByteArray &operator=(QByteArray &&other) noexcept
{ qSwap(d, other.d); return *this; }
-
inline void swap(QByteArray &other) noexcept
{ qSwap(d, other.d); }
- inline int size() const;
inline bool isEmpty() const;
void resize(int size);
@@ -213,18 +193,17 @@ public:
inline const char *constData() const;
inline void detach();
inline bool isDetached() const;
- inline bool isSharedWith(const QByteArray &other) const { return d == other.d; }
+ inline bool isSharedWith(const QByteArray &other) const
+ { return data() == other.data() && size() == other.size(); }
void clear();
inline char at(int i) const;
inline char operator[](int i) const;
- inline char operator[](uint i) const;
- Q_REQUIRED_RESULT inline QByteRef operator[](int i);
- Q_REQUIRED_RESULT inline QByteRef operator[](uint i);
+ Q_REQUIRED_RESULT inline char &operator[](int i);
Q_REQUIRED_RESULT char front() const { return at(0); }
- Q_REQUIRED_RESULT inline QByteRef front();
+ Q_REQUIRED_RESULT inline char &front();
Q_REQUIRED_RESULT char back() const { return at(size() - 1); }
- Q_REQUIRED_RESULT inline QByteRef back();
+ Q_REQUIRED_RESULT inline char &back();
int indexOf(char c, int from = 0) const;
int indexOf(const char *c, int from = 0) const;
@@ -365,10 +344,8 @@ public:
qulonglong toULongLong(bool *ok = nullptr, int base = 10) const;
float toFloat(bool *ok = nullptr) const;
double toDouble(bool *ok = nullptr) const;
- QByteArray toBase64(Base64Options options) const;
- QByteArray toBase64() const; // ### Qt6 merge with previous
- QByteArray toHex() const;
- QByteArray toHex(char separator) const; // ### Qt6 merge with previous
+ QByteArray toBase64(Base64Options options = Base64Encoding) const;
+ QByteArray toHex(char separator = '\0') const;
QByteArray toPercentEncoding(const QByteArray &exclude = QByteArray(),
const QByteArray &include = QByteArray(),
char percent = '%') const;
@@ -393,8 +370,7 @@ public:
class FromBase64Result;
Q_REQUIRED_RESULT static FromBase64Result fromBase64Encoding(QByteArray &&base64, Base64Options options = Base64Encoding);
Q_REQUIRED_RESULT static FromBase64Result fromBase64Encoding(const QByteArray &base64, Base64Options options = Base64Encoding);
- Q_REQUIRED_RESULT static QByteArray fromBase64(const QByteArray &base64, Base64Options options);
- Q_REQUIRED_RESULT static QByteArray fromBase64(const QByteArray &base64); // ### Qt6 merge with previous
+ Q_REQUIRED_RESULT static QByteArray fromBase64(const QByteArray &base64, Base64Options options = Base64Encoding);
Q_REQUIRED_RESULT static QByteArray fromHex(const QByteArray &hexEncoded);
Q_REQUIRED_RESULT static QByteArray fromPercentEncoding(const QByteArray &pctEncoded, char percent = '%');
@@ -449,19 +425,20 @@ public:
static inline QByteArray fromStdString(const std::string &s);
inline std::string toStdString() const;
- inline int count() const { return d->size; }
- int length() const { return d->size; }
+ inline int size() const { return d->size; }
+ inline int count() const { return size(); }
+ inline int length() const { return size(); }
bool isNull() const;
- inline QByteArray(QByteArrayDataPtr dd)
- : d(static_cast<Data *>(dd.ptr))
+ inline DataPointer &data_ptr() { return d; }
+ explicit inline QByteArray(const DataPointer &dd)
+ : d(dd)
{
}
private:
operator QNoImplicitBoolCast() const;
- Data *d;
- void reallocData(uint alloc, Data::AllocationOptions options);
+ void reallocData(uint alloc, Data::ArrayOptions options);
void expand(int i);
QByteArray nulTerminated() const;
@@ -474,171 +451,86 @@ private:
static QByteArray simplified_helper(const QByteArray &a);
static QByteArray simplified_helper(QByteArray &a);
- friend class QByteRef;
friend class QString;
friend Q_CORE_EXPORT QByteArray qUncompress(const uchar *data, int nbytes);
-public:
- typedef Data * DataPtr;
- inline DataPtr &data_ptr() { return d; }
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QByteArray::Base64Options)
-inline QByteArray::QByteArray() noexcept : d(Data::sharedNull()) { }
-inline QByteArray::~QByteArray() { if (!d->ref.deref()) Data::deallocate(d); }
-inline int QByteArray::size() const
-{ return d->size; }
+inline QByteArray::QByteArray() noexcept {}
+inline QByteArray::~QByteArray() {}
inline char QByteArray::at(int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return d->data()[i]; }
+{ Q_ASSERT(uint(i) < uint(size())); return d.data()[i]; }
inline char QByteArray::operator[](int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return d->data()[i]; }
-inline char QByteArray::operator[](uint i) const
-{ Q_ASSERT(i < uint(size())); return d->data()[i]; }
+{ Q_ASSERT(uint(i) < uint(size())); return d.data()[i]; }
inline bool QByteArray::isEmpty() const
-{ return d->size == 0; }
+{ return size() == 0; }
#ifndef QT_NO_CAST_FROM_BYTEARRAY
inline QByteArray::operator const char *() const
-{ return d->data(); }
+{ return data(); }
inline QByteArray::operator const void *() const
-{ return d->data(); }
+{ return data(); }
#endif
inline char *QByteArray::data()
-{ detach(); return d->data(); }
+{ detach(); return d.data(); }
inline const char *QByteArray::data() const
-{ return d->data(); }
+{ return d.data(); }
inline const char *QByteArray::constData() const
-{ return d->data(); }
+{ return d.data(); }
inline void QByteArray::detach()
-{ if (d->ref.isShared() || (d->offset != sizeof(QByteArrayData))) reallocData(uint(d->size) + 1u, d->detachFlags()); }
+{ if (d->needsDetach()) reallocData(uint(size()) + 1u, d->detachFlags()); }
inline bool QByteArray::isDetached() const
-{ return !d->ref.isShared(); }
+{ return !d->isShared(); }
inline QByteArray::QByteArray(const QByteArray &a) noexcept : d(a.d)
-{ d->ref.ref(); }
+{}
inline int QByteArray::capacity() const
-{ return d->alloc ? d->alloc - 1 : 0; }
+{ const auto realCapacity = d->constAllocatedCapacity(); return realCapacity ? int(realCapacity) - 1 : 0; }
inline void QByteArray::reserve(int asize)
{
- if (d->ref.isShared() || uint(asize) + 1u > d->alloc) {
+ if (d->needsDetach() || asize > capacity()) {
reallocData(qMax(uint(size()), uint(asize)) + 1u, d->detachFlags() | Data::CapacityReserved);
} else {
- // cannot set unconditionally, since d could be the shared_null or
- // otherwise static
- d->capacityReserved = true;
+ d->flags() |= Data::CapacityReserved;
}
}
inline void QByteArray::squeeze()
{
- if (d->ref.isShared() || uint(d->size) + 1u < d->alloc) {
- reallocData(uint(d->size) + 1u, d->detachFlags() & ~Data::CapacityReserved);
+ if ((d->flags() & Data::CapacityReserved) == 0)
+ return;
+ if (d->needsDetach() || size() < capacity()) {
+ reallocData(uint(size()) + 1u, d->detachFlags() & ~Data::CapacityReserved);
} else {
- // cannot set unconditionally, since d could be shared_null or
- // otherwise static.
- d->capacityReserved = false;
+ d->flags() &= uint(~Data::CapacityReserved);
}
}
-namespace QtPrivate {
-namespace DeprecatedRefClassBehavior {
- enum class EmittingClass {
- QByteRef,
- QCharRef,
- };
-
- enum class WarningType {
- OutOfRange,
- DelayedDetach,
- };
-
- Q_CORE_EXPORT Q_DECL_COLD_FUNCTION void warn(WarningType w, EmittingClass c);
-} // namespace DeprecatedAssignmentOperatorBehavior
-} // namespace QtPrivate
-
-class
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-Q_CORE_EXPORT
-#endif
-QByteRef { // ### Qt 7: remove
- QByteArray &a;
- int i;
- inline QByteRef(QByteArray &array, int idx)
- : a(array),i(idx) {}
- friend class QByteArray;
-public:
- inline operator char() const
- {
- using namespace QtPrivate::DeprecatedRefClassBehavior;
- if (Q_LIKELY(i < a.d->size))
- return a.d->data()[i];
-#ifdef QT_DEBUG
- warn(WarningType::OutOfRange, EmittingClass::QByteRef);
-#endif
- return char(0);
- }
- inline QByteRef &operator=(char c)
- {
- using namespace QtPrivate::DeprecatedRefClassBehavior;
- if (Q_UNLIKELY(i >= a.d->size)) {
-#ifdef QT_DEBUG
- warn(WarningType::OutOfRange, EmittingClass::QByteRef);
-#endif
- a.expand(i);
- } else {
-#ifdef QT_DEBUG
- if (Q_UNLIKELY(!a.isDetached()))
- warn(WarningType::DelayedDetach, EmittingClass::QByteRef);
-#endif
- a.detach();
- }
- a.d->data()[i] = c;
- return *this;
- }
- inline QByteRef &operator=(const QByteRef &c)
- {
- return operator=(char(c));
- }
- inline bool operator==(char c) const
- { return a.d->data()[i] == c; }
- inline bool operator!=(char c) const
- { return a.d->data()[i] != c; }
- inline bool operator>(char c) const
- { return a.d->data()[i] > c; }
- inline bool operator>=(char c) const
- { return a.d->data()[i] >= c; }
- inline bool operator<(char c) const
- { return a.d->data()[i] < c; }
- inline bool operator<=(char c) const
- { return a.d->data()[i] <= c; }
-};
-
-inline QByteRef QByteArray::operator[](int i)
-{ Q_ASSERT(i >= 0); detach(); return QByteRef(*this, i); }
-inline QByteRef QByteArray::operator[](uint i)
-{ detach(); return QByteRef(*this, i); }
-inline QByteRef QByteArray::front() { return operator[](0); }
-inline QByteRef QByteArray::back() { return operator[](size() - 1); }
+inline char &QByteArray::operator[](int i)
+{ Q_ASSERT(i >= 0 && i < size()); return data()[i]; }
+inline char &QByteArray::front() { return operator[](0); }
+inline char &QByteArray::back() { return operator[](size() - 1); }
inline QByteArray::iterator QByteArray::begin()
-{ detach(); return d->data(); }
+{ return data(); }
inline QByteArray::const_iterator QByteArray::begin() const
-{ return d->data(); }
+{ return data(); }
inline QByteArray::const_iterator QByteArray::cbegin() const
-{ return d->data(); }
+{ return data(); }
inline QByteArray::const_iterator QByteArray::constBegin() const
-{ return d->data(); }
+{ return data(); }
inline QByteArray::iterator QByteArray::end()
-{ detach(); return d->data() + d->size; }
+{ return data() + size(); }
inline QByteArray::const_iterator QByteArray::end() const
-{ return d->data() + d->size; }
+{ return data() + size(); }
inline QByteArray::const_iterator QByteArray::cend() const
-{ return d->data() + d->size; }
+{ return data() + size(); }
inline QByteArray::const_iterator QByteArray::constEnd() const
-{ return d->data() + d->size; }
+{ return data() + size(); }
inline QByteArray &QByteArray::append(int n, char ch)
-{ return insert(d->size, n, ch); }
+{ return insert(size(), n, ch); }
inline QByteArray &QByteArray::prepend(int n, char ch)
{ return insert(0, n, ch); }
inline QByteArray &QByteArray::operator+=(char c)
@@ -805,7 +697,7 @@ inline bool operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray
return !operator==(lhs, rhs);
}
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QByteArray::FromBase64Result &key, uint seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QByteArray::FromBase64Result &key, size_t seed = 0) noexcept;
QT_END_NAMESPACE
diff --git a/src/corelib/text/qbytearray_p.h b/src/corelib/text/qbytearray_p.h
index ffec6dca22..90552cb442 100644
--- a/src/corelib/text/qbytearray_p.h
+++ b/src/corelib/text/qbytearray_p.h
@@ -57,8 +57,8 @@
QT_BEGIN_NAMESPACE
// -1 because of the terminating NUL
-constexpr qsizetype MaxByteArraySize = MaxAllocSize - sizeof(std::remove_pointer<QByteArray::DataPtr>::type) - 1;
-constexpr qsizetype MaxStringSize = (MaxAllocSize - sizeof(std::remove_pointer<QByteArray::DataPtr>::type)) / 2 - 1;
+constexpr qsizetype MaxByteArraySize = MaxAllocSize - sizeof(std::remove_pointer<QByteArray::DataPointer>::type) - 1;
+constexpr qsizetype MaxStringSize = (MaxAllocSize - sizeof(std::remove_pointer<QByteArray::DataPointer>::type)) / 2 - 1;
QT_END_NAMESPACE
diff --git a/src/corelib/text/qbytearraylist.h b/src/corelib/text/qbytearraylist.h
index 0250b649b8..d02fa6d20f 100644
--- a/src/corelib/text/qbytearraylist.h
+++ b/src/corelib/text/qbytearraylist.h
@@ -39,7 +39,7 @@
**
****************************************************************************/
-#include <QtCore/qlist.h>
+#include <QtCore/qvector.h>
#ifndef QBYTEARRAYLIST_H
#define QBYTEARRAYLIST_H
@@ -49,12 +49,12 @@
QT_BEGIN_NAMESPACE
#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
-typedef QListIterator<QByteArray> QByteArrayListIterator;
-typedef QMutableListIterator<QByteArray> QMutableByteArrayListIterator;
+typedef QVectorIterator<QByteArray> QByteArrayListIterator;
+typedef QMutableVectorIterator<QByteArray> QMutableByteArrayListIterator;
#endif
#ifndef Q_CLANG_QDOC
-typedef QList<QByteArray> QByteArrayList;
+typedef QVector<QByteArray> QByteArrayList;
namespace QtPrivate {
QByteArray Q_CORE_EXPORT QByteArrayList_join(const QByteArrayList *that, const char *separator, int separatorLength);
@@ -63,14 +63,14 @@ namespace QtPrivate {
#endif
#ifdef Q_CLANG_QDOC
-class QByteArrayList : public QList<QByteArray>
+class QByteArrayList : public QVector<QByteArray>
#else
-template <> struct QListSpecialMethods<QByteArray>
+template <> struct QVectorSpecialMethods<QByteArray>
#endif
{
#ifndef Q_CLANG_QDOC
protected:
- ~QListSpecialMethods() = default;
+ ~QVectorSpecialMethods() = default;
#endif
public:
inline QByteArray join() const
@@ -80,11 +80,8 @@ public:
inline QByteArray join(char sep) const
{ return QtPrivate::QByteArrayList_join(self(), &sep, 1); }
- inline int indexOf(const char *needle, int from = 0) const
- { return QtPrivate::QByteArrayList_indexOf(self(), needle, from); }
-
private:
- typedef QList<QByteArray> Self;
+ typedef QVector<QByteArray> Self;
Self *self() { return static_cast<Self *>(this); }
const Self *self() const { return static_cast<const Self *>(this); }
};
diff --git a/src/corelib/text/qbytearraymatcher.h b/src/corelib/text/qbytearraymatcher.h
index 0eedfc1d20..7cc5037095 100644
--- a/src/corelib/text/qbytearraymatcher.h
+++ b/src/corelib/text/qbytearraymatcher.h
@@ -85,7 +85,7 @@ private:
class QStaticByteArrayMatcherBase
{
- Q_DECL_ALIGN(16)
+ alignas(16)
struct Skiptable {
uchar data[256];
} m_skiptable;
diff --git a/src/corelib/text/qchar.h b/src/corelib/text/qchar.h
index 5cb991ca06..5a5a557a71 100644
--- a/src/corelib/text/qchar.h
+++ b/src/corelib/text/qchar.h
@@ -446,7 +446,6 @@ public:
Unicode_12_1,
Unicode_13_0
};
- // ****** WHEN ADDING FUNCTIONS, CONSIDER ADDING TO QCharRef TOO
inline Category category() const noexcept { return QChar::category(ucs); }
inline Direction direction() const noexcept { return QChar::direction(ucs); }
diff --git a/src/corelib/text/qharfbuzz.cpp b/src/corelib/text/qharfbuzz.cpp
deleted file mode 100644
index f54ce26206..0000000000
--- a/src/corelib/text/qharfbuzz.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qharfbuzz_p.h"
-
-#include "qunicodetables_p.h"
-#if QT_CONFIG(library)
-#include "qlibrary.h"
-#endif
-
-QT_USE_NAMESPACE
-
-extern "C" {
-
-void HB_GetUnicodeCharProperties(HB_UChar32 ch, HB_CharCategory *category, int *combiningClass)
-{
- const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ch);
- *category = (HB_CharCategory)prop->category;
- *combiningClass = prop->combiningClass;
-}
-
-HB_CharCategory HB_GetUnicodeCharCategory(HB_UChar32 ch)
-{
- return (HB_CharCategory)QChar::category(ch);
-}
-
-int HB_GetUnicodeCharCombiningClass(HB_UChar32 ch)
-{
- return QChar::combiningClass(ch);
-}
-
-HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch)
-{
- return QChar::mirroredChar(ch);
-}
-
-void (*HB_Library_Resolve(const char *library, int version, const char *symbol))()
-{
-#if !QT_CONFIG(library) || defined(Q_OS_WASM)
- Q_UNUSED(library);
- Q_UNUSED(version);
- Q_UNUSED(symbol);
- return 0;
-#else
- return QLibrary::resolve(QLatin1String(library), version, symbol);
-#endif
-}
-
-} // extern "C"
-
-QT_BEGIN_NAMESPACE
-
-HB_Bool qShapeItem(HB_ShaperItem *item)
-{
- return HB_ShapeItem(item);
-}
-
-HB_Face qHBNewFace(void *font, HB_GetFontTableFunc tableFunc)
-{
- return HB_AllocFace(font, tableFunc);
-}
-
-HB_Face qHBLoadFace(HB_Face face)
-{
- return HB_LoadFace(face);
-}
-
-void qHBFreeFace(HB_Face face)
-{
- HB_FreeFace(face);
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/text/qharfbuzz_p.h b/src/corelib/text/qharfbuzz_p.h
deleted file mode 100644
index 2a0307d35f..0000000000
--- a/src/corelib/text/qharfbuzz_p.h
+++ /dev/null
@@ -1,357 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-
-#ifndef QHARFBUZZ_P_H
-#define QHARFBUZZ_P_H
-
-#include <QtCore/qchar.h>
-
-#if defined(QT_BUILD_CORE_LIB)
-# include <harfbuzz-shaper.h>
-#else
-// a minimal set of HB types required for Qt libs other than Core
-extern "C" {
-
-typedef enum {
- /* no error */
- HB_Err_Ok = 0x0000,
- HB_Err_Not_Covered = 0xFFFF,
-
- /* _hb_err() is called whenever returning the following errors,
- * and in a couple places for HB_Err_Not_Covered too. */
-
- /* programmer error */
- HB_Err_Invalid_Argument = 0x1A66,
-
- /* font error */
- HB_Err_Invalid_SubTable_Format = 0x157F,
- HB_Err_Invalid_SubTable = 0x1570,
- HB_Err_Read_Error = 0x6EAD,
-
- /* system error */
- HB_Err_Out_Of_Memory = 0xDEAD
-} HB_Error;
-
-typedef QT_PREPEND_NAMESPACE(qint8) hb_int8;
-typedef QT_PREPEND_NAMESPACE(quint8) hb_uint8;
-typedef QT_PREPEND_NAMESPACE(qint16) hb_int16;
-typedef QT_PREPEND_NAMESPACE(quint16) hb_uint16;
-typedef QT_PREPEND_NAMESPACE(qint32) hb_int32;
-typedef QT_PREPEND_NAMESPACE(quint32) hb_uint32;
-
-typedef hb_uint8 HB_Bool;
-typedef hb_uint8 HB_Byte;
-typedef hb_uint16 HB_UShort;
-typedef hb_uint32 HB_UInt;
-typedef hb_int8 HB_Char;
-typedef hb_int16 HB_Short;
-typedef hb_int32 HB_Int;
-typedef hb_uint16 HB_UChar16;
-typedef hb_uint32 HB_UChar32;
-typedef hb_uint32 HB_Glyph;
-typedef hb_int32 HB_Fixed; /* 26.6 */
-typedef hb_int32 HB_16Dot16; /* 16.16 */
-typedef hb_uint32 HB_Tag;
-
-typedef struct {
- HB_Fixed x;
- HB_Fixed y;
-} HB_FixedPoint;
-
-typedef enum {
- HB_Script_Common,
- HB_Script_Greek,
- HB_Script_Cyrillic,
- HB_Script_Armenian,
- HB_Script_Hebrew,
- HB_Script_Arabic,
- HB_Script_Syriac,
- HB_Script_Thaana,
- HB_Script_Devanagari,
- HB_Script_Bengali,
- HB_Script_Gurmukhi,
- HB_Script_Gujarati,
- HB_Script_Oriya,
- HB_Script_Tamil,
- HB_Script_Telugu,
- HB_Script_Kannada,
- HB_Script_Malayalam,
- HB_Script_Sinhala,
- HB_Script_Thai,
- HB_Script_Lao,
- HB_Script_Tibetan,
- HB_Script_Myanmar,
- HB_Script_Georgian,
- HB_Script_Hangul,
- HB_Script_Ogham,
- HB_Script_Runic,
- HB_Script_Khmer,
- HB_Script_Nko,
- HB_Script_Inherited,
- HB_ScriptCount = HB_Script_Inherited
-} HB_Script;
-
-#ifdef __xlC__
-typedef unsigned hb_bitfield;
-#else
-typedef hb_uint8 hb_bitfield;
-#endif
-
-typedef struct {
- hb_bitfield justification :4; /* Justification class */
- hb_bitfield clusterStart :1; /* First glyph of representation of cluster */
- hb_bitfield mark :1; /* needs to be positioned around base char */
- hb_bitfield zeroWidth :1; /* ZWJ, ZWNJ etc, with no width */
- hb_bitfield dontPrint :1;
- hb_bitfield combiningClass :8;
-} HB_GlyphAttributes;
-
-typedef void * HB_GDEF;
-typedef void * HB_GSUB;
-typedef void * HB_GPOS;
-typedef void * HB_Buffer;
-
-typedef HB_Error (*HB_GetFontTableFunc)(void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length);
-
-typedef struct HB_FaceRec_ {
- HB_Bool isSymbolFont;
-
- HB_GDEF gdef;
- HB_GSUB gsub;
- HB_GPOS gpos;
- HB_Bool supported_scripts[HB_ScriptCount];
- HB_Buffer buffer;
- HB_Script current_script;
- int current_flags; /* HB_ShaperFlags */
- HB_Bool has_opentype_kerning;
- HB_Bool glyphs_substituted;
- HB_GlyphAttributes *tmpAttributes;
- unsigned int *tmpLogClusters;
- int length;
- int orig_nglyphs;
- void *font_for_init;
- HB_GetFontTableFunc get_font_table_func;
-} HB_FaceRec;
-
-typedef struct {
- HB_Fixed x, y;
- HB_Fixed width, height;
- HB_Fixed xOffset, yOffset;
-} HB_GlyphMetrics;
-
-typedef enum {
- HB_FontAscent
-} HB_FontMetric;
-
-struct HB_Font_;
-typedef struct HB_Font_ *HB_Font;
-typedef struct HB_FaceRec_ *HB_Face;
-
-typedef struct {
- HB_Bool (*convertStringToGlyphIndices)(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool rightToLeft);
- void (*getGlyphAdvances)(HB_Font font, const HB_Glyph *glyphs, hb_uint32 numGlyphs, HB_Fixed *advances, int flags /*HB_ShaperFlag*/);
- HB_Bool (*canRender)(HB_Font font, const HB_UChar16 *string, hb_uint32 length);
- /* implementation needs to make sure to load a scaled glyph, so /no/ FT_LOAD_NO_SCALE */
- HB_Error (*getPointInOutline)(HB_Font font, HB_Glyph glyph, int flags /*HB_ShaperFlag*/, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints);
- void (*getGlyphMetrics)(HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *metrics);
- HB_Fixed (*getFontMetric)(HB_Font font, HB_FontMetric metric);
-} HB_FontClass;
-
-typedef struct HB_Font_ {
- const HB_FontClass *klass;
-
- /* Metrics */
- HB_UShort x_ppem, y_ppem;
- HB_16Dot16 x_scale, y_scale;
-
- void *userData;
-} HB_FontRec;
-
-typedef enum {
- HB_LeftToRight = 0,
- HB_RightToLeft = 1
-} HB_StringToGlyphsFlags;
-
-typedef enum {
- HB_ShaperFlag_Default = 0,
- HB_ShaperFlag_NoKerning = 1,
- HB_ShaperFlag_UseDesignMetrics = 2
-} HB_ShaperFlag;
-
-typedef struct
-{
- hb_uint32 pos;
- hb_uint32 length;
- HB_Script script;
- hb_uint8 bidiLevel;
-} HB_ScriptItem;
-
-typedef struct HB_ShaperItem_ HB_ShaperItem;
-
-struct HB_ShaperItem_ {
- const HB_UChar16 *string; /* input: the Unicode UTF16 text to be shaped */
- hb_uint32 stringLength; /* input: the length of the input in 16-bit words */
- HB_ScriptItem item; /* input: the current run to be shaped: a run of text all in the same script that is a substring of <string> */
- HB_Font font; /* input: the font: scale, units and function pointers supplying glyph indices and metrics */
- HB_Face face; /* input: the shaper state; current script, access to the OpenType tables , etc. */
- int shaperFlags; /* input (unused) should be set to 0; intended to support flags defined in HB_ShaperFlag */
- HB_Bool glyphIndicesPresent; /* input: true if the <glyphs> array contains glyph indices ready to be shaped */
- hb_uint32 initialGlyphCount; /* input: if glyphIndicesPresent is true, the number of glyph indices in the <glyphs> array */
-
- hb_uint32 num_glyphs; /* input: capacity of output arrays <glyphs>, <attributes>, <advances>, <offsets>, and <log_clusters>; */
- /* output: required capacity (may be larger than actual capacity) */
-
- HB_Glyph *glyphs; /* output: <num_glyphs> indices of shaped glyphs */
- HB_GlyphAttributes *attributes; /* output: <num_glyphs> glyph attributes */
- HB_Fixed *advances; /* output: <num_glyphs> advances */
- HB_FixedPoint *offsets; /* output: <num_glyphs> offsets */
- unsigned short *log_clusters; /* output: for each output glyph, the index in the input of the start of its logical cluster */
-
- /* internal */
- HB_Bool kerning_applied; /* output: true if kerning was applied by the shaper */
-};
-
-}
-
-#endif // QT_BUILD_CORE_LIB
-
-
-QT_BEGIN_NAMESPACE
-
-static inline HB_Script script_to_hbscript(uchar script)
-{
- switch (script) {
- case QChar::Script_Inherited: return HB_Script_Inherited;
- case QChar::Script_Common: return HB_Script_Common;
- case QChar::Script_Arabic: return HB_Script_Arabic;
- case QChar::Script_Armenian: return HB_Script_Armenian;
- case QChar::Script_Bengali: return HB_Script_Bengali;
- case QChar::Script_Cyrillic: return HB_Script_Cyrillic;
- case QChar::Script_Devanagari: return HB_Script_Devanagari;
- case QChar::Script_Georgian: return HB_Script_Georgian;
- case QChar::Script_Greek: return HB_Script_Greek;
- case QChar::Script_Gujarati: return HB_Script_Gujarati;
- case QChar::Script_Gurmukhi: return HB_Script_Gurmukhi;
- case QChar::Script_Hangul: return HB_Script_Hangul;
- case QChar::Script_Hebrew: return HB_Script_Hebrew;
- case QChar::Script_Kannada: return HB_Script_Kannada;
- case QChar::Script_Khmer: return HB_Script_Khmer;
- case QChar::Script_Lao: return HB_Script_Lao;
- case QChar::Script_Malayalam: return HB_Script_Malayalam;
- case QChar::Script_Myanmar: return HB_Script_Myanmar;
- case QChar::Script_Ogham: return HB_Script_Ogham;
- case QChar::Script_Oriya: return HB_Script_Oriya;
- case QChar::Script_Runic: return HB_Script_Runic;
- case QChar::Script_Sinhala: return HB_Script_Sinhala;
- case QChar::Script_Syriac: return HB_Script_Syriac;
- case QChar::Script_Tamil: return HB_Script_Tamil;
- case QChar::Script_Telugu: return HB_Script_Telugu;
- case QChar::Script_Thaana: return HB_Script_Thaana;
- case QChar::Script_Thai: return HB_Script_Thai;
- case QChar::Script_Tibetan: return HB_Script_Tibetan;
- case QChar::Script_Nko: return HB_Script_Nko;
- default: break;
- };
- return HB_Script_Common;
-}
-
-static inline uchar hbscript_to_script(uchar script)
-{
- switch (script) {
- case HB_Script_Inherited: return QChar::Script_Inherited;
- case HB_Script_Common: return QChar::Script_Common;
- case HB_Script_Arabic: return QChar::Script_Arabic;
- case HB_Script_Armenian: return QChar::Script_Armenian;
- case HB_Script_Bengali: return QChar::Script_Bengali;
- case HB_Script_Cyrillic: return QChar::Script_Cyrillic;
- case HB_Script_Devanagari: return QChar::Script_Devanagari;
- case HB_Script_Georgian: return QChar::Script_Georgian;
- case HB_Script_Greek: return QChar::Script_Greek;
- case HB_Script_Gujarati: return QChar::Script_Gujarati;
- case HB_Script_Gurmukhi: return QChar::Script_Gurmukhi;
- case HB_Script_Hangul: return QChar::Script_Hangul;
- case HB_Script_Hebrew: return QChar::Script_Hebrew;
- case HB_Script_Kannada: return QChar::Script_Kannada;
- case HB_Script_Khmer: return QChar::Script_Khmer;
- case HB_Script_Lao: return QChar::Script_Lao;
- case HB_Script_Malayalam: return QChar::Script_Malayalam;
- case HB_Script_Myanmar: return QChar::Script_Myanmar;
- case HB_Script_Ogham: return QChar::Script_Ogham;
- case HB_Script_Oriya: return QChar::Script_Oriya;
- case HB_Script_Runic: return QChar::Script_Runic;
- case HB_Script_Sinhala: return QChar::Script_Sinhala;
- case HB_Script_Syriac: return QChar::Script_Syriac;
- case HB_Script_Tamil: return QChar::Script_Tamil;
- case HB_Script_Telugu: return QChar::Script_Telugu;
- case HB_Script_Thaana: return QChar::Script_Thaana;
- case HB_Script_Thai: return QChar::Script_Thai;
- case HB_Script_Tibetan: return QChar::Script_Tibetan;
- case HB_Script_Nko: return QChar::Script_Nko;
- default: break;
- };
- return QChar::Script_Common;
-}
-
-Q_CORE_EXPORT HB_Bool qShapeItem(HB_ShaperItem *item);
-
-// ### temporary
-Q_CORE_EXPORT HB_Face qHBNewFace(void *font, HB_GetFontTableFunc tableFunc);
-Q_CORE_EXPORT void qHBFreeFace(HB_Face);
-Q_CORE_EXPORT HB_Face qHBLoadFace(HB_Face face);
-
-Q_DECLARE_TYPEINFO(HB_GlyphAttributes, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(HB_FixedPoint, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(HB_ScriptItem, Q_PRIMITIVE_TYPE);
-
-QT_END_NAMESPACE
-
-#endif // QHARFBUZZ_P_H
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp
index 6e33e27276..467fd31ab6 100644
--- a/src/corelib/text/qlocale.cpp
+++ b/src/corelib/text/qlocale.cpp
@@ -661,9 +661,8 @@ static QLocalePrivate *c_private()
}
static const QLocaleData *systemData();
-static QLocale::NumberOptions system_number_options = QLocale::DefaultNumberOptions;
Q_GLOBAL_STATIC_WITH_ARGS(QExplicitlySharedDataPointer<QLocalePrivate>, systemLocalePrivate,
- (QLocalePrivate::create(systemData(), system_number_options)))
+ (QLocalePrivate::create(systemData())))
#ifndef QT_NO_SYSTEMLOCALE
/******************************************************************************
@@ -724,14 +723,11 @@ static void updateSystemPrivate()
// Populate global with fallback as basis:
globalLocaleData = *sys_locale->fallbackUiLocaleData();
- system_number_options = QLocale::DefaultNumberOptions;
QVariant res = sys_locale->query(QSystemLocale::LanguageId, QVariant());
if (!res.isNull()) {
globalLocaleData.m_language_id = res.toInt();
globalLocaleData.m_script_id = QLocale::AnyScript; // default for compatibility
- if (globalLocaleData.m_language_id == QLocale::C)
- system_number_options = QLocale::OmitGroupSeparator;
}
res = sys_locale->query(QSystemLocale::CountryId, QVariant());
if (!res.isNull()) {
@@ -742,46 +738,7 @@ static void updateSystemPrivate()
if (!res.isNull())
globalLocaleData.m_script_id = res.toInt();
- res = sys_locale->query(QSystemLocale::DecimalPoint, QVariant());
- if (!res.isNull() && !res.toString().isEmpty())
- globalLocaleData.m_decimal = res.toString().at(0).unicode();
-
- // System may supply empty group separator to say we should omit grouping;
- // and it makes no sense to use the same separator for decimal and grouping
- // (which might happen by system supplying, as decimal, what CLDR has given
- // us for grouping; or the other way round). Assume, at least, that each of
- // system and CLDR has decimal != group, all the same.
- res = sys_locale->query(QSystemLocale::GroupSeparator, QVariant());
- if (res.isNull()) {
- // The case where system over-rides decimal but not group, and its
- // decimal clashes with CLDR's group.
- if (globalLocaleData.m_group == globalLocaleData.m_decimal)
- system_number_options |= QLocale::OmitGroupSeparator;
- } else if (res.toString().isEmpty()) {
- system_number_options |= QLocale::OmitGroupSeparator;
- } else {
- const ushort group = res.toString().at(0).unicode();
- if (group != globalLocaleData.m_decimal)
- globalLocaleData.m_group = group;
- else if (group == globalLocaleData.m_group)
- qWarning("System-supplied decimal and grouping character are both 0x%hx", group);
- }
-
- res = sys_locale->query(QSystemLocale::ZeroDigit, QVariant());
- if (!res.isNull() && !res.toString().isEmpty())
- globalLocaleData.m_zero = res.toString().at(0).unicode();
-
- res = sys_locale->query(QSystemLocale::NegativeSign, QVariant());
- if (!res.isNull() && !res.toString().isEmpty())
- globalLocaleData.m_minus = res.toString().at(0).unicode();
-
- res = sys_locale->query(QSystemLocale::PositiveSign, QVariant());
- if (!res.isNull() && !res.toString().isEmpty())
- globalLocaleData.m_plus = res.toString().at(0).unicode();
-
- if (systemLocalePrivate.exists())
- systemLocalePrivate->data()->m_numberOptions = system_number_options;
- // else: system_number_options will be passed to create() when constructing.
+ // Should we replace Any values based on likely sub-tags ?
}
#endif // !QT_NO_SYSTEMLOCALE
@@ -821,28 +778,6 @@ const QLocaleData *QLocaleData::c()
return c_data;
}
-static inline QString getLocaleData(const ushort *data, int size)
-{
- return size > 0 ? QString::fromRawData(reinterpret_cast<const QChar *>(data), size) : QString();
-}
-
-static QString getLocaleListData(const ushort *data, int size, int index)
-{
- static const ushort separator = ';';
- while (index && size > 0) {
- while (*data != separator)
- ++data, --size;
- --index;
- ++data;
- --size;
- }
- const ushort *end = data;
- while (size > 0 && *end != separator)
- ++end, --size;
- return getLocaleData(data, end - data);
-}
-
-
#ifndef QT_NO_DATASTREAM
QDataStream &operator<<(QDataStream &ds, const QLocale &l)
{
@@ -897,6 +832,97 @@ static QLocalePrivate *findLocalePrivate(QLocale::Language language, QLocale::Sc
return QLocalePrivate::create(data, offset, numberOptions);
}
+QString QLocaleData::decimalPoint() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+ if (this == systemData()) {
+ QVariant res = systemLocale()->query(QSystemLocale::DecimalPoint, QVariant());
+ if (!res.isNull())
+ return res.toString();
+ }
+#endif
+ return decimalSeparator().getData(single_character_data);
+}
+
+QString QLocaleData::groupSeparator() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+ if (this == systemData()) {
+ QVariant res = systemLocale()->query(QSystemLocale::GroupSeparator, QVariant());
+ if (!res.isNull())
+ return res.toString();
+ }
+#endif
+ return groupDelim().getData(single_character_data);
+}
+
+QString QLocaleData::percentSign() const
+{
+ return percent().getData(single_character_data);
+}
+
+QString QLocaleData::listSeparator() const
+{
+ return listDelimit().getData(single_character_data);
+}
+
+QString QLocaleData::zeroDigit() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+ if (this == systemData()) {
+ QVariant res = systemLocale()->query(QSystemLocale::ZeroDigit, QVariant());
+ if (!res.isNull())
+ return res.toString();
+ }
+#endif
+ return zero().getData(single_character_data);
+}
+
+uint QLocaleData::zeroUcs() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+ if (this == systemData()) {
+ QVariant res = systemLocale()->query(QSystemLocale::ZeroDigit, QVariant());
+ if (!res.isNull()) {
+ const QString text = res.toString();
+ if (text.size() == 1 && !text.at(0).isSurrogate())
+ return text.at(0).unicode();
+ if (text.size() == 2 && text.at(0).isHighSurrogate())
+ return QChar::surrogateToUcs4(text.at(0), text.at(1));
+ }
+ }
+#endif
+ return zero().ucsFirst(single_character_data);
+}
+
+QString QLocaleData::negativeSign() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+ if (this == systemData()) {
+ QVariant res = systemLocale()->query(QSystemLocale::NegativeSign, QVariant());
+ if (!res.isNull())
+ return res.toString();
+ }
+#endif
+ return minus().getData(single_character_data);
+}
+
+QString QLocaleData::positiveSign() const
+{
+#ifndef QT_NO_SYSTEMLOCALE
+ if (this == systemData()) {
+ QVariant res = systemLocale()->query(QSystemLocale::PositiveSign, QVariant());
+ if (!res.isNull())
+ return res.toString();
+ }
+#endif
+ return plus().getData(single_character_data);
+}
+
+QString QLocaleData::exponentSeparator() const
+{
+ return exponential().getData(single_character_data);
+}
/*!
\internal
@@ -1063,7 +1089,7 @@ bool QLocale::operator!=(const QLocale &other) const
Returns the hash value for \a key, using
\a seed to seed the calculation.
*/
-uint qHash(const QLocale &key, uint seed) noexcept
+size_t qHash(const QLocale &key, size_t seed) noexcept
{
QtPrivate::QHashCombine hash;
seed = hash(seed, key.d->m_data);
@@ -1132,11 +1158,16 @@ QString QLocale::quoteString(const QStringRef &str, QuotationStyle style) const
}
#endif
- if (style == QLocale::StandardQuotation)
- return QChar(d->m_data->m_quotation_start) % str % QChar(d->m_data->m_quotation_end);
+ QLocaleData::DataRange start, end;
+ if (style == QLocale::StandardQuotation) {
+ start = d->m_data->quoteStart();
+ end = d->m_data->quoteEnd();
+ } else {
+ start = d->m_data->quoteStartAlternate();
+ end = d->m_data->quoteEndAlternate();
+ }
- return QChar(d->m_data->m_alternate_quotation_start)
- % str % QChar(d->m_data->m_alternate_quotation_end);
+ return start.viewData(single_character_data) % str % end.viewData(single_character_data);
}
/*!
@@ -1158,31 +1189,24 @@ QString QLocale::createSeparatedList(const QStringList &list) const
#endif
const int size = list.size();
- if (size == 1) {
+ if (size < 1)
+ return QString();
+
+ if (size == 1)
return list.at(0);
- } else if (size == 2) {
- QString format = getLocaleData(
- list_pattern_part_data + d->m_data->m_list_pattern_part_two_idx,
- d->m_data->m_list_pattern_part_two_size);
- return format.arg(list.at(0), list.at(1));
- } else if (size > 2) {
- QString formatStart = getLocaleData(
- list_pattern_part_data + d->m_data->m_list_pattern_part_start_idx,
- d->m_data->m_list_pattern_part_start_size);
- QString formatMid = getLocaleData(
- list_pattern_part_data + d->m_data->m_list_pattern_part_mid_idx,
- d->m_data->m_list_pattern_part_mid_size);
- QString formatEnd = getLocaleData(
- list_pattern_part_data + d->m_data->m_list_pattern_part_end_idx,
- d->m_data->m_list_pattern_part_end_size);
- QString result = formatStart.arg(list.at(0), list.at(1));
- for (int i = 2; i < size - 1; ++i)
- result = formatMid.arg(result, list.at(i));
- result = formatEnd.arg(result, list.at(size - 1));
- return result;
- }
- return QString();
+ if (size == 2)
+ return d->m_data->pairListPattern().getData(
+ list_pattern_part_data).arg(list.at(0), list.at(1));
+
+ QStringView formatStart = d->m_data->startListPattern().viewData(list_pattern_part_data);
+ QStringView formatMid = d->m_data->midListPattern().viewData(list_pattern_part_data);
+ QStringView formatEnd = d->m_data->endListPattern().viewData(list_pattern_part_data);
+ QString result = formatStart.arg(list.at(0), list.at(1));
+ for (int i = 2; i < size - 1; ++i)
+ result = formatMid.arg(result, list.at(i));
+ result = formatEnd.arg(result, list.at(size - 1));
+ return result;
}
/*!
@@ -2030,7 +2054,7 @@ QString QLocale::toString(qulonglong i) const
\sa QDate::toString()
*/
-QString QLocale::toString(const QDate &date, const QString &format) const
+QString QLocale::toString(QDate date, const QString &format) const
{
return QCalendar().dateTimeToString(format, QDateTime(), date, QTime(), *this);
}
@@ -2045,7 +2069,7 @@ QString QLocale::toString(const QDate &date, const QString &format) const
\sa QDate::toString()
*/
-QString QLocale::toString(const QDate &date, QStringView format) const
+QString QLocale::toString(QDate date, QStringView format) const
{
return QCalendar().dateTimeToString(format, QDateTime(), date, QTime(), *this);
}
@@ -2058,7 +2082,7 @@ QString QLocale::toString(const QDate &date, QStringView format) const
represent.
*/
-QString QLocale::toString(const QDate &date, FormatType format) const
+QString QLocale::toString(QDate date, FormatType format) const
{
if (!date.isValid())
return QString();
@@ -2103,7 +2127,7 @@ static bool timeFormatContainsAP(QStringView format)
\sa QTime::toString()
*/
-QString QLocale::toString(const QTime &time, const QString &format) const
+QString QLocale::toString(QTime time, const QString &format) const
{
return QCalendar().dateTimeToString(format, QDateTime(), QDate(), time, *this);
}
@@ -2118,7 +2142,7 @@ QString QLocale::toString(const QTime &time, const QString &format) const
\sa QTime::toString()
*/
-QString QLocale::toString(const QTime &time, QStringView format) const
+QString QLocale::toString(QTime time, QStringView format) const
{
return QCalendar().dateTimeToString(format, QDateTime(), QDate(), time, *this);
}
@@ -2154,12 +2178,12 @@ QString QLocale::toString(const QDateTime &dateTime, QStringView format) const
return QCalendar().dateTimeToString(format, dateTime, QDate(), QTime(), *this);
}
-QString QLocale::toString(const QDate &date, QStringView format, QCalendar cal) const
+QString QLocale::toString(QDate date, QStringView format, QCalendar cal) const
{
return cal.dateTimeToString(format, QDateTime(), date, QTime(), *this);
}
-QString QLocale::toString(const QDate &date, QLocale::FormatType format, QCalendar cal) const
+QString QLocale::toString(QDate date, QLocale::FormatType format, QCalendar cal) const
{
if (!date.isValid())
return QString();
@@ -2241,7 +2265,7 @@ QString QLocale::toString(const QDateTime &dateTime, FormatType format) const
specified \a format.
*/
-QString QLocale::toString(const QTime &time, FormatType format) const
+QString QLocale::toString(QTime time, FormatType format) const
{
if (!time.isValid())
return QString();
@@ -2285,18 +2309,10 @@ QString QLocale::dateFormat(FormatType format) const
}
#endif
- quint32 idx, size;
- switch (format) {
- case LongFormat:
- idx = d->m_data->m_long_date_format_idx;
- size = d->m_data->m_long_date_format_size;
- break;
- default:
- idx = d->m_data->m_short_date_format_idx;
- size = d->m_data->m_short_date_format_size;
- break;
- }
- return getLocaleData(date_format_data + idx, size);
+ return (format == LongFormat
+ ? d->m_data->longDateFormat()
+ : d->m_data->shortDateFormat()
+ ).getData(date_format_data);
}
/*!
@@ -2323,18 +2339,10 @@ QString QLocale::timeFormat(FormatType format) const
}
#endif
- quint32 idx, size;
- switch (format) {
- case LongFormat:
- idx = d->m_data->m_long_time_format_idx;
- size = d->m_data->m_long_time_format_size;
- break;
- default:
- idx = d->m_data->m_short_time_format_idx;
- size = d->m_data->m_short_time_format_size;
- break;
- }
- return getLocaleData(time_format_data + idx, size);
+ return (format == LongFormat
+ ? d->m_data->longTimeFormat()
+ : d->m_data->shortTimeFormat()
+ ).getData(time_format_data);
}
/*!
@@ -2580,15 +2588,11 @@ QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCal
Returns the decimal point character of this locale.
- \note This function shall change to return a QString instead of QChar in
- Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
- convert early in preparation for this.
-
\sa groupSeparator(), toString()
*/
-QChar QLocale::decimalPoint() const
+QString QLocale::decimalPoint() const
{
- return d->decimal();
+ return d->m_data->decimalPoint();
}
/*!
@@ -2596,15 +2600,11 @@ QChar QLocale::decimalPoint() const
Returns the group separator character of this locale.
- \note This function shall change to return a QString instead of QChar in
- Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
- convert early in preparation for this.
-
\sa decimalPoint(), toString()
*/
-QChar QLocale::groupSeparator() const
+QString QLocale::groupSeparator() const
{
- return d->group();
+ return d->m_data->groupSeparator();
}
/*!
@@ -2612,15 +2612,11 @@ QChar QLocale::groupSeparator() const
Returns the percent character of this locale.
- \note This function shall change to return a QString instead of QChar in
- Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
- convert early in preparation for this.
-
\sa toString()
*/
-QChar QLocale::percent() const
+QString QLocale::percent() const
{
- return d->percent();
+ return d->m_data->percentSign();
}
/*!
@@ -2628,15 +2624,11 @@ QChar QLocale::percent() const
Returns the zero digit character of this locale.
- \note This function shall change to return a QString instead of QChar in
- Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
- convert early in preparation for this.
-
\sa toString()
*/
-QChar QLocale::zeroDigit() const
+QString QLocale::zeroDigit() const
{
- return d->zero();
+ return d->m_data->zeroDigit();
}
/*!
@@ -2644,15 +2636,11 @@ QChar QLocale::zeroDigit() const
Returns the negative sign character of this locale.
- \note This function shall change to return a QString instead of QChar in
- Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
- convert early in preparation for this.
-
\sa positiveSign(), toString()
*/
-QChar QLocale::negativeSign() const
+QString QLocale::negativeSign() const
{
- return d->minus();
+ return d->m_data->negativeSign();
}
/*!
@@ -2660,15 +2648,11 @@ QChar QLocale::negativeSign() const
Returns the positive sign character of this locale.
- \note This function shall change to return a QString instead of QChar in
- Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
- convert early in preparation for this.
-
\sa negativeSign(), toString()
*/
-QChar QLocale::positiveSign() const
+QString QLocale::positiveSign() const
{
- return d->plus();
+ return d->m_data->positiveSign();
}
/*!
@@ -2677,15 +2661,11 @@ QChar QLocale::positiveSign() const
Returns the exponential character of this locale, used to separate exponent
from mantissa in some floating-point numeric representations.
- \note This function shall change to return a QString instead of QChar in
- Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
- convert early in preparation for this.
-
\sa toString(double, char, int)
*/
-QChar QLocale::exponential() const
+QString QLocale::exponential() const
{
- return d->exponential();
+ return d->m_data->exponentSeparator();
}
static bool qIsUpper(char c)
@@ -2918,27 +2898,24 @@ QString QLocale::standaloneDayName(int day, FormatType type) const
*/
static QString rawMonthName(const QCalendarLocale &localeData,
- const ushort *monthsData, int month,
+ const char16_t *monthsData, int month,
QLocale::FormatType type)
{
- quint32 idx, size;
+ QLocaleData::DataRange range;
switch (type) {
case QLocale::LongFormat:
- idx = localeData.m_long.index;
- size = localeData.m_long.size;
- break;
+ range = localeData.longMonth();
+ break;
case QLocale::ShortFormat:
- idx = localeData.m_short.index;
- size = localeData.m_short.size;
- break;
+ range = localeData.shortMonth();
+ break;
case QLocale::NarrowFormat:
- idx = localeData.m_narrow.index;
- size = localeData.m_narrow.size;
- break;
+ range = localeData.narrowMonth();
+ break;
default:
- return QString();
+ return QString();
}
- return getLocaleListData(monthsData + idx, size, month - 1);
+ return range.getListEntry(monthsData, month - 1);
}
/*!
@@ -2946,27 +2923,24 @@ static QString rawMonthName(const QCalendarLocale &localeData,
*/
static QString rawStandaloneMonthName(const QCalendarLocale &localeData,
- const ushort *monthsData, int month,
+ const char16_t *monthsData, int month,
QLocale::FormatType type)
{
- quint32 idx, size;
+ QLocaleData::DataRange range;
switch (type) {
case QLocale::LongFormat:
- idx = localeData.m_standalone_long.index;
- size = localeData.m_standalone_long.size;
+ range = localeData.longMonthStandalone();
break;
case QLocale::ShortFormat:
- idx = localeData.m_standalone_short.index;
- size = localeData.m_standalone_short.size;
+ range = localeData.shortMonthStandalone();
break;
case QLocale::NarrowFormat:
- idx = localeData.m_standalone_narrow.index;
- size = localeData.m_standalone_narrow.size;
+ range = localeData.narrowMonthStandalone();
break;
default:
return QString();
}
- QString name = getLocaleListData(monthsData + idx, size, month - 1);
+ QString name = range.getListEntry(monthsData, month - 1);
return name.isEmpty() ? rawMonthName(localeData, monthsData, month, type) : name;
}
@@ -2977,24 +2951,21 @@ static QString rawStandaloneMonthName(const QCalendarLocale &localeData,
static QString rawWeekDayName(const QLocaleData *data, const int day,
QLocale::FormatType type)
{
- quint32 idx, size;
+ QLocaleData::DataRange range;
switch (type) {
case QLocale::LongFormat:
- idx = data->m_long_day_names_idx;
- size = data->m_long_day_names_size;
+ range = data->longDayNames();
break;
case QLocale::ShortFormat:
- idx = data->m_short_day_names_idx;
- size = data->m_short_day_names_size;
+ range = data->shortDayNames();
break;
case QLocale::NarrowFormat:
- idx = data->m_narrow_day_names_idx;
- size = data->m_narrow_day_names_size;
+ range = data->narrowDayNames();
break;
default:
return QString();
}
- return getLocaleListData(days_data + idx, size, day == 7 ? 0 : day);
+ return range.getListEntry(days_data, day == 7 ? 0 : day);
}
/*!
@@ -3004,24 +2975,21 @@ static QString rawWeekDayName(const QLocaleData *data, const int day,
static QString rawStandaloneWeekDayName(const QLocaleData *data, const int day,
QLocale::FormatType type)
{
- quint32 idx, size;
+ QLocaleData::DataRange range;
switch (type) {
case QLocale::LongFormat:
- idx = data->m_standalone_long_day_names_idx;
- size = data->m_standalone_long_day_names_size;
+ range =data->longDayNamesStandalone();
break;
case QLocale::ShortFormat:
- idx = data->m_standalone_short_day_names_idx;
- size = data->m_standalone_short_day_names_size;
+ range = data->shortDayNamesStandalone();
break;
case QLocale::NarrowFormat:
- idx = data->m_standalone_narrow_day_names_idx;
- size = data->m_standalone_narrow_day_names_size;
+ range = data->narrowDayNamesStandalone();
break;
default:
return QString();
}
- QString name = getLocaleListData(days_data + idx, size, day == 7 ? 0 : day);
+ QString name = range.getListEntry(days_data, day == 7 ? 0 : day);
if (name.isEmpty())
return rawWeekDayName(data, day, type);
return name;
@@ -3305,7 +3273,7 @@ QString QLocale::amText() const
return res.toString();
}
#endif
- return getLocaleData(am_data + d->m_data->m_am_idx, d->m_data->m_am_size);
+ return d->m_data->anteMeridiem().getData(am_data);
}
/*!
@@ -3325,13 +3293,13 @@ QString QLocale::pmText() const
return res.toString();
}
#endif
- return getLocaleData(pm_data + d->m_data->m_pm_idx, d->m_data->m_pm_size);
+ return d->m_data->postMeridiem().getData(pm_data);
}
// Another intrusion from QCalendar, using some of the tools above:
QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &datetime,
- const QDate &dateOnly, const QTime &timeOnly,
+ QDate dateOnly, QTime timeOnly,
const QLocale &locale) const
{
QDate date;
@@ -3536,9 +3504,9 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
result.append(locale.d->m_data->longLongToString(time.msec(), -1, 10, 3,
QLocaleData::ZeroPadded));
if (repeat == 1) {
- if (result.endsWith(locale.d->zero()))
+ if (result.endsWith(locale.zeroDigit()))
result.chop(1);
- if (result.endsWith(locale.d->zero()))
+ if (result.endsWith(locale.zeroDigit()))
result.chop(1);
}
break;
@@ -3568,12 +3536,14 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &
QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
int width, unsigned flags) const
{
- return doubleToString(m_zero, m_plus, m_minus, m_exponential, m_group, m_decimal,
+ return doubleToString(zeroDigit(), positiveSign(), negativeSign(),
+ exponentSeparator(), groupSeparator(), decimalPoint(),
d, precision, form, width, flags);
}
-QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const QChar minus,
- const QChar exponential, const QChar group, const QChar decimal,
+QString QLocaleData::doubleToString(const QString &zero, const QString &plus, const QString &minus,
+ const QString &exponential,
+ const QString &group, const QString &decimal,
double d, int precision, DoubleForm form, int width,
unsigned flags)
{
@@ -3605,8 +3575,23 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
} else { // Handle normal numbers
QString digits = QString::fromLatin1(buf.data(), length);
- if (_zero.unicode() != '0') {
- ushort z = _zero.unicode() - '0';
+ if (zero == u"0") {
+ // No need to convert digits.
+ } else if (zero.size() == 2 && zero.at(0).isHighSurrogate()) {
+ const uint zeroUcs4 = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
+ QString converted;
+ converted.reserve(2 * digits.size());
+ for (int i = 0; i < digits.length(); ++i) {
+ const uint digit = zeroUcs4 - '0' + digits.at(i).unicode();
+ Q_ASSERT(QChar::requiresSurrogates(digit));
+ converted.append(QChar::highSurrogate(digit));
+ converted.append(QChar::lowSurrogate(digit));
+ }
+ digits = converted;
+ } else {
+ Q_ASSERT(zero.size() == 1);
+ Q_ASSERT(!zero.at(0).isSurrogate());
+ ushort z = zero.at(0).unicode() - '0';
for (int i = 0; i < digits.length(); ++i)
reinterpret_cast<ushort *>(digits.data())[i] += z;
}
@@ -3614,13 +3599,13 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
bool always_show_decpt = (flags & ForcePoint);
switch (form) {
case DFExponent: {
- num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
+ num_str = exponentForm(zero, decimal, exponential, group, plus, minus,
digits, decpt, precision, PMDecimalDigits,
always_show_decpt, flags & ZeroPadExponent);
break;
}
case DFDecimal: {
- num_str = decimalForm(_zero, decimal, group,
+ num_str = decimalForm(zero, decimal, group,
digits, decpt, precision, PMDecimalDigits,
always_show_decpt, flags & ThousandsGroup);
break;
@@ -3629,25 +3614,25 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
PrecisionMode mode = (flags & AddTrailingZeroes) ?
PMSignificantDigits : PMChopTrailingZeros;
+ const auto digitWidth = zero.size();
int cutoff = precision < 0 ? 6 : precision;
// Find out which representation is shorter
if (precision == QLocale::FloatingPointShortest && decpt > 0) {
- cutoff = digits.length() + 4; // 'e', '+'/'-', one digit exponent
- if (decpt <= 10) {
+ cutoff = digits.length() / digitWidth + 4; // 'e', '+'/'-', one digit exponent
+ if (decpt <= 10)
++cutoff;
- } else {
+ else
cutoff += decpt > 100 ? 2 : 1;
- }
- if (!always_show_decpt && digits.length() > decpt)
+ if (!always_show_decpt && digits.length() / digitWidth > decpt)
++cutoff; // decpt shown in exponent form, but not in decimal form
}
- if (decpt != digits.length() && (decpt <= -4 || decpt > cutoff))
- num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
+ if (decpt != digits.length() / digitWidth && (decpt <= -4 || decpt > cutoff))
+ num_str = exponentForm(zero, decimal, exponential, group, plus, minus,
digits, decpt, precision, mode,
always_show_decpt, flags & ZeroPadExponent);
else
- num_str = decimalForm(_zero, decimal, group,
+ num_str = decimalForm(zero, decimal, group,
digits, decpt, precision, mode,
always_show_decpt, flags & ThousandsGroup);
break;
@@ -3657,10 +3642,10 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
if (isZero(d))
negative = false;
- // pad with zeros. LeftAdjusted overrides this flag). Also, we don't
+ // pad with zeros. LeftAdjusted overrides this flag. Also, we don't
// pad special numbers
if (flags & QLocaleData::ZeroPadded && !(flags & QLocaleData::LeftAdjusted)) {
- int num_pad_chars = width - num_str.length();
+ int num_pad_chars = width - num_str.length() / zero.length();
// leave space for the sign
if (negative
|| flags & QLocaleData::AlwaysShowSign
@@ -3668,7 +3653,7 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
--num_pad_chars;
for (int i = 0; i < num_pad_chars; ++i)
- num_str.prepend(_zero);
+ num_str.prepend(zero);
}
}
@@ -3687,18 +3672,16 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
}
QString QLocaleData::longLongToString(qlonglong l, int precision,
- int base, int width,
- unsigned flags) const
+ int base, int width, unsigned flags) const
{
- return longLongToString(m_zero, m_group, m_plus, m_minus,
- l, precision, base, width, flags);
+ return longLongToString(zeroDigit(), groupSeparator(), positiveSign(), negativeSign(),
+ l, precision, base, width, flags);
}
-QString QLocaleData::longLongToString(const QChar zero, const QChar group,
- const QChar plus, const QChar minus,
- qlonglong l, int precision,
- int base, int width,
- unsigned flags)
+QString QLocaleData::longLongToString(const QString &zero, const QString &group,
+ const QString &plus, const QString &minus,
+ qlonglong l, int precision,
+ int base, int width, unsigned flags)
{
bool precision_not_specified = false;
if (precision == -1) {
@@ -3724,25 +3707,28 @@ QT_WARNING_DISABLE_MSVC(4146)
QString num_str = qulltoa(negative ? -qulonglong(l) : qulonglong(l), base, zero);
QT_WARNING_POP
+ const QString resultZero = base == 10 ? zero : QStringLiteral("0");
+ const auto digitWidth = resultZero.size();
uint cnt_thousand_sep = 0;
- if (base == 10){
+ if (base == 10) {
if (flags & ThousandsGroup) {
- for (int i = num_str.length() - 3; i > 0; i -= 3) {
- num_str.insert(i, group);
+ for (int i = num_str.length() / digitWidth - 3; i > 0; i -= 3) {
+ num_str.insert(i * digitWidth, group);
++cnt_thousand_sep;
}
} else if (flags & IndianNumberGrouping) {
- if (num_str.length() > 3)
- num_str.insert(num_str.length() - 3 , group);
- for (int i = num_str.length() - 6; i > 0; i -= 2) {
- num_str.insert(i, group);
+ const int size = num_str.length();
+ if (size > 3 * digitWidth)
+ num_str.insert(size - 3 * digitWidth , group);
+ for (int i = size / digitWidth - 5; i > 0; i -= 2) {
+ num_str.insert(i * digitWidth, group);
++cnt_thousand_sep;
}
}
}
for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i)
- num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
+ num_str.prepend(resultZero);
if ((flags & ShowBase)
&& base == 8
@@ -3756,7 +3742,7 @@ QT_WARNING_POP
&& precision_not_specified;
if (zero_padded) {
- int num_pad_chars = width - num_str.length();
+ int num_pad_chars = width - num_str.length() / digitWidth;
// leave space for the sign
if (negative
@@ -3771,8 +3757,8 @@ QT_WARNING_POP
else if (base == 2 && (flags & ShowBase))
num_pad_chars -= 2;
- for (int i = 0; i < num_pad_chars; ++i)
- num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
+ while (num_pad_chars-- > 0)
+ num_str.prepend(resultZero);
}
if (flags & CapitalEorX)
@@ -3795,21 +3781,19 @@ QT_WARNING_POP
}
QString QLocaleData::unsLongLongToString(qulonglong l, int precision,
- int base, int width,
- unsigned flags) const
+ int base, int width, unsigned flags) const
{
- return unsLongLongToString(m_zero, m_group, m_plus,
- l, precision, base, width, flags);
+ return unsLongLongToString(zeroDigit(), groupSeparator(), positiveSign(),
+ l, precision, base, width, flags);
}
-QString QLocaleData::unsLongLongToString(const QChar zero, const QChar group,
- const QChar plus,
- qulonglong l, int precision,
- int base, int width,
- unsigned flags)
+QString QLocaleData::unsLongLongToString(const QString &zero, const QString &group,
+ const QString &plus,
+ qulonglong l, int precision,
+ int base, int width, unsigned flags)
{
- const QChar resultZero = base == 10 ? zero : QChar(QLatin1Char('0'));
- QString num_str = l ? qulltoa(l, base, zero) : QString(resultZero);
+ const QString resultZero = base == 10 ? zero : QStringLiteral("0");
+ QString num_str = l ? qulltoa(l, base, zero) : resultZero;
bool precision_not_specified = false;
if (precision == -1) {
@@ -3820,26 +3804,28 @@ QString QLocaleData::unsLongLongToString(const QChar zero, const QChar group,
precision = 1;
}
+ const auto digitWidth = resultZero.size();
uint cnt_thousand_sep = 0;
if (base == 10) {
if (flags & ThousandsGroup) {
- for (int i = num_str.length() - 3; i > 0; i -=3) {
- num_str.insert(i, group);
+ for (int i = num_str.length() / digitWidth - 3; i > 0; i -= 3) {
+ num_str.insert(i * digitWidth, group);
++cnt_thousand_sep;
}
} else if (flags & IndianNumberGrouping) {
- if (num_str.length() > 3)
- num_str.insert(num_str.length() - 3 , group);
- for (int i = num_str.length() - 6; i > 0; i -= 2) {
- num_str.insert(i, group);
+ const int size = num_str.length();
+ if (size > 3 * digitWidth)
+ num_str.insert(size - 3 * digitWidth , group);
+ for (int i = size / digitWidth - 5; i > 0; i -= 2) {
+ num_str.insert(i * digitWidth, group);
++cnt_thousand_sep;
}
}
}
- const int zeroPadding = precision - num_str.length()/* + cnt_thousand_sep*/;
- if (zeroPadding > 0)
- num_str.prepend(QString(zeroPadding, resultZero));
+ int zeroPadding = precision - num_str.length() / digitWidth /* + cnt_thousand_sep*/;
+ while (zeroPadding-- > 0)
+ num_str.prepend(resultZero);
if ((flags & ShowBase)
&& base == 8
@@ -3853,7 +3839,7 @@ QString QLocaleData::unsLongLongToString(const QChar zero, const QChar group,
&& precision_not_specified;
if (zero_padded) {
- int num_pad_chars = width - num_str.length();
+ int num_pad_chars = width - num_str.length() / digitWidth;
// leave space for optional '0x' in hex form
if (base == 16 && flags & ShowBase)
@@ -3862,8 +3848,8 @@ QString QLocaleData::unsLongLongToString(const QChar zero, const QChar group,
else if (base == 2 && flags & ShowBase)
num_pad_chars -= 2;
- if (num_pad_chars > 0)
- num_str.prepend(QString(num_pad_chars, resultZero));
+ while (num_pad_chars-- > 0)
+ num_str.prepend(resultZero);
}
if (flags & CapitalEorX)
@@ -3894,42 +3880,37 @@ QString QLocaleData::unsLongLongToString(const QChar zero, const QChar group,
bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_options,
CharBuff *result) const
{
- const QChar *uc = s.data();
- auto l = s.size();
- decltype(l) idx = 0;
-
- // Skip whitespace
- while (idx < l && uc[idx].isSpace())
- ++idx;
- if (idx == l)
+ s = s.trimmed();
+ if (s.size() < 1)
return false;
- // Check trailing whitespace
- for (; idx < l; --l) {
- if (!uc[l - 1].isSpace())
- break;
- }
+ const QChar *uc = s.data();
+ auto length = s.size();
+ decltype(length) idx = 0;
+ const int leadingGroupWidth = (m_country_id == QLocale::India ? 2 : 3);
+ int digitsInGroup = 0;
int group_cnt = 0; // counts number of group chars
int decpt_idx = -1;
int last_separator_idx = -1;
int start_of_digits_idx = -1;
int exponent_idx = -1;
- while (idx < l) {
- const QChar in = uc[idx];
+ while (idx < length) {
+ const QStringView in = QStringView(uc + idx, uc[idx].isHighSurrogate() ? 2 : 1);
- char out = digitToCLocale(in);
+ char out = numericToCLocale(in);
if (out == 0) {
- if (in == m_list)
+ const QChar simple(in.size() == 1 ? in.front() : QChar(0));
+ if (in == listSeparator())
out = ';';
- else if (in == m_percent)
+ else if (in == percentSign())
out = '%';
// for handling base-x numbers
- else if (in.unicode() >= 'A' && in.unicode() <= 'Z')
- out = in.toLower().toLatin1();
- else if (in.unicode() >= 'a' && in.unicode() <= 'z')
- out = in.toLatin1();
+ else if (simple.toLatin1() >= 'A' && simple.toLatin1() <= 'Z')
+ out = simple.toLower().toLatin1();
+ else if (simple.toLatin1() >= 'a' && simple.toLatin1() <= 'z')
+ out = simple.toLatin1();
else
break;
} else if (out == '.') {
@@ -3937,12 +3918,12 @@ bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_o
if (decpt_idx != -1 || exponent_idx != -1)
return false;
decpt_idx = idx;
- } else if (out == 'e' || out == 'E') {
+ } else if (out == 'e') {
exponent_idx = idx;
}
if (number_options & QLocale::RejectLeadingZeroInExponent) {
- if (exponent_idx != -1 && out == '0' && idx < l - 1) {
+ if (exponent_idx != -1 && out == '0' && idx < length - 1) {
// After the exponent there can only be '+', '-' or digits.
// If we find a '0' directly after some non-digit, then that is a leading zero.
if (result->last() < '0' || result->last() > '9')
@@ -3960,45 +3941,46 @@ bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_o
if (!(number_options & QLocale::RejectGroupSeparator)) {
if (start_of_digits_idx == -1 && out >= '0' && out <= '9') {
start_of_digits_idx = idx;
+ digitsInGroup++;
} else if (out == ',') {
// Don't allow group chars after the decimal point or exponent
if (decpt_idx != -1 || exponent_idx != -1)
return false;
- // check distance from the last separator or from the beginning of the digits
- // ### FIXME: Some locales allow other groupings!
- // See https://en.wikipedia.org/wiki/Thousands_separator
- if (m_country_id == QLocale::India) {
- if (last_separator_idx != -1 && idx - last_separator_idx != 3)
+ if (last_separator_idx == -1) {
+ if (start_of_digits_idx == -1 || digitsInGroup > leadingGroupWidth)
+ return false;
+ } else {
+ // check distance from the last separator or from the beginning of the digits
+ // ### FIXME: Some locales allow other groupings!
+ // See https://en.wikipedia.org/wiki/Thousands_separator
+ if (digitsInGroup != leadingGroupWidth)
return false;
- } else if (last_separator_idx != -1 && idx - last_separator_idx != 4)
- return false;
- if (last_separator_idx == -1
- && (start_of_digits_idx == -1 || idx - start_of_digits_idx > 3)) {
- return false;
}
last_separator_idx = idx;
++group_cnt;
+ digitsInGroup = 0;
// don't add the group separator
- ++idx;
+ idx += in.size();
continue;
- } else if (out == '.' || out == 'e' || out == 'E') {
+ } else if (out == '.' || idx == exponent_idx) {
// check distance from the last separator
// ### FIXME: Some locales allow other groupings!
// See https://en.wikipedia.org/wiki/Thousands_separator
- if (last_separator_idx != -1 && idx - last_separator_idx != 4)
+ if (last_separator_idx != -1 && digitsInGroup != 3)
return false;
// stop processing separators
last_separator_idx = -1;
+ } else if (out >= '0' && out <= '9') {
+ digitsInGroup++;
}
}
result->append(out);
-
- ++idx;
+ idx += in.size();
}
if (!(number_options & QLocale::RejectGroupSeparator)) {
@@ -4007,7 +3989,7 @@ bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_o
if (last_separator_idx + 1 == idx)
return false;
// were there enough digits since the last separator?
- if (last_separator_idx != -1 && idx - last_separator_idx != 4)
+ if (last_separator_idx != -1 && digitsInGroup != 3)
return false;
}
@@ -4018,7 +4000,7 @@ bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_o
}
result->append('\0');
- return idx == l;
+ return idx == length;
}
bool QLocaleData::validateChars(QStringView str, NumberMode numMode, QByteArray *buff,
@@ -4035,8 +4017,9 @@ bool QLocaleData::validateChars(QStringView str, NumberMode numMode, QByteArray
bool dec = false;
int decDigitCnt = 0;
- for (qsizetype i = 0; i < str.size(); ++i) {
- char c = digitToCLocale(str.at(i));
+ for (qsizetype i = 0; i < str.size();) {
+ const QStringView in = str.mid(i, str.at(i).isHighSurrogate() ? 2 : 1);
+ char c = numericToCLocale(in);
if (c >= '0' && c <= '9') {
if (numMode != IntegerMode) {
@@ -4118,6 +4101,8 @@ bool QLocaleData::validateChars(QStringView str, NumberMode numMode, QByteArray
lastWasE = c == 'e';
if (c != ',')
buff->append(c);
+
+ i += in.size();
}
return true;
@@ -4267,23 +4252,16 @@ QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
return res.toString();
}
#endif
- quint32 idx, size;
switch (format) {
case CurrencySymbol:
- idx = d->m_data->m_currency_symbol_idx;
- size = d->m_data->m_currency_symbol_size;
- return getLocaleData(currency_symbol_data + idx, size);
+ return d->m_data->currencySymbol().getData(currency_symbol_data);
case CurrencyDisplayName:
- idx = d->m_data->m_currency_display_name_idx;
- size = d->m_data->m_currency_display_name_size;
- return getLocaleListData(currency_display_name_data + idx, size, 0);
+ return d->m_data->currencyDisplayName().getListEntry(currency_display_name_data, 0);
case CurrencyIsoCode: {
- int len = 0;
- const QLocaleData *data = this->d->m_data;
- for (; len < 3; ++len)
- if (!data->m_currency_iso_code[len])
- break;
- return len ? QString::fromLatin1(data->m_currency_iso_code, len) : QString();
+ const char *code = d->m_data->m_currency_iso_code;
+ if (int len = qstrnlen(code, 3))
+ return QString::fromLatin1(code, len);
+ break;
}
}
return QString();
@@ -4308,20 +4286,16 @@ QString QLocale::toCurrencyString(qlonglong value, const QString &symbol) const
return res.toString();
}
#endif
- const QLocalePrivate *d = this->d;
- quint8 idx = d->m_data->m_currency_format_idx;
- quint8 size = d->m_data->m_currency_format_size;
- if (d->m_data->m_currency_negative_format_size && value < 0) {
- idx = d->m_data->m_currency_negative_format_idx;
- size = d->m_data->m_currency_negative_format_size;
+ QLocaleData::DataRange range = d->m_data->currencyFormatNegative();
+ if (!range.size || value >= 0)
+ range = d->m_data->currencyFormat();
+ else
value = -value;
- }
QString str = toString(value);
QString sym = symbol.isNull() ? currencySymbol() : symbol;
if (sym.isEmpty())
sym = currencySymbol(QLocale::CurrencyIsoCode);
- QString format = getLocaleData(currency_format_data + idx, size);
- return format.arg(str, sym);
+ return range.getData(currency_format_data).arg(str, sym);
}
/*!
@@ -4339,15 +4313,11 @@ QString QLocale::toCurrencyString(qulonglong value, const QString &symbol) const
return res.toString();
}
#endif
- const QLocaleData *data = this->d->m_data;
- quint8 idx = data->m_currency_format_idx;
- quint8 size = data->m_currency_format_size;
QString str = toString(value);
QString sym = symbol.isNull() ? currencySymbol() : symbol;
if (sym.isEmpty())
sym = currencySymbol(QLocale::CurrencyIsoCode);
- QString format = getLocaleData(currency_format_data + idx, size);
- return format.arg(str, sym);
+ return d->m_data->currencyFormat().getData(currency_format_data).arg(str, sym);
}
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
@@ -4382,20 +4352,16 @@ QString QLocale::toCurrencyString(double value, const QString &symbol, int preci
return res.toString();
}
#endif
- const QLocaleData *data = this->d->m_data;
- quint8 idx = data->m_currency_format_idx;
- quint8 size = data->m_currency_format_size;
- if (data->m_currency_negative_format_size && value < 0) {
- idx = data->m_currency_negative_format_idx;
- size = data->m_currency_negative_format_size;
+ QLocaleData::DataRange range = d->m_data->currencyFormatNegative();
+ if (!range.size || value >= 0)
+ range = d->m_data->currencyFormat();
+ else
value = -value;
- }
QString str = toString(value, 'f', precision == -1 ? d->m_data->m_currency_digits : precision);
QString sym = symbol.isNull() ? currencySymbol() : symbol;
if (sym.isEmpty())
sym = currencySymbol(QLocale::CurrencyIsoCode);
- QString format = getLocaleData(currency_format_data + idx, size);
- return format.arg(str, sym);
+ return range.getData(currency_format_data).arg(str, sym);
}
/*!
@@ -4470,17 +4436,11 @@ QString QLocale::formattedDataSize(qint64 bytes, int precision, DataSizeFormats
Q_ASSERT(power <= 6 && power >= 0);
QString unit;
if (power > 0) {
- quint16 index, size;
- if (format & DataSizeSIQuantifiers) {
- index = d->m_data->m_byte_si_quantified_idx;
- size = d->m_data->m_byte_si_quantified_size;
- } else {
- index = d->m_data->m_byte_iec_quantified_idx;
- size = d->m_data->m_byte_iec_quantified_size;
- }
- unit = getLocaleListData(byte_unit_data + index, size, power - 1);
+ QLocaleData::DataRange range = (format & DataSizeSIQuantifiers)
+ ? d->m_data->byteAmountSI() : d->m_data->byteAmountIEC();
+ unit = range.getListEntry(byte_unit_data, power - 1);
} else {
- unit = getLocaleData(byte_unit_data + d->m_data->m_byte_idx, d->m_data->m_byte_size);
+ unit = d->m_data->byteCount().getData(byte_unit_data);
}
return number + QLatin1Char(' ') + unit;
@@ -4512,7 +4472,7 @@ QStringList QLocale::uiLanguages() const
if (!res.isNull()) {
uiLanguages = res.toStringList();
// ... but we need to include likely-adjusted forms of each of those, too:
- for (const auto entry : qAsConst(uiLanguages))
+ for (const auto &entry : qAsConst(uiLanguages))
locales.append(QLocale(entry));
}
if (locales.isEmpty())
@@ -4606,8 +4566,7 @@ QString QLocale::nativeLanguageName() const
return res.toString();
}
#endif
- return getLocaleData(endonyms_data + d->m_data->m_language_endonym_idx,
- d->m_data->m_language_endonym_size);
+ return d->m_data->endonymLanguage().getData(endonyms_data);
}
/*!
@@ -4627,8 +4586,7 @@ QString QLocale::nativeCountryName() const
return res.toString();
}
#endif
- return getLocaleData(endonyms_data + d->m_data->m_country_endonym_idx,
- d->m_data->m_country_endonym_size);
+ return d->m_data->endonymCountry().getData(endonyms_data);
}
#ifndef QT_NO_DEBUG_STREAM
diff --git a/src/corelib/text/qlocale.h b/src/corelib/text/qlocale.h
index c1c3bd396b..e501a33764 100644
--- a/src/corelib/text/qlocale.h
+++ b/src/corelib/text/qlocale.h
@@ -59,7 +59,7 @@ class QTextStreamPrivate;
class QLocalePrivate;
-Q_CORE_EXPORT uint qHash(const QLocale &key, uint seed = 0) noexcept;
+Q_CORE_EXPORT size_t qHash(const QLocale &key, size_t seed = 0) noexcept;
class Q_CORE_EXPORT QLocale
{
@@ -941,7 +941,7 @@ public:
Q_FLAG(DataSizeFormats)
QLocale();
- QLocale(const QString &name);
+ explicit QLocale(const QString &name);
QLocale(Language language, Country country = AnyCountry);
QLocale(Language language, Script script, Country country);
QLocale(const QLocale &other);
@@ -1007,22 +1007,22 @@ public:
inline QString toString(float i, char f = 'g', int prec = 6) const;
#if QT_STRINGVIEW_LEVEL < 2
- QString toString(const QDate &date, const QString &formatStr) const;
- QString toString(const QTime &time, const QString &formatStr) const;
+ QString toString(QDate date, const QString &formatStr) const;
+ QString toString(QTime time, const QString &formatStr) const;
QString toString(const QDateTime &dateTime, const QString &format) const;
#endif
- QString toString(const QDate &date, QStringView formatStr) const;
- QString toString(const QTime &time, QStringView formatStr) const;
+ QString toString(QDate date, QStringView formatStr) const;
+ QString toString(QTime time, QStringView formatStr) const;
QString toString(const QDateTime &dateTime, QStringView format) const;
- QString toString(const QDate &date, FormatType format = LongFormat) const;
- QString toString(const QTime &time, FormatType format = LongFormat) const;
+ QString toString(QDate date, FormatType format = LongFormat) const;
+ QString toString(QTime time, FormatType format = LongFormat) const;
QString toString(const QDateTime &dateTime, FormatType format = LongFormat) const;
/* Removing default value for `format' is done intentionally,
* after all tests we will remove non-calendar-aware version of these functions,
* and add a default value for both calendar instance, and format
*/
- QString toString(const QDate &date, QStringView formatStr, QCalendar cal) const;
- QString toString(const QDate &date, FormatType format, QCalendar cal) const;
+ QString toString(QDate date, QStringView formatStr, QCalendar cal) const;
+ QString toString(QDate date, FormatType format, QCalendar cal) const;
QString toString(const QDateTime &dateTime, FormatType format, QCalendar cal) const;
QString toString(const QDateTime &dateTime, QStringView formatStr, QCalendar cal) const;
@@ -1049,15 +1049,13 @@ public:
# endif // 5.15
#endif
- // ### Qt 6: We need to return QString from these function since
- // UTF-16 may need surrogate pairs to represent these fields.
- QChar decimalPoint() const;
- QChar groupSeparator() const;
- QChar percent() const;
- QChar zeroDigit() const;
- QChar negativeSign() const;
- QChar positiveSign() const;
- QChar exponential() const;
+ QString decimalPoint() const;
+ QString groupSeparator() const;
+ QString percent() const;
+ QString zeroDigit() const;
+ QString negativeSign() const;
+ QString positiveSign() const;
+ QString exponential() const;
QString monthName(int, FormatType format = LongFormat) const;
QString standaloneMonthName(int, FormatType format = LongFormat) const;
@@ -1133,7 +1131,7 @@ private:
friend class QSystemLocale;
friend class QCalendarBackend;
friend class QGregorianCalendar;
- friend Q_CORE_EXPORT uint qHash(const QLocale &key, uint seed) noexcept;
+ friend Q_CORE_EXPORT size_t qHash(const QLocale &key, size_t seed) noexcept;
QSharedDataPointer<QLocalePrivate> d;
};
diff --git a/src/corelib/text/qlocale_data_p.h b/src/corelib/text/qlocale_data_p.h
index c2d0035766..0501c59e1a 100644
--- a/src/corelib/text/qlocale_data_p.h
+++ b/src/corelib/text/qlocale_data_p.h
@@ -77,7 +77,7 @@ static const int ImperialMeasurementSystemsCount =
// GENERATED PART STARTS HERE
/*
- This part of the file was generated on 2020-03-18 from the
+ This part of the file was generated on 2020-04-07 from the
Common Locale Data Repository v36
http://www.unicode.org/cldr/
@@ -1175,7 +1175,7 @@ static const quint16 locale_index[] = {
0, // Buginese
0, // Buhid
0, // Carian
- 0, // Chakma
+ 556, // Chakma
0, // Classical Mandaic
0, // Coptic
0, // Dogri
@@ -1193,7 +1193,7 @@ static const quint16 locale_index[] = {
0, // Lycian
0, // Lydian
0, // Mandingo
- 556, // Manipuri
+ 558, // Manipuri
0, // Meroitic
0, // Northern Thai
0, // Old Irish
@@ -1212,26 +1212,26 @@ static const quint16 locale_index[] = {
0, // Sora
0, // Sylheti
0, // Tagbanwa
- 557, // Tai Dam
+ 559, // Tai Dam
0, // Tai Nua
0, // Ugaritic
- 558, // Akoose
- 559, // Lakota
- 560, // Standard Moroccan Tamazight
- 561, // Mapuche
- 562, // Central Kurdish
- 564, // Lower Sorbian
- 565, // Upper Sorbian
- 566, // Kenyang
- 567, // Mohawk
- 568, // Nko
- 569, // Prussian
- 570, // Kiche
- 571, // Southern Sami
- 572, // Lule Sami
- 573, // Inari Sami
- 574, // Skolt Sami
- 575, // Warlpiri
+ 560, // Akoose
+ 561, // Lakota
+ 562, // Standard Moroccan Tamazight
+ 563, // Mapuche
+ 564, // Central Kurdish
+ 566, // Lower Sorbian
+ 567, // Upper Sorbian
+ 568, // Kenyang
+ 569, // Mohawk
+ 570, // Nko
+ 571, // Prussian
+ 572, // Kiche
+ 573, // Southern Sami
+ 574, // Lule Sami
+ 575, // Inari Sami
+ 576, // Skolt Sami
+ 577, // Warlpiri
0, // Manichaean Middle Persian
0, // Mende
0, // Ancient North Arabian
@@ -1249,10 +1249,10 @@ static const quint16 locale_index[] = {
0, // Bhojpuri
0, // Hieroglyphic Luwian
0, // Literary Chinese
- 576, // Mazanderani
+ 578, // Mazanderani
0, // Mru
0, // Newari
- 577, // Northern Luri
+ 579, // Northern Luri
0, // Palauan
0, // Papiamento
0, // Saraiki
@@ -1260,1995 +1260,1978 @@ static const quint16 locale_index[] = {
0, // Tok Pisin
0, // Tuvalu
0, // Uncoded Languages
- 579, // Cantonese
- 581, // Osage
+ 581, // Cantonese
+ 583, // Osage
0, // Tangut
- 582, // Ido
- 583, // Lojban
- 584, // Sicilian
- 585, // Southern Kurdish
- 586, // Western Balochi
- 587, // Cebuano
- 588, // Erzya
- 589, // Chickasaw
- 590, // Muscogee
- 591, // Silesian
+ 584, // Ido
+ 585, // Lojban
+ 586, // Sicilian
+ 587, // Southern Kurdish
+ 588, // Western Balochi
+ 589, // Cebuano
+ 590, // Erzya
+ 591, // Chickasaw
+ 592, // Muscogee
+ 593, // Silesian
0 // trailing 0
};
static const QLocaleData locale_data[] = {
- // lang script terr dec group list prcnt zero minus plus exp quotOpn quotEnd altQtOpn altQtEnd lpStart lpMid lpEnd lpTwo sDtFmt lDtFmt sTmFmt lTmFmt ssDays slDays snDays sDays lDays nDays am pm byte siQuant iecQuant currISO currSym currDsply currFmt currFmtNeg endoLang endoCntry curDgt curRnd dow1st wknd+ wknd-
- { 1, 0, 0, 46, 44, 59, 37, 48, 45, 43, 101, 34, 34, 39, 39, 0,6 , 0,6 , 0,6 , 0,6 , 0,10 , 10,17 , 0,8 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 0,7 , 0,4 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // C/AnyScript/AnyCountry
- { 3, 7, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 35,18 , 18,7 , 25,12 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,2 , 7,24 , 4,4 , 4,0 , 0,6 , 6,10 , 2, 1, 7, 6, 7 }, // Oromo/Latin/Ethiopia
- { 3, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 35,18 , 37,5 , 8,10 , 113,28 , 141,55 , 196,14 , 113,28 , 141,55 , 196,14 , 2,2 , 2,2 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 0,7 , 4,4 , 4,0 , 0,6 , 16,8 , 2, 1, 7, 6, 7 }, // Oromo/Latin/Kenya
- { 4, 7, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Afar/Latin/Ethiopia
- { 5, 7, 195, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 6,8 , 6,8 , 53,10 , 80,17 , 37,5 , 8,10 , 210,28 , 238,58 , 296,14 , 210,28 , 238,58 , 296,14 , 4,3 , 4,3 , 49,5 , 5,17 , 22,23 , {90,65,82}, 5,1 , 31,67 , 4,4 , 13,6 , 24,9 , 33,11 , 2, 1, 7, 6, 7 }, // Afrikaans/Latin/South Africa
- { 5, 7, 148, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 6,8 , 6,8 , 53,10 , 97,16 , 18,7 , 25,12 , 210,28 , 238,58 , 296,14 , 210,28 , 238,58 , 296,14 , 4,3 , 4,3 , 49,5 , 5,17 , 22,23 , {78,65,68}, 6,1 , 98,55 , 4,4 , 13,6 , 24,9 , 44,7 , 2, 1, 1, 6, 7 }, // Afrikaans/Latin/Namibia
- { 6, 7, 2, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 14,9 , 14,9 , 113,6 , 10,17 , 18,7 , 42,13 , 310,28 , 338,58 , 396,15 , 411,28 , 338,58 , 396,15 , 7,11 , 7,10 , 54,4 , 5,17 , 22,23 , {65,76,76}, 7,4 , 153,45 , 19,5 , 24,7 , 51,5 , 56,8 , 0, 0, 1, 6, 7 }, // Albanian/Latin/Albania
- { 6, 7, 127, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 14,9 , 14,9 , 113,6 , 10,17 , 37,5 , 8,10 , 310,28 , 338,58 , 396,15 , 411,28 , 338,58 , 396,15 , 7,11 , 7,10 , 54,4 , 5,17 , 22,23 , {77,75,68}, 11,3 , 198,54 , 19,5 , 24,7 , 51,5 , 64,18 , 2, 1, 1, 6, 7 }, // Albanian/Latin/Macedonia
- { 6, 7, 257, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 14,9 , 14,9 , 113,6 , 10,17 , 37,5 , 8,10 , 310,28 , 338,58 , 396,15 , 411,28 , 338,58 , 396,15 , 7,11 , 7,10 , 54,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 252,21 , 19,5 , 24,7 , 51,5 , 82,6 , 2, 1, 1, 6, 7 }, // Albanian/Latin/Kosovo
- { 7, 14, 69, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 23,6 , 23,6 , 29,9 , 38,8 , 119,10 , 63,17 , 18,7 , 25,12 , 439,27 , 466,28 , 494,14 , 439,27 , 466,28 , 494,14 , 18,3 , 17,4 , 58,3 , 61,23 , 22,23 , {69,84,66}, 15,2 , 273,34 , 4,4 , 13,6 , 88,4 , 92,5 , 2, 1, 7, 6, 7 }, // Amharic/Ethiopic/Ethiopia
- { 8, 1, 64, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {69,71,80}, 17,5 , 307,81 , 19,5 , 4,0 , 97,7 , 104,3 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Egypt
- { 8, 1, 3, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {68,90,68}, 22,5 , 388,102 , 4,4 , 13,6 , 97,7 , 107,7 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Algeria
- { 8, 1, 17, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {66,72,68}, 27,5 , 490,91 , 19,5 , 4,0 , 97,7 , 114,7 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Bahrain
- { 8, 1, 42, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {88,65,70}, 32,4 , 581,112 , 19,5 , 4,0 , 97,7 , 121,4 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Chad
- { 8, 1, 48, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 37,5 , 8,10 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {75,77,70}, 36,2 , 693,105 , 19,5 , 4,0 , 97,7 , 125,9 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Comoros
- { 8, 1, 59, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {68,74,70}, 38,3 , 798,84 , 19,5 , 4,0 , 97,7 , 134,6 , 0, 0, 6, 6, 7 }, // Arabic/Arabic/Djibouti
- { 8, 1, 67, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {69,82,78}, 41,3 , 882,91 , 19,5 , 4,0 , 97,7 , 140,7 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Eritrea
- { 8, 1, 103, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {73,81,68}, 44,5 , 973,84 , 19,5 , 4,0 , 97,7 , 147,6 , 0, 0, 6, 5, 6 }, // Arabic/Arabic/Iraq
- { 8, 1, 105, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 55,4 , 59,9 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {73,76,83}, 49,1 , 1057,133 , 19,5 , 4,0 , 97,7 , 153,7 , 2, 1, 7, 5, 6 }, // Arabic/Arabic/Israel
- { 8, 1, 109, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {74,79,68}, 50,5 , 1190,84 , 19,5 , 4,0 , 97,7 , 160,6 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Jordan
- { 8, 1, 115, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {75,87,68}, 55,5 , 1274,84 , 19,5 , 4,0 , 97,7 , 166,6 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Kuwait
- { 8, 1, 119, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {76,66,80}, 60,5 , 1358,84 , 19,5 , 4,0 , 97,7 , 172,5 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Lebanon
- { 8, 1, 122, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {76,89,68}, 65,5 , 1442,88 , 4,4 , 13,6 , 97,7 , 177,5 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Libya
- { 8, 1, 136, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {77,82,85}, 70,4 , 1530,112 , 19,5 , 4,0 , 97,7 , 182,9 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Mauritania
- { 8, 1, 145, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 37,5 , 8,10 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {77,65,68}, 74,5 , 1642,87 , 4,4 , 13,6 , 97,7 , 191,6 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Morocco
- { 8, 1, 162, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {79,77,82}, 79,5 , 1729,77 , 19,5 , 4,0 , 97,7 , 197,5 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Oman
- { 8, 1, 165, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {73,76,83}, 49,1 , 1057,133 , 19,5 , 4,0 , 97,7 , 202,18 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Palestinian Territories
- { 8, 1, 175, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {81,65,82}, 84,5 , 1806,70 , 19,5 , 4,0 , 97,7 , 220,3 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Qatar
- { 8, 1, 186, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,65,82}, 89,5 , 1876,77 , 19,5 , 4,0 , 97,7 , 223,24 , 2, 1, 7, 5, 6 }, // Arabic/Arabic/Saudi Arabia
- { 8, 1, 194, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,79,83}, 94,1 , 1953,77 , 19,5 , 4,0 , 97,7 , 247,7 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Somalia
- { 8, 1, 201, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,68,71}, 95,4 , 2030,91 , 19,5 , 4,0 , 97,7 , 254,7 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Sudan
- { 8, 1, 207, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,89,80}, 99,5 , 2121,77 , 19,5 , 4,0 , 97,7 , 261,5 , 0, 0, 6, 5, 6 }, // Arabic/Arabic/Syria
- { 8, 1, 216, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {84,78,68}, 104,5 , 2198,95 , 4,4 , 13,6 , 97,7 , 266,4 , 3, 0, 1, 6, 7 }, // Arabic/Arabic/Tunisia
- { 8, 1, 223, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {65,69,68}, 109,5 , 2293,91 , 19,5 , 4,0 , 97,7 , 270,24 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/United Arab Emirates
- { 8, 1, 236, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {77,65,68}, 74,5 , 1642,87 , 4,4 , 13,6 , 97,7 , 294,15 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Western Sahara
- { 8, 1, 237, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {89,69,82}, 114,5 , 2384,70 , 19,5 , 4,0 , 97,7 , 309,5 , 0, 0, 7, 5, 6 }, // Arabic/Arabic/Yemen
- { 8, 1, 254, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,83,80}, 119,1 , 2454,132 , 19,5 , 4,0 , 97,7 , 314,12 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/South Sudan
- { 8, 1, 260, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 46,6 , 46,6 , 129,10 , 139,17 , 18,7 , 25,12 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 19,5 , 4,0 , 326,22 , 348,6 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/World
- { 9, 10, 11, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 52,7 , 52,7 , 156,8 , 164,20 , 37,5 , 8,10 , 574,28 , 602,62 , 664,14 , 574,28 , 602,62 , 664,14 , 0,2 , 0,2 , 135,6 , 141,17 , 22,23 , {65,77,68}, 120,1 , 2586,46 , 19,5 , 4,0 , 354,7 , 361,8 , 2, 0, 1, 6, 7 }, // Armenian/Armenian/Armenia
- { 10, 11, 100, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 59,9 , 59,9 , 184,8 , 192,18 , 68,7 , 75,12 , 678,32 , 710,58 , 768,14 , 678,32 , 710,58 , 768,14 , 22,9 , 22,7 , 158,4 , 162,37 , 22,23 , {73,78,82}, 121,1 , 2632,43 , 8,5 , 4,0 , 369,7 , 376,4 , 2, 1, 7, 7, 7 }, // Assamese/Bengali/India
- { 12, 7, 15, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 68,8 , 68,8 , 156,8 , 210,17 , 37,5 , 8,10 , 782,27 , 809,67 , 99,14 , 876,27 , 809,67 , 99,14 , 0,2 , 0,2 , 199,4 , 5,17 , 22,23 , {65,90,78}, 122,1 , 2675,58 , 19,5 , 4,0 , 380,10 , 390,10 , 2, 1, 1, 6, 7 }, // Azerbaijani/Latin/Azerbaijan
- { 12, 1, 102, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 6, 5, 5 }, // Azerbaijani/Arabic/Iran
- { 12, 2, 15, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 0,6 , 0,6 , 156,8 , 210,17 , 37,5 , 8,10 , 903,27 , 930,67 , 99,14 , 903,27 , 930,67 , 99,14 , 31,2 , 29,2 , 45,4 , 5,17 , 22,23 , {65,90,78}, 122,1 , 2733,12 , 19,5 , 4,0 , 400,10 , 410,10 , 2, 1, 1, 6, 7 }, // Azerbaijani/Cyrillic/Azerbaijan
- { 13, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Bashkir/Cyrillic/Russia
- { 14, 7, 197, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8220, 8221, 0,6 , 0,6 , 76,9 , 76,9 , 227,6 , 233,36 , 37,5 , 87,12 , 997,28 , 1025,68 , 1093,14 , 997,28 , 1025,68 , 1093,14 , 0,2 , 0,2 , 203,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 2745,20 , 19,5 , 24,7 , 420,7 , 427,8 , 2, 1, 1, 6, 7 }, // Basque/Latin/Spain
- { 15, 11, 18, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 85,9 , 85,9 , 269,6 , 192,18 , 18,7 , 25,12 , 1107,37 , 1144,58 , 1202,18 , 1107,37 , 1144,58 , 1202,18 , 0,2 , 0,2 , 158,4 , 5,17 , 22,23 , {66,68,84}, 124,1 , 2765,49 , 0,4 , 31,6 , 435,5 , 440,8 , 2, 1, 7, 6, 7 }, // Bengali/Bengali/Bangladesh
- { 15, 11, 100, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 85,9 , 85,9 , 269,6 , 192,18 , 18,7 , 25,12 , 1107,37 , 1144,58 , 1202,18 , 1107,37 , 1144,58 , 1202,18 , 0,2 , 0,2 , 158,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 2814,43 , 0,4 , 31,6 , 435,5 , 448,4 , 2, 1, 7, 7, 7 }, // Bengali/Bengali/India
- { 16, 31, 25, 46, 44, 59, 37, 3872, 45, 43, 101, 8220, 8221, 8216, 8217, 94,9 , 94,9 , 94,9 , 94,9 , 53,10 , 275,30 , 99,22 , 121,27 , 1220,34 , 1254,79 , 1333,27 , 1220,34 , 1254,79 , 1333,27 , 33,5 , 31,6 , 45,4 , 5,17 , 22,23 , {66,84,78}, 125,3 , 2857,15 , 4,4 , 4,0 , 452,6 , 458,5 , 2, 1, 7, 6, 7 }, // Dzongkha/Tibetan/Bhutan
- { 19, 7, 74, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 103,8 , 103,8 , 119,10 , 97,16 , 37,5 , 8,10 , 1360,33 , 1393,43 , 1436,18 , 1360,33 , 1393,43 , 1436,18 , 38,4 , 37,4 , 210,7 , 217,17 , 234,23 , {69,85,82}, 14,1 , 2872,36 , 19,5 , 4,0 , 463,9 , 472,5 , 2, 1, 1, 6, 7 }, // Breton/Latin/France
- { 20, 2, 33, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 305,12 , 317,22 , 55,4 , 59,9 , 1454,21 , 1475,55 , 1530,14 , 1454,21 , 1475,55 , 1530,14 , 42,6 , 41,6 , 257,7 , 5,17 , 22,23 , {66,71,78}, 128,3 , 2908,47 , 19,5 , 24,7 , 477,9 , 486,8 , 2, 1, 1, 6, 7 }, // Bulgarian/Cyrillic/Bulgaria
- { 21, 25, 147, 46, 44, 4170, 37, 4160, 45, 43, 101, 8220, 8221, 8216, 8217, 118,5 , 118,5 , 123,10 , 123,10 , 339,8 , 347,18 , 148,6 , 154,10 , 1544,54 , 1544,54 , 1598,14 , 1544,54 , 1544,54 , 1598,14 , 48,5 , 47,3 , 264,5 , 5,17 , 22,23 , {77,77,75}, 131,1 , 2955,29 , 8,5 , 4,0 , 494,6 , 494,6 , 0, 0, 7, 6, 7 }, // Burmese/Myanmar/Myanmar
- { 22, 2, 20, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 133,7 , 133,7 , 365,7 , 317,22 , 37,5 , 164,11 , 1612,21 , 1633,56 , 1689,14 , 1612,21 , 1633,56 , 1689,14 , 0,2 , 0,2 , 269,5 , 274,17 , 22,23 , {66,89,78}, 0,2 , 2984,89 , 19,5 , 4,0 , 500,10 , 510,8 , 2, 0, 1, 6, 7 }, // Belarusian/Cyrillic/Belarus
- { 23, 20, 36, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 140,9 , 149,9 , 269,6 , 97,16 , 18,7 , 25,12 , 1703,40 , 1743,46 , 1789,14 , 1703,40 , 1803,47 , 1789,14 , 0,2 , 0,2 , 291,2 , 5,17 , 22,23 , {75,72,82}, 132,1 , 3073,29 , 0,4 , 31,6 , 518,5 , 523,7 , 2, 1, 7, 6, 7 }, // Khmer/Khmer/Cambodia
- { 24, 7, 197, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 158,7 , 158,7 , 269,6 , 372,22 , 55,4 , 59,9 , 1850,28 , 1878,60 , 1938,21 , 1850,28 , 1878,60 , 1938,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 530,6 , 536,7 , 2, 1, 1, 6, 7 }, // Catalan/Latin/Spain
- { 24, 7, 5, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 158,7 , 158,7 , 269,6 , 372,22 , 55,4 , 59,9 , 1850,28 , 1878,60 , 1938,21 , 1850,28 , 1878,60 , 1938,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 530,6 , 543,7 , 2, 1, 1, 6, 7 }, // Catalan/Latin/Andorra
- { 24, 7, 74, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 158,7 , 158,7 , 269,6 , 372,22 , 55,4 , 59,9 , 1850,28 , 1878,60 , 1938,21 , 1850,28 , 1878,60 , 1938,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 530,6 , 550,6 , 2, 1, 1, 6, 7 }, // Catalan/Latin/France
- { 24, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 158,7 , 158,7 , 269,6 , 372,22 , 55,4 , 59,9 , 1850,28 , 1878,60 , 1938,21 , 1850,28 , 1878,60 , 1938,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 530,6 , 556,6 , 2, 1, 1, 6, 7 }, // Catalan/Latin/Italy
- { 25, 5, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 165,5 , 165,5 , 170,5 , 170,5 , 394,8 , 402,13 , 175,6 , 181,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 293,2 , 295,21 , 22,23 , {67,78,89}, 133,1 , 3122,13 , 4,4 , 13,6 , 562,4 , 566,2 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/China
- { 25, 5, 97, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 165,5 , 165,5 , 170,5 , 170,5 , 269,6 , 402,13 , 175,6 , 181,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 293,2 , 295,21 , 22,23 , {72,75,68}, 134,3 , 3135,11 , 4,4 , 13,6 , 562,4 , 568,9 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Hong Kong
- { 25, 5, 126, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 165,5 , 165,5 , 170,5 , 170,5 , 269,6 , 402,13 , 175,6 , 181,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 293,2 , 295,21 , 22,23 , {77,79,80}, 137,4 , 3146,13 , 4,4 , 13,6 , 562,4 , 577,9 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Macau
- { 25, 5, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 165,5 , 165,5 , 170,5 , 170,5 , 27,8 , 402,13 , 175,6 , 181,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 293,2 , 295,21 , 22,23 , {83,71,68}, 6,1 , 3159,15 , 4,4 , 13,6 , 562,4 , 586,3 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Singapore
- { 25, 6, 97, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 165,5 , 165,5 , 175,5 , 175,5 , 415,8 , 402,13 , 175,6 , 192,13 , 2022,21 , 1980,28 , 2008,14 , 2022,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 316,3 , 5,17 , 22,23 , {72,75,68}, 134,3 , 3135,11 , 4,4 , 13,6 , 589,4 , 593,9 , 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Hong Kong
- { 25, 6, 126, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 165,5 , 165,5 , 175,5 , 175,5 , 415,8 , 402,13 , 175,6 , 192,13 , 2022,21 , 1980,28 , 2008,14 , 2022,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 316,3 , 5,17 , 22,23 , {77,79,80}, 137,4 , 3174,13 , 4,4 , 13,6 , 589,4 , 602,9 , 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Macau
- { 25, 6, 208, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 165,5 , 165,5 , 170,5 , 170,5 , 394,8 , 423,14 , 175,6 , 192,13 , 2022,21 , 1980,28 , 2008,14 , 2022,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 45,4 , 5,17 , 22,23 , {84,87,68}, 6,1 , 3187,13 , 4,4 , 13,6 , 589,4 , 611,2 , 2, 0, 7, 6, 7 }, // Chinese/Traditional Han/Taiwan
- { 26, 7, 74, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Corsican/Latin/France
- { 27, 7, 54, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 158,7 , 158,7 , 437,13 , 450,19 , 37,5 , 87,12 , 2043,28 , 2071,58 , 2129,14 , 2043,28 , 2071,58 , 2143,14 , 0,2 , 0,2 , 319,7 , 5,17 , 22,23 , {72,82,75}, 141,3 , 3200,60 , 19,5 , 4,0 , 613,8 , 621,8 , 2, 1, 1, 6, 7 }, // Croatian/Latin/Croatia
- { 27, 7, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 158,7 , 158,7 , 469,9 , 450,19 , 37,5 , 87,12 , 2043,28 , 2071,58 , 2143,14 , 2043,28 , 2071,58 , 2143,14 , 0,2 , 0,2 , 319,7 , 5,17 , 22,23 , {66,65,77}, 144,2 , 3260,85 , 19,5 , 4,0 , 613,8 , 629,19 , 2, 1, 1, 6, 7 }, // Croatian/Latin/Bosnia And Herzegowina
- { 28, 7, 57, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 180,7 , 180,7 , 156,8 , 478,17 , 55,4 , 59,9 , 2157,21 , 2178,49 , 2227,14 , 2157,21 , 2178,49 , 2227,14 , 60,4 , 57,4 , 326,5 , 5,17 , 22,23 , {67,90,75}, 146,2 , 3345,68 , 19,5 , 4,0 , 648,7 , 655,5 , 2, 0, 1, 6, 7 }, // Czech/Latin/Czech Republic
- { 29, 7, 58, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 187,8 , 187,8 , 495,10 , 505,23 , 205,5 , 210,10 , 2241,28 , 2269,51 , 2320,14 , 2334,35 , 2269,51 , 2320,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {68,75,75}, 148,3 , 3413,42 , 19,5 , 4,0 , 660,5 , 665,7 , 2, 0, 1, 6, 7 }, // Danish/Latin/Denmark
- { 29, 7, 86, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 187,8 , 187,8 , 495,10 , 505,23 , 205,5 , 210,10 , 2241,28 , 2269,51 , 2320,14 , 2334,35 , 2269,51 , 2320,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {68,75,75}, 148,3 , 3413,42 , 19,5 , 4,0 , 660,5 , 672,8 , 2, 0, 1, 6, 7 }, // Danish/Latin/Greenland
- { 30, 7, 151, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 2369,21 , 2390,59 , 2449,14 , 2369,21 , 2390,59 , 2449,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3455,19 , 8,5 , 37,7 , 680,10 , 690,9 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Netherlands
- { 30, 7, 12, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 2369,21 , 2390,59 , 2449,14 , 2369,21 , 2390,59 , 2449,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {65,87,71}, 151,4 , 3474,55 , 8,5 , 37,7 , 680,10 , 699,5 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Aruba
- { 30, 7, 21, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 538,9 , 97,16 , 37,5 , 8,10 , 2369,21 , 2390,59 , 2449,14 , 2369,21 , 2390,59 , 2449,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3455,19 , 8,5 , 37,7 , 680,10 , 704,6 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Belgium
- { 30, 7, 152, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 2369,21 , 2390,59 , 2449,14 , 2369,21 , 2390,59 , 2449,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {65,78,71}, 155,4 , 3529,97 , 8,5 , 37,7 , 680,10 , 710,7 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Cura Sao
- { 30, 7, 202, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 2369,21 , 2390,59 , 2449,14 , 2369,21 , 2390,59 , 2449,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {83,82,68}, 6,1 , 3626,58 , 8,5 , 37,7 , 680,10 , 717,8 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Suriname
- { 30, 7, 255, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 2369,21 , 2390,59 , 2449,14 , 2369,21 , 2390,59 , 2449,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3684,61 , 8,5 , 37,7 , 680,10 , 725,19 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Bonaire
- { 30, 7, 256, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 2369,21 , 2390,59 , 2449,14 , 2369,21 , 2390,59 , 2449,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {65,78,71}, 155,4 , 3529,97 , 8,5 , 37,7 , 680,10 , 744,12 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Sint Maarten
- { 31, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 195,10 , 205,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 13,6 , 756,16 , 772,13 , 2, 1, 7, 6, 7 }, // English/Latin/United States
- { 31, 3, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // English/Deseret/United States
- { 31, 7, 4, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 195,10 , 205,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 13,6 , 785,7 , 792,14 , 2, 1, 7, 6, 7 }, // English/Latin/American Samoa
- { 31, 7, 7, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 13,6 , 785,7 , 806,8 , 2, 1, 1, 6, 7 }, // English/Latin/Anguilla
- { 31, 7, 9, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 13,6 , 785,7 , 814,17 , 2, 1, 7, 6, 7 }, // English/Latin/Antigua And Barbuda
- { 31, 7, 13, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 269,6 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 2463,25 , 0,28 , 28,57 , 2463,25 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 13,6 , 831,18 , 849,9 , 2, 1, 7, 6, 7 }, // English/Latin/Australia
- { 31, 7, 14, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 8,5 , 4,0 , 785,7 , 858,7 , 2, 1, 1, 6, 7 }, // English/Latin/Austria
- { 31, 7, 16, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {66,83,68}, 6,1 , 3930,53 , 4,4 , 13,6 , 785,7 , 865,7 , 2, 1, 7, 6, 7 }, // English/Latin/Bahamas
- { 31, 7, 19, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {66,66,68}, 6,1 , 3983,56 , 4,4 , 13,6 , 785,7 , 872,8 , 2, 1, 1, 6, 7 }, // English/Latin/Barbados
- { 31, 7, 21, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 27,8 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 19,5 , 4,0 , 785,7 , 880,7 , 2, 1, 1, 6, 7 }, // English/Latin/Belgium
- { 31, 7, 22, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 27,8 , 553,18 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {66,90,68}, 6,1 , 4039,47 , 4,4 , 13,6 , 785,7 , 887,6 , 2, 1, 7, 6, 7 }, // English/Latin/Belize
- { 31, 7, 24, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {66,77,68}, 6,1 , 4086,53 , 4,4 , 13,6 , 785,7 , 893,7 , 2, 1, 1, 6, 7 }, // English/Latin/Bermuda
- { 31, 7, 28, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 27,8 , 553,18 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {66,87,80}, 162,1 , 4139,50 , 4,4 , 13,6 , 785,7 , 900,8 , 2, 1, 7, 6, 7 }, // English/Latin/Botswana
- { 31, 7, 31, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 159,3 , 3745,35 , 4,4 , 13,6 , 785,7 , 908,30 , 2, 1, 1, 6, 7 }, // English/Latin/British Indian Ocean Territory
- { 31, 7, 35, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 195,10 , 205,9 , 547,6 , 35,18 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {66,73,70}, 163,3 , 4189,53 , 4,4 , 13,6 , 785,7 , 938,7 , 0, 0, 1, 6, 7 }, // English/Latin/Burundi
- { 31, 7, 37, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,65,70}, 32,4 , 4242,83 , 4,4 , 13,6 , 785,7 , 945,8 , 0, 0, 1, 6, 7 }, // English/Latin/Cameroon
- { 31, 7, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 53,10 , 35,18 , 18,7 , 25,12 , 2488,35 , 28,57 , 85,14 , 2488,35 , 28,57 , 85,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {67,65,68}, 6,1 , 4325,53 , 4,4 , 13,6 , 953,16 , 969,6 , 2, 0, 7, 6, 7 }, // English/Latin/Canada
- { 31, 7, 40, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {75,89,68}, 6,1 , 4378,71 , 4,4 , 13,6 , 785,7 , 975,14 , 2, 1, 1, 6, 7 }, // English/Latin/Cayman Islands
- { 31, 7, 45, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 13,6 , 785,7 , 989,16 , 2, 1, 1, 6, 7 }, // English/Latin/Christmas Island
- { 31, 7, 46, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 13,6 , 785,7 , 1005,23 , 2, 1, 1, 6, 7 }, // English/Latin/Cocos Islands
- { 31, 7, 51, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,90,68}, 6,1 , 4449,62 , 4,4 , 13,6 , 785,7 , 1028,12 , 2, 1, 1, 6, 7 }, // English/Latin/Cook Islands
- { 31, 7, 56, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 4,4 , 13,6 , 785,7 , 1040,6 , 2, 1, 1, 6, 7 }, // English/Latin/Cyprus
- { 31, 7, 58, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 205,5 , 210,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {68,75,75}, 148,3 , 4511,44 , 19,5 , 4,0 , 785,7 , 1046,7 , 2, 0, 1, 6, 7 }, // English/Latin/Denmark
- { 31, 7, 60, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 13,6 , 785,7 , 1053,8 , 2, 1, 7, 6, 7 }, // English/Latin/Dominica
- { 31, 7, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,82,78}, 41,3 , 4555,50 , 4,4 , 13,6 , 785,7 , 1061,7 , 2, 1, 1, 6, 7 }, // English/Latin/Eritrea
- { 31, 7, 70, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {70,75,80}, 119,1 , 4605,74 , 4,4 , 13,6 , 785,7 , 1068,16 , 2, 1, 1, 6, 7 }, // English/Latin/Falkland Islands
- { 31, 7, 72, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {70,74,68}, 6,1 , 4679,47 , 4,4 , 13,6 , 785,7 , 1084,4 , 2, 1, 1, 6, 7 }, // English/Latin/Fiji
- { 31, 7, 73, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 220,4 , 224,9 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 19,5 , 4,0 , 785,7 , 1088,7 , 2, 1, 1, 6, 7 }, // English/Latin/Finland
- { 31, 7, 75, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,66,80}, 119,1 , 4726,32 , 4,4 , 13,6 , 785,7 , 1095,8 , 2, 1, 1, 6, 7 }, // English/Latin/Guernsey
- { 31, 7, 80, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,77,68}, 166,1 , 4758,50 , 4,4 , 13,6 , 785,7 , 1103,6 , 2, 1, 1, 6, 7 }, // English/Latin/Gambia
- { 31, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 19,5 , 4,0 , 785,7 , 1109,7 , 2, 1, 1, 6, 7 }, // English/Latin/Germany
- { 31, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,72,83}, 167,3 , 4808,47 , 4,4 , 13,6 , 785,7 , 1116,5 , 2, 1, 1, 6, 7 }, // English/Latin/Ghana
- { 31, 7, 84, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,73,80}, 119,1 , 4855,53 , 4,4 , 13,6 , 785,7 , 1121,9 , 2, 1, 1, 6, 7 }, // English/Latin/Gibraltar
- { 31, 7, 87, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 13,6 , 785,7 , 1130,7 , 2, 1, 1, 6, 7 }, // English/Latin/Grenada
- { 31, 7, 89, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 195,10 , 205,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 13,6 , 785,7 , 1137,4 , 2, 1, 7, 6, 7 }, // English/Latin/Guam
- { 31, 7, 93, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,89,68}, 6,1 , 4908,56 , 4,4 , 13,6 , 785,7 , 1141,6 , 2, 0, 1, 6, 7 }, // English/Latin/Guyana
- { 31, 7, 97, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 415,8 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {72,75,68}, 134,3 , 4964,56 , 4,4 , 13,6 , 785,7 , 1147,19 , 2, 1, 7, 6, 7 }, // English/Latin/Hong Kong
- { 31, 7, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 27,8 , 192,18 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {73,78,82}, 121,1 , 5020,44 , 4,4 , 13,6 , 785,7 , 1166,5 , 2, 1, 7, 7, 7 }, // English/Latin/India
- { 31, 7, 104, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 97,16 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 4,4 , 13,6 , 785,7 , 1171,7 , 2, 1, 1, 6, 7 }, // English/Latin/Ireland
- { 31, 7, 105, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 55,4 , 59,9 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {73,76,83}, 49,1 , 5064,62 , 4,4 , 13,6 , 785,7 , 1178,6 , 2, 1, 7, 5, 6 }, // English/Latin/Israel
- { 31, 7, 107, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 269,6 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {74,77,68}, 6,1 , 5126,53 , 4,4 , 13,6 , 785,7 , 1184,7 , 2, 1, 7, 6, 7 }, // English/Latin/Jamaica
- { 31, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {75,69,83}, 2,3 , 5179,53 , 4,4 , 13,6 , 785,7 , 1191,5 , 2, 1, 7, 6, 7 }, // English/Latin/Kenya
- { 31, 7, 112, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 13,6 , 785,7 , 1196,8 , 2, 1, 1, 6, 7 }, // English/Latin/Kiribati
- { 31, 7, 120, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {90,65,82}, 5,1 , 5232,61 , 4,4 , 13,6 , 785,7 , 1204,7 , 2, 1, 1, 6, 7 }, // English/Latin/Lesotho
- { 31, 7, 121, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {76,82,68}, 6,1 , 5293,53 , 4,4 , 13,6 , 785,7 , 1211,7 , 2, 1, 1, 6, 7 }, // English/Latin/Liberia
- { 31, 7, 126, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {77,79,80}, 137,4 , 5346,53 , 4,4 , 13,6 , 785,7 , 1218,15 , 2, 1, 7, 6, 7 }, // English/Latin/Macau
- { 31, 7, 128, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {77,71,65}, 170,2 , 5399,54 , 4,4 , 13,6 , 785,7 , 1233,10 , 0, 0, 1, 6, 7 }, // English/Latin/Madagascar
- { 31, 7, 129, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {77,87,75}, 172,2 , 5453,53 , 4,4 , 13,6 , 785,7 , 1243,6 , 2, 1, 1, 6, 7 }, // English/Latin/Malawi
- { 31, 7, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {77,89,82}, 174,2 , 5506,59 , 4,4 , 13,6 , 785,7 , 1249,8 , 2, 1, 1, 6, 7 }, // English/Latin/Malaysia
- { 31, 7, 133, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 4,4 , 13,6 , 785,7 , 1257,5 , 2, 1, 7, 6, 7 }, // English/Latin/Malta
- { 31, 7, 134, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 195,10 , 205,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 13,6 , 785,7 , 1262,16 , 2, 1, 7, 6, 7 }, // English/Latin/Marshall Islands
- { 31, 7, 137, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {77,85,82}, 176,2 , 5565,53 , 4,4 , 13,6 , 785,7 , 1278,9 , 2, 0, 1, 6, 7 }, // English/Latin/Mauritius
- { 31, 7, 140, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 159,3 , 3745,35 , 4,4 , 13,6 , 785,7 , 1287,10 , 2, 1, 1, 6, 7 }, // English/Latin/Micronesia
- { 31, 7, 144, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 13,6 , 785,7 , 1297,10 , 2, 1, 1, 6, 7 }, // English/Latin/Montserrat
- { 31, 7, 148, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,65,68}, 6,1 , 5618,53 , 4,4 , 13,6 , 785,7 , 1307,7 , 2, 1, 1, 6, 7 }, // English/Latin/Namibia
- { 31, 7, 149, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 13,6 , 785,7 , 1314,5 , 2, 1, 1, 6, 7 }, // English/Latin/Nauru
- { 31, 7, 151, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 8,5 , 37,7 , 785,7 , 1319,11 , 2, 1, 1, 6, 7 }, // English/Latin/Netherlands
- { 31, 7, 154, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 571,7 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,90,68}, 6,1 , 4449,62 , 4,4 , 13,6 , 785,7 , 1330,11 , 2, 1, 1, 6, 7 }, // English/Latin/New Zealand
- { 31, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,71,78}, 178,1 , 5671,50 , 4,4 , 13,6 , 785,7 , 1341,7 , 2, 1, 1, 6, 7 }, // English/Latin/Nigeria
- { 31, 7, 158, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,90,68}, 6,1 , 4449,62 , 4,4 , 13,6 , 785,7 , 1348,4 , 2, 1, 1, 6, 7 }, // English/Latin/Niue
- { 31, 7, 159, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 13,6 , 785,7 , 1352,14 , 2, 1, 1, 6, 7 }, // English/Latin/Norfolk Island
- { 31, 7, 160, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 195,10 , 205,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 13,6 , 785,7 , 1366,24 , 2, 1, 1, 6, 7 }, // English/Latin/Northern Mariana Islands
- { 31, 7, 163, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {80,75,82}, 176,2 , 5721,53 , 4,4 , 13,6 , 785,7 , 1390,8 , 2, 0, 7, 6, 7 }, // English/Latin/Pakistan
- { 31, 7, 164, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 159,3 , 3745,35 , 4,4 , 13,6 , 785,7 , 1398,5 , 2, 1, 1, 6, 7 }, // English/Latin/Palau
- { 31, 7, 167, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {80,71,75}, 131,1 , 5774,73 , 4,4 , 13,6 , 785,7 , 1403,16 , 2, 1, 1, 6, 7 }, // English/Latin/Papua New Guinea
- { 31, 7, 170, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {80,72,80}, 179,1 , 5847,53 , 4,4 , 13,6 , 785,7 , 1419,11 , 2, 1, 7, 6, 7 }, // English/Latin/Philippines
- { 31, 7, 171, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,90,68}, 6,1 , 4449,62 , 4,4 , 13,6 , 785,7 , 1430,16 , 2, 1, 1, 6, 7 }, // English/Latin/Pitcairn
- { 31, 7, 174, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 195,10 , 205,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 13,6 , 785,7 , 1446,11 , 2, 1, 7, 6, 7 }, // English/Latin/Puerto Rico
- { 31, 7, 179, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {82,87,70}, 180,2 , 5900,47 , 4,4 , 13,6 , 785,7 , 1457,6 , 0, 0, 1, 6, 7 }, // English/Latin/Rwanda
- { 31, 7, 180, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 13,6 , 785,7 , 1463,16 , 2, 1, 1, 6, 7 }, // English/Latin/Saint Kitts And Nevis
- { 31, 7, 181, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 13,6 , 785,7 , 1479,8 , 2, 1, 1, 6, 7 }, // English/Latin/Saint Lucia
- { 31, 7, 182, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 13,6 , 785,7 , 1487,23 , 2, 1, 1, 6, 7 }, // English/Latin/Saint Vincent And The Grenadines
- { 31, 7, 183, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {87,83,84}, 182,3 , 5947,40 , 4,4 , 13,6 , 785,7 , 1510,5 , 2, 1, 7, 6, 7 }, // English/Latin/Samoa
- { 31, 7, 188, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,67,82}, 185,2 , 5987,59 , 4,4 , 13,6 , 785,7 , 1515,10 , 2, 1, 1, 6, 7 }, // English/Latin/Seychelles
- { 31, 7, 189, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,76,76}, 187,2 , 6046,68 , 4,4 , 13,6 , 785,7 , 1525,12 , 0, 0, 1, 6, 7 }, // English/Latin/Sierra Leone
- { 31, 7, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 269,6 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,71,68}, 6,1 , 6114,56 , 4,4 , 13,6 , 785,7 , 1537,9 , 2, 1, 7, 6, 7 }, // English/Latin/Singapore
- { 31, 7, 192, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 19,5 , 24,7 , 785,7 , 1546,8 , 2, 1, 1, 6, 7 }, // English/Latin/Slovenia
- { 31, 7, 193, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,66,68}, 6,1 , 6170,74 , 4,4 , 13,6 , 785,7 , 1554,15 , 2, 1, 1, 6, 7 }, // English/Latin/Solomon Islands
- { 31, 7, 195, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 578,10 , 553,18 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {90,65,82}, 5,1 , 5232,61 , 4,4 , 13,6 , 785,7 , 1569,12 , 2, 1, 7, 6, 7 }, // English/Latin/South Africa
- { 31, 7, 199, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,72,80}, 119,1 , 6244,53 , 4,4 , 13,6 , 785,7 , 1581,9 , 2, 1, 1, 6, 7 }, // English/Latin/Saint Helena
- { 31, 7, 201, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,68,71}, 0,0 , 6297,50 , 4,4 , 13,6 , 785,7 , 1590,5 , 2, 1, 6, 5, 6 }, // English/Latin/Sudan
- { 31, 7, 204, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,90,76}, 189,1 , 6347,53 , 4,4 , 13,6 , 785,7 , 1595,8 , 2, 1, 1, 6, 7 }, // English/Latin/Swaziland
- { 31, 7, 205, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 53,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,69,75}, 190,2 , 6400,47 , 19,5 , 4,0 , 785,7 , 1603,6 , 2, 0, 1, 6, 7 }, // English/Latin/Sweden
- { 31, 7, 206, 46, 8217, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {67,72,70}, 0,0 , 6447,41 , 8,5 , 44,5 , 785,7 , 1609,11 , 2, 0, 1, 6, 7 }, // English/Latin/Switzerland
- { 31, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {84,90,83}, 192,3 , 6488,62 , 4,4 , 13,6 , 785,7 , 1620,8 , 2, 0, 1, 6, 7 }, // English/Latin/Tanzania
- { 31, 7, 213, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,90,68}, 6,1 , 4449,62 , 4,4 , 13,6 , 785,7 , 1628,7 , 2, 1, 1, 6, 7 }, // English/Latin/Tokelau
- { 31, 7, 214, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {84,79,80}, 195,2 , 6550,49 , 4,4 , 13,6 , 785,7 , 1635,5 , 2, 1, 1, 6, 7 }, // English/Latin/Tonga
- { 31, 7, 215, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {84,84,68}, 6,1 , 6599,80 , 4,4 , 13,6 , 785,7 , 1640,17 , 2, 1, 7, 6, 7 }, // English/Latin/Trinidad And Tobago
- { 31, 7, 219, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 159,3 , 3745,35 , 4,4 , 13,6 , 785,7 , 1657,22 , 2, 1, 1, 6, 7 }, // English/Latin/Turks And Caicos Islands
- { 31, 7, 220, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 13,6 , 785,7 , 1679,6 , 2, 1, 1, 6, 7 }, // English/Latin/Tuvalu
- { 31, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,71,88}, 197,3 , 6679,56 , 4,4 , 13,6 , 785,7 , 1685,6 , 0, 0, 1, 7, 7 }, // English/Latin/Uganda
- { 31, 7, 223, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 195,10 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {65,69,68}, 200,3 , 6735,55 , 4,4 , 13,6 , 785,7 , 1691,20 , 2, 1, 6, 5, 6 }, // English/Latin/United Arab Emirates
- { 31, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,66,80}, 119,1 , 6790,47 , 4,4 , 13,6 , 1711,15 , 1726,14 , 2, 1, 1, 6, 7 }, // English/Latin/United Kingdom
- { 31, 7, 226, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 195,10 , 205,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 13,6 , 785,7 , 1740,21 , 2, 1, 7, 6, 7 }, // English/Latin/United States Minor Outlying Islands
- { 31, 7, 229, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {86,85,86}, 203,2 , 6837,44 , 4,4 , 13,6 , 785,7 , 1761,7 , 0, 0, 1, 6, 7 }, // English/Latin/Vanuatu
- { 31, 7, 233, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 159,3 , 3745,35 , 4,4 , 13,6 , 785,7 , 1768,22 , 2, 1, 1, 6, 7 }, // English/Latin/British Virgin Islands
- { 31, 7, 234, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 195,10 , 205,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 13,6 , 785,7 , 1790,19 , 2, 1, 7, 6, 7 }, // English/Latin/United States Virgin Islands
- { 31, 7, 239, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {90,77,87}, 131,1 , 6881,50 , 4,4 , 13,6 , 785,7 , 1809,6 , 2, 1, 1, 6, 7 }, // English/Latin/Zambia
- { 31, 7, 240, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 415,8 , 553,18 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 159,3 , 3745,35 , 4,4 , 13,6 , 785,7 , 1815,8 , 2, 1, 7, 6, 7 }, // English/Latin/Zimbabwe
- { 31, 7, 249, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 159,3 , 3745,35 , 4,4 , 13,6 , 785,7 , 1823,12 , 2, 1, 1, 6, 7 }, // English/Latin/Diego Garcia
- { 31, 7, 251, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,66,80}, 119,1 , 4726,32 , 4,4 , 13,6 , 785,7 , 1835,11 , 2, 1, 1, 6, 7 }, // English/Latin/Isle Of Man
- { 31, 7, 252, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,66,80}, 119,1 , 4726,32 , 4,4 , 13,6 , 785,7 , 1846,6 , 2, 1, 1, 6, 7 }, // English/Latin/Jersey
- { 31, 7, 254, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,83,80}, 119,1 , 6931,68 , 4,4 , 13,6 , 785,7 , 1852,11 , 2, 1, 1, 6, 7 }, // English/Latin/South Sudan
- { 31, 7, 256, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,78,71}, 155,4 , 6999,95 , 4,4 , 13,6 , 785,7 , 1863,12 , 2, 1, 1, 6, 7 }, // English/Latin/Sint Maarten
- { 31, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 4,4 , 13,6 , 785,7 , 1875,5 , 2, 1, 1, 6, 7 }, // English/Latin/World
- { 31, 7, 261, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 205,9 , 205,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 19,5 , 4,0 , 785,7 , 1880,6 , 2, 1, 1, 6, 7 }, // English/Latin/Europe
- { 32, 7, 260, 44, 160, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 214,9 , 214,9 , 588,8 , 596,26 , 37,5 , 233,25 , 2523,21 , 2544,51 , 2595,14 , 2523,21 , 2544,51 , 2595,14 , 70,3 , 67,3 , 331,6 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 1886,9 , 1895,5 , 2, 1, 1, 6, 7 }, // Esperanto/Latin/World
- { 33, 7, 68, 44, 160, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 223,8 , 223,8 , 156,8 , 622,18 , 37,5 , 8,10 , 2609,14 , 2623,63 , 2609,14 , 2609,14 , 2623,63 , 2609,14 , 0,2 , 0,2 , 337,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 7094,20 , 19,5 , 24,7 , 1900,5 , 1905,5 , 2, 1, 1, 6, 7 }, // Estonian/Latin/Estonia
- { 34, 7, 71, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 187,8 , 187,8 , 156,8 , 622,18 , 37,5 , 8,10 , 2686,28 , 2714,74 , 2788,14 , 2802,35 , 2714,74 , 2788,14 , 0,2 , 0,2 , 343,3 , 5,17 , 22,23 , {68,75,75}, 190,2 , 7114,43 , 19,5 , 24,7 , 1910,8 , 1918,7 , 2, 0, 1, 6, 7 }, // Faroese/Latin/Faroe Islands
- { 34, 7, 58, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 187,8 , 187,8 , 156,8 , 622,18 , 37,5 , 8,10 , 2686,28 , 2714,74 , 2788,14 , 2802,35 , 2714,74 , 2788,14 , 0,2 , 0,2 , 343,3 , 5,17 , 22,23 , {68,75,75}, 148,3 , 7114,43 , 19,5 , 24,7 , 1910,8 , 665,7 , 2, 0, 1, 6, 7 }, // Faroese/Latin/Denmark
- { 36, 7, 73, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 223,8 , 223,8 , 640,8 , 478,17 , 220,4 , 224,9 , 2837,21 , 2858,67 , 2925,14 , 2837,21 , 2939,81 , 2925,14 , 73,3 , 70,3 , 346,5 , 351,17 , 368,23 , {69,85,82}, 14,1 , 7157,20 , 19,5 , 4,0 , 1925,5 , 1930,5 , 2, 1, 1, 6, 7 }, // Finnish/Latin/Finland
- { 37, 7, 74, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 1943,6 , 2, 1, 1, 6, 7 }, // French/Latin/France
- { 37, 7, 3, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {68,90,68}, 205,2 , 7177,51 , 19,5 , 24,7 , 1935,8 , 1949,7 , 2, 1, 6, 5, 6 }, // French/Latin/Algeria
- { 37, 7, 21, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 571,7 , 97,16 , 37,5 , 258,23 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 1956,8 , 2, 1, 1, 6, 7 }, // French/Latin/Belgium
- { 37, 7, 23, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1935,8 , 1964,5 , 0, 0, 1, 6, 7 }, // French/Latin/Benin
- { 37, 7, 34, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1935,8 , 1969,12 , 0, 0, 1, 6, 7 }, // French/Latin/Burkina Faso
- { 37, 7, 35, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {66,73,70}, 163,3 , 7287,53 , 19,5 , 24,7 , 1935,8 , 938,7 , 0, 0, 1, 6, 7 }, // French/Latin/Burundi
- { 37, 7, 37, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 76,5 , 73,4 , 391,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1935,8 , 1981,8 , 0, 0, 1, 6, 7 }, // French/Latin/Cameroon
- { 37, 7, 38, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8221, 8220, 0,6 , 0,6 , 231,8 , 231,8 , 53,10 , 97,16 , 281,9 , 290,24 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 64,4 , 61,4 , 391,6 , 217,17 , 234,23 , {67,65,68}, 6,1 , 7396,54 , 19,5 , 24,7 , 1989,17 , 969,6 , 2, 0, 7, 6, 7 }, // French/Latin/Canada
- { 37, 7, 41, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1935,8 , 2006,25 , 0, 0, 1, 6, 7 }, // French/Latin/Central African Republic
- { 37, 7, 42, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1935,8 , 2031,5 , 0, 0, 1, 6, 7 }, // French/Latin/Chad
- { 37, 7, 48, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {75,77,70}, 36,2 , 7450,51 , 19,5 , 24,7 , 1935,8 , 2036,7 , 0, 0, 1, 6, 7 }, // French/Latin/Comoros
- { 37, 7, 49, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {67,68,70}, 210,2 , 7501,53 , 19,5 , 24,7 , 1935,8 , 2043,14 , 2, 1, 1, 6, 7 }, // French/Latin/Congo Kinshasa
- { 37, 7, 50, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1935,8 , 2057,17 , 0, 0, 1, 6, 7 }, // French/Latin/Congo Brazzaville
- { 37, 7, 53, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1935,8 , 2074,13 , 0, 0, 1, 6, 7 }, // French/Latin/Ivory Coast
- { 37, 7, 59, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {68,74,70}, 38,3 , 7554,57 , 19,5 , 24,7 , 1935,8 , 2087,8 , 0, 0, 6, 6, 7 }, // French/Latin/Djibouti
- { 37, 7, 66, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1935,8 , 2095,18 , 0, 0, 1, 6, 7 }, // French/Latin/Equatorial Guinea
- { 37, 7, 76, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 2113,16 , 2, 1, 1, 6, 7 }, // French/Latin/French Guiana
- { 37, 7, 77, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,80,70}, 212,4 , 7611,35 , 19,5 , 24,7 , 1935,8 , 2129,19 , 0, 0, 1, 6, 7 }, // French/Latin/French Polynesia
- { 37, 7, 79, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,65,70}, 32,4 , 7340,56 , 19,5 , 24,7 , 1935,8 , 2148,5 , 0, 0, 1, 6, 7 }, // French/Latin/Gabon
- { 37, 7, 88, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 2153,10 , 2, 1, 1, 6, 7 }, // French/Latin/Guadeloupe
- { 37, 7, 91, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {71,78,70}, 216,2 , 7646,48 , 19,5 , 24,7 , 1935,8 , 2163,6 , 0, 0, 1, 6, 7 }, // French/Latin/Guinea
- { 37, 7, 94, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {72,84,71}, 218,1 , 7694,57 , 19,5 , 24,7 , 1935,8 , 2169,5 , 2, 1, 1, 6, 7 }, // French/Latin/Haiti
- { 37, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 2174,10 , 2, 1, 1, 6, 7 }, // French/Latin/Luxembourg
- { 37, 7, 128, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {77,71,65}, 170,2 , 7751,54 , 19,5 , 24,7 , 1935,8 , 1233,10 , 0, 0, 1, 6, 7 }, // French/Latin/Madagascar
- { 37, 7, 132, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1935,8 , 2184,4 , 0, 0, 1, 6, 7 }, // French/Latin/Mali
- { 37, 7, 135, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 2188,10 , 2, 1, 1, 6, 7 }, // French/Latin/Martinique
- { 37, 7, 136, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {77,82,85}, 219,2 , 7805,66 , 19,5 , 24,7 , 1935,8 , 2198,10 , 2, 1, 1, 6, 7 }, // French/Latin/Mauritania
- { 37, 7, 137, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {77,85,82}, 176,2 , 7871,63 , 19,5 , 24,7 , 1935,8 , 2208,7 , 2, 0, 1, 6, 7 }, // French/Latin/Mauritius
- { 37, 7, 138, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 2215,7 , 2, 1, 1, 6, 7 }, // French/Latin/Mayotte
- { 37, 7, 142, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 2222,6 , 2, 1, 1, 6, 7 }, // French/Latin/Monaco
- { 37, 7, 145, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 64,4 , 61,4 , 391,6 , 217,17 , 234,23 , {77,65,68}, 221,3 , 7934,54 , 19,5 , 24,7 , 1935,8 , 2228,5 , 2, 1, 1, 6, 7 }, // French/Latin/Morocco
- { 37, 7, 153, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,80,70}, 212,4 , 7611,35 , 19,5 , 24,7 , 1935,8 , 2233,18 , 0, 0, 1, 6, 7 }, // French/Latin/New Caledonia
- { 37, 7, 156, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1935,8 , 2251,5 , 0, 0, 1, 6, 7 }, // French/Latin/Niger
- { 37, 7, 176, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 2256,10 , 2, 1, 1, 6, 7 }, // French/Latin/Reunion
- { 37, 7, 179, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {82,87,70}, 180,2 , 7988,50 , 19,5 , 24,7 , 1935,8 , 1457,6 , 0, 0, 1, 6, 7 }, // French/Latin/Rwanda
- { 37, 7, 187, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1935,8 , 2266,7 , 0, 0, 1, 6, 7 }, // French/Latin/Senegal
- { 37, 7, 188, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {83,67,82}, 185,2 , 8038,71 , 19,5 , 24,7 , 1935,8 , 1515,10 , 2, 1, 1, 6, 7 }, // French/Latin/Seychelles
- { 37, 7, 200, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 2273,24 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Pierre And Miquelon
- { 37, 7, 206, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 231,8 , 231,8 , 156,8 , 10,17 , 37,5 , 314,14 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {67,72,70}, 224,3 , 8109,45 , 19,5 , 24,7 , 2297,15 , 2312,6 , 2, 0, 1, 6, 7 }, // French/Latin/Switzerland
- { 37, 7, 207, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {83,89,80}, 227,2 , 8154,51 , 19,5 , 24,7 , 1935,8 , 2318,5 , 0, 0, 6, 5, 6 }, // French/Latin/Syria
- { 37, 7, 212, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,79,70}, 207,3 , 7228,59 , 19,5 , 24,7 , 1935,8 , 2323,4 , 0, 0, 1, 6, 7 }, // French/Latin/Togo
- { 37, 7, 216, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {84,78,68}, 229,2 , 8205,51 , 19,5 , 24,7 , 1935,8 , 2327,7 , 3, 0, 1, 6, 7 }, // French/Latin/Tunisia
- { 37, 7, 229, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 18,7 , 25,12 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {86,85,86}, 203,2 , 8256,51 , 19,5 , 24,7 , 1935,8 , 1761,7 , 0, 0, 1, 6, 7 }, // French/Latin/Vanuatu
- { 37, 7, 235, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {88,80,70}, 212,4 , 7611,35 , 19,5 , 24,7 , 1935,8 , 2334,16 , 0, 0, 1, 6, 7 }, // French/Latin/Wallis And Futuna Islands
- { 37, 7, 244, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 2350,16 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Barthelemy
- { 37, 7, 245, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 231,8 , 231,8 , 119,10 , 97,16 , 37,5 , 8,10 , 3020,35 , 3055,52 , 3107,14 , 3020,35 , 3055,52 , 3107,14 , 0,2 , 0,2 , 391,6 , 217,17 , 234,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 1935,8 , 2366,12 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Martin
- { 38, 7, 151, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 6,8 , 6,8 , 339,8 , 97,16 , 37,5 , 8,10 , 3121,21 , 3142,54 , 85,14 , 3121,21 , 3142,54 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3455,19 , 8,5 , 37,7 , 2378,5 , 2383,8 , 2, 1, 1, 6, 7 }, // Western Frisian/Latin/Netherlands
- { 39, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 239,10 , 239,10 , 119,10 , 648,21 , 37,5 , 8,10 , 3196,28 , 3224,69 , 3293,14 , 3196,28 , 3224,69 , 3293,14 , 81,1 , 77,1 , 397,6 , 5,17 , 22,23 , {71,66,80}, 119,1 , 8307,86 , 4,4 , 13,6 , 2391,8 , 2399,22 , 2, 1, 1, 6, 7 }, // Gaelic/Latin/United Kingdom
- { 40, 7, 197, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 37,5 , 8,10 , 3307,35 , 3342,49 , 3391,14 , 3405,35 , 3440,49 , 3489,21 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 4,0 , 2421,6 , 2427,6 , 2, 1, 1, 6, 7 }, // Galician/Latin/Spain
- { 41, 15, 81, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 171, 187, 0,6 , 0,6 , 256,8 , 256,8 , 156,8 , 696,19 , 37,5 , 8,10 , 3510,28 , 3538,62 , 3600,14 , 3510,28 , 3538,62 , 3600,14 , 0,2 , 0,2 , 403,5 , 408,37 , 22,23 , {71,69,76}, 231,1 , 8393,43 , 19,5 , 4,0 , 2433,7 , 2440,10 , 2, 1, 1, 6, 7 }, // Georgian/Georgian/Georgia
- { 42, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 264,9 , 264,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 445,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2450,7 , 2457,11 , 2, 1, 1, 6, 7 }, // German/Latin/Germany
- { 42, 7, 14, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 264,9 , 264,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 445,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2468,24 , 2492,10 , 2, 1, 1, 6, 7 }, // German/Latin/Austria
- { 42, 7, 21, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 264,9 , 264,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 445,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2450,7 , 2502,7 , 2, 1, 1, 6, 7 }, // German/Latin/Belgium
- { 42, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 264,9 , 264,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 445,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2450,7 , 2509,7 , 2, 1, 1, 6, 7 }, // German/Latin/Italy
- { 42, 7, 123, 46, 8217, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 264,9 , 264,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 445,5 , 5,17 , 22,23 , {67,72,70}, 224,3 , 8455,58 , 19,5 , 4,0 , 2450,7 , 2516,13 , 2, 0, 1, 6, 7 }, // German/Latin/Liechtenstein
- { 42, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 264,9 , 264,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 445,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 2450,7 , 2529,9 , 2, 1, 1, 6, 7 }, // German/Latin/Luxembourg
- { 42, 7, 206, 46, 8217, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 264,9 , 264,9 , 156,8 , 622,18 , 37,5 , 8,10 , 3614,21 , 3635,60 , 3695,14 , 3709,28 , 3635,60 , 3695,14 , 0,2 , 0,2 , 445,5 , 5,17 , 22,23 , {67,72,70}, 224,3 , 8455,58 , 19,5 , 4,0 , 2538,21 , 2559,7 , 2, 0, 1, 6, 7 }, // German/Latin/Switzerland
- { 43, 16, 85, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 273,9 , 273,9 , 269,6 , 10,17 , 18,7 , 25,12 , 3737,28 , 3765,55 , 3820,14 , 3737,28 , 3765,55 , 3820,14 , 82,4 , 78,4 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8513,19 , 19,5 , 4,0 , 2566,8 , 2574,6 , 2, 1, 1, 6, 7 }, // Greek/Greek/Greece
- { 43, 16, 56, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 273,9 , 273,9 , 269,6 , 10,17 , 18,7 , 25,12 , 3737,28 , 3765,55 , 3820,14 , 3737,28 , 3765,55 , 3820,14 , 82,4 , 78,4 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8513,19 , 19,5 , 4,0 , 2566,8 , 2580,6 , 2, 1, 1, 6, 7 }, // Greek/Greek/Cyprus
- { 44, 7, 86, 44, 46, 59, 37, 48, 8722, 43, 101, 187, 171, 8250, 8249, 0,6 , 0,6 , 282,11 , 282,11 , 53,10 , 80,17 , 205,5 , 210,10 , 3834,28 , 3862,98 , 3960,14 , 3834,28 , 3862,98 , 3960,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {68,75,75}, 148,3 , 8532,62 , 4,4 , 49,5 , 2586,11 , 2597,16 , 2, 0, 1, 6, 7 }, // Greenlandic/Latin/Greenland
- { 45, 7, 168, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,89,71}, 232,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 7, 6, 7 }, // Guarani/Latin/Paraguay
- { 46, 17, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 293,9 , 293,9 , 269,6 , 192,18 , 328,8 , 336,13 , 3974,32 , 4006,53 , 4059,19 , 3974,32 , 4006,53 , 4059,19 , 0,2 , 0,2 , 450,4 , 454,19 , 22,23 , {73,78,82}, 121,1 , 8594,46 , 4,4 , 13,6 , 2613,7 , 2620,4 , 2, 1, 7, 7, 7 }, // Gujarati/Gujarati/India
- { 47, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 302,8 , 302,8 , 269,6 , 715,17 , 37,5 , 8,10 , 4078,28 , 4106,52 , 4158,14 , 4078,28 , 4106,52 , 4158,14 , 86,6 , 82,5 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 8640,54 , 8,5 , 4,0 , 2624,5 , 2629,8 , 2, 1, 1, 6, 7 }, // Hausa/Latin/Nigeria
- { 47, 1, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Hausa/Arabic/Nigeria
- { 47, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 302,8 , 302,8 , 269,6 , 715,17 , 18,7 , 25,12 , 4078,28 , 4106,52 , 4158,14 , 4078,28 , 4106,52 , 4158,14 , 86,6 , 82,5 , 45,4 , 5,17 , 22,23 , {71,72,83}, 167,3 , 0,7 , 8,5 , 4,0 , 2624,5 , 2637,4 , 2, 1, 1, 6, 7 }, // Hausa/Latin/Ghana
- { 47, 7, 156, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 302,8 , 302,8 , 269,6 , 715,17 , 37,5 , 8,10 , 4078,28 , 4106,52 , 4158,14 , 4078,28 , 4106,52 , 4158,14 , 86,6 , 82,5 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 8694,36 , 8,5 , 4,0 , 2624,5 , 2641,5 , 0, 0, 1, 6, 7 }, // Hausa/Latin/Niger
- { 48, 18, 105, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 310,6 , 310,6 , 640,8 , 732,18 , 55,4 , 59,9 , 4172,46 , 4218,65 , 4283,21 , 4172,46 , 4218,65 , 4283,21 , 92,6 , 87,5 , 473,4 , 5,17 , 22,23 , {73,76,83}, 49,1 , 8730,54 , 19,5 , 4,0 , 2646,5 , 2651,5 , 2, 1, 7, 5, 6 }, // Hebrew/Hebrew/Israel
- { 49, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 316,9 , 325,8 , 269,6 , 10,17 , 18,7 , 25,12 , 4304,32 , 4336,53 , 4389,19 , 4304,32 , 4336,53 , 4389,19 , 68,2 , 65,2 , 477,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 8784,42 , 4,4 , 4,0 , 2656,6 , 2662,4 , 2, 1, 7, 7, 7 }, // Hindi/Devanagari/India
- { 50, 7, 98, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 187, 171, 0,6 , 0,6 , 333,8 , 333,8 , 750,13 , 763,19 , 55,4 , 59,9 , 4408,19 , 4427,52 , 4479,17 , 4408,19 , 4427,52 , 4479,17 , 98,3 , 92,3 , 481,4 , 5,17 , 22,23 , {72,85,70}, 233,2 , 8826,46 , 19,5 , 4,0 , 2666,6 , 2672,12 , 2, 0, 1, 6, 7 }, // Hungarian/Latin/Hungary
- { 51, 7, 99, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 187,8 , 187,8 , 640,8 , 622,18 , 37,5 , 8,10 , 4496,35 , 4531,81 , 4612,14 , 4496,35 , 4531,81 , 4612,14 , 101,4 , 95,4 , 485,4 , 5,17 , 22,23 , {73,83,75}, 235,3 , 8872,49 , 19,5 , 4,0 , 2684,8 , 2692,6 , 0, 0, 1, 6, 7 }, // Icelandic/Latin/Iceland
- { 52, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 341,10 , 351,9 , 27,8 , 553,18 , 205,5 , 210,10 , 4626,28 , 4654,43 , 4697,14 , 4626,28 , 4654,43 , 4697,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,68,82}, 238,2 , 8921,39 , 4,4 , 4,0 , 2698,9 , 2698,9 , 2, 0, 7, 6, 7 }, // Indonesian/Latin/Indonesia
- { 53, 7, 260, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 528,10 , 782,26 , 37,5 , 8,10 , 4711,28 , 4739,57 , 4796,14 , 4711,28 , 4739,57 , 4796,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 37,7 , 2707,11 , 2718,5 , 2, 1, 1, 6, 7 }, // Interlingua/Latin/World
- { 55, 44, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 240,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Inuktitut/Canadian Aboriginal/Canada
- { 55, 7, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 240,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Inuktitut/Latin/Canada
- { 57, 7, 104, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 360,11 , 239,10 , 119,10 , 97,16 , 37,5 , 8,10 , 4810,37 , 4847,75 , 4922,14 , 4810,37 , 4847,75 , 4922,14 , 105,4 , 99,4 , 489,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8960,31 , 4,4 , 13,6 , 2723,7 , 2730,4 , 2, 1, 1, 6, 7 }, // Irish/Latin/Ireland
- { 57, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 360,11 , 239,10 , 119,10 , 97,16 , 37,5 , 8,10 , 4810,37 , 4847,75 , 4922,14 , 4810,37 , 4847,75 , 4922,14 , 105,4 , 99,4 , 489,6 , 5,17 , 22,23 , {71,66,80}, 119,1 , 8991,95 , 4,4 , 13,6 , 2723,7 , 2734,19 , 2, 1, 1, 6, 7 }, // Irish/Latin/United Kingdom
- { 58, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 97,16 , 37,5 , 8,10 , 4936,28 , 4964,57 , 5021,14 , 4936,28 , 4964,57 , 5021,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9086,19 , 19,5 , 4,0 , 2753,8 , 2761,6 , 2, 1, 1, 6, 7 }, // Italian/Latin/Italy
- { 58, 7, 184, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 97,16 , 37,5 , 8,10 , 4936,28 , 4964,57 , 5021,14 , 4936,28 , 4964,57 , 5021,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9086,19 , 19,5 , 4,0 , 2753,8 , 2767,10 , 2, 1, 1, 6, 7 }, // Italian/Latin/San Marino
- { 58, 7, 206, 46, 8217, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 249,7 , 249,7 , 156,8 , 10,17 , 37,5 , 8,10 , 4936,28 , 4964,57 , 5021,14 , 4936,28 , 4964,57 , 5021,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,72,70}, 0,0 , 9105,53 , 19,5 , 4,0 , 2753,8 , 2777,8 , 2, 0, 1, 6, 7 }, // Italian/Latin/Switzerland
- { 58, 7, 230, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 97,16 , 37,5 , 8,10 , 4936,28 , 4964,57 , 5021,14 , 4936,28 , 4964,57 , 5021,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9086,19 , 19,5 , 4,0 , 2753,8 , 2785,18 , 2, 1, 1, 6, 7 }, // Italian/Latin/Vatican City State
- { 59, 19, 108, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 165,5 , 165,5 , 165,5 , 165,5 , 578,10 , 402,13 , 55,4 , 349,10 , 5035,14 , 5049,28 , 5035,14 , 5035,14 , 5049,28 , 5035,14 , 109,2 , 103,2 , 495,3 , 498,17 , 22,23 , {74,80,89}, 243,1 , 9158,11 , 4,4 , 13,6 , 2803,3 , 2806,2 , 0, 0, 7, 6, 7 }, // Japanese/Japanese/Japan
- { 60, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 371,10 , 381,9 , 528,10 , 10,17 , 37,5 , 8,10 , 5077,29 , 5106,41 , 5147,14 , 5077,29 , 5106,41 , 5147,14 , 111,4 , 105,5 , 515,4 , 5,17 , 22,23 , {73,68,82}, 238,2 , 8921,39 , 8,5 , 4,0 , 2808,4 , 2812,9 , 2, 0, 7, 6, 7 }, // Javanese/Latin/Indonesia
- { 61, 21, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 390,12 , 402,11 , 269,6 , 35,18 , 328,8 , 336,13 , 5161,33 , 5194,54 , 5248,20 , 5161,33 , 5194,54 , 5248,20 , 115,9 , 110,7 , 519,8 , 527,35 , 22,23 , {73,78,82}, 121,1 , 9169,49 , 4,4 , 13,6 , 2821,5 , 2826,4 , 2, 1, 7, 7, 7 }, // Kannada/Kannada/India
- { 62, 1, 100, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 547,6 , 35,18 , 18,7 , 25,12 , 5268,50 , 5318,52 , 5370,14 , 5268,50 , 5318,52 , 5370,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 9218,23 , 8,5 , 4,0 , 2830,5 , 2835,9 , 2, 1, 7, 7, 7 }, // Kashmiri/Arabic/India
- { 63, 2, 110, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 413,10 , 156,8 , 808,22 , 37,5 , 8,10 , 5384,21 , 5405,56 , 5461,14 , 5384,21 , 5405,56 , 5461,14 , 0,2 , 0,2 , 562,4 , 566,17 , 583,23 , {75,90,84}, 244,1 , 9241,58 , 19,5 , 4,0 , 2844,10 , 2854,9 , 2, 1, 1, 6, 7 }, // Kazakh/Cyrillic/Kazakhstan
- { 64, 7, 179, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 5475,35 , 5510,84 , 85,14 , 5475,35 , 5510,84 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,87,70}, 180,2 , 0,7 , 8,5 , 4,0 , 2863,11 , 2874,8 , 0, 0, 1, 6, 7 }, // Kinyarwanda/Latin/Rwanda
- { 65, 2, 116, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 423,10 , 423,10 , 269,6 , 830,23 , 37,5 , 8,10 , 5594,38 , 5632,57 , 5689,14 , 5594,38 , 5632,57 , 5689,14 , 124,5 , 117,14 , 562,4 , 606,18 , 22,23 , {75,71,83}, 245,3 , 9299,52 , 19,5 , 4,0 , 2882,8 , 2890,10 , 2, 1, 1, 6, 7 }, // Kirghiz/Cyrillic/Kyrgyzstan
- { 66, 22, 114, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 433,7 , 433,7 , 853,9 , 862,16 , 359,7 , 366,13 , 5703,14 , 5717,28 , 5703,14 , 5703,14 , 5717,28 , 5703,14 , 129,2 , 131,2 , 624,3 , 5,17 , 22,23 , {75,82,87}, 248,1 , 9351,19 , 4,4 , 13,6 , 2900,3 , 2903,4 , 0, 0, 7, 6, 7 }, // Korean/Korean/South Korea
- { 66, 22, 113, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 433,7 , 433,7 , 853,9 , 862,16 , 359,7 , 366,13 , 5703,14 , 5717,28 , 5703,14 , 5703,14 , 5717,28 , 5703,14 , 129,2 , 131,2 , 624,3 , 5,17 , 22,23 , {75,80,87}, 249,3 , 9370,39 , 4,4 , 13,6 , 2900,3 , 2907,11 , 0, 0, 1, 6, 7 }, // Korean/Korean/North Korea
- { 67, 7, 217, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 440,7 , 440,7 , 53,10 , 63,17 , 37,5 , 8,10 , 5745,20 , 5765,42 , 5807,14 , 5745,20 , 5765,42 , 5807,14 , 131,2 , 133,2 , 45,4 , 5,17 , 22,23 , {84,82,89}, 252,1 , 0,7 , 19,5 , 24,7 , 2918,5 , 2923,7 , 2, 1, 1, 6, 7 }, // Kurdish/Latin/Turkey
- { 68, 7, 35, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 5821,34 , 5855,89 , 85,14 , 5821,34 , 5855,89 , 85,14 , 133,5 , 135,5 , 45,4 , 5,17 , 22,23 , {66,73,70}, 163,3 , 9409,27 , 0,4 , 4,0 , 2930,8 , 2938,8 , 0, 0, 1, 6, 7 }, // Rundi/Latin/Burundi
- { 69, 23, 117, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 447,9 , 415,8 , 878,19 , 55,4 , 379,24 , 5944,36 , 5980,57 , 6037,17 , 5944,36 , 5980,57 , 6037,17 , 138,8 , 140,8 , 45,4 , 5,17 , 22,23 , {76,65,75}, 253,1 , 9436,21 , 4,4 , 44,5 , 2946,3 , 2946,3 , 0, 0, 7, 6, 7 }, // Lao/Lao/Laos
- { 71, 7, 118, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 456,8 , 456,8 , 156,8 , 897,26 , 37,5 , 8,10 , 6054,51 , 6105,72 , 6177,14 , 6191,51 , 6242,72 , 6177,14 , 146,14 , 148,11 , 627,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9457,23 , 19,5 , 4,0 , 2949,8 , 2957,7 , 2, 1, 1, 6, 7 }, // Latvian/Latin/Latvia
- { 72, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 464,9 , 464,9 , 415,8 , 97,16 , 37,5 , 8,10 , 6314,28 , 6342,100 , 6442,14 , 6314,28 , 6342,100 , 6442,14 , 160,8 , 159,6 , 45,4 , 5,17 , 22,23 , {67,68,70}, 210,2 , 9480,23 , 19,5 , 4,0 , 2964,7 , 2971,30 , 2, 1, 1, 6, 7 }, // Lingala/Latin/Congo Kinshasa
- { 72, 7, 6, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 464,9 , 464,9 , 415,8 , 97,16 , 37,5 , 8,10 , 6314,28 , 6342,100 , 6442,14 , 6314,28 , 6342,100 , 6442,14 , 160,8 , 159,6 , 45,4 , 5,17 , 22,23 , {65,79,65}, 254,2 , 9503,23 , 19,5 , 4,0 , 2964,7 , 3001,6 , 2, 1, 1, 6, 7 }, // Lingala/Latin/Angola
- { 72, 7, 41, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 464,9 , 464,9 , 415,8 , 97,16 , 37,5 , 8,10 , 6314,28 , 6342,100 , 6442,14 , 6314,28 , 6342,100 , 6442,14 , 160,8 , 159,6 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 9526,23 , 19,5 , 4,0 , 2964,7 , 3007,26 , 0, 0, 1, 6, 7 }, // Lingala/Latin/Central African Republic
- { 72, 7, 50, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 464,9 , 464,9 , 415,8 , 97,16 , 37,5 , 8,10 , 6314,28 , 6342,100 , 6442,14 , 6314,28 , 6342,100 , 6442,14 , 160,8 , 159,6 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 9526,23 , 19,5 , 4,0 , 2964,7 , 3033,5 , 0, 0, 1, 6, 7 }, // Lingala/Latin/Congo Brazzaville
- { 73, 7, 124, 44, 160, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8222, 8220, 0,6 , 0,6 , 473,8 , 473,8 , 53,10 , 923,27 , 37,5 , 8,10 , 6456,21 , 6477,89 , 6566,14 , 6456,21 , 6477,89 , 6566,14 , 168,9 , 165,6 , 632,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9549,30 , 19,5 , 4,0 , 3038,8 , 3046,7 , 2, 1, 1, 6, 7 }, // Lithuanian/Latin/Lithuania
- { 74, 2, 127, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 113,6 , 10,17 , 37,5 , 8,10 , 6580,35 , 6615,54 , 1530,14 , 6669,34 , 6615,54 , 1530,14 , 177,10 , 171,8 , 638,5 , 5,17 , 22,23 , {77,75,68}, 256,4 , 9579,56 , 19,5 , 4,0 , 3053,10 , 3063,18 , 2, 1, 1, 6, 7 }, // Macedonian/Cyrillic/Macedonia
- { 75, 7, 128, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 97,16 , 37,5 , 8,10 , 6703,34 , 6737,60 , 6797,14 , 6703,34 , 6737,60 , 6797,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,71,65}, 170,2 , 9635,13 , 4,4 , 4,0 , 3081,8 , 3089,12 , 0, 0, 1, 6, 7 }, // Malagasy/Latin/Madagascar
- { 76, 7, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 351,9 , 351,9 , 571,7 , 10,17 , 18,7 , 25,12 , 6811,28 , 6839,43 , 6882,14 , 6811,28 , 6839,43 , 6882,14 , 187,2 , 179,3 , 643,4 , 5,17 , 22,23 , {77,89,82}, 174,2 , 9648,39 , 4,4 , 13,6 , 3101,6 , 1249,8 , 2, 1, 1, 6, 7 }, // Malay/Latin/Malaysia
- { 76, 1, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,89,82}, 174,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Malay/Arabic/Malaysia
- { 76, 7, 32, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 351,9 , 351,9 , 571,7 , 950,12 , 18,7 , 25,12 , 6811,28 , 6839,43 , 6882,14 , 6811,28 , 6839,43 , 6882,14 , 187,2 , 179,3 , 643,4 , 5,17 , 22,23 , {66,78,68}, 6,1 , 9687,31 , 4,4 , 13,6 , 3101,6 , 3107,6 , 2, 1, 1, 6, 7 }, // Malay/Latin/Brunei
- { 76, 7, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 351,9 , 351,9 , 571,7 , 10,17 , 18,7 , 25,12 , 6811,28 , 6839,43 , 6882,14 , 6811,28 , 6839,43 , 6882,14 , 187,2 , 179,3 , 643,4 , 5,17 , 22,23 , {83,71,68}, 6,1 , 9718,37 , 4,4 , 13,6 , 3101,6 , 3113,9 , 2, 1, 7, 6, 7 }, // Malay/Latin/Singapore
- { 77, 24, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 481,13 , 494,12 , 269,6 , 962,18 , 18,7 , 25,12 , 6896,41 , 6937,77 , 7014,22 , 6896,41 , 7036,76 , 7112,21 , 0,2 , 0,2 , 647,6 , 653,27 , 22,23 , {73,78,82}, 121,1 , 9755,40 , 4,4 , 13,6 , 3122,6 , 3128,6 , 2, 1, 7, 7, 7 }, // Malayalam/Malayalam/India
- { 78, 7, 133, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 506,8 , 514,7 , 119,10 , 980,23 , 37,5 , 8,10 , 7133,28 , 7161,63 , 7224,21 , 7133,28 , 7161,63 , 7245,20 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9795,27 , 4,4 , 4,0 , 3134,5 , 1257,5 , 2, 1, 7, 6, 7 }, // Maltese/Latin/Malta
- { 79, 7, 154, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 528,10 , 10,17 , 18,7 , 25,12 , 7265,27 , 7292,47 , 7339,14 , 7265,27 , 7292,47 , 7339,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,90,68}, 6,1 , 9822,37 , 8,5 , 4,0 , 3139,5 , 3144,8 , 2, 1, 1, 6, 7 }, // Maori/Latin/New Zealand
- { 80, 13, 100, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 521,9 , 521,9 , 269,6 , 192,18 , 18,7 , 25,12 , 7353,32 , 7385,53 , 4389,19 , 7353,32 , 7385,53 , 4389,19 , 189,5 , 182,4 , 477,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 9859,43 , 4,4 , 13,6 , 3152,5 , 2662,4 , 2, 1, 7, 7, 7 }, // Marathi/Devanagari/India
- { 82, 2, 143, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 1003,10 , 1013,35 , 37,5 , 87,12 , 7438,21 , 7459,43 , 7438,21 , 7438,21 , 7502,43 , 7438,21 , 194,4 , 186,4 , 562,4 , 680,17 , 22,23 , {77,78,84}, 260,1 , 9902,46 , 8,5 , 4,0 , 3157,6 , 3163,6 , 2, 0, 1, 6, 7 }, // Mongolian/Cyrillic/Mongolia
- { 82, 8, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,78,89}, 261,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Mongolian/Mongolian/China
- { 84, 13, 150, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 530,5 , 0,6 , 535,7 , 535,7 , 227,6 , 63,17 , 37,5 , 8,10 , 7545,33 , 7578,54 , 7632,18 , 7545,33 , 7578,54 , 7632,18 , 198,9 , 190,7 , 477,4 , 697,19 , 22,23 , {78,80,82}, 264,4 , 9948,49 , 8,5 , 4,0 , 3169,6 , 3175,5 , 2, 1, 7, 6, 7 }, // Nepali/Devanagari/Nepal
- { 84, 13, 100, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 530,5 , 0,6 , 535,7 , 535,7 , 227,6 , 63,17 , 18,7 , 25,12 , 7545,33 , 7578,54 , 7632,18 , 7545,33 , 7578,54 , 7632,18 , 198,9 , 190,7 , 477,4 , 697,19 , 22,23 , {73,78,82}, 121,1 , 9997,49 , 8,5 , 4,0 , 3169,6 , 2662,4 , 2, 1, 7, 7, 7 }, // Nepali/Devanagari/India
- { 85, 7, 161, 44, 160, 59, 37, 48, 8722, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 187,8 , 187,8 , 495,10 , 478,17 , 37,5 , 8,10 , 2334,35 , 2269,51 , 2320,14 , 2334,35 , 2269,51 , 2320,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {78,79,75}, 190,2 , 10046,44 , 8,5 , 4,0 , 3180,12 , 3192,5 , 2, 0, 1, 6, 7 }, // Norwegian Bokmal/Latin/Norway
- { 85, 7, 203, 44, 160, 59, 37, 48, 8722, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 187,8 , 187,8 , 495,10 , 478,17 , 37,5 , 8,10 , 2334,35 , 2269,51 , 2320,14 , 2334,35 , 2269,51 , 2320,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {78,79,75}, 190,2 , 10046,44 , 8,5 , 4,0 , 3180,12 , 3197,21 , 2, 0, 1, 6, 7 }, // Norwegian Bokmal/Latin/Svalbard And Jan Mayen Islands
- { 86, 7, 74, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Occitan/Latin/France
- { 87, 26, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 542,8 , 550,7 , 547,6 , 35,18 , 18,7 , 25,12 , 7650,33 , 7683,54 , 7737,18 , 7650,33 , 7683,54 , 7737,18 , 0,2 , 0,2 , 716,5 , 5,17 , 22,23 , {73,78,82}, 121,1 , 10090,43 , 4,4 , 13,6 , 3218,5 , 3223,4 , 2, 1, 7, 7, 7 }, // Oriya/Oriya/India
- { 88, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 557,6 , 557,6 , 563,9 , 572,8 , 394,8 , 1048,20 , 55,4 , 403,11 , 7755,39 , 7755,39 , 85,14 , 7755,39 , 7755,39 , 85,14 , 207,4 , 197,4 , 721,5 , 5,17 , 22,23 , {65,70,78}, 268,1 , 10133,25 , 4,4 , 13,6 , 3227,4 , 3231,9 , 0, 0, 6, 4, 5 }, // Pashto/Arabic/Afghanistan
- { 88, 1, 163, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 557,6 , 557,6 , 563,9 , 572,8 , 394,8 , 1048,20 , 18,7 , 25,12 , 7755,39 , 7755,39 , 85,14 , 7755,39 , 7755,39 , 85,14 , 207,4 , 197,4 , 721,5 , 5,17 , 22,23 , {80,75,82}, 176,2 , 10158,52 , 4,4 , 13,6 , 3227,4 , 3240,7 , 2, 0, 7, 6, 7 }, // Pashto/Arabic/Pakistan
- { 89, 1, 102, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 580,7 , 580,7 , 587,8 , 595,7 , 394,8 , 97,16 , 55,4 , 403,11 , 7794,49 , 7794,49 , 7843,14 , 7794,49 , 7794,49 , 7843,14 , 211,9 , 201,8 , 726,4 , 730,44 , 22,23 , {73,82,82}, 269,4 , 10210,37 , 54,6 , 60,8 , 3247,5 , 3252,5 , 0, 0, 6, 5, 5 }, // Persian/Arabic/Iran
- { 89, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 580,7 , 580,7 , 587,8 , 595,7 , 394,8 , 97,16 , 55,4 , 403,11 , 7794,49 , 7794,49 , 7843,14 , 7794,49 , 7794,49 , 7843,14 , 211,9 , 201,8 , 726,4 , 730,44 , 22,23 , {65,70,78}, 268,1 , 10247,55 , 8,5 , 60,8 , 3257,3 , 3231,9 , 0, 0, 6, 4, 5 }, // Persian/Arabic/Afghanistan
- { 90, 7, 172, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 158,7 , 158,7 , 495,10 , 10,17 , 37,5 , 8,10 , 7857,34 , 7891,59 , 7950,14 , 7857,34 , 7891,59 , 7964,14 , 0,2 , 0,2 , 326,5 , 5,17 , 22,23 , {80,76,78}, 273,2 , 10302,77 , 19,5 , 24,7 , 3260,6 , 3266,6 , 2, 1, 1, 6, 7 }, // Polish/Latin/Poland
- { 91, 7, 30, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 249,7 , 249,7 , 119,10 , 669,27 , 37,5 , 8,10 , 7978,35 , 8013,79 , 8092,14 , 7978,35 , 8013,79 , 8092,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {66,82,76}, 275,2 , 10379,54 , 8,5 , 4,0 , 3272,9 , 3281,6 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Brazil
- { 91, 7, 6, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 220,8 , 209,8 , 0,5 , 5,17 , 22,23 , {65,79,65}, 254,2 , 10433,54 , 19,5 , 24,7 , 3272,9 , 3287,6 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Angola
- { 91, 7, 39, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 220,8 , 209,8 , 0,5 , 5,17 , 22,23 , {67,86,69}, 277,1 , 10487,69 , 19,5 , 24,7 , 3272,9 , 3293,10 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Cape Verde
- { 91, 7, 62, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 220,8 , 209,8 , 0,5 , 5,17 , 22,23 , {85,83,68}, 159,3 , 10556,81 , 19,5 , 24,7 , 3272,9 , 3303,11 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/East Timor
- { 91, 7, 66, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 220,8 , 209,8 , 0,5 , 5,17 , 22,23 , {88,65,70}, 32,4 , 10637,59 , 19,5 , 24,7 , 3272,9 , 3314,16 , 0, 0, 1, 6, 7 }, // Portuguese/Latin/Equatorial Guinea
- { 91, 7, 92, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 220,8 , 209,8 , 0,5 , 5,17 , 22,23 , {88,79,70}, 207,3 , 10696,62 , 19,5 , 24,7 , 3272,9 , 3330,12 , 0, 0, 1, 6, 7 }, // Portuguese/Latin/Guinea Bissau
- { 91, 7, 125, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 220,8 , 209,8 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 3272,9 , 3342,10 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Luxembourg
- { 91, 7, 126, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 18,7 , 25,12 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 220,8 , 209,8 , 0,5 , 5,17 , 22,23 , {77,79,80}, 137,4 , 10758,54 , 19,5 , 24,7 , 3272,9 , 3352,19 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Macau
- { 91, 7, 146, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 220,8 , 209,8 , 0,5 , 5,17 , 22,23 , {77,90,78}, 278,3 , 10812,66 , 19,5 , 24,7 , 3272,9 , 3371,10 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Mozambique
- { 91, 7, 173, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 220,8 , 209,8 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 24,7 , 3381,17 , 3398,8 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Portugal
- { 91, 7, 185, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 220,8 , 209,8 , 0,5 , 5,17 , 22,23 , {83,84,78}, 281,2 , 10878,92 , 19,5 , 24,7 , 3272,9 , 3406,19 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Sao Tome And Principe
- { 91, 7, 206, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 669,27 , 37,5 , 8,10 , 8106,49 , 8013,79 , 8092,14 , 8106,49 , 8013,79 , 8092,14 , 220,8 , 209,8 , 0,5 , 5,17 , 22,23 , {67,72,70}, 224,3 , 10970,45 , 19,5 , 24,7 , 3272,9 , 3425,5 , 2, 0, 1, 6, 7 }, // Portuguese/Latin/Switzerland
- { 92, 4, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 602,9 , 602,9 , 269,6 , 10,17 , 18,7 , 25,12 , 8155,36 , 8191,57 , 8248,23 , 8155,36 , 8191,57 , 8248,23 , 228,6 , 217,6 , 774,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 11015,39 , 8,5 , 4,0 , 3430,6 , 3436,4 , 2, 1, 7, 7, 7 }, // Punjabi/Gurmukhi/India
- { 92, 1, 163, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 553,18 , 18,7 , 25,12 , 8271,37 , 8271,37 , 85,14 , 8271,37 , 8271,37 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,75,82}, 283,1 , 11054,13 , 8,5 , 4,0 , 3440,6 , 3240,7 , 2, 0, 7, 6, 7 }, // Punjabi/Arabic/Pakistan
- { 93, 7, 169, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 192,18 , 37,5 , 8,10 , 8308,28 , 8336,53 , 8389,14 , 8308,28 , 8336,53 , 8389,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {80,69,78}, 284,2 , 11067,29 , 8,5 , 4,0 , 3446,8 , 3454,4 , 2, 1, 7, 6, 7 }, // Quechua/Latin/Peru
- { 93, 7, 26, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 192,18 , 37,5 , 8,10 , 8308,28 , 8336,53 , 8389,14 , 8308,28 , 8336,53 , 8389,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {66,79,66}, 286,2 , 11096,25 , 8,5 , 4,0 , 3446,8 , 3458,7 , 2, 1, 1, 6, 7 }, // Quechua/Latin/Bolivia
- { 93, 7, 63, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 192,18 , 37,5 , 8,10 , 8308,28 , 8336,53 , 8389,14 , 8308,28 , 8336,53 , 8389,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {85,83,68}, 6,1 , 11121,37 , 8,5 , 4,0 , 3446,8 , 3465,7 , 2, 1, 1, 6, 7 }, // Quechua/Latin/Ecuador
- { 94, 7, 206, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 0,6 , 0,6 , 339,8 , 1068,23 , 37,5 , 8,10 , 8403,23 , 8426,56 , 8482,14 , 8403,23 , 8426,56 , 8482,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,72,70}, 224,3 , 11158,46 , 19,5 , 4,0 , 3472,9 , 3481,6 , 2, 0, 1, 6, 7 }, // Romansh/Latin/Switzerland
- { 95, 7, 177, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 611,8 , 611,8 , 495,10 , 10,17 , 37,5 , 8,10 , 8496,34 , 8530,48 , 3107,14 , 8496,34 , 8530,48 , 3107,14 , 64,4 , 61,4 , 778,4 , 5,17 , 22,23 , {82,79,78}, 288,3 , 11204,57 , 19,5 , 24,7 , 3487,6 , 3493,7 , 2, 1, 1, 6, 7 }, // Romanian/Latin/Romania
- { 95, 7, 141, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 611,8 , 611,8 , 495,10 , 10,17 , 37,5 , 8,10 , 8578,28 , 8530,48 , 8606,16 , 8578,28 , 8530,48 , 8606,16 , 64,4 , 61,4 , 778,4 , 5,17 , 22,23 , {77,68,76}, 291,1 , 11261,69 , 19,5 , 24,7 , 3487,6 , 3500,17 , 2, 1, 1, 6, 7 }, // Romanian/Latin/Moldova
- { 96, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 680,17 , 22,23 , {82,85,66}, 123,1 , 11330,89 , 19,5 , 4,0 , 3517,7 , 3524,6 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Russia
- { 96, 2, 20, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 680,17 , 22,23 , {66,89,78}, 0,2 , 11419,94 , 19,5 , 4,0 , 3517,7 , 510,8 , 2, 0, 1, 6, 7 }, // Russian/Cyrillic/Belarus
- { 96, 2, 110, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 680,17 , 22,23 , {75,90,84}, 244,1 , 11513,83 , 19,5 , 4,0 , 3517,7 , 3530,9 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kazakhstan
- { 96, 2, 116, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 680,17 , 22,23 , {75,71,83}, 245,3 , 11596,82 , 19,5 , 4,0 , 3517,7 , 3539,8 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kyrgyzstan
- { 96, 2, 141, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 680,17 , 22,23 , {77,68,76}, 291,1 , 11678,79 , 19,5 , 4,0 , 3517,7 , 3547,7 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Moldova
- { 96, 2, 222, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 111,7 , 111,7 , 495,10 , 317,22 , 37,5 , 8,10 , 8622,21 , 8643,62 , 8705,14 , 8622,21 , 8643,62 , 8622,21 , 0,2 , 0,2 , 269,5 , 680,17 , 22,23 , {85,65,72}, 292,1 , 11757,92 , 19,5 , 4,0 , 3517,7 , 3554,7 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Ukraine
- { 98, 7, 41, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 8719,28 , 8747,66 , 8813,14 , 8719,28 , 8747,66 , 8813,14 , 234,2 , 223,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 11849,25 , 4,4 , 44,5 , 3561,5 , 3566,22 , 0, 0, 1, 6, 7 }, // Sango/Latin/Central African Republic
- { 99, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 7, 7 }, // Sanskrit/Devanagari/India
- { 100, 2, 243, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8827,28 , 8855,52 , 8907,14 , 8827,28 , 8855,52 , 8907,14 , 236,9 , 225,8 , 782,7 , 5,17 , 22,23 , {82,83,68}, 293,3 , 11874,58 , 19,5 , 24,7 , 3588,6 , 3594,6 , 0, 0, 1, 6, 7 }, // Serbian/Cyrillic/Serbia
- { 100, 2, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8921,26 , 8947,55 , 8907,14 , 8921,26 , 8947,55 , 8907,14 , 245,11 , 225,8 , 782,7 , 5,17 , 22,23 , {66,65,77}, 296,2 , 11932,174 , 19,5 , 24,7 , 3588,6 , 3600,19 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Bosnia And Herzegowina
- { 100, 2, 242, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8827,28 , 8947,55 , 8907,14 , 8827,28 , 8947,55 , 8907,14 , 245,11 , 225,8 , 782,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12106,23 , 19,5 , 24,7 , 3588,6 , 3619,9 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Montenegro
- { 100, 2, 257, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 8827,28 , 8855,52 , 8907,14 , 8827,28 , 8855,52 , 8907,14 , 236,9 , 225,8 , 782,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12106,23 , 19,5 , 24,7 , 3588,6 , 3628,6 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Kosovo
- { 100, 7, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 158,7 , 158,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 9002,26 , 9028,57 , 2129,14 , 9002,26 , 9028,57 , 2129,14 , 256,11 , 233,8 , 319,7 , 5,17 , 22,23 , {66,65,77}, 144,2 , 12129,174 , 19,5 , 24,7 , 3634,6 , 629,19 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Bosnia And Herzegowina
- { 100, 7, 242, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 158,7 , 158,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 9085,28 , 9028,57 , 2129,14 , 9085,28 , 9028,57 , 2129,14 , 256,11 , 233,8 , 319,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12303,23 , 19,5 , 24,7 , 3634,6 , 3640,9 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Montenegro
- { 100, 7, 243, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 158,7 , 158,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 9085,28 , 9113,54 , 2129,14 , 9085,28 , 9113,54 , 2129,14 , 267,9 , 233,8 , 319,7 , 5,17 , 22,23 , {82,83,68}, 293,3 , 12326,58 , 19,5 , 24,7 , 3634,6 , 3649,6 , 0, 0, 1, 6, 7 }, // Serbian/Latin/Serbia
- { 100, 7, 257, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 158,7 , 158,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 9085,28 , 9113,54 , 2129,14 , 9085,28 , 9113,54 , 2129,14 , 267,9 , 233,8 , 319,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12303,23 , 19,5 , 24,7 , 3634,6 , 3655,6 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Kosovo
- { 101, 2, 81, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 619,9 , 619,9 , 156,8 , 1118,23 , 37,5 , 8,10 , 9167,28 , 9195,61 , 9256,14 , 9270,28 , 9298,61 , 9256,14 , 276,15 , 241,15 , 45,4 , 5,17 , 22,23 , {71,69,76}, 231,1 , 12384,17 , 8,5 , 4,0 , 3661,4 , 3665,11 , 2, 1, 1, 6, 7 }, // Ossetic/Cyrillic/Georgia
- { 101, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 619,9 , 619,9 , 156,8 , 1118,23 , 37,5 , 8,10 , 9167,28 , 9195,61 , 9256,14 , 9270,28 , 9298,61 , 9256,14 , 276,15 , 241,15 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 12401,17 , 8,5 , 4,0 , 3661,4 , 3676,6 , 2, 1, 1, 6, 7 }, // Ossetic/Cyrillic/Russia
- { 102, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Southern Sotho/Latin/South Africa
- { 103, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Tswana/Latin/South Africa
- { 104, 7, 240, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 9359,28 , 9387,55 , 9442,14 , 9359,28 , 9387,55 , 9442,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 12418,22 , 4,4 , 13,6 , 3682,8 , 1815,8 , 2, 1, 7, 6, 7 }, // Shona/Latin/Zimbabwe
- { 105, 1, 163, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 628,8 , 636,7 , 53,10 , 63,17 , 18,7 , 25,12 , 9456,35 , 9456,35 , 9491,31 , 9456,35 , 9456,35 , 9491,31 , 291,11 , 256,11 , 789,6 , 795,61 , 22,23 , {80,75,82}, 176,2 , 12440,43 , 19,5 , 4,0 , 3690,4 , 3694,7 , 2, 0, 7, 6, 7 }, // Sindhi/Arabic/Pakistan
- { 106, 32, 198, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 643,9 , 652,8 , 53,10 , 63,17 , 205,5 , 210,10 , 9522,39 , 9561,62 , 9623,19 , 9522,39 , 9561,62 , 9623,19 , 302,5 , 267,4 , 856,5 , 861,42 , 22,23 , {76,75,82}, 298,3 , 12483,58 , 4,4 , 13,6 , 3701,5 , 3706,11 , 2, 1, 1, 6, 7 }, // Sinhala/Sinhala/Sri Lanka
- { 107, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Swati/Latin/South Africa
- { 108, 7, 191, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 180,7 , 660,7 , 1141,10 , 478,17 , 55,4 , 59,9 , 9642,21 , 9663,52 , 9715,14 , 9642,21 , 9663,52 , 9715,14 , 0,2 , 0,2 , 326,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12541,26 , 19,5 , 24,7 , 3717,10 , 3727,9 , 2, 1, 1, 6, 7 }, // Slovak/Latin/Slovakia
- { 109, 7, 192, 44, 46, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 667,8 , 667,8 , 1151,9 , 1160,19 , 37,5 , 8,10 , 9729,35 , 9764,52 , 9816,14 , 9729,35 , 9764,52 , 9816,14 , 60,4 , 271,4 , 54,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12567,28 , 19,5 , 24,7 , 3736,11 , 3747,9 , 2, 1, 1, 6, 7 }, // Slovenian/Latin/Slovenia
- { 110, 7, 194, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 675,9 , 675,9 , 27,8 , 1179,19 , 18,7 , 25,12 , 9830,32 , 9862,47 , 9909,15 , 9830,32 , 9862,47 , 9909,15 , 307,2 , 275,2 , 903,6 , 909,17 , 22,23 , {83,79,83}, 94,1 , 12595,27 , 4,4 , 13,6 , 3756,8 , 3764,10 , 0, 0, 1, 6, 7 }, // Somali/Latin/Somalia
- { 110, 7, 59, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 675,9 , 675,9 , 27,8 , 1179,19 , 18,7 , 25,12 , 9830,32 , 9862,47 , 9909,15 , 9830,32 , 9862,47 , 9909,15 , 307,2 , 275,2 , 903,6 , 909,17 , 22,23 , {68,74,70}, 38,3 , 12622,50 , 4,4 , 13,6 , 3756,8 , 3774,7 , 0, 0, 6, 6, 7 }, // Somali/Latin/Djibouti
- { 110, 7, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 675,9 , 675,9 , 27,8 , 1179,19 , 18,7 , 25,12 , 9830,32 , 9862,47 , 9909,15 , 9830,32 , 9862,47 , 9909,15 , 307,2 , 275,2 , 903,6 , 909,17 , 22,23 , {69,84,66}, 0,2 , 12672,52 , 4,4 , 13,6 , 3756,8 , 3781,8 , 2, 1, 7, 6, 7 }, // Somali/Latin/Ethiopia
- { 110, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 675,9 , 675,9 , 27,8 , 1179,19 , 37,5 , 8,10 , 9830,32 , 9862,47 , 9909,15 , 9830,32 , 9862,47 , 9909,15 , 307,2 , 275,2 , 903,6 , 909,17 , 22,23 , {75,69,83}, 2,3 , 12724,52 , 4,4 , 13,6 , 3756,8 , 1191,5 , 2, 1, 7, 6, 7 }, // Somali/Latin/Kenya
- { 111, 7, 197, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 55,4 , 403,11 , 9924,35 , 9959,53 , 8389,14 , 9924,35 , 9959,53 , 8389,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 4,0 , 3789,17 , 2427,6 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Spain
- { 111, 7, 10, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 3107,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {65,82,83}, 6,1 , 12776,51 , 8,5 , 37,7 , 3806,7 , 3813,9 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Argentina
- { 111, 7, 22, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {66,90,68}, 6,1 , 12827,52 , 4,4 , 4,0 , 3806,7 , 3822,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Belize
- { 111, 7, 26, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {66,79,66}, 286,2 , 12879,35 , 4,4 , 4,0 , 3806,7 , 3458,7 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Bolivia
- { 111, 7, 30, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {66,82,76}, 275,2 , 12914,52 , 4,4 , 4,0 , 3806,7 , 3281,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Brazil
- { 111, 7, 43, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 339,8 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {67,76,80}, 6,1 , 12966,45 , 4,4 , 4,0 , 3806,7 , 3828,5 , 0, 0, 1, 6, 7 }, // Spanish/Latin/Chile
- { 111, 7, 47, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 571,7 , 669,27 , 18,7 , 25,12 , 9924,35 , 9959,53 , 4796,14 , 9924,35 , 9959,53 , 3107,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {67,79,80}, 6,1 , 13011,54 , 4,4 , 4,0 , 3806,7 , 3833,8 , 2, 0, 7, 6, 7 }, // Spanish/Latin/Colombia
- { 111, 7, 52, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {67,82,67}, 301,1 , 13065,67 , 4,4 , 4,0 , 3806,7 , 3841,10 , 2, 0, 1, 6, 7 }, // Spanish/Latin/Costa Rica
- { 111, 7, 55, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {67,85,80}, 6,1 , 13132,42 , 4,4 , 4,0 , 3806,7 , 3851,4 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Cuba
- { 111, 7, 61, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 18,7 , 25,12 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 3107,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {68,79,80}, 302,3 , 13174,54 , 4,4 , 13,6 , 3806,7 , 3855,20 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Dominican Republic
- { 111, 7, 63, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 13228,70 , 4,4 , 4,0 , 3806,7 , 3465,7 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Ecuador
- { 111, 7, 65, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 13228,70 , 4,4 , 4,0 , 3806,7 , 3875,11 , 2, 1, 7, 6, 7 }, // Spanish/Latin/El Salvador
- { 111, 7, 66, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 55,4 , 403,11 , 9924,35 , 9959,53 , 8389,14 , 9924,35 , 9959,53 , 8389,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {88,65,70}, 32,4 , 13298,92 , 19,5 , 4,0 , 3806,7 , 3886,17 , 0, 0, 1, 6, 7 }, // Spanish/Latin/Equatorial Guinea
- { 111, 7, 90, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 571,7 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {71,84,81}, 305,1 , 13390,30 , 4,4 , 4,0 , 3806,7 , 3903,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Guatemala
- { 111, 7, 96, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 1198,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {72,78,76}, 291,1 , 13420,60 , 4,4 , 4,0 , 3806,7 , 3912,8 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Honduras
- { 111, 7, 139, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 27,8 , 669,27 , 55,4 , 59,9 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 3107,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {77,88,78}, 6,1 , 13480,48 , 4,4 , 4,0 , 3920,17 , 3937,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Mexico
- { 111, 7, 155, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {78,73,79}, 306,2 , 13528,69 , 4,4 , 4,0 , 3806,7 , 3943,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Nicaragua
- { 111, 7, 166, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 1225,8 , 669,27 , 18,7 , 25,12 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,65,66}, 308,3 , 13597,54 , 4,4 , 4,0 , 3806,7 , 3952,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Panama
- { 111, 7, 168, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,89,71}, 311,3 , 13651,61 , 4,4 , 4,0 , 3806,7 , 3958,8 , 0, 0, 7, 6, 7 }, // Spanish/Latin/Paraguay
- { 111, 7, 169, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 571,7 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,69,78}, 284,2 , 13712,43 , 4,4 , 4,0 , 3806,7 , 3454,4 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Peru
- { 111, 7, 170, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 18,7 , 25,12 , 9924,35 , 9959,53 , 8389,14 , 9924,35 , 9959,53 , 8389,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,72,80}, 179,1 , 13755,48 , 19,5 , 4,0 , 3806,7 , 3966,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Philippines
- { 111, 7, 174, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 1225,8 , 669,27 , 18,7 , 25,12 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 13228,70 , 4,4 , 4,0 , 3806,7 , 1446,11 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Puerto Rico
- { 111, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 684,7 , 684,7 , 415,8 , 669,27 , 18,7 , 25,12 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 3107,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 13228,70 , 4,4 , 4,0 , 3806,7 , 3975,14 , 2, 1, 7, 6, 7 }, // Spanish/Latin/United States
- { 111, 7, 227, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,89,85}, 6,1 , 13803,48 , 8,5 , 37,7 , 3806,7 , 3989,7 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Uruguay
- { 111, 7, 231, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 18,7 , 25,12 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {86,69,83}, 314,4 , 13851,58 , 4,4 , 4,0 , 3806,7 , 3996,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Venezuela
- { 111, 7, 238, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 55,4 , 403,11 , 9924,35 , 9959,53 , 8389,14 , 9924,35 , 9959,53 , 8389,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 4,0 , 3806,7 , 4005,8 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Canary Islands
- { 111, 7, 246, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 37,5 , 8,10 , 9924,35 , 9959,53 , 3107,14 , 9924,35 , 9959,53 , 4796,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 4,4 , 4,0 , 4013,23 , 4036,13 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Latin America
- { 111, 7, 250, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 669,27 , 55,4 , 403,11 , 9924,35 , 9959,53 , 8389,14 , 9924,35 , 9959,53 , 8389,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 4,0 , 3806,7 , 4049,15 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Ceuta And Melilla
- { 112, 7, 101, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,68,82}, 238,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Sundanese/Latin/Indonesia
- { 113, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 691,8 , 691,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10012,60 , 10012,60 , 85,14 , 10012,60 , 10012,60 , 85,14 , 0,2 , 0,2 , 627,5 , 926,51 , 22,23 , {84,90,83}, 192,3 , 13909,67 , 8,5 , 4,0 , 4064,9 , 1620,8 , 2, 0, 1, 6, 7 }, // Swahili/Latin/Tanzania
- { 113, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 691,8 , 691,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10012,60 , 10012,60 , 85,14 , 10012,60 , 10012,60 , 85,14 , 0,2 , 0,2 , 627,5 , 926,51 , 22,23 , {67,68,70}, 210,2 , 13976,55 , 8,5 , 4,0 , 4064,9 , 4073,32 , 2, 1, 1, 6, 7 }, // Swahili/Latin/Congo Kinshasa
- { 113, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 691,8 , 691,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10012,60 , 10012,60 , 85,14 , 10012,60 , 10012,60 , 85,14 , 0,2 , 0,2 , 627,5 , 926,51 , 22,23 , {75,69,83}, 2,3 , 14031,58 , 8,5 , 4,0 , 4064,9 , 1191,5 , 2, 1, 7, 6, 7 }, // Swahili/Latin/Kenya
- { 113, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 691,8 , 691,8 , 119,10 , 10,17 , 37,5 , 8,10 , 10012,60 , 10012,60 , 85,14 , 10012,60 , 10012,60 , 85,14 , 0,2 , 0,2 , 627,5 , 926,51 , 22,23 , {85,71,88}, 197,3 , 14089,61 , 8,5 , 4,0 , 4064,9 , 1685,6 , 0, 0, 1, 7, 7 }, // Swahili/Latin/Uganda
- { 114, 7, 205, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 699,9 , 699,9 , 53,10 , 97,16 , 37,5 , 414,16 , 10072,29 , 10101,50 , 2320,14 , 10072,29 , 10101,50 , 2320,14 , 309,2 , 277,2 , 45,4 , 5,17 , 22,23 , {83,69,75}, 190,2 , 14150,45 , 19,5 , 4,0 , 4105,7 , 4112,7 , 2, 0, 1, 6, 7 }, // Swedish/Latin/Sweden
- { 114, 7, 73, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 699,9 , 699,9 , 53,10 , 97,16 , 37,5 , 414,16 , 10072,29 , 10101,50 , 2320,14 , 10072,29 , 10101,50 , 2320,14 , 309,2 , 277,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9086,19 , 19,5 , 4,0 , 4105,7 , 1088,7 , 2, 1, 1, 6, 7 }, // Swedish/Latin/Finland
- { 114, 7, 248, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 699,9 , 699,9 , 53,10 , 97,16 , 37,5 , 414,16 , 10072,29 , 10101,50 , 2320,14 , 10072,29 , 10101,50 , 2320,14 , 309,2 , 277,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9086,19 , 19,5 , 4,0 , 4105,7 , 4119,5 , 2, 1, 1, 6, 7 }, // Swedish/Latin/Aland Islands
- { 115, 7, 106, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Sardinian/Latin/Italy
- { 116, 2, 209, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 553,18 , 37,5 , 8,10 , 10151,28 , 10179,55 , 10234,14 , 10151,28 , 10179,55 , 10234,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {84,74,83}, 318,4 , 14195,19 , 19,5 , 4,0 , 4124,6 , 4130,10 , 2, 1, 1, 6, 7 }, // Tajik/Cyrillic/Tajikistan
- { 117, 27, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 708,13 , 708,13 , 269,6 , 192,18 , 359,7 , 430,12 , 10248,39 , 10287,49 , 10336,20 , 10248,39 , 10287,49 , 10336,20 , 311,8 , 279,8 , 977,7 , 5,17 , 22,23 , {73,78,82}, 121,1 , 14214,49 , 4,4 , 13,6 , 4140,5 , 4145,7 , 2, 1, 7, 7, 7 }, // Tamil/Tamil/India
- { 117, 27, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 708,13 , 708,13 , 269,6 , 192,18 , 359,7 , 430,12 , 10248,39 , 10287,49 , 10336,20 , 10248,39 , 10287,49 , 10336,20 , 311,8 , 279,8 , 977,7 , 5,17 , 22,23 , {77,89,82}, 174,2 , 14263,61 , 4,4 , 13,6 , 4140,5 , 4152,7 , 2, 1, 1, 6, 7 }, // Tamil/Tamil/Malaysia
- { 117, 27, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 708,13 , 708,13 , 269,6 , 192,18 , 359,7 , 430,12 , 10248,39 , 10287,49 , 10336,20 , 10248,39 , 10287,49 , 10336,20 , 311,8 , 279,8 , 977,7 , 5,17 , 22,23 , {83,71,68}, 6,1 , 14324,61 , 4,4 , 13,6 , 4140,5 , 4159,11 , 2, 1, 7, 6, 7 }, // Tamil/Tamil/Singapore
- { 117, 27, 198, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 708,13 , 708,13 , 269,6 , 192,18 , 37,5 , 8,10 , 10248,39 , 10287,49 , 10336,20 , 10248,39 , 10287,49 , 10336,20 , 311,8 , 279,8 , 977,7 , 5,17 , 22,23 , {76,75,82}, 322,3 , 14385,49 , 4,4 , 13,6 , 4140,5 , 4170,6 , 2, 1, 1, 6, 7 }, // Tamil/Tamil/Sri Lanka
- { 118, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 721,9 , 721,9 , 495,10 , 1233,23 , 55,4 , 59,9 , 10356,36 , 10392,56 , 10448,14 , 10356,36 , 10392,56 , 10448,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 14434,21 , 19,5 , 4,0 , 4176,5 , 3524,6 , 2, 1, 1, 6, 7 }, // Tatar/Cyrillic/Russia
- { 119, 28, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 730,11 , 730,11 , 339,8 , 1256,18 , 18,7 , 25,12 , 10462,32 , 10494,60 , 10554,18 , 10462,32 , 10494,60 , 10554,18 , 0,2 , 0,2 , 984,7 , 991,29 , 22,23 , {73,78,82}, 121,1 , 14455,26 , 4,4 , 13,6 , 4181,6 , 4187,8 , 2, 1, 7, 7, 7 }, // Telugu/Telugu/India
- { 120, 30, 211, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 118,5 , 118,5 , 741,8 , 749,7 , 269,6 , 1274,19 , 37,5 , 442,28 , 10572,23 , 10595,68 , 10663,16 , 10572,23 , 10595,68 , 10663,16 , 319,10 , 287,10 , 1020,4 , 5,17 , 22,23 , {84,72,66}, 325,1 , 14481,16 , 4,4 , 13,6 , 4195,3 , 4195,3 , 2, 1, 7, 6, 7 }, // Thai/Thai/Thailand
- { 121, 31, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 1293,23 , 18,7 , 25,12 , 10679,51 , 10730,79 , 10809,27 , 10679,51 , 10730,79 , 10809,27 , 329,7 , 297,8 , 45,4 , 5,17 , 22,23 , {67,78,89}, 133,1 , 14497,13 , 8,5 , 4,0 , 4198,8 , 4206,6 , 2, 1, 7, 6, 7 }, // Tibetan/Tibetan/China
- { 121, 31, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 1293,23 , 18,7 , 25,12 , 10679,51 , 10730,79 , 10809,27 , 10679,51 , 10730,79 , 10809,27 , 329,7 , 297,8 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 14510,19 , 8,5 , 4,0 , 4198,8 , 4212,7 , 2, 1, 7, 7, 7 }, // Tibetan/Tibetan/India
- { 122, 14, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1316,23 , 18,7 , 25,12 , 10836,21 , 10857,29 , 10886,14 , 10836,21 , 10857,29 , 10900,14 , 336,7 , 305,7 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,2 , 14529,16 , 4,4 , 4,0 , 4219,4 , 92,5 , 2, 1, 7, 6, 7 }, // Tigrinya/Ethiopic/Ethiopia
- { 122, 14, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1316,23 , 18,7 , 25,12 , 10836,21 , 10857,29 , 10900,14 , 10836,21 , 10857,29 , 10900,14 , 336,7 , 305,7 , 45,4 , 5,17 , 22,23 , {69,82,78}, 41,3 , 0,7 , 4,4 , 4,0 , 4219,4 , 4223,4 , 2, 1, 1, 6, 7 }, // Tigrinya/Ethiopic/Eritrea
- { 123, 7, 214, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 756,8 , 756,8 , 756,8 , 756,8 , 269,6 , 97,16 , 18,7 , 25,12 , 10914,29 , 10943,60 , 11003,14 , 10914,29 , 10943,60 , 11003,14 , 343,10 , 312,6 , 1024,5 , 1029,59 , 1088,65 , {84,79,80}, 195,2 , 14545,41 , 8,5 , 4,0 , 4227,13 , 1635,5 , 2, 1, 1, 6, 7 }, // Tongan/Latin/Tonga
- { 124, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Tsonga/Latin/South Africa
- { 125, 7, 217, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 764,8 , 764,8 , 1339,9 , 1348,16 , 37,5 , 8,10 , 11017,28 , 11045,54 , 11099,14 , 11017,28 , 11045,54 , 11099,14 , 353,2 , 318,2 , 199,4 , 5,17 , 22,23 , {84,82,89}, 252,1 , 14586,40 , 4,4 , 13,6 , 4240,6 , 4246,7 , 2, 1, 1, 6, 7 }, // Turkish/Latin/Turkey
- { 125, 7, 56, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 764,8 , 764,8 , 1339,9 , 1348,16 , 18,7 , 25,12 , 11017,28 , 11045,54 , 11099,14 , 11017,28 , 11045,54 , 11099,14 , 353,2 , 318,2 , 199,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 4,4 , 13,6 , 4240,6 , 4253,6 , 2, 1, 1, 6, 7 }, // Turkish/Latin/Cyprus
- { 126, 7, 218, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8220, 8221, 0,6 , 0,6 , 772,8 , 772,8 , 495,10 , 1348,16 , 37,5 , 8,10 , 11113,28 , 11141,54 , 11195,14 , 11209,28 , 11237,54 , 11195,14 , 355,13 , 320,14 , 1153,4 , 5,17 , 22,23 , {84,77,84}, 326,3 , 14626,49 , 19,5 , 4,0 , 4259,12 , 4271,12 , 2, 1, 1, 6, 7 }, // Turkmen/Latin/Turkmenistan
- { 128, 1, 44, 46, 44, 59, 37, 48, 45, 43, 101, 187, 171, 8250, 8249, 0,6 , 0,6 , 195,10 , 205,9 , 53,10 , 1364,17 , 18,7 , 25,12 , 11291,21 , 11312,55 , 11367,14 , 11291,21 , 11312,55 , 11367,14 , 368,12 , 334,12 , 45,4 , 5,17 , 22,23 , {67,78,89}, 243,1 , 14675,40 , 4,4 , 13,6 , 4283,8 , 4291,5 , 2, 1, 7, 6, 7 }, // Uighur/Arabic/China
- { 129, 2, 222, 44, 160, 59, 37, 48, 45, 43, 1077, 171, 187, 8222, 8220, 0,6 , 0,6 , 133,7 , 133,7 , 156,8 , 1381,22 , 37,5 , 8,10 , 1454,21 , 11381,56 , 11437,14 , 1454,21 , 11381,56 , 11437,14 , 380,2 , 346,2 , 1157,5 , 680,17 , 22,23 , {85,65,72}, 292,1 , 14715,49 , 19,5 , 4,0 , 4296,10 , 4306,7 , 2, 1, 1, 6, 7 }, // Ukrainian/Cyrillic/Ukraine
- { 130, 1, 163, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 557,6 , 557,6 , 780,10 , 790,9 , 269,6 , 1403,18 , 18,7 , 25,12 , 11451,36 , 11451,36 , 85,14 , 11451,36 , 11451,36 , 85,14 , 0,2 , 0,2 , 1162,4 , 1166,20 , 22,23 , {80,75,82}, 176,2 , 14764,49 , 4,4 , 13,6 , 4313,4 , 3240,7 , 2, 0, 7, 6, 7 }, // Urdu/Arabic/Pakistan
- { 130, 1, 100, 1643, 1644, 59, 37, 1776, 45, 43, 101, 8221, 8220, 8217, 8216, 557,6 , 557,6 , 780,10 , 790,9 , 269,6 , 1403,18 , 18,7 , 25,12 , 11451,36 , 11451,36 , 85,14 , 11451,36 , 11451,36 , 85,14 , 0,2 , 0,2 , 1162,4 , 1166,20 , 22,23 , {73,78,82}, 121,1 , 14813,42 , 4,4 , 13,6 , 4313,4 , 4317,5 , 2, 1, 7, 7, 7 }, // Urdu/Arabic/India
- { 131, 7, 228, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8217, 8216, 0,6 , 0,6 , 799,8 , 799,8 , 27,8 , 1421,18 , 37,5 , 403,11 , 11487,32 , 11519,61 , 11580,14 , 11487,32 , 11519,61 , 11580,14 , 382,2 , 348,2 , 199,4 , 5,17 , 22,23 , {85,90,83}, 329,4 , 14855,58 , 19,5 , 4,0 , 4322,6 , 4328,11 , 2, 0, 1, 6, 7 }, // Uzbek/Latin/Uzbekistan
- { 131, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 394,8 , 1439,33 , 55,4 , 403,11 , 11594,21 , 7794,49 , 85,14 , 11594,21 , 7794,49 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {65,70,78}, 268,1 , 14913,13 , 19,5 , 4,0 , 4339,6 , 3231,9 , 0, 0, 6, 4, 5 }, // Uzbek/Arabic/Afghanistan
- { 131, 2, 228, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 696,19 , 37,5 , 87,12 , 11615,28 , 11643,53 , 11696,14 , 11615,28 , 11643,53 , 11696,14 , 384,2 , 350,2 , 45,4 , 5,17 , 22,23 , {85,90,83}, 333,3 , 14926,49 , 19,5 , 4,0 , 4345,7 , 4352,10 , 2, 0, 1, 6, 7 }, // Uzbek/Cyrillic/Uzbekistan
- { 132, 7, 232, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 807,8 , 807,8 , 119,10 , 192,18 , 37,5 , 8,10 , 11710,33 , 11743,55 , 11798,21 , 11710,33 , 11743,55 , 11798,21 , 386,2 , 352,2 , 45,4 , 5,17 , 22,23 , {86,78,68}, 336,1 , 14975,33 , 19,5 , 4,0 , 4362,10 , 4372,8 , 0, 0, 1, 6, 7 }, // Vietnamese/Latin/Vietnam
- { 133, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 1472,23 , 37,5 , 8,10 , 11819,21 , 11840,43 , 11883,14 , 11897,28 , 11840,43 , 11883,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 4380,7 , 0,0 , 2, 1, 1, 6, 7 }, // Volapuk/Latin/World
- { 134, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 815,11 , 826,10 , 27,8 , 10,17 , 37,5 , 8,10 , 11925,29 , 11954,77 , 12031,15 , 12046,30 , 11954,77 , 12031,15 , 388,2 , 354,2 , 1186,7 , 5,17 , 22,23 , {71,66,80}, 119,1 , 15008,91 , 4,4 , 13,6 , 4387,7 , 4394,16 , 2, 1, 1, 6, 7 }, // Welsh/Latin/United Kingdom
- { 135, 7, 187, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 528,10 , 1495,17 , 37,5 , 8,10 , 12076,28 , 12104,50 , 12076,28 , 12076,28 , 12104,50 , 12076,28 , 390,3 , 356,3 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 15099,65 , 8,5 , 4,0 , 4410,5 , 4415,8 , 0, 0, 1, 6, 7 }, // Wolof/Latin/Senegal
- { 136, 7, 195, 46, 160, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 12154,28 , 12182,61 , 85,14 , 12154,28 , 12182,61 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 15164,79 , 4,4 , 4,0 , 4423,8 , 4431,15 , 2, 1, 7, 6, 7 }, // Xhosa/Latin/South Africa
- { 137, 18, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 836,9 , 836,9 , 27,8 , 1512,19 , 37,5 , 8,10 , 12243,54 , 12243,54 , 85,14 , 12243,54 , 12243,54 , 85,14 , 393,11 , 359,10 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 4446,6 , 4452,5 , 2, 1, 1, 6, 7 }, // Yiddish/Hebrew/World
- { 138, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 1531,16 , 470,3 , 8,10 , 12297,33 , 12330,44 , 12374,14 , 12297,33 , 12388,69 , 12374,14 , 404,5 , 369,5 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 15243,49 , 4,4 , 13,6 , 4457,10 , 4467,19 , 2, 1, 1, 6, 7 }, // Yoruba/Latin/Nigeria
- { 138, 7, 23, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 1531,16 , 470,3 , 8,10 , 12457,33 , 12490,44 , 12534,14 , 12457,33 , 12548,69 , 12534,14 , 409,5 , 374,5 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 15292,34 , 4,4 , 13,6 , 4457,10 , 4486,16 , 0, 0, 1, 6, 7 }, // Yoruba/Latin/Benin
- { 140, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 845,9 , 854,8 , 547,6 , 35,18 , 37,5 , 8,10 , 12617,28 , 12645,74 , 12719,14 , 12617,28 , 12645,74 , 12719,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {90,65,82}, 5,1 , 15326,67 , 4,4 , 13,6 , 4502,7 , 4509,17 , 2, 1, 7, 6, 7 }, // Zulu/Latin/South Africa
- { 141, 7, 161, 44, 160, 59, 37, 48, 8722, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 187,8 , 187,8 , 495,10 , 478,17 , 37,5 , 414,16 , 12733,28 , 12761,51 , 2320,14 , 12812,28 , 12761,51 , 2320,14 , 414,9 , 379,11 , 45,4 , 5,17 , 22,23 , {78,79,75}, 190,2 , 10046,44 , 19,5 , 4,0 , 4526,7 , 4533,5 , 2, 0, 1, 6, 7 }, // Norwegian Nynorsk/Latin/Norway
- { 142, 7, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 8216, 8217, 0,6 , 0,6 , 158,7 , 158,7 , 1547,11 , 450,19 , 37,5 , 8,10 , 2043,28 , 2071,58 , 2129,14 , 2043,28 , 2071,58 , 2143,14 , 423,10 , 390,7 , 319,7 , 5,17 , 22,23 , {66,65,77}, 144,2 , 15393,170 , 19,5 , 4,0 , 4538,8 , 629,19 , 2, 1, 1, 6, 7 }, // Bosnian/Latin/Bosnia And Herzegowina
- { 142, 2, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 111,7 , 111,7 , 1091,7 , 1098,20 , 37,5 , 8,10 , 12840,28 , 12868,56 , 8907,14 , 12840,28 , 12868,56 , 8907,14 , 245,11 , 397,13 , 45,4 , 5,17 , 22,23 , {66,65,77}, 296,2 , 15563,152 , 19,5 , 4,0 , 4546,8 , 3600,19 , 2, 1, 1, 6, 7 }, // Bosnian/Cyrillic/Bosnia And Herzegowina
- { 143, 29, 131, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,86,82}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 5, 6, 7 }, // Divehi/Thaana/Maldives
- { 144, 7, 251, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 80,17 , 37,5 , 8,10 , 12924,30 , 12954,57 , 85,14 , 12924,30 , 12954,57 , 85,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {71,66,80}, 119,1 , 0,7 , 4,4 , 4,0 , 4554,5 , 4559,12 , 2, 1, 1, 6, 7 }, // Manx/Latin/Isle Of Man
- { 145, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 97,16 , 37,5 , 8,10 , 13011,28 , 13039,61 , 85,14 , 13011,28 , 13039,61 , 85,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {71,66,80}, 119,1 , 0,7 , 4,4 , 4,0 , 4571,8 , 4579,14 , 2, 1, 1, 6, 7 }, // Cornish/Latin/United Kingdom
- { 146, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 1558,8 , 1566,18 , 18,7 , 25,12 , 13100,28 , 13128,49 , 13177,14 , 13100,28 , 13128,49 , 13177,14 , 433,2 , 410,2 , 45,4 , 5,17 , 22,23 , {71,72,83}, 167,3 , 15715,17 , 4,4 , 4,0 , 4593,4 , 4597,5 , 2, 1, 1, 6, 7 }, // Akan/Latin/Ghana
- { 147, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 1584,6 , 97,16 , 18,7 , 25,12 , 13191,49 , 13191,49 , 13240,20 , 13191,49 , 13191,49 , 13240,20 , 0,2 , 0,2 , 1193,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 15732,31 , 4,4 , 13,6 , 4602,6 , 2662,4 , 2, 1, 7, 7, 7 }, // Konkani/Devanagari/India
- { 148, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,72,83}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Ga/Latin/Ghana
- { 149, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 862,9 , 691,8 , 269,6 , 10,17 , 37,5 , 8,10 , 13260,29 , 13289,54 , 85,14 , 13260,29 , 13289,54 , 85,14 , 435,7 , 412,7 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 15763,12 , 4,4 , 13,6 , 4608,10 , 4618,8 , 2, 1, 1, 6, 7 }, // Igbo/Latin/Nigeria
- { 150, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 13343,28 , 13371,74 , 13445,14 , 13343,28 , 13371,74 , 13445,14 , 442,9 , 419,7 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 15775,23 , 4,4 , 13,6 , 4626,7 , 1191,5 , 2, 1, 7, 6, 7 }, // Kamba/Latin/Kenya
- { 151, 33, 103, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,81,68}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 6, 5, 6 }, // Syriac/Syriac/Iraq
- { 152, 14, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,82,78}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Blin/Ethiopic/Eritrea
- { 153, 14, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Geez/Ethiopic/Ethiopia
- { 155, 7, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Sidamo/Latin/Ethiopia
- { 156, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Atsam/Latin/Nigeria
- { 157, 14, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,82,78}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Tigre/Ethiopic/Eritrea
- { 158, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Jju/Latin/Nigeria
- { 159, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 249,7 , 249,7 , 27,8 , 1590,27 , 37,5 , 8,10 , 13459,28 , 13487,50 , 3107,14 , 13459,28 , 13487,50 , 3107,14 , 451,2 , 426,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 8,5 , 4,0 , 4633,6 , 4639,6 , 2, 1, 1, 6, 7 }, // Friulian/Latin/Italy
- { 160, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Venda/Latin/South Africa
- { 161, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 871,11 , 882,10 , 547,6 , 1617,23 , 473,12 , 485,17 , 13537,28 , 13565,44 , 13609,14 , 13537,28 , 13565,44 , 13609,14 , 453,3 , 428,5 , 45,4 , 5,17 , 22,23 , {71,72,83}, 167,3 , 15798,37 , 4,4 , 13,6 , 4645,6 , 4651,12 , 2, 1, 1, 6, 7 }, // Ewe/Latin/Ghana
- { 161, 7, 212, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 871,11 , 882,10 , 547,6 , 1617,23 , 37,5 , 8,10 , 13537,28 , 13565,44 , 13609,14 , 13537,28 , 13565,44 , 13609,14 , 453,3 , 428,5 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 15835,106 , 4,4 , 13,6 , 4645,6 , 4663,11 , 0, 0, 1, 6, 7 }, // Ewe/Latin/Togo
- { 162, 14, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Walamo/Ethiopic/Ethiopia
- { 163, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 269,6 , 10,17 , 18,7 , 25,12 , 13623,21 , 13644,57 , 85,14 , 13623,21 , 13644,57 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 6,1 , 0,7 , 4,4 , 13,6 , 4674,14 , 4688,19 , 2, 1, 7, 6, 7 }, // Hawaiian/Latin/United States
- { 164, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Tyap/Latin/Nigeria
- { 165, 7, 129, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,87,75}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Nyanja/Latin/Malawi
- { 166, 7, 170, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 892,9 , 901,8 , 547,6 , 35,18 , 18,7 , 25,12 , 13701,28 , 13729,55 , 13701,28 , 13701,28 , 13729,55 , 13701,28 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {80,72,80}, 179,1 , 15941,58 , 4,4 , 13,6 , 4707,8 , 4715,9 , 2, 1, 7, 6, 7 }, // Filipino/Latin/Philippines
- { 167, 7, 206, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 264,9 , 264,9 , 156,8 , 622,18 , 37,5 , 8,10 , 13784,28 , 13812,63 , 3695,14 , 13784,28 , 13812,63 , 3695,14 , 456,12 , 433,11 , 45,4 , 5,17 , 22,23 , {67,72,70}, 224,3 , 15999,55 , 19,5 , 4,0 , 4724,16 , 4740,7 , 2, 0, 1, 6, 7 }, // Swiss German/Latin/Switzerland
- { 167, 7, 74, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 264,9 , 264,9 , 156,8 , 622,18 , 37,5 , 8,10 , 13784,28 , 13812,63 , 3695,14 , 13784,28 , 13812,63 , 3695,14 , 456,12 , 433,11 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 4724,16 , 4747,10 , 2, 1, 1, 6, 7 }, // Swiss German/Latin/France
- { 167, 7, 123, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 264,9 , 264,9 , 156,8 , 622,18 , 37,5 , 8,10 , 13784,28 , 13812,63 , 3695,14 , 13784,28 , 13812,63 , 3695,14 , 456,12 , 433,11 , 45,4 , 5,17 , 22,23 , {67,72,70}, 224,3 , 15999,55 , 19,5 , 4,0 , 4724,16 , 4757,13 , 2, 0, 1, 6, 7 }, // Swiss German/Latin/Liechtenstein
- { 168, 34, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 18,7 , 25,12 , 13875,21 , 13896,28 , 13924,14 , 13875,21 , 13896,28 , 13924,14 , 468,2 , 444,2 , 45,4 , 5,17 , 22,23 , {67,78,89}, 133,1 , 0,7 , 8,5 , 4,0 , 4770,3 , 4773,2 , 2, 1, 7, 6, 7 }, // Sichuan Yi/Yi/China
- { 169, 7, 121, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Kpelle/Latin/Liberia
- { 170, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 456,8 , 456,8 , 365,7 , 1640,23 , 502,10 , 512,19 , 13938,28 , 13966,65 , 3695,14 , 13938,28 , 13966,65 , 3695,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 16054,15 , 19,5 , 4,0 , 4775,14 , 4789,11 , 2, 1, 1, 6, 7 }, // Low German/Latin/Germany
- { 170, 7, 151, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 456,8 , 456,8 , 365,7 , 1640,23 , 502,10 , 512,19 , 13938,28 , 13966,65 , 3695,14 , 13938,28 , 13966,65 , 3695,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 16054,15 , 19,5 , 4,0 , 4775,14 , 4800,12 , 2, 1, 1, 6, 7 }, // Low German/Latin/Netherlands
- { 171, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // South Ndebele/Latin/South Africa
- { 172, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Northern Sotho/Latin/South Africa
- { 173, 7, 161, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 223,8 , 223,8 , 53,10 , 63,17 , 37,5 , 8,10 , 14031,33 , 14064,75 , 14139,14 , 14031,33 , 14064,75 , 14139,14 , 470,11 , 446,13 , 45,4 , 5,17 , 22,23 , {78,79,75}, 190,2 , 16069,63 , 19,5 , 4,0 , 4812,15 , 4827,5 , 2, 0, 1, 6, 7 }, // Northern Sami/Latin/Norway
- { 173, 7, 73, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 223,8 , 223,8 , 495,10 , 97,16 , 37,5 , 8,10 , 14153,21 , 14174,70 , 14244,14 , 14153,21 , 14174,70 , 14244,14 , 481,2 , 459,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 16132,23 , 19,5 , 4,0 , 4812,15 , 4832,6 , 2, 1, 1, 6, 7 }, // Northern Sami/Latin/Finland
- { 173, 7, 205, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 223,8 , 223,8 , 53,10 , 63,17 , 37,5 , 8,10 , 14031,33 , 14064,75 , 14139,14 , 14031,33 , 14064,75 , 14139,14 , 470,11 , 446,13 , 45,4 , 5,17 , 22,23 , {83,69,75}, 190,2 , 16155,63 , 19,5 , 4,0 , 4812,15 , 4838,6 , 2, 0, 1, 6, 7 }, // Northern Sami/Latin/Sweden
- { 174, 7, 208, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {84,87,68}, 337,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Taroko/Latin/Taiwan
- { 175, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 14258,28 , 14286,62 , 14348,14 , 14258,28 , 14286,62 , 14348,14 , 483,6 , 461,3 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16218,24 , 4,4 , 13,6 , 4844,8 , 1191,5 , 2, 1, 7, 6, 7 }, // Gusii/Latin/Kenya
- { 176, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 14362,28 , 14390,105 , 14495,14 , 14362,28 , 14390,105 , 14495,14 , 489,10 , 464,10 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16218,24 , 4,4 , 13,6 , 4852,7 , 1191,5 , 2, 1, 7, 6, 7 }, // Taita/Latin/Kenya
- { 177, 7, 187, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 16242,26 , 19,5 , 4,0 , 4859,6 , 4415,8 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Senegal
- { 177, 7, 34, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 16242,26 , 19,5 , 4,0 , 4859,6 , 4865,14 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Burkina Faso
- { 177, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 16268,25 , 19,5 , 4,0 , 4859,6 , 4879,8 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Cameroon
- { 177, 7, 80, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {71,77,68}, 166,1 , 16293,20 , 19,5 , 4,0 , 4859,6 , 4887,6 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Gambia
- { 177, 7, 83, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {71,72,83}, 167,3 , 0,7 , 19,5 , 4,0 , 4859,6 , 4893,5 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Ghana
- { 177, 7, 91, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {71,78,70}, 216,2 , 0,7 , 19,5 , 4,0 , 4859,6 , 4898,4 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea
- { 177, 7, 92, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 16242,26 , 19,5 , 4,0 , 4859,6 , 4902,12 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea Bissau
- { 177, 7, 121, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 16313,23 , 19,5 , 4,0 , 4859,6 , 4914,9 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Liberia
- { 177, 7, 136, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {77,82,85}, 219,2 , 16336,22 , 19,5 , 4,0 , 4859,6 , 4923,8 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Mauritania
- { 177, 7, 156, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 16242,26 , 19,5 , 4,0 , 4859,6 , 4931,6 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Niger
- { 177, 7, 157, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {78,71,78}, 178,1 , 16358,23 , 19,5 , 4,0 , 4859,6 , 4937,9 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Nigeria
- { 177, 7, 189, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 14509,28 , 14537,59 , 14596,14 , 14509,28 , 14537,59 , 14596,14 , 499,6 , 474,7 , 45,4 , 5,17 , 22,23 , {83,76,76}, 187,2 , 16381,25 , 19,5 , 4,0 , 4859,6 , 4946,11 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Sierra Leone
- { 177, 134, 91, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,78,70}, 216,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Fulah/Adlam/Guinea
- { 178, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 14610,28 , 14638,63 , 14701,14 , 14610,28 , 14638,63 , 14701,14 , 505,6 , 481,8 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16406,23 , 4,4 , 13,6 , 4957,6 , 1191,5 , 2, 1, 7, 6, 7 }, // Kikuyu/Latin/Kenya
- { 179, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 14715,28 , 14743,105 , 14848,14 , 14715,28 , 14743,105 , 14848,14 , 511,7 , 489,5 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16429,25 , 4,4 , 13,6 , 4963,8 , 1191,5 , 2, 1, 7, 6, 7 }, // Samburu/Latin/Kenya
- { 180, 7, 146, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 669,27 , 37,5 , 8,10 , 14862,28 , 14890,55 , 14945,14 , 14862,28 , 14890,55 , 14945,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,90,78}, 278,3 , 16454,28 , 0,4 , 4,0 , 4971,4 , 3371,10 , 2, 1, 7, 6, 7 }, // Sena/Latin/Mozambique
- { 181, 7, 240, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 14959,28 , 14987,50 , 15037,14 , 14959,28 , 14987,50 , 15037,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 16482,24 , 4,4 , 13,6 , 4975,10 , 1815,8 , 2, 1, 7, 6, 7 }, // North Ndebele/Latin/Zimbabwe
- { 182, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15051,29 , 15080,65 , 15145,14 , 15051,29 , 15080,65 , 15145,14 , 518,8 , 494,7 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16506,25 , 4,4 , 4,0 , 4985,9 , 1620,8 , 2, 0, 1, 6, 7 }, // Rombo/Latin/Tanzania
- { 183, 9, 145, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 15159,30 , 15189,47 , 85,14 , 15159,30 , 15189,47 , 85,14 , 526,6 , 501,8 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 16531,21 , 0,4 , 4,0 , 4994,7 , 5001,6 , 2, 1, 1, 6, 7 }, // Tachelhit/Tifinagh/Morocco
- { 183, 7, 145, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 15236,30 , 15266,48 , 85,14 , 15236,30 , 15266,48 , 85,14 , 532,6 , 509,8 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 16552,21 , 0,4 , 4,0 , 5007,10 , 5017,6 , 2, 1, 1, 6, 7 }, // Tachelhit/Latin/Morocco
- { 184, 7, 3, 44, 160, 59, 37, 48, 45, 43, 122, 171, 187, 8220, 8221, 0,6 , 0,6 , 909,12 , 921,11 , 415,8 , 97,16 , 18,7 , 25,12 , 15314,28 , 15342,34 , 15376,14 , 15390,30 , 15420,51 , 15471,14 , 538,7 , 517,9 , 1197,7 , 1204,21 , 22,23 , {68,90,68}, 205,2 , 16573,53 , 0,4 , 4,0 , 5023,9 , 5032,8 , 2, 1, 6, 5, 6 }, // Kabyle/Latin/Algeria
- { 185, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15485,28 , 15513,74 , 15587,14 , 15485,28 , 15513,74 , 15587,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,71,88}, 197,3 , 16626,26 , 4,4 , 4,0 , 5040,10 , 1685,6 , 0, 0, 1, 7, 7 }, // Nyankole/Latin/Uganda
- { 186, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15601,28 , 15629,82 , 15711,14 , 15601,28 , 15629,82 , 15711,14 , 545,7 , 526,7 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16652,29 , 0,4 , 4,0 , 5050,6 , 5056,10 , 2, 0, 1, 6, 7 }, // Bena/Latin/Tanzania
- { 187, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15725,28 , 15753,62 , 15815,14 , 15725,28 , 15753,62 , 15815,14 , 552,5 , 533,9 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16681,27 , 4,4 , 4,0 , 5066,8 , 1620,8 , 2, 0, 1, 6, 7 }, // Vunjo/Latin/Tanzania
- { 188, 7, 132, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 15829,28 , 15857,44 , 15901,14 , 15829,28 , 15857,44 , 15901,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 16708,24 , 4,4 , 13,6 , 5074,9 , 2184,4 , 0, 0, 1, 6, 7 }, // Bambara/Latin/Mali
- { 188, 75, 132, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Bambara/Nko/Mali
- { 189, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15915,28 , 15943,64 , 16007,14 , 15915,28 , 15943,64 , 16007,14 , 557,2 , 542,2 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16218,24 , 4,4 , 13,6 , 5083,6 , 1191,5 , 2, 1, 7, 6, 7 }, // Embu/Latin/Kenya
- { 190, 12, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 932,9 , 941,8 , 547,6 , 35,18 , 18,7 , 25,12 , 16021,28 , 16049,49 , 16098,14 , 16021,28 , 16049,49 , 16098,14 , 559,3 , 544,6 , 1225,6 , 5,17 , 22,23 , {85,83,68}, 6,1 , 16732,25 , 4,4 , 13,6 , 5089,3 , 5092,15 , 2, 1, 7, 6, 7 }, // Cherokee/Cherokee/United States
- { 191, 7, 137, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 16112,27 , 16139,48 , 16187,14 , 16112,27 , 16139,48 , 16187,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,85,82}, 176,2 , 16757,21 , 8,5 , 4,0 , 5107,14 , 5121,5 , 2, 0, 1, 6, 7 }, // Morisyen/Latin/Mauritius
- { 192, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 16201,28 , 16229,133 , 15145,14 , 16201,28 , 16229,133 , 15145,14 , 562,4 , 550,5 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16681,27 , 4,4 , 13,6 , 5126,10 , 1620,8 , 2, 0, 1, 6, 7 }, // Makonde/Latin/Tanzania
- { 193, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 16362,36 , 16398,63 , 16461,14 , 16362,36 , 16398,63 , 16461,14 , 566,3 , 555,3 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16778,29 , 8,5 , 4,0 , 5136,8 , 5144,9 , 2, 0, 1, 6, 7 }, // Langi/Latin/Tanzania
- { 194, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 16475,28 , 16503,66 , 16569,14 , 16475,28 , 16503,66 , 16569,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,71,88}, 197,3 , 16807,26 , 0,4 , 4,0 , 5153,7 , 5160,7 , 0, 0, 1, 7, 7 }, // Ganda/Latin/Uganda
- { 195, 7, 239, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 16583,80 , 16583,80 , 85,14 , 16583,80 , 16583,80 , 85,14 , 569,8 , 558,7 , 45,4 , 5,17 , 22,23 , {90,77,87}, 131,1 , 0,7 , 4,4 , 13,6 , 5167,9 , 1809,6 , 2, 1, 1, 6, 7 }, // Bemba/Latin/Zambia
- { 196, 7, 39, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 158,7 , 158,7 , 119,10 , 1663,27 , 37,5 , 8,10 , 16663,28 , 16691,73 , 16764,14 , 16663,28 , 16778,73 , 16764,14 , 68,2 , 65,2 , 45,4 , 5,17 , 22,23 , {67,86,69}, 277,1 , 16833,43 , 19,5 , 24,7 , 5176,12 , 5188,10 , 2, 1, 1, 6, 7 }, // Kabuverdianu/Latin/Cape Verde
- { 197, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 16851,28 , 16879,51 , 16930,14 , 16851,28 , 16879,51 , 16930,14 , 577,2 , 565,2 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16218,24 , 4,4 , 13,6 , 5198,6 , 1191,5 , 2, 1, 7, 6, 7 }, // Meru/Latin/Kenya
- { 198, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 16944,28 , 16972,53 , 17025,14 , 16944,28 , 16972,53 , 17025,14 , 579,6 , 567,10 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16876,26 , 4,4 , 13,6 , 5204,8 , 5212,12 , 2, 1, 7, 6, 7 }, // Kalenjin/Latin/Kenya
- { 199, 7, 148, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 17039,23 , 17062,92 , 17154,14 , 17039,23 , 17062,92 , 17154,14 , 585,7 , 577,5 , 45,4 , 5,17 , 22,23 , {78,65,68}, 6,1 , 16902,22 , 4,4 , 4,0 , 5224,13 , 5237,8 , 2, 1, 1, 6, 7 }, // Nama/Latin/Namibia
- { 200, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15725,28 , 15753,62 , 15815,14 , 15725,28 , 15753,62 , 15815,14 , 552,5 , 533,9 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16681,27 , 4,4 , 4,0 , 5245,9 , 1620,8 , 2, 0, 1, 6, 7 }, // Machame/Latin/Tanzania
- { 201, 7, 82, 44, 160, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 456,8 , 456,8 , 1141,10 , 1690,23 , 37,5 , 8,10 , 17168,28 , 17196,72 , 3695,14 , 17168,28 , 17196,72 , 3695,14 , 592,16 , 582,16 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 16924,11 , 19,5 , 4,0 , 5254,6 , 5260,11 , 2, 1, 1, 6, 7 }, // Colognian/Latin/Germany
- { 202, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15725,28 , 17268,58 , 15145,14 , 15725,28 , 17268,58 , 15145,14 , 608,9 , 598,6 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16935,25 , 4,4 , 13,6 , 5271,3 , 1191,5 , 2, 1, 7, 6, 7 }, // Masai/Latin/Kenya
- { 202, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15725,28 , 17268,58 , 15145,14 , 15725,28 , 17268,58 , 15145,14 , 608,9 , 598,6 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16960,28 , 4,4 , 13,6 , 5271,3 , 5274,8 , 2, 0, 1, 6, 7 }, // Masai/Latin/Tanzania
- { 203, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17326,35 , 17361,65 , 17426,14 , 17326,35 , 17361,65 , 17426,14 , 617,6 , 604,6 , 45,4 , 5,17 , 22,23 , {85,71,88}, 197,3 , 16807,26 , 19,5 , 4,0 , 5282,7 , 5160,7 , 0, 0, 1, 7, 7 }, // Soga/Latin/Uganda
- { 204, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17440,21 , 17461,75 , 85,14 , 17440,21 , 17461,75 , 85,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16988,23 , 4,4 , 68,6 , 5289,7 , 1191,5 , 2, 1, 7, 6, 7 }, // Luyia/Latin/Kenya
- { 205, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17536,28 , 10012,60 , 15815,14 , 17536,28 , 10012,60 , 15815,14 , 623,9 , 610,8 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 17011,28 , 19,5 , 4,0 , 5296,6 , 5302,8 , 2, 0, 1, 6, 7 }, // Asu/Latin/Tanzania
- { 206, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17564,28 , 17592,69 , 17661,14 , 17564,28 , 17592,69 , 17661,14 , 632,9 , 618,6 , 45,4 , 5,17 , 22,23 , {85,71,88}, 197,3 , 17039,28 , 4,4 , 13,6 , 5310,6 , 1685,6 , 0, 0, 1, 7, 7 }, // Teso/Latin/Uganda
- { 206, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17564,28 , 17592,69 , 17661,14 , 17564,28 , 17592,69 , 17661,14 , 632,9 , 618,6 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 17067,27 , 4,4 , 13,6 , 5310,6 , 5316,5 , 2, 1, 7, 6, 7 }, // Teso/Latin/Kenya
- { 207, 7, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,82,78}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Saho/Latin/Eritrea
- { 208, 7, 132, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 17675,28 , 17703,53 , 17756,14 , 17675,28 , 17703,53 , 17756,14 , 641,6 , 624,6 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 17094,23 , 0,4 , 4,0 , 5321,11 , 5332,5 , 0, 0, 1, 6, 7 }, // Koyra Chiini/Latin/Mali
- { 209, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15725,28 , 15753,62 , 15815,14 , 15725,28 , 15753,62 , 15815,14 , 552,5 , 533,9 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 16681,27 , 0,4 , 4,0 , 5337,6 , 1620,8 , 2, 0, 1, 6, 7 }, // Rwa/Latin/Tanzania
- { 210, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17770,28 , 17798,69 , 17867,14 , 17770,28 , 17798,69 , 17867,14 , 647,2 , 630,2 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 17117,23 , 0,4 , 4,0 , 5343,6 , 1191,5 , 2, 1, 7, 6, 7 }, // Luo/Latin/Kenya
- { 211, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 15485,28 , 15513,74 , 15587,14 , 15485,28 , 15513,74 , 15587,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,71,88}, 197,3 , 16626,26 , 4,4 , 4,0 , 5349,6 , 1685,6 , 0, 0, 1, 7, 7 }, // Chiga/Latin/Uganda
- { 212, 7, 145, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 17881,28 , 17909,48 , 17957,14 , 17881,28 , 17909,48 , 17957,14 , 649,9 , 632,10 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 17140,22 , 19,5 , 4,0 , 5355,17 , 5372,6 , 2, 1, 1, 6, 7 }, // Central Morocco Tamazight/Latin/Morocco
- { 213, 7, 132, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 17971,28 , 17999,54 , 17756,14 , 17971,28 , 17999,54 , 17756,14 , 641,6 , 624,6 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 17094,23 , 0,4 , 4,0 , 5378,15 , 5332,5 , 0, 0, 1, 6, 7 }, // Koyraboro Senni/Latin/Mali
- { 214, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 18053,28 , 18081,63 , 18144,14 , 18053,28 , 18081,63 , 18144,14 , 658,5 , 642,8 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 17162,27 , 0,4 , 4,0 , 5393,9 , 1620,8 , 2, 0, 1, 6, 7 }, // Shambala/Latin/Tanzania
- { 215, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 547,6 , 35,18 , 18,7 , 25,12 , 18158,33 , 18191,54 , 18245,19 , 18158,33 , 18191,54 , 18245,19 , 663,3 , 650,6 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 17189,10 , 8,5 , 4,0 , 5402,4 , 2662,4 , 2, 1, 7, 7, 7 }, // Bodo/Devanagari/India
- { 218, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 18264,25 , 18289,45 , 18334,17 , 18264,25 , 18289,45 , 18264,25 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 17199,43 , 19,5 , 4,0 , 5406,7 , 5413,5 , 2, 1, 1, 6, 7 }, // Chechen/Cyrillic/Russia
- { 219, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 949,8 , 949,8 , 1003,10 , 1713,23 , 37,5 , 8,10 , 18351,37 , 18388,68 , 11437,14 , 18351,37 , 18388,68 , 11437,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 17242,44 , 19,5 , 4,0 , 5418,19 , 5437,7 , 2, 1, 1, 6, 7 }, // Church/Cyrillic/Russia
- { 220, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Chuvash/Cyrillic/Russia
- { 230, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18456,28 , 18484,50 , 18534,14 , 18456,28 , 18484,50 , 18534,14 , 666,5 , 656,6 , 45,4 , 5,17 , 22,23 , {67,68,70}, 210,2 , 17286,24 , 0,4 , 4,0 , 5444,8 , 5452,16 , 2, 1, 1, 6, 7 }, // Luba Katanga/Latin/Congo Kinshasa
- { 231, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 957,10 , 957,10 , 156,8 , 622,18 , 37,5 , 8,10 , 18548,28 , 18576,65 , 3695,14 , 18641,35 , 18576,65 , 3695,14 , 671,5 , 662,8 , 445,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8436,19 , 19,5 , 4,0 , 5468,14 , 5482,10 , 2, 1, 1, 6, 7 }, // Luxembourgish/Latin/Luxembourg
- { 236, 7, 21, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Walloon/Latin/Belgium
- { 237, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18676,28 , 18704,72 , 18776,14 , 18676,28 , 18704,72 , 18776,14 , 676,3 , 670,3 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17310,21 , 0,4 , 4,0 , 5492,5 , 5497,7 , 0, 0, 1, 6, 7 }, // Aghem/Latin/Cameroon
- { 238, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18790,28 , 18818,70 , 18888,14 , 18790,28 , 18818,70 , 18888,14 , 679,10 , 673,9 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17331,22 , 19,5 , 4,0 , 5504,5 , 5509,8 , 0, 0, 1, 6, 7 }, // Basaa/Latin/Cameroon
- { 239, 7, 156, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 17971,28 , 18902,53 , 18955,14 , 17971,28 , 18902,53 , 18955,14 , 689,8 , 682,10 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 17094,23 , 0,4 , 4,0 , 5517,10 , 5527,5 , 0, 0, 1, 6, 7 }, // Zarma/Latin/Niger
- { 240, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 18969,28 , 18997,45 , 19042,14 , 18969,28 , 18997,45 , 19042,14 , 697,5 , 692,6 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 0,7 , 19,5 , 4,0 , 5532,5 , 1981,8 , 0, 0, 1, 6, 7 }, // Duala/Latin/Cameroon
- { 241, 7, 187, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 19056,28 , 19084,50 , 19134,14 , 19056,28 , 19084,50 , 19134,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 17353,23 , 19,5 , 4,0 , 5537,5 , 5542,7 , 0, 0, 1, 6, 7 }, // Jola Fonyi/Latin/Senegal
- { 242, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 19148,30 , 19178,85 , 19263,14 , 19148,30 , 19178,85 , 19263,14 , 702,7 , 698,9 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17376,23 , 19,5 , 4,0 , 5549,6 , 5555,7 , 0, 0, 1, 6, 7 }, // Ewondo/Latin/Cameroon
- { 243, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 19277,29 , 19306,45 , 19351,14 , 19277,29 , 19306,45 , 19351,14 , 709,6 , 707,7 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17399,11 , 19,5 , 4,0 , 5562,5 , 5567,7 , 0, 0, 1, 6, 7 }, // Bafia/Latin/Cameroon
- { 244, 7, 146, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 19365,28 , 19393,59 , 19452,14 , 19365,28 , 19393,59 , 19452,14 , 715,8 , 714,10 , 45,4 , 5,17 , 22,23 , {77,90,78}, 278,3 , 0,7 , 8,5 , 4,0 , 5574,5 , 5579,10 , 2, 1, 7, 6, 7 }, // Makhuwa Meetto/Latin/Mozambique
- { 245, 7, 37, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 19466,28 , 19494,74 , 19568,14 , 19466,28 , 19494,74 , 19568,14 , 723,5 , 724,5 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17410,17 , 4,4 , 13,6 , 5589,6 , 5595,7 , 0, 0, 1, 6, 7 }, // Mundang/Latin/Cameroon
- { 246, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 19582,30 , 19612,89 , 19701,14 , 19582,30 , 19612,89 , 19701,14 , 728,4 , 729,4 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17427,20 , 19,5 , 4,0 , 5602,6 , 5608,7 , 0, 0, 1, 6, 7 }, // Kwasio/Latin/Cameroon
- { 247, 7, 254, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 538,9 , 97,16 , 18,7 , 531,12 , 19715,38 , 19753,79 , 19832,14 , 19715,38 , 19753,79 , 19832,14 , 732,2 , 733,2 , 45,4 , 5,17 , 22,23 , {83,83,80}, 119,1 , 0,7 , 4,4 , 13,6 , 5615,9 , 0,0 , 2, 1, 1, 6, 7 }, // Nuer/Latin/South Sudan
- { 248, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 967,11 , 967,11 , 227,6 , 1736,30 , 37,5 , 8,10 , 19846,21 , 19867,71 , 19938,14 , 19846,21 , 19867,71 , 19938,14 , 734,2 , 735,2 , 1231,5 , 1236,17 , 22,23 , {82,85,66}, 123,1 , 17447,47 , 19,5 , 4,0 , 5624,9 , 5633,9 , 2, 1, 1, 6, 7 }, // Sakha/Cyrillic/Russia
- { 249, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 19952,28 , 19980,60 , 20040,14 , 19952,28 , 19980,60 , 20040,14 , 736,9 , 737,9 , 45,4 , 5,17 , 22,23 , {84,90,83}, 192,3 , 17494,25 , 0,4 , 4,0 , 5642,9 , 5651,9 , 2, 0, 1, 6, 7 }, // Sangu/Latin/Tanzania
- { 251, 7, 156, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 17971,28 , 17999,54 , 17756,14 , 17971,28 , 17999,54 , 17756,14 , 689,8 , 682,10 , 45,4 , 5,17 , 22,23 , {88,79,70}, 207,3 , 17094,23 , 0,4 , 4,0 , 5660,13 , 5527,5 , 0, 0, 1, 6, 7 }, // Tasawaq/Latin/Niger
- { 252, 35, 121, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 20054,30 , 20054,30 , 85,14 , 20054,30 , 20054,30 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 17519,15 , 4,4 , 13,6 , 5673,2 , 5675,4 , 2, 1, 1, 6, 7 }, // Vai/Vai/Liberia
- { 252, 7, 121, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 20084,48 , 20084,48 , 85,14 , 20084,48 , 20084,48 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 17534,20 , 4,4 , 13,6 , 5679,3 , 5682,8 , 2, 1, 1, 6, 7 }, // Vai/Latin/Liberia
- { 253, 7, 206, 44, 8217, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 264,9 , 264,9 , 53,10 , 622,18 , 37,5 , 8,10 , 20132,28 , 20160,53 , 20213,14 , 20132,28 , 20160,53 , 20213,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,72,70}, 0,0 , 0,7 , 8,5 , 4,0 , 5690,6 , 5696,6 , 2, 0, 1, 6, 7 }, // Walser/Latin/Switzerland
- { 254, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 20227,21 , 20248,71 , 20319,14 , 20227,21 , 20248,71 , 20319,14 , 745,8 , 746,8 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 0,7 , 19,5 , 24,7 , 5702,6 , 5708,7 , 0, 0, 1, 6, 7 }, // Yangben/Latin/Cameroon
- { 256, 7, 197, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 684,7 , 684,7 , 269,6 , 372,22 , 37,5 , 8,10 , 20333,28 , 20361,54 , 3391,14 , 20333,28 , 20361,54 , 3391,14 , 753,12 , 754,11 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 19,5 , 4,0 , 5715,9 , 2427,6 , 2, 1, 1, 6, 7 }, // Asturian/Latin/Spain
- { 257, 7, 37, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 978,11 , 978,11 , 989,16 , 1005,9 , 53,10 , 1566,18 , 37,5 , 8,10 , 20415,60 , 20415,60 , 20475,25 , 20415,60 , 20415,60 , 20475,25 , 765,8 , 765,13 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17554,12 , 8,5 , 4,0 , 5724,5 , 5729,7 , 0, 0, 1, 6, 7 }, // Ngomba/Latin/Cameroon
- { 258, 7, 37, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 0,6 , 0,6 , 1766,10 , 80,17 , 37,5 , 8,10 , 20500,54 , 20500,54 , 20554,21 , 20500,54 , 20500,54 , 20554,21 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17566,16 , 8,5 , 4,0 , 5736,4 , 5740,7 , 0, 0, 1, 6, 7 }, // Kako/Latin/Cameroon
- { 259, 7, 37, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 1566,18 , 37,5 , 8,10 , 20575,49 , 20575,49 , 20624,21 , 20575,49 , 20575,49 , 20624,21 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17582,12 , 8,5 , 4,0 , 5747,5 , 5752,7 , 0, 0, 1, 6, 7 }, // Meta/Latin/Cameroon
- { 260, 7, 37, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1776,32 , 37,5 , 8,10 , 20645,111 , 20645,111 , 85,14 , 20645,111 , 20645,111 , 85,14 , 773,9 , 778,8 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17594,16 , 8,5 , 4,0 , 5759,16 , 5775,7 , 0, 0, 1, 6, 7 }, // Ngiemboon/Latin/Cameroon
- { 261, 7, 197, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Aragonese/Latin/Spain
- { 290, 11, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 7, 7 }, // Manipuri/Bengali/India
- { 309, 100, 232, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {86,78,68}, 336,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Tai Dam/Tai Viet/Vietnam
- { 312, 7, 37, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Akoose/Latin/Cameroon
- { 313, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 547,6 , 35,18 , 18,7 , 25,12 , 20756,87 , 20756,87 , 85,14 , 20756,87 , 20756,87 , 20843,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 6,1 , 0,7 , 8,5 , 4,0 , 5782,12 , 5794,22 , 2, 1, 7, 6, 7 }, // Lakota/Latin/United States
- { 314, 9, 145, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 15159,30 , 20857,48 , 85,14 , 15159,30 , 20857,48 , 85,14 , 526,6 , 501,8 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 16531,21 , 0,4 , 4,0 , 5816,8 , 5001,6 , 2, 1, 1, 6, 7 }, // Standard Moroccan Tamazight/Tifinagh/Morocco
- { 315, 7, 43, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,76,80}, 6,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Mapuche/Latin/Chile
- { 316, 1, 103, 1643, 1644, 1563, 1642, 1632, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 18,7 , 25,12 , 20905,58 , 20905,58 , 20963,14 , 20905,58 , 20905,58 , 20963,14 , 782,3 , 786,3 , 45,4 , 5,17 , 22,23 , {73,81,68}, 44,5 , 17610,20 , 19,5 , 4,0 , 5824,14 , 5838,5 , 0, 0, 6, 5, 6 }, // Central Kurdish/Arabic/Iraq
- { 316, 1, 102, 1643, 1644, 1563, 1642, 1632, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 20905,58 , 20905,58 , 20963,14 , 20905,58 , 20905,58 , 20963,14 , 782,3 , 786,3 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 17630,19 , 19,5 , 4,0 , 5824,14 , 5843,5 , 0, 0, 6, 5, 5 }, // Central Kurdish/Arabic/Iran
- { 317, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 180,7 , 180,7 , 113,6 , 622,18 , 55,4 , 59,9 , 20977,28 , 21005,53 , 21058,14 , 20977,28 , 21005,53 , 21058,14 , 785,9 , 789,10 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 17649,27 , 19,5 , 4,0 , 5848,14 , 5862,6 , 2, 1, 1, 6, 7 }, // Lower Sorbian/Latin/Germany
- { 318, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 180,7 , 180,7 , 113,6 , 622,18 , 543,12 , 59,9 , 21072,28 , 21100,53 , 21153,14 , 21072,28 , 21100,53 , 21153,14 , 785,9 , 799,9 , 1253,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 17676,29 , 19,5 , 4,0 , 5868,15 , 5883,6 , 2, 1, 1, 6, 7 }, // Upper Sorbian/Latin/Germany
- { 319, 7, 37, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Kenyang/Latin/Cameroon
- { 320, 7, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 240,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Mohawk/Latin/Canada
- { 321, 75, 91, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,78,70}, 216,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Nko/Nko/Guinea
- { 322, 7, 260, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8222, 8220, 0,6 , 0,6 , 1014,8 , 1014,8 , 156,8 , 1808,27 , 37,5 , 8,10 , 21167,28 , 21195,69 , 21264,14 , 21167,28 , 21195,69 , 21264,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 19,5 , 4,0 , 5889,9 , 5898,6 , 2, 1, 1, 6, 7 }, // Prussian/Latin/World
- { 323, 7, 90, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,84,81}, 305,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Kiche/Latin/Guatemala
- { 324, 7, 205, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {83,69,75}, 190,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 1, 6, 7 }, // Southern Sami/Latin/Sweden
- { 325, 7, 205, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {83,69,75}, 190,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 1, 6, 7 }, // Lule Sami/Latin/Sweden
- { 326, 7, 73, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 640,8 , 1835,18 , 220,4 , 224,9 , 21278,28 , 21306,70 , 85,14 , 21278,28 , 21376,73 , 21449,14 , 794,3 , 808,3 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 17705,11 , 19,5 , 4,0 , 5904,11 , 5915,5 , 2, 1, 1, 6, 7 }, // Inari Sami/Latin/Finland
- { 327, 7, 73, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Skolt Sami/Latin/Finland
- { 328, 7, 13, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {65,85,68}, 340,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Warlpiri/Latin/Australia
- { 346, 1, 102, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 726,4 , 1258,39 , 22,23 , {73,82,82}, 342,3 , 17716,27 , 8,5 , 4,0 , 5920,7 , 3252,5 , 0, 0, 6, 5, 5 }, // Mazanderani/Arabic/Iran
- { 349, 1, 102, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 0,7 , 8,5 , 4,0 , 5927,11 , 0,0 , 0, 0, 6, 5, 5 }, // Northern Luri/Arabic/Iran
- { 349, 1, 103, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 18,7 , 25,12 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,81,68}, 44,5 , 0,7 , 8,5 , 4,0 , 5927,11 , 0,0 , 0, 0, 6, 5, 6 }, // Northern Luri/Arabic/Iraq
- { 357, 6, 97, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 165,5 , 165,5 , 1022,5 , 1022,5 , 394,8 , 423,14 , 175,6 , 192,13 , 1980,28 , 1980,28 , 2008,14 , 1980,28 , 1980,28 , 2008,14 , 58,2 , 55,2 , 45,4 , 5,17 , 22,23 , {72,75,68}, 134,3 , 17743,11 , 4,4 , 13,6 , 5938,2 , 5940,14 , 2, 1, 7, 6, 7 }, // Cantonese/Traditional Han/Hong Kong
- { 357, 5, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 165,5 , 165,5 , 1022,5 , 1022,5 , 394,8 , 402,13 , 175,6 , 181,11 , 1959,21 , 1980,28 , 2008,14 , 1959,21 , 1980,28 , 2008,14 , 58,2 , 55,2 , 45,4 , 5,17 , 22,23 , {67,78,89}, 243,1 , 3122,13 , 4,4 , 13,6 , 5954,2 , 5956,7 , 2, 1, 7, 6, 7 }, // Cantonese/Simplified Han/China
- { 358, 138, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Osage/Osage/United States
- { 360, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Ido/Latin/World
- { 361, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Lojban/Latin/World
- { 362, 7, 106, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Sicilian/Latin/Italy
- { 363, 1, 102, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 6, 5, 5 }, // Southern Kurdish/Arabic/Iran
- { 364, 1, 163, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,75,82}, 176,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Western Balochi/Arabic/Pakistan
- { 365, 7, 170, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 892,9 , 901,8 , 547,6 , 35,18 , 18,7 , 25,12 , 21463,25 , 21488,56 , 21544,14 , 21463,25 , 21488,56 , 21544,14 , 0,2 , 0,2 , 1297,8 , 5,17 , 22,23 , {80,72,80}, 179,1 , 17754,56 , 4,4 , 13,6 , 5963,8 , 4715,9 , 2, 1, 7, 6, 7 }, // Cebuano/Latin/Philippines
- { 366, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Erzya/Cyrillic/Russia
- { 367, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Chickasaw/Latin/United States
- { 368, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 159,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Muscogee/Latin/United States
- { 369, 7, 172, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,76,78}, 273,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Silesian/Latin/Poland
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 } // trailing zeros
+ // lang script terr lStrt lpMid lpEnd lPair lDelm dec group prcnt zero minus plus exp qtOpn qtEnd altQO altQE lDFmt sDFmt lTFmt sTFmt slDay lDays ssDys sDays snDay nDays am pm byte siQnt iecQn crSym crDsp crFmt crFNg ntLng ntTer currISO curDgt curRnd dow1st wknd+ wknd-
+ { 1, 0, 0, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 8, 0, 17, 0, 0, 0, 0, 56, 56, 83, 96, 0, 0, 0, 5, 22, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 8, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 4, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7 }, // C/AnyScript/AnyCountry
+ { 3, 7, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 45, 10, 22, 109, 109, 163, 163, 83, 83, 2, 2, 0, 5, 22, 0, 0, 4, 0, 0, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 17, 4, 0, 6, 10, {69,84,66}, 2, 1, 7, 6, 7 }, // Oromo/Latin/Ethiopia
+ { 3, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 45, 0, 0, 109, 109, 163, 163, 190, 190, 2, 2, 0, 5, 22, 2, 0, 4, 0, 0, 16, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 4, 0, 6, 8, {75,69,83}, 2, 1, 7, 6, 7 }, // Oromo/Latin/Kenya
+ { 4, 7, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7 }, // Afar/Latin/Ethiopia
+ { 5, 7, 195, 0, 0, 7, 7, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 80, 70, 0, 0, 203, 203, 260, 260, 287, 287, 4, 4, 45, 5, 22, 5, 17, 4, 13, 24, 33, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 27, 27, 13, 13, 3, 3, 5, 17, 23, 1, 66, 4, 6, 9, 11, {90,65,82}, 2, 1, 7, 6, 7 }, // Afrikaans/Latin/South Africa
+ { 5, 7, 148, 0, 0, 7, 7, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 70, 10, 22, 203, 203, 260, 260, 287, 287, 4, 4, 45, 5, 22, 6, 83, 4, 13, 24, 44, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 57, 57, 27, 27, 13, 13, 3, 3, 5, 17, 23, 1, 54, 4, 6, 9, 7, {78,65,68}, 2, 1, 1, 6, 7 }, // Afrikaans/Latin/Namibia
+ { 6, 7, 2, 0, 0, 15, 15, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 0, 113, 29, 22, 300, 300, 357, 384, 411, 411, 7, 7, 50, 5, 22, 7, 137, 19, 24, 51, 56, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 13, 7, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 4, 44, 5, 7, 5, 8, {65,76,76}, 0, 0, 1, 6, 7 }, // Albanian/Latin/Albania
+ { 6, 7, 127, 0, 0, 15, 15, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 0, 113, 0, 0, 300, 300, 357, 384, 411, 411, 7, 7, 50, 5, 22, 11, 181, 19, 24, 51, 64, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 3, 53, 5, 7, 5, 18, {77,75,68}, 2, 1, 1, 6, 7 }, // Albanian/Latin/Macedonia
+ { 6, 7, 257, 0, 0, 15, 15, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 0, 113, 0, 0, 300, 300, 357, 384, 411, 411, 7, 7, 50, 5, 22, 14, 234, 19, 24, 51, 82, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 57, 57, 27, 27, 14, 14, 11, 10, 4, 17, 23, 1, 20, 5, 7, 5, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Albanian/Latin/Kosovo
+ { 7, 14, 69, 24, 24, 30, 39, 6, 0, 1, 2, 3, 4, 5, 9, 15, 16, 17, 18, 53, 45, 10, 22, 425, 425, 452, 452, 478, 478, 18, 17, 54, 57, 22, 15, 254, 4, 13, 88, 92, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 27, 27, 26, 26, 13, 13, 3, 4, 3, 23, 23, 2, 33, 4, 6, 4, 5, {69,84,66}, 2, 1, 7, 6, 7 }, // Amharic/Ethiopic/Ethiopia
+ { 8, 1, 64, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 17, 287, 19, 0, 97, 104, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 80, 5, 0, 7, 3, {69,71,80}, 2, 1, 6, 5, 6 }, // Arabic/Arabic/Egypt
+ { 8, 1, 3, 47, 47, 47, 47, 6, 1, 0, 30, 3, 33, 35, 9, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 22, 367, 4, 13, 97, 107, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5,101, 4, 6, 7, 7, {68,90,68}, 2, 1, 6, 5, 6 }, // Arabic/Arabic/Algeria
+ { 8, 1, 17, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 27, 468, 19, 0, 97, 114, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 90, 5, 0, 7, 7, {66,72,68}, 3, 0, 6, 5, 6 }, // Arabic/Arabic/Bahrain
+ { 8, 1, 42, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 32, 558, 19, 0, 97, 121, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 4,111, 5, 0, 7, 4, {88,65,70}, 0, 0, 1, 6, 7 }, // Arabic/Arabic/Chad
+ { 8, 1, 48, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 0, 0, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 33, 669, 19, 0, 97, 125, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 10, 5, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 2,104, 5, 0, 7, 9, {75,77,70}, 0, 0, 1, 6, 7 }, // Arabic/Arabic/Comoros
+ { 8, 1, 59, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 36, 773, 19, 0, 97, 134, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 3, 83, 5, 0, 7, 6, {68,74,70}, 0, 0, 6, 6, 7 }, // Arabic/Arabic/Djibouti
+ { 8, 1, 67, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 39, 856, 19, 0, 97, 140, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 3, 90, 5, 0, 7, 7, {69,82,78}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/Eritrea
+ { 8, 1, 103, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 42, 946, 19, 0, 97, 147, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 83, 5, 0, 7, 6, {73,81,68}, 0, 0, 6, 5, 6 }, // Arabic/Arabic/Iraq
+ { 8, 1, 105, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 1, 1, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 47, 1029, 19, 0, 97, 153, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 9, 4, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 1,132, 5, 0, 7, 7, {73,76,83}, 2, 1, 7, 5, 6 }, // Arabic/Arabic/Israel
+ { 8, 1, 109, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 48, 1161, 19, 0, 97, 160, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 83, 5, 0, 7, 6, {74,79,68}, 3, 0, 6, 5, 6 }, // Arabic/Arabic/Jordan
+ { 8, 1, 115, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 53, 1244, 19, 0, 97, 166, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 83, 5, 0, 7, 6, {75,87,68}, 3, 0, 6, 5, 6 }, // Arabic/Arabic/Kuwait
+ { 8, 1, 119, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 58, 1327, 19, 0, 97, 172, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 83, 5, 0, 7, 5, {76,66,80}, 0, 0, 1, 6, 7 }, // Arabic/Arabic/Lebanon
+ { 8, 1, 122, 47, 47, 47, 47, 6, 1, 0, 30, 3, 33, 35, 9, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 63, 1410, 4, 13, 97, 177, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 87, 4, 6, 7, 5, {76,89,68}, 3, 0, 6, 5, 6 }, // Arabic/Arabic/Libya
+ { 8, 1, 136, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 68, 1497, 19, 0, 97, 182, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 4,111, 5, 0, 7, 9, {77,82,85}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/Mauritania
+ { 8, 1, 145, 47, 47, 47, 47, 6, 1, 0, 30, 3, 33, 35, 9, 11, 10, 13, 12, 119, 136, 0, 0, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 72, 1608, 4, 13, 97, 191, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 10, 5, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 86, 4, 6, 7, 6, {77,65,68}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/Morocco
+ { 8, 1, 162, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 77, 1694, 19, 0, 97, 197, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 76, 5, 0, 7, 5, {79,77,82}, 3, 0, 6, 5, 6 }, // Arabic/Arabic/Oman
+ { 8, 1, 165, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 47, 1029, 19, 0, 97, 202, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 1,132, 5, 0, 7, 18, {73,76,83}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/Palestinian Territories
+ { 8, 1, 175, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 82, 1770, 19, 0, 97, 220, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 69, 5, 0, 7, 3, {81,65,82}, 2, 1, 6, 5, 6 }, // Arabic/Arabic/Qatar
+ { 8, 1, 186, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 87, 1839, 19, 0, 97, 223, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 76, 5, 0, 7, 24, {83,65,82}, 2, 1, 7, 5, 6 }, // Arabic/Arabic/Saudi Arabia
+ { 8, 1, 194, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 92, 1915, 19, 0, 97, 247, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 1, 76, 5, 0, 7, 7, {83,79,83}, 0, 0, 1, 6, 7 }, // Arabic/Arabic/Somalia
+ { 8, 1, 201, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 93, 1991, 19, 0, 97, 254, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 4, 90, 5, 0, 7, 7, {83,68,71}, 2, 1, 6, 5, 6 }, // Arabic/Arabic/Sudan
+ { 8, 1, 207, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 97, 2081, 19, 0, 97, 261, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 76, 5, 0, 7, 5, {83,89,80}, 0, 0, 6, 5, 6 }, // Arabic/Arabic/Syria
+ { 8, 1, 216, 47, 47, 47, 47, 6, 1, 0, 30, 3, 33, 35, 9, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 102, 2157, 4, 13, 97, 266, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 94, 4, 6, 7, 4, {84,78,68}, 3, 0, 1, 6, 7 }, // Arabic/Arabic/Tunisia
+ { 8, 1, 223, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 107, 2251, 19, 0, 97, 270, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 90, 5, 0, 7, 24, {65,69,68}, 2, 1, 6, 5, 6 }, // Arabic/Arabic/United Arab Emirates
+ { 8, 1, 236, 47, 47, 47, 47, 6, 0, 1, 30, 3, 33, 35, 9, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 72, 1608, 4, 13, 97, 294, 6, 6, 6, 6, 1, 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 86, 4, 6, 7, 15, {77,65,68}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/Western Sahara
+ { 8, 1, 237, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 112, 2341, 19, 0, 97, 309, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 5, 69, 5, 0, 7, 5, {89,69,82}, 0, 0, 7, 5, 6 }, // Arabic/Arabic/Yemen
+ { 8, 1, 254, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 117, 2410, 19, 0, 97, 314, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 1,131, 5, 0, 7, 12, {83,83,80}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/South Sudan
+ { 8, 1, 260, 47, 47, 47, 47, 53, 19, 20, 21, 23, 24, 26, 28, 11, 10, 13, 12, 119, 136, 10, 22, 491, 491, 491, 491, 542, 542, 21, 21, 80, 84, 22, 0, 0, 19, 0, 326, 348, 6, 6, 6, 6, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 51, 51, 51, 51, 13, 13, 1, 1, 4, 47, 23, 0, 0, 5, 0, 22, 6, {0,0,0}, 2, 1, 1, 6, 7 }, // Arabic/Arabic/World
+ { 9, 10, 11, 0, 0, 54, 54, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 15, 16, 146, 166, 0, 0, 555, 555, 616, 616, 643, 643, 0, 0, 131, 137, 22, 118, 2541, 19, 0, 354, 361, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 8, 10, 5, 61, 61, 27, 27, 13, 13, 2, 2, 6, 17, 23, 1, 45, 5, 0, 7, 8, {65,77,68}, 2, 0, 1, 6, 7 }, // Armenian/Armenian/Armenia
+ { 10, 11, 100, 0, 0, 61, 61, 6, 0, 1, 2, 37, 4, 5, 9, 10, 11, 12, 13, 174, 192, 42, 42, 656, 656, 713, 713, 744, 744, 22, 22, 154, 158, 22, 119, 2586, 8, 0, 369, 376, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 57, 57, 31, 31, 13, 13, 9, 7, 4, 37, 23, 1, 42, 5, 0, 7, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Assamese/Bengali/India
+ { 12, 7, 15, 0, 0, 70, 70, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 200, 166, 0, 0, 757, 757, 823, 849, 96, 96, 0, 0, 195, 5, 22, 120, 2628, 19, 0, 380, 390, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 66, 66, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 57, 5, 0, 10, 10, {65,90,78}, 2, 1, 1, 6, 7 }, // Azerbaijani/Latin/Azerbaijan
+ { 12, 1, 102, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {73,82,82}, 0, 0, 6, 5, 5 }, // Azerbaijani/Arabic/Iran
+ { 12, 2, 15, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 17, 18, 200, 166, 0, 0, 875, 875, 941, 941, 96, 96, 31, 29, 0, 5, 22, 120, 2685, 19, 0, 400, 410, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 66, 66, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 5, 5, 0, 10, 10, {65,90,78}, 2, 1, 1, 6, 7 }, // Azerbaijani/Cyrillic/Azerbaijan
+ { 13, 2, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 121, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {82,85,66}, 2, 1, 1, 6, 7 }, // Bashkir/Cyrillic/Russia
+ { 14, 7, 197, 0, 0, 78, 78, 6, 1, 0, 2, 3, 38, 5, 9, 10, 11, 10, 11, 217, 253, 54, 0, 967, 967, 1034, 1034, 1061, 1061, 0, 0, 199, 5, 22, 14, 2690, 19, 24, 420, 427, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 6, 12, 5, 67, 67, 27, 27, 13, 13, 2, 2, 7, 17, 23, 1, 19, 5, 7, 7, 8, {69,85,82}, 2, 1, 1, 6, 7 }, // Basque/Latin/Spain
+ { 15, 11, 18, 0, 0, 87, 87, 6, 0, 1, 2, 37, 4, 5, 9, 10, 11, 12, 13, 174, 259, 10, 22, 1074, 1074, 1131, 1131, 1167, 1167, 0, 0, 154, 5, 22, 122, 2709, 0, 31, 435, 440, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 57, 57, 36, 36, 17, 17, 2, 2, 4, 17, 23, 1, 48, 4, 6, 5, 8, {66,68,84}, 2, 1, 7, 6, 7 }, // Bengali/Bengali/Bangladesh
+ { 15, 11, 100, 0, 0, 87, 87, 6, 0, 1, 2, 37, 4, 5, 9, 10, 11, 12, 13, 174, 259, 10, 22, 1074, 1074, 1131, 1131, 1167, 1167, 0, 0, 154, 5, 22, 119, 2757, 0, 31, 435, 448, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 57, 57, 36, 36, 17, 17, 2, 2, 4, 17, 23, 1, 42, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Bengali/Bengali/India
+ { 16, 31, 25, 96, 96, 96, 96, 6, 0, 1, 2, 39, 4, 5, 9, 10, 11, 12, 13, 265, 70, 66, 93, 1184, 1184, 1262, 1262, 1295, 1295, 33, 31, 0, 5, 22, 123, 2799, 4, 0, 452, 458, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 10, 27, 22, 78, 78, 33, 33, 26, 26, 5, 6, 4, 17, 23, 3, 8, 4, 0, 6, 5, {66,84,78}, 2, 1, 7, 6, 7 }, // Dzongkha/Tibetan/Bhutan
+ { 19, 7, 74, 0, 0, 105, 105, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 45, 0, 0, 1321, 1321, 1363, 1363, 1395, 1395, 38, 37, 206, 213, 230, 14, 2807, 19, 0, 463, 472, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 42, 42, 32, 32, 17, 17, 4, 4, 7, 17, 23, 1, 35, 5, 0, 9, 5, {69,85,82}, 2, 1, 1, 6, 7 }, // Breton/Latin/France
+ { 20, 2, 33, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 40, 10, 40, 10, 295, 317, 1, 1, 1412, 1412, 1466, 1466, 1486, 1486, 42, 41, 253, 5, 22, 126, 2842, 19, 24, 477, 486, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 12, 9, 4, 54, 54, 20, 20, 13, 13, 6, 6, 7, 17, 23, 3, 46, 5, 7, 9, 8, {66,71,78}, 2, 1, 1, 6, 7 }, // Bulgarian/Cyrillic/Bulgaria
+ { 21, 25, 147, 120, 120, 125, 125, 135, 0, 1, 2, 41, 4, 5, 9, 10, 11, 12, 13, 329, 347, 115, 125, 1499, 1499, 1499, 1499, 1552, 1552, 48, 47, 260, 5, 22, 2, 2888, 8, 0, 494, 494, 5, 5, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 6, 53, 53, 53, 53, 13, 13, 5, 3, 5, 17, 23, 1, 28, 5, 0, 6, 6, {77,77,75}, 0, 0, 7, 6, 7 }, // Burmese/Myanmar/Myanmar
+ { 22, 2, 20, 0, 0, 136, 136, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 167, 131, 0, 1565, 1565, 1620, 1620, 1640, 1640, 0, 0, 265, 270, 22, 0, 2916, 19, 0, 500, 510, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 7, 11, 5, 55, 55, 20, 20, 13, 13, 2, 2, 5, 17, 23, 2, 88, 5, 0, 10, 8, {66,89,78}, 2, 0, 1, 6, 7 }, // Belarusian/Cyrillic/Belarus
+ { 23, 20, 36, 0, 0, 143, 152, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 259, 10, 22, 1653, 1698, 1744, 1744, 1783, 1783, 0, 0, 287, 5, 22, 129, 3004, 0, 31, 518, 523, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 12, 7, 45, 46, 39, 39, 13, 13, 2, 2, 2, 17, 23, 1, 28, 4, 6, 5, 7, {75,72,82}, 2, 1, 7, 6, 7 }, // Khmer/Khmer/Cambodia
+ { 24, 7, 197, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 355, 259, 1, 1, 1796, 1796, 1855, 1855, 1882, 1882, 53, 50, 0, 5, 22, 14, 3032, 19, 24, 530, 536, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 9, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 19, 5, 7, 6, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // Catalan/Latin/Spain
+ { 24, 7, 5, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 355, 259, 1, 1, 1796, 1796, 1855, 1855, 1882, 1882, 53, 50, 0, 5, 22, 14, 3032, 19, 24, 530, 543, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 9, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 19, 5, 7, 6, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // Catalan/Latin/Andorra
+ { 24, 7, 74, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 355, 259, 1, 1, 1796, 1796, 1855, 1855, 1882, 1882, 53, 50, 0, 5, 22, 14, 3032, 19, 24, 530, 550, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 9, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 19, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Catalan/Latin/France
+ { 24, 7, 106, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 355, 259, 1, 1, 1796, 1796, 1855, 1855, 1882, 1882, 53, 50, 0, 5, 22, 14, 3032, 19, 24, 530, 556, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 9, 4, 59, 59, 27, 27, 20, 20, 5, 5, 5, 17, 23, 1, 19, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Catalan/Latin/Italy
+ { 25, 5, 44, 168, 168, 173, 173, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 377, 390, 142, 27, 1902, 1902, 1929, 1929, 1949, 1949, 58, 55, 289, 291, 22, 130, 3051, 4, 13, 562, 566, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 21, 23, 1, 12, 4, 6, 4, 2, {67,78,89}, 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/China
+ { 25, 5, 97, 168, 168, 173, 173, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 377, 259, 142, 27, 1902, 1902, 1929, 1929, 1949, 1949, 58, 55, 289, 291, 22, 131, 3063, 4, 13, 562, 568, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 21, 23, 3, 10, 4, 6, 4, 9, {72,75,68}, 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Hong Kong
+ { 25, 5, 126, 168, 168, 173, 173, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 377, 259, 142, 27, 1902, 1902, 1929, 1929, 1949, 1949, 58, 55, 289, 291, 22, 134, 3073, 4, 13, 562, 577, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 21, 23, 4, 12, 4, 6, 4, 9, {77,79,80}, 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Macau
+ { 25, 5, 190, 168, 168, 173, 173, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 377, 45, 142, 27, 1902, 1902, 1929, 1929, 1949, 1949, 58, 55, 289, 291, 22, 6, 3085, 4, 13, 562, 586, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 2, 21, 23, 1, 14, 4, 6, 4, 3, {83,71,68}, 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Singapore
+ { 25, 6, 97, 168, 168, 178, 178, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 377, 398, 153, 27, 1902, 1902, 1962, 1962, 1949, 1949, 58, 55, 312, 5, 22, 131, 3063, 4, 13, 589, 593, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 13, 6, 27, 27, 20, 20, 13, 13, 2, 2, 3, 17, 23, 3, 10, 4, 6, 4, 9, {72,75,68}, 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Hong Kong
+ { 25, 6, 126, 168, 168, 178, 178, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 377, 398, 153, 27, 1902, 1902, 1962, 1962, 1949, 1949, 58, 55, 312, 5, 22, 134, 3099, 4, 13, 589, 602, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 13, 6, 27, 27, 20, 20, 13, 13, 2, 2, 3, 17, 23, 4, 12, 4, 6, 4, 9, {77,79,80}, 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Macau
+ { 25, 6, 208, 168, 168, 173, 173, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 406, 390, 153, 27, 1902, 1902, 1962, 1962, 1949, 1949, 58, 55, 0, 5, 22, 6, 3111, 4, 13, 589, 611, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 8, 13, 6, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 12, 4, 6, 4, 2, {84,87,68}, 2, 0, 7, 6, 7 }, // Chinese/Traditional Han/Taiwan
+ { 26, 7, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Corsican/Latin/France
+ { 27, 7, 54, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 439, 54, 0, 1982, 1982, 2039, 2039, 2066, 2079, 0, 0, 315, 5, 22, 138, 3123, 19, 0, 613, 621, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 13, 12, 5, 57, 57, 27, 27, 13, 13, 2, 2, 7, 17, 23, 3, 59, 5, 0, 8, 8, {72,82,75}, 2, 1, 1, 6, 7 }, // Croatian/Latin/Croatia
+ { 27, 7, 27, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 452, 54, 0, 1982, 1982, 2039, 2039, 2079, 2079, 0, 0, 315, 5, 22, 141, 3182, 19, 0, 613, 629, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 9, 12, 5, 57, 57, 27, 27, 13, 13, 2, 2, 7, 17, 23, 2, 84, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7 }, // Croatian/Latin/Bosnia And Herzegowina
+ { 28, 7, 57, 0, 0, 183, 183, 6, 1, 14, 2, 3, 4, 5, 9, 40, 10, 46, 12, 461, 166, 1, 1, 2092, 2092, 2140, 2140, 2160, 2160, 60, 57, 322, 5, 22, 143, 3266, 19, 0, 648, 655, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 9, 4, 48, 48, 20, 20, 13, 13, 4, 4, 5, 17, 23, 2, 67, 5, 0, 7, 5, {67,90,75}, 2, 0, 1, 6, 7 }, // Czech/Latin/Czech Republic
+ { 29, 7, 58, 0, 0, 190, 190, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 478, 501, 166, 166, 2173, 2173, 2223, 2250, 2284, 2284, 0, 0, 0, 5, 22, 145, 3333, 19, 0, 660, 665, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 50, 50, 27, 34, 13, 13, 2, 2, 5, 17, 23, 3, 41, 5, 0, 5, 7, {68,75,75}, 2, 0, 1, 6, 7 }, // Danish/Latin/Denmark
+ { 29, 7, 86, 0, 0, 190, 190, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 478, 501, 166, 166, 2173, 2173, 2223, 2250, 2284, 2284, 0, 0, 0, 5, 22, 145, 3333, 19, 0, 660, 672, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 50, 50, 27, 34, 13, 13, 2, 2, 5, 17, 23, 3, 41, 5, 0, 5, 8, {68,75,75}, 2, 0, 1, 6, 7 }, // Danish/Latin/Greenland
+ { 30, 7, 151, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 14, 3374, 8, 37, 680, 680, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 18, 5, 7, 10, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Netherlands
+ { 30, 7, 12, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 148, 3392, 8, 37, 680, 690, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 54, 5, 7, 10, 5, {65,87,71}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Aruba
+ { 30, 7, 21, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 46, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 14, 3374, 8, 37, 680, 695, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 18, 5, 7, 10, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Belgium
+ { 30, 7, 152, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 152, 3446, 8, 37, 680, 701, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 96, 5, 7, 10, 7, {65,78,71}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Cura Sao
+ { 30, 7, 202, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 6, 3542, 8, 37, 680, 708, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 57, 5, 7, 10, 8, {83,82,68}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Suriname
+ { 30, 7, 255, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 6, 3599, 8, 37, 680, 716, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 1, 60, 5, 7, 10, 19, {85,83,68}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Bonaire
+ { 30, 7, 256, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 97, 511, 0, 0, 2297, 2297, 2355, 2355, 2375, 2375, 64, 61, 0, 5, 22, 152, 3446, 8, 37, 680, 735, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 58, 58, 20, 20, 13, 13, 4, 4, 4, 17, 23, 4, 96, 5, 7, 10, 12, {65,78,71}, 2, 1, 1, 6, 7 }, // Dutch/Latin/Sint Maarten
+ { 31, 7, 225, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 747, 763, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 16, 13, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/United States
+ { 31, 3, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 156, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Deseret/United States
+ { 31, 7, 4, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 776, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 14, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/American Samoa
+ { 31, 7, 7, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 790, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 8, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Anguilla
+ { 31, 7, 9, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 798, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 17, {88,67,68}, 2, 1, 7, 6, 7 }, // English/Latin/Antigua And Barbuda
+ { 31, 7, 13, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 6, 10, 11, 12, 13, 0, 259, 10, 22, 0, 0, 56, 56, 2388, 2388, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 815, 815, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 27, 27, 24, 24, 2, 2, 5, 17, 23, 1, 58, 4, 6, 18, 9, {65,85,68}, 2, 1, 7, 6, 7 }, // English/Latin/Australia
+ { 31, 7, 14, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 8, 0, 756, 833, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Austria
+ { 31, 7, 16, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3840, 4, 13, 756, 840, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 7, {66,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/Bahamas
+ { 31, 7, 19, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3892, 4, 13, 756, 847, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 55, 4, 6, 7, 8, {66,66,68}, 2, 1, 1, 6, 7 }, // English/Latin/Barbados
+ { 31, 7, 21, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 19, 0, 756, 855, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Belgium
+ { 31, 7, 22, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3947, 4, 13, 756, 862, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 46, 4, 6, 7, 6, {66,90,68}, 2, 1, 7, 6, 7 }, // English/Latin/Belize
+ { 31, 7, 24, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3993, 4, 13, 756, 868, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 7, {66,77,68}, 2, 1, 1, 6, 7 }, // English/Latin/Bermuda
+ { 31, 7, 28, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 136, 4045, 4, 13, 756, 875, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 49, 4, 6, 7, 8, {66,87,80}, 2, 1, 7, 6, 7 }, // English/Latin/Botswana
+ { 31, 7, 31, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 883, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 30, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/British Indian Ocean Territory
+ { 31, 7, 35, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 0, 0, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 159, 4094, 4, 13, 756, 913, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 52, 4, 6, 7, 7, {66,73,70}, 0, 0, 1, 6, 7 }, // English/Latin/Burundi
+ { 31, 7, 37, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 32, 4146, 4, 13, 756, 920, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 82, 4, 6, 7, 8, {88,65,70}, 0, 0, 1, 6, 7 }, // English/Latin/Cameroon
+ { 31, 7, 38, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 6, 10, 11, 12, 13, 27, 70, 10, 22, 0, 0, 2412, 2412, 83, 83, 64, 61, 0, 5, 22, 6, 4228, 4, 13, 928, 944, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 12, 7, 56, 56, 34, 34, 13, 13, 4, 4, 5, 17, 23, 1, 52, 4, 6, 16, 6, {67,65,68}, 2, 0, 7, 6, 7 }, // English/Latin/Canada
+ { 31, 7, 40, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4280, 4, 13, 756, 950, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 14, {75,89,68}, 2, 1, 1, 6, 7 }, // English/Latin/Cayman Islands
+ { 31, 7, 45, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 964, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 16, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Christmas Island
+ { 31, 7, 46, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 980, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 23, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Cocos Islands
+ { 31, 7, 51, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4350, 4, 13, 756, 1003, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 12, {78,90,68}, 2, 1, 1, 6, 7 }, // English/Latin/Cook Islands
+ { 31, 7, 56, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 4, 13, 756, 1015, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 4, 6, 7, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Cyprus
+ { 31, 7, 58, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 166, 166, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 145, 4411, 19, 0, 756, 1021, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 43, 5, 0, 7, 7, {68,75,75}, 2, 0, 1, 6, 7 }, // English/Latin/Denmark
+ { 31, 7, 60, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1028, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 8, {88,67,68}, 2, 1, 7, 6, 7 }, // English/Latin/Dominica
+ { 31, 7, 67, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 39, 4454, 4, 13, 756, 1036, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 49, 4, 6, 7, 7, {69,82,78}, 2, 1, 1, 6, 7 }, // English/Latin/Eritrea
+ { 31, 7, 70, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 4503, 4, 13, 756, 1043, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 73, 4, 6, 7, 16, {70,75,80}, 2, 1, 1, 6, 7 }, // English/Latin/Falkland Islands
+ { 31, 7, 72, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4576, 4, 13, 756, 1059, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 46, 4, 6, 7, 4, {70,74,68}, 2, 1, 1, 6, 7 }, // English/Latin/Fiji
+ { 31, 7, 73, 0, 0, 208, 208, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 176, 167, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 19, 0, 756, 1063, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 9, 4, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Finland
+ { 31, 7, 75, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 4622, 4, 13, 756, 1070, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 31, 4, 6, 7, 8, {71,66,80}, 2, 1, 1, 6, 7 }, // English/Latin/Guernsey
+ { 31, 7, 80, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 162, 4653, 4, 13, 756, 1078, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 49, 4, 6, 7, 6, {71,77,68}, 2, 1, 1, 6, 7 }, // English/Latin/Gambia
+ { 31, 7, 82, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 19, 0, 756, 1084, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Germany
+ { 31, 7, 83, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 163, 4702, 4, 13, 756, 1091, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 46, 4, 6, 7, 5, {71,72,83}, 2, 1, 1, 6, 7 }, // English/Latin/Ghana
+ { 31, 7, 84, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 4748, 4, 13, 756, 1096, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 9, {71,73,80}, 2, 1, 1, 6, 7 }, // English/Latin/Gibraltar
+ { 31, 7, 87, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1105, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 7, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Grenada
+ { 31, 7, 89, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1112, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 4, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/Guam
+ { 31, 7, 93, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4800, 4, 13, 756, 1116, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 55, 4, 6, 7, 6, {71,89,68}, 2, 0, 1, 6, 7 }, // English/Latin/Guyana
+ { 31, 7, 97, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 398, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 131, 4855, 4, 13, 756, 1122, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 55, 4, 6, 7, 19, {72,75,68}, 2, 1, 7, 6, 7 }, // English/Latin/Hong Kong
+ { 31, 7, 100, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 119, 4910, 4, 13, 756, 891, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 43, 4, 6, 7, 5, {73,78,82}, 2, 1, 7, 7, 7 }, // English/Latin/India
+ { 31, 7, 104, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 45, 0, 0, 0, 0, 56, 56, 83, 83, 64, 61, 0, 5, 22, 14, 3821, 4, 13, 756, 1141, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 56, 56, 27, 27, 13, 13, 4, 4, 5, 17, 23, 1, 19, 4, 6, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Ireland
+ { 31, 7, 105, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 1, 1, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 47, 4953, 4, 13, 756, 1148, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 9, 4, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 6, {73,76,83}, 2, 1, 7, 5, 6 }, // English/Latin/Israel
+ { 31, 7, 107, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 5014, 4, 13, 756, 1154, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 7, {74,77,68}, 2, 1, 7, 6, 7 }, // English/Latin/Jamaica
+ { 31, 7, 111, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 2, 5066, 4, 13, 756, 1161, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 52, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // English/Latin/Kenya
+ { 31, 7, 112, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 1166, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 8, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Kiribati
+ { 31, 7, 120, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 5, 5118, 4, 13, 756, 1174, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 60, 4, 6, 7, 7, {90,65,82}, 2, 1, 1, 6, 7 }, // English/Latin/Lesotho
+ { 31, 7, 121, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 5178, 4, 13, 756, 1181, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 7, {76,82,68}, 2, 1, 1, 6, 7 }, // English/Latin/Liberia
+ { 31, 7, 126, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 134, 5230, 4, 13, 756, 1188, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 52, 4, 6, 7, 15, {77,79,80}, 2, 1, 7, 6, 7 }, // English/Latin/Macau
+ { 31, 7, 128, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 166, 5282, 4, 13, 756, 1203, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 53, 4, 6, 7, 10, {77,71,65}, 0, 0, 1, 6, 7 }, // English/Latin/Madagascar
+ { 31, 7, 129, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 142, 5335, 4, 13, 756, 1213, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 52, 4, 6, 7, 6, {77,87,75}, 2, 1, 1, 6, 7 }, // English/Latin/Malawi
+ { 31, 7, 130, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 168, 5387, 4, 13, 756, 1219, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 58, 4, 6, 7, 8, {77,89,82}, 2, 1, 1, 6, 7 }, // English/Latin/Malaysia
+ { 31, 7, 133, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 4, 13, 756, 1227, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 4, 6, 7, 5, {69,85,82}, 2, 1, 7, 6, 7 }, // English/Latin/Malta
+ { 31, 7, 134, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1232, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 16, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/Marshall Islands
+ { 31, 7, 137, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 170, 5445, 4, 13, 756, 1248, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 52, 4, 6, 7, 9, {77,85,82}, 2, 0, 1, 6, 7 }, // English/Latin/Mauritius
+ { 31, 7, 140, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1257, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 10, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/Micronesia
+ { 31, 7, 144, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1267, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 10, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Montserrat
+ { 31, 7, 148, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 5497, 4, 13, 756, 1277, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 7, {78,65,68}, 2, 1, 1, 6, 7 }, // English/Latin/Namibia
+ { 31, 7, 149, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 1284, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 5, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Nauru
+ { 31, 7, 151, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 8, 37, 756, 1289, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 7, 7, 11, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Netherlands
+ { 31, 7, 154, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 46, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4350, 4, 13, 756, 1300, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 11, {78,90,68}, 2, 1, 1, 6, 7 }, // English/Latin/New Zealand
+ { 31, 7, 157, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 172, 5549, 4, 13, 756, 1311, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 49, 4, 6, 7, 7, {78,71,78}, 2, 1, 1, 6, 7 }, // English/Latin/Nigeria
+ { 31, 7, 158, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4350, 4, 13, 756, 1318, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 4, {78,90,68}, 2, 1, 1, 6, 7 }, // English/Latin/Niue
+ { 31, 7, 159, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 1322, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 14, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Norfolk Island
+ { 31, 7, 160, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1336, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 24, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/Northern Mariana Islands
+ { 31, 7, 163, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 170, 5598, 4, 13, 756, 1360, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 52, 4, 6, 7, 8, {80,75,82}, 2, 0, 7, 6, 7 }, // English/Latin/Pakistan
+ { 31, 7, 164, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1368, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 5, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/Palau
+ { 31, 7, 167, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 2, 5650, 4, 13, 756, 1373, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 72, 4, 6, 7, 16, {80,71,75}, 2, 1, 1, 6, 7 }, // English/Latin/Papua New Guinea
+ { 31, 7, 170, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 173, 5722, 4, 13, 756, 1389, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 11, {80,72,80}, 2, 1, 7, 6, 7 }, // English/Latin/Philippines
+ { 31, 7, 171, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4350, 4, 13, 756, 1400, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 16, {78,90,68}, 2, 1, 1, 6, 7 }, // English/Latin/Pitcairn
+ { 31, 7, 174, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1416, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 11, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/Puerto Rico
+ { 31, 7, 179, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 174, 5774, 4, 13, 756, 1427, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 46, 4, 6, 7, 6, {82,87,70}, 0, 0, 1, 6, 7 }, // English/Latin/Rwanda
+ { 31, 7, 180, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1433, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 16, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Saint Kitts And Nevis
+ { 31, 7, 181, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1449, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 8, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Saint Lucia
+ { 31, 7, 182, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3693, 4, 13, 756, 1457, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 70, 4, 6, 7, 23, {88,67,68}, 2, 1, 1, 6, 7 }, // English/Latin/Saint Vincent And The Grenadines
+ { 31, 7, 183, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 176, 5820, 4, 13, 756, 785, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 39, 4, 6, 7, 5, {87,83,84}, 2, 1, 7, 6, 7 }, // English/Latin/Samoa
+ { 31, 7, 188, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 179, 5859, 4, 13, 756, 1480, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 58, 4, 6, 7, 10, {83,67,82}, 2, 1, 1, 6, 7 }, // English/Latin/Seychelles
+ { 31, 7, 189, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 7, 5917, 4, 13, 756, 1490, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 67, 4, 6, 7, 12, {83,76,76}, 0, 0, 1, 6, 7 }, // English/Latin/Sierra Leone
+ { 31, 7, 190, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 5984, 4, 13, 756, 1502, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 55, 4, 6, 7, 9, {83,71,68}, 2, 1, 7, 6, 7 }, // English/Latin/Singapore
+ { 31, 7, 192, 0, 0, 208, 208, 6, 1, 0, 2, 3, 4, 5, 6, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 14, 3821, 19, 24, 756, 1511, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 19, 5, 7, 7, 8, {69,85,82}, 2, 1, 1, 6, 7 }, // English/Latin/Slovenia
+ { 31, 7, 193, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 6039, 4, 13, 756, 1519, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 73, 4, 6, 7, 15, {83,66,68}, 2, 1, 1, 6, 7 }, // English/Latin/Solomon Islands
+ { 31, 7, 195, 0, 0, 208, 208, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 545, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 5, 5118, 4, 13, 756, 1534, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 60, 4, 6, 7, 12, {90,65,82}, 2, 1, 7, 6, 7 }, // English/Latin/South Africa
+ { 31, 7, 199, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 6112, 4, 13, 756, 1546, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 9, {83,72,80}, 2, 1, 1, 6, 7 }, // English/Latin/Saint Helena
+ { 31, 7, 201, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 0, 6164, 4, 13, 756, 1555, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 49, 4, 6, 7, 5, {83,68,71}, 2, 1, 6, 5, 6 }, // English/Latin/Sudan
+ { 31, 7, 204, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 181, 6213, 4, 13, 756, 1560, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 52, 4, 6, 7, 8, {83,90,76}, 2, 1, 1, 6, 7 }, // English/Latin/Swaziland
+ { 31, 7, 205, 0, 0, 208, 208, 6, 1, 14, 2, 3, 4, 5, 47, 10, 11, 12, 13, 0, 70, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 145, 6265, 19, 0, 756, 1568, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 46, 5, 0, 7, 6, {83,69,75}, 2, 0, 1, 6, 7 }, // English/Latin/Sweden
+ { 31, 7, 206, 0, 0, 208, 208, 6, 0, 13, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 0, 6311, 8, 44, 756, 1574, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 40, 5, 5, 7, 11, {67,72,70}, 2, 0, 1, 6, 7 }, // English/Latin/Switzerland
+ { 31, 7, 210, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 182, 6351, 4, 13, 756, 1585, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 61, 4, 6, 7, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // English/Latin/Tanzania
+ { 31, 7, 213, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 4350, 4, 13, 756, 1593, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 61, 4, 6, 7, 7, {78,90,68}, 2, 1, 1, 6, 7 }, // English/Latin/Tokelau
+ { 31, 7, 214, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 185, 6412, 4, 13, 756, 1600, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 48, 4, 6, 7, 5, {84,79,80}, 2, 1, 1, 6, 7 }, // English/Latin/Tonga
+ { 31, 7, 215, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 6460, 4, 13, 756, 1605, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 79, 4, 6, 7, 17, {84,84,68}, 2, 1, 7, 6, 7 }, // English/Latin/Trinidad And Tobago
+ { 31, 7, 219, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1622, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 22, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/Turks And Caicos Islands
+ { 31, 7, 220, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 6, 3763, 4, 13, 756, 1644, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 58, 4, 6, 7, 6, {65,85,68}, 2, 1, 1, 6, 7 }, // English/Latin/Tuvalu
+ { 31, 7, 221, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 187, 6539, 4, 13, 756, 1650, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 55, 4, 6, 7, 6, {85,71,88}, 0, 0, 1, 7, 7 }, // English/Latin/Uganda
+ { 31, 7, 223, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 190, 6594, 4, 13, 756, 1656, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 54, 4, 6, 7, 20, {65,69,68}, 2, 1, 6, 5, 6 }, // English/Latin/United Arab Emirates
+ { 31, 7, 224, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 6648, 4, 13, 1676, 1691, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 46, 4, 6, 15, 14, {71,66,80}, 2, 1, 1, 6, 7 }, // English/Latin/United Kingdom
+ { 31, 7, 226, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1705, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 21, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/United States Minor Outlying Islands
+ { 31, 7, 229, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 193, 6694, 4, 13, 756, 1726, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 2, 43, 4, 6, 7, 7, {86,85,86}, 0, 0, 1, 6, 7 }, // English/Latin/Vanuatu
+ { 31, 7, 233, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1733, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 22, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/British Virgin Islands
+ { 31, 7, 234, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 0, 0, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 3659, 4, 13, 756, 1755, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 34, 4, 6, 7, 19, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/United States Virgin Islands
+ { 31, 7, 239, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 2, 6737, 4, 13, 756, 1774, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 49, 4, 6, 7, 6, {90,77,87}, 2, 1, 1, 6, 7 }, // English/Latin/Zambia
+ { 31, 7, 240, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 398, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1780, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 8, {85,83,68}, 2, 1, 7, 6, 7 }, // English/Latin/Zimbabwe
+ { 31, 7, 249, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 156, 3659, 4, 13, 756, 1788, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 3, 34, 4, 6, 7, 12, {85,83,68}, 2, 1, 1, 6, 7 }, // English/Latin/Diego Garcia
+ { 31, 7, 251, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 4622, 4, 13, 756, 1800, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 31, 4, 6, 7, 11, {71,66,80}, 2, 1, 1, 6, 7 }, // English/Latin/Isle Of Man
+ { 31, 7, 252, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 4622, 4, 13, 756, 1811, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 31, 4, 6, 7, 6, {71,66,80}, 2, 1, 1, 6, 7 }, // English/Latin/Jersey
+ { 31, 7, 254, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 117, 6786, 4, 13, 756, 1817, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 67, 4, 6, 7, 11, {83,83,80}, 2, 1, 1, 6, 7 }, // English/Latin/South Sudan
+ { 31, 7, 256, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 152, 6853, 4, 13, 756, 1828, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 4, 94, 4, 6, 7, 12, {65,78,71}, 2, 1, 1, 6, 7 }, // English/Latin/Sint Maarten
+ { 31, 7, 260, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 0, 0, 4, 13, 756, 1840, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 4, 6, 7, 5, {0,0,0}, 2, 1, 1, 6, 7 }, // English/Latin/World
+ { 31, 7, 261, 0, 0, 208, 208, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 0, 0, 56, 56, 83, 83, 68, 65, 0, 5, 22, 0, 0, 19, 0, 756, 1845, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 5, 0, 7, 6, {0,0,0}, 2, 1, 1, 6, 7 }, // English/Latin/Europe
+ { 32, 7, 260, 0, 0, 217, 217, 6, 1, 14, 2, 3, 38, 5, 9, 10, 11, 12, 13, 555, 72, 185, 0, 2446, 2446, 2496, 2496, 2516, 2516, 70, 67, 327, 5, 22, 0, 0, 8, 0, 1851, 1860, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 8, 25, 5, 50, 50, 20, 20, 13, 13, 3, 3, 6, 17, 23, 0, 0, 5, 0, 9, 5, {0,0,0}, 2, 1, 1, 6, 7 }, // Esperanto/Latin/World
+ { 33, 7, 68, 0, 0, 226, 226, 6, 1, 14, 2, 3, 38, 5, 47, 40, 10, 46, 12, 420, 166, 0, 0, 2529, 2529, 2591, 2591, 2591, 2591, 0, 0, 333, 5, 22, 14, 6947, 19, 24, 1865, 1870, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 13, 13, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 5, 5, {69,85,82}, 2, 1, 1, 6, 7 }, // Estonian/Latin/Estonia
+ { 34, 7, 71, 0, 0, 190, 190, 6, 1, 0, 2, 3, 38, 5, 9, 10, 11, 12, 13, 420, 166, 0, 0, 2604, 2604, 2677, 2704, 2738, 2738, 0, 0, 339, 5, 22, 145, 6966, 19, 24, 1875, 1883, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 73, 73, 27, 34, 13, 13, 2, 2, 3, 17, 23, 2, 42, 5, 7, 8, 7, {68,75,75}, 2, 0, 1, 6, 7 }, // Faroese/Latin/Faroe Islands
+ { 34, 7, 58, 0, 0, 190, 190, 6, 1, 0, 2, 3, 38, 5, 9, 10, 11, 12, 13, 420, 166, 0, 0, 2604, 2604, 2677, 2704, 2738, 2738, 0, 0, 339, 5, 22, 145, 6966, 19, 24, 1875, 665, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 73, 73, 27, 34, 13, 13, 2, 2, 3, 17, 23, 3, 42, 5, 7, 8, 7, {68,75,75}, 2, 0, 1, 6, 7 }, // Faroese/Latin/Denmark
+ { 36, 7, 73, 0, 0, 226, 226, 6, 1, 14, 2, 3, 38, 5, 9, 11, 11, 13, 13, 461, 581, 176, 167, 2751, 2817, 2897, 2897, 2917, 2917, 73, 70, 342, 347, 364, 14, 7008, 19, 0, 1890, 1895, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 9, 4, 66, 80, 20, 20, 13, 13, 3, 3, 5, 17, 23, 1, 19, 5, 0, 5, 5, {69,85,82}, 2, 1, 1, 6, 7 }, // Finnish/Latin/Finland
+ { 37, 7, 74, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 1908, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/France
+ { 37, 7, 3, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 195, 7027, 19, 24, 1900, 1914, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 50, 5, 7, 8, 7, {68,90,68}, 2, 1, 6, 5, 6 }, // French/Latin/Algeria
+ { 37, 7, 21, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 46, 210, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 1921, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 7, 23, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 8, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Belgium
+ { 37, 7, 23, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 1929, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Benin
+ { 37, 7, 34, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 1934, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 12, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Burkina Faso
+ { 37, 7, 35, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 159, 7135, 19, 24, 1900, 913, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 52, 5, 7, 8, 7, {66,73,70}, 0, 0, 1, 6, 7 }, // French/Latin/Burundi
+ { 37, 7, 37, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 76, 73, 387, 213, 230, 32, 7187, 19, 24, 1900, 1946, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 5, 4, 6, 17, 23, 4, 55, 5, 7, 8, 8, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Cameroon
+ { 37, 7, 38, 0, 0, 234, 234, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 11, 10, 97, 70, 233, 233, 2930, 2930, 2981, 2981, 3015, 3015, 64, 61, 387, 213, 230, 6, 7242, 19, 24, 1954, 944, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 24, 9, 51, 51, 34, 34, 13, 13, 4, 4, 6, 17, 23, 1, 53, 5, 7, 17, 6, {67,65,68}, 2, 0, 7, 6, 7 }, // French/Latin/Canada
+ { 37, 7, 41, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7187, 19, 24, 1900, 1971, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 55, 5, 7, 8, 25, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Central African Republic
+ { 37, 7, 42, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7187, 19, 24, 1900, 1996, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 55, 5, 7, 8, 5, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Chad
+ { 37, 7, 48, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7295, 19, 24, 1900, 2001, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 50, 5, 7, 8, 7, {75,77,70}, 0, 0, 1, 6, 7 }, // French/Latin/Comoros
+ { 37, 7, 49, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7345, 19, 24, 1900, 2008, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 52, 5, 7, 8, 14, {67,68,70}, 2, 1, 1, 6, 7 }, // French/Latin/Congo Kinshasa
+ { 37, 7, 50, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7187, 19, 24, 1900, 2022, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 55, 5, 7, 8, 17, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Congo Brazzaville
+ { 37, 7, 53, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 2039, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 13, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Ivory Coast
+ { 37, 7, 59, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 36, 7397, 19, 24, 1900, 2052, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 56, 5, 7, 8, 8, {68,74,70}, 0, 0, 6, 6, 7 }, // French/Latin/Djibouti
+ { 37, 7, 66, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7187, 19, 24, 1900, 2060, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 55, 5, 7, 8, 18, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Equatorial Guinea
+ { 37, 7, 76, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2078, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 16, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/French Guiana
+ { 37, 7, 77, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 197, 7453, 19, 24, 1900, 2094, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 34, 5, 7, 8, 19, {88,80,70}, 0, 0, 1, 6, 7 }, // French/Latin/French Polynesia
+ { 37, 7, 79, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 32, 7187, 19, 24, 1900, 2113, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 55, 5, 7, 8, 5, {88,65,70}, 0, 0, 1, 6, 7 }, // French/Latin/Gabon
+ { 37, 7, 88, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2118, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Guadeloupe
+ { 37, 7, 91, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 201, 7487, 19, 24, 1900, 2060, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 47, 5, 7, 8, 6, {71,78,70}, 0, 0, 1, 6, 7 }, // French/Latin/Guinea
+ { 37, 7, 94, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 163, 7534, 19, 24, 1900, 2128, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 56, 5, 7, 8, 5, {72,84,71}, 2, 1, 1, 6, 7 }, // French/Latin/Haiti
+ { 37, 7, 125, 0, 0, 234, 234, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2133, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Luxembourg
+ { 37, 7, 128, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 166, 7590, 19, 24, 1900, 1203, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 53, 5, 7, 8, 10, {77,71,65}, 0, 0, 1, 6, 7 }, // French/Latin/Madagascar
+ { 37, 7, 132, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 2143, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 4, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Mali
+ { 37, 7, 135, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2147, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Martinique
+ { 37, 7, 136, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 203, 7643, 19, 24, 1900, 2157, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 65, 5, 7, 8, 10, {77,82,85}, 2, 1, 1, 6, 7 }, // French/Latin/Mauritania
+ { 37, 7, 137, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 170, 7708, 19, 24, 1900, 2167, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 62, 5, 7, 8, 7, {77,85,82}, 2, 0, 1, 6, 7 }, // French/Latin/Mauritius
+ { 37, 7, 138, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2174, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Mayotte
+ { 37, 7, 142, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2181, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Monaco
+ { 37, 7, 145, 0, 0, 234, 234, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 64, 61, 387, 213, 230, 205, 7770, 19, 24, 1900, 2187, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 4, 4, 6, 17, 23, 3, 53, 5, 7, 8, 5, {77,65,68}, 2, 1, 1, 6, 7 }, // French/Latin/Morocco
+ { 37, 7, 153, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 197, 7453, 19, 24, 1900, 2192, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 34, 5, 7, 8, 18, {88,80,70}, 0, 0, 1, 6, 7 }, // French/Latin/New Caledonia
+ { 37, 7, 156, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 1311, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Niger
+ { 37, 7, 176, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2210, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Reunion
+ { 37, 7, 179, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 174, 7823, 19, 24, 1900, 1427, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 49, 5, 7, 8, 6, {82,87,70}, 0, 0, 1, 6, 7 }, // French/Latin/Rwanda
+ { 37, 7, 187, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 2220, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 7, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Senegal
+ { 37, 7, 188, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 179, 7872, 19, 24, 1900, 1480, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 70, 5, 7, 8, 10, {83,67,82}, 2, 1, 1, 6, 7 }, // French/Latin/Seychelles
+ { 37, 7, 200, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2227, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 24, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Saint Pierre And Miquelon
+ { 37, 7, 206, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 17, 18, 0, 166, 257, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 208, 7942, 19, 24, 2251, 2266, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 14, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 44, 5, 7, 15, 6, {67,72,70}, 2, 0, 1, 6, 7 }, // French/Latin/Switzerland
+ { 37, 7, 207, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 211, 7986, 19, 24, 1900, 2272, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 50, 5, 7, 8, 5, {83,89,80}, 0, 0, 6, 5, 6 }, // French/Latin/Syria
+ { 37, 7, 212, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 33, 7077, 19, 24, 1900, 2277, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 3, 58, 5, 7, 8, 4, {88,79,70}, 0, 0, 1, 6, 7 }, // French/Latin/Togo
+ { 37, 7, 216, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 213, 8036, 19, 24, 1900, 2281, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 50, 5, 7, 8, 7, {84,78,68}, 3, 0, 1, 6, 7 }, // French/Latin/Tunisia
+ { 37, 7, 229, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 10, 22, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 193, 8086, 19, 24, 1900, 1726, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 12, 7, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 2, 50, 5, 7, 8, 7, {86,85,86}, 0, 0, 1, 6, 7 }, // French/Latin/Vanuatu
+ { 37, 7, 235, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 197, 7453, 19, 24, 1900, 2288, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 4, 34, 5, 7, 8, 16, {88,80,70}, 0, 0, 1, 6, 7 }, // French/Latin/Wallis And Futuna Islands
+ { 37, 7, 244, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2304, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 16, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Saint Barthelemy
+ { 37, 7, 245, 0, 0, 234, 234, 6, 1, 51, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 45, 0, 0, 2930, 2930, 2981, 2981, 3015, 3015, 0, 0, 387, 213, 230, 14, 3032, 19, 24, 1900, 2320, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 51, 51, 34, 34, 13, 13, 2, 2, 6, 17, 23, 1, 19, 5, 7, 8, 12, {69,85,82}, 2, 1, 1, 6, 7 }, // French/Latin/Saint Martin
+ { 38, 7, 151, 0, 0, 7, 7, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 347, 0, 0, 3028, 3028, 3081, 3081, 83, 83, 0, 0, 0, 5, 22, 14, 3374, 8, 37, 2332, 2337, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 53, 53, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 7, 5, 8, {69,85,82}, 2, 1, 1, 6, 7 }, // Western Frisian/Latin/Netherlands
+ { 39, 7, 224, 0, 0, 242, 242, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 589, 45, 0, 0, 3101, 3101, 3169, 3169, 3196, 3196, 5, 77, 393, 5, 22, 117, 8136, 4, 13, 2345, 2353, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 10, 10, 5, 68, 68, 27, 27, 13, 13, 1, 1, 6, 17, 23, 1, 85, 4, 6, 8, 22, {71,66,80}, 2, 1, 1, 6, 7 }, // Gaelic/Latin/United Kingdom
+ { 40, 7, 197, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 45, 0, 0, 3209, 3257, 3305, 3339, 3373, 3386, 64, 61, 0, 5, 22, 14, 3032, 19, 0, 2375, 2381, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 48, 48, 34, 34, 13, 20, 4, 4, 5, 17, 23, 1, 19, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Galician/Latin/Spain
+ { 41, 15, 81, 0, 0, 259, 259, 6, 1, 14, 2, 3, 4, 5, 9, 40, 10, 15, 16, 637, 166, 0, 0, 3406, 3406, 3467, 3467, 3494, 3494, 0, 0, 399, 404, 22, 215, 8221, 19, 0, 2387, 2394, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 10, 5, 61, 61, 27, 27, 13, 13, 2, 2, 5, 37, 23, 1, 42, 5, 0, 7, 10, {71,69,76}, 2, 1, 1, 6, 7 }, // Georgian/Georgian/Georgia
+ { 42, 7, 82, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 14, 8263, 19, 0, 2404, 2411, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 5, 0, 7, 11, {69,85,82}, 2, 1, 1, 6, 7 }, // German/Latin/Germany
+ { 42, 7, 14, 0, 0, 267, 267, 6, 1, 14, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 14, 8263, 19, 0, 2422, 2422, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 5, 0, 24, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // German/Latin/Austria
+ { 42, 7, 21, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 14, 8263, 19, 0, 2404, 2446, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // German/Latin/Belgium
+ { 42, 7, 106, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 14, 8263, 19, 0, 2404, 2453, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // German/Latin/Italy
+ { 42, 7, 123, 0, 0, 267, 267, 6, 0, 13, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 208, 8281, 19, 0, 2404, 2460, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 3, 57, 5, 0, 7, 13, {67,72,70}, 2, 0, 1, 6, 7 }, // German/Latin/Liechtenstein
+ { 42, 7, 125, 0, 0, 267, 267, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 14, 8263, 19, 0, 2404, 2473, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 1, 18, 5, 0, 7, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // German/Latin/Luxembourg
+ { 42, 7, 206, 0, 0, 267, 267, 6, 0, 13, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0, 3507, 3507, 3566, 3586, 3613, 3613, 0, 0, 441, 5, 22, 208, 8281, 19, 0, 2482, 2482, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 59, 59, 20, 27, 13, 13, 2, 2, 5, 17, 23, 3, 57, 5, 0, 21, 7, {67,72,70}, 2, 0, 1, 6, 7 }, // German/Latin/Switzerland
+ { 43, 16, 85, 0, 0, 276, 276, 6, 1, 0, 2, 3, 4, 5, 6, 15, 16, 10, 11, 0, 259, 10, 22, 3626, 3626, 3680, 3680, 3707, 3707, 81, 78, 0, 5, 22, 14, 8338, 19, 0, 2503, 2511, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 54, 54, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 18, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Greek/Greek/Greece
+ { 43, 16, 56, 0, 0, 276, 276, 6, 1, 0, 2, 3, 4, 5, 6, 15, 16, 10, 11, 0, 259, 10, 22, 3626, 3626, 3680, 3680, 3707, 3707, 81, 78, 0, 5, 22, 14, 8338, 19, 0, 2503, 2517, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 54, 54, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 18, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Greek/Greek/Cyprus
+ { 44, 7, 86, 0, 0, 285, 285, 6, 1, 0, 2, 3, 38, 5, 47, 16, 15, 18, 17, 80, 70, 166, 166, 3720, 3720, 3817, 3817, 3844, 3844, 0, 0, 0, 5, 22, 145, 8356, 4, 49, 2523, 2534, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 97, 97, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 61, 4, 5, 11, 16, {68,75,75}, 2, 0, 1, 6, 7 }, // Greenlandic/Latin/Greenland
+ { 45, 7, 168, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 216, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {80,89,71}, 0, 0, 7, 6, 7 }, // Guarani/Latin/Paraguay
+ { 46, 17, 100, 0, 0, 296, 296, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 259, 271, 284, 3857, 3857, 3909, 3909, 3940, 3940, 0, 0, 446, 450, 22, 119, 8417, 4, 13, 2550, 2557, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 8, 52, 52, 31, 31, 18, 18, 2, 2, 4, 19, 23, 1, 45, 4, 6, 7, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Gujarati/Gujarati/India
+ { 47, 7, 157, 0, 0, 305, 305, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 656, 259, 0, 0, 3958, 3958, 4009, 4009, 4036, 4036, 85, 82, 0, 5, 22, 172, 8462, 8, 0, 2561, 2566, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 51, 51, 27, 27, 13, 13, 6, 5, 4, 17, 23, 1, 53, 5, 0, 5, 8, {78,71,78}, 2, 1, 1, 6, 7 }, // Hausa/Latin/Nigeria
+ { 47, 1, 157, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 172, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7 }, // Hausa/Arabic/Nigeria
+ { 47, 7, 83, 0, 0, 305, 305, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 656, 259, 10, 22, 3958, 3958, 4009, 4009, 4036, 4036, 85, 82, 0, 5, 22, 163, 0, 8, 0, 2561, 2574, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 51, 51, 27, 27, 13, 13, 6, 5, 4, 17, 23, 3, 0, 5, 0, 5, 4, {71,72,83}, 2, 1, 1, 6, 7 }, // Hausa/Latin/Ghana
+ { 47, 7, 156, 0, 0, 305, 305, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 656, 259, 0, 0, 3958, 3958, 4009, 4009, 4036, 4036, 85, 82, 0, 5, 22, 33, 8515, 8, 0, 2561, 2578, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 51, 51, 27, 27, 13, 13, 6, 5, 4, 17, 23, 3, 29, 5, 0, 5, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // Hausa/Latin/Niger
+ { 48, 18, 105, 0, 0, 313, 313, 6, 0, 1, 2, 3, 33, 35, 9, 11, 11, 13, 13, 673, 581, 1, 1, 4049, 4049, 4113, 4113, 4158, 4158, 91, 87, 469, 5, 22, 47, 8544, 19, 0, 2583, 2588, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 18, 8, 9, 4, 64, 64, 45, 45, 20, 20, 6, 5, 4, 17, 23, 1, 53, 5, 0, 5, 5, {73,76,83}, 2, 1, 7, 5, 6 }, // Hebrew/Hebrew/Israel
+ { 49, 13, 100, 0, 0, 319, 328, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 10, 22, 4178, 4178, 4230, 4230, 4261, 4261, 68, 65, 473, 5, 22, 119, 8597, 4, 0, 2593, 2599, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 52, 52, 31, 31, 18, 18, 2, 2, 4, 17, 23, 1, 41, 4, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Hindi/Devanagari/India
+ { 50, 7, 98, 0, 0, 336, 336, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 16, 15, 691, 710, 1, 1, 4279, 4279, 4330, 4330, 4348, 4348, 97, 92, 477, 5, 22, 217, 8638, 19, 0, 2603, 2609, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 13, 9, 4, 51, 51, 18, 18, 16, 16, 3, 3, 4, 17, 23, 2, 45, 5, 0, 6, 12, {72,85,70}, 2, 0, 1, 6, 7 }, // Hungarian/Latin/Hungary
+ { 51, 7, 99, 0, 0, 190, 190, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 581, 0, 0, 4364, 4364, 4444, 4444, 4478, 4478, 100, 95, 481, 5, 22, 219, 8683, 19, 0, 2621, 2629, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 80, 80, 34, 34, 13, 13, 4, 4, 4, 17, 23, 3, 48, 5, 0, 8, 6, {73,83,75}, 0, 0, 1, 6, 7 }, // Icelandic/Latin/Iceland
+ { 52, 7, 101, 0, 0, 344, 354, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 45, 166, 166, 4491, 4491, 4533, 4533, 4560, 4560, 0, 0, 0, 5, 22, 222, 8731, 4, 0, 2635, 2635, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 42, 42, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 38, 4, 0, 9, 9, {73,68,82}, 2, 0, 7, 6, 7 }, // Indonesian/Latin/Indonesia
+ { 53, 7, 260, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 723, 511, 0, 0, 4573, 4573, 4629, 4629, 4656, 4656, 0, 0, 0, 5, 22, 0, 0, 8, 37, 2644, 2655, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 10, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 5, 17, 23, 0, 0, 5, 7, 11, 5, {0,0,0}, 2, 1, 1, 6, 7 }, // Interlingua/Latin/World
+ { 55, 44, 38, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 224, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,65,68}, 2, 0, 7, 6, 7 }, // Inuktitut/Canadian Aboriginal/Canada
+ { 55, 7, 38, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 224, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,65,68}, 2, 0, 7, 6, 7 }, // Inuktitut/Latin/Canada
+ { 57, 7, 104, 0, 0, 363, 242, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 45, 0, 0, 4669, 4669, 4743, 4743, 4779, 4779, 104, 99, 485, 5, 22, 14, 8769, 4, 13, 2660, 2667, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 74, 74, 36, 36, 13, 13, 4, 4, 6, 17, 23, 1, 30, 4, 6, 7, 4, {69,85,82}, 2, 1, 1, 6, 7 }, // Irish/Latin/Ireland
+ { 57, 7, 224, 0, 0, 363, 242, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 45, 0, 0, 4669, 4669, 4743, 4743, 4779, 4779, 104, 99, 485, 5, 22, 117, 8799, 4, 13, 2660, 2671, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 74, 74, 36, 36, 13, 13, 4, 4, 6, 17, 23, 1, 94, 4, 6, 7, 19, {71,66,80}, 2, 1, 1, 6, 7 }, // Irish/Latin/United Kingdom
+ { 58, 7, 106, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 45, 0, 0, 4792, 4792, 4848, 4848, 4875, 4875, 0, 0, 0, 5, 22, 14, 3032, 19, 0, 2690, 2698, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 8, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Italian/Latin/Italy
+ { 58, 7, 184, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 45, 0, 0, 4792, 4792, 4848, 4848, 4875, 4875, 0, 0, 0, 5, 22, 14, 3032, 19, 0, 2690, 2704, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 8, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // Italian/Latin/San Marino
+ { 58, 7, 206, 0, 0, 252, 252, 6, 0, 13, 2, 3, 4, 5, 9, 15, 16, 17, 18, 0, 166, 0, 0, 4792, 4792, 4848, 4848, 4875, 4875, 0, 0, 0, 5, 22, 0, 8893, 19, 0, 2690, 2714, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 52, 5, 0, 8, 8, {67,72,70}, 2, 0, 1, 6, 7 }, // Italian/Latin/Switzerland
+ { 58, 7, 230, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 45, 0, 0, 4792, 4792, 4848, 4848, 4875, 4875, 0, 0, 0, 5, 22, 14, 3032, 19, 0, 2690, 2722, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 56, 56, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 8, 18, {69,85,82}, 2, 1, 1, 6, 7 }, // Italian/Latin/Vatican City State
+ { 59, 19, 108, 168, 168, 168, 168, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 377, 545, 292, 1, 4888, 4888, 4915, 4915, 4915, 4915, 108, 103, 491, 494, 22, 227, 8945, 4, 13, 2740, 2740, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 10, 10, 4, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 10, 4, 6, 3, 2, {74,80,89}, 0, 0, 7, 6, 7 }, // Japanese/Japanese/Japan
+ { 60, 7, 101, 0, 0, 374, 384, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 511, 0, 0, 4928, 4928, 4968, 4968, 4996, 4996, 110, 105, 511, 5, 22, 222, 8731, 8, 0, 2743, 2747, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 40, 40, 28, 28, 13, 13, 4, 5, 4, 17, 23, 2, 38, 5, 0, 4, 9, {73,68,82}, 2, 0, 7, 6, 7 }, // Javanese/Latin/Indonesia
+ { 61, 21, 100, 0, 0, 393, 405, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 259, 271, 284, 5009, 5009, 5062, 5062, 5094, 5094, 114, 110, 515, 523, 22, 119, 8955, 4, 13, 2756, 2761, 6, 6, 12, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 13, 8, 53, 53, 32, 32, 19, 19, 9, 7, 8, 35, 23, 1, 48, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Kannada/Kannada/India
+ { 62, 1, 100, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 27, 521, 10, 22, 5113, 5113, 5164, 5164, 5213, 5213, 0, 0, 0, 5, 22, 119, 9003, 8, 0, 2765, 2770, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 6, 12, 7, 51, 51, 49, 49, 13, 13, 2, 2, 4, 17, 23, 1, 16, 5, 0, 5, 9, {73,78,82}, 2, 1, 7, 7, 7 }, // Kashmiri/Arabic/India
+ { 63, 2, 110, 0, 0, 0, 416, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 749, 166, 0, 0, 5226, 5226, 5281, 5281, 5301, 5301, 0, 0, 253, 558, 575, 228, 9019, 19, 0, 2779, 2789, 6, 6, 6, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 10, 5, 55, 55, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 57, 5, 0, 10, 9, {75,90,84}, 2, 1, 1, 6, 7 }, // Kazakh/Cyrillic/Kazakhstan
+ { 64, 7, 179, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 12, 13, 53, 70, 0, 0, 5314, 5314, 5397, 5397, 83, 83, 0, 0, 0, 5, 22, 174, 0, 8, 0, 2798, 2809, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 83, 83, 34, 34, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 11, 8, {82,87,70}, 0, 0, 1, 6, 7 }, // Kinyarwanda/Latin/Rwanda
+ { 65, 2, 116, 0, 0, 426, 426, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 771, 259, 0, 0, 5431, 5431, 5487, 5487, 5524, 5524, 123, 117, 253, 598, 22, 229, 9076, 19, 0, 2817, 2825, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 10, 5, 56, 56, 37, 37, 13, 13, 5, 14, 4, 18, 23, 3, 51, 5, 0, 8, 10, {75,71,83}, 2, 1, 1, 6, 7 }, // Kirghiz/Cyrillic/Kyrgyzstan
+ { 66, 22, 114, 0, 0, 436, 436, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 794, 810, 302, 315, 5537, 5537, 5564, 5564, 5564, 5564, 128, 131, 616, 5, 22, 232, 9127, 4, 13, 2835, 2838, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 13, 7, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 1, 18, 4, 6, 3, 4, {75,82,87}, 0, 0, 7, 6, 7 }, // Korean/Korean/South Korea
+ { 66, 22, 113, 0, 0, 436, 436, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 794, 810, 302, 315, 5537, 5537, 5564, 5564, 5564, 5564, 128, 131, 616, 5, 22, 233, 9145, 4, 13, 2835, 2842, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 13, 7, 27, 27, 13, 13, 13, 13, 2, 2, 3, 17, 23, 3, 38, 4, 6, 3, 11, {75,80,87}, 0, 0, 1, 6, 7 }, // Korean/Korean/North Korea
+ { 67, 7, 217, 0, 0, 443, 443, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 5577, 5577, 5618, 5618, 5637, 5637, 130, 133, 0, 5, 22, 236, 0, 19, 24, 2853, 2858, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 41, 41, 19, 19, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 7, 5, 7, {84,82,89}, 2, 1, 1, 6, 7 }, // Kurdish/Latin/Turkey
+ { 68, 7, 35, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 11, 11, 13, 13, 97, 398, 0, 0, 5650, 5650, 5738, 5738, 83, 83, 132, 135, 0, 5, 22, 159, 9183, 0, 0, 2865, 2873, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 88, 88, 33, 33, 13, 13, 5, 5, 4, 17, 23, 3, 20, 4, 0, 8, 8, {66,73,70}, 0, 0, 1, 6, 7 }, // Rundi/Latin/Burundi
+ { 69, 23, 117, 0, 0, 0, 450, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 819, 398, 322, 1, 5771, 5771, 5827, 5827, 5862, 5862, 137, 140, 0, 5, 22, 237, 9203, 4, 44, 2881, 2881, 6, 6, 6, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 24, 4, 56, 56, 35, 35, 16, 16, 8, 8, 4, 17, 23, 1, 20, 4, 5, 3, 3, {76,65,75}, 0, 0, 7, 6, 7 }, // Lao/Lao/Laos
+ { 71, 7, 118, 0, 0, 459, 459, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 838, 166, 0, 0, 5878, 5949, 6020, 6070, 6120, 6120, 145, 148, 619, 5, 22, 14, 9223, 19, 0, 2884, 2892, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 8, 10, 5, 71, 71, 50, 50, 13, 13, 14, 11, 5, 17, 23, 1, 22, 5, 0, 8, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // Latvian/Latin/Latvia
+ { 72, 7, 49, 0, 0, 467, 467, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0, 6133, 6133, 6232, 6232, 6259, 6259, 159, 159, 0, 5, 22, 32, 9245, 19, 0, 2899, 2906, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 2, 16, 5, 0, 7, 30, {67,68,70}, 2, 1, 1, 6, 7 }, // Lingala/Latin/Congo Kinshasa
+ { 72, 7, 6, 0, 0, 467, 467, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0, 6133, 6133, 6232, 6232, 6259, 6259, 159, 159, 0, 5, 22, 238, 9261, 19, 0, 2899, 2936, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 2, 16, 5, 0, 7, 6, {65,79,65}, 2, 1, 1, 6, 7 }, // Lingala/Latin/Angola
+ { 72, 7, 41, 0, 0, 467, 467, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0, 6133, 6133, 6232, 6232, 6259, 6259, 159, 159, 0, 5, 22, 32, 9277, 19, 0, 2899, 2942, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 4, 16, 5, 0, 7, 26, {88,65,70}, 0, 0, 1, 6, 7 }, // Lingala/Latin/Central African Republic
+ { 72, 7, 50, 0, 0, 467, 467, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0, 6133, 6133, 6232, 6232, 6259, 6259, 159, 159, 0, 5, 22, 32, 9277, 19, 0, 2899, 2968, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 99, 99, 27, 27, 13, 13, 8, 6, 4, 17, 23, 4, 16, 5, 0, 7, 5, {88,65,70}, 0, 0, 1, 6, 7 }, // Lingala/Latin/Congo Brazzaville
+ { 73, 7, 124, 0, 0, 476, 476, 6, 1, 14, 2, 3, 38, 5, 47, 40, 10, 40, 10, 864, 70, 0, 0, 6272, 6272, 6360, 6360, 6380, 6380, 167, 165, 624, 5, 22, 14, 9293, 19, 0, 2973, 2981, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 27, 10, 10, 5, 88, 88, 20, 20, 13, 13, 9, 6, 6, 17, 23, 1, 29, 5, 0, 8, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // Lithuanian/Latin/Lithuania
+ { 74, 2, 127, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 0, 113, 0, 0, 6393, 6393, 6446, 6480, 1486, 1486, 176, 171, 630, 5, 22, 240, 9322, 19, 0, 2988, 2998, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 53, 53, 34, 33, 13, 13, 10, 8, 5, 17, 23, 4, 55, 5, 0, 10, 18, {77,75,68}, 2, 1, 1, 6, 7 }, // Macedonian/Cyrillic/Macedonia
+ { 75, 7, 128, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 70, 0, 0, 6513, 6513, 6572, 6572, 6605, 6605, 0, 0, 0, 5, 22, 166, 5291, 4, 0, 3016, 3024, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 59, 59, 33, 33, 13, 13, 2, 2, 4, 17, 23, 2, 6, 4, 0, 8, 12, {77,71,65}, 0, 0, 1, 6, 7 }, // Malagasy/Latin/Madagascar
+ { 76, 7, 130, 0, 0, 354, 354, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 46, 10, 22, 6618, 6618, 6660, 6660, 6687, 6687, 186, 179, 619, 5, 22, 168, 9377, 4, 13, 3036, 1219, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 12, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 2, 38, 4, 6, 6, 8, {77,89,82}, 2, 1, 1, 6, 7 }, // Malay/Latin/Malaysia
+ { 76, 1, 130, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 168, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {77,89,82}, 2, 1, 1, 6, 7 }, // Malay/Arabic/Malaysia
+ { 76, 7, 32, 0, 0, 354, 354, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 85, 46, 10, 22, 6618, 6618, 6660, 6660, 6687, 6687, 186, 179, 619, 5, 22, 6, 9415, 4, 13, 3036, 3042, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 7, 12, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 1, 30, 4, 6, 6, 6, {66,78,68}, 2, 1, 1, 6, 7 }, // Malay/Latin/Brunei
+ { 76, 7, 190, 0, 0, 354, 354, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 46, 10, 22, 6618, 6618, 6660, 6660, 6687, 6687, 186, 179, 619, 5, 22, 6, 9445, 4, 13, 3036, 3048, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 12, 7, 42, 42, 27, 27, 13, 13, 2, 3, 4, 17, 23, 1, 36, 4, 6, 6, 9, {83,71,68}, 2, 1, 7, 6, 7 }, // Malay/Latin/Singapore
+ { 77, 24, 100, 0, 0, 484, 497, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 891, 259, 10, 22, 6700, 6776, 6851, 6851, 6891, 6912, 0, 0, 635, 641, 22, 119, 9481, 4, 13, 3057, 3063, 6, 6, 13, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 76, 75, 40, 40, 21, 20, 2, 2, 6, 27, 23, 1, 39, 4, 6, 6, 6, {73,78,82}, 2, 1, 7, 7, 7 }, // Malayalam/Malayalam/India
+ { 78, 7, 133, 0, 0, 509, 517, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 909, 45, 0, 0, 6932, 6932, 6994, 6994, 7021, 7041, 0, 0, 0, 5, 22, 14, 9520, 4, 0, 3069, 1227, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 62, 62, 27, 27, 20, 19, 2, 2, 4, 17, 23, 1, 26, 4, 0, 5, 5, {69,85,82}, 2, 1, 7, 6, 7 }, // Maltese/Latin/Malta
+ { 79, 7, 154, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 511, 10, 22, 7060, 7060, 7106, 7106, 7132, 7132, 0, 0, 0, 5, 22, 6, 9546, 8, 0, 3074, 3079, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 46, 46, 26, 26, 13, 13, 2, 2, 4, 17, 23, 1, 36, 5, 0, 5, 8, {78,90,68}, 2, 1, 1, 6, 7 }, // Maori/Latin/New Zealand
+ { 80, 13, 100, 0, 0, 524, 524, 6, 0, 1, 2, 60, 4, 5, 9, 10, 11, 12, 13, 174, 259, 10, 22, 7145, 7145, 7197, 7197, 4261, 4261, 188, 182, 473, 5, 22, 119, 9582, 4, 13, 3087, 2599, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 52, 52, 31, 31, 18, 18, 5, 4, 4, 17, 23, 1, 42, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Marathi/Devanagari/India
+ { 82, 2, 143, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 932, 967, 54, 0, 7228, 7270, 7312, 7312, 7312, 7312, 193, 186, 253, 668, 22, 244, 9624, 8, 0, 3092, 3098, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 35, 10, 12, 5, 42, 42, 20, 20, 20, 20, 4, 4, 4, 17, 23, 1, 45, 5, 0, 6, 6, {77,78,84}, 2, 0, 1, 6, 7 }, // Mongolian/Cyrillic/Mongolia
+ { 82, 8, 44, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 245, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,78,89}, 2, 1, 7, 6, 7 }, // Mongolian/Mongolian/China
+ { 84, 13, 150, 533, 0, 538, 538, 6, 0, 1, 2, 60, 4, 5, 9, 10, 11, 12, 13, 53, 253, 0, 0, 7332, 7332, 7385, 7385, 7417, 7417, 197, 190, 473, 685, 22, 248, 9669, 8, 0, 3104, 3104, 5, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 53, 53, 32, 32, 17, 17, 9, 7, 4, 19, 23, 4, 48, 5, 0, 6, 5, {78,80,82}, 2, 1, 7, 6, 7 }, // Nepali/Devanagari/Nepal
+ { 84, 13, 100, 533, 0, 538, 538, 6, 0, 1, 2, 60, 4, 5, 9, 10, 11, 12, 13, 53, 253, 10, 22, 7332, 7332, 7385, 7385, 7417, 7417, 197, 190, 473, 685, 22, 119, 9717, 8, 0, 3104, 2599, 5, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 53, 53, 32, 32, 17, 17, 9, 7, 4, 19, 23, 1, 48, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Nepali/Devanagari/India
+ { 85, 7, 161, 0, 0, 190, 190, 6, 1, 14, 2, 3, 38, 5, 9, 15, 16, 12, 13, 461, 501, 0, 0, 2173, 2173, 2250, 2250, 2284, 2284, 64, 61, 0, 5, 22, 145, 9765, 8, 0, 3110, 3122, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 50, 50, 34, 34, 13, 13, 4, 4, 4, 17, 23, 2, 43, 5, 0, 12, 5, {78,79,75}, 2, 0, 1, 6, 7 }, // Norwegian Bokmal/Latin/Norway
+ { 85, 7, 203, 0, 0, 190, 190, 6, 1, 14, 2, 3, 38, 5, 9, 15, 16, 12, 13, 461, 501, 0, 0, 2173, 2173, 2250, 2250, 2284, 2284, 64, 61, 0, 5, 22, 145, 9765, 8, 0, 3110, 3127, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 50, 50, 34, 34, 13, 13, 4, 4, 4, 17, 23, 2, 43, 5, 0, 12, 21, {78,79,75}, 2, 0, 1, 6, 7 }, // Norwegian Bokmal/Latin/Svalbard And Jan Mayen Islands
+ { 86, 7, 74, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Occitan/Latin/France
+ { 87, 26, 100, 0, 0, 545, 553, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22, 7434, 7434, 7487, 7487, 7519, 7519, 0, 0, 704, 5, 22, 119, 9808, 4, 13, 3148, 3153, 6, 6, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 53, 53, 32, 32, 17, 17, 2, 2, 5, 17, 23, 1, 42, 4, 6, 5, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Oriya/Oriya/India
+ { 88, 1, 1, 560, 560, 566, 575, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 977, 390, 55, 1, 7536, 7536, 7536, 7536, 83, 83, 206, 197, 709, 5, 22, 252, 9850, 4, 13, 3157, 3161, 6, 6, 9, 8, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 20, 8, 11, 4, 38, 38, 38, 38, 13, 13, 4, 4, 5, 17, 23, 1, 24, 4, 6, 4, 9, {65,70,78}, 0, 0, 6, 4, 5 }, // Pashto/Arabic/Afghanistan
+ { 88, 1, 163, 560, 560, 566, 575, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 977, 390, 10, 22, 7536, 7536, 7536, 7536, 83, 83, 206, 197, 709, 5, 22, 170, 9874, 4, 13, 3157, 3170, 6, 6, 9, 8, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 20, 8, 12, 7, 38, 38, 38, 38, 13, 13, 4, 4, 5, 17, 23, 2, 51, 4, 6, 4, 7, {80,75,82}, 2, 0, 7, 6, 7 }, // Pashto/Arabic/Pakistan
+ { 89, 1, 102, 583, 583, 590, 598, 53, 19, 20, 21, 52, 61, 35, 56, 15, 16, 17, 18, 97, 390, 55, 1, 7574, 7574, 7574, 7574, 7622, 7622, 210, 201, 714, 718, 22, 253, 9925, 54, 60, 3177, 3182, 7, 7, 8, 7, 1, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 16, 8, 11, 4, 48, 48, 48, 48, 13, 13, 9, 8, 4, 44, 23, 4, 36, 6, 8, 5, 5, {73,82,82}, 0, 0, 6, 5, 5 }, // Persian/Arabic/Iran
+ { 89, 1, 1, 583, 583, 590, 598, 53, 19, 20, 21, 52, 61, 35, 56, 15, 16, 17, 18, 97, 390, 55, 1, 7574, 7574, 7574, 7574, 7622, 7622, 210, 201, 714, 718, 22, 252, 9961, 8, 60, 3187, 3161, 7, 7, 8, 7, 1, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 16, 8, 11, 4, 48, 48, 48, 48, 13, 13, 9, 8, 4, 44, 23, 1, 54, 5, 8, 3, 9, {65,70,78}, 0, 0, 6, 4, 5 }, // Persian/Arabic/Afghanistan
+ { 90, 7, 172, 0, 0, 161, 161, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 15, 16, 0, 501, 0, 0, 7635, 7635, 7693, 7693, 7726, 7739, 0, 0, 322, 5, 22, 257,10015, 19, 24, 3190, 3196, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 58, 58, 33, 33, 13, 13, 2, 2, 5, 17, 23, 2, 76, 5, 7, 6, 6, {80,76,78}, 2, 1, 1, 6, 7 }, // Polish/Latin/Poland
+ { 91, 7, 30, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 45, 0, 0, 7752, 7752, 7830, 7830, 7864, 7864, 0, 0, 0, 5, 22, 5,10091, 8, 0, 3202, 3211, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 10, 5, 78, 78, 34, 34, 13, 13, 2, 2, 5, 17, 23, 2, 53, 5, 0, 9, 6, {66,82,76}, 2, 1, 7, 6, 7 }, // Portuguese/Latin/Brazil
+ { 91, 7, 6, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 238,10144, 19, 24, 3202, 3217, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 2, 53, 5, 7, 9, 6, {65,79,65}, 2, 1, 1, 6, 7 }, // Portuguese/Latin/Angola
+ { 91, 7, 39, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 259,10197, 19, 24, 3202, 3223, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 68, 5, 7, 9, 10, {67,86,69}, 2, 1, 1, 6, 7 }, // Portuguese/Latin/Cape Verde
+ { 91, 7, 62, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 156,10265, 19, 24, 3202, 3233, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 80, 5, 7, 9, 11, {85,83,68}, 2, 1, 1, 6, 7 }, // Portuguese/Latin/East Timor
+ { 91, 7, 66, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 32,10345, 19, 24, 3202, 3244, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 4, 58, 5, 7, 9, 16, {88,65,70}, 0, 0, 1, 6, 7 }, // Portuguese/Latin/Equatorial Guinea
+ { 91, 7, 92, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 33,10403, 19, 24, 3202, 3260, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 61, 5, 7, 9, 12, {88,79,70}, 0, 0, 1, 6, 7 }, // Portuguese/Latin/Guinea Bissau
+ { 91, 7, 125, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 14, 3032, 19, 24, 3202, 3272, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 19, 5, 7, 9, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // Portuguese/Latin/Luxembourg
+ { 91, 7, 126, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 10, 22, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 134,10464, 19, 24, 3202, 3282, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 4, 53, 5, 7, 9, 19, {77,79,80}, 2, 1, 7, 6, 7 }, // Portuguese/Latin/Macau
+ { 91, 7, 146, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 260,10517, 19, 24, 3202, 3301, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 65, 5, 7, 9, 10, {77,90,78}, 2, 1, 7, 6, 7 }, // Portuguese/Latin/Mozambique
+ { 91, 7, 173, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 14, 3032, 19, 24, 3311, 3328, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 1, 19, 5, 7, 17, 8, {69,85,82}, 2, 1, 7, 6, 7 }, // Portuguese/Latin/Portugal
+ { 91, 7, 185, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 263,10582, 19, 24, 3202, 3336, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 2, 91, 5, 7, 9, 19, {83,84,78}, 2, 1, 1, 6, 7 }, // Portuguese/Latin/Sao Tome And Principe
+ { 91, 7, 206, 0, 0, 252, 252, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 45, 0, 0, 7752, 7752, 7877, 7877, 7864, 7864, 219, 209, 0, 5, 22, 208,10673, 19, 24, 3202, 3355, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 78, 78, 48, 48, 13, 13, 8, 8, 5, 17, 23, 3, 44, 5, 7, 9, 5, {67,72,70}, 2, 0, 1, 6, 7 }, // Portuguese/Latin/Switzerland
+ { 92, 4, 100, 0, 0, 605, 605, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 10, 22, 7925, 7925, 7981, 7981, 8016, 8016, 227, 217, 762, 5, 22, 119,10717, 8, 0, 3360, 3366, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 35, 35, 22, 22, 6, 6, 4, 17, 23, 1, 38, 5, 0, 6, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Punjabi/Gurmukhi/India
+ { 92, 1, 163, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 527, 45, 10, 22, 8038, 8038, 8038, 8038, 83, 83, 0, 0, 0, 5, 22, 77,10755, 8, 0, 3370, 3170, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 10, 12, 7, 36, 36, 36, 36, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 6, 7, {80,75,82}, 2, 0, 7, 6, 7 }, // Punjabi/Arabic/Pakistan
+ { 93, 7, 169, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 45, 0, 0, 8074, 8074, 8126, 8126, 8153, 8153, 64, 61, 0, 5, 22, 265,10761, 8, 0, 3376, 3384, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 28, 5, 0, 8, 4, {80,69,78}, 2, 1, 7, 6, 7 }, // Quechua/Latin/Peru
+ { 93, 7, 26, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 45, 0, 0, 8074, 8074, 8126, 8126, 8153, 8153, 64, 61, 0, 5, 22, 267,10789, 8, 0, 3376, 3388, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 2, 24, 5, 0, 8, 7, {66,79,66}, 2, 1, 1, 6, 7 }, // Quechua/Latin/Bolivia
+ { 93, 7, 63, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 45, 0, 0, 8074, 8074, 8126, 8126, 8153, 8153, 64, 61, 0, 5, 22, 6,10813, 8, 0, 3376, 3395, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 36, 5, 0, 8, 7, {85,83,68}, 2, 1, 1, 6, 7 }, // Quechua/Latin/Ecuador
+ { 94, 7, 206, 0, 0, 0, 0, 6, 0, 13, 2, 3, 38, 5, 9, 15, 16, 17, 18, 997, 347, 0, 0, 8166, 8166, 8221, 8221, 8243, 8243, 0, 0, 0, 5, 22, 208,10849, 19, 0, 3402, 3411, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 10, 5, 55, 55, 22, 22, 13, 13, 2, 2, 4, 17, 23, 3, 45, 5, 0, 9, 6, {67,72,70}, 2, 0, 1, 6, 7 }, // Romansh/Latin/Switzerland
+ { 95, 7, 177, 0, 0, 614, 614, 6, 1, 0, 2, 3, 4, 5, 9, 40, 11, 15, 16, 0, 501, 0, 0, 8256, 8256, 8303, 8303, 3015, 3015, 64, 61, 766, 5, 22, 269,10894, 19, 24, 3417, 3423, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 47, 47, 33, 33, 13, 13, 4, 4, 4, 17, 23, 3, 56, 5, 7, 6, 7, {82,79,78}, 2, 1, 1, 6, 7 }, // Romanian/Latin/Romania
+ { 95, 7, 141, 0, 0, 614, 614, 6, 1, 0, 2, 3, 4, 5, 9, 40, 11, 15, 16, 0, 501, 0, 0, 8256, 8256, 8336, 8336, 8363, 8363, 64, 61, 766, 5, 22, 7,10950, 19, 24, 3417, 3430, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 47, 47, 27, 27, 15, 15, 4, 4, 4, 17, 23, 1, 68, 5, 7, 6, 17, {77,68,76}, 2, 1, 1, 6, 7 }, // Romanian/Latin/Moldova
+ { 96, 2, 178, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 121,11018, 19, 0, 3447, 3454, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 1, 88, 5, 0, 7, 6, {82,85,66}, 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Russia
+ { 96, 2, 20, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 0,11106, 19, 0, 3447, 510, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 2, 93, 5, 0, 7, 8, {66,89,78}, 2, 0, 1, 6, 7 }, // Russian/Cyrillic/Belarus
+ { 96, 2, 110, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 228,11199, 19, 0, 3447, 3460, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 1, 82, 5, 0, 7, 9, {75,90,84}, 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kazakhstan
+ { 96, 2, 116, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 229,11281, 19, 0, 3447, 3469, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 3, 81, 5, 0, 7, 8, {75,71,83}, 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kyrgyzstan
+ { 96, 2, 141, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 7,11362, 19, 0, 3447, 3477, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 1, 78, 5, 0, 7, 7, {77,68,76}, 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Moldova
+ { 96, 2, 222, 0, 0, 113, 113, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 295, 501, 0, 0, 8378, 8378, 8439, 8439, 8459, 8439, 0, 0, 265, 668, 22, 272,11440, 19, 0, 3447, 3484, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 10, 10, 5, 61, 61, 20, 20, 13, 20, 2, 2, 5, 17, 23, 1, 91, 5, 0, 7, 7, {85,65,72}, 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Ukraine
+ { 98, 7, 41, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 398, 0, 0, 8472, 8472, 8537, 8537, 8564, 8564, 233, 223, 0, 5, 22, 32,11531, 4, 44, 3491, 3496, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 65, 65, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 18, 4, 5, 5, 22, {88,65,70}, 0, 0, 1, 6, 7 }, // Sango/Latin/Central African Republic
+ { 99, 13, 100, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 119, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {73,78,82}, 2, 1, 7, 7, 7 }, // Sanskrit/Devanagari/India
+ { 100, 2, 243, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8577, 8577, 8628, 8628, 8655, 8655, 235, 225, 770, 5, 22, 273,11549, 19, 24, 3518, 3524, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 51, 51, 27, 27, 13, 13, 9, 8, 7, 17, 23, 3, 57, 5, 7, 6, 6, {82,83,68}, 0, 0, 1, 6, 7 }, // Serbian/Cyrillic/Serbia
+ { 100, 7, 27, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8668, 8668, 8724, 8724, 2066, 2066, 244, 233, 315, 5, 22, 141,11606, 19, 24, 3530, 629, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 56, 56, 25, 25, 13, 13, 11, 8, 7, 17, 23, 2,173, 5, 7, 6, 19, {66,65,77}, 2, 1, 1, 6, 7 }, // Serbian/Latin/Bosnia And Herzegowina
+ { 100, 7, 242, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8668, 8668, 8749, 8749, 2066, 2066, 244, 233, 315, 5, 22, 14,11779, 19, 24, 3530, 3536, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 56, 56, 27, 27, 13, 13, 11, 8, 7, 17, 23, 1, 22, 5, 7, 6, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // Serbian/Latin/Montenegro
+ { 100, 7, 243, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8776, 8776, 8749, 8749, 2066, 2066, 255, 233, 315, 5, 22, 273,11801, 19, 24, 3530, 3545, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 53, 53, 27, 27, 13, 13, 9, 8, 7, 17, 23, 3, 57, 5, 7, 6, 6, {82,83,68}, 0, 0, 1, 6, 7 }, // Serbian/Latin/Serbia
+ { 100, 2, 27, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8829, 8829, 8883, 8883, 8655, 8655, 264, 225, 770, 5, 22, 276,11858, 19, 24, 3518, 3551, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 54, 54, 25, 25, 13, 13, 11, 8, 7, 17, 23, 2,173, 5, 7, 6, 19, {66,65,77}, 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Bosnia And Herzegowina
+ { 100, 2, 242, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8829, 8829, 8628, 8628, 8655, 8655, 264, 225, 770, 5, 22, 14,12031, 19, 24, 3518, 3570, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 54, 54, 27, 27, 13, 13, 11, 8, 7, 17, 23, 1, 22, 5, 7, 6, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Montenegro
+ { 100, 2, 257, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8577, 8577, 8628, 8628, 8655, 8655, 235, 225, 770, 5, 22, 14,12031, 19, 24, 3518, 3579, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 51, 51, 27, 27, 13, 13, 9, 8, 7, 17, 23, 1, 22, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Kosovo
+ { 100, 7, 257, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 12, 12, 1020, 1040, 0, 0, 8776, 8776, 8749, 8749, 2066, 2066, 255, 233, 315, 5, 22, 14,11779, 19, 24, 3530, 3585, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 53, 53, 27, 27, 13, 13, 9, 8, 7, 17, 23, 1, 22, 5, 7, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Serbian/Latin/Kosovo
+ { 101, 2, 81, 0, 0, 622, 622, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 1047, 166, 0, 0, 8908, 8968, 9028, 9055, 9082, 9082, 275, 241, 0, 5, 22, 215,12053, 8, 0, 3591, 3595, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 10, 5, 60, 60, 27, 27, 13, 13, 15, 15, 4, 17, 23, 1, 16, 5, 0, 4, 11, {71,69,76}, 2, 1, 1, 6, 7 }, // Ossetic/Cyrillic/Georgia
+ { 101, 2, 178, 0, 0, 622, 622, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 1047, 166, 0, 0, 8908, 8968, 9028, 9055, 9082, 9082, 275, 241, 0, 5, 22, 121,12069, 8, 0, 3591, 3606, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 10, 5, 60, 60, 27, 27, 13, 13, 15, 15, 4, 17, 23, 1, 16, 5, 0, 4, 6, {82,85,66}, 2, 1, 1, 6, 7 }, // Ossetic/Cyrillic/Russia
+ { 102, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Southern Sotho/Latin/South Africa
+ { 103, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Tswana/Latin/South Africa
+ { 104, 7, 240, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 11, 11, 13, 13, 53, 70, 0, 0, 9095, 9095, 9149, 9149, 9176, 9176, 0, 0, 0, 5, 22, 156,12085, 4, 13, 3612, 1780, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 15, 4, 6, 8, 8, {85,83,68}, 2, 1, 7, 6, 7 }, // Shona/Latin/Zimbabwe
+ { 105, 1, 163, 0, 0, 631, 639, 53, 19, 20, 21, 23, 24, 26, 28, 10, 11, 12, 13, 53, 70, 10, 22, 9189, 9189, 9189, 9189, 9223, 9223, 290, 256, 777, 783, 22, 170,12100, 19, 0, 3620, 3624, 6, 6, 8, 7, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 34, 34, 34, 34, 30, 30, 11, 11, 6, 61, 23, 2, 42, 5, 0, 4, 7, {80,75,82}, 2, 0, 7, 6, 7 }, // Sindhi/Arabic/Pakistan
+ { 106, 32, 198, 0, 0, 646, 655, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 166, 166, 9253, 9253, 9314, 9314, 9352, 9352, 301, 267, 844, 849, 22, 278,12142, 4, 13, 3631, 3636, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 38, 38, 18, 18, 5, 4, 5, 42, 23, 3, 57, 4, 6, 5, 11, {76,75,82}, 2, 1, 1, 6, 7 }, // Sinhala/Sinhala/Sri Lanka
+ { 107, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Swati/Latin/South Africa
+ { 108, 7, 191, 0, 0, 183, 663, 6, 1, 14, 2, 3, 4, 5, 6, 40, 10, 46, 12, 461, 1070, 1, 1, 9370, 9370, 9421, 9421, 9441, 9441, 0, 0, 322, 5, 22, 14,12199, 19, 24, 3647, 3657, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 9, 4, 51, 51, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 25, 5, 7, 10, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // Slovak/Latin/Slovakia
+ { 109, 7, 192, 0, 0, 670, 670, 6, 1, 0, 2, 3, 38, 5, 6, 40, 10, 46, 12, 1020, 440, 0, 0, 9454, 9454, 9505, 9505, 9539, 9539, 60, 271, 50, 5, 22, 14,12224, 19, 24, 3666, 3677, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 9, 10, 5, 51, 51, 34, 34, 13, 13, 4, 4, 4, 17, 23, 1, 27, 5, 7, 11, 9, {69,85,82}, 2, 1, 1, 6, 7 }, // Slovenian/Latin/Slovenia
+ { 110, 7, 194, 0, 0, 678, 678, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1080, 45, 10, 22, 9552, 9552, 9598, 9598, 9629, 9629, 306, 275, 891, 897, 22, 92,12251, 4, 13, 3686, 3694, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 12, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 1, 20, 4, 6, 8, 10, {83,79,83}, 0, 0, 1, 6, 7 }, // Somali/Latin/Somalia
+ { 110, 7, 59, 0, 0, 678, 678, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1080, 45, 10, 22, 9552, 9552, 9598, 9598, 9629, 9629, 306, 275, 891, 897, 22, 36,12271, 4, 13, 3686, 3704, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 12, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 3, 49, 4, 6, 8, 7, {68,74,70}, 0, 0, 6, 6, 7 }, // Somali/Latin/Djibouti
+ { 110, 7, 69, 0, 0, 678, 678, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1080, 45, 10, 22, 9552, 9552, 9598, 9598, 9629, 9629, 306, 275, 891, 897, 22, 0,12320, 4, 13, 3686, 3711, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 12, 7, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 2, 51, 4, 6, 8, 8, {69,84,66}, 2, 1, 7, 6, 7 }, // Somali/Latin/Ethiopia
+ { 110, 7, 111, 0, 0, 678, 678, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1080, 45, 0, 0, 9552, 9552, 9598, 9598, 9629, 9629, 306, 275, 891, 897, 22, 2,12371, 4, 13, 3686, 1161, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 10, 5, 46, 46, 31, 31, 14, 14, 2, 2, 6, 17, 23, 3, 51, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Somali/Latin/Kenya
+ { 111, 7, 197, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 259, 55, 1, 9643, 9643, 9695, 9695, 8153, 8153, 53, 50, 0, 5, 22, 14, 3032, 19, 0, 3719, 2381, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 19, 5, 0, 17, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Spain
+ { 111, 7, 10, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 3015, 53, 50, 0, 5, 22, 6,12422, 8, 37, 3719, 3736, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 50, 5, 7, 7, 9, {65,82,83}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Argentina
+ { 111, 7, 22, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 64, 61, 0, 5, 22, 6,12472, 4, 0, 3719, 3745, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 4, 4, 5, 17, 23, 1, 51, 4, 0, 7, 6, {66,90,68}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Belize
+ { 111, 7, 26, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 267,12523, 4, 0, 3719, 3388, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 2, 34, 4, 0, 7, 7, {66,79,66}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Bolivia
+ { 111, 7, 30, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 64, 61, 0, 5, 22, 5,12557, 4, 0, 3719, 3211, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 4, 4, 5, 17, 23, 2, 51, 4, 0, 7, 6, {66,82,76}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Brazil
+ { 111, 7, 43, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 347, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 6,12608, 4, 0, 3719, 3751, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 44, 4, 0, 7, 5, {67,76,80}, 0, 0, 1, 6, 7 }, // Spanish/Latin/Chile
+ { 111, 7, 47, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 46, 10, 22, 9643, 9643, 9695, 9695, 4656, 3015, 53, 50, 0, 5, 22, 6,12652, 4, 0, 3719, 3756, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 53, 4, 0, 7, 8, {67,79,80}, 2, 0, 7, 6, 7 }, // Spanish/Latin/Colombia
+ { 111, 7, 52, 0, 0, 687, 687, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 281,12705, 4, 0, 3719, 3764, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 66, 4, 0, 7, 10, {67,82,67}, 2, 0, 1, 6, 7 }, // Spanish/Latin/Costa Rica
+ { 111, 7, 55, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 64, 61, 0, 5, 22, 6,12771, 4, 0, 3719, 3774, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 4, 4, 5, 17, 23, 1, 41, 4, 0, 7, 4, {67,85,80}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Cuba
+ { 111, 7, 61, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 10, 22, 9643, 9643, 9695, 9695, 3015, 3015, 53, 50, 0, 5, 22, 282,12812, 4, 13, 3719, 3778, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 3, 53, 4, 6, 7, 20, {68,79,80}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Dominican Republic
+ { 111, 7, 63, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 6,12865, 4, 0, 3719, 3395, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 69, 4, 0, 7, 7, {85,83,68}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Ecuador
+ { 111, 7, 65, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 6,12865, 4, 0, 3719, 3798, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 69, 4, 0, 7, 11, {85,83,68}, 2, 1, 7, 6, 7 }, // Spanish/Latin/El Salvador
+ { 111, 7, 66, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 259, 55, 1, 9643, 9643, 9695, 9695, 8153, 8153, 53, 50, 0, 5, 22, 32,12934, 19, 0, 3719, 3809, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 4, 91, 5, 0, 7, 17, {88,65,70}, 0, 0, 1, 6, 7 }, // Spanish/Latin/Equatorial Guinea
+ { 111, 7, 90, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 46, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 285,13025, 4, 0, 3719, 3826, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 29, 4, 0, 7, 9, {71,84,81}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Guatemala
+ { 111, 7, 96, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1099, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 7,13054, 4, 0, 3719, 3835, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 59, 4, 0, 7, 8, {72,78,76}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Honduras
+ { 111, 7, 139, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 45, 1, 1, 9643, 9643, 9695, 9695, 3015, 3015, 53, 50, 0, 5, 22, 6,13113, 4, 0, 3843, 3860, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 9, 4, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 47, 4, 0, 17, 6, {77,88,78}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Mexico
+ { 111, 7, 155, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 286,13160, 4, 0, 3719, 3866, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 2, 68, 4, 0, 7, 9, {78,73,79}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Nicaragua
+ { 111, 7, 166, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 1126, 10, 22, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 288,13228, 4, 0, 3719, 3875, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 3, 53, 4, 0, 7, 6, {80,65,66}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Panama
+ { 111, 7, 168, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 291,13281, 4, 0, 3719, 3881, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 3, 60, 4, 0, 7, 8, {80,89,71}, 0, 0, 7, 6, 7 }, // Spanish/Latin/Paraguay
+ { 111, 7, 169, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 46, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 265,13341, 4, 0, 3719, 3384, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 7, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 2, 42, 4, 0, 7, 4, {80,69,78}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Peru
+ { 111, 7, 170, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 259, 10, 22, 9643, 9643, 9695, 9695, 8153, 8153, 53, 50, 0, 5, 22, 173,13383, 19, 0, 3719, 3889, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 47, 5, 0, 7, 9, {80,72,80}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Philippines
+ { 111, 7, 174, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 1126, 10, 22, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 6,12865, 4, 0, 3719, 1416, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 69, 4, 0, 7, 11, {85,83,68}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Puerto Rico
+ { 111, 7, 225, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 398, 10, 22, 9643, 9643, 9695, 9695, 3015, 3015, 53, 50, 0, 5, 22, 6,12865, 4, 0, 3719, 3898, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 69, 4, 0, 7, 14, {85,83,68}, 2, 1, 7, 6, 7 }, // Spanish/Latin/United States
+ { 111, 7, 227, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 6,13430, 8, 37, 3719, 3912, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 47, 5, 7, 7, 7, {85,89,85}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Uruguay
+ { 111, 7, 231, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 10, 22, 9643, 9643, 9695, 9695, 3015, 4656, 53, 50, 0, 5, 22, 294,13477, 4, 0, 3719, 3919, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 12, 7, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 4, 57, 4, 0, 7, 9, {86,69,83}, 2, 1, 7, 6, 7 }, // Spanish/Latin/Venezuela
+ { 111, 7, 238, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 259, 55, 1, 9643, 9643, 9695, 9695, 8153, 8153, 53, 50, 0, 5, 22, 14, 3032, 19, 0, 3719, 3928, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 19, 5, 0, 7, 8, {69,85,82}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Canary Islands
+ { 111, 7, 246, 0, 0, 687, 687, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 259, 0, 0, 9643, 9643, 9695, 9695, 3015, 4656, 64, 61, 0, 5, 22, 0, 0, 4, 0, 3936, 3959, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 10, 5, 52, 52, 34, 34, 13, 13, 4, 4, 5, 17, 23, 0, 0, 4, 0, 23, 13, {0,0,0}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Latin America
+ { 111, 7, 250, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 610, 259, 55, 1, 9643, 9643, 9695, 9695, 8153, 8153, 53, 50, 0, 5, 22, 14, 3032, 19, 0, 3719, 3972, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 6, 11, 4, 52, 52, 34, 34, 13, 13, 5, 5, 5, 17, 23, 1, 19, 5, 0, 7, 15, {69,85,82}, 2, 1, 1, 6, 7 }, // Spanish/Latin/Ceuta And Melilla
+ { 112, 7, 101, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 222, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {73,68,82}, 2, 0, 7, 6, 7 }, // Sundanese/Latin/Indonesia
+ { 113, 7, 210, 0, 0, 694, 694, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 9729, 9729, 9729, 9729, 83, 83, 0, 0, 619, 914, 22, 182,13534, 8, 0, 3987, 1585, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 66, 5, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Swahili/Latin/Tanzania
+ { 113, 7, 49, 0, 0, 694, 694, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 9729, 9729, 9729, 9729, 83, 83, 0, 0, 619, 914, 22, 32,13600, 8, 0, 3987, 3996, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 2, 54, 5, 0, 9, 32, {67,68,70}, 2, 1, 1, 6, 7 }, // Swahili/Latin/Congo Kinshasa
+ { 113, 7, 111, 0, 0, 694, 694, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 9729, 9729, 9729, 9729, 83, 83, 0, 0, 619, 914, 22, 2,13654, 8, 0, 3987, 1161, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 57, 5, 0, 9, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Swahili/Latin/Kenya
+ { 113, 7, 221, 0, 0, 694, 694, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 9729, 9729, 9729, 9729, 83, 83, 0, 0, 619, 914, 22, 187,13711, 8, 0, 3987, 1650, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 59, 59, 13, 13, 2, 2, 5, 51, 23, 3, 60, 5, 0, 9, 6, {85,71,88}, 0, 0, 1, 7, 7 }, // Swahili/Latin/Uganda
+ { 114, 7, 205, 0, 0, 702, 702, 6, 1, 14, 2, 3, 38, 5, 47, 11, 11, 13, 13, 97, 70, 346, 0, 9788, 9788, 9837, 9837, 2284, 2284, 308, 277, 0, 5, 22, 145,13771, 19, 0, 4028, 4035, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 16, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 2, 44, 5, 0, 7, 7, {83,69,75}, 2, 0, 1, 6, 7 }, // Swedish/Latin/Sweden
+ { 114, 7, 73, 0, 0, 702, 702, 6, 1, 14, 2, 3, 38, 5, 47, 11, 11, 13, 13, 97, 70, 346, 0, 9788, 9788, 9837, 9837, 2284, 2284, 308, 277, 0, 5, 22, 14, 3032, 19, 0, 4028, 1063, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 16, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 7, 7, {69,85,82}, 2, 1, 1, 6, 7 }, // Swedish/Latin/Finland
+ { 114, 7, 248, 0, 0, 702, 702, 6, 1, 14, 2, 3, 38, 5, 47, 11, 11, 13, 13, 97, 70, 346, 0, 9788, 9788, 9837, 9837, 2284, 2284, 308, 277, 0, 5, 22, 14, 3032, 19, 0, 4028, 4042, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 16, 5, 49, 49, 28, 28, 13, 13, 2, 2, 4, 17, 23, 1, 18, 5, 0, 7, 5, {69,85,82}, 2, 1, 1, 6, 7 }, // Swedish/Latin/Aland Islands
+ { 115, 7, 106, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Sardinian/Latin/Italy
+ { 116, 2, 209, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 527, 45, 0, 0, 9865, 9865, 9919, 9919, 9946, 9946, 0, 0, 0, 5, 22, 298,13815, 19, 0, 4047, 4053, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 18, 5, 0, 6, 10, {84,74,83}, 2, 1, 1, 6, 7 }, // Tajik/Cyrillic/Tajikistan
+ { 117, 27, 100, 0, 0, 711, 711, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 259, 362, 315, 9959, 9959,10007,10007,10045,10045, 310, 279, 965, 5, 22, 119,13833, 4, 13, 4063, 4068, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 1, 48, 4, 6, 5, 7, {73,78,82}, 2, 1, 7, 7, 7 }, // Tamil/Tamil/India
+ { 117, 27, 130, 0, 0, 711, 711, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 259, 362, 315, 9959, 9959,10007,10007,10045,10045, 310, 279, 965, 5, 22, 168,13881, 4, 13, 4063, 4075, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 2, 60, 4, 6, 5, 7, {77,89,82}, 2, 1, 1, 6, 7 }, // Tamil/Tamil/Malaysia
+ { 117, 27, 190, 0, 0, 711, 711, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 259, 362, 315, 9959, 9959,10007,10007,10045,10045, 310, 279, 965, 5, 22, 6,13941, 4, 13, 4063, 4082, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 1, 60, 4, 6, 5, 11, {83,71,68}, 2, 1, 7, 6, 7 }, // Tamil/Tamil/Singapore
+ { 117, 27, 198, 0, 0, 711, 711, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 259, 0, 0, 9959, 9959,10007,10007,10045,10045, 310, 279, 965, 5, 22, 302,14001, 4, 13, 4063, 4093, 6, 6, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 10, 5, 48, 48, 38, 38, 19, 19, 8, 8, 7, 17, 23, 3, 48, 4, 6, 5, 6, {76,75,82}, 2, 1, 1, 6, 7 }, // Tamil/Tamil/Sri Lanka
+ { 118, 2, 178, 0, 0, 724, 724, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1134, 501, 1, 1,10064,10064,10119,10119,10154,10154, 0, 0, 0, 5, 22, 121,14049, 19, 0, 4099, 3454, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 9, 4, 55, 55, 35, 35, 13, 13, 2, 2, 4, 17, 23, 1, 20, 5, 0, 5, 6, {82,85,66}, 2, 1, 1, 6, 7 }, // Tatar/Cyrillic/Russia
+ { 119, 28, 100, 0, 0, 733, 733, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1157, 347, 10, 22,10167,10167,10226,10226,10257,10257, 0, 0, 972, 979, 22, 119,14069, 4, 13, 4104, 4110, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 59, 59, 31, 31, 17, 17, 2, 2, 7, 29, 23, 1, 25, 4, 6, 6, 8, {73,78,82}, 2, 1, 7, 7, 7 }, // Telugu/Telugu/India
+ { 120, 30, 211, 120, 120, 744, 752, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1175, 259, 374, 0,10274,10274,10341,10341,10363,10363, 318, 287, 1008, 5, 22, 305,14094, 4, 13, 4118, 4118, 5, 5, 8, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 6, 28, 5, 67, 67, 22, 22, 15, 15, 10, 10, 4, 17, 23, 1, 15, 4, 6, 3, 3, {84,72,66}, 2, 1, 7, 6, 7 }, // Thai/Thai/Thailand
+ { 121, 31, 44, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1194, 70, 10, 22,10378,10378,10456,10456,10506,10506, 328, 297, 0, 5, 22, 130,14109, 8, 0, 4121, 4129, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 12, 7, 78, 78, 50, 50, 26, 26, 7, 8, 4, 17, 23, 1, 6, 5, 0, 8, 6, {67,78,89}, 2, 1, 7, 6, 7 }, // Tibetan/Tibetan/China
+ { 121, 31, 100, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1194, 70, 10, 22,10378,10378,10456,10456,10506,10506, 328, 297, 0, 5, 22, 119,14115, 8, 0, 4121, 4135, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 12, 7, 78, 78, 50, 50, 26, 26, 7, 8, 4, 17, 23, 1, 12, 5, 0, 8, 7, {73,78,82}, 2, 1, 7, 7, 7 }, // Tibetan/Tibetan/India
+ { 122, 14, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1217, 45, 10, 22,10532,10532,10560,10560,10580,10593, 335, 305, 0, 5, 22, 0, 254, 4, 0, 4142, 92, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 12, 7, 28, 28, 20, 20, 13, 13, 7, 7, 4, 17, 23, 2, 9, 4, 0, 4, 5, {69,84,66}, 2, 1, 7, 6, 7 }, // Tigrinya/Ethiopic/Ethiopia
+ { 122, 14, 67, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 12, 13, 10, 11, 1217, 45, 10, 22,10532,10532,10560,10560,10593,10593, 335, 305, 0, 5, 22, 39, 0, 4, 0, 4142, 4146, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 8, 12, 7, 28, 28, 20, 20, 13, 13, 7, 7, 4, 17, 23, 3, 0, 4, 0, 4, 4, {69,82,78}, 2, 1, 1, 6, 7 }, // Tigrinya/Ethiopic/Eritrea
+ { 123, 7, 214, 759, 759, 759, 759, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 259, 10, 22,10606,10606,10665,10665,10693,10693, 342, 312, 1012, 1017, 1076, 185,14127, 8, 0, 4150, 1600, 8, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 12, 7, 59, 59, 28, 28, 13, 13, 10, 6, 5, 59, 65, 2, 40, 5, 0, 13, 5, {84,79,80}, 2, 1, 1, 6, 7 }, // Tongan/Latin/Tonga
+ { 124, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Tsonga/Latin/South Africa
+ { 125, 7, 217, 0, 0, 767, 767, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1240, 502, 0, 0,10706,10706,10759,10759,10786,10786, 352, 318, 195, 5, 22, 236,14167, 4, 13, 4163, 4169, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 10, 5, 53, 53, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 39, 4, 6, 6, 7, {84,82,89}, 2, 1, 1, 6, 7 }, // Turkish/Latin/Turkey
+ { 125, 7, 56, 0, 0, 767, 767, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1240, 502, 10, 22,10706,10706,10759,10759,10786,10786, 352, 318, 195, 5, 22, 14, 8263, 4, 13, 4163, 4176, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 12, 7, 53, 53, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 18, 4, 6, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Turkish/Latin/Cyprus
+ { 126, 7, 218, 0, 0, 775, 775, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 10, 11, 1240, 501, 0, 0,10799,10852,10905,10932,10959,10959, 354, 320, 1141, 5, 22, 306,14206, 19, 0, 4182, 4194, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 53, 53, 27, 27, 13, 13, 13, 14, 4, 17, 23, 3, 48, 5, 0, 12, 12, {84,77,84}, 2, 1, 1, 6, 7 }, // Turkmen/Latin/Turkmenistan
+ { 128, 1, 44, 0, 0, 198, 208, 6, 0, 1, 2, 3, 4, 5, 9, 16, 15, 18, 17, 1256, 70, 10, 22,10972,10972,11026,11026,11046,11046, 367, 334, 0, 5, 22, 227,14254, 4, 13, 4206, 4214, 6, 6, 10, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 54, 54, 20, 20, 13, 13, 12, 12, 4, 17, 23, 1, 39, 4, 6, 8, 5, {67,78,89}, 2, 1, 7, 6, 7 }, // Uighur/Arabic/China
+ { 129, 2, 222, 0, 0, 136, 136, 6, 1, 14, 2, 3, 4, 5, 63, 15, 16, 40, 10, 1273, 166, 0, 0,11059,11059, 1466, 1466,11114,11114, 379, 346, 1145, 668, 22, 272,14293, 19, 0, 4219, 4229, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 8, 10, 5, 55, 55, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 48, 5, 0, 10, 7, {85,65,72}, 2, 1, 1, 6, 7 }, // Ukrainian/Cyrillic/Ukraine
+ { 130, 1, 163, 560, 560, 783, 793, 6, 0, 1, 2, 3, 33, 35, 9, 11, 10, 13, 12, 1295, 259, 10, 22,11127,11127,11127,11127, 83, 83, 0, 0, 1150, 1154, 22, 170,14341, 4, 13, 4236, 3170, 6, 6, 10, 9, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 18, 6, 12, 7, 35, 35, 35, 35, 13, 13, 2, 2, 4, 20, 23, 2, 48, 4, 6, 4, 7, {80,75,82}, 2, 0, 7, 6, 7 }, // Urdu/Arabic/Pakistan
+ { 130, 1, 100, 560, 560, 783, 793, 6, 19, 20, 2, 52, 33, 53, 56, 11, 10, 13, 12, 1295, 259, 10, 22,11127,11127,11127,11127, 83, 83, 0, 0, 1150, 1154, 22, 119,14389, 4, 13, 4236, 4240, 6, 6, 10, 9, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 18, 6, 12, 7, 35, 35, 35, 35, 13, 13, 2, 2, 4, 20, 23, 1, 41, 4, 6, 4, 5, {73,78,82}, 2, 1, 7, 7, 7 }, // Urdu/Arabic/India
+ { 131, 7, 228, 0, 0, 802, 802, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 13, 12, 1313, 45, 55, 0,11162,11162,11222,11222,11253,11253, 381, 348, 195, 5, 22, 309,14430, 19, 0, 4245, 4251, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 11, 5, 60, 60, 31, 31, 13, 13, 2, 2, 4, 17, 23, 4, 57, 5, 0, 6, 11, {85,90,83}, 2, 0, 1, 6, 7 }, // Uzbek/Latin/Uzbekistan
+ { 131, 1, 1, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 1331, 390, 55, 1, 7574, 7574,11266,11266, 83, 83, 0, 0, 0, 5, 22, 252, 9961, 19, 0, 4262, 3161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 33, 8, 11, 4, 48, 48, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 6, 5, 0, 6, 9, {65,70,78}, 0, 0, 6, 4, 5 }, // Uzbek/Arabic/Afghanistan
+ { 131, 2, 228, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 637, 45, 54, 0,11286,11286,11338,11338,11365,11365, 383, 350, 0, 5, 22, 313,14487, 19, 0, 4268, 4275, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 12, 5, 52, 52, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 48, 5, 0, 7, 10, {85,90,83}, 2, 0, 1, 6, 7 }, // Uzbek/Cyrillic/Uzbekistan
+ { 132, 7, 232, 0, 0, 810, 810, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 174, 45, 0, 0,11378,11378,11432,11432,11464,11464, 385, 352, 0, 5, 22, 316,14535, 19, 0, 4285, 4295, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 54, 54, 32, 32, 20, 20, 2, 2, 4, 17, 23, 1, 32, 5, 0, 10, 8, {86,78,68}, 0, 0, 1, 6, 7 }, // Vietnamese/Latin/Vietnam
+ { 133, 7, 260, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1364, 70, 0, 0,11484,11484,11526,11546,11573,11573, 0, 0, 0, 5, 22, 0, 0, 8, 0, 4303, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 42, 42, 20, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 7, 0, {0,0,0}, 2, 1, 1, 6, 7 }, // Volapuk/Latin/World
+ { 134, 7, 224, 0, 0, 818, 829, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,11586,11586,11662,11690,11719,11719, 387, 354, 1174, 5, 22, 117,14567, 4, 13, 4310, 4317, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 76, 76, 28, 29, 14, 14, 2, 2, 7, 17, 23, 1, 90, 4, 6, 7, 16, {71,66,80}, 2, 1, 1, 6, 7 }, // Welsh/Latin/United Kingdom
+ { 135, 7, 187, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1387, 511, 0, 0,11733,11733,11782,11782,11782,11782, 389, 356, 0, 5, 22, 33,14657, 8, 0, 4333, 4338, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 49, 49, 27, 27, 27, 27, 3, 3, 4, 17, 23, 3, 64, 5, 0, 5, 8, {88,79,70}, 0, 0, 1, 6, 7 }, // Wolof/Latin/Senegal
+ { 136, 7, 195, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 12, 13, 10, 11, 53, 70, 0, 0,11809,11809,11869,11869, 83, 83, 0, 0, 0, 5, 22, 5,14721, 4, 0, 4346, 4354, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 60, 60, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 78, 4, 0, 8, 15, {90,65,82}, 2, 1, 7, 6, 7 }, // Xhosa/Latin/South Africa
+ { 137, 18, 260, 0, 0, 839, 839, 6, 0, 1, 2, 3, 4, 5, 9, 11, 11, 13, 13, 1404, 45, 0, 0,11896,11896,11896,11896, 83, 83, 392, 359, 0, 5, 22, 0, 0, 8, 0, 4369, 4375, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 8, 10, 5, 53, 53, 53, 53, 13, 13, 11, 10, 4, 17, 23, 0, 0, 5, 0, 6, 5, {0,0,0}, 2, 1, 1, 6, 7 }, // Yiddish/Hebrew/World
+ { 138, 7, 157, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1423, 398, 0, 1,11949,11992,12060,12060,12092,12092, 403, 369, 0, 5, 22, 172,14799, 4, 13, 4380, 4390, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 3, 43, 68, 32, 32, 13, 13, 5, 5, 4, 17, 23, 1, 48, 4, 6, 10, 19, {78,71,78}, 2, 1, 1, 6, 7 }, // Yoruba/Latin/Nigeria
+ { 138, 7, 23, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1423, 398, 0, 1,12105,12148,12216,12216,12248,12248, 408, 374, 0, 5, 22, 33,14847, 4, 13, 4380, 4409, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 3, 43, 68, 32, 32, 13, 13, 5, 5, 4, 17, 23, 3, 27, 4, 6, 10, 16, {88,79,70}, 0, 0, 1, 6, 7 }, // Yoruba/Latin/Benin
+ { 140, 7, 195, 0, 0, 848, 857, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 0, 0,12261,12261,12334,12334,12361,12361, 0, 0, 0, 5, 22, 5,14874, 4, 13, 4425, 4432, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 10, 5, 73, 73, 27, 27, 13, 13, 2, 2, 5, 17, 23, 1, 66, 4, 6, 7, 17, {90,65,82}, 2, 1, 7, 6, 7 }, // Zulu/Latin/South Africa
+ { 141, 7, 161, 0, 0, 190, 190, 6, 1, 14, 2, 3, 38, 5, 9, 15, 16, 12, 13, 461, 501, 346, 0,12374,12374,12424,12451, 2284, 2284, 413, 379, 0, 5, 22, 145, 9765, 19, 0, 4449, 4456, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 16, 5, 50, 50, 27, 27, 13, 13, 9, 11, 4, 17, 23, 2, 43, 5, 0, 7, 5, {78,79,75}, 2, 0, 1, 6, 7 }, // Norwegian Nynorsk/Latin/Norway
+ { 142, 7, 27, 0, 0, 161, 161, 6, 1, 0, 2, 3, 4, 5, 9, 40, 11, 12, 13, 420, 1439, 0, 0, 1982, 1982, 2039, 2039, 2066, 2079, 422, 390, 315, 5, 22, 141,14940, 19, 0, 4461, 629, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 11, 10, 5, 57, 57, 27, 27, 13, 13, 10, 7, 7, 17, 23, 2,169, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7 }, // Bosnian/Latin/Bosnia And Herzegowina
+ { 142, 2, 27, 0, 0, 113, 113, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 1020, 1040, 0, 0,12478,12478,12533,12533, 8655, 8655, 264, 397, 0, 5, 22, 276,15109, 19, 0, 4469, 3551, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 7, 10, 5, 55, 55, 27, 27, 13, 13, 11, 13, 4, 17, 23, 2,151, 5, 0, 8, 19, {66,65,77}, 2, 1, 1, 6, 7 }, // Bosnian/Cyrillic/Bosnia And Herzegowina
+ { 143, 29, 131, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {77,86,82}, 2, 1, 5, 6, 7 }, // Divehi/Thaana/Maldives
+ { 144, 7, 251, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 80, 45, 0, 0,12560,12560,12616,12616, 83, 83, 64, 61, 0, 5, 22, 117, 0, 4, 0, 4477, 4482, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 8, 10, 5, 56, 56, 29, 29, 13, 13, 4, 4, 4, 17, 23, 1, 0, 4, 0, 5, 12, {71,66,80}, 2, 1, 1, 6, 7 }, // Manx/Latin/Isle Of Man
+ { 145, 7, 224, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 45, 0, 0,12645,12645,12705,12705, 83, 83, 64, 61, 0, 5, 22, 117, 0, 4, 0, 4494, 4502, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 10, 10, 5, 60, 60, 27, 27, 13, 13, 4, 4, 4, 17, 23, 1, 0, 4, 0, 8, 14, {71,66,80}, 2, 1, 1, 6, 7 }, // Cornish/Latin/United Kingdom
+ { 146, 7, 83, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1450, 547, 10, 22,12732,12732,12780,12780,12807,12807, 432, 410, 0, 5, 22, 163,15260, 4, 0, 4516, 4520, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 12, 7, 48, 48, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 10, 4, 0, 4, 5, {71,72,83}, 2, 1, 1, 6, 7 }, // Akan/Latin/Ghana
+ { 147, 13, 100, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 192, 10, 22,12820,12820,12820,12820,12868,12868, 0, 0, 1181, 5, 22, 119,15270, 4, 13, 4525, 2599, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 6, 12, 7, 48, 48, 48, 48, 19, 19, 2, 2, 4, 17, 23, 1, 30, 4, 6, 6, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Konkani/Devanagari/India
+ { 148, 7, 83, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {71,72,83}, 2, 1, 1, 6, 7 }, // Ga/Latin/Ghana
+ { 149, 7, 157, 0, 0, 865, 694, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 0, 0,12887,12887,12940,12940, 83, 83, 434, 412, 0, 5, 22, 172,15300, 4, 13, 4531, 4541, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 10, 5, 53, 53, 28, 28, 13, 13, 7, 7, 4, 17, 23, 1, 5, 4, 6, 10, 8, {78,71,78}, 2, 1, 1, 6, 7 }, // Igbo/Latin/Nigeria
+ { 150, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,12968,12968,13041,13041,13068,13068, 441, 419, 0, 5, 22, 2,15305, 4, 13, 4549, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 73, 73, 27, 27, 13, 13, 9, 7, 4, 17, 23, 3, 16, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Kamba/Latin/Kenya
+ { 151, 33, 103, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {73,81,68}, 0, 0, 6, 5, 6 }, // Syriac/Syriac/Iraq
+ { 152, 14, 67, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,82,78}, 2, 1, 1, 6, 7 }, // Blin/Ethiopic/Eritrea
+ { 153, 14, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7 }, // Geez/Ethiopic/Ethiopia
+ { 155, 7, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7 }, // Sidamo/Latin/Ethiopia
+ { 156, 7, 157, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 172, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7 }, // Atsam/Latin/Nigeria
+ { 157, 14, 67, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,82,78}, 2, 1, 1, 6, 7 }, // Tigre/Ethiopic/Eritrea
+ { 158, 7, 157, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 172, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7 }, // Jju/Latin/Nigeria
+ { 159, 7, 106, 0, 0, 252, 252, 6, 1, 0, 2, 3, 4, 5, 9, 12, 13, 10, 11, 1468, 45, 0, 0,13081,13081,13130,13130, 3015, 3015, 53, 50, 0, 5, 22, 14, 3032, 8, 0, 4556, 2453, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 19, 5, 0, 6, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Friulian/Latin/Italy
+ { 160, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Venda/Latin/South Africa
+ { 161, 7, 83, 0, 0, 874, 885, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1495, 521, 402, 402,13157,13157,13200,13200,13227,13227, 450, 426, 0, 5, 22, 163,15321, 4, 13, 4562, 4568, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 17, 12, 43, 43, 27, 27, 13, 13, 3, 5, 4, 17, 23, 3, 36, 4, 6, 6, 12, {71,72,83}, 2, 1, 1, 6, 7 }, // Ewe/Latin/Ghana
+ { 161, 7, 212, 0, 0, 874, 885, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1495, 521, 0, 0,13157,13157,13200,13200,13227,13227, 450, 426, 0, 5, 22, 33,15357, 4, 13, 4562, 4580, 6, 6, 11, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 6, 10, 5, 43, 43, 27, 27, 13, 13, 3, 5, 4, 17, 23, 3,105, 4, 6, 6, 11, {88,79,70}, 0, 0, 1, 6, 7 }, // Ewe/Latin/Togo
+ { 162, 14, 69, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,84,66}, 2, 1, 7, 6, 7 }, // Walamo/Ethiopic/Ethiopia
+ { 163, 7, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 259, 10, 22,13240,13240,13296,13296, 83, 83, 0, 0, 0, 5, 22, 6, 0, 4, 13, 4591, 4605, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 6, 12, 7, 56, 56, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 6, 14, 19, {85,83,68}, 2, 1, 7, 6, 7 }, // Hawaiian/Latin/United States
+ { 164, 7, 157, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 172, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {78,71,78}, 2, 1, 1, 6, 7 }, // Tyap/Latin/Nigeria
+ { 165, 7, 129, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {77,87,75}, 2, 1, 1, 6, 7 }, // Nyanja/Latin/Malawi
+ { 166, 7, 170, 0, 0, 895, 904, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22,13316,13316,13370,13370,13370,13370, 0, 0, 0, 5, 22, 173,15462, 4, 13, 4624, 4632, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 54, 54, 27, 27, 27, 27, 2, 2, 5, 17, 23, 1, 57, 4, 6, 8, 9, {80,72,80}, 2, 1, 7, 6, 7 }, // Filipino/Latin/Philippines
+ { 167, 7, 206, 0, 0, 267, 267, 6, 0, 13, 2, 3, 38, 5, 9, 15, 16, 17, 18, 420, 166, 0, 0,13397,13397,13459,13459, 3613, 3613, 453, 431, 0, 5, 22, 208,15519, 19, 0, 4641, 4641, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 3, 54, 5, 0, 16, 7, {67,72,70}, 2, 0, 1, 6, 7 }, // Swiss German/Latin/Switzerland
+ { 167, 7, 74, 0, 0, 267, 267, 6, 0, 13, 2, 3, 38, 5, 9, 15, 16, 17, 18, 420, 166, 0, 0,13397,13397,13459,13459, 3613, 3613, 453, 431, 0, 5, 22, 14, 8263, 19, 0, 4641, 4657, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 1, 18, 5, 0, 16, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // Swiss German/Latin/France
+ { 167, 7, 123, 0, 0, 267, 267, 6, 0, 13, 2, 3, 38, 5, 9, 15, 16, 17, 18, 420, 166, 0, 0,13397,13397,13459,13459, 3613, 3613, 453, 431, 0, 5, 22, 208,15519, 19, 0, 4641, 4667, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 62, 62, 27, 27, 13, 13, 12, 11, 4, 17, 23, 3, 54, 5, 0, 16, 13, {67,72,70}, 2, 0, 1, 6, 7 }, // Swiss German/Latin/Liechtenstein
+ { 168, 34, 44, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 10, 22,13486,13486,13513,13513,13533,13533, 465, 442, 0, 5, 22, 130, 0, 8, 0, 4680, 4683, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 3, 2, {67,78,89}, 2, 1, 7, 6, 7 }, // Sichuan Yi/Yi/China
+ { 169, 7, 121, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {76,82,68}, 2, 1, 1, 6, 7 }, // Kpelle/Latin/Liberia
+ { 170, 7, 82, 0, 0, 459, 459, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 1518, 167, 419, 438,13546,13546,13610,13610, 3613, 3613, 0, 0, 0, 5, 22, 14,15573, 19, 0, 4685, 4699, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 7, 19, 10, 64, 64, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 14, 5, 0, 14, 11, {69,85,82}, 2, 1, 1, 6, 7 }, // Low German/Latin/Germany
+ { 170, 7, 151, 0, 0, 459, 459, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 1518, 167, 419, 438,13546,13546,13610,13610, 3613, 3613, 0, 0, 0, 5, 22, 14,15573, 19, 0, 4685, 4710, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 7, 19, 10, 64, 64, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 14, 5, 0, 14, 12, {69,85,82}, 2, 1, 1, 6, 7 }, // Low German/Latin/Netherlands
+ { 171, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // South Ndebele/Latin/South Africa
+ { 172, 7, 195, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 5, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {90,65,82}, 2, 1, 7, 6, 7 }, // Northern Sotho/Latin/South Africa
+ { 173, 7, 161, 0, 0, 226, 226, 6, 1, 14, 2, 3, 38, 5, 64, 11, 11, 13, 13, 53, 70, 0, 0,13637,13637,13711,13711,13743,13743, 467, 444, 0, 5, 22, 145,15587, 19, 0, 4722, 4737, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 74, 74, 32, 32, 13, 13, 11, 13, 4, 17, 23, 2, 62, 5, 0, 15, 5, {78,79,75}, 2, 0, 1, 6, 7 }, // Northern Sami/Latin/Norway
+ { 173, 7, 73, 0, 0, 226, 226, 6, 1, 14, 2, 3, 38, 5, 64, 11, 11, 13, 13, 97, 501, 0, 0,13756,13756,13825,13825,13845,13845, 478, 457, 0, 5, 22, 14,15649, 19, 0, 4722, 4742, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 16, 10, 10, 5, 69, 69, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 22, 5, 0, 15, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Northern Sami/Latin/Finland
+ { 173, 7, 205, 0, 0, 226, 226, 6, 1, 14, 2, 3, 38, 5, 64, 11, 11, 13, 13, 53, 70, 0, 0,13637,13637,13711,13711,13743,13743, 467, 444, 0, 5, 22, 145,15671, 19, 0, 4722, 4748, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 17, 10, 10, 5, 74, 74, 32, 32, 13, 13, 11, 13, 4, 17, 23, 2, 62, 5, 0, 15, 6, {83,69,75}, 2, 0, 1, 6, 7 }, // Northern Sami/Latin/Sweden
+ { 174, 7, 208, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 317, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {84,87,68}, 2, 0, 7, 6, 7 }, // Taroko/Latin/Taiwan
+ { 175, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,13858,13858,13919,13919,13946,13946, 480, 459, 0, 5, 22, 2,13654, 4, 13, 4754, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 6, 3, 4, 17, 23, 3, 17, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Gusii/Latin/Kenya
+ { 176, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,13959,13959,14063,14063,14090,14090, 486, 462, 0, 5, 22, 2,13654, 4, 13, 4762, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5,104,104, 27, 27, 13, 13, 10, 10, 4, 17, 23, 3, 17, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Taita/Latin/Kenya
+ { 177, 7, 187, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 33,15733, 19, 0, 4769, 4338, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 19, 5, 0, 6, 8, {88,79,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Senegal
+ { 177, 7, 34, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 33,15733, 19, 0, 4769, 4775, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 19, 5, 0, 6, 14, {88,79,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Burkina Faso
+ { 177, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 32,15752, 19, 0, 4769, 4789, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 4, 18, 5, 0, 6, 8, {88,65,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Cameroon
+ { 177, 7, 80, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 10, 22,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 162,15770, 19, 0, 4769, 4797, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 13, 5, 0, 6, 6, {71,77,68}, 2, 1, 1, 6, 7 }, // Fulah/Latin/Gambia
+ { 177, 7, 83, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 10, 22,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 163, 0, 19, 0, 4769, 4803, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 0, 5, 0, 6, 5, {71,72,83}, 2, 1, 1, 6, 7 }, // Fulah/Latin/Ghana
+ { 177, 7, 91, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 201, 0, 19, 0, 4769, 4808, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 0, 5, 0, 6, 4, {71,78,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea
+ { 177, 7, 92, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 33,15733, 19, 0, 4769, 4812, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 19, 5, 0, 6, 12, {88,79,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea Bissau
+ { 177, 7, 121, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 10, 22,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 6,15783, 19, 0, 4769, 4824, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 16, 5, 0, 6, 9, {76,82,68}, 2, 1, 1, 6, 7 }, // Fulah/Latin/Liberia
+ { 177, 7, 136, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 10, 22,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 203,15799, 19, 0, 4769, 4833, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 15, 5, 0, 6, 8, {77,82,85}, 2, 1, 1, 6, 7 }, // Fulah/Latin/Mauritania
+ { 177, 7, 156, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 33,15733, 19, 0, 4769, 4841, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 3, 19, 5, 0, 6, 6, {88,79,70}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Niger
+ { 177, 7, 157, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 172,15814, 19, 0, 4769, 4847, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 1, 16, 5, 0, 6, 9, {78,71,78}, 2, 1, 1, 6, 7 }, // Fulah/Latin/Nigeria
+ { 177, 7, 189, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 10, 22,14103,14103,14161,14161,14188,14188, 496, 472, 0, 5, 22, 7,15830, 19, 0, 4769, 4856, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 58, 58, 27, 27, 13, 13, 6, 7, 4, 17, 23, 2, 18, 5, 0, 6, 11, {83,76,76}, 0, 0, 1, 6, 7 }, // Fulah/Latin/Sierra Leone
+ { 177, 134, 91, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 201, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {71,78,70}, 0, 0, 1, 6, 7 }, // Fulah/Adlam/Guinea
+ { 178, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,14201,14201,14263,14263,14290,14290, 502, 479, 0, 5, 22, 2,15848, 4, 13, 4867, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 62, 62, 27, 27, 13, 13, 6, 8, 4, 17, 23, 3, 16, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Kikuyu/Latin/Kenya
+ { 179, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,14303,14303,14407,14407,14434,14434, 508, 487, 0, 5, 22, 2,15864, 4, 13, 4873, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5,104,104, 27, 27, 13, 13, 7, 5, 4, 17, 23, 3, 18, 4, 6, 8, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Samburu/Latin/Kenya
+ { 180, 7, 146, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 610, 398, 0, 0,14447,14447,14501,14501,14528,14528, 0, 0, 0, 5, 22, 260,15882, 0, 0, 4881, 3301, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 54, 54, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 21, 4, 0, 4, 10, {77,90,78}, 2, 1, 7, 6, 7 }, // Sena/Latin/Mozambique
+ { 181, 7, 240, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,14541,14541,14590,14590,14617,14617, 0, 0, 0, 5, 22, 156,15903, 4, 13, 4885, 1780, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 10, 8, {85,83,68}, 2, 1, 7, 6, 7 }, // North Ndebele/Latin/Zimbabwe
+ { 182, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,14630,14630,14694,14694,14722,14722, 515, 492, 0, 5, 22, 182,15920, 4, 0, 4895, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 64, 64, 28, 28, 13, 13, 8, 7, 4, 17, 23, 3, 18, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Rombo/Latin/Tanzania
+ { 183, 9, 145, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 11, 97, 398, 0, 0,14735,14735,14781,14781, 83, 83, 523, 499, 0, 5, 22, 0,15938, 0, 0, 4904, 4911, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 46, 46, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 7, 6, {77,65,68}, 2, 1, 1, 6, 7 }, // Tachelhit/Tifinagh/Morocco
+ { 183, 7, 145, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 11, 97, 398, 0, 0,14810,14810,14857,14857, 83, 83, 529, 507, 0, 5, 22, 0,15952, 0, 0, 4917, 4927, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 47, 47, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 10, 6, {77,65,68}, 2, 1, 1, 6, 7 }, // Tachelhit/Latin/Morocco
+ { 184, 7, 3, 0, 0, 912, 924, 6, 1, 14, 2, 3, 4, 5, 68, 15, 16, 10, 11, 97, 398, 10, 22,14886,14919,14969,14996,15025,15038, 535, 515, 1185, 1192, 22, 195,15966, 0, 0, 4933, 4942, 6, 6, 12, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 12, 7, 33, 50, 27, 29, 13, 13, 7, 9, 7, 21, 23, 2, 52, 4, 0, 9, 8, {68,90,68}, 2, 1, 6, 5, 6 }, // Kabyle/Latin/Algeria
+ { 185, 7, 221, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15051,15051,15124,15124,15151,15151, 0, 0, 0, 5, 22, 187,16018, 4, 0, 4950, 1650, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 73, 73, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 10, 6, {85,71,88}, 0, 0, 1, 7, 7 }, // Nyankole/Latin/Uganda
+ { 186, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15164,15164,15245,15245,15272,15272, 542, 524, 0, 5, 22, 182,16037, 0, 0, 4960, 4966, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 81, 81, 27, 27, 13, 13, 7, 7, 4, 17, 23, 3, 22, 4, 0, 6, 10, {84,90,83}, 2, 0, 1, 6, 7 }, // Bena/Latin/Tanzania
+ { 187, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15285,15285,15346,15346,15373,15373, 549, 531, 0, 5, 22, 182,13534, 4, 0, 4976, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 8, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Vunjo/Latin/Tanzania
+ { 188, 7, 132, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 398, 0, 0,15386,15386,15429,15429,15456,15456, 0, 0, 0, 5, 22, 33,16059, 4, 13, 4984, 2143, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 43, 43, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 9, 4, {88,79,70}, 0, 0, 1, 6, 7 }, // Bambara/Latin/Mali
+ { 188, 75, 132, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 33, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {88,79,70}, 0, 0, 1, 6, 7 }, // Bambara/Nko/Mali
+ { 189, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15469,15469,15532,15532,15559,15559, 554, 540, 0, 5, 22, 2,13654, 4, 13, 4993, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 63, 63, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Embu/Latin/Kenya
+ { 190, 12, 225, 0, 0, 935, 944, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22,15572,15572,15620,15620,15647,15647, 556, 542, 1213, 5, 22, 6,16076, 4, 13, 4999, 5002, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 48, 48, 27, 27, 13, 13, 3, 6, 6, 17, 23, 1, 24, 4, 6, 3, 15, {85,83,68}, 2, 1, 7, 6, 7 }, // Cherokee/Cherokee/United States
+ { 191, 7, 137, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,15660,15660,15707,15707,15733,15733, 0, 0, 0, 5, 22, 170,16100, 8, 0, 5017, 5031, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 47, 47, 26, 26, 13, 13, 2, 2, 4, 17, 23, 2, 14, 5, 0, 14, 5, {77,85,82}, 2, 0, 1, 6, 7 }, // Morisyen/Latin/Mauritius
+ { 192, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15746,15746,15878,15878,14722,14722, 559, 548, 0, 5, 22, 182,13534, 4, 13, 5036, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5,132,132, 27, 27, 13, 13, 4, 5, 4, 17, 23, 3, 20, 4, 6, 10, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Makonde/Latin/Tanzania
+ { 193, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 11, 11, 13, 13, 0, 45, 0, 0,15905,15905,15967,15967,16002,16002, 563, 553, 0, 5, 22, 182,16114, 8, 0, 5046, 5054, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 62, 62, 35, 35, 13, 13, 3, 3, 4, 17, 23, 3, 22, 5, 0, 8, 9, {84,90,83}, 2, 0, 1, 6, 7 }, // Langi/Latin/Tanzania
+ { 194, 7, 221, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16015,16015,16080,16080,16107,16107, 0, 0, 0, 5, 22, 187,16136, 0, 0, 5063, 5070, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 65, 65, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 7, 7, {85,71,88}, 0, 0, 1, 7, 7 }, // Ganda/Latin/Uganda
+ { 195, 7, 239, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22,16120,16120,16120,16120, 83, 83, 566, 556, 0, 5, 22, 2, 0, 4, 13, 5077, 1774, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 79, 79, 79, 79, 13, 13, 8, 7, 4, 17, 23, 1, 0, 4, 6, 9, 6, {90,77,87}, 2, 1, 1, 6, 7 }, // Bemba/Latin/Zambia
+ { 196, 7, 39, 0, 0, 161, 161, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1541, 45, 0, 0,16199,16271,16343,16343,16370,16370, 68, 65, 0, 5, 22, 259,16155, 19, 24, 5086, 5098, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 10, 10, 5, 72, 72, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 42, 5, 7, 12, 10, {67,86,69}, 2, 1, 1, 6, 7 }, // Kabuverdianu/Latin/Cape Verde
+ { 197, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16383,16383,16433,16433,16460,16460, 574, 563, 0, 5, 22, 2,13654, 4, 13, 5108, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 50, 50, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 17, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Meru/Latin/Kenya
+ { 198, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16473,16473,16525,16525,16552,16552, 576, 565, 0, 5, 22, 2,16197, 4, 13, 5114, 5122, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 52, 52, 27, 27, 13, 13, 6, 10, 4, 17, 23, 3, 19, 4, 6, 8, 12, {75,69,83}, 2, 1, 7, 6, 7 }, // Kalenjin/Latin/Kenya
+ { 199, 7, 148, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22,16565,16565,16656,16656,16678,16678, 582, 575, 0, 5, 22, 6,16216, 4, 0, 5134, 5147, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 91, 91, 22, 22, 13, 13, 7, 5, 4, 17, 23, 1, 15, 4, 0, 13, 8, {78,65,68}, 2, 1, 1, 6, 7 }, // Nama/Latin/Namibia
+ { 200, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15285,15285,15346,15346,15373,15373, 549, 531, 0, 5, 22, 182,13534, 4, 0, 5155, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Machame/Latin/Tanzania
+ { 201, 7, 82, 0, 0, 459, 459, 6, 1, 14, 2, 3, 38, 5, 47, 40, 10, 46, 12, 1568, 1070, 0, 0,16691,16691,16762,16762, 3613, 3613, 589, 580, 0, 5, 22, 14, 234, 19, 0, 5164, 5170, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 23, 10, 10, 5, 71, 71, 27, 27, 13, 13, 16, 16, 4, 17, 23, 1, 4, 5, 0, 6, 11, {69,85,82}, 2, 1, 1, 6, 7 }, // Colognian/Latin/Germany
+ { 202, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16789,16789,15346,15346,14722,14722, 605, 596, 0, 5, 22, 2,16231, 4, 13, 740, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 18, 4, 6, 3, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Masai/Latin/Kenya
+ { 202, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16789,16789,15346,15346,14722,14722, 605, 596, 0, 5, 22, 182,16249, 4, 13, 740, 5181, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 21, 4, 6, 3, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Masai/Latin/Tanzania
+ { 203, 7, 221, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,16846,16846,16910,16910,16944,16944, 614, 602, 0, 5, 22, 187,16136, 19, 0, 5189, 5070, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 64, 64, 34, 34, 13, 13, 6, 6, 4, 17, 23, 3, 19, 5, 0, 7, 7, {85,71,88}, 0, 0, 1, 7, 7 }, // Soga/Latin/Uganda
+ { 204, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 40, 10, 46, 12, 0, 45, 0, 0,16957,16957,17031,17031, 83, 83, 64, 61, 0, 5, 22, 2,16270, 4, 68, 5196, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 74, 74, 20, 20, 13, 13, 4, 4, 4, 17, 23, 3, 16, 4, 6, 7, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Luyia/Latin/Kenya
+ { 205, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0, 9729, 9729,17051,17051,15373,15373, 620, 608, 0, 5, 22, 182,16286, 19, 0, 5203, 5209, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 27, 27, 13, 13, 9, 8, 4, 17, 23, 3, 21, 5, 0, 6, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Asu/Latin/Tanzania
+ { 206, 7, 221, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,17078,17078,17146,17146,17173,17173, 629, 616, 0, 5, 22, 187,16307, 4, 13, 5217, 1650, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 68, 68, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 21, 4, 6, 6, 6, {85,71,88}, 0, 0, 1, 7, 7 }, // Teso/Latin/Uganda
+ { 206, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,17078,17078,17146,17146,17173,17173, 629, 616, 0, 5, 22, 2,16328, 4, 13, 5217, 5223, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 68, 68, 27, 27, 13, 13, 9, 6, 4, 17, 23, 3, 20, 4, 6, 6, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Teso/Latin/Kenya
+ { 207, 7, 67, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {69,82,78}, 2, 1, 1, 6, 7 }, // Saho/Latin/Eritrea
+ { 208, 7, 132, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,17186,17186,17238,17238,17265,17265, 638, 622, 0, 5, 22, 33,16348, 0, 0, 5228, 5239, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 52, 52, 27, 27, 13, 13, 6, 6, 4, 17, 23, 3, 16, 4, 0, 11, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // Koyra Chiini/Latin/Mali
+ { 209, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15285,15285,15346,15346,15373,15373, 549, 531, 0, 5, 22, 182,13534, 0, 0, 5244, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 61, 61, 27, 27, 13, 13, 5, 9, 4, 17, 23, 3, 20, 4, 0, 6, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Rwa/Latin/Tanzania
+ { 210, 7, 111, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,17278,17278,17346,17346,17373,17373, 644, 628, 0, 5, 22, 2,16364, 0, 0, 5250, 1161, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 68, 68, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 16, 4, 0, 6, 5, {75,69,83}, 2, 1, 7, 6, 7 }, // Luo/Latin/Kenya
+ { 211, 7, 221, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,15051,15051,15124,15124,15151,15151, 0, 0, 0, 5, 22, 187,16018, 4, 0, 5256, 1650, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 73, 73, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 19, 4, 0, 6, 6, {85,71,88}, 0, 0, 1, 7, 7 }, // Chiga/Latin/Uganda
+ { 212, 7, 145, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,17386,17386,17433,17433,17460,17460, 646, 630, 0, 5, 22, 0,16380, 19, 0, 5262, 5279, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 47, 47, 27, 27, 13, 13, 9, 10, 4, 17, 23, 0, 15, 5, 0, 17, 6, {77,65,68}, 2, 1, 1, 6, 7 }, // Central Morocco Tamazight/Latin/Morocco
+ { 213, 7, 132, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,17473,17473,17526,17526,17265,17265, 638, 622, 0, 5, 22, 33,16348, 0, 0, 5285, 5239, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 53, 53, 27, 27, 13, 13, 6, 6, 4, 17, 23, 3, 16, 4, 0, 15, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // Koyraboro Senni/Latin/Mali
+ { 214, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,17553,17553,17615,17615,17642,17642, 655, 640, 0, 5, 22, 182,13556, 0, 0, 5300, 1585, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 62, 62, 27, 27, 13, 13, 5, 8, 4, 17, 23, 3, 20, 4, 0, 9, 8, {84,90,83}, 2, 0, 1, 6, 7 }, // Shambala/Latin/Tanzania
+ { 215, 13, 100, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22,17655,17655,17708,17708,17740,17740, 660, 648, 0, 5, 22, 119,16395, 8, 0, 5309, 2599, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 53, 53, 32, 32, 18, 18, 3, 6, 4, 17, 23, 1, 3, 5, 0, 4, 4, {73,78,82}, 2, 1, 7, 7, 7 }, // Bodo/Devanagari/India
+ { 218, 2, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0,17758,17758,17802,17802,17826,17802, 0, 0, 0, 5, 22, 121,16398, 19, 0, 5313, 3454, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 44, 44, 24, 24, 16, 24, 2, 2, 4, 17, 23, 1, 42, 5, 0, 7, 5, {82,85,66}, 2, 1, 1, 6, 7 }, // Chechen/Cyrillic/Russia
+ { 219, 2, 178, 0, 0, 952, 952, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 1591, 967, 0, 0,17842,17842,17909,17909,11114,11114, 0, 0, 0, 5, 22, 121,16440, 19, 0, 5320, 5339, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 10, 10, 5, 67, 67, 36, 36, 13, 13, 2, 2, 4, 17, 23, 1, 43, 5, 0, 19, 7, {82,85,66}, 2, 1, 1, 6, 7 }, // Church/Cyrillic/Russia
+ { 220, 2, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 121, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {82,85,66}, 2, 1, 1, 6, 7 }, // Chuvash/Cyrillic/Russia
+ { 230, 7, 49, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,17945,17945,17994,17994,18021,18021, 663, 654, 0, 5, 22, 32,16483, 0, 0, 5346, 5354, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 49, 49, 27, 27, 13, 13, 5, 6, 4, 17, 23, 2, 17, 4, 0, 8, 16, {67,68,70}, 2, 1, 1, 6, 7 }, // Luba Katanga/Latin/Congo Kinshasa
+ { 231, 7, 125, 0, 0, 960, 960, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 166, 0, 0,18034,18034,18098,18125, 3613, 3613, 668, 660, 441, 5, 22, 14, 8263, 19, 0, 5370, 5370, 6, 6, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 10, 5, 64, 64, 27, 34, 13, 13, 5, 8, 5, 17, 23, 1, 18, 5, 0, 14, 10, {69,85,82}, 2, 1, 1, 6, 7 }, // Luxembourgish/Latin/Luxembourg
+ { 236, 7, 21, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Walloon/Latin/Belgium
+ { 237, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 46, 13, 97, 398, 0, 0,18159,18159,18230,18230,18257,18257, 673, 668, 0, 5, 22, 32,16500, 0, 0, 5384, 5389, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 71, 71, 27, 27, 13, 13, 3, 3, 4, 17, 23, 4, 14, 4, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Aghem/Latin/Cameroon
+ { 238, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 97, 398, 0, 0,18270,18270,18339,18339,18366,18366, 676, 671, 0, 5, 22, 32,16514, 19, 0, 5396, 5401, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 69, 69, 27, 27, 13, 13, 10, 9, 4, 17, 23, 4, 15, 5, 0, 5, 8, {88,65,70}, 0, 0, 1, 6, 7 }, // Basaa/Latin/Cameroon
+ { 239, 7, 156, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,18379,18379,17526,17526,18431,18431, 686, 680, 0, 5, 22, 33,16348, 0, 0, 5409, 5419, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 52, 52, 27, 27, 13, 13, 8, 10, 4, 17, 23, 3, 16, 4, 0, 10, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // Zarma/Latin/Niger
+ { 240, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 12, 13, 97, 398, 0, 0,18444,18444,18488,18488,18515,18515, 694, 690, 0, 5, 22, 32, 0, 19, 0, 5424, 1946, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 44, 44, 27, 27, 13, 13, 5, 6, 4, 17, 23, 4, 0, 5, 0, 5, 8, {88,65,70}, 0, 0, 1, 6, 7 }, // Duala/Latin/Cameroon
+ { 241, 7, 187, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 398, 0, 0,18528,18528,18577,18577,18604,18604, 0, 0, 0, 5, 22, 33,16529, 19, 0, 5429, 5434, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 49, 49, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 16, 5, 0, 5, 7, {88,79,70}, 0, 0, 1, 6, 7 }, // Jola Fonyi/Latin/Senegal
+ { 242, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 398, 0, 0,18617,18617,18701,18701,18730,18730, 699, 696, 0, 5, 22, 32,16545, 19, 0, 5441, 5447, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 84, 84, 29, 29, 13, 13, 7, 9, 4, 17, 23, 4, 16, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Ewondo/Latin/Cameroon
+ { 243, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 12, 13, 97, 398, 0, 0,18743,18743,18787,18787,18815,18815, 706, 705, 0, 5, 22, 32,16561, 19, 0, 5454, 5459, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 44, 44, 28, 28, 13, 13, 6, 7, 4, 17, 23, 4, 4, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Bafia/Latin/Cameroon
+ { 244, 7, 146, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,18828,18828,18886,18886,18913,18913, 712, 712, 0, 5, 22, 260, 0, 8, 0, 5466, 5471, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 58, 58, 27, 27, 13, 13, 8, 10, 4, 17, 23, 3, 0, 5, 0, 5, 10, {77,90,78}, 2, 1, 7, 6, 7 }, // Makhuwa Meetto/Latin/Mozambique
+ { 245, 7, 37, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 97, 398, 0, 0,18926,18926,18999,18999,19026,19026, 720, 722, 0, 5, 22, 32,16565, 4, 13, 5481, 5487, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 73, 73, 27, 27, 13, 13, 5, 5, 4, 17, 23, 4, 10, 4, 6, 6, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Mundang/Latin/Cameroon
+ { 246, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 40, 11, 15, 16, 97, 398, 0, 0,19039,19039,19127,19127,19156,19156, 725, 727, 0, 5, 22, 32,16575, 19, 0, 5494, 5500, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 88, 88, 29, 29, 13, 13, 4, 4, 4, 17, 23, 4, 13, 5, 0, 6, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Kwasio/Latin/Cameroon
+ { 247, 7, 254, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 46, 448, 22,19169,19169,19247,19247,19284,19284, 729, 731, 0, 5, 22, 117, 0, 4, 13, 5507, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 9, 12, 7, 78, 78, 37, 37, 13, 13, 2, 2, 4, 17, 23, 1, 0, 4, 6, 9, 0, {83,83,80}, 2, 1, 1, 6, 7 }, // Nuer/Latin/South Sudan
+ { 248, 2, 178, 0, 0, 970, 970, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 10, 1614, 253, 0, 0,19297,19297,19367,19367,19387,19387, 731, 733, 1219, 1224, 22, 121,16588, 19, 0, 5516, 5525, 6, 6, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 6, 10, 5, 70, 70, 20, 20, 13, 13, 2, 2, 5, 17, 23, 1, 46, 5, 0, 9, 9, {82,85,66}, 2, 1, 1, 6, 7 }, // Sakha/Cyrillic/Russia
+ { 249, 7, 210, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 0, 0,19400,19400,19459,19459,19486,19486, 733, 735, 0, 5, 22, 182,16634, 0, 0, 5534, 5543, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 59, 59, 27, 27, 13, 13, 9, 9, 4, 17, 23, 3, 18, 4, 0, 9, 9, {84,90,83}, 2, 0, 1, 6, 7 }, // Sangu/Latin/Tanzania
+ { 251, 7, 156, 0, 0, 0, 0, 6, 0, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 97, 398, 0, 0,17473,17473,17526,17526,17265,17265, 686, 680, 0, 5, 22, 33,16348, 0, 0, 5552, 5419, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 53, 53, 27, 27, 13, 13, 8, 10, 4, 17, 23, 3, 16, 4, 0, 13, 5, {88,79,70}, 0, 0, 1, 6, 7 }, // Tasawaq/Latin/Niger
+ { 252, 35, 121, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22,19499,19499,19499,19499, 83, 83, 0, 0, 0, 5, 22, 6,16652, 4, 13, 5565, 5567, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 29, 29, 29, 29, 13, 13, 2, 2, 4, 17, 23, 1, 8, 4, 6, 2, 4, {76,82,68}, 2, 1, 1, 6, 7 }, // Vai/Vai/Liberia
+ { 252, 7, 121, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 0, 45, 10, 22,19528,19528,19528,19528, 83, 83, 0, 0, 0, 5, 22, 6,16660, 4, 13, 5571, 5574, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 12, 7, 47, 47, 47, 47, 13, 13, 2, 2, 4, 17, 23, 1, 13, 4, 6, 3, 8, {76,82,68}, 2, 1, 1, 6, 7 }, // Vai/Latin/Liberia
+ { 253, 7, 206, 0, 0, 267, 267, 6, 1, 13, 2, 3, 4, 5, 9, 15, 16, 17, 18, 420, 70, 0, 0,19575,19575,19627,19627,19654,19654, 0, 0, 0, 5, 22, 0, 0, 8, 0, 5582, 5588, 6, 6, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 52, 52, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 6, 6, {67,72,70}, 2, 0, 1, 6, 7 }, // Walser/Latin/Switzerland
+ { 254, 7, 37, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 15, 16, 97, 398, 0, 0,19667,19667,19737,19737,19757,19757, 742, 744, 0, 5, 22, 32, 0, 19, 24, 5594, 5600, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 70, 70, 20, 20, 13, 13, 8, 8, 4, 17, 23, 4, 0, 5, 7, 6, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Yangben/Latin/Cameroon
+ { 256, 7, 197, 0, 0, 687, 687, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 355, 259, 0, 0,19770,19770,19823,19823, 3373, 3373, 750, 752, 0, 5, 22, 14, 3032, 19, 0, 5607, 2381, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 6, 10, 5, 53, 53, 27, 27, 13, 13, 12, 11, 5, 17, 23, 1, 19, 5, 0, 9, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Asturian/Latin/Spain
+ { 257, 7, 37, 981, 981, 992, 1008, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 17, 18, 1450, 70, 0, 0,19850,19850,19850,19850,19909,19909, 762, 763, 0, 5, 22, 32,16673, 8, 0, 5616, 5621, 11, 11, 16, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 59, 59, 59, 59, 24, 24, 8, 13, 4, 17, 23, 4, 5, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Ngomba/Latin/Cameroon
+ { 258, 7, 37, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 17, 18, 80, 1644, 0, 0,19933,19933,19933,19933,19986,19986, 0, 0, 0, 5, 22, 32,14657, 8, 0, 5628, 5632, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 53, 53, 53, 53, 20, 20, 2, 2, 4, 17, 23, 4, 9, 5, 0, 4, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Kako/Latin/Cameroon
+ { 259, 7, 37, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1450, 70, 0, 0,20006,20006,20006,20006,20054,20054, 0, 0, 0, 5, 22, 32,16678, 8, 0, 5639, 5644, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 10, 10, 5, 48, 48, 48, 48, 20, 20, 2, 2, 4, 17, 23, 4, 5, 5, 0, 5, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Meta/Latin/Cameroon
+ { 260, 7, 37, 0, 0, 0, 0, 6, 1, 0, 2, 3, 4, 5, 9, 15, 16, 10, 11, 1654, 45, 0, 0,20074,20074,20074,20074, 83, 83, 770, 776, 0, 5, 22, 32,16683, 8, 0, 5651, 5667, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 32, 8, 10, 5,110,110,110,110, 13, 13, 9, 8, 4, 17, 23, 4, 9, 5, 0, 16, 7, {88,65,70}, 0, 0, 1, 6, 7 }, // Ngiemboon/Latin/Cameroon
+ { 261, 7, 197, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Aragonese/Latin/Spain
+ { 272, 46, 18, 0, 0, 1017, 1017, 6, 0, 1, 2, 69, 4, 5, 9, 10, 11, 12, 13, 174, 259, 10, 22,20184,20184,20310,20310,20394,20394, 0, 0, 1241, 5, 22, 122,16692, 0, 31, 5674, 5686, 6, 6, 12, 12, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7,126,126, 84, 84, 38, 38, 2, 2, 8, 17, 23, 1, 69, 4, 6, 12, 14, {66,68,84}, 2, 1, 7, 6, 7 }, // Chakma/Chakma/Bangladesh
+ { 272, 46, 100, 0, 0, 1017, 1017, 6, 0, 1, 2, 69, 4, 5, 9, 10, 11, 12, 13, 174, 259, 10, 22,20184,20184,20310,20310,20394,20394, 0, 0, 1241, 5, 22, 119,16761, 0, 31, 5674, 5700, 6, 6, 12, 12, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7,126,126, 84, 84, 38, 38, 2, 2, 8, 17, 23, 1, 87, 4, 6, 12, 10, {73,78,82}, 2, 1, 7, 7, 7 }, // Chakma/Chakma/India
+ { 290, 11, 100, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 119, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {73,78,82}, 2, 1, 7, 7, 7 }, // Manipuri/Bengali/India
+ { 309, 100, 232, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 316, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {86,78,68}, 0, 0, 1, 6, 7 }, // Tai Dam/Tai Viet/Vietnam
+ { 312, 7, 37, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 32, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 0, 5, 0, 0, 0, {88,65,70}, 0, 0, 1, 6, 7 }, // Akoose/Latin/Cameroon
+ { 313, 7, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22,20432,20432,20432,20432, 83,20518, 0, 0, 0, 5, 22, 6, 0, 8, 0, 5710, 5722, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 86, 86, 86, 86, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 12, 22, {85,83,68}, 2, 1, 7, 6, 7 }, // Lakota/Latin/United States
+ { 314, 9, 145, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 15, 16, 40, 11, 97, 398, 0, 0,20531,20531,14781,14781, 83, 83, 523, 499, 0, 5, 22, 0,15938, 0, 0, 5744, 4911, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 8, 10, 5, 47, 47, 29, 29, 13, 13, 6, 8, 4, 17, 23, 0, 14, 4, 0, 8, 6, {77,65,68}, 2, 1, 1, 6, 7 }, // Standard Moroccan Tamazight/Tifinagh/Morocco
+ { 315, 7, 43, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 6, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {67,76,80}, 0, 0, 1, 6, 7 }, // Mapuche/Latin/Chile
+ { 316, 1, 103, 0, 0, 0, 0, 53, 19, 20, 21, 23, 71, 73, 28, 10, 11, 12, 13, 53, 70, 10, 22,20578,20578,20578,20578,20635,20635, 779, 784, 0, 5, 22, 42,16848, 19, 0, 5752, 5766, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 12, 7, 57, 57, 57, 57, 13, 13, 3, 3, 4, 17, 23, 5, 13, 5, 0, 14, 5, {73,81,68}, 0, 0, 6, 5, 6 }, // Central Kurdish/Arabic/Iraq
+ { 316, 1, 102, 0, 0, 0, 0, 53, 19, 20, 21, 23, 71, 73, 28, 10, 11, 12, 13, 53, 70, 0, 0,20578,20578,20578,20578,20635,20635, 779, 784, 0, 5, 22, 0,16861, 19, 0, 5752, 5771, 6, 6, 6, 6, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 17, 10, 10, 5, 57, 57, 57, 57, 13, 13, 3, 3, 4, 17, 23, 0, 12, 5, 0, 14, 5, {73,82,82}, 0, 0, 6, 5, 5 }, // Central Kurdish/Arabic/Iran
+ { 317, 7, 82, 0, 0, 183, 183, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 113, 1, 1,20648,20648,20700,20700,20727,20727, 782, 787, 0, 5, 22, 14,16873, 19, 0, 5776, 5790, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 9, 4, 52, 52, 27, 27, 13, 13, 9, 10, 4, 17, 23, 1, 26, 5, 0, 14, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Lower Sorbian/Latin/Germany
+ { 318, 7, 82, 0, 0, 183, 183, 6, 1, 0, 2, 3, 4, 5, 9, 40, 10, 46, 12, 420, 113, 1, 460,20740,20740,20792,20792,20819,20819, 782, 797, 1249, 5, 22, 14,16899, 19, 0, 5796, 5811, 6, 6, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 9, 12, 52, 52, 27, 27, 13, 13, 9, 9, 5, 17, 23, 1, 28, 5, 0, 15, 6, {69,85,82}, 2, 1, 1, 6, 7 }, // Upper Sorbian/Latin/Germany
+ { 319, 7, 37, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 32, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 4, 0, 5, 0, 0, 0, {88,65,70}, 0, 0, 1, 6, 7 }, // Kenyang/Latin/Cameroon
+ { 320, 7, 38, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 224, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {67,65,68}, 2, 0, 7, 6, 7 }, // Mohawk/Latin/Canada
+ { 321, 75, 91, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 201, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {71,78,70}, 0, 0, 1, 6, 7 }, // Nko/Nko/Guinea
+ { 322, 7, 260, 0, 0, 1029, 1029, 6, 1, 14, 2, 3, 4, 5, 9, 40, 10, 40, 10, 1686, 166, 0, 0,20832,20832,20900,20900,20927,20927, 0, 0, 0, 5, 22, 0, 0, 19, 0, 5817, 5826, 6, 6, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 8, 10, 5, 68, 68, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 9, 6, {0,0,0}, 2, 1, 1, 6, 7 }, // Prussian/Latin/World
+ { 323, 7, 90, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 285, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {71,84,81}, 2, 1, 7, 6, 7 }, // Kiche/Latin/Guatemala
+ { 324, 7, 205, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 145, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {83,69,75}, 2, 0, 1, 6, 7 }, // Southern Sami/Latin/Sweden
+ { 325, 7, 205, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 145, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {83,69,75}, 2, 0, 1, 6, 7 }, // Lule Sami/Latin/Sweden
+ { 326, 7, 73, 0, 0, 0, 0, 6, 1, 14, 2, 3, 4, 5, 9, 10, 11, 12, 13, 1713, 581, 176, 167,20940,21009,21081,21081, 83,21108, 791, 806, 0, 5, 22, 14, 242, 19, 0, 5832, 5843, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 8, 9, 4, 69, 72, 27, 27, 13, 13, 3, 3, 4, 17, 23, 1, 4, 5, 0, 11, 5, {69,85,82}, 2, 1, 1, 6, 7 }, // Inari Sami/Latin/Finland
+ { 327, 7, 73, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Skolt Sami/Latin/Finland
+ { 328, 7, 13, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 225, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {65,85,68}, 2, 1, 7, 6, 7 }, // Warlpiri/Latin/Australia
+ { 346, 1, 102, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 15, 16, 17, 18, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 714, 1254, 22, 320,16927, 8, 0, 5848, 3182, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 39, 23, 3, 26, 5, 0, 7, 5, {73,82,82}, 0, 0, 6, 5, 5 }, // Mazanderani/Arabic/Iran
+ { 349, 1, 102, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 5855, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 11, 0, {73,82,82}, 0, 0, 6, 5, 5 }, // Northern Luri/Arabic/Iran
+ { 349, 1, 103, 0, 0, 0, 0, 53, 19, 20, 21, 52, 33, 53, 56, 10, 11, 12, 13, 53, 70, 10, 22, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 42, 0, 8, 0, 5855, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 3, 3, 4, 1, 1, 1, 1, 17, 10, 12, 7, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 5, 0, 5, 0, 11, 0, {73,81,68}, 0, 0, 6, 5, 6 }, // Northern Luri/Arabic/Iraq
+ { 357, 6, 97, 168, 168, 1037, 1037, 6, 0, 1, 2, 3, 4, 5, 9, 42, 43, 44, 45, 406, 390, 153, 27, 1902, 1902, 1902, 1902, 1949, 1949, 58, 55, 0, 5, 22, 131,16953, 4, 13, 5866, 5868, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 8, 13, 6, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 10, 4, 6, 2, 14, {72,75,68}, 2, 1, 7, 6, 7 }, // Cantonese/Traditional Han/Hong Kong
+ { 357, 5, 44, 168, 168, 1037, 1037, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 377, 390, 142, 27, 1902, 1902, 1929, 1929, 1949, 1949, 58, 55, 0, 5, 22, 227, 3051, 4, 13, 5882, 5884, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 8, 11, 6, 27, 27, 20, 20, 13, 13, 2, 2, 4, 17, 23, 1, 12, 4, 6, 2, 7, {67,78,89}, 2, 1, 7, 6, 7 }, // Cantonese/Simplified Han/China
+ { 358, 138, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 156, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7 }, // Osage/Osage/United States
+ { 360, 7, 260, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7 }, // Ido/Latin/World
+ { 361, 7, 260, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {0,0,0}, 2, 1, 1, 6, 7 }, // Lojban/Latin/World
+ { 362, 7, 106, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 14, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {69,85,82}, 2, 1, 1, 6, 7 }, // Sicilian/Latin/Italy
+ { 363, 1, 102, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 0, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 0, 0, 5, 0, 0, 0, {73,82,82}, 0, 0, 6, 5, 5 }, // Southern Kurdish/Arabic/Iran
+ { 364, 1, 163, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 170, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {80,75,82}, 2, 0, 7, 6, 7 }, // Western Balochi/Arabic/Pakistan
+ { 365, 7, 170, 0, 0, 895, 904, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 27, 521, 10, 22,21121,21121,21176,21176,21200,21200, 0, 0, 1293, 5, 22, 173,16963, 4, 13, 5891, 4632, 6, 6, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 6, 12, 7, 55, 55, 24, 24, 13, 13, 2, 2, 8, 17, 23, 1, 55, 4, 6, 8, 9, {80,72,80}, 2, 1, 7, 6, 7 }, // Cebuano/Latin/Philippines
+ { 366, 2, 178, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 121, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 1, 0, 5, 0, 0, 0, {82,85,66}, 2, 1, 1, 6, 7 }, // Erzya/Cyrillic/Russia
+ { 367, 7, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 156, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7 }, // Chickasaw/Latin/United States
+ { 368, 7, 225, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 156, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 3, 0, 5, 0, 0, 0, {85,83,68}, 2, 1, 7, 6, 7 }, // Muscogee/Latin/United States
+ { 369, 7, 172, 0, 0, 0, 0, 6, 0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 53, 70, 0, 0, 56, 56, 56, 56, 83, 83, 0, 0, 0, 5, 22, 257, 0, 8, 0, 0, 0, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 10, 10, 5, 27, 27, 27, 27, 13, 13, 2, 2, 4, 17, 23, 2, 0, 5, 0, 0, 0, {80,76,78}, 2, 1, 1, 6, 7 }, // Silesian/Latin/Poland
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0,0,0}, 0, 0, 0, 0, 0 } // trailing zeros
};
-static const ushort list_pattern_part_data[] = {
-0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x68, 0x65,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x1363, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x648, 0x25, 0x32, 0x25, 0x31, 0x20, 0x587, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x986, 0x9f0, 0x9c1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x259, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65,
-0x74, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x98f, 0x9ac, 0x982, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xf51, 0xf44, 0xf0b,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x68, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x438, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x1014, 0x103e, 0x1004, 0x1037, 0x103a, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x456, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x200b, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x69, 0x20, 0x25, 0x32, 0x25, 0x31, 0x3001, 0x25, 0x32, 0x25, 0x31, 0x548c, 0x25, 0x32, 0x25, 0x31, 0x53ca, 0x25, 0x32,
-0x25, 0x31, 0x20, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6f, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61,
-0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x61, 0x6a,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6a, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x74, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x61, 0x67, 0x75, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x10d3,
-0x10d0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x3ba, 0x3b1, 0x3b9, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x61, 0x6d, 0x6d, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xa85, 0xaa8, 0xac7, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x5d5, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20,
-0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xe9, 0x73, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x2c, 0x20, 0x64, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61, 0x6e, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x2c, 0x20, 0x61, 0x67, 0x75, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6c, 0x61, 0x6e, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x6c, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xcae, 0xca4, 0xccd, 0xca4, 0xcc1, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0xcae, 0xca4, 0xccd, 0xca4, 0xcc1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x436, 0x4d9, 0x43d, 0x435,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x436, 0x430, 0x43d, 0x430, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xbc0f, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x20, 0xfb, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xec1, 0xea5, 0xeb0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75,
-0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6d, 0x70, 0xe9, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x72, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x20, 0xd0e, 0xd28, 0xd4d, 0xd28, 0xd3f, 0xd35, 0x25, 0x31, 0x20, 0xd15, 0xd42, 0xd1f,
-0xd3e, 0xd24, 0xd46, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x75, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x906, 0x923, 0x93f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x25, 0x32, 0x25, 0x31, 0x20, 0x930, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xb13, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xb13, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x627, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627, 0x648, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x60c, 0x200f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x648, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0xa05, 0xa24, 0xa47, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x219, 0x69, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x4d5, 0x43c, 0x4d5, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x6fd, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6fd,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xdc3, 0xdc4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xdc3, 0xdc4, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x20, 0x61, 0xa0, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x79,
-0x6f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x79, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6e, 0x61, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x6f, 0x63, 0x68, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xbae, 0xbb1, 0xbcd, 0xbb1, 0xbc1, 0xbae, 0xbcd, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x4bb, 0x4d9, 0x43c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xc2e, 0xc30, 0xc3f, 0xc2f, 0xc41, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6d,
-0x6f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x77, 0x65, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x60c, 0x20, 0x627, 0x648, 0x631, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627, 0x648, 0x631, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x76, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0xe0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61,
-0x28, 0x63, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x28, 0x63, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x5d0,
-0x5d5, 0x5df, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6e, 0x65, 0x2d,
-0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6b, 0x70, 0x6c, 0x65, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x70, 0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x74, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x61, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x6b, 0x6b, 0x65, 0x64, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x61, 0x6b, 0x6b, 0x65, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x13a0, 0x13b4, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x13a0, 0x13b4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x438, 0x486, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
-0x61, 0x28, 0x6e, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x443, 0x43e, 0x43d, 0x43d, 0x430, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x2c, 0x20, 0x14b, 0x301, 0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x1e3f, 0x62, 0x25b, 0x6e, 0x20, 0x14b, 0x301,
-0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x70, 0x254, 0x70, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x62, 0x65, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x540c, 0x25, 0x32
+static const char16_t list_pattern_part_data[] = {
+0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x3b, 0x25, 0x31, 0x20, 0x65, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x68,
+0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x1363, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x648, 0x25, 0x32, 0x61b, 0x25, 0x31, 0x20, 0x587, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x986, 0x9f0, 0x9c1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x259, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x65, 0x74, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x98f, 0x9ac, 0x982, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xf51,
+0xf44, 0xf0b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x68, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x438, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x25, 0x32, 0x25, 0x31, 0x1014, 0x103e, 0x1004, 0x1037, 0x103a, 0x20, 0x25, 0x32, 0x104a, 0x25, 0x31, 0x20, 0x456,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x200b, 0x25,
+0x32, 0x25, 0x31, 0x20, 0x69, 0x20, 0x25, 0x32, 0x25, 0x31, 0x3001, 0x25, 0x32, 0x25, 0x31, 0x548c, 0x25, 0x32, 0x25, 0x31,
+0x53ca, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6f, 0x67, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x6b, 0x61, 0x6a, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6a, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x74, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x67, 0x75, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x10d3, 0x10d0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x3ba,
+0x3b1, 0x3b9, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x61, 0x6d, 0x6d, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xa85,
+0xaa8, 0xac7, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x5d5, 0x25, 0x32, 0x25,
+0x31, 0x2c, 0x20, 0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xe9,
+0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x64, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61, 0x6e,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x67, 0x75, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6c, 0x61,
+0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6c, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xcae, 0xca4, 0xccd,
+0xca4, 0xcc1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xcae, 0xca4, 0xccd, 0xca4, 0xcc1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x436,
+0x4d9, 0x43d, 0x435, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x436, 0x430, 0x43d, 0x430, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xbc0f,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xfb, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xec1, 0xea5, 0xeb0, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x75, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6d, 0x70, 0xe9, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69,
+0x72, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x20, 0xd0e, 0xd28, 0xd4d, 0xd28, 0xd3f, 0xd35, 0x25, 0x31, 0x20,
+0xd15, 0xd42, 0xd1f, 0xd3e, 0xd24, 0xd46, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x75, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x75, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x906, 0x923, 0x93f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xb13, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xb13, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x60c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x627, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627, 0x648,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x200f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xa05, 0xa24, 0xa47, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x219, 0x69, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x4d5, 0x43c, 0x4d5, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x6fd, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x6fd, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xdc3, 0xdc4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xdc3, 0xdc4,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0xa0, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x20, 0x69, 0x79, 0x6f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x79, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6e, 0x61, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x6f, 0x63, 0x68, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xbae, 0xbb1, 0xbcd, 0xbb1, 0xbc1, 0xbae,
+0xbcd, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x4bb, 0x4d9, 0x43c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xc2e, 0xc30, 0xc3f, 0xc2f,
+0xc41, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x6d, 0x6f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x77, 0x65,
+0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x627, 0x648, 0x631, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627, 0x648, 0x631, 0x20,
+0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0xe0, 0x20, 0x25, 0x32, 0x25, 0x31,
+0x2c, 0x20, 0x61, 0x28, 0x63, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x28, 0x63, 0x29, 0x20, 0x25, 0x32, 0x25,
+0x31, 0x20, 0x5d0, 0x5d5, 0x5df, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25, 0x31, 0x20,
+0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6b, 0x70,
+0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x70, 0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61,
+0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x6b, 0x6b, 0x65,
+0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6b, 0x6b, 0x65, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x13a0,
+0x13b4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x13a0, 0x13b4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x438, 0x486, 0x20, 0x25, 0x32,
+0x25, 0x31, 0x20, 0x61, 0x28, 0x6e, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x443, 0x43e, 0x43d, 0x43d, 0x430, 0x20, 0x25,
+0x32, 0x25, 0x31, 0x2c, 0x20, 0x14b, 0x301, 0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x1e3f, 0x62, 0x25b, 0x6e,
+0x20, 0x14b, 0x301, 0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x70, 0x254, 0x70, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20,
+0xd804, 0xdd03, 0xd804, 0xdd33, 0xd804, 0xdd03, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x62, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x540c,
+0x25, 0x32
};
-static const ushort date_format_data[] = {
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2d, 0x4d, 0x4d,
-0x2d, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64,
+static const char16_t single_character_data[] = {
+0x2e, 0x2c, 0x25, 0x30, 0x2d, 0x2b, 0x65, 0x22, 0x27, 0x45, 0x201c, 0x201d, 0x2018, 0x2019, 0xa0, 0xab, 0xbb, 0x2039, 0x203a, 0x66b,
+0x66c, 0x66a, 0x61c, 0x660, 0x61c, 0x2d, 0x61c, 0x2b, 0x627, 0x633, 0x200e, 0x25, 0x200e, 0x200e, 0x2d, 0x200e, 0x2b, 0x9e6, 0x2212, 0xf20,
+0x201e, 0x1040, 0x300c, 0x300d, 0x300e, 0x300f, 0x201a, 0xd7, 0x31, 0x30, 0x5e, 0x202f, 0x6f0, 0x200e, 0x2b, 0x200e, 0xd7, 0x6f1, 0x6f0, 0x5e,
+0x966, 0x200e, 0x2212, 0x415, 0xb7, 0x31, 0x30, 0x5e, 0x5a, 0xd804, 0xdd36, 0x200f, 0x2d, 0x200f, 0x2b
+};
+
+static const char16_t date_format_data[] = {
+0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x20, 0x4d,
+0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d,
+0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2d, 0x4d, 0x4d, 0x2d, 0x64, 0x64,
0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
0x64, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x64,
-0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x64, 0x200f, 0x2f, 0x4d, 0x200f, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x64,
-0x64, 0x64, 0x64, 0x60c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2e, 0x4d,
-0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x569, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20,
-0x64, 0x64, 0x64, 0x64, 0x64, 0x2d, 0x4d, 0x2d, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
-0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2f, 0x4d, 0x2f, 0x64, 0x79, 0x79, 0x79, 0x79, 0x28, 0x27, 0x65,
-0x27, 0x29, 0x27, 0x6b, 0x6f, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x72, 0x65, 0x6e, 0x27, 0x20, 0x64, 0x28, 0x27,
-0x61, 0x27, 0x29, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2f, 0x4d, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf63, 0xf7c, 0xf0b, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0xf5a,
-0xf7a, 0xf66, 0xf0b, 0x64, 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x20, 0x27, 0x433, 0x27, 0x2e, 0x64, 0x64, 0x64,
-0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x433, 0x27, 0x2e, 0x64,
-0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x104a, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x104a,
-0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2f, 0x4d,
-0x2f, 0x64, 0x79, 0x79, 0x79, 0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2f, 0x4d, 0x2f, 0x79,
-0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2e,
-0x20, 0x4d, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2e, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x2e, 0x64, 0x64,
-0x64, 0x64, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2e, 0x4d, 0x4d,
-0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x27, 0x64, 0x65, 0x6e, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2f,
-0x4d, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x2f, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79,
-0x79, 0x79, 0x2f, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x79, 0x79, 0x2d, 0x4d, 0x4d, 0x2d, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x2c, 0x20, 0x64, 0x2d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79,
-0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
-0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x27, 0x6d, 0x68, 0x27, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x64, 0x65,
-0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64,
-0x2c, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20,
-0x5d1, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20,
-0x64, 0x64, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2e, 0x2c, 0x20, 0x64, 0x64,
-0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20, 0x27, 0x6c, 0x65, 0x27, 0x20, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x436, 0x27, 0x2e, 0x20, 0x64, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2d, 0x27, 0x436, 0x27, 0x2e, 0x2c,
-0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x2e, 0x20,
-0x64, 0x2e, 0x79, 0x79, 0x79, 0x79, 0xb144, 0x20, 0x4d, 0xc6d4, 0x20, 0x64, 0xc77c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x64, 0x64, 0x20, 0xe97, 0xeb5, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
-0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x27, 0x67, 0x61, 0x64, 0x61, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x6d, 0x27, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20,
-0x27, 0x64, 0x27, 0x2e, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79,
-0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64,
-0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x74, 0x61, 0x27, 0x2019, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79,
-0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x4d, 0x4d, 0x2e, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x43e,
-0x43d, 0x44b, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x44b, 0x43d, 0x27, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64,
-0x20, 0x27, 0x433, 0x430, 0x440, 0x430, 0x433, 0x27, 0x64, 0x64, 0x64, 0x64, 0x20, 0x62f, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20,
-0x62f, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x69, 0x6c, 0x73, 0x27, 0x20,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x2e, 0x64, 0x64,
-0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x64,
-0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x430, 0x437,
-0x27, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20, 0x79, 0x79,
-0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64,
-0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
-0x64, 0x64, 0x20, 0x64, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27,
-0x20, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c,
-0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x435, 0x43b, 0x27, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0xe17, 0xe35,
-0xe48, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0xf60, 0xf72, 0xf0b, 0xf5a, 0xf7a, 0xf66, 0xf0b, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x1363, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x1218, 0x12d3, 0x120d, 0x1272, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64,
-0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20,
-0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x60c, 0x20, 0x64, 0x64, 0x64,
-0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27,
-0x440, 0x27, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x60c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x60c, 0x20, 0x79, 0x79, 0x79,
-0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79,
-0x79, 0x79, 0x79, 0x20, 0x646, 0x686, 0x6cc, 0x20, 0x6cc, 0x6cc, 0x644, 0x20, 0x64, 0x20, 0x646, 0x686, 0x6cc, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x20, 0x6a9, 0x648, 0x646, 0x6cc, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d,
-0x4d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64, 0x27, 0x2e, 0x20, 0x64, 0x27, 0x69, 0x64, 0x27, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x5d8,
-0x5df, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d,
-0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x79, 0x79,
-0x2f, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d,
-0x4d, 0x20, 0x64, 0x64, 0x64, 0x2d, 0x4d, 0x2d, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x27, 0x64, 0x69,
-0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x61, 0x6c, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
-0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x6c, 0x69, 0x61, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79,
-0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79,
-0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
-0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0xe4, 0x27,
-0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x43b, 0x27, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x79, 0x79, 0x79, 0x79,
-0x20, 0x27, 0x441, 0x44b, 0x43b, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x43a, 0x4af, 0x43d, 0x44d, 0x27,
-0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64,
-0x20, 0x2c, 0x20, 0x27, 0x6c, 0x79, 0x25b, 0x27, 0x30c, 0x2bc, 0x20, 0x64, 0x20, 0x27, 0x6e, 0x61, 0x27, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27,
-0x6d, 0x65, 0x74, 0x74, 0x61, 0x73, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79
+0x64, 0x64, 0x64, 0x60c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x200f, 0x2f, 0x4d,
+0x200f, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x569, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64,
+0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
+0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2d, 0x4d, 0x2d, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79,
+0x79, 0x28, 0x27, 0x65, 0x27, 0x29, 0x27, 0x6b, 0x6f, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x72, 0x65, 0x6e, 0x27,
+0x20, 0x64, 0x28, 0x27, 0x61, 0x27, 0x29, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2f, 0x4d, 0x2f, 0x64, 0x64,
+0x2f, 0x4d, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf63, 0xf7c, 0xf0b, 0x79,
+0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0xf5a, 0xf7a, 0xf66, 0xf0b, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x433, 0x27, 0x2e, 0x64, 0x2e, 0x4d,
+0x4d, 0x2e, 0x79, 0x79, 0x20, 0x27, 0x433, 0x27, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x104a, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
+0x64, 0x104a, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79,
+0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2f, 0x4d, 0x2f, 0x64, 0x64, 0x2f,
+0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x20, 0x64, 0x64, 0x64, 0x64,
+0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64,
+0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79,
+0x2e, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
+0x64, 0x64, 0x20, 0x27, 0x64, 0x65, 0x6e, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79, 0x79,
+0x79, 0x4d, 0x2f, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2f, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x64, 0x2d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x27, 0x6d, 0x68, 0x27,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x64,
+0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
+0x64, 0x2c, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64,
+0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
+0x20, 0x5d1, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x20, 0x64, 0x2e, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20,
+0x64, 0x64, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x20, 0x27, 0x6c, 0x65, 0x27, 0x20, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x436, 0x27, 0x2e, 0x20, 0x64,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2d, 0x27, 0x436, 0x27, 0x2e,
+0x2c, 0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0xb144, 0x20,
+0x4d, 0xc6d4, 0x20, 0x64, 0xc77c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x64, 0x2e, 0x64,
+0x64, 0x64, 0x64, 0x20, 0xe97, 0xeb5, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
+0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x27, 0x67, 0x61, 0x64, 0x61, 0x27, 0x20, 0x64, 0x2e, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x6d, 0x27, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64,
+0x20, 0x27, 0x64, 0x27, 0x2e, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x4d, 0x4d, 0x4d,
+0x4d, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x74, 0x61,
+0x27, 0x2019, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x43e, 0x43d,
+0x44b, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x44b, 0x43d, 0x27, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x20,
+0x27, 0x433, 0x430, 0x440, 0x430, 0x433, 0x27, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x4d, 0x4d, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x64,
+0x64, 0x20, 0x62f, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x62f, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64,
+0x64, 0x2c, 0x20, 0x27, 0x69, 0x6c, 0x73, 0x27, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e,
+0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c,
+0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x430, 0x437, 0x27, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64,
+0x64, 0x64, 0x64, 0x20, 0x64, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65,
+0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
+0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x435, 0x43b, 0x27, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0xe17,
+0xe35, 0xe48, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0xf60, 0xf72, 0xf0b, 0xf5a, 0xf7a, 0xf66, 0xf0b, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
+0x64, 0x1363, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x1218, 0x12d3, 0x120d, 0x1272, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79,
+0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x60c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x440, 0x27, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x60c,
+0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x60c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
+0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x646, 0x686, 0x6cc, 0x20,
+0x6cc, 0x6cc, 0x644, 0x20, 0x64, 0x20, 0x646, 0x686, 0x6cc, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x20,
+0x6a9, 0x648, 0x646, 0x6cc, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64, 0x27,
+0x2e, 0x20, 0x64, 0x27, 0x69, 0x64, 0x27, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x2c, 0x20,
+0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x5d8, 0x5df, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79,
+0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64,
+0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20,
+0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x61, 0x6c, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
+0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x6c, 0x69, 0x61, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64,
+0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
+0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27,
+0x64, 0x69, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0xe4, 0x27, 0x20, 0x64,
+0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x43b, 0x27, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27,
+0x441, 0x44b, 0x43b, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x43a, 0x4af, 0x43d, 0x44d, 0x27, 0x2c, 0x20,
+0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x2c,
+0x20, 0x27, 0x6c, 0x79, 0x25b, 0x27, 0x30c, 0x2bc, 0x20, 0x64, 0x20, 0x27, 0x6e, 0x61, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
+0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x6d, 0x65,
+0x74, 0x74, 0x61, 0x73, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d,
+0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79
};
-static const ushort time_format_data[] = {
-0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x68, 0x3a,
-0x6d, 0x6d, 0x20, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x20, 0x74, 0x48, 0x48, 0x3a,
-0x6d, 0x6d, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x2c, 0x20, 0x74, 0x48, 0x3a, 0x6d, 0x6d, 0x48,
-0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x2e, 0x6d, 0x6d, 0x41, 0x50, 0x20, 0x68, 0x2e,
-0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28, 0x74, 0x29, 0xf46,
-0xf74, 0xf0b, 0xf5a, 0xf7c, 0xf51, 0xf0b, 0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58, 0xf0b, 0x20, 0x6d, 0x6d, 0x20, 0x41,
-0x50, 0xf46, 0xf74, 0xf0b, 0xf5a, 0xf7c, 0xf51, 0xf0b, 0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58, 0xf0b, 0x20, 0x6d, 0x6d,
-0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x20, 0x74, 0x42, 0x20, 0x48, 0x3a, 0x6d, 0x6d, 0x74, 0x20, 0x48, 0x48, 0x3a, 0x6d,
-0x6d, 0x3a, 0x73, 0x73, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x2c, 0x20, 0x74, 0x41, 0x50, 0x68, 0x3a, 0x6d,
-0x6d, 0x74, 0x20, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73,
-0x73, 0x20, 0x5b, 0x74, 0x5d, 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74,
-0x48, 0x2e, 0x6d, 0x6d, 0x48, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x48, 0x2d, 0x27, 0x61, 0x27, 0x20, 0x27,
-0x68, 0x6f, 0x72, 0x6f, 0x27, 0x20, 0x27, 0x6b, 0x61, 0x6a, 0x27, 0x20, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x48, 0x20,
-0x27, 0x68, 0x27, 0x20, 0x6d, 0x6d, 0x20, 0x27, 0x6d, 0x69, 0x6e, 0x27, 0x20, 0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20,
-0x74, 0x48, 0x48, 0x20, 0x27, 0x68, 0x27, 0x20, 0x6d, 0x6d, 0x48, 0x48, 0x20, 0x27, 0x68, 0x27, 0x20, 0x6d, 0x6d, 0x20,
-0x27, 0x6d, 0x69, 0x6e, 0x27, 0x20, 0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x3a,
-0x73, 0x73, 0x20, 0x27, 0x68, 0x27, 0x20, 0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x50, 0x68, 0x68, 0x3a, 0x6d,
-0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x20, 0x74, 0x48, 0x6642, 0x6d, 0x6d, 0x5206, 0x73, 0x73, 0x79d2, 0x20, 0x74, 0x41,
-0x50, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x41, 0x50, 0x20, 0x68, 0xc2dc, 0x20, 0x6d, 0xbd84, 0x20, 0x73, 0xcd08, 0x20, 0x74, 0x48,
-0x20, 0xec2, 0xea1, 0xe87, 0x20, 0x6d, 0x20, 0xe99, 0xeb2, 0xe97, 0xeb5, 0x20, 0x73, 0x73, 0x20, 0xea7, 0xeb4, 0xe99, 0xeb2, 0xe97,
-0xeb5, 0x20, 0x74, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28, 0x74, 0x29, 0x27, 0x6b, 0x6c, 0x27, 0x2e, 0x20,
-0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73,
-0x20, 0x74, 0x48, 0x20, 0xe19, 0xe32, 0xe2c, 0xe34, 0xe01, 0xe32, 0x20, 0x6d, 0x6d, 0x20, 0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x73,
-0x73, 0x20, 0xe27, 0xe34, 0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x74, 0x48, 0x3a, 0x6d, 0x41, 0x50, 0x20, 0x27, 0x67, 0x61, 0x27,
-0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x41, 0x50, 0x20, 0x27, 0x67, 0x61, 0x27, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73,
-0x20, 0x74, 0x27, 0x4b, 0x6c, 0x27, 0x2e, 0x20, 0x48, 0x2e, 0x6d, 0x6d, 0x27, 0x4b, 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x20,
-0x48, 0x2e, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28, 0x74, 0x29, 0x74, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73,
-0x20, 0x41, 0x50, 0x48, 0x3a, 0x6d, 0x6d, 0x20, 0x27, 0x68, 0x6f, 0x64, 0x17a, 0x27, 0x2e
+static const char16_t time_format_data[] = {
+0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50,
+0x20, 0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x2c,
+0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a,
+0x73, 0x73, 0x20, 0x28, 0x74, 0x29, 0xf46, 0xf74, 0xf0b, 0xf5a, 0xf7c, 0xf51, 0xf0b, 0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b,
+0xf58, 0xf0b, 0x20, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x20, 0x74, 0xf46, 0xf74, 0xf0b, 0xf5a, 0xf7c, 0xf51, 0xf0b,
+0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58, 0xf0b, 0x20, 0x6d, 0x6d, 0x20, 0x41, 0x50, 0x74, 0x20, 0x48, 0x48, 0x3a,
+0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x42, 0x20, 0x48, 0x3a, 0x6d, 0x6d, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x2c,
+0x20, 0x74, 0x74, 0x20, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a,
+0x73, 0x73, 0x20, 0x5b, 0x74, 0x5d, 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x48, 0x2e, 0x6d, 0x6d,
+0x2e, 0x73, 0x73, 0x20, 0x74, 0x48, 0x2d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x68, 0x6f, 0x72, 0x6f, 0x27, 0x20, 0x27, 0x6b,
+0x61, 0x6a, 0x27, 0x20, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x48, 0x20, 0x27, 0x68, 0x27, 0x20, 0x6d, 0x6d, 0x20, 0x27,
+0x6d, 0x69, 0x6e, 0x27, 0x20, 0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x48, 0x48, 0x20, 0x27, 0x68, 0x27, 0x20,
+0x6d, 0x6d, 0x20, 0x27, 0x6d, 0x69, 0x6e, 0x27, 0x20, 0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x48, 0x48, 0x2e,
+0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x27, 0x68, 0x27, 0x20, 0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20,
+0x41, 0x50, 0x20, 0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x50, 0x48, 0x6642, 0x6d, 0x6d, 0x5206, 0x73, 0x73, 0x79d2,
+0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0xc2dc, 0x20, 0x6d, 0xbd84, 0x20, 0x73, 0xcd08, 0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x3a,
+0x6d, 0x6d, 0x48, 0x20, 0xec2, 0xea1, 0xe87, 0x20, 0x6d, 0x20, 0xe99, 0xeb2, 0xe97, 0xeb5, 0x20, 0x73, 0x73, 0x20, 0xea7, 0xeb4,
+0xe99, 0xeb2, 0xe97, 0xeb5, 0x20, 0x74, 0x27, 0x6b, 0x6c, 0x27, 0x2e, 0x20, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73,
+0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x48, 0x20, 0xe19, 0xe32, 0xe2c, 0xe34,
+0xe01, 0xe32, 0x20, 0x6d, 0x6d, 0x20, 0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x73, 0x73, 0x20, 0xe27, 0xe34, 0xe19, 0xe32, 0xe17, 0xe35,
+0x20, 0x74, 0x41, 0x50, 0x20, 0x27, 0x67, 0x61, 0x27, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x27,
+0x4b, 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x20, 0x48, 0x2e, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28, 0x74, 0x29, 0x27, 0x4b,
+0x6c, 0x27, 0x2e, 0x20, 0x48, 0x2e, 0x6d, 0x6d, 0x74, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50,
+0x48, 0x3a, 0x6d, 0x6d, 0x20, 0x27, 0x68, 0x6f, 0x64, 0x17a, 0x27, 0x2e
};
-static const ushort days_data[] = {
-0x53, 0x75, 0x6e, 0x3b, 0x4d, 0x6f, 0x6e, 0x3b, 0x54, 0x75, 0x65, 0x3b, 0x57, 0x65, 0x64, 0x3b, 0x54, 0x68, 0x75, 0x3b,
-0x46, 0x72, 0x69, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x53, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x3b, 0x4d, 0x6f, 0x6e, 0x64, 0x61,
-0x79, 0x3b, 0x54, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79, 0x3b, 0x57, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61, 0x79, 0x3b,
-0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79, 0x3b, 0x46, 0x72, 0x69, 0x64, 0x61, 0x79, 0x3b, 0x53, 0x61, 0x74, 0x75,
-0x72, 0x64, 0x61, 0x79, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x53, 0x3b, 0x37,
-0x3b, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x44, 0x69, 0x6c, 0x3b, 0x57, 0x69, 0x78,
-0x3b, 0x51, 0x69, 0x62, 0x3b, 0x52, 0x6f, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x53, 0x61, 0x6e,
-0x3b, 0x44, 0x69, 0x6c, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x57, 0x69, 0x69, 0x78, 0x61, 0x74, 0x61, 0x3b, 0x51, 0x69, 0x62,
-0x78, 0x61, 0x74, 0x61, 0x3b, 0x52, 0x6f, 0x6f, 0x62, 0x69, 0x69, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b,
-0x4a, 0x69, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x6e, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x44, 0x3b, 0x57, 0x3b,
-0x51, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69,
-0x2e, 0x3b, 0x57, 0x6f, 0x2e, 0x3b, 0x44, 0x6f, 0x2e, 0x3b, 0x56, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0x6f,
-0x6e, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67,
-0x3b, 0x57, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b,
-0x56, 0x72, 0x79, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x3b, 0x4d, 0x3b,
-0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x64, 0x69, 0x65, 0x3b, 0x68, 0xeb, 0x6e, 0x3b, 0x6d, 0x61,
-0x72, 0x3b, 0x6d, 0xeb, 0x72, 0x3b, 0x65, 0x6e, 0x6a, 0x3b, 0x70, 0x72, 0x65, 0x3b, 0x73, 0x68, 0x74, 0x3b, 0x65, 0x20,
-0x64, 0x69, 0x65, 0x6c, 0x3b, 0x65, 0x20, 0x68, 0xeb, 0x6e, 0xeb, 0x3b, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x74, 0xeb, 0x3b,
-0x65, 0x20, 0x6d, 0xeb, 0x72, 0x6b, 0x75, 0x72, 0xeb, 0x3b, 0x65, 0x20, 0x65, 0x6e, 0x6a, 0x74, 0x65, 0x3b, 0x65, 0x20,
-0x70, 0x72, 0x65, 0x6d, 0x74, 0x65, 0x3b, 0x65, 0x20, 0x73, 0x68, 0x74, 0x75, 0x6e, 0xeb, 0x3b, 0x64, 0x3b, 0x68, 0x3b,
-0x6d, 0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x70, 0x3b, 0x73, 0x68, 0x3b, 0x44, 0x69, 0x65, 0x3b, 0x48, 0xeb, 0x6e, 0x3b, 0x4d,
-0x61, 0x72, 0x3b, 0x4d, 0xeb, 0x72, 0x3b, 0x45, 0x6e, 0x6a, 0x3b, 0x50, 0x72, 0x65, 0x3b, 0x53, 0x68, 0x74, 0x3b, 0x12a5,
-0x1211, 0x12f5, 0x3b, 0x1230, 0x129e, 0x3b, 0x121b, 0x12ad, 0x1230, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d,
-0x1265, 0x3b, 0x1245, 0x12f3, 0x121c, 0x3b, 0x12a5, 0x1211, 0x12f5, 0x3b, 0x1230, 0x129e, 0x3b, 0x121b, 0x12ad, 0x1230, 0x129e, 0x3b, 0x1228, 0x1261,
-0x12d5, 0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b, 0x1245, 0x12f3, 0x121c, 0x3b, 0x12a5, 0x3b, 0x1230, 0x3b, 0x121b, 0x3b,
-0x1228, 0x3b, 0x1210, 0x3b, 0x12d3, 0x3b, 0x1245, 0x3b, 0x627, 0x644, 0x623, 0x62d, 0x62f, 0x3b, 0x627, 0x644, 0x627, 0x62b, 0x646, 0x64a,
-0x646, 0x3b, 0x627, 0x644, 0x62b, 0x644, 0x627, 0x62b, 0x627, 0x621, 0x3b, 0x627, 0x644, 0x623, 0x631, 0x628, 0x639, 0x627, 0x621, 0x3b,
-0x627, 0x644, 0x62e, 0x645, 0x64a, 0x633, 0x3b, 0x627, 0x644, 0x62c, 0x645, 0x639, 0x629, 0x3b, 0x627, 0x644, 0x633, 0x628, 0x62a, 0x3b,
-0x62d, 0x3b, 0x646, 0x3b, 0x62b, 0x3b, 0x631, 0x3b, 0x62e, 0x3b, 0x62c, 0x3b, 0x633, 0x3b, 0x56f, 0x56b, 0x580, 0x3b, 0x565, 0x580,
-0x56f, 0x3b, 0x565, 0x580, 0x584, 0x3b, 0x579, 0x580, 0x584, 0x3b, 0x570, 0x576, 0x563, 0x3b, 0x578, 0x582, 0x580, 0x3b, 0x577, 0x562,
-0x569, 0x3b, 0x56f, 0x56b, 0x580, 0x561, 0x56f, 0x56b, 0x3b, 0x565, 0x580, 0x56f, 0x578, 0x582, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b,
-0x565, 0x580, 0x565, 0x584, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x579, 0x578, 0x580, 0x565, 0x584, 0x577, 0x561, 0x562, 0x569, 0x56b,
-0x3b, 0x570, 0x56b, 0x576, 0x563, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x578, 0x582, 0x580, 0x562, 0x561, 0x569, 0x3b, 0x577, 0x561,
-0x562, 0x561, 0x569, 0x3b, 0x53f, 0x3b, 0x535, 0x3b, 0x535, 0x3b, 0x549, 0x3b, 0x540, 0x3b, 0x548, 0x3b, 0x547, 0x3b, 0x9a6, 0x9c7,
-0x993, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x3b,
-0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x3b, 0x9a6, 0x9c7, 0x993, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b8, 0x9cb, 0x9ae,
-0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x9ac, 0x9be, 0x9f0, 0x3b,
-0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0, 0x9ac, 0x9be, 0x9f0,
-0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9a6, 0x3b, 0x9b8, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x3b, 0x9ac, 0x3b, 0x9b6, 0x3b,
-0x9b6, 0x3b, 0x42, 0x2e, 0x3b, 0x42, 0x2e, 0x45, 0x2e, 0x3b, 0xc7, 0x2e, 0x41, 0x2e, 0x3b, 0xc7, 0x2e, 0x3b, 0x43, 0x2e,
-0x41, 0x2e, 0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x3b, 0x62, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x62, 0x61, 0x7a, 0x61, 0x72,
-0x20, 0x65, 0x72, 0x74, 0x259, 0x73, 0x69, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x20, 0x61, 0x78, 0x15f,
-0x61, 0x6d, 0x131, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x3b, 0x63, 0xfc, 0x6d, 0x259, 0x20, 0x61, 0x78,
-0x15f, 0x61, 0x6d, 0x131, 0x3b, 0x63, 0xfc, 0x6d, 0x259, 0x3b, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x3b, 0x42, 0x2e, 0x3b, 0x42,
-0x2e, 0x65, 0x2e, 0x3b, 0xc7, 0x2e, 0x61, 0x2e, 0x3b, 0xc7, 0x2e, 0x3b, 0x43, 0x2e, 0x61, 0x2e, 0x3b, 0x43, 0x2e, 0x3b,
-0x15e, 0x2e, 0x3b, 0x411, 0x2e, 0x3b, 0x411, 0x2e, 0x415, 0x2e, 0x3b, 0x427, 0x2e, 0x410, 0x2e, 0x3b, 0x427, 0x2e, 0x3b, 0x4b8,
-0x2e, 0x410, 0x2e, 0x3b, 0x4b8, 0x2e, 0x3b, 0x428, 0x2e, 0x3b, 0x431, 0x430, 0x437, 0x430, 0x440, 0x3b, 0x431, 0x430, 0x437, 0x430,
-0x440, 0x20, 0x435, 0x440, 0x442, 0x4d9, 0x441, 0x438, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x20, 0x430, 0x445,
-0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9, 0x20, 0x430,
-0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9, 0x3b, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x3b, 0x69, 0x67, 0x2e,
-0x3b, 0x61, 0x6c, 0x2e, 0x3b, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x7a, 0x2e, 0x3b, 0x6f, 0x67, 0x2e, 0x3b, 0x6f, 0x72, 0x2e,
-0x3b, 0x6c, 0x72, 0x2e, 0x3b, 0x69, 0x67, 0x61, 0x6e, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x6c, 0x65, 0x68,
-0x65, 0x6e, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x72, 0x74, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x7a,
-0x6b, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x73, 0x74, 0x65, 0x67, 0x75, 0x6e, 0x61, 0x3b, 0x6f, 0x73, 0x74, 0x69, 0x72, 0x61,
-0x6c, 0x61, 0x3b, 0x6c, 0x61, 0x72, 0x75, 0x6e, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41,
-0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x4c, 0x3b, 0x9b0, 0x9ac, 0x9bf, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2,
-0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9b0, 0x3b,
-0x9b6, 0x9a8, 0x9bf, 0x3b, 0x9b0, 0x9ac, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x999,
-0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa,
-0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9b0, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9ac, 0x9be,
-0x9b0, 0x3b, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x9c1, 0x3b, 0x9ac, 0x9c3, 0x3b, 0x9b6, 0x9c1, 0x3b, 0x9b6, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b, 0x3b, 0xf66,
-0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0x3b, 0xf49, 0xf72, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3,
-0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60,
-0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b,
-0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b,
-0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72, 0xf62, 0x3b,
-0xf63, 0xfb7, 0xf42, 0x3b, 0xf55, 0xf74, 0xf62, 0x3b, 0xf66, 0xf44, 0xfb6, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x3b, 0xf49, 0xf72, 0x3b,
-0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x2e, 0x3b, 0x4d, 0x65, 0x72, 0x2e, 0x3b, 0x59, 0x61,
-0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x2e, 0x3b, 0x53, 0x61, 0x64, 0x2e, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e,
-0x3b, 0x4d, 0x65, 0x75, 0x72, 0x7a, 0x68, 0x3b, 0x4d, 0x65, 0x72, 0x63, 0x2bc, 0x68, 0x65, 0x72, 0x3b, 0x59, 0x61, 0x6f,
-0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x53, 0x61, 0x64, 0x6f, 0x72, 0x6e, 0x3b, 0x53, 0x75, 0x3b, 0x4c,
-0x3b, 0x4d, 0x7a, 0x3b, 0x4d, 0x63, 0x3b, 0x59, 0x3b, 0x47, 0x3b, 0x53, 0x61, 0x3b, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b,
-0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x3b, 0x43d, 0x435, 0x434, 0x435, 0x43b,
-0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a,
-0x3b, 0x441, 0x440, 0x44f, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x44a, 0x440, 0x442, 0x44a, 0x43a, 0x3b, 0x43f, 0x435, 0x442,
-0x44a, 0x43a, 0x3b, 0x441, 0x44a, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x43d, 0x3b, 0x43f, 0x3b, 0x432, 0x3b, 0x441, 0x3b, 0x447, 0x3b,
-0x43f, 0x3b, 0x441, 0x3b, 0x1010, 0x1014, 0x1004, 0x103a, 0x1039, 0x1002, 0x1014, 0x103d, 0x1031, 0x3b, 0x1010, 0x1014, 0x1004, 0x103a, 0x1039, 0x101c,
-0x102c, 0x3b, 0x1021, 0x1004, 0x103a, 0x1039, 0x1002, 0x102b, 0x3b, 0x1017, 0x102f, 0x1012, 0x1039, 0x1013, 0x101f, 0x1030, 0x1038, 0x3b, 0x1000, 0x103c,
-0x102c, 0x101e, 0x1015, 0x1010, 0x1031, 0x1038, 0x3b, 0x101e, 0x1031, 0x102c, 0x1000, 0x103c, 0x102c, 0x3b, 0x1005, 0x1014, 0x1031, 0x3b, 0x1010, 0x3b,
-0x1010, 0x3b, 0x1021, 0x3b, 0x1017, 0x3b, 0x1000, 0x3b, 0x101e, 0x3b, 0x1005, 0x3b, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x430, 0x45e,
-0x3b, 0x441, 0x440, 0x3b, 0x447, 0x446, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x3b, 0x43d, 0x44f, 0x434, 0x437, 0x435, 0x43b, 0x44f,
-0x3b, 0x43f, 0x430, 0x43d, 0x44f, 0x434, 0x437, 0x435, 0x43b, 0x430, 0x43a, 0x3b, 0x430, 0x45e, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b,
-0x441, 0x435, 0x440, 0x430, 0x434, 0x430, 0x3b, 0x447, 0x430, 0x446, 0x432, 0x435, 0x440, 0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x456, 0x446,
-0x430, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x43d, 0x3b, 0x43f, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f,
-0x3b, 0x441, 0x3b, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782,
-0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5,
-0x179a, 0x17cd, 0x3b, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782,
-0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb,
-0x1780, 0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5, 0x179a, 0x17cd, 0x3b, 0x17a2, 0x3b, 0x1785, 0x3b, 0x17a2, 0x3b, 0x1796, 0x3b, 0x1796, 0x3b, 0x179f,
-0x3b, 0x179f, 0x3b, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x17d0, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2,
-0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f,
-0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5, 0x179a, 0x17cd, 0x3b, 0x64, 0x67, 0x2e, 0x3b, 0x64, 0x6c, 0x2e, 0x3b, 0x64, 0x74,
-0x2e, 0x3b, 0x64, 0x63, 0x2e, 0x3b, 0x64, 0x6a, 0x2e, 0x3b, 0x64, 0x76, 0x2e, 0x3b, 0x64, 0x73, 0x2e, 0x3b, 0x64, 0x69,
-0x75, 0x6d, 0x65, 0x6e, 0x67, 0x65, 0x3b, 0x64, 0x69, 0x6c, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x72,
-0x74, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x65, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6a, 0x6f, 0x75, 0x73, 0x3b, 0x64,
-0x69, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65, 0x3b, 0x64, 0x67,
-0x3b, 0x64, 0x6c, 0x3b, 0x64, 0x74, 0x3b, 0x64, 0x63, 0x3b, 0x64, 0x6a, 0x3b, 0x64, 0x76, 0x3b, 0x64, 0x73, 0x3b, 0x5468,
-0x65e5, 0x3b, 0x5468, 0x4e00, 0x3b, 0x5468, 0x4e8c, 0x3b, 0x5468, 0x4e09, 0x3b, 0x5468, 0x56db, 0x3b, 0x5468, 0x4e94, 0x3b, 0x5468, 0x516d, 0x3b,
-0x661f, 0x671f, 0x65e5, 0x3b, 0x661f, 0x671f, 0x4e00, 0x3b, 0x661f, 0x671f, 0x4e8c, 0x3b, 0x661f, 0x671f, 0x4e09, 0x3b, 0x661f, 0x671f, 0x56db, 0x3b,
-0x661f, 0x671f, 0x4e94, 0x3b, 0x661f, 0x671f, 0x516d, 0x3b, 0x65e5, 0x3b, 0x4e00, 0x3b, 0x4e8c, 0x3b, 0x4e09, 0x3b, 0x56db, 0x3b, 0x4e94, 0x3b,
-0x516d, 0x3b, 0x9031, 0x65e5, 0x3b, 0x9031, 0x4e00, 0x3b, 0x9031, 0x4e8c, 0x3b, 0x9031, 0x4e09, 0x3b, 0x9031, 0x56db, 0x3b, 0x9031, 0x4e94, 0x3b,
-0x9031, 0x516d, 0x3b, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x69, 0x3b, 0x10d,
-0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x3b, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b,
-0x70, 0x6f, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73,
-0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61,
-0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70,
-0x3b, 0x73, 0x3b, 0x4e, 0x3b, 0x50, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x6e, 0x65, 0x3b,
-0x70, 0x6f, 0x3b, 0xfa, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x10d, 0x74, 0x3b, 0x70, 0xe1, 0x3b, 0x73, 0x6f, 0x3b, 0x6e, 0x65,
-0x64, 0x11b, 0x6c, 0x65, 0x3b, 0x70, 0x6f, 0x6e, 0x64, 0x11b, 0x6c, 0xed, 0x3b, 0xfa, 0x74, 0x65, 0x72, 0xfd, 0x3b, 0x73,
-0x74, 0x159, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x74, 0x76, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0xe1, 0x74, 0x65, 0x6b, 0x3b,
-0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x50, 0x3b, 0xda, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53,
-0x3b, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0x61, 0x6e, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72,
-0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf8, 0x72, 0x3b, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x6e, 0x64,
-0x61, 0x67, 0x3b, 0x74, 0x69, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f,
-0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf8, 0x72, 0x64, 0x61, 0x67, 0x3b,
-0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x73, 0xf8, 0x6e, 0x2e, 0x3b, 0x6d,
-0x61, 0x6e, 0x2e, 0x3b, 0x74, 0x69, 0x72, 0x2e, 0x3b, 0x6f, 0x6e, 0x73, 0x2e, 0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x66,
-0x72, 0x65, 0x2e, 0x3b, 0x6c, 0xf8, 0x72, 0x2e, 0x3b, 0x7a, 0x6f, 0x3b, 0x6d, 0x61, 0x3b, 0x64, 0x69, 0x3b, 0x77, 0x6f,
-0x3b, 0x64, 0x6f, 0x3b, 0x76, 0x72, 0x3b, 0x7a, 0x61, 0x3b, 0x7a, 0x6f, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x61,
-0x6e, 0x64, 0x61, 0x67, 0x3b, 0x64, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x77, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61,
-0x67, 0x3b, 0x64, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x76, 0x72, 0x69, 0x6a, 0x64, 0x61, 0x67, 0x3b,
-0x7a, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x5a, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56,
-0x3b, 0x5a, 0x3b, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0x2e, 0x3b, 0x54, 0x75, 0x2e, 0x3b, 0x57, 0x2e, 0x3b, 0x54, 0x68, 0x2e,
-0x3b, 0x46, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0x75, 0x6e, 0x2e, 0x3b, 0x4d, 0x6f, 0x6e, 0x2e, 0x3b, 0x54, 0x75,
-0x65, 0x2e, 0x3b, 0x57, 0x65, 0x64, 0x2e, 0x3b, 0x54, 0x68, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x69, 0x2e, 0x3b, 0x53, 0x61,
-0x74, 0x2e, 0x3b, 0x64, 0x69, 0x3b, 0x6c, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x135, 0x61, 0x3b, 0x76, 0x65,
-0x3b, 0x73, 0x61, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x109, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x6f, 0x3b, 0x6d, 0x61,
-0x72, 0x64, 0x6f, 0x3b, 0x6d, 0x65, 0x72, 0x6b, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x135, 0x61, 0x16d, 0x64, 0x6f, 0x3b, 0x76,
-0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d,
-0x3b, 0x4d, 0x3b, 0x134, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x50, 0x3b, 0x45, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x52,
-0x3b, 0x4c, 0x3b, 0x70, 0xfc, 0x68, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x65, 0x73, 0x6d, 0x61, 0x73, 0x70, 0xe4, 0x65,
-0x76, 0x3b, 0x74, 0x65, 0x69, 0x73, 0x69, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6b, 0x6f, 0x6c, 0x6d, 0x61, 0x70, 0xe4, 0x65,
-0x76, 0x3b, 0x6e, 0x65, 0x6c, 0x6a, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x72, 0x65, 0x65, 0x64, 0x65, 0x3b, 0x6c, 0x61,
-0x75, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x73, 0x75, 0x6e, 0x3b, 0x6d, 0xe1, 0x6e, 0x3b, 0x74, 0xfd, 0x73, 0x3b, 0x6d, 0x69,
-0x6b, 0x3b, 0x68, 0xf3, 0x73, 0x3b, 0x66, 0x72, 0xed, 0x3b, 0x6c, 0x65, 0x79, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64,
-0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e, 0x61, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x74, 0xfd, 0x73, 0x64, 0x61,
-0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x68, 0xf3, 0x73, 0x64, 0x61, 0x67,
-0x75, 0x72, 0x3b, 0x66, 0x72, 0xed, 0x67, 0x67, 0x6a, 0x61, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x65, 0x79, 0x67,
-0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x46, 0x3b,
-0x4c, 0x3b, 0x73, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b, 0x74, 0xfd, 0x73, 0x2e, 0x3b, 0x6d, 0x69, 0x6b,
-0x2e, 0x3b, 0x68, 0xf3, 0x73, 0x2e, 0x3b, 0x66, 0x72, 0xed, 0x2e, 0x3b, 0x6c, 0x65, 0x79, 0x2e, 0x3b, 0x73, 0x75, 0x3b,
-0x6d, 0x61, 0x3b, 0x74, 0x69, 0x3b, 0x6b, 0x65, 0x3b, 0x74, 0x6f, 0x3b, 0x70, 0x65, 0x3b, 0x6c, 0x61, 0x3b, 0x73, 0x75,
-0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x74, 0x69,
-0x69, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b, 0x6f, 0x3b, 0x74, 0x6f,
-0x72, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x70, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6c, 0x61, 0x75, 0x61,
-0x6e, 0x74, 0x61, 0x69, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x4c, 0x3b, 0x73,
-0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69,
-0x6e, 0x61, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69,
-0x69, 0x6b, 0x6b, 0x6f, 0x6e, 0x61, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x70, 0x65, 0x72,
-0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b,
-0x64, 0x69, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x72, 0x2e, 0x3b,
-0x6a, 0x65, 0x75, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x6d, 0x2e, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x6e,
-0x63, 0x68, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63,
-0x72, 0x65, 0x64, 0x69, 0x3b, 0x6a, 0x65, 0x75, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69, 0x3b,
-0x73, 0x61, 0x6d, 0x65, 0x64, 0x69, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53,
-0x3b, 0x73, 0x69, 0x3b, 0x6d, 0x6f, 0x3b, 0x74, 0x69, 0x3b, 0x77, 0x6f, 0x3b, 0x74, 0x6f, 0x3b, 0x66, 0x72, 0x3b, 0x73,
-0x6f, 0x3b, 0x73, 0x6e, 0x65, 0x69, 0x6e, 0x3b, 0x6d, 0x6f, 0x61, 0x6e, 0x64, 0x65, 0x69, 0x3b, 0x74, 0x69, 0x69, 0x73,
-0x64, 0x65, 0x69, 0x3b, 0x77, 0x6f, 0x61, 0x6e, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x74, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x73,
-0x64, 0x65, 0x69, 0x3b, 0x66, 0x72, 0x65, 0x65, 0x64, 0x3b, 0x73, 0x6e, 0x65, 0x6f, 0x6e, 0x3b, 0x44, 0x69, 0x44, 0x3b,
-0x44, 0x69, 0x4c, 0x3b, 0x44, 0x69, 0x4d, 0x3b, 0x44, 0x69, 0x43, 0x3b, 0x44, 0x69, 0x61, 0x3b, 0x44, 0x69, 0x68, 0x3b,
-0x44, 0x69, 0x53, 0x3b, 0x44, 0x69, 0x44, 0xf2, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x4c, 0x75,
-0x61, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x4d, 0xe0, 0x69, 0x72, 0x74, 0x3b, 0x44, 0x69, 0x43, 0x69, 0x61, 0x64, 0x61, 0x69,
-0x6e, 0x3b, 0x44, 0x69, 0x61, 0x72, 0x44, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x68, 0x41, 0x6f, 0x69, 0x6e, 0x65,
-0x3b, 0x44, 0x69, 0x53, 0x61, 0x74, 0x68, 0x61, 0x69, 0x72, 0x6e, 0x65, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x43,
-0x3b, 0x41, 0x3b, 0x48, 0x3b, 0x53, 0x3b, 0x44, 0x6f, 0x6d, 0x2e, 0x3b, 0x4c, 0x75, 0x6e, 0x73, 0x3b, 0x4d, 0x61, 0x72,
-0x2e, 0x3b, 0x4d, 0xe9, 0x72, 0x2e, 0x3b, 0x58, 0x6f, 0x76, 0x2e, 0x3b, 0x56, 0x65, 0x6e, 0x2e, 0x3b, 0x53, 0xe1, 0x62,
-0x2e, 0x3b, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65,
-0x73, 0x3b, 0x4d, 0xe9, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3b, 0x58, 0x6f, 0x76, 0x65, 0x73, 0x3b, 0x56, 0x65, 0x6e,
-0x72, 0x65, 0x73, 0x3b, 0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x58,
-0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b,
-0x6d, 0xe9, 0x72, 0x2e, 0x3b, 0x78, 0x6f, 0x76, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x3b,
-0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b,
-0x6d, 0xe9, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3b, 0x78, 0x6f, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x65, 0x6e, 0x72, 0x65,
-0x73, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x64, 0x2e, 0x3b, 0x6c, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x6d, 0x2e,
-0x3b, 0x78, 0x2e, 0x3b, 0x76, 0x2e, 0x3b, 0x73, 0x2e, 0x3b, 0x10d9, 0x10d5, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x3b, 0x10e1, 0x10d0,
-0x10db, 0x3b, 0x10dd, 0x10d7, 0x10ee, 0x3b, 0x10ee, 0x10e3, 0x10d7, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x3b, 0x10d9, 0x10d5,
-0x10d8, 0x10e0, 0x10d0, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x10e8, 0x10d0, 0x10d1, 0x10d0,
-0x10d7, 0x10d8, 0x3b, 0x10dd, 0x10d7, 0x10ee, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10ee, 0x10e3, 0x10d7, 0x10e8, 0x10d0, 0x10d1, 0x10d0,
-0x10d7, 0x10d8, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x10d0, 0x10e1, 0x10d9, 0x10d4, 0x10d5, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b,
-0x10d9, 0x3b, 0x10dd, 0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b, 0x10ee, 0x3b, 0x10de, 0x3b, 0x10e8, 0x3b, 0x53, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b,
-0x44, 0x69, 0x3b, 0x4d, 0x69, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x3b, 0x53, 0x6f, 0x6e, 0x6e, 0x74,
-0x61, 0x67, 0x3b, 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x44, 0x69, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x4d,
-0x69, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x46,
-0x72, 0x65, 0x69, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x44,
-0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x53, 0x3b, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e,
-0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x6f, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x39a, 0x3c5, 0x3c1,
-0x3b, 0x394, 0x3b5, 0x3c5, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3b, 0x3a0, 0x3ad, 0x3bc, 0x3b, 0x3a0, 0x3b1, 0x3c1,
-0x3b, 0x3a3, 0x3ac, 0x3b2, 0x3b, 0x39a, 0x3c5, 0x3c1, 0x3b9, 0x3b1, 0x3ba, 0x3ae, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3c4, 0x3ad, 0x3c1, 0x3b1,
-0x3b, 0x3a4, 0x3c1, 0x3af, 0x3c4, 0x3b7, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3ac, 0x3c1, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3ad, 0x3bc, 0x3c0, 0x3c4,
-0x3b7, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b1, 0x3c3, 0x3ba, 0x3b5, 0x3c5, 0x3ae, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x3b2, 0x3b1, 0x3c4, 0x3bf, 0x3b,
-0x39a, 0x3b, 0x394, 0x3b, 0x3a4, 0x3b, 0x3a4, 0x3b, 0x3a0, 0x3b, 0x3a0, 0x3b, 0x3a3, 0x3b, 0x73, 0x61, 0x70, 0x3b, 0x61, 0x74,
-0x61, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x69, 0x6e, 0x3b, 0x73, 0x69, 0x73, 0x3b, 0x74, 0x61, 0x6c, 0x3b, 0x61, 0x72,
-0x66, 0x3b, 0x73, 0x61, 0x70, 0x61, 0x61, 0x74, 0x3b, 0x61, 0x74, 0x61, 0x61, 0x73, 0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72,
-0x6e, 0x65, 0x71, 0x3b, 0x6d, 0x61, 0x72, 0x6c, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x70, 0x69,
-0x6e, 0x67, 0x61, 0x73, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x73, 0x69, 0x73, 0x61, 0x6d, 0x61,
-0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x61, 0x6e, 0x6e, 0x67, 0x6f,
-0x72, 0x6e, 0x65, 0x71, 0x3b, 0x61, 0x72, 0x66, 0x69, 0x6e, 0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b,
-0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0xab0, 0xab5, 0xabf, 0x3b, 0xab8, 0xacb,
-0xaae, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0x3b, 0xaac, 0xac1, 0xaa7, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd,
-0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0x3b, 0xab0, 0xab5, 0xabf, 0xab5, 0xabe, 0xab0, 0x3b, 0xab8, 0xacb, 0xaae, 0xab5, 0xabe, 0xab0, 0x3b,
-0xaae, 0xa82, 0xa97, 0xab3, 0xab5, 0xabe, 0xab0, 0x3b, 0xaac, 0xac1, 0xaa7, 0xab5, 0xabe, 0xab0, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0xab5,
-0xabe, 0xab0, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd, 0xab0, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab5, 0xabe, 0xab0, 0x3b, 0xab0,
-0x3b, 0xab8, 0xacb, 0x3b, 0xaae, 0xa82, 0x3b, 0xaac, 0xac1, 0x3b, 0xa97, 0xac1, 0x3b, 0xab6, 0xac1, 0x3b, 0xab6, 0x3b, 0x4c, 0x61,
-0x68, 0x3b, 0x4c, 0x69, 0x74, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x4a, 0x75,
-0x6d, 0x3b, 0x41, 0x73, 0x61, 0x3b, 0x4c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x4c, 0x69, 0x74, 0x69, 0x6e, 0x69, 0x6e,
-0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x4c, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d,
-0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x6d, 0x61, 0x2bc, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x3b, 0x4c, 0x3b,
-0x4c, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d0, 0x5f3, 0x3b, 0x5d9,
-0x5d5, 0x5dd, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d2, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d3, 0x5f3, 0x3b,
-0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d4, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0x3b, 0x5d9, 0x5d5,
-0x5dd, 0x20, 0x5e8, 0x5d0, 0x5e9, 0x5d5, 0x5df, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20,
-0x5e9, 0x5dc, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20,
-0x5d7, 0x5de, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9,
-0x5d1, 0x5ea, 0x3b, 0x5d0, 0x5f3, 0x3b, 0x5d1, 0x5f3, 0x3b, 0x5d2, 0x5f3, 0x3b, 0x5d3, 0x5f3, 0x3b, 0x5d4, 0x5f3, 0x3b, 0x5d5, 0x5f3,
-0x3b, 0x5e9, 0x5f3, 0x3b, 0x930, 0x935, 0x93f, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927,
-0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x3b, 0x930, 0x935, 0x93f, 0x935,
-0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941,
-0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e,
-0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x930, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b,
-0x917, 0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x3b, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x65, 0x3b, 0x43, 0x73,
-0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x6f, 0x3b, 0x76, 0x61, 0x73, 0xe1, 0x72, 0x6e, 0x61, 0x70, 0x3b, 0x68, 0xe9, 0x74, 0x66,
-0x151, 0x3b, 0x6b, 0x65, 0x64, 0x64, 0x3b, 0x73, 0x7a, 0x65, 0x72, 0x64, 0x61, 0x3b, 0x63, 0x73, 0xfc, 0x74, 0xf6, 0x72,
-0x74, 0xf6, 0x6b, 0x3b, 0x70, 0xe9, 0x6e, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x7a, 0x6f, 0x6d, 0x62, 0x61, 0x74, 0x3b, 0x56,
-0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x3b, 0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x3b, 0x73, 0x75, 0x6e, 0x2e,
-0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b, 0xfe, 0x72, 0x69, 0x2e, 0x3b, 0x6d, 0x69, 0xf0, 0x2e, 0x3b, 0x66, 0x69, 0x6d, 0x2e,
-0x3b, 0x66, 0xf6, 0x73, 0x2e, 0x3b, 0x6c, 0x61, 0x75, 0x2e, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75,
-0x72, 0x3b, 0x6d, 0xe1, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0xfe, 0x72, 0x69, 0xf0, 0x6a, 0x75, 0x64, 0x61,
-0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0xf0, 0x76, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x69, 0x6d,
-0x6d, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0xf6, 0x73, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b,
-0x6c, 0x61, 0x75, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0xde, 0x3b, 0x4d, 0x3b,
-0x46, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x4d, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61,
-0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4d, 0x69, 0x6e, 0x67, 0x67, 0x75,
-0x3b, 0x53, 0x65, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b,
-0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x3b, 0x4d, 0x3b, 0x53,
-0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d,
-0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x6a, 0x6f, 0x76, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x3b, 0x64,
-0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65,
-0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x64, 0x69, 0x3b, 0x6a, 0x6f, 0x76, 0x65, 0x64, 0x69, 0x3b,
-0x76, 0x65, 0x6e, 0x65, 0x72, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x62, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x64, 0x3b, 0x6c, 0x3b,
-0x6d, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x76, 0x3b, 0x73, 0x3b, 0x44, 0x6f, 0x6d, 0x68, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x3b,
-0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x43, 0xe9, 0x61, 0x64, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x3b, 0x41, 0x6f, 0x69, 0x6e,
-0x65, 0x3b, 0x53, 0x61, 0x74, 0x68, 0x3b, 0x44, 0xe9, 0x20, 0x44, 0x6f, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x67, 0x68, 0x3b,
-0x44, 0xe9, 0x20, 0x4c, 0x75, 0x61, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x44, 0xe9,
-0x20, 0x43, 0xe9, 0x61, 0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b,
-0x44, 0xe9, 0x20, 0x68, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x44, 0xe9, 0x20, 0x53, 0x61, 0x74, 0x68, 0x61, 0x69, 0x72,
-0x6e, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x44, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x3b,
-0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x67, 0x69, 0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x3b,
-0x73, 0x61, 0x62, 0x3b, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0xec, 0x3b,
-0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x64, 0xec, 0x3b, 0x67, 0x69,
-0x6f, 0x76, 0x65, 0x64, 0xec, 0x3b, 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64, 0xec, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f,
-0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x65e5, 0x3b, 0x6708, 0x3b, 0x706b,
-0x3b, 0x6c34, 0x3b, 0x6728, 0x3b, 0x91d1, 0x3b, 0x571f, 0x3b, 0x65e5, 0x66dc, 0x65e5, 0x3b, 0x6708, 0x66dc, 0x65e5, 0x3b, 0x706b, 0x66dc, 0x65e5,
-0x3b, 0x6c34, 0x66dc, 0x65e5, 0x3b, 0x6728, 0x66dc, 0x65e5, 0x3b, 0x91d1, 0x66dc, 0x65e5, 0x3b, 0x571f, 0x66dc, 0x65e5, 0x3b, 0x41, 0x68, 0x61,
-0x64, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75,
-0x6d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x65, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c,
-0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
-0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53,
-0x3b, 0xcad, 0xcbe, 0xca8, 0xcc1, 0x3b, 0xcb8, 0xccb, 0xcae, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0x3b, 0xcac, 0xcc1, 0xca7, 0x3b, 0xc97,
-0xcc1, 0xcb0, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0x3b, 0xcb6, 0xca8, 0xcbf, 0x3b, 0xcad, 0xcbe, 0xca8, 0xcc1, 0xcb5, 0xcbe,
-0xcb0, 0x3b, 0xcb8, 0xccb, 0xcae, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcac, 0xcc1, 0xca7,
-0xcb5, 0xcbe, 0xcb0, 0x3b, 0xc97, 0xcc1, 0xcb0, 0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0xcb5, 0xcbe, 0xcb0,
-0x3b, 0xcb6, 0xca8, 0xcbf, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcad, 0xcbe, 0x3b, 0xcb8, 0xccb, 0x3b, 0xcae, 0xc82, 0x3b, 0xcac, 0xcc1, 0x3b,
-0xc97, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0x3b, 0xcb6, 0x3b, 0x622, 0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698, 0x654, 0x646, 0x62f, 0x655,
-0x631, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x6c6, 0x645, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628,
-0x631, 0x620, 0x633, 0x648, 0x627, 0x631, 0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648, 0x627, 0x631, 0x3b, 0x627, 0x64e,
-0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698, 0x654, 0x646, 0x62f, 0x631, 0x655, 0x631, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x6c6, 0x645,
-0x648, 0x627, 0x631, 0x3b, 0x628, 0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633, 0x648, 0x627, 0x631, 0x3b, 0x62c,
-0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648, 0x627, 0x631, 0x3b, 0x627, 0x3b, 0x698, 0x3b, 0x628, 0x3b, 0x628, 0x3b, 0x628, 0x3b,
-0x62c, 0x3b, 0x628, 0x3b, 0x436, 0x441, 0x3b, 0x434, 0x441, 0x3b, 0x441, 0x441, 0x3b, 0x441, 0x440, 0x3b, 0x431, 0x441, 0x3b, 0x436,
-0x43c, 0x3b, 0x441, 0x431, 0x3b, 0x436, 0x435, 0x43a, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x434, 0x4af, 0x439, 0x441, 0x435, 0x43d,
-0x431, 0x456, 0x3b, 0x441, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x441, 0x4d9, 0x440, 0x441, 0x435, 0x43d, 0x431, 0x456,
-0x3b, 0x431, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x436, 0x4b1, 0x43c, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x431, 0x456,
-0x3b, 0x416, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x421, 0x3b, 0x411, 0x3b, 0x416, 0x3b, 0x421, 0x3b, 0x63, 0x79, 0x75, 0x2e, 0x3b,
-0x6d, 0x62, 0x65, 0x2e, 0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b,
-0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0x3b, 0x4b, 0x75, 0x20, 0x63, 0x79, 0x75, 0x6d, 0x77, 0x65, 0x72,
-0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61,
-0x62, 0x69, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4b, 0x75, 0x77,
-0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4b,
-0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x436, 0x435, 0x43a, 0x2e, 0x3b, 0x434,
-0x4af, 0x439, 0x2e, 0x3b, 0x448, 0x435, 0x439, 0x448, 0x2e, 0x3b, 0x448, 0x430, 0x440, 0x448, 0x2e, 0x3b, 0x431, 0x435, 0x439, 0x448,
-0x2e, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x438, 0x448, 0x43c, 0x2e, 0x3b, 0x436, 0x435, 0x43a, 0x448, 0x435, 0x43c, 0x431, 0x438,
-0x3b, 0x434, 0x4af, 0x439, 0x448, 0x4e9, 0x43c, 0x431, 0x4af, 0x3b, 0x448, 0x435, 0x439, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x448,
-0x430, 0x440, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x431, 0x435, 0x439, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x436, 0x443, 0x43c,
-0x430, 0x3b, 0x438, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x416, 0x3b, 0x414, 0x3b, 0x428, 0x3b, 0x428, 0x3b, 0x411, 0x3b, 0x416,
-0x3b, 0x418, 0x3b, 0xc77c, 0x3b, 0xc6d4, 0x3b, 0xd654, 0x3b, 0xc218, 0x3b, 0xbaa9, 0x3b, 0xae08, 0x3b, 0xd1a0, 0x3b, 0xc77c, 0xc694, 0xc77c,
+static const char16_t days_data[] = {
+0x53, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x3b, 0x4d, 0x6f, 0x6e, 0x64, 0x61, 0x79, 0x3b, 0x54, 0x75, 0x65, 0x73, 0x64, 0x61,
+0x79, 0x3b, 0x57, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61, 0x79, 0x3b, 0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79,
+0x3b, 0x46, 0x72, 0x69, 0x64, 0x61, 0x79, 0x3b, 0x53, 0x61, 0x74, 0x75, 0x72, 0x64, 0x61, 0x79, 0x53, 0x75, 0x6e, 0x3b,
+0x4d, 0x6f, 0x6e, 0x3b, 0x54, 0x75, 0x65, 0x3b, 0x57, 0x65, 0x64, 0x3b, 0x54, 0x68, 0x75, 0x3b, 0x46, 0x72, 0x69, 0x3b,
+0x53, 0x61, 0x74, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x53, 0x37, 0x3b, 0x31, 0x3b,
+0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x44, 0x69, 0x6c, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x57, 0x69, 0x69,
+0x78, 0x61, 0x74, 0x61, 0x3b, 0x51, 0x69, 0x62, 0x78, 0x61, 0x74, 0x61, 0x3b, 0x52, 0x6f, 0x6f, 0x62, 0x69, 0x69, 0x3b,
+0x4b, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x4a, 0x69, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x6e, 0x62,
+0x61, 0x74, 0x61, 0x44, 0x69, 0x6c, 0x3b, 0x57, 0x69, 0x78, 0x3b, 0x51, 0x69, 0x62, 0x3b, 0x52, 0x6f, 0x62, 0x3b, 0x4b,
+0x61, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x53, 0x61, 0x6e, 0x44, 0x3b, 0x57, 0x3b, 0x51, 0x3b, 0x52, 0x3b, 0x4b, 0x3b,
+0x4a, 0x3b, 0x53, 0x53, 0x6f, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x69,
+0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x57, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x6f, 0x6e, 0x64, 0x65,
+0x72, 0x64, 0x61, 0x67, 0x3b, 0x56, 0x72, 0x79, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61, 0x67,
+0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x57, 0x6f, 0x2e, 0x3b, 0x44, 0x6f, 0x2e, 0x3b,
+0x56, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56, 0x3b, 0x53,
+0x65, 0x20, 0x64, 0x69, 0x65, 0x6c, 0x3b, 0x65, 0x20, 0x68, 0xeb, 0x6e, 0xeb, 0x3b, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x74,
+0xeb, 0x3b, 0x65, 0x20, 0x6d, 0xeb, 0x72, 0x6b, 0x75, 0x72, 0xeb, 0x3b, 0x65, 0x20, 0x65, 0x6e, 0x6a, 0x74, 0x65, 0x3b,
+0x65, 0x20, 0x70, 0x72, 0x65, 0x6d, 0x74, 0x65, 0x3b, 0x65, 0x20, 0x73, 0x68, 0x74, 0x75, 0x6e, 0xeb, 0x64, 0x69, 0x65,
+0x3b, 0x68, 0xeb, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0xeb, 0x72, 0x3b, 0x65, 0x6e, 0x6a, 0x3b, 0x70, 0x72, 0x65,
+0x3b, 0x73, 0x68, 0x74, 0x44, 0x69, 0x65, 0x3b, 0x48, 0xeb, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0xeb, 0x72, 0x3b,
+0x45, 0x6e, 0x6a, 0x3b, 0x50, 0x72, 0x65, 0x3b, 0x53, 0x68, 0x74, 0x64, 0x3b, 0x68, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x65,
+0x3b, 0x70, 0x3b, 0x73, 0x68, 0x12a5, 0x1211, 0x12f5, 0x3b, 0x1230, 0x129e, 0x3b, 0x121b, 0x12ad, 0x1230, 0x129e, 0x3b, 0x1228, 0x1261, 0x12d5,
+0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b, 0x1245, 0x12f3, 0x121c, 0x12a5, 0x1211, 0x12f5, 0x3b, 0x1230, 0x129e, 0x3b, 0x121b,
+0x12ad, 0x1230, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b, 0x1245, 0x12f3, 0x121c, 0x12a5, 0x3b,
+0x1230, 0x3b, 0x121b, 0x3b, 0x1228, 0x3b, 0x1210, 0x3b, 0x12d3, 0x3b, 0x1245, 0x627, 0x644, 0x623, 0x62d, 0x62f, 0x3b, 0x627, 0x644, 0x627,
+0x62b, 0x646, 0x64a, 0x646, 0x3b, 0x627, 0x644, 0x62b, 0x644, 0x627, 0x62b, 0x627, 0x621, 0x3b, 0x627, 0x644, 0x623, 0x631, 0x628, 0x639,
+0x627, 0x621, 0x3b, 0x627, 0x644, 0x62e, 0x645, 0x64a, 0x633, 0x3b, 0x627, 0x644, 0x62c, 0x645, 0x639, 0x629, 0x3b, 0x627, 0x644, 0x633,
+0x628, 0x62a, 0x62d, 0x3b, 0x646, 0x3b, 0x62b, 0x3b, 0x631, 0x3b, 0x62e, 0x3b, 0x62c, 0x3b, 0x633, 0x56f, 0x56b, 0x580, 0x561, 0x56f,
+0x56b, 0x3b, 0x565, 0x580, 0x56f, 0x578, 0x582, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x565, 0x580, 0x565, 0x584, 0x577, 0x561, 0x562,
+0x569, 0x56b, 0x3b, 0x579, 0x578, 0x580, 0x565, 0x584, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x570, 0x56b, 0x576, 0x563, 0x577, 0x561,
+0x562, 0x569, 0x56b, 0x3b, 0x578, 0x582, 0x580, 0x562, 0x561, 0x569, 0x3b, 0x577, 0x561, 0x562, 0x561, 0x569, 0x56f, 0x56b, 0x580, 0x3b,
+0x565, 0x580, 0x56f, 0x3b, 0x565, 0x580, 0x584, 0x3b, 0x579, 0x580, 0x584, 0x3b, 0x570, 0x576, 0x563, 0x3b, 0x578, 0x582, 0x580, 0x3b,
+0x577, 0x562, 0x569, 0x53f, 0x3b, 0x535, 0x3b, 0x535, 0x3b, 0x549, 0x3b, 0x540, 0x3b, 0x548, 0x3b, 0x547, 0x9a6, 0x9c7, 0x993, 0x9ac,
+0x9be, 0x9f0, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ac,
+0x9c1, 0x9a7, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b6, 0x9c1,
+0x995, 0x9cd, 0x9f0, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9f0, 0x9a6, 0x9c7, 0x993, 0x3b, 0x9b8, 0x9cb, 0x9ae,
+0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0,
+0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9a6, 0x3b, 0x9b8, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x3b, 0x9ac, 0x3b, 0x9b6, 0x3b, 0x9b6, 0x62, 0x61, 0x7a,
+0x61, 0x72, 0x3b, 0x62, 0x61, 0x7a, 0x61, 0x72, 0x20, 0x65, 0x72, 0x74, 0x259, 0x73, 0x69, 0x3b, 0xe7, 0x259, 0x72, 0x15f,
+0x259, 0x6e, 0x62, 0x259, 0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62, 0x259,
+0x3b, 0x63, 0xfc, 0x6d, 0x259, 0x20, 0x61, 0x78, 0x15f, 0x61, 0x6d, 0x131, 0x3b, 0x63, 0xfc, 0x6d, 0x259, 0x3b, 0x15f, 0x259,
+0x6e, 0x62, 0x259, 0x42, 0x2e, 0x3b, 0x42, 0x2e, 0x45, 0x2e, 0x3b, 0xc7, 0x2e, 0x41, 0x2e, 0x3b, 0xc7, 0x2e, 0x3b, 0x43,
+0x2e, 0x41, 0x2e, 0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x42, 0x2e, 0x3b, 0x42, 0x2e, 0x65, 0x2e, 0x3b, 0xc7, 0x2e, 0x61,
+0x2e, 0x3b, 0xc7, 0x2e, 0x3b, 0x43, 0x2e, 0x61, 0x2e, 0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x431, 0x430, 0x437, 0x430, 0x440,
+0x3b, 0x431, 0x430, 0x437, 0x430, 0x440, 0x20, 0x435, 0x440, 0x442, 0x4d9, 0x441, 0x438, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43d,
+0x431, 0x4d9, 0x20, 0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x3b, 0x4b9,
+0x4af, 0x43c, 0x4d9, 0x20, 0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9, 0x3b, 0x448, 0x4d9, 0x43d, 0x431,
+0x4d9, 0x411, 0x2e, 0x3b, 0x411, 0x2e, 0x415, 0x2e, 0x3b, 0x427, 0x2e, 0x410, 0x2e, 0x3b, 0x427, 0x2e, 0x3b, 0x4b8, 0x2e, 0x410,
+0x2e, 0x3b, 0x4b8, 0x2e, 0x3b, 0x428, 0x2e, 0x69, 0x67, 0x61, 0x6e, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x6c,
+0x65, 0x68, 0x65, 0x6e, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x72, 0x74, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65,
+0x61, 0x7a, 0x6b, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x73, 0x74, 0x65, 0x67, 0x75, 0x6e, 0x61, 0x3b, 0x6f, 0x73, 0x74, 0x69,
+0x72, 0x61, 0x6c, 0x61, 0x3b, 0x6c, 0x61, 0x72, 0x75, 0x6e, 0x62, 0x61, 0x74, 0x61, 0x69, 0x67, 0x2e, 0x3b, 0x61, 0x6c,
+0x2e, 0x3b, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x7a, 0x2e, 0x3b, 0x6f, 0x67, 0x2e, 0x3b, 0x6f, 0x72, 0x2e, 0x3b, 0x6c, 0x72,
+0x2e, 0x49, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x4c, 0x9b0, 0x9ac, 0x9bf, 0x9ac, 0x9be, 0x9b0,
+0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c1, 0x9a7,
+0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd,
+0x9b0, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x9b0, 0x9ac, 0x9bf, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae,
+0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x3b, 0x9b6, 0x9c1,
+0x995, 0x9cd, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x9c1, 0x3b, 0x9ac, 0x9c3, 0x3b,
+0x9b6, 0x9c1, 0x3b, 0x9b6, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72,
+0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f,
+0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b,
+0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b,
+0xf58, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b,
+0x3b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0x3b, 0xf49, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72,
+0xf62, 0x3b, 0xf63, 0xfb7, 0xf42, 0x3b, 0xf55, 0xf74, 0xf62, 0x3b, 0xf66, 0xf44, 0xfb6, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x3b, 0xf49,
+0xf72, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x7a, 0x68, 0x3b, 0x4d, 0x65, 0x72, 0x63,
+0x2bc, 0x68, 0x65, 0x72, 0x3b, 0x59, 0x61, 0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x53, 0x61, 0x64,
+0x6f, 0x72, 0x6e, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x2e, 0x3b, 0x4d, 0x65, 0x72, 0x2e,
+0x3b, 0x59, 0x61, 0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x2e, 0x3b, 0x53, 0x61, 0x64, 0x2e, 0x53, 0x75, 0x3b, 0x4c, 0x3b,
+0x4d, 0x7a, 0x3b, 0x4d, 0x63, 0x3b, 0x59, 0x3b, 0x47, 0x3b, 0x53, 0x61, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44f, 0x3b, 0x43f,
+0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440,
+0x44f, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x44a, 0x440, 0x442, 0x44a, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x44a, 0x43a, 0x3b,
+0x441, 0x44a, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x442,
+0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x43d, 0x3b, 0x43f, 0x3b, 0x432, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x1010,
+0x1014, 0x1004, 0x103a, 0x1039, 0x1002, 0x1014, 0x103d, 0x1031, 0x3b, 0x1010, 0x1014, 0x1004, 0x103a, 0x1039, 0x101c, 0x102c, 0x3b, 0x1021, 0x1004, 0x103a,
+0x1039, 0x1002, 0x102b, 0x3b, 0x1017, 0x102f, 0x1012, 0x1039, 0x1013, 0x101f, 0x1030, 0x1038, 0x3b, 0x1000, 0x103c, 0x102c, 0x101e, 0x1015, 0x1010, 0x1031,
+0x1038, 0x3b, 0x101e, 0x1031, 0x102c, 0x1000, 0x103c, 0x102c, 0x3b, 0x1005, 0x1014, 0x1031, 0x1010, 0x3b, 0x1010, 0x3b, 0x1021, 0x3b, 0x1017, 0x3b,
+0x1000, 0x3b, 0x101e, 0x3b, 0x1005, 0x43d, 0x44f, 0x434, 0x437, 0x435, 0x43b, 0x44f, 0x3b, 0x43f, 0x430, 0x43d, 0x44f, 0x434, 0x437, 0x435,
+0x43b, 0x430, 0x43a, 0x3b, 0x430, 0x45e, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x430, 0x434, 0x430, 0x3b, 0x447,
+0x430, 0x446, 0x432, 0x435, 0x440, 0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x456, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430,
+0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x430, 0x45e, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x446, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431,
+0x43d, 0x3b, 0x43f, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799,
+0x3b, 0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a,
+0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5, 0x179a, 0x17cd, 0x17a2, 0x17b6,
+0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x17d0, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1796,
+0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b,
+0x179f, 0x17c5, 0x179a, 0x17cd, 0x17a2, 0x17b6, 0x1791, 0x17b7, 0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2,
+0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f,
+0x17c5, 0x179a, 0x17cd, 0x17a2, 0x3b, 0x1785, 0x3b, 0x17a2, 0x3b, 0x1796, 0x3b, 0x1796, 0x3b, 0x179f, 0x3b, 0x179f, 0x64, 0x69, 0x75, 0x6d,
+0x65, 0x6e, 0x67, 0x65, 0x3b, 0x64, 0x69, 0x6c, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x72, 0x74, 0x73,
+0x3b, 0x64, 0x69, 0x6d, 0x65, 0x63, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6a, 0x6f, 0x75, 0x73, 0x3b, 0x64, 0x69, 0x76,
+0x65, 0x6e, 0x64, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65, 0x64, 0x67, 0x2e, 0x3b, 0x64,
+0x6c, 0x2e, 0x3b, 0x64, 0x74, 0x2e, 0x3b, 0x64, 0x63, 0x2e, 0x3b, 0x64, 0x6a, 0x2e, 0x3b, 0x64, 0x76, 0x2e, 0x3b, 0x64,
+0x73, 0x2e, 0x64, 0x67, 0x3b, 0x64, 0x6c, 0x3b, 0x64, 0x74, 0x3b, 0x64, 0x63, 0x3b, 0x64, 0x6a, 0x3b, 0x64, 0x76, 0x3b,
+0x64, 0x73, 0x661f, 0x671f, 0x65e5, 0x3b, 0x661f, 0x671f, 0x4e00, 0x3b, 0x661f, 0x671f, 0x4e8c, 0x3b, 0x661f, 0x671f, 0x4e09, 0x3b, 0x661f, 0x671f,
+0x56db, 0x3b, 0x661f, 0x671f, 0x4e94, 0x3b, 0x661f, 0x671f, 0x516d, 0x5468, 0x65e5, 0x3b, 0x5468, 0x4e00, 0x3b, 0x5468, 0x4e8c, 0x3b, 0x5468, 0x4e09,
+0x3b, 0x5468, 0x56db, 0x3b, 0x5468, 0x4e94, 0x3b, 0x5468, 0x516d, 0x65e5, 0x3b, 0x4e00, 0x3b, 0x4e8c, 0x3b, 0x4e09, 0x3b, 0x56db, 0x3b, 0x4e94,
+0x3b, 0x516d, 0x9031, 0x65e5, 0x3b, 0x9031, 0x4e00, 0x3b, 0x9031, 0x4e8c, 0x3b, 0x9031, 0x4e09, 0x3b, 0x9031, 0x56db, 0x3b, 0x9031, 0x4e94, 0x3b,
+0x9031, 0x516d, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a,
+0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65,
+0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x6e,
+0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x69, 0x3b, 0x10d, 0x65, 0x74, 0x3b, 0x70,
+0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x4e,
+0x3b, 0x50, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53, 0x6e, 0x65, 0x64, 0x11b, 0x6c, 0x65, 0x3b, 0x70,
+0x6f, 0x6e, 0x64, 0x11b, 0x6c, 0xed, 0x3b, 0xfa, 0x74, 0x65, 0x72, 0xfd, 0x3b, 0x73, 0x74, 0x159, 0x65, 0x64, 0x61, 0x3b,
+0x10d, 0x74, 0x76, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0xe1, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61,
+0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0xfa, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x10d, 0x74, 0x3b, 0x70, 0xe1, 0x3b, 0x73, 0x6f,
+0x4e, 0x3b, 0x50, 0x3b, 0xda, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b,
+0x6d, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x69, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61,
+0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf8, 0x72,
+0x64, 0x61, 0x67, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0x61, 0x6e, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74,
+0x6f, 0x72, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf8, 0x72, 0x73, 0xf8, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x6e, 0x2e, 0x3b,
+0x74, 0x69, 0x72, 0x2e, 0x3b, 0x6f, 0x6e, 0x73, 0x2e, 0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x66, 0x72, 0x65, 0x2e, 0x3b,
+0x6c, 0xf8, 0x72, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x4c, 0x7a, 0x6f, 0x6e,
+0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x64, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b,
+0x77, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x64, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x76,
+0x72, 0x69, 0x6a, 0x64, 0x61, 0x67, 0x3b, 0x7a, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x7a, 0x6f, 0x3b, 0x6d, 0x61,
+0x3b, 0x64, 0x69, 0x3b, 0x77, 0x6f, 0x3b, 0x64, 0x6f, 0x3b, 0x76, 0x72, 0x3b, 0x7a, 0x61, 0x5a, 0x3b, 0x4d, 0x3b, 0x44,
+0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56, 0x3b, 0x5a, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0x2e, 0x3b, 0x54, 0x75, 0x2e, 0x3b, 0x57,
+0x2e, 0x3b, 0x54, 0x68, 0x2e, 0x3b, 0x46, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x75, 0x6e, 0x2e, 0x3b, 0x4d, 0x6f, 0x6e,
+0x2e, 0x3b, 0x54, 0x75, 0x65, 0x2e, 0x3b, 0x57, 0x65, 0x64, 0x2e, 0x3b, 0x54, 0x68, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x69,
+0x2e, 0x3b, 0x53, 0x61, 0x74, 0x2e, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x109, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x6f, 0x3b,
+0x6d, 0x61, 0x72, 0x64, 0x6f, 0x3b, 0x6d, 0x65, 0x72, 0x6b, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x135, 0x61, 0x16d, 0x64, 0x6f,
+0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x64, 0x69, 0x3b, 0x6c,
+0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x135, 0x61, 0x3b, 0x76, 0x65, 0x3b, 0x73, 0x61, 0x44, 0x3b, 0x4c, 0x3b,
+0x4d, 0x3b, 0x4d, 0x3b, 0x134, 0x3b, 0x56, 0x3b, 0x53, 0x70, 0xfc, 0x68, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x65, 0x73,
+0x6d, 0x61, 0x73, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x74, 0x65, 0x69, 0x73, 0x69, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6b, 0x6f,
+0x6c, 0x6d, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6e, 0x65, 0x6c, 0x6a, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x72, 0x65,
+0x65, 0x64, 0x65, 0x3b, 0x6c, 0x61, 0x75, 0x70, 0xe4, 0x65, 0x76, 0x50, 0x3b, 0x45, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4e,
+0x3b, 0x52, 0x3b, 0x4c, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e, 0x61, 0x64,
+0x61, 0x67, 0x75, 0x72, 0x3b, 0x74, 0xfd, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0x6b, 0x75, 0x64, 0x61,
+0x67, 0x75, 0x72, 0x3b, 0x68, 0xf3, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x72, 0xed, 0x67, 0x67, 0x6a, 0x61,
+0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x65, 0x79, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72, 0x73, 0x75, 0x6e,
+0x3b, 0x6d, 0xe1, 0x6e, 0x3b, 0x74, 0xfd, 0x73, 0x3b, 0x6d, 0x69, 0x6b, 0x3b, 0x68, 0xf3, 0x73, 0x3b, 0x66, 0x72, 0xed,
+0x3b, 0x6c, 0x65, 0x79, 0x73, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b, 0x74, 0xfd, 0x73, 0x2e, 0x3b, 0x6d,
+0x69, 0x6b, 0x2e, 0x3b, 0x68, 0xf3, 0x73, 0x2e, 0x3b, 0x66, 0x72, 0xed, 0x2e, 0x3b, 0x6c, 0x65, 0x79, 0x2e, 0x53, 0x3b,
+0x4d, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x46, 0x3b, 0x4c, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69,
+0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x6b,
+0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b, 0x6f, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x70,
+0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x73, 0x75, 0x6e,
+0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61,
+0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b,
+0x6b, 0x6f, 0x6e, 0x61, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x70, 0x65, 0x72, 0x6a, 0x61,
+0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x73, 0x75, 0x3b,
+0x6d, 0x61, 0x3b, 0x74, 0x69, 0x3b, 0x6b, 0x65, 0x3b, 0x74, 0x6f, 0x3b, 0x70, 0x65, 0x3b, 0x6c, 0x61, 0x53, 0x3b, 0x4d,
+0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x4c, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x3b, 0x6c,
+0x75, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65, 0x64, 0x69, 0x3b,
+0x6a, 0x65, 0x75, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x65, 0x64,
+0x69, 0x64, 0x69, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x72, 0x2e,
+0x3b, 0x6a, 0x65, 0x75, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x6d, 0x2e, 0x44, 0x3b, 0x4c, 0x3b, 0x4d,
+0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x73, 0x6e, 0x65, 0x69, 0x6e, 0x3b, 0x6d, 0x6f, 0x61, 0x6e, 0x64, 0x65,
+0x69, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x77, 0x6f, 0x61, 0x6e, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x74,
+0x6f, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x66, 0x72, 0x65, 0x65, 0x64, 0x3b, 0x73, 0x6e, 0x65, 0x6f,
+0x6e, 0x73, 0x69, 0x3b, 0x6d, 0x6f, 0x3b, 0x74, 0x69, 0x3b, 0x77, 0x6f, 0x3b, 0x74, 0x6f, 0x3b, 0x66, 0x72, 0x3b, 0x73,
+0x6f, 0x44, 0x69, 0x44, 0xf2, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x4c, 0x75, 0x61, 0x69, 0x6e,
+0x3b, 0x44, 0x69, 0x4d, 0xe0, 0x69, 0x72, 0x74, 0x3b, 0x44, 0x69, 0x43, 0x69, 0x61, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x44,
+0x69, 0x61, 0x72, 0x44, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x68, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x44, 0x69,
+0x53, 0x61, 0x74, 0x68, 0x61, 0x69, 0x72, 0x6e, 0x65, 0x44, 0x69, 0x44, 0x3b, 0x44, 0x69, 0x4c, 0x3b, 0x44, 0x69, 0x4d,
+0x3b, 0x44, 0x69, 0x43, 0x3b, 0x44, 0x69, 0x61, 0x3b, 0x44, 0x69, 0x68, 0x3b, 0x44, 0x69, 0x53, 0x44, 0x3b, 0x4c, 0x3b,
+0x4d, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x48, 0x3b, 0x53, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e,
+0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0xe9, 0x72, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3b, 0x58, 0x6f,
+0x76, 0x65, 0x73, 0x3b, 0x56, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d,
+0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d, 0xe9, 0x72,
+0x63, 0x6f, 0x72, 0x65, 0x73, 0x3b, 0x78, 0x6f, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x73,
+0xe1, 0x62, 0x61, 0x64, 0x6f, 0x44, 0x6f, 0x6d, 0x2e, 0x3b, 0x4c, 0x75, 0x6e, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b,
+0x4d, 0xe9, 0x72, 0x2e, 0x3b, 0x58, 0x6f, 0x76, 0x2e, 0x3b, 0x56, 0x65, 0x6e, 0x2e, 0x3b, 0x53, 0xe1, 0x62, 0x2e, 0x64,
+0x6f, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0xe9, 0x72, 0x2e, 0x3b, 0x78,
+0x6f, 0x76, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d,
+0x3b, 0x58, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x2e, 0x3b, 0x6c, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x78, 0x2e,
+0x3b, 0x76, 0x2e, 0x3b, 0x73, 0x2e, 0x10d9, 0x10d5, 0x10d8, 0x10e0, 0x10d0, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8,
+0x3b, 0x10e1, 0x10d0, 0x10db, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10dd, 0x10d7, 0x10ee, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8,
+0x3b, 0x10ee, 0x10e3, 0x10d7, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x10d0, 0x10e1, 0x10d9, 0x10d4, 0x10d5, 0x10d8,
+0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x10d9, 0x10d5, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x3b, 0x10dd,
+0x10d7, 0x10ee, 0x3b, 0x10ee, 0x10e3, 0x10d7, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d9, 0x3b, 0x10dd, 0x3b, 0x10e1, 0x3b,
+0x10dd, 0x3b, 0x10ee, 0x3b, 0x10de, 0x3b, 0x10e8, 0x53, 0x6f, 0x6e, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x6f, 0x6e, 0x74, 0x61,
+0x67, 0x3b, 0x44, 0x69, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b,
+0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x74, 0x61, 0x67, 0x3b, 0x53,
+0x61, 0x6d, 0x73, 0x74, 0x61, 0x67, 0x53, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x44, 0x69, 0x3b, 0x4d, 0x69, 0x3b, 0x44, 0x6f,
+0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x69,
+0x2e, 0x3b, 0x44, 0x6f, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x4d,
+0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x53, 0x39a, 0x3c5, 0x3c1, 0x3b9, 0x3b1, 0x3ba, 0x3ae, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3c4, 0x3ad, 0x3c1,
+0x3b1, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3c4, 0x3b7, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3ac, 0x3c1, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3ad, 0x3bc, 0x3c0,
+0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b1, 0x3c3, 0x3ba, 0x3b5, 0x3c5, 0x3ae, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x3b2, 0x3b1, 0x3c4, 0x3bf,
+0x39a, 0x3c5, 0x3c1, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3b, 0x3a0, 0x3ad, 0x3bc, 0x3b,
+0x3a0, 0x3b1, 0x3c1, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x39a, 0x3b, 0x394, 0x3b, 0x3a4, 0x3b, 0x3a4, 0x3b, 0x3a0, 0x3b, 0x3a0, 0x3b, 0x3a3,
+0x73, 0x61, 0x70, 0x61, 0x61, 0x74, 0x3b, 0x61, 0x74, 0x61, 0x61, 0x73, 0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65,
+0x71, 0x3b, 0x6d, 0x61, 0x72, 0x6c, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x70, 0x69, 0x6e, 0x67,
+0x61, 0x73, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x73, 0x69, 0x73, 0x61, 0x6d, 0x61, 0x6e, 0x6e,
+0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x61, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e,
+0x65, 0x71, 0x3b, 0x61, 0x72, 0x66, 0x69, 0x6e, 0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x73, 0x61, 0x70,
+0x3b, 0x61, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x69, 0x6e, 0x3b, 0x73, 0x69, 0x73, 0x3b, 0x74, 0x61, 0x6c,
+0x3b, 0x61, 0x72, 0x66, 0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x41, 0xab0, 0xab5, 0xabf,
+0xab5, 0xabe, 0xab0, 0x3b, 0xab8, 0xacb, 0xaae, 0xab5, 0xabe, 0xab0, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0xab5, 0xabe, 0xab0, 0x3b, 0xaac,
+0xac1, 0xaa7, 0xab5, 0xabe, 0xab0, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd, 0xab0, 0xab5,
+0xabe, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab5, 0xabe, 0xab0, 0xab0, 0xab5, 0xabf, 0x3b, 0xab8, 0xacb, 0xaae, 0x3b, 0xaae, 0xa82, 0xa97,
+0xab3, 0x3b, 0xaac, 0xac1, 0xaa7, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf,
+0xab0, 0x3b, 0xab8, 0xacb, 0x3b, 0xaae, 0xa82, 0x3b, 0xaac, 0xac1, 0x3b, 0xa97, 0xac1, 0x3b, 0xab6, 0xac1, 0x3b, 0xab6, 0x4c, 0x61,
+0x68, 0x61, 0x64, 0x69, 0x3b, 0x4c, 0x69, 0x74, 0x69, 0x6e, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b,
+0x4c, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x6d, 0x61,
+0x2bc, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x4c, 0x61, 0x68, 0x3b, 0x4c, 0x69, 0x74, 0x3b, 0x54, 0x61, 0x6c,
+0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x4c, 0x3b, 0x4c, 0x3b,
+0x54, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x41, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d0, 0x5e9, 0x5d5, 0x5df, 0x3b, 0x5d9,
+0x5d5, 0x5dd, 0x20, 0x5e9, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5dc, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd,
+0x20, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d7, 0x5de, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd,
+0x20, 0x5e9, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d1, 0x5ea, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d0, 0x5f3, 0x3b,
+0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d2, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d3, 0x5f3,
+0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d4, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0x5d0, 0x5f3,
+0x3b, 0x5d1, 0x5f3, 0x3b, 0x5d2, 0x5f3, 0x3b, 0x5d3, 0x5f3, 0x3b, 0x5d4, 0x5f3, 0x3b, 0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5f3, 0x930, 0x935,
+0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e, 0x930, 0x3b,
+0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930,
+0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x930, 0x935, 0x93f, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x902,
+0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928,
+0x93f, 0x930, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x917, 0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x76,
+0x61, 0x73, 0xe1, 0x72, 0x6e, 0x61, 0x70, 0x3b, 0x68, 0xe9, 0x74, 0x66, 0x151, 0x3b, 0x6b, 0x65, 0x64, 0x64, 0x3b, 0x73,
+0x7a, 0x65, 0x72, 0x64, 0x61, 0x3b, 0x63, 0x73, 0xfc, 0x74, 0xf6, 0x72, 0x74, 0xf6, 0x6b, 0x3b, 0x70, 0xe9, 0x6e, 0x74,
+0x65, 0x6b, 0x3b, 0x73, 0x7a, 0x6f, 0x6d, 0x62, 0x61, 0x74, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x65, 0x3b,
+0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x6f, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x3b, 0x43, 0x73, 0x3b,
+0x50, 0x3b, 0x53, 0x7a, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e, 0x75, 0x64,
+0x61, 0x67, 0x75, 0x72, 0x3b, 0xfe, 0x72, 0x69, 0xf0, 0x6a, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0xf0,
+0x76, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x69, 0x6d, 0x6d, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75,
+0x72, 0x3b, 0x66, 0xf6, 0x73, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x61, 0x75, 0x67, 0x61, 0x72, 0x64,
+0x61, 0x67, 0x75, 0x72, 0x73, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b, 0xfe, 0x72, 0x69, 0x2e, 0x3b, 0x6d,
+0x69, 0xf0, 0x2e, 0x3b, 0x66, 0x69, 0x6d, 0x2e, 0x3b, 0x66, 0xf6, 0x73, 0x2e, 0x3b, 0x6c, 0x61, 0x75, 0x2e, 0x53, 0x3b,
+0x4d, 0x3b, 0xde, 0x3b, 0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x4c, 0x4d, 0x69, 0x6e, 0x67, 0x67, 0x75, 0x3b, 0x53, 0x65,
+0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69,
+0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x4d, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6e,
+0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62,
+0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63,
+0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72,
+0x63, 0x75, 0x72, 0x69, 0x64, 0x69, 0x3b, 0x6a, 0x6f, 0x76, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64,
+0x69, 0x3b, 0x73, 0x61, 0x62, 0x62, 0x61, 0x74, 0x6f, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72,
+0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x6a, 0x6f, 0x76, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x64, 0x3b, 0x6c, 0x3b,
+0x6d, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x76, 0x3b, 0x73, 0x44, 0xe9, 0x20, 0x44, 0x6f, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x67,
+0x68, 0x3b, 0x44, 0xe9, 0x20, 0x4c, 0x75, 0x61, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b,
+0x44, 0xe9, 0x20, 0x43, 0xe9, 0x61, 0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x64, 0x61, 0x6f, 0x69,
+0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x68, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x44, 0xe9, 0x20, 0x53, 0x61, 0x74, 0x68, 0x61,
+0x69, 0x72, 0x6e, 0x44, 0x6f, 0x6d, 0x68, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x3b, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x43,
+0xe9, 0x61, 0x64, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x3b, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x68, 0x44,
+0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x44, 0x3b, 0x41, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x63, 0x61,
+0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x65, 0x72, 0x63,
+0x6f, 0x6c, 0x65, 0x64, 0xec, 0x3b, 0x67, 0x69, 0x6f, 0x76, 0x65, 0x64, 0xec, 0x3b, 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64,
+0xec, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b,
+0x6d, 0x65, 0x72, 0x3b, 0x67, 0x69, 0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d,
+0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x65e5, 0x66dc, 0x65e5, 0x3b, 0x6708, 0x66dc, 0x65e5, 0x3b, 0x706b, 0x66dc, 0x65e5, 0x3b,
+0x6c34, 0x66dc, 0x65e5, 0x3b, 0x6728, 0x66dc, 0x65e5, 0x3b, 0x91d1, 0x66dc, 0x65e5, 0x3b, 0x571f, 0x66dc, 0x65e5, 0x65e5, 0x3b, 0x6708, 0x3b, 0x706b,
+0x3b, 0x6c34, 0x3b, 0x6728, 0x3b, 0x91d1, 0x3b, 0x571f, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x65, 0x6e, 0x69, 0x6e, 0x3b, 0x53,
+0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d,
+0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c,
+0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x41, 0x3b, 0x53, 0x3b,
+0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0xcad, 0xcbe, 0xca8, 0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb8, 0xccb, 0xcae,
+0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcac, 0xcc1, 0xca7, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xc97,
+0xcc1, 0xcb0, 0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xca8, 0xcbf, 0xcb5,
+0xcbe, 0xcb0, 0xcad, 0xcbe, 0xca8, 0xcc1, 0x3b, 0xcb8, 0xccb, 0xcae, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0x3b, 0xcac, 0xcc1, 0xca7, 0x3b,
+0xc97, 0xcc1, 0xcb0, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0x3b, 0xcb6, 0xca8, 0xcbf, 0xcad, 0xcbe, 0x3b, 0xcb8, 0xccb, 0x3b,
+0xcae, 0xc82, 0x3b, 0xcac, 0xcc1, 0x3b, 0xc97, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0x3b, 0xcb6, 0x627, 0x64e, 0x62a, 0x6be, 0x648, 0x627, 0x631,
+0x3b, 0x698, 0x654, 0x646, 0x62f, 0x631, 0x655, 0x631, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x6c6, 0x645, 0x648, 0x627, 0x631, 0x3b, 0x628,
+0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633, 0x648, 0x627, 0x631, 0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628,
+0x679, 0x648, 0x627, 0x631, 0x622, 0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698, 0x654, 0x646, 0x62f, 0x655, 0x631, 0x648, 0x627, 0x631,
+0x3b, 0x628, 0x6c6, 0x645, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633, 0x648,
+0x627, 0x631, 0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648, 0x627, 0x631, 0x627, 0x3b, 0x698, 0x3b, 0x628, 0x3b, 0x628,
+0x3b, 0x628, 0x3b, 0x62c, 0x3b, 0x628, 0x436, 0x435, 0x43a, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x434, 0x4af, 0x439, 0x441, 0x435,
+0x43d, 0x431, 0x456, 0x3b, 0x441, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x441, 0x4d9, 0x440, 0x441, 0x435, 0x43d, 0x431,
+0x456, 0x3b, 0x431, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x436, 0x4b1, 0x43c, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x431,
+0x456, 0x436, 0x441, 0x3b, 0x434, 0x441, 0x3b, 0x441, 0x441, 0x3b, 0x441, 0x440, 0x3b, 0x431, 0x441, 0x3b, 0x436, 0x43c, 0x3b, 0x441,
+0x431, 0x416, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x421, 0x3b, 0x411, 0x3b, 0x416, 0x3b, 0x421, 0x4b, 0x75, 0x20, 0x63, 0x79, 0x75,
+0x6d, 0x77, 0x65, 0x72, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x77,
+0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75,
+0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61,
+0x6e, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x75, 0x63, 0x79, 0x75,
+0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e, 0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b, 0x61, 0x6e,
+0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0x436, 0x435, 0x43a, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b,
+0x434, 0x4af, 0x439, 0x448, 0x4e9, 0x43c, 0x431, 0x4af, 0x3b, 0x448, 0x435, 0x439, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x448, 0x430,
+0x440, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x431, 0x435, 0x439, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x436, 0x443, 0x43c, 0x430,
+0x3b, 0x438, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x436, 0x435, 0x43a, 0x2e, 0x3b, 0x434, 0x4af, 0x439, 0x2e, 0x3b, 0x448, 0x435, 0x439,
+0x448, 0x2e, 0x3b, 0x448, 0x430, 0x440, 0x448, 0x2e, 0x3b, 0x431, 0x435, 0x439, 0x448, 0x2e, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b,
+0x438, 0x448, 0x43c, 0x2e, 0x416, 0x3b, 0x414, 0x3b, 0x428, 0x3b, 0x428, 0x3b, 0x411, 0x3b, 0x416, 0x3b, 0x418, 0xc77c, 0xc694, 0xc77c,
0x3b, 0xc6d4, 0xc694, 0xc77c, 0x3b, 0xd654, 0xc694, 0xc77c, 0x3b, 0xc218, 0xc694, 0xc77c, 0x3b, 0xbaa9, 0xc694, 0xc77c, 0x3b, 0xae08, 0xc694, 0xc77c,
-0x3b, 0xd1a0, 0xc694, 0xc77c, 0x3b, 0x79, 0x15f, 0x3b, 0x64, 0x15f, 0x3b, 0x73, 0x15f, 0x3b, 0xe7, 0x15f, 0x3b, 0x70, 0x15f, 0x3b,
-0xee, 0x6e, 0x3b, 0x15f, 0x3b, 0x79, 0x65, 0x6b, 0x15f, 0x65, 0x6d, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6d, 0x3b, 0x73, 0xea,
-0x15f, 0x65, 0x6d, 0x3b, 0xe7, 0x61, 0x72, 0x15f, 0x65, 0x6d, 0x3b, 0x70, 0xea, 0x6e, 0x63, 0x15f, 0x65, 0x6d, 0x3b, 0xee,
-0x6e, 0x3b, 0x15f, 0x65, 0x6d, 0xee, 0x3b, 0x59, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0xce, 0x3b, 0x15e,
-0x3b, 0x63, 0x75, 0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e, 0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b,
-0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x2019,
-0x69, 0x6e, 0x64, 0x77, 0x69, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b, 0x75,
-0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74,
-0x61, 0x74, 0x75, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61,
-0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x74, 0x75, 0x3b, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b, 0xe88, 0xeb1, 0xe99, 0x3b, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99,
-0x3b, 0xe9e, 0xeb8, 0xe94, 0x3b, 0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xeaa, 0xeb8, 0xe81, 0x3b, 0xec0, 0xeaa, 0xebb, 0xeb2, 0x3b,
-0xea7, 0xeb1, 0xe99, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe88, 0xeb1, 0xe99, 0x3b, 0xea7, 0xeb1, 0xe99, 0xead,
-0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe9e, 0xeb8, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe9e, 0xeb0, 0xeab, 0xeb1,
-0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xeaa, 0xeb8, 0xe81, 0x3b, 0xea7, 0xeb1, 0xe99, 0xec0, 0xeaa, 0xebb, 0xeb2, 0x3b, 0xead, 0xeb2, 0x3b,
-0xe88, 0x3b, 0xead, 0x3b, 0xe9e, 0x3b, 0xe9e, 0xeab, 0x3b, 0xeaa, 0xeb8, 0x3b, 0xeaa, 0x3b, 0x53, 0x76, 0x113, 0x74, 0x64, 0x2e,
-0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64, 0x2e, 0x3b, 0x4f, 0x74, 0x72, 0x64, 0x2e, 0x3b, 0x54, 0x72, 0x65, 0x161, 0x64, 0x2e,
-0x3b, 0x43, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x2e, 0x3b, 0x53, 0x65,
-0x73, 0x74, 0x64, 0x2e, 0x3b, 0x53, 0x76, 0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64,
-0x69, 0x65, 0x6e, 0x61, 0x3b, 0x4f, 0x74, 0x72, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x54, 0x72, 0x65, 0x161, 0x64, 0x69,
-0x65, 0x6e, 0x61, 0x3b, 0x43, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x65, 0x6b,
-0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x53, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x53, 0x3b, 0x50,
-0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x73, 0x76, 0x113, 0x74, 0x64, 0x2e, 0x3b, 0x70, 0x69,
-0x72, 0x6d, 0x64, 0x2e, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x2e, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64, 0x2e, 0x3b, 0x63, 0x65,
-0x74, 0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x2e, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64,
-0x2e, 0x3b, 0x73, 0x76, 0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70, 0x69, 0x72, 0x6d, 0x64, 0x69, 0x65, 0x6e,
-0x61, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61,
-0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69,
-0x65, 0x6e, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x65, 0x79, 0x65, 0x3b, 0x79, 0x62,
-0x6f, 0x3b, 0x6d, 0x62, 0x6c, 0x3b, 0x6d, 0x73, 0x74, 0x3b, 0x6d, 0x69, 0x6e, 0x3b, 0x6d, 0x74, 0x6e, 0x3b, 0x6d, 0x70,
-0x73, 0x3b, 0x65, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20,
-0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x62,
-0x61, 0x6c, 0xe9, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74,
-0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e, 0xe9, 0x69, 0x3b, 0x6d, 0x6f,
-0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x6d, 0x70, 0x254, 0x301, 0x73,
-0x254, 0x3b, 0x65, 0x3b, 0x79, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x70, 0x3b, 0x73, 0x6b, 0x3b, 0x70,
-0x72, 0x3b, 0x61, 0x6e, 0x3b, 0x74, 0x72, 0x3b, 0x6b, 0x74, 0x3b, 0x70, 0x6e, 0x3b, 0x161, 0x74, 0x3b, 0x73, 0x65, 0x6b,
-0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x70, 0x69, 0x72, 0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73,
-0x3b, 0x61, 0x6e, 0x74, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x74, 0x72, 0x65, 0x10d, 0x69, 0x61, 0x64,
-0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x6b, 0x65, 0x74, 0x76, 0x69, 0x72, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73,
-0x3b, 0x70, 0x65, 0x6e, 0x6b, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x161, 0x65, 0x161, 0x74, 0x61, 0x64,
-0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x53, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x160, 0x3b,
-0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d, 0x2e, 0x3b, 0x432, 0x442, 0x43e, 0x2e, 0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b,
-0x447, 0x435, 0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e, 0x3b, 0x441, 0x430, 0x431, 0x2e, 0x3b, 0x43d, 0x435, 0x434, 0x435, 0x43b,
-0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a,
-0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x43e, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x43e,
-0x43a, 0x3b, 0x441, 0x430, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d, 0x2e, 0x3b, 0x432,
-0x442, 0x2e, 0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b, 0x447, 0x435, 0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e, 0x3b, 0x441, 0x430,
-0x431, 0x2e, 0x3b, 0x41, 0x6c, 0x61, 0x68, 0x3b, 0x41, 0x6c, 0x61, 0x74, 0x73, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c,
-0x61, 0x72, 0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x3b, 0x5a, 0x6f, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x3b, 0x41, 0x6c, 0x61,
-0x68, 0x61, 0x64, 0x79, 0x3b, 0x41, 0x6c, 0x61, 0x74, 0x73, 0x69, 0x6e, 0x61, 0x69, 0x6e, 0x79, 0x3b, 0x54, 0x61, 0x6c,
-0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x6f, 0x62, 0x69, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x61, 0x6d, 0x69,
-0x73, 0x79, 0x3b, 0x5a, 0x6f, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x6f, 0x74, 0x73, 0x79, 0x3b, 0x41, 0x3b, 0x41,
-0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x5a, 0x3b, 0x41, 0x3b, 0x41, 0x68, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x53,
-0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x68, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x41,
-0x68, 0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62,
-0x75, 0x3b, 0x4b, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74,
-0x75, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0xd1e, 0xd3e, 0xd2f, 0xd7c,
-0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd7e, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd7b, 0x3b, 0xd35,
-0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd02, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0x3b, 0xd36, 0xd28, 0xd3f, 0x3b, 0xd1e, 0xd3e, 0xd2f,
-0xd31, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1a,
-0xd4a, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd28, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b,
-0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0xd2f, 0xd3e, 0xd34,
-0xd4d, 0x200c, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1e, 0xd3e, 0x3b, 0xd24, 0xd3f, 0x3b,
-0xd1a, 0xd4a, 0x3b, 0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0x3b, 0xd1e, 0xd3e, 0xd2f, 0xd31,
+0x3b, 0xd1a0, 0xc694, 0xc77c, 0xc77c, 0x3b, 0xc6d4, 0x3b, 0xd654, 0x3b, 0xc218, 0x3b, 0xbaa9, 0x3b, 0xae08, 0x3b, 0xd1a0, 0x79, 0x65, 0x6b,
+0x15f, 0x65, 0x6d, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6d, 0x3b, 0x73, 0xea, 0x15f, 0x65, 0x6d, 0x3b, 0xe7, 0x61, 0x72, 0x15f,
+0x65, 0x6d, 0x3b, 0x70, 0xea, 0x6e, 0x63, 0x15f, 0x65, 0x6d, 0x3b, 0xee, 0x6e, 0x3b, 0x15f, 0x65, 0x6d, 0xee, 0x79, 0x15f,
+0x3b, 0x64, 0x15f, 0x3b, 0x73, 0x15f, 0x3b, 0xe7, 0x15f, 0x3b, 0x70, 0x15f, 0x3b, 0xee, 0x6e, 0x3b, 0x15f, 0x59, 0x3b, 0x44,
+0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0xce, 0x3b, 0x15e, 0x4b, 0x75, 0x20, 0x77, 0x2019, 0x69, 0x6e, 0x64, 0x77, 0x69,
+0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x6b,
+0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4b,
+0x75, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61,
+0x6e, 0x75, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x75, 0x63, 0x75,
+0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e, 0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b, 0x61, 0x6e,
+0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b,
+0xea7, 0xeb1, 0xe99, 0xe88, 0xeb1, 0xe99, 0x3b, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xea7, 0xeb1, 0xe99,
+0xe9e, 0xeb8, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xeaa, 0xeb8, 0xe81, 0x3b,
+0xea7, 0xeb1, 0xe99, 0xec0, 0xeaa, 0xebb, 0xeb2, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94, 0x3b, 0xe88, 0xeb1, 0xe99, 0x3b, 0xead, 0xeb1, 0xe87,
+0xe84, 0xeb2, 0xe99, 0x3b, 0xe9e, 0xeb8, 0xe94, 0x3b, 0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xeaa, 0xeb8, 0xe81, 0x3b, 0xec0, 0xeaa,
+0xebb, 0xeb2, 0xead, 0xeb2, 0x3b, 0xe88, 0x3b, 0xead, 0x3b, 0xe9e, 0x3b, 0xe9e, 0xeab, 0x3b, 0xeaa, 0xeb8, 0x3b, 0xeaa, 0x53, 0x76,
+0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x4f, 0x74,
+0x72, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x54, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x43, 0x65, 0x74,
+0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b,
+0x53, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x73, 0x76, 0x113, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70,
+0x69, 0x72, 0x6d, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x74, 0x72,
+0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b,
+0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61,
+0x53, 0x76, 0x113, 0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64, 0x2e, 0x3b, 0x4f, 0x74, 0x72, 0x64, 0x2e, 0x3b,
+0x54, 0x72, 0x65, 0x161, 0x64, 0x2e, 0x3b, 0x43, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x65, 0x6b,
+0x74, 0x64, 0x2e, 0x3b, 0x53, 0x65, 0x73, 0x74, 0x64, 0x2e, 0x73, 0x76, 0x113, 0x74, 0x64, 0x2e, 0x3b, 0x70, 0x69, 0x72,
+0x6d, 0x64, 0x2e, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x2e, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64, 0x2e, 0x3b, 0x63, 0x65, 0x74,
+0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x2e, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64, 0x2e,
+0x53, 0x3b, 0x50, 0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x53, 0x65, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b,
+0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x6d, 0x6f, 0x6b,
+0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c,
+0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20,
+0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e, 0xe9, 0x69, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20, 0x6d,
+0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x6d, 0x70, 0x254, 0x301, 0x73, 0x254, 0x65, 0x79, 0x65, 0x3b, 0x79, 0x62, 0x6f, 0x3b,
+0x6d, 0x62, 0x6c, 0x3b, 0x6d, 0x73, 0x74, 0x3b, 0x6d, 0x69, 0x6e, 0x3b, 0x6d, 0x74, 0x6e, 0x3b, 0x6d, 0x70, 0x73, 0x65,
+0x3b, 0x79, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x70, 0x73, 0x65, 0x6b, 0x6d, 0x61, 0x64, 0x69, 0x65,
+0x6e, 0x69, 0x73, 0x3b, 0x70, 0x69, 0x72, 0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x61, 0x6e, 0x74, 0x72,
+0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x74, 0x72, 0x65, 0x10d, 0x69, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73,
+0x3b, 0x6b, 0x65, 0x74, 0x76, 0x69, 0x72, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x70, 0x65, 0x6e, 0x6b,
+0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x161, 0x65, 0x161, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73,
+0x73, 0x6b, 0x3b, 0x70, 0x72, 0x3b, 0x61, 0x6e, 0x3b, 0x74, 0x72, 0x3b, 0x6b, 0x74, 0x3b, 0x70, 0x6e, 0x3b, 0x161, 0x74,
+0x53, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x160, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x430, 0x3b,
+0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441,
+0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x43e, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x43e, 0x43a, 0x3b,
+0x441, 0x430, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d, 0x2e, 0x3b, 0x432, 0x442, 0x43e, 0x2e,
+0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b, 0x447, 0x435, 0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e, 0x3b, 0x441, 0x430, 0x431, 0x2e,
+0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d, 0x2e, 0x3b, 0x432, 0x442, 0x2e, 0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b, 0x447,
+0x435, 0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e, 0x3b, 0x441, 0x430, 0x431, 0x2e, 0x41, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x79,
+0x3b, 0x41, 0x6c, 0x61, 0x74, 0x73, 0x69, 0x6e, 0x61, 0x69, 0x6e, 0x79, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b,
+0x41, 0x6c, 0x61, 0x72, 0x6f, 0x62, 0x69, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x61, 0x6d, 0x69, 0x73, 0x79, 0x3b, 0x5a,
+0x6f, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x6f, 0x74, 0x73, 0x79, 0x41, 0x6c, 0x61, 0x68, 0x3b, 0x41, 0x6c, 0x61,
+0x74, 0x73, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x3b, 0x5a, 0x6f, 0x6d,
+0x3b, 0x41, 0x73, 0x61, 0x62, 0x41, 0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x5a, 0x3b, 0x41, 0x41, 0x68,
+0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75,
+0x3b, 0x4b, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75,
+0x41, 0x68, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x68, 0x61, 0x3b,
+0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x41, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53,
+0xd1e, 0xd3e, 0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c,
+0xd1a, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd28, 0xd3e, 0xd34, 0xd4d,
+0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f,
+0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0xd1e, 0xd3e, 0xd2f, 0xd31,
0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1a, 0xd4a,
0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd28, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d,
0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c,
-0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1e, 0x3b, 0xd24, 0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b,
-0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0x3b, 0x126, 0x61, 0x64, 0x3b, 0x54, 0x6e, 0x65,
-0x3b, 0x54, 0x6c, 0x69, 0x3b, 0x45, 0x72, 0x62, 0x3b, 0x126, 0x61, 0x6d, 0x3b, 0x120, 0x69, 0x6d, 0x3b, 0x53, 0x69, 0x62,
-0x3b, 0x49, 0x6c, 0x2d, 0x126, 0x61, 0x64, 0x64, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6e, 0x65, 0x6a, 0x6e, 0x3b, 0x49, 0x74,
-0x2d, 0x54, 0x6c, 0x69, 0x65, 0x74, 0x61, 0x3b, 0x4c, 0x2d, 0x45, 0x72, 0x62, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x6c, 0x2d,
-0x126, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x49, 0x6c, 0x2d, 0x120, 0x69, 0x6d, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x73, 0x2d, 0x53,
-0x69, 0x62, 0x74, 0x3b, 0x126, 0x64, 0x3b, 0x54, 0x6e, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b, 0x126, 0x6d, 0x3b, 0x120,
-0x6d, 0x3b, 0x53, 0x62, 0x3b, 0x126, 0x64, 0x3b, 0x54, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b, 0x126, 0x6d, 0x3b, 0x120,
-0x6d, 0x3b, 0x53, 0x62, 0x3b, 0x54, 0x61, 0x70, 0x3b, 0x48, 0x69, 0x6e, 0x3b, 0x54, 0x16b, 0x3b, 0x41, 0x70, 0x61, 0x3b,
-0x50, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x48, 0x6f, 0x72, 0x3b, 0x52, 0x101, 0x74, 0x61, 0x70, 0x75, 0x3b, 0x52,
-0x101, 0x68, 0x69, 0x6e, 0x61, 0x3b, 0x52, 0x101, 0x74, 0x16b, 0x3b, 0x52, 0x101, 0x61, 0x70, 0x61, 0x3b, 0x52, 0x101, 0x70,
-0x61, 0x72, 0x65, 0x3b, 0x52, 0x101, 0x6d, 0x65, 0x72, 0x65, 0x3b, 0x52, 0x101, 0x68, 0x6f, 0x72, 0x6f, 0x69, 0x3b, 0x54,
-0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x930, 0x935, 0x93f, 0x3b, 0x938, 0x94b, 0x92e,
-0x3b, 0x92e, 0x902, 0x917, 0x933, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930,
-0x3b, 0x936, 0x928, 0x93f, 0x3b, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e,
+0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0xd1e, 0xd3e, 0xd2f, 0xd7c, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d,
+0xd15, 0xd7e, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd7b, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd02,
+0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd1e, 0xd3e, 0x3b, 0xd24, 0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b,
+0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0xd1e, 0x3b, 0xd24, 0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b,
+0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0x49, 0x6c, 0x2d, 0x126, 0x61, 0x64, 0x64, 0x3b,
+0x49, 0x74, 0x2d, 0x54, 0x6e, 0x65, 0x6a, 0x6e, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6c, 0x69, 0x65, 0x74, 0x61, 0x3b, 0x4c,
+0x2d, 0x45, 0x72, 0x62, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x6c, 0x2d, 0x126, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x49, 0x6c, 0x2d,
+0x120, 0x69, 0x6d, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x73, 0x2d, 0x53, 0x69, 0x62, 0x74, 0x126, 0x61, 0x64, 0x3b, 0x54, 0x6e,
+0x65, 0x3b, 0x54, 0x6c, 0x69, 0x3b, 0x45, 0x72, 0x62, 0x3b, 0x126, 0x61, 0x6d, 0x3b, 0x120, 0x69, 0x6d, 0x3b, 0x53, 0x69,
+0x62, 0x126, 0x64, 0x3b, 0x54, 0x6e, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b, 0x126, 0x6d, 0x3b, 0x120, 0x6d, 0x3b, 0x53,
+0x62, 0x126, 0x64, 0x3b, 0x54, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b, 0x126, 0x6d, 0x3b, 0x120, 0x6d, 0x3b, 0x53, 0x62,
+0x52, 0x101, 0x74, 0x61, 0x70, 0x75, 0x3b, 0x52, 0x101, 0x68, 0x69, 0x6e, 0x61, 0x3b, 0x52, 0x101, 0x74, 0x16b, 0x3b, 0x52,
+0x101, 0x61, 0x70, 0x61, 0x3b, 0x52, 0x101, 0x70, 0x61, 0x72, 0x65, 0x3b, 0x52, 0x101, 0x6d, 0x65, 0x72, 0x65, 0x3b, 0x52,
+0x101, 0x68, 0x6f, 0x72, 0x6f, 0x69, 0x54, 0x61, 0x70, 0x3b, 0x48, 0x69, 0x6e, 0x3b, 0x54, 0x16b, 0x3b, 0x41, 0x70, 0x61,
+0x3b, 0x50, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x48, 0x6f, 0x72, 0x54, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x41, 0x3b,
+0x50, 0x3b, 0x4d, 0x3b, 0x48, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e,
0x902, 0x917, 0x933, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e,
-0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x41d, 0x44f,
-0x3b, 0x414, 0x430, 0x3b, 0x41c, 0x44f, 0x3b, 0x41b, 0x445, 0x3b, 0x41f, 0x4af, 0x3b, 0x411, 0x430, 0x3b, 0x411, 0x44f, 0x3b, 0x41d,
-0x44f, 0x43c, 0x3b, 0x414, 0x430, 0x432, 0x430, 0x430, 0x3b, 0x41c, 0x44f, 0x433, 0x43c, 0x430, 0x440, 0x3b, 0x41b, 0x445, 0x430, 0x433,
-0x432, 0x430, 0x3b, 0x41f, 0x4af, 0x440, 0x44d, 0x432, 0x3b, 0x411, 0x430, 0x430, 0x441, 0x430, 0x43d, 0x3b, 0x411, 0x44f, 0x43c, 0x431,
-0x430, 0x3b, 0x43d, 0x44f, 0x43c, 0x3b, 0x434, 0x430, 0x432, 0x430, 0x430, 0x3b, 0x43c, 0x44f, 0x433, 0x43c, 0x430, 0x440, 0x3b, 0x43b,
-0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x43f, 0x4af, 0x440, 0x44d, 0x432, 0x3b, 0x431, 0x430, 0x430, 0x441, 0x430, 0x43d, 0x3b, 0x431,
-0x44f, 0x43c, 0x431, 0x430, 0x3b, 0x906, 0x907, 0x924, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x3b, 0x92c,
-0x941, 0x927, 0x3b, 0x92c, 0x93f, 0x939, 0x93f, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x3b, 0x906, 0x907,
-0x924, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x92c, 0x93e, 0x930,
-0x3b, 0x92c, 0x941, 0x927, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x939, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d,
-0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x3b, 0x92c,
-0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x3b, 0xb30, 0xb2c, 0xb3f, 0x3b, 0xb38, 0xb4b, 0xb2e, 0x3b, 0xb2e, 0xb19,
-0xb4d, 0xb17, 0xb33, 0x3b, 0xb2c, 0xb41, 0xb27, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0x3b, 0xb36,
-0xb28, 0xb3f, 0x3b, 0xb30, 0xb2c, 0xb3f, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb38, 0xb4b, 0xb2e, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2e, 0xb19, 0xb4d,
-0xb17, 0xb33, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2c, 0xb41, 0xb27, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0xb2c, 0xb3e, 0xb30,
-0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb30, 0x3b, 0xb38,
-0xb4b, 0x3b, 0xb2e, 0x3b, 0xb2c, 0xb41, 0x3b, 0xb17, 0xb41, 0x3b, 0xb36, 0xb41, 0x3b, 0xb36, 0x3b, 0x64a, 0x648, 0x646, 0x6cd, 0x3b,
-0x62f, 0x648, 0x646, 0x6cd, 0x3b, 0x62f, 0x631, 0x6d0, 0x646, 0x6cd, 0x3b, 0x685, 0x644, 0x631, 0x646, 0x6cd, 0x3b, 0x67e, 0x64a, 0x646,
-0x681, 0x646, 0x6cd, 0x3b, 0x62c, 0x645, 0x639, 0x647, 0x3b, 0x627, 0x648, 0x646, 0x6cd, 0x3b, 0x6cc, 0x6a9, 0x634, 0x646, 0x628, 0x647,
+0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x930, 0x935, 0x93f,
+0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936,
+0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x41d, 0x44f, 0x43c, 0x3b, 0x414, 0x430, 0x432, 0x430, 0x430, 0x3b, 0x41c, 0x44f,
+0x433, 0x43c, 0x430, 0x440, 0x3b, 0x41b, 0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x41f, 0x4af, 0x440, 0x44d, 0x432, 0x3b, 0x411, 0x430,
+0x430, 0x441, 0x430, 0x43d, 0x3b, 0x411, 0x44f, 0x43c, 0x431, 0x430, 0x43d, 0x44f, 0x43c, 0x3b, 0x434, 0x430, 0x432, 0x430, 0x430, 0x3b,
+0x43c, 0x44f, 0x433, 0x43c, 0x430, 0x440, 0x3b, 0x43b, 0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x43f, 0x4af, 0x440, 0x44d, 0x432, 0x3b,
+0x431, 0x430, 0x430, 0x441, 0x430, 0x43d, 0x3b, 0x431, 0x44f, 0x43c, 0x431, 0x430, 0x41d, 0x44f, 0x3b, 0x414, 0x430, 0x3b, 0x41c, 0x44f,
+0x3b, 0x41b, 0x445, 0x3b, 0x41f, 0x4af, 0x3b, 0x411, 0x430, 0x3b, 0x411, 0x44f, 0x906, 0x907, 0x924, 0x92c, 0x93e, 0x930, 0x3b, 0x938,
+0x94b, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c, 0x93e,
+0x930, 0x3b, 0x92c, 0x93f, 0x939, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936,
+0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x906, 0x907, 0x924, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x3b, 0x92c,
+0x941, 0x927, 0x3b, 0x92c, 0x93f, 0x939, 0x93f, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x906, 0x3b, 0x938,
+0x94b, 0x3b, 0x92e, 0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0xb30, 0xb2c, 0xb3f, 0xb2c, 0xb3e, 0xb30,
+0x3b, 0xb38, 0xb4b, 0xb2e, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2e, 0xb19, 0xb4d, 0xb17, 0xb33, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2c, 0xb41, 0xb27,
+0xb2c, 0xb3e, 0xb30, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0xb2c, 0xb3e, 0xb30,
+0x3b, 0xb36, 0xb28, 0xb3f, 0xb2c, 0xb3e, 0xb30, 0xb30, 0xb2c, 0xb3f, 0x3b, 0xb38, 0xb4b, 0xb2e, 0x3b, 0xb2e, 0xb19, 0xb4d, 0xb17, 0xb33,
+0x3b, 0xb2c, 0xb41, 0xb27, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0xb30,
+0x3b, 0xb38, 0xb4b, 0x3b, 0xb2e, 0x3b, 0xb2c, 0xb41, 0x3b, 0xb17, 0xb41, 0x3b, 0xb36, 0xb41, 0x3b, 0xb36, 0x64a, 0x648, 0x646, 0x6cd,
+0x3b, 0x62f, 0x648, 0x646, 0x6cd, 0x3b, 0x62f, 0x631, 0x6d0, 0x646, 0x6cd, 0x3b, 0x685, 0x644, 0x631, 0x646, 0x6cd, 0x3b, 0x67e, 0x64a,
+0x646, 0x681, 0x646, 0x6cd, 0x3b, 0x62c, 0x645, 0x639, 0x647, 0x3b, 0x627, 0x648, 0x646, 0x6cd, 0x6cc, 0x6a9, 0x634, 0x646, 0x628, 0x647,
0x3b, 0x62f, 0x648, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x633, 0x647, 0x200c, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x686, 0x647, 0x627, 0x631,
0x634, 0x646, 0x628, 0x647, 0x3b, 0x67e, 0x646, 0x62c, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x62c, 0x645, 0x639, 0x647, 0x3b, 0x634, 0x646,
-0x628, 0x647, 0x3b, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c, 0x3b, 0x634, 0x3b, 0x6e, 0x69, 0x65,
-0x64, 0x7a, 0x2e, 0x3b, 0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x77, 0x74, 0x2e, 0x3b, 0x15b, 0x72, 0x2e, 0x3b, 0x63, 0x7a, 0x77,
-0x2e, 0x3b, 0x70, 0x74, 0x2e, 0x3b, 0x73, 0x6f, 0x62, 0x2e, 0x3b, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x65, 0x6c, 0x61,
-0x3b, 0x70, 0x6f, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x61, 0x142, 0x65, 0x6b, 0x3b, 0x77, 0x74, 0x6f, 0x72, 0x65, 0x6b,
-0x3b, 0x15b, 0x72, 0x6f, 0x64, 0x61, 0x3b, 0x63, 0x7a, 0x77, 0x61, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0x69, 0x105, 0x74,
-0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b, 0x15a, 0x3b, 0x43, 0x3b,
-0x50, 0x3b, 0x53, 0x3b, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x15b, 0x3b, 0x63, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x64, 0x6f,
-0x6d, 0x2e, 0x3b, 0x73, 0x65, 0x67, 0x2e, 0x3b, 0x74, 0x65, 0x72, 0x2e, 0x3b, 0x71, 0x75, 0x61, 0x2e, 0x3b, 0x71, 0x75,
-0x69, 0x2e, 0x3b, 0x73, 0x65, 0x78, 0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x3b, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f,
-0x3b, 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0xe7, 0x61,
-0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b,
-0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61, 0x2d, 0x66,
-0x65, 0x69, 0x72, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x51, 0x3b,
-0x51, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64,
-0x61, 0x3b, 0x74, 0x65, 0x72, 0xe7, 0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x3b, 0x71, 0x75, 0x69, 0x6e, 0x74,
-0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0xa10, 0xa24, 0x3b, 0xa38, 0xa4b,
-0xa2e, 0x3b, 0xa2e, 0xa70, 0xa17, 0xa32, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0x3b, 0xa35, 0xa40, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71,
-0xa15, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71, 0xa1a, 0xa30, 0x3b, 0xa10, 0xa24, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa4b, 0xa2e,
-0xa35, 0xa3e, 0xa30, 0x3b, 0xa2e, 0xa70, 0xa17, 0xa32, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0xa35, 0xa3e, 0xa30, 0x3b,
-0xa35, 0xa40, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28,
-0xa3f, 0xa71, 0xa1a, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa10, 0x3b, 0xa38, 0xa4b, 0x3b, 0xa2e, 0xa70, 0x3b, 0xa2c, 0xa41, 0xa71, 0x3b,
-0xa35, 0xa40, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0x3b, 0xa38, 0xa3c, 0x3b, 0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631,
-0x3b, 0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628, 0x64f, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639, 0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645,
-0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1, 0x3b, 0x44, 0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b,
-0x4d, 0x69, 0xe9, 0x3b, 0x4a, 0x75, 0x65, 0x3b, 0x56, 0x69, 0x65, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x44, 0x6f, 0x6d, 0x69,
-0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0xe9,
-0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x4a, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x56, 0x69, 0x65, 0x72, 0x6e, 0x65,
-0x73, 0x3b, 0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x4a, 0x3b, 0x56,
-0x3b, 0x53, 0x3b, 0x64, 0x75, 0x3b, 0x67, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x67, 0x69, 0x65, 0x3b,
-0x76, 0x65, 0x3b, 0x73, 0x6f, 0x3b, 0x64, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x69, 0x61, 0x3b, 0x67, 0x6c, 0x69, 0x6e, 0x64,
+0x628, 0x647, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c, 0x3b, 0x634, 0x6e, 0x69, 0x65, 0x64, 0x7a,
+0x69, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x61, 0x142, 0x65, 0x6b, 0x3b, 0x77, 0x74,
+0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x15b, 0x72, 0x6f, 0x64, 0x61, 0x3b, 0x63, 0x7a, 0x77, 0x61, 0x72, 0x74, 0x65, 0x6b, 0x3b,
+0x70, 0x69, 0x105, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x2e, 0x3b,
+0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x77, 0x74, 0x2e, 0x3b, 0x15b, 0x72, 0x2e, 0x3b, 0x63, 0x7a, 0x77, 0x2e, 0x3b, 0x70, 0x74,
+0x2e, 0x3b, 0x73, 0x6f, 0x62, 0x2e, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b, 0x15a, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x53, 0x6e,
+0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x15b, 0x3b, 0x63, 0x3b, 0x70, 0x3b, 0x73, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b,
+0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0xe7, 0x61, 0x2d,
+0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x71,
+0x75, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61, 0x2d, 0x66, 0x65,
+0x69, 0x72, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x2e, 0x3b, 0x73, 0x65, 0x67, 0x2e, 0x3b,
+0x74, 0x65, 0x72, 0x2e, 0x3b, 0x71, 0x75, 0x61, 0x2e, 0x3b, 0x71, 0x75, 0x69, 0x2e, 0x3b, 0x73, 0x65, 0x78, 0x2e, 0x3b,
+0x73, 0xe1, 0x62, 0x2e, 0x44, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x53, 0x3b, 0x53, 0x64, 0x6f, 0x6d,
+0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x3b, 0x74, 0x65, 0x72, 0xe7, 0x61, 0x3b, 0x71,
+0x75, 0x61, 0x72, 0x74, 0x61, 0x3b, 0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61, 0x3b, 0x73,
+0xe1, 0x62, 0x61, 0x64, 0x6f, 0xa10, 0xa24, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa4b, 0xa2e, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2e, 0xa70,
+0xa17, 0xa32, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa35, 0xa40, 0xa30, 0xa35, 0xa3e, 0xa30,
+0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71, 0xa1a, 0xa30, 0xa35, 0xa3e,
+0xa30, 0xa10, 0xa24, 0x3b, 0xa38, 0xa4b, 0xa2e, 0x3b, 0xa2e, 0xa70, 0xa17, 0xa32, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0x3b, 0xa35, 0xa40,
+0xa30, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71, 0xa1a, 0xa30, 0xa10, 0x3b, 0xa38, 0xa4b,
+0x3b, 0xa2e, 0xa70, 0x3b, 0xa2c, 0xa41, 0xa71, 0x3b, 0xa35, 0xa40, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0x3b, 0xa38, 0xa3c, 0x627, 0x62a,
+0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628, 0x64f, 0x62f, 0x6be, 0x3b, 0x62c, 0x645,
+0x639, 0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67,
+0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0xe9, 0x72, 0x63,
+0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x4a, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x56, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b,
+0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x44, 0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69,
+0xe9, 0x3b, 0x4a, 0x75, 0x65, 0x3b, 0x56, 0x69, 0x65, 0x3b, 0x53, 0x61, 0x62, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x58,
+0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x69, 0x61, 0x3b, 0x67, 0x6c, 0x69, 0x6e, 0x64,
0x65, 0x73, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x73, 0x65, 0x6d, 0x6e, 0x61, 0x3b, 0x67,
0x69, 0x65, 0x76, 0x67, 0x69, 0x61, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x69, 0x3b, 0x73, 0x6f, 0x6e, 0x64,
-0x61, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x64, 0x75, 0x6d, 0x2e,
-0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x69, 0x65, 0x2e, 0x3b, 0x6a, 0x6f, 0x69, 0x3b,
-0x76, 0x69, 0x6e, 0x2e, 0x3b, 0x73, 0xe2, 0x6d, 0x2e, 0x3b, 0x64, 0x75, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x103, 0x3b, 0x6c,
-0x75, 0x6e, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x21b, 0x69, 0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x3b, 0x6a,
-0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x65, 0x72, 0x69, 0x3b, 0x73, 0xe2, 0x6d, 0x62, 0x103, 0x74, 0x103, 0x3b, 0x44, 0x75,
-0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x65, 0x3b, 0x4a, 0x6f, 0x69, 0x3b, 0x56, 0x69,
-0x6e, 0x3b, 0x53, 0xe2, 0x6d, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x61, 0x3b, 0x4d, 0x69, 0x3b, 0x4a, 0x3b, 0x56, 0x3b,
-0x53, 0x3b, 0x432, 0x441, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b,
-0x441, 0x431, 0x3b, 0x432, 0x43e, 0x441, 0x43a, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x435, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434,
-0x435, 0x43b, 0x44c, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430,
-0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x433, 0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431,
-0x431, 0x43e, 0x442, 0x430, 0x3b, 0x412, 0x3b, 0x41f, 0x3b, 0x412, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x3b, 0x42,
-0x6b, 0x31, 0x3b, 0x42, 0x6b, 0x32, 0x3b, 0x42, 0x6b, 0x33, 0x3b, 0x42, 0x6b, 0x34, 0x3b, 0x42, 0x6b, 0x35, 0x3b, 0x4c,
-0xe2, 0x70, 0x3b, 0x4c, 0xe2, 0x79, 0x3b, 0x42, 0x69, 0x6b, 0x75, 0x61, 0x2d, 0xf4, 0x6b, 0x6f, 0x3b, 0x42, 0xef, 0x6b,
-0x75, 0x61, 0x2d, 0xfb, 0x73, 0x65, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x70, 0x74, 0xe2, 0x3b, 0x42, 0xef, 0x6b,
-0x75, 0x61, 0x2d, 0x75, 0x73, 0xef, 0xf6, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x6f, 0x6b, 0xfc, 0x3b, 0x4c, 0xe2,
-0x70, 0xf4, 0x73, 0xf6, 0x3b, 0x4c, 0xe2, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x53,
-0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x59, 0x3b, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441,
-0x440, 0x435, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x3b, 0x43d, 0x435, 0x434, 0x435, 0x459,
-0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441,
-0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b,
-0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x43d, 0x3b, 0x43f, 0x3b, 0x443, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441,
-0x3b, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f,
-0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x3b, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434,
-0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435, 0x434, 0x430, 0x3b,
-0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442,
-0x430, 0x3b, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x3b, 0x73, 0x72, 0x3b, 0x10d, 0x65, 0x74, 0x3b,
-0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x3b, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e,
+0x61, 0x64, 0x75, 0x3b, 0x67, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x67, 0x69, 0x65, 0x3b, 0x76, 0x65,
+0x3b, 0x73, 0x6f, 0x44, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x64, 0x75, 0x6d, 0x69,
+0x6e, 0x69, 0x63, 0x103, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x21b, 0x69, 0x3b, 0x6d, 0x69, 0x65, 0x72,
+0x63, 0x75, 0x72, 0x69, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x65, 0x72, 0x69, 0x3b, 0x73, 0xe2, 0x6d, 0x62,
+0x103, 0x74, 0x103, 0x64, 0x75, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x69,
+0x65, 0x2e, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x2e, 0x3b, 0x73, 0xe2, 0x6d, 0x2e, 0x44, 0x75, 0x6d, 0x3b,
+0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x65, 0x3b, 0x4a, 0x6f, 0x69, 0x3b, 0x56, 0x69, 0x6e, 0x3b,
+0x53, 0xe2, 0x6d, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x61, 0x3b, 0x4d, 0x69, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x432, 0x43e,
+0x441, 0x43a, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x435, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44c, 0x43d, 0x438,
+0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432,
+0x435, 0x440, 0x433, 0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x431, 0x43e, 0x442, 0x430, 0x432,
+0x441, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x412,
+0x3b, 0x41f, 0x3b, 0x412, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x42, 0x69, 0x6b, 0x75, 0x61, 0x2d, 0xf4, 0x6b,
+0x6f, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0xfb, 0x73, 0x65, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x70, 0x74,
+0xe2, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x75, 0x73, 0xef, 0xf6, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x6f,
+0x6b, 0xfc, 0x3b, 0x4c, 0xe2, 0x70, 0xf4, 0x73, 0xf6, 0x3b, 0x4c, 0xe2, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x42, 0x6b, 0x31,
+0x3b, 0x42, 0x6b, 0x32, 0x3b, 0x42, 0x6b, 0x33, 0x3b, 0x42, 0x6b, 0x34, 0x3b, 0x42, 0x6b, 0x35, 0x3b, 0x4c, 0xe2, 0x70,
+0x3b, 0x4c, 0xe2, 0x79, 0x4b, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x59, 0x43d, 0x435, 0x434,
+0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a,
+0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430,
+0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x43e, 0x3b,
+0x441, 0x440, 0x435, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x43d, 0x3b, 0x43f, 0x3b, 0x443,
+0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e,
0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65,
0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b, 0x73, 0x75,
-0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x65,
-0x3b, 0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x3b, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61,
-0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73,
-0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b,
-0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x425, 0x446, 0x431, 0x3b, 0x41a, 0x440, 0x441, 0x3b, 0x414, 0x446, 0x433, 0x3b, 0x4d4,
-0x440, 0x442, 0x3b, 0x426, 0x43f, 0x440, 0x3b, 0x41c, 0x440, 0x431, 0x3b, 0x421, 0x431, 0x442, 0x3b, 0x425, 0x443, 0x44b, 0x446, 0x430,
-0x443, 0x431, 0x43e, 0x43d, 0x3b, 0x41a, 0x44a, 0x443, 0x44b, 0x440, 0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x414, 0x44b, 0x446, 0x446, 0x4d5,
-0x433, 0x3b, 0x4d4, 0x440, 0x442, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x426, 0x44b, 0x43f, 0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b,
-0x41c, 0x430, 0x439, 0x440, 0x4d5, 0x43c, 0x431, 0x43e, 0x43d, 0x3b, 0x421, 0x430, 0x431, 0x430, 0x442, 0x3b, 0x425, 0x3b, 0x41a, 0x3b,
-0x414, 0x3b, 0x4d4, 0x3b, 0x426, 0x3b, 0x41c, 0x3b, 0x421, 0x3b, 0x445, 0x446, 0x431, 0x3b, 0x43a, 0x440, 0x441, 0x3b, 0x434, 0x446,
-0x433, 0x3b, 0x4d5, 0x440, 0x442, 0x3b, 0x446, 0x43f, 0x440, 0x3b, 0x43c, 0x440, 0x431, 0x3b, 0x441, 0x431, 0x442, 0x3b, 0x445, 0x443,
-0x44b, 0x446, 0x430, 0x443, 0x431, 0x43e, 0x43d, 0x3b, 0x43a, 0x44a, 0x443, 0x44b, 0x440, 0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x434, 0x44b,
-0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x4d5, 0x440, 0x442, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x446, 0x44b, 0x43f, 0x43f, 0x4d5, 0x440,
-0x4d5, 0x43c, 0x3b, 0x43c, 0x430, 0x439, 0x440, 0x4d5, 0x43c, 0x431, 0x43e, 0x43d, 0x3b, 0x441, 0x430, 0x431, 0x430, 0x442, 0x3b, 0x53,
-0x76, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x3b, 0x43, 0x68, 0x70, 0x3b, 0x43, 0x68, 0x74, 0x3b, 0x43, 0x68, 0x6e, 0x3b, 0x43,
-0x68, 0x73, 0x3b, 0x4d, 0x75, 0x67, 0x3b, 0x53, 0x76, 0x6f, 0x6e, 0x64, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x68, 0x75, 0x72,
-0x6f, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68,
-0x69, 0x6e, 0x61, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75, 0x67, 0x6f, 0x76, 0x65, 0x72,
-0x61, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x622, 0x686, 0x631, 0x3b,
-0x633, 0x648, 0x645, 0x631, 0x3b, 0x627, 0x6b1, 0x627, 0x631, 0x648, 0x3b, 0x627, 0x631, 0x628, 0x639, 0x3b, 0x62e, 0x645, 0x64a, 0x633,
-0x3b, 0x62c, 0x645, 0x639, 0x648, 0x3b, 0x687, 0x646, 0x687, 0x631, 0x3b, 0x622, 0x686, 0x631, 0x3b, 0x633, 0x648, 0x3b, 0x627, 0x6b1,
-0x627, 0x631, 0x648, 0x3b, 0x627, 0x631, 0x628, 0x639, 0x3b, 0x62e, 0x645, 0x3b, 0x62c, 0x645, 0x639, 0x648, 0x3b, 0x687, 0x646, 0x687,
-0x631, 0x3b, 0xd89, 0xdbb, 0xdd2, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0x3b, 0xdb6, 0xdaf,
-0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0x3b, 0xdc3, 0xdd9, 0xdb1,
-0x3b, 0xd89, 0xdbb, 0xdd2, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0xdbb, 0xdd4, 0xdc0, 0xdcf,
-0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0xdb4, 0xdad, 0xdd2, 0xdb1,
-0xdca, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xdc3, 0xdd4, 0xdbb, 0xdcf,
-0xdaf, 0xdcf, 0x3b, 0xd89, 0x3b, 0xdc3, 0x3b, 0xd85, 0x3b, 0xdb6, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0x3b, 0xdc3, 0xdd2, 0x3b, 0xdc3,
-0xdd9, 0x3b, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0x75, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x161, 0x74, 0x3b, 0x70, 0x69, 0x3b,
-0x73, 0x6f, 0x3b, 0x6e, 0x65, 0x64, 0x65, 0x13e, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x6c, 0x6f, 0x6b, 0x3b, 0x75,
-0x74, 0x6f, 0x72, 0x6f, 0x6b, 0x3b, 0x73, 0x74, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x161, 0x74, 0x76, 0x72, 0x74, 0x6f, 0x6b,
-0x3b, 0x70, 0x69, 0x61, 0x74, 0x6f, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x3b, 0x70, 0x3b, 0x75,
-0x3b, 0x73, 0x3b, 0x161, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x6e, 0x65, 0x64, 0x2e, 0x3b, 0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x74,
-0x6f, 0x72, 0x2e, 0x3b, 0x73, 0x72, 0x65, 0x2e, 0x3b, 0x10d, 0x65, 0x74, 0x2e, 0x3b, 0x70, 0x65, 0x74, 0x2e, 0x3b, 0x73,
-0x6f, 0x62, 0x2e, 0x3b, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a,
-0x65, 0x6b, 0x3b, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x72, 0x74,
-0x65, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x3b, 0x70, 0x3b,
-0x74, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x41, 0x78, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x54, 0x6c,
-0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x63, 0x3b, 0x4b, 0x68, 0x6d, 0x73, 0x3b, 0x4a, 0x6d, 0x63, 0x3b, 0x53, 0x62, 0x74,
-0x69, 0x3b, 0x41, 0x78, 0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x61, 0x64,
-0x6f, 0x3b, 0x41, 0x72, 0x62, 0x61, 0x63, 0x6f, 0x3b, 0x4b, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x3b, 0x4a, 0x69, 0x6d,
-0x63, 0x6f, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x69, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x4b, 0x68, 0x3b,
-0x4a, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d,
-0x69, 0xe9, 0x2e, 0x3b, 0x6a, 0x75, 0x65, 0x2e, 0x3b, 0x76, 0x69, 0x65, 0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x3b, 0x64,
-0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b,
-0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x6a, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65,
-0x72, 0x6e, 0x65, 0x73, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d,
-0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x73, 0xf6, 0x6e, 0x3b, 0x6d, 0xe5, 0x6e, 0x3b,
-0x74, 0x69, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf6, 0x72,
-0x3b, 0x73, 0xf6, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x69, 0x73, 0x64, 0x61,
-0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65,
-0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf6, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x42f, 0x448, 0x431, 0x3b, 0x414, 0x448, 0x431, 0x3b, 0x421,
-0x448, 0x431, 0x3b, 0x427, 0x448, 0x431, 0x3b, 0x41f, 0x448, 0x431, 0x3b, 0x4b6, 0x43c, 0x44a, 0x3b, 0x428, 0x43d, 0x431, 0x3b, 0x42f,
-0x43a, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x414, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x421, 0x435, 0x448, 0x430, 0x43d,
-0x431, 0x435, 0x3b, 0x427, 0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x41f, 0x430, 0x43d, 0x4b7, 0x448, 0x430, 0x43d, 0x431,
-0x435, 0x3b, 0x4b6, 0x443, 0x43c, 0x44a, 0x430, 0x3b, 0x428, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b,
-0x427, 0x3b, 0x41f, 0x3b, 0x4b6, 0x3b, 0x428, 0x3b, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0x2e, 0x3b, 0xba4, 0xbbf, 0xb99, 0xbcd, 0x2e, 0x3b,
-0xb9a, 0xbc6, 0xbb5, 0xbcd, 0x2e, 0x3b, 0xbaa, 0xbc1, 0xba4, 0x2e, 0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0x2e, 0x3b, 0xbb5, 0xbc6, 0xbb3,
-0xbcd, 0x2e, 0x3b, 0xb9a, 0xba9, 0xbbf, 0x3b, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0xbb1, 0xbc1, 0x3b, 0xba4, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbb3,
-0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbb5, 0xbcd, 0xbb5, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0xbaa, 0xbc1, 0xba4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbbf, 0xbaf,
-0xbbe, 0xbb4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbc6, 0xbb3, 0xbcd, 0xbb3, 0xbbf, 0x3b, 0xb9a, 0xba9, 0xbbf, 0x3b, 0xb9e, 0xbbe, 0x3b, 0xba4,
-0xbbf, 0x3b, 0xb9a, 0xbc6, 0x3b, 0xbaa, 0xbc1, 0x3b, 0xbb5, 0xbbf, 0x3b, 0xbb5, 0xbc6, 0x3b, 0xb9a, 0x3b, 0x44f, 0x43a, 0x448, 0x2e,
-0x3b, 0x434, 0x4af, 0x448, 0x2e, 0x3b, 0x441, 0x438, 0x448, 0x2e, 0x3b, 0x447, 0x4d9, 0x440, 0x2e, 0x3b, 0x43f, 0x4d9, 0x43d, 0x497,
-0x2e, 0x3b, 0x497, 0x43e, 0x43c, 0x2e, 0x3b, 0x448, 0x438, 0x43c, 0x2e, 0x3b, 0x44f, 0x43a, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b,
-0x434, 0x4af, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x441, 0x438, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x447, 0x4d9, 0x440, 0x448,
-0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x43f, 0x4d9, 0x43d, 0x497, 0x435, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x497, 0x43e, 0x43c, 0x433,
-0x430, 0x3b, 0x448, 0x438, 0x43c, 0x431, 0x4d9, 0x3b, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x496, 0x3b,
-0x428, 0x3b, 0xc06, 0xc26, 0xc3f, 0x3b, 0xc38, 0xc4b, 0xc2e, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0x3b, 0xc2c, 0xc41, 0xc27, 0x3b, 0xc17,
-0xc41, 0xc30, 0xc41, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0x3b, 0xc36, 0xc28, 0xc3f, 0x3b, 0xc06, 0xc26, 0xc3f, 0xc35, 0xc3e, 0xc30,
-0xc02, 0x3b, 0xc38, 0xc4b, 0xc2e, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc2c,
-0xc41, 0xc27, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc17, 0xc41, 0xc30, 0xc41, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d,
-0xc30, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc28, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc06, 0x3b, 0xc38, 0xc4b, 0x3b, 0xc2e,
-0x3b, 0xc2c, 0xc41, 0x3b, 0xc17, 0xc41, 0x3b, 0xc36, 0xc41, 0x3b, 0xc36, 0x3b, 0xe2d, 0xe32, 0x2e, 0x3b, 0xe08, 0x2e, 0x3b, 0xe2d,
-0x2e, 0x3b, 0xe1e, 0x2e, 0x3b, 0xe1e, 0xe24, 0x2e, 0x3b, 0xe28, 0x2e, 0x3b, 0xe2a, 0x2e, 0x3b, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe32,
-0xe17, 0xe34, 0xe15, 0xe22, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe08, 0xe31, 0xe19, 0xe17, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe2d,
-0xe31, 0xe07, 0xe04, 0xe32, 0xe23, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe38, 0xe18, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe24, 0xe2b, 0xe31,
-0xe2a, 0xe1a, 0xe14, 0xe35, 0x3b, 0xe27, 0xe31, 0xe19, 0xe28, 0xe38, 0xe01, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe40, 0xe2a, 0xe32,
-0xe23, 0xe4c, 0x3b, 0xe2d, 0xe32, 0x3b, 0xe08, 0x3b, 0xe2d, 0x3b, 0xe1e, 0x3b, 0xe1e, 0xe24, 0x3b, 0xe28, 0x3b, 0xe2a, 0x3b, 0xf49,
-0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b,
-0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66,
-0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b,
-0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58,
-0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74,
-0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60,
-0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf49, 0xf72, 0x3b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72, 0xf42, 0x3b, 0xf63,
-0xfb7, 0xf42, 0x3b, 0xf55, 0xf74, 0xf62, 0x3b, 0xf66, 0xf44, 0xf66, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x3b, 0x1230, 0x1295, 0x3b, 0x1230,
-0x1291, 0x3b, 0x1230, 0x1209, 0x3b, 0x1228, 0x1261, 0x3b, 0x1213, 0x1219, 0x3b, 0x12d3, 0x122d, 0x3b, 0x1240, 0x12f3, 0x3b, 0x1230, 0x1295, 0x1260,
-0x1275, 0x3b, 0x1230, 0x1291, 0x12ed, 0x3b, 0x1220, 0x1209, 0x1235, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1283, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d,
-0x1262, 0x3b, 0x1240, 0x12f3, 0x121d, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1220, 0x3b, 0x1228, 0x3b, 0x1213, 0x3b, 0x12d3, 0x3b, 0x1240, 0x3b,
-0x1230, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1228, 0x3b, 0x1213, 0x3b, 0x12d3, 0x3b, 0x1240, 0x3b, 0x53, 0x101, 0x70, 0x3b, 0x4d, 0x14d,
-0x6e, 0x3b, 0x54, 0x16b, 0x73, 0x3b, 0x50, 0x75, 0x6c, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x3b, 0x46, 0x61, 0x6c, 0x3b, 0x54,
-0x6f, 0x6b, 0x3b, 0x53, 0x101, 0x70, 0x61, 0x74, 0x65, 0x3b, 0x4d, 0x14d, 0x6e, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x16b, 0x73,
-0x69, 0x74, 0x65, 0x3b, 0x50, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x70, 0x75, 0x6c,
-0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x46, 0x61, 0x6c, 0x61, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x6f, 0x6b, 0x6f, 0x6e, 0x61,
-0x6b, 0x69, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x54, 0x3b, 0x50, 0x61, 0x7a,
-0x3b, 0x50, 0x7a, 0x74, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0xc7, 0x61, 0x72, 0x3b, 0x50, 0x65, 0x72, 0x3b, 0x43, 0x75, 0x6d,
-0x3b, 0x43, 0x6d, 0x74, 0x3b, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69,
-0x3b, 0x53, 0x61, 0x6c, 0x131, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x72, 0x15f, 0x65,
-0x6d, 0x62, 0x65, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x3b, 0x50,
-0x3b, 0x50, 0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0xdd, 0x65, 0x6b, 0x3b, 0x44, 0x75, 0x15f,
-0x3b, 0x53, 0x69, 0x15f, 0x3b, 0xc7, 0x61, 0x72, 0x3b, 0x50, 0x65, 0x6e, 0x3b, 0x41, 0x6e, 0x6e, 0x3b, 0x15e, 0x65, 0x6e,
-0x3b, 0xdd, 0x65, 0x6b, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x44, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x53, 0x69,
-0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x50, 0x65, 0x6e, 0x15f, 0x65,
-0x6e, 0x62, 0x65, 0x3b, 0x41, 0x6e, 0x6e, 0x61, 0x3b, 0x15e, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0xdd, 0x3b, 0x44, 0x3b, 0x53,
-0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x15e, 0x3b, 0xfd, 0x65, 0x6b, 0x3b, 0x64, 0x75, 0x15f, 0x3b, 0x73, 0x69, 0x15f,
-0x3b, 0xe7, 0x61, 0x72, 0x3b, 0x70, 0x65, 0x6e, 0x3b, 0x61, 0x6e, 0x6e, 0x3b, 0x15f, 0x65, 0x6e, 0x3b, 0xfd, 0x65, 0x6b,
-0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x73, 0x69, 0x15f, 0x65, 0x6e, 0x62,
-0x65, 0x3b, 0xe7, 0x61, 0x72, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x70, 0x65, 0x6e, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b,
-0x61, 0x6e, 0x6e, 0x61, 0x3b, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x64a, 0x6d5, 0x3b, 0x62f, 0x6c8, 0x3b, 0x633, 0x6d5, 0x3b,
-0x686, 0x627, 0x3b, 0x67e, 0x6d5, 0x3b, 0x62c, 0x6c8, 0x3b, 0x634, 0x6d5, 0x3b, 0x64a, 0x6d5, 0x643, 0x634, 0x6d5, 0x646, 0x628, 0x6d5,
+0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x3b, 0x73, 0x72, 0x3b, 0x10d, 0x65,
+0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f,
+0x3b, 0x73, 0x72, 0x65, 0x3b, 0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x64, 0x65,
+0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61,
+0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74,
+0x61, 0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d,
+0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435, 0x434,
+0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431,
+0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x435, 0x442,
+0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x425, 0x443, 0x44b, 0x446, 0x430, 0x443, 0x431, 0x43e, 0x43d, 0x3b, 0x41a, 0x44a,
+0x443, 0x44b, 0x440, 0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x414, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x4d4, 0x440, 0x442, 0x44b, 0x446,
+0x446, 0x4d5, 0x433, 0x3b, 0x426, 0x44b, 0x43f, 0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b, 0x41c, 0x430, 0x439, 0x440, 0x4d5, 0x43c, 0x431,
+0x43e, 0x43d, 0x3b, 0x421, 0x430, 0x431, 0x430, 0x442, 0x445, 0x443, 0x44b, 0x446, 0x430, 0x443, 0x431, 0x43e, 0x43d, 0x3b, 0x43a, 0x44a,
+0x443, 0x44b, 0x440, 0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x434, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x4d5, 0x440, 0x442, 0x44b, 0x446,
+0x446, 0x4d5, 0x433, 0x3b, 0x446, 0x44b, 0x43f, 0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b, 0x43c, 0x430, 0x439, 0x440, 0x4d5, 0x43c, 0x431,
+0x43e, 0x43d, 0x3b, 0x441, 0x430, 0x431, 0x430, 0x442, 0x425, 0x446, 0x431, 0x3b, 0x41a, 0x440, 0x441, 0x3b, 0x414, 0x446, 0x433, 0x3b,
+0x4d4, 0x440, 0x442, 0x3b, 0x426, 0x43f, 0x440, 0x3b, 0x41c, 0x440, 0x431, 0x3b, 0x421, 0x431, 0x442, 0x445, 0x446, 0x431, 0x3b, 0x43a,
+0x440, 0x441, 0x3b, 0x434, 0x446, 0x433, 0x3b, 0x4d5, 0x440, 0x442, 0x3b, 0x446, 0x43f, 0x440, 0x3b, 0x43c, 0x440, 0x431, 0x3b, 0x441,
+0x431, 0x442, 0x425, 0x3b, 0x41a, 0x3b, 0x414, 0x3b, 0x4d4, 0x3b, 0x426, 0x3b, 0x41c, 0x3b, 0x421, 0x53, 0x76, 0x6f, 0x6e, 0x64,
+0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x68, 0x75, 0x72, 0x6f, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68,
+0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68, 0x61, 0x6e, 0x75,
+0x3b, 0x4d, 0x75, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x53, 0x76, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x3b, 0x43, 0x68, 0x70,
+0x3b, 0x43, 0x68, 0x74, 0x3b, 0x43, 0x68, 0x6e, 0x3b, 0x43, 0x68, 0x73, 0x3b, 0x4d, 0x75, 0x67, 0x53, 0x3b, 0x4d, 0x3b,
+0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4d, 0x622, 0x686, 0x631, 0x3b, 0x633, 0x648, 0x645, 0x631, 0x3b, 0x627, 0x6b1,
+0x627, 0x631, 0x648, 0x3b, 0x627, 0x631, 0x628, 0x639, 0x3b, 0x62e, 0x645, 0x64a, 0x633, 0x3b, 0x62c, 0x645, 0x639, 0x648, 0x3b, 0x687,
+0x646, 0x687, 0x631, 0x622, 0x686, 0x631, 0x3b, 0x633, 0x648, 0x3b, 0x627, 0x6b1, 0x627, 0x631, 0x648, 0x3b, 0x627, 0x631, 0x628, 0x639,
+0x3b, 0x62e, 0x645, 0x3b, 0x62c, 0x645, 0x639, 0x648, 0x3b, 0x687, 0x646, 0x687, 0x631, 0xd89, 0xdbb, 0xdd2, 0xdaf, 0xdcf, 0x3b, 0xdc3,
+0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0xdbb, 0xdd4, 0xdc0, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf,
+0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0xdb4, 0xdad, 0xdd2, 0xdb1, 0xdca, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4,
+0xdbb, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xdc3, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0xd89, 0xdbb, 0xdd2, 0xdaf, 0xdcf, 0x3b,
+0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0x3b, 0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb,
+0xdc4, 0xdc3, 0xdca, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xd89, 0x3b, 0xdc3, 0x3b, 0xd85, 0x3b, 0xdb6, 0x3b,
+0xdb6, 0xdca, 0x200d, 0xdbb, 0x3b, 0xdc3, 0xdd2, 0x3b, 0xdc3, 0xdd9, 0x6e, 0x65, 0x64, 0x65, 0x13e, 0x61, 0x3b, 0x70, 0x6f, 0x6e,
+0x64, 0x65, 0x6c, 0x6f, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x6f, 0x6b, 0x3b, 0x73, 0x74, 0x72, 0x65, 0x64, 0x61, 0x3b,
+0x161, 0x74, 0x76, 0x72, 0x74, 0x6f, 0x6b, 0x3b, 0x70, 0x69, 0x61, 0x74, 0x6f, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74,
+0x61, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0x75, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x161, 0x74, 0x3b, 0x70, 0x69, 0x3b, 0x73,
+0x6f, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x161, 0x3b, 0x70, 0x3b, 0x73, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a,
+0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x65, 0x6b, 0x3b, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x73,
+0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x65, 0x6b, 0x3b, 0x73,
+0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x65, 0x64, 0x2e, 0x3b, 0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b,
+0x73, 0x72, 0x65, 0x2e, 0x3b, 0x10d, 0x65, 0x74, 0x2e, 0x3b, 0x70, 0x65, 0x74, 0x2e, 0x3b, 0x73, 0x6f, 0x62, 0x2e, 0x6e,
+0x3b, 0x70, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x41, 0x78, 0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e,
+0x69, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x61, 0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x61, 0x63, 0x6f, 0x3b, 0x4b,
+0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x3b, 0x4a, 0x69, 0x6d, 0x63, 0x6f, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x69, 0x41, 0x78,
+0x64, 0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x54, 0x6c, 0x64, 0x6f, 0x3b, 0x41, 0x72, 0x62, 0x63, 0x3b, 0x4b, 0x68, 0x6d, 0x73,
+0x3b, 0x4a, 0x6d, 0x63, 0x3b, 0x53, 0x62, 0x74, 0x69, 0x41, 0x3b, 0x49, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x4b, 0x68, 0x3b,
+0x4a, 0x3b, 0x53, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72,
+0x74, 0x65, 0x73, 0x3b, 0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x6a, 0x75, 0x65, 0x76, 0x65, 0x73,
+0x3b, 0x76, 0x69, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x64, 0x6f, 0x6d, 0x2e, 0x3b,
+0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x69, 0xe9, 0x2e, 0x3b, 0x6a, 0x75, 0x65, 0x2e, 0x3b,
+0x76, 0x69, 0x65, 0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
+0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x73, 0xf6, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61,
+0x67, 0x3b, 0x74, 0x69, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73,
+0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf6, 0x72, 0x64, 0x61, 0x67, 0x73, 0xf6, 0x6e,
+0x3b, 0x6d, 0xe5, 0x6e, 0x3b, 0x74, 0x69, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x66, 0x72,
+0x65, 0x3b, 0x6c, 0xf6, 0x72, 0x42f, 0x43a, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x414, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x435,
+0x3b, 0x421, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x427, 0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x41f, 0x430,
+0x43d, 0x4b7, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x4b6, 0x443, 0x43c, 0x44a, 0x430, 0x3b, 0x428, 0x430, 0x43d, 0x431, 0x435, 0x42f,
+0x448, 0x431, 0x3b, 0x414, 0x448, 0x431, 0x3b, 0x421, 0x448, 0x431, 0x3b, 0x427, 0x448, 0x431, 0x3b, 0x41f, 0x448, 0x431, 0x3b, 0x4b6,
+0x43c, 0x44a, 0x3b, 0x428, 0x43d, 0x431, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x4b6, 0x3b, 0x428, 0xb9e,
+0xbbe, 0xbaf, 0xbbf, 0xbb1, 0xbc1, 0x3b, 0xba4, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbb5, 0xbcd, 0xbb5, 0xbbe,
+0xbaf, 0xbcd, 0x3b, 0xbaa, 0xbc1, 0xba4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0xbb4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbc6, 0xbb3,
+0xbcd, 0xbb3, 0xbbf, 0x3b, 0xb9a, 0xba9, 0xbbf, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0x2e, 0x3b, 0xba4, 0xbbf, 0xb99, 0xbcd, 0x2e, 0x3b, 0xb9a,
+0xbc6, 0xbb5, 0xbcd, 0x2e, 0x3b, 0xbaa, 0xbc1, 0xba4, 0x2e, 0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0x2e, 0x3b, 0xbb5, 0xbc6, 0xbb3, 0xbcd,
+0x2e, 0x3b, 0xb9a, 0xba9, 0xbbf, 0xb9e, 0xbbe, 0x3b, 0xba4, 0xbbf, 0x3b, 0xb9a, 0xbc6, 0x3b, 0xbaa, 0xbc1, 0x3b, 0xbb5, 0xbbf, 0x3b,
+0xbb5, 0xbc6, 0x3b, 0xb9a, 0x44f, 0x43a, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x434, 0x4af, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b,
+0x441, 0x438, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x43f, 0x4d9, 0x43d,
+0x497, 0x435, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x497, 0x43e, 0x43c, 0x433, 0x430, 0x3b, 0x448, 0x438, 0x43c, 0x431, 0x4d9, 0x44f,
+0x43a, 0x448, 0x2e, 0x3b, 0x434, 0x4af, 0x448, 0x2e, 0x3b, 0x441, 0x438, 0x448, 0x2e, 0x3b, 0x447, 0x4d9, 0x440, 0x2e, 0x3b, 0x43f,
+0x4d9, 0x43d, 0x497, 0x2e, 0x3b, 0x497, 0x43e, 0x43c, 0x2e, 0x3b, 0x448, 0x438, 0x43c, 0x2e, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b,
+0x427, 0x3b, 0x41f, 0x3b, 0x496, 0x3b, 0x428, 0xc06, 0xc26, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc38, 0xc4b, 0xc2e, 0xc35, 0xc3e,
+0xc30, 0xc02, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc2c, 0xc41, 0xc27, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b,
+0xc17, 0xc41, 0xc30, 0xc41, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36,
+0xc28, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0xc06, 0xc26, 0xc3f, 0x3b, 0xc38, 0xc4b, 0xc2e, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0x3b, 0xc2c,
+0xc41, 0xc27, 0x3b, 0xc17, 0xc41, 0xc30, 0xc41, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0x3b, 0xc36, 0xc28, 0xc3f, 0xc06, 0x3b, 0xc38,
+0xc4b, 0x3b, 0xc2e, 0x3b, 0xc2c, 0xc41, 0x3b, 0xc17, 0xc41, 0x3b, 0xc36, 0xc41, 0x3b, 0xc36, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe32, 0xe17,
+0xe34, 0xe15, 0xe22, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe08, 0xe31, 0xe19, 0xe17, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe31,
+0xe07, 0xe04, 0xe32, 0xe23, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe38, 0xe18, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe24, 0xe2b, 0xe31, 0xe2a,
+0xe1a, 0xe14, 0xe35, 0x3b, 0xe27, 0xe31, 0xe19, 0xe28, 0xe38, 0xe01, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe40, 0xe2a, 0xe32, 0xe23,
+0xe4c, 0xe2d, 0xe32, 0x2e, 0x3b, 0xe08, 0x2e, 0x3b, 0xe2d, 0x2e, 0x3b, 0xe1e, 0x2e, 0x3b, 0xe1e, 0xe24, 0x2e, 0x3b, 0xe28, 0x2e,
+0x3b, 0xe2a, 0x2e, 0xe2d, 0xe32, 0x3b, 0xe08, 0x3b, 0xe2d, 0x3b, 0xe1e, 0x3b, 0xe1e, 0xe24, 0x3b, 0xe28, 0x3b, 0xe2a, 0xf42, 0xf5f,
+0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f,
+0xf60, 0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54,
+0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b,
+0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58,
+0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7, 0xf42,
+0xf0b, 0xf54, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66,
+0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0xf49, 0xf72, 0x3b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72, 0xf42, 0x3b, 0xf63, 0xfb7, 0xf42, 0x3b,
+0xf55, 0xf74, 0xf62, 0x3b, 0xf66, 0xf44, 0xf66, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x1230, 0x1295, 0x1260, 0x1275, 0x3b, 0x1230, 0x1291, 0x12ed,
+0x3b, 0x1220, 0x1209, 0x1235, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1283, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1262, 0x3b, 0x1240, 0x12f3, 0x121d,
+0x1230, 0x1295, 0x3b, 0x1230, 0x1291, 0x3b, 0x1230, 0x1209, 0x3b, 0x1228, 0x1261, 0x3b, 0x1213, 0x1219, 0x3b, 0x12d3, 0x122d, 0x3b, 0x1240, 0x12f3,
+0x1230, 0x3b, 0x1230, 0x3b, 0x1220, 0x3b, 0x1228, 0x3b, 0x1213, 0x3b, 0x12d3, 0x3b, 0x1240, 0x1230, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1228,
+0x3b, 0x1213, 0x3b, 0x12d3, 0x3b, 0x1240, 0x53, 0x101, 0x70, 0x61, 0x74, 0x65, 0x3b, 0x4d, 0x14d, 0x6e, 0x69, 0x74, 0x65, 0x3b,
+0x54, 0x16b, 0x73, 0x69, 0x74, 0x65, 0x3b, 0x50, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x54, 0x75, 0x2bb, 0x61,
+0x70, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x46, 0x61, 0x6c, 0x61, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x6f, 0x6b,
+0x6f, 0x6e, 0x61, 0x6b, 0x69, 0x53, 0x101, 0x70, 0x3b, 0x4d, 0x14d, 0x6e, 0x3b, 0x54, 0x16b, 0x73, 0x3b, 0x50, 0x75, 0x6c,
+0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x3b, 0x46, 0x61, 0x6c, 0x3b, 0x54, 0x6f, 0x6b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x50,
+0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x54, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x74, 0x65, 0x73,
+0x69, 0x3b, 0x53, 0x61, 0x6c, 0x131, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x72, 0x15f,
+0x65, 0x6d, 0x62, 0x65, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x50,
+0x61, 0x7a, 0x3b, 0x50, 0x7a, 0x74, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0xc7, 0x61, 0x72, 0x3b, 0x50, 0x65, 0x72, 0x3b, 0x43,
+0x75, 0x6d, 0x3b, 0x43, 0x6d, 0x74, 0x50, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x43, 0xdd,
+0x65, 0x6b, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x44, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x53, 0x69, 0x15f, 0x65,
+0x6e, 0x62, 0x65, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x50, 0x65, 0x6e, 0x15f, 0x65, 0x6e, 0x62,
+0x65, 0x3b, 0x41, 0x6e, 0x6e, 0x61, 0x3b, 0x15e, 0x65, 0x6e, 0x62, 0x65, 0xfd, 0x65, 0x6b, 0x15f, 0x65, 0x6e, 0x62, 0x65,
+0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x73, 0x69, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0xe7, 0x61, 0x72,
+0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x70, 0x65, 0x6e, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x61, 0x6e, 0x6e, 0x61, 0x3b,
+0x15f, 0x65, 0x6e, 0x62, 0x65, 0xdd, 0x65, 0x6b, 0x3b, 0x44, 0x75, 0x15f, 0x3b, 0x53, 0x69, 0x15f, 0x3b, 0xc7, 0x61, 0x72,
+0x3b, 0x50, 0x65, 0x6e, 0x3b, 0x41, 0x6e, 0x6e, 0x3b, 0x15e, 0x65, 0x6e, 0xfd, 0x65, 0x6b, 0x3b, 0x64, 0x75, 0x15f, 0x3b,
+0x73, 0x69, 0x15f, 0x3b, 0xe7, 0x61, 0x72, 0x3b, 0x70, 0x65, 0x6e, 0x3b, 0x61, 0x6e, 0x6e, 0x3b, 0x15f, 0x65, 0x6e, 0xdd,
+0x3b, 0x44, 0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x15e, 0x64a, 0x6d5, 0x643, 0x634, 0x6d5, 0x646, 0x628, 0x6d5,
0x3b, 0x62f, 0x6c8, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x633, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x686, 0x627,
0x631, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x67e, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x62c, 0x6c8, 0x645, 0x6d5,
-0x3b, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x64a, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c, 0x3b, 0x634,
-0x3b, 0x43d, 0x435, 0x434, 0x456, 0x43b, 0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x456, 0x43b, 0x43e, 0x43a, 0x3b, 0x432, 0x456,
-0x432, 0x442, 0x43e, 0x440, 0x43e, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440,
-0x3b, 0x43f, 0x2bc, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x44f, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x41d, 0x3b, 0x41f,
-0x3b, 0x412, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x3b, 0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631,
-0x3b, 0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639, 0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639,
-0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1, 0x3b, 0x59, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0x73, 0x68, 0x3b, 0x53, 0x65, 0x73, 0x68,
-0x3b, 0x43, 0x68, 0x6f, 0x72, 0x3b, 0x50, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x68, 0x61, 0x6e, 0x3b, 0x79,
-0x61, 0x6b, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x64, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x73, 0x65,
-0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x70, 0x61,
-0x79, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b,
-0x59, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x6cc, 0x2e, 0x3b, 0x62f, 0x2e, 0x3b,
-0x633, 0x2e, 0x3b, 0x686, 0x2e, 0x3b, 0x67e, 0x2e, 0x3b, 0x62c, 0x2e, 0x3b, 0x634, 0x2e, 0x3b, 0x44f, 0x43a, 0x448, 0x3b, 0x434,
-0x443, 0x448, 0x3b, 0x441, 0x435, 0x448, 0x3b, 0x447, 0x43e, 0x440, 0x3b, 0x43f, 0x430, 0x439, 0x3b, 0x436, 0x443, 0x43c, 0x3b, 0x448,
-0x430, 0x43d, 0x3b, 0x44f, 0x43a, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x434, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x441,
-0x435, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x447, 0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x43f, 0x430, 0x439, 0x448,
-0x430, 0x43d, 0x431, 0x430, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x42f, 0x3b, 0x414, 0x3b,
-0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x416, 0x3b, 0x428, 0x3b, 0x43, 0x4e, 0x3b, 0x54, 0x68, 0x20, 0x32, 0x3b, 0x54, 0x68,
-0x20, 0x33, 0x3b, 0x54, 0x68, 0x20, 0x34, 0x3b, 0x54, 0x68, 0x20, 0x35, 0x3b, 0x54, 0x68, 0x20, 0x36, 0x3b, 0x54, 0x68,
-0x20, 0x37, 0x3b, 0x43, 0x68, 0x1ee7, 0x20, 0x4e, 0x68, 0x1ead, 0x74, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x48, 0x61, 0x69, 0x3b,
-0x54, 0x68, 0x1ee9, 0x20, 0x42, 0x61, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x54, 0x1b0, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x4e, 0x103,
-0x6d, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x53, 0xe1, 0x75, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x42, 0x1ea3, 0x79, 0x3b, 0x43, 0x4e,
-0x3b, 0x54, 0x32, 0x3b, 0x54, 0x33, 0x3b, 0x54, 0x34, 0x3b, 0x54, 0x35, 0x3b, 0x54, 0x36, 0x3b, 0x54, 0x37, 0x3b, 0x53,
-0x75, 0x3b, 0x4d, 0x75, 0x3b, 0x54, 0x75, 0x3b, 0x56, 0x65, 0x3b, 0x44, 0xf6, 0x3b, 0x46, 0x72, 0x3b, 0x5a, 0xe4, 0x3b,
-0x73, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x6d, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x74, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x76, 0x65,
-0x64, 0x65, 0x6c, 0x3b, 0x64, 0xf6, 0x64, 0x65, 0x6c, 0x3b, 0x66, 0x72, 0x69, 0x64, 0x65, 0x6c, 0x3b, 0x7a, 0xe4, 0x64,
-0x65, 0x6c, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x56, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x5a, 0x3b, 0x73, 0x75, 0x2e,
-0x3b, 0x6d, 0x75, 0x2e, 0x3b, 0x74, 0x75, 0x2e, 0x3b, 0x76, 0x65, 0x2e, 0x3b, 0x64, 0xf6, 0x2e, 0x3b, 0x66, 0x72, 0x2e,
-0x3b, 0x7a, 0xe4, 0x2e, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x65,
-0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x53,
-0x75, 0x6c, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x61,
-0x77, 0x72, 0x74, 0x68, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x68, 0x65, 0x72, 0x3b, 0x44, 0x79,
-0x64, 0x64, 0x20, 0x49, 0x61, 0x75, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x44,
-0x79, 0x64, 0x64, 0x20, 0x53, 0x61, 0x64, 0x77, 0x72, 0x6e, 0x3b, 0x53, 0x3b, 0x4c, 0x6c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b,
-0x49, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d,
-0x65, 0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x44, 0x69, 0x62, 0x3b,
-0x41, 0x6c, 0x74, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0xc0, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x78, 0x3b, 0xc0, 0x6a, 0x6a, 0x3b,
-0x41, 0x73, 0x65, 0x3b, 0x44, 0x69, 0x62, 0xe9, 0x65, 0x72, 0x3b, 0x41, 0x6c, 0x74, 0x69, 0x6e, 0x65, 0x3b, 0x54, 0x61,
-0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0xc0, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x78, 0x61, 0x6d, 0x69, 0x73,
-0x3b, 0xc0, 0x6a, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x65, 0x65, 0x72, 0x3b, 0x43, 0x61, 0x77, 0x3b, 0x4d, 0x76,
-0x75, 0x3b, 0x42, 0x69, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67,
-0x71, 0x3b, 0x43, 0x61, 0x77, 0x65, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69,
-0x6e, 0x69, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69,
-0x6e, 0x65, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65,
-0x6c, 0x6f, 0x3b, 0x5d6, 0x5d5, 0x5e0, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5de, 0x5d0, 0x5b8, 0x5e0, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5d3, 0x5d9,
-0x5e0, 0x5e1, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5de, 0x5d9, 0x5d8, 0x5d5, 0x5d5, 0x5d0, 0x5da, 0x3b, 0x5d3, 0x5d0, 0x5e0, 0x5e2, 0x5e8, 0x5e9,
-0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e4, 0x5bf, 0x5e8, 0x5f2, 0x5b7, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0x3b, 0xc0, 0xec, 0x6b,
-0x3b, 0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301,
-0x62, 0x3b, 0x1eb8, 0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x3b, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc,
-0x73, 0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd,
-0x3b, 0x1eb8, 0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61, 0x3b, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b,
-0x1ecc, 0x3b, 0x1ecc, 0x3b, 0x1eb8, 0x3b, 0xc0, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x1ecc, 0x6a,
-0x1ecd, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b,
-0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x1eb8,
-0x74, 0xec, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61, 0x3b, 0xc0, 0xec, 0x6b,
-0x3b, 0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x72, 0x3b, 0x186, 0x6a, 0x254, 0x301,
-0x62, 0x3b, 0x190, 0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x3b, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc,
-0x73, 0x25b, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x254,
-0x3b, 0x190, 0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0x3b, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b,
-0x186, 0x3b, 0x186, 0x3b, 0x190, 0x3b, 0xc0, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x186, 0x6a,
+0x3b, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x64a, 0x6d5, 0x3b, 0x62f, 0x6c8, 0x3b, 0x633, 0x6d5, 0x3b, 0x686, 0x627, 0x3b, 0x67e, 0x6d5,
+0x3b, 0x62c, 0x6c8, 0x3b, 0x634, 0x6d5, 0x64a, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c, 0x3b, 0x634, 0x43d,
+0x435, 0x434, 0x456, 0x43b, 0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x456, 0x43b, 0x43e, 0x43a, 0x3b, 0x432, 0x456, 0x432, 0x442,
+0x43e, 0x440, 0x43e, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x3b, 0x43f,
+0x2bc, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x44f, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x41d, 0x3b, 0x41f, 0x3b, 0x412, 0x3b,
+0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645, 0x646, 0x6af,
+0x644, 0x3b, 0x628, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639, 0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641,
+0x62a, 0x6c1, 0x79, 0x61, 0x6b, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x64, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61,
+0x3b, 0x73, 0x65, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61,
+0x3b, 0x70, 0x61, 0x79, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x68, 0x61, 0x6e,
+0x62, 0x61, 0x59, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0x73, 0x68, 0x3b, 0x53, 0x65, 0x73, 0x68, 0x3b, 0x43, 0x68, 0x6f, 0x72,
+0x3b, 0x50, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x68, 0x61, 0x6e, 0x59, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x43,
+0x3b, 0x50, 0x3b, 0x4a, 0x3b, 0x53, 0x6cc, 0x2e, 0x3b, 0x62f, 0x2e, 0x3b, 0x633, 0x2e, 0x3b, 0x686, 0x2e, 0x3b, 0x67e, 0x2e,
+0x3b, 0x62c, 0x2e, 0x3b, 0x634, 0x2e, 0x44f, 0x43a, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x434, 0x443, 0x448, 0x430, 0x43d, 0x431,
+0x430, 0x3b, 0x441, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x447, 0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x43f,
+0x430, 0x439, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x44f, 0x43a,
+0x448, 0x3b, 0x434, 0x443, 0x448, 0x3b, 0x441, 0x435, 0x448, 0x3b, 0x447, 0x43e, 0x440, 0x3b, 0x43f, 0x430, 0x439, 0x3b, 0x436, 0x443,
+0x43c, 0x3b, 0x448, 0x430, 0x43d, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x416, 0x3b, 0x428, 0x43, 0x68,
+0x1ee7, 0x20, 0x4e, 0x68, 0x1ead, 0x74, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x48, 0x61, 0x69, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x42,
+0x61, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x54, 0x1b0, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x4e, 0x103, 0x6d, 0x3b, 0x54, 0x68, 0x1ee9,
+0x20, 0x53, 0xe1, 0x75, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x42, 0x1ea3, 0x79, 0x43, 0x4e, 0x3b, 0x54, 0x68, 0x20, 0x32, 0x3b,
+0x54, 0x68, 0x20, 0x33, 0x3b, 0x54, 0x68, 0x20, 0x34, 0x3b, 0x54, 0x68, 0x20, 0x35, 0x3b, 0x54, 0x68, 0x20, 0x36, 0x3b,
+0x54, 0x68, 0x20, 0x37, 0x43, 0x4e, 0x3b, 0x54, 0x32, 0x3b, 0x54, 0x33, 0x3b, 0x54, 0x34, 0x3b, 0x54, 0x35, 0x3b, 0x54,
+0x36, 0x3b, 0x54, 0x37, 0x73, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x6d, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x74, 0x75, 0x64, 0x65,
+0x6c, 0x3b, 0x76, 0x65, 0x64, 0x65, 0x6c, 0x3b, 0x64, 0xf6, 0x64, 0x65, 0x6c, 0x3b, 0x66, 0x72, 0x69, 0x64, 0x65, 0x6c,
+0x3b, 0x7a, 0xe4, 0x64, 0x65, 0x6c, 0x53, 0x75, 0x3b, 0x4d, 0x75, 0x3b, 0x54, 0x75, 0x3b, 0x56, 0x65, 0x3b, 0x44, 0xf6,
+0x3b, 0x46, 0x72, 0x3b, 0x5a, 0xe4, 0x73, 0x75, 0x2e, 0x3b, 0x6d, 0x75, 0x2e, 0x3b, 0x74, 0x75, 0x2e, 0x3b, 0x76, 0x65,
+0x2e, 0x3b, 0x64, 0xf6, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x7a, 0xe4, 0x2e, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x56,
+0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x5a, 0x44, 0x79, 0x64, 0x64, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20,
+0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x61, 0x77, 0x72, 0x74, 0x68, 0x3b, 0x44, 0x79, 0x64,
+0x64, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x68, 0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x49, 0x61, 0x75, 0x3b, 0x44,
+0x79, 0x64, 0x64, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x53, 0x61, 0x64, 0x77,
+0x72, 0x6e, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x49,
+0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d,
+0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b, 0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x64, 0x53,
+0x3b, 0x4c, 0x6c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x47, 0x3b, 0x53, 0x44, 0x69, 0x62, 0xe9, 0x65, 0x72, 0x3b,
+0x41, 0x6c, 0x74, 0x69, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0xc0, 0x6c, 0x61, 0x72, 0x62,
+0x61, 0x3b, 0x41, 0x6c, 0x78, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0xc0, 0x6a, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x65,
+0x65, 0x72, 0x44, 0x69, 0x62, 0x3b, 0x41, 0x6c, 0x74, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0xc0, 0x6c, 0x61, 0x3b, 0x41, 0x6c,
+0x78, 0x3b, 0xc0, 0x6a, 0x6a, 0x3b, 0x41, 0x73, 0x65, 0x43, 0x61, 0x77, 0x65, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b,
+0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6e, 0x69, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68,
+0x75, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75,
+0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x43, 0x61, 0x77, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x42, 0x69, 0x6e,
+0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x5d6, 0x5d5, 0x5e0, 0x5d8,
+0x5d9, 0x5e7, 0x3b, 0x5de, 0x5d0, 0x5b8, 0x5e0, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5d3, 0x5d9, 0x5e0, 0x5e1, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5de,
+0x5d9, 0x5d8, 0x5d5, 0x5d5, 0x5d0, 0x5da, 0x3b, 0x5d3, 0x5d0, 0x5e0, 0x5e2, 0x5e8, 0x5e9, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e4, 0x5bf, 0x5e8,
+0x5f2, 0x5b7, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73,
+0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b,
+0x1eb8, 0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0xec, 0x6b,
+0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xcc, 0x73, 0x1eb9, 0x301,
+0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b, 0x1ecc, 0x6a,
+0x1ecd, 0x301, 0x20, 0x1eb8, 0x74, 0xec, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61,
+0xc0, 0xec, 0x6b, 0x3b, 0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0x3b, 0x1ecc,
+0x6a, 0x1ecd, 0x301, 0x62, 0x3b, 0x1eb8, 0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b, 0x1ecc, 0x3b,
+0x1ecc, 0x3b, 0x1eb8, 0x3b, 0xc0, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x75,
+0x6e, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x254, 0x3b, 0x190, 0x74, 0xec, 0x3b,
+0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x186, 0x6a,
0x254, 0x301, 0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x75, 0x6e, 0x3b,
0x186, 0x6a, 0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x254, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0x190,
-0x74, 0xec, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0x3b, 0x53, 0x6f, 0x6e,
-0x3b, 0x4d, 0x73, 0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61,
-0x3b, 0x4d, 0x67, 0x71, 0x3b, 0x49, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x55, 0x4d, 0x73, 0x6f, 0x6d, 0x62, 0x75, 0x6c,
-0x75, 0x6b, 0x6f, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73,
-0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x55, 0x4c, 0x77,
-0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x55, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x53,
-0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0xe5, 0x6e,
-0x3b, 0x74, 0x79, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0x61, 0x75,
-0x3b, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x79, 0x73, 0x64, 0x61,
-0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65,
-0x64, 0x61, 0x67, 0x3b, 0x6c, 0x61, 0x75, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x73, 0xf8, 0x2e, 0x3b, 0x6d, 0xe5, 0x2e, 0x3b,
-0x74, 0x79, 0x2e, 0x3b, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x6c, 0x61, 0x2e, 0x3b,
-0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x438, 0x3b, 0x447, 0x435, 0x442, 0x3b,
-0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x3b, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435,
-0x434, 0x458, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435, 0x434,
-0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431,
-0x43e, 0x442, 0x430, 0x3b, 0x4a, 0x65, 0x64, 0x3b, 0x4a, 0x65, 0x6c, 0x3b, 0x4a, 0x65, 0x6d, 0x3b, 0x4a, 0x65, 0x72, 0x63,
-0x3b, 0x4a, 0x65, 0x72, 0x64, 0x3b, 0x4a, 0x65, 0x68, 0x3b, 0x4a, 0x65, 0x73, 0x3b, 0x4a, 0x65, 0x64, 0x6f, 0x6f, 0x6e,
-0x65, 0x65, 0x3b, 0x4a, 0x65, 0x6c, 0x68, 0x65, 0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x6d, 0x61, 0x79, 0x72, 0x74, 0x3b, 0x4a,
-0x65, 0x72, 0x63, 0x65, 0x61, 0x6e, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x65, 0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x68, 0x65, 0x69,
-0x6e, 0x65, 0x79, 0x3b, 0x4a, 0x65, 0x73, 0x61, 0x72, 0x6e, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d,
-0x74, 0x68, 0x3b, 0x4d, 0x68, 0x72, 0x3b, 0x59, 0x6f, 0x77, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x64,
-0x79, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x64, 0x79, 0x20, 0x4c, 0x75, 0x6e, 0x3b, 0x64, 0x79, 0x20, 0x4d, 0x65, 0x75, 0x72,
-0x74, 0x68, 0x3b, 0x64, 0x79, 0x20, 0x4d, 0x65, 0x72, 0x68, 0x65, 0x72, 0x3b, 0x64, 0x79, 0x20, 0x59, 0x6f, 0x77, 0x3b,
-0x64, 0x79, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x64, 0x79, 0x20, 0x53, 0x61, 0x64, 0x6f, 0x72, 0x6e, 0x3b,
+0x74, 0xec, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0xc0, 0xec, 0x6b, 0x3b,
+0x41, 0x6a, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x72, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62,
+0x3b, 0x190, 0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b, 0x186, 0x3b, 0x186, 0x3b, 0x190, 0x3b,
+0xc0, 0x49, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x55, 0x4d, 0x73, 0x6f, 0x6d, 0x62, 0x75, 0x6c, 0x75, 0x6b, 0x6f, 0x3b,
+0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61,
+0x74, 0x68, 0x75, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x68,
+0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x55, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x73,
+0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67,
+0x71, 0x53, 0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x48, 0x3b, 0x4d, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67,
+0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x79, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61,
+0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0x61, 0x75,
+0x72, 0x64, 0x61, 0x67, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0xe5, 0x6e, 0x3b, 0x74, 0x79, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b,
+0x74, 0x6f, 0x72, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0x61, 0x75, 0x73, 0xf8, 0x2e, 0x3b, 0x6d, 0xe5, 0x2e, 0x3b, 0x74,
+0x79, 0x2e, 0x3b, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x6c, 0x61, 0x2e, 0x43d, 0x435,
+0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e,
+0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a,
+0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d,
+0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x438, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431,
+0x4a, 0x65, 0x64, 0x6f, 0x6f, 0x6e, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x6c, 0x68, 0x65, 0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x6d,
+0x61, 0x79, 0x72, 0x74, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x65, 0x61, 0x6e, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x65, 0x69, 0x6e,
+0x3b, 0x4a, 0x65, 0x68, 0x65, 0x69, 0x6e, 0x65, 0x79, 0x3b, 0x4a, 0x65, 0x73, 0x61, 0x72, 0x6e, 0x4a, 0x65, 0x64, 0x3b,
+0x4a, 0x65, 0x6c, 0x3b, 0x4a, 0x65, 0x6d, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x3b, 0x4a, 0x65,
+0x68, 0x3b, 0x4a, 0x65, 0x73, 0x64, 0x79, 0x20, 0x53, 0x75, 0x6c, 0x3b, 0x64, 0x79, 0x20, 0x4c, 0x75, 0x6e, 0x3b, 0x64,
+0x79, 0x20, 0x4d, 0x65, 0x75, 0x72, 0x74, 0x68, 0x3b, 0x64, 0x79, 0x20, 0x4d, 0x65, 0x72, 0x68, 0x65, 0x72, 0x3b, 0x64,
+0x79, 0x20, 0x59, 0x6f, 0x77, 0x3b, 0x64, 0x79, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x64, 0x79, 0x20, 0x53,
+0x61, 0x64, 0x6f, 0x72, 0x6e, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x74, 0x68, 0x3b, 0x4d, 0x68, 0x72,
+0x3b, 0x59, 0x6f, 0x77, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x4b, 0x77, 0x65, 0x73, 0x69, 0x64, 0x61, 0x3b,
+0x44, 0x77, 0x6f, 0x77, 0x64, 0x61, 0x3b, 0x42, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x3b, 0x57, 0x75, 0x6b, 0x75, 0x64, 0x61,
+0x3b, 0x59, 0x61, 0x77, 0x64, 0x61, 0x3b, 0x46, 0x69, 0x64, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x65, 0x6e, 0x65, 0x64, 0x61,
0x4b, 0x77, 0x65, 0x3b, 0x44, 0x77, 0x6f, 0x3b, 0x42, 0x65, 0x6e, 0x3b, 0x57, 0x75, 0x6b, 0x3b, 0x59, 0x61, 0x77, 0x3b,
-0x46, 0x69, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x3b, 0x4b, 0x77, 0x65, 0x73, 0x69, 0x64, 0x61, 0x3b, 0x44, 0x77, 0x6f, 0x77,
-0x64, 0x61, 0x3b, 0x42, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x3b, 0x57, 0x75, 0x6b, 0x75, 0x64, 0x61, 0x3b, 0x59, 0x61, 0x77,
-0x64, 0x61, 0x3b, 0x46, 0x69, 0x64, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x65, 0x6e, 0x65, 0x64, 0x61, 0x3b, 0x4b, 0x3b, 0x44,
-0x3b, 0x42, 0x3b, 0x57, 0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x906, 0x92f, 0x924, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e,
-0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930,
-0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x93e, 0x930, 0x3b, 0x936, 0x947, 0x928, 0x935, 0x93e, 0x930, 0x3b,
-0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x917, 0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x947, 0x3b,
+0x46, 0x69, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x4b, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x57, 0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x4d,
+0x906, 0x92f, 0x924, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x93e, 0x930, 0x3b, 0x92c,
+0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x93e,
+0x930, 0x3b, 0x936, 0x947, 0x928, 0x935, 0x93e, 0x930, 0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x917,
+0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x947, 0x53, 0x1ecd, 0x6e, 0x64, 0x65, 0x65, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x64, 0x65, 0x3b,
+0x54, 0x69, 0x75, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x57, 0x65, 0x6e, 0x65, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x54, 0x1ecd, 0x1ecd,
+0x7a, 0x64, 0x65, 0x65, 0x3b, 0x46, 0x72, 0x61, 0x1ecb, 0x64, 0x65, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x1ecd, 0x64, 0x65, 0x65,
0x1ee4, 0x6b, 0x61, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x3b, 0x54, 0x69, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x3b,
-0x46, 0x72, 0x61, 0x1ecb, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x53, 0x1ecd, 0x6e, 0x64, 0x65, 0x65, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x64,
-0x65, 0x3b, 0x54, 0x69, 0x75, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x57, 0x65, 0x6e, 0x65, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x54,
-0x1ecd, 0x1ecd, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x46, 0x72, 0x61, 0x1ecb, 0x64, 0x65, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x1ecd, 0x64,
-0x65, 0x65, 0x3b, 0x57, 0x6b, 0x79, 0x3b, 0x57, 0x6b, 0x77, 0x3b, 0x57, 0x6b, 0x6c, 0x3b, 0x57, 0x74, 0x169, 0x3b, 0x57,
-0x6b, 0x6e, 0x3b, 0x57, 0x74, 0x6e, 0x3b, 0x57, 0x74, 0x68, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x79, 0x75, 0x6d, 0x77, 0x61,
-0x3b, 0x57, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6d, 0x62, 0x129, 0x6c, 0x129, 0x6c, 0x79, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b,
-0x65, 0x6c, 0x129, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x6e,
-0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x57, 0x61, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74,
-0x68, 0x61, 0x74, 0x169, 0x3b, 0x59, 0x3b, 0x57, 0x3b, 0x45, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x64,
-0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0x65, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76,
-0x69, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x3b, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73,
-0x3b, 0x6d, 0x61, 0x72, 0x74, 0x61, 0x72, 0x73, 0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x75, 0x73, 0x3b, 0x6a, 0x6f, 0x69,
-0x62, 0x65, 0x3b, 0x76, 0x69, 0x6e, 0x61, 0x72, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x69, 0x64, 0x65, 0x3b, 0x6b, 0x254, 0x73,
-0x3b, 0x64, 0x7a, 0x6f, 0x3b, 0x62, 0x6c, 0x61, 0x3b, 0x6b, 0x75, 0x256, 0x3b, 0x79, 0x61, 0x77, 0x3b, 0x66, 0x69, 0x256,
-0x3b, 0x6d, 0x65, 0x6d, 0x3b, 0x6b, 0x254, 0x73, 0x69, 0x256, 0x61, 0x3b, 0x64, 0x7a, 0x6f, 0x256, 0x61, 0x3b, 0x62, 0x6c,
-0x61, 0x256, 0x61, 0x3b, 0x6b, 0x75, 0x256, 0x61, 0x3b, 0x79, 0x61, 0x77, 0x6f, 0x256, 0x61, 0x3b, 0x66, 0x69, 0x256, 0x61,
-0x3b, 0x6d, 0x65, 0x6d, 0x6c, 0x65, 0x256, 0x61, 0x3b, 0x6b, 0x3b, 0x64, 0x3b, 0x62, 0x3b, 0x6b, 0x3b, 0x79, 0x3b, 0x66,
-0x3b, 0x6d, 0x3b, 0x4c, 0x50, 0x3b, 0x50, 0x31, 0x3b, 0x50, 0x32, 0x3b, 0x50, 0x33, 0x3b, 0x50, 0x34, 0x3b, 0x50, 0x35,
-0x3b, 0x50, 0x36, 0x3b, 0x4c, 0x101, 0x70, 0x75, 0x6c, 0x65, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x61, 0x68, 0x69, 0x3b,
-0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x75, 0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x6f, 0x6c, 0x75, 0x3b, 0x50, 0x6f, 0x2bb,
-0x61, 0x68, 0x101, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x69, 0x6d, 0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6f, 0x6e, 0x6f,
-0x3b, 0x4c, 0x69, 0x6e, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x79, 0x3b, 0x48, 0x75, 0x77,
-0x3b, 0x42, 0x69, 0x79, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4c, 0x69, 0x6e, 0x67, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65,
-0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65, 0x72, 0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b,
-0x48, 0x75, 0x77, 0x65, 0x62, 0x65, 0x73, 0x3b, 0x42, 0x69, 0x79, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x62,
-0x61, 0x64, 0x6f, 0x3b, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0xe4, 0x2e, 0x3b, 0x5a, 0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b,
-0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0x75, 0x6e, 0x6e, 0x74, 0x69, 0x67, 0x3b,
-0x4d, 0xe4, 0xe4, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x5a, 0x69, 0x69, 0x73, 0x63, 0x68, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0x69,
-0x74, 0x74, 0x77, 0x75, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x74, 0x69, 0x67, 0x3b, 0x46, 0x72, 0x69,
-0x69, 0x74, 0x69, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x74, 0x69, 0x67, 0x3b, 0xa46d, 0xa18f, 0x3b, 0xa18f, 0xa2cd,
-0x3b, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa315, 0x3b, 0xa18f, 0xa1d6, 0x3b, 0xa18f, 0xa26c, 0x3b, 0xa18f, 0xa0d8, 0x3b, 0xa46d, 0xa18f, 0xa44d, 0x3b,
-0xa18f, 0xa282, 0xa2cd, 0x3b, 0xa18f, 0xa282, 0xa44d, 0x3b, 0xa18f, 0xa282, 0xa315, 0x3b, 0xa18f, 0xa282, 0xa1d6, 0x3b, 0xa18f, 0xa282, 0xa26c, 0x3b,
-0xa18f, 0xa282, 0xa0d8, 0x3b, 0xa18f, 0x3b, 0xa2cd, 0x3b, 0xa44d, 0x3b, 0xa315, 0x3b, 0xa1d6, 0x3b, 0xa26c, 0x3b, 0xa0d8, 0x3b, 0x53, 0xfc,
-0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72,
-0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0xfc, 0x6e, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61,
+0x46, 0x72, 0x61, 0x1ecb, 0x3b, 0x53, 0x61, 0x74, 0x57, 0x61, 0x20, 0x6b, 0x79, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x57, 0x61,
+0x20, 0x6b, 0x77, 0x61, 0x6d, 0x62, 0x129, 0x6c, 0x129, 0x6c, 0x79, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129,
+0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x57,
+0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x57, 0x61, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74,
+0x169, 0x57, 0x6b, 0x79, 0x3b, 0x57, 0x6b, 0x77, 0x3b, 0x57, 0x6b, 0x6c, 0x3b, 0x57, 0x74, 0x169, 0x3b, 0x57, 0x6b, 0x6e,
+0x3b, 0x57, 0x74, 0x6e, 0x3b, 0x57, 0x74, 0x68, 0x59, 0x3b, 0x57, 0x3b, 0x45, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b,
+0x41, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x65, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x61,
+0x72, 0x73, 0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x75, 0x73, 0x3b, 0x6a, 0x6f, 0x69, 0x62, 0x65, 0x3b, 0x76, 0x69, 0x6e,
+0x61, 0x72, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x69, 0x64, 0x65, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61,
+0x72, 0x3b, 0x6d, 0x69, 0x65, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x6b, 0x254, 0x73,
+0x69, 0x256, 0x61, 0x3b, 0x64, 0x7a, 0x6f, 0x256, 0x61, 0x3b, 0x62, 0x6c, 0x61, 0x256, 0x61, 0x3b, 0x6b, 0x75, 0x256, 0x61,
+0x3b, 0x79, 0x61, 0x77, 0x6f, 0x256, 0x61, 0x3b, 0x66, 0x69, 0x256, 0x61, 0x3b, 0x6d, 0x65, 0x6d, 0x6c, 0x65, 0x256, 0x61,
+0x6b, 0x254, 0x73, 0x3b, 0x64, 0x7a, 0x6f, 0x3b, 0x62, 0x6c, 0x61, 0x3b, 0x6b, 0x75, 0x256, 0x3b, 0x79, 0x61, 0x77, 0x3b,
+0x66, 0x69, 0x256, 0x3b, 0x6d, 0x65, 0x6d, 0x6b, 0x3b, 0x64, 0x3b, 0x62, 0x3b, 0x6b, 0x3b, 0x79, 0x3b, 0x66, 0x3b, 0x6d,
+0x4c, 0x101, 0x70, 0x75, 0x6c, 0x65, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x61, 0x68, 0x69, 0x3b, 0x50, 0x6f, 0x2bb, 0x61,
+0x6c, 0x75, 0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x6f, 0x6c, 0x75, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x68, 0x101, 0x3b,
+0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x69, 0x6d, 0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6f, 0x6e, 0x6f, 0x4c, 0x50, 0x3b, 0x50,
+0x31, 0x3b, 0x50, 0x32, 0x3b, 0x50, 0x33, 0x3b, 0x50, 0x34, 0x3b, 0x50, 0x35, 0x3b, 0x50, 0x36, 0x4c, 0x69, 0x6e, 0x67,
+0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65,
+0x72, 0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b, 0x48, 0x75, 0x77, 0x65, 0x62, 0x65, 0x73, 0x3b, 0x42, 0x69, 0x79, 0x65, 0x72,
+0x6e, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x4c, 0x69, 0x6e, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61,
+0x72, 0x3b, 0x4d, 0x69, 0x79, 0x3b, 0x48, 0x75, 0x77, 0x3b, 0x42, 0x69, 0x79, 0x3b, 0x53, 0x61, 0x62, 0x53, 0x75, 0x6e,
+0x6e, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0xe4, 0xe4, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x5a, 0x69, 0x69, 0x73, 0x63, 0x68, 0x74,
+0x69, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x75, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x74, 0x69,
+0x67, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x74, 0x69, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x74, 0x69, 0x67, 0x53,
+0x75, 0x2e, 0x3b, 0x4d, 0xe4, 0x2e, 0x3b, 0x5a, 0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46,
+0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0xa46d, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa282, 0xa2cd, 0x3b, 0xa18f, 0xa282, 0xa44d, 0x3b, 0xa18f, 0xa282,
+0xa315, 0x3b, 0xa18f, 0xa282, 0xa1d6, 0x3b, 0xa18f, 0xa282, 0xa26c, 0x3b, 0xa18f, 0xa282, 0xa0d8, 0xa46d, 0xa18f, 0x3b, 0xa18f, 0xa2cd, 0x3b, 0xa18f,
+0xa44d, 0x3b, 0xa18f, 0xa315, 0x3b, 0xa18f, 0xa1d6, 0x3b, 0xa18f, 0xa26c, 0x3b, 0xa18f, 0xa0d8, 0xa18f, 0x3b, 0xa2cd, 0x3b, 0xa44d, 0x3b, 0xa315,
+0x3b, 0xa1d6, 0x3b, 0xa26c, 0x3b, 0xa0d8, 0x53, 0xfc, 0x6e, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61,
0x67, 0x3b, 0x44, 0x69, 0x6e, 0x67, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x64, 0x64, 0x65, 0x77, 0x65, 0x6b, 0x65,
0x6e, 0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x65, 0x64, 0x61, 0x67,
-0x3b, 0x53, 0xfc, 0x6e, 0x6e, 0x61, 0x76, 0x65, 0x6e, 0x64, 0x3b, 0x73, 0x6f, 0x74, 0x6e, 0x3b, 0x76, 0x75, 0x6f, 0x73,
+0x3b, 0x53, 0xfc, 0x6e, 0x6e, 0x61, 0x76, 0x65, 0x6e, 0x64, 0x53, 0xfc, 0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69,
+0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x73, 0x6f, 0x74,
+0x6e, 0x61, 0x62, 0x65, 0x61, 0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x6d,
+0x61, 0x14b, 0x14b, 0x65, 0x62, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b,
+0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x61, 0x73, 0x64, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61,
+0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76, 0x61, 0x72, 0x64, 0x61, 0x74, 0x73, 0x6f, 0x74, 0x6e, 0x3b, 0x76, 0x75, 0x6f, 0x73,
0x3b, 0x6d, 0x61, 0x14b, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x3b,
-0x6c, 0xe1, 0x76, 0x3b, 0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62, 0x65, 0x61, 0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73,
-0x73, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x6d, 0x61, 0x14b, 0x14b, 0x65, 0x62, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x67, 0x61, 0x73,
-0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x61, 0x73, 0x64, 0x61, 0x74, 0x3b, 0x62,
-0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76, 0x61, 0x72, 0x64, 0x61, 0x74, 0x3b, 0x53,
-0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x73, 0x6f, 0x3b, 0x6d, 0xe1, 0x3b, 0x64,
-0x69, 0x3b, 0x67, 0x61, 0x3b, 0x64, 0x75, 0x3b, 0x62, 0x65, 0x3b, 0x6c, 0xe1, 0x3b, 0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62,
-0x65, 0x61, 0x69, 0x76, 0x69, 0x3b, 0x6d, 0xe1, 0x6e, 0x6e, 0x6f, 0x64, 0x61, 0x74, 0x3b, 0x64, 0x69, 0x73, 0x64, 0x61,
-0x74, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x61, 0x73,
-0x74, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76, 0x6f, 0x72,
-0x64, 0x61, 0x74, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x43, 0x70,
-0x72, 0x3b, 0x43, 0x74, 0x74, 0x3b, 0x43, 0x6d, 0x6e, 0x3b, 0x43, 0x6d, 0x74, 0x3b, 0x41, 0x72, 0x73, 0x3b, 0x49, 0x63,
-0x6d, 0x3b, 0x45, 0x73, 0x74, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6d,
-0x61, 0x74, 0x61, 0x74, 0x6f, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61,
-0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x63, 0x68, 0x75, 0x6d, 0x61, 0x3b,
-0x45, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x49, 0x3b,
-0x45, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61,
-0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4e, 0x67, 0x75, 0x3b, 0x49, 0x74, 0x75, 0x6b, 0x75, 0x20, 0x6a, 0x61, 0x20, 0x6a,
-0x75, 0x6d, 0x77, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6a, 0x69, 0x6d, 0x77, 0x65, 0x72,
-0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61,
-0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61,
-0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61, 0x6e,
-0x75, 0x3b, 0x4b, 0x69, 0x66, 0x75, 0x6c, 0x61, 0x20, 0x6e, 0x67, 0x75, 0x77, 0x6f, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4b,
-0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x64, 0x65, 0x77, 0x3b, 0x61, 0x61, 0x253, 0x3b, 0x6d, 0x61, 0x77,
-0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x3b, 0x6d, 0x77, 0x64, 0x3b, 0x68, 0x62, 0x69, 0x3b, 0x64, 0x65, 0x77,
-0x6f, 0x3b, 0x61, 0x61, 0x253, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x62, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x6a,
-0x65, 0x73, 0x6c, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x73, 0x61, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61,
-0x77, 0x6e, 0x64, 0x65, 0x3b, 0x68, 0x6f, 0x6f, 0x72, 0x65, 0x2d, 0x62, 0x69, 0x69, 0x72, 0x3b, 0x64, 0x3b, 0x61, 0x3b,
-0x6d, 0x3b, 0x6e, 0x3b, 0x6e, 0x3b, 0x6d, 0x3b, 0x68, 0x3b, 0x4b, 0x4d, 0x41, 0x3b, 0x4e, 0x54, 0x54, 0x3b, 0x4e, 0x4d,
-0x4e, 0x3b, 0x4e, 0x4d, 0x54, 0x3b, 0x41, 0x52, 0x54, 0x3b, 0x4e, 0x4d, 0x41, 0x3b, 0x4e, 0x4d, 0x4d, 0x3b, 0x4b, 0x69,
-0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61,
-0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x74,
-0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69,
-0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x72, 0x65, 0x3b, 0x4b,
-0x75, 0x6e, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70, 0x3b, 0x4b,
-0x77, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x61, 0x72, 0x65, 0x3b, 0x4d, 0x64, 0x65,
+0x6c, 0xe1, 0x76, 0x53, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x73, 0x6f, 0x74, 0x6e,
+0x61, 0x62, 0x65, 0x61, 0x69, 0x76, 0x69, 0x3b, 0x6d, 0xe1, 0x6e, 0x6e, 0x6f, 0x64, 0x61, 0x74, 0x3b, 0x64, 0x69, 0x73,
+0x64, 0x61, 0x74, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72,
+0x61, 0x73, 0x74, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76,
+0x6f, 0x72, 0x64, 0x61, 0x74, 0x73, 0x6f, 0x3b, 0x6d, 0xe1, 0x3b, 0x64, 0x69, 0x3b, 0x67, 0x61, 0x3b, 0x64, 0x75, 0x3b,
+0x62, 0x65, 0x3b, 0x6c, 0xe1, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x43, 0x68,
+0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x6f, 0x3b, 0x43, 0x68,
+0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61,
+0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x63, 0x68, 0x75, 0x6d, 0x61, 0x3b, 0x45, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x43,
+0x70, 0x72, 0x3b, 0x43, 0x74, 0x74, 0x3b, 0x43, 0x6d, 0x6e, 0x3b, 0x43, 0x6d, 0x74, 0x3b, 0x41, 0x72, 0x73, 0x3b, 0x49,
+0x63, 0x6d, 0x3b, 0x45, 0x73, 0x74, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x45, 0x49,
+0x74, 0x75, 0x6b, 0x75, 0x20, 0x6a, 0x61, 0x20, 0x6a, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75,
+0x6b, 0x61, 0x20, 0x6a, 0x69, 0x6d, 0x77, 0x65, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20,
+0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75,
+0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d,
+0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4b, 0x69, 0x66, 0x75, 0x6c, 0x61, 0x20, 0x6e, 0x67,
+0x75, 0x77, 0x6f, 0x4a, 0x75, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b,
+0x61, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4e, 0x67, 0x75, 0x4a, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b,
+0x4b, 0x3b, 0x4e, 0x64, 0x65, 0x77, 0x6f, 0x3b, 0x61, 0x61, 0x253, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x62, 0x61,
+0x61, 0x72, 0x65, 0x3b, 0x6e, 0x6a, 0x65, 0x73, 0x6c, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x73, 0x61, 0x61,
+0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x6e, 0x64, 0x65, 0x3b, 0x68, 0x6f, 0x6f, 0x72, 0x65, 0x2d, 0x62, 0x69, 0x69,
+0x72, 0x64, 0x65, 0x77, 0x3b, 0x61, 0x61, 0x253, 0x3b, 0x6d, 0x61, 0x77, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x6e, 0x61, 0x61,
+0x3b, 0x6d, 0x77, 0x64, 0x3b, 0x68, 0x62, 0x69, 0x64, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6e, 0x3b, 0x6e, 0x3b, 0x6d, 0x3b,
+0x68, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4e, 0x6a,
+0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x61, 0x3b, 0x41, 0x72, 0x61,
+0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f,
+0x74, 0x68, 0x69, 0x4b, 0x4d, 0x41, 0x3b, 0x4e, 0x54, 0x54, 0x3b, 0x4e, 0x4d, 0x4e, 0x3b, 0x4e, 0x4d, 0x54, 0x3b, 0x41,
+0x52, 0x54, 0x3b, 0x4e, 0x4d, 0x41, 0x3b, 0x4e, 0x4d, 0x4d, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b,
+0x4e, 0x3b, 0x4e, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x61, 0x72, 0x65, 0x3b, 0x4d, 0x64, 0x65,
0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65,
0x65, 0x20, 0x6f, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20,
0x69, 0x6e, 0x65, 0x74, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4d,
0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74,
-0x20, 0x65, 0x65, 0x20, 0x6b, 0x77, 0x65, 0x3b, 0x41, 0x3b, 0x4b, 0x3b, 0x4f, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b,
-0x4b, 0x3b, 0x44, 0x69, 0x6d, 0x3b, 0x50, 0x6f, 0x73, 0x3b, 0x50, 0x69, 0x72, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61,
-0x69, 0x3b, 0x53, 0x68, 0x61, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x44, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x43, 0x68,
-0x69, 0x70, 0x6f, 0x73, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74,
-0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x53, 0x61,
-0x62, 0x75, 0x64, 0x75, 0x3b, 0x44, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53,
-0x6f, 0x6e, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x53, 0x69, 0x62, 0x3b, 0x53, 0x69, 0x74, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x53,
-0x69, 0x68, 0x3b, 0x4d, 0x67, 0x71, 0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x53,
-0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x53, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x53, 0x69, 0x6e, 0x65, 0x3b,
-0x53, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x53, 0x3b, 0x4d,
-0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x49, 0x6a, 0x70, 0x3b, 0x49, 0x6a, 0x74, 0x3b, 0x49,
-0x6a, 0x6e, 0x3b, 0x49, 0x6a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x49, 0x6a, 0x6d, 0x3b,
-0x49, 0x6a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b,
-0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41,
-0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61,
-0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x31, 0x3b, 0x2d30,
-0x2d59, 0x2d30, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x3b, 0x2d30,
-0x2d59, 0x2d49, 0x2d4e, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x3b, 0x2d30, 0x2d59, 0x2d30, 0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x2d30,
-0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x2d30, 0x2d59,
-0x3b, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62, 0x2d30, 0x2d59, 0x3b, 0x61, 0x73, 0x61, 0x3b,
-0x61, 0x79, 0x6e, 0x3b, 0x61, 0x73, 0x69, 0x3b, 0x61, 0x6b, 0x1e5b, 0x3b, 0x61, 0x6b, 0x77, 0x3b, 0x61, 0x73, 0x69, 0x6d,
-0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x3b, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x61, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x61,
-0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x1e5b, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73,
-0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x79, 0x61, 0x73, 0x3b, 0x41, 0x63, 0x65, 0x3b, 0x41, 0x72,
-0x69, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x41, 0x68, 0x61, 0x3b, 0x41, 0x6d, 0x68, 0x3b, 0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65,
-0x64, 0x3b, 0x41, 0x63, 0x65, 0x72, 0x3b, 0x41, 0x72, 0x69, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x3b, 0x41, 0x68, 0x61,
-0x64, 0x3b, 0x41, 0x6d, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65, 0x64, 0x3b, 0x59, 0x3b, 0x53, 0x3b,
-0x4b, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x59, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x6e, 0x3b, 0x4b, 0x72,
-0x61, 0x1e0d, 0x3b, 0x4b, 0x75, 0x1e93, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x1e0d, 0x69, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x3b,
-0x59, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d, 0x61, 0x73,
-0x73, 0x3b, 0x4b, 0x75, 0x1e93, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6d, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x1e0d, 0x69, 0x73,
-0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x61, 0x73, 0x73, 0x3b, 0x43, 0x3b, 0x52, 0x3b, 0x41, 0x3b, 0x48, 0x3b, 0x4d,
-0x3b, 0x53, 0x3b, 0x44, 0x3b, 0x53, 0x41, 0x4e, 0x3b, 0x4f, 0x52, 0x4b, 0x3b, 0x4f, 0x4b, 0x42, 0x3b, 0x4f, 0x4b, 0x53,
-0x3b, 0x4f, 0x4b, 0x4e, 0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4f, 0x4d, 0x4b, 0x3b, 0x53, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x4f,
-0x72, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72,
-0x69, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61,
-0x6e, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6d,
-0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4d,
-0x3b, 0x4d, 0x75, 0x6c, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x48, 0x69, 0x76, 0x3b, 0x48, 0x69, 0x64, 0x3b, 0x48, 0x69, 0x74,
-0x3b, 0x48, 0x69, 0x68, 0x3b, 0x4c, 0x65, 0x6d, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b,
-0x70, 0x61, 0x20, 0x73, 0x68, 0x61, 0x68, 0x75, 0x76, 0x69, 0x6c, 0x75, 0x68, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69,
-0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69,
-0x74, 0x61, 0x79, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68,
-0x61, 0x68, 0x75, 0x6c, 0x65, 0x6d, 0x62, 0x65, 0x6c, 0x61, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x48,
-0x3b, 0x57, 0x3b, 0x4a, 0x3b, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e,
-0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c,
-0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49,
-0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a,
-0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x3b, 0x6b, 0x61, 0x72, 0x3b, 0x6e, 0x74, 0x25b, 0x3b, 0x74, 0x61, 0x72,
-0x3b, 0x61, 0x72, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x3b, 0x73, 0x69, 0x62, 0x3b, 0x6b, 0x61, 0x72,
-0x69, 0x3b, 0x6e, 0x74, 0x25b, 0x6e, 0x25b, 0x3b, 0x74, 0x61, 0x72, 0x61, 0x74, 0x61, 0x3b, 0x61, 0x72, 0x61, 0x62, 0x61,
-0x3b, 0x61, 0x6c, 0x61, 0x6d, 0x69, 0x73, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x69, 0x62, 0x69, 0x72, 0x69,
-0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x4b, 0x6d, 0x61, 0x3b, 0x54,
-0x61, 0x74, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6e, 0x3b, 0x41, 0x72, 0x6d, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4e,
-0x4d, 0x4d, 0x3b, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b,
-0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41,
-0x72, 0x61, 0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4e, 0x4a, 0x75, 0x6d, 0x61,
-0x6d, 0x6f, 0x74, 0x68, 0x69, 0x69, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4e,
-0x3b, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x3b, 0x13c5, 0x13a9, 0x13c1,
-0x3b, 0x13e7, 0x13be, 0x13a9, 0x3b, 0x13c8, 0x13d5, 0x13be, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13a4, 0x13be, 0x13d9,
-0x13d3, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13c5, 0x13a9, 0x13c1,
-0x13a2, 0x13a6, 0x3b, 0x13e7, 0x13be, 0x13a9, 0x13b6, 0x13cd, 0x13d7, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c8, 0x13d5, 0x13be, 0x3b, 0x13c6, 0x3b,
-0x13c9, 0x3b, 0x13d4, 0x3b, 0x13e6, 0x3b, 0x13c5, 0x3b, 0x13e7, 0x3b, 0x13a4, 0x3b, 0x64, 0x69, 0x6d, 0x3b, 0x6c, 0x69, 0x6e, 0x3b,
-0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x7a, 0x65, 0x3b, 0x76, 0x61, 0x6e, 0x3b, 0x73, 0x61, 0x6d, 0x3b, 0x64,
-0x69, 0x6d, 0x61, 0x6e, 0x73, 0x3b, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65,
-0x72, 0x6b, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x7a, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69,
-0x3b, 0x73, 0x61, 0x6d, 0x64, 0x69, 0x3b, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b, 0x76, 0x3b, 0x73,
-0x3b, 0x4c, 0x6c, 0x32, 0x3b, 0x4c, 0x6c, 0x33, 0x3b, 0x4c, 0x6c, 0x34, 0x3b, 0x4c, 0x6c, 0x35, 0x3b, 0x4c, 0x6c, 0x36,
-0x3b, 0x4c, 0x6c, 0x37, 0x3b, 0x4c, 0x6c, 0x31, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x70,
-0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4c,
-0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4c, 0x69, 0x64,
-0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61,
-0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6a, 0x69, 0x3b,
-0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20,
-0x6d, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x6e, 0x64,
-0x69, 0x3b, 0x50, 0xed, 0x69, 0x6c, 0x69, 0x3b, 0x54, 0xe1, 0x61, 0x74, 0x75, 0x3b, 0xcd, 0x6e, 0x65, 0x3b, 0x54, 0xe1,
-0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4d, 0xf3, 0x6f, 0x73, 0x69, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x70, 0xed, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0xed, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x61, 0x6d, 0xed,
-0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0xf3, 0x6f, 0x73, 0x69,
-0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x45, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x42,
-0x61, 0x6c, 0x3b, 0x4c, 0x77, 0x32, 0x3b, 0x4c, 0x77, 0x33, 0x3b, 0x4c, 0x77, 0x34, 0x3b, 0x4c, 0x77, 0x35, 0x3b, 0x4c,
-0x77, 0x36, 0x3b, 0x53, 0x61, 0x62, 0x62, 0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4c,
-0x77, 0x61, 0x6b, 0x75, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75, 0x3b, 0x4c,
-0x77, 0x61, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x77,
-0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c,
-0x3b, 0x4c, 0x3b, 0x50, 0x61, 0x20, 0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68,
-0x69, 0x6d, 0x6f, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x62, 0x75, 0x6c, 0x69, 0x3b, 0x50, 0x61, 0x6c, 0x69,
-0x63, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x3b, 0x50, 0x61,
-0x6c, 0x69, 0x63, 0x68, 0x69, 0x73, 0x61, 0x6e, 0x6f, 0x3b, 0x50, 0x61, 0x63, 0x68, 0x69, 0x62, 0x65, 0x6c, 0x75, 0x73,
-0x68, 0x69, 0x3b, 0x64, 0x75, 0x6d, 0x3b, 0x73, 0x69, 0x67, 0x3b, 0x74, 0x65, 0x72, 0x3b, 0x6b, 0x75, 0x61, 0x3b, 0x6b,
-0x69, 0x6e, 0x3b, 0x73, 0x65, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x3b, 0x64, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x73,
+0x20, 0x65, 0x65, 0x20, 0x6b, 0x77, 0x65, 0x41, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x6e, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49,
+0x6e, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70, 0x3b, 0x4b, 0x77, 0x65, 0x41, 0x3b, 0x4b, 0x3b, 0x4f, 0x3b,
+0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x4b, 0x44, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x6f,
+0x73, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43,
+0x68, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x53, 0x61, 0x62, 0x75, 0x64,
+0x75, 0x44, 0x69, 0x6d, 0x3b, 0x50, 0x6f, 0x73, 0x3b, 0x50, 0x69, 0x72, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x69,
+0x3b, 0x53, 0x68, 0x61, 0x3b, 0x53, 0x61, 0x62, 0x44, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x53, 0x3b,
+0x53, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x53, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b,
+0x53, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x53, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x68, 0x6c, 0x61, 0x6e,
+0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x53, 0x69,
+0x62, 0x3b, 0x53, 0x69, 0x74, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x53, 0x69, 0x68, 0x3b, 0x4d, 0x67, 0x71, 0x53, 0x3b, 0x4d,
+0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4d, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b,
+0x49, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x49,
+0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a,
+0x75, 0x6d, 0x61, 0x61, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x49, 0x6a, 0x70, 0x3b, 0x49, 0x6a,
+0x74, 0x3b, 0x49, 0x6a, 0x6e, 0x3b, 0x49, 0x6a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x49,
+0x6a, 0x6d, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x31, 0x2d30, 0x2d59, 0x2d30, 0x2d4e, 0x2d30,
+0x2d59, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59,
+0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62, 0x2d30,
+0x2d59, 0x2d30, 0x2d59, 0x2d30, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x3b, 0x2d30, 0x2d3d, 0x2d61,
+0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x61, 0x79, 0x6e,
+0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x1e5b, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x77, 0x61,
+0x73, 0x3b, 0x61, 0x73, 0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x79, 0x61, 0x73, 0x61, 0x73, 0x61,
+0x3b, 0x61, 0x79, 0x6e, 0x3b, 0x61, 0x73, 0x69, 0x3b, 0x61, 0x6b, 0x1e5b, 0x3b, 0x61, 0x6b, 0x77, 0x3b, 0x61, 0x73, 0x69,
+0x6d, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x41, 0x63, 0x65, 0x72, 0x3b, 0x41, 0x72, 0x69, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6d,
+0x3b, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x41, 0x6d, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65, 0x64, 0x59,
+0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d, 0x61, 0x73, 0x73,
+0x3b, 0x4b, 0x75, 0x1e93, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6d, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x1e0d, 0x69, 0x73, 0x61,
+0x73, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x61, 0x73, 0x73, 0x41, 0x63, 0x65, 0x3b, 0x41, 0x72, 0x69, 0x3b, 0x41, 0x72, 0x61,
+0x3b, 0x41, 0x68, 0x61, 0x3b, 0x41, 0x6d, 0x68, 0x3b, 0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65, 0x64, 0x59, 0x61, 0x6e, 0x3b,
+0x53, 0x61, 0x6e, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d, 0x3b, 0x4b, 0x75, 0x1e93, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x1e0d, 0x69,
+0x73, 0x3b, 0x53, 0x61, 0x79, 0x59, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x43, 0x3b,
+0x52, 0x3b, 0x41, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x44, 0x53, 0x61, 0x6e, 0x64, 0x65, 0x3b, 0x4f, 0x72, 0x77,
+0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b,
+0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61,
+0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6d, 0x75, 0x6b,
+0x61, 0x61, 0x67, 0x61, 0x53, 0x41, 0x4e, 0x3b, 0x4f, 0x52, 0x4b, 0x3b, 0x4f, 0x4b, 0x42, 0x3b, 0x4f, 0x4b, 0x53, 0x3b,
+0x4f, 0x4b, 0x4e, 0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4f, 0x4d, 0x4b, 0x53, 0x3b, 0x4b, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4e,
+0x3b, 0x54, 0x3b, 0x4d, 0x70, 0x61, 0x20, 0x6d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68,
+0x61, 0x68, 0x75, 0x76, 0x69, 0x6c, 0x75, 0x68, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x3b,
+0x70, 0x61, 0x20, 0x68, 0x69, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x74, 0x61, 0x79, 0x69, 0x3b,
+0x70, 0x61, 0x20, 0x68, 0x69, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68, 0x61, 0x68, 0x75, 0x6c, 0x65,
+0x6d, 0x62, 0x65, 0x6c, 0x61, 0x4d, 0x75, 0x6c, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x48, 0x69, 0x76, 0x3b, 0x48, 0x69, 0x64,
+0x3b, 0x48, 0x69, 0x74, 0x3b, 0x48, 0x69, 0x68, 0x3b, 0x4c, 0x65, 0x6d, 0x4d, 0x3b, 0x4a, 0x3b, 0x48, 0x3b, 0x48, 0x3b,
+0x48, 0x3b, 0x57, 0x3b, 0x4a, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
+0x61, 0x74, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e,
+0x75, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74,
+0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a,
+0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x6b, 0x61, 0x72, 0x69, 0x3b, 0x6e, 0x74, 0x25b, 0x6e, 0x25b, 0x3b, 0x74, 0x61, 0x72,
+0x61, 0x74, 0x61, 0x3b, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x6d, 0x69, 0x73, 0x61, 0x3b, 0x6a, 0x75,
+0x6d, 0x61, 0x3b, 0x73, 0x69, 0x62, 0x69, 0x72, 0x69, 0x6b, 0x61, 0x72, 0x3b, 0x6e, 0x74, 0x25b, 0x3b, 0x74, 0x61, 0x72,
+0x3b, 0x61, 0x72, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x3b, 0x73, 0x69, 0x62, 0x4b, 0x3b, 0x4e, 0x3b,
+0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x53, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d,
+0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61,
+0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61,
+0x3b, 0x4e, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x69, 0x4b, 0x6d, 0x61, 0x3b, 0x54, 0x61, 0x74, 0x3b,
+0x49, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6e, 0x3b, 0x41, 0x72, 0x6d, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4e, 0x4d, 0x4d, 0x4b,
+0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4e, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c6, 0x13cd, 0x13ac, 0x3b,
+0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x13a2, 0x13a6, 0x3b,
+0x13c5, 0x13a9, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13e7, 0x13be, 0x13a9, 0x13b6, 0x13cd, 0x13d7, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c8, 0x13d5, 0x13be,
+0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x3b, 0x13e6, 0x13a2, 0x13c1, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x3b,
+0x13e7, 0x13be, 0x13a9, 0x3b, 0x13c8, 0x13d5, 0x13be, 0x13c6, 0x3b, 0x13c9, 0x3b, 0x13d4, 0x3b, 0x13e6, 0x3b, 0x13c5, 0x3b, 0x13e7, 0x3b, 0x13a4,
+0x64, 0x69, 0x6d, 0x61, 0x6e, 0x73, 0x3b, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d,
+0x65, 0x72, 0x6b, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x7a, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x6e, 0x64, 0x72, 0x65, 0x64,
+0x69, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0x69, 0x64, 0x69, 0x6d, 0x3b, 0x6c, 0x69, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d,
+0x65, 0x72, 0x3b, 0x7a, 0x65, 0x3b, 0x76, 0x61, 0x6e, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d,
+0x3b, 0x7a, 0x3b, 0x76, 0x3b, 0x73, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x70, 0x69, 0x6c, 0x69,
+0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x69, 0x64, 0x75,
+0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61,
+0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79,
+0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6a, 0x69, 0x3b, 0x4c, 0x69, 0x64,
+0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x76,
+0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x4c, 0x6c,
+0x32, 0x3b, 0x4c, 0x6c, 0x33, 0x3b, 0x4c, 0x6c, 0x34, 0x3b, 0x4c, 0x6c, 0x35, 0x3b, 0x4c, 0x6c, 0x36, 0x3b, 0x4c, 0x6c,
+0x37, 0x3b, 0x4c, 0x6c, 0x31, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
+0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0xed, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x61, 0x6e,
+0x6f, 0x3b, 0x41, 0x6c, 0x61, 0x6d, 0xed, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x6d, 0xf3, 0x6f, 0x73, 0x69, 0x50, 0xed, 0x69, 0x6c, 0x69, 0x3b, 0x54, 0xe1, 0x61, 0x74, 0x75, 0x3b, 0xcd,
+0x6e, 0x65, 0x3b, 0x54, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4d, 0xf3, 0x6f,
+0x73, 0x69, 0x50, 0x3b, 0x54, 0x3b, 0x45, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4d, 0x53, 0x61, 0x62, 0x62, 0x69,
+0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x62, 0x69, 0x72, 0x69,
+0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4c,
+0x77, 0x61, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61,
+0x53, 0x61, 0x62, 0x3b, 0x42, 0x61, 0x6c, 0x3b, 0x4c, 0x77, 0x32, 0x3b, 0x4c, 0x77, 0x33, 0x3b, 0x4c, 0x77, 0x34, 0x3b,
+0x4c, 0x77, 0x35, 0x3b, 0x4c, 0x77, 0x36, 0x53, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c,
+0x50, 0x61, 0x20, 0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6d, 0x6f,
+0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x62, 0x75, 0x6c, 0x69, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69,
+0x74, 0x61, 0x74, 0x75, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63,
+0x68, 0x69, 0x73, 0x61, 0x6e, 0x6f, 0x3b, 0x50, 0x61, 0x63, 0x68, 0x69, 0x62, 0x65, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x64,
+0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x73, 0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b,
+0x74, 0x65, 0x72, 0x73, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65,
+0x72, 0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x61, 0x2d,
+0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x75, 0x64, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x73,
0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0x73, 0x61, 0x2d, 0x66, 0x65,
0x72, 0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61,
-0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0xe1, 0x62,
-0x61, 0x64, 0x75, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x64, 0x75,
-0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x73, 0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x74,
-0x65, 0x72, 0x73, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72,
-0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x61, 0x2d, 0x66,
-0x65, 0x72, 0x61, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x64, 0x75, 0x3b, 0x4b, 0x49, 0x55, 0x3b, 0x4d, 0x52, 0x41, 0x3b, 0x57,
-0x41, 0x49, 0x3b, 0x57, 0x45, 0x54, 0x3b, 0x57, 0x45, 0x4e, 0x3b, 0x57, 0x54, 0x4e, 0x3b, 0x4a, 0x55, 0x4d, 0x3b, 0x4b,
-0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4d, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x6f, 0x3b, 0x57, 0x61, 0x69, 0x72, 0x69,
-0x3b, 0x57, 0x65, 0x74, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x61, 0x3b, 0x57, 0x65, 0x74, 0x61, 0x6e, 0x6f,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b,
-0x57, 0x3b, 0x4a, 0x3b, 0x4b, 0x74, 0x73, 0x3b, 0x4b, 0x6f, 0x74, 0x3b, 0x4b, 0x6f, 0x6f, 0x3b, 0x4b, 0x6f, 0x73, 0x3b,
-0x4b, 0x6f, 0x61, 0x3b, 0x4b, 0x6f, 0x6d, 0x3b, 0x4b, 0x6f, 0x6c, 0x3b, 0x4b, 0x6f, 0x74, 0x69, 0x73, 0x61, 0x70, 0x3b,
-0x4b, 0x6f, 0x74, 0x61, 0x61, 0x69, 0x3b, 0x4b, 0x6f, 0x61, 0x65, 0x6e, 0x67, 0x2019, 0x3b, 0x4b, 0x6f, 0x73, 0x6f, 0x6d,
-0x6f, 0x6b, 0x3b, 0x4b, 0x6f, 0x61, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4b, 0x6f, 0x6d, 0x75, 0x75, 0x74, 0x3b,
-0x4b, 0x6f, 0x6c, 0x6f, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x53,
-0x6f, 0x6e, 0x3b, 0x4d, 0x61, 0x3b, 0x44, 0x65, 0x3b, 0x57, 0x75, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61,
-0x74, 0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x6e, 0x74, 0x61, 0x78,
-0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x57,
-0x75, 0x6e, 0x73, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x74, 0x61,
-0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x46, 0x72, 0x61, 0x69, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b,
-0x53, 0x61, 0x74, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x45, 0x3b,
-0x57, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x41, 0x3b, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b,
-0x4d, 0x65, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0x75, 0x6e, 0x6e,
-0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4d, 0x6f, 0x68, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x6e, 0x6e,
-0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4d, 0x65, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65,
-0x72, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x53, 0x61,
-0x6d, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x6c, 0xed, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x6e,
-0x254, 0x3b, 0x41, 0x6c, 0x61, 0xe1, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x6d, 0xf3, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x62, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x3b, 0x4b, 0x75, 0x62, 0x69,
-0x3b, 0x4b, 0x75, 0x73, 0x61, 0x3b, 0x4b, 0x75, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x74, 0x61, 0x3b, 0x4d, 0x75, 0x6b, 0x61,
-0x3b, 0x53, 0x61, 0x62, 0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4f, 0x77, 0x6f, 0x6b,
-0x75, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b,
-0x75, 0x6e, 0x61, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x75, 0x3b, 0x4f, 0x6c, 0x6f, 0x6d, 0x75,
-0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x42, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b,
-0x4a, 0x32, 0x3b, 0x4a, 0x33, 0x3b, 0x4a, 0x34, 0x3b, 0x4a, 0x35, 0x3b, 0x41, 0x6c, 0x3b, 0x49, 0x6a, 0x3b, 0x4a, 0x31,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a,
-0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x75, 0x72, 0x77,
-0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20,
-0x4b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x4a, 0x70, 0x69, 0x3b,
-0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b,
-0x4a, 0x6d, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x42, 0x61, 0x72, 0x3b, 0x41, 0x61, 0x72, 0x3b, 0x55, 0x6e, 0x69, 0x3b,
-0x55, 0x6e, 0x67, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x65, 0x6a, 0x75, 0x6d,
-0x61, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x65, 0x62, 0x61, 0x72, 0x61, 0x73, 0x61, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x61, 0x72,
-0x65, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75, 0x6e, 0x67, 0x2019, 0x6f, 0x6e,
-0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x6b, 0x61, 0x6e, 0x79, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x73, 0x61, 0x62, 0x69, 0x74, 0x69,
-0x3b, 0x4a, 0x3b, 0x42, 0x3b, 0x41, 0x3b, 0x55, 0x3b, 0x55, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x41,
-0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x6a, 0x3b, 0x41,
-0x73, 0x73, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c,
-0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61,
-0x3b, 0x41, 0x6c, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x73, 0x61, 0x62, 0x64, 0x75, 0x3b, 0x48, 0x3b, 0x54, 0x3b,
-0x54, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x4a, 0x4d, 0x50, 0x3b, 0x57, 0x55, 0x54, 0x3b, 0x54, 0x41,
-0x52, 0x3b, 0x54, 0x41, 0x44, 0x3b, 0x54, 0x41, 0x4e, 0x3b, 0x54, 0x41, 0x42, 0x3b, 0x4e, 0x47, 0x53, 0x3b, 0x4a, 0x75,
+0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x61, 0x62,
+0x61, 0x64, 0x75, 0x64, 0x75, 0x6d, 0x3b, 0x73, 0x69, 0x67, 0x3b, 0x74, 0x65, 0x72, 0x3b, 0x6b, 0x75, 0x61, 0x3b, 0x6b,
+0x69, 0x6e, 0x3b, 0x73, 0x65, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x44, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b,
+0x53, 0x3b, 0x53, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4d, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x6f, 0x3b, 0x57,
+0x61, 0x69, 0x72, 0x69, 0x3b, 0x57, 0x65, 0x74, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x61, 0x3b, 0x57, 0x65,
+0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4b, 0x49, 0x55, 0x3b, 0x4d, 0x52, 0x41,
+0x3b, 0x57, 0x41, 0x49, 0x3b, 0x57, 0x45, 0x54, 0x3b, 0x57, 0x45, 0x4e, 0x3b, 0x57, 0x54, 0x4e, 0x3b, 0x4a, 0x55, 0x4d,
+0x4b, 0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x4a, 0x4b, 0x6f, 0x74, 0x69, 0x73, 0x61, 0x70,
+0x3b, 0x4b, 0x6f, 0x74, 0x61, 0x61, 0x69, 0x3b, 0x4b, 0x6f, 0x61, 0x65, 0x6e, 0x67, 0x2019, 0x3b, 0x4b, 0x6f, 0x73, 0x6f,
+0x6d, 0x6f, 0x6b, 0x3b, 0x4b, 0x6f, 0x61, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4b, 0x6f, 0x6d, 0x75, 0x75, 0x74,
+0x3b, 0x4b, 0x6f, 0x6c, 0x6f, 0x4b, 0x74, 0x73, 0x3b, 0x4b, 0x6f, 0x74, 0x3b, 0x4b, 0x6f, 0x6f, 0x3b, 0x4b, 0x6f, 0x73,
+0x3b, 0x4b, 0x6f, 0x61, 0x3b, 0x4b, 0x6f, 0x6d, 0x3b, 0x4b, 0x6f, 0x6c, 0x54, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x53, 0x3b,
+0x41, 0x3b, 0x4d, 0x3b, 0x4c, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x6e,
+0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65,
+0x73, 0x3b, 0x57, 0x75, 0x6e, 0x73, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x6f, 0x6e, 0x64, 0x65,
+0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x46, 0x72, 0x61, 0x69, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65,
+0x65, 0x73, 0x3b, 0x53, 0x61, 0x74, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x53, 0x6f, 0x6e, 0x3b,
+0x4d, 0x61, 0x3b, 0x44, 0x65, 0x3b, 0x57, 0x75, 0x3b, 0x44, 0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x74, 0x53, 0x3b,
+0x4d, 0x3b, 0x45, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x41, 0x53, 0x75, 0x6e, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68,
+0x3b, 0x4d, 0x6f, 0x68, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x6e, 0x6e, 0x73, 0x64, 0x61, 0x61, 0x63,
+0x68, 0x3b, 0x4d, 0x65, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x61, 0x61,
+0x63, 0x68, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x64, 0x61, 0x61,
+0x63, 0x68, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x65, 0x2e, 0x3b, 0x44, 0x75,
+0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x6c, 0xed, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1,
+0x6e, 0x254, 0x3b, 0x41, 0x6c, 0x61, 0xe1, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x6d, 0xf3, 0x73, 0x69, 0x53, 0x61, 0x62, 0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a, 0x61,
+0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x73, 0x61, 0x74, 0x75,
+0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x75, 0x3b,
+0x4f, 0x6c, 0x6f, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x53, 0x61, 0x62, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x3b,
+0x4b, 0x75, 0x62, 0x69, 0x3b, 0x4b, 0x75, 0x73, 0x61, 0x3b, 0x4b, 0x75, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x74, 0x61, 0x3b,
+0x4d, 0x75, 0x6b, 0x61, 0x53, 0x3b, 0x42, 0x3b, 0x42, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x4a, 0x75, 0x6d,
+0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e,
+0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77, 0x61,
+0x20, 0x4b, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61, 0x74, 0x61,
+0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x32, 0x3b, 0x4a, 0x33, 0x3b, 0x4a, 0x34, 0x3b,
+0x4a, 0x35, 0x3b, 0x41, 0x6c, 0x3b, 0x49, 0x6a, 0x3b, 0x4a, 0x31, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a,
+0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4a, 0x6d, 0x6f, 0x4e, 0x61,
+0x6b, 0x61, 0x65, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x65, 0x62, 0x61, 0x72, 0x61, 0x73, 0x61, 0x3b,
+0x4e, 0x61, 0x6b, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x61, 0x6b, 0x61,
+0x75, 0x6e, 0x67, 0x2019, 0x6f, 0x6e, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x6b, 0x61, 0x6e, 0x79, 0x3b, 0x4e, 0x61, 0x6b, 0x61,
+0x73, 0x61, 0x62, 0x69, 0x74, 0x69, 0x4a, 0x75, 0x6d, 0x3b, 0x42, 0x61, 0x72, 0x3b, 0x41, 0x61, 0x72, 0x3b, 0x55, 0x6e,
+0x69, 0x3b, 0x55, 0x6e, 0x67, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x62, 0x4a, 0x3b, 0x42, 0x3b, 0x41, 0x3b, 0x55,
+0x3b, 0x55, 0x3b, 0x4b, 0x3b, 0x53, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x69, 0x3b, 0x41,
+0x74, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69,
+0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x73, 0x61, 0x62, 0x64, 0x75, 0x41, 0x6c,
+0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c,
+0x6a, 0x3b, 0x41, 0x73, 0x73, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x53, 0x4a, 0x75,
0x6d, 0x61, 0x70, 0x69, 0x6c, 0x3b, 0x57, 0x75, 0x6f, 0x6b, 0x20, 0x54, 0x69, 0x63, 0x68, 0x3b, 0x54, 0x69, 0x63, 0x68,
0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x64, 0x65, 0x6b, 0x3b, 0x54, 0x69, 0x63,
0x68, 0x20, 0x41, 0x6e, 0x67, 0x2019, 0x77, 0x65, 0x6e, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x62, 0x69, 0x63, 0x68,
-0x3b, 0x4e, 0x67, 0x65, 0x73, 0x6f, 0x3b, 0x4a, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4e,
-0x3b, 0x41, 0x73, 0x61, 0x3b, 0x41, 0x79, 0x6e, 0x3b, 0x41, 0x73, 0x6e, 0x3b, 0x41, 0x6b, 0x72, 0x3b, 0x41, 0x6b, 0x77,
-0x3b, 0x41, 0x73, 0x6d, 0x3b, 0x41, 0x73, 0x1e0d, 0x3b, 0x41, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x41, 0x79, 0x6e, 0x61,
-0x73, 0x3b, 0x41, 0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x72, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x77, 0x61, 0x73,
-0x3b, 0x41, 0x73, 0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x1e0d, 0x79, 0x61, 0x73, 0x3b, 0x41, 0x3b, 0x41,
-0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41,
-0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x7a, 0x3b, 0x41, 0x73, 0x69, 0x3b, 0x41,
+0x3b, 0x4e, 0x67, 0x65, 0x73, 0x6f, 0x4a, 0x4d, 0x50, 0x3b, 0x57, 0x55, 0x54, 0x3b, 0x54, 0x41, 0x52, 0x3b, 0x54, 0x41,
+0x44, 0x3b, 0x54, 0x41, 0x4e, 0x3b, 0x54, 0x41, 0x42, 0x3b, 0x4e, 0x47, 0x53, 0x4a, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x54,
+0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4e, 0x41, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x41, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x41,
+0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x72, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73,
+0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x1e0d, 0x79, 0x61, 0x73, 0x41, 0x73, 0x61, 0x3b, 0x41, 0x79, 0x6e,
+0x3b, 0x41, 0x73, 0x6e, 0x3b, 0x41, 0x6b, 0x72, 0x3b, 0x41, 0x6b, 0x77, 0x3b, 0x41, 0x73, 0x6d, 0x3b, 0x41, 0x73, 0x1e0d,
+0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b,
+0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72,
+0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x7a, 0x75, 0x6d, 0x61, 0x3b,
+0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x41, 0x6c, 0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c,
+0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x7a, 0x3b, 0x41, 0x73, 0x69, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x70, 0x69,
+0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6e, 0x65, 0x3b,
+0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49,
+0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4a, 0x70, 0x69, 0x3b, 0x4a,
+0x74, 0x74, 0x3b, 0x4a, 0x6d, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a,
+0x6d, 0x6f, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x31, 0x930, 0x92c, 0x93f, 0x92c, 0x93e,
+0x930, 0x3b, 0x938, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x926, 0x92c,
+0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x938, 0x925, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x941, 0x916, 0x941, 0x930, 0x92c, 0x93e, 0x930,
+0x3b, 0x938, 0x941, 0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x930, 0x92c, 0x93f, 0x3b, 0x938, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b,
+0x92c, 0x941, 0x926, 0x3b, 0x92c, 0x93f, 0x938, 0x925, 0x93f, 0x3b, 0x938, 0x941, 0x916, 0x941, 0x930, 0x3b, 0x938, 0x941, 0x928, 0x93f,
+0x930, 0x3b, 0x938, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x938, 0x941, 0x3b, 0x938, 0x941, 0x43a, 0x4c0,
+0x438, 0x440, 0x430, 0x3b, 0x43e, 0x440, 0x448, 0x43e, 0x442, 0x3b, 0x448, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x43a, 0x445, 0x430,
+0x430, 0x440, 0x430, 0x3b, 0x435, 0x430, 0x440, 0x430, 0x3b, 0x43f, 0x4c0, 0x435, 0x440, 0x430, 0x441, 0x43a, 0x430, 0x3b, 0x448, 0x443,
+0x43e, 0x442, 0x43a, 0x4c0, 0x438, 0x3b, 0x43e, 0x440, 0x3b, 0x448, 0x438, 0x3b, 0x43a, 0x445, 0x430, 0x3b, 0x435, 0x430, 0x3b, 0x43f,
+0x4c0, 0x435, 0x3b, 0x448, 0x443, 0x43e, 0x43a, 0x4c0, 0x3b, 0x43e, 0x3b, 0x448, 0x3b, 0x43a, 0x445, 0x3b, 0x435, 0x3b, 0x43f, 0x4c0,
+0x3b, 0x448, 0x43d, 0x435, 0x434, 0x463, 0x301, 0x43b, 0x467, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x463, 0x301, 0x43b, 0x44c, 0x43d,
+0x438, 0x43a, 0x44a, 0x3b, 0x432, 0x442, 0x43e, 0x301, 0x440, 0x43d, 0x438, 0x43a, 0x44a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x300,
+0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x442, 0x43e, 0x301, 0x43a, 0x44a, 0x3b, 0x43f, 0x467, 0x442, 0x43e, 0x301, 0x43a, 0x44a,
+0x3b, 0x441, 0xa64b, 0x431, 0x431, 0x461, 0x301, 0x442, 0x430, 0x43d, 0x434, 0x2de7, 0x487, 0x467, 0x3b, 0x43f, 0x43d, 0x2de3, 0x435, 0x3b,
+0x432, 0x442, 0x43e, 0x2dec, 0x487, 0x3b, 0x441, 0x440, 0x2de3, 0x435, 0x3b, 0x447, 0x435, 0x2de6, 0x487, 0x3b, 0x43f, 0x467, 0x2de6, 0x487,
+0x3b, 0x441, 0xa64b, 0x2de0, 0x487, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x4e, 0x6b, 0x6f, 0x64, 0x79, 0x61, 0x3b,
+0x4e, 0x64, 0xe0, 0x61, 0x79, 0xe0, 0x3b, 0x4e, 0x64, 0x61, 0x6e, 0x67, 0xf9, 0x3b, 0x4e, 0x6a, 0xf2, 0x77, 0x61, 0x3b,
+0x4e, 0x67, 0xf2, 0x76, 0x79, 0x61, 0x3b, 0x4c, 0x75, 0x62, 0x69, 0x6e, 0x67, 0x75, 0x4c, 0x75, 0x6d, 0x3b, 0x4e, 0x6b,
+0x6f, 0x3b, 0x4e, 0x64, 0x79, 0x3b, 0x4e, 0x64, 0x67, 0x3b, 0x4e, 0x6a, 0x77, 0x3b, 0x4e, 0x67, 0x76, 0x3b, 0x4c, 0x75,
+0x62, 0x4c, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4c, 0x53, 0x6f, 0x6e, 0x6e, 0x64, 0x65,
+0x67, 0x3b, 0x4d, 0xe9, 0x69, 0x6e, 0x64, 0x65, 0x67, 0x3b, 0x44, 0xeb, 0x6e, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x3b,
+0x4d, 0xeb, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67,
+0x3b, 0x46, 0x72, 0x65, 0x69, 0x64, 0x65, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x53, 0x6f,
+0x6e, 0x3b, 0x4d, 0xe9, 0x69, 0x3b, 0x44, 0xeb, 0x6e, 0x3b, 0x4d, 0xeb, 0x74, 0x3b, 0x44, 0x6f, 0x6e, 0x3b, 0x46, 0x72,
+0x65, 0x3b, 0x53, 0x61, 0x6d, 0x53, 0x6f, 0x6e, 0x2e, 0x3b, 0x4d, 0xe9, 0x69, 0x2e, 0x3b, 0x44, 0xeb, 0x6e, 0x2e, 0x3b,
+0x4d, 0xeb, 0x74, 0x2e, 0x3b, 0x44, 0x6f, 0x6e, 0x2e, 0x3b, 0x46, 0x72, 0x65, 0x2e, 0x3b, 0x53, 0x61, 0x6d, 0x2e, 0x74,
+0x73, 0x75, 0x294, 0x6e, 0x74, 0x73, 0x268, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x6b, 0x70, 0xe0, 0x3b, 0x74, 0x73, 0x75,
+0x294, 0x75, 0x67, 0x68, 0x254, 0x65, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x74, 0x254, 0x300, 0x6d, 0x6c, 0xf2, 0x3b, 0x74,
+0x73, 0x75, 0x294, 0x75, 0x6d, 0xe8, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x67, 0x68, 0x268, 0x302, 0x6d, 0x3b, 0x74, 0x73,
+0x75, 0x294, 0x6e, 0x64, 0x7a, 0x268, 0x6b, 0x254, 0x294, 0x254, 0x6e, 0x74, 0x73, 0x3b, 0x6b, 0x70, 0x61, 0x3b, 0x67, 0x68,
+0x254, 0x3b, 0x74, 0x254, 0x6d, 0x3b, 0x75, 0x6d, 0x65, 0x3b, 0x67, 0x68, 0x268, 0x3b, 0x64, 0x7a, 0x6b, 0x6e, 0x3b, 0x6b,
+0x3b, 0x67, 0x3b, 0x74, 0x3b, 0x75, 0x3b, 0x67, 0x3b, 0x64, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6e, 0x254, 0x302, 0x79, 0x3b,
+0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6e, 0x6a, 0x61, 0x14b, 0x67, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20,
+0xfb, 0x6d, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x14b, 0x67, 0xea, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6d, 0x62, 0x254,
+0x6b, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6b, 0x254, 0x254, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6a, 0xf4, 0x6e, 0x6e,
+0x254, 0x79, 0x3b, 0x6e, 0x6a, 0x61, 0x3b, 0x75, 0x75, 0x6d, 0x3b, 0x14b, 0x67, 0x65, 0x3b, 0x6d, 0x62, 0x254, 0x3b, 0x6b,
+0x254, 0x254, 0x3b, 0x6a, 0x6f, 0x6e, 0x6e, 0x3b, 0x6e, 0x3b, 0x75, 0x3b, 0x14b, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6a, 0x41,
0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x61, 0x74,
-0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x41,
-0x6c, 0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x3b, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74,
-0x3b, 0x4a, 0x6d, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x70, 0x69, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c,
-0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6d,
-0x6f, 0x73, 0x69, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x31, 0x3b, 0x930, 0x92c,
-0x93f, 0x3b, 0x938, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x926, 0x3b, 0x92c, 0x93f, 0x938, 0x925, 0x93f, 0x3b,
-0x938, 0x941, 0x916, 0x941, 0x930, 0x3b, 0x938, 0x941, 0x928, 0x93f, 0x3b, 0x930, 0x92c, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x92e,
-0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x926, 0x92c, 0x93e, 0x930, 0x3b, 0x92c,
-0x93f, 0x938, 0x925, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x941, 0x916, 0x941, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x941, 0x928,
-0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x930, 0x3b, 0x938, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x938, 0x941,
-0x3b, 0x938, 0x941, 0x3b, 0x43a, 0x4c0, 0x438, 0x3b, 0x43e, 0x440, 0x3b, 0x448, 0x438, 0x3b, 0x43a, 0x445, 0x430, 0x3b, 0x435, 0x430,
-0x3b, 0x43f, 0x4c0, 0x435, 0x3b, 0x448, 0x443, 0x43e, 0x3b, 0x43a, 0x4c0, 0x438, 0x440, 0x430, 0x3b, 0x43e, 0x440, 0x448, 0x43e, 0x442,
-0x3b, 0x448, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x43a, 0x445, 0x430, 0x430, 0x440, 0x430, 0x3b, 0x435, 0x430, 0x440, 0x430, 0x3b,
-0x43f, 0x4c0, 0x435, 0x440, 0x430, 0x441, 0x43a, 0x430, 0x3b, 0x448, 0x443, 0x43e, 0x442, 0x3b, 0x43a, 0x4c0, 0x3b, 0x43e, 0x3b, 0x448,
-0x3b, 0x43a, 0x445, 0x3b, 0x435, 0x3b, 0x43f, 0x4c0, 0x3b, 0x448, 0x3b, 0x43d, 0x434, 0x2de7, 0x487, 0x467, 0x3b, 0x43f, 0x43d, 0x2de3,
-0x435, 0x3b, 0x432, 0x442, 0x43e, 0x2dec, 0x487, 0x3b, 0x441, 0x440, 0x2de3, 0x435, 0x3b, 0x447, 0x435, 0x2de6, 0x487, 0x3b, 0x43f, 0x467,
-0x2de6, 0x487, 0x3b, 0x441, 0xa64b, 0x2de0, 0x487, 0x3b, 0x43d, 0x435, 0x434, 0x463, 0x301, 0x43b, 0x467, 0x3b, 0x43f, 0x43e, 0x43d, 0x435,
-0x434, 0x463, 0x301, 0x43b, 0x44c, 0x43d, 0x438, 0x43a, 0x44a, 0x3b, 0x432, 0x442, 0x43e, 0x301, 0x440, 0x43d, 0x438, 0x43a, 0x44a, 0x3b,
-0x441, 0x440, 0x435, 0x434, 0x430, 0x300, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x442, 0x43e, 0x301, 0x43a, 0x44a, 0x3b, 0x43f,
-0x467, 0x442, 0x43e, 0x301, 0x43a, 0x44a, 0x3b, 0x441, 0xa64b, 0x431, 0x431, 0x461, 0x301, 0x442, 0x430, 0x3b, 0x4c, 0x75, 0x6d, 0x3b,
-0x4e, 0x6b, 0x6f, 0x3b, 0x4e, 0x64, 0x79, 0x3b, 0x4e, 0x64, 0x67, 0x3b, 0x4e, 0x6a, 0x77, 0x3b, 0x4e, 0x67, 0x76, 0x3b,
-0x4c, 0x75, 0x62, 0x3b, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x4e, 0x6b, 0x6f, 0x64, 0x79, 0x61, 0x3b, 0x4e,
-0x64, 0xe0, 0x61, 0x79, 0xe0, 0x3b, 0x4e, 0x64, 0x61, 0x6e, 0x67, 0xf9, 0x3b, 0x4e, 0x6a, 0xf2, 0x77, 0x61, 0x3b, 0x4e,
-0x67, 0xf2, 0x76, 0x79, 0x61, 0x3b, 0x4c, 0x75, 0x62, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x4c, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b,
-0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4c, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0xe9, 0x69, 0x3b, 0x44, 0xeb, 0x6e, 0x3b,
-0x4d, 0xeb, 0x74, 0x3b, 0x44, 0x6f, 0x6e, 0x3b, 0x46, 0x72, 0x65, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x6f, 0x6e, 0x6e,
-0x64, 0x65, 0x67, 0x3b, 0x4d, 0xe9, 0x69, 0x6e, 0x64, 0x65, 0x67, 0x3b, 0x44, 0xeb, 0x6e, 0x73, 0x63, 0x68, 0x64, 0x65,
-0x67, 0x3b, 0x4d, 0xeb, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x73, 0x63, 0x68, 0x64,
-0x65, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x64, 0x65, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67,
-0x3b, 0x53, 0x6f, 0x6e, 0x2e, 0x3b, 0x4d, 0xe9, 0x69, 0x2e, 0x3b, 0x44, 0xeb, 0x6e, 0x2e, 0x3b, 0x4d, 0xeb, 0x74, 0x2e,
-0x3b, 0x44, 0x6f, 0x6e, 0x2e, 0x3b, 0x46, 0x72, 0x65, 0x2e, 0x3b, 0x53, 0x61, 0x6d, 0x2e, 0x3b, 0x6e, 0x74, 0x73, 0x3b,
-0x6b, 0x70, 0x61, 0x3b, 0x67, 0x68, 0x254, 0x3b, 0x74, 0x254, 0x6d, 0x3b, 0x75, 0x6d, 0x65, 0x3b, 0x67, 0x68, 0x268, 0x3b,
-0x64, 0x7a, 0x6b, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x6e, 0x74, 0x73, 0x268, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x6b, 0x70,
-0xe0, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x67, 0x68, 0x254, 0x65, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x74, 0x254, 0x300,
-0x6d, 0x6c, 0xf2, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x6d, 0xe8, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x67, 0x68, 0x268,
-0x302, 0x6d, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x6e, 0x64, 0x7a, 0x268, 0x6b, 0x254, 0x294, 0x254, 0x3b, 0x6e, 0x3b, 0x6b, 0x3b,
-0x67, 0x3b, 0x74, 0x3b, 0x75, 0x3b, 0x67, 0x3b, 0x64, 0x3b, 0x6e, 0x254, 0x79, 0x3b, 0x6e, 0x6a, 0x61, 0x3b, 0x75, 0x75,
-0x6d, 0x3b, 0x14b, 0x67, 0x65, 0x3b, 0x6d, 0x62, 0x254, 0x3b, 0x6b, 0x254, 0x254, 0x3b, 0x6a, 0x6f, 0x6e, 0x3b, 0x14b, 0x67,
-0x77, 0xe0, 0x20, 0x6e, 0x254, 0x302, 0x79, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6e, 0x6a, 0x61, 0x14b, 0x67, 0x75, 0x6d,
-0x62, 0x61, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0xfb, 0x6d, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x14b, 0x67, 0xea, 0x3b,
-0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6d, 0x62, 0x254, 0x6b, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6b, 0x254, 0x254, 0x3b, 0x14b,
-0x67, 0x77, 0xe0, 0x20, 0x6a, 0xf4, 0x6e, 0x3b, 0x6e, 0x3b, 0x6e, 0x3b, 0x75, 0x3b, 0x14b, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b,
-0x6a, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c,
-0x61, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69,
-0x3b, 0x41, 0x6c, 0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x54,
-0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x53, 0x3b, 0xe9, 0x74, 0x3b, 0x6d, 0x254, 0x301, 0x73, 0x3b, 0x6b, 0x77, 0x61,
-0x3b, 0x6d, 0x75, 0x6b, 0x3b, 0x14b, 0x67, 0x69, 0x3b, 0x257, 0xf3, 0x6e, 0x3b, 0x65, 0x73, 0x61, 0x3b, 0xe9, 0x74, 0x69,
-0x3b, 0x6d, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x6b, 0x77, 0x61, 0x73, 0xfa, 0x3b, 0x6d, 0x75, 0x6b, 0x254, 0x301, 0x73, 0xfa,
-0x3b, 0x14b, 0x67, 0x69, 0x73, 0xfa, 0x3b, 0x257, 0xf3, 0x6e, 0x25b, 0x73, 0xfa, 0x3b, 0x65, 0x73, 0x61, 0x253, 0x61, 0x73,
-0xfa, 0x3b, 0x65, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x14b, 0x3b, 0x257, 0x3b, 0x65, 0x3b, 0x44, 0x69, 0x6d, 0x3b,
-0x54, 0x65, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x41, 0x72, 0x6a, 0x3b,
-0x53, 0x69, 0x62, 0x3b, 0x44, 0x69, 0x6d, 0x61, 0x73, 0x3b, 0x54, 0x65, 0x6e, 0x65, 0x14b, 0x3b, 0x54, 0x61, 0x6c, 0x61,
-0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x79, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x73, 0x61, 0x79, 0x3b,
-0x41, 0x72, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x53, 0x69, 0x62, 0x69, 0x74, 0x69, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x54, 0x3b,
-0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x3b, 0x73, 0x6d,
-0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73, 0x6d, 0x6e, 0x3b, 0x66, 0xfa, 0x6c, 0x3b, 0x73, 0xe9, 0x72, 0x3b, 0x73, 0x254,
-0x301, 0x6e, 0x64, 0x254, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d,
-0x259, 0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x62, 0x25b, 0x30c, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259,
-0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x6c, 0x25b, 0x301, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c,
-0xfa, 0x20, 0x6d, 0x259, 0x301, 0x6e, 0x79, 0x69, 0x3b, 0x66, 0xfa, 0x6c, 0x61, 0x64, 0xe9, 0x3b, 0x73, 0xe9, 0x72, 0x61,
-0x64, 0xe9, 0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x66, 0x3b, 0x73, 0x3b, 0x73, 0x254, 0x301,
-0x6e, 0x3b, 0x6c, 0x1dd, 0x6e, 0x3b, 0x6d, 0x61, 0x61, 0x3b, 0x6d, 0x25b, 0x6b, 0x3b, 0x6a, 0x1dd, 0x1dd, 0x3b, 0x6a, 0xfa,
-0x6d, 0x3b, 0x73, 0x61, 0x6d, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x1dd, 0x3b, 0x6c, 0x1dd, 0x6e, 0x64, 0xed, 0x3b, 0x6d,
-0x61, 0x61, 0x64, 0xed, 0x3b, 0x6d, 0x25b, 0x6b, 0x72, 0x25b, 0x64, 0xed, 0x3b, 0x6a, 0x1dd, 0x1dd, 0x64, 0xed, 0x3b, 0x6a,
-0xfa, 0x6d, 0x62, 0xe1, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0xed, 0x3b, 0x73, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6a,
-0x3b, 0x6a, 0x3b, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e,
-0x3b, 0x41, 0x72, 0x61, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d,
-0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b,
-0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x3b, 0x43, 0x79, 0x61, 0x3b, 0x43, 0x6c, 0x61, 0x3b, 0x43, 0x7a, 0x69, 0x3b, 0x43, 0x6b,
-0x6f, 0x3b, 0x43, 0x6b, 0x61, 0x3b, 0x43, 0x67, 0x61, 0x3b, 0x43, 0x7a, 0x65, 0x3b, 0x43, 0x6f, 0x6d, 0x2019, 0x79, 0x61,
-0x6b, 0x6b, 0x65, 0x3b, 0x43, 0x6f, 0x6d, 0x6c, 0x61, 0x61, 0x257, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d, 0x7a, 0x79, 0x69,
-0x69, 0x257, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d, 0x6b, 0x6f, 0x6c, 0x6c, 0x65, 0x3b, 0x43, 0x6f, 0x6d, 0x6b, 0x61, 0x6c,
-0x64, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d, 0x67, 0x61, 0x69, 0x73, 0x75, 0x75, 0x3b, 0x43, 0x6f, 0x6d,
-0x7a, 0x79, 0x65, 0x253, 0x73, 0x75, 0x75, 0x3b, 0x59, 0x3b, 0x4c, 0x3b, 0x5a, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x47, 0x3b,
-0x45, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x3b, 0x73, 0x6d, 0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b,
-0x73, 0x6d, 0x6e, 0x3b, 0x6d, 0x62, 0x73, 0x3b, 0x73, 0x61, 0x73, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x6d,
-0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1,
-0x62, 0x61, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x6c, 0x61, 0x6c,
-0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x6e, 0x61, 0x3b, 0x6d, 0x61,
-0x62, 0xe1, 0x67, 0xe1, 0x20, 0x6d, 0xe1, 0x20, 0x73, 0x75, 0x6b, 0x75, 0x6c, 0x3b, 0x73, 0xe1, 0x73, 0x61, 0x64, 0x69,
-0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x43, 0xe4, 0x14b, 0x3b, 0x4a,
-0x69, 0x65, 0x63, 0x3b, 0x52, 0x25b, 0x77, 0x3b, 0x44, 0x69, 0x254, 0x331, 0x6b, 0x3b, 0x14a, 0x75, 0x61, 0x61, 0x6e, 0x3b,
-0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x3b, 0x42, 0xe4, 0x6b, 0x25b, 0x6c, 0x3b, 0x43, 0xe4, 0x14b, 0x20, 0x6b, 0x75, 0x254,
-0x74, 0x68, 0x3b, 0x4a, 0x69, 0x65, 0x63, 0x20, 0x6c, 0x61, 0x331, 0x74, 0x3b, 0x52, 0x25b, 0x77, 0x20, 0x6c, 0xe4, 0x74,
-0x6e, 0x69, 0x3b, 0x44, 0x69, 0x254, 0x331, 0x6b, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x14a, 0x75, 0x61, 0x61, 0x6e,
-0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b,
-0x42, 0xe4, 0x6b, 0x25b, 0x6c, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x43, 0x3b, 0x4a, 0x3b, 0x52, 0x3b, 0x44, 0x3b,
-0x14a, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x431, 0x441, 0x3b, 0x431, 0x43d, 0x3b, 0x43e, 0x43f, 0x3b, 0x441, 0x44d, 0x3b, 0x447, 0x43f,
-0x3b, 0x431, 0x44d, 0x3b, 0x441, 0x431, 0x3b, 0x431, 0x430, 0x441, 0x43a, 0x44b, 0x4bb, 0x44b, 0x430, 0x43d, 0x43d, 0x44c, 0x430, 0x3b,
-0x431, 0x44d, 0x43d, 0x438, 0x434, 0x438, 0x44d, 0x43d, 0x43d, 0x44c, 0x438, 0x43a, 0x3b, 0x43e, 0x43f, 0x442, 0x443, 0x43e, 0x440, 0x443,
-0x43d, 0x43d, 0x44c, 0x443, 0x43a, 0x3b, 0x441, 0x44d, 0x440, 0x44d, 0x434, 0x44d, 0x3b, 0x447, 0x44d, 0x43f, 0x43f, 0x438, 0x44d, 0x440,
-0x3b, 0x411, 0x44d, 0x44d, 0x442, 0x438, 0x4a5, 0x441, 0x44d, 0x3b, 0x441, 0x443, 0x431, 0x443, 0x43e, 0x442, 0x430, 0x3b, 0x411, 0x3b,
-0x411, 0x3b, 0x41e, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x411, 0x3b, 0x421, 0x3b, 0x4d, 0x75, 0x6c, 0x3b, 0x4a, 0x74, 0x74, 0x3b,
-0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b,
+0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x6c,
+0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4d,
+0x3b, 0x5a, 0x3b, 0x53, 0xe9, 0x74, 0x69, 0x3b, 0x6d, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x6b, 0x77, 0x61, 0x73, 0xfa, 0x3b,
+0x6d, 0x75, 0x6b, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x14b, 0x67, 0x69, 0x73, 0xfa, 0x3b, 0x257, 0xf3, 0x6e, 0x25b, 0x73, 0xfa,
+0x3b, 0x65, 0x73, 0x61, 0x253, 0x61, 0x73, 0xfa, 0xe9, 0x74, 0x3b, 0x6d, 0x254, 0x301, 0x73, 0x3b, 0x6b, 0x77, 0x61, 0x3b,
+0x6d, 0x75, 0x6b, 0x3b, 0x14b, 0x67, 0x69, 0x3b, 0x257, 0xf3, 0x6e, 0x3b, 0x65, 0x73, 0x61, 0x65, 0x3b, 0x6d, 0x3b, 0x6b,
+0x3b, 0x6d, 0x3b, 0x14b, 0x3b, 0x257, 0x3b, 0x65, 0x44, 0x69, 0x6d, 0x61, 0x73, 0x3b, 0x54, 0x65, 0x6e, 0x65, 0x14b, 0x3b,
+0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x79, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69,
+0x73, 0x61, 0x79, 0x3b, 0x41, 0x72, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x53, 0x69, 0x62, 0x69, 0x74, 0x69, 0x44, 0x69, 0x6d,
+0x3b, 0x54, 0x65, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x41, 0x72, 0x6a,
+0x3b, 0x53, 0x69, 0x62, 0x44, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x53, 0x73, 0x254, 0x301,
+0x6e, 0x64, 0x254, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259,
+0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x62, 0x25b, 0x30c, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c,
+0xfa, 0x20, 0x6d, 0x259, 0x301, 0x6c, 0x25b, 0x301, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa,
+0x20, 0x6d, 0x259, 0x301, 0x6e, 0x79, 0x69, 0x3b, 0x66, 0xfa, 0x6c, 0x61, 0x64, 0xe9, 0x3b, 0x73, 0xe9, 0x72, 0x61, 0x64,
+0xe9, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x3b, 0x73, 0x6d, 0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73,
+0x6d, 0x6e, 0x3b, 0x66, 0xfa, 0x6c, 0x3b, 0x73, 0xe9, 0x72, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b,
+0x66, 0x3b, 0x73, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x1dd, 0x3b, 0x6c, 0x1dd, 0x6e, 0x64, 0xed, 0x3b, 0x6d, 0x61, 0x61, 0x64,
+0xed, 0x3b, 0x6d, 0x25b, 0x6b, 0x72, 0x25b, 0x64, 0xed, 0x3b, 0x6a, 0x1dd, 0x1dd, 0x64, 0xed, 0x3b, 0x6a, 0xfa, 0x6d, 0x62,
+0xe1, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0xed, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6c, 0x1dd, 0x6e, 0x3b, 0x6d, 0x61, 0x61, 0x3b,
+0x6d, 0x25b, 0x6b, 0x3b, 0x6a, 0x1dd, 0x1dd, 0x3b, 0x6a, 0xfa, 0x6d, 0x3b, 0x73, 0x61, 0x6d, 0x73, 0x3b, 0x6c, 0x3b, 0x6d,
+0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x73, 0x53, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74,
+0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+0x3b, 0x41, 0x72, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75,
+0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x53, 0x61, 0x62, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74,
+0x6e, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x53, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a,
+0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x43, 0x6f, 0x6d, 0x2019, 0x79, 0x61, 0x6b, 0x6b, 0x65, 0x3b, 0x43, 0x6f, 0x6d, 0x6c,
+0x61, 0x61, 0x257, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d, 0x7a, 0x79, 0x69, 0x69, 0x257, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d,
+0x6b, 0x6f, 0x6c, 0x6c, 0x65, 0x3b, 0x43, 0x6f, 0x6d, 0x6b, 0x61, 0x6c, 0x64, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x43,
+0x6f, 0x6d, 0x67, 0x61, 0x69, 0x73, 0x75, 0x75, 0x3b, 0x43, 0x6f, 0x6d, 0x7a, 0x79, 0x65, 0x253, 0x73, 0x75, 0x75, 0x43,
+0x79, 0x61, 0x3b, 0x43, 0x6c, 0x61, 0x3b, 0x43, 0x7a, 0x69, 0x3b, 0x43, 0x6b, 0x6f, 0x3b, 0x43, 0x6b, 0x61, 0x3b, 0x43,
+0x67, 0x61, 0x3b, 0x43, 0x7a, 0x65, 0x59, 0x3b, 0x4c, 0x3b, 0x5a, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x47, 0x3b, 0x45, 0x73,
+0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20,
+0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x62, 0x61, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66,
+0xfa, 0x20, 0x6d, 0xe1, 0x6c, 0x61, 0x6c, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20,
+0x6d, 0xe1, 0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x62, 0xe1, 0x67, 0xe1, 0x20, 0x6d, 0xe1, 0x20, 0x73, 0x75, 0x6b, 0x75, 0x6c,
+0x3b, 0x73, 0xe1, 0x73, 0x61, 0x64, 0x69, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x3b, 0x73, 0x6d, 0x62,
+0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73, 0x6d, 0x6e, 0x3b, 0x6d, 0x62, 0x73, 0x3b, 0x73, 0x61, 0x73, 0x73, 0x3b, 0x6d, 0x3b,
+0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x43, 0xe4, 0x14b, 0x20, 0x6b, 0x75, 0x254, 0x74, 0x68, 0x3b, 0x4a,
+0x69, 0x65, 0x63, 0x20, 0x6c, 0x61, 0x331, 0x74, 0x3b, 0x52, 0x25b, 0x77, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x44,
+0x69, 0x254, 0x331, 0x6b, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x14a, 0x75, 0x61, 0x61, 0x6e, 0x20, 0x6c, 0xe4, 0x74,
+0x6e, 0x69, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x42, 0xe4, 0x6b, 0x25b,
+0x6c, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x43, 0xe4, 0x14b, 0x3b, 0x4a, 0x69, 0x65, 0x63, 0x3b, 0x52, 0x25b, 0x77, 0x3b,
+0x44, 0x69, 0x254, 0x331, 0x6b, 0x3b, 0x14a, 0x75, 0x61, 0x61, 0x6e, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x3b, 0x42,
+0xe4, 0x6b, 0x25b, 0x6c, 0x43, 0x3b, 0x4a, 0x3b, 0x52, 0x3b, 0x44, 0x3b, 0x14a, 0x3b, 0x44, 0x3b, 0x42, 0x431, 0x430, 0x441,
+0x43a, 0x44b, 0x4bb, 0x44b, 0x430, 0x43d, 0x43d, 0x44c, 0x430, 0x3b, 0x431, 0x44d, 0x43d, 0x438, 0x434, 0x438, 0x44d, 0x43d, 0x43d, 0x44c,
+0x438, 0x43a, 0x3b, 0x43e, 0x43f, 0x442, 0x443, 0x43e, 0x440, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x43a, 0x3b, 0x441, 0x44d, 0x440, 0x44d,
+0x434, 0x44d, 0x3b, 0x447, 0x44d, 0x43f, 0x43f, 0x438, 0x44d, 0x440, 0x3b, 0x411, 0x44d, 0x44d, 0x442, 0x438, 0x4a5, 0x441, 0x44d, 0x3b,
+0x441, 0x443, 0x431, 0x443, 0x43e, 0x442, 0x430, 0x431, 0x441, 0x3b, 0x431, 0x43d, 0x3b, 0x43e, 0x43f, 0x3b, 0x441, 0x44d, 0x3b, 0x447,
+0x43f, 0x3b, 0x431, 0x44d, 0x3b, 0x441, 0x431, 0x411, 0x3b, 0x411, 0x3b, 0x41e, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x411, 0x3b, 0x421,
0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d,
0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x61, 0x68, 0x61, 0x6d,
-0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b,
-0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x3b, 0xa55e, 0xa54c, 0xa535, 0x3b, 0xa5f3, 0xa5e1,
-0xa609, 0x3b, 0xa55a, 0xa55e, 0xa55a, 0x3b, 0xa549, 0xa55e, 0xa552, 0x3b, 0xa549, 0xa524, 0xa546, 0xa562, 0x3b, 0xa549, 0xa524, 0xa540, 0xa56e, 0x3b,
-0xa53b, 0xa52c, 0xa533, 0x3b, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x74, 0x25b, 0x25b, 0x6e, 0x25b, 0x25b, 0x3b, 0x74, 0x61,
-0x6c, 0x61, 0x74, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x69, 0x6d, 0x69, 0x73, 0x61, 0x3b, 0x61, 0x69,
-0x6a, 0x69, 0x6d, 0x61, 0x3b, 0x73, 0x69, 0x253, 0x69, 0x74, 0x69, 0x3b, 0x53, 0x75, 0x6e, 0x3b, 0x4d, 0xe4, 0x6e, 0x3b,
-0x5a, 0x69, 0x161, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x46, 0x72, 0xf3, 0x3b, 0x46, 0x72, 0x69, 0x3b, 0x53, 0x61, 0x6d, 0x3b,
-0x53, 0x75, 0x6e, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0xe4, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x5a, 0x69, 0x161, 0x74, 0x61,
-0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x75, 0x10d, 0x3b, 0x46, 0x72, 0xf3, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x46, 0x72,
-0x69, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x161, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x4d,
-0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x53, 0x3b, 0x73, 0x64, 0x3b, 0x6d, 0x64, 0x3b, 0x6d, 0x77, 0x3b, 0x65, 0x74, 0x3b, 0x6b,
-0x6c, 0x3b, 0x66, 0x6c, 0x3b, 0x73, 0x73, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x25b, 0x3b, 0x6d, 0xf3, 0x6e, 0x64,
-0x69, 0x65, 0x3b, 0x6d, 0x75, 0xe1, 0x6e, 0x79, 0xe1, 0x14b, 0x6d, 0xf3, 0x6e, 0x64, 0x69, 0x65, 0x3b, 0x6d, 0x65, 0x74,
-0xfa, 0x6b, 0x70, 0xed, 0xe1, 0x70, 0x25b, 0x3b, 0x6b, 0xfa, 0x70, 0xe9, 0x6c, 0x69, 0x6d, 0x65, 0x74, 0xfa, 0x6b, 0x70,
-0x69, 0x61, 0x70, 0x25b, 0x3b, 0x66, 0x65, 0x6c, 0xe9, 0x74, 0x65, 0x3b, 0x73, 0xe9, 0x73, 0x65, 0x6c, 0xe9, 0x3b, 0x73,
-0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x6b, 0x3b, 0x66, 0x3b, 0x73, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x6c, 0x75,
-0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0xe9, 0x3b, 0x78, 0x75, 0x65, 0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0xe1, 0x62,
-0x3b, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x6c, 0x6c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74,
-0x65, 0x73, 0x3b, 0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x78, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b,
-0x76, 0x69, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x75, 0x3b, 0x53, 0x254, 0x301, 0x6e, 0x64,
-0x69, 0x3b, 0x4d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0xc1, 0x70, 0x74, 0x61, 0x20, 0x4d, 0x254, 0x301, 0x6e, 0x64, 0x69,
-0x3b, 0x57, 0x25b, 0x301, 0x6e, 0x25b, 0x73, 0x25b, 0x64, 0x25b, 0x3b, 0x54, 0x254, 0x301, 0x73, 0x25b, 0x64, 0x25b, 0x3b, 0x46,
-0x25b, 0x6c, 0xe2, 0x79, 0x25b, 0x64, 0x25b, 0x3b, 0x53, 0xe1, 0x73, 0x69, 0x64, 0x25b, 0x3b, 0x53, 0x254, 0x301, 0x3b, 0x4d,
-0x254, 0x301, 0x3b, 0xc1, 0x4d, 0x3b, 0x57, 0x25b, 0x301, 0x3b, 0x54, 0x254, 0x301, 0x3b, 0x46, 0x25b, 0x3b, 0x53, 0xe1, 0x3b,
-0x73, 0x254, 0x6e, 0x64, 0x69, 0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x25b,
-0x72, 0x6b, 0x25b, 0x72, 0x25b, 0x64, 0x69, 0x3b, 0x79, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x14b, 0x64, 0x25b, 0x72, 0x25b,
-0x64, 0x69, 0x3b, 0x6d, 0x254, 0x6e, 0x254, 0x20, 0x73, 0x254, 0x6e, 0x64, 0x69, 0x3b, 0x73, 0x6f, 0x3b, 0x6c, 0x75, 0x3b,
-0x6d, 0x61, 0x3b, 0x6d, 0x25b, 0x3b, 0x79, 0x65, 0x3b, 0x76, 0x61, 0x3b, 0x6d, 0x73, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20,
-0x31, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x32, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x33, 0x3b, 0x41, 0x6e, 0x65, 0x67,
-0x20, 0x34, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x35, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x36, 0x3b, 0x41, 0x6e, 0x65,
-0x67, 0x20, 0x37, 0x3b, 0x41, 0x31, 0x3b, 0x41, 0x32, 0x3b, 0x41, 0x33, 0x3b, 0x41, 0x34, 0x3b, 0x41, 0x35, 0x3b, 0x41,
-0x36, 0x3b, 0x41, 0x37, 0x3b, 0x6c, 0x79, 0x25b, 0x2bc, 0x25b, 0x301, 0x20, 0x73, 0x1e85, 0xed, 0x14b, 0x74, 0xe8, 0x3b, 0x6d,
-0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x62, 0x254, 0x301, 0x254, 0x6e, 0x74, 0xe8, 0x20, 0x6d,
-0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x74, 0x73, 0xe8, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x6c,
-0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x62, 0x254, 0x301, 0x254, 0x6e, 0x74, 0xe8, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0x25b,
-0x300, 0x25b, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6d, 0xe0, 0x67, 0x61, 0x20, 0x6c,
-0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0xe0, 0x67, 0x61, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x41, 0x14b, 0x70, 0xe9,
-0x74, 0x75, 0x77, 0x61, 0x6b, 0x21f, 0x61, 0x14b, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x77, 0x61, 0x14b, 0x17e, 0x69,
-0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x6e, 0x75, 0x14b, 0x70, 0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x79,
-0x61, 0x6d, 0x6e, 0x69, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9,
-0x74, 0x75, 0x7a, 0x61, 0x70, 0x74, 0x61, 0x14b, 0x3b, 0x4f, 0x77, 0xe1, 0x14b, 0x67, 0x79, 0x75, 0x17e, 0x61, 0x17e, 0x61,
-0x70, 0x69, 0x3b, 0x41, 0x3b, 0x57, 0x3b, 0x4e, 0x3b, 0x59, 0x3b, 0x54, 0x3b, 0x5a, 0x3b, 0x4f, 0x3b, 0x2d30, 0x2d59, 0x2d30,
-0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55,
-0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49,
-0x2d39, 0x2d62, 0x2d30, 0x2d59, 0x3b, 0x6cc, 0x6d5, 0x6a9, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x62f, 0x648, 0x648, 0x634, 0x6d5, 0x645,
-0x645, 0x6d5, 0x3b, 0x633, 0x6ce, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x686, 0x648, 0x627, 0x631, 0x634, 0x6d5, 0x645, 0x645, 0x6d5,
-0x3b, 0x67e, 0x6ce, 0x646, 0x62c, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x6be, 0x6d5, 0x6cc, 0x646, 0x6cc, 0x3b, 0x634, 0x6d5, 0x645,
-0x645, 0x6d5, 0x3b, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x6be, 0x3b, 0x634, 0x3b, 0x6e, 0x6a, 0x65,
-0x3b, 0x70, 0xf3, 0x6e, 0x3b, 0x77, 0x61, 0x142, 0x3b, 0x73, 0x72, 0x6a, 0x3b, 0x73, 0x74, 0x77, 0x3b, 0x70, 0x11b, 0x74,
-0x3b, 0x73, 0x6f, 0x62, 0x3b, 0x6e, 0x6a, 0x65, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0xf3, 0x6e, 0x6a, 0x65, 0x17a, 0x65,
-0x6c, 0x65, 0x3b, 0x77, 0x61, 0x142, 0x74, 0x6f, 0x72, 0x61, 0x3b, 0x73, 0x72, 0x6a, 0x6f, 0x64, 0x61, 0x3b, 0x73, 0x74,
-0x77, 0xf3, 0x72, 0x74, 0x6b, 0x3b, 0x70, 0x11b, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x3b,
-0x70, 0x3b, 0x77, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b,
-0x77, 0x75, 0x74, 0x3b, 0x73, 0x72, 0x6a, 0x3b, 0x161, 0x74, 0x77, 0x3b, 0x70, 0x6a, 0x61, 0x3b, 0x73, 0x6f, 0x62, 0x3b,
+0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x4d,
+0x75, 0x6c, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49,
+0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0xa55e,
+0xa54c, 0xa535, 0x3b, 0xa5f3, 0xa5e1, 0xa609, 0x3b, 0xa55a, 0xa55e, 0xa55a, 0x3b, 0xa549, 0xa55e, 0xa552, 0x3b, 0xa549, 0xa524, 0xa546, 0xa562, 0x3b,
+0xa549, 0xa524, 0xa540, 0xa56e, 0x3b, 0xa53b, 0xa52c, 0xa533, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x74, 0x25b, 0x25b, 0x6e, 0x25b,
+0x25b, 0x3b, 0x74, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x69, 0x6d, 0x69, 0x73,
+0x61, 0x3b, 0x61, 0x69, 0x6a, 0x69, 0x6d, 0x61, 0x3b, 0x73, 0x69, 0x253, 0x69, 0x74, 0x69, 0x53, 0x75, 0x6e, 0x6e, 0x74,
+0x61, 0x67, 0x3b, 0x4d, 0xe4, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x5a, 0x69, 0x161, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74,
+0x74, 0x77, 0x75, 0x10d, 0x3b, 0x46, 0x72, 0xf3, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x69, 0x74, 0x61, 0x67, 0x3b,
+0x53, 0x61, 0x6d, 0x161, 0x74, 0x61, 0x67, 0x53, 0x75, 0x6e, 0x3b, 0x4d, 0xe4, 0x6e, 0x3b, 0x5a, 0x69, 0x161, 0x3b, 0x4d,
+0x69, 0x74, 0x3b, 0x46, 0x72, 0xf3, 0x3b, 0x46, 0x72, 0x69, 0x3b, 0x53, 0x61, 0x6d, 0x53, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b,
+0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x53, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x25b, 0x3b, 0x6d, 0xf3, 0x6e, 0x64, 0x69,
+0x65, 0x3b, 0x6d, 0x75, 0xe1, 0x6e, 0x79, 0xe1, 0x14b, 0x6d, 0xf3, 0x6e, 0x64, 0x69, 0x65, 0x3b, 0x6d, 0x65, 0x74, 0xfa,
+0x6b, 0x70, 0xed, 0xe1, 0x70, 0x25b, 0x3b, 0x6b, 0xfa, 0x70, 0xe9, 0x6c, 0x69, 0x6d, 0x65, 0x74, 0xfa, 0x6b, 0x70, 0x69,
+0x61, 0x70, 0x25b, 0x3b, 0x66, 0x65, 0x6c, 0xe9, 0x74, 0x65, 0x3b, 0x73, 0xe9, 0x73, 0x65, 0x6c, 0xe9, 0x73, 0x64, 0x3b,
+0x6d, 0x64, 0x3b, 0x6d, 0x77, 0x3b, 0x65, 0x74, 0x3b, 0x6b, 0x6c, 0x3b, 0x66, 0x6c, 0x3b, 0x73, 0x73, 0x73, 0x3b, 0x6d,
+0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x6b, 0x3b, 0x66, 0x3b, 0x73, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x6c, 0x6c,
+0x75, 0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65,
+0x73, 0x3b, 0x78, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x73, 0xe1, 0x62,
+0x61, 0x64, 0x75, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x6c, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0xe9, 0x3b, 0x78,
+0x75, 0x65, 0x3b, 0x76, 0x69, 0x65, 0x3b, 0x73, 0xe1, 0x62, 0x53, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x4d, 0x254, 0x301,
+0x6e, 0x64, 0x69, 0x3b, 0xc1, 0x70, 0x74, 0x61, 0x20, 0x4d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x57, 0x25b, 0x301, 0x6e,
+0x25b, 0x73, 0x25b, 0x64, 0x25b, 0x3b, 0x54, 0x254, 0x301, 0x73, 0x25b, 0x64, 0x25b, 0x3b, 0x46, 0x25b, 0x6c, 0xe2, 0x79, 0x25b,
+0x64, 0x25b, 0x3b, 0x53, 0xe1, 0x73, 0x69, 0x64, 0x25b, 0x53, 0x254, 0x301, 0x3b, 0x4d, 0x254, 0x301, 0x3b, 0xc1, 0x4d, 0x3b,
+0x57, 0x25b, 0x301, 0x3b, 0x54, 0x254, 0x301, 0x3b, 0x46, 0x25b, 0x3b, 0x53, 0xe1, 0x73, 0x254, 0x6e, 0x64, 0x69, 0x3b, 0x6c,
+0x75, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x25b, 0x72, 0x6b, 0x25b, 0x72, 0x25b, 0x64, 0x69,
+0x3b, 0x79, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x61, 0x14b, 0x64, 0x25b, 0x72, 0x25b, 0x64, 0x69, 0x3b, 0x6d, 0x254, 0x6e, 0x254,
+0x20, 0x73, 0x254, 0x6e, 0x64, 0x69, 0x73, 0x6f, 0x3b, 0x6c, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x25b, 0x3b, 0x79, 0x65,
+0x3b, 0x76, 0x61, 0x3b, 0x6d, 0x73, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x31, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x32, 0x3b,
+0x41, 0x6e, 0x65, 0x67, 0x20, 0x33, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x34, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x35,
+0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x36, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x37, 0x41, 0x31, 0x3b, 0x41, 0x32, 0x3b,
+0x41, 0x33, 0x3b, 0x41, 0x34, 0x3b, 0x41, 0x35, 0x3b, 0x41, 0x36, 0x3b, 0x41, 0x37, 0x6c, 0x79, 0x25b, 0x2bc, 0x25b, 0x301,
+0x20, 0x73, 0x1e85, 0xed, 0x14b, 0x74, 0xe8, 0x3b, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d,
+0x62, 0x254, 0x301, 0x254, 0x6e, 0x74, 0xe8, 0x20, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x74,
+0x73, 0xe8, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x62, 0x254, 0x301, 0x254, 0x6e,
+0x74, 0xe8, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x76,
+0x66, 0xf2, 0x20, 0x6d, 0xe0, 0x67, 0x61, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0xe0, 0x67, 0x61, 0x20, 0x6c,
+0x79, 0x25b, 0x30c, 0x2bc, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd28, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804,
+0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd01,
+0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd23, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd2a, 0xd804,
+0xdd16, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd25,
+0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd07, 0xd804,
+0xdd34, 0xd804, 0xdd07, 0xd804, 0xdd2e, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27,
+0xd804, 0xdd1a, 0xd804, 0xdd28, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd28, 0x3b, 0xd804,
+0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd01, 0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd23,
+0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd2a, 0xd804, 0xdd16, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28,
+0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd07, 0xd804,
+0xdd2e, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0xd804, 0xdd1a, 0xd804, 0xdd28, 0xd804, 0xdd22, 0xd804, 0xdd27, 0x3b, 0xd804,
+0xdd25, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22,
+0xd804, 0xdd28, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd27, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x77, 0x61,
+0x6b, 0x21f, 0x61, 0x14b, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x77, 0x61, 0x14b, 0x17e, 0x69, 0x3b, 0x41, 0x14b, 0x70,
+0xe9, 0x74, 0x75, 0x6e, 0x75, 0x14b, 0x70, 0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x79, 0x61, 0x6d, 0x6e, 0x69,
+0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x7a, 0x61,
+0x70, 0x74, 0x61, 0x14b, 0x3b, 0x4f, 0x77, 0xe1, 0x14b, 0x67, 0x79, 0x75, 0x17e, 0x61, 0x17e, 0x61, 0x70, 0x69, 0x41, 0x3b,
+0x57, 0x3b, 0x4e, 0x3b, 0x59, 0x3b, 0x54, 0x3b, 0x5a, 0x3b, 0x4f, 0x2d30, 0x2d59, 0x2d30, 0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d62,
+0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d61,
+0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62, 0x2d30, 0x2d59, 0x6cc, 0x6d5,
+0x6a9, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x62f, 0x648, 0x648, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x633, 0x6ce, 0x634, 0x6d5,
+0x645, 0x645, 0x6d5, 0x3b, 0x686, 0x648, 0x627, 0x631, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x67e, 0x6ce, 0x646, 0x62c, 0x634, 0x6d5,
+0x645, 0x645, 0x6d5, 0x3b, 0x6be, 0x6d5, 0x6cc, 0x646, 0x6cc, 0x3b, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633,
+0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x6be, 0x3b, 0x634, 0x6e, 0x6a, 0x65, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0xf3, 0x6e, 0x6a,
+0x65, 0x17a, 0x65, 0x6c, 0x65, 0x3b, 0x77, 0x61, 0x142, 0x74, 0x6f, 0x72, 0x61, 0x3b, 0x73, 0x72, 0x6a, 0x6f, 0x64, 0x61,
+0x3b, 0x73, 0x74, 0x77, 0xf3, 0x72, 0x74, 0x6b, 0x3b, 0x70, 0x11b, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61,
+0x6e, 0x6a, 0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b, 0x77, 0x61, 0x142, 0x3b, 0x73, 0x72, 0x6a, 0x3b, 0x73, 0x74, 0x77, 0x3b,
+0x70, 0x11b, 0x74, 0x3b, 0x73, 0x6f, 0x62, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x70, 0x3b, 0x73,
0x6e, 0x6a, 0x65, 0x64, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0xf3, 0x6e, 0x64, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x77, 0x75,
0x74, 0x6f, 0x72, 0x61, 0x3b, 0x73, 0x72, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x161, 0x74, 0x77, 0xf3, 0x72, 0x74, 0x6b, 0x3b,
-0x70, 0x6a, 0x61, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73,
-0x3b, 0x161, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x6e, 0x61, 0x64, 0x3b, 0x70, 0x61, 0x6e, 0x3b, 0x77, 0x69, 0x73, 0x3b, 0x70,
-0x75, 0x73, 0x3b, 0x6b, 0x65, 0x74, 0x3b, 0x70, 0x113, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x3b, 0x6e, 0x61, 0x64, 0x12b, 0x6c,
-0x69, 0x3b, 0x70, 0x61, 0x6e, 0x61, 0x64, 0x12b, 0x6c, 0x69, 0x3b, 0x77, 0x69, 0x73, 0x61, 0x73, 0x12b, 0x64, 0x69, 0x73,
-0x3b, 0x70, 0x75, 0x73, 0x73, 0x69, 0x73, 0x61, 0x77, 0x61, 0x69, 0x74, 0x69, 0x3b, 0x6b, 0x65, 0x74, 0x77, 0x69, 0x72,
-0x74, 0x69, 0x6b, 0x73, 0x3b, 0x70, 0x113, 0x6e, 0x74, 0x6e, 0x69, 0x6b, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x74,
-0x69, 0x6b, 0x61, 0x3b, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b, 0x50, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x70, 0x61,
-0x73, 0x3b, 0x76, 0x75, 0x6f, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6b, 0x6f, 0x73, 0x3b, 0x74, 0x75, 0x6f, 0x3b, 0x76, 0xe1,
-0x73, 0x3b, 0x6c, 0xe1, 0x76, 0x3b, 0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73,
-0x73, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6b, 0x6f, 0x73, 0x6b,
-0x6f, 0x6b, 0x6b, 0x6f, 0x3b, 0x74, 0x75, 0x6f, 0x72, 0xe2, 0x73, 0x74, 0xe2, 0x68, 0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75,
-0x70, 0x70, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64, 0xe2, 0x68, 0x3b, 0x70, 0x61, 0x73, 0x65,
-0x70, 0x65, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6d, 0x61,
-0x6a, 0x65, 0x62, 0x61, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6b, 0x6f, 0x73, 0x6b, 0x6f, 0x68, 0x6f, 0x3b, 0x74, 0x75, 0x6f,
-0x72, 0xe2, 0x73, 0x74, 0x75, 0x76, 0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75, 0x70, 0x70, 0x65, 0x65, 0x69, 0x76, 0x69, 0x3b,
-0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64, 0x75, 0x76, 0x3b, 0x70, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x56,
-0x3b, 0x4c, 0x3b, 0x44, 0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x6b, 0x73, 0x3b, 0x48,
-0x75, 0x3b, 0x42, 0x69, 0x3b, 0x53, 0x61, 0x3b, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65,
-0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65, 0x72, 0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b,
-0x48, 0x75, 0x77, 0x65, 0x62, 0x65, 0x73, 0x3b, 0x42, 0x69, 0x79, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x62,
-0x61, 0x64, 0x6f, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x42, 0x3b, 0x53, 0x3b
+0x70, 0x6a, 0x61, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x6e, 0x6a, 0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b,
+0x77, 0x75, 0x74, 0x3b, 0x73, 0x72, 0x6a, 0x3b, 0x161, 0x74, 0x77, 0x3b, 0x70, 0x6a, 0x61, 0x3b, 0x73, 0x6f, 0x62, 0x6e,
+0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73, 0x3b, 0x161, 0x3b, 0x70, 0x3b, 0x73, 0x6e, 0x61, 0x64, 0x12b, 0x6c, 0x69, 0x3b, 0x70,
+0x61, 0x6e, 0x61, 0x64, 0x12b, 0x6c, 0x69, 0x3b, 0x77, 0x69, 0x73, 0x61, 0x73, 0x12b, 0x64, 0x69, 0x73, 0x3b, 0x70, 0x75,
+0x73, 0x73, 0x69, 0x73, 0x61, 0x77, 0x61, 0x69, 0x74, 0x69, 0x3b, 0x6b, 0x65, 0x74, 0x77, 0x69, 0x72, 0x74, 0x69, 0x6b,
+0x73, 0x3b, 0x70, 0x113, 0x6e, 0x74, 0x6e, 0x69, 0x6b, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x74, 0x69, 0x6b, 0x61,
+0x6e, 0x61, 0x64, 0x3b, 0x70, 0x61, 0x6e, 0x3b, 0x77, 0x69, 0x73, 0x3b, 0x70, 0x75, 0x73, 0x3b, 0x6b, 0x65, 0x74, 0x3b,
+0x70, 0x113, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b, 0x50, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x53,
+0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x72, 0x67, 0xe2, 0x3b,
+0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6b, 0x6f, 0x73, 0x6b, 0x6f, 0x6b, 0x6b, 0x6f, 0x3b, 0x74,
+0x75, 0x6f, 0x72, 0xe2, 0x73, 0x74, 0xe2, 0x68, 0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75, 0x70, 0x70, 0x65, 0x69, 0x76, 0x69,
+0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64, 0xe2, 0x68, 0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x65, 0x69, 0x76, 0x69, 0x3b,
+0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x61, 0x72, 0x67,
+0xe2, 0x3b, 0x6b, 0x6f, 0x73, 0x6b, 0x6f, 0x68, 0x6f, 0x3b, 0x74, 0x75, 0x6f, 0x72, 0xe2, 0x73, 0x74, 0x75, 0x76, 0x3b,
+0x76, 0xe1, 0x73, 0x74, 0x75, 0x70, 0x70, 0x65, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64, 0x75,
+0x76, 0x70, 0x61, 0x73, 0x3b, 0x76, 0x75, 0x6f, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6b, 0x6f, 0x73, 0x3b, 0x74, 0x75, 0x6f,
+0x3b, 0x76, 0xe1, 0x73, 0x3b, 0x6c, 0xe1, 0x76, 0x70, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x56, 0x3b,
+0x4c, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65,
+0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65, 0x72, 0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b, 0x48, 0x75, 0x77, 0x65, 0x62, 0x65, 0x73,
+0x3b, 0x42, 0x69, 0x79, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x44, 0x6f, 0x6d, 0x3b,
+0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x6b, 0x73, 0x3b, 0x48, 0x75, 0x3b, 0x42, 0x69, 0x3b, 0x53, 0x61,
+0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x42, 0x3b, 0x53
};
-static const ushort byte_unit_data[] = {
+static const char16_t byte_unit_data[] = {
0x62, 0x79, 0x74, 0x65, 0x73, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b,
0x45, 0x42, 0x4b, 0x69, 0x42, 0x3b, 0x4d, 0x69, 0x42, 0x3b, 0x47, 0x69, 0x42, 0x3b, 0x54, 0x69, 0x42, 0x3b, 0x50, 0x69,
-0x42, 0x3b, 0x45, 0x69, 0x42, 0x62, 0x79, 0x74, 0x65, 0x67, 0x72, 0x65, 0x65, 0x70, 0x62, 0x61, 0x6a, 0x74, 0x1263, 0x12ed,
-0x1275, 0x12aa, 0x1263, 0x3b, 0x121c, 0x130b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x130a, 0x1263, 0x3b, 0x1274, 0x122b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x1354,
-0x1263, 0x3b, 0x45, 0x42, 0x628, 0x627, 0x64a, 0x62a, 0x643, 0x64a, 0x644, 0x648, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x645, 0x64a, 0x63a,
-0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x63a, 0x64a, 0x63a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x62a, 0x64a, 0x631, 0x627, 0x628,
-0x627, 0x64a, 0x62a, 0x3b, 0x628, 0x64a, 0x62a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x45, 0x42, 0x562, 0x561, 0x575, 0x569, 0x565,
-0x580, 0x56f, 0x532, 0x3b, 0x544, 0x532, 0x3b, 0x533, 0x532, 0x3b, 0x54f, 0x532, 0x3b, 0x54a, 0x532, 0x3b, 0x45, 0x42, 0x9ac, 0x9be,
-0x987, 0x99f, 0x995, 0x9bf, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x9ae, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x997, 0x9bf,
-0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x99f, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62,
-0x61, 0x79, 0x74, 0x62, 0x79, 0x74, 0x65, 0x2d, 0x61, 0x6b, 0x6f, 0x6b, 0x74, 0x65, 0x64, 0x6f, 0xf9, 0x6b, 0x6f, 0x3b,
-0x4d, 0x6f, 0x3b, 0x47, 0x6f, 0x3b, 0x54, 0x6f, 0x3b, 0x50, 0x6f, 0x3b, 0x45, 0x6f, 0x4b, 0x69, 0x6f, 0x3b, 0x4d, 0x69,
-0x6f, 0x3b, 0x47, 0x69, 0x6f, 0x3b, 0x54, 0x69, 0x6f, 0x3b, 0x50, 0x69, 0x6f, 0x3b, 0x45, 0x69, 0x6f, 0x431, 0x430, 0x439,
-0x442, 0x43e, 0x432, 0x435, 0x1018, 0x102d, 0x102f, 0x1000, 0x103a, 0x431, 0x430, 0x439, 0x442, 0x44b, 0x41a, 0x411, 0x3b, 0x41c, 0x411, 0x3b,
-0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x1794, 0x17c3, 0x5b57, 0x8282, 0x5343, 0x5b57, 0x8282, 0x3b, 0x5146,
-0x5b57, 0x8282, 0x3b, 0x5409, 0x5b57, 0x8282, 0x3b, 0x592a, 0x5b57, 0x8282, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x4f4d, 0x5143, 0x7d44, 0x62,
-0x61, 0x6a, 0x74, 0x6f, 0x76, 0x69, 0x62, 0x61, 0x6a, 0x74, 0x79, 0x62, 0x61, 0x6a, 0x74, 0x6f, 0x6a, 0x62, 0x61, 0x69,
-0x64, 0x69, 0x64, 0x62, 0xfd, 0x74, 0x74, 0x61, 0x76, 0x75, 0x74, 0x6b, 0x74, 0x3b, 0x4d, 0x74, 0x3b, 0x47, 0x74, 0x3b,
-0x54, 0x74, 0x3b, 0x50, 0x74, 0x3b, 0x45, 0x74, 0x4b, 0x69, 0x74, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x47, 0x69, 0x74, 0x3b,
-0x54, 0x69, 0x74, 0x3b, 0x50, 0x69, 0x74, 0x3b, 0x45, 0x69, 0x74, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x62, 0x61, 0x69,
-0x64, 0x68, 0x74, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x10d9, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10db, 0x10d1, 0x10d0, 0x10d8, 0x10e2,
-0x10d8, 0x3b, 0x10d2, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10e2, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10de, 0x10d1, 0x10d0, 0x10d8,
-0x10e2, 0x10d8, 0x3b, 0x45, 0x42, 0x42, 0x79, 0x74, 0x65, 0x73, 0xaac, 0xabe, 0xa87, 0xa9f, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b,
-0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0xaaa, 0xac0, 0xaac, 0xac0, 0x3b, 0x45, 0x42, 0x5d1, 0x5d9, 0x5d9, 0x5d8, 0x92c, 0x93e, 0x907,
-0x91f, 0x62, 0xe1, 0x6a, 0x74, 0x62, 0xe6, 0x74, 0x69, 0x62, 0x65, 0x61, 0x72, 0x74, 0x61, 0x30d0, 0x30a4, 0x30c8, 0x4b, 0x42,
-0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x69, 0x74, 0x65, 0xcac,
-0xcc8, 0xc9f, 0xccd, 0x200c, 0xc97, 0xcb3, 0xcc1, 0xc95, 0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcae, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e,
-0x3b, 0xc97, 0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xc9f, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcaa, 0xcc6, 0xcac, 0xcc8, 0x3b,
-0x45, 0x42, 0x431, 0x430, 0x439, 0x442, 0x43a, 0x411, 0x3b, 0x4d, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x54, 0x411, 0x3b, 0x41f, 0x411,
-0x3b, 0x45, 0x411, 0x4b, 0x69, 0x411, 0x3b, 0x4d, 0x69, 0x411, 0x3b, 0x47, 0x69, 0x411, 0x3b, 0x54, 0x69, 0x411, 0x3b, 0x50,
-0x69, 0x411, 0x3b, 0x45, 0x69, 0x411, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x442,
-0x431, 0x3b, 0x45, 0x42, 0xbc14, 0xc774, 0xd2b8, 0x62, 0x61, 0x69, 0x74, 0x69, 0x62, 0x61, 0x69, 0x74, 0x61, 0x69, 0x431, 0x430,
-0x458, 0x442, 0x438, 0x62, 0x61, 0x69, 0x74, 0xd2c, 0xd48, 0xd31, 0xd4d, 0xd31, 0xd4d, 0xd15, 0xd46, 0xd2c, 0xd3f, 0x3b, 0xd0e, 0xd02,
-0xd2c, 0xd3f, 0x3b, 0xd1c, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd1f, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd2a, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0x45, 0x42,
-0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x6b, 0x42, 0x3b,
-0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x92a, 0x93f, 0x91f, 0x93e, 0x3b, 0x45, 0x42, 0xb2c, 0xb3e, 0xb07, 0xb1f,
-0xb4d, 0x628, 0x627, 0x64a, 0x67c, 0x633, 0x628, 0x627, 0x6cc, 0x62a, 0x6a9, 0x6cc, 0x644, 0x648, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x645,
-0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x62a, 0x631, 0x627, 0x628,
-0x627, 0x6cc, 0x62a, 0x3b, 0x67e, 0x62a, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x45, 0x42, 0xa2c, 0xa3e, 0xa07, 0xa1f, 0x62, 0x79,
-0x21b, 0x69, 0x431, 0x430, 0x458, 0x442, 0x43e, 0x432, 0x438, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x6aa, 0x644, 0x648, 0x20, 0x628,
-0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x645, 0x64a, 0x6af, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x6af, 0x64a,
-0x6af, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x67d, 0x64a, 0x631, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d,
-0x632, 0x3b, 0x67e, 0x64a, 0x631, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x633, 0x3b, 0x45, 0x42, 0xdb6, 0xdba, 0xdd2, 0xda7,
-0xdca, 0xd9a, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xdb8, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xd9c, 0xdd2, 0xdb6,
-0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xda7, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d,
-0x3b, 0x45, 0x42, 0x62, 0x65, 0x79, 0x74, 0x69, 0x73, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42,
-0x3b, 0x42, 0x42, 0x3b, 0x45, 0x42, 0x6b, 0x69, 0x6c, 0x6f, 0x62, 0x61, 0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b,
-0x4d, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x74, 0x65, 0x72, 0x61, 0x62, 0x61,
-0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0xbaa, 0xbc8, 0xb9f,
-0xbcd, 0xb95, 0xbb3, 0xbcd, 0xc2c, 0xc48, 0xc1f, 0xc4d, 0x200c, 0xc32, 0xc41, 0xc15, 0xc47, 0xc2c, 0xc40, 0x3b, 0xc0e, 0xc2e, 0xc4d, 0x200c,
-0xc2c, 0xc3f, 0x3b, 0xc1c, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc1f, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc2a, 0xc40, 0xc2c, 0xc40, 0x3b, 0x45, 0x42,
-0xe44, 0xe1a, 0xe15, 0xe4c, 0x70, 0x61, 0x69, 0x74, 0x69, 0x6b, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d,
-0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54,
-0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45,
-0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x4b, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d,
-0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d,
-0x3b, 0x54, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b,
-0x30, 0x7d, 0x3b, 0x45, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x62, 0x61, 0xfd, 0x74, 0x431, 0x430, 0x439,
-0x442, 0x438, 0x628, 0x627, 0x626, 0x679, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x67e, 0x6cc,
-0x20, 0x628, 0x6cc, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x69, 0x74, 0x69, 0x61, 0x75, 0x92c, 0x93e, 0x92f, 0x91f, 0x61, 0x1e6d, 0x61,
-0x6d, 0x1e0d, 0x61, 0x6e, 0x6b, 0x41, 0x1e6c, 0x3b, 0x4d, 0x41, 0x1e6c, 0x3b, 0x47, 0x41, 0x1e6c, 0x3b, 0x54, 0x41, 0x1e6c, 0x3b,
-0x50, 0x42, 0x3b, 0x45, 0x42, 0x13d7, 0x13d3, 0x13cd, 0x13a6, 0x13b5, 0x13a9, 0x431, 0x430, 0x430, 0x439, 0x442, 0x43a, 0x411, 0x3b, 0x41c,
-0x411, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x79, 0x74, 0x65, 0x79, 0x6a9, 0x6cc,
+0x42, 0x3b, 0x45, 0x69, 0x42, 0x67, 0x72, 0x65, 0x65, 0x70, 0x62, 0x61, 0x6a, 0x74, 0x1263, 0x12ed, 0x1275, 0x12aa, 0x1263, 0x3b,
+0x121c, 0x130b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x130a, 0x1263, 0x3b, 0x1274, 0x122b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x1354, 0x1263, 0x3b, 0x45, 0x42,
+0x628, 0x627, 0x64a, 0x62a, 0x643, 0x64a, 0x644, 0x648, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x645, 0x64a, 0x63a, 0x627, 0x628, 0x627, 0x64a,
+0x62a, 0x3b, 0x63a, 0x64a, 0x63a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x62a, 0x64a, 0x631, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b,
+0x628, 0x64a, 0x62a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x45, 0x42, 0x562, 0x561, 0x575, 0x569, 0x565, 0x580, 0x56f, 0x532, 0x3b,
+0x544, 0x532, 0x3b, 0x533, 0x532, 0x3b, 0x54f, 0x532, 0x3b, 0x54a, 0x532, 0x3b, 0x45, 0x42, 0x9ac, 0x9be, 0x987, 0x99f, 0x995, 0x9bf,
+0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x9ae, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x997, 0x9bf, 0x983, 0x20, 0x9ac, 0x9be,
+0x983, 0x3b, 0x99f, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x61, 0x79, 0x74, 0x62,
+0x79, 0x74, 0x65, 0x2d, 0x61, 0x6b, 0x6f, 0x6b, 0x74, 0x65, 0x64, 0x6f, 0xf9, 0x6b, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x47,
+0x6f, 0x3b, 0x54, 0x6f, 0x3b, 0x50, 0x6f, 0x3b, 0x45, 0x6f, 0x4b, 0x69, 0x6f, 0x3b, 0x4d, 0x69, 0x6f, 0x3b, 0x47, 0x69,
+0x6f, 0x3b, 0x54, 0x69, 0x6f, 0x3b, 0x50, 0x69, 0x6f, 0x3b, 0x45, 0x69, 0x6f, 0x431, 0x430, 0x439, 0x442, 0x43e, 0x432, 0x435,
+0x1018, 0x102d, 0x102f, 0x1000, 0x103a, 0x431, 0x430, 0x439, 0x442, 0x44b, 0x41a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422,
+0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x1794, 0x17c3, 0x5b57, 0x8282, 0x5343, 0x5b57, 0x8282, 0x3b, 0x5146, 0x5b57, 0x8282, 0x3b, 0x5409,
+0x5b57, 0x8282, 0x3b, 0x592a, 0x5b57, 0x8282, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x4f4d, 0x5143, 0x7d44, 0x62, 0x61, 0x6a, 0x74, 0x6f,
+0x76, 0x69, 0x62, 0x61, 0x6a, 0x74, 0x79, 0x62, 0x61, 0x6a, 0x74, 0x6f, 0x6a, 0x62, 0x61, 0x69, 0x64, 0x69, 0x64, 0x62,
+0xfd, 0x74, 0x74, 0x61, 0x76, 0x75, 0x74, 0x6b, 0x74, 0x3b, 0x4d, 0x74, 0x3b, 0x47, 0x74, 0x3b, 0x54, 0x74, 0x3b, 0x50,
+0x74, 0x3b, 0x45, 0x74, 0x4b, 0x69, 0x74, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x47, 0x69, 0x74, 0x3b, 0x54, 0x69, 0x74, 0x3b,
+0x50, 0x69, 0x74, 0x3b, 0x45, 0x69, 0x74, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x62, 0x61, 0x69, 0x64, 0x68, 0x74, 0x10d1,
+0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x10d9, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10db, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10d2, 0x10d1,
+0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10e2, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10de, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x45,
+0x42, 0x42, 0x79, 0x74, 0x65, 0x73, 0xaac, 0xabe, 0xa87, 0xa9f, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54,
+0x42, 0x3b, 0xaaa, 0xac0, 0xaac, 0xac0, 0x3b, 0x45, 0x42, 0x5d1, 0x5d9, 0x5d9, 0x5d8, 0x92c, 0x93e, 0x907, 0x91f, 0x62, 0xe1, 0x6a,
+0x74, 0x62, 0xe6, 0x74, 0x69, 0x62, 0x65, 0x61, 0x72, 0x74, 0x61, 0x30d0, 0x30a4, 0x30c8, 0x4b, 0x42, 0x3b, 0x4d, 0x42, 0x3b,
+0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x69, 0x74, 0x65, 0xcac, 0xcc8, 0xc9f, 0xccd, 0x200c,
+0xc97, 0xcb3, 0xcc1, 0xc95, 0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcae, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xc97, 0xcbf, 0x2e,
+0xcac, 0xcc8, 0x2e, 0x3b, 0xc9f, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcaa, 0xcc6, 0xcac, 0xcc8, 0x3b, 0x45, 0x42, 0x43a, 0x411,
+0x3b, 0x4d, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x54, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x411, 0x4b, 0x69, 0x411, 0x3b, 0x4d,
+0x69, 0x411, 0x3b, 0x47, 0x69, 0x411, 0x3b, 0x54, 0x69, 0x411, 0x3b, 0x50, 0x69, 0x411, 0x3b, 0x45, 0x69, 0x411, 0x43a, 0x411,
+0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x442, 0x431, 0x3b, 0x45, 0x42, 0xbc14, 0xc774, 0xd2b8, 0x62,
+0x61, 0x69, 0x74, 0x69, 0x62, 0x61, 0x69, 0x74, 0x61, 0x69, 0x431, 0x430, 0x458, 0x442, 0x438, 0xd2c, 0xd48, 0xd31, 0xd4d, 0xd31,
+0xd4d, 0xd15, 0xd46, 0xd2c, 0xd3f, 0x3b, 0xd0e, 0xd02, 0xd2c, 0xd3f, 0x3b, 0xd1c, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd1f, 0xd3f, 0xd2c, 0xd3f,
+0x3b, 0xd2a, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0x45, 0x42, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b,
+0x41f, 0x411, 0x3b, 0x45, 0x42, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x92a, 0x93f, 0x91f,
+0x93e, 0x3b, 0x45, 0x42, 0xb2c, 0xb3e, 0xb07, 0xb1f, 0xb4d, 0x628, 0x627, 0x64a, 0x67c, 0x633, 0x628, 0x627, 0x6cc, 0x62a, 0x6a9, 0x6cc,
0x644, 0x648, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x645, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628,
-0x627, 0x6cc, 0x62a, 0x3b, 0x62a, 0x631, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x6d, 0x67, 0x61,
-0x20, 0x62, 0x79, 0x74, 0x65
+0x627, 0x6cc, 0x62a, 0x3b, 0x62a, 0x631, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x67e, 0x62a, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b,
+0x45, 0x42, 0xa2c, 0xa3e, 0xa07, 0xa1f, 0x62, 0x79, 0x21b, 0x69, 0x431, 0x430, 0x458, 0x442, 0x43e, 0x432, 0x438, 0x628, 0x627, 0x626,
+0x64a, 0x67d, 0x632, 0x6aa, 0x644, 0x648, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x645, 0x64a, 0x6af, 0x627, 0x20, 0x628,
+0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x6af, 0x64a, 0x6af, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x67d, 0x64a,
+0x631, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x67e, 0x64a, 0x631, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d,
+0x633, 0x3b, 0x45, 0x42, 0xdb6, 0xdba, 0xdd2, 0xda7, 0xdca, 0xd9a, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xdb8, 0xdd9, 0xdb6,
+0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xd9c, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xda7, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d,
+0x3b, 0xdb4, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x79, 0x74, 0x69, 0x73, 0x6b, 0x42, 0x3b,
+0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x42, 0x42, 0x3b, 0x45, 0x42, 0x6b, 0x69, 0x6c, 0x6f, 0x62, 0x61,
+0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x7b, 0x30,
+0x7d, 0x3b, 0x74, 0x65, 0x72, 0x61, 0x62, 0x61, 0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x7b,
+0x30, 0x7d, 0x3b, 0x45, 0x42, 0xbaa, 0xbc8, 0xb9f, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0xc2c, 0xc48, 0xc1f, 0xc4d, 0x200c, 0xc32, 0xc41, 0xc15,
+0xc47, 0xc2c, 0xc40, 0x3b, 0xc0e, 0xc2e, 0xc4d, 0x200c, 0xc2c, 0xc3f, 0x3b, 0xc1c, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc1f, 0xc40, 0xc2c, 0xc40,
+0x3b, 0xc2a, 0xc40, 0xc2c, 0xc40, 0x3b, 0x45, 0x42, 0xe44, 0xe1a, 0xe15, 0xe4c, 0x70, 0x61, 0x69, 0x74, 0x69, 0x6b, 0x42, 0x20,
+0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20,
+0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20,
+0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x4b, 0x69, 0x42, 0x20,
+0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x69,
+0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b,
+0x50, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30,
+0x7d, 0x62, 0x61, 0xfd, 0x74, 0x431, 0x430, 0x439, 0x442, 0x438, 0x628, 0x627, 0x626, 0x679, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b,
+0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x67e, 0x6cc, 0x20, 0x628, 0x6cc, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x69, 0x74, 0x69, 0x61,
+0x75, 0x92c, 0x93e, 0x92f, 0x91f, 0x61, 0x1e6d, 0x61, 0x6d, 0x1e0d, 0x61, 0x6e, 0x6b, 0x41, 0x1e6c, 0x3b, 0x4d, 0x41, 0x1e6c, 0x3b,
+0x47, 0x41, 0x1e6c, 0x3b, 0x54, 0x41, 0x1e6c, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x13d7, 0x13d3, 0x13cd, 0x13a6, 0x13b5, 0x13a9, 0x431,
+0x430, 0x430, 0x439, 0x442, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45,
+0x42, 0xd804, 0xdd1d, 0xd804, 0xdd2d, 0xd804, 0xdd16, 0xd804, 0xdd34, 0x62, 0x79, 0x74, 0x65, 0x79, 0x6a9, 0x6cc, 0x644, 0x648, 0x628, 0x627,
+0x6cc, 0x62a, 0x3b, 0x645, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b,
+0x62a, 0x631, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x6d, 0x67, 0x61, 0x20, 0x62, 0x79, 0x74,
+0x65
};
-static const ushort am_data[] = {
+static const char16_t am_data[] = {
0x41, 0x4d, 0x57, 0x44, 0x76, 0x6d, 0x2e, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x64, 0x69, 0x74, 0x65, 0x73, 0x1325, 0x12cb,
0x1275, 0x635, 0x9aa, 0x9c2, 0x9f0, 0x9cd, 0x9ac, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x410, 0x41c, 0xf66, 0xf94, 0xf0b, 0xf46, 0xf0b, 0x41, 0x2e,
0x4d, 0x2e, 0x43f, 0x440, 0x2e, 0x43e, 0x431, 0x2e, 0x1014, 0x1036, 0x1014, 0x1000, 0x103a, 0x61, 0x2e, 0xa0, 0x6d, 0x2e, 0x4e0a, 0x5348,
0x64, 0x6f, 0x70, 0x2e, 0x61, 0x2e, 0x6d, 0x2e, 0x61, 0x6d, 0x61, 0x74, 0x6d, 0x61, 0x70, 0x2e, 0x6d, 0x61, 0x74, 0x69,
-0x6e, 0x6d, 0x3c0, 0x2e, 0x3bc, 0x2e, 0x53, 0x61, 0x66, 0x69, 0x79, 0x61, 0x5dc, 0x5e4, 0x5e0, 0x5d4, 0x5f4, 0x5e6, 0x64, 0x65,
-0x2e, 0x66, 0x2e, 0x68, 0x2e, 0x72, 0x2e, 0x6e, 0x2e, 0x5348, 0x524d, 0x49, 0x73, 0x75, 0x6b, 0xcaa, 0xcc2, 0xcb0, 0xccd, 0xcb5,
-0xcbe, 0xcb9, 0xccd, 0xca8, 0x442, 0x430, 0x4a3, 0x43a, 0x44b, 0xc624, 0xc804, 0x42, 0x4e, 0x5a, 0x2e, 0x4d, 0x55, 0x2e, 0xe81, 0xec8,
-0xead, 0xe99, 0xe97, 0xec8, 0xebd, 0xe87, 0x70, 0x72, 0x69, 0x65, 0x6b, 0x161, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101,
-0x6e, 0x74, 0x254, 0x301, 0x6e, 0x67, 0x254, 0x301, 0x70, 0x72, 0x69, 0x65, 0x161, 0x70, 0x69, 0x65, 0x74, 0x43f, 0x440, 0x435,
-0x442, 0x43f, 0x43b, 0x430, 0x434, 0x43d, 0x435, 0x50, 0x47, 0x92e, 0x2e, 0x92a, 0x942, 0x2e, 0x4af, 0x2e, 0x4e9, 0x2e, 0x92a, 0x942,
-0x930, 0x94d, 0x935, 0x93e, 0x939, 0x94d, 0x928, 0x63a, 0x2e, 0x645, 0x2e, 0x642, 0x628, 0x644, 0x200c, 0x627, 0x632, 0x638, 0x647, 0x631,
-0x64, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x68, 0xe3, 0xa2a, 0xa42, 0x2e, 0xa26, 0xa41, 0x2e, 0x4e, 0x44, 0x43f, 0x440, 0x435, 0x20,
-0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x43f, 0x440, 0x438, 0x458, 0x435, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x70, 0x72, 0x69, 0x6a,
-0x65, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x70, 0x72, 0x65, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x4d5, 0x43c, 0x431, 0x438,
-0x441, 0x431, 0x43e, 0x43d, 0x44b, 0x20, 0x440, 0x430, 0x437, 0x43c, 0x4d5, 0x635, 0x628, 0x62d, 0x60c, 0x20, 0x645, 0x646, 0x62c, 0x647,
-0x646, 0x62f, 0xdb4, 0xdd9, 0x2e, 0xdc0, 0x2e, 0x47, 0x48, 0x66, 0x6d, 0xbae, 0xbc1, 0xbb1, 0xbcd, 0xbaa, 0xb95, 0xbb2, 0xbcd, 0xe01,
-0xe48, 0xe2d, 0xe19, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf66, 0xf94, 0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b, 0x1295, 0x1309, 0x1206, 0x20,
-0x1230, 0x12d3, 0x1270, 0x68, 0x65, 0x6e, 0x67, 0x69, 0x68, 0x65, 0x6e, 0x67, 0x69, 0xd6, 0xd6, 0x67, 0xfc, 0x6e, 0x6f, 0x72,
-0x74, 0x61, 0x64, 0x61, 0x6e, 0x20, 0xf6, 0x148, 0x686, 0x6c8, 0x634, 0x62a, 0x649, 0x646, 0x20, 0x628, 0x6c7, 0x631, 0x6c7, 0x646,
-0x434, 0x43f, 0x54, 0x4f, 0x422, 0x41e, 0x53, 0x41, 0x79, 0x62, 0x53, 0x75, 0x62, 0x5e4, 0x5bf, 0x5d0, 0x5b7, 0x5e8, 0x5de, 0x5d9,
-0x5d8, 0x5d0, 0x5b8, 0x5d2, 0xc0, 0xe1, 0x72, 0x1ecd, 0x300, 0xc0, 0xe1, 0x72, 0x254, 0x300, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x64,
-0x64, 0x61, 0x67, 0x70, 0x72, 0x69, 0x6a, 0x65, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x41, 0x4e, 0x4e, 0x2019, 0x1ee5, 0x74, 0x1ee5,
-0x74, 0x1ee5, 0x128, 0x79, 0x61, 0x6b, 0x77, 0x61, 0x6b, 0x79, 0x61, 0x61, 0x2e, 0x14b, 0x64, 0x69, 0x61, 0x6d, 0x20, 0x56,
-0x6f, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x61, 0x67, 0xa3b8, 0xa111, 0x69, 0x111, 0x69, 0x74, 0x62, 0x65, 0x61, 0x69, 0x76, 0x65,
-0x74, 0x69, 0x62, 0x4d, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x4c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x4b, 0x73,
-0x75, 0x62, 0x61, 0x6b, 0x61, 0x4b, 0x69, 0x72, 0x6f, 0x6b, 0x6f, 0x54, 0x65, 0x73, 0x69, 0x72, 0x61, 0x6e, 0x6b, 0x61,
-0x6e, 0x67, 0x2019, 0x61, 0x6d, 0x61, 0x2d5c, 0x2d49, 0x2d3c, 0x2d30, 0x2d61, 0x2d5c, 0x74, 0x69, 0x66, 0x61, 0x77, 0x74, 0x6e, 0x20,
-0x74, 0x75, 0x66, 0x61, 0x74, 0x70, 0x61, 0x6d, 0x69, 0x6c, 0x61, 0x75, 0x75, 0x74, 0x75, 0x6b, 0x6f, 0x4b, 0x49, 0x13cc,
-0x13be, 0x13b4, 0x4d, 0x75, 0x68, 0x69, 0x54, 0x4f, 0x4f, 0x75, 0x6c, 0x75, 0x63, 0x68, 0x65, 0x6c, 0x6f, 0x52, 0x168, 0x6b,
-0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x1c1, 0x67, 0x6f, 0x61, 0x67, 0x61, 0x73, 0x55, 0x68, 0x72, 0x20, 0x76, 0xf6, 0x72, 0x6d,
-0x69, 0x64, 0x64, 0x61, 0x61, 0x63, 0x68, 0x73, 0x190, 0x6e, 0x6b, 0x61, 0x6b, 0x25b, 0x6e, 0x79, 0xe1, 0x4d, 0x75, 0x6e,
-0x6b, 0x79, 0x6f, 0x69, 0x63, 0x68, 0x65, 0x68, 0x65, 0x61, 0x76, 0x6f, 0x54, 0x61, 0x70, 0x61, 0x72, 0x61, 0x63, 0x68,
-0x75, 0x41, 0x64, 0x64, 0x75, 0x68, 0x61, 0x4f, 0x44, 0x5a, 0x64, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x61, 0x6c, 0x6d, 0x61,
-0x6b, 0x65, 0x6f, 0x92b, 0x941, 0x902, 0x44, 0x69, 0x6e, 0x64, 0x61, 0x6d, 0x6f, 0x69, 0x65, 0x73, 0x61, 0x2e, 0x67, 0x49,
-0x20, 0x62, 0x69, 0x6b, 0x25b, 0x302, 0x67, 0x6c, 0xe0, 0x53, 0x75, 0x62, 0x62, 0x61, 0x61, 0x68, 0x69, 0x69, 0x64, 0x69,
-0x253, 0x61, 0x6b, 0xed, 0x6b, 0xed, 0x72, 0xed, 0x67, 0x73, 0xe1, 0x72, 0xfa, 0x77, 0xe1, 0x77, 0x69, 0x63, 0x68, 0x69,
-0x73, 0x68, 0x75, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6d, 0x61, 0x6e, 0xe1, 0x52, 0x57, 0x42d, 0x418, 0x4c, 0x77, 0x61, 0x6d,
-0x69, 0x6c, 0x61, 0x77, 0x75, 0x6b, 0x69, 0x25b, 0x6d, 0x25b, 0x301, 0x25b, 0x6d, 0x64, 0x65, 0x20, 0x6c, 0x61, 0x20, 0x6d,
-0x61, 0xf1, 0x61, 0x6e, 0x61, 0x6d, 0x62, 0x61, 0xa78c, 0x6d, 0x62, 0x61, 0xa78c, 0x6d, 0x62, 0x61, 0x2bc, 0xe1, 0x6d, 0x62,
-0x61, 0x2bc, 0x628, 0x2e, 0x646, 0x64, 0x6f, 0x70, 0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x61, 0x69, 0x70, 0x2e
+0x6e, 0x3c0, 0x2e, 0x3bc, 0x2e, 0x53, 0x61, 0x66, 0x69, 0x79, 0x61, 0x5dc, 0x5e4, 0x5e0, 0x5d4, 0x5f4, 0x5e6, 0x64, 0x65, 0x2e,
+0x66, 0x2e, 0x68, 0x2e, 0x72, 0x2e, 0x6e, 0x2e, 0x5348, 0x524d, 0x49, 0x73, 0x75, 0x6b, 0xcaa, 0xcc2, 0xcb0, 0xccd, 0xcb5, 0xcbe,
+0xcb9, 0xccd, 0xca8, 0x442, 0x430, 0x4a3, 0x43a, 0x44b, 0xc624, 0xc804, 0x42, 0x4e, 0x5a, 0x2e, 0x4d, 0x55, 0x2e, 0xe81, 0xec8, 0xead,
+0xe99, 0xe97, 0xec8, 0xebd, 0xe87, 0x70, 0x72, 0x69, 0x65, 0x6b, 0x161, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x6e,
+0x74, 0x254, 0x301, 0x6e, 0x67, 0x254, 0x301, 0x70, 0x72, 0x69, 0x65, 0x161, 0x70, 0x69, 0x65, 0x74, 0x43f, 0x440, 0x435, 0x442,
+0x43f, 0x43b, 0x430, 0x434, 0x43d, 0x435, 0x50, 0x47, 0x92e, 0x2e, 0x92a, 0x942, 0x2e, 0x4af, 0x2e, 0x4e9, 0x2e, 0x92a, 0x942, 0x930,
+0x94d, 0x935, 0x93e, 0x939, 0x94d, 0x928, 0x63a, 0x2e, 0x645, 0x2e, 0x642, 0x628, 0x644, 0x200c, 0x627, 0x632, 0x638, 0x647, 0x631, 0x64,
+0x61, 0x20, 0x6d, 0x61, 0x6e, 0x68, 0xe3, 0xa2a, 0xa42, 0x2e, 0xa26, 0xa41, 0x2e, 0x4e, 0x44, 0x43f, 0x440, 0x435, 0x20, 0x43f,
+0x43e, 0x434, 0x43d, 0x435, 0x70, 0x72, 0x69, 0x6a, 0x65, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x70, 0x72, 0x65, 0x20, 0x70,
+0x6f, 0x64, 0x6e, 0x65, 0x43f, 0x440, 0x438, 0x458, 0x435, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x4d5, 0x43c, 0x431, 0x438, 0x441,
+0x431, 0x43e, 0x43d, 0x44b, 0x20, 0x440, 0x430, 0x437, 0x43c, 0x4d5, 0x635, 0x628, 0x62d, 0x60c, 0x20, 0x645, 0x646, 0x62c, 0x647, 0x646,
+0x62f, 0xdb4, 0xdd9, 0x2e, 0xdc0, 0x2e, 0x47, 0x48, 0x66, 0x6d, 0xbae, 0xbc1, 0xbb1, 0xbcd, 0xbaa, 0xb95, 0xbb2, 0xbcd, 0xe01, 0xe48,
+0xe2d, 0xe19, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf66, 0xf94, 0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b, 0x1295, 0x1309, 0x1206, 0x20, 0x1230,
+0x12d3, 0x1270, 0x68, 0x65, 0x6e, 0x67, 0x69, 0x68, 0x65, 0x6e, 0x67, 0x69, 0xd6, 0xd6, 0x67, 0xfc, 0x6e, 0x6f, 0x72, 0x74,
+0x61, 0x64, 0x61, 0x6e, 0x20, 0xf6, 0x148, 0x686, 0x6c8, 0x634, 0x62a, 0x649, 0x646, 0x20, 0x628, 0x6c7, 0x631, 0x6c7, 0x646, 0x434,
+0x43f, 0x54, 0x4f, 0x422, 0x41e, 0x53, 0x41, 0x79, 0x62, 0x53, 0x75, 0x62, 0x5e4, 0x5bf, 0x5d0, 0x5b7, 0x5e8, 0x5de, 0x5d9, 0x5d8,
+0x5d0, 0x5b8, 0x5d2, 0xc0, 0xe1, 0x72, 0x1ecd, 0x300, 0xc0, 0xe1, 0x72, 0x254, 0x300, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x64, 0x64,
+0x61, 0x67, 0x70, 0x72, 0x69, 0x6a, 0x65, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x41, 0x4e, 0x4e, 0x2019, 0x1ee5, 0x74, 0x1ee5, 0x74,
+0x1ee5, 0x128, 0x79, 0x61, 0x6b, 0x77, 0x61, 0x6b, 0x79, 0x61, 0x14b, 0x64, 0x69, 0x61, 0x6d, 0x20, 0x56, 0x6f, 0x72, 0x6d,
+0x69, 0x74, 0x74, 0x61, 0x67, 0xa3b8, 0xa111, 0x69, 0x111, 0x69, 0x74, 0x62, 0x65, 0x61, 0x69, 0x76, 0x65, 0x74, 0x69, 0x62,
+0x4d, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x4c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x4b, 0x73, 0x75, 0x62, 0x61,
+0x6b, 0x61, 0x4b, 0x69, 0x72, 0x6f, 0x6b, 0x6f, 0x54, 0x65, 0x73, 0x69, 0x72, 0x61, 0x6e, 0x6b, 0x61, 0x6e, 0x67, 0x2019,
+0x61, 0x6d, 0x61, 0x2d5c, 0x2d49, 0x2d3c, 0x2d30, 0x2d61, 0x2d5c, 0x74, 0x69, 0x66, 0x61, 0x77, 0x74, 0x6e, 0x20, 0x74, 0x75, 0x66,
+0x61, 0x74, 0x70, 0x61, 0x6d, 0x69, 0x6c, 0x61, 0x75, 0x75, 0x74, 0x75, 0x6b, 0x6f, 0x4b, 0x49, 0x13cc, 0x13be, 0x13b4, 0x4d,
+0x75, 0x68, 0x69, 0x54, 0x4f, 0x4f, 0x75, 0x6c, 0x75, 0x63, 0x68, 0x65, 0x6c, 0x6f, 0x52, 0x168, 0x6b, 0x61, 0x72, 0x6f,
+0x6f, 0x6e, 0x1c1, 0x67, 0x6f, 0x61, 0x67, 0x61, 0x73, 0x55, 0x68, 0x72, 0x20, 0x76, 0xf6, 0x72, 0x6d, 0x69, 0x64, 0x64,
+0x61, 0x61, 0x63, 0x68, 0x73, 0x190, 0x6e, 0x6b, 0x61, 0x6b, 0x25b, 0x6e, 0x79, 0xe1, 0x4d, 0x75, 0x6e, 0x6b, 0x79, 0x6f,
+0x69, 0x63, 0x68, 0x65, 0x68, 0x65, 0x61, 0x76, 0x6f, 0x54, 0x61, 0x70, 0x61, 0x72, 0x61, 0x63, 0x68, 0x75, 0x41, 0x64,
+0x64, 0x75, 0x68, 0x61, 0x4f, 0x44, 0x5a, 0x64, 0x61, 0x74, 0x20, 0x61, 0x7a, 0x61, 0x6c, 0x6d, 0x61, 0x6b, 0x65, 0x6f,
+0x92b, 0x941, 0x902, 0x44, 0x69, 0x6e, 0x64, 0x61, 0x6d, 0x6f, 0x69, 0x65, 0x73, 0x61, 0x2e, 0x67, 0x49, 0x20, 0x62, 0x69,
+0x6b, 0x25b, 0x302, 0x67, 0x6c, 0xe0, 0x53, 0x75, 0x62, 0x62, 0x61, 0x61, 0x68, 0x69, 0x69, 0x64, 0x69, 0x253, 0x61, 0x6b,
+0xed, 0x6b, 0xed, 0x72, 0xed, 0x67, 0x73, 0xe1, 0x72, 0xfa, 0x77, 0xe1, 0x77, 0x69, 0x63, 0x68, 0x69, 0x73, 0x68, 0x75,
+0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6d, 0x61, 0x6e, 0xe1, 0x52, 0x57, 0x42d, 0x418, 0x4c, 0x77, 0x61, 0x6d, 0x69, 0x6c, 0x61,
+0x77, 0x75, 0x6b, 0x69, 0x25b, 0x6d, 0x25b, 0x301, 0x25b, 0x6d, 0x64, 0x65, 0x20, 0x6c, 0x61, 0x20, 0x6d, 0x61, 0xf1, 0x61,
+0x6e, 0x61, 0x6d, 0x62, 0x61, 0xa78c, 0x6d, 0x62, 0x61, 0xa78c, 0x6d, 0x62, 0x61, 0x2bc, 0xe1, 0x6d, 0x62, 0x61, 0x2bc, 0x628,
+0x2e, 0x646, 0x64, 0x6f, 0x70, 0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x61, 0x69, 0x70, 0x2e
};
-static const ushort pm_data[] = {
+static const char16_t pm_data[] = {
0x50, 0x4d, 0x57, 0x42, 0x6e, 0x6d, 0x2e, 0x65, 0x20, 0x70, 0x61, 0x73, 0x64, 0x69, 0x74, 0x65, 0x73, 0x12a8, 0x1230, 0x12d3,
0x1275, 0x645, 0x985, 0x9aa, 0x9f0, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x41f, 0x41c, 0xf55, 0xfb1, 0xf72, 0xf0b, 0xf46, 0xf0b, 0x47, 0x2e, 0x4d,
0x2e, 0x441, 0x43b, 0x2e, 0x43e, 0x431, 0x2e, 0x100a, 0x1014, 0x1031, 0x70, 0x2e, 0xa0, 0x6d, 0x2e, 0x4e0b, 0x5348, 0x6f, 0x64, 0x70,
@@ -3270,951 +3253,910 @@ static const ushort pm_data[] = {
0x5d0, 0x5b8, 0x5db, 0x5de, 0x5d9, 0x5d8, 0x5d0, 0x5b8, 0x5d2, 0x1ecc, 0x300, 0x73, 0xe1, 0x6e, 0x186, 0x300, 0x73, 0xe1, 0x6e, 0x65,
0x74, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x64, 0x64, 0x61, 0x67, 0x70, 0x6f, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x43f, 0x43e, 0x441,
0x43b, 0x438, 0x458, 0x435, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x45, 0x57, 0x4e, 0x2019, 0x61, 0x62, 0x61, 0x6c, 0x69, 0x128,
-0x79, 0x61, 0x77, 0x129, 0x6f, 0x6f, 0x70, 0x2e, 0x263, 0x65, 0x74, 0x72, 0x254, 0x61, 0x6d, 0x20, 0x4e, 0x61, 0x6d, 0x69,
-0x74, 0x74, 0x61, 0x67, 0xa06f, 0xa2d2, 0x65, 0x61, 0x68, 0x6b, 0x65, 0x74, 0x62, 0x65, 0x61, 0x69, 0x76, 0x65, 0x74, 0x65,
-0x62, 0x4d, 0x6f, 0x67, 0x6c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x70, 0x6b, 0x69, 0x6b, 0x69, 0x69, 0x257,
-0x65, 0x48, 0x77, 0x61, 0x129, 0x2d, 0x69, 0x6e, 0x129, 0x54, 0x65, 0x69, 0x70, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x6f, 0x74,
-0x6f, 0x2d5c, 0x2d30, 0x2d37, 0x2d33, 0x2d33, 0x2d6f, 0x2d30, 0x2d5c, 0x74, 0x61, 0x64, 0x67, 0x67, 0x2b7, 0x61, 0x74, 0x6e, 0x20, 0x74,
-0x6d, 0x65, 0x64, 0x64, 0x69, 0x74, 0x70, 0x61, 0x6d, 0x75, 0x6e, 0x79, 0x69, 0x6b, 0x79, 0x69, 0x75, 0x6b, 0x6f, 0x6e,
-0x79, 0x69, 0x55, 0x54, 0x13d2, 0x13af, 0x13f1, 0x13a2, 0x13d7, 0x13e2, 0x43, 0x68, 0x69, 0x6c, 0x6f, 0x4d, 0x55, 0x55, 0x61, 0x6b,
-0x61, 0x73, 0x75, 0x62, 0x61, 0x168, 0x47, 0x6b, 0x6f, 0x6f, 0x73, 0x6b, 0x6f, 0x6c, 0x69, 0x6e, 0x79, 0x1c3, 0x75, 0x69,
-0x61, 0x73, 0x55, 0x68, 0x72, 0x20, 0x6e, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x73, 0x190, 0x6e,
-0x64, 0xe1, 0x6d, 0xe2, 0x45, 0x69, 0x67, 0x75, 0x6c, 0x6f, 0x69, 0x63, 0x68, 0x61, 0x6d, 0x74, 0x68, 0x69, 0x45, 0x62,
-0x6f, 0x6e, 0x67, 0x69, 0x41, 0x6c, 0x75, 0x75, 0x6c, 0x61, 0x4f, 0x54, 0x1e0c, 0x65, 0x66, 0x66, 0x69, 0x72, 0x20, 0x61,
-0x7a, 0x61, 0x6e, 0x79, 0x69, 0x61, 0x67, 0x68, 0x75, 0x6f, 0x92c, 0x947, 0x932, 0x93e, 0x938, 0x947, 0x44, 0x69, 0x6c, 0x6f,
-0x6c, 0x6f, 0x6e, 0x6f, 0x6d, 0xeb, 0x74, 0x74, 0x65, 0x73, 0x61, 0x2e, 0x6b, 0x49, 0x20, 0x253, 0x75, 0x67, 0x61, 0x6a,
-0x254, 0x70, 0x5a, 0x61, 0x61, 0x72, 0x69, 0x6b, 0x61, 0x79, 0x20, 0x62, 0x65, 0x62, 0x79, 0xe1, 0x6d, 0x75, 0x6e, 0x67,
-0x259, 0x67, 0xf3, 0x67, 0x259, 0x6c, 0x65, 0x63, 0x25b, 0x25b, 0x301, 0x6e, 0x6b, 0x6f, 0x6d, 0x63, 0x68, 0x6f, 0x63, 0x68,
-0x69, 0x6c, 0x2019, 0x6c, 0x6c, 0x69, 0x6c, 0x6c, 0x69, 0x6b, 0x75, 0x67, 0xfa, 0x54, 0x14a, 0x42d, 0x41a, 0x50, 0x61, 0x73,
-0x68, 0x61, 0x6d, 0x69, 0x68, 0x65, 0x6b, 0x69, 0x73, 0x25b, 0x301, 0x6e, 0x64, 0x25b, 0x64, 0x65, 0x20, 0x6c, 0x61, 0x20,
-0x74, 0x61, 0x72, 0x64, 0x65, 0x14b, 0x6b, 0x61, 0x20, 0x6d, 0x62, 0x254, 0x301, 0x74, 0x20, 0x6e, 0x6a, 0x69, 0x6e, 0x63,
-0x77, 0xf2, 0x6e, 0x7a, 0xe9, 0x6d, 0x62f, 0x2e, 0x646, 0x77, 0xf3, 0x74, 0x70, 0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x61, 0x70,
-0x6f, 0x70, 0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x75, 0x65, 0x70, 0x2e
+0x79, 0x61, 0x77, 0x129, 0x6f, 0x6f, 0x263, 0x65, 0x74, 0x72, 0x254, 0x61, 0x6d, 0x20, 0x4e, 0x61, 0x6d, 0x69, 0x74, 0x74,
+0x61, 0x67, 0xa06f, 0xa2d2, 0x65, 0x61, 0x68, 0x6b, 0x65, 0x74, 0x62, 0x65, 0x61, 0x69, 0x76, 0x65, 0x74, 0x65, 0x62, 0x4d,
+0x6f, 0x67, 0x6c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x70, 0x6b, 0x69, 0x6b, 0x69, 0x69, 0x257, 0x65, 0x48,
+0x77, 0x61, 0x129, 0x2d, 0x69, 0x6e, 0x129, 0x54, 0x65, 0x69, 0x70, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x6f, 0x74, 0x6f, 0x2d5c,
+0x2d30, 0x2d37, 0x2d33, 0x2d33, 0x2d6f, 0x2d30, 0x2d5c, 0x74, 0x61, 0x64, 0x67, 0x67, 0x2b7, 0x61, 0x74, 0x6e, 0x20, 0x74, 0x6d, 0x65,
+0x64, 0x64, 0x69, 0x74, 0x70, 0x61, 0x6d, 0x75, 0x6e, 0x79, 0x69, 0x6b, 0x79, 0x69, 0x75, 0x6b, 0x6f, 0x6e, 0x79, 0x69,
+0x55, 0x54, 0x13d2, 0x13af, 0x13f1, 0x13a2, 0x13d7, 0x13e2, 0x43, 0x68, 0x69, 0x6c, 0x6f, 0x4d, 0x55, 0x55, 0x61, 0x6b, 0x61, 0x73,
+0x75, 0x62, 0x61, 0x168, 0x47, 0x6b, 0x6f, 0x6f, 0x73, 0x6b, 0x6f, 0x6c, 0x69, 0x6e, 0x79, 0x1c3, 0x75, 0x69, 0x61, 0x73,
+0x55, 0x68, 0x72, 0x20, 0x6e, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x73, 0x190, 0x6e, 0x64, 0xe1,
+0x6d, 0xe2, 0x45, 0x69, 0x67, 0x75, 0x6c, 0x6f, 0x69, 0x63, 0x68, 0x61, 0x6d, 0x74, 0x68, 0x69, 0x45, 0x62, 0x6f, 0x6e,
+0x67, 0x69, 0x41, 0x6c, 0x75, 0x75, 0x6c, 0x61, 0x4f, 0x54, 0x1e0c, 0x65, 0x66, 0x66, 0x69, 0x72, 0x20, 0x61, 0x7a, 0x61,
+0x6e, 0x79, 0x69, 0x61, 0x67, 0x68, 0x75, 0x6f, 0x92c, 0x947, 0x932, 0x93e, 0x938, 0x947, 0x44, 0x69, 0x6c, 0x6f, 0x6c, 0x6f,
+0x6e, 0x6f, 0x6d, 0xeb, 0x74, 0x74, 0x65, 0x73, 0x61, 0x2e, 0x6b, 0x49, 0x20, 0x253, 0x75, 0x67, 0x61, 0x6a, 0x254, 0x70,
+0x5a, 0x61, 0x61, 0x72, 0x69, 0x6b, 0x61, 0x79, 0x20, 0x62, 0x65, 0x62, 0x79, 0xe1, 0x6d, 0x75, 0x6e, 0x67, 0x259, 0x67,
+0xf3, 0x67, 0x259, 0x6c, 0x65, 0x63, 0x25b, 0x25b, 0x301, 0x6e, 0x6b, 0x6f, 0x6d, 0x63, 0x68, 0x6f, 0x63, 0x68, 0x69, 0x6c,
+0x2019, 0x6c, 0x6c, 0x69, 0x6c, 0x6c, 0x69, 0x6b, 0x75, 0x67, 0xfa, 0x54, 0x14a, 0x42d, 0x41a, 0x50, 0x61, 0x73, 0x68, 0x61,
+0x6d, 0x69, 0x68, 0x65, 0x6b, 0x69, 0x73, 0x25b, 0x301, 0x6e, 0x64, 0x25b, 0x64, 0x65, 0x20, 0x6c, 0x61, 0x20, 0x74, 0x61,
+0x72, 0x64, 0x65, 0x14b, 0x6b, 0x61, 0x20, 0x6d, 0x62, 0x254, 0x301, 0x74, 0x20, 0x6e, 0x6a, 0x69, 0x6e, 0x63, 0x77, 0xf2,
+0x6e, 0x7a, 0xe9, 0x6d, 0x62f, 0x2e, 0x646, 0x77, 0xf3, 0x74, 0x70, 0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x61, 0x70, 0x6f, 0x70,
+0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x75, 0x65, 0x70, 0x2e
};
-static const ushort currency_symbol_data[] = {
+static const char16_t currency_symbol_data[] = {
0x42, 0x72, 0x4b, 0x73, 0x68, 0x52, 0x24, 0x4c, 0x65, 0x6b, 0xeb, 0x64, 0x65, 0x6e, 0x20ac, 0x1265, 0x122d, 0x62c, 0x2e, 0x645,
-0x2e, 0x200f, 0x62f, 0x2e, 0x62c, 0x2e, 0x200f, 0x62f, 0x2e, 0x628, 0x2e, 0x200f, 0x46, 0x43, 0x46, 0x41, 0x43, 0x46, 0x46, 0x64,
-0x6a, 0x4e, 0x66, 0x6b, 0x62f, 0x2e, 0x639, 0x2e, 0x200f, 0x20aa, 0x62f, 0x2e, 0x623, 0x2e, 0x200f, 0x62f, 0x2e, 0x643, 0x2e, 0x200f,
-0x644, 0x2e, 0x644, 0x2e, 0x200f, 0x62f, 0x2e, 0x644, 0x2e, 0x200f, 0x623, 0x2e, 0x645, 0x2e, 0x62f, 0x2e, 0x645, 0x2e, 0x200f, 0x631,
-0x2e, 0x639, 0x2e, 0x200f, 0x631, 0x2e, 0x642, 0x2e, 0x200f, 0x631, 0x2e, 0x633, 0x2e, 0x200f, 0x53, 0x62c, 0x2e, 0x633, 0x2e, 0x644,
-0x2e, 0x633, 0x2e, 0x200f, 0x62f, 0x2e, 0x62a, 0x2e, 0x200f, 0x62f, 0x2e, 0x625, 0x2e, 0x200f, 0x631, 0x2e, 0x64a, 0x2e, 0x200f, 0xa3,
-0x58f, 0x20b9, 0x20bc, 0x20bd, 0x9f3, 0x4e, 0x75, 0x2e, 0x43b, 0x432, 0x2e, 0x4b, 0x17db, 0xa5, 0x48, 0x4b, 0x24, 0x4d, 0x4f, 0x50,
-0x24, 0x48, 0x52, 0x4b, 0x4b, 0x4d, 0x4b, 0x10d, 0x6b, 0x72, 0x2e, 0x41, 0x66, 0x6c, 0x2e, 0x4e, 0x41, 0x66, 0x2e, 0x55,
-0x53, 0x24, 0x50, 0x46, 0x42, 0x75, 0x44, 0x47, 0x48, 0x20b5, 0x41, 0x72, 0x4d, 0x4b, 0x52, 0x4d, 0x52, 0x73, 0x20a6, 0x20b1,
-0x52, 0x46, 0x57, 0x53, 0x24, 0x53, 0x52, 0x4c, 0x65, 0x45, 0x6b, 0x72, 0x54, 0x53, 0x68, 0x54, 0x24, 0x55, 0x53, 0x68,
-0x41, 0x45, 0x44, 0x56, 0x54, 0x44, 0x41, 0x43, 0x46, 0x41, 0x46, 0x43, 0x46, 0x43, 0x46, 0x50, 0x46, 0x47, 0x47, 0x55,
-0x4d, 0x4d, 0x41, 0x44, 0x43, 0x48, 0x46, 0x4c, 0x53, 0x44, 0x54, 0x20be, 0x20b2, 0x46, 0x74, 0x49, 0x53, 0x4b, 0x52, 0x70,
-0x43, 0x41, 0x24, 0xffe5, 0x20b8, 0x441, 0x43e, 0x43c, 0x20a9, 0x4b, 0x50, 0x57, 0x20ba, 0x20ad, 0x4b, 0x7a, 0x434, 0x435, 0x43d, 0x2e,
-0x20ae, 0x43, 0x4e, 0xa5, 0x928, 0x947, 0x930, 0x942, 0x60b, 0x631, 0x6cc, 0x627, 0x644, 0x7a, 0x142, 0x52, 0x24, 0x200b, 0x4d, 0x54,
-0x6e, 0x44, 0x62, 0x631, 0x53, 0x2f, 0x42, 0x73, 0x52, 0x4f, 0x4e, 0x4c, 0x20b4, 0x52, 0x53, 0x44, 0x41a, 0x41c, 0xdbb, 0xdd4,
+0x2e, 0x200f, 0x62f, 0x2e, 0x62c, 0x2e, 0x200f, 0x62f, 0x2e, 0x628, 0x2e, 0x200f, 0x46, 0x43, 0x46, 0x41, 0x46, 0x64, 0x6a, 0x4e,
+0x66, 0x6b, 0x62f, 0x2e, 0x639, 0x2e, 0x200f, 0x20aa, 0x62f, 0x2e, 0x623, 0x2e, 0x200f, 0x62f, 0x2e, 0x643, 0x2e, 0x200f, 0x644, 0x2e,
+0x644, 0x2e, 0x200f, 0x62f, 0x2e, 0x644, 0x2e, 0x200f, 0x623, 0x2e, 0x645, 0x2e, 0x62f, 0x2e, 0x645, 0x2e, 0x200f, 0x631, 0x2e, 0x639,
+0x2e, 0x200f, 0x631, 0x2e, 0x642, 0x2e, 0x200f, 0x631, 0x2e, 0x633, 0x2e, 0x200f, 0x53, 0x62c, 0x2e, 0x633, 0x2e, 0x644, 0x2e, 0x633,
+0x2e, 0x200f, 0x62f, 0x2e, 0x62a, 0x2e, 0x200f, 0x62f, 0x2e, 0x625, 0x2e, 0x200f, 0x631, 0x2e, 0x64a, 0x2e, 0x200f, 0xa3, 0x58f, 0x20b9,
+0x20bc, 0x20bd, 0x9f3, 0x4e, 0x75, 0x2e, 0x43b, 0x432, 0x2e, 0x17db, 0xa5, 0x48, 0x4b, 0x24, 0x4d, 0x4f, 0x50, 0x24, 0x48, 0x52,
+0x4b, 0x4b, 0x4d, 0x4b, 0x10d, 0x6b, 0x72, 0x2e, 0x41, 0x66, 0x6c, 0x2e, 0x4e, 0x41, 0x66, 0x2e, 0x55, 0x53, 0x24, 0x46,
+0x42, 0x75, 0x44, 0x47, 0x48, 0x20b5, 0x41, 0x72, 0x52, 0x4d, 0x52, 0x73, 0x20a6, 0x20b1, 0x52, 0x46, 0x57, 0x53, 0x24, 0x53,
+0x52, 0x45, 0x54, 0x53, 0x68, 0x54, 0x24, 0x55, 0x53, 0x68, 0x41, 0x45, 0x44, 0x56, 0x54, 0x44, 0x41, 0x46, 0x43, 0x46,
+0x50, 0x46, 0x47, 0x55, 0x4d, 0x4d, 0x41, 0x44, 0x43, 0x48, 0x46, 0x4c, 0x53, 0x44, 0x54, 0x20be, 0x20b2, 0x46, 0x74, 0x49,
+0x53, 0x4b, 0x52, 0x70, 0x43, 0x41, 0x24, 0xffe5, 0x20b8, 0x441, 0x43e, 0x43c, 0x20a9, 0x4b, 0x50, 0x57, 0x20ba, 0x20ad, 0x4b, 0x7a,
+0x434, 0x435, 0x43d, 0x2e, 0x20ae, 0x43, 0x4e, 0xa5, 0x928, 0x947, 0x930, 0x942, 0x60b, 0x631, 0x6cc, 0x627, 0x644, 0x7a, 0x142, 0x200b,
+0x4d, 0x54, 0x6e, 0x44, 0x62, 0x53, 0x2f, 0x42, 0x73, 0x52, 0x4f, 0x4e, 0x20b4, 0x52, 0x53, 0x44, 0x41a, 0x41c, 0xdbb, 0xdd4,
0x2e, 0x20a1, 0x52, 0x44, 0x24, 0x51, 0x43, 0x24, 0x42, 0x2f, 0x2e, 0x47, 0x73, 0x2e, 0x42, 0x73, 0x2e, 0x53, 0x441, 0x43e,
0x43c, 0x2e, 0x52, 0x73, 0x2e, 0xe3f, 0x54, 0x4d, 0x54, 0x73, 0x6f, 0x2bb, 0x6d, 0x441, 0x45e, 0x43c, 0x20ab, 0x4e, 0x54, 0x24,
-0x41, 0x24, 0x49, 0x52, 0x52
+0x49, 0x52, 0x52
};
-static const ushort currency_display_name_data[] = {
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x20, 0x42, 0x69,
-0x72, 0x72, 0x69, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69,
-0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66,
-0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x75, 0x69,
-0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x4e, 0x61,
-0x6d, 0x69, 0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69,
-0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69,
-0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x4c, 0x65, 0x6b, 0x75, 0x20, 0x73, 0x68,
-0x71, 0x69, 0x70, 0x74, 0x61, 0x72, 0x3b, 0x3b, 0x6c, 0x65, 0x6b, 0x20, 0x73, 0x68, 0x71, 0x69, 0x70, 0x74, 0x61, 0x72,
-0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x6b, 0xeb, 0x20, 0x73, 0x68, 0x71, 0x69, 0x70, 0x74, 0x61, 0x72, 0x3b, 0x44, 0x65,
-0x6e, 0x61, 0x72, 0x69, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x3b, 0x3b, 0x64, 0x65, 0x6e, 0x61,
-0x72, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x65, 0x6e, 0x61, 0x72,
-0xeb, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x6a, 0x61, 0x3b, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x20,
-0x1265, 0x122d, 0x3b, 0x3b, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x3b, 0x3b, 0x3b, 0x3b, 0x12e8, 0x12a2, 0x1275,
-0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a,
+static const char16_t currency_display_name_data[] = {
+0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x20, 0x42, 0x69, 0x72, 0x72, 0x69, 0x69, 0x53, 0x75, 0x69,
+0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x53,
+0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b,
+0x3b, 0x3b, 0x3b, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72,
+0x61, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
+0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b,
+0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x4c, 0x65, 0x6b,
+0x75, 0x20, 0x73, 0x68, 0x71, 0x69, 0x70, 0x74, 0x61, 0x72, 0x3b, 0x3b, 0x6c, 0x65, 0x6b, 0x20, 0x73, 0x68, 0x71, 0x69,
+0x70, 0x74, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x6b, 0xeb, 0x20, 0x73, 0x68, 0x71, 0x69, 0x70, 0x74, 0x61,
+0x72, 0x44, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x3b, 0x3b, 0x64,
+0x65, 0x6e, 0x61, 0x72, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x65,
+0x6e, 0x61, 0x72, 0xeb, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x45, 0x75, 0x72, 0x6f, 0x6a, 0x61,
+0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb,
+0x20, 0x1265, 0x122d, 0x3b, 0x3b, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x3b, 0x3b, 0x3b, 0x3b, 0x12e8, 0x12a2,
+0x1275, 0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a,
0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a,
0x647, 0x627, 0x646, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x627, 0x62a, 0x20, 0x645, 0x635,
0x631, 0x64a, 0x629, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x64b, 0x627, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x64b, 0x627, 0x3b, 0x62c, 0x646,
-0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a,
-0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
-0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x646, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631,
-0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x629, 0x3b,
-0x62f, 0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x64b, 0x627, 0x3b, 0x62f, 0x64a, 0x646,
-0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a,
-0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627,
-0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631,
-0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a,
-0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646,
-0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633,
-0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641,
-0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a,
-0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646,
-0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632,
-0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642,
-0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631,
-0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632,
-0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642,
-0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631,
-0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a,
-0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c,
-0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631,
-0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a,
+0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b,
+0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c,
+0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x646, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a,
+0x627, 0x646, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x629, 0x3b, 0x62f,
+0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x64b, 0x627, 0x3b, 0x62f, 0x64a, 0x646, 0x627,
+0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a,
+0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
+0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b,
+0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628,
+0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x641, 0x631,
+0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648,
+0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623,
+0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642,
+0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631,
+0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648,
+0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644,
+0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641,
+0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c,
+0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644,
+0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641,
+0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a,
+0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646,
+0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a,
+0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a,
+0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x646, 0x627, 0x643, 0x641,
+0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631,
0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627,
0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a,
0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20,
-0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b,
-0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639,
-0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646,
-0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a,
-0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639,
-0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x634, 0x64a, 0x643,
-0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644,
-0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20,
-0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625,
-0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633,
-0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631,
-0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627,
-0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
-0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a,
-0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
-0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a,
-0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
-0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62c, 0x646,
-0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646,
-0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644,
-0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646,
-0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644,
-0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631,
-0x627, 0x646, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x644, 0x64a,
-0x628, 0x64a, 0x629, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x64b, 0x627, 0x3b, 0x62f,
-0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a,
-0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a,
-0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648,
-0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20,
-0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a,
-0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a,
-0x629, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a,
-0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x627,
-0x646, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x631, 0x627, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628,
-0x64a, 0x629, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x64b, 0x627, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x64b, 0x627, 0x3b, 0x62f, 0x631,
-0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b,
-0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646,
-0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645,
-0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20,
-0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644,
-0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644,
-0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644,
-0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644,
-0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a,
-0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b,
-0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f,
-0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645,
-0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635,
+0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a,
+0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642,
+0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
+0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a,
+0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a,
+0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644,
+0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a,
+0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20,
+0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c,
+0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f,
+0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a,
+0x62f, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623,
+0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646,
+0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a,
+0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623,
+0x631, 0x62f, 0x646, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627,
+0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b,
+0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648,
+0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627,
+0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c,
+0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627,
+0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20,
+0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c,
+0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a,
+0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a,
+0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x646, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x64a,
+0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x629, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20,
+0x644, 0x64a, 0x628, 0x64a, 0x64b, 0x627, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x623, 0x648, 0x642,
+0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645,
+0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a,
+0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629,
+0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642,
+0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645,
+0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f,
+0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a,
+0x3b, 0x62f, 0x631, 0x647, 0x645, 0x627, 0x646, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x631, 0x627, 0x647,
+0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x629, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x64b, 0x627, 0x20, 0x645, 0x63a, 0x631, 0x628,
+0x64a, 0x64b, 0x627, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639,
+0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644,
+0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a,
+0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b,
+0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b,
+0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b,
+0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b,
+0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x631,
+0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a,
+0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648,
+0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633,
+0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x634, 0x644, 0x646, 0x20, 0x635,
0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646,
0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634,
-0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646,
-0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633,
-0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646,
-0x64a, 0x647, 0x627, 0x62a, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x64b, 0x627, 0x20,
-0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x64b, 0x627, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a,
-0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631,
+0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a,
+0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627,
+0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20,
+0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c,
+0x646, 0x64a, 0x647, 0x627, 0x62a, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x64b, 0x627,
+0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x64b, 0x627, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646,
+0x64a, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631,
0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633,
0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629,
-0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x62f, 0x64a,
-0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627,
-0x646, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x62a, 0x648,
-0x646, 0x633, 0x64a, 0x629, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x64b, 0x627,
-0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645,
-0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f,
-0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627,
-0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631,
-0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631,
-0x627, 0x62a, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a,
-0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a,
-0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a,
-0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c,
-0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648,
-0x628, 0x20, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20,
-0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x627, 0x646, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20,
-0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x627, 0x62a, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20,
-0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x64b, 0x627, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20,
+0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x62f, 0x64a, 0x646,
+0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a,
+0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x646,
+0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x62a, 0x648, 0x646,
+0x633, 0x64a, 0x629, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x64b, 0x627, 0x3b,
+0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631,
+0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647,
+0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627,
+0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645,
+0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a,
+0x64a, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a,
+0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a,
+0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a,
+0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20,
0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644,
-0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x570, 0x561, 0x575, 0x56f, 0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x3b,
-0x3b, 0x570, 0x561, 0x575, 0x56f, 0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x3b, 0x3b, 0x3b, 0x3b, 0x570, 0x561,
-0x575, 0x56f, 0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x3b, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20,
-0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x3b, 0x3b,
-0x3b, 0x3b, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62,
-0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61,
-0x79, 0x63, 0x61, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62,
-0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x43c, 0x430, 0x43d, 0x430, 0x442, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x3b,
-0x3b, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x3b, 0x3b, 0x3b, 0x3b, 0x9ac,
-0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x3b, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af,
-0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf,
-0x3b, 0x3b, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0x3b, 0xf51, 0xf44, 0xf74,
-0xf63, 0xf0b, 0xf40, 0xfb2, 0xf58, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75,
-0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x61, 0x20, 0x65, 0x75, 0x72, 0x6f, 0x69,
-0x6f, 0xf9, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435,
-0x432, 0x3b, 0x3b, 0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x3b, 0x3b, 0x3b, 0x3b,
-0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x430, 0x3b, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019,
-0x102c, 0x20, 0x1000, 0x103b, 0x1015, 0x103a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c, 0x20, 0x1000,
-0x103b, 0x1015, 0x103a, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c,
-0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c, 0x3b, 0x3b,
-0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x44f, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x456, 0x3b, 0x431, 0x435, 0x43b,
-0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x451, 0x45e, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440,
-0x443, 0x441, 0x43a, 0x430, 0x433, 0x430, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x179a, 0x17c0, 0x179b, 0x200b, 0x1780, 0x1798, 0x17d2,
-0x1796, 0x17bb, 0x1787, 0x17b6, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x179a, 0x17c0, 0x179b, 0x200b, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787,
-0x17b6, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f,
-0x73, 0x3b, 0x4eba, 0x6c11, 0x5e01, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4eba, 0x6c11, 0x5e01, 0x3b, 0x6e2f, 0x5143, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x6e2f, 0x5143, 0x3b, 0x6fb3, 0x95e8, 0x5e01, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6fb3, 0x95e8, 0x5143, 0x3b, 0x65b0,
-0x52a0, 0x5761, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x3b, 0x6fb3, 0x9580, 0x5143, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x6fb3, 0x9580, 0x5143, 0x3b, 0x65b0, 0x53f0, 0x5e63, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65b0, 0x53f0, 0x5e63, 0x3b,
-0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x68, 0x72, 0x76, 0x61, 0x74,
-0x73, 0x6b, 0x61, 0x20, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x65, 0x20, 0x6b,
-0x75, 0x6e, 0x65, 0x3b, 0x3b, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x75, 0x6e, 0x61, 0x3b,
-0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b,
-0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61,
-0x3b, 0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b,
-0x65, 0x3b, 0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61,
-0x72, 0x61, 0x6b, 0x61, 0x3b, 0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x10d,
-0x65, 0x73, 0x6b, 0xe1, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x10d, 0x65, 0x73, 0x6b, 0xe9, 0x20, 0x6b,
-0x6f, 0x72, 0x75, 0x6e, 0x79, 0x3b, 0x10d, 0x65, 0x73, 0x6b, 0xe9, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x79, 0x3b, 0x10d,
-0x65, 0x73, 0x6b, 0xfd, 0x63, 0x68, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b,
+0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648,
+0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x627, 0x646, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648,
+0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x627, 0x62a, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648,
+0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x64b, 0x627, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648,
+0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627,
+0x646, 0x570, 0x561, 0x575, 0x56f, 0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x3b, 0x3b, 0x570, 0x561, 0x575, 0x56f,
+0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x3b, 0x3b, 0x3b, 0x3b, 0x570, 0x561, 0x575, 0x56f, 0x561, 0x56f, 0x561,
+0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x3b, 0x3b,
+0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x3b, 0x3b, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9f0, 0x9a4,
+0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x4d,
+0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x6d, 0x61,
+0x6e, 0x61, 0x74, 0x131, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x6d,
+0x61, 0x6e, 0x61, 0x74, 0x131, 0x43c, 0x430, 0x43d, 0x430, 0x442, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x3b, 0x3b, 0x65, 0x75, 0x72,
+0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f,
+0x9be, 0x995, 0x9be, 0x3b, 0x3b, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x3b,
+0x3b, 0x3b, 0x3b, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x9ad, 0x9be, 0x9b0,
+0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0,
+0x9c1, 0x9aa, 0x9bf, 0x3b, 0x3b, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0xf51,
+0xf44, 0xf74, 0xf63, 0xf0b, 0xf40, 0xfb2, 0xf58, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75,
+0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x61, 0x20, 0x65, 0x75, 0x72, 0x6f, 0x69, 0x6f, 0xf9, 0x3b, 0x65, 0x75,
+0x72, 0x6f, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x3b, 0x3b, 0x431, 0x44a, 0x43b,
+0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x3b, 0x3b, 0x3b, 0x3b, 0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440,
+0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x430, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c, 0x20, 0x1000, 0x103b, 0x1015, 0x103a, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c, 0x20, 0x1000, 0x103b, 0x1015, 0x103a, 0x431, 0x435, 0x43b, 0x430,
+0x440, 0x443, 0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443,
+0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a,
+0x456, 0x44f, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x456, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x445, 0x20,
+0x440, 0x443, 0x431, 0x43b, 0x451, 0x45e, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x430, 0x433, 0x430, 0x20, 0x440,
+0x443, 0x431, 0x43b, 0x44f, 0x179a, 0x17c0, 0x179b, 0x200b, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787, 0x17b6, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x179a, 0x17c0, 0x179b, 0x200b, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787, 0x17b6, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75,
+0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x73, 0x4eba, 0x6c11, 0x5e01, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x4eba, 0x6c11, 0x5e01, 0x6e2f, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e2f, 0x5143, 0x6fb3, 0x95e8, 0x5e01, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x6fb3, 0x95e8, 0x5143, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x6fb3,
+0x9580, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6fb3, 0x9580, 0x5143, 0x65b0, 0x53f0, 0x5e63, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x65b0, 0x53f0, 0x5e63, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x68, 0x72,
+0x76, 0x61, 0x74, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b,
+0x65, 0x20, 0x6b, 0x75, 0x6e, 0x65, 0x3b, 0x3b, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x75,
+0x6e, 0x61, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b,
+0x61, 0x3b, 0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72,
+0x6b, 0x61, 0x3b, 0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61,
+0x72, 0x6b, 0x65, 0x3b, 0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20,
+0x6d, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x61, 0x3b, 0x3b,
+0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x10d, 0x65, 0x73, 0x6b, 0xe9, 0x20,
+0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x79, 0x3b, 0x10d, 0x65, 0x73, 0x6b, 0xe9, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x79, 0x3b,
+0x10d, 0x65, 0x73, 0x6b, 0xfd, 0x63, 0x68, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b,
0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b,
-0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b,
-0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61,
-0x6e, 0x73, 0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73,
-0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73,
-0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d,
-0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b,
-0x3b, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61,
-0x61, 0x6e, 0x73, 0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x64, 0x65, 0x72,
-0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x67,
-0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c,
-0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c,
-0x6c, 0x61, 0x72, 0x3b, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x55, 0x53, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b,
-0x45, 0x61, 0x73, 0x74, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x3b, 0x3b, 0x45, 0x61, 0x73, 0x74, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x61, 0x73, 0x74, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65,
-0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
-0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e,
-0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
-0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f,
-0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x73, 0x3b, 0x42, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x44,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x73, 0x3b, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
-0x3b, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b,
-0x3b, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x42,
-0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65,
-0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x3b, 0x3b, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
-0x3b, 0x3b, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x42,
-0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x50, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x42, 0x6f, 0x74, 0x73, 0x77,
-0x61, 0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e,
-0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x73, 0x3b, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x46,
-0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x66, 0x72, 0x61, 0x6e,
-0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x73, 0x3b, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46,
-0x41, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72,
-0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x65,
-0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x73, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b,
-0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x43, 0x61,
-0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
-0x3b, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73,
-0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64,
-0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64,
-0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61,
-0x6e, 0x64, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x4b, 0x72,
+0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b,
+0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73,
+0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20,
+0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20,
+0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d, 0x41, 0x6e, 0x74,
+0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x4e, 0x65,
+0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73,
+0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e,
+0x64, 0x73, 0x2d, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x67, 0x75, 0x6c, 0x64,
+0x65, 0x6e, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
+0x3b, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
+0x3b, 0x3b, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b,
+0x3b, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x55,
+0x53, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
+0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x45, 0x61, 0x73, 0x74, 0x20, 0x43, 0x61,
+0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x45, 0x61, 0x73, 0x74,
+0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b,
+0x3b, 0x45, 0x61, 0x73, 0x74, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
+0x61, 0x72, 0x73, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
+0x3b, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x73, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x73,
+0x42, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x61, 0x68,
+0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x61, 0x68, 0x61,
+0x6d, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61,
+0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20,
+0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20,
+0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42,
+0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61,
+0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x64,
+0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x64, 0x6f,
+0x6c, 0x6c, 0x61, 0x72, 0x73, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x50, 0x75, 0x6c, 0x61, 0x3b,
+0x3b, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x42,
+0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x73, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64,
+0x69, 0x61, 0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e,
+0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20,
+0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
+0x6e, 0x20, 0x43, 0x46, 0x41, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c,
+0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b,
+0x3b, 0x3b, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46,
+0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c,
+0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73,
+0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x3b, 0x3b, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x6f,
+0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e,
+0x64, 0x73, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e,
+0x64, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e,
+0x64, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c,
+0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x4b, 0x72,
0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b,
-0x3b, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0x45, 0x72, 0x69, 0x74, 0x72,
-0x65, 0x61, 0x6e, 0x20, 0x4e, 0x61, 0x6b, 0x66, 0x61, 0x3b, 0x3b, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x6e, 0x20,
-0x6e, 0x61, 0x6b, 0x66, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x6e, 0x61,
-0x6b, 0x66, 0x61, 0x73, 0x3b, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64,
-0x73, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73,
-0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x6c, 0x6b, 0x6c,
-0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b, 0x46,
-0x69, 0x6a, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x46, 0x69, 0x6a, 0x69, 0x61, 0x6e,
-0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x69, 0x6a, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x55, 0x4b, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x55, 0x4b, 0x20, 0x70,
-0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x4b, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b, 0x47, 0x61,
-0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x3b, 0x3b, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61,
-0x6e, 0x20, 0x64, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20,
-0x64, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x73, 0x3b, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x69, 0x61, 0x6e, 0x20, 0x43, 0x65, 0x64,
-0x69, 0x3b, 0x3b, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x69, 0x61, 0x6e, 0x20, 0x63, 0x65, 0x64, 0x69, 0x3b, 0x3b, 0x3b, 0x3b,
-0x47, 0x68, 0x61, 0x6e, 0x61, 0x69, 0x61, 0x6e, 0x20, 0x63, 0x65, 0x64, 0x69, 0x73, 0x3b, 0x47, 0x69, 0x62, 0x72, 0x61,
-0x6c, 0x74, 0x61, 0x72, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61,
-0x72, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72,
-0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x44, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x73, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
-0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b,
-0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e,
-0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70,
-0x65, 0x65, 0x73, 0x3b, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x69, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x53, 0x68, 0x65, 0x6b,
-0x65, 0x6c, 0x3b, 0x3b, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x69, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x68, 0x65, 0x6b,
-0x65, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x69, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x68,
-0x65, 0x6b, 0x65, 0x6c, 0x73, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x3b, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
-0x3b, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x4b,
-0x65, 0x6e, 0x79, 0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x4b, 0x65, 0x6e, 0x79,
-0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x4b, 0x65, 0x6e, 0x79, 0x61,
-0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20,
-0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61,
-0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x64,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x61, 0x74, 0x61, 0x63,
-0x61, 0x3b, 0x3b, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x61, 0x74, 0x61, 0x63, 0x61, 0x3b, 0x3b,
-0x3b, 0x3b, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x61, 0x74, 0x61, 0x63, 0x61, 0x73, 0x3b, 0x4d,
-0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x20, 0x41, 0x72, 0x69, 0x61, 0x72, 0x79, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61,
-0x67, 0x61, 0x73, 0x79, 0x20, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x67,
-0x61, 0x73, 0x79, 0x20, 0x61, 0x72, 0x69, 0x61, 0x72, 0x69, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61,
-0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e, 0x20, 0x6b,
-0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e, 0x20, 0x6b, 0x77,
-0x61, 0x63, 0x68, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x69, 0x6e, 0x67,
-0x67, 0x69, 0x74, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x6e, 0x67, 0x67,
-0x69, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x6e, 0x67,
-0x67, 0x69, 0x74, 0x73, 0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65,
+0x3b, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65,
+0x61, 0x6e, 0x20, 0x4e, 0x61, 0x6b, 0x66, 0x61, 0x3b, 0x3b, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x6e,
+0x61, 0x6b, 0x66, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x6e, 0x61, 0x6b,
+0x66, 0x61, 0x73, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20,
+0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61,
+0x6e, 0x64, 0x73, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e,
+0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x46, 0x69, 0x6a, 0x69,
+0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x46, 0x69, 0x6a, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f,
+0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x69, 0x6a, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x73, 0x55, 0x4b, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x55, 0x4b, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64,
+0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x4b, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e,
+0x20, 0x44, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x3b, 0x3b, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x61, 0x6c,
+0x61, 0x73, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x61, 0x6c, 0x61, 0x73,
+0x69, 0x73, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x69, 0x61, 0x6e, 0x20, 0x43, 0x65, 0x64, 0x69, 0x3b, 0x3b, 0x47, 0x68, 0x61,
+0x6e, 0x61, 0x69, 0x61, 0x6e, 0x20, 0x63, 0x65, 0x64, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x69,
+0x61, 0x6e, 0x20, 0x63, 0x65, 0x64, 0x69, 0x73, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x20, 0x50, 0x6f,
+0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64,
+0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73,
+0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x47, 0x75,
+0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x75,
+0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x48, 0x6f, 0x6e, 0x67, 0x20,
+0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f,
+0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f,
+0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70,
+0x65, 0x65, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b,
+0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x69,
+0x20, 0x4e, 0x65, 0x77, 0x20, 0x53, 0x68, 0x65, 0x6b, 0x65, 0x6c, 0x3b, 0x3b, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x69,
+0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x68, 0x65, 0x6b, 0x65, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x73, 0x72, 0x61, 0x65,
+0x6c, 0x69, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x68, 0x65, 0x6b, 0x65, 0x6c, 0x73, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63,
+0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20,
+0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64,
+0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e,
+0x67, 0x3b, 0x3b, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b,
+0x3b, 0x3b, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x53, 0x6f,
+0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x6f,
+0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b,
+0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x4c, 0x69,
+0x62, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4c, 0x69, 0x62, 0x65, 0x72,
+0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69,
+0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50,
+0x61, 0x74, 0x61, 0x63, 0x61, 0x3b, 0x3b, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x61, 0x74, 0x61,
+0x63, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x61, 0x74, 0x61, 0x63,
+0x61, 0x73, 0x4d, 0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x20, 0x41, 0x72, 0x69, 0x61, 0x72, 0x79, 0x3b, 0x3b, 0x4d,
+0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x20, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61,
+0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x20, 0x61, 0x72, 0x69, 0x61, 0x72, 0x69, 0x65, 0x73, 0x4d, 0x61, 0x6c, 0x61, 0x77,
+0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e,
+0x20, 0x6b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e, 0x20,
+0x6b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x73, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x69, 0x6e,
+0x67, 0x67, 0x69, 0x74, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x6e, 0x67,
+0x67, 0x69, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x6e,
+0x67, 0x67, 0x69, 0x74, 0x73, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65,
0x3b, 0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b,
-0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x4e, 0x61,
-0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62,
-0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69,
-0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20,
-0x4e, 0x61, 0x69, 0x72, 0x61, 0x3b, 0x3b, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x61, 0x69, 0x72,
-0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x61, 0x69, 0x72, 0x61, 0x73,
-0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x50, 0x61,
-0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x6b,
-0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20,
-0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x4b, 0x69, 0x6e, 0x61, 0x3b, 0x3b, 0x50, 0x61,
-0x70, 0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6b, 0x69, 0x6e, 0x61,
-0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61,
-0x6e, 0x20, 0x6b, 0x69, 0x6e, 0x61, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x69,
-0x73, 0x6f, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x3b,
-0x3b, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x73, 0x3b,
-0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x52, 0x77, 0x61, 0x6e, 0x64,
-0x61, 0x6e, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20,
-0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x3b, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20, 0x54, 0x61, 0x6c, 0x61, 0x3b, 0x3b,
-0x53, 0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20, 0x74, 0x61, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x61, 0x6d, 0x6f, 0x61,
-0x6e, 0x20, 0x74, 0x61, 0x6c, 0x61, 0x3b, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x52,
-0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x72, 0x75,
-0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x72,
-0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x61, 0x6e,
-0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65,
-0x61, 0x6e, 0x20, 0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c,
-0x65, 0x6f, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70,
-0x6f, 0x72, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72,
-0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72,
-0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73,
-0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f,
-0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b,
-0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x73, 0x3b, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b,
-0x3b, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b,
-0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b, 0x53, 0x75, 0x64,
-0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73,
-0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20,
-0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x4c, 0x69, 0x6c, 0x61, 0x6e, 0x67, 0x65,
-0x6e, 0x69, 0x3b, 0x3b, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x6c, 0x69, 0x6c, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x69, 0x3b,
-0x3b, 0x3b, 0x3b, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x69, 0x3b,
-0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x20, 0x4b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x53, 0x77, 0x65, 0x64, 0x69,
-0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x20,
-0x6b, 0x72, 0x6f, 0x6e, 0x6f, 0x72, 0x3b, 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b,
-0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x77, 0x69, 0x73, 0x73,
-0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x3b, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x68,
-0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x6e, 0x20, 0x73, 0x68,
-0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x6e, 0x20,
-0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x3b, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20, 0x50, 0x61, 0x2bb,
-0x61, 0x6e, 0x67, 0x61, 0x3b, 0x3b, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20, 0x70, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61,
-0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20, 0x70, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x54,
-0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x44, 0x6f, 0x6c,
-0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61,
-0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61,
-0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x55,
+0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x4e, 0x61, 0x6d,
+0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69,
+0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61,
+0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x4e, 0x61,
+0x69, 0x72, 0x61, 0x3b, 0x3b, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x61, 0x69, 0x72, 0x61, 0x3b,
+0x3b, 0x3b, 0x3b, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x61, 0x69, 0x72, 0x61, 0x73, 0x50, 0x61,
+0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73,
+0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74,
+0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20,
+0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x4b, 0x69, 0x6e, 0x61, 0x3b, 0x3b, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20,
+0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6b, 0x69, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b,
+0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6b, 0x69,
+0x6e, 0x61, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x69, 0x73, 0x6f, 0x3b, 0x3b, 0x50,
+0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x68,
+0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x73, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61,
+0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x66, 0x72, 0x61,
+0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73,
+0x53, 0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20, 0x54, 0x61, 0x6c, 0x61, 0x3b, 0x3b, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20,
+0x74, 0x61, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20, 0x74, 0x61, 0x6c, 0x61, 0x53,
+0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x53, 0x65,
+0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x53,
+0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x53, 0x69, 0x65,
+0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x53,
+0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x3b,
+0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6c, 0x65,
+0x6f, 0x6e, 0x65, 0x73, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
+0x3b, 0x3b, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
+0x3b, 0x3b, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x53,
+0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
+0x72, 0x3b, 0x3b, 0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x64,
+0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e,
+0x61, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x70,
+0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x70, 0x6f,
+0x75, 0x6e, 0x64, 0x73, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b,
+0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x75,
+0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x4c,
+0x69, 0x6c, 0x61, 0x6e, 0x67, 0x65, 0x6e, 0x69, 0x3b, 0x3b, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x6c, 0x69, 0x6c, 0x61,
+0x6e, 0x67, 0x65, 0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x65, 0x6d, 0x61, 0x6c, 0x61,
+0x6e, 0x67, 0x65, 0x6e, 0x69, 0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x20, 0x4b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b,
+0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x77, 0x65,
+0x64, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x6f, 0x72, 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x46, 0x72, 0x61,
+0x6e, 0x63, 0x3b, 0x3b, 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x53,
+0x77, 0x69, 0x73, 0x73, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x6e,
+0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x6e,
+0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69,
+0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20, 0x50,
+0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x3b, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20, 0x70, 0x61, 0x2bb, 0x61, 0x6e,
+0x67, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20, 0x70, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61,
+0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x44, 0x6f,
+0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62,
+0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64,
+0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x55,
0x67, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x55, 0x67, 0x61,
0x6e, 0x64, 0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x67, 0x61,
-0x6e, 0x64, 0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x3b, 0x55, 0x6e, 0x69, 0x74, 0x65,
-0x64, 0x20, 0x41, 0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x44, 0x69, 0x72, 0x68,
-0x61, 0x6d, 0x3b, 0x3b, 0x55, 0x41, 0x45, 0x20, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x41,
-0x45, 0x20, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x73, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x50, 0x6f,
-0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b,
-0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b, 0x56, 0x61, 0x6e,
-0x75, 0x61, 0x74, 0x75, 0x20, 0x56, 0x61, 0x74, 0x75, 0x3b, 0x3b, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x20, 0x76,
-0x61, 0x74, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x74, 0x75, 0x73,
-0x3b, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x5a, 0x61, 0x6d,
-0x62, 0x69, 0x61, 0x6e, 0x20, 0x6b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x5a, 0x61, 0x6d, 0x62, 0x69,
-0x61, 0x6e, 0x20, 0x6b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x73, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64,
-0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53,
-0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f, 0x75,
-0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b, 0x4e,
-0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x6e,
-0x20, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x3b, 0x3b, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64,
-0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x3b,
-0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c,
-0x6c, 0x65, 0x61, 0x6e, 0x20, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x74, 0x3b, 0x64, 0x6f, 0x6e, 0x73, 0x6b, 0x20,
-0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x64, 0x6f, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b,
-0x3b, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x61, 0x72, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72, 0x3b, 0x65, 0x75, 0x72,
-0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x3b, 0x64, 0x69, 0x6e,
-0x61, 0x72, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x61,
-0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x73, 0x20, 0x61, 0x6c,
-0x67, 0xe9, 0x72, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42,
-0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43,
-0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28,
-0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x61,
-0x69, 0x73, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b,
-0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b,
-0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20,
-0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x20,
-0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6d, 0x6f,
-0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6d, 0x6f, 0x72, 0x69, 0x65, 0x6e,
-0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x73,
-0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20,
-0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x64, 0x6a,
-0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x64,
-0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x50,
-0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x50, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x73, 0x20, 0x43, 0x46, 0x50, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x3b,
-0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x73, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x73, 0x3b, 0x67, 0x6f, 0x75, 0x72, 0x64, 0x65,
+0x6e, 0x64, 0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64,
+0x20, 0x41, 0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x44, 0x69, 0x72, 0x68, 0x61,
+0x6d, 0x3b, 0x3b, 0x55, 0x41, 0x45, 0x20, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x41, 0x45,
+0x20, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x73, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x50, 0x6f, 0x75, 0x6e,
+0x64, 0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b,
+0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74,
+0x75, 0x20, 0x56, 0x61, 0x74, 0x75, 0x3b, 0x3b, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x74, 0x75,
+0x3b, 0x3b, 0x3b, 0x3b, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x74, 0x75, 0x73, 0x5a, 0x61, 0x6d,
+0x62, 0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e,
+0x20, 0x6b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x6b,
+0x77, 0x61, 0x63, 0x68, 0x61, 0x73, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65,
+0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65,
+0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75,
+0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x47, 0x75, 0x69, 0x6c, 0x64,
+0x65, 0x72, 0x3b, 0x3b, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69,
+0x6c, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x74,
+0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x67,
+0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b,
+0x3b, 0x65, 0x75, 0x72, 0x6f, 0x74, 0x64, 0x6f, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x64,
+0x6f, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x61,
+0x72, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b,
+0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65,
+0x6e, 0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b,
+0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x73, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x6e, 0x73, 0x66, 0x72, 0x61,
+0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e,
+0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61,
+0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x66, 0x72, 0x61, 0x6e, 0x63,
+0x20, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x62, 0x75,
+0x72, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x62, 0x75,
+0x72, 0x75, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45,
+0x41, 0x43, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43,
+0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41,
+0x43, 0x29, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x64,
+0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f,
+0x6c, 0x6c, 0x61, 0x72, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63,
+0x20, 0x63, 0x6f, 0x6d, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6d,
+0x6f, 0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6f,
+0x72, 0x69, 0x65, 0x6e, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73,
+0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x3b,
+0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x66, 0x72, 0x61,
+0x6e, 0x63, 0x20, 0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63,
+0x20, 0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63,
+0x73, 0x20, 0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43,
+0x46, 0x50, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x50, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61,
+0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x50, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e,
+0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x66,
+0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x73, 0x67, 0x6f, 0x75, 0x72, 0x64, 0x65,
0x20, 0x68, 0x61, 0xef, 0x74, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x67, 0x6f, 0x75, 0x72, 0x64, 0x65, 0x20, 0x68,
0x61, 0xef, 0x74, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x6f, 0x75, 0x72, 0x64, 0x65, 0x73, 0x20,
-0x68, 0x61, 0xef, 0x74, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x20, 0x6d, 0x61,
-0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61,
-0x63, 0x68, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x73, 0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61,
-0x63, 0x68, 0x65, 0x73, 0x3b, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61,
-0x6e, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x74,
-0x61, 0x6e, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x73, 0x20, 0x6d, 0x61,
-0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x6d, 0x61,
-0x75, 0x72, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x6d, 0x61,
-0x75, 0x72, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x73,
-0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d,
-0x20, 0x6d, 0x61, 0x72, 0x6f, 0x63, 0x61, 0x69, 0x6e, 0x3b, 0x3b, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x20, 0x6d, 0x61,
-0x72, 0x6f, 0x63, 0x61, 0x69, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x73, 0x20, 0x6d, 0x61,
-0x72, 0x6f, 0x63, 0x61, 0x69, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61,
-0x69, 0x73, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x3b,
-0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x72, 0x6f,
-0x75, 0x70, 0x69, 0x65, 0x20, 0x64, 0x65, 0x73, 0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x3b,
-0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x64, 0x65, 0x73, 0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c,
-0x65, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x73, 0x20, 0x64, 0x65, 0x73, 0x20, 0x53, 0x65,
-0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73,
-0x65, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x66,
-0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x73, 0x3b, 0x6c, 0x69, 0x76, 0x72, 0x65, 0x20,
-0x73, 0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x6c, 0x69, 0x76, 0x72, 0x65, 0x20, 0x73, 0x79, 0x72, 0x69,
-0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x69, 0x76, 0x72, 0x65, 0x73, 0x20, 0x73, 0x79, 0x72, 0x69, 0x65,
-0x6e, 0x6e, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b,
-0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64,
-0x69, 0x6e, 0x61, 0x72, 0x73, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x76, 0x61, 0x74, 0x75,
-0x20, 0x76, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x61, 0x6e, 0x3b, 0x3b, 0x76, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x6e,
-0x75, 0x61, 0x74, 0x75, 0x61, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x76, 0x61, 0x74, 0x75, 0x73, 0x20, 0x76, 0x61, 0x6e, 0x75,
-0x61, 0x74, 0x75, 0x61, 0x6e, 0x73, 0x3b, 0x50, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61,
-0x63, 0x68, 0x3b, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68,
-0x3b, 0x70, 0x68, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x70, 0x75,
-0x69, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x68, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x3b, 0x70, 0x75, 0x6e,
-0x6e, 0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8,
-0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b,
-0x3b, 0x3b, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x45, 0x75, 0x72, 0x6f,
-0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x53, 0x63, 0x68, 0x77, 0x65,
-0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x3b, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69,
-0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63, 0x68, 0x77, 0x65,
-0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x395, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x3b, 0x3b5,
-0x3c5, 0x3c1, 0x3ce, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x64, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x69,
-0x6d, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x69, 0x6e,
-0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x61, 0x6e, 0x6d, 0x61, 0x72,
-0x6b, 0x69, 0x6d, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf,
-0x20, 0xab0, 0xac2, 0xaaa, 0xabf, 0xaaf, 0xabe, 0x3b, 0x3b, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf, 0x20, 0xab0, 0xac2, 0xaaa, 0xabf,
-0xaaf, 0xabe, 0x3b, 0x3b, 0x3b, 0x3b, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf, 0x20, 0xab0, 0xac2, 0xaaa, 0xabf, 0xaaf, 0xabe, 0x3b,
-0x4e, 0x61, 0x69, 0x72, 0x61, 0x72, 0x20, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x4e, 0x61, 0x69,
-0x72, 0x61, 0x72, 0x20, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x69, 0x72,
-0x6f, 0x72, 0x69, 0x6e, 0x20, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x3b, 0x4b, 0x75, 0x257, 0x69, 0x6e, 0x20,
-0x53, 0x65, 0x66, 0x61, 0x20, 0x6e, 0x61, 0x20, 0x41, 0x66, 0x69, 0x72, 0x6b, 0x61, 0x20, 0x54, 0x61, 0x20, 0x59, 0x61,
-0x6d, 0x6d, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x3b, 0x3b, 0x5e9,
-0x5e7, 0x5dc, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b, 0x3b,
-0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20, 0x5d7, 0x5d3,
-0x5e9, 0x5d9, 0x5dd, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x92d, 0x93e,
-0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f,
-0x20, 0x930, 0x941, 0x92a, 0x90f, 0x3b, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b,
-0x3b, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x6d, 0x61,
-0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20,
-0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61,
-0x3b, 0x3b, 0x3b, 0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x72, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72,
-0x3b, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x3b,
-0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f,
-0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x50, 0x75, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x65, 0x69,
-0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69,
-0x6e, 0x67, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x70,
-0x68, 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x62, 0x70, 0x75, 0x6e, 0x74,
-0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x70, 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65, 0x69,
-0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x6f,
-0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x3b, 0x3b,
-0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x69, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x69, 0x3b, 0x65e5, 0x672c,
-0x5186, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5186, 0x3b, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa, 0xcbe,
-0xcaf, 0xcbf, 0x3b, 0x3b, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa, 0xcbe, 0xcaf, 0xcbf, 0x3b, 0x3b, 0x3b,
-0x3b, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa, 0xcbe, 0xcaf, 0xcbf, 0xc97, 0xcb3, 0xcc1, 0x3b, 0x6c1, 0x650,
-0x646, 0x62f, 0x64f, 0x633, 0x62a, 0x672, 0x646, 0x6cd, 0x20, 0x631, 0x6c4, 0x67e, 0x64e, 0x6d2, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435, 0x441, 0x456, 0x3b, 0x3b,
-0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435, 0x441, 0x456, 0x3b, 0x3b, 0x3b,
-0x3b, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435, 0x441, 0x456, 0x3b, 0x41a,
-0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0x3b, 0x3b, 0x41a, 0x44b, 0x440, 0x433,
-0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0x3b, 0x3b, 0x3b, 0x3b, 0x41a, 0x44b, 0x440, 0x433, 0x44b,
-0x437, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0x3b, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0x3b, 0xc870, 0xc120, 0x20, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0x20, 0xc778, 0xbbfc,
-0x20, 0xacf5, 0xd654, 0xad6d, 0x20, 0xc6d0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xc870, 0xc120, 0x20, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0x20,
-0xc778, 0xbbfc, 0x20, 0xacf5, 0xd654, 0xad6d, 0x20, 0xc6d0, 0x3b, 0x49, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x72, 0x79,
-0x2019, 0x55, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xea5, 0xeb2, 0xea7, 0x20,
-0xe81, 0xeb5, 0xe9a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xea5, 0xeb2, 0xea7, 0x20, 0xe81, 0xeb5, 0xe9a, 0x3b, 0x65, 0x69, 0x72,
-0x6f, 0x3b, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x69, 0x72, 0x6f, 0x3b,
-0x46, 0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0xf3, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x4b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20, 0x79, 0x61, 0x20, 0x41, 0x6e, 0x67, 0xf3, 0x6c, 0x61, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45,
-0x41, 0x43, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x61, 0x73, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x61,
-0x73, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x61, 0x69, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x173, 0x3b, 0x41c,
-0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x41c, 0x430, 0x43a,
-0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x3b, 0x3b, 0x41c, 0x430, 0x43a,
-0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x438, 0x3b, 0x41, 0x72, 0x69, 0x61, 0x72,
-0x79, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x69, 0x6e, 0x67, 0x67, 0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61,
-0x79, 0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x69, 0x6e, 0x67, 0x67, 0x69, 0x74, 0x20, 0x4d, 0x61,
-0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x3b, 0x44, 0x6f,
-0x6c, 0x61, 0x72, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44,
-0x6f, 0x6c, 0x61, 0x72, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72, 0x61, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d,
-0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b,
-0x3b, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b,
-0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b, 0x65, 0x77, 0x72,
-0x6f, 0x3b, 0x54, 0x101, 0x72, 0x61, 0x20, 0x6f, 0x20, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x74, 0x101, 0x72, 0x61, 0x20, 0x6f, 0x20, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61, 0x3b, 0x92d,
-0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20,
-0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f,
-0x947, 0x3b, 0x41c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x20, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x3b, 0x3b, 0x41c, 0x43e, 0x43d,
-0x433, 0x43e, 0x43b, 0x20, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x3b, 0x3b, 0x3b, 0x3b, 0x41c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b,
-0x20, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x3b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948, 0x92f,
-0x93e, 0x901, 0x3b, 0x3b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948, 0x92f, 0x93e, 0x901, 0x3b, 0x3b,
-0x3b, 0x3b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948, 0x92f, 0x93e, 0x901, 0x3b, 0x92d, 0x93e, 0x930,
+0x68, 0x61, 0xef, 0x74, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x20, 0x6d, 0x61, 0x6c,
+0x67, 0x61, 0x63, 0x68, 0x65, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63,
+0x68, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x73, 0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63,
+0x68, 0x65, 0x73, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69,
+0x65, 0x6e, 0x3b, 0x3b, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e,
+0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x75, 0x72,
+0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x6e, 0x73, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69,
+0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69,
+0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6d, 0x61,
+0x75, 0x72, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x20, 0x6d, 0x61, 0x72,
+0x6f, 0x63, 0x61, 0x69, 0x6e, 0x3b, 0x3b, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x20, 0x6d, 0x61, 0x72, 0x6f, 0x63, 0x61,
+0x69, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x73, 0x20, 0x6d, 0x61, 0x72, 0x6f, 0x63, 0x61,
+0x69, 0x6e, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x66,
+0x72, 0x61, 0x6e, 0x63, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61,
+0x6e, 0x63, 0x73, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x69, 0x73, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x64,
+0x65, 0x73, 0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69,
+0x65, 0x20, 0x64, 0x65, 0x73, 0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x3b, 0x3b, 0x3b, 0x3b,
+0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x73, 0x20, 0x64, 0x65, 0x73, 0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c,
+0x65, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e,
+0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x73,
+0x75, 0x69, 0x73, 0x73, 0x65, 0x73, 0x6c, 0x69, 0x76, 0x72, 0x65, 0x20, 0x73, 0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e, 0x65,
+0x3b, 0x3b, 0x6c, 0x69, 0x76, 0x72, 0x65, 0x20, 0x73, 0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b,
+0x6c, 0x69, 0x76, 0x72, 0x65, 0x73, 0x20, 0x73, 0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x64, 0x69, 0x6e, 0x61,
+0x72, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x74, 0x75,
+0x6e, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x73, 0x20, 0x74, 0x75, 0x6e,
+0x69, 0x73, 0x69, 0x65, 0x6e, 0x73, 0x76, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x61, 0x6e,
+0x3b, 0x3b, 0x76, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x61, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b,
+0x76, 0x61, 0x74, 0x75, 0x73, 0x20, 0x76, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x61, 0x6e, 0x73, 0x50, 0x75, 0x6e, 0x6e,
+0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x6e, 0x64, 0x20,
+0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73,
+0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x70, 0x75, 0x69, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x68, 0x61, 0x73, 0x61, 0x6e,
+0x6e, 0x61, 0x63, 0x68, 0x3b, 0x3b, 0x70, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63,
+0x68, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3,
+0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x3b, 0x3b, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x20, 0x10da,
+0x10d0, 0x10e0, 0x10d8, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72,
+0x6f, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x3b,
+0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x3b, 0x3b,
+0x3b, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x395, 0x3c5,
+0x3c1, 0x3ce, 0x3b, 0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x64, 0x61, 0x6e, 0x6d,
+0x61, 0x72, 0x6b, 0x69, 0x6d, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x3b, 0x64, 0x61, 0x6e,
+0x73, 0x6b, 0x69, 0x6e, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x61,
+0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x6d, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0xaad, 0xabe, 0xab0,
+0xaa4, 0xac0, 0xaaf, 0x20, 0xab0, 0xac2, 0xaaa, 0xabf, 0xaaf, 0xabe, 0x3b, 0x3b, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf, 0x20, 0xab0,
+0xac2, 0xaaa, 0xabf, 0xaaf, 0xabe, 0x3b, 0x3b, 0x3b, 0x3b, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf, 0x20, 0xab0, 0xac2, 0xaaa, 0xabf,
+0xaaf, 0xabe, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x72, 0x20, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x4e,
+0x61, 0x69, 0x72, 0x61, 0x72, 0x20, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61,
+0x69, 0x72, 0x6f, 0x72, 0x69, 0x6e, 0x20, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x4b, 0x75, 0x257, 0x69, 0x6e,
+0x20, 0x53, 0x65, 0x66, 0x61, 0x20, 0x6e, 0x61, 0x20, 0x41, 0x66, 0x69, 0x72, 0x6b, 0x61, 0x20, 0x54, 0x61, 0x20, 0x59,
+0x61, 0x6d, 0x6d, 0x61, 0x5e9, 0x5e7, 0x5dc, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x3b, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x20, 0x5d7, 0x5d3, 0x5e9,
+0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20,
+0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x92d, 0x93e, 0x930,
+0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941,
+0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x90f, 0x6d, 0x61,
+0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b, 0x3b, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20,
+0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72,
+0x69, 0x6e, 0x74, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0xed, 0x73,
+0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e,
+0x73, 0x6b, 0x61, 0x72, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x20, 0x49, 0x6e,
+0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x20,
+0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b,
+0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x50,
+0x75, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x74,
+0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65,
+0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69,
+0x6e, 0x67, 0x3b, 0x62, 0x70, 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x70,
+0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x65, 0x69, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20,
+0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x76, 0x69,
+0x7a, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x69, 0x20, 0x73, 0x76, 0x69,
+0x7a, 0x7a, 0x65, 0x72, 0x69, 0x65e5, 0x672c, 0x5186, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5186, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0,
+0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa, 0xcbe, 0xcaf, 0xcbf, 0x3b, 0x3b, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa,
+0xcbe, 0xcaf, 0xcbf, 0x3b, 0x3b, 0x3b, 0x3b, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa, 0xcbe, 0xcaf, 0xcbf,
+0xc97, 0xcb3, 0xcc1, 0x6c1, 0x650, 0x646, 0x62f, 0x64f, 0x633, 0x62a, 0x672, 0x646, 0x6cd, 0x20, 0x631, 0x6c4, 0x67e, 0x64e, 0x6d2, 0x49a,
+0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435, 0x441, 0x456, 0x3b, 0x3b, 0x49a, 0x430,
+0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435, 0x441, 0x456, 0x3b, 0x3b, 0x3b, 0x3b, 0x49a,
+0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433, 0x435, 0x441, 0x456, 0x41a, 0x44b, 0x440, 0x433,
+0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0x3b, 0x3b, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441,
+0x442, 0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0x3b, 0x3b, 0x3b, 0x3b, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442,
+0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xb300,
+0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0xc870, 0xc120, 0x20, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0x20, 0xc778, 0xbbfc, 0x20, 0xacf5, 0xd654, 0xad6d, 0x20,
+0xc6d0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xc870, 0xc120, 0x20, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0x20, 0xc778, 0xbbfc, 0x20, 0xacf5, 0xd654,
+0xad6d, 0x20, 0xc6d0, 0x49, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x72, 0x79, 0x2019, 0x55, 0x62, 0x75, 0x72, 0x75,
+0x6e, 0x64, 0x69, 0xea5, 0xeb2, 0xea7, 0x20, 0xe81, 0xeb5, 0xe9a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xea5, 0xeb2, 0xea7, 0x20,
+0xe81, 0xeb5, 0xe9a, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x3b,
+0x3b, 0x65, 0x69, 0x72, 0x6f, 0x46, 0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67,
+0xf3, 0x4b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20, 0x79, 0x61, 0x20, 0x41, 0x6e, 0x67, 0xf3, 0x6c, 0x61, 0x46, 0x61, 0x6c,
+0xe1, 0x6e, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45, 0x41, 0x43, 0x45, 0x75, 0x72, 0x61, 0x73, 0x3b, 0x3b,
+0x65, 0x75, 0x72, 0x61, 0x73, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x61, 0x69, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75,
+0x72, 0x173, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x3b, 0x3b,
+0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x3b, 0x3b,
+0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x438, 0x52, 0x69, 0x6e,
+0x67, 0x67, 0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52,
+0x69, 0x6e, 0x67, 0x67, 0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x44, 0x6f, 0x6c, 0x61, 0x72,
+0x20, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x42,
+0x72, 0x75, 0x6e, 0x65, 0x69, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72, 0x61,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72,
+0x61, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f,
+0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a,
+0x65, 0x77, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b, 0x65, 0x77, 0x72,
+0x6f, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x54, 0x101, 0x72, 0x61, 0x20, 0x6f, 0x20, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f,
+0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x74, 0x101, 0x72, 0x61, 0x20, 0x6f, 0x20, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72,
+0x6f, 0x61, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924,
+0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930,
+0x941, 0x92a, 0x92f, 0x947, 0x41c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x20, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x3b, 0x3b, 0x41c,
+0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x20, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x3b, 0x3b, 0x3b, 0x3b, 0x41c, 0x43e, 0x43d, 0x433,
+0x43e, 0x43b, 0x20, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948,
+0x92f, 0x93e, 0x901, 0x3b, 0x3b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948, 0x92f, 0x93e, 0x901, 0x3b,
+0x3b, 0x3b, 0x3b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948, 0x92f, 0x93e, 0x901, 0x92d, 0x93e, 0x930,
0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20,
0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942,
-0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b,
-0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73,
-0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d,
-0xb15, 0xb3e, 0x3b, 0x3b, 0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e, 0x3b, 0x3b, 0x3b, 0x3b,
-0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x3b,
-0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x67e, 0x627,
-0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cd, 0x20, 0x6a9, 0x644, 0x62f, 0x627, 0x631, 0x647, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a,
-0x627, 0x646, 0x6cd, 0x20, 0x6a9, 0x644, 0x62f, 0x627, 0x631, 0x647, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627,
-0x646, 0x6cd, 0x20, 0x6a9, 0x644, 0x62f, 0x627, 0x631, 0x6d2, 0x3b, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627, 0x646,
-0x3b, 0x3b, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x631, 0x6cc, 0x627, 0x644,
-0x20, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633,
-0x62a, 0x627, 0x646, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627,
-0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627,
-0x646, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74,
-0x79, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x73,
-0x6b, 0x69, 0x65, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x63, 0x68, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x63, 0x68,
-0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x65, 0x67, 0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x65, 0x67, 0x6f, 0x3b, 0x52,
-0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x6c,
-0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x69, 0x73,
-0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x73, 0x3b, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20,
-0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20, 0x61, 0x6e, 0x67,
-0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x67,
-0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x65, 0x73, 0x63, 0x75, 0x64, 0x6f, 0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d, 0x76,
-0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x65, 0x73, 0x63, 0x75, 0x64, 0x6f, 0x20, 0x63, 0x61, 0x62, 0x6f,
-0x2d, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x73, 0x63, 0x75, 0x64, 0x6f, 0x73,
-0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x64, 0xf3, 0x6c, 0x61,
-0x72, 0x20, 0x64, 0x6f, 0x73, 0x20, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73,
-0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x64, 0x6f, 0x73, 0x20, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20,
-0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x64, 0x6f,
-0x73, 0x20, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x3b, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e,
-0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x66, 0x72, 0x61, 0x6e,
-0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e,
-0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x70, 0x61,
-0x74, 0x61, 0x63, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x70, 0x61, 0x74, 0x61, 0x63,
-0x61, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x61, 0x74, 0x61, 0x63, 0x61,
-0x73, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20,
-0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c,
-0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x6d, 0x65, 0x74, 0x69,
-0x63, 0x61, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x64, 0x6f,
-0x62, 0x72, 0x61, 0x20, 0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72,
-0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x3b, 0x3b, 0x64, 0x6f, 0x62, 0x72, 0x61, 0x20, 0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f,
-0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x3b, 0x3b, 0x3b, 0x3b,
-0x64, 0x6f, 0x62, 0x72, 0x61, 0x73, 0x20, 0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65,
-0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x75, 0xed,
-0xe7, 0x6f, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x75, 0xed, 0xe7, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
-0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x73, 0x75, 0xed, 0xe7, 0x6f, 0x73, 0x3b, 0xa2d, 0xa3e, 0xa30, 0xa24, 0xa40,
-0x20, 0xa30, 0xa41, 0xa2a, 0xa07, 0xa06, 0x3b, 0x3b, 0xa2d, 0xa3e, 0xa30, 0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa07, 0xa06, 0x3b,
-0x3b, 0x3b, 0x3b, 0xa2d, 0xa3e, 0xa30, 0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa0f, 0x3b, 0x631, 0x648, 0x67e, 0x626, 0x6cc, 0x6c1,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f, 0x6c, 0x20, 0x50, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x42, 0x6f, 0x6c, 0x69,
-0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f,
-0x3b, 0x44, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x44, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73,
-0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a,
-0x7a, 0x65, 0x72, 0x3b, 0x6c, 0x65, 0x75, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65,
-0x75, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x72, 0x6f, 0x6d, 0xe2,
-0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x219, 0x74, 0x69,
-0x3b, 0x6c, 0x65, 0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65,
-0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d,
-0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f, 0x6c,
-0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x439,
-0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440,
-0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431,
-0x43b, 0x44f, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x435, 0x439,
-0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x431,
-0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435,
-0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435, 0x43b,
-0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440,
-0x443, 0x441, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x435, 0x439, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443,
-0x441, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a,
-0x438, 0x439, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x439, 0x20,
-0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x442, 0x435, 0x43d,
-0x433, 0x435, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x43a,
-0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x43a, 0x438, 0x440, 0x433,
-0x438, 0x437, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a,
-0x438, 0x439, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x441,
-0x43e, 0x43c, 0x430, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x441, 0x43e, 0x43c, 0x43e, 0x432,
-0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x441, 0x43e, 0x43c, 0x430, 0x3b, 0x43c, 0x43e,
+0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0x3b,
+0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b,
+0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e,
+0x3b, 0x3b, 0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e, 0x3b, 0x3b, 0x3b, 0x3b, 0xb2d, 0xb3e,
+0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x3b, 0x627, 0x641,
+0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627,
+0x646, 0x6cd, 0x20, 0x6a9, 0x644, 0x62f, 0x627, 0x631, 0x647, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cd, 0x20,
+0x6a9, 0x644, 0x62f, 0x627, 0x631, 0x647, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cd, 0x20, 0x6a9,
+0x644, 0x62f, 0x627, 0x631, 0x6d2, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x3b, 0x631, 0x6cc, 0x627,
+0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627,
+0x646, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x3b, 0x3b, 0x627,
+0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x627,
+0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x7a, 0x142, 0x6f, 0x74, 0x79,
+0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b,
+0x69, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x65, 0x3b, 0x7a, 0x142, 0x6f,
+0x74, 0x79, 0x63, 0x68, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x63, 0x68, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x65, 0x67,
+0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x65, 0x67, 0x6f, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73,
+0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65,
+0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x69, 0x73, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65,
+0x69, 0x72, 0x6f, 0x73, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b,
+0x3b, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
+0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x73, 0x65, 0x73, 0x63,
+0x75, 0x64, 0x6f, 0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x65,
+0x73, 0x63, 0x75, 0x64, 0x6f, 0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x3b,
+0x3b, 0x3b, 0x3b, 0x65, 0x73, 0x63, 0x75, 0x64, 0x6f, 0x73, 0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d, 0x76, 0x65, 0x72, 0x64,
+0x69, 0x61, 0x6e, 0x6f, 0x73, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x64, 0x6f, 0x73, 0x20, 0x45, 0x73, 0x74, 0x61, 0x64,
+0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x64, 0x6f, 0x73,
+0x20, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x64,
+0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x73, 0x20, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55,
+0x6e, 0x69, 0x64, 0x6f, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41,
+0x43, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43,
+0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45,
+0x41, 0x43, 0x29, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f,
+0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f,
+0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43,
+0x45, 0x41, 0x4f, 0x29, 0x70, 0x61, 0x74, 0x61, 0x63, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x3b,
+0x3b, 0x70, 0x61, 0x74, 0x61, 0x63, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b,
+0x70, 0x61, 0x74, 0x61, 0x63, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x63, 0x61, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x6d, 0x65, 0x74,
+0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x6d, 0x65,
+0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b,
+0x3b, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e,
+0x6f, 0x73, 0x64, 0x6f, 0x62, 0x72, 0x61, 0x20, 0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20,
+0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x3b, 0x3b, 0x64, 0x6f, 0x62, 0x72, 0x61, 0x20, 0x64, 0x65,
+0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65,
+0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f, 0x62, 0x72, 0x61, 0x73, 0x20, 0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f,
+0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20,
+0x73, 0x75, 0xed, 0xe7, 0x6f, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x75, 0xed, 0xe7, 0x6f, 0x3b,
+0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x73, 0x75, 0xed, 0xe7, 0x6f, 0x73, 0xa2d, 0xa3e, 0xa30,
+0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa07, 0xa06, 0x3b, 0x3b, 0xa2d, 0xa3e, 0xa30, 0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa07,
+0xa06, 0x3b, 0x3b, 0x3b, 0x3b, 0xa2d, 0xa3e, 0xa30, 0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa0f, 0x631, 0x648, 0x67e, 0x626, 0x6cc,
+0x6c1, 0x53, 0x6f, 0x6c, 0x20, 0x50, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f,
+0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x44, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0xf3, 0x6c, 0x61, 0x72, 0x20,
+0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a,
+0x65, 0x72, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x3b, 0x3b, 0x3b,
+0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x6c, 0x65, 0x75, 0x20, 0x72, 0x6f,
+0x6d, 0xe2, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x75, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x73, 0x63,
+0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x3b, 0x6c, 0x65, 0x69,
+0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x6c, 0x65, 0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76,
+0x65, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65,
+0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69,
+0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x440, 0x43e,
+0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x440, 0x43e, 0x441, 0x441,
+0x438, 0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439,
+0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438,
+0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x435, 0x439, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x43e, 0x433, 0x43e,
+0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443,
+0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431,
+0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b,
+0x44f, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x435, 0x439,
+0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x43a,
+0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x3b, 0x43a, 0x430, 0x437, 0x430,
+0x445, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a,
+0x438, 0x445, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x442,
+0x435, 0x43d, 0x433, 0x435, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x442, 0x435, 0x43d, 0x433,
+0x435, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x43a, 0x438, 0x440,
+0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441,
+0x43a, 0x438, 0x445, 0x20, 0x441, 0x43e, 0x43c, 0x430, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x445, 0x20,
+0x441, 0x43e, 0x43c, 0x43e, 0x432, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x441, 0x43e,
+0x43c, 0x430, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439, 0x3b, 0x3b, 0x43c, 0x43e,
0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439, 0x3b, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432,
-0x441, 0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439, 0x3b, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x445,
-0x20, 0x43b, 0x435, 0x44f, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x43b, 0x435, 0x435, 0x432,
-0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x43b, 0x435, 0x44f, 0x3b, 0x443, 0x43a, 0x440,
-0x430, 0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x430, 0x3b, 0x3b, 0x443, 0x43a, 0x440, 0x430,
-0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x430, 0x3b, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x438,
-0x43d, 0x441, 0x43a, 0x438, 0x435, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44b, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441,
-0x43a, 0x438, 0x445, 0x20, 0x433, 0x440, 0x438, 0x432, 0x435, 0x43d, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x43e,
-0x439, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44b, 0x3b, 0x66, 0x61, 0x72, 0xe2, 0x6e, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41,
-0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x421, 0x440, 0x43f, 0x441, 0x43a, 0x438,
-0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440,
-0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x430, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x3b, 0x441, 0x440, 0x43f,
-0x441, 0x43a, 0x438, 0x445, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x411, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e,
-0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440,
-0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d,
-0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d,
-0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e,
-0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x435, 0x20,
-0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x435, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x65, 0x3b,
-0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447,
-0x43a, 0x438, 0x445, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c,
-0x430, 0x440, 0x430, 0x43a, 0x430, 0x3b, 0x415, 0x432, 0x440, 0x43e, 0x3b, 0x3b, 0x435, 0x432, 0x440, 0x43e, 0x3b, 0x3b, 0x435, 0x432,
-0x440, 0x430, 0x3b, 0x3b, 0x435, 0x432, 0x440, 0x430, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65,
+0x441, 0x43a, 0x438, 0x445, 0x20, 0x43b, 0x435, 0x44f, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x445, 0x20,
+0x43b, 0x435, 0x435, 0x432, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x43b, 0x435, 0x44f,
+0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x430, 0x3b, 0x3b, 0x443,
+0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x430, 0x3b, 0x3b, 0x443, 0x43a,
+0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x438, 0x435, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44b, 0x3b, 0x443, 0x43a, 0x440, 0x430,
+0x438, 0x43d, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x433, 0x440, 0x438, 0x432, 0x435, 0x43d, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d,
+0x441, 0x43a, 0x43e, 0x439, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44b, 0x66, 0x61, 0x72, 0xe2, 0x6e, 0x67, 0x61, 0x20, 0x43,
+0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x421, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d, 0x430,
+0x440, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x441, 0x440, 0x43f,
+0x441, 0x43a, 0x430, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x445, 0x20,
+0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65, 0x72, 0x63, 0x65,
+0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e,
+0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65,
0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62,
0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f,
-0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72,
-0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e,
-0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x65, 0x20, 0x6b, 0x6f, 0x6e,
-0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x3b, 0x3b, 0x62, 0x6f,
-0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x69, 0x68,
-0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61, 0x72, 0x61,
-0x6b, 0x61, 0x3b, 0x45, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b,
-0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x53, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x3b, 0x3b,
-0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x3b, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x61,
-0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x61, 0x3b, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x68, 0x20, 0x64, 0x69, 0x6e,
-0x61, 0x72, 0x61, 0x3b, 0x41b, 0x430, 0x440, 0x3b, 0x3b, 0x43b, 0x430, 0x440, 0x3b, 0x3b, 0x3b, 0x3b, 0x43b, 0x430, 0x440, 0x44b,
-0x3b, 0x421, 0x43e, 0x43c, 0x3b, 0x3b, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x3b, 0x3b, 0x441, 0x43e, 0x43c, 0x44b, 0x3b, 0x44, 0x6f,
-0x72, 0x61, 0x20, 0x72, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x65, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72,
+0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e,
+0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x6f,
+0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x45,
+0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x3b, 0x65, 0x76, 0x72,
+0x61, 0x53, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x3b, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b,
+0x69, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x3b, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x61, 0x20, 0x64, 0x69, 0x6e, 0x61,
+0x72, 0x61, 0x3b, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x68, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x61, 0x411, 0x43e,
+0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20,
+0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b,
+0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447,
+0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440,
+0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e,
+0x432, 0x430, 0x447, 0x43a, 0x435, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x435, 0x20,
+0x43c, 0x430, 0x440, 0x43a, 0x65, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446,
+0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x438, 0x445, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438,
+0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c, 0x430, 0x440, 0x430, 0x43a, 0x430, 0x415, 0x432, 0x440, 0x43e, 0x3b, 0x3b, 0x435, 0x432, 0x440,
+0x43e, 0x3b, 0x3b, 0x435, 0x432, 0x440, 0x430, 0x3b, 0x3b, 0x435, 0x432, 0x440, 0x430, 0x41b, 0x430, 0x440, 0x3b, 0x3b, 0x43b, 0x430,
+0x440, 0x3b, 0x3b, 0x3b, 0x3b, 0x43b, 0x430, 0x440, 0x44b, 0x421, 0x43e, 0x43c, 0x3b, 0x3b, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x3b,
+0x3b, 0x441, 0x43e, 0x43c, 0x44b, 0x44, 0x6f, 0x72, 0x61, 0x20, 0x72, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61,
0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x64a, 0x20, 0x631, 0x67e, 0x64a, 0x3b, 0x3b, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627,
0x646, 0x64a, 0x20, 0x631, 0x67e, 0x64a, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x64a, 0x20, 0x631,
-0x67e, 0x64a, 0x3b, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd,
-0x3b, 0x3b, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0x3b,
-0x3b, 0x3b, 0x3b, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd,
-0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0xe1, 0x3b, 0x65, 0x75,
-0x72, 0x61, 0x3b, 0x65, 0x75, 0x72, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x65, 0x76,
-0x72, 0x61, 0x3b, 0x65, 0x76, 0x72, 0x69, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x76, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69,
-0x6e, 0x67, 0x6b, 0x61, 0x20, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x3b, 0x3b, 0x66, 0x61, 0x72,
-0x61, 0x6e, 0x6b, 0x61, 0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0x61,
-0x6e, 0x6b, 0x61, 0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x3b, 0x42, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74,
-0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x62, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62,
-0x62, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62,
-0x69, 0x79, 0x61, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b,
-0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b,
-0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x70, 0x65, 0x73, 0x6f,
-0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x61, 0x72, 0x67,
-0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x61, 0x72, 0x67, 0x65,
-0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x73, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65, 0xf1,
-0x6f, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b,
-0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65, 0xf1, 0x6f, 0x73, 0x3b, 0x62,
-0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b,
-0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x62,
-0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69,
-0x6c, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x72, 0x65, 0x61, 0x6c, 0x65, 0x73, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69,
-0x6c, 0x65, 0xf1, 0x6f, 0x73, 0x3b, 0x50, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x3b, 0x3b,
-0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f,
-0x73, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f,
-0x6d, 0x62, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69,
-0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69,
-0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63,
+0x67e, 0x64a, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0x3b,
+0x3b, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0x3b, 0x3b,
+0x3b, 0x3b, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0x65,
+0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0xe1, 0x3b, 0x65, 0x75, 0x72, 0x61,
+0x3b, 0x65, 0x75, 0x72, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b,
+0x65, 0x76, 0x72, 0x69, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x76, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61,
+0x20, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x20, 0x4a, 0x61, 0x62,
+0x75, 0x75, 0x74, 0x69, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x6b, 0x61, 0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74,
+0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x6b, 0x61, 0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69,
+0x42, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x62, 0x69, 0x72,
+0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x69, 0x72, 0x74,
+0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79, 0x61, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61,
+0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61, 0x20, 0x4b, 0x65,
+0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61, 0x20, 0x4b, 0x65, 0x6e,
+0x79, 0x61, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65,
+0x73, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f,
+0x73, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x73, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x62, 0x65,
+0x6c, 0x69, 0x63, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65,
+0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65,
+0xf1, 0x6f, 0x73, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69,
+0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x73, 0x72, 0x65, 0x61,
+0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72,
+0x61, 0x73, 0x69, 0x6c, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x72, 0x65, 0x61, 0x6c, 0x65, 0x73, 0x20, 0x62, 0x72,
+0x61, 0x73, 0x69, 0x6c, 0x65, 0xf1, 0x6f, 0x73, 0x50, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f,
+0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65,
+0x73, 0x6f, 0x73, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c,
+0x6f, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62,
+0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62,
+0x69, 0x61, 0x6e, 0x6f, 0x73, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63,
0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69,
0x63, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x73,
-0x74, 0x61, 0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x75, 0x62,
-0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x75, 0x62, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
-0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x63, 0x75, 0x62, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64,
-0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69,
-0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x64, 0x6f, 0x6d, 0x69,
-0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f,
-0x75, 0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61,
-0x64, 0x6f, 0x75, 0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x65,
-0x73, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x43,
-0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64,
-0x65, 0x20, 0xc1, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b,
-0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66, 0x72, 0x69, 0x63,
-0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x3b, 0x3b, 0x71,
-0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x65, 0x73, 0x3b,
-0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x6c,
-0x65, 0x6d, 0x70, 0x69, 0x72, 0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
-0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61, 0x73, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x73, 0x3b,
-0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20,
-0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x6d, 0x65,
-0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6e, 0x69, 0x63, 0x61,
-0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6e, 0x69,
-0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62,
-0x61, 0x73, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x62, 0x61, 0x6c,
-0x62, 0x6f, 0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61,
-0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x73,
-0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x73, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70,
-0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61,
-0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x65, 0x73,
-0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73, 0x3b, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x75,
-0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
-0x73, 0x6f, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20,
-0x66, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x69, 0x70,
-0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e,
-0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x70, 0x65,
-0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73,
-0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20, 0x73,
-0x6f, 0x62, 0x65, 0x72, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20, 0x73, 0x6f, 0x62,
-0x65, 0x72, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x65, 0x73, 0x20, 0x73,
-0x6f, 0x62, 0x65, 0x72, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61,
-0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
-0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69,
-0x6e, 0x67, 0x69, 0x20, 0x7a, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x46, 0x61, 0x72, 0x61,
-0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x67,
-0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x67,
-0x61, 0x20, 0x7a, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
-0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79,
-0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
-0x7a, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61,
-0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61,
-0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
-0x7a, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f,
-0x6e, 0x61, 0x3b, 0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b,
-0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x6f, 0x72, 0x3b, 0x421, 0x43e, 0x43c, 0x43e, 0x43d,
-0x4e3, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x421, 0x43e, 0x43c, 0x43e, 0x43d, 0x4e3, 0x3b, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf,
-0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe,
-0xbaf, 0xbcd, 0x3b, 0x3b, 0x3b, 0x3b, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0xb95,
-0xbb3, 0xbcd, 0x3b, 0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd,
-0x3b, 0x3b, 0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0x3b,
-0x3b, 0x3b, 0x3b, 0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd,
-0xb95, 0xbb3, 0xbcd, 0x3b, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0,
-0xbcd, 0x3b, 0x3b, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd,
-0x3b, 0x3b, 0x3b, 0x3b, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0,
-0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b,
-0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0x3b, 0x3b, 0xb87, 0xbb2, 0xb99,
-0xbcd, 0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x44f,
-0x20, 0x441, 0x443, 0x43c, 0x44b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x441, 0x443, 0x43c, 0x3b, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f,
-0xc3f, 0x3b, 0x3b, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc3f, 0x3b, 0x3b, 0x3b, 0x3b, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc32, 0xc41,
-0x3b, 0xe1a, 0xe32, 0xe17, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xe1a, 0xe32, 0xe17, 0xe44, 0xe17, 0xe22, 0x3b, 0xf61, 0xf74, 0xf0b,
-0xf68, 0xf53, 0xf0b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0xf66, 0xf92, 0xf7c,
-0xf62, 0xf0b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61, 0x74, 0x6f, 0x6e,
-0x67, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61,
-0x74, 0x6f, 0x6e, 0x67, 0x61, 0x3b, 0x54, 0xfc, 0x72, 0x6b, 0x20, 0x4c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x3b, 0x3b, 0x54,
-0xfc, 0x72, 0x6b, 0x20, 0x6c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0xfc, 0x72, 0x6b, 0x20, 0x6c,
-0x69, 0x72, 0x61, 0x73, 0x131, 0x3b, 0x54, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79,
+0x74, 0x61, 0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x75, 0x62, 0x61,
+0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x75, 0x62, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70,
+0x65, 0x73, 0x6f, 0x73, 0x20, 0x63, 0x75, 0x62, 0x61, 0x6e, 0x6f, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d,
+0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69,
+0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69,
+0x63, 0x61, 0x6e, 0x6f, 0x73, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69,
+0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75,
+0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x65,
+0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f,
+0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72,
+0x61, 0x6c, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66,
+0x72, 0x69, 0x63, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e,
+0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x43, 0x65,
+0x6e, 0x74, 0x72, 0x61, 0x6c, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61,
+0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x65, 0x73, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72,
+0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72, 0x61,
+0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x6d, 0x70, 0x69, 0x72,
+0x61, 0x73, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65,
+0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e,
+0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x73,
+0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65,
+0x3b, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e,
+0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x73, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72,
+0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d,
+0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f,
+0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x73, 0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f,
+0x73, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b,
+0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x3b,
+0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x65, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f,
+0x73, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65,
+0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x6f, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61,
+0x6e, 0x6f, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65,
+0x73, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73,
+0x20, 0x66, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x73, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75,
+0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b,
+0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73, 0x62, 0x6f, 0x6c,
+0xed, 0x76, 0x61, 0x72, 0x20, 0x73, 0x6f, 0x62, 0x65, 0x72, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76,
+0x61, 0x72, 0x20, 0x73, 0x6f, 0x62, 0x65, 0x72, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76,
+0x61, 0x72, 0x65, 0x73, 0x20, 0x73, 0x6f, 0x62, 0x65, 0x72, 0x61, 0x6e, 0x6f, 0x73, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e,
+0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c,
+0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b,
+0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x7a, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61,
+0x46, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x3b, 0x66, 0x61,
+0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x61,
+0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x7a, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e,
+0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67,
+0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e,
+0x67, 0x69, 0x20, 0x7a, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
+0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
+0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67,
+0x69, 0x20, 0x7a, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72,
+0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x3b,
+0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x6f, 0x72, 0x421, 0x43e, 0x43c, 0x43e, 0x43d,
+0x4e3, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x421, 0x43e, 0x43c, 0x43e, 0x43d, 0x4e3, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20,
+0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf,
+0xbcd, 0x3b, 0x3b, 0x3b, 0x3b, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0xb95, 0xbb3,
+0xbcd, 0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0x3b, 0x3b,
+0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0x3b, 0x3b, 0x3b,
+0x3b, 0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0xb95, 0xbb3,
+0xbcd, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0x3b, 0x3b,
+0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0x3b, 0x3b, 0x3b,
+0x3b, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0xb95, 0xbb3,
+0xbcd, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0xb87, 0xbb2, 0xb99, 0xbcd,
+0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0x3b, 0x3b, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x20,
+0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x44f, 0x20, 0x441, 0x443, 0x43c, 0x44b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x441, 0x443, 0x43c, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc3f, 0x3b, 0x3b, 0xc30, 0xc42, 0xc2a,
+0xc3e, 0xc2f, 0xc3f, 0x3b, 0x3b, 0x3b, 0x3b, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc32, 0xc41, 0xe1a, 0xe32, 0xe17, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0xe1a, 0xe32, 0xe17, 0xe44, 0xe17, 0xe22, 0xf61, 0xf74, 0xf0b, 0xf68, 0xf53, 0xf0b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42,
+0xf62, 0xf0b, 0xf66, 0xf92, 0xf7c, 0xf62, 0xf0b, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61, 0x74,
+0x6f, 0x6e, 0x67, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x66, 0x61,
+0x6b, 0x61, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0xfc, 0x72, 0x6b, 0x20, 0x4c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x3b, 0x3b,
+0x54, 0xfc, 0x72, 0x6b, 0x20, 0x6c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0xfc, 0x72, 0x6b, 0x20,
+0x6c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x54, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79,
0x3b, 0x3b, 0x74, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79, 0x3b, 0x3b, 0x3b, 0x3b,
-0x74, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79, 0x3b, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648,
-0x20, 0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x3b, 0x3b, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20, 0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x3b,
-0x3b, 0x3b, 0x3b, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20, 0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x457,
-0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f,
-0x3b, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x456, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x433, 0x440, 0x438,
-0x432, 0x43d, 0x456, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b,
-0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627,
-0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20,
-0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b,
-0x3b, 0x3b, 0x3b, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6d2, 0x3b, 0x4f, 0x2018, 0x7a, 0x62, 0x65,
-0x6b, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x3b, 0x3b, 0x4f, 0x2018, 0x7a, 0x62, 0x65, 0x6b,
-0x69, 0x73, 0x74, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x4f, 0x2018, 0x7a, 0x62, 0x65,
-0x6b, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c,
-0x3b, 0x3b, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x3b, 0x3b, 0x3b, 0x3b,
-0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x3b, 0x110, 0x1ed3, 0x6e, 0x67, 0x20,
+0x74, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20,
+0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x3b, 0x3b, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20, 0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x3b, 0x3b,
+0x3b, 0x3b, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20, 0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x443, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441,
+0x44c, 0x43a, 0x430, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b,
+0x433, 0x440, 0x438, 0x432, 0x43d, 0x456, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d,
+0x456, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9,
+0x633, 0x62a, 0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a,
+0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc,
+0x6c1, 0x3b, 0x3b, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x628,
+0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6d2, 0x4f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f,
+0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x3b, 0x3b, 0x4f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f, 0x6e,
+0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x4f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f,
+0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e,
+0x43c, 0x3b, 0x3b, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x3b, 0x3b, 0x3b,
+0x3b, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x110, 0x1ed3, 0x6e, 0x67, 0x20,
0x56, 0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x110, 0x1ed3, 0x6e, 0x67, 0x20, 0x56,
-0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x3b, 0x50, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e,
-0x3b, 0x70, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x62, 0x75, 0x6e, 0x74, 0x20, 0x50,
-0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x62, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b,
-0x70, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x70, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72,
-0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x70, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x46,
-0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x62, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x20, 0x53, 0x6f,
-0x77, 0x77, 0x75, 0x2d, 0x6a, 0x61, 0x6e, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20,
-0x43, 0x46, 0x41, 0x20, 0x79, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x20, 0x53, 0x6f, 0x77, 0x77, 0x75, 0x2d, 0x6a,
-0x61, 0x6e, 0x74, 0x3b, 0x69, 0x52, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x79, 0x61, 0x73, 0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x7a,
-0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x69, 0x52, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x59, 0x61, 0x73,
-0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x7a, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x69, 0x52,
-0x61, 0x6e, 0x64, 0x69, 0x20, 0x79, 0x61, 0x73, 0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x7a, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69,
-0x6b, 0x61, 0x3b, 0x4e, 0xe1, 0xec, 0x72, 0xe0, 0x20, 0x74, 0x69, 0x20, 0x4f, 0x72, 0xed, 0x6c, 0x1eb9, 0x300, 0x2d, 0xe8,
-0x64, 0xe8, 0x20, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0xe1, 0xed,
-0x72, 0xe0, 0x20, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x3b, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x20,
-0x74, 0x69, 0x20, 0x4f, 0x72, 0xed, 0x6c, 0x25b, 0x301, 0xe8, 0x64, 0x65, 0x20, 0x42, 0x49, 0x4b, 0x45, 0x41, 0x4f, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
-0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69,
-0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20,
-0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b,
-0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72,
-0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e,
-0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76,
-0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73,
-0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x65, 0x20, 0x6b, 0x6f,
-0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x3b, 0x3b, 0x62,
-0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x69, 0x68,
-0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61, 0x72, 0x61,
-0x6b, 0x61, 0x3b, 0x41a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440,
-0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e,
-0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20,
-0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446,
-0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x435, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b,
-0x43d, 0x435, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x435, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445,
-0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x438, 0x445, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442,
-0x438, 0x431, 0x438, 0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c, 0x430, 0x440, 0x430, 0x43a, 0x430, 0x3b, 0x47, 0x68, 0x61, 0x6e, 0x61,
-0x20, 0x53, 0x69, 0x64, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930,
-0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a,
-0x92f, 0x93e, 0x3b, 0x4e, 0x61, 0x1ecb, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e,
-0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x68,
-0x61, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69, 0x3b, 0x3b, 0x67, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69,
-0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69, 0x3b, 0x263, 0x65, 0x74, 0x6f, 0x256,
-0x6f, 0x66, 0x65, 0x20, 0x61, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x263, 0x65, 0x74, 0x6f, 0x256, 0x6f, 0x66, 0x65, 0x20, 0x61,
-0x66, 0x72, 0x69, 0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x42, 0x43,
-0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x263, 0x65, 0x74, 0x6f, 0x256, 0x6f, 0x66, 0x65, 0x20, 0x61, 0x66, 0x72, 0x69,
-0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f,
-0x3b, 0x50, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x3b,
-0x70, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x3b, 0x3b,
-0x3b, 0x70, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x53,
+0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x50, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b,
+0x70, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x62, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72,
+0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x62, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x70,
+0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x70, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79,
+0x64, 0x61, 0x69, 0x6e, 0x3b, 0x70, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x61,
+0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x62, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x20, 0x53, 0x6f, 0x77, 0x77,
+0x75, 0x2d, 0x6a, 0x61, 0x6e, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46,
+0x41, 0x20, 0x79, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x20, 0x53, 0x6f, 0x77, 0x77, 0x75, 0x2d, 0x6a, 0x61, 0x6e,
+0x74, 0x69, 0x52, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x79, 0x61, 0x73, 0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x7a, 0x69, 0x20, 0x41,
+0x66, 0x72, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x69, 0x52, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x59, 0x61, 0x73, 0x65, 0x4d, 0x7a,
+0x61, 0x6e, 0x7a, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x69, 0x52, 0x61, 0x6e, 0x64,
+0x69, 0x20, 0x79, 0x61, 0x73, 0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x7a, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x4e,
+0xe1, 0xec, 0x72, 0xe0, 0x20, 0x74, 0x69, 0x20, 0x4f, 0x72, 0xed, 0x6c, 0x1eb9, 0x300, 0x2d, 0xe8, 0x64, 0xe8, 0x20, 0x4e,
+0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0xe1, 0xed, 0x72, 0xe0, 0x20, 0x4e,
+0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x20, 0x74, 0x69, 0x20, 0x4f, 0x72,
+0xed, 0x6c, 0x25b, 0x301, 0xe8, 0x64, 0x65, 0x20, 0x42, 0x49, 0x4b, 0x45, 0x41, 0x4f, 0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74,
+0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x69, 0x2d, 0x53, 0x6f,
+0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b,
+0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64,
+0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61,
+0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61,
+0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d,
+0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72,
+0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76,
+0x61, 0x10d, 0x6b, 0x65, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d,
+0x61, 0x72, 0x6b, 0x65, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67,
+0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e,
+0x69, 0x68, 0x20, 0x6d, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x41a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b,
+0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445,
+0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438,
+0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a,
+0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x435, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435,
+0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x435, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x435, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430,
+0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x438, 0x445, 0x20, 0x43a,
+0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c, 0x430, 0x440, 0x430, 0x43a, 0x430,
+0x47, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x53, 0x69, 0x64, 0x69, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a,
+0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e,
+0x4e, 0x61, 0x1ecb, 0x72, 0x61, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79,
+0x61, 0x67, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69, 0x3b, 0x3b, 0x67, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x73,
+0x69, 0x256, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69, 0x263, 0x65, 0x74,
+0x6f, 0x256, 0x6f, 0x66, 0x65, 0x20, 0x61, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66,
+0x72, 0x61, 0x6e, 0x63, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x263, 0x65, 0x74, 0x6f, 0x256, 0x6f, 0x66, 0x65,
+0x20, 0x61, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20,
+0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x263, 0x65, 0x74, 0x6f, 0x256, 0x6f, 0x66, 0x65, 0x20, 0x61, 0x66,
+0x72, 0x69, 0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x42, 0x43, 0x45,
+0x41, 0x4f, 0x50, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x3b,
+0x3b, 0x70, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x3b,
+0x3b, 0x3b, 0x70, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x53,
0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x3b, 0x53, 0x63, 0x68,
0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63, 0x68,
-0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76,
-0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b,
-0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72,
-0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75,
-0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x72, 0x75, 0x6f, 0x167, 0x167,
-0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72,
-0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f,
-0x3b, 0x3b, 0x3b, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x53, 0x68,
-0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x75, 0x20, 0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x43, 0x45, 0x41,
-0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x69, 0x20, 0x53, 0x65, 0x65, 0x66, 0x61,
-0x61, 0x20, 0x42, 0x45, 0x41, 0x43, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x20,
-0x47, 0x61, 0x6d, 0x6d, 0x62, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x61, 0x72, 0x20,
-0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x67, 0x69, 0x79,
-0x79, 0x61, 0x20, 0x4d, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61,
-0x79, 0x72, 0x61, 0x61, 0x20, 0x4e, 0x69, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x4c, 0x65, 0x77, 0x6f, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x61, 0x61, 0x20, 0x4c, 0x69, 0x79, 0x6f, 0x6e, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e,
-0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x6a, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x65,
-0x6c, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61,
-0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x20, 0x79, 0x61, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x68, 0x65, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x73, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a,
-0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x2d30, 0x2d37, 0x2d54, 0x2d49, 0x2d4e, 0x20, 0x2d4f, 0x20, 0x2d4d,
-0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x64, 0x72, 0x69, 0x6d, 0x20, 0x6e, 0x20,
-0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20,
-0x41, 0x7a, 0x7a, 0x61, 0x79, 0x72, 0x69, 0x3b, 0x3b, 0x41, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x6e, 0x20, 0x5a, 0x7a,
-0x61, 0x79, 0x65, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x65, 0x6e, 0x20, 0x6e, 0x20, 0x5a,
-0x7a, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x45, 0x73, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x55,
-0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69,
-0x20, 0x79, 0x61, 0x20, 0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69,
-0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x65, 0x66, 0x61, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42,
-0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x13a0, 0x13d5, 0x13b3, 0x3b, 0x3b,
-0x55, 0x53, 0x20, 0x13a0, 0x13d5, 0x13b3, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x13a0, 0x13d5, 0x13b3, 0x3b, 0x72, 0x6f, 0x75,
-0x70, 0x69, 0x20, 0x6d, 0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68,
-0x69, 0x6c, 0xed, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0xed, 0x61,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x79, 0x61, 0x20, 0x59,
-0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6b, 0x75, 0x64, 0x75, 0x20, 0x4b,
-0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6b, 0x75,
-0x64, 0x75, 0x20, 0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x3b, 0x53, 0x69, 0x6c, 0x69,
-0x6e, 0x67, 0x69, 0x74, 0x61, 0x62, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x69, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x72, 0x6f, 0x70, 0x69,
-0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69,
-0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x72, 0x69, 0x6e, 0x6a, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b,
-0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
-0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41,
-0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b, 0x2019, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b,
-0x2019, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x46, 0x41, 0x20, 0x46, 0x72,
-0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6c,
-0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x44, 0x65, 0x72, 0x68, 0x65, 0x6d, 0x20, 0x55, 0x6d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e,
-0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x930, 0x93e, 0x902, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x420,
-0x43e, 0x441, 0x441, 0x438, 0x439, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x43d, 0x20,
-0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x43d, 0x20, 0x441, 0x43e, 0x44c, 0x43c, 0x430,
-0x448, 0x3b, 0x440, 0x461, 0x441, 0x441, 0x456, 0x301, 0x439, 0x441, 0x43a, 0x457, 0x439, 0x20, 0x440, 0xa64b, 0x301, 0x431, 0x43b, 0x44c,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x440, 0x461, 0x441, 0x441, 0x456, 0x301, 0x439, 0x441, 0x43a, 0x430, 0x433, 0x461, 0x20, 0x440,
-0xa64b, 0x431, 0x43b, 0x467, 0x300, 0x3b, 0x4e, 0x66, 0x61, 0x6c, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f,
-0x6e, 0x67, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x46, 0x41, 0x20, 0x46, 0xe0, 0x6c, 0xe2, 0x14b, 0x20,
-0x42, 0x45, 0x41, 0x43, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x1ce, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x20,
-0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x65, 0x65, 0x66, 0x61, 0x20, 0x79,
-0x61, 0x74, 0x69, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x259, 0x6c, 0xe1,
-0x14b, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x66,
-0x72, 0xe1, 0x14b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x6f, 0x6c, 0x61, 0x69, 0x20, 0x42, 0x45, 0x41, 0x43,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x20, 0x42, 0x45, 0x41, 0x43,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b, 0x439, 0x430, 0x20, 0x441, 0x43e, 0x43b,
-0x43a, 0x443, 0x43e, 0x431, 0x430, 0x439, 0x430, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b,
-0x439, 0x430, 0x20, 0x441, 0x43e, 0x43b, 0x43a, 0x443, 0x43e, 0x431, 0x430, 0x439, 0x430, 0x3b, 0x49, 0x68, 0x65, 0x6c, 0x61, 0x20,
-0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xa55e,
-0xa524, 0xa52b, 0xa569, 0x20, 0xa55c, 0xa55e, 0xa54c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4c, 0x61, 0x69, 0x62, 0x68, 0x69,
-0x79, 0x61, 0x20, 0x44, 0x61, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x25b, 0x6c, 0xe2, 0x14b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x73, 0x68, 0x69, 0x72, 0xe8, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x65, 0x6c, 0xe1, 0x14b, 0x20,
-0x43, 0x46, 0x41, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x62f, 0x6cc, 0x646, 0x627, 0x631, 0x6cc, 0x20, 0x639, 0x6ce, 0x631,
-0x627, 0x642, 0x6cc, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x695, 0x6cc, 0x627, 0x6b5, 0x6cc, 0x20, 0x626, 0x6ce, 0x631, 0x627,
-0x646, 0x6cc, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f,
-0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x61, 0x6a, 0x3b, 0x65, 0x75, 0x72, 0x61, 0x3b, 0x3b, 0x65,
-0x75, 0x72, 0x6f, 0x77, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x6cc, 0x631, 0x627,
-0x646, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x20, 0x631, 0x6cc,
-0x627, 0x644, 0x3b, 0x6e2f, 0x5e63, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e2f, 0x5e63, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70,
-0x70, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x69, 0x73, 0x6f, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e,
-0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x67, 0x61, 0x20, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70,
-0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x3b
+0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e,
+0x6f, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x6e, 0x6f,
+0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x67, 0x67,
+0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b,
+0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72,
+0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e,
+0x6f, 0x3b, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x72,
+0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x75, 0x20,
+0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x69, 0x20, 0x53,
+0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x45, 0x41, 0x43, 0x44, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x20, 0x47, 0x61, 0x6d,
+0x6d, 0x62, 0x69, 0x44, 0x6f, 0x6c, 0x61, 0x61, 0x72, 0x20, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x55,
+0x67, 0x69, 0x79, 0x79, 0x61, 0x20, 0x4d, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x4e, 0x61, 0x79, 0x72, 0x61, 0x61,
+0x20, 0x4e, 0x69, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x4c, 0x65, 0x77, 0x6f, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72,
+0x61, 0x61, 0x20, 0x4c, 0x69, 0x79, 0x6f, 0x6e, 0x43, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b,
+0x65, 0x6e, 0x79, 0x61, 0x4e, 0x6a, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x65, 0x65, 0x6c, 0x20, 0x4b, 0x65, 0x6e,
+0x79, 0x61, 0x4d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69,
+0x71, 0x75, 0x65, 0x44, 0x6f, 0x6c, 0x61, 0x20, 0x79, 0x61, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61,
+0x68, 0x65, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x73, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x2d30, 0x2d37,
+0x2d54, 0x2d49, 0x2d4e, 0x20, 0x2d4f, 0x20, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x61, 0x64, 0x72, 0x69, 0x6d, 0x20, 0x6e, 0x20,
+0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x41, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x41, 0x7a, 0x7a, 0x61, 0x79, 0x72, 0x69,
+0x3b, 0x3b, 0x41, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x6e, 0x20, 0x5a, 0x7a, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x3b, 0x3b,
+0x3b, 0x49, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x65, 0x6e, 0x20, 0x6e, 0x20, 0x5a, 0x7a, 0x61, 0x79, 0x65, 0x72, 0x45, 0x73,
+0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x53, 0x68, 0x69,
+0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x73,
+0x65, 0x66, 0x61, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x55, 0x53, 0x20, 0x13a0,
+0x13d5, 0x13b3, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x13a0, 0x13d5, 0x13b3, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x13a0, 0x13d5, 0x13b3,
+0x72, 0x6f, 0x75, 0x70, 0x69, 0x20, 0x6d, 0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x53, 0x68, 0x69, 0x6c, 0xed, 0x69,
+0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0xed, 0x61, 0x53, 0x69, 0x6c, 0x69,
+0x6e, 0x67, 0x69, 0x20, 0x65, 0x79, 0x61, 0x20, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x53, 0x6b, 0x75, 0x64, 0x75,
+0x20, 0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53,
+0x6b, 0x75, 0x64, 0x75, 0x20, 0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x53, 0x69, 0x6c,
+0x69, 0x6e, 0x67, 0x69, 0x74, 0x61, 0x62, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4e, 0x61, 0x6d, 0x69,
+0x62, 0x69, 0x61, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x69, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e,
+0xed, 0x20, 0x65, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20,
+0x65, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x53, 0x69, 0x72, 0x69, 0x6e, 0x6a, 0x69, 0x20, 0x79, 0x61,
+0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61,
+0x6e, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x41, 0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b,
+0x2019, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x41, 0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f,
+0x6b, 0x2019, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x43, 0x46, 0x41, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42, 0x43,
+0x45, 0x41, 0x4f, 0x29, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61,
+0x44, 0x65, 0x72, 0x68, 0x65, 0x6d, 0x20, 0x55, 0x6d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x69, 0x930, 0x93e, 0x902, 0x420, 0x43e,
+0x441, 0x441, 0x438, 0x439, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x43d, 0x20, 0x441,
+0x43e, 0x43c, 0x3b, 0x3b, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x43d, 0x20, 0x441, 0x43e, 0x44c, 0x43c, 0x430, 0x448,
+0x440, 0x461, 0x441, 0x441, 0x456, 0x301, 0x439, 0x441, 0x43a, 0x457, 0x439, 0x20, 0x440, 0xa64b, 0x301, 0x431, 0x43b, 0x44c, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x3b, 0x440, 0x461, 0x441, 0x441, 0x456, 0x301, 0x439, 0x441, 0x43a, 0x430, 0x433, 0x461, 0x20, 0x440, 0xa64b, 0x431,
+0x43b, 0x467, 0x300, 0x4e, 0x66, 0x61, 0x6c, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75,
+0x43, 0x46, 0x41, 0x20, 0x46, 0xe0, 0x6c, 0xe2, 0x14b, 0x20, 0x42, 0x45, 0x41, 0x43, 0x46, 0x72, 0x1ce, 0x14b, 0x20, 0x43,
+0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x73, 0x65, 0x65, 0x66, 0x61, 0x20, 0x79, 0x61, 0x74, 0x69, 0x20,
+0x42, 0x43, 0x45, 0x41, 0x4f, 0x46, 0x259, 0x6c, 0xe1, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43,
+0x29, 0x66, 0x72, 0xe1, 0x14b, 0x73, 0x6f, 0x6c, 0x61, 0x69, 0x20, 0x42, 0x45, 0x41, 0x43, 0x46, 0x72, 0x61, 0x14b, 0x20,
+0x43, 0x46, 0x41, 0x20, 0x42, 0x45, 0x41, 0x43, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b, 0x439, 0x430, 0x20, 0x441, 0x43e,
+0x43b, 0x43a, 0x443, 0x43e, 0x431, 0x430, 0x439, 0x430, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b,
+0x44b, 0x439, 0x430, 0x20, 0x441, 0x43e, 0x43b, 0x43a, 0x443, 0x43e, 0x431, 0x430, 0x439, 0x430, 0x49, 0x68, 0x65, 0x6c, 0x61, 0x20,
+0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x20, 0xa55c, 0xa55e, 0xa54c,
+0x4c, 0x61, 0x69, 0x62, 0x68, 0x69, 0x79, 0x61, 0x20, 0x44, 0x61, 0x6c, 0x61, 0x46, 0x25b, 0x6c, 0xe2, 0x14b, 0x73, 0x68,
+0x69, 0x72, 0xe8, 0x66, 0x65, 0x6c, 0xe1, 0x14b, 0x20, 0x43, 0x46, 0x41, 0xd804, 0xdd1d, 0xd804, 0xdd01, 0xd804, 0xdd23, 0xd804, 0xdd18,
+0xd804, 0xdd2c, 0xd804, 0xdd25, 0xd804, 0xdd28, 0x20, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd0b, 0x3b, 0x3b, 0xd804, 0xdd1d, 0xd804, 0xdd01, 0xd804,
+0xdd23, 0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd25, 0xd804, 0xdd28, 0x20, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd0b, 0x3b, 0x3b, 0x3b, 0x3b,
+0xd804, 0xdd1d, 0xd804, 0xdd01, 0xd804, 0xdd23, 0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd25, 0xd804, 0xdd28, 0x20, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804,
+0xdd0b, 0xd804, 0xdd03, 0xd804, 0xdd28, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd20, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x20,
+0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd28, 0x3b, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd28, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0xd804, 0xdd18,
+0xd804, 0xdd28, 0xd804, 0xdd20, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x20, 0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd28, 0x3b, 0x3b, 0x3b,
+0x3b, 0xd804, 0xdd03, 0xd804, 0xdd28, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd20, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x20,
+0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804, 0xdd1b, 0xd804, 0xdd28, 0x62f, 0x6cc, 0x646, 0x627, 0x631, 0x6cc, 0x20, 0x639, 0x6ce, 0x631, 0x627, 0x642,
+0x6cc, 0x695, 0x6cc, 0x627, 0x6b5, 0x6cc, 0x20, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0x6cc, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65,
+0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x65,
+0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x61, 0x6a, 0x3b, 0x65, 0x75, 0x72, 0x61,
+0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x77, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x3b, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x6e2f, 0x5e63, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
+0x3b, 0x6e2f, 0x5e63, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x69, 0x73, 0x6f, 0x3b, 0x3b,
+0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d,
+0x67, 0x61, 0x20, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f
};
-static const ushort currency_format_data[] = {
+static const char16_t currency_format_data[] = {
0x25, 0x31, 0x25, 0x32, 0x25, 0x32, 0x25, 0x31, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x28, 0x25, 0x32, 0x25, 0x31, 0x29, 0x25,
0x31, 0xa0, 0x25, 0x32, 0x28, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x29, 0x28, 0x25, 0x31, 0x25, 0x32, 0x29, 0x28, 0x25, 0x32,
0xa0, 0x25, 0x31, 0x29, 0x25, 0x32, 0x2d, 0x25, 0x31, 0x25, 0x32, 0x2212, 0x25, 0x31, 0x200e, 0x25, 0x32, 0xa0, 0x25, 0x31,
0x200e, 0x28, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x29, 0x25, 0x32, 0x2d, 0xa0, 0x25, 0x31
};
-static const ushort endonyms_data[] = {
+static const char16_t endonyms_data[] = {
0x4f, 0x72, 0x6f, 0x6d, 0x6f, 0x6f, 0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x4b, 0x65, 0x65, 0x6e,
0x69, 0x79, 0x61, 0x61, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66,
0x72, 0x69, 0x6b, 0x61, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0xeb, 0x73, 0x68, 0x71, 0x69, 0x70, 0x53, 0x68, 0x71, 0x69,
@@ -4249,271 +4191,267 @@ static const ushort endonyms_data[] = {
0x69, 0x48, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x61, 0x42, 0x6f, 0x73, 0x6e, 0x61, 0x20, 0x69, 0x20, 0x48, 0x65, 0x72,
0x63, 0x65, 0x67, 0x6f, 0x76, 0x69, 0x6e, 0x61, 0x10d, 0x65, 0x161, 0x74, 0x69, 0x6e, 0x61, 0x10c, 0x65, 0x73, 0x6b, 0x6f,
0x64, 0x61, 0x6e, 0x73, 0x6b, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x47, 0x72, 0xf8, 0x6e, 0x6c, 0x61, 0x6e, 0x64,
-0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x41,
-0x72, 0x75, 0x62, 0x61, 0x42, 0x65, 0x6c, 0x67, 0x69, 0xeb, 0x43, 0x75, 0x72, 0x61, 0xe7, 0x61, 0x6f, 0x53, 0x75, 0x72,
-0x69, 0x6e, 0x61, 0x6d, 0x65, 0x43, 0x61, 0x72, 0x69, 0x62, 0x69, 0x73, 0x63, 0x68, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72,
-0x6c, 0x61, 0x6e, 0x64, 0x53, 0x69, 0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53,
-0x74, 0x61, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e,
-0x20, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, 0x41, 0x6e, 0x74, 0x69, 0x67, 0x75,
-0x61, 0x20, 0x26, 0x20, 0x42, 0x61, 0x72, 0x62, 0x75, 0x64, 0x61, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
-0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x41, 0x75,
-0x73, 0x74, 0x72, 0x69, 0x61, 0x42, 0x61, 0x68, 0x61, 0x6d, 0x61, 0x73, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73,
-0x42, 0x65, 0x6c, 0x67, 0x69, 0x75, 0x6d, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61,
-0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x49, 0x6e, 0x64, 0x69,
-0x61, 0x6e, 0x20, 0x4f, 0x63, 0x65, 0x61, 0x6e, 0x20, 0x54, 0x65, 0x72, 0x72, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x75,
-0x72, 0x75, 0x6e, 0x64, 0x69, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x6f, 0x6e, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61,
-0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x43, 0x61, 0x79, 0x6d, 0x61,
-0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x20, 0x49,
-0x73, 0x6c, 0x61, 0x6e, 0x64, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x20, 0x28, 0x4b, 0x65, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x29,
-0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x43, 0x6f, 0x6f, 0x6b, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73,
-0x43, 0x79, 0x70, 0x72, 0x75, 0x73, 0x44, 0x65, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63,
-0x61, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c,
-0x61, 0x6e, 0x64, 0x73, 0x46, 0x69, 0x6a, 0x69, 0x46, 0x69, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x47, 0x75, 0x65, 0x72, 0x6e,
-0x73, 0x65, 0x79, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x79, 0x47, 0x68, 0x61, 0x6e,
-0x61, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x47, 0x75, 0x61,
-0x6d, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x53, 0x41, 0x52,
-0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x49, 0x72, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x49, 0x73,
-0x72, 0x61, 0x65, 0x6c, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4b, 0x69, 0x72, 0x69,
-0x62, 0x61, 0x74, 0x69, 0x4c, 0x65, 0x73, 0x6f, 0x74, 0x68, 0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x4d, 0x61,
-0x63, 0x61, 0x6f, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x4d, 0x61, 0x64, 0x61, 0x67, 0x61, 0x73,
-0x63, 0x61, 0x72, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x4d, 0x61, 0x6c,
-0x74, 0x61, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4d, 0x61,
-0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x4d, 0x6f, 0x6e,
-0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x4e,
-0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e,
-0x64, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x4e, 0x69, 0x75, 0x65, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x20,
-0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x61,
-0x6e, 0x61, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x50, 0x61,
-0x6c, 0x61, 0x75, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x50,
-0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x73, 0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0x20, 0x49,
-0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x20, 0x52, 0x69, 0x63, 0x6f, 0x52, 0x77, 0x61,
-0x6e, 0x64, 0x61, 0x53, 0x74, 0x20, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x20, 0x26, 0x20, 0x4e, 0x65, 0x76, 0x69, 0x73, 0x53,
-0x74, 0x20, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x53, 0x74, 0x20, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x26, 0x20,
-0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x53, 0x65, 0x79, 0x63, 0x68,
-0x65, 0x6c, 0x6c, 0x65, 0x73, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x53, 0x69, 0x6e,
-0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69, 0x61, 0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f,
-0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63,
-0x61, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x45, 0x73, 0x77, 0x61, 0x74,
-0x69, 0x6e, 0x69, 0x53, 0x77, 0x65, 0x64, 0x65, 0x6e, 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64,
-0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x54, 0x6f, 0x6b, 0x65, 0x6c, 0x61, 0x75, 0x54, 0x6f, 0x6e, 0x67, 0x61,
-0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x54, 0x75, 0x72,
-0x6b, 0x73, 0x20, 0x26, 0x20, 0x43, 0x61, 0x69, 0x63, 0x6f, 0x73, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x54,
-0x75, 0x76, 0x61, 0x6c, 0x75, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x41, 0x72,
-0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x45,
-0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b, 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d,
-0x55, 0x2e, 0x53, 0x2e, 0x20, 0x4f, 0x75, 0x74, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64,
-0x73, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x56, 0x69, 0x72, 0x67,
-0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x56, 0x69, 0x72, 0x67, 0x69,
-0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x5a, 0x69, 0x6d, 0x62, 0x61,
-0x62, 0x77, 0x65, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x47, 0x61, 0x72, 0x63, 0x69, 0x61, 0x49, 0x73, 0x6c, 0x65, 0x20,
-0x6f, 0x66, 0x20, 0x4d, 0x61, 0x6e, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75,
-0x64, 0x61, 0x6e, 0x53, 0x69, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e, 0x57, 0x6f, 0x72, 0x6c, 0x64,
-0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x65, 0x73, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x74, 0x6f, 0x4d, 0x6f, 0x6e, 0x64, 0x6f,
-0x65, 0x65, 0x73, 0x74, 0x69, 0x45, 0x65, 0x73, 0x74, 0x69, 0x66, 0xf8, 0x72, 0x6f, 0x79, 0x73, 0x6b, 0x74, 0x46, 0xf8,
-0x72, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x75, 0x6f, 0x6d, 0x69, 0x53, 0x75, 0x6f, 0x6d, 0x69, 0x66, 0x72, 0x61, 0x6e, 0xe7,
-0x61, 0x69, 0x73, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x42, 0x65, 0x6c, 0x67,
-0x69, 0x71, 0x75, 0x65, 0x42, 0xe9, 0x6e, 0x69, 0x6e, 0x42, 0x75, 0x72, 0x6b, 0x69, 0x6e, 0x61, 0x20, 0x46, 0x61, 0x73,
-0x6f, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x75, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x20, 0x63, 0x61,
-0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x52, 0xe9, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x71, 0x75, 0x65, 0x20, 0x63, 0x65, 0x6e,
-0x74, 0x72, 0x61, 0x66, 0x72, 0x69, 0x63, 0x61, 0x69, 0x6e, 0x65, 0x54, 0x63, 0x68, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x6f,
-0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x43, 0x6f, 0x6e,
-0x67, 0x6f, 0x2d, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x43, 0xf4, 0x74, 0x65, 0x20, 0x64,
-0x2019, 0x49, 0x76, 0x6f, 0x69, 0x72, 0x65, 0x44, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x47, 0x75, 0x69, 0x6e, 0xe9,
-0x65, 0x20, 0xe9, 0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x65, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x65, 0x20,
-0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x79, 0x6e, 0xe9, 0x73, 0x69, 0x65, 0x20, 0x66,
-0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x47, 0x61, 0x62, 0x6f, 0x6e, 0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f,
-0x75, 0x70, 0x65, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x48, 0x61, 0xef, 0x74, 0x69, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62,
-0x6f, 0x75, 0x72, 0x67, 0x4d, 0x61, 0x6c, 0x69, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4d, 0x61,
-0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x79, 0x6f, 0x74,
-0x74, 0x65, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x4d, 0x61, 0x72, 0x6f, 0x63, 0x4e, 0x6f, 0x75, 0x76, 0x65, 0x6c, 0x6c,
-0x65, 0x2d, 0x43, 0x61, 0x6c, 0xe9, 0x64, 0x6f, 0x6e, 0x69, 0x65, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x4c, 0x61, 0x20, 0x52,
-0xe9, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x53, 0xe9, 0x6e, 0xe9, 0x67, 0x61, 0x6c, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x50,
-0x69, 0x65, 0x72, 0x72, 0x65, 0x2d, 0x65, 0x74, 0x2d, 0x4d, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x6f, 0x6e, 0x66, 0x72, 0x61,
-0x6e, 0xe7, 0x61, 0x69, 0x73, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x79,
-0x72, 0x69, 0x65, 0x54, 0x6f, 0x67, 0x6f, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73,
-0x2d, 0x65, 0x74, 0x2d, 0x46, 0x75, 0x74, 0x75, 0x6e, 0x61, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x42, 0x61, 0x72, 0x74,
-0x68, 0xe9, 0x6c, 0x65, 0x6d, 0x79, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x46, 0x72,
-0x79, 0x73, 0x6b, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0xe2, 0x6e, 0x47, 0xe0, 0x69, 0x64, 0x68, 0x6c, 0x69, 0x67, 0x41,
-0x6e, 0x20, 0x52, 0xec, 0x6f, 0x67, 0x68, 0x61, 0x63, 0x68, 0x64, 0x20, 0x41, 0x6f, 0x6e, 0x61, 0x69, 0x63, 0x68, 0x74,
-0x65, 0x67, 0x61, 0x6c, 0x65, 0x67, 0x6f, 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8,
-0x10e1, 0x10d0, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10d5, 0x10d4, 0x10da, 0x10dd, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x44, 0x65, 0x75,
-0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0xd6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x69, 0x63, 0x68, 0x69, 0x73,
-0x63, 0x68, 0x65, 0x73, 0x20, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0xd6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x69,
-0x63, 0x68, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x65, 0x6e, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x65, 0x6e, 0x4c, 0x69, 0x65, 0x63,
-0x68, 0x74, 0x65, 0x6e, 0x73, 0x74, 0x65, 0x69, 0x6e, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x75, 0x72, 0x67, 0x53, 0x63,
-0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x48, 0x6f, 0x63, 0x68, 0x64, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x53,
-0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x395, 0x3bb, 0x3bb, 0x3b7, 0x3bd, 0x3b9, 0x3ba, 0x3ac, 0x395, 0x3bb, 0x3bb, 0x3ac, 0x3b4, 0x3b1,
-0x39a, 0x3cd, 0x3c0, 0x3c1, 0x3bf, 0x3c2, 0x6b, 0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x75, 0x74, 0x4b, 0x61, 0x6c,
-0x61, 0x61, 0x6c, 0x6c, 0x69, 0x74, 0x20, 0x4e, 0x75, 0x6e, 0x61, 0x61, 0x74, 0xa97, 0xac1, 0xa9c, 0xab0, 0xabe, 0xaa4, 0xac0,
-0xaad, 0xabe, 0xab0, 0xaa4, 0x48, 0x61, 0x75, 0x73, 0x61, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x47, 0x61, 0x6e,
-0x61, 0x4e, 0x69, 0x6a, 0x61, 0x72, 0x5e2, 0x5d1, 0x5e8, 0x5d9, 0x5ea, 0x5d9, 0x5e9, 0x5e8, 0x5d0, 0x5dc, 0x939, 0x93f, 0x928, 0x94d,
-0x926, 0x940, 0x92d, 0x93e, 0x930, 0x924, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x4d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x6f, 0x72,
-0x73, 0x7a, 0xe1, 0x67, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0xcd, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x49, 0x6e,
-0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x75, 0x61, 0x4d, 0x75,
-0x6e, 0x64, 0x6f, 0x47, 0x61, 0x65, 0x69, 0x6c, 0x67, 0x65, 0xc9, 0x69, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x52, 0xed, 0x6f,
-0x63, 0x68, 0x74, 0x20, 0x41, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x74, 0x68, 0x65, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e,
-0x6f, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x53, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x53, 0x76, 0x69,
-0x7a, 0x7a, 0x65, 0x72, 0x61, 0x43, 0x69, 0x74, 0x74, 0xe0, 0x20, 0x64, 0x65, 0x6c, 0x20, 0x56, 0x61, 0x74, 0x69, 0x63,
-0x61, 0x6e, 0x6f, 0x65e5, 0x672c, 0x8a9e, 0x65e5, 0x672c, 0x4a, 0x61, 0x77, 0x61, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0xe9, 0x73, 0x69,
-0x61, 0xc95, 0xca8, 0xccd, 0xca8, 0xca1, 0xcad, 0xcbe, 0xcb0, 0xca4, 0x6a9, 0x672, 0x634, 0x64f, 0x631, 0x6c1, 0x650, 0x646, 0x62f, 0x648,
-0x633, 0x62a, 0x627, 0x646, 0x49b, 0x430, 0x437, 0x430, 0x49b, 0x20, 0x442, 0x456, 0x43b, 0x456, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441,
-0x442, 0x430, 0x43d, 0x4b, 0x69, 0x6e, 0x79, 0x61, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x55, 0x20, 0x52, 0x77, 0x61, 0x6e,
-0x64, 0x61, 0x43a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x447, 0x430, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d,
-0xd55c, 0xad6d, 0xc5b4, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0xc870, 0xc120, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0xc778, 0xbbfc, 0xacf5, 0xd654, 0xad6d, 0x6b, 0x75,
-0x72, 0x64, 0xee, 0x54, 0x69, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x49, 0x6b, 0x69, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x55, 0x62,
-0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0xea5, 0xeb2, 0xea7, 0x6c, 0x61, 0x74, 0x76, 0x69, 0x65, 0x161, 0x75, 0x4c, 0x61, 0x74,
-0x76, 0x69, 0x6a, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0xe1, 0x6c, 0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0xed, 0x6b, 0x69,
-0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0xf3, 0x20, 0x44, 0x65, 0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x74, 0xed, 0x6b,
-0x69, 0x41, 0x6e, 0x67, 0xf3, 0x6c, 0x61, 0x52, 0x65, 0x70, 0x69, 0x62, 0x69, 0x6b, 0x69, 0x20, 0x79, 0x61, 0x20, 0x41,
-0x66, 0x72, 0xed, 0x6b, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0xe1, 0x74, 0x69, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x69,
-0x65, 0x74, 0x75, 0x76, 0x69, 0x173, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x61, 0x43c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d,
-0x441, 0x43a, 0x438, 0x421, 0x435, 0x432, 0x435, 0x440, 0x43d, 0x430, 0x20, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x438, 0x458,
-0x430, 0x4d, 0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x4d, 0x61, 0x64, 0x61, 0x67, 0x61, 0x73, 0x69, 0x6b, 0x61, 0x72,
-0x61, 0x4d, 0x65, 0x6c, 0x61, 0x79, 0x75, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75,
-0x72, 0x61, 0xd2e, 0xd32, 0xd2f, 0xd3e, 0xd33, 0xd02, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0x4d, 0x61, 0x6c, 0x74, 0x69, 0x4d,
-0x101, 0x6f, 0x72, 0x69, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61, 0x92e, 0x930, 0x93e, 0x920, 0x940, 0x43c, 0x43e, 0x43d,
-0x433, 0x43e, 0x43b, 0x41c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x928, 0x947, 0x92a, 0x93e, 0x932,
-0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x62, 0x6f, 0x6b, 0x6d, 0xe5, 0x6c, 0x4e, 0x6f, 0x72, 0x67, 0x65, 0x53, 0x76, 0x61,
-0x6c, 0x62, 0x61, 0x72, 0x64, 0x20, 0x6f, 0x67, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x79, 0x65, 0x6e, 0xb13, 0xb21,
-0xb3c, 0xb3f, 0xb06, 0xb2d, 0xb3e, 0xb30, 0xb24, 0x67e, 0x69a, 0x62a, 0x648, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646,
-0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x641, 0x627, 0x631, 0x633, 0x6cc, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x62f, 0x631, 0x6cc,
-0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x50, 0x6f, 0x6c, 0x73, 0x6b, 0x61, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea,
-0x73, 0x42, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x41, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x43, 0x61, 0x62, 0x6f, 0x20, 0x56, 0x65,
-0x72, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x6f, 0x72, 0x2d, 0x4c, 0x65, 0x73, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x20,
-0x45, 0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x2d, 0x42, 0x69, 0x73, 0x73,
-0x61, 0x75, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x75, 0x72, 0x67, 0x6f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x2c, 0x20, 0x52,
-0x41, 0x45, 0x20, 0x64, 0x61, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75,
-0x65, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea, 0x73, 0x20, 0x65, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x75, 0x50, 0x6f,
-0x72, 0x74, 0x75, 0x67, 0x61, 0x6c, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed,
-0x6e, 0x63, 0x69, 0x70, 0x65, 0x53, 0x75, 0xed, 0xe7, 0x61, 0xa2a, 0xa70, 0xa1c, 0xa3e, 0xa2c, 0xa40, 0xa2d, 0xa3e, 0xa30, 0xa24,
-0x67e, 0x646, 0x62c, 0x627, 0x628, 0x6cc, 0x52, 0x75, 0x6e, 0x61, 0x73, 0x69, 0x6d, 0x69, 0x50, 0x65, 0x72, 0xfa, 0x42, 0x6f,
-0x6c, 0x69, 0x76, 0x69, 0x61, 0x45, 0x63, 0x75, 0x61, 0x64, 0x6f, 0x72, 0x72, 0x75, 0x6d, 0x61, 0x6e, 0x74, 0x73, 0x63,
-0x68, 0x53, 0x76, 0x69, 0x7a, 0x72, 0x61, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x103, 0x52, 0x6f, 0x6d, 0xe2, 0x6e, 0x69, 0x61,
-0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x20, 0x4d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x61, 0x440, 0x443, 0x441,
-0x441, 0x43a, 0x438, 0x439, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x44f, 0x41a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x442, 0x430, 0x43d, 0x41a,
-0x438, 0x440, 0x433, 0x438, 0x437, 0x438, 0x44f, 0x41c, 0x43e, 0x43b, 0x434, 0x43e, 0x432, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x438, 0x43d,
-0x430, 0x53, 0xe4, 0x6e, 0x67, 0xf6, 0x4b, 0xf6, 0x64, 0xf6, 0x72, 0xf6, 0x73, 0xea, 0x73, 0x65, 0x20, 0x74, 0xee, 0x20,
-0x42, 0xea, 0x61, 0x66, 0x72, 0xee, 0x6b, 0x61, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x421, 0x440, 0x431, 0x438, 0x458, 0x430,
-0x411, 0x43e, 0x441, 0x43d, 0x430, 0x20, 0x438, 0x20, 0x425, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x438, 0x43d, 0x430, 0x426,
-0x440, 0x43d, 0x430, 0x20, 0x413, 0x43e, 0x440, 0x430, 0x41a, 0x43e, 0x441, 0x43e, 0x432, 0x43e, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69,
-0x43, 0x72, 0x6e, 0x61, 0x20, 0x47, 0x6f, 0x72, 0x61, 0x53, 0x72, 0x62, 0x69, 0x6a, 0x61, 0x4b, 0x6f, 0x73, 0x6f, 0x76,
-0x6f, 0x438, 0x440, 0x43e, 0x43d, 0x413, 0x443, 0x44b, 0x440, 0x434, 0x437, 0x44b, 0x441, 0x442, 0x43e, 0x43d, 0x423, 0x4d5, 0x440, 0x4d5,
-0x441, 0x435, 0x63, 0x68, 0x69, 0x53, 0x68, 0x6f, 0x6e, 0x61, 0x633, 0x646, 0x68c, 0x64a, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627,
-0x646, 0xdc3, 0xdd2, 0xd82, 0xdc4, 0xdbd, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0xdc0, 0x73, 0x6c, 0x6f,
-0x76, 0x65, 0x6e, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x6f, 0x73, 0x6c, 0x6f, 0x76,
-0x65, 0x6e, 0x161, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69, 0x6a, 0x61, 0x53, 0x6f, 0x6f, 0x6d,
-0x61, 0x61, 0x6c, 0x69, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74,
-0x69, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x69, 0x79, 0x61, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20,
-0x45, 0x73, 0x70, 0x61, 0xf1, 0x61, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69,
-0x6e, 0x61, 0x42, 0x65, 0x6c, 0x69, 0x63, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69,
-0x61, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x20, 0x52, 0x69, 0x63, 0x61, 0x43, 0x75, 0x62, 0x61, 0x52, 0x65, 0x70, 0xfa, 0x62,
-0x6c, 0x69, 0x63, 0x61, 0x20, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x45, 0x6c, 0x20, 0x53, 0x61,
-0x6c, 0x76, 0x61, 0x64, 0x6f, 0x72, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x20, 0x45, 0x63, 0x75, 0x61, 0x74, 0x6f, 0x72,
-0x69, 0x61, 0x6c, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x48, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x61, 0x73,
-0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f, 0x4d, 0xe9, 0x78,
-0x69, 0x63, 0x6f, 0x4e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0xe1, 0x50, 0x61,
-0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x46, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x45, 0x73, 0x74, 0x61, 0x64,
-0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x55, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x56, 0x65, 0x6e, 0x65,
-0x7a, 0x75, 0x65, 0x6c, 0x61, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x61, 0x73, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c,
-0x20, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x6f, 0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x4c, 0x61, 0x74, 0x69,
-0x6e, 0x6f, 0x61, 0x6d, 0xe9, 0x72, 0x69, 0x63, 0x61, 0x43, 0x65, 0x75, 0x74, 0x61, 0x20, 0x79, 0x20, 0x4d, 0x65, 0x6c,
-0x69, 0x6c, 0x6c, 0x61, 0x4b, 0x69, 0x73, 0x77, 0x61, 0x68, 0x69, 0x6c, 0x69, 0x4a, 0x61, 0x6d, 0x68, 0x75, 0x72, 0x69,
-0x20, 0x79, 0x61, 0x20, 0x4b, 0x69, 0x64, 0x65, 0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x73, 0x69, 0x61, 0x20, 0x79, 0x61, 0x20,
-0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x53, 0x76, 0x65, 0x72, 0x69, 0x67, 0x65, 0xc5,
-0x6c, 0x61, 0x6e, 0x64, 0x442, 0x43e, 0x4b7, 0x438, 0x43a, 0x4e3, 0x422, 0x43e, 0x4b7, 0x438, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d,
-0xba4, 0xbae, 0xbbf, 0xbb4, 0xbcd, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0xbbe, 0xbae, 0xbb2, 0xbc7, 0xb9a, 0xbbf, 0xbaf, 0xbbe, 0xb9a,
-0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x442, 0x430, 0x442, 0x430,
-0x440, 0xc24, 0xc46, 0xc32, 0xc41, 0xc17, 0xc41, 0xc2d, 0xc3e, 0xc30, 0xc24, 0xc26, 0xc47, 0xc36, 0xc02, 0xe44, 0xe17, 0xe22, 0xf56, 0xf7c,
-0xf51, 0xf0b, 0xf66, 0xf90, 0xf51, 0xf0b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf53, 0xf42, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0x1275,
-0x130d, 0x122d, 0x129b, 0x12a4, 0x122d, 0x1275, 0x122b, 0x6c, 0x65, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61, 0x74, 0x6f, 0x6e, 0x67, 0x61,
-0x54, 0xfc, 0x72, 0x6b, 0xe7, 0x65, 0x54, 0xfc, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x4b, 0x131, 0x62, 0x72, 0x131, 0x73, 0x74,
-0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x64, 0x69, 0x6c, 0x69, 0x54, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x69, 0x73,
-0x74, 0x61, 0x6e, 0x626, 0x6c7, 0x64a, 0x63a, 0x6c7, 0x631, 0x686, 0x6d5, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x443, 0x43a, 0x440, 0x430,
-0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x430, 0x627, 0x631, 0x62f, 0x648, 0x628, 0x6be, 0x627,
-0x631, 0x62a, 0x6f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x4f, 0x2bb, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x627,
-0x648, 0x632, 0x628, 0x6cc, 0x6a9, 0x45e, 0x437, 0x431, 0x435, 0x43a, 0x447, 0x430, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442,
-0x43e, 0x43d, 0x54, 0x69, 0x1ebf, 0x6e, 0x67, 0x20, 0x56, 0x69, 0x1ec7, 0x74, 0x56, 0x69, 0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d,
-0x56, 0x6f, 0x6c, 0x61, 0x70, 0xfc, 0x6b, 0x43, 0x79, 0x6d, 0x72, 0x61, 0x65, 0x67, 0x59, 0x20, 0x44, 0x65, 0x79, 0x72,
-0x6e, 0x61, 0x73, 0x20, 0x55, 0x6e, 0x65, 0x64, 0x69, 0x67, 0x57, 0x6f, 0x6c, 0x6f, 0x66, 0x53, 0x65, 0x6e, 0x65, 0x67,
-0x61, 0x61, 0x6c, 0x69, 0x73, 0x69, 0x58, 0x68, 0x6f, 0x73, 0x61, 0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x74, 0x73, 0x69, 0x20,
-0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x5d9, 0x5d9, 0x5b4, 0x5d3, 0x5d9, 0x5e9, 0x5d5, 0x5d5, 0x5e2, 0x5dc, 0x5d8, 0xc8, 0x64, 0xe8,
-0x20, 0x59, 0x6f, 0x72, 0xf9, 0x62, 0xe1, 0x4f, 0x72, 0x69, 0x6c, 0x1eb9, 0x300, 0x2d, 0xe8, 0x64, 0xe8, 0x20, 0x4e, 0xe0,
-0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x4f, 0x72, 0xed, 0x6c, 0x25b, 0x301, 0xe8, 0x64, 0x65, 0x20, 0x42, 0x25b, 0x300, 0x6e,
-0x25b, 0x300, 0x69, 0x73, 0x69, 0x5a, 0x75, 0x6c, 0x75, 0x69, 0x4e, 0x69, 0x6e, 0x67, 0x69, 0x7a, 0x69, 0x6d, 0x75, 0x20,
-0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x6e, 0x79, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x4e, 0x6f, 0x72, 0x65, 0x67, 0x62, 0x6f,
-0x73, 0x61, 0x6e, 0x73, 0x6b, 0x69, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x438, 0x47, 0x61, 0x65, 0x6c, 0x67, 0x45,
-0x6c, 0x6c, 0x61, 0x6e, 0x20, 0x56, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x77, 0x65, 0x6b, 0x52,
-0x79, 0x77, 0x76, 0x61, 0x6e, 0x65, 0x74, 0x68, 0x20, 0x55, 0x6e, 0x79, 0x73, 0x41, 0x6b, 0x61, 0x6e, 0x47, 0x61, 0x61,
-0x6e, 0x61, 0x915, 0x94b, 0x902, 0x915, 0x923, 0x940, 0x41, 0x73, 0x1ee5, 0x73, 0x1ee5, 0x20, 0x49, 0x67, 0x62, 0x6f, 0x4e, 0x61,
-0x1ecb, 0x6a, 0x1ecb, 0x72, 0x1ecb, 0x61, 0x4b, 0x69, 0x6b, 0x61, 0x6d, 0x62, 0x61, 0x66, 0x75, 0x72, 0x6c, 0x61, 0x6e, 0x49,
-0x74, 0x61, 0x6c, 0x69, 0x65, 0x45, 0x28b, 0x65, 0x67, 0x62, 0x65, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x6e, 0x75, 0x74,
-0x6f, 0x6d, 0x65, 0x54, 0x6f, 0x67, 0x6f, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65, 0x2bb, 0x14c, 0x6c, 0x65, 0x6c, 0x6f,
-0x20, 0x48, 0x61, 0x77, 0x61, 0x69, 0x2bb, 0x69, 0x2bb, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x75, 0x69,
-0x20, 0x50, 0x16b, 0x20, 0x2bb, 0x49, 0x61, 0x46, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x50, 0x69, 0x6c, 0x69, 0x70,
-0x69, 0x6e, 0x61, 0x73, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x74, 0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68,
-0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x72, 0x69, 0x69, 0x63, 0x68, 0x4c, 0x69, 0xe4,
-0x63, 0x68, 0x74, 0x65, 0x73, 0x63, 0x68, 0x74, 0xe4, 0x69, 0xa188, 0xa320, 0xa259, 0xa34f, 0xa1e9, 0x4e, 0x65, 0x64, 0x64, 0x65,
-0x72, 0x73, 0x61, 0x73, 0x73, 0x2019, 0x73, 0x63, 0x68, 0x44, 0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64,
-0x4e, 0x65, 0x64, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x6e, 0x64, 0x61, 0x76, 0x76, 0x69, 0x73, 0xe1, 0x6d,
-0x65, 0x67, 0x69, 0x65, 0x6c, 0x6c, 0x61, 0x4e, 0x6f, 0x72, 0x67, 0x61, 0x53, 0x75, 0x6f, 0x70, 0x6d, 0x61, 0x52, 0x75,
-0x6f, 0x167, 0x167, 0x61, 0x45, 0x6b, 0x65, 0x67, 0x75, 0x73, 0x69, 0x69, 0x4b, 0x69, 0x74, 0x61, 0x69, 0x74, 0x61, 0x50,
-0x75, 0x6c, 0x61, 0x61, 0x72, 0x42, 0x75, 0x72, 0x6b, 0x69, 0x62, 0x61, 0x61, 0x20, 0x46, 0x61, 0x61, 0x73, 0x6f, 0x4b,
-0x61, 0x6d, 0x65, 0x72, 0x75, 0x75, 0x6e, 0x47, 0x61, 0x6d, 0x6d, 0x62, 0x69, 0x47, 0x61, 0x6e, 0x61, 0x61, 0x47, 0x69,
-0x6e, 0x65, 0x47, 0x69, 0x6e, 0x65, 0x2d, 0x42, 0x69, 0x73, 0x61, 0x61, 0x77, 0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69,
-0x79, 0x61, 0x61, 0x4d, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x4e, 0x69, 0x6a, 0x65, 0x65, 0x72, 0x4e, 0x69, 0x6a,
-0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x53, 0x65, 0x72, 0x61, 0x61, 0x20, 0x6c, 0x69, 0x79, 0x6f, 0x6e, 0x47, 0x69, 0x6b,
-0x75, 0x79, 0x75, 0x4b, 0x69, 0x73, 0x61, 0x6d, 0x70, 0x75, 0x72, 0x73, 0x65, 0x6e, 0x61, 0x69, 0x73, 0x69, 0x4e, 0x64,
-0x65, 0x62, 0x65, 0x6c, 0x65, 0x4b, 0x69, 0x68, 0x6f, 0x72, 0x6f, 0x6d, 0x62, 0x6f, 0x2d5c, 0x2d30, 0x2d5b, 0x2d4d, 0x2d43, 0x2d49,
-0x2d5c, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x54, 0x61, 0x73, 0x68, 0x65, 0x6c, 0x1e25, 0x69, 0x79, 0x74, 0x6c, 0x6d, 0x263,
-0x72, 0x69, 0x62, 0x54, 0x61, 0x71, 0x62, 0x61, 0x79, 0x6c, 0x69, 0x74, 0x4c, 0x65, 0x7a, 0x7a, 0x61, 0x79, 0x65, 0x72,
-0x52, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x6b, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x62, 0x65, 0x6e, 0x61, 0x48, 0x75, 0x74, 0x61,
-0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x4b, 0x79, 0x69, 0x76, 0x75, 0x6e, 0x6a, 0x6f, 0x62, 0x61, 0x6d, 0x61, 0x6e, 0x61,
-0x6b, 0x61, 0x6e, 0x4b, 0x129, 0x65, 0x6d, 0x62, 0x75, 0x13e3, 0x13b3, 0x13a9, 0x13cc, 0x13ca, 0x20, 0x13a2, 0x13f3, 0x13be, 0x13b5, 0x13cd,
-0x13d4, 0x13c5, 0x20, 0x13cd, 0x13a6, 0x13da, 0x13a9, 0x6b, 0x72, 0x65, 0x6f, 0x6c, 0x20, 0x6d, 0x6f, 0x72, 0x69, 0x73, 0x69, 0x65,
-0x6e, 0x4d, 0x6f, 0x72, 0x69, 0x73, 0x43, 0x68, 0x69, 0x6d, 0x61, 0x6b, 0x6f, 0x6e, 0x64, 0x65, 0x4b, 0x268, 0x6c, 0x61,
-0x61, 0x6e, 0x67, 0x69, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0xed, 0x61, 0x4c, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61,
-0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x49, 0x63, 0x68, 0x69, 0x62, 0x65, 0x6d, 0x62, 0x61, 0x6b, 0x61, 0x62, 0x75,
-0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x4b, 0x61, 0x62, 0x75, 0x20, 0x56, 0x65, 0x72, 0x64, 0x69, 0x4b, 0x129,
-0x6d, 0x129, 0x72, 0x169, 0x4b, 0x61, 0x6c, 0x65, 0x6e, 0x6a, 0x69, 0x6e, 0x45, 0x6d, 0x65, 0x74, 0x61, 0x62, 0x20, 0x4b,
-0x65, 0x6e, 0x79, 0x61, 0x4b, 0x68, 0x6f, 0x65, 0x6b, 0x68, 0x6f, 0x65, 0x67, 0x6f, 0x77, 0x61, 0x62, 0x4e, 0x61, 0x6d,
-0x69, 0x62, 0x69, 0x61, 0x62, 0x4b, 0x69, 0x6d, 0x61, 0x63, 0x68, 0x61, 0x6d, 0x65, 0x4b, 0xf6, 0x6c, 0x73, 0x63, 0x68,
-0x44, 0x6f, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0x4d, 0x61, 0x61, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e,
-0x69, 0x61, 0x4f, 0x6c, 0x75, 0x73, 0x6f, 0x67, 0x61, 0x4c, 0x75, 0x6c, 0x75, 0x68, 0x69, 0x61, 0x4b, 0x69, 0x70, 0x61,
-0x72, 0x65, 0x54, 0x61, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x4b, 0x69, 0x74, 0x65, 0x73, 0x6f, 0x4b, 0x65, 0x6e, 0x69,
-0x61, 0x4b, 0x6f, 0x79, 0x72, 0x61, 0x20, 0x63, 0x69, 0x69, 0x6e, 0x69, 0x4d, 0x61, 0x61, 0x6c, 0x69, 0x4b, 0x69, 0x72,
-0x75, 0x77, 0x61, 0x44, 0x68, 0x6f, 0x6c, 0x75, 0x6f, 0x52, 0x75, 0x6b, 0x69, 0x67, 0x61, 0x54, 0x61, 0x6d, 0x61, 0x7a,
-0x69, 0x263, 0x74, 0x20, 0x6e, 0x20, 0x6c, 0x61, 0x1e6d, 0x6c, 0x61, 0x1e63, 0x4d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x4b, 0x6f,
-0x79, 0x72, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69, 0x4b, 0x69, 0x73, 0x68, 0x61, 0x6d, 0x62,
-0x61, 0x61, 0x92c, 0x921, 0x93c, 0x94b, 0x43d, 0x43e, 0x445, 0x447, 0x438, 0x439, 0x43d, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x446, 0x435,
-0x440, 0x43a, 0x43e, 0x432, 0x43d, 0x43e, 0x441, 0x43b, 0x43e, 0x432, 0x435, 0x301, 0x43d, 0x441, 0x43a, 0x457, 0x439, 0x440, 0x461, 0x441,
-0x441, 0x456, 0x301, 0x430, 0x54, 0x73, 0x68, 0x69, 0x6c, 0x75, 0x62, 0x61, 0x44, 0x69, 0x74, 0x75, 0x6e, 0x67, 0x61, 0x20,
-0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75, 0x4c, 0xeb, 0x74, 0x7a, 0x65, 0x62, 0x75, 0x65, 0x72, 0x67, 0x65, 0x73,
-0x63, 0x68, 0x4c, 0xeb, 0x74, 0x7a, 0x65, 0x62, 0x75, 0x65, 0x72, 0x67, 0x41, 0x67, 0x68, 0x65, 0x6d, 0x4b, 0xe0, 0x6d,
-0xe0, 0x6c, 0xfb, 0x14b, 0x181, 0xe0, 0x73, 0xe0, 0x61, 0x4b, 0xe0, 0x6d, 0x25b, 0x300, 0x72, 0xfb, 0x6e, 0x5a, 0x61, 0x72,
-0x6d, 0x61, 0x63, 0x69, 0x69, 0x6e, 0x65, 0x4e, 0x69, 0x17e, 0x65, 0x72, 0x64, 0x75, 0xe1, 0x6c, 0xe1, 0x6a, 0x6f, 0x6f,
-0x6c, 0x61, 0x53, 0x65, 0x6e, 0x65, 0x67, 0x61, 0x6c, 0x65, 0x77, 0x6f, 0x6e, 0x64, 0x6f, 0x4b, 0x61, 0x6d, 0x259, 0x72,
-0xfa, 0x6e, 0x72, 0x69, 0x6b, 0x70, 0x61, 0x6b, 0x61, 0x6d, 0x25b, 0x72, 0xfa, 0x6e, 0x4d, 0x61, 0x6b, 0x75, 0x61, 0x55,
-0x6d, 0x6f, 0x7a, 0x61, 0x6d, 0x62, 0x69, 0x6b, 0x69, 0x4d, 0x55, 0x4e, 0x44, 0x41, 0x14a, 0x6b, 0x61, 0x6d, 0x65, 0x72,
-0x75, 0x14b, 0x4b, 0x77, 0x61, 0x73, 0x69, 0x6f, 0x4b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x6e, 0x54, 0x68, 0x6f, 0x6b, 0x20,
-0x4e, 0x61, 0x74, 0x68, 0x441, 0x430, 0x445, 0x430, 0x20, 0x442, 0x44b, 0x43b, 0x430, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b,
-0x439, 0x430, 0x49, 0x73, 0x68, 0x69, 0x73, 0x61, 0x6e, 0x67, 0x75, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61,
-0x54, 0x61, 0x73, 0x61, 0x77, 0x61, 0x71, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69, 0xa559, 0xa524, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x56,
-0x61, 0x69, 0x4c, 0x61, 0x69, 0x62, 0x68, 0x69, 0x79, 0x61, 0x57, 0x61, 0x6c, 0x73, 0x65, 0x72, 0x53, 0x63, 0x68, 0x77,
-0x69, 0x7a, 0x6e, 0x75, 0x61, 0x73, 0x75, 0x65, 0x4b, 0x65, 0x6d, 0x65, 0x6c, 0xfa, 0x6e, 0x61, 0x73, 0x74, 0x75, 0x72,
-0x69, 0x61, 0x6e, 0x75, 0x4e, 0x64, 0x61, 0xa78c, 0x61, 0x4b, 0x61, 0x6d, 0x25b, 0x6c, 0xfb, 0x6e, 0x6b, 0x61, 0x6b, 0x254,
-0x4b, 0x61, 0x6d, 0x25b, 0x72, 0x75, 0x6e, 0x6d, 0x65, 0x74, 0x61, 0x2bc, 0x4b, 0x61, 0x6d, 0x61, 0x6c, 0x75, 0x6e, 0x53,
-0x68, 0x77, 0xf3, 0x14b, 0xf2, 0x20, 0x6e, 0x67, 0x69, 0x65, 0x6d, 0x62, 0x254, 0x254, 0x6e, 0x4b, 0xe0, 0x6d, 0x61, 0x6c,
-0xfb, 0x6d, 0x4c, 0x61, 0x6b, 0x21f, 0xf3, 0x6c, 0x2bc, 0x69, 0x79, 0x61, 0x70, 0x69, 0x4d, 0xed, 0x6c, 0x61, 0x68, 0x61,
-0x14b, 0x73, 0x6b, 0x61, 0x20, 0x54, 0x21f, 0x61, 0x6d, 0xe1, 0x6b, 0x21f, 0x6f, 0x10d, 0x68, 0x65, 0x2d5c, 0x2d30, 0x2d4e, 0x2d30,
-0x2d63, 0x2d49, 0x2d56, 0x2d5c, 0x6a9, 0x648, 0x631, 0x62f, 0x6cc, 0x6cc, 0x20, 0x646, 0x627, 0x648, 0x6d5, 0x646, 0x62f, 0x6cc, 0x639, 0x6ce,
-0x631, 0x627, 0x642, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0x64, 0x6f, 0x6c, 0x6e, 0x6f, 0x73, 0x65, 0x72, 0x62, 0x161, 0x107, 0x69,
-0x6e, 0x61, 0x4e, 0x69, 0x6d, 0x73, 0x6b, 0x61, 0x68, 0x6f, 0x72, 0x6e, 0x6a, 0x6f, 0x73, 0x65, 0x72, 0x62, 0x161, 0x107,
-0x69, 0x6e, 0x61, 0x4e, 0x11b, 0x6d, 0x73, 0x6b, 0x61, 0x70, 0x72, 0x16b, 0x73, 0x69, 0x73, 0x6b, 0x61, 0x6e, 0x73, 0x77,
-0x12b, 0x74, 0x61, 0x69, 0x61, 0x6e, 0x61, 0x72, 0xe2, 0x161, 0x6b, 0x69, 0x65, 0x6c, 0xe2, 0x53, 0x75, 0x6f, 0x6d, 0xe2,
-0x645, 0x627, 0x632, 0x631, 0x648, 0x646, 0x6cc, 0x644, 0x6ca, 0x631, 0x6cc, 0x20, 0x634, 0x648, 0x645, 0x627, 0x644, 0x6cc, 0x7cb5, 0x8a9e,
-0x4e2d, 0x83ef, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x570b, 0x9999, 0x6e2f, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x7ca4, 0x8bed, 0x4e2d, 0x534e, 0x4eba, 0x6c11,
-0x5171, 0x548c, 0x56fd, 0x42, 0x69, 0x6e, 0x69, 0x73, 0x61, 0x79, 0x61
+0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x41, 0x72, 0x75, 0x62, 0x61, 0x42, 0x65, 0x6c, 0x67, 0x69,
+0xeb, 0x43, 0x75, 0x72, 0x61, 0xe7, 0x61, 0x6f, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x6d, 0x65, 0x43, 0x61, 0x72, 0x69,
+0x62, 0x69, 0x73, 0x63, 0x68, 0x20, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x53, 0x69, 0x6e, 0x74, 0x2d,
+0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c,
+0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x6e, 0x20, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, 0x41, 0x6e,
+0x74, 0x69, 0x67, 0x75, 0x61, 0x20, 0x26, 0x20, 0x42, 0x61, 0x72, 0x62, 0x75, 0x64, 0x61, 0x41, 0x75, 0x73, 0x74, 0x72,
+0x61, 0x6c, 0x69, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x41, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61,
+0x42, 0x61, 0x68, 0x61, 0x6d, 0x61, 0x73, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x42, 0x65, 0x6c, 0x67, 0x69,
+0x75, 0x6d, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x42, 0x6f, 0x74, 0x73, 0x77,
+0x61, 0x6e, 0x61, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x4f, 0x63,
+0x65, 0x61, 0x6e, 0x20, 0x54, 0x65, 0x72, 0x72, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69,
+0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x6f, 0x6e, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67,
+0x6c, 0x69, 0x73, 0x68, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64,
+0x43, 0x6f, 0x63, 0x6f, 0x73, 0x20, 0x28, 0x4b, 0x65, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x49, 0x73, 0x6c, 0x61,
+0x6e, 0x64, 0x73, 0x43, 0x6f, 0x6f, 0x6b, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x43, 0x79, 0x70, 0x72, 0x75,
+0x73, 0x44, 0x65, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x45, 0x72, 0x69, 0x74,
+0x72, 0x65, 0x61, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x46,
+0x69, 0x6a, 0x69, 0x46, 0x69, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x47, 0x75, 0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x47, 0x61,
+0x6d, 0x62, 0x69, 0x61, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x79, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x47, 0x69, 0x62, 0x72,
+0x61, 0x6c, 0x74, 0x61, 0x72, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x47, 0x75, 0x61, 0x6d, 0x47, 0x75, 0x79, 0x61,
+0x6e, 0x61, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68, 0x69, 0x6e,
+0x61, 0x49, 0x72, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63,
+0x61, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4b, 0x69, 0x72, 0x69, 0x62, 0x61, 0x74, 0x69, 0x4c, 0x65, 0x73, 0x6f, 0x74, 0x68,
+0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x4d, 0x61, 0x63, 0x61, 0x6f, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68,
+0x69, 0x6e, 0x61, 0x4d, 0x61, 0x64, 0x61, 0x67, 0x61, 0x73, 0x63, 0x61, 0x72, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x4d,
+0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x4d, 0x61, 0x6c, 0x74, 0x61, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x6c,
+0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x4d, 0x69, 0x63,
+0x72, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 0x4e, 0x61, 0x6d,
+0x69, 0x62, 0x69, 0x61, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73,
+0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x4e, 0x69,
+0x75, 0x65, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x6f, 0x72, 0x74,
+0x68, 0x65, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x61, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73,
+0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x50, 0x61, 0x6c, 0x61, 0x75, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e,
+0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x73,
+0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x50, 0x75, 0x65, 0x72,
+0x74, 0x6f, 0x20, 0x52, 0x69, 0x63, 0x6f, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x53, 0x74, 0x20, 0x4b, 0x69, 0x74, 0x74,
+0x73, 0x20, 0x26, 0x20, 0x4e, 0x65, 0x76, 0x69, 0x73, 0x53, 0x74, 0x20, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x53, 0x74, 0x20,
+0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x26, 0x20, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73,
+0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f,
+0x6e, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69, 0x61, 0x53,
+0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x53, 0x74, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x53, 0x75, 0x64, 0x61, 0x6e,
+0x45, 0x73, 0x77, 0x61, 0x74, 0x69, 0x6e, 0x69, 0x53, 0x77, 0x65, 0x64, 0x65, 0x6e, 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65,
+0x72, 0x6c, 0x61, 0x6e, 0x64, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x54, 0x6f, 0x6b, 0x65, 0x6c, 0x61, 0x75,
+0x54, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61,
+0x67, 0x6f, 0x54, 0x75, 0x72, 0x6b, 0x73, 0x20, 0x26, 0x20, 0x43, 0x61, 0x69, 0x63, 0x6f, 0x73, 0x20, 0x49, 0x73, 0x6c,
+0x61, 0x6e, 0x64, 0x73, 0x54, 0x75, 0x76, 0x61, 0x6c, 0x75, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x55, 0x6e, 0x69, 0x74,
+0x65, 0x64, 0x20, 0x41, 0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73, 0x42, 0x72, 0x69, 0x74,
+0x69, 0x73, 0x68, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b, 0x69,
+0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x4f, 0x75, 0x74, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x49,
+0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68,
+0x20, 0x56, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x55, 0x2e, 0x53, 0x2e, 0x20,
+0x56, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61,
+0x5a, 0x69, 0x6d, 0x62, 0x61, 0x62, 0x77, 0x65, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x47, 0x61, 0x72, 0x63, 0x69, 0x61,
+0x49, 0x73, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x61, 0x6e, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x53, 0x6f, 0x75,
+0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x53, 0x69, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e,
+0x57, 0x6f, 0x72, 0x6c, 0x64, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x65, 0x73, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x74, 0x6f,
+0x4d, 0x6f, 0x6e, 0x64, 0x6f, 0x65, 0x65, 0x73, 0x74, 0x69, 0x45, 0x65, 0x73, 0x74, 0x69, 0x66, 0xf8, 0x72, 0x6f, 0x79,
+0x73, 0x6b, 0x74, 0x46, 0xf8, 0x72, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x75, 0x6f, 0x6d, 0x69, 0x53, 0x75, 0x6f, 0x6d, 0x69,
+0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x67, 0xe9, 0x72, 0x69,
+0x65, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x71, 0x75, 0x65, 0x42, 0xe9, 0x6e, 0x69, 0x6e, 0x42, 0x75, 0x72, 0x6b, 0x69, 0x6e,
+0x61, 0x20, 0x46, 0x61, 0x73, 0x6f, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x75, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61,
+0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x52, 0xe9, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x71, 0x75,
+0x65, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x66, 0x72, 0x69, 0x63, 0x61, 0x69, 0x6e, 0x65, 0x54, 0x63, 0x68, 0x61,
+0x64, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61,
+0x73, 0x61, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x43,
+0xf4, 0x74, 0x65, 0x20, 0x64, 0x2019, 0x49, 0x76, 0x6f, 0x69, 0x72, 0x65, 0x44, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69,
+0x47, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x20, 0xe9, 0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x65, 0x47, 0x75,
+0x79, 0x61, 0x6e, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x79, 0x6e, 0xe9,
+0x73, 0x69, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x47, 0x61, 0x62, 0x6f, 0x6e, 0x47, 0x75,
+0x61, 0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x48, 0x61, 0xef, 0x74, 0x69, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f,
+0x75, 0x72, 0x67, 0x4d, 0x61, 0x6c, 0x69, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4d, 0x61, 0x75,
+0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74,
+0x65, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x4d, 0x61, 0x72, 0x6f, 0x63, 0x4e, 0x6f, 0x75, 0x76, 0x65, 0x6c, 0x6c, 0x65,
+0x2d, 0x43, 0x61, 0x6c, 0xe9, 0x64, 0x6f, 0x6e, 0x69, 0x65, 0x4c, 0x61, 0x20, 0x52, 0xe9, 0x75, 0x6e, 0x69, 0x6f, 0x6e,
+0x53, 0xe9, 0x6e, 0xe9, 0x67, 0x61, 0x6c, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x50, 0x69, 0x65, 0x72, 0x72, 0x65, 0x2d,
+0x65, 0x74, 0x2d, 0x4d, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x6f, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x20,
+0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x79, 0x72, 0x69, 0x65, 0x54, 0x6f, 0x67,
+0x6f, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x2d, 0x65, 0x74, 0x2d, 0x46, 0x75,
+0x74, 0x75, 0x6e, 0x61, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x42, 0x61, 0x72, 0x74, 0x68, 0xe9, 0x6c, 0x65, 0x6d, 0x79,
+0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x46, 0x72, 0x79, 0x73, 0x6b, 0x4e, 0x65, 0x64,
+0x65, 0x72, 0x6c, 0xe2, 0x6e, 0x47, 0xe0, 0x69, 0x64, 0x68, 0x6c, 0x69, 0x67, 0x41, 0x6e, 0x20, 0x52, 0xec, 0x6f, 0x67,
+0x68, 0x61, 0x63, 0x68, 0x64, 0x20, 0x41, 0x6f, 0x6e, 0x61, 0x69, 0x63, 0x68, 0x74, 0x65, 0x67, 0x61, 0x6c, 0x65, 0x67,
+0x6f, 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x10e1, 0x10d0, 0x10e5, 0x10d0, 0x10e0, 0x10d7,
+0x10d5, 0x10d4, 0x10da, 0x10dd, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61,
+0x6e, 0x64, 0xd6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x69, 0x63, 0x68, 0x69, 0x73, 0x63, 0x68, 0x65, 0x73, 0x20, 0x44,
+0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x65, 0x6e, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x65, 0x6e,
+0x4c, 0x69, 0x65, 0x63, 0x68, 0x74, 0x65, 0x6e, 0x73, 0x74, 0x65, 0x69, 0x6e, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x75,
+0x72, 0x67, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x48, 0x6f, 0x63, 0x68, 0x64, 0x65, 0x75, 0x74,
+0x73, 0x63, 0x68, 0x395, 0x3bb, 0x3bb, 0x3b7, 0x3bd, 0x3b9, 0x3ba, 0x3ac, 0x395, 0x3bb, 0x3bb, 0x3ac, 0x3b4, 0x3b1, 0x39a, 0x3cd, 0x3c0,
+0x3c1, 0x3bf, 0x3c2, 0x6b, 0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x75, 0x74, 0x4b, 0x61, 0x6c, 0x61, 0x61, 0x6c,
+0x6c, 0x69, 0x74, 0x20, 0x4e, 0x75, 0x6e, 0x61, 0x61, 0x74, 0xa97, 0xac1, 0xa9c, 0xab0, 0xabe, 0xaa4, 0xac0, 0xaad, 0xabe, 0xab0,
+0xaa4, 0x48, 0x61, 0x75, 0x73, 0x61, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x47, 0x61, 0x6e, 0x61, 0x4e, 0x69,
+0x6a, 0x61, 0x72, 0x5e2, 0x5d1, 0x5e8, 0x5d9, 0x5ea, 0x5d9, 0x5e9, 0x5e8, 0x5d0, 0x5dc, 0x939, 0x93f, 0x928, 0x94d, 0x926, 0x940, 0x92d,
+0x93e, 0x930, 0x924, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x4d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x6f, 0x72, 0x73, 0x7a, 0xe1,
+0x67, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0xcd, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x64, 0x6f, 0x6e,
+0x65, 0x73, 0x69, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x75, 0x61, 0x4d, 0x75, 0x6e, 0x64, 0x6f,
+0x47, 0x61, 0x65, 0x69, 0x6c, 0x67, 0x65, 0xc9, 0x69, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x52, 0xed, 0x6f, 0x63, 0x68, 0x74,
+0x20, 0x41, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x74, 0x68, 0x65, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x6f, 0x49, 0x74,
+0x61, 0x6c, 0x69, 0x61, 0x53, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x53, 0x76, 0x69, 0x7a, 0x7a, 0x65,
+0x72, 0x61, 0x43, 0x69, 0x74, 0x74, 0xe0, 0x20, 0x64, 0x65, 0x6c, 0x20, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x6f,
+0x65e5, 0x672c, 0x8a9e, 0x4a, 0x61, 0x77, 0x61, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0xe9, 0x73, 0x69, 0x61, 0xc95, 0xca8, 0xccd, 0xca8,
+0xca1, 0xcad, 0xcbe, 0xcb0, 0xca4, 0x6a9, 0x672, 0x634, 0x64f, 0x631, 0x6c1, 0x650, 0x646, 0x62f, 0x648, 0x633, 0x62a, 0x627, 0x646, 0x49b,
+0x430, 0x437, 0x430, 0x49b, 0x20, 0x442, 0x456, 0x43b, 0x456, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x4b, 0x69,
+0x6e, 0x79, 0x61, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x55, 0x20, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x43a, 0x44b, 0x440,
+0x433, 0x44b, 0x437, 0x447, 0x430, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0xd55c, 0xad6d, 0xc5b4, 0xb300, 0xd55c,
+0xbbfc, 0xad6d, 0xc870, 0xc120, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0xc778, 0xbbfc, 0xacf5, 0xd654, 0xad6d, 0x6b, 0x75, 0x72, 0x64, 0xee, 0x54, 0x69,
+0x72, 0x6b, 0x69, 0x79, 0x65, 0x49, 0x6b, 0x69, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x55, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64,
+0x69, 0xea5, 0xeb2, 0xea7, 0x6c, 0x61, 0x74, 0x76, 0x69, 0x65, 0x161, 0x75, 0x4c, 0x61, 0x74, 0x76, 0x69, 0x6a, 0x61, 0x6c,
+0x69, 0x6e, 0x67, 0xe1, 0x6c, 0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0xed, 0x6b, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b,
+0x6f, 0x6e, 0x67, 0xf3, 0x20, 0x44, 0x65, 0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x74, 0xed, 0x6b, 0x69, 0x41, 0x6e, 0x67, 0xf3,
+0x6c, 0x61, 0x52, 0x65, 0x70, 0x69, 0x62, 0x69, 0x6b, 0x69, 0x20, 0x79, 0x61, 0x20, 0x41, 0x66, 0x72, 0xed, 0x6b, 0x61,
+0x20, 0x79, 0x61, 0x20, 0x4b, 0xe1, 0x74, 0x69, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x69,
+0x173, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x61, 0x43c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x421, 0x435,
+0x432, 0x435, 0x440, 0x43d, 0x430, 0x20, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x438, 0x458, 0x430, 0x4d, 0x61, 0x6c, 0x61,
+0x67, 0x61, 0x73, 0x79, 0x4d, 0x61, 0x64, 0x61, 0x67, 0x61, 0x73, 0x69, 0x6b, 0x61, 0x72, 0x61, 0x4d, 0x65, 0x6c, 0x61,
+0x79, 0x75, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72, 0x61, 0xd2e, 0xd32, 0xd2f,
+0xd3e, 0xd33, 0xd02, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0x4d, 0x61, 0x6c, 0x74, 0x69, 0x4d, 0x101, 0x6f, 0x72, 0x69, 0x41,
+0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61, 0x92e, 0x930, 0x93e, 0x920, 0x940, 0x43c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x41c, 0x43e,
+0x43d, 0x433, 0x43e, 0x43b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x62, 0x6f, 0x6b, 0x6d,
+0xe5, 0x6c, 0x4e, 0x6f, 0x72, 0x67, 0x65, 0x53, 0x76, 0x61, 0x6c, 0x62, 0x61, 0x72, 0x64, 0x20, 0x6f, 0x67, 0x20, 0x4a,
+0x61, 0x6e, 0x20, 0x4d, 0x61, 0x79, 0x65, 0x6e, 0xb13, 0xb21, 0xb3c, 0xb3f, 0xb06, 0xb2d, 0xb3e, 0xb30, 0xb24, 0x67e, 0x69a, 0x62a,
+0x648, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x641, 0x627, 0x631,
+0x633, 0x6cc, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x62f, 0x631, 0x6cc, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x50, 0x6f, 0x6c, 0x73,
+0x6b, 0x61, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea, 0x73, 0x42, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x41, 0x6e, 0x67,
+0x6f, 0x6c, 0x61, 0x43, 0x61, 0x62, 0x6f, 0x20, 0x56, 0x65, 0x72, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x6f, 0x72, 0x2d, 0x4c,
+0x65, 0x73, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x20, 0x45, 0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c,
+0x47, 0x75, 0x69, 0x6e, 0xe9, 0x2d, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x75, 0x72,
+0x67, 0x6f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x2c, 0x20, 0x52, 0x41, 0x45, 0x20, 0x64, 0x61, 0x20, 0x43, 0x68, 0x69, 0x6e,
+0x61, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea, 0x73,
+0x20, 0x65, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x75, 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c, 0x53, 0xe3, 0x6f, 0x20,
+0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x53, 0x75, 0xed, 0xe7, 0x61,
+0xa2a, 0xa70, 0xa1c, 0xa3e, 0xa2c, 0xa40, 0xa2d, 0xa3e, 0xa30, 0xa24, 0x67e, 0x646, 0x62c, 0x627, 0x628, 0x6cc, 0x52, 0x75, 0x6e, 0x61,
+0x73, 0x69, 0x6d, 0x69, 0x50, 0x65, 0x72, 0xfa, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x45, 0x63, 0x75, 0x61, 0x64,
+0x6f, 0x72, 0x72, 0x75, 0x6d, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x53, 0x76, 0x69, 0x7a, 0x72, 0x61, 0x72, 0x6f, 0x6d,
+0xe2, 0x6e, 0x103, 0x52, 0x6f, 0x6d, 0xe2, 0x6e, 0x69, 0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x20,
+0x4d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x61, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x44f,
+0x41a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x442, 0x430, 0x43d, 0x41a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x438, 0x44f, 0x41c, 0x43e, 0x43b,
+0x434, 0x43e, 0x432, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x430, 0x53, 0xe4, 0x6e, 0x67, 0xf6, 0x4b, 0xf6, 0x64, 0xf6,
+0x72, 0xf6, 0x73, 0xea, 0x73, 0x65, 0x20, 0x74, 0xee, 0x20, 0x42, 0xea, 0x61, 0x66, 0x72, 0xee, 0x6b, 0x61, 0x441, 0x440,
+0x43f, 0x441, 0x43a, 0x438, 0x421, 0x440, 0x431, 0x438, 0x458, 0x430, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x43, 0x72, 0x6e, 0x61,
+0x20, 0x47, 0x6f, 0x72, 0x61, 0x53, 0x72, 0x62, 0x69, 0x6a, 0x61, 0x411, 0x43e, 0x441, 0x43d, 0x430, 0x20, 0x438, 0x20, 0x425,
+0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x438, 0x43d, 0x430, 0x426, 0x440, 0x43d, 0x430, 0x20, 0x413, 0x43e, 0x440, 0x430, 0x41a,
+0x43e, 0x441, 0x43e, 0x432, 0x43e, 0x4b, 0x6f, 0x73, 0x6f, 0x76, 0x6f, 0x438, 0x440, 0x43e, 0x43d, 0x413, 0x443, 0x44b, 0x440, 0x434,
+0x437, 0x44b, 0x441, 0x442, 0x43e, 0x43d, 0x423, 0x4d5, 0x440, 0x4d5, 0x441, 0x435, 0x63, 0x68, 0x69, 0x53, 0x68, 0x6f, 0x6e, 0x61,
+0x633, 0x646, 0x68c, 0x64a, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0xdc3, 0xdd2, 0xd82, 0xdc4, 0xdbd, 0xdc1, 0xdca, 0x200d, 0xdbb,
+0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0xdc0, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f,
+0x76, 0x65, 0x6e, 0x73, 0x6b, 0x6f, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x161, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f,
+0x76, 0x65, 0x6e, 0x69, 0x6a, 0x61, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61,
+0x6c, 0x69, 0x79, 0x61, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x69, 0x79, 0x61, 0x65,
+0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61, 0x41, 0x72, 0x67, 0x65,
+0x6e, 0x74, 0x69, 0x6e, 0x61, 0x42, 0x65, 0x6c, 0x69, 0x63, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6f,
+0x6d, 0x62, 0x69, 0x61, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x20, 0x52, 0x69, 0x63, 0x61, 0x43, 0x75, 0x62, 0x61, 0x52, 0x65,
+0x70, 0xfa, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x20, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x61, 0x45, 0x6c,
+0x20, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f, 0x72, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x20, 0x45, 0x63, 0x75, 0x61,
+0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x48, 0x6f, 0x6e, 0x64, 0x75,
+0x72, 0x61, 0x73, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f,
+0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f, 0x4e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x50, 0x61, 0x6e, 0x61, 0x6d,
+0xe1, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x46, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x45, 0x73,
+0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x55, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x56,
+0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, 0x6c, 0x61, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x61, 0x73, 0x65, 0x73, 0x70, 0x61,
+0xf1, 0x6f, 0x6c, 0x20, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x6f, 0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x4c,
+0x61, 0x74, 0x69, 0x6e, 0x6f, 0x61, 0x6d, 0xe9, 0x72, 0x69, 0x63, 0x61, 0x43, 0x65, 0x75, 0x74, 0x61, 0x20, 0x79, 0x20,
+0x4d, 0x65, 0x6c, 0x69, 0x6c, 0x6c, 0x61, 0x4b, 0x69, 0x73, 0x77, 0x61, 0x68, 0x69, 0x6c, 0x69, 0x4a, 0x61, 0x6d, 0x68,
+0x75, 0x72, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x69, 0x64, 0x65, 0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x73, 0x69, 0x61, 0x20,
+0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x53, 0x76, 0x65, 0x72, 0x69,
+0x67, 0x65, 0xc5, 0x6c, 0x61, 0x6e, 0x64, 0x442, 0x43e, 0x4b7, 0x438, 0x43a, 0x4e3, 0x422, 0x43e, 0x4b7, 0x438, 0x43a, 0x438, 0x441,
+0x442, 0x43e, 0x43d, 0xba4, 0xbae, 0xbbf, 0xbb4, 0xbcd, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0xbbe, 0xbae, 0xbb2, 0xbc7, 0xb9a, 0xbbf,
+0xbaf, 0xbbe, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x442,
+0x430, 0x442, 0x430, 0x440, 0xc24, 0xc46, 0xc32, 0xc41, 0xc17, 0xc41, 0xc2d, 0xc3e, 0xc30, 0xc24, 0xc26, 0xc47, 0xc36, 0xc02, 0xe44, 0xe17,
+0xe22, 0xf56, 0xf7c, 0xf51, 0xf0b, 0xf66, 0xf90, 0xf51, 0xf0b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf53, 0xf42, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42,
+0xf62, 0xf0b, 0x1275, 0x130d, 0x122d, 0x129b, 0x12a4, 0x122d, 0x1275, 0x122b, 0x6c, 0x65, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61, 0x74, 0x6f,
+0x6e, 0x67, 0x61, 0x54, 0xfc, 0x72, 0x6b, 0xe7, 0x65, 0x54, 0xfc, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x4b, 0x131, 0x62, 0x72,
+0x131, 0x73, 0x74, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x64, 0x69, 0x6c, 0x69, 0x54, 0xfc, 0x72, 0x6b, 0x6d, 0x65,
+0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x626, 0x6c7, 0x64a, 0x63a, 0x6c7, 0x631, 0x686, 0x6d5, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x443,
+0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x430, 0x627, 0x631, 0x62f, 0x648,
+0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x4f, 0x2bb, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74,
+0x6f, 0x6e, 0x627, 0x648, 0x632, 0x628, 0x6cc, 0x6a9, 0x45e, 0x437, 0x431, 0x435, 0x43a, 0x447, 0x430, 0x40e, 0x437, 0x431, 0x435, 0x43a,
+0x438, 0x441, 0x442, 0x43e, 0x43d, 0x54, 0x69, 0x1ebf, 0x6e, 0x67, 0x20, 0x56, 0x69, 0x1ec7, 0x74, 0x56, 0x69, 0x1ec7, 0x74, 0x20,
+0x4e, 0x61, 0x6d, 0x56, 0x6f, 0x6c, 0x61, 0x70, 0xfc, 0x6b, 0x43, 0x79, 0x6d, 0x72, 0x61, 0x65, 0x67, 0x59, 0x20, 0x44,
+0x65, 0x79, 0x72, 0x6e, 0x61, 0x73, 0x20, 0x55, 0x6e, 0x65, 0x64, 0x69, 0x67, 0x57, 0x6f, 0x6c, 0x6f, 0x66, 0x53, 0x65,
+0x6e, 0x65, 0x67, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x69, 0x58, 0x68, 0x6f, 0x73, 0x61, 0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x74,
+0x73, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x5d9, 0x5d9, 0x5b4, 0x5d3, 0x5d9, 0x5e9, 0x5d5, 0x5d5, 0x5e2, 0x5dc, 0x5d8,
+0xc8, 0x64, 0xe8, 0x20, 0x59, 0x6f, 0x72, 0xf9, 0x62, 0xe1, 0x4f, 0x72, 0x69, 0x6c, 0x1eb9, 0x300, 0x2d, 0xe8, 0x64, 0xe8,
+0x20, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x4f, 0x72, 0xed, 0x6c, 0x25b, 0x301, 0xe8, 0x64, 0x65, 0x20, 0x42,
+0x25b, 0x300, 0x6e, 0x25b, 0x300, 0x69, 0x73, 0x69, 0x5a, 0x75, 0x6c, 0x75, 0x69, 0x4e, 0x69, 0x6e, 0x67, 0x69, 0x7a, 0x69,
+0x6d, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x6e, 0x79, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x4e, 0x6f, 0x72, 0x65,
+0x67, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x69, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x438, 0x47, 0x61, 0x65,
+0x6c, 0x67, 0x45, 0x6c, 0x6c, 0x61, 0x6e, 0x20, 0x56, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x77,
+0x65, 0x6b, 0x52, 0x79, 0x77, 0x76, 0x61, 0x6e, 0x65, 0x74, 0x68, 0x20, 0x55, 0x6e, 0x79, 0x73, 0x41, 0x6b, 0x61, 0x6e,
+0x47, 0x61, 0x61, 0x6e, 0x61, 0x915, 0x94b, 0x902, 0x915, 0x923, 0x940, 0x41, 0x73, 0x1ee5, 0x73, 0x1ee5, 0x20, 0x49, 0x67, 0x62,
+0x6f, 0x4e, 0x61, 0x1ecb, 0x6a, 0x1ecb, 0x72, 0x1ecb, 0x61, 0x4b, 0x69, 0x6b, 0x61, 0x6d, 0x62, 0x61, 0x66, 0x75, 0x72, 0x6c,
+0x61, 0x6e, 0x45, 0x28b, 0x65, 0x67, 0x62, 0x65, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65,
+0x54, 0x6f, 0x67, 0x6f, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65, 0x2bb, 0x14c, 0x6c, 0x65, 0x6c, 0x6f, 0x20, 0x48, 0x61,
+0x77, 0x61, 0x69, 0x2bb, 0x69, 0x2bb, 0x41, 0x6d, 0x65, 0x6c, 0x69, 0x6b, 0x61, 0x20, 0x48, 0x75, 0x69, 0x20, 0x50, 0x16b,
+0x20, 0x2bb, 0x49, 0x61, 0x46, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61,
+0x73, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x74, 0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x46, 0x72, 0x61,
+0x6e, 0x6b, 0x72, 0x69, 0x69, 0x63, 0x68, 0x4c, 0x69, 0xe4, 0x63, 0x68, 0x74, 0x65, 0x73, 0x63, 0x68, 0x74, 0xe4, 0x69,
+0xa188, 0xa320, 0xa259, 0xa34f, 0xa1e9, 0x4e, 0x65, 0x64, 0x64, 0x65, 0x72, 0x73, 0x61, 0x73, 0x73, 0x2019, 0x73, 0x63, 0x68, 0x44,
+0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x65, 0x64, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x6e,
+0x65, 0x6e, 0x64, 0x61, 0x76, 0x76, 0x69, 0x73, 0xe1, 0x6d, 0x65, 0x67, 0x69, 0x65, 0x6c, 0x6c, 0x61, 0x4e, 0x6f, 0x72,
+0x67, 0x61, 0x53, 0x75, 0x6f, 0x70, 0x6d, 0x61, 0x52, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x45, 0x6b, 0x65, 0x67, 0x75, 0x73,
+0x69, 0x69, 0x4b, 0x69, 0x74, 0x61, 0x69, 0x74, 0x61, 0x50, 0x75, 0x6c, 0x61, 0x61, 0x72, 0x42, 0x75, 0x72, 0x6b, 0x69,
+0x62, 0x61, 0x61, 0x20, 0x46, 0x61, 0x61, 0x73, 0x6f, 0x4b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x75, 0x6e, 0x47, 0x61, 0x6d,
+0x6d, 0x62, 0x69, 0x47, 0x61, 0x6e, 0x61, 0x61, 0x47, 0x69, 0x6e, 0x65, 0x47, 0x69, 0x6e, 0x65, 0x2d, 0x42, 0x69, 0x73,
+0x61, 0x61, 0x77, 0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x4d, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e,
+0x69, 0x4e, 0x69, 0x6a, 0x65, 0x65, 0x72, 0x4e, 0x69, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x53, 0x65, 0x72, 0x61,
+0x61, 0x20, 0x6c, 0x69, 0x79, 0x6f, 0x6e, 0x47, 0x69, 0x6b, 0x75, 0x79, 0x75, 0x4b, 0x69, 0x73, 0x61, 0x6d, 0x70, 0x75,
+0x72, 0x73, 0x65, 0x6e, 0x61, 0x69, 0x73, 0x69, 0x4e, 0x64, 0x65, 0x62, 0x65, 0x6c, 0x65, 0x4b, 0x69, 0x68, 0x6f, 0x72,
+0x6f, 0x6d, 0x62, 0x6f, 0x2d5c, 0x2d30, 0x2d5b, 0x2d4d, 0x2d43, 0x2d49, 0x2d5c, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x54, 0x61, 0x73,
+0x68, 0x65, 0x6c, 0x1e25, 0x69, 0x79, 0x74, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x54, 0x61, 0x71, 0x62, 0x61, 0x79, 0x6c,
+0x69, 0x74, 0x4c, 0x65, 0x7a, 0x7a, 0x61, 0x79, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x6b, 0x6f, 0x72, 0x65,
+0x48, 0x69, 0x62, 0x65, 0x6e, 0x61, 0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x4b, 0x79, 0x69, 0x76,
+0x75, 0x6e, 0x6a, 0x6f, 0x62, 0x61, 0x6d, 0x61, 0x6e, 0x61, 0x6b, 0x61, 0x6e, 0x4b, 0x129, 0x65, 0x6d, 0x62, 0x75, 0x13e3,
+0x13b3, 0x13a9, 0x13cc, 0x13ca, 0x20, 0x13a2, 0x13f3, 0x13be, 0x13b5, 0x13cd, 0x13d4, 0x13c5, 0x20, 0x13cd, 0x13a6, 0x13da, 0x13a9, 0x6b, 0x72, 0x65,
+0x6f, 0x6c, 0x20, 0x6d, 0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x4d, 0x6f, 0x72, 0x69, 0x73, 0x43, 0x68, 0x69, 0x6d,
+0x61, 0x6b, 0x6f, 0x6e, 0x64, 0x65, 0x4b, 0x268, 0x6c, 0x61, 0x61, 0x6e, 0x67, 0x69, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61,
+0x6e, 0xed, 0x61, 0x4c, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x49, 0x63, 0x68,
+0x69, 0x62, 0x65, 0x6d, 0x62, 0x61, 0x6b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x4b, 0x61,
+0x62, 0x75, 0x20, 0x56, 0x65, 0x72, 0x64, 0x69, 0x4b, 0x129, 0x6d, 0x129, 0x72, 0x169, 0x4b, 0x61, 0x6c, 0x65, 0x6e, 0x6a,
+0x69, 0x6e, 0x45, 0x6d, 0x65, 0x74, 0x61, 0x62, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4b, 0x68, 0x6f, 0x65, 0x6b, 0x68,
+0x6f, 0x65, 0x67, 0x6f, 0x77, 0x61, 0x62, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x62, 0x4b, 0x69, 0x6d, 0x61, 0x63,
+0x68, 0x61, 0x6d, 0x65, 0x4b, 0xf6, 0x6c, 0x73, 0x63, 0x68, 0x44, 0x6f, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e,
+0x64, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x61, 0x4f, 0x6c, 0x75, 0x73, 0x6f, 0x67, 0x61, 0x4c, 0x75, 0x6c, 0x75,
+0x68, 0x69, 0x61, 0x4b, 0x69, 0x70, 0x61, 0x72, 0x65, 0x54, 0x61, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x4b, 0x69, 0x74,
+0x65, 0x73, 0x6f, 0x4b, 0x65, 0x6e, 0x69, 0x61, 0x4b, 0x6f, 0x79, 0x72, 0x61, 0x20, 0x63, 0x69, 0x69, 0x6e, 0x69, 0x4d,
+0x61, 0x61, 0x6c, 0x69, 0x4b, 0x69, 0x72, 0x75, 0x77, 0x61, 0x44, 0x68, 0x6f, 0x6c, 0x75, 0x6f, 0x52, 0x75, 0x6b, 0x69,
+0x67, 0x61, 0x54, 0x61, 0x6d, 0x61, 0x7a, 0x69, 0x263, 0x74, 0x20, 0x6e, 0x20, 0x6c, 0x61, 0x1e6d, 0x6c, 0x61, 0x1e63, 0x4d,
+0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x4b, 0x6f, 0x79, 0x72, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69,
+0x4b, 0x69, 0x73, 0x68, 0x61, 0x6d, 0x62, 0x61, 0x61, 0x92c, 0x921, 0x93c, 0x94b, 0x43d, 0x43e, 0x445, 0x447, 0x438, 0x439, 0x43d,
+0x446, 0x435, 0x440, 0x43a, 0x43e, 0x432, 0x43d, 0x43e, 0x441, 0x43b, 0x43e, 0x432, 0x435, 0x301, 0x43d, 0x441, 0x43a, 0x457, 0x439, 0x440,
+0x461, 0x441, 0x441, 0x456, 0x301, 0x430, 0x54, 0x73, 0x68, 0x69, 0x6c, 0x75, 0x62, 0x61, 0x44, 0x69, 0x74, 0x75, 0x6e, 0x67,
+0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75, 0x4c, 0xeb, 0x74, 0x7a, 0x65, 0x62, 0x75, 0x65, 0x72, 0x67,
+0x65, 0x73, 0x63, 0x68, 0x41, 0x67, 0x68, 0x65, 0x6d, 0x4b, 0xe0, 0x6d, 0xe0, 0x6c, 0xfb, 0x14b, 0x181, 0xe0, 0x73, 0xe0,
+0x61, 0x4b, 0xe0, 0x6d, 0x25b, 0x300, 0x72, 0xfb, 0x6e, 0x5a, 0x61, 0x72, 0x6d, 0x61, 0x63, 0x69, 0x69, 0x6e, 0x65, 0x4e,
+0x69, 0x17e, 0x65, 0x72, 0x64, 0x75, 0xe1, 0x6c, 0xe1, 0x6a, 0x6f, 0x6f, 0x6c, 0x61, 0x53, 0x65, 0x6e, 0x65, 0x67, 0x61,
+0x6c, 0x65, 0x77, 0x6f, 0x6e, 0x64, 0x6f, 0x4b, 0x61, 0x6d, 0x259, 0x72, 0xfa, 0x6e, 0x72, 0x69, 0x6b, 0x70, 0x61, 0x6b,
+0x61, 0x6d, 0x25b, 0x72, 0xfa, 0x6e, 0x4d, 0x61, 0x6b, 0x75, 0x61, 0x55, 0x6d, 0x6f, 0x7a, 0x61, 0x6d, 0x62, 0x69, 0x6b,
+0x69, 0x4d, 0x55, 0x4e, 0x44, 0x41, 0x14a, 0x6b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x14b, 0x4b, 0x77, 0x61, 0x73, 0x69, 0x6f,
+0x4b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x6e, 0x54, 0x68, 0x6f, 0x6b, 0x20, 0x4e, 0x61, 0x74, 0x68, 0x441, 0x430, 0x445, 0x430,
+0x20, 0x442, 0x44b, 0x43b, 0x430, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b, 0x439, 0x430, 0x49, 0x73, 0x68, 0x69, 0x73, 0x61,
+0x6e, 0x67, 0x75, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x54, 0x61, 0x73, 0x61, 0x77, 0x61, 0x71, 0x20,
+0x73, 0x65, 0x6e, 0x6e, 0x69, 0xa559, 0xa524, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x56, 0x61, 0x69, 0x4c, 0x61, 0x69, 0x62, 0x68, 0x69,
+0x79, 0x61, 0x57, 0x61, 0x6c, 0x73, 0x65, 0x72, 0x53, 0x63, 0x68, 0x77, 0x69, 0x7a, 0x6e, 0x75, 0x61, 0x73, 0x75, 0x65,
+0x4b, 0x65, 0x6d, 0x65, 0x6c, 0xfa, 0x6e, 0x61, 0x73, 0x74, 0x75, 0x72, 0x69, 0x61, 0x6e, 0x75, 0x4e, 0x64, 0x61, 0xa78c,
+0x61, 0x4b, 0x61, 0x6d, 0x25b, 0x6c, 0xfb, 0x6e, 0x6b, 0x61, 0x6b, 0x254, 0x4b, 0x61, 0x6d, 0x25b, 0x72, 0x75, 0x6e, 0x6d,
+0x65, 0x74, 0x61, 0x2bc, 0x4b, 0x61, 0x6d, 0x61, 0x6c, 0x75, 0x6e, 0x53, 0x68, 0x77, 0xf3, 0x14b, 0xf2, 0x20, 0x6e, 0x67,
+0x69, 0x65, 0x6d, 0x62, 0x254, 0x254, 0x6e, 0x4b, 0xe0, 0x6d, 0x61, 0x6c, 0xfb, 0x6d, 0xd804, 0xdd0c, 0xd804, 0xdd0b, 0xd804, 0xdd34,
+0xd804, 0xdd1f, 0xd804, 0xdd33, 0xd804, 0xdd26, 0xd804, 0xdd1d, 0xd804, 0xdd01, 0xd804, 0xdd23, 0xd804, 0xdd18, 0xd804, 0xdd2c, 0xd804, 0xdd0c, 0xd804, 0xdd34,
+0xd804, 0xdd1e, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd16, 0xd804, 0xdd34, 0x4c, 0x61, 0x6b, 0x21f, 0xf3, 0x6c, 0x2bc, 0x69, 0x79, 0x61,
+0x70, 0x69, 0x4d, 0xed, 0x6c, 0x61, 0x68, 0x61, 0x14b, 0x73, 0x6b, 0x61, 0x20, 0x54, 0x21f, 0x61, 0x6d, 0xe1, 0x6b, 0x21f,
+0x6f, 0x10d, 0x68, 0x65, 0x2d5c, 0x2d30, 0x2d4e, 0x2d30, 0x2d63, 0x2d49, 0x2d56, 0x2d5c, 0x6a9, 0x648, 0x631, 0x62f, 0x6cc, 0x6cc, 0x20, 0x646,
+0x627, 0x648, 0x6d5, 0x646, 0x62f, 0x6cc, 0x639, 0x6ce, 0x631, 0x627, 0x642, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0x64, 0x6f, 0x6c, 0x6e,
+0x6f, 0x73, 0x65, 0x72, 0x62, 0x161, 0x107, 0x69, 0x6e, 0x61, 0x4e, 0x69, 0x6d, 0x73, 0x6b, 0x61, 0x68, 0x6f, 0x72, 0x6e,
+0x6a, 0x6f, 0x73, 0x65, 0x72, 0x62, 0x161, 0x107, 0x69, 0x6e, 0x61, 0x4e, 0x11b, 0x6d, 0x73, 0x6b, 0x61, 0x70, 0x72, 0x16b,
+0x73, 0x69, 0x73, 0x6b, 0x61, 0x6e, 0x73, 0x77, 0x12b, 0x74, 0x61, 0x69, 0x61, 0x6e, 0x61, 0x72, 0xe2, 0x161, 0x6b, 0x69,
+0x65, 0x6c, 0xe2, 0x53, 0x75, 0x6f, 0x6d, 0xe2, 0x645, 0x627, 0x632, 0x631, 0x648, 0x646, 0x6cc, 0x644, 0x6ca, 0x631, 0x6cc, 0x20,
+0x634, 0x648, 0x645, 0x627, 0x644, 0x6cc, 0x7cb5, 0x8a9e, 0x4e2d, 0x83ef, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x570b, 0x9999, 0x6e2f, 0x7279, 0x5225, 0x884c,
+0x653f, 0x5340, 0x7ca4, 0x8bed, 0x4e2d, 0x534e, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x56fd, 0x42, 0x69, 0x6e, 0x69, 0x73, 0x61, 0x79, 0x61
};
static const char language_name_list[] =
diff --git a/src/corelib/text/qlocale_p.h b/src/corelib/text/qlocale_p.h
index 7e26e86fdf..42d434eac4 100644
--- a/src/corelib/text/qlocale_p.h
+++ b/src/corelib/text/qlocale_p.h
@@ -221,21 +221,19 @@ public:
typedef QVarLengthArray<char, 256> CharBuff;
- static QString doubleToString(const QChar zero, const QChar plus,
- const QChar minus, const QChar exponent,
- const QChar group, const QChar decimal,
- double d, int precision,
- DoubleForm form,
+ static QString doubleToString(const QString &zero, const QString &plus,
+ const QString &minus, const QString &exponent,
+ const QString &group, const QString &decimal,
+ double d, int precision, DoubleForm form,
int width, unsigned flags);
- static QString longLongToString(const QChar zero, const QChar group,
- const QChar plus, const QChar minus,
+ static QString longLongToString(const QString &zero, const QString &group,
+ const QString &plus, const QString &minus,
qint64 l, int precision, int base,
int width, unsigned flags);
- static QString unsLongLongToString(const QChar zero, const QChar group,
- const QChar plus,
+ static QString unsLongLongToString(const QString &zero, const QString &group,
+ const QString &plus,
quint64 l, int precision,
- int base, int width,
- unsigned flags);
+ int base, int width, unsigned flags);
QString doubleToString(double d,
int precision = -1,
@@ -282,48 +280,105 @@ public:
bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options,
CharBuff *result) const;
- inline char digitToCLocale(QChar c) const;
+ inline char numericToCLocale(QStringView in) const;
// this function is used in QIntValidator (QtGui)
Q_CORE_EXPORT bool validateChars(QStringView str, NumberMode numMode, QByteArray *buff, int decDigits = -1,
QLocale::NumberOptions number_options = QLocale::DefaultNumberOptions) const;
+ QString decimalPoint() const;
+ QString groupSeparator() const;
+ QString listSeparator() const;
+ QString percentSign() const;
+ QString zeroDigit() const;
+ uint zeroUcs() const;
+ QString positiveSign() const;
+ QString negativeSign() const;
+ QString exponentSeparator() const;
+
+ struct DataRange
+ {
+ quint16 offset;
+ quint16 size;
+ QString getData(const char16_t *table) const
+ {
+ return size > 0
+ ? QString::fromRawData(reinterpret_cast<const QChar *>(table + offset), size)
+ : QString();
+ }
+ QStringView viewData(const char16_t *table) const
+ {
+ return { reinterpret_cast<const QChar *>(table + offset), size };
+ }
+ QString getListEntry(const char16_t *table, int index) const
+ {
+ return listEntry(table, index).getData(table);
+ }
+ QStringView viewListEntry(const char16_t *table, int index) const
+ {
+ return listEntry(table, index).viewData(table);
+ }
+ uint ucsFirst(const char16_t *table) const
+ {
+ if (size && !QChar::isSurrogate(table[offset]))
+ return table[offset];
+ if (size > 1 && QChar::isHighSurrogate(table[offset]))
+ return QChar::surrogateToUcs4(table[offset], table[offset + 1]);
+ return 0;
+ }
+ private:
+ DataRange listEntry(const char16_t *table, int index) const
+ {
+ const char16_t separator = ';';
+ quint16 i = 0;
+ while (index > 0 && i < size) {
+ if (table[offset + i] == separator)
+ index--;
+ i++;
+ }
+ quint16 end = i;
+ while (end < size && table[offset + end] != separator)
+ end++;
+ return { quint16(offset + i), quint16(end - i) };
+ }
+ };
+
+#define ForEachQLocaleRange(X) \
+ X(startListPattern) X(midListPattern) X(endListPattern) X(pairListPattern) X(listDelimit) \
+ X(decimalSeparator) X(groupDelim) X(percent) X(zero) X(minus) X(plus) X(exponential) \
+ X(quoteStart) X(quoteEnd) X(quoteStartAlternate) X(quoteEndAlternate) \
+ X(longDateFormat) X(shortDateFormat) X(longTimeFormat) X(shortTimeFormat) \
+ X(longDayNamesStandalone) X(longDayNames) \
+ X(shortDayNamesStandalone) X(shortDayNames) \
+ X(narrowDayNamesStandalone) X(narrowDayNames) \
+ X(anteMeridiem) X(postMeridiem) \
+ X(byteCount) X(byteAmountSI) X(byteAmountIEC) \
+ X(currencySymbol) X(currencyDisplayName) \
+ X(currencyFormat) X(currencyFormatNegative) \
+ X(endonymLanguage) X(endonymCountry)
+
+#define rangeGetter(name) \
+ DataRange name() const { return { m_ ## name ## _idx, m_ ## name ## _size }; }
+ ForEachQLocaleRange(rangeGetter)
+#undef rangeGetter
+
public:
quint16 m_language_id, m_script_id, m_country_id;
- // FIXME QTBUG-69324: not all unicode code-points map to single-token UTF-16 :-(
- char16_t m_decimal, m_group, m_list, m_percent, m_zero, m_minus, m_plus, m_exponential;
- char16_t m_quotation_start, m_quotation_end;
- char16_t m_alternate_quotation_start, m_alternate_quotation_end;
-
- quint16 m_list_pattern_part_start_idx, m_list_pattern_part_start_size;
- quint16 m_list_pattern_part_mid_idx, m_list_pattern_part_mid_size;
- quint16 m_list_pattern_part_end_idx, m_list_pattern_part_end_size;
- quint16 m_list_pattern_part_two_idx, m_list_pattern_part_two_size;
- quint16 m_short_date_format_idx, m_short_date_format_size;
- quint16 m_long_date_format_idx, m_long_date_format_size;
- quint16 m_short_time_format_idx, m_short_time_format_size;
- quint16 m_long_time_format_idx, m_long_time_format_size;
- quint16 m_standalone_short_day_names_idx, m_standalone_short_day_names_size;
- quint16 m_standalone_long_day_names_idx, m_standalone_long_day_names_size;
- quint16 m_standalone_narrow_day_names_idx, m_standalone_narrow_day_names_size;
- quint16 m_short_day_names_idx, m_short_day_names_size;
- quint16 m_long_day_names_idx, m_long_day_names_size;
- quint16 m_narrow_day_names_idx, m_narrow_day_names_size;
- quint16 m_am_idx, m_am_size;
- quint16 m_pm_idx, m_pm_size;
- quint16 m_byte_idx, m_byte_size;
- quint16 m_byte_si_quantified_idx, m_byte_si_quantified_size;
- quint16 m_byte_iec_quantified_idx, m_byte_iec_quantified_size;
+ // Offsets, then sizes, for each range:
+#define rangeIndex(name) quint16 m_ ## name ## _idx;
+ ForEachQLocaleRange(rangeIndex)
+#undef rangeIndex
+#define Size(name) quint8 m_ ## name ## _size;
+ ForEachQLocaleRange(Size)
+#undef Size
+
+#undef ForEachQLocaleRange
+
+ // Strays:
char m_currency_iso_code[3];
- quint16 m_currency_symbol_idx, m_currency_symbol_size;
- quint16 m_currency_display_name_idx, m_currency_display_name_size;
- quint8 m_currency_format_idx, m_currency_format_size;
- quint8 m_currency_negative_format_idx, m_currency_negative_format_size;
- quint16 m_language_endonym_idx, m_language_endonym_size;
- quint16 m_country_endonym_idx, m_country_endonym_size;
quint16 m_currency_digits : 2;
- quint16 m_currency_rounding : 3;
+ quint16 m_currency_rounding : 3; // (not yet used !)
quint16 m_first_day_of_week : 3;
quint16 m_weekend_start : 3;
quint16 m_weekend_end : 3;
@@ -347,15 +402,6 @@ public:
static QLocalePrivate *get(QLocale &l) { return l.d; }
static const QLocalePrivate *get(const QLocale &l) { return l.d; }
- QChar decimal() const { return QChar(m_data->m_decimal); }
- QChar group() const { return QChar(m_data->m_group); }
- QChar list() const { return QChar(m_data->m_list); }
- QChar percent() const { return QChar(m_data->m_percent); }
- QChar zero() const { return QChar(m_data->m_zero); }
- QChar plus() const { return QChar(m_data->m_plus); }
- QChar minus() const { return QChar(m_data->m_minus); }
- QChar exponential() const { return QChar(m_data->m_exponential); }
-
quint16 languageId() const { return m_data->m_language_id; }
quint16 countryId() const { return m_data->m_country_id; }
@@ -395,37 +441,44 @@ inline QLocalePrivate *QSharedDataPointer<QLocalePrivate>::clone()
return QLocalePrivate::create(d->m_data, d->m_data_offset, d->m_numberOptions);
}
-inline char QLocaleData::digitToCLocale(QChar in) const
+inline char QLocaleData::numericToCLocale(QStringView in) const
{
- const ushort tenUnicode = m_zero + 10;
-
- if (in.unicode() >= m_zero && in.unicode() < tenUnicode)
- return '0' + in.unicode() - m_zero;
+ Q_ASSERT(in.size() == 1 || (in.size() == 2 && in.at(0).isHighSurrogate()));
- if (in.unicode() >= '0' && in.unicode() <= '9')
- return in.toLatin1();
-
- if (in == m_plus || in == QLatin1Char('+'))
+ if (in == positiveSign() || in == u"+")
return '+';
- if (in == m_minus || in == QLatin1Char('-') || in == QChar(0x2212))
+ if (in == negativeSign() || in == u"-" || in == u"\x2212")
return '-';
- if (in == m_decimal)
+ if (in == decimalPoint())
return '.';
- if (in == m_group)
- return ',';
-
- if (in == m_exponential || in == QChar(QChar::toUpper(m_exponential)))
+ if (in.compare(exponentSeparator(), Qt::CaseInsensitive) == 0)
return 'e';
+ const QString group = groupSeparator();
+ if (in == group)
+ return ',';
+
// In several languages group() is a non-breaking space (U+00A0) or its thin
// version (U+202f), which look like spaces. People (and thus some of our
// tests) use a regular space instead and complain if it doesn't work.
- if ((m_group == 0xA0 || m_group == 0x202f) && in.unicode() == ' ')
+ // Should this be extended generally to any case where group is a space ?
+ if ((group == u"\xa0" || group == u"\x202f") && in == u" ")
return ',';
+ const uint zeroUcs4 = zeroUcs();
+ const uint tenUcs4 = zeroUcs4 + 10;
+ const uint inUcs4 = in.size() == 2
+ ? QChar::surrogateToUcs4(in.at(0), in.at(1)) : in.at(0).unicode();
+
+ if (zeroUcs4 <= inUcs4 && inUcs4 < tenUcs4)
+ return '0' + inUcs4 - zeroUcs4;
+
+ if ('0' <= inUcs4 && inUcs4 <= '9')
+ return inUcs4;
+
return 0;
}
diff --git a/src/corelib/text/qlocale_tools.cpp b/src/corelib/text/qlocale_tools.cpp
index 0da769d694..9adb6e4a23 100644
--- a/src/corelib/text/qlocale_tools.cpp
+++ b/src/corelib/text/qlocale_tools.cpp
@@ -428,72 +428,85 @@ qstrtoll(const char * nptr, const char **endptr, int base, bool *ok)
return result;
}
-QString qulltoa(qulonglong l, int base, const QChar _zero)
+QString qulltoa(qulonglong number, int base, const QStringView zero)
{
- ushort buff[65]; // length of MAX_ULLONG in base 2
- ushort *p = buff + 65;
-
- if (base != 10 || _zero.unicode() == '0') {
- while (l != 0) {
- int c = l % base;
-
- --p;
-
- if (c < 10)
- *p = '0' + c;
- else
- *p = c - 10 + 'a';
+ // Length of MAX_ULLONG in base 2 is 64; and we may need a surrogate pair
+ // per digit. We do not need a terminator.
+ const unsigned maxlen = 128;
+ Q_STATIC_ASSERT(CHAR_BIT * sizeof(number) <= maxlen);
+ ushort buff[maxlen];
+ ushort *const end = buff + maxlen, *p = end;
+
+ if (base != 10 || zero == u"0") {
+ while (number != 0) {
+ int c = number % base;
+ *--p = c < 10 ? '0' + c : c - 10 + 'a';
+ number /= base;
+ }
+ } else if (zero.size() && !zero.at(0).isSurrogate()) {
+ const ushort zeroUcs4 = zero.at(0).unicode();
+ while (number != 0) {
+ *(--p) = zeroUcs4 + number % base;
- l /= base;
+ number /= base;
}
- }
- else {
- while (l != 0) {
- int c = l % base;
+ } else if (zero.size() == 2 && zero.at(0).isHighSurrogate()) {
+ const uint zeroUcs4 = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
+ while (number != 0) {
+ const uint digit = zeroUcs4 + number % base;
- *(--p) = _zero.unicode() + c;
+ *(--p) = QChar::lowSurrogate(digit);
+ *(--p) = QChar::highSurrogate(digit);
- l /= base;
+ number /= base;
}
+ } else {
+ return QString();
}
- return QString(reinterpret_cast<QChar *>(p), 65 - (p - buff));
+ return QString(reinterpret_cast<QChar *>(p), end - p);
}
-QString &decimalForm(QChar zero, QChar decimal, QChar group,
+QString &decimalForm(const QString &zero, const QString &decimal, const QString &group,
QString &digits, int decpt, int precision,
PrecisionMode pm,
bool always_show_decpt,
bool thousands_group)
{
+ const auto digitWidth = zero.size();
+ Q_ASSERT(digitWidth == 1 || digitWidth == 2);
+ Q_ASSERT(digits.size() % digitWidth == 0);
+
if (decpt < 0) {
for (int i = 0; i < -decpt; ++i)
digits.prepend(zero);
decpt = 0;
- }
- else if (decpt > digits.length()) {
- for (int i = digits.length(); i < decpt; ++i)
+ } else {
+ for (int i = digits.length() / digitWidth; i < decpt; ++i)
digits.append(zero);
}
- if (pm == PMDecimalDigits) {
- uint decimal_digits = digits.length() - decpt;
- for (int i = decimal_digits; i < precision; ++i)
+ switch (pm) {
+ case PMDecimalDigits:
+ for (int i = digits.length() / digitWidth - decpt; i < precision; ++i)
digits.append(zero);
- }
- else if (pm == PMSignificantDigits) {
- for (int i = digits.length(); i < precision; ++i)
+ break;
+ case PMSignificantDigits:
+ for (int i = digits.length() / digitWidth; i < precision; ++i)
digits.append(zero);
- }
- else { // pm == PMChopTrailingZeros
+ break;
+ case PMChopTrailingZeros:
+ break;
}
- if (always_show_decpt || decpt < digits.length())
- digits.insert(decpt, decimal);
+ if (always_show_decpt || decpt < digits.length() / digitWidth)
+ digits.insert(decpt * digitWidth, decimal);
+ // FIXME: they're not simply thousands separators !
+ // Need to mirror IndianNumberGrouping code in QLocaleData::longLongToString()
if (thousands_group) {
for (int i = decpt - 3; i > 0; i -= 3)
- digits.insert(i, group);
+ digits.insert(i * digitWidth, group);
}
if (decpt == 0)
@@ -502,32 +515,37 @@ QString &decimalForm(QChar zero, QChar decimal, QChar group,
return digits;
}
-QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
- QChar group, QChar plus, QChar minus,
+QString &exponentForm(const QString &zero, const QString &decimal, const QString &exponential,
+ const QString &group, const QString &plus, const QString &minus,
QString &digits, int decpt, int precision,
PrecisionMode pm,
bool always_show_decpt,
bool leading_zero_in_exponent)
{
- int exp = decpt - 1;
+ const auto digitWidth = zero.size();
+ Q_ASSERT(digitWidth == 1 || digitWidth == 2);
+ Q_ASSERT(digits.size() % digitWidth == 0);
- if (pm == PMDecimalDigits) {
- for (int i = digits.length(); i < precision + 1; ++i)
+ switch (pm) {
+ case PMDecimalDigits:
+ for (int i = digits.length() / digitWidth; i < precision + 1; ++i)
digits.append(zero);
- }
- else if (pm == PMSignificantDigits) {
- for (int i = digits.length(); i < precision; ++i)
+ break;
+ case PMSignificantDigits:
+ for (int i = digits.length() / digitWidth; i < precision; ++i)
digits.append(zero);
- }
- else { // pm == PMChopTrailingZeros
+ break;
+ case PMChopTrailingZeros:
+ break;
}
- if (always_show_decpt || digits.length() > 1)
- digits.insert(1, decimal);
+ if (always_show_decpt || digits.length() > digitWidth)
+ digits.insert(digitWidth, decimal);
digits.append(exponential);
- digits.append(QLocaleData::longLongToString(zero, group, plus, minus,
- exp, leading_zero_in_exponent ? 2 : 1, 10, -1, QLocaleData::AlwaysShowSign));
+ digits.append(QLocaleData::longLongToString(zero, group, plus, minus, decpt - 1,
+ leading_zero_in_exponent ? 2 : 1,
+ 10, -1, QLocaleData::AlwaysShowSign));
return digits;
}
diff --git a/src/corelib/text/qlocale_tools_p.h b/src/corelib/text/qlocale_tools_p.h
index e2142bf545..f04c4512c0 100644
--- a/src/corelib/text/qlocale_tools_p.h
+++ b/src/corelib/text/qlocale_tools_p.h
@@ -67,7 +67,7 @@ double qt_asciiToDouble(const char *num, int numLen, bool &ok, int &processed,
void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
bool &sign, int &length, int &decpt);
-QString qulltoa(qulonglong l, int base, const QChar _zero);
+QString qulltoa(qulonglong l, int base, const QStringView zero);
Q_CORE_EXPORT QString qdtoa(qreal d, int *decpt, int *sign);
enum PrecisionMode {
@@ -76,13 +76,13 @@ enum PrecisionMode {
PMChopTrailingZeros = 0x03
};
-QString &decimalForm(QChar zero, QChar decimal, QChar group,
+QString &decimalForm(const QString &zero, const QString &decimal, const QString &group,
QString &digits, int decpt, int precision,
PrecisionMode pm,
bool always_show_decpt,
bool thousands_group);
-QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
- QChar group, QChar plus, QChar minus,
+QString &exponentForm(const QString &zero, const QString &decimal, const QString &exponential,
+ const QString &group, const QString &plus, const QString &minus,
QString &digits, int decpt, int precision,
PrecisionMode pm,
bool always_show_decpt,
diff --git a/src/corelib/text/qlocale_win.cpp b/src/corelib/text/qlocale_win.cpp
index 4a38adf309..a6582236d5 100644
--- a/src/corelib/text/qlocale_win.cpp
+++ b/src/corelib/text/qlocale_win.cpp
@@ -567,25 +567,30 @@ QVariant QSystemLocalePrivate::toCurrencyString(const QSystemLocale::CurrencyToS
QString value;
switch (arg.value.type()) {
case QVariant::Int:
- value = QLocaleData::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
- arg.value.toInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
+ value = QLocaleData::longLongToString(
+ QStringLiteral("0"), QStringLiteral(","), QStringLiteral("+"), QStringLiteral("-"),
+ arg.value.toInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
break;
case QVariant::UInt:
- value = QLocaleData::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
- arg.value.toUInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
+ value = QLocaleData::unsLongLongToString(
+ QStringLiteral("0"), QStringLiteral(","), QStringLiteral("+"),
+ arg.value.toUInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
break;
case QVariant::Double:
- value = QLocaleData::doubleToString(QLatin1Char('0'), QLatin1Char('+'), QLatin1Char('-'),
- QLatin1Char(' '), QLatin1Char(','), QLatin1Char('.'),
- arg.value.toDouble(), -1, QLocaleData::DFDecimal, -1, QLocale::OmitGroupSeparator);
+ value = QLocaleData::doubleToString(
+ QStringLiteral("0"), QStringLiteral("+"), QStringLiteral("-"),
+ QStringLiteral(" "), QStringLiteral(","), QStringLiteral("."),
+ arg.value.toDouble(), -1, QLocaleData::DFDecimal, -1, QLocale::OmitGroupSeparator);
break;
case QVariant::LongLong:
- value = QLocaleData::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
- arg.value.toLongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
+ value = QLocaleData::longLongToString(
+ QStringLiteral("0"), QStringLiteral(","), QStringLiteral("+"), QStringLiteral("-"),
+ arg.value.toLongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
break;
case QVariant::ULongLong:
- value = QLocaleData::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
- arg.value.toULongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
+ value = QLocaleData::unsLongLongToString(
+ QStringLiteral("0"), QStringLiteral(","), QStringLiteral("+"),
+ arg.value.toULongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
break;
default:
return QVariant();
@@ -838,6 +843,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
case ZeroDigit:
return d->zeroDigit();
case LanguageId:
+ case ScriptId:
case CountryId: {
QString locale = QString::fromLatin1(getWinLocaleName());
QLocale::Language lang;
@@ -846,12 +852,10 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
QLocalePrivate::getLangAndCountry(locale, lang, script, cntry);
if (type == LanguageId)
return lang;
- if (cntry == QLocale::AnyCountry)
- return fallbackUiLocale().country();
- return cntry;
+ if (type == ScriptId)
+ return script == QLocale::AnyScript ? fallbackUiLocale().script() : script;
+ return cntry == QLocale::AnyCountry ? fallbackUiLocale().country() : cntry;
}
- case ScriptId:
- return QVariant(QLocale::AnyScript);
case MeasurementSystem:
return d->measurementSystem();
case Collation:
diff --git a/src/corelib/text/qregexp.cpp b/src/corelib/text/qregexp.cpp
index 9301a7e573..bf76a1992c 100644
--- a/src/corelib/text/qregexp.cpp
+++ b/src/corelib/text/qregexp.cpp
@@ -76,6 +76,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QRegExp
\inmodule QtCore
+ \obsolete Use QRegularExpression instead
\reentrant
\brief The QRegExp class provides pattern matching using regular expressions.
@@ -84,6 +85,10 @@ QT_BEGIN_NAMESPACE
\keyword regular expression
+ This class is deprecated in Qt 6. Please use QRegularExpression instead
+ for all new code. For guidelines on porting old code from QRegExp to
+ QRegularExpression, see {Porting to QRegularExpression}
+
A regular expression, or "regexp", is a pattern for matching
substrings in a text. This is useful in many contexts, e.g.,
@@ -686,8 +691,140 @@ QT_BEGIN_NAMESPACE
the position in the string where the match was made (or -1 if
there was no match).
- \sa QString, QStringList, QRegExpValidator, QSortFilterProxyModel,
+ \sa QString, QStringList, QSortFilterProxyModel,
{tools/regexp}{Regular Expression Example}
+
+
+ \section1 Porting to QRegularExpression
+
+ The QRegularExpression class introduced in Qt 5 is a big improvement upon
+ QRegExp, in terms of APIs offered, supported pattern syntax and speed of
+ execution. The biggest difference is that QRegularExpression simply holds a
+ regular expression, and it's \e{not} modified when a match is requested.
+ Instead, a QRegularExpressionMatch object is returned, in order to check
+ the result of a match and extract the captured substring. The same applies
+ with global matching and QRegularExpressionMatchIterator.
+
+ Other differences are outlined below.
+
+ \section2 Different pattern syntax
+
+ Porting a regular expression from QRegExp to QRegularExpression may require
+ changes to the pattern itself.
+
+ In certain scenarios, QRegExp was too lenient and accepted patterns that
+ are simply invalid when using QRegularExpression. These are somehow easy
+ to detect, because the QRegularExpression objects built with these patterns
+ are not valid (cf. QRegularExpression::isValid()).
+
+ In other cases, a pattern ported from QRegExp to QRegularExpression may
+ silently change semantics. Therefore, it is necessary to review the
+ patterns used. The most notable cases of silent incompatibility are:
+
+ \list
+
+ \li Curly braces are needed in order to use a hexadecimal escape like
+ \c{\xHHHH} with more than 2 digits. A pattern like \c{\x2022} neeeds to
+ be ported to \c{\x{2022}}, or it will match a space (\c{0x20}) followed
+ by the string \c{"22"}. In general, it is highly recommended to always use
+ curly braces with the \c{\x} escape, no matter the amount of digits
+ specified.
+
+ \li A 0-to-n quantification like \c{{,n}} needs to be ported to \c{{0,n}} to
+ preserve semantics. Otherwise, a pattern such as \c{\d{,3}} would
+ actually match a digit followed by the exact string \c{"{,3}"}.
+
+ \li QRegExp by default does Unicode-aware matching, while
+ QRegularExpression requires a separate option; see below for more details.
+
+ \li c{.} in QRegExp does by default match all characters, including the
+ newline character. QRegularExpression excludes the newline character by
+ default. To include the newline character, set the
+ QRegularExpression::DotMatchesEverythingOption pattern option.
+
+ \endlist
+
+ \section2 Porting from QRegExp::exactMatch()
+
+ QRegExp::exactMatch() in Qt 4 served two purposes: it exactly matched
+ a regular expression against a subject string, and it implemented partial
+ matching.
+
+ \section3 Porting from QRegExp's Exact Matching
+
+ Exact matching indicates whether the regular expression matches the entire
+ subject string. For example, the classes yield on the subject string \c{"abc123"}:
+
+ \table
+ \header \li \li QRegExp::exactMatch() \li QRegularExpressionMatch::hasMatch()
+ \row \li \c{"\\d+"} \li \b false \li \b true
+ \row \li \c{"[a-z]+\\d+"} \li \b true \li \b true
+ \endtable
+
+ Exact matching is not reflected in QRegularExpression. If you want
+ to be sure that the subject string matches the regular expression
+ exactly, you can wrap the pattern using the QRegularExpression::anchoredPattern()
+ function:
+
+ \snippet code/src_corelib_tools_qregexp.cpp 21
+
+ \section3 Porting from QRegExp's Partial Matching
+
+ When using QRegExp::exactMatch(), if an exact match was not found, one
+ could still find out how much of the subject string was matched by the
+ regular expression by calling QRegExp::matchedLength(). If the returned length
+ was equal to the subject string's length, then one could conclude that a partial
+ match was found.
+
+ QRegularExpression supports partial matching explicitly by means of the
+ appropriate MatchType.
+
+ \section2 Global matching
+
+ Due to limitations of the QRegExp API it was impossible to implement global
+ matching correctly (that is, like Perl does). In particular, patterns that
+ can match 0 characters (like \c{"a*"}) are problematic.
+
+ QRegularExpression::globalMatch() implements Perl global match correctly, and
+ the returned iterator can be used to examine each result.
+
+ \section2 Unicode properties support
+
+ When using QRegExp, character classes such as \c{\w}, \c{\d}, etc. match
+ characters with the corresponding Unicode property: for instance, \c{\d}
+ matches any character with the Unicode Nd (decimal digit) property.
+
+ Those character classes only match ASCII characters by default when using
+ QRegularExpression: for instance, \c{\d} matches exactly a character in the
+ \c{0-9} ASCII range. It is possible to change this behavior by using the
+ UseUnicodePropertiesOption pattern option.
+
+ \section2 Wildcard matching
+
+ There is no direct way to do wildcard matching in QRegularExpression.
+ However, the wildcardToRegularExpression method is provided to translate
+ glob patterns into a Perl-compatible regular expression that can be used
+ for that purpose.
+
+ \section2 Other pattern syntaxes
+
+ QRegularExpression supports only Perl-compatible regular expressions.
+
+ \section2 Minimal matching
+
+ QRegExp::setMinimal() implemented minimal matching by simply reversing the
+ greediness of the quantifiers (QRegExp did not support lazy quantifiers,
+ like \c{*?}, \c{+?}, etc.). QRegularExpression instead does support greedy,
+ lazy and possessive quantifiers. The InvertedGreedinessOption
+ pattern option can be useful to emulate the effects of QRegExp::setMinimal():
+ if enabled, it inverts the greediness of quantifiers (greedy ones become
+ lazy and vice versa).
+
+ \section2 Caret modes
+
+ The AnchorAtOffsetMatchOption match option can be used to emulate the
+ QRegExp::CaretAtOffset behavior. There is no equivalent for the other
+ QRegExp::CaretMode modes.
*/
#if defined(Q_OS_VXWORKS) && defined(EOS)
@@ -891,7 +1028,7 @@ static bool operator==(const QRegExpEngineKey &key1, const QRegExpEngineKey &key
&& key1.cs == key2.cs;
}
-static uint qHash(const QRegExpEngineKey &key, uint seed = 0) noexcept
+static size_t qHash(const QRegExpEngineKey &key, size_t seed = 0) noexcept
{
QtPrivate::QHashCombine hash;
seed = hash(seed, key.pattern);
@@ -4041,7 +4178,7 @@ bool QRegExp::operator==(const QRegExp &rx) const
Returns the hash value for \a key, using
\a seed to seed the calculation.
*/
-uint qHash(const QRegExp &key, uint seed) noexcept
+size_t qHash(const QRegExp &key, size_t seed) noexcept
{
QtPrivate::QHashCombine hash;
seed = hash(seed, key.priv->engineKey);
diff --git a/src/corelib/text/qregexp.h b/src/corelib/text/qregexp.h
index 8f6de24c74..b42214f1db 100644
--- a/src/corelib/text/qregexp.h
+++ b/src/corelib/text/qregexp.h
@@ -53,7 +53,7 @@ struct QRegExpPrivate;
class QStringList;
class QRegExp;
-Q_CORE_EXPORT uint qHash(const QRegExp &key, uint seed = 0) noexcept;
+Q_CORE_EXPORT size_t qHash(const QRegExp &key, size_t seed = 0) noexcept;
class Q_CORE_EXPORT QRegExp
{
@@ -110,7 +110,7 @@ public:
static QString escape(const QString &str);
- friend Q_CORE_EXPORT uint qHash(const QRegExp &key, uint seed) noexcept;
+ friend Q_CORE_EXPORT size_t qHash(const QRegExp &key, size_t seed) noexcept;
private:
QRegExpPrivate *priv;
diff --git a/src/corelib/text/qregularexpression.cpp b/src/corelib/text/qregularexpression.cpp
index d74b759aa9..7ed8618e96 100644
--- a/src/corelib/text/qregularexpression.cpp
+++ b/src/corelib/text/qregularexpression.cpp
@@ -431,132 +431,6 @@ QT_BEGIN_NAMESPACE
This may change in a future version of Qt.
- \section1 Notes for QRegExp Users
-
- The QRegularExpression class introduced in Qt 5 is a big improvement upon
- QRegExp, in terms of APIs offered, supported pattern syntax and speed of
- execution. The biggest difference is that QRegularExpression simply holds a
- regular expression, and it's \e{not} modified when a match is requested.
- Instead, a QRegularExpressionMatch object is returned, in order to check
- the result of a match and extract the captured substring. The same applies
- with global matching and QRegularExpressionMatchIterator.
-
- Other differences are outlined below.
-
- \section2 Different pattern syntax
-
- Porting a regular expression from QRegExp to QRegularExpression may require
- changes to the pattern itself.
-
- In certain scenarios, QRegExp was too lenient and accepted patterns that
- are simply invalid when using QRegularExpression. These are somehow easy
- to detect, because the QRegularExpression objects built with these patterns
- are not valid (cf. isValid()).
-
- In other cases, a pattern ported from QRegExp to QRegularExpression may
- silently change semantics. Therefore, it is necessary to review the
- patterns used. The most notable cases of silent incompatibility are:
-
- \list
-
- \li Curly braces are needed in order to use a hexadecimal escape like
- \c{\xHHHH} with more than 2 digits. A pattern like \c{\x2022} neeeds to
- be ported to \c{\x{2022}}, or it will match a space (\c{0x20}) followed
- by the string \c{"22"}. In general, it is highly recommended to always use
- curly braces with the \c{\x} escape, no matter the amount of digits
- specified.
-
- \li A 0-to-n quantification like \c{{,n}} needs to be ported to \c{{0,n}} to
- preserve semantics. Otherwise, a pattern such as \c{\d{,3}} would
- actually match a digit followed by the exact string \c{"{,3}"}.
-
- \li QRegExp by default does Unicode-aware matching, while
- QRegularExpression requires a separate option; see below for more details.
-
- \endlist
-
- \section2 Porting from QRegExp::exactMatch()
-
- QRegExp::exactMatch() in Qt 4 served two purposes: it exactly matched
- a regular expression against a subject string, and it implemented partial
- matching.
-
- \section3 Porting from QRegExp's Exact Matching
-
- Exact matching indicates whether the regular expression matches the entire
- subject string. For example, the classes yield on the subject string \c{"abc123"}:
-
- \table
- \header \li \li QRegExp::exactMatch() \li QRegularExpressionMatch::hasMatch()
- \row \li \c{"\\d+"} \li \b false \li \b true
- \row \li \c{"[a-z]+\\d+"} \li \b true \li \b true
- \endtable
-
- Exact matching is not reflected in QRegularExpression. If you want
- to be sure that the subject string matches the regular expression
- exactly, you can wrap the pattern using the anchoredPattern()
- function:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 24
-
- \section3 Porting from QRegExp's Partial Matching
-
- When using QRegExp::exactMatch(), if an exact match was not found, one
- could still find out how much of the subject string was matched by the
- regular expression by calling QRegExp::matchedLength(). If the returned length
- was equal to the subject string's length, then one could conclude that a partial
- match was found.
-
- QRegularExpression supports partial matching explicitly by means of the
- appropriate MatchType.
-
- \section2 Global matching
-
- Due to limitations of the QRegExp API it was impossible to implement global
- matching correctly (that is, like Perl does). In particular, patterns that
- can match 0 characters (like \c{"a*"}) are problematic.
-
- QRegularExpression::globalMatch() implements Perl global match correctly, and
- the returned iterator can be used to examine each result.
-
- \section2 Unicode properties support
-
- When using QRegExp, character classes such as \c{\w}, \c{\d}, etc. match
- characters with the corresponding Unicode property: for instance, \c{\d}
- matches any character with the Unicode Nd (decimal digit) property.
-
- Those character classes only match ASCII characters by default when using
- QRegularExpression: for instance, \c{\d} matches exactly a character in the
- \c{0-9} ASCII range. It is possible to change this behaviour by using the
- UseUnicodePropertiesOption pattern option.
-
- \section2 Wildcard matching
-
- There is no direct way to do wildcard matching in QRegularExpression.
- However, the wildcardToRegularExpression method is provided to translate
- glob patterns into a Perl-compatible regular expression that can be used
- for that purpose.
-
- \section2 Other pattern syntaxes
-
- QRegularExpression supports only Perl-compatible regular expressions.
-
- \section2 Minimal matching
-
- QRegExp::setMinimal() implemented minimal matching by simply reversing the
- greediness of the quantifiers (QRegExp did not support lazy quantifiers,
- like \c{*?}, \c{+?}, etc.). QRegularExpression instead does support greedy,
- lazy and possessive quantifiers. The InvertedGreedinessOption
- pattern option can be useful to emulate the effects of QRegExp::setMinimal():
- if enabled, it inverts the greediness of quantifiers (greedy ones become
- lazy and vice versa).
-
- \section2 Caret modes
-
- The AnchoredMatchOption match option can be used to emulate the
- QRegExp::CaretAtOffset behaviour. There is no equivalent for the other
- QRegExp::CaretMode modes.
-
\section1 Debugging Code that Uses QRegularExpression
QRegularExpression internally uses a just in time compiler (JIT) to
@@ -788,9 +662,16 @@ QT_BEGIN_NAMESPACE
No match options are set.
\value AnchoredMatchOption
+ Use AnchorAtOffsetMatchOption instead.
+
+ \value AnchorAtOffsetMatchOption
The match is constrained to start exactly at the offset passed to
match() in order to be successful, even if the pattern string does not
contain any metacharacter that anchors the match at that point.
+ Note that passing this option does not anchor the end of the match
+ to the end of the subject; if you want to fully anchor a regular
+ expression, use anchoredPattern().
+ This enum value has been introduced in Qt 6.0.
\value DontCheckSubjectStringMatchOption
The subject string is not checked for UTF-16 validity before
@@ -832,7 +713,7 @@ static int convertToPcreOptions(QRegularExpression::MatchOptions matchOptions)
{
int options = 0;
- if (matchOptions & QRegularExpression::AnchoredMatchOption)
+ if (matchOptions & QRegularExpression::AnchorAtOffsetMatchOption)
options |= PCRE2_ANCHORED;
if (matchOptions & QRegularExpression::DontCheckSubjectStringMatchOption)
options |= PCRE2_NO_UTF_CHECK;
@@ -1821,7 +1702,7 @@ bool QRegularExpression::operator==(const QRegularExpression &re) const
Returns the hash value for \a key, using
\a seed to seed the calculation.
*/
-uint qHash(const QRegularExpression &key, uint seed) noexcept
+size_t qHash(const QRegularExpression &key, size_t seed) noexcept
{
QtPrivate::QHashCombine hash;
seed = hash(seed, key.d->pattern);
@@ -1831,12 +1712,9 @@ uint qHash(const QRegularExpression &key, uint seed) noexcept
#if QT_STRINGVIEW_LEVEL < 2
/*!
+ \fn QString QRegularExpression::escape(const QString &str)
\overload
*/
-QString QRegularExpression::escape(const QString &str)
-{
- return escape(QStringView(str));
-}
#endif // QT_STRINGVIEW_LEVEL < 2
/*!
@@ -1897,15 +1775,27 @@ QString QRegularExpression::escape(QStringView str)
#if QT_STRINGVIEW_LEVEL < 2
/*!
\since 5.12
+ \fn QString QRegularExpression::wildcardToRegularExpression(const QString &pattern, WildcardConversionType type)
\overload
*/
-QString QRegularExpression::wildcardToRegularExpression(const QString &pattern)
-{
- return wildcardToRegularExpression(QStringView(pattern));
-}
#endif // QT_STRINGVIEW_LEVEL < 2
/*!
+ \since 6.0
+ \enum QRegularExpression::WildcardConversionOption
+
+ The WildcardConversionOption enum defines modifiers to the way a wildcard glob
+ pattern gets converted to a regular expression pattern.
+
+ \value DefaultWildcardConversion
+ No conversion options are set.
+
+ \value UnanchoredWildcardConversion
+ The conversion will not anchor the pattern. This allows for partial string matches of
+ wildcard expressions.
+*/
+
+/*!
\since 5.15
Returns a regular expression representation of the given glob \a pattern.
@@ -1915,11 +1805,12 @@ QString QRegularExpression::wildcardToRegularExpression(const QString &pattern)
\snippet code/src_corelib_tools_qregularexpression.cpp 31
- The returned regular expression is already fully anchored. In other
+ By default, the returned regular expression is fully anchored. In other
words, there is no need of calling anchoredPattern() again on the
- result.
+ result. To get an a regular expression that is not anchored, pass
+ UnanchoredWildcardConversion as the conversion \a option.
- \warning Unlike QRegExp, this implementation follows closely the definition
+ This implementation follows closely the definition
of wildcard for glob patterns:
\table
\row \li \b{c}
@@ -1955,7 +1846,7 @@ QString QRegularExpression::wildcardToRegularExpression(const QString &pattern)
\sa escape()
*/
-QString QRegularExpression::wildcardToRegularExpression(QStringView pattern)
+QString QRegularExpression::wildcardToRegularExpression(QStringView pattern, WildcardConversionOptions options)
{
const int wclen = pattern.length();
QString rx;
@@ -2030,15 +1921,16 @@ QString QRegularExpression::wildcardToRegularExpression(QStringView pattern)
}
}
- return anchoredPattern(rx);
+ if (!(options & UnanchoredWildcardConversion))
+ rx = anchoredPattern(rx);
+
+ return rx;
}
#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QRegularExpression::anchoredPattern(const QString &expression)
-
\since 5.12
-
\overload
*/
#endif // QT_STRINGVIEW_LEVEL < 2
@@ -2048,8 +1940,6 @@ QString QRegularExpression::wildcardToRegularExpression(QStringView pattern)
Returns the \a expression wrapped between the \c{\A} and \c{\z} anchors to
be used for exact matching.
-
- \sa {Porting from QRegExp's Exact Matching}
*/
QString QRegularExpression::anchoredPattern(QStringView expression)
{
diff --git a/src/corelib/text/qregularexpression.h b/src/corelib/text/qregularexpression.h
index 4fa258b080..cfb7f34d9d 100644
--- a/src/corelib/text/qregularexpression.h
+++ b/src/corelib/text/qregularexpression.h
@@ -59,7 +59,7 @@ class QRegularExpressionMatchIterator;
struct QRegularExpressionPrivate;
class QRegularExpression;
-Q_CORE_EXPORT uint qHash(const QRegularExpression &key, uint seed = 0) noexcept;
+Q_CORE_EXPORT size_t qHash(const QRegularExpression &key, size_t seed = 0) noexcept;
class Q_CORE_EXPORT QRegularExpression
{
@@ -110,7 +110,8 @@ public:
enum MatchOption {
NoMatchOption = 0x0000,
- AnchoredMatchOption = 0x0001,
+ AnchoredMatchOption Q_DECL_ENUMERATOR_DEPRECATED_X("Use AnchorAtOffsetMatchOption instead") = 0x0001,
+ AnchorAtOffsetMatchOption = 0x0001,
DontCheckSubjectStringMatchOption = 0x0002
};
Q_DECLARE_FLAGS(MatchOptions, MatchOption)
@@ -137,17 +138,31 @@ public:
void optimize() const;
+ enum WildcardConversionOption {
+ DefaultWildcardConversion = 0x0,
+ UnanchoredWildcardConversion = 0x1
+ };
+ Q_DECLARE_FLAGS(WildcardConversionOptions, WildcardConversionOption)
+
#if QT_STRINGVIEW_LEVEL < 2
- static QString escape(const QString &str);
- static QString wildcardToRegularExpression(const QString &str);
+ static QString escape(const QString &str)
+ {
+ return escape(qToStringViewIgnoringNull(str));
+ }
+
+ static QString wildcardToRegularExpression(const QString &str, WildcardConversionOptions options = DefaultWildcardConversion)
+ {
+ return wildcardToRegularExpression(qToStringViewIgnoringNull(str), options);
+ }
+
static inline QString anchoredPattern(const QString &expression)
{
- return anchoredPattern(QStringView(expression));
+ return anchoredPattern(qToStringViewIgnoringNull(expression));
}
#endif
static QString escape(QStringView str);
- static QString wildcardToRegularExpression(QStringView str);
+ static QString wildcardToRegularExpression(QStringView str, WildcardConversionOptions options = DefaultWildcardConversion);
static QString anchoredPattern(QStringView expression);
bool operator==(const QRegularExpression &re) const;
@@ -158,7 +173,7 @@ private:
friend class QRegularExpressionMatch;
friend struct QRegularExpressionMatchPrivate;
friend class QRegularExpressionMatchIterator;
- friend Q_CORE_EXPORT uint qHash(const QRegularExpression &key, uint seed) noexcept;
+ friend Q_CORE_EXPORT size_t qHash(const QRegularExpression &key, size_t seed) noexcept;
QRegularExpression(QRegularExpressionPrivate &dd);
QExplicitlySharedDataPointer<QRegularExpressionPrivate> d;
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp
index 210a8afc53..3f24665a8a 100644
--- a/src/corelib/text/qstring.cpp
+++ b/src/corelib/text/qstring.cpp
@@ -100,7 +100,7 @@
#define ULLONG_MAX quint64_C(18446744073709551615)
#endif
-#define IS_RAW_DATA(d) ((d)->offset != sizeof(QStringData))
+#define IS_RAW_DATA(d) ((d.d)->flags & QArrayData::RawDataType)
QT_BEGIN_NAMESPACE
@@ -163,7 +163,7 @@ qsizetype QtPrivate::qustrlen(const ushort *str) noexcept
{
qsizetype result = 0;
-#ifdef __SSE2__
+#if defined(__SSE2__) && !(defined(__SANITIZE_ADDRESS__) || QT_HAS_FEATURE(address_sanitizer))
// find the 16-byte alignment immediately prior or equal to str
quintptr misalignment = quintptr(str) & 0xf;
Q_ASSERT((misalignment & 1) == 0);
@@ -1377,28 +1377,6 @@ const QString::Null QString::null = { };
*/
/*!
- \class QCharRef
- \inmodule QtCore
- \reentrant
- \brief The QCharRef class is a helper class for QString.
-
- \internal
-
- \ingroup string-processing
-
- When you get an object of type QCharRef, if you can assign to it,
- the assignment will apply to the character in the string from
- which you got the reference. That is its whole purpose in life.
- The QCharRef becomes invalid once modifications are made to the
- string: if you want to keep the character, copy it into a QChar.
-
- Most of the QChar member functions also exist in QCharRef.
- However, they are not explicitly documented here.
-
- \sa QString::operator[](), QString::at(), QChar
-*/
-
-/*!
\class QString
\inmodule QtCore
\reentrant
@@ -2120,8 +2098,8 @@ int QString::toUcs4_helper(const ushort *uc, int length, uint *out)
*/
QString::QString(const QChar *unicode, int size)
{
- if (!unicode) {
- d = Data::sharedNull();
+ if (!unicode) {
+ d.clear();
} else {
if (size < 0) {
size = 0;
@@ -2129,13 +2107,11 @@ QString::QString(const QChar *unicode, int size)
++size;
}
if (!size) {
- d = Data::allocate(0);
+ d = DataPointer(Data::allocate(0), 0);
} else {
- d = Data::allocate(size + 1);
- Q_CHECK_PTR(d);
- d->size = size;
- memcpy(d->data(), unicode, size * sizeof(QChar));
- d->data()[size] = '\0';
+ d = DataPointer(Data::allocate(size + 1), size);
+ memcpy(d.data(), unicode, size * sizeof(QChar));
+ d.data()[size] = '\0';
}
}
}
@@ -2148,15 +2124,13 @@ QString::QString(const QChar *unicode, int size)
*/
QString::QString(int size, QChar ch)
{
- if (size <= 0) {
- d = Data::allocate(0);
+ if (size <= 0) {
+ d = DataPointer(Data::allocate(0), 0);
} else {
- d = Data::allocate(size + 1);
- Q_CHECK_PTR(d);
- d->size = size;
- d->data()[size] = '\0';
- ushort *i = d->data() + size;
- ushort *b = d->data();
+ d = DataPointer(Data::allocate(size + 1), size);
+ d.data()[size] = '\0';
+ ushort *i = d.data() + size;
+ ushort *b = d.data();
const ushort value = ch.unicode();
while (i != b)
*--i = value;
@@ -2171,10 +2145,8 @@ QString::QString(int size, QChar ch)
*/
QString::QString(int size, Qt::Initialization)
{
- d = Data::allocate(size + 1);
- Q_CHECK_PTR(d);
- d->size = size;
- d->data()[size] = '\0';
+ d = DataPointer(Data::allocate(size + 1), size);
+ d.data()[size] = '\0';
}
/*! \fn QString::QString(QLatin1String str)
@@ -2189,11 +2161,9 @@ QString::QString(int size, Qt::Initialization)
*/
QString::QString(QChar ch)
{
- d = Data::allocate(2);
- Q_CHECK_PTR(d);
- d->size = 1;
- d->data()[0] = ch.unicode();
- d->data()[1] = '\0';
+ d = DataPointer(Data::allocate(2), 1);
+ d.data()[0] = ch.unicode();
+ d.data()[1] = '\0';
}
/*! \fn QString::QString(const QByteArray &ba)
@@ -2215,7 +2185,7 @@ QString::QString(QChar ch)
\internal
*/
-/*! \fn QString::QString(QStringDataPtr)
+/*! \fn QString::QString(QStringPrivate)
\internal
*/
@@ -2285,16 +2255,16 @@ void QString::resize(int size)
if (size < 0)
size = 0;
- if (IS_RAW_DATA(d) && !d->ref.isShared() && size < d->size) {
- d->size = size;
+ if (!d->isShared() && !d->isMutable() && size < int(d.size)) {
+ d.size = size;
return;
}
- if (d->ref.isShared() || uint(size) + 1u > d->alloc)
+ if (d->needsDetach() || size > capacity())
reallocData(uint(size) + 1u, true);
- if (d->alloc) {
- d->size = size;
- d->data()[size] = '\0';
+ d.size = size;
+ if (d->isMutable()) {
+ d.data()[size] = '\0';
}
}
@@ -2314,7 +2284,7 @@ void QString::resize(int size, QChar fillChar)
resize(size);
const int difference = length() - oldSize;
if (difference > 0)
- std::fill_n(d->begin() + oldSize, difference, fillChar.unicode());
+ std::fill_n(d.data() + oldSize, difference, fillChar.unicode());
}
/*! \fn int QString::capacity() const
@@ -2371,28 +2341,22 @@ void QString::reallocData(uint alloc, bool grow)
{
auto allocOptions = d->detachFlags();
if (grow)
- allocOptions |= QArrayData::Grow;
-
- if (d->ref.isShared() || IS_RAW_DATA(d)) {
- Data *x = Data::allocate(alloc, allocOptions);
- Q_CHECK_PTR(x);
- x->size = qMin(int(alloc) - 1, d->size);
- ::memcpy(x->data(), d->data(), x->size * sizeof(QChar));
- x->data()[x->size] = 0;
- if (!d->ref.deref())
- Data::deallocate(d);
- d = x;
+ allocOptions |= QArrayData::GrowsForward;
+
+ if (d->needsDetach()) {
+ DataPointer dd(Data::allocate(alloc, allocOptions), qMin(int(alloc) - 1, d.size));
+ ::memcpy(dd.data(), d.data(), dd.size * sizeof(QChar));
+ dd.data()[dd.size] = 0;
+ d = dd;
} else {
- Data *p = Data::reallocateUnaligned(d, alloc, allocOptions);
- Q_CHECK_PTR(p);
- d = p;
+ d.reallocate(alloc, allocOptions);
}
}
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
void QString::expand(int i)
{
- resize(qMax(i + 1, d->size), QLatin1Char(' '));
+ resize(qMax(i + 1, size()), QLatin1Char(' '));
}
#endif
@@ -2411,9 +2375,6 @@ void QString::expand(int i)
QString &QString::operator=(const QString &other) noexcept
{
- other.d->ref.ref();
- if (!d->ref.deref())
- Data::deallocate(d);
d = other.d;
return *this;
}
@@ -2435,9 +2396,9 @@ QString &QString::operator=(const QString &other) noexcept
QString &QString::operator=(QLatin1String other)
{
if (isDetached() && other.size() <= capacity()) { // assumes d->alloc == 0 -> !isDetached() (sharedNull)
- d->size = other.size();
- d->data()[other.size()] = 0;
- qt_from_latin1(d->data(), other.latin1(), other.size());
+ d.size = other.size();
+ d.data()[other.size()] = 0;
+ qt_from_latin1(d.data(), other.latin1(), other.size());
} else {
*this = fromLatin1(other.latin1(), other.size());
}
@@ -2500,10 +2461,9 @@ QString &QString::operator=(QChar ch)
{
if (isDetached() && capacity() >= 1) { // assumes d->alloc == 0 -> !isDetached() (sharedNull)
// re-use existing capacity:
- ushort *dat = d->data();
- dat[0] = ch.unicode();
- dat[1] = 0;
- d->size = 1;
+ d.data()[0] = ch.unicode();
+ d.data()[1] = 0;
+ d.size = 1;
} else {
operator=(QString(ch));
}
@@ -2589,13 +2549,13 @@ QString &QString::insert(int i, QLatin1String str)
return *this;
int len = str.size();
- if (Q_UNLIKELY(i > d->size))
+ if (Q_UNLIKELY(i > size()))
resize(i + len, QLatin1Char(' '));
else
- resize(d->size + len);
+ resize(size() + len);
- ::memmove(d->data() + i + len, d->data() + i, (d->size - i - len) * sizeof(QChar));
- qt_from_latin1(d->data() + i, s, uint(len));
+ ::memmove(d.data() + i + len, d.data() + i, (d.size - i - len) * sizeof(QChar));
+ qt_from_latin1(d.data() + i, s, uint(len));
return *this;
}
@@ -2612,7 +2572,7 @@ QString& QString::insert(int i, const QChar *unicode, int size)
return *this;
const ushort *s = (const ushort *)unicode;
- if (s >= d->data() && s < d->data() + d->alloc) {
+ if (s >= d.data() && s < d.data() + d.size) {
// Part of me - take a copy
ushort *tmp = static_cast<ushort *>(::malloc(size * sizeof(QChar)));
Q_CHECK_PTR(tmp);
@@ -2622,13 +2582,13 @@ QString& QString::insert(int i, const QChar *unicode, int size)
return *this;
}
- if (Q_UNLIKELY(i > d->size))
+ if (Q_UNLIKELY(i > int(d.size)))
resize(i + size, QLatin1Char(' '));
else
- resize(d->size + size);
+ resize(d.size + size);
- ::memmove(d->data() + i + size, d->data() + i, (d->size - i - size) * sizeof(QChar));
- memcpy(d->data() + i, s, size * sizeof(QChar));
+ ::memmove(d.data() + i + size, d.data() + i, (d.size - i - size) * sizeof(QChar));
+ memcpy(d.data() + i, s, size * sizeof(QChar));
return *this;
}
@@ -2642,15 +2602,15 @@ QString& QString::insert(int i, const QChar *unicode, int size)
QString& QString::insert(int i, QChar ch)
{
if (i < 0)
- i += d->size;
+ i += d.size;
if (i < 0)
return *this;
- if (Q_UNLIKELY(i > d->size))
+ if (Q_UNLIKELY(i > size()))
resize(i + 1, QLatin1Char(' '));
else
- resize(d->size + 1);
- ::memmove(d->data() + i + 1, d->data() + i, (d->size - i - 1) * sizeof(QChar));
- d->data()[i] = ch.unicode();
+ resize(d.size + 1);
+ ::memmove(d.data() + i + 1, d.data() + i, (d.size - i - 1) * sizeof(QChar));
+ d.data()[i] = ch.unicode();
return *this;
}
@@ -2674,15 +2634,15 @@ QString& QString::insert(int i, QChar ch)
*/
QString &QString::append(const QString &str)
{
- if (str.d != Data::sharedNull()) {
- if (d == Data::sharedNull()) {
+ if (!str.isNull()) {
+ if (isNull()) {
operator=(str);
} else {
- if (d->ref.isShared() || uint(d->size + str.d->size) + 1u > d->alloc)
- reallocData(uint(d->size + str.d->size) + 1u, true);
- memcpy(d->data() + d->size, str.d->data(), str.d->size * sizeof(QChar));
- d->size += str.d->size;
- d->data()[d->size] = '\0';
+ if (d->needsDetach() || size() + str.size() > capacity())
+ reallocData(uint(size() + str.size()) + 1u, true);
+ memcpy(d.data() + d.size, str.d.data(), str.d.size * sizeof(QChar));
+ d.size += str.d.size;
+ d.data()[d.size] = '\0';
}
}
return *this;
@@ -2697,11 +2657,11 @@ QString &QString::append(const QString &str)
QString &QString::append(const QChar *str, int len)
{
if (str && len > 0) {
- if (d->ref.isShared() || uint(d->size + len) + 1u > d->alloc)
- reallocData(uint(d->size + len) + 1u, true);
- memcpy(d->data() + d->size, str, len * sizeof(QChar));
- d->size += len;
- d->data()[d->size] = '\0';
+ if (d->needsDetach() || size() + len > capacity())
+ reallocData(uint(size() + len) + 1u, true);
+ memcpy(d.data() + d.size, str, len * sizeof(QChar));
+ d.size += len;
+ d.data()[d.size] = '\0';
}
return *this;
}
@@ -2716,12 +2676,12 @@ QString &QString::append(QLatin1String str)
const char *s = str.latin1();
if (s) {
int len = str.size();
- if (d->ref.isShared() || uint(d->size + len) + 1u > d->alloc)
- reallocData(uint(d->size + len) + 1u, true);
- ushort *i = d->data() + d->size;
+ if (d->needsDetach() || size() + len > capacity())
+ reallocData(uint(size() + len) + 1u, true);
+ ushort *i = d.data() + d.size;
qt_from_latin1(i, s, uint(len));
i[len] = '\0';
- d->size += len;
+ d.size += len;
}
return *this;
}
@@ -2763,10 +2723,10 @@ QString &QString::append(QLatin1String str)
*/
QString &QString::append(QChar ch)
{
- if (d->ref.isShared() || uint(d->size) + 2u > d->alloc)
- reallocData(uint(d->size) + 2u, true);
- d->data()[d->size++] = ch.unicode();
- d->data()[d->size] = '\0';
+ if (d->needsDetach() || size() + 1 > capacity())
+ reallocData(uint(d.size) + 2u, true);
+ d.data()[d.size++] = ch.unicode();
+ d.data()[d.size] = '\0';
return *this;
}
@@ -2859,16 +2819,16 @@ QString &QString::append(QChar ch)
QString &QString::remove(int pos, int len)
{
if (pos < 0) // count from end of string
- pos += d->size;
- if (uint(pos) >= uint(d->size)) {
+ pos += size();
+ if (uint(pos) >= uint(size())) {
// range problems
- } else if (len >= d->size - pos) {
+ } else if (len >= size() - pos) {
resize(pos); // truncate
} else if (len > 0) {
detach();
- memmove(d->data() + pos, d->data() + pos + len,
- (d->size - pos - len + 1) * sizeof(ushort));
- d->size -= len;
+ memmove(d.data() + pos, d.data() + pos + len,
+ (d.size - pos - len + 1) * sizeof(ushort));
+ d.size -= len;
}
return *this;
}
@@ -3013,10 +2973,10 @@ QString &QString::replace(int pos, int len, const QString &after)
*/
QString &QString::replace(int pos, int len, const QChar *unicode, int size)
{
- if (uint(pos) > uint(d->size))
+ if (uint(pos) > uint(this->size()))
return *this;
- if (len > d->size - pos)
- len = d->size - pos;
+ if (len > this->size() - pos)
+ len = this->size() - pos;
uint index = pos;
replace_helper(&index, 1, len, unicode, size);
@@ -3080,10 +3040,10 @@ bool pointsIntoRange(const QChar *ptr, const ushort *base, int len)
*/
void QString::replace_helper(uint *indices, int nIndices, int blen, const QChar *after, int alen)
{
- // Copy after if it lies inside our own d->data() area (which we could
+ // Copy after if it lies inside our own d.b area (which we could
// possibly invalidate via a realloc or modify by replacement).
QChar *afterBuffer = nullptr;
- if (pointsIntoRange(after, d->data(), d->size)) // Use copy in place of vulnerable original:
+ if (pointsIntoRange(after, d.data(), d.size)) // Use copy in place of vulnerable original:
after = afterBuffer = textCopy(after, alen);
QT_TRY {
@@ -3091,36 +3051,36 @@ void QString::replace_helper(uint *indices, int nIndices, int blen, const QChar
// replace in place
detach();
for (int i = 0; i < nIndices; ++i)
- memcpy(d->data() + indices[i], after, alen * sizeof(QChar));
+ memcpy(d.data() + indices[i], after, alen * sizeof(QChar));
} else if (alen < blen) {
// replace from front
detach();
uint to = indices[0];
if (alen)
- memcpy(d->data()+to, after, alen*sizeof(QChar));
+ memcpy(d.data()+to, after, alen*sizeof(QChar));
to += alen;
uint movestart = indices[0] + blen;
for (int i = 1; i < nIndices; ++i) {
int msize = indices[i] - movestart;
if (msize > 0) {
- memmove(d->data() + to, d->data() + movestart, msize * sizeof(QChar));
+ memmove(d.data() + to, d.data() + movestart, msize * sizeof(QChar));
to += msize;
}
if (alen) {
- memcpy(d->data() + to, after, alen * sizeof(QChar));
+ memcpy(d.data() + to, after, alen * sizeof(QChar));
to += alen;
}
movestart = indices[i] + blen;
}
- int msize = d->size - movestart;
+ int msize = d.size - movestart;
if (msize > 0)
- memmove(d->data() + to, d->data() + movestart, msize * sizeof(QChar));
- resize(d->size - nIndices*(blen-alen));
+ memmove(d.data() + to, d.data() + movestart, msize * sizeof(QChar));
+ resize(d.size - nIndices*(blen-alen));
} else {
// replace from back
int adjust = nIndices*(alen-blen);
- int newLen = d->size + adjust;
- int moveend = d->size;
+ int newLen = d.size + adjust;
+ int moveend = d.size;
resize(newLen);
while (nIndices) {
@@ -3128,9 +3088,9 @@ void QString::replace_helper(uint *indices, int nIndices, int blen, const QChar
int movestart = indices[nIndices] + blen;
int insertstart = indices[nIndices] + nIndices*(alen-blen);
int moveto = insertstart + alen;
- memmove(d->data() + moveto, d->data() + movestart,
+ memmove(d.data() + moveto, d.data() + movestart,
(moveend - movestart)*sizeof(QChar));
- memcpy(d->data() + insertstart, after, alen * sizeof(QChar));
+ memcpy(d.data() + insertstart, after, alen * sizeof(QChar));
moveend = movestart-blen;
}
}
@@ -3156,7 +3116,7 @@ QString &QString::replace(const QChar *before, int blen,
const QChar *after, int alen,
Qt::CaseSensitivity cs)
{
- if (d->size == 0) {
+ if (d.size == 0) {
if (blen)
return *this;
} else {
@@ -3191,10 +3151,10 @@ QString &QString::replace(const QChar *before, int blen,
We're about to change data, that before and after might point
into, and we'll need that data for our next batch of indices.
*/
- if (!afterBuffer && pointsIntoRange(after, d->data(), d->size))
+ if (!afterBuffer && pointsIntoRange(after, d.data(), d.size))
after = afterBuffer = textCopy(after, alen);
- if (!beforeBuffer && pointsIntoRange(before, d->data(), d->size)) {
+ if (!beforeBuffer && pointsIntoRange(before, d.data(), d.size)) {
beforeBuffer = textCopy(before, blen);
matcher = QStringMatcher(beforeBuffer, blen, cs);
}
@@ -3223,13 +3183,13 @@ QString &QString::replace(const QChar *before, int blen,
*/
QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs)
{
- if (after.d->size == 0)
+ if (after.size() == 0)
return remove(ch, cs);
- if (after.d->size == 1)
+ if (after.size() == 1)
return replace(ch, after.front(), cs);
- if (d->size == 0)
+ if (size() == 0)
return *this;
ushort cc = (cs == Qt::CaseSensitive ? ch.unicode() : ch.toCaseFolded().unicode());
@@ -3239,14 +3199,14 @@ QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs
uint indices[1024];
uint pos = 0;
if (cs == Qt::CaseSensitive) {
- while (pos < 1024 && index < d->size) {
- if (d->data()[index] == cc)
+ while (pos < 1024 && index < size()) {
+ if (d.data()[index] == cc)
indices[pos++] = index;
index++;
}
} else {
- while (pos < 1024 && index < d->size) {
- if (QChar::toCaseFolded(d->data()[index]) == cc)
+ while (pos < 1024 && index < size()) {
+ if (QChar::toCaseFolded(d.data()[index]) == cc)
indices[pos++] = index;
index++;
}
@@ -3254,12 +3214,12 @@ QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs
if (!pos) // Nothing to replace
break;
- replace_helper(indices, pos, 1, after.constData(), after.d->size);
+ replace_helper(indices, pos, 1, after.constData(), after.size());
if (Q_LIKELY(index == -1)) // Nothing left to replace
break;
// The call to replace_helper just moved what index points at:
- index += pos*(after.d->size - 1);
+ index += pos*(after.size() - 1);
}
return *this;
}
@@ -3274,13 +3234,13 @@ QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs
*/
QString& QString::replace(QChar before, QChar after, Qt::CaseSensitivity cs)
{
- if (d->size) {
+ if (d.size) {
const int idx = indexOf(before, 0, cs);
if (idx != -1) {
detach();
const ushort a = after.unicode();
- ushort *i = d->data();
- const ushort *e = i + d->size;
+ ushort *i = d.data();
+ ushort *const e = i + d.size;
i += idx;
*i = a;
if (cs == Qt::CaseSensitive) {
@@ -3341,7 +3301,7 @@ QString &QString::replace(QLatin1String before, const QString &after, Qt::CaseSe
int blen = before.size();
QVarLengthArray<ushort> b(blen);
qt_from_latin1(b.data(), before.latin1(), blen);
- return replace((const QChar *)b.data(), blen, after.constData(), after.d->size, cs);
+ return replace((const QChar *)b.data(), blen, after.constData(), after.d.size, cs);
}
/*!
@@ -3361,7 +3321,7 @@ QString &QString::replace(const QString &before, QLatin1String after, Qt::CaseSe
int alen = after.size();
QVarLengthArray<ushort> a(alen);
qt_from_latin1(a.data(), after.latin1(), alen);
- return replace(before.constData(), before.d->size, (const QChar *)a.data(), alen, cs);
+ return replace(before.constData(), before.d.size, (const QChar *)a.data(), alen, cs);
}
/*!
@@ -3397,7 +3357,7 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
*/
bool operator==(const QString &s1, const QString &s2) noexcept
{
- if (s1.d->size != s2.d->size)
+ if (s1.d.size != s2.d.size)
return false;
return qt_compare_strings(s1, s2, Qt::CaseSensitive) == 0;
@@ -3410,7 +3370,7 @@ bool operator==(const QString &s1, const QString &s2) noexcept
*/
bool QString::operator==(QLatin1String other) const noexcept
{
- if (d->size != other.size())
+ if (size() != other.size())
return false;
return qt_compare_strings(*this, other, Qt::CaseSensitive) == 0;
@@ -3956,7 +3916,7 @@ QString& QString::replace(const QRegExp &rx, const QString &after)
if (isEmpty() && rx2.indexIn(*this) == -1)
return *this;
- reallocData(uint(d->size) + 1u);
+ reallocData(uint(d.size) + 1u);
int index = 0;
int numCaptures = rx2.captureCount();
@@ -4055,8 +4015,8 @@ QString& QString::replace(const QRegExp &rx, const QString &after)
}
if (!pos)
break;
- replacements[pos].pos = d->size;
- int newlen = d->size + adjust;
+ replacements[pos].pos = d.size;
+ int newlen = d.size + adjust;
// to continue searching at the right position after we did
// the first round of replacements
@@ -4071,14 +4031,14 @@ QString& QString::replace(const QRegExp &rx, const QString &after)
while (i < pos) {
int copyend = replacements[i].pos;
int size = copyend - copystart;
- memcpy(static_cast<void*>(uc), static_cast<const void *>(d->data() + copystart), size * sizeof(QChar));
+ memcpy(static_cast<void*>(uc), static_cast<const void *>(d.data() + copystart), size * sizeof(QChar));
uc += size;
- memcpy(static_cast<void *>(uc), static_cast<const void *>(after.d->data()), al * sizeof(QChar));
+ memcpy(static_cast<void *>(uc), static_cast<const void *>(after.d.data()), al * sizeof(QChar));
uc += al;
copystart = copyend + replacements[i].length;
i++;
}
- memcpy(static_cast<void *>(uc), static_cast<const void *>(d->data() + copystart), (d->size - copystart) * sizeof(QChar));
+ memcpy(static_cast<void *>(uc), static_cast<const void *>(d.data() + copystart), (d.size - copystart) * sizeof(QChar));
newstring.resize(newlen);
*this = newstring;
caretMode = QRegExp::CaretWontMatch;
@@ -4118,7 +4078,7 @@ QString &QString::replace(const QRegularExpression &re, const QString &after)
if (!iterator.hasNext()) // no matches at all
return *this;
- reallocData(uint(d->size) + 1u);
+ reallocData(uint(d.size) + 1u);
int numCaptures = re.captureCount();
@@ -4451,24 +4411,6 @@ int QString::count(const QRegExp& rx) const
#if QT_CONFIG(regularexpression)
/*!
- \overload indexOf()
- \since 5.0
-
- Returns the index position of the first match of the regular
- expression \a re in the string, searching forward from index
- position \a from. Returns -1 if \a re didn't match anywhere.
-
- Example:
-
- \snippet qstring/main.cpp 93
-*/
-int QString::indexOf(const QRegularExpression& re, int from) const
-{
- return indexOf(re, from, nullptr);
-}
-
-/*!
- \overload
\since 5.5
Returns the index position of the first match of the regular
@@ -4481,7 +4423,7 @@ int QString::indexOf(const QRegularExpression& re, int from) const
Example:
- \snippet qstring/main.cpp 99
+ \snippet qstring/main.cpp 93
*/
int QString::indexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const
{
@@ -4502,24 +4444,6 @@ int QString::indexOf(const QRegularExpression &re, int from, QRegularExpressionM
}
/*!
- \overload lastIndexOf()
- \since 5.0
-
- Returns the index position of the last match of the regular
- expression \a re in the string, which starts before the index
- position \a from. Returns -1 if \a re didn't match anywhere.
-
- Example:
-
- \snippet qstring/main.cpp 94
-*/
-int QString::lastIndexOf(const QRegularExpression &re, int from) const
-{
- return lastIndexOf(re, from, nullptr);
-}
-
-/*!
- \overload
\since 5.5
Returns the index position of the last match of the regular
@@ -4532,7 +4456,7 @@ int QString::lastIndexOf(const QRegularExpression &re, int from) const
Example:
- \snippet qstring/main.cpp 100
+ \snippet qstring/main.cpp 94
*/
int QString::lastIndexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const
{
@@ -4559,19 +4483,7 @@ int QString::lastIndexOf(const QRegularExpression &re, int from, QRegularExpress
return lastIndex;
}
-/*! \overload contains()
- \since 5.0
-
- Returns \c true if the regular expression \a re matches somewhere in
- this string; otherwise returns \c false.
-*/
-bool QString::contains(const QRegularExpression &re) const
-{
- return contains(re, nullptr);
-}
-
/*!
- \overload contains()
\since 5.1
Returns \c true if the regular expression \a re matches somewhere in this
@@ -4918,9 +4830,9 @@ QString QString::section(const QRegularExpression &re, int start, int end, Secti
*/
QString QString::left(int n) const
{
- if (uint(n) >= uint(d->size))
+ if (uint(n) >= uint(size()))
return *this;
- return QString((const QChar*) d->data(), n);
+ return QString((const QChar*) d.data(), n);
}
/*!
@@ -4936,9 +4848,9 @@ QString QString::left(int n) const
*/
QString QString::right(int n) const
{
- if (uint(n) >= uint(d->size))
+ if (uint(n) >= uint(size()))
return *this;
- return QString((const QChar*) d->data() + d->size - n, n);
+ return QString(constData() + size() - n, n);
}
/*!
@@ -4961,18 +4873,19 @@ QString QString::right(int n) const
QString QString::mid(int position, int n) const
{
using namespace QtPrivate;
- switch (QContainerImplHelper::mid(d->size, &position, &n)) {
+ switch (QContainerImplHelper::mid(size(), &position, &n)) {
case QContainerImplHelper::Null:
return QString();
case QContainerImplHelper::Empty:
{
- QStringDataPtr empty = { Data::allocate(0) };
+ QPair<Data *, ushort *> pair = Data::allocate(0);
+ DataPointer empty = { pair.first, pair.second, 0 };
return QString(empty);
}
case QContainerImplHelper::Full:
return *this;
case QContainerImplHelper::Subset:
- return QString((const QChar*)d->data() + position, n);
+ return QString(constData() + position, n);
}
Q_UNREACHABLE();
return QString();
@@ -5222,29 +5135,29 @@ QByteArray QString::toLatin1_helper_inplace(QString &s)
// We can return our own buffer to the caller.
// Conversion to Latin-1 always shrinks the buffer by half.
- const ushort *data = reinterpret_cast<const ushort *>(s.constData());
- uint length = s.size();
+ const ushort *data = s.d.data();
+ int length = s.d.size;
- // Swap the d pointers.
+ // Move the d pointer over to the bytearray.
// Kids, avert your eyes. Don't try this at home.
- QArrayData *ba_d = s.d;
- // multiply the allocated capacity by sizeof(ushort)
- ba_d->alloc *= sizeof(ushort);
+ // this relies on the fact that we use QArrayData for everything behind the scenes which has the same layout
+ static_assert(sizeof(QByteArray::DataPointer) == sizeof(QString::DataPointer), "sizes have to be equal");
+ QByteArray::DataPointer ba_d(reinterpret_cast<QByteArray::Data *>(s.d.d_ptr()), reinterpret_cast<char *>(s.d.data()), length);
+ ba_d.ref();
+ s.clear();
- // reset ourselves to QString()
- s.d = QString().d;
+ char *ddata = ba_d.data();
- // do the in-place conversion
- uchar *dst = reinterpret_cast<uchar *>(ba_d->data());
- qt_to_latin1(dst, data, length);
- dst[length] = '\0';
+ // multiply the allocated capacity by sizeof(ushort)
+ ba_d.d_ptr()->alloc *= sizeof(ushort);
- QByteArrayDataPtr badptr = { ba_d };
- return QByteArray(badptr);
+ // do the in-place conversion
+ qt_to_latin1(reinterpret_cast<uchar *>(ddata), data, length);
+ ddata[length] = '\0';
+ return QByteArray(ba_d);
}
-
/*!
\fn QByteArray QString::toLatin1() const
@@ -5257,19 +5170,6 @@ QByteArray QString::toLatin1_helper_inplace(QString &s)
\sa fromLatin1(), toUtf8(), toLocal8Bit(), QTextCodec
*/
-/*!
- \fn QByteArray QString::toAscii() const
- \deprecated
- Returns an 8-bit representation of the string as a QByteArray.
-
- This function does the same as toLatin1().
-
- Note that, despite the name, this function does not necessarily return an US-ASCII
- (ANSI X3.4-1986) string and its result may not be US-ASCII compatible.
-
- \sa fromAscii(), toLatin1(), toUtf8(), toLocal8Bit(), QTextCodec
-*/
-
static QByteArray qt_convert_to_local_8bit(QStringView string);
/*!
@@ -5304,7 +5204,7 @@ static QByteArray qt_convert_to_local_8bit(QStringView string)
if (localeCodec)
return localeCodec->fromUnicode(string);
#endif // textcodec
- return qt_convert_to_latin1(string);
+ return string.toUtf8();
}
/*!
@@ -5424,34 +5324,25 @@ QVector<uint> QtPrivate::convertToUcs4(QStringView string)
return qt_convert_to_ucs4(string);
}
-QString::Data *QString::fromLatin1_helper(const char *str, int size)
+QString::DataPointer QString::fromLatin1_helper(const char *str, int size)
{
- Data *d;
+ DataPointer d;
if (!str) {
- d = Data::sharedNull();
+ // nothing to do
} else if (size == 0 || (!*str && size < 0)) {
- d = Data::allocate(0);
+ d = DataPointer(Data::allocate(0), 0);
} else {
if (size < 0)
size = qstrlen(str);
- d = Data::allocate(size + 1);
- Q_CHECK_PTR(d);
- d->size = size;
- d->data()[size] = '\0';
- ushort *dst = d->data();
+ d = DataPointer(Data::allocate(size + 1), size);
+ d.data()[size] = '\0';
+ ushort *dst = d.data();
qt_from_latin1(dst, str, uint(size));
}
return d;
}
-QString::Data *QString::fromAscii_helper(const char *str, int size)
-{
- QString s = fromUtf8(str, size);
- s.d->ref.ref();
- return s.d;
-}
-
/*! \fn QString QString::fromLatin1(const char *str, int size)
Returns a QString initialized with the first \a size characters
of the Latin-1 string \a str.
@@ -5494,7 +5385,8 @@ QString QString::fromLocal8Bit_helper(const char *str, int size)
if (!str)
return QString();
if (size == 0 || (!*str && size < 0)) {
- QStringDataPtr empty = { Data::allocate(0) };
+ QPair<Data *, ushort *> pair = Data::allocate(0);
+ QString::DataPointer empty = { pair.first, pair.second, 0 };
return QString(empty);
}
#if QT_CONFIG(textcodec)
@@ -5504,32 +5396,9 @@ QString QString::fromLocal8Bit_helper(const char *str, int size)
if (codec)
return codec->toUnicode(str, size);
#endif // textcodec
- return fromLatin1(str, size);
+ return fromUtf8(str, size);
}
-/*! \fn QString QString::fromAscii(const char *, int size);
- \deprecated
-
- Returns a QString initialized with the first \a size characters
- from the string \a str.
-
- If \a size is -1 (default), it is taken to be strlen(\a
- str).
-
- This function does the same as fromLatin1().
-
- \sa toAscii(), fromLatin1(), fromUtf8(), fromLocal8Bit()
-*/
-
-/*!
- \fn QString QString::fromAscii(const QByteArray &str)
- \deprecated
- \overload
- \since 5.0
-
- Returns a QString initialized with the string \a str.
-*/
-
/*! \fn QString QString::fromUtf8(const char *str, int size)
Returns a QString initialized with the first \a size bytes
of the UTF-8 string \a str.
@@ -5664,7 +5533,7 @@ QString& QString::setUnicode(const QChar *unicode, int size)
{
resize(size);
if (unicode && size)
- memcpy(d->data(), unicode, size * sizeof(QChar));
+ memcpy(d.data(), unicode, size * sizeof(QChar));
return *this;
}
@@ -5786,7 +5655,7 @@ QString QString::trimmed_helper(QString &str)
*/
/*!
- \fn QCharRef QString::operator[](int position)
+ \fn QChar &QString::operator[](int position)
Returns the character at the specified \a position in the string as a
modifiable reference.
@@ -5795,20 +5664,6 @@ QString QString::trimmed_helper(QString &str)
\snippet qstring/main.cpp 85
- The return value is of type QCharRef, a helper class for QString.
- When you get an object of type QCharRef, you can use it as if it
- were a reference to a QChar. If you assign to it, the assignment will apply to
- the character in the QString from which you got the reference.
-
- \note Before Qt 5.14 it was possible to use this operator to access
- a character at an out-of-bounds position in the string, and
- then assign to such a position, causing the string to be
- automatically resized. Furthermore, assigning a value to the
- returned QCharRef would cause a detach of the string, even if the
- string has been copied in the meanwhile (and the QCharRef kept
- alive while the copy was taken). These behaviors are deprecated,
- and will be changed in a future version of Qt.
-
\sa at()
*/
@@ -5818,19 +5673,6 @@ QString QString::trimmed_helper(QString &str)
\overload operator[]()
*/
-/*! \fn QCharRef QString::operator[](uint position)
-
-\overload operator[]()
-
-Returns the character at the specified \a position in the string as a
-modifiable reference.
-*/
-
-/*! \fn const QChar QString::operator[](uint position) const
- Equivalent to \c at(position).
-\overload operator[]()
-*/
-
/*!
\fn QChar QString::front() const
\since 5.10
@@ -5862,7 +5704,7 @@ modifiable reference.
*/
/*!
- \fn QCharRef QString::front()
+ \fn QChar &QString::front()
\since 5.10
Returns a reference to the first character in the string.
@@ -5877,7 +5719,7 @@ modifiable reference.
*/
/*!
- \fn QCharRef QString::back()
+ \fn QChar &QString::back()
\since 5.10
Returns a reference to the last character in the string.
@@ -5910,7 +5752,7 @@ modifiable reference.
void QString::truncate(int pos)
{
- if (pos < d->size)
+ if (pos < size())
resize(pos);
}
@@ -5932,7 +5774,7 @@ void QString::truncate(int pos)
void QString::chop(int n)
{
if (n > 0)
- resize(d->size - n);
+ resize(d.size - n);
}
/*!
@@ -5949,10 +5791,10 @@ void QString::chop(int n)
QString& QString::fill(QChar ch, int size)
{
- resize(size < 0 ? d->size : size);
- if (d->size) {
- QChar *i = (QChar*)d->data() + d->size;
- QChar *b = (QChar*)d->data();
+ resize(size < 0 ? d.size : size);
+ if (d.size) {
+ QChar *i = (QChar*)d.data() + d.size;
+ QChar *b = (QChar*)d.data();
while (i != b)
*--i = ch;
}
@@ -6543,11 +6385,11 @@ int QString::localeAwareCompare_helper(const QChar *data1, int length1,
const ushort *QString::utf16() const
{
- if (IS_RAW_DATA(d)) {
+ if (!d->isMutable()) {
// ensure '\0'-termination for ::fromRawData strings
- const_cast<QString*>(this)->reallocData(uint(d->size) + 1u);
+ const_cast<QString*>(this)->reallocData(uint(d.size) + 1u);
}
- return d->data();
+ return d.data();
}
/*!
@@ -6576,8 +6418,8 @@ QString QString::leftJustified(int width, QChar fill, bool truncate) const
if (padlen > 0) {
result.resize(len+padlen);
if (len)
- memcpy(result.d->data(), d->data(), sizeof(QChar)*len);
- QChar *uc = (QChar*)result.d->data() + len;
+ memcpy(result.d.data(), d.data(), sizeof(QChar)*len);
+ QChar *uc = (QChar*)result.d.data() + len;
while (padlen--)
* uc++ = fill;
} else {
@@ -6614,11 +6456,11 @@ QString QString::rightJustified(int width, QChar fill, bool truncate) const
int padlen = width - len;
if (padlen > 0) {
result.resize(len+padlen);
- QChar *uc = (QChar*)result.d->data();
+ QChar *uc = (QChar*)result.d.data();
while (padlen--)
* uc++ = fill;
if (len)
- memcpy(static_cast<void *>(uc), static_cast<const void *>(d->data()), sizeof(QChar)*len);
+ memcpy(static_cast<void *>(uc), static_cast<const void *>(d.data()), sizeof(QChar)*len);
} else {
if (truncate)
result = left(width);
@@ -8167,7 +8009,7 @@ QVector<QStringRef> QString::splitRef(const QRegularExpression &re, SplitBehavio
*/
QString QString::repeated(int times) const
{
- if (d->size == 0)
+ if (d.size == 0)
return *this;
if (times <= 1) {
@@ -8176,27 +8018,27 @@ QString QString::repeated(int times) const
return QString();
}
- const int resultSize = times * d->size;
+ const int resultSize = times * d.size;
QString result;
result.reserve(resultSize);
- if (result.d->alloc != uint(resultSize) + 1u)
+ if (result.capacity() != resultSize)
return QString(); // not enough memory
- memcpy(result.d->data(), d->data(), d->size * sizeof(ushort));
+ memcpy(result.d.data(), d.data(), d.size * sizeof(ushort));
- int sizeSoFar = d->size;
- ushort *end = result.d->data() + sizeSoFar;
+ int sizeSoFar = d.size;
+ ushort *end = result.d.data() + sizeSoFar;
const int halfResultSize = resultSize >> 1;
while (sizeSoFar <= halfResultSize) {
- memcpy(end, result.d->data(), sizeSoFar * sizeof(ushort));
+ memcpy(end, result.d.data(), sizeSoFar * sizeof(ushort));
end += sizeSoFar;
sizeSoFar <<= 1;
}
- memcpy(end, result.d->data(), (resultSize - sizeSoFar) * sizeof(ushort));
- result.d->data()[resultSize] = '\0';
- result.d->size = resultSize;
+ memcpy(end, result.d.data(), (resultSize - sizeSoFar) * sizeof(ushort));
+ result.d.data()[resultSize] = '\0';
+ result.d.size = resultSize;
return result;
}
@@ -9196,8 +9038,8 @@ QString QtPrivate::argToQString(QLatin1String pattern, size_t n, const ArgBase *
*/
bool QString::isSimpleText() const
{
- const ushort *p = d->data();
- const ushort * const end = p + d->size;
+ const ushort *p = d.data();
+ const ushort * const end = p + d.size;
while (p < end) {
ushort uc = *p;
// sort out regions of complex text formatting
@@ -9361,17 +9203,14 @@ bool QString::isRightToLeft() const
*/
QString QString::fromRawData(const QChar *unicode, int size)
{
- Data *x;
+ QString::DataPointer x;
if (!unicode) {
- x = Data::sharedNull();
} else if (!size) {
- x = Data::allocate(0);
+ x = DataPointer(Data::allocate(0), 0);
} else {
x = Data::fromRawData(reinterpret_cast<const ushort *>(unicode), size);
- Q_CHECK_PTR(x);
}
- QStringDataPtr dataPtr = { x };
- return QString(dataPtr);
+ return QString(x);
}
/*!
@@ -9390,17 +9229,10 @@ QString QString::fromRawData(const QChar *unicode, int size)
*/
QString &QString::setRawData(const QChar *unicode, int size)
{
- if (d->ref.isShared() || d->alloc) {
- *this = fromRawData(unicode, size);
- } else {
- if (unicode) {
- d->size = size;
- d->offset = reinterpret_cast<const char *>(unicode) - reinterpret_cast<char *>(d);
- } else {
- d->offset = sizeof(QStringData);
- d->size = 0;
- }
+ if (!unicode || !size) {
+ clear();
}
+ *this = fromRawData(unicode, size);
return *this;
}
@@ -10335,11 +10167,11 @@ QDataStream &operator<<(QDataStream &out, const QString &str)
} else {
if (!str.isNull() || out.version() < 3) {
if ((out.byteOrder() == QDataStream::BigEndian) == (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {
- out.writeBytes(reinterpret_cast<const char *>(str.unicode()), sizeof(QChar) * str.length());
+ out.writeBytes(reinterpret_cast<const char *>(str.unicode()), uint(sizeof(QChar) * str.length()));
} else {
QVarLengthArray<ushort> buffer(str.length());
qbswap<sizeof(ushort)>(str.constData(), str.length(), buffer.data());
- out.writeBytes(reinterpret_cast<const char *>(buffer.data()), sizeof(ushort) * buffer.size());
+ out.writeBytes(reinterpret_cast<const char *>(buffer.data()), uint(sizeof(ushort) * buffer.size()));
}
} else {
// write null marker
@@ -10716,7 +10548,7 @@ ownership of it, no memory is freed when instances are destroyed.
*/
QString QStringRef::toString() const {
- if (!m_string)
+ if (isNull())
return QString();
if (m_size && m_position == 0 && m_size == m_string->size())
return *m_string;
@@ -12372,21 +12204,6 @@ QByteArray QStringRef::toLatin1() const
}
/*!
- \fn QByteArray QStringRef::toAscii() const
- \since 4.8
- \deprecated
-
- Returns an 8-bit representation of the string as a QByteArray.
-
- This function does the same as toLatin1().
-
- Note that, despite the name, this function does not necessarily return an US-ASCII
- (ANSI X3.4-1986) string and its result may not be US-ASCII compatible.
-
- \sa toLatin1(), toUtf8(), toLocal8Bit(), QTextCodec
-*/
-
-/*!
\since 4.8
Returns the local 8-bit representation of the string as a
diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h
index 99b41c8ebf..a841a0c123 100644
--- a/src/corelib/text/qstring.h
+++ b/src/corelib/text/qstring.h
@@ -1,7 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
+** Copyright (C) 2019 Intel Corporation.
** Copyright (C) 2019 Mail.ru Group.
** Contact: https://www.qt.io/licensing/
**
@@ -48,7 +48,7 @@
#include <QtCore/qchar.h>
#include <QtCore/qbytearray.h>
-#include <QtCore/qrefcount.h>
+#include <QtCore/qarraydata.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qstringliteral.h>
#include <QtCore/qstringalgorithms.h>
@@ -70,7 +70,6 @@ Q_FORWARD_DECLARE_OBJC_CLASS(NSString);
QT_BEGIN_NAMESPACE
-class QCharRef;
class QRegExp;
class QRegularExpression;
class QRegularExpressionMatch;
@@ -257,8 +256,9 @@ qsizetype QStringView::lastIndexOf(QLatin1String s, qsizetype from, Qt::CaseSens
class Q_CORE_EXPORT QString
{
+ typedef QTypedArrayData<ushort> Data;
public:
- typedef QStringData Data;
+ typedef QStringPrivate DataPointer;
inline QString() noexcept;
explicit QString(const QChar *unicode, int size = -1);
@@ -270,12 +270,13 @@ public:
QString &operator=(QChar c);
QString &operator=(const QString &) noexcept;
QString &operator=(QLatin1String latin1);
- inline QString(QString && other) noexcept : d(other.d) { other.d = Data::sharedNull(); }
+ inline QString(QString &&other) noexcept
+ { qSwap(d, other.d); }
inline QString &operator=(QString &&other) noexcept
{ qSwap(d, other.d); return *this; }
inline void swap(QString &other) noexcept { qSwap(d, other.d); }
- inline int size() const { return d->size; }
- inline int count() const { return d->size; }
+ inline int size() const { return int(d.size); }
+ inline int count() const { return int(d.size); }
inline int length() const;
inline bool isEmpty() const;
void resize(int size);
@@ -285,7 +286,7 @@ public:
void truncate(int pos);
void chop(int n);
- int capacity() const;
+ inline int capacity() const;
inline void reserve(int size);
inline void squeeze();
@@ -296,19 +297,17 @@ public:
inline void detach();
inline bool isDetached() const;
- inline bool isSharedWith(const QString &other) const { return d == other.d; }
+ inline bool isSharedWith(const QString &other) const { return d.isSharedWith(other.d); }
void clear();
inline const QChar at(int i) const;
const QChar operator[](int i) const;
- Q_REQUIRED_RESULT QCharRef operator[](int i);
- const QChar operator[](uint i) const;
- Q_REQUIRED_RESULT QCharRef operator[](uint i);
+ Q_REQUIRED_RESULT QChar &operator[](int i);
Q_REQUIRED_RESULT inline QChar front() const { return at(0); }
- Q_REQUIRED_RESULT inline QCharRef front();
+ Q_REQUIRED_RESULT inline QChar &front();
Q_REQUIRED_RESULT inline QChar back() const { return at(size() - 1); }
- Q_REQUIRED_RESULT inline QCharRef back();
+ Q_REQUIRED_RESULT inline QChar &back();
Q_REQUIRED_RESULT QString arg(qlonglong a, int fieldwidth=0, int base=10,
QChar fillChar = QLatin1Char(' ')) const;
@@ -436,12 +435,11 @@ public:
#endif
#if QT_CONFIG(regularexpression)
- int indexOf(const QRegularExpression &re, int from = 0) const;
- int indexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const; // ### Qt 6: merge overloads
- int lastIndexOf(const QRegularExpression &re, int from = -1) const;
- int lastIndexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const; // ### Qt 6: merge overloads
- bool contains(const QRegularExpression &re) const;
- bool contains(const QRegularExpression &re, QRegularExpressionMatch *rmatch) const; // ### Qt 6: merge overloads
+ int indexOf(const QRegularExpression &re, int from = 0,
+ QRegularExpressionMatch *rmatch = nullptr) const;
+ int lastIndexOf(const QRegularExpression &re, int from = -1,
+ QRegularExpressionMatch *rmatch = nullptr) const;
+ bool contains(const QRegularExpression &re, QRegularExpressionMatch *rmatch = nullptr) const;
int count(const QRegularExpression &re) const;
#endif
@@ -554,10 +552,10 @@ public:
inline QString &prepend(QLatin1String s) { return insert(0, s); }
inline QString &operator+=(QChar c) {
- if (d->ref.isShared() || uint(d->size) + 2u > d->alloc)
- reallocData(uint(d->size) + 2u, true);
- d->data()[d->size++] = c.unicode();
- d->data()[d->size] = '\0';
+ if (d->needsDetach() || int(d.size + 1) > capacity())
+ reallocData(uint(d.size) + 2u, true);
+ d->data()[d.size++] = c.unicode();
+ d->data()[d.size] = '\0';
return *this;
}
@@ -693,8 +691,7 @@ public:
// note - this are all inline so we can benefit from strlen() compile time optimizations
static inline QString fromLatin1(const char *str, int size = -1)
{
- QStringDataPtr dataPtr = { fromLatin1_helper(str, (str && size == -1) ? int(strlen(str)) : size) };
- return QString(dataPtr);
+ return QString(fromLatin1_helper(str, (str && size == -1) ? int(strlen(str)) : size));
}
static inline QString fromUtf8(const char *str, int size = -1)
{
@@ -721,15 +718,6 @@ public:
{ return fromUcs4(reinterpret_cast<const uint *>(str), size); }
#endif
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED static inline QString fromAscii(const char *str, int size = -1)
- { return fromLatin1(str, size); }
- QT_DEPRECATED static inline QString fromAscii(const QByteArray &str)
- { return fromLatin1(str); }
- Q_REQUIRED_RESULT QByteArray toAscii() const
- { return toLatin1(); }
-#endif
-
inline int toWCharArray(wchar_t *array) const;
Q_REQUIRED_RESULT static inline QString fromWCharArray(const wchar_t *string, int size = -1);
@@ -816,7 +804,7 @@ public:
#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
template <int N>
inline QString(const char (&ch)[N])
- : d(fromAscii_helper(ch, N - 1))
+ : QString(fromUtf8(ch))
{}
template <int N>
QString(char (&)[N]) = delete;
@@ -828,10 +816,10 @@ public:
#endif
#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
inline QT_ASCII_CAST_WARN QString(const char *ch)
- : d(fromAscii_helper(ch, ch ? int(strlen(ch)) : -1))
+ : QString(fromUtf8(ch))
{}
inline QT_ASCII_CAST_WARN QString(const QByteArray &a)
- : d(fromAscii_helper(a.constData(), qstrnlen(a.constData(), a.size())))
+ : QString(fromUtf8(a))
{}
inline QT_ASCII_CAST_WARN QString &operator=(const char *ch)
{ return (*this = fromUtf8(ch)); }
@@ -947,10 +935,10 @@ public:
struct Null { };
QT_DEPRECATED_X("use QString()")
static const Null null;
- inline QString(const Null &): d(Data::sharedNull()) {}
+ inline QString(const Null &) {}
inline QString &operator=(const Null &) { *this = QString(); return *this; }
#endif
- inline bool isNull() const { return d == Data::sharedNull(); }
+ inline bool isNull() const { return d->isNull(); }
bool isSimpleText() const;
@@ -959,7 +947,7 @@ public:
{ return QStringView(*this).isValidUtf16(); }
QString(int size, Qt::Initialization);
- Q_DECL_CONSTEXPR inline QString(QStringDataPtr dd) : d(dd.ptr) {}
+ explicit QString(DataPointer dd) : d(dd) {}
private:
#if defined(QT_NO_CAST_FROM_ASCII)
@@ -971,7 +959,7 @@ private:
QString &operator=(const QByteArray &a);
#endif
- Data *d;
+ DataPointer d;
friend inline bool operator==(QChar, const QString &) noexcept;
friend inline bool operator< (QChar, const QString &) noexcept;
@@ -1009,8 +997,7 @@ private:
static QString trimmed_helper(QString &str);
static QString simplified_helper(const QString &str);
static QString simplified_helper(QString &str);
- static Data *fromLatin1_helper(const char *str, int size = -1);
- static Data *fromAscii_helper(const char *str, int size = -1);
+ static DataPointer fromLatin1_helper(const char *str, int size = -1);
static QString fromUtf8_helper(const char *str, int size);
static QString fromLocal8Bit_helper(const char *, int size);
static QByteArray toLatin1_helper(const QString &);
@@ -1021,7 +1008,6 @@ private:
static qlonglong toIntegral_helper(const QChar *data, int len, bool *ok, int base);
static qulonglong toIntegral_helper(const QChar *data, uint len, bool *ok, int base);
void replace_helper(uint *indices, int nIndices, int blen, const QChar *after, int alen);
- friend class QCharRef;
friend class QTextCodec;
friend class QStringRef;
friend class QStringView;
@@ -1046,8 +1032,7 @@ private:
}
public:
- typedef Data * DataPtr;
- inline DataPtr &data_ptr() { return d; }
+ inline DataPointer &data_ptr() { return d; }
};
//
@@ -1062,33 +1047,31 @@ QString QStringView::toString() const
inline QString::QString(QLatin1String aLatin1) : d(fromLatin1_helper(aLatin1.latin1(), aLatin1.size()))
{ }
inline int QString::length() const
-{ return d->size; }
+{ return int(d.size); }
inline const QChar QString::at(int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return QChar(d->data()[i]); }
+{ Q_ASSERT(uint(i) < uint(size())); return QChar(d.data()[i]); }
inline const QChar QString::operator[](int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return QChar(d->data()[i]); }
-inline const QChar QString::operator[](uint i) const
-{ Q_ASSERT(i < uint(size())); return QChar(d->data()[i]); }
+{ Q_ASSERT(uint(i) < uint(size())); return QChar(d.data()[i]); }
inline bool QString::isEmpty() const
-{ return d->size == 0; }
+{ return d.size == 0; }
inline const QChar *QString::unicode() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
+{ return reinterpret_cast<const QChar*>(d.data()); }
inline const QChar *QString::data() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
+{ return reinterpret_cast<const QChar*>(d.data()); }
inline QChar *QString::data()
-{ detach(); return reinterpret_cast<QChar*>(d->data()); }
+{ detach(); return reinterpret_cast<QChar*>(d.data()); }
inline const QChar *QString::constData() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
+{ return reinterpret_cast<const QChar*>(d.data()); }
inline void QString::detach()
-{ if (d->ref.isShared() || (d->offset != sizeof(QStringData))) reallocData(uint(d->size) + 1u); }
+{ if (d->needsDetach()) reallocData(d.size + 1u); }
inline bool QString::isDetached() const
-{ return !d->ref.isShared(); }
+{ return !d->isShared(); }
inline void QString::clear()
{ if (!isNull()) *this = QString(); }
inline QString::QString(const QString &other) noexcept : d(other.d)
-{ Q_ASSERT(&other != this); d->ref.ref(); }
+{ }
inline int QString::capacity() const
-{ return d->alloc ? d->alloc - 1 : 0; }
+{ const auto realCapacity = d->constAllocatedCapacity(); return realCapacity ? int(realCapacity) - 1 : 0; }
inline QString &QString::setNum(short n, int base)
{ return setNum(qlonglong(n), base); }
inline QString &QString::setNum(ushort n, int base)
@@ -1175,178 +1158,51 @@ inline QString QString::fromWCharArray(const wchar_t *string, int size)
: fromUcs4(reinterpret_cast<const uint *>(string), size);
}
-class
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-Q_CORE_EXPORT
-#endif
-QCharRef { // ### Qt 7: remove
- QString &s;
- int i;
- inline QCharRef(QString &str, int idx)
- : s(str),i(idx) {}
- friend class QString;
-public:
-
- // most QChar operations repeated here
-
- // all this is not documented: We just say "like QChar" and let it be.
- inline operator QChar() const
- {
- using namespace QtPrivate::DeprecatedRefClassBehavior;
- if (Q_LIKELY(i < s.d->size))
- return QChar(s.d->data()[i]);
-#ifdef QT_DEBUG
- warn(WarningType::OutOfRange, EmittingClass::QCharRef);
-#endif
- return QChar();
- }
- inline QCharRef &operator=(QChar c)
- {
- using namespace QtPrivate::DeprecatedRefClassBehavior;
- if (Q_UNLIKELY(i >= s.d->size)) {
-#ifdef QT_DEBUG
- warn(WarningType::OutOfRange, EmittingClass::QCharRef);
-#endif
- s.resize(i + 1, QLatin1Char(' '));
- } else {
-#ifdef QT_DEBUG
- if (Q_UNLIKELY(!s.isDetached()))
- warn(WarningType::DelayedDetach, EmittingClass::QCharRef);
-#endif
- s.detach();
- }
- s.d->data()[i] = c.unicode();
- return *this;
- }
-
- // An operator= for each QChar cast constructors
-#ifndef QT_NO_CAST_FROM_ASCII
- inline QT_ASCII_CAST_WARN QCharRef &operator=(char c)
- { return operator=(QChar::fromLatin1(c)); }
- inline QT_ASCII_CAST_WARN QCharRef &operator=(uchar c)
- { return operator=(QChar::fromLatin1(c)); }
-#endif
- inline QCharRef &operator=(const QCharRef &c) { return operator=(QChar(c)); }
- inline QCharRef &operator=(ushort rc) { return operator=(QChar(rc)); }
- inline QCharRef &operator=(short rc) { return operator=(QChar(rc)); }
- inline QCharRef &operator=(uint rc) { return operator=(QChar(rc)); }
- inline QCharRef &operator=(int rc) { return operator=(QChar(rc)); }
-
- // each function...
- inline bool isNull() const { return QChar(*this).isNull(); }
- inline bool isPrint() const { return QChar(*this).isPrint(); }
- inline bool isPunct() const { return QChar(*this).isPunct(); }
- inline bool isSpace() const { return QChar(*this).isSpace(); }
- inline bool isMark() const { return QChar(*this).isMark(); }
- inline bool isLetter() const { return QChar(*this).isLetter(); }
- inline bool isNumber() const { return QChar(*this).isNumber(); }
- inline bool isLetterOrNumber() { return QChar(*this).isLetterOrNumber(); }
- inline bool isDigit() const { return QChar(*this).isDigit(); }
- inline bool isLower() const { return QChar(*this).isLower(); }
- inline bool isUpper() const { return QChar(*this).isUpper(); }
- inline bool isTitleCase() const { return QChar(*this).isTitleCase(); }
-
- inline int digitValue() const { return QChar(*this).digitValue(); }
- QChar toLower() const { return QChar(*this).toLower(); }
- QChar toUpper() const { return QChar(*this).toUpper(); }
- QChar toTitleCase () const { return QChar(*this).toTitleCase(); }
-
- QChar::Category category() const { return QChar(*this).category(); }
- QChar::Direction direction() const { return QChar(*this).direction(); }
- QChar::JoiningType joiningType() const { return QChar(*this).joiningType(); }
-#if QT_DEPRECATED_SINCE(5, 3)
- QT_DEPRECATED QChar::Joining joining() const
- {
- switch (QChar(*this).joiningType()) {
- case QChar::Joining_Causing: return QChar::Center;
- case QChar::Joining_Dual: return QChar::Dual;
- case QChar::Joining_Right: return QChar::Right;
- case QChar::Joining_None:
- case QChar::Joining_Left:
- case QChar::Joining_Transparent:
- default: return QChar::OtherJoining;
- }
- }
-#endif
- bool hasMirrored() const { return QChar(*this).hasMirrored(); }
- QChar mirroredChar() const { return QChar(*this).mirroredChar(); }
- QString decomposition() const { return QChar(*this).decomposition(); }
- QChar::Decomposition decompositionTag() const { return QChar(*this).decompositionTag(); }
- uchar combiningClass() const { return QChar(*this).combiningClass(); }
-
- inline QChar::Script script() const { return QChar(*this).script(); }
-
- QChar::UnicodeVersion unicodeVersion() const { return QChar(*this).unicodeVersion(); }
-
- inline uchar cell() const { return QChar(*this).cell(); }
- inline uchar row() const { return QChar(*this).row(); }
- inline void setCell(uchar cell);
- inline void setRow(uchar row);
-
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED char toAscii() const { return QChar(*this).toLatin1(); }
-#endif
- char toLatin1() const { return QChar(*this).toLatin1(); }
- ushort unicode() const { return QChar(*this).unicode(); }
- ushort& unicode() { return s.data()[i].unicode(); }
-
-};
-Q_DECLARE_TYPEINFO(QCharRef, Q_MOVABLE_TYPE);
-
-inline void QCharRef::setRow(uchar arow) { QChar(*this).setRow(arow); }
-inline void QCharRef::setCell(uchar acell) { QChar(*this).setCell(acell); }
-
-
-inline QString::QString() noexcept : d(Data::sharedNull()) {}
-inline QString::~QString() { if (!d->ref.deref()) Data::deallocate(d); }
+inline QString::QString() noexcept {}
+inline QString::~QString() {}
inline void QString::reserve(int asize)
{
- if (d->ref.isShared() || uint(asize) >= d->alloc)
- reallocData(qMax(asize, d->size) + 1u);
+ if (d->needsDetach() || asize >= capacity())
+ reallocData(uint(qMax(asize, size())) + 1u);
- if (!d->capacityReserved) {
- // cannot set unconditionally, since d could be the shared_null/shared_empty (which is const)
- d->capacityReserved = true;
- }
+ // we're not shared anymore, for sure
+ d->flags() |= Data::CapacityReserved;
}
inline void QString::squeeze()
{
- if (d->ref.isShared() || uint(d->size) + 1u < d->alloc)
- reallocData(uint(d->size) + 1u);
+ if ((d->flags() & Data::CapacityReserved) == 0)
+ return;
+ if (d->needsDetach() || int(d.size) < capacity())
+ reallocData(uint(d.size) + 1u);
- if (d->capacityReserved) {
- // cannot set unconditionally, since d could be shared_null or
- // otherwise static.
- d->capacityReserved = false;
- }
+ // we're not shared anymore, for sure
+ d->flags() &= uint(~Data::CapacityReserved);
}
inline QString &QString::setUtf16(const ushort *autf16, int asize)
{ return setUnicode(reinterpret_cast<const QChar *>(autf16), asize); }
-inline QCharRef QString::operator[](int i)
-{ Q_ASSERT(i >= 0); detach(); return QCharRef(*this, i); }
-inline QCharRef QString::operator[](uint i)
-{ detach(); return QCharRef(*this, i); }
-inline QCharRef QString::front() { return operator[](0); }
-inline QCharRef QString::back() { return operator[](size() - 1); }
+inline QChar &QString::operator[](int i)
+{ Q_ASSERT(i >= 0 && i < size()); return data()[i]; }
+inline QChar &QString::front() { return operator[](0); }
+inline QChar &QString::back() { return operator[](size() - 1); }
inline QString::iterator QString::begin()
-{ detach(); return reinterpret_cast<QChar*>(d->data()); }
+{ detach(); return reinterpret_cast<QChar*>(d.data()); }
inline QString::const_iterator QString::begin() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
+{ return reinterpret_cast<const QChar*>(d.data()); }
inline QString::const_iterator QString::cbegin() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
+{ return reinterpret_cast<const QChar*>(d.data()); }
inline QString::const_iterator QString::constBegin() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
+{ return reinterpret_cast<const QChar*>(d.data()); }
inline QString::iterator QString::end()
-{ detach(); return reinterpret_cast<QChar*>(d->data() + d->size); }
+{ detach(); return reinterpret_cast<QChar*>(d.data() + d.size); }
inline QString::const_iterator QString::end() const
-{ return reinterpret_cast<const QChar*>(d->data() + d->size); }
+{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
inline QString::const_iterator QString::cend() const
-{ return reinterpret_cast<const QChar*>(d->data() + d->size); }
+{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
inline QString::const_iterator QString::constEnd() const
-{ return reinterpret_cast<const QChar*>(d->data() + d->size); }
+{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
#if QT_STRINGVIEW_LEVEL < 2
inline bool QString::contains(const QString &s, Qt::CaseSensitivity cs) const
{ return indexOf(s, 0, cs) != -1; }
@@ -1573,7 +1429,8 @@ inline QString QString::fromStdU32String(const std::u32string &s)
inline std::u32string QString::toStdU32String() const
{
std::u32string u32str(length(), char32_t(0));
- int len = toUcs4_helper(d->data(), length(), reinterpret_cast<uint*>(&u32str[0]));
+ int len = toUcs4_helper(reinterpret_cast<const ushort *>(constData()), length(),
+ reinterpret_cast<uint*>(&u32str[0]));
u32str.resize(len);
return u32str;
}
@@ -1711,7 +1568,7 @@ public:
inline const QChar *unicode() const
{
if (!m_string)
- return reinterpret_cast<const QChar *>(QString::Data::sharedNull()->data());
+ return reinterpret_cast<const QChar *>(QString::Data::sharedNullData());
return m_string->unicode() + m_position;
}
inline const QChar *data() const { return unicode(); }
@@ -1728,10 +1585,6 @@ public:
inline const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
inline const_reverse_iterator crend() const { return rend(); }
-#if QT_DEPRECATED_SINCE(5, 0)
- Q_REQUIRED_RESULT QT_DEPRECATED QByteArray toAscii() const
- { return toLatin1(); }
-#endif
Q_REQUIRED_RESULT QByteArray toLatin1() const;
Q_REQUIRED_RESULT QByteArray toUtf8() const;
Q_REQUIRED_RESULT QByteArray toLocal8Bit() const;
diff --git a/src/corelib/text/qstringbuilder.cpp b/src/corelib/text/qstringbuilder.cpp
index cf443ec369..29bd216e80 100644
--- a/src/corelib/text/qstringbuilder.cpp
+++ b/src/corelib/text/qstringbuilder.cpp
@@ -73,7 +73,7 @@ QT_BEGIN_NAMESPACE
\list
\li QString, QStringRef, (since 5.10:) QStringView
- \li QChar, QCharRef, QLatin1Char, (since 5.10:) \c char16_t,
+ \li QChar, QLatin1Char, (since 5.10:) \c char16_t,
\li QLatin1String,
\li (since 5.10:) \c{const char16_t[]} (\c{u"foo"}),
\li QByteArray, \c char, \c{const char[]}.
@@ -108,7 +108,7 @@ QT_BEGIN_NAMESPACE
This function is usable with arguments of type \c QString,
\c QLatin1String, \c QStringRef,
- \c QChar, \c QCharRef, \c QLatin1Char, and \c char.
+ \c QChar, \c QLatin1Char, and \c char.
*/
/* \fn template <typename A, typename B> QByteArray QStringBuilder<A, B>::toLatin1() const
diff --git a/src/corelib/text/qstringbuilder.h b/src/corelib/text/qstringbuilder.h
index 49f316a1f9..6ba01c0e30 100644
--- a/src/corelib/text/qstringbuilder.h
+++ b/src/corelib/text/qstringbuilder.h
@@ -120,7 +120,7 @@ private:
if (!QConcatenable< QStringBuilder<A, B> >::ExactSize && int(len) != d - start) {
// this resize is necessary since we allocate a bit too much
// when dealing with variable sized 8-bit encodings
- s.resize(d - start);
+ s.resize(int(d - start));
}
return s;
}
@@ -231,16 +231,6 @@ template <> struct QConcatenable<QChar::SpecialCharacter> : private QAbstractCon
{ *out++ = c; }
};
-template <> struct QConcatenable<QCharRef> : private QAbstractConcatenable
-{
- typedef QCharRef type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static int size(QCharRef) { return 1; }
- static inline void appendTo(QCharRef c, QChar *&out)
- { *out++ = QChar(c); }
-};
-
template <> struct QConcatenable<QLatin1String> : private QAbstractConcatenable
{
typedef QLatin1String type;
diff --git a/src/corelib/text/qstringlist.h b/src/corelib/text/qstringlist.h
index 9ea379bb92..c03e34b9ba 100644
--- a/src/corelib/text/qstringlist.h
+++ b/src/corelib/text/qstringlist.h
@@ -38,7 +38,7 @@
**
****************************************************************************/
-#include <QtCore/qlist.h>
+#include <QtCore/qvector.h>
#ifndef QSTRINGLIST_H
#define QSTRINGLIST_H
@@ -55,21 +55,21 @@ class QRegExp;
class QRegularExpression;
#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
-typedef QListIterator<QString> QStringListIterator;
-typedef QMutableListIterator<QString> QMutableStringListIterator;
+typedef QVectorIterator<QString> QStringListIterator;
+typedef QMutableVectorIterator<QString> QMutableStringListIterator;
#endif
class QStringList;
#ifdef Q_QDOC
-class QStringList : public QList<QString>
+class QStringList : public QVector<QString>
#else
-template <> struct QListSpecialMethods<QString>
+template <> struct QVectorSpecialMethods<QString>
#endif
{
#ifndef Q_QDOC
protected:
- ~QListSpecialMethods() = default;
+ ~QVectorSpecialMethods() = default;
#endif
public:
inline void sort(Qt::CaseSensitivity cs = Qt::CaseSensitive);
@@ -108,23 +108,23 @@ private:
};
// ### Qt6: check if there's a better way
-class QStringList : public QList<QString>
+class QStringList : public QVector<QString>
{
#endif
public:
inline QStringList() noexcept { }
inline explicit QStringList(const QString &i) { append(i); }
- inline QStringList(const QList<QString> &l) : QList<QString>(l) { }
- inline QStringList(QList<QString> &&l) noexcept : QList<QString>(std::move(l)) { }
- inline QStringList(std::initializer_list<QString> args) : QList<QString>(args) { }
+ inline QStringList(const QVector<QString> &l) : QVector<QString>(l) { }
+ inline QStringList(QVector<QString> &&l) noexcept : QVector<QString>(std::move(l)) { }
+ inline QStringList(std::initializer_list<QString> args) : QVector<QString>(args) { }
template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
inline QStringList(InputIterator first, InputIterator last)
- : QList<QString>(first, last) { }
+ : QVector<QString>(first, last) { }
- QStringList &operator=(const QList<QString> &other)
- { QList<QString>::operator=(other); return *this; }
- QStringList &operator=(QList<QString> &&other) noexcept
- { QList<QString>::operator=(std::move(other)); return *this; }
+ QStringList &operator=(const QVector<QString> &other)
+ { QVector<QString>::operator=(other); return *this; }
+ QStringList &operator=(QVector<QString> &&other) noexcept
+ { QVector<QString>::operator=(std::move(other)); return *this; }
#if QT_STRINGVIEW_LEVEL < 2
inline bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
@@ -138,7 +138,7 @@ public:
{ append(str); return *this; }
inline QStringList &operator<<(const QStringList &l)
{ *this += l; return *this; }
- inline QStringList &operator<<(const QList<QString> &l)
+ inline QStringList &operator<<(const QVector<QString> &l)
{ *this += l; return *this; }
inline int indexOf(QStringView str, int from = 0) const;
@@ -159,16 +159,16 @@ public:
inline int lastIndexOf(const QRegularExpression &re, int from = -1) const;
#endif // QT_CONFIG(regularexpression)
- using QList<QString>::indexOf;
- using QList<QString>::lastIndexOf;
+ using QVector<QString>::indexOf;
+ using QVector<QString>::lastIndexOf;
};
Q_DECLARE_TYPEINFO(QStringList, Q_MOVABLE_TYPE);
#ifndef Q_QDOC
-inline QStringList *QListSpecialMethods<QString>::self()
+inline QStringList *QVectorSpecialMethods<QString>::self()
{ return static_cast<QStringList *>(this); }
-inline const QStringList *QListSpecialMethods<QString>::self() const
+inline const QStringList *QVectorSpecialMethods<QString>::self() const
{ return static_cast<const QStringList *>(this); }
namespace QtPrivate {
@@ -213,45 +213,45 @@ namespace QtPrivate {
#endif // QT_CONFIG(regularexpression)
}
-inline void QListSpecialMethods<QString>::sort(Qt::CaseSensitivity cs)
+inline void QVectorSpecialMethods<QString>::sort(Qt::CaseSensitivity cs)
{
QtPrivate::QStringList_sort(self(), cs);
}
-inline int QListSpecialMethods<QString>::removeDuplicates()
+inline int QVectorSpecialMethods<QString>::removeDuplicates()
{
return QtPrivate::QStringList_removeDuplicates(self());
}
#if QT_STRINGVIEW_LEVEL < 2
-inline QString QListSpecialMethods<QString>::join(const QString &sep) const
+inline QString QVectorSpecialMethods<QString>::join(const QString &sep) const
{
return QtPrivate::QStringList_join(self(), sep.constData(), sep.length());
}
#endif
-inline QString QListSpecialMethods<QString>::join(QStringView sep) const
+inline QString QVectorSpecialMethods<QString>::join(QStringView sep) const
{
return QtPrivate::QStringList_join(self(), sep);
}
-QString QListSpecialMethods<QString>::join(QLatin1String sep) const
+QString QVectorSpecialMethods<QString>::join(QLatin1String sep) const
{
return QtPrivate::QStringList_join(*self(), sep);
}
-inline QString QListSpecialMethods<QString>::join(QChar sep) const
+inline QString QVectorSpecialMethods<QString>::join(QChar sep) const
{
return QtPrivate::QStringList_join(self(), &sep, 1);
}
-inline QStringList QListSpecialMethods<QString>::filter(QStringView str, Qt::CaseSensitivity cs) const
+inline QStringList QVectorSpecialMethods<QString>::filter(QStringView str, Qt::CaseSensitivity cs) const
{
return QtPrivate::QStringList_filter(self(), str, cs);
}
#if QT_STRINGVIEW_LEVEL < 2
-inline QStringList QListSpecialMethods<QString>::filter(const QString &str, Qt::CaseSensitivity cs) const
+inline QStringList QVectorSpecialMethods<QString>::filter(const QString &str, Qt::CaseSensitivity cs) const
{
return QtPrivate::QStringList_filter(self(), str, cs);
}
@@ -274,33 +274,33 @@ inline bool QStringList::contains(QStringView str, Qt::CaseSensitivity cs) const
return QtPrivate::QStringList_contains(this, str, cs);
}
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(QStringView before, QStringView after, Qt::CaseSensitivity cs)
+inline QStringList &QVectorSpecialMethods<QString>::replaceInStrings(QStringView before, QStringView after, Qt::CaseSensitivity cs)
{
QtPrivate::QStringList_replaceInStrings(self(), before, after, cs);
return *self();
}
#if QT_STRINGVIEW_LEVEL < 2
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs)
+inline QStringList &QVectorSpecialMethods<QString>::replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs)
{
QtPrivate::QStringList_replaceInStrings(self(), before, after, cs);
return *self();
}
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(QStringView before, const QString &after, Qt::CaseSensitivity cs)
+inline QStringList &QVectorSpecialMethods<QString>::replaceInStrings(QStringView before, const QString &after, Qt::CaseSensitivity cs)
{
QtPrivate::QStringList_replaceInStrings(self(), before, qToStringViewIgnoringNull(after), cs);
return *self();
}
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(const QString &before, QStringView after, Qt::CaseSensitivity cs)
+inline QStringList &QVectorSpecialMethods<QString>::replaceInStrings(const QString &before, QStringView after, Qt::CaseSensitivity cs)
{
QtPrivate::QStringList_replaceInStrings(self(), QStringView(before), after, cs);
return *self();
}
#endif
-inline QStringList operator+(const QList<QString> &one, const QStringList &other)
+inline QStringList operator+(const QVector<QString> &one, const QStringList &other)
{
QStringList n = one;
n += other;
@@ -328,13 +328,13 @@ inline int QStringList::lastIndexOf(QLatin1String string, int from) const
}
#ifndef QT_NO_REGEXP
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(const QRegExp &rx, const QString &after)
+inline QStringList &QVectorSpecialMethods<QString>::replaceInStrings(const QRegExp &rx, const QString &after)
{
QtPrivate::QStringList_replaceInStrings(self(), rx, after);
return *self();
}
-inline QStringList QListSpecialMethods<QString>::filter(const QRegExp &rx) const
+inline QStringList QVectorSpecialMethods<QString>::filter(const QRegExp &rx) const
{
return QtPrivate::QStringList_filter(self(), rx);
}
@@ -361,13 +361,13 @@ inline int QStringList::lastIndexOf(QRegExp &rx, int from) const
#endif
#if QT_CONFIG(regularexpression)
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(const QRegularExpression &rx, const QString &after)
+inline QStringList &QVectorSpecialMethods<QString>::replaceInStrings(const QRegularExpression &rx, const QString &after)
{
QtPrivate::QStringList_replaceInStrings(self(), rx, after);
return *self();
}
-inline QStringList QListSpecialMethods<QString>::filter(const QRegularExpression &rx) const
+inline QStringList QVectorSpecialMethods<QString>::filter(const QRegularExpression &rx) const
{
return QtPrivate::QStringList_filter(self(), rx);
}
diff --git a/src/corelib/text/qstringliteral.h b/src/corelib/text/qstringliteral.h
index 2a7e607c63..742d38de7d 100644
--- a/src/corelib/text/qstringliteral.h
+++ b/src/corelib/text/qstringliteral.h
@@ -42,6 +42,7 @@
#define QSTRINGLITERAL_H
#include <QtCore/qarraydata.h>
+#include <QtCore/qarraydatapointer.h>
#if 0
#pragma qt_class(QStringLiteral)
@@ -49,8 +50,6 @@
QT_BEGIN_NAMESPACE
-typedef QTypedArrayData<ushort> QStringData;
-
// all our supported compilers support Unicode string literals,
// even if their Q_COMPILER_UNICODE_STRING has been revoked due
// to lacking stdlib support. But QStringLiteral only needs the
@@ -65,44 +64,23 @@ Q_STATIC_ASSERT_X(sizeof(qunicodechar) == 2,
#define QStringLiteral(str) \
([]() noexcept -> QString { \
enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
- static const QStaticStringData<Size> qstring_literal = { \
- Q_STATIC_STRING_DATA_HEADER_INITIALIZER(Size), \
- QT_UNICODE_LITERAL(str) }; \
- QStringDataPtr holder = { qstring_literal.data_ptr() }; \
- const QString qstring_literal_temp(holder); \
- return qstring_literal_temp; \
+ static const QArrayData qstring_literal = { \
+ Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 \
+ }; \
+ QStringPrivate holder = { \
+ static_cast<QTypedArrayData<ushort> *>(const_cast<QArrayData *>(&qstring_literal)), \
+ reinterpret_cast<ushort *>(const_cast<qunicodechar *>(QT_UNICODE_LITERAL(str))), \
+ Size \
+ }; \
+ return QString(holder); \
}()) \
/**/
-#define Q_STATIC_STRING_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset) \
- { Q_REFCOUNT_INITIALIZE_STATIC, size, 0, 0, offset } \
- /**/
-
-#define Q_STATIC_STRING_DATA_HEADER_INITIALIZER(size) \
- Q_STATIC_STRING_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, sizeof(QStringData)) \
- /**/
-
#if QT_DEPRECATED_SINCE(5, 14)
# define QStringViewLiteral(str) QStringView(QT_UNICODE_LITERAL(str), QtPrivate::Deprecated)
#endif
-template <int N>
-struct QStaticStringData
-{
- QArrayData str;
- qunicodechar data[N + 1];
-
- QStringData *data_ptr() const
- {
- Q_ASSERT(str.ref.isStatic());
- return const_cast<QStringData *>(static_cast<const QStringData*>(&str));
- }
-};
-
-struct QStringDataPtr
-{
- QStringData *ptr;
-};
+using QStringPrivate = QArrayDataPointer<ushort>;
QT_END_NAMESPACE
diff --git a/src/corelib/text/qtextboundaryfinder.cpp b/src/corelib/text/qtextboundaryfinder.cpp
index ebdba6b2c5..fdbb7f0176 100644
--- a/src/corelib/text/qtextboundaryfinder.cpp
+++ b/src/corelib/text/qtextboundaryfinder.cpp
@@ -53,23 +53,8 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int
{
const ushort *string = reinterpret_cast<const ushort *>(chars);
- QVarLengthArray<QUnicodeTools::ScriptItem> scriptItems;
- {
- QVarLengthArray<uchar> scripts(length);
-
- QUnicodeTools::initScripts(string, length, scripts.data());
-
- int start = 0;
- for (int i = start + 1; i <= length; ++i) {
- if (i == length || scripts[i] != scripts[start]) {
- QUnicodeTools::ScriptItem item;
- item.position = start;
- item.script = scripts[start];
- scriptItems.append(item);
- start = i;
- }
- }
- }
+ QUnicodeTools::ScriptItemArray scriptItems;
+ QUnicodeTools::initScripts(string, length, &scriptItems);
QUnicodeTools::CharAttributeOptions options;
switch (type) {
diff --git a/src/corelib/text/qunicodetools.cpp b/src/corelib/text/qunicodetools.cpp
index 0db3dc74c6..819d8a9c3b 100644
--- a/src/corelib/text/qunicodetools.cpp
+++ b/src/corelib/text/qunicodetools.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -41,8 +41,7 @@
#include "qunicodetables_p.h"
#include "qvarlengtharray.h"
-
-#include "qharfbuzz_p.h"
+#include "qlibrary.h"
#define FLAG(x) (1 << (x))
@@ -724,6 +723,1493 @@ static void getWhiteSpaces(const ushort *string, quint32 len, QCharAttributes *a
}
}
+namespace Tailored {
+
+using CharAttributeFunction = void (*)(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes);
+
+
+enum Form {
+ Invalid = 0x0,
+ UnknownForm = Invalid,
+ Consonant,
+ Nukta,
+ Halant,
+ Matra,
+ VowelMark,
+ StressMark,
+ IndependentVowel,
+ LengthMark,
+ Control,
+ Other
+};
+
+static const unsigned char indicForms[0xe00-0x900] = {
+ // Devangari
+ Invalid, VowelMark, VowelMark, VowelMark,
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, UnknownForm, UnknownForm,
+ Nukta, Other, Matra, Matra,
+
+ Matra, Matra, Matra, Matra,
+ Matra, Matra, Matra, Matra,
+ Matra, Matra, Matra, Matra,
+ Matra, Halant, UnknownForm, UnknownForm,
+
+ Other, StressMark, StressMark, StressMark,
+ StressMark, UnknownForm, UnknownForm, UnknownForm,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ IndependentVowel, IndependentVowel, VowelMark, VowelMark,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Consonant,
+ Consonant, Consonant /* ??? */, Consonant, Consonant,
+
+ // Bengali
+ Invalid, VowelMark, VowelMark, VowelMark,
+ Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, Invalid, Invalid, IndependentVowel,
+
+ IndependentVowel, Invalid, Invalid, IndependentVowel,
+ IndependentVowel, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Invalid, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Invalid, Consonant, Invalid,
+ Invalid, Invalid, Consonant, Consonant,
+ Consonant, Consonant, UnknownForm, UnknownForm,
+ Nukta, Other, Matra, Matra,
+
+ Matra, Matra, Matra, Matra,
+ Matra, Invalid, Invalid, Matra,
+ Matra, Invalid, Invalid, Matra,
+ Matra, Halant, Consonant, UnknownForm,
+
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, Invalid, Invalid, VowelMark,
+ Invalid, Invalid, Invalid, Invalid,
+ Consonant, Consonant, Invalid, Consonant,
+
+ IndependentVowel, IndependentVowel, VowelMark, VowelMark,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ Consonant, Consonant, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ // Gurmukhi
+ Invalid, VowelMark, VowelMark, VowelMark,
+ Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, Invalid,
+ Invalid, Invalid, Invalid, IndependentVowel,
+
+ IndependentVowel, Invalid, Invalid, IndependentVowel,
+ IndependentVowel, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Invalid, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Invalid, Consonant, Consonant,
+ Invalid, Consonant, Consonant, Invalid,
+ Consonant, Consonant, UnknownForm, UnknownForm,
+ Nukta, Other, Matra, Matra,
+
+ Matra, Matra, Matra, Invalid,
+ Invalid, Invalid, Invalid, Matra,
+ Matra, Invalid, Invalid, Matra,
+ Matra, Halant, UnknownForm, UnknownForm,
+
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, UnknownForm, UnknownForm, UnknownForm,
+ Invalid, Consonant, Consonant, Consonant,
+ Consonant, Invalid, Consonant, Invalid,
+
+ Other, Other, Invalid, Invalid,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ StressMark, StressMark, Consonant, Consonant,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ // Gujarati
+ Invalid, VowelMark, VowelMark, VowelMark,
+ Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, Invalid, IndependentVowel,
+
+ IndependentVowel, IndependentVowel, Invalid, IndependentVowel,
+ IndependentVowel, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Invalid, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Invalid, Consonant, Consonant,
+ Invalid, Consonant, Consonant, Consonant,
+ Consonant, Consonant, UnknownForm, UnknownForm,
+ Nukta, Other, Matra, Matra,
+
+ Matra, Matra, Matra, Matra,
+ Matra, Matra, Invalid, Matra,
+ Matra, Matra, Invalid, Matra,
+ Matra, Halant, UnknownForm, UnknownForm,
+
+ Other, UnknownForm, UnknownForm, UnknownForm,
+ UnknownForm, UnknownForm, UnknownForm, UnknownForm,
+ UnknownForm, UnknownForm, UnknownForm, UnknownForm,
+ UnknownForm, UnknownForm, UnknownForm, UnknownForm,
+
+ IndependentVowel, IndependentVowel, VowelMark, VowelMark,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ // Oriya
+ Invalid, VowelMark, VowelMark, VowelMark,
+ Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, Invalid, Invalid, IndependentVowel,
+
+ IndependentVowel, Invalid, Invalid, IndependentVowel,
+ IndependentVowel, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Invalid, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Invalid, Consonant, Consonant,
+ Invalid, Consonant, Consonant, Consonant,
+ Consonant, Consonant, UnknownForm, UnknownForm,
+ Nukta, Other, Matra, Matra,
+
+ Matra, Matra, Matra, Matra,
+ Invalid, Invalid, Invalid, Matra,
+ Matra, Invalid, Invalid, Matra,
+ Matra, Halant, UnknownForm, UnknownForm,
+
+ Other, Invalid, Invalid, Invalid,
+ Invalid, UnknownForm, LengthMark, LengthMark,
+ Invalid, Invalid, Invalid, Invalid,
+ Consonant, Consonant, Invalid, Consonant,
+
+ IndependentVowel, IndependentVowel, Invalid, Invalid,
+ Invalid, Invalid, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ Other, Consonant, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ //Tamil
+ Invalid, Invalid, VowelMark, Other,
+ Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, Invalid,
+ Invalid, Invalid, IndependentVowel, IndependentVowel,
+
+ IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
+ IndependentVowel, Consonant, Invalid, Invalid,
+ Invalid, Consonant, Consonant, Invalid,
+ Consonant, Invalid, Consonant, Consonant,
+
+ Invalid, Invalid, Invalid, Consonant,
+ Consonant, Invalid, Invalid, Invalid,
+ Consonant, Consonant, Consonant, Invalid,
+ Invalid, Invalid, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, UnknownForm, UnknownForm,
+ Invalid, Invalid, Matra, Matra,
+
+ Matra, Matra, Matra, Invalid,
+ Invalid, Invalid, Matra, Matra,
+ Matra, Invalid, Matra, Matra,
+ Matra, Halant, Invalid, Invalid,
+
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, Invalid, Invalid, LengthMark,
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, Invalid, Invalid, Invalid,
+
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, Invalid, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ // Telugu
+ Invalid, VowelMark, VowelMark, VowelMark,
+ Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
+
+ IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
+ IndependentVowel, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Invalid, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Invalid, Consonant, Consonant, Consonant,
+ Consonant, Consonant, UnknownForm, UnknownForm,
+ Invalid, Invalid, Matra, Matra,
+
+ Matra, Matra, Matra, Matra,
+ Matra, Invalid, Matra, Matra,
+ Matra, Invalid, Matra, Matra,
+ Matra, Halant, Invalid, Invalid,
+
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, LengthMark, Matra, Invalid,
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, Invalid, Invalid, Invalid,
+
+ IndependentVowel, IndependentVowel, Invalid, Invalid,
+ Invalid, Invalid, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ // Kannada
+ Invalid, Invalid, VowelMark, VowelMark,
+ Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
+
+ IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
+ IndependentVowel, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Invalid, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Invalid, Consonant, Consonant, Consonant,
+ Consonant, Consonant, UnknownForm, UnknownForm,
+ Nukta, Other, Matra, Matra,
+
+ Matra, Matra, Matra, Matra,
+ Matra, Invalid, Matra, Matra,
+ Matra, Invalid, Matra, Matra,
+ Matra, Halant, Invalid, Invalid,
+
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, LengthMark, LengthMark, Invalid,
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, Invalid, Consonant, Invalid,
+
+ IndependentVowel, IndependentVowel, VowelMark, VowelMark,
+ Invalid, Invalid, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ // Malayalam
+ Invalid, Invalid, VowelMark, VowelMark,
+ Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
+
+ IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
+ IndependentVowel, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Invalid, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, UnknownForm, UnknownForm,
+ Invalid, Invalid, Matra, Matra,
+
+ Matra, Matra, Matra, Matra,
+ Invalid, Invalid, Matra, Matra,
+ Matra, Invalid, Matra, Matra,
+ Matra, Halant, Invalid, Invalid,
+
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, Invalid, Invalid, Matra,
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, Invalid, Invalid, Invalid,
+
+ IndependentVowel, IndependentVowel, Invalid, Invalid,
+ Invalid, Invalid, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+
+ // Sinhala
+ Invalid, Invalid, VowelMark, VowelMark,
+ Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+
+ IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
+ IndependentVowel, IndependentVowel, IndependentVowel, Invalid,
+ Invalid, Invalid, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+
+ Consonant, Consonant, Invalid, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Consonant,
+ Invalid, Consonant, Invalid, Invalid,
+
+ Consonant, Consonant, Consonant, Consonant,
+ Consonant, Consonant, Consonant, Invalid,
+ Invalid, Invalid, Halant, Invalid,
+ Invalid, Invalid, Invalid, Matra,
+
+ Matra, Matra, Matra, Matra,
+ Matra, Invalid, Matra, Invalid,
+ Matra, Matra, Matra, Matra,
+ Matra, Matra, Matra, Matra,
+
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, Invalid, Invalid, Invalid,
+ Invalid, Invalid, Invalid, Invalid,
+
+ Invalid, Invalid, Matra, Matra,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+ Other, Other, Other, Other,
+};
+
+static inline Form form(unsigned short uc) {
+ if (uc < 0x900 || uc > 0xdff) {
+ if (uc == 0x25cc)
+ return Consonant;
+ if (uc == 0x200c || uc == 0x200d)
+ return Control;
+ return Other;
+ }
+ return (Form)indicForms[uc-0x900];
+}
+
+// #define INDIC_DEBUG
+#ifdef INDIC_DEBUG
+#define IDEBUG qDebug
+#else
+#define IDEBUG if constexpr (1) ; else qDebug
+#endif
+
+/* syllables are of the form:
+
+ (Consonant Nukta? Halant)* Consonant Matra? VowelMark? StressMark?
+ (Consonant Nukta? Halant)* Consonant Halant
+ IndependentVowel VowelMark? StressMark?
+
+ We return syllable boundaries on invalid combinations aswell
+*/
+static int indic_nextSyllableBoundary(QChar::Script script, const ushort *s, int start, int end, bool *invalid)
+{
+ *invalid = false;
+ IDEBUG("indic_nextSyllableBoundary: start=%d, end=%d", start, end);
+ const ushort *uc = s+start;
+
+ int pos = 0;
+ Form state = form(uc[pos]);
+ IDEBUG("state[%d]=%d (uc=%4x)", pos, state, uc[pos]);
+ pos++;
+
+ if (state != Consonant && state != IndependentVowel) {
+ if (state != Other)
+ *invalid = true;
+ goto finish;
+ }
+
+ while (pos < end - start) {
+ Form newState = form(uc[pos]);
+ IDEBUG("state[%d]=%d (uc=%4x)", pos, newState, uc[pos]);
+ switch (newState) {
+ case Control:
+ newState = state;
+ if (state == Halant && uc[pos] == 0x200d /* ZWJ */)
+ break;
+ // the control character should be the last char in the item
+ if (state == Consonant && script == QChar::Script_Bengali && uc[pos-1] == 0x09B0 && uc[pos] == 0x200d /* ZWJ */)
+ break;
+ if (state == Consonant && script == QChar::Script_Kannada && uc[pos-1] == 0x0CB0 && uc[pos] == 0x200d /* ZWJ */)
+ break;
+ // Bengali and Kannada has a special exception for rendering yaphala with ra (to avoid reph) see http://www.unicode.org/faq/indic.html#15
+ ++pos;
+ goto finish;
+ case Consonant:
+ if (state == Halant && (script != QChar::Script_Sinhala || uc[pos-1] == 0x200d /* ZWJ */))
+ break;
+ goto finish;
+ case Halant:
+ if (state == Nukta || state == Consonant)
+ break;
+ // Bengali has a special exception allowing the combination Vowel_A/E + Halant + Ya
+ if (script == QChar::Script_Bengali && pos == 1 &&
+ (uc[0] == 0x0985 || uc[0] == 0x098f))
+ break;
+ // Sinhala uses the Halant as a component of certain matras. Allow these, but keep the state on Matra.
+ if (script == QChar::Script_Sinhala && state == Matra) {
+ ++pos;
+ continue;
+ }
+ if (script == QChar::Script_Malayalam && state == Matra && uc[pos-1] == 0x0d41) {
+ ++pos;
+ continue;
+ }
+ goto finish;
+ case Nukta:
+ if (state == Consonant)
+ break;
+ goto finish;
+ case StressMark:
+ if (state == VowelMark)
+ break;
+ // fall through
+ case VowelMark:
+ if (state == Matra || state == LengthMark || state == IndependentVowel)
+ break;
+ // fall through
+ case Matra:
+ if (state == Consonant || state == Nukta)
+ break;
+ if (state == Matra) {
+ // ### needs proper testing for correct two/three part matras
+ break;
+ }
+ // ### not sure if this is correct. If it is, does it apply only to Bengali or should
+ // it work for all Indic languages?
+ // the combination Independent_A + Vowel Sign AA is allowed.
+ if (script == QChar::Script_Bengali && uc[pos] == 0x9be && uc[pos-1] == 0x985)
+ break;
+ if (script == QChar::Script_Tamil && state == Matra) {
+ if (uc[pos-1] == 0x0bc6 &&
+ (uc[pos] == 0xbbe || uc[pos] == 0xbd7))
+ break;
+ if (uc[pos-1] == 0x0bc7 && uc[pos] == 0xbbe)
+ break;
+ }
+ goto finish;
+
+ case LengthMark:
+ if (state == Matra) {
+ // ### needs proper testing for correct two/three part matras
+ break;
+ }
+ case IndependentVowel:
+ case Invalid:
+ case Other:
+ goto finish;
+ }
+ state = newState;
+ pos++;
+ }
+ finish:
+ return pos+start;
+}
+
+static void indicAttributes(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes)
+{
+ int end = from + len;
+ const ushort *uc = text + from;
+ attributes += from;
+ uint i = 0;
+ while (i < len) {
+ bool invalid;
+ uint boundary = indic_nextSyllableBoundary(script, text, from+i, end, &invalid) - from;
+ attributes[i].graphemeBoundary = true;
+
+ if (boundary > len-1) boundary = len;
+ i++;
+ while (i < boundary) {
+ attributes[i].graphemeBoundary = false;
+ ++uc;
+ ++i;
+ }
+ assert(i == boundary);
+ }
+
+
+}
+
+#define LIBTHAI_MAJOR 0
+
+/*
+ * if libthai changed please update these codes too.
+ */
+struct thcell_t {
+ unsigned char base; /**< base character */
+ unsigned char hilo; /**< upper/lower vowel/diacritic */
+ unsigned char top; /**< top-level mark */
+};
+typedef int (*th_brk_def) (const unsigned char*, int*, size_t);
+typedef size_t (*th_next_cell_def) (const unsigned char *, size_t, struct thcell_t *, int);
+
+/* libthai related function handles */
+static th_brk_def th_brk = 0;
+static th_next_cell_def th_next_cell = 0;
+
+static int init_libthai() {
+ static bool initialized = false;
+ if (!initialized && (!th_brk || !th_next_cell)) {
+ th_brk = (th_brk_def) QLibrary::resolve(QLatin1String("thai"), (int)LIBTHAI_MAJOR, "th_brk");
+ th_next_cell = (th_next_cell_def)QLibrary::resolve(QLatin1String("thai"), LIBTHAI_MAJOR, "th_next_cell");
+ initialized = true;
+ }
+ if (th_brk && th_next_cell)
+ return 1;
+ else
+ return 0;
+}
+
+static void to_tis620(const ushort *string, uint len, char *cstr)
+{
+ uint i;
+ unsigned char *result = (unsigned char *)cstr;
+
+ for (i = 0; i < len; ++i) {
+ if (string[i] <= 0xa0)
+ result[i] = (unsigned char)string[i];
+ else if (string[i] >= 0xe01 && string[i] <= 0xe5b)
+ result[i] = (unsigned char)(string[i] - 0xe00 + 0xa0);
+ else
+ result[i] = (unsigned char)~0; // Same encoding as libthai uses for invalid chars
+ }
+
+ result[len] = 0;
+}
+
+/*
+ * Thai Attributes: computes Word Break, Word Boundary and Char stop for THAI.
+ */
+static void thaiAssignAttributes(const ushort *string, uint len, QCharAttributes *attributes)
+{
+ char s[128];
+ char *cstr = s;
+ int *break_positions = 0;
+ int brp[128];
+ int brp_size = 0;
+ uint numbreaks, i, j, cell_length;
+ struct thcell_t tis_cell;
+
+ if (!init_libthai())
+ return ;
+
+ if (len >= 128)
+ cstr = (char *)malloc(len*sizeof(char) + 1);
+
+ to_tis620(string, len, cstr);
+
+ for (i = 0; i < len; ++i) {
+ attributes[i].wordBreak = false;
+ attributes[i].wordStart = false;
+ attributes[i].wordEnd = false;
+ attributes[i].lineBreak = false;
+ }
+
+ if (len > 128) {
+ break_positions = (int*) malloc (sizeof(int) * len);
+ memset (break_positions, 0, sizeof(int) * len);
+ brp_size = len;
+ }
+ else {
+ break_positions = brp;
+ brp_size = 128;
+ }
+
+ if (break_positions) {
+ attributes[0].wordBreak = true;
+ attributes[0].wordStart = true;
+ attributes[0].wordEnd = false;
+ numbreaks = th_brk((const unsigned char *)cstr, break_positions, brp_size);
+ for (i = 0; i < numbreaks; ++i) {
+ attributes[break_positions[i]].wordBreak = true;
+ attributes[break_positions[i]].wordStart = true;
+ attributes[break_positions[i]].wordEnd = true;
+ attributes[break_positions[i]].lineBreak = true;
+ }
+ if (numbreaks > 0)
+ attributes[break_positions[numbreaks - 1]].wordStart = false;
+
+ if (break_positions != brp)
+ free(break_positions);
+ }
+
+ /* manage grapheme boundaries */
+ i = 0;
+ while (i < len) {
+ cell_length = (uint)(th_next_cell((const unsigned char *)cstr + i, len - i, &tis_cell, true));
+
+ attributes[i].graphemeBoundary = true;
+ for (j = 1; j < cell_length; j++)
+ attributes[i + j].graphemeBoundary = false;
+
+ /* Set graphemeBoundary for SARA AM */
+ if (cstr[i + cell_length - 1] == (char)0xd3)
+ attributes[i + cell_length - 1].graphemeBoundary = true;
+
+ i += cell_length;
+ }
+
+ if (len >= 128)
+ free(cstr);
+}
+
+static void thaiAttributes(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes)
+{
+ assert(script == QChar::Script_Thai);
+ const ushort *uc = text + from;
+ attributes += from;
+ Q_UNUSED(script);
+ thaiAssignAttributes(uc, len, attributes);
+}
+
+/*
+ tibetan syllables are of the form:
+ head position consonant
+ first sub-joined consonant
+ ....intermediate sub-joined consonants (if any)
+ last sub-joined consonant
+ sub-joined vowel (a-chung U+0F71)
+ standard or compound vowel sign (or 'virama' for devanagari transliteration)
+*/
+
+typedef enum {
+ TibetanOther,
+ TibetanHeadConsonant,
+ TibetanSubjoinedConsonant,
+ TibetanSubjoinedVowel,
+ TibetanVowel
+} TibetanForm;
+
+/* this table starts at U+0f40 */
+static const unsigned char tibetanForm[0x80] = {
+ TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
+ TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
+ TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
+ TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
+
+ TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
+ TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
+ TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
+ TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
+
+ TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
+ TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
+ TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
+ TibetanOther, TibetanOther, TibetanOther, TibetanOther,
+
+ TibetanOther, TibetanVowel, TibetanVowel, TibetanVowel,
+ TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
+ TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
+ TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
+
+ TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
+ TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
+ TibetanOther, TibetanOther, TibetanOther, TibetanOther,
+ TibetanOther, TibetanOther, TibetanOther, TibetanOther,
+
+ TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
+ TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
+ TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
+ TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
+
+ TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
+ TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
+ TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
+ TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
+
+ TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
+ TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
+ TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
+ TibetanSubjoinedConsonant, TibetanOther, TibetanOther, TibetanOther
+};
+
+#define tibetan_form(c) \
+ ((c) >= 0x0f40 && (c) < 0x0fc0 ? (TibetanForm)tibetanForm[(c) - 0x0f40] : TibetanOther)
+
+static int tibetan_nextSyllableBoundary(const ushort *s, int start, int end, bool *invalid)
+{
+ const ushort *uc = s + start;
+
+ int pos = 0;
+ TibetanForm state = tibetan_form(*uc);
+
+/* qDebug("state[%d]=%d (uc=%4x)", pos, state, uc[pos]);*/
+ pos++;
+
+ if (state != TibetanHeadConsonant) {
+ if (state != TibetanOther)
+ *invalid = true;
+ goto finish;
+ }
+
+ while (pos < end - start) {
+ TibetanForm newState = tibetan_form(uc[pos]);
+ switch (newState) {
+ case TibetanSubjoinedConsonant:
+ case TibetanSubjoinedVowel:
+ if (state != TibetanHeadConsonant &&
+ state != TibetanSubjoinedConsonant)
+ goto finish;
+ state = newState;
+ break;
+ case TibetanVowel:
+ if (state != TibetanHeadConsonant &&
+ state != TibetanSubjoinedConsonant &&
+ state != TibetanSubjoinedVowel)
+ goto finish;
+ break;
+ case TibetanOther:
+ case TibetanHeadConsonant:
+ goto finish;
+ }
+ pos++;
+ }
+
+finish:
+ *invalid = false;
+ return start+pos;
+}
+
+static void tibetanAttributes(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes)
+{
+ int end = from + len;
+ const ushort *uc = text + from;
+ uint i = 0;
+ Q_UNUSED(script);
+ attributes += from;
+ while (i < len) {
+ bool invalid;
+ uint boundary = tibetan_nextSyllableBoundary(text, from+i, end, &invalid) - from;
+
+ attributes[i].graphemeBoundary = true;
+
+ if (boundary > len-1) boundary = len;
+ i++;
+ while (i < boundary) {
+ attributes[i].graphemeBoundary = false;
+ ++uc;
+ ++i;
+ }
+ assert(i == boundary);
+ }
+}
+
+enum MymrCharClassValues {
+ Mymr_CC_RESERVED = 0,
+ Mymr_CC_CONSONANT = 1, /* Consonant of type 1, that has subscript form */
+ Mymr_CC_CONSONANT2 = 2, /* Consonant of type 2, that has no subscript form */
+ Mymr_CC_NGA = 3, /* Consonant NGA */
+ Mymr_CC_YA = 4, /* Consonant YA */
+ Mymr_CC_RA = 5, /* Consonant RA */
+ Mymr_CC_WA = 6, /* Consonant WA */
+ Mymr_CC_HA = 7, /* Consonant HA */
+ Mymr_CC_IND_VOWEL = 8, /* Independent vowel */
+ Mymr_CC_ZERO_WIDTH_NJ_MARK = 9, /* Zero Width non joiner character (0x200C) */
+ Mymr_CC_VIRAMA = 10, /* Subscript consonant combining character */
+ Mymr_CC_PRE_VOWEL = 11, /* Dependent vowel, prebase (Vowel e) */
+ Mymr_CC_BELOW_VOWEL = 12, /* Dependent vowel, prebase (Vowel u, uu) */
+ Mymr_CC_ABOVE_VOWEL = 13, /* Dependent vowel, prebase (Vowel i, ii, ai) */
+ Mymr_CC_POST_VOWEL = 14, /* Dependent vowel, prebase (Vowel aa) */
+ Mymr_CC_SIGN_ABOVE = 15,
+ Mymr_CC_SIGN_BELOW = 16,
+ Mymr_CC_SIGN_AFTER = 17,
+ Mymr_CC_ZERO_WIDTH_J_MARK = 18, /* Zero width joiner character */
+ Mymr_CC_COUNT = 19 /* This is the number of character classes */
+};
+
+enum MymrCharClassFlags {
+ Mymr_CF_CLASS_MASK = 0x0000FFFF,
+
+ Mymr_CF_CONSONANT = 0x01000000, /* flag to speed up comparing */
+ Mymr_CF_MEDIAL = 0x02000000, /* flag to speed up comparing */
+ Mymr_CF_IND_VOWEL = 0x04000000, /* flag to speed up comparing */
+ Mymr_CF_DEP_VOWEL = 0x08000000, /* flag to speed up comparing */
+ Mymr_CF_DOTTED_CIRCLE = 0x10000000, /* add a dotted circle if a character with this flag is the
+ first in a syllable */
+ Mymr_CF_VIRAMA = 0x20000000, /* flag to speed up comparing */
+
+ /* position flags */
+ Mymr_CF_POS_BEFORE = 0x00080000,
+ Mymr_CF_POS_BELOW = 0x00040000,
+ Mymr_CF_POS_ABOVE = 0x00020000,
+ Mymr_CF_POS_AFTER = 0x00010000,
+ Mymr_CF_POS_MASK = 0x000f0000,
+
+ Mymr_CF_AFTER_KINZI = 0x00100000
+};
+
+/* Characters that get refrered to by name */
+enum MymrChar
+{
+ Mymr_C_SIGN_ZWNJ = 0x200C,
+ Mymr_C_SIGN_ZWJ = 0x200D,
+ Mymr_C_DOTTED_CIRCLE = 0x25CC,
+ Mymr_C_RA = 0x101B,
+ Mymr_C_YA = 0x101A,
+ Mymr_C_NGA = 0x1004,
+ Mymr_C_VOWEL_E = 0x1031,
+ Mymr_C_VIRAMA = 0x1039
+};
+
+enum
+{
+ Mymr_xx = Mymr_CC_RESERVED,
+ Mymr_c1 = Mymr_CC_CONSONANT | Mymr_CF_CONSONANT | Mymr_CF_POS_BELOW,
+ Mymr_c2 = Mymr_CC_CONSONANT2 | Mymr_CF_CONSONANT,
+ Mymr_ng = Mymr_CC_NGA | Mymr_CF_CONSONANT | Mymr_CF_POS_ABOVE,
+ Mymr_ya = Mymr_CC_YA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_AFTER | Mymr_CF_AFTER_KINZI,
+ Mymr_ra = Mymr_CC_RA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BEFORE,
+ Mymr_wa = Mymr_CC_WA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW,
+ Mymr_ha = Mymr_CC_HA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW,
+ Mymr_id = Mymr_CC_IND_VOWEL | Mymr_CF_IND_VOWEL,
+ Mymr_vi = Mymr_CC_VIRAMA | Mymr_CF_VIRAMA | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE,
+ Mymr_dl = Mymr_CC_PRE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BEFORE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
+ Mymr_db = Mymr_CC_BELOW_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
+ Mymr_da = Mymr_CC_ABOVE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
+ Mymr_dr = Mymr_CC_POST_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
+ Mymr_sa = Mymr_CC_SIGN_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_ABOVE | Mymr_CF_AFTER_KINZI,
+ Mymr_sb = Mymr_CC_SIGN_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_BELOW | Mymr_CF_AFTER_KINZI,
+ Mymr_sp = Mymr_CC_SIGN_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI
+};
+
+
+typedef int MymrCharClass;
+
+
+static const MymrCharClass mymrCharClasses[] =
+{
+ Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_ng, Mymr_c1, Mymr_c1, Mymr_c1,
+ Mymr_c1, Mymr_c1, Mymr_c2, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, /* 1000 - 100F */
+ Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1,
+ Mymr_c1, Mymr_c1, Mymr_ya, Mymr_ra, Mymr_c1, Mymr_wa, Mymr_c1, Mymr_ha, /* 1010 - 101F */
+ Mymr_c2, Mymr_c2, Mymr_xx, Mymr_id, Mymr_id, Mymr_id, Mymr_id, Mymr_id,
+ Mymr_xx, Mymr_id, Mymr_id, Mymr_xx, Mymr_dr, Mymr_da, Mymr_da, Mymr_db, /* 1020 - 102F */
+ Mymr_db, Mymr_dl, Mymr_da, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_sa, Mymr_sb,
+ Mymr_sp, Mymr_vi, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1030 - 103F */
+ Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx,
+ Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1040 - 104F */
+ Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx,
+ Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1050 - 105F */
+};
+
+static MymrCharClass
+getMyanmarCharClass (ushort ch)
+{
+ if (ch == Mymr_C_SIGN_ZWJ)
+ return Mymr_CC_ZERO_WIDTH_J_MARK;
+
+ if (ch == Mymr_C_SIGN_ZWNJ)
+ return Mymr_CC_ZERO_WIDTH_NJ_MARK;
+
+ if (ch < 0x1000 || ch > 0x105f)
+ return Mymr_CC_RESERVED;
+
+ return mymrCharClasses[ch - 0x1000];
+}
+
+static const signed char mymrStateTable[][Mymr_CC_COUNT] =
+{
+/* xx c1, c2 ng ya ra wa ha id zwnj vi dl db da dr sa sb sp zwj */
+ { 1, 4, 4, 2, 4, 4, 4, 4, 24, 1, 27, 17, 18, 19, 20, 21, 1, 1, 4}, /* 0 - ground state */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 1 - exit state (or sp to the right of the syllable) */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 17, 18, 19, 20, 21, -1, -1, 4}, /* 2 - NGA */
+ {-1, 4, 4, 4, 4, 4, 4, 4, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 3 - Virama after NGA */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 17, 18, 19, 20, 21, 1, 1, -1}, /* 4 - Base consonant */
+ {-2, 6, -2, -2, 7, 8, 9, 10, -2, 23, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 5 - First virama */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, 17, 18, 19, 20, 21, -1, -1, -1}, /* 6 - c1 after virama */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 7 - ya after virama */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 8 - ra after virama */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 9 - wa after virama */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 10 - ha after virama */
+ {-1, -1, -1, -1, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 11 - Virama after NGA+zwj */
+ {-2, -2, -2, -2, -2, -2, 13, 14, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 12 - Second virama */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 17, 18, 19, 20, 21, -1, -1, -1}, /* 13 - wa after virama */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 14 - ha after virama */
+ {-2, -2, -2, -2, -2, -2, -2, 16, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 15 - Third virama */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 16 - ha after virama */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, 21, 1, 1, -1}, /* 17 - dl, Dependent vowel e */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, 21, 1, 1, -1}, /* 18 - db, Dependent vowel u,uu */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1}, /* 19 - da, Dependent vowel i,ii,ai */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, 1, 1, -1}, /* 20 - dr, Dependent vowel aa */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1}, /* 21 - sa, Sign anusvara */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 22 - atha */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1}, /* 23 - zwnj for atha */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, /* 24 - Independent vowel */
+ {-2, -2, -2, -2, 26, 26, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 25 - Virama after subscript consonant */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, 1, -1}, /* 26 - ra/ya after subscript consonant + virama */
+ {-1, 6, -1, -1, 7, 8, 9, 10, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 27 - Virama after ground state */
+/* exit state -2 is for invalid order of medials and combination of invalids
+ with virama where virama should treat as start of next syllable
+ */
+};
+
+/*#define MYANMAR_DEBUG */
+#ifdef MYANMAR_DEBUG
+#define MMDEBUG qDebug
+#else
+# define MMDEBUG \
+ if (0) \
+ printf
+#endif
+
+/*
+// Given an input string of characters and a location in which to start looking
+// calculate, using the state table, which one is the last character of the syllable
+// that starts in the starting position.
+*/
+static int myanmar_nextSyllableBoundary(const ushort *s, int start, int end, bool *invalid)
+{
+ const ushort *uc = s + start;
+ int state = 0;
+ int pos = start;
+ *invalid = false;
+
+ while (pos < end) {
+ MymrCharClass charClass = getMyanmarCharClass(*uc);
+ state = mymrStateTable[state][charClass & Mymr_CF_CLASS_MASK];
+ if (pos == start)
+ *invalid = (bool)(charClass & Mymr_CF_DOTTED_CIRCLE);
+
+ MMDEBUG("state[%d]=%d class=%8x (uc=%4x)", pos - start, state, charClass, *uc);
+
+ if (state < 0) {
+ if (state < -1)
+ --pos;
+ break;
+ }
+ ++uc;
+ ++pos;
+ }
+ return pos;
+}
+
+static void myanmarAttributes(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes)
+{
+ int end = from + len;
+ const ushort *uc = text + from;
+ uint i = 0;
+ Q_UNUSED(script);
+ attributes += from;
+ while (i < len) {
+ bool invalid;
+ uint boundary = myanmar_nextSyllableBoundary(text, from+i, end, &invalid) - from;
+
+ attributes[i].graphemeBoundary = true;
+ attributes[i].lineBreak = true;
+
+ if (boundary > len-1)
+ boundary = len;
+ i++;
+ while (i < boundary) {
+ attributes[i].graphemeBoundary = false;
+ ++uc;
+ ++i;
+ }
+ assert(i == boundary);
+ }
+}
+
+/*
+// Vocabulary
+// Base -> A consonant or an independent vowel in its full (not subscript) form. It is the
+// center of the syllable, it can be surrounded by coeng (subscript) consonants, vowels,
+// split vowels, signs... but there is only one base in a syllable, it has to be coded as
+// the first character of the syllable.
+// split vowel --> vowel that has two parts placed separately (e.g. Before and after the consonant).
+// Khmer language has five of them. Khmer split vowels either have one part before the
+// base and one after the base or they have a part before the base and a part above the base.
+// The first part of all Khmer split vowels is the same character, identical to
+// the glyph of Khmer dependent vowel SRA EI
+// coeng --> modifier used in Khmer to construct coeng (subscript) consonants
+// Differently than indian languages, the coeng modifies the consonant that follows it,
+// not the one preceding it Each consonant has two forms, the base form and the subscript form
+// the base form is the normal one (using the consonants code-point), the subscript form is
+// displayed when the combination coeng + consonant is encountered.
+// Consonant of type 1 -> A consonant which has subscript for that only occupies space under a base consonant
+// Consonant of type 2.-> Its subscript form occupies space under and before the base (only one, RO)
+// Consonant of Type 3 -> Its subscript form occupies space under and after the base (KHO, CHHO, THHO, BA, YO, SA)
+// Consonant shifter -> Khmer has to series of consonants. The same dependent vowel has different sounds
+// if it is attached to a consonant of the first series or a consonant of the second series
+// Most consonants have an equivalent in the other series, but some of theme exist only in
+// one series (for example SA). If we want to use the consonant SA with a vowel sound that
+// can only be done with a vowel sound that corresponds to a vowel accompanying a consonant
+// of the other series, then we need to use a consonant shifter: TRIISAP or MUSIKATOAN
+// x17C9 y x17CA. TRIISAP changes a first series consonant to second series sound and
+// MUSIKATOAN a second series consonant to have a first series vowel sound.
+// Consonant shifter are both normally supercript marks, but, when they are followed by a
+// superscript, they change shape and take the form of subscript dependent vowel SRA U.
+// If they are in the same syllable as a coeng consonant, Unicode 3.0 says that they
+// should be typed before the coeng. Unicode 4.0 breaks the standard and says that it should
+// be placed after the coeng consonant.
+// Dependent vowel -> In khmer dependent vowels can be placed above, below, before or after the base
+// Each vowel has its own position. Only one vowel per syllable is allowed.
+// Signs -> Khmer has above signs and post signs. Only one above sign and/or one post sign are
+// Allowed in a syllable.
+//
+//
+// order is important here! This order must be the same that is found in each horizontal
+// line in the statetable for Khmer (see khmerStateTable) .
+*/
+enum KhmerCharClassValues {
+ CC_RESERVED = 0,
+ CC_CONSONANT = 1, /* Consonant of type 1 or independent vowel */
+ CC_CONSONANT2 = 2, /* Consonant of type 2 */
+ CC_CONSONANT3 = 3, /* Consonant of type 3 */
+ CC_ZERO_WIDTH_NJ_MARK = 4, /* Zero Width non joiner character (0x200C) */
+ CC_CONSONANT_SHIFTER = 5,
+ CC_ROBAT = 6, /* Khmer special diacritic accent -treated differently in state table */
+ CC_COENG = 7, /* Subscript consonant combining character */
+ CC_DEPENDENT_VOWEL = 8,
+ CC_SIGN_ABOVE = 9,
+ CC_SIGN_AFTER = 10,
+ CC_ZERO_WIDTH_J_MARK = 11, /* Zero width joiner character */
+ CC_COUNT = 12 /* This is the number of character classes */
+};
+
+
+enum KhmerCharClassFlags {
+ CF_CLASS_MASK = 0x0000FFFF,
+
+ CF_CONSONANT = 0x01000000, /* flag to speed up comparing */
+ CF_SPLIT_VOWEL = 0x02000000, /* flag for a split vowel -> the first part is added in front of the syllable */
+ CF_DOTTED_CIRCLE = 0x04000000, /* add a dotted circle if a character with this flag is the first in a syllable */
+ CF_COENG = 0x08000000, /* flag to speed up comparing */
+ CF_SHIFTER = 0x10000000, /* flag to speed up comparing */
+ CF_ABOVE_VOWEL = 0x20000000, /* flag to speed up comparing */
+
+ /* position flags */
+ CF_POS_BEFORE = 0x00080000,
+ CF_POS_BELOW = 0x00040000,
+ CF_POS_ABOVE = 0x00020000,
+ CF_POS_AFTER = 0x00010000,
+ CF_POS_MASK = 0x000f0000
+};
+
+
+/* Characters that get referred to by name */
+enum KhmerChar {
+ C_SIGN_ZWNJ = 0x200C,
+ C_SIGN_ZWJ = 0x200D,
+ C_RO = 0x179A,
+ C_VOWEL_AA = 0x17B6,
+ C_SIGN_NIKAHIT = 0x17C6,
+ C_VOWEL_E = 0x17C1,
+ C_COENG = 0x17D2
+};
+
+
+/*
+// simple classes, they are used in the statetable (in this file) to control the length of a syllable
+// they are also used to know where a character should be placed (location in reference to the base character)
+// and also to know if a character, when independently displayed, should be displayed with a dotted-circle to
+// indicate error in syllable construction
+*/
+enum {
+ _xx = CC_RESERVED,
+ _sa = CC_SIGN_ABOVE | CF_DOTTED_CIRCLE | CF_POS_ABOVE,
+ _sp = CC_SIGN_AFTER | CF_DOTTED_CIRCLE| CF_POS_AFTER,
+ _c1 = CC_CONSONANT | CF_CONSONANT,
+ _c2 = CC_CONSONANT2 | CF_CONSONANT,
+ _c3 = CC_CONSONANT3 | CF_CONSONANT,
+ _rb = CC_ROBAT | CF_POS_ABOVE | CF_DOTTED_CIRCLE,
+ _cs = CC_CONSONANT_SHIFTER | CF_DOTTED_CIRCLE | CF_SHIFTER,
+ _dl = CC_DEPENDENT_VOWEL | CF_POS_BEFORE | CF_DOTTED_CIRCLE,
+ _db = CC_DEPENDENT_VOWEL | CF_POS_BELOW | CF_DOTTED_CIRCLE,
+ _da = CC_DEPENDENT_VOWEL | CF_POS_ABOVE | CF_DOTTED_CIRCLE | CF_ABOVE_VOWEL,
+ _dr = CC_DEPENDENT_VOWEL | CF_POS_AFTER | CF_DOTTED_CIRCLE,
+ _co = CC_COENG | CF_COENG | CF_DOTTED_CIRCLE,
+
+ /* split vowel */
+ _va = _da | CF_SPLIT_VOWEL,
+ _vr = _dr | CF_SPLIT_VOWEL
+};
+
+
+/*
+// Character class: a character class value
+// ORed with character class flags.
+*/
+typedef unsigned long KhmerCharClass;
+
+
+/*
+// Character class tables
+// _xx character does not combine into syllable, such as numbers, puntuation marks, non-Khmer signs...
+// _sa Sign placed above the base
+// _sp Sign placed after the base
+// _c1 Consonant of type 1 or independent vowel (independent vowels behave as type 1 consonants)
+// _c2 Consonant of type 2 (only RO)
+// _c3 Consonant of type 3
+// _rb Khmer sign robat u17CC. combining mark for subscript consonants
+// _cd Consonant-shifter
+// _dl Dependent vowel placed before the base (left of the base)
+// _db Dependent vowel placed below the base
+// _da Dependent vowel placed above the base
+// _dr Dependent vowel placed behind the base (right of the base)
+// _co Khmer combining mark COENG u17D2, combines with the consonant or independent vowel following
+// it to create a subscript consonant or independent vowel
+// _va Khmer split vowel in which the first part is before the base and the second one above the base
+// _vr Khmer split vowel in which the first part is before the base and the second one behind (right of) the base
+*/
+static const KhmerCharClass khmerCharClasses[] = {
+ _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, /* 1780 - 178F */
+ _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c2, _c1, _c1, _c1, _c3, _c3, /* 1790 - 179F */
+ _c1, _c3, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, /* 17A0 - 17AF */
+ _c1, _c1, _c1, _c1, _dr, _dr, _dr, _da, _da, _da, _da, _db, _db, _db, _va, _vr, /* 17B0 - 17BF */
+ _vr, _dl, _dl, _dl, _vr, _vr, _sa, _sp, _sp, _cs, _cs, _sa, _rb, _sa, _sa, _sa, /* 17C0 - 17CF */
+ _sa, _sa, _co, _sa, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _sa, _xx, _xx /* 17D0 - 17DF */
+};
+
+/* this enum must reflect the range of khmerCharClasses */
+enum KhmerCharClassesRange {
+ KhmerFirstChar = 0x1780,
+ KhmerLastChar = 0x17df
+};
+
+/*
+// Below we define how a character in the input string is either in the khmerCharClasses table
+// (in which case we get its type back), a ZWJ or ZWNJ (two characters that may appear
+// within the syllable, but are not in the table) we also get their type back, or an unknown object
+// in which case we get _xx (CC_RESERVED) back
+*/
+static KhmerCharClass getKhmerCharClass(ushort uc)
+{
+ if (uc == C_SIGN_ZWJ) {
+ return CC_ZERO_WIDTH_J_MARK;
+ }
+
+ if (uc == C_SIGN_ZWNJ) {
+ return CC_ZERO_WIDTH_NJ_MARK;
+ }
+
+ if (uc < KhmerFirstChar || uc > KhmerLastChar) {
+ return CC_RESERVED;
+ }
+
+ return khmerCharClasses[uc - KhmerFirstChar];
+}
+
+
+/*
+// The stateTable is used to calculate the end (the length) of a well
+// formed Khmer Syllable.
+//
+// Each horizontal line is ordered exactly the same way as the values in KhmerClassTable
+// CharClassValues. This coincidence of values allows the follow up of the table.
+//
+// Each line corresponds to a state, which does not necessarily need to be a type
+// of component... for example, state 2 is a base, with is always a first character
+// in the syllable, but the state could be produced a consonant of any type when
+// it is the first character that is analysed (in ground state).
+//
+// Differentiating 3 types of consonants is necessary in order to
+// forbid the use of certain combinations, such as having a second
+// coeng after a coeng RO,
+// The inexistent possibility of having a type 3 after another type 3 is permitted,
+// eliminating it would very much complicate the table, and it does not create typing
+// problems, as the case above.
+//
+// The table is quite complex, in order to limit the number of coeng consonants
+// to 2 (by means of the table).
+//
+// There a peculiarity, as far as Unicode is concerned:
+// - The consonant-shifter is considered in two possible different
+// locations, the one considered in Unicode 3.0 and the one considered in
+// Unicode 4.0. (there is a backwards compatibility problem in this standard).
+//
+//
+// xx independent character, such as a number, punctuation sign or non-khmer char
+//
+// c1 Khmer consonant of type 1 or an independent vowel
+// that is, a letter in which the subscript for is only under the
+// base, not taking any space to the right or to the left
+//
+// c2 Khmer consonant of type 2, the coeng form takes space under
+// and to the left of the base (only RO is of this type)
+//
+// c3 Khmer consonant of type 3. Its subscript form takes space under
+// and to the right of the base.
+//
+// cs Khmer consonant shifter
+//
+// rb Khmer robat
+//
+// co coeng character (u17D2)
+//
+// dv dependent vowel (including split vowels, they are treated in the same way).
+// even if dv is not defined above, the component that is really tested for is
+// KhmerClassTable::CC_DEPENDENT_VOWEL, which is common to all dependent vowels
+//
+// zwj Zero Width joiner
+//
+// zwnj Zero width non joiner
+//
+// sa above sign
+//
+// sp post sign
+//
+// there are lines with equal content but for an easier understanding
+// (and maybe change in the future) we did not join them
+*/
+static const signed char khmerStateTable[][CC_COUNT] =
+{
+ /* xx c1 c2 c3 zwnj cs rb co dv sa sp zwj */
+ { 1, 2, 2, 2, 1, 1, 1, 6, 1, 1, 1, 2}, /* 0 - ground state */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 1 - exit state (or sign to the right of the syllable) */
+ {-1, -1, -1, -1, 3, 4, 5, 6, 16, 17, 1, -1}, /* 2 - Base consonant */
+ {-1, -1, -1, -1, -1, 4, -1, -1, 16, -1, -1, -1}, /* 3 - First ZWNJ before a register shifter It can only be followed by a shifter or a vowel */
+ {-1, -1, -1, -1, 15, -1, -1, 6, 16, 17, 1, 14}, /* 4 - First register shifter */
+ {-1, -1, -1, -1, -1, -1, -1, -1, 20, -1, 1, -1}, /* 5 - Robat */
+ {-1, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1}, /* 6 - First Coeng */
+ {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, /* 7 - First consonant of type 1 after coeng */
+ {-1, -1, -1, -1, 12, 13, -1, -1, 16, 17, 1, 14}, /* 8 - First consonant of type 2 after coeng */
+ {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, /* 9 - First consonant or type 3 after ceong */
+ {-1, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1}, /* 10 - Second Coeng (no register shifter before) */
+ {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, /* 11 - Second coeng consonant (or ind. vowel) no register shifter before */
+ {-1, -1, -1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, /* 12 - Second ZWNJ before a register shifter */
+ {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, /* 13 - Second register shifter */
+ {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, /* 14 - ZWJ before vowel */
+ {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, /* 15 - ZWNJ before vowel */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 1, 18}, /* 16 - dependent vowel */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 18}, /* 17 - sign above */
+ {-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1}, /* 18 - ZWJ after vowel */
+ {-1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 19 - Third coeng */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, /* 20 - dependent vowel after a Robat */
+};
+
+
+/* #define KHMER_DEBUG */
+#ifdef KHMER_DEBUG
+#define KHDEBUG qDebug
+#else
+# define KHDEBUG \
+ if (0) \
+ printf
+#endif
+
+/*
+// Given an input string of characters and a location in which to start looking
+// calculate, using the state table, which one is the last character of the syllable
+// that starts in the starting position.
+*/
+static int khmer_nextSyllableBoundary(const ushort *s, int start, int end, bool *invalid)
+{
+ const ushort *uc = s + start;
+ int state = 0;
+ int pos = start;
+ *invalid = false;
+
+ while (pos < end) {
+ KhmerCharClass charClass = getKhmerCharClass(*uc);
+ if (pos == start) {
+ *invalid = (charClass > 0) && ! (charClass & CF_CONSONANT);
+ }
+ state = khmerStateTable[state][charClass & CF_CLASS_MASK];
+
+ KHDEBUG("state[%d]=%d class=%8lx (uc=%4x)", pos - start, state,
+ charClass, *uc );
+
+ if (state < 0) {
+ break;
+ }
+ ++uc;
+ ++pos;
+ }
+ return pos;
+}
+
+static void khmerAttributes(QChar::Script script, const ushort *text, uint from, uint len, QCharAttributes *attributes)
+{
+ int end = from + len;
+ const ushort *uc = text + from;
+ uint i = 0;
+ Q_UNUSED(script);
+ attributes += from;
+ while ( i < len ) {
+ bool invalid;
+ uint boundary = khmer_nextSyllableBoundary( text, from+i, end, &invalid ) - from;
+
+ attributes[i].graphemeBoundary = true;
+
+ if ( boundary > len-1 ) boundary = len;
+ i++;
+ while ( i < boundary ) {
+ attributes[i].graphemeBoundary = false;
+ ++uc;
+ ++i;
+ }
+ assert( i == boundary );
+ }
+}
+
+
+const CharAttributeFunction charAttributeFunction[] = {
+// Script_Unknown,
+ nullptr,
+// Script_Inherited,
+ nullptr,
+// Script_Common,
+ nullptr,
+// Script_Latin,
+ nullptr,
+// Script_Greek,
+ nullptr,
+// Script_Cyrillic,
+ nullptr,
+// Script_Armenian,
+ nullptr,
+// Script_Hebrew,
+ nullptr,
+// Script_Arabic,
+ nullptr,
+// Script_Syriac,
+ nullptr,
+// Script_Thaana,
+ nullptr,
+// Script_Devanagari,
+ indicAttributes,
+// Script_Bengali,
+ indicAttributes,
+// Script_Gurmukhi,
+ indicAttributes,
+// Script_Gujarati,
+ indicAttributes,
+// Script_Oriya,
+ indicAttributes,
+// Script_Tamil,
+ indicAttributes,
+// Script_Telugu,
+ indicAttributes,
+// Script_Kannada,
+ indicAttributes,
+// Script_Malayalam,
+ indicAttributes,
+// Script_Sinhala,
+ indicAttributes,
+// Script_Thai,
+ thaiAttributes,
+// Script_Lao,
+ nullptr,
+// Script_Tibetan,
+ tibetanAttributes,
+// Script_Myanmar,
+ myanmarAttributes,
+// Script_Georgian,
+ nullptr,
+// Script_Hangul,
+ nullptr,
+// Script_Ethiopic,
+ nullptr,
+// Script_Cherokee,
+ nullptr,
+// Script_CanadianAboriginal,
+ nullptr,
+// Script_Ogham,
+ nullptr,
+// Script_Runic,
+ nullptr,
+// Script_Khmer,
+ khmerAttributes
+};
+
+static void getCharAttributes(const ushort *string, uint stringLength,
+ const QUnicodeTools::ScriptItem *items, uint numItems,
+ QCharAttributes *attributes)
+{
+ if (stringLength == 0)
+ return;
+ for (uint i = 0; i < numItems; ++i) {
+ QChar::Script script = items[i].script;
+ if (script > QChar::Script_Khmer)
+ script = QChar::Script_Common;
+ CharAttributeFunction attributeFunction = charAttributeFunction[script];
+ if (!attributeFunction)
+ continue;
+ int end = i < numItems - 1 ? items[i + 1].position : stringLength;
+ attributeFunction(script, string, items[i].position, end - items[i].position, attributes);
+ }
+}
+
+}
Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
const ScriptItem *items, int numItems,
@@ -750,38 +2236,7 @@ Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
if (!items || numItems <= 0)
return;
- QVarLengthArray<HB_ScriptItem, 64> scriptItems;
- scriptItems.reserve(numItems);
- int start = 0;
- HB_Script startScript = script_to_hbscript(items[start].script);
- if (Q_UNLIKELY(startScript == HB_Script_Inherited))
- startScript = HB_Script_Common;
- for (int i = start + 1; i < numItems; ++i) {
- HB_Script script = script_to_hbscript(items[i].script);
- if (Q_LIKELY(script == startScript || script == HB_Script_Inherited))
- continue;
- Q_ASSERT(items[i].position > items[start].position);
- HB_ScriptItem item;
- item.pos = items[start].position;
- item.length = items[i].position - items[start].position;
- item.script = startScript;
- item.bidiLevel = 0; // unused
- scriptItems.append(item);
- start = i;
- startScript = script;
- }
- if (items[start].position + 1 < length) {
- HB_ScriptItem item;
- item.pos = items[start].position;
- item.length = length - items[start].position;
- item.script = startScript;
- item.bidiLevel = 0; // unused
- scriptItems.append(item);
- }
- Q_STATIC_ASSERT(sizeof(QCharAttributes) == sizeof(HB_CharAttributes));
- HB_GetTailoredCharAttributes(string, length,
- scriptItems.constData(), scriptItems.size(),
- reinterpret_cast<HB_CharAttributes *>(attributes));
+ Tailored::getCharAttributes(string, length, items, numItems, attributes);
}
}
@@ -792,11 +2247,11 @@ Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
//
// ----------------------------------------------------------------------------
-Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts)
+Q_CORE_EXPORT void initScripts(const ushort *string, int length, ScriptItemArray *scripts)
{
int sor = 0;
int eor = 0;
- uchar script = QChar::Script_Common;
+ QChar::Script script = QChar::Script_Common;
for (int i = 0; i < length; ++i, eor = i) {
uint ucs4 = string[i];
@@ -810,7 +2265,7 @@ Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts)
const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);
- uchar nscript = prop->script;
+ QChar::Script nscript = QChar::Script(prop->script);
if (Q_LIKELY(nscript == script || nscript <= QChar::Script_Common))
continue;
@@ -832,7 +2287,7 @@ Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts)
Q_ASSERT(script > QChar::Script_Common);
Q_ASSERT(sor < eor);
- ::memset(scripts + sor, script, (eor - sor) * sizeof(uchar));
+ scripts->append(ScriptItem{sor, script});
sor = eor;
script = nscript;
@@ -840,7 +2295,7 @@ Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts)
Q_ASSERT(script >= QChar::Script_Common);
Q_ASSERT(eor == length);
- ::memset(scripts + sor, script, (eor - sor) * sizeof(uchar));
+ scripts->append(ScriptItem{sor, script});
}
} // namespace QUnicodeTools
diff --git a/src/corelib/text/qunicodetools_p.h b/src/corelib/text/qunicodetools_p.h
index ed6fcb5d65..5715444025 100644
--- a/src/corelib/text/qunicodetools_p.h
+++ b/src/corelib/text/qunicodetools_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -53,6 +53,7 @@
#include <QtCore/private/qglobal_p.h>
#include <QtCore/qchar.h>
+#include <QtCore/qvarlengtharray.h>
QT_BEGIN_NAMESPACE
@@ -71,13 +72,14 @@ Q_DECLARE_TYPEINFO(QCharAttributes, Q_PRIMITIVE_TYPE);
namespace QUnicodeTools {
-// ### temporary
struct ScriptItem
{
int position;
- int script;
+ QChar::Script script;
};
+using ScriptItemArray = QVarLengthArray<ScriptItem, 64>;
+
} // namespace QUnicodeTools
Q_DECLARE_TYPEINFO(QUnicodeTools::ScriptItem, Q_PRIMITIVE_TYPE);
namespace QUnicodeTools {
@@ -101,7 +103,7 @@ Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
QCharAttributes *attributes, CharAttributeOptions options = DefaultOptionsCompat);
-Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts);
+Q_CORE_EXPORT void initScripts(const ushort *string, int length, ScriptItemArray *scripts);
} // namespace QUnicodeTools
diff --git a/src/corelib/text/text.pri b/src/corelib/text/text.pri
index d2a02059c7..59ca5fe6d0 100644
--- a/src/corelib/text/text.pri
+++ b/src/corelib/text/text.pri
@@ -81,19 +81,6 @@ qtConfig(regularexpression) {
SOURCES += text/qregularexpression.cpp
}
-INCLUDEPATH += ../3rdparty/harfbuzz/src
-HEADERS += ../3rdparty/harfbuzz/src/harfbuzz.h
-SOURCES += ../3rdparty/harfbuzz/src/harfbuzz-buffer.c \
- ../3rdparty/harfbuzz/src/harfbuzz-gdef.c \
- ../3rdparty/harfbuzz/src/harfbuzz-gsub.c \
- ../3rdparty/harfbuzz/src/harfbuzz-gpos.c \
- ../3rdparty/harfbuzz/src/harfbuzz-impl.c \
- ../3rdparty/harfbuzz/src/harfbuzz-open.c \
- ../3rdparty/harfbuzz/src/harfbuzz-stream.c \
- ../3rdparty/harfbuzz/src/harfbuzz-shaper-all.cpp \
- text/qharfbuzz.cpp
-HEADERS += text/qharfbuzz_p.h
-
TR_EXCLUDE += ../3rdparty/*
# MIPS DSP
diff --git a/src/corelib/thread/qexception.cpp b/src/corelib/thread/qexception.cpp
index f9c63085b7..5c7a05c9c2 100644
--- a/src/corelib/thread/qexception.cpp
+++ b/src/corelib/thread/qexception.cpp
@@ -158,65 +158,38 @@ QUnhandledException *QUnhandledException::clone() const
namespace QtPrivate {
-class Base : public QSharedData
-{
-public:
- Base(QException *exception)
- : exception(exception), hasThrown(false) { }
- ~Base() { delete exception; }
-
- QException *exception;
- bool hasThrown;
-};
-
-ExceptionHolder::ExceptionHolder(QException *exception)
-: base(exception ? new Base(exception) : nullptr) {}
-
-ExceptionHolder::ExceptionHolder(const ExceptionHolder &other)
-: base(other.base)
-{}
-
-void ExceptionHolder::operator=(const ExceptionHolder &other)
-{
- base = other.base;
-}
-
-ExceptionHolder::~ExceptionHolder()
-{}
-
-QException *ExceptionHolder::exception() const
+void ExceptionStore::setException(const QException &e)
{
- if (!base)
- return nullptr;
- return base->exception;
+ Q_ASSERT(!hasException());
+ try {
+ e.raise();
+ } catch (...) {
+ exceptionHolder = std::current_exception();
+ }
}
-void ExceptionStore::setException(const QException &e)
+void ExceptionStore::setException(std::exception_ptr e)
{
- if (hasException() == false)
- exceptionHolder = ExceptionHolder(e.clone());
+ Q_ASSERT(!hasException());
+ exceptionHolder = e;
}
bool ExceptionStore::hasException() const
{
- return (exceptionHolder.exception() != nullptr);
+ return !!exceptionHolder;
}
-ExceptionHolder ExceptionStore::exception()
+std::exception_ptr ExceptionStore::exception() const
{
return exceptionHolder;
}
void ExceptionStore::throwPossibleException()
{
- if (hasException() ) {
- exceptionHolder.base->hasThrown = true;
- exceptionHolder.exception()->raise();
- }
+ if (hasException())
+ std::rethrow_exception(exceptionHolder);
}
-bool ExceptionStore::hasThrown() const { return exceptionHolder.base->hasThrown; }
-
} // namespace QtPrivate
#endif //Q_CLANG_QDOC
diff --git a/src/corelib/thread/qexception.h b/src/corelib/thread/qexception.h
index d33904c1f2..b117d90caf 100644
--- a/src/corelib/thread/qexception.h
+++ b/src/corelib/thread/qexception.h
@@ -84,27 +84,15 @@ public:
namespace QtPrivate {
-class Base;
-class Q_CORE_EXPORT ExceptionHolder
-{
-public:
- ExceptionHolder(QException *exception = nullptr);
- ExceptionHolder(const ExceptionHolder &other);
- void operator=(const ExceptionHolder &other); // ### Qt6: copy-assign operator shouldn't return void. Remove this method and the copy-ctor, they are unneeded.
- ~ExceptionHolder();
- QException *exception() const;
- QExplicitlySharedDataPointer<Base> base;
-};
-
class Q_CORE_EXPORT ExceptionStore
{
public:
void setException(const QException &e);
+ void setException(std::exception_ptr e);
bool hasException() const;
- ExceptionHolder exception();
+ std::exception_ptr exception() const;
void throwPossibleException();
- bool hasThrown() const;
- ExceptionHolder exceptionHolder;
+ std::exception_ptr exceptionHolder;
};
} // namespace QtPrivate
diff --git a/src/corelib/thread/qfuture.h b/src/corelib/thread/qfuture.h
index d3135510b3..bfca16b641 100644
--- a/src/corelib/thread/qfuture.h
+++ b/src/corelib/thread/qfuture.h
@@ -45,30 +45,62 @@
#include <QtCore/qfutureinterface.h>
#include <QtCore/qstring.h>
+#include <QtCore/qfuture_impl.h>
+
+#include <type_traits>
+#include <vector>
+
QT_REQUIRE_CONFIG(future);
QT_BEGIN_NAMESPACE
-
template <typename T>
class QFutureWatcher;
-template <>
-class QFutureWatcher<void>;
template <typename T>
class QFuture
{
+ static_assert (std::is_copy_constructible_v<T>
+ || std::is_move_constructible_v<T>
+ || std::is_same_v<T, void>,
+ "Type with copy or move constructors or type void is required");
public:
QFuture()
: d(QFutureInterface<T>::canceledResult())
{ }
+
+ template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
explicit QFuture(QFutureInterface<T> *p) // internal
: d(*p)
{ }
+
+ template<typename U = T, typename = QtPrivate::EnableForVoid<U>>
+ explicit QFuture(QFutureInterfaceBase *p) // internal
+ : d(*p)
+ {
+ }
+
+#if !defined(Q_CC_XLC)
+ template<typename U, typename V = T, typename = QtPrivate::EnableForVoid<V>>
+ QFuture(const QFuture<U> &other) : d(other.d)
+ {
+ }
+
+ template<typename U, typename V = T, typename = QtPrivate::EnableForVoid<V>>
+ QFuture<void> &operator=(const QFuture<U> &other)
+ {
+ d = other.d;
+ return *this;
+ }
+#endif
+
#if defined(Q_CLANG_QDOC)
~QFuture() { }
QFuture(const QFuture<T> &) { }
QFuture<T> & operator=(const QFuture<T> &) { }
+
+ // This is required to allow QDoc to find the declaration of operator T().
+ operator T() const;
#endif
bool operator==(const QFuture &other) const { return (d == other.d); }
@@ -94,16 +126,54 @@ public:
QString progressText() const { return d.progressText(); }
void waitForFinished() { d.waitForFinished(); }
+ template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
inline T result() const;
+
+ template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
inline T resultAt(int index) const;
+
+ template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
bool isResultReadyAt(int resultIndex) const { return d.isResultReadyAt(resultIndex); }
- operator T() const { return result(); }
+ // operator T()
+ template<typename U = T>
+ operator typename std::enable_if_t<!std::is_same_v<U, void>, U>() const { return result(); }
+
+ template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
QList<T> results() const { return d.results(); }
+ template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
+ T takeResult() { return d.takeResult(); }
+
+ template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
+ std::vector<T> takeResults() { return d.takeResults(); }
+
+ bool isValid() const { return d.isValid(); }
+
+ template<class Function>
+ using ResultType = typename QtPrivate::ResultTypeHelper<Function, T>::ResultType;
+
+ template<class Function>
+ QFuture<ResultType<Function>> then(Function &&function);
+
+ template<class Function>
+ QFuture<ResultType<Function>> then(QtFuture::Launch policy, Function &&function);
+
+ template<class Function>
+ QFuture<ResultType<Function>> then(QThreadPool *pool, Function &&function);
+
+#ifndef QT_NO_EXCEPTIONS
+ template<class Function,
+ typename = std::enable_if_t<!QtPrivate::ArgResolver<Function>::HasExtraArgs>>
+ QFuture<T> onFailed(Function &&handler);
+#endif
+
class const_iterator
{
public:
+ static_assert(!std::is_same_v<T, void>,
+ "It isn't possible to define QFuture<void>::const_iterator");
+
typedef std::bidirectional_iterator_tag iterator_category;
typedef qptrdiff difference_type;
typedef T value_type;
@@ -190,26 +260,51 @@ public:
friend class const_iterator;
typedef const_iterator ConstIterator;
+ template<class U = T, typename = QtPrivate::EnableForNonVoid<U>>
const_iterator begin() const { return const_iterator(this, 0); }
+
+ template<class U = T, typename = QtPrivate::EnableForNonVoid<U>>
const_iterator constBegin() const { return const_iterator(this, 0); }
+
+ template<class U = T, typename = QtPrivate::EnableForNonVoid<U>>
const_iterator end() const { return const_iterator(this, -1); }
+
+ template<class U = T, typename = QtPrivate::EnableForNonVoid<U>>
const_iterator constEnd() const { return const_iterator(this, -1); }
private:
friend class QFutureWatcher<T>;
-public: // Warning: the d pointer is not documented and is considered private.
- mutable QFutureInterface<T> d;
+ template<class U>
+ friend class QFuture;
+
+ template<class Function, class ResultType, class ParentResultType>
+ friend class QtPrivate::Continuation;
+
+#ifndef QT_NO_EXCEPTIONS
+ template<class Function, class ResultType>
+ friend class QtPrivate::FailureHandler;
+#endif
+
+ using QFuturePrivate =
+ std::conditional_t<std::is_same_v<T, void>, QFutureInterfaceBase, QFutureInterface<T>>;
+
+#ifdef QFUTURE_TEST
+public:
+#endif
+ mutable QFuturePrivate d;
};
-template <typename T>
+template<typename T>
+template<typename U, typename>
inline T QFuture<T>::result() const
{
d.waitForResult(0);
return d.resultReference(0);
}
-template <typename T>
+template<typename T>
+template<typename U, typename>
inline T QFuture<T>::resultAt(int index) const
{
d.waitForResult(index);
@@ -222,64 +317,47 @@ inline QFuture<T> QFutureInterface<T>::future()
return QFuture<T>(this);
}
-Q_DECLARE_SEQUENTIAL_ITERATOR(Future)
-
-template <>
-class QFuture<void>
+template<class T>
+template<class Function>
+QFuture<typename QFuture<T>::template ResultType<Function>> QFuture<T>::then(Function &&function)
{
-public:
- QFuture()
- : d(QFutureInterface<void>::canceledResult())
- { }
- explicit QFuture(QFutureInterfaceBase *p) // internal
- : d(*p)
- { }
-
- bool operator==(const QFuture &other) const { return (d == other.d); }
- bool operator!=(const QFuture &other) const { return (d != other.d); }
-
-#if !defined(Q_CC_XLC)
- template <typename T>
- QFuture(const QFuture<T> &other)
- : d(other.d)
- { }
-
- template <typename T>
- QFuture<void> &operator=(const QFuture<T> &other)
- {
- d = other.d;
- return *this;
- }
-#endif
-
- void cancel() { d.cancel(); }
- bool isCanceled() const { return d.isCanceled(); }
+ return then(QtFuture::Launch::Sync, std::forward<Function>(function));
+}
- void setPaused(bool paused) { d.setPaused(paused); }
- bool isPaused() const { return d.isPaused(); }
- void pause() { setPaused(true); }
- void resume() { setPaused(false); }
- void togglePaused() { d.togglePaused(); }
+template<class T>
+template<class Function>
+QFuture<typename QFuture<T>::template ResultType<Function>>
+QFuture<T>::then(QtFuture::Launch policy, Function &&function)
+{
+ QFutureInterface<ResultType<Function>> promise(QFutureInterfaceBase::State::Pending);
+ QtPrivate::Continuation<Function, ResultType<Function>, T>::create(
+ std::forward<Function>(function), this, promise, policy);
+ return promise.future();
+}
- bool isStarted() const { return d.isStarted(); }
- bool isFinished() const { return d.isFinished(); }
- bool isRunning() const { return d.isRunning(); }
+template<class T>
+template<class Function>
+QFuture<typename QFuture<T>::template ResultType<Function>> QFuture<T>::then(QThreadPool *pool,
+ Function &&function)
+{
+ QFutureInterface<ResultType<Function>> promise(QFutureInterfaceBase::State::Pending);
+ QtPrivate::Continuation<Function, ResultType<Function>, T>::create(
+ std::forward<Function>(function), this, promise, pool);
+ return promise.future();
+}
- int resultCount() const { return d.resultCount(); }
- int progressValue() const { return d.progressValue(); }
- int progressMinimum() const { return d.progressMinimum(); }
- int progressMaximum() const { return d.progressMaximum(); }
- QString progressText() const { return d.progressText(); }
- void waitForFinished() { d.waitForFinished(); }
+#ifndef QT_NO_EXCEPTIONS
-private:
- friend class QFutureWatcher<void>;
+template<class T>
+template<class Function, typename>
+QFuture<T> QFuture<T>::onFailed(Function &&handler)
+{
+ QFutureInterface<T> promise(QFutureInterfaceBase::State::Pending);
+ QtPrivate::FailureHandler<Function, T>::create(std::forward<Function>(handler), this, promise);
+ return promise.future();
+}
-#ifdef QFUTURE_TEST
-public:
#endif
- mutable QFutureInterfaceBase d;
-};
inline QFuture<void> QFutureInterface<void>::future()
{
@@ -292,6 +370,8 @@ QFuture<void> qToVoidFuture(const QFuture<T> &future)
return QFuture<void>(future.d);
}
+Q_DECLARE_SEQUENTIAL_ITERATOR(Future)
+
QT_END_NAMESPACE
#endif // QFUTURE_H
diff --git a/src/corelib/thread/qfuture.qdoc b/src/corelib/thread/qfuture.qdoc
index 076725e19c..6fb7ab032a 100644
--- a/src/corelib/thread/qfuture.qdoc
+++ b/src/corelib/thread/qfuture.qdoc
@@ -37,20 +37,45 @@
QFuture allows threads to be synchronized against one or more results
which will be ready at a later point in time. The result can be of any type
- that has a default constructor and a copy constructor. If a result is not
- available at the time of calling the result(), resultAt(), or results()
- functions, QFuture will wait until the result becomes available. You can
- use the isResultReadyAt() function to determine if a result is ready or
- not. For QFuture objects that report more than one result, the
- resultCount() function returns the number of continuous results. This
- means that it is always safe to iterate through the results from 0 to
- resultCount().
+ that has default, copy and possibly move constructors. If
+ a result is not available at the time of calling the result(), resultAt(),
+ results(), takeResult(), or takeResults() functions, QFuture
+ will wait until the result becomes available. You can use the isResultReadyAt()
+ function to determine if a result is ready or not. For QFuture objects that
+ report more than one result, the resultCount() function returns the number
+ of continuous results. This means that it is always safe to iterate through
+ the results from 0 to resultCount(). takeResult() and takeResults()
+ invalidate a future and any subsequent attempt to access result or results
+ from the future leads to undefined behavior. isValid() tells you if
+ results can be accessed.
QFuture provides a \l{Java-style iterators}{Java-style iterator}
(QFutureIterator) and an \l{STL-style iterators}{STL-style iterator}
- (QFuture::const_iterator). Using these iterators is another way to access
+ (QFuture::const_iterator). Using these iterators is another way to access
results in the future.
+ If the result of one asynchronous computation needs to be passed
+ to another, QFuture provides a convenient way of chaining multiple
+ sequential computations using then(). Additionally, onFailed() can be used
+ to handle any failures that occurred in the chain. Note that QFuture relies
+ on exceptions for the error handling. If using exceptions is not an option,
+ you can still indicate the error state of QFuture, by making the error type
+ part of the QFuture type. For example, you can use std::variant, std::any or
+ similar for keeping the result or failure or make your custom type.
+
+ The example below demonstrates how the error handling can be done without
+ using exceptions. Let's say we want to send a network request to obtain a large
+ file from a network location. Then we want to write it to the file system and
+ return its location in case of a success. Both of these operations may fail
+ with different errors. So, we use std::variant to keep the result
+ or error:
+
+ \snippet code/src_corelib_thread_qfuture.cpp 3
+
+ And we combine the two operations using then():
+
+ \snippet code/src_corelib_thread_qfuture.cpp 4
+
QFuture also offers ways to interact with a runnning computation. For
instance, the computation can be canceled with the cancel() function. To
pause the computation, use the setPaused() function or one of the pause(),
@@ -227,7 +252,7 @@
number of results stored might be different from this value, due to gaps
in the result set. It is always safe to iterate through the results from 0
to resultCount().
- \sa result(), resultAt(), results()
+ \sa result(), resultAt(), results(), takeResult(), takeResults()
*/
/*! \fn template <typename T> int QFuture<T>::progressValue() const
@@ -273,7 +298,10 @@
available, this function will block and wait for the result to become
available. This is a convenience method for calling resultAt(0).
- \sa resultAt(), results()
+ \note Calling result() leads to undefined behavior if isValid()
+ returns \c false for this QFuture.
+
+ \sa resultAt(), results(), takeResult(), takeResults()
*/
/*! \fn template <typename T> T QFuture<T>::resultAt(int index) const
@@ -282,7 +310,10 @@
immediately available, this function will block and wait for the result to
become available.
- \sa result(), results(), resultCount()
+ \note Calling resultAt() leads to undefined behavior if isValid()
+ returns \c false for this QFuture.
+
+ \sa result(), results(), takeResult(), takeResults(), resultCount()
*/
/*! \fn template <typename T> bool QFuture<T>::isResultReadyAt(int index) const
@@ -290,7 +321,10 @@
Returns \c true if the result at \a index is immediately available; otherwise
returns \c false.
- \sa resultAt(), resultCount()
+ \note Calling isResultReadyAt() leads to undefined behavior if isValid()
+ returns \c false for this QFuture.
+
+ \sa resultAt(), resultCount(), takeResult(), takeResults()
*/
/*! \fn template <typename T> QFuture<T>::operator T() const
@@ -300,15 +334,69 @@
available. This is a convenience method for calling result() or
resultAt(0).
- \sa result(), resultAt(), results()
+ \note Calling this function leads to undefined behavior if isValid()
+ returns \c false for this QFuture.
+
+ \sa result(), resultAt(), results(), takeResult(), takeResults(), isValid()
*/
/*! \fn template <typename T> QList<T> QFuture<T>::results() const
- Returns all results from the future. If the results are not immediately
- available, this function will block and wait for them to become available.
+ Returns all results from the future. If the results are not immediately available,
+ this function will block and wait for them to become available.
+
+ \note Calling results() leads to undefined behavior if isValid()
+ returns \c false for this QFuture.
+
+ \sa result(), resultAt(), takeResult(), takeResults(), resultCount(), isValid()
+*/
+
+/*! \fn template <typename T> std::vector<T> QFuture<T>::takeResults()
+
+ If isValid() returns \c false, calling this function leads to undefined behavior.
+ takeResults() takes all results from the QFuture object and invalidates it
+ (isValid() will return \c false for this future). If the results are
+ not immediately available, this function will block and wait for them to
+ become available. This function tries to use move semantics for the results
+ if available and falls back to copy construction if the type is not movable.
- \sa result(), resultAt(), resultCount()
+ \note QFuture in general allows sharing the results between different QFuture
+ objects (and potentially between different threads). takeResults() was introduced
+ to make QFuture also work with move-only types (like std::unique_ptr), so it
+ assumes that only one thread can move the results out of the future, and only
+ once.
+
+ \sa takeResult(), result(), resultAt(), results(), resultCount(), isValid()
+*/
+
+/*! \fn template <typename T> std::vector<T> QFuture<T>::takeResult()
+
+ Call this function only if isValid() returns \c true, otherwise
+ the behavior is undefined. This function takes the first result from
+ the QFuture object, for convenience when only one result is expected.
+ If there are any other results, they are discarded after taking the
+ first one (if such behavior is undesired, use takeResults() instead).
+ If the result is not immediately available, this function will block and
+ wait for the result to become available. The QFuture will try to use move
+ semantics if possible, and will fall back to copy construction if the type
+ is not movable. After the result was taken, isValid() will evaluate
+ as \c false.
+
+ \note QFuture in general allows sharing the results between different QFuture
+ objects (and potentially between different threads). takeResult() was introduced
+ to make QFuture also work with move-only types (like std::unique_ptr), so it
+ assumes that only one thread can move the results out of the future, and
+ do it only once.
+
+ \sa takeResults(), result(), results(), resultAt(), isValid()
+*/
+
+/*! \fn template <typename T> bool QFuture<T>::isValid() const
+
+ Returns \c true if a result or results can be accessed or taken from this
+ QFuture object. Returns false after the result was taken from the future.
+
+ \sa takeResults(), takeResult(), result(), results(), resultAt()
*/
/*! \fn template <typename T> QFuture<T>::const_iterator QFuture<T>::begin() const
@@ -682,3 +770,160 @@
\sa findNext()
*/
+
+/*!
+ \namespace QtFuture
+
+ \inmodule QtCore
+ \brief Contains miscellaneous identifiers used by the QFuture class.
+*/
+
+
+/*!
+ \enum QtFuture::Launch
+
+ \since 6.0
+
+ Represents execution policies for running a QFuture continuation.
+
+ \value Sync The continuation will be launched in the same thread in
+ which the parent has been executing.
+
+ \value Async The continuation will be launched in in a separate thread taken from
+ the global QThreadPool.
+
+ \value Inherit The continuation will inherit the launch policy of the parent or its
+ thread pool, if it was using a custom one.
+
+ \sa QFuture::then(), QThreadPool::globalInstance()
+
+*/
+
+/*! \fn template<class T> template<class Function> QFuture<typename QFuture<T>::ResultType<Function>> QFuture<T>::then(Function &&function)
+
+ \since 6.0
+ \overload
+
+ Attaches a continuation to this future, allowing to chain multiple asynchronous
+ computations if desired. When the asynchronous computation represented by this
+ future finishes, \a function will be invoked in the same thread in which this
+ future has been running. A new QFuture representing the result of the continuation
+ is returned.
+
+ \note Use other overloads of this method if you need to launch the continuation in
+ a separate thread.
+
+ If this future has a result (is not a QFuture<void>), \a function takes the result
+ of this future as its argument.
+
+ You can chain multiple operations like this:
+
+ \code
+ QFuture<int> future = ...;
+ future.then([](int res1){ ... }).then([](int res2){ ... })...
+ \endcode
+
+ Or:
+ \code
+ QFuture<void> future = ...;
+ future.then([](){ ... }).then([](){ ... })...
+ \endcode
+
+ The continuation can also take a QFuture argument (instead of its value), representing
+ the previous future. This can be useful if, for example, QFuture has multiple results,
+ and the user wants to access them inside the continuation. Or the user needs to handle
+ the exception of the previous future inside the continuation, to not interrupt the chain
+ of multiple continuations. For example:
+
+ \snippet code/src_corelib_thread_qfuture.cpp 5
+
+ If the previous future throws an exception and it is not handled inside the
+ continuation, the exception will be propagated to the continuation future, to
+ allow the caller to handle it:
+
+ \snippet code/src_corelib_thread_qfuture.cpp 6
+
+ In this case the whole chain of continuations will be interrupted.
+
+ \note If the parent future gets canceled, its continuations will
+ also be canceled.
+
+ \sa onFailed()
+*/
+
+/*! \fn template<class T> template<class Function> QFuture<typename QFuture<T>::ResultType<Function>> QFuture<T>::then(QtFuture::Launch policy, Function &&function)
+
+ \since 6.0
+ \overload
+
+ Attaches a continuation to this future, allowing to chain multiple asynchronous
+ computations. When the asynchronous computation represented by this future
+ finishes, \a function will be invoked according to the given launch \a policy.
+ A new QFuture representing the result of the continuation is returned.
+
+ Depending on the \a policy, continuation will run in the same thread as the parent,
+ run in a new thread, or inherit the launch policy and thread pool of the parent.
+
+ In the following example both continuations will run in a new thread (but in
+ the same one).
+
+ \code
+ QFuture<int> future = ...;
+ future.then(QtFuture::Launch::Async, [](int res){ ... }).then([](int res2){ ... });
+ \endcode
+
+ In the following example both continuations will run in new threads using the same
+ thread pool.
+
+ \code
+ QFuture<int> future = ...;
+ future.then(QtFuture::Launch::Async, [](int res){ ... })
+ .then(QtFuture::Launch::Inherit, [](int res2){ ... });
+ \endcode
+
+ \sa onFailed()
+*/
+
+/*! \fn template<class T> template<class Function> QFuture<typename QFuture<T>::ResultType<Function>> QFuture<T>::then(QThreadPool *pool, Function &&function)
+
+ \since 6.0
+ \overload
+
+ Attaches a continuation to this future, allowing to chain multiple asynchronous
+ computations if desired. When the asynchronous computation represented by this
+ future finishes, \a function will be invoked in a separate thread taken from the
+ QThreadPool \a pool.
+
+ \sa onFailed()
+*/
+
+/*! \fn template<class T> template<class Function> QFuture<T> QFuture<T>::onFailed(Function &&handler)
+
+ \since 6.0
+
+ Attaches a failure handler to this future, to handle any exceptions that may
+ have been generated. Returns a QFuture of the parent type. The handler will
+ be invoked only in case of an exception, in the same thread as the parent
+ future has been running. \a handler is a callable which takes either no argument
+ or one argument, to filter by specific error types similar to
+ \l {https://en.cppreference.com/w/cpp/language/try_catch} {catch} statement.
+
+ For example:
+
+ \snippet code/src_corelib_thread_qfuture.cpp 7
+
+ If there are multiple handlers attached, the first handler that matches with the
+ thrown exception type will be invoked. For example:
+
+ \snippet code/src_corelib_thread_qfuture.cpp 8
+
+ If none of the handlers matches with the thrown exception type, the exception
+ will be propagated to the resulted future:
+
+ \snippet code/src_corelib_thread_qfuture.cpp 9
+
+ \note You can always attach a handler taking no argument, to handle all exception
+ types and avoid writing the try-catch block.
+
+ \sa then()
+*/
diff --git a/src/corelib/thread/qfuture_impl.h b/src/corelib/thread/qfuture_impl.h
new file mode 100644
index 0000000000..5a4ffce1c7
--- /dev/null
+++ b/src/corelib/thread/qfuture_impl.h
@@ -0,0 +1,567 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QFUTURE_H
+#error Do not include qfuture_impl.h directly
+#endif
+
+#if 0
+#pragma qt_sync_skip_header_check
+#pragma qt_sync_stop_processing
+#endif
+
+#include <QtCore/qglobal.h>
+#include <QtCore/qfutureinterface.h>
+#include <QtCore/qthreadpool.h>
+
+QT_BEGIN_NAMESPACE
+
+//
+// forward declarations
+//
+template<class T>
+class QFuture;
+template<class T>
+class QFutureInterface;
+
+namespace QtFuture {
+enum class Launch { Sync, Async, Inherit };
+}
+
+namespace QtPrivate {
+
+template<class T>
+using EnableForVoid = std::enable_if_t<std::is_same_v<T, void>>;
+
+template<class T>
+using EnableForNonVoid = std::enable_if_t<!std::is_same_v<T, void>>;
+
+template<typename F, typename Arg, typename Enable = void>
+struct ResultTypeHelper
+{
+};
+
+// The callable takes an argument of type Arg
+template<typename F, typename Arg>
+struct ResultTypeHelper<
+ F, Arg, typename std::enable_if_t<!std::is_invocable_v<std::decay_t<F>, QFuture<Arg>>>>
+{
+ using ResultType = std::invoke_result_t<std::decay_t<F>, std::decay_t<Arg>>;
+};
+
+// The callable takes an argument of type QFuture<Arg>
+template<class F, class Arg>
+struct ResultTypeHelper<
+ F, Arg, typename std::enable_if_t<std::is_invocable_v<std::decay_t<F>, QFuture<Arg>>>>
+{
+ using ResultType = std::invoke_result_t<std::decay_t<F>, QFuture<Arg>>;
+};
+
+// The callable takes an argument of type QFuture<void>
+template<class F>
+struct ResultTypeHelper<
+ F, void, typename std::enable_if_t<std::is_invocable_v<std::decay_t<F>, QFuture<void>>>>
+{
+ using ResultType = std::invoke_result_t<std::decay_t<F>, QFuture<void>>;
+};
+
+// The callable doesn't take argument
+template<class F>
+struct ResultTypeHelper<
+ F, void, typename std::enable_if_t<!std::is_invocable_v<std::decay_t<F>, QFuture<void>>>>
+{
+ using ResultType = std::invoke_result_t<std::decay_t<F>>;
+};
+
+// Helpers to resolve argument types of callables.
+template<typename...>
+struct ArgsType;
+
+template<typename Arg, typename... Args>
+struct ArgsType<Arg, Args...>
+{
+ using First = Arg;
+ static const bool HasExtraArgs = (sizeof...(Args) > 0);
+};
+
+template<>
+struct ArgsType<>
+{
+ using First = void;
+ static const bool HasExtraArgs = false;
+};
+
+template<typename F>
+struct ArgResolver : ArgResolver<decltype(&std::decay_t<F>::operator())>
+{
+};
+
+template<typename R, typename... Args>
+struct ArgResolver<R(Args...)> : public ArgsType<Args...>
+{
+};
+
+template<typename R, typename... Args>
+struct ArgResolver<R (*)(Args...)> : public ArgsType<Args...>
+{
+};
+
+template<typename R, typename... Args>
+struct ArgResolver<R (&)(Args...)> : public ArgsType<Args...>
+{
+};
+
+template<typename Class, typename R, typename... Args>
+struct ArgResolver<R (Class::*)(Args...)> : public ArgsType<Args...>
+{
+};
+
+template<typename Class, typename R, typename... Args>
+struct ArgResolver<R (Class::*)(Args...) noexcept> : public ArgsType<Args...>
+{
+};
+
+template<typename Class, typename R, typename... Args>
+struct ArgResolver<R (Class::*)(Args...) const> : public ArgsType<Args...>
+{
+};
+
+template<typename Class, typename R, typename... Args>
+struct ArgResolver<R (Class::*)(Args...) const noexcept> : public ArgsType<Args...>
+{
+};
+
+template<typename Function, typename ResultType, typename ParentResultType>
+class Continuation
+{
+public:
+ Continuation(Function &&func, const QFuture<ParentResultType> &f,
+ const QFutureInterface<ResultType> &p)
+ : promise(p), parentFuture(f), function(std::forward<Function>(func))
+ {
+ }
+ virtual ~Continuation() = default;
+
+ bool execute();
+
+ static void create(Function &&func, QFuture<ParentResultType> *f,
+ QFutureInterface<ResultType> &p, QtFuture::Launch policy);
+
+ static void create(Function &&func, QFuture<ParentResultType> *f,
+ QFutureInterface<ResultType> &p, QThreadPool *pool);
+
+private:
+ void fulfillPromiseWithResult();
+ void fulfillVoidPromise();
+ void fulfillPromiseWithVoidResult();
+
+ template<class... Args>
+ void fulfillPromise(Args &&... args);
+
+protected:
+ virtual void runImpl() = 0;
+
+ void runFunction();
+
+protected:
+ QFutureInterface<ResultType> promise;
+ QFuture<ParentResultType> parentFuture;
+ Function function;
+};
+
+template<typename Function, typename ResultType, typename ParentResultType>
+class SyncContinuation final : public Continuation<Function, ResultType, ParentResultType>
+{
+public:
+ SyncContinuation(Function &&func, const QFuture<ParentResultType> &f,
+ const QFutureInterface<ResultType> &p)
+ : Continuation<Function, ResultType, ParentResultType>(std::forward<Function>(func), f, p)
+ {
+ }
+
+ ~SyncContinuation() override = default;
+
+private:
+ void runImpl() override { this->runFunction(); }
+};
+
+template<typename Function, typename ResultType, typename ParentResultType>
+class AsyncContinuation final : public QRunnable,
+ public Continuation<Function, ResultType, ParentResultType>
+{
+public:
+ AsyncContinuation(Function &&func, const QFuture<ParentResultType> &f,
+ const QFutureInterface<ResultType> &p, QThreadPool *pool = nullptr)
+ : Continuation<Function, ResultType, ParentResultType>(std::forward<Function>(func), f, p),
+ threadPool(pool)
+ {
+ this->promise.setRunnable(this);
+ }
+
+ ~AsyncContinuation() override = default;
+
+private:
+ void runImpl() override // from Continuation
+ {
+ QThreadPool *pool = threadPool ? threadPool : QThreadPool::globalInstance();
+ pool->start(this);
+ }
+
+ void run() override // from QRunnable
+ {
+ this->runFunction();
+ }
+
+private:
+ QThreadPool *threadPool;
+};
+
+#ifndef QT_NO_EXCEPTIONS
+
+template<class Function, class ResultType>
+class FailureHandler
+{
+public:
+ static void create(Function &&function, QFuture<ResultType> *future,
+ const QFutureInterface<ResultType> &promise);
+
+ FailureHandler(Function &&func, const QFuture<ResultType> &f,
+ const QFutureInterface<ResultType> &p)
+ : promise(p), parentFuture(f), handler(std::forward<Function>(func))
+ {
+ }
+
+public:
+ void run();
+
+private:
+ template<class ArgType>
+ void handleException();
+ void handleAllExceptions();
+
+private:
+ QFutureInterface<ResultType> promise;
+ QFuture<ResultType> parentFuture;
+ Function handler;
+};
+
+#endif
+
+template<typename Function, typename ResultType, typename ParentResultType>
+void Continuation<Function, ResultType, ParentResultType>::runFunction()
+{
+ promise.reportStarted();
+
+ Q_ASSERT(parentFuture.isFinished());
+
+#ifndef QT_NO_EXCEPTIONS
+ try {
+#endif
+ if constexpr (!std::is_void_v<ResultType>) {
+ if constexpr (std::is_void_v<ParentResultType>) {
+ fulfillPromiseWithVoidResult();
+ } else if constexpr (std::is_invocable_v<Function, ParentResultType>) {
+ fulfillPromiseWithResult();
+ } else {
+ // This assert normally should never fail, this is to make sure
+ // that nothing unexpected happend.
+ static_assert(std::is_invocable_v<Function, QFuture<ParentResultType>>,
+ "The continuation is not invocable with the provided arguments");
+ fulfillPromise(parentFuture);
+ }
+ } else {
+ if constexpr (std::is_void_v<ParentResultType>) {
+ if constexpr (std::is_invocable_v<Function, QFuture<void>>)
+ function(parentFuture);
+ else
+ function();
+ } else if constexpr (std::is_invocable_v<Function, ParentResultType>) {
+ fulfillVoidPromise();
+ } else {
+ // This assert normally should never fail, this is to make sure
+ // that nothing unexpected happend.
+ static_assert(std::is_invocable_v<Function, QFuture<ParentResultType>>,
+ "The continuation is not invocable with the provided arguments");
+ function(parentFuture);
+ }
+ }
+#ifndef QT_NO_EXCEPTIONS
+ } catch (...) {
+ promise.reportException(std::current_exception());
+ }
+#endif
+ promise.reportFinished();
+}
+
+template<typename Function, typename ResultType, typename ParentResultType>
+bool Continuation<Function, ResultType, ParentResultType>::execute()
+{
+ Q_ASSERT(parentFuture.isFinished());
+
+ if (parentFuture.isCanceled()) {
+#ifndef QT_NO_EXCEPTIONS
+ if (parentFuture.d.exceptionStore().hasException()) {
+ // If the continuation doesn't take a QFuture argument, propagate the exception
+ // to the caller, by reporting it. If the continuation takes a QFuture argument,
+ // the user may want to catch the exception inside the continuation, to not
+ // interrupt the continuation chain, so don't report anything yet.
+ if constexpr (!std::is_invocable_v<std::decay_t<Function>, QFuture<ParentResultType>>) {
+ promise.reportStarted();
+ promise.reportException(parentFuture.d.exceptionStore().exception());
+ promise.reportFinished();
+ return false;
+ }
+ } else
+#endif
+ {
+ promise.reportStarted();
+ promise.reportCanceled();
+ promise.reportFinished();
+ return false;
+ }
+ }
+
+ runImpl();
+ return true;
+}
+
+template<typename Function, typename ResultType, typename ParentResultType>
+void Continuation<Function, ResultType, ParentResultType>::create(Function &&func,
+ QFuture<ParentResultType> *f,
+ QFutureInterface<ResultType> &p,
+ QtFuture::Launch policy)
+{
+ Q_ASSERT(f);
+
+ QThreadPool *pool = nullptr;
+
+ bool launchAsync = (policy == QtFuture::Launch::Async);
+ if (policy == QtFuture::Launch::Inherit) {
+ launchAsync = f->d.launchAsync();
+
+ // If the parent future was using a custom thread pool, inherit it as well.
+ if (launchAsync && f->d.threadPool()) {
+ pool = f->d.threadPool();
+ p.setThreadPool(pool);
+ }
+ }
+
+ Continuation<Function, ResultType, ParentResultType> *continuationJob = nullptr;
+ if (launchAsync) {
+ continuationJob = new AsyncContinuation<Function, ResultType, ParentResultType>(
+ std::forward<Function>(func), *f, p, pool);
+ } else {
+ continuationJob = new SyncContinuation<Function, ResultType, ParentResultType>(
+ std::forward<Function>(func), *f, p);
+ }
+
+ p.setLaunchAsync(launchAsync);
+
+ auto continuation = [continuationJob, launchAsync]() mutable {
+ bool isLaunched = continuationJob->execute();
+ // If continuation is successfully launched, AsyncContinuation will be deleted
+ // by the QThreadPool which has started it. Synchronous continuation will be
+ // executed immediately, so it's safe to always delete it here.
+ if (!(launchAsync && isLaunched)) {
+ delete continuationJob;
+ continuationJob = nullptr;
+ }
+ };
+
+ f->d.setContinuation(std::move(continuation));
+}
+
+template<typename Function, typename ResultType, typename ParentResultType>
+void Continuation<Function, ResultType, ParentResultType>::create(Function &&func,
+ QFuture<ParentResultType> *f,
+ QFutureInterface<ResultType> &p,
+ QThreadPool *pool)
+{
+ Q_ASSERT(f);
+
+ auto continuationJob = new AsyncContinuation<Function, ResultType, ParentResultType>(
+ std::forward<Function>(func), *f, p, pool);
+ p.setLaunchAsync(true);
+ p.setThreadPool(pool);
+
+ auto continuation = [continuationJob]() mutable {
+ bool isLaunched = continuationJob->execute();
+ // If continuation is successfully launched, AsyncContinuation will be deleted
+ // by the QThreadPool which has started it.
+ if (!isLaunched) {
+ delete continuationJob;
+ continuationJob = nullptr;
+ }
+ };
+
+ f->d.setContinuation(continuation);
+}
+
+template<typename Function, typename ResultType, typename ParentResultType>
+void Continuation<Function, ResultType, ParentResultType>::fulfillPromiseWithResult()
+{
+ if constexpr (std::is_copy_constructible_v<ParentResultType>)
+ fulfillPromise(parentFuture.result());
+ else
+ fulfillPromise(parentFuture.takeResult());
+}
+
+template<typename Function, typename ResultType, typename ParentResultType>
+void Continuation<Function, ResultType, ParentResultType>::fulfillVoidPromise()
+{
+ if constexpr (std::is_copy_constructible_v<ParentResultType>)
+ function(parentFuture.result());
+ else
+ function(parentFuture.takeResult());
+}
+
+template<typename Function, typename ResultType, typename ParentResultType>
+void Continuation<Function, ResultType, ParentResultType>::fulfillPromiseWithVoidResult()
+{
+ if constexpr (std::is_invocable_v<Function, QFuture<void>>)
+ fulfillPromise(parentFuture);
+ else
+ fulfillPromise();
+}
+
+template<typename Function, typename ResultType, typename ParentResultType>
+template<class... Args>
+void Continuation<Function, ResultType, ParentResultType>::fulfillPromise(Args &&... args)
+{
+ if constexpr (std::is_copy_constructible_v<ResultType>)
+ promise.reportResult(std::invoke(function, std::forward<Args>(args)...));
+ else
+ promise.reportAndMoveResult(std::invoke(function, std::forward<Args>(args)...));
+}
+
+#ifndef QT_NO_EXCEPTIONS
+
+template<class Function, class ResultType>
+void FailureHandler<Function, ResultType>::create(Function &&function, QFuture<ResultType> *future,
+ const QFutureInterface<ResultType> &promise)
+{
+ Q_ASSERT(future);
+
+ FailureHandler<Function, ResultType> *failureHandler = new FailureHandler<Function, ResultType>(
+ std::forward<Function>(function), *future, promise);
+
+ auto failureContinuation = [failureHandler]() mutable {
+ failureHandler->run();
+ delete failureHandler;
+ };
+
+ future->d.setContinuation(std::move(failureContinuation));
+}
+
+template<class Function, class ResultType>
+void FailureHandler<Function, ResultType>::run()
+{
+ Q_ASSERT(parentFuture.isFinished());
+
+ promise.reportStarted();
+
+ if (parentFuture.d.exceptionStore().hasException()) {
+ using ArgType = typename QtPrivate::ArgResolver<Function>::First;
+ if constexpr (std::is_void_v<ArgType>) {
+ handleAllExceptions();
+ } else {
+ handleException<ArgType>();
+ }
+ } else {
+ if constexpr (!std::is_void_v<ResultType>) {
+ if constexpr (std::is_copy_constructible_v<ResultType>)
+ promise.reportResult(parentFuture.result());
+ else
+ promise.reportAndMoveResult(parentFuture.takeResult());
+ }
+ }
+ promise.reportFinished();
+}
+
+template<class Function, class ResultType>
+template<class ArgType>
+void FailureHandler<Function, ResultType>::handleException()
+{
+ try {
+ parentFuture.d.exceptionStore().throwPossibleException();
+ } catch (const ArgType &e) {
+ try {
+ // Handle exceptions matching with the handler's argument type
+ if constexpr (std::is_void_v<ResultType>) {
+ handler(e);
+ } else {
+ if constexpr (std::is_copy_constructible_v<ResultType>)
+ promise.reportResult(handler(e));
+ else
+ promise.reportAndMoveResult(handler(e));
+ }
+ } catch (...) {
+ promise.reportException(std::current_exception());
+ }
+ } catch (...) {
+ // Exception doesn't match with handler's argument type, propagate
+ // the exception to be handled later.
+ promise.reportException(std::current_exception());
+ }
+}
+
+template<class Function, class ResultType>
+void FailureHandler<Function, ResultType>::handleAllExceptions()
+{
+ try {
+ parentFuture.d.exceptionStore().throwPossibleException();
+ } catch (...) {
+ try {
+ if constexpr (std::is_void_v<ResultType>)
+ handler();
+ else if constexpr (std::is_copy_constructible_v<ResultType>)
+ promise.reportResult(handler());
+ else
+ promise.reportAndMoveResult(handler());
+ } catch (...) {
+ promise.reportException(std::current_exception());
+ }
+ }
+}
+
+#endif // QT_NO_EXCEPTIONS
+
+} // namespace QtPrivate
+
+QT_END_NAMESPACE
diff --git a/src/corelib/thread/qfutureinterface.cpp b/src/corelib/thread/qfutureinterface.cpp
index f1fd40e7b6..92b2df7c15 100644
--- a/src/corelib/thread/qfutureinterface.cpp
+++ b/src/corelib/thread/qfutureinterface.cpp
@@ -114,6 +114,7 @@ void QFutureInterfaceBase::cancel()
d->waitCondition.wakeAll();
d->pausedWaitCondition.wakeAll();
d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Canceled));
+ d->isValid = false;
}
void QFutureInterfaceBase::setPaused(bool paused)
@@ -191,6 +192,17 @@ bool QFutureInterfaceBase::isResultReadyAt(int index) const
return d->internal_isResultReadyAt(index);
}
+bool QFutureInterfaceBase::isValid() const
+{
+ const QMutexLocker lock(&d->m_mutex);
+ return d->isValid;
+}
+
+bool QFutureInterfaceBase::isRunningOrPending() const
+{
+ return queryState(static_cast<State>(Running | Pending));
+}
+
bool QFutureInterfaceBase::waitForNextResult()
{
QMutexLocker lock(&d->m_mutex);
@@ -258,9 +270,9 @@ void QFutureInterfaceBase::reportStarted()
QMutexLocker locker(&d->m_mutex);
if (d->state.loadRelaxed() & (Started|Canceled|Finished))
return;
-
d->setState(State(Started | Running));
d->sendCallOut(QFutureCallOutEvent(QFutureCallOutEvent::Started));
+ d->isValid = true;
}
void QFutureInterfaceBase::reportCanceled()
@@ -271,6 +283,15 @@ void QFutureInterfaceBase::reportCanceled()
#ifndef QT_NO_EXCEPTIONS
void QFutureInterfaceBase::reportException(const QException &exception)
{
+ try {
+ exception.raise();
+ } catch (...) {
+ reportException(std::current_exception());
+ }
+}
+
+void QFutureInterfaceBase::reportException(std::exception_ptr exception)
+{
QMutexLocker locker(&d->m_mutex);
if (d->state.loadRelaxed() & (Canceled|Finished))
return;
@@ -315,7 +336,7 @@ void QFutureInterfaceBase::waitForResult(int resultIndex)
d->m_exceptionStore.throwPossibleException();
QMutexLocker lock(&d->m_mutex);
- if (!isRunning())
+ if (!isRunningOrPending())
return;
lock.unlock();
@@ -326,7 +347,7 @@ void QFutureInterfaceBase::waitForResult(int resultIndex)
lock.relock();
const int waitIndex = (resultIndex == -1) ? INT_MAX : resultIndex;
- while (isRunning() && !d->internal_isResultReadyAt(waitIndex))
+ while (isRunningOrPending() && !d->internal_isResultReadyAt(waitIndex))
d->waitCondition.wait(&d->m_mutex);
d->m_exceptionStore.throwPossibleException();
@@ -335,7 +356,7 @@ void QFutureInterfaceBase::waitForResult(int resultIndex)
void QFutureInterfaceBase::waitForFinished()
{
QMutexLocker lock(&d->m_mutex);
- const bool alreadyFinished = !isRunning();
+ const bool alreadyFinished = !isRunningOrPending();
lock.unlock();
if (!alreadyFinished) {
@@ -343,7 +364,7 @@ void QFutureInterfaceBase::waitForFinished()
lock.relock();
- while (isRunning())
+ while (isRunningOrPending())
d->waitCondition.wait(&d->m_mutex);
}
@@ -386,6 +407,11 @@ void QFutureInterfaceBase::setThreadPool(QThreadPool *pool)
d->m_pool = pool;
}
+QThreadPool *QFutureInterfaceBase::threadPool() const
+{
+ return d->m_pool;
+}
+
void QFutureInterfaceBase::setFilterMode(bool enable)
{
QMutexLocker locker(&d->m_mutex);
@@ -424,12 +450,7 @@ void QFutureInterfaceBase::setProgressValueAndText(int progressValue,
}
}
-QMutex *QFutureInterfaceBase::mutex() const
-{
- return &d->m_mutex;
-}
-
-QMutex &QFutureInterfaceBase::mutex(int) const
+QMutex &QFutureInterfaceBase::mutex() const
{
return d->m_mutex;
}
@@ -468,6 +489,16 @@ bool QFutureInterfaceBase::derefT() const
return d->refCount.derefT();
}
+void QFutureInterfaceBase::reset()
+{
+ d->m_progressValue = 0;
+ d->m_progressMinimum = 0;
+ d->m_progressMaximum = 0;
+ d->setState(QFutureInterfaceBase::NoState);
+ d->progressTime.invalidate();
+ d->isValid = false;
+}
+
QFutureInterfaceBasePrivate::QFutureInterfaceBasePrivate(QFutureInterfaceBase::State initialState)
: refCount(1), m_progressValue(0), m_progressMinimum(0), m_progressMaximum(0),
state(initialState),
@@ -609,4 +640,36 @@ void QFutureInterfaceBasePrivate::setState(QFutureInterfaceBase::State newState)
state.storeRelaxed(newState);
}
+void QFutureInterfaceBase::setContinuation(std::function<void()> func)
+{
+ QMutexLocker lock(&d->continuationMutex);
+ // If the state is ready, run continuation immediately,
+ // otherwise save it for later.
+ if (isFinished()) {
+ lock.unlock();
+ func();
+ } else {
+ d->continuation = std::move(func);
+ }
+}
+
+void QFutureInterfaceBase::runContinuation() const
+{
+ QMutexLocker lock(&d->continuationMutex);
+ if (d->continuation) {
+ lock.unlock();
+ d->continuation();
+ }
+}
+
+void QFutureInterfaceBase::setLaunchAsync(bool value)
+{
+ d->launchAsync = value;
+}
+
+bool QFutureInterfaceBase::launchAsync() const
+{
+ return d->launchAsync;
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qfutureinterface.h b/src/corelib/thread/qfutureinterface.h
index bcdae24833..04828609ba 100644
--- a/src/corelib/thread/qfutureinterface.h
+++ b/src/corelib/thread/qfutureinterface.h
@@ -45,6 +45,8 @@
#include <QtCore/qexception.h>
#include <QtCore/qresultstore.h>
+#include <utility>
+#include <vector>
#include <mutex>
QT_REQUIRE_CONFIG(future);
@@ -58,6 +60,16 @@ class QFutureInterfaceBasePrivate;
class QFutureWatcherBase;
class QFutureWatcherBasePrivate;
+namespace QtPrivate {
+template<typename Function, typename ResultType, typename ParentResultType>
+class Continuation;
+
+#ifndef QT_NO_EXCEPTIONS
+template<class Function, class ResultType>
+class FailureHandler;
+#endif
+}
+
class Q_CORE_EXPORT QFutureInterfaceBase
{
public:
@@ -68,7 +80,9 @@ public:
Finished = 0x04,
Canceled = 0x08,
Paused = 0x10,
- Throttled = 0x20
+ Throttled = 0x20,
+ // Pending means that the future depends on another one, which is not finished yet
+ Pending = 0x40
};
QFutureInterfaceBase(State initialState = NoState);
@@ -81,11 +95,13 @@ public:
void reportCanceled();
#ifndef QT_NO_EXCEPTIONS
void reportException(const QException &e);
+ void reportException(std::exception_ptr e);
#endif
void reportResultsReady(int beginIndex, int endIndex);
void setRunnable(QRunnable *runnable);
void setThreadPool(QThreadPool *pool);
+ QThreadPool *threadPool() const;
void setFilterMode(bool enable);
void setProgressRange(int minimum, int maximum);
int progressMinimum() const;
@@ -108,6 +124,7 @@ public:
bool isPaused() const;
bool isThrottled() const;
bool isResultReadyAt(int index) const;
+ bool isValid() const;
void cancel();
void setPaused(bool paused);
@@ -119,8 +136,7 @@ public:
void waitForResult(int resultIndex);
void waitForResume();
- QMutex *mutex() const;
- QMutex &mutex(int) const;
+ QMutex &mutex() const;
QtPrivate::ExceptionStore &exceptionStore();
QtPrivate::ResultStoreBase &resultStoreBase();
const QtPrivate::ResultStoreBase &resultStoreBase() const;
@@ -132,6 +148,7 @@ public:
protected:
bool refT() const;
bool derefT() const;
+ void reset();
public:
#ifndef QFUTURE_TEST
@@ -142,6 +159,23 @@ private:
private:
friend class QFutureWatcherBase;
friend class QFutureWatcherBasePrivate;
+
+ template<typename Function, typename ResultType, typename ParentResultType>
+ friend class QtPrivate::Continuation;
+
+#ifndef QT_NO_EXCEPTIONS
+ template<class Function, class ResultType>
+ friend class QtPrivate::FailureHandler;
+#endif
+
+protected:
+ void setContinuation(std::function<void()> func);
+ void runContinuation() const;
+
+ void setLaunchAsync(bool value);
+ bool launchAsync() const;
+
+ bool isRunningOrPending() const;
};
template <typename T>
@@ -179,19 +213,28 @@ public:
inline QFuture<T> future(); // implemented in qfuture.h
inline void reportResult(const T *result, int index = -1);
+ inline void reportAndMoveResult(T &&result, int index = -1);
inline void reportResult(const T &result, int index = -1);
inline void reportResults(const QVector<T> &results, int beginIndex = -1, int count = -1);
- inline void reportFinished(const T *result = nullptr);
+ inline void reportFinished(const T *result);
+ void reportFinished()
+ {
+ QFutureInterfaceBase::reportFinished();
+ QFutureInterfaceBase::runContinuation();
+ }
inline const T &resultReference(int index) const;
inline const T *resultPointer(int index) const;
inline QList<T> results();
+
+ T takeResult();
+ std::vector<T> takeResults();
};
template <typename T>
inline void QFutureInterface<T>::reportResult(const T *result, int index)
{
- std::lock_guard<QMutex> locker(mutex(0));
+ std::lock_guard<QMutex> locker{mutex()};
if (this->queryState(Canceled) || this->queryState(Finished)) {
return;
}
@@ -201,13 +244,28 @@ inline void QFutureInterface<T>::reportResult(const T *result, int index)
if (store.filterMode()) {
const int resultCountBefore = store.count();
store.addResult<T>(index, result);
- this->reportResultsReady(resultCountBefore, resultCountBefore + store.count());
+ this->reportResultsReady(resultCountBefore, store.count());
} else {
const int insertIndex = store.addResult<T>(index, result);
this->reportResultsReady(insertIndex, insertIndex + 1);
}
}
+template<typename T>
+void QFutureInterface<T>::reportAndMoveResult(T &&result, int index)
+{
+ std::lock_guard<QMutex> locker{mutex()};
+ if (queryState(Canceled) || queryState(Finished))
+ return;
+
+ QtPrivate::ResultStoreBase &store = resultStoreBase();
+
+ const int oldResultCount = store.count();
+ const int insertIndex = store.moveResult(index, std::forward<T>(result));
+ if (!store.filterMode() || oldResultCount < store.count()) // Let's make sure it's not in pending results.
+ reportResultsReady(insertIndex, store.count());
+}
+
template <typename T>
inline void QFutureInterface<T>::reportResult(const T &result, int index)
{
@@ -217,7 +275,7 @@ inline void QFutureInterface<T>::reportResult(const T &result, int index)
template <typename T>
inline void QFutureInterface<T>::reportResults(const QVector<T> &_results, int beginIndex, int count)
{
- std::lock_guard<QMutex> locker(mutex(0));
+ std::lock_guard<QMutex> locker{mutex()};
if (this->queryState(Canceled) || this->queryState(Finished)) {
return;
}
@@ -239,20 +297,20 @@ inline void QFutureInterface<T>::reportFinished(const T *result)
{
if (result)
reportResult(result);
- QFutureInterfaceBase::reportFinished();
+ reportFinished();
}
template <typename T>
inline const T &QFutureInterface<T>::resultReference(int index) const
{
- std::lock_guard<QMutex> locker(mutex(0));
+ std::lock_guard<QMutex> locker{mutex()};
return resultStoreBase().resultAt(index).template value<T>();
}
template <typename T>
inline const T *QFutureInterface<T>::resultPointer(int index) const
{
- std::lock_guard<QMutex> locker(mutex(0));
+ std::lock_guard<QMutex> locker{mutex()};
return resultStoreBase().resultAt(index).template pointer<T>();
}
@@ -263,10 +321,11 @@ inline QList<T> QFutureInterface<T>::results()
exceptionStore().throwPossibleException();
return QList<T>();
}
+
QFutureInterfaceBase::waitForResult(-1);
QList<T> res;
- std::lock_guard<QMutex> locker(mutex(0));
+ std::lock_guard<QMutex> locker{mutex()};
QtPrivate::ResultIteratorBase it = resultStoreBase().begin();
while (it != resultStoreBase().end()) {
@@ -277,6 +336,56 @@ inline QList<T> QFutureInterface<T>::results()
return res;
}
+template<typename T>
+T QFutureInterface<T>::takeResult()
+{
+ if (isCanceled()) {
+ exceptionStore().throwPossibleException();
+ return {};
+ }
+
+ if (!isValid())
+ return {};
+ // Note: we wait for all, this is intentional,
+ // not to mess with other unready results.
+ waitForResult(-1);
+
+ const std::lock_guard<QMutex> locker{mutex()};
+ QtPrivate::ResultIteratorBase position = resultStoreBase().resultAt(0);
+ T ret(std::move_if_noexcept(position.value<T>()));
+ reset();
+ resultStoreBase().template clear<T>();
+
+ return ret;
+}
+
+template<typename T>
+std::vector<T> QFutureInterface<T>::takeResults()
+{
+ if (isCanceled()) {
+ exceptionStore().throwPossibleException();
+ return {};
+ }
+
+ if (!isValid())
+ return {};
+
+ waitForResult(-1);
+ std::vector<T> res;
+ res.reserve(resultCount());
+
+ const std::lock_guard<QMutex> locker{mutex()};
+
+ QtPrivate::ResultIteratorBase it = resultStoreBase().begin();
+ for (auto endIt = resultStoreBase().end(); it != endIt; ++it)
+ res.push_back(std::move_if_noexcept(it.value<T>()));
+
+ reset();
+ resultStoreBase().template clear<T>();
+
+ return res;
+}
+
template <>
class QFutureInterface<void> : public QFutureInterfaceBase
{
@@ -293,7 +402,11 @@ public:
void reportResult(const void *, int) { }
void reportResults(const QVector<void> &, int) { }
- void reportFinished(const void * = nullptr) { QFutureInterfaceBase::reportFinished(); }
+ void reportFinished(const void * = nullptr)
+ {
+ QFutureInterfaceBase::reportFinished();
+ QFutureInterfaceBase::runContinuation();
+ }
};
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qfutureinterface_p.h b/src/corelib/thread/qfutureinterface_p.h
index b297dff633..95ad09d535 100644
--- a/src/corelib/thread/qfutureinterface_p.h
+++ b/src/corelib/thread/qfutureinterface_p.h
@@ -191,6 +191,13 @@ public:
void disconnectOutputInterface(QFutureCallOutInterface *iface);
void setState(QFutureInterfaceBase::State state);
+
+ // Wrapper for continuation
+ std::function<void()> continuation;
+ QBasicMutex continuationMutex;
+
+ bool launchAsync = false;
+ bool isValid = false;
};
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qfuturewatcher.h b/src/corelib/thread/qfuturewatcher.h
index fb7dd30499..214dc37f01 100644
--- a/src/corelib/thread/qfuturewatcher.h
+++ b/src/corelib/thread/qfuturewatcher.h
@@ -110,6 +110,12 @@ private:
virtual QFutureInterfaceBase &futureInterface() = 0;
};
+namespace QtPrivate {
+
+template<class T>
+using EnableForNonVoid = std::enable_if_t<!std::is_same_v<T, void>>;
+}
+
template <typename T>
class QFutureWatcher : public QFutureWatcherBase
{
@@ -124,7 +130,10 @@ public:
QFuture<T> future() const
{ return m_future; }
+ template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
T result() const { return m_future.result(); }
+
+ template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
T resultAt(int index) const { return m_future.resultAt(index); }
#ifdef Q_QDOC
@@ -180,36 +189,6 @@ Q_INLINE_TEMPLATE void QFutureWatcher<T>::setFuture(const QFuture<T> &_future)
connectOutputInterface();
}
-template <>
-class QFutureWatcher<void> : public QFutureWatcherBase
-{
-public:
- explicit QFutureWatcher(QObject *_parent = nullptr)
- : QFutureWatcherBase(_parent)
- { }
- ~QFutureWatcher()
- { disconnectOutputInterface(); }
-
- void setFuture(const QFuture<void> &future);
- QFuture<void> future() const
- { return m_future; }
-
-private:
- QFuture<void> m_future;
- const QFutureInterfaceBase &futureInterface() const override { return m_future.d; }
- QFutureInterfaceBase &futureInterface() override { return m_future.d; }
-};
-
-Q_INLINE_TEMPLATE void QFutureWatcher<void>::setFuture(const QFuture<void> &_future)
-{
- if (_future == m_future)
- return;
-
- disconnectOutputInterface(true);
- m_future = _future;
- connectOutputInterface();
-}
-
QT_END_NAMESPACE
#endif // QFUTUREWATCHER_H
diff --git a/src/corelib/thread/qresultstore.h b/src/corelib/thread/qresultstore.h
index 7a65089396..c150876e74 100644
--- a/src/corelib/thread/qresultstore.h
+++ b/src/corelib/thread/qresultstore.h
@@ -43,6 +43,8 @@
#include <QtCore/qmap.h>
#include <QtCore/qdebug.h>
+#include <utility>
+
QT_REQUIRE_CONFIG(future);
QT_BEGIN_NAMESPACE
@@ -97,6 +99,19 @@ public:
return *pointer<T>();
}
+ template<typename T>
+ T &value()
+ {
+ return *pointer<T>();
+ }
+
+ template <typename T>
+ T *pointer()
+ {
+ const T *p = qAsConst(*this).pointer<T>();
+ return const_cast<T *>(p);
+ }
+
template <typename T>
const T *pointer() const
{
@@ -144,8 +159,14 @@ public:
{
if (result == nullptr)
return addResult(index, static_cast<void *>(nullptr));
- else
- return addResult(index, static_cast<void *>(new T(*result)));
+
+ return addResult(index, static_cast<void *>(new T(*result)));
+ }
+
+ template <typename T>
+ int moveResult(int index, T &&result)
+ {
+ return addResult(index, static_cast<void *>(new T(std::move_if_noexcept(result))));
}
template <typename T>
@@ -159,8 +180,8 @@ public:
{
if (m_filterMode == true && results->count() != totalCount && 0 == results->count())
return addResults(index, nullptr, 0, totalCount);
- else
- return addResults(index, new QVector<T>(*results), results->count(), totalCount);
+
+ return addResults(index, new QVector<T>(*results), results->count(), totalCount);
}
int addCanceledResult(int index)
diff --git a/src/corelib/thread/qrunnable.cpp b/src/corelib/thread/qrunnable.cpp
index c911cd0745..32f3cd657e 100644
--- a/src/corelib/thread/qrunnable.cpp
+++ b/src/corelib/thread/qrunnable.cpp
@@ -43,7 +43,6 @@ QT_BEGIN_NAMESPACE
QRunnable::~QRunnable()
{
- // Must be empty until ### Qt 6
}
/*!
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index 6a736bcfa8..d575253408 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -855,7 +855,7 @@ bool QThread::event(QEvent* event)
return QObject::event(event);
}
-Qt::HANDLE QThread::currentThreadId() noexcept
+Qt::HANDLE QThread::currentThreadIdImpl() noexcept
{
return Qt::HANDLE(currentThread());
}
diff --git a/src/corelib/thread/qthread.h b/src/corelib/thread/qthread.h
index 2072e22340..635dd94522 100644
--- a/src/corelib/thread/qthread.h
+++ b/src/corelib/thread/qthread.h
@@ -161,6 +161,7 @@ private:
#if QT_CONFIG(cxx11_future)
static QThread *createThreadImpl(std::future<void> &&future);
#endif
+ static Qt::HANDLE currentThreadIdImpl() noexcept Q_DECL_PURE_FUNCTION;
friend class QCoreApplication;
friend class QThreadData;
@@ -236,6 +237,38 @@ QThread *QThread::create(Function &&f)
#endif // QT_CONFIG(cxx11_future)
+/*
+ On architectures and platforms we know, interpret the thread control
+ block (TCB) as a unique identifier for a thread within a process. Otherwise,
+ fall back to a slower but safe implementation.
+
+ As per the documentation of currentThreadId, we return an opaque handle
+ as a thread identifier, and application code is not supposed to use that
+ value for anything. In Qt we use the handle to check if threads are identical,
+ for which the TCB is sufficient.
+
+ So we use the fastest possible way, rathern than spend time on returning
+ some pseudo-interoperable value.
+*/
+inline Qt::HANDLE QThread::currentThreadId() noexcept
+{
+ Qt::HANDLE tid; // typedef to void*
+ Q_STATIC_ASSERT(sizeof(tid) == sizeof(void*));
+ // See https://akkadia.org/drepper/tls.pdf for x86 ABI
+#if defined(Q_PROCESSOR_X86_32) && defined(Q_OS_LINUX) // x86 32-bit always uses GS
+ __asm__("movl %%gs:0, %0" : "=r" (tid) : : );
+#elif defined(Q_PROCESSOR_X86_64) && defined(Q_OS_DARWIN64)
+ // 64bit macOS uses GS, see https://github.com/apple/darwin-xnu/blob/master/libsyscall/os/tsd.h
+ __asm__("movq %%gs:0, %0" : "=r" (tid) : : );
+#elif defined(Q_PROCESSOR_X86_64) && (defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD))
+ // x86_64 Linux, BSD uses FS
+ __asm__("movq %%fs:0, %0" : "=r" (tid) : : );
+#else
+ tid = currentThreadIdImpl();
+#endif
+ return tid;
+}
+
QT_END_NAMESPACE
#endif // QTHREAD_H
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index 1da68b3130..727d72a334 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -415,16 +415,36 @@ void QThreadPrivate::finish(void *arg)
}
-
-
/**************************************************************************
** QThread
*************************************************************************/
-Qt::HANDLE QThread::currentThreadId() noexcept
+/*
+ Since each thread is guaranteed to have its own copy of
+ currenThreadData, the address is guaranteed to be unique for each
+ running thread (but likely to be reused for newly started threads).
+
+ CI tests fails on ARM architectures if we try to use the assembler,
+ or the address of the thread_local (even with a recent gcc version), so
+ stick to the pthread version there. The assembler would be
+
+ // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344k/Babeihid.html
+ asm volatile ("mrc p15, 0, %0, c13, c0, 3" : "=r" (tid));
+
+ and
+
+ // see glibc/sysdeps/aarch64/nptl/tls.h
+ asm volatile ("mrs %0, tpidr_el0" : "=r" (tid));
+
+ for 32 and 64bit versions, respectively.
+*/
+Qt::HANDLE QThread::currentThreadIdImpl() noexcept
{
- // requires a C cast here otherwise we run into trouble on AIX
+#if defined(Q_PROCESSOR_ARM)
return to_HANDLE(pthread_self());
+#else
+ return &currentThreadData;
+#endif
}
#if defined(QT_LINUXBASE) && !defined(_SC_NPROCESSORS_ONLN)
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index bc70e3178a..00d67b3a00 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -449,7 +449,7 @@ void QThreadPrivate::finish(void *arg, bool lockAnyway) noexcept
** QThread
*************************************************************************/
-Qt::HANDLE QThread::currentThreadId() noexcept
+Qt::HANDLE QThread::currentThreadIdImpl() noexcept
{
return reinterpret_cast<Qt::HANDLE>(quintptr(GetCurrentThreadId()));
}
diff --git a/src/corelib/thread/thread.pri b/src/corelib/thread/thread.pri
index 25cf68a324..e3d791fee7 100644
--- a/src/corelib/thread/thread.pri
+++ b/src/corelib/thread/thread.pri
@@ -66,6 +66,7 @@ qtConfig(future) {
HEADERS += \
thread/qexception.h \
thread/qfuture.h \
+ thread/qfuture_impl.h \
thread/qfutureinterface.h \
thread/qfutureinterface_p.h \
thread/qfuturesynchronizer.h \
diff --git a/src/corelib/time/qcalendar.cpp b/src/corelib/time/qcalendar.cpp
index 32f0a511a3..7b50eb008c 100644
--- a/src/corelib/time/qcalendar.cpp
+++ b/src/corelib/time/qcalendar.cpp
@@ -61,7 +61,7 @@ inline bool operator==(const CalendarName &u, const CalendarName &v)
return u.compare(v, Qt::CaseInsensitive) == 0;
}
-inline uint qHash(const CalendarName &key, uint seed = 0) noexcept
+inline size_t qHash(const CalendarName &key, size_t seed = 0) noexcept
{
return qHash(key.toLower(), seed);
}
@@ -518,7 +518,7 @@ int QCalendarBackend::dayOfWeek(qint64 jd) const
/*!
\fn QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime &datetime,
- const QDate &dateOnly, const QTime &timeOnly,
+ QDate dateOnly, QTime timeOnly,
const QLocale &locale) const
Returns a string representing a given date, time or date-time.
@@ -1095,7 +1095,7 @@ QString QCalendar::standaloneWeekDayName(const QLocale &locale, int day,
\sa monthName(), weekDayName(), QDate::toString(), QTime::toString()
*/
QString QCalendar::dateTimeToString(QStringView format, const QDateTime &datetime,
- const QDate &dateOnly, const QTime &timeOnly,
+ QDate dateOnly, QTime timeOnly,
const QLocale &locale) const
{
return d ? d->dateTimeToString(format, datetime, dateOnly, timeOnly, locale) : QString();
diff --git a/src/corelib/time/qcalendar.h b/src/corelib/time/qcalendar.h
index 42c8e150c5..5eb2e541c8 100644
--- a/src/corelib/time/qcalendar.h
+++ b/src/corelib/time/qcalendar.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -178,7 +178,7 @@ public:
// Formatting of date-times:
QString dateTimeToString(QStringView format, const QDateTime &datetime,
- const QDate &dateOnly, const QTime &timeOnly,
+ QDate dateOnly, QTime timeOnly,
const QLocale &locale) const;
// What's available ?
diff --git a/src/corelib/time/qcalendarbackend_p.h b/src/corelib/time/qcalendarbackend_p.h
index 21506e9e2c..129e86494b 100644
--- a/src/corelib/time/qcalendarbackend_p.h
+++ b/src/corelib/time/qcalendarbackend_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -56,23 +56,33 @@
#include <QtCore/qstringlist.h>
#include <QtCore/qstring.h>
#include <QtCore/qmap.h>
+#include <QtCore/private/qlocale_p.h>
QT_BEGIN_NAMESPACE
// Locale-related parts, mostly handled in ../text/qlocale.cpp
-struct QLocaleDataEntry {
- quint16 index, size;
-};
struct QCalendarLocale {
quint16 m_language_id, m_script_id, m_country_id;
+
+#define rangeGetter(name) \
+ QLocaleData::DataRange name() const { return { m_ ## name ## _idx, m_ ## name ## _size }; }
+
+ rangeGetter(longMonthStandalone) rangeGetter(longMonth)
+ rangeGetter(shortMonthStandalone) rangeGetter(shortMonth)
+ rangeGetter(narrowMonthStandalone) rangeGetter(narrowMonth)
+#undef rangeGetter
+
// Month name indexes:
- QLocaleDataEntry m_standalone_short;
- QLocaleDataEntry m_standalone_long;
- QLocaleDataEntry m_standalone_narrow;
- QLocaleDataEntry m_short;
- QLocaleDataEntry m_long;
- QLocaleDataEntry m_narrow;
+ quint16 m_longMonthStandalone_idx, m_longMonth_idx;
+ quint16 m_shortMonthStandalone_idx, m_shortMonth_idx;
+ quint16 m_narrowMonthStandalone_idx, m_narrowMonth_idx;
+
+ // Twelve long month names (separated by commas) can add up to more than 256
+ // QChars - e.g. kde_TZ gets to 264.
+ quint16 m_longMonthStandalone_size, m_longMonth_size;
+ quint8 m_shortMonthStandalone_size, m_shortMonth_size;
+ quint8 m_narrowMonthStandalone_size, m_narrowMonth_size;
};
// Partial implementation, of methods with common forms, in qcalendar.cpp
@@ -116,7 +126,7 @@ public:
// Formatting of date-times (implemented in qlocale.cpp):
virtual QString dateTimeToString(QStringView format, const QDateTime &datetime,
- const QDate &dateOnly, const QTime &timeOnly,
+ QDate dateOnly, QTime timeOnly,
const QLocale &locale) const;
// Calendar enumeration by name:
@@ -127,7 +137,7 @@ protected:
// Locale support:
virtual const QCalendarLocale *localeMonthIndexData() const = 0;
- virtual const ushort *localeMonthData() const = 0;
+ virtual const char16_t *localeMonthData() const = 0;
bool registerAlias(const QString &name);
diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp
index 9d95f6eb1c..15654117a9 100644
--- a/src/corelib/time/qdatetime.cpp
+++ b/src/corelib/time/qdatetime.cpp
@@ -51,7 +51,6 @@
#if QT_CONFIG(timezone)
#include "qtimezoneprivate_p.h"
#endif
-#include "qregexp.h"
#include "qdebug.h"
#ifndef Q_OS_WIN
#include <locale.h>
@@ -135,8 +134,6 @@ static int qt_monthNumberFromShortName(QStringView shortName)
}
return -1;
}
-static int qt_monthNumberFromShortName(const QString &shortName)
-{ return qt_monthNumberFromShortName(QStringView(shortName)); }
static int fromShortMonthName(QStringView monthName, int year)
{
@@ -153,43 +150,144 @@ static int fromShortMonthName(QStringView monthName, int year)
}
#endif // textdate
-#if QT_CONFIG(datestring)
+#if QT_CONFIG(datestring) // depends on, so implies, textdate
struct ParsedRfcDateTime {
QDate date;
QTime time;
int utcOffset;
};
+static int shortDayFromName(QStringView name)
+{
+ const char16_t shortDayNames[] = u"MonTueWedThuFriSatSun";
+ for (int i = 0; i < 7; i++) {
+ if (name == QStringView(shortDayNames + 3 * i, 3))
+ return i + 1;
+ }
+ return 0;
+}
+
static ParsedRfcDateTime rfcDateImpl(const QString &s)
{
+ // Matches "[ddd,] dd MMM yyyy[ hh:mm[:ss]] [±hhmm]" - correct RFC 822, 2822, 5322 format -
+ // or "ddd MMM dd[ hh:mm:ss] yyyy [±hhmm]" - permissive RFC 850, 1036 (read only)
ParsedRfcDateTime result;
- // Matches "[ddd,] dd MMM yyyy[ hh:mm[:ss]] [±hhmm]" - correct RFC 822, 2822, 5322 format
- QRegExp rex(QStringLiteral("^[ \\t]*(?:[A-Z][a-z]+,)?[ \\t]*(\\d{1,2})[ \\t]+([A-Z][a-z]+)[ \\t]+(\\d\\d\\d\\d)(?:[ \\t]+(\\d\\d):(\\d\\d)(?::(\\d\\d))?)?[ \\t]*(?:([+-])(\\d\\d)(\\d\\d))?"));
- if (s.indexOf(rex) == 0) {
- const QStringList cap = rex.capturedTexts();
- result.date = QDate(cap[3].toInt(), qt_monthNumberFromShortName(cap[2]), cap[1].toInt());
- if (!cap[4].isEmpty())
- result.time = QTime(cap[4].toInt(), cap[5].toInt(), cap[6].toInt());
- const bool positiveOffset = (cap[7] == QLatin1String("+"));
- const int hourOffset = cap[8].toInt();
- const int minOffset = cap[9].toInt();
- result.utcOffset = ((hourOffset * 60 + minOffset) * (positiveOffset ? 60 : -60));
- } else {
- // Matches "ddd MMM dd[ hh:mm:ss] yyyy [±hhmm]" - permissive RFC 850, 1036 (read only)
- QRegExp rex(QStringLiteral("^[ \\t]*[A-Z][a-z]+[ \\t]+([A-Z][a-z]+)[ \\t]+(\\d\\d)(?:[ \\t]+(\\d\\d):(\\d\\d):(\\d\\d))?[ \\t]+(\\d\\d\\d\\d)[ \\t]*(?:([+-])(\\d\\d)(\\d\\d))?"));
- if (s.indexOf(rex) == 0) {
- const QStringList cap = rex.capturedTexts();
- result.date = QDate(cap[6].toInt(), qt_monthNumberFromShortName(cap[1]), cap[2].toInt());
- if (!cap[3].isEmpty())
- result.time = QTime(cap[3].toInt(), cap[4].toInt(), cap[5].toInt());
- const bool positiveOffset = (cap[7] == QLatin1String("+"));
- const int hourOffset = cap[8].toInt();
- const int minOffset = cap[9].toInt();
- result.utcOffset = ((hourOffset * 60 + minOffset) * (positiveOffset ? 60 : -60));
+ auto words = s.splitRef(QLatin1Char(' '), Qt::SkipEmptyParts);
+ if (words.size() < 3 || words.size() > 6)
+ return result;
+ const QChar colon(QLatin1Char(':'));
+ const QLocale C = QLocale::c();
+ bool ok = true;
+ QDate date;
+
+ const auto isShortName = [](QStringView name) {
+ return (name.length() == 3 && name.at(0).isUpper()
+ && name.at(1).isLower() && name.at(2).isLower());
+ };
+
+ /* Reject entirely (return) if the string is malformed; however, if the date
+ * is merely invalid, (break, so as to) go on to parsing of the time.
+ */
+ int yearIndex;
+ do { // "loop" so that we can use break on merely invalid, but "right shape" date.
+ QStringView dayName;
+ bool rfcX22 = true;
+ if (words.at(0).endsWith(QLatin1Char(','))) {
+ dayName = words.takeFirst().chopped(1);
+ } else if (!words.at(0).at(0).isDigit()) {
+ dayName = words.takeFirst();
+ rfcX22 = false;
+ } // else: dayName is not specified (so we can only be RFC *22)
+ if (words.size() < 3 || words.size() > 5)
+ return result;
+
+ // Don't break before setting yearIndex.
+ int dayIndex, monthIndex;
+ if (rfcX22) {
+ // dd MMM yyyy [hh:mm[:ss]] [±hhmm]
+ dayIndex = 0;
+ monthIndex = 1;
+ yearIndex = 2;
+ } else {
+ // MMM dd[ hh:mm:ss] yyyy [±hhmm]
+ dayIndex = 1;
+ monthIndex = 0;
+ yearIndex = words.size() > 3 && words.at(2).contains(colon) ? 3 : 2;
+ }
+
+ int dayOfWeek = 0;
+ if (!dayName.isEmpty()) {
+ if (!isShortName(dayName))
+ return result;
+ dayOfWeek = shortDayFromName(dayName);
+ if (!dayOfWeek)
+ break;
}
+
+ const int day = words.at(dayIndex).toInt(&ok);
+ if (!ok)
+ return result;
+ const int year = words.at(yearIndex).toInt(&ok);
+ if (!ok)
+ return result;
+ const QStringView monthName = words.at(monthIndex);
+ if (!isShortName(monthName))
+ return result;
+ int month = fromShortMonthName(monthName, year);
+ if (month < 0)
+ break;
+
+ date = QDate(year, month, day);
+ if (dayOfWeek && date.dayOfWeek() != dayOfWeek)
+ date = QDate();
+ } while (false);
+ words.remove(yearIndex);
+ words.remove(0, 2); // month and day-of-month, in some order
+
+ // Time: [hh:mm[:ss]]
+ QTime time;
+ if (words.size() && words.at(0).contains(colon)) {
+ const QStringView when = words.takeFirst();
+ if (when.at(2) != colon || (when.size() == 8 ? when.at(5) != colon : when.size() > 5))
+ return result;
+ const int hour = C.toInt(when.left(2), &ok);
+ if (!ok)
+ return result;
+ const int minute = C.toInt(when.mid(3, 2), &ok);
+ if (!ok)
+ return result;
+ const auto secs = when.size() == 8 ? C.toInt(when.right(2), &ok) : 0;
+ if (!ok)
+ return result;
+ time = QTime(hour, minute, secs);
}
+ // Offset: [±hhmm]
+ int offset = 0;
+ if (words.size()) {
+ const QStringView zone = words.takeFirst();
+ if (words.size() || !(zone.size() == 3 || zone.size() == 5))
+ return result;
+ bool negate = false;
+ if (zone.at(0) == QLatin1Char('-'))
+ negate = true;
+ else if (zone.at(0) != QLatin1Char('+'))
+ return result;
+ const int hour = C.toInt(zone.mid(1, 2), &ok);
+ if (!ok)
+ return result;
+ const auto minute = zone.size() > 3 ? C.toInt(zone.mid(3, 2), &ok) : 0;
+ if (!ok)
+ return result;
+ offset = (hour * 60 + minute) * 60;
+ if (negate)
+ offset = -offset;
+ }
+
+ result.date = date;
+ result.time = time;
+ result.utcOffset = offset;
return result;
}
#endif // datestring
@@ -1566,7 +1664,7 @@ QDate QDate::addYears(int nyears) const
\sa addDays()
*/
-qint64 QDate::daysTo(const QDate &d) const
+qint64 QDate::daysTo(QDate d) const
{
if (isNull() || d.isNull())
return 0;
@@ -1577,14 +1675,14 @@ qint64 QDate::daysTo(const QDate &d) const
/*!
- \fn bool QDate::operator==(const QDate &d) const
+ \fn bool QDate::operator==(QDate d) const
Returns \c true if this date and \a d represent the same day, otherwise
\c false.
*/
/*!
- \fn bool QDate::operator!=(const QDate &d) const
+ \fn bool QDate::operator!=(QDate d) const
Returns \c true if this date is different from \a d; otherwise
returns \c false.
@@ -1593,28 +1691,28 @@ qint64 QDate::daysTo(const QDate &d) const
*/
/*!
- \fn bool QDate::operator<(const QDate &d) const
+ \fn bool QDate::operator<(QDate d) const
Returns \c true if this date is earlier than \a d; otherwise returns
false.
*/
/*!
- \fn bool QDate::operator<=(const QDate &d) const
+ \fn bool QDate::operator<=(QDate d) const
Returns \c true if this date is earlier than or equal to \a d;
otherwise returns \c false.
*/
/*!
- \fn bool QDate::operator>(const QDate &d) const
+ \fn bool QDate::operator>(QDate d) const
Returns \c true if this date is later than \a d; otherwise returns
false.
*/
/*!
- \fn bool QDate::operator>=(const QDate &d) const
+ \fn bool QDate::operator>=(QDate d) const
Returns \c true if this date is later than or equal to \a d;
otherwise returns \c false.
@@ -2233,7 +2331,7 @@ QTime QTime::addSecs(int s) const
\sa addSecs(), QDateTime::secsTo()
*/
-int QTime::secsTo(const QTime &t) const
+int QTime::secsTo(QTime t) const
{
if (!isValid() || !t.isValid())
return 0;
@@ -2285,7 +2383,7 @@ QTime QTime::addMSecs(int ms) const
\sa secsTo(), addMSecs(), QDateTime::msecsTo()
*/
-int QTime::msecsTo(const QTime &t) const
+int QTime::msecsTo(QTime t) const
{
if (!isValid() || !t.isValid())
return 0;
@@ -2294,38 +2392,38 @@ int QTime::msecsTo(const QTime &t) const
/*!
- \fn bool QTime::operator==(const QTime &t) const
+ \fn bool QTime::operator==(QTime t) const
Returns \c true if this time is equal to \a t; otherwise returns \c false.
*/
/*!
- \fn bool QTime::operator!=(const QTime &t) const
+ \fn bool QTime::operator!=(QTime t) const
Returns \c true if this time is different from \a t; otherwise returns \c false.
*/
/*!
- \fn bool QTime::operator<(const QTime &t) const
+ \fn bool QTime::operator<(QTime t) const
Returns \c true if this time is earlier than \a t; otherwise returns \c false.
*/
/*!
- \fn bool QTime::operator<=(const QTime &t) const
+ \fn bool QTime::operator<=(QTime t) const
Returns \c true if this time is earlier than or equal to \a t;
otherwise returns \c false.
*/
/*!
- \fn bool QTime::operator>(const QTime &t) const
+ \fn bool QTime::operator>(QTime t) const
Returns \c true if this time is later than \a t; otherwise returns \c false.
*/
/*!
- \fn bool QTime::operator>=(const QTime &t) const
+ \fn bool QTime::operator>=(QTime t) const
Returns \c true if this time is later than or equal to \a t;
otherwise returns \c false.
@@ -3455,7 +3553,7 @@ inline QDateTimePrivate *QDateTime::Data::operator->()
*****************************************************************************/
Q_NEVER_INLINE
-QDateTime::Data QDateTimePrivate::create(const QDate &toDate, const QTime &toTime, Qt::TimeSpec toSpec,
+QDateTime::Data QDateTimePrivate::create(QDate toDate, QTime toTime, Qt::TimeSpec toSpec,
int offsetSeconds)
{
QDateTime::Data result(toSpec);
@@ -3465,7 +3563,7 @@ QDateTime::Data QDateTimePrivate::create(const QDate &toDate, const QTime &toTim
}
#if QT_CONFIG(timezone)
-inline QDateTime::Data QDateTimePrivate::create(const QDate &toDate, const QTime &toTime,
+inline QDateTime::Data QDateTimePrivate::create(QDate toDate, QTime toTime,
const QTimeZone &toTimeZone)
{
QDateTime::Data result(Qt::TimeZone);
@@ -3670,7 +3768,7 @@ QDateTime::QDateTime() noexcept(Data::CanBeSmall)
\sa QDate::startOfDay()
*/
-QDateTime::QDateTime(const QDate &date)
+QDateTime::QDateTime(QDate date)
: QDateTime(date.startOfDay(Qt::LocalTime, 0))
{
}
@@ -3678,28 +3776,6 @@ QDateTime::QDateTime(const QDate &date)
/*!
Constructs a datetime with the given \a date and \a time, using
- the time specification defined by \a spec.
-
- If \a date is valid and \a time is not, the time will be set to midnight.
-
- If \a spec is Qt::OffsetFromUTC then it will be set to Qt::UTC, i.e. an
- offset of 0 seconds. To create a Qt::OffsetFromUTC datetime use the
- correct constructor.
-
- If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime,
- i.e. the current system time zone. To create a Qt::TimeZone datetime
- use the correct constructor.
-*/
-
-QDateTime::QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec)
- : d(QDateTimePrivate::create(date, time, spec, 0))
-{
-}
-
-/*!
- \since 5.2
-
- Constructs a datetime with the given \a date and \a time, using
the time specification defined by \a spec and \a offsetSeconds seconds.
If \a date is valid and \a time is not, the time will be set to midnight.
@@ -3714,7 +3790,7 @@ QDateTime::QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec)
use the correct constructor.
*/
-QDateTime::QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec, int offsetSeconds)
+QDateTime::QDateTime(QDate date, QTime time, Qt::TimeSpec spec, int offsetSeconds)
: d(QDateTimePrivate::create(date, time, spec, offsetSeconds))
{
}
@@ -3731,7 +3807,7 @@ QDateTime::QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec, in
If \a timeZone is invalid then the datetime will be invalid.
*/
-QDateTime::QDateTime(const QDate &date, const QTime &time, const QTimeZone &timeZone)
+QDateTime::QDateTime(QDate date, QTime time, const QTimeZone &timeZone)
: d(QDateTimePrivate::create(date, time, timeZone))
{
}
@@ -4019,7 +4095,7 @@ bool QDateTime::isDaylightTime() const
\sa date(), setTime(), setTimeSpec()
*/
-void QDateTime::setDate(const QDate &date)
+void QDateTime::setDate(QDate date)
{
setDateTime(d, date, time());
}
@@ -4037,7 +4113,7 @@ void QDateTime::setDate(const QDate &date)
\sa time(), setDate(), setTimeSpec()
*/
-void QDateTime::setTime(const QTime &time)
+void QDateTime::setTime(QTime time)
{
setDateTime(d, date(), time);
}
@@ -5329,7 +5405,7 @@ QT_WARNING_POP
isoString.chop(1); // trim 'Z'
} else {
// the loop below is faster but functionally equal to:
- // const int signIndex = isoString.indexOf(QRegExp(QStringLiteral("[+-]")));
+ // const int signIndex = isoString.indexOf(QRegulargExpression(QStringLiteral("[+-]")));
int signIndex = isoString.size() - 1;
Q_ASSERT(signIndex >= 0);
bool found = false;
@@ -5601,7 +5677,7 @@ QDateTime QDateTime::fromString(const QString &string, const QString &format)
\sa {Serializing Qt Data Types}
*/
-QDataStream &operator<<(QDataStream &out, const QDate &date)
+QDataStream &operator<<(QDataStream &out, QDate date)
{
if (out.version() < QDataStream::Qt_5_0)
return out << quint32(date.jd);
@@ -5641,7 +5717,7 @@ QDataStream &operator>>(QDataStream &in, QDate &date)
\sa {Serializing Qt Data Types}
*/
-QDataStream &operator<<(QDataStream &out, const QTime &time)
+QDataStream &operator<<(QDataStream &out, QTime time)
{
if (out.version() >= QDataStream::Qt_4_0) {
return out << quint32(time.mds);
@@ -5821,7 +5897,7 @@ QDataStream &operator>>(QDataStream &in, QDateTime &dateTime)
*****************************************************************************/
#if !defined(QT_NO_DEBUG_STREAM) && QT_CONFIG(datestring)
-QDebug operator<<(QDebug dbg, const QDate &date)
+QDebug operator<<(QDebug dbg, QDate date)
{
QDebugStateSaver saver(dbg);
dbg.nospace() << "QDate(";
@@ -5833,7 +5909,7 @@ QDebug operator<<(QDebug dbg, const QDate &date)
return dbg;
}
-QDebug operator<<(QDebug dbg, const QTime &time)
+QDebug operator<<(QDebug dbg, QTime time)
{
QDebugStateSaver saver(dbg);
dbg.nospace() << "QTime(";
@@ -5874,13 +5950,13 @@ QDebug operator<<(QDebug dbg, const QDateTime &date)
}
#endif // debug_stream && datestring
-/*! \fn uint qHash(const QDateTime &key, uint seed = 0)
+/*! \fn size_t qHash(const QDateTime &key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-uint qHash(const QDateTime &key, uint seed)
+size_t qHash(const QDateTime &key, size_t seed)
{
// Use to toMSecsSinceEpoch instead of individual qHash functions for
// QDate/QTime/spec/offset because QDateTime::operator== converts both arguments
@@ -5889,24 +5965,24 @@ uint qHash(const QDateTime &key, uint seed)
return key.isValid() ? qHash(key.toMSecsSinceEpoch(), seed) : seed;
}
-/*! \fn uint qHash(const QDate &key, uint seed = 0)
+/*! \fn size_t qHash(QDate key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-uint qHash(const QDate &key, uint seed) noexcept
+size_t qHash(QDate key, size_t seed) noexcept
{
return qHash(key.toJulianDay(), seed);
}
-/*! \fn uint qHash(const QTime &key, uint seed = 0)
+/*! \fn size_t qHash(QTime key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-uint qHash(const QTime &key, uint seed) noexcept
+size_t qHash(QTime key, size_t seed) noexcept
{
return qHash(key.msecsSinceStartOfDay(), seed);
}
diff --git a/src/corelib/time/qdatetime.h b/src/corelib/time/qdatetime.h
index 645923ada8..52524f70a4 100644
--- a/src/corelib/time/qdatetime.h
+++ b/src/corelib/time/qdatetime.h
@@ -143,14 +143,14 @@ public:
Q_REQUIRED_RESULT QDate addYears(int years) const;
Q_REQUIRED_RESULT QDate addMonths(int months, QCalendar cal) const;
Q_REQUIRED_RESULT QDate addYears(int years, QCalendar cal) const;
- qint64 daysTo(const QDate &) const; // ### Qt 6: QDate
+ qint64 daysTo(QDate d) const;
- Q_DECL_CONSTEXPR bool operator==(const QDate &other) const { return jd == other.jd; }
- Q_DECL_CONSTEXPR bool operator!=(const QDate &other) const { return jd != other.jd; }
- Q_DECL_CONSTEXPR bool operator< (const QDate &other) const { return jd < other.jd; }
- Q_DECL_CONSTEXPR bool operator<=(const QDate &other) const { return jd <= other.jd; }
- Q_DECL_CONSTEXPR bool operator> (const QDate &other) const { return jd > other.jd; }
- Q_DECL_CONSTEXPR bool operator>=(const QDate &other) const { return jd >= other.jd; }
+ Q_DECL_CONSTEXPR bool operator==(QDate other) const { return jd == other.jd; }
+ Q_DECL_CONSTEXPR bool operator!=(QDate other) const { return jd != other.jd; }
+ Q_DECL_CONSTEXPR bool operator< (QDate other) const { return jd < other.jd; }
+ Q_DECL_CONSTEXPR bool operator<=(QDate other) const { return jd <= other.jd; }
+ Q_DECL_CONSTEXPR bool operator> (QDate other) const { return jd > other.jd; }
+ Q_DECL_CONSTEXPR bool operator>=(QDate other) const { return jd >= other.jd; }
static QDate currentDate();
#if QT_CONFIG(datestring)
@@ -176,7 +176,7 @@ private:
friend class QDateTime;
friend class QDateTimePrivate;
#ifndef QT_NO_DATASTREAM
- friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDate &);
+ friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, QDate);
friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDate &);
#endif
};
@@ -208,16 +208,16 @@ public:
bool setHMS(int h, int m, int s, int ms = 0);
Q_REQUIRED_RESULT QTime addSecs(int secs) const;
- int secsTo(const QTime &) const; // ### Qt 6: plain QTime
+ int secsTo(QTime t) const;
Q_REQUIRED_RESULT QTime addMSecs(int ms) const;
- int msecsTo(const QTime &) const; // ### Qt 6: plain QTime
+ int msecsTo(QTime t) const;
- Q_DECL_CONSTEXPR bool operator==(const QTime &other) const { return mds == other.mds; }
- Q_DECL_CONSTEXPR bool operator!=(const QTime &other) const { return mds != other.mds; }
- Q_DECL_CONSTEXPR bool operator< (const QTime &other) const { return mds < other.mds; }
- Q_DECL_CONSTEXPR bool operator<=(const QTime &other) const { return mds <= other.mds; }
- Q_DECL_CONSTEXPR bool operator> (const QTime &other) const { return mds > other.mds; }
- Q_DECL_CONSTEXPR bool operator>=(const QTime &other) const { return mds >= other.mds; }
+ Q_DECL_CONSTEXPR bool operator==(QTime other) const { return mds == other.mds; }
+ Q_DECL_CONSTEXPR bool operator!=(QTime other) const { return mds != other.mds; }
+ Q_DECL_CONSTEXPR bool operator< (QTime other) const { return mds < other.mds; }
+ Q_DECL_CONSTEXPR bool operator<=(QTime other) const { return mds <= other.mds; }
+ Q_DECL_CONSTEXPR bool operator> (QTime other) const { return mds > other.mds; }
+ Q_DECL_CONSTEXPR bool operator>=(QTime other) const { return mds >= other.mds; }
static Q_DECL_CONSTEXPR inline QTime fromMSecsSinceStartOfDay(int msecs) { return QTime(msecs); }
Q_DECL_CONSTEXPR inline int msecsSinceStartOfDay() const { return mds == NullTime ? 0 : mds; }
@@ -241,8 +241,8 @@ private:
friend class QDateTime;
friend class QDateTimePrivate;
-#ifndef QT_NO_DATASTREAM // ### Qt 6: plain QTime
- friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QTime &);
+#ifndef QT_NO_DATASTREAM
+ friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, QTime);
friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QTime &);
#endif
};
@@ -293,13 +293,11 @@ class Q_CORE_EXPORT QDateTime
public:
QDateTime() noexcept(Data::CanBeSmall);
#if QT_DEPRECATED_SINCE(5, 15) // ### Qt 6: remove
- QT_DEPRECATED_X("Use QDate::startOfDay()") explicit QDateTime(const QDate &);
+ QT_DEPRECATED_X("Use QDate::startOfDay()") explicit QDateTime(QDate);
#endif
- QDateTime(const QDate &, const QTime &, Qt::TimeSpec spec = Qt::LocalTime);
- // ### Qt 6: Merge with above with default offsetSeconds = 0
- QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec, int offsetSeconds);
+ QDateTime(QDate date, QTime time, Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0);
#if QT_CONFIG(timezone)
- QDateTime(const QDate &date, const QTime &time, const QTimeZone &timeZone);
+ QDateTime(QDate date, QTime time, const QTimeZone &timeZone);
#endif // timezone
QDateTime(const QDateTime &other) noexcept;
QDateTime(QDateTime &&other) noexcept;
@@ -326,8 +324,8 @@ public:
qint64 toMSecsSinceEpoch() const;
qint64 toSecsSinceEpoch() const;
- void setDate(const QDate &date); // ### Qt 6: plain QDate
- void setTime(const QTime &time);
+ void setDate(QDate date);
+ void setTime(QTime time);
void setTimeSpec(Qt::TimeSpec spec);
void setOffsetFromUtc(int offsetSeconds);
#if QT_CONFIG(timezone)
@@ -433,25 +431,25 @@ private:
Q_DECLARE_SHARED(QDateTime)
#ifndef QT_NO_DATASTREAM
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDate &);
+Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, QDate);
Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDate &);
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QTime &);
+Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, QTime);
Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QTime &);
Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDateTime &);
Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDateTime &);
#endif // QT_NO_DATASTREAM
#if !defined(QT_NO_DEBUG_STREAM) && QT_CONFIG(datestring)
-Q_CORE_EXPORT QDebug operator<<(QDebug, const QDate &);
-Q_CORE_EXPORT QDebug operator<<(QDebug, const QTime &);
+Q_CORE_EXPORT QDebug operator<<(QDebug, QDate);
+Q_CORE_EXPORT QDebug operator<<(QDebug, QTime);
Q_CORE_EXPORT QDebug operator<<(QDebug, const QDateTime &);
#endif
// QDateTime is not noexcept for now -- to be revised once
// timezone and calendaring support is added
-Q_CORE_EXPORT uint qHash(const QDateTime &key, uint seed = 0);
-Q_CORE_EXPORT uint qHash(const QDate &key, uint seed = 0) noexcept;
-Q_CORE_EXPORT uint qHash(const QTime &key, uint seed = 0) noexcept;
+Q_CORE_EXPORT size_t qHash(const QDateTime &key, size_t seed = 0);
+Q_CORE_EXPORT size_t qHash(QDate key, size_t seed = 0) noexcept;
+Q_CORE_EXPORT size_t qHash(QTime key, size_t seed = 0) noexcept;
QT_END_NAMESPACE
diff --git a/src/corelib/time/qdatetime_p.h b/src/corelib/time/qdatetime_p.h
index f4f00a8b9b..c500b023c4 100644
--- a/src/corelib/time/qdatetime_p.h
+++ b/src/corelib/time/qdatetime_p.h
@@ -110,11 +110,11 @@ public:
DaylightMask = SetToStandardTime | SetToDaylightTime
};
- static QDateTime::Data create(const QDate &toDate, const QTime &toTime, Qt::TimeSpec toSpec,
+ static QDateTime::Data create(QDate toDate, QTime toTime, Qt::TimeSpec toSpec,
int offsetSeconds);
#if QT_CONFIG(timezone)
- static QDateTime::Data create(const QDate &toDate, const QTime &toTime, const QTimeZone & timeZone);
+ static QDateTime::Data create(QDate toDate, QTime toTime, const QTimeZone & timeZone);
#endif // timezone
StatusFlags m_status = StatusFlag(Qt::LocalTime << TimeSpecShift);
diff --git a/src/corelib/time/qdatetimeparser_p.h b/src/corelib/time/qdatetimeparser_p.h
index 5c612ef6a4..bc390db223 100644
--- a/src/corelib/time/qdatetimeparser_p.h
+++ b/src/corelib/time/qdatetimeparser_p.h
@@ -77,7 +77,6 @@ QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT QDateTimeParser
{
- Q_DECLARE_TR_FUNCTIONS(QDateTimeParser)
public:
enum Context {
FromString,
@@ -267,10 +266,11 @@ protected: // for the benefit of QDateTimeEditPrivate
return skipToNextSection(section, current, QStringRef(&sectionText));
}
QString stateName(State s) const;
+ QString getAmPmText(AmPm ap, Case cs) const;
+
virtual QDateTime getMinimum() const;
virtual QDateTime getMaximum() const;
virtual int cursorPosition() const { return -1; }
- virtual QString getAmPmText(AmPm ap, Case cs) const;
virtual QLocale locale() const { return defaultLocale; }
mutable int currentSectionIndex;
diff --git a/src/corelib/time/qhijricalendar.cpp b/src/corelib/time/qhijricalendar.cpp
index b5d89fbc5c..c0f7662c0d 100644
--- a/src/corelib/time/qhijricalendar.cpp
+++ b/src/corelib/time/qhijricalendar.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -118,7 +118,7 @@ const QCalendarLocale *QHijriCalendar::localeMonthIndexData() const
return locale_data;
}
-const ushort *QHijriCalendar::localeMonthData() const
+const char16_t *QHijriCalendar::localeMonthData() const
{
return months_data;
}
diff --git a/src/corelib/time/qhijricalendar_data_p.h b/src/corelib/time/qhijricalendar_data_p.h
index 9c12e90c13..5445375c3c 100644
--- a/src/corelib/time/qhijricalendar_data_p.h
+++ b/src/corelib/time/qhijricalendar_data_p.h
@@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE
// GENERATED PART STARTS HERE
/*
- This part of the file was generated on 2020-03-18 from the
+ This part of the file was generated on 2020-04-07 from the
Common Locale Data Repository v36
http://www.unicode.org/cldr/
@@ -70,1133 +70,1141 @@ QT_BEGIN_NAMESPACE
*/
static const QCalendarLocale locale_data[] = {
- // lang script terr sShort sLong sNarrow short long narrow
- { 1, 0, 0,{ 0,79 },{ 79,107 },{ 186,29 },{ 0,79 },{ 79,107 },{ 186,29 }}, // C/AnyScript/AnyCountry
- { 3, 7, 69,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Oromo/Latin/Ethiopia
- { 3, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Oromo/Latin/Kenya
- { 4, 7, 69,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Afar/Latin/Ethiopia
- { 5, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Afrikaans/Latin/South Africa
- { 5, 7, 148,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Afrikaans/Latin/Namibia
- { 6, 7, 2,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Albanian/Latin/Albania
- { 6, 7, 127,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Albanian/Latin/Macedonia
- { 6, 7, 257,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Albanian/Latin/Kosovo
- { 7, 14, 69,{ 0,79 },{ 242,75 },{ 215,27 },{ 0,79 },{ 242,75 },{ 215,27 }}, // Amharic/Ethiopic/Ethiopia
- { 8, 1, 64,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Egypt
- { 8, 1, 3,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Algeria
- { 8, 1, 17,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Bahrain
- { 8, 1, 42,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Chad
- { 8, 1, 48,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Comoros
- { 8, 1, 59,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Djibouti
- { 8, 1, 67,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Eritrea
- { 8, 1, 103,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Iraq
- { 8, 1, 105,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Israel
- { 8, 1, 109,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Jordan
- { 8, 1, 115,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Kuwait
- { 8, 1, 119,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Lebanon
- { 8, 1, 122,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Libya
- { 8, 1, 136,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Mauritania
- { 8, 1, 145,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Morocco
- { 8, 1, 162,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Oman
- { 8, 1, 165,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Palestinian Territories
- { 8, 1, 175,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Qatar
- { 8, 1, 186,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Saudi Arabia
- { 8, 1, 194,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Somalia
- { 8, 1, 201,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Sudan
- { 8, 1, 207,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Syria
- { 8, 1, 216,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Tunisia
- { 8, 1, 223,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/United Arab Emirates
- { 8, 1, 236,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Western Sahara
- { 8, 1, 237,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/Yemen
- { 8, 1, 254,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/South Sudan
- { 8, 1, 260,{ 317,97 },{ 317,97 },{ 414,27 },{ 317,97 },{ 317,97 },{ 414,27 }}, // Arabic/Arabic/World
- { 9, 10, 11,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Armenian/Armenian/Armenia
- { 10, 11, 100,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Assamese/Bengali/India
- { 12, 7, 15,{ 441,72 },{ 513,111 },{ 215,27 },{ 441,72 },{ 513,111 },{ 215,27 }}, // Azerbaijani/Latin/Azerbaijan
- { 12, 1, 102,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Azerbaijani/Arabic/Iran
- { 12, 2, 15,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Azerbaijani/Cyrillic/Azerbaijan
- { 13, 2, 178,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Bashkir/Cyrillic/Russia
- { 14, 7, 197,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Basque/Latin/Spain
- { 15, 11, 18,{ 624,105 },{ 624,105 },{ 729,27 },{ 624,105 },{ 624,105 },{ 729,27 }}, // Bengali/Bengali/Bangladesh
- { 15, 11, 100,{ 624,105 },{ 624,105 },{ 729,27 },{ 624,105 },{ 624,105 },{ 729,27 }}, // Bengali/Bengali/India
- { 16, 31, 25,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Dzongkha/Tibetan/Bhutan
- { 19, 7, 74,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Breton/Latin/France
- { 20, 2, 33,{ 0,79 },{ 756,97 },{ 215,27 },{ 0,79 },{ 756,97 },{ 215,27 }}, // Bulgarian/Cyrillic/Bulgaria
- { 21, 25, 147,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Burmese/Myanmar/Myanmar
- { 22, 2, 20,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Belarusian/Cyrillic/Belarus
- { 23, 20, 36,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Khmer/Khmer/Cambodia
- { 24, 7, 197,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Catalan/Latin/Spain
- { 24, 7, 5,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Catalan/Latin/Andorra
- { 24, 7, 74,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Catalan/Latin/France
- { 24, 7, 106,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Catalan/Latin/Italy
- { 25, 5, 44,{ 853,39 },{ 892,38 },{ 215,27 },{ 853,39 },{ 892,38 },{ 215,27 }}, // Chinese/Simplified Han/China
- { 25, 5, 97,{ 853,39 },{ 892,38 },{ 215,27 },{ 853,39 },{ 892,38 },{ 215,27 }}, // Chinese/Simplified Han/Hong Kong
- { 25, 5, 126,{ 853,39 },{ 892,38 },{ 215,27 },{ 853,39 },{ 892,38 },{ 215,27 }}, // Chinese/Simplified Han/Macau
- { 25, 5, 190,{ 853,39 },{ 892,38 },{ 215,27 },{ 853,39 },{ 892,38 },{ 215,27 }}, // Chinese/Simplified Han/Singapore
- { 25, 6, 97,{ 930,72 },{ 930,72 },{ 215,27 },{ 930,72 },{ 930,72 },{ 215,27 }}, // Chinese/Traditional Han/Hong Kong
- { 25, 6, 126,{ 930,72 },{ 930,72 },{ 215,27 },{ 930,72 },{ 930,72 },{ 215,27 }}, // Chinese/Traditional Han/Macau
- { 25, 6, 208,{ 930,72 },{ 930,72 },{ 215,27 },{ 930,72 },{ 930,72 },{ 215,27 }}, // Chinese/Traditional Han/Taiwan
- { 26, 7, 74,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Corsican/Latin/France
- { 27, 7, 54,{ 0,79 },{ 79,107 },{ 1002,39 },{ 0,79 },{ 79,107 },{ 1002,39 }}, // Croatian/Latin/Croatia
- { 27, 7, 27,{ 0,79 },{ 79,107 },{ 1002,39 },{ 0,79 },{ 79,107 },{ 1002,39 }}, // Croatian/Latin/Bosnia And Herzegowina
- { 28, 7, 57,{ 1041,77 },{ 1118,130 },{ 215,27 },{ 1041,77 },{ 1118,130 },{ 215,27 }}, // Czech/Latin/Czech Republic
- { 29, 7, 58,{ 0,79 },{ 1248,107 },{ 215,27 },{ 0,79 },{ 1248,107 },{ 215,27 }}, // Danish/Latin/Denmark
- { 29, 7, 86,{ 0,79 },{ 1248,107 },{ 215,27 },{ 0,79 },{ 1248,107 },{ 215,27 }}, // Danish/Latin/Greenland
- { 30, 7, 151,{ 1355,84 },{ 1439,135 },{ 215,27 },{ 1355,84 },{ 1439,135 },{ 215,27 }}, // Dutch/Latin/Netherlands
- { 30, 7, 12,{ 1355,84 },{ 1439,135 },{ 215,27 },{ 1355,84 },{ 1439,135 },{ 215,27 }}, // Dutch/Latin/Aruba
- { 30, 7, 21,{ 1355,84 },{ 1439,135 },{ 215,27 },{ 1355,84 },{ 1439,135 },{ 215,27 }}, // Dutch/Latin/Belgium
- { 30, 7, 152,{ 1355,84 },{ 1439,135 },{ 215,27 },{ 1355,84 },{ 1439,135 },{ 215,27 }}, // Dutch/Latin/Cura Sao
- { 30, 7, 202,{ 1355,84 },{ 1439,135 },{ 215,27 },{ 1355,84 },{ 1439,135 },{ 215,27 }}, // Dutch/Latin/Suriname
- { 30, 7, 255,{ 1355,84 },{ 1439,135 },{ 215,27 },{ 1355,84 },{ 1439,135 },{ 215,27 }}, // Dutch/Latin/Bonaire
- { 30, 7, 256,{ 1355,84 },{ 1439,135 },{ 215,27 },{ 1355,84 },{ 1439,135 },{ 215,27 }}, // Dutch/Latin/Sint Maarten
- { 31, 7, 225,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/United States
- { 31, 3, 225,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Deseret/United States
- { 31, 7, 4,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/American Samoa
- { 31, 7, 7,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Anguilla
- { 31, 7, 9,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Antigua And Barbuda
- { 31, 7, 13,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Australia
- { 31, 7, 14,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Austria
- { 31, 7, 16,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Bahamas
- { 31, 7, 19,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Barbados
- { 31, 7, 21,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Belgium
- { 31, 7, 22,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Belize
- { 31, 7, 24,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Bermuda
- { 31, 7, 28,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Botswana
- { 31, 7, 31,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/British Indian Ocean Territory
- { 31, 7, 35,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Burundi
- { 31, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Cameroon
- { 31, 7, 38,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Canada
- { 31, 7, 40,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Cayman Islands
- { 31, 7, 45,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Christmas Island
- { 31, 7, 46,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Cocos Islands
- { 31, 7, 51,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Cook Islands
- { 31, 7, 56,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Cyprus
- { 31, 7, 58,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Denmark
- { 31, 7, 60,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Dominica
- { 31, 7, 67,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Eritrea
- { 31, 7, 70,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Falkland Islands
- { 31, 7, 72,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Fiji
- { 31, 7, 73,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Finland
- { 31, 7, 75,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Guernsey
- { 31, 7, 80,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Gambia
- { 31, 7, 82,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Germany
- { 31, 7, 83,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Ghana
- { 31, 7, 84,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Gibraltar
- { 31, 7, 87,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Grenada
- { 31, 7, 89,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Guam
- { 31, 7, 93,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Guyana
- { 31, 7, 97,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Hong Kong
- { 31, 7, 100,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/India
- { 31, 7, 104,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Ireland
- { 31, 7, 105,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Israel
- { 31, 7, 107,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Jamaica
- { 31, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Kenya
- { 31, 7, 112,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Kiribati
- { 31, 7, 120,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Lesotho
- { 31, 7, 121,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Liberia
- { 31, 7, 126,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Macau
- { 31, 7, 128,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Madagascar
- { 31, 7, 129,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Malawi
- { 31, 7, 130,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Malaysia
- { 31, 7, 133,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Malta
- { 31, 7, 134,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Marshall Islands
- { 31, 7, 137,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Mauritius
- { 31, 7, 140,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Micronesia
- { 31, 7, 144,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Montserrat
- { 31, 7, 148,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Namibia
- { 31, 7, 149,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Nauru
- { 31, 7, 151,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Netherlands
- { 31, 7, 154,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/New Zealand
- { 31, 7, 157,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Nigeria
- { 31, 7, 158,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Niue
- { 31, 7, 159,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Norfolk Island
- { 31, 7, 160,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Northern Mariana Islands
- { 31, 7, 163,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Pakistan
- { 31, 7, 164,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Palau
- { 31, 7, 167,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Papua New Guinea
- { 31, 7, 170,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Philippines
- { 31, 7, 171,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Pitcairn
- { 31, 7, 174,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Puerto Rico
- { 31, 7, 179,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Rwanda
- { 31, 7, 180,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Saint Kitts And Nevis
- { 31, 7, 181,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Saint Lucia
- { 31, 7, 182,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Saint Vincent And The Grenadines
- { 31, 7, 183,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Samoa
- { 31, 7, 188,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Seychelles
- { 31, 7, 189,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Sierra Leone
- { 31, 7, 190,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Singapore
- { 31, 7, 192,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Slovenia
- { 31, 7, 193,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Solomon Islands
- { 31, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/South Africa
- { 31, 7, 199,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Saint Helena
- { 31, 7, 201,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Sudan
- { 31, 7, 204,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Swaziland
- { 31, 7, 205,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Sweden
- { 31, 7, 206,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Switzerland
- { 31, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Tanzania
- { 31, 7, 213,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Tokelau
- { 31, 7, 214,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Tonga
- { 31, 7, 215,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Trinidad And Tobago
- { 31, 7, 219,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Turks And Caicos Islands
- { 31, 7, 220,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Tuvalu
- { 31, 7, 221,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Uganda
- { 31, 7, 223,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/United Arab Emirates
- { 31, 7, 224,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/United Kingdom
- { 31, 7, 226,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/United States Minor Outlying Islands
- { 31, 7, 229,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Vanuatu
- { 31, 7, 233,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/British Virgin Islands
- { 31, 7, 234,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/United States Virgin Islands
- { 31, 7, 239,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Zambia
- { 31, 7, 240,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Zimbabwe
- { 31, 7, 249,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Diego Garcia
- { 31, 7, 251,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Isle Of Man
- { 31, 7, 252,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Jersey
- { 31, 7, 254,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/South Sudan
- { 31, 7, 256,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Sint Maarten
- { 31, 7, 260,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/World
- { 31, 7, 261,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // English/Latin/Europe
- { 32, 7, 260,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Esperanto/Latin/World
- { 33, 7, 68,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Estonian/Latin/Estonia
- { 34, 7, 71,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Faroese/Latin/Faroe Islands
- { 34, 7, 58,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Faroese/Latin/Denmark
- { 36, 7, 73,{ 0,79 },{ 1574,130 },{ 215,27 },{ 0,79 },{ 1574,130 },{ 215,27 }}, // Finnish/Latin/Finland
- { 37, 7, 74,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/France
- { 37, 7, 3,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Algeria
- { 37, 7, 21,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Belgium
- { 37, 7, 23,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Benin
- { 37, 7, 34,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Burkina Faso
- { 37, 7, 35,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Burundi
- { 37, 7, 37,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Cameroon
- { 37, 7, 38,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Canada
- { 37, 7, 41,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Central African Republic
- { 37, 7, 42,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Chad
- { 37, 7, 48,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Comoros
- { 37, 7, 49,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Congo Kinshasa
- { 37, 7, 50,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Congo Brazzaville
- { 37, 7, 53,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Ivory Coast
- { 37, 7, 59,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Djibouti
- { 37, 7, 66,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Equatorial Guinea
- { 37, 7, 76,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/French Guiana
- { 37, 7, 77,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/French Polynesia
- { 37, 7, 79,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Gabon
- { 37, 7, 88,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Guadeloupe
- { 37, 7, 91,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Guinea
- { 37, 7, 94,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Haiti
- { 37, 7, 125,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Luxembourg
- { 37, 7, 128,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Madagascar
- { 37, 7, 132,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Mali
- { 37, 7, 135,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Martinique
- { 37, 7, 136,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Mauritania
- { 37, 7, 137,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Mauritius
- { 37, 7, 138,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Mayotte
- { 37, 7, 142,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Monaco
- { 37, 7, 145,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Morocco
- { 37, 7, 153,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/New Caledonia
- { 37, 7, 156,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Niger
- { 37, 7, 176,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Reunion
- { 37, 7, 179,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Rwanda
- { 37, 7, 187,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Senegal
- { 37, 7, 188,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Seychelles
- { 37, 7, 200,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Saint Pierre And Miquelon
- { 37, 7, 206,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Switzerland
- { 37, 7, 207,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Syria
- { 37, 7, 212,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Togo
- { 37, 7, 216,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Tunisia
- { 37, 7, 229,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Vanuatu
- { 37, 7, 235,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Wallis And Futuna Islands
- { 37, 7, 244,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Saint Barthelemy
- { 37, 7, 245,{ 1704,91 },{ 1795,140 },{ 215,27 },{ 1935,91 },{ 1795,140 },{ 215,27 }}, // French/Latin/Saint Martin
- { 38, 7, 151,{ 1355,84 },{ 1439,135 },{ 215,27 },{ 1355,84 },{ 1439,135 },{ 215,27 }}, // Western Frisian/Latin/Netherlands
- { 39, 7, 224,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Gaelic/Latin/United Kingdom
- { 40, 7, 197,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Galician/Latin/Spain
- { 41, 15, 81,{ 2026,74 },{ 2100,125 },{ 215,27 },{ 2026,74 },{ 2100,125 },{ 215,27 }}, // Georgian/Georgian/Georgia
- { 42, 7, 82,{ 0,79 },{ 2225,117 },{ 215,27 },{ 0,79 },{ 2225,117 },{ 215,27 }}, // German/Latin/Germany
- { 42, 7, 14,{ 0,79 },{ 2225,117 },{ 215,27 },{ 0,79 },{ 2225,117 },{ 215,27 }}, // German/Latin/Austria
- { 42, 7, 21,{ 0,79 },{ 2225,117 },{ 215,27 },{ 0,79 },{ 2225,117 },{ 215,27 }}, // German/Latin/Belgium
- { 42, 7, 106,{ 0,79 },{ 2225,117 },{ 215,27 },{ 0,79 },{ 2225,117 },{ 215,27 }}, // German/Latin/Italy
- { 42, 7, 123,{ 0,79 },{ 2225,117 },{ 215,27 },{ 0,79 },{ 2225,117 },{ 215,27 }}, // German/Latin/Liechtenstein
- { 42, 7, 125,{ 0,79 },{ 2225,117 },{ 215,27 },{ 0,79 },{ 2225,117 },{ 215,27 }}, // German/Latin/Luxembourg
- { 42, 7, 206,{ 0,79 },{ 2225,117 },{ 215,27 },{ 0,79 },{ 2225,117 },{ 215,27 }}, // German/Latin/Switzerland
- { 43, 16, 85,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Greek/Greek/Greece
- { 43, 16, 56,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Greek/Greek/Cyprus
- { 44, 7, 86,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Greenlandic/Latin/Greenland
- { 45, 7, 168,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Guarani/Latin/Paraguay
- { 46, 17, 100,{ 2342,75 },{ 2417,99 },{ 215,27 },{ 2342,75 },{ 2417,99 },{ 215,27 }}, // Gujarati/Gujarati/India
- { 47, 7, 157,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Hausa/Latin/Nigeria
- { 47, 1, 157,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Hausa/Arabic/Nigeria
- { 47, 7, 83,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Hausa/Latin/Ghana
- { 47, 7, 156,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Hausa/Latin/Niger
- { 48, 18, 105,{ 2516,96 },{ 2612,117 },{ 215,27 },{ 2516,96 },{ 2729,117 },{ 215,27 }}, // Hebrew/Hebrew/Israel
- { 49, 13, 100,{ 0,79 },{ 2846,109 },{ 215,27 },{ 0,79 },{ 2846,109 },{ 215,27 }}, // Hindi/Devanagari/India
- { 50, 7, 98,{ 2955,77 },{ 3032,100 },{ 215,27 },{ 2955,77 },{ 3132,128 },{ 215,27 }}, // Hungarian/Latin/Hungary
- { 51, 7, 99,{ 3260,79 },{ 1248,107 },{ 215,27 },{ 3260,79 },{ 1248,107 },{ 215,27 }}, // Icelandic/Latin/Iceland
- { 52, 7, 101,{ 3339,87 },{ 3426,110 },{ 215,27 },{ 3339,87 },{ 3426,110 },{ 215,27 }}, // Indonesian/Latin/Indonesia
- { 53, 7, 260,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Interlingua/Latin/World
- { 55, 44, 38,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Inuktitut/Canadian Aboriginal/Canada
- { 55, 7, 38,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Inuktitut/Latin/Canada
- { 57, 7, 104,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Irish/Latin/Ireland
- { 57, 7, 224,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Irish/Latin/United Kingdom
- { 58, 7, 106,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Italian/Latin/Italy
- { 58, 7, 184,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Italian/Latin/San Marino
- { 58, 7, 206,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Italian/Latin/Switzerland
- { 58, 7, 230,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Italian/Latin/Vatican City State
- { 59, 19, 108,{ 3536,98 },{ 3536,98 },{ 215,27 },{ 3536,98 },{ 3536,98 },{ 215,27 }}, // Japanese/Japanese/Japan
- { 60, 7, 101,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Javanese/Latin/Indonesia
- { 61, 21, 100,{ 3634,80 },{ 3714,101 },{ 215,27 },{ 3634,80 },{ 3714,101 },{ 215,27 }}, // Kannada/Kannada/India
- { 62, 1, 100,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kashmiri/Arabic/India
- { 63, 2, 110,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kazakh/Cyrillic/Kazakhstan
- { 64, 7, 179,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kinyarwanda/Latin/Rwanda
- { 65, 2, 116,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kirghiz/Cyrillic/Kyrgyzstan
- { 66, 22, 114,{ 0,79 },{ 3815,70 },{ 215,27 },{ 0,79 },{ 3815,70 },{ 215,27 }}, // Korean/Korean/South Korea
- { 66, 22, 113,{ 0,79 },{ 3815,70 },{ 215,27 },{ 0,79 },{ 3815,70 },{ 215,27 }}, // Korean/Korean/North Korea
- { 67, 7, 217,{ 0,79 },{ 3885,110 },{ 215,27 },{ 0,79 },{ 3885,110 },{ 215,27 }}, // Kurdish/Latin/Turkey
- { 68, 7, 35,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Rundi/Latin/Burundi
- { 69, 23, 117,{ 3995,76 },{ 4071,96 },{ 215,27 },{ 4167,78 },{ 4071,96 },{ 215,27 }}, // Lao/Lao/Laos
- { 71, 7, 118,{ 0,79 },{ 4245,109 },{ 215,27 },{ 0,79 },{ 4245,109 },{ 215,27 }}, // Latvian/Latin/Latvia
- { 72, 7, 49,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Lingala/Latin/Congo Kinshasa
- { 72, 7, 6,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Lingala/Latin/Angola
- { 72, 7, 41,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Lingala/Latin/Central African Republic
- { 72, 7, 50,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Lingala/Latin/Congo Brazzaville
- { 73, 7, 124,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Lithuanian/Latin/Lithuania
- { 74, 2, 127,{ 4354,72 },{ 4426,90 },{ 215,27 },{ 4354,72 },{ 4426,90 },{ 215,27 }}, // Macedonian/Cyrillic/Macedonia
- { 75, 7, 128,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Malagasy/Latin/Madagascar
- { 76, 7, 130,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Malay/Latin/Malaysia
- { 76, 1, 130,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Malay/Arabic/Malaysia
- { 76, 7, 32,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Malay/Latin/Brunei
- { 76, 7, 190,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Malay/Latin/Singapore
- { 77, 24, 100,{ 4516,98 },{ 4614,103 },{ 4717,27 },{ 4516,98 },{ 4744,103 },{ 4717,27 }}, // Malayalam/Malayalam/India
- { 78, 7, 133,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Maltese/Latin/Malta
- { 79, 7, 154,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Maori/Latin/New Zealand
- { 80, 13, 100,{ 4847,79 },{ 4926,88 },{ 5014,27 },{ 4847,79 },{ 4926,88 },{ 5014,27 }}, // Marathi/Devanagari/India
- { 82, 2, 143,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Mongolian/Cyrillic/Mongolia
- { 82, 8, 44,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Mongolian/Mongolian/China
- { 84, 13, 150,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Nepali/Devanagari/Nepal
- { 84, 13, 100,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Nepali/Devanagari/India
- { 85, 7, 161,{ 5041,79 },{ 5120,107 },{ 215,27 },{ 5227,79 },{ 5120,107 },{ 215,27 }}, // Norwegian Bokmal/Latin/Norway
- { 85, 7, 203,{ 5041,79 },{ 5120,107 },{ 215,27 },{ 5227,79 },{ 5120,107 },{ 215,27 }}, // Norwegian Bokmal/Latin/Svalbard And Jan Mayen Islands
- { 86, 7, 74,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Occitan/Latin/France
- { 87, 26, 100,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Oriya/Oriya/India
- { 88, 1, 1,{ 5306,74 },{ 5380,75 },{ 215,27 },{ 5455,74 },{ 5529,76 },{ 215,27 }}, // Pashto/Arabic/Afghanistan
- { 88, 1, 163,{ 5306,74 },{ 5605,80 },{ 215,27 },{ 5455,74 },{ 5685,81 },{ 215,27 }}, // Pashto/Arabic/Pakistan
- { 89, 1, 102,{ 5766,91 },{ 5766,91 },{ 5857,24 },{ 5881,93 },{ 5881,93 },{ 5857,24 }}, // Persian/Arabic/Iran
- { 89, 1, 1,{ 5766,91 },{ 5766,91 },{ 5857,24 },{ 5881,93 },{ 5881,93 },{ 5857,24 }}, // Persian/Arabic/Afghanistan
- { 90, 7, 172,{ 5974,78 },{ 6052,108 },{ 215,27 },{ 5974,78 },{ 6052,108 },{ 215,27 }}, // Polish/Latin/Poland
- { 91, 7, 30,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/Brazil
- { 91, 7, 6,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/Angola
- { 91, 7, 39,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/Cape Verde
- { 91, 7, 62,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/East Timor
- { 91, 7, 66,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/Equatorial Guinea
- { 91, 7, 92,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/Guinea Bissau
- { 91, 7, 125,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/Luxembourg
- { 91, 7, 126,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/Macau
- { 91, 7, 146,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/Mozambique
- { 91, 7, 173,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/Portugal
- { 91, 7, 185,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/Sao Tome And Principe
- { 91, 7, 206,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Portuguese/Latin/Switzerland
- { 92, 4, 100,{ 6160,78 },{ 6238,93 },{ 215,27 },{ 6160,78 },{ 6331,95 },{ 215,27 }}, // Punjabi/Gurmukhi/India
- { 92, 1, 163,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Punjabi/Arabic/Pakistan
- { 93, 7, 169,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Quechua/Latin/Peru
- { 93, 7, 26,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Quechua/Latin/Bolivia
- { 93, 7, 63,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Quechua/Latin/Ecuador
- { 94, 7, 206,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Romansh/Latin/Switzerland
- { 95, 7, 177,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Romanian/Latin/Romania
- { 95, 7, 141,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Romanian/Latin/Moldova
- { 96, 2, 178,{ 6426,80 },{ 6506,132 },{ 215,27 },{ 6426,80 },{ 6506,132 },{ 215,27 }}, // Russian/Cyrillic/Russia
- { 96, 2, 20,{ 6426,80 },{ 6506,132 },{ 215,27 },{ 6426,80 },{ 6506,132 },{ 215,27 }}, // Russian/Cyrillic/Belarus
- { 96, 2, 110,{ 6426,80 },{ 6506,132 },{ 215,27 },{ 6426,80 },{ 6506,132 },{ 215,27 }}, // Russian/Cyrillic/Kazakhstan
- { 96, 2, 116,{ 6426,80 },{ 6506,132 },{ 215,27 },{ 6426,80 },{ 6506,132 },{ 215,27 }}, // Russian/Cyrillic/Kyrgyzstan
- { 96, 2, 141,{ 6426,80 },{ 6506,132 },{ 215,27 },{ 6426,80 },{ 6506,132 },{ 215,27 }}, // Russian/Cyrillic/Moldova
- { 96, 2, 222,{ 6426,80 },{ 6506,132 },{ 215,27 },{ 6426,80 },{ 6506,132 },{ 215,27 }}, // Russian/Cyrillic/Ukraine
- { 98, 7, 41,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sango/Latin/Central African Republic
- { 99, 13, 100,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sanskrit/Devanagari/India
- { 100, 2, 243,{ 6638,70 },{ 6708,91 },{ 215,27 },{ 6638,70 },{ 6799,98 },{ 215,27 }}, // Serbian/Cyrillic/Serbia
- { 100, 2, 27,{ 6638,70 },{ 6708,91 },{ 215,27 },{ 6638,70 },{ 6799,98 },{ 215,27 }}, // Serbian/Cyrillic/Bosnia And Herzegowina
- { 100, 2, 242,{ 6638,70 },{ 6708,91 },{ 215,27 },{ 6638,70 },{ 6799,98 },{ 215,27 }}, // Serbian/Cyrillic/Montenegro
- { 100, 2, 257,{ 6638,70 },{ 6708,91 },{ 215,27 },{ 6638,70 },{ 6799,98 },{ 215,27 }}, // Serbian/Cyrillic/Kosovo
- { 100, 7, 27,{ 6897,73 },{ 6970,95 },{ 215,27 },{ 6897,73 },{ 7065,98 },{ 215,27 }}, // Serbian/Latin/Bosnia And Herzegowina
- { 100, 7, 242,{ 6897,73 },{ 6970,95 },{ 215,27 },{ 6897,73 },{ 7065,98 },{ 215,27 }}, // Serbian/Latin/Montenegro
- { 100, 7, 243,{ 6897,73 },{ 6970,95 },{ 215,27 },{ 6897,73 },{ 7065,98 },{ 215,27 }}, // Serbian/Latin/Serbia
- { 100, 7, 257,{ 6897,73 },{ 6970,95 },{ 215,27 },{ 6897,73 },{ 7065,98 },{ 215,27 }}, // Serbian/Latin/Kosovo
- { 101, 2, 81,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Ossetic/Cyrillic/Georgia
- { 101, 2, 178,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Ossetic/Cyrillic/Russia
- { 102, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Southern Sotho/Latin/South Africa
- { 103, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tswana/Latin/South Africa
- { 104, 7, 240,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Shona/Latin/Zimbabwe
- { 105, 1, 163,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sindhi/Arabic/Pakistan
- { 106, 32, 198,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sinhala/Sinhala/Sri Lanka
- { 107, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Swati/Latin/South Africa
- { 108, 7, 191,{ 7163,79 },{ 7242,136 },{ 215,27 },{ 7163,79 },{ 7242,136 },{ 215,27 }}, // Slovak/Latin/Slovakia
- { 109, 7, 192,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Slovenian/Latin/Slovenia
- { 110, 7, 194,{ 7378,75 },{ 7453,132 },{ 215,27 },{ 7585,79 },{ 7664,131 },{ 215,27 }}, // Somali/Latin/Somalia
- { 110, 7, 59,{ 7378,75 },{ 7453,132 },{ 215,27 },{ 7585,79 },{ 7664,131 },{ 215,27 }}, // Somali/Latin/Djibouti
- { 110, 7, 69,{ 7378,75 },{ 7453,132 },{ 215,27 },{ 7585,79 },{ 7664,131 },{ 215,27 }}, // Somali/Latin/Ethiopia
- { 110, 7, 111,{ 7378,75 },{ 7453,132 },{ 215,27 },{ 7585,79 },{ 7664,131 },{ 215,27 }}, // Somali/Latin/Kenya
- { 111, 7, 197,{ 5227,79 },{ 7795,107 },{ 215,27 },{ 5227,79 },{ 7795,107 },{ 215,27 }}, // Spanish/Latin/Spain
- { 111, 7, 10,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Argentina
- { 111, 7, 22,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Belize
- { 111, 7, 26,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Bolivia
- { 111, 7, 30,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Brazil
- { 111, 7, 43,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Chile
- { 111, 7, 47,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Colombia
- { 111, 7, 52,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Costa Rica
- { 111, 7, 55,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Cuba
- { 111, 7, 61,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Dominican Republic
- { 111, 7, 63,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Ecuador
- { 111, 7, 65,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/El Salvador
- { 111, 7, 66,{ 5227,79 },{ 7795,107 },{ 215,27 },{ 5227,79 },{ 7795,107 },{ 215,27 }}, // Spanish/Latin/Equatorial Guinea
- { 111, 7, 90,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Guatemala
- { 111, 7, 96,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Honduras
- { 111, 7, 139,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Mexico
- { 111, 7, 155,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Nicaragua
- { 111, 7, 166,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Panama
- { 111, 7, 168,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Paraguay
- { 111, 7, 169,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Peru
- { 111, 7, 170,{ 5227,79 },{ 7795,107 },{ 215,27 },{ 5227,79 },{ 7795,107 },{ 215,27 }}, // Spanish/Latin/Philippines
- { 111, 7, 174,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Puerto Rico
- { 111, 7, 225,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/United States
- { 111, 7, 227,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Uruguay
- { 111, 7, 231,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Venezuela
- { 111, 7, 238,{ 5227,79 },{ 7795,107 },{ 215,27 },{ 5227,79 },{ 7795,107 },{ 215,27 }}, // Spanish/Latin/Canary Islands
- { 111, 7, 246,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Spanish/Latin/Latin America
- { 111, 7, 250,{ 5227,79 },{ 7795,107 },{ 215,27 },{ 5227,79 },{ 7795,107 },{ 215,27 }}, // Spanish/Latin/Ceuta And Melilla
- { 112, 7, 101,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sundanese/Latin/Indonesia
- { 113, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Swahili/Latin/Tanzania
- { 113, 7, 49,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Swahili/Latin/Congo Kinshasa
- { 113, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Swahili/Latin/Kenya
- { 113, 7, 221,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Swahili/Latin/Uganda
- { 114, 7, 205,{ 0,79 },{ 7902,128 },{ 215,27 },{ 0,79 },{ 8030,128 },{ 215,27 }}, // Swedish/Latin/Sweden
- { 114, 7, 73,{ 0,79 },{ 7902,128 },{ 215,27 },{ 0,79 },{ 8030,128 },{ 215,27 }}, // Swedish/Latin/Finland
- { 114, 7, 248,{ 0,79 },{ 7902,128 },{ 215,27 },{ 0,79 },{ 8030,128 },{ 215,27 }}, // Swedish/Latin/Aland Islands
- { 115, 7, 106,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sardinian/Latin/Italy
- { 116, 2, 209,{ 8158,75 },{ 8233,111 },{ 215,27 },{ 8158,75 },{ 8344,111 },{ 215,27 }}, // Tajik/Cyrillic/Tajikistan
- { 117, 27, 100,{ 8455,73 },{ 8528,92 },{ 215,27 },{ 8455,73 },{ 8528,92 },{ 215,27 }}, // Tamil/Tamil/India
- { 117, 27, 130,{ 8455,73 },{ 8528,92 },{ 215,27 },{ 8455,73 },{ 8528,92 },{ 215,27 }}, // Tamil/Tamil/Malaysia
- { 117, 27, 190,{ 8455,73 },{ 8528,92 },{ 215,27 },{ 8455,73 },{ 8528,92 },{ 215,27 }}, // Tamil/Tamil/Singapore
- { 117, 27, 198,{ 8455,73 },{ 8528,92 },{ 215,27 },{ 8455,73 },{ 8528,92 },{ 215,27 }}, // Tamil/Tamil/Sri Lanka
- { 118, 2, 178,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tatar/Cyrillic/Russia
- { 119, 28, 100,{ 8620,75 },{ 8695,96 },{ 215,27 },{ 8620,75 },{ 79,107 },{ 215,27 }}, // Telugu/Telugu/India
- { 120, 30, 211,{ 8791,90 },{ 8881,103 },{ 215,27 },{ 8791,90 },{ 8881,103 },{ 215,27 }}, // Thai/Thai/Thailand
- { 121, 31, 44,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tibetan/Tibetan/China
- { 121, 31, 100,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tibetan/Tibetan/India
- { 122, 14, 69,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tigrinya/Ethiopic/Ethiopia
- { 122, 14, 67,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tigrinya/Ethiopic/Eritrea
- { 123, 7, 214,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tongan/Latin/Tonga
- { 124, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tsonga/Latin/South Africa
- { 125, 7, 217,{ 8984,84 },{ 9068,111 },{ 215,27 },{ 8984,84 },{ 9068,111 },{ 215,27 }}, // Turkish/Latin/Turkey
- { 125, 7, 56,{ 8984,84 },{ 9068,111 },{ 215,27 },{ 8984,84 },{ 9068,111 },{ 215,27 }}, // Turkish/Latin/Cyprus
- { 126, 7, 218,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Turkmen/Latin/Turkmenistan
- { 128, 1, 44,{ 9179,119 },{ 9179,119 },{ 215,27 },{ 9179,119 },{ 9179,119 },{ 215,27 }}, // Uighur/Arabic/China
- { 129, 2, 222,{ 9298,72 },{ 9370,104 },{ 215,27 },{ 9474,82 },{ 9370,104 },{ 215,27 }}, // Ukrainian/Cyrillic/Ukraine
- { 130, 1, 163,{ 9556,99 },{ 9655,97 },{ 215,27 },{ 9556,99 },{ 9655,97 },{ 215,27 }}, // Urdu/Arabic/Pakistan
- { 130, 1, 100,{ 9556,99 },{ 9655,97 },{ 215,27 },{ 9556,99 },{ 9655,97 },{ 215,27 }}, // Urdu/Arabic/India
- { 131, 7, 228,{ 9752,83 },{ 9835,123 },{ 215,27 },{ 9752,83 },{ 9835,123 },{ 215,27 }}, // Uzbek/Latin/Uzbekistan
- { 131, 1, 1,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Uzbek/Arabic/Afghanistan
- { 131, 2, 228,{ 0,79 },{ 9958,115 },{ 215,27 },{ 0,79 },{ 9958,115 },{ 215,27 }}, // Uzbek/Cyrillic/Uzbekistan
- { 132, 7, 232,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Vietnamese/Latin/Vietnam
- { 133, 7, 260,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Volapuk/Latin/World
- { 134, 7, 224,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Welsh/Latin/United Kingdom
- { 135, 7, 187,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Wolof/Latin/Senegal
- { 136, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Xhosa/Latin/South Africa
- { 137, 18, 260,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Yiddish/Hebrew/World
- { 138, 7, 157,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Yoruba/Latin/Nigeria
- { 138, 7, 23,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Yoruba/Latin/Benin
- { 140, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Zulu/Latin/South Africa
- { 141, 7, 161,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Norwegian Nynorsk/Latin/Norway
- { 142, 7, 27,{ 10073,75 },{ 10148,99 },{ 215,27 },{ 10073,75 },{ 10148,99 },{ 215,27 }}, // Bosnian/Latin/Bosnia And Herzegowina
- { 142, 2, 27,{ 6638,70 },{ 6708,91 },{ 215,27 },{ 6638,70 },{ 6799,98 },{ 215,27 }}, // Bosnian/Cyrillic/Bosnia And Herzegowina
- { 143, 29, 131,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Divehi/Thaana/Maldives
- { 144, 7, 251,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Manx/Latin/Isle Of Man
- { 145, 7, 224,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Cornish/Latin/United Kingdom
- { 146, 7, 83,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Akan/Latin/Ghana
- { 147, 13, 100,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Konkani/Devanagari/India
- { 148, 7, 83,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Ga/Latin/Ghana
- { 149, 7, 157,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Igbo/Latin/Nigeria
- { 150, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kamba/Latin/Kenya
- { 151, 33, 103,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Syriac/Syriac/Iraq
- { 152, 14, 67,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Blin/Ethiopic/Eritrea
- { 153, 14, 69,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Geez/Ethiopic/Ethiopia
- { 155, 7, 69,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sidamo/Latin/Ethiopia
- { 156, 7, 157,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Atsam/Latin/Nigeria
- { 157, 14, 67,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tigre/Ethiopic/Eritrea
- { 158, 7, 157,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Jju/Latin/Nigeria
- { 159, 7, 106,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Friulian/Latin/Italy
- { 160, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Venda/Latin/South Africa
- { 161, 7, 83,{ 10247,48 },{ 10295,87 },{ 215,27 },{ 10247,48 },{ 10295,87 },{ 215,27 }}, // Ewe/Latin/Ghana
- { 161, 7, 212,{ 10247,48 },{ 10295,87 },{ 215,27 },{ 10247,48 },{ 10295,87 },{ 215,27 }}, // Ewe/Latin/Togo
- { 162, 14, 69,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Walamo/Ethiopic/Ethiopia
- { 163, 7, 225,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Hawaiian/Latin/United States
- { 164, 7, 157,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tyap/Latin/Nigeria
- { 165, 7, 129,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Nyanja/Latin/Malawi
- { 166, 7, 170,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Filipino/Latin/Philippines
- { 167, 7, 206,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Swiss German/Latin/Switzerland
- { 167, 7, 74,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Swiss German/Latin/France
- { 167, 7, 123,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Swiss German/Latin/Liechtenstein
- { 168, 34, 44,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sichuan Yi/Yi/China
- { 169, 7, 121,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kpelle/Latin/Liberia
- { 170, 7, 82,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Low German/Latin/Germany
- { 170, 7, 151,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Low German/Latin/Netherlands
- { 171, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // South Ndebele/Latin/South Africa
- { 172, 7, 195,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Northern Sotho/Latin/South Africa
- { 173, 7, 161,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Northern Sami/Latin/Norway
- { 173, 7, 73,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Northern Sami/Latin/Finland
- { 173, 7, 205,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Northern Sami/Latin/Sweden
- { 174, 7, 208,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Taroko/Latin/Taiwan
- { 175, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Gusii/Latin/Kenya
- { 176, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Taita/Latin/Kenya
- { 177, 7, 187,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Senegal
- { 177, 7, 34,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Burkina Faso
- { 177, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Cameroon
- { 177, 7, 80,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Gambia
- { 177, 7, 83,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Ghana
- { 177, 7, 91,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Guinea
- { 177, 7, 92,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Guinea Bissau
- { 177, 7, 121,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Liberia
- { 177, 7, 136,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Mauritania
- { 177, 7, 156,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Niger
- { 177, 7, 157,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Nigeria
- { 177, 7, 189,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Latin/Sierra Leone
- { 177, 134, 91,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Fulah/Adlam/Guinea
- { 178, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kikuyu/Latin/Kenya
- { 179, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Samburu/Latin/Kenya
- { 180, 7, 146,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sena/Latin/Mozambique
- { 181, 7, 240,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // North Ndebele/Latin/Zimbabwe
- { 182, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Rombo/Latin/Tanzania
- { 183, 9, 145,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tachelhit/Tifinagh/Morocco
- { 183, 7, 145,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tachelhit/Latin/Morocco
- { 184, 7, 3,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kabyle/Latin/Algeria
- { 185, 7, 221,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Nyankole/Latin/Uganda
- { 186, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Bena/Latin/Tanzania
- { 187, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Vunjo/Latin/Tanzania
- { 188, 7, 132,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Bambara/Latin/Mali
- { 188, 75, 132,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Bambara/Nko/Mali
- { 189, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Embu/Latin/Kenya
- { 190, 12, 225,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Cherokee/Cherokee/United States
- { 191, 7, 137,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Morisyen/Latin/Mauritius
- { 192, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Makonde/Latin/Tanzania
- { 193, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Langi/Latin/Tanzania
- { 194, 7, 221,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Ganda/Latin/Uganda
- { 195, 7, 239,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Bemba/Latin/Zambia
- { 196, 7, 39,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kabuverdianu/Latin/Cape Verde
- { 197, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Meru/Latin/Kenya
- { 198, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kalenjin/Latin/Kenya
- { 199, 7, 148,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Nama/Latin/Namibia
- { 200, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Machame/Latin/Tanzania
- { 201, 7, 82,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Colognian/Latin/Germany
- { 202, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Masai/Latin/Kenya
- { 202, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Masai/Latin/Tanzania
- { 203, 7, 221,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Soga/Latin/Uganda
- { 204, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Luyia/Latin/Kenya
- { 205, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Asu/Latin/Tanzania
- { 206, 7, 221,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Teso/Latin/Uganda
- { 206, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Teso/Latin/Kenya
- { 207, 7, 67,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Saho/Latin/Eritrea
- { 208, 7, 132,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Koyra Chiini/Latin/Mali
- { 209, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Rwa/Latin/Tanzania
- { 210, 7, 111,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Luo/Latin/Kenya
- { 211, 7, 221,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Chiga/Latin/Uganda
- { 212, 7, 145,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Central Morocco Tamazight/Latin/Morocco
- { 213, 7, 132,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Koyraboro Senni/Latin/Mali
- { 214, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Shambala/Latin/Tanzania
- { 215, 13, 100,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Bodo/Devanagari/India
- { 218, 2, 178,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Chechen/Cyrillic/Russia
- { 219, 2, 178,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Church/Cyrillic/Russia
- { 220, 2, 178,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Chuvash/Cyrillic/Russia
- { 230, 7, 49,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Luba Katanga/Latin/Congo Kinshasa
- { 231, 7, 125,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Luxembourgish/Latin/Luxembourg
- { 236, 7, 21,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Walloon/Latin/Belgium
- { 237, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Aghem/Latin/Cameroon
- { 238, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Basaa/Latin/Cameroon
- { 239, 7, 156,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Zarma/Latin/Niger
- { 240, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Duala/Latin/Cameroon
- { 241, 7, 187,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Jola Fonyi/Latin/Senegal
- { 242, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Ewondo/Latin/Cameroon
- { 243, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Bafia/Latin/Cameroon
- { 244, 7, 146,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Makhuwa Meetto/Latin/Mozambique
- { 245, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Mundang/Latin/Cameroon
- { 246, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kwasio/Latin/Cameroon
- { 247, 7, 254,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Nuer/Latin/South Sudan
- { 248, 2, 178,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sakha/Cyrillic/Russia
- { 249, 7, 210,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sangu/Latin/Tanzania
- { 251, 7, 156,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tasawaq/Latin/Niger
- { 252, 35, 121,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Vai/Vai/Liberia
- { 252, 7, 121,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Vai/Latin/Liberia
- { 253, 7, 206,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Walser/Latin/Switzerland
- { 254, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Yangben/Latin/Cameroon
- { 256, 7, 197,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 10382,143 },{ 215,27 }}, // Asturian/Latin/Spain
- { 257, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Ngomba/Latin/Cameroon
- { 258, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kako/Latin/Cameroon
- { 259, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Meta/Latin/Cameroon
- { 260, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Ngiemboon/Latin/Cameroon
- { 261, 7, 197,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Aragonese/Latin/Spain
- { 290, 11, 100,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Manipuri/Bengali/India
- { 309, 100, 232,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Tai Dam/Tai Viet/Vietnam
- { 312, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Akoose/Latin/Cameroon
- { 313, 7, 225,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Lakota/Latin/United States
- { 314, 9, 145,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Standard Moroccan Tamazight/Tifinagh/Morocco
- { 315, 7, 43,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Mapuche/Latin/Chile
- { 316, 1, 103,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Central Kurdish/Arabic/Iraq
- { 316, 1, 102,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Central Kurdish/Arabic/Iran
- { 317, 7, 82,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Lower Sorbian/Latin/Germany
- { 318, 7, 82,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Upper Sorbian/Latin/Germany
- { 319, 7, 37,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kenyang/Latin/Cameroon
- { 320, 7, 38,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Mohawk/Latin/Canada
- { 321, 75, 91,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Nko/Nko/Guinea
- { 322, 7, 260,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Prussian/Latin/World
- { 323, 7, 90,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Kiche/Latin/Guatemala
- { 324, 7, 205,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Southern Sami/Latin/Sweden
- { 325, 7, 205,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Lule Sami/Latin/Sweden
- { 326, 7, 73,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Inari Sami/Latin/Finland
- { 327, 7, 73,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Skolt Sami/Latin/Finland
- { 328, 7, 13,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Warlpiri/Latin/Australia
- { 346, 1, 102,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Mazanderani/Arabic/Iran
- { 349, 1, 102,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Northern Luri/Arabic/Iran
- { 349, 1, 103,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Northern Luri/Arabic/Iraq
- { 357, 6, 97,{ 930,72 },{ 930,72 },{ 215,27 },{ 930,72 },{ 930,72 },{ 215,27 }}, // Cantonese/Traditional Han/Hong Kong
- { 357, 5, 44,{ 10525,72 },{ 10525,72 },{ 215,27 },{ 10525,72 },{ 10525,72 },{ 215,27 }}, // Cantonese/Simplified Han/China
- { 358, 138, 225,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Osage/Osage/United States
- { 360, 7, 260,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Ido/Latin/World
- { 361, 7, 260,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Lojban/Latin/World
- { 362, 7, 106,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Sicilian/Latin/Italy
- { 363, 1, 102,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Southern Kurdish/Arabic/Iran
- { 364, 1, 163,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Western Balochi/Arabic/Pakistan
- { 365, 7, 170,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Cebuano/Latin/Philippines
- { 366, 2, 178,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Erzya/Cyrillic/Russia
- { 367, 7, 225,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Chickasaw/Latin/United States
- { 368, 7, 225,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Muscogee/Latin/United States
- { 369, 7, 172,{ 0,79 },{ 79,107 },{ 215,27 },{ 0,79 },{ 79,107 },{ 215,27 }}, // Silesian/Latin/Poland
- { 0, 0, 0,{ 0,0},{ 0,0},{ 0,0},{ 0,0},{ 0,0},{ 0,0}}, // trailing zeros
+ // lang script terr sLong long sShrt short sNarw narow Sizes...
+ { 1, 0, 0, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// C/AnyScript/AnyCountry
+ { 3, 7, 69, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Oromo/Latin/Ethiopia
+ { 3, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Oromo/Latin/Kenya
+ { 4, 7, 69, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Afar/Latin/Ethiopia
+ { 5, 7, 195, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Afrikaans/Latin/South Africa
+ { 5, 7, 148, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Afrikaans/Latin/Namibia
+ { 6, 7, 2, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Albanian/Latin/Albania
+ { 6, 7, 127, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Albanian/Latin/Macedonia
+ { 6, 7, 257, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Albanian/Latin/Kosovo
+ { 7, 14, 69, 210, 210, 106, 106, 184, 184, 74, 74, 78, 78, 26, 26 },// Amharic/Ethiopic/Ethiopia
+ { 8, 1, 64, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Egypt
+ { 8, 1, 3, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Algeria
+ { 8, 1, 17, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Bahrain
+ { 8, 1, 42, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Chad
+ { 8, 1, 48, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Comoros
+ { 8, 1, 59, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Djibouti
+ { 8, 1, 67, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Eritrea
+ { 8, 1, 103, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Iraq
+ { 8, 1, 105, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Israel
+ { 8, 1, 109, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Jordan
+ { 8, 1, 115, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Kuwait
+ { 8, 1, 119, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Lebanon
+ { 8, 1, 122, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Libya
+ { 8, 1, 136, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Mauritania
+ { 8, 1, 145, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Morocco
+ { 8, 1, 162, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Oman
+ { 8, 1, 165, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Palestinian Territories
+ { 8, 1, 175, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Qatar
+ { 8, 1, 186, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Saudi Arabia
+ { 8, 1, 194, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Somalia
+ { 8, 1, 201, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Sudan
+ { 8, 1, 207, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Syria
+ { 8, 1, 216, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Tunisia
+ { 8, 1, 223, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/United Arab Emirates
+ { 8, 1, 236, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Western Sahara
+ { 8, 1, 237, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/Yemen
+ { 8, 1, 254, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/South Sudan
+ { 8, 1, 260, 284, 284, 284, 284, 380, 380, 96, 96, 96, 96, 26, 26 },// Arabic/Arabic/World
+ { 9, 10, 11, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Armenian/Armenian/Armenia
+ { 10, 11, 100, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Assamese/Bengali/India
+ { 12, 7, 15, 406, 406, 516, 516, 184, 184,110,110, 71, 71, 26, 26 },// Azerbaijani/Latin/Azerbaijan
+ { 12, 1, 102, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Azerbaijani/Arabic/Iran
+ { 12, 2, 15, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Azerbaijani/Cyrillic/Azerbaijan
+ { 13, 2, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bashkir/Cyrillic/Russia
+ { 14, 7, 197, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Basque/Latin/Spain
+ { 15, 11, 18, 587, 587, 587, 587, 691, 691,104,104,104,104, 26, 26 },// Bengali/Bengali/Bangladesh
+ { 15, 11, 100, 587, 587, 587, 587, 691, 691,104,104,104,104, 26, 26 },// Bengali/Bengali/India
+ { 16, 31, 25, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Dzongkha/Tibetan/Bhutan
+ { 19, 7, 74, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Breton/Latin/France
+ { 20, 2, 33, 717, 717, 106, 106, 184, 184, 96, 96, 78, 78, 26, 26 },// Bulgarian/Cyrillic/Bulgaria
+ { 21, 25, 147, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Burmese/Myanmar/Myanmar
+ { 22, 2, 20, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Belarusian/Cyrillic/Belarus
+ { 23, 20, 36, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Khmer/Khmer/Cambodia
+ { 24, 7, 197, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Catalan/Latin/Spain
+ { 24, 7, 5, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Catalan/Latin/Andorra
+ { 24, 7, 74, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Catalan/Latin/France
+ { 24, 7, 106, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Catalan/Latin/Italy
+ { 25, 5, 44, 813, 813, 850, 850, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/China
+ { 25, 5, 97, 813, 813, 850, 850, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Hong Kong
+ { 25, 5, 126, 813, 813, 850, 850, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Macau
+ { 25, 5, 190, 813, 813, 850, 850, 184, 184, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Singapore
+ { 25, 6, 97, 888, 888, 888, 888, 184, 184, 71, 71, 71, 71, 26, 26 },// Chinese/Traditional Han/Hong Kong
+ { 25, 6, 126, 888, 888, 888, 888, 184, 184, 71, 71, 71, 71, 26, 26 },// Chinese/Traditional Han/Macau
+ { 25, 6, 208, 888, 888, 888, 888, 184, 184, 71, 71, 71, 71, 26, 26 },// Chinese/Traditional Han/Taiwan
+ { 26, 7, 74, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Corsican/Latin/France
+ { 27, 7, 54, 0, 0, 106, 106, 959, 959,106,106, 78, 78, 38, 38 },// Croatian/Latin/Croatia
+ { 27, 7, 27, 0, 0, 106, 106, 959, 959,106,106, 78, 78, 38, 38 },// Croatian/Latin/Bosnia And Herzegowina
+ { 28, 7, 57, 997, 997, 1126, 1126, 184, 184,129,129, 76, 76, 26, 26 },// Czech/Latin/Czech Republic
+ { 29, 7, 58, 1202, 1202, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Danish/Latin/Denmark
+ { 29, 7, 86, 1202, 1202, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Danish/Latin/Greenland
+ { 30, 7, 151, 1308, 1308, 1442, 1442, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Netherlands
+ { 30, 7, 12, 1308, 1308, 1442, 1442, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Aruba
+ { 30, 7, 21, 1308, 1308, 1442, 1442, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Belgium
+ { 30, 7, 152, 1308, 1308, 1442, 1442, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Cura Sao
+ { 30, 7, 202, 1308, 1308, 1442, 1442, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Suriname
+ { 30, 7, 255, 1308, 1308, 1442, 1442, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Bonaire
+ { 30, 7, 256, 1308, 1308, 1442, 1442, 184, 184,134,134, 83, 83, 26, 26 },// Dutch/Latin/Sint Maarten
+ { 31, 7, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/United States
+ { 31, 3, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Deseret/United States
+ { 31, 7, 4, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/American Samoa
+ { 31, 7, 7, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Anguilla
+ { 31, 7, 9, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Antigua And Barbuda
+ { 31, 7, 13, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Australia
+ { 31, 7, 14, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Austria
+ { 31, 7, 16, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Bahamas
+ { 31, 7, 19, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Barbados
+ { 31, 7, 21, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Belgium
+ { 31, 7, 22, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Belize
+ { 31, 7, 24, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Bermuda
+ { 31, 7, 28, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Botswana
+ { 31, 7, 31, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/British Indian Ocean Territory
+ { 31, 7, 35, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Burundi
+ { 31, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Cameroon
+ { 31, 7, 38, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Canada
+ { 31, 7, 40, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Cayman Islands
+ { 31, 7, 45, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Christmas Island
+ { 31, 7, 46, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Cocos Islands
+ { 31, 7, 51, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Cook Islands
+ { 31, 7, 56, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Cyprus
+ { 31, 7, 58, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Denmark
+ { 31, 7, 60, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Dominica
+ { 31, 7, 67, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Eritrea
+ { 31, 7, 70, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Falkland Islands
+ { 31, 7, 72, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Fiji
+ { 31, 7, 73, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Finland
+ { 31, 7, 75, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Guernsey
+ { 31, 7, 80, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Gambia
+ { 31, 7, 82, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Germany
+ { 31, 7, 83, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Ghana
+ { 31, 7, 84, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Gibraltar
+ { 31, 7, 87, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Grenada
+ { 31, 7, 89, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Guam
+ { 31, 7, 93, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Guyana
+ { 31, 7, 97, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Hong Kong
+ { 31, 7, 100, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/India
+ { 31, 7, 104, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Ireland
+ { 31, 7, 105, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Israel
+ { 31, 7, 107, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Jamaica
+ { 31, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Kenya
+ { 31, 7, 112, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Kiribati
+ { 31, 7, 120, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Lesotho
+ { 31, 7, 121, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Liberia
+ { 31, 7, 126, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Macau
+ { 31, 7, 128, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Madagascar
+ { 31, 7, 129, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Malawi
+ { 31, 7, 130, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Malaysia
+ { 31, 7, 133, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Malta
+ { 31, 7, 134, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Marshall Islands
+ { 31, 7, 137, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Mauritius
+ { 31, 7, 140, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Micronesia
+ { 31, 7, 144, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Montserrat
+ { 31, 7, 148, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Namibia
+ { 31, 7, 149, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Nauru
+ { 31, 7, 151, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Netherlands
+ { 31, 7, 154, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/New Zealand
+ { 31, 7, 157, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Nigeria
+ { 31, 7, 158, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Niue
+ { 31, 7, 159, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Norfolk Island
+ { 31, 7, 160, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Northern Mariana Islands
+ { 31, 7, 163, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Pakistan
+ { 31, 7, 164, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Palau
+ { 31, 7, 167, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Papua New Guinea
+ { 31, 7, 170, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Philippines
+ { 31, 7, 171, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Pitcairn
+ { 31, 7, 174, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Puerto Rico
+ { 31, 7, 179, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Rwanda
+ { 31, 7, 180, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Saint Kitts And Nevis
+ { 31, 7, 181, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Saint Lucia
+ { 31, 7, 182, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Saint Vincent And The Grenadines
+ { 31, 7, 183, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Samoa
+ { 31, 7, 188, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Seychelles
+ { 31, 7, 189, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Sierra Leone
+ { 31, 7, 190, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Singapore
+ { 31, 7, 192, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Slovenia
+ { 31, 7, 193, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Solomon Islands
+ { 31, 7, 195, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/South Africa
+ { 31, 7, 199, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Saint Helena
+ { 31, 7, 201, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Sudan
+ { 31, 7, 204, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Swaziland
+ { 31, 7, 205, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Sweden
+ { 31, 7, 206, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Switzerland
+ { 31, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Tanzania
+ { 31, 7, 213, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Tokelau
+ { 31, 7, 214, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Tonga
+ { 31, 7, 215, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Trinidad And Tobago
+ { 31, 7, 219, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Turks And Caicos Islands
+ { 31, 7, 220, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Tuvalu
+ { 31, 7, 221, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Uganda
+ { 31, 7, 223, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/United Arab Emirates
+ { 31, 7, 224, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/United Kingdom
+ { 31, 7, 226, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/United States Minor Outlying Islands
+ { 31, 7, 229, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Vanuatu
+ { 31, 7, 233, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/British Virgin Islands
+ { 31, 7, 234, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/United States Virgin Islands
+ { 31, 7, 239, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Zambia
+ { 31, 7, 240, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Zimbabwe
+ { 31, 7, 249, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Diego Garcia
+ { 31, 7, 251, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Isle Of Man
+ { 31, 7, 252, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Jersey
+ { 31, 7, 254, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/South Sudan
+ { 31, 7, 256, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Sint Maarten
+ { 31, 7, 260, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/World
+ { 31, 7, 261, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// English/Latin/Europe
+ { 32, 7, 260, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Esperanto/Latin/World
+ { 33, 7, 68, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Estonian/Latin/Estonia
+ { 34, 7, 71, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Faroese/Latin/Faroe Islands
+ { 34, 7, 58, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Faroese/Latin/Denmark
+ { 36, 7, 73, 1525, 1525, 106, 106, 184, 184,129,129, 78, 78, 26, 26 },// Finnish/Latin/Finland
+ { 37, 7, 74, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/France
+ { 37, 7, 3, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Algeria
+ { 37, 7, 21, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Belgium
+ { 37, 7, 23, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Benin
+ { 37, 7, 34, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Burkina Faso
+ { 37, 7, 35, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Burundi
+ { 37, 7, 37, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Cameroon
+ { 37, 7, 38, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Canada
+ { 37, 7, 41, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Central African Republic
+ { 37, 7, 42, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Chad
+ { 37, 7, 48, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Comoros
+ { 37, 7, 49, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Congo Kinshasa
+ { 37, 7, 50, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Congo Brazzaville
+ { 37, 7, 53, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Ivory Coast
+ { 37, 7, 59, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Djibouti
+ { 37, 7, 66, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Equatorial Guinea
+ { 37, 7, 76, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/French Guiana
+ { 37, 7, 77, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/French Polynesia
+ { 37, 7, 79, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Gabon
+ { 37, 7, 88, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Guadeloupe
+ { 37, 7, 91, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Guinea
+ { 37, 7, 94, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Haiti
+ { 37, 7, 125, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Luxembourg
+ { 37, 7, 128, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Madagascar
+ { 37, 7, 132, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mali
+ { 37, 7, 135, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Martinique
+ { 37, 7, 136, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mauritania
+ { 37, 7, 137, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mauritius
+ { 37, 7, 138, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Mayotte
+ { 37, 7, 142, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Monaco
+ { 37, 7, 145, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Morocco
+ { 37, 7, 153, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/New Caledonia
+ { 37, 7, 156, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Niger
+ { 37, 7, 176, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Reunion
+ { 37, 7, 179, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Rwanda
+ { 37, 7, 187, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Senegal
+ { 37, 7, 188, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Seychelles
+ { 37, 7, 200, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Saint Pierre And Miquelon
+ { 37, 7, 206, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Switzerland
+ { 37, 7, 207, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Syria
+ { 37, 7, 212, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Togo
+ { 37, 7, 216, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Tunisia
+ { 37, 7, 229, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Vanuatu
+ { 37, 7, 235, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Wallis And Futuna Islands
+ { 37, 7, 244, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Saint Barthelemy
+ { 37, 7, 245, 1654, 1654, 1793, 1883, 184, 184,139,139, 90, 90, 26, 26 },// French/Latin/Saint Martin
+ { 38, 7, 151, 1308, 1308, 1442, 1442, 184, 184,134,134, 83, 83, 26, 26 },// Western Frisian/Latin/Netherlands
+ { 39, 7, 224, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Gaelic/Latin/United Kingdom
+ { 40, 7, 197, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Galician/Latin/Spain
+ { 41, 15, 81, 1973, 1973, 2097, 2097, 184, 184,124,124, 73, 73, 26, 26 },// Georgian/Georgian/Georgia
+ { 42, 7, 82, 2170, 2170, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Germany
+ { 42, 7, 14, 2170, 2170, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Austria
+ { 42, 7, 21, 2170, 2170, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Belgium
+ { 42, 7, 106, 2170, 2170, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Italy
+ { 42, 7, 123, 2170, 2170, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Liechtenstein
+ { 42, 7, 125, 2170, 2170, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Luxembourg
+ { 42, 7, 206, 2170, 2170, 106, 106, 184, 184,116,116, 78, 78, 26, 26 },// German/Latin/Switzerland
+ { 43, 16, 85, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Greek/Greek/Greece
+ { 43, 16, 56, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Greek/Greek/Cyprus
+ { 44, 7, 86, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Greenlandic/Latin/Greenland
+ { 45, 7, 168, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Guarani/Latin/Paraguay
+ { 46, 17, 100, 2286, 2286, 2384, 2384, 184, 184, 98, 98, 74, 74, 26, 26 },// Gujarati/Gujarati/India
+ { 47, 7, 157, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hausa/Latin/Nigeria
+ { 47, 1, 157, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hausa/Arabic/Nigeria
+ { 47, 7, 83, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hausa/Latin/Ghana
+ { 47, 7, 156, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hausa/Latin/Niger
+ { 48, 18, 105, 2458, 2574, 2690, 2690, 184, 184,116,116, 95, 95, 26, 26 },// Hebrew/Hebrew/Israel
+ { 49, 13, 100, 2785, 2785, 106, 106, 184, 184,108,108, 78, 78, 26, 26 },// Hindi/Devanagari/India
+ { 50, 7, 98, 2893, 2992, 3119, 3119, 184, 184, 99,127, 76, 76, 26, 26 },// Hungarian/Latin/Hungary
+ { 51, 7, 99, 1202, 1202, 3195, 3195, 184, 184,106,106, 78, 78, 26, 26 },// Icelandic/Latin/Iceland
+ { 52, 7, 101, 3273, 3273, 3382, 3382, 184, 184,109,109, 86, 86, 26, 26 },// Indonesian/Latin/Indonesia
+ { 53, 7, 260, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Interlingua/Latin/World
+ { 55, 44, 38, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Inuktitut/Canadian Aboriginal/Canada
+ { 55, 7, 38, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Inuktitut/Latin/Canada
+ { 57, 7, 104, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Irish/Latin/Ireland
+ { 57, 7, 224, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Irish/Latin/United Kingdom
+ { 58, 7, 106, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Italian/Latin/Italy
+ { 58, 7, 184, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Italian/Latin/San Marino
+ { 58, 7, 206, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Italian/Latin/Switzerland
+ { 58, 7, 230, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Italian/Latin/Vatican City State
+ { 59, 19, 108, 3468, 3468, 3468, 3468, 184, 184, 97, 97, 97, 97, 26, 26 },// Japanese/Japanese/Japan
+ { 60, 7, 101, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Javanese/Latin/Indonesia
+ { 61, 21, 100, 3565, 3565, 3665, 3665, 184, 184,100,100, 79, 79, 26, 26 },// Kannada/Kannada/India
+ { 62, 1, 100, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kashmiri/Arabic/India
+ { 63, 2, 110, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kazakh/Cyrillic/Kazakhstan
+ { 64, 7, 179, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kinyarwanda/Latin/Rwanda
+ { 65, 2, 116, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kirghiz/Cyrillic/Kyrgyzstan
+ { 66, 22, 114, 3744, 3744, 106, 106, 184, 184, 69, 69, 78, 78, 26, 26 },// Korean/Korean/South Korea
+ { 66, 22, 113, 3744, 3744, 106, 106, 184, 184, 69, 69, 78, 78, 26, 26 },// Korean/Korean/North Korea
+ { 67, 7, 217, 3813, 3813, 106, 106, 184, 184,109,109, 78, 78, 26, 26 },// Kurdish/Latin/Turkey
+ { 68, 7, 35, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Rundi/Latin/Burundi
+ { 69, 23, 117, 3922, 3922, 4017, 4092, 184, 184, 95, 95, 75, 77, 26, 26 },// Lao/Lao/Laos
+ { 71, 7, 118, 4169, 4169, 106, 106, 184, 184,108,108, 78, 78, 26, 26 },// Latvian/Latin/Latvia
+ { 72, 7, 49, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lingala/Latin/Congo Kinshasa
+ { 72, 7, 6, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lingala/Latin/Angola
+ { 72, 7, 41, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lingala/Latin/Central African Republic
+ { 72, 7, 50, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lingala/Latin/Congo Brazzaville
+ { 73, 7, 124, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lithuanian/Latin/Lithuania
+ { 74, 2, 127, 4277, 4277, 4366, 4366, 184, 184, 89, 89, 71, 71, 26, 26 },// Macedonian/Cyrillic/Macedonia
+ { 75, 7, 128, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malagasy/Latin/Madagascar
+ { 76, 7, 130, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malay/Latin/Malaysia
+ { 76, 1, 130, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malay/Arabic/Malaysia
+ { 76, 7, 32, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malay/Latin/Brunei
+ { 76, 7, 190, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Malay/Latin/Singapore
+ { 77, 24, 100, 4437, 4539, 4641, 4641, 4738, 4738,102,102, 97, 97, 26, 26 },// Malayalam/Malayalam/India
+ { 78, 7, 133, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Maltese/Latin/Malta
+ { 79, 7, 154, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Maori/Latin/New Zealand
+ { 80, 13, 100, 4764, 4764, 4851, 4851, 4929, 4929, 87, 87, 78, 78, 26, 26 },// Marathi/Devanagari/India
+ { 82, 2, 143, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mongolian/Cyrillic/Mongolia
+ { 82, 8, 44, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mongolian/Mongolian/China
+ { 84, 13, 150, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nepali/Devanagari/Nepal
+ { 84, 13, 100, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nepali/Devanagari/India
+ { 85, 7, 161, 4955, 4955, 5061, 5139, 184, 184,106,106, 78, 78, 26, 26 },// Norwegian Bokmal/Latin/Norway
+ { 85, 7, 203, 4955, 4955, 5061, 5139, 184, 184,106,106, 78, 78, 26, 26 },// Norwegian Bokmal/Latin/Svalbard And Jan Mayen Islands
+ { 86, 7, 74, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Occitan/Latin/France
+ { 87, 26, 100, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Oriya/Oriya/India
+ { 88, 1, 1, 5217, 5291, 5366, 5439, 184, 184, 74, 75, 73, 73, 26, 26 },// Pashto/Arabic/Afghanistan
+ { 88, 1, 163, 5512, 5591, 5366, 5439, 184, 184, 79, 80, 73, 73, 26, 26 },// Pashto/Arabic/Pakistan
+ { 89, 1, 102, 5671, 5761, 5671, 5761, 5853, 5853, 90, 92, 90, 92, 23, 23 },// Persian/Arabic/Iran
+ { 89, 1, 1, 5671, 5761, 5671, 5761, 5853, 5853, 90, 92, 90, 92, 23, 23 },// Persian/Arabic/Afghanistan
+ { 90, 7, 172, 5876, 5876, 5983, 5983, 184, 184,107,107, 77, 77, 26, 26 },// Polish/Latin/Poland
+ { 91, 7, 30, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Brazil
+ { 91, 7, 6, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Angola
+ { 91, 7, 39, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Cape Verde
+ { 91, 7, 62, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/East Timor
+ { 91, 7, 66, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Equatorial Guinea
+ { 91, 7, 92, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Guinea Bissau
+ { 91, 7, 125, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Luxembourg
+ { 91, 7, 126, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Macau
+ { 91, 7, 146, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Mozambique
+ { 91, 7, 173, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Portugal
+ { 91, 7, 185, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Sao Tome And Principe
+ { 91, 7, 206, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Portuguese/Latin/Switzerland
+ { 92, 4, 100, 6060, 6152, 6246, 6246, 184, 184, 92, 94, 77, 77, 26, 26 },// Punjabi/Gurmukhi/India
+ { 92, 1, 163, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Punjabi/Arabic/Pakistan
+ { 93, 7, 169, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Quechua/Latin/Peru
+ { 93, 7, 26, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Quechua/Latin/Bolivia
+ { 93, 7, 63, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Quechua/Latin/Ecuador
+ { 94, 7, 206, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Romansh/Latin/Switzerland
+ { 95, 7, 177, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Romanian/Latin/Romania
+ { 95, 7, 141, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Romanian/Latin/Moldova
+ { 96, 2, 178, 6323, 6323, 6454, 6454, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Russia
+ { 96, 2, 20, 6323, 6323, 6454, 6454, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Belarus
+ { 96, 2, 110, 6323, 6323, 6454, 6454, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Kazakhstan
+ { 96, 2, 116, 6323, 6323, 6454, 6454, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Kyrgyzstan
+ { 96, 2, 141, 6323, 6323, 6454, 6454, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Moldova
+ { 96, 2, 222, 6323, 6323, 6454, 6454, 184, 184,131,131, 79, 79, 26, 26 },// Russian/Cyrillic/Ukraine
+ { 98, 7, 41, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sango/Latin/Central African Republic
+ { 99, 13, 100, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sanskrit/Devanagari/India
+ { 100, 2, 243, 6533, 6623, 6720, 6720, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Serbia
+ { 100, 7, 27, 6789, 6883, 6980, 6980, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Bosnia And Herzegowina
+ { 100, 7, 242, 6789, 6883, 6980, 6980, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Montenegro
+ { 100, 7, 243, 6789, 6883, 6980, 6980, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Serbia
+ { 100, 2, 27, 6533, 6623, 6720, 6720, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Bosnia And Herzegowina
+ { 100, 2, 242, 6533, 6623, 6720, 6720, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Montenegro
+ { 100, 2, 257, 6533, 6623, 6720, 6720, 184, 184, 90, 97, 69, 69, 26, 26 },// Serbian/Cyrillic/Kosovo
+ { 100, 7, 257, 6789, 6883, 6980, 6980, 184, 184, 94, 97, 72, 72, 26, 26 },// Serbian/Latin/Kosovo
+ { 101, 2, 81, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ossetic/Cyrillic/Georgia
+ { 101, 2, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ossetic/Cyrillic/Russia
+ { 102, 7, 195, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Southern Sotho/Latin/South Africa
+ { 103, 7, 195, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tswana/Latin/South Africa
+ { 104, 7, 240, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Shona/Latin/Zimbabwe
+ { 105, 1, 163, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sindhi/Arabic/Pakistan
+ { 106, 32, 198, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sinhala/Sinhala/Sri Lanka
+ { 107, 7, 195, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swati/Latin/South Africa
+ { 108, 7, 191, 7052, 7052, 7187, 7187, 184, 184,135,135, 78, 78, 26, 26 },// Slovak/Latin/Slovakia
+ { 109, 7, 192, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Slovenian/Latin/Slovenia
+ { 110, 7, 194, 7265, 7396, 7526, 7600, 184, 184,131,130, 74, 78, 26, 26 },// Somali/Latin/Somalia
+ { 110, 7, 59, 7265, 7396, 7526, 7600, 184, 184,131,130, 74, 78, 26, 26 },// Somali/Latin/Djibouti
+ { 110, 7, 69, 7265, 7396, 7526, 7600, 184, 184,131,130, 74, 78, 26, 26 },// Somali/Latin/Ethiopia
+ { 110, 7, 111, 7265, 7396, 7526, 7600, 184, 184,131,130, 74, 78, 26, 26 },// Somali/Latin/Kenya
+ { 111, 7, 197, 7678, 7678, 5139, 5139, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Spain
+ { 111, 7, 10, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Argentina
+ { 111, 7, 22, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Belize
+ { 111, 7, 26, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Bolivia
+ { 111, 7, 30, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Brazil
+ { 111, 7, 43, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Chile
+ { 111, 7, 47, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Colombia
+ { 111, 7, 52, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Costa Rica
+ { 111, 7, 55, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Cuba
+ { 111, 7, 61, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Dominican Republic
+ { 111, 7, 63, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Ecuador
+ { 111, 7, 65, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/El Salvador
+ { 111, 7, 66, 7678, 7678, 5139, 5139, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Equatorial Guinea
+ { 111, 7, 90, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Guatemala
+ { 111, 7, 96, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Honduras
+ { 111, 7, 139, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Mexico
+ { 111, 7, 155, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Nicaragua
+ { 111, 7, 166, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Panama
+ { 111, 7, 168, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Paraguay
+ { 111, 7, 169, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Peru
+ { 111, 7, 170, 7678, 7678, 5139, 5139, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Philippines
+ { 111, 7, 174, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Puerto Rico
+ { 111, 7, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/United States
+ { 111, 7, 227, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Uruguay
+ { 111, 7, 231, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Venezuela
+ { 111, 7, 238, 7678, 7678, 5139, 5139, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Canary Islands
+ { 111, 7, 246, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Latin America
+ { 111, 7, 250, 7678, 7678, 5139, 5139, 184, 184,106,106, 78, 78, 26, 26 },// Spanish/Latin/Ceuta And Melilla
+ { 112, 7, 101, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sundanese/Latin/Indonesia
+ { 113, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swahili/Latin/Tanzania
+ { 113, 7, 49, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swahili/Latin/Congo Kinshasa
+ { 113, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swahili/Latin/Kenya
+ { 113, 7, 221, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swahili/Latin/Uganda
+ { 114, 7, 205, 7784, 7911, 106, 106, 184, 184,127,127, 78, 78, 26, 26 },// Swedish/Latin/Sweden
+ { 114, 7, 73, 7784, 7911, 106, 106, 184, 184,127,127, 78, 78, 26, 26 },// Swedish/Latin/Finland
+ { 114, 7, 248, 7784, 7911, 106, 106, 184, 184,127,127, 78, 78, 26, 26 },// Swedish/Latin/Aland Islands
+ { 115, 7, 106, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sardinian/Latin/Italy
+ { 116, 2, 209, 8038, 8148, 8258, 8258, 184, 184,110,110, 74, 74, 26, 26 },// Tajik/Cyrillic/Tajikistan
+ { 117, 27, 100, 8332, 8332, 8423, 8423, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/India
+ { 117, 27, 130, 8332, 8332, 8423, 8423, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/Malaysia
+ { 117, 27, 190, 8332, 8332, 8423, 8423, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/Singapore
+ { 117, 27, 198, 8332, 8332, 8423, 8423, 184, 184, 91, 91, 72, 72, 26, 26 },// Tamil/Tamil/Sri Lanka
+ { 118, 2, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tatar/Cyrillic/Russia
+ { 119, 28, 100, 8495, 0, 8590, 8590, 184, 184, 95,106, 74, 74, 26, 26 },// Telugu/Telugu/India
+ { 120, 30, 211, 8664, 8664, 8766, 8766, 184, 184,102,102, 89, 89, 26, 26 },// Thai/Thai/Thailand
+ { 121, 31, 44, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tibetan/Tibetan/China
+ { 121, 31, 100, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tibetan/Tibetan/India
+ { 122, 14, 69, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tigrinya/Ethiopic/Ethiopia
+ { 122, 14, 67, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tigrinya/Ethiopic/Eritrea
+ { 123, 7, 214, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tongan/Latin/Tonga
+ { 124, 7, 195, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tsonga/Latin/South Africa
+ { 125, 7, 217, 8855, 8855, 8965, 8965, 184, 184,110,110, 83, 83, 26, 26 },// Turkish/Latin/Turkey
+ { 125, 7, 56, 8855, 8855, 8965, 8965, 184, 184,110,110, 83, 83, 26, 26 },// Turkish/Latin/Cyprus
+ { 126, 7, 218, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Turkmen/Latin/Turkmenistan
+ { 128, 1, 44, 9048, 9048, 9048, 9048, 184, 184,118,118,118,118, 26, 26 },// Uighur/Arabic/China
+ { 129, 2, 222, 9166, 9166, 9269, 9340, 184, 184,103,103, 71, 81, 26, 26 },// Ukrainian/Cyrillic/Ukraine
+ { 130, 1, 163, 9421, 9421, 9517, 9517, 184, 184, 96, 96, 98, 98, 26, 26 },// Urdu/Arabic/Pakistan
+ { 130, 1, 100, 9421, 9421, 9517, 9517, 184, 184, 96, 96, 98, 98, 26, 26 },// Urdu/Arabic/India
+ { 131, 7, 228, 9615, 9615, 9737, 9737, 184, 184,122,122, 82, 82, 26, 26 },// Uzbek/Latin/Uzbekistan
+ { 131, 1, 1, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Uzbek/Arabic/Afghanistan
+ { 131, 2, 228, 9819, 9819, 106, 106, 184, 184,114,114, 78, 78, 26, 26 },// Uzbek/Cyrillic/Uzbekistan
+ { 132, 7, 232, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Vietnamese/Latin/Vietnam
+ { 133, 7, 260, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Volapuk/Latin/World
+ { 134, 7, 224, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Welsh/Latin/United Kingdom
+ { 135, 7, 187, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Wolof/Latin/Senegal
+ { 136, 7, 195, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Xhosa/Latin/South Africa
+ { 137, 18, 260, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Yiddish/Hebrew/World
+ { 138, 7, 157, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Yoruba/Latin/Nigeria
+ { 138, 7, 23, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Yoruba/Latin/Benin
+ { 140, 7, 195, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Zulu/Latin/South Africa
+ { 141, 7, 161, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Norwegian Nynorsk/Latin/Norway
+ { 142, 7, 27, 9933, 9933,10031,10031, 184, 184, 98, 98, 74, 74, 26, 26 },// Bosnian/Latin/Bosnia And Herzegowina
+ { 142, 2, 27, 6533, 6623, 6720, 6720, 184, 184, 90, 97, 69, 69, 26, 26 },// Bosnian/Cyrillic/Bosnia And Herzegowina
+ { 143, 29, 131, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Divehi/Thaana/Maldives
+ { 144, 7, 251, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Manx/Latin/Isle Of Man
+ { 145, 7, 224, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Cornish/Latin/United Kingdom
+ { 146, 7, 83, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Akan/Latin/Ghana
+ { 147, 13, 100, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Konkani/Devanagari/India
+ { 148, 7, 83, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ga/Latin/Ghana
+ { 149, 7, 157, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Igbo/Latin/Nigeria
+ { 150, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kamba/Latin/Kenya
+ { 151, 33, 103, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Syriac/Syriac/Iraq
+ { 152, 14, 67, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Blin/Ethiopic/Eritrea
+ { 153, 14, 69, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Geez/Ethiopic/Ethiopia
+ { 155, 7, 69, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sidamo/Latin/Ethiopia
+ { 156, 7, 157, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Atsam/Latin/Nigeria
+ { 157, 14, 67, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tigre/Ethiopic/Eritrea
+ { 158, 7, 157, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Jju/Latin/Nigeria
+ { 159, 7, 106, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Friulian/Latin/Italy
+ { 160, 7, 195, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Venda/Latin/South Africa
+ { 161, 7, 83,10105,10105,10191,10191, 184, 184, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Ghana
+ { 161, 7, 212,10105,10105,10191,10191, 184, 184, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Togo
+ { 162, 14, 69, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Walamo/Ethiopic/Ethiopia
+ { 163, 7, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Hawaiian/Latin/United States
+ { 164, 7, 157, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tyap/Latin/Nigeria
+ { 165, 7, 129, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nyanja/Latin/Malawi
+ { 166, 7, 170, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Filipino/Latin/Philippines
+ { 167, 7, 206, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swiss German/Latin/Switzerland
+ { 167, 7, 74, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swiss German/Latin/France
+ { 167, 7, 123, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Swiss German/Latin/Liechtenstein
+ { 168, 34, 44, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sichuan Yi/Yi/China
+ { 169, 7, 121, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kpelle/Latin/Liberia
+ { 170, 7, 82, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Low German/Latin/Germany
+ { 170, 7, 151, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Low German/Latin/Netherlands
+ { 171, 7, 195, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// South Ndebele/Latin/South Africa
+ { 172, 7, 195, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Northern Sotho/Latin/South Africa
+ { 173, 7, 161, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Northern Sami/Latin/Norway
+ { 173, 7, 73, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Northern Sami/Latin/Finland
+ { 173, 7, 205, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Northern Sami/Latin/Sweden
+ { 174, 7, 208, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Taroko/Latin/Taiwan
+ { 175, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Gusii/Latin/Kenya
+ { 176, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Taita/Latin/Kenya
+ { 177, 7, 187, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Senegal
+ { 177, 7, 34, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Burkina Faso
+ { 177, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Cameroon
+ { 177, 7, 80, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Gambia
+ { 177, 7, 83, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Ghana
+ { 177, 7, 91, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Guinea
+ { 177, 7, 92, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Guinea Bissau
+ { 177, 7, 121, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Liberia
+ { 177, 7, 136, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Mauritania
+ { 177, 7, 156, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Niger
+ { 177, 7, 157, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Nigeria
+ { 177, 7, 189, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Latin/Sierra Leone
+ { 177, 134, 91, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Fulah/Adlam/Guinea
+ { 178, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kikuyu/Latin/Kenya
+ { 179, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Samburu/Latin/Kenya
+ { 180, 7, 146, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sena/Latin/Mozambique
+ { 181, 7, 240, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// North Ndebele/Latin/Zimbabwe
+ { 182, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Rombo/Latin/Tanzania
+ { 183, 9, 145, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tachelhit/Tifinagh/Morocco
+ { 183, 7, 145, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tachelhit/Latin/Morocco
+ { 184, 7, 3, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kabyle/Latin/Algeria
+ { 185, 7, 221, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nyankole/Latin/Uganda
+ { 186, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bena/Latin/Tanzania
+ { 187, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Vunjo/Latin/Tanzania
+ { 188, 7, 132, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bambara/Latin/Mali
+ { 188, 75, 132, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bambara/Nko/Mali
+ { 189, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Embu/Latin/Kenya
+ { 190, 12, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Cherokee/Cherokee/United States
+ { 191, 7, 137, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Morisyen/Latin/Mauritius
+ { 192, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Makonde/Latin/Tanzania
+ { 193, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Langi/Latin/Tanzania
+ { 194, 7, 221, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ganda/Latin/Uganda
+ { 195, 7, 239, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bemba/Latin/Zambia
+ { 196, 7, 39, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kabuverdianu/Latin/Cape Verde
+ { 197, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Meru/Latin/Kenya
+ { 198, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kalenjin/Latin/Kenya
+ { 199, 7, 148, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nama/Latin/Namibia
+ { 200, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Machame/Latin/Tanzania
+ { 201, 7, 82, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Colognian/Latin/Germany
+ { 202, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Masai/Latin/Kenya
+ { 202, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Masai/Latin/Tanzania
+ { 203, 7, 221, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Soga/Latin/Uganda
+ { 204, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Luyia/Latin/Kenya
+ { 205, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Asu/Latin/Tanzania
+ { 206, 7, 221, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Teso/Latin/Uganda
+ { 206, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Teso/Latin/Kenya
+ { 207, 7, 67, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Saho/Latin/Eritrea
+ { 208, 7, 132, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Koyra Chiini/Latin/Mali
+ { 209, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Rwa/Latin/Tanzania
+ { 210, 7, 111, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Luo/Latin/Kenya
+ { 211, 7, 221, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Chiga/Latin/Uganda
+ { 212, 7, 145, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Central Morocco Tamazight/Latin/Morocco
+ { 213, 7, 132, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Koyraboro Senni/Latin/Mali
+ { 214, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Shambala/Latin/Tanzania
+ { 215, 13, 100, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bodo/Devanagari/India
+ { 218, 2, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Chechen/Cyrillic/Russia
+ { 219, 2, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Church/Cyrillic/Russia
+ { 220, 2, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Chuvash/Cyrillic/Russia
+ { 230, 7, 49, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Luba Katanga/Latin/Congo Kinshasa
+ { 231, 7, 125, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Luxembourgish/Latin/Luxembourg
+ { 236, 7, 21, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Walloon/Latin/Belgium
+ { 237, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Aghem/Latin/Cameroon
+ { 238, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Basaa/Latin/Cameroon
+ { 239, 7, 156, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Zarma/Latin/Niger
+ { 240, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Duala/Latin/Cameroon
+ { 241, 7, 187, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Jola Fonyi/Latin/Senegal
+ { 242, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ewondo/Latin/Cameroon
+ { 243, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Bafia/Latin/Cameroon
+ { 244, 7, 146, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Makhuwa Meetto/Latin/Mozambique
+ { 245, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mundang/Latin/Cameroon
+ { 246, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kwasio/Latin/Cameroon
+ { 247, 7, 254, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nuer/Latin/South Sudan
+ { 248, 2, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sakha/Cyrillic/Russia
+ { 249, 7, 210, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sangu/Latin/Tanzania
+ { 251, 7, 156, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tasawaq/Latin/Niger
+ { 252, 35, 121, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Vai/Vai/Liberia
+ { 252, 7, 121, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Vai/Latin/Liberia
+ { 253, 7, 206, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Walser/Latin/Switzerland
+ { 254, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Yangben/Latin/Cameroon
+ { 256, 7, 197, 0,10238, 106, 106, 184, 184,106,142, 78, 78, 26, 26 },// Asturian/Latin/Spain
+ { 257, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ngomba/Latin/Cameroon
+ { 258, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kako/Latin/Cameroon
+ { 259, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Meta/Latin/Cameroon
+ { 260, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ngiemboon/Latin/Cameroon
+ { 261, 7, 197, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Aragonese/Latin/Spain
+ { 272, 46, 18,10380,10380, 106, 106,10601,10601,221,221, 78, 78, 41, 41 },// Chakma/Chakma/Bangladesh
+ { 272, 46, 100,10380,10380, 106, 106,10601,10601,221,221, 78, 78, 41, 41 },// Chakma/Chakma/India
+ { 290, 11, 100, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Manipuri/Bengali/India
+ { 309, 100, 232, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Tai Dam/Tai Viet/Vietnam
+ { 312, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Akoose/Latin/Cameroon
+ { 313, 7, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lakota/Latin/United States
+ { 314, 9, 145, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Standard Moroccan Tamazight/Tifinagh/Morocco
+ { 315, 7, 43, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mapuche/Latin/Chile
+ { 316, 1, 103, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Central Kurdish/Arabic/Iraq
+ { 316, 1, 102, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Central Kurdish/Arabic/Iran
+ { 317, 7, 82, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lower Sorbian/Latin/Germany
+ { 318, 7, 82, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Upper Sorbian/Latin/Germany
+ { 319, 7, 37, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kenyang/Latin/Cameroon
+ { 320, 7, 38, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mohawk/Latin/Canada
+ { 321, 75, 91, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Nko/Nko/Guinea
+ { 322, 7, 260, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Prussian/Latin/World
+ { 323, 7, 90, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Kiche/Latin/Guatemala
+ { 324, 7, 205, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Southern Sami/Latin/Sweden
+ { 325, 7, 205, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lule Sami/Latin/Sweden
+ { 326, 7, 73, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Inari Sami/Latin/Finland
+ { 327, 7, 73, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Skolt Sami/Latin/Finland
+ { 328, 7, 13, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Warlpiri/Latin/Australia
+ { 346, 1, 102, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Mazanderani/Arabic/Iran
+ { 349, 1, 102, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Northern Luri/Arabic/Iran
+ { 349, 1, 103, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Northern Luri/Arabic/Iraq
+ { 357, 6, 97, 888, 888, 888, 888, 184, 184, 71, 71, 71, 71, 26, 26 },// Cantonese/Traditional Han/Hong Kong
+ { 357, 5, 44,10642,10642,10642,10642, 184, 184, 71, 71, 71, 71, 26, 26 },// Cantonese/Simplified Han/China
+ { 358, 138, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Osage/Osage/United States
+ { 360, 7, 260, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Ido/Latin/World
+ { 361, 7, 260, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Lojban/Latin/World
+ { 362, 7, 106, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Sicilian/Latin/Italy
+ { 363, 1, 102, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Southern Kurdish/Arabic/Iran
+ { 364, 1, 163, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Western Balochi/Arabic/Pakistan
+ { 365, 7, 170, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Cebuano/Latin/Philippines
+ { 366, 2, 178, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Erzya/Cyrillic/Russia
+ { 367, 7, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Chickasaw/Latin/United States
+ { 368, 7, 225, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Muscogee/Latin/United States
+ { 369, 7, 172, 0, 0, 106, 106, 184, 184,106,106, 78, 78, 26, 26 },// Silesian/Latin/Poland
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },// trailing zeros
};
-static const ushort months_data[] = {
-0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62,
-0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b,
-0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x2e,
-0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x2e, 0x3b, 0x4d,
-0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20,
-0x49, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x2bb,
+static const char16_t months_data[] = {
+0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb,
+0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49,
+0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61,
+0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c,
+0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d,
+0x48, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e,
+0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x75,
+0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e,
+0x3b, 0x53, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb,
+0x6c, 0x2d, 0x48, 0x2e, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b,
+0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x1219, 0x1200, 0x1228, 0x121d, 0x3b, 0x1233, 0x1348, 0x122d, 0x3b, 0x1228,
+0x1262, 0x12d1, 0x120d, 0x20, 0x12a0, 0x12c8, 0x120d, 0x3b, 0x1228, 0x1262, 0x12d1, 0x120d, 0x20, 0x12a0, 0x12ba, 0x122d, 0x3b, 0x1300, 0x121b, 0x12f0,
+0x120d, 0x20, 0x12a0, 0x12c8, 0x120d, 0x3b, 0x1300, 0x121b, 0x12f0, 0x120d, 0x20, 0x12a0, 0x12ba, 0x122d, 0x3b, 0x1228, 0x1300, 0x1265, 0x3b, 0x123b,
+0x12a5, 0x1263, 0x1295, 0x3b, 0x1228, 0x1218, 0x12f3, 0x1295, 0x3b, 0x1238, 0x12cb, 0x120d, 0x3b, 0x12d9, 0x120d, 0x1242, 0x12f3, 0x1205, 0x3b, 0x12d9,
+0x120d, 0x1202, 0x1303, 0x1205, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x627, 0x644,
+0x623, 0x648, 0x644, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x627, 0x644, 0x622, 0x62e, 0x631, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x649,
+0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x649, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x649, 0x20, 0x627, 0x644, 0x622, 0x62e, 0x631, 0x629,
+0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627,
+0x644, 0x3b, 0x630, 0x648, 0x20, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x629, 0x3b, 0x630, 0x648, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x629,
+0x661, 0x3b, 0x662, 0x3b, 0x663, 0x3b, 0x664, 0x3b, 0x665, 0x3b, 0x666, 0x3b, 0x667, 0x3b, 0x668, 0x3b, 0x669, 0x3b, 0x661, 0x660,
+0x3b, 0x661, 0x661, 0x3b, 0x661, 0x662, 0x4d, 0x259, 0x68, 0x259, 0x72, 0x72, 0x259, 0x6d, 0x3b, 0x53, 0x259, 0x66, 0x259, 0x72,
+0x3b, 0x52, 0x259, 0x62, 0x69, 0xfc, 0x6c, 0x259, 0x76, 0x76, 0x259, 0x6c, 0x3b, 0x52, 0x259, 0x62, 0x69, 0xfc, 0x6c, 0x61,
+0x78, 0x131, 0x72, 0x3b, 0x43, 0x259, 0x6d, 0x61, 0x64, 0x69, 0x79, 0x259, 0x6c, 0x259, 0x76, 0x76, 0x259, 0x6c, 0x3b, 0x43,
+0x259, 0x6d, 0x61, 0x64, 0x69, 0x79, 0x259, 0x6c, 0x61, 0x78, 0x131, 0x72, 0x3b, 0x52, 0x259, 0x63, 0x259, 0x62, 0x3b, 0x15e,
+0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b, 0x15e, 0x259, 0x76, 0x76, 0x61, 0x6c, 0x3b,
+0x5a, 0x69, 0x6c, 0x71, 0x259, 0x64, 0x259, 0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x69, 0x63, 0x63, 0x259, 0x4d, 0x259, 0x68, 0x2e,
+0x3b, 0x53, 0x259, 0x66, 0x2e, 0x3b, 0x52, 0x259, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x259, 0x62, 0x2e, 0x20, 0x49, 0x49,
+0x3b, 0x43, 0x259, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x43, 0x259, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x259, 0x63, 0x2e,
+0x3b, 0x15e, 0x61, 0x62, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x15e, 0x259, 0x76, 0x2e, 0x3b, 0x5a, 0x69, 0x6c, 0x71,
+0x2e, 0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x2e, 0x9ae, 0x9b9, 0x9b0, 0x9b0, 0x9ae, 0x3b, 0x9b8, 0x9ab, 0x9b0, 0x3b, 0x9b0, 0x9ac, 0x9bf,
+0x989, 0x9b2, 0x20, 0x986, 0x989, 0x9af, 0x9bc, 0x9be, 0x9b2, 0x3b, 0x9b0, 0x9ac, 0x9bf, 0x989, 0x9b8, 0x20, 0x9b8, 0x9be, 0x9a8, 0x9bf,
+0x3b, 0x99c, 0x9ae, 0x9be, 0x9a6, 0x9bf, 0x989, 0x9b2, 0x20, 0x986, 0x989, 0x9af, 0x9bc, 0x9be, 0x9b2, 0x3b, 0x99c, 0x9ae, 0x9be, 0x9a6,
+0x9bf, 0x989, 0x9b8, 0x20, 0x9b8, 0x9be, 0x9a8, 0x9bf, 0x3b, 0x9b0, 0x99c, 0x9ac, 0x3b, 0x9b6, 0x9be, 0x2018, 0x9ac, 0x9be, 0x9a8, 0x3b,
+0x9b0, 0x9ae, 0x99c, 0x9be, 0x9a8, 0x3b, 0x9b6, 0x9be, 0x993, 0x9af, 0x9bc, 0x9be, 0x9b2, 0x3b, 0x99c, 0x9cd, 0x9ac, 0x9bf, 0x9b2, 0x995,
+0x9a6, 0x3b, 0x99c, 0x9cd, 0x9ac, 0x9bf, 0x9b2, 0x9b9, 0x99c, 0x9cd, 0x99c, 0x9e7, 0x3b, 0x9e8, 0x3b, 0x9e9, 0x3b, 0x9ea, 0x3b, 0x9eb,
+0x3b, 0x9ec, 0x3b, 0x9ed, 0x3b, 0x9ee, 0x3b, 0x9ef, 0x3b, 0x9e7, 0x9e6, 0x3b, 0x9e7, 0x9e7, 0x3b, 0x9e7, 0x9e8, 0x43c, 0x443, 0x445,
+0x430, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x440, 0x430, 0x431, 0x438, 0x2d, 0x31, 0x3b, 0x440, 0x430,
+0x431, 0x438, 0x2d, 0x32, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x2d, 0x31, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430,
+0x434, 0x430, 0x2d, 0x32, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x430, 0x431, 0x3b, 0x448, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440, 0x430,
+0x43c, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x430, 0x43b, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x41a, 0x430, 0x430,
+0x434, 0x430, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x445, 0x438, 0x434, 0x436, 0x430, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09,
+0x6708, 0x3b, 0x56db, 0x6708, 0x3b, 0x4e94, 0x6708, 0x3b, 0x516d, 0x6708, 0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b,
+0x5341, 0x6708, 0x3b, 0x5341, 0x4e00, 0x6708, 0x3b, 0x5341, 0x4e8c, 0x6708, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34,
+0x6708, 0x3b, 0x35, 0x6708, 0x3b, 0x36, 0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30, 0x6708,
+0x3b, 0x31, 0x31, 0x6708, 0x3b, 0x31, 0x32, 0x6708, 0x7a46, 0x54c8, 0x862d, 0x59c6, 0x6708, 0x3b, 0x8272, 0x6cd5, 0x723e, 0x6708, 0x3b, 0x8cf4,
+0x6bd4, 0x6708, 0x20, 0x49, 0x3b, 0x8cf4, 0x6bd4, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x4e3b, 0x99ac, 0x9054, 0x6708, 0x20, 0x49, 0x3b, 0x4e3b,
+0x99ac, 0x9054, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x8cf4, 0x54f2, 0x535c, 0x6708, 0x3b, 0x820d, 0x723e, 0x90a6, 0x6708, 0x3b, 0x8cf4, 0x8cb7, 0x4e39,
+0x6708, 0x3b, 0x9583, 0x74e6, 0x9b6f, 0x6708, 0x3b, 0x90fd, 0x723e, 0x5580, 0x723e, 0x5fb7, 0x6708, 0x3b, 0x90fd, 0x723e, 0x9ed1, 0x54f2, 0x6708, 0x31,
+0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e, 0x3b, 0x37, 0x2e, 0x3b,
+0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e, 0x6d, 0x75, 0x68,
+0x61, 0x72, 0x72, 0x65, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x65, 0x62, 0xed, 0x2019, 0x75, 0x20, 0x6c,
+0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x72, 0x65, 0x62, 0xed, 0x2019, 0x75, 0x20, 0x73, 0x2d, 0x73, 0xe1, 0x6e, 0xed,
+0x3b, 0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x61, 0x6c, 0x2d, 0xfa, 0x6c, 0xe1, 0x3b, 0x64, 0x17e, 0x75, 0x6d,
+0xe1, 0x64, 0xe1, 0x20, 0x61, 0x6c, 0x2d, 0xe1, 0x63, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x72, 0x65, 0x64, 0x17e, 0x65, 0x62,
+0x3b, 0x161, 0x61, 0x2019, 0x62, 0xe1, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x161, 0x61, 0x77, 0x77,
+0x61, 0x6c, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d, 0x68,
+0x69, 0x64, 0x17e, 0x64, 0x17e, 0x61, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x65, 0x62, 0x2e,
+0x20, 0x49, 0x3b, 0x72, 0x65, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x64,
+0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x65, 0x64, 0x2e, 0x3b, 0x161, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d,
+0x2e, 0x3b, 0x161, 0x61, 0x77, 0x2e, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d,
+0x68, 0x2e, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62,
+0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61,
+0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73,
+0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x77,
+0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb,
+0x6c, 0x2d, 0x48, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x6f, 0x65, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61,
+0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x61, 0x20, 0x61, 0x6c, 0x20, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x52,
+0x61, 0x62, 0x69, 0x2bb, 0x61, 0x20, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x4a, 0x6f, 0x65, 0x6d, 0x61,
+0x64, 0x2bb, 0x61, 0x6c, 0x20, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x4a, 0x6f, 0x65, 0x6d, 0x61, 0x64, 0x2bb, 0x61, 0x6c, 0x20,
+0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x6a, 0x61, 0x2bb, 0x61, 0x62, 0x61, 0x6e,
+0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x6a, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x6f, 0x65, 0x20,
+0x61, 0x6c, 0x20, 0x6b, 0x61, 0x2bb, 0x61, 0x62, 0x61, 0x3b, 0x44, 0x6f, 0x65, 0x20, 0x61, 0x6c, 0x20, 0x68, 0x69, 0x7a,
+0x6a, 0x61, 0x4d, 0x6f, 0x65, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b,
+0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x6f, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x6f, 0x65, 0x6d,
+0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x6a, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b,
+0x53, 0x6a, 0x61, 0x77, 0x2e, 0x3b, 0x44, 0x6f, 0x65, 0x20, 0x61, 0x6c, 0x20, 0x6b, 0x2e, 0x3b, 0x44, 0x6f, 0x65, 0x20,
+0x61, 0x6c, 0x20, 0x68, 0x2e, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b,
+0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019,
+0x20, 0x61, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d,
+0x75, 0x6c, 0x61, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x61,
+0x3b, 0x72, 0x61, 0x64, 0x17e, 0x61, 0x62, 0x3b, 0x161, 0x61, 0x2019, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64,
+0x61, 0x6e, 0x3b, 0x161, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x71, 0x61, 0x2019, 0x64,
+0x61, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x64, 0x17e, 0x61, 0x6d, 0x6f, 0x75, 0x68, 0x61, 0x72,
+0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x61, 0x20, 0x61, 0x6c, 0x20, 0x61,
+0x77, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x61, 0x20, 0x61, 0x74, 0x68, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b,
+0x6a, 0x6f, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x6c, 0x61, 0x3b, 0x6a, 0x6f, 0x75, 0x6d,
+0x61, 0x64, 0x61, 0x20, 0x61, 0x74, 0x68, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62,
+0x3b, 0x63, 0x68, 0x61, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x63, 0x68,
+0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x20, 0x61, 0x6c, 0x20, 0x71, 0x69, 0x60, 0x64, 0x61, 0x3b,
+0x64, 0x68, 0x6f, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x6d, 0x6f, 0x75, 0x68, 0x2e, 0x3b, 0x73,
+0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x61, 0x77, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x74, 0x68,
+0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x6f, 0x75, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x74, 0x68,
+0x2e, 0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x63, 0x68,
+0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e, 0x20, 0x71, 0x69, 0x2e, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e, 0x20,
+0x68, 0x69, 0x2e, 0x6d, 0x6f, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x61,
+0x77, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x74, 0x68, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x6f, 0x75,
+0x6c, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x74, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x63,
+0x68, 0x61, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x6f, 0x75,
+0x2e, 0x20, 0x71, 0x2e, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e, 0x20, 0x68, 0x2e, 0x10db, 0x10e3, 0x10f0, 0x10d0, 0x10e0, 0x10d0, 0x10db,
+0x10d8, 0x3b, 0x10e1, 0x10d0, 0x10e4, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x10d8, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10d5, 0x10d0,
+0x10da, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x10d8, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10ee, 0x10d8, 0x10e0, 0x10d8, 0x3b, 0x10ef, 0x10e3, 0x10db,
+0x10d0, 0x10d3, 0x10d0, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10ef, 0x10e3, 0x10db, 0x10d0, 0x10d3, 0x10d0, 0x20,
+0x10e3, 0x10da, 0x2d, 0x10d0, 0x10ee, 0x10d8, 0x10e0, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10ef, 0x10d0, 0x10d1, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0,
+0x10dc, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10db, 0x10d0, 0x10d3, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10d6,
+0x10e3, 0x10da, 0x2d, 0x10d9, 0x10d0, 0x10d0, 0x10d3, 0x10d0, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10f0, 0x10d8, 0x10ef, 0x10d0, 0x10db, 0x10e3, 0x10f0,
+0x2e, 0x3b, 0x10e1, 0x10d0, 0x10e4, 0x2e, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x2e, 0x20, 0x49, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x2e, 0x20, 0x49,
+0x49, 0x3b, 0x10ef, 0x10e3, 0x10db, 0x2e, 0x20, 0x49, 0x3b, 0x10ef, 0x10e3, 0x10db, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x10e0, 0x10d0, 0x10ef,
+0x2e, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x2e, 0x3b, 0x10e0, 0x10d0, 0x10db, 0x2e, 0x3b, 0x10e8, 0x10d0, 0x10d5, 0x2e, 0x3b, 0x10d6, 0x10e3, 0x10da,
+0x2d, 0x10d9, 0x2e, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10f0, 0x2e, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53,
+0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49,
+0x49, 0x3b, 0x44, 0x73, 0x63, 0x68, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x44, 0x73, 0x63, 0x68, 0x75, 0x6d,
+0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x64, 0x73, 0x63, 0x68, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x2bb,
0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b,
-0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48,
-0x69, 0x6a, 0x6a, 0x61, 0x68, 0x3b, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b,
-0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0x31, 0x33, 0x31, 0x3b, 0x32, 0x3b, 0x33,
-0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31,
-0x32, 0x3b, 0x1219, 0x1200, 0x1228, 0x121d, 0x3b, 0x1233, 0x1348, 0x122d, 0x3b, 0x1228, 0x1262, 0x12d1, 0x120d, 0x20, 0x12a0, 0x12c8, 0x120d, 0x3b,
-0x1228, 0x1262, 0x12d1, 0x120d, 0x20, 0x12a0, 0x12ba, 0x122d, 0x3b, 0x1300, 0x121b, 0x12f0, 0x120d, 0x20, 0x12a0, 0x12c8, 0x120d, 0x3b, 0x1300, 0x121b,
-0x12f0, 0x120d, 0x20, 0x12a0, 0x12ba, 0x122d, 0x3b, 0x1228, 0x1300, 0x1265, 0x3b, 0x123b, 0x12a5, 0x1263, 0x1295, 0x3b, 0x1228, 0x1218, 0x12f3, 0x1295,
-0x3b, 0x1238, 0x12cb, 0x120d, 0x3b, 0x12d9, 0x120d, 0x1242, 0x12f3, 0x1205, 0x3b, 0x12d9, 0x120d, 0x1202, 0x1303, 0x1205, 0x3b, 0x645, 0x62d, 0x631,
-0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x631, 0x628, 0x64a,
-0x639, 0x20, 0x627, 0x644, 0x622, 0x62e, 0x631, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x649, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x649,
-0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x649, 0x20, 0x627, 0x644, 0x622, 0x62e, 0x631, 0x629, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639,
-0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x648, 0x20, 0x627, 0x644,
-0x642, 0x639, 0x62f, 0x629, 0x3b, 0x630, 0x648, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x629, 0x3b, 0x661, 0x3b, 0x662, 0x3b, 0x663, 0x3b,
-0x664, 0x3b, 0x665, 0x3b, 0x666, 0x3b, 0x667, 0x3b, 0x668, 0x3b, 0x669, 0x3b, 0x661, 0x660, 0x3b, 0x661, 0x661, 0x3b, 0x661, 0x662,
-0x3b, 0x4d, 0x259, 0x68, 0x2e, 0x3b, 0x53, 0x259, 0x66, 0x2e, 0x3b, 0x52, 0x259, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x259,
-0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x43, 0x259, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x43, 0x259, 0x6d, 0x2e, 0x20, 0x49, 0x49,
-0x3b, 0x52, 0x259, 0x63, 0x2e, 0x3b, 0x15e, 0x61, 0x62, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x15e, 0x259, 0x76, 0x2e,
-0x3b, 0x5a, 0x69, 0x6c, 0x71, 0x2e, 0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x2e, 0x3b, 0x4d, 0x259, 0x68, 0x259, 0x72, 0x72, 0x259,
-0x6d, 0x3b, 0x53, 0x259, 0x66, 0x259, 0x72, 0x3b, 0x52, 0x259, 0x62, 0x69, 0xfc, 0x6c, 0x259, 0x76, 0x76, 0x259, 0x6c, 0x3b,
-0x52, 0x259, 0x62, 0x69, 0xfc, 0x6c, 0x61, 0x78, 0x131, 0x72, 0x3b, 0x43, 0x259, 0x6d, 0x61, 0x64, 0x69, 0x79, 0x259, 0x6c,
-0x259, 0x76, 0x76, 0x259, 0x6c, 0x3b, 0x43, 0x259, 0x6d, 0x61, 0x64, 0x69, 0x79, 0x259, 0x6c, 0x61, 0x78, 0x131, 0x72, 0x3b,
-0x52, 0x259, 0x63, 0x259, 0x62, 0x3b, 0x15e, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b,
-0x15e, 0x259, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x5a, 0x69, 0x6c, 0x71, 0x259, 0x64, 0x259, 0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x69,
-0x63, 0x63, 0x259, 0x3b, 0x9ae, 0x9b9, 0x9b0, 0x9b0, 0x9ae, 0x3b, 0x9b8, 0x9ab, 0x9b0, 0x3b, 0x9b0, 0x9ac, 0x9bf, 0x989, 0x9b2, 0x20,
-0x986, 0x989, 0x9af, 0x9bc, 0x9be, 0x9b2, 0x3b, 0x9b0, 0x9ac, 0x9bf, 0x989, 0x9b8, 0x20, 0x9b8, 0x9be, 0x9a8, 0x9bf, 0x3b, 0x99c, 0x9ae,
-0x9be, 0x9a6, 0x9bf, 0x989, 0x9b2, 0x20, 0x986, 0x989, 0x9af, 0x9bc, 0x9be, 0x9b2, 0x3b, 0x99c, 0x9ae, 0x9be, 0x9a6, 0x9bf, 0x989, 0x9b8,
-0x20, 0x9b8, 0x9be, 0x9a8, 0x9bf, 0x3b, 0x9b0, 0x99c, 0x9ac, 0x3b, 0x9b6, 0x9be, 0x2018, 0x9ac, 0x9be, 0x9a8, 0x3b, 0x9b0, 0x9ae, 0x99c,
-0x9be, 0x9a8, 0x3b, 0x9b6, 0x9be, 0x993, 0x9af, 0x9bc, 0x9be, 0x9b2, 0x3b, 0x99c, 0x9cd, 0x9ac, 0x9bf, 0x9b2, 0x995, 0x9a6, 0x3b, 0x99c,
-0x9cd, 0x9ac, 0x9bf, 0x9b2, 0x9b9, 0x99c, 0x9cd, 0x99c, 0x3b, 0x9e7, 0x3b, 0x9e8, 0x3b, 0x9e9, 0x3b, 0x9ea, 0x3b, 0x9eb, 0x3b, 0x9ec,
-0x3b, 0x9ed, 0x3b, 0x9ee, 0x3b, 0x9ef, 0x3b, 0x9e7, 0x9e6, 0x3b, 0x9e7, 0x9e7, 0x3b, 0x9e7, 0x9e8, 0x3b, 0x43c, 0x443, 0x445, 0x430,
-0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x440, 0x430, 0x431, 0x438, 0x2d, 0x31, 0x3b, 0x440, 0x430, 0x431,
-0x438, 0x2d, 0x32, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x2d, 0x31, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434,
-0x430, 0x2d, 0x32, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x430, 0x431, 0x3b, 0x448, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440, 0x430, 0x43c,
-0x430, 0x437, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x430, 0x43b, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x41a, 0x430, 0x430, 0x434,
-0x430, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x445, 0x438, 0x434, 0x436, 0x430, 0x3b, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33,
-0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35, 0x6708, 0x3b, 0x36, 0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b,
-0x31, 0x30, 0x6708, 0x3b, 0x31, 0x31, 0x6708, 0x3b, 0x31, 0x32, 0x6708, 0x3b, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708,
-0x3b, 0x56db, 0x6708, 0x3b, 0x4e94, 0x6708, 0x3b, 0x516d, 0x6708, 0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341,
-0x6708, 0x3b, 0x5341, 0x4e00, 0x6708, 0x3b, 0x5341, 0x4e8c, 0x6708, 0x3b, 0x7a46, 0x54c8, 0x862d, 0x59c6, 0x6708, 0x3b, 0x8272, 0x6cd5, 0x723e, 0x6708,
-0x3b, 0x8cf4, 0x6bd4, 0x6708, 0x20, 0x49, 0x3b, 0x8cf4, 0x6bd4, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x4e3b, 0x99ac, 0x9054, 0x6708, 0x20, 0x49,
-0x3b, 0x4e3b, 0x99ac, 0x9054, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x8cf4, 0x54f2, 0x535c, 0x6708, 0x3b, 0x820d, 0x723e, 0x90a6, 0x6708, 0x3b, 0x8cf4,
-0x8cb7, 0x4e39, 0x6708, 0x3b, 0x9583, 0x74e6, 0x9b6f, 0x6708, 0x3b, 0x90fd, 0x723e, 0x5580, 0x723e, 0x5fb7, 0x6708, 0x3b, 0x90fd, 0x723e, 0x9ed1, 0x54f2,
-0x6708, 0x3b, 0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e, 0x3b,
-0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e,
-0x3b, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x65, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x65,
-0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20,
-0x49, 0x49, 0x3b, 0x72, 0x65, 0x64, 0x2e, 0x3b, 0x161, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x161, 0x61, 0x77,
-0x2e, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d, 0x68, 0x2e, 0x3b, 0x6d, 0x75,
-0x68, 0x61, 0x72, 0x72, 0x65, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x65, 0x62, 0xed, 0x2019, 0x75, 0x20,
-0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x72, 0x65, 0x62, 0xed, 0x2019, 0x75, 0x20, 0x73, 0x2d, 0x73, 0xe1, 0x6e,
-0xed, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x61, 0x6c, 0x2d, 0xfa, 0x6c, 0xe1, 0x3b, 0x64, 0x17e, 0x75,
-0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x61, 0x6c, 0x2d, 0xe1, 0x63, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x72, 0x65, 0x64, 0x17e, 0x65,
-0x62, 0x3b, 0x161, 0x61, 0x2019, 0x62, 0xe1, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x161, 0x61, 0x77,
-0x77, 0x61, 0x6c, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x7a, 0xfa, 0x20, 0x6c, 0x2d,
-0x68, 0x69, 0x64, 0x17e, 0x64, 0x17e, 0x61, 0x3b, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66,
-0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b,
-0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72,
-0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e,
-0x3b, 0x73, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61,
-0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x3b, 0x4d, 0x6f, 0x65, 0x68, 0x2e,
-0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49,
-0x3b, 0x4a, 0x6f, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x6f, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61,
-0x6a, 0x2e, 0x3b, 0x53, 0x6a, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x6a, 0x61, 0x77, 0x2e, 0x3b, 0x44,
-0x6f, 0x65, 0x20, 0x61, 0x6c, 0x20, 0x6b, 0x2e, 0x3b, 0x44, 0x6f, 0x65, 0x20, 0x61, 0x6c, 0x20, 0x68, 0x2e, 0x3b, 0x4d,
-0x6f, 0x65, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb,
-0x61, 0x20, 0x61, 0x6c, 0x20, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x61, 0x20, 0x61, 0x6c, 0x20,
-0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x4a, 0x6f, 0x65, 0x6d, 0x61, 0x64, 0x2bb, 0x61, 0x6c, 0x20, 0x61, 0x77, 0x61, 0x6c,
-0x3b, 0x4a, 0x6f, 0x65, 0x6d, 0x61, 0x64, 0x2bb, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x52, 0x61, 0x6a,
-0x61, 0x62, 0x3b, 0x53, 0x6a, 0x61, 0x2bb, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b,
-0x53, 0x6a, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x6f, 0x65, 0x20, 0x61, 0x6c, 0x20, 0x6b, 0x61, 0x2bb, 0x61, 0x62, 0x61,
-0x3b, 0x44, 0x6f, 0x65, 0x20, 0x61, 0x6c, 0x20, 0x68, 0x69, 0x7a, 0x6a, 0x61, 0x3b, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72,
-0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77,
-0x77, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x64,
-0x17e, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x75, 0x6c, 0x61, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x61,
-0x2d, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x72, 0x61, 0x64, 0x17e, 0x61, 0x62, 0x3b, 0x161, 0x61, 0x2019,
-0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x161, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64,
-0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x71, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x68, 0x69, 0x64,
-0x64, 0x17e, 0x61, 0x3b, 0x6d, 0x6f, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20,
-0x61, 0x77, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x74, 0x68, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x6f,
-0x75, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x74, 0x68, 0x2e, 0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x63, 0x68,
-0x61, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e,
-0x20, 0x71, 0x69, 0x2e, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e, 0x20, 0x68, 0x69, 0x2e, 0x3b, 0x6d, 0x6f, 0x75, 0x68, 0x61,
-0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x61, 0x20, 0x61, 0x6c, 0x20,
-0x61, 0x77, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x61, 0x20, 0x61, 0x74, 0x68, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69,
-0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x6c, 0x61, 0x3b, 0x6a, 0x6f, 0x75,
-0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x74, 0x68, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x72, 0x61, 0x6a, 0x61,
-0x62, 0x3b, 0x63, 0x68, 0x61, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x63,
-0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x20, 0x61, 0x6c, 0x20, 0x71, 0x69, 0x60, 0x64, 0x61,
-0x3b, 0x64, 0x68, 0x6f, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x3b, 0x6d, 0x6f, 0x75, 0x68, 0x2e,
-0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x61, 0x77, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20,
-0x74, 0x68, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e, 0x20, 0x6f, 0x75, 0x6c, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6d, 0x2e,
-0x20, 0x74, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x63, 0x68, 0x61, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d,
-0x2e, 0x3b, 0x63, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x6f, 0x75, 0x2e, 0x20, 0x71, 0x2e, 0x3b, 0x64, 0x68, 0x6f,
-0x75, 0x2e, 0x20, 0x68, 0x2e, 0x3b, 0x10db, 0x10e3, 0x10f0, 0x2e, 0x3b, 0x10e1, 0x10d0, 0x10e4, 0x2e, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x2e,
-0x20, 0x49, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x10ef, 0x10e3, 0x10db, 0x2e, 0x20, 0x49, 0x3b, 0x10ef, 0x10e3,
-0x10db, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x10e0, 0x10d0, 0x10ef, 0x2e, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x2e, 0x3b, 0x10e0, 0x10d0, 0x10db, 0x2e,
-0x3b, 0x10e8, 0x10d0, 0x10d5, 0x2e, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10d9, 0x2e, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10f0, 0x2e, 0x3b,
-0x10db, 0x10e3, 0x10f0, 0x10d0, 0x10e0, 0x10d0, 0x10db, 0x10d8, 0x3b, 0x10e1, 0x10d0, 0x10e4, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x10d8,
-0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10d1, 0x10d8, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10ee,
-0x10d8, 0x10e0, 0x10d8, 0x3b, 0x10ef, 0x10e3, 0x10db, 0x10d0, 0x10d3, 0x10d0, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b,
-0x10ef, 0x10e3, 0x10db, 0x10d0, 0x10d3, 0x10d0, 0x20, 0x10e3, 0x10da, 0x2d, 0x10d0, 0x10ee, 0x10d8, 0x10e0, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10ef, 0x10d0,
-0x10d1, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10e0, 0x10d0, 0x10db, 0x10d0, 0x10d3, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10e8,
-0x10d0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d, 0x10d9, 0x10d0, 0x10d0, 0x10d3, 0x10d0, 0x3b, 0x10d6, 0x10e3, 0x10da, 0x2d,
-0x10f0, 0x10d8, 0x10ef, 0x10d0, 0x3b, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b,
-0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x44, 0x73, 0x63,
-0x68, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x44, 0x73, 0x63, 0x68, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49,
-0x49, 0x3b, 0x52, 0x61, 0x64, 0x73, 0x63, 0x68, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52,
-0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x68, 0x75, 0x20, 0x6c,
-0x2d, 0x71, 0x61, 0x2bf, 0x64, 0x61, 0x3b, 0x44, 0x68, 0x75, 0x20, 0x6c, 0x2d, 0x48, 0x69, 0x64, 0x64, 0x73, 0x63, 0x68,
-0x61, 0x3b, 0xaae, 0xac1, 0xab9, 0x2e, 0x3b, 0xab8, 0xaab, 0x2e, 0x3b, 0xab0, 0xaac, 0x2e, 0x49, 0x3b, 0xab0, 0xaac, 0x2e, 0x20,
-0x49, 0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0x2e, 0x20, 0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xab0, 0xabe,
-0xa9c, 0x2e, 0x3b, 0xab6, 0xabe, 0x2e, 0x3b, 0xab0, 0xabe, 0xaae, 0x2e, 0x3b, 0xab6, 0xabe, 0xab5, 0x2e, 0x3b, 0xaa7, 0xac1, 0x2bb,
-0xab2, 0x2d, 0xa95, 0xacd, 0xaaf, 0xac1, 0x2e, 0x3b, 0xaa7, 0xac1, 0x2bb, 0xab2, 0x2d, 0xa8f, 0xa9a, 0x2e, 0x3b, 0xaae, 0xac1, 0xab9,
-0xab0, 0xacd, 0xab0, 0xaae, 0x3b, 0xab8, 0xaab, 0xab0, 0x3b, 0xab0, 0xabe, 0xaac, 0xac0, 0x2bb, 0x20, 0x49, 0x3b, 0xab0, 0xabe, 0xaac,
-0xac0, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0xabe, 0xaa6, 0xabe, 0x20, 0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0xabe, 0xaa6,
-0xabe, 0x20, 0x49, 0x49, 0x3b, 0xab0, 0xa9c, 0xaac, 0x3b, 0xab6, 0xabe, 0x2bb, 0xaac, 0xabe, 0xaa8, 0x3b, 0xab0, 0xaae, 0xaa6, 0xabe,
-0xaa8, 0x3b, 0xab6, 0xabe, 0xab5, 0xacd, 0xab5, 0xab2, 0x3b, 0xaa7, 0xac1, 0x2bb, 0xab2, 0x2d, 0xa95, 0xacd, 0xab5, 0xac0, 0x2bb, 0xaa1,
-0xabe, 0xab9, 0x3b, 0xaa7, 0xac1, 0x2bb, 0xab2, 0x2d, 0xab9, 0xabf, 0xa9c, 0xacd, 0xa9c, 0xabe, 0xab9, 0x3b, 0x5de, 0x5d5, 0x5d7, 0x5e8,
-0x5dd, 0x3b, 0x5e6, 0x5e4, 0x5e8, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5f3, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d1,
-0x5f3, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5f3, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0,
-0x20, 0x5d1, 0x5f3, 0x3b, 0x5e8, 0x5d2, 0x5f3, 0x5d1, 0x3b, 0x5e9, 0x5e2, 0x5d1, 0x5d0, 0x5df, 0x3b, 0x5e8, 0x5de, 0x5d3, 0x5d0, 0x5df,
-0x3b, 0x5e9, 0x5d5, 0x5d5, 0x5d0, 0x5dc, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5e7, 0x5e2, 0x5d3, 0x5d4, 0x3b, 0x5d3,
-0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d7, 0x5d9, 0x5d2, 0x5f3, 0x5d4, 0x3b, 0x5de, 0x5d5, 0x5d7, 0x5e8, 0x5dd, 0x3b, 0x5e6, 0x5e4,
-0x5e8, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d0, 0x5d5, 0x5d5, 0x5dc, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20,
-0x5d0, 0x5be, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d0,
-0x5d5, 0x5dc, 0x5d0, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5be, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x5d4,
-0x3b, 0x5e8, 0x5d2, 0x5f3, 0x5d1, 0x3b, 0x5e9, 0x5e2, 0x5d1, 0x5d0, 0x5df, 0x3b, 0x5e8, 0x5de, 0x5d3, 0x5d0, 0x5df, 0x3b, 0x5e9, 0x5d5,
-0x5d5, 0x5d0, 0x5dc, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5e7, 0x5e2, 0x5d3, 0x5d4, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20,
-0x5d0, 0x5dc, 0x5be, 0x5d7, 0x5d9, 0x5d2, 0x5f3, 0x5d4, 0x3b, 0x5de, 0x5d5, 0x5d7, 0x5e8, 0x5dd, 0x3b, 0x5e6, 0x5e4, 0x5e8, 0x3b, 0x5e8,
-0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5dc, 0x2d, 0x5d0, 0x5d5, 0x5d5, 0x5dc, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x2d, 0x5ea,
-0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5dc, 0x2d, 0x5d0, 0x5d5, 0x5dc, 0x5d0,
-0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x2d, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x5d4, 0x3b, 0x5e8, 0x5d2,
+0x44, 0x68, 0x75, 0x20, 0x6c, 0x2d, 0x71, 0x61, 0x2bf, 0x64, 0x61, 0x3b, 0x44, 0x68, 0x75, 0x20, 0x6c, 0x2d, 0x48, 0x69,
+0x64, 0x64, 0x73, 0x63, 0x68, 0x61, 0xaae, 0xac1, 0xab9, 0xab0, 0xacd, 0xab0, 0xaae, 0x3b, 0xab8, 0xaab, 0xab0, 0x3b, 0xab0, 0xabe,
+0xaac, 0xac0, 0x2bb, 0x20, 0x49, 0x3b, 0xab0, 0xabe, 0xaac, 0xac0, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0xabe, 0xaa6,
+0xabe, 0x20, 0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0xabe, 0xaa6, 0xabe, 0x20, 0x49, 0x49, 0x3b, 0xab0, 0xa9c, 0xaac, 0x3b, 0xab6, 0xabe,
+0x2bb, 0xaac, 0xabe, 0xaa8, 0x3b, 0xab0, 0xaae, 0xaa6, 0xabe, 0xaa8, 0x3b, 0xab6, 0xabe, 0xab5, 0xacd, 0xab5, 0xab2, 0x3b, 0xaa7, 0xac1,
+0x2bb, 0xab2, 0x2d, 0xa95, 0xacd, 0xab5, 0xac0, 0x2bb, 0xaa1, 0xabe, 0xab9, 0x3b, 0xaa7, 0xac1, 0x2bb, 0xab2, 0x2d, 0xab9, 0xabf, 0xa9c,
+0xacd, 0xa9c, 0xabe, 0xab9, 0xaae, 0xac1, 0xab9, 0x2e, 0x3b, 0xab8, 0xaab, 0x2e, 0x3b, 0xab0, 0xaac, 0x2e, 0x49, 0x3b, 0xab0, 0xaac,
+0x2e, 0x20, 0x49, 0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0x2e, 0x20, 0x49, 0x3b, 0xa9c, 0xac1, 0xaae, 0x2e, 0x20, 0x49, 0x49, 0x3b,
+0xab0, 0xabe, 0xa9c, 0x2e, 0x3b, 0xab6, 0xabe, 0x2e, 0x3b, 0xab0, 0xabe, 0xaae, 0x2e, 0x3b, 0xab6, 0xabe, 0xab5, 0x2e, 0x3b, 0xaa7,
+0xac1, 0x2bb, 0xab2, 0x2d, 0xa95, 0xacd, 0xaaf, 0xac1, 0x2e, 0x3b, 0xaa7, 0xac1, 0x2bb, 0xab2, 0x2d, 0xa8f, 0xa9a, 0x2e, 0x5de, 0x5d5,
+0x5d7, 0x5e8, 0x5dd, 0x3b, 0x5e6, 0x5e4, 0x5e8, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d0, 0x5d5, 0x5d5, 0x5dc,
+0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5be, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3,
+0x5d0, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d0, 0x5d5, 0x5dc, 0x5d0, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5be,
+0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x5d4, 0x3b, 0x5e8, 0x5d2, 0x5f3, 0x5d1, 0x3b, 0x5e9, 0x5e2, 0x5d1, 0x5d0, 0x5df, 0x3b, 0x5e8, 0x5de,
+0x5d3, 0x5d0, 0x5df, 0x3b, 0x5e9, 0x5d5, 0x5d5, 0x5d0, 0x5dc, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5e7, 0x5e2, 0x5d3,
+0x5d4, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d7, 0x5d9, 0x5d2, 0x5f3, 0x5d4, 0x5de, 0x5d5, 0x5d7, 0x5e8, 0x5dd, 0x3b,
+0x5e6, 0x5e4, 0x5e8, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5dc, 0x2d, 0x5d0, 0x5d5, 0x5d5, 0x5dc, 0x3b, 0x5e8, 0x5d1, 0x5d9,
+0x5e2, 0x20, 0x5d0, 0x2d, 0x5ea, 0x5f3, 0x5d0, 0x5e0, 0x5d9, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5dc,
+0x2d, 0x5d0, 0x5d5, 0x5dc, 0x5d0, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x2d, 0x5ea, 0x5f3, 0x5d0, 0x5e0,
+0x5d9, 0x5d4, 0x3b, 0x5e8, 0x5d2, 0x5f3, 0x5d1, 0x3b, 0x5e9, 0x5e2, 0x5d1, 0x5d0, 0x5df, 0x3b, 0x5e8, 0x5de, 0x5d3, 0x5d0, 0x5df, 0x3b,
+0x5e9, 0x5d5, 0x5d5, 0x5d0, 0x5dc, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5e7, 0x5e2, 0x5d3, 0x5d4, 0x3b, 0x5d3, 0x5f3,
+0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5d7, 0x5d9, 0x5d2, 0x5f3, 0x5d4, 0x5de, 0x5d5, 0x5d7, 0x5e8, 0x5dd, 0x3b, 0x5e6, 0x5e4, 0x5e8, 0x3b,
+0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d0, 0x5f3, 0x3b, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de,
+0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d0, 0x5f3, 0x3b, 0x5d2, 0x5f3, 0x5d5, 0x5de, 0x5d0, 0x5d3, 0x5d0, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5e8, 0x5d2,
0x5f3, 0x5d1, 0x3b, 0x5e9, 0x5e2, 0x5d1, 0x5d0, 0x5df, 0x3b, 0x5e8, 0x5de, 0x5d3, 0x5d0, 0x5df, 0x3b, 0x5e9, 0x5d5, 0x5d5, 0x5d0, 0x5dc,
0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be, 0x5e7, 0x5e2, 0x5d3, 0x5d4, 0x3b, 0x5d3, 0x5f3, 0x5d5, 0x20, 0x5d0, 0x5dc, 0x5be,
-0x5d7, 0x5d9, 0x5d2, 0x5f3, 0x5d4, 0x3b, 0x92e, 0x941, 0x939, 0x930, 0x94d, 0x930, 0x92e, 0x3b, 0x938, 0x92b, 0x930, 0x3b, 0x930, 0x93e,
-0x92c, 0x940, 0x20, 0x92a, 0x94d, 0x930, 0x925, 0x92e, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x926, 0x94d, 0x935, 0x93f, 0x924, 0x940,
-0x92f, 0x3b, 0x91c, 0x941, 0x92e, 0x94d, 0x921, 0x93e, 0x20, 0x92a, 0x94d, 0x930, 0x925, 0x92e, 0x3b, 0x91c, 0x941, 0x92e, 0x94d, 0x921,
-0x93e, 0x20, 0x926, 0x94d, 0x935, 0x93f, 0x924, 0x940, 0x92f, 0x3b, 0x930, 0x91c, 0x92c, 0x3b, 0x936, 0x93e, 0x935, 0x928, 0x3b, 0x930,
-0x92e, 0x91c, 0x93e, 0x928, 0x3b, 0x936, 0x935, 0x94d, 0x935, 0x94d, 0x932, 0x3b, 0x91c, 0x93f, 0x932, 0x2d, 0x915, 0x94d, 0x926, 0x93e,
-0x939, 0x3b, 0x91c, 0x93f, 0x932, 0x94d, 0x2d, 0x939, 0x93f, 0x91c, 0x94d, 0x91c, 0x93e, 0x939, 0x3b, 0x4d, 0x6f, 0x68, 0x2e, 0x3b,
-0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0xe9, 0x62, 0x2e, 0x20, 0x31, 0x3b, 0x52, 0xe9, 0x62, 0x2e, 0x20, 0x32, 0x3b, 0x44,
-0x73, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x65, 0x64, 0x2e,
-0x3b, 0x53, 0x61, 0x62, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x65, 0x76, 0x2e, 0x3b, 0x44, 0x73, 0xfc, 0x6c,
-0x20, 0x6b, 0x2e, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x68, 0x2e, 0x3b, 0x4d, 0x6f, 0x68, 0x61, 0x72, 0x72, 0x65, 0x6d,
-0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20, 0x49, 0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20, 0x49,
-0x49, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0xe1, 0x64, 0x69, 0x20, 0x49, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0xe1, 0x64, 0x69, 0x20,
-0x49, 0x49, 0x3b, 0x52, 0x65, 0x64, 0x73, 0x65, 0x62, 0x3b, 0x53, 0x61, 0x62, 0xe1, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61,
-0x64, 0xe1, 0x6e, 0x3b, 0x53, 0x65, 0x76, 0x76, 0xe1, 0x6c, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x6b, 0x61, 0x64, 0x65,
-0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x68, 0x65, 0x64, 0x73, 0x65, 0x3b, 0x4d, 0x6f, 0x68, 0x61, 0x72, 0x72, 0x65, 0x6d,
+0x5d7, 0x5d9, 0x5d2, 0x5f3, 0x5d4, 0x92e, 0x941, 0x939, 0x930, 0x94d, 0x930, 0x92e, 0x3b, 0x938, 0x92b, 0x930, 0x3b, 0x930, 0x93e, 0x92c,
+0x940, 0x20, 0x92a, 0x94d, 0x930, 0x925, 0x92e, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x926, 0x94d, 0x935, 0x93f, 0x924, 0x940, 0x92f,
+0x3b, 0x91c, 0x941, 0x92e, 0x94d, 0x921, 0x93e, 0x20, 0x92a, 0x94d, 0x930, 0x925, 0x92e, 0x3b, 0x91c, 0x941, 0x92e, 0x94d, 0x921, 0x93e,
+0x20, 0x926, 0x94d, 0x935, 0x93f, 0x924, 0x940, 0x92f, 0x3b, 0x930, 0x91c, 0x92c, 0x3b, 0x936, 0x93e, 0x935, 0x928, 0x3b, 0x930, 0x92e,
+0x91c, 0x93e, 0x928, 0x3b, 0x936, 0x935, 0x94d, 0x935, 0x94d, 0x932, 0x3b, 0x91c, 0x93f, 0x932, 0x2d, 0x915, 0x94d, 0x926, 0x93e, 0x939,
+0x3b, 0x91c, 0x93f, 0x932, 0x94d, 0x2d, 0x939, 0x93f, 0x91c, 0x94d, 0x91c, 0x93e, 0x939, 0x4d, 0x6f, 0x68, 0x61, 0x72, 0x72, 0x65,
+0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20, 0x49, 0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20,
+0x49, 0x49, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0xe1, 0x64, 0x69, 0x20, 0x49, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0xe1, 0x64, 0x69,
+0x20, 0x49, 0x49, 0x3b, 0x52, 0x65, 0x64, 0x73, 0x65, 0x62, 0x3b, 0x53, 0x61, 0x62, 0xe1, 0x6e, 0x3b, 0x52, 0x61, 0x6d,
+0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x53, 0x65, 0x76, 0x76, 0xe1, 0x6c, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x6b, 0x61, 0x64,
+0x65, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x68, 0x65, 0x64, 0x73, 0x65, 0x4d, 0x6f, 0x68, 0x61, 0x72, 0x72, 0x65, 0x6d,
0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20, 0x65, 0x6c, 0x20, 0x61, 0x76, 0x76, 0x65, 0x6c,
0x3b, 0x52, 0xe9, 0x62, 0x69, 0x20, 0x65, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x68, 0x65, 0x72, 0x3b, 0x44, 0x73, 0x65, 0x6d,
0xe1, 0x64, 0x69, 0x20, 0x65, 0x6c, 0x20, 0x61, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0xe1, 0x64, 0x69,
0x20, 0x65, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x68, 0x65, 0x72, 0x3b, 0x52, 0x65, 0x64, 0x73, 0x65, 0x62, 0x3b, 0x53, 0x61,
0x62, 0xe1, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x53, 0x65, 0x76, 0x76, 0xe1, 0x6c, 0x3b, 0x44,
-0x73, 0xfc, 0x6c, 0x20, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x68, 0x65, 0x64, 0x73, 0x65, 0x3b,
-0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62,
-0x2e, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b,
-0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x2e,
-0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x2e, 0x3b, 0x4d,
-0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x41, 0x77, 0x61, 0x6c, 0x3b, 0x52,
-0x61, 0x62, 0x2e, 0x20, 0x41, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x41, 0x77, 0x61, 0x6c, 0x3b,
-0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x41, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x79, 0x61, 0x2e,
-0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x79, 0x61, 0x77, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x6b, 0x61, 0x2e, 0x3b, 0x5a,
-0x75, 0x6c, 0x68, 0x69, 0x2e, 0x3b, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b,
-0x52, 0x61, 0x62, 0x69, 0x75, 0x6c, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x75, 0x6c, 0x61, 0x6b, 0x68,
-0x69, 0x72, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x69, 0x6c, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64,
-0x69, 0x6c, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x79, 0x61, 0x6b, 0x62, 0x61,
-0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x79, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x5a, 0x75, 0x6c,
-0x6b, 0x61, 0x69, 0x64, 0x61, 0x68, 0x3b, 0x5a, 0x75, 0x6c, 0x68, 0x69, 0x6a, 0x61, 0x68, 0x3b, 0x30e0, 0x30cf, 0x30c3, 0x30e9,
-0x30e0, 0x3b, 0x30b5, 0x30d5, 0x30a2, 0x30eb, 0x3b, 0x30e9, 0x30d3, 0x30fc, 0x30fb, 0x30a6, 0x30eb, 0x30fb, 0x30a2, 0x30a6, 0x30ef, 0x30eb, 0x3b, 0x30e9,
-0x30d3, 0x30fc, 0x30fb, 0x30a6, 0x30c3, 0x30fb, 0x30b5, 0x30fc, 0x30cb, 0x30fc, 0x3b, 0x30b8, 0x30e5, 0x30de, 0x30fc, 0x30c0, 0x30eb, 0x30fb, 0x30a2, 0x30a6,
-0x30ef, 0x30eb, 0x3b, 0x30b8, 0x30e5, 0x30de, 0x30fc, 0x30c0, 0x30c3, 0x30b5, 0x30fc, 0x30cb, 0x30fc, 0x3b, 0x30e9, 0x30b8, 0x30e3, 0x30d6, 0x3b, 0x30b7,
-0x30e3, 0x30a2, 0x30d0, 0x30fc, 0x30f3, 0x3b, 0x30e9, 0x30de, 0x30c0, 0x30fc, 0x30f3, 0x3b, 0x30b7, 0x30e3, 0x30a6, 0x30ef, 0x30fc, 0x30eb, 0x3b, 0x30ba,
-0x30eb, 0x30fb, 0x30ab, 0x30a4, 0x30c0, 0x3b, 0x30ba, 0x30eb, 0x30fb, 0x30d2, 0x30c3, 0x30b8, 0x30e3, 0x3b, 0xcae, 0xcc1, 0xcb9, 0xccd, 0x2e, 0x3b,
-0xcb8, 0xcab, 0xcbe, 0x2e, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49, 0x49, 0x3b,
-0xc9c, 0xcc1, 0xcae, 0xccd, 0x2e, 0x20, 0x49, 0x3b, 0xc9c, 0xcc1, 0xcae, 0xccd, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xcb0, 0xc9c, 0xccd,
-0x2e, 0x3b, 0xcb6, 0x2e, 0x3b, 0xcb0, 0xcae, 0xccd, 0x2e, 0x3b, 0xcb6, 0xcb5, 0xccd, 0x2e, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2, 0xccd,
-0x2d, 0xc95, 0xcbf, 0x2e, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2, 0xccd, 0x2d, 0xcb9, 0x2e, 0x3b, 0xcae, 0xcc1, 0xcb9, 0xcb0, 0xcae, 0xccd,
-0x3b, 0xcb8, 0xcab, 0xcbe, 0xcb0, 0xccd, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49,
-0x49, 0x3b, 0xc9c, 0xcc1, 0xcae, 0xcbe, 0xca6, 0xcbe, 0x20, 0x49, 0x3b, 0xc9c, 0xcc1, 0xcae, 0xcbe, 0xca6, 0xcbe, 0x20, 0x49, 0x49,
-0x3b, 0xcb0, 0xc9c, 0xcac, 0xccd, 0x3b, 0xcb6, 0x2019, 0xcac, 0xcbe, 0xca8, 0xccd, 0x3b, 0xcb0, 0xcae, 0xca6, 0xcbe, 0xca8, 0xccd, 0x3b,
-0xcb6, 0xcb5, 0xccd, 0xcb5, 0xcbe, 0xcb2, 0xccd, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2, 0xccd, 0x2d, 0xc95, 0xcbf, 0x2018, 0xca1, 0xcbe, 0xcb9,
-0xccd, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2, 0xccd, 0x2d, 0xcb9, 0xcbf, 0xc9c, 0xcbe, 0xcb9, 0xccd, 0x3b, 0xbb34, 0xd558, 0xb78c, 0x3b, 0xc0ac,
-0xd30c, 0xb974, 0x3b, 0xb77c, 0xbe44, 0x20, 0xc54c, 0x20, 0xc544, 0xc648, 0x3b, 0xb77c, 0xbe44, 0x20, 0xc54c, 0x20, 0xc384, 0xb2c8, 0x3b, 0xc8fc,
-0xb9c8, 0xb2e4, 0x20, 0xc54c, 0x20, 0xc544, 0xc648, 0x3b, 0xc8fc, 0xb9c8, 0xb2e4, 0x20, 0xc54c, 0x20, 0xc384, 0xb2c8, 0x3b, 0xb77c, 0xc7a1, 0x3b,
-0xc250, 0xc544, 0xbc18, 0x3b, 0xb77c, 0xb9c8, 0xb2e8, 0x3b, 0xc250, 0xc648, 0x3b, 0xb4c0, 0x20, 0xc54c, 0x20, 0xae4c, 0xb2e4, 0x3b, 0xb4c0, 0x20,
-0xc54c, 0x20, 0xd788, 0xc790, 0x3b, 0x6d, 0x75, 0x1e96, 0x65, 0x72, 0x65, 0x6d, 0x3b, 0x73, 0x65, 0x66, 0x65, 0x72, 0x3b, 0x72,
-0x65, 0x62, 0xee, 0x2bf, 0x75, 0x6c, 0x65, 0x77, 0x65, 0x6c, 0x3b, 0x72, 0x65, 0x62, 0xee, 0x2bf, 0x75, 0x6c, 0x61, 0x78,
-0x65, 0x72, 0x3b, 0x63, 0x65, 0x6d, 0x61, 0x7a, 0xee, 0x79, 0x65, 0x6c, 0x65, 0x77, 0x65, 0x6c, 0x3b, 0x63, 0x65, 0x6d,
-0x61, 0x7a, 0xee, 0x79, 0x65, 0x6c, 0x61, 0x78, 0x65, 0x72, 0x3b, 0x72, 0x65, 0x63, 0x65, 0x62, 0x3b, 0x15f, 0x65, 0x2bf,
-0x62, 0x61, 0x6e, 0x3b, 0x72, 0x65, 0x6d, 0x65, 0x7a, 0x61, 0x6e, 0x3b, 0x15f, 0x65, 0x77, 0x61, 0x6c, 0x3b, 0x7a, 0xee,
-0x6c, 0x71, 0x65, 0x2bf, 0x64, 0x65, 0x3b, 0x7a, 0xee, 0x6c, 0x1e96, 0x65, 0x63, 0x65, 0x3b, 0xea1, 0xeb8, 0xeae, 0xeb1, 0xe94,
-0x3b, 0xec0, 0xe84, 0xeb2, 0xeb0, 0x3b, 0xeae, 0xead, 0xe81, 0xe9a, 0xeb5, 0x20, 0x31, 0x3b, 0xeae, 0xead, 0xe81, 0xe9a, 0xeb5, 0x20,
-0x32, 0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x31, 0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x32, 0x3b, 0xec0, 0xeae, 0xeb2, 0xeb0,
-0x3b, 0xe8a, 0xeb2, 0x3b, 0xec0, 0xeae, 0xeb2, 0xeb0, 0xea1, 0xeb0, 0x3b, 0xec0, 0xe8a, 0xebb, 0xeb2, 0x3b, 0xe8a, 0xeb8, 0xea5, 0xe81,
-0xeb4, 0xead, 0xeb8, 0x3b, 0xe8a, 0xeb8, 0xea5, 0xeab, 0xeb4, 0xe88, 0x3b, 0xea1, 0xeb8, 0xea3, 0xeb0, 0xeae, 0xead, 0xea1, 0x3b, 0xe8a,
-0xeb2, 0xe9f, 0xeb2, 0xea3, 0x3b, 0xeae, 0xead, 0xe94, 0xe9a, 0xeb5, 0x20, 0x31, 0x3b, 0xeae, 0xead, 0xe94, 0xe9a, 0xeb5, 0x20, 0x32,
-0x3b, 0xe88, 0xeb8, 0xea1, 0xeb2, 0xe94, 0xeb2, 0x20, 0x31, 0x3b, 0xe88, 0xeb8, 0xea1, 0xeb2, 0xe94, 0xeb2, 0x20, 0x32, 0x3b, 0xeae,
-0xeb2, 0xe88, 0xeb1, 0xe9a, 0x3b, 0xe8a, 0xeb0, 0xe9a, 0xeb2, 0xe99, 0x3b, 0xeae, 0xeb2, 0xea1, 0xeb2, 0xe94, 0xead, 0xe99, 0x3b, 0xec0,
-0xe8a, 0xebb, 0xeb2, 0xea7, 0xeb1, 0xe94, 0x3b, 0xe94, 0xeb8, 0xead, 0xeb1, 0xe94, 0xe81, 0xeb4, 0xe94, 0xeb0, 0x3b, 0xe94, 0xeb8, 0xead,
-0xeb1, 0xe94, 0xe81, 0xeb4, 0xe88, 0xeb0, 0x3b, 0xea1, 0xeb8, 0xeae, 0xeb1, 0xe94, 0x3b, 0xec0, 0xe84, 0xeb2, 0xeb0, 0x3b, 0xeae, 0xead,
-0xe94, 0xe9a, 0xeb5, 0x20, 0x31, 0x3b, 0xeae, 0xead, 0xe81, 0xe9a, 0xeb5, 0x20, 0x32, 0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x31,
-0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x32, 0x3b, 0xec0, 0xeae, 0xeb2, 0xeb0, 0x3b, 0xe8a, 0xeb0, 0xead, 0xecc, 0x3b, 0xec0, 0xeae,
-0xeb2, 0xeb0, 0xea1, 0xeb0, 0x3b, 0xec0, 0xe8a, 0xebb, 0xeb2, 0x3b, 0xe8a, 0xeb8, 0xea5, 0xe81, 0xeb4, 0xead, 0xeb8, 0x3b, 0xe8a, 0xeb8,
-0xea5, 0xeab, 0xeb4, 0xe88, 0x3b, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x73,
-0x3b, 0x31, 0x2e, 0x20, 0x72, 0x61, 0x62, 0x12b, 0x3b, 0x32, 0x2e, 0x20, 0x72, 0x61, 0x62, 0x12b, 0x3b, 0x31, 0x2e, 0x20,
-0x64, 0x17e, 0x75, 0x6d, 0x101, 0x64, 0x101, 0x3b, 0x32, 0x2e, 0x20, 0x64, 0x17e, 0x75, 0x6d, 0x101, 0x64, 0x101, 0x3b, 0x72,
-0x61, 0x64, 0x17e, 0x61, 0x62, 0x73, 0x3b, 0x161, 0x61, 0x62, 0x61, 0x6e, 0x73, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x101,
-0x6e, 0x73, 0x3b, 0x161, 0x61, 0x75, 0x76, 0x61, 0x6c, 0x73, 0x3b, 0x64, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x6b, 0x69, 0x64,
-0x101, 0x3b, 0x64, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17e, 0x101, 0x3b, 0x43c, 0x443, 0x445, 0x2e, 0x3b, 0x441,
-0x430, 0x444, 0x2e, 0x3b, 0x440, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x45f,
-0x443, 0x43c, 0x2e, 0x20, 0x49, 0x3b, 0x45f, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x45f, 0x2e, 0x3b, 0x448,
-0x430, 0x431, 0x2e, 0x3b, 0x440, 0x430, 0x43c, 0x2e, 0x3b, 0x448, 0x430, 0x432, 0x2e, 0x3b, 0x434, 0x443, 0x43b, 0x43a, 0x2e, 0x3b,
-0x434, 0x443, 0x43b, 0x445, 0x2e, 0x3b, 0x43c, 0x443, 0x445, 0x430, 0x440, 0x435, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b,
-0x440, 0x430, 0x431, 0x438, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x438, 0x20, 0x49, 0x49, 0x3b, 0x45f, 0x443, 0x43c, 0x430, 0x434,
-0x430, 0x20, 0x49, 0x3b, 0x45f, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x45f, 0x430, 0x431, 0x3b,
-0x448, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x448, 0x430, 0x432, 0x430, 0x43b, 0x3b,
-0x434, 0x443, 0x43b, 0x43a, 0x438, 0x434, 0x430, 0x3b, 0x434, 0x443, 0x43b, 0x445, 0x438, 0x45f, 0x430, 0x3b, 0xd2e, 0xd41, 0xd39, 0x2e,
-0x3b, 0xd38, 0xd2b, 0x2e, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0x2e, 0x3b, 0xd31, 0xd2c,
-0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0x2e, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d,
-0xd35, 0x2e, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0x2e, 0x3b, 0xd31, 0xd1c, 0x2e, 0x3b, 0xd36,
-0xd39, 0xd2c, 0xd3e, 0x2e, 0x3b, 0xd31, 0xd2e, 0xd26, 0xd3e, 0x2e, 0x3b, 0xd36, 0xd35, 0xd4d, 0xd35, 0xd3e, 0x2e, 0x3b, 0xd26, 0xd41,
-0xd7d, 0x20, 0xd16, 0xd39, 0x2e, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd39, 0xd3f, 0x2e, 0x3b, 0xd2e, 0xd41, 0xd39, 0xd31, 0xd02, 0x3b,
-0xd38, 0xd2b, 0xd7c, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b, 0xd31, 0xd2c, 0xd40,
-0xd39, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35,
-0xd7d, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b, 0xd31, 0xd1c, 0xd2c, 0xd4d, 0x3b, 0xd36,
-0xd39, 0xd2c, 0xd3e, 0xd7b, 0x3b, 0xd31, 0xd2e, 0xd26, 0xd3e, 0xd7b, 0x3b, 0xd36, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd7d, 0x3b, 0xd26, 0xd41,
-0xd7d, 0x20, 0xd16, 0xd39, 0xd26, 0xd4d, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd39, 0xd3f, 0xd1c, 0xd4d, 0xd1c, 0x3b, 0xd2e, 0xd41, 0x3b,
-0xd38, 0x3b, 0xd31, 0x3b, 0xd31, 0x3b, 0xd1c, 0x3b, 0xd1c, 0x3b, 0xd31, 0x3b, 0xd36, 0x3b, 0xd31, 0x3b, 0xd36, 0x3b, 0xd26, 0xd41,
-0x3b, 0xd26, 0xd41, 0x3b, 0xd2e, 0xd41, 0xd39, 0xd31, 0xd02, 0x3b, 0xd38, 0xd2b, 0xd7c, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d,
-0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b, 0xd1c,
-0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd06,
-0xd16, 0xd3f, 0xd7c, 0x3b, 0xd31, 0xd1c, 0xd2c, 0xd4d, 0x3b, 0xd36, 0xd39, 0xd2c, 0xd3e, 0xd7b, 0x3b, 0xd31, 0xd2e, 0xd33, 0xd3e, 0xd7b,
-0x3b, 0xd36, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd7d, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd16, 0xd39, 0xd26, 0xd4d, 0x3b, 0xd26, 0xd41, 0xd7d,
-0x20, 0xd39, 0xd3f, 0xd1c, 0xd4d, 0xd1c, 0x3b, 0x92e, 0x94b, 0x939, 0x2e, 0x3b, 0x938, 0x92b, 0x2e, 0x3b, 0x930, 0x93e, 0x92c, 0x940,
-0x20, 0x49, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49, 0x49, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x2e, 0x20, 0x49, 0x3b, 0x91c,
-0x941, 0x92e, 0x93e, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x930, 0x91d, 0x93e, 0x2e, 0x3b, 0x936, 0x93e, 0x92c, 0x93e, 0x2e, 0x3b, 0x930,
-0x92e, 0x2e, 0x3b, 0x936, 0x935, 0x94d, 0x935, 0x93e, 0x2e, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x915, 0x940, 0x2e, 0x3b, 0x927, 0x941,
-0x932, 0x2d, 0x939, 0x93f, 0x2e, 0x3b, 0x92e, 0x94b, 0x939, 0x930, 0x92e, 0x3b, 0x938, 0x92b, 0x930, 0x3b, 0x930, 0x93e, 0x92c, 0x940,
-0x20, 0x49, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49, 0x49, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x926, 0x93e, 0x20, 0x49, 0x3b,
-0x91c, 0x941, 0x92e, 0x93e, 0x926, 0x93e, 0x20, 0x49, 0x49, 0x3b, 0x930, 0x91d, 0x93e, 0x92c, 0x3b, 0x936, 0x93e, 0x92c, 0x93e, 0x928,
-0x3b, 0x930, 0x92e, 0x91c, 0x93e, 0x928, 0x3b, 0x936, 0x935, 0x94d, 0x935, 0x93e, 0x932, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x915, 0x940,
-0x926, 0x93e, 0x939, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x939, 0x93f, 0x91c, 0x93e, 0x939, 0x3b, 0x967, 0x3b, 0x968, 0x3b, 0x969, 0x3b,
-0x96a, 0x3b, 0x96b, 0x3b, 0x96c, 0x3b, 0x96d, 0x3b, 0x96e, 0x3b, 0x96f, 0x3b, 0x967, 0x966, 0x3b, 0x967, 0x967, 0x3b, 0x967, 0x968,
-0x3b, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61,
+0x73, 0xfc, 0x6c, 0x20, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x68, 0x65, 0x64, 0x73, 0x65, 0x4d,
+0x6f, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0xe9, 0x62, 0x2e, 0x20, 0x31, 0x3b, 0x52, 0xe9, 0x62, 0x2e,
+0x20, 0x32, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x44, 0x73, 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b,
+0x52, 0x65, 0x64, 0x2e, 0x3b, 0x53, 0x61, 0x62, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x65, 0x76, 0x2e, 0x3b,
+0x44, 0x73, 0xfc, 0x6c, 0x20, 0x6b, 0x2e, 0x3b, 0x44, 0x73, 0xfc, 0x6c, 0x20, 0x68, 0x2e, 0x6d, 0x75, 0x68, 0x2e, 0x3b,
+0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b,
+0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b,
+0x73, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb,
+0x6c, 0x2d, 0x51, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x2e, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x61, 0x6d,
+0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x75, 0x6c, 0x61, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61,
+0x62, 0x69, 0x75, 0x6c, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x69, 0x6c, 0x61, 0x77, 0x61,
+0x6c, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x69, 0x6c, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62,
+0x3b, 0x53, 0x79, 0x61, 0x6b, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x79, 0x61,
+0x77, 0x61, 0x6c, 0x3b, 0x5a, 0x75, 0x6c, 0x6b, 0x61, 0x69, 0x64, 0x61, 0x68, 0x3b, 0x5a, 0x75, 0x6c, 0x68, 0x69, 0x6a,
+0x61, 0x68, 0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x41, 0x77, 0x61,
+0x6c, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x41, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x41, 0x77,
+0x61, 0x6c, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x41, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53,
+0x79, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x79, 0x61, 0x77, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x6b, 0x61,
+0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x68, 0x69, 0x2e, 0x30e0, 0x30cf, 0x30c3, 0x30e9, 0x30e0, 0x3b, 0x30b5, 0x30d5, 0x30a2, 0x30eb, 0x3b, 0x30e9,
+0x30d3, 0x30fc, 0x30fb, 0x30a6, 0x30eb, 0x30fb, 0x30a2, 0x30a6, 0x30ef, 0x30eb, 0x3b, 0x30e9, 0x30d3, 0x30fc, 0x30fb, 0x30a6, 0x30c3, 0x30fb, 0x30b5, 0x30fc,
+0x30cb, 0x30fc, 0x3b, 0x30b8, 0x30e5, 0x30de, 0x30fc, 0x30c0, 0x30eb, 0x30fb, 0x30a2, 0x30a6, 0x30ef, 0x30eb, 0x3b, 0x30b8, 0x30e5, 0x30de, 0x30fc, 0x30c0,
+0x30c3, 0x30b5, 0x30fc, 0x30cb, 0x30fc, 0x3b, 0x30e9, 0x30b8, 0x30e3, 0x30d6, 0x3b, 0x30b7, 0x30e3, 0x30a2, 0x30d0, 0x30fc, 0x30f3, 0x3b, 0x30e9, 0x30de,
+0x30c0, 0x30fc, 0x30f3, 0x3b, 0x30b7, 0x30e3, 0x30a6, 0x30ef, 0x30fc, 0x30eb, 0x3b, 0x30ba, 0x30eb, 0x30fb, 0x30ab, 0x30a4, 0x30c0, 0x3b, 0x30ba, 0x30eb,
+0x30fb, 0x30d2, 0x30c3, 0x30b8, 0x30e3, 0xcae, 0xcc1, 0xcb9, 0xcb0, 0xcae, 0xccd, 0x3b, 0xcb8, 0xcab, 0xcbe, 0xcb0, 0xccd, 0x3b, 0xcb0, 0xcac,
+0xcbf, 0x2018, 0x20, 0x49, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49, 0x49, 0x3b, 0xc9c, 0xcc1, 0xcae, 0xcbe, 0xca6, 0xcbe, 0x20,
+0x49, 0x3b, 0xc9c, 0xcc1, 0xcae, 0xcbe, 0xca6, 0xcbe, 0x20, 0x49, 0x49, 0x3b, 0xcb0, 0xc9c, 0xcac, 0xccd, 0x3b, 0xcb6, 0x2019, 0xcac,
+0xcbe, 0xca8, 0xccd, 0x3b, 0xcb0, 0xcae, 0xca6, 0xcbe, 0xca8, 0xccd, 0x3b, 0xcb6, 0xcb5, 0xccd, 0xcb5, 0xcbe, 0xcb2, 0xccd, 0x3b, 0xca7,
+0xcc1, 0x2018, 0xcb2, 0xccd, 0x2d, 0xc95, 0xcbf, 0x2018, 0xca1, 0xcbe, 0xcb9, 0xccd, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2, 0xccd, 0x2d, 0xcb9,
+0xcbf, 0xc9c, 0xcbe, 0xcb9, 0xccd, 0xcae, 0xcc1, 0xcb9, 0xccd, 0x2e, 0x3b, 0xcb8, 0xcab, 0xcbe, 0x2e, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018,
+0x20, 0x49, 0x3b, 0xcb0, 0xcac, 0xcbf, 0x2018, 0x20, 0x49, 0x49, 0x3b, 0xc9c, 0xcc1, 0xcae, 0xccd, 0x2e, 0x20, 0x49, 0x3b, 0xc9c,
+0xcc1, 0xcae, 0xccd, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xcb0, 0xc9c, 0xccd, 0x2e, 0x3b, 0xcb6, 0x2e, 0x3b, 0xcb0, 0xcae, 0xccd, 0x2e,
+0x3b, 0xcb6, 0xcb5, 0xccd, 0x2e, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2, 0xccd, 0x2d, 0xc95, 0xcbf, 0x2e, 0x3b, 0xca7, 0xcc1, 0x2018, 0xcb2,
+0xccd, 0x2d, 0xcb9, 0x2e, 0xbb34, 0xd558, 0xb78c, 0x3b, 0xc0ac, 0xd30c, 0xb974, 0x3b, 0xb77c, 0xbe44, 0x20, 0xc54c, 0x20, 0xc544, 0xc648, 0x3b,
+0xb77c, 0xbe44, 0x20, 0xc54c, 0x20, 0xc384, 0xb2c8, 0x3b, 0xc8fc, 0xb9c8, 0xb2e4, 0x20, 0xc54c, 0x20, 0xc544, 0xc648, 0x3b, 0xc8fc, 0xb9c8, 0xb2e4,
+0x20, 0xc54c, 0x20, 0xc384, 0xb2c8, 0x3b, 0xb77c, 0xc7a1, 0x3b, 0xc250, 0xc544, 0xbc18, 0x3b, 0xb77c, 0xb9c8, 0xb2e8, 0x3b, 0xc250, 0xc648, 0x3b,
+0xb4c0, 0x20, 0xc54c, 0x20, 0xae4c, 0xb2e4, 0x3b, 0xb4c0, 0x20, 0xc54c, 0x20, 0xd788, 0xc790, 0x6d, 0x75, 0x1e96, 0x65, 0x72, 0x65, 0x6d,
+0x3b, 0x73, 0x65, 0x66, 0x65, 0x72, 0x3b, 0x72, 0x65, 0x62, 0xee, 0x2bf, 0x75, 0x6c, 0x65, 0x77, 0x65, 0x6c, 0x3b, 0x72,
+0x65, 0x62, 0xee, 0x2bf, 0x75, 0x6c, 0x61, 0x78, 0x65, 0x72, 0x3b, 0x63, 0x65, 0x6d, 0x61, 0x7a, 0xee, 0x79, 0x65, 0x6c,
+0x65, 0x77, 0x65, 0x6c, 0x3b, 0x63, 0x65, 0x6d, 0x61, 0x7a, 0xee, 0x79, 0x65, 0x6c, 0x61, 0x78, 0x65, 0x72, 0x3b, 0x72,
+0x65, 0x63, 0x65, 0x62, 0x3b, 0x15f, 0x65, 0x2bf, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x65, 0x6d, 0x65, 0x7a, 0x61, 0x6e, 0x3b,
+0x15f, 0x65, 0x77, 0x61, 0x6c, 0x3b, 0x7a, 0xee, 0x6c, 0x71, 0x65, 0x2bf, 0x64, 0x65, 0x3b, 0x7a, 0xee, 0x6c, 0x1e96, 0x65,
+0x63, 0x65, 0xea1, 0xeb8, 0xea3, 0xeb0, 0xeae, 0xead, 0xea1, 0x3b, 0xe8a, 0xeb2, 0xe9f, 0xeb2, 0xea3, 0x3b, 0xeae, 0xead, 0xe94, 0xe9a,
+0xeb5, 0x20, 0x31, 0x3b, 0xeae, 0xead, 0xe94, 0xe9a, 0xeb5, 0x20, 0x32, 0x3b, 0xe88, 0xeb8, 0xea1, 0xeb2, 0xe94, 0xeb2, 0x20, 0x31,
+0x3b, 0xe88, 0xeb8, 0xea1, 0xeb2, 0xe94, 0xeb2, 0x20, 0x32, 0x3b, 0xeae, 0xeb2, 0xe88, 0xeb1, 0xe9a, 0x3b, 0xe8a, 0xeb0, 0xe9a, 0xeb2,
+0xe99, 0x3b, 0xeae, 0xeb2, 0xea1, 0xeb2, 0xe94, 0xead, 0xe99, 0x3b, 0xec0, 0xe8a, 0xebb, 0xeb2, 0xea7, 0xeb1, 0xe94, 0x3b, 0xe94, 0xeb8,
+0xead, 0xeb1, 0xe94, 0xe81, 0xeb4, 0xe94, 0xeb0, 0x3b, 0xe94, 0xeb8, 0xead, 0xeb1, 0xe94, 0xe81, 0xeb4, 0xe88, 0xeb0, 0xea1, 0xeb8, 0xeae,
+0xeb1, 0xe94, 0x3b, 0xec0, 0xe84, 0xeb2, 0xeb0, 0x3b, 0xeae, 0xead, 0xe81, 0xe9a, 0xeb5, 0x20, 0x31, 0x3b, 0xeae, 0xead, 0xe81, 0xe9a,
+0xeb5, 0x20, 0x32, 0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x31, 0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x32, 0x3b, 0xec0, 0xeae,
+0xeb2, 0xeb0, 0x3b, 0xe8a, 0xeb2, 0x3b, 0xec0, 0xeae, 0xeb2, 0xeb0, 0xea1, 0xeb0, 0x3b, 0xec0, 0xe8a, 0xebb, 0xeb2, 0x3b, 0xe8a, 0xeb8,
+0xea5, 0xe81, 0xeb4, 0xead, 0xeb8, 0x3b, 0xe8a, 0xeb8, 0xea5, 0xeab, 0xeb4, 0xe88, 0xea1, 0xeb8, 0xeae, 0xeb1, 0xe94, 0x3b, 0xec0, 0xe84,
+0xeb2, 0xeb0, 0x3b, 0xeae, 0xead, 0xe94, 0xe9a, 0xeb5, 0x20, 0x31, 0x3b, 0xeae, 0xead, 0xe81, 0xe9a, 0xeb5, 0x20, 0x32, 0x3b, 0xe99,
+0xeb8, 0xea1, 0xeb2, 0x20, 0x31, 0x3b, 0xe99, 0xeb8, 0xea1, 0xeb2, 0x20, 0x32, 0x3b, 0xec0, 0xeae, 0xeb2, 0xeb0, 0x3b, 0xe8a, 0xeb0,
+0xead, 0xecc, 0x3b, 0xec0, 0xeae, 0xeb2, 0xeb0, 0xea1, 0xeb0, 0x3b, 0xec0, 0xe8a, 0xebb, 0xeb2, 0x3b, 0xe8a, 0xeb8, 0xea5, 0xe81, 0xeb4,
+0xead, 0xeb8, 0x3b, 0xe8a, 0xeb8, 0xea5, 0xeab, 0xeb4, 0xe88, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x73, 0x61,
+0x66, 0x61, 0x72, 0x73, 0x3b, 0x31, 0x2e, 0x20, 0x72, 0x61, 0x62, 0x12b, 0x3b, 0x32, 0x2e, 0x20, 0x72, 0x61, 0x62, 0x12b,
+0x3b, 0x31, 0x2e, 0x20, 0x64, 0x17e, 0x75, 0x6d, 0x101, 0x64, 0x101, 0x3b, 0x32, 0x2e, 0x20, 0x64, 0x17e, 0x75, 0x6d, 0x101,
+0x64, 0x101, 0x3b, 0x72, 0x61, 0x64, 0x17e, 0x61, 0x62, 0x73, 0x3b, 0x161, 0x61, 0x62, 0x61, 0x6e, 0x73, 0x3b, 0x72, 0x61,
+0x6d, 0x61, 0x64, 0x101, 0x6e, 0x73, 0x3b, 0x161, 0x61, 0x75, 0x76, 0x61, 0x6c, 0x73, 0x3b, 0x64, 0x75, 0x20, 0x61, 0x6c,
+0x2d, 0x6b, 0x69, 0x64, 0x101, 0x3b, 0x64, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17e, 0x101, 0x43c, 0x443, 0x445,
+0x430, 0x440, 0x435, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x440, 0x430, 0x431, 0x438, 0x20, 0x49, 0x3b, 0x440, 0x430,
+0x431, 0x438, 0x20, 0x49, 0x49, 0x3b, 0x45f, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x3b, 0x45f, 0x443, 0x43c, 0x430, 0x434,
+0x430, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x45f, 0x430, 0x431, 0x3b, 0x448, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440, 0x430, 0x43c,
+0x430, 0x434, 0x430, 0x43d, 0x3b, 0x448, 0x430, 0x432, 0x430, 0x43b, 0x3b, 0x434, 0x443, 0x43b, 0x43a, 0x438, 0x434, 0x430, 0x3b, 0x434,
+0x443, 0x43b, 0x445, 0x438, 0x45f, 0x430, 0x43c, 0x443, 0x445, 0x2e, 0x3b, 0x441, 0x430, 0x444, 0x2e, 0x3b, 0x440, 0x430, 0x431, 0x2e,
+0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x45f, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x3b, 0x45f, 0x443,
+0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x45f, 0x2e, 0x3b, 0x448, 0x430, 0x431, 0x2e, 0x3b, 0x440, 0x430, 0x43c, 0x2e,
+0x3b, 0x448, 0x430, 0x432, 0x2e, 0x3b, 0x434, 0x443, 0x43b, 0x43a, 0x2e, 0x3b, 0x434, 0x443, 0x43b, 0x445, 0x2e, 0xd2e, 0xd41, 0xd39,
+0xd31, 0xd02, 0x3b, 0xd38, 0xd2b, 0xd7c, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b,
+0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd05,
+0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b, 0xd31, 0xd1c, 0xd2c,
+0xd4d, 0x3b, 0xd36, 0xd39, 0xd2c, 0xd3e, 0xd7b, 0x3b, 0xd31, 0xd2e, 0xd26, 0xd3e, 0xd7b, 0x3b, 0xd36, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd7d,
+0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd16, 0xd39, 0xd26, 0xd4d, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd39, 0xd3f, 0xd1c, 0xd4d, 0xd1c, 0xd2e,
+0xd41, 0xd39, 0xd31, 0xd02, 0x3b, 0xd38, 0xd2b, 0xd7c, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35,
+0xd7d, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d,
+0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0xd7d, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0xd7c, 0x3b, 0xd31,
+0xd1c, 0xd2c, 0xd4d, 0x3b, 0xd36, 0xd39, 0xd2c, 0xd3e, 0xd7b, 0x3b, 0xd31, 0xd2e, 0xd33, 0xd3e, 0xd7b, 0x3b, 0xd36, 0xd35, 0xd4d, 0xd35,
+0xd3e, 0xd7d, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd16, 0xd39, 0xd26, 0xd4d, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd39, 0xd3f, 0xd1c, 0xd4d,
+0xd1c, 0xd2e, 0xd41, 0xd39, 0x2e, 0x3b, 0xd38, 0xd2b, 0x2e, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd05, 0xd35, 0xd4d,
+0xd35, 0x2e, 0x3b, 0xd31, 0xd2c, 0xd40, 0xd39, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0x2e, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41,
+0xd7d, 0x20, 0xd05, 0xd35, 0xd4d, 0xd35, 0x2e, 0x3b, 0xd1c, 0xd2e, 0xd3e, 0xd26, 0xd41, 0xd7d, 0x20, 0xd06, 0xd16, 0xd3f, 0x2e, 0x3b,
+0xd31, 0xd1c, 0x2e, 0x3b, 0xd36, 0xd39, 0xd2c, 0xd3e, 0x2e, 0x3b, 0xd31, 0xd2e, 0xd26, 0xd3e, 0x2e, 0x3b, 0xd36, 0xd35, 0xd4d, 0xd35,
+0xd3e, 0x2e, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd16, 0xd39, 0x2e, 0x3b, 0xd26, 0xd41, 0xd7d, 0x20, 0xd39, 0xd3f, 0x2e, 0xd2e, 0xd41,
+0x3b, 0xd38, 0x3b, 0xd31, 0x3b, 0xd31, 0x3b, 0xd1c, 0x3b, 0xd1c, 0x3b, 0xd31, 0x3b, 0xd36, 0x3b, 0xd31, 0x3b, 0xd36, 0x3b, 0xd26,
+0xd41, 0x3b, 0xd26, 0xd41, 0x92e, 0x94b, 0x939, 0x930, 0x92e, 0x3b, 0x938, 0x92b, 0x930, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49,
+0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49, 0x49, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x926, 0x93e, 0x20, 0x49, 0x3b, 0x91c, 0x941,
+0x92e, 0x93e, 0x926, 0x93e, 0x20, 0x49, 0x49, 0x3b, 0x930, 0x91d, 0x93e, 0x92c, 0x3b, 0x936, 0x93e, 0x92c, 0x93e, 0x928, 0x3b, 0x930,
+0x92e, 0x91c, 0x93e, 0x928, 0x3b, 0x936, 0x935, 0x94d, 0x935, 0x93e, 0x932, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x915, 0x940, 0x926, 0x93e,
+0x939, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x939, 0x93f, 0x91c, 0x93e, 0x939, 0x92e, 0x94b, 0x939, 0x2e, 0x3b, 0x938, 0x92b, 0x2e, 0x3b,
+0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49, 0x3b, 0x930, 0x93e, 0x92c, 0x940, 0x20, 0x49, 0x49, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x2e,
+0x20, 0x49, 0x3b, 0x91c, 0x941, 0x92e, 0x93e, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x930, 0x91d, 0x93e, 0x2e, 0x3b, 0x936, 0x93e, 0x92c,
+0x93e, 0x2e, 0x3b, 0x930, 0x92e, 0x2e, 0x3b, 0x936, 0x935, 0x94d, 0x935, 0x93e, 0x2e, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x915, 0x940,
+0x2e, 0x3b, 0x927, 0x941, 0x932, 0x2d, 0x939, 0x93f, 0x2e, 0x967, 0x3b, 0x968, 0x3b, 0x969, 0x3b, 0x96a, 0x3b, 0x96b, 0x3b, 0x96c,
+0x3b, 0x96d, 0x3b, 0x96e, 0x3b, 0x96f, 0x3b, 0x967, 0x966, 0x3b, 0x967, 0x967, 0x3b, 0x967, 0x968, 0x6d, 0x75, 0x68, 0x61, 0x72,
+0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x72, 0x61,
+0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61,
+0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b,
+0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2bb,
+0x6c, 0x2d, 0x71, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61,
+0x68, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61,
0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49,
0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x77,
-0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x2e, 0x3b,
-0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb,
-0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49,
-0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61,
-0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c,
-0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d,
-0x68, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x3b, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62,
-0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x6a,
-0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d,
-0x2e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x2e, 0x3b, 0x64, 0x68, 0x75,
-0x2bb, 0x6c, 0x2d, 0x68, 0x2e, 0x3b, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b,
+0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x2e, 0x6d,
+0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x2e,
+0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72,
+0x61, 0x6a, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x2e, 0x3b,
+0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x2e, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x68, 0x2e, 0x645, 0x62d, 0x631,
+0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c,
+0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x648, 0x645, 0x627, 0x20, 0x49, 0x49, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639,
+0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x62f, 0x627, 0x644, 0x642, 0x627,
+0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b,
+0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c,
+0x645, 0x648, 0x645, 0x627, 0x20, 0x49, 0x49, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645,
+0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x647, 0x3b, 0x630,
+0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b,
0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x64a, 0x20,
0x6f2, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648,
-0x627, 0x644, 0x3b, 0x62f, 0x627, 0x644, 0x642, 0x627, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x3b,
-0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49,
-0x49, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x648, 0x645, 0x627, 0x20, 0x49, 0x49, 0x3b, 0x631, 0x62c, 0x628,
-0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x62f, 0x627,
-0x644, 0x642, 0x627, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x3b, 0x645, 0x62d, 0x631, 0x645, 0x3b,
-0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627,
-0x62f, 0x20, 0x6f1, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x20, 0x6f2, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646,
-0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x62f, 0x627, 0x644, 0x642, 0x627, 0x639, 0x62f, 0x647,
-0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x3b, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628,
-0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x648,
-0x645, 0x627, 0x20, 0x49, 0x49, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627,
-0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20,
-0x627, 0x644, 0x62d, 0x62c, 0x3b, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x62f, 0x20, 0x635, 0x641, 0x631, 0x6d2, 0x20, 0x62f, 0x3b, 0x631,
-0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645,
-0x648, 0x645, 0x627, 0x20, 0x49, 0x49, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636,
-0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x62f, 0x627, 0x644, 0x642, 0x627, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20,
-0x627, 0x644, 0x62d, 0x62c, 0x3b, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x62f, 0x20, 0x635, 0x641, 0x631, 0x6d2, 0x20, 0x62f, 0x3b, 0x631,
-0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645,
-0x648, 0x645, 0x627, 0x20, 0x49, 0x49, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636,
-0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a,
-0x20, 0x627, 0x644, 0x62d, 0x62c, 0x3b, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x200c,
-0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x200c, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x62c, 0x645,
-0x627, 0x62f, 0x6cc, 0x200c, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x200c, 0x627, 0x644, 0x62b, 0x627,
-0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634,
-0x648, 0x627, 0x644, 0x3b, 0x630, 0x6cc, 0x642, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x6cc, 0x62d, 0x62c, 0x647, 0x3b, 0x645, 0x3b, 0x635,
-0x3b, 0x631, 0x3b, 0x631, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x631, 0x3b, 0x634, 0x3b, 0x631, 0x3b, 0x634, 0x3b, 0x630, 0x3b, 0x630,
-0x3b, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x200c, 0x627, 0x644, 0x627, 0x648, 0x644,
+0x627, 0x644, 0x3b, 0x62f, 0x627, 0x644, 0x642, 0x627, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645,
+0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49,
+0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x20, 0x6f1, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x20, 0x6f2, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634,
+0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x62f, 0x627, 0x644, 0x642,
+0x627, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x62f, 0x20, 0x635,
+0x641, 0x631, 0x6d2, 0x20, 0x62f, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c,
+0x645, 0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x648, 0x645, 0x627, 0x20, 0x49, 0x49, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639,
+0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x62f, 0x627, 0x644, 0x642, 0x627,
+0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x62f, 0x20, 0x635, 0x641,
+0x631, 0x6d2, 0x20, 0x62f, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x3b, 0x631, 0x628, 0x64a, 0x639, 0x20, 0x49, 0x49, 0x3b, 0x62c, 0x645,
+0x627, 0x639, 0x647, 0x3b, 0x62c, 0x645, 0x648, 0x645, 0x627, 0x20, 0x49, 0x49, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628,
+0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x642,
+0x639, 0x62f, 0x647, 0x3b, 0x630, 0x64a, 0x20, 0x627, 0x644, 0x62d, 0x62c, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b,
+0x631, 0x628, 0x6cc, 0x639, 0x200c, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x200c, 0x627, 0x644, 0x62b, 0x627,
+0x646, 0x6cc, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x200c, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc,
+0x200c, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645,
+0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x6cc, 0x642, 0x639, 0x62f, 0x647, 0x3b, 0x630, 0x6cc, 0x62d, 0x62c,
+0x647, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x200c, 0x627, 0x644, 0x627, 0x648, 0x644,
0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x200c, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x200c, 0x627,
0x644, 0x627, 0x648, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x200c, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c,
0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630,
-0x6cc, 0x642, 0x639, 0x62f, 0x647, 0x654, 0x3b, 0x630, 0x6cc, 0x62d, 0x62c, 0x647, 0x654, 0x3b, 0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53,
-0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x44,
-0x17c, 0x75, 0x2e, 0x20, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x2e, 0x3b, 0x53, 0x7a,
-0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x7a, 0x61, 0x77, 0x2e, 0x3b, 0x5a, 0x75, 0x20, 0x61, 0x6c, 0x2d,
-0x6b, 0x2e, 0x3b, 0x5a, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x2e, 0x3b, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d,
-0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb,
-0x20, 0x49, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x6d, 0x61, 0x64,
-0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x64, 0x17c, 0x61, 0x62, 0x3b, 0x53, 0x7a, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52,
-0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x7a, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x5a, 0x75, 0x20, 0x61, 0x6c,
-0x2d, 0x6b, 0x61, 0x64, 0x61, 0x3b, 0x5a, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17c, 0x64, 0x17c, 0x61, 0x3b,
-0xa2e, 0xa41, 0xa39, 0xa71, 0x2e, 0x3b, 0xa38, 0xa2b, 0x2e, 0x3b, 0xa30, 0xa2c, 0x2e, 0x20, 0x49, 0x3b, 0xa30, 0xa2c, 0x2e, 0x20,
-0x49, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0x2e, 0x20, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xa30, 0xa3e,
-0xa1c, 0x2e, 0x3b, 0xa38, 0xa3c, 0xa3e, 0x2e, 0x3b, 0xa30, 0xa3e, 0xa2e, 0x2e, 0x3b, 0xa38, 0xa3c, 0xa05, 0x2e, 0x3b, 0xa26, 0xa42,
-0x2d, 0xa05, 0xa32, 0x2d, 0xa15, 0xa40, 0x2e, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa39, 0xa3f, 0x2e, 0x3b, 0xa2e, 0xa41,
-0xa39, 0xa71, 0xa30, 0xa2e, 0x3b, 0xa38, 0xa2b, 0xa30, 0x3b, 0xa30, 0xa2c, 0xa40, 0x2bb, 0x20, 0x49, 0x3b, 0xa30, 0xa2c, 0xa40, 0x2bb,
-0x20, 0x49, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20,
-0x49, 0x49, 0x3b, 0xa30, 0xa1c, 0xa2c, 0x3b, 0xa38, 0xa3c, 0xa2c, 0xa3e, 0xa28, 0x3b, 0xa30, 0xa2e, 0xa1c, 0xa3c, 0xa3e, 0xa28, 0x3b,
-0xa38, 0xa3c, 0xa35, 0xa3e, 0xa32, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa15, 0xa40, 0xa26, 0xa3e, 0xa39, 0x3b, 0xa26, 0xa42,
-0x2d, 0xa05, 0xa32, 0x2d, 0xa39, 0xa3f, 0xa1c, 0xa4d, 0xa39, 0xa3e, 0x3b, 0xa2e, 0xa41, 0xa39, 0xa71, 0xa30, 0xa2e, 0x3b, 0xa38, 0xa2b,
-0xa30, 0x3b, 0xa30, 0xa2c, 0xa40, 0x20, 0x2bb, 0x20, 0x49, 0x3b, 0xa30, 0xa2c, 0xa40, 0x20, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0xa1c,
-0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49, 0x49, 0x3b, 0xa30, 0xa1c,
-0xa2c, 0x3b, 0xa38, 0xa3c, 0xa2c, 0xa3e, 0xa28, 0x3b, 0xa30, 0xa2e, 0xa1c, 0xa3c, 0xa3e, 0xa28, 0x3b, 0xa38, 0xa3c, 0xa35, 0xa3e, 0xa32,
-0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa15, 0xa40, 0xa26, 0xa3e, 0xa39, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa39,
-0xa3f, 0xa1c, 0xa4d, 0xa39, 0xa3e, 0x3b, 0x43c, 0x443, 0x445, 0x2e, 0x3b, 0x441, 0x430, 0x444, 0x2e, 0x3b, 0x440, 0x430, 0x431, 0x2e,
-0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x3b, 0x434,
-0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x2e, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x2e, 0x3b,
-0x440, 0x430, 0x43c, 0x2e, 0x3b, 0x448, 0x430, 0x432, 0x2e, 0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x43a, 0x2e, 0x3b, 0x437, 0x443,
-0x43b, 0x44c, 0x2d, 0x445, 0x2e, 0x3b, 0x43c, 0x443, 0x445, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440,
-0x3b, 0x440, 0x430, 0x431, 0x438, 0x2d, 0x443, 0x43b, 0x44c, 0x2d, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x44c, 0x3b, 0x440, 0x430, 0x431,
-0x438, 0x2d, 0x443, 0x43b, 0x44c, 0x2d, 0x430, 0x445, 0x438, 0x440, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x2d, 0x443, 0x43b,
-0x44c, 0x2d, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x44c, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x2d, 0x443, 0x43b, 0x44c, 0x2d,
-0x430, 0x445, 0x438, 0x440, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x430, 0x431, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440,
-0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x448, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x44c, 0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d,
-0x43a, 0x430, 0x430, 0x434, 0x430, 0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x445, 0x438, 0x434, 0x436, 0x436, 0x430, 0x3b, 0x41c, 0x443,
-0x445, 0x2e, 0x3b, 0x421, 0x430, 0x444, 0x2e, 0x3b, 0x420, 0x435, 0x431, 0x2e, 0x20, 0x31, 0x3b, 0x420, 0x435, 0x431, 0x2e, 0x20,
-0x32, 0x3b, 0x40f, 0x443, 0x43c, 0x2e, 0x20, 0x31, 0x3b, 0x40f, 0x443, 0x43c, 0x2e, 0x20, 0x32, 0x3b, 0x420, 0x435, 0x45f, 0x2e,
-0x3b, 0x428, 0x430, 0x2e, 0x3b, 0x420, 0x430, 0x43c, 0x2e, 0x3b, 0x428, 0x435, 0x2e, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x43a, 0x2e,
-0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x445, 0x2e, 0x3b, 0x41c, 0x443, 0x445, 0x430, 0x440, 0x435, 0x43c, 0x3b, 0x421, 0x430, 0x444, 0x435,
-0x440, 0x3b, 0x420, 0x435, 0x431, 0x438, 0x20, 0x31, 0x3b, 0x420, 0x435, 0x431, 0x438, 0x20, 0x32, 0x3b, 0x40f, 0x443, 0x43c, 0x430,
-0x434, 0x435, 0x20, 0x31, 0x3b, 0x40f, 0x443, 0x43c, 0x430, 0x434, 0x435, 0x20, 0x32, 0x3b, 0x420, 0x435, 0x45f, 0x435, 0x431, 0x3b,
-0x428, 0x430, 0x2bb, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x428, 0x435, 0x432, 0x430, 0x43b,
-0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x43a, 0x430, 0x434, 0x435, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x445, 0x438, 0x45f, 0x435, 0x3b, 0x41c,
-0x443, 0x440, 0x430, 0x445, 0x430, 0x43c, 0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x2bb, 0x20, 0x49,
-0x3b, 0x420, 0x430, 0x431, 0x438, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x408, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x3b, 0x408,
-0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x49, 0x3b, 0x420, 0x430, 0x452, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x2bb, 0x431, 0x430,
-0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x430, 0x43b, 0x3b, 0x414, 0x443, 0x2bb, 0x43b,
-0x2d, 0x41a, 0x438, 0x2bb, 0x434, 0x430, 0x3b, 0x414, 0x443, 0x2bb, 0x43b, 0x2d, 0x445, 0x438, 0x452, 0x430, 0x3b, 0x4d, 0x75, 0x68,
-0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x65, 0x62, 0x2e, 0x20, 0x31, 0x3b, 0x52, 0x65, 0x62, 0x2e, 0x20, 0x32,
-0x3b, 0x44, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x31, 0x3b, 0x44, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x32, 0x3b, 0x52, 0x65, 0x64,
-0x17e, 0x2e, 0x3b, 0x160, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x160, 0x65, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x2d,
-0x6b, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68, 0x2e, 0x3b, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x65, 0x6d, 0x3b, 0x53, 0x61,
-0x66, 0x65, 0x72, 0x3b, 0x52, 0x65, 0x62, 0x69, 0x20, 0x31, 0x3b, 0x52, 0x65, 0x62, 0x69, 0x20, 0x32, 0x3b, 0x44, 0x17e,
-0x75, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x31, 0x3b, 0x44, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x32, 0x3b, 0x52, 0x65,
-0x64, 0x17e, 0x65, 0x62, 0x3b, 0x160, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b,
-0x160, 0x65, 0x76, 0x61, 0x6c, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68,
-0x69, 0x64, 0x17e, 0x65, 0x3b, 0x4d, 0x75, 0x72, 0x61, 0x68, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52,
-0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
-0x64, 0x61, 0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x111, 0x61, 0x62,
-0x3b, 0x160, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x160, 0x61, 0x76, 0x61,
-0x6c, 0x3b, 0x44, 0x75, 0x2bb, 0x6c, 0x2d, 0x4b, 0x69, 0x2bb, 0x64, 0x61, 0x3b, 0x44, 0x75, 0x2bb, 0x6c, 0x2d, 0x68, 0x69,
-0x111, 0x61, 0x3b, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b,
-0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d,
-0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x64, 0x2e, 0x3b, 0x161, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x161,
-0x61, 0x75, 0x2e, 0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x68,
-0x2e, 0x3b, 0x61, 0x6c, 0x2d, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b,
-0x72, 0x61, 0x62, 0xed, 0xb4, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0xed, 0xb4,
-0x61, 0x74, 0x68, 0x2d, 0x74, 0x68, 0xe1, 0x6e, 0xed, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x6c, 0x2d,
-0xfa, 0x6c, 0xe1, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x6c, 0x2d, 0xe1, 0x63, 0x68, 0x69, 0x72, 0x61,
-0x3b, 0x72, 0x61, 0x64, 0x17e, 0x61, 0x62, 0x3b, 0x161, 0x61, 0xb4, 0x20, 0x62, 0xe1, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61,
-0x64, 0xe1, 0x6e, 0x3b, 0x161, 0x61, 0x75, 0x76, 0xe1, 0x6c, 0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x61, 0xb4,
-0x20, 0x64, 0x61, 0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17e, 0x64, 0x17e, 0x61, 0x3b, 0x4d, 0x75,
-0x78, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20,
-0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61,
-0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x44,
-0x75, 0x6c, 0x2d, 0x51, 0x2e, 0x3b, 0x44, 0x75, 0x6c, 0x2d, 0x58, 0x2e, 0x3b, 0x4d, 0x75, 0x78, 0x61, 0x72, 0x72, 0x61,
-0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77,
-0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61,
-0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x63,
-0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b,
-0x44, 0x75, 0x6c, 0x20, 0x61, 0x6c, 0x2d, 0x71, 0x61, 0x63, 0x64, 0x61, 0x68, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x78, 0x69,
-0x6a, 0x6a, 0x61, 0x68, 0x3b, 0x4d, 0x75, 0x78, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20,
-0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d,
-0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b,
-0x53, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c,
-0x2d, 0x48, 0x2e, 0x3b, 0x4d, 0x75, 0x78, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52,
-0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x63, 0x20,
-0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x61,
-0x77, 0x77, 0x61, 0x6c, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69,
-0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x63, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64,
-0x61, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x61, 0x6c, 0x2d, 0x71, 0x61,
-0x63, 0x64, 0x61, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x78, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x3b, 0x6d, 0x75, 0x68, 0x61, 0x72,
-0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x72, 0x61,
-0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61,
-0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b,
-0x72, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2bb,
-0x6c, 0x2d, 0x71, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61,
-0x68, 0x3b, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62,
-0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c,
-0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x75, 0x6c, 0x61, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x52, 0x61, 0x6a, 0x61,
-0x62, 0x3b, 0x53, 0x68, 0x61, 0x2019, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68,
-0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x67, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x44, 0x68,
-0x75, 0x2d, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x3b, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73,
-0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b,
-0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64,
-0x61, 0x2d, 0x6c, 0x2d, 0x75, 0x6c, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x61, 0x6b, 0x68,
-0x69, 0x72, 0x61, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x2019, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61,
-0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c, 0x2d,
-0x67, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x3b, 0x41c, 0x443,
+0x6cc, 0x642, 0x639, 0x62f, 0x647, 0x654, 0x3b, 0x630, 0x6cc, 0x62d, 0x62c, 0x647, 0x654, 0x645, 0x3b, 0x635, 0x3b, 0x631, 0x3b, 0x631,
+0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x631, 0x3b, 0x634, 0x3b, 0x631, 0x3b, 0x634, 0x3b, 0x630, 0x3b, 0x630, 0x4d, 0x75, 0x68, 0x61,
+0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52,
+0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x44, 0x17c,
+0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x64, 0x17c, 0x61, 0x62, 0x3b, 0x53, 0x7a, 0x61, 0x62,
+0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x7a, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x5a,
+0x75, 0x20, 0x61, 0x6c, 0x2d, 0x6b, 0x61, 0x64, 0x61, 0x3b, 0x5a, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17c,
+0x64, 0x17c, 0x61, 0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b,
+0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x2e, 0x20, 0x49, 0x3b, 0x44, 0x17c, 0x75, 0x2e, 0x20,
+0x49, 0x49, 0x3b, 0x52, 0x61, 0x2e, 0x3b, 0x53, 0x7a, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x7a, 0x61,
+0x77, 0x2e, 0x3b, 0x5a, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x5a, 0x75, 0x20, 0x61, 0x6c, 0x2d, 0x68, 0x2e,
+0xa2e, 0xa41, 0xa39, 0xa71, 0xa30, 0xa2e, 0x3b, 0xa38, 0xa2b, 0xa30, 0x3b, 0xa30, 0xa2c, 0xa40, 0x2bb, 0x20, 0x49, 0x3b, 0xa30, 0xa2c,
+0xa40, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26,
+0xa3e, 0x20, 0x49, 0x49, 0x3b, 0xa30, 0xa1c, 0xa2c, 0x3b, 0xa38, 0xa3c, 0xa2c, 0xa3e, 0xa28, 0x3b, 0xa30, 0xa2e, 0xa1c, 0xa3c, 0xa3e,
+0xa28, 0x3b, 0xa38, 0xa3c, 0xa35, 0xa3e, 0xa32, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa15, 0xa40, 0xa26, 0xa3e, 0xa39, 0x3b,
+0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa39, 0xa3f, 0xa1c, 0xa4d, 0xa39, 0xa3e, 0xa2e, 0xa41, 0xa39, 0xa71, 0xa30, 0xa2e, 0x3b, 0xa38,
+0xa2b, 0xa30, 0x3b, 0xa30, 0xa2c, 0xa40, 0x20, 0x2bb, 0x20, 0x49, 0x3b, 0xa30, 0xa2c, 0xa40, 0x20, 0x2bb, 0x20, 0x49, 0x49, 0x3b,
+0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0xa3e, 0xa26, 0xa3e, 0x20, 0x49, 0x49, 0x3b, 0xa30,
+0xa1c, 0xa2c, 0x3b, 0xa38, 0xa3c, 0xa2c, 0xa3e, 0xa28, 0x3b, 0xa30, 0xa2e, 0xa1c, 0xa3c, 0xa3e, 0xa28, 0x3b, 0xa38, 0xa3c, 0xa35, 0xa3e,
+0xa32, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa15, 0xa40, 0xa26, 0xa3e, 0xa39, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d,
+0xa39, 0xa3f, 0xa1c, 0xa4d, 0xa39, 0xa3e, 0xa2e, 0xa41, 0xa39, 0xa71, 0x2e, 0x3b, 0xa38, 0xa2b, 0x2e, 0x3b, 0xa30, 0xa2c, 0x2e, 0x20,
+0x49, 0x3b, 0xa30, 0xa2c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0x2e, 0x20, 0x49, 0x3b, 0xa1c, 0xa41, 0xa2e, 0x2e,
+0x20, 0x49, 0x49, 0x3b, 0xa30, 0xa3e, 0xa1c, 0x2e, 0x3b, 0xa38, 0xa3c, 0xa3e, 0x2e, 0x3b, 0xa30, 0xa3e, 0xa2e, 0x2e, 0x3b, 0xa38,
+0xa3c, 0xa05, 0x2e, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d, 0xa15, 0xa40, 0x2e, 0x3b, 0xa26, 0xa42, 0x2d, 0xa05, 0xa32, 0x2d,
+0xa39, 0xa3f, 0x2e, 0x43c, 0x443, 0x445, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x440, 0x430,
+0x431, 0x438, 0x2d, 0x443, 0x43b, 0x44c, 0x2d, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x44c, 0x3b, 0x440, 0x430, 0x431, 0x438, 0x2d, 0x443,
+0x43b, 0x44c, 0x2d, 0x430, 0x445, 0x438, 0x440, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x2d, 0x443, 0x43b, 0x44c, 0x2d, 0x430,
+0x432, 0x432, 0x430, 0x43b, 0x44c, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x2d, 0x443, 0x43b, 0x44c, 0x2d, 0x430, 0x445, 0x438,
+0x440, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x430, 0x431, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440, 0x430, 0x43c, 0x430,
+0x434, 0x430, 0x43d, 0x3b, 0x448, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x44c, 0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x43a, 0x430, 0x430,
+0x434, 0x430, 0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x445, 0x438, 0x434, 0x436, 0x436, 0x430, 0x43c, 0x443, 0x445, 0x2e, 0x3b, 0x441,
+0x430, 0x444, 0x2e, 0x3b, 0x440, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x434,
+0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x434, 0x436,
+0x2e, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x2e, 0x3b, 0x440, 0x430, 0x43c, 0x2e, 0x3b, 0x448, 0x430, 0x432, 0x2e, 0x3b, 0x437, 0x443,
+0x43b, 0x44c, 0x2d, 0x43a, 0x2e, 0x3b, 0x437, 0x443, 0x43b, 0x44c, 0x2d, 0x445, 0x2e, 0x41c, 0x443, 0x445, 0x430, 0x440, 0x435, 0x43c,
+0x3b, 0x421, 0x430, 0x444, 0x435, 0x440, 0x3b, 0x420, 0x435, 0x431, 0x438, 0x20, 0x31, 0x3b, 0x420, 0x435, 0x431, 0x438, 0x20, 0x32,
+0x3b, 0x40f, 0x443, 0x43c, 0x430, 0x434, 0x435, 0x20, 0x31, 0x3b, 0x40f, 0x443, 0x43c, 0x430, 0x434, 0x435, 0x20, 0x32, 0x3b, 0x420,
+0x435, 0x45f, 0x435, 0x431, 0x3b, 0x428, 0x430, 0x2bb, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x437, 0x430, 0x43d, 0x3b,
+0x428, 0x435, 0x432, 0x430, 0x43b, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x43a, 0x430, 0x434, 0x435, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x445,
+0x438, 0x45f, 0x435, 0x41c, 0x443, 0x440, 0x430, 0x445, 0x430, 0x43c, 0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431,
+0x438, 0x2bb, 0x20, 0x49, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x408, 0x443, 0x43c, 0x430, 0x434, 0x430,
+0x20, 0x49, 0x3b, 0x408, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x49, 0x3b, 0x420, 0x430, 0x452, 0x430, 0x431, 0x3b, 0x428,
+0x430, 0x2bb, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x430, 0x43b, 0x3b,
+0x414, 0x443, 0x2bb, 0x43b, 0x2d, 0x41a, 0x438, 0x2bb, 0x434, 0x430, 0x3b, 0x414, 0x443, 0x2bb, 0x43b, 0x2d, 0x445, 0x438, 0x452, 0x430,
+0x41c, 0x443, 0x445, 0x2e, 0x3b, 0x421, 0x430, 0x444, 0x2e, 0x3b, 0x420, 0x435, 0x431, 0x2e, 0x20, 0x31, 0x3b, 0x420, 0x435, 0x431,
+0x2e, 0x20, 0x32, 0x3b, 0x40f, 0x443, 0x43c, 0x2e, 0x20, 0x31, 0x3b, 0x40f, 0x443, 0x43c, 0x2e, 0x20, 0x32, 0x3b, 0x420, 0x435,
+0x45f, 0x2e, 0x3b, 0x428, 0x430, 0x2e, 0x3b, 0x420, 0x430, 0x43c, 0x2e, 0x3b, 0x428, 0x435, 0x2e, 0x3b, 0x417, 0x443, 0x43b, 0x2d,
+0x43a, 0x2e, 0x3b, 0x417, 0x443, 0x43b, 0x2d, 0x445, 0x2e, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x65, 0x6d, 0x3b, 0x53, 0x61, 0x66,
+0x65, 0x72, 0x3b, 0x52, 0x65, 0x62, 0x69, 0x20, 0x31, 0x3b, 0x52, 0x65, 0x62, 0x69, 0x20, 0x32, 0x3b, 0x44, 0x17e, 0x75,
+0x6d, 0x61, 0x64, 0x65, 0x20, 0x31, 0x3b, 0x44, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x32, 0x3b, 0x52, 0x65, 0x64,
+0x17e, 0x65, 0x62, 0x3b, 0x160, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b, 0x160,
+0x65, 0x76, 0x61, 0x6c, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68, 0x69,
+0x64, 0x17e, 0x65, 0x4d, 0x75, 0x72, 0x61, 0x68, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62,
+0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61,
+0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x111, 0x61, 0x62, 0x3b, 0x160,
+0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x160, 0x61, 0x76, 0x61, 0x6c, 0x3b,
+0x44, 0x75, 0x2bb, 0x6c, 0x2d, 0x4b, 0x69, 0x2bb, 0x64, 0x61, 0x3b, 0x44, 0x75, 0x2bb, 0x6c, 0x2d, 0x68, 0x69, 0x111, 0x61,
+0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x65, 0x62, 0x2e, 0x20, 0x31, 0x3b, 0x52, 0x65, 0x62,
+0x2e, 0x20, 0x32, 0x3b, 0x44, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x31, 0x3b, 0x44, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x32, 0x3b,
+0x52, 0x65, 0x64, 0x17e, 0x2e, 0x3b, 0x160, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x160, 0x65, 0x2e, 0x3b, 0x5a,
+0x75, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68, 0x2e, 0x61, 0x6c, 0x2d, 0x6d, 0x75, 0x68, 0x61, 0x72,
+0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0xed, 0xb4, 0x20, 0x61, 0x6c, 0x2d, 0x61,
+0x76, 0x76, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x62, 0xed, 0xb4, 0x61, 0x74, 0x68, 0x2d, 0x74, 0x68, 0xe1, 0x6e, 0xed, 0x3b,
+0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64, 0xe1, 0x20, 0x6c, 0x2d, 0xfa, 0x6c, 0xe1, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0xe1, 0x64,
+0xe1, 0x20, 0x6c, 0x2d, 0xe1, 0x63, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x72, 0x61, 0x64, 0x17e, 0x61, 0x62, 0x3b, 0x161, 0x61,
+0xb4, 0x20, 0x62, 0xe1, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x161, 0x61, 0x75, 0x76, 0xe1, 0x6c,
+0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x61, 0xb4, 0x20, 0x64, 0x61, 0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d,
+0x68, 0x69, 0x64, 0x17e, 0x64, 0x17e, 0x61, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62,
+0x2e, 0x20, 0x49, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b,
+0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x64, 0x2e, 0x3b, 0x161, 0x61, 0x2e, 0x3b, 0x72, 0x61,
+0x6d, 0x2e, 0x3b, 0x161, 0x61, 0x75, 0x2e, 0x3b, 0x64, 0x68, 0xfa, 0x20, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x64, 0x68, 0xfa,
+0x20, 0x6c, 0x2d, 0x68, 0x2e, 0x4d, 0x75, 0x78, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b,
+0x52, 0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x63,
+0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d,
+0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e,
+0x69, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x63, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61,
+0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x61, 0x6c, 0x2d, 0x71,
+0x61, 0x63, 0x64, 0x61, 0x68, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x78, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x78, 0x61,
+0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d,
+0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69,
+0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x6a, 0x75, 0x6d,
+0x61, 0x64, 0x61, 0x20, 0x61, 0x6c, 0x2d, 0x74, 0x68, 0x61, 0x6e, 0x69, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53,
+0x68, 0x61, 0x63, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x77,
+0x61, 0x6c, 0x3b, 0x44, 0x75, 0x6c, 0x20, 0x61, 0x6c, 0x2d, 0x71, 0x61, 0x63, 0x64, 0x61, 0x3b, 0x44, 0x75, 0x6c, 0x20,
+0x78, 0x69, 0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x78, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e,
+0x20, 0x49, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x75,
+0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e,
+0x3b, 0x53, 0x68, 0x61, 0x77, 0x2e, 0x3b, 0x44, 0x75, 0x6c, 0x2d, 0x51, 0x2e, 0x3b, 0x44, 0x75, 0x6c, 0x2d, 0x58, 0x2e,
+0x4d, 0x75, 0x78, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x61, 0x62, 0x2e, 0x20, 0x49, 0x3b, 0x52, 0x61, 0x62,
+0x2e, 0x20, 0x49, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x49, 0x49, 0x3b,
+0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x77, 0x2e,
+0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x2e, 0x3b, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x2e, 0x6d, 0x75,
+0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49,
+0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x6a,
+0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x2bb, 0x62,
+0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x64, 0xe1, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64,
+0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x71, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x68, 0x69,
+0x6a, 0x6a, 0x61, 0x68, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52,
+0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x69, 0x2019, 0x20,
+0x61, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x75, 0x6c,
+0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x61, 0x3b, 0x52, 0x61,
+0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x2019, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b,
+0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x44, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x67, 0x61, 0x2019, 0x64, 0x61, 0x3b,
+0x44, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b,
+0x73, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x77, 0x77, 0x61, 0x6c,
+0x3b, 0x72, 0x61, 0x62, 0x69, 0x2019, 0x20, 0x61, 0x6c, 0x2d, 0x61, 0x6b, 0x68, 0x69, 0x72, 0x3b, 0x6a, 0x75, 0x6d, 0x61,
+0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x75, 0x6c, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x2d, 0x6c, 0x2d, 0x61, 0x6b,
+0x68, 0x69, 0x72, 0x61, 0x3b, 0x72, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x73, 0x68, 0x61, 0x2019, 0x62, 0x61, 0x6e, 0x3b, 0x72,
+0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c,
+0x2d, 0x67, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x64, 0x68, 0x75, 0x2d, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x43c, 0x443,
+0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49,
+0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49, 0x49, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d,
+0x443, 0x43b, 0x43e, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d, 0x441, 0x43e, 0x43d, 0x438, 0x3b, 0x440,
+0x430, 0x4b7, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x428,
+0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x49a, 0x438, 0x434, 0x430, 0x4b3, 0x3b, 0x414, 0x445, 0x443,
+0x43b, 0x2d, 0x4b2, 0x438, 0x4b7, 0x4b7, 0x430, 0x4b3, 0x43c, 0x443, 0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444,
+0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49, 0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49, 0x49, 0x3b,
+0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d, 0x443, 0x43b, 0x43e, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438,
+0x2d, 0x443, 0x43b, 0x2d, 0x441, 0x43e, 0x43d, 0x438, 0x3b, 0x440, 0x430, 0x4b7, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x431, 0x430, 0x43d,
+0x3b, 0x420, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x414, 0x445, 0x443, 0x442,
+0x2d, 0x49a, 0x438, 0x434, 0x430, 0x4b3, 0x3b, 0x414, 0x445, 0x443, 0x442, 0x2d, 0x4b2, 0x438, 0x4b7, 0x4b7, 0x430, 0x4b3, 0x41c, 0x443,
0x4b3, 0x2e, 0x3b, 0x421, 0x430, 0x444, 0x2e, 0x3b, 0x420, 0x430, 0x431, 0x2e, 0x20, 0x49, 0x3b, 0x420, 0x430, 0x431, 0x2e, 0x20,
0x49, 0x49, 0x3b, 0x4b6, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x3b, 0x4b6, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x420, 0x430,
0x4b7, 0x2e, 0x3b, 0x428, 0x430, 0x2e, 0x3b, 0x420, 0x430, 0x43c, 0x2e, 0x3b, 0x428, 0x430, 0x432, 0x2e, 0x3b, 0x414, 0x445, 0x443,
-0x43b, 0x2d, 0x49a, 0x2e, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x4b2, 0x2e, 0x3b, 0x43c, 0x443, 0x4b3, 0x430, 0x440, 0x440, 0x430,
-0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49, 0x3b, 0x420, 0x430, 0x431, 0x435,
-0x44a, 0x20, 0x49, 0x49, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d, 0x443, 0x43b, 0x43e, 0x3b, 0x4b7,
-0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d, 0x441, 0x43e, 0x43d, 0x438, 0x3b, 0x440, 0x430, 0x4b7, 0x430, 0x431, 0x3b,
-0x428, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432, 0x430, 0x43b,
-0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x49a, 0x438, 0x434, 0x430, 0x4b3, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x4b2, 0x438, 0x4b7,
-0x4b7, 0x430, 0x4b3, 0x3b, 0x43c, 0x443, 0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420,
-0x430, 0x431, 0x435, 0x44a, 0x20, 0x49, 0x3b, 0x420, 0x430, 0x431, 0x435, 0x44a, 0x20, 0x49, 0x49, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e,
-0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d, 0x443, 0x43b, 0x43e, 0x3b, 0x4b7, 0x438, 0x43c, 0x43e, 0x434, 0x438, 0x2d, 0x443, 0x43b, 0x2d,
-0x441, 0x43e, 0x43d, 0x438, 0x3b, 0x440, 0x430, 0x4b7, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x420, 0x430, 0x43c,
-0x430, 0x434, 0x430, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x414, 0x445, 0x443, 0x442, 0x2d, 0x49a, 0x438, 0x434,
-0x430, 0x4b3, 0x3b, 0x414, 0x445, 0x443, 0x442, 0x2d, 0x4b2, 0x438, 0x4b7, 0x4b7, 0x430, 0x4b3, 0x3b, 0xbae, 0xbc1, 0xbb9, 0x2e, 0x3b,
-0xb9a, 0xb83, 0xbaa, 0x2e, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x31, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x32, 0x3b, 0xb9c, 0xbc1, 0xbae,
-0x2e, 0x20, 0x31, 0x3b, 0xb9c, 0xbc1, 0xbae, 0x2e, 0x20, 0x32, 0x3b, 0xbb0, 0xb9c, 0x2e, 0x3b, 0xbb7, 0xb83, 0x2e, 0x3b, 0xbb0,
-0xbae, 0x2e, 0x3b, 0xbb7, 0xbb5, 0xbcd, 0x2e, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd, 0x20, 0xb95, 0xb83, 0x2e, 0x3b, 0xba4, 0xbc1, 0xbb2,
-0xbcd, 0x20, 0xbb9, 0xbbf, 0xb9c, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbc1, 0xbb9, 0xbb0, 0xbcd, 0xbb0, 0xbae, 0xbcd, 0x3b, 0xb9a, 0xb83, 0xbaa,
-0xbb0, 0xbcd, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x31, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x32, 0x3b, 0xb9c, 0xbc1, 0xbae, 0xba4, 0xbbe,
-0x20, 0x31, 0x3b, 0xb9c, 0xbc1, 0xbae, 0xba4, 0xbbe, 0x20, 0x32, 0x3b, 0xbb0, 0xb9c, 0xbaa, 0xbcd, 0x3b, 0xbb7, 0xb83, 0xbaa, 0xbbe,
-0xba9, 0xbcd, 0x3b, 0xbb0, 0xbae, 0xbb2, 0xbbe, 0xba9, 0xbcd, 0x3b, 0xbb7, 0xbb5, 0xbcd, 0xbb5, 0xbbe, 0xbb2, 0xbcd, 0x3b, 0xba4, 0xbc1,
-0xbb2, 0xbcd, 0x20, 0xb95, 0xb83, 0xba4, 0xbbe, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd, 0x20, 0xbb9, 0xbbf, 0xb9c, 0xbcd, 0xb9c, 0xbbe, 0x3b,
-0xc2e, 0xc41, 0xc39, 0x2e, 0x3b, 0xc38, 0xc2b, 0x2e, 0x3b, 0xc30, 0x2e, 0x20, 0x49, 0x3b, 0xc30, 0x2e, 0x20, 0x49, 0x49, 0x3b,
-0xc1c, 0xc41, 0xc2e, 0x2e, 0x20, 0x49, 0x3b, 0xc1c, 0xc41, 0xc2e, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xc30, 0xc1c, 0x2e, 0x3b, 0xc37,
-0xc2c, 0xc3e, 0x2e, 0x3b, 0xc30, 0xc02, 0xc1c, 0xc3e, 0x2e, 0x3b, 0xc37, 0xc35, 0xc4d, 0xc35, 0xc3e, 0x2e, 0x3b, 0xc27, 0xc41, 0xc32,
-0xc4d, 0x2d, 0xc15, 0xc3f, 0x2e, 0x3b, 0xc27, 0xc41, 0xc32, 0xc4d, 0x2d, 0xc39, 0xc3f, 0x2e, 0x3b, 0xc2e, 0xc41, 0xc39, 0xc30, 0xc4d,
+0x43b, 0x2d, 0x49a, 0x2e, 0x3b, 0x414, 0x445, 0x443, 0x43b, 0x2d, 0x4b2, 0x2e, 0xbae, 0xbc1, 0xbb9, 0xbb0, 0xbcd, 0xbb0, 0xbae, 0xbcd,
+0x3b, 0xb9a, 0xb83, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x31, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x32, 0x3b, 0xb9c,
+0xbc1, 0xbae, 0xba4, 0xbbe, 0x20, 0x31, 0x3b, 0xb9c, 0xbc1, 0xbae, 0xba4, 0xbbe, 0x20, 0x32, 0x3b, 0xbb0, 0xb9c, 0xbaa, 0xbcd, 0x3b,
+0xbb7, 0xb83, 0xbaa, 0xbbe, 0xba9, 0xbcd, 0x3b, 0xbb0, 0xbae, 0xbb2, 0xbbe, 0xba9, 0xbcd, 0x3b, 0xbb7, 0xbb5, 0xbcd, 0xbb5, 0xbbe, 0xbb2,
+0xbcd, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd, 0x20, 0xb95, 0xb83, 0xba4, 0xbbe, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd, 0x20, 0xbb9, 0xbbf, 0xb9c,
+0xbcd, 0xb9c, 0xbbe, 0xbae, 0xbc1, 0xbb9, 0x2e, 0x3b, 0xb9a, 0xb83, 0xbaa, 0x2e, 0x3b, 0xbb0, 0xbaa, 0xbbf, 0x20, 0x31, 0x3b, 0xbb0,
+0xbaa, 0xbbf, 0x20, 0x32, 0x3b, 0xb9c, 0xbc1, 0xbae, 0x2e, 0x20, 0x31, 0x3b, 0xb9c, 0xbc1, 0xbae, 0x2e, 0x20, 0x32, 0x3b, 0xbb0,
+0xb9c, 0x2e, 0x3b, 0xbb7, 0xb83, 0x2e, 0x3b, 0xbb0, 0xbae, 0x2e, 0x3b, 0xbb7, 0xbb5, 0xbcd, 0x2e, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd,
+0x20, 0xb95, 0xb83, 0x2e, 0x3b, 0xba4, 0xbc1, 0xbb2, 0xbcd, 0x20, 0xbb9, 0xbbf, 0xb9c, 0xbcd, 0x2e, 0xc2e, 0xc41, 0xc39, 0xc30, 0xc4d,
0xc30, 0xc02, 0x3b, 0xc38, 0xc2b, 0xc30, 0xc4d, 0x3b, 0xc30, 0xc2c, 0xc40, 0x20, 0x49, 0x3b, 0xc30, 0xc2c, 0xc40, 0x20, 0x49, 0x49,
0x3b, 0xc1c, 0xc41, 0xc2e, 0xc26, 0xc3e, 0x20, 0x49, 0x3b, 0xc1c, 0xc41, 0xc2e, 0xc26, 0xc3e, 0x20, 0x49, 0x49, 0x3b, 0xc30, 0xc1c,
0xc2c, 0xc4d, 0x3b, 0xc37, 0xc2c, 0xc3e, 0xc28, 0xc4d, 0x3b, 0xc30, 0xc02, 0xc1c, 0xc3e, 0xc28, 0xc4d, 0x3b, 0xc37, 0xc35, 0xc4d, 0xc35,
0xc3e, 0xc32, 0xc4d, 0x3b, 0xc27, 0xc41, 0xc32, 0xc4d, 0x2d, 0xc15, 0xc3f, 0x20, 0xc26, 0xc3e, 0xc39, 0xc4d, 0x3b, 0xc27, 0xc41, 0xc32,
-0xc4d, 0x2d, 0xc39, 0xc3f, 0xc1c, 0xc4d, 0xc1c, 0xc3e, 0xc39, 0xc4d, 0x3b, 0xe21, 0xe38, 0xe2e, 0xe31, 0xe23, 0x2e, 0x3b, 0xe40, 0xe28,
-0xe32, 0xe30, 0x2e, 0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35, 0x20, 0x49, 0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35, 0x20, 0x49, 0x49, 0x3b, 0xe08,
-0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49, 0x49, 0x3b, 0xe40, 0xe23,
-0xe32, 0xe30, 0x2e, 0x3b, 0xe0a, 0xe30, 0xe2d, 0xe4c, 0x2e, 0x3b, 0xe40, 0xe23, 0xe32, 0xe30, 0xe21, 0xe30, 0x2e, 0x3b, 0xe40, 0xe0a,
-0xe32, 0xe27, 0x2e, 0x3b, 0xe0b, 0xe38, 0xe25, 0xe01, 0xe34, 0xe2d, 0xe3a, 0x2e, 0x3b, 0xe0b, 0xe38, 0xe25, 0xe2b, 0xe34, 0xe08, 0x2e,
-0x3b, 0xe21, 0xe38, 0xe2e, 0xe30, 0xe23, 0xe4c, 0xe23, 0xe2d, 0xe21, 0x3b, 0xe0b, 0xe2d, 0xe1f, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe23, 0xe2d,
-0xe1a, 0xe35, 0x20, 0x49, 0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35, 0x20, 0x49, 0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20,
-0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49, 0x49, 0x3b, 0xe23, 0xe2d, 0xe08, 0xe31, 0xe1a, 0x3b, 0xe0a, 0xe30,
-0xe2d, 0xe30, 0xe1a, 0xe32, 0xe19, 0x3b, 0xe23, 0xe2d, 0xe21, 0xe30, 0xe14, 0xe2d, 0xe19, 0x3b, 0xe40, 0xe0a, 0xe32, 0xe27, 0xe31, 0xe25,
-0x3b, 0xe0b, 0xe38, 0xe25, 0xe01, 0xe34, 0xe2d, 0xe3a, 0xe14, 0xe30, 0xe2e, 0xe3a, 0x3b, 0xe0b, 0xe38, 0xe25, 0xe2b, 0xe34, 0xe08, 0xe0d,
-0xe30, 0xe2e, 0xe3a, 0x3b, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x65, 0x72, 0x3b, 0x52, 0x2e, 0x65,
-0x76, 0x76, 0x65, 0x6c, 0x3b, 0x52, 0x2e, 0x61, 0x68, 0x69, 0x72, 0x3b, 0x43, 0x2e, 0x65, 0x76, 0x76, 0x65, 0x6c, 0x3b,
-0x43, 0x2e, 0x61, 0x68, 0x69, 0x72, 0x3b, 0x52, 0x65, 0x63, 0x65, 0x70, 0x3b, 0x15e, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52,
-0x61, 0x6d, 0x2e, 0x3b, 0x15e, 0x65, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x5a, 0x69, 0x6c, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x5a,
-0x69, 0x6c, 0x68, 0x69, 0x63, 0x63, 0x65, 0x3b, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x65, 0x6d, 0x3b, 0x53, 0x61, 0x66,
-0x65, 0x72, 0x3b, 0x52, 0x65, 0x62, 0x69, 0xfc, 0x6c, 0x65, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x52, 0x65, 0x62, 0x69, 0xfc,
-0x6c, 0x61, 0x68, 0x69, 0x72, 0x3b, 0x43, 0x65, 0x6d, 0x61, 0x7a, 0x69, 0x79, 0x65, 0x6c, 0x65, 0x76, 0x76, 0x65, 0x6c,
-0x3b, 0x43, 0x65, 0x6d, 0x61, 0x7a, 0x69, 0x79, 0x65, 0x6c, 0x61, 0x68, 0x69, 0x72, 0x3b, 0x52, 0x65, 0x63, 0x65, 0x70,
-0x3b, 0x15e, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b, 0x15e, 0x65, 0x76, 0x76, 0x61,
-0x6c, 0x3b, 0x5a, 0x69, 0x6c, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x5a, 0x69, 0x6c, 0x68, 0x69, 0x63, 0x63, 0x65, 0x3b, 0x645,
-0x6c7, 0x6be, 0x6d5, 0x631, 0x631, 0x6d5, 0x645, 0x3b, 0x633, 0x6d5, 0x67e, 0x6d5, 0x631, 0x3b, 0x631, 0x6d5, 0x628, 0x649, 0x626, 0x6c7,
-0x644, 0x626, 0x6d5, 0x6cb, 0x6cb, 0x6d5, 0x644, 0x3b, 0x631, 0x6d5, 0x628, 0x649, 0x626, 0x6c7, 0x644, 0x626, 0x627, 0x62e, 0x649, 0x631,
-0x3b, 0x62c, 0x6d5, 0x645, 0x627, 0x62f, 0x649, 0x64a, 0x6d5, 0x644, 0x626, 0x6d5, 0x6cb, 0x6cb, 0x6d5, 0x644, 0x3b, 0x62c, 0x6d5, 0x645,
-0x627, 0x62f, 0x649, 0x64a, 0x6d5, 0x644, 0x626, 0x627, 0x62e, 0x649, 0x631, 0x3b, 0x631, 0x6d5, 0x62c, 0x6d5, 0x628, 0x3b, 0x634, 0x6d5,
-0x626, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x627, 0x645, 0x649, 0x632, 0x627, 0x646, 0x3b, 0x634, 0x6d5, 0x6cb, 0x6cb, 0x627, 0x644, 0x3b,
-0x632, 0x6c7, 0x644, 0x642, 0x6d5, 0x626, 0x62f, 0x6d5, 0x3b, 0x632, 0x6c7, 0x644, 0x6be, 0x6d5, 0x62c, 0x62c, 0x6d5, 0x3b, 0x43c, 0x443,
-0x445, 0x3b, 0x441, 0x430, 0x444, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x49,
-0x3b, 0x434, 0x436, 0x443, 0x43c, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x434, 0x436,
-0x3b, 0x448, 0x430, 0x430, 0x431, 0x3b, 0x440, 0x430, 0x43c, 0x3b, 0x434, 0x430, 0x432, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d,
-0x43a, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x445, 0x3b, 0x43c, 0x443, 0x445, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441,
-0x430, 0x444, 0x430, 0x440, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x49, 0x3b,
-0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x49,
-0x3b, 0x440, 0x430, 0x434, 0x436, 0x430, 0x431, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440, 0x430, 0x43c, 0x430, 0x434,
-0x430, 0x43d, 0x3b, 0x434, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x43a, 0x430, 0x430, 0x434,
-0x430, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x445, 0x456, 0x434, 0x436, 0x430, 0x3b, 0x43c, 0x443, 0x445, 0x2e, 0x3b, 0x441,
-0x430, 0x444, 0x2e, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x49, 0x3b, 0x434,
-0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x434, 0x436,
-0x2e, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x2e, 0x3b, 0x440, 0x430, 0x43c, 0x2e, 0x3b, 0x434, 0x430, 0x432, 0x2e, 0x3b, 0x437, 0x443,
-0x2d, 0x43b, 0x44c, 0x2d, 0x43a, 0x2e, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x445, 0x2e, 0x3b, 0x645, 0x62d, 0x631, 0x645,
-0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x627, 0x648, 0x651, 0x644, 0x3b, 0x631, 0x628, 0x6cc,
-0x639, 0x20, 0x627, 0x644, 0x62b, 0x651, 0x627, 0x646, 0x6cc, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x627, 0x648,
-0x651, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x62b, 0x651, 0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628,
-0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x648,
-0x627, 0x644, 0x642, 0x639, 0x62f, 0x6c3, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x62d, 0x62c, 0x6c3, 0x3b, 0x645, 0x62d, 0x631, 0x645, 0x3b,
-0x635, 0x641, 0x631, 0x3b, 0x631, 0x20, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x631, 0x20, 0x628, 0x6cc,
-0x639, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x627, 0x648, 0x644,
-0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639,
-0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x642,
-0x639, 0x62f, 0x6c3, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x62d, 0x62c, 0x6c3, 0x3b, 0x4d, 0x75, 0x68, 0x2e, 0x3b, 0x53, 0x61, 0x66,
-0x2e, 0x3b, 0x52, 0x6f, 0x62, 0x2e, 0x20, 0x61, 0x76, 0x76, 0x2e, 0x3b, 0x52, 0x6f, 0x62, 0x2e, 0x20, 0x6f, 0x78, 0x2e,
-0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x61, 0x76, 0x76, 0x2e, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x6f, 0x78, 0x2e, 0x3b,
-0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x76, 0x2e,
-0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x71, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68, 0x2e, 0x3b, 0x4d, 0x75, 0x68, 0x61, 0x72,
+0xc4d, 0x2d, 0xc39, 0xc3f, 0xc1c, 0xc4d, 0xc1c, 0xc3e, 0xc39, 0xc4d, 0xc2e, 0xc41, 0xc39, 0x2e, 0x3b, 0xc38, 0xc2b, 0x2e, 0x3b, 0xc30,
+0x2e, 0x20, 0x49, 0x3b, 0xc30, 0x2e, 0x20, 0x49, 0x49, 0x3b, 0xc1c, 0xc41, 0xc2e, 0x2e, 0x20, 0x49, 0x3b, 0xc1c, 0xc41, 0xc2e,
+0x2e, 0x20, 0x49, 0x49, 0x3b, 0xc30, 0xc1c, 0x2e, 0x3b, 0xc37, 0xc2c, 0xc3e, 0x2e, 0x3b, 0xc30, 0xc02, 0xc1c, 0xc3e, 0x2e, 0x3b,
+0xc37, 0xc35, 0xc4d, 0xc35, 0xc3e, 0x2e, 0x3b, 0xc27, 0xc41, 0xc32, 0xc4d, 0x2d, 0xc15, 0xc3f, 0x2e, 0x3b, 0xc27, 0xc41, 0xc32, 0xc4d,
+0x2d, 0xc39, 0xc3f, 0x2e, 0xe21, 0xe38, 0xe2e, 0xe30, 0xe23, 0xe4c, 0xe23, 0xe2d, 0xe21, 0x3b, 0xe0b, 0xe2d, 0xe1f, 0xe32, 0xe23, 0xe4c,
+0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35, 0x20, 0x49, 0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35, 0x20, 0x49, 0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32,
+0xe14, 0xe32, 0x20, 0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49, 0x49, 0x3b, 0xe23, 0xe2d, 0xe08, 0xe31, 0xe1a,
+0x3b, 0xe0a, 0xe30, 0xe2d, 0xe30, 0xe1a, 0xe32, 0xe19, 0x3b, 0xe23, 0xe2d, 0xe21, 0xe30, 0xe14, 0xe2d, 0xe19, 0x3b, 0xe40, 0xe0a, 0xe32,
+0xe27, 0xe31, 0xe25, 0x3b, 0xe0b, 0xe38, 0xe25, 0xe01, 0xe34, 0xe2d, 0xe3a, 0xe14, 0xe30, 0xe2e, 0xe3a, 0x3b, 0xe0b, 0xe38, 0xe25, 0xe2b,
+0xe34, 0xe08, 0xe0d, 0xe30, 0xe2e, 0xe3a, 0xe21, 0xe38, 0xe2e, 0xe31, 0xe23, 0x2e, 0x3b, 0xe40, 0xe28, 0xe32, 0xe30, 0x2e, 0x3b, 0xe23,
+0xe2d, 0xe1a, 0xe35, 0x20, 0x49, 0x3b, 0xe23, 0xe2d, 0xe1a, 0xe35, 0x20, 0x49, 0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32,
+0x20, 0x49, 0x3b, 0xe08, 0xe38, 0xe21, 0xe32, 0xe14, 0xe32, 0x20, 0x49, 0x49, 0x3b, 0xe40, 0xe23, 0xe32, 0xe30, 0x2e, 0x3b, 0xe0a,
+0xe30, 0xe2d, 0xe4c, 0x2e, 0x3b, 0xe40, 0xe23, 0xe32, 0xe30, 0xe21, 0xe30, 0x2e, 0x3b, 0xe40, 0xe0a, 0xe32, 0xe27, 0x2e, 0x3b, 0xe0b,
+0xe38, 0xe25, 0xe01, 0xe34, 0xe2d, 0xe3a, 0x2e, 0x3b, 0xe0b, 0xe38, 0xe25, 0xe2b, 0xe34, 0xe08, 0x2e, 0x4d, 0x75, 0x68, 0x61, 0x72,
+0x72, 0x65, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x65, 0x72, 0x3b, 0x52, 0x65, 0x62, 0x69, 0xfc, 0x6c, 0x65, 0x76, 0x76, 0x65,
+0x6c, 0x3b, 0x52, 0x65, 0x62, 0x69, 0xfc, 0x6c, 0x61, 0x68, 0x69, 0x72, 0x3b, 0x43, 0x65, 0x6d, 0x61, 0x7a, 0x69, 0x79,
+0x65, 0x6c, 0x65, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x43, 0x65, 0x6d, 0x61, 0x7a, 0x69, 0x79, 0x65, 0x6c, 0x61, 0x68, 0x69,
+0x72, 0x3b, 0x52, 0x65, 0x63, 0x65, 0x70, 0x3b, 0x15e, 0x61, 0x62, 0x61, 0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x61,
+0x6e, 0x3b, 0x15e, 0x65, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x5a, 0x69, 0x6c, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x5a, 0x69, 0x6c,
+0x68, 0x69, 0x63, 0x63, 0x65, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x66, 0x65, 0x72, 0x3b, 0x52, 0x2e,
+0x65, 0x76, 0x76, 0x65, 0x6c, 0x3b, 0x52, 0x2e, 0x61, 0x68, 0x69, 0x72, 0x3b, 0x43, 0x2e, 0x65, 0x76, 0x76, 0x65, 0x6c,
+0x3b, 0x43, 0x2e, 0x61, 0x68, 0x69, 0x72, 0x3b, 0x52, 0x65, 0x63, 0x65, 0x70, 0x3b, 0x15e, 0x61, 0x62, 0x61, 0x6e, 0x3b,
+0x52, 0x61, 0x6d, 0x2e, 0x3b, 0x15e, 0x65, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x5a, 0x69, 0x6c, 0x6b, 0x61, 0x64, 0x65, 0x3b,
+0x5a, 0x69, 0x6c, 0x68, 0x69, 0x63, 0x63, 0x65, 0x645, 0x6c7, 0x6be, 0x6d5, 0x631, 0x631, 0x6d5, 0x645, 0x3b, 0x633, 0x6d5, 0x67e,
+0x6d5, 0x631, 0x3b, 0x631, 0x6d5, 0x628, 0x649, 0x626, 0x6c7, 0x644, 0x626, 0x6d5, 0x6cb, 0x6cb, 0x6d5, 0x644, 0x3b, 0x631, 0x6d5, 0x628,
+0x649, 0x626, 0x6c7, 0x644, 0x626, 0x627, 0x62e, 0x649, 0x631, 0x3b, 0x62c, 0x6d5, 0x645, 0x627, 0x62f, 0x649, 0x64a, 0x6d5, 0x644, 0x626,
+0x6d5, 0x6cb, 0x6cb, 0x6d5, 0x644, 0x3b, 0x62c, 0x6d5, 0x645, 0x627, 0x62f, 0x649, 0x64a, 0x6d5, 0x644, 0x626, 0x627, 0x62e, 0x649, 0x631,
+0x3b, 0x631, 0x6d5, 0x62c, 0x6d5, 0x628, 0x3b, 0x634, 0x6d5, 0x626, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x627, 0x645, 0x649, 0x632, 0x627,
+0x646, 0x3b, 0x634, 0x6d5, 0x6cb, 0x6cb, 0x627, 0x644, 0x3b, 0x632, 0x6c7, 0x644, 0x642, 0x6d5, 0x626, 0x62f, 0x6d5, 0x3b, 0x632, 0x6c7,
+0x644, 0x6be, 0x6d5, 0x62c, 0x62c, 0x6d5, 0x43c, 0x443, 0x445, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x441, 0x430, 0x444, 0x430, 0x440,
+0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c,
+0x430, 0x434, 0x430, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x430, 0x434, 0x430, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x434,
+0x436, 0x430, 0x431, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x440, 0x430, 0x43c, 0x430, 0x434, 0x430, 0x43d, 0x3b, 0x434,
+0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x43a, 0x430, 0x430, 0x434, 0x430, 0x3b, 0x437, 0x443,
+0x2d, 0x43b, 0x44c, 0x2d, 0x445, 0x456, 0x434, 0x436, 0x430, 0x43c, 0x443, 0x445, 0x3b, 0x441, 0x430, 0x444, 0x3b, 0x440, 0x430, 0x431,
+0x456, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x20, 0x49, 0x3b, 0x434,
+0x436, 0x443, 0x43c, 0x20, 0x49, 0x49, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x3b, 0x440, 0x430, 0x43c,
+0x3b, 0x434, 0x430, 0x432, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x43a, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x445,
+0x43c, 0x443, 0x445, 0x2e, 0x3b, 0x441, 0x430, 0x444, 0x2e, 0x3b, 0x440, 0x430, 0x431, 0x456, 0x20, 0x49, 0x3b, 0x440, 0x430, 0x431,
+0x456, 0x20, 0x49, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49, 0x3b, 0x434, 0x436, 0x443, 0x43c, 0x2e, 0x20, 0x49,
+0x49, 0x3b, 0x440, 0x430, 0x434, 0x436, 0x2e, 0x3b, 0x448, 0x430, 0x430, 0x431, 0x2e, 0x3b, 0x440, 0x430, 0x43c, 0x2e, 0x3b, 0x434,
+0x430, 0x432, 0x2e, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x43a, 0x2e, 0x3b, 0x437, 0x443, 0x2d, 0x43b, 0x44c, 0x2d, 0x445,
+0x2e, 0x645, 0x62d, 0x631, 0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x20, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x627, 0x648,
+0x644, 0x3b, 0x631, 0x20, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc,
+0x20, 0x627, 0x644, 0x627, 0x648, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x6cc, 0x3b,
+0x631, 0x62c, 0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644,
+0x3b, 0x630, 0x648, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x6c3, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x62d, 0x62c, 0x6c3, 0x645, 0x62d, 0x631,
+0x645, 0x3b, 0x635, 0x641, 0x631, 0x3b, 0x631, 0x628, 0x6cc, 0x639, 0x20, 0x627, 0x644, 0x627, 0x648, 0x651, 0x644, 0x3b, 0x631, 0x628,
+0x6cc, 0x639, 0x20, 0x627, 0x644, 0x62b, 0x651, 0x627, 0x646, 0x6cc, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x627,
+0x648, 0x651, 0x644, 0x3b, 0x62c, 0x645, 0x627, 0x62f, 0x6cc, 0x20, 0x627, 0x644, 0x62b, 0x651, 0x627, 0x646, 0x6cc, 0x3b, 0x631, 0x62c,
+0x628, 0x3b, 0x634, 0x639, 0x628, 0x627, 0x646, 0x3b, 0x631, 0x645, 0x636, 0x627, 0x646, 0x3b, 0x634, 0x648, 0x627, 0x644, 0x3b, 0x630,
+0x648, 0x627, 0x644, 0x642, 0x639, 0x62f, 0x6c3, 0x3b, 0x630, 0x648, 0x627, 0x644, 0x62d, 0x62c, 0x6c3, 0x4d, 0x75, 0x68, 0x61, 0x72,
0x72, 0x61, 0x6d, 0x3b, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x52, 0x6f, 0x62, 0x69, 0x2019, 0x20, 0x75, 0x6c, 0x2d, 0x61,
0x76, 0x76, 0x61, 0x6c, 0x3b, 0x52, 0x6f, 0x62, 0x69, 0x2019, 0x20, 0x75, 0x6c, 0x2d, 0x6f, 0x78, 0x69, 0x72, 0x3b, 0x4a,
0x75, 0x6d, 0x61, 0x64, 0x20, 0x75, 0x6c, 0x2d, 0x61, 0x76, 0x76, 0x61, 0x6c, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x20,
0x75, 0x6c, 0x2d, 0x6f, 0x78, 0x69, 0x72, 0x3b, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x53, 0x68, 0x61, 0x2019, 0x62, 0x6f,
0x6e, 0x3b, 0x52, 0x61, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x3b, 0x53, 0x68, 0x61, 0x76, 0x76, 0x6f, 0x6c, 0x3b, 0x5a, 0x75,
-0x6c, 0x2d, 0x71, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x3b, 0x41c, 0x443,
-0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d,
-0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d, 0x43e, 0x445, 0x438, 0x440, 0x3b, 0x416, 0x443,
-0x43c, 0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443, 0x43b, 0x43e, 0x3b, 0x416, 0x443, 0x43c, 0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d,
-0x443, 0x445, 0x440, 0x43e, 0x3b, 0x420, 0x430, 0x436, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x44a, 0x431, 0x43e, 0x43d, 0x3b, 0x420, 0x430,
-0x43c, 0x430, 0x437, 0x43e, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432, 0x43e, 0x43b, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x49b, 0x430, 0x44a,
-0x434, 0x430, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x4b3, 0x438, 0x436, 0x436, 0x430, 0x3b, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61,
-0x66, 0x2e, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x69, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x69, 0x69, 0x3b, 0x64, 0x17e,
-0x75, 0x6d, 0x2e, 0x20, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x69, 0x69, 0x3b, 0x72, 0x65, 0x64, 0x17e, 0x2e,
-0x3b, 0x161, 0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x161, 0x65, 0x2e, 0x3b, 0x7a, 0x75, 0x6c, 0x2d, 0x6b, 0x2e,
-0x3b, 0x7a, 0x75, 0x6c, 0x2d, 0x68, 0x2e, 0x3b, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x65, 0x6d, 0x3b, 0x73, 0x61, 0x66, 0x65,
-0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x69, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x69, 0x69, 0x3b, 0x64,
-0x17e, 0x75, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x69, 0x69, 0x3b,
-0x72, 0x65, 0x64, 0x17e, 0x65, 0x62, 0x3b, 0x161, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x72, 0x61, 0x6d, 0x61, 0x7a, 0x61,
-0x6e, 0x3b, 0x161, 0x65, 0x76, 0x61, 0x6c, 0x3b, 0x7a, 0x75, 0x6c, 0x2d, 0x6b, 0x61, 0x64, 0x65, 0x3b, 0x7a, 0x75, 0x6c,
-0x2d, 0x68, 0x69, 0x64, 0x17e, 0x65, 0x3b, 0x64, 0x7a, 0x76, 0x3b, 0x64, 0x7a, 0x64, 0x3b, 0x74, 0x65, 0x64, 0x3b, 0x61,
-0x66, 0x254, 0x3b, 0x64, 0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73, 0x69, 0x61, 0x3b, 0x64, 0x65, 0x61, 0x3b, 0x61,
-0x6e, 0x79, 0x3b, 0x6b, 0x65, 0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x7a, 0x6d, 0x3b, 0x64, 0x7a, 0x6f, 0x76, 0x65,
-0x3b, 0x64, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65, 0x64, 0x6f, 0x78, 0x65, 0x3b, 0x61, 0x66, 0x254, 0x66, 0x69,
-0x1ebd, 0x3b, 0x64, 0x61, 0x6d, 0x25b, 0x3b, 0x6d, 0x61, 0x73, 0x61, 0x3b, 0x73, 0x69, 0x61, 0x6d, 0x6c, 0x254, 0x6d, 0x3b,
-0x64, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254, 0x3b, 0x6b,
-0x65, 0x6c, 0x65, 0x3b, 0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x6d,
-0x65, 0x3b, 0x64, 0x65, 0x20, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x64, 0x65, 0x20, 0x53, 0x61, 0x66,
-0x61, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x64, 0x65, 0x20, 0x52, 0x61, 0x62,
-0x69, 0x2bb, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x65, 0x20, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x64, 0x65,
-0x20, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x65, 0x20, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b,
-0x64, 0x65, 0x20, 0x53, 0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x64, 0x65, 0x20, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61,
-0x6e, 0x3b, 0x64, 0x65, 0x20, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x44, 0x68, 0x75, 0x2bb,
-0x6c, 0x2d, 0x51, 0x69, 0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x65, 0x20, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x69,
-0x6a, 0x6a, 0x61, 0x68, 0x3b, 0x7a46, 0x54c8, 0x5170, 0x59c6, 0x6708, 0x3b, 0x8272, 0x6cd5, 0x5c14, 0x6708, 0x3b, 0x8d56, 0x6bd4, 0x6708, 0x20,
-0x49, 0x3b, 0x8d56, 0x6bd4, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x4e3b, 0x9a6c, 0x8fbe, 0x6708, 0x20, 0x49, 0x3b, 0x4e3b, 0x9a6c, 0x8fbe, 0x6708,
-0x20, 0x49, 0x49, 0x3b, 0x8d56, 0x54f2, 0x535c, 0x6708, 0x3b, 0x820d, 0x5c14, 0x90a6, 0x6708, 0x3b, 0x8d56, 0x4e70, 0x4e39, 0x6708, 0x3b, 0x95ea,
-0x74e6, 0x9c81, 0x6708, 0x3b, 0x90fd, 0x5c14, 0x5580, 0x5c14, 0x5fb7, 0x6708, 0x3b, 0x90fd, 0x5c14, 0x9ed1, 0x54f2, 0x6708, 0x3b
+0x6c, 0x2d, 0x71, 0x61, 0x2019, 0x64, 0x61, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68, 0x69, 0x6a, 0x6a, 0x61, 0x4d, 0x75, 0x68,
+0x2e, 0x3b, 0x53, 0x61, 0x66, 0x2e, 0x3b, 0x52, 0x6f, 0x62, 0x2e, 0x20, 0x61, 0x76, 0x76, 0x2e, 0x3b, 0x52, 0x6f, 0x62,
+0x2e, 0x20, 0x6f, 0x78, 0x2e, 0x3b, 0x4a, 0x75, 0x6d, 0x2e, 0x20, 0x61, 0x76, 0x76, 0x2e, 0x3b, 0x4a, 0x75, 0x6d, 0x2e,
+0x20, 0x6f, 0x78, 0x2e, 0x3b, 0x52, 0x61, 0x6a, 0x2e, 0x3b, 0x53, 0x68, 0x61, 0x2e, 0x3b, 0x52, 0x61, 0x6d, 0x2e, 0x3b,
+0x53, 0x68, 0x61, 0x76, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x71, 0x2e, 0x3b, 0x5a, 0x75, 0x6c, 0x2d, 0x68, 0x2e, 0x41c,
+0x443, 0x4b3, 0x430, 0x440, 0x440, 0x430, 0x43c, 0x3b, 0x421, 0x430, 0x444, 0x430, 0x440, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443, 0x43b,
+0x2d, 0x430, 0x432, 0x432, 0x430, 0x43b, 0x3b, 0x420, 0x430, 0x431, 0x438, 0x443, 0x43b, 0x2d, 0x43e, 0x445, 0x438, 0x440, 0x3b, 0x416,
+0x443, 0x43c, 0x43e, 0x434, 0x438, 0x443, 0x43b, 0x2d, 0x443, 0x43b, 0x43e, 0x3b, 0x416, 0x443, 0x43c, 0x43e, 0x434, 0x438, 0x443, 0x43b,
+0x2d, 0x443, 0x445, 0x440, 0x43e, 0x3b, 0x420, 0x430, 0x436, 0x430, 0x431, 0x3b, 0x428, 0x430, 0x44a, 0x431, 0x43e, 0x43d, 0x3b, 0x420,
+0x430, 0x43c, 0x430, 0x437, 0x43e, 0x43d, 0x3b, 0x428, 0x430, 0x432, 0x432, 0x43e, 0x43b, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x49b, 0x430,
+0x44a, 0x434, 0x430, 0x3b, 0x417, 0x438, 0x43b, 0x2d, 0x4b3, 0x438, 0x436, 0x436, 0x430, 0x6d, 0x75, 0x68, 0x61, 0x72, 0x65, 0x6d,
+0x3b, 0x73, 0x61, 0x66, 0x65, 0x72, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x69, 0x3b, 0x72, 0x61, 0x62, 0x69, 0x2bb,
+0x20, 0x69, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x61, 0x64,
+0x65, 0x20, 0x69, 0x69, 0x3b, 0x72, 0x65, 0x64, 0x17e, 0x65, 0x62, 0x3b, 0x161, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x72,
+0x61, 0x6d, 0x61, 0x7a, 0x61, 0x6e, 0x3b, 0x161, 0x65, 0x76, 0x61, 0x6c, 0x3b, 0x7a, 0x75, 0x6c, 0x2d, 0x6b, 0x61, 0x64,
+0x65, 0x3b, 0x7a, 0x75, 0x6c, 0x2d, 0x68, 0x69, 0x64, 0x17e, 0x65, 0x6d, 0x75, 0x68, 0x2e, 0x3b, 0x73, 0x61, 0x66, 0x2e,
+0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x69, 0x3b, 0x72, 0x61, 0x62, 0x2e, 0x20, 0x69, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d,
+0x2e, 0x20, 0x69, 0x3b, 0x64, 0x17e, 0x75, 0x6d, 0x2e, 0x20, 0x69, 0x69, 0x3b, 0x72, 0x65, 0x64, 0x17e, 0x2e, 0x3b, 0x161,
+0x61, 0x2e, 0x3b, 0x72, 0x61, 0x6d, 0x2e, 0x3b, 0x161, 0x65, 0x2e, 0x3b, 0x7a, 0x75, 0x6c, 0x2d, 0x6b, 0x2e, 0x3b, 0x7a,
+0x75, 0x6c, 0x2d, 0x68, 0x2e, 0x64, 0x7a, 0x6f, 0x76, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65,
+0x64, 0x6f, 0x78, 0x65, 0x3b, 0x61, 0x66, 0x254, 0x66, 0x69, 0x1ebd, 0x3b, 0x64, 0x61, 0x6d, 0x25b, 0x3b, 0x6d, 0x61, 0x73,
+0x61, 0x3b, 0x73, 0x69, 0x61, 0x6d, 0x6c, 0x254, 0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65,
+0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254, 0x3b, 0x6b, 0x65, 0x6c, 0x65, 0x3b, 0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65,
+0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x6d, 0x65, 0x64, 0x7a, 0x76, 0x3b, 0x64, 0x7a, 0x64, 0x3b, 0x74,
+0x65, 0x64, 0x3b, 0x61, 0x66, 0x254, 0x3b, 0x64, 0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73, 0x69, 0x61, 0x3b, 0x64,
+0x65, 0x61, 0x3b, 0x61, 0x6e, 0x79, 0x3b, 0x6b, 0x65, 0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x7a, 0x6d, 0x64, 0x65,
+0x20, 0x4d, 0x75, 0x68, 0x61, 0x72, 0x72, 0x61, 0x6d, 0x3b, 0x64, 0x65, 0x20, 0x53, 0x61, 0x66, 0x61, 0x72, 0x3b, 0x64,
+0x65, 0x20, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49, 0x3b, 0x64, 0x65, 0x20, 0x52, 0x61, 0x62, 0x69, 0x2bb, 0x20, 0x49,
+0x49, 0x3b, 0x64, 0x65, 0x20, 0x4a, 0x75, 0x6d, 0x61, 0x64, 0x61, 0x20, 0x49, 0x3b, 0x64, 0x65, 0x20, 0x4a, 0x75, 0x6d,
+0x61, 0x64, 0x61, 0x20, 0x49, 0x49, 0x3b, 0x64, 0x65, 0x20, 0x52, 0x61, 0x6a, 0x61, 0x62, 0x3b, 0x64, 0x65, 0x20, 0x53,
+0x68, 0x61, 0x2bb, 0x62, 0x61, 0x6e, 0x3b, 0x64, 0x65, 0x20, 0x52, 0x61, 0x6d, 0x61, 0x64, 0x61, 0x6e, 0x3b, 0x64, 0x65,
+0x20, 0x53, 0x68, 0x61, 0x77, 0x77, 0x61, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x51, 0x69,
+0x2bb, 0x64, 0x61, 0x68, 0x3b, 0x64, 0x65, 0x20, 0x44, 0x68, 0x75, 0x2bb, 0x6c, 0x2d, 0x48, 0x69, 0x6a, 0x6a, 0x61, 0x68,
+0xd804, 0xdd1f, 0xd804, 0xdd27, 0xd804, 0xdd26, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804,
+0xdd27, 0xd804, 0xdd1c, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1d, 0xd804, 0xdd28, 0xd804, 0xdd05, 0xd804, 0xdd23,
+0xd804, 0xdd34, 0x20, 0xd804, 0xdd03, 0xd804, 0xdd03, 0xd804, 0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd22, 0xd804, 0xdd27,
+0xd804, 0xdd1d, 0xd804, 0xdd28, 0xd804, 0xdd05, 0xd804, 0xdd25, 0xd804, 0xdd34, 0x20, 0xd804, 0xdd25, 0xd804, 0xdd1a, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd0e,
+0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd05, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x20, 0xd804, 0xdd03, 0xd804, 0xdd03, 0xd804,
+0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd18, 0xd804, 0xdd28, 0xd804, 0xdd05,
+0xd804, 0xdd0c, 0xd804, 0xdd34, 0x20, 0xd804, 0xdd25, 0xd804, 0xdd1a, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd0e, 0xd804, 0xdd27,
+0xd804, 0xdd1d, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd33, 0xd804, 0xdd03, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd22, 0xd804, 0xdd27, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd0e, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd24, 0xd804,
+0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0xd804, 0xdd07, 0xd804, 0xdd27, 0xd804, 0xdd18, 0xd804, 0xdd34,
+0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0xd804, 0xdd26, 0xd804, 0xdd27, 0xd804, 0xdd0e, 0xd804, 0xdd34, 0xd804, 0xdd0e, 0xd804,
+0xdd27, 0xd804, 0xdd37, 0x3b, 0xd804, 0xdd38, 0x3b, 0xd804, 0xdd39, 0x3b, 0xd804, 0xdd3a, 0x3b, 0xd804, 0xdd3b, 0x3b, 0xd804, 0xdd3c, 0x3b, 0xd804,
+0xdd3d, 0x3b, 0xd804, 0xdd3e, 0x3b, 0xd804, 0xdd3f, 0x3b, 0xd804, 0xdd37, 0xd804, 0xdd36, 0x3b, 0xd804, 0xdd37, 0xd804, 0xdd37, 0x3b, 0xd804, 0xdd37,
+0xd804, 0xdd38, 0x7a46, 0x54c8, 0x5170, 0x59c6, 0x6708, 0x3b, 0x8272, 0x6cd5, 0x5c14, 0x6708, 0x3b, 0x8d56, 0x6bd4, 0x6708, 0x20, 0x49, 0x3b, 0x8d56,
+0x6bd4, 0x6708, 0x20, 0x49, 0x49, 0x3b, 0x4e3b, 0x9a6c, 0x8fbe, 0x6708, 0x20, 0x49, 0x3b, 0x4e3b, 0x9a6c, 0x8fbe, 0x6708, 0x20, 0x49, 0x49,
+0x3b, 0x8d56, 0x54f2, 0x535c, 0x6708, 0x3b, 0x820d, 0x5c14, 0x90a6, 0x6708, 0x3b, 0x8d56, 0x4e70, 0x4e39, 0x6708, 0x3b, 0x95ea, 0x74e6, 0x9c81, 0x6708,
+0x3b, 0x90fd, 0x5c14, 0x5580, 0x5c14, 0x5fb7, 0x6708, 0x3b, 0x90fd, 0x5c14, 0x9ed1, 0x54f2, 0x6708
};
// GENERATED PART ENDS HERE
diff --git a/src/corelib/time/qhijricalendar_p.h b/src/corelib/time/qhijricalendar_p.h
index 60820488b4..abe2ade3e8 100644
--- a/src/corelib/time/qhijricalendar_p.h
+++ b/src/corelib/time/qhijricalendar_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -72,7 +72,7 @@ public:
protected:
const QCalendarLocale *localeMonthIndexData() const override;
- const ushort *localeMonthData() const override;
+ const char16_t *localeMonthData() const override;
// (The INTEGRITY compiler got upset at: using QCalendarBackend:QCalendarBackend;)
QHijriCalendar(const QString &name, QCalendar::System id = QCalendar::System::User)
: QCalendarBackend(name, id) {}
diff --git a/src/corelib/time/qjalalicalendar.cpp b/src/corelib/time/qjalalicalendar.cpp
index be9246d7db..17588aff6c 100644
--- a/src/corelib/time/qjalalicalendar.cpp
+++ b/src/corelib/time/qjalalicalendar.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -204,7 +204,7 @@ const QCalendarLocale *QJalaliCalendar::localeMonthIndexData() const
return locale_data;
}
-const ushort *QJalaliCalendar::localeMonthData() const
+const char16_t *QJalaliCalendar::localeMonthData() const
{
return months_data;
}
diff --git a/src/corelib/time/qjalalicalendar_data_p.h b/src/corelib/time/qjalalicalendar_data_p.h
index f80dd9012c..c21c106e60 100644
--- a/src/corelib/time/qjalalicalendar_data_p.h
+++ b/src/corelib/time/qjalalicalendar_data_p.h
@@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE
// GENERATED PART STARTS HERE
/*
- This part of the file was generated on 2020-03-18 from the
+ This part of the file was generated on 2020-04-07 from the
Common Locale Data Repository v36
http://www.unicode.org/cldr/
@@ -70,834 +70,831 @@ QT_BEGIN_NAMESPACE
*/
static const QCalendarLocale locale_data[] = {
- // lang script terr sShort sLong sNarrow short long narrow
- { 1, 0, 0,{ 0,48 },{ 48,84 },{ 132,24 },{ 0,48 },{ 48,84 },{ 156,29 }}, // C/AnyScript/AnyCountry
- { 3, 7, 69,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Oromo/Latin/Ethiopia
- { 3, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Oromo/Latin/Kenya
- { 4, 7, 69,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Afar/Latin/Ethiopia
- { 5, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Afrikaans/Latin/South Africa
- { 5, 7, 148,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Afrikaans/Latin/Namibia
- { 6, 7, 2,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Albanian/Latin/Albania
- { 6, 7, 127,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Albanian/Latin/Macedonia
- { 6, 7, 257,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Albanian/Latin/Kosovo
- { 7, 14, 69,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Amharic/Ethiopic/Ethiopia
- { 8, 1, 64,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Egypt
- { 8, 1, 3,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Algeria
- { 8, 1, 17,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Bahrain
- { 8, 1, 42,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Chad
- { 8, 1, 48,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Comoros
- { 8, 1, 59,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Djibouti
- { 8, 1, 67,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Eritrea
- { 8, 1, 103,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Iraq
- { 8, 1, 105,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Israel
- { 8, 1, 109,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Jordan
- { 8, 1, 115,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Kuwait
- { 8, 1, 119,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Lebanon
- { 8, 1, 122,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Libya
- { 8, 1, 136,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Mauritania
- { 8, 1, 145,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Morocco
- { 8, 1, 162,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Oman
- { 8, 1, 165,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Palestinian Territories
- { 8, 1, 175,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Qatar
- { 8, 1, 186,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Saudi Arabia
- { 8, 1, 194,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Somalia
- { 8, 1, 201,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Sudan
- { 8, 1, 207,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Syria
- { 8, 1, 216,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Tunisia
- { 8, 1, 223,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/United Arab Emirates
- { 8, 1, 236,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Western Sahara
- { 8, 1, 237,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/Yemen
- { 8, 1, 254,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/South Sudan
- { 8, 1, 260,{ 212,68 },{ 212,68 },{ 185,27 },{ 212,68 },{ 212,68 },{ 185,27 }}, // Arabic/Arabic/World
- { 9, 10, 11,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Armenian/Armenian/Armenia
- { 10, 11, 100,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Assamese/Bengali/India
- { 12, 7, 15,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Azerbaijani/Latin/Azerbaijan
- { 12, 1, 102,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Azerbaijani/Arabic/Iran
- { 12, 2, 15,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Azerbaijani/Cyrillic/Azerbaijan
- { 13, 2, 178,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Bashkir/Cyrillic/Russia
- { 14, 7, 197,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Basque/Latin/Spain
- { 15, 11, 18,{ 280,88 },{ 368,89 },{ 457,27 },{ 280,88 },{ 368,89 },{ 457,27 }}, // Bengali/Bengali/Bangladesh
- { 15, 11, 100,{ 280,88 },{ 368,89 },{ 457,27 },{ 280,88 },{ 368,89 },{ 457,27 }}, // Bengali/Bengali/India
- { 16, 31, 25,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Dzongkha/Tibetan/Bhutan
- { 19, 7, 74,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Breton/Latin/France
- { 20, 2, 33,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Bulgarian/Cyrillic/Bulgaria
- { 21, 25, 147,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Burmese/Myanmar/Myanmar
- { 22, 2, 20,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Belarusian/Cyrillic/Belarus
- { 23, 20, 36,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Khmer/Khmer/Cambodia
- { 24, 7, 197,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Catalan/Latin/Spain
- { 24, 7, 5,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Catalan/Latin/Andorra
- { 24, 7, 74,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Catalan/Latin/France
- { 24, 7, 106,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Catalan/Latin/Italy
- { 25, 5, 44,{ 484,39 },{ 523,38 },{ 185,27 },{ 484,39 },{ 523,38 },{ 185,27 }}, // Chinese/Simplified Han/China
- { 25, 5, 97,{ 484,39 },{ 523,38 },{ 185,27 },{ 484,39 },{ 523,38 },{ 185,27 }}, // Chinese/Simplified Han/Hong Kong
- { 25, 5, 126,{ 484,39 },{ 523,38 },{ 185,27 },{ 484,39 },{ 523,38 },{ 185,27 }}, // Chinese/Simplified Han/Macau
- { 25, 5, 190,{ 484,39 },{ 523,38 },{ 185,27 },{ 484,39 },{ 523,38 },{ 185,27 }}, // Chinese/Simplified Han/Singapore
- { 25, 6, 97,{ 484,39 },{ 484,39 },{ 185,27 },{ 484,39 },{ 484,39 },{ 185,27 }}, // Chinese/Traditional Han/Hong Kong
- { 25, 6, 126,{ 484,39 },{ 484,39 },{ 185,27 },{ 484,39 },{ 484,39 },{ 185,27 }}, // Chinese/Traditional Han/Macau
- { 25, 6, 208,{ 484,39 },{ 484,39 },{ 185,27 },{ 484,39 },{ 484,39 },{ 185,27 }}, // Chinese/Traditional Han/Taiwan
- { 26, 7, 74,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Corsican/Latin/France
- { 27, 7, 54,{ 48,84 },{ 48,84 },{ 561,39 },{ 48,84 },{ 48,84 },{ 561,39 }}, // Croatian/Latin/Croatia
- { 27, 7, 27,{ 48,84 },{ 48,84 },{ 561,39 },{ 48,84 },{ 48,84 },{ 561,39 }}, // Croatian/Latin/Bosnia And Herzegowina
- { 28, 7, 57,{ 600,82 },{ 600,82 },{ 185,27 },{ 600,82 },{ 600,82 },{ 185,27 }}, // Czech/Latin/Czech Republic
- { 29, 7, 58,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Danish/Latin/Denmark
- { 29, 7, 86,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Danish/Latin/Greenland
- { 30, 7, 151,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Dutch/Latin/Netherlands
- { 30, 7, 12,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Dutch/Latin/Aruba
- { 30, 7, 21,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Dutch/Latin/Belgium
- { 30, 7, 152,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Dutch/Latin/Cura Sao
- { 30, 7, 202,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Dutch/Latin/Suriname
- { 30, 7, 255,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Dutch/Latin/Bonaire
- { 30, 7, 256,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Dutch/Latin/Sint Maarten
- { 31, 7, 225,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/United States
- { 31, 3, 225,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Deseret/United States
- { 31, 7, 4,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/American Samoa
- { 31, 7, 7,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Anguilla
- { 31, 7, 9,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Antigua And Barbuda
- { 31, 7, 13,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Australia
- { 31, 7, 14,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Austria
- { 31, 7, 16,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Bahamas
- { 31, 7, 19,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Barbados
- { 31, 7, 21,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Belgium
- { 31, 7, 22,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Belize
- { 31, 7, 24,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Bermuda
- { 31, 7, 28,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Botswana
- { 31, 7, 31,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/British Indian Ocean Territory
- { 31, 7, 35,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Burundi
- { 31, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Cameroon
- { 31, 7, 38,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Canada
- { 31, 7, 40,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Cayman Islands
- { 31, 7, 45,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Christmas Island
- { 31, 7, 46,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Cocos Islands
- { 31, 7, 51,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Cook Islands
- { 31, 7, 56,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Cyprus
- { 31, 7, 58,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Denmark
- { 31, 7, 60,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Dominica
- { 31, 7, 67,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Eritrea
- { 31, 7, 70,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Falkland Islands
- { 31, 7, 72,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Fiji
- { 31, 7, 73,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Finland
- { 31, 7, 75,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Guernsey
- { 31, 7, 80,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Gambia
- { 31, 7, 82,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Germany
- { 31, 7, 83,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Ghana
- { 31, 7, 84,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Gibraltar
- { 31, 7, 87,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Grenada
- { 31, 7, 89,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Guam
- { 31, 7, 93,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Guyana
- { 31, 7, 97,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Hong Kong
- { 31, 7, 100,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/India
- { 31, 7, 104,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Ireland
- { 31, 7, 105,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Israel
- { 31, 7, 107,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Jamaica
- { 31, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Kenya
- { 31, 7, 112,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Kiribati
- { 31, 7, 120,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Lesotho
- { 31, 7, 121,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Liberia
- { 31, 7, 126,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Macau
- { 31, 7, 128,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Madagascar
- { 31, 7, 129,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Malawi
- { 31, 7, 130,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Malaysia
- { 31, 7, 133,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Malta
- { 31, 7, 134,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Marshall Islands
- { 31, 7, 137,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Mauritius
- { 31, 7, 140,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Micronesia
- { 31, 7, 144,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Montserrat
- { 31, 7, 148,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Namibia
- { 31, 7, 149,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Nauru
- { 31, 7, 151,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Netherlands
- { 31, 7, 154,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/New Zealand
- { 31, 7, 157,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Nigeria
- { 31, 7, 158,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Niue
- { 31, 7, 159,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Norfolk Island
- { 31, 7, 160,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Northern Mariana Islands
- { 31, 7, 163,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Pakistan
- { 31, 7, 164,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Palau
- { 31, 7, 167,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Papua New Guinea
- { 31, 7, 170,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Philippines
- { 31, 7, 171,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Pitcairn
- { 31, 7, 174,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Puerto Rico
- { 31, 7, 179,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Rwanda
- { 31, 7, 180,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Saint Kitts And Nevis
- { 31, 7, 181,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Saint Lucia
- { 31, 7, 182,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Saint Vincent And The Grenadines
- { 31, 7, 183,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Samoa
- { 31, 7, 188,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Seychelles
- { 31, 7, 189,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Sierra Leone
- { 31, 7, 190,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Singapore
- { 31, 7, 192,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Slovenia
- { 31, 7, 193,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Solomon Islands
- { 31, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/South Africa
- { 31, 7, 199,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Saint Helena
- { 31, 7, 201,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Sudan
- { 31, 7, 204,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Swaziland
- { 31, 7, 205,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Sweden
- { 31, 7, 206,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Switzerland
- { 31, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Tanzania
- { 31, 7, 213,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Tokelau
- { 31, 7, 214,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Tonga
- { 31, 7, 215,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Trinidad And Tobago
- { 31, 7, 219,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Turks And Caicos Islands
- { 31, 7, 220,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Tuvalu
- { 31, 7, 221,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Uganda
- { 31, 7, 223,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/United Arab Emirates
- { 31, 7, 224,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/United Kingdom
- { 31, 7, 226,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/United States Minor Outlying Islands
- { 31, 7, 229,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Vanuatu
- { 31, 7, 233,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/British Virgin Islands
- { 31, 7, 234,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/United States Virgin Islands
- { 31, 7, 239,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Zambia
- { 31, 7, 240,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Zimbabwe
- { 31, 7, 249,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Diego Garcia
- { 31, 7, 251,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Isle Of Man
- { 31, 7, 252,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Jersey
- { 31, 7, 254,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/South Sudan
- { 31, 7, 256,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Sint Maarten
- { 31, 7, 260,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/World
- { 31, 7, 261,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // English/Latin/Europe
- { 32, 7, 260,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Esperanto/Latin/World
- { 33, 7, 68,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Estonian/Latin/Estonia
- { 34, 7, 71,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Faroese/Latin/Faroe Islands
- { 34, 7, 58,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Faroese/Latin/Denmark
- { 36, 7, 73,{ 766,82 },{ 848,118 },{ 185,27 },{ 966,142 },{ 966,142 },{ 185,27 }}, // Finnish/Latin/Finland
- { 37, 7, 74,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/France
- { 37, 7, 3,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Algeria
- { 37, 7, 21,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Belgium
- { 37, 7, 23,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Benin
- { 37, 7, 34,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Burkina Faso
- { 37, 7, 35,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Burundi
- { 37, 7, 37,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Cameroon
- { 37, 7, 38,{ 1248,58 },{ 1306,82 },{ 185,27 },{ 1248,58 },{ 1306,82 },{ 185,27 }}, // French/Latin/Canada
- { 37, 7, 41,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Central African Republic
- { 37, 7, 42,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Chad
- { 37, 7, 48,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Comoros
- { 37, 7, 49,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Congo Kinshasa
- { 37, 7, 50,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Congo Brazzaville
- { 37, 7, 53,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Ivory Coast
- { 37, 7, 59,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Djibouti
- { 37, 7, 66,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Equatorial Guinea
- { 37, 7, 76,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/French Guiana
- { 37, 7, 77,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/French Polynesia
- { 37, 7, 79,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Gabon
- { 37, 7, 88,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Guadeloupe
- { 37, 7, 91,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Guinea
- { 37, 7, 94,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Haiti
- { 37, 7, 125,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Luxembourg
- { 37, 7, 128,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Madagascar
- { 37, 7, 132,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Mali
- { 37, 7, 135,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Martinique
- { 37, 7, 136,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Mauritania
- { 37, 7, 137,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Mauritius
- { 37, 7, 138,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Mayotte
- { 37, 7, 142,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Monaco
- { 37, 7, 145,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Morocco
- { 37, 7, 153,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/New Caledonia
- { 37, 7, 156,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Niger
- { 37, 7, 176,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Reunion
- { 37, 7, 179,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Rwanda
- { 37, 7, 187,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Senegal
- { 37, 7, 188,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Seychelles
- { 37, 7, 200,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Saint Pierre And Miquelon
- { 37, 7, 206,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Switzerland
- { 37, 7, 207,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Syria
- { 37, 7, 212,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Togo
- { 37, 7, 216,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Tunisia
- { 37, 7, 229,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Vanuatu
- { 37, 7, 235,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Wallis And Futuna Islands
- { 37, 7, 244,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Saint Barthelemy
- { 37, 7, 245,{ 1108,58 },{ 1166,82 },{ 185,27 },{ 1108,58 },{ 1166,82 },{ 185,27 }}, // French/Latin/Saint Martin
- { 38, 7, 151,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Western Frisian/Latin/Netherlands
- { 39, 7, 224,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Gaelic/Latin/United Kingdom
- { 40, 7, 197,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Galician/Latin/Spain
- { 41, 15, 81,{ 1388,92 },{ 1388,92 },{ 185,27 },{ 1388,92 },{ 1388,92 },{ 185,27 }}, // Georgian/Georgian/Georgia
- { 42, 7, 82,{ 1480,87 },{ 1480,87 },{ 185,27 },{ 1480,87 },{ 1480,87 },{ 185,27 }}, // German/Latin/Germany
- { 42, 7, 14,{ 1480,87 },{ 1480,87 },{ 185,27 },{ 1480,87 },{ 1480,87 },{ 185,27 }}, // German/Latin/Austria
- { 42, 7, 21,{ 1480,87 },{ 1480,87 },{ 185,27 },{ 1480,87 },{ 1480,87 },{ 185,27 }}, // German/Latin/Belgium
- { 42, 7, 106,{ 1480,87 },{ 1480,87 },{ 185,27 },{ 1480,87 },{ 1480,87 },{ 185,27 }}, // German/Latin/Italy
- { 42, 7, 123,{ 1480,87 },{ 1480,87 },{ 185,27 },{ 1480,87 },{ 1480,87 },{ 185,27 }}, // German/Latin/Liechtenstein
- { 42, 7, 125,{ 1480,87 },{ 1480,87 },{ 185,27 },{ 1480,87 },{ 1480,87 },{ 185,27 }}, // German/Latin/Luxembourg
- { 42, 7, 206,{ 1480,87 },{ 1480,87 },{ 185,27 },{ 1480,87 },{ 1480,87 },{ 185,27 }}, // German/Latin/Switzerland
- { 43, 16, 85,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Greek/Greek/Greece
- { 43, 16, 56,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Greek/Greek/Cyprus
- { 44, 7, 86,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Greenlandic/Latin/Greenland
- { 45, 7, 168,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Guarani/Latin/Paraguay
- { 46, 17, 100,{ 1567,86 },{ 1567,86 },{ 185,27 },{ 1567,86 },{ 1567,86 },{ 185,27 }}, // Gujarati/Gujarati/India
- { 47, 7, 157,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Hausa/Latin/Nigeria
- { 47, 1, 157,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Hausa/Arabic/Nigeria
- { 47, 7, 83,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Hausa/Latin/Ghana
- { 47, 7, 156,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Hausa/Latin/Niger
- { 48, 18, 105,{ 1653,69 },{ 1653,69 },{ 185,27 },{ 1653,69 },{ 1653,69 },{ 185,27 }}, // Hebrew/Hebrew/Israel
- { 49, 13, 100,{ 1722,82 },{ 1722,82 },{ 185,27 },{ 1722,82 },{ 1722,82 },{ 185,27 }}, // Hindi/Devanagari/India
- { 50, 7, 98,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Hungarian/Latin/Hungary
- { 51, 7, 99,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Icelandic/Latin/Iceland
- { 52, 7, 101,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Indonesian/Latin/Indonesia
- { 53, 7, 260,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Interlingua/Latin/World
- { 55, 44, 38,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Inuktitut/Canadian Aboriginal/Canada
- { 55, 7, 38,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Inuktitut/Latin/Canada
- { 57, 7, 104,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Irish/Latin/Ireland
- { 57, 7, 224,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Irish/Latin/United Kingdom
- { 58, 7, 106,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Italian/Latin/Italy
- { 58, 7, 184,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Italian/Latin/San Marino
- { 58, 7, 206,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Italian/Latin/Switzerland
- { 58, 7, 230,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Italian/Latin/Vatican City State
- { 59, 19, 108,{ 1804,78 },{ 1804,78 },{ 185,27 },{ 1804,78 },{ 1804,78 },{ 185,27 }}, // Japanese/Japanese/Japan
- { 60, 7, 101,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Javanese/Latin/Indonesia
- { 61, 21, 100,{ 1882,93 },{ 1882,93 },{ 185,27 },{ 1882,93 },{ 1882,93 },{ 185,27 }}, // Kannada/Kannada/India
- { 62, 1, 100,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kashmiri/Arabic/India
- { 63, 2, 110,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kazakh/Cyrillic/Kazakhstan
- { 64, 7, 179,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kinyarwanda/Latin/Rwanda
- { 65, 2, 116,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kirghiz/Cyrillic/Kyrgyzstan
- { 66, 22, 114,{ 1975,55 },{ 1975,55 },{ 185,27 },{ 1975,55 },{ 1975,55 },{ 185,27 }}, // Korean/Korean/South Korea
- { 66, 22, 113,{ 1975,55 },{ 1975,55 },{ 185,27 },{ 1975,55 },{ 1975,55 },{ 185,27 }}, // Korean/Korean/North Korea
- { 67, 7, 217,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kurdish/Latin/Turkey
- { 68, 7, 35,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Rundi/Latin/Burundi
- { 69, 23, 117,{ 2030,80 },{ 2110,81 },{ 185,27 },{ 2191,80 },{ 2110,81 },{ 185,27 }}, // Lao/Lao/Laos
- { 71, 7, 118,{ 2271,93 },{ 2271,93 },{ 185,27 },{ 2271,93 },{ 2271,93 },{ 185,27 }}, // Latvian/Latin/Latvia
- { 72, 7, 49,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Lingala/Latin/Congo Kinshasa
- { 72, 7, 6,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Lingala/Latin/Angola
- { 72, 7, 41,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Lingala/Latin/Central African Republic
- { 72, 7, 50,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Lingala/Latin/Congo Brazzaville
- { 73, 7, 124,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Lithuanian/Latin/Lithuania
- { 74, 2, 127,{ 2364,80 },{ 2364,80 },{ 185,27 },{ 2364,80 },{ 2364,80 },{ 185,27 }}, // Macedonian/Cyrillic/Macedonia
- { 75, 7, 128,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Malagasy/Latin/Madagascar
- { 76, 7, 130,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Malay/Latin/Malaysia
- { 76, 1, 130,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Malay/Arabic/Malaysia
- { 76, 7, 32,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Malay/Latin/Brunei
- { 76, 7, 190,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Malay/Latin/Singapore
- { 77, 24, 100,{ 2444,92 },{ 2444,92 },{ 2536,40 },{ 2444,92 },{ 2444,92 },{ 2536,40 }}, // Malayalam/Malayalam/India
- { 78, 7, 133,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Maltese/Latin/Malta
- { 79, 7, 154,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Maori/Latin/New Zealand
- { 80, 13, 100,{ 2576,81 },{ 2576,81 },{ 2657,27 },{ 2576,81 },{ 2576,81 },{ 2657,27 }}, // Marathi/Devanagari/India
- { 82, 2, 143,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Mongolian/Cyrillic/Mongolia
- { 82, 8, 44,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Mongolian/Mongolian/China
- { 84, 13, 150,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Nepali/Devanagari/Nepal
- { 84, 13, 100,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Nepali/Devanagari/India
- { 85, 7, 161,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Norwegian Bokmal/Latin/Norway
- { 85, 7, 203,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Norwegian Bokmal/Latin/Svalbard And Jan Mayen Islands
- { 86, 7, 74,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Occitan/Latin/France
- { 87, 26, 100,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Oriya/Oriya/India
- { 88, 1, 1,{ 2684,63 },{ 2684,63 },{ 2747,27 },{ 2684,63 },{ 2684,63 },{ 2747,27 }}, // Pashto/Arabic/Afghanistan
- { 88, 1, 163,{ 2684,63 },{ 2684,63 },{ 2747,27 },{ 2684,63 },{ 2684,63 },{ 2747,27 }}, // Pashto/Arabic/Pakistan
- { 89, 1, 102,{ 2774,67 },{ 2774,67 },{ 2841,24 },{ 2774,67 },{ 2774,67 },{ 2841,24 }}, // Persian/Arabic/Iran
- { 89, 1, 1,{ 2774,67 },{ 2774,67 },{ 2865,24 },{ 2774,67 },{ 2889,57 },{ 2841,24 }}, // Persian/Arabic/Afghanistan
- { 90, 7, 172,{ 2946,84 },{ 2946,84 },{ 185,27 },{ 2946,84 },{ 2946,84 },{ 185,27 }}, // Polish/Latin/Poland
- { 91, 7, 30,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/Brazil
- { 91, 7, 6,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/Angola
- { 91, 7, 39,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/Cape Verde
- { 91, 7, 62,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/East Timor
- { 91, 7, 66,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/Equatorial Guinea
- { 91, 7, 92,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/Guinea Bissau
- { 91, 7, 125,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/Luxembourg
- { 91, 7, 126,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/Macau
- { 91, 7, 146,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/Mozambique
- { 91, 7, 173,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/Portugal
- { 91, 7, 185,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/Sao Tome And Principe
- { 91, 7, 206,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Portuguese/Latin/Switzerland
- { 92, 4, 100,{ 3030,78 },{ 3030,78 },{ 185,27 },{ 3030,78 },{ 3030,78 },{ 185,27 }}, // Punjabi/Gurmukhi/India
- { 92, 1, 163,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Punjabi/Arabic/Pakistan
- { 93, 7, 169,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Quechua/Latin/Peru
- { 93, 7, 26,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Quechua/Latin/Bolivia
- { 93, 7, 63,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Quechua/Latin/Ecuador
- { 94, 7, 206,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Romansh/Latin/Switzerland
- { 95, 7, 177,{ 3108,86 },{ 3108,86 },{ 185,27 },{ 3108,86 },{ 3108,86 },{ 185,27 }}, // Romanian/Latin/Romania
- { 95, 7, 141,{ 3108,86 },{ 3108,86 },{ 185,27 },{ 3108,86 },{ 3108,86 },{ 185,27 }}, // Romanian/Latin/Moldova
- { 96, 2, 178,{ 3194,81 },{ 3194,81 },{ 185,27 },{ 3194,81 },{ 3194,81 },{ 185,27 }}, // Russian/Cyrillic/Russia
- { 96, 2, 20,{ 3194,81 },{ 3194,81 },{ 185,27 },{ 3194,81 },{ 3194,81 },{ 185,27 }}, // Russian/Cyrillic/Belarus
- { 96, 2, 110,{ 3194,81 },{ 3194,81 },{ 185,27 },{ 3194,81 },{ 3194,81 },{ 185,27 }}, // Russian/Cyrillic/Kazakhstan
- { 96, 2, 116,{ 3194,81 },{ 3194,81 },{ 185,27 },{ 3194,81 },{ 3194,81 },{ 185,27 }}, // Russian/Cyrillic/Kyrgyzstan
- { 96, 2, 141,{ 3194,81 },{ 3194,81 },{ 185,27 },{ 3194,81 },{ 3194,81 },{ 185,27 }}, // Russian/Cyrillic/Moldova
- { 96, 2, 222,{ 3194,81 },{ 3194,81 },{ 185,27 },{ 3194,81 },{ 3194,81 },{ 185,27 }}, // Russian/Cyrillic/Ukraine
- { 98, 7, 41,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sango/Latin/Central African Republic
- { 99, 13, 100,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sanskrit/Devanagari/India
- { 100, 2, 243,{ 3275,81 },{ 3275,81 },{ 185,27 },{ 3275,81 },{ 3275,81 },{ 185,27 }}, // Serbian/Cyrillic/Serbia
- { 100, 2, 27,{ 3275,81 },{ 3275,81 },{ 185,27 },{ 3275,81 },{ 3275,81 },{ 185,27 }}, // Serbian/Cyrillic/Bosnia And Herzegowina
- { 100, 2, 242,{ 3275,81 },{ 3275,81 },{ 185,27 },{ 3275,81 },{ 3275,81 },{ 185,27 }}, // Serbian/Cyrillic/Montenegro
- { 100, 2, 257,{ 3275,81 },{ 3275,81 },{ 185,27 },{ 3275,81 },{ 3275,81 },{ 185,27 }}, // Serbian/Cyrillic/Kosovo
- { 100, 7, 27,{ 3356,81 },{ 3356,81 },{ 185,27 },{ 3356,81 },{ 3356,81 },{ 185,27 }}, // Serbian/Latin/Bosnia And Herzegowina
- { 100, 7, 242,{ 3356,81 },{ 3356,81 },{ 185,27 },{ 3356,81 },{ 3356,81 },{ 185,27 }}, // Serbian/Latin/Montenegro
- { 100, 7, 243,{ 3356,81 },{ 3356,81 },{ 185,27 },{ 3356,81 },{ 3356,81 },{ 185,27 }}, // Serbian/Latin/Serbia
- { 100, 7, 257,{ 3356,81 },{ 3356,81 },{ 185,27 },{ 3356,81 },{ 3356,81 },{ 185,27 }}, // Serbian/Latin/Kosovo
- { 101, 2, 81,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Ossetic/Cyrillic/Georgia
- { 101, 2, 178,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Ossetic/Cyrillic/Russia
- { 102, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Southern Sotho/Latin/South Africa
- { 103, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tswana/Latin/South Africa
- { 104, 7, 240,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Shona/Latin/Zimbabwe
- { 105, 1, 163,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sindhi/Arabic/Pakistan
- { 106, 32, 198,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sinhala/Sinhala/Sri Lanka
- { 107, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Swati/Latin/South Africa
- { 108, 7, 191,{ 600,82 },{ 600,82 },{ 185,27 },{ 600,82 },{ 600,82 },{ 185,27 }}, // Slovak/Latin/Slovakia
- { 109, 7, 192,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Slovenian/Latin/Slovenia
- { 110, 7, 194,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Somali/Latin/Somalia
- { 110, 7, 59,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Somali/Latin/Djibouti
- { 110, 7, 69,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Somali/Latin/Ethiopia
- { 110, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Somali/Latin/Kenya
- { 111, 7, 197,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Spain
- { 111, 7, 10,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Argentina
- { 111, 7, 22,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Belize
- { 111, 7, 26,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Bolivia
- { 111, 7, 30,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Brazil
- { 111, 7, 43,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Chile
- { 111, 7, 47,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Colombia
- { 111, 7, 52,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Costa Rica
- { 111, 7, 55,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Cuba
- { 111, 7, 61,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Dominican Republic
- { 111, 7, 63,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Ecuador
- { 111, 7, 65,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/El Salvador
- { 111, 7, 66,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Equatorial Guinea
- { 111, 7, 90,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Guatemala
- { 111, 7, 96,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Honduras
- { 111, 7, 139,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Mexico
- { 111, 7, 155,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Nicaragua
- { 111, 7, 166,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Panama
- { 111, 7, 168,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Paraguay
- { 111, 7, 169,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Peru
- { 111, 7, 170,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Philippines
- { 111, 7, 174,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Puerto Rico
- { 111, 7, 225,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/United States
- { 111, 7, 227,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Uruguay
- { 111, 7, 231,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Venezuela
- { 111, 7, 238,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Canary Islands
- { 111, 7, 246,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Latin America
- { 111, 7, 250,{ 682,84 },{ 682,84 },{ 185,27 },{ 682,84 },{ 682,84 },{ 185,27 }}, // Spanish/Latin/Ceuta And Melilla
- { 112, 7, 101,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sundanese/Latin/Indonesia
- { 113, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Swahili/Latin/Tanzania
- { 113, 7, 49,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Swahili/Latin/Congo Kinshasa
- { 113, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Swahili/Latin/Kenya
- { 113, 7, 221,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Swahili/Latin/Uganda
- { 114, 7, 205,{ 3437,84 },{ 3437,84 },{ 185,27 },{ 3521,84 },{ 3521,84 },{ 185,27 }}, // Swedish/Latin/Sweden
- { 114, 7, 73,{ 3437,84 },{ 3437,84 },{ 185,27 },{ 3521,84 },{ 3521,84 },{ 185,27 }}, // Swedish/Latin/Finland
- { 114, 7, 248,{ 3437,84 },{ 3437,84 },{ 185,27 },{ 3521,84 },{ 3521,84 },{ 185,27 }}, // Swedish/Latin/Aland Islands
- { 115, 7, 106,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sardinian/Latin/Italy
- { 116, 2, 209,{ 3605,81 },{ 3605,81 },{ 185,27 },{ 3605,81 },{ 3605,81 },{ 185,27 }}, // Tajik/Cyrillic/Tajikistan
- { 117, 27, 100,{ 3686,64 },{ 3750,94 },{ 185,27 },{ 3686,64 },{ 3750,94 },{ 185,27 }}, // Tamil/Tamil/India
- { 117, 27, 130,{ 3686,64 },{ 3750,94 },{ 185,27 },{ 3686,64 },{ 3750,94 },{ 185,27 }}, // Tamil/Tamil/Malaysia
- { 117, 27, 190,{ 3686,64 },{ 3750,94 },{ 185,27 },{ 3686,64 },{ 3750,94 },{ 185,27 }}, // Tamil/Tamil/Singapore
- { 117, 27, 198,{ 3686,64 },{ 3750,94 },{ 185,27 },{ 3686,64 },{ 3750,94 },{ 185,27 }}, // Tamil/Tamil/Sri Lanka
- { 118, 2, 178,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tatar/Cyrillic/Russia
- { 119, 28, 100,{ 3844,89 },{ 3844,89 },{ 185,27 },{ 3844,89 },{ 3844,89 },{ 185,27 }}, // Telugu/Telugu/India
- { 120, 30, 211,{ 3933,99 },{ 3933,99 },{ 185,27 },{ 3933,99 },{ 3933,99 },{ 185,27 }}, // Thai/Thai/Thailand
- { 121, 31, 44,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tibetan/Tibetan/China
- { 121, 31, 100,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tibetan/Tibetan/India
- { 122, 14, 69,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tigrinya/Ethiopic/Ethiopia
- { 122, 14, 67,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tigrinya/Ethiopic/Eritrea
- { 123, 7, 214,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tongan/Latin/Tonga
- { 124, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tsonga/Latin/South Africa
- { 125, 7, 217,{ 4032,81 },{ 4032,81 },{ 185,27 },{ 4032,81 },{ 4032,81 },{ 185,27 }}, // Turkish/Latin/Turkey
- { 125, 7, 56,{ 4032,81 },{ 4032,81 },{ 185,27 },{ 4032,81 },{ 4032,81 },{ 185,27 }}, // Turkish/Latin/Cyprus
- { 126, 7, 218,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Turkmen/Latin/Turkmenistan
- { 128, 1, 44,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Uighur/Arabic/China
- { 129, 2, 222,{ 4113,50 },{ 4163,81 },{ 185,27 },{ 4244,58 },{ 4163,81 },{ 185,27 }}, // Ukrainian/Cyrillic/Ukraine
- { 130, 1, 163,{ 4302,67 },{ 4302,67 },{ 185,27 },{ 4302,67 },{ 4302,67 },{ 185,27 }}, // Urdu/Arabic/Pakistan
- { 130, 1, 100,{ 4302,67 },{ 4302,67 },{ 185,27 },{ 4302,67 },{ 4302,67 },{ 185,27 }}, // Urdu/Arabic/India
- { 131, 7, 228,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Uzbek/Latin/Uzbekistan
- { 131, 1, 1,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Uzbek/Arabic/Afghanistan
- { 131, 2, 228,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Uzbek/Cyrillic/Uzbekistan
- { 132, 7, 232,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Vietnamese/Latin/Vietnam
- { 133, 7, 260,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Volapuk/Latin/World
- { 134, 7, 224,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Welsh/Latin/United Kingdom
- { 135, 7, 187,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Wolof/Latin/Senegal
- { 136, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Xhosa/Latin/South Africa
- { 137, 18, 260,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Yiddish/Hebrew/World
- { 138, 7, 157,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Yoruba/Latin/Nigeria
- { 138, 7, 23,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Yoruba/Latin/Benin
- { 140, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Zulu/Latin/South Africa
- { 141, 7, 161,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Norwegian Nynorsk/Latin/Norway
- { 142, 7, 27,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Bosnian/Latin/Bosnia And Herzegowina
- { 142, 2, 27,{ 3275,81 },{ 3275,81 },{ 185,27 },{ 3275,81 },{ 3275,81 },{ 185,27 }}, // Bosnian/Cyrillic/Bosnia And Herzegowina
- { 143, 29, 131,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Divehi/Thaana/Maldives
- { 144, 7, 251,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Manx/Latin/Isle Of Man
- { 145, 7, 224,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Cornish/Latin/United Kingdom
- { 146, 7, 83,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Akan/Latin/Ghana
- { 147, 13, 100,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Konkani/Devanagari/India
- { 148, 7, 83,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Ga/Latin/Ghana
- { 149, 7, 157,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Igbo/Latin/Nigeria
- { 150, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kamba/Latin/Kenya
- { 151, 33, 103,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Syriac/Syriac/Iraq
- { 152, 14, 67,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Blin/Ethiopic/Eritrea
- { 153, 14, 69,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Geez/Ethiopic/Ethiopia
- { 155, 7, 69,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sidamo/Latin/Ethiopia
- { 156, 7, 157,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Atsam/Latin/Nigeria
- { 157, 14, 67,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tigre/Ethiopic/Eritrea
- { 158, 7, 157,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Jju/Latin/Nigeria
- { 159, 7, 106,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Friulian/Latin/Italy
- { 160, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Venda/Latin/South Africa
- { 161, 7, 83,{ 4369,48 },{ 4417,87 },{ 185,27 },{ 4369,48 },{ 4417,87 },{ 185,27 }}, // Ewe/Latin/Ghana
- { 161, 7, 212,{ 4369,48 },{ 4417,87 },{ 185,27 },{ 4369,48 },{ 4417,87 },{ 185,27 }}, // Ewe/Latin/Togo
- { 162, 14, 69,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Walamo/Ethiopic/Ethiopia
- { 163, 7, 225,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Hawaiian/Latin/United States
- { 164, 7, 157,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tyap/Latin/Nigeria
- { 165, 7, 129,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Nyanja/Latin/Malawi
- { 166, 7, 170,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Filipino/Latin/Philippines
- { 167, 7, 206,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Swiss German/Latin/Switzerland
- { 167, 7, 74,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Swiss German/Latin/France
- { 167, 7, 123,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Swiss German/Latin/Liechtenstein
- { 168, 34, 44,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sichuan Yi/Yi/China
- { 169, 7, 121,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kpelle/Latin/Liberia
- { 170, 7, 82,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Low German/Latin/Germany
- { 170, 7, 151,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Low German/Latin/Netherlands
- { 171, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // South Ndebele/Latin/South Africa
- { 172, 7, 195,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Northern Sotho/Latin/South Africa
- { 173, 7, 161,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Northern Sami/Latin/Norway
- { 173, 7, 73,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Northern Sami/Latin/Finland
- { 173, 7, 205,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Northern Sami/Latin/Sweden
- { 174, 7, 208,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Taroko/Latin/Taiwan
- { 175, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Gusii/Latin/Kenya
- { 176, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Taita/Latin/Kenya
- { 177, 7, 187,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Senegal
- { 177, 7, 34,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Burkina Faso
- { 177, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Cameroon
- { 177, 7, 80,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Gambia
- { 177, 7, 83,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Ghana
- { 177, 7, 91,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Guinea
- { 177, 7, 92,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Guinea Bissau
- { 177, 7, 121,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Liberia
- { 177, 7, 136,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Mauritania
- { 177, 7, 156,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Niger
- { 177, 7, 157,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Nigeria
- { 177, 7, 189,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Latin/Sierra Leone
- { 177, 134, 91,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Fulah/Adlam/Guinea
- { 178, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kikuyu/Latin/Kenya
- { 179, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Samburu/Latin/Kenya
- { 180, 7, 146,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sena/Latin/Mozambique
- { 181, 7, 240,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // North Ndebele/Latin/Zimbabwe
- { 182, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Rombo/Latin/Tanzania
- { 183, 9, 145,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tachelhit/Tifinagh/Morocco
- { 183, 7, 145,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tachelhit/Latin/Morocco
- { 184, 7, 3,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kabyle/Latin/Algeria
- { 185, 7, 221,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Nyankole/Latin/Uganda
- { 186, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Bena/Latin/Tanzania
- { 187, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Vunjo/Latin/Tanzania
- { 188, 7, 132,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Bambara/Latin/Mali
- { 188, 75, 132,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Bambara/Nko/Mali
- { 189, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Embu/Latin/Kenya
- { 190, 12, 225,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Cherokee/Cherokee/United States
- { 191, 7, 137,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Morisyen/Latin/Mauritius
- { 192, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Makonde/Latin/Tanzania
- { 193, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Langi/Latin/Tanzania
- { 194, 7, 221,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Ganda/Latin/Uganda
- { 195, 7, 239,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Bemba/Latin/Zambia
- { 196, 7, 39,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kabuverdianu/Latin/Cape Verde
- { 197, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Meru/Latin/Kenya
- { 198, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kalenjin/Latin/Kenya
- { 199, 7, 148,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Nama/Latin/Namibia
- { 200, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Machame/Latin/Tanzania
- { 201, 7, 82,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Colognian/Latin/Germany
- { 202, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Masai/Latin/Kenya
- { 202, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Masai/Latin/Tanzania
- { 203, 7, 221,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Soga/Latin/Uganda
- { 204, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Luyia/Latin/Kenya
- { 205, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Asu/Latin/Tanzania
- { 206, 7, 221,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Teso/Latin/Uganda
- { 206, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Teso/Latin/Kenya
- { 207, 7, 67,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Saho/Latin/Eritrea
- { 208, 7, 132,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Koyra Chiini/Latin/Mali
- { 209, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Rwa/Latin/Tanzania
- { 210, 7, 111,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Luo/Latin/Kenya
- { 211, 7, 221,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Chiga/Latin/Uganda
- { 212, 7, 145,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Central Morocco Tamazight/Latin/Morocco
- { 213, 7, 132,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Koyraboro Senni/Latin/Mali
- { 214, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Shambala/Latin/Tanzania
- { 215, 13, 100,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Bodo/Devanagari/India
- { 218, 2, 178,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Chechen/Cyrillic/Russia
- { 219, 2, 178,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Church/Cyrillic/Russia
- { 220, 2, 178,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Chuvash/Cyrillic/Russia
- { 230, 7, 49,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Luba Katanga/Latin/Congo Kinshasa
- { 231, 7, 125,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Luxembourgish/Latin/Luxembourg
- { 236, 7, 21,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Walloon/Latin/Belgium
- { 237, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Aghem/Latin/Cameroon
- { 238, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Basaa/Latin/Cameroon
- { 239, 7, 156,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Zarma/Latin/Niger
- { 240, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Duala/Latin/Cameroon
- { 241, 7, 187,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Jola Fonyi/Latin/Senegal
- { 242, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Ewondo/Latin/Cameroon
- { 243, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Bafia/Latin/Cameroon
- { 244, 7, 146,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Makhuwa Meetto/Latin/Mozambique
- { 245, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Mundang/Latin/Cameroon
- { 246, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kwasio/Latin/Cameroon
- { 247, 7, 254,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Nuer/Latin/South Sudan
- { 248, 2, 178,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sakha/Cyrillic/Russia
- { 249, 7, 210,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sangu/Latin/Tanzania
- { 251, 7, 156,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tasawaq/Latin/Niger
- { 252, 35, 121,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Vai/Vai/Liberia
- { 252, 7, 121,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Vai/Latin/Liberia
- { 253, 7, 206,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Walser/Latin/Switzerland
- { 254, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Yangben/Latin/Cameroon
- { 256, 7, 197,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Asturian/Latin/Spain
- { 257, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Ngomba/Latin/Cameroon
- { 258, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kako/Latin/Cameroon
- { 259, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Meta/Latin/Cameroon
- { 260, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Ngiemboon/Latin/Cameroon
- { 261, 7, 197,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Aragonese/Latin/Spain
- { 290, 11, 100,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Manipuri/Bengali/India
- { 309, 100, 232,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Tai Dam/Tai Viet/Vietnam
- { 312, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Akoose/Latin/Cameroon
- { 313, 7, 225,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Lakota/Latin/United States
- { 314, 9, 145,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Standard Moroccan Tamazight/Tifinagh/Morocco
- { 315, 7, 43,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Mapuche/Latin/Chile
- { 316, 1, 103,{ 4504,102 },{ 4504,102 },{ 185,27 },{ 4504,102 },{ 4504,102 },{ 185,27 }}, // Central Kurdish/Arabic/Iraq
- { 316, 1, 102,{ 4504,102 },{ 4504,102 },{ 185,27 },{ 4504,102 },{ 4504,102 },{ 185,27 }}, // Central Kurdish/Arabic/Iran
- { 317, 7, 82,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Lower Sorbian/Latin/Germany
- { 318, 7, 82,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Upper Sorbian/Latin/Germany
- { 319, 7, 37,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kenyang/Latin/Cameroon
- { 320, 7, 38,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Mohawk/Latin/Canada
- { 321, 75, 91,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Nko/Nko/Guinea
- { 322, 7, 260,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Prussian/Latin/World
- { 323, 7, 90,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Kiche/Latin/Guatemala
- { 324, 7, 205,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Southern Sami/Latin/Sweden
- { 325, 7, 205,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Lule Sami/Latin/Sweden
- { 326, 7, 73,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Inari Sami/Latin/Finland
- { 327, 7, 73,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Skolt Sami/Latin/Finland
- { 328, 7, 13,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Warlpiri/Latin/Australia
- { 346, 1, 102,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Mazanderani/Arabic/Iran
- { 349, 1, 102,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Northern Luri/Arabic/Iran
- { 349, 1, 103,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Northern Luri/Arabic/Iraq
- { 357, 6, 97,{ 484,39 },{ 484,39 },{ 185,27 },{ 484,39 },{ 484,39 },{ 185,27 }}, // Cantonese/Traditional Han/Hong Kong
- { 357, 5, 44,{ 484,39 },{ 484,39 },{ 185,27 },{ 484,39 },{ 484,39 },{ 185,27 }}, // Cantonese/Simplified Han/China
- { 358, 138, 225,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Osage/Osage/United States
- { 360, 7, 260,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Ido/Latin/World
- { 361, 7, 260,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Lojban/Latin/World
- { 362, 7, 106,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Sicilian/Latin/Italy
- { 363, 1, 102,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Southern Kurdish/Arabic/Iran
- { 364, 1, 163,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Western Balochi/Arabic/Pakistan
- { 365, 7, 170,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Cebuano/Latin/Philippines
- { 366, 2, 178,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Erzya/Cyrillic/Russia
- { 367, 7, 225,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Chickasaw/Latin/United States
- { 368, 7, 225,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Muscogee/Latin/United States
- { 369, 7, 172,{ 48,84 },{ 48,84 },{ 185,27 },{ 48,84 },{ 48,84 },{ 185,27 }}, // Silesian/Latin/Poland
- { 0, 0, 0,{ 0,0},{ 0,0},{ 0,0},{ 0,0},{ 0,0},{ 0,0}}, // trailing zeros
+ // lang script terr sLong long sShrt short sNarw narow Sizes...
+ { 1, 0, 0, 0, 0, 83, 83, 130, 153, 83, 83, 47, 47, 23, 26 },// C/AnyScript/AnyCountry
+ { 3, 7, 69, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Oromo/Latin/Ethiopia
+ { 3, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Oromo/Latin/Kenya
+ { 4, 7, 69, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Afar/Latin/Ethiopia
+ { 5, 7, 195, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Afrikaans/Latin/South Africa
+ { 5, 7, 148, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Afrikaans/Latin/Namibia
+ { 6, 7, 2, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Albanian/Latin/Albania
+ { 6, 7, 127, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Albanian/Latin/Macedonia
+ { 6, 7, 257, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Albanian/Latin/Kosovo
+ { 7, 14, 69, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Amharic/Ethiopic/Ethiopia
+ { 8, 1, 64, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Egypt
+ { 8, 1, 3, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Algeria
+ { 8, 1, 17, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Bahrain
+ { 8, 1, 42, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Chad
+ { 8, 1, 48, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Comoros
+ { 8, 1, 59, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Djibouti
+ { 8, 1, 67, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Eritrea
+ { 8, 1, 103, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Iraq
+ { 8, 1, 105, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Israel
+ { 8, 1, 109, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Jordan
+ { 8, 1, 115, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Kuwait
+ { 8, 1, 119, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Lebanon
+ { 8, 1, 122, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Libya
+ { 8, 1, 136, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Mauritania
+ { 8, 1, 145, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Morocco
+ { 8, 1, 162, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Oman
+ { 8, 1, 165, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Palestinian Territories
+ { 8, 1, 175, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Qatar
+ { 8, 1, 186, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Saudi Arabia
+ { 8, 1, 194, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Somalia
+ { 8, 1, 201, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Sudan
+ { 8, 1, 207, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Syria
+ { 8, 1, 216, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Tunisia
+ { 8, 1, 223, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/United Arab Emirates
+ { 8, 1, 236, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Western Sahara
+ { 8, 1, 237, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/Yemen
+ { 8, 1, 254, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/South Sudan
+ { 8, 1, 260, 179, 179, 179, 179, 153, 153, 67, 67, 67, 67, 26, 26 },// Arabic/Arabic/World
+ { 9, 10, 11, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Armenian/Armenian/Armenia
+ { 10, 11, 100, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Assamese/Bengali/India
+ { 12, 7, 15, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Azerbaijani/Latin/Azerbaijan
+ { 12, 1, 102, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Azerbaijani/Arabic/Iran
+ { 12, 2, 15, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Azerbaijani/Cyrillic/Azerbaijan
+ { 13, 2, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bashkir/Cyrillic/Russia
+ { 14, 7, 197, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Basque/Latin/Spain
+ { 15, 11, 18, 246, 246, 334, 334, 421, 421, 88, 88, 87, 87, 26, 26 },// Bengali/Bengali/Bangladesh
+ { 15, 11, 100, 246, 246, 334, 334, 421, 421, 88, 88, 87, 87, 26, 26 },// Bengali/Bengali/India
+ { 16, 31, 25, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Dzongkha/Tibetan/Bhutan
+ { 19, 7, 74, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Breton/Latin/France
+ { 20, 2, 33, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bulgarian/Cyrillic/Bulgaria
+ { 21, 25, 147, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Burmese/Myanmar/Myanmar
+ { 22, 2, 20, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Belarusian/Cyrillic/Belarus
+ { 23, 20, 36, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Khmer/Khmer/Cambodia
+ { 24, 7, 197, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Catalan/Latin/Spain
+ { 24, 7, 5, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Catalan/Latin/Andorra
+ { 24, 7, 74, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Catalan/Latin/France
+ { 24, 7, 106, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Catalan/Latin/Italy
+ { 25, 5, 44, 447, 447, 484, 484, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/China
+ { 25, 5, 97, 447, 447, 484, 484, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Hong Kong
+ { 25, 5, 126, 447, 447, 484, 484, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Macau
+ { 25, 5, 190, 447, 447, 484, 484, 153, 153, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Singapore
+ { 25, 6, 97, 484, 484, 484, 484, 153, 153, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Hong Kong
+ { 25, 6, 126, 484, 484, 484, 484, 153, 153, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Macau
+ { 25, 6, 208, 484, 484, 484, 484, 153, 153, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Taiwan
+ { 26, 7, 74, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Corsican/Latin/France
+ { 27, 7, 54, 0, 0, 0, 0, 522, 522, 83, 83, 83, 83, 38, 38 },// Croatian/Latin/Croatia
+ { 27, 7, 27, 0, 0, 0, 0, 522, 522, 83, 83, 83, 83, 38, 38 },// Croatian/Latin/Bosnia And Herzegowina
+ { 28, 7, 57, 560, 560, 560, 560, 153, 153, 81, 81, 81, 81, 26, 26 },// Czech/Latin/Czech Republic
+ { 29, 7, 58, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Danish/Latin/Denmark
+ { 29, 7, 86, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Danish/Latin/Greenland
+ { 30, 7, 151, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Dutch/Latin/Netherlands
+ { 30, 7, 12, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Dutch/Latin/Aruba
+ { 30, 7, 21, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Dutch/Latin/Belgium
+ { 30, 7, 152, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Dutch/Latin/Cura Sao
+ { 30, 7, 202, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Dutch/Latin/Suriname
+ { 30, 7, 255, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Dutch/Latin/Bonaire
+ { 30, 7, 256, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Dutch/Latin/Sint Maarten
+ { 31, 7, 225, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/United States
+ { 31, 3, 225, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Deseret/United States
+ { 31, 7, 4, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/American Samoa
+ { 31, 7, 7, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Anguilla
+ { 31, 7, 9, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Antigua And Barbuda
+ { 31, 7, 13, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Australia
+ { 31, 7, 14, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Austria
+ { 31, 7, 16, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Bahamas
+ { 31, 7, 19, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Barbados
+ { 31, 7, 21, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Belgium
+ { 31, 7, 22, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Belize
+ { 31, 7, 24, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Bermuda
+ { 31, 7, 28, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Botswana
+ { 31, 7, 31, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/British Indian Ocean Territory
+ { 31, 7, 35, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Burundi
+ { 31, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Cameroon
+ { 31, 7, 38, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Canada
+ { 31, 7, 40, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Cayman Islands
+ { 31, 7, 45, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Christmas Island
+ { 31, 7, 46, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Cocos Islands
+ { 31, 7, 51, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Cook Islands
+ { 31, 7, 56, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Cyprus
+ { 31, 7, 58, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Denmark
+ { 31, 7, 60, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Dominica
+ { 31, 7, 67, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Eritrea
+ { 31, 7, 70, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Falkland Islands
+ { 31, 7, 72, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Fiji
+ { 31, 7, 73, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Finland
+ { 31, 7, 75, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Guernsey
+ { 31, 7, 80, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Gambia
+ { 31, 7, 82, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Germany
+ { 31, 7, 83, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Ghana
+ { 31, 7, 84, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Gibraltar
+ { 31, 7, 87, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Grenada
+ { 31, 7, 89, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Guam
+ { 31, 7, 93, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Guyana
+ { 31, 7, 97, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Hong Kong
+ { 31, 7, 100, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/India
+ { 31, 7, 104, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Ireland
+ { 31, 7, 105, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Israel
+ { 31, 7, 107, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Jamaica
+ { 31, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Kenya
+ { 31, 7, 112, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Kiribati
+ { 31, 7, 120, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Lesotho
+ { 31, 7, 121, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Liberia
+ { 31, 7, 126, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Macau
+ { 31, 7, 128, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Madagascar
+ { 31, 7, 129, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Malawi
+ { 31, 7, 130, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Malaysia
+ { 31, 7, 133, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Malta
+ { 31, 7, 134, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Marshall Islands
+ { 31, 7, 137, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Mauritius
+ { 31, 7, 140, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Micronesia
+ { 31, 7, 144, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Montserrat
+ { 31, 7, 148, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Namibia
+ { 31, 7, 149, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Nauru
+ { 31, 7, 151, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Netherlands
+ { 31, 7, 154, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/New Zealand
+ { 31, 7, 157, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Nigeria
+ { 31, 7, 158, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Niue
+ { 31, 7, 159, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Norfolk Island
+ { 31, 7, 160, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Northern Mariana Islands
+ { 31, 7, 163, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Pakistan
+ { 31, 7, 164, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Palau
+ { 31, 7, 167, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Papua New Guinea
+ { 31, 7, 170, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Philippines
+ { 31, 7, 171, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Pitcairn
+ { 31, 7, 174, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Puerto Rico
+ { 31, 7, 179, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Rwanda
+ { 31, 7, 180, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Saint Kitts And Nevis
+ { 31, 7, 181, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Saint Lucia
+ { 31, 7, 182, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Saint Vincent And The Grenadines
+ { 31, 7, 183, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Samoa
+ { 31, 7, 188, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Seychelles
+ { 31, 7, 189, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Sierra Leone
+ { 31, 7, 190, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Singapore
+ { 31, 7, 192, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Slovenia
+ { 31, 7, 193, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Solomon Islands
+ { 31, 7, 195, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/South Africa
+ { 31, 7, 199, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Saint Helena
+ { 31, 7, 201, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Sudan
+ { 31, 7, 204, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Swaziland
+ { 31, 7, 205, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Sweden
+ { 31, 7, 206, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Switzerland
+ { 31, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Tanzania
+ { 31, 7, 213, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Tokelau
+ { 31, 7, 214, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Tonga
+ { 31, 7, 215, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Trinidad And Tobago
+ { 31, 7, 219, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Turks And Caicos Islands
+ { 31, 7, 220, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Tuvalu
+ { 31, 7, 221, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Uganda
+ { 31, 7, 223, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/United Arab Emirates
+ { 31, 7, 224, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/United Kingdom
+ { 31, 7, 226, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/United States Minor Outlying Islands
+ { 31, 7, 229, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Vanuatu
+ { 31, 7, 233, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/British Virgin Islands
+ { 31, 7, 234, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/United States Virgin Islands
+ { 31, 7, 239, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Zambia
+ { 31, 7, 240, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Zimbabwe
+ { 31, 7, 249, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Diego Garcia
+ { 31, 7, 251, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Isle Of Man
+ { 31, 7, 252, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Jersey
+ { 31, 7, 254, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/South Sudan
+ { 31, 7, 256, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Sint Maarten
+ { 31, 7, 260, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/World
+ { 31, 7, 261, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// English/Latin/Europe
+ { 32, 7, 260, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Esperanto/Latin/World
+ { 33, 7, 68, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Estonian/Latin/Estonia
+ { 34, 7, 71, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Faroese/Latin/Faroe Islands
+ { 34, 7, 58, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Faroese/Latin/Denmark
+ { 36, 7, 73, 724, 841, 982, 841, 153, 153,117,141, 81,141, 26, 26 },// Finnish/Latin/Finland
+ { 37, 7, 74, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/France
+ { 37, 7, 3, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Algeria
+ { 37, 7, 21, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Belgium
+ { 37, 7, 23, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Benin
+ { 37, 7, 34, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Burkina Faso
+ { 37, 7, 35, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Burundi
+ { 37, 7, 37, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Cameroon
+ { 37, 7, 38, 1201, 1201, 1282, 1282, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Canada
+ { 37, 7, 41, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Central African Republic
+ { 37, 7, 42, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Chad
+ { 37, 7, 48, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Comoros
+ { 37, 7, 49, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Congo Kinshasa
+ { 37, 7, 50, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Congo Brazzaville
+ { 37, 7, 53, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Ivory Coast
+ { 37, 7, 59, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Djibouti
+ { 37, 7, 66, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Equatorial Guinea
+ { 37, 7, 76, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/French Guiana
+ { 37, 7, 77, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/French Polynesia
+ { 37, 7, 79, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Gabon
+ { 37, 7, 88, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Guadeloupe
+ { 37, 7, 91, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Guinea
+ { 37, 7, 94, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Haiti
+ { 37, 7, 125, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Luxembourg
+ { 37, 7, 128, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Madagascar
+ { 37, 7, 132, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mali
+ { 37, 7, 135, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Martinique
+ { 37, 7, 136, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mauritania
+ { 37, 7, 137, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mauritius
+ { 37, 7, 138, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Mayotte
+ { 37, 7, 142, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Monaco
+ { 37, 7, 145, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Morocco
+ { 37, 7, 153, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/New Caledonia
+ { 37, 7, 156, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Niger
+ { 37, 7, 176, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Reunion
+ { 37, 7, 179, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Rwanda
+ { 37, 7, 187, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Senegal
+ { 37, 7, 188, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Seychelles
+ { 37, 7, 200, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Saint Pierre And Miquelon
+ { 37, 7, 206, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Switzerland
+ { 37, 7, 207, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Syria
+ { 37, 7, 212, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Togo
+ { 37, 7, 216, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Tunisia
+ { 37, 7, 229, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Vanuatu
+ { 37, 7, 235, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Wallis And Futuna Islands
+ { 37, 7, 244, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Saint Barthelemy
+ { 37, 7, 245, 1063, 1063, 1144, 1144, 153, 153, 81, 81, 57, 57, 26, 26 },// French/Latin/Saint Martin
+ { 38, 7, 151, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Western Frisian/Latin/Netherlands
+ { 39, 7, 224, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Gaelic/Latin/United Kingdom
+ { 40, 7, 197, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Galician/Latin/Spain
+ { 41, 15, 81, 1339, 1339, 1339, 1339, 153, 153, 91, 91, 91, 91, 26, 26 },// Georgian/Georgian/Georgia
+ { 42, 7, 82, 1430, 1430, 1430, 1430, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Germany
+ { 42, 7, 14, 1430, 1430, 1430, 1430, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Austria
+ { 42, 7, 21, 1430, 1430, 1430, 1430, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Belgium
+ { 42, 7, 106, 1430, 1430, 1430, 1430, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Italy
+ { 42, 7, 123, 1430, 1430, 1430, 1430, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Liechtenstein
+ { 42, 7, 125, 1430, 1430, 1430, 1430, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Luxembourg
+ { 42, 7, 206, 1430, 1430, 1430, 1430, 153, 153, 86, 86, 86, 86, 26, 26 },// German/Latin/Switzerland
+ { 43, 16, 85, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Greek/Greek/Greece
+ { 43, 16, 56, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Greek/Greek/Cyprus
+ { 44, 7, 86, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Greenlandic/Latin/Greenland
+ { 45, 7, 168, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Guarani/Latin/Paraguay
+ { 46, 17, 100, 1516, 1516, 1516, 1516, 153, 153, 85, 85, 85, 85, 26, 26 },// Gujarati/Gujarati/India
+ { 47, 7, 157, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hausa/Latin/Nigeria
+ { 47, 1, 157, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hausa/Arabic/Nigeria
+ { 47, 7, 83, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hausa/Latin/Ghana
+ { 47, 7, 156, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hausa/Latin/Niger
+ { 48, 18, 105, 1601, 1601, 1601, 1601, 153, 153, 68, 68, 68, 68, 26, 26 },// Hebrew/Hebrew/Israel
+ { 49, 13, 100, 1669, 1669, 1669, 1669, 153, 153, 81, 81, 81, 81, 26, 26 },// Hindi/Devanagari/India
+ { 50, 7, 98, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Hungarian/Latin/Hungary
+ { 51, 7, 99, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Icelandic/Latin/Iceland
+ { 52, 7, 101, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Indonesian/Latin/Indonesia
+ { 53, 7, 260, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Interlingua/Latin/World
+ { 55, 44, 38, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Inuktitut/Canadian Aboriginal/Canada
+ { 55, 7, 38, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Inuktitut/Latin/Canada
+ { 57, 7, 104, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Irish/Latin/Ireland
+ { 57, 7, 224, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Irish/Latin/United Kingdom
+ { 58, 7, 106, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Italian/Latin/Italy
+ { 58, 7, 184, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Italian/Latin/San Marino
+ { 58, 7, 206, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Italian/Latin/Switzerland
+ { 58, 7, 230, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Italian/Latin/Vatican City State
+ { 59, 19, 108, 1750, 1750, 1750, 1750, 153, 153, 77, 77, 77, 77, 26, 26 },// Japanese/Japanese/Japan
+ { 60, 7, 101, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Javanese/Latin/Indonesia
+ { 61, 21, 100, 1827, 1827, 1827, 1827, 153, 153, 92, 92, 92, 92, 26, 26 },// Kannada/Kannada/India
+ { 62, 1, 100, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kashmiri/Arabic/India
+ { 63, 2, 110, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kazakh/Cyrillic/Kazakhstan
+ { 64, 7, 179, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kinyarwanda/Latin/Rwanda
+ { 65, 2, 116, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kirghiz/Cyrillic/Kyrgyzstan
+ { 66, 22, 114, 1919, 1919, 1919, 1919, 153, 153, 54, 54, 54, 54, 26, 26 },// Korean/Korean/South Korea
+ { 66, 22, 113, 1919, 1919, 1919, 1919, 153, 153, 54, 54, 54, 54, 26, 26 },// Korean/Korean/North Korea
+ { 67, 7, 217, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kurdish/Latin/Turkey
+ { 68, 7, 35, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Rundi/Latin/Burundi
+ { 69, 23, 117, 1973, 1973, 2053, 2132, 153, 153, 80, 80, 79, 79, 26, 26 },// Lao/Lao/Laos
+ { 71, 7, 118, 2211, 2211, 2211, 2211, 153, 153, 92, 92, 92, 92, 26, 26 },// Latvian/Latin/Latvia
+ { 72, 7, 49, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lingala/Latin/Congo Kinshasa
+ { 72, 7, 6, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lingala/Latin/Angola
+ { 72, 7, 41, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lingala/Latin/Central African Republic
+ { 72, 7, 50, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lingala/Latin/Congo Brazzaville
+ { 73, 7, 124, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lithuanian/Latin/Lithuania
+ { 74, 2, 127, 2303, 2303, 2303, 2303, 153, 153, 79, 79, 79, 79, 26, 26 },// Macedonian/Cyrillic/Macedonia
+ { 75, 7, 128, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Malagasy/Latin/Madagascar
+ { 76, 7, 130, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Malay/Latin/Malaysia
+ { 76, 1, 130, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Malay/Arabic/Malaysia
+ { 76, 7, 32, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Malay/Latin/Brunei
+ { 76, 7, 190, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Malay/Latin/Singapore
+ { 77, 24, 100, 2382, 2382, 2382, 2382, 2473, 2473, 91, 91, 91, 91, 39, 39 },// Malayalam/Malayalam/India
+ { 78, 7, 133, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Maltese/Latin/Malta
+ { 79, 7, 154, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Maori/Latin/New Zealand
+ { 80, 13, 100, 2512, 2512, 2512, 2512, 2592, 2592, 80, 80, 80, 80, 26, 26 },// Marathi/Devanagari/India
+ { 82, 2, 143, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mongolian/Cyrillic/Mongolia
+ { 82, 8, 44, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mongolian/Mongolian/China
+ { 84, 13, 150, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nepali/Devanagari/Nepal
+ { 84, 13, 100, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nepali/Devanagari/India
+ { 85, 7, 161, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Norwegian Bokmal/Latin/Norway
+ { 85, 7, 203, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Norwegian Bokmal/Latin/Svalbard And Jan Mayen Islands
+ { 86, 7, 74, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Occitan/Latin/France
+ { 87, 26, 100, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Oriya/Oriya/India
+ { 88, 1, 1, 2618, 2618, 2618, 2618, 2680, 2680, 62, 62, 62, 62, 26, 26 },// Pashto/Arabic/Afghanistan
+ { 88, 1, 163, 2618, 2618, 2618, 2618, 2680, 2680, 62, 62, 62, 62, 26, 26 },// Pashto/Arabic/Pakistan
+ { 89, 1, 102, 2706, 2706, 2706, 2706, 2772, 2772, 66, 66, 66, 66, 23, 23 },// Persian/Arabic/Iran
+ { 89, 1, 1, 2706, 2795, 2706, 2706, 2851, 2772, 66, 56, 66, 66, 23, 23 },// Persian/Arabic/Afghanistan
+ { 90, 7, 172, 2874, 2874, 2874, 2874, 153, 153, 83, 83, 83, 83, 26, 26 },// Polish/Latin/Poland
+ { 91, 7, 30, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Brazil
+ { 91, 7, 6, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Angola
+ { 91, 7, 39, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Cape Verde
+ { 91, 7, 62, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/East Timor
+ { 91, 7, 66, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Equatorial Guinea
+ { 91, 7, 92, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Guinea Bissau
+ { 91, 7, 125, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Luxembourg
+ { 91, 7, 126, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Macau
+ { 91, 7, 146, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Mozambique
+ { 91, 7, 173, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Portugal
+ { 91, 7, 185, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Sao Tome And Principe
+ { 91, 7, 206, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Portuguese/Latin/Switzerland
+ { 92, 4, 100, 2957, 2957, 2957, 2957, 153, 153, 77, 77, 77, 77, 26, 26 },// Punjabi/Gurmukhi/India
+ { 92, 1, 163, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Punjabi/Arabic/Pakistan
+ { 93, 7, 169, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Quechua/Latin/Peru
+ { 93, 7, 26, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Quechua/Latin/Bolivia
+ { 93, 7, 63, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Quechua/Latin/Ecuador
+ { 94, 7, 206, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Romansh/Latin/Switzerland
+ { 95, 7, 177, 3034, 3034, 3034, 3034, 153, 153, 85, 85, 85, 85, 26, 26 },// Romanian/Latin/Romania
+ { 95, 7, 141, 3034, 3034, 3034, 3034, 153, 153, 85, 85, 85, 85, 26, 26 },// Romanian/Latin/Moldova
+ { 96, 2, 178, 3119, 3119, 3119, 3119, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Russia
+ { 96, 2, 20, 3119, 3119, 3119, 3119, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Belarus
+ { 96, 2, 110, 3119, 3119, 3119, 3119, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Kazakhstan
+ { 96, 2, 116, 3119, 3119, 3119, 3119, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Kyrgyzstan
+ { 96, 2, 141, 3119, 3119, 3119, 3119, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Moldova
+ { 96, 2, 222, 3119, 3119, 3119, 3119, 153, 153, 80, 80, 80, 80, 26, 26 },// Russian/Cyrillic/Ukraine
+ { 98, 7, 41, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sango/Latin/Central African Republic
+ { 99, 13, 100, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sanskrit/Devanagari/India
+ { 100, 2, 243, 3199, 3199, 3199, 3199, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Serbia
+ { 100, 7, 27, 3279, 3279, 3279, 3279, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Bosnia And Herzegowina
+ { 100, 7, 242, 3279, 3279, 3279, 3279, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Montenegro
+ { 100, 7, 243, 3279, 3279, 3279, 3279, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Serbia
+ { 100, 2, 27, 3199, 3199, 3199, 3199, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Bosnia And Herzegowina
+ { 100, 2, 242, 3199, 3199, 3199, 3199, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Montenegro
+ { 100, 2, 257, 3199, 3199, 3199, 3199, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Cyrillic/Kosovo
+ { 100, 7, 257, 3279, 3279, 3279, 3279, 153, 153, 80, 80, 80, 80, 26, 26 },// Serbian/Latin/Kosovo
+ { 101, 2, 81, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ossetic/Cyrillic/Georgia
+ { 101, 2, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ossetic/Cyrillic/Russia
+ { 102, 7, 195, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Southern Sotho/Latin/South Africa
+ { 103, 7, 195, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tswana/Latin/South Africa
+ { 104, 7, 240, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Shona/Latin/Zimbabwe
+ { 105, 1, 163, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sindhi/Arabic/Pakistan
+ { 106, 32, 198, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sinhala/Sinhala/Sri Lanka
+ { 107, 7, 195, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swati/Latin/South Africa
+ { 108, 7, 191, 560, 560, 560, 560, 153, 153, 81, 81, 81, 81, 26, 26 },// Slovak/Latin/Slovakia
+ { 109, 7, 192, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Slovenian/Latin/Slovenia
+ { 110, 7, 194, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Somali/Latin/Somalia
+ { 110, 7, 59, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Somali/Latin/Djibouti
+ { 110, 7, 69, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Somali/Latin/Ethiopia
+ { 110, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Somali/Latin/Kenya
+ { 111, 7, 197, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Spain
+ { 111, 7, 10, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Argentina
+ { 111, 7, 22, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Belize
+ { 111, 7, 26, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Bolivia
+ { 111, 7, 30, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Brazil
+ { 111, 7, 43, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Chile
+ { 111, 7, 47, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Colombia
+ { 111, 7, 52, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Costa Rica
+ { 111, 7, 55, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Cuba
+ { 111, 7, 61, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Dominican Republic
+ { 111, 7, 63, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Ecuador
+ { 111, 7, 65, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/El Salvador
+ { 111, 7, 66, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Equatorial Guinea
+ { 111, 7, 90, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Guatemala
+ { 111, 7, 96, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Honduras
+ { 111, 7, 139, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Mexico
+ { 111, 7, 155, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Nicaragua
+ { 111, 7, 166, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Panama
+ { 111, 7, 168, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Paraguay
+ { 111, 7, 169, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Peru
+ { 111, 7, 170, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Philippines
+ { 111, 7, 174, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Puerto Rico
+ { 111, 7, 225, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/United States
+ { 111, 7, 227, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Uruguay
+ { 111, 7, 231, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Venezuela
+ { 111, 7, 238, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Canary Islands
+ { 111, 7, 246, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Latin America
+ { 111, 7, 250, 641, 641, 641, 641, 153, 153, 83, 83, 83, 83, 26, 26 },// Spanish/Latin/Ceuta And Melilla
+ { 112, 7, 101, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sundanese/Latin/Indonesia
+ { 113, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swahili/Latin/Tanzania
+ { 113, 7, 49, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swahili/Latin/Congo Kinshasa
+ { 113, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swahili/Latin/Kenya
+ { 113, 7, 221, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swahili/Latin/Uganda
+ { 114, 7, 205, 3359, 3442, 3359, 3442, 153, 153, 83, 83, 83, 83, 26, 26 },// Swedish/Latin/Sweden
+ { 114, 7, 73, 3359, 3442, 3359, 3442, 153, 153, 83, 83, 83, 83, 26, 26 },// Swedish/Latin/Finland
+ { 114, 7, 248, 3359, 3442, 3359, 3442, 153, 153, 83, 83, 83, 83, 26, 26 },// Swedish/Latin/Aland Islands
+ { 115, 7, 106, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sardinian/Latin/Italy
+ { 116, 2, 209, 3525, 3525, 3525, 3525, 153, 153, 80, 80, 80, 80, 26, 26 },// Tajik/Cyrillic/Tajikistan
+ { 117, 27, 100, 3605, 3605, 3698, 3698, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/India
+ { 117, 27, 130, 3605, 3605, 3698, 3698, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/Malaysia
+ { 117, 27, 190, 3605, 3605, 3698, 3698, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/Singapore
+ { 117, 27, 198, 3605, 3605, 3698, 3698, 153, 153, 93, 93, 63, 63, 26, 26 },// Tamil/Tamil/Sri Lanka
+ { 118, 2, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tatar/Cyrillic/Russia
+ { 119, 28, 100, 3761, 3761, 3761, 3761, 153, 153, 88, 88, 88, 88, 26, 26 },// Telugu/Telugu/India
+ { 120, 30, 211, 3849, 3849, 3849, 3849, 153, 153, 98, 98, 98, 98, 26, 26 },// Thai/Thai/Thailand
+ { 121, 31, 44, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tibetan/Tibetan/China
+ { 121, 31, 100, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tibetan/Tibetan/India
+ { 122, 14, 69, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tigrinya/Ethiopic/Ethiopia
+ { 122, 14, 67, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tigrinya/Ethiopic/Eritrea
+ { 123, 7, 214, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tongan/Latin/Tonga
+ { 124, 7, 195, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tsonga/Latin/South Africa
+ { 125, 7, 217, 3947, 3947, 3947, 3947, 153, 153, 80, 80, 80, 80, 26, 26 },// Turkish/Latin/Turkey
+ { 125, 7, 56, 3947, 3947, 3947, 3947, 153, 153, 80, 80, 80, 80, 26, 26 },// Turkish/Latin/Cyprus
+ { 126, 7, 218, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Turkmen/Latin/Turkmenistan
+ { 128, 1, 44, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Uighur/Arabic/China
+ { 129, 2, 222, 4027, 4027, 4107, 4156, 153, 153, 80, 80, 49, 57, 26, 26 },// Ukrainian/Cyrillic/Ukraine
+ { 130, 1, 163, 4213, 4213, 4213, 4213, 153, 153, 66, 66, 66, 66, 26, 26 },// Urdu/Arabic/Pakistan
+ { 130, 1, 100, 4213, 4213, 4213, 4213, 153, 153, 66, 66, 66, 66, 26, 26 },// Urdu/Arabic/India
+ { 131, 7, 228, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Uzbek/Latin/Uzbekistan
+ { 131, 1, 1, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Uzbek/Arabic/Afghanistan
+ { 131, 2, 228, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Uzbek/Cyrillic/Uzbekistan
+ { 132, 7, 232, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Vietnamese/Latin/Vietnam
+ { 133, 7, 260, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Volapuk/Latin/World
+ { 134, 7, 224, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Welsh/Latin/United Kingdom
+ { 135, 7, 187, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Wolof/Latin/Senegal
+ { 136, 7, 195, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Xhosa/Latin/South Africa
+ { 137, 18, 260, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Yiddish/Hebrew/World
+ { 138, 7, 157, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Yoruba/Latin/Nigeria
+ { 138, 7, 23, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Yoruba/Latin/Benin
+ { 140, 7, 195, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Zulu/Latin/South Africa
+ { 141, 7, 161, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Norwegian Nynorsk/Latin/Norway
+ { 142, 7, 27, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bosnian/Latin/Bosnia And Herzegowina
+ { 142, 2, 27, 3199, 3199, 3199, 3199, 153, 153, 80, 80, 80, 80, 26, 26 },// Bosnian/Cyrillic/Bosnia And Herzegowina
+ { 143, 29, 131, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Divehi/Thaana/Maldives
+ { 144, 7, 251, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Manx/Latin/Isle Of Man
+ { 145, 7, 224, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Cornish/Latin/United Kingdom
+ { 146, 7, 83, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Akan/Latin/Ghana
+ { 147, 13, 100, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Konkani/Devanagari/India
+ { 148, 7, 83, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ga/Latin/Ghana
+ { 149, 7, 157, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Igbo/Latin/Nigeria
+ { 150, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kamba/Latin/Kenya
+ { 151, 33, 103, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Syriac/Syriac/Iraq
+ { 152, 14, 67, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Blin/Ethiopic/Eritrea
+ { 153, 14, 69, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Geez/Ethiopic/Ethiopia
+ { 155, 7, 69, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sidamo/Latin/Ethiopia
+ { 156, 7, 157, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Atsam/Latin/Nigeria
+ { 157, 14, 67, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tigre/Ethiopic/Eritrea
+ { 158, 7, 157, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Jju/Latin/Nigeria
+ { 159, 7, 106, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Friulian/Latin/Italy
+ { 160, 7, 195, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Venda/Latin/South Africa
+ { 161, 7, 83, 4279, 4279, 4365, 4365, 153, 153, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Ghana
+ { 161, 7, 212, 4279, 4279, 4365, 4365, 153, 153, 86, 86, 47, 47, 26, 26 },// Ewe/Latin/Togo
+ { 162, 14, 69, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Walamo/Ethiopic/Ethiopia
+ { 163, 7, 225, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Hawaiian/Latin/United States
+ { 164, 7, 157, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tyap/Latin/Nigeria
+ { 165, 7, 129, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nyanja/Latin/Malawi
+ { 166, 7, 170, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Filipino/Latin/Philippines
+ { 167, 7, 206, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swiss German/Latin/Switzerland
+ { 167, 7, 74, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swiss German/Latin/France
+ { 167, 7, 123, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Swiss German/Latin/Liechtenstein
+ { 168, 34, 44, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sichuan Yi/Yi/China
+ { 169, 7, 121, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kpelle/Latin/Liberia
+ { 170, 7, 82, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Low German/Latin/Germany
+ { 170, 7, 151, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Low German/Latin/Netherlands
+ { 171, 7, 195, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// South Ndebele/Latin/South Africa
+ { 172, 7, 195, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Northern Sotho/Latin/South Africa
+ { 173, 7, 161, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Northern Sami/Latin/Norway
+ { 173, 7, 73, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Northern Sami/Latin/Finland
+ { 173, 7, 205, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Northern Sami/Latin/Sweden
+ { 174, 7, 208, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Taroko/Latin/Taiwan
+ { 175, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Gusii/Latin/Kenya
+ { 176, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Taita/Latin/Kenya
+ { 177, 7, 187, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Senegal
+ { 177, 7, 34, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Burkina Faso
+ { 177, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Cameroon
+ { 177, 7, 80, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Gambia
+ { 177, 7, 83, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Ghana
+ { 177, 7, 91, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Guinea
+ { 177, 7, 92, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Guinea Bissau
+ { 177, 7, 121, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Liberia
+ { 177, 7, 136, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Mauritania
+ { 177, 7, 156, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Niger
+ { 177, 7, 157, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Nigeria
+ { 177, 7, 189, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Latin/Sierra Leone
+ { 177, 134, 91, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Fulah/Adlam/Guinea
+ { 178, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kikuyu/Latin/Kenya
+ { 179, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Samburu/Latin/Kenya
+ { 180, 7, 146, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sena/Latin/Mozambique
+ { 181, 7, 240, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// North Ndebele/Latin/Zimbabwe
+ { 182, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Rombo/Latin/Tanzania
+ { 183, 9, 145, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tachelhit/Tifinagh/Morocco
+ { 183, 7, 145, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tachelhit/Latin/Morocco
+ { 184, 7, 3, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kabyle/Latin/Algeria
+ { 185, 7, 221, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nyankole/Latin/Uganda
+ { 186, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bena/Latin/Tanzania
+ { 187, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Vunjo/Latin/Tanzania
+ { 188, 7, 132, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bambara/Latin/Mali
+ { 188, 75, 132, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bambara/Nko/Mali
+ { 189, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Embu/Latin/Kenya
+ { 190, 12, 225, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Cherokee/Cherokee/United States
+ { 191, 7, 137, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Morisyen/Latin/Mauritius
+ { 192, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Makonde/Latin/Tanzania
+ { 193, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Langi/Latin/Tanzania
+ { 194, 7, 221, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ganda/Latin/Uganda
+ { 195, 7, 239, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bemba/Latin/Zambia
+ { 196, 7, 39, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kabuverdianu/Latin/Cape Verde
+ { 197, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Meru/Latin/Kenya
+ { 198, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kalenjin/Latin/Kenya
+ { 199, 7, 148, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nama/Latin/Namibia
+ { 200, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Machame/Latin/Tanzania
+ { 201, 7, 82, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Colognian/Latin/Germany
+ { 202, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Masai/Latin/Kenya
+ { 202, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Masai/Latin/Tanzania
+ { 203, 7, 221, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Soga/Latin/Uganda
+ { 204, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Luyia/Latin/Kenya
+ { 205, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Asu/Latin/Tanzania
+ { 206, 7, 221, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Teso/Latin/Uganda
+ { 206, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Teso/Latin/Kenya
+ { 207, 7, 67, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Saho/Latin/Eritrea
+ { 208, 7, 132, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Koyra Chiini/Latin/Mali
+ { 209, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Rwa/Latin/Tanzania
+ { 210, 7, 111, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Luo/Latin/Kenya
+ { 211, 7, 221, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chiga/Latin/Uganda
+ { 212, 7, 145, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Central Morocco Tamazight/Latin/Morocco
+ { 213, 7, 132, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Koyraboro Senni/Latin/Mali
+ { 214, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Shambala/Latin/Tanzania
+ { 215, 13, 100, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bodo/Devanagari/India
+ { 218, 2, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chechen/Cyrillic/Russia
+ { 219, 2, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Church/Cyrillic/Russia
+ { 220, 2, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chuvash/Cyrillic/Russia
+ { 230, 7, 49, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Luba Katanga/Latin/Congo Kinshasa
+ { 231, 7, 125, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Luxembourgish/Latin/Luxembourg
+ { 236, 7, 21, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Walloon/Latin/Belgium
+ { 237, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Aghem/Latin/Cameroon
+ { 238, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Basaa/Latin/Cameroon
+ { 239, 7, 156, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Zarma/Latin/Niger
+ { 240, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Duala/Latin/Cameroon
+ { 241, 7, 187, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Jola Fonyi/Latin/Senegal
+ { 242, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ewondo/Latin/Cameroon
+ { 243, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Bafia/Latin/Cameroon
+ { 244, 7, 146, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Makhuwa Meetto/Latin/Mozambique
+ { 245, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mundang/Latin/Cameroon
+ { 246, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kwasio/Latin/Cameroon
+ { 247, 7, 254, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nuer/Latin/South Sudan
+ { 248, 2, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sakha/Cyrillic/Russia
+ { 249, 7, 210, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sangu/Latin/Tanzania
+ { 251, 7, 156, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tasawaq/Latin/Niger
+ { 252, 35, 121, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Vai/Vai/Liberia
+ { 252, 7, 121, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Vai/Latin/Liberia
+ { 253, 7, 206, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Walser/Latin/Switzerland
+ { 254, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Yangben/Latin/Cameroon
+ { 256, 7, 197, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Asturian/Latin/Spain
+ { 257, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ngomba/Latin/Cameroon
+ { 258, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kako/Latin/Cameroon
+ { 259, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Meta/Latin/Cameroon
+ { 260, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ngiemboon/Latin/Cameroon
+ { 261, 7, 197, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Aragonese/Latin/Spain
+ { 272, 46, 18, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chakma/Chakma/Bangladesh
+ { 272, 46, 100, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chakma/Chakma/India
+ { 290, 11, 100, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Manipuri/Bengali/India
+ { 309, 100, 232, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Tai Dam/Tai Viet/Vietnam
+ { 312, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Akoose/Latin/Cameroon
+ { 313, 7, 225, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lakota/Latin/United States
+ { 314, 9, 145, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Standard Moroccan Tamazight/Tifinagh/Morocco
+ { 315, 7, 43, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mapuche/Latin/Chile
+ { 316, 1, 103, 4412, 4412, 4412, 4412, 153, 153,101,101,101,101, 26, 26 },// Central Kurdish/Arabic/Iraq
+ { 316, 1, 102, 4412, 4412, 4412, 4412, 153, 153,101,101,101,101, 26, 26 },// Central Kurdish/Arabic/Iran
+ { 317, 7, 82, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lower Sorbian/Latin/Germany
+ { 318, 7, 82, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Upper Sorbian/Latin/Germany
+ { 319, 7, 37, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kenyang/Latin/Cameroon
+ { 320, 7, 38, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mohawk/Latin/Canada
+ { 321, 75, 91, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Nko/Nko/Guinea
+ { 322, 7, 260, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Prussian/Latin/World
+ { 323, 7, 90, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Kiche/Latin/Guatemala
+ { 324, 7, 205, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Southern Sami/Latin/Sweden
+ { 325, 7, 205, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lule Sami/Latin/Sweden
+ { 326, 7, 73, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Inari Sami/Latin/Finland
+ { 327, 7, 73, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Skolt Sami/Latin/Finland
+ { 328, 7, 13, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Warlpiri/Latin/Australia
+ { 346, 1, 102, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Mazanderani/Arabic/Iran
+ { 349, 1, 102, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Northern Luri/Arabic/Iran
+ { 349, 1, 103, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Northern Luri/Arabic/Iraq
+ { 357, 6, 97, 484, 484, 484, 484, 153, 153, 38, 38, 38, 38, 26, 26 },// Cantonese/Traditional Han/Hong Kong
+ { 357, 5, 44, 484, 484, 484, 484, 153, 153, 38, 38, 38, 38, 26, 26 },// Cantonese/Simplified Han/China
+ { 358, 138, 225, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Osage/Osage/United States
+ { 360, 7, 260, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Ido/Latin/World
+ { 361, 7, 260, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Lojban/Latin/World
+ { 362, 7, 106, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Sicilian/Latin/Italy
+ { 363, 1, 102, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Southern Kurdish/Arabic/Iran
+ { 364, 1, 163, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Western Balochi/Arabic/Pakistan
+ { 365, 7, 170, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Cebuano/Latin/Philippines
+ { 366, 2, 178, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Erzya/Cyrillic/Russia
+ { 367, 7, 225, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Chickasaw/Latin/United States
+ { 368, 7, 225, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Muscogee/Latin/United States
+ { 369, 7, 172, 0, 0, 0, 0, 153, 153, 83, 83, 83, 83, 26, 26 },// Silesian/Latin/Poland
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },// trailing zeros
};
-static const ushort months_data[] = {
-0x46, 0x61, 0x72, 0x3b, 0x4f, 0x72, 0x64, 0x3b, 0x4b, 0x68, 0x6f, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x3b,
-0x53, 0x68, 0x61, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x41, 0x62, 0x61, 0x3b, 0x41, 0x7a, 0x61, 0x3b, 0x44, 0x65, 0x79, 0x3b,
-0x42, 0x61, 0x68, 0x3b, 0x45, 0x73, 0x66, 0x3b, 0x46, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72,
-0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68, 0x74, 0x3b, 0x4b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69,
-0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x53, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x4d,
-0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61,
-0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x3b, 0x46, 0x3b, 0x4f, 0x3b, 0x4b, 0x3b, 0x54, 0x3b,
-0x4d, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x31, 0x3b, 0x32, 0x3b,
-0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b,
-0x31, 0x32, 0x3b, 0x31, 0x33, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38,
-0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0x641, 0x631, 0x641, 0x631, 0x62f, 0x646, 0x3b, 0x623,
-0x630, 0x631, 0x628, 0x64a, 0x647, 0x634, 0x62a, 0x3b, 0x62e, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x62a, 0x627, 0x631, 0x3b, 0x645, 0x631,
-0x62f, 0x627, 0x62f, 0x3b, 0x634, 0x647, 0x631, 0x641, 0x627, 0x631, 0x3b, 0x645, 0x647, 0x631, 0x3b, 0x622, 0x64a, 0x627, 0x646, 0x3b,
-0x622, 0x630, 0x631, 0x3b, 0x62f, 0x64a, 0x3b, 0x628, 0x647, 0x645, 0x646, 0x3b, 0x627, 0x633, 0x641, 0x646, 0x62f, 0x627, 0x631, 0x3b,
-0x9ab, 0x9cd, 0x9af, 0x9be, 0x9ad, 0x9be, 0x9b0, 0x9cd, 0x9a1, 0x9bf, 0x9a8, 0x3b, 0x985, 0x9b0, 0x9a1, 0x9bf, 0x9ac, 0x9c7, 0x9b9, 0x9c7,
-0x9b6, 0x9cd, 0x9a4, 0x3b, 0x996, 0x9cb, 0x9b0, 0x9cd, 0x9a6, 0x9cd, 0x9a6, 0x3b, 0x9a4, 0x9c0, 0x9b0, 0x3b, 0x9ae, 0x9b0, 0x9cd, 0x9af,
-0x9be, 0x9a6, 0x3b, 0x9b6, 0x9be, 0x9b9, 0x9b0, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x9c7, 0x9b9, 0x9c7, 0x9b0, 0x3b, 0x986, 0x9ac,
-0x9be, 0x9a8, 0x3b, 0x986, 0x99c, 0x9be, 0x9b0, 0x3b, 0x9a6, 0x9c7, 0x3b, 0x9ac, 0x9be, 0x9b9, 0x9ae, 0x9be, 0x9a8, 0x3b, 0x98f, 0x9b8,
-0x9ab, 0x9cd, 0x9af, 0x9be, 0x9a8, 0x9cd, 0x9a1, 0x3b, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9ad, 0x9be, 0x9b0, 0x9cd, 0x9a1, 0x9bf, 0x9a8, 0x3b,
-0x985, 0x9b0, 0x9a1, 0x9bf, 0x9ac, 0x9c7, 0x9b9, 0x9c7, 0x9b6, 0x9cd, 0x9a4, 0x3b, 0x996, 0x9cb, 0x9b0, 0x9cd, 0x9a6, 0x9cd, 0x9a6, 0x3b,
-0x9a4, 0x9c0, 0x9b0, 0x3b, 0x9ae, 0x9b0, 0x9cd, 0x9af, 0x9be, 0x9a6, 0x3b, 0x9b6, 0x9be, 0x9b9, 0x9b0, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b,
-0x9ae, 0x9c7, 0x9b9, 0x9c7, 0x9b0, 0x3b, 0x986, 0x9ac, 0x9be, 0x9a8, 0x3b, 0x9ac, 0x9be, 0x99c, 0x9be, 0x9b0, 0x3b, 0x9a6, 0x9c7, 0x3b,
-0x9ac, 0x9be, 0x9b9, 0x9ae, 0x9be, 0x9a8, 0x3b, 0x98f, 0x9b8, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9a8, 0x9cd, 0x9a1, 0x3b, 0x9e7, 0x3b, 0x9e8,
-0x3b, 0x9e9, 0x3b, 0x9ea, 0x3b, 0x9eb, 0x3b, 0x9ec, 0x3b, 0x9ed, 0x3b, 0x9ee, 0x3b, 0x9ef, 0x3b, 0x9e7, 0x9e6, 0x3b, 0x9e7, 0x9e7,
-0x3b, 0x9e7, 0x9e8, 0x3b, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35, 0x6708, 0x3b, 0x36,
+static const char16_t months_data[] = {
+0x46, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68,
+0x74, 0x3b, 0x4b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x61, 0x64,
+0x3b, 0x53, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e,
+0x3b, 0x41, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66,
+0x61, 0x6e, 0x64, 0x46, 0x61, 0x72, 0x3b, 0x4f, 0x72, 0x64, 0x3b, 0x4b, 0x68, 0x6f, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d,
+0x6f, 0x72, 0x3b, 0x53, 0x68, 0x61, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x41, 0x62, 0x61, 0x3b, 0x41, 0x7a, 0x61, 0x3b, 0x44,
+0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x3b, 0x45, 0x73, 0x66, 0x46, 0x3b, 0x4f, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x4d, 0x3b,
+0x53, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x45, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34,
+0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x641,
+0x631, 0x641, 0x631, 0x62f, 0x646, 0x3b, 0x623, 0x630, 0x631, 0x628, 0x64a, 0x647, 0x634, 0x62a, 0x3b, 0x62e, 0x631, 0x62f, 0x627, 0x62f,
+0x3b, 0x62a, 0x627, 0x631, 0x3b, 0x645, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x634, 0x647, 0x631, 0x641, 0x627, 0x631, 0x3b, 0x645, 0x647,
+0x631, 0x3b, 0x622, 0x64a, 0x627, 0x646, 0x3b, 0x622, 0x630, 0x631, 0x3b, 0x62f, 0x64a, 0x3b, 0x628, 0x647, 0x645, 0x646, 0x3b, 0x627,
+0x633, 0x641, 0x646, 0x62f, 0x627, 0x631, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9ad, 0x9be, 0x9b0, 0x9cd, 0x9a1, 0x9bf, 0x9a8, 0x3b, 0x985, 0x9b0,
+0x9a1, 0x9bf, 0x9ac, 0x9c7, 0x9b9, 0x9c7, 0x9b6, 0x9cd, 0x9a4, 0x3b, 0x996, 0x9cb, 0x9b0, 0x9cd, 0x9a6, 0x9cd, 0x9a6, 0x3b, 0x9a4, 0x9c0,
+0x9b0, 0x3b, 0x9ae, 0x9b0, 0x9cd, 0x9af, 0x9be, 0x9a6, 0x3b, 0x9b6, 0x9be, 0x9b9, 0x9b0, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x9c7,
+0x9b9, 0x9c7, 0x9b0, 0x3b, 0x986, 0x9ac, 0x9be, 0x9a8, 0x3b, 0x9ac, 0x9be, 0x99c, 0x9be, 0x9b0, 0x3b, 0x9a6, 0x9c7, 0x3b, 0x9ac, 0x9be,
+0x9b9, 0x9ae, 0x9be, 0x9a8, 0x3b, 0x98f, 0x9b8, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9a8, 0x9cd, 0x9a1, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9ad, 0x9be,
+0x9b0, 0x9cd, 0x9a1, 0x9bf, 0x9a8, 0x3b, 0x985, 0x9b0, 0x9a1, 0x9bf, 0x9ac, 0x9c7, 0x9b9, 0x9c7, 0x9b6, 0x9cd, 0x9a4, 0x3b, 0x996, 0x9cb,
+0x9b0, 0x9cd, 0x9a6, 0x9cd, 0x9a6, 0x3b, 0x9a4, 0x9c0, 0x9b0, 0x3b, 0x9ae, 0x9b0, 0x9cd, 0x9af, 0x9be, 0x9a6, 0x3b, 0x9b6, 0x9be, 0x9b9,
+0x9b0, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x9c7, 0x9b9, 0x9c7, 0x9b0, 0x3b, 0x986, 0x9ac, 0x9be, 0x9a8, 0x3b, 0x986, 0x99c, 0x9be,
+0x9b0, 0x3b, 0x9a6, 0x9c7, 0x3b, 0x9ac, 0x9be, 0x9b9, 0x9ae, 0x9be, 0x9a8, 0x3b, 0x98f, 0x9b8, 0x9ab, 0x9cd, 0x9af, 0x9be, 0x9a8, 0x9cd,
+0x9a1, 0x9e7, 0x3b, 0x9e8, 0x3b, 0x9e9, 0x3b, 0x9ea, 0x3b, 0x9eb, 0x3b, 0x9ec, 0x3b, 0x9ed, 0x3b, 0x9ee, 0x3b, 0x9ef, 0x3b, 0x9e7,
+0x9e6, 0x3b, 0x9e7, 0x9e7, 0x3b, 0x9e7, 0x9e8, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708, 0x3b, 0x56db, 0x6708, 0x3b, 0x4e94,
+0x6708, 0x3b, 0x516d, 0x6708, 0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708, 0x3b, 0x5341, 0x4e00, 0x6708,
+0x3b, 0x5341, 0x4e8c, 0x6708, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35, 0x6708, 0x3b, 0x36,
0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30, 0x6708, 0x3b, 0x31, 0x31, 0x6708, 0x3b, 0x31,
-0x32, 0x6708, 0x3b, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708, 0x3b, 0x56db, 0x6708, 0x3b, 0x4e94, 0x6708, 0x3b, 0x516d, 0x6708,
-0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708, 0x3b, 0x5341, 0x4e00, 0x6708, 0x3b, 0x5341, 0x4e8c, 0x6708,
-0x3b, 0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e, 0x3b, 0x37,
-0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e, 0x3b,
+0x32, 0x6708, 0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e, 0x3b,
+0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e,
0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74,
0x3b, 0x63, 0x68, 0x6f, 0x72, 0x64, 0xe1, 0x64, 0x3b, 0x74, 0xed, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0xe1, 0x64, 0x3b,
0x161, 0x61, 0x68, 0x72, 0xed, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0xe1, 0x62, 0xe1, 0x6e, 0x3b, 0xe1,
0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x69, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e,
-0x64, 0x3b, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65,
-0x73, 0x68, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64,
-0x61, 0x64, 0x3b, 0x73, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x61, 0x62,
-0x61, 0x6e, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65,
-0x73, 0x66, 0x61, 0x6e, 0x64, 0x3b, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69,
-0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d,
-0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b,
-0x61, 0x62, 0x61, 0x6e, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e,
-0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x3b, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x6b, 0x75, 0x75,
-0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x6b, 0x75, 0x75, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64,
-0x61, 0x64, 0x6b, 0x75, 0x75, 0x3b, 0x74, 0x69, 0x72, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x6b,
-0x75, 0x75, 0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x6b,
-0x75, 0x75, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x6b, 0x75, 0x75, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6b, 0x75, 0x75, 0x3b, 0x64,
-0x65, 0x79, 0x6b, 0x75, 0x75, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x6b, 0x75, 0x75, 0x3b, 0x65, 0x73, 0x66, 0x61,
-0x6e, 0x64, 0x6b, 0x75, 0x75, 0x3b, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x6b, 0x75, 0x75, 0x74, 0x61,
-0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6b, 0x68, 0x6f,
-0x72, 0x64, 0x61, 0x64, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x74, 0x69, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d,
-0x6f, 0x72, 0x64, 0x61, 0x64, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x6b,
-0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x6b,
-0x75, 0x75, 0x74, 0x61, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x64, 0x65, 0x79, 0x6b, 0x75,
-0x75, 0x74, 0x61, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x65, 0x73, 0x66, 0x61,
-0x6e, 0x64, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x66, 0x61, 0x72, 0x2e, 0x3b, 0x6f, 0x72, 0x64, 0x2e, 0x3b, 0x6b, 0x68,
-0x6f, 0x2e, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x2e, 0x3b, 0x161, 0x61, 0x68, 0x2e, 0x3b, 0x6d, 0x65, 0x68,
-0x72, 0x3b, 0xe2, 0x62, 0xe2, 0x6e, 0x3b, 0xe2, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x2e,
-0x3b, 0x65, 0x73, 0x66, 0x2e, 0x3b, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69,
-0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0xe2, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d,
-0x6f, 0x72, 0x64, 0xe2, 0x64, 0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b,
-0xe2, 0x62, 0xe2, 0x6e, 0x3b, 0xe2, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e,
-0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x3b, 0x46, 0x61, 0x72, 0x2e, 0x3b, 0x4f, 0x72, 0x64, 0x2e, 0x3b, 0x4b, 0x68,
-0x6f, 0x2e, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x2e, 0x3b, 0x160, 0x61, 0x68, 0x2e, 0x3b, 0x4d, 0x65, 0x68,
-0x72, 0x3b, 0xc2, 0x62, 0xe2, 0x2e, 0x3b, 0xc2, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x2e,
-0x3b, 0x45, 0x73, 0x66, 0x2e, 0x3b, 0x46, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69,
-0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x4b, 0x68, 0x6f, 0x72, 0x64, 0xe2, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d,
-0x6f, 0x72, 0x64, 0xe2, 0x64, 0x3b, 0x160, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b,
-0xc2, 0x62, 0xe2, 0x6e, 0x3b, 0xc2, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e,
-0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x3b, 0x10e4, 0x10d0, 0x10e0, 0x10d5, 0x10d0, 0x10e0, 0x10d3, 0x10d8, 0x10dc, 0x10d8, 0x3b, 0x10dd,
-0x10e0, 0x10d3, 0x10d8, 0x10d1, 0x10d4, 0x10f0, 0x10d4, 0x10e8, 0x10d7, 0x10d8, 0x3b, 0x10ee, 0x10dd, 0x10e0, 0x10d3, 0x10d0, 0x10d3, 0x10d8, 0x3b, 0x10d7,
-0x10d8, 0x10e0, 0x10d8, 0x3b, 0x10db, 0x10dd, 0x10e0, 0x10d3, 0x10d0, 0x10d3, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10f0, 0x10e0, 0x10d8, 0x10d5, 0x10d0, 0x10e0,
-0x10d8, 0x3b, 0x10db, 0x10d4, 0x10f0, 0x10e0, 0x10d8, 0x3b, 0x10d0, 0x10d1, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10d0, 0x10d6, 0x10d0, 0x10e0, 0x10d8, 0x3b,
-0x10d3, 0x10d4, 0x10d8, 0x3b, 0x10d1, 0x10d0, 0x10f0, 0x10db, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10d4, 0x10e1, 0x10e4, 0x10d0, 0x10dc, 0x10d3, 0x10d8, 0x3b,
-0x46, 0x61, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x63,
-0x68, 0x74, 0x3b, 0x43, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x101,
-0x64, 0x3b, 0x53, 0x63, 0x68, 0x61, 0x68, 0x72, 0x69, 0x77, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x100, 0x62,
-0x101, 0x6e, 0x3b, 0x100, 0x73, 0x61, 0x72, 0x3b, 0x44, 0xe9, 0x69, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45,
-0x73, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x3b, 0xaab, 0xabe, 0xab0, 0xacd, 0xab5, 0xabe, 0xab0, 0xacd, 0xaa6, 0xabf, 0xaa8, 0x3b, 0xa93,
-0xab0, 0xaa1, 0xac0, 0xaac, 0xac7, 0xab9, 0xac7, 0xab6, 0xacd, 0xa9f, 0x3b, 0xa96, 0xacb, 0xab0, 0xaa6, 0xabe, 0xaa6, 0x3b, 0xaa4, 0xabf,
-0xab0, 0x3b, 0xaae, 0xacb, 0xab0, 0xacd, 0xaa6, 0xabe, 0xaa6, 0x3b, 0xab6, 0xabe, 0xab9, 0xab0, 0xabf, 0xab5, 0xab0, 0x3b, 0xaae, 0xac7,
-0xab9, 0xab0, 0x3b, 0xa85, 0xaac, 0xabe, 0xaa8, 0x3b, 0xa85, 0xa9d, 0xabe, 0xab0, 0x3b, 0xaa1, 0xac7, 0xaaf, 0x3b, 0xaac, 0xabe, 0xab9,
-0xaae, 0xac7, 0xaa8, 0x3b, 0xa8f, 0xab8, 0xacd, 0xaab, 0xabe, 0xaa8, 0xacd, 0xaa1, 0x3b, 0x5e4, 0x5e8, 0x5d5, 0x5e8, 0x5d3, 0x5d9, 0x5df,
-0x3b, 0x5d0, 0x5e8, 0x5d3, 0x5d9, 0x5d1, 0x5d4, 0x5e9, 0x5ea, 0x3b, 0x5d7, 0x5f3, 0x5e8, 0x5d3, 0x5d0, 0x5d3, 0x3b, 0x5ea, 0x5d9, 0x5e8,
-0x3b, 0x5de, 0x5e8, 0x5d3, 0x5d0, 0x5d3, 0x3b, 0x5e9, 0x5d4, 0x5e8, 0x5d9, 0x5d5, 0x5e8, 0x3b, 0x5de, 0x5d4, 0x5e8, 0x3b, 0x5d0, 0x5d1,
-0x5d0, 0x5df, 0x3b, 0x5d0, 0x5d3, 0x5f3, 0x5e8, 0x3b, 0x5d3, 0x5d9, 0x3b, 0x5d1, 0x5d4, 0x5de, 0x5df, 0x3b, 0x5d0, 0x5e1, 0x5e4, 0x5e0,
-0x5d3, 0x3b, 0x92b, 0x930, 0x94d, 0x935, 0x93e, 0x926, 0x93f, 0x928, 0x3b, 0x913, 0x930, 0x94d, 0x926, 0x93f, 0x935, 0x947, 0x939, 0x947,
-0x938, 0x94d, 0x91f, 0x3b, 0x916, 0x94b, 0x930, 0x930, 0x94d, 0x926, 0x93e, 0x926, 0x3b, 0x91f, 0x93f, 0x930, 0x3b, 0x92e, 0x94b, 0x930,
-0x926, 0x93e, 0x926, 0x3b, 0x936, 0x93e, 0x939, 0x930, 0x940, 0x935, 0x930, 0x94d, 0x3b, 0x92e, 0x947, 0x939, 0x930, 0x3b, 0x905, 0x935,
-0x928, 0x3b, 0x905, 0x91c, 0x93c, 0x930, 0x3b, 0x921, 0x947, 0x3b, 0x92c, 0x939, 0x92e, 0x928, 0x3b, 0x908, 0x938, 0x94d, 0x92b, 0x928,
-0x94d, 0x926, 0x94d, 0x3b, 0x30d5, 0x30a1, 0x30eb, 0x30f4, 0x30a1, 0x30eb, 0x30c7, 0x30a3, 0x30fc, 0x30f3, 0x3b, 0x30aa, 0x30eb, 0x30c7, 0x30a3, 0x30fc,
-0x30d9, 0x30d8, 0x30b7, 0x30e5, 0x30c8, 0x3b, 0x30db, 0x30eb, 0x30c0, 0x30fc, 0x30c9, 0x3b, 0x30c6, 0x30a3, 0x30fc, 0x30eb, 0x3b, 0x30e2, 0x30eb, 0x30c0,
-0x30fc, 0x30c9, 0x3b, 0x30b7, 0x30e3, 0x30cf, 0x30ea, 0x30fc, 0x30f4, 0x30a1, 0x30eb, 0x3b, 0x30e1, 0x30d5, 0x30eb, 0x3b, 0x30a2, 0x30fc, 0x30d0, 0x30fc,
-0x30f3, 0x3b, 0x30a2, 0x30fc, 0x30b6, 0x30eb, 0x3b, 0x30c7, 0x30a4, 0x3b, 0x30d0, 0x30d5, 0x30de, 0x30f3, 0x3b, 0x30a8, 0x30b9, 0x30d5, 0x30a1, 0x30f3,
-0x30c9, 0x3b, 0xcab, 0xcb0, 0xccd, 0xcb5, 0xcb0, 0xccd, 0xca6, 0xcbf, 0xca8, 0xccd, 0x3b, 0xc93, 0xcb0, 0xccd, 0xca6, 0xcbf, 0xcac, 0xcc6,
-0xcb9, 0xcc6, 0xcb6, 0xccd, 0xc9f, 0xccd, 0x3b, 0xc96, 0xccb, 0xcb0, 0xccd, 0xca1, 0xcbe, 0xca6, 0xccd, 0x3b, 0xc9f, 0xcbf, 0xcb0, 0xccd,
-0x3b, 0xcae, 0xcca, 0xcb0, 0xccd, 0xca6, 0xcbe, 0xca6, 0xccd, 0x3b, 0xcb6, 0xcb9, 0xcb0, 0xcbf, 0xcb5, 0xcbe, 0xcb0, 0xccd, 0x3b, 0xcae,
-0xcc6, 0xcb9, 0xccd, 0xcb0, 0xccd, 0x3b, 0xc85, 0xcac, 0xca8, 0xccd, 0x3b, 0xc85, 0xc9d, 0xcb0, 0xccd, 0x3b, 0xca1, 0xcc7, 0x3b, 0xcac,
-0xcb9, 0xccd, 0xcae, 0xca8, 0xccd, 0x3b, 0xc8e, 0xcb8, 0xccd, 0xcab, 0xcbe, 0xc82, 0xca1, 0xccd, 0x3b, 0xd654, 0xb974, 0xbc14, 0xb518, 0x3b,
-0xc624, 0xb974, 0xb514, 0xbca0, 0xd5e4, 0xc26c, 0xd2b8, 0x3b, 0xd638, 0xb974, 0xb2e4, 0xb4dc, 0x3b, 0xd2f0, 0xb974, 0x3b, 0xbaa8, 0xb974, 0xb2e4, 0xb4dc,
-0x3b, 0xc0e4, 0xd750, 0xb9ac, 0xbc14, 0xb974, 0x3b, 0xba54, 0xd750, 0xb974, 0x3b, 0xc544, 0xbc18, 0x3b, 0xc544, 0xc790, 0xb974, 0x3b, 0xb2e4, 0xc774,
-0x3b, 0xbc14, 0xd750, 0xb9cc, 0x3b, 0xc5d0, 0xc2a4, 0xd310, 0xb4dc, 0x3b, 0xe9f, 0xea3, 0xeb2, 0xea7, 0xeb2, 0xe94, 0xeb4, 0xe99, 0x3b, 0xead,
-0xecd, 0xea3, 0xe94, 0xeb5, 0xe9a, 0xeb5, 0xec0, 0xeab, 0xeae, 0xe94, 0x3b, 0xe84, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xec1, 0xe95,
-0xea3, 0x3b, 0xea1, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3, 0xea5, 0xeb4, 0xea7, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeb5,
-0x3b, 0xead, 0xeb2, 0xe9a, 0xeb2, 0xe99, 0x3b, 0xead, 0xeb2, 0xe8a, 0xeb2, 0x3b, 0xe94, 0xeb5, 0xea3, 0x3b, 0xe9a, 0xea3, 0xeb2, 0xea1,
-0xeb2, 0xe99, 0x3b, 0xec0, 0xead, 0xeaa, 0xe9f, 0xeb2, 0xe99, 0x3b, 0xe9f, 0xea3, 0xeb2, 0xea7, 0xeb2, 0xe94, 0xeb4, 0xe99, 0x3b, 0xead,
-0xecd, 0xea3, 0xe94, 0xeb5, 0xe9a, 0xeb5, 0xec0, 0xeab, 0xea3, 0xe94, 0x3b, 0xe84, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xec1, 0xe95,
-0xea3, 0x3b, 0xea1, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3, 0xeab, 0xeb4, 0xea7, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeb5,
-0x3b, 0xead, 0xeb2, 0xe9a, 0xeb2, 0xe99, 0x3b, 0xead, 0xeb2, 0xe8a, 0xeb2, 0xea3, 0x3b, 0xe94, 0xeb5, 0xea3, 0x3b, 0xe9a, 0xea3, 0xeb2,
-0xec1, 0xea1, 0xe99, 0x3b, 0xec0, 0xead, 0xeaa, 0xe9f, 0xeb2, 0xe99, 0x3b, 0xe9f, 0xeb2, 0xea3, 0xea7, 0xeb2, 0xe94, 0xeb4, 0xe99, 0x3b,
-0xead, 0xecd, 0xea3, 0xe94, 0xeb5, 0xe9a, 0xeb5, 0xec0, 0xeab, 0xea3, 0xe94, 0x3b, 0xe84, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xec1,
-0xe95, 0xea3, 0x3b, 0xea1, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3, 0xeab, 0xeb4, 0xea7, 0xeb2, 0x3b, 0xec0, 0xea1,
-0xeb5, 0x3b, 0xead, 0xeb2, 0xe9a, 0xeb2, 0xe99, 0x3b, 0xead, 0xeb2, 0xe8a, 0xeb2, 0x3b, 0xe94, 0xeb5, 0xea3, 0x3b, 0xe9a, 0xea3, 0xeb2,
-0xea1, 0xeb2, 0xe99, 0x3b, 0xec0, 0xead, 0xeaa, 0xe9f, 0xeb2, 0xe99, 0x3b, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x12b, 0x6e,
+0x64, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73,
+0x68, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x61,
+0x64, 0x3b, 0x73, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x61, 0x62, 0x61,
+0x6e, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65, 0x73,
+0x66, 0x61, 0x6e, 0x64, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x6b, 0x75, 0x75, 0x3b, 0x6f, 0x72, 0x64,
+0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x6b, 0x75, 0x75, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x6b, 0x75,
+0x75, 0x3b, 0x74, 0x69, 0x72, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x6b, 0x75, 0x75, 0x3b, 0x161,
+0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x6b, 0x75, 0x75, 0x3b, 0x61,
+0x62, 0x61, 0x6e, 0x6b, 0x75, 0x75, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6b, 0x75, 0x75, 0x3b, 0x64, 0x65, 0x79, 0x6b, 0x75,
+0x75, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x6b, 0x75, 0x75, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x6b, 0x75,
+0x75, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6f, 0x72, 0x64, 0x69,
+0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x6b,
+0x75, 0x75, 0x74, 0x61, 0x3b, 0x74, 0x69, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x61, 0x64,
+0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b,
+0x6d, 0x65, 0x68, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b,
+0x61, 0x7a, 0x61, 0x72, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x64, 0x65, 0x79, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x62,
+0x61, 0x68, 0x6d, 0x61, 0x6e, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x65, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x6b, 0x75, 0x75,
+0x74, 0x61, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65,
+0x161, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x61,
+0x64, 0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x61, 0x62, 0x61, 0x6e,
+0x3b, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65, 0x73, 0x66,
+0x61, 0x6e, 0x64, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68,
+0x65, 0x161, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0xe2, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64,
+0xe2, 0x64, 0x3b, 0x161, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0xe2, 0x62, 0xe2,
+0x6e, 0x3b, 0xe2, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65, 0x73,
+0x66, 0x61, 0x6e, 0x64, 0x66, 0x61, 0x72, 0x2e, 0x3b, 0x6f, 0x72, 0x64, 0x2e, 0x3b, 0x6b, 0x68, 0x6f, 0x2e, 0x3b, 0x74,
+0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x2e, 0x3b, 0x161, 0x61, 0x68, 0x2e, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0xe2, 0x62,
+0xe2, 0x6e, 0x3b, 0xe2, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x2e, 0x3b, 0x65, 0x73, 0x66,
+0x2e, 0x46, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161,
+0x74, 0x3b, 0x4b, 0x68, 0x6f, 0x72, 0x64, 0xe2, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0xe2, 0x64,
+0x3b, 0x160, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0xc2, 0x62, 0xe2, 0x6e, 0x3b,
+0xc2, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61,
+0x6e, 0x64, 0x46, 0x61, 0x72, 0x2e, 0x3b, 0x4f, 0x72, 0x64, 0x2e, 0x3b, 0x4b, 0x68, 0x6f, 0x2e, 0x3b, 0x54, 0x69, 0x72,
+0x3b, 0x4d, 0x6f, 0x72, 0x2e, 0x3b, 0x160, 0x61, 0x68, 0x2e, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0xc2, 0x62, 0xe2, 0x2e,
+0x3b, 0xc2, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x2e, 0x3b, 0x45, 0x73, 0x66, 0x2e, 0x10e4,
+0x10d0, 0x10e0, 0x10d5, 0x10d0, 0x10e0, 0x10d3, 0x10d8, 0x10dc, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10d3, 0x10d8, 0x10d1, 0x10d4, 0x10f0, 0x10d4, 0x10e8, 0x10d7,
+0x10d8, 0x3b, 0x10ee, 0x10dd, 0x10e0, 0x10d3, 0x10d0, 0x10d3, 0x10d8, 0x3b, 0x10d7, 0x10d8, 0x10e0, 0x10d8, 0x3b, 0x10db, 0x10dd, 0x10e0, 0x10d3, 0x10d0,
+0x10d3, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10f0, 0x10e0, 0x10d8, 0x10d5, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10db, 0x10d4, 0x10f0, 0x10e0, 0x10d8, 0x3b, 0x10d0,
+0x10d1, 0x10d0, 0x10dc, 0x10d8, 0x3b, 0x10d0, 0x10d6, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d8, 0x3b, 0x10d1, 0x10d0, 0x10f0, 0x10db, 0x10d0,
+0x10dc, 0x10d8, 0x3b, 0x10d4, 0x10e1, 0x10e4, 0x10d0, 0x10dc, 0x10d3, 0x10d8, 0x46, 0x61, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b,
+0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x63, 0x68, 0x74, 0x3b, 0x43, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64,
+0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x53, 0x63, 0x68, 0x61, 0x68, 0x72, 0x69, 0x77,
+0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x100, 0x62, 0x101, 0x6e, 0x3b, 0x100, 0x73, 0x61, 0x72, 0x3b, 0x44, 0xe9,
+0x69, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x73, 0x66, 0x61, 0x6e, 0x64, 0xaab, 0xabe, 0xab0, 0xacd,
+0xab5, 0xabe, 0xab0, 0xacd, 0xaa6, 0xabf, 0xaa8, 0x3b, 0xa93, 0xab0, 0xaa1, 0xac0, 0xaac, 0xac7, 0xab9, 0xac7, 0xab6, 0xacd, 0xa9f, 0x3b,
+0xa96, 0xacb, 0xab0, 0xaa6, 0xabe, 0xaa6, 0x3b, 0xaa4, 0xabf, 0xab0, 0x3b, 0xaae, 0xacb, 0xab0, 0xacd, 0xaa6, 0xabe, 0xaa6, 0x3b, 0xab6,
+0xabe, 0xab9, 0xab0, 0xabf, 0xab5, 0xab0, 0x3b, 0xaae, 0xac7, 0xab9, 0xab0, 0x3b, 0xa85, 0xaac, 0xabe, 0xaa8, 0x3b, 0xa85, 0xa9d, 0xabe,
+0xab0, 0x3b, 0xaa1, 0xac7, 0xaaf, 0x3b, 0xaac, 0xabe, 0xab9, 0xaae, 0xac7, 0xaa8, 0x3b, 0xa8f, 0xab8, 0xacd, 0xaab, 0xabe, 0xaa8, 0xacd,
+0xaa1, 0x5e4, 0x5e8, 0x5d5, 0x5e8, 0x5d3, 0x5d9, 0x5df, 0x3b, 0x5d0, 0x5e8, 0x5d3, 0x5d9, 0x5d1, 0x5d4, 0x5e9, 0x5ea, 0x3b, 0x5d7, 0x5f3,
+0x5e8, 0x5d3, 0x5d0, 0x5d3, 0x3b, 0x5ea, 0x5d9, 0x5e8, 0x3b, 0x5de, 0x5e8, 0x5d3, 0x5d0, 0x5d3, 0x3b, 0x5e9, 0x5d4, 0x5e8, 0x5d9, 0x5d5,
+0x5e8, 0x3b, 0x5de, 0x5d4, 0x5e8, 0x3b, 0x5d0, 0x5d1, 0x5d0, 0x5df, 0x3b, 0x5d0, 0x5d3, 0x5f3, 0x5e8, 0x3b, 0x5d3, 0x5d9, 0x3b, 0x5d1,
+0x5d4, 0x5de, 0x5df, 0x3b, 0x5d0, 0x5e1, 0x5e4, 0x5e0, 0x5d3, 0x92b, 0x930, 0x94d, 0x935, 0x93e, 0x926, 0x93f, 0x928, 0x3b, 0x913, 0x930,
+0x94d, 0x926, 0x93f, 0x935, 0x947, 0x939, 0x947, 0x938, 0x94d, 0x91f, 0x3b, 0x916, 0x94b, 0x930, 0x930, 0x94d, 0x926, 0x93e, 0x926, 0x3b,
+0x91f, 0x93f, 0x930, 0x3b, 0x92e, 0x94b, 0x930, 0x926, 0x93e, 0x926, 0x3b, 0x936, 0x93e, 0x939, 0x930, 0x940, 0x935, 0x930, 0x94d, 0x3b,
+0x92e, 0x947, 0x939, 0x930, 0x3b, 0x905, 0x935, 0x928, 0x3b, 0x905, 0x91c, 0x93c, 0x930, 0x3b, 0x921, 0x947, 0x3b, 0x92c, 0x939, 0x92e,
+0x928, 0x3b, 0x908, 0x938, 0x94d, 0x92b, 0x928, 0x94d, 0x926, 0x94d, 0x30d5, 0x30a1, 0x30eb, 0x30f4, 0x30a1, 0x30eb, 0x30c7, 0x30a3, 0x30fc, 0x30f3,
+0x3b, 0x30aa, 0x30eb, 0x30c7, 0x30a3, 0x30fc, 0x30d9, 0x30d8, 0x30b7, 0x30e5, 0x30c8, 0x3b, 0x30db, 0x30eb, 0x30c0, 0x30fc, 0x30c9, 0x3b, 0x30c6, 0x30a3,
+0x30fc, 0x30eb, 0x3b, 0x30e2, 0x30eb, 0x30c0, 0x30fc, 0x30c9, 0x3b, 0x30b7, 0x30e3, 0x30cf, 0x30ea, 0x30fc, 0x30f4, 0x30a1, 0x30eb, 0x3b, 0x30e1, 0x30d5,
+0x30eb, 0x3b, 0x30a2, 0x30fc, 0x30d0, 0x30fc, 0x30f3, 0x3b, 0x30a2, 0x30fc, 0x30b6, 0x30eb, 0x3b, 0x30c7, 0x30a4, 0x3b, 0x30d0, 0x30d5, 0x30de, 0x30f3,
+0x3b, 0x30a8, 0x30b9, 0x30d5, 0x30a1, 0x30f3, 0x30c9, 0xcab, 0xcb0, 0xccd, 0xcb5, 0xcb0, 0xccd, 0xca6, 0xcbf, 0xca8, 0xccd, 0x3b, 0xc93, 0xcb0,
+0xccd, 0xca6, 0xcbf, 0xcac, 0xcc6, 0xcb9, 0xcc6, 0xcb6, 0xccd, 0xc9f, 0xccd, 0x3b, 0xc96, 0xccb, 0xcb0, 0xccd, 0xca1, 0xcbe, 0xca6, 0xccd,
+0x3b, 0xc9f, 0xcbf, 0xcb0, 0xccd, 0x3b, 0xcae, 0xcca, 0xcb0, 0xccd, 0xca6, 0xcbe, 0xca6, 0xccd, 0x3b, 0xcb6, 0xcb9, 0xcb0, 0xcbf, 0xcb5,
+0xcbe, 0xcb0, 0xccd, 0x3b, 0xcae, 0xcc6, 0xcb9, 0xccd, 0xcb0, 0xccd, 0x3b, 0xc85, 0xcac, 0xca8, 0xccd, 0x3b, 0xc85, 0xc9d, 0xcb0, 0xccd,
+0x3b, 0xca1, 0xcc7, 0x3b, 0xcac, 0xcb9, 0xccd, 0xcae, 0xca8, 0xccd, 0x3b, 0xc8e, 0xcb8, 0xccd, 0xcab, 0xcbe, 0xc82, 0xca1, 0xccd, 0xd654,
+0xb974, 0xbc14, 0xb518, 0x3b, 0xc624, 0xb974, 0xb514, 0xbca0, 0xd5e4, 0xc26c, 0xd2b8, 0x3b, 0xd638, 0xb974, 0xb2e4, 0xb4dc, 0x3b, 0xd2f0, 0xb974, 0x3b,
+0xbaa8, 0xb974, 0xb2e4, 0xb4dc, 0x3b, 0xc0e4, 0xd750, 0xb9ac, 0xbc14, 0xb974, 0x3b, 0xba54, 0xd750, 0xb974, 0x3b, 0xc544, 0xbc18, 0x3b, 0xc544, 0xc790,
+0xb974, 0x3b, 0xb2e4, 0xc774, 0x3b, 0xbc14, 0xd750, 0xb9cc, 0x3b, 0xc5d0, 0xc2a4, 0xd310, 0xb4dc, 0xe9f, 0xea3, 0xeb2, 0xea7, 0xeb2, 0xe94, 0xeb4,
+0xe99, 0x3b, 0xead, 0xecd, 0xea3, 0xe94, 0xeb5, 0xe9a, 0xeb5, 0xec0, 0xeab, 0xea3, 0xe94, 0x3b, 0xe84, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94,
+0x3b, 0xec1, 0xe95, 0xea3, 0x3b, 0xea1, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3, 0xeab, 0xeb4, 0xea7, 0xeb2, 0x3b,
+0xec0, 0xea1, 0xeb5, 0x3b, 0xead, 0xeb2, 0xe9a, 0xeb2, 0xe99, 0x3b, 0xead, 0xeb2, 0xe8a, 0xeb2, 0xea3, 0x3b, 0xe94, 0xeb5, 0xea3, 0x3b,
+0xe9a, 0xea3, 0xeb2, 0xec1, 0xea1, 0xe99, 0x3b, 0xec0, 0xead, 0xeaa, 0xe9f, 0xeb2, 0xe99, 0xe9f, 0xea3, 0xeb2, 0xea7, 0xeb2, 0xe94, 0xeb4,
+0xe99, 0x3b, 0xead, 0xecd, 0xea3, 0xe94, 0xeb5, 0xe9a, 0xeb5, 0xec0, 0xeab, 0xeae, 0xe94, 0x3b, 0xe84, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94,
+0x3b, 0xec1, 0xe95, 0xea3, 0x3b, 0xea1, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3, 0xea5, 0xeb4, 0xea7, 0xeb2, 0x3b,
+0xec0, 0xea1, 0xeb5, 0x3b, 0xead, 0xeb2, 0xe9a, 0xeb2, 0xe99, 0x3b, 0xead, 0xeb2, 0xe8a, 0xeb2, 0x3b, 0xe94, 0xeb5, 0xea3, 0x3b, 0xe9a,
+0xea3, 0xeb2, 0xea1, 0xeb2, 0xe99, 0x3b, 0xec0, 0xead, 0xeaa, 0xe9f, 0xeb2, 0xe99, 0xe9f, 0xeb2, 0xea3, 0xea7, 0xeb2, 0xe94, 0xeb4, 0xe99,
+0x3b, 0xead, 0xecd, 0xea3, 0xe94, 0xeb5, 0xe9a, 0xeb5, 0xec0, 0xeab, 0xea3, 0xe94, 0x3b, 0xe84, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b,
+0xec1, 0xe95, 0xea3, 0x3b, 0xea1, 0xecd, 0xea3, 0xec0, 0xe94, 0xe94, 0x3b, 0xe8a, 0xeb2, 0xea3, 0xeab, 0xeb4, 0xea7, 0xeb2, 0x3b, 0xec0,
+0xea1, 0xeb5, 0x3b, 0xead, 0xeb2, 0xe9a, 0xeb2, 0xe99, 0x3b, 0xead, 0xeb2, 0xe8a, 0xeb2, 0x3b, 0xe94, 0xeb5, 0xea3, 0x3b, 0xe9a, 0xea3,
+0xeb2, 0xea1, 0xeb2, 0xe99, 0x3b, 0xec0, 0xead, 0xeaa, 0xe9f, 0xeb2, 0xe99, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x12b, 0x6e,
0x73, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x73, 0x3b, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64,
0x73, 0x3b, 0x74, 0x12b, 0x72, 0x73, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x73, 0x3b, 0x161, 0x61, 0x68, 0x72, 0x69,
0x76, 0x113, 0x72, 0x73, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x73, 0x3b, 0x61, 0x62, 0x61, 0x6e, 0x73, 0x3b, 0x61, 0x7a, 0x65,
0x72, 0x73, 0x3b, 0x64, 0x65, 0x6a, 0x73, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x73, 0x3b, 0x65, 0x73, 0x66, 0x61,
-0x6e, 0x64, 0x73, 0x3b, 0x444, 0x430, 0x440, 0x432, 0x430, 0x440, 0x434, 0x438, 0x43d, 0x3b, 0x43e, 0x440, 0x434, 0x438, 0x431, 0x435,
-0x445, 0x435, 0x448, 0x442, 0x3b, 0x43a, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x442, 0x438, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x434,
-0x430, 0x434, 0x3b, 0x448, 0x430, 0x445, 0x440, 0x438, 0x432, 0x430, 0x440, 0x3b, 0x43c, 0x435, 0x440, 0x3b, 0x430, 0x431, 0x430, 0x43d,
-0x3b, 0x430, 0x437, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x458, 0x3b, 0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x435, 0x441, 0x444,
-0x430, 0x43d, 0x434, 0x3b, 0xd2b, 0xd7c, 0xd35, 0xd3e, 0xd7c, 0xd26, 0xd3f, 0xd7b, 0x3b, 0xd13, 0xd7c, 0xd21, 0xd3f, 0xd2c, 0xd46, 0xd39,
-0xd46, 0xd37, 0xd4d, 0x200c, 0xd31, 0xd4d, 0xd31, 0xd4d, 0x3b, 0xd16, 0xd4b, 0xd7c, 0xd26, 0xd3e, 0xd26, 0xd4d, 0x3b, 0xd1f, 0xd3f, 0xd7c,
-0x3b, 0xd2e, 0xd4b, 0xd7c, 0xd26, 0xd3e, 0xd26, 0xd4d, 0x3b, 0xd37, 0xd39, 0xd4d, 0x200c, 0xd30, 0xd3f, 0xd35, 0xd3e, 0xd7c, 0x3b, 0xd2e,
-0xd46, 0xd39, 0xd7c, 0x3b, 0xd05, 0xd2c, 0xd3e, 0xd7b, 0x3b, 0xd05, 0xd38, 0xd7c, 0x3b, 0xd21, 0xd46, 0xd2f, 0xd4d, 0x3b, 0xd2c, 0xd39,
-0xd4d, 0x200c, 0xd2e, 0xd3e, 0xd7b, 0x3b, 0xd0e, 0xd38, 0xd4d, 0x200c, 0xd2b, 0xd3e, 0xd7b, 0xd21, 0xd4d, 0x3b, 0xd2b, 0x2e, 0x3b, 0xd13,
-0x2e, 0x3b, 0xd16, 0xd4b, 0x3b, 0xd1f, 0xd3f, 0x2e, 0x3b, 0xd2e, 0xd4b, 0x2e, 0x3b, 0xd37, 0x2e, 0x3b, 0xd2e, 0xd46, 0x2e, 0x3b,
-0xd05, 0x2e, 0x3b, 0xd05, 0x2e, 0x3b, 0xd21, 0xd46, 0x2e, 0x3b, 0xd2c, 0x2e, 0x3b, 0xd0e, 0x2e, 0x3b, 0x92b, 0x930, 0x935, 0x930,
-0x926, 0x93f, 0x928, 0x3b, 0x913, 0x930, 0x94d, 0x926, 0x93f, 0x92c, 0x947, 0x939, 0x947, 0x936, 0x94d, 0x924, 0x3b, 0x916, 0x94b, 0x930,
-0x926, 0x93e, 0x926, 0x3b, 0x924, 0x93f, 0x930, 0x3b, 0x92e, 0x94b, 0x930, 0x926, 0x93e, 0x926, 0x3b, 0x936, 0x93e, 0x939, 0x930, 0x940,
-0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x947, 0x939, 0x947, 0x930, 0x3b, 0x905, 0x92c, 0x93e, 0x928, 0x3b, 0x905, 0x91d, 0x93e, 0x930, 0x3b,
-0x926, 0x947, 0x3b, 0x92c, 0x93e, 0x939, 0x92e, 0x93e, 0x928, 0x3b, 0x90f, 0x938, 0x92b, 0x93e, 0x902, 0x926, 0x3b, 0x967, 0x3b, 0x968,
-0x3b, 0x969, 0x3b, 0x96a, 0x3b, 0x96b, 0x3b, 0x96c, 0x3b, 0x96d, 0x3b, 0x96e, 0x3b, 0x96f, 0x3b, 0x967, 0x966, 0x3b, 0x967, 0x967,
-0x3b, 0x967, 0x968, 0x3b, 0x648, 0x631, 0x6cc, 0x3b, 0x63a, 0x648, 0x6cc, 0x6cc, 0x3b, 0x63a, 0x628, 0x631, 0x6af, 0x648, 0x644, 0x6cc,
-0x3b, 0x686, 0x646, 0x6af, 0x627, 0x69a, 0x3b, 0x632, 0x645, 0x631, 0x6cc, 0x3b, 0x648, 0x696, 0x6cc, 0x3b, 0x62a, 0x644, 0x647, 0x3b,
-0x644, 0x693, 0x645, 0x3b, 0x644, 0x6cc, 0x646, 0x62f, 0x6cd, 0x3b, 0x645, 0x631, 0x63a, 0x648, 0x645, 0x6cc, 0x3b, 0x633, 0x644, 0x648,
-0x627, 0x63a, 0x647, 0x3b, 0x6a9, 0x628, 0x3b, 0x6f1, 0x3b, 0x6f2, 0x3b, 0x6f3, 0x3b, 0x6f4, 0x3b, 0x6f5, 0x3b, 0x6f6, 0x3b, 0x6f7,
-0x3b, 0x6f8, 0x3b, 0x6f9, 0x3b, 0x6f1, 0x6f0, 0x3b, 0x6f1, 0x6f1, 0x3b, 0x6f1, 0x6f2, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x62f, 0x6cc,
-0x646, 0x3b, 0x627, 0x631, 0x62f, 0x6cc, 0x628, 0x647, 0x634, 0x62a, 0x3b, 0x62e, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x62a, 0x6cc, 0x631,
-0x3b, 0x645, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x634, 0x647, 0x631, 0x6cc, 0x648, 0x631, 0x3b, 0x645, 0x647, 0x631, 0x3b, 0x622, 0x628,
-0x627, 0x646, 0x3b, 0x622, 0x630, 0x631, 0x3b, 0x62f, 0x6cc, 0x3b, 0x628, 0x647, 0x645, 0x646, 0x3b, 0x627, 0x633, 0x641, 0x646, 0x62f,
-0x3b, 0x641, 0x3b, 0x627, 0x3b, 0x62e, 0x3b, 0x62a, 0x3b, 0x645, 0x3b, 0x634, 0x3b, 0x645, 0x3b, 0x622, 0x3b, 0x622, 0x3b, 0x62f,
-0x3b, 0x628, 0x3b, 0x627, 0x3b, 0x62d, 0x3b, 0x62b, 0x3b, 0x62c, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x645, 0x3b, 0x639,
-0x3b, 0x642, 0x3b, 0x62c, 0x3b, 0x62f, 0x3b, 0x62d, 0x3b, 0x62d, 0x645, 0x644, 0x3b, 0x62b, 0x648, 0x631, 0x3b, 0x62c, 0x648, 0x632,
-0x627, 0x3b, 0x633, 0x631, 0x637, 0x627, 0x646, 0x3b, 0x627, 0x633, 0x62f, 0x3b, 0x633, 0x646, 0x628, 0x644, 0x647, 0x654, 0x3b, 0x645,
-0x6cc, 0x632, 0x627, 0x646, 0x3b, 0x639, 0x642, 0x631, 0x628, 0x3b, 0x642, 0x648, 0x633, 0x3b, 0x62c, 0x62f, 0x6cc, 0x3b, 0x62f, 0x644,
-0x648, 0x3b, 0x62d, 0x648, 0x62a, 0x3b, 0x46, 0x61, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69,
-0x62, 0x65, 0x68, 0x65, 0x73, 0x7a, 0x74, 0x3b, 0x43, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b,
-0x4d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x53, 0x7a, 0x61, 0x68, 0x72, 0x69, 0x77, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68,
-0x72, 0x3b, 0x100, 0x62, 0x101, 0x6e, 0x3b, 0x100, 0x73, 0x61, 0x72, 0x3b, 0x44, 0xe9, 0x69, 0x3b, 0x42, 0x61, 0x68, 0x6d,
-0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x3b, 0xa2b, 0xa3e, 0xa30, 0xa35, 0xa30, 0xa21, 0xa40, 0xa28, 0x3b, 0xa14,
-0xa30, 0xa21, 0xa3e, 0xa08, 0xa2c, 0xa39, 0xa48, 0xa38, 0xa3c, 0xa1f, 0x3b, 0xa16, 0xa4b, 0xa21, 0xa30, 0xa21, 0x3b, 0xa1f, 0xa3f, 0xa30,
-0x3b, 0xa2e, 0xa4b, 0xa30, 0xa21, 0xa3e, 0xa26, 0x3b, 0xa38, 0xa3c, 0xa30, 0xa3e, 0xa07, 0xa35, 0xa30, 0x3b, 0xa2e, 0xa47, 0xa39, 0xa30,
-0x3b, 0xa05, 0xa2c, 0xa3e, 0xa28, 0x3b, 0xa05, 0xa1c, 0xa3c, 0xa3e, 0xa30, 0x3b, 0xa21, 0xa47, 0xa05, 0x3b, 0xa2c, 0xa3e, 0xa39, 0xa2e,
-0xa28, 0x3b, 0xa10, 0xa38, 0xa2b, 0xa70, 0xa21, 0x3b, 0x46, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72,
-0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68, 0x74, 0x3b, 0x4b, 0x68, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69,
-0x72, 0x3b, 0x41, 0x2d, 0x4d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x53, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72,
-0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b,
-0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x3b, 0x444, 0x430, 0x440, 0x432, 0x430, 0x440,
-0x434, 0x438, 0x43d, 0x3b, 0x43e, 0x440, 0x434, 0x438, 0x431, 0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x445, 0x43e, 0x440, 0x434, 0x430,
-0x434, 0x3b, 0x442, 0x438, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x448, 0x430, 0x445, 0x440, 0x438, 0x432, 0x435,
-0x440, 0x3b, 0x43c, 0x435, 0x445, 0x440, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b, 0x434, 0x435, 0x439,
-0x3b, 0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x44d, 0x441, 0x444, 0x430, 0x43d, 0x434, 0x3b, 0x424, 0x430, 0x440, 0x430, 0x432,
-0x430, 0x434, 0x438, 0x43d, 0x3b, 0x41e, 0x440, 0x434, 0x438, 0x431, 0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x41a, 0x43e, 0x440, 0x434,
-0x430, 0x434, 0x3b, 0x422, 0x438, 0x440, 0x3b, 0x41c, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x428, 0x430, 0x445, 0x440, 0x438, 0x432,
-0x430, 0x440, 0x3b, 0x41c, 0x435, 0x445, 0x440, 0x3b, 0x410, 0x431, 0x430, 0x43d, 0x3b, 0x410, 0x437, 0x430, 0x440, 0x3b, 0x414, 0x435,
-0x458, 0x3b, 0x411, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x415, 0x441, 0x444, 0x430, 0x43d, 0x434, 0x3b, 0x46, 0x61, 0x72, 0x61,
-0x76, 0x61, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b, 0x4b, 0x6f, 0x72,
-0x64, 0x61, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x160, 0x61, 0x68, 0x72, 0x69,
-0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41, 0x7a, 0x61, 0x72, 0x3b, 0x44,
-0x65, 0x6a, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x3b, 0x46, 0x61, 0x72,
-0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68, 0x74, 0x3b, 0x4b,
-0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x53, 0x68,
-0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x100, 0x62, 0x101, 0x6e, 0x3b, 0x100, 0x7a,
-0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64,
-0x3b, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73,
-0x68, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64, 0x101,
-0x64, 0x3b, 0x73, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x101, 0x62, 0x101,
-0x6e, 0x3b, 0x101, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65, 0x73,
-0x66, 0x61, 0x6e, 0x64, 0x3b, 0x444, 0x430, 0x440, 0x432, 0x430, 0x440, 0x434, 0x438, 0x43d, 0x3b, 0x443, 0x440, 0x434, 0x438, 0x431,
+0x6e, 0x64, 0x73, 0x444, 0x430, 0x440, 0x432, 0x430, 0x440, 0x434, 0x438, 0x43d, 0x3b, 0x43e, 0x440, 0x434, 0x438, 0x431, 0x435, 0x445,
+0x435, 0x448, 0x442, 0x3b, 0x43a, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x442, 0x438, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x434, 0x430,
+0x434, 0x3b, 0x448, 0x430, 0x445, 0x440, 0x438, 0x432, 0x430, 0x440, 0x3b, 0x43c, 0x435, 0x440, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b,
+0x430, 0x437, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x458, 0x3b, 0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x435, 0x441, 0x444, 0x430,
+0x43d, 0x434, 0xd2b, 0xd7c, 0xd35, 0xd3e, 0xd7c, 0xd26, 0xd3f, 0xd7b, 0x3b, 0xd13, 0xd7c, 0xd21, 0xd3f, 0xd2c, 0xd46, 0xd39, 0xd46, 0xd37,
+0xd4d, 0x200c, 0xd31, 0xd4d, 0xd31, 0xd4d, 0x3b, 0xd16, 0xd4b, 0xd7c, 0xd26, 0xd3e, 0xd26, 0xd4d, 0x3b, 0xd1f, 0xd3f, 0xd7c, 0x3b, 0xd2e,
+0xd4b, 0xd7c, 0xd26, 0xd3e, 0xd26, 0xd4d, 0x3b, 0xd37, 0xd39, 0xd4d, 0x200c, 0xd30, 0xd3f, 0xd35, 0xd3e, 0xd7c, 0x3b, 0xd2e, 0xd46, 0xd39,
+0xd7c, 0x3b, 0xd05, 0xd2c, 0xd3e, 0xd7b, 0x3b, 0xd05, 0xd38, 0xd7c, 0x3b, 0xd21, 0xd46, 0xd2f, 0xd4d, 0x3b, 0xd2c, 0xd39, 0xd4d, 0x200c,
+0xd2e, 0xd3e, 0xd7b, 0x3b, 0xd0e, 0xd38, 0xd4d, 0x200c, 0xd2b, 0xd3e, 0xd7b, 0xd21, 0xd4d, 0xd2b, 0x2e, 0x3b, 0xd13, 0x2e, 0x3b, 0xd16,
+0xd4b, 0x3b, 0xd1f, 0xd3f, 0x2e, 0x3b, 0xd2e, 0xd4b, 0x2e, 0x3b, 0xd37, 0x2e, 0x3b, 0xd2e, 0xd46, 0x2e, 0x3b, 0xd05, 0x2e, 0x3b,
+0xd05, 0x2e, 0x3b, 0xd21, 0xd46, 0x2e, 0x3b, 0xd2c, 0x2e, 0x3b, 0xd0e, 0x2e, 0x92b, 0x930, 0x935, 0x930, 0x926, 0x93f, 0x928, 0x3b,
+0x913, 0x930, 0x94d, 0x926, 0x93f, 0x92c, 0x947, 0x939, 0x947, 0x936, 0x94d, 0x924, 0x3b, 0x916, 0x94b, 0x930, 0x926, 0x93e, 0x926, 0x3b,
+0x924, 0x93f, 0x930, 0x3b, 0x92e, 0x94b, 0x930, 0x926, 0x93e, 0x926, 0x3b, 0x936, 0x93e, 0x939, 0x930, 0x940, 0x935, 0x93e, 0x930, 0x3b,
+0x92e, 0x947, 0x939, 0x947, 0x930, 0x3b, 0x905, 0x92c, 0x93e, 0x928, 0x3b, 0x905, 0x91d, 0x93e, 0x930, 0x3b, 0x926, 0x947, 0x3b, 0x92c,
+0x93e, 0x939, 0x92e, 0x93e, 0x928, 0x3b, 0x90f, 0x938, 0x92b, 0x93e, 0x902, 0x926, 0x967, 0x3b, 0x968, 0x3b, 0x969, 0x3b, 0x96a, 0x3b,
+0x96b, 0x3b, 0x96c, 0x3b, 0x96d, 0x3b, 0x96e, 0x3b, 0x96f, 0x3b, 0x967, 0x966, 0x3b, 0x967, 0x967, 0x3b, 0x967, 0x968, 0x648, 0x631,
+0x6cc, 0x3b, 0x63a, 0x648, 0x6cc, 0x6cc, 0x3b, 0x63a, 0x628, 0x631, 0x6af, 0x648, 0x644, 0x6cc, 0x3b, 0x686, 0x646, 0x6af, 0x627, 0x69a,
+0x3b, 0x632, 0x645, 0x631, 0x6cc, 0x3b, 0x648, 0x696, 0x6cc, 0x3b, 0x62a, 0x644, 0x647, 0x3b, 0x644, 0x693, 0x645, 0x3b, 0x644, 0x6cc,
+0x646, 0x62f, 0x6cd, 0x3b, 0x645, 0x631, 0x63a, 0x648, 0x645, 0x6cc, 0x3b, 0x633, 0x644, 0x648, 0x627, 0x63a, 0x647, 0x3b, 0x6a9, 0x628,
+0x6f1, 0x3b, 0x6f2, 0x3b, 0x6f3, 0x3b, 0x6f4, 0x3b, 0x6f5, 0x3b, 0x6f6, 0x3b, 0x6f7, 0x3b, 0x6f8, 0x3b, 0x6f9, 0x3b, 0x6f1, 0x6f0,
+0x3b, 0x6f1, 0x6f1, 0x3b, 0x6f1, 0x6f2, 0x641, 0x631, 0x648, 0x631, 0x62f, 0x6cc, 0x646, 0x3b, 0x627, 0x631, 0x62f, 0x6cc, 0x628, 0x647,
+0x634, 0x62a, 0x3b, 0x62e, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x62a, 0x6cc, 0x631, 0x3b, 0x645, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x634,
+0x647, 0x631, 0x6cc, 0x648, 0x631, 0x3b, 0x645, 0x647, 0x631, 0x3b, 0x622, 0x628, 0x627, 0x646, 0x3b, 0x622, 0x630, 0x631, 0x3b, 0x62f,
+0x6cc, 0x3b, 0x628, 0x647, 0x645, 0x646, 0x3b, 0x627, 0x633, 0x641, 0x646, 0x62f, 0x641, 0x3b, 0x627, 0x3b, 0x62e, 0x3b, 0x62a, 0x3b,
+0x645, 0x3b, 0x634, 0x3b, 0x645, 0x3b, 0x622, 0x3b, 0x622, 0x3b, 0x62f, 0x3b, 0x628, 0x3b, 0x627, 0x62d, 0x645, 0x644, 0x3b, 0x62b,
+0x648, 0x631, 0x3b, 0x62c, 0x648, 0x632, 0x627, 0x3b, 0x633, 0x631, 0x637, 0x627, 0x646, 0x3b, 0x627, 0x633, 0x62f, 0x3b, 0x633, 0x646,
+0x628, 0x644, 0x647, 0x654, 0x3b, 0x645, 0x6cc, 0x632, 0x627, 0x646, 0x3b, 0x639, 0x642, 0x631, 0x628, 0x3b, 0x642, 0x648, 0x633, 0x3b,
+0x62c, 0x62f, 0x6cc, 0x3b, 0x62f, 0x644, 0x648, 0x3b, 0x62d, 0x648, 0x62a, 0x62d, 0x3b, 0x62b, 0x3b, 0x62c, 0x3b, 0x633, 0x3b, 0x627,
+0x3b, 0x633, 0x3b, 0x645, 0x3b, 0x639, 0x3b, 0x642, 0x3b, 0x62c, 0x3b, 0x62f, 0x3b, 0x62d, 0x46, 0x61, 0x72, 0x77, 0x61, 0x72,
+0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x7a, 0x74, 0x3b, 0x43, 0x68, 0x6f, 0x72,
+0x64, 0x101, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x53, 0x7a, 0x61, 0x68, 0x72,
+0x69, 0x77, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x100, 0x62, 0x101, 0x6e, 0x3b, 0x100, 0x73, 0x61, 0x72, 0x3b,
+0x44, 0xe9, 0x69, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0xa2b, 0xa3e, 0xa30,
+0xa35, 0xa30, 0xa21, 0xa40, 0xa28, 0x3b, 0xa14, 0xa30, 0xa21, 0xa3e, 0xa08, 0xa2c, 0xa39, 0xa48, 0xa38, 0xa3c, 0xa1f, 0x3b, 0xa16, 0xa4b,
+0xa21, 0xa30, 0xa21, 0x3b, 0xa1f, 0xa3f, 0xa30, 0x3b, 0xa2e, 0xa4b, 0xa30, 0xa21, 0xa3e, 0xa26, 0x3b, 0xa38, 0xa3c, 0xa30, 0xa3e, 0xa07,
+0xa35, 0xa30, 0x3b, 0xa2e, 0xa47, 0xa39, 0xa30, 0x3b, 0xa05, 0xa2c, 0xa3e, 0xa28, 0x3b, 0xa05, 0xa1c, 0xa3c, 0xa3e, 0xa30, 0x3b, 0xa21,
+0xa47, 0xa05, 0x3b, 0xa2c, 0xa3e, 0xa39, 0xa2e, 0xa28, 0x3b, 0xa10, 0xa38, 0xa2b, 0xa70, 0xa21, 0x46, 0x61, 0x72, 0x76, 0x61, 0x72,
+0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68, 0x74, 0x3b, 0x4b, 0x68, 0x6f, 0x72,
+0x64, 0x61, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x41, 0x2d, 0x4d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x53, 0x68, 0x61,
+0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41, 0x7a, 0x61,
+0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x444,
+0x430, 0x440, 0x432, 0x430, 0x440, 0x434, 0x438, 0x43d, 0x3b, 0x43e, 0x440, 0x434, 0x438, 0x431, 0x435, 0x445, 0x435, 0x448, 0x442, 0x3b,
+0x445, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x442, 0x438, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x448, 0x430,
+0x445, 0x440, 0x438, 0x432, 0x435, 0x440, 0x3b, 0x43c, 0x435, 0x445, 0x440, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435,
+0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x44d, 0x441, 0x444, 0x430, 0x43d, 0x434, 0x424,
+0x430, 0x440, 0x430, 0x432, 0x430, 0x434, 0x438, 0x43d, 0x3b, 0x41e, 0x440, 0x434, 0x438, 0x431, 0x435, 0x445, 0x435, 0x448, 0x442, 0x3b,
+0x41a, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x422, 0x438, 0x440, 0x3b, 0x41c, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x428, 0x430,
+0x445, 0x440, 0x438, 0x432, 0x430, 0x440, 0x3b, 0x41c, 0x435, 0x445, 0x440, 0x3b, 0x410, 0x431, 0x430, 0x43d, 0x3b, 0x410, 0x437, 0x430,
+0x440, 0x3b, 0x414, 0x435, 0x458, 0x3b, 0x411, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x415, 0x441, 0x444, 0x430, 0x43d, 0x434, 0x46,
+0x61, 0x72, 0x61, 0x76, 0x61, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x161, 0x74, 0x3b,
+0x4b, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x160, 0x61,
+0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41, 0x7a, 0x61,
+0x72, 0x3b, 0x44, 0x65, 0x6a, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61, 0x6e, 0x64, 0x46,
+0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x73, 0x68, 0x74,
+0x3b, 0x4b, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b,
+0x53, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b, 0x100, 0x62, 0x101, 0x6e, 0x3b,
+0x100, 0x7a, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x61,
+0x6e, 0x64, 0x66, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x6f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65,
+0x73, 0x68, 0x74, 0x3b, 0x6b, 0x68, 0x6f, 0x72, 0x64, 0x101, 0x64, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x64,
+0x101, 0x64, 0x3b, 0x73, 0x68, 0x61, 0x68, 0x72, 0x69, 0x76, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x68, 0x72, 0x3b, 0x101, 0x62,
+0x101, 0x6e, 0x3b, 0x101, 0x7a, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x79, 0x3b, 0x62, 0x61, 0x68, 0x6d, 0x61, 0x6e, 0x3b, 0x65,
+0x73, 0x66, 0x61, 0x6e, 0x64, 0x444, 0x430, 0x440, 0x432, 0x430, 0x440, 0x434, 0x438, 0x43d, 0x3b, 0x443, 0x440, 0x434, 0x438, 0x431,
0x438, 0x4b3, 0x438, 0x448, 0x442, 0x3b, 0x445, 0x443, 0x440, 0x434, 0x43e, 0x434, 0x3b, 0x442, 0x438, 0x440, 0x3b, 0x43c, 0x443, 0x440,
0x434, 0x43e, 0x434, 0x3b, 0x448, 0x430, 0x4b3, 0x440, 0x438, 0x432, 0x430, 0x440, 0x3b, 0x43c, 0x435, 0x4b3, 0x440, 0x3b, 0x43e, 0x431,
0x43e, 0x43d, 0x3b, 0x43e, 0x437, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x4b3, 0x43c, 0x430, 0x43d, 0x3b, 0x438,
-0x441, 0x444, 0x430, 0x43d, 0x434, 0x3b, 0xb83, 0xbaa, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xb86, 0xbb0, 0xbcd, 0xb9f, 0xbbf, 0x2e, 0x3b, 0xb95,
-0xbca, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xba4, 0xbbf, 0xbb0, 0xbcd, 0x3b, 0xbae, 0xbca, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xbb7, 0xbbe, 0xbb0, 0xbbf,
-0x2e, 0x3b, 0xbae, 0xbc6, 0xbb9, 0xbcd, 0x2e, 0x3b, 0xb85, 0xbaa, 0xbbe, 0x2e, 0x3b, 0xb85, 0xb9a, 0xbbe, 0x2e, 0x3b, 0xba4, 0xbc7,
-0x3b, 0xbaa, 0xbb9, 0xbcd, 0x2e, 0x3b, 0xb8e, 0xb83, 0x2e, 0x3b, 0xb83, 0xbaa, 0xbb0, 0xbcd, 0xbb5, 0xbbe, 0xba4, 0xbbf, 0xba9, 0xbcd,
-0x3b, 0xb86, 0xbb0, 0xbcd, 0xb9f, 0xbbf, 0xbaa, 0xbc6, 0xbb9, 0xbc6, 0xbb7, 0xbcd, 0xba4, 0xbcd, 0x3b, 0xb95, 0xbca, 0xbb0, 0xbcd, 0xba4,
-0xbbe, 0xba4, 0xbcd, 0x3b, 0xba4, 0xbbf, 0xbb0, 0xbcd, 0x3b, 0xbae, 0xbca, 0xbb0, 0xbcd, 0xba4, 0xbbe, 0xba4, 0xbcd, 0x3b, 0xbb7, 0xbbe,
-0xbb0, 0xbbf, 0xbb5, 0xbbe, 0xbb0, 0xbcd, 0x3b, 0xbae, 0xbc6, 0xbb9, 0xbcd, 0xbb0, 0xbcd, 0x3b, 0xb85, 0xbaa, 0xbbe, 0xba9, 0xbcd, 0x3b,
-0xb85, 0xb9a, 0xbbe, 0xbb0, 0xbcd, 0x3b, 0xba4, 0xbc7, 0x3b, 0xbaa, 0xbb9, 0xbcd, 0xbae, 0xbbe, 0xba9, 0xbcd, 0x3b, 0xb8e, 0xb83, 0xbaa,
-0xbbe, 0xba9, 0xbcd, 0x3b, 0xc2b, 0xc3e, 0xc35, 0xc30, 0xc4d, 0xc21, 0xc3f, 0xc28, 0xc4d, 0x3b, 0xc0a, 0xc21, 0xc3e, 0xc2c, 0xc39, 0xc37,
-0xc4d, 0xc1f, 0xc4d, 0x3b, 0xc16, 0xc4b, 0xc30, 0xc4d, 0xc21, 0xc3e, 0xc21, 0xc4d, 0x3b, 0xc1f, 0xc3f, 0xc30, 0xc4d, 0x3b, 0xc2e, 0xc46,
-0xc30, 0xc4d, 0xc21, 0xc3e, 0xc21, 0xc4d, 0x3b, 0xc36, 0xc36, 0xc3f, 0xc35, 0xc30, 0xc4d, 0x3b, 0xc2e, 0xc46, 0xc39, 0xc30, 0xc4d, 0x3b,
-0xc05, 0xc2c, 0xc28, 0xc4d, 0x3b, 0xc05, 0xc1c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc47, 0x3b, 0xc2c, 0xc3e, 0xc39, 0xc4d, 0x200c, 0xc2e, 0xc3e,
-0xc28, 0xc4d, 0x3b, 0xc0e, 0xc38, 0xc4d, 0x200c, 0xc2b, 0xc3e, 0xc02, 0xc21, 0xc4d, 0x3b, 0xe1f, 0xe32, 0xe23, 0xe4c, 0xe27, 0xe32, 0xe23,
-0xe4c, 0xe14, 0xe34, 0xe19, 0x3b, 0xe2d, 0xe2d, 0xe23, 0xe4c, 0xe14, 0xe34, 0xe40, 0xe1a, 0xe40, 0xe2e, 0xe0a, 0xe15, 0xe4c, 0x3b, 0xe04,
-0xe2d, 0xe23, 0xe4c, 0xe41, 0xe14, 0xe14, 0x3b, 0xe40, 0xe15, 0xe2d, 0xe23, 0xe4c, 0x3b, 0xe21, 0xe2d, 0xe23, 0xe4c, 0xe41, 0xe14, 0xe14,
-0x3b, 0xe0a, 0xe32, 0xe2b, 0xe23, 0xe34, 0xe27, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe40, 0xe21, 0xe2e, 0xe23, 0xe4c, 0x3b, 0xe2d, 0xe30, 0xe1a,
-0xe32, 0xe19, 0x3b, 0xe2d, 0xe30, 0xe0b, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe40, 0xe14, 0xe22, 0xe4c, 0x3b, 0xe1a, 0xe32, 0xe2e, 0xe4c, 0xe21,
-0xe32, 0xe19, 0x3b, 0xe40, 0xe2d, 0xe2a, 0xe1f, 0xe32, 0xe19, 0xe14, 0xe4c, 0x3b, 0x46, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69,
-0x6e, 0x3b, 0x4f, 0x72, 0x64, 0x69, 0x62, 0x65, 0x68, 0x65, 0x15f, 0x74, 0x3b, 0x48, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b,
-0x54, 0x69, 0x72, 0x3b, 0x4d, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x15e, 0x65, 0x68, 0x72, 0x69, 0x76, 0x65, 0x72, 0x3b,
-0x4d, 0x65, 0x68, 0x72, 0x3b, 0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41, 0x7a, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42,
-0x65, 0x68, 0x6d, 0x65, 0x6e, 0x3b, 0x45, 0x73, 0x66, 0x65, 0x6e, 0x64, 0x3b, 0x444, 0x430, 0x440, 0x3b, 0x43e, 0x440, 0x434,
-0x3b, 0x445, 0x43e, 0x440, 0x3b, 0x442, 0x456, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x3b, 0x448, 0x430, 0x445, 0x3b, 0x43c, 0x435, 0x445,
-0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x3b, 0x435,
-0x441, 0x444, 0x3b, 0x444, 0x430, 0x440, 0x432, 0x430, 0x440, 0x434, 0x456, 0x43d, 0x3b, 0x43e, 0x440, 0x434, 0x456, 0x431, 0x435, 0x445,
-0x435, 0x448, 0x442, 0x3b, 0x445, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x442, 0x456, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x434, 0x430,
-0x434, 0x3b, 0x448, 0x430, 0x445, 0x440, 0x456, 0x432, 0x435, 0x440, 0x3b, 0x43c, 0x435, 0x445, 0x440, 0x3b, 0x430, 0x431, 0x430, 0x43d,
-0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d, 0x3b, 0x435, 0x441, 0x444,
-0x430, 0x43d, 0x434, 0x3b, 0x444, 0x430, 0x440, 0x2e, 0x3b, 0x43e, 0x440, 0x434, 0x2e, 0x3b, 0x445, 0x43e, 0x440, 0x2e, 0x3b, 0x442,
-0x456, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x2e, 0x3b, 0x448, 0x430, 0x445, 0x2e, 0x3b, 0x43c, 0x435, 0x445, 0x2e, 0x3b, 0x430, 0x431,
-0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x2e, 0x3b, 0x435, 0x441, 0x444,
-0x2e, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x62f, 0x646, 0x3b, 0x622, 0x631, 0x688, 0x628, 0x627, 0x626, 0x634, 0x3b, 0x62e, 0x62f, 0x627,
-0x62f, 0x627, 0x62f, 0x3b, 0x62a, 0x6cc, 0x631, 0x3b, 0x645, 0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x634, 0x6c1, 0x631, 0x6cc, 0x648, 0x627,
-0x631, 0x3b, 0x645, 0x6c1, 0x631, 0x3b, 0x627, 0x628, 0x627, 0x646, 0x3b, 0x622, 0x632, 0x631, 0x3b, 0x688, 0x6d2, 0x3b, 0x628, 0x6c1,
-0x645, 0x646, 0x3b, 0x627, 0x633, 0x641, 0x646, 0x62f, 0x3b, 0x64, 0x7a, 0x76, 0x3b, 0x64, 0x7a, 0x64, 0x3b, 0x74, 0x65, 0x64,
-0x3b, 0x61, 0x66, 0x254, 0x3b, 0x64, 0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73, 0x69, 0x61, 0x3b, 0x64, 0x65, 0x61,
-0x3b, 0x61, 0x6e, 0x79, 0x3b, 0x6b, 0x65, 0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x7a, 0x6d, 0x3b, 0x64, 0x7a, 0x6f,
-0x76, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65, 0x64, 0x6f, 0x78, 0x65, 0x3b, 0x61, 0x66, 0x254,
-0x66, 0x69, 0x1ebd, 0x3b, 0x64, 0x61, 0x6d, 0x25b, 0x3b, 0x6d, 0x61, 0x73, 0x61, 0x3b, 0x73, 0x69, 0x61, 0x6d, 0x6c, 0x254,
-0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254,
-0x3b, 0x6b, 0x65, 0x6c, 0x65, 0x3b, 0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b, 0x64, 0x7a,
-0x6f, 0x6d, 0x65, 0x3b, 0x62e, 0x627, 0x6a9, 0x6d5, 0x644, 0x6ce, 0x648, 0x6d5, 0x3b, 0x628, 0x627, 0x646, 0x6d5, 0x645, 0x6d5, 0x695,
-0x3b, 0x62c, 0x6c6, 0x632, 0x6d5, 0x631, 0x62f, 0x627, 0x646, 0x3b, 0x67e, 0x648, 0x648, 0x634, 0x67e, 0x6d5, 0x695, 0x3b, 0x6af, 0x6d5,
-0x644, 0x627, 0x648, 0x6ce, 0x698, 0x3b, 0x62e, 0x6d5, 0x631, 0x645, 0x627, 0x646, 0x627, 0x646, 0x3b, 0x695, 0x6d5, 0x632, 0x628, 0x6d5,
-0x631, 0x3b, 0x62e, 0x6d5, 0x632, 0x6d5, 0x6b5, 0x648, 0x6d5, 0x631, 0x3b, 0x633, 0x6d5, 0x631, 0x645, 0x627, 0x648, 0x6d5, 0x632, 0x3b,
-0x628, 0x6d5, 0x641, 0x631, 0x627, 0x646, 0x628, 0x627, 0x631, 0x3b, 0x695, 0x6ce, 0x628, 0x6d5, 0x646, 0x62f, 0x627, 0x646, 0x3b, 0x631,
-0x6d5, 0x634, 0x6d5, 0x645, 0x6ce, 0x3b
+0x441, 0x444, 0x430, 0x43d, 0x434, 0xb83, 0xbaa, 0xbb0, 0xbcd, 0xbb5, 0xbbe, 0xba4, 0xbbf, 0xba9, 0xbcd, 0x3b, 0xb86, 0xbb0, 0xbcd, 0xb9f,
+0xbbf, 0xbaa, 0xbc6, 0xbb9, 0xbc6, 0xbb7, 0xbcd, 0xba4, 0xbcd, 0x3b, 0xb95, 0xbca, 0xbb0, 0xbcd, 0xba4, 0xbbe, 0xba4, 0xbcd, 0x3b, 0xba4,
+0xbbf, 0xbb0, 0xbcd, 0x3b, 0xbae, 0xbca, 0xbb0, 0xbcd, 0xba4, 0xbbe, 0xba4, 0xbcd, 0x3b, 0xbb7, 0xbbe, 0xbb0, 0xbbf, 0xbb5, 0xbbe, 0xbb0,
+0xbcd, 0x3b, 0xbae, 0xbc6, 0xbb9, 0xbcd, 0xbb0, 0xbcd, 0x3b, 0xb85, 0xbaa, 0xbbe, 0xba9, 0xbcd, 0x3b, 0xb85, 0xb9a, 0xbbe, 0xbb0, 0xbcd,
+0x3b, 0xba4, 0xbc7, 0x3b, 0xbaa, 0xbb9, 0xbcd, 0xbae, 0xbbe, 0xba9, 0xbcd, 0x3b, 0xb8e, 0xb83, 0xbaa, 0xbbe, 0xba9, 0xbcd, 0xb83, 0xbaa,
+0xbb0, 0xbcd, 0x2e, 0x3b, 0xb86, 0xbb0, 0xbcd, 0xb9f, 0xbbf, 0x2e, 0x3b, 0xb95, 0xbca, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xba4, 0xbbf, 0xbb0,
+0xbcd, 0x3b, 0xbae, 0xbca, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xbb7, 0xbbe, 0xbb0, 0xbbf, 0x2e, 0x3b, 0xbae, 0xbc6, 0xbb9, 0xbcd, 0x2e, 0x3b,
+0xb85, 0xbaa, 0xbbe, 0x2e, 0x3b, 0xb85, 0xb9a, 0xbbe, 0x2e, 0x3b, 0xba4, 0xbc7, 0x3b, 0xbaa, 0xbb9, 0xbcd, 0x2e, 0x3b, 0xb8e, 0xb83,
+0x2e, 0xc2b, 0xc3e, 0xc35, 0xc30, 0xc4d, 0xc21, 0xc3f, 0xc28, 0xc4d, 0x3b, 0xc0a, 0xc21, 0xc3e, 0xc2c, 0xc39, 0xc37, 0xc4d, 0xc1f, 0xc4d,
+0x3b, 0xc16, 0xc4b, 0xc30, 0xc4d, 0xc21, 0xc3e, 0xc21, 0xc4d, 0x3b, 0xc1f, 0xc3f, 0xc30, 0xc4d, 0x3b, 0xc2e, 0xc46, 0xc30, 0xc4d, 0xc21,
+0xc3e, 0xc21, 0xc4d, 0x3b, 0xc36, 0xc36, 0xc3f, 0xc35, 0xc30, 0xc4d, 0x3b, 0xc2e, 0xc46, 0xc39, 0xc30, 0xc4d, 0x3b, 0xc05, 0xc2c, 0xc28,
+0xc4d, 0x3b, 0xc05, 0xc1c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc47, 0x3b, 0xc2c, 0xc3e, 0xc39, 0xc4d, 0x200c, 0xc2e, 0xc3e, 0xc28, 0xc4d, 0x3b,
+0xc0e, 0xc38, 0xc4d, 0x200c, 0xc2b, 0xc3e, 0xc02, 0xc21, 0xc4d, 0xe1f, 0xe32, 0xe23, 0xe4c, 0xe27, 0xe32, 0xe23, 0xe4c, 0xe14, 0xe34, 0xe19,
+0x3b, 0xe2d, 0xe2d, 0xe23, 0xe4c, 0xe14, 0xe34, 0xe40, 0xe1a, 0xe40, 0xe2e, 0xe0a, 0xe15, 0xe4c, 0x3b, 0xe04, 0xe2d, 0xe23, 0xe4c, 0xe41,
+0xe14, 0xe14, 0x3b, 0xe40, 0xe15, 0xe2d, 0xe23, 0xe4c, 0x3b, 0xe21, 0xe2d, 0xe23, 0xe4c, 0xe41, 0xe14, 0xe14, 0x3b, 0xe0a, 0xe32, 0xe2b,
+0xe23, 0xe34, 0xe27, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe40, 0xe21, 0xe2e, 0xe23, 0xe4c, 0x3b, 0xe2d, 0xe30, 0xe1a, 0xe32, 0xe19, 0x3b, 0xe2d,
+0xe30, 0xe0b, 0xe32, 0xe23, 0xe4c, 0x3b, 0xe40, 0xe14, 0xe22, 0xe4c, 0x3b, 0xe1a, 0xe32, 0xe2e, 0xe4c, 0xe21, 0xe32, 0xe19, 0x3b, 0xe40,
+0xe2d, 0xe2a, 0xe1f, 0xe32, 0xe19, 0xe14, 0xe4c, 0x46, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x6e, 0x3b, 0x4f, 0x72, 0x64,
+0x69, 0x62, 0x65, 0x68, 0x65, 0x15f, 0x74, 0x3b, 0x48, 0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x54, 0x69, 0x72, 0x3b, 0x4d,
+0x6f, 0x72, 0x64, 0x61, 0x64, 0x3b, 0x15e, 0x65, 0x68, 0x72, 0x69, 0x76, 0x65, 0x72, 0x3b, 0x4d, 0x65, 0x68, 0x72, 0x3b,
+0x41, 0x62, 0x61, 0x6e, 0x3b, 0x41, 0x7a, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x79, 0x3b, 0x42, 0x65, 0x68, 0x6d, 0x65, 0x6e,
+0x3b, 0x45, 0x73, 0x66, 0x65, 0x6e, 0x64, 0x444, 0x430, 0x440, 0x432, 0x430, 0x440, 0x434, 0x456, 0x43d, 0x3b, 0x43e, 0x440, 0x434,
+0x456, 0x431, 0x435, 0x445, 0x435, 0x448, 0x442, 0x3b, 0x445, 0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x442, 0x456, 0x440, 0x3b, 0x43c,
+0x43e, 0x440, 0x434, 0x430, 0x434, 0x3b, 0x448, 0x430, 0x445, 0x440, 0x456, 0x432, 0x435, 0x440, 0x3b, 0x43c, 0x435, 0x445, 0x440, 0x3b,
+0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x43c, 0x430, 0x43d,
+0x3b, 0x435, 0x441, 0x444, 0x430, 0x43d, 0x434, 0x444, 0x430, 0x440, 0x3b, 0x43e, 0x440, 0x434, 0x3b, 0x445, 0x43e, 0x440, 0x3b, 0x442,
+0x456, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x3b, 0x448, 0x430, 0x445, 0x3b, 0x43c, 0x435, 0x445, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b,
+0x430, 0x437, 0x435, 0x440, 0x3b, 0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x3b, 0x435, 0x441, 0x444, 0x444, 0x430, 0x440, 0x2e,
+0x3b, 0x43e, 0x440, 0x434, 0x2e, 0x3b, 0x445, 0x43e, 0x440, 0x2e, 0x3b, 0x442, 0x456, 0x440, 0x3b, 0x43c, 0x43e, 0x440, 0x2e, 0x3b,
+0x448, 0x430, 0x445, 0x2e, 0x3b, 0x43c, 0x435, 0x445, 0x2e, 0x3b, 0x430, 0x431, 0x430, 0x43d, 0x3b, 0x430, 0x437, 0x435, 0x440, 0x3b,
+0x434, 0x435, 0x439, 0x3b, 0x431, 0x430, 0x445, 0x2e, 0x3b, 0x435, 0x441, 0x444, 0x2e, 0x641, 0x631, 0x648, 0x631, 0x62f, 0x646, 0x3b,
+0x622, 0x631, 0x688, 0x628, 0x627, 0x626, 0x634, 0x3b, 0x62e, 0x62f, 0x627, 0x62f, 0x627, 0x62f, 0x3b, 0x62a, 0x6cc, 0x631, 0x3b, 0x645,
+0x631, 0x62f, 0x627, 0x62f, 0x3b, 0x634, 0x6c1, 0x631, 0x6cc, 0x648, 0x627, 0x631, 0x3b, 0x645, 0x6c1, 0x631, 0x3b, 0x627, 0x628, 0x627,
+0x646, 0x3b, 0x622, 0x632, 0x631, 0x3b, 0x688, 0x6d2, 0x3b, 0x628, 0x6c1, 0x645, 0x646, 0x3b, 0x627, 0x633, 0x641, 0x646, 0x62f, 0x64,
+0x7a, 0x6f, 0x76, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65, 0x64, 0x6f, 0x78, 0x65, 0x3b, 0x61,
+0x66, 0x254, 0x66, 0x69, 0x1ebd, 0x3b, 0x64, 0x61, 0x6d, 0x25b, 0x3b, 0x6d, 0x61, 0x73, 0x61, 0x3b, 0x73, 0x69, 0x61, 0x6d,
+0x6c, 0x254, 0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e,
+0x79, 0x254, 0x3b, 0x6b, 0x65, 0x6c, 0x65, 0x3b, 0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b,
+0x64, 0x7a, 0x6f, 0x6d, 0x65, 0x64, 0x7a, 0x76, 0x3b, 0x64, 0x7a, 0x64, 0x3b, 0x74, 0x65, 0x64, 0x3b, 0x61, 0x66, 0x254,
+0x3b, 0x64, 0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73, 0x69, 0x61, 0x3b, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x6e, 0x79,
+0x3b, 0x6b, 0x65, 0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x7a, 0x6d, 0x62e, 0x627, 0x6a9, 0x6d5, 0x644, 0x6ce, 0x648, 0x6d5,
+0x3b, 0x628, 0x627, 0x646, 0x6d5, 0x645, 0x6d5, 0x695, 0x3b, 0x62c, 0x6c6, 0x632, 0x6d5, 0x631, 0x62f, 0x627, 0x646, 0x3b, 0x67e, 0x648,
+0x648, 0x634, 0x67e, 0x6d5, 0x695, 0x3b, 0x6af, 0x6d5, 0x644, 0x627, 0x648, 0x6ce, 0x698, 0x3b, 0x62e, 0x6d5, 0x631, 0x645, 0x627, 0x646,
+0x627, 0x646, 0x3b, 0x695, 0x6d5, 0x632, 0x628, 0x6d5, 0x631, 0x3b, 0x62e, 0x6d5, 0x632, 0x6d5, 0x6b5, 0x648, 0x6d5, 0x631, 0x3b, 0x633,
+0x6d5, 0x631, 0x645, 0x627, 0x648, 0x6d5, 0x632, 0x3b, 0x628, 0x6d5, 0x641, 0x631, 0x627, 0x646, 0x628, 0x627, 0x631, 0x3b, 0x695, 0x6ce,
+0x628, 0x6d5, 0x646, 0x62f, 0x627, 0x646, 0x3b, 0x631, 0x6d5, 0x634, 0x6d5, 0x645, 0x6ce
};
// GENERATED PART ENDS HERE
diff --git a/src/corelib/time/qjalalicalendar_p.h b/src/corelib/time/qjalalicalendar_p.h
index 5b94dada9f..77b87a36b3 100644
--- a/src/corelib/time/qjalalicalendar_p.h
+++ b/src/corelib/time/qjalalicalendar_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -78,7 +78,7 @@ public:
protected:
// locale support:
const QCalendarLocale *localeMonthIndexData() const override;
- const ushort *localeMonthData() const override;
+ const char16_t *localeMonthData() const override;
};
QT_END_NAMESPACE
diff --git a/src/corelib/time/qromancalendar.cpp b/src/corelib/time/qromancalendar.cpp
index c3cd134490..98b53eb9cf 100644
--- a/src/corelib/time/qromancalendar.cpp
+++ b/src/corelib/time/qromancalendar.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -97,7 +97,7 @@ const QCalendarLocale *QRomanCalendar::localeMonthIndexData() const
return locale_data;
}
-const ushort *QRomanCalendar::localeMonthData() const
+const char16_t *QRomanCalendar::localeMonthData() const
{
return months_data;
}
diff --git a/src/corelib/time/qromancalendar_data_p.h b/src/corelib/time/qromancalendar_data_p.h
index fb8fc23fd2..8a0ec14d49 100644
--- a/src/corelib/time/qromancalendar_data_p.h
+++ b/src/corelib/time/qromancalendar_data_p.h
@@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE
// GENERATED PART STARTS HERE
/*
- This part of the file was generated on 2020-03-18 from the
+ This part of the file was generated on 2020-04-07 from the
Common Locale Data Repository v36
http://www.unicode.org/cldr/
@@ -70,2024 +70,2001 @@ QT_BEGIN_NAMESPACE
*/
static const QCalendarLocale locale_data[] = {
- // lang script terr sShort sLong sNarrow short long narrow
- { 1, 0, 0,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 158,29 }}, // C/AnyScript/AnyCountry
- { 3, 7, 69,{ 187,48 },{ 235,111 },{ 134,24 },{ 187,48 },{ 235,111 },{ 134,24 }}, // Oromo/Latin/Ethiopia
- { 3, 7, 111,{ 187,48 },{ 235,111 },{ 346,24 },{ 187,48 },{ 235,111 },{ 134,24 }}, // Oromo/Latin/Kenya
- { 4, 7, 69,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Afar/Latin/Ethiopia
- { 5, 7, 195,{ 445,59 },{ 504,92 },{ 134,24 },{ 445,59 },{ 504,92 },{ 134,24 }}, // Afrikaans/Latin/South Africa
- { 5, 7, 148,{ 445,59 },{ 504,92 },{ 134,24 },{ 445,59 },{ 504,92 },{ 134,24 }}, // Afrikaans/Latin/Namibia
- { 6, 7, 2,{ 596,50 },{ 646,78 },{ 724,27 },{ 596,50 },{ 646,78 },{ 724,27 }}, // Albanian/Latin/Albania
- { 6, 7, 127,{ 596,50 },{ 646,78 },{ 724,27 },{ 596,50 },{ 646,78 },{ 724,27 }}, // Albanian/Latin/Macedonia
- { 6, 7, 257,{ 596,50 },{ 646,78 },{ 724,27 },{ 596,50 },{ 646,78 },{ 724,27 }}, // Albanian/Latin/Kosovo
- { 7, 14, 69,{ 751,46 },{ 797,61 },{ 858,24 },{ 751,46 },{ 797,61 },{ 858,24 }}, // Amharic/Ethiopic/Ethiopia
- { 8, 1, 64,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Egypt
- { 8, 1, 3,{ 981,71 },{ 981,71 },{ 1052,24 },{ 981,71 },{ 981,71 },{ 1052,24 }}, // Arabic/Arabic/Algeria
- { 8, 1, 17,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Bahrain
- { 8, 1, 42,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Chad
- { 8, 1, 48,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Comoros
- { 8, 1, 59,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Djibouti
- { 8, 1, 67,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Eritrea
- { 8, 1, 103,{ 1076,92 },{ 1076,92 },{ 1168,24 },{ 1192,92 },{ 1076,92 },{ 1168,24 }}, // Arabic/Arabic/Iraq
- { 8, 1, 105,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Israel
- { 8, 1, 109,{ 1076,92 },{ 1076,92 },{ 1168,24 },{ 1076,92 },{ 1076,92 },{ 1168,24 }}, // Arabic/Arabic/Jordan
- { 8, 1, 115,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Kuwait
- { 8, 1, 119,{ 1076,92 },{ 1076,92 },{ 1168,24 },{ 1076,92 },{ 1076,92 },{ 1168,24 }}, // Arabic/Arabic/Lebanon
- { 8, 1, 122,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Libya
- { 8, 1, 136,{ 1284,72 },{ 1284,72 },{ 1356,24 },{ 1284,72 },{ 1284,72 },{ 1356,24 }}, // Arabic/Arabic/Mauritania
- { 8, 1, 145,{ 1380,70 },{ 1380,70 },{ 1450,24 },{ 1380,70 },{ 1380,70 },{ 1450,24 }}, // Arabic/Arabic/Morocco
- { 8, 1, 162,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Oman
- { 8, 1, 165,{ 1076,92 },{ 1076,92 },{ 1168,24 },{ 1076,92 },{ 1076,92 },{ 1168,24 }}, // Arabic/Arabic/Palestinian Territories
- { 8, 1, 175,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Qatar
- { 8, 1, 186,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Saudi Arabia
- { 8, 1, 194,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Somalia
- { 8, 1, 201,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Sudan
- { 8, 1, 207,{ 1076,92 },{ 1076,92 },{ 1168,24 },{ 1076,92 },{ 1076,92 },{ 1168,24 }}, // Arabic/Arabic/Syria
- { 8, 1, 216,{ 981,71 },{ 981,71 },{ 1052,24 },{ 981,71 },{ 981,71 },{ 1052,24 }}, // Arabic/Arabic/Tunisia
- { 8, 1, 223,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/United Arab Emirates
- { 8, 1, 236,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Western Sahara
- { 8, 1, 237,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/Yemen
- { 8, 1, 254,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/South Sudan
- { 8, 1, 260,{ 882,75 },{ 882,75 },{ 957,24 },{ 882,75 },{ 882,75 },{ 957,24 }}, // Arabic/Arabic/World
- { 9, 10, 11,{ 1474,48 },{ 1522,94 },{ 1616,24 },{ 1474,48 },{ 1640,106 },{ 1616,24 }}, // Armenian/Armenian/Armenia
- { 10, 11, 100,{ 1746,64 },{ 1810,89 },{ 1899,24 },{ 1746,64 },{ 1810,89 },{ 1899,24 }}, // Assamese/Bengali/India
- { 12, 7, 15,{ 1923,48 },{ 1971,77 },{ 418,27 },{ 1923,48 },{ 2048,77 },{ 418,27 }}, // Azerbaijani/Latin/Azerbaijan
- { 12, 1, 102,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Azerbaijani/Arabic/Iran
- { 12, 2, 15,{ 2125,48 },{ 2173,77 },{ 418,27 },{ 2125,48 },{ 2250,77 },{ 418,27 }}, // Azerbaijani/Cyrillic/Azerbaijan
- { 13, 2, 178,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Bashkir/Cyrillic/Russia
- { 14, 7, 197,{ 2327,60 },{ 2387,93 },{ 2480,24 },{ 2327,60 },{ 2387,93 },{ 2480,24 }}, // Basque/Latin/Spain
- { 15, 11, 18,{ 2504,90 },{ 2504,90 },{ 2594,33 },{ 2627,77 },{ 2504,90 },{ 2594,33 }}, // Bengali/Bengali/Bangladesh
- { 15, 11, 100,{ 2504,90 },{ 2504,90 },{ 2594,33 },{ 2627,77 },{ 2504,90 },{ 2594,33 }}, // Bengali/Bengali/India
- { 16, 31, 25,{ 2704,63 },{ 2767,191 },{ 2958,27 },{ 2985,27 },{ 3012,132 },{ 3144,27 }}, // Dzongkha/Tibetan/Bhutan
- { 19, 7, 74,{ 3171,63 },{ 3234,78 },{ 3312,36 },{ 3171,63 },{ 3234,78 },{ 3312,36 }}, // Breton/Latin/France
- { 20, 2, 33,{ 3348,49 },{ 3397,82 },{ 3479,24 },{ 3348,49 },{ 3397,82 },{ 3479,24 }}, // Bulgarian/Cyrillic/Bulgaria
- { 21, 25, 147,{ 3503,43 },{ 3546,88 },{ 3634,24 },{ 3503,43 },{ 3546,88 },{ 3634,24 }}, // Burmese/Myanmar/Myanmar
- { 22, 2, 20,{ 3658,48 },{ 3706,95 },{ 3801,24 },{ 3825,48 },{ 3873,98 },{ 3801,24 }}, // Belarusian/Cyrillic/Belarus
- { 23, 20, 36,{ 3971,71 },{ 3971,71 },{ 4042,24 },{ 3971,71 },{ 3971,71 },{ 4042,24 }}, // Khmer/Khmer/Cambodia
- { 24, 7, 197,{ 4066,60 },{ 4126,82 },{ 4208,36 },{ 4244,93 },{ 4337,115 },{ 4208,36 }}, // Catalan/Latin/Spain
- { 24, 7, 5,{ 4066,60 },{ 4126,82 },{ 4208,36 },{ 4244,93 },{ 4337,115 },{ 4208,36 }}, // Catalan/Latin/Andorra
- { 24, 7, 74,{ 4066,60 },{ 4126,82 },{ 4208,36 },{ 4244,93 },{ 4337,115 },{ 4208,36 }}, // Catalan/Latin/France
- { 24, 7, 106,{ 4066,60 },{ 4126,82 },{ 4208,36 },{ 4244,93 },{ 4337,115 },{ 4208,36 }}, // Catalan/Latin/Italy
- { 25, 5, 44,{ 4452,39 },{ 4491,38 },{ 418,27 },{ 4452,39 },{ 4491,38 },{ 418,27 }}, // Chinese/Simplified Han/China
- { 25, 5, 97,{ 4452,39 },{ 4491,38 },{ 418,27 },{ 4452,39 },{ 4491,38 },{ 418,27 }}, // Chinese/Simplified Han/Hong Kong
- { 25, 5, 126,{ 4452,39 },{ 4491,38 },{ 418,27 },{ 4452,39 },{ 4491,38 },{ 418,27 }}, // Chinese/Simplified Han/Macau
- { 25, 5, 190,{ 4452,39 },{ 4491,38 },{ 418,27 },{ 4452,39 },{ 4491,38 },{ 418,27 }}, // Chinese/Simplified Han/Singapore
- { 25, 6, 97,{ 4452,39 },{ 4452,39 },{ 418,27 },{ 4452,39 },{ 4452,39 },{ 418,27 }}, // Chinese/Traditional Han/Hong Kong
- { 25, 6, 126,{ 4452,39 },{ 4452,39 },{ 418,27 },{ 4452,39 },{ 4452,39 },{ 418,27 }}, // Chinese/Traditional Han/Macau
- { 25, 6, 208,{ 4452,39 },{ 4452,39 },{ 418,27 },{ 4452,39 },{ 4452,39 },{ 418,27 }}, // Chinese/Traditional Han/Taiwan
- { 26, 7, 74,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Corsican/Latin/France
- { 27, 7, 54,{ 4529,49 },{ 4578,94 },{ 4672,39 },{ 4529,49 },{ 4711,98 },{ 4672,39 }}, // Croatian/Latin/Croatia
- { 27, 7, 27,{ 4529,49 },{ 4578,94 },{ 4672,39 },{ 4529,49 },{ 4711,98 },{ 4672,39 }}, // Croatian/Latin/Bosnia And Herzegowina
- { 28, 7, 57,{ 4809,48 },{ 4857,82 },{ 418,27 },{ 4809,48 },{ 4939,84 },{ 418,27 }}, // Czech/Latin/Czech Republic
- { 29, 7, 58,{ 5023,59 },{ 5082,84 },{ 134,24 },{ 5023,59 },{ 5082,84 },{ 134,24 }}, // Danish/Latin/Denmark
- { 29, 7, 86,{ 5023,59 },{ 5082,84 },{ 134,24 },{ 5023,59 },{ 5082,84 },{ 134,24 }}, // Danish/Latin/Greenland
- { 30, 7, 151,{ 5166,59 },{ 5225,88 },{ 134,24 },{ 5166,59 },{ 5225,88 },{ 134,24 }}, // Dutch/Latin/Netherlands
- { 30, 7, 12,{ 5166,59 },{ 5225,88 },{ 134,24 },{ 5166,59 },{ 5225,88 },{ 134,24 }}, // Dutch/Latin/Aruba
- { 30, 7, 21,{ 5166,59 },{ 5225,88 },{ 134,24 },{ 5166,59 },{ 5225,88 },{ 134,24 }}, // Dutch/Latin/Belgium
- { 30, 7, 152,{ 5166,59 },{ 5225,88 },{ 134,24 },{ 5166,59 },{ 5225,88 },{ 134,24 }}, // Dutch/Latin/Cura Sao
- { 30, 7, 202,{ 5166,59 },{ 5225,88 },{ 134,24 },{ 5166,59 },{ 5225,88 },{ 134,24 }}, // Dutch/Latin/Suriname
- { 30, 7, 255,{ 5166,59 },{ 5225,88 },{ 134,24 },{ 5166,59 },{ 5225,88 },{ 134,24 }}, // Dutch/Latin/Bonaire
- { 30, 7, 256,{ 5166,59 },{ 5225,88 },{ 134,24 },{ 5166,59 },{ 5225,88 },{ 134,24 }}, // Dutch/Latin/Sint Maarten
- { 31, 7, 225,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/United States
- { 31, 3, 225,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // English/Deseret/United States
- { 31, 7, 4,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/American Samoa
- { 31, 7, 7,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Anguilla
- { 31, 7, 9,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Antigua And Barbuda
- { 31, 7, 13,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Australia
- { 31, 7, 14,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Austria
- { 31, 7, 16,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Bahamas
- { 31, 7, 19,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Barbados
- { 31, 7, 21,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Belgium
- { 31, 7, 22,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Belize
- { 31, 7, 24,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Bermuda
- { 31, 7, 28,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Botswana
- { 31, 7, 31,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/British Indian Ocean Territory
- { 31, 7, 35,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Burundi
- { 31, 7, 37,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Cameroon
- { 31, 7, 38,{ 5313,59 },{ 48,86 },{ 134,24 },{ 5313,59 },{ 48,86 },{ 134,24 }}, // English/Latin/Canada
- { 31, 7, 40,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Cayman Islands
- { 31, 7, 45,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Christmas Island
- { 31, 7, 46,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Cocos Islands
- { 31, 7, 51,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Cook Islands
- { 31, 7, 56,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Cyprus
- { 31, 7, 58,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Denmark
- { 31, 7, 60,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Dominica
- { 31, 7, 67,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Eritrea
- { 31, 7, 70,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Falkland Islands
- { 31, 7, 72,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Fiji
- { 31, 7, 73,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Finland
- { 31, 7, 75,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Guernsey
- { 31, 7, 80,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Gambia
- { 31, 7, 82,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Germany
- { 31, 7, 83,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Ghana
- { 31, 7, 84,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Gibraltar
- { 31, 7, 87,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Grenada
- { 31, 7, 89,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Guam
- { 31, 7, 93,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Guyana
- { 31, 7, 97,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Hong Kong
- { 31, 7, 100,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/India
- { 31, 7, 104,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Ireland
- { 31, 7, 105,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Israel
- { 31, 7, 107,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Jamaica
- { 31, 7, 111,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Kenya
- { 31, 7, 112,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Kiribati
- { 31, 7, 120,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Lesotho
- { 31, 7, 121,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Liberia
- { 31, 7, 126,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Macau
- { 31, 7, 128,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Madagascar
- { 31, 7, 129,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Malawi
- { 31, 7, 130,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Malaysia
- { 31, 7, 133,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Malta
- { 31, 7, 134,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Marshall Islands
- { 31, 7, 137,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Mauritius
- { 31, 7, 140,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Micronesia
- { 31, 7, 144,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Montserrat
- { 31, 7, 148,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Namibia
- { 31, 7, 149,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Nauru
- { 31, 7, 151,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Netherlands
- { 31, 7, 154,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/New Zealand
- { 31, 7, 157,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Nigeria
- { 31, 7, 158,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Niue
- { 31, 7, 159,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Norfolk Island
- { 31, 7, 160,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Northern Mariana Islands
- { 31, 7, 163,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Pakistan
- { 31, 7, 164,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Palau
- { 31, 7, 167,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Papua New Guinea
- { 31, 7, 170,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Philippines
- { 31, 7, 171,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Pitcairn
- { 31, 7, 174,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Puerto Rico
- { 31, 7, 179,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Rwanda
- { 31, 7, 180,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Saint Kitts And Nevis
- { 31, 7, 181,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Saint Lucia
- { 31, 7, 182,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Saint Vincent And The Grenadines
- { 31, 7, 183,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Samoa
- { 31, 7, 188,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Seychelles
- { 31, 7, 189,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Sierra Leone
- { 31, 7, 190,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Singapore
- { 31, 7, 192,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Slovenia
- { 31, 7, 193,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Solomon Islands
- { 31, 7, 195,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/South Africa
- { 31, 7, 199,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Saint Helena
- { 31, 7, 201,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Sudan
- { 31, 7, 204,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Swaziland
- { 31, 7, 205,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Sweden
- { 31, 7, 206,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Switzerland
- { 31, 7, 210,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Tanzania
- { 31, 7, 213,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Tokelau
- { 31, 7, 214,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Tonga
- { 31, 7, 215,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Trinidad And Tobago
- { 31, 7, 219,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Turks And Caicos Islands
- { 31, 7, 220,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Tuvalu
- { 31, 7, 221,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Uganda
- { 31, 7, 223,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/United Arab Emirates
- { 31, 7, 224,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/United Kingdom
- { 31, 7, 226,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/United States Minor Outlying Islands
- { 31, 7, 229,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Vanuatu
- { 31, 7, 233,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/British Virgin Islands
- { 31, 7, 234,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/United States Virgin Islands
- { 31, 7, 239,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Zambia
- { 31, 7, 240,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Zimbabwe
- { 31, 7, 249,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Diego Garcia
- { 31, 7, 251,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Isle Of Man
- { 31, 7, 252,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Jersey
- { 31, 7, 254,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/South Sudan
- { 31, 7, 256,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Sint Maarten
- { 31, 7, 260,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/World
- { 31, 7, 261,{ 0,48 },{ 48,86 },{ 134,24 },{ 0,48 },{ 48,86 },{ 134,24 }}, // English/Latin/Europe
- { 32, 7, 260,{ 5372,48 },{ 5420,91 },{ 134,24 },{ 5372,48 },{ 5420,91 },{ 134,24 }}, // Esperanto/Latin/World
- { 33, 7, 68,{ 5511,59 },{ 5570,91 },{ 5661,24 },{ 5511,59 },{ 5570,91 },{ 5661,24 }}, // Estonian/Latin/Estonia
- { 34, 7, 71,{ 5685,48 },{ 5733,83 },{ 134,24 },{ 5816,59 },{ 5733,83 },{ 134,24 }}, // Faroese/Latin/Faroe Islands
- { 34, 7, 58,{ 5685,48 },{ 5733,83 },{ 134,24 },{ 5816,59 },{ 5733,83 },{ 134,24 }}, // Faroese/Latin/Denmark
- { 36, 7, 73,{ 5875,69 },{ 5944,105 },{ 6049,24 },{ 6073,93 },{ 6166,129 },{ 6049,24 }}, // Finnish/Latin/Finland
- { 37, 7, 74,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/France
- { 37, 7, 3,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Algeria
- { 37, 7, 21,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Belgium
- { 37, 7, 23,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Benin
- { 37, 7, 34,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Burkina Faso
- { 37, 7, 35,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Burundi
- { 37, 7, 37,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Cameroon
- { 37, 7, 38,{ 6443,64 },{ 6358,85 },{ 134,24 },{ 6443,64 },{ 6358,85 },{ 134,24 }}, // French/Latin/Canada
- { 37, 7, 41,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Central African Republic
- { 37, 7, 42,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Chad
- { 37, 7, 48,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Comoros
- { 37, 7, 49,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Congo Kinshasa
- { 37, 7, 50,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Congo Brazzaville
- { 37, 7, 53,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Ivory Coast
- { 37, 7, 59,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Djibouti
- { 37, 7, 66,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Equatorial Guinea
- { 37, 7, 76,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/French Guiana
- { 37, 7, 77,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/French Polynesia
- { 37, 7, 79,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Gabon
- { 37, 7, 88,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Guadeloupe
- { 37, 7, 91,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Guinea
- { 37, 7, 94,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Haiti
- { 37, 7, 125,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Luxembourg
- { 37, 7, 128,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Madagascar
- { 37, 7, 132,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Mali
- { 37, 7, 135,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Martinique
- { 37, 7, 136,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Mauritania
- { 37, 7, 137,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Mauritius
- { 37, 7, 138,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Mayotte
- { 37, 7, 142,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Monaco
- { 37, 7, 145,{ 6507,61 },{ 6358,85 },{ 134,24 },{ 6507,61 },{ 6358,85 },{ 134,24 }}, // French/Latin/Morocco
- { 37, 7, 153,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/New Caledonia
- { 37, 7, 156,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Niger
- { 37, 7, 176,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Reunion
- { 37, 7, 179,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Rwanda
- { 37, 7, 187,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Senegal
- { 37, 7, 188,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Seychelles
- { 37, 7, 200,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Saint Pierre And Miquelon
- { 37, 7, 206,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Switzerland
- { 37, 7, 207,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Syria
- { 37, 7, 212,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Togo
- { 37, 7, 216,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Tunisia
- { 37, 7, 229,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Vanuatu
- { 37, 7, 235,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Wallis And Futuna Islands
- { 37, 7, 244,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Saint Barthelemy
- { 37, 7, 245,{ 6295,63 },{ 6358,85 },{ 134,24 },{ 6295,63 },{ 6358,85 },{ 134,24 }}, // French/Latin/Saint Martin
- { 38, 7, 151,{ 6568,48 },{ 6616,95 },{ 134,24 },{ 6568,48 },{ 6616,95 },{ 134,24 }}, // Western Frisian/Latin/Netherlands
- { 39, 7, 224,{ 6711,61 },{ 6772,142 },{ 6914,24 },{ 6711,61 },{ 6938,167 },{ 6914,24 }}, // Gaelic/Latin/United Kingdom
- { 40, 7, 197,{ 7105,60 },{ 7165,87 },{ 7252,24 },{ 7276,60 },{ 7336,87 },{ 7423,36 }}, // Galician/Latin/Spain
- { 41, 15, 81,{ 7459,48 },{ 7507,99 },{ 7606,24 },{ 7459,48 },{ 7507,99 },{ 7606,24 }}, // Georgian/Georgian/Georgia
- { 42, 7, 82,{ 7630,48 },{ 7678,83 },{ 134,24 },{ 7761,60 },{ 7678,83 },{ 134,24 }}, // German/Latin/Germany
- { 42, 7, 14,{ 7821,48 },{ 7869,83 },{ 134,24 },{ 7952,59 },{ 7869,83 },{ 134,24 }}, // German/Latin/Austria
- { 42, 7, 21,{ 7630,48 },{ 7678,83 },{ 134,24 },{ 7761,60 },{ 7678,83 },{ 134,24 }}, // German/Latin/Belgium
- { 42, 7, 106,{ 7821,48 },{ 7869,83 },{ 134,24 },{ 7952,59 },{ 7869,83 },{ 134,24 }}, // German/Latin/Italy
- { 42, 7, 123,{ 7630,48 },{ 7678,83 },{ 134,24 },{ 7761,60 },{ 7678,83 },{ 134,24 }}, // German/Latin/Liechtenstein
- { 42, 7, 125,{ 7630,48 },{ 7678,83 },{ 134,24 },{ 7761,60 },{ 7678,83 },{ 134,24 }}, // German/Latin/Luxembourg
- { 42, 7, 206,{ 7630,48 },{ 7678,83 },{ 134,24 },{ 7761,60 },{ 7678,83 },{ 134,24 }}, // German/Latin/Switzerland
- { 43, 16, 85,{ 8011,50 },{ 8061,115 },{ 8176,24 },{ 8200,50 },{ 8250,115 },{ 8176,24 }}, // Greek/Greek/Greece
- { 43, 16, 56,{ 8011,50 },{ 8061,115 },{ 8176,24 },{ 8200,50 },{ 8250,115 },{ 8176,24 }}, // Greek/Greek/Cyprus
- { 44, 7, 86,{ 8365,50 },{ 8415,99 },{ 134,24 },{ 8365,50 },{ 8514,111 },{ 134,24 }}, // Greenlandic/Latin/Greenland
- { 45, 7, 168,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Guarani/Latin/Paraguay
- { 46, 17, 100,{ 8625,67 },{ 8692,87 },{ 8779,31 },{ 8625,67 },{ 8692,87 },{ 8779,31 }}, // Gujarati/Gujarati/India
- { 47, 7, 157,{ 8810,48 },{ 8858,85 },{ 8943,24 },{ 8810,48 },{ 8858,85 },{ 8943,24 }}, // Hausa/Latin/Nigeria
- { 47, 1, 157,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Hausa/Arabic/Nigeria
- { 47, 7, 83,{ 8810,48 },{ 8858,85 },{ 8943,24 },{ 8810,48 },{ 8858,85 },{ 8943,24 }}, // Hausa/Latin/Ghana
- { 47, 7, 156,{ 8810,48 },{ 8858,85 },{ 8943,24 },{ 8810,48 },{ 8858,85 },{ 8943,24 }}, // Hausa/Latin/Niger
- { 48, 18, 105,{ 8967,58 },{ 9025,72 },{ 418,27 },{ 8967,58 },{ 9025,72 },{ 418,27 }}, // Hebrew/Hebrew/Israel
- { 49, 13, 100,{ 9097,59 },{ 9156,73 },{ 9229,30 },{ 9097,59 },{ 9156,73 },{ 9229,30 }}, // Hindi/Devanagari/India
- { 50, 7, 98,{ 9259,64 },{ 9323,98 },{ 9421,25 },{ 9259,64 },{ 9323,98 },{ 9421,25 }}, // Hungarian/Latin/Hungary
- { 51, 7, 99,{ 9446,59 },{ 9505,82 },{ 9587,24 },{ 9446,59 },{ 9505,82 },{ 9587,24 }}, // Icelandic/Latin/Iceland
- { 52, 7, 101,{ 9611,48 },{ 9659,87 },{ 134,24 },{ 9611,48 },{ 9659,87 },{ 134,24 }}, // Indonesian/Latin/Indonesia
- { 53, 7, 260,{ 9746,48 },{ 9794,93 },{ 418,27 },{ 9746,48 },{ 9794,93 },{ 9887,24 }}, // Interlingua/Latin/World
- { 55, 44, 38,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Inuktitut/Canadian Aboriginal/Canada
- { 55, 7, 38,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Inuktitut/Latin/Canada
- { 57, 7, 104,{ 9911,62 },{ 9973,107 },{ 10080,24 },{ 9911,62 },{ 9973,107 },{ 10080,24 }}, // Irish/Latin/Ireland
- { 57, 7, 224,{ 9911,62 },{ 9973,107 },{ 10080,24 },{ 9911,62 },{ 9973,107 },{ 10080,24 }}, // Irish/Latin/United Kingdom
- { 58, 7, 106,{ 10104,48 },{ 10152,94 },{ 10246,24 },{ 10104,48 },{ 10152,94 },{ 10246,24 }}, // Italian/Latin/Italy
- { 58, 7, 184,{ 10104,48 },{ 10152,94 },{ 10246,24 },{ 10104,48 },{ 10152,94 },{ 10246,24 }}, // Italian/Latin/San Marino
- { 58, 7, 206,{ 10104,48 },{ 10152,94 },{ 10246,24 },{ 10104,48 },{ 10152,94 },{ 10246,24 }}, // Italian/Latin/Switzerland
- { 58, 7, 230,{ 10104,48 },{ 10152,94 },{ 10246,24 },{ 10104,48 },{ 10152,94 },{ 10246,24 }}, // Italian/Latin/Vatican City State
- { 59, 19, 108,{ 4452,39 },{ 4452,39 },{ 418,27 },{ 4452,39 },{ 4452,39 },{ 418,27 }}, // Japanese/Japanese/Japan
- { 60, 7, 101,{ 10270,48 },{ 9659,87 },{ 134,24 },{ 10270,48 },{ 9659,87 },{ 134,24 }}, // Javanese/Latin/Indonesia
- { 61, 21, 100,{ 10318,63 },{ 10381,87 },{ 10468,31 },{ 10499,69 },{ 10381,87 },{ 10468,31 }}, // Kannada/Kannada/India
- { 62, 1, 100,{ 10568,72 },{ 10568,72 },{ 10640,24 },{ 10568,72 },{ 10568,72 },{ 10640,24 }}, // Kashmiri/Arabic/India
- { 63, 2, 110,{ 10664,60 },{ 10724,83 },{ 10807,24 },{ 10664,60 },{ 10831,83 },{ 10807,24 }}, // Kazakh/Cyrillic/Kazakhstan
- { 64, 7, 179,{ 10914,60 },{ 10974,101 },{ 418,27 },{ 10914,60 },{ 10974,101 },{ 418,27 }}, // Kinyarwanda/Latin/Rwanda
- { 65, 2, 116,{ 11075,48 },{ 11123,80 },{ 11203,24 },{ 11227,59 },{ 11286,80 },{ 11203,24 }}, // Kirghiz/Cyrillic/Kyrgyzstan
- { 66, 22, 114,{ 11366,39 },{ 11366,39 },{ 11366,39 },{ 11366,39 },{ 11366,39 },{ 11366,39 }}, // Korean/Korean/South Korea
- { 66, 22, 113,{ 11366,39 },{ 11366,39 },{ 11366,39 },{ 11366,39 },{ 11366,39 },{ 11366,39 }}, // Korean/Korean/North Korea
- { 67, 7, 217,{ 11405,48 },{ 11453,88 },{ 11541,24 },{ 11405,48 },{ 11565,101 },{ 11541,24 }}, // Kurdish/Latin/Turkey
- { 68, 7, 35,{ 11666,60 },{ 11726,106 },{ 418,27 },{ 11666,60 },{ 11726,106 },{ 418,27 }}, // Rundi/Latin/Burundi
- { 69, 23, 117,{ 11832,61 },{ 11893,75 },{ 418,27 },{ 11832,61 },{ 11893,75 },{ 418,27 }}, // Lao/Lao/Laos
- { 71, 7, 118,{ 11968,65 },{ 12033,101 },{ 134,24 },{ 11968,65 },{ 12033,101 },{ 134,24 }}, // Latvian/Latin/Latvia
- { 72, 7, 49,{ 12134,48 },{ 12182,203 },{ 12385,24 },{ 12134,48 },{ 12182,203 },{ 12385,24 }}, // Lingala/Latin/Congo Kinshasa
- { 72, 7, 6,{ 12134,48 },{ 12182,203 },{ 12385,24 },{ 12134,48 },{ 12182,203 },{ 12385,24 }}, // Lingala/Latin/Angola
- { 72, 7, 41,{ 12134,48 },{ 12182,203 },{ 12385,24 },{ 12134,48 },{ 12182,203 },{ 12385,24 }}, // Lingala/Latin/Central African Republic
- { 72, 7, 50,{ 12134,48 },{ 12182,203 },{ 12385,24 },{ 12134,48 },{ 12182,203 },{ 12385,24 }}, // Lingala/Latin/Congo Brazzaville
- { 73, 7, 124,{ 12409,70 },{ 12479,96 },{ 12575,24 },{ 12409,70 },{ 12599,98 },{ 12575,24 }}, // Lithuanian/Latin/Lithuania
- { 74, 2, 127,{ 12697,61 },{ 12758,85 },{ 12843,24 },{ 12697,61 },{ 12758,85 },{ 12843,24 }}, // Macedonian/Cyrillic/Macedonia
- { 75, 7, 128,{ 12867,48 },{ 12915,92 },{ 134,24 },{ 12867,48 },{ 12915,92 },{ 134,24 }}, // Malagasy/Latin/Madagascar
- { 76, 7, 130,{ 13007,48 },{ 13055,82 },{ 13137,24 },{ 13007,48 },{ 13055,82 },{ 13137,24 }}, // Malay/Latin/Malaysia
- { 76, 1, 130,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Malay/Arabic/Malaysia
- { 76, 7, 32,{ 13007,48 },{ 13055,82 },{ 13137,24 },{ 13007,48 },{ 13055,82 },{ 13137,24 }}, // Malay/Latin/Brunei
- { 76, 7, 190,{ 13007,48 },{ 13055,82 },{ 13137,24 },{ 13007,48 },{ 13055,82 },{ 13137,24 }}, // Malay/Latin/Singapore
- { 77, 24, 100,{ 13161,62 },{ 13223,88 },{ 13311,32 },{ 13161,62 },{ 13223,88 },{ 13311,32 }}, // Malayalam/Malayalam/India
- { 78, 7, 133,{ 13343,48 },{ 13391,86 },{ 13477,36 },{ 13343,48 },{ 13391,86 },{ 13513,24 }}, // Maltese/Latin/Malta
- { 79, 7, 154,{ 13537,59 },{ 13596,133 },{ 13729,24 },{ 13537,59 },{ 13596,133 },{ 13729,24 }}, // Maori/Latin/New Zealand
- { 80, 13, 100,{ 13753,66 },{ 13819,86 },{ 13905,32 },{ 13753,66 },{ 13819,86 },{ 13905,32 }}, // Marathi/Devanagari/India
- { 82, 2, 143,{ 13937,99 },{ 14036,192 },{ 14228,38 },{ 13937,99 },{ 14266,192 },{ 14228,38 }}, // Mongolian/Cyrillic/Mongolia
- { 82, 8, 44,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Mongolian/Mongolian/China
- { 84, 13, 150,{ 14458,85 },{ 14458,85 },{ 14543,53 },{ 14458,85 },{ 14458,85 },{ 14596,52 }}, // Nepali/Devanagari/Nepal
- { 84, 13, 100,{ 14458,85 },{ 14458,85 },{ 14543,53 },{ 14458,85 },{ 14458,85 },{ 14596,52 }}, // Nepali/Devanagari/India
- { 85, 7, 161,{ 5685,48 },{ 14648,83 },{ 134,24 },{ 5816,59 },{ 14648,83 },{ 134,24 }}, // Norwegian Bokmal/Latin/Norway
- { 85, 7, 203,{ 5685,48 },{ 14648,83 },{ 134,24 },{ 5816,59 },{ 14648,83 },{ 134,24 }}, // Norwegian Bokmal/Latin/Svalbard And Jan Mayen Islands
- { 86, 7, 74,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Occitan/Latin/France
- { 87, 26, 100,{ 14731,86 },{ 14731,86 },{ 14817,32 },{ 14731,86 },{ 14731,86 },{ 14817,32 }}, // Oriya/Oriya/India
- { 88, 1, 1,{ 14849,68 },{ 14917,69 },{ 418,27 },{ 14986,69 },{ 14986,69 },{ 15055,24 }}, // Pashto/Arabic/Afghanistan
- { 88, 1, 163,{ 14849,68 },{ 14917,69 },{ 418,27 },{ 14986,69 },{ 14986,69 },{ 15055,24 }}, // Pashto/Arabic/Pakistan
- { 89, 1, 102,{ 15079,70 },{ 15079,70 },{ 15149,24 },{ 15173,74 },{ 15173,74 },{ 15149,24 }}, // Persian/Arabic/Iran
- { 89, 1, 1,{ 15247,68 },{ 15247,68 },{ 15055,24 },{ 15315,62 },{ 15247,68 },{ 15055,24 }}, // Persian/Arabic/Afghanistan
- { 90, 7, 172,{ 15377,48 },{ 15425,97 },{ 15522,24 },{ 15377,48 },{ 15546,99 },{ 15645,24 }}, // Polish/Latin/Poland
- { 91, 7, 30,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/Brazil
- { 91, 7, 6,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/Angola
- { 91, 7, 39,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/Cape Verde
- { 91, 7, 62,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/East Timor
- { 91, 7, 66,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/Equatorial Guinea
- { 91, 7, 92,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/Guinea Bissau
- { 91, 7, 125,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/Luxembourg
- { 91, 7, 126,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/Macau
- { 91, 7, 146,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/Mozambique
- { 91, 7, 173,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/Portugal
- { 91, 7, 185,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/Sao Tome And Principe
- { 91, 7, 206,{ 15669,60 },{ 15729,89 },{ 134,24 },{ 15669,60 },{ 15729,89 },{ 134,24 }}, // Portuguese/Latin/Switzerland
- { 92, 4, 100,{ 15818,50 },{ 15868,68 },{ 15936,28 },{ 15818,50 },{ 15868,68 },{ 15936,28 }}, // Punjabi/Gurmukhi/India
- { 92, 1, 163,{ 15964,67 },{ 15964,67 },{ 418,27 },{ 15964,67 },{ 15964,67 },{ 418,27 }}, // Punjabi/Arabic/Pakistan
- { 93, 7, 169,{ 16031,48 },{ 16079,88 },{ 418,27 },{ 16031,48 },{ 16079,88 },{ 418,27 }}, // Quechua/Latin/Peru
- { 93, 7, 26,{ 16031,48 },{ 16079,88 },{ 418,27 },{ 16031,48 },{ 16079,88 },{ 418,27 }}, // Quechua/Latin/Bolivia
- { 93, 7, 63,{ 16031,48 },{ 16079,88 },{ 418,27 },{ 16031,48 },{ 16079,88 },{ 418,27 }}, // Quechua/Latin/Ecuador
- { 94, 7, 206,{ 16167,67 },{ 16234,92 },{ 16326,24 },{ 16167,67 },{ 16350,125 },{ 16326,24 }}, // Romansh/Latin/Switzerland
- { 95, 7, 177,{ 16475,60 },{ 16535,98 },{ 16633,24 },{ 16475,60 },{ 16535,98 },{ 16633,24 }}, // Romanian/Latin/Romania
- { 95, 7, 141,{ 16475,60 },{ 16535,98 },{ 16633,24 },{ 16475,60 },{ 16535,98 },{ 16633,24 }}, // Romanian/Latin/Moldova
- { 96, 2, 178,{ 16657,62 },{ 11286,80 },{ 11203,24 },{ 16719,62 },{ 16781,82 },{ 11203,24 }}, // Russian/Cyrillic/Russia
- { 96, 2, 20,{ 16657,62 },{ 11286,80 },{ 11203,24 },{ 16719,62 },{ 16781,82 },{ 11203,24 }}, // Russian/Cyrillic/Belarus
- { 96, 2, 110,{ 16657,62 },{ 11286,80 },{ 11203,24 },{ 16719,62 },{ 16781,82 },{ 11203,24 }}, // Russian/Cyrillic/Kazakhstan
- { 96, 2, 116,{ 16657,62 },{ 11286,80 },{ 11203,24 },{ 16719,62 },{ 16781,82 },{ 11203,24 }}, // Russian/Cyrillic/Kyrgyzstan
- { 96, 2, 141,{ 16657,62 },{ 11286,80 },{ 11203,24 },{ 16719,62 },{ 16781,82 },{ 11203,24 }}, // Russian/Cyrillic/Moldova
- { 96, 2, 222,{ 16657,62 },{ 11286,80 },{ 11203,24 },{ 16719,62 },{ 16781,82 },{ 11203,24 }}, // Russian/Cyrillic/Ukraine
- { 98, 7, 41,{ 16863,48 },{ 16911,91 },{ 17002,24 },{ 16863,48 },{ 16911,91 },{ 17002,24 }}, // Sango/Latin/Central African Republic
- { 99, 13, 100,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Sanskrit/Devanagari/India
- { 100, 2, 243,{ 17026,48 },{ 17074,81 },{ 12843,24 },{ 17026,48 },{ 17074,81 },{ 12843,24 }}, // Serbian/Cyrillic/Serbia
- { 100, 2, 27,{ 17026,48 },{ 17074,81 },{ 12843,24 },{ 17026,48 },{ 17074,81 },{ 12843,24 }}, // Serbian/Cyrillic/Bosnia And Herzegowina
- { 100, 2, 242,{ 17155,50 },{ 17074,81 },{ 12843,24 },{ 17155,50 },{ 17074,81 },{ 12843,24 }}, // Serbian/Cyrillic/Montenegro
- { 100, 2, 257,{ 17155,50 },{ 17074,81 },{ 12843,24 },{ 17155,50 },{ 17074,81 },{ 12843,24 }}, // Serbian/Cyrillic/Kosovo
- { 100, 7, 27,{ 17205,48 },{ 17253,81 },{ 9887,24 },{ 17205,48 },{ 17253,81 },{ 9887,24 }}, // Serbian/Latin/Bosnia And Herzegowina
- { 100, 7, 242,{ 17334,50 },{ 17253,81 },{ 9887,24 },{ 17334,50 },{ 17253,81 },{ 9887,24 }}, // Serbian/Latin/Montenegro
- { 100, 7, 243,{ 17205,48 },{ 17253,81 },{ 9887,24 },{ 17205,48 },{ 17253,81 },{ 9887,24 }}, // Serbian/Latin/Serbia
- { 100, 7, 257,{ 17334,50 },{ 17253,81 },{ 9887,24 },{ 17334,50 },{ 17253,81 },{ 9887,24 }}, // Serbian/Latin/Kosovo
- { 101, 2, 81,{ 17384,63 },{ 17447,82 },{ 11203,24 },{ 17529,60 },{ 17589,86 },{ 11203,24 }}, // Ossetic/Cyrillic/Georgia
- { 101, 2, 178,{ 17384,63 },{ 17447,82 },{ 11203,24 },{ 17529,60 },{ 17589,86 },{ 11203,24 }}, // Ossetic/Cyrillic/Russia
- { 102, 7, 195,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Southern Sotho/Latin/South Africa
- { 103, 7, 195,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Tswana/Latin/South Africa
- { 104, 7, 240,{ 17675,48 },{ 17723,100 },{ 17823,24 },{ 17675,48 },{ 17723,100 },{ 17823,24 }}, // Shona/Latin/Zimbabwe
- { 105, 1, 163,{ 17847,72 },{ 17847,72 },{ 134,24 },{ 17847,72 },{ 17847,72 },{ 134,24 }}, // Sindhi/Arabic/Pakistan
- { 106, 32, 198,{ 17919,59 },{ 17978,96 },{ 18074,32 },{ 18106,61 },{ 17978,96 },{ 18074,32 }}, // Sinhala/Sinhala/Sri Lanka
- { 107, 7, 195,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Swati/Latin/South Africa
- { 108, 7, 191,{ 18167,48 },{ 18215,82 },{ 9887,24 },{ 18167,48 },{ 18297,89 },{ 9887,24 }}, // Slovak/Latin/Slovakia
- { 109, 7, 192,{ 18386,59 },{ 18445,86 },{ 9887,24 },{ 18386,59 },{ 18445,86 },{ 9887,24 }}, // Slovenian/Latin/Slovenia
- { 110, 7, 194,{ 18531,48 },{ 18579,92 },{ 18671,24 },{ 18531,48 },{ 18695,189 },{ 18671,24 }}, // Somali/Latin/Somalia
- { 110, 7, 59,{ 18531,48 },{ 18579,92 },{ 18671,24 },{ 18531,48 },{ 18695,189 },{ 18671,24 }}, // Somali/Latin/Djibouti
- { 110, 7, 69,{ 18531,48 },{ 18579,92 },{ 18671,24 },{ 18531,48 },{ 18695,189 },{ 18671,24 }}, // Somali/Latin/Ethiopia
- { 110, 7, 111,{ 18531,48 },{ 18579,92 },{ 18671,24 },{ 18531,48 },{ 18695,189 },{ 18671,24 }}, // Somali/Latin/Kenya
- { 111, 7, 197,{ 18884,61 },{ 18945,89 },{ 19034,24 },{ 18884,61 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Spain
- { 111, 7, 10,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Argentina
- { 111, 7, 22,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Belize
- { 111, 7, 26,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Bolivia
- { 111, 7, 30,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Brazil
- { 111, 7, 43,{ 18884,61 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Chile
- { 111, 7, 47,{ 18884,61 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Colombia
- { 111, 7, 52,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Costa Rica
- { 111, 7, 55,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Cuba
- { 111, 7, 61,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Dominican Republic
- { 111, 7, 63,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Ecuador
- { 111, 7, 65,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/El Salvador
- { 111, 7, 66,{ 18884,61 },{ 18945,89 },{ 19034,24 },{ 18884,61 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Equatorial Guinea
- { 111, 7, 90,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Guatemala
- { 111, 7, 96,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Honduras
- { 111, 7, 139,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Mexico
- { 111, 7, 155,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Nicaragua
- { 111, 7, 166,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Panama
- { 111, 7, 168,{ 18884,61 },{ 18945,89 },{ 19034,24 },{ 18884,61 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Paraguay
- { 111, 7, 169,{ 19118,60 },{ 16079,88 },{ 19034,24 },{ 19178,60 },{ 19238,88 },{ 19034,24 }}, // Spanish/Latin/Peru
- { 111, 7, 170,{ 18884,61 },{ 18945,89 },{ 19034,24 },{ 18884,61 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Philippines
- { 111, 7, 174,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Puerto Rico
- { 111, 7, 225,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/United States
- { 111, 7, 227,{ 19118,60 },{ 16079,88 },{ 19034,24 },{ 19178,60 },{ 19238,88 },{ 19034,24 }}, // Spanish/Latin/Uruguay
- { 111, 7, 231,{ 18884,61 },{ 18945,89 },{ 19034,24 },{ 18884,61 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Venezuela
- { 111, 7, 238,{ 18884,61 },{ 18945,89 },{ 19034,24 },{ 18884,61 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Canary Islands
- { 111, 7, 246,{ 19058,60 },{ 18945,89 },{ 19034,24 },{ 19058,60 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Latin America
- { 111, 7, 250,{ 18884,61 },{ 18945,89 },{ 19034,24 },{ 18884,61 },{ 18945,89 },{ 19034,24 }}, // Spanish/Latin/Ceuta And Melilla
- { 112, 7, 101,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Sundanese/Latin/Indonesia
- { 113, 7, 210,{ 19326,48 },{ 19374,84 },{ 134,24 },{ 19326,48 },{ 19374,84 },{ 134,24 }}, // Swahili/Latin/Tanzania
- { 113, 7, 49,{ 19326,48 },{ 19374,84 },{ 134,24 },{ 19326,48 },{ 19374,84 },{ 134,24 }}, // Swahili/Latin/Congo Kinshasa
- { 113, 7, 111,{ 19326,48 },{ 19374,84 },{ 134,24 },{ 19326,48 },{ 19374,84 },{ 134,24 }}, // Swahili/Latin/Kenya
- { 113, 7, 221,{ 19326,48 },{ 19374,84 },{ 134,24 },{ 19326,48 },{ 19374,84 },{ 134,24 }}, // Swahili/Latin/Uganda
- { 114, 7, 205,{ 19458,59 },{ 19517,86 },{ 134,24 },{ 19458,59 },{ 19517,86 },{ 134,24 }}, // Swedish/Latin/Sweden
- { 114, 7, 73,{ 19458,59 },{ 19517,86 },{ 134,24 },{ 19458,59 },{ 19517,86 },{ 134,24 }}, // Swedish/Latin/Finland
- { 114, 7, 248,{ 19458,59 },{ 19517,86 },{ 134,24 },{ 19458,59 },{ 19517,86 },{ 134,24 }}, // Swedish/Latin/Aland Islands
- { 115, 7, 106,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Sardinian/Latin/Italy
- { 116, 2, 209,{ 11075,48 },{ 19603,71 },{ 11203,24 },{ 11075,48 },{ 19603,71 },{ 11203,24 }}, // Tajik/Cyrillic/Tajikistan
- { 117, 27, 100,{ 19674,58 },{ 19732,86 },{ 19818,31 },{ 19674,58 },{ 19732,86 },{ 19818,31 }}, // Tamil/Tamil/India
- { 117, 27, 130,{ 19674,58 },{ 19732,86 },{ 19818,31 },{ 19674,58 },{ 19732,86 },{ 19818,31 }}, // Tamil/Tamil/Malaysia
- { 117, 27, 190,{ 19674,58 },{ 19732,86 },{ 19818,31 },{ 19674,58 },{ 19732,86 },{ 19818,31 }}, // Tamil/Tamil/Singapore
- { 117, 27, 198,{ 19674,58 },{ 19732,86 },{ 19818,31 },{ 19674,58 },{ 19732,86 },{ 19818,31 }}, // Tamil/Tamil/Sri Lanka
- { 118, 2, 178,{ 19849,62 },{ 19911,81 },{ 418,27 },{ 19849,62 },{ 19911,81 },{ 418,27 }}, // Tatar/Cyrillic/Russia
- { 119, 28, 100,{ 19992,62 },{ 20054,86 },{ 20140,31 },{ 19992,62 },{ 20054,86 },{ 20140,31 }}, // Telugu/Telugu/India
- { 120, 30, 211,{ 20171,63 },{ 20234,98 },{ 20171,63 },{ 20171,63 },{ 20234,98 },{ 20171,63 }}, // Thai/Thai/Thailand
- { 121, 31, 44,{ 2704,63 },{ 20332,159 },{ 418,27 },{ 2704,63 },{ 20491,147 },{ 418,27 }}, // Tibetan/Tibetan/China
- { 121, 31, 100,{ 2704,63 },{ 20332,159 },{ 418,27 },{ 2704,63 },{ 20491,147 },{ 418,27 }}, // Tibetan/Tibetan/India
- { 122, 14, 69,{ 20638,36 },{ 20674,54 },{ 20728,24 },{ 20638,36 },{ 20674,54 },{ 20728,24 }}, // Tigrinya/Ethiopic/Ethiopia
- { 122, 14, 67,{ 20638,36 },{ 20674,54 },{ 20728,24 },{ 20638,36 },{ 20674,54 },{ 20728,24 }}, // Tigrinya/Ethiopic/Eritrea
- { 123, 7, 214,{ 20752,51 },{ 20803,87 },{ 20890,24 },{ 20752,51 },{ 20803,87 },{ 20890,24 }}, // Tongan/Latin/Tonga
- { 124, 7, 195,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Tsonga/Latin/South Africa
- { 125, 7, 217,{ 20914,48 },{ 20962,75 },{ 21037,24 },{ 20914,48 },{ 20962,75 },{ 21037,24 }}, // Turkish/Latin/Turkey
- { 125, 7, 56,{ 20914,48 },{ 20962,75 },{ 21037,24 },{ 20914,48 },{ 20962,75 },{ 21037,24 }}, // Turkish/Latin/Cyprus
- { 126, 7, 218,{ 21061,50 },{ 21111,77 },{ 21188,24 },{ 21212,51 },{ 21263,77 },{ 21188,24 }}, // Turkmen/Latin/Turkmenistan
- { 128, 1, 44,{ 21340,84 },{ 21340,84 },{ 418,27 },{ 21340,84 },{ 21340,84 },{ 418,27 }}, // Uighur/Arabic/China
- { 129, 2, 222,{ 21424,48 },{ 21472,95 },{ 21567,24 },{ 21591,67 },{ 21658,87 },{ 21745,24 }}, // Ukrainian/Cyrillic/Ukraine
- { 130, 1, 163,{ 21769,68 },{ 21769,68 },{ 134,24 },{ 21769,68 },{ 21769,68 },{ 134,24 }}, // Urdu/Arabic/Pakistan
- { 130, 1, 100,{ 21769,68 },{ 21769,68 },{ 134,24 },{ 21769,68 },{ 21769,68 },{ 134,24 }}, // Urdu/Arabic/India
- { 131, 7, 228,{ 21837,48 },{ 21885,75 },{ 21960,24 },{ 21984,48 },{ 22032,75 },{ 21960,24 }}, // Uzbek/Latin/Uzbekistan
- { 131, 1, 1,{ 22107,47 },{ 15247,68 },{ 418,27 },{ 22107,47 },{ 15247,68 },{ 418,27 }}, // Uzbek/Arabic/Afghanistan
- { 131, 2, 228,{ 22154,48 },{ 22202,71 },{ 11203,24 },{ 22154,48 },{ 22202,71 },{ 11203,24 }}, // Uzbek/Cyrillic/Uzbekistan
- { 132, 7, 232,{ 22273,75 },{ 22348,99 },{ 418,27 },{ 22447,75 },{ 22522,99 },{ 418,27 }}, // Vietnamese/Latin/Vietnam
- { 133, 7, 260,{ 22621,48 },{ 22669,74 },{ 22743,24 },{ 22767,48 },{ 22669,74 },{ 22743,24 }}, // Volapuk/Latin/World
- { 134, 7, 224,{ 22815,52 },{ 22867,87 },{ 22954,26 },{ 22980,56 },{ 22867,87 },{ 22954,26 }}, // Welsh/Latin/United Kingdom
- { 135, 7, 187,{ 23036,47 },{ 23083,84 },{ 418,27 },{ 23036,47 },{ 23083,84 },{ 418,27 }}, // Wolof/Latin/Senegal
- { 136, 7, 195,{ 23167,48 },{ 23215,91 },{ 418,27 },{ 23167,48 },{ 23215,91 },{ 418,27 }}, // Xhosa/Latin/South Africa
- { 137, 18, 260,{ 23306,58 },{ 23364,92 },{ 418,27 },{ 23364,92 },{ 23364,92 },{ 418,27 }}, // Yiddish/Hebrew/World
- { 138, 7, 157,{ 23456,40 },{ 23496,73 },{ 23569,27 },{ 23596,55 },{ 23651,121 },{ 23569,27 }}, // Yoruba/Latin/Nigeria
- { 138, 7, 23,{ 23772,41 },{ 23813,74 },{ 23887,27 },{ 23914,56 },{ 23970,134 },{ 23887,27 }}, // Yoruba/Latin/Benin
- { 140, 7, 195,{ 24104,48 },{ 24152,91 },{ 134,24 },{ 24104,48 },{ 24152,91 },{ 24243,24 }}, // Zulu/Latin/South Africa
- { 141, 7, 161,{ 5685,48 },{ 14648,83 },{ 134,24 },{ 24267,59 },{ 14648,83 },{ 134,24 }}, // Norwegian Nynorsk/Latin/Norway
- { 142, 7, 27,{ 24326,48 },{ 24374,83 },{ 9887,24 },{ 24326,48 },{ 24374,83 },{ 9887,24 }}, // Bosnian/Latin/Bosnia And Herzegowina
- { 142, 2, 27,{ 24457,48 },{ 24505,83 },{ 12843,24 },{ 24457,48 },{ 24505,83 },{ 12843,24 }}, // Bosnian/Cyrillic/Bosnia And Herzegowina
- { 143, 29, 131,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Divehi/Thaana/Maldives
- { 144, 7, 251,{ 24588,102 },{ 24690,140 },{ 418,27 },{ 24588,102 },{ 24690,140 },{ 418,27 }}, // Manx/Latin/Isle Of Man
- { 145, 7, 224,{ 24830,46 },{ 24876,130 },{ 418,27 },{ 24830,46 },{ 24876,130 },{ 418,27 }}, // Cornish/Latin/United Kingdom
- { 146, 7, 83,{ 25006,48 },{ 25054,192 },{ 418,27 },{ 25006,48 },{ 25054,192 },{ 418,27 }}, // Akan/Latin/Ghana
- { 147, 13, 100,{ 25246,88 },{ 25246,88 },{ 418,27 },{ 25246,88 },{ 25246,88 },{ 418,27 }}, // Konkani/Devanagari/India
- { 148, 7, 83,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Ga/Latin/Ghana
- { 149, 7, 157,{ 25334,48 },{ 25382,87 },{ 25469,24 },{ 25334,48 },{ 25382,87 },{ 25469,24 }}, // Igbo/Latin/Nigeria
- { 150, 7, 111,{ 25493,48 },{ 25541,189 },{ 25730,24 },{ 25493,48 },{ 25541,189 },{ 25730,24 }}, // Kamba/Latin/Kenya
- { 151, 33, 103,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Syriac/Syriac/Iraq
- { 152, 14, 67,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Blin/Ethiopic/Eritrea
- { 153, 14, 69,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Geez/Ethiopic/Ethiopia
- { 155, 7, 69,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Sidamo/Latin/Ethiopia
- { 156, 7, 157,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Atsam/Latin/Nigeria
- { 157, 14, 67,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Tigre/Ethiopic/Eritrea
- { 158, 7, 157,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Jju/Latin/Nigeria
- { 159, 7, 106,{ 25754,48 },{ 25802,77 },{ 25879,24 },{ 25754,48 },{ 25802,77 },{ 25879,24 }}, // Friulian/Latin/Italy
- { 160, 7, 195,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Venda/Latin/South Africa
- { 161, 7, 83,{ 25903,48 },{ 25951,87 },{ 26038,24 },{ 25903,48 },{ 25951,87 },{ 26038,24 }}, // Ewe/Latin/Ghana
- { 161, 7, 212,{ 25903,48 },{ 25951,87 },{ 26038,24 },{ 25903,48 },{ 25951,87 },{ 26038,24 }}, // Ewe/Latin/Togo
- { 162, 14, 69,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Walamo/Ethiopic/Ethiopia
- { 163, 7, 225,{ 26062,59 },{ 26121,95 },{ 418,27 },{ 26062,59 },{ 26121,95 },{ 418,27 }}, // Hawaiian/Latin/United States
- { 164, 7, 157,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Tyap/Latin/Nigeria
- { 165, 7, 129,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Nyanja/Latin/Malawi
- { 166, 7, 170,{ 26216,48 },{ 26264,88 },{ 26352,38 },{ 26216,48 },{ 26264,88 },{ 26216,48 }}, // Filipino/Latin/Philippines
- { 167, 7, 206,{ 7630,48 },{ 26390,86 },{ 134,24 },{ 7630,48 },{ 26390,86 },{ 134,24 }}, // Swiss German/Latin/Switzerland
- { 167, 7, 74,{ 7630,48 },{ 26390,86 },{ 134,24 },{ 7630,48 },{ 26390,86 },{ 134,24 }}, // Swiss German/Latin/France
- { 167, 7, 123,{ 7630,48 },{ 26390,86 },{ 134,24 },{ 7630,48 },{ 26390,86 },{ 134,24 }}, // Swiss German/Latin/Liechtenstein
- { 168, 34, 44,{ 26476,38 },{ 26476,38 },{ 418,27 },{ 26476,38 },{ 26476,38 },{ 418,27 }}, // Sichuan Yi/Yi/China
- { 169, 7, 121,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Kpelle/Latin/Liberia
- { 170, 7, 82,{ 26514,59 },{ 26573,85 },{ 134,24 },{ 26514,59 },{ 26573,85 },{ 134,24 }}, // Low German/Latin/Germany
- { 170, 7, 151,{ 26514,59 },{ 26573,85 },{ 134,24 },{ 26514,59 },{ 26573,85 },{ 134,24 }}, // Low German/Latin/Netherlands
- { 171, 7, 195,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // South Ndebele/Latin/South Africa
- { 172, 7, 195,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Northern Sotho/Latin/South Africa
- { 173, 7, 161,{ 26658,59 },{ 26717,145 },{ 26862,24 },{ 26658,59 },{ 26717,145 },{ 26862,24 }}, // Northern Sami/Latin/Norway
- { 173, 7, 73,{ 26886,60 },{ 26717,145 },{ 26862,24 },{ 26886,60 },{ 26717,145 },{ 26862,24 }}, // Northern Sami/Latin/Finland
- { 173, 7, 205,{ 26658,59 },{ 26717,145 },{ 26862,24 },{ 26658,59 },{ 26717,145 },{ 26862,24 }}, // Northern Sami/Latin/Sweden
- { 174, 7, 208,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Taroko/Latin/Taiwan
- { 175, 7, 111,{ 26946,48 },{ 26994,88 },{ 27082,24 },{ 26946,48 },{ 26994,88 },{ 27082,24 }}, // Gusii/Latin/Kenya
- { 176, 7, 111,{ 27106,48 },{ 27154,221 },{ 27375,24 },{ 27106,48 },{ 27154,221 },{ 27375,24 }}, // Taita/Latin/Kenya
- { 177, 7, 187,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Senegal
- { 177, 7, 34,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Burkina Faso
- { 177, 7, 37,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Cameroon
- { 177, 7, 80,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Gambia
- { 177, 7, 83,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Ghana
- { 177, 7, 91,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Guinea
- { 177, 7, 92,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Guinea Bissau
- { 177, 7, 121,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Liberia
- { 177, 7, 136,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Mauritania
- { 177, 7, 156,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Niger
- { 177, 7, 157,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Nigeria
- { 177, 7, 189,{ 27399,48 },{ 27447,77 },{ 27524,24 },{ 27399,48 },{ 27447,77 },{ 27524,24 }}, // Fulah/Latin/Sierra Leone
- { 177, 134, 91,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Fulah/Adlam/Guinea
- { 178, 7, 111,{ 27548,48 },{ 27596,185 },{ 27781,24 },{ 27548,48 },{ 27596,185 },{ 27781,24 }}, // Kikuyu/Latin/Kenya
- { 179, 7, 111,{ 27805,48 },{ 27853,173 },{ 28026,24 },{ 27805,48 },{ 27853,173 },{ 28026,24 }}, // Samburu/Latin/Kenya
- { 180, 7, 146,{ 28050,48 },{ 28098,88 },{ 134,24 },{ 28050,48 },{ 28098,88 },{ 134,24 }}, // Sena/Latin/Mozambique
- { 181, 7, 240,{ 28186,52 },{ 28238,112 },{ 28350,24 },{ 28186,52 },{ 28238,112 },{ 28350,24 }}, // North Ndebele/Latin/Zimbabwe
- { 182, 7, 210,{ 28374,39 },{ 28413,194 },{ 28607,24 },{ 28374,39 },{ 28413,194 },{ 28607,24 }}, // Rombo/Latin/Tanzania
- { 183, 9, 145,{ 28631,48 },{ 28679,81 },{ 28760,24 },{ 28631,48 },{ 28679,81 },{ 28760,24 }}, // Tachelhit/Tifinagh/Morocco
- { 183, 7, 145,{ 28784,48 },{ 28832,81 },{ 28913,24 },{ 28784,48 },{ 28832,81 },{ 28913,24 }}, // Tachelhit/Latin/Morocco
- { 184, 7, 3,{ 28937,48 },{ 28985,82 },{ 29067,24 },{ 29091,48 },{ 29139,84 },{ 29223,24 }}, // Kabyle/Latin/Algeria
- { 185, 7, 221,{ 29247,48 },{ 29295,152 },{ 134,24 },{ 29247,48 },{ 29295,152 },{ 134,24 }}, // Nyankole/Latin/Uganda
- { 186, 7, 210,{ 29447,48 },{ 29495,254 },{ 29749,24 },{ 29447,48 },{ 29495,254 },{ 29749,24 }}, // Bena/Latin/Tanzania
- { 187, 7, 210,{ 19326,48 },{ 29773,87 },{ 134,24 },{ 19326,48 },{ 29773,87 },{ 134,24 }}, // Vunjo/Latin/Tanzania
- { 188, 7, 132,{ 29860,47 },{ 29907,92 },{ 29999,24 },{ 29860,47 },{ 29907,92 },{ 29999,24 }}, // Bambara/Latin/Mali
- { 188, 75, 132,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Bambara/Nko/Mali
- { 189, 7, 111,{ 30023,48 },{ 30071,207 },{ 30278,24 },{ 30023,48 },{ 30071,207 },{ 30278,24 }}, // Embu/Latin/Kenya
- { 190, 12, 225,{ 30302,36 },{ 30338,58 },{ 30396,24 },{ 30302,36 },{ 30338,58 },{ 30396,24 }}, // Cherokee/Cherokee/United States
- { 191, 7, 137,{ 30420,47 },{ 30467,68 },{ 30535,24 },{ 30420,47 },{ 30467,68 },{ 30535,24 }}, // Morisyen/Latin/Mauritius
- { 192, 7, 210,{ 19326,48 },{ 30559,264 },{ 134,24 },{ 19326,48 },{ 30559,264 },{ 134,24 }}, // Makonde/Latin/Tanzania
- { 193, 7, 210,{ 30823,83 },{ 30906,111 },{ 31017,24 },{ 30823,83 },{ 30906,111 },{ 31017,24 }}, // Langi/Latin/Tanzania
- { 194, 7, 221,{ 31041,48 },{ 31089,97 },{ 134,24 },{ 31041,48 },{ 31089,97 },{ 134,24 }}, // Ganda/Latin/Uganda
- { 195, 7, 239,{ 31186,48 },{ 31234,83 },{ 31317,24 },{ 31186,48 },{ 31234,83 },{ 31317,24 }}, // Bemba/Latin/Zambia
- { 196, 7, 39,{ 31341,48 },{ 31389,85 },{ 134,24 },{ 31341,48 },{ 31389,85 },{ 134,24 }}, // Kabuverdianu/Latin/Cape Verde
- { 197, 7, 111,{ 31474,48 },{ 31522,86 },{ 31608,24 },{ 31474,48 },{ 31522,86 },{ 31608,24 }}, // Meru/Latin/Kenya
- { 198, 7, 111,{ 31632,49 },{ 31681,121 },{ 31802,24 },{ 31632,49 },{ 31681,121 },{ 31802,24 }}, // Kalenjin/Latin/Kenya
- { 199, 7, 148,{ 0,48 },{ 31826,136 },{ 134,24 },{ 0,48 },{ 31826,136 },{ 134,24 }}, // Nama/Latin/Namibia
- { 200, 7, 210,{ 19326,48 },{ 29773,87 },{ 134,24 },{ 19326,48 },{ 29773,87 },{ 134,24 }}, // Machame/Latin/Tanzania
- { 201, 7, 82,{ 31962,59 },{ 32021,87 },{ 13137,24 },{ 32108,48 },{ 32021,87 },{ 13137,24 }}, // Colognian/Latin/Germany
- { 202, 7, 111,{ 32156,51 },{ 32207,132 },{ 418,27 },{ 32156,51 },{ 32207,132 },{ 418,27 }}, // Masai/Latin/Kenya
- { 202, 7, 210,{ 32156,51 },{ 32207,132 },{ 418,27 },{ 32156,51 },{ 32207,132 },{ 418,27 }}, // Masai/Latin/Tanzania
- { 203, 7, 221,{ 31041,48 },{ 31089,97 },{ 134,24 },{ 31041,48 },{ 31089,97 },{ 134,24 }}, // Soga/Latin/Uganda
- { 204, 7, 111,{ 32339,48 },{ 19374,84 },{ 134,24 },{ 32339,48 },{ 19374,84 },{ 134,24 }}, // Luyia/Latin/Kenya
- { 205, 7, 210,{ 32387,48 },{ 19374,84 },{ 134,24 },{ 32387,48 },{ 19374,84 },{ 134,24 }}, // Asu/Latin/Tanzania
- { 206, 7, 221,{ 32435,48 },{ 32483,94 },{ 32577,24 },{ 32435,48 },{ 32483,94 },{ 32577,24 }}, // Teso/Latin/Uganda
- { 206, 7, 111,{ 32435,48 },{ 32483,94 },{ 32577,24 },{ 32435,48 },{ 32483,94 },{ 32577,24 }}, // Teso/Latin/Kenya
- { 207, 7, 67,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Saho/Latin/Eritrea
- { 208, 7, 132,{ 32601,46 },{ 32647,88 },{ 32735,24 },{ 32601,46 },{ 32647,88 },{ 32735,24 }}, // Koyra Chiini/Latin/Mali
- { 209, 7, 210,{ 19326,48 },{ 29773,87 },{ 134,24 },{ 19326,48 },{ 29773,87 },{ 134,24 }}, // Rwa/Latin/Tanzania
- { 210, 7, 111,{ 32759,48 },{ 32807,186 },{ 32993,24 },{ 32759,48 },{ 32807,186 },{ 32993,24 }}, // Luo/Latin/Kenya
- { 211, 7, 221,{ 29247,48 },{ 29295,152 },{ 134,24 },{ 29247,48 },{ 29295,152 },{ 134,24 }}, // Chiga/Latin/Uganda
- { 212, 7, 145,{ 33017,48 },{ 33065,86 },{ 33151,24 },{ 33017,48 },{ 33065,86 },{ 33151,24 }}, // Central Morocco Tamazight/Latin/Morocco
- { 213, 7, 132,{ 32601,46 },{ 32647,88 },{ 32735,24 },{ 32601,46 },{ 32647,88 },{ 32735,24 }}, // Koyraboro Senni/Latin/Mali
- { 214, 7, 210,{ 19326,48 },{ 33175,84 },{ 134,24 },{ 19326,48 },{ 33175,84 },{ 134,24 }}, // Shambala/Latin/Tanzania
- { 215, 13, 100,{ 33259,88 },{ 33259,88 },{ 33347,31 },{ 33259,88 },{ 33259,88 },{ 33347,31 }}, // Bodo/Devanagari/India
- { 218, 2, 178,{ 22154,48 },{ 11286,80 },{ 11203,24 },{ 22154,48 },{ 11286,80 },{ 11203,24 }}, // Chechen/Cyrillic/Russia
- { 219, 2, 178,{ 33378,65 },{ 33443,117 },{ 33560,30 },{ 33378,65 },{ 33590,117 },{ 33560,30 }}, // Church/Cyrillic/Russia
- { 220, 2, 178,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Chuvash/Cyrillic/Russia
- { 230, 7, 49,{ 33707,49 },{ 33756,99 },{ 33855,24 },{ 33707,49 },{ 33756,99 },{ 33855,24 }}, // Luba Katanga/Latin/Congo Kinshasa
- { 231, 7, 125,{ 33879,48 },{ 33927,85 },{ 134,24 },{ 34012,59 },{ 33927,85 },{ 134,24 }}, // Luxembourgish/Latin/Luxembourg
- { 236, 7, 21,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Walloon/Latin/Belgium
- { 237, 7, 37,{ 34071,48 },{ 34119,195 },{ 34314,24 },{ 34071,48 },{ 34119,195 },{ 34314,24 }}, // Aghem/Latin/Cameroon
- { 238, 7, 37,{ 34338,48 },{ 34386,90 },{ 34476,24 },{ 34338,48 },{ 34386,90 },{ 34476,24 }}, // Basaa/Latin/Cameroon
- { 239, 7, 156,{ 32601,46 },{ 32647,88 },{ 32735,24 },{ 32601,46 },{ 32647,88 },{ 32735,24 }}, // Zarma/Latin/Niger
- { 240, 7, 37,{ 34500,49 },{ 34549,99 },{ 34648,24 },{ 34500,49 },{ 34549,99 },{ 34648,24 }}, // Duala/Latin/Cameroon
- { 241, 7, 187,{ 34672,36 },{ 34708,82 },{ 34790,24 },{ 34672,36 },{ 34708,82 },{ 34790,24 }}, // Jola Fonyi/Latin/Senegal
- { 242, 7, 37,{ 34814,50 },{ 34864,141 },{ 35005,24 },{ 34814,50 },{ 34864,141 },{ 35005,24 }}, // Ewondo/Latin/Cameroon
- { 243, 7, 37,{ 35029,39 },{ 35068,191 },{ 418,27 },{ 35029,39 },{ 35068,191 },{ 418,27 }}, // Bafia/Latin/Cameroon
- { 244, 7, 146,{ 35259,48 },{ 35307,213 },{ 35520,24 },{ 35259,48 },{ 35307,213 },{ 35520,24 }}, // Makhuwa Meetto/Latin/Mozambique
- { 245, 7, 37,{ 35544,48 },{ 35592,139 },{ 35731,24 },{ 35544,48 },{ 35592,139 },{ 35731,24 }}, // Mundang/Latin/Cameroon
- { 246, 7, 37,{ 35755,51 },{ 35806,143 },{ 418,27 },{ 35755,51 },{ 35806,143 },{ 418,27 }}, // Kwasio/Latin/Cameroon
- { 247, 7, 254,{ 35949,54 },{ 36003,96 },{ 36099,24 },{ 35949,54 },{ 36003,96 },{ 36099,24 }}, // Nuer/Latin/South Sudan
- { 248, 2, 178,{ 36123,50 },{ 36173,116 },{ 36289,24 },{ 36123,50 },{ 36313,121 },{ 36289,24 }}, // Sakha/Cyrillic/Russia
- { 249, 7, 210,{ 36434,48 },{ 36482,117 },{ 418,27 },{ 36434,48 },{ 36482,117 },{ 418,27 }}, // Sangu/Latin/Tanzania
- { 251, 7, 156,{ 32601,46 },{ 32647,88 },{ 32735,24 },{ 32601,46 },{ 32647,88 },{ 32735,24 }}, // Tasawaq/Latin/Niger
- { 252, 35, 121,{ 36599,38 },{ 36637,61 },{ 418,27 },{ 36599,38 },{ 36637,61 },{ 418,27 }}, // Vai/Vai/Liberia
- { 252, 7, 121,{ 36698,81 },{ 36698,81 },{ 418,27 },{ 36698,81 },{ 36698,81 },{ 418,27 }}, // Vai/Latin/Liberia
- { 253, 7, 206,{ 36779,48 },{ 36827,99 },{ 36926,24 },{ 36779,48 },{ 36827,99 },{ 36926,24 }}, // Walser/Latin/Switzerland
- { 254, 7, 37,{ 36950,51 },{ 37001,191 },{ 418,27 },{ 36950,51 },{ 37001,191 },{ 418,27 }}, // Yangben/Latin/Cameroon
- { 256, 7, 197,{ 37192,48 },{ 37240,85 },{ 37325,24 },{ 37349,48 },{ 37397,117 },{ 37325,24 }}, // Asturian/Latin/Spain
- { 257, 7, 37,{ 37514,174 },{ 37514,174 },{ 418,27 },{ 37514,174 },{ 37514,174 },{ 418,27 }}, // Ngomba/Latin/Cameroon
- { 258, 7, 37,{ 37688,102 },{ 37688,102 },{ 418,27 },{ 37688,102 },{ 37688,102 },{ 418,27 }}, // Kako/Latin/Cameroon
- { 259, 7, 37,{ 37790,137 },{ 37927,142 },{ 38069,36 },{ 37790,137 },{ 37927,142 },{ 38069,36 }}, // Meta/Latin/Cameroon
- { 260, 7, 37,{ 38105,165 },{ 38105,165 },{ 418,27 },{ 38105,165 },{ 38105,165 },{ 418,27 }}, // Ngiemboon/Latin/Cameroon
- { 261, 7, 197,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Aragonese/Latin/Spain
- { 290, 11, 100,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Manipuri/Bengali/India
- { 309, 100, 232,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Tai Dam/Tai Viet/Vietnam
- { 312, 7, 37,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Akoose/Latin/Cameroon
- { 313, 7, 225,{ 38270,180 },{ 38270,180 },{ 418,27 },{ 38270,180 },{ 38270,180 },{ 418,27 }}, // Lakota/Latin/United States
- { 314, 9, 145,{ 28631,48 },{ 28679,81 },{ 28760,24 },{ 28631,48 },{ 28679,81 },{ 28760,24 }}, // Standard Moroccan Tamazight/Tifinagh/Morocco
- { 315, 7, 43,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Mapuche/Latin/Chile
- { 316, 1, 103,{ 38450,105 },{ 38450,105 },{ 38555,24 },{ 38450,105 },{ 38450,105 },{ 38555,24 }}, // Central Kurdish/Arabic/Iraq
- { 316, 1, 102,{ 38450,105 },{ 38450,105 },{ 38555,24 },{ 38450,105 },{ 38450,105 },{ 38555,24 }}, // Central Kurdish/Arabic/Iran
- { 317, 7, 82,{ 38579,48 },{ 38627,85 },{ 9887,24 },{ 38712,60 },{ 38772,93 },{ 9887,24 }}, // Lower Sorbian/Latin/Germany
- { 318, 7, 82,{ 38865,48 },{ 38913,86 },{ 9887,24 },{ 38999,60 },{ 39059,93 },{ 9887,24 }}, // Upper Sorbian/Latin/Germany
- { 319, 7, 37,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Kenyang/Latin/Cameroon
- { 320, 7, 38,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Mohawk/Latin/Canada
- { 321, 75, 91,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Nko/Nko/Guinea
- { 322, 7, 260,{ 39152,48 },{ 39200,91 },{ 39291,24 },{ 39152,48 },{ 39200,91 },{ 39291,24 }}, // Prussian/Latin/World
- { 323, 7, 90,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Kiche/Latin/Guatemala
- { 324, 7, 205,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Southern Sami/Latin/Sweden
- { 325, 7, 205,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Lule Sami/Latin/Sweden
- { 326, 7, 73,{ 39315,77 },{ 39392,140 },{ 39532,25 },{ 39315,77 },{ 39392,140 },{ 39532,25 }}, // Inari Sami/Latin/Finland
- { 327, 7, 73,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Skolt Sami/Latin/Finland
- { 328, 7, 13,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Warlpiri/Latin/Australia
- { 346, 1, 102,{ 15079,70 },{ 15079,70 },{ 418,27 },{ 15079,70 },{ 15079,70 },{ 418,27 }}, // Mazanderani/Arabic/Iran
- { 349, 1, 102,{ 39557,77 },{ 39557,77 },{ 418,27 },{ 39557,77 },{ 39557,77 },{ 418,27 }}, // Northern Luri/Arabic/Iran
- { 349, 1, 103,{ 39557,77 },{ 39557,77 },{ 418,27 },{ 39557,77 },{ 39557,77 },{ 418,27 }}, // Northern Luri/Arabic/Iraq
- { 357, 6, 97,{ 4452,39 },{ 4452,39 },{ 418,27 },{ 4452,39 },{ 4452,39 },{ 418,27 }}, // Cantonese/Traditional Han/Hong Kong
- { 357, 5, 44,{ 4452,39 },{ 4491,38 },{ 418,27 },{ 4452,39 },{ 4491,38 },{ 418,27 }}, // Cantonese/Simplified Han/China
- { 358, 138, 225,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Osage/Osage/United States
- { 360, 7, 260,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Ido/Latin/World
- { 361, 7, 260,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Lojban/Latin/World
- { 362, 7, 106,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Sicilian/Latin/Italy
- { 363, 1, 102,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Southern Kurdish/Arabic/Iran
- { 364, 1, 163,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Western Balochi/Arabic/Pakistan
- { 365, 7, 170,{ 39634,46 },{ 26264,88 },{ 39680,24 },{ 39634,46 },{ 26264,88 },{ 39680,24 }}, // Cebuano/Latin/Philippines
- { 366, 2, 178,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Erzya/Cyrillic/Russia
- { 367, 7, 225,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Chickasaw/Latin/United States
- { 368, 7, 225,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Muscogee/Latin/United States
- { 369, 7, 172,{ 370,48 },{ 370,48 },{ 418,27 },{ 370,48 },{ 370,48 },{ 418,27 }}, // Silesian/Latin/Poland
- { 0, 0, 0,{ 0,0},{ 0,0},{ 0,0},{ 0,0},{ 0,0},{ 0,0}}, // trailing zeros
+ // lang script terr sLong long sShrt short sNarw narow Sizes...
+ { 1, 0, 0, 0, 0, 85, 85, 132, 155, 85, 85, 47, 47, 23, 26 },// C/AnyScript/AnyCountry
+ { 3, 7, 69, 181, 181, 291, 291, 132, 132,110,110, 47, 47, 23, 23 },// Oromo/Latin/Ethiopia
+ { 3, 7, 111, 181, 181, 291, 291, 338, 132,110,110, 47, 47, 23, 23 },// Oromo/Latin/Kenya
+ { 4, 7, 69, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Afar/Latin/Ethiopia
+ { 5, 7, 195, 408, 408, 499, 499, 132, 132, 91, 91, 58, 58, 23, 23 },// Afrikaans/Latin/South Africa
+ { 5, 7, 148, 408, 408, 499, 499, 132, 132, 91, 91, 58, 58, 23, 23 },// Afrikaans/Latin/Namibia
+ { 6, 7, 2, 557, 557, 634, 634, 683, 683, 77, 77, 49, 49, 26, 26 },// Albanian/Latin/Albania
+ { 6, 7, 127, 557, 557, 634, 634, 683, 683, 77, 77, 49, 49, 26, 26 },// Albanian/Latin/Macedonia
+ { 6, 7, 257, 557, 557, 634, 634, 683, 683, 77, 77, 49, 49, 26, 26 },// Albanian/Latin/Kosovo
+ { 7, 14, 69, 709, 709, 769, 769, 814, 814, 60, 60, 45, 45, 23, 23 },// Amharic/Ethiopic/Ethiopia
+ { 8, 1, 64, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Egypt
+ { 8, 1, 3, 934, 934, 934, 934, 1004, 1004, 70, 70, 70, 70, 23, 23 },// Arabic/Arabic/Algeria
+ { 8, 1, 17, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Bahrain
+ { 8, 1, 42, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Chad
+ { 8, 1, 48, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Comoros
+ { 8, 1, 59, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Djibouti
+ { 8, 1, 67, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Eritrea
+ { 8, 1, 103, 1027, 1027, 1027, 1118, 1209, 1209, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Iraq
+ { 8, 1, 105, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Israel
+ { 8, 1, 109, 1027, 1027, 1027, 1027, 1209, 1209, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Jordan
+ { 8, 1, 115, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Kuwait
+ { 8, 1, 119, 1027, 1027, 1027, 1027, 1209, 1209, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Lebanon
+ { 8, 1, 122, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Libya
+ { 8, 1, 136, 1232, 1232, 1232, 1232, 1303, 1303, 71, 71, 71, 71, 23, 23 },// Arabic/Arabic/Mauritania
+ { 8, 1, 145, 1326, 1326, 1326, 1326, 1395, 1395, 69, 69, 69, 69, 23, 23 },// Arabic/Arabic/Morocco
+ { 8, 1, 162, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Oman
+ { 8, 1, 165, 1027, 1027, 1027, 1027, 1209, 1209, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Palestinian Territories
+ { 8, 1, 175, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Qatar
+ { 8, 1, 186, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Saudi Arabia
+ { 8, 1, 194, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Somalia
+ { 8, 1, 201, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Sudan
+ { 8, 1, 207, 1027, 1027, 1027, 1027, 1209, 1209, 91, 91, 91, 91, 23, 23 },// Arabic/Arabic/Syria
+ { 8, 1, 216, 934, 934, 934, 934, 1004, 1004, 70, 70, 70, 70, 23, 23 },// Arabic/Arabic/Tunisia
+ { 8, 1, 223, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/United Arab Emirates
+ { 8, 1, 236, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Western Sahara
+ { 8, 1, 237, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/Yemen
+ { 8, 1, 254, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/South Sudan
+ { 8, 1, 260, 837, 837, 837, 837, 911, 911, 74, 74, 74, 74, 23, 23 },// Arabic/Arabic/World
+ { 9, 10, 11, 1418, 1511, 1616, 1616, 1663, 1663, 93,105, 47, 47, 23, 23 },// Armenian/Armenian/Armenia
+ { 10, 11, 100, 1686, 1686, 1774, 1774, 1837, 1837, 88, 88, 63, 63, 23, 23 },// Assamese/Bengali/India
+ { 12, 7, 15, 1860, 1936, 2012, 2012, 155, 155, 76, 76, 47, 47, 26, 26 },// Azerbaijani/Latin/Azerbaijan
+ { 12, 1, 102, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Azerbaijani/Arabic/Iran
+ { 12, 2, 15, 2059, 2135, 2211, 2211, 155, 155, 76, 76, 47, 47, 26, 26 },// Azerbaijani/Cyrillic/Azerbaijan
+ { 13, 2, 178, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Bashkir/Cyrillic/Russia
+ { 14, 7, 197, 2258, 2258, 2350, 2350, 2409, 2409, 92, 92, 59, 59, 23, 23 },// Basque/Latin/Spain
+ { 15, 11, 18, 2432, 2432, 2432, 2521, 2597, 2597, 89, 89, 89, 76, 32, 32 },// Bengali/Bengali/Bangladesh
+ { 15, 11, 100, 2432, 2432, 2432, 2521, 2597, 2597, 89, 89, 89, 76, 32, 32 },// Bengali/Bengali/India
+ { 16, 31, 25, 2629, 2819, 2950, 3012, 3038, 3064,190,131, 62, 26, 26, 26 },// Dzongkha/Tibetan/Bhutan
+ { 19, 7, 74, 3090, 3090, 3167, 3167, 3229, 3229, 77, 77, 62, 62, 35, 35 },// Breton/Latin/France
+ { 20, 2, 33, 3264, 3264, 3345, 3345, 3393, 3393, 81, 81, 48, 48, 23, 23 },// Bulgarian/Cyrillic/Bulgaria
+ { 21, 25, 147, 3416, 3416, 3503, 3503, 3545, 3545, 87, 87, 42, 42, 23, 23 },// Burmese/Myanmar/Myanmar
+ { 22, 2, 20, 3568, 3662, 3759, 3806, 3853, 3853, 94, 97, 47, 47, 23, 23 },// Belarusian/Cyrillic/Belarus
+ { 23, 20, 36, 3876, 3876, 3876, 3876, 3946, 3946, 70, 70, 70, 70, 23, 23 },// Khmer/Khmer/Cambodia
+ { 24, 7, 197, 3969, 4050, 4164, 4223, 4315, 4315, 81,114, 59, 92, 35, 35 },// Catalan/Latin/Spain
+ { 24, 7, 5, 3969, 4050, 4164, 4223, 4315, 4315, 81,114, 59, 92, 35, 35 },// Catalan/Latin/Andorra
+ { 24, 7, 74, 3969, 4050, 4164, 4223, 4315, 4315, 81,114, 59, 92, 35, 35 },// Catalan/Latin/France
+ { 24, 7, 106, 3969, 4050, 4164, 4223, 4315, 4315, 81,114, 59, 92, 35, 35 },// Catalan/Latin/Italy
+ { 25, 5, 44, 4350, 4350, 4387, 4387, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/China
+ { 25, 5, 97, 4350, 4350, 4387, 4387, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Hong Kong
+ { 25, 5, 126, 4350, 4350, 4387, 4387, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Macau
+ { 25, 5, 190, 4350, 4350, 4387, 4387, 155, 155, 37, 37, 38, 38, 26, 26 },// Chinese/Simplified Han/Singapore
+ { 25, 6, 97, 4387, 4387, 4387, 4387, 155, 155, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Hong Kong
+ { 25, 6, 126, 4387, 4387, 4387, 4387, 155, 155, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Macau
+ { 25, 6, 208, 4387, 4387, 4387, 4387, 155, 155, 38, 38, 38, 38, 26, 26 },// Chinese/Traditional Han/Taiwan
+ { 26, 7, 74, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Corsican/Latin/France
+ { 27, 7, 54, 4425, 4518, 4615, 4615, 4663, 4663, 93, 97, 48, 48, 38, 38 },// Croatian/Latin/Croatia
+ { 27, 7, 27, 4425, 4518, 4615, 4615, 4663, 4663, 93, 97, 48, 48, 38, 38 },// Croatian/Latin/Bosnia And Herzegowina
+ { 28, 7, 57, 4701, 4782, 4865, 4865, 155, 155, 81, 83, 47, 47, 26, 26 },// Czech/Latin/Czech Republic
+ { 29, 7, 58, 4912, 4912, 4995, 4995, 132, 132, 83, 83, 58, 58, 23, 23 },// Danish/Latin/Denmark
+ { 29, 7, 86, 4912, 4912, 4995, 4995, 132, 132, 83, 83, 58, 58, 23, 23 },// Danish/Latin/Greenland
+ { 30, 7, 151, 5053, 5053, 5140, 5140, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Netherlands
+ { 30, 7, 12, 5053, 5053, 5140, 5140, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Aruba
+ { 30, 7, 21, 5053, 5053, 5140, 5140, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Belgium
+ { 30, 7, 152, 5053, 5053, 5140, 5140, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Cura Sao
+ { 30, 7, 202, 5053, 5053, 5140, 5140, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Suriname
+ { 30, 7, 255, 5053, 5053, 5140, 5140, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Bonaire
+ { 30, 7, 256, 5053, 5053, 5140, 5140, 132, 132, 87, 87, 58, 58, 23, 23 },// Dutch/Latin/Sint Maarten
+ { 31, 7, 225, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/United States
+ { 31, 3, 225, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// English/Deseret/United States
+ { 31, 7, 4, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/American Samoa
+ { 31, 7, 7, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Anguilla
+ { 31, 7, 9, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Antigua And Barbuda
+ { 31, 7, 13, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Australia
+ { 31, 7, 14, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Austria
+ { 31, 7, 16, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Bahamas
+ { 31, 7, 19, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Barbados
+ { 31, 7, 21, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Belgium
+ { 31, 7, 22, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Belize
+ { 31, 7, 24, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Bermuda
+ { 31, 7, 28, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Botswana
+ { 31, 7, 31, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/British Indian Ocean Territory
+ { 31, 7, 35, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Burundi
+ { 31, 7, 37, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Cameroon
+ { 31, 7, 38, 0, 0, 5198, 5198, 132, 132, 85, 85, 58, 58, 23, 23 },// English/Latin/Canada
+ { 31, 7, 40, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Cayman Islands
+ { 31, 7, 45, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Christmas Island
+ { 31, 7, 46, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Cocos Islands
+ { 31, 7, 51, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Cook Islands
+ { 31, 7, 56, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Cyprus
+ { 31, 7, 58, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Denmark
+ { 31, 7, 60, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Dominica
+ { 31, 7, 67, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Eritrea
+ { 31, 7, 70, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Falkland Islands
+ { 31, 7, 72, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Fiji
+ { 31, 7, 73, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Finland
+ { 31, 7, 75, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Guernsey
+ { 31, 7, 80, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Gambia
+ { 31, 7, 82, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Germany
+ { 31, 7, 83, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Ghana
+ { 31, 7, 84, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Gibraltar
+ { 31, 7, 87, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Grenada
+ { 31, 7, 89, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Guam
+ { 31, 7, 93, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Guyana
+ { 31, 7, 97, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Hong Kong
+ { 31, 7, 100, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/India
+ { 31, 7, 104, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Ireland
+ { 31, 7, 105, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Israel
+ { 31, 7, 107, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Jamaica
+ { 31, 7, 111, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Kenya
+ { 31, 7, 112, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Kiribati
+ { 31, 7, 120, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Lesotho
+ { 31, 7, 121, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Liberia
+ { 31, 7, 126, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Macau
+ { 31, 7, 128, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Madagascar
+ { 31, 7, 129, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Malawi
+ { 31, 7, 130, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Malaysia
+ { 31, 7, 133, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Malta
+ { 31, 7, 134, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Marshall Islands
+ { 31, 7, 137, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Mauritius
+ { 31, 7, 140, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Micronesia
+ { 31, 7, 144, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Montserrat
+ { 31, 7, 148, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Namibia
+ { 31, 7, 149, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Nauru
+ { 31, 7, 151, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Netherlands
+ { 31, 7, 154, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/New Zealand
+ { 31, 7, 157, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Nigeria
+ { 31, 7, 158, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Niue
+ { 31, 7, 159, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Norfolk Island
+ { 31, 7, 160, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Northern Mariana Islands
+ { 31, 7, 163, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Pakistan
+ { 31, 7, 164, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Palau
+ { 31, 7, 167, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Papua New Guinea
+ { 31, 7, 170, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Philippines
+ { 31, 7, 171, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Pitcairn
+ { 31, 7, 174, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Puerto Rico
+ { 31, 7, 179, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Rwanda
+ { 31, 7, 180, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Saint Kitts And Nevis
+ { 31, 7, 181, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Saint Lucia
+ { 31, 7, 182, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Saint Vincent And The Grenadines
+ { 31, 7, 183, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Samoa
+ { 31, 7, 188, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Seychelles
+ { 31, 7, 189, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Sierra Leone
+ { 31, 7, 190, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Singapore
+ { 31, 7, 192, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Slovenia
+ { 31, 7, 193, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Solomon Islands
+ { 31, 7, 195, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/South Africa
+ { 31, 7, 199, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Saint Helena
+ { 31, 7, 201, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Sudan
+ { 31, 7, 204, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Swaziland
+ { 31, 7, 205, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Sweden
+ { 31, 7, 206, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Switzerland
+ { 31, 7, 210, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Tanzania
+ { 31, 7, 213, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Tokelau
+ { 31, 7, 214, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Tonga
+ { 31, 7, 215, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Trinidad And Tobago
+ { 31, 7, 219, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Turks And Caicos Islands
+ { 31, 7, 220, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Tuvalu
+ { 31, 7, 221, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Uganda
+ { 31, 7, 223, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/United Arab Emirates
+ { 31, 7, 224, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/United Kingdom
+ { 31, 7, 226, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/United States Minor Outlying Islands
+ { 31, 7, 229, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Vanuatu
+ { 31, 7, 233, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/British Virgin Islands
+ { 31, 7, 234, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/United States Virgin Islands
+ { 31, 7, 239, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Zambia
+ { 31, 7, 240, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Zimbabwe
+ { 31, 7, 249, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Diego Garcia
+ { 31, 7, 251, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Isle Of Man
+ { 31, 7, 252, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Jersey
+ { 31, 7, 254, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/South Sudan
+ { 31, 7, 256, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Sint Maarten
+ { 31, 7, 260, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/World
+ { 31, 7, 261, 0, 0, 85, 85, 132, 132, 85, 85, 47, 47, 23, 23 },// English/Latin/Europe
+ { 32, 7, 260, 5256, 5256, 5346, 5346, 132, 132, 90, 90, 47, 47, 23, 23 },// Esperanto/Latin/World
+ { 33, 7, 68, 5393, 5393, 5483, 5483, 5541, 5541, 90, 90, 58, 58, 23, 23 },// Estonian/Latin/Estonia
+ { 34, 7, 71, 5564, 5564, 5646, 5693, 132, 132, 82, 82, 47, 58, 23, 23 },// Faroese/Latin/Faroe Islands
+ { 34, 7, 58, 5564, 5564, 5646, 5693, 132, 132, 82, 82, 47, 58, 23, 23 },// Faroese/Latin/Denmark
+ { 36, 7, 73, 5751, 5855, 5983, 6051, 6143, 6143,104,128, 68, 92, 23, 23 },// Finnish/Latin/Finland
+ { 37, 7, 74, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/France
+ { 37, 7, 3, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Algeria
+ { 37, 7, 21, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Belgium
+ { 37, 7, 23, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Benin
+ { 37, 7, 34, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Burkina Faso
+ { 37, 7, 35, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Burundi
+ { 37, 7, 37, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Cameroon
+ { 37, 7, 38, 6166, 6166, 6312, 6312, 132, 132, 84, 84, 63, 63, 23, 23 },// French/Latin/Canada
+ { 37, 7, 41, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Central African Republic
+ { 37, 7, 42, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Chad
+ { 37, 7, 48, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Comoros
+ { 37, 7, 49, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Congo Kinshasa
+ { 37, 7, 50, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Congo Brazzaville
+ { 37, 7, 53, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Ivory Coast
+ { 37, 7, 59, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Djibouti
+ { 37, 7, 66, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Equatorial Guinea
+ { 37, 7, 76, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/French Guiana
+ { 37, 7, 77, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/French Polynesia
+ { 37, 7, 79, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Gabon
+ { 37, 7, 88, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Guadeloupe
+ { 37, 7, 91, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Guinea
+ { 37, 7, 94, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Haiti
+ { 37, 7, 125, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Luxembourg
+ { 37, 7, 128, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Madagascar
+ { 37, 7, 132, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mali
+ { 37, 7, 135, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Martinique
+ { 37, 7, 136, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mauritania
+ { 37, 7, 137, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mauritius
+ { 37, 7, 138, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Mayotte
+ { 37, 7, 142, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Monaco
+ { 37, 7, 145, 6166, 6166, 6375, 6375, 132, 132, 84, 84, 60, 60, 23, 23 },// French/Latin/Morocco
+ { 37, 7, 153, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/New Caledonia
+ { 37, 7, 156, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Niger
+ { 37, 7, 176, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Reunion
+ { 37, 7, 179, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Rwanda
+ { 37, 7, 187, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Senegal
+ { 37, 7, 188, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Seychelles
+ { 37, 7, 200, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Saint Pierre And Miquelon
+ { 37, 7, 206, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Switzerland
+ { 37, 7, 207, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Syria
+ { 37, 7, 212, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Togo
+ { 37, 7, 216, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Tunisia
+ { 37, 7, 229, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Vanuatu
+ { 37, 7, 235, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Wallis And Futuna Islands
+ { 37, 7, 244, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Saint Barthelemy
+ { 37, 7, 245, 6166, 6166, 6250, 6250, 132, 132, 84, 84, 62, 62, 23, 23 },// French/Latin/Saint Martin
+ { 38, 7, 151, 6435, 6435, 6529, 6529, 132, 132, 94, 94, 47, 47, 23, 23 },// Western Frisian/Latin/Netherlands
+ { 39, 7, 224, 6576, 6717, 6883, 6883, 6943, 6943,141,166, 60, 60, 23, 23 },// Gaelic/Latin/United Kingdom
+ { 40, 7, 197, 6966, 7052, 7138, 7197, 7256, 7279, 86, 86, 59, 59, 23, 35 },// Galician/Latin/Spain
+ { 41, 15, 81, 7314, 7314, 7412, 7412, 7459, 7459, 98, 98, 47, 47, 23, 23 },// Georgian/Georgian/Georgia
+ { 42, 7, 82, 7482, 7482, 7564, 7611, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Germany
+ { 42, 7, 14, 7670, 7670, 7752, 7799, 132, 132, 82, 82, 47, 58, 23, 23 },// German/Latin/Austria
+ { 42, 7, 21, 7482, 7482, 7564, 7611, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Belgium
+ { 42, 7, 106, 7670, 7670, 7752, 7799, 132, 132, 82, 82, 47, 58, 23, 23 },// German/Latin/Italy
+ { 42, 7, 123, 7482, 7482, 7564, 7611, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Liechtenstein
+ { 42, 7, 125, 7482, 7482, 7564, 7611, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Luxembourg
+ { 42, 7, 206, 7482, 7482, 7564, 7611, 132, 132, 82, 82, 47, 59, 23, 23 },// German/Latin/Switzerland
+ { 43, 16, 85, 7857, 7971, 8085, 8134, 8183, 8183,114,114, 49, 49, 23, 23 },// Greek/Greek/Greece
+ { 43, 16, 56, 7857, 7971, 8085, 8134, 8183, 8183,114,114, 49, 49, 23, 23 },// Greek/Greek/Cyprus
+ { 44, 7, 86, 8206, 8304, 8414, 8414, 132, 132, 98,110, 49, 49, 23, 23 },// Greenlandic/Latin/Greenland
+ { 45, 7, 168, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Guarani/Latin/Paraguay
+ { 46, 17, 100, 8463, 8463, 8549, 8549, 8615, 8615, 86, 86, 66, 66, 30, 30 },// Gujarati/Gujarati/India
+ { 47, 7, 157, 8645, 8645, 8729, 8729, 8776, 8776, 84, 84, 47, 47, 23, 23 },// Hausa/Latin/Nigeria
+ { 47, 1, 157, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Hausa/Arabic/Nigeria
+ { 47, 7, 83, 8645, 8645, 8729, 8729, 8776, 8776, 84, 84, 47, 47, 23, 23 },// Hausa/Latin/Ghana
+ { 47, 7, 156, 8645, 8645, 8729, 8729, 8776, 8776, 84, 84, 47, 47, 23, 23 },// Hausa/Latin/Niger
+ { 48, 18, 105, 8799, 8799, 8870, 8870, 155, 155, 71, 71, 57, 57, 26, 26 },// Hebrew/Hebrew/Israel
+ { 49, 13, 100, 8927, 8927, 8999, 8999, 9057, 9057, 72, 72, 58, 58, 29, 29 },// Hindi/Devanagari/India
+ { 50, 7, 98, 9086, 9086, 9183, 9183, 9246, 9246, 97, 97, 63, 63, 24, 24 },// Hungarian/Latin/Hungary
+ { 51, 7, 99, 9270, 9270, 9351, 9351, 9409, 9409, 81, 81, 58, 58, 23, 23 },// Icelandic/Latin/Iceland
+ { 52, 7, 101, 9432, 9432, 9518, 9518, 132, 132, 86, 86, 47, 47, 23, 23 },// Indonesian/Latin/Indonesia
+ { 53, 7, 260, 9565, 9565, 9657, 9657, 155, 9704, 92, 92, 47, 47, 26, 23 },// Interlingua/Latin/World
+ { 55, 44, 38, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Inuktitut/Canadian Aboriginal/Canada
+ { 55, 7, 38, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Inuktitut/Latin/Canada
+ { 57, 7, 104, 9727, 9727, 9833, 9833, 9894, 9894,106,106, 61, 61, 23, 23 },// Irish/Latin/Ireland
+ { 57, 7, 224, 9727, 9727, 9833, 9833, 9894, 9894,106,106, 61, 61, 23, 23 },// Irish/Latin/United Kingdom
+ { 58, 7, 106, 9917, 9917,10010,10010,10057,10057, 93, 93, 47, 47, 23, 23 },// Italian/Latin/Italy
+ { 58, 7, 184, 9917, 9917,10010,10010,10057,10057, 93, 93, 47, 47, 23, 23 },// Italian/Latin/San Marino
+ { 58, 7, 206, 9917, 9917,10010,10010,10057,10057, 93, 93, 47, 47, 23, 23 },// Italian/Latin/Switzerland
+ { 58, 7, 230, 9917, 9917,10010,10010,10057,10057, 93, 93, 47, 47, 23, 23 },// Italian/Latin/Vatican City State
+ { 59, 19, 108, 4387, 4387, 4387, 4387, 155, 155, 38, 38, 38, 38, 26, 26 },// Japanese/Japanese/Japan
+ { 60, 7, 101, 9432, 9432,10080,10080, 132, 132, 86, 86, 47, 47, 23, 23 },// Javanese/Latin/Indonesia
+ { 61, 21, 100,10127,10127,10213,10275,10343,10343, 86, 86, 62, 68, 30, 30 },// Kannada/Kannada/India
+ { 62, 1, 100,10373,10373,10373,10373,10444,10444, 71, 71, 71, 71, 23, 23 },// Kashmiri/Arabic/India
+ { 63, 2, 110,10467,10549,10631,10631,10690,10690, 82, 82, 59, 59, 23, 23 },// Kazakh/Cyrillic/Kazakhstan
+ { 64, 7, 179,10713,10713,10813,10813, 155, 155,100,100, 59, 59, 26, 26 },// Kinyarwanda/Latin/Rwanda
+ { 65, 2, 116,10872,10951,11030,11077,11135,11135, 79, 79, 47, 58, 23, 23 },// Kirghiz/Cyrillic/Kyrgyzstan
+ { 66, 22, 114,11158,11158,11158,11158,11158,11158, 38, 38, 38, 38, 38, 38 },// Korean/Korean/South Korea
+ { 66, 22, 113,11158,11158,11158,11158,11158,11158, 38, 38, 38, 38, 38, 38 },// Korean/Korean/North Korea
+ { 67, 7, 217,11196,11283,11383,11383,11430,11430, 87,100, 47, 47, 23, 23 },// Kurdish/Latin/Turkey
+ { 68, 7, 35,11453,11453,11558,11558, 155, 155,105,105, 59, 59, 26, 26 },// Rundi/Latin/Burundi
+ { 69, 23, 117,11617,11617,11691,11691, 155, 155, 74, 74, 60, 60, 26, 26 },// Lao/Lao/Laos
+ { 71, 7, 118,11751,11751,11851,11851, 132, 132,100,100, 64, 64, 23, 23 },// Latvian/Latin/Latvia
+ { 72, 7, 49,11915,11915,12117,12117,12164,12164,202,202, 47, 47, 23, 23 },// Lingala/Latin/Congo Kinshasa
+ { 72, 7, 6,11915,11915,12117,12117,12164,12164,202,202, 47, 47, 23, 23 },// Lingala/Latin/Angola
+ { 72, 7, 41,11915,11915,12117,12117,12164,12164,202,202, 47, 47, 23, 23 },// Lingala/Latin/Central African Republic
+ { 72, 7, 50,11915,11915,12117,12117,12164,12164,202,202, 47, 47, 23, 23 },// Lingala/Latin/Congo Brazzaville
+ { 73, 7, 124,12187,12282,12379,12379,12448,12448, 95, 97, 69, 69, 23, 23 },// Lithuanian/Latin/Lithuania
+ { 74, 2, 127,12471,12471,12555,12555,12615,12615, 84, 84, 60, 60, 23, 23 },// Macedonian/Cyrillic/Macedonia
+ { 75, 7, 128,12638,12638,12729,12729, 132, 132, 91, 91, 47, 47, 23, 23 },// Malagasy/Latin/Madagascar
+ { 76, 7, 130,12776,12776,12857,12857,12904,12904, 81, 81, 47, 47, 23, 23 },// Malay/Latin/Malaysia
+ { 76, 1, 130, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Malay/Arabic/Malaysia
+ { 76, 7, 32,12776,12776,12857,12857,12904,12904, 81, 81, 47, 47, 23, 23 },// Malay/Latin/Brunei
+ { 76, 7, 190,12776,12776,12857,12857,12904,12904, 81, 81, 47, 47, 23, 23 },// Malay/Latin/Singapore
+ { 77, 24, 100,12927,12927,13014,13014,13075,13075, 87, 87, 61, 61, 31, 31 },// Malayalam/Malayalam/India
+ { 78, 7, 133,13106,13106,13191,13191,13238,13273, 85, 85, 47, 47, 35, 23 },// Maltese/Latin/Malta
+ { 79, 7, 154,13296,13296,13428,13428,13486,13486,132,132, 58, 58, 23, 23 },// Maori/Latin/New Zealand
+ { 80, 13, 100,13509,13509,13594,13594,13659,13659, 85, 85, 65, 65, 31, 31 },// Marathi/Devanagari/India
+ { 82, 2, 143,13690,13881,14072,14072,14170,14170,191,191, 98, 98, 37, 37 },// Mongolian/Cyrillic/Mongolia
+ { 82, 8, 44, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Mongolian/Mongolian/China
+ { 84, 13, 150,14207,14207,14207,14207,14291,14343, 84, 84, 84, 84, 52, 51 },// Nepali/Devanagari/Nepal
+ { 84, 13, 100,14207,14207,14207,14207,14291,14343, 84, 84, 84, 84, 52, 51 },// Nepali/Devanagari/India
+ { 85, 7, 161,14394,14394, 5646, 5693, 132, 132, 82, 82, 47, 58, 23, 23 },// Norwegian Bokmal/Latin/Norway
+ { 85, 7, 203,14394,14394, 5646, 5693, 132, 132, 82, 82, 47, 58, 23, 23 },// Norwegian Bokmal/Latin/Svalbard And Jan Mayen Islands
+ { 86, 7, 74, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Occitan/Latin/France
+ { 87, 26, 100,14476,14476,14476,14476,14561,14561, 85, 85, 85, 85, 31, 31 },// Oriya/Oriya/India
+ { 88, 1, 1,14592,14660,14728,14660, 155,14795, 68, 68, 67, 68, 26, 23 },// Pashto/Arabic/Afghanistan
+ { 88, 1, 163,14592,14660,14728,14660, 155,14795, 68, 68, 67, 68, 26, 23 },// Pashto/Arabic/Pakistan
+ { 89, 1, 102,14818,14887,14818,14887,14960,14960, 69, 73, 69, 73, 23, 23 },// Persian/Arabic/Iran
+ { 89, 1, 1,14983,14983,14983,15050,14795,14795, 67, 67, 67, 61, 23, 23 },// Persian/Arabic/Afghanistan
+ { 90, 7, 172,15111,15207,15305,15305,15352,15375, 96, 98, 47, 47, 23, 23 },// Polish/Latin/Poland
+ { 91, 7, 30,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Brazil
+ { 91, 7, 6,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Angola
+ { 91, 7, 39,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Cape Verde
+ { 91, 7, 62,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/East Timor
+ { 91, 7, 66,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Equatorial Guinea
+ { 91, 7, 92,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Guinea Bissau
+ { 91, 7, 125,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Luxembourg
+ { 91, 7, 126,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Macau
+ { 91, 7, 146,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Mozambique
+ { 91, 7, 173,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Portugal
+ { 91, 7, 185,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Sao Tome And Principe
+ { 91, 7, 206,15398,15398,15486,15486, 132, 132, 88, 88, 59, 59, 23, 23 },// Portuguese/Latin/Switzerland
+ { 92, 4, 100,15545,15545,15612,15612,15661,15661, 67, 67, 49, 49, 27, 27 },// Punjabi/Gurmukhi/India
+ { 92, 1, 163,15688,15688,15688,15688, 155, 155, 66, 66, 66, 66, 26, 26 },// Punjabi/Arabic/Pakistan
+ { 93, 7, 169,15754,15754,15841,15841, 155, 155, 87, 87, 47, 47, 26, 26 },// Quechua/Latin/Peru
+ { 93, 7, 26,15754,15754,15841,15841, 155, 155, 87, 87, 47, 47, 26, 26 },// Quechua/Latin/Bolivia
+ { 93, 7, 63,15754,15754,15841,15841, 155, 155, 87, 87, 47, 47, 26, 26 },// Quechua/Latin/Ecuador
+ { 94, 7, 206,15888,15979,16103,16103,16169,16169, 91,124, 66, 66, 23, 23 },// Romansh/Latin/Switzerland
+ { 95, 7, 177,16192,16192,16289,16289,16348,16348, 97, 97, 59, 59, 23, 23 },// Romanian/Latin/Romania
+ { 95, 7, 141,16192,16192,16289,16289,16348,16348, 97, 97, 59, 59, 23, 23 },// Romanian/Latin/Moldova
+ { 96, 2, 178,10951,16371,16452,16513,11135,11135, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Russia
+ { 96, 2, 20,10951,16371,16452,16513,11135,11135, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Belarus
+ { 96, 2, 110,10951,16371,16452,16513,11135,11135, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Kazakhstan
+ { 96, 2, 116,10951,16371,16452,16513,11135,11135, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Kyrgyzstan
+ { 96, 2, 141,10951,16371,16452,16513,11135,11135, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Moldova
+ { 96, 2, 222,10951,16371,16452,16513,11135,11135, 79, 81, 61, 61, 23, 23 },// Russian/Cyrillic/Ukraine
+ { 98, 7, 41,16574,16574,16664,16664,16711,16711, 90, 90, 47, 47, 23, 23 },// Sango/Latin/Central African Republic
+ { 99, 13, 100, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Sanskrit/Devanagari/India
+ { 100, 2, 243,16734,16734,16814,16814,12615,12615, 80, 80, 47, 47, 23, 23 },// Serbian/Cyrillic/Serbia
+ { 100, 7, 27,16861,16861,16941,16941, 9704, 9704, 80, 80, 47, 47, 23, 23 },// Serbian/Latin/Bosnia And Herzegowina
+ { 100, 7, 242,16861,16861,16988,16988, 9704, 9704, 80, 80, 49, 49, 23, 23 },// Serbian/Latin/Montenegro
+ { 100, 7, 243,16861,16861,16941,16941, 9704, 9704, 80, 80, 47, 47, 23, 23 },// Serbian/Latin/Serbia
+ { 100, 2, 27,16734,16734,16814,16814,12615,12615, 80, 80, 47, 47, 23, 23 },// Serbian/Cyrillic/Bosnia And Herzegowina
+ { 100, 2, 242,16734,16734,17037,17037,12615,12615, 80, 80, 49, 49, 23, 23 },// Serbian/Cyrillic/Montenegro
+ { 100, 2, 257,16734,16734,17037,17037,12615,12615, 80, 80, 49, 49, 23, 23 },// Serbian/Cyrillic/Kosovo
+ { 100, 7, 257,16861,16861,16988,16988, 9704, 9704, 80, 80, 49, 49, 23, 23 },// Serbian/Latin/Kosovo
+ { 101, 2, 81,17086,17167,17252,17314,11135,11135, 81, 85, 62, 59, 23, 23 },// Ossetic/Cyrillic/Georgia
+ { 101, 2, 178,17086,17167,17252,17314,11135,11135, 81, 85, 62, 59, 23, 23 },// Ossetic/Cyrillic/Russia
+ { 102, 7, 195, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Southern Sotho/Latin/South Africa
+ { 103, 7, 195, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Tswana/Latin/South Africa
+ { 104, 7, 240,17373,17373,17472,17472,17519,17519, 99, 99, 47, 47, 23, 23 },// Shona/Latin/Zimbabwe
+ { 105, 1, 163,17542,17542,17542,17542, 132, 132, 71, 71, 71, 71, 23, 23 },// Sindhi/Arabic/Pakistan
+ { 106, 32, 198,17613,17613,17708,17766,17826,17826, 95, 95, 58, 60, 31, 31 },// Sinhala/Sinhala/Sri Lanka
+ { 107, 7, 195, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Swati/Latin/South Africa
+ { 108, 7, 191,17857,17938,18026,18026, 9704, 9704, 81, 88, 47, 47, 23, 23 },// Slovak/Latin/Slovakia
+ { 109, 7, 192,18073,18073,18158,18158, 9704, 9704, 85, 85, 58, 58, 23, 23 },// Slovenian/Latin/Slovenia
+ { 110, 7, 194,18216,18307,18495,18495,18542,18542, 91,188, 47, 47, 23, 23 },// Somali/Latin/Somalia
+ { 110, 7, 59,18216,18307,18495,18495,18542,18542, 91,188, 47, 47, 23, 23 },// Somali/Latin/Djibouti
+ { 110, 7, 69,18216,18307,18495,18495,18542,18542, 91,188, 47, 47, 23, 23 },// Somali/Latin/Ethiopia
+ { 110, 7, 111,18216,18307,18495,18495,18542,18542, 91,188, 47, 47, 23, 23 },// Somali/Latin/Kenya
+ { 111, 7, 197,18565,18565,18653,18653,18713,18713, 88, 88, 60, 60, 23, 23 },// Spanish/Latin/Spain
+ { 111, 7, 10,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Argentina
+ { 111, 7, 22,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Belize
+ { 111, 7, 26,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Bolivia
+ { 111, 7, 30,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Brazil
+ { 111, 7, 43,18565,18565,18653,18736,18713,18713, 88, 88, 60, 59, 23, 23 },// Spanish/Latin/Chile
+ { 111, 7, 47,18565,18565,18653,18736,18713,18713, 88, 88, 60, 59, 23, 23 },// Spanish/Latin/Colombia
+ { 111, 7, 52,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Costa Rica
+ { 111, 7, 55,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Cuba
+ { 111, 7, 61,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Dominican Republic
+ { 111, 7, 63,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Ecuador
+ { 111, 7, 65,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/El Salvador
+ { 111, 7, 66,18565,18565,18653,18653,18713,18713, 88, 88, 60, 60, 23, 23 },// Spanish/Latin/Equatorial Guinea
+ { 111, 7, 90,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Guatemala
+ { 111, 7, 96,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Honduras
+ { 111, 7, 139,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Mexico
+ { 111, 7, 155,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Nicaragua
+ { 111, 7, 166,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Panama
+ { 111, 7, 168,18565,18565,18653,18653,18713,18713, 88, 88, 60, 60, 23, 23 },// Spanish/Latin/Paraguay
+ { 111, 7, 169,15754,18795,18882,18941,18713,18713, 87, 87, 59, 59, 23, 23 },// Spanish/Latin/Peru
+ { 111, 7, 170,18565,18565,18653,18653,18713,18713, 88, 88, 60, 60, 23, 23 },// Spanish/Latin/Philippines
+ { 111, 7, 174,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Puerto Rico
+ { 111, 7, 225,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/United States
+ { 111, 7, 227,15754,18795,18882,18941,18713,18713, 87, 87, 59, 59, 23, 23 },// Spanish/Latin/Uruguay
+ { 111, 7, 231,18565,18565,18653,18653,18713,18713, 88, 88, 60, 60, 23, 23 },// Spanish/Latin/Venezuela
+ { 111, 7, 238,18565,18565,18653,18653,18713,18713, 88, 88, 60, 60, 23, 23 },// Spanish/Latin/Canary Islands
+ { 111, 7, 246,18565,18565,18736,18736,18713,18713, 88, 88, 59, 59, 23, 23 },// Spanish/Latin/Latin America
+ { 111, 7, 250,18565,18565,18653,18653,18713,18713, 88, 88, 60, 60, 23, 23 },// Spanish/Latin/Ceuta And Melilla
+ { 112, 7, 101, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Sundanese/Latin/Indonesia
+ { 113, 7, 210,19000,19000,19083,19083, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Tanzania
+ { 113, 7, 49,19000,19000,19083,19083, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Congo Kinshasa
+ { 113, 7, 111,19000,19000,19083,19083, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Kenya
+ { 113, 7, 221,19000,19000,19083,19083, 132, 132, 83, 83, 47, 47, 23, 23 },// Swahili/Latin/Uganda
+ { 114, 7, 205,19130,19130,19215,19215, 132, 132, 85, 85, 58, 58, 23, 23 },// Swedish/Latin/Sweden
+ { 114, 7, 73,19130,19130,19215,19215, 132, 132, 85, 85, 58, 58, 23, 23 },// Swedish/Latin/Finland
+ { 114, 7, 248,19130,19130,19215,19215, 132, 132, 85, 85, 58, 58, 23, 23 },// Swedish/Latin/Aland Islands
+ { 115, 7, 106, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Sardinian/Latin/Italy
+ { 116, 2, 209,19273,19273,11030,11030,11135,11135, 70, 70, 47, 47, 23, 23 },// Tajik/Cyrillic/Tajikistan
+ { 117, 27, 100,19343,19343,19428,19428,19485,19485, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/India
+ { 117, 27, 130,19343,19343,19428,19428,19485,19485, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/Malaysia
+ { 117, 27, 190,19343,19343,19428,19428,19485,19485, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/Singapore
+ { 117, 27, 198,19343,19343,19428,19428,19485,19485, 85, 85, 57, 57, 30, 30 },// Tamil/Tamil/Sri Lanka
+ { 118, 2, 178,19515,19515,19595,19595, 155, 155, 80, 80, 61, 61, 26, 26 },// Tatar/Cyrillic/Russia
+ { 119, 28, 100,19656,19656,19741,19741,19802,19802, 85, 85, 61, 61, 30, 30 },// Telugu/Telugu/India
+ { 120, 30, 211,19832,19832,19929,19929,19929,19929, 97, 97, 62, 62, 62, 62 },// Thai/Thai/Thailand
+ { 121, 31, 44,19991,20149, 2950, 2950, 155, 155,158,146, 62, 62, 26, 26 },// Tibetan/Tibetan/China
+ { 121, 31, 100,19991,20149, 2950, 2950, 155, 155,158,146, 62, 62, 26, 26 },// Tibetan/Tibetan/India
+ { 122, 14, 69,20295,20295,20348,20348,20383,20383, 53, 53, 35, 35, 23, 23 },// Tigrinya/Ethiopic/Ethiopia
+ { 122, 14, 67,20295,20295,20348,20348,20383,20383, 53, 53, 35, 35, 23, 23 },// Tigrinya/Ethiopic/Eritrea
+ { 123, 7, 214,20406,20406,20492,20492,20542,20542, 86, 86, 50, 50, 23, 23 },// Tongan/Latin/Tonga
+ { 124, 7, 195, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Tsonga/Latin/South Africa
+ { 125, 7, 217,20565,20565,20639,20639,20686,20686, 74, 74, 47, 47, 23, 23 },// Turkish/Latin/Turkey
+ { 125, 7, 56,20565,20565,20639,20639,20686,20686, 74, 74, 47, 47, 23, 23 },// Turkish/Latin/Cyprus
+ { 126, 7, 218,20709,20785,20861,20910,20960,20960, 76, 76, 49, 50, 23, 23 },// Turkmen/Latin/Turkmenistan
+ { 128, 1, 44,20983,20983,20983,20983, 155, 155, 83, 83, 83, 83, 26, 26 },// Uighur/Arabic/China
+ { 129, 2, 222,21066,21160,21246,21293,21359,21382, 94, 86, 47, 66, 23, 23 },// Ukrainian/Cyrillic/Ukraine
+ { 130, 1, 163,21405,21405,21405,21405, 132, 132, 67, 67, 67, 67, 23, 23 },// Urdu/Arabic/Pakistan
+ { 130, 1, 100,21405,21405,21405,21405, 132, 132, 67, 67, 67, 67, 23, 23 },// Urdu/Arabic/India
+ { 131, 7, 228,21472,21546,21620,21667,21714,21714, 74, 74, 47, 47, 23, 23 },// Uzbek/Latin/Uzbekistan
+ { 131, 1, 1,14983,14983,21737,21737, 155, 155, 67, 67, 46, 46, 26, 26 },// Uzbek/Arabic/Afghanistan
+ { 131, 2, 228,21783,21783,21853,21853,11135,11135, 70, 70, 47, 47, 23, 23 },// Uzbek/Cyrillic/Uzbekistan
+ { 132, 7, 232,21900,21998,22096,22170, 155, 155, 98, 98, 74, 74, 26, 26 },// Vietnamese/Latin/Vietnam
+ { 133, 7, 260,22244,22244,22317,22364,22411,22411, 73, 73, 47, 47, 23, 23 },// Volapuk/Latin/World
+ { 134, 7, 224,22434,22434,22520,22571,22626,22626, 86, 86, 51, 55, 25, 25 },// Welsh/Latin/United Kingdom
+ { 135, 7, 187,22651,22651,22734,22734, 155, 155, 83, 83, 46, 46, 26, 26 },// Wolof/Latin/Senegal
+ { 136, 7, 195,22780,22780,22870,22870, 155, 155, 90, 90, 47, 47, 26, 26 },// Xhosa/Latin/South Africa
+ { 137, 18, 260,22917,22917,23008,22917, 155, 155, 91, 91, 57, 91, 26, 26 },// Yiddish/Hebrew/World
+ { 138, 7, 157,23065,23137,23257,23296,23350,23350, 72,120, 39, 54, 26, 26 },// Yoruba/Latin/Nigeria
+ { 138, 7, 23,23376,23449,23582,23622,23677,23677, 73,133, 40, 55, 26, 26 },// Yoruba/Latin/Benin
+ { 140, 7, 195,23703,23703,23793,23793, 132,23840, 90, 90, 47, 47, 23, 23 },// Zulu/Latin/South Africa
+ { 141, 7, 161,14394,14394, 5646,23863, 132, 132, 82, 82, 47, 58, 23, 23 },// Norwegian Nynorsk/Latin/Norway
+ { 142, 7, 27,23921,23921,24003,24003, 9704, 9704, 82, 82, 47, 47, 23, 23 },// Bosnian/Latin/Bosnia And Herzegowina
+ { 142, 2, 27,24050,24050,24132,24132,12615,12615, 82, 82, 47, 47, 23, 23 },// Bosnian/Cyrillic/Bosnia And Herzegowina
+ { 143, 29, 131, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Divehi/Thaana/Maldives
+ { 144, 7, 251,24179,24179,24318,24318, 155, 155,139,139,101,101, 26, 26 },// Manx/Latin/Isle Of Man
+ { 145, 7, 224,24419,24419,24548,24548, 155, 155,129,129, 45, 45, 26, 26 },// Cornish/Latin/United Kingdom
+ { 146, 7, 83,24593,24593,24784,24784, 155, 155,191,191, 47, 47, 26, 26 },// Akan/Latin/Ghana
+ { 147, 13, 100,24831,24831,24831,24831, 155, 155, 87, 87, 87, 87, 26, 26 },// Konkani/Devanagari/India
+ { 148, 7, 83, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Ga/Latin/Ghana
+ { 149, 7, 157,24918,24918,25004,25004,25051,25051, 86, 86, 47, 47, 23, 23 },// Igbo/Latin/Nigeria
+ { 150, 7, 111,25074,25074,25262,25262,25309,25309,188,188, 47, 47, 23, 23 },// Kamba/Latin/Kenya
+ { 151, 33, 103, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Syriac/Syriac/Iraq
+ { 152, 14, 67, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Blin/Ethiopic/Eritrea
+ { 153, 14, 69, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Geez/Ethiopic/Ethiopia
+ { 155, 7, 69, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Sidamo/Latin/Ethiopia
+ { 156, 7, 157, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Atsam/Latin/Nigeria
+ { 157, 14, 67, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Tigre/Ethiopic/Eritrea
+ { 158, 7, 157, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Jju/Latin/Nigeria
+ { 159, 7, 106,25332,25332,25408,25408,25455,25455, 76, 76, 47, 47, 23, 23 },// Friulian/Latin/Italy
+ { 160, 7, 195, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Venda/Latin/South Africa
+ { 161, 7, 83,25478,25478,25564,25564,25611,25611, 86, 86, 47, 47, 23, 23 },// Ewe/Latin/Ghana
+ { 161, 7, 212,25478,25478,25564,25564,25611,25611, 86, 86, 47, 47, 23, 23 },// Ewe/Latin/Togo
+ { 162, 14, 69, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Walamo/Ethiopic/Ethiopia
+ { 163, 7, 225,25634,25634,25728,25728, 155, 155, 94, 94, 58, 58, 26, 26 },// Hawaiian/Latin/United States
+ { 164, 7, 157, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Tyap/Latin/Nigeria
+ { 165, 7, 129, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Nyanja/Latin/Malawi
+ { 166, 7, 170,25786,25786,25873,25873,25920,25873, 87, 87, 47, 47, 37, 47 },// Filipino/Latin/Philippines
+ { 167, 7, 206,25957,25957, 7564, 7564, 132, 132, 85, 85, 47, 47, 23, 23 },// Swiss German/Latin/Switzerland
+ { 167, 7, 74,25957,25957, 7564, 7564, 132, 132, 85, 85, 47, 47, 23, 23 },// Swiss German/Latin/France
+ { 167, 7, 123,25957,25957, 7564, 7564, 132, 132, 85, 85, 47, 47, 23, 23 },// Swiss German/Latin/Liechtenstein
+ { 168, 34, 44,26042,26042,26042,26042, 155, 155, 37, 37, 37, 37, 26, 26 },// Sichuan Yi/Yi/China
+ { 169, 7, 121, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Kpelle/Latin/Liberia
+ { 170, 7, 82,26079,26079,26163,26163, 132, 132, 84, 84, 58, 58, 23, 23 },// Low German/Latin/Germany
+ { 170, 7, 151,26079,26079,26163,26163, 132, 132, 84, 84, 58, 58, 23, 23 },// Low German/Latin/Netherlands
+ { 171, 7, 195, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// South Ndebele/Latin/South Africa
+ { 172, 7, 195, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Northern Sotho/Latin/South Africa
+ { 173, 7, 161,26221,26221,26365,26365,26423,26423,144,144, 58, 58, 23, 23 },// Northern Sami/Latin/Norway
+ { 173, 7, 73,26221,26221,26446,26446,26423,26423,144,144, 59, 59, 23, 23 },// Northern Sami/Latin/Finland
+ { 173, 7, 205,26221,26221,26365,26365,26423,26423,144,144, 58, 58, 23, 23 },// Northern Sami/Latin/Sweden
+ { 174, 7, 208, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Taroko/Latin/Taiwan
+ { 175, 7, 111,26505,26505,26592,26592,26639,26639, 87, 87, 47, 47, 23, 23 },// Gusii/Latin/Kenya
+ { 176, 7, 111,26662,26662,26882,26882,26929,26929,220,220, 47, 47, 23, 23 },// Taita/Latin/Kenya
+ { 177, 7, 187,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Senegal
+ { 177, 7, 34,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Burkina Faso
+ { 177, 7, 37,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Cameroon
+ { 177, 7, 80,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Gambia
+ { 177, 7, 83,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Ghana
+ { 177, 7, 91,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Guinea
+ { 177, 7, 92,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Guinea Bissau
+ { 177, 7, 121,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Liberia
+ { 177, 7, 136,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Mauritania
+ { 177, 7, 156,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Niger
+ { 177, 7, 157,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Nigeria
+ { 177, 7, 189,26952,26952,27028,27028,27075,27075, 76, 76, 47, 47, 23, 23 },// Fulah/Latin/Sierra Leone
+ { 177, 134, 91, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Fulah/Adlam/Guinea
+ { 178, 7, 111,27098,27098,27282,27282,27329,27329,184,184, 47, 47, 23, 23 },// Kikuyu/Latin/Kenya
+ { 179, 7, 111,27352,27352,27524,27524,27571,27571,172,172, 47, 47, 23, 23 },// Samburu/Latin/Kenya
+ { 180, 7, 146,27594,27594,27681,27681, 132, 132, 87, 87, 47, 47, 23, 23 },// Sena/Latin/Mozambique
+ { 181, 7, 240,27728,27728,27839,27839,27890,27890,111,111, 51, 51, 23, 23 },// North Ndebele/Latin/Zimbabwe
+ { 182, 7, 210,27913,27913,28106,28106,28144,28144,193,193, 38, 38, 23, 23 },// Rombo/Latin/Tanzania
+ { 183, 9, 145,28167,28167,28247,28247,28294,28294, 80, 80, 47, 47, 23, 23 },// Tachelhit/Tifinagh/Morocco
+ { 183, 7, 145,28317,28317,28397,28397,28444,28444, 80, 80, 47, 47, 23, 23 },// Tachelhit/Latin/Morocco
+ { 184, 7, 3,28467,28548,28631,28678,28725,28748, 81, 83, 47, 47, 23, 23 },// Kabyle/Latin/Algeria
+ { 185, 7, 221,28771,28771,28922,28922, 132, 132,151,151, 47, 47, 23, 23 },// Nyankole/Latin/Uganda
+ { 186, 7, 210,28969,28969,29222,29222,29269,29269,253,253, 47, 47, 23, 23 },// Bena/Latin/Tanzania
+ { 187, 7, 210,29292,29292,19083,19083, 132, 132, 86, 86, 47, 47, 23, 23 },// Vunjo/Latin/Tanzania
+ { 188, 7, 132,29378,29378,29469,29469,29515,29515, 91, 91, 46, 46, 23, 23 },// Bambara/Latin/Mali
+ { 188, 75, 132, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Bambara/Nko/Mali
+ { 189, 7, 111,29538,29538,29744,29744,29791,29791,206,206, 47, 47, 23, 23 },// Embu/Latin/Kenya
+ { 190, 12, 225,29814,29814,29871,29871,29906,29906, 57, 57, 35, 35, 23, 23 },// Cherokee/Cherokee/United States
+ { 191, 7, 137,29929,29929,29996,29996,30042,30042, 67, 67, 46, 46, 23, 23 },// Morisyen/Latin/Mauritius
+ { 192, 7, 210,30065,30065,19083,19083, 132, 132,263,263, 47, 47, 23, 23 },// Makonde/Latin/Tanzania
+ { 193, 7, 210,30328,30328,30438,30438,30520,30520,110,110, 82, 82, 23, 23 },// Langi/Latin/Tanzania
+ { 194, 7, 221,30543,30543,30639,30639, 132, 132, 96, 96, 47, 47, 23, 23 },// Ganda/Latin/Uganda
+ { 195, 7, 239,30686,30686,30768,30768,30815,30815, 82, 82, 47, 47, 23, 23 },// Bemba/Latin/Zambia
+ { 196, 7, 39,30838,30838,30922,30922, 132, 132, 84, 84, 47, 47, 23, 23 },// Kabuverdianu/Latin/Cape Verde
+ { 197, 7, 111,30969,30969,31054,31054,31101,31101, 85, 85, 47, 47, 23, 23 },// Meru/Latin/Kenya
+ { 198, 7, 111,31124,31124,31244,31244,31292,31292,120,120, 48, 48, 23, 23 },// Kalenjin/Latin/Kenya
+ { 199, 7, 148,31315,31315, 85, 85, 132, 132,135,135, 47, 47, 23, 23 },// Nama/Latin/Namibia
+ { 200, 7, 210,29292,29292,19083,19083, 132, 132, 86, 86, 47, 47, 23, 23 },// Machame/Latin/Tanzania
+ { 201, 7, 82,31450,31450,31536,31594,12904,12904, 86, 86, 58, 47, 23, 23 },// Colognian/Latin/Germany
+ { 202, 7, 111,31641,31641,31772,31772, 155, 155,131,131, 50, 50, 26, 26 },// Masai/Latin/Kenya
+ { 202, 7, 210,31641,31641,31772,31772, 155, 155,131,131, 50, 50, 26, 26 },// Masai/Latin/Tanzania
+ { 203, 7, 221,30543,30543,30639,30639, 132, 132, 96, 96, 47, 47, 23, 23 },// Soga/Latin/Uganda
+ { 204, 7, 111,19000,19000,31822,31822, 132, 132, 83, 83, 47, 47, 23, 23 },// Luyia/Latin/Kenya
+ { 205, 7, 210,19000,19000,31869,31869, 132, 132, 83, 83, 47, 47, 23, 23 },// Asu/Latin/Tanzania
+ { 206, 7, 221,31916,31916,32009,32009,32056,32056, 93, 93, 47, 47, 23, 23 },// Teso/Latin/Uganda
+ { 206, 7, 111,31916,31916,32009,32009,32056,32056, 93, 93, 47, 47, 23, 23 },// Teso/Latin/Kenya
+ { 207, 7, 67, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Saho/Latin/Eritrea
+ { 208, 7, 132,32079,32079,32166,32166,32211,32211, 87, 87, 45, 45, 23, 23 },// Koyra Chiini/Latin/Mali
+ { 209, 7, 210,29292,29292,19083,19083, 132, 132, 86, 86, 47, 47, 23, 23 },// Rwa/Latin/Tanzania
+ { 210, 7, 111,32234,32234,32419,32419,32466,32466,185,185, 47, 47, 23, 23 },// Luo/Latin/Kenya
+ { 211, 7, 221,28771,28771,28922,28922, 132, 132,151,151, 47, 47, 23, 23 },// Chiga/Latin/Uganda
+ { 212, 7, 145,32489,32489,32574,32574,32621,32621, 85, 85, 47, 47, 23, 23 },// Central Morocco Tamazight/Latin/Morocco
+ { 213, 7, 132,32079,32079,32166,32166,32211,32211, 87, 87, 45, 45, 23, 23 },// Koyraboro Senni/Latin/Mali
+ { 214, 7, 210,32644,32644,19083,19083, 132, 132, 83, 83, 47, 47, 23, 23 },// Shambala/Latin/Tanzania
+ { 215, 13, 100,32727,32727,32727,32727,32814,32814, 87, 87, 87, 87, 30, 30 },// Bodo/Devanagari/India
+ { 218, 2, 178,10951,10951,21853,21853,11135,11135, 79, 79, 47, 47, 23, 23 },// Chechen/Cyrillic/Russia
+ { 219, 2, 178,32844,32960,33076,33076,33140,33140,116,116, 64, 64, 29, 29 },// Church/Cyrillic/Russia
+ { 220, 2, 178, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Chuvash/Cyrillic/Russia
+ { 230, 7, 49,33169,33169,33267,33267,33315,33315, 98, 98, 48, 48, 23, 23 },// Luba Katanga/Latin/Congo Kinshasa
+ { 231, 7, 125,33338,33338,33422,33469, 132, 132, 84, 84, 47, 58, 23, 23 },// Luxembourgish/Latin/Luxembourg
+ { 236, 7, 21, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Walloon/Latin/Belgium
+ { 237, 7, 37,33527,33527,33721,33721,33768,33768,194,194, 47, 47, 23, 23 },// Aghem/Latin/Cameroon
+ { 238, 7, 37,33791,33791,33880,33880,33927,33927, 89, 89, 47, 47, 23, 23 },// Basaa/Latin/Cameroon
+ { 239, 7, 156,32079,32079,32166,32166,32211,32211, 87, 87, 45, 45, 23, 23 },// Zarma/Latin/Niger
+ { 240, 7, 37,33950,33950,34048,34048,34096,34096, 98, 98, 48, 48, 23, 23 },// Duala/Latin/Cameroon
+ { 241, 7, 187,34119,34119,34200,34200,34235,34235, 81, 81, 35, 35, 23, 23 },// Jola Fonyi/Latin/Senegal
+ { 242, 7, 37,34258,34258,34398,34398,34447,34447,140,140, 49, 49, 23, 23 },// Ewondo/Latin/Cameroon
+ { 243, 7, 37,34470,34470,34660,34660, 155, 155,190,190, 38, 38, 26, 26 },// Bafia/Latin/Cameroon
+ { 244, 7, 146,34698,34698,34910,34910,34957,34957,212,212, 47, 47, 23, 23 },// Makhuwa Meetto/Latin/Mozambique
+ { 245, 7, 37,34980,34980,35118,35118,35165,35165,138,138, 47, 47, 23, 23 },// Mundang/Latin/Cameroon
+ { 246, 7, 37,35188,35188,35330,35330, 155, 155,142,142, 50, 50, 26, 26 },// Kwasio/Latin/Cameroon
+ { 247, 7, 254,35380,35380,35475,35475,35528,35528, 95, 95, 53, 53, 23, 23 },// Nuer/Latin/South Sudan
+ { 248, 2, 178,35551,35666,35786,35786,35835,35835,115,120, 49, 49, 23, 23 },// Sakha/Cyrillic/Russia
+ { 249, 7, 210,35858,35858,35974,35974, 155, 155,116,116, 47, 47, 26, 26 },// Sangu/Latin/Tanzania
+ { 251, 7, 156,32079,32079,32166,32166,32211,32211, 87, 87, 45, 45, 23, 23 },// Tasawaq/Latin/Niger
+ { 252, 35, 121,36021,36021,36081,36081, 155, 155, 60, 60, 37, 37, 26, 26 },// Vai/Vai/Liberia
+ { 252, 7, 121,36118,36118,36118,36118, 155, 155, 80, 80, 80, 80, 26, 26 },// Vai/Latin/Liberia
+ { 253, 7, 206,36198,36198,36296,36296,36343,36343, 98, 98, 47, 47, 23, 23 },// Walser/Latin/Switzerland
+ { 254, 7, 37,36366,36366,36556,36556, 155, 155,190,190, 50, 50, 26, 26 },// Yangben/Latin/Cameroon
+ { 256, 7, 197,36606,36690,36806,36853,36900,36900, 84,116, 47, 47, 23, 23 },// Asturian/Latin/Spain
+ { 257, 7, 37,36923,36923,36923,36923, 155, 155,173,173,173,173, 26, 26 },// Ngomba/Latin/Cameroon
+ { 258, 7, 37,37096,37096,37096,37096, 155, 155,101,101,101,101, 26, 26 },// Kako/Latin/Cameroon
+ { 259, 7, 37,37197,37197,37338,37338,37474,37474,141,141,136,136, 35, 35 },// Meta/Latin/Cameroon
+ { 260, 7, 37,37509,37509,37509,37509, 155, 155,164,164,164,164, 26, 26 },// Ngiemboon/Latin/Cameroon
+ { 261, 7, 197, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Aragonese/Latin/Spain
+ { 272, 46, 18,37673,37862,37673,38051,38218,38218,189,189,189,167, 57, 57 },// Chakma/Chakma/Bangladesh
+ { 272, 46, 100,37673,37862,37673,38051,38218,38218,189,189,189,167, 57, 57 },// Chakma/Chakma/India
+ { 290, 11, 100, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Manipuri/Bengali/India
+ { 309, 100, 232, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Tai Dam/Tai Viet/Vietnam
+ { 312, 7, 37, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Akoose/Latin/Cameroon
+ { 313, 7, 225,38275,38275,38275,38275, 155, 155,179,179,179,179, 26, 26 },// Lakota/Latin/United States
+ { 314, 9, 145,28167,28167,28247,28247,28294,28294, 80, 80, 47, 47, 23, 23 },// Standard Moroccan Tamazight/Tifinagh/Morocco
+ { 315, 7, 43, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Mapuche/Latin/Chile
+ { 316, 1, 103,38454,38454,38454,38454,38558,38558,104,104,104,104, 23, 23 },// Central Kurdish/Arabic/Iraq
+ { 316, 1, 102,38454,38454,38454,38454,38558,38558,104,104,104,104, 23, 23 },// Central Kurdish/Arabic/Iran
+ { 317, 7, 82,38581,38665,38757,38804, 9704, 9704, 84, 92, 47, 59, 23, 23 },// Lower Sorbian/Latin/Germany
+ { 318, 7, 82,38863,38948,39040,39087, 9704, 9704, 85, 92, 47, 59, 23, 23 },// Upper Sorbian/Latin/Germany
+ { 319, 7, 37, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Kenyang/Latin/Cameroon
+ { 320, 7, 38, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Mohawk/Latin/Canada
+ { 321, 75, 91, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Nko/Nko/Guinea
+ { 322, 7, 260,39146,39146,39236,39236,39283,39283, 90, 90, 47, 47, 23, 23 },// Prussian/Latin/World
+ { 323, 7, 90, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Kiche/Latin/Guatemala
+ { 324, 7, 205, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Southern Sami/Latin/Sweden
+ { 325, 7, 205, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Lule Sami/Latin/Sweden
+ { 326, 7, 73,39306,39306,39445,39445,39521,39521,139,139, 76, 76, 24, 24 },// Inari Sami/Latin/Finland
+ { 327, 7, 73, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Skolt Sami/Latin/Finland
+ { 328, 7, 13, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Warlpiri/Latin/Australia
+ { 346, 1, 102,14818,14818,14818,14818, 155, 155, 69, 69, 69, 69, 26, 26 },// Mazanderani/Arabic/Iran
+ { 349, 1, 102,39545,39545,39545,39545, 155, 155, 76, 76, 76, 76, 26, 26 },// Northern Luri/Arabic/Iran
+ { 349, 1, 103,39545,39545,39545,39545, 155, 155, 76, 76, 76, 76, 26, 26 },// Northern Luri/Arabic/Iraq
+ { 357, 6, 97, 4387, 4387, 4387, 4387, 155, 155, 38, 38, 38, 38, 26, 26 },// Cantonese/Traditional Han/Hong Kong
+ { 357, 5, 44, 4350, 4350, 4387, 4387, 155, 155, 37, 37, 38, 38, 26, 26 },// Cantonese/Simplified Han/China
+ { 358, 138, 225, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Osage/Osage/United States
+ { 360, 7, 260, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Ido/Latin/World
+ { 361, 7, 260, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Lojban/Latin/World
+ { 362, 7, 106, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Sicilian/Latin/Italy
+ { 363, 1, 102, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Southern Kurdish/Arabic/Iran
+ { 364, 1, 163, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Western Balochi/Arabic/Pakistan
+ { 365, 7, 170,25786,25786,39621,39621,39666,39666, 87, 87, 45, 45, 23, 23 },// Cebuano/Latin/Philippines
+ { 366, 2, 178, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Erzya/Cyrillic/Russia
+ { 367, 7, 225, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Chickasaw/Latin/United States
+ { 368, 7, 225, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Muscogee/Latin/United States
+ { 369, 7, 172, 361, 361, 361, 361, 155, 155, 47, 47, 47, 47, 26, 26 },// Silesian/Latin/Poland
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },// trailing zeros
};
-static const ushort months_data[] = {
-0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
-0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x63, 0x74, 0x3b,
-0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72,
-0x75, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x68, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79,
-0x3b, 0x4a, 0x75, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65,
-0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65,
-0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
-0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x31, 0x3b,
-0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31,
-0x31, 0x3b, 0x31, 0x32, 0x3b, 0x31, 0x33, 0x41, 0x6d, 0x61, 0x3b, 0x47, 0x75, 0x72, 0x3b, 0x42, 0x69, 0x74, 0x3b, 0x45,
-0x6c, 0x62, 0x3b, 0x43, 0x61, 0x6d, 0x3b, 0x57, 0x61, 0x78, 0x3b, 0x41, 0x64, 0x6f, 0x3b, 0x48, 0x61, 0x67, 0x3b, 0x46,
-0x75, 0x6c, 0x3b, 0x4f, 0x6e, 0x6b, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x4d, 0x75, 0x64, 0x3b, 0x41, 0x6d, 0x61, 0x6a, 0x6a,
-0x69, 0x69, 0x3b, 0x47, 0x75, 0x72, 0x61, 0x61, 0x6e, 0x64, 0x68, 0x61, 0x6c, 0x61, 0x3b, 0x42, 0x69, 0x74, 0x6f, 0x6f,
-0x74, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x45, 0x6c, 0x62, 0x61, 0x3b, 0x43, 0x61, 0x61, 0x6d, 0x73, 0x61, 0x3b, 0x57,
-0x61, 0x78, 0x61, 0x62, 0x61, 0x6a, 0x6a, 0x69, 0x69, 0x3b, 0x41, 0x64, 0x6f, 0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73, 0x61,
-0x3b, 0x48, 0x61, 0x67, 0x61, 0x79, 0x79, 0x61, 0x3b, 0x46, 0x75, 0x75, 0x6c, 0x62, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6e,
-0x6b, 0x6f, 0x6c, 0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x53, 0x61, 0x64, 0x61, 0x61, 0x73, 0x61, 0x3b, 0x4d,
-0x75, 0x64, 0x64, 0x65, 0x65, 0x3b, 0x41, 0x3b, 0x47, 0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x43, 0x3b, 0x57, 0x3b, 0x41, 0x3b,
-0x48, 0x3b, 0x46, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x4d, 0x30, 0x31, 0x3b, 0x4d, 0x30, 0x32, 0x3b, 0x4d, 0x30,
-0x33, 0x3b, 0x4d, 0x30, 0x34, 0x3b, 0x4d, 0x30, 0x35, 0x3b, 0x4d, 0x30, 0x36, 0x3b, 0x4d, 0x30, 0x37, 0x3b, 0x4d, 0x30,
-0x38, 0x3b, 0x4d, 0x30, 0x39, 0x3b, 0x4d, 0x31, 0x30, 0x3b, 0x4d, 0x31, 0x31, 0x3b, 0x4d, 0x31, 0x32, 0x3b, 0x31, 0x3b,
-0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31,
-0x31, 0x3b, 0x31, 0x32, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x72, 0x74, 0x2e, 0x3b,
-0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41,
-0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44,
-0x65, 0x73, 0x2e, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
-0x69, 0x65, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a,
-0x75, 0x6e, 0x69, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x65, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b,
-0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x3b,
-0x73, 0x68, 0x6b, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x3b,
-0x6b, 0x6f, 0x72, 0x72, 0x3b, 0x67, 0x75, 0x73, 0x68, 0x3b, 0x73, 0x68, 0x74, 0x3b, 0x74, 0x65, 0x74, 0x3b, 0x6e, 0xeb,
-0x6e, 0x3b, 0x64, 0x68, 0x6a, 0x3b, 0x6a, 0x61, 0x6e, 0x61, 0x72, 0x3b, 0x73, 0x68, 0x6b, 0x75, 0x72, 0x74, 0x3b, 0x6d,
-0x61, 0x72, 0x73, 0x3b, 0x70, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x73, 0x68, 0x6f,
-0x72, 0x3b, 0x6b, 0x6f, 0x72, 0x72, 0x69, 0x6b, 0x3b, 0x67, 0x75, 0x73, 0x68, 0x74, 0x3b, 0x73, 0x68, 0x74, 0x61, 0x74,
-0x6f, 0x72, 0x3b, 0x74, 0x65, 0x74, 0x6f, 0x72, 0x3b, 0x6e, 0xeb, 0x6e, 0x74, 0x6f, 0x72, 0x3b, 0x64, 0x68, 0x6a, 0x65,
-0x74, 0x6f, 0x72, 0x3b, 0x6a, 0x3b, 0x73, 0x68, 0x3b, 0x6d, 0x3b, 0x70, 0x3b, 0x6d, 0x3b, 0x71, 0x3b, 0x6b, 0x3b, 0x67,
-0x3b, 0x73, 0x68, 0x3b, 0x74, 0x3b, 0x6e, 0x3b, 0x64, 0x68, 0x3b, 0x1303, 0x1295, 0x12e9, 0x3b, 0x134c, 0x1265, 0x1229, 0x3b, 0x121b,
-0x122d, 0x127d, 0x3b, 0x12a4, 0x1355, 0x122a, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301, 0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235,
-0x3b, 0x1234, 0x1355, 0x1274, 0x3b, 0x12a6, 0x12ad, 0x1276, 0x3b, 0x1296, 0x126c, 0x121d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x3b, 0x1303, 0x1295, 0x12e9,
-0x12c8, 0x122a, 0x3b, 0x134c, 0x1265, 0x1229, 0x12c8, 0x122a, 0x3b, 0x121b, 0x122d, 0x127d, 0x3b, 0x12a4, 0x1355, 0x122a, 0x120d, 0x3b, 0x121c, 0x12ed,
-0x3b, 0x1301, 0x1295, 0x3b, 0x1301, 0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235, 0x1275, 0x3b, 0x1234, 0x1355, 0x1274, 0x121d, 0x1260, 0x122d, 0x3b,
-0x12a6, 0x12ad, 0x1276, 0x1260, 0x122d, 0x3b, 0x1296, 0x126c, 0x121d, 0x1260, 0x122d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1260, 0x122d, 0x3b, 0x1303, 0x3b,
-0x134c, 0x3b, 0x121b, 0x3b, 0x12a4, 0x3b, 0x121c, 0x3b, 0x1301, 0x3b, 0x1301, 0x3b, 0x12a6, 0x3b, 0x1234, 0x3b, 0x12a6, 0x3b, 0x1296, 0x3b,
-0x12f2, 0x3b, 0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b,
-0x623, 0x628, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644,
-0x64a, 0x648, 0x3b, 0x623, 0x63a, 0x633, 0x637, 0x633, 0x3b, 0x633, 0x628, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648,
-0x628, 0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x64a, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x64a, 0x3b, 0x641,
-0x3b, 0x645, 0x3b, 0x623, 0x3b, 0x648, 0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x633, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f,
-0x3b, 0x62c, 0x627, 0x646, 0x641, 0x64a, 0x3b, 0x641, 0x64a, 0x641, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x641,
-0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x62c, 0x648, 0x627, 0x646, 0x3b, 0x62c, 0x648, 0x64a, 0x644, 0x64a, 0x629, 0x3b,
-0x623, 0x648, 0x62a, 0x3b, 0x633, 0x628, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648,
-0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x64a, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623, 0x3b,
-0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x623, 0x3b, 0x633, 0x3b, 0x623, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x643, 0x627, 0x646, 0x648,
-0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631, 0x3b, 0x646,
-0x64a, 0x633, 0x627, 0x646, 0x3b, 0x623, 0x64a, 0x627, 0x631, 0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x645, 0x648,
-0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a, 0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x623,
-0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627, 0x646, 0x648,
-0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x643, 0x3b, 0x634, 0x3b, 0x622, 0x3b, 0x646, 0x3b, 0x623, 0x3b, 0x62d, 0x3b,
-0x62a, 0x3b, 0x622, 0x3b, 0x623, 0x3b, 0x62a, 0x3b, 0x62a, 0x3b, 0x643, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644,
-0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631, 0x3b, 0x646, 0x64a, 0x633, 0x627, 0x646,
-0x3b, 0x623, 0x64a, 0x627, 0x631, 0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x645, 0x648, 0x632, 0x3b, 0x622, 0x628,
-0x3b, 0x623, 0x64a, 0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0xa0, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x62a,
-0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644,
-0x623, 0x648, 0x644, 0x3b, 0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631,
-0x633, 0x3b, 0x625, 0x628, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a,
-0x648, 0x644, 0x64a, 0x648, 0x3b, 0x623, 0x63a, 0x634, 0x62a, 0x3b, 0x634, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648,
-0x628, 0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x62c, 0x645, 0x628, 0x631, 0x3b, 0x64a, 0x3b, 0x641, 0x3b,
-0x645, 0x3b, 0x625, 0x3b, 0x648, 0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x634, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x3b,
-0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x628,
-0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x632,
-0x3b, 0x63a, 0x634, 0x62a, 0x3b, 0x634, 0x62a, 0x646, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648,
-0x646, 0x628, 0x631, 0x3b, 0x62f, 0x62c, 0x646, 0x628, 0x631, 0x3b, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623, 0x3b, 0x645, 0x3b,
-0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x634, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x3b, 0x570, 0x576, 0x57e, 0x3b, 0x583, 0x57f,
-0x57e, 0x3b, 0x574, 0x580, 0x57f, 0x3b, 0x561, 0x57a, 0x580, 0x3b, 0x574, 0x575, 0x57d, 0x3b, 0x570, 0x576, 0x57d, 0x3b, 0x570, 0x56c,
-0x57d, 0x3b, 0x585, 0x563, 0x57d, 0x3b, 0x57d, 0x565, 0x57a, 0x3b, 0x570, 0x578, 0x56f, 0x3b, 0x576, 0x578, 0x575, 0x3b, 0x564, 0x565,
-0x56f, 0x3b, 0x570, 0x578, 0x582, 0x576, 0x57e, 0x561, 0x580, 0x3b, 0x583, 0x565, 0x57f, 0x580, 0x57e, 0x561, 0x580, 0x3b, 0x574, 0x561,
-0x580, 0x57f, 0x3b, 0x561, 0x57a, 0x580, 0x56b, 0x56c, 0x3b, 0x574, 0x561, 0x575, 0x56b, 0x57d, 0x3b, 0x570, 0x578, 0x582, 0x576, 0x56b,
-0x57d, 0x3b, 0x570, 0x578, 0x582, 0x56c, 0x56b, 0x57d, 0x3b, 0x585, 0x563, 0x578, 0x57d, 0x57f, 0x578, 0x57d, 0x3b, 0x57d, 0x565, 0x57a,
-0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x570, 0x578, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x576, 0x578, 0x575,
-0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x564, 0x565, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x540, 0x3b, 0x553, 0x3b,
-0x544, 0x3b, 0x531, 0x3b, 0x544, 0x3b, 0x540, 0x3b, 0x540, 0x3b, 0x555, 0x3b, 0x54d, 0x3b, 0x540, 0x3b, 0x546, 0x3b, 0x534, 0x3b,
-0x570, 0x578, 0x582, 0x576, 0x57e, 0x561, 0x580, 0x56b, 0x3b, 0x583, 0x565, 0x57f, 0x580, 0x57e, 0x561, 0x580, 0x56b, 0x3b, 0x574, 0x561,
-0x580, 0x57f, 0x56b, 0x3b, 0x561, 0x57a, 0x580, 0x56b, 0x56c, 0x56b, 0x3b, 0x574, 0x561, 0x575, 0x56b, 0x57d, 0x56b, 0x3b, 0x570, 0x578,
-0x582, 0x576, 0x56b, 0x57d, 0x56b, 0x3b, 0x570, 0x578, 0x582, 0x56c, 0x56b, 0x57d, 0x56b, 0x3b, 0x585, 0x563, 0x578, 0x57d, 0x57f, 0x578,
-0x57d, 0x56b, 0x3b, 0x57d, 0x565, 0x57a, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b, 0x570, 0x578, 0x56f, 0x57f, 0x565, 0x574,
-0x562, 0x565, 0x580, 0x56b, 0x3b, 0x576, 0x578, 0x575, 0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b, 0x564, 0x565, 0x56f, 0x57f, 0x565,
-0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9f0, 0x9c1, 0x3b, 0x9ae, 0x9be,
-0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9f0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x2019, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c,
-0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x3b, 0x99b, 0x9c7, 0x9aa, 0x9cd, 0x9a4, 0x9c7, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb,
-0x3b, 0x9a8, 0x9f1, 0x9c7, 0x3b, 0x9a1, 0x9bf, 0x99a, 0x9c7, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0, 0x3b, 0x9ab,
-0x9c7, 0x9ac, 0x9cd, 0x9f0, 0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9f0,
-0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x2019, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b7,
-0x9cd, 0x99f, 0x3b, 0x99b, 0x9c7, 0x9aa, 0x9cd, 0x9a4, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac,
-0x9f0, 0x3b, 0x9a8, 0x9f1, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x9a1, 0x9bf, 0x99a, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x99c,
-0x3b, 0x9ab, 0x3b, 0x9ae, 0x3b, 0x98f, 0x3b, 0x9ae, 0x3b, 0x99c, 0x3b, 0x99c, 0x3b, 0x986, 0x3b, 0x99b, 0x3b, 0x985, 0x3b, 0x9a8,
-0x3b, 0x9a1, 0x3b, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d,
-0x61, 0x79, 0x3b, 0x69, 0x79, 0x6e, 0x3b, 0x69, 0x79, 0x6c, 0x3b, 0x61, 0x76, 0x71, 0x3b, 0x73, 0x65, 0x6e, 0x3b, 0x6f,
-0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x79, 0x3b, 0x64, 0x65, 0x6b, 0x3b, 0x79, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x46, 0x65,
-0x76, 0x72, 0x61, 0x6c, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
-0x130, 0x79, 0x75, 0x6e, 0x3b, 0x130, 0x79, 0x75, 0x6c, 0x3b, 0x41, 0x76, 0x71, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e,
-0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x62, 0x72,
-0x3b, 0x64, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x3b, 0x79, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x61,
-0x6c, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x75,
-0x6e, 0x3b, 0x69, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x71, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0x79, 0x61,
-0x62, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x6e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65,
-0x6b, 0x61, 0x62, 0x72, 0x3b, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x432, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440,
-0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x458, 0x43d, 0x3b, 0x438, 0x458, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43d,
-0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x458, 0x3b, 0x434, 0x435, 0x43a, 0x3b, 0x408, 0x430, 0x43d, 0x432, 0x430, 0x440, 0x3b,
-0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x41c, 0x430,
-0x439, 0x3b, 0x418, 0x458, 0x443, 0x43d, 0x3b, 0x418, 0x458, 0x443, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421,
-0x435, 0x43d, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x41e, 0x43a, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x41d, 0x43e, 0x458, 0x430,
-0x431, 0x440, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x3b, 0x458, 0x430, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432,
-0x440, 0x430, 0x43b, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438,
-0x458, 0x443, 0x43d, 0x3b, 0x438, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442,
-0x458, 0x430, 0x431, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x43d, 0x43e, 0x458, 0x430, 0x431, 0x440, 0x3b,
-0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x3b, 0x75, 0x72, 0x74, 0x2e, 0x3b, 0x6f, 0x74, 0x73, 0x2e, 0x3b, 0x6d, 0x61, 0x72,
-0x2e, 0x3b, 0x61, 0x70, 0x69, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x2e, 0x3b, 0x65, 0x6b, 0x61, 0x2e, 0x3b, 0x75, 0x7a, 0x74,
-0x2e, 0x3b, 0x61, 0x62, 0x75, 0x2e, 0x3b, 0x69, 0x72, 0x61, 0x2e, 0x3b, 0x75, 0x72, 0x72, 0x2e, 0x3b, 0x61, 0x7a, 0x61,
-0x2e, 0x3b, 0x61, 0x62, 0x65, 0x2e, 0x3b, 0x75, 0x72, 0x74, 0x61, 0x72, 0x72, 0x69, 0x6c, 0x61, 0x3b, 0x6f, 0x74, 0x73,
-0x61, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x78, 0x6f, 0x61, 0x3b, 0x61, 0x70, 0x69, 0x72, 0x69, 0x6c, 0x61,
-0x3b, 0x6d, 0x61, 0x69, 0x61, 0x74, 0x7a, 0x61, 0x3b, 0x65, 0x6b, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x75, 0x7a, 0x74, 0x61,
-0x69, 0x6c, 0x61, 0x3b, 0x61, 0x62, 0x75, 0x7a, 0x74, 0x75, 0x61, 0x3b, 0x69, 0x72, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x75,
-0x72, 0x72, 0x69, 0x61, 0x3b, 0x61, 0x7a, 0x61, 0x72, 0x6f, 0x61, 0x3b, 0x61, 0x62, 0x65, 0x6e, 0x64, 0x75, 0x61, 0x3b,
-0x55, 0x3b, 0x4f, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x55, 0x3b,
-0x41, 0x3b, 0x41, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1,
-0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae,
-0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7,
-0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7,
-0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x99c, 0x9be, 0x3b, 0x9ab, 0x9c7, 0x3b,
-0x9ae, 0x9be, 0x3b, 0x98f, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x3b, 0x986, 0x3b, 0x9b8, 0x9c7, 0x3b,
-0x985, 0x3b, 0x9a8, 0x3b, 0x9a1, 0x9bf, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd,
-0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be,
-0x987, 0x3b, 0x986, 0x997, 0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985,
-0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae,
-0x9cd, 0x9ac, 0x9b0, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf23, 0x3b, 0xf5f,
-0xfb3, 0xf0b, 0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf25, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf26, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf27, 0x3b, 0xf5f,
-0xfb3, 0xf0b, 0xf28, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf21,
-0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf22, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf44, 0xf54, 0xf0b, 0x3b,
-0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72,
-0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b,
-0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b,
-0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b,
-0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56,
-0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b,
-0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4,
-0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4,
-0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf21, 0x3b,
+static const char16_t months_data[] = {
+0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72,
+0x63, 0x68, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x65, 0x3b, 0x4a, 0x75,
+0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x63,
+0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72,
+0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70,
+0x3b, 0x4f, 0x63, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b,
+0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x31, 0x3b, 0x32, 0x3b, 0x33,
+0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31,
+0x32, 0x41, 0x6d, 0x61, 0x6a, 0x6a, 0x69, 0x69, 0x3b, 0x47, 0x75, 0x72, 0x61, 0x61, 0x6e, 0x64, 0x68, 0x61, 0x6c, 0x61,
+0x3b, 0x42, 0x69, 0x74, 0x6f, 0x6f, 0x74, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x45, 0x6c, 0x62, 0x61, 0x3b, 0x43, 0x61,
+0x61, 0x6d, 0x73, 0x61, 0x3b, 0x57, 0x61, 0x78, 0x61, 0x62, 0x61, 0x6a, 0x6a, 0x69, 0x69, 0x3b, 0x41, 0x64, 0x6f, 0x6f,
+0x6c, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x48, 0x61, 0x67, 0x61, 0x79, 0x79, 0x61, 0x3b, 0x46, 0x75, 0x75, 0x6c, 0x62,
+0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6e, 0x6b, 0x6f, 0x6c, 0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x53, 0x61, 0x64,
+0x61, 0x61, 0x73, 0x61, 0x3b, 0x4d, 0x75, 0x64, 0x64, 0x65, 0x65, 0x41, 0x6d, 0x61, 0x3b, 0x47, 0x75, 0x72, 0x3b, 0x42,
+0x69, 0x74, 0x3b, 0x45, 0x6c, 0x62, 0x3b, 0x43, 0x61, 0x6d, 0x3b, 0x57, 0x61, 0x78, 0x3b, 0x41, 0x64, 0x6f, 0x3b, 0x48,
+0x61, 0x67, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4f, 0x6e, 0x6b, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x4d, 0x75, 0x64, 0x41, 0x3b,
+0x47, 0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x43, 0x3b, 0x57, 0x3b, 0x41, 0x3b, 0x48, 0x3b, 0x46, 0x3b, 0x4f, 0x3b, 0x53, 0x3b,
+0x4d, 0x4d, 0x30, 0x31, 0x3b, 0x4d, 0x30, 0x32, 0x3b, 0x4d, 0x30, 0x33, 0x3b, 0x4d, 0x30, 0x34, 0x3b, 0x4d, 0x30, 0x35,
+0x3b, 0x4d, 0x30, 0x36, 0x3b, 0x4d, 0x30, 0x37, 0x3b, 0x4d, 0x30, 0x38, 0x3b, 0x4d, 0x30, 0x39, 0x3b, 0x4d, 0x31, 0x30,
+0x3b, 0x4d, 0x31, 0x31, 0x3b, 0x4d, 0x31, 0x32, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x46, 0x65, 0x62,
+0x72, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d,
+0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x65, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73,
+0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65,
+0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a,
+0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x72, 0x74, 0x2e, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d,
+0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65,
+0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x73, 0x2e, 0x6a, 0x61, 0x6e,
+0x61, 0x72, 0x3b, 0x73, 0x68, 0x6b, 0x75, 0x72, 0x74, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x70, 0x72, 0x69, 0x6c, 0x6c,
+0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x73, 0x68, 0x6f, 0x72, 0x3b, 0x6b, 0x6f, 0x72, 0x72, 0x69, 0x6b, 0x3b,
+0x67, 0x75, 0x73, 0x68, 0x74, 0x3b, 0x73, 0x68, 0x74, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x74, 0x65, 0x74, 0x6f, 0x72, 0x3b,
+0x6e, 0xeb, 0x6e, 0x74, 0x6f, 0x72, 0x3b, 0x64, 0x68, 0x6a, 0x65, 0x74, 0x6f, 0x72, 0x6a, 0x61, 0x6e, 0x3b, 0x73, 0x68,
+0x6b, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x3b, 0x6b, 0x6f,
+0x72, 0x72, 0x3b, 0x67, 0x75, 0x73, 0x68, 0x3b, 0x73, 0x68, 0x74, 0x3b, 0x74, 0x65, 0x74, 0x3b, 0x6e, 0xeb, 0x6e, 0x3b,
+0x64, 0x68, 0x6a, 0x6a, 0x3b, 0x73, 0x68, 0x3b, 0x6d, 0x3b, 0x70, 0x3b, 0x6d, 0x3b, 0x71, 0x3b, 0x6b, 0x3b, 0x67, 0x3b,
+0x73, 0x68, 0x3b, 0x74, 0x3b, 0x6e, 0x3b, 0x64, 0x68, 0x1303, 0x1295, 0x12e9, 0x12c8, 0x122a, 0x3b, 0x134c, 0x1265, 0x1229, 0x12c8, 0x122a,
+0x3b, 0x121b, 0x122d, 0x127d, 0x3b, 0x12a4, 0x1355, 0x122a, 0x120d, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301, 0x120b, 0x12ed, 0x3b,
+0x12a6, 0x1308, 0x1235, 0x1275, 0x3b, 0x1234, 0x1355, 0x1274, 0x121d, 0x1260, 0x122d, 0x3b, 0x12a6, 0x12ad, 0x1276, 0x1260, 0x122d, 0x3b, 0x1296, 0x126c,
+0x121d, 0x1260, 0x122d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1260, 0x122d, 0x1303, 0x1295, 0x12e9, 0x3b, 0x134c, 0x1265, 0x1229, 0x3b, 0x121b, 0x122d, 0x127d,
+0x3b, 0x12a4, 0x1355, 0x122a, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301, 0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235, 0x3b, 0x1234,
+0x1355, 0x1274, 0x3b, 0x12a6, 0x12ad, 0x1276, 0x3b, 0x1296, 0x126c, 0x121d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1303, 0x3b, 0x134c, 0x3b, 0x121b, 0x3b,
+0x12a4, 0x3b, 0x121c, 0x3b, 0x1301, 0x3b, 0x1301, 0x3b, 0x12a6, 0x3b, 0x1234, 0x3b, 0x12a6, 0x3b, 0x1296, 0x3b, 0x12f2, 0x64a, 0x646, 0x627,
+0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x628, 0x631, 0x64a, 0x644,
+0x3b, 0x645, 0x627, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x3b, 0x623, 0x63a,
+0x633, 0x637, 0x633, 0x3b, 0x633, 0x628, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648,
+0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x64a, 0x633, 0x645, 0x628, 0x631, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623, 0x3b, 0x648,
+0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x633, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x62c, 0x627, 0x646, 0x641, 0x64a, 0x3b,
+0x641, 0x64a, 0x641, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x641, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a,
+0x3b, 0x62c, 0x648, 0x627, 0x646, 0x3b, 0x62c, 0x648, 0x64a, 0x644, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x62a, 0x3b, 0x633, 0x628, 0x62a,
+0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x64a,
+0x633, 0x645, 0x628, 0x631, 0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623, 0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x623, 0x3b,
+0x633, 0x3b, 0x623, 0x3b, 0x646, 0x3b, 0x62f, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b,
+0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631, 0x3b, 0x646, 0x64a, 0x633, 0x627, 0x646, 0x3b, 0x623, 0x64a, 0x627, 0x631,
+0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x645, 0x648, 0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a, 0x644, 0x648,
+0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20,
+0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x643, 0x627,
+0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631,
+0x3b, 0x646, 0x64a, 0x633, 0x627, 0x646, 0x3b, 0x623, 0x64a, 0x627, 0x631, 0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646, 0x3b, 0x62a,
+0x645, 0x648, 0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a, 0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0xa0, 0x627,
+0x644, 0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627,
+0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x643, 0x3b, 0x634, 0x3b, 0x622, 0x3b, 0x646, 0x3b, 0x623, 0x3b, 0x62d,
+0x3b, 0x62a, 0x3b, 0x622, 0x3b, 0x623, 0x3b, 0x62a, 0x3b, 0x62a, 0x3b, 0x643, 0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628,
+0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x625, 0x628, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x648,
+0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x3b, 0x623, 0x63a, 0x634, 0x62a, 0x3b, 0x634, 0x62a,
+0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x62c,
+0x645, 0x628, 0x631, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x625, 0x3b, 0x648, 0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x634,
+0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645,
+0x627, 0x631, 0x633, 0x3b, 0x623, 0x628, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b,
+0x64a, 0x648, 0x644, 0x64a, 0x648, 0x632, 0x3b, 0x63a, 0x634, 0x62a, 0x3b, 0x634, 0x62a, 0x646, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a,
+0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x646, 0x628, 0x631, 0x3b, 0x62f, 0x62c, 0x646, 0x628, 0x631, 0x64a, 0x3b, 0x641, 0x3b, 0x645,
+0x3b, 0x623, 0x3b, 0x645, 0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x634, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x570, 0x578,
+0x582, 0x576, 0x57e, 0x561, 0x580, 0x3b, 0x583, 0x565, 0x57f, 0x580, 0x57e, 0x561, 0x580, 0x3b, 0x574, 0x561, 0x580, 0x57f, 0x3b, 0x561,
+0x57a, 0x580, 0x56b, 0x56c, 0x3b, 0x574, 0x561, 0x575, 0x56b, 0x57d, 0x3b, 0x570, 0x578, 0x582, 0x576, 0x56b, 0x57d, 0x3b, 0x570, 0x578,
+0x582, 0x56c, 0x56b, 0x57d, 0x3b, 0x585, 0x563, 0x578, 0x57d, 0x57f, 0x578, 0x57d, 0x3b, 0x57d, 0x565, 0x57a, 0x57f, 0x565, 0x574, 0x562,
+0x565, 0x580, 0x3b, 0x570, 0x578, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x576, 0x578, 0x575, 0x565, 0x574, 0x562, 0x565,
+0x580, 0x3b, 0x564, 0x565, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x570, 0x578, 0x582, 0x576, 0x57e, 0x561, 0x580, 0x56b, 0x3b,
+0x583, 0x565, 0x57f, 0x580, 0x57e, 0x561, 0x580, 0x56b, 0x3b, 0x574, 0x561, 0x580, 0x57f, 0x56b, 0x3b, 0x561, 0x57a, 0x580, 0x56b, 0x56c,
+0x56b, 0x3b, 0x574, 0x561, 0x575, 0x56b, 0x57d, 0x56b, 0x3b, 0x570, 0x578, 0x582, 0x576, 0x56b, 0x57d, 0x56b, 0x3b, 0x570, 0x578, 0x582,
+0x56c, 0x56b, 0x57d, 0x56b, 0x3b, 0x585, 0x563, 0x578, 0x57d, 0x57f, 0x578, 0x57d, 0x56b, 0x3b, 0x57d, 0x565, 0x57a, 0x57f, 0x565, 0x574,
+0x562, 0x565, 0x580, 0x56b, 0x3b, 0x570, 0x578, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b, 0x576, 0x578, 0x575, 0x565,
+0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b, 0x564, 0x565, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x570, 0x576, 0x57e, 0x3b,
+0x583, 0x57f, 0x57e, 0x3b, 0x574, 0x580, 0x57f, 0x3b, 0x561, 0x57a, 0x580, 0x3b, 0x574, 0x575, 0x57d, 0x3b, 0x570, 0x576, 0x57d, 0x3b,
+0x570, 0x56c, 0x57d, 0x3b, 0x585, 0x563, 0x57d, 0x3b, 0x57d, 0x565, 0x57a, 0x3b, 0x570, 0x578, 0x56f, 0x3b, 0x576, 0x578, 0x575, 0x3b,
+0x564, 0x565, 0x56f, 0x540, 0x3b, 0x553, 0x3b, 0x544, 0x3b, 0x531, 0x3b, 0x544, 0x3b, 0x540, 0x3b, 0x540, 0x3b, 0x555, 0x3b, 0x54d,
+0x3b, 0x540, 0x3b, 0x546, 0x3b, 0x534, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9f0,
+0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9f0, 0x9bf, 0x9b2, 0x3b, 0x9ae,
+0x9c7, 0x2019, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b7, 0x9cd, 0x99f, 0x3b, 0x99b,
+0x9c7, 0x9aa, 0x9cd, 0x9a4, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9f0, 0x3b, 0x9a8, 0x9f1,
+0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x9a1, 0x9bf, 0x99a, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab,
+0x9c7, 0x9ac, 0x9cd, 0x9f0, 0x9c1, 0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9f0, 0x9bf, 0x9b2, 0x3b, 0x9ae,
+0x9c7, 0x2019, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x3b, 0x99b, 0x9c7, 0x9aa, 0x9cd,
+0x9a4, 0x9c7, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x3b, 0x9a8, 0x9f1, 0x9c7, 0x3b, 0x9a1, 0x9bf, 0x99a, 0x9c7, 0x99c, 0x3b, 0x9ab,
+0x3b, 0x9ae, 0x3b, 0x98f, 0x3b, 0x9ae, 0x3b, 0x99c, 0x3b, 0x99c, 0x3b, 0x986, 0x3b, 0x99b, 0x3b, 0x985, 0x3b, 0x9a8, 0x3b, 0x9a1,
+0x79, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x41,
+0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x130, 0x79, 0x75, 0x6e, 0x3b, 0x130, 0x79, 0x75, 0x6c, 0x3b, 0x41,
+0x76, 0x71, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x79, 0x61,
+0x62, 0x72, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x79, 0x61, 0x6e, 0x76,
+0x61, 0x72, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c,
+0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x75, 0x6e, 0x3b, 0x69, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x71, 0x75, 0x73,
+0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x6e,
+0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b,
+0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x6e, 0x3b, 0x69, 0x79, 0x6c, 0x3b,
+0x61, 0x76, 0x71, 0x3b, 0x73, 0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x79, 0x3b, 0x64, 0x65, 0x6b, 0x408,
+0x430, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f,
+0x440, 0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x458, 0x443, 0x43d, 0x3b, 0x418, 0x458, 0x443, 0x43b, 0x3b, 0x410, 0x432,
+0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x41e, 0x43a, 0x442, 0x458, 0x430, 0x431,
+0x440, 0x3b, 0x41d, 0x43e, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x458, 0x430, 0x43d, 0x432, 0x430,
+0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x3b,
+0x43c, 0x430, 0x439, 0x3b, 0x438, 0x458, 0x443, 0x43d, 0x3b, 0x438, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442,
+0x3b, 0x441, 0x435, 0x43d, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x43d, 0x43e,
+0x458, 0x430, 0x431, 0x440, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x432, 0x3b, 0x43c,
+0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x458, 0x43d, 0x3b, 0x438, 0x458, 0x43b, 0x3b, 0x430,
+0x432, 0x433, 0x3b, 0x441, 0x435, 0x43d, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x458, 0x3b, 0x434, 0x435, 0x43a, 0x75, 0x72,
+0x74, 0x61, 0x72, 0x72, 0x69, 0x6c, 0x61, 0x3b, 0x6f, 0x74, 0x73, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x74,
+0x78, 0x6f, 0x61, 0x3b, 0x61, 0x70, 0x69, 0x72, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x69, 0x61, 0x74, 0x7a, 0x61, 0x3b,
+0x65, 0x6b, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x75, 0x7a, 0x74, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x61, 0x62, 0x75, 0x7a, 0x74,
+0x75, 0x61, 0x3b, 0x69, 0x72, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x75, 0x72, 0x72, 0x69, 0x61, 0x3b, 0x61, 0x7a, 0x61, 0x72,
+0x6f, 0x61, 0x3b, 0x61, 0x62, 0x65, 0x6e, 0x64, 0x75, 0x61, 0x75, 0x72, 0x74, 0x2e, 0x3b, 0x6f, 0x74, 0x73, 0x2e, 0x3b,
+0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x69, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x2e, 0x3b, 0x65, 0x6b, 0x61, 0x2e, 0x3b,
+0x75, 0x7a, 0x74, 0x2e, 0x3b, 0x61, 0x62, 0x75, 0x2e, 0x3b, 0x69, 0x72, 0x61, 0x2e, 0x3b, 0x75, 0x72, 0x72, 0x2e, 0x3b,
+0x61, 0x7a, 0x61, 0x2e, 0x3b, 0x61, 0x62, 0x65, 0x2e, 0x55, 0x3b, 0x4f, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x45,
+0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x41, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0,
+0x9c0, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b,
+0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b,
+0x986, 0x997, 0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985, 0x995, 0x9cd,
+0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac,
+0x9b0, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0,
+0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b8, 0x9cd,
+0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0,
+0x3b, 0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x99c, 0x9be, 0x3b,
+0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be, 0x3b, 0x98f, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x3b, 0x986, 0x3b,
+0x9b8, 0x9c7, 0x3b, 0x985, 0x3b, 0x9a8, 0x3b, 0x9a1, 0x9bf, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf44, 0xf54,
+0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4,
+0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f,
+0xfb3, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54,
+0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf66, 0xfa4, 0xfb1,
+0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3,
+0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf42,
+0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b,
+0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b,
+0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0xf5f,
+0xfb3, 0xf0b, 0xf51, 0xf44, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f,
+0xfb3, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56,
+0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf22, 0x3b,
+0xf5f, 0xfb3, 0xf0b, 0xf23, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf25, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf26, 0x3b,
+0xf5f, 0xfb3, 0xf0b, 0xf27, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf28, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf29, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf20,
+0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf22, 0xf21, 0x3b, 0xf22, 0x3b, 0xf23, 0x3b, 0xf24, 0x3b,
+0xf25, 0x3b, 0xf26, 0x3b, 0xf27, 0x3b, 0xf28, 0x3b, 0xf29, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b, 0x31, 0x32, 0xf21, 0x3b,
0xf22, 0x3b, 0xf23, 0x3b, 0xf24, 0x3b, 0xf25, 0x3b, 0xf26, 0x3b, 0xf27, 0x3b, 0xf28, 0x3b, 0xf29, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21,
-0xf21, 0x3b, 0xf21, 0xf22, 0x3b, 0xf21, 0x3b, 0xf22, 0x3b, 0xf23, 0x3b, 0xf24, 0x3b, 0xf25, 0x3b, 0xf26, 0x3b, 0xf27, 0x3b, 0xf28,
-0x3b, 0xf29, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b, 0x31, 0x32, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf44, 0xf54, 0xf0b, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54,
-0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b,
-0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54,
-0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf42, 0xf74,
-0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74,
-0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66,
-0xf0b, 0xf54, 0xf0b, 0x3b, 0xf21, 0x3b, 0xf22, 0x3b, 0xf23, 0x3b, 0x34, 0x3b, 0xf25, 0x3b, 0xf26, 0x3b, 0xf27, 0x3b, 0xf28, 0x3b,
-0x39, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b, 0xf21, 0xf22, 0x3b, 0x47, 0x65, 0x6e, 0x2e, 0x3b, 0x43, 0x2bc, 0x68, 0x77,
-0x65, 0x2e, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x2e, 0x3b, 0x45, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x65, 0x3b, 0x4d, 0x65,
-0x7a, 0x68, 0x2e, 0x3b, 0x47, 0x6f, 0x75, 0x65, 0x2e, 0x3b, 0x45, 0x6f, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x2e,
-0x3b, 0x48, 0x65, 0x72, 0x65, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x7a, 0x75, 0x2e, 0x3b, 0x47, 0x65, 0x6e, 0x76, 0x65, 0x72,
-0x3b, 0x43, 0x2bc, 0x68, 0x77, 0x65, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x7a, 0x68, 0x3b, 0x45, 0x62,
-0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x65, 0x3b, 0x4d, 0x65, 0x7a, 0x68, 0x65, 0x76, 0x65, 0x6e, 0x3b, 0x47, 0x6f, 0x75,
-0x65, 0x72, 0x65, 0x3b, 0x45, 0x6f, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x3b, 0x48, 0x65,
-0x72, 0x65, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x65, 0x72, 0x7a, 0x75, 0x3b, 0x30, 0x31, 0x3b, 0x30, 0x32, 0x3b, 0x30, 0x33,
-0x3b, 0x30, 0x34, 0x3b, 0x30, 0x35, 0x3b, 0x30, 0x36, 0x3b, 0x30, 0x37, 0x3b, 0x30, 0x38, 0x3b, 0x30, 0x39, 0x3b, 0x31,
-0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0x44f, 0x43d, 0x443, 0x3b, 0x444, 0x435, 0x432, 0x3b, 0x43c, 0x430, 0x440, 0x442,
-0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433,
-0x3b, 0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x435, 0x3b, 0x434, 0x435, 0x43a, 0x3b, 0x44f, 0x43d, 0x443,
-0x430, 0x440, 0x438, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f,
-0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443,
-0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440,
-0x438, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x44f,
-0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b, 0x43c, 0x3b, 0x44e, 0x3b, 0x44e, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d,
-0x3b, 0x434, 0x3b, 0x1007, 0x1014, 0x103a, 0x3b, 0x1016, 0x1031, 0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007,
+0xf21, 0x3b, 0xf21, 0xf22, 0xf21, 0x3b, 0xf22, 0x3b, 0xf23, 0x3b, 0x34, 0x3b, 0xf25, 0x3b, 0xf26, 0x3b, 0xf27, 0x3b, 0xf28, 0x3b,
+0x39, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b, 0xf21, 0xf22, 0x47, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x3b, 0x43, 0x2bc, 0x68,
+0x77, 0x65, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x7a, 0x68, 0x3b, 0x45, 0x62, 0x72, 0x65, 0x6c, 0x3b,
+0x4d, 0x61, 0x65, 0x3b, 0x4d, 0x65, 0x7a, 0x68, 0x65, 0x76, 0x65, 0x6e, 0x3b, 0x47, 0x6f, 0x75, 0x65, 0x72, 0x65, 0x3b,
+0x45, 0x6f, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x3b, 0x48, 0x65, 0x72, 0x65, 0x3b, 0x44,
+0x75, 0x3b, 0x4b, 0x65, 0x72, 0x7a, 0x75, 0x47, 0x65, 0x6e, 0x2e, 0x3b, 0x43, 0x2bc, 0x68, 0x77, 0x65, 0x2e, 0x3b, 0x4d,
+0x65, 0x75, 0x72, 0x2e, 0x3b, 0x45, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x65, 0x3b, 0x4d, 0x65, 0x7a, 0x68, 0x2e, 0x3b,
+0x47, 0x6f, 0x75, 0x65, 0x2e, 0x3b, 0x45, 0x6f, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x2e, 0x3b, 0x48, 0x65, 0x72,
+0x65, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x7a, 0x75, 0x2e, 0x30, 0x31, 0x3b, 0x30, 0x32, 0x3b, 0x30, 0x33, 0x3b, 0x30, 0x34,
+0x3b, 0x30, 0x35, 0x3b, 0x30, 0x36, 0x3b, 0x30, 0x37, 0x3b, 0x30, 0x38, 0x3b, 0x30, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31,
+0x31, 0x3b, 0x31, 0x32, 0x44f, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b,
+0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e,
+0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b,
+0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a,
+0x435, 0x43c, 0x432, 0x440, 0x438, 0x44f, 0x43d, 0x443, 0x3b, 0x444, 0x435, 0x432, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f,
+0x440, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435,
+0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x435, 0x3b, 0x434, 0x435, 0x43a, 0x44f, 0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430,
+0x3b, 0x43c, 0x3b, 0x44e, 0x3b, 0x44e, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x1007, 0x1014, 0x103a, 0x1014,
+0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1016, 0x1031, 0x1016, 0x1031, 0x102c, 0x103a, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1019, 0x1010, 0x103a, 0x3b,
+0x1027, 0x1015, 0x103c, 0x102e, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x101c, 0x102d, 0x102f, 0x1004, 0x103a,
+0x3b, 0x1029, 0x1002, 0x102f, 0x1010, 0x103a, 0x3b, 0x1005, 0x1000, 0x103a, 0x1010, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1021, 0x1031, 0x102c, 0x1000,
+0x103a, 0x1010, 0x102d, 0x102f, 0x1018, 0x102c, 0x3b, 0x1014, 0x102d, 0x102f, 0x101d, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1012, 0x102e, 0x1007, 0x1004,
+0x103a, 0x1018, 0x102c, 0x1007, 0x1014, 0x103a, 0x3b, 0x1016, 0x1031, 0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007,
0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x3b, 0x1029, 0x3b, 0x1005, 0x1000, 0x103a, 0x3b, 0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x3b, 0x1014,
-0x102d, 0x102f, 0x3b, 0x1012, 0x102e, 0x3b, 0x1007, 0x1014, 0x103a, 0x1014, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1016, 0x1031, 0x1016, 0x1031, 0x102c,
-0x103a, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x1015, 0x103c, 0x102e, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d,
-0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x101c, 0x102d, 0x102f, 0x1004, 0x103a, 0x3b, 0x1029, 0x1002, 0x102f, 0x1010, 0x103a, 0x3b, 0x1005, 0x1000, 0x103a,
-0x1010, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x1010, 0x102d, 0x102f, 0x1018, 0x102c, 0x3b, 0x1014, 0x102d, 0x102f,
-0x101d, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1012, 0x102e, 0x1007, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1007, 0x3b, 0x1016, 0x3b, 0x1019, 0x3b,
-0x1027, 0x3b, 0x1019, 0x3b, 0x1007, 0x3b, 0x1007, 0x3b, 0x1029, 0x3b, 0x1005, 0x3b, 0x1021, 0x3b, 0x1014, 0x3b, 0x1012, 0x3b, 0x441, 0x442,
-0x443, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x441, 0x430, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x447, 0x44d,
-0x440, 0x3b, 0x43b, 0x456, 0x43f, 0x3b, 0x436, 0x43d, 0x456, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x43a, 0x430, 0x441, 0x3b, 0x43b, 0x456,
-0x441, 0x3b, 0x441, 0x43d, 0x435, 0x3b, 0x441, 0x442, 0x443, 0x434, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x44b, 0x3b,
-0x441, 0x430, 0x43a, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x441, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x43c, 0x430, 0x439,
-0x3b, 0x447, 0x44d, 0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x436, 0x43d, 0x456, 0x432,
-0x435, 0x43d, 0x44c, 0x3b, 0x432, 0x435, 0x440, 0x430, 0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b, 0x447,
-0x43d, 0x456, 0x43a, 0x3b, 0x43b, 0x456, 0x441, 0x442, 0x430, 0x43f, 0x430, 0x434, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x430, 0x43d, 0x44c,
-0x3b, 0x441, 0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x43a, 0x3b, 0x43c, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x436, 0x3b, 0x432, 0x3b, 0x43a,
-0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x441, 0x442, 0x443, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x441, 0x430, 0x43a, 0x3b, 0x43a, 0x440, 0x430,
-0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x447, 0x44d, 0x440, 0x3b, 0x43b, 0x456, 0x43f, 0x3b, 0x436, 0x43d, 0x456, 0x3b, 0x432, 0x435, 0x440,
-0x3b, 0x43a, 0x430, 0x441, 0x3b, 0x43b, 0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435, 0x3b, 0x441, 0x442, 0x443, 0x434, 0x437, 0x435, 0x43d,
-0x44f, 0x3b, 0x43b, 0x44e, 0x442, 0x430, 0x433, 0x430, 0x3b, 0x441, 0x430, 0x43a, 0x430, 0x432, 0x456, 0x43a, 0x430, 0x3b, 0x43a, 0x440,
-0x430, 0x441, 0x430, 0x432, 0x456, 0x43a, 0x430, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x447, 0x44d, 0x440, 0x432, 0x435, 0x43d, 0x44f, 0x3b,
-0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44f, 0x3b, 0x436, 0x43d, 0x456, 0x45e, 0x43d, 0x44f, 0x3b, 0x432, 0x435, 0x440, 0x430, 0x441, 0x43d,
-0x44f, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b, 0x447, 0x43d, 0x456, 0x43a, 0x430, 0x3b, 0x43b, 0x456, 0x441, 0x442, 0x430, 0x43f,
-0x430, 0x434, 0x430, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x43d, 0x44f, 0x3b, 0x1798, 0x1780, 0x179a, 0x17b6, 0x3b, 0x1780, 0x17bb, 0x1798, 0x17d2,
-0x1797, 0x17c8, 0x3b, 0x1798, 0x17b8, 0x1793, 0x17b6, 0x3b, 0x1798, 0x17c1, 0x179f, 0x17b6, 0x3b, 0x17a7, 0x179f, 0x1797, 0x17b6, 0x3b, 0x1798, 0x17b7,
-0x1790, 0x17bb, 0x1793, 0x17b6, 0x3b, 0x1780, 0x1780, 0x17d2, 0x1780, 0x178a, 0x17b6, 0x3b, 0x179f, 0x17b8, 0x17a0, 0x17b6, 0x3b, 0x1780, 0x1789, 0x17d2,
-0x1789, 0x17b6, 0x3b, 0x178f, 0x17bb, 0x179b, 0x17b6, 0x3b, 0x179c, 0x17b7, 0x1785, 0x17d2, 0x1786, 0x17b7, 0x1780, 0x17b6, 0x3b, 0x1792, 0x17d2, 0x1793,
-0x17bc, 0x3b, 0x1798, 0x3b, 0x1780, 0x3b, 0x1798, 0x3b, 0x1798, 0x3b, 0x17a7, 0x3b, 0x1798, 0x3b, 0x1780, 0x3b, 0x179f, 0x3b, 0x1780, 0x3b,
-0x178f, 0x3b, 0x179c, 0x3b, 0x1792, 0x3b, 0x67, 0x65, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72,
-0xe7, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x6a, 0x75, 0x6c,
-0x2e, 0x3b, 0x61, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e,
-0x3b, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x3b, 0x6d,
-0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b,
-0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72,
-0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64,
-0x65, 0x73, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x47, 0x4e, 0x3b, 0x46, 0x42, 0x3b, 0x4d, 0xc7, 0x3b, 0x41, 0x42, 0x3b,
-0x4d, 0x47, 0x3b, 0x4a, 0x4e, 0x3b, 0x4a, 0x4c, 0x3b, 0x41, 0x47, 0x3b, 0x53, 0x54, 0x3b, 0x4f, 0x43, 0x3b, 0x4e, 0x56,
-0x3b, 0x44, 0x53, 0x3b, 0x64, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x2e,
-0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x64, 0x2019, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6d,
-0x61, 0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x2e, 0x3b,
-0x64, 0x2019, 0x61, 0x67, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x2e,
-0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x64, 0x65, 0x20,
-0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x6d,
-0x61, 0x72, 0xe7, 0x3b, 0x64, 0x2019, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x67, 0x3b,
-0x64, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x64, 0x2019,
-0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019,
-0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b,
-0x64, 0x65, 0x20, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708,
-0x3b, 0x34, 0x6708, 0x3b, 0x35, 0x6708, 0x3b, 0x36, 0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31,
-0x30, 0x6708, 0x3b, 0x31, 0x31, 0x6708, 0x3b, 0x31, 0x32, 0x6708, 0x3b, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708, 0x3b,
-0x56db, 0x6708, 0x3b, 0x4e94, 0x6708, 0x3b, 0x516d, 0x6708, 0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708,
-0x3b, 0x5341, 0x4e00, 0x6708, 0x3b, 0x5341, 0x4e8c, 0x6708, 0x3b, 0x73, 0x69, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x3b, 0x6f, 0x17e,
-0x75, 0x3b, 0x74, 0x72, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x72, 0x70, 0x3b, 0x6b, 0x6f,
-0x6c, 0x3b, 0x72, 0x75, 0x6a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x73, 0x74, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x3b, 0x73, 0x69,
-0x6a, 0x65, 0x10d, 0x61, 0x6e, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d, 0x61, 0x3b, 0x6f, 0x17e, 0x75, 0x6a, 0x61,
-0x6b, 0x3b, 0x74, 0x72, 0x61, 0x76, 0x61, 0x6e, 0x6a, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x61, 0x6e, 0x6a, 0x3b, 0x6c, 0x69,
-0x70, 0x61, 0x6e, 0x6a, 0x3b, 0x73, 0x72, 0x70, 0x61, 0x6e, 0x6a, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x3b,
-0x72, 0x75, 0x6a, 0x61, 0x6e, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x73, 0x74, 0x75, 0x64, 0x65,
-0x6e, 0x69, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x61, 0x63, 0x3b, 0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e,
-0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e, 0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31,
-0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32, 0x2e, 0x3b, 0x73, 0x69, 0x6a, 0x65, 0x10d, 0x6e, 0x6a, 0x61, 0x3b,
-0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d, 0x65, 0x3b, 0x6f, 0x17e, 0x75, 0x6a, 0x6b, 0x61, 0x3b, 0x74, 0x72, 0x61, 0x76, 0x6e,
-0x6a, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x6e, 0x6a, 0x61, 0x3b, 0x6c, 0x69, 0x70, 0x6e, 0x6a, 0x61, 0x3b, 0x73, 0x72,
-0x70, 0x6e, 0x6a, 0x61, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x61, 0x3b, 0x72, 0x75, 0x6a, 0x6e, 0x61, 0x3b,
-0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61, 0x3b, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x6f, 0x67, 0x61, 0x3b,
-0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x63, 0x61, 0x3b, 0x6c, 0x65, 0x64, 0x3b, 0xfa, 0x6e, 0x6f, 0x3b, 0x62, 0x159, 0x65,
-0x3b, 0x64, 0x75, 0x62, 0x3b, 0x6b, 0x76, 0x11b, 0x3b, 0x10d, 0x76, 0x6e, 0x3b, 0x10d, 0x76, 0x63, 0x3b, 0x73, 0x72, 0x70,
-0x3b, 0x7a, 0xe1, 0x159, 0x3b, 0x159, 0xed, 0x6a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x70, 0x72, 0x6f, 0x3b, 0x6c, 0x65, 0x64,
-0x65, 0x6e, 0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x3b, 0x62, 0x159, 0x65, 0x7a, 0x65, 0x6e, 0x3b, 0x64, 0x75, 0x62, 0x65, 0x6e,
-0x3b, 0x6b, 0x76, 0x11b, 0x74, 0x65, 0x6e, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65,
-0x6e, 0x65, 0x63, 0x3b, 0x73, 0x72, 0x70, 0x65, 0x6e, 0x3b, 0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159, 0xed, 0x6a, 0x65, 0x6e,
-0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x65, 0x63, 0x3b, 0x6c,
-0x65, 0x64, 0x6e, 0x61, 0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x61, 0x3b, 0x62, 0x159, 0x65, 0x7a, 0x6e, 0x61, 0x3b, 0x64, 0x75,
-0x62, 0x6e, 0x61, 0x3b, 0x6b, 0x76, 0x11b, 0x74, 0x6e, 0x61, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x6e, 0x61, 0x3b, 0x10d, 0x65,
-0x72, 0x76, 0x65, 0x6e, 0x63, 0x65, 0x3b, 0x73, 0x72, 0x70, 0x6e, 0x61, 0x3b, 0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159, 0xed,
-0x6a, 0x6e, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e,
-0x63, 0x65, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70,
-0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67,
-0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63,
-0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72,
-0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75,
-0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x72, 0x74, 0x2e,
-0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b,
-0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
-0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x6d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75,
-0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x65, 0x70,
-0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65,
-0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e,
-0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x63, 0x74,
-0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b,
-0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b,
-0x61, 0x16d, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b,
-0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72,
-0x74, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x6f, 0x3b, 0x6d, 0x61, 0x6a, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f,
-0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x16d, 0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65,
-0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72,
-0x6f, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6a, 0x61, 0x61, 0x6e, 0x3b, 0x76, 0x65, 0x65, 0x62,
-0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e,
-0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74,
-0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x3b, 0x6a, 0x61, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x76, 0x65,
-0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x6c, 0x3b,
-0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75,
-0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65,
-0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
-0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72,
-0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70,
-0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b,
-0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d,
-0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b,
+0x102d, 0x102f, 0x3b, 0x1012, 0x102e, 0x1007, 0x3b, 0x1016, 0x3b, 0x1019, 0x3b, 0x1027, 0x3b, 0x1019, 0x3b, 0x1007, 0x3b, 0x1007, 0x3b, 0x1029,
+0x3b, 0x1005, 0x3b, 0x1021, 0x3b, 0x1014, 0x3b, 0x1012, 0x441, 0x442, 0x443, 0x434, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442,
+0x44b, 0x3b, 0x441, 0x430, 0x43a, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x441, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x43c,
+0x430, 0x439, 0x3b, 0x447, 0x44d, 0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x436, 0x43d,
+0x456, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x432, 0x435, 0x440, 0x430, 0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440,
+0x44b, 0x447, 0x43d, 0x456, 0x43a, 0x3b, 0x43b, 0x456, 0x441, 0x442, 0x430, 0x43f, 0x430, 0x434, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x430,
+0x43d, 0x44c, 0x441, 0x442, 0x443, 0x434, 0x437, 0x435, 0x43d, 0x44f, 0x3b, 0x43b, 0x44e, 0x442, 0x430, 0x433, 0x430, 0x3b, 0x441, 0x430,
+0x43a, 0x430, 0x432, 0x456, 0x43a, 0x430, 0x3b, 0x43a, 0x440, 0x430, 0x441, 0x430, 0x432, 0x456, 0x43a, 0x430, 0x3b, 0x43c, 0x430, 0x44f,
+0x3b, 0x447, 0x44d, 0x440, 0x432, 0x435, 0x43d, 0x44f, 0x3b, 0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44f, 0x3b, 0x436, 0x43d, 0x456, 0x45e,
+0x43d, 0x44f, 0x3b, 0x432, 0x435, 0x440, 0x430, 0x441, 0x43d, 0x44f, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b, 0x447, 0x43d, 0x456,
+0x43a, 0x430, 0x3b, 0x43b, 0x456, 0x441, 0x442, 0x430, 0x43f, 0x430, 0x434, 0x430, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x43d, 0x44f, 0x441,
+0x442, 0x443, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x441, 0x430, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x447,
+0x44d, 0x440, 0x3b, 0x43b, 0x456, 0x43f, 0x3b, 0x436, 0x43d, 0x456, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x43a, 0x430, 0x441, 0x3b, 0x43b,
+0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435, 0x441, 0x442, 0x443, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x441, 0x430, 0x43a, 0x3b, 0x43a, 0x440,
+0x430, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x447, 0x44d, 0x440, 0x3b, 0x43b, 0x456, 0x43f, 0x3b, 0x436, 0x43d, 0x456, 0x3b, 0x432, 0x435,
+0x440, 0x3b, 0x43a, 0x430, 0x441, 0x3b, 0x43b, 0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435, 0x441, 0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x43a,
+0x3b, 0x43c, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x436, 0x3b, 0x432, 0x3b, 0x43a, 0x3b, 0x43b, 0x3b, 0x441, 0x1798, 0x1780, 0x179a, 0x17b6,
+0x3b, 0x1780, 0x17bb, 0x1798, 0x17d2, 0x1797, 0x17c8, 0x3b, 0x1798, 0x17b8, 0x1793, 0x17b6, 0x3b, 0x1798, 0x17c1, 0x179f, 0x17b6, 0x3b, 0x17a7, 0x179f,
+0x1797, 0x17b6, 0x3b, 0x1798, 0x17b7, 0x1790, 0x17bb, 0x1793, 0x17b6, 0x3b, 0x1780, 0x1780, 0x17d2, 0x1780, 0x178a, 0x17b6, 0x3b, 0x179f, 0x17b8, 0x17a0,
+0x17b6, 0x3b, 0x1780, 0x1789, 0x17d2, 0x1789, 0x17b6, 0x3b, 0x178f, 0x17bb, 0x179b, 0x17b6, 0x3b, 0x179c, 0x17b7, 0x1785, 0x17d2, 0x1786, 0x17b7, 0x1780,
+0x17b6, 0x3b, 0x1792, 0x17d2, 0x1793, 0x17bc, 0x1798, 0x3b, 0x1780, 0x3b, 0x1798, 0x3b, 0x1798, 0x3b, 0x17a7, 0x3b, 0x1798, 0x3b, 0x1780, 0x3b,
+0x179f, 0x3b, 0x1780, 0x3b, 0x178f, 0x3b, 0x179c, 0x3b, 0x1792, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65,
+0x72, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75,
+0x6e, 0x79, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72,
+0x65, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x64, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x64,
+0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x64, 0x2019, 0x61,
+0x62, 0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x79,
+0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x64,
+0x65, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65,
+0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x73, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b,
+0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b,
+0x61, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64,
+0x65, 0x73, 0x2e, 0x64, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b,
+0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x64, 0x2019, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61,
+0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x64,
+0x2019, 0x61, 0x67, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x2e, 0x3b,
+0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x73, 0x2e, 0x47, 0x4e, 0x3b, 0x46, 0x42,
+0x3b, 0x4d, 0xc7, 0x3b, 0x41, 0x42, 0x3b, 0x4d, 0x47, 0x3b, 0x4a, 0x4e, 0x3b, 0x4a, 0x4c, 0x3b, 0x41, 0x47, 0x3b, 0x53,
+0x54, 0x3b, 0x4f, 0x43, 0x3b, 0x4e, 0x56, 0x3b, 0x44, 0x53, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708, 0x3b, 0x56db,
+0x6708, 0x3b, 0x4e94, 0x6708, 0x3b, 0x516d, 0x6708, 0x3b, 0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708, 0x3b,
+0x5341, 0x4e00, 0x6708, 0x3b, 0x5341, 0x4e8c, 0x6708, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35,
+0x6708, 0x3b, 0x36, 0x6708, 0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30, 0x6708, 0x3b, 0x31, 0x31,
+0x6708, 0x3b, 0x31, 0x32, 0x6708, 0x73, 0x69, 0x6a, 0x65, 0x10d, 0x61, 0x6e, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d,
+0x61, 0x3b, 0x6f, 0x17e, 0x75, 0x6a, 0x61, 0x6b, 0x3b, 0x74, 0x72, 0x61, 0x76, 0x61, 0x6e, 0x6a, 0x3b, 0x73, 0x76, 0x69,
+0x62, 0x61, 0x6e, 0x6a, 0x3b, 0x6c, 0x69, 0x70, 0x61, 0x6e, 0x6a, 0x3b, 0x73, 0x72, 0x70, 0x61, 0x6e, 0x6a, 0x3b, 0x6b,
+0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x3b, 0x72, 0x75, 0x6a, 0x61, 0x6e, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61,
+0x64, 0x3b, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x69, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x61, 0x63, 0x73, 0x69,
+0x6a, 0x65, 0x10d, 0x6e, 0x6a, 0x61, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d, 0x65, 0x3b, 0x6f, 0x17e, 0x75, 0x6a, 0x6b,
+0x61, 0x3b, 0x74, 0x72, 0x61, 0x76, 0x6e, 0x6a, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x6e, 0x6a, 0x61, 0x3b, 0x6c, 0x69,
+0x70, 0x6e, 0x6a, 0x61, 0x3b, 0x73, 0x72, 0x70, 0x6e, 0x6a, 0x61, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x61,
+0x3b, 0x72, 0x75, 0x6a, 0x6e, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61, 0x3b, 0x73, 0x74, 0x75,
+0x64, 0x65, 0x6e, 0x6f, 0x67, 0x61, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x63, 0x61, 0x73, 0x69, 0x6a, 0x3b, 0x76,
+0x65, 0x6c, 0x6a, 0x3b, 0x6f, 0x17e, 0x75, 0x3b, 0x74, 0x72, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x3b, 0x6c, 0x69, 0x70, 0x3b,
+0x73, 0x72, 0x70, 0x3b, 0x6b, 0x6f, 0x6c, 0x3b, 0x72, 0x75, 0x6a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x73, 0x74, 0x75, 0x3b,
+0x70, 0x72, 0x6f, 0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e,
+0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32,
+0x2e, 0x6c, 0x65, 0x64, 0x65, 0x6e, 0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x3b, 0x62, 0x159, 0x65, 0x7a, 0x65, 0x6e, 0x3b, 0x64,
+0x75, 0x62, 0x65, 0x6e, 0x3b, 0x6b, 0x76, 0x11b, 0x74, 0x65, 0x6e, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x3b, 0x10d,
+0x65, 0x72, 0x76, 0x65, 0x6e, 0x65, 0x63, 0x3b, 0x73, 0x72, 0x70, 0x65, 0x6e, 0x3b, 0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159,
+0xed, 0x6a, 0x65, 0x6e, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e,
+0x65, 0x63, 0x6c, 0x65, 0x64, 0x6e, 0x61, 0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x61, 0x3b, 0x62, 0x159, 0x65, 0x7a, 0x6e, 0x61,
+0x3b, 0x64, 0x75, 0x62, 0x6e, 0x61, 0x3b, 0x6b, 0x76, 0x11b, 0x74, 0x6e, 0x61, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x6e, 0x61,
+0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x63, 0x65, 0x3b, 0x73, 0x72, 0x70, 0x6e, 0x61, 0x3b, 0x7a, 0xe1, 0x159, 0xed,
+0x3b, 0x159, 0xed, 0x6a, 0x6e, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x75, 0x3b, 0x70, 0x72, 0x6f,
+0x73, 0x69, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x3b, 0xfa, 0x6e, 0x6f, 0x3b, 0x62, 0x159, 0x65, 0x3b, 0x64, 0x75, 0x62,
+0x3b, 0x6b, 0x76, 0x11b, 0x3b, 0x10d, 0x76, 0x6e, 0x3b, 0x10d, 0x76, 0x63, 0x3b, 0x73, 0x72, 0x70, 0x3b, 0x7a, 0xe1, 0x159,
+0x3b, 0x159, 0xed, 0x6a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x70, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66,
+0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d,
+0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b,
0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x2e,
-0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b,
-0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b,
-0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69,
-0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x3b,
-0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x3b, 0x65, 0x6c, 0x6f,
-0x3b, 0x73, 0x79, 0x79, 0x73, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x3b, 0x6a, 0x6f,
-0x75, 0x6c, 0x75, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75,
-0x75, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75,
-0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x65,
-0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75,
-0x75, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75, 0x75, 0x3b,
-0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x75, 0x75, 0x3b, 0x54, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x4b,
-0x3b, 0x48, 0x3b, 0x45, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x2e,
-0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x2e, 0x3b, 0x68, 0x75,
-0x68, 0x74, 0x69, 0x6b, 0x2e, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x2e, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x2e,
-0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x2e, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x2e, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b,
-0x2e, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x2e, 0x3b, 0x6a, 0x6f,
-0x75, 0x6c, 0x75, 0x6b, 0x2e, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x65, 0x6c,
-0x6d, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b,
-0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75, 0x74,
-0x61, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75,
-0x74, 0x61, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x74,
-0x61, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75,
-0x75, 0x74, 0x61, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x2e,
-0x3b, 0x66, 0xe9, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69,
-0x3b, 0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70,
-0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x3b, 0x6a, 0x61,
-0x6e, 0x76, 0x69, 0x65, 0x72, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x69, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61,
-0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x65,
-0x74, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74,
-0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62,
-0x72, 0x65, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b,
-0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x2e,
-0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76,
-0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0xe9, 0x76, 0x2e, 0x3b, 0x6d, 0x61, 0x72,
-0x2e, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x2e, 0x3b, 0x6a, 0x75, 0x69, 0x6c,
-0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f,
-0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x72, 0x74, 0x3b,
-0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b,
-0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x6e,
-0x65, 0x77, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x77, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x4d, 0x61,
-0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x61, 0x69, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x79,
-0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x69,
-0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x69, 0x6d, 0x62, 0x65,
-0x72, 0x3b, 0x44, 0x65, 0x73, 0x69, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x46, 0x61, 0x6f, 0x69, 0x3b, 0x47, 0x65, 0x61, 0x72,
-0x72, 0x3b, 0x4d, 0xe0, 0x72, 0x74, 0x3b, 0x47, 0x69, 0x62, 0x6c, 0x3b, 0x43, 0xe8, 0x69, 0x74, 0x3b, 0xd2, 0x67, 0x6d,
-0x68, 0x3b, 0x49, 0x75, 0x63, 0x68, 0x3b, 0x4c, 0xf9, 0x6e, 0x61, 0x3b, 0x53, 0x75, 0x6c, 0x74, 0x3b, 0x44, 0xe0, 0x6d,
-0x68, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x3b, 0x44, 0xf9, 0x62, 0x68, 0x3b, 0x41, 0x6d, 0x20, 0x46, 0x61, 0x6f, 0x69, 0x6c,
-0x6c, 0x65, 0x61, 0x63, 0x68, 0x3b, 0x41, 0x6e, 0x20, 0x47, 0x65, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x3b, 0x41, 0x6d, 0x20,
-0x4d, 0xe0, 0x72, 0x74, 0x3b, 0x41, 0x6e, 0x20, 0x47, 0x69, 0x62, 0x6c, 0x65, 0x61, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x43,
-0xe8, 0x69, 0x74, 0x65, 0x61, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d, 0xd2, 0x67, 0x6d, 0x68, 0x69, 0x6f, 0x73, 0x3b,
-0x41, 0x6e, 0x20, 0x74, 0x2d, 0x49, 0x75, 0x63, 0x68, 0x61, 0x72, 0x3b, 0x41, 0x6e, 0x20, 0x4c, 0xf9, 0x6e, 0x61, 0x73,
-0x74, 0x61, 0x6c, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d, 0x53, 0x75, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x3b, 0x41, 0x6e, 0x20,
-0x44, 0xe0, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e,
-0x3b, 0x41, 0x6e, 0x20, 0x44, 0xf9, 0x62, 0x68, 0x6c, 0x61, 0x63, 0x68, 0x64, 0x3b, 0x46, 0x3b, 0x47, 0x3b, 0x4d, 0x3b,
-0x47, 0x3b, 0x43, 0x3b, 0xd2, 0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x44, 0x3b, 0x64, 0x68,
-0x65, 0x6e, 0x20, 0x46, 0x68, 0x61, 0x6f, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x63, 0x68, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20,
-0x47, 0x68, 0x65, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x4d, 0x68, 0xe0, 0x72, 0x74, 0x3b,
-0x64, 0x68, 0x65, 0x6e, 0x20, 0x47, 0x68, 0x69, 0x62, 0x6c, 0x65, 0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x43,
-0x68, 0xe8, 0x69, 0x74, 0x65, 0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0xd2, 0x67, 0x6d, 0x68, 0x69, 0x6f, 0x73,
-0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x49, 0x75, 0x63, 0x68, 0x61, 0x72, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x4c, 0xf9,
-0x6e, 0x61, 0x73, 0x74, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x2d, 0x53, 0x75, 0x6c, 0x74, 0x61, 0x69,
-0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x44, 0xe0, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20,
-0x74, 0x2d, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x44, 0xf9, 0x62, 0x68, 0x6c,
-0x61, 0x63, 0x68, 0x64, 0x3b, 0x58, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b,
-0x41, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x58, 0x75, 0xf1, 0x6f, 0x3b, 0x58, 0x75, 0x6c, 0x2e, 0x3b,
-0x41, 0x67, 0x6f, 0x2e, 0x3b, 0x53, 0x65, 0x74, 0x2e, 0x3b, 0x4f, 0x75, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b,
-0x44, 0x65, 0x63, 0x2e, 0x3b, 0x58, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x69, 0x72,
-0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x58,
-0x75, 0xf1, 0x6f, 0x3b, 0x58, 0x75, 0x6c, 0x6c, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74,
-0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x58, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b,
-0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x78, 0x61, 0x6e, 0x2e,
-0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x6f,
-0x3b, 0x78, 0x75, 0xf1, 0x6f, 0x3b, 0x78, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e,
-0x3b, 0x6f, 0x75, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x78, 0x61, 0x6e, 0x65,
-0x69, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61,
-0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x78, 0x75, 0xf1, 0x6f, 0x3b, 0x78, 0x75, 0x6c, 0x6c, 0x6f,
-0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x75, 0x74,
-0x75, 0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
-0x72, 0x6f, 0x3b, 0x78, 0x2e, 0x3b, 0x66, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x61, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x78, 0x2e,
-0x3b, 0x78, 0x2e, 0x3b, 0x61, 0x2e, 0x3b, 0x73, 0x2e, 0x3b, 0x6f, 0x2e, 0x3b, 0x6e, 0x2e, 0x3b, 0x64, 0x2e, 0x3b, 0x10d8,
-0x10d0, 0x10dc, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x3b, 0x10d8,
-0x10d5, 0x10dc, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x3b, 0x10dc,
-0x10dd, 0x10d4, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x3b, 0x10d8, 0x10d0, 0x10dc, 0x10d5, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x10d4, 0x10e0,
-0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x10e2, 0x10d8, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x10d8, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0,
-0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d0, 0x10d2,
-0x10d5, 0x10d8, 0x10e1, 0x10e2, 0x10dd, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x10e2, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dd, 0x10e5, 0x10e2,
-0x10dd, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x10d4,
-0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d7, 0x3b, 0x10db, 0x3b, 0x10d0, 0x3b, 0x10db, 0x3b, 0x10d8, 0x3b, 0x10d8, 0x3b,
-0x10d0, 0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b, 0x10dc, 0x3b, 0x10d3, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4,
-0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75,
-0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0x61,
-0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70,
-0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75,
-0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
-0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x2e,
-0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b,
-0x53, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e,
-0x3b, 0x4a, 0xe4, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69,
-0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74,
-0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0xe4, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72,
-0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a,
-0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0xe4, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62,
-0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69,
-0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e,
-0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x3b, 0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3b, 0x39c,
-0x3ac, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b, 0x39c, 0x3ac, 0x3b9, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bb,
-0x3b, 0x391, 0x3cd, 0x3b3, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3b, 0x39d, 0x3bf, 0x3ad, 0x3b, 0x394, 0x3b5, 0x3ba,
-0x3b, 0x399, 0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3ac, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3ac, 0x3c1,
-0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39c, 0x3ac, 0x3c1, 0x3c4, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3af, 0x3bb, 0x3b9, 0x3bf, 0x3c2,
-0x3b, 0x39c, 0x3ac, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bd, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bb, 0x3b9,
-0x3bf, 0x3c2, 0x3b, 0x391, 0x3cd, 0x3b3, 0x3bf, 0x3c5, 0x3c3, 0x3c4, 0x3bf, 0x3c2, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3ad, 0x3bc, 0x3b2,
-0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3ce, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39d, 0x3bf, 0x3ad, 0x3bc, 0x3b2,
-0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3b, 0x3a6, 0x3b,
-0x39c, 0x3b, 0x391, 0x3b, 0x39c, 0x3b, 0x399, 0x3b, 0x399, 0x3b, 0x391, 0x3b, 0x3a3, 0x3b, 0x39f, 0x3b, 0x39d, 0x3b, 0x394, 0x3b,
-0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b, 0x39c, 0x3b1, 0x390, 0x3b,
-0x399, 0x3bf, 0x3c5, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3b, 0x391, 0x3c5, 0x3b3, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba,
-0x3c4, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b, 0x399, 0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3b1, 0x3c1, 0x3af, 0x3bf, 0x3c5,
-0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3b1, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3c4, 0x3af, 0x3bf, 0x3c5,
-0x3b, 0x391, 0x3c0, 0x3c1, 0x3b9, 0x3bb, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39c, 0x3b1, 0x390, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bd,
-0x3af, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x391, 0x3c5, 0x3b3, 0x3bf, 0x3cd, 0x3c3, 0x3c4, 0x3bf,
-0x3c5, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3b5, 0x3bc, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3c9, 0x3b2, 0x3c1,
-0x3af, 0x3bf, 0x3c5, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3bc, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b5, 0x3bc, 0x3b2,
-0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70,
-0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65,
-0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61,
-0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x69, 0x3b,
-0x61, 0x70, 0x72, 0x69, 0x69, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6a, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b,
-0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x67, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d,
-0x62, 0x61, 0x72, 0x69, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x61, 0x72, 0x69, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x61,
-0x72, 0x69, 0x70, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x69,
-0x70, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x69, 0x6c, 0x69, 0x70, 0x3b, 0x6d, 0x61, 0x61, 0x6a, 0x69, 0x70, 0x3b, 0x6a, 0x75,
-0x75, 0x6e, 0x69, 0x70, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x70, 0x3b, 0x61, 0x67, 0x67, 0x75, 0x73, 0x74, 0x69, 0x70,
-0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72,
-0x69, 0x70, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
-0x61, 0x72, 0x69, 0x70, 0x3b, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0x3b, 0xaae,
-0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c,
-0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7, 0x3b, 0xa91, 0xa95, 0xacd,
-0xa9f, 0xacb, 0x3b, 0xaa8, 0xab5, 0xac7, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0x3b, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0xa86, 0xab0,
-0xac0, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaae, 0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa,
-0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97,
-0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacb, 0xaac,
-0xab0, 0x3b, 0xaa8, 0xab5, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa9c,
-0xabe, 0x3b, 0xaab, 0xac7, 0x3b, 0xaae, 0xabe, 0x3b, 0xa8f, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0x3b, 0xa9c, 0xac1, 0x3b, 0xa91,
-0x3b, 0xab8, 0x3b, 0xa91, 0x3b, 0xaa8, 0x3b, 0xaa1, 0xabf, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x61, 0x62, 0x3b, 0x4d, 0x61,
-0x72, 0x3b, 0x41, 0x66, 0x69, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x41, 0x67,
-0x75, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x75, 0x77, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61,
-0x6e, 0x61, 0x69, 0x72, 0x75, 0x3b, 0x46, 0x61, 0x62, 0x75, 0x72, 0x61, 0x69, 0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x69,
-0x73, 0x3b, 0x41, 0x66, 0x69, 0x72, 0x69, 0x6c, 0x75, 0x3b, 0x4d, 0x61, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x69, 0x3b,
-0x59, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x3b,
-0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x75, 0x77, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d,
-0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x41, 0x3b, 0x53,
-0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x5d9, 0x5e0, 0x5d5, 0x5f3, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5f3, 0x3b, 0x5de, 0x5e8, 0x5e5,
-0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5f3, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b,
-0x5d0, 0x5d5, 0x5d2, 0x5f3, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5f3, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5f3, 0x3b, 0x5e0, 0x5d5, 0x5d1, 0x5f3, 0x3b,
-0x5d3, 0x5e6, 0x5de, 0x5f3, 0x3b, 0x5d9, 0x5e0, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5de, 0x5e8,
-0x5e5, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5d9, 0x5dc, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc,
-0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5d8,
-0x5d5, 0x5d1, 0x5e8, 0x3b, 0x5e0, 0x5d5, 0x5d1, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x91c, 0x928, 0x970,
-0x3b, 0x92b, 0x93c, 0x930, 0x970, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e,
-0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x970, 0x3b, 0x905, 0x917, 0x970, 0x3b, 0x938, 0x93f, 0x924, 0x970, 0x3b,
-0x905, 0x915, 0x94d, 0x924, 0x942, 0x970, 0x3b, 0x928, 0x935, 0x970, 0x3b, 0x926, 0x93f, 0x938, 0x970, 0x3b, 0x91c, 0x928, 0x935, 0x930,
-0x940, 0x3b, 0x92b, 0x93c, 0x930, 0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948,
-0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924,
-0x3b, 0x938, 0x93f, 0x924, 0x902, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c,
-0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x3b, 0x91c, 0x3b, 0x92b, 0x93c, 0x3b, 0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e,
-0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x3b, 0x938, 0x93f, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x3b, 0x6a,
-0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x2e, 0x3b, 0xe1, 0x70, 0x72, 0x2e,
-0x3b, 0x6d, 0xe1, 0x6a, 0x2e, 0x3b, 0x6a, 0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e,
-0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65,
-0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x3b, 0x6d, 0xe1,
-0x72, 0x63, 0x69, 0x75, 0x73, 0x3b, 0xe1, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0xe1, 0x6a, 0x75, 0x73, 0x3b,
-0x6a, 0xfa, 0x6e, 0x69, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6c, 0x69, 0x75, 0x73, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x7a,
-0x74, 0x75, 0x73, 0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62,
+0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e, 0x3b,
+0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a,
+0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f,
+0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69,
+0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69,
+0x6c, 0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75,
+0x73, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62,
0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0xc1, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x7a, 0x3b,
-0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e,
-0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c, 0x2e, 0x3b,
-0xe1, 0x67, 0xfa, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0xf3, 0x76, 0x2e, 0x3b,
-0x64, 0x65, 0x73, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0xfa, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0xfa, 0x61, 0x72, 0x3b,
-0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e, 0xed, 0x3b,
-0x6a, 0xfa, 0x6c, 0xed, 0x3b, 0xe1, 0x67, 0xfa, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0xf3, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65,
-0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a,
-0x3b, 0xc1, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d,
-0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41,
-0x67, 0x75, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a,
-0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x72, 0x65,
-0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c,
-0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70,
+0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x72, 0x74, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b,
+0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73,
+0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x4a, 0x61,
+0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61,
+0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70,
+0x2e, 0x3b, 0x4f, 0x63, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x63, 0x2e, 0x6a, 0x61, 0x6e, 0x75,
+0x61, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x6f, 0x3b, 0x61,
+0x70, 0x72, 0x69, 0x6c, 0x6f, 0x3b, 0x6d, 0x61, 0x6a, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c,
+0x69, 0x6f, 0x3b, 0x61, 0x16d, 0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f,
+0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65,
+0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70,
+0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x16d, 0x67, 0x3b, 0x73, 0x65,
+0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x61, 0x6e, 0x75, 0x61, 0x72,
+0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69,
+0x6c, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61,
+0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
+0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x6a, 0x61, 0x61, 0x6e, 0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b,
+0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b,
+0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x74,
+0x73, 0x4a, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
+0x3b, 0x4e, 0x3b, 0x44, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d,
+0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a,
+0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
+0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65,
+0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70,
0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65,
-0x70, 0x3b, 0x6f, 0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x69, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x6f, 0x3b,
-0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c,
-0x69, 0x6f, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65,
-0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65,
-0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a,
-0x3b, 0x61, 0x3b, 0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x45, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68,
-0x3b, 0x4d, 0xe1, 0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x74,
-0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x3b, 0x4d, 0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x44, 0x46, 0xf3,
-0x6d, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x3b, 0x45, 0x61, 0x6e, 0xe1, 0x69, 0x72, 0x3b,
-0x46, 0x65, 0x61, 0x62, 0x68, 0x72, 0x61, 0x3b, 0x4d, 0xe1, 0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x72, 0x65, 0xe1,
-0x6e, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x65, 0x61, 0x6d,
-0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x61, 0x73, 0x61, 0x3b, 0x4d, 0x65, 0xe1, 0x6e, 0x20, 0x46,
-0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x44, 0x65, 0x69, 0x72, 0x65, 0x61, 0x64, 0x68, 0x20, 0x46, 0xf3, 0x6d, 0x68,
-0x61, 0x69, 0x72, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x61, 0x69, 0x67, 0x3b,
-0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x42, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x44, 0x3b,
-0x53, 0x3b, 0x4e, 0x3b, 0x67, 0x65, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b,
-0x6d, 0x61, 0x67, 0x3b, 0x67, 0x69, 0x75, 0x3b, 0x6c, 0x75, 0x67, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b,
-0x6f, 0x74, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x3b, 0x67, 0x65, 0x6e, 0x6e, 0x61, 0x69, 0x6f, 0x3b,
-0x66, 0x65, 0x62, 0x62, 0x72, 0x61, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c,
-0x65, 0x3b, 0x6d, 0x61, 0x67, 0x67, 0x69, 0x6f, 0x3b, 0x67, 0x69, 0x75, 0x67, 0x6e, 0x6f, 0x3b, 0x6c, 0x75, 0x67, 0x6c,
-0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b,
-0x6f, 0x74, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63,
-0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x47, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x4c, 0x3b,
-0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61,
-0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67,
-0x74, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0xc9c, 0xca8,
-0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0x3b,
-0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0x3b, 0xcb8, 0xcc6, 0xcaa, 0xccd,
-0xc9f, 0xcc6, 0xc82, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82,
-0x3b, 0xc9c, 0xca8, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd,
-0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0xcb2, 0xccd, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c,
-0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0xcb8, 0xccd, 0xc9f, 0xccd, 0x3b, 0xcb8, 0xcc6, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0xcac, 0xcb0,
-0xccd, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca1,
-0xcbf, 0xcb8, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xc9c, 0x3b, 0xcab, 0xcc6, 0x3b, 0xcae, 0xcbe, 0x3b, 0xc8f, 0x3b, 0xcae, 0xcc7,
-0x3b, 0xc9c, 0xcc2, 0x3b, 0xc9c, 0xcc1, 0x3b, 0xc86, 0x3b, 0xcb8, 0xcc6, 0x3b, 0xc85, 0x3b, 0xca8, 0x3b, 0xca1, 0xcbf, 0x3b, 0xc9c,
-0xca8, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd,
-0x3b, 0xc8f, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b,
-0xc86, 0xc97, 0x3b, 0xcb8, 0xcc6, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0x3b, 0xca8, 0xcb5, 0xcc6,
-0xc82, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82, 0x3b, 0x62c, 0x646, 0x624, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x624, 0x631, 0x6cc, 0x3b,
-0x645, 0x627, 0x631, 0x655, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x654, 0x3b, 0x62c, 0x648, 0x657, 0x646,
-0x3b, 0x62c, 0x648, 0x657, 0x644, 0x627, 0x6cc, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b,
-0x627, 0x6a9, 0x62a, 0x648, 0x657, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b,
-0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x627, 0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x633, 0x3b,
-0x627, 0x3b, 0x646, 0x3b, 0x49b, 0x430, 0x4a3, 0x2e, 0x3b, 0x430, 0x49b, 0x43f, 0x2e, 0x3b, 0x43d, 0x430, 0x443, 0x2e, 0x3b, 0x441,
-0x4d9, 0x443, 0x2e, 0x3b, 0x43c, 0x430, 0x43c, 0x2e, 0x3b, 0x43c, 0x430, 0x443, 0x2e, 0x3b, 0x448, 0x456, 0x43b, 0x2e, 0x3b, 0x442,
-0x430, 0x43c, 0x2e, 0x3b, 0x49b, 0x44b, 0x440, 0x2e, 0x3b, 0x49b, 0x430, 0x437, 0x2e, 0x3b, 0x49b, 0x430, 0x440, 0x2e, 0x3b, 0x436,
-0x435, 0x43b, 0x2e, 0x3b, 0x49a, 0x430, 0x4a3, 0x442, 0x430, 0x440, 0x3b, 0x410, 0x49b, 0x43f, 0x430, 0x43d, 0x3b, 0x41d, 0x430, 0x443,
-0x440, 0x44b, 0x437, 0x3b, 0x421, 0x4d9, 0x443, 0x456, 0x440, 0x3b, 0x41c, 0x430, 0x43c, 0x44b, 0x440, 0x3b, 0x41c, 0x430, 0x443, 0x441,
-0x44b, 0x43c, 0x3b, 0x428, 0x456, 0x43b, 0x434, 0x435, 0x3b, 0x422, 0x430, 0x43c, 0x44b, 0x437, 0x3b, 0x49a, 0x44b, 0x440, 0x43a, 0x4af,
-0x439, 0x435, 0x43a, 0x3b, 0x49a, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x49a, 0x430, 0x440, 0x430, 0x448, 0x430, 0x3b, 0x416, 0x435, 0x43b,
-0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d, 0x3b, 0x49a, 0x3b, 0x410, 0x3b, 0x41d, 0x3b, 0x421, 0x3b, 0x41c, 0x3b, 0x41c, 0x3b, 0x428,
-0x3b, 0x422, 0x3b, 0x49a, 0x3b, 0x49a, 0x3b, 0x49a, 0x3b, 0x416, 0x3b, 0x49b, 0x430, 0x4a3, 0x442, 0x430, 0x440, 0x3b, 0x430, 0x49b,
-0x43f, 0x430, 0x43d, 0x3b, 0x43d, 0x430, 0x443, 0x440, 0x44b, 0x437, 0x3b, 0x441, 0x4d9, 0x443, 0x456, 0x440, 0x3b, 0x43c, 0x430, 0x43c,
-0x44b, 0x440, 0x3b, 0x43c, 0x430, 0x443, 0x441, 0x44b, 0x43c, 0x3b, 0x448, 0x456, 0x43b, 0x434, 0x435, 0x3b, 0x442, 0x430, 0x43c, 0x44b,
-0x437, 0x3b, 0x49b, 0x44b, 0x440, 0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49b, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x49b, 0x430, 0x440,
-0x430, 0x448, 0x430, 0x3b, 0x436, 0x435, 0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d, 0x3b, 0x6d, 0x75, 0x74, 0x2e, 0x3b, 0x67,
-0x61, 0x73, 0x2e, 0x3b, 0x77, 0x65, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x2e, 0x3b, 0x67, 0x69, 0x63, 0x2e, 0x3b, 0x6b,
-0x61, 0x6d, 0x2e, 0x3b, 0x6e, 0x79, 0x61, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x6e, 0x7a, 0x65, 0x2e, 0x3b, 0x75,
-0x6b, 0x77, 0x2e, 0x3b, 0x75, 0x67, 0x75, 0x2e, 0x3b, 0x75, 0x6b, 0x75, 0x2e, 0x3b, 0x4d, 0x75, 0x74, 0x61, 0x72, 0x61,
-0x6d, 0x61, 0x3b, 0x47, 0x61, 0x73, 0x68, 0x79, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x3b, 0x57, 0x65, 0x72, 0x75, 0x72,
-0x77, 0x65, 0x3b, 0x4d, 0x61, 0x74, 0x61, 0x3b, 0x47, 0x69, 0x63, 0x75, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x3b, 0x4b, 0x61,
-0x6d, 0x65, 0x6e, 0x61, 0x3b, 0x4e, 0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x4b, 0x61, 0x6e, 0x61, 0x6d, 0x61,
-0x3b, 0x4e, 0x7a, 0x65, 0x6c, 0x69, 0x3b, 0x55, 0x6b, 0x77, 0x61, 0x6b, 0x69, 0x72, 0x61, 0x3b, 0x55, 0x67, 0x75, 0x73,
-0x68, 0x79, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x55, 0x6b, 0x75, 0x62, 0x6f, 0x7a, 0x61, 0x3b, 0x42f, 0x43d, 0x432, 0x3b, 0x424,
-0x435, 0x432, 0x3b, 0x41c, 0x430, 0x440, 0x3b, 0x410, 0x43f, 0x440, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418,
-0x44e, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x3b, 0x421, 0x435, 0x43d, 0x3b, 0x41e, 0x43a, 0x442, 0x3b, 0x41d, 0x43e, 0x44f, 0x3b, 0x414,
-0x435, 0x43a, 0x3b, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x41c, 0x430,
-0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c, 0x3b, 0x418,
-0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b,
-0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431,
-0x440, 0x44c, 0x3b, 0x42f, 0x3b, 0x424, 0x3b, 0x41c, 0x3b, 0x410, 0x3b, 0x41c, 0x3b, 0x418, 0x3b, 0x418, 0x3b, 0x410, 0x3b, 0x421,
-0x3b, 0x41e, 0x3b, 0x41d, 0x3b, 0x414, 0x3b, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440,
-0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x2e, 0x3b, 0x438, 0x44e, 0x43b, 0x2e,
-0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x2e,
-0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c,
-0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d,
-0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431,
-0x440, 0x44c, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x434, 0x435,
-0x43a, 0x430, 0x431, 0x440, 0x44c, 0x3b, 0x31, 0xc6d4, 0x3b, 0x32, 0xc6d4, 0x3b, 0x33, 0xc6d4, 0x3b, 0x34, 0xc6d4, 0x3b, 0x35, 0xc6d4,
-0x3b, 0x36, 0xc6d4, 0x3b, 0x37, 0xc6d4, 0x3b, 0x38, 0xc6d4, 0x3b, 0x39, 0xc6d4, 0x3b, 0x31, 0x30, 0xc6d4, 0x3b, 0x31, 0x31, 0xc6d4,
-0x3b, 0x31, 0x32, 0xc6d4, 0x3b, 0x72, 0xea, 0x62, 0x3b, 0x72, 0x65, 0x15f, 0x3b, 0x61, 0x64, 0x61, 0x3b, 0x61, 0x76, 0x72,
-0x3b, 0x67, 0x75, 0x6c, 0x3b, 0x70, 0xfb, 0x15f, 0x3b, 0x74, 0xee, 0x72, 0x3b, 0x67, 0x65, 0x6c, 0x3b, 0x72, 0x65, 0x7a,
-0x3b, 0x6b, 0x65, 0x77, 0x3b, 0x73, 0x65, 0x72, 0x3b, 0x62, 0x65, 0x72, 0x3b, 0x72, 0xea, 0x62, 0x65, 0x6e, 0x64, 0x61,
-0x6e, 0x3b, 0x72, 0x65, 0x15f, 0x65, 0x6d, 0xee, 0x3b, 0x61, 0x64, 0x61, 0x72, 0x3b, 0x61, 0x76, 0x72, 0xea, 0x6c, 0x3b,
-0x67, 0x75, 0x6c, 0x61, 0x6e, 0x3b, 0x70, 0xfb, 0x15f, 0x70, 0x65, 0x72, 0x3b, 0x74, 0xee, 0x72, 0x6d, 0x65, 0x68, 0x3b,
-0x67, 0x65, 0x6c, 0x61, 0x77, 0xea, 0x6a, 0x3b, 0x72, 0x65, 0x7a, 0x62, 0x65, 0x72, 0x3b, 0x6b, 0x65, 0x77, 0xe7, 0xea,
-0x72, 0x3b, 0x73, 0x65, 0x72, 0x6d, 0x61, 0x77, 0x65, 0x7a, 0x3b, 0x62, 0x65, 0x72, 0x66, 0x61, 0x6e, 0x62, 0x61, 0x72,
-0x3b, 0x52, 0x3b, 0x52, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x47, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x47, 0x3b, 0x52, 0x3b, 0x4b,
-0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x72, 0xea, 0x62, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0xea, 0x3b, 0x72, 0x65, 0x15f, 0x65, 0x6d,
-0x69, 0x79, 0xea, 0x3b, 0x61, 0x64, 0x61, 0x72, 0xea, 0x3b, 0x61, 0x76, 0x72, 0xea, 0x6c, 0xea, 0x3b, 0x67, 0x75, 0x6c,
-0x61, 0x6e, 0xea, 0x3b, 0x70, 0xfb, 0x15f, 0x70, 0x65, 0x72, 0xea, 0x3b, 0x74, 0xee, 0x72, 0x6d, 0x65, 0x68, 0xea, 0x3b,
-0x67, 0x65, 0x6c, 0x61, 0x77, 0xea, 0x6a, 0xea, 0x3b, 0x72, 0x65, 0x7a, 0x62, 0x65, 0x72, 0xea, 0x3b, 0x6b, 0x65, 0x77,
-0xe7, 0xea, 0x72, 0xea, 0x3b, 0x73, 0x65, 0x72, 0x6d, 0x61, 0x77, 0x65, 0x7a, 0xea, 0x3b, 0x62, 0x65, 0x72, 0x66, 0x61,
-0x6e, 0x62, 0x61, 0x72, 0xea, 0x3b, 0x4d, 0x75, 0x74, 0x2e, 0x3b, 0x47, 0x61, 0x73, 0x2e, 0x3b, 0x57, 0x65, 0x72, 0x2e,
-0x3b, 0x4d, 0x61, 0x74, 0x2e, 0x3b, 0x47, 0x69, 0x63, 0x2e, 0x3b, 0x4b, 0x61, 0x6d, 0x2e, 0x3b, 0x4e, 0x79, 0x61, 0x2e,
-0x3b, 0x4b, 0x61, 0x6e, 0x2e, 0x3b, 0x4e, 0x7a, 0x65, 0x2e, 0x3b, 0x55, 0x6b, 0x77, 0x2e, 0x3b, 0x55, 0x67, 0x75, 0x2e,
-0x3b, 0x55, 0x6b, 0x75, 0x2e, 0x3b, 0x4e, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x52, 0x75, 0x68, 0x75, 0x68, 0x75, 0x6d, 0x61,
-0x3b, 0x4e, 0x74, 0x77, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x3b, 0x4e, 0x64, 0x61, 0x6d, 0x75, 0x6b, 0x69, 0x7a, 0x61,
-0x3b, 0x52, 0x75, 0x73, 0x61, 0x6d, 0x61, 0x3b, 0x52, 0x75, 0x68, 0x65, 0x73, 0x68, 0x69, 0x3b, 0x4d, 0x75, 0x6b, 0x61,
-0x6b, 0x61, 0x72, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x61, 0x72, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x6b,
-0x61, 0x6e, 0x67, 0x61, 0x3b, 0x47, 0x69, 0x74, 0x75, 0x67, 0x75, 0x74, 0x75, 0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x6f, 0x6e,
-0x79, 0x6f, 0x3b, 0x4b, 0x69, 0x67, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x3b, 0xea1, 0x2e, 0xe81, 0x2e, 0x3b, 0xe81, 0x2e, 0xe9e,
-0x2e, 0x3b, 0xea1, 0x2e, 0xe99, 0x2e, 0x3b, 0xea1, 0x2e, 0xeaa, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb4, 0x2e,
-0xe96, 0x2e, 0x3b, 0xe81, 0x2e, 0xea5, 0x2e, 0x3b, 0xeaa, 0x2e, 0xeab, 0x2e, 0x3b, 0xe81, 0x2e, 0xe8d, 0x2e, 0x3b, 0xe95, 0x2e,
-0xea5, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe88, 0x2e, 0x3b, 0xe97, 0x2e, 0xea7, 0x2e, 0x3b, 0xea1, 0xeb1, 0xe87, 0xe81, 0xead, 0xe99, 0x3b,
-0xe81, 0xeb8, 0xea1, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb5, 0xe99, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeaa, 0xeb2, 0x3b, 0xe9e, 0xeb6, 0xe94, 0xeaa,
-0xeb0, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb4, 0xe96, 0xeb8, 0xe99, 0xeb2, 0x3b, 0xe81, 0xecd, 0xea5, 0xeb0, 0xe81, 0xebb, 0xe94, 0x3b, 0xeaa,
-0xeb4, 0xe87, 0xeab, 0xeb2, 0x3b, 0xe81, 0xeb1, 0xe99, 0xe8d, 0xeb2, 0x3b, 0xe95, 0xeb8, 0xea5, 0xeb2, 0x3b, 0xe9e, 0xeb0, 0xe88, 0xeb4,
-0xe81, 0x3b, 0xe97, 0xeb1, 0xe99, 0xea7, 0xeb2, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b,
-0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e,
-0x2e, 0x3b, 0x6a, 0x16b, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b,
-0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x101, 0x72, 0x69,
-0x73, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70,
-0x72, 0x12b, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x69, 0x6a, 0x73, 0x3b, 0x6a,
-0x16b, 0x6c, 0x69, 0x6a, 0x73, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d,
-0x62, 0x72, 0x69, 0x73, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x72, 0x69, 0x73, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x62,
-0x6c, 0x3b, 0x6d, 0x73, 0x69, 0x3b, 0x61, 0x70, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75,
-0x6c, 0x3b, 0x61, 0x67, 0x74, 0x3b, 0x73, 0x74, 0x62, 0x3b, 0x254, 0x74, 0x62, 0x3b, 0x6e, 0x76, 0x62, 0x3b, 0x64, 0x73,
-0x62, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e,
-0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79,
-0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed,
-0x6e, 0x65, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b,
-0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x6f, 0x74, 0xf3, 0x62, 0xe1, 0x3b, 0x73, 0xe1, 0x6e, 0x7a,
-0xe1, 0x20, 0x79, 0x61, 0x20, 0x6e, 0x73, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61,
-0x20, 0x6d, 0x77, 0x61, 0x6d, 0x62, 0x65, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6c, 0x69, 0x62,
-0x77, 0x61, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x3b, 0x73, 0xe1, 0x6e,
-0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x254, 0x30c, 0x6b, 0x254, 0x301,
-0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0xed,
-0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x79, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x61,
-0x3b, 0x73, 0x3b, 0x254, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x73, 0x61, 0x75, 0x73, 0x2e, 0x3b, 0x76, 0x61, 0x73, 0x2e, 0x3b,
-0x6b, 0x6f, 0x76, 0x2e, 0x3b, 0x62, 0x61, 0x6c, 0x2e, 0x3b, 0x67, 0x65, 0x67, 0x2e, 0x3b, 0x62, 0x69, 0x72, 0x17e, 0x2e,
-0x3b, 0x6c, 0x69, 0x65, 0x70, 0x2e, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x2e, 0x3b, 0x72, 0x75, 0x67, 0x73, 0x2e, 0x3b, 0x73,
-0x70, 0x61, 0x6c, 0x2e, 0x3b, 0x6c, 0x61, 0x70, 0x6b, 0x72, 0x2e, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x2e, 0x3b, 0x73,
-0x61, 0x75, 0x73, 0x69, 0x73, 0x3b, 0x76, 0x61, 0x73, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x6b, 0x6f, 0x76, 0x61, 0x73, 0x3b,
-0x62, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x3b, 0x67, 0x65, 0x67, 0x75, 0x17e, 0x117, 0x3b, 0x62, 0x69, 0x72, 0x17e,
-0x65, 0x6c, 0x69, 0x73, 0x3b, 0x6c, 0x69, 0x65, 0x70, 0x61, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x6a, 0x16b, 0x74, 0x69, 0x73,
-0x3b, 0x72, 0x75, 0x67, 0x73, 0x117, 0x6a, 0x69, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x69, 0x73, 0x3b, 0x6c, 0x61, 0x70,
-0x6b, 0x72, 0x69, 0x74, 0x69, 0x73, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x69, 0x73, 0x3b, 0x53, 0x3b, 0x56, 0x3b, 0x4b,
-0x3b, 0x42, 0x3b, 0x47, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x52, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x47, 0x3b, 0x73,
-0x61, 0x75, 0x73, 0x69, 0x6f, 0x3b, 0x76, 0x61, 0x73, 0x61, 0x72, 0x69, 0x6f, 0x3b, 0x6b, 0x6f, 0x76, 0x6f, 0x3b, 0x62,
-0x61, 0x6c, 0x61, 0x6e, 0x64, 0x17e, 0x69, 0x6f, 0x3b, 0x67, 0x65, 0x67, 0x75, 0x17e, 0x117, 0x73, 0x3b, 0x62, 0x69, 0x72,
-0x17e, 0x65, 0x6c, 0x69, 0x6f, 0x3b, 0x6c, 0x69, 0x65, 0x70, 0x6f, 0x73, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x6a, 0x16b, 0x10d,
-0x69, 0x6f, 0x3b, 0x72, 0x75, 0x67, 0x73, 0x117, 0x6a, 0x6f, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x69, 0x6f, 0x3b, 0x6c, 0x61,
-0x70, 0x6b, 0x72, 0x69, 0x10d, 0x69, 0x6f, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x17e, 0x69, 0x6f, 0x3b, 0x458, 0x430, 0x43d,
-0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x458,
-0x3b, 0x458, 0x443, 0x43d, 0x2e, 0x3b, 0x458, 0x443, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x442,
-0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x458, 0x430,
-0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b,
-0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b,
-0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442,
-0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432,
-0x440, 0x438, 0x3b, 0x458, 0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b, 0x43c, 0x3b, 0x458, 0x3b, 0x458, 0x3b, 0x430, 0x3b, 0x441,
-0x3b, 0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41,
-0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x41, 0x6f, 0x67, 0x3b, 0x53,
-0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x6f, 0x61,
-0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x73, 0x61, 0x3b, 0x41,
-0x70, 0x72, 0x69, 0x6c, 0x79, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x61, 0x3b, 0x4a, 0x6f, 0x6c, 0x61, 0x79,
-0x3b, 0x41, 0x6f, 0x67, 0x6f, 0x73, 0x69, 0x74, 0x72, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x62, 0x72, 0x61,
-0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x44, 0x65,
-0x73, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41,
-0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x6f, 0x3b, 0x53,
-0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61,
-0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x69,
-0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x6f, 0x73,
-0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e,
-0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46,
-0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44,
-0x3b, 0xd1c, 0xd28, 0xd41, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0x3b, 0xd2e, 0xd3e, 0xd7c, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30,
-0xd3f, 0x3b, 0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd13, 0xd17, 0x3b, 0xd38,
-0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0x3b, 0xd12, 0xd15, 0xd4d, 0xd1f, 0xd4b, 0x3b, 0xd28, 0xd35, 0xd02, 0x3b, 0xd21, 0xd3f,
-0xd38, 0xd02, 0x3b, 0xd1c, 0xd28, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b,
-0xd2e, 0xd3e, 0xd7c, 0xd1a, 0xd4d, 0xd1a, 0xd4d, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0xd7d, 0x3b, 0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b,
-0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd13, 0xd17, 0xd38, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd4d, 0x3b, 0xd38, 0xd46,
-0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0xd2c, 0xd7c, 0x3b, 0xd12, 0xd15, 0xd4d, 0x200c, 0xd1f, 0xd4b, 0xd2c, 0xd7c, 0x3b, 0xd28, 0xd35,
-0xd02, 0xd2c, 0xd7c, 0x3b, 0xd21, 0xd3f, 0xd38, 0xd02, 0xd2c, 0xd7c, 0x3b, 0xd1c, 0x3b, 0xd2b, 0xd46, 0x3b, 0xd2e, 0xd3e, 0x3b, 0xd0f,
-0x3b, 0xd2e, 0xd46, 0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0x3b, 0xd13, 0x3b, 0xd38, 0xd46, 0x3b, 0xd12, 0x3b, 0xd28, 0x3b,
-0xd21, 0xd3f, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x72, 0x61, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d,
-0x65, 0x6a, 0x3b, 0x120, 0x75, 0x6e, 0x3b, 0x4c, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x77, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f,
-0x74, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x10b, 0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x61, 0x72, 0x3b, 0x46, 0x72,
-0x61, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x75, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x6a, 0x6a, 0x75,
-0x3b, 0x120, 0x75, 0x6e, 0x6a, 0x75, 0x3b, 0x4c, 0x75, 0x6c, 0x6a, 0x75, 0x3b, 0x41, 0x77, 0x77, 0x69, 0x73, 0x73, 0x75,
-0x3b, 0x53, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x4f, 0x74, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e,
-0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x44, 0x69, 0x10b, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x4a, 0x6e, 0x3b,
-0x46, 0x72, 0x3b, 0x4d, 0x7a, 0x3b, 0x41, 0x70, 0x3b, 0x4d, 0x6a, 0x3b, 0x120, 0x6e, 0x3b, 0x4c, 0x6a, 0x3b, 0x41, 0x77,
-0x3b, 0x53, 0x74, 0x3b, 0x4f, 0x62, 0x3b, 0x4e, 0x76, 0x3b, 0x44, 0x10b, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
-0x3b, 0x4d, 0x3b, 0x120, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4b, 0x6f, 0x68,
-0x69, 0x3b, 0x48, 0x75, 0x69, 0x3b, 0x50, 0x6f, 0x75, 0x3b, 0x50, 0x61, 0x65, 0x3b, 0x48, 0x61, 0x72, 0x61, 0x3b, 0x50,
-0x69, 0x70, 0x69, 0x3b, 0x48, 0x14d, 0x6e, 0x67, 0x6f, 0x3b, 0x48, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x61, 0x68, 0x75, 0x3b,
-0x4e, 0x75, 0x6b, 0x75, 0x3b, 0x52, 0x61, 0x6e, 0x67, 0x69, 0x3b, 0x48, 0x61, 0x6b, 0x69, 0x3b, 0x4b, 0x6f, 0x68, 0x69,
+0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65,
+0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e,
+0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74,
+0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x3b,
+0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x68,
+0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75, 0x3b, 0x6b, 0x65, 0x73,
+0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75,
+0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x61, 0x72,
+0x72, 0x61, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x6d, 0x6d, 0x69,
+0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x61,
+0x6c, 0x69, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b,
+0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75, 0x75, 0x74, 0x61,
+0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75, 0x74, 0x61,
+0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75, 0x74, 0x61,
+0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x75,
+0x75, 0x74, 0x61, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69,
+0x73, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x3b, 0x68,
+0x65, 0x69, 0x6e, 0xe4, 0x3b, 0x65, 0x6c, 0x6f, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x3b, 0x6d,
+0x61, 0x72, 0x72, 0x61, 0x73, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x68,
+0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x2e, 0x3b, 0x68, 0x75, 0x68, 0x74,
+0x69, 0x6b, 0x2e, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x2e, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x2e, 0x3b, 0x68,
+0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x2e, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x2e, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x2e, 0x3b,
+0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6c,
+0x75, 0x6b, 0x2e, 0x54, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x48, 0x3b, 0x45, 0x3b, 0x53,
+0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4a, 0x6a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x72, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x69, 0x65,
+0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69,
+0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x74, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72,
+0x65, 0x3b, 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0xe9, 0x76, 0x72,
+0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x6e,
+0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63,
+0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0xe9,
+0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75,
+0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e,
+0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x6a, 0x61, 0x6e, 0x2e, 0x3b,
+0x66, 0xe9, 0x76, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a,
+0x75, 0x69, 0x2e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e,
+0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x4a, 0x61, 0x6e, 0x6e, 0x65,
+0x77, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x77, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x61,
+0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x61, 0x69, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x79, 0x3b,
+0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x69, 0x6d,
+0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x69, 0x6d, 0x62, 0x65, 0x72,
+0x3b, 0x44, 0x65, 0x73, 0x69, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x72, 0x74,
+0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67,
+0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x41, 0x6d, 0x20, 0x46,
+0x61, 0x6f, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x63, 0x68, 0x3b, 0x41, 0x6e, 0x20, 0x47, 0x65, 0x61, 0x72, 0x72, 0x61, 0x6e,
+0x3b, 0x41, 0x6d, 0x20, 0x4d, 0xe0, 0x72, 0x74, 0x3b, 0x41, 0x6e, 0x20, 0x47, 0x69, 0x62, 0x6c, 0x65, 0x61, 0x6e, 0x3b,
+0x41, 0x6e, 0x20, 0x43, 0xe8, 0x69, 0x74, 0x65, 0x61, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d, 0xd2, 0x67, 0x6d, 0x68,
+0x69, 0x6f, 0x73, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d, 0x49, 0x75, 0x63, 0x68, 0x61, 0x72, 0x3b, 0x41, 0x6e, 0x20, 0x4c,
+0xf9, 0x6e, 0x61, 0x73, 0x74, 0x61, 0x6c, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d, 0x53, 0x75, 0x6c, 0x74, 0x61, 0x69, 0x6e,
+0x3b, 0x41, 0x6e, 0x20, 0x44, 0xe0, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d, 0x53, 0x61, 0x6d,
+0x68, 0x61, 0x69, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x44, 0xf9, 0x62, 0x68, 0x6c, 0x61, 0x63, 0x68, 0x64, 0x64, 0x68, 0x65,
+0x6e, 0x20, 0x46, 0x68, 0x61, 0x6f, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x63, 0x68, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x47,
+0x68, 0x65, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x4d, 0x68, 0xe0, 0x72, 0x74, 0x3b, 0x64,
+0x68, 0x65, 0x6e, 0x20, 0x47, 0x68, 0x69, 0x62, 0x6c, 0x65, 0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x43, 0x68,
+0xe8, 0x69, 0x74, 0x65, 0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0xd2, 0x67, 0x6d, 0x68, 0x69, 0x6f, 0x73, 0x3b,
+0x64, 0x68, 0x65, 0x6e, 0x20, 0x49, 0x75, 0x63, 0x68, 0x61, 0x72, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x4c, 0xf9, 0x6e,
+0x61, 0x73, 0x74, 0x61, 0x6c, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x2d, 0x53, 0x75, 0x6c, 0x74, 0x61, 0x69, 0x6e,
+0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x44, 0xe0, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x74,
+0x2d, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x44, 0xf9, 0x62, 0x68, 0x6c, 0x61,
+0x63, 0x68, 0x64, 0x46, 0x61, 0x6f, 0x69, 0x3b, 0x47, 0x65, 0x61, 0x72, 0x72, 0x3b, 0x4d, 0xe0, 0x72, 0x74, 0x3b, 0x47,
+0x69, 0x62, 0x6c, 0x3b, 0x43, 0xe8, 0x69, 0x74, 0x3b, 0xd2, 0x67, 0x6d, 0x68, 0x3b, 0x49, 0x75, 0x63, 0x68, 0x3b, 0x4c,
+0xf9, 0x6e, 0x61, 0x3b, 0x53, 0x75, 0x6c, 0x74, 0x3b, 0x44, 0xe0, 0x6d, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x3b, 0x44,
+0xf9, 0x62, 0x68, 0x46, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x43, 0x3b, 0xd2, 0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x53,
+0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x44, 0x58, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x69,
+0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b,
+0x58, 0x75, 0xf1, 0x6f, 0x3b, 0x58, 0x75, 0x6c, 0x6c, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65,
+0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d,
+0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x78, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b,
+0x66, 0x65, 0x62, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c,
+0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x78, 0x75, 0xf1, 0x6f, 0x3b, 0x78, 0x75, 0x6c, 0x6c, 0x6f, 0x3b, 0x61, 0x67, 0x6f,
+0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f,
+0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x58, 0x61,
+0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x41, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61,
+0x69, 0x6f, 0x3b, 0x58, 0x75, 0xf1, 0x6f, 0x3b, 0x58, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x67, 0x6f, 0x2e, 0x3b, 0x53, 0x65,
+0x74, 0x2e, 0x3b, 0x4f, 0x75, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x63, 0x2e, 0x78, 0x61, 0x6e,
+0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69,
+0x6f, 0x3b, 0x78, 0x75, 0xf1, 0x6f, 0x3b, 0x78, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74,
+0x2e, 0x3b, 0x6f, 0x75, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x58, 0x3b, 0x46, 0x3b,
+0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x78,
+0x2e, 0x3b, 0x66, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x61, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x78, 0x2e, 0x3b, 0x78, 0x2e, 0x3b,
+0x61, 0x2e, 0x3b, 0x73, 0x2e, 0x3b, 0x6f, 0x2e, 0x3b, 0x6e, 0x2e, 0x3b, 0x64, 0x2e, 0x10d8, 0x10d0, 0x10dc, 0x10d5, 0x10d0, 0x10e0,
+0x10d8, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x10d4, 0x10e0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x10e2, 0x10d8, 0x3b, 0x10d0, 0x10de,
+0x10e0, 0x10d8, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5,
+0x10da, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x10d8, 0x10e1, 0x10e2, 0x10dd, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x10e2, 0x10d4, 0x10db, 0x10d1,
+0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x10dd, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x10db, 0x10d1, 0x10d4,
+0x10e0, 0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x10d8, 0x10d0, 0x10dc, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x3b,
+0x10db, 0x10d0, 0x10e0, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x3b,
+0x10d0, 0x10d2, 0x10d5, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x10d8,
+0x3b, 0x10d7, 0x3b, 0x10db, 0x3b, 0x10d0, 0x3b, 0x10db, 0x3b, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d0, 0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b, 0x10dc,
+0x3b, 0x10d3, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72,
+0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c,
+0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f,
+0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65,
+0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b,
+0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b,
+0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e,
+0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b,
+0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e,
+0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x4a, 0xe4, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x46, 0x65, 0x62,
+0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b,
+0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70,
+0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0xe4, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b,
+0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b,
+0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x4a,
+0xe4, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d,
+0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65,
+0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x399, 0x3b1, 0x3bd,
+0x3bf, 0x3c5, 0x3ac, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3ac, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b,
+0x39c, 0x3ac, 0x3c1, 0x3c4, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3af, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39c, 0x3ac, 0x3b9,
+0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bd, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x391,
+0x3cd, 0x3b3, 0x3bf, 0x3c5, 0x3c3, 0x3c4, 0x3bf, 0x3c2, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2,
+0x3b, 0x39f, 0x3ba, 0x3c4, 0x3ce, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39d, 0x3bf, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2,
+0x3b, 0x394, 0x3b5, 0x3ba, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x399, 0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3b1, 0x3c1, 0x3af, 0x3bf,
+0x3c5, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3b1, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3c4, 0x3af, 0x3bf,
+0x3c5, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b9, 0x3bb, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39c, 0x3b1, 0x390, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5,
+0x3bd, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x391, 0x3c5, 0x3b3, 0x3bf, 0x3cd, 0x3c3, 0x3c4,
+0x3bf, 0x3c5, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3b5, 0x3bc, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3c9, 0x3b2,
+0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3bc, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b5, 0x3bc,
+0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3b, 0x39c, 0x3ac, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1,
+0x3b, 0x39c, 0x3ac, 0x3b9, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bb, 0x3b, 0x391, 0x3cd, 0x3b3, 0x3b, 0x3a3,
+0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3b, 0x39d, 0x3bf, 0x3ad, 0x3b, 0x394, 0x3b5, 0x3ba, 0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5,
+0x3b2, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b, 0x39c, 0x3b1, 0x390, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bd, 0x3b, 0x399,
+0x3bf, 0x3c5, 0x3bb, 0x3b, 0x391, 0x3c5, 0x3b3, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3b,
+0x394, 0x3b5, 0x3ba, 0x399, 0x3b, 0x3a6, 0x3b, 0x39c, 0x3b, 0x391, 0x3b, 0x39c, 0x3b, 0x399, 0x3b, 0x399, 0x3b, 0x391, 0x3b, 0x3a3,
+0x3b, 0x39f, 0x3b, 0x39d, 0x3b, 0x394, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75,
+0x61, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x69, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x69, 0x6c, 0x69, 0x3b, 0x6d,
+0x61, 0x61, 0x6a, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x67, 0x67,
+0x75, 0x73, 0x74, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
+0x62, 0x61, 0x72, 0x69, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d,
+0x62, 0x61, 0x72, 0x69, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61,
+0x61, 0x72, 0x69, 0x70, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x69, 0x70, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x69, 0x6c, 0x69, 0x70,
+0x3b, 0x6d, 0x61, 0x61, 0x6a, 0x69, 0x70, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x70, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69,
+0x70, 0x3b, 0x61, 0x67, 0x67, 0x75, 0x73, 0x74, 0x69, 0x70, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72,
+0x69, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x69, 0x70, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61,
+0x72, 0x69, 0x70, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x69, 0x70, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65,
+0x62, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a,
+0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b,
+0x64, 0x65, 0x63, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0xa86,
+0xab0, 0xac0, 0x3b, 0xaae, 0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c,
+0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7,
+0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacb, 0xaac, 0xab0, 0x3b, 0xaa8, 0xab5, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0,
+0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd,
+0xab0, 0xac1, 0x3b, 0xaae, 0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c,
+0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7,
+0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacb, 0x3b, 0xaa8, 0xab5, 0xac7, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0xa9c, 0xabe, 0x3b, 0xaab, 0xac7,
+0x3b, 0xaae, 0xabe, 0x3b, 0xa8f, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0x3b, 0xa9c, 0xac1, 0x3b, 0xa91, 0x3b, 0xab8, 0x3b, 0xa91,
+0x3b, 0xaa8, 0x3b, 0xaa1, 0xabf, 0x4a, 0x61, 0x6e, 0x61, 0x69, 0x72, 0x75, 0x3b, 0x46, 0x61, 0x62, 0x75, 0x72, 0x61, 0x69,
+0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x41, 0x66, 0x69, 0x72, 0x69, 0x6c, 0x75, 0x3b, 0x4d, 0x61, 0x79,
+0x75, 0x3b, 0x59, 0x75, 0x6e, 0x69, 0x3b, 0x59, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x53,
+0x61, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x75, 0x77, 0x61, 0x6d, 0x62,
+0x61, 0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x61, 0x62, 0x3b, 0x4d, 0x61, 0x72,
+0x3b, 0x41, 0x66, 0x69, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75,
+0x3b, 0x53, 0x61, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x75, 0x77, 0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b,
+0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x5d9,
+0x5e0, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5de, 0x5e8, 0x5e5, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5d9,
+0x5dc, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5d5,
+0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5d8, 0x5d5, 0x5d1, 0x5e8, 0x3b, 0x5e0, 0x5d5,
+0x5d1, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5d1, 0x5e8, 0x5d9, 0x5e0, 0x5d5, 0x5f3, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5f3, 0x3b,
+0x5de, 0x5e8, 0x5e5, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5f3, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5,
+0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5f3, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5f3, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5f3, 0x3b, 0x5e0, 0x5d5,
+0x5d1, 0x5f3, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5f3, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x93c, 0x930, 0x935, 0x930, 0x940, 0x3b,
+0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b,
+0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924, 0x902, 0x92c, 0x930, 0x3b, 0x905,
+0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x902, 0x92c, 0x930, 0x91c,
+0x928, 0x970, 0x3b, 0x92b, 0x93c, 0x930, 0x970, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932,
+0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x970, 0x3b, 0x905, 0x917, 0x970, 0x3b, 0x938, 0x93f, 0x924,
+0x970, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x970, 0x3b, 0x928, 0x935, 0x970, 0x3b, 0x926, 0x93f, 0x938, 0x970, 0x91c, 0x3b, 0x92b,
+0x93c, 0x3b, 0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x905, 0x3b, 0x938, 0x93f, 0x3b,
+0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72,
+0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x69, 0x75, 0x73, 0x3b, 0xe1, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0xe1, 0x6a,
+0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6e, 0x69, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6c, 0x69, 0x75, 0x73, 0x3b, 0x61, 0x75, 0x67,
+0x75, 0x73, 0x7a, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b,
+0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x2e, 0x3b,
+0xe1, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x6a, 0x2e, 0x3b, 0x6a, 0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c, 0x2e, 0x3b,
+0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x7a, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76,
+0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0xc1, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b,
+0x41, 0x3b, 0x53, 0x7a, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x6a, 0x61, 0x6e, 0xfa, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62,
+0x72, 0xfa, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0xed, 0x3b,
+0x6a, 0xfa, 0x6e, 0xed, 0x3b, 0x6a, 0xfa, 0x6c, 0xed, 0x3b, 0xe1, 0x67, 0xfa, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74,
+0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0xf3, 0x76, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e,
+0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e, 0x2e, 0x3b,
+0x6a, 0xfa, 0x6c, 0x2e, 0x3b, 0xe1, 0x67, 0xfa, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b,
+0x6e, 0xf3, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a,
+0x3b, 0x4a, 0x3b, 0xc1, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b,
+0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x72, 0x65, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c,
+0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74,
+0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72,
+0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61,
+0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
+0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
+0x76, 0x3b, 0x44, 0x65, 0x73, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61,
+0x72, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69,
+0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74,
+0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b,
+0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x6a, 0x61, 0x6e,
+0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e,
+0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x63, 0x74, 0x3b, 0x6e, 0x6f, 0x76,
+0x3b, 0x64, 0x65, 0x63, 0x6a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x61, 0x3b,
+0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x45, 0x61, 0x6e, 0xe1, 0x69, 0x72, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68, 0x72,
+0x61, 0x3b, 0x4d, 0xe1, 0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x72, 0x65, 0xe1, 0x6e, 0x3b, 0x42, 0x65, 0x61, 0x6c,
+0x74, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x65, 0x61, 0x6d, 0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c,
+0x3b, 0x4c, 0xfa, 0x6e, 0x61, 0x73, 0x61, 0x3b, 0x4d, 0x65, 0xe1, 0x6e, 0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72,
+0x3b, 0x44, 0x65, 0x69, 0x72, 0x65, 0x61, 0x64, 0x68, 0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x53, 0x61,
+0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x61, 0x69, 0x67, 0x45, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x61,
+0x62, 0x68, 0x3b, 0x4d, 0xe1, 0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x3b, 0x4d, 0x65,
+0x69, 0x74, 0x68, 0x3b, 0x49, 0xfa, 0x69, 0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x3b, 0x4d, 0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x44,
+0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
+0x41, 0x3b, 0x42, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x4e, 0x67, 0x65, 0x6e,
+0x6e, 0x61, 0x69, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x62, 0x72, 0x61, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b,
+0x61, 0x70, 0x72, 0x69, 0x6c, 0x65, 0x3b, 0x6d, 0x61, 0x67, 0x67, 0x69, 0x6f, 0x3b, 0x67, 0x69, 0x75, 0x67, 0x6e, 0x6f,
+0x3b, 0x6c, 0x75, 0x67, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65,
+0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x74, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72,
+0x65, 0x3b, 0x64, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61,
+0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x67, 0x3b, 0x67, 0x69, 0x75, 0x3b, 0x6c, 0x75, 0x67, 0x3b, 0x61, 0x67,
+0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x74, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x47, 0x3b, 0x46,
+0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44,
+0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b,
+0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0xc9c, 0xca8, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0,
+0xcbf, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0xcb2, 0xccd, 0x3b, 0xcae, 0xcc7, 0x3b,
+0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0xcb8, 0xccd, 0xc9f, 0xccd, 0x3b, 0xcb8, 0xcc6, 0xcaa,
+0xccd, 0xc9f, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca8, 0xcb5, 0xcc6,
+0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0xc9c, 0xca8, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd,
+0xcb0, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2,
+0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0x3b, 0xcb8, 0xcc6, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0x3b, 0xc85,
+0xc95, 0xccd, 0xc9f, 0xccb, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82, 0xc9c, 0xca8, 0xcb5, 0xcb0, 0xcbf,
+0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa, 0xccd,
+0xcb0, 0xcbf, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0x3b, 0xcb8,
+0xcc6, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0x3b, 0xca1, 0xcbf,
+0xcb8, 0xcc6, 0xc82, 0xc9c, 0x3b, 0xcab, 0xcc6, 0x3b, 0xcae, 0xcbe, 0x3b, 0xc8f, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0x3b, 0xc9c,
+0xcc1, 0x3b, 0xc86, 0x3b, 0xcb8, 0xcc6, 0x3b, 0xc85, 0x3b, 0xca8, 0x3b, 0xca1, 0xcbf, 0x62c, 0x646, 0x624, 0x631, 0x6cc, 0x3b, 0x641,
+0x631, 0x624, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x655, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x654,
+0x3b, 0x62c, 0x648, 0x657, 0x646, 0x3b, 0x62c, 0x648, 0x657, 0x644, 0x627, 0x6cc, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633,
+0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x657, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f,
+0x633, 0x645, 0x628, 0x631, 0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x627, 0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b,
+0x633, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x49a, 0x430, 0x4a3, 0x442, 0x430, 0x440, 0x3b, 0x410, 0x49b, 0x43f, 0x430, 0x43d, 0x3b,
+0x41d, 0x430, 0x443, 0x440, 0x44b, 0x437, 0x3b, 0x421, 0x4d9, 0x443, 0x456, 0x440, 0x3b, 0x41c, 0x430, 0x43c, 0x44b, 0x440, 0x3b, 0x41c,
+0x430, 0x443, 0x441, 0x44b, 0x43c, 0x3b, 0x428, 0x456, 0x43b, 0x434, 0x435, 0x3b, 0x422, 0x430, 0x43c, 0x44b, 0x437, 0x3b, 0x49a, 0x44b,
+0x440, 0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49a, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x49a, 0x430, 0x440, 0x430, 0x448, 0x430, 0x3b,
+0x416, 0x435, 0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d, 0x49b, 0x430, 0x4a3, 0x442, 0x430, 0x440, 0x3b, 0x430, 0x49b, 0x43f, 0x430,
+0x43d, 0x3b, 0x43d, 0x430, 0x443, 0x440, 0x44b, 0x437, 0x3b, 0x441, 0x4d9, 0x443, 0x456, 0x440, 0x3b, 0x43c, 0x430, 0x43c, 0x44b, 0x440,
+0x3b, 0x43c, 0x430, 0x443, 0x441, 0x44b, 0x43c, 0x3b, 0x448, 0x456, 0x43b, 0x434, 0x435, 0x3b, 0x442, 0x430, 0x43c, 0x44b, 0x437, 0x3b,
+0x49b, 0x44b, 0x440, 0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49b, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x49b, 0x430, 0x440, 0x430, 0x448,
+0x430, 0x3b, 0x436, 0x435, 0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d, 0x49b, 0x430, 0x4a3, 0x2e, 0x3b, 0x430, 0x49b, 0x43f, 0x2e,
+0x3b, 0x43d, 0x430, 0x443, 0x2e, 0x3b, 0x441, 0x4d9, 0x443, 0x2e, 0x3b, 0x43c, 0x430, 0x43c, 0x2e, 0x3b, 0x43c, 0x430, 0x443, 0x2e,
+0x3b, 0x448, 0x456, 0x43b, 0x2e, 0x3b, 0x442, 0x430, 0x43c, 0x2e, 0x3b, 0x49b, 0x44b, 0x440, 0x2e, 0x3b, 0x49b, 0x430, 0x437, 0x2e,
+0x3b, 0x49b, 0x430, 0x440, 0x2e, 0x3b, 0x436, 0x435, 0x43b, 0x2e, 0x49a, 0x3b, 0x410, 0x3b, 0x41d, 0x3b, 0x421, 0x3b, 0x41c, 0x3b,
+0x41c, 0x3b, 0x428, 0x3b, 0x422, 0x3b, 0x49a, 0x3b, 0x49a, 0x3b, 0x49a, 0x3b, 0x416, 0x4d, 0x75, 0x74, 0x61, 0x72, 0x61, 0x6d,
+0x61, 0x3b, 0x47, 0x61, 0x73, 0x68, 0x79, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x3b, 0x57, 0x65, 0x72, 0x75, 0x72, 0x77,
+0x65, 0x3b, 0x4d, 0x61, 0x74, 0x61, 0x3b, 0x47, 0x69, 0x63, 0x75, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x3b, 0x4b, 0x61, 0x6d,
+0x65, 0x6e, 0x61, 0x3b, 0x4e, 0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x4b, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x3b,
+0x4e, 0x7a, 0x65, 0x6c, 0x69, 0x3b, 0x55, 0x6b, 0x77, 0x61, 0x6b, 0x69, 0x72, 0x61, 0x3b, 0x55, 0x67, 0x75, 0x73, 0x68,
+0x79, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x55, 0x6b, 0x75, 0x62, 0x6f, 0x7a, 0x61, 0x6d, 0x75, 0x74, 0x2e, 0x3b, 0x67, 0x61,
+0x73, 0x2e, 0x3b, 0x77, 0x65, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x2e, 0x3b, 0x67, 0x69, 0x63, 0x2e, 0x3b, 0x6b, 0x61,
+0x6d, 0x2e, 0x3b, 0x6e, 0x79, 0x61, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x6e, 0x7a, 0x65, 0x2e, 0x3b, 0x75, 0x6b,
+0x77, 0x2e, 0x3b, 0x75, 0x67, 0x75, 0x2e, 0x3b, 0x75, 0x6b, 0x75, 0x2e, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x424,
+0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x41c,
+0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b,
+0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41d, 0x43e, 0x44f,
+0x431, 0x440, 0x44c, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x444, 0x435,
+0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x43c, 0x430,
+0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441,
+0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43d, 0x43e, 0x44f, 0x431,
+0x440, 0x44c, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x42f, 0x43d, 0x432, 0x3b, 0x424, 0x435, 0x432, 0x3b, 0x41c, 0x430,
+0x440, 0x3b, 0x410, 0x43f, 0x440, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410, 0x432,
+0x433, 0x3b, 0x421, 0x435, 0x43d, 0x3b, 0x41e, 0x43a, 0x442, 0x3b, 0x41d, 0x43e, 0x44f, 0x3b, 0x414, 0x435, 0x43a, 0x44f, 0x43d, 0x432,
+0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439,
+0x3b, 0x438, 0x44e, 0x43d, 0x2e, 0x3b, 0x438, 0x44e, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x2e,
+0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x42f, 0x3b, 0x424, 0x3b, 0x41c,
+0x3b, 0x410, 0x3b, 0x41c, 0x3b, 0x418, 0x3b, 0x418, 0x3b, 0x410, 0x3b, 0x421, 0x3b, 0x41e, 0x3b, 0x41d, 0x3b, 0x414, 0x31, 0xc6d4,
+0x3b, 0x32, 0xc6d4, 0x3b, 0x33, 0xc6d4, 0x3b, 0x34, 0xc6d4, 0x3b, 0x35, 0xc6d4, 0x3b, 0x36, 0xc6d4, 0x3b, 0x37, 0xc6d4, 0x3b, 0x38,
+0xc6d4, 0x3b, 0x39, 0xc6d4, 0x3b, 0x31, 0x30, 0xc6d4, 0x3b, 0x31, 0x31, 0xc6d4, 0x3b, 0x31, 0x32, 0xc6d4, 0x72, 0xea, 0x62, 0x65,
+0x6e, 0x64, 0x61, 0x6e, 0x3b, 0x72, 0x65, 0x15f, 0x65, 0x6d, 0xee, 0x3b, 0x61, 0x64, 0x61, 0x72, 0x3b, 0x61, 0x76, 0x72,
+0xea, 0x6c, 0x3b, 0x67, 0x75, 0x6c, 0x61, 0x6e, 0x3b, 0x70, 0xfb, 0x15f, 0x70, 0x65, 0x72, 0x3b, 0x74, 0xee, 0x72, 0x6d,
+0x65, 0x68, 0x3b, 0x67, 0x65, 0x6c, 0x61, 0x77, 0xea, 0x6a, 0x3b, 0x72, 0x65, 0x7a, 0x62, 0x65, 0x72, 0x3b, 0x6b, 0x65,
+0x77, 0xe7, 0xea, 0x72, 0x3b, 0x73, 0x65, 0x72, 0x6d, 0x61, 0x77, 0x65, 0x7a, 0x3b, 0x62, 0x65, 0x72, 0x66, 0x61, 0x6e,
+0x62, 0x61, 0x72, 0x72, 0xea, 0x62, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0xea, 0x3b, 0x72, 0x65, 0x15f, 0x65, 0x6d, 0x69, 0x79,
+0xea, 0x3b, 0x61, 0x64, 0x61, 0x72, 0xea, 0x3b, 0x61, 0x76, 0x72, 0xea, 0x6c, 0xea, 0x3b, 0x67, 0x75, 0x6c, 0x61, 0x6e,
+0xea, 0x3b, 0x70, 0xfb, 0x15f, 0x70, 0x65, 0x72, 0xea, 0x3b, 0x74, 0xee, 0x72, 0x6d, 0x65, 0x68, 0xea, 0x3b, 0x67, 0x65,
+0x6c, 0x61, 0x77, 0xea, 0x6a, 0xea, 0x3b, 0x72, 0x65, 0x7a, 0x62, 0x65, 0x72, 0xea, 0x3b, 0x6b, 0x65, 0x77, 0xe7, 0xea,
+0x72, 0xea, 0x3b, 0x73, 0x65, 0x72, 0x6d, 0x61, 0x77, 0x65, 0x7a, 0xea, 0x3b, 0x62, 0x65, 0x72, 0x66, 0x61, 0x6e, 0x62,
+0x61, 0x72, 0xea, 0x72, 0xea, 0x62, 0x3b, 0x72, 0x65, 0x15f, 0x3b, 0x61, 0x64, 0x61, 0x3b, 0x61, 0x76, 0x72, 0x3b, 0x67,
+0x75, 0x6c, 0x3b, 0x70, 0xfb, 0x15f, 0x3b, 0x74, 0xee, 0x72, 0x3b, 0x67, 0x65, 0x6c, 0x3b, 0x72, 0x65, 0x7a, 0x3b, 0x6b,
+0x65, 0x77, 0x3b, 0x73, 0x65, 0x72, 0x3b, 0x62, 0x65, 0x72, 0x52, 0x3b, 0x52, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x47, 0x3b,
+0x50, 0x3b, 0x54, 0x3b, 0x47, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x42, 0x4e, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x52,
+0x75, 0x68, 0x75, 0x68, 0x75, 0x6d, 0x61, 0x3b, 0x4e, 0x74, 0x77, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x3b, 0x4e, 0x64,
+0x61, 0x6d, 0x75, 0x6b, 0x69, 0x7a, 0x61, 0x3b, 0x52, 0x75, 0x73, 0x61, 0x6d, 0x61, 0x3b, 0x52, 0x75, 0x68, 0x65, 0x73,
+0x68, 0x69, 0x3b, 0x4d, 0x75, 0x6b, 0x61, 0x6b, 0x61, 0x72, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x61,
+0x72, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x47, 0x69, 0x74, 0x75, 0x67, 0x75, 0x74, 0x75,
+0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x6f, 0x6e, 0x79, 0x6f, 0x3b, 0x4b, 0x69, 0x67, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x4d, 0x75,
+0x74, 0x2e, 0x3b, 0x47, 0x61, 0x73, 0x2e, 0x3b, 0x57, 0x65, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x74, 0x2e, 0x3b, 0x47, 0x69,
+0x63, 0x2e, 0x3b, 0x4b, 0x61, 0x6d, 0x2e, 0x3b, 0x4e, 0x79, 0x61, 0x2e, 0x3b, 0x4b, 0x61, 0x6e, 0x2e, 0x3b, 0x4e, 0x7a,
+0x65, 0x2e, 0x3b, 0x55, 0x6b, 0x77, 0x2e, 0x3b, 0x55, 0x67, 0x75, 0x2e, 0x3b, 0x55, 0x6b, 0x75, 0x2e, 0xea1, 0xeb1, 0xe87,
+0xe81, 0xead, 0xe99, 0x3b, 0xe81, 0xeb8, 0xea1, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb5, 0xe99, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeaa, 0xeb2, 0x3b,
+0xe9e, 0xeb6, 0xe94, 0xeaa, 0xeb0, 0xe9e, 0xeb2, 0x3b, 0xea1, 0xeb4, 0xe96, 0xeb8, 0xe99, 0xeb2, 0x3b, 0xe81, 0xecd, 0xea5, 0xeb0, 0xe81,
+0xebb, 0xe94, 0x3b, 0xeaa, 0xeb4, 0xe87, 0xeab, 0xeb2, 0x3b, 0xe81, 0xeb1, 0xe99, 0xe8d, 0xeb2, 0x3b, 0xe95, 0xeb8, 0xea5, 0xeb2, 0x3b,
+0xe9e, 0xeb0, 0xe88, 0xeb4, 0xe81, 0x3b, 0xe97, 0xeb1, 0xe99, 0xea7, 0xeb2, 0xea1, 0x2e, 0xe81, 0x2e, 0x3b, 0xe81, 0x2e, 0xe9e, 0x2e,
+0x3b, 0xea1, 0x2e, 0xe99, 0x2e, 0x3b, 0xea1, 0x2e, 0xeaa, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb4, 0x2e, 0xe96,
+0x2e, 0x3b, 0xe81, 0x2e, 0xea5, 0x2e, 0x3b, 0xeaa, 0x2e, 0xeab, 0x2e, 0x3b, 0xe81, 0x2e, 0xe8d, 0x2e, 0x3b, 0xe95, 0x2e, 0xea5,
+0x2e, 0x3b, 0xe9e, 0x2e, 0xe88, 0x2e, 0x3b, 0xe97, 0x2e, 0xea7, 0x2e, 0x6a, 0x61, 0x6e, 0x76, 0x101, 0x72, 0x69, 0x73, 0x3b,
+0x66, 0x65, 0x62, 0x72, 0x75, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x12b,
+0x6c, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6c,
+0x69, 0x6a, 0x73, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72,
+0x69, 0x73, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x69,
+0x73, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0x65, 0x62,
+0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b,
+0x6a, 0x16b, 0x6e, 0x2e, 0x3b, 0x6a, 0x16b, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e,
+0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x73, 0xe1, 0x6e, 0x7a, 0xe1,
+0x20, 0x79, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d,
+0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74,
+0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e, 0x65, 0x69, 0x3b, 0x73, 0xe1, 0x6e,
+0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79,
+0x61, 0x20, 0x6d, 0x6f, 0x74, 0xf3, 0x62, 0xe1, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6e, 0x73,
+0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x77, 0x61, 0x6d, 0x62, 0x65,
+0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6c, 0x69, 0x62, 0x77, 0x61, 0x3b, 0x73, 0xe1, 0x6e, 0x7a,
+0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a,
+0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x254, 0x30c, 0x6b, 0x254, 0x301, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20,
+0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x79, 0x61, 0x6e,
+0x3b, 0x66, 0x62, 0x6c, 0x3b, 0x6d, 0x73, 0x69, 0x3b, 0x61, 0x70, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x79, 0x75, 0x6e,
+0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x74, 0x3b, 0x73, 0x74, 0x62, 0x3b, 0x254, 0x74, 0x62, 0x3b, 0x6e, 0x76, 0x62,
+0x3b, 0x64, 0x73, 0x62, 0x79, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x61, 0x3b,
+0x73, 0x3b, 0x254, 0x3b, 0x6e, 0x3b, 0x64, 0x73, 0x61, 0x75, 0x73, 0x69, 0x73, 0x3b, 0x76, 0x61, 0x73, 0x61, 0x72, 0x69,
+0x73, 0x3b, 0x6b, 0x6f, 0x76, 0x61, 0x73, 0x3b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x3b, 0x67, 0x65, 0x67,
+0x75, 0x17e, 0x117, 0x3b, 0x62, 0x69, 0x72, 0x17e, 0x65, 0x6c, 0x69, 0x73, 0x3b, 0x6c, 0x69, 0x65, 0x70, 0x61, 0x3b, 0x72,
+0x75, 0x67, 0x70, 0x6a, 0x16b, 0x74, 0x69, 0x73, 0x3b, 0x72, 0x75, 0x67, 0x73, 0x117, 0x6a, 0x69, 0x73, 0x3b, 0x73, 0x70,
+0x61, 0x6c, 0x69, 0x73, 0x3b, 0x6c, 0x61, 0x70, 0x6b, 0x72, 0x69, 0x74, 0x69, 0x73, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64,
+0x69, 0x73, 0x73, 0x61, 0x75, 0x73, 0x69, 0x6f, 0x3b, 0x76, 0x61, 0x73, 0x61, 0x72, 0x69, 0x6f, 0x3b, 0x6b, 0x6f, 0x76,
+0x6f, 0x3b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x17e, 0x69, 0x6f, 0x3b, 0x67, 0x65, 0x67, 0x75, 0x17e, 0x117, 0x73, 0x3b,
+0x62, 0x69, 0x72, 0x17e, 0x65, 0x6c, 0x69, 0x6f, 0x3b, 0x6c, 0x69, 0x65, 0x70, 0x6f, 0x73, 0x3b, 0x72, 0x75, 0x67, 0x70,
+0x6a, 0x16b, 0x10d, 0x69, 0x6f, 0x3b, 0x72, 0x75, 0x67, 0x73, 0x117, 0x6a, 0x6f, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x69, 0x6f,
+0x3b, 0x6c, 0x61, 0x70, 0x6b, 0x72, 0x69, 0x10d, 0x69, 0x6f, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x17e, 0x69, 0x6f, 0x73,
+0x61, 0x75, 0x73, 0x2e, 0x3b, 0x76, 0x61, 0x73, 0x2e, 0x3b, 0x6b, 0x6f, 0x76, 0x2e, 0x3b, 0x62, 0x61, 0x6c, 0x2e, 0x3b,
+0x67, 0x65, 0x67, 0x2e, 0x3b, 0x62, 0x69, 0x72, 0x17e, 0x2e, 0x3b, 0x6c, 0x69, 0x65, 0x70, 0x2e, 0x3b, 0x72, 0x75, 0x67,
+0x70, 0x2e, 0x3b, 0x72, 0x75, 0x67, 0x73, 0x2e, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x2e, 0x3b, 0x6c, 0x61, 0x70, 0x6b, 0x72,
+0x2e, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x2e, 0x53, 0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x42, 0x3b, 0x47, 0x3b, 0x42, 0x3b,
+0x4c, 0x3b, 0x52, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x47, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444,
+0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c,
+0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b,
+0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d,
+0x43e, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x458, 0x430, 0x43d, 0x2e, 0x3b,
+0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458,
+0x443, 0x43d, 0x2e, 0x3b, 0x458, 0x443, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x2e, 0x3b,
+0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x458, 0x3b, 0x444, 0x3b, 0x43c,
+0x3b, 0x430, 0x3b, 0x43c, 0x3b, 0x458, 0x3b, 0x458, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x4a, 0x61,
+0x6e, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x73,
+0x61, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x79, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x61, 0x3b, 0x4a, 0x6f,
+0x6c, 0x61, 0x79, 0x3b, 0x41, 0x6f, 0x67, 0x6f, 0x73, 0x69, 0x74, 0x72, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x61, 0x6d,
+0x62, 0x72, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x61, 0x6d, 0x62, 0x72, 0x61,
+0x3b, 0x44, 0x65, 0x73, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72,
+0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x41, 0x6f, 0x67,
+0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x4a, 0x61, 0x6e, 0x75,
+0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72,
+0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x6f,
+0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b,
+0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e,
+0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e,
+0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76,
+0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4f, 0x3b,
+0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0xd1c, 0xd28, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41,
+0xd35, 0xd30, 0xd3f, 0x3b, 0xd2e, 0xd3e, 0xd7c, 0xd1a, 0xd4d, 0xd1a, 0xd4d, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0xd7d, 0x3b, 0xd2e,
+0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd13, 0xd17, 0xd38, 0xd4d, 0xd31, 0xd4d, 0xd31,
+0xd4d, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02, 0xd2c, 0xd7c, 0x3b, 0xd12, 0xd15, 0xd4d, 0x200c, 0xd1f, 0xd4b, 0xd2c,
+0xd7c, 0x3b, 0xd28, 0xd35, 0xd02, 0xd2c, 0xd7c, 0x3b, 0xd21, 0xd3f, 0xd38, 0xd02, 0xd2c, 0xd7c, 0xd1c, 0xd28, 0xd41, 0x3b, 0xd2b, 0xd46,
+0xd2c, 0xd4d, 0xd30, 0xd41, 0x3b, 0xd2e, 0xd3e, 0xd7c, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0x3b, 0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b,
+0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd13, 0xd17, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd02,
+0x3b, 0xd12, 0xd15, 0xd4d, 0xd1f, 0xd4b, 0x3b, 0xd28, 0xd35, 0xd02, 0x3b, 0xd21, 0xd3f, 0xd38, 0xd02, 0xd1c, 0x3b, 0xd2b, 0xd46, 0x3b,
+0xd2e, 0xd3e, 0x3b, 0xd0f, 0x3b, 0xd2e, 0xd46, 0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0x3b, 0xd13, 0x3b, 0xd38, 0xd46, 0x3b,
+0xd12, 0x3b, 0xd28, 0x3b, 0xd21, 0xd3f, 0x4a, 0x61, 0x6e, 0x6e, 0x61, 0x72, 0x3b, 0x46, 0x72, 0x61, 0x72, 0x3b, 0x4d, 0x61,
+0x72, 0x7a, 0x75, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x6a, 0x6a, 0x75, 0x3b, 0x120, 0x75, 0x6e, 0x6a,
+0x75, 0x3b, 0x4c, 0x75, 0x6c, 0x6a, 0x75, 0x3b, 0x41, 0x77, 0x77, 0x69, 0x73, 0x73, 0x75, 0x3b, 0x53, 0x65, 0x74, 0x74,
+0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x4f, 0x74, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
+0x72, 0x75, 0x3b, 0x44, 0x69, 0x10b, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x72, 0x61, 0x3b, 0x4d,
+0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x6a, 0x3b, 0x120, 0x75, 0x6e, 0x3b, 0x4c, 0x75, 0x6c, 0x3b, 0x41,
+0x77, 0x77, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x10b, 0x4a, 0x6e,
+0x3b, 0x46, 0x72, 0x3b, 0x4d, 0x7a, 0x3b, 0x41, 0x70, 0x3b, 0x4d, 0x6a, 0x3b, 0x120, 0x6e, 0x3b, 0x4c, 0x6a, 0x3b, 0x41,
+0x77, 0x3b, 0x53, 0x74, 0x3b, 0x4f, 0x62, 0x3b, 0x4e, 0x76, 0x3b, 0x44, 0x10b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
+0x3b, 0x4d, 0x3b, 0x120, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x4b, 0x6f, 0x68, 0x69,
0x74, 0x101, 0x74, 0x65, 0x61, 0x3b, 0x48, 0x75, 0x69, 0x74, 0x61, 0x6e, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x50, 0x6f, 0x75,
0x74, 0x16b, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x67, 0x69, 0x3b, 0x50, 0x61, 0x65, 0x6e, 0x67, 0x61, 0x77, 0x68, 0x101, 0x77,
0x68, 0x101, 0x3b, 0x48, 0x61, 0x72, 0x61, 0x74, 0x75, 0x61, 0x3b, 0x50, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x48, 0x14d,
0x6e, 0x67, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x3b, 0x48, 0x65, 0x72, 0x65, 0x74, 0x75, 0x72, 0x69, 0x6b, 0x14d, 0x6b, 0x101,
0x3b, 0x4d, 0x61, 0x68, 0x75, 0x72, 0x75, 0x3b, 0x57, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x2d, 0x101, 0x2d, 0x6e,
0x75, 0x6b, 0x75, 0x3b, 0x57, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x2d, 0x101, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x69,
-0x3b, 0x48, 0x61, 0x6b, 0x69, 0x68, 0x65, 0x61, 0x3b, 0x4b, 0x3b, 0x48, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x48, 0x3b, 0x50,
-0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x52, 0x3b, 0x48, 0x3b, 0x91c, 0x93e, 0x928, 0x947, 0x3b, 0x92b, 0x947,
-0x92c, 0x94d, 0x930, 0x941, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x3b, 0x92e, 0x947, 0x3b,
-0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x911, 0x917, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x3b, 0x911,
-0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x3b, 0x91c,
-0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e,
-0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c,
-0x941, 0x932, 0x948, 0x3b, 0x911, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911,
-0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938,
-0x947, 0x902, 0x92c, 0x930, 0x3b, 0x91c, 0x93e, 0x3b, 0x92b, 0x947, 0x3b, 0x92e, 0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c,
-0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x911, 0x3b, 0x938, 0x3b, 0x911, 0x3b, 0x928, 0x94b, 0x3b, 0x921, 0x93f, 0x3b, 0x31, 0x2d, 0x440,
-0x20, 0x441, 0x430, 0x440, 0x3b, 0x32, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x33, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440,
-0x3b, 0x34, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x35, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x36, 0x2d, 0x440,
-0x20, 0x441, 0x430, 0x440, 0x3b, 0x37, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x38, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440,
-0x3b, 0x39, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x31, 0x30, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x31, 0x31,
-0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x31, 0x32, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x41d, 0x44d, 0x433, 0x434,
-0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x425, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440,
-0x20, 0x441, 0x430, 0x440, 0x3b, 0x413, 0x443, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440,
-0x3b, 0x414, 0x4e9, 0x440, 0x4e9, 0x432, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x422, 0x430, 0x432,
-0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x417, 0x443, 0x440, 0x433, 0x430, 0x430, 0x434, 0x443, 0x433,
-0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x414, 0x43e, 0x43b, 0x43e, 0x43e, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20,
-0x441, 0x430, 0x440, 0x3b, 0x41d, 0x430, 0x439, 0x43c, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x415,
-0x441, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x410, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430,
-0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x410, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x43d, 0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d,
-0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x410, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x445, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433,
-0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x49, 0x3b, 0x49, 0x49, 0x3b, 0x49, 0x49, 0x49, 0x3b, 0x49, 0x56, 0x3b,
-0x56, 0x3b, 0x56, 0x49, 0x3b, 0x56, 0x49, 0x49, 0x3b, 0x56, 0x49, 0x49, 0x49, 0x3b, 0x49, 0x58, 0x3b, 0x58, 0x3b, 0x58,
-0x49, 0x3b, 0x58, 0x49, 0x49, 0x3b, 0x43d, 0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
-0x445, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x433, 0x443, 0x440, 0x430, 0x432,
-0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x434, 0x4e9, 0x440, 0x4e9, 0x432, 0x434, 0x4af, 0x433, 0x44d,
-0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x442, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440,
-0x3b, 0x437, 0x443, 0x440, 0x433, 0x430, 0x430, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x434, 0x43e,
-0x43b, 0x43e, 0x43e, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x43d, 0x430, 0x439, 0x43c, 0x434, 0x443,
-0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x435, 0x441, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430,
-0x440, 0x3b, 0x430, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x432,
-0x430, 0x43d, 0x20, 0x43d, 0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x432,
-0x430, 0x43d, 0x20, 0x445, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x91c, 0x928,
-0x935, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x905, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b,
-0x905, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b,
-0x905, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d,
-0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x92e, 0x94d,
-0x92c, 0x930, 0x3b, 0x91c, 0x928, 0x3b, 0x92b, 0x947, 0x947, 0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d,
-0x930, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x3b,
-0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x3b, 0x91c, 0x928, 0x3b, 0x92b,
-0x947, 0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928,
-0x3b, 0x91c, 0x941, 0x932, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b,
-0x92d, 0x947, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75,
-0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75,
-0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65,
-0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65,
-0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xb1c, 0xb3e, 0xb28, 0xb41, 0xb06, 0xb30, 0xb40, 0x3b, 0xb2b,
-0xb47, 0xb2c, 0xb43, 0xb06, 0xb30, 0xb40, 0x3b, 0xb2e, 0xb3e, 0xb30, 0xb4d, 0xb1a, 0xb4d, 0xb1a, 0x3b, 0xb05, 0xb2a, 0xb4d, 0xb30, 0xb47,
-0xb32, 0x3b, 0xb2e, 0xb07, 0x3b, 0xb1c, 0xb41, 0xb28, 0x3b, 0xb1c, 0xb41, 0xb32, 0xb3e, 0xb07, 0x3b, 0xb05, 0xb17, 0xb37, 0xb4d, 0xb1f,
-0x3b, 0xb38, 0xb47, 0xb2a, 0xb4d, 0xb1f, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb05, 0xb15, 0xb4d, 0xb1f, 0xb4b, 0xb2c, 0xb30, 0x3b,
-0xb28, 0xb2d, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb21, 0xb3f, 0xb38, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb1c, 0xb3e, 0x3b,
-0xb2b, 0xb47, 0x3b, 0xb2e, 0xb3e, 0x3b, 0xb05, 0x3b, 0xb2e, 0xb07, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb05, 0x3b, 0xb38,
-0xb47, 0x3b, 0xb05, 0x3b, 0xb28, 0x3b, 0xb21, 0xb3f, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631,
-0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b,
-0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9,
-0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x646, 0x648,
-0x631, 0x64a, 0x3b, 0x641, 0x6d0, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc,
-0x644, 0x3b, 0x645, 0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633, 0x62a, 0x3b,
-0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b,
-0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645,
-0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644,
-0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633, 0x62a, 0x3b, 0x633, 0x6d0, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648,
-0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x3b, 0x641, 0x3b, 0x645,
-0x3b, 0x627, 0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x698,
-0x627, 0x646, 0x648, 0x6cc, 0x647, 0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631,
-0x6cc, 0x644, 0x3b, 0x645, 0x647, 0x3b, 0x698, 0x648, 0x626, 0x646, 0x3b, 0x698, 0x648, 0x626, 0x6cc, 0x647, 0x3b, 0x627, 0x648, 0x62a,
-0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628,
-0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x698, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x622, 0x3b, 0x645, 0x3b, 0x698,
-0x3b, 0x698, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x654,
-0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x654, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645,
-0x647, 0x654, 0x3b, 0x698, 0x648, 0x626, 0x646, 0x3b, 0x698, 0x648, 0x626, 0x6cc, 0x647, 0x654, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633,
-0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b,
-0x62f, 0x633, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x6cc, 0x3b,
-0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648,
-0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648,
-0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x646, 0x648, 0x3b, 0x641,
-0x628, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b,
-0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b,
-0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x3b, 0x73, 0x74, 0x79,
-0x3b, 0x6c, 0x75, 0x74, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6b, 0x77, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65,
-0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x69, 0x65, 0x3b, 0x77, 0x72, 0x7a, 0x3b, 0x70, 0x61, 0x17a, 0x3b, 0x6c, 0x69, 0x73,
-0x3b, 0x67, 0x72, 0x75, 0x3b, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x65, 0x144, 0x3b, 0x6c, 0x75, 0x74, 0x79, 0x3b, 0x6d, 0x61,
-0x72, 0x7a, 0x65, 0x63, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x63, 0x69, 0x65, 0x144, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a,
-0x65, 0x72, 0x77, 0x69, 0x65, 0x63, 0x3b, 0x6c, 0x69, 0x70, 0x69, 0x65, 0x63, 0x3b, 0x73, 0x69, 0x65, 0x72, 0x70, 0x69,
-0x65, 0x144, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x73, 0x69, 0x65, 0x144, 0x3b, 0x70, 0x61, 0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72,
-0x6e, 0x69, 0x6b, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x67, 0x72, 0x75, 0x64, 0x7a, 0x69, 0x65,
-0x144, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x57, 0x3b,
-0x50, 0x3b, 0x4c, 0x3b, 0x47, 0x3b, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x6e, 0x69, 0x61, 0x3b, 0x6c, 0x75, 0x74, 0x65, 0x67,
-0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x74, 0x6e, 0x69, 0x61, 0x3b, 0x6d, 0x61, 0x6a,
-0x61, 0x3b, 0x63, 0x7a, 0x65, 0x72, 0x77, 0x63, 0x61, 0x3b, 0x6c, 0x69, 0x70, 0x63, 0x61, 0x3b, 0x73, 0x69, 0x65, 0x72,
-0x70, 0x6e, 0x69, 0x61, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x15b, 0x6e, 0x69, 0x61, 0x3b, 0x70, 0x61, 0x17a, 0x64, 0x7a, 0x69,
-0x65, 0x72, 0x6e, 0x69, 0x6b, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61, 0x3b, 0x67, 0x72, 0x75,
-0x64, 0x6e, 0x69, 0x61, 0x3b, 0x73, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x63, 0x3b, 0x6c, 0x3b, 0x73,
-0x3b, 0x77, 0x3b, 0x70, 0x3b, 0x6c, 0x3b, 0x67, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x76, 0x2e, 0x3b, 0x6d,
-0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a,
-0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x75, 0x74, 0x2e, 0x3b, 0x6e,
-0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x7a, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x76,
-0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d,
-0x61, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73,
-0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b,
-0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0xa1c, 0xa28,
-0x3b, 0xa2b, 0xa3c, 0xa30, 0x3b, 0xa2e, 0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30, 0xa48, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c,
-0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32, 0xa3e, 0x3b, 0xa05, 0xa17, 0x3b, 0xa38, 0xa24, 0xa70, 0x3b, 0xa05, 0xa15, 0xa24, 0xa42, 0x3b,
-0xa28, 0xa35, 0xa70, 0x3b, 0xa26, 0xa38, 0xa70, 0x3b, 0xa1c, 0xa28, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2b, 0xa3c, 0xa30, 0xa35, 0xa30, 0xa40,
-0x3b, 0xa2e, 0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30, 0xa48, 0xa32, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c, 0xa42, 0xa28, 0x3b,
-0xa1c, 0xa41, 0xa32, 0xa3e, 0xa08, 0x3b, 0xa05, 0xa17, 0xa38, 0xa24, 0x3b, 0xa38, 0xa24, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa05, 0xa15, 0xa24,
-0xa42, 0xa2c, 0xa30, 0x3b, 0xa28, 0xa35, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa26, 0xa38, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa1c, 0x3b, 0xa2b, 0xa3c,
-0x3b, 0xa2e, 0xa3e, 0x3b, 0xa05, 0x3b, 0xa2e, 0x3b, 0xa1c, 0xa42, 0x3b, 0xa1c, 0xa41, 0x3b, 0xa05, 0x3b, 0xa38, 0x3b, 0xa05, 0x3b,
-0xa28, 0x3b, 0xa26, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686,
-0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x626, 0x6cc,
-0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646,
-0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x45, 0x6e, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d,
-0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41,
-0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x63, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x63, 0x3b, 0x45,
-0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x41,
-0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x69,
-0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f,
-0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x63,
-0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x2e, 0x3b,
-0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63, 0x6c,
-0x2e, 0x3b, 0x66, 0x61, 0x6e, 0x2e, 0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x2e, 0x3b, 0x6f,
-0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x65,
-0x72, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x67, 0x6c,
-0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x66, 0x61, 0x6e, 0x61,
-0x64, 0x75, 0x72, 0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x6f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x46, 0x3b,
-0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x64, 0x61, 0x20, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x65, 0x72,
-0x3b, 0x64, 0x61, 0x20, 0x66, 0x61, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x64,
-0x2019, 0x61, 0x76, 0x72, 0x69, 0x67, 0x6c, 0x3b, 0x64, 0x61, 0x20, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x64, 0x61, 0x20, 0x7a,
-0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x66, 0x61, 0x6e, 0x61, 0x64, 0x75, 0x72, 0x3b,
-0x64, 0x2019, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x64, 0x61, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x69, 0x61, 0x6e, 0x2e, 0x3b,
-0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69,
-0x75, 0x6e, 0x2e, 0x3b, 0x69, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b,
-0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x69, 0x61, 0x6e, 0x75, 0x61,
-0x72, 0x69, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x65,
-0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x69,
-0x75, 0x6c, 0x69, 0x65, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72,
-0x69, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x6e, 0x6f, 0x69, 0x65, 0x6d, 0x62, 0x72,
-0x69, 0x65, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x49, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
-0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x44f, 0x43d, 0x432,
-0x2e, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430,
-0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d,
-0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f,
-0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b,
-0x43c, 0x430, 0x44f, 0x3b, 0x438, 0x44e, 0x43d, 0x2e, 0x3b, 0x438, 0x44e, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441,
-0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e,
-0x3b, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x44f, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44f, 0x3b, 0x43c, 0x430, 0x440, 0x442,
-0x430, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44f, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x438, 0x44e, 0x43d, 0x44f, 0x3b, 0x438, 0x44e,
-0x43b, 0x44f, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44f, 0x3b,
-0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431,
-0x440, 0x44f, 0x3b, 0x4e, 0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4d, 0x62, 0xe4, 0x3b, 0x4e, 0x67, 0x75, 0x3b, 0x42,
-0xea, 0x6c, 0x3b, 0x46, 0xf6, 0x6e, 0x3b, 0x4c, 0x65, 0x6e, 0x3b, 0x4b, 0xfc, 0x6b, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x4e,
-0x67, 0x62, 0x3b, 0x4e, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6b, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x65, 0x3b, 0x46, 0x75,
-0x6c, 0x75, 0x6e, 0x64, 0xef, 0x67, 0x69, 0x3b, 0x4d, 0x62, 0xe4, 0x6e, 0x67, 0xfc, 0x3b, 0x4e, 0x67, 0x75, 0x62, 0xf9,
-0x65, 0x3b, 0x42, 0xea, 0x6c, 0xe4, 0x77, 0xfc, 0x3b, 0x46, 0xf6, 0x6e, 0x64, 0x6f, 0x3b, 0x4c, 0x65, 0x6e, 0x67, 0x75,
-0x61, 0x3b, 0x4b, 0xfc, 0x6b, 0xfc, 0x72, 0xfc, 0x3b, 0x4d, 0x76, 0x75, 0x6b, 0x61, 0x3b, 0x4e, 0x67, 0x62, 0x65, 0x72,
-0x65, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x62, 0xe4, 0x6e, 0x64, 0xfc, 0x72, 0x75, 0x3b, 0x4b, 0x61, 0x6b, 0x61, 0x75, 0x6b,
-0x61, 0x3b, 0x4e, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b,
-0x4e, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f,
-0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435,
-0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440,
+0x3b, 0x48, 0x61, 0x6b, 0x69, 0x68, 0x65, 0x61, 0x4b, 0x6f, 0x68, 0x69, 0x3b, 0x48, 0x75, 0x69, 0x3b, 0x50, 0x6f, 0x75,
+0x3b, 0x50, 0x61, 0x65, 0x3b, 0x48, 0x61, 0x72, 0x61, 0x3b, 0x50, 0x69, 0x70, 0x69, 0x3b, 0x48, 0x14d, 0x6e, 0x67, 0x6f,
+0x3b, 0x48, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x61, 0x68, 0x75, 0x3b, 0x4e, 0x75, 0x6b, 0x75, 0x3b, 0x52, 0x61, 0x6e, 0x67,
+0x69, 0x3b, 0x48, 0x61, 0x6b, 0x69, 0x4b, 0x3b, 0x48, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x48, 0x3b, 0x50, 0x3b, 0x48, 0x3b,
+0x48, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x52, 0x3b, 0x48, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947,
+0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f,
+0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x911, 0x917, 0x938, 0x94d, 0x91f, 0x3b,
+0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935,
+0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930, 0x91c, 0x93e, 0x928, 0x947, 0x3b, 0x92b,
+0x947, 0x92c, 0x94d, 0x930, 0x941, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x3b, 0x92e, 0x947,
+0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x911, 0x917, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x3b,
+0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x91c,
+0x93e, 0x3b, 0x92b, 0x947, 0x3b, 0x92e, 0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b, 0x911,
+0x3b, 0x938, 0x3b, 0x911, 0x3b, 0x928, 0x94b, 0x3b, 0x921, 0x93f, 0x41d, 0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20,
+0x441, 0x430, 0x440, 0x3b, 0x425, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x413,
+0x443, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x414, 0x4e9, 0x440, 0x4e9, 0x432,
+0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x422, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440,
+0x20, 0x441, 0x430, 0x440, 0x3b, 0x417, 0x443, 0x440, 0x433, 0x430, 0x430, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430,
+0x440, 0x3b, 0x414, 0x43e, 0x43b, 0x43e, 0x43e, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x41d, 0x430,
+0x439, 0x43c, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x415, 0x441, 0x434, 0x4af, 0x433, 0x44d, 0x44d,
+0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x410, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440,
+0x3b, 0x410, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x43d, 0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440,
+0x3b, 0x410, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x445, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430,
+0x440, 0x43d, 0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x445, 0x43e, 0x451, 0x440, 0x434,
+0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x433, 0x443, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430,
+0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x434, 0x4e9, 0x440, 0x4e9, 0x432, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430,
+0x440, 0x3b, 0x442, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x437, 0x443, 0x440, 0x433,
+0x430, 0x430, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x434, 0x43e, 0x43b, 0x43e, 0x43e, 0x434, 0x443,
+0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x43d, 0x430, 0x439, 0x43c, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20,
+0x441, 0x430, 0x440, 0x3b, 0x435, 0x441, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x430,
+0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x43d, 0x44d,
+0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x445, 0x43e,
+0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x31, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
+0x32, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x33, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x34, 0x2d, 0x440, 0x20,
+0x441, 0x430, 0x440, 0x3b, 0x35, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x36, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
+0x37, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x38, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x39, 0x2d, 0x440, 0x20,
+0x441, 0x430, 0x440, 0x3b, 0x31, 0x30, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x31, 0x31, 0x2d, 0x440, 0x20, 0x441, 0x430,
+0x440, 0x3b, 0x31, 0x32, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x49, 0x3b, 0x49, 0x49, 0x3b, 0x49, 0x49, 0x49, 0x3b, 0x49,
+0x56, 0x3b, 0x56, 0x3b, 0x56, 0x49, 0x3b, 0x56, 0x49, 0x49, 0x3b, 0x56, 0x49, 0x49, 0x49, 0x3b, 0x49, 0x58, 0x3b, 0x58,
+0x3b, 0x58, 0x49, 0x3b, 0x58, 0x49, 0x49, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x905,
+0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c,
+0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f,
+0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x92e, 0x94d,
+0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x91c, 0x928, 0x3b, 0x92b, 0x947, 0x947, 0x92c, 0x3b, 0x92e,
+0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932,
+0x3b, 0x905, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921,
+0x93f, 0x938, 0x947, 0x91c, 0x928, 0x3b, 0x92b, 0x947, 0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930,
+0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x3b, 0x905,
+0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72,
+0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b,
+0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74,
+0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e,
+0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0xb1c, 0xb3e, 0xb28, 0xb41,
+0xb06, 0xb30, 0xb40, 0x3b, 0xb2b, 0xb47, 0xb2c, 0xb43, 0xb06, 0xb30, 0xb40, 0x3b, 0xb2e, 0xb3e, 0xb30, 0xb4d, 0xb1a, 0xb4d, 0xb1a, 0x3b,
+0xb05, 0xb2a, 0xb4d, 0xb30, 0xb47, 0xb32, 0x3b, 0xb2e, 0xb07, 0x3b, 0xb1c, 0xb41, 0xb28, 0x3b, 0xb1c, 0xb41, 0xb32, 0xb3e, 0xb07, 0x3b,
+0xb05, 0xb17, 0xb37, 0xb4d, 0xb1f, 0x3b, 0xb38, 0xb47, 0xb2a, 0xb4d, 0xb1f, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb05, 0xb15, 0xb4d,
+0xb1f, 0xb4b, 0xb2c, 0xb30, 0x3b, 0xb28, 0xb2d, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb21, 0xb3f, 0xb38, 0xb47, 0xb2e, 0xb4d, 0xb2c,
+0xb30, 0xb1c, 0xb3e, 0x3b, 0xb2b, 0xb47, 0x3b, 0xb2e, 0xb3e, 0x3b, 0xb05, 0x3b, 0xb2e, 0xb07, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb1c, 0xb41,
+0x3b, 0xb05, 0x3b, 0xb38, 0xb47, 0x3b, 0xb05, 0x3b, 0xb28, 0x3b, 0xb21, 0xb3f, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x6d0,
+0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b,
+0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628,
+0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631,
+0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e,
+0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633,
+0x62a, 0x3b, 0x633, 0x6d0, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645,
+0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x64a,
+0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c,
+0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6ab, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a,
+0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x3b, 0x641, 0x3b, 0x645,
+0x3b, 0x627, 0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x698, 0x627,
+0x646, 0x648, 0x6cc, 0x647, 0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc,
+0x644, 0x3b, 0x645, 0x647, 0x3b, 0x698, 0x648, 0x626, 0x646, 0x3b, 0x698, 0x648, 0x626, 0x6cc, 0x647, 0x3b, 0x627, 0x648, 0x62a, 0x3b,
+0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631,
+0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x654, 0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647,
+0x654, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x647, 0x654, 0x3b, 0x698, 0x648, 0x626,
+0x646, 0x3b, 0x698, 0x648, 0x626, 0x6cc, 0x647, 0x654, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628, 0x631,
+0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628, 0x631,
+0x698, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x622, 0x3b, 0x645, 0x3b, 0x698, 0x3b, 0x698, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b,
+0x646, 0x3b, 0x62f, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686,
+0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b,
+0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646,
+0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x62c, 0x646, 0x648, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x6cc,
+0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c,
+0x648, 0x644, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628,
+0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x65, 0x144, 0x3b, 0x6c,
+0x75, 0x74, 0x79, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x65, 0x63, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x63, 0x69, 0x65, 0x144, 0x3b,
+0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x72, 0x77, 0x69, 0x65, 0x63, 0x3b, 0x6c, 0x69, 0x70, 0x69, 0x65, 0x63, 0x3b,
+0x73, 0x69, 0x65, 0x72, 0x70, 0x69, 0x65, 0x144, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x73, 0x69, 0x65, 0x144, 0x3b, 0x70, 0x61,
+0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69, 0x6b, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x67,
+0x72, 0x75, 0x64, 0x7a, 0x69, 0x65, 0x144, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x6e, 0x69, 0x61, 0x3b, 0x6c, 0x75, 0x74, 0x65,
+0x67, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x74, 0x6e, 0x69, 0x61, 0x3b, 0x6d, 0x61,
+0x6a, 0x61, 0x3b, 0x63, 0x7a, 0x65, 0x72, 0x77, 0x63, 0x61, 0x3b, 0x6c, 0x69, 0x70, 0x63, 0x61, 0x3b, 0x73, 0x69, 0x65,
+0x72, 0x70, 0x6e, 0x69, 0x61, 0x3b, 0x77, 0x72, 0x7a, 0x65, 0x15b, 0x6e, 0x69, 0x61, 0x3b, 0x70, 0x61, 0x17a, 0x64, 0x7a,
+0x69, 0x65, 0x72, 0x6e, 0x69, 0x6b, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61, 0x3b, 0x67, 0x72,
+0x75, 0x64, 0x6e, 0x69, 0x61, 0x73, 0x74, 0x79, 0x3b, 0x6c, 0x75, 0x74, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6b, 0x77, 0x69,
+0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x69, 0x65, 0x3b, 0x77, 0x72, 0x7a,
+0x3b, 0x70, 0x61, 0x17a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x67, 0x72, 0x75, 0x53, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b,
+0x4d, 0x3b, 0x43, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x57, 0x3b, 0x50, 0x3b, 0x4c, 0x3b, 0x47, 0x73, 0x3b, 0x6c, 0x3b, 0x6d,
+0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x63, 0x3b, 0x6c, 0x3b, 0x73, 0x3b, 0x77, 0x3b, 0x70, 0x3b, 0x6c, 0x3b, 0x67, 0x6a, 0x61,
+0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0xe7,
+0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x6a,
+0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f,
+0x3b, 0x6f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65,
+0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x76, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e,
+0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e,
+0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x75, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e,
+0x3b, 0x64, 0x65, 0x7a, 0x2e, 0xa1c, 0xa28, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2b, 0xa3c, 0xa30, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2e, 0xa3e,
+0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30, 0xa48, 0xa32, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c, 0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32,
+0xa3e, 0xa08, 0x3b, 0xa05, 0xa17, 0xa38, 0xa24, 0x3b, 0xa38, 0xa24, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa05, 0xa15, 0xa24, 0xa42, 0xa2c, 0xa30,
+0x3b, 0xa28, 0xa35, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa26, 0xa38, 0xa70, 0xa2c, 0xa30, 0xa1c, 0xa28, 0x3b, 0xa2b, 0xa3c, 0xa30, 0x3b, 0xa2e,
+0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30, 0xa48, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c, 0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32,
+0xa3e, 0x3b, 0xa05, 0xa17, 0x3b, 0xa38, 0xa24, 0xa70, 0x3b, 0xa05, 0xa15, 0xa24, 0xa42, 0x3b, 0xa28, 0xa35, 0xa70, 0x3b, 0xa26, 0xa38,
+0xa70, 0xa1c, 0x3b, 0xa2b, 0xa3c, 0x3b, 0xa2e, 0xa3e, 0x3b, 0xa05, 0x3b, 0xa2e, 0x3b, 0xa1c, 0xa42, 0x3b, 0xa1c, 0xa41, 0x3b, 0xa05,
+0x3b, 0xa38, 0x3b, 0xa05, 0x3b, 0xa28, 0x3b, 0xa26, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b,
+0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648,
+0x644, 0x627, 0x626, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648,
+0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x45, 0x6e, 0x65, 0x72, 0x6f, 0x3b,
+0x46, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b,
+0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x41, 0x67, 0x6f,
+0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f, 0x63, 0x74, 0x75, 0x62, 0x72,
+0x65, 0x3b, 0x4e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72,
+0x65, 0x45, 0x6e, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79,
+0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x63, 0x74,
+0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x63, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x65, 0x72, 0x3b, 0x66, 0x61, 0x76, 0x72,
+0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x67, 0x6c, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b,
+0x7a, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x66, 0x61, 0x6e, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x61, 0x76,
+0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x65,
+0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x64,
+0x61, 0x20, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x65, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x66, 0x61, 0x76, 0x72, 0x65, 0x72, 0x3b,
+0x64, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x64, 0x2019, 0x61, 0x76, 0x72, 0x69, 0x67, 0x6c, 0x3b, 0x64, 0x61, 0x20,
+0x6d, 0x61, 0x74, 0x67, 0x3b, 0x64, 0x61, 0x20, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x64, 0x61,
+0x20, 0x66, 0x61, 0x6e, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x64, 0x2019, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x64, 0x61, 0x20,
+0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b,
+0x64, 0x61, 0x20, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x61, 0x20, 0x64, 0x65, 0x63, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73,
+0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x2e, 0x3b, 0x66, 0x61,
+0x6e, 0x2e, 0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b,
+0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a,
+0x3b, 0x46, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x69, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x65,
+0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x65, 0x3b, 0x61, 0x70,
+0x72, 0x69, 0x6c, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x69, 0x75, 0x6c, 0x69,
+0x65, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b,
+0x6f, 0x63, 0x74, 0x6f, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x6e, 0x6f, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b,
+0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x69, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d,
+0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x2e, 0x3b, 0x69, 0x75,
+0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e,
+0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x49, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b,
+0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x44f, 0x3b, 0x444, 0x435,
+0x432, 0x440, 0x430, 0x43b, 0x44f, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x430, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44f, 0x3b, 0x43c,
+0x430, 0x44f, 0x3b, 0x438, 0x44e, 0x43d, 0x44f, 0x3b, 0x438, 0x44e, 0x43b, 0x44f, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x430,
+0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x43d, 0x43e,
+0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44f, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432,
+0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d,
+0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x43e, 0x43a,
+0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435,
+0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x438, 0x44e,
+0x43d, 0x2e, 0x3b, 0x438, 0x44e, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x43e,
+0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x65,
+0x3b, 0x46, 0x75, 0x6c, 0x75, 0x6e, 0x64, 0xef, 0x67, 0x69, 0x3b, 0x4d, 0x62, 0xe4, 0x6e, 0x67, 0xfc, 0x3b, 0x4e, 0x67,
+0x75, 0x62, 0xf9, 0x65, 0x3b, 0x42, 0xea, 0x6c, 0xe4, 0x77, 0xfc, 0x3b, 0x46, 0xf6, 0x6e, 0x64, 0x6f, 0x3b, 0x4c, 0x65,
+0x6e, 0x67, 0x75, 0x61, 0x3b, 0x4b, 0xfc, 0x6b, 0xfc, 0x72, 0xfc, 0x3b, 0x4d, 0x76, 0x75, 0x6b, 0x61, 0x3b, 0x4e, 0x67,
+0x62, 0x65, 0x72, 0x65, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x62, 0xe4, 0x6e, 0x64, 0xfc, 0x72, 0x75, 0x3b, 0x4b, 0x61, 0x6b,
+0x61, 0x75, 0x6b, 0x61, 0x4e, 0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4d, 0x62, 0xe4, 0x3b, 0x4e, 0x67, 0x75, 0x3b,
+0x42, 0xea, 0x6c, 0x3b, 0x46, 0xf6, 0x6e, 0x3b, 0x4c, 0x65, 0x6e, 0x3b, 0x4b, 0xfc, 0x6b, 0x3b, 0x4d, 0x76, 0x75, 0x3b,
+0x4e, 0x67, 0x62, 0x3b, 0x4e, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6b, 0x4e, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x42,
+0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440,
0x3b, 0x444, 0x435, 0x431, 0x440, 0x443, 0x430, 0x440, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b,
0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441,
0x435, 0x43f, 0x442, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432,
-0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x458, 0x430, 0x43d, 0x3b, 0x444,
-0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b,
-0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432,
-0x3b, 0x434, 0x435, 0x446, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72,
-0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65, 0x70,
-0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b,
-0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d,
-0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65,
-0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65,
-0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65,
-0x62, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a,
-0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b,
-0x64, 0x65, 0x63, 0x3b, 0x42f, 0x43d, 0x432, 0x2e, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x2e,
-0x3b, 0x410, 0x43f, 0x440, 0x2e, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b,
-0x410, 0x432, 0x433, 0x2e, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x41e, 0x43a, 0x442, 0x2e, 0x3b, 0x41d, 0x43e, 0x44f, 0x431,
-0x2e, 0x3b, 0x414, 0x435, 0x43a, 0x2e, 0x3b, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b,
-0x44c, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x44a, 0x438, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x439, 0x3b,
-0x418, 0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d,
-0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x44c,
-0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x3b, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c,
-0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x44b, 0x3b, 0x438, 0x44e, 0x43d, 0x44b, 0x3b, 0x438,
-0x44e, 0x43b, 0x44b, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d,
-0x43e, 0x44f, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x44b, 0x3b, 0x444, 0x435, 0x432, 0x440,
-0x430, 0x43b, 0x44b, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x44a, 0x438, 0x439, 0x44b, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44b, 0x3b,
-0x43c, 0x430, 0x439, 0x44b, 0x3b, 0x438, 0x44e, 0x43d, 0x44b, 0x3b, 0x438, 0x44e, 0x43b, 0x44b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441,
-0x442, 0x44b, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44b, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44b, 0x3b,
-0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44b, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44b, 0x3b, 0x4e, 0x64, 0x69, 0x3b, 0x4b,
-0x75, 0x6b, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x4b, 0x75, 0x62, 0x3b, 0x43, 0x68, 0x76, 0x3b, 0x43, 0x68, 0x6b, 0x3b, 0x43,
-0x68, 0x67, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x47, 0x75, 0x6e, 0x3b, 0x47, 0x75, 0x6d, 0x3b, 0x4d, 0x62, 0x75, 0x3b, 0x5a,
-0x76, 0x69, 0x3b, 0x4e, 0x64, 0x69, 0x72, 0x61, 0x3b, 0x4b, 0x75, 0x6b, 0x61, 0x64, 0x7a, 0x69, 0x3b, 0x4b, 0x75, 0x72,
-0x75, 0x6d, 0x65, 0x3b, 0x4b, 0x75, 0x62, 0x76, 0x75, 0x6d, 0x62, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x76, 0x61, 0x62, 0x76,
-0x75, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6e, 0x67, 0x75, 0x72, 0x75,
-0x3b, 0x4e, 0x79, 0x61, 0x6d, 0x61, 0x76, 0x68, 0x75, 0x76, 0x68, 0x75, 0x3b, 0x47, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x61,
-0x3b, 0x47, 0x75, 0x6d, 0x69, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4d, 0x62, 0x75, 0x64, 0x7a, 0x69, 0x3b, 0x5a, 0x76, 0x69,
-0x74, 0x61, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4e, 0x3b, 0x47,
-0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x64a, 0x628, 0x631, 0x648, 0x631, 0x64a,
-0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x626, 0x64a, 0x3b, 0x62c, 0x648, 0x646, 0x3b,
-0x62c, 0x648, 0x644, 0x627, 0x621, 0x650, 0x3b, 0x622, 0x6af, 0x633, 0x67d, 0x3b, 0x633, 0x64a, 0x67e, 0x67d, 0x645, 0x628, 0x631, 0x3b,
-0x622, 0x6aa, 0x67d, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x68a, 0x633, 0x645, 0x628, 0x631, 0x3b, 0xda2,
-0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b,
-0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdbd, 0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3,
-0xdd0, 0xdb4, 0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0x3b, 0xda2, 0xdb1,
-0xdc0, 0xdcf, 0xdbb, 0xdd2, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0xdbb, 0xdc0, 0xdcf, 0xdbb, 0xdd2, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0xdd4,
-0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b,
-0xda2, 0xdd6, 0xdbd, 0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0xdc3, 0xdca, 0xdad, 0xdd4, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0xdad, 0xdd0, 0xdb8,
-0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0xdad, 0xddd, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0xdb8, 0xdca,
-0xdb6, 0xdbb, 0xdca, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xda2, 0x3b, 0xdb4, 0xdd9, 0x3b, 0xdb8,
-0xdcf, 0x3b, 0xd85, 0x3b, 0xdb8, 0xdd0, 0x3b, 0xda2, 0xdd6, 0x3b, 0xda2, 0xdd6, 0x3b, 0xd85, 0x3b, 0xdc3, 0xdd0, 0x3b, 0xd94, 0x3b,
-0xdb1, 0xdd9, 0x3b, 0xdaf, 0xdd9, 0x3b, 0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0xdd4, 0x3b,
+0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435,
+0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443,
+0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435,
+0x446, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74,
+0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61,
+0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
+0x62, 0x61, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61,
+0x72, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a,
+0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74,
+0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x74,
+0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67,
+0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x458, 0x430, 0x43d,
+0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443,
+0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d,
+0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c,
+0x3b, 0x41c, 0x430, 0x440, 0x442, 0x44a, 0x438, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418,
+0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442,
+0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b,
+0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x44b, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b,
+0x44b, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x44a, 0x438, 0x439, 0x44b, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44b, 0x3b, 0x43c, 0x430,
+0x439, 0x44b, 0x3b, 0x438, 0x44e, 0x43d, 0x44b, 0x3b, 0x438, 0x44e, 0x43b, 0x44b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x44b,
+0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44b, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44b, 0x3b, 0x43d, 0x43e,
+0x44f, 0x431, 0x440, 0x44b, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44b, 0x42f, 0x43d, 0x432, 0x2e, 0x3b, 0x424, 0x435, 0x432,
+0x440, 0x2e, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x2e, 0x3b, 0x410, 0x43f, 0x440, 0x2e, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e,
+0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x2e, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x41e,
+0x43a, 0x442, 0x2e, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x414, 0x435, 0x43a, 0x2e, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444,
+0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x44b, 0x3b, 0x438,
+0x44e, 0x43d, 0x44b, 0x3b, 0x438, 0x44e, 0x43b, 0x44b, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x2e, 0x3b, 0x43e,
+0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x4e, 0x64, 0x69, 0x72, 0x61, 0x3b, 0x4b,
+0x75, 0x6b, 0x61, 0x64, 0x7a, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x75, 0x6d, 0x65, 0x3b, 0x4b, 0x75, 0x62, 0x76, 0x75, 0x6d,
+0x62, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x76, 0x61, 0x62, 0x76, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b,
+0x43, 0x68, 0x69, 0x6b, 0x75, 0x6e, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4e, 0x79, 0x61, 0x6d, 0x61, 0x76, 0x68, 0x75, 0x76,
+0x68, 0x75, 0x3b, 0x47, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x61, 0x3b, 0x47, 0x75, 0x6d, 0x69, 0x67, 0x75, 0x72, 0x75, 0x3b,
+0x4d, 0x62, 0x75, 0x64, 0x7a, 0x69, 0x3b, 0x5a, 0x76, 0x69, 0x74, 0x61, 0x4e, 0x64, 0x69, 0x3b, 0x4b, 0x75, 0x6b, 0x3b,
+0x4b, 0x75, 0x72, 0x3b, 0x4b, 0x75, 0x62, 0x3b, 0x43, 0x68, 0x76, 0x3b, 0x43, 0x68, 0x6b, 0x3b, 0x43, 0x68, 0x67, 0x3b,
+0x4e, 0x79, 0x61, 0x3b, 0x47, 0x75, 0x6e, 0x3b, 0x47, 0x75, 0x6d, 0x3b, 0x4d, 0x62, 0x75, 0x3b, 0x5a, 0x76, 0x69, 0x4e,
+0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4e, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d,
+0x3b, 0x5a, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x64a, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686,
+0x3b, 0x627, 0x67e, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x626, 0x64a, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x621,
+0x650, 0x3b, 0x622, 0x6af, 0x633, 0x67d, 0x3b, 0x633, 0x64a, 0x67e, 0x67d, 0x645, 0x628, 0x631, 0x3b, 0x622, 0x6aa, 0x67d, 0x648, 0x628,
+0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x68a, 0x633, 0x645, 0x628, 0x631, 0xda2, 0xdb1, 0xdc0, 0xdcf, 0xdbb, 0xdd2, 0x3b,
+0xdb4, 0xdd9, 0xdb6, 0xdbb, 0xdc0, 0xdcf, 0xdbb, 0xdd2, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0xdd4, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d,
+0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdbd, 0xdd2, 0x3b,
+0xd85, 0xd9c, 0xddd, 0xdc3, 0xdca, 0xdad, 0xdd4, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0xdad, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b,
+0xd94, 0xd9a, 0xdca, 0xdad, 0xddd, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdaf,
+0xdd9, 0xdc3, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0x3b,
+0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b, 0xda2,
+0xdd6, 0xdbd, 0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0,
+0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0xdd4, 0x3b,
0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b, 0xda2,
0xdd6, 0xdbd, 0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0,
-0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61,
-0x70, 0x72, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73,
-0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0xe1,
-0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72, 0xed,
-0x6c, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74,
-0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e,
-0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e,
-0x75, 0xe1, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x3b,
-0x61, 0x70, 0x72, 0xed, 0x6c, 0x61, 0x3b, 0x6d, 0xe1, 0x6a, 0x61, 0x3b, 0x6a, 0xfa, 0x6e, 0x61, 0x3b, 0x6a, 0xfa, 0x6c,
-0x61, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b,
-0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64, 0x65, 0x63,
-0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e,
-0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b,
-0x61, 0x76, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
-0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b,
-0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69,
-0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65,
-0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65,
-0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d,
-0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4c, 0x75, 0x6c, 0x3b, 0x4f,
-0x67, 0x73, 0x3b, 0x53, 0x65, 0x62, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x66, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a,
-0x61, 0x6e, 0x6e, 0x61, 0x61, 0x79, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x61, 0x61, 0x79, 0x6f, 0x3b, 0x4d, 0x61, 0x61,
-0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b,
-0x4c, 0x75, 0x75, 0x6c, 0x69, 0x79, 0x6f, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x62, 0x74, 0x65, 0x6d,
-0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x66, 0x65, 0x6d, 0x62, 0x61,
-0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d,
-0x3b, 0x4a, 0x3b, 0x4c, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61,
-0x20, 0x4b, 0x6f, 0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x61,
-0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x64, 0x64, 0x65, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69,
-0x73, 0x68, 0x61, 0x20, 0x41, 0x66, 0x72, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x68, 0x61,
-0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x69, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69,
-0x73, 0x68, 0x61, 0x20, 0x54, 0x6f, 0x64, 0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53,
-0x69, 0x64, 0x65, 0x65, 0x64, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x67, 0x61, 0x61,
-0x6c, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42,
-0x69, 0x73, 0x68, 0x61, 0x20, 0x4b, 0x6f, 0x77, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64,
-0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e,
-0x61, 0x61, 0x64, 0x3b, 0x65, 0x6e, 0x65, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61,
-0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x79, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61,
-0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
-0x64, 0x69, 0x63, 0x2e, 0x3b, 0x65, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x6d,
+0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xda2, 0x3b, 0xdb4, 0xdd9, 0x3b, 0xdb8, 0xdcf, 0x3b, 0xd85, 0x3b, 0xdb8, 0xdd0, 0x3b, 0xda2,
+0xdd6, 0x3b, 0xda2, 0xdd6, 0x3b, 0xd85, 0x3b, 0xdc3, 0xdd0, 0x3b, 0xd94, 0x3b, 0xdb1, 0xdd9, 0x3b, 0xdaf, 0xdd9, 0x6a, 0x61, 0x6e,
+0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b, 0x61, 0x70,
+0x72, 0xed, 0x6c, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x75,
+0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72,
+0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61,
+0x6e, 0x75, 0xe1, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x63, 0x61,
+0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x61, 0x3b, 0x6d, 0xe1, 0x6a, 0x61, 0x3b, 0x6a, 0xfa, 0x6e, 0x61, 0x3b, 0x6a, 0xfa,
+0x6c, 0x61, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61,
+0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64, 0x65,
+0x63, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70,
+0x72, 0x3b, 0x6d, 0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65,
+0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b,
+0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b,
+0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x76, 0x67, 0x75,
+0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72,
+0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61,
+0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61,
+0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x76, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70,
+0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x4a, 0x61, 0x6e, 0x6e,
+0x61, 0x61, 0x79, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x61, 0x61, 0x79, 0x6f, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x73, 0x6f,
+0x3b, 0x41, 0x62, 0x72, 0x69, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b, 0x4c, 0x75, 0x75,
+0x6c, 0x69, 0x79, 0x6f, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x62, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72,
+0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x66, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44,
+0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4b, 0x6f, 0x6f, 0x62, 0x61, 0x61, 0x64,
+0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20,
+0x53, 0x61, 0x64, 0x64, 0x65, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x41, 0x66, 0x72, 0x61,
+0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x68, 0x61, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73,
+0x68, 0x61, 0x20, 0x4c, 0x69, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54, 0x6f, 0x64, 0x6f,
+0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x69, 0x64, 0x65, 0x65, 0x64, 0x61, 0x61, 0x64,
+0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x67, 0x61, 0x61, 0x6c, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73,
+0x68, 0x61, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4b, 0x6f, 0x77,
+0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c,
+0x61, 0x62, 0x61, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x4a, 0x61, 0x6e, 0x3b, 0x46,
+0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4c,
+0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x73, 0x3b, 0x53, 0x65, 0x62, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x66, 0x3b, 0x44,
+0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4c, 0x3b, 0x4f, 0x3b, 0x53, 0x3b,
+0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x65, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x6d,
0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69,
0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x69,
0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d,
-0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
-0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x65, 0x6e,
-0x65, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61,
-0x79, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65,
-0x70, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e, 0x3b, 0x45, 0x6e,
-0x65, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x41, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61,
-0x79, 0x2e, 0x3b, 0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x67, 0x6f, 0x2e, 0x3b, 0x53, 0x65,
-0x74, 0x2e, 0x3b, 0x4f, 0x63, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x69, 0x63, 0x2e, 0x3b, 0x65, 0x6e,
-0x65, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61,
-0x79, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65,
-0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e, 0x3b, 0x65, 0x6e,
-0x65, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62,
-0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f,
-0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63,
-0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69,
-0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70,
-0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65,
-0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72,
-0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41,
-0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
-0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x6a, 0x61,
-0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61,
-0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70,
-0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e,
-0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61,
-0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61,
-0x75, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74,
-0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440, 0x442,
-0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410,
-0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440,
-0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x3b, 0xb9c, 0xba9, 0x2e, 0x3b, 0xbaa, 0xbbf,
-0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2,
-0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0x2e, 0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xb85, 0xb95,
-0xbcd, 0x2e, 0x3b, 0xba8, 0xbb5, 0x2e, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0x2e, 0x3b, 0xb9c, 0xba9, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbaa, 0xbbf,
-0xbaa, 0xbcd, 0xbb0, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0xb9a, 0xbcd, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0xbb0, 0xbb2, 0xbcd,
-0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0xbb8, 0xbcd, 0xb9f, 0xbcd,
-0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0xb9f, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb85, 0xb95, 0xbcd, 0xb9f, 0xbcb, 0xbaa, 0xbb0, 0xbcd,
-0x3b, 0xba8, 0xbb5, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9c, 0x3b,
-0xbaa, 0xbbf, 0x3b, 0xbae, 0xbbe, 0x3b, 0xb8f, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb86, 0x3b, 0xb9a,
-0xbc6, 0x3b, 0xb85, 0x3b, 0xba8, 0x3b, 0xb9f, 0xbbf, 0x3b, 0x433, 0x44b, 0x439, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b,
-0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438,
-0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b,
-0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x433, 0x44b, 0x439, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444,
-0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x43c,
-0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b,
-0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43d, 0x43e, 0x44f,
-0x431, 0x440, 0x44c, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x3b, 0xc1c, 0xc28, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d, 0xc30,
-0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b, 0xc0f, 0xc2a, 0xc4d, 0xc30, 0xc3f, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0xc28,
-0xc4d, 0x3b, 0xc1c, 0xc41, 0xc32, 0xc48, 0x3b, 0xc06, 0xc17, 0x3b, 0xc38, 0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0x3b, 0xc05, 0xc15,
-0xc4d, 0xc1f, 0xc4b, 0x3b, 0xc28, 0xc35, 0xc02, 0x3b, 0xc21, 0xc3f, 0xc38, 0xc46, 0xc02, 0x3b, 0xc1c, 0xc28, 0xc35, 0xc30, 0xc3f, 0x3b,
-0xc2b, 0xc3f, 0xc2c, 0xc4d, 0xc30, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b, 0xc0f, 0xc2a, 0xc4d, 0xc30,
-0xc3f, 0xc32, 0xc4d, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc41, 0xc32, 0xc48, 0x3b, 0xc06, 0xc17, 0xc38,
-0xc4d, 0xc1f, 0xc41, 0x3b, 0xc38, 0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc05, 0xc15, 0xc4d, 0xc1f, 0xc4b,
-0xc2c, 0xc30, 0xc4d, 0x3b, 0xc28, 0xc35, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc3f, 0xc38, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b,
-0xc1c, 0x3b, 0xc2b, 0xc3f, 0x3b, 0xc2e, 0xc3e, 0x3b, 0xc0f, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0x3b, 0xc1c, 0xc41, 0x3b, 0xc06,
-0x3b, 0xc38, 0xc46, 0x3b, 0xc05, 0x3b, 0xc28, 0x3b, 0xc21, 0xc3f, 0x3b, 0xe21, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe1e, 0x2e,
-0x3b, 0xe21, 0xe35, 0x2e, 0xe04, 0x2e, 0x3b, 0xe40, 0xe21, 0x2e, 0xe22, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe34,
-0x2e, 0xe22, 0x2e, 0x3b, 0xe01, 0x2e, 0xe04, 0x2e, 0x3b, 0xe2a, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe22, 0x2e, 0x3b, 0xe15,
-0x2e, 0xe04, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe22, 0x2e, 0x3b, 0xe18, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe01, 0xe23, 0xe32, 0xe04, 0xe21,
-0x3b, 0xe01, 0xe38, 0xe21, 0xe20, 0xe32, 0xe1e, 0xe31, 0xe19, 0xe18, 0xe4c, 0x3b, 0xe21, 0xe35, 0xe19, 0xe32, 0xe04, 0xe21, 0x3b, 0xe40,
-0xe21, 0xe29, 0xe32, 0xe22, 0xe19, 0x3b, 0xe1e, 0xe24, 0xe29, 0xe20, 0xe32, 0xe04, 0xe21, 0x3b, 0xe21, 0xe34, 0xe16, 0xe38, 0xe19, 0xe32,
-0xe22, 0xe19, 0x3b, 0xe01, 0xe23, 0xe01, 0xe0e, 0xe32, 0xe04, 0xe21, 0x3b, 0xe2a, 0xe34, 0xe07, 0xe2b, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01,
-0xe31, 0xe19, 0xe22, 0xe32, 0xe22, 0xe19, 0x3b, 0xe15, 0xe38, 0xe25, 0xe32, 0xe04, 0xe21, 0x3b, 0xe1e, 0xe24, 0xe28, 0xe08, 0xe34, 0xe01,
-0xe32, 0xe22, 0xe19, 0x3b, 0xe18, 0xe31, 0xe19, 0xe27, 0xe32, 0xe04, 0xe21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b,
-0xf54, 0xf7c, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf56, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54,
-0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xfb2,
-0xf74, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f,
-0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf42,
-0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56,
-0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54,
-0xf7c, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42,
-0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b,
-0xf56, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f,
-0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1,
-0xf51, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
-0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b,
-0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0x3b, 0x1325, 0x122a,
-0x3b, 0x1208, 0x12ab, 0x3b, 0x1218, 0x130b, 0x3b, 0x121a, 0x12eb, 0x3b, 0x130d, 0x1295, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x3b, 0x1290,
-0x1213, 0x3b, 0x1218, 0x1235, 0x3b, 0x1325, 0x1245, 0x3b, 0x1215, 0x12f3, 0x3b, 0x1273, 0x1215, 0x3b, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x1272,
-0x1275, 0x3b, 0x1218, 0x130b, 0x1262, 0x1275, 0x3b, 0x121a, 0x12eb, 0x12dd, 0x12eb, 0x3b, 0x130d, 0x1295, 0x1266, 0x1275, 0x3b, 0x1230, 0x1290, 0x3b,
-0x1213, 0x121d, 0x1208, 0x3b, 0x1290, 0x1213, 0x1230, 0x3b, 0x1218, 0x1235, 0x12a8, 0x1228, 0x121d, 0x3b, 0x1325, 0x1245, 0x121d, 0x1272, 0x3b, 0x1215,
-0x12f3, 0x122d, 0x3b, 0x1273, 0x1215, 0x1233, 0x1235, 0x3b, 0x1325, 0x3b, 0x1208, 0x3b, 0x1218, 0x3b, 0x121a, 0x3b, 0x130d, 0x3b, 0x1230, 0x3b,
-0x1213, 0x3b, 0x1290, 0x3b, 0x1218, 0x3b, 0x1325, 0x3b, 0x1215, 0x3b, 0x1273, 0x3b, 0x53, 0x101, 0x6e, 0x3b, 0x46, 0x113, 0x70, 0x3b,
+0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x65, 0x6e, 0x65, 0x2e, 0x3b, 0x66, 0x65,
+0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x79, 0x2e, 0x3b, 0x6a, 0x75,
+0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f,
+0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
+0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x65, 0x6e, 0x65, 0x2e,
+0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x79, 0x2e,
+0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e,
+0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e, 0x65, 0x6e, 0x65, 0x72, 0x6f,
+0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c,
+0x3b, 0x6d, 0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67,
+0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62,
+0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62,
+0x72, 0x65, 0x45, 0x6e, 0x65, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x41, 0x62, 0x72,
+0x2e, 0x3b, 0x4d, 0x61, 0x79, 0x2e, 0x3b, 0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x67, 0x6f,
+0x2e, 0x3b, 0x53, 0x65, 0x74, 0x2e, 0x3b, 0x4f, 0x63, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x69, 0x63,
+0x2e, 0x65, 0x6e, 0x65, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e,
+0x3b, 0x6d, 0x61, 0x79, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e,
+0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e,
+0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63,
+0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
+0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61,
+0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65,
+0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d,
+0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f,
+0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65,
+0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61,
+0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b,
+0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f,
+0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x2e, 0x3b,
+0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a,
+0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f,
+0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424,
+0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439,
+0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442,
+0x44f, 0x431, 0x440, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x3b, 0x414, 0x435, 0x43a,
+0x430, 0x431, 0x440, 0xb9c, 0xba9, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0xbb0, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbae, 0xbbe,
+0xbb0, 0xbcd, 0xb9a, 0xbcd, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0xbb0, 0xbb2, 0xbcd, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b,
+0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0xbb8, 0xbcd, 0xb9f, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0xb9f, 0xbae, 0xbcd, 0xbaa,
+0xbb0, 0xbcd, 0x3b, 0xb85, 0xb95, 0xbcd, 0xb9f, 0xbcb, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xba8, 0xbb5, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b,
+0xb9f, 0xbbf, 0xb9a, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0xb9c, 0xba9, 0x2e, 0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbbe,
+0xbb0, 0xbcd, 0x2e, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2,
+0xbc8, 0x3b, 0xb86, 0xb95, 0x2e, 0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xb85, 0xb95, 0xbcd, 0x2e, 0x3b, 0xba8, 0xbb5, 0x2e,
+0x3b, 0xb9f, 0xbbf, 0xb9a, 0x2e, 0xb9c, 0x3b, 0xbaa, 0xbbf, 0x3b, 0xbae, 0xbbe, 0x3b, 0xb8f, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2,
+0x3b, 0xb9c, 0xbc2, 0x3b, 0xb86, 0x3b, 0xb9a, 0xbc6, 0x3b, 0xb85, 0x3b, 0xba8, 0x3b, 0xb9f, 0xbbf, 0x433, 0x44b, 0x439, 0x43d, 0x432,
+0x430, 0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435,
+0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433,
+0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c,
+0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x433, 0x44b, 0x439, 0x43d, 0x2e,
+0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b,
+0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e,
+0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0xc1c, 0xc28, 0xc35, 0xc30,
+0xc3f, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d, 0xc30, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b, 0xc0f, 0xc2a,
+0xc4d, 0xc30, 0xc3f, 0xc32, 0xc4d, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc41, 0xc32, 0xc48, 0x3b, 0xc06,
+0xc17, 0xc38, 0xc4d, 0xc1f, 0xc41, 0x3b, 0xc38, 0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc05, 0xc15, 0xc4d,
+0xc1f, 0xc4b, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc28, 0xc35, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc3f, 0xc38, 0xc46, 0xc02, 0xc2c, 0xc30,
+0xc4d, 0xc1c, 0xc28, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d, 0xc30, 0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b, 0xc0f, 0xc2a, 0xc4d,
+0xc30, 0xc3f, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc41, 0xc32, 0xc48, 0x3b, 0xc06, 0xc17, 0x3b, 0xc38,
+0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0x3b, 0xc05, 0xc15, 0xc4d, 0xc1f, 0xc4b, 0x3b, 0xc28, 0xc35, 0xc02, 0x3b, 0xc21, 0xc3f, 0xc38,
+0xc46, 0xc02, 0xc1c, 0x3b, 0xc2b, 0xc3f, 0x3b, 0xc2e, 0xc3e, 0x3b, 0xc0f, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0x3b, 0xc1c, 0xc41,
+0x3b, 0xc06, 0x3b, 0xc38, 0xc46, 0x3b, 0xc05, 0x3b, 0xc28, 0x3b, 0xc21, 0xc3f, 0xe21, 0xe01, 0xe23, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01,
+0xe38, 0xe21, 0xe20, 0xe32, 0xe1e, 0xe31, 0xe19, 0xe18, 0xe4c, 0x3b, 0xe21, 0xe35, 0xe19, 0xe32, 0xe04, 0xe21, 0x3b, 0xe40, 0xe21, 0xe29,
+0xe32, 0xe22, 0xe19, 0x3b, 0xe1e, 0xe24, 0xe29, 0xe20, 0xe32, 0xe04, 0xe21, 0x3b, 0xe21, 0xe34, 0xe16, 0xe38, 0xe19, 0xe32, 0xe22, 0xe19,
+0x3b, 0xe01, 0xe23, 0xe01, 0xe0e, 0xe32, 0xe04, 0xe21, 0x3b, 0xe2a, 0xe34, 0xe07, 0xe2b, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe31, 0xe19,
+0xe22, 0xe32, 0xe22, 0xe19, 0x3b, 0xe15, 0xe38, 0xe25, 0xe32, 0xe04, 0xe21, 0x3b, 0xe1e, 0xe24, 0xe28, 0xe08, 0xe34, 0xe01, 0xe32, 0xe22,
+0xe19, 0x3b, 0xe18, 0xe31, 0xe19, 0xe27, 0xe32, 0xe04, 0xe21, 0xe21, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe1e, 0x2e, 0x3b, 0xe21,
+0xe35, 0x2e, 0xe04, 0x2e, 0x3b, 0xe40, 0xe21, 0x2e, 0xe22, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe34, 0x2e, 0xe22,
+0x2e, 0x3b, 0xe01, 0x2e, 0xe04, 0x2e, 0x3b, 0xe2a, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe22, 0x2e, 0x3b, 0xe15, 0x2e, 0xe04,
+0x2e, 0x3b, 0xe1e, 0x2e, 0xe22, 0x2e, 0x3b, 0xe18, 0x2e, 0xe04, 0x2e, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54,
+0xf7c, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56,
+0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b,
+0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xfb2, 0xf74,
+0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3,
+0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf42, 0xf74,
+0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56,
+0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45,
+0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54, 0xf7c, 0x3b,
+0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf66, 0xf74,
+0xf58, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
+0xf63, 0xf94, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b,
+0xf56, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b,
+0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45,
+0xf74, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0x3b,
+0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab,
+0x1272, 0x1275, 0x3b, 0x1218, 0x130b, 0x1262, 0x1275, 0x3b, 0x121a, 0x12eb, 0x12dd, 0x12eb, 0x3b, 0x130d, 0x1295, 0x1266, 0x1275, 0x3b, 0x1230, 0x1290,
+0x3b, 0x1213, 0x121d, 0x1208, 0x3b, 0x1290, 0x1213, 0x1230, 0x3b, 0x1218, 0x1235, 0x12a8, 0x1228, 0x121d, 0x3b, 0x1325, 0x1245, 0x121d, 0x1272, 0x3b,
+0x1215, 0x12f3, 0x122d, 0x3b, 0x1273, 0x1215, 0x1233, 0x1235, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x3b, 0x1218, 0x130b, 0x3b, 0x121a, 0x12eb, 0x3b,
+0x130d, 0x1295, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x3b, 0x1290, 0x1213, 0x3b, 0x1218, 0x1235, 0x3b, 0x1325, 0x1245, 0x3b, 0x1215, 0x12f3,
+0x3b, 0x1273, 0x1215, 0x1325, 0x3b, 0x1208, 0x3b, 0x1218, 0x3b, 0x121a, 0x3b, 0x130d, 0x3b, 0x1230, 0x3b, 0x1213, 0x3b, 0x1290, 0x3b, 0x1218,
+0x3b, 0x1325, 0x3b, 0x1215, 0x3b, 0x1273, 0x53, 0x101, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46, 0x113, 0x70, 0x75, 0x65, 0x6c,
+0x69, 0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x73, 0x69, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x6c, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x113,
+0x3b, 0x53, 0x75, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x6f, 0x73, 0x69,
+0x3b, 0x53, 0x65, 0x70, 0x69, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x4e,
+0x14d, 0x76, 0x65, 0x6d, 0x61, 0x3b, 0x54, 0x12b, 0x73, 0x65, 0x6d, 0x61, 0x53, 0x101, 0x6e, 0x3b, 0x46, 0x113, 0x70, 0x3b,
0x4d, 0x61, 0x2bb, 0x61, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x3b, 0x53, 0x69, 0x75,
0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x3b, 0x54,
-0x12b, 0x73, 0x3b, 0x53, 0x101, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46, 0x113, 0x70, 0x75, 0x65, 0x6c, 0x69, 0x3b, 0x4d,
-0x61, 0x2bb, 0x61, 0x73, 0x69, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x6c, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75,
-0x6e, 0x65, 0x3b, 0x53, 0x69, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x65,
-0x70, 0x69, 0x74, 0x65, 0x6d, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x65,
-0x6d, 0x61, 0x3b, 0x54, 0x12b, 0x73, 0x65, 0x6d, 0x61, 0x3b, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b,
-0x53, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4f, 0x63, 0x61, 0x3b, 0x15e, 0x75,
-0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4e, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x61, 0x7a, 0x3b, 0x54, 0x65,
-0x6d, 0x3b, 0x41, 0x11f, 0x75, 0x3b, 0x45, 0x79, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x41, 0x72,
-0x61, 0x3b, 0x4f, 0x63, 0x61, 0x6b, 0x3b, 0x15e, 0x75, 0x62, 0x61, 0x74, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x4e, 0x69,
-0x73, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x79, 0x131, 0x73, 0x3b, 0x48, 0x61, 0x7a, 0x69, 0x72, 0x61, 0x6e, 0x3b, 0x54, 0x65,
-0x6d, 0x6d, 0x75, 0x7a, 0x3b, 0x41, 0x11f, 0x75, 0x73, 0x74, 0x6f, 0x73, 0x3b, 0x45, 0x79, 0x6c, 0xfc, 0x6c, 0x3b, 0x45,
-0x6b, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x73, 0x131, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6c, 0x131, 0x6b, 0x3b, 0x4f, 0x3b, 0x15e,
-0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x45, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x41,
-0x3b, 0xdd, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x77, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0xfd,
+0x12b, 0x73, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x53, 0x3b,
+0x4f, 0x3b, 0x4e, 0x3b, 0x54, 0x4f, 0x63, 0x61, 0x6b, 0x3b, 0x15e, 0x75, 0x62, 0x61, 0x74, 0x3b, 0x4d, 0x61, 0x72, 0x74,
+0x3b, 0x4e, 0x69, 0x73, 0x61, 0x6e, 0x3b, 0x4d, 0x61, 0x79, 0x131, 0x73, 0x3b, 0x48, 0x61, 0x7a, 0x69, 0x72, 0x61, 0x6e,
+0x3b, 0x54, 0x65, 0x6d, 0x6d, 0x75, 0x7a, 0x3b, 0x41, 0x11f, 0x75, 0x73, 0x74, 0x6f, 0x73, 0x3b, 0x45, 0x79, 0x6c, 0xfc,
+0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x73, 0x131, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6c, 0x131, 0x6b, 0x4f,
+0x63, 0x61, 0x3b, 0x15e, 0x75, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4e, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48,
+0x61, 0x7a, 0x3b, 0x54, 0x65, 0x6d, 0x3b, 0x41, 0x11f, 0x75, 0x3b, 0x45, 0x79, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x3b, 0x4b,
+0x61, 0x73, 0x3b, 0x41, 0x72, 0x61, 0x4f, 0x3b, 0x15e, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b,
+0x41, 0x3b, 0x45, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x41, 0xdd, 0x61, 0x6e, 0x77, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x77, 0x72,
+0x61, 0x6c, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0xfd, 0x3b, 0x49, 0xfd,
+0x75, 0x6e, 0x3b, 0x49, 0xfd, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0xfd,
+0x61, 0x62, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x44,
+0x65, 0x6b, 0x61, 0x62, 0x72, 0xfd, 0x61, 0x6e, 0x77, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x77, 0x72, 0x61, 0x6c, 0x3b, 0x6d,
+0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0xfd, 0x3b, 0x69, 0xfd, 0x75, 0x6e, 0x3b, 0x69,
+0xfd, 0x75, 0x6c, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b,
+0x6f, 0x6b, 0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x6e, 0x6f, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61, 0x62,
+0x72, 0xdd, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x77, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0xfd,
0x3b, 0x49, 0xfd, 0x75, 0x6e, 0x3b, 0x49, 0xfd, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x67, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x4f,
-0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0xfd, 0x3b, 0x44, 0x65, 0x6b, 0x3b, 0xdd, 0x61, 0x6e, 0x77, 0x61, 0x72, 0x3b, 0x46, 0x65,
-0x77, 0x72, 0x61, 0x6c, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0xfd, 0x3b,
-0x49, 0xfd, 0x75, 0x6e, 0x3b, 0x49, 0xfd, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e,
-0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0xfd, 0x61, 0x62, 0x72,
-0x3b, 0x44, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x3b, 0xdd, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b,
-0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0xfd, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x77, 0x3b,
-0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0xfd, 0x3b, 0x69, 0xfd, 0x75, 0x6e, 0x3b, 0x69, 0xfd,
-0x75, 0x6c, 0x3b, 0x61, 0x77, 0x67, 0x3b, 0x73, 0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0xfd, 0x3b, 0x64,
-0x65, 0x6b, 0x3b, 0xfd, 0x61, 0x6e, 0x77, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x77, 0x72, 0x61, 0x6c, 0x3b, 0x6d, 0x61, 0x72,
-0x74, 0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0xfd, 0x3b, 0x69, 0xfd, 0x75, 0x6e, 0x3b, 0x69, 0xfd, 0x75,
-0x6c, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x6f, 0x6b,
-0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x6e, 0x6f, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x3b,
-0x64a, 0x627, 0x646, 0x6cb, 0x627, 0x631, 0x3b, 0x641, 0x6d0, 0x6cb, 0x631, 0x627, 0x644, 0x3b, 0x645, 0x627, 0x631, 0x62a, 0x3b, 0x626,
-0x627, 0x67e, 0x631, 0x6d0, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x626, 0x649, 0x64a, 0x6c7, 0x646, 0x3b, 0x626, 0x649, 0x64a, 0x6c7,
-0x644, 0x3b, 0x626, 0x627, 0x6cb, 0x63a, 0x6c7, 0x633, 0x62a, 0x3b, 0x633, 0x6d0, 0x646, 0x62a, 0x6d5, 0x628, 0x649, 0x631, 0x3b, 0x626,
-0x6c6, 0x643, 0x62a, 0x6d5, 0x628, 0x649, 0x631, 0x3b, 0x646, 0x648, 0x64a, 0x627, 0x628, 0x649, 0x631, 0x3b, 0x62f, 0x6d0, 0x643, 0x627,
-0x628, 0x649, 0x631, 0x3b, 0x441, 0x456, 0x447, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x431, 0x435, 0x440, 0x3b, 0x43a, 0x432, 0x456, 0x3b,
-0x442, 0x440, 0x430, 0x3b, 0x447, 0x435, 0x440, 0x3b, 0x43b, 0x438, 0x43f, 0x3b, 0x441, 0x435, 0x440, 0x3b, 0x432, 0x435, 0x440, 0x3b,
-0x436, 0x43e, 0x432, 0x3b, 0x43b, 0x438, 0x441, 0x3b, 0x433, 0x440, 0x443, 0x3b, 0x441, 0x456, 0x447, 0x435, 0x43d, 0x44c, 0x3b, 0x43b,
-0x44e, 0x442, 0x438, 0x439, 0x3b, 0x431, 0x435, 0x440, 0x435, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x435, 0x43d,
-0x44c, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x438,
-0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x432, 0x435, 0x440, 0x435, 0x441, 0x435, 0x43d,
-0x44c, 0x3b, 0x436, 0x43e, 0x432, 0x442, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x43e, 0x43f, 0x430, 0x434, 0x3b, 0x433,
-0x440, 0x443, 0x434, 0x435, 0x43d, 0x44c, 0x3b, 0x421, 0x3b, 0x41b, 0x3b, 0x411, 0x3b, 0x41a, 0x3b, 0x422, 0x3b, 0x427, 0x3b, 0x41b,
-0x3b, 0x421, 0x3b, 0x412, 0x3b, 0x416, 0x3b, 0x41b, 0x3b, 0x413, 0x3b, 0x441, 0x456, 0x447, 0x2e, 0x3b, 0x43b, 0x44e, 0x442, 0x2e,
-0x3b, 0x431, 0x435, 0x440, 0x2e, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x2e, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x2e, 0x3b, 0x447, 0x435,
-0x440, 0x432, 0x2e, 0x3b, 0x43b, 0x438, 0x43f, 0x2e, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x2e, 0x3b, 0x432, 0x435, 0x440, 0x2e, 0x3b,
-0x436, 0x43e, 0x432, 0x442, 0x2e, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x2e, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x2e, 0x3b, 0x441, 0x456,
-0x447, 0x43d, 0x44f, 0x3b, 0x43b, 0x44e, 0x442, 0x43e, 0x433, 0x43e, 0x3b, 0x431, 0x435, 0x440, 0x435, 0x437, 0x43d, 0x44f, 0x3b, 0x43a,
-0x432, 0x456, 0x442, 0x43d, 0x44f, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x43d, 0x44f, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x43d, 0x44f, 0x3b,
-0x43b, 0x438, 0x43f, 0x43d, 0x44f, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x43d, 0x44f, 0x3b, 0x432, 0x435, 0x440, 0x435, 0x441, 0x43d, 0x44f,
-0x3b, 0x436, 0x43e, 0x432, 0x442, 0x43d, 0x44f, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x43e, 0x43f, 0x430, 0x434, 0x430, 0x3b, 0x433, 0x440,
-0x443, 0x434, 0x43d, 0x44f, 0x3b, 0x441, 0x3b, 0x43b, 0x3b, 0x431, 0x3b, 0x43a, 0x3b, 0x442, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x441,
-0x3b, 0x432, 0x3b, 0x436, 0x3b, 0x43b, 0x3b, 0x433, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc,
-0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b,
-0x62c, 0x648, 0x644, 0x627, 0x626, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9,
-0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x59, 0x61, 0x6e,
-0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x49, 0x79, 0x6e,
-0x3b, 0x49, 0x79, 0x6c, 0x3b, 0x41, 0x76, 0x67, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x79,
-0x3b, 0x44, 0x65, 0x6b, 0x3b, 0x59, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b, 0x4d,
-0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x49, 0x79, 0x75, 0x6e, 0x3b, 0x49,
-0x79, 0x75, 0x6c, 0x3b, 0x41, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x4f,
-0x6b, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x44, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x3b,
-0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b,
-0x4e, 0x3b, 0x44, 0x3b, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b,
-0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x6e, 0x3b, 0x69, 0x79, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65, 0x6e, 0x3b,
-0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x79, 0x3b, 0x64, 0x65, 0x6b, 0x3b, 0x79, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x66,
-0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0x79,
-0x3b, 0x69, 0x79, 0x75, 0x6e, 0x3b, 0x69, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65,
-0x6e, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x6e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b,
-0x64, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x3b, 0x62c, 0x646, 0x648, 0x3b, 0x641, 0x628, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x3b, 0x627,
-0x67e, 0x631, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x3b, 0x627, 0x6af, 0x633, 0x3b, 0x633, 0x67e,
-0x62a, 0x3b, 0x627, 0x6a9, 0x62a, 0x3b, 0x646, 0x648, 0x645, 0x3b, 0x62f, 0x633, 0x645, 0x3b, 0x44f, 0x43d, 0x432, 0x3b, 0x444, 0x435,
-0x432, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x3b, 0x438, 0x44e,
-0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43d, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x44f, 0x3b, 0x434, 0x435,
-0x43a, 0x3b, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b,
-0x430, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x3b, 0x438, 0x44e, 0x43b, 0x3b, 0x430, 0x432,
-0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x3b,
-0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x31, 0x3b, 0x54,
-0x68, 0x67, 0x20, 0x32, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x33, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x34, 0x3b, 0x54, 0x68, 0x67,
-0x20, 0x35, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x36, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x37, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x38,
-0x3b, 0x54, 0x68, 0x67, 0x20, 0x39, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x31, 0x31,
-0x3b, 0x54, 0x68, 0x67, 0x20, 0x31, 0x32, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x3b, 0x54, 0x68, 0xe1, 0x6e,
-0x67, 0x20, 0x32, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x33, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x34, 0x3b,
-0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x35, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x36, 0x3b, 0x54, 0x68, 0xe1, 0x6e,
-0x67, 0x20, 0x37, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x38, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x39, 0x3b,
-0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x54, 0x68,
-0xe1, 0x6e, 0x67, 0x20, 0x31, 0x32, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x32, 0x3b, 0x74,
-0x68, 0x67, 0x20, 0x33, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x34, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x35, 0x3b, 0x74, 0x68, 0x67,
-0x20, 0x36, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x37, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x39,
-0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31,
-0x32, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x32, 0x3b, 0x74, 0x68,
-0xe1, 0x6e, 0x67, 0x20, 0x33, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x34, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20,
-0x35, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x36, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x37, 0x3b, 0x74, 0x68,
-0xe1, 0x6e, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x39, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20,
-0x31, 0x30, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x32,
-0x3b, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0xe4, 0x7a, 0x3b, 0x70, 0x72, 0x6c, 0x3b, 0x6d, 0x61, 0x79,
-0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x67, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x74, 0x6f, 0x62,
-0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x6b, 0x3b, 0x79, 0x61, 0x6e, 0x75, 0x6c, 0x3b, 0x66, 0x65, 0x62, 0x75, 0x6c,
-0x3b, 0x6d, 0xe4, 0x7a, 0x75, 0x6c, 0x3b, 0x70, 0x72, 0x69, 0x6c, 0x75, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x75, 0x6c, 0x3b,
-0x79, 0x75, 0x6e, 0x75, 0x6c, 0x3b, 0x79, 0x75, 0x6c, 0x75, 0x6c, 0x3b, 0x67, 0x75, 0x73, 0x74, 0x75, 0x6c, 0x3b, 0x73,
-0x65, 0x74, 0x75, 0x6c, 0x3b, 0x74, 0x6f, 0x62, 0x75, 0x6c, 0x3b, 0x6e, 0x6f, 0x76, 0x75, 0x6c, 0x3b, 0x64, 0x65, 0x6b,
-0x75, 0x6c, 0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x47, 0x3b, 0x53,
-0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0xe4, 0x7a, 0x3b, 0x70,
-0x72, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x67, 0x73, 0x74, 0x3b, 0x73,
-0x65, 0x74, 0x3b, 0x74, 0x6f, 0x6e, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x6b, 0x3b, 0x49, 0x6f, 0x6e, 0x3b, 0x43,
-0x68, 0x77, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x47,
-0x6f, 0x72, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x3b, 0x54, 0x61, 0x63,
-0x68, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x3b, 0x49, 0x6f, 0x6e, 0x61, 0x77, 0x72, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x72,
-0x6f, 0x72, 0x3b, 0x4d, 0x61, 0x77, 0x72, 0x74, 0x68, 0x3b, 0x45, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x4d, 0x61, 0x69,
-0x3b, 0x4d, 0x65, 0x68, 0x65, 0x66, 0x69, 0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x65, 0x6e, 0x6e, 0x61, 0x66, 0x3b,
-0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x72, 0x65, 0x66, 0x3b, 0x54, 0x61, 0x63,
-0x68, 0x77, 0x65, 0x64, 0x64, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x66, 0x79, 0x72, 0x3b, 0x49, 0x3b, 0x43, 0x68, 0x3b, 0x4d,
-0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x52, 0x68, 0x3b,
-0x49, 0x6f, 0x6e, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x61,
-0x69, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64,
-0x69, 0x3b, 0x48, 0x79, 0x64, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x3b,
-0x46, 0x65, 0x77, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x53, 0x75, 0x77, 0x3b,
-0x53, 0x75, 0x6c, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0xe0, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x77, 0x3b, 0x44,
-0x65, 0x73, 0x3b, 0x53, 0x61, 0x6d, 0x77, 0x69, 0x79, 0x65, 0x65, 0x3b, 0x46, 0x65, 0x77, 0x72, 0x69, 0x79, 0x65, 0x65,
-0x3b, 0x4d, 0x61, 0x72, 0x73, 0x3b, 0x41, 0x77, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x53, 0x75, 0x77, 0x65,
-0x3b, 0x53, 0x75, 0x6c, 0x65, 0x74, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0xe0, 0x74, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x72, 0x3b,
-0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x77, 0xe0, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x65,
-0x73, 0xe0, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x45,
-0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53,
-0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x79, 0x75,
-0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x74, 0x73, 0x68,
-0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
-0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
-0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69,
-0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x5d9, 0x5d0, 0x5b7, 0x5e0, 0x3b, 0x5e4, 0x5bf, 0x5e2, 0x5d1, 0x3b, 0x5de, 0x5e2, 0x5e8, 0x5e5,
-0x3b, 0x5d0, 0x5b7, 0x5e4, 0x5bc, 0x5e8, 0x3b, 0x5de, 0x5d9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9,
-0x3b, 0x5d0, 0x5d5, 0x5d9, 0x5d2, 0x3b, 0x5e1, 0x5e2, 0x5e4, 0x5bc, 0x3b, 0x5d0, 0x5e7, 0x5d8, 0x3b, 0x5e0, 0x5d0, 0x5d5, 0x5d5, 0x3b,
-0x5d3, 0x5e2, 0x5e6, 0x3b, 0x5d9, 0x5d0, 0x5b7, 0x5e0, 0x5d5, 0x5d0, 0x5b7, 0x5e8, 0x3b, 0x5e4, 0x5bf, 0x5e2, 0x5d1, 0x5e8, 0x5d5, 0x5d0,
-0x5b7, 0x5e8, 0x3b, 0x5de, 0x5e2, 0x5e8, 0x5e5, 0x3b, 0x5d0, 0x5b7, 0x5e4, 0x5bc, 0x5e8, 0x5d9, 0x5dc, 0x3b, 0x5de, 0x5d9, 0x5d9, 0x3b,
-0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d9, 0x5d2, 0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e2,
-0x5e4, 0x5bc, 0x5d8, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x5d0, 0x5e7, 0x5d8, 0x5d0, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x5e0, 0x5d0, 0x5d5,
-0x5d5, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x5d3, 0x5e2, 0x5e6, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x1e62, 0x1eb9, 0x301, 0x3b,
-0xc8, 0x72, 0x3b, 0x1eb8, 0x72, 0x3b, 0xcc, 0x67, 0x3b, 0x1eb8, 0x300, 0x62, 0x3b, 0xd2, 0x6b, 0x3b, 0x41, 0x67, 0x3b, 0xd2,
-0x67, 0x3b, 0x4f, 0x77, 0x3b, 0x1ecc, 0x300, 0x77, 0x3b, 0x42, 0xe9, 0x3b, 0x1ecc, 0x300, 0x70, 0x3b, 0x1e62, 0x1eb9, 0x301, 0x72,
-0x1eb9, 0x301, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9,
-0x3b, 0x1eb8, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b,
-0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9,
-0x6c, 0xfa, 0x3b, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x3b, 0x53, 0x3b, 0xc8, 0x3b, 0x1eb8, 0x3b, 0xcc, 0x3b, 0x1eb8, 0x300, 0x3b,
-0xd2, 0x3b, 0x41, 0x3b, 0xd2, 0x3b, 0x4f, 0x3b, 0x1ecc, 0x300, 0x3b, 0x42, 0x3b, 0x1ecc, 0x300, 0x3b, 0x1e62, 0x1eb9, 0x301, 0x72,
+0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0xfd, 0x3b, 0x44, 0x65, 0x6b, 0xfd, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x77, 0x3b, 0x6d, 0x61,
+0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0xfd, 0x3b, 0x69, 0xfd, 0x75, 0x6e, 0x3b, 0x69, 0xfd, 0x75, 0x6c,
+0x3b, 0x61, 0x77, 0x67, 0x3b, 0x73, 0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0xfd, 0x3b, 0x64, 0x65, 0x6b,
+0xdd, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b,
+0x4e, 0x3b, 0x44, 0x64a, 0x627, 0x646, 0x6cb, 0x627, 0x631, 0x3b, 0x641, 0x6d0, 0x6cb, 0x631, 0x627, 0x644, 0x3b, 0x645, 0x627, 0x631,
+0x62a, 0x3b, 0x626, 0x627, 0x67e, 0x631, 0x6d0, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x626, 0x649, 0x64a, 0x6c7, 0x646, 0x3b, 0x626,
+0x649, 0x64a, 0x6c7, 0x644, 0x3b, 0x626, 0x627, 0x6cb, 0x63a, 0x6c7, 0x633, 0x62a, 0x3b, 0x633, 0x6d0, 0x646, 0x62a, 0x6d5, 0x628, 0x649,
+0x631, 0x3b, 0x626, 0x6c6, 0x643, 0x62a, 0x6d5, 0x628, 0x649, 0x631, 0x3b, 0x646, 0x648, 0x64a, 0x627, 0x628, 0x649, 0x631, 0x3b, 0x62f,
+0x6d0, 0x643, 0x627, 0x628, 0x649, 0x631, 0x441, 0x456, 0x447, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x438, 0x439, 0x3b, 0x431,
+0x435, 0x440, 0x435, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x435, 0x43d, 0x44c, 0x3b, 0x442, 0x440, 0x430, 0x432,
+0x435, 0x43d, 0x44c, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x438, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x441,
+0x435, 0x440, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x432, 0x435, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x436, 0x43e, 0x432, 0x442,
+0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x43e, 0x43f, 0x430, 0x434, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x435, 0x43d, 0x44c,
+0x441, 0x456, 0x447, 0x43d, 0x44f, 0x3b, 0x43b, 0x44e, 0x442, 0x43e, 0x433, 0x43e, 0x3b, 0x431, 0x435, 0x440, 0x435, 0x437, 0x43d, 0x44f,
+0x3b, 0x43a, 0x432, 0x456, 0x442, 0x43d, 0x44f, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x43d, 0x44f, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x43d,
+0x44f, 0x3b, 0x43b, 0x438, 0x43f, 0x43d, 0x44f, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x43d, 0x44f, 0x3b, 0x432, 0x435, 0x440, 0x435, 0x441,
+0x43d, 0x44f, 0x3b, 0x436, 0x43e, 0x432, 0x442, 0x43d, 0x44f, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x43e, 0x43f, 0x430, 0x434, 0x430, 0x3b,
+0x433, 0x440, 0x443, 0x434, 0x43d, 0x44f, 0x441, 0x456, 0x447, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x431, 0x435, 0x440, 0x3b, 0x43a, 0x432,
+0x456, 0x3b, 0x442, 0x440, 0x430, 0x3b, 0x447, 0x435, 0x440, 0x3b, 0x43b, 0x438, 0x43f, 0x3b, 0x441, 0x435, 0x440, 0x3b, 0x432, 0x435,
+0x440, 0x3b, 0x436, 0x43e, 0x432, 0x3b, 0x43b, 0x438, 0x441, 0x3b, 0x433, 0x440, 0x443, 0x441, 0x456, 0x447, 0x2e, 0x3b, 0x43b, 0x44e,
+0x442, 0x2e, 0x3b, 0x431, 0x435, 0x440, 0x2e, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x2e, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x2e, 0x3b,
+0x447, 0x435, 0x440, 0x432, 0x2e, 0x3b, 0x43b, 0x438, 0x43f, 0x2e, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x2e, 0x3b, 0x432, 0x435, 0x440,
+0x2e, 0x3b, 0x436, 0x43e, 0x432, 0x442, 0x2e, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x2e, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x2e, 0x421,
+0x3b, 0x41b, 0x3b, 0x411, 0x3b, 0x41a, 0x3b, 0x422, 0x3b, 0x427, 0x3b, 0x41b, 0x3b, 0x421, 0x3b, 0x412, 0x3b, 0x416, 0x3b, 0x41b,
+0x3b, 0x413, 0x441, 0x3b, 0x43b, 0x3b, 0x431, 0x3b, 0x43a, 0x3b, 0x442, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x432, 0x3b,
+0x436, 0x3b, 0x43b, 0x3b, 0x433, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631,
+0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627,
+0x626, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631,
+0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x59, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x46,
+0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x79,
+0x3b, 0x49, 0x79, 0x75, 0x6e, 0x3b, 0x49, 0x79, 0x75, 0x6c, 0x3b, 0x41, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65,
+0x6e, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b,
+0x44, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x79, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b,
+0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x75, 0x6e, 0x3b,
+0x69, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x62, 0x72, 0x3b,
+0x6f, 0x6b, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x6e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61, 0x62, 0x72,
+0x59, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
+0x49, 0x79, 0x6e, 0x3b, 0x49, 0x79, 0x6c, 0x3b, 0x41, 0x76, 0x67, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x4f, 0x6b, 0x74, 0x3b,
+0x4e, 0x6f, 0x79, 0x3b, 0x44, 0x65, 0x6b, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61,
+0x70, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x6e, 0x3b, 0x69, 0x79, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73,
+0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x79, 0x3b, 0x64, 0x65, 0x6b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
+0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x62c, 0x646, 0x648,
+0x3b, 0x641, 0x628, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x3b, 0x627, 0x67e, 0x631, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b,
+0x62c, 0x648, 0x644, 0x3b, 0x627, 0x6af, 0x633, 0x3b, 0x633, 0x67e, 0x62a, 0x3b, 0x627, 0x6a9, 0x62a, 0x3b, 0x646, 0x648, 0x645, 0x3b,
+0x62f, 0x633, 0x645, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x43c, 0x430, 0x440, 0x442,
+0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x3b, 0x438, 0x44e, 0x43b, 0x3b, 0x430,
+0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440,
+0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44f, 0x43d, 0x432, 0x3b, 0x444, 0x435, 0x432,
+0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x3b, 0x438, 0x44e, 0x43b,
+0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43d, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x44f, 0x3b, 0x434, 0x435, 0x43a,
+0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x32, 0x3b, 0x54, 0x68, 0xe1, 0x6e,
+0x67, 0x20, 0x33, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x34, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x35, 0x3b,
+0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x36, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x37, 0x3b, 0x54, 0x68, 0xe1, 0x6e,
+0x67, 0x20, 0x38, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x39, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x30,
+0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x32, 0x74, 0x68,
+0xe1, 0x6e, 0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x32, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20,
+0x33, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x34, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x35, 0x3b, 0x74, 0x68,
+0xe1, 0x6e, 0x67, 0x20, 0x36, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x37, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20,
+0x38, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x39, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x74,
+0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x32, 0x54, 0x68, 0x67, 0x20,
+0x31, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x32, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x33, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x34, 0x3b,
+0x54, 0x68, 0x67, 0x20, 0x35, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x36, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x37, 0x3b, 0x54, 0x68,
+0x67, 0x20, 0x38, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x39, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x54, 0x68, 0x67,
+0x20, 0x31, 0x31, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x31, 0x32, 0x74, 0x68, 0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20,
+0x32, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x33, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x34, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x35, 0x3b,
+0x74, 0x68, 0x67, 0x20, 0x36, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x37, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68,
+0x67, 0x20, 0x39, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68,
+0x67, 0x20, 0x31, 0x32, 0x79, 0x61, 0x6e, 0x75, 0x6c, 0x3b, 0x66, 0x65, 0x62, 0x75, 0x6c, 0x3b, 0x6d, 0xe4, 0x7a, 0x75,
+0x6c, 0x3b, 0x70, 0x72, 0x69, 0x6c, 0x75, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x75, 0x6c, 0x3b, 0x79, 0x75, 0x6e, 0x75, 0x6c,
+0x3b, 0x79, 0x75, 0x6c, 0x75, 0x6c, 0x3b, 0x67, 0x75, 0x73, 0x74, 0x75, 0x6c, 0x3b, 0x73, 0x65, 0x74, 0x75, 0x6c, 0x3b,
+0x74, 0x6f, 0x62, 0x75, 0x6c, 0x3b, 0x6e, 0x6f, 0x76, 0x75, 0x6c, 0x3b, 0x64, 0x65, 0x6b, 0x75, 0x6c, 0x79, 0x61, 0x6e,
+0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0xe4, 0x7a, 0x3b, 0x70, 0x72, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e,
+0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x67, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x74, 0x6f, 0x62, 0x3b, 0x6e, 0x6f, 0x76,
+0x3b, 0x64, 0x65, 0x6b, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0xe4, 0x7a, 0x3b, 0x70, 0x72, 0x6c, 0x3b,
+0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x67, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x3b,
+0x74, 0x6f, 0x6e, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x6b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x4d,
+0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x44, 0x49, 0x6f, 0x6e, 0x61, 0x77, 0x72,
+0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x72, 0x6f, 0x72, 0x3b, 0x4d, 0x61, 0x77, 0x72, 0x74, 0x68, 0x3b, 0x45, 0x62, 0x72,
+0x69, 0x6c, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x65, 0x66, 0x69, 0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x66,
+0x66, 0x65, 0x6e, 0x6e, 0x61, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64,
+0x72, 0x65, 0x66, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x77, 0x65, 0x64, 0x64, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x66, 0x79, 0x72,
+0x49, 0x6f, 0x6e, 0x3b, 0x43, 0x68, 0x77, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b,
+0x4d, 0x65, 0x68, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79,
+0x64, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x49, 0x6f, 0x6e, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66,
+0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x47, 0x6f, 0x72,
+0x66, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x3b, 0x54, 0x61, 0x63,
+0x68, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x49, 0x3b, 0x43, 0x68, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47,
+0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x52, 0x68, 0x53, 0x61, 0x6d, 0x77, 0x69, 0x79, 0x65, 0x65, 0x3b,
+0x46, 0x65, 0x77, 0x72, 0x69, 0x79, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x3b, 0x41, 0x77, 0x72, 0x69, 0x6c, 0x3b,
+0x4d, 0x65, 0x65, 0x3b, 0x53, 0x75, 0x77, 0x65, 0x3b, 0x53, 0x75, 0x6c, 0x65, 0x74, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0xe0,
+0x74, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x77,
+0xe0, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x73, 0xe0, 0x6d, 0x62, 0x61, 0x72, 0x53, 0x61, 0x6d, 0x3b, 0x46, 0x65,
+0x77, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x53, 0x75, 0x77, 0x3b, 0x53, 0x75,
+0x6c, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0xe0, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x77, 0x3b, 0x44, 0x65, 0x73,
+0x4a, 0x61, 0x6e, 0x79, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b,
+0x4d, 0x61, 0x74, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a,
+0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65,
+0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d,
+0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61,
+0x74, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67,
+0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x5d9, 0x5d0, 0x5b7,
+0x5e0, 0x5d5, 0x5d0, 0x5b7, 0x5e8, 0x3b, 0x5e4, 0x5bf, 0x5e2, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5b7, 0x5e8, 0x3b, 0x5de, 0x5e2, 0x5e8, 0x5e5,
+0x3b, 0x5d0, 0x5b7, 0x5e4, 0x5bc, 0x5e8, 0x5d9, 0x5dc, 0x3b, 0x5de, 0x5d9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5,
+0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d9, 0x5d2, 0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e2, 0x5e4, 0x5bc, 0x5d8, 0x5e2, 0x5de, 0x5d1, 0x5e2,
+0x5e8, 0x3b, 0x5d0, 0x5e7, 0x5d8, 0x5d0, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x5e0, 0x5d0, 0x5d5, 0x5d5, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x3b,
+0x5d3, 0x5e2, 0x5e6, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x5d9, 0x5d0, 0x5b7, 0x5e0, 0x3b, 0x5e4, 0x5bf, 0x5e2, 0x5d1, 0x3b, 0x5de, 0x5e2,
+0x5e8, 0x5e5, 0x3b, 0x5d0, 0x5b7, 0x5e4, 0x5bc, 0x5e8, 0x3b, 0x5de, 0x5d9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5,
+0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d9, 0x5d2, 0x3b, 0x5e1, 0x5e2, 0x5e4, 0x5bc, 0x3b, 0x5d0, 0x5e7, 0x5d8, 0x3b, 0x5e0, 0x5d0, 0x5d5,
+0x5d5, 0x3b, 0x5d3, 0x5e2, 0x5e6, 0x1e62, 0x1eb9, 0x301, 0x72, 0x1eb9, 0x301, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x1eb8, 0x72,
+0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x1eb8, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa,
+0x64, 0x75, 0x3b, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b,
+0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x4f, 0x1e63, 0xf9,
+0x20, 0x1e62, 0x1eb9, 0x301, 0x72, 0x1eb9, 0x301, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x1e63,
+0xf9, 0x20, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x1e63,
+0xf9, 0x20, 0x1eb8, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f,
+0x1e63, 0xf9, 0x20, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x1e63,
+0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x4f,
+0x1e63, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x1e62, 0x1eb9, 0x301,
+0x3b, 0xc8, 0x72, 0x3b, 0x1eb8, 0x72, 0x3b, 0xcc, 0x67, 0x3b, 0x1eb8, 0x300, 0x62, 0x3b, 0xd2, 0x6b, 0x3b, 0x41, 0x67, 0x3b,
+0xd2, 0x67, 0x3b, 0x4f, 0x77, 0x3b, 0x1ecc, 0x300, 0x77, 0x3b, 0x42, 0xe9, 0x3b, 0x1ecc, 0x300, 0x70, 0x1e62, 0x1eb9, 0x301, 0x72,
0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0x3b, 0xcc, 0x67, 0x62, 0x3b, 0x1eb8, 0x300, 0x62, 0x69,
0x3b, 0xd2, 0x6b, 0xfa, 0x3b, 0x41, 0x67, 0x1eb9, 0x3b, 0xd2, 0x67, 0xfa, 0x3b, 0x4f, 0x77, 0x65, 0x3b, 0x1ecc, 0x300, 0x77,
-0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0x3b, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1e62, 0x1eb9, 0x301, 0x72, 0x1eb9,
-0x301, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1eb8, 0x72, 0x1eb9, 0x300,
-0x6e, 0xe0, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1eb8, 0x300, 0x62, 0x69,
-0x62, 0x69, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x41, 0x67, 0x1eb9,
-0x6d, 0x1ecd, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77,
-0x65, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x42, 0xe9, 0x6c,
-0xfa, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x3b, 0x53, 0x68, 0x25b, 0x301, 0x3b, 0xc8, 0x72, 0x3b,
-0x190, 0x72, 0x3b, 0xcc, 0x67, 0x3b, 0x190, 0x300, 0x62, 0x3b, 0xd2, 0x6b, 0x3b, 0x41, 0x67, 0x3b, 0xd2, 0x67, 0x3b, 0x4f,
-0x77, 0x3b, 0x186, 0x300, 0x77, 0x3b, 0x42, 0xe9, 0x3b, 0x186, 0x300, 0x70, 0x3b, 0x53, 0x68, 0x25b, 0x301, 0x72, 0x25b, 0x301,
-0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x190, 0x72, 0x25b, 0x300, 0x6e, 0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x190,
-0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x25b, 0x6d, 0x254, 0x3b, 0xd2, 0x67,
-0xfa, 0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x186, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0xfa,
-0x3b, 0x186, 0x300, 0x70, 0x25b, 0x300, 0x3b, 0x53, 0x3b, 0xc8, 0x3b, 0x190, 0x3b, 0xcc, 0x3b, 0x190, 0x300, 0x3b, 0xd2, 0x3b,
-0x41, 0x3b, 0xd2, 0x3b, 0x4f, 0x3b, 0x186, 0x300, 0x3b, 0x42, 0x3b, 0x186, 0x300, 0x3b, 0x53, 0x68, 0x25b, 0x301, 0x72, 0x3b,
-0xc8, 0x72, 0xe8, 0x6c, 0x3b, 0x190, 0x72, 0x25b, 0x300, 0x6e, 0x3b, 0xcc, 0x67, 0x62, 0x3b, 0x190, 0x300, 0x62, 0x69, 0x3b,
-0xd2, 0x6b, 0xfa, 0x3b, 0x41, 0x67, 0x25b, 0x3b, 0xd2, 0x67, 0xfa, 0x3b, 0x4f, 0x77, 0x65, 0x3b, 0x186, 0x300, 0x77, 0xe0,
-0x3b, 0x42, 0xe9, 0x6c, 0x3b, 0x186, 0x300, 0x70, 0x25b, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x53, 0x68, 0x25b, 0x301, 0x72,
-0x25b, 0x301, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x190,
-0x72, 0x25b, 0x300, 0x6e, 0xe0, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x73, 0x68, 0xf9,
-0x20, 0x190, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f,
-0x73, 0x68, 0xf9, 0x20, 0x41, 0x67, 0x25b, 0x6d, 0x254, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xd2, 0x67, 0xfa, 0x6e, 0x3b,
-0x4f, 0x73, 0x68, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x186, 0x300, 0x77, 0xe0,
-0x72, 0xe0, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x186, 0x300,
-0x70, 0x25b, 0x300, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x45, 0x70, 0x68, 0x3b,
-0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b,
-0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x77, 0x61, 0x72, 0x69,
-0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x68,
-0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79,
-0x69, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f,
-0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d,
-0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53,
-0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72,
-0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69,
-0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e,
-0x3b, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70,
-0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65,
-0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b,
-0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74,
-0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x6e,
-0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x458, 0x430, 0x43d,
-0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d,
-0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x443, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432,
-0x3b, 0x434, 0x435, 0x446, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x431, 0x440, 0x443, 0x430, 0x440, 0x3b,
-0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x438, 0x3b,
-0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x443, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x431, 0x430,
-0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434,
-0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x4a, 0x2d, 0x67, 0x75, 0x65, 0x72, 0x3b, 0x54, 0x2d, 0x61, 0x72, 0x72,
-0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76, 0x72, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61,
-0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x2d, 0x73, 0x6f, 0x75, 0x72,
-0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69,
-0x72, 0x3b, 0x4a, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d, 0x2d, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b,
-0x4d, 0x2d, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x67, 0x65, 0x75,
-0x72, 0x65, 0x65, 0x3b, 0x54, 0x6f, 0x73, 0x68, 0x69, 0x61, 0x67, 0x68, 0x74, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b,
-0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76, 0x65, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79,
-0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79,
-0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x65,
-0x61, 0x6e, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x66, 0x6f, 0x75,
-0x79, 0x69, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x6e,
-0x79, 0x20, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b, 0x3b, 0x47, 0x65, 0x6e, 0x3b, 0x48, 0x77, 0x65, 0x3b, 0x4d, 0x65,
-0x75, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x3b, 0x4d, 0x65, 0x74, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x45, 0x73, 0x74,
-0x3b, 0x47, 0x77, 0x6e, 0x3b, 0x48, 0x65, 0x64, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x65, 0x76, 0x3b, 0x6d, 0x69, 0x73, 0x20,
-0x47, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x48, 0x77, 0x65, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x6d,
-0x69, 0x73, 0x20, 0x4d, 0x65, 0x75, 0x72, 0x74, 0x68, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x45, 0x62, 0x72, 0x65, 0x6c, 0x3b,
-0x6d, 0x69, 0x73, 0x20, 0x4d, 0x65, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4d, 0x65, 0x74, 0x68, 0x65, 0x76, 0x65, 0x6e, 0x3b,
-0x6d, 0x69, 0x73, 0x20, 0x47, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x45, 0x73,
-0x74, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x47, 0x77, 0x79, 0x6e, 0x6e, 0x67, 0x61, 0x6c, 0x61, 0x3b, 0x6d, 0x69, 0x73, 0x20,
-0x48, 0x65, 0x64, 0x72, 0x61, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x44, 0x75, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4b, 0x65, 0x76,
-0x61, 0x72, 0x64, 0x68, 0x75, 0x3b, 0x53, 0x2d, 0x186, 0x3b, 0x4b, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x186, 0x3b, 0x45, 0x2d,
-0x4f, 0x3b, 0x45, 0x2d, 0x4b, 0x3b, 0x4f, 0x2d, 0x41, 0x3b, 0x41, 0x2d, 0x4b, 0x3b, 0x44, 0x2d, 0x186, 0x3b, 0x46, 0x2d,
-0x190, 0x3b, 0x186, 0x2d, 0x41, 0x3b, 0x186, 0x2d, 0x4f, 0x3b, 0x4d, 0x2d, 0x186, 0x3b, 0x53, 0x61, 0x6e, 0x64, 0x61, 0x2d,
-0x186, 0x70, 0x25b, 0x70, 0x254, 0x6e, 0x3b, 0x4b, 0x77, 0x61, 0x6b, 0x77, 0x61, 0x72, 0x2d, 0x186, 0x67, 0x79, 0x65, 0x66,
-0x75, 0x6f, 0x3b, 0x45, 0x62, 0x254, 0x77, 0x2d, 0x186, 0x62, 0x65, 0x6e, 0x65, 0x6d, 0x3b, 0x45, 0x62, 0x254, 0x62, 0x69,
-0x72, 0x61, 0x2d, 0x4f, 0x66, 0x6f, 0x72, 0x69, 0x73, 0x75, 0x6f, 0x3b, 0x45, 0x73, 0x75, 0x73, 0x6f, 0x77, 0x20, 0x41,
-0x6b, 0x65, 0x74, 0x73, 0x65, 0x61, 0x62, 0x61, 0x2d, 0x4b, 0x254, 0x74, 0x254, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x4f,
-0x62, 0x69, 0x72, 0x61, 0x64, 0x65, 0x2d, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x6d, 0x75, 0x6d, 0x75, 0x3b, 0x41,
-0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x2d, 0x4b, 0x69, 0x74, 0x61, 0x77, 0x6f, 0x6e, 0x73, 0x61, 0x3b, 0x44, 0x69, 0x66,
-0x75, 0x75, 0x2d, 0x186, 0x73, 0x61, 0x6e, 0x64, 0x61, 0x61, 0x3b, 0x46, 0x61, 0x6e, 0x6b, 0x77, 0x61, 0x2d, 0x190, 0x62,
-0x254, 0x3b, 0x186, 0x62, 0x25b, 0x73, 0x25b, 0x2d, 0x41, 0x68, 0x69, 0x6e, 0x69, 0x6d, 0x65, 0x3b, 0x186, 0x62, 0x65, 0x72,
-0x25b, 0x66, 0x25b, 0x77, 0x2d, 0x4f, 0x62, 0x75, 0x62, 0x75, 0x6f, 0x3b, 0x4d, 0x75, 0x6d, 0x75, 0x2d, 0x186, 0x70, 0x25b,
-0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930,
-0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e,
-0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x92f, 0x3b, 0x906, 0x917, 0x94b, 0x938, 0x94d, 0x924, 0x3b, 0x938,
-0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d,
-0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x4a, 0x65, 0x6e, 0x3b, 0x46, 0x65,
-0x62, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75,
-0x6c, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x1ecc, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69,
-0x73, 0x3b, 0x4a, 0x65, 0x6e, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb,
-0x3b, 0x4d, 0x61, 0x61, 0x63, 0x68, 0x1ecb, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x65, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a,
-0x75, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x1ecb, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x1ecd, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70,
-0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x1ecc, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61,
-0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a,
-0x3b, 0x4a, 0x3b, 0x1ecc, 0x3b, 0x53, 0x3b, 0x1ecc, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x65, 0x6c,
-0x3b, 0x4b, 0x74, 0x169, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x74, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f, 0x6f,
-0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x4b, 0x6e, 0x64, 0x3b, 0x128, 0x6b, 0x75, 0x3b, 0x128, 0x6b, 0x6d, 0x3b, 0x128, 0x6b, 0x6c,
-0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74,
-0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20,
-0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x68,
-0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x75, 0x6f, 0x6e,
-0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6e, 0x79, 0x61, 0x61, 0x6e, 0x79, 0x61, 0x3b, 0x4d,
-0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69,
-0x20, 0x6e, 0x61, 0x20, 0x129, 0x6d, 0x77, 0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75,
-0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6c, 0x129, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b,
-0x54, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x128, 0x3b, 0x128, 0x3b, 0x128, 0x3b, 0x5a, 0x65, 0x6e, 0x3b, 0x46, 0x65,
-0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x76, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x3b, 0x4c, 0x75,
-0x69, 0x3b, 0x41, 0x76, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69,
-0x63, 0x3b, 0x5a, 0x65, 0x6e, 0xe2, 0x72, 0x3b, 0x46, 0x65, 0x76, 0x72, 0xe2, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0xe7, 0x3b,
-0x41, 0x76, 0x72, 0xee, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x6e, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41,
-0x76, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x61, 0x72,
-0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x5a,
-0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e,
-0x3b, 0x44, 0x3b, 0x64, 0x7a, 0x76, 0x3b, 0x64, 0x7a, 0x64, 0x3b, 0x74, 0x65, 0x64, 0x3b, 0x61, 0x66, 0x254, 0x3b, 0x64,
-0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73, 0x69, 0x61, 0x3b, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x6e, 0x79, 0x3b, 0x6b,
-0x65, 0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x7a, 0x6d, 0x3b, 0x64, 0x7a, 0x6f, 0x76, 0x65, 0x3b, 0x64, 0x7a, 0x6f,
-0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65, 0x64, 0x6f, 0x78, 0x65, 0x3b, 0x61, 0x66, 0x254, 0x66, 0x129, 0x65, 0x3b, 0x64, 0x61,
-0x6d, 0x61, 0x3b, 0x6d, 0x61, 0x73, 0x61, 0x3b, 0x73, 0x69, 0x61, 0x6d, 0x6c, 0x254, 0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73,
-0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e, 0x79, 0x254, 0x3b, 0x6b, 0x65, 0x6c, 0x65, 0x3b,
-0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x6d, 0x65, 0x3b, 0x64, 0x3b,
-0x64, 0x3b, 0x74, 0x3b, 0x61, 0x3b, 0x64, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x61, 0x3b, 0x6b, 0x3b, 0x61, 0x3b,
-0x64, 0x3b, 0x49, 0x61, 0x6e, 0x2e, 0x3b, 0x50, 0x65, 0x70, 0x2e, 0x3b, 0x4d, 0x61, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41, 0x70,
-0x2e, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x2e, 0x3b, 0x49, 0x75, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41, 0x75, 0x2e,
-0x3b, 0x4b, 0x65, 0x70, 0x2e, 0x3b, 0x2bb, 0x4f, 0x6b, 0x2e, 0x3b, 0x4e, 0x6f, 0x77, 0x2e, 0x3b, 0x4b, 0x65, 0x6b, 0x2e,
-0x3b, 0x49, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x50, 0x65, 0x70, 0x65, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d,
-0x61, 0x6c, 0x61, 0x6b, 0x69, 0x3b, 0x2bb, 0x41, 0x70, 0x65, 0x6c, 0x69, 0x6c, 0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49,
-0x75, 0x6e, 0x65, 0x3b, 0x49, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x75, 0x6b, 0x61, 0x6b, 0x65, 0x3b, 0x4b, 0x65,
-0x70, 0x61, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x6b, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x6f,
-0x77, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x4b, 0x65, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x45, 0x6e, 0x65, 0x3b,
-0x50, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x75, 0x6e, 0x3b,
-0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b,
-0x44, 0x69, 0x73, 0x3b, 0x45, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x50, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x4d, 0x61,
-0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6e, 0x79, 0x6f,
-0x3b, 0x48, 0x75, 0x6c, 0x79, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x79, 0x65, 0x6d,
-0x62, 0x72, 0x65, 0x3b, 0x4f, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x62, 0x79, 0x65, 0x6d, 0x62, 0x72,
-0x65, 0x3b, 0x44, 0x69, 0x73, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x41, 0x3b,
-0x4d, 0x3b, 0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b,
-0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62,
-0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b,
-0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x63, 0x68, 0x74, 0x3b, 0x53,
-0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f,
-0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xa2cd, 0xa1aa, 0x3b, 0xa44d,
-0xa1aa, 0x3b, 0xa315, 0xa1aa, 0x3b, 0xa1d6, 0xa1aa, 0x3b, 0xa26c, 0xa1aa, 0x3b, 0xa0d8, 0xa1aa, 0x3b, 0xa3c3, 0xa1aa, 0x3b, 0xa246, 0xa1aa, 0x3b,
-0xa22c, 0xa1aa, 0x3b, 0xa2b0, 0xa1aa, 0x3b, 0xa2b0, 0xa2aa, 0xa1aa, 0x3b, 0xa2b0, 0xa44b, 0xa1aa, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46,
-0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b,
-0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x61, 0x72,
-0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c,
-0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73,
-0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x76, 0x65, 0x72, 0x3b,
-0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x111,
-0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x3b, 0x63, 0x75, 0x6f, 0x3b, 0x6d, 0x69, 0x65,
-0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b,
-0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x3b, 0x6f, 0x111, 0x111,
-0x61, 0x6a, 0x61, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x76, 0x61, 0x6d, 0xe1, 0x6e,
-0x6e, 0x75, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x6f,
-0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x65,
-0x61, 0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x64, 0x6e, 0x65, 0x6d, 0xe1, 0x6e,
-0x6e, 0x75, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x61, 0x6d,
-0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x67, 0x6f, 0x74, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x6b,
-0xe1, 0x62, 0x6d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0x61, 0x6d, 0xe1, 0x6e, 0x6e,
-0x75, 0x3b, 0x4f, 0x3b, 0x47, 0x3b, 0x4e, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x10c, 0x3b,
-0x47, 0x3b, 0x53, 0x3b, 0x4a, 0x3b, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e, 0x6a, 0x75, 0x6b,
+0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0x3b, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x53, 0x3b, 0xc8, 0x3b, 0x1eb8, 0x3b, 0xcc, 0x3b, 0x1eb8, 0x300,
+0x3b, 0xd2, 0x3b, 0x41, 0x3b, 0xd2, 0x3b, 0x4f, 0x3b, 0x1ecc, 0x300, 0x3b, 0x42, 0x3b, 0x1ecc, 0x300, 0x53, 0x68, 0x25b, 0x301,
+0x72, 0x25b, 0x301, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x190, 0x72, 0x25b, 0x300, 0x6e, 0xe0, 0x3b, 0xcc, 0x67, 0x62,
+0xe9, 0x3b, 0x190, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x25b, 0x6d, 0x254,
+0x3b, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x186, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42,
+0xe9, 0x6c, 0xfa, 0x3b, 0x186, 0x300, 0x70, 0x25b, 0x300, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x53, 0x68, 0x25b, 0x301, 0x72, 0x25b,
+0x301, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x190, 0x72,
+0x25b, 0x300, 0x6e, 0xe0, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20,
+0x190, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f, 0x73,
+0x68, 0xf9, 0x20, 0x41, 0x67, 0x25b, 0x6d, 0x254, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f,
+0x73, 0x68, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x186, 0x300, 0x77, 0xe0, 0x72,
+0xe0, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x186, 0x300, 0x70,
+0x25b, 0x300, 0x53, 0x68, 0x25b, 0x301, 0x3b, 0xc8, 0x72, 0x3b, 0x190, 0x72, 0x3b, 0xcc, 0x67, 0x3b, 0x190, 0x300, 0x62, 0x3b,
+0xd2, 0x6b, 0x3b, 0x41, 0x67, 0x3b, 0xd2, 0x67, 0x3b, 0x4f, 0x77, 0x3b, 0x186, 0x300, 0x77, 0x3b, 0x42, 0xe9, 0x3b, 0x186,
+0x300, 0x70, 0x53, 0x68, 0x25b, 0x301, 0x72, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0x3b, 0x190, 0x72, 0x25b, 0x300, 0x6e, 0x3b, 0xcc,
+0x67, 0x62, 0x3b, 0x190, 0x300, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x3b, 0x41, 0x67, 0x25b, 0x3b, 0xd2, 0x67, 0xfa, 0x3b,
+0x4f, 0x77, 0x65, 0x3b, 0x186, 0x300, 0x77, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0x3b, 0x186, 0x300, 0x70, 0x25b, 0x53, 0x3b, 0xc8,
+0x3b, 0x190, 0x3b, 0xcc, 0x3b, 0x190, 0x300, 0x3b, 0xd2, 0x3b, 0x41, 0x3b, 0xd2, 0x3b, 0x4f, 0x3b, 0x186, 0x300, 0x3b, 0x42,
+0x3b, 0x186, 0x300, 0x4a, 0x61, 0x6e, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72,
+0x69, 0x3b, 0x4d, 0x61, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x68, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b,
+0x53, 0x65, 0x70, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f,
+0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62,
+0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x45, 0x70, 0x68, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c,
+0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73,
+0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b,
+0x4e, 0x3b, 0x44, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70,
+0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67,
+0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73,
+0x2e, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74,
+0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69,
+0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6f, 0x6b,
+0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d,
+0x62, 0x61, 0x72, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d,
+0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f,
+0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x431,
+0x440, 0x443, 0x430, 0x440, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b,
+0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x443, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f,
+0x442, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c,
+0x431, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x431, 0x3b,
+0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b,
+0x430, 0x443, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x4a,
+0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x67, 0x65, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x54, 0x6f, 0x73, 0x68, 0x69, 0x61, 0x67,
+0x68, 0x74, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76, 0x65, 0x72,
+0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x73, 0x6f, 0x75, 0x72,
+0x65, 0x65, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61,
+0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4a,
+0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x48, 0x6f, 0x75,
+0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x6e, 0x79, 0x20, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b, 0x4a, 0x2d,
+0x67, 0x75, 0x65, 0x72, 0x3b, 0x54, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b,
+0x41, 0x76, 0x72, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x73, 0x6f, 0x75,
+0x72, 0x65, 0x65, 0x3b, 0x4a, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73, 0x74,
+0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4a, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72,
+0x3b, 0x4d, 0x2d, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x2d, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b, 0x6d,
+0x69, 0x73, 0x20, 0x47, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x48, 0x77, 0x65, 0x76, 0x72, 0x65,
+0x72, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4d, 0x65, 0x75, 0x72, 0x74, 0x68, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x45, 0x62, 0x72,
+0x65, 0x6c, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4d, 0x65, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4d, 0x65, 0x74, 0x68, 0x65, 0x76,
+0x65, 0x6e, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x47, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x3b, 0x6d, 0x69, 0x73,
+0x20, 0x45, 0x73, 0x74, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x47, 0x77, 0x79, 0x6e, 0x6e, 0x67, 0x61, 0x6c, 0x61, 0x3b, 0x6d,
+0x69, 0x73, 0x20, 0x48, 0x65, 0x64, 0x72, 0x61, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x44, 0x75, 0x3b, 0x6d, 0x69, 0x73, 0x20,
+0x4b, 0x65, 0x76, 0x61, 0x72, 0x64, 0x68, 0x75, 0x47, 0x65, 0x6e, 0x3b, 0x48, 0x77, 0x65, 0x3b, 0x4d, 0x65, 0x75, 0x3b,
+0x45, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x3b, 0x4d, 0x65, 0x74, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x45, 0x73, 0x74, 0x3b, 0x47,
+0x77, 0x6e, 0x3b, 0x48, 0x65, 0x64, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x65, 0x76, 0x53, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x186,
+0x70, 0x25b, 0x70, 0x254, 0x6e, 0x3b, 0x4b, 0x77, 0x61, 0x6b, 0x77, 0x61, 0x72, 0x2d, 0x186, 0x67, 0x79, 0x65, 0x66, 0x75,
+0x6f, 0x3b, 0x45, 0x62, 0x254, 0x77, 0x2d, 0x186, 0x62, 0x65, 0x6e, 0x65, 0x6d, 0x3b, 0x45, 0x62, 0x254, 0x62, 0x69, 0x72,
+0x61, 0x2d, 0x4f, 0x66, 0x6f, 0x72, 0x69, 0x73, 0x75, 0x6f, 0x3b, 0x45, 0x73, 0x75, 0x73, 0x6f, 0x77, 0x20, 0x41, 0x6b,
+0x65, 0x74, 0x73, 0x65, 0x61, 0x62, 0x61, 0x2d, 0x4b, 0x254, 0x74, 0x254, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x62,
+0x69, 0x72, 0x61, 0x64, 0x65, 0x2d, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x6d, 0x75, 0x6d, 0x75, 0x3b, 0x41, 0x79,
+0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x2d, 0x4b, 0x69, 0x74, 0x61, 0x77, 0x6f, 0x6e, 0x73, 0x61, 0x3b, 0x44, 0x69, 0x66, 0x75,
+0x75, 0x2d, 0x186, 0x73, 0x61, 0x6e, 0x64, 0x61, 0x61, 0x3b, 0x46, 0x61, 0x6e, 0x6b, 0x77, 0x61, 0x2d, 0x190, 0x62, 0x254,
+0x3b, 0x186, 0x62, 0x25b, 0x73, 0x25b, 0x2d, 0x41, 0x68, 0x69, 0x6e, 0x69, 0x6d, 0x65, 0x3b, 0x186, 0x62, 0x65, 0x72, 0x25b,
+0x66, 0x25b, 0x77, 0x2d, 0x4f, 0x62, 0x75, 0x62, 0x75, 0x6f, 0x3b, 0x4d, 0x75, 0x6d, 0x75, 0x2d, 0x186, 0x70, 0x25b, 0x6e,
+0x69, 0x6d, 0x62, 0x61, 0x53, 0x2d, 0x186, 0x3b, 0x4b, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x4f, 0x3b,
+0x45, 0x2d, 0x4b, 0x3b, 0x4f, 0x2d, 0x41, 0x3b, 0x41, 0x2d, 0x4b, 0x3b, 0x44, 0x2d, 0x186, 0x3b, 0x46, 0x2d, 0x190, 0x3b,
+0x186, 0x2d, 0x41, 0x3b, 0x186, 0x2d, 0x4f, 0x3b, 0x4d, 0x2d, 0x186, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b,
+0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d,
+0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x92f, 0x3b, 0x906, 0x917, 0x94b,
+0x938, 0x94d, 0x924, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930,
+0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930, 0x4a, 0x65,
+0x6e, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x4d, 0x61, 0x61,
+0x63, 0x68, 0x1ecb, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x65, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b,
+0x4a, 0x75, 0x6c, 0x61, 0x1ecb, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x1ecd, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x61, 0x3b, 0x1ecc, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73,
+0x65, 0x6d, 0x62, 0x61, 0x4a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x45, 0x70, 0x72, 0x3b,
+0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x3b, 0x53, 0x65, 0x70, 0x3b,
+0x1ecc, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d,
+0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x1ecc, 0x3b, 0x53, 0x3b, 0x1ecc, 0x3b, 0x4e, 0x3b, 0x44, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77,
+0x61, 0x20, 0x6d, 0x62, 0x65, 0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b,
+0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20,
+0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61,
+0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169,
+0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x75, 0x6f, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69,
+0x20, 0x77, 0x61, 0x20, 0x6e, 0x79, 0x61, 0x61, 0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20,
+0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x3b,
+0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x129, 0x6d, 0x77,
+0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69,
+0x6c, 0x129, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x65, 0x6c, 0x3b, 0x4b, 0x74, 0x169, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x74,
+0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x4b, 0x6e, 0x64, 0x3b, 0x128, 0x6b,
+0x75, 0x3b, 0x128, 0x6b, 0x6d, 0x3b, 0x128, 0x6b, 0x6c, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x54,
+0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x128, 0x3b, 0x128, 0x3b, 0x128, 0x5a, 0x65, 0x6e, 0xe2, 0x72, 0x3b, 0x46, 0x65,
+0x76, 0x72, 0xe2, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0xe7, 0x3b, 0x41, 0x76, 0x72, 0xee, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b,
+0x4a, 0x75, 0x67, 0x6e, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d,
+0x62, 0x61, 0x72, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b,
+0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x5a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b,
+0x41, 0x76, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x3b,
+0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x63, 0x5a, 0x3b, 0x46, 0x3b, 0x4d,
+0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x64, 0x7a,
+0x6f, 0x76, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65, 0x64, 0x6f, 0x78, 0x65, 0x3b, 0x61, 0x66,
+0x254, 0x66, 0x129, 0x65, 0x3b, 0x64, 0x61, 0x6d, 0x61, 0x3b, 0x6d, 0x61, 0x73, 0x61, 0x3b, 0x73, 0x69, 0x61, 0x6d, 0x6c,
+0x254, 0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x61, 0x6e, 0x79, 0x254, 0x6e, 0x79,
+0x254, 0x3b, 0x6b, 0x65, 0x6c, 0x65, 0x3b, 0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254, 0x78, 0x65, 0x3b, 0x64,
+0x7a, 0x6f, 0x6d, 0x65, 0x64, 0x7a, 0x76, 0x3b, 0x64, 0x7a, 0x64, 0x3b, 0x74, 0x65, 0x64, 0x3b, 0x61, 0x66, 0x254, 0x3b,
+0x64, 0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73, 0x69, 0x61, 0x3b, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x6e, 0x79, 0x3b,
+0x6b, 0x65, 0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x7a, 0x6d, 0x64, 0x3b, 0x64, 0x3b, 0x74, 0x3b, 0x61, 0x3b, 0x64,
+0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x61, 0x3b, 0x6b, 0x3b, 0x61, 0x3b, 0x64, 0x49, 0x61, 0x6e, 0x75, 0x61, 0x6c,
+0x69, 0x3b, 0x50, 0x65, 0x70, 0x65, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x6b, 0x69, 0x3b, 0x2bb,
+0x41, 0x70, 0x65, 0x6c, 0x69, 0x6c, 0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x65, 0x3b, 0x49, 0x75, 0x6c,
+0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x75, 0x6b, 0x61, 0x6b, 0x65, 0x3b, 0x4b, 0x65, 0x70, 0x61, 0x6b, 0x65, 0x6d, 0x61, 0x70,
+0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x6b, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x6f, 0x77, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b,
+0x4b, 0x65, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x49, 0x61, 0x6e, 0x2e, 0x3b, 0x50, 0x65, 0x70, 0x2e, 0x3b, 0x4d, 0x61,
+0x6c, 0x2e, 0x3b, 0x2bb, 0x41, 0x70, 0x2e, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x2e, 0x3b, 0x49, 0x75, 0x6c,
+0x2e, 0x3b, 0x2bb, 0x41, 0x75, 0x2e, 0x3b, 0x4b, 0x65, 0x70, 0x2e, 0x3b, 0x2bb, 0x4f, 0x6b, 0x2e, 0x3b, 0x4e, 0x6f, 0x77,
+0x2e, 0x3b, 0x4b, 0x65, 0x6b, 0x2e, 0x45, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x50, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b,
+0x4d, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6e,
+0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6c, 0x79, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x79,
+0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x62, 0x79, 0x65, 0x6d,
+0x62, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x73, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x45, 0x6e, 0x65, 0x3b, 0x50, 0x65, 0x62,
+0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c,
+0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73,
+0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67,
+0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x4a, 0x61, 0x6e,
+0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72,
+0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67,
+0x75, 0x73, 0x63, 0x68, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
+0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62,
+0x65, 0x72, 0xa2cd, 0xa1aa, 0x3b, 0xa44d, 0xa1aa, 0x3b, 0xa315, 0xa1aa, 0x3b, 0xa1d6, 0xa1aa, 0x3b, 0xa26c, 0xa1aa, 0x3b, 0xa0d8, 0xa1aa, 0x3b,
+0xa3c3, 0xa1aa, 0x3b, 0xa246, 0xa1aa, 0x3b, 0xa22c, 0xa1aa, 0x3b, 0xa2b0, 0xa1aa, 0x3b, 0xa2b0, 0xa2aa, 0xa1aa, 0x3b, 0xa2b0, 0xa44b, 0xa1aa, 0x4a,
+0x61, 0x6e, 0x75, 0x61, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a,
+0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69,
+0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b,
+0x74, 0x6f, 0x76, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d,
+0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70,
+0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67,
+0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a,
+0x2e, 0x6f, 0x111, 0x111, 0x61, 0x6a, 0x61, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x76,
+0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x63,
+0x75, 0x6f, 0x14b, 0x6f, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e,
+0x75, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x64, 0x6e,
+0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x10d, 0x61,
+0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x67, 0x6f, 0x74, 0x6d, 0xe1, 0x6e, 0x6e,
+0x75, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x6d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0x61,
+0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x3b,
+0x63, 0x75, 0x6f, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x3b, 0x62,
+0x6f, 0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x3b, 0x6a,
+0x75, 0x6f, 0x76, 0x4f, 0x3b, 0x47, 0x3b, 0x4e, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x10c,
+0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x4a, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e, 0x6a, 0x75, 0x6b,
0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73, 0x75, 0x6f, 0x69,
0x3b, 0x62, 0x6f, 0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b, 0xe1, 0x62,
-0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x3b, 0x43, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70,
-0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x43, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x74, 0x3b, 0x53, 0x65,
-0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x43, 0x68, 0x61, 0x6e, 0x75, 0x61,
-0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70,
-0x69, 0x72, 0x69, 0x72, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6c, 0x61,
-0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b,
-0x69, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x62, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62,
-0x61, 0x3b, 0x43, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x53, 0x3b,
-0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x49, 0x6d, 0x62, 0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61,
-0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4b, 0x61, 0x72, 0x3b, 0x4d, 0x66, 0x75, 0x3b, 0x57, 0x75, 0x6e, 0x3b, 0x49, 0x6b,
-0x65, 0x3b, 0x49, 0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b, 0x49, 0x77, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
-0x68, 0x77, 0x61, 0x20, 0x69, 0x6d, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61,
-0x20, 0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61,
-0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x6f,
-0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20,
-0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20,
-0x67, 0x68, 0x77, 0x61, 0x20, 0x6d, 0x66, 0x75, 0x6e, 0x67, 0x61, 0x64, 0x65, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
-0x68, 0x77, 0x61, 0x20, 0x77, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68,
-0x77, 0x61, 0x20, 0x69, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20,
-0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d,
-0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6d, 0x77, 0x65, 0x72, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77,
-0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x77, 0x69, 0x3b, 0x49, 0x3b, 0x4b, 0x3b, 0x4b,
-0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x73,
-0x69, 0x69, 0x3b, 0x63, 0x6f, 0x6c, 0x3b, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0x65, 0x65, 0x3b, 0x64, 0x75, 0x75, 0x3b, 0x6b,
-0x6f, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x3b, 0x6a, 0x75, 0x6b, 0x3b, 0x73, 0x6c, 0x74, 0x3b, 0x79, 0x61, 0x72, 0x3b, 0x6a,
-0x6f, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x3b, 0x73, 0x69, 0x69, 0x6c, 0x6f, 0x3b, 0x63, 0x6f, 0x6c, 0x74, 0x65, 0x3b, 0x6d,
-0x62, 0x6f, 0x6f, 0x79, 0x3b, 0x73, 0x65, 0x65, 0x257, 0x74, 0x6f, 0x3b, 0x64, 0x75, 0x75, 0x6a, 0x61, 0x6c, 0x3b, 0x6b,
-0x6f, 0x72, 0x73, 0x65, 0x3b, 0x6d, 0x6f, 0x72, 0x73, 0x6f, 0x3b, 0x6a, 0x75, 0x6b, 0x6f, 0x3b, 0x73, 0x69, 0x69, 0x6c,
-0x74, 0x6f, 0x3b, 0x79, 0x61, 0x72, 0x6b, 0x6f, 0x6d, 0x61, 0x61, 0x3b, 0x6a, 0x6f, 0x6c, 0x61, 0x6c, 0x3b, 0x62, 0x6f,
-0x77, 0x74, 0x65, 0x3b, 0x73, 0x3b, 0x63, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b,
-0x73, 0x3b, 0x79, 0x3b, 0x6a, 0x3b, 0x62, 0x3b, 0x4a, 0x45, 0x4e, 0x3b, 0x57, 0x4b, 0x52, 0x3b, 0x57, 0x47, 0x54, 0x3b,
-0x57, 0x4b, 0x4e, 0x3b, 0x57, 0x54, 0x4e, 0x3b, 0x57, 0x54, 0x44, 0x3b, 0x57, 0x4d, 0x4a, 0x3b, 0x57, 0x4e, 0x4e, 0x3b,
-0x57, 0x4b, 0x44, 0x3b, 0x57, 0x49, 0x4b, 0x3b, 0x57, 0x4d, 0x57, 0x3b, 0x44, 0x49, 0x54, 0x3b, 0x4e, 0x6a, 0x65, 0x6e,
-0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x72, 0x129, 0x3b, 0x4d,
-0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65,
-0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61,
-0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a,
-0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77,
-0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77,
-0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169,
-0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d, 0x77, 0x65, 0x3b, 0x4e, 0x64, 0x69, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61,
-0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49,
-0x3b, 0x49, 0x3b, 0x44, 0x3b, 0x4f, 0x62, 0x6f, 0x3b, 0x57, 0x61, 0x61, 0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4f, 0x6e, 0x67,
-0x3b, 0x49, 0x6d, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70, 0x3b, 0x49, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x61,
-0x3b, 0x54, 0x6f, 0x6d, 0x3b, 0x54, 0x6f, 0x62, 0x3b, 0x54, 0x6f, 0x77, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65,
-0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4c,
-0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65,
-0x20, 0x6f, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6d, 0x65,
-0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c,
-0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x69, 0x65, 0x74,
-0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x73, 0x61, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c,
-0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f,
-0x6e, 0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20,
-0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4f, 0x3b, 0x57, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b,
-0x49, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61,
-0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75,
-0x67, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61,
-0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x76, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x6f,
-0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x4a, 0x75,
-0x6c, 0x68, 0x6f, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f,
-0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63,
-0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x5a, 0x69, 0x62, 0x3b, 0x4e, 0x68, 0x6c, 0x6f, 0x3b, 0x4d, 0x62, 0x69, 0x3b, 0x4d,
-0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x77, 0x3b, 0x4e, 0x68, 0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75, 0x3b, 0x4e, 0x63, 0x77, 0x3b,
-0x4d, 0x70, 0x61, 0x6e, 0x3b, 0x4d, 0x66, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x3b, 0x5a, 0x69,
-0x62, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x6c, 0x61, 0x3b, 0x4e, 0x68, 0x6c, 0x6f, 0x6c, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d,
-0x62, 0x69, 0x6d, 0x62, 0x69, 0x74, 0x68, 0x6f, 0x3b, 0x4d, 0x61, 0x62, 0x61, 0x73, 0x61, 0x3b, 0x4e, 0x6b, 0x77, 0x65,
-0x6e, 0x6b, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4e, 0x68, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75,
-0x6c, 0x69, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4e, 0x63, 0x77, 0x61, 0x62, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4d, 0x70,
-0x61, 0x6e, 0x64, 0x75, 0x6c, 0x61, 0x3b, 0x4d, 0x66, 0x75, 0x6d, 0x66, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x7a, 0x69, 0x3b,
-0x4d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x5a, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b,
-0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x31, 0x3b, 0x4d, 0x32, 0x3b,
-0x4d, 0x33, 0x3b, 0x4d, 0x34, 0x3b, 0x4d, 0x35, 0x3b, 0x4d, 0x36, 0x3b, 0x4d, 0x37, 0x3b, 0x4d, 0x38, 0x3b, 0x4d, 0x39,
-0x3b, 0x4d, 0x31, 0x30, 0x3b, 0x4d, 0x31, 0x31, 0x3b, 0x4d, 0x31, 0x32, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
+0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x43, 0x68, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x61,
+0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x69, 0x72, 0x69, 0x72, 0x69, 0x3b, 0x4d, 0x65, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b,
+0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x62,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x43, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b,
+0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x43, 0x75, 0x6c, 0x3b,
+0x41, 0x67, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x43,
+0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e,
+0x3b, 0x44, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6d, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4d,
+0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
+0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61,
+0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x73, 0x61,
+0x6e, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x72, 0x61, 0x6e, 0x64, 0x61,
+0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6d, 0x66, 0x75, 0x6e, 0x67, 0x61, 0x64,
+0x65, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x77, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x79, 0x61,
+0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x6f,
+0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
+0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6d, 0x77, 0x65, 0x72, 0x69, 0x3b,
+0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69,
+0x77, 0x69, 0x49, 0x6d, 0x62, 0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61,
+0x73, 0x3b, 0x4b, 0x61, 0x72, 0x3b, 0x4d, 0x66, 0x75, 0x3b, 0x57, 0x75, 0x6e, 0x3b, 0x49, 0x6b, 0x65, 0x3b, 0x49, 0x6b,
+0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b, 0x49, 0x77, 0x69, 0x49, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b,
+0x3b, 0x4d, 0x3b, 0x57, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x73, 0x69, 0x69, 0x6c, 0x6f, 0x3b, 0x63, 0x6f,
+0x6c, 0x74, 0x65, 0x3b, 0x6d, 0x62, 0x6f, 0x6f, 0x79, 0x3b, 0x73, 0x65, 0x65, 0x257, 0x74, 0x6f, 0x3b, 0x64, 0x75, 0x75,
+0x6a, 0x61, 0x6c, 0x3b, 0x6b, 0x6f, 0x72, 0x73, 0x65, 0x3b, 0x6d, 0x6f, 0x72, 0x73, 0x6f, 0x3b, 0x6a, 0x75, 0x6b, 0x6f,
+0x3b, 0x73, 0x69, 0x69, 0x6c, 0x74, 0x6f, 0x3b, 0x79, 0x61, 0x72, 0x6b, 0x6f, 0x6d, 0x61, 0x61, 0x3b, 0x6a, 0x6f, 0x6c,
+0x61, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x74, 0x65, 0x73, 0x69, 0x69, 0x3b, 0x63, 0x6f, 0x6c, 0x3b, 0x6d, 0x62, 0x6f, 0x3b,
+0x73, 0x65, 0x65, 0x3b, 0x64, 0x75, 0x75, 0x3b, 0x6b, 0x6f, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x3b, 0x6a, 0x75, 0x6b, 0x3b,
+0x73, 0x6c, 0x74, 0x3b, 0x79, 0x61, 0x72, 0x3b, 0x6a, 0x6f, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x73, 0x3b, 0x63, 0x3b, 0x6d,
+0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x73, 0x3b, 0x79, 0x3b, 0x6a, 0x3b, 0x62, 0x4e, 0x6a,
+0x65, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x72, 0x129,
+0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65,
+0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20,
+0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61,
+0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b,
+0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65,
+0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69,
+0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d, 0x77, 0x65, 0x3b, 0x4e, 0x64, 0x69, 0x74, 0x68, 0x65, 0x6d,
+0x62, 0x61, 0x4a, 0x45, 0x4e, 0x3b, 0x57, 0x4b, 0x52, 0x3b, 0x57, 0x47, 0x54, 0x3b, 0x57, 0x4b, 0x4e, 0x3b, 0x57, 0x54,
+0x4e, 0x3b, 0x57, 0x54, 0x44, 0x3b, 0x57, 0x4d, 0x4a, 0x3b, 0x57, 0x4e, 0x4e, 0x3b, 0x57, 0x4b, 0x44, 0x3b, 0x57, 0x49,
+0x4b, 0x3b, 0x57, 0x4d, 0x57, 0x3b, 0x44, 0x49, 0x54, 0x4a, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x47,
+0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x44, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20,
+0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4c, 0x61,
+0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20,
+0x6f, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6d, 0x65, 0x74,
+0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65,
+0x20, 0x73, 0x61, 0x70, 0x61, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x69, 0x65, 0x74, 0x3b,
+0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x73, 0x61, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65,
+0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e,
+0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x77,
+0x61, 0x61, 0x72, 0x65, 0x4f, 0x62, 0x6f, 0x3b, 0x57, 0x61, 0x61, 0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4f, 0x6e, 0x67, 0x3b,
+0x49, 0x6d, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b, 0x53, 0x61, 0x70, 0x3b, 0x49, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x3b,
+0x54, 0x6f, 0x6d, 0x3b, 0x54, 0x6f, 0x62, 0x3b, 0x54, 0x6f, 0x77, 0x4f, 0x3b, 0x57, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x49,
+0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54, 0x4a, 0x61, 0x6e, 0x65, 0x69, 0x72,
+0x6f, 0x3b, 0x46, 0x65, 0x76, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x6f, 0x3b, 0x41, 0x62, 0x72,
+0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b,
+0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x74, 0x75,
+0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72,
+0x6f, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69,
+0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75,
+0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x5a, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x6c, 0x61, 0x3b, 0x4e,
+0x68, 0x6c, 0x6f, 0x6c, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x62, 0x69, 0x6d, 0x62, 0x69, 0x74, 0x68, 0x6f, 0x3b, 0x4d,
+0x61, 0x62, 0x61, 0x73, 0x61, 0x3b, 0x4e, 0x6b, 0x77, 0x65, 0x6e, 0x6b, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4e, 0x68, 0x6c,
+0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75, 0x6c, 0x69, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4e, 0x63, 0x77,
+0x61, 0x62, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6e, 0x64, 0x75, 0x6c, 0x61, 0x3b, 0x4d, 0x66, 0x75,
+0x6d, 0x66, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x5a,
+0x69, 0x62, 0x3b, 0x4e, 0x68, 0x6c, 0x6f, 0x3b, 0x4d, 0x62, 0x69, 0x3b, 0x4d, 0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x77, 0x3b,
+0x4e, 0x68, 0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75, 0x3b, 0x4e, 0x63, 0x77, 0x3b, 0x4d, 0x70, 0x61, 0x6e, 0x3b, 0x4d, 0x66,
+0x75, 0x3b, 0x4c, 0x77, 0x65, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x5a, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b,
+0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x4d, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
0x61, 0x20, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61,
0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b,
0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69,
@@ -2097,562 +2074,586 @@ static const ushort months_data[] = {
0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b,
0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f,
0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61,
-0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x53,
-0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x2d49, 0x2d4f, 0x2d4f, 0x3b, 0x2d31, 0x2d55, 0x2d30, 0x3b, 0x2d4e,
-0x2d30, 0x2d55, 0x3b, 0x2d49, 0x2d31, 0x2d54, 0x3b, 0x2d4e, 0x2d30, 0x2d62, 0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x3b, 0x2d62, 0x2d53, 0x2d4d, 0x3b, 0x2d56,
-0x2d53, 0x2d5b, 0x3b, 0x2d5b, 0x2d53, 0x2d5c, 0x3b, 0x2d3d, 0x2d5c, 0x2d53, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x3b, 0x2d37, 0x2d53, 0x2d4a, 0x3b, 0x2d49,
-0x2d4f, 0x2d4f, 0x2d30, 0x2d62, 0x2d54, 0x3b, 0x2d31, 0x2d55, 0x2d30, 0x2d62, 0x2d55, 0x3b, 0x2d4e, 0x2d30, 0x2d55, 0x2d5a, 0x3b, 0x2d49, 0x2d31, 0x2d54,
-0x2d49, 0x2d54, 0x3b, 0x2d4e, 0x2d30, 0x2d62, 0x2d62, 0x2d53, 0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x2d62, 0x2d53, 0x3b, 0x2d62, 0x2d53, 0x2d4d, 0x2d62, 0x2d53,
-0x2d63, 0x3b, 0x2d56, 0x2d53, 0x2d5b, 0x2d5c, 0x3b, 0x2d5b, 0x2d53, 0x2d5c, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d3d, 0x2d5c, 0x2d53, 0x2d31,
-0x2d54, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d37, 0x2d53, 0x2d4a, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b,
-0x2d49, 0x3b, 0x2d31, 0x3b, 0x2d4e, 0x3b, 0x2d49, 0x3b, 0x2d4e, 0x3b, 0x2d62, 0x3b, 0x2d62, 0x3b, 0x2d56, 0x3b, 0x2d5b, 0x3b, 0x2d3d, 0x3b,
-0x2d4f, 0x3b, 0x2d37, 0x3b, 0x69, 0x6e, 0x6e, 0x3b, 0x62, 0x1e5b, 0x61, 0x3b, 0x6d, 0x61, 0x1e5b, 0x3b, 0x69, 0x62, 0x72, 0x3b,
-0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x263, 0x75, 0x63, 0x3b, 0x63, 0x75, 0x74, 0x3b,
-0x6b, 0x74, 0x75, 0x3b, 0x6e, 0x75, 0x77, 0x3b, 0x64, 0x75, 0x6a, 0x3b, 0x69, 0x6e, 0x6e, 0x61, 0x79, 0x72, 0x3b, 0x62,
-0x1e5b, 0x61, 0x79, 0x1e5b, 0x3b, 0x6d, 0x61, 0x1e5b, 0x1e63, 0x3b, 0x69, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x79,
-0x75, 0x3b, 0x79, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x79, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x263, 0x75, 0x63, 0x74, 0x3b,
-0x63, 0x75, 0x74, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x3b, 0x6e, 0x75, 0x77, 0x61, 0x6e,
-0x62, 0x69, 0x72, 0x3b, 0x64, 0x75, 0x6a, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x69, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x69,
-0x3b, 0x6d, 0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x263, 0x3b, 0x63, 0x3b, 0x6b, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x59, 0x65, 0x6e,
-0x3b, 0x46, 0x75, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e,
-0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b, 0x43, 0x74, 0x65, 0x3b, 0x54, 0x75, 0x62, 0x3b, 0x57, 0x61, 0x6d,
-0x3b, 0x44, 0x75, 0x6a, 0x3b, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x46, 0x75, 0x1e5b, 0x61, 0x72, 0x3b,
-0x4d, 0x65, 0x263, 0x72, 0x65, 0x73, 0x3b, 0x59, 0x65, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x79, 0x75, 0x3b,
-0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b, 0x43, 0x74, 0x65,
-0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x54, 0x75, 0x62, 0x65, 0x1e5b, 0x3b, 0x57, 0x61, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x44, 0x75,
-0x1e7, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59,
-0x3b, 0x194, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x59, 0x65, 0x6e, 0x3b, 0x46, 0x75, 0x72, 0x3b, 0x4d,
+0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x4d, 0x31, 0x3b, 0x4d, 0x32, 0x3b, 0x4d, 0x33, 0x3b, 0x4d, 0x34, 0x3b, 0x4d, 0x35,
+0x3b, 0x4d, 0x36, 0x3b, 0x4d, 0x37, 0x3b, 0x4d, 0x38, 0x3b, 0x4d, 0x39, 0x3b, 0x4d, 0x31, 0x30, 0x3b, 0x4d, 0x31, 0x31,
+0x3b, 0x4d, 0x31, 0x32, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b,
+0x54, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x2d49, 0x2d4f, 0x2d4f, 0x2d30, 0x2d62, 0x2d54, 0x3b, 0x2d31, 0x2d55, 0x2d30, 0x2d62, 0x2d55, 0x3b,
+0x2d4e, 0x2d30, 0x2d55, 0x2d5a, 0x3b, 0x2d49, 0x2d31, 0x2d54, 0x2d49, 0x2d54, 0x3b, 0x2d4e, 0x2d30, 0x2d62, 0x2d62, 0x2d53, 0x3b, 0x2d62, 0x2d53, 0x2d4f,
+0x2d62, 0x2d53, 0x3b, 0x2d62, 0x2d53, 0x2d4d, 0x2d62, 0x2d53, 0x2d63, 0x3b, 0x2d56, 0x2d53, 0x2d5b, 0x2d5c, 0x3b, 0x2d5b, 0x2d53, 0x2d5c, 0x2d30, 0x2d4f,
+0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d3d, 0x2d5c, 0x2d53, 0x2d31, 0x2d54, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d37,
+0x2d53, 0x2d4a, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x2d49, 0x2d4f, 0x2d4f, 0x3b, 0x2d31, 0x2d55, 0x2d30, 0x3b, 0x2d4e, 0x2d30, 0x2d55, 0x3b, 0x2d49,
+0x2d31, 0x2d54, 0x3b, 0x2d4e, 0x2d30, 0x2d62, 0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x3b, 0x2d62, 0x2d53, 0x2d4d, 0x3b, 0x2d56, 0x2d53, 0x2d5b, 0x3b, 0x2d5b,
+0x2d53, 0x2d5c, 0x3b, 0x2d3d, 0x2d5c, 0x2d53, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x3b, 0x2d37, 0x2d53, 0x2d4a, 0x2d49, 0x3b, 0x2d31, 0x3b, 0x2d4e, 0x3b,
+0x2d49, 0x3b, 0x2d4e, 0x3b, 0x2d62, 0x3b, 0x2d62, 0x3b, 0x2d56, 0x3b, 0x2d5b, 0x3b, 0x2d3d, 0x3b, 0x2d4f, 0x3b, 0x2d37, 0x69, 0x6e, 0x6e,
+0x61, 0x79, 0x72, 0x3b, 0x62, 0x1e5b, 0x61, 0x79, 0x1e5b, 0x3b, 0x6d, 0x61, 0x1e5b, 0x1e63, 0x3b, 0x69, 0x62, 0x72, 0x69, 0x72,
+0x3b, 0x6d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x79, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x79, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b,
+0x263, 0x75, 0x63, 0x74, 0x3b, 0x63, 0x75, 0x74, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x6b, 0x74, 0x75, 0x62, 0x72, 0x3b,
+0x6e, 0x75, 0x77, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x64, 0x75, 0x6a, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x69, 0x6e, 0x6e,
+0x3b, 0x62, 0x1e5b, 0x61, 0x3b, 0x6d, 0x61, 0x1e5b, 0x3b, 0x69, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e,
+0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x263, 0x75, 0x63, 0x3b, 0x63, 0x75, 0x74, 0x3b, 0x6b, 0x74, 0x75, 0x3b, 0x6e, 0x75, 0x77,
+0x3b, 0x64, 0x75, 0x6a, 0x69, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x69, 0x3b, 0x6d, 0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x263, 0x3b,
+0x63, 0x3b, 0x6b, 0x3b, 0x6e, 0x3b, 0x64, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x46, 0x75, 0x1e5b, 0x61,
+0x72, 0x3b, 0x4d, 0x65, 0x263, 0x72, 0x65, 0x73, 0x3b, 0x59, 0x65, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x79,
+0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b, 0x43,
+0x74, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x54, 0x75, 0x62, 0x65, 0x1e5b, 0x3b, 0x57, 0x61, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b,
+0x44, 0x75, 0x1e7, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x46, 0x75, 0x1e5b,
+0x61, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x72, 0x65, 0x73, 0x3b, 0x59, 0x65, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79,
+0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b,
+0x43, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x54, 0x75, 0x62, 0x65, 0x1e5b, 0x3b, 0x4e, 0x75, 0x6e, 0x65, 0x6d, 0x62,
+0x65, 0x1e5b, 0x3b, 0x44, 0x75, 0x1e7, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x59, 0x65, 0x6e, 0x3b, 0x46, 0x75, 0x72, 0x3b, 0x4d,
0x65, 0x263, 0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194,
-0x75, 0x63, 0x3b, 0x43, 0x74, 0x65, 0x3b, 0x54, 0x75, 0x62, 0x3b, 0x4e, 0x75, 0x6e, 0x3b, 0x44, 0x75, 0x1e7, 0x3b, 0x59,
-0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x46, 0x75, 0x1e5b, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x72, 0x65, 0x73,
-0x3b, 0x59, 0x65, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b,
-0x59, 0x75, 0x6c, 0x79, 0x75, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b, 0x43, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x54,
-0x75, 0x62, 0x65, 0x1e5b, 0x3b, 0x4e, 0x75, 0x6e, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x44, 0x75, 0x1e7, 0x65, 0x6d, 0x62,
-0x65, 0x1e5b, 0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x194, 0x3b, 0x42, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4c, 0x3b, 0x43, 0x3b, 0x54,
-0x3b, 0x52, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x4b, 0x42, 0x5a, 0x3b, 0x4b, 0x42, 0x52, 0x3b, 0x4b, 0x53, 0x54, 0x3b, 0x4b,
-0x4b, 0x4e, 0x3b, 0x4b, 0x54, 0x4e, 0x3b, 0x4b, 0x4d, 0x4b, 0x3b, 0x4b, 0x4d, 0x53, 0x3b, 0x4b, 0x4d, 0x4e, 0x3b, 0x4b,
-0x4d, 0x57, 0x3b, 0x4b, 0x4b, 0x4d, 0x3b, 0x4b, 0x4e, 0x4b, 0x3b, 0x4b, 0x4e, 0x42, 0x3b, 0x4f, 0x6b, 0x77, 0x6f, 0x6b,
-0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4f, 0x6b,
-0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4f,
-0x6b, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61,
-0x67, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x6a, 0x75, 0x3b, 0x4f, 0x6b, 0x77, 0x61,
-0x6d, 0x75, 0x6e, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x77, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4f,
-0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e,
-0x61, 0x20, 0x6b, 0x75, 0x6d, 0x77, 0x65, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61,
-0x20, 0x69, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x48, 0x75, 0x74, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x44, 0x61, 0x74, 0x3b, 0x54,
-0x61, 0x69, 0x3b, 0x48, 0x61, 0x6e, 0x3b, 0x53, 0x69, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61, 0x6e, 0x3b, 0x54,
-0x69, 0x73, 0x3b, 0x4b, 0x75, 0x6d, 0x3b, 0x4b, 0x6d, 0x6a, 0x3b, 0x4b, 0x6d, 0x62, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77,
-0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x68, 0x75, 0x74, 0x61, 0x6c, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d,
-0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20,
-0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61,
-0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x74, 0x61, 0x69, 0x3b, 0x70, 0x61,
-0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70,
-0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x70, 0x61,
-0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x70, 0x61, 0x20,
-0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x61, 0x20, 0x6d,
-0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77,
-0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65,
-0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61,
-0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20,
-0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x48, 0x3b, 0x56, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x48, 0x3b, 0x53,
-0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69,
-0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x69,
-0x6c, 0x79, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x61, 0x69,
-0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74,
-0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b,
-0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x77, 0x69, 0x3b, 0x6d, 0x25b, 0x3b, 0x7a,
-0x75, 0x77, 0x3b, 0x7a, 0x75, 0x6c, 0x3b, 0x75, 0x74, 0x69, 0x3b, 0x73, 0x25b, 0x74, 0x3b, 0x254, 0x6b, 0x75, 0x3b, 0x6e,
-0x6f, 0x77, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x7a, 0x61, 0x6e, 0x77, 0x75, 0x79, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x75, 0x72,
-0x75, 0x79, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x69, 0x73, 0x69, 0x3b, 0x61, 0x77, 0x69, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x6d,
-0x25b, 0x3b, 0x7a, 0x75, 0x77, 0x25b, 0x6e, 0x3b, 0x7a, 0x75, 0x6c, 0x75, 0x79, 0x65, 0x3b, 0x75, 0x74, 0x69, 0x3b, 0x73,
-0x25b, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x254, 0x6b, 0x75, 0x74, 0x254, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x6e,
-0x6f, 0x77, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x64, 0x65, 0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x5a,
-0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x5a, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x186, 0x3b, 0x4e,
-0x3b, 0x44, 0x3b, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x61, 0x69, 0x3b, 0x4b, 0x61, 0x74, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x47,
-0x61, 0x74, 0x3b, 0x47, 0x61, 0x6e, 0x3b, 0x4d, 0x75, 0x67, 0x3b, 0x4b, 0x6e, 0x6e, 0x3b, 0x4b, 0x65, 0x6e, 0x3b, 0x49,
-0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b, 0x49, 0x67, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x129, 0x72, 0x69,
-0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77,
-0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74,
-0x61, 0x6e, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77,
-0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61,
-0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72,
-0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d, 0x77, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
-0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x4b, 0x61, 0x129, 0x72, 0x129, 0x3b, 0x4d, 0x3b,
-0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b,
-0x49, 0x3b, 0x13a4, 0x13c3, 0x3b, 0x13a7, 0x13a6, 0x3b, 0x13a0, 0x13c5, 0x3b, 0x13a7, 0x13ec, 0x3b, 0x13a0, 0x13c2, 0x3b, 0x13d5, 0x13ad, 0x3b,
-0x13ab, 0x13f0, 0x3b, 0x13a6, 0x13b6, 0x3b, 0x13da, 0x13b5, 0x3b, 0x13da, 0x13c2, 0x3b, 0x13c5, 0x13d3, 0x3b, 0x13a5, 0x13cd, 0x3b, 0x13a4, 0x13c3,
-0x13b8, 0x13d4, 0x13c5, 0x3b, 0x13a7, 0x13a6, 0x13b5, 0x3b, 0x13a0, 0x13c5, 0x13f1, 0x3b, 0x13a7, 0x13ec, 0x13c2, 0x3b, 0x13a0, 0x13c2, 0x13cd, 0x13ac,
-0x13d8, 0x3b, 0x13d5, 0x13ad, 0x13b7, 0x13f1, 0x3b, 0x13ab, 0x13f0, 0x13c9, 0x13c2, 0x3b, 0x13a6, 0x13b6, 0x13c2, 0x3b, 0x13da, 0x13b5, 0x13cd, 0x13d7,
-0x3b, 0x13da, 0x13c2, 0x13c5, 0x13d7, 0x3b, 0x13c5, 0x13d3, 0x13d5, 0x13c6, 0x3b, 0x13a5, 0x13cd, 0x13a9, 0x13f1, 0x3b, 0x13a4, 0x3b, 0x13a7, 0x3b,
-0x13a0, 0x3b, 0x13a7, 0x3b, 0x13a0, 0x3b, 0x13d5, 0x3b, 0x13ab, 0x3b, 0x13a6, 0x3b, 0x13da, 0x3b, 0x13da, 0x3b, 0x13c5, 0x3b, 0x13a5, 0x3b,
-0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x76, 0x72, 0x3b, 0x6d, 0x65, 0x3b, 0x7a,
-0x69, 0x6e, 0x3b, 0x7a, 0x69, 0x6c, 0x3b, 0x6f, 0x75, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e,
-0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x7a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x69, 0x79,
-0x65, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69, 0x6e, 0x3b,
-0x7a, 0x69, 0x6c, 0x79, 0x65, 0x3b, 0x6f, 0x75, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x3b, 0x6f, 0x6b, 0x74,
-0x6f, 0x62, 0x3b, 0x6e, 0x6f, 0x76, 0x61, 0x6d, 0x3b, 0x64, 0x65, 0x73, 0x61, 0x6d, 0x3b, 0x7a, 0x3b, 0x66, 0x3b, 0x6d,
-0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b, 0x7a, 0x3b, 0x6f, 0x3b, 0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x4d,
-0x77, 0x65, 0x64, 0x69, 0x20, 0x4e, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x50, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x54, 0x61, 0x74, 0x75, 0x3b,
-0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65,
-0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x55, 0x6d, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64,
-0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x69, 0x76, 0x69, 0x6c,
-0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61,
-0x20, 0x4d, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79,
-0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69,
-0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f,
+0x75, 0x63, 0x3b, 0x43, 0x74, 0x65, 0x3b, 0x54, 0x75, 0x62, 0x3b, 0x57, 0x61, 0x6d, 0x3b, 0x44, 0x75, 0x6a, 0x59, 0x65,
+0x6e, 0x3b, 0x46, 0x75, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75,
+0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b, 0x43, 0x74, 0x65, 0x3b, 0x54, 0x75, 0x62, 0x3b, 0x4e, 0x75,
+0x6e, 0x3b, 0x44, 0x75, 0x1e7, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x194,
+0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x44, 0x59, 0x3b, 0x46, 0x3b, 0x194, 0x3b, 0x42, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b,
+0x4c, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x52, 0x3b, 0x57, 0x3b, 0x44, 0x4f, 0x6b, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e,
+0x7a, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61,
+0x73, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b,
+0x61, 0x74, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x4f,
+0x6b, 0x77, 0x61, 0x6d, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x6a, 0x75, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x6e, 0x61,
+0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x77, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69,
+0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6b, 0x75,
+0x6d, 0x77, 0x65, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x62, 0x69,
+0x72, 0x69, 0x4b, 0x42, 0x5a, 0x3b, 0x4b, 0x42, 0x52, 0x3b, 0x4b, 0x53, 0x54, 0x3b, 0x4b, 0x4b, 0x4e, 0x3b, 0x4b, 0x54,
+0x4e, 0x3b, 0x4b, 0x4d, 0x4b, 0x3b, 0x4b, 0x4d, 0x53, 0x3b, 0x4b, 0x4d, 0x4e, 0x3b, 0x4b, 0x4d, 0x57, 0x3b, 0x4b, 0x4b,
+0x4d, 0x3b, 0x4b, 0x4e, 0x4b, 0x3b, 0x4b, 0x4e, 0x42, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67,
+0x77, 0x61, 0x20, 0x68, 0x75, 0x74, 0x61, 0x6c, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20,
+0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69,
+0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a,
+0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x74, 0x61, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a,
+0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x77, 0x75, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64,
+0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a,
+0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69,
+0x20, 0x67, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20,
+0x67, 0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67,
+0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77,
+0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77,
+0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69,
+0x6c, 0x69, 0x48, 0x75, 0x74, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x44, 0x61, 0x74, 0x3b, 0x54, 0x61, 0x69, 0x3b, 0x48, 0x61,
+0x6e, 0x3b, 0x53, 0x69, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61, 0x6e, 0x3b, 0x54, 0x69, 0x73, 0x3b, 0x4b, 0x75,
+0x6d, 0x3b, 0x4b, 0x6d, 0x6a, 0x3b, 0x4b, 0x6d, 0x62, 0x48, 0x3b, 0x56, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x48, 0x3b, 0x53,
+0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b,
+0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c,
+0x79, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x61, 0x69, 0x3b,
+0x41, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
+0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x7a, 0x61,
+0x6e, 0x77, 0x75, 0x79, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x75, 0x72, 0x75, 0x79, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x69, 0x73,
+0x69, 0x3b, 0x61, 0x77, 0x69, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x6d, 0x25b, 0x3b, 0x7a, 0x75, 0x77, 0x25b, 0x6e, 0x3b, 0x7a,
+0x75, 0x6c, 0x75, 0x79, 0x65, 0x3b, 0x75, 0x74, 0x69, 0x3b, 0x73, 0x25b, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b,
+0x254, 0x6b, 0x75, 0x74, 0x254, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x6e, 0x6f, 0x77, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b,
+0x64, 0x65, 0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72,
+0x3b, 0x61, 0x77, 0x69, 0x3b, 0x6d, 0x25b, 0x3b, 0x7a, 0x75, 0x77, 0x3b, 0x7a, 0x75, 0x6c, 0x3b, 0x75, 0x74, 0x69, 0x3b,
+0x73, 0x25b, 0x74, 0x3b, 0x254, 0x6b, 0x75, 0x3b, 0x6e, 0x6f, 0x77, 0x3b, 0x64, 0x65, 0x73, 0x5a, 0x3b, 0x46, 0x3b, 0x4d,
+0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x5a, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x186, 0x3b, 0x4e, 0x3b, 0x44, 0x4d, 0x77,
+0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77,
+0x61, 0x20, 0x6b, 0x61, 0x129, 0x72, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74,
+0x68, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d,
+0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69,
+0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
+0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61,
+0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6e,
+0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d, 0x77,
+0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d, 0x77, 0x65,
+0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x4b,
+0x61, 0x129, 0x72, 0x129, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x61, 0x69, 0x3b, 0x4b, 0x61, 0x74, 0x3b, 0x4b, 0x61, 0x6e, 0x3b,
+0x47, 0x61, 0x74, 0x3b, 0x47, 0x61, 0x6e, 0x3b, 0x4d, 0x75, 0x67, 0x3b, 0x4b, 0x6e, 0x6e, 0x3b, 0x4b, 0x65, 0x6e, 0x3b,
+0x49, 0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b, 0x49, 0x67, 0x69, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x47,
+0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x13a4, 0x13c3, 0x13b8, 0x13d4, 0x13c5, 0x3b,
+0x13a7, 0x13a6, 0x13b5, 0x3b, 0x13a0, 0x13c5, 0x13f1, 0x3b, 0x13a7, 0x13ec, 0x13c2, 0x3b, 0x13a0, 0x13c2, 0x13cd, 0x13ac, 0x13d8, 0x3b, 0x13d5, 0x13ad,
+0x13b7, 0x13f1, 0x3b, 0x13ab, 0x13f0, 0x13c9, 0x13c2, 0x3b, 0x13a6, 0x13b6, 0x13c2, 0x3b, 0x13da, 0x13b5, 0x13cd, 0x13d7, 0x3b, 0x13da, 0x13c2, 0x13c5,
+0x13d7, 0x3b, 0x13c5, 0x13d3, 0x13d5, 0x13c6, 0x3b, 0x13a5, 0x13cd, 0x13a9, 0x13f1, 0x13a4, 0x13c3, 0x3b, 0x13a7, 0x13a6, 0x3b, 0x13a0, 0x13c5, 0x3b,
+0x13a7, 0x13ec, 0x3b, 0x13a0, 0x13c2, 0x3b, 0x13d5, 0x13ad, 0x3b, 0x13ab, 0x13f0, 0x3b, 0x13a6, 0x13b6, 0x3b, 0x13da, 0x13b5, 0x3b, 0x13da, 0x13c2,
+0x3b, 0x13c5, 0x13d3, 0x3b, 0x13a5, 0x13cd, 0x13a4, 0x3b, 0x13a7, 0x3b, 0x13a0, 0x3b, 0x13a7, 0x3b, 0x13a0, 0x3b, 0x13d5, 0x3b, 0x13ab, 0x3b,
+0x13a6, 0x3b, 0x13da, 0x3b, 0x13da, 0x3b, 0x13c5, 0x3b, 0x13a5, 0x7a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x3b, 0x66, 0x65, 0x76, 0x72,
+0x69, 0x79, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69,
+0x6e, 0x3b, 0x7a, 0x69, 0x6c, 0x79, 0x65, 0x3b, 0x6f, 0x75, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x3b, 0x6f,
+0x6b, 0x74, 0x6f, 0x62, 0x3b, 0x6e, 0x6f, 0x76, 0x61, 0x6d, 0x3b, 0x64, 0x65, 0x73, 0x61, 0x6d, 0x7a, 0x61, 0x6e, 0x3b,
+0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x76, 0x72, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69, 0x6e, 0x3b, 0x7a,
+0x69, 0x6c, 0x3b, 0x6f, 0x75, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64,
+0x65, 0x73, 0x7a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b, 0x7a, 0x3b, 0x6f, 0x3b, 0x73, 0x3b,
+0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x4e, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x3b, 0x4d, 0x77,
+0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61,
+0x20, 0x54, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x63, 0x68, 0x65, 0x63,
+0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4d,
+0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x55, 0x6d,
+0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61,
+0x20, 0x4d, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79,
+0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20,
+0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69,
0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20,
-0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x55, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61,
-0x20, 0x4d, 0x3b, 0x46, 0xfa, 0x6e, 0x67, 0x61, 0x74, 0x268, 0x3b, 0x4e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x65, 0x65,
-0x6e, 0x64, 0x61, 0x3b, 0x49, 0x6b, 0xfa, 0x6d, 0x69, 0x3b, 0x49, 0x6e, 0x79, 0x61, 0x6d, 0x62, 0x61, 0x6c, 0x61, 0x3b,
-0x49, 0x64, 0x77, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x4d, 0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x56, 0x268, 0x268, 0x72,
-0x268, 0x3b, 0x53, 0x61, 0x61, 0x74, 0x289, 0x3b, 0x49, 0x6e, 0x79, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x53,
-0x61, 0x73, 0x61, 0x74, 0x289, 0x3b, 0x4b, 0x289, 0x66, 0xfa, 0x6e, 0x67, 0x61, 0x74, 0x268, 0x3b, 0x4b, 0x289, 0x6e, 0x61,
-0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x289, 0x6b, 0x65, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6b, 0x75, 0x6d,
-0x69, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79, 0x61, 0x6d, 0x62, 0xe1, 0x6c, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x64,
-0x77, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x4b, 0x289, 0x6d, 0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x4b, 0x289, 0x76, 0x268,
-0x268, 0x72, 0x268, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x61, 0x74, 0x289, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79, 0x69, 0x3b,
-0x4b, 0x289, 0x73, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x73, 0x61, 0x74, 0x289, 0x3b, 0x46, 0x3b, 0x4e,
-0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x53,
-0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x75, 0x3b, 0x4d, 0x61, 0x61,
-0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x62, 0x3b, 0x4f, 0x6b, 0x69,
-0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x77, 0x61, 0x6c, 0x69, 0x79, 0x6f, 0x3b, 0x46,
-0x65, 0x62, 0x77, 0x61, 0x6c, 0x69, 0x79, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x70, 0x75, 0x6c,
-0x69, 0x3b, 0x4d, 0x61, 0x61, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x61, 0x79,
-0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x69, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x62, 0x75, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x61,
-0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65,
-0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x45, 0x70,
-0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61, 0x3b, 0x53, 0x65,
-0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72,
-0x65, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67,
-0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61,
-0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x46,
-0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44,
-0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69,
-0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75,
-0x3b, 0x4e, 0x75, 0x76, 0x3b, 0x44, 0x69, 0x7a, 0x3b, 0x4a, 0x61, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x46, 0x65, 0x62, 0x72,
-0x65, 0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x75, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x75,
-0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x75, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x75, 0x3b,
-0x53, 0x65, 0x74, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x75, 0x76, 0x65,
-0x6e, 0x62, 0x72, 0x75, 0x3b, 0x44, 0x69, 0x7a, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x4a, 0x41, 0x4e, 0x3b, 0x46, 0x45,
+0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61,
+0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x55, 0x3b, 0x4d, 0x77,
+0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79,
+0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x4b, 0x289, 0x66, 0xfa, 0x6e, 0x67, 0x61, 0x74, 0x268, 0x3b, 0x4b, 0x289,
+0x6e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x289, 0x6b, 0x65, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6b,
+0x75, 0x6d, 0x69, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79, 0x61, 0x6d, 0x62, 0xe1, 0x6c, 0x61, 0x3b, 0x4b, 0x77, 0x69,
+0x69, 0x64, 0x77, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x4b, 0x289, 0x6d, 0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x4b, 0x289,
+0x76, 0x268, 0x268, 0x72, 0x268, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x61, 0x74, 0x289, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79,
+0x69, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x73, 0x61, 0x74, 0x289, 0x46, 0xfa,
+0x6e, 0x67, 0x61, 0x74, 0x268, 0x3b, 0x4e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x65, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x49,
+0x6b, 0xfa, 0x6d, 0x69, 0x3b, 0x49, 0x6e, 0x79, 0x61, 0x6d, 0x62, 0x61, 0x6c, 0x61, 0x3b, 0x49, 0x64, 0x77, 0x61, 0x61,
+0x74, 0x61, 0x3b, 0x4d, 0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x56, 0x268, 0x268, 0x72, 0x268, 0x3b, 0x53, 0x61, 0x61,
+0x74, 0x289, 0x3b, 0x49, 0x6e, 0x79, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x53, 0x61, 0x73, 0x61, 0x74, 0x289,
+0x46, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x49, 0x3b,
+0x53, 0x3b, 0x53, 0x4a, 0x61, 0x6e, 0x77, 0x61, 0x6c, 0x69, 0x79, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x77, 0x61, 0x6c, 0x69,
+0x79, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x70, 0x75, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x61, 0x79,
+0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73,
+0x69, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x62, 0x75, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f,
+0x62, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a,
+0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x75, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4a,
+0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x62, 0x3b, 0x4f, 0x6b, 0x69, 0x3b, 0x4e,
+0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61,
+0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a,
+0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70,
+0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61,
+0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b,
+0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61, 0x3b,
+0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x4a, 0x3b, 0x46, 0x3b, 0x4d,
+0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x4a, 0x61,
+0x6e, 0x65, 0x72, 0x75, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x75, 0x3b, 0x41,
+0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x75, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x68,
+0x75, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x75, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x4f, 0x74,
+0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x75, 0x76, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x44, 0x69, 0x7a, 0x65, 0x6e, 0x62,
+0x72, 0x75, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61,
+0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74,
+0x75, 0x3b, 0x4e, 0x75, 0x76, 0x3b, 0x44, 0x69, 0x7a, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x46, 0x65, 0x62,
+0x75, 0x72, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x128, 0x70, 0x75, 0x72, 0x169, 0x3b, 0x4d,
+0x129, 0x129, 0x3b, 0x4e, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x72, 0x61, 0x129, 0x3b, 0x41, 0x67, 0x61, 0x73,
+0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x169, 0x62, 0x61, 0x3b, 0x4e,
+0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x4a, 0x41, 0x4e, 0x3b, 0x46, 0x45,
0x42, 0x3b, 0x4d, 0x41, 0x43, 0x3b, 0x128, 0x50, 0x55, 0x3b, 0x4d, 0x128, 0x128, 0x3b, 0x4e, 0x4a, 0x55, 0x3b, 0x4e, 0x4a,
0x52, 0x3b, 0x41, 0x47, 0x41, 0x3b, 0x53, 0x50, 0x54, 0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4e, 0x4f, 0x56, 0x3b, 0x44, 0x45,
-0x43, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x75, 0x61, 0x72, 0x129, 0x3b,
-0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x128, 0x70, 0x75, 0x72, 0x169, 0x3b, 0x4d, 0x129, 0x129, 0x3b, 0x4e, 0x6a, 0x75, 0x6e,
-0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x72, 0x61, 0x129, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74,
-0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x169, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b,
-0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x128, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b,
-0x4e, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4d, 0x75, 0x6c, 0x3b, 0x4e, 0x67, 0x61, 0x74,
-0x3b, 0x54, 0x61, 0x61, 0x3b, 0x49, 0x77, 0x6f, 0x3b, 0x4d, 0x61, 0x6d, 0x3b, 0x50, 0x61, 0x61, 0x3b, 0x4e, 0x67, 0x65,
-0x3b, 0x52, 0x6f, 0x6f, 0x3b, 0x42, 0x75, 0x72, 0x3b, 0x45, 0x70, 0x65, 0x3b, 0x4b, 0x70, 0x74, 0x3b, 0x4b, 0x70, 0x61,
-0x3b, 0x4d, 0x75, 0x6c, 0x67, 0x75, 0x6c, 0x3b, 0x4e, 0x67, 0x2019, 0x61, 0x74, 0x79, 0x61, 0x61, 0x74, 0x6f, 0x3b, 0x4b,
-0x69, 0x70, 0x74, 0x61, 0x61, 0x6d, 0x6f, 0x3b, 0x49, 0x77, 0x6f, 0x6f, 0x74, 0x6b, 0x75, 0x75, 0x74, 0x3b, 0x4d, 0x61,
-0x6d, 0x75, 0x75, 0x74, 0x3b, 0x50, 0x61, 0x61, 0x67, 0x69, 0x3b, 0x4e, 0x67, 0x2019, 0x65, 0x69, 0x79, 0x65, 0x65, 0x74,
-0x3b, 0x52, 0x6f, 0x6f, 0x70, 0x74, 0x75, 0x69, 0x3b, 0x42, 0x75, 0x72, 0x65, 0x65, 0x74, 0x3b, 0x45, 0x70, 0x65, 0x65,
-0x73, 0x6f, 0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x75, 0x6e, 0x64, 0x65, 0x20, 0x6e, 0x65, 0x20, 0x74, 0x61, 0x61, 0x69,
-0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x75, 0x6e, 0x64, 0x65, 0x20, 0x6e, 0x65, 0x62, 0x6f, 0x20, 0x61, 0x65, 0x6e, 0x67,
-0x2019, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x4e, 0x3b, 0x52, 0x3b, 0x42, 0x3b,
-0x45, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x1c3, 0x4b, 0x68, 0x61, 0x6e, 0x6e, 0x69, 0x3b, 0x1c3, 0x4b, 0x68, 0x61, 0x6e, 0x1c0,
-0x67, 0xf4, 0x61, 0x62, 0x3b, 0x1c0, 0x4b, 0x68, 0x75, 0x75, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c3, 0x48, 0xf4, 0x61,
-0x1c2, 0x6b, 0x68, 0x61, 0x69, 0x62, 0x3b, 0x1c3, 0x4b, 0x68, 0x61, 0x69, 0x74, 0x73, 0xe2, 0x62, 0x3b, 0x47, 0x61, 0x6d,
-0x61, 0x1c0, 0x61, 0x65, 0x62, 0x3b, 0x1c2, 0x4b, 0x68, 0x6f, 0x65, 0x73, 0x61, 0x6f, 0x62, 0x3b, 0x41, 0x6f, 0x1c1, 0x6b,
-0x68, 0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x54, 0x61, 0x72, 0x61, 0x1c0, 0x6b, 0x68, 0x75, 0x75,
-0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c2, 0x4e, 0xfb, 0x1c1, 0x6e, 0xe2, 0x69, 0x73, 0x65, 0x62, 0x3b, 0x1c0,
-0x48, 0x6f, 0x6f, 0x1c2, 0x67, 0x61, 0x65, 0x62, 0x3b, 0x48, 0xf4, 0x61, 0x73, 0x6f, 0x72, 0x65, 0x1c1, 0x6b, 0x68, 0xe2,
-0x62, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0xe4, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x7a, 0x2e, 0x3b, 0x41, 0x70, 0x72,
-0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x4f, 0x75, 0x6a, 0x2e,
-0x3b, 0x53, 0xe4, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e,
-0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x65, 0x77, 0x61, 0x3b, 0x46, 0xe4, 0x62, 0x72, 0x6f, 0x77, 0x61, 0x3b, 0x4d, 0xe4, 0xe4,
-0x7a, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a,
-0x75, 0x75, 0x6c, 0x69, 0x3b, 0x4f, 0x75, 0x6a, 0x6f, 0xdf, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x68, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44,
-0x65, 0x7a, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0xe4, 0x62, 0x3b, 0x4d, 0xe4, 0x7a, 0x3b,
-0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x75, 0x6a, 0x3b,
-0x53, 0xe4, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x44, 0x61, 0x6c, 0x3b,
-0x41, 0x72, 0xe1, 0x3b, 0x186, 0x25b, 0x6e, 0x3b, 0x44, 0x6f, 0x79, 0x3b, 0x4c, 0xe9, 0x70, 0x3b, 0x52, 0x6f, 0x6b, 0x3b,
-0x53, 0xe1, 0x73, 0x3b, 0x42, 0x254, 0x301, 0x72, 0x3b, 0x4b, 0xfa, 0x73, 0x3b, 0x47, 0xed, 0x73, 0x3b, 0x53, 0x68, 0x289,
-0x301, 0x3b, 0x4e, 0x74, 0x289, 0x301, 0x3b, 0x4f, 0x6c, 0x61, 0x64, 0x61, 0x6c, 0x289, 0x301, 0x3b, 0x41, 0x72, 0xe1, 0x74,
-0x3b, 0x186, 0x25b, 0x6e, 0x268, 0x301, 0x254, 0x268, 0x14b, 0x254, 0x6b, 0x3b, 0x4f, 0x6c, 0x6f, 0x64, 0x6f, 0x79, 0xed, 0xf3,
-0x72, 0xed, 0xea, 0x20, 0x69, 0x6e, 0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4f, 0x6c, 0x6f, 0x69, 0x6c, 0xe9, 0x70, 0x16b,
-0x6e, 0x79, 0x12b, 0x113, 0x20, 0x69, 0x6e, 0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4b, 0xfa, 0x6a, 0xfa, 0x254, 0x72, 0x254,
-0x6b, 0x3b, 0x4d, 0xf3, 0x72, 0x75, 0x73, 0xe1, 0x73, 0x69, 0x6e, 0x3b, 0x186, 0x6c, 0x254, 0x301, 0x268, 0x301, 0x62, 0x254,
-0x301, 0x72, 0xe1, 0x72, 0x25b, 0x3b, 0x4b, 0xfa, 0x73, 0x68, 0xee, 0x6e, 0x3b, 0x4f, 0x6c, 0x67, 0xed, 0x73, 0x61, 0x6e,
-0x3b, 0x50, 0x289, 0x73, 0x68, 0x289, 0x301, 0x6b, 0x61, 0x3b, 0x4e, 0x74, 0x289, 0x301, 0x14b, 0x289, 0x301, 0x73, 0x3b, 0x4a,
-0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a,
-0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e,
-0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41,
-0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53,
-0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x4d,
-0x75, 0x6b, 0x3b, 0x4b, 0x77, 0x61, 0x3b, 0x44, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x6f, 0x64, 0x3b, 0x4a,
-0x6f, 0x6c, 0x3b, 0x50, 0x65, 0x64, 0x3b, 0x53, 0x6f, 0x6b, 0x3b, 0x54, 0x69, 0x62, 0x3b, 0x4c, 0x61, 0x62, 0x3b, 0x50,
-0x6f, 0x6f, 0x3b, 0x4f, 0x72, 0x61, 0x72, 0x61, 0x3b, 0x4f, 0x6d, 0x75, 0x6b, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x67,
-0x2019, 0x3b, 0x4f, 0x64, 0x75, 0x6e, 0x67, 0x2019, 0x65, 0x6c, 0x3b, 0x4f, 0x6d, 0x61, 0x72, 0x75, 0x6b, 0x3b, 0x4f, 0x6d,
-0x6f, 0x64, 0x6f, 0x6b, 0x2019, 0x6b, 0x69, 0x6e, 0x67, 0x2019, 0x6f, 0x6c, 0x3b, 0x4f, 0x6a, 0x6f, 0x6c, 0x61, 0x3b, 0x4f,
-0x70, 0x65, 0x64, 0x65, 0x6c, 0x3b, 0x4f, 0x73, 0x6f, 0x6b, 0x6f, 0x73, 0x6f, 0x6b, 0x6f, 0x6d, 0x61, 0x3b, 0x4f, 0x74,
-0x69, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x3b, 0x4f, 0x70, 0x6f, 0x6f, 0x3b, 0x52, 0x3b, 0x4d,
-0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x50,
-0x3b, 0x17d, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x69, 0x3b, 0x4d, 0x65, 0x3b,
-0x17d, 0x75, 0x77, 0x3b, 0x17d, 0x75, 0x79, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e,
-0x6f, 0x6f, 0x3b, 0x44, 0x65, 0x65, 0x3b, 0x17d, 0x61, 0x6e, 0x77, 0x69, 0x79, 0x65, 0x3b, 0x46, 0x65, 0x65, 0x77, 0x69,
-0x72, 0x69, 0x79, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x69, 0x3b, 0x41, 0x77, 0x69, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65,
-0x3b, 0x17d, 0x75, 0x77, 0x65, 0x14b, 0x3b, 0x17d, 0x75, 0x79, 0x79, 0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b, 0x74,
-0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x75, 0x72, 0x3b, 0x4e, 0x6f, 0x6f, 0x77, 0x61,
-0x6e, 0x62, 0x75, 0x72, 0x3b, 0x44, 0x65, 0x65, 0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x17d, 0x3b, 0x46, 0x3b, 0x4d,
-0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x17d, 0x3b, 0x17d, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x44,
+0x43, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x128, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
+0x3b, 0x4e, 0x3b, 0x44, 0x4d, 0x75, 0x6c, 0x67, 0x75, 0x6c, 0x3b, 0x4e, 0x67, 0x2019, 0x61, 0x74, 0x79, 0x61, 0x61, 0x74,
+0x6f, 0x3b, 0x4b, 0x69, 0x70, 0x74, 0x61, 0x61, 0x6d, 0x6f, 0x3b, 0x49, 0x77, 0x6f, 0x6f, 0x74, 0x6b, 0x75, 0x75, 0x74,
+0x3b, 0x4d, 0x61, 0x6d, 0x75, 0x75, 0x74, 0x3b, 0x50, 0x61, 0x61, 0x67, 0x69, 0x3b, 0x4e, 0x67, 0x2019, 0x65, 0x69, 0x79,
+0x65, 0x65, 0x74, 0x3b, 0x52, 0x6f, 0x6f, 0x70, 0x74, 0x75, 0x69, 0x3b, 0x42, 0x75, 0x72, 0x65, 0x65, 0x74, 0x3b, 0x45,
+0x70, 0x65, 0x65, 0x73, 0x6f, 0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x75, 0x6e, 0x64, 0x65, 0x20, 0x6e, 0x65, 0x20, 0x74,
+0x61, 0x61, 0x69, 0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x75, 0x6e, 0x64, 0x65, 0x20, 0x6e, 0x65, 0x62, 0x6f, 0x20, 0x61,
+0x65, 0x6e, 0x67, 0x2019, 0x4d, 0x75, 0x6c, 0x3b, 0x4e, 0x67, 0x61, 0x74, 0x3b, 0x54, 0x61, 0x61, 0x3b, 0x49, 0x77, 0x6f,
+0x3b, 0x4d, 0x61, 0x6d, 0x3b, 0x50, 0x61, 0x61, 0x3b, 0x4e, 0x67, 0x65, 0x3b, 0x52, 0x6f, 0x6f, 0x3b, 0x42, 0x75, 0x72,
+0x3b, 0x45, 0x70, 0x65, 0x3b, 0x4b, 0x70, 0x74, 0x3b, 0x4b, 0x70, 0x61, 0x4d, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49, 0x3b,
+0x4d, 0x3b, 0x50, 0x3b, 0x4e, 0x3b, 0x52, 0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x4b, 0x1c3, 0x4b, 0x68, 0x61, 0x6e,
+0x6e, 0x69, 0x3b, 0x1c3, 0x4b, 0x68, 0x61, 0x6e, 0x1c0, 0x67, 0xf4, 0x61, 0x62, 0x3b, 0x1c0, 0x4b, 0x68, 0x75, 0x75, 0x1c1,
+0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c3, 0x48, 0xf4, 0x61, 0x1c2, 0x6b, 0x68, 0x61, 0x69, 0x62, 0x3b, 0x1c3, 0x4b, 0x68, 0x61,
+0x69, 0x74, 0x73, 0xe2, 0x62, 0x3b, 0x47, 0x61, 0x6d, 0x61, 0x1c0, 0x61, 0x65, 0x62, 0x3b, 0x1c2, 0x4b, 0x68, 0x6f, 0x65,
+0x73, 0x61, 0x6f, 0x62, 0x3b, 0x41, 0x6f, 0x1c1, 0x6b, 0x68, 0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b,
+0x54, 0x61, 0x72, 0x61, 0x1c0, 0x6b, 0x68, 0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c2, 0x4e, 0xfb,
+0x1c1, 0x6e, 0xe2, 0x69, 0x73, 0x65, 0x62, 0x3b, 0x1c0, 0x48, 0x6f, 0x6f, 0x1c2, 0x67, 0x61, 0x65, 0x62, 0x3b, 0x48, 0xf4,
+0x61, 0x73, 0x6f, 0x72, 0x65, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x4a, 0x61, 0x6e, 0x6e, 0x65, 0x77, 0x61, 0x3b, 0x46, 0xe4,
+0x62, 0x72, 0x6f, 0x77, 0x61, 0x3b, 0x4d, 0xe4, 0xe4, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x6c, 0x3b, 0x4d, 0x61,
+0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x4f, 0x75, 0x6a, 0x6f, 0xdf, 0x3b,
+0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x68, 0x62, 0x65, 0x72, 0x3b, 0x4e,
+0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x61, 0x6e, 0x2e,
+0x3b, 0x46, 0xe4, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x7a, 0x2e, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b,
+0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x4f, 0x75, 0x6a, 0x2e, 0x3b, 0x53, 0xe4, 0x70, 0x2e, 0x3b,
+0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0xe4,
+0x62, 0x3b, 0x4d, 0xe4, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75,
+0x6c, 0x3b, 0x4f, 0x75, 0x6a, 0x3b, 0x53, 0xe4, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65,
+0x7a, 0x4f, 0x6c, 0x61, 0x64, 0x61, 0x6c, 0x289, 0x301, 0x3b, 0x41, 0x72, 0xe1, 0x74, 0x3b, 0x186, 0x25b, 0x6e, 0x268, 0x301,
+0x254, 0x268, 0x14b, 0x254, 0x6b, 0x3b, 0x4f, 0x6c, 0x6f, 0x64, 0x6f, 0x79, 0xed, 0xf3, 0x72, 0xed, 0xea, 0x20, 0x69, 0x6e,
+0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4f, 0x6c, 0x6f, 0x69, 0x6c, 0xe9, 0x70, 0x16b, 0x6e, 0x79, 0x12b, 0x113, 0x20, 0x69,
+0x6e, 0x6b, 0xf3, 0x6b, 0xfa, 0xe2, 0x3b, 0x4b, 0xfa, 0x6a, 0xfa, 0x254, 0x72, 0x254, 0x6b, 0x3b, 0x4d, 0xf3, 0x72, 0x75,
+0x73, 0xe1, 0x73, 0x69, 0x6e, 0x3b, 0x186, 0x6c, 0x254, 0x301, 0x268, 0x301, 0x62, 0x254, 0x301, 0x72, 0xe1, 0x72, 0x25b, 0x3b,
+0x4b, 0xfa, 0x73, 0x68, 0xee, 0x6e, 0x3b, 0x4f, 0x6c, 0x67, 0xed, 0x73, 0x61, 0x6e, 0x3b, 0x50, 0x289, 0x73, 0x68, 0x289,
+0x301, 0x6b, 0x61, 0x3b, 0x4e, 0x74, 0x289, 0x301, 0x14b, 0x289, 0x301, 0x73, 0x44, 0x61, 0x6c, 0x3b, 0x41, 0x72, 0xe1, 0x3b,
+0x186, 0x25b, 0x6e, 0x3b, 0x44, 0x6f, 0x79, 0x3b, 0x4c, 0xe9, 0x70, 0x3b, 0x52, 0x6f, 0x6b, 0x3b, 0x53, 0xe1, 0x73, 0x3b,
+0x42, 0x254, 0x301, 0x72, 0x3b, 0x4b, 0xfa, 0x73, 0x3b, 0x47, 0xed, 0x73, 0x3b, 0x53, 0x68, 0x289, 0x301, 0x3b, 0x4e, 0x74,
+0x289, 0x301, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65,
+0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b,
+0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63,
+0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f,
+0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x4f, 0x72, 0x61, 0x72,
+0x61, 0x3b, 0x4f, 0x6d, 0x75, 0x6b, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x67, 0x2019, 0x3b, 0x4f, 0x64, 0x75, 0x6e, 0x67,
+0x2019, 0x65, 0x6c, 0x3b, 0x4f, 0x6d, 0x61, 0x72, 0x75, 0x6b, 0x3b, 0x4f, 0x6d, 0x6f, 0x64, 0x6f, 0x6b, 0x2019, 0x6b, 0x69,
+0x6e, 0x67, 0x2019, 0x6f, 0x6c, 0x3b, 0x4f, 0x6a, 0x6f, 0x6c, 0x61, 0x3b, 0x4f, 0x70, 0x65, 0x64, 0x65, 0x6c, 0x3b, 0x4f,
+0x73, 0x6f, 0x6b, 0x6f, 0x73, 0x6f, 0x6b, 0x6f, 0x6d, 0x61, 0x3b, 0x4f, 0x74, 0x69, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6c,
+0x61, 0x62, 0x6f, 0x72, 0x3b, 0x4f, 0x70, 0x6f, 0x6f, 0x52, 0x61, 0x72, 0x3b, 0x4d, 0x75, 0x6b, 0x3b, 0x4b, 0x77, 0x61,
+0x3b, 0x44, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x6f, 0x64, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x50, 0x65, 0x64,
+0x3b, 0x53, 0x6f, 0x6b, 0x3b, 0x54, 0x69, 0x62, 0x3b, 0x4c, 0x61, 0x62, 0x3b, 0x50, 0x6f, 0x6f, 0x52, 0x3b, 0x4d, 0x3b,
+0x4b, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x50, 0x17d,
+0x61, 0x6e, 0x77, 0x69, 0x79, 0x65, 0x3b, 0x46, 0x65, 0x65, 0x77, 0x69, 0x72, 0x69, 0x79, 0x65, 0x3b, 0x4d, 0x61, 0x72,
+0x73, 0x69, 0x3b, 0x41, 0x77, 0x69, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x3b, 0x17d, 0x75, 0x77, 0x65, 0x14b, 0x3b, 0x17d,
+0x75, 0x79, 0x79, 0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x4f, 0x6b,
+0x74, 0x6f, 0x6f, 0x62, 0x75, 0x72, 0x3b, 0x4e, 0x6f, 0x6f, 0x77, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x44, 0x65, 0x65,
+0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x17d, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77,
+0x69, 0x3b, 0x4d, 0x65, 0x3b, 0x17d, 0x75, 0x77, 0x3b, 0x17d, 0x75, 0x79, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b, 0x3b,
+0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x6f, 0x3b, 0x44, 0x65, 0x65, 0x17d, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d,
+0x3b, 0x17d, 0x3b, 0x17d, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61,
+0x72, 0x20, 0x41, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x72, 0x69,
+0x79, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x64, 0x65, 0x6b, 0x3b, 0x44, 0x77, 0x65, 0x20,
+0x6d, 0x61, 0x72, 0x20, 0x41, 0x6e, 0x67, 0x2019, 0x77, 0x65, 0x6e, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20,
+0x41, 0x62, 0x69, 0x63, 0x68, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x75, 0x63, 0x68, 0x69, 0x65,
+0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x69, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x44, 0x77,
+0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20,
+0x4f, 0x63, 0x68, 0x69, 0x6b, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x70, 0x61, 0x72, 0x3b,
+0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x67, 0x69, 0x20, 0x61, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77,
+0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x70, 0x61, 0x72, 0x20, 0x67, 0x69, 0x20, 0x61, 0x72, 0x69, 0x79, 0x6f, 0x44,
0x41, 0x43, 0x3b, 0x44, 0x41, 0x52, 0x3b, 0x44, 0x41, 0x44, 0x3b, 0x44, 0x41, 0x4e, 0x3b, 0x44, 0x41, 0x48, 0x3b, 0x44,
0x41, 0x55, 0x3b, 0x44, 0x41, 0x4f, 0x3b, 0x44, 0x41, 0x42, 0x3b, 0x44, 0x4f, 0x43, 0x3b, 0x44, 0x41, 0x50, 0x3b, 0x44,
-0x47, 0x49, 0x3b, 0x44, 0x41, 0x47, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x63, 0x68, 0x69, 0x65,
-0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20,
-0x6d, 0x61, 0x72, 0x20, 0x41, 0x64, 0x65, 0x6b, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x6e, 0x67,
-0x2019, 0x77, 0x65, 0x6e, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x69, 0x63, 0x68, 0x3b, 0x44,
-0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x75, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d,
-0x61, 0x72, 0x20, 0x41, 0x62, 0x69, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41,
-0x62, 0x6f, 0x72, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4f, 0x63, 0x68, 0x69, 0x6b, 0x6f, 0x3b,
-0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x70, 0x61, 0x72, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72,
-0x20, 0x67, 0x69, 0x20, 0x61, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41,
-0x70, 0x61, 0x72, 0x20, 0x67, 0x69, 0x20, 0x61, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x43, 0x3b, 0x52, 0x3b, 0x44, 0x3b, 0x4e,
-0x3b, 0x42, 0x3b, 0x55, 0x3b, 0x42, 0x3b, 0x42, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x59, 0x65, 0x6e,
-0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x49, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e,
-0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b, 0x43, 0x75, 0x74, 0x3b, 0x4b, 0x1e6d, 0x75, 0x3b, 0x4e, 0x77, 0x61,
-0x3b, 0x44, 0x75, 0x6a, 0x3b, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x59, 0x65, 0x62, 0x72, 0x61, 0x79,
-0x65, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x3b, 0x49, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x79, 0x75, 0x3b,
-0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b, 0x43, 0x75,
-0x74, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x4b, 0x1e6d, 0x75, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x77, 0x61, 0x6e, 0x62, 0x69,
-0x72, 0x3b, 0x44, 0x75, 0x6a, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x4d,
-0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x194, 0x3b, 0x43, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61,
-0x6c, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70,
-0x6c, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b,
-0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
-0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x91c,
-0x93e, 0x928, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e,
-0x93e, 0x930, 0x94d, 0x938, 0x3b, 0x90f, 0x92b, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c,
-0x941, 0x932, 0x93e, 0x907, 0x3b, 0x906, 0x917, 0x938, 0x94d, 0x925, 0x3b, 0x938, 0x947, 0x92c, 0x925, 0x947, 0x91c, 0x94d, 0x92c, 0x93c,
-0x930, 0x3b, 0x905, 0x916, 0x925, 0x92c, 0x930, 0x3b, 0x928, 0x92c, 0x947, 0x91c, 0x94d, 0x92c, 0x93c, 0x930, 0x3b, 0x926, 0x93f, 0x938,
-0x947, 0x91c, 0x94d, 0x92c, 0x93c, 0x930, 0x3b, 0x91c, 0x3b, 0x92b, 0x947, 0x3b, 0x92e, 0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b,
-0x91c, 0x941, 0x3b, 0x91c, 0x941, 0x3b, 0x906, 0x3b, 0x938, 0x947, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x3b, 0x456, 0x486,
-0x430, 0x2de9, 0x487, 0x3b, 0x444, 0x435, 0x2de1, 0x487, 0x3b, 0x43c, 0x430, 0x2dec, 0x487, 0x3b, 0x430, 0x486, 0x43f, 0x2dec, 0x487, 0x3b,
-0x43c, 0x430, 0xa675, 0x3b, 0x456, 0x486, 0xa64b, 0x2de9, 0x487, 0x3b, 0x456, 0x486, 0xa64b, 0x2de7, 0x487, 0x3b, 0x430, 0x486, 0x301, 0x475,
-0x2de2, 0x487, 0x3b, 0x441, 0x435, 0x2deb, 0x487, 0x3b, 0x47b, 0x486, 0x43a, 0x2dee, 0x3b, 0x43d, 0x43e, 0x435, 0x2de8, 0x3b, 0x434, 0x435,
-0x2de6, 0x487, 0x3b, 0x456, 0x486, 0x430, 0x43d, 0x43d, 0xa64b, 0x430, 0x301, 0x440, 0x457, 0x439, 0x3b, 0x444, 0x435, 0x432, 0x440, 0xa64b,
-0x430, 0x301, 0x440, 0x457, 0x439, 0x3b, 0x43c, 0x430, 0x301, 0x440, 0x442, 0x44a, 0x3b, 0x430, 0x486, 0x43f, 0x440, 0x456, 0x301, 0x43b,
-0x43b, 0x457, 0x439, 0x3b, 0x43c, 0x430, 0x301, 0x457, 0x439, 0x3b, 0x456, 0x486, 0xa64b, 0x301, 0x43d, 0x457, 0x439, 0x3b, 0x456, 0x486,
-0xa64b, 0x301, 0x43b, 0x457, 0x439, 0x3b, 0x430, 0x486, 0x301, 0x475, 0x433, 0xa64b, 0x441, 0x442, 0x44a, 0x3b, 0x441, 0x435, 0x43f, 0x442,
-0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x439, 0x3b, 0x47b, 0x486, 0x43a, 0x442, 0x461, 0x301, 0x432, 0x440, 0x457, 0x439, 0x3b, 0x43d,
-0x43e, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x439, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x439, 0x3b,
+0x47, 0x49, 0x3b, 0x44, 0x41, 0x47, 0x43, 0x3b, 0x52, 0x3b, 0x44, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x55, 0x3b, 0x42, 0x3b,
+0x42, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x50, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x59, 0x65,
+0x62, 0x72, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x3b, 0x49, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61,
+0x79, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x194, 0x75, 0x63,
+0x74, 0x3b, 0x43, 0x75, 0x74, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x4b, 0x1e6d, 0x75, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x77,
+0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x44, 0x75, 0x6a, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x59, 0x65, 0x6e, 0x3b, 0x59, 0x65,
+0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x49, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75,
+0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b, 0x43, 0x75, 0x74, 0x3b, 0x4b, 0x1e6d, 0x75, 0x3b, 0x4e, 0x77, 0x61, 0x3b, 0x44, 0x75,
+0x6a, 0x59, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x194, 0x3b, 0x43, 0x3b, 0x4b,
+0x3b, 0x4e, 0x3b, 0x44, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x6c, 0x75, 0x61, 0x6c, 0x69,
+0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x6c, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
+0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74,
+0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b,
+0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x91c, 0x93e, 0x928, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d,
+0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x938, 0x3b, 0x90f, 0x92b, 0x94d, 0x930, 0x93f, 0x932, 0x3b,
+0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x907, 0x3b, 0x906, 0x917, 0x938, 0x94d, 0x925, 0x3b, 0x938,
+0x947, 0x92c, 0x925, 0x947, 0x91c, 0x94d, 0x92c, 0x93c, 0x930, 0x3b, 0x905, 0x916, 0x925, 0x92c, 0x930, 0x3b, 0x928, 0x92c, 0x947, 0x91c,
+0x94d, 0x92c, 0x93c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x947, 0x91c, 0x94d, 0x92c, 0x93c, 0x930, 0x91c, 0x3b, 0x92b, 0x947, 0x3b, 0x92e,
+0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x3b, 0x91c, 0x941, 0x3b, 0x906, 0x3b, 0x938, 0x947, 0x3b, 0x905, 0x3b,
+0x928, 0x3b, 0x926, 0x93f, 0x456, 0x486, 0x430, 0x43d, 0x43d, 0xa64b, 0x430, 0x301, 0x440, 0x457, 0x439, 0x3b, 0x444, 0x435, 0x432, 0x440,
+0xa64b, 0x430, 0x301, 0x440, 0x457, 0x439, 0x3b, 0x43c, 0x430, 0x301, 0x440, 0x442, 0x44a, 0x3b, 0x430, 0x486, 0x43f, 0x440, 0x456, 0x301,
+0x43b, 0x43b, 0x457, 0x439, 0x3b, 0x43c, 0x430, 0x301, 0x457, 0x439, 0x3b, 0x456, 0x486, 0xa64b, 0x301, 0x43d, 0x457, 0x439, 0x3b, 0x456,
+0x486, 0xa64b, 0x301, 0x43b, 0x457, 0x439, 0x3b, 0x430, 0x486, 0x301, 0x475, 0x433, 0xa64b, 0x441, 0x442, 0x44a, 0x3b, 0x441, 0x435, 0x43f,
+0x442, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x439, 0x3b, 0x47b, 0x486, 0x43a, 0x442, 0x461, 0x301, 0x432, 0x440, 0x457, 0x439, 0x3b,
+0x43d, 0x43e, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x439, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x439,
+0x456, 0x486, 0x430, 0x43d, 0x43d, 0xa64b, 0x430, 0x301, 0x440, 0x457, 0x430, 0x3b, 0x444, 0x435, 0x432, 0x440, 0xa64b, 0x430, 0x301, 0x440,
+0x457, 0x430, 0x3b, 0x43c, 0x430, 0x301, 0x440, 0x442, 0x430, 0x3b, 0x430, 0x486, 0x43f, 0x440, 0x456, 0x301, 0x43b, 0x43b, 0x457, 0x430,
+0x3b, 0x43c, 0x430, 0x301, 0x457, 0x430, 0x3b, 0x456, 0x486, 0xa64b, 0x301, 0x43d, 0x457, 0x430, 0x3b, 0x456, 0x486, 0xa64b, 0x301, 0x43b,
+0x457, 0x430, 0x3b, 0x430, 0x486, 0x301, 0x475, 0x433, 0xa64b, 0x441, 0x442, 0x430, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x301, 0x43c,
+0x432, 0x440, 0x457, 0x430, 0x3b, 0x47b, 0x486, 0x43a, 0x442, 0x461, 0x301, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x43d, 0x43e, 0x435, 0x301,
+0x43c, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x430, 0x456, 0x486, 0x430, 0x2de9,
+0x487, 0x3b, 0x444, 0x435, 0x2de1, 0x487, 0x3b, 0x43c, 0x430, 0x2dec, 0x487, 0x3b, 0x430, 0x486, 0x43f, 0x2dec, 0x487, 0x3b, 0x43c, 0x430,
+0xa675, 0x3b, 0x456, 0x486, 0xa64b, 0x2de9, 0x487, 0x3b, 0x456, 0x486, 0xa64b, 0x2de7, 0x487, 0x3b, 0x430, 0x486, 0x301, 0x475, 0x2de2, 0x487,
+0x3b, 0x441, 0x435, 0x2deb, 0x487, 0x3b, 0x47b, 0x486, 0x43a, 0x2dee, 0x3b, 0x43d, 0x43e, 0x435, 0x2de8, 0x3b, 0x434, 0x435, 0x2de6, 0x487,
0x406, 0x486, 0x3b, 0x424, 0x3b, 0x41c, 0x3b, 0x410, 0x486, 0x3b, 0x41c, 0x3b, 0x406, 0x486, 0x3b, 0x406, 0x486, 0x3b, 0x410, 0x486,
-0x3b, 0x421, 0x3b, 0x47a, 0x486, 0x3b, 0x41d, 0x3b, 0x414, 0x3b, 0x456, 0x486, 0x430, 0x43d, 0x43d, 0xa64b, 0x430, 0x301, 0x440, 0x457,
-0x430, 0x3b, 0x444, 0x435, 0x432, 0x440, 0xa64b, 0x430, 0x301, 0x440, 0x457, 0x430, 0x3b, 0x43c, 0x430, 0x301, 0x440, 0x442, 0x430, 0x3b,
-0x430, 0x486, 0x43f, 0x440, 0x456, 0x301, 0x43b, 0x43b, 0x457, 0x430, 0x3b, 0x43c, 0x430, 0x301, 0x457, 0x430, 0x3b, 0x456, 0x486, 0xa64b,
-0x301, 0x43d, 0x457, 0x430, 0x3b, 0x456, 0x486, 0xa64b, 0x301, 0x43b, 0x457, 0x430, 0x3b, 0x430, 0x486, 0x301, 0x475, 0x433, 0xa64b, 0x441,
-0x442, 0x430, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x47b, 0x486, 0x43a, 0x442, 0x461,
-0x301, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x43d, 0x43e, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x434, 0x435, 0x43a, 0x435,
-0x301, 0x43c, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x43, 0x69, 0x6f, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x4c, 0x75, 0x73, 0x3b, 0x4d,
+0x3b, 0x421, 0x3b, 0x47a, 0x486, 0x3b, 0x41d, 0x3b, 0x414, 0x43, 0x69, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0xf9, 0x69, 0x73,
+0x68, 0x69, 0x3b, 0x4c, 0x75, 0x73, 0xf2, 0x6c, 0x6f, 0x3b, 0x4d, 0xf9, 0x75, 0x79, 0xe0, 0x3b, 0x4c, 0x75, 0x6d, 0xf9,
+0x6e, 0x67, 0xf9, 0x6c, 0xf9, 0x3b, 0x4c, 0x75, 0x66, 0x75, 0x69, 0x6d, 0x69, 0x3b, 0x4b, 0x61, 0x62, 0xe0, 0x6c, 0xe0,
+0x73, 0x68, 0xec, 0x70, 0xf9, 0x3b, 0x4c, 0xf9, 0x73, 0x68, 0xec, 0x6b, 0xe0, 0x3b, 0x4c, 0x75, 0x74, 0x6f, 0x6e, 0x67,
+0x6f, 0x6c, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x67, 0xf9, 0x64, 0x69, 0x3b, 0x4b, 0x61, 0x73, 0x77, 0xe8, 0x6b, 0xe8, 0x73,
+0xe8, 0x3b, 0x43, 0x69, 0x73, 0x77, 0xe0, 0x43, 0x69, 0x6f, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x4c, 0x75, 0x73, 0x3b, 0x4d,
0x75, 0x75, 0x3b, 0x4c, 0x75, 0x6d, 0x3b, 0x4c, 0x75, 0x66, 0x3b, 0x4b, 0x61, 0x62, 0x3b, 0x4c, 0x75, 0x73, 0x68, 0x3b,
-0x4c, 0x75, 0x74, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x43, 0x69, 0x73, 0x3b, 0x43, 0x69, 0x6f, 0x6e,
-0x67, 0x6f, 0x3b, 0x4c, 0xf9, 0x69, 0x73, 0x68, 0x69, 0x3b, 0x4c, 0x75, 0x73, 0xf2, 0x6c, 0x6f, 0x3b, 0x4d, 0xf9, 0x75,
-0x79, 0xe0, 0x3b, 0x4c, 0x75, 0x6d, 0xf9, 0x6e, 0x67, 0xf9, 0x6c, 0xf9, 0x3b, 0x4c, 0x75, 0x66, 0x75, 0x69, 0x6d, 0x69,
-0x3b, 0x4b, 0x61, 0x62, 0xe0, 0x6c, 0xe0, 0x73, 0x68, 0xec, 0x70, 0xf9, 0x3b, 0x4c, 0xf9, 0x73, 0x68, 0xec, 0x6b, 0xe0,
-0x3b, 0x4c, 0x75, 0x74, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x67, 0xf9, 0x64, 0x69, 0x3b, 0x4b,
-0x61, 0x73, 0x77, 0xe8, 0x6b, 0xe8, 0x73, 0xe8, 0x3b, 0x43, 0x69, 0x73, 0x77, 0xe0, 0x3b, 0x43, 0x3b, 0x4c, 0x3b, 0x4c,
-0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x43, 0x3b, 0x4a,
-0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x65, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a,
-0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e,
-0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61,
-0x72, 0x3b, 0x4d, 0xe4, 0x65, 0x72, 0x7a, 0x3b, 0x41, 0x62, 0x72, 0xeb, 0x6c, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a,
-0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62,
-0x2e, 0x3b, 0x4d, 0xe4, 0x65, 0x2e, 0x3b, 0x41, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x69,
-0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e,
-0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x3b, 0x6e, 0xf9, 0x6d, 0x3b, 0x6b, 0x268, 0x7a, 0x3b, 0x74,
-0x268, 0x64, 0x3b, 0x74, 0x61, 0x61, 0x3b, 0x73, 0x65, 0x65, 0x3b, 0x6e, 0x7a, 0x75, 0x3b, 0x64, 0x75, 0x6d, 0x3b, 0x66,
-0x254, 0x65, 0x3b, 0x64, 0x7a, 0x75, 0x3b, 0x6c, 0x254, 0x6d, 0x3b, 0x6b, 0x61, 0x61, 0x3b, 0x66, 0x77, 0x6f, 0x3b, 0x6e,
-0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6e, 0xf9, 0x6d, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6b,
-0x197, 0x300, 0x7a, 0xf9, 0x294, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x74, 0x197, 0x300, 0x64, 0x289, 0x300,
-0x67, 0x68, 0xe0, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x74, 0x1ce, 0x61, 0x66, 0x289, 0x304, 0x67, 0x68,
-0x101, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0xe8, 0x73, 0xe8, 0x65, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254,
-0x300, 0x6e, 0x7a, 0xf9, 0x67, 0x68, 0xf2, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x64, 0xf9, 0x6d, 0x6c,
-0x6f, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6b, 0x77, 0xee, 0x66, 0x254, 0x300, 0x65, 0x3b, 0x6e, 0x64,
-0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x74, 0x197, 0x300, 0x66, 0x289, 0x300, 0x67, 0x68, 0xe0, 0x64, 0x7a, 0x75, 0x67, 0x68,
-0xf9, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x67, 0x68, 0x1d4, 0x75, 0x77, 0x65, 0x6c, 0x254, 0x300, 0x6d,
-0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x63, 0x68, 0x77, 0x61, 0x294, 0xe0, 0x6b, 0x61, 0x61, 0x20, 0x77,
-0x6f, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0xe8, 0x66, 0x77, 0xf2, 0x6f, 0x3b, 0x6e, 0x3b, 0x6b, 0x3b, 0x74, 0x3b,
-0x74, 0x3b, 0x73, 0x3b, 0x7a, 0x3b, 0x6b, 0x3b, 0x66, 0x3b, 0x64, 0x3b, 0x6c, 0x3b, 0x63, 0x3b, 0x66, 0x3b, 0x6b, 0x254,
-0x6e, 0x3b, 0x6d, 0x61, 0x63, 0x3b, 0x6d, 0x61, 0x74, 0x3b, 0x6d, 0x74, 0x6f, 0x3b, 0x6d, 0x70, 0x75, 0x3b, 0x68, 0x69,
-0x6c, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x68, 0x69, 0x6b, 0x3b, 0x64, 0x69, 0x70, 0x3b, 0x62, 0x69, 0x6f, 0x3b, 0x6d, 0x61,
-0x79, 0x3b, 0x6c, 0x69, 0x253, 0x3b, 0x4b, 0x254, 0x6e, 0x64, 0x254, 0x14b, 0x3b, 0x4d, 0xe0, 0x63, 0x25b, 0x302, 0x6c, 0x3b,
-0x4d, 0xe0, 0x74, 0xf9, 0x6d, 0x62, 0x3b, 0x4d, 0xe0, 0x74, 0x6f, 0x70, 0x3b, 0x4d, 0x300, 0x70, 0x75, 0x79, 0x25b, 0x3b,
-0x48, 0xec, 0x6c, 0xf2, 0x6e, 0x64, 0x25b, 0x300, 0x3b, 0x4e, 0x6a, 0xe8, 0x62, 0xe0, 0x3b, 0x48, 0xec, 0x6b, 0x61, 0x14b,
-0x3b, 0x44, 0xec, 0x70, 0x254, 0x300, 0x73, 0x3b, 0x42, 0xec, 0xf2, 0xf4, 0x6d, 0x3b, 0x4d, 0xe0, 0x79, 0x25b, 0x73, 0xe8,
-0x70, 0x3b, 0x4c, 0xec, 0x62, 0x75, 0x79, 0x20, 0x6c, 0x69, 0x20, 0x144, 0x79, 0xe8, 0x65, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b,
-0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x68, 0x3b, 0x6e, 0x3b, 0x68, 0x3b, 0x64, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x6c, 0x3b,
-0x64, 0x69, 0x3b, 0x14b, 0x67, 0x254, 0x6e, 0x3b, 0x73, 0x254, 0x14b, 0x3b, 0x64, 0x69, 0x253, 0x3b, 0x65, 0x6d, 0x69, 0x3b,
-0x65, 0x73, 0x254, 0x3b, 0x6d, 0x61, 0x64, 0x3b, 0x64, 0x69, 0x14b, 0x3b, 0x6e, 0x79, 0x25b, 0x74, 0x3b, 0x6d, 0x61, 0x79,
-0x3b, 0x74, 0x69, 0x6e, 0x3b, 0x65, 0x6c, 0xe1, 0x3b, 0x64, 0x69, 0x6d, 0x254, 0x301, 0x64, 0x69, 0x3b, 0x14b, 0x67, 0x254,
-0x6e, 0x64, 0x25b, 0x3b, 0x73, 0x254, 0x14b, 0x25b, 0x3b, 0x64, 0x69, 0x253, 0xe1, 0x253, 0xe1, 0x3b, 0x65, 0x6d, 0x69, 0x61,
-0x73, 0x65, 0x6c, 0x65, 0x3b, 0x65, 0x73, 0x254, 0x70, 0x25b, 0x73, 0x254, 0x70, 0x25b, 0x3b, 0x6d, 0x61, 0x64, 0x69, 0x253,
-0x25b, 0x301, 0x64, 0xed, 0x253, 0x25b, 0x301, 0x3b, 0x64, 0x69, 0x14b, 0x67, 0x69, 0x6e, 0x64, 0x69, 0x3b, 0x6e, 0x79, 0x25b,
-0x74, 0x25b, 0x6b, 0x69, 0x3b, 0x6d, 0x61, 0x79, 0xe9, 0x73, 0x25b, 0x301, 0x3b, 0x74, 0x69, 0x6e, 0xed, 0x6e, 0xed, 0x3b,
-0x65, 0x6c, 0xe1, 0x14b, 0x67, 0x25b, 0x301, 0x3b, 0x64, 0x3b, 0x14b, 0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x65, 0x3b, 0x65, 0x3b,
-0x6d, 0x3b, 0x64, 0x3b, 0x6e, 0x3b, 0x6d, 0x3b, 0x74, 0x3b, 0x65, 0x3b, 0x53, 0x61, 0x3b, 0x46, 0x65, 0x3b, 0x4d, 0x61,
-0x3b, 0x41, 0x62, 0x3b, 0x4d, 0x65, 0x3b, 0x53, 0x75, 0x3b, 0x53, 0xfa, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x3b, 0x4f,
-0x6b, 0x3b, 0x4e, 0x6f, 0x3b, 0x44, 0x65, 0x3b, 0x53, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x3b, 0x46, 0xe9, 0x62, 0x69, 0x72,
-0x69, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x3b, 0x41, 0x62, 0x75, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x53,
-0x75, 0x65, 0x14b, 0x3b, 0x53, 0xfa, 0x75, 0x79, 0x65, 0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x74, 0x74, 0x65, 0x6d,
-0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72,
-0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
-0x53, 0x3b, 0x53, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6e, 0x67, 0x6f, 0x3b, 0x6e, 0x67,
-0x62, 0x3b, 0x6e, 0x67, 0x6c, 0x3b, 0x6e, 0x67, 0x6e, 0x3b, 0x6e, 0x67, 0x74, 0x3b, 0x6e, 0x67, 0x73, 0x3b, 0x6e, 0x67,
-0x7a, 0x3b, 0x6e, 0x67, 0x6d, 0x3b, 0x6e, 0x67, 0x65, 0x3b, 0x6e, 0x67, 0x61, 0x3b, 0x6e, 0x67, 0x61, 0x64, 0x3b, 0x6e,
-0x67, 0x61, 0x62, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6f, 0x73, 0xfa, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x62, 0x25b,
-0x30c, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6c, 0xe1, 0x6c, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6e, 0x79, 0x69,
-0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x74, 0xe1, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x73, 0x61,
-0x6d, 0x259, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x7a, 0x61, 0x6d, 0x67, 0x62, 0xe1, 0x6c, 0x61, 0x3b, 0x6e,
-0x67, 0x254, 0x6e, 0x20, 0x6d, 0x77, 0x6f, 0x6d, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x65, 0x62, 0x75, 0x6c, 0xfa, 0x3b,
-0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d, 0x20,
-0x61, 0x69, 0x20, 0x64, 0x7a, 0x69, 0xe1, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d, 0x20, 0x61, 0x69,
-0x20, 0x62, 0x25b, 0x30c, 0x3b, 0x6f, 0x3b, 0x62, 0x3b, 0x6c, 0x3b, 0x6e, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x7a, 0x3b, 0x6d,
-0x3b, 0x65, 0x3b, 0x61, 0x3b, 0x64, 0x3b, 0x62, 0x3b, 0x14b, 0x31, 0x3b, 0x14b, 0x32, 0x3b, 0x14b, 0x33, 0x3b, 0x14b, 0x34,
-0x3b, 0x14b, 0x35, 0x3b, 0x14b, 0x36, 0x3b, 0x14b, 0x37, 0x3b, 0x14b, 0x38, 0x3b, 0x14b, 0x39, 0x3b, 0x14b, 0x31, 0x30, 0x3b,
-0x14b, 0x31, 0x31, 0x3b, 0x14b, 0x31, 0x32, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x20, 0x6e, 0x74, 0x254, 0x301, 0x6e,
-0x74, 0x254, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x62, 0x25b, 0x301, 0x25b, 0x3b, 0x14b, 0x77, 0xed,
-0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x72, 0xe1, 0xe1, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e,
-0x69, 0x6e, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x6e, 0x3b, 0x14b, 0x77, 0xed,
-0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x66, 0x254, 0x6b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b,
-0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x62, 0x25b, 0x25b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1,
-0x61, 0x72, 0x61, 0x61, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x6e, 0x69, 0x6e,
-0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20,
-0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x20, 0x64, 0x69, 0x20, 0x62, 0x254, 0x301, 0x6b, 0x3b, 0x14b, 0x77, 0xed,
-0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x20, 0x64, 0x69, 0x20, 0x62, 0x25b, 0x301, 0x25b, 0x3b, 0x4b,
-0x77, 0x61, 0x3b, 0x55, 0x6e, 0x61, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x43, 0x68, 0x65, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d,
-0x6f, 0x63, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61, 0x6e, 0x3b, 0x54, 0x69, 0x73, 0x3b, 0x4b, 0x75, 0x6d, 0x3b, 0x4d,
-0x6f, 0x6a, 0x3b, 0x59, 0x65, 0x6c, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x77, 0x61, 0x6e,
-0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x61, 0x79, 0x65, 0x6c, 0x69, 0x3b,
-0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65, 0x72, 0x61, 0x72, 0x75, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65, 0x63, 0x68, 0x65, 0x73, 0x68, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72,
-0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65, 0x74, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
-0x77, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x75, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x63, 0x68, 0x61, 0x3b, 0x4d, 0x77,
-0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f,
-0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b,
-0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
-0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72,
-0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x79, 0x65, 0x6c, 0x2019, 0x6c, 0x69, 0x3b,
-0x4b, 0x3b, 0x55, 0x3b, 0x52, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4b, 0x3b,
-0x4d, 0x3b, 0x59, 0x3b, 0x46, 0x4c, 0x4f, 0x3b, 0x43, 0x4c, 0x41, 0x3b, 0x43, 0x4b, 0x49, 0x3b, 0x46, 0x4d, 0x46, 0x3b,
-0x4d, 0x41, 0x44, 0x3b, 0x4d, 0x42, 0x49, 0x3b, 0x4d, 0x4c, 0x49, 0x3b, 0x4d, 0x41, 0x4d, 0x3b, 0x46, 0x44, 0x45, 0x3b,
-0x46, 0x4d, 0x55, 0x3b, 0x46, 0x47, 0x57, 0x3b, 0x46, 0x59, 0x55, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x4c, 0x6f, 0x6f, 0x3b,
-0x43, 0x6f, 0x6b, 0x63, 0x77, 0x61, 0x6b, 0x6c, 0x61, 0x14b, 0x6e, 0x65, 0x3b, 0x43, 0x6f, 0x6b, 0x63, 0x77, 0x61, 0x6b,
-0x6c, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x4d, 0x61, 0x72, 0x66, 0x6f, 0x6f, 0x3b, 0x4d, 0x61, 0x64, 0x1dd, 0x1dd,
-0x75, 0x75, 0x74, 0x1dd, 0x62, 0x69, 0x6a, 0x61, 0x14b, 0x3b, 0x4d, 0x61, 0x6d, 0x1dd, 0x14b, 0x67, 0x77, 0xe3, 0x61, 0x66,
-0x61, 0x68, 0x62, 0x69, 0x69, 0x3b, 0x4d, 0x61, 0x6d, 0x1dd, 0x14b, 0x67, 0x77, 0xe3, 0x61, 0x6c, 0x69, 0x69, 0x3b, 0x4d,
-0x61, 0x64, 0x1dd, 0x6d, 0x62, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x44, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x46,
-0x129, 0x69, 0x20, 0x4d, 0x75, 0x6e, 0x64, 0x61, 0x14b, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x47, 0x77, 0x61, 0x68, 0x6c, 0x6c,
-0x65, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x59, 0x75, 0x72, 0x75, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x46, 0x3b, 0x44,
-0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x55, 0x3b, 0x57, 0x3b, 0x59, 0x3b, 0x6e, 0x67, 0x31, 0x3b, 0x6e,
-0x67, 0x32, 0x3b, 0x6e, 0x67, 0x33, 0x3b, 0x6e, 0x67, 0x34, 0x3b, 0x6e, 0x67, 0x35, 0x3b, 0x6e, 0x67, 0x36, 0x3b, 0x6e,
-0x67, 0x37, 0x3b, 0x6e, 0x67, 0x38, 0x3b, 0x6e, 0x67, 0x39, 0x3b, 0x6e, 0x67, 0x31, 0x30, 0x3b, 0x6e, 0x67, 0x31, 0x31,
-0x3b, 0x6b, 0x72, 0x69, 0x73, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0xe1, 0x68, 0x72, 0x61, 0x3b,
-0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x6d, 0x62, 0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x6c, 0x61,
-0x6c, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x74,
-0x61, 0x6e, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x74, 0x75, 0xf3, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20,
-0x68, 0x25b, 0x6d, 0x62, 0x75, 0x25b, 0x72, 0xed, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x6c, 0x254, 0x6d, 0x62, 0x69,
-0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x72, 0x25b, 0x62, 0x76, 0x75, 0xe2, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20,
-0x77, 0x75, 0x6d, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x77, 0x75, 0x6d, 0x20, 0x6e, 0x61, 0x76, 0x1d4, 0x72, 0x3b,
-0x6b, 0x72, 0xed, 0x73, 0x69, 0x6d, 0x69, 0x6e, 0x3b, 0x54, 0x69, 0x6f, 0x70, 0x3b, 0x50, 0x25b, 0x74, 0x3b, 0x44, 0x75,
-0x254, 0x331, 0x254, 0x331, 0x3b, 0x47, 0x75, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0xe4, 0x3b, 0x4b, 0x6f, 0x72, 0x3b, 0x50, 0x61,
-0x79, 0x3b, 0x54, 0x68, 0x6f, 0x6f, 0x3b, 0x54, 0x25b, 0x25b, 0x3b, 0x4c, 0x61, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x54,
-0x69, 0x64, 0x3b, 0x54, 0x69, 0x6f, 0x70, 0x20, 0x74, 0x68, 0x61, 0x72, 0x20, 0x70, 0x25b, 0x74, 0x3b, 0x50, 0x25b, 0x74,
-0x3b, 0x44, 0x75, 0x254, 0x331, 0x254, 0x331, 0x14b, 0x3b, 0x47, 0x75, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0xe4, 0x74, 0x3b, 0x4b,
-0x6f, 0x72, 0x6e, 0x79, 0x6f, 0x6f, 0x74, 0x3b, 0x50, 0x61, 0x79, 0x20, 0x79, 0x69, 0x65, 0x331, 0x74, 0x6e, 0x69, 0x3b,
-0x54, 0x68, 0x6f, 0x331, 0x6f, 0x331, 0x72, 0x3b, 0x54, 0x25b, 0x25b, 0x72, 0x3b, 0x4c, 0x61, 0x61, 0x74, 0x68, 0x3b, 0x4b,
-0x75, 0x72, 0x3b, 0x54, 0x69, 0x6f, 0x331, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x69, 0x331, 0x69, 0x331, 0x74, 0x3b, 0x54,
-0x3b, 0x50, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4b,
-0x3b, 0x54, 0x3b, 0x422, 0x43e, 0x445, 0x441, 0x3b, 0x41e, 0x43b, 0x443, 0x43d, 0x3b, 0x41a, 0x43b, 0x43d, 0x3b, 0x41c, 0x441, 0x443,
-0x3b, 0x42b, 0x430, 0x43c, 0x3b, 0x411, 0x44d, 0x441, 0x3b, 0x41e, 0x442, 0x439, 0x3b, 0x410, 0x442, 0x440, 0x3b, 0x411, 0x43b, 0x495,
-0x3b, 0x410, 0x43b, 0x442, 0x3b, 0x421, 0x44d, 0x442, 0x3b, 0x410, 0x445, 0x441, 0x3b, 0x442, 0x43e, 0x445, 0x441, 0x443, 0x43d, 0x43d,
-0x44c, 0x443, 0x3b, 0x43e, 0x43b, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x3b, 0x43a, 0x443, 0x43b, 0x443, 0x43d, 0x20, 0x442, 0x443, 0x442,
-0x430, 0x440, 0x3b, 0x43c, 0x443, 0x443, 0x441, 0x20, 0x443, 0x441, 0x442, 0x430, 0x440, 0x3b, 0x44b, 0x430, 0x43c, 0x20, 0x44b, 0x439,
-0x430, 0x3b, 0x431, 0x44d, 0x441, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x43e, 0x442, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x430, 0x442, 0x44b,
-0x440, 0x434, 0x44c, 0x44b, 0x445, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x431, 0x430, 0x43b, 0x430, 0x495, 0x430, 0x43d, 0x20, 0x44b, 0x439,
-0x430, 0x3b, 0x430, 0x43b, 0x442, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x441, 0x44d, 0x442, 0x438, 0x43d, 0x43d, 0x44c, 0x438, 0x3b,
-0x430, 0x445, 0x441, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x422, 0x3b, 0x41e, 0x3b, 0x41a, 0x3b, 0x41c, 0x3b, 0x42b, 0x3b, 0x411,
-0x3b, 0x41e, 0x3b, 0x410, 0x3b, 0x411, 0x3b, 0x410, 0x3b, 0x421, 0x3b, 0x410, 0x3b, 0x422, 0x43e, 0x445, 0x441, 0x443, 0x43d, 0x43d,
-0x44c, 0x443, 0x3b, 0x41e, 0x43b, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x3b, 0x41a, 0x443, 0x43b, 0x443, 0x43d, 0x20, 0x442, 0x443, 0x442,
-0x430, 0x440, 0x3b, 0x41c, 0x443, 0x443, 0x441, 0x20, 0x443, 0x441, 0x442, 0x430, 0x440, 0x3b, 0x42b, 0x430, 0x43c, 0x20, 0x44b, 0x439,
-0x44b, 0x43d, 0x3b, 0x411, 0x44d, 0x441, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x41e, 0x442, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b,
-0x410, 0x442, 0x44b, 0x440, 0x434, 0x44c, 0x44b, 0x445, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x411, 0x430, 0x43b, 0x430, 0x495, 0x430,
-0x43d, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x410, 0x43b, 0x442, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x421, 0x44d, 0x442, 0x438,
-0x43d, 0x43d, 0x44c, 0x438, 0x3b, 0x430, 0x445, 0x441, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x4d, 0x75, 0x70, 0x3b, 0x4d, 0x77,
+0x4c, 0x75, 0x74, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x43, 0x69, 0x73, 0x43, 0x3b, 0x4c, 0x3b, 0x4c,
+0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x43, 0x4a, 0x61,
+0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x65, 0x72, 0x7a, 0x3b, 0x41,
+0x62, 0x72, 0xeb, 0x6c, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b,
+0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74,
+0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x65, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x65,
+0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b,
+0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d,
+0xe4, 0x65, 0x2e, 0x3b, 0x41, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75,
+0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f,
+0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6e, 0xf9, 0x6d, 0x3b, 0x6e,
+0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6b, 0x197, 0x300, 0x7a, 0xf9, 0x294, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b,
+0x254, 0x300, 0x74, 0x197, 0x300, 0x64, 0x289, 0x300, 0x67, 0x68, 0xe0, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300,
+0x74, 0x1ce, 0x61, 0x66, 0x289, 0x304, 0x67, 0x68, 0x101, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0xe8, 0x73, 0xe8, 0x65,
+0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6e, 0x7a, 0xf9, 0x67, 0x68, 0xf2, 0x3b, 0x6e, 0x64, 0x7a, 0x254,
+0x300, 0x14b, 0x254, 0x300, 0x64, 0xf9, 0x6d, 0x6c, 0x6f, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6b, 0x77,
+0xee, 0x66, 0x254, 0x300, 0x65, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x74, 0x197, 0x300, 0x66, 0x289, 0x300,
+0x67, 0x68, 0xe0, 0x64, 0x7a, 0x75, 0x67, 0x68, 0xf9, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x67, 0x68,
+0x1d4, 0x75, 0x77, 0x65, 0x6c, 0x254, 0x300, 0x6d, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x63, 0x68, 0x77,
+0x61, 0x294, 0xe0, 0x6b, 0x61, 0x61, 0x20, 0x77, 0x6f, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0xe8, 0x66, 0x77, 0xf2,
+0x6f, 0x6e, 0xf9, 0x6d, 0x3b, 0x6b, 0x268, 0x7a, 0x3b, 0x74, 0x268, 0x64, 0x3b, 0x74, 0x61, 0x61, 0x3b, 0x73, 0x65, 0x65,
+0x3b, 0x6e, 0x7a, 0x75, 0x3b, 0x64, 0x75, 0x6d, 0x3b, 0x66, 0x254, 0x65, 0x3b, 0x64, 0x7a, 0x75, 0x3b, 0x6c, 0x254, 0x6d,
+0x3b, 0x6b, 0x61, 0x61, 0x3b, 0x66, 0x77, 0x6f, 0x6e, 0x3b, 0x6b, 0x3b, 0x74, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x7a, 0x3b,
+0x6b, 0x3b, 0x66, 0x3b, 0x64, 0x3b, 0x6c, 0x3b, 0x63, 0x3b, 0x66, 0x4b, 0x254, 0x6e, 0x64, 0x254, 0x14b, 0x3b, 0x4d, 0xe0,
+0x63, 0x25b, 0x302, 0x6c, 0x3b, 0x4d, 0xe0, 0x74, 0xf9, 0x6d, 0x62, 0x3b, 0x4d, 0xe0, 0x74, 0x6f, 0x70, 0x3b, 0x4d, 0x300,
+0x70, 0x75, 0x79, 0x25b, 0x3b, 0x48, 0xec, 0x6c, 0xf2, 0x6e, 0x64, 0x25b, 0x300, 0x3b, 0x4e, 0x6a, 0xe8, 0x62, 0xe0, 0x3b,
+0x48, 0xec, 0x6b, 0x61, 0x14b, 0x3b, 0x44, 0xec, 0x70, 0x254, 0x300, 0x73, 0x3b, 0x42, 0xec, 0xf2, 0xf4, 0x6d, 0x3b, 0x4d,
+0xe0, 0x79, 0x25b, 0x73, 0xe8, 0x70, 0x3b, 0x4c, 0xec, 0x62, 0x75, 0x79, 0x20, 0x6c, 0x69, 0x20, 0x144, 0x79, 0xe8, 0x65,
+0x6b, 0x254, 0x6e, 0x3b, 0x6d, 0x61, 0x63, 0x3b, 0x6d, 0x61, 0x74, 0x3b, 0x6d, 0x74, 0x6f, 0x3b, 0x6d, 0x70, 0x75, 0x3b,
+0x68, 0x69, 0x6c, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x68, 0x69, 0x6b, 0x3b, 0x64, 0x69, 0x70, 0x3b, 0x62, 0x69, 0x6f, 0x3b,
+0x6d, 0x61, 0x79, 0x3b, 0x6c, 0x69, 0x253, 0x6b, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x68, 0x3b, 0x6e,
+0x3b, 0x68, 0x3b, 0x64, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x6c, 0x64, 0x69, 0x6d, 0x254, 0x301, 0x64, 0x69, 0x3b, 0x14b, 0x67,
+0x254, 0x6e, 0x64, 0x25b, 0x3b, 0x73, 0x254, 0x14b, 0x25b, 0x3b, 0x64, 0x69, 0x253, 0xe1, 0x253, 0xe1, 0x3b, 0x65, 0x6d, 0x69,
+0x61, 0x73, 0x65, 0x6c, 0x65, 0x3b, 0x65, 0x73, 0x254, 0x70, 0x25b, 0x73, 0x254, 0x70, 0x25b, 0x3b, 0x6d, 0x61, 0x64, 0x69,
+0x253, 0x25b, 0x301, 0x64, 0xed, 0x253, 0x25b, 0x301, 0x3b, 0x64, 0x69, 0x14b, 0x67, 0x69, 0x6e, 0x64, 0x69, 0x3b, 0x6e, 0x79,
+0x25b, 0x74, 0x25b, 0x6b, 0x69, 0x3b, 0x6d, 0x61, 0x79, 0xe9, 0x73, 0x25b, 0x301, 0x3b, 0x74, 0x69, 0x6e, 0xed, 0x6e, 0xed,
+0x3b, 0x65, 0x6c, 0xe1, 0x14b, 0x67, 0x25b, 0x301, 0x64, 0x69, 0x3b, 0x14b, 0x67, 0x254, 0x6e, 0x3b, 0x73, 0x254, 0x14b, 0x3b,
+0x64, 0x69, 0x253, 0x3b, 0x65, 0x6d, 0x69, 0x3b, 0x65, 0x73, 0x254, 0x3b, 0x6d, 0x61, 0x64, 0x3b, 0x64, 0x69, 0x14b, 0x3b,
+0x6e, 0x79, 0x25b, 0x74, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x74, 0x69, 0x6e, 0x3b, 0x65, 0x6c, 0xe1, 0x64, 0x3b, 0x14b, 0x3b,
+0x73, 0x3b, 0x64, 0x3b, 0x65, 0x3b, 0x65, 0x3b, 0x6d, 0x3b, 0x64, 0x3b, 0x6e, 0x3b, 0x6d, 0x3b, 0x74, 0x3b, 0x65, 0x53,
+0x61, 0x6e, 0x76, 0x69, 0x65, 0x3b, 0x46, 0xe9, 0x62, 0x69, 0x72, 0x69, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x3b, 0x41,
+0x62, 0x75, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x53, 0x75, 0x65, 0x14b, 0x3b, 0x53, 0xfa, 0x75, 0x79, 0x65,
+0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
+0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x61, 0x72,
+0x53, 0x61, 0x3b, 0x46, 0x65, 0x3b, 0x4d, 0x61, 0x3b, 0x41, 0x62, 0x3b, 0x4d, 0x65, 0x3b, 0x53, 0x75, 0x3b, 0x53, 0xfa,
+0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x3b, 0x4f, 0x6b, 0x3b, 0x4e, 0x6f, 0x3b, 0x44, 0x65, 0x53, 0x3b, 0x46, 0x3b, 0x4d,
+0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x6e, 0x67,
+0x254, 0x6e, 0x20, 0x6f, 0x73, 0xfa, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x62, 0x25b, 0x30c, 0x3b, 0x6e, 0x67, 0x254, 0x6e,
+0x20, 0x6c, 0xe1, 0x6c, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6e, 0x79, 0x69, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254,
+0x6e, 0x20, 0x74, 0xe1, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x73, 0x61, 0x6d, 0x259, 0x6e, 0x61, 0x3b, 0x6e,
+0x67, 0x254, 0x6e, 0x20, 0x7a, 0x61, 0x6d, 0x67, 0x62, 0xe1, 0x6c, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6d, 0x77,
+0x6f, 0x6d, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x65, 0x62, 0x75, 0x6c, 0xfa, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61,
+0x77, 0xf3, 0x6d, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d, 0x20, 0x61, 0x69, 0x20, 0x64, 0x7a, 0x69,
+0xe1, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d, 0x20, 0x61, 0x69, 0x20, 0x62, 0x25b, 0x30c, 0x6e, 0x67,
+0x6f, 0x3b, 0x6e, 0x67, 0x62, 0x3b, 0x6e, 0x67, 0x6c, 0x3b, 0x6e, 0x67, 0x6e, 0x3b, 0x6e, 0x67, 0x74, 0x3b, 0x6e, 0x67,
+0x73, 0x3b, 0x6e, 0x67, 0x7a, 0x3b, 0x6e, 0x67, 0x6d, 0x3b, 0x6e, 0x67, 0x65, 0x3b, 0x6e, 0x67, 0x61, 0x3b, 0x6e, 0x67,
+0x61, 0x64, 0x3b, 0x6e, 0x67, 0x61, 0x62, 0x6f, 0x3b, 0x62, 0x3b, 0x6c, 0x3b, 0x6e, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x7a,
+0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x61, 0x3b, 0x64, 0x3b, 0x62, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x20, 0x6e, 0x74, 0x254,
+0x301, 0x6e, 0x74, 0x254, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x62, 0x25b, 0x301, 0x25b, 0x3b, 0x14b,
+0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x72, 0xe1, 0xe1, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd,
+0x20, 0x6e, 0x69, 0x6e, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x6e, 0x3b, 0x14b,
+0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x66, 0x254, 0x6b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20,
+0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x62, 0x25b, 0x25b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20,
+0x74, 0xe1, 0x61, 0x72, 0x61, 0x61, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x6e,
+0x69, 0x6e, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x3b, 0x14b, 0x77, 0xed,
+0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x20, 0x64, 0x69, 0x20, 0x62, 0x254, 0x301, 0x6b, 0x3b, 0x14b,
+0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x20, 0x64, 0x69, 0x20, 0x62, 0x25b, 0x301, 0x25b,
+0x14b, 0x31, 0x3b, 0x14b, 0x32, 0x3b, 0x14b, 0x33, 0x3b, 0x14b, 0x34, 0x3b, 0x14b, 0x35, 0x3b, 0x14b, 0x36, 0x3b, 0x14b, 0x37,
+0x3b, 0x14b, 0x38, 0x3b, 0x14b, 0x39, 0x3b, 0x14b, 0x31, 0x30, 0x3b, 0x14b, 0x31, 0x31, 0x3b, 0x14b, 0x31, 0x32, 0x4d, 0x77,
+0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
+0x77, 0x6f, 0x20, 0x75, 0x6e, 0x61, 0x79, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20,
+0x75, 0x6e, 0x65, 0x72, 0x61, 0x72, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65,
+0x63, 0x68, 0x65, 0x73, 0x68, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65, 0x74,
+0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x75, 0x20,
+0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x63, 0x68, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x73, 0x61,
+0x62, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x77, 0x65,
+0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20,
+0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e,
+0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69,
+0x20, 0x6e, 0x61, 0x20, 0x79, 0x65, 0x6c, 0x2019, 0x6c, 0x69, 0x4b, 0x77, 0x61, 0x3b, 0x55, 0x6e, 0x61, 0x3b, 0x52, 0x61,
+0x72, 0x3b, 0x43, 0x68, 0x65, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f, 0x63, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61,
+0x6e, 0x3b, 0x54, 0x69, 0x73, 0x3b, 0x4b, 0x75, 0x6d, 0x3b, 0x4d, 0x6f, 0x6a, 0x3b, 0x59, 0x65, 0x6c, 0x4b, 0x3b, 0x55,
+0x3b, 0x52, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x59,
+0x46, 0x129, 0x69, 0x20, 0x4c, 0x6f, 0x6f, 0x3b, 0x43, 0x6f, 0x6b, 0x63, 0x77, 0x61, 0x6b, 0x6c, 0x61, 0x14b, 0x6e, 0x65,
+0x3b, 0x43, 0x6f, 0x6b, 0x63, 0x77, 0x61, 0x6b, 0x6c, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x4d, 0x61, 0x72, 0x66,
+0x6f, 0x6f, 0x3b, 0x4d, 0x61, 0x64, 0x1dd, 0x1dd, 0x75, 0x75, 0x74, 0x1dd, 0x62, 0x69, 0x6a, 0x61, 0x14b, 0x3b, 0x4d, 0x61,
+0x6d, 0x1dd, 0x14b, 0x67, 0x77, 0xe3, 0x61, 0x66, 0x61, 0x68, 0x62, 0x69, 0x69, 0x3b, 0x4d, 0x61, 0x6d, 0x1dd, 0x14b, 0x67,
+0x77, 0xe3, 0x61, 0x6c, 0x69, 0x69, 0x3b, 0x4d, 0x61, 0x64, 0x1dd, 0x6d, 0x62, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20,
+0x44, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x4d, 0x75, 0x6e, 0x64, 0x61, 0x14b, 0x3b, 0x46, 0x129,
+0x69, 0x20, 0x47, 0x77, 0x61, 0x68, 0x6c, 0x6c, 0x65, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x59, 0x75, 0x72, 0x75, 0x46, 0x4c,
+0x4f, 0x3b, 0x43, 0x4c, 0x41, 0x3b, 0x43, 0x4b, 0x49, 0x3b, 0x46, 0x4d, 0x46, 0x3b, 0x4d, 0x41, 0x44, 0x3b, 0x4d, 0x42,
+0x49, 0x3b, 0x4d, 0x4c, 0x49, 0x3b, 0x4d, 0x41, 0x4d, 0x3b, 0x46, 0x44, 0x45, 0x3b, 0x46, 0x4d, 0x55, 0x3b, 0x46, 0x47,
+0x57, 0x3b, 0x46, 0x59, 0x55, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x46, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x4d,
+0x3b, 0x45, 0x3b, 0x55, 0x3b, 0x57, 0x3b, 0x59, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0xe1, 0x68, 0x72,
+0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x6d, 0x62, 0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144,
+0x6c, 0x61, 0x6c, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20,
+0x144, 0x74, 0x61, 0x6e, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x74, 0x75, 0xf3, 0x3b, 0x6e, 0x67, 0x77, 0x25b,
+0x6e, 0x20, 0x68, 0x25b, 0x6d, 0x62, 0x75, 0x25b, 0x72, 0xed, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x6c, 0x254, 0x6d,
+0x62, 0x69, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x72, 0x25b, 0x62, 0x76, 0x75, 0xe2, 0x3b, 0x6e, 0x67, 0x77, 0x25b,
+0x6e, 0x20, 0x77, 0x75, 0x6d, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x77, 0x75, 0x6d, 0x20, 0x6e, 0x61, 0x76, 0x1d4,
+0x72, 0x3b, 0x6b, 0x72, 0xed, 0x73, 0x69, 0x6d, 0x69, 0x6e, 0x6e, 0x67, 0x31, 0x3b, 0x6e, 0x67, 0x32, 0x3b, 0x6e, 0x67,
+0x33, 0x3b, 0x6e, 0x67, 0x34, 0x3b, 0x6e, 0x67, 0x35, 0x3b, 0x6e, 0x67, 0x36, 0x3b, 0x6e, 0x67, 0x37, 0x3b, 0x6e, 0x67,
+0x38, 0x3b, 0x6e, 0x67, 0x39, 0x3b, 0x6e, 0x67, 0x31, 0x30, 0x3b, 0x6e, 0x67, 0x31, 0x31, 0x3b, 0x6b, 0x72, 0x69, 0x73,
+0x54, 0x69, 0x6f, 0x70, 0x20, 0x74, 0x68, 0x61, 0x72, 0x20, 0x70, 0x25b, 0x74, 0x3b, 0x50, 0x25b, 0x74, 0x3b, 0x44, 0x75,
+0x254, 0x331, 0x254, 0x331, 0x14b, 0x3b, 0x47, 0x75, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0xe4, 0x74, 0x3b, 0x4b, 0x6f, 0x72, 0x6e,
+0x79, 0x6f, 0x6f, 0x74, 0x3b, 0x50, 0x61, 0x79, 0x20, 0x79, 0x69, 0x65, 0x331, 0x74, 0x6e, 0x69, 0x3b, 0x54, 0x68, 0x6f,
+0x331, 0x6f, 0x331, 0x72, 0x3b, 0x54, 0x25b, 0x25b, 0x72, 0x3b, 0x4c, 0x61, 0x61, 0x74, 0x68, 0x3b, 0x4b, 0x75, 0x72, 0x3b,
+0x54, 0x69, 0x6f, 0x331, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x69, 0x331, 0x69, 0x331, 0x74, 0x54, 0x69, 0x6f, 0x70, 0x3b,
+0x50, 0x25b, 0x74, 0x3b, 0x44, 0x75, 0x254, 0x331, 0x254, 0x331, 0x3b, 0x47, 0x75, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0xe4, 0x3b,
+0x4b, 0x6f, 0x72, 0x3b, 0x50, 0x61, 0x79, 0x3b, 0x54, 0x68, 0x6f, 0x6f, 0x3b, 0x54, 0x25b, 0x25b, 0x3b, 0x4c, 0x61, 0x61,
+0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x54, 0x69, 0x64, 0x54, 0x3b, 0x50, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x4b, 0x3b,
+0x50, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x54, 0x442, 0x43e, 0x445, 0x441, 0x443, 0x43d, 0x43d, 0x44c, 0x443,
+0x3b, 0x43e, 0x43b, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x3b, 0x43a, 0x443, 0x43b, 0x443, 0x43d, 0x20, 0x442, 0x443, 0x442, 0x430, 0x440,
+0x3b, 0x43c, 0x443, 0x443, 0x441, 0x20, 0x443, 0x441, 0x442, 0x430, 0x440, 0x3b, 0x44b, 0x430, 0x43c, 0x20, 0x44b, 0x439, 0x430, 0x3b,
+0x431, 0x44d, 0x441, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x43e, 0x442, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x430, 0x442, 0x44b, 0x440, 0x434,
+0x44c, 0x44b, 0x445, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x431, 0x430, 0x43b, 0x430, 0x495, 0x430, 0x43d, 0x20, 0x44b, 0x439, 0x430, 0x3b,
+0x430, 0x43b, 0x442, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x441, 0x44d, 0x442, 0x438, 0x43d, 0x43d, 0x44c, 0x438, 0x3b, 0x430, 0x445,
+0x441, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x422, 0x43e, 0x445, 0x441, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x3b, 0x41e, 0x43b, 0x443, 0x43d,
+0x43d, 0x44c, 0x443, 0x3b, 0x41a, 0x443, 0x43b, 0x443, 0x43d, 0x20, 0x442, 0x443, 0x442, 0x430, 0x440, 0x3b, 0x41c, 0x443, 0x443, 0x441,
+0x20, 0x443, 0x441, 0x442, 0x430, 0x440, 0x3b, 0x42b, 0x430, 0x43c, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x411, 0x44d, 0x441, 0x20,
+0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x41e, 0x442, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x410, 0x442, 0x44b, 0x440, 0x434, 0x44c, 0x44b,
+0x445, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x411, 0x430, 0x43b, 0x430, 0x495, 0x430, 0x43d, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b,
+0x410, 0x43b, 0x442, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x421, 0x44d, 0x442, 0x438, 0x43d, 0x43d, 0x44c, 0x438, 0x3b, 0x430, 0x445,
+0x441, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x422, 0x43e, 0x445, 0x441, 0x3b, 0x41e, 0x43b, 0x443, 0x43d, 0x3b, 0x41a, 0x43b, 0x43d, 0x3b,
+0x41c, 0x441, 0x443, 0x3b, 0x42b, 0x430, 0x43c, 0x3b, 0x411, 0x44d, 0x441, 0x3b, 0x41e, 0x442, 0x439, 0x3b, 0x410, 0x442, 0x440, 0x3b,
+0x411, 0x43b, 0x495, 0x3b, 0x410, 0x43b, 0x442, 0x3b, 0x421, 0x44d, 0x442, 0x3b, 0x410, 0x445, 0x441, 0x422, 0x3b, 0x41e, 0x3b, 0x41a,
+0x3b, 0x41c, 0x3b, 0x42b, 0x3b, 0x411, 0x3b, 0x41e, 0x3b, 0x410, 0x3b, 0x411, 0x3b, 0x410, 0x3b, 0x421, 0x3b, 0x410, 0x4d, 0x75,
+0x70, 0x61, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x77, 0x61, 0x3b, 0x4d, 0x77, 0x69, 0x74, 0x6f, 0x70, 0x65, 0x3b, 0x4d,
+0x75, 0x73, 0x68, 0x65, 0x6e, 0x64, 0x65, 0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x69, 0x3b, 0x4d, 0x75, 0x73, 0x68, 0x65, 0x6e,
+0x64, 0x65, 0x20, 0x4d, 0x61, 0x67, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x75, 0x6a, 0x69, 0x6d, 0x62, 0x69, 0x3b, 0x4d, 0x75,
+0x73, 0x68, 0x69, 0x70, 0x65, 0x70, 0x6f, 0x3b, 0x4d, 0x75, 0x70, 0x75, 0x67, 0x75, 0x74, 0x6f, 0x3b, 0x4d, 0x75, 0x6e,
+0x79, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x4d, 0x6f, 0x6b, 0x68, 0x75, 0x3b, 0x4d, 0x75, 0x73, 0x6f, 0x6e, 0x67, 0x61, 0x6e,
+0x64, 0x65, 0x6d, 0x62, 0x77, 0x65, 0x3b, 0x4d, 0x75, 0x68, 0x61, 0x61, 0x6e, 0x6f, 0x4d, 0x75, 0x70, 0x3b, 0x4d, 0x77,
0x69, 0x3b, 0x4d, 0x73, 0x68, 0x3b, 0x4d, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x67, 0x3b, 0x4d, 0x75, 0x6a, 0x3b, 0x4d, 0x73,
0x70, 0x3b, 0x4d, 0x70, 0x67, 0x3b, 0x4d, 0x79, 0x65, 0x3b, 0x4d, 0x6f, 0x6b, 0x3b, 0x4d, 0x75, 0x73, 0x3b, 0x4d, 0x75,
-0x68, 0x3b, 0x4d, 0x75, 0x70, 0x61, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x77, 0x61, 0x3b, 0x4d, 0x77, 0x69, 0x74, 0x6f,
-0x70, 0x65, 0x3b, 0x4d, 0x75, 0x73, 0x68, 0x65, 0x6e, 0x64, 0x65, 0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x69, 0x3b, 0x4d, 0x75,
-0x73, 0x68, 0x65, 0x6e, 0x64, 0x65, 0x20, 0x4d, 0x61, 0x67, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x75, 0x6a, 0x69, 0x6d, 0x62,
-0x69, 0x3b, 0x4d, 0x75, 0x73, 0x68, 0x69, 0x70, 0x65, 0x70, 0x6f, 0x3b, 0x4d, 0x75, 0x70, 0x75, 0x67, 0x75, 0x74, 0x6f,
-0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x4d, 0x6f, 0x6b, 0x68, 0x75, 0x3b, 0x4d, 0x75, 0x73, 0x6f,
-0x6e, 0x67, 0x61, 0x6e, 0x64, 0x65, 0x6d, 0x62, 0x77, 0x65, 0x3b, 0x4d, 0x75, 0x68, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0xa5a8,
-0xa595, 0xa51e, 0x3b, 0xa552, 0xa561, 0x3b, 0xa57e, 0xa5ba, 0x3b, 0xa5a2, 0xa595, 0x3b, 0xa591, 0xa571, 0x3b, 0xa5b1, 0xa60b, 0x3b, 0xa5b1, 0xa55e,
-0x3b, 0xa5db, 0xa515, 0x3b, 0xa562, 0xa54c, 0x3b, 0xa56d, 0xa583, 0x3b, 0xa51e, 0xa60b, 0x3b, 0xa5a8, 0xa595, 0xa5cf, 0x3b, 0xa5a8, 0xa595, 0x20,
-0xa56a, 0xa574, 0x20, 0xa51e, 0xa500, 0xa56e, 0xa54a, 0x3b, 0xa552, 0xa561, 0xa59d, 0xa595, 0x3b, 0xa57e, 0xa5ba, 0x3b, 0xa5a2, 0xa595, 0x3b, 0xa591,
-0xa571, 0x3b, 0xa5b1, 0xa60b, 0x3b, 0xa5b1, 0xa55e, 0xa524, 0x3b, 0xa5db, 0xa515, 0x3b, 0xa562, 0xa54c, 0x3b, 0xa56d, 0xa583, 0x3b, 0xa51e, 0xa60b,
-0xa554, 0xa57f, 0x20, 0xa578, 0xa583, 0xa5cf, 0x3b, 0xa5a8, 0xa595, 0x20, 0xa56a, 0xa574, 0x20, 0xa5cf, 0xa5ba, 0xa56e, 0xa54a, 0x3b, 0x6c, 0x75,
+0x68, 0xa5a8, 0xa595, 0x20, 0xa56a, 0xa574, 0x20, 0xa51e, 0xa500, 0xa56e, 0xa54a, 0x3b, 0xa552, 0xa561, 0xa59d, 0xa595, 0x3b, 0xa57e, 0xa5ba, 0x3b,
+0xa5a2, 0xa595, 0x3b, 0xa591, 0xa571, 0x3b, 0xa5b1, 0xa60b, 0x3b, 0xa5b1, 0xa55e, 0xa524, 0x3b, 0xa5db, 0xa515, 0x3b, 0xa562, 0xa54c, 0x3b, 0xa56d,
+0xa583, 0x3b, 0xa51e, 0xa60b, 0xa554, 0xa57f, 0x20, 0xa578, 0xa583, 0xa5cf, 0x3b, 0xa5a8, 0xa595, 0x20, 0xa56a, 0xa574, 0x20, 0xa5cf, 0xa5ba, 0xa56e,
+0xa54a, 0xa5a8, 0xa595, 0xa51e, 0x3b, 0xa552, 0xa561, 0x3b, 0xa57e, 0xa5ba, 0x3b, 0xa5a2, 0xa595, 0x3b, 0xa591, 0xa571, 0x3b, 0xa5b1, 0xa60b, 0x3b,
+0xa5b1, 0xa55e, 0x3b, 0xa5db, 0xa515, 0x3b, 0xa562, 0xa54c, 0x3b, 0xa56d, 0xa583, 0x3b, 0xa51e, 0xa60b, 0x3b, 0xa5a8, 0xa595, 0xa5cf, 0x6c, 0x75,
0x75, 0x6b, 0x61, 0x6f, 0x20, 0x6b, 0x65, 0x6d, 0xe3, 0x3b, 0x253, 0x61, 0x6e, 0x64, 0x61, 0x253, 0x75, 0x3b, 0x76, 0x254,
0x254, 0x3b, 0x66, 0x75, 0x6c, 0x75, 0x3b, 0x67, 0x6f, 0x6f, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x6b, 0x254, 0x6e, 0x64, 0x65,
0x3b, 0x73, 0x61, 0x61, 0x68, 0x3b, 0x67, 0x61, 0x6c, 0x6f, 0x3b, 0x6b, 0x65, 0x6e, 0x70, 0x6b, 0x61, 0x74, 0x6f, 0x20,
-0x253, 0x6f, 0x6c, 0x6f, 0x6c, 0x254, 0x3b, 0x6c, 0x75, 0x75, 0x6b, 0x61, 0x6f, 0x20, 0x6c, 0x254, 0x6d, 0x61, 0x3b, 0x4a,
-0x65, 0x6e, 0x3b, 0x48, 0x6f, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x42,
-0x72, 0xe1, 0x3b, 0x48, 0x65, 0x69, 0x3b, 0xd6, 0x69, 0x67, 0x3b, 0x48, 0x65, 0x72, 0x3b, 0x57, 0xed, 0x6d, 0x3b, 0x57,
-0x69, 0x6e, 0x3b, 0x43, 0x68, 0x72, 0x3b, 0x4a, 0x65, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x48, 0x6f, 0x72, 0x6e, 0x69, 0x67,
-0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x65, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x6a, 0x65,
-0x3b, 0x42, 0x72, 0xe1, 0x10d, 0x65, 0x74, 0x3b, 0x48, 0x65, 0x69, 0x77, 0x65, 0x74, 0x3b, 0xd6, 0x69, 0x67, 0x161, 0x74,
-0x65, 0x3b, 0x48, 0x65, 0x72, 0x62, 0x161, 0x74, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x57, 0xed, 0x6d, 0xe1, 0x6e, 0x65,
-0x74, 0x3b, 0x57, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x43, 0x68, 0x72, 0x69, 0x161, 0x74,
-0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x4a, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x48, 0x3b,
-0xd6, 0x3b, 0x48, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x43, 0x3b, 0x6f, 0x2e, 0x31, 0x3b, 0x6f, 0x2e, 0x32, 0x3b, 0x6f, 0x2e,
-0x33, 0x3b, 0x6f, 0x2e, 0x34, 0x3b, 0x6f, 0x2e, 0x35, 0x3b, 0x6f, 0x2e, 0x36, 0x3b, 0x6f, 0x2e, 0x37, 0x3b, 0x6f, 0x2e,
-0x38, 0x3b, 0x6f, 0x2e, 0x39, 0x3b, 0x6f, 0x2e, 0x31, 0x30, 0x3b, 0x6f, 0x2e, 0x31, 0x31, 0x3b, 0x6f, 0x2e, 0x31, 0x32,
-0x3b, 0x70, 0x69, 0x6b, 0xed, 0x74, 0xed, 0x6b, 0xed, 0x74, 0x69, 0x65, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0xed, 0x20, 0xfa,
-0x20, 0x6b, 0x75, 0x74, 0xfa, 0x61, 0x6e, 0x3b, 0x73, 0x69, 0x25b, 0x79, 0x25b, 0x301, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69,
-0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x6e, 0x64, 0xed, 0x25b, 0x3b, 0x254, 0x6e, 0x73, 0xfa, 0x6d, 0x62, 0x254, 0x6c, 0x2c, 0x20,
-0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x74, 0xe1, 0x74, 0xfa, 0x25b, 0x3b, 0x6d, 0x65, 0x73, 0x69, 0x14b,
-0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe9, 0x6e, 0x69, 0x65, 0x3b, 0x65, 0x6e, 0x73, 0x69, 0x6c,
-0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x74, 0xe1, 0x6e, 0x75, 0x25b, 0x3b, 0x254, 0x73, 0x254,
-0x6e, 0x3b, 0x65, 0x66, 0x75, 0x74, 0x65, 0x3b, 0x70, 0x69, 0x73, 0x75, 0x79, 0xfa, 0x3b, 0x69, 0x6d, 0x25b, 0x14b, 0x20,
-0x69, 0x20, 0x70, 0x75, 0x254, 0x73, 0x3b, 0x69, 0x6d, 0x25b, 0x14b, 0x20, 0x69, 0x20, 0x70, 0x75, 0x74, 0xfa, 0x6b, 0x2c,
-0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x74, 0xed, 0x25b, 0x3b, 0x6d, 0x61, 0x6b, 0x61, 0x6e, 0x64, 0x69,
-0x6b, 0x25b, 0x3b, 0x70, 0x69, 0x6c, 0x254, 0x6e, 0x64, 0x254, 0x301, 0x3b, 0x58, 0x69, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b,
-0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x58, 0x75, 0x6e, 0x3b, 0x58, 0x6e, 0x74, 0x3b,
-0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x63, 0x68, 0x3b, 0x50, 0x61, 0x79, 0x3b, 0x41, 0x76, 0x69, 0x3b,
-0x78, 0x69, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x75,
-0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x75, 0x3b, 0x78, 0x75, 0x6e, 0x75, 0x3b, 0x78, 0x75, 0x6e,
-0x65, 0x74, 0x75, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x75, 0x3b, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65,
-0x3b, 0x6f, 0x63, 0x68, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x70, 0x61, 0x79, 0x61, 0x72, 0x65, 0x73, 0x3b, 0x61, 0x76, 0x69,
-0x65, 0x6e, 0x74, 0x75, 0x3b, 0x58, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41,
-0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x78, 0x69, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72,
-0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x78, 0x75, 0x6e, 0x3b, 0x78, 0x6e, 0x74, 0x3b, 0x61, 0x67, 0x6f,
-0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x63, 0x68, 0x3b, 0x70, 0x61, 0x79, 0x3b, 0x61, 0x76, 0x69, 0x3b, 0x64, 0x65, 0x20,
-0x78, 0x69, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x64, 0x65,
-0x20, 0x6d, 0x61, 0x72, 0x7a, 0x75, 0x3b, 0x64, 0x2019, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61,
-0x79, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x78, 0x75, 0x6e, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x78, 0x75, 0x6e, 0x65, 0x74, 0x75,
-0x3b, 0x64, 0x2019, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62,
-0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x68, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x70, 0x61, 0x79, 0x61,
-0x72, 0x65, 0x73, 0x3b, 0x64, 0x2019, 0x61, 0x76, 0x69, 0x65, 0x6e, 0x74, 0x75, 0x3b, 0x4e, 0x64, 0x75, 0x14b, 0x6d, 0x62,
-0x69, 0x20, 0x53, 0x61, 0x14b, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x70, 0xe1, 0x3b, 0x50, 0x25b,
-0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x74, 0xe1, 0x74, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301,
-0x6e, 0x25b, 0x301, 0x6b, 0x77, 0x61, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x61, 0x74, 0x61, 0x61, 0x3b, 0x50,
-0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301, 0x6e, 0x74, 0xfa, 0x6b, 0xfa, 0x3b, 0x50, 0x25b, 0x73,
-0x61, 0x14b, 0x20, 0x53, 0x61, 0x61, 0x6d, 0x62, 0xe1, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e,
-0x25b, 0x301, 0x66, 0x254, 0x6d, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301, 0x70, 0x66,
-0xfa, 0xa78b, 0xfa, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x4e, 0x25b, 0x67, 0x25b, 0x301, 0x6d, 0x3b, 0x50, 0x25b, 0x73,
-0x61, 0x14b, 0x20, 0x4e, 0x74, 0x73, 0x254, 0x30c, 0x70, 0x6d, 0x254, 0x301, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x4e,
-0x74, 0x73, 0x254, 0x30c, 0x70, 0x70, 0xe1, 0x3b, 0x70, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b,
-0x6d, 0x62, 0x69, 0x79, 0x254, 0x20, 0x6d, 0x25b, 0x6e, 0x64, 0x6f, 0x14b, 0x67, 0x254, 0x3b, 0x4e, 0x79, 0x254, 0x6c, 0x254,
-0x6d, 0x62, 0x254, 0x14b, 0x67, 0x254, 0x3b, 0x4d, 0x254, 0x6e, 0x254, 0x20, 0x14b, 0x67, 0x62, 0x61, 0x6e, 0x6a, 0x61, 0x3b,
-0x4e, 0x79, 0x61, 0x14b, 0x67, 0x77, 0x25b, 0x20, 0x14b, 0x67, 0x62, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x6b, 0x75, 0x14b, 0x67,
-0x77, 0x25b, 0x3b, 0x66, 0x25b, 0x3b, 0x6e, 0x6a, 0x61, 0x70, 0x69, 0x3b, 0x6e, 0x79, 0x75, 0x6b, 0x75, 0x6c, 0x3b, 0x31,
-0x31, 0x3b, 0x253, 0x75, 0x6c, 0x253, 0x75, 0x73, 0x25b, 0x3b, 0x6d, 0x62, 0x65, 0x67, 0x74, 0x75, 0x67, 0x3b, 0x69, 0x6d,
-0x65, 0x67, 0x20, 0xe0, 0x62, 0xf9, 0x62, 0xec, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0x6d, 0x62, 0x259, 0x14b, 0x63, 0x68,
-0x75, 0x62, 0x69, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6e, 0x67, 0x77, 0x259, 0x300, 0x74, 0x3b, 0x69, 0x6d, 0x259, 0x67,
-0x20, 0x66, 0x6f, 0x67, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x69, 0x62, 0x254, 0x64, 0x3b, 0x69,
-0x6d, 0x259, 0x67, 0x20, 0xe0, 0x64, 0xf9, 0x6d, 0x62, 0x259, 0x300, 0x14b, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63,
-0x68, 0x69, 0x6b, 0x61, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b, 0x75, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x74,
-0xe8, 0x73, 0x69, 0x2bc, 0x65, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x7a, 0xf2, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b,
-0x72, 0x69, 0x7a, 0x6d, 0x65, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6d, 0x62, 0x65, 0x67, 0x74, 0x75, 0x67, 0x3b,
-0x69, 0x6d, 0x65, 0x67, 0x20, 0xe0, 0x62, 0xf9, 0x62, 0xec, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0x6d, 0x62, 0x259, 0x14b,
-0x63, 0x68, 0x75, 0x62, 0x69, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6e, 0x67, 0x77, 0x259, 0x300, 0x74, 0x3b, 0x69, 0x6d,
-0x259, 0x67, 0x20, 0x66, 0x6f, 0x67, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x69, 0x62, 0x254, 0x64,
-0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0xe0, 0x64, 0xf9, 0x6d, 0x62, 0x259, 0x300, 0x14b, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20,
-0x69, 0x63, 0x68, 0x69, 0x6b, 0x61, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b, 0x75, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67,
-0x20, 0x74, 0xe8, 0x73, 0x69, 0x2bc, 0x65, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x7a, 0xf2, 0x3b, 0x69, 0x6d, 0x259, 0x67,
-0x20, 0x6b, 0x72, 0x69, 0x7a, 0x6d, 0x65, 0x64, 0x3b, 0x4d, 0x31, 0x3b, 0x41, 0x32, 0x3b, 0x4d, 0x33, 0x3b, 0x4e, 0x34,
-0x3b, 0x46, 0x35, 0x3b, 0x49, 0x36, 0x3b, 0x41, 0x37, 0x3b, 0x49, 0x38, 0x3b, 0x4b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31,
-0x31, 0x3b, 0x31, 0x32, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x6c, 0xf9,
-0x6d, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6b, 0xe0, 0x67, 0x20, 0x6e, 0x67, 0x77, 0xf3, 0x14b, 0x3b, 0x73, 0x61, 0x14b, 0x20,
-0x6c, 0x65, 0x70, 0x79, 0xe8, 0x20, 0x73, 0x68, 0xfa, 0x6d, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x63, 0xff, 0xf3, 0x3b, 0x73,
-0x61, 0x14b, 0x20, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x63, 0xff, 0xf3, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6e, 0x6a, 0xff,
-0x6f, 0x6c, 0xe1, 0x2bc, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x74, 0x79, 0x25b, 0x300, 0x62, 0x20, 0x74, 0x79, 0x25b, 0x300, 0x62,
-0x20, 0x6d, 0x62, 0x289, 0x300, 0x14b, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6d, 0x62, 0x289, 0x300, 0x14b, 0x3b, 0x73, 0x61, 0x14b,
-0x20, 0x6e, 0x67, 0x77, 0x254, 0x300, 0x2bc, 0x20, 0x6d, 0x62, 0xff, 0x25b, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x74, 0xe0, 0x14b,
-0x61, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0xe1, 0x2bc, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6d, 0x65, 0x6a, 0x77, 0x6f, 0x14b,
-0xf3, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6c, 0xf9, 0x6d, 0x3b, 0x57, 0x69, 0xf3, 0x74, 0x68, 0x65, 0x21f, 0x69, 0x6b, 0x61,
-0x20, 0x57, 0xed, 0x3b, 0x54, 0x68, 0x69, 0x79, 0xf3, 0x21f, 0x65, 0x79, 0x75, 0x14b, 0x6b, 0x61, 0x20, 0x57, 0xed, 0x3b,
-0x49, 0x161, 0x74, 0xe1, 0x77, 0x69, 0x10d, 0x68, 0x61, 0x79, 0x61, 0x7a, 0x61, 0x14b, 0x20, 0x57, 0xed, 0x3b, 0x50, 0x21f,
-0x65, 0x17e, 0xed, 0x74, 0x21f, 0x6f, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x77, 0xe1, 0x70, 0x65, 0x74, 0x21f,
-0x6f, 0x20, 0x57, 0xed, 0x3b, 0x57, 0xed, 0x70, 0x61, 0x7a, 0x75, 0x6b, 0x21f, 0x61, 0x2d, 0x77, 0x61, 0x161, 0x74, 0xe9,
-0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x70, 0x21f, 0xe1, 0x73, 0x61, 0x70, 0x61, 0x20, 0x57, 0xed, 0x3b, 0x57,
-0x61, 0x73, 0xfa, 0x74, 0x21f, 0x75, 0x14b, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x77, 0xe1, 0x70, 0x65, 0x1e7,
-0x69, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x77, 0xe1, 0x70, 0x65, 0x2d, 0x6b, 0x61, 0x73, 0x6e, 0xe1, 0x20,
-0x57, 0xed, 0x3b, 0x57, 0x61, 0x6e, 0xed, 0x79, 0x65, 0x74, 0x75, 0x20, 0x57, 0xed, 0x3b, 0x54, 0x21f, 0x61, 0x68, 0xe9,
-0x6b, 0x61, 0x70, 0x161, 0x75, 0x14b, 0x20, 0x57, 0xed, 0x3b, 0x6a9, 0x627, 0x646, 0x648, 0x648, 0x646, 0x6cc, 0x20, 0x62f, 0x648,
-0x648, 0x6d5, 0x645, 0x3b, 0x634, 0x648, 0x628, 0x627, 0x62a, 0x3b, 0x626, 0x627, 0x632, 0x627, 0x631, 0x3b, 0x646, 0x6cc, 0x633, 0x627,
-0x646, 0x3b, 0x626, 0x627, 0x6cc, 0x627, 0x631, 0x3b, 0x62d, 0x648, 0x632, 0x6d5, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x6d5, 0x645,
-0x648, 0x648, 0x632, 0x3b, 0x626, 0x627, 0x628, 0x3b, 0x626, 0x6d5, 0x6cc, 0x644, 0x648, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x6cc,
-0x646, 0x6cc, 0x20, 0x6cc, 0x6d5, 0x6a9, 0x6d5, 0x645, 0x3b, 0x62a, 0x634, 0x631, 0x6cc, 0x646, 0x6cc, 0x20, 0x62f, 0x648, 0x648, 0x6d5,
-0x645, 0x3b, 0x6a9, 0x627, 0x646, 0x648, 0x646, 0x6cc, 0x20, 0x6cc, 0x6d5, 0x6a9, 0x6d5, 0x645, 0x3b, 0x6a9, 0x3b, 0x634, 0x3b, 0x626,
-0x3b, 0x646, 0x3b, 0x626, 0x3b, 0x62d, 0x3b, 0x62a, 0x3b, 0x626, 0x3b, 0x626, 0x3b, 0x62a, 0x3b, 0x62a, 0x3b, 0x6a9, 0x3b, 0x6a,
-0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x11b, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a,
-0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x77, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e,
-0x6f, 0x77, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61,
-0x72, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e,
-0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62,
-0x2e, 0x3b, 0x6d, 0x11b, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x2e, 0x3b, 0x6a, 0x75, 0x6e,
-0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x77, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74,
-0x2e, 0x3b, 0x6e, 0x6f, 0x77, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x61, 0x3b,
-0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c,
-0x61, 0x3b, 0x6d, 0x61, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x61,
-0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f,
-0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64, 0x65, 0x63, 0x65,
-0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x11b, 0x72, 0x3b, 0x61, 0x70, 0x72,
-0x3b, 0x6d, 0x65, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x77, 0x67, 0x3b, 0x73, 0x65, 0x70,
-0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x77, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b,
-0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x3b, 0x6d,
-0x65, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x77, 0x67, 0x75,
-0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72,
-0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a,
-0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x11b, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d,
-0x65, 0x6a, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x77, 0x67, 0x2e, 0x3b, 0x73,
-0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x77, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a,
-0x61, 0x6e, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x6d, 0x11b, 0x72, 0x63,
-0x61, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x61, 0x3b, 0x6d, 0x65, 0x6a, 0x65, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x61,
-0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x61, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70, 0x74,
-0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62,
-0x72, 0x61, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x72, 0x61, 0x67, 0x3b, 0x77, 0x61, 0x73, 0x3b,
-0x70, 0x16b, 0x6c, 0x3b, 0x73, 0x61, 0x6b, 0x3b, 0x7a, 0x61, 0x6c, 0x3b, 0x73, 0x12b, 0x6d, 0x3b, 0x6c, 0x12b, 0x70, 0x3b,
-0x64, 0x61, 0x67, 0x3b, 0x73, 0x69, 0x6c, 0x3b, 0x73, 0x70, 0x61, 0x3b, 0x6c, 0x61, 0x70, 0x3b, 0x73, 0x61, 0x6c, 0x3b,
-0x72, 0x61, 0x67, 0x73, 0x3b, 0x77, 0x61, 0x73, 0x73, 0x61, 0x72, 0x69, 0x6e, 0x73, 0x3b, 0x70, 0x16b, 0x6c, 0x69, 0x73,
-0x3b, 0x73, 0x61, 0x6b, 0x6b, 0x69, 0x73, 0x3b, 0x7a, 0x61, 0x6c, 0x6c, 0x61, 0x77, 0x73, 0x3b, 0x73, 0x12b, 0x6d, 0x65,
-0x6e, 0x69, 0x73, 0x3b, 0x6c, 0x12b, 0x70, 0x61, 0x3b, 0x64, 0x61, 0x67, 0x67, 0x69, 0x73, 0x3b, 0x73, 0x69, 0x6c, 0x6c,
-0x69, 0x6e, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x73, 0x3b, 0x6c, 0x61, 0x70, 0x6b, 0x72, 0x16b, 0x74,
-0x69, 0x73, 0x3b, 0x73, 0x61, 0x6c, 0x6c, 0x61, 0x77, 0x73, 0x3b, 0x52, 0x3b, 0x57, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x5a,
-0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x75, 0x111, 0x69, 0x76, 0x3b,
-0x6b, 0x75, 0x6f, 0x76, 0xe2, 0x3b, 0x6e, 0x6a, 0x75, 0x68, 0x10d, 0xe2, 0x3b, 0x63, 0x75, 0xe1, 0x14b, 0x75, 0x69, 0x3b,
-0x76, 0x79, 0x65, 0x73, 0x69, 0x3b, 0x6b, 0x65, 0x73, 0x69, 0x3b, 0x73, 0x79, 0x65, 0x69, 0x6e, 0x69, 0x3b, 0x70, 0x6f,
-0x72, 0x67, 0x65, 0x3b, 0x10d, 0x6f, 0x68, 0x10d, 0xe2, 0x3b, 0x72, 0x6f, 0x6f, 0x76, 0x76, 0xe2, 0x64, 0x3b, 0x73, 0x6b,
-0x61, 0x6d, 0x6d, 0xe2, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0xe2, 0x3b, 0x75, 0x111, 0x111, 0xe2, 0x69, 0x76, 0x65, 0x6d,
-0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6b, 0x75, 0x6f, 0x76, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6e, 0x6a, 0x75, 0x68,
-0x10d, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x63, 0x75, 0xe1, 0x14b, 0x75, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b,
-0x76, 0x79, 0x65, 0x73, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6b, 0x65, 0x73, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75,
-0x3b, 0x73, 0x79, 0x65, 0x69, 0x6e, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x70, 0x6f, 0x72, 0x67, 0x65, 0x6d, 0xe1,
-0xe1, 0x6e, 0x75, 0x3b, 0x10d, 0x6f, 0x68, 0x10d, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x72, 0x6f, 0x6f, 0x76, 0x76,
-0xe2, 0x64, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x73, 0x6b, 0x61, 0x6d, 0x6d, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b,
-0x6a, 0x75, 0x6f, 0x76, 0x6c, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x55, 0x3b, 0x4b, 0x3b, 0x4e, 0x4a, 0x3b, 0x43,
-0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x50, 0x3b, 0x10c, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4a, 0x3b, 0x62c, 0x627, 0x646,
-0x6a4, 0x6cc, 0x6d5, 0x3b, 0x641, 0x626, 0x6a4, 0x631, 0x6cc, 0x6d5, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x6a4, 0x631, 0x6cc,
-0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x659, 0x623, 0x646, 0x3b, 0x62c, 0x648, 0x659, 0x644, 0x627, 0x3b, 0x622, 0x6af,
-0x648, 0x633, 0x62a, 0x3b, 0x633, 0x626, 0x67e, 0x62a, 0x627, 0x645, 0x631, 0x3b, 0x626, 0x648, 0x6a9, 0x62a, 0x648, 0x6a4, 0x631, 0x3b,
-0x646, 0x648, 0x6a4, 0x627, 0x645, 0x631, 0x3b, 0x62f, 0x626, 0x633, 0x627, 0x645, 0x631, 0x3b, 0x45, 0x6e, 0x3b, 0x50, 0x65, 0x62,
-0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c,
-0x3b, 0x41, 0x67, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x3b,
-0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b,
-0x4e, 0x3b, 0x44, 0x3b
+0x253, 0x6f, 0x6c, 0x6f, 0x6c, 0x254, 0x3b, 0x6c, 0x75, 0x75, 0x6b, 0x61, 0x6f, 0x20, 0x6c, 0x254, 0x6d, 0x61, 0x4a, 0x65,
+0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x48, 0x6f, 0x72, 0x6e, 0x69, 0x67, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x65, 0x3b, 0x41, 0x62,
+0x72, 0x69, 0x6c, 0x6c, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x6a, 0x65, 0x3b, 0x42, 0x72, 0xe1, 0x10d, 0x65, 0x74, 0x3b, 0x48,
+0x65, 0x69, 0x77, 0x65, 0x74, 0x3b, 0xd6, 0x69, 0x67, 0x161, 0x74, 0x65, 0x3b, 0x48, 0x65, 0x72, 0x62, 0x161, 0x74, 0x6d,
+0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x57, 0xed, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x57, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d,
+0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x43, 0x68, 0x72, 0x69, 0x161, 0x74, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x4a, 0x65, 0x6e, 0x3b,
+0x48, 0x6f, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x42, 0x72, 0xe1, 0x3b,
+0x48, 0x65, 0x69, 0x3b, 0xd6, 0x69, 0x67, 0x3b, 0x48, 0x65, 0x72, 0x3b, 0x57, 0xed, 0x6d, 0x3b, 0x57, 0x69, 0x6e, 0x3b,
+0x43, 0x68, 0x72, 0x4a, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x48, 0x3b, 0xd6, 0x3b, 0x48,
+0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x43, 0x70, 0x69, 0x6b, 0xed, 0x74, 0xed, 0x6b, 0xed, 0x74, 0x69, 0x65, 0x2c, 0x20, 0x6f,
+0xf3, 0x6c, 0xed, 0x20, 0xfa, 0x20, 0x6b, 0x75, 0x74, 0xfa, 0x61, 0x6e, 0x3b, 0x73, 0x69, 0x25b, 0x79, 0x25b, 0x301, 0x2c,
+0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x6e, 0x64, 0xed, 0x25b, 0x3b, 0x254, 0x6e, 0x73, 0xfa, 0x6d,
+0x62, 0x254, 0x6c, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x74, 0xe1, 0x74, 0xfa, 0x25b, 0x3b,
+0x6d, 0x65, 0x73, 0x69, 0x14b, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe9, 0x6e, 0x69, 0x65, 0x3b,
+0x65, 0x6e, 0x73, 0x69, 0x6c, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x74, 0xe1, 0x6e, 0x75,
+0x25b, 0x3b, 0x254, 0x73, 0x254, 0x6e, 0x3b, 0x65, 0x66, 0x75, 0x74, 0x65, 0x3b, 0x70, 0x69, 0x73, 0x75, 0x79, 0xfa, 0x3b,
+0x69, 0x6d, 0x25b, 0x14b, 0x20, 0x69, 0x20, 0x70, 0x75, 0x254, 0x73, 0x3b, 0x69, 0x6d, 0x25b, 0x14b, 0x20, 0x69, 0x20, 0x70,
+0x75, 0x74, 0xfa, 0x6b, 0x2c, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x74, 0xed, 0x25b, 0x3b, 0x6d, 0x61,
+0x6b, 0x61, 0x6e, 0x64, 0x69, 0x6b, 0x25b, 0x3b, 0x70, 0x69, 0x6c, 0x254, 0x6e, 0x64, 0x254, 0x301, 0x6f, 0x2e, 0x31, 0x3b,
+0x6f, 0x2e, 0x32, 0x3b, 0x6f, 0x2e, 0x33, 0x3b, 0x6f, 0x2e, 0x34, 0x3b, 0x6f, 0x2e, 0x35, 0x3b, 0x6f, 0x2e, 0x36, 0x3b,
+0x6f, 0x2e, 0x37, 0x3b, 0x6f, 0x2e, 0x38, 0x3b, 0x6f, 0x2e, 0x39, 0x3b, 0x6f, 0x2e, 0x31, 0x30, 0x3b, 0x6f, 0x2e, 0x31,
+0x31, 0x3b, 0x6f, 0x2e, 0x31, 0x32, 0x78, 0x69, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x75,
+0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x75, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x75, 0x3b, 0x78, 0x75,
+0x6e, 0x75, 0x3b, 0x78, 0x75, 0x6e, 0x65, 0x74, 0x75, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x75, 0x3b, 0x73, 0x65, 0x74,
+0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x68, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x70, 0x61, 0x79, 0x61, 0x72,
+0x65, 0x73, 0x3b, 0x61, 0x76, 0x69, 0x65, 0x6e, 0x74, 0x75, 0x64, 0x65, 0x20, 0x78, 0x69, 0x6e, 0x65, 0x72, 0x75, 0x3b,
+0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x7a, 0x75, 0x3b,
+0x64, 0x2019, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x78,
+0x75, 0x6e, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x78, 0x75, 0x6e, 0x65, 0x74, 0x75, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x6f, 0x73,
+0x74, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63,
+0x68, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x70, 0x61, 0x79, 0x61, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x2019, 0x61,
+0x76, 0x69, 0x65, 0x6e, 0x74, 0x75, 0x58, 0x69, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62,
+0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x58, 0x75, 0x6e, 0x3b, 0x58, 0x6e, 0x74, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65,
+0x74, 0x3b, 0x4f, 0x63, 0x68, 0x3b, 0x50, 0x61, 0x79, 0x3b, 0x41, 0x76, 0x69, 0x78, 0x69, 0x6e, 0x3b, 0x66, 0x65, 0x62,
+0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x78, 0x75, 0x6e, 0x3b, 0x78, 0x6e, 0x74,
+0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x63, 0x68, 0x3b, 0x70, 0x61, 0x79, 0x3b, 0x61, 0x76, 0x69,
+0x58, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b,
+0x50, 0x3b, 0x41, 0x4e, 0x64, 0x75, 0x14b, 0x6d, 0x62, 0x69, 0x20, 0x53, 0x61, 0x14b, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b,
+0x20, 0x50, 0x25b, 0x301, 0x70, 0xe1, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x74, 0xe1, 0x74, 0x3b,
+0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301, 0x6b, 0x77, 0x61, 0x3b, 0x50, 0x25b, 0x73, 0x61,
+0x14b, 0x20, 0x50, 0x61, 0x74, 0x61, 0x61, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301,
+0x6e, 0x74, 0xfa, 0x6b, 0xfa, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x53, 0x61, 0x61, 0x6d, 0x62, 0xe1, 0x3b, 0x50,
+0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301, 0x66, 0x254, 0x6d, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b,
+0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301, 0x70, 0x66, 0xfa, 0xa78b, 0xfa, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x4e,
+0x25b, 0x67, 0x25b, 0x301, 0x6d, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x4e, 0x74, 0x73, 0x254, 0x30c, 0x70, 0x6d, 0x254,
+0x301, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x4e, 0x74, 0x73, 0x254, 0x30c, 0x70, 0x70, 0xe1, 0x70, 0x61, 0x6d, 0x62,
+0x61, 0x3b, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x6d, 0x62, 0x69, 0x79, 0x254, 0x20, 0x6d, 0x25b, 0x6e, 0x64, 0x6f, 0x14b,
+0x67, 0x254, 0x3b, 0x4e, 0x79, 0x254, 0x6c, 0x254, 0x6d, 0x62, 0x254, 0x14b, 0x67, 0x254, 0x3b, 0x4d, 0x254, 0x6e, 0x254, 0x20,
+0x14b, 0x67, 0x62, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4e, 0x79, 0x61, 0x14b, 0x67, 0x77, 0x25b, 0x20, 0x14b, 0x67, 0x62, 0x61,
+0x6e, 0x6a, 0x61, 0x3b, 0x6b, 0x75, 0x14b, 0x67, 0x77, 0x25b, 0x3b, 0x66, 0x25b, 0x3b, 0x6e, 0x6a, 0x61, 0x70, 0x69, 0x3b,
+0x6e, 0x79, 0x75, 0x6b, 0x75, 0x6c, 0x3b, 0x31, 0x31, 0x3b, 0x253, 0x75, 0x6c, 0x253, 0x75, 0x73, 0x25b, 0x69, 0x6d, 0x259,
+0x67, 0x20, 0x6d, 0x62, 0x65, 0x67, 0x74, 0x75, 0x67, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0xe0, 0x62, 0xf9, 0x62, 0xec,
+0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0x6d, 0x62, 0x259, 0x14b, 0x63, 0x68, 0x75, 0x62, 0x69, 0x3b, 0x69, 0x6d, 0x259, 0x67,
+0x20, 0x6e, 0x67, 0x77, 0x259, 0x300, 0x74, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x66, 0x6f, 0x67, 0x3b, 0x69, 0x6d, 0x259,
+0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x69, 0x62, 0x254, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0xe0, 0x64, 0xf9, 0x6d,
+0x62, 0x259, 0x300, 0x14b, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x6b, 0x61, 0x3b, 0x69, 0x6d, 0x259,
+0x67, 0x20, 0x6b, 0x75, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x74, 0xe8, 0x73, 0x69, 0x2bc, 0x65, 0x3b, 0x69, 0x6d,
+0x259, 0x67, 0x20, 0x7a, 0xf2, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b, 0x72, 0x69, 0x7a, 0x6d, 0x65, 0x64, 0x6d, 0x62,
+0x65, 0x67, 0x74, 0x75, 0x67, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0xe0, 0x62, 0xf9, 0x62, 0xec, 0x3b, 0x69, 0x6d, 0x65,
+0x67, 0x20, 0x6d, 0x62, 0x259, 0x14b, 0x63, 0x68, 0x75, 0x62, 0x69, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6e, 0x67, 0x77,
+0x259, 0x300, 0x74, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x66, 0x6f, 0x67, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63,
+0x68, 0x69, 0x69, 0x62, 0x254, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0xe0, 0x64, 0xf9, 0x6d, 0x62, 0x259, 0x300, 0x14b,
+0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x6b, 0x61, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b, 0x75,
+0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x74, 0xe8, 0x73, 0x69, 0x2bc, 0x65, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x7a,
+0xf2, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b, 0x72, 0x69, 0x7a, 0x6d, 0x65, 0x64, 0x4d, 0x31, 0x3b, 0x41, 0x32, 0x3b,
+0x4d, 0x33, 0x3b, 0x4e, 0x34, 0x3b, 0x46, 0x35, 0x3b, 0x49, 0x36, 0x3b, 0x41, 0x37, 0x3b, 0x49, 0x38, 0x3b, 0x4b, 0x39,
+0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x73, 0x61, 0x14b, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0x25b, 0x300,
+0x25b, 0x20, 0x6c, 0xf9, 0x6d, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6b, 0xe0, 0x67, 0x20, 0x6e, 0x67, 0x77, 0xf3, 0x14b, 0x3b,
+0x73, 0x61, 0x14b, 0x20, 0x6c, 0x65, 0x70, 0x79, 0xe8, 0x20, 0x73, 0x68, 0xfa, 0x6d, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x63,
+0xff, 0xf3, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x63, 0xff, 0xf3, 0x3b, 0x73, 0x61, 0x14b,
+0x20, 0x6e, 0x6a, 0xff, 0x6f, 0x6c, 0xe1, 0x2bc, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x74, 0x79, 0x25b, 0x300, 0x62, 0x20, 0x74,
+0x79, 0x25b, 0x300, 0x62, 0x20, 0x6d, 0x62, 0x289, 0x300, 0x14b, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6d, 0x62, 0x289, 0x300, 0x14b,
+0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6e, 0x67, 0x77, 0x254, 0x300, 0x2bc, 0x20, 0x6d, 0x62, 0xff, 0x25b, 0x3b, 0x73, 0x61, 0x14b,
+0x20, 0x74, 0xe0, 0x14b, 0x61, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0xe1, 0x2bc, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6d, 0x65,
+0x6a, 0x77, 0x6f, 0x14b, 0xf3, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6c, 0xf9, 0x6d, 0xd804, 0xdd0e, 0xd804, 0xdd1a, 0xd804, 0xdd2a, 0xd804,
+0xdd20, 0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1c, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22,
+0xd804, 0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd0c, 0xd804, 0xdd27, 0x3b,
+0xd804, 0xdd03, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804,
+0xdd2c, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd23, 0xd804, 0xdd2d, 0x3b,
+0xd804, 0xdd03, 0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804,
+0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd03, 0xd804, 0xdd27, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2e, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34,
+0x3b, 0xd804, 0xdd1a, 0xd804, 0xdd27, 0xd804, 0xdd1e, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804,
+0xdd34, 0x3b, 0xd804, 0xdd13, 0xd804, 0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22,
+0xd804, 0xdd34, 0xd804, 0xdd0e, 0xd804, 0xdd1a, 0xd804, 0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1c, 0xd804, 0xdd2c, 0xd804,
+0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd2a, 0xd804, 0xdd20, 0xd804, 0xdd22, 0xd804, 0xdd28, 0x3b, 0xd804, 0xdd1f,
+0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd0c, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804,
+0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd23, 0xd804, 0xdd2d, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804,
+0xdd11, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34,
+0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd27, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804,
+0xdd2c, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1a, 0xd804, 0xdd27, 0xd804, 0xdd1e, 0xd804, 0xdd2c, 0xd804, 0xdd1f,
+0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd13, 0xd804, 0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804,
+0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd0e, 0xd804, 0xdd1a, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd1c,
+0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd0c, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd03,
+0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804, 0xdd33, 0xd804, 0xdd22, 0xd804, 0xdd28, 0xd804, 0xdd23, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd2c, 0x3b,
+0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd23, 0xd804, 0xdd2d, 0x3b, 0xd804, 0xdd03,
+0xd804, 0xdd09, 0xd804, 0xdd27, 0xd804, 0xdd0c, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1b, 0xd804,
+0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd03,
+0xd804, 0xdd27, 0xd804, 0xdd07, 0xd804, 0xdd34, 0xd804, 0xdd11, 0xd804, 0xdd2e, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b, 0xd804,
+0xdd1a, 0xd804, 0xdd27, 0xd804, 0xdd1e, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd27, 0xd804, 0xdd22, 0xd804, 0xdd34, 0x3b,
+0xd804, 0xdd13, 0xd804, 0xdd28, 0xd804, 0xdd25, 0xd804, 0xdd2c, 0xd804, 0xdd1f, 0xd804, 0xdd34, 0xd804, 0xdd1d, 0xd804, 0xdd22, 0xd804, 0xdd34, 0xd804, 0xdd0e,
+0x3b, 0xd804, 0xdd1c, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd1f, 0x3b, 0xd804, 0xdd03, 0xd804, 0xdd2c, 0x3b, 0xd804, 0xdd1f, 0xd804, 0xdd2c, 0x3b, 0xd804,
+0xdd0e, 0xd804, 0xdd2a, 0xd804, 0xdd1a, 0xd804, 0xdd34, 0x3b, 0xd804, 0xdd0e, 0xd804, 0xdd2a, 0x3b, 0xd804, 0xdd03, 0x3b, 0xd804, 0xdd25, 0xd804, 0xdd2c,
+0x3b, 0xd804, 0xdd03, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd1a, 0xd804, 0xdd27, 0x3b, 0xd804, 0xdd13, 0xd804, 0xdd28, 0x57, 0x69, 0xf3, 0x74, 0x68,
+0x65, 0x21f, 0x69, 0x6b, 0x61, 0x20, 0x57, 0xed, 0x3b, 0x54, 0x68, 0x69, 0x79, 0xf3, 0x21f, 0x65, 0x79, 0x75, 0x14b, 0x6b,
+0x61, 0x20, 0x57, 0xed, 0x3b, 0x49, 0x161, 0x74, 0xe1, 0x77, 0x69, 0x10d, 0x68, 0x61, 0x79, 0x61, 0x7a, 0x61, 0x14b, 0x20,
+0x57, 0xed, 0x3b, 0x50, 0x21f, 0x65, 0x17e, 0xed, 0x74, 0x21f, 0x6f, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x77,
+0xe1, 0x70, 0x65, 0x74, 0x21f, 0x6f, 0x20, 0x57, 0xed, 0x3b, 0x57, 0xed, 0x70, 0x61, 0x7a, 0x75, 0x6b, 0x21f, 0x61, 0x2d,
+0x77, 0x61, 0x161, 0x74, 0xe9, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x70, 0x21f, 0xe1, 0x73, 0x61, 0x70, 0x61,
+0x20, 0x57, 0xed, 0x3b, 0x57, 0x61, 0x73, 0xfa, 0x74, 0x21f, 0x75, 0x14b, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b,
+0x77, 0xe1, 0x70, 0x65, 0x1e7, 0x69, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x77, 0xe1, 0x70, 0x65, 0x2d, 0x6b,
+0x61, 0x73, 0x6e, 0xe1, 0x20, 0x57, 0xed, 0x3b, 0x57, 0x61, 0x6e, 0xed, 0x79, 0x65, 0x74, 0x75, 0x20, 0x57, 0xed, 0x3b,
+0x54, 0x21f, 0x61, 0x68, 0xe9, 0x6b, 0x61, 0x70, 0x161, 0x75, 0x14b, 0x20, 0x57, 0xed, 0x6a9, 0x627, 0x646, 0x648, 0x648, 0x646,
+0x6cc, 0x20, 0x62f, 0x648, 0x648, 0x6d5, 0x645, 0x3b, 0x634, 0x648, 0x628, 0x627, 0x62a, 0x3b, 0x626, 0x627, 0x632, 0x627, 0x631, 0x3b,
+0x646, 0x6cc, 0x633, 0x627, 0x646, 0x3b, 0x626, 0x627, 0x6cc, 0x627, 0x631, 0x3b, 0x62d, 0x648, 0x632, 0x6d5, 0x6cc, 0x631, 0x627, 0x646,
+0x3b, 0x62a, 0x6d5, 0x645, 0x648, 0x648, 0x632, 0x3b, 0x626, 0x627, 0x628, 0x3b, 0x626, 0x6d5, 0x6cc, 0x644, 0x648, 0x648, 0x644, 0x3b,
+0x62a, 0x634, 0x631, 0x6cc, 0x646, 0x6cc, 0x20, 0x6cc, 0x6d5, 0x6a9, 0x6d5, 0x645, 0x3b, 0x62a, 0x634, 0x631, 0x6cc, 0x646, 0x6cc, 0x20,
+0x62f, 0x648, 0x648, 0x6d5, 0x645, 0x3b, 0x6a9, 0x627, 0x646, 0x648, 0x646, 0x6cc, 0x20, 0x6cc, 0x6d5, 0x6a9, 0x6d5, 0x645, 0x6a9, 0x3b,
+0x634, 0x3b, 0x626, 0x3b, 0x646, 0x3b, 0x626, 0x3b, 0x62d, 0x3b, 0x62a, 0x3b, 0x626, 0x3b, 0x626, 0x3b, 0x62a, 0x3b, 0x62a, 0x3b,
+0x6a9, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x11b, 0x72, 0x63,
+0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c,
+0x69, 0x6a, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63,
+0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
+0x61, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x6a, 0x61, 0x3b,
+0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x61, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74,
+0x61, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b,
+0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x6a, 0x61, 0x6e,
+0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x11b, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e,
+0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x77, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x77,
+0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x11b, 0x72, 0x2e, 0x3b, 0x61,
+0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61,
+0x77, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x77, 0x2e, 0x3b, 0x64,
+0x65, 0x63, 0x2e, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x11b,
+0x72, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x3b, 0x6d, 0x65, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b,
+0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
+0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
+0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72,
+0x75, 0x61, 0x72, 0x61, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x61, 0x3b, 0x6d, 0x65,
+0x6a, 0x65, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x61, 0x3b, 0x61, 0x77, 0x67,
+0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62,
+0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61,
+0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x11b, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x65, 0x6a, 0x3b,
+0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x77, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b,
+0x6e, 0x6f, 0x77, 0x3b, 0x64, 0x65, 0x63, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x11b, 0x72,
+0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x6a, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c,
+0x2e, 0x3b, 0x61, 0x77, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x77,
+0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x72, 0x61, 0x67, 0x73, 0x3b, 0x77, 0x61, 0x73, 0x73, 0x61, 0x72, 0x69, 0x6e, 0x73,
+0x3b, 0x70, 0x16b, 0x6c, 0x69, 0x73, 0x3b, 0x73, 0x61, 0x6b, 0x6b, 0x69, 0x73, 0x3b, 0x7a, 0x61, 0x6c, 0x6c, 0x61, 0x77,
+0x73, 0x3b, 0x73, 0x12b, 0x6d, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x6c, 0x12b, 0x70, 0x61, 0x3b, 0x64, 0x61, 0x67, 0x67, 0x69,
+0x73, 0x3b, 0x73, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x73, 0x3b, 0x6c,
+0x61, 0x70, 0x6b, 0x72, 0x16b, 0x74, 0x69, 0x73, 0x3b, 0x73, 0x61, 0x6c, 0x6c, 0x61, 0x77, 0x73, 0x72, 0x61, 0x67, 0x3b,
+0x77, 0x61, 0x73, 0x3b, 0x70, 0x16b, 0x6c, 0x3b, 0x73, 0x61, 0x6b, 0x3b, 0x7a, 0x61, 0x6c, 0x3b, 0x73, 0x12b, 0x6d, 0x3b,
+0x6c, 0x12b, 0x70, 0x3b, 0x64, 0x61, 0x67, 0x3b, 0x73, 0x69, 0x6c, 0x3b, 0x73, 0x70, 0x61, 0x3b, 0x6c, 0x61, 0x70, 0x3b,
+0x73, 0x61, 0x6c, 0x52, 0x3b, 0x57, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x5a, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x44, 0x3b, 0x53,
+0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x53, 0x75, 0x111, 0x111, 0xe2, 0x69, 0x76, 0x65, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6b,
+0x75, 0x6f, 0x76, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6e, 0x6a, 0x75, 0x68, 0x10d, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e,
+0x75, 0x3b, 0x63, 0x75, 0xe1, 0x14b, 0x75, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x76, 0x79, 0x65, 0x73, 0x69, 0x6d,
+0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6b, 0x65, 0x73, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x73, 0x79, 0x65, 0x69, 0x6e,
+0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x70, 0x6f, 0x72, 0x67, 0x65, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x10d, 0x6f,
+0x68, 0x10d, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x72, 0x6f, 0x6f, 0x76, 0x76, 0xe2, 0x64, 0x6d, 0xe1, 0xe1, 0x6e,
+0x75, 0x3b, 0x73, 0x6b, 0x61, 0x6d, 0x6d, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0xe2,
+0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x75, 0x111, 0x69, 0x76, 0x3b, 0x6b, 0x75, 0x6f, 0x76, 0xe2, 0x3b, 0x6e, 0x6a, 0x75, 0x68,
+0x10d, 0xe2, 0x3b, 0x63, 0x75, 0xe1, 0x14b, 0x75, 0x69, 0x3b, 0x76, 0x79, 0x65, 0x73, 0x69, 0x3b, 0x6b, 0x65, 0x73, 0x69,
+0x3b, 0x73, 0x79, 0x65, 0x69, 0x6e, 0x69, 0x3b, 0x70, 0x6f, 0x72, 0x67, 0x65, 0x3b, 0x10d, 0x6f, 0x68, 0x10d, 0xe2, 0x3b,
+0x72, 0x6f, 0x6f, 0x76, 0x76, 0xe2, 0x64, 0x3b, 0x73, 0x6b, 0x61, 0x6d, 0x6d, 0xe2, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c,
+0xe2, 0x55, 0x3b, 0x4b, 0x3b, 0x4e, 0x4a, 0x3b, 0x43, 0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x50, 0x3b, 0x10c, 0x3b,
+0x52, 0x3b, 0x53, 0x3b, 0x4a, 0x62c, 0x627, 0x646, 0x6a4, 0x6cc, 0x6d5, 0x3b, 0x641, 0x626, 0x6a4, 0x631, 0x6cc, 0x6d5, 0x3b, 0x645,
+0x627, 0x631, 0x633, 0x3b, 0x622, 0x6a4, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x659, 0x623, 0x646, 0x3b,
+0x62c, 0x648, 0x659, 0x644, 0x627, 0x3b, 0x622, 0x6af, 0x648, 0x633, 0x62a, 0x3b, 0x633, 0x626, 0x67e, 0x62a, 0x627, 0x645, 0x631, 0x3b,
+0x626, 0x648, 0x6a9, 0x62a, 0x648, 0x6a4, 0x631, 0x3b, 0x646, 0x648, 0x6a4, 0x627, 0x645, 0x631, 0x3b, 0x62f, 0x626, 0x633, 0x627, 0x645,
+0x631, 0x45, 0x6e, 0x3b, 0x50, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
+0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e,
+0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x48, 0x3b,
+0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44
};
// GENERATED PART ENDS HERE
diff --git a/src/corelib/time/qromancalendar_p.h b/src/corelib/time/qromancalendar_p.h
index 49efb3df89..4ba699ffa6 100644
--- a/src/corelib/time/qromancalendar_p.h
+++ b/src/corelib/time/qromancalendar_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -68,7 +68,7 @@ public:
protected:
// locale support:
const QCalendarLocale *localeMonthIndexData() const override;
- const ushort *localeMonthData() const override;
+ const char16_t *localeMonthData() const override;
// (The INTEGRITY compiler got upset at: using QCalendarBackend:QCalendarBackend;)
QRomanCalendar(const QString &name, QCalendar::System id = QCalendar::System::User)
: QCalendarBackend(name, id) {}
diff --git a/src/corelib/time/qtimezoneprivate_icu.cpp b/src/corelib/time/qtimezoneprivate_icu.cpp
index 8a92bbb387..33518994d1 100644
--- a/src/corelib/time/qtimezoneprivate_icu.cpp
+++ b/src/corelib/time/qtimezoneprivate_icu.cpp
@@ -347,9 +347,9 @@ QString QIcuTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
{
// TODO No ICU API, use short name instead
if (isDaylightTime(atMSecsSinceEpoch))
- return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QString());
+ return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QLocale());
else
- return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QString());
+ return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QLocale());
}
int QIcuTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const
diff --git a/src/corelib/tools/LICENSE.siphash b/src/corelib/tools/LICENSE.siphash
new file mode 100644
index 0000000000..670154e353
--- /dev/null
+++ b/src/corelib/tools/LICENSE.siphash
@@ -0,0 +1,116 @@
+CC0 1.0 Universal
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator and
+subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for the
+purpose of contributing to a commons of creative, cultural and scientific
+works ("Commons") that the public can reliably and without fear of later
+claims of infringement build upon, modify, incorporate in other works, reuse
+and redistribute as freely as possible in any form whatsoever and for any
+purposes, including without limitation commercial purposes. These owners may
+contribute to the Commons to promote the ideal of a free culture and the
+further production of creative, cultural and scientific works, or to gain
+reputation or greater distribution for their Work in part through the use and
+efforts of others.
+
+For these and/or other purposes and motivations, and without any expectation
+of additional consideration or compensation, the person associating CC0 with a
+Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
+and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
+and publicly distribute the Work under its terms, with knowledge of his or her
+Copyright and Related Rights in the Work and the meaning and intended legal
+effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not limited
+to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display, communicate,
+ and translate a Work;
+
+ ii. moral rights retained by the original author(s) and/or performer(s);
+
+ iii. publicity and privacy rights pertaining to a person's image or likeness
+ depicted in a Work;
+
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+
+ v. rights protecting the extraction, dissemination, use and reuse of data in
+ a Work;
+
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation thereof,
+ including any amended or successor version of such directive); and
+
+ vii. other similar, equivalent or corresponding rights throughout the world
+ based on applicable law or treaty, and any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention of,
+applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
+unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
+and Related Rights and associated claims and causes of action, whether now
+known or unknown (including existing as well as future claims and causes of
+action), in the Work (i) in all territories worldwide, (ii) for the maximum
+duration provided by applicable law or treaty (including future time
+extensions), (iii) in any current or future medium and for any number of
+copies, and (iv) for any purpose whatsoever, including without limitation
+commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
+the Waiver for the benefit of each member of the public at large and to the
+detriment of Affirmer's heirs and successors, fully intending that such Waiver
+shall not be subject to revocation, rescission, cancellation, termination, or
+any other legal or equitable action to disrupt the quiet enjoyment of the Work
+by the public as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason be
+judged legally invalid or ineffective under applicable law, then the Waiver
+shall be preserved to the maximum extent permitted taking into account
+Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
+is so judged Affirmer hereby grants to each affected person a royalty-free,
+non transferable, non sublicensable, non exclusive, irrevocable and
+unconditional license to exercise Affirmer's Copyright and Related Rights in
+the Work (i) in all territories worldwide, (ii) for the maximum duration
+provided by applicable law or treaty (including future time extensions), (iii)
+in any current or future medium and for any number of copies, and (iv) for any
+purpose whatsoever, including without limitation commercial, advertising or
+promotional purposes (the "License"). The License shall be deemed effective as
+of the date CC0 was applied by Affirmer to the Work. Should any part of the
+License for any reason be judged legally invalid or ineffective under
+applicable law, such partial invalidity or ineffectiveness shall not
+invalidate the remainder of the License, and in such case Affirmer hereby
+affirms that he or she will not (i) exercise any of his or her remaining
+Copyright and Related Rights in the Work or (ii) assert any associated claims
+and causes of action with respect to the Work, in either case contrary to
+Affirmer's express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+
+ b. Affirmer offers the Work as-is and makes no representations or warranties
+ of any kind concerning the Work, express, implied, statutory or otherwise,
+ including without limitation warranties of title, merchantability, fitness
+ for a particular purpose, non infringement, or the absence of latent or
+ other defects, accuracy, or the present or absence of errors, whether or not
+ discoverable, all to the greatest extent permissible under applicable law.
+
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without limitation
+ any person's Copyright and Related Rights in the Work. Further, Affirmer
+ disclaims responsibility for obtaining any necessary consents, permissions
+ or other rights required for any use of the Work.
+
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to this
+ CC0 or use of the Work.
+
+For more information, please see
+<http://creativecommons.org/publicdomain/zero/1.0/>
diff --git a/src/corelib/tools/qalgorithms.h b/src/corelib/tools/qalgorithms.h
index aa79e0d4a9..838e8472d8 100644
--- a/src/corelib/tools/qalgorithms.h
+++ b/src/corelib/tools/qalgorithms.h
@@ -744,11 +744,9 @@ Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(long un
#endif
#undef QT_POPCOUNT_CONSTEXPR
-Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint32 v) noexcept
+namespace QtPrivate {
+constexpr inline uint qConstexprCountTrailingZeroBits(quint32 v) noexcept
{
-#if defined(QT_HAS_BUILTIN_CTZ)
- return v ? QAlgorithmsPrivate::qt_builtin_ctz(v) : 32U;
-#else
// see http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightParallel
unsigned int c = 32; // c will be the number of zero bits on the right
v &= -signed(v);
@@ -759,14 +757,17 @@ Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint32 v) noexcept
if (v & 0x33333333) c -= 2;
if (v & 0x55555555) c -= 1;
return c;
-#endif
}
-Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint8 v) noexcept
+constexpr inline uint qConstexprCountTrailingZeroBits(quint64 v) noexcept
+{
+ quint32 x = static_cast<quint32>(v);
+ return x ? qConstexprCountTrailingZeroBits(x)
+ : 32 + qConstexprCountTrailingZeroBits(static_cast<quint32>(v >> 32));
+}
+
+constexpr inline uint qConstexprCountTrailingZeroBits(quint8 v) noexcept
{
-#if defined(QT_HAS_BUILTIN_CTZ)
- return v ? QAlgorithmsPrivate::qt_builtin_ctz(v) : 8U;
-#else
unsigned int c = 8; // c will be the number of zero bits on the right
v &= -signed(v);
if (v) c--;
@@ -774,14 +775,10 @@ Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint8 v) noexcept
if (v & 0x00000033) c -= 2;
if (v & 0x00000055) c -= 1;
return c;
-#endif
}
-Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint16 v) noexcept
+constexpr inline uint qConstexprCountTrailingZeroBits(quint16 v) noexcept
{
-#if defined(QT_HAS_BUILTIN_CTZS)
- return v ? QAlgorithmsPrivate::qt_builtin_ctzs(v) : 16U;
-#else
unsigned int c = 16; // c will be the number of zero bits on the right
v &= -signed(v);
if (v) c--;
@@ -790,21 +787,51 @@ Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint16 v) noexcept
if (v & 0x00003333) c -= 2;
if (v & 0x00005555) c -= 1;
return c;
+}
+
+constexpr inline uint qConstexprCountTrailingZeroBits(unsigned long v) noexcept
+{
+ return qConstexprCountTrailingZeroBits(QIntegerForSizeof<long>::Unsigned(v));
+}
+}
+
+constexpr inline uint qCountTrailingZeroBits(quint32 v) noexcept
+{
+#if defined(QT_HAS_BUILTIN_CTZ)
+ return v ? QAlgorithmsPrivate::qt_builtin_ctz(v) : 32U;
+#else
+ return QtPrivate::qConstexprCountTrailingZeroBits(v);
+#endif
+}
+
+constexpr inline uint qCountTrailingZeroBits(quint8 v) noexcept
+{
+#if defined(QT_HAS_BUILTIN_CTZ)
+ return v ? QAlgorithmsPrivate::qt_builtin_ctz(v) : 8U;
+#else
+ return QtPrivate::qConstexprCountTrailingZeroBits(v);
+#endif
+}
+
+constexpr inline uint qCountTrailingZeroBits(quint16 v) noexcept
+{
+#if defined(QT_HAS_BUILTIN_CTZS)
+ return v ? QAlgorithmsPrivate::qt_builtin_ctzs(v) : 16U;
+#else
+ return QtPrivate::qConstexprCountTrailingZeroBits(v);
#endif
}
-Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint64 v) noexcept
+constexpr inline uint qCountTrailingZeroBits(quint64 v) noexcept
{
#if defined(QT_HAS_BUILTIN_CTZLL)
return v ? QAlgorithmsPrivate::qt_builtin_ctzll(v) : 64;
#else
- quint32 x = static_cast<quint32>(v);
- return x ? qCountTrailingZeroBits(x)
- : 32 + qCountTrailingZeroBits(static_cast<quint32>(v >> 32));
+ return QtPrivate::qConstexprCountTrailingZeroBits(v);
#endif
}
-Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(unsigned long v) noexcept
+constexpr inline uint qCountTrailingZeroBits(unsigned long v) noexcept
{
return qCountTrailingZeroBits(QIntegerForSizeof<long>::Unsigned(v));
}
diff --git a/src/corelib/tools/qalgorithms.qdoc b/src/corelib/tools/qalgorithms.qdoc
index c86e69f9c3..a4a30cc798 100644
--- a/src/corelib/tools/qalgorithms.qdoc
+++ b/src/corelib/tools/qalgorithms.qdoc
@@ -39,7 +39,7 @@
on all items in a given container or in a given range.
You can use these algorithms with any \l {container
class} that provides STL-style iterators, including Qt's QList,
- QLinkedList, QVector, QMap, and QHash classes.
+ QVector, QMap, and QHash classes.
Most algorithms take \l {STL-style iterators} as parameters. The
algorithms are generic in the sense that they aren't bound to a
diff --git a/src/corelib/tools/qarraydata.cpp b/src/corelib/tools/qarraydata.cpp
index 3879b48cbb..497eae1f7f 100644
--- a/src/corelib/tools/qarraydata.cpp
+++ b/src/corelib/tools/qarraydata.cpp
@@ -153,18 +153,16 @@ QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Wmissing-field-initializers")
const QArrayData QArrayData::shared_null[2] = {
- { Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, 0, sizeof(QArrayData) }, // shared null
+ { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }, // shared null
/* zero initialized terminator */};
-static const QArrayData qt_array[3] = {
- { Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, 0, sizeof(QArrayData) }, // shared empty
- { { Q_BASIC_ATOMIC_INITIALIZER(0) }, 0, 0, 0, sizeof(QArrayData) }, // unsharable empty
+static const QArrayData emptyNotNullShared[2] = {
+ { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }, // shared empty
/* zero initialized terminator */};
QT_WARNING_POP
-static const QArrayData &qt_array_empty = qt_array[0];
-static const QArrayData &qt_array_unsharable_empty = qt_array[1];
+static const QArrayData &qt_array_empty = emptyNotNullShared[0];
static inline size_t calculateBlockSize(size_t &capacity, size_t objectSize, size_t headerSize,
uint options)
@@ -172,7 +170,7 @@ static inline size_t calculateBlockSize(size_t &capacity, size_t objectSize, siz
// Calculate the byte size
// allocSize = objectSize * capacity + headerSize, but checked for overflow
// plus padded to grow in size
- if (options & QArrayData::Grow) {
+ if (options & QArrayData::GrowsForward) {
auto r = qCalculateGrowingBlockSize(capacity, objectSize, headerSize);
capacity = r.elementCount;
return r.size;
@@ -181,91 +179,104 @@ static inline size_t calculateBlockSize(size_t &capacity, size_t objectSize, siz
}
}
+static QArrayData *allocateData(size_t allocSize, uint options)
+{
+ QArrayData *header = static_cast<QArrayData *>(::malloc(allocSize));
+ if (header) {
+ header->ref_.storeRelaxed(1);
+ header->flags = options;
+ header->alloc = 0;
+ }
+ return header;
+}
+
static QArrayData *reallocateData(QArrayData *header, size_t allocSize, uint options)
{
header = static_cast<QArrayData *>(::realloc(header, allocSize));
if (header)
- header->capacityReserved = bool(options & QArrayData::CapacityReserved);
+ header->flags = options;
return header;
}
-QArrayData *QArrayData::allocate(size_t objectSize, size_t alignment,
- size_t capacity, AllocationOptions options) noexcept
+void *QArrayData::allocate(QArrayData **dptr, size_t objectSize, size_t alignment,
+ size_t capacity, ArrayOptions options) noexcept
{
+ Q_ASSERT(dptr);
// Alignment is a power of two
- Q_ASSERT(alignment >= Q_ALIGNOF(QArrayData)
+ Q_ASSERT(alignment >= alignof(QArrayData)
&& !(alignment & (alignment - 1)));
- // Don't allocate empty headers
- if (!(options & RawData) && !capacity) {
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- if (options & Unsharable)
- return const_cast<QArrayData *>(&qt_array_unsharable_empty);
-#endif
- return const_cast<QArrayData *>(&qt_array_empty);
+ if (capacity == 0) {
+ // optimization for empty headers
+ *dptr = const_cast<QArrayData *>(&qt_array_empty);
+ return sharedNullData();
}
size_t headerSize = sizeof(QArrayData);
- // Allocate extra (alignment - Q_ALIGNOF(QArrayData)) padding bytes so we
- // can properly align the data array. This assumes malloc is able to
- // provide appropriate alignment for the header -- as it should!
- // Padding is skipped when allocating a header for RawData.
- if (!(options & RawData))
- headerSize += (alignment - Q_ALIGNOF(QArrayData));
+ if (alignment > alignof(QArrayData)) {
+ // Allocate extra (alignment - Q_ALIGNOF(QArrayData)) padding bytes so we
+ // can properly align the data array. This assumes malloc is able to
+ // provide appropriate alignment for the header -- as it should!
+ headerSize += alignment - alignof(QArrayData);
+ }
if (headerSize > size_t(MaxAllocSize))
return nullptr;
size_t allocSize = calculateBlockSize(capacity, objectSize, headerSize, options);
- QArrayData *header = static_cast<QArrayData *>(::malloc(allocSize));
+ options |= AllocatedDataType | MutableData;
+ options &= ~ImmutableHeader;
+ QArrayData *header = allocateData(allocSize, options);
+ quintptr data = 0;
if (header) {
- quintptr data = (quintptr(header) + sizeof(QArrayData) + alignment - 1)
+ // find where offset should point to so that data() is aligned to alignment bytes
+ data = (quintptr(header) + sizeof(QArrayData) + alignment - 1)
& ~(alignment - 1);
-
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- header->ref.atomic.storeRelaxed(bool(!(options & Unsharable)));
-#else
- header->ref.atomic.storeRelaxed(1);
-#endif
- header->size = 0;
- header->alloc = capacity;
- header->capacityReserved = bool(options & CapacityReserved);
- header->offset = data - quintptr(header);
+ header->alloc = uint(capacity);
}
+ *dptr = header;
+ return reinterpret_cast<void *>(data);
+}
+
+QArrayData *QArrayData::prepareRawData(ArrayOptions options) Q_DECL_NOTHROW
+{
+ QArrayData *header = allocateData(sizeof(QArrayData), (options & ~DataTypeBits) | RawDataType);
+ if (header)
+ header->alloc = 0;
return header;
}
-QArrayData *QArrayData::reallocateUnaligned(QArrayData *data, size_t objectSize, size_t capacity,
- AllocationOptions options) noexcept
+QPair<QArrayData *, void *>
+QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer,
+ size_t objectSize, size_t capacity, ArrayOptions options) noexcept
{
Q_ASSERT(data);
Q_ASSERT(data->isMutable());
- Q_ASSERT(!data->ref.isShared());
+ Q_ASSERT(!data->isShared());
size_t headerSize = sizeof(QArrayData);
size_t allocSize = calculateBlockSize(capacity, objectSize, headerSize, options);
- QArrayData *header = static_cast<QArrayData *>(reallocateData(data, allocSize, options));
- if (header)
- header->alloc = capacity;
- return header;
+ qptrdiff offset = reinterpret_cast<char *>(dataPointer) - reinterpret_cast<char *>(data);
+ options |= AllocatedDataType | MutableData;
+ QArrayData *header = reallocateData(data, allocSize, options);
+ if (header) {
+ header->alloc = uint(capacity);
+ dataPointer = reinterpret_cast<char *>(header) + offset;
+ }
+ return qMakePair(static_cast<QArrayData *>(header), dataPointer);
}
void QArrayData::deallocate(QArrayData *data, size_t objectSize,
size_t alignment) noexcept
{
// Alignment is a power of two
- Q_ASSERT(alignment >= Q_ALIGNOF(QArrayData)
+ Q_ASSERT(alignment >= alignof(QArrayData)
&& !(alignment & (alignment - 1)));
Q_UNUSED(objectSize) Q_UNUSED(alignment)
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- if (data == &qt_array_unsharable_empty)
- return;
-#endif
-
- Q_ASSERT_X(data == nullptr || !data->ref.isStatic(), "QArrayData::deallocate",
+ Q_ASSERT_X(data == nullptr || !data->isStatic(), "QArrayData::deallocate",
"Static data cannot be deleted");
::free(data);
}
diff --git a/src/corelib/tools/qarraydata.h b/src/corelib/tools/qarraydata.h
index dcd95924c1..d996b9c56b 100644
--- a/src/corelib/tools/qarraydata.h
+++ b/src/corelib/tools/qarraydata.h
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2019 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -40,32 +41,64 @@
#ifndef QARRAYDATA_H
#define QARRAYDATA_H
-#include <QtCore/qrefcount.h>
+#include <QtCore/qpair.h>
+#include <QtCore/qatomic.h>
#include <string.h>
QT_BEGIN_NAMESPACE
+template <class T> struct QTypedArrayData;
+
struct Q_CORE_EXPORT QArrayData
{
- QtPrivate::RefCount ref;
- int size;
- uint alloc : 31;
- uint capacityReserved : 1;
+ enum ArrayOption {
+ RawDataType = 0x0001, //!< this class is really a QArrayData
+ AllocatedDataType = 0x0002, //!< this class is really a QArrayAllocatedData
+ DataTypeBits = 0x000f,
+
+ CapacityReserved = 0x0010, //!< the capacity was reserved by the user, try to keep it
+ GrowsForward = 0x0020, //!< allocate with eyes towards growing through append()
+ GrowsBackwards = 0x0040, //!< allocate with eyes towards growing through prepend()
+ MutableData = 0x0080, //!< the data can be changed; doesn't say anything about the header
+ ImmutableHeader = 0x0100, //!< the header is static, it can't be changed
+
+ /// this option is used by the Q_ARRAY_LITERAL and similar macros
+ StaticDataFlags = RawDataType | ImmutableHeader,
+ /// this option is used by the allocate() function
+ DefaultAllocationFlags = MutableData,
+ /// this option is used by the prepareRawData() function
+ DefaultRawFlags = 0
+ };
+ Q_DECLARE_FLAGS(ArrayOptions, ArrayOption)
+
+ QBasicAtomicInt ref_;
+ uint flags;
+ uint alloc;
+
+ inline size_t allocatedCapacity()
+ {
+ return alloc;
+ }
- qptrdiff offset; // in bytes from beginning of header
+ inline size_t constAllocatedCapacity() const
+ {
+ return alloc;
+ }
- void *data()
+ /// Returns true if sharing took place
+ bool ref()
{
- Q_ASSERT(size == 0
- || offset < 0 || size_t(offset) >= sizeof(QArrayData));
- return reinterpret_cast<char *>(this) + offset;
+ if (!isStatic())
+ ref_.ref();
+ return true;
}
- const void *data() const
+ /// Returns false if deallocation is necessary
+ bool deref()
{
- Q_ASSERT(size == 0
- || offset < 0 || size_t(offset) >= sizeof(QArrayData));
- return reinterpret_cast<const char *>(this) + offset;
+ if (isStatic())
+ return true;
+ return ref_.deref();
}
// This refers to array data mutability, not "header data" represented by
@@ -73,183 +106,140 @@ struct Q_CORE_EXPORT QArrayData
// follow COW principles.
bool isMutable() const
{
- return alloc != 0;
+ return flags & MutableData;
}
- enum AllocationOption {
- CapacityReserved = 0x1,
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- Unsharable = 0x2,
-#endif
- RawData = 0x4,
- Grow = 0x8,
+ bool isStatic() const
+ {
+ return flags & ImmutableHeader;
+ }
- Default = 0
- };
+ bool isShared() const
+ {
+ return ref_.loadRelaxed() != 1;
+ }
- Q_DECLARE_FLAGS(AllocationOptions, AllocationOption)
+ // Returns true if a detach is necessary before modifying the data
+ // This method is intentionally not const: if you want to know whether
+ // detaching is necessary, you should be in a non-const function already
+ bool needsDetach()
+ {
+ // requires two conditionals
+ return !isMutable() || isShared();
+ }
size_t detachCapacity(size_t newSize) const
{
- if (capacityReserved && newSize < alloc)
- return alloc;
+ if (flags & CapacityReserved && newSize < constAllocatedCapacity())
+ return constAllocatedCapacity();
return newSize;
}
- AllocationOptions detachFlags() const
+ ArrayOptions detachFlags() const
{
- AllocationOptions result;
- if (capacityReserved)
+ ArrayOptions result = DefaultAllocationFlags;
+ if (flags & CapacityReserved)
result |= CapacityReserved;
return result;
}
- AllocationOptions cloneFlags() const
+ ArrayOptions cloneFlags() const
{
- AllocationOptions result;
- if (capacityReserved)
+ ArrayOptions result = DefaultAllocationFlags;
+ if (flags & CapacityReserved)
result |= CapacityReserved;
return result;
}
- Q_REQUIRED_RESULT static QArrayData *allocate(size_t objectSize, size_t alignment,
- size_t capacity, AllocationOptions options = Default) noexcept;
+ Q_REQUIRED_RESULT
+#if defined(Q_CC_GNU)
+ __attribute__((__malloc__))
+#endif
+ static void *allocate(QArrayData **pdata, size_t objectSize, size_t alignment,
+ size_t capacity, ArrayOptions options = DefaultAllocationFlags) noexcept;
Q_REQUIRED_RESULT static QArrayData *reallocateUnaligned(QArrayData *data, size_t objectSize,
- size_t newCapacity, AllocationOptions newOptions = Default) noexcept;
+ size_t newCapacity, ArrayOptions newOptions = DefaultAllocationFlags) noexcept;
+ Q_REQUIRED_RESULT static QPair<QArrayData *, void *> reallocateUnaligned(QArrayData *data, void *dataPointer,
+ size_t objectSize, size_t newCapacity, ArrayOptions newOptions = DefaultAllocationFlags) Q_DECL_NOTHROW;
+ Q_REQUIRED_RESULT static QArrayData *prepareRawData(ArrayOptions options = ArrayOptions(RawDataType))
+ Q_DECL_NOTHROW;
static void deallocate(QArrayData *data, size_t objectSize,
size_t alignment) noexcept;
static const QArrayData shared_null[2];
static QArrayData *sharedNull() noexcept { return const_cast<QArrayData*>(shared_null); }
+ static void *sharedNullData()
+ {
+ QArrayData *const null = const_cast<QArrayData *>(&shared_null[1]);
+ return null;
+ }
};
-Q_DECLARE_OPERATORS_FOR_FLAGS(QArrayData::AllocationOptions)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QArrayData::ArrayOptions)
+
+template <class T, size_t N>
+struct QStaticArrayData
+{
+ // static arrays are of type RawDataType
+ QArrayData header;
+ T data[N];
+};
+
+// Support for returning QArrayDataPointer<T> from functions
+template <class T>
+struct QArrayDataPointerRef
+{
+ QTypedArrayData<T> *ptr;
+ T *data;
+ uint size;
+};
template <class T>
struct QTypedArrayData
: QArrayData
{
-#ifdef QT_STRICT_ITERATORS
- class iterator {
- public:
- T *i;
- typedef std::random_access_iterator_tag iterator_category;
- typedef int difference_type;
- typedef T value_type;
- typedef T *pointer;
- typedef T &reference;
-
- inline iterator() : i(nullptr) {}
- inline iterator(T *n) : i(n) {}
- inline iterator(const iterator &o): i(o.i){} // #### Qt 6: remove, the implicit version is fine
- inline T &operator*() const { return *i; }
- inline T *operator->() const { return i; }
- inline T &operator[](int j) const { return *(i + j); }
- inline bool operator==(const iterator &o) const { return i == o.i; }
- inline bool operator!=(const iterator &o) const { return i != o.i; }
- inline bool operator<(const iterator& other) const { return i < other.i; }
- inline bool operator<=(const iterator& other) const { return i <= other.i; }
- inline bool operator>(const iterator& other) const { return i > other.i; }
- inline bool operator>=(const iterator& other) const { return i >= other.i; }
- inline iterator &operator++() { ++i; return *this; }
- inline iterator operator++(int) { T *n = i; ++i; return n; }
- inline iterator &operator--() { i--; return *this; }
- inline iterator operator--(int) { T *n = i; i--; return n; }
- inline iterator &operator+=(int j) { i+=j; return *this; }
- inline iterator &operator-=(int j) { i-=j; return *this; }
- inline iterator operator+(int j) const { return iterator(i+j); }
- inline iterator operator-(int j) const { return iterator(i-j); }
- friend inline iterator operator+(int j, iterator k) { return k + j; }
- inline int operator-(iterator j) const { return i - j.i; }
- inline operator T*() const { return i; }
- };
- friend class iterator;
-
- class const_iterator {
- public:
- const T *i;
- typedef std::random_access_iterator_tag iterator_category;
- typedef int difference_type;
- typedef T value_type;
- typedef const T *pointer;
- typedef const T &reference;
-
- inline const_iterator() : i(nullptr) {}
- inline const_iterator(const T *n) : i(n) {}
- inline const_iterator(const const_iterator &o): i(o.i) {} // #### Qt 6: remove, the default version is fine
- inline explicit const_iterator(const iterator &o): i(o.i) {}
- inline const T &operator*() const { return *i; }
- inline const T *operator->() const { return i; }
- inline const T &operator[](int j) const { return *(i + j); }
- inline bool operator==(const const_iterator &o) const { return i == o.i; }
- inline bool operator!=(const const_iterator &o) const { return i != o.i; }
- inline bool operator<(const const_iterator& other) const { return i < other.i; }
- inline bool operator<=(const const_iterator& other) const { return i <= other.i; }
- inline bool operator>(const const_iterator& other) const { return i > other.i; }
- inline bool operator>=(const const_iterator& other) const { return i >= other.i; }
- inline const_iterator &operator++() { ++i; return *this; }
- inline const_iterator operator++(int) { const T *n = i; ++i; return n; }
- inline const_iterator &operator--() { i--; return *this; }
- inline const_iterator operator--(int) { const T *n = i; i--; return n; }
- inline const_iterator &operator+=(int j) { i+=j; return *this; }
- inline const_iterator &operator-=(int j) { i-=j; return *this; }
- inline const_iterator operator+(int j) const { return const_iterator(i+j); }
- inline const_iterator operator-(int j) const { return const_iterator(i-j); }
- friend inline const_iterator operator+(int j, const_iterator k) { return k + j; }
- inline int operator-(const_iterator j) const { return i - j.i; }
- inline operator const T*() const { return i; }
- };
- friend class const_iterator;
-#else
typedef T* iterator;
typedef const T* const_iterator;
-#endif
-
- T *data() { return static_cast<T *>(QArrayData::data()); }
- const T *data() const { return static_cast<const T *>(QArrayData::data()); }
-
- iterator begin(iterator = iterator()) { return data(); }
- iterator end(iterator = iterator()) { return data() + size; }
- const_iterator begin(const_iterator = const_iterator()) const { return data(); }
- const_iterator end(const_iterator = const_iterator()) const { return data() + size; }
- const_iterator constBegin(const_iterator = const_iterator()) const { return data(); }
- const_iterator constEnd(const_iterator = const_iterator()) const { return data() + size; }
class AlignmentDummy { QArrayData header; T data; };
- Q_REQUIRED_RESULT static QTypedArrayData *allocate(size_t capacity,
- AllocationOptions options = Default)
+ Q_REQUIRED_RESULT static QPair<QTypedArrayData *, T *> allocate(size_t capacity,
+ ArrayOptions options = DefaultAllocationFlags)
{
Q_STATIC_ASSERT(sizeof(QTypedArrayData) == sizeof(QArrayData));
- return static_cast<QTypedArrayData *>(QArrayData::allocate(sizeof(T),
- Q_ALIGNOF(AlignmentDummy), capacity, options));
+ QArrayData *d;
+ void *result = QArrayData::allocate(&d, sizeof(T), alignof(AlignmentDummy), capacity, options);
+#if (defined(Q_CC_GNU) && Q_CC_GNU >= 407) || QT_HAS_BUILTIN(__builtin_assume_aligned)
+ result = __builtin_assume_aligned(result, Q_ALIGNOF(AlignmentDummy));
+#endif
+ return qMakePair(static_cast<QTypedArrayData *>(d), static_cast<T *>(result));
}
- static QTypedArrayData *reallocateUnaligned(QTypedArrayData *data, size_t capacity,
- AllocationOptions options = Default)
+ static QPair<QTypedArrayData *, T *>
+ reallocateUnaligned(QTypedArrayData *data, T *dataPointer, size_t capacity,
+ ArrayOptions options = DefaultAllocationFlags)
{
Q_STATIC_ASSERT(sizeof(QTypedArrayData) == sizeof(QArrayData));
- return static_cast<QTypedArrayData *>(QArrayData::reallocateUnaligned(data, sizeof(T),
- capacity, options));
+ QPair<QArrayData *, void *> pair =
+ QArrayData::reallocateUnaligned(data, dataPointer, sizeof(T), capacity, options);
+ return qMakePair(static_cast<QTypedArrayData *>(pair.first), static_cast<T *>(pair.second));
}
static void deallocate(QArrayData *data)
{
Q_STATIC_ASSERT(sizeof(QTypedArrayData) == sizeof(QArrayData));
- QArrayData::deallocate(data, sizeof(T), Q_ALIGNOF(AlignmentDummy));
+ QArrayData::deallocate(data, sizeof(T), alignof(AlignmentDummy));
}
- static QTypedArrayData *fromRawData(const T *data, size_t n,
- AllocationOptions options = Default)
+ static QArrayDataPointerRef<T> fromRawData(const T *data, size_t n,
+ ArrayOptions options = DefaultRawFlags)
{
Q_STATIC_ASSERT(sizeof(QTypedArrayData) == sizeof(QArrayData));
- QTypedArrayData *result = allocate(0, options | RawData);
- if (result) {
- Q_ASSERT(!result->ref.isShared()); // No shared empty, please!
-
- result->offset = reinterpret_cast<const char *>(data)
- - reinterpret_cast<const char *>(result);
- result->size = int(n);
+ QArrayDataPointerRef<T> result = {
+ static_cast<QTypedArrayData *>(prepareRawData(options)), const_cast<T *>(data), uint(n)
+ };
+ if (result.ptr) {
+ Q_ASSERT(!result.ptr->isShared()); // No shared empty, please!
}
return result;
}
@@ -266,38 +256,13 @@ struct QTypedArrayData
return allocate(/* capacity */ 0);
}
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- static QTypedArrayData *unsharableEmpty()
+ static T *sharedNullData()
{
Q_STATIC_ASSERT(sizeof(QTypedArrayData) == sizeof(QArrayData));
- return allocate(/* capacity */ 0, Unsharable);
+ return static_cast<T *>(QArrayData::sharedNullData());
}
-#endif
-};
-
-template <class T, size_t N>
-struct QStaticArrayData
-{
- QArrayData header;
- T data[N];
};
-// Support for returning QArrayDataPointer<T> from functions
-template <class T>
-struct QArrayDataPointerRef
-{
- QTypedArrayData<T> *ptr;
-};
-
-#define Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset) \
- { Q_REFCOUNT_INITIALIZE_STATIC, size, 0, 0, offset } \
- /**/
-
-#define Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER(type, size) \
- Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size,\
- ((sizeof(QArrayData) + (Q_ALIGNOF(type) - 1)) & ~(Q_ALIGNOF(type) - 1) )) \
- /**/
-
////////////////////////////////////////////////////////////////////////////////
// Q_ARRAY_LITERAL
@@ -333,15 +298,16 @@ struct QArrayDataPointerRef
Q_ARRAY_LITERAL_CHECK_LITERAL_TYPE(Type); \
\
/* Portable compile-time array size computation */ \
- Q_CONSTEXPR Type data[] = { __VA_ARGS__ }; Q_UNUSED(data); \
+ static Type const data[] = { __VA_ARGS__ }; \
enum { Size = sizeof(data) / sizeof(data[0]) }; \
\
- static const QStaticArrayData<Type, Size> literal = { \
- Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER(Type, Size), { __VA_ARGS__ } }; \
+ static const QArrayData literal = { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }; \
\
QArrayDataPointerRef<Type> ref = \
{ static_cast<QTypedArrayData<Type> *>( \
- const_cast<QArrayData *>(&literal.header)) }; \
+ const_cast<QArrayData *>(&literal)), \
+ const_cast<Type *>(data), \
+ Size }; \
/**/
namespace QtPrivate {
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h
index 8e19525f07..1d74f49993 100644
--- a/src/corelib/tools/qarraydataops.h
+++ b/src/corelib/tools/qarraydataops.h
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -41,12 +42,15 @@
#define QARRAYDATAOPS_H
#include <QtCore/qarraydata.h>
+#include <QtCore/qcontainertools_impl.h>
#include <new>
#include <string.h>
QT_BEGIN_NAMESPACE
+template <class T> struct QArrayDataPointer;
+
namespace QtPrivate {
QT_WARNING_PUSH
@@ -56,48 +60,70 @@ QT_WARNING_DISABLE_GCC("-Wstringop-overflow")
template <class T>
struct QPodArrayOps
- : QTypedArrayData<T>
+ : public QArrayDataPointer<T>
{
+ typedef typename QArrayDataPointer<T>::parameter_type parameter_type;
+
void appendInitialize(size_t newSize)
{
Q_ASSERT(this->isMutable());
- Q_ASSERT(!this->ref.isShared());
+ Q_ASSERT(!this->isShared());
Q_ASSERT(newSize > uint(this->size));
- Q_ASSERT(newSize <= this->alloc);
+ Q_ASSERT(newSize <= this->allocatedCapacity());
::memset(static_cast<void *>(this->end()), 0, (newSize - this->size) * sizeof(T));
this->size = int(newSize);
}
+ template<typename iterator>
+ void copyAppend(iterator b, iterator e, QtPrivate::IfIsForwardIterator<iterator> = true)
+ {
+ Q_ASSERT(this->isMutable() || b == e);
+ Q_ASSERT(!this->isShared() || b == e);
+ Q_ASSERT(std::distance(b, e) >= 0 && size_t(std::distance(b, e)) <= this->allocatedCapacity() - this->size);
+
+ T *iter = this->end();
+ for (; b != e; ++iter, ++b) {
+ new (iter) T(*b);
+ ++this->size;
+ }
+ }
+
void copyAppend(const T *b, const T *e)
{
- Q_ASSERT(this->isMutable());
- Q_ASSERT(!this->ref.isShared());
- Q_ASSERT(b < e);
- Q_ASSERT(size_t(e - b) <= this->alloc - uint(this->size));
+ Q_ASSERT(this->isMutable() || b == e);
+ Q_ASSERT(!this->isShared() || b == e);
+ Q_ASSERT(b <= e);
+ Q_ASSERT(size_t(e - b) <= this->allocatedCapacity() - this->size);
::memcpy(static_cast<void *>(this->end()), static_cast<const void *>(b),
(e - b) * sizeof(T));
this->size += e - b;
}
- void copyAppend(size_t n, const T &t)
+ void moveAppend(T *b, T *e)
+ { copyAppend(b, e); }
+
+ void copyAppend(size_t n, parameter_type t)
{
- Q_ASSERT(this->isMutable());
- Q_ASSERT(!this->ref.isShared());
- Q_ASSERT(n <= this->alloc - uint(this->size));
+ Q_ASSERT(this->isMutable() || n == 0);
+ Q_ASSERT(!this->isShared() || n == 0);
+ Q_ASSERT(n <= uint(this->allocatedCapacity() - this->size));
T *iter = this->end();
const T *const end = iter + n;
for (; iter != end; ++iter)
- ::memcpy(iter, &t, sizeof(T));
+ *iter = t;
this->size += int(n);
}
+ template <typename ...Args>
+ void emplaceBack(Args&&... args) { this->emplace(this->end(), T(std::forward<Args>(args)...)); }
+
void truncate(size_t newSize)
{
Q_ASSERT(this->isMutable());
- Q_ASSERT(!this->ref.isShared());
+ Q_ASSERT(!this->isShared());
Q_ASSERT(newSize < size_t(this->size));
this->size = int(newSize);
@@ -106,7 +132,7 @@ struct QPodArrayOps
void destroyAll() // Call from destructors, ONLY!
{
Q_ASSERT(this->isMutable());
- Q_ASSERT(this->ref.atomic.loadRelaxed() == 0);
+ Q_ASSERT(this->d->ref_.loadRelaxed() == 0);
// As this is to be called only from destructor, it doesn't need to be
// exception safe; size not updated.
@@ -115,11 +141,11 @@ struct QPodArrayOps
void insert(T *where, const T *b, const T *e)
{
Q_ASSERT(this->isMutable());
- Q_ASSERT(!this->ref.isShared());
+ Q_ASSERT(!this->isShared());
Q_ASSERT(where >= this->begin() && where < this->end()); // Use copyAppend at end
- Q_ASSERT(b < e);
+ Q_ASSERT(b <= e);
Q_ASSERT(e <= where || b > this->end()); // No overlap
- Q_ASSERT(size_t(e - b) <= this->alloc - uint(this->size));
+ Q_ASSERT(size_t(e - b) <= this->allocatedCapacity() - this->size);
::memmove(static_cast<void *>(where + (e - b)), static_cast<void *>(where),
(static_cast<const T*>(this->end()) - where) * sizeof(T));
@@ -127,43 +153,109 @@ struct QPodArrayOps
this->size += (e - b);
}
+ void insert(T *where, size_t n, parameter_type t)
+ {
+ Q_ASSERT(!this->isShared());
+ Q_ASSERT(where >= this->begin() && where < this->end()); // Use copyAppend at end
+ Q_ASSERT(this->allocatedCapacity() - this->size >= n);
+
+ ::memmove(static_cast<void *>(where + n), static_cast<void *>(where),
+ (static_cast<const T*>(this->end()) - where) * sizeof(T));
+ this->size += int(n); // PODs can't throw on copy
+ while (n--)
+ *where++ = t;
+ }
+
+ template <typename ...Args>
+ void createInPlace(T *where, Args&&... args) { new (where) T(std::forward<Args>(args)...); }
+
+ template <typename ...Args>
+ void emplace(T *where, Args&&... args)
+ {
+ Q_ASSERT(!this->isShared());
+ Q_ASSERT(where >= this->begin() && where <= this->end());
+ Q_ASSERT(this->allocatedCapacity() - this->size >= 1);
+
+ if (where == this->end()) {
+ new (this->end()) T(std::forward<Args>(args)...);
+ } else {
+ // Preserve the value, because it might be a reference to some part of the moved chunk
+ T t(std::forward<Args>(args)...);
+
+ ::memmove(static_cast<void *>(where + 1), static_cast<void *>(where),
+ (static_cast<const T*>(this->end()) - where) * sizeof(T));
+ *where = t;
+ }
+
+ ++this->size;
+ }
+
+
void erase(T *b, T *e)
{
Q_ASSERT(this->isMutable());
Q_ASSERT(b < e);
Q_ASSERT(b >= this->begin() && b < this->end());
- Q_ASSERT(e > this->begin() && e < this->end());
+ Q_ASSERT(e > this->begin() && e <= this->end());
::memmove(static_cast<void *>(b), static_cast<void *>(e),
(static_cast<T *>(this->end()) - e) * sizeof(T));
this->size -= (e - b);
}
+
+ void assign(T *b, T *e, parameter_type t)
+ {
+ Q_ASSERT(b <= e);
+ Q_ASSERT(b >= this->begin() && e <= this->end());
+
+ while (b != e)
+ ::memcpy(static_cast<void *>(b++), static_cast<const void *>(&t), sizeof(T));
+ }
+
+ bool compare(const T *begin1, const T *begin2, size_t n) const
+ {
+ // only use memcmp for fundamental types or pointers.
+ // Other types could have padding in the data structure or custom comparison
+ // operators that would break the comparison using memcmp
+ if (QArrayDataPointer<T>::pass_parameter_by_value)
+ return ::memcmp(begin1, begin2, n * sizeof(T)) == 0;
+ const T *end1 = begin1 + n;
+ while (begin1 != end1) {
+ if (*begin1 == *begin2)
+ ++begin1, ++begin2;
+ else
+ return false;
+ }
+ return true;
+ }
};
QT_WARNING_POP
template <class T>
struct QGenericArrayOps
- : QTypedArrayData<T>
+ : public QArrayDataPointer<T>
{
+ typedef typename QArrayDataPointer<T>::parameter_type parameter_type;
+
void appendInitialize(size_t newSize)
{
Q_ASSERT(this->isMutable());
- Q_ASSERT(!this->ref.isShared());
+ Q_ASSERT(!this->isShared());
Q_ASSERT(newSize > uint(this->size));
- Q_ASSERT(newSize <= this->alloc);
+ Q_ASSERT(newSize <= this->allocatedCapacity());
- T *const begin = this->begin();
+ T *const b = this->begin();
do {
- new (begin + this->size) T;
+ new (b + this->size) T;
} while (uint(++this->size) != newSize);
}
- void copyAppend(const T *b, const T *e)
+ template<typename iterator>
+ void copyAppend(iterator b, iterator e, QtPrivate::IfIsForwardIterator<iterator> = true)
{
- Q_ASSERT(this->isMutable());
- Q_ASSERT(!this->ref.isShared());
- Q_ASSERT(b < e);
- Q_ASSERT(size_t(e - b) <= this->alloc - uint(this->size));
+ Q_ASSERT(this->isMutable() || b == e);
+ Q_ASSERT(!this->isShared() || b == e);
+ Q_ASSERT(std::distance(b, e) >= 0 && size_t(std::distance(b, e)) <= this->allocatedCapacity() - this->size);
T *iter = this->end();
for (; b != e; ++iter, ++b) {
@@ -172,11 +264,37 @@ struct QGenericArrayOps
}
}
- void copyAppend(size_t n, const T &t)
+ void copyAppend(const T *b, const T *e)
{
- Q_ASSERT(this->isMutable());
- Q_ASSERT(!this->ref.isShared());
- Q_ASSERT(n <= this->alloc - uint(this->size));
+ Q_ASSERT(this->isMutable() || b == e);
+ Q_ASSERT(!this->isShared() || b == e);
+ Q_ASSERT(std::distance(b, e) >= 0 && size_t(std::distance(b, e)) <= this->allocatedCapacity() - this->size);
+
+ T *iter = this->end();
+ this->size += e - b;
+ for (; b != e; ++iter, ++b)
+ new (iter) T(*b);
+ }
+
+ void moveAppend(T *b, T *e)
+ {
+ Q_ASSERT(this->isMutable() || b == e);
+ Q_ASSERT(!this->isShared() || b == e);
+ Q_ASSERT(b <= e);
+ Q_ASSERT(size_t(e - b) <= this->allocatedCapacity() - this->size);
+
+ T *iter = this->end();
+ for (; b != e; ++iter, ++b) {
+ new (iter) T(std::move(*b));
+ ++this->size;
+ }
+ }
+
+ void copyAppend(size_t n, parameter_type t)
+ {
+ Q_ASSERT(this->isMutable() || n == 0);
+ Q_ASSERT(!this->isShared() || n == 0);
+ Q_ASSERT(n <= size_t(this->allocatedCapacity() - this->size));
T *iter = this->end();
const T *const end = iter + n;
@@ -186,10 +304,16 @@ struct QGenericArrayOps
}
}
+ template <typename ...Args>
+ void emplaceBack(Args&&... args)
+ {
+ this->emplace(this->end(), std::forward<Args>(args)...);
+ }
+
void truncate(size_t newSize)
{
Q_ASSERT(this->isMutable());
- Q_ASSERT(!this->ref.isShared());
+ Q_ASSERT(!this->isShared());
Q_ASSERT(newSize < size_t(this->size));
const T *const b = this->begin();
@@ -204,7 +328,7 @@ struct QGenericArrayOps
// As this is to be called only from destructor, it doesn't need to be
// exception safe; size not updated.
- Q_ASSERT(this->ref.atomic.loadRelaxed() == 0);
+ Q_ASSERT(this->d->ref_.loadRelaxed() == 0);
const T *const b = this->begin();
const T *i = this->end();
@@ -216,11 +340,11 @@ struct QGenericArrayOps
void insert(T *where, const T *b, const T *e)
{
Q_ASSERT(this->isMutable());
- Q_ASSERT(!this->ref.isShared());
+ Q_ASSERT(!this->isShared());
Q_ASSERT(where >= this->begin() && where < this->end()); // Use copyAppend at end
- Q_ASSERT(b < e);
+ Q_ASSERT(b <= e);
Q_ASSERT(e <= where || b > this->end()); // No overlap
- Q_ASSERT(size_t(e - b) <= this->alloc - uint(this->size));
+ Q_ASSERT(size_t(e - b) <= this->allocatedCapacity() - this->size);
// Array may be truncated at where in case of exceptions
@@ -279,25 +403,128 @@ struct QGenericArrayOps
}
}
+ void insert(T *where, size_t n, parameter_type t)
+ {
+ Q_ASSERT(!this->isShared());
+ Q_ASSERT(where >= this->begin() && where <= this->end());
+ Q_ASSERT(this->allocatedCapacity() - this->size >= n);
+
+ // Array may be truncated at where in case of exceptions
+ T *const end = this->end();
+ const T *readIter = end;
+ T *writeIter = end + n;
+
+ const T *const step1End = where + qMax<size_t>(n, end - where);
+
+ struct Destructor
+ {
+ Destructor(T *&it)
+ : iter(&it)
+ , end(it)
+ {
+ }
+
+ void commit()
+ {
+ iter = &end;
+ }
+
+ ~Destructor()
+ {
+ for (; *iter != end; --*iter)
+ (*iter)->~T();
+ }
+
+ T **iter;
+ T *end;
+ } destroyer(writeIter);
+
+ // Construct new elements in array
+ do {
+ --readIter, --writeIter;
+ new (writeIter) T(*readIter);
+ } while (writeIter != step1End);
+
+ while (writeIter != end) {
+ --n, --writeIter;
+ new (writeIter) T(t);
+ }
+
+ destroyer.commit();
+ this->size += destroyer.end - end;
+
+ // Copy assign over existing elements
+ while (readIter != where) {
+ --readIter, --writeIter;
+ *writeIter = *readIter;
+ }
+
+ while (writeIter != where) {
+ --n, --writeIter;
+ *writeIter = t;
+ }
+ }
+
+ template <typename ...Args>
+ void createInPlace(T *where, Args&&... args) { new (where) T(std::forward<Args>(args)...); }
+
+ template <typename iterator, typename ...Args>
+ void emplace(iterator where, Args&&... args)
+ {
+ Q_ASSERT(!this->isShared());
+ Q_ASSERT(where >= this->begin() && where <= this->end());
+ Q_ASSERT(this->allocatedCapacity() - this->size >= 1);
+
+ createInPlace(this->end(), std::forward<Args>(args)...);
+ ++this->size;
+
+ std::rotate(where, this->end() - 1, this->end());
+ }
+
void erase(T *b, T *e)
{
Q_ASSERT(this->isMutable());
Q_ASSERT(b < e);
Q_ASSERT(b >= this->begin() && b < this->end());
- Q_ASSERT(e > this->begin() && e < this->end());
+ Q_ASSERT(e > this->begin() && e <= this->end());
const T *const end = this->end();
- do {
+ // move (by assignment) the elements from e to end
+ // onto b to the new end
+ while (e != end) {
*b = *e;
++b, ++e;
- } while (e != end);
+ }
+ // destroy the final elements at the end
+ // here, b points to the new end and e to the actual end
do {
(--e)->~T();
--this->size;
} while (e != b);
}
+
+ void assign(T *b, T *e, parameter_type t)
+ {
+ Q_ASSERT(b <= e);
+ Q_ASSERT(b >= this->begin() && e <= this->end());
+
+ while (b != e)
+ *b++ = t;
+ }
+
+ bool compare(const T *begin1, const T *begin2, size_t n) const
+ {
+ const T *end1 = begin1 + n;
+ while (begin1 != end1) {
+ if (*begin1 == *begin2)
+ ++begin1, ++begin2;
+ else
+ return false;
+ }
+ return true;
+ }
};
template <class T>
@@ -308,15 +535,16 @@ struct QMovableArrayOps
// using QGenericArrayOps<T>::copyAppend;
// using QGenericArrayOps<T>::truncate;
// using QGenericArrayOps<T>::destroyAll;
+ typedef typename QGenericArrayOps<T>::parameter_type parameter_type;
void insert(T *where, const T *b, const T *e)
{
Q_ASSERT(this->isMutable());
- Q_ASSERT(!this->ref.isShared());
+ Q_ASSERT(!this->isShared());
Q_ASSERT(where >= this->begin() && where < this->end()); // Use copyAppend at end
- Q_ASSERT(b < e);
+ Q_ASSERT(b <= e);
Q_ASSERT(e <= where || b > this->end()); // No overlap
- Q_ASSERT(size_t(e - b) <= this->alloc - uint(this->size));
+ Q_ASSERT(size_t(e - b) <= this->allocatedCapacity() - this->size);
// Provides strong exception safety guarantee,
// provided T::~T() nothrow
@@ -376,12 +604,79 @@ struct QMovableArrayOps
this->size += (e - b);
}
+ void insert(T *where, size_t n, parameter_type t)
+ {
+ Q_ASSERT(!this->isShared());
+ Q_ASSERT(where >= this->begin() && where <= this->end());
+ Q_ASSERT(this->allocatedCapacity() - this->size >= n);
+
+ // Provides strong exception safety guarantee,
+ // provided T::~T() nothrow
+
+ struct ReversibleDisplace
+ {
+ ReversibleDisplace(T *start, T *finish, size_t diff)
+ : begin(start)
+ , end(finish)
+ , displace(diff)
+ {
+ ::memmove(static_cast<void *>(begin + displace), static_cast<void *>(begin),
+ (end - begin) * sizeof(T));
+ }
+
+ void commit() { displace = 0; }
+
+ ~ReversibleDisplace()
+ {
+ if (displace)
+ ::memmove(static_cast<void *>(begin), static_cast<void *>(begin + displace),
+ (end - begin) * sizeof(T));
+ }
+
+ T *const begin;
+ T *const end;
+ size_t displace;
+
+ } displace(where, this->end(), n);
+
+ struct CopyConstructor
+ {
+ CopyConstructor(T *w) : where(w) {}
+
+ void copy(size_t count, parameter_type proto)
+ {
+ n = 0;
+ while (count--) {
+ new (where + n) T(proto);
+ ++n;
+ }
+ n = 0;
+ }
+
+ ~CopyConstructor()
+ {
+ while (n)
+ where[--n].~T();
+ }
+
+ T *const where;
+ size_t n;
+ } copier(where);
+
+ copier.copy(n, t);
+ displace.commit();
+ this->size += int(n);
+ }
+
+ // use moving insert
+ using QGenericArrayOps<T>::insert;
+
void erase(T *b, T *e)
{
Q_ASSERT(this->isMutable());
Q_ASSERT(b < e);
Q_ASSERT(b >= this->begin() && b < this->end());
- Q_ASSERT(e > this->begin() && e < this->end());
+ Q_ASSERT(e > this->begin() && e <= this->end());
struct Mover
{
@@ -405,11 +700,51 @@ struct QMovableArrayOps
int &size;
} mover(e, this->end(), this->size);
+ // destroy the elements we're erasing
do {
// Exceptions or not, dtor called once per instance
(--e)->~T();
} while (e != b);
}
+
+ void moveAppend(T *b, T *e)
+ {
+ Q_ASSERT(this->isMutable());
+ Q_ASSERT(!this->isShared());
+ Q_ASSERT(b <= e);
+ Q_ASSERT(e <= this->begin() || b > this->end()); // No overlap
+ Q_ASSERT(size_t(e - b) <= this->allocatedCapacity() - this->size);
+
+ // Provides strong exception safety guarantee,
+ // provided T::~T() nothrow
+
+ struct CopyConstructor
+ {
+ CopyConstructor(T *w) : where(w) {}
+
+ void copy(T *src, const T *const srcEnd)
+ {
+ n = 0;
+ for (; src != srcEnd; ++src) {
+ new (where + n) T(std::move(*src));
+ ++n;
+ }
+ n = 0;
+ }
+
+ ~CopyConstructor()
+ {
+ while (n)
+ where[--n].~T();
+ }
+
+ T *const where;
+ size_t n;
+ } copier(this->end());
+
+ copier.copy(b, e);
+ this->size += (e - b);
+ }
};
template <class T, class = void>
diff --git a/src/corelib/tools/qarraydatapointer.h b/src/corelib/tools/qarraydatapointer.h
index af5173c9ad..a17cf4a101 100644
--- a/src/corelib/tools/qarraydatapointer.h
+++ b/src/corelib/tools/qarraydatapointer.h
@@ -41,6 +41,7 @@
#define QARRAYDATAPOINTER_H
#include <QtCore/qarraydataops.h>
+#include <QtCore/qcontainertools_impl.h>
QT_BEGIN_NAMESPACE
@@ -52,30 +53,40 @@ private:
typedef QArrayDataOps<T> DataOps;
public:
+ typedef typename Data::iterator iterator;
+ typedef typename Data::const_iterator const_iterator;
+ enum { pass_parameter_by_value = std::is_fundamental<T>::value || std::is_pointer<T>::value };
+
+ typedef typename std::conditional<pass_parameter_by_value, T, const T &>::type parameter_type;
+
QArrayDataPointer() noexcept
- : d(Data::sharedNull())
+ : d(Data::sharedNull()), ptr(Data::sharedNullData()), size(0)
{
}
- QArrayDataPointer(const QArrayDataPointer &other)
- : d(other.d->ref.ref()
- ? other.d
- : other.clone(other.d->cloneFlags()))
+ QArrayDataPointer(const QArrayDataPointer &other) noexcept
+ : d(other.d), ptr(other.ptr), size(other.size)
{
+ other.d->ref();
}
- explicit QArrayDataPointer(QTypedArrayData<T> *ptr)
- : d(ptr)
+ QArrayDataPointer(Data *header, T *adata, size_t n = 0) noexcept
+ : d(header), ptr(adata), size(int(n))
{
- Q_CHECK_PTR(ptr);
}
- QArrayDataPointer(QArrayDataPointerRef<T> ref)
- : d(ref.ptr)
+ explicit QArrayDataPointer(QPair<QTypedArrayData<T> *, T *> adata, size_t n = 0)
+ : d(adata.first), ptr(adata.second), size(int(n))
{
+ Q_CHECK_PTR(d);
}
- QArrayDataPointer &operator=(const QArrayDataPointer &other)
+ QArrayDataPointer(QArrayDataPointerRef<T> dd) noexcept
+ : d(dd.ptr), ptr(dd.data), size(dd.size)
+ {
+ }
+
+ QArrayDataPointer &operator=(const QArrayDataPointer &other) noexcept
{
QArrayDataPointer tmp(other);
this->swap(tmp);
@@ -83,9 +94,11 @@ public:
}
QArrayDataPointer(QArrayDataPointer &&other) noexcept
- : d(other.d)
+ : d(other.d), ptr(other.ptr), size(other.size)
{
other.d = Data::sharedNull();
+ other.ptr = Data::sharedNullData();
+ other.size = 0;
}
QArrayDataPointer &operator=(QArrayDataPointer &&other) noexcept
@@ -95,114 +108,142 @@ public:
return *this;
}
- DataOps &operator*() const
+ DataOps &operator*() noexcept
{
Q_ASSERT(d);
- return *static_cast<DataOps *>(d);
+ return *static_cast<DataOps *>(this);
}
- DataOps *operator->() const
+ DataOps *operator->() noexcept
{
Q_ASSERT(d);
- return static_cast<DataOps *>(d);
+ return static_cast<DataOps *>(this);
}
- ~QArrayDataPointer()
+ const DataOps &operator*() const noexcept
{
- if (!d->ref.deref()) {
- if (d->isMutable())
- (*this)->destroyAll();
- Data::deallocate(d);
- }
+ Q_ASSERT(d);
+ return *static_cast<const DataOps *>(this);
}
- bool isNull() const
+ const DataOps *operator->() const noexcept
{
- return d == Data::sharedNull();
+ Q_ASSERT(d);
+ return static_cast<const DataOps *>(this);
}
- Data *data() const
+ ~QArrayDataPointer()
{
- return d;
+ if (!deref()) {
+ if (isMutable())
+ (*this)->destroyAll();
+ Data::deallocate(d);
+ }
}
- bool needsDetach() const
+ bool isNull() const noexcept
{
- return (!d->isMutable() || d->ref.isShared());
+ return d == Data::sharedNull();
}
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- void setSharable(bool sharable)
- {
- if (needsDetach()) {
- Data *detached = clone(sharable
- ? d->detachFlags() & ~QArrayData::Unsharable
- : d->detachFlags() | QArrayData::Unsharable);
- QArrayDataPointer old(d);
- d = detached;
- } else {
- d->ref.setSharable(sharable);
- }
- }
+ T *data() noexcept { return ptr; }
+ const T *data() const noexcept { return ptr; }
- bool isSharable() const { return d->isSharable(); }
-#endif
+ iterator begin(iterator = iterator()) noexcept { return data(); }
+ iterator end(iterator = iterator()) noexcept { return data() + size; }
+ const_iterator begin(const_iterator = const_iterator()) const noexcept { return data(); }
+ const_iterator end(const_iterator = const_iterator()) const noexcept { return data() + size; }
+ const_iterator constBegin(const_iterator = const_iterator()) const noexcept { return data(); }
+ const_iterator constEnd(const_iterator = const_iterator()) const noexcept { return data() + size; }
void swap(QArrayDataPointer &other) noexcept
{
qSwap(d, other.d);
+ qSwap(ptr, other.ptr);
+ qSwap(size, other.size);
}
- void clear()
+ void clear() Q_DECL_NOEXCEPT_EXPR(std::is_nothrow_destructible<T>::value)
{
- QArrayDataPointer tmp(d);
- d = Data::sharedNull();
+ QArrayDataPointer tmp;
+ swap(tmp);
}
bool detach()
{
- if (needsDetach()) {
- Data *copy = clone(d->detachFlags());
- QArrayDataPointer old(d);
- d = copy;
+ if (d->needsDetach()) {
+ QPair<Data *, T *> copy = clone(d->detachFlags());
+ QArrayDataPointer old(d, ptr, size);
+ d = copy.first;
+ ptr = copy.second;
return true;
}
return false;
}
-private:
- Q_REQUIRED_RESULT Data *clone(QArrayData::AllocationOptions options) const
+ // forwards from QArrayData
+ size_t allocatedCapacity() noexcept { return d->allocatedCapacity(); }
+ size_t constAllocatedCapacity() const noexcept { return d->constAllocatedCapacity(); }
+ int refCounterValue() const noexcept { return d->refCounterValue(); }
+ bool ref() noexcept { return d->ref(); }
+ bool deref() noexcept { return d->deref(); }
+ bool isMutable() const noexcept { return d->isMutable(); }
+ bool isStatic() const noexcept { return d->isStatic(); }
+ bool isShared() const noexcept { return d->isShared(); }
+ bool isSharedWith(const QArrayDataPointer &other) const noexcept { return d && d == other.d; }
+ bool needsDetach() const noexcept { return d->needsDetach(); }
+ size_t detachCapacity(size_t newSize) const noexcept { return d->detachCapacity(newSize); }
+ typename Data::ArrayOptions &flags() noexcept { return reinterpret_cast<typename Data::ArrayOptions &>(d->flags); }
+ typename Data::ArrayOptions flags() const noexcept { return typename Data::ArrayOption(d->flags); }
+ typename Data::ArrayOptions detachFlags() const noexcept { return d->detachFlags(); }
+ typename Data::ArrayOptions cloneFlags() const noexcept { return d->cloneFlags(); }
+
+ void reallocate(uint alloc, typename Data::ArrayOptions options)
{
- Data *x = Data::allocate(d->detachCapacity(d->size), options);
- Q_CHECK_PTR(x);
- QArrayDataPointer copy(x);
+ auto pair = Data::reallocateUnaligned(d, ptr, alloc, options);
+ d = pair.first;
+ ptr = pair.second;
+ }
+ Data *d_ptr() { return d; }
- if (d->size)
- copy->copyAppend(d->begin(), d->end());
+private:
+ Q_REQUIRED_RESULT QPair<Data *, T *> clone(QArrayData::ArrayOptions options) const
+ {
+ QPair<Data *, T *> pair = Data::allocate(d->detachCapacity(size),
+ options);
+ Q_CHECK_PTR(pair.first);
+ QArrayDataPointer copy(pair.first, pair.second, 0);
+ if (size)
+ copy->copyAppend(begin(), end());
- Data *result = copy.d;
+ pair.first = copy.d;
copy.d = Data::sharedNull();
- return result;
+ return pair;
}
+protected:
Data *d;
+ T *ptr;
+
+public:
+ int size;
};
template <class T>
-inline bool operator==(const QArrayDataPointer<T> &lhs, const QArrayDataPointer<T> &rhs)
+inline bool operator==(const QArrayDataPointer<T> &lhs, const QArrayDataPointer<T> &rhs) noexcept
{
- return lhs.data() == rhs.data();
+ return lhs.data() == rhs.data() && lhs.size == rhs.size;
}
template <class T>
-inline bool operator!=(const QArrayDataPointer<T> &lhs, const QArrayDataPointer<T> &rhs)
+inline bool operator!=(const QArrayDataPointer<T> &lhs, const QArrayDataPointer<T> &rhs) noexcept
{
- return lhs.data() != rhs.data();
+ return lhs.data() != rhs.data() || lhs.size != rhs.size;
}
template <class T>
-inline void swap(QArrayDataPointer<T> &p1, QArrayDataPointer<T> &p2)
+inline void qSwap(QArrayDataPointer<T> &p1, QArrayDataPointer<T> &p2) noexcept
{
p1.swap(p2);
}
diff --git a/src/corelib/tools/qbitarray.cpp b/src/corelib/tools/qbitarray.cpp
index ab3054d5be..12ad6f4573 100644
--- a/src/corelib/tools/qbitarray.cpp
+++ b/src/corelib/tools/qbitarray.cpp
@@ -342,6 +342,38 @@ QBitArray QBitArray::fromBits(const char *data, qsizetype size)
return result;
}
+/*!
+ \since 6.0
+
+ Returns the array of bit converted to an int. The conversion is based on \a endianness.
+ Converts up to the first 32 bits of the array to \c quint32 and returns it,
+ obeying \a endianness. If \a ok is not a null pointer, and the array has more
+ than 32 bits, \a ok is set to false and this function returns zero; otherwise,
+ it's set to true.
+*/
+quint32 QBitArray::toUInt32(QSysInfo::Endian endianness, bool *ok) const noexcept
+{
+ const qsizetype _size = size();
+ if (_size > 32) {
+ if (ok)
+ *ok = false;
+ return 0;
+ }
+
+ if (ok)
+ *ok = true;
+
+ quint32 factor = 1;
+ quint32 total = 0;
+ for (qsizetype i = 0; i < _size; ++i, factor *= 2) {
+ const auto index = endianness == QSysInfo::Endian::LittleEndian ? i : (_size - i - 1);
+ if (testBit(index))
+ total += factor;
+ }
+
+ return total;
+}
+
/*! \fn bool QBitArray::isDetached() const
\internal
diff --git a/src/corelib/tools/qbitarray.h b/src/corelib/tools/qbitarray.h
index 9b0e931aca..e8ef032c24 100644
--- a/src/corelib/tools/qbitarray.h
+++ b/src/corelib/tools/qbitarray.h
@@ -50,7 +50,7 @@ class Q_CORE_EXPORT QBitArray
{
friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QBitArray &);
friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QBitArray &);
- friend Q_CORE_EXPORT uint qHash(const QBitArray &key, uint seed) noexcept;
+ friend Q_CORE_EXPORT size_t qHash(const QBitArray &key, size_t seed) noexcept;
QByteArray d;
public:
@@ -105,8 +105,10 @@ public:
const char *bits() const { return isEmpty() ? nullptr : d.constData() + 1; }
static QBitArray fromBits(const char *data, qsizetype len);
+ quint32 toUInt32(QSysInfo::Endian endianness, bool *ok = nullptr) const noexcept;
+
public:
- typedef QByteArray::DataPtr DataPtr;
+ typedef QByteArray::DataPointer DataPtr;
inline DataPtr &data_ptr() { return d.data_ptr(); }
};
diff --git a/src/corelib/tools/qcache.h b/src/corelib/tools/qcache.h
index 4fcde46fbc..3582a44e32 100644
--- a/src/corelib/tools/qcache.h
+++ b/src/corelib/tools/qcache.h
@@ -48,151 +48,244 @@ QT_BEGIN_NAMESPACE
template <class Key, class T>
class QCache
{
- struct Node {
- inline Node() : keyPtr(0) {}
- inline Node(T *data, int cost)
- : keyPtr(nullptr), t(data), c(cost), p(nullptr), n(nullptr) {}
- const Key *keyPtr; T *t; int c; Node *p,*n;
+ struct Value {
+ T *t = nullptr;
+ int cost = 0;
+ Value() noexcept = default;
+ Value(T *tt, int c) noexcept
+ : t(tt), cost(c)
+ {}
+ Value(Value &&other) noexcept
+ : t(other.t),
+ cost(other.cost)
+ {
+ other.t = nullptr;
+ }
+ Value &operator=(Value &&other) noexcept
+ {
+ qSwap(t, other.t);
+ qSwap(cost, other.cost);
+ return *this;
+ }
+ ~Value() { delete t; }
+ private:
+ Q_DISABLE_COPY(Value)
};
- Node *f, *l;
- QHash<Key, Node> hash;
- int mx, total;
-
- inline void unlink(Node &n) {
- if (n.p) n.p->n = n.n;
- if (n.n) n.n->p = n.p;
- if (l == &n) l = n.p;
- if (f == &n) f = n.n;
- total -= n.c;
- T *obj = n.t;
- hash.remove(*n.keyPtr);
- delete obj;
- }
- inline T *relink(const Key &key) {
- typename QHash<Key, Node>::iterator i = hash.find(key);
- if (typename QHash<Key, Node>::const_iterator(i) == hash.constEnd())
- return nullptr;
- Node &n = *i;
- if (f != &n) {
- if (n.p) n.p->n = n.n;
- if (n.n) n.n->p = n.p;
- if (l == &n) l = n.p;
- n.p = nullptr;
- n.n = f;
- f->p = &n;
- f = &n;
- }
- return n.t;
- }
+ struct Chain {
+ Chain() noexcept
+ : prev(this), next(this)
+ {}
+ Chain *prev;
+ Chain *next;
+ };
- Q_DISABLE_COPY(QCache)
+ struct Node : public Chain {
+ using KeyType = Key;
+ using ValueType = Value;
-public:
- inline explicit QCache(int maxCost = 100) noexcept;
- inline ~QCache() { clear(); }
+ Key key;
+ Value value;
- inline int maxCost() const { return mx; }
- void setMaxCost(int m);
- inline int totalCost() const { return total; }
+ Node(const Key &k, Value &&t) noexcept(std::is_nothrow_move_assignable_v<Key>)
+ : Chain(),
+ key(k),
+ value(std::move(t))
+ {
+ }
+ Node(Key &&k, Value &&t) noexcept(std::is_nothrow_move_assignable_v<Key>)
+ : Chain(),
+ key(std::move(k)),
+ value(std::move(t))
+ {
+ }
+ static void createInPlace(Node *n, const Key &k, T *o, int cost)
+ {
+ new (n) Node{ Key(k), Value(o, cost) };
+ }
+ void emplace(T *o, int cost)
+ {
+ value = Value(o, cost);
+ }
+ static Node create(const Key &k, Value &&t) noexcept(std::is_nothrow_move_assignable_v<Key> && std::is_nothrow_move_assignable_v<T>)
+ {
+ return Node(k, std::move(t));
+ }
+ void replace(const Value &t) noexcept(std::is_nothrow_assignable_v<T>)
+ {
+ value = t;
+ }
+ void replace(Value &&t) noexcept(std::is_nothrow_move_assignable_v<T>)
+ {
+ value = std::move(t);
+ }
+ Value takeValue() noexcept(std::is_nothrow_move_constructible_v<T>)
+ {
+ return std::move(value);
+ }
+ bool valuesEqual(const Node *other) const { return value == other->value; }
- inline int size() const { return hash.size(); }
- inline int count() const { return hash.size(); }
- inline bool isEmpty() const { return hash.isEmpty(); }
- inline QList<Key> keys() const { return hash.keys(); }
+ Node(Node &&other)
+ : Chain(other),
+ key(std::move(other.key)),
+ value(std::move(other.value))
+ {
+ Q_ASSERT(this->prev);
+ Q_ASSERT(this->next);
+ this->prev->next = this;
+ this->next->prev = this;
+ }
+ private:
+ Q_DISABLE_COPY(Node)
+ };
- void clear();
+ using Data = QHashPrivate::Data<Node>;
- bool insert(const Key &key, T *object, int cost = 1);
- T *object(const Key &key) const;
- inline bool contains(const Key &key) const { return hash.contains(key); }
- T *operator[](const Key &key) const;
+ mutable Chain chain;
+ Data d;
+ int mx = 0;
+ int total = 0;
- bool remove(const Key &key);
- T *take(const Key &key);
+ void unlink(Node *n) noexcept(std::is_nothrow_destructible_v<Node>)
+ {
+ Q_ASSERT(n->prev);
+ Q_ASSERT(n->next);
+ n->prev->next = n->next;
+ n->next->prev = n->prev;
+ total -= n->value.cost;
+ auto it = d.find(n->key);
+ d.erase(it);
+ }
+ T *relink(const Key &key) const noexcept
+ {
+ Node *n = d.findNode(key);
+ if (!n)
+ return nullptr;
-private:
- void trim(int m);
-};
+ if (chain.next != n) {
+ Q_ASSERT(n->prev);
+ Q_ASSERT(n->next);
+ n->prev->next = n->next;
+ n->next->prev = n->prev;
+ n->next = chain.next;
+ chain.next->prev = n;
+ n->prev = &chain;
+ chain.next = n;
+ }
+ return n->value.t;
+ }
-template <class Key, class T>
-inline QCache<Key, T>::QCache(int amaxCost) noexcept
- : f(nullptr), l(nullptr), mx(amaxCost), total(0) {}
+ void trim(int m) noexcept(std::is_nothrow_destructible_v<Node>)
+ {
+ Chain *n = chain.prev;
+ while (n != &chain && total > m) {
+ Node *u = static_cast<Node *>(n);
+ n = n->prev;
+ unlink(u);
+ }
+ }
-template <class Key, class T>
-inline void QCache<Key,T>::clear()
-{ while (f) { delete f->t; f = f->n; }
- hash.clear(); l = nullptr; total = 0; }
-template <class Key, class T>
-inline void QCache<Key,T>::setMaxCost(int m)
-{ mx = m; trim(mx); }
+ Q_DISABLE_COPY(QCache)
-template <class Key, class T>
-inline T *QCache<Key,T>::object(const Key &key) const
-{ return const_cast<QCache<Key,T>*>(this)->relink(key); }
+public:
+ inline explicit QCache(int maxCost = 100) noexcept
+ : mx(maxCost)
+ {}
+ inline ~QCache() { clear(); }
-template <class Key, class T>
-inline T *QCache<Key,T>::operator[](const Key &key) const
-{ return object(key); }
+ inline int maxCost() const noexcept { return mx; }
+ void setMaxCost(int m) noexcept(std::is_nothrow_destructible_v<Node>)
+ {
+ mx = m;
+ trim(mx);
+ }
+ inline int totalCost() const noexcept { return total; }
-template <class Key, class T>
-inline bool QCache<Key,T>::remove(const Key &key)
-{
- typename QHash<Key, Node>::iterator i = hash.find(key);
- if (typename QHash<Key, Node>::const_iterator(i) == hash.constEnd()) {
- return false;
- } else {
- unlink(*i);
- return true;
+ inline int size() const noexcept { return d.size; }
+ inline int count() const noexcept { return d.size; }
+ inline bool isEmpty() const noexcept { return !d.size; }
+ inline QVector<Key> keys() const
+ {
+ QVector<Key> k;
+ if (d.size) {
+ k.reserve(d.size);
+ for (auto it = d.begin(); it != d.end(); ++it)
+ k << it.node()->key;
+ }
+ Q_ASSERT(k.size() == qsizetype(d.size));
+ return k;
}
-}
-template <class Key, class T>
-inline T *QCache<Key,T>::take(const Key &key)
-{
- typename QHash<Key, Node>::iterator i = hash.find(key);
- if (i == hash.end())
- return nullptr;
+ void clear() noexcept(std::is_nothrow_destructible_v<Node>)
+ {
+ d.clear();
+ total = 0;
+ chain.next = &chain;
+ chain.prev = &chain;
+ }
- Node &n = *i;
- T *t = n.t;
- n.t = nullptr;
- unlink(n);
- return t;
-}
+ bool insert(const Key &key, T *object, int cost = 1)
+ {
+ remove(key);
-template <class Key, class T>
-bool QCache<Key,T>::insert(const Key &akey, T *aobject, int acost)
-{
- remove(akey);
- if (acost > mx) {
- delete aobject;
- return false;
+ if (cost > mx) {
+ delete object;
+ return false;
+ }
+ trim(mx - cost);
+ auto result = d.findOrInsert(key);
+ Node *n = result.it.node();
+ if (result.initialized) {
+ cost -= n->value.cost;
+ result.it.node()->emplace(object, cost);
+ } else {
+ Node::createInPlace(n, key, object, cost);
+ }
+ total += cost;
+ n->prev = &chain;
+ n->next = chain.next;
+ chain.next->prev = n;
+ chain.next = n;
+ return true;
+ }
+ T *object(const Key &key) const noexcept
+ {
+ return relink(key);
+ }
+ T *operator[](const Key &key) const noexcept
+ {
+ return relink(key);
+ }
+ inline bool contains(const Key &key) const noexcept
+ {
+ return d.findNode(key) != nullptr;
}
- trim(mx - acost);
- Node sn(aobject, acost);
- typename QHash<Key, Node>::iterator i = hash.insert(akey, sn);
- total += acost;
- Node *n = &i.value();
- n->keyPtr = &i.key();
- if (f) f->p = n;
- n->n = f;
- f = n;
- if (!l) l = f;
- return true;
-}
-template <class Key, class T>
-void QCache<Key,T>::trim(int m)
-{
- Node *n = l;
- while (n && total > m) {
- Node *u = n;
- n = n->p;
- unlink(*u);
+ bool remove(const Key &key) noexcept(std::is_nothrow_destructible_v<Node>)
+ {
+ Node *n = d.findNode(key);
+ if (!n) {
+ return false;
+ } else {
+ unlink(n);
+ return true;
+ }
}
-}
+
+ T *take(const Key &key) noexcept(std::is_nothrow_destructible_v<Key>)
+ {
+ Node *n = d.findNode(key);
+ if (!n)
+ return nullptr;
+
+ T *t = n->value.t;
+ n->value.t = nullptr;
+ unlink(n);
+ return t;
+ }
+
+};
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qcontainerfwd.h b/src/corelib/tools/qcontainerfwd.h
index 00a8c85b66..bdf9e0dcc0 100644
--- a/src/corelib/tools/qcontainerfwd.h
+++ b/src/corelib/tools/qcontainerfwd.h
@@ -47,10 +47,6 @@ QT_BEGIN_NAMESPACE
template <class Key, class T> class QCache;
template <class Key, class T> class QHash;
-#if !defined(QT_NO_LINKED_LIST) && QT_DEPRECATED_SINCE(5, 15)
-template <class T> class QLinkedList;
-#endif
-template <class T> class QList;
template <class Key, class T> class QMap;
template <class Key, class T> class QMultiHash;
template <class Key, class T> class QMultiMap;
@@ -58,8 +54,9 @@ template <class T1, class T2> struct QPair;
template <class T> class QQueue;
template <class T> class QSet;
template <class T> class QStack;
-template<class T, int Prealloc = 256> class QVarLengthArray;
+template<class T, qsizetype Prealloc = 256> class QVarLengthArray;
template <class T> class QVector;
+template<typename T> using QList = QVector<T>;
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qcontiguouscache.cpp b/src/corelib/tools/qcontiguouscache.cpp
index 64cbd7df4b..cc3510ef88 100644
--- a/src/corelib/tools/qcontiguouscache.cpp
+++ b/src/corelib/tools/qcontiguouscache.cpp
@@ -54,9 +54,9 @@ void QContiguousCacheData::dump() const
}
#endif
-QContiguousCacheData *QContiguousCacheData::allocateData(int size, int alignment)
+QContiguousCacheData *QContiguousCacheData::allocateData(qsizetype size, qsizetype alignment)
{
- return static_cast<QContiguousCacheData *>(qMallocAligned(size, alignment));
+ return static_cast<QContiguousCacheData *>(qMallocAligned(size_t(size), size_t(alignment)));
}
void QContiguousCacheData::freeData(QContiguousCacheData *data)
diff --git a/src/corelib/tools/qcontiguouscache.h b/src/corelib/tools/qcontiguouscache.h
index 7b74b4f526..81361f219a 100644
--- a/src/corelib/tools/qcontiguouscache.h
+++ b/src/corelib/tools/qcontiguouscache.h
@@ -52,19 +52,12 @@ QT_BEGIN_NAMESPACE
struct Q_CORE_EXPORT QContiguousCacheData
{
QBasicAtomicInt ref;
- int alloc;
- int count;
- int start;
- int offset;
- uint sharable : 1;
- uint reserved : 31;
-
- // total is 24 bytes (HP-UX aCC: 40 bytes)
- // the next entry is already aligned to 8 bytes
- // there will be an 8 byte gap here if T requires 16-byte alignment
- // (such as long double on 64-bit platforms, __int128, __float128)
-
- static QContiguousCacheData *allocateData(int size, int alignment);
+ qsizetype alloc;
+ qsizetype count;
+ qsizetype start;
+ qsizetype offset;
+
+ static QContiguousCacheData *allocateData(qsizetype size, qsizetype alignment);
static void freeData(QContiguousCacheData *data);
#ifdef QT_QCONTIGUOUSCACHE_DEBUG
@@ -73,18 +66,15 @@ struct Q_CORE_EXPORT QContiguousCacheData
};
template <typename T>
-struct QContiguousCacheTypedData: private QContiguousCacheData
+struct QContiguousCacheTypedData : public QContiguousCacheData
{
- // private inheritance to avoid aliasing warningss
T array[1];
-
- static inline void freeData(QContiguousCacheTypedData *data) { QContiguousCacheData::freeData(data); }
};
template<typename T>
class QContiguousCache {
typedef QContiguousCacheTypedData<T> Data;
- union { QContiguousCacheData *d; QContiguousCacheTypedData<T> *p; };
+ Data *d;
public:
// STL compatibility
typedef T value_type;
@@ -93,18 +83,15 @@ public:
typedef value_type& reference;
typedef const value_type& const_reference;
typedef qptrdiff difference_type;
- typedef int size_type;
+ typedef qsizetype size_type;
- explicit QContiguousCache(int capacity = 0);
- QContiguousCache(const QContiguousCache<T> &v) : d(v.d) { d->ref.ref(); if (!d->sharable) detach_helper(); }
+ explicit QContiguousCache(qsizetype capacity = 0);
+ QContiguousCache(const QContiguousCache<T> &v) : d(v.d) { d->ref.ref(); }
- inline ~QContiguousCache() { if (!d) return; if (!d->ref.deref()) freeData(p); }
+ inline ~QContiguousCache() { if (!d) return; if (!d->ref.deref()) freeData(d); }
inline void detach() { if (d->ref.loadRelaxed() != 1) detach_helper(); }
inline bool isDetached() const { return d->ref.loadRelaxed() == 1; }
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- inline void setSharable(bool sharable) { if (!sharable) detach(); d->sharable = sharable; }
-#endif
QContiguousCache<T> &operator=(const QContiguousCache<T> &other);
inline QContiguousCache<T> &operator=(QContiguousCache<T> &&other) noexcept
@@ -113,139 +100,122 @@ public:
bool operator==(const QContiguousCache<T> &other) const;
inline bool operator!=(const QContiguousCache<T> &other) const { return !(*this == other); }
- inline int capacity() const {return d->alloc; }
- inline int count() const { return d->count; }
- inline int size() const { return d->count; }
+ inline qsizetype capacity() const {return d->alloc; }
+ inline qsizetype count() const { return d->count; }
+ inline qsizetype size() const { return d->count; }
inline bool isEmpty() const { return d->count == 0; }
inline bool isFull() const { return d->count == d->alloc; }
- inline int available() const { return d->alloc - d->count; }
+ inline qsizetype available() const { return d->alloc - d->count; }
void clear();
- void setCapacity(int size);
+ void setCapacity(qsizetype size);
- const T &at(int pos) const;
- T &operator[](int i);
- const T &operator[](int i) const;
+ const T &at(qsizetype pos) const;
+ T &operator[](qsizetype i);
+ const T &operator[](qsizetype i) const;
+ void append(T &&value);
void append(const T &value);
+ void prepend(T &&value);
void prepend(const T &value);
- void insert(int pos, const T &value);
+ void insert(qsizetype pos, T &&value);
+ void insert(qsizetype pos, const T &value);
+
- inline bool containsIndex(int pos) const { return pos >= d->offset && pos - d->offset < d->count; }
- inline int firstIndex() const { return d->offset; }
- inline int lastIndex() const { return d->offset + d->count - 1; }
+ inline bool containsIndex(qsizetype pos) const { return pos >= d->offset && pos - d->offset < d->count; }
+ inline qsizetype firstIndex() const { return d->offset; }
+ inline qsizetype lastIndex() const { return d->offset + d->count - 1; }
- inline const T &first() const { Q_ASSERT(!isEmpty()); return p->array[d->start]; }
- inline const T &last() const { Q_ASSERT(!isEmpty()); return p->array[(d->start + d->count -1) % d->alloc]; }
- inline T &first() { Q_ASSERT(!isEmpty()); detach(); return p->array[d->start]; }
- inline T &last() { Q_ASSERT(!isEmpty()); detach(); return p->array[(d->start + d->count -1) % d->alloc]; }
+ inline const T &first() const { Q_ASSERT(!isEmpty()); return d->array[d->start]; }
+ inline const T &last() const { Q_ASSERT(!isEmpty()); return d->array[(d->start + d->count -1) % d->alloc]; }
+ inline T &first() { Q_ASSERT(!isEmpty()); detach(); return d->array[d->start]; }
+ inline T &last() { Q_ASSERT(!isEmpty()); detach(); return d->array[(d->start + d->count -1) % d->alloc]; }
void removeFirst();
T takeFirst();
void removeLast();
T takeLast();
+ // Use extra parentheses around max to avoid expanding it if it is a macro.
inline bool areIndexesValid() const
- { return d->offset >= 0 && d->offset < INT_MAX - d->count && (d->offset % d->alloc) == d->start; }
+ { return d->offset >= 0 && d->offset < (std::numeric_limits<qsizetype>::max)() - d->count && (d->offset % d->alloc) == d->start; }
inline void normalizeIndexes() { d->offset = d->start; }
#ifdef QT_QCONTIGUOUSCACHE_DEBUG
- void dump() const { p->dump(); }
+ void dump() const { d->dump(); }
#endif
private:
void detach_helper();
- QContiguousCacheData *allocateData(int aalloc);
+ Data *allocateData(qsizetype aalloc);
void freeData(Data *x);
- int sizeOfTypedData() {
- // this is more or less the same as sizeof(Data), except that it doesn't
- // count the padding at the end
- return reinterpret_cast<const char *>(&(reinterpret_cast<const Data *>(this))->array[1]) - reinterpret_cast<const char *>(this);
- }
- int alignOfTypedData() const
- {
- return qMax<int>(sizeof(void*), Q_ALIGNOF(Data));
- }
};
template <typename T>
void QContiguousCache<T>::detach_helper()
{
- union { QContiguousCacheData *d; QContiguousCacheTypedData<T> *p; } x;
-
- x.d = allocateData(d->alloc);
- x.d->ref.storeRelaxed(1);
- x.d->count = d->count;
- x.d->start = d->start;
- x.d->offset = d->offset;
- x.d->alloc = d->alloc;
- x.d->sharable = true;
- x.d->reserved = 0;
-
- T *dest = x.p->array + x.d->start;
- T *src = p->array + d->start;
- int oldcount = x.d->count;
+ Data *x = allocateData(d->alloc);
+ x->ref.storeRelaxed(1);
+ x->count = d->count;
+ x->start = d->start;
+ x->offset = d->offset;
+ x->alloc = d->alloc;
+
+ T *dest = x->array + x->start;
+ T *src = d->array + d->start;
+ qsizetype oldcount = x->count;
while (oldcount--) {
- if (QTypeInfo<T>::isComplex) {
- new (dest) T(*src);
- } else {
- *dest = *src;
- }
+ new (dest) T(*src);
dest++;
- if (dest == x.p->array + x.d->alloc)
- dest = x.p->array;
+ if (dest == x->array + x->alloc)
+ dest = x->array;
src++;
- if (src == p->array + d->alloc)
- src = p->array;
+ if (src == d->array + d->alloc)
+ src = d->array;
}
if (!d->ref.deref())
- freeData(p);
- d = x.d;
+ freeData(d);
+ d = x;
}
template <typename T>
-void QContiguousCache<T>::setCapacity(int asize)
+void QContiguousCache<T>::setCapacity(qsizetype asize)
{
Q_ASSERT(asize >= 0);
if (asize == d->alloc)
return;
detach();
- union { QContiguousCacheData *d; QContiguousCacheTypedData<T> *p; } x;
- x.d = allocateData(asize);
- x.d->ref.storeRelaxed(1);
- x.d->alloc = asize;
- x.d->count = qMin(d->count, asize);
- x.d->offset = d->offset + d->count - x.d->count;
+ Data *x = allocateData(asize);
+ x->ref.storeRelaxed(1);
+ x->alloc = asize;
+ x->count = qMin(d->count, asize);
+ x->offset = d->offset + d->count - x->count;
if(asize)
- x.d->start = x.d->offset % x.d->alloc;
+ x->start = x->offset % x->alloc;
else
- x.d->start = 0;
+ x->start = 0;
- int oldcount = x.d->count;
+ qsizetype oldcount = x->count;
if(oldcount)
{
- T *dest = x.p->array + (x.d->start + x.d->count-1) % x.d->alloc;
- T *src = p->array + (d->start + d->count-1) % d->alloc;
+ T *dest = x->array + (x->start + x->count-1) % x->alloc;
+ T *src = d->array + (d->start + d->count-1) % d->alloc;
while (oldcount--) {
- if (QTypeInfo<T>::isComplex) {
- new (dest) T(*src);
- } else {
- *dest = *src;
- }
- if (dest == x.p->array)
- dest = x.p->array + x.d->alloc;
+ new (dest) T(*src);
+ if (dest == x->array)
+ dest = x->array + x->alloc;
dest--;
- if (src == p->array)
- src = p->array + d->alloc;
+ if (src == d->array)
+ src = d->array + d->alloc;
src--;
}
}
/* free old */
- freeData(p);
- d = x.d;
+ freeData(d);
+ d = x;
}
template <typename T>
@@ -253,44 +223,42 @@ void QContiguousCache<T>::clear()
{
if (d->ref.loadRelaxed() == 1) {
if (QTypeInfo<T>::isComplex) {
- int oldcount = d->count;
- T * i = p->array + d->start;
- T * e = p->array + d->alloc;
+ qsizetype oldcount = d->count;
+ T * i = d->array + d->start;
+ T * e = d->array + d->alloc;
while (oldcount--) {
i->~T();
i++;
if (i == e)
- i = p->array;
+ i = d->array;
}
}
d->count = d->start = d->offset = 0;
} else {
- union { QContiguousCacheData *d; QContiguousCacheTypedData<T> *p; } x;
- x.d = allocateData(d->alloc);
- x.d->ref.storeRelaxed(1);
- x.d->alloc = d->alloc;
- x.d->count = x.d->start = x.d->offset = 0;
- x.d->sharable = true;
- if (!d->ref.deref()) freeData(p);
- d = x.d;
+ Data *x = allocateData(d->alloc);
+ x->ref.storeRelaxed(1);
+ x->alloc = d->alloc;
+ x->count = x->start = x->offset = 0;
+ if (!d->ref.deref())
+ freeData(d);
+ d = x;
}
}
template <typename T>
-inline QContiguousCacheData *QContiguousCache<T>::allocateData(int aalloc)
+inline typename QContiguousCache<T>::Data *QContiguousCache<T>::allocateData(qsizetype aalloc)
{
- return QContiguousCacheData::allocateData(sizeOfTypedData() + (aalloc - 1) * sizeof(T), alignOfTypedData());
+ return static_cast<Data *>(QContiguousCacheData::allocateData(sizeof(Data) + (aalloc - 1) * sizeof(T), alignof(Data)));
}
template <typename T>
-QContiguousCache<T>::QContiguousCache(int cap)
+QContiguousCache<T>::QContiguousCache(qsizetype cap)
{
Q_ASSERT(cap >= 0);
d = allocateData(cap);
d->ref.storeRelaxed(1);
d->alloc = cap;
d->count = d->start = d->offset = 0;
- d->sharable = true;
}
template <typename T>
@@ -298,10 +266,8 @@ QContiguousCache<T> &QContiguousCache<T>::operator=(const QContiguousCache<T> &o
{
other.d->ref.ref();
if (!d->ref.deref())
- freeData(p);
+ freeData(d);
d = other.d;
- if (!d->sharable)
- detach_helper();
return *this;
}
@@ -315,7 +281,7 @@ bool QContiguousCache<T>::operator==(const QContiguousCache<T> &other) const
|| other.d->offset != d->offset
|| other.d->alloc != d->alloc)
return false;
- for (int i = firstIndex(); i <= lastIndex(); ++i)
+ for (qsizetype i = firstIndex(); i <= lastIndex(); ++i)
if (!(at(i) == other.at(i)))
return false;
return true;
@@ -325,31 +291,46 @@ template <typename T>
void QContiguousCache<T>::freeData(Data *x)
{
if (QTypeInfo<T>::isComplex) {
- int oldcount = d->count;
- T * i = p->array + d->start;
- T * e = p->array + d->alloc;
+ qsizetype oldcount = d->count;
+ T * i = d->array + d->start;
+ T * e = d->array + d->alloc;
while (oldcount--) {
i->~T();
i++;
if (i == e)
- i = p->array;
+ i = d->array;
}
}
- x->freeData(x);
+ Data::freeData(x);
}
template <typename T>
-void QContiguousCache<T>::append(const T &value)
+void QContiguousCache<T>::append(T &&value)
{
if (!d->alloc)
return; // zero capacity
detach();
- if (QTypeInfo<T>::isComplex) {
- if (d->count == d->alloc)
- (p->array + (d->start+d->count) % d->alloc)->~T();
- new (p->array + (d->start+d->count) % d->alloc) T(value);
+ if (d->count == d->alloc)
+ (d->array + (d->start+d->count) % d->alloc)->~T();
+ new (d->array + (d->start+d->count) % d->alloc) T(std::move(value));
+
+ if (d->count == d->alloc) {
+ d->start++;
+ d->start %= d->alloc;
+ d->offset++;
} else {
- p->array[(d->start+d->count) % d->alloc] = value;
+ d->count++;
}
+}
+
+template <typename T>
+void QContiguousCache<T>::append(const T &value)
+{
+ if (!d->alloc)
+ return; // zero capacity
+ detach();
+ if (d->count == d->alloc)
+ (d->array + (d->start+d->count) % d->alloc)->~T();
+ new (d->array + (d->start+d->count) % d->alloc) T(value);
if (d->count == d->alloc) {
d->start++;
@@ -361,7 +342,7 @@ void QContiguousCache<T>::append(const T &value)
}
template<typename T>
-void QContiguousCache<T>::prepend(const T &value)
+void QContiguousCache<T>::prepend(T &&value)
{
if (!d->alloc)
return; // zero capacity
@@ -376,28 +357,41 @@ void QContiguousCache<T>::prepend(const T &value)
d->count++;
else
if (d->count == d->alloc)
- (p->array + d->start)->~T();
+ (d->array + d->start)->~T();
- if (QTypeInfo<T>::isComplex)
- new (p->array + d->start) T(value);
+ new (d->array + d->start) T(std::move(value));
+}
+
+template<typename T>
+void QContiguousCache<T>::prepend(const T &value)
+{
+ if (!d->alloc)
+ return; // zero capacity
+ detach();
+ if (d->start)
+ d->start--;
+ else
+ d->start = d->alloc-1;
+ d->offset--;
+
+ if (d->count != d->alloc)
+ d->count++;
else
- p->array[d->start] = value;
+ if (d->count == d->alloc)
+ (d->array + d->start)->~T();
+
+ new (d->array + d->start) T(value);
}
template<typename T>
-void QContiguousCache<T>::insert(int pos, const T &value)
+void QContiguousCache<T>::insert(qsizetype pos, T &&value)
{
- Q_ASSERT_X(pos >= 0 && pos < INT_MAX, "QContiguousCache<T>::insert", "index out of range");
+ Q_ASSERT_X(pos >= 0, "QContiguousCache<T>::insert", "index out of range");
if (!d->alloc)
return; // zero capacity
detach();
if (containsIndex(pos)) {
- if (QTypeInfo<T>::isComplex) {
- (p->array + pos % d->alloc)->~T();
- new (p->array + pos % d->alloc) T(value);
- } else {
- p->array[pos % d->alloc] = value;
- }
+ d->array[pos % d->alloc] = std::move(value);
} else if (pos == d->offset-1)
prepend(value);
else if (pos == d->offset+d->count)
@@ -408,27 +402,29 @@ void QContiguousCache<T>::insert(int pos, const T &value)
d->offset = pos;
d->start = pos % d->alloc;
d->count = 1;
- if (QTypeInfo<T>::isComplex)
- new (p->array + d->start) T(value);
- else
- p->array[d->start] = value;
+ new (d->array + d->start) T(std::move(value));
}
}
+template<typename T>
+void QContiguousCache<T>::insert(qsizetype pos, const T &value)
+{
+ return insert(pos, T(value));
+}
template <typename T>
-inline const T &QContiguousCache<T>::at(int pos) const
-{ Q_ASSERT_X(pos >= d->offset && pos - d->offset < d->count, "QContiguousCache<T>::at", "index out of range"); return p->array[pos % d->alloc]; }
+inline const T &QContiguousCache<T>::at(qsizetype pos) const
+{ Q_ASSERT_X(pos >= d->offset && pos - d->offset < d->count, "QContiguousCache<T>::at", "index out of range"); return d->array[pos % d->alloc]; }
template <typename T>
-inline const T &QContiguousCache<T>::operator[](int pos) const
-{ Q_ASSERT_X(pos >= d->offset && pos - d->offset < d->count, "QContiguousCache<T>::at", "index out of range"); return p->array[pos % d->alloc]; }
+inline const T &QContiguousCache<T>::operator[](qsizetype pos) const
+{ return at(pos); }
template <typename T>
-inline T &QContiguousCache<T>::operator[](int pos)
+inline T &QContiguousCache<T>::operator[](qsizetype pos)
{
detach();
if (!containsIndex(pos))
insert(pos, T());
- return p->array[pos % d->alloc];
+ return d->array[pos % d->alloc];
}
template <typename T>
@@ -438,7 +434,7 @@ inline void QContiguousCache<T>::removeFirst()
detach();
d->count--;
if (QTypeInfo<T>::isComplex)
- (p->array + d->start)->~T();
+ (d->array + d->start)->~T();
d->start = (d->start + 1) % d->alloc;
d->offset++;
}
@@ -450,16 +446,16 @@ inline void QContiguousCache<T>::removeLast()
detach();
d->count--;
if (QTypeInfo<T>::isComplex)
- (p->array + (d->start + d->count) % d->alloc)->~T();
+ (d->array + (d->start + d->count) % d->alloc)->~T();
}
template <typename T>
inline T QContiguousCache<T>::takeFirst()
-{ T t = first(); removeFirst(); return t; }
+{ T t = std::move(first()); removeFirst(); return t; }
template <typename T>
inline T QContiguousCache<T>::takeLast()
-{ T t = last(); removeLast(); return t; }
+{ T t = std::move(last()); removeLast(); return t; }
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qcryptographichash.cpp b/src/corelib/tools/qcryptographichash.cpp
index fa8d21e07a..1d4afabedd 100644
--- a/src/corelib/tools/qcryptographichash.cpp
+++ b/src/corelib/tools/qcryptographichash.cpp
@@ -359,53 +359,67 @@ void QCryptographicHash::reset()
Adds the first \a length chars of \a data to the cryptographic
hash.
*/
-void QCryptographicHash::addData(const char *data, int length)
+void QCryptographicHash::addData(const char *data, qsizetype length)
{
- switch (d->method) {
- case Sha1:
- sha1Update(&d->sha1Context, (const unsigned char *)data, length);
- break;
+ Q_ASSERT(length >= 0);
+
+#if QT_POINTER_SIZE == 8
+ // feed the data UINT_MAX bytes at a time, as some of the methods below
+ // take a uint (of course, feeding more than 4G of data into the hashing
+ // functions will be pretty slow anyway)
+ qsizetype remaining = length;
+ while (remaining) {
+ length = qMin(qsizetype(std::numeric_limits<uint>::max()), remaining);
+ remaining -= length;
+#else
+ {
+#endif
+ switch (d->method) {
+ case Sha1:
+ sha1Update(&d->sha1Context, (const unsigned char *)data, length);
+ break;
#ifdef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
- default:
- Q_ASSERT_X(false, "QCryptographicHash", "Method not compiled in");
- Q_UNREACHABLE();
- break;
+ default:
+ Q_ASSERT_X(false, "QCryptographicHash", "Method not compiled in");
+ Q_UNREACHABLE();
+ break;
#else
- case Md4:
- md4_update(&d->md4Context, (const unsigned char *)data, length);
- break;
- case Md5:
- MD5Update(&d->md5Context, (const unsigned char *)data, length);
- break;
- case Sha224:
- SHA224Input(&d->sha224Context, reinterpret_cast<const unsigned char *>(data), length);
- break;
- case Sha256:
- SHA256Input(&d->sha256Context, reinterpret_cast<const unsigned char *>(data), length);
- break;
- case Sha384:
- SHA384Input(&d->sha384Context, reinterpret_cast<const unsigned char *>(data), length);
- break;
- case Sha512:
- SHA512Input(&d->sha512Context, reinterpret_cast<const unsigned char *>(data), length);
- break;
- case RealSha3_224:
- case Keccak_224:
- sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8);
- break;
- case RealSha3_256:
- case Keccak_256:
- sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8);
- break;
- case RealSha3_384:
- case Keccak_384:
- sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8);
- break;
- case RealSha3_512:
- case Keccak_512:
- sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8);
- break;
+ case Md4:
+ md4_update(&d->md4Context, (const unsigned char *)data, length);
+ break;
+ case Md5:
+ MD5Update(&d->md5Context, (const unsigned char *)data, length);
+ break;
+ case Sha224:
+ SHA224Input(&d->sha224Context, reinterpret_cast<const unsigned char *>(data), length);
+ break;
+ case Sha256:
+ SHA256Input(&d->sha256Context, reinterpret_cast<const unsigned char *>(data), length);
+ break;
+ case Sha384:
+ SHA384Input(&d->sha384Context, reinterpret_cast<const unsigned char *>(data), length);
+ break;
+ case Sha512:
+ SHA512Input(&d->sha512Context, reinterpret_cast<const unsigned char *>(data), length);
+ break;
+ case RealSha3_224:
+ case Keccak_224:
+ sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8);
+ break;
+ case RealSha3_256:
+ case Keccak_256:
+ sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8);
+ break;
+ case RealSha3_384:
+ case Keccak_384:
+ sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8);
+ break;
+ case RealSha3_512:
+ case Keccak_512:
+ sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8);
+ break;
#endif
+ }
}
d->result.clear();
}
diff --git a/src/corelib/tools/qcryptographichash.h b/src/corelib/tools/qcryptographichash.h
index ad1de7c756..f76fe2d013 100644
--- a/src/corelib/tools/qcryptographichash.h
+++ b/src/corelib/tools/qcryptographichash.h
@@ -94,7 +94,7 @@ public:
void reset();
- void addData(const char *data, int length);
+ void addData(const char *data, qsizetype length);
void addData(const QByteArray &data);
bool addData(QIODevice* device);
diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp
index 84430ae49a..1207ce0659 100644
--- a/src/corelib/tools/qeasingcurve.cpp
+++ b/src/corelib/tools/qeasingcurve.cpp
@@ -1382,11 +1382,6 @@ void QEasingCurve::addTCBSegment(const QPointF &nextPoint, qreal t, qreal c, qre
}
/*!
- \fn QList<QPointF> QEasingCurve::cubicBezierSpline() const
- \obsolete Use toCubicSpline() instead.
- */
-
-/*!
\since 5.0
Returns the cubicBezierSpline that defines a custom easing curve.
diff --git a/src/corelib/tools/qeasingcurve.h b/src/corelib/tools/qeasingcurve.h
index d3a468bb22..81833a758f 100644
--- a/src/corelib/tools/qeasingcurve.h
+++ b/src/corelib/tools/qeasingcurve.h
@@ -46,10 +46,6 @@ QT_REQUIRE_CONFIG(easingcurve);
#include <QtCore/qobjectdefs.h>
#include <QtCore/qvector.h>
-#if QT_DEPRECATED_SINCE(5, 0)
-# include <QtCore/qlist.h>
-# include <QtCore/qpoint.h>
-#endif
QT_BEGIN_NAMESPACE
@@ -105,9 +101,6 @@ public:
void addCubicBezierSegment(const QPointF & c1, const QPointF & c2, const QPointF & endPoint);
void addTCBSegment(const QPointF &nextPoint, qreal t, qreal c, qreal b);
QVector<QPointF> toCubicSpline() const;
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED QList<QPointF> cubicBezierSpline() const { return toCubicSpline().toList(); }
-#endif
Type type() const;
void setType(Type type);
diff --git a/src/corelib/tools/qflatmap_p.h b/src/corelib/tools/qflatmap_p.h
new file mode 100644
index 0000000000..82a1068d34
--- /dev/null
+++ b/src/corelib/tools/qflatmap_p.h
@@ -0,0 +1,983 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QFLATMAP_P_H
+#define QFLATMAP_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of a number of Qt sources files. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qvector.h"
+
+#include <algorithm>
+#include <functional>
+#include <initializer_list>
+#include <iterator>
+#include <numeric>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+QT_BEGIN_NAMESPACE
+
+/*
+ QFlatMap provides an associative container backed by sorted sequential
+ containers. By default, QVector is used.
+
+ Keys and values are stored in two separate containers. This provides improved
+ cache locality for key iteration and makes keys() and values() fast
+ operations.
+
+ One can customize the underlying container type by passing the KeyContainer
+ and MappedContainer template arguments:
+ QFlatMap<float, int, std::less<float>, std::vector<float>, std::vector<int>>
+*/
+
+namespace Qt {
+
+struct OrderedUniqueRange_t {};
+constexpr OrderedUniqueRange_t OrderedUniqueRange = {};
+
+} // namespace Qt
+
+template <class Key, class T, class Compare>
+class QFlatMapValueCompare : protected Compare
+{
+public:
+ QFlatMapValueCompare() = default;
+ QFlatMapValueCompare(const Compare &key_compare)
+ : Compare(key_compare)
+ {
+ }
+
+ using value_type = std::pair<const Key, T>;
+ static constexpr bool is_comparator_noexcept = noexcept(
+ std::declval<Compare>()(std::declval<Key>(), std::declval<Key>()));
+
+ bool operator()(const value_type &lhs, const value_type &rhs) const
+ noexcept(is_comparator_noexcept)
+ {
+ return Compare::operator()(lhs.first, rhs.first);
+ }
+};
+
+template <class Key, class T,
+ class Compare = std::less<Key>,
+ class KeyContainer = QVector<Key>,
+ class MappedContainer = QVector<T>>
+class QFlatMap : private QFlatMapValueCompare<Key, T, Compare>
+{
+ using full_map_t = QFlatMap<Key, T, Compare, KeyContainer, MappedContainer>;
+
+ template <class U>
+ class mock_pointer
+ {
+ U ref;
+ public:
+ mock_pointer(U r)
+ : ref(r)
+ {
+ }
+
+ U *operator->()
+ {
+ return &ref;
+ }
+ };
+
+public:
+ using key_type = Key;
+ using mapped_type = T;
+ using value_compare = QFlatMapValueCompare<Key, T, Compare>;
+ using value_type = typename value_compare::value_type;
+ using key_container_type = KeyContainer;
+ using mapped_container_type = MappedContainer;
+ using size_type = typename key_container_type::size_type;
+ using key_compare = Compare;
+
+ struct containers
+ {
+ key_container_type keys;
+ mapped_container_type values;
+ };
+
+ class iterator
+ {
+ public:
+ using difference_type = ptrdiff_t;
+ using value_type = std::pair<const Key, T>;
+ using reference = std::pair<const Key &, T &>;
+ using pointer = mock_pointer<reference>;
+ using iterator_category = std::random_access_iterator_tag;
+
+ iterator() = default;
+
+ iterator(containers *ac, size_type ai)
+ : c(ac), i(ai)
+ {
+ }
+
+ reference operator*()
+ {
+ return { c->keys[i], c->values[i] };
+ }
+
+ pointer operator->()
+ {
+ return { operator*() };
+ }
+
+ bool operator==(const iterator &o) const
+ {
+ return c == o.c && i == o.i;
+ }
+
+ bool operator!=(const iterator &o) const
+ {
+ return !operator==(o);
+ }
+
+ iterator &operator++()
+ {
+ ++i;
+ return *this;
+ }
+
+ iterator operator++(int)
+ {
+
+ iterator r = *this;
+ i++;
+ return r;
+ }
+
+ iterator &operator--()
+ {
+ --i;
+ return *this;
+ }
+
+ iterator operator--(int)
+ {
+ iterator r = *this;
+ i--;
+ return r;
+ }
+
+ iterator &operator+=(size_type n)
+ {
+ i += n;
+ return *this;
+ }
+
+ friend iterator operator+(size_type n, const iterator a)
+ {
+ iterator ret = a;
+ return ret += n;
+ }
+
+ friend iterator operator+(const iterator a, size_type n)
+ {
+ return n + a;
+ }
+
+ iterator &operator-=(size_type n)
+ {
+ i -= n;
+ return *this;
+ }
+
+ friend iterator operator-(const iterator a, size_type n)
+ {
+ iterator ret = a;
+ return ret -= n;
+ }
+
+ friend difference_type operator-(const iterator b, const iterator a)
+ {
+ return b.i - a.i;
+ }
+
+ reference operator[](size_type n)
+ {
+ size_type k = i + n;
+ return { c->keys[k], c->values[k] };
+ }
+
+ bool operator<(const iterator &other) const
+ {
+ return i < other.i;
+ }
+
+ bool operator>(const iterator &other) const
+ {
+ return i > other.i;
+ }
+
+ bool operator<=(const iterator &other) const
+ {
+ return i <= other.i;
+ }
+
+ bool operator>=(const iterator &other) const
+ {
+ return i >= other.i;
+ }
+
+ const Key &key() const { return c->keys[i]; }
+ T &value() { return c->values[i]; }
+
+ private:
+ containers *c = nullptr;
+ size_type i = 0;
+ friend full_map_t;
+ };
+
+ class const_iterator
+ {
+ public:
+ using difference_type = ptrdiff_t;
+ using value_type = std::pair<const Key, const T>;
+ using reference = std::pair<const Key &, const T &>;
+ using pointer = mock_pointer<reference>;
+ using iterator_category = std::random_access_iterator_tag;
+
+ const_iterator() = default;
+
+ const_iterator(const containers *ac, size_type ai)
+ : c(ac), i(ai)
+ {
+ }
+
+ const_iterator(iterator o)
+ : c(o.c), i(o.i)
+ {
+ }
+
+ reference operator*()
+ {
+ return { c->keys[i], c->values[i] };
+ }
+
+ pointer operator->()
+ {
+ return { operator*() };
+ }
+
+ bool operator==(const const_iterator &o) const
+ {
+ return c == o.c && i == o.i;
+ }
+
+ bool operator!=(const const_iterator &o) const
+ {
+ return !operator==(o);
+ }
+
+ const_iterator &operator++()
+ {
+ ++i;
+ return *this;
+ }
+
+ const_iterator operator++(int)
+ {
+
+ const_iterator r = *this;
+ i++;
+ return r;
+ }
+
+ const_iterator &operator--()
+ {
+ --i;
+ return *this;
+ }
+
+ const_iterator operator--(int)
+ {
+ const_iterator r = *this;
+ i--;
+ return r;
+ }
+
+ const_iterator &operator+=(size_type n)
+ {
+ i += n;
+ return *this;
+ }
+
+ friend const_iterator operator+(size_type n, const const_iterator a)
+ {
+ const_iterator ret = a;
+ return ret += n;
+ }
+
+ friend const_iterator operator+(const const_iterator a, size_type n)
+ {
+ return n + a;
+ }
+
+ const_iterator &operator-=(size_type n)
+ {
+ i -= n;
+ return *this;
+ }
+
+ friend const_iterator operator-(const const_iterator a, size_type n)
+ {
+ const_iterator ret = a;
+ return ret -= n;
+ }
+
+ friend difference_type operator-(const const_iterator b, const const_iterator a)
+ {
+ return b.i - a.i;
+ }
+
+ reference operator[](size_type n)
+ {
+ size_type k = i + n;
+ return { c->keys[k], c->values[k] };
+ }
+
+ bool operator<(const const_iterator &other) const
+ {
+ return i < other.i;
+ }
+
+ bool operator>(const const_iterator &other) const
+ {
+ return i > other.i;
+ }
+
+ bool operator<=(const const_iterator &other) const
+ {
+ return i <= other.i;
+ }
+
+ bool operator>=(const const_iterator &other) const
+ {
+ return i >= other.i;
+ }
+
+ const Key &key() const { return c->keys[i]; }
+ const T &value() { return c->values[i]; }
+
+ private:
+ const containers *c = nullptr;
+ size_type i = 0;
+ friend full_map_t;
+ };
+
+private:
+ template <class, class = void>
+ struct is_marked_transparent_type : std::false_type { };
+
+ template <class X>
+ struct is_marked_transparent_type<X, typename X::is_transparent> : std::true_type { };
+
+ template <class X>
+ using is_marked_transparent = typename std::enable_if<
+ is_marked_transparent_type<X>::value>::type *;
+
+ template <typename It>
+ using is_compatible_iterator = typename std::enable_if<
+ std::is_same<value_type, typename std::iterator_traits<It>::value_type>::value>::type *;
+
+public:
+ QFlatMap() = default;
+
+ explicit QFlatMap(const key_container_type &keys, const mapped_container_type &values)
+ : c{keys, values}
+ {
+ ensureOrderedUnique();
+ }
+
+ explicit QFlatMap(key_container_type &&keys, const mapped_container_type &values)
+ {
+ c.keys = std::move(keys);
+ c.values = values;
+ ensureOrderedUnique();
+ }
+
+ explicit QFlatMap(const key_container_type &keys, mapped_container_type &&values)
+ {
+ c.keys = keys;
+ c.values = std::move(values);
+ ensureOrderedUnique();
+ }
+
+ explicit QFlatMap(key_container_type &&keys, mapped_container_type &&values)
+ {
+ c.keys = std::move(keys);
+ c.values = std::move(values);
+ ensureOrderedUnique();
+ }
+
+ explicit QFlatMap(std::initializer_list<value_type> lst)
+ : QFlatMap(lst.begin(), lst.end())
+ {
+ }
+
+ template <class InputIt, is_compatible_iterator<InputIt> = nullptr>
+ explicit QFlatMap(InputIt first, InputIt last)
+ {
+ initWithRange(first, last);
+ ensureOrderedUnique();
+ }
+
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, const key_container_type &keys,
+ const mapped_container_type &values)
+ {
+ c.keys = keys;
+ c.values = values;
+ }
+
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, key_container_type &&keys,
+ const mapped_container_type &values)
+ {
+ c.keys = std::move(keys);
+ c.values = values;
+ }
+
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, const key_container_type &keys,
+ mapped_container_type &&values)
+ {
+ c.keys = keys;
+ c.values = std::move(values);
+ }
+
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, key_container_type &&keys,
+ mapped_container_type &&values)
+ {
+ c.keys = std::move(keys);
+ c.values = std::move(values);
+ }
+
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, std::initializer_list<value_type> lst)
+ : QFlatMap(lst.begin(), lst.end())
+ {
+ }
+
+ template <class InputIt, is_compatible_iterator<InputIt> = nullptr>
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, InputIt first, InputIt last)
+ {
+ initWithRange(first, last);
+ }
+
+ explicit QFlatMap(const Compare &compare)
+ : value_compare(compare)
+ {
+ }
+
+ explicit QFlatMap(const key_container_type &keys, const mapped_container_type &values,
+ const Compare &compare)
+ : value_compare(compare), c{keys, values}
+ {
+ ensureOrderedUnique();
+ }
+
+ explicit QFlatMap(key_container_type &&keys, const mapped_container_type &values,
+ const Compare &compare)
+ : value_compare(compare), c{std::move(keys), values}
+ {
+ ensureOrderedUnique();
+ }
+
+ explicit QFlatMap(const key_container_type &keys, mapped_container_type &&values,
+ const Compare &compare)
+ : value_compare(compare), c{keys, std::move(values)}
+ {
+ ensureOrderedUnique();
+ }
+
+ explicit QFlatMap(key_container_type &&keys, mapped_container_type &&values,
+ const Compare &compare)
+ : value_compare(compare), c{std::move(keys), std::move(values)}
+ {
+ ensureOrderedUnique();
+ }
+
+ explicit QFlatMap(std::initializer_list<value_type> lst, const Compare &compare)
+ : QFlatMap(lst.begin(), lst.end(), compare)
+ {
+ }
+
+ template <class InputIt, is_compatible_iterator<InputIt> = nullptr>
+ explicit QFlatMap(InputIt first, InputIt last, const Compare &compare)
+ : value_compare(compare)
+ {
+ initWithRange(first, last);
+ ensureOrderedUnique();
+ }
+
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, const key_container_type &keys,
+ const mapped_container_type &values, const Compare &compare)
+ : value_compare(compare), c{keys, values}
+ {
+ }
+
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, key_container_type &&keys,
+ const mapped_container_type &values, const Compare &compare)
+ : value_compare(compare), c{std::move(keys), values}
+ {
+ }
+
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, const key_container_type &keys,
+ mapped_container_type &&values, const Compare &compare)
+ : value_compare(compare), c{keys, std::move(values)}
+ {
+ }
+
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, key_container_type &&keys,
+ mapped_container_type &&values, const Compare &compare)
+ : value_compare(compare), c{std::move(keys), std::move(values)}
+ {
+ }
+
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, std::initializer_list<value_type> lst,
+ const Compare &compare)
+ : QFlatMap(Qt::OrderedUniqueRange, lst.begin(), lst.end(), compare)
+ {
+ }
+
+ template <class InputIt, is_compatible_iterator<InputIt> = nullptr>
+ explicit QFlatMap(Qt::OrderedUniqueRange_t, InputIt first, InputIt last, const Compare &compare)
+ : value_compare(compare)
+ {
+ initWithRange(first, last);
+ }
+
+ size_type count() const noexcept { return c.keys.size(); }
+ size_type size() const noexcept { return c.keys.size(); }
+ size_type capacity() const noexcept { return c.keys.capacity(); }
+ bool isEmpty() const noexcept { return c.keys.empty(); }
+ bool empty() const noexcept { return c.keys.empty(); }
+ containers extract() && { return std::move(c); }
+ const key_container_type &keys() const noexcept { return c.keys; }
+ const mapped_container_type &values() const noexcept { return c.values; }
+
+ void reserve(size_type s)
+ {
+ c.keys.reserve(s);
+ c.values.reserve(s);
+ }
+
+ void clear()
+ {
+ c.keys.clear();
+ c.values.clear();
+ }
+
+ bool remove(const Key &key)
+ {
+ auto it = binary_find(key);
+ if (it != end()) {
+ c.keys.erase(toKeysIterator(it));
+ c.values.erase(toValuesIterator(it));
+ return true;
+ }
+ return false;
+ }
+
+ iterator erase(iterator it)
+ {
+ c.values.erase(toValuesIterator(it));
+ return fromKeysIterator(c.keys.erase(toKeysIterator(it)));
+ }
+
+ T take(const Key &key)
+ {
+ auto it = binary_find(key);
+ if (it != end()) {
+ T result = std::move(it.value());
+ erase(it);
+ return result;
+ }
+ return {};
+ }
+
+ bool contains(const Key &key) const
+ {
+ return binary_find(key) != end();
+ }
+
+ T value(const Key &key, const T &defaultValue) const
+ {
+ auto it = binary_find(key);
+ return it == end() ? defaultValue : it.value();
+ }
+
+ T value(const Key &key) const
+ {
+ auto it = binary_find(key);
+ return it == end() ? T() : it.value();
+ }
+
+ T &operator[](const Key &key)
+ {
+ auto it = lower_bound(key);
+ if (it == end() || key_compare::operator()(key, it.key())) {
+ c.keys.insert(toKeysIterator(it), key);
+ return *c.values.insert(toValuesIterator(it), T());
+ }
+ return it.value();
+ }
+
+ T &operator[](Key &&key)
+ {
+ auto it = lower_bound(key);
+ if (it == end() || key_compare::operator()(key, it.key())) {
+ c.keys.insert(toKeysIterator(it), key);
+ return *c.values.insert(toValuesIterator(it), T());
+ }
+ return it.value();
+ }
+
+ T operator[](const Key &key) const
+ {
+ return value(key);
+ }
+
+ std::pair<iterator, bool> insert(const Key &key, const T &value)
+ {
+ auto it = lower_bound(key);
+ if (it == end() || key_compare::operator()(key, it.key())) {
+ c.values.insert(toValuesIterator(it), value);
+ auto k = c.keys.insert(toKeysIterator(it), key);
+ return { fromKeysIterator(k), true };
+ } else {
+ it.value() = value;
+ return {it, false};
+ }
+ }
+
+ std::pair<iterator, bool> insert(Key &&key, const T &value)
+ {
+ auto it = lower_bound(key);
+ if (it == end() || key_compare::operator()(key, it.key())) {
+ c.values.insert(toValuesIterator(it), value);
+ return { c.keys.insert(it, std::move(key)), true };
+ } else {
+ *toValuesIterator(it) = value;
+ return {it, false};
+ }
+ }
+
+ std::pair<iterator, bool> insert(const Key &key, T &&value)
+ {
+ auto it = lower_bound(key);
+ if (it == end() || key_compare::operator()(key, it.key())) {
+ c.values.insert(toValuesIterator(it), std::move(value));
+ return { c.keys.insert(it, key), true };
+ } else {
+ *toValuesIterator(it) = std::move(value);
+ return {it, false};
+ }
+ }
+
+ std::pair<iterator, bool> insert(Key &&key, T &&value)
+ {
+ auto it = lower_bound(key);
+ if (it == end() || key_compare::operator()(key, it.key())) {
+ c.values.insert(toValuesIterator(it), std::move(value));
+ return { fromKeysIterator(c.keys.insert(toKeysIterator(it), std::move(key))), true };
+ } else {
+ *toValuesIterator(it) = std::move(value);
+ return {it, false};
+ }
+ }
+
+ template <class InputIt, is_compatible_iterator<InputIt> = nullptr>
+ void insert(InputIt first, InputIt last)
+ {
+ insertRange(first, last);
+ }
+
+ // ### Merge with the templated version above
+ // once we can use std::disjunction in is_compatible_iterator.
+ void insert(const value_type *first, const value_type *last)
+ {
+ insertRange(first, last);
+ }
+
+ template <class InputIt, is_compatible_iterator<InputIt> = nullptr>
+ void insert(Qt::OrderedUniqueRange_t, InputIt first, InputIt last)
+ {
+ insertOrderedUniqueRange(first, last);
+ }
+
+ // ### Merge with the templated version above
+ // once we can use std::disjunction in is_compatible_iterator.
+ void insert(Qt::OrderedUniqueRange_t, const value_type *first, const value_type *last)
+ {
+ insertOrderedUniqueRange(first, last);
+ }
+
+ iterator begin() { return { &c, 0 }; }
+ const_iterator begin() const { return { &c, 0 }; }
+ const_iterator cbegin() const { return begin(); }
+ const_iterator constBegin() const { return cbegin(); }
+ iterator end() { return { &c, c.keys.size() }; }
+ const_iterator end() const { return { &c, c.keys.size() }; }
+ const_iterator cend() const { return end(); }
+ const_iterator constEnd() const { return cend(); }
+ std::reverse_iterator<iterator> rbegin() { return std::reverse_iterator<iterator>(end()); }
+ std::reverse_iterator<const_iterator> rbegin() const
+ {
+ return std::reverse_iterator<const_iterator>(end());
+ }
+ std::reverse_iterator<const_iterator> crbegin() const { return rbegin(); }
+ std::reverse_iterator<iterator> rend() {
+ return std::reverse_iterator<iterator>(begin());
+ }
+ std::reverse_iterator<const_iterator> rend() const
+ {
+ return std::reverse_iterator<const_iterator>(begin());
+ }
+ std::reverse_iterator<const_iterator> crend() const { return rend(); }
+
+ iterator lower_bound(const Key &key)
+ {
+ auto cit = const_cast<const full_map_t *>(this)->lower_bound(key);
+ return { &c, cit.i };
+ }
+
+ template <class X, class Y = Compare, is_marked_transparent<Y> = nullptr>
+ iterator lower_bound(const X &key)
+ {
+ auto cit = const_cast<const full_map_t *>(this)->lower_bound(key);
+ return { &c, cit.i };
+ }
+
+ const_iterator lower_bound(const Key &key) const
+ {
+ return fromKeysIterator(std::lower_bound(c.keys.begin(), c.keys.end(), key, key_comp()));
+ }
+
+ template <class X, class Y = Compare, is_marked_transparent<Y> = nullptr>
+ const_iterator lower_bound(const X &key) const
+ {
+ return fromKeysIterator(std::lower_bound(c.keys.begin(), c.keys.end(), key, key_comp()));
+ }
+
+ iterator find(const key_type &k)
+ {
+ return binary_find(k);
+ }
+
+ const_iterator find(const key_type &k) const
+ {
+ return binary_find(k);
+ }
+
+ key_compare key_comp() const noexcept
+ {
+ return static_cast<key_compare>(*this);
+ }
+
+ value_compare value_comp() const noexcept
+ {
+ return static_cast<value_compare>(*this);
+ }
+
+private:
+ template <class InputIt, is_compatible_iterator<InputIt> = nullptr>
+ void initWithRange(InputIt first, InputIt last)
+ {
+ QtPrivate::reserveIfForwardIterator(this, first, last);
+ while (first != last) {
+ c.keys.push_back(first->first);
+ c.values.push_back(first->second);
+ ++first;
+ }
+ }
+
+ iterator fromKeysIterator(typename key_container_type::iterator kit)
+ {
+ return { &c, static_cast<size_type>(std::distance(c.keys.begin(), kit)) };
+ }
+
+ const_iterator fromKeysIterator(typename key_container_type::const_iterator kit) const
+ {
+ return { &c, static_cast<size_type>(std::distance(c.keys.begin(), kit)) };
+ }
+
+ typename key_container_type::iterator toKeysIterator(iterator it)
+ {
+ return c.keys.begin() + it.i;
+ }
+
+ typename mapped_container_type::iterator toValuesIterator(iterator it)
+ {
+ return c.values.begin() + it.i;
+ }
+
+ template <class InputIt>
+ void insertRange(InputIt first, InputIt last)
+ {
+ size_type i = c.keys.size();
+ c.keys.resize(i + std::distance(first, last));
+ c.values.resize(c.keys.size());
+ for (; first != last; ++first, ++i) {
+ c.keys[i] = first->first;
+ c.values[i] = first->second;
+ }
+ ensureOrderedUnique();
+ }
+
+ class IndexedKeyComparator
+ {
+ public:
+ IndexedKeyComparator(const full_map_t *am)
+ : m(am)
+ {
+ }
+
+ bool operator()(size_type i, size_type k) const
+ {
+ return m->key_comp()(m->c.keys[i], m->c.keys[k]);
+ }
+
+ private:
+ const full_map_t *m;
+ };
+
+ template <class InputIt>
+ void insertOrderedUniqueRange(InputIt first, InputIt last)
+ {
+ const size_type s = c.keys.size();
+ c.keys.resize(s + std::distance(first, last));
+ c.values.resize(c.keys.size());
+ for (size_type i = s; first != last; ++first, ++i) {
+ c.keys[i] = first->first;
+ c.values[i] = first->second;
+ }
+
+ std::vector<size_type> p(size_t(c.keys.size()));
+ std::iota(p.begin(), p.end(), 0);
+ std::inplace_merge(p.begin(), p.begin() + s, p.end(), IndexedKeyComparator(this));
+ applyPermutation(p);
+ makeUnique();
+ }
+
+ iterator binary_find(const Key &key)
+ {
+ return { &c, const_cast<const full_map_t *>(this)->binary_find(key).i };
+ }
+
+ const_iterator binary_find(const Key &key) const
+ {
+ auto it = lower_bound(key);
+ if (it != end()) {
+ if (!key_compare::operator()(key, it.key()))
+ return it;
+ it = end();
+ }
+ return it;
+ }
+
+ void ensureOrderedUnique()
+ {
+ std::vector<size_type> p(size_t(c.keys.size()));
+ std::iota(p.begin(), p.end(), 0);
+ std::stable_sort(p.begin(), p.end(), IndexedKeyComparator(this));
+ applyPermutation(p);
+ makeUnique();
+ }
+
+ void applyPermutation(const std::vector<size_type> &p)
+ {
+ const size_type s = c.keys.size();
+ std::vector<bool> done(s);
+ for (size_type i = 0; i < s; ++i) {
+ if (done[i])
+ continue;
+ done[i] = true;
+ size_type j = i;
+ size_type k = p[i];
+ while (i != k) {
+ qSwap(c.keys[j], c.keys[k]);
+ qSwap(c.values[j], c.values[k]);
+ done[k] = true;
+ j = k;
+ k = p[j];
+ }
+ }
+ }
+
+ void makeUnique()
+ {
+ if (c.keys.size() < 2)
+ return;
+ auto k = std::end(c.keys) - 1;
+ auto i = k - 1;
+ for (;;) {
+ if (key_compare::operator()(*i, *k) || key_compare::operator()(*k, *i)) {
+ if (i == std::begin(c.keys))
+ break;
+ --i;
+ --k;
+ } else {
+ c.values.erase(std::begin(c.values) + std::distance(std::begin(c.keys), i));
+ i = c.keys.erase(i);
+ if (i == std::begin(c.keys))
+ break;
+ k = i + 1;
+ }
+ }
+ c.keys.shrink_to_fit();
+ c.values.shrink_to_fit();
+ }
+
+ containers c;
+};
+
+QT_END_NAMESPACE
+
+#endif // QFLATMAP_P_H
diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp
index 025c6e9dc0..97dda58748 100644
--- a/src/corelib/tools/qhash.cpp
+++ b/src/corelib/tools/qhash.cpp
@@ -45,6 +45,7 @@
#define _CRT_RAND_S
#endif
#include <stdlib.h>
+#include <stdint.h>
#include "qhash.h"
@@ -70,191 +71,356 @@
QT_BEGIN_NAMESPACE
+// We assume that pointers and size_t have the same size. If that assumption should fail
+// on a platform the code selecting the different methods below needs to be fixed.
+static_assert(sizeof(size_t) == QT_POINTER_SIZE, "size_t and pointers have different size.");
+
/*
- The Java's hashing algorithm for strings is a variation of D. J. Bernstein
- hashing algorithm appeared here http://cr.yp.to/cdb/cdb.txt
- and informally known as DJB33XX - DJB's 33 Times Xor.
- Java uses DJB31XA, that is, 31 Times Add.
-
- The original algorithm was a loop around
- (h << 5) + h ^ c
- (which is indeed h*33 ^ c); it was then changed to
- (h << 5) - h ^ c
- (so h*31^c: DJB31XX), and the XOR changed to a sum:
- (h << 5) - h + c
- (DJB31XA), which can save some assembly instructions.
-
- Still, we can avoid writing the multiplication as "(h << 5) - h"
- -- the compiler will turn it into a shift and an addition anyway
- (for instance, gcc 4.4 does that even at -O0).
-*/
-
-#if QT_COMPILER_SUPPORTS_HERE(SSE4_2)
-static inline bool hasFastCrc32()
-{
- return qCpuHasFeature(SSE4_2);
-}
+ * Hashing for memory segments is based on the public domain MurmurHash2 by
+ * Austin Appleby. See http://murmurhash.googlepages.com/
+ */
+#if QT_POINTER_SIZE == 4
-template <typename Char>
-QT_FUNCTION_TARGET(SSE4_2)
-static uint crc32(const Char *ptr, size_t len, uint h)
+static inline uint murmurhash(const void *key, uint len, uint seed) noexcept
{
- // The CRC32 instructions from Nehalem calculate a 32-bit CRC32 checksum
- const uchar *p = reinterpret_cast<const uchar *>(ptr);
- const uchar *const e = p + (len * sizeof(Char));
-# ifdef Q_PROCESSOR_X86_64
- // The 64-bit instruction still calculates only 32-bit, but without this
- // variable GCC 4.9 still tries to clear the high bits on every loop
- qulonglong h2 = h;
-
- p += 8;
- for ( ; p <= e; p += 8)
- h2 = _mm_crc32_u64(h2, qFromUnaligned<qlonglong>(p - 8));
- h = h2;
- p -= 8;
-
- len = e - p;
- if (len & 4) {
- h = _mm_crc32_u32(h, qFromUnaligned<uint>(p));
- p += 4;
+ // 'm' and 'r' are mixing constants generated offline.
+ // They're not really 'magic', they just happen to work well.
+
+ const unsigned int m = 0x5bd1e995;
+ const int r = 24;
+
+ // Initialize the hash to a 'random' value
+
+ unsigned int h = seed ^ len;
+
+ // Mix 4 bytes at a time into the hash
+
+ const unsigned char *data = reinterpret_cast<const unsigned char *>(key);
+ const unsigned char *end = data + (len & ~3);
+
+ while (data != end) {
+ size_t k;
+ memcpy(&k, data, sizeof(uint));
+
+ k *= m;
+ k ^= k >> r;
+ k *= m;
+
+ h *= m;
+ h ^= k;
+
+ data += 4;
}
-# else
- p += 4;
- for ( ; p <= e; p += 4)
- h = _mm_crc32_u32(h, qFromUnaligned<uint>(p - 4));
- p -= 4;
- len = e - p;
-# endif
- if (len & 2) {
- h = _mm_crc32_u16(h, qFromUnaligned<ushort>(p));
- p += 2;
+
+ // Handle the last few bytes of the input array
+ len &= 3;
+ if (len) {
+ unsigned int k = 0;
+ end += len;
+
+ while (data != end) {
+ k <<= 8;
+ k |= *data;
+ ++data;
+ }
+ h ^= k;
+ h *= m;
}
- if (sizeof(Char) == 1 && len & 1)
- h = _mm_crc32_u8(h, *p);
+
+ // Do a few final mixes of the hash to ensure the last few
+ // bytes are well-incorporated.
+
+ h ^= h >> 13;
+ h *= m;
+ h ^= h >> 15;
+
return h;
}
-#elif defined(__ARM_FEATURE_CRC32)
-static inline bool hasFastCrc32()
+
+#else
+
+static inline uint64_t murmurhash(const void *key, uint64_t len, uint64_t seed) noexcept
{
- return qCpuHasFeature(CRC32);
+ const uint64_t m = 0xc6a4a7935bd1e995ULL;
+ const int r = 47;
+
+ uint64_t h = seed ^ (len * m);
+
+ const unsigned char *data = reinterpret_cast<const unsigned char *>(key);
+ const unsigned char *end = data + (len & ~7ul);
+
+ while (data != end) {
+ uint64_t k;
+ memcpy(&k, data, sizeof(uint64_t));
+
+ k *= m;
+ k ^= k >> r;
+ k *= m;
+
+ h ^= k;
+ h *= m;
+
+ data += 8;
+ }
+
+ len &= 7;
+ if (len) {
+ // handle the last few bytes of input
+ size_t k = 0;
+ end += len;
+
+ while (data != end) {
+ k <<= 8;
+ k |= *data;
+ ++data;
+ }
+ h ^= k;
+ h *= m;
+ }
+
+ h ^= h >> r;
+ h *= m;
+ h ^= h >> r;
+
+ return h;
}
-template <typename Char>
-#if defined(Q_PROCESSOR_ARM_64)
-QT_FUNCTION_TARGET(CRC32)
#endif
-static uint crc32(const Char *ptr, size_t len, uint h)
+
+#if QT_POINTER_SIZE == 8
+// This is an inlined version of the SipHash implementation that is
+// trying to avoid some memcpy's from uint64 to uint8[] and back.
+//
+// The original algorithm uses a 128bit seed. Our public API only allows
+// for a 64bit seed, so we mix in the length of the string to get some more
+// bits for the seed.
+//
+// Use SipHash-1-2, which has similar performance characteristics as
+// stablehash() above, instead of the SipHash-2-4 default
+#define cROUNDS 1
+#define dROUNDS 2
+
+#define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b))))
+
+#define SIPROUND \
+ do { \
+ v0 += v1; \
+ v1 = ROTL(v1, 13); \
+ v1 ^= v0; \
+ v0 = ROTL(v0, 32); \
+ v2 += v3; \
+ v3 = ROTL(v3, 16); \
+ v3 ^= v2; \
+ v0 += v3; \
+ v3 = ROTL(v3, 21); \
+ v3 ^= v0; \
+ v2 += v1; \
+ v1 = ROTL(v1, 17); \
+ v1 ^= v2; \
+ v2 = ROTL(v2, 32); \
+ } while (0)
+
+
+static uint64_t siphash(const uint8_t *in, uint64_t inlen, const uint64_t seed)
{
- // The crc32[whbd] instructions on Aarch64/Aarch32 calculate a 32-bit CRC32 checksum
- const uchar *p = reinterpret_cast<const uchar *>(ptr);
- const uchar *const e = p + (len * sizeof(Char));
-
-#ifndef __ARM_FEATURE_UNALIGNED
- if (Q_UNLIKELY(reinterpret_cast<quintptr>(p) & 7)) {
- if ((sizeof(Char) == 1) && (reinterpret_cast<quintptr>(p) & 1) && (e - p > 0)) {
- h = __crc32b(h, *p);
- ++p;
- }
- if ((reinterpret_cast<quintptr>(p) & 2) && (e >= p + 2)) {
- h = __crc32h(h, *reinterpret_cast<const uint16_t *>(p));
- p += 2;
- }
- if ((reinterpret_cast<quintptr>(p) & 4) && (e >= p + 4)) {
- h = __crc32w(h, *reinterpret_cast<const uint32_t *>(p));
- p += 4;
- }
+ /* "somepseudorandomlygeneratedbytes" */
+ uint64_t v0 = 0x736f6d6570736575ULL;
+ uint64_t v1 = 0x646f72616e646f6dULL;
+ uint64_t v2 = 0x6c7967656e657261ULL;
+ uint64_t v3 = 0x7465646279746573ULL;
+ uint64_t b;
+ uint64_t k0 = seed;
+ uint64_t k1 = seed ^ inlen;
+ int i;
+ const uint8_t *end = in + (inlen & ~7ULL);
+ const int left = inlen & 7;
+ b = inlen << 56;
+ v3 ^= k1;
+ v2 ^= k0;
+ v1 ^= k1;
+ v0 ^= k0;
+
+ for (; in != end; in += 8) {
+ uint64_t m = qFromUnaligned<uint64_t>(in);
+ v3 ^= m;
+
+ for (i = 0; i < cROUNDS; ++i)
+ SIPROUND;
+
+ v0 ^= m;
}
-#endif
- for ( ; p + 8 <= e; p += 8)
- h = __crc32d(h, *reinterpret_cast<const uint64_t *>(p));
- len = e - p;
- if (len == 0)
- return h;
- if (len & 4) {
- h = __crc32w(h, *reinterpret_cast<const uint32_t *>(p));
- p += 4;
- }
- if (len & 2) {
- h = __crc32h(h, *reinterpret_cast<const uint16_t *>(p));
- p += 2;
+#if defined(Q_CC_GNU) && Q_CC_GNU >= 700
+ QT_WARNING_DISABLE_GCC("-Wimplicit-fallthrough")
+#endif
+ switch (left) {
+ case 7:
+ b |= ((uint64_t)in[6]) << 48;
+ case 6:
+ b |= ((uint64_t)in[5]) << 40;
+ case 5:
+ b |= ((uint64_t)in[4]) << 32;
+ case 4:
+ b |= ((uint64_t)in[3]) << 24;
+ case 3:
+ b |= ((uint64_t)in[2]) << 16;
+ case 2:
+ b |= ((uint64_t)in[1]) << 8;
+ case 1:
+ b |= ((uint64_t)in[0]);
+ break;
+ case 0:
+ break;
}
- if (sizeof(Char) == 1 && len & 1)
- h = __crc32b(h, *p);
- return h;
+
+ v3 ^= b;
+
+ for (i = 0; i < cROUNDS; ++i)
+ SIPROUND;
+
+ v0 ^= b;
+
+ v2 ^= 0xff;
+
+ for (i = 0; i < dROUNDS; ++i)
+ SIPROUND;
+
+ b = v0 ^ v1 ^ v2 ^ v3;
+ return b;
}
#else
-static inline bool hasFastCrc32()
+// This is a "SipHash" implementation adopted for 32bit platforms. It performs
+// basically the same operations as the 64bit version using 4 byte at a time
+// instead of 8.
+//
+// To make this work, we also need to change the constants for the mixing
+// rotations in ROTL. We're simply using half of the 64bit constants, rounded up
+// for odd numbers.
+//
+// For the v0-v4 constants, simply use the first four bytes of the 64 bit versions.
+//
+// Use SipHash-1-2, which has similar performance characteristics as
+// stablehash() above, instead of the SipHash-2-4 default
+#define cROUNDS 1
+#define dROUNDS 2
+
+#define ROTL(x, b) (uint32_t)(((x) << (b)) | ((x) >> (32 - (b))))
+
+#define SIPROUND \
+ do { \
+ v0 += v1; \
+ v1 = ROTL(v1, 7); \
+ v1 ^= v0; \
+ v0 = ROTL(v0, 16); \
+ v2 += v3; \
+ v3 = ROTL(v3, 8); \
+ v3 ^= v2; \
+ v0 += v3; \
+ v3 = ROTL(v3, 11); \
+ v3 ^= v0; \
+ v2 += v1; \
+ v1 = ROTL(v1, 9); \
+ v1 ^= v2; \
+ v2 = ROTL(v2, 16); \
+ } while (0)
+
+
+static uint siphash(const uint8_t *in, uint inlen, const uint seed)
{
- return false;
-}
+ /* "somepseudorandomlygeneratedbytes" */
+ uint v0 = 0x736f6d65U;
+ uint v1 = 0x646f7261U;
+ uint v2 = 0x6c796765U;
+ uint v3 = 0x74656462U;
+ uint b;
+ uint k0 = seed;
+ uint k1 = seed ^ inlen;
+ int i;
+ const uint8_t *end = in + (inlen & ~3ULL);
+ const int left = inlen & 3;
+ b = inlen << 24;
+ v3 ^= k1;
+ v2 ^= k0;
+ v1 ^= k1;
+ v0 ^= k0;
+
+ for (; in != end; in += 4) {
+ uint m = qFromUnaligned<uint>(in);
+ v3 ^= m;
+
+ for (i = 0; i < cROUNDS; ++i)
+ SIPROUND;
+
+ v0 ^= m;
+ }
-static uint crc32(...)
-{
- Q_UNREACHABLE();
- return 0;
-}
+#if defined(Q_CC_GNU) && Q_CC_GNU >= 700
+ QT_WARNING_DISABLE_GCC("-Wimplicit-fallthrough")
#endif
+ switch (left) {
+ case 3:
+ b |= ((uint)in[2]) << 16;
+ case 2:
+ b |= ((uint)in[1]) << 8;
+ case 1:
+ b |= ((uint)in[0]);
+ break;
+ case 0:
+ break;
+ }
-static inline uint hash(const uchar *p, size_t len, uint seed) noexcept
-{
- uint h = seed;
+ v3 ^= b;
- if (seed && hasFastCrc32())
- return crc32(p, len, h);
+ for (i = 0; i < cROUNDS; ++i)
+ SIPROUND;
- for (size_t i = 0; i < len; ++i)
- h = 31 * h + p[i];
+ v0 ^= b;
- return h;
-}
+ v2 ^= 0xff;
-uint qHashBits(const void *p, size_t len, uint seed) noexcept
-{
- return hash(static_cast<const uchar*>(p), int(len), seed);
+ for (i = 0; i < dROUNDS; ++i)
+ SIPROUND;
+
+ b = v0 ^ v1 ^ v2 ^ v3;
+ return b;
}
+#endif
-static inline uint hash(const QChar *p, size_t len, uint seed) noexcept
+size_t qHashBits(const void *p, size_t size, size_t seed) noexcept
{
- uint h = seed;
+ if (size <= QT_POINTER_SIZE)
+ return murmurhash(p, size, seed);
- if (seed && hasFastCrc32())
- return crc32(p, len, h);
-
- for (size_t i = 0; i < len; ++i)
- h = 31 * h + p[i].unicode();
-
- return h;
+ return siphash(reinterpret_cast<const uchar *>(p), size, seed);
}
-uint qHash(const QByteArray &key, uint seed) noexcept
+size_t qHash(const QByteArray &key, size_t seed) noexcept
{
- return hash(reinterpret_cast<const uchar *>(key.constData()), size_t(key.size()), seed);
+ return qHashBits(key.constData(), size_t(key.size()), seed);
}
#if QT_STRINGVIEW_LEVEL < 2
-uint qHash(const QString &key, uint seed) noexcept
+size_t qHash(const QString &key, size_t seed) noexcept
{
- return hash(key.unicode(), size_t(key.size()), seed);
+ return qHashBits(key.unicode(), size_t(key.size())*sizeof(QChar), seed);
}
-uint qHash(const QStringRef &key, uint seed) noexcept
+size_t qHash(const QStringRef &key, size_t seed) noexcept
{
- return hash(key.unicode(), size_t(key.size()), seed);
+ return qHashBits(key.unicode(), size_t(key.size())*sizeof(QChar), seed);
}
#endif
-uint qHash(QStringView key, uint seed) noexcept
+size_t qHash(QStringView key, size_t seed) noexcept
{
- return hash(key.data(), key.size(), seed);
+ return qHashBits(key.data(), key.size()*sizeof(QChar), seed);
}
-uint qHash(const QBitArray &bitArray, uint seed) noexcept
+size_t qHash(const QBitArray &bitArray, size_t seed) noexcept
{
int m = bitArray.d.size() - 1;
- uint result = hash(reinterpret_cast<const uchar *>(bitArray.d.constData()),
- size_t(qMax(0, m)), seed);
+ size_t result = qHashBits(reinterpret_cast<const uchar *>(bitArray.d.constData()), size_t(qMax(0, m)), seed);
// deal with the last 0 to 7 bits manually, because we can't trust that
// the padding is initialized to 0 in bitArray.d
@@ -264,21 +430,13 @@ uint qHash(const QBitArray &bitArray, uint seed) noexcept
return result;
}
-uint qHash(QLatin1String key, uint seed) noexcept
+size_t qHash(QLatin1String key, size_t seed) noexcept
{
- return hash(reinterpret_cast<const uchar *>(key.data()), size_t(key.size()), seed);
+ return qHashBits(reinterpret_cast<const uchar *>(key.data()), size_t(key.size()), seed);
}
/*!
\internal
-
- Creates the QHash random seed from various sources.
- In order of decreasing precedence:
- - under Unix, it attemps to read from /dev/urandom;
- - under Unix, it attemps to read from /dev/random;
- - under Windows, it attempts to use rand_s;
- - as a general fallback, the application's PID, a timestamp and the
- address of a stack-local variable are used.
*/
static uint qt_create_qhash_seed()
{
@@ -413,330 +571,8 @@ uint qt_hash(QStringView key, uint chained) noexcept
return h;
}
-/*
- The prime_deltas array contains the difference between a power
- of two and the next prime number:
-
- prime_deltas[i] = nextprime(2^i) - 2^i
-
- Basically, it's sequence A092131 from OEIS, assuming:
- - nextprime(1) = 1
- - nextprime(2) = 2
- and
- - left-extending it for the offset 0 (A092131 starts at i=1)
- - stopping the sequence at i = 28 (the table is big enough...)
-*/
-
-static const uchar prime_deltas[] = {
- 0, 0, 1, 3, 1, 5, 3, 3, 1, 9, 7, 5, 3, 17, 27, 3,
- 1, 29, 3, 21, 7, 17, 15, 9, 43, 35, 15, 0, 0, 0, 0, 0
-};
-
-/*
- The primeForNumBits() function returns the prime associated to a
- power of two. For example, primeForNumBits(8) returns 257.
-*/
-
-static inline int primeForNumBits(int numBits)
-{
- return (1 << numBits) + prime_deltas[numBits];
-}
-
-/*
- Returns the smallest integer n such that
- primeForNumBits(n) >= hint.
-*/
-static int countBits(int hint)
-{
- int numBits = 0;
- int bits = hint;
-
- while (bits > 1) {
- bits >>= 1;
- numBits++;
- }
-
- if (numBits >= (int)sizeof(prime_deltas)) {
- numBits = sizeof(prime_deltas) - 1;
- } else if (primeForNumBits(numBits) < hint) {
- ++numBits;
- }
- return numBits;
-}
-
-/*
- A QHash has initially around pow(2, MinNumBits) buckets. For
- example, if MinNumBits is 4, it has 17 buckets.
-*/
-const int MinNumBits = 4;
-
-const QHashData QHashData::shared_null = {
- nullptr, nullptr, Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, MinNumBits, 0, 0, 0, true, false, 0
-};
-
-void *QHashData::allocateNode(int nodeAlign)
-{
- void *ptr = strictAlignment ? qMallocAligned(nodeSize, nodeAlign) : malloc(nodeSize);
- Q_CHECK_PTR(ptr);
- return ptr;
-}
-
-void QHashData::freeNode(void *node)
-{
- if (strictAlignment)
- qFreeAligned(node);
- else
- free(node);
-}
-
-QHashData *QHashData::detach_helper(void (*node_duplicate)(Node *, void *),
- void (*node_delete)(Node *),
- int nodeSize,
- int nodeAlign)
-{
- union {
- QHashData *d;
- Node *e;
- };
- if (this == &shared_null)
- qt_initialize_qhash_seed(); // may throw
- d = new QHashData;
- d->fakeNext = nullptr;
- d->buckets = nullptr;
- d->ref.initializeOwned();
- d->size = size;
- d->nodeSize = nodeSize;
- d->userNumBits = userNumBits;
- d->numBits = numBits;
- d->numBuckets = numBuckets;
- d->seed = (this == &shared_null) ? uint(qt_qhash_seed.loadRelaxed()) : seed;
- d->sharable = true;
- d->strictAlignment = nodeAlign > 8;
- d->reserved = 0;
-
- if (numBuckets) {
- QT_TRY {
- d->buckets = new Node *[numBuckets];
- } QT_CATCH(...) {
- // restore a consistent state for d
- d->numBuckets = 0;
- // roll back
- d->free_helper(node_delete);
- QT_RETHROW;
- }
-
- Node *this_e = reinterpret_cast<Node *>(this);
- for (int i = 0; i < numBuckets; ++i) {
- Node **nextNode = &d->buckets[i];
- Node *oldNode = buckets[i];
- while (oldNode != this_e) {
- QT_TRY {
- Node *dup = static_cast<Node *>(allocateNode(nodeAlign));
-
- QT_TRY {
- node_duplicate(oldNode, dup);
- } QT_CATCH(...) {
- freeNode( dup );
- QT_RETHROW;
- }
-
- *nextNode = dup;
- nextNode = &dup->next;
- oldNode = oldNode->next;
- } QT_CATCH(...) {
- // restore a consistent state for d
- *nextNode = e;
- d->numBuckets = i+1;
- // roll back
- d->free_helper(node_delete);
- QT_RETHROW;
- }
- }
- *nextNode = e;
- }
- }
- return d;
-}
-
-void QHashData::free_helper(void (*node_delete)(Node *))
-{
- if (node_delete) {
- Node *this_e = reinterpret_cast<Node *>(this);
- Node **bucket = reinterpret_cast<Node **>(this->buckets);
-
- int n = numBuckets;
- while (n--) {
- Node *cur = *bucket++;
- while (cur != this_e) {
- Node *next = cur->next;
- node_delete(cur);
- freeNode(cur);
- cur = next;
- }
- }
- }
- delete [] buckets;
- delete this;
-}
-
-QHashData::Node *QHashData::nextNode(Node *node)
-{
- union {
- Node *next;
- Node *e;
- QHashData *d;
- };
- next = node->next;
- Q_ASSERT_X(next, "QHash", "Iterating beyond end()");
- if (next->next)
- return next;
-
- int start = (node->h % d->numBuckets) + 1;
- Node **bucket = d->buckets + start;
- int n = d->numBuckets - start;
- while (n--) {
- if (*bucket != e)
- return *bucket;
- ++bucket;
- }
- return e;
-}
-
-QHashData::Node *QHashData::previousNode(Node *node)
-{
- union {
- Node *e;
- QHashData *d;
- };
-
- e = node;
- while (e->next)
- e = e->next;
-
- int start;
- if (node == e)
- start = d->numBuckets - 1;
- else
- start = node->h % d->numBuckets;
-
- Node *sentinel = node;
- Node **bucket = d->buckets + start;
- while (start >= 0) {
- if (*bucket != sentinel) {
- Node *prev = *bucket;
- while (prev->next != sentinel)
- prev = prev->next;
- return prev;
- }
-
- sentinel = e;
- --bucket;
- --start;
- }
- Q_ASSERT_X(start >= 0, "QHash", "Iterating backward beyond begin()");
- return e;
-}
-
-/*
- If hint is negative, -hint gives the approximate number of
- buckets that should be used for the hash table. If hint is
- nonnegative, (1 << hint) gives the approximate number
- of buckets that should be used.
-*/
-void QHashData::rehash(int hint)
-{
- if (hint < 0) {
- hint = countBits(-hint);
- if (hint < MinNumBits)
- hint = MinNumBits;
- userNumBits = hint;
- while (primeForNumBits(hint) < (size >> 1))
- ++hint;
- } else if (hint < MinNumBits) {
- hint = MinNumBits;
- }
-
- if (numBits != hint) {
- Node *e = reinterpret_cast<Node *>(this);
- Node **oldBuckets = buckets;
- int oldNumBuckets = numBuckets;
-
- int nb = primeForNumBits(hint);
- buckets = new Node *[nb];
- numBits = hint;
- numBuckets = nb;
- for (int i = 0; i < numBuckets; ++i)
- buckets[i] = e;
-
- for (int i = 0; i < oldNumBuckets; ++i) {
- Node *firstNode = oldBuckets[i];
- while (firstNode != e) {
- uint h = firstNode->h;
- Node *lastNode = firstNode;
- while (lastNode->next != e && lastNode->next->h == h)
- lastNode = lastNode->next;
-
- Node *afterLastNode = lastNode->next;
- Node **beforeFirstNode = &buckets[h % numBuckets];
- while (*beforeFirstNode != e)
- beforeFirstNode = &(*beforeFirstNode)->next;
- lastNode->next = *beforeFirstNode;
- *beforeFirstNode = firstNode;
- firstNode = afterLastNode;
- }
- }
- delete [] oldBuckets;
- }
-}
-
-#ifdef QT_QHASH_DEBUG
-
-void QHashData::dump()
-{
- qDebug("Hash data (ref = %d, size = %d, nodeSize = %d, userNumBits = %d, numBits = %d, numBuckets = %d)",
- int(ref), size, nodeSize, userNumBits, numBits,
- numBuckets);
- qDebug(" %p (fakeNode = %p)", this, fakeNext);
- for (int i = 0; i < numBuckets; ++i) {
- Node *n = buckets[i];
- if (n != reinterpret_cast<Node *>(this)) {
- QString line = QString::asprintf("%d:", i);
- while (n != reinterpret_cast<Node *>(this)) {
- line += QString::asprintf(" -> [%p]", n);
- if (!n) {
- line += " (CORRUPT)";
- break;
- }
- n = n->next;
- }
- qDebug("%ls", qUtf16Printable(line));
- }
- }
-}
-
-void QHashData::checkSanity()
-{
- if (Q_UNLIKELY(fakeNext))
- qFatal("Fake next isn't 0");
-
- for (int i = 0; i < numBuckets; ++i) {
- Node *n = buckets[i];
- Node *p = n;
- if (Q_UNLIKELY(!n))
- qFatal("%d: Bucket entry is 0", i);
- if (n != reinterpret_cast<Node *>(this)) {
- while (n != reinterpret_cast<Node *>(this)) {
- if (Q_UNLIKELY(!n->next))
- qFatal("%d: Next of %p is 0, should be %p", i, n, this);
- n = n->next;
- }
- }
- }
-}
-#endif
-
/*!
- \fn template <typename T1, typename T2> uint qHash(const QPair<T1, T2> &key, uint seed = 0)
+ \fn template <typename T1, typename T2> size_t qHash(const QPair<T1, T2> &key, size_t seed = 0)
\since 5.0
\relates QHash
@@ -746,7 +582,7 @@ void QHashData::checkSanity()
*/
/*!
- \fn template <typename T1, typename T2> uint qHash(const std::pair<T1, T2> &key, uint seed = 0)
+ \fn template <typename T1, typename T2> size_t qHash(const std::pair<T1, T2> &key, size_t seed = 0)
\since 5.7
\relates QHash
@@ -760,7 +596,7 @@ void QHashData::checkSanity()
constraints, we cannot change the QPair algorithm to match the std::pair one before Qt 6.
*/
-/*! \fn template <typename InputIterator> uint qHashRange(InputIterator first, InputIterator last, uint seed = 0)
+/*! \fn template <typename InputIterator> size_t qHashRange(InputIterator first, InputIterator last, size_t seed = 0)
\relates QHash
\since 5.5
@@ -795,7 +631,7 @@ void QHashData::checkSanity()
\sa qHashBits(), qHashRangeCommutative()
*/
-/*! \fn template <typename InputIterator> uint qHashRangeCommutative(InputIterator first, InputIterator last, uint seed = 0)
+/*! \fn template <typename InputIterator> size_t qHashRangeCommutative(InputIterator first, InputIterator last, size_t seed = 0)
\relates QHash
\since 5.5
@@ -831,7 +667,7 @@ void QHashData::checkSanity()
\sa qHashBits(), qHashRange()
*/
-/*! \fn uint qHashBits(const void *p, size_t len, uint seed = 0)
+/*! \fn size_t qHashBits(const void *p, size_t len, size_t seed = 0)
\relates QHash
\since 5.4
@@ -856,101 +692,106 @@ void QHashData::checkSanity()
\sa qHashRange(), qHashRangeCommutative()
*/
-/*! \fn uint qHash(char key, uint seed = 0)
+/*! \fn size_t qHash(char key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(uchar key, uint seed = 0)
+/*! \fn size_t qHash(uchar key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(signed char key, uint seed = 0)
+/*! \fn size_t qHash(signed char key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(ushort key, uint seed = 0)
+/*! \fn size_t qHash(ushort key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(short key, uint seed = 0)
+/*! \fn size_t qHash(short key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(uint key, uint seed = 0)
+/*! \fn size_t qHash(uint key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(int key, uint seed = 0)
+/*! \fn size_t qHash(int key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(ulong key, uint seed = 0)
+/*! \fn size_t qHash(ulong key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(long key, uint seed = 0)
+/*! \fn size_t qHash(long key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(quint64 key, uint seed = 0)
+/*! \fn size_t qHash(quint64 key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(qint64 key, uint seed = 0)
+/*! \fn size_t qHash(qint64 key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \relates QHash
+/*! \fn size_t qHash(float key, size_t seed) noexcept
+ \relates QHash
\since 5.3
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-uint qHash(float key, uint seed) noexcept
-{
- return key != 0.0f ? hash(reinterpret_cast<const uchar *>(&key), sizeof(key), seed) : seed ;
-}
/*! \relates QHash
\since 5.3
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-uint qHash(double key, uint seed) noexcept
+size_t qHash(double key, size_t seed) noexcept
{
- return key != 0.0 ? hash(reinterpret_cast<const uchar *>(&key), sizeof(key), seed) : seed ;
+ // ensure -0 gets mapped to 0
+ key += 0.0;
+ if constexpr (sizeof(double) == sizeof(size_t)) {
+ size_t k;
+ memcpy(&k, &key, sizeof(double));
+ return QHashPrivate::hash(k, seed);
+ } else {
+ return murmurhash(&key, sizeof(key), seed);
+ }
}
#if !defined(Q_OS_DARWIN) || defined(Q_CLANG_QDOC)
@@ -959,62 +800,70 @@ uint qHash(double key, uint seed) noexcept
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-uint qHash(long double key, uint seed) noexcept
+size_t qHash(long double key, size_t seed) noexcept
{
- return key != 0.0L ? hash(reinterpret_cast<const uchar *>(&key), sizeof(key), seed) : seed ;
+ // ensure -0 gets mapped to 0
+ key += static_cast<long double>(0.0);
+ if constexpr (sizeof(long double) == sizeof(size_t)) {
+ size_t k;
+ memcpy(&k, &key, sizeof(long double));
+ return QHashPrivate::hash(k, seed);
+ } else {
+ return murmurhash(&key, sizeof(key), seed);
+ }
}
#endif
-/*! \fn uint qHash(const QChar key, uint seed = 0)
+/*! \fn size_t qHash(const QChar key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(const QByteArray &key, uint seed = 0)
+/*! \fn size_t qHash(const QByteArray &key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(const QBitArray &key, uint seed = 0)
+/*! \fn size_t qHash(const QBitArray &key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(const QString &key, uint seed = 0)
+/*! \fn size_t qHash(const QString &key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(const QStringRef &key, uint seed = 0)
+/*! \fn size_t qHash(const QStringRef &key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(QStringView key, uint seed = 0)
+/*! \fn size_t qHash(QStringView key, size_t seed = 0)
\relates QStringView
\since 5.10
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn uint qHash(QLatin1String key, uint seed = 0)
+/*! \fn size_t qHash(QLatin1String key, size_t seed = 0)
\relates QHash
\since 5.0
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-/*! \fn template <class T> uint qHash(const T *key, uint seed = 0)
+/*! \fn template <class T> size_t qHash(const T *key, size_t seed = 0)
\relates QHash
\since 5.0
@@ -1091,13 +940,16 @@ uint qHash(long double key, uint seed) noexcept
in the code above.
Internally, QHash uses a hash table to perform lookups. This
- hash table automatically grows and shrinks to
+ hash table automatically grows to
provide fast lookups without wasting too much memory. You can
still control the size of the hash table by calling reserve() if
you already know approximately how many items the QHash will
contain, but this isn't necessary to obtain good performance. You
can also call capacity() to retrieve the hash table's size.
+ QHash will not shrink automatically if items are removed from the
+ table. To minimize the memory used by the hash, call squeeze().
+
If you want to navigate through all the (key, value) pairs stored
in a QHash, you can use an iterator. QHash provides both
\l{Java-style iterators} (QHashIterator and QMutableHashIterator)
@@ -1114,12 +966,15 @@ uint qHash(long double key, uint seed) noexcept
QHash is unordered, so an iterator's sequence cannot be assumed
to be predictable. If ordering by key is required, use a QMap.
- Normally, a QHash allows only one value per key. If you call
+ A QHash allows only one value per key. If you call
insert() with a key that already exists in the QHash, the
previous value is erased. For example:
\snippet code/src_corelib_tools_qhash.cpp 9
+ If you need to store multiple entries for the same key in the
+ hash table, use \l{QMultiHash}.
+
If you only need to extract the values from a hash (not the keys),
you can also use \l{foreach}:
@@ -1231,9 +1086,6 @@ uint qHash(long double key, uint seed) noexcept
Constructs a hash with a copy of each of the elements in the
initializer list \a list.
-
- This function is only available if the program is being
- compiled in C++11 mode.
*/
/*! \fn template <class Key, class T> template <class InputIterator> QHash<Key, T>::QHash(InputIterator begin, InputIterator end)
@@ -1345,24 +1197,45 @@ uint qHash(long double key, uint seed) noexcept
\sa reserve(), squeeze()
*/
+/*! \fn template <class Key, class T> float QHash<Key, T>::load_factor() const noexcept
+
+ Returns the current load factor of the QHash's internal hash table.
+ This is the same as capacity()/size(). The implementation used
+ will aim to keep the load factor between 0.25 and 0.5. This avoids
+ having too many hash table collisions that would degrade performance.
+
+ Even with a low load factor, the implementation of the hash table has a
+ very low memory overhead.
+
+ This method purely exists for diagnostic purposes and you should rarely
+ need to call it yourself.
+
+ \sa reserve(), squeeze()
+*/
+
+
/*! \fn template <class Key, class T> void QHash<Key, T>::reserve(int size)
- Ensures that the QHash's internal hash table consists of at least
- \a size buckets.
+ Ensures that the QHash's internal hash table has space to store at
+ least \a size items without having to grow the hash table.
+
+ This implies that the hash table will contain at least 2 * \a size buckets
+ to ensure good performance
This function is useful for code that needs to build a huge hash
and wants to avoid repeated reallocation. For example:
\snippet code/src_corelib_tools_qhash.cpp 14
- Ideally, \a size should be slightly more than the maximum number
- of items expected in the hash. \a size doesn't have to be prime,
- because QHash will use a prime number internally anyway. If \a size
+ Ideally, \a size should be the maximum number of items expected
+ in the hash. QHash will then choose the smallest possible
+ number of buckets that will allow storing \a size items in the table
+ without having to grow the internal hash table. If \a size
is an underestimate, the worst that will happen is that the QHash
will be a bit slower.
In general, you will rarely ever need to call this function.
- QHash's internal hash table automatically shrinks or grows to
+ QHash's internal hash table automatically grows to
provide good performance without wasting too much memory.
\sa squeeze(), capacity()
@@ -1400,30 +1273,27 @@ uint qHash(long double key, uint seed) noexcept
\sa detach()
*/
-/*! \fn template <class Key, class T> void QHash<Key, T>::setSharable(bool sharable)
-
- \internal
-*/
-
/*! \fn template <class Key, class T> bool QHash<Key, T>::isSharedWith(const QHash &other) const
\internal
+
+ Returns true if the internal hash table of this QHash is shared with \a other, otherwise false.
*/
/*! \fn template <class Key, class T> void QHash<Key, T>::clear()
- Removes all items from the hash.
+ Removes all items from the hash and frees up all memory used by it.
\sa remove()
*/
-/*! \fn template <class Key, class T> int QHash<Key, T>::remove(const Key &key)
+/*! \fn template <class Key, class T> bool QHash<Key, T>::remove(const Key &key)
- Removes all the items that have the \a key from the hash.
- Returns the number of items removed which is 1 if the key exists in the hash,
- and 0 otherwise.
+ Removes the item that has the \a key from the hash.
+ Returns true if the key exists in the hash and the item has been removed,
+ and false otherwise.
- \sa clear(), take(), QMultiHash::remove()
+ \sa clear(), take()
*/
/*! \fn template <class Key, class T> T QHash<Key, T>::take(const Key &key)
@@ -1432,9 +1302,7 @@ uint qHash(long double key, uint seed) noexcept
the value associated with it.
If the item does not exist in the hash, the function simply
- returns a \l{default-constructed value}. If there are multiple
- items for \a key in the hash, only the most recently inserted one
- is removed.
+ returns a \l{default-constructed value}.
If you don't use the return value, remove() is more efficient.
@@ -1449,23 +1317,14 @@ uint qHash(long double key, uint seed) noexcept
\sa count(), QMultiHash::contains()
*/
-/*! \fn template <class Key, class T> const T QHash<Key, T>::value(const Key &key) const
+/*! \fn template <class Key, class T> T QHash<Key, T>::value(const Key &key, const T &defaultValue = T()) const
+ \overload
Returns the value associated with the \a key.
If the hash contains no item with the \a key, the function
- returns a \l{default-constructed value}. If there are multiple
- items for the \a key in the hash, the value of the most recently
- inserted one is returned.
-
- \sa key(), values(), contains(), operator[]()
-*/
-
-/*! \fn template <class Key, class T> const T QHash<Key, T>::value(const Key &key, const T &defaultValue) const
- \overload
-
- If the hash contains no item with the given \a key, the function returns
- \a defaultValue.
+ returns \a defaultValue, which is a \l{default-constructed value} if the
+ parameter has not been specified.
*/
/*! \fn template <class Key, class T> T &QHash<Key, T>::operator[](const Key &key)
@@ -1475,9 +1334,7 @@ uint qHash(long double key, uint seed) noexcept
If the hash contains no item with the \a key, the function inserts
a \l{default-constructed value} into the hash with the \a key, and
- returns a reference to it. If the hash contains multiple items
- with the \a key, this function returns a reference to the most
- recently inserted value.
+ returns a reference to it.
\sa insert(), value()
*/
@@ -1489,27 +1346,14 @@ uint qHash(long double key, uint seed) noexcept
Same as value().
*/
-/*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::uniqueKeys() const
- \since 4.2
- \obsolete Use QMultiHash for storing multiple values with the same key.
-
- Returns a list containing all the keys in the map. Keys that occur multiple
- times in the map (because items were inserted with insertMulti(), or
- unite() was used) occur only once in the returned list.
-
- \sa QMultiHash::uniqueKeys()
-*/
-
/*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::keys() const
Returns a list containing all the keys in the hash, in an
- arbitrary order. Keys that occur multiple times in the hash
- (because the method is operating on a QMultiHash) also occur
- multiple times in the list.
+ arbitrary order.
The order is guaranteed to be the same as that used by values().
- \sa QMultiMap::uniqueKeys(), values(), key()
+ \sa values(), key()
*/
/*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::keys(const T &value) const
@@ -1527,43 +1371,16 @@ uint qHash(long double key, uint seed) noexcept
/*! \fn template <class Key, class T> QList<T> QHash<Key, T>::values() const
Returns a list containing all the values in the hash, in an
- arbitrary order. If a key is associated with multiple values, all of
- its values will be in the list, and not just the most recently
- inserted one.
+ arbitrary order.
The order is guaranteed to be the same as that used by keys().
\sa keys(), value()
*/
-/*! \fn template <class Key, class T> QList<T> QHash<Key, T>::values(const Key &key) const
- \overload
- \obsolete Use QMultiHash for storing multiple values with the same key.
-
- Returns a list of all the values associated with the \a key,
- from the most recently inserted to the least recently inserted.
-
- \sa count(), insertMulti()
-*/
-
-/*! \fn template <class Key, class T> Key QHash<Key, T>::key(const T &value) const
-
- Returns the first key mapped to \a value.
-
- If the hash contains no item with the \a value, the function
- returns a \l{default-constructed value}{default-constructed key}.
-
- This function can be slow (\l{linear time}), because QHash's
- internal data structure is optimized for fast lookup by key, not
- by value.
-
- \sa value(), keys()
-*/
-
/*!
- \fn template <class Key, class T> Key QHash<Key, T>::key(const T &value, const Key &defaultKey) const
+ \fn template <class Key, class T> Key QHash<Key, T>::key(const T &value, const Key &defaultKey = Key()) const
\since 4.3
- \overload
Returns the first key mapped to \a value, or \a defaultKey if the
hash contains no item mapped to \a value.
@@ -1577,7 +1394,7 @@ uint qHash(long double key, uint seed) noexcept
Returns the number of items associated with the \a key.
- \sa contains(), insertMulti()
+ \sa contains()
*/
/*! \fn template <class Key, class T> int QHash<Key, T>::count() const
@@ -1726,7 +1543,7 @@ uint qHash(long double key, uint seed) noexcept
from the hash, and returns an iterator to the next item in the
hash.
- Unlike remove() and take(), this function never causes QHash to
+ This function never causes QHash to
rehash its internal data structure. This means that it can safely
be called while iterating, and won't affect the order of items in
the hash. For example:
@@ -1756,7 +1573,7 @@ uint qHash(long double key, uint seed) noexcept
\snippet code/src_corelib_tools_qhash.cpp 16
- \sa value(), values(), QMultiHash::find()
+ \sa value(), values()
*/
/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator QHash<Key, T>::find(const Key &key) const
@@ -1773,7 +1590,7 @@ uint qHash(long double key, uint seed) noexcept
If the hash contains no item with the \a key, the function
returns constEnd().
- \sa find(), QMultiHash::constFind()
+ \sa find()
*/
/*! \fn template <class Key, class T> QHash<Key, T>::iterator QHash<Key, T>::insert(const Key &key, const T &value)
@@ -1782,11 +1599,20 @@ uint qHash(long double key, uint seed) noexcept
If there is already an item with the \a key, that item's value
is replaced with \a value.
+*/
- If there are multiple items with the \a key, the most
- recently inserted item's value is replaced with \a value.
+/*!
+ \fn template <typename T> template <typename ...Args> QHash<Key, T>::iterator QHash<Key, T>::emplace(const Key &key, Args&&... args)
+ \fn template <typename T> template <typename ...Args> QHash<Key, T>::iterator QHash<Key, T>::emplace(Key &&key, Args&&... args)
+
+ Inserts a new element into the container. This new element
+ is constructed in-place using \a args as the arguments for its
+ construction.
+
+ Returns an iterator pointing to the new element.
*/
+
/*! \fn template <class Key, class T> void QHash<Key, T>::insert(const QHash &other)
\since 5.15
@@ -1799,29 +1625,6 @@ uint qHash(long double key, uint seed) noexcept
final value of the key is undefined.
*/
-/*! \fn template <class Key, class T> QHash<Key, T>::iterator QHash<Key, T>::insertMulti(const Key &key, const T &value)
- \obsolete
-
- Inserts a new item with the \a key and a value of \a value.
-
- If there is already an item with the same key in the hash, this
- function will simply create a new one. (This behavior is
- different from insert(), which overwrites the value of an
- existing item.)
-
- This function is obsolete. Use QMultiHash or QMultiMap instead.
-
- \sa insert(), values()
-*/
-
-/*! \fn template <class Key, class T> QHash &QHash<Key, T>::unite(const QHash &other)
- \obsolete
-
- Inserts all the items in the \a other hash into this hash. If a
- key is common to both hashes, the resulting hash will contain the
- key multiple times.
-*/
-
/*! \fn template <class Key, class T> bool QHash<Key, T>::empty() const
This function is provided for STL compatibility. It is equivalent
@@ -1829,7 +1632,7 @@ uint qHash(long double key, uint seed) noexcept
returns \c false.
*/
-/*! \fn template <class Key, class T> QPair<iterator, iterator> QHash<Key, T>::equal_range(const Key &key)
+/*! \fn template <class Key, class T> QPair<iterator, iterator> QMultiHash<Key, T>::equal_range(const Key &key)
\since 5.7
Returns a pair of iterators delimiting the range of values \c{[first, second)}, that
@@ -1837,7 +1640,7 @@ uint qHash(long double key, uint seed) noexcept
*/
/*!
- \fn template <class Key, class T> QPair<const_iterator, const_iterator> QHash<Key, T>::equal_range(const Key &key) const
+ \fn template <class Key, class T> QPair<const_iterator, const_iterator> QMultiHash<Key, T>::equal_range(const Key &key) const
\overload
\since 5.7
*/
@@ -1934,7 +1737,7 @@ uint qHash(long double key, uint seed) noexcept
/*! \class QHash::iterator
\inmodule QtCore
- \brief The QHash::iterator class provides an STL-style non-const iterator for QHash and QMultiHash.
+ \brief The QHash::iterator class provides an STL-style non-const iterator for QHash.
QHash features both \l{STL-style iterators} and \l{Java-style
iterators}. The STL-style iterators are more low-level and more
@@ -1942,8 +1745,8 @@ uint qHash(long double key, uint seed) noexcept
and, for developers who already know STL, have the advantage of
familiarity.
- QHash\<Key, T\>::iterator allows you to iterate over a QHash (or
- QMultiHash) and to modify the value (but not the key) associated
+ QHash\<Key, T\>::iterator allows you to iterate over a QHash
+ and to modify the value (but not the key) associated
with a particular key. If you want to iterate over a const QHash,
you should use QHash::const_iterator. It is generally good
practice to use QHash::const_iterator on a non-const QHash as
@@ -1987,14 +1790,21 @@ uint qHash(long double key, uint seed) noexcept
However, this will potentially crash in \c{++i}, because \c i is
a dangling iterator after the call to erase().
- Multiple iterators can be used on the same hash. However, be
- aware that any modification performed directly on the QHash has
- the potential of dramatically changing the order in which the
- items are stored in the hash, as they might cause QHash to rehash
- its internal data structure. There is one notable exception:
- QHash::erase(). This function can safely be called while
- iterating, and won't affect the order of items in the hash. If you
- need to keep iterators over a long period of time, we recommend
+ Multiple iterators can be used on the same hash. However, be aware
+ that any modification performed directly on the QHash (inserting and
+ removing items) can cause the iterators to become invalid.
+
+ Inserting items into the hash or calling methods such as QHash::reserve()
+ or QHash::squeeze() can invalidate all iterators pointing into the hash.
+ Iterators are guaranteed to stay valid only as long as the QHash doesn't have
+ to grow/shrink its internal hash table.
+ Using any iterator after a rehashing operation has occurred will lead to undefined behavior.
+
+ You can however safely use iterators to remove entries from the hash
+ using the QHash::erase() method. This function can safely be called while
+ iterating, and won't affect the order of items in the hash.
+
+ If you need to keep iterators over a long period of time, we recommend
that you use QMap rather than QHash.
\warning Iterators on implicitly shared containers do not work
@@ -2016,11 +1826,6 @@ uint qHash(long double key, uint seed) noexcept
\sa QHash::begin(), QHash::end()
*/
-/*! \fn template <class Key, class T> QHash<Key, T>::iterator::iterator(void *node)
-
- \internal
-*/
-
/*! \fn template <class Key, class T> const Key &QHash<Key, T>::iterator::key() const
Returns the current item's key as a const reference.
@@ -2088,8 +1893,6 @@ uint qHash(long double key, uint seed) noexcept
item.
Calling this function on QHash::end() leads to undefined results.
-
- \sa operator--()
*/
/*! \fn template <class Key, class T> QHash<Key, T>::iterator QHash<Key, T>::iterator::operator++(int)
@@ -2101,74 +1904,9 @@ uint qHash(long double key, uint seed) noexcept
current item.
*/
-/*!
- \fn template <class Key, class T> QHash<Key, T>::iterator &QHash<Key, T>::iterator::operator--()
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- The prefix -- operator (\c{--i}) makes the preceding item
- current and returns an iterator pointing to the new current item.
-
- Calling this function on QHash::begin() leads to undefined
- results.
-
- \sa operator++()
-*/
-
-/*!
- \fn template <class Key, class T> QHash<Key, T>::iterator QHash<Key, T>::iterator::operator--(int)
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- \overload
-
- The postfix -- operator (\c{i--}) makes the preceding item
- current and returns an iterator pointing to the previously
- current item.
-*/
-
-/*! \fn template <class Key, class T> QHash<Key, T>::iterator QHash<Key, T>::iterator::operator+(int j) const
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- Returns an iterator to the item at \a j positions forward from
- this iterator. (If \a j is negative, the iterator goes backward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator-()
-
-*/
-
-/*! \fn template <class Key, class T> QHash<Key, T>::iterator QHash<Key, T>::iterator::operator-(int j) const
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- Returns an iterator to the item at \a j positions backward from
- this iterator. (If \a j is negative, the iterator goes forward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator+()
-*/
-
-/*! \fn template <class Key, class T> QHash<Key, T>::iterator &QHash<Key, T>::iterator::operator+=(int j)
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- Advances the iterator by \a j items. (If \a j is negative, the
- iterator goes backward.)
-
- \sa operator-=(), operator+()
-*/
-
-/*! \fn template <class Key, class T> QHash<Key, T>::iterator &QHash<Key, T>::iterator::operator-=(int j)
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- Makes the iterator go back by \a j items. (If \a j is negative,
- the iterator goes forward.)
-
- \sa operator+=(), operator-()
-*/
-
/*! \class QHash::const_iterator
\inmodule QtCore
- \brief The QHash::const_iterator class provides an STL-style const iterator for QHash and QMultiHash.
+ \brief The QHash::const_iterator class provides an STL-style const iterator for QHash.
QHash features both \l{STL-style iterators} and \l{Java-style
iterators}. The STL-style iterators are more low-level and more
@@ -2177,7 +1915,7 @@ uint qHash(long double key, uint seed) noexcept
familiarity.
QHash\<Key, T\>::const_iterator allows you to iterate over a
- QHash (or a QMultiHash). If you want to modify the QHash as you
+ QHash. If you want to modify the QHash as you
iterate over it, you must use QHash::iterator instead. It is
generally good practice to use QHash::const_iterator on a
non-const QHash as well, unless you need to change the QHash
@@ -2199,11 +1937,14 @@ uint qHash(long double key, uint seed) noexcept
recently to the least recently inserted value.
Multiple iterators can be used on the same hash. However, be aware
- that any modification performed directly on the QHash has the
- potential of dramatically changing the order in which the items
- are stored in the hash, as they might cause QHash to rehash its
- internal data structure. If you need to keep iterators over a long
- period of time, we recommend that you use QMap rather than QHash.
+ that any modification performed directly on the QHash (inserting and
+ removing items) can cause the iterators to become invalid.
+
+ Inserting items into the hash or calling methods such as QHash::reserve()
+ or QHash::squeeze() can invalidate all iterators pointing into the hash.
+ Iterators are guaranteed to stay valid only as long as the QHash doesn't have
+ to grow/shrink its internal hash table.
+ Using any iterator after a rehashing operation has occurred will lead to undefined behavior.
\warning Iterators on implicitly shared containers do not work
exactly like STL-iterators. You should avoid copying a container
@@ -2224,11 +1965,6 @@ uint qHash(long double key, uint seed) noexcept
\sa QHash::constBegin(), QHash::constEnd()
*/
-/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator::const_iterator(void *node)
-
- \internal
-*/
-
/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator::const_iterator(const iterator &other)
Constructs a copy of \a other.
@@ -2301,76 +2037,10 @@ uint qHash(long double key, uint seed) noexcept
current item.
*/
-/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator &QHash<Key, T>::const_iterator::operator--()
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- The prefix -- operator (\c{--i}) makes the preceding item
- current and returns an iterator pointing to the new current item.
-
- Calling this function on QHash::begin() leads to undefined
- results.
-
- \sa operator++()
-*/
-
-/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator QHash<Key, T>::const_iterator::operator--(int)
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- \overload
-
- The postfix -- operator (\c{i--}) makes the preceding item
- current and returns an iterator pointing to the previously
- current item.
-*/
-
-/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator QHash<Key, T>::const_iterator::operator+(int j) const
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- Returns an iterator to the item at \a j positions forward from
- this iterator. (If \a j is negative, the iterator goes backward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator-()
-*/
-
-/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator QHash<Key, T>::const_iterator::operator-(int j) const
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- Returns an iterator to the item at \a j positions backward from
- this iterator. (If \a j is negative, the iterator goes forward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator+()
-*/
-
-/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator &QHash<Key, T>::const_iterator::operator+=(int j)
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- Advances the iterator by \a j items. (If \a j is negative, the
- iterator goes backward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator-=(), operator+()
-*/
-
-/*! \fn template <class Key, class T> QHash<Key, T>::const_iterator &QHash<Key, T>::const_iterator::operator-=(int j)
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- Makes the iterator go back by \a j items. (If \a j is negative,
- the iterator goes forward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator+=(), operator-()
-*/
-
/*! \class QHash::key_iterator
\inmodule QtCore
\since 5.6
- \brief The QHash::key_iterator class provides an STL-style const iterator for QHash and QMultiHash keys.
+ \brief The QHash::key_iterator class provides an STL-style const iterator for QHash keys.
QHash::key_iterator is essentially the same as QHash::const_iterator
with the difference that operator*() and operator->() return a key
@@ -2451,28 +2121,6 @@ uint qHash(long double key, uint seed) noexcept
item.
*/
-/*! \fn template <class Key, class T> QHash<Key, T>::key_iterator &QHash<Key, T>::key_iterator::operator--()
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- The prefix -- operator (\c{--i}) makes the preceding item
- current and returns an iterator pointing to the new current item.
-
- Calling this function on QHash::keyBegin() leads to undefined
- results.
-
- \sa operator++()
-*/
-
-/*! \fn template <class Key, class T> QHash<Key, T>::key_iterator QHash<Key, T>::key_iterator::operator--(int)
- \obsolete This operator is deprecated in order to align with std::unordered_map functionality.
-
- \overload
-
- The postfix -- operator (\c{i--}) makes the preceding item
- current and returns an iterator pointing to the previous
- item.
-*/
-
/*! \fn template <class Key, class T> const_iterator QHash<Key, T>::key_iterator::base() const
Returns the underlying const_iterator this key_iterator is based on.
*/
@@ -2480,7 +2128,7 @@ uint qHash(long double key, uint seed) noexcept
/*! \typedef QHash::const_key_value_iterator
\inmodule QtCore
\since 5.10
- \brief The QMap::const_key_value_iterator typedef provides an STL-style const iterator for QHash and QMultiHash.
+ \brief The QHash::const_key_value_iterator typedef provides an STL-style const iterator for QHash.
QHash::const_key_value_iterator is essentially the same as QHash::const_iterator
with the difference that operator*() returns a key/value pair instead of a
@@ -2492,7 +2140,7 @@ uint qHash(long double key, uint seed) noexcept
/*! \typedef QHash::key_value_iterator
\inmodule QtCore
\since 5.10
- \brief The QMap::key_value_iterator typedef provides an STL-style iterator for QHash and QMultiHash.
+ \brief The QHash::key_value_iterator typedef provides an STL-style iterator for QHash.
QHash::key_value_iterator is essentially the same as QHash::iterator
with the difference that operator*() returns a key/value pair instead of a
@@ -2642,6 +2290,41 @@ uint qHash(long double key, uint seed) noexcept
\sa replace()
*/
+/*!
+ \fn template <typename T> template <typename ...Args> QMultiHash<Key, T>::iterator QMultiHash<Key, T>::emplace(const Key &key, Args&&... args)
+ \fn template <typename T> template <typename ...Args> QMultiHash<Key, T>::iterator QMultiHash<Key, T>::emplace(Key &&key, Args&&... args)
+
+ Inserts a new element into the container. This new element
+ is constructed in-place using \a args as the arguments for its
+ construction.
+
+ If there is already an item with the same key in the hash, this
+ function will simply create a new one. (This behavior is
+ different from replace(), which overwrites the value of an
+ existing item.)
+
+ Returns an iterator pointing to the new element.
+
+ \sa insert
+*/
+
+/*!
+ \fn template <typename T> template <typename ...Args> QMultiHash<Key, T>::iterator QMultiHash<Key, T>::emplaceReplace(const Key &key, Args&&... args)
+ \fn template <typename T> template <typename ...Args> QMultiHash<Key, T>::iterator QMultiHash<Key, T>::emplaceReplace(Key &&key, Args&&... args)
+
+ Inserts a new element into the container. This new element
+ is constructed in-place using \a args as the arguments for its
+ construction.
+
+ If there is already an item with the same key in the hash, that item's
+ value is replaced with a value constructed from \a args.
+
+ Returns an iterator pointing to the new element.
+
+ \sa replace, emplace
+*/
+
+
/*! \fn template <class Key, class T> QMultiHash &QMultiHash<Key, T>::unite(const QMultiHash &other)
\since 5.13
@@ -2660,6 +2343,20 @@ uint qHash(long double key, uint seed) noexcept
\sa keys(), values()
*/
+/*! \fn template <class Key, class T> T QMultiHash<Key, T>::value(const Key &key, const T &defaultValue = T()) const
+ \overload
+
+ Returns the value associated with the \a key.
+
+ If the hash contains no item with the \a key, the function
+ returns \a defaultValue, which is a \l{default-constructed value} if the
+ parameter has not been specified.
+
+ If there are multiple
+ items for the \a key in the hash, the value of the most recently
+ inserted one is returned.
+*/
+
/*! \fn template <class Key, class T> QList<T> QMultiHash<Key, T>::values(const Key &key) const
\overload
@@ -2669,6 +2366,20 @@ uint qHash(long double key, uint seed) noexcept
\sa count(), insert()
*/
+/*! \fn template <class Key, class T> T &QMultiHash<Key, T>::operator[](const Key &key)
+
+ Returns the value associated with the \a key as a modifiable reference.
+
+ If the hash contains no item with the \a key, the function inserts
+ a \l{default-constructed value} into the hash with the \a key, and
+ returns a reference to it.
+
+ If the hash contains multiple items with the \a key, this function returns
+ a reference to the most recently inserted value.
+
+ \sa insert(), value()
+*/
+
/*! \fn template <class Key, class T> QMultiHash &QMultiHash<Key, T>::operator+=(const QMultiHash &other)
Inserts all the items in the \a other hash into this hash
@@ -2693,7 +2404,7 @@ uint qHash(long double key, uint seed) noexcept
Returns \c true if the hash contains an item with the \a key and
\a value; otherwise returns \c false.
- \sa QHash::contains()
+ \sa contains()
*/
/*!
@@ -2703,7 +2414,57 @@ uint qHash(long double key, uint seed) noexcept
Removes all the items that have the \a key and the value \a
value from the hash. Returns the number of items removed.
- \sa QHash::remove()
+ \sa remove()
+*/
+
+/*! \fn template <class Key, class T> T QMultiHash<Key, T>::take(const Key &key)
+
+ Removes the item with the \a key from the hash and returns
+ the value associated with it.
+
+ If the item does not exist in the hash, the function simply
+ returns a \l{default-constructed value}. If there are multiple
+ items for \a key in the hash, only the most recently inserted one
+ is removed.
+
+ If you don't use the return value, remove() is more efficient.
+
+ \sa remove()
+*/
+
+/*! \fn template <class Key, class T> QList<Key> QMultiHash<Key, T>::keys() const
+
+ Returns a list containing all the keys in the hash, in an
+ arbitrary order. Keys that occur multiple times in the hash
+ also occur multiple times in the list.
+
+ The order is guaranteed to be the same as that used by values().
+
+ \sa values(), key()
+*/
+
+/*! \fn template <class Key, class T> QList<T> QMultiHash<Key, T>::values() const
+
+ Returns a list containing all the values in the hash, in an
+ arbitrary order. If a key is associated with multiple values, all of
+ its values will be in the list, and not just the most recently
+ inserted one.
+
+ The order is guaranteed to be the same as that used by keys().
+
+ \sa keys(), value()
+*/
+
+/*!
+ \fn template <class Key, class T> Key QMultiHash<Key, T>::key(const T &value, const Key &defaultKey = Key()) const
+ \since 4.3
+
+ Returns the first key mapped to \a value, or \a defaultKey if the
+ hash contains no item mapped to \a value.
+
+ This function can be slow (\l{linear time}), because QMultiHash's
+ internal data structure is optimized for fast lookup by key, not
+ by value.
*/
/*!
@@ -2712,11 +2473,11 @@ uint qHash(long double key, uint seed) noexcept
Returns the number of items with the \a key and \a value.
- \sa QHash::count()
+ \sa count()
*/
/*!
- \fn template <class Key, class T> typename QHash<Key, T>::iterator QMultiHash<Key, T>::find(const Key &key, const T &value)
+ \fn template <class Key, class T> typename QMultiHash<Key, T>::iterator QMultiHash<Key, T>::find(const Key &key, const T &value)
\since 4.3
Returns an iterator pointing to the item with the \a key and \a value.
@@ -2724,18 +2485,16 @@ uint qHash(long double key, uint seed) noexcept
If the hash contains multiple items with the \a key and \a value, the
iterator returned points to the most recently inserted item.
-
- \sa QHash::find()
*/
/*!
- \fn template <class Key, class T> typename QHash<Key, T>::const_iterator QMultiHash<Key, T>::find(const Key &key, const T &value) const
+ \fn template <class Key, class T> typename QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::find(const Key &key, const T &value) const
\since 4.3
\overload
*/
/*!
- \fn template <class Key, class T> typename QHash<Key, T>::const_iterator QMultiHash<Key, T>::constFind(const Key &key, const T &value) const
+ \fn template <class Key, class T> typename QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::constFind(const Key &key, const T &value) const
\since 4.3
Returns an iterator pointing to the item with the \a key and the
@@ -2743,12 +2502,586 @@ uint qHash(long double key, uint seed) noexcept
If the hash contains no such item, the function returns
constEnd().
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::iterator QMultiHash<Key, T>::begin()
+
+ Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in
+ the hash.
+
+ \sa constBegin(), end()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::begin() const
+
+ \overload
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::cbegin() const
+ \since 5.0
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
+ in the hash.
+
+ \sa begin(), cend()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::constBegin() const
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
+ in the hash.
- \sa QHash::constFind()
+ \sa begin(), constEnd()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::key_iterator QMultiHash<Key, T>::keyBegin() const
+ \since 5.6
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first key
+ in the hash.
+
+ \sa keyEnd()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::iterator QMultiHash<Key, T>::end()
+
+ Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item
+ after the last item in the hash.
+
+ \sa begin(), constEnd()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::end() const
+
+ \overload
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::constEnd() const
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
+ item after the last item in the hash.
+
+ \sa constBegin(), end()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::cend() const
+ \since 5.0
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
+ item after the last item in the hash.
+
+ \sa cbegin(), end()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::key_iterator QMultiHash<Key, T>::keyEnd() const
+ \since 5.6
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
+ item after the last key in the hash.
+
+ \sa keyBegin()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::key_value_iterator QMultiHash<Key, T>::keyValueBegin()
+ \since 5.10
+
+ Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first entry
+ in the hash.
+
+ \sa keyValueEnd()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::key_value_iterator QMultiHash<Key, T>::keyValueEnd()
+ \since 5.10
+
+ Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
+ entry after the last entry in the hash.
+
+ \sa keyValueBegin()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_key_value_iterator QMultiHash<Key, T>::keyValueBegin() const
+ \since 5.10
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first entry
+ in the hash.
+
+ \sa keyValueEnd()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_key_value_iterator QMultiHash<Key, T>::constKeyValueBegin() const
+ \since 5.10
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first entry
+ in the hash.
+
+ \sa keyValueBegin()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_key_value_iterator QMultiHash<Key, T>::keyValueEnd() const
+ \since 5.10
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
+ entry after the last entry in the hash.
+
+ \sa keyValueBegin()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_key_value_iterator QMultiHash<Key, T>::constKeyValueEnd() const
+ \since 5.10
+
+ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
+ entry after the last entry in the hash.
+
+ \sa constKeyValueBegin()
+*/
+
+
+/*! \class QMultiHash::iterator
+ \inmodule QtCore
+ \brief The QMultiHash::iterator class provides an STL-style non-const iterator for QMultiHash.
+
+ QMultiHash features both \l{STL-style iterators} and \l{Java-style
+ iterators}. The STL-style iterators are more low-level and more
+ cumbersome to use; on the other hand, they are slightly faster
+ and, for developers who already know STL, have the advantage of
+ familiarity.
+
+ QMultiHash\<Key, T\>::iterator allows you to iterate over a QMultiHash
+ and to modify the value (but not the key) associated
+ with a particular key. If you want to iterate over a const QMultiHash,
+ you should use QMultiHash::const_iterator. It is generally good
+ practice to use QMultiHash::const_iterator on a non-const QMultiHash as
+ well, unless you need to change the QMultiHash through the iterator.
+ Const iterators are slightly faster, and can improve code
+ readability.
+
+ The default QMultiHash::iterator constructor creates an uninitialized
+ iterator. You must initialize it using a QMultiHash function like
+ QMultiHash::begin(), QMultiHash::end(), or QMultiHash::find() before you can
+ start iterating. Here's a typical loop that prints all the (key,
+ value) pairs stored in a hash:
+
+ \snippet code/src_corelib_tools_qhash.cpp 17
+
+ Unlike QMap, which orders its items by key, QMultiHash stores its
+ items in an arbitrary order.
+
+ Let's see a few examples of things we can do with a
+ QMultiHash::iterator that we cannot do with a QMultiHash::const_iterator.
+ Here's an example that increments every value stored in the QMultiHash
+ by 2:
+
+ \snippet code/src_corelib_tools_qhash.cpp 18
+
+ Here's an example that removes all the items whose key is a
+ string that starts with an underscore character:
+
+ \snippet code/src_corelib_tools_qhash.cpp 19
+
+ The call to QMultiHash::erase() removes the item pointed to by the
+ iterator from the hash, and returns an iterator to the next item.
+ Here's another way of removing an item while iterating:
+
+ \snippet code/src_corelib_tools_qhash.cpp 20
+
+ It might be tempting to write code like this:
+
+ \snippet code/src_corelib_tools_qhash.cpp 21
+
+ However, this will potentially crash in \c{++i}, because \c i is
+ a dangling iterator after the call to erase().
+
+ Multiple iterators can be used on the same hash. However, be aware
+ that any modification performed directly on the QHash (inserting and
+ removing items) can cause the iterators to become invalid.
+
+ Inserting items into the hash or calling methods such as QHash::reserve()
+ or QHash::squeeze() can invalidate all iterators pointing into the hash.
+ Iterators are guaranteed to stay valid only as long as the QHash doesn't have
+ to grow/shrink its internal hash table.
+ Using any iterator after a rehashing operation has occurred will lead to undefined behavior.
+
+ You can however safely use iterators to remove entries from the hash
+ using the QHash::erase() method. This function can safely be called while
+ iterating, and won't affect the order of items in the hash.
+
+ If you need to keep iterators over a long period of time, we recommend
+ that you use QMultiMap rather than QHash.
+
+ \warning Iterators on implicitly shared containers do not work
+ exactly like STL-iterators. You should avoid copying a container
+ while iterators are active on that container. For more information,
+ read \l{Implicit sharing iterator problem}.
+
+ \sa QMultiHash::const_iterator, QMultiHash::key_iterator, QMutableHashIterator
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::iterator::iterator()
+
+ Constructs an uninitialized iterator.
+
+ Functions like key(), value(), and operator++() must not be
+ called on an uninitialized iterator. Use operator=() to assign a
+ value to it before using it.
+
+ \sa QMultiHash::begin(), QMultiHash::end()
+*/
+
+/*! \fn template <class Key, class T> const Key &QMultiHash<Key, T>::iterator::key() const
+
+ Returns the current item's key as a const reference.
+
+ There is no direct way of changing an item's key through an
+ iterator, although it can be done by calling QMultiHash::erase()
+ followed by QMultiHash::insert().
+
+ \sa value()
+*/
+
+/*! \fn template <class Key, class T> T &QMultiHash<Key, T>::iterator::value() const
+
+ Returns a modifiable reference to the current item's value.
+
+ You can change the value of an item by using value() on
+ the left side of an assignment, for example:
+
+ \snippet code/src_corelib_tools_qhash.cpp 22
+
+ \sa key(), operator*()
+*/
+
+/*! \fn template <class Key, class T> T &QMultiHash<Key, T>::iterator::operator*() const
+
+ Returns a modifiable reference to the current item's value.
+
+ Same as value().
+
+ \sa key()
+*/
+
+/*! \fn template <class Key, class T> T *QMultiHash<Key, T>::iterator::operator->() const
+
+ Returns a pointer to the current item's value.
+
+ \sa value()
+*/
+
+/*!
+ \fn template <class Key, class T> bool QMultiHash<Key, T>::iterator::operator==(const iterator &other) const
+ \fn template <class Key, class T> bool QMultiHash<Key, T>::iterator::operator==(const const_iterator &other) const
+
+ Returns \c true if \a other points to the same item as this
+ iterator; otherwise returns \c false.
+
+ \sa operator!=()
+*/
+
+/*!
+ \fn template <class Key, class T> bool QMultiHash<Key, T>::iterator::operator!=(const iterator &other) const
+ \fn template <class Key, class T> bool QMultiHash<Key, T>::iterator::operator!=(const const_iterator &other) const
+
+ Returns \c true if \a other points to a different item than this
+ iterator; otherwise returns \c false.
+
+ \sa operator==()
+*/
+
+/*!
+ \fn template <class Key, class T> QMultiHash<Key, T>::iterator &QMultiHash<Key, T>::iterator::operator++()
+
+ The prefix ++ operator (\c{++i}) advances the iterator to the
+ next item in the hash and returns an iterator to the new current
+ item.
+
+ Calling this function on QMultiHash::end() leads to undefined results.
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::iterator QMultiHash<Key, T>::iterator::operator++(int)
+
+ \overload
+
+ The postfix ++ operator (\c{i++}) advances the iterator to the
+ next item in the hash and returns an iterator to the previously
+ current item.
+*/
+
+/*! \class QMultiHash::const_iterator
+ \inmodule QtCore
+ \brief The QMultiHash::const_iterator class provides an STL-style const iterator for QMultiHash.
+
+ QMultiHash features both \l{STL-style iterators} and \l{Java-style
+ iterators}. The STL-style iterators are more low-level and more
+ cumbersome to use; on the other hand, they are slightly faster
+ and, for developers who already know STL, have the advantage of
+ familiarity.
+
+ QMultiHash\<Key, T\>::const_iterator allows you to iterate over a
+ QMultiHash. If you want to modify the QMultiHash as you
+ iterate over it, you must use QMultiHash::iterator instead. It is
+ generally good practice to use QMultiHash::const_iterator on a
+ non-const QMultiHash as well, unless you need to change the QMultiHash
+ through the iterator. Const iterators are slightly faster, and
+ can improve code readability.
+
+ The default QMultiHash::const_iterator constructor creates an
+ uninitialized iterator. You must initialize it using a QMultiHash
+ function like QMultiHash::constBegin(), QMultiHash::constEnd(), or
+ QMultiHash::find() before you can start iterating. Here's a typical
+ loop that prints all the (key, value) pairs stored in a hash:
+
+ \snippet code/src_corelib_tools_qhash.cpp 23
+
+ Unlike QMap, which orders its items by key, QMultiHash stores its
+ items in an arbitrary order. The only guarantee is that items that
+ share the same key (because they were inserted using
+ a QMultiHash) will appear consecutively, from the most
+ recently to the least recently inserted value.
+
+ Multiple iterators can be used on the same hash. However, be aware
+ that any modification performed directly on the QHash (inserting and
+ removing items) can cause the iterators to become invalid.
+
+ Inserting items into the hash or calling methods such as QHash::reserve()
+ or QHash::squeeze() can invalidate all iterators pointing into the hash.
+ Iterators are guaranteed to stay valid only as long as the QHash doesn't have
+ to grow/shrink it's internal hash table.
+ Using any iterator after a rehashing operation ahs occurred will lead to undefined behavior.
+
+ You can however safely use iterators to remove entries from the hash
+ using the QHash::erase() method. This function can safely be called while
+ iterating, and won't affect the order of items in the hash.
+
+ If you need to keep iterators over a long period of time, we recommend
+ that you use QMap rather than QHash.
+
+ \warning Iterators on implicitly shared containers do not work
+ exactly like STL-iterators. You should avoid copying a container
+ while iterators are active on that container. For more information,
+ read \l{Implicit sharing iterator problem}.
+
+ \sa QMultiHash::iterator, QMultiHashIterator
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator::const_iterator()
+
+ Constructs an uninitialized iterator.
+
+ Functions like key(), value(), and operator++() must not be
+ called on an uninitialized iterator. Use operator=() to assign a
+ value to it before using it.
+
+ \sa QMultiHash::constBegin(), QMultiHash::constEnd()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator::const_iterator(const iterator &other)
+
+ Constructs a copy of \a other.
+*/
+
+/*! \fn template <class Key, class T> const Key &QMultiHash<Key, T>::const_iterator::key() const
+
+ Returns the current item's key.
+
+ \sa value()
+*/
+
+/*! \fn template <class Key, class T> const T &QMultiHash<Key, T>::const_iterator::value() const
+
+ Returns the current item's value.
+
+ \sa key(), operator*()
+*/
+
+/*! \fn template <class Key, class T> const T &QMultiHash<Key, T>::const_iterator::operator*() const
+
+ Returns the current item's value.
+
+ Same as value().
+
+ \sa key()
+*/
+
+/*! \fn template <class Key, class T> const T *QMultiHash<Key, T>::const_iterator::operator->() const
+
+ Returns a pointer to the current item's value.
+
+ \sa value()
+*/
+
+/*! \fn template <class Key, class T> bool QMultiHash<Key, T>::const_iterator::operator==(const const_iterator &other) const
+
+ Returns \c true if \a other points to the same item as this
+ iterator; otherwise returns \c false.
+
+ \sa operator!=()
+*/
+
+/*! \fn template <class Key, class T> bool QMultiHash<Key, T>::const_iterator::operator!=(const const_iterator &other) const
+
+ Returns \c true if \a other points to a different item than this
+ iterator; otherwise returns \c false.
+
+ \sa operator==()
+*/
+
+/*!
+ \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator &QMultiHash<Key, T>::const_iterator::operator++()
+
+ The prefix ++ operator (\c{++i}) advances the iterator to the
+ next item in the hash and returns an iterator to the new current
+ item.
+
+ Calling this function on QMultiHash::end() leads to undefined results.
+
+ \sa operator--()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::const_iterator QMultiHash<Key, T>::const_iterator::operator++(int)
+
+ \overload
+
+ The postfix ++ operator (\c{i++}) advances the iterator to the
+ next item in the hash and returns an iterator to the previously
+ current item.
+*/
+
+/*! \class QMultiHash::key_iterator
+ \inmodule QtCore
+ \since 5.6
+ \brief The QMultiHash::key_iterator class provides an STL-style const iterator for QMultiHash keys.
+
+ QMultiHash::key_iterator is essentially the same as QMultiHash::const_iterator
+ with the difference that operator*() and operator->() return a key
+ instead of a value.
+
+ For most uses QMultiHash::iterator and QMultiHash::const_iterator should be used,
+ you can easily access the key by calling QMultiHash::iterator::key():
+
+ \snippet code/src_corelib_tools_qhash.cpp 27
+
+ However, to have interoperability between QMultiHash's keys and STL-style
+ algorithms we need an iterator that dereferences to a key instead
+ of a value. With QMultiHash::key_iterator we can apply an algorithm to a
+ range of keys without having to call QMultiHash::keys(), which is inefficient
+ as it costs one QMultiHash iteration and memory allocation to create a temporary
+ QList.
+
+ \snippet code/src_corelib_tools_qhash.cpp 28
+
+ QMultiHash::key_iterator is const, it's not possible to modify the key.
+
+ The default QMultiHash::key_iterator constructor creates an uninitialized
+ iterator. You must initialize it using a QMultiHash function like
+ QMultiHash::keyBegin() or QMultiHash::keyEnd().
+
+ \warning Iterators on implicitly shared containers do not work
+ exactly like STL-iterators. You should avoid copying a container
+ while iterators are active on that container. For more information,
+ read \l{Implicit sharing iterator problem}.
+
+ \sa QMultiHash::const_iterator, QMultiHash::iterator
+*/
+
+/*! \fn template <class Key, class T> const T &QMultiHash<Key, T>::key_iterator::operator*() const
+
+ Returns the current item's key.
+*/
+
+/*! \fn template <class Key, class T> const T *QMultiHash<Key, T>::key_iterator::operator->() const
+
+ Returns a pointer to the current item's key.
+*/
+
+/*! \fn template <class Key, class T> bool QMultiHash<Key, T>::key_iterator::operator==(key_iterator other) const
+
+ Returns \c true if \a other points to the same item as this
+ iterator; otherwise returns \c false.
+
+ \sa operator!=()
+*/
+
+/*! \fn template <class Key, class T> bool QMultiHash<Key, T>::key_iterator::operator!=(key_iterator other) const
+
+ Returns \c true if \a other points to a different item than this
+ iterator; otherwise returns \c false.
+
+ \sa operator==()
+*/
+
+/*!
+ \fn template <class Key, class T> QMultiHash<Key, T>::key_iterator &QMultiHash<Key, T>::key_iterator::operator++()
+
+ The prefix ++ operator (\c{++i}) advances the iterator to the
+ next item in the hash and returns an iterator to the new current
+ item.
+
+ Calling this function on QMultiHash::keyEnd() leads to undefined results.
+
+ \sa operator--()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash<Key, T>::key_iterator QMultiHash<Key, T>::key_iterator::operator++(int)
+
+ \overload
+
+ The postfix ++ operator (\c{i++}) advances the iterator to the
+ next item in the hash and returns an iterator to the previous
+ item.
+*/
+
+/*! \fn template <class Key, class T> const_iterator QMultiHash<Key, T>::key_iterator::base() const
+ Returns the underlying const_iterator this key_iterator is based on.
+*/
+
+/*! \typedef QMultiHash::const_key_value_iterator
+ \inmodule QtCore
+ \since 5.10
+ \brief The QMap::const_key_value_iterator typedef provides an STL-style const iterator for QMultiHash and QMultiHash.
+
+ QMultiHash::const_key_value_iterator is essentially the same as QMultiHash::const_iterator
+ with the difference that operator*() returns a key/value pair instead of a
+ value.
+
+ \sa QKeyValueIterator
+*/
+
+/*! \typedef QMultiHash::key_value_iterator
+ \inmodule QtCore
+ \since 5.10
+ \brief The QMap::key_value_iterator typedef provides an STL-style iterator for QMultiHash and QMultiHash.
+
+ QMultiHash::key_value_iterator is essentially the same as QMultiHash::iterator
+ with the difference that operator*() returns a key/value pair instead of a
+ value.
+
+ \sa QKeyValueIterator
+*/
+
+/*! \fn template <class Key, class T> QDataStream &operator<<(QDataStream &out, const QMultiHash<Key, T>& hash)
+ \relates QMultiHash
+
+ Writes the hash \a hash to stream \a out.
+
+ This function requires the key and value types to implement \c
+ operator<<().
+
+ \sa {Serializing Qt Data Types}
+*/
+
+/*! \fn template <class Key, class T> QDataStream &operator>>(QDataStream &in, QMultiHash<Key, T> &hash)
+ \relates QMultiHash
+
+ Reads a hash from stream \a in into \a hash.
+
+ This function requires the key and value types to implement \c
+ operator>>().
+
+ \sa {Serializing Qt Data Types}
*/
/*!
- \fn template <class Key, class T> uint qHash(const QHash<Key, T> &key, uint seed = 0)
+ \fn template <class Key, class T> size_t qHash(const QHash<Key, T> &key, size_t seed = 0)
\since 5.8
\relates QHash
@@ -2758,7 +3091,7 @@ uint qHash(long double key, uint seed) noexcept
*/
/*!
- \fn template <class Key, class T> uint qHash(const QMultiHash<Key, T> &key, uint seed = 0)
+ \fn template <class Key, class T> size_t qHash(const QMultiHash<Key, T> &key, size_t seed = 0)
\since 5.8
\relates QMultiHash
diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h
index 5078019602..2c39a9dfc8 100644
--- a/src/corelib/tools/qhash.h
+++ b/src/corelib/tools/qhash.h
@@ -1,7 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -41,218 +40,724 @@
#ifndef QHASH_H
#define QHASH_H
-#include <QtCore/qchar.h>
#include <QtCore/qiterator.h>
-#include <QtCore/qlist.h>
+#include <QtCore/qvector.h>
#include <QtCore/qrefcount.h>
#include <QtCore/qhashfunctions.h>
#include <QtCore/qcontainertools_impl.h>
+#include <QtCore/qmath.h>
-#include <algorithm>
#include <initializer_list>
-#if defined(Q_CC_MSVC)
-#pragma warning( push )
-#pragma warning( disable : 4311 ) // disable pointer truncation warning
-#pragma warning( disable : 4127 ) // conditional expression is constant
-#endif
-
QT_BEGIN_NAMESPACE
-struct Q_CORE_EXPORT QHashData
+struct QHashDummyValue
{
- struct Node {
- Node *next;
- uint h;
- };
+ bool operator==(const QHashDummyValue &) const noexcept { return true; }
+};
- Node *fakeNext;
- Node **buckets;
- QtPrivate::RefCount ref;
- int size;
- int nodeSize;
- short userNumBits;
- short numBits;
- int numBuckets;
- uint seed;
- uint sharable : 1;
- uint strictAlignment : 1;
- uint reserved : 30;
-
- void *allocateNode(int nodeAlign);
- void freeNode(void *node);
- QHashData *detach_helper(void (*node_duplicate)(Node *, void *), void (*node_delete)(Node *),
- int nodeSize, int nodeAlign);
- bool willGrow();
- void hasShrunk();
- void rehash(int hint);
- void free_helper(void (*node_delete)(Node *));
- Node *firstNode();
-#ifdef QT_QHASH_DEBUG
- void dump();
- void checkSanity();
-#endif
- static Node *nextNode(Node *node);
- static Node *previousNode(Node *node);
+namespace QHashPrivate {
- static const QHashData shared_null;
-};
+// QHash uses a power of two growth policy.
+namespace GrowthPolicy
+{
+inline constexpr size_t maxNumBuckets() noexcept
+{
+ return size_t(1) << (8*sizeof(size_t) - 1);
+}
+inline constexpr size_t bucketsForCapacity(size_t requestedCapacity) noexcept
+{
+ if (requestedCapacity <= 8)
+ return 16;
+ if (requestedCapacity >= maxNumBuckets())
+ return maxNumBuckets();
+ return qNextPowerOfTwo(QIntegerForSize<sizeof(size_t)>::Unsigned(2*requestedCapacity - 1));
+}
+inline constexpr size_t bucketForHash(size_t nBuckets, size_t hash) noexcept
+{
+ return hash & (nBuckets - 1);
+}
+}
-inline bool QHashData::willGrow()
+template <typename Key, typename T>
+struct Node
{
- if (size >= numBuckets) {
- rehash(numBits + 1);
- return true;
- } else {
- return false;
+ using KeyType = Key;
+ using ValueType = T;
+
+ Key key;
+ T value;
+ template<typename ...Args>
+ static void createInPlace(Node *n, Key &&k, Args &&... args)
+ { new (n) Node{ std::move(k), T(std::forward<Args>(args)...) }; }
+ template<typename ...Args>
+ static void createInPlace(Node *n, const Key &k, Args &&... args)
+ { new (n) Node{ Key(k), T(std::forward<Args>(args)...) }; }
+ template<typename ...Args>
+ void emplaceValue(Args &&... args)
+ {
+ value = T(std::forward<Args>(args)...);
}
-}
+ T &&takeValue() noexcept(std::is_nothrow_move_assignable_v<T>)
+ {
+ return std::move(value);
+ }
+ bool valuesEqual(const Node *other) const { return value == other->value; }
+};
-inline void QHashData::hasShrunk()
+template <typename Key>
+struct Node<Key, QHashDummyValue> {
+ using KeyType = Key;
+ using ValueType = QHashDummyValue;
+
+ Key key;
+ template<typename ...Args>
+ static void createInPlace(Node *n, Key &&k, Args &&...)
+ { new (n) Node{ std::move(k) }; }
+ template<typename ...Args>
+ static void createInPlace(Node *n, const Key &k, Args &&...)
+ { new (n) Node{ k }; }
+ template<typename ...Args>
+ void emplaceValue(Args &&...)
+ {
+ }
+ ValueType takeValue() { return QHashDummyValue(); }
+ bool valuesEqual(const Node *) const { return true; }
+};
+
+template <typename T>
+struct MultiNodeChain
{
- if (size <= (numBuckets >> 3) && numBits > userNumBits) {
- QT_TRY {
- rehash(qMax(int(numBits) - 2, int(userNumBits)));
- } QT_CATCH(const std::bad_alloc &) {
- // ignore bad allocs - shrinking shouldn't throw. rehash is exception safe.
+ T value;
+ MultiNodeChain *next = nullptr;
+ ~MultiNodeChain()
+ {
+ }
+ qsizetype free() noexcept(std::is_nothrow_destructible_v<T>)
+ {
+ qsizetype nEntries = 0;
+ MultiNodeChain *e = this;
+ while (e) {
+ MultiNodeChain *n = e->next;
+ ++nEntries;
+ delete e;
+ e = n;
}
+ return nEntries;
}
-}
+ bool contains(const T &val) const noexcept
+ {
+ const MultiNodeChain *e = this;
+ while (e) {
+ if (e->value == val)
+ return true;
+ e = e->next;
+ }
+ return false;
+ }
+};
-inline QHashData::Node *QHashData::firstNode()
+template <typename Key, typename T>
+struct MultiNode
{
- Node *e = reinterpret_cast<Node *>(this);
- Node **bucket = buckets;
- int n = numBuckets;
- while (n--) {
- if (*bucket != e)
- return *bucket;
- ++bucket;
+ using KeyType = Key;
+ using ValueType = T;
+ using Chain = MultiNodeChain<T>;
+
+ Key key;
+ Chain *value;
+
+ template<typename ...Args>
+ static void createInPlace(MultiNode *n, Key &&k, Args &&... args)
+ { new (n) MultiNode(std::move(k), new Chain{ T(std::forward<Args>(args)...), nullptr }); }
+ template<typename ...Args>
+ static void createInPlace(MultiNode *n, const Key &k, Args &&... args)
+ { new (n) MultiNode(k, new Chain{ T(std::forward<Args>(args)...), nullptr }); }
+
+ MultiNode(const Key &k, Chain *c)
+ : key(k),
+ value(c)
+ {}
+ MultiNode(Key &&k, Chain *c) noexcept(std::is_nothrow_move_assignable_v<Key>)
+ : key(std::move(k)),
+ value(c)
+ {}
+
+ MultiNode(MultiNode &&other)
+ : key(other.key),
+ value(other.value)
+ {
+ other.value = nullptr;
}
- return e;
-}
-struct QHashDummyValue
-{
+ MultiNode(const MultiNode &other)
+ : key(other.key)
+ {
+ Chain *c = other.value;
+ Chain **e = &value;
+ while (c) {
+ Chain *chain = new Chain{ c->value, nullptr };
+ *e = chain;
+ e = &chain->next;
+ c = c->next;
+ }
+ }
+ ~MultiNode()
+ {
+ if (value)
+ value->free();
+ }
+ static qsizetype freeChain(MultiNode *n) noexcept(std::is_nothrow_destructible_v<T>)
+ {
+ qsizetype size = n->value->free();
+ n->value = nullptr;
+ return size;
+ }
+ template<typename ...Args>
+ void insertMulti(Args &&... args)
+ {
+ Chain *e = new Chain{ T(std::forward<Args>(args)...), nullptr };
+ e->next = value;
+ value = e;
+ }
+ template<typename ...Args>
+ void emplaceValue(Args &&... args)
+ {
+ value->value = T(std::forward<Args>(args)...);
+ }
+
+ // compiler generated move operators are fine
};
-constexpr bool operator==(const QHashDummyValue &, const QHashDummyValue &) noexcept
+template<typename Node>
+constexpr bool isRelocatable()
{
- return true;
+ return QTypeInfo<typename Node::KeyType>::isRelocatable && QTypeInfo<typename Node::ValueType>::isRelocatable;
}
-Q_DECLARE_TYPEINFO(QHashDummyValue, Q_MOVABLE_TYPE | Q_DUMMY_TYPE);
+// Regular hash tables consist of a list of buckets that can store Nodes. But simply allocating one large array of buckets
+// would waste a lot of memory. To avoid this, we split the vector of buckets up into a vector of Spans. Each Span represents
+// NEntries buckets. To quickly find the correct Span that holds a bucket, NEntries must be a power of two.
+//
+// Inside each Span, there is an offset array that represents the actual buckets. offsets contains either an index into the
+// actual storage space for the Nodes (the 'entries' member) or 0xff (UnusedEntry) to flag that the bucket is empty.
+// As we have only 128 entries per Span, the offset array can be represented using an unsigned char. This trick makes the hash
+// table have a very small memory overhead compared to many other implementations.
+template<typename Node>
+struct Span {
+ enum {
+ NEntries = 128,
+ LocalBucketMask = (NEntries - 1),
+ UnusedEntry = 0xff
+ };
+ static_assert ((NEntries & LocalBucketMask) == 0, "EntriesPerSpan must be a power of two.");
+
+ // Entry is a slot available for storing a Node. The Span holds a pointer to
+ // an array of Entries. Upon construction of the array, those entries are
+ // unused, and nextFree() is being used to set up a singly linked list
+ // of free entries.
+ // When a node gets inserted, the first free entry is being picked, removed
+ // from the singly linked list and the Node gets constructed in place.
+ struct Entry {
+ typename std::aligned_storage<sizeof(Node), alignof(Node)>::type storage;
+
+ unsigned char &nextFree() { return *reinterpret_cast<unsigned char *>(&storage); }
+ Node &node() { return *reinterpret_cast<Node *>(&storage); }
+ };
-template <class Key, class T>
-struct QHashNode
-{
- QHashNode *next;
- const uint h;
- const Key key;
- T value;
+ unsigned char offsets[NEntries];
+ Entry *entries = nullptr;
+ unsigned char allocated = 0;
+ unsigned char nextFree = 0;
+ Span() noexcept
+ {
+ memset(offsets, UnusedEntry, sizeof(offsets));
+ }
+ ~Span()
+ {
+ freeData();
+ }
+ void freeData() noexcept(std::is_nothrow_destructible<Node>::value)
+ {
+ if (entries) {
+ if constexpr (!std::is_trivially_destructible<Node>::value) {
+ for (auto o : offsets) {
+ if (o != UnusedEntry)
+ entries[o].node().~Node();
+ }
+ }
+ delete [] entries;
+ entries = nullptr;
+ }
+ }
+ Node *insert(size_t i)
+ {
+ Q_ASSERT(i <= NEntries);
+ Q_ASSERT(offsets[i] == UnusedEntry);
+ if (nextFree == allocated)
+ addStorage();
+ unsigned char entry = nextFree;
+ Q_ASSERT(entry < allocated);
+ nextFree = entries[entry].nextFree();
+ offsets[i] = entry;
+ return &entries[entry].node();
+ }
+ void erase(size_t bucket) noexcept(std::is_nothrow_destructible<Node>::value)
+ {
+ Q_ASSERT(bucket <= NEntries);
+ Q_ASSERT(offsets[bucket] != UnusedEntry);
- inline QHashNode(const Key &key0, const T &value0, uint hash, QHashNode *n)
- : next(n), h(hash), key(key0), value(value0) {}
- inline bool same_key(uint h0, const Key &key0) const { return h0 == h && key0 == key; }
+ unsigned char entry = offsets[bucket];
+ offsets[bucket] = UnusedEntry;
-private:
- Q_DISABLE_COPY(QHashNode)
+ entries[entry].node().~Node();
+ entries[entry].nextFree() = nextFree;
+ nextFree = entry;
+ }
+ size_t offset(size_t i) const noexcept
+ {
+ return offsets[i];
+ }
+ bool hasNode(size_t i) const noexcept
+ {
+ return (offsets[i] != UnusedEntry);
+ }
+ Node &at(size_t i) noexcept
+ {
+ Q_ASSERT(i <= NEntries);
+ Q_ASSERT(offsets[i] != UnusedEntry);
+
+ return entries[offsets[i]].node();
+ }
+ const Node &at(size_t i) const noexcept
+ {
+ Q_ASSERT(i <= NEntries);
+ Q_ASSERT(offsets[i] != UnusedEntry);
+
+ return entries[offsets[i]].node();
+ }
+ Node &atOffset(size_t o) noexcept
+ {
+ Q_ASSERT(o < allocated);
+
+ return entries[o].node();
+ }
+ const Node &atOffset(size_t o) const noexcept
+ {
+ Q_ASSERT(o < allocated);
+
+ return entries[o].node();
+ }
+ void moveLocal(size_t from, size_t to) noexcept
+ {
+ Q_ASSERT(offsets[from] != UnusedEntry);
+ Q_ASSERT(offsets[to] == UnusedEntry);
+ offsets[to] = offsets[from];
+ offsets[from] = UnusedEntry;
+ }
+ void moveFromSpan(Span &fromSpan, size_t fromIndex, size_t to) noexcept(std::is_nothrow_move_constructible_v<Node>)
+ {
+ Q_ASSERT(to <= NEntries);
+ Q_ASSERT(offsets[to] == UnusedEntry);
+ Q_ASSERT(fromIndex <= NEntries);
+ Q_ASSERT(fromSpan.offsets[fromIndex] != UnusedEntry);
+ if (nextFree == allocated)
+ addStorage();
+ Q_ASSERT(nextFree < allocated);
+ offsets[to] = nextFree;
+ Entry &toEntry = entries[nextFree];
+ nextFree = toEntry.nextFree();
+
+ size_t fromOffset = fromSpan.offsets[fromIndex];
+ fromSpan.offsets[fromIndex] = UnusedEntry;
+ Entry &fromEntry = fromSpan.entries[fromOffset];
+
+ if constexpr (isRelocatable<Node>()) {
+ memcpy(&toEntry, &fromEntry, sizeof(Entry));
+ } else {
+ new (&toEntry.node()) Node(std::move(fromEntry.node()));
+ fromEntry.node().~Node();
+ }
+ fromEntry.nextFree() = fromSpan.nextFree;
+ fromSpan.nextFree = static_cast<unsigned char>(fromOffset);
+ }
+
+ void addStorage()
+ {
+ Q_ASSERT(allocated < NEntries);
+ Q_ASSERT(nextFree == allocated);
+ // the hash table should always be between 25 and 50% full
+ // this implies that we on average have between 32 and 64 entries
+ // in here. The likelihood of having below 16 entries is very small,
+ // so start with that and increment by 16 each time we need to add
+ // some more space
+ const size_t increment = NEntries/8;
+ size_t alloc = allocated + increment;
+ Entry *newEntries = new Entry[alloc];
+ // we only add storage if the previous storage was fully filled, so
+ // simply copy the old data over
+ if constexpr (isRelocatable<Node>()) {
+ memcpy(newEntries, entries, allocated*sizeof(Entry));
+ } else {
+ for (size_t i = 0; i < allocated; ++i) {
+ new (&newEntries[i].node()) Node(std::move(entries[i].node()));
+ entries[i].node().~Node();
+ }
+ }
+ for (size_t i = allocated; i < allocated + increment; ++i) {
+ newEntries[i].nextFree() = uchar(i + 1);
+ }
+ delete [] entries;
+ entries = newEntries;
+ allocated = uchar(alloc);
+ }
};
-// Specialize for QHashDummyValue in order to save some memory
-template <class Key>
-struct QHashNode<Key, QHashDummyValue>
+template <typename Node>
+struct iterator;
+
+template <typename Node>
+struct Data
{
- union {
- QHashNode *next;
- QHashDummyValue value;
+ using Key = typename Node::KeyType;
+ using T = typename Node::ValueType;
+ using Span = QHashPrivate::Span<Node>;
+ using iterator = QHashPrivate::iterator<Node>;
+
+ QtPrivate::RefCount ref = {{1}};
+ size_t size = 0;
+ size_t numBuckets = 0;
+ size_t seed = 0;
+
+
+ Span *spans = nullptr;
+
+ Data(size_t reserve = 0)
+ {
+ numBuckets = GrowthPolicy::bucketsForCapacity(reserve);
+ size_t nSpans = (numBuckets + Span::LocalBucketMask) / Span::NEntries;
+ spans = new Span[nSpans];
+ seed = qGlobalQHashSeed();
+ }
+ Data(const Data &other, size_t reserved = 0)
+ : size(other.size),
+ numBuckets(other.numBuckets),
+ seed(other.seed)
+ {
+ if (reserved)
+ numBuckets = GrowthPolicy::bucketsForCapacity(qMax(size, reserved));
+ bool resized = numBuckets != other.numBuckets;
+ size_t nSpans = (numBuckets + Span::LocalBucketMask) / Span::NEntries;
+ spans = new Span[nSpans];
+
+ for (size_t s = 0; s < nSpans; ++s) {
+ const Span &span = other.spans[s];
+ for (size_t index = 0; index < Span::NEntries; ++index) {
+ if (!span.hasNode(index))
+ continue;
+ const Node &n = span.at(index);
+ iterator it = resized ? find(n.key) : iterator{ this, s*Span::NEntries + index };
+ Q_ASSERT(it.isUnused());
+ Node *newNode = spans[it.span()].insert(it.index());
+ new (newNode) Node(n);
+ }
+ }
+ }
+
+ static Data *detached(Data *d, size_t size = 0)
+ {
+ if (!d)
+ return new Data(size);
+ Data *dd = new Data(*d, size);
+ if (!d->ref.deref())
+ delete d;
+ return dd;
+ }
+
+
+ void clear()
+ {
+ delete [] spans;
+ spans = nullptr;
+ size = 0;
+ numBuckets = 0;
+ }
+
+ iterator detachedIterator(iterator other) const noexcept
+ {
+ return iterator{this, other.bucket};
+ }
+
+ iterator begin() const noexcept
+ {
+ iterator it{ this, 0 };
+ if (it.isUnused())
+ ++it;
+ return it;
+ }
+
+ constexpr iterator end() const noexcept
+ {
+ return iterator();
+ }
+
+ void rehash(size_t sizeHint = 0)
+ {
+ if (sizeHint == 0)
+ sizeHint = size;
+ size_t newBucketCount = GrowthPolicy::bucketsForCapacity(sizeHint);
+
+ Span *oldSpans = spans;
+ size_t oldBucketCount = numBuckets;
+ size_t nSpans = (newBucketCount + Span::LocalBucketMask) / Span::NEntries;
+ spans = new Span[nSpans];
+ numBuckets = newBucketCount;
+ size_t oldNSpans = (oldBucketCount + Span::LocalBucketMask) / Span::NEntries;
+
+ for (size_t s = 0; s < oldNSpans; ++s) {
+ Span &span = oldSpans[s];
+ for (size_t index = 0; index < Span::NEntries; ++index) {
+ if (!span.hasNode(index))
+ continue;
+ Node &n = span.at(index);
+ iterator it = find(n.key);
+ Q_ASSERT(it.isUnused());
+ Node *newNode = spans[it.span()].insert(it.index());
+ new (newNode) Node(std::move(n));
+ }
+ span.freeData();
+ }
+ delete [] oldSpans;
+ }
+
+ size_t nextBucket(size_t bucket) const noexcept
+ {
+ ++bucket;
+ if (bucket == numBuckets)
+ bucket = 0;
+ return bucket;
+ }
+
+ float loadFactor() const noexcept
+ {
+ return float(size)/numBuckets;
+ }
+ bool shouldGrow() const noexcept
+ {
+ return size >= (numBuckets >> 1);
+ }
+
+ iterator find(const Key &key) const noexcept
+ {
+ Q_ASSERT(numBuckets > 0);
+ size_t hash = qHash(key, seed);
+ size_t bucket = GrowthPolicy::bucketForHash(numBuckets, hash);
+ // loop over the buckets until we find the entry we search for
+ // or an empty slot, in which case we know the entry doesn't exist
+ while (true) {
+ // Split the bucket into the indexex of span array, and the local
+ // offset inside the span
+ size_t span = bucket / Span::NEntries;
+ size_t index = bucket & Span::LocalBucketMask;
+ Span &s = spans[span];
+ size_t offset = s.offset(index);
+ if (offset == Span::UnusedEntry) {
+ return iterator{ this, bucket };
+ } else {
+ Node &n = s.atOffset(offset);
+ if (n.key == key)
+ return iterator{ this, bucket };
+ }
+ bucket = nextBucket(bucket);
+ }
+ }
+
+ Node *findNode(const Key &key) const noexcept
+ {
+ if (!size)
+ return nullptr;
+ iterator it = find(key);
+ if (it.isUnused())
+ return nullptr;
+ return it.node();
+ }
+
+ struct InsertionResult {
+ iterator it;
+ bool initialized;
};
- const uint h;
- const Key key;
- inline QHashNode(const Key &key0, const QHashDummyValue &, uint hash, QHashNode *n)
- : next(n), h(hash), key(key0) {}
- inline bool same_key(uint h0, const Key &key0) const { return h0 == h && key0 == key; }
+ InsertionResult findOrInsert(const Key &key) noexcept
+ {
+ if (shouldGrow())
+ rehash(size + 1);
+ iterator it = find(key);
+ if (it.isUnused()) {
+ spans[it.span()].insert(it.index());
+ ++size;
+ return { it, false };
+ }
+ return { it, true };
+ }
-private:
- Q_DISABLE_COPY(QHashNode)
+ iterator erase(iterator it) noexcept(std::is_nothrow_destructible<Node>::value)
+ {
+ size_t bucket = it.bucket;
+ size_t span = bucket / Span::NEntries;
+ size_t index = bucket & Span::LocalBucketMask;
+ Q_ASSERT(spans[span].hasNode(index));
+ spans[span].erase(index);
+ --size;
+
+ // re-insert the following entries to avoid holes
+ size_t hole = bucket;
+ size_t next = bucket;
+ while (true) {
+ next = nextBucket(next);
+ size_t nextSpan = next / Span::NEntries;
+ size_t nextIndex = next & Span::LocalBucketMask;
+ if (!spans[nextSpan].hasNode(nextIndex))
+ break;
+ size_t hash = qHash(spans[nextSpan].at(nextIndex).key, seed);
+ size_t newBucket = GrowthPolicy::bucketForHash(numBuckets, hash);
+ while (true) {
+ if (newBucket == next) {
+ // nothing to do, item is at the right plae
+ break;
+ } else if (newBucket == hole) {
+ // move into hole
+ size_t holeSpan = hole / Span::NEntries;
+ size_t holeIndex = hole & Span::LocalBucketMask;
+ if (nextSpan == holeSpan) {
+ spans[holeSpan].moveLocal(nextIndex, holeIndex);
+ } else {
+ // move between spans, more expensive
+ spans[holeSpan].moveFromSpan(spans[nextSpan], nextIndex, holeIndex);
+ }
+ hole = next;
+ break;
+ }
+ newBucket = nextBucket(newBucket);
+ }
+ }
+
+ // return correct position of the next element
+ if (!spans[span].hasNode(index))
+ ++it;
+ return it;
+ }
+
+ ~Data()
+ {
+ delete [] spans;
+ }
};
+template <typename Node>
+struct iterator {
+ using Span = QHashPrivate::Span<Node>;
-#if 0
-// ###
-// The introduction of the QHash random seed breaks this optimization, as it
-// relies on qHash(int i) = i. If the hash value is salted, then the hash
-// table becomes corrupted.
-//
-// A bit more research about whether it makes sense or not to salt integer
-// keys (and in general keys whose hash value is easy to invert)
-// is needed, or about how keep this optimization and the seed (f.i. by
-// specializing QHash for integer values, and re-apply the seed during lookup).
-//
-// Be aware that such changes can easily be binary incompatible, and therefore
-// cannot be made during the Qt 5 lifetime.
-#define Q_HASH_DECLARE_INT_NODES(key_type) \
- template <class T> \
- struct QHashDummyNode<key_type, T> { \
- QHashDummyNode *next; \
- union { uint h; key_type key; }; \
-\
- inline QHashDummyNode(key_type /* key0 */) {} \
- }; \
-\
- template <class T> \
- struct QHashNode<key_type, T> { \
- QHashNode *next; \
- union { uint h; key_type key; }; \
- T value; \
-\
- inline QHashNode(key_type /* key0 */) {} \
- inline QHashNode(key_type /* key0 */, const T &value0) : value(value0) {} \
- inline bool same_key(uint h0, key_type) const { return h0 == h; } \
- }
-
-#if defined(Q_BYTE_ORDER) && Q_BYTE_ORDER == Q_LITTLE_ENDIAN
-Q_HASH_DECLARE_INT_NODES(short);
-Q_HASH_DECLARE_INT_NODES(ushort);
-#endif
-Q_HASH_DECLARE_INT_NODES(int);
-Q_HASH_DECLARE_INT_NODES(uint);
-#undef Q_HASH_DECLARE_INT_NODES
-#endif // #if 0
+ const Data<Node> *d = nullptr;
+ size_t bucket = 0;
-template <class Key, class T>
-class QHash
-{
- typedef QHashNode<Key, T> Node;
+ size_t span() const noexcept { return bucket / Span::NEntries; }
+ size_t index() const noexcept { return bucket & Span::LocalBucketMask; }
+ inline bool isUnused() const noexcept { return !d->spans[span()].hasNode(index()); }
- union {
- QHashData *d;
- QHashNode<Key, T> *e;
- };
+ inline Node *node() const noexcept
+ {
+ Q_ASSERT(!isUnused());
+ return &d->spans[span()].at(index());
+ }
+ bool atEnd() const noexcept { return !d; }
- static inline Node *concrete(QHashData::Node *node) {
- return reinterpret_cast<Node *>(node);
+ iterator operator++() noexcept
+ {
+ while (true) {
+ ++bucket;
+ if (bucket == d->numBuckets) {
+ d = nullptr;
+ bucket = 0;
+ break;
+ }
+ if (!isUnused())
+ break;
+ }
+ return *this;
}
+ bool operator==(iterator other) const noexcept
+ { return d == other.d && bucket == other.bucket; }
+ bool operator!=(iterator other) const noexcept
+ { return !(*this == other); }
+};
+
+
+
+} // namespace QHashPrivate
- static inline int alignOfNode() { return qMax<int>(sizeof(void*), Q_ALIGNOF(Node)); }
+template <class Key, class T>
+class QHash
+{
+ using Node = QHashPrivate::Node<Key, T>;
+ using Data = QHashPrivate::Data<Node>;
+ friend class QSet<Key>;
+
+ Data *d = nullptr;
public:
- inline QHash() noexcept : d(const_cast<QHashData *>(&QHashData::shared_null)) { }
+ using key_type = Key;
+ using mapped_type = T;
+ using value_type = T;
+ using size_type = qsizetype;
+ using difference_type = qsizetype;
+ using reference = T &;
+ using const_reference = const T &;
+
+ inline QHash() noexcept = default;
inline QHash(std::initializer_list<std::pair<Key,T> > list)
- : d(const_cast<QHashData *>(&QHashData::shared_null))
+ : d(new Data(list.size()))
{
- reserve(int(list.size()));
for (typename std::initializer_list<std::pair<Key,T> >::const_iterator it = list.begin(); it != list.end(); ++it)
insert(it->first, it->second);
}
- QHash(const QHash &other) : d(other.d) { d->ref.ref(); if (!d->sharable) detach(); }
- ~QHash() { if (!d->ref.deref()) freeData(d); }
+ QHash(const QHash &other) noexcept
+ : d(other.d)
+ {
+ if (d)
+ d->ref.ref();
+ }
+ ~QHash()
+ {
+ if (d && !d->ref.deref())
+ delete d;
+ }
+
+ QHash &operator=(const QHash &other) noexcept(std::is_nothrow_destructible<Node>::value)
+ {
+ if (d != other.d) {
+ Data *o = other.d;
+ if (o)
+ o->ref.ref();
+ if (d && !d->ref.deref())
+ delete d;
+ d = o;
+ }
+ return *this;
+ }
- QHash &operator=(const QHash &other);
- QHash(QHash &&other) noexcept : d(other.d) { other.d = const_cast<QHashData *>(&QHashData::shared_null); }
- QHash &operator=(QHash &&other) noexcept
- { QHash moved(std::move(other)); swap(moved); return *this; }
+ QHash(QHash &&other) noexcept
+ : d(std::exchange(other.d, nullptr))
+ {
+ }
+ QHash &operator=(QHash &&other) noexcept(std::is_nothrow_destructible<Node>::value)
+ {
+ if (d != other.d) {
+ if (d && !d->ref.deref())
+ delete d;
+ d = std::exchange(other.d, nullptr);
+ }
+ return *this;
+ }
#ifdef Q_QDOC
template <typename InputIterator>
QHash(InputIterator f, InputIterator l);
@@ -277,189 +782,222 @@ public:
#endif
void swap(QHash &other) noexcept { qSwap(d, other.d); }
- bool operator==(const QHash &other) const;
- bool operator!=(const QHash &other) const { return !(*this == other); }
+ bool operator==(const QHash &other) const noexcept
+ {
+ if (d == other.d)
+ return true;
+ if (size() != other.size())
+ return false;
+
+ for (const_iterator it = other.begin(); it != other.end(); ++it) {
+ const_iterator i = find(it.key());
+ if (i == end() || !i.i.node()->valuesEqual(it.i.node()))
+ return false;
+ }
+ // all values must be the same as size is the same
+ return true;
+ }
+ bool operator!=(const QHash &other) const noexcept { return !(*this == other); }
- inline int size() const { return d->size; }
+ inline qsizetype size() const noexcept { return d ? qsizetype(d->size) : 0; }
+ inline bool isEmpty() const noexcept { return !d || d->size == 0; }
- inline bool isEmpty() const { return d->size == 0; }
+ inline qsizetype capacity() const noexcept { return d ? qsizetype(d->numBuckets >> 1) : 0; }
+ void reserve(qsizetype size)
+ {
+ if (isDetached())
+ d->rehash(size);
+ else
+ d = Data::detached(d, size_t(size));
+ }
+ inline void squeeze() { reserve(0); }
- inline int capacity() const { return d->numBuckets; }
- void reserve(int size);
- inline void squeeze() { reserve(1); }
+ inline void detach() { if (!d || d->ref.isShared()) d = Data::detached(d); }
+ inline bool isDetached() const noexcept { return d && !d->ref.isShared(); }
+ bool isSharedWith(const QHash &other) const noexcept { return d == other.d; }
- inline void detach() { if (d->ref.isShared()) detach_helper(); }
- inline bool isDetached() const { return !d->ref.isShared(); }
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- inline void setSharable(bool sharable) { if (!sharable) detach(); if (d != &QHashData::shared_null) d->sharable = sharable; }
-#endif
- bool isSharedWith(const QHash &other) const { return d == other.d; }
-
- void clear();
-
- int remove(const Key &key);
- T take(const Key &key);
-
- bool contains(const Key &key) const;
- const Key key(const T &value) const;
- const Key key(const T &value, const Key &defaultKey) const;
- const T value(const Key &key) const;
- const T value(const Key &key, const T &defaultValue) const;
- T &operator[](const Key &key);
- const T operator[](const Key &key) const;
-
- QList<Key> keys() const;
- QList<Key> keys(const T &value) const;
- QList<T> values() const;
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_VERSION_X_5_15("Use QMultiHash for hashes storing multiple values with the same key.") QList<Key> uniqueKeys() const;
- QT_DEPRECATED_VERSION_X_5_15("Use QMultiHash for hashes storing multiple values with the same key.") QList<T> values(const Key &key) const;
-#endif
- int count(const Key &key) const;
+ void clear() noexcept(std::is_nothrow_destructible<Node>::value)
+ {
+ if (d && !d->ref.deref())
+ delete d;
+ d = nullptr;
+ }
+
+ bool remove(const Key &key)
+ {
+ if (isEmpty()) // prevents detaching shared null
+ return false;
+ detach();
+
+ auto it = d->find(key);
+ if (it.isUnused())
+ return false;
+ d->erase(it);
+ return true;
+ }
+ T take(const Key &key)
+ {
+ if (isEmpty()) // prevents detaching shared null
+ return T();
+ detach();
+
+ auto it = d->find(key);
+ if (it.isUnused())
+ return T();
+ T value = it.node()->takeValue();
+ d->erase(it);
+ return value;
+ }
+
+ bool contains(const Key &key) const noexcept
+ {
+ if (!d)
+ return false;
+ return d->findNode(key) != nullptr;
+ }
+ qsizetype count(const Key &key) const noexcept
+ {
+ return contains(key) ? 1 : 0;
+ }
+
+ Key key(const T &value, const Key &defaultKey = Key()) const noexcept
+ {
+ if (d) {
+ const_iterator i = begin();
+ while (i != end()) {
+ if (i.value() == value)
+ return i.key();
+ ++i;
+ }
+ }
+
+ return defaultKey;
+ }
+ T value(const Key &key, const T &defaultValue = T()) const noexcept
+ {
+ if (d) {
+ Node *n = d->findNode(key);
+ if (n)
+ return n->value;
+ }
+ return defaultValue;
+ }
+ T &operator[](const Key &key)
+ {
+ detach();
+ auto result = d->findOrInsert(key);
+ Q_ASSERT(!result.it.atEnd());
+ if (!result.initialized)
+ Node::createInPlace(result.it.node(), key, T());
+ return result.it.node()->value;
+ }
+
+ const T operator[](const Key &key) const noexcept
+ {
+ return value(key);
+ }
+
+ QVector<Key> keys() const
+ {
+ return QVector<Key>(keyBegin(), keyEnd());
+ }
+ QVector<Key> keys(const T &value) const
+ {
+ QVector<Key> res;
+ const_iterator i = begin();
+ while (i != end()) {
+ if (i.value() == value)
+ res.append(i.key());
+ ++i;
+ }
+ return res;
+ }
+ QVector<T> values() const
+ {
+ return QVector<T>(begin(), end());
+ }
class const_iterator;
class iterator
{
+ using piter = typename QHashPrivate::iterator<Node>;
friend class const_iterator;
friend class QHash<Key, T>;
friend class QSet<Key>;
- QHashData::Node *i;
+ piter i;
+ explicit inline iterator(piter it) noexcept : i(it) { }
public:
-#if QT_DEPRECATED_WARNINGS_SINCE < QT_VERSION_CHECK(5, 15, 0)
- typedef std::bidirectional_iterator_tag iterator_category;
-#else
typedef std::forward_iterator_tag iterator_category;
-#endif
typedef qptrdiff difference_type;
typedef T value_type;
typedef T *pointer;
typedef T &reference;
- inline iterator() : i(nullptr) { }
- explicit inline iterator(void *node) : i(reinterpret_cast<QHashData::Node *>(node)) { }
+ constexpr iterator() noexcept = default;
- inline const Key &key() const { return concrete(i)->key; }
- inline T &value() const { return concrete(i)->value; }
- inline T &operator*() const { return concrete(i)->value; }
- inline T *operator->() const { return &concrete(i)->value; }
- inline bool operator==(const iterator &o) const { return i == o.i; }
- inline bool operator!=(const iterator &o) const { return i != o.i; }
+ inline const Key &key() const noexcept { return i.node()->key; }
+ inline T &value() const noexcept { return i.node()->value; }
+ inline T &operator*() const noexcept { return i.node()->value; }
+ inline T *operator->() const noexcept { return &i.node()->value; }
+ inline bool operator==(const iterator &o) const noexcept { return i == o.i; }
+ inline bool operator!=(const iterator &o) const noexcept { return i != o.i; }
- inline iterator &operator++() {
- i = QHashData::nextNode(i);
- return *this;
- }
- inline iterator operator++(int) {
- iterator r = *this;
- i = QHashData::nextNode(i);
- return r;
- }
-#if QT_DEPRECATED_SINCE(5, 15)
- inline QT_DEPRECATED_VERSION_5_15 iterator &operator--()
+ inline iterator &operator++() noexcept
{
- i = QHashData::previousNode(i);
+ ++i;
return *this;
}
- inline QT_DEPRECATED_VERSION_5_15 iterator operator--(int)
+ inline iterator operator++(int) noexcept
{
iterator r = *this;
- i = QHashData::previousNode(i);
+ ++i;
return r;
}
- inline QT_DEPRECATED_VERSION_5_15 iterator operator+(int j) const
- { iterator r = *this; if (j > 0) while (j--) ++r; else while (j++) --r; return r; }
- inline QT_DEPRECATED_VERSION_5_15 iterator operator-(int j) const { return operator+(-j); }
- inline QT_DEPRECATED_VERSION_5_15 iterator &operator+=(int j) { return *this = *this + j; }
- inline QT_DEPRECATED_VERSION_5_15 iterator &operator-=(int j) { return *this = *this - j; }
- friend inline QT_DEPRECATED_VERSION_5_15 iterator operator+(int j, iterator k) { return k + j; }
-#endif
-#ifndef QT_STRICT_ITERATORS
- public:
- inline bool operator==(const const_iterator &o) const
- { return i == o.i; }
- inline bool operator!=(const const_iterator &o) const
- { return i != o.i; }
-#endif
+ inline bool operator==(const const_iterator &o) const noexcept { return i == o.i; }
+ inline bool operator!=(const const_iterator &o) const noexcept { return i != o.i; }
};
friend class iterator;
class const_iterator
{
+ using piter = typename QHashPrivate::iterator<Node>;
friend class iterator;
friend class QHash<Key, T>;
- friend class QMultiHash<Key, T>;
friend class QSet<Key>;
- QHashData::Node *i;
+ piter i;
+ explicit inline const_iterator(piter it) : i(it) { }
public:
-#if QT_DEPRECATED_WARNINGS_SINCE < QT_VERSION_CHECK(5, 15, 0)
- typedef std::bidirectional_iterator_tag iterator_category;
-#else
typedef std::forward_iterator_tag iterator_category;
-#endif
typedef qptrdiff difference_type;
typedef T value_type;
typedef const T *pointer;
typedef const T &reference;
- Q_DECL_CONSTEXPR inline const_iterator() : i(nullptr) { }
- explicit inline const_iterator(void *node)
- : i(reinterpret_cast<QHashData::Node *>(node)) { }
-#ifdef QT_STRICT_ITERATORS
- explicit inline const_iterator(const iterator &o)
-#else
- inline const_iterator(const iterator &o)
-#endif
- { i = o.i; }
+ constexpr const_iterator() noexcept = default;
+ inline const_iterator(const iterator &o) noexcept : i(o.i) { }
- inline const Key &key() const { return concrete(i)->key; }
- inline const T &value() const { return concrete(i)->value; }
- inline const T &operator*() const { return concrete(i)->value; }
- inline const T *operator->() const { return &concrete(i)->value; }
- Q_DECL_CONSTEXPR inline bool operator==(const const_iterator &o) const { return i == o.i; }
- Q_DECL_CONSTEXPR inline bool operator!=(const const_iterator &o) const { return i != o.i; }
+ inline const Key &key() const noexcept { return i.node()->key; }
+ inline const T &value() const noexcept { return i.node()->value; }
+ inline const T &operator*() const noexcept { return i.node()->value; }
+ inline const T *operator->() const noexcept { return &i.node()->value; }
+ inline bool operator==(const const_iterator &o) const noexcept { return i == o.i; }
+ inline bool operator!=(const const_iterator &o) const noexcept { return i != o.i; }
- inline const_iterator &operator++() {
- i = QHashData::nextNode(i);
- return *this;
- }
- inline const_iterator operator++(int) {
- const_iterator r = *this;
- i = QHashData::nextNode(i);
- return r;
- }
-#if QT_DEPRECATED_SINCE(5, 15)
- inline QT_DEPRECATED_VERSION_5_15 const_iterator &operator--()
+ inline const_iterator &operator++() noexcept
{
- i = QHashData::previousNode(i);
+ ++i;
return *this;
}
- inline QT_DEPRECATED_VERSION_5_15 const_iterator operator--(int)
+ inline const_iterator operator++(int) noexcept
{
const_iterator r = *this;
- i = QHashData::previousNode(i);
+ ++i;
return r;
}
- inline QT_DEPRECATED_VERSION_5_15 const_iterator operator+(int j) const
- { const_iterator r = *this; if (j > 0) while (j--) ++r; else while (j++) --r; return r; }
- inline QT_DEPRECATED_VERSION_5_15 const_iterator operator-(int j) const { return operator+(-j); }
- inline QT_DEPRECATED_VERSION_5_15 const_iterator &operator+=(int j) { return *this = *this + j; }
- inline QT_DEPRECATED_VERSION_5_15 const_iterator &operator-=(int j) { return *this = *this - j; }
- friend inline QT_DEPRECATED_VERSION_5_15 const_iterator operator+(int j, const_iterator k)
- {
- return k + j;
- }
-#endif
-
- // ### Qt 5: not sure this is necessary anymore
-#ifdef QT_STRICT_ITERATORS
- private:
- inline bool operator==(const iterator &o) const { return operator==(const_iterator(o)); }
- inline bool operator!=(const iterator &o) const { return operator!=(const_iterator(o)); }
-#endif
};
friend class const_iterator;
@@ -469,641 +1007,799 @@ public:
public:
typedef typename const_iterator::iterator_category iterator_category;
- typedef typename const_iterator::difference_type difference_type;
+ typedef qptrdiff difference_type;
typedef Key value_type;
typedef const Key *pointer;
typedef const Key &reference;
- key_iterator() = default;
- explicit key_iterator(const_iterator o) : i(o) { }
+ key_iterator() noexcept = default;
+ explicit key_iterator(const_iterator o) noexcept : i(o) { }
- const Key &operator*() const { return i.key(); }
- const Key *operator->() const { return &i.key(); }
- bool operator==(key_iterator o) const { return i == o.i; }
- bool operator!=(key_iterator o) const { return i != o.i; }
+ const Key &operator*() const noexcept { return i.key(); }
+ const Key *operator->() const noexcept { return &i.key(); }
+ bool operator==(key_iterator o) const noexcept { return i == o.i; }
+ bool operator!=(key_iterator o) const noexcept { return i != o.i; }
- inline key_iterator &operator++() { ++i; return *this; }
- inline key_iterator operator++(int) { return key_iterator(i++);}
-#if QT_DEPRECATED_SINCE(5, 15)
- inline QT_DEPRECATED_VERSION_5_15 key_iterator &operator--()
- {
- --i;
- return *this;
- }
- inline QT_DEPRECATED_VERSION_5_15 key_iterator operator--(int) { return key_iterator(i--); }
-#endif
- const_iterator base() const { return i; }
+ inline key_iterator &operator++() noexcept { ++i; return *this; }
+ inline key_iterator operator++(int) noexcept { return key_iterator(i++);}
+ const_iterator base() const noexcept { return i; }
};
typedef QKeyValueIterator<const Key&, const T&, const_iterator> const_key_value_iterator;
typedef QKeyValueIterator<const Key&, T&, iterator> key_value_iterator;
// STL style
- inline iterator begin() { detach(); return iterator(d->firstNode()); }
- inline const_iterator begin() const { return const_iterator(d->firstNode()); }
- inline const_iterator cbegin() const { return const_iterator(d->firstNode()); }
- inline const_iterator constBegin() const { return const_iterator(d->firstNode()); }
- inline iterator end() { detach(); return iterator(e); }
- inline const_iterator end() const { return const_iterator(e); }
- inline const_iterator cend() const { return const_iterator(e); }
- inline const_iterator constEnd() const { return const_iterator(e); }
- inline key_iterator keyBegin() const { return key_iterator(begin()); }
- inline key_iterator keyEnd() const { return key_iterator(end()); }
+ inline iterator begin() { detach(); return iterator(d->begin()); }
+ inline const_iterator begin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); }
+ inline const_iterator cbegin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); }
+ inline const_iterator constBegin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); }
+ inline iterator end() noexcept { return iterator(); }
+ inline const_iterator end() const noexcept { return const_iterator(); }
+ inline const_iterator cend() const noexcept { return const_iterator(); }
+ inline const_iterator constEnd() const noexcept { return const_iterator(); }
+ inline key_iterator keyBegin() const noexcept { return key_iterator(begin()); }
+ inline key_iterator keyEnd() const noexcept { return key_iterator(end()); }
inline key_value_iterator keyValueBegin() { return key_value_iterator(begin()); }
inline key_value_iterator keyValueEnd() { return key_value_iterator(end()); }
- inline const_key_value_iterator keyValueBegin() const { return const_key_value_iterator(begin()); }
- inline const_key_value_iterator constKeyValueBegin() const { return const_key_value_iterator(begin()); }
- inline const_key_value_iterator keyValueEnd() const { return const_key_value_iterator(end()); }
- inline const_key_value_iterator constKeyValueEnd() const { return const_key_value_iterator(end()); }
+ inline const_key_value_iterator keyValueBegin() const noexcept { return const_key_value_iterator(begin()); }
+ inline const_key_value_iterator constKeyValueBegin() const noexcept { return const_key_value_iterator(begin()); }
+ inline const_key_value_iterator keyValueEnd() const noexcept { return const_key_value_iterator(end()); }
+ inline const_key_value_iterator constKeyValueEnd() const noexcept { return const_key_value_iterator(end()); }
+
+ iterator erase(const_iterator it)
+ {
+ Q_ASSERT(it != constEnd());
+ detach();
+ // ensure a valid iterator across the detach:
+ iterator i = iterator{d->detachedIterator(it.i)};
- QPair<iterator, iterator> equal_range(const Key &key);
- QPair<const_iterator, const_iterator> equal_range(const Key &key) const noexcept;
- iterator erase(iterator it) { return erase(const_iterator(it.i)); }
- iterator erase(const_iterator it);
+ i.i = d->erase(i.i);
+ return i;
+ }
+
+ QPair<iterator, iterator> equal_range(const Key &key)
+ {
+ auto first = find(key);
+ auto second = first;
+ if (second != iterator())
+ ++second;
+ return qMakePair(first, second);
+ }
+
+ QPair<const_iterator, const_iterator> equal_range(const Key &key) const noexcept
+ {
+ auto first = find(key);
+ auto second = first;
+ if (second != iterator())
+ ++second;
+ return qMakePair(first, second);
+ }
- // more Qt
typedef iterator Iterator;
typedef const_iterator ConstIterator;
- inline int count() const { return d->size; }
- iterator find(const Key &key);
- const_iterator find(const Key &key) const;
- const_iterator constFind(const Key &key) const;
- iterator insert(const Key &key, const T &value);
- void insert(const QHash &hash);
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_VERSION_X_5_15("Use QMultiHash for hashes storing multiple values with the same key.") iterator insertMulti(const Key &key, const T &value);
- QT_DEPRECATED_VERSION_X_5_15("Use QMultiHash for hashes storing multiple values with the same key.") QHash &unite(const QHash &other);
-#endif
+ inline qsizetype count() const noexcept { return d ? qsizetype(d->size) : 0; }
+ iterator find(const Key &key)
+ {
+ if (isEmpty()) // prevents detaching shared null
+ return end();
+ detach();
+ auto it = d->find(key);
+ if (it.isUnused())
+ it = d->end();
+ return iterator(it);
+ }
+ const_iterator find(const Key &key) const noexcept
+ {
+ if (isEmpty())
+ return end();
+ auto it = d->find(key);
+ if (it.isUnused())
+ it = d->end();
+ return const_iterator(it);
+ }
+ const_iterator constFind(const Key &key) const noexcept
+ {
+ return find(key);
+ }
+ iterator insert(const Key &key, const T &value)
+ {
+ return emplace(key, value);
+ }
- // STL compatibility
- typedef T mapped_type;
- typedef Key key_type;
- typedef qptrdiff difference_type;
- typedef int size_type;
+ void insert(const QHash &hash)
+ {
+ if (d == hash.d || !hash.d)
+ return;
+ if (!d) {
+ *this = hash;
+ return;
+ }
- inline bool empty() const { return isEmpty(); }
+ detach();
-#ifdef QT_QHASH_DEBUG
- inline void dump() const { d->dump(); }
- inline void checkSanity() const { d->checkSanity(); }
-#endif
+ for (auto it = hash.begin(); it != hash.end(); ++it)
+ emplace(it.key(), it.value());
+ }
-private:
- void detach_helper();
- void freeData(QHashData *d);
- Node **findNode(const Key &key, uint *hp = nullptr) const;
- Node **findNode(const Key &key, uint h) const;
- Node *createNode(uint h, const Key &key, const T &value, Node **nextNode);
- void deleteNode(Node *node);
- static void deleteNode2(QHashData::Node *node);
-
- static void duplicateNode(QHashData::Node *originalNode, void *newNode);
-
- bool isValidIterator(const iterator &it) const noexcept
- { return isValidNode(it.i); }
- bool isValidIterator(const const_iterator &it) const noexcept
- { return isValidNode(it.i); }
- bool isValidNode(QHashData::Node *node) const noexcept
- {
-#if defined(QT_DEBUG) && !defined(Q_HASH_NO_ITERATOR_DEBUG)
- while (node->next)
- node = node->next;
- return (static_cast<void *>(node) == d);
-#else
- Q_UNUSED(node);
- return true;
-#endif
+ template <typename ...Args>
+ iterator emplace(const Key &key, Args &&... args)
+ {
+ return emplace(Key(key), std::forward<Args>(args)...);
}
- friend class QSet<Key>;
- friend class QMultiHash<Key, T>;
-};
+ template <typename ...Args>
+ iterator emplace(Key &&key, Args &&... args)
+ {
+ detach();
-template <class Key, class T>
-Q_INLINE_TEMPLATE void QHash<Key, T>::deleteNode(Node *node)
-{
- deleteNode2(reinterpret_cast<QHashData::Node*>(node));
- d->freeNode(node);
-}
+ auto result = d->findOrInsert(key);
+ if (!result.initialized)
+ Node::createInPlace(result.it.node(), std::move(key), std::forward<Args>(args)...);
+ else
+ result.it.node()->emplaceValue(std::forward<Args>(args)...);
+ return iterator(result.it);
+ }
-template <class Key, class T>
-Q_INLINE_TEMPLATE void QHash<Key, T>::deleteNode2(QHashData::Node *node)
-{
-#ifdef Q_CC_BOR
- concrete(node)->~QHashNode<Key, T>();
-#else
- concrete(node)->~Node();
-#endif
-}
+ float load_factor() const noexcept { return d ? d->loadFactor() : 0; }
+ static float max_load_factor() noexcept { return 0.5; }
+ size_t bucket_count() const noexcept { return d ? d->numBuckets : 0; }
+ static size_t max_bucket_count() noexcept { return QHashPrivate::GrowthPolicy::maxNumBuckets(); }
-template <class Key, class T>
-Q_INLINE_TEMPLATE void QHash<Key, T>::duplicateNode(QHashData::Node *node, void *newNode)
-{
- Node *concreteNode = concrete(node);
- new (newNode) Node(concreteNode->key, concreteNode->value, concreteNode->h, nullptr);
-}
+ inline bool empty() const noexcept { return isEmpty(); }
+};
-template <class Key, class T>
-Q_INLINE_TEMPLATE typename QHash<Key, T>::Node *
-QHash<Key, T>::createNode(uint ah, const Key &akey, const T &avalue, Node **anextNode)
-{
- Node *node = new (d->allocateNode(alignOfNode())) Node(akey, avalue, ah, *anextNode);
- *anextNode = node;
- ++d->size;
- return node;
-}
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE void QHash<Key, T>::freeData(QHashData *x)
-{
- x->free_helper(deleteNode2);
-}
template <class Key, class T>
-Q_INLINE_TEMPLATE void QHash<Key, T>::clear()
+class QMultiHash
{
- *this = QHash();
-}
+ using Node = QHashPrivate::MultiNode<Key, T>;
+ using Data = QHashPrivate::Data<Node>;
+ using Chain = QHashPrivate::MultiNodeChain<T>;
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE void QHash<Key, T>::detach_helper()
-{
- QHashData *x = d->detach_helper(duplicateNode, deleteNode2, sizeof(Node), alignOfNode());
- if (!d->ref.deref())
- freeData(d);
- d = x;
-}
+ Data *d = nullptr;
+ qsizetype m_size = 0;
-template <class Key, class T>
-Q_INLINE_TEMPLATE QHash<Key, T> &QHash<Key, T>::operator=(const QHash &other)
-{
- if (d != other.d) {
- QHashData *o = other.d;
- o->ref.ref();
- if (!d->ref.deref())
- freeData(d);
- d = o;
- if (!d->sharable)
- detach_helper();
+public:
+ using key_type = Key;
+ using mapped_type = T;
+ using value_type = T;
+ using size_type = qsizetype;
+ using difference_type = qsizetype;
+ using reference = T &;
+ using const_reference = const T &;
+
+ QMultiHash() noexcept = default;
+ inline QMultiHash(std::initializer_list<std::pair<Key,T> > list)
+ : d(new Data(list.size()))
+ {
+ for (typename std::initializer_list<std::pair<Key,T> >::const_iterator it = list.begin(); it != list.end(); ++it)
+ insert(it->first, it->second);
}
- return *this;
-}
-
-template <class Key, class T>
-Q_INLINE_TEMPLATE const T QHash<Key, T>::value(const Key &akey) const
-{
- Node *node;
- if (d->size == 0 || (node = *findNode(akey)) == e) {
- return T();
- } else {
- return node->value;
+#ifdef Q_QDOC
+ template <typename InputIterator>
+ QMultiHash(InputIterator f, InputIterator l);
+#else
+ template <typename InputIterator, QtPrivate::IfAssociativeIteratorHasKeyAndValue<InputIterator> = true>
+ QMultiHash(InputIterator f, InputIterator l)
+ {
+ QtPrivate::reserveIfForwardIterator(this, f, l);
+ for (; f != l; ++f)
+ insert(f.key(), f.value());
}
-}
-template <class Key, class T>
-Q_INLINE_TEMPLATE const T QHash<Key, T>::value(const Key &akey, const T &adefaultValue) const
-{
- Node *node;
- if (d->size == 0 || (node = *findNode(akey)) == e) {
- return adefaultValue;
- } else {
- return node->value;
+ template <typename InputIterator, QtPrivate::IfAssociativeIteratorHasFirstAndSecond<InputIterator> = true>
+ QMultiHash(InputIterator f, InputIterator l)
+ {
+ QtPrivate::reserveIfForwardIterator(this, f, l);
+ for (; f != l; ++f)
+ insert(f->first, f->second);
+ }
+#endif
+ QMultiHash(const QMultiHash &other) noexcept
+ : d(other.d), m_size(other.m_size)
+ {
+ if (d)
+ d->ref.ref();
+ }
+ ~QMultiHash()
+ {
+ if (d && !d->ref.deref())
+ delete d;
}
-}
-
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::keys() const
-{
- QList<Key> res;
- res.reserve(size());
- const_iterator i = begin();
- while (i != end()) {
- res.append(i.key());
- ++i;
- }
- return res;
-}
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::keys(const T &avalue) const
-{
- QList<Key> res;
- const_iterator i = begin();
- while (i != end()) {
- if (i.value() == avalue)
- res.append(i.key());
- ++i;
- }
- return res;
-}
+ QMultiHash &operator=(const QMultiHash &other) noexcept(std::is_nothrow_destructible<Node>::value)
+ {
+ if (d != other.d) {
+ Data *o = other.d;
+ if (o)
+ o->ref.ref();
+ if (d && !d->ref.deref())
+ delete d;
+ d = o;
+ m_size = other.m_size;
+ }
+ return *this;
+ }
+ QMultiHash(QMultiHash &&other) noexcept : d(other.d), m_size(other.m_size)
+ {
+ other.d = nullptr;
+ other.m_size = 0;
+ }
+ QMultiHash &operator=(QMultiHash &&other) noexcept(std::is_nothrow_destructible<Node>::value)
+ {
+ QMultiHash moved(std::move(other));
+ swap(moved);
+ return *this;
+ }
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE const Key QHash<Key, T>::key(const T &avalue) const
-{
- return key(avalue, Key());
-}
+ QMultiHash(const QHash<Key, T> &other)
+ : QMultiHash(other.begin(), other.end())
+ {}
+ void swap(QMultiHash &other) noexcept { qSwap(d, other.d); qSwap(m_size, other.m_size); }
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE const Key QHash<Key, T>::key(const T &avalue, const Key &defaultValue) const
-{
- const_iterator i = begin();
- while (i != end()) {
- if (i.value() == avalue)
- return i.key();
- ++i;
+ bool operator==(const QMultiHash &other) const noexcept
+ {
+ if (d == other.d)
+ return true;
+ if (!d || ! other.d)
+ return false;
+ if (m_size != other.m_size || d->size != other.d->size)
+ return false;
+ for (auto it = other.d->begin(); it != other.d->end(); ++it) {
+ auto i = d->find(it.node()->key);
+ if (i == d->end())
+ return false;
+ Chain *e = it.node()->value;
+ while (e) {
+ Chain *oe = i.node()->value;
+ while (oe) {
+ if (oe->value == e->value)
+ break;
+ oe = oe->next;
+ }
+ if (!oe)
+ return false;
+ e = e->next;
+ }
+ }
+ // all values must be the same as size is the same
+ return true;
}
+ bool operator!=(const QMultiHash &other) const noexcept { return !(*this == other); }
- return defaultValue;
-}
-
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QList<T> QHash<Key, T>::values() const
-{
- QList<T> res;
- res.reserve(size());
- const_iterator i = begin();
- while (i != end()) {
- res.append(i.value());
- ++i;
- }
- return res;
-}
+ inline qsizetype size() const noexcept { return m_size; }
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE int QHash<Key, T>::count(const Key &akey) const
-{
- int cnt = 0;
- Node *node = *findNode(akey);
- if (node != e) {
- do {
- ++cnt;
- } while ((node = node->next) != e && node->key == akey);
- }
- return cnt;
-}
+ inline bool isEmpty() const noexcept { return !m_size; }
-template <class Key, class T>
-Q_INLINE_TEMPLATE const T QHash<Key, T>::operator[](const Key &akey) const
-{
- return value(akey);
-}
+ inline qsizetype capacity() const noexcept { return d ? qsizetype(d->numBuckets >> 1) : 0; }
+ void reserve(qsizetype size)
+ {
+ if (isDetached())
+ d->rehash(size);
+ else
+ d = Data::detached(d, size_t(size));
+ }
+ inline void squeeze() { reserve(0); }
-template <class Key, class T>
-Q_INLINE_TEMPLATE T &QHash<Key, T>::operator[](const Key &akey)
-{
- detach();
+ inline void detach() { if (!d || d->ref.isShared()) d = Data::detached(d); }
+ inline bool isDetached() const noexcept { return d && !d->ref.isShared(); }
+ bool isSharedWith(const QMultiHash &other) const noexcept { return d == other.d; }
- uint h;
- Node **node = findNode(akey, &h);
- if (*node == e) {
- if (d->willGrow())
- node = findNode(akey, h);
- return createNode(h, akey, T(), node)->value;
+ void clear() noexcept(std::is_nothrow_destructible<Node>::value)
+ {
+ if (d && !d->ref.deref())
+ delete d;
+ d = nullptr;
+ m_size = 0;
}
- return (*node)->value;
-}
-template <class Key, class T>
-Q_INLINE_TEMPLATE typename QHash<Key, T>::iterator QHash<Key, T>::insert(const Key &akey,
- const T &avalue)
-{
- detach();
+ qsizetype remove(const Key &key)
+ {
+ if (isEmpty()) // prevents detaching shared null
+ return 0;
+ detach();
- uint h;
- Node **node = findNode(akey, &h);
- if (*node == e) {
- if (d->willGrow())
- node = findNode(akey, h);
- return iterator(createNode(h, akey, avalue, node));
+ auto it = d->find(key);
+ if (it.isUnused())
+ return 0;
+ qsizetype n = Node::freeChain(it.node());
+ m_size -= n;
+ Q_ASSERT(m_size >= 0);
+ d->erase(it);
+ return n;
}
+ T take(const Key &key)
+ {
+ if (isEmpty()) // prevents detaching shared null
+ return T();
+ detach();
- if (!std::is_same<T, QHashDummyValue>::value)
- (*node)->value = avalue;
- return iterator(*node);
-}
-
-template <class Key, class T>
-Q_INLINE_TEMPLATE void QHash<Key, T>::insert(const QHash &hash)
-{
- if (d == hash.d)
- return;
-
- detach();
-
- QHashData::Node *i = hash.d->firstNode();
- QHashData::Node *end = reinterpret_cast<QHashData::Node *>(hash.e);
- while (i != end) {
- Node *n = concrete(i);
- Node **node = findNode(n->key, n->h);
- if (*node == e) {
- if (d->willGrow())
- node = findNode(n->key, n->h);
- createNode(n->h, n->key, n->value, node);
+ auto it = d->find(key);
+ if (it.isUnused())
+ return T();
+ Chain *e = it.node()->value;
+ Q_ASSERT(e);
+ T t = std::move(e->value);
+ if (e->next) {
+ it.node()->value = e->next;
+ delete e;
} else {
- if (!std::is_same<T, QHashDummyValue>::value)
- (*node)->value = n->value;
+ // erase() deletes the values.
+ d->erase(it);
}
- i = QHashData::nextNode(i);
+ --m_size;
+ Q_ASSERT(m_size >= 0);
+ return t;
}
-}
-
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE int QHash<Key, T>::remove(const Key &akey)
-{
- if (isEmpty()) // prevents detaching shared null
- return 0;
- detach();
-
- int oldSize = d->size;
- Node **node = findNode(akey);
- if (*node != e) {
- bool deleteNext = true;
- do {
- Node *next = (*node)->next;
- deleteNext = (next != e && next->key == (*node)->key);
- deleteNode(*node);
- *node = next;
- --d->size;
- } while (deleteNext);
- d->hasShrunk();
- }
- return oldSize - d->size;
-}
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE T QHash<Key, T>::take(const Key &akey)
-{
- if (isEmpty()) // prevents detaching shared null
- return T();
- detach();
-
- Node **node = findNode(akey);
- if (*node != e) {
- T t = std::move((*node)->value);
- Node *next = (*node)->next;
- deleteNode(*node);
- *node = next;
- --d->size;
- d->hasShrunk();
- return t;
+ bool contains(const Key &key) const noexcept
+ {
+ if (!d)
+ return false;
+ return d->findNode(key) != nullptr;
}
- return T();
-}
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE typename QHash<Key, T>::iterator QHash<Key, T>::erase(const_iterator it)
-{
- Q_ASSERT_X(isValidIterator(it), "QHash::erase", "The specified iterator argument 'it' is invalid");
-
- if (it == const_iterator(e))
- return iterator(it.i);
-
- if (d->ref.isShared()) {
- // save 'it' across the detach:
- int bucketNum = (it.i->h % d->numBuckets);
- const_iterator bucketIterator(*(d->buckets + bucketNum));
- int stepsFromBucketStartToIte = 0;
- while (bucketIterator != it) {
- ++stepsFromBucketStartToIte;
- ++bucketIterator;
+ Key key(const T &value, const Key &defaultKey = Key()) const noexcept
+ {
+ if (d) {
+ auto i = d->begin();
+ while (i != d->end()) {
+ Chain *e = i.node()->value;
+ if (e->contains(value))
+ return i.node()->key;
+ ++i;
+ }
}
- detach();
- it = const_iterator(*(d->buckets + bucketNum));
- while (stepsFromBucketStartToIte > 0) {
- --stepsFromBucketStartToIte;
- ++it;
+
+ return defaultKey;
+ }
+ T value(const Key &key, const T &defaultValue = T()) const noexcept
+ {
+ if (d) {
+ Node *n = d->findNode(key);
+ if (n) {
+ Q_ASSERT(n->value);
+ return n->value->value;
+ }
}
+ return defaultValue;
}
- iterator ret(it.i);
- ++ret;
+ T &operator[](const Key &key)
+ {
+ detach();
+ auto result = d->findOrInsert(key);
+ Q_ASSERT(!result.it.atEnd());
+ if (!result.initialized)
+ Node::createInPlace(result.it.node(), key, T());
+ return result.it.node()->value->value;
+ }
- Node *node = concrete(it.i);
- Node **node_ptr = reinterpret_cast<Node **>(&d->buckets[node->h % d->numBuckets]);
- while (*node_ptr != node)
- node_ptr = &(*node_ptr)->next;
- *node_ptr = node->next;
- deleteNode(node);
- --d->size;
- return ret;
-}
+ const T operator[](const Key &key) const noexcept
+ {
+ return value(key);
+ }
-template <class Key, class T>
-Q_INLINE_TEMPLATE void QHash<Key, T>::reserve(int asize)
-{
- detach();
- d->rehash(-qMax(asize, 1));
-}
+ QVector<Key> uniqueKeys() const
+ {
+ QVector<Key> res;
+ if (d) {
+ auto i = d->begin();
+ while (i != d->end()) {
+ res.append(i.node()->key);
+ ++i;
+ }
+ }
+ return res;
+ }
-template <class Key, class T>
-Q_INLINE_TEMPLATE typename QHash<Key, T>::const_iterator QHash<Key, T>::find(const Key &akey) const
-{
- return const_iterator(*findNode(akey));
-}
+ QVector<Key> keys() const
+ {
+ return QVector<Key>(keyBegin(), keyEnd());
+ }
+ QVector<Key> keys(const T &value) const
+ {
+ QVector<Key> res;
+ const_iterator i = begin();
+ while (i != end()) {
+ if (i.value()->contains(value))
+ res.append(i.key());
+ ++i;
+ }
+ return res;
+ }
+ QVector<T> values() const
+ {
+ return QVector<T>(begin(), end());
+ }
+ QVector<T> values(const Key &key) const
+ {
+ QVector<T> values;
+ if (d) {
+ Node *n = d->findNode(key);
+ if (n) {
+ Chain *e = n->value;
+ while (e) {
+ values.append(e->value);
+ e = e->next;
+ }
+ }
+ }
+ return values;
+ }
-template <class Key, class T>
-Q_INLINE_TEMPLATE typename QHash<Key, T>::const_iterator QHash<Key, T>::constFind(const Key &akey) const
-{
- return const_iterator(*findNode(akey));
-}
+ class const_iterator;
-template <class Key, class T>
-Q_INLINE_TEMPLATE typename QHash<Key, T>::iterator QHash<Key, T>::find(const Key &akey)
-{
- detach();
- return iterator(*findNode(akey));
-}
+ class iterator
+ {
+ using piter = typename QHashPrivate::iterator<Node>;
+ friend class const_iterator;
+ friend class QMultiHash<Key, T>;
+ piter i;
+ Chain **e = nullptr;
+ explicit inline iterator(piter it, Chain **entry = nullptr) noexcept : i(it), e(entry)
+ {
+ if (!it.atEnd() && !e) {
+ e = &it.node()->value;
+ Q_ASSERT(e && *e);
+ }
+ }
-template <class Key, class T>
-Q_INLINE_TEMPLATE bool QHash<Key, T>::contains(const Key &akey) const
-{
- return *findNode(akey) != e;
-}
+ public:
+ typedef std::forward_iterator_tag iterator_category;
+ typedef qptrdiff difference_type;
+ typedef T value_type;
+ typedef T *pointer;
+ typedef T &reference;
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE typename QHash<Key, T>::Node **QHash<Key, T>::findNode(const Key &akey, uint h) const
-{
- Node **node;
+ constexpr iterator() noexcept = default;
+
+ inline const Key &key() const noexcept { return i.node()->key; }
+ inline T &value() const noexcept { return (*e)->value; }
+ inline T &operator*() const noexcept { return (*e)->value; }
+ inline T *operator->() const noexcept { return &(*e)->value; }
+ inline bool operator==(const iterator &o) const noexcept { return e == o.e; }
+ inline bool operator!=(const iterator &o) const noexcept { return e != o.e; }
+
+ inline iterator &operator++() noexcept {
+ Q_ASSERT(e && *e);
+ e = &(*e)->next;
+ Q_ASSERT(e);
+ if (!*e) {
+ ++i;
+ e = i.atEnd() ? nullptr : &i.node()->value;
+ }
+ return *this;
+ }
+ inline iterator operator++(int) noexcept {
+ iterator r = *this;
+ ++(*this);
+ return r;
+ }
- if (d->numBuckets) {
- node = reinterpret_cast<Node **>(&d->buckets[h % d->numBuckets]);
- Q_ASSERT(*node == e || (*node)->next);
- while (*node != e && !(*node)->same_key(h, akey))
- node = &(*node)->next;
- } else {
- node = const_cast<Node **>(reinterpret_cast<const Node * const *>(&e));
- }
- return node;
-}
+ inline bool operator==(const const_iterator &o) const noexcept { return e == o.e; }
+ inline bool operator!=(const const_iterator &o) const noexcept { return e != o.e; }
+ };
+ friend class iterator;
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE typename QHash<Key, T>::Node **QHash<Key, T>::findNode(const Key &akey,
- uint *ahp) const
-{
- uint h = 0;
+ class const_iterator
+ {
+ using piter = typename QHashPrivate::iterator<Node>;
+ friend class iterator;
+ friend class QMultiHash<Key, T>;
+ piter i;
+ Chain **e = nullptr;
+ explicit inline const_iterator(piter it, Chain **entry = nullptr) noexcept : i(it), e(entry)
+ {
+ if (!it.atEnd() && !e) {
+ e = &it.node()->value;
+ Q_ASSERT(e && *e);
+ }
+ }
- if (d->numBuckets || ahp) {
- h = qHash(akey, d->seed);
- if (ahp)
- *ahp = h;
- }
- return findNode(akey, h);
-}
+ public:
+ typedef std::forward_iterator_tag iterator_category;
+ typedef qptrdiff difference_type;
+ typedef T value_type;
+ typedef const T *pointer;
+ typedef const T &reference;
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE bool QHash<Key, T>::operator==(const QHash &other) const
-{
- if (d == other.d)
- return true;
- if (size() != other.size())
- return false;
+ constexpr const_iterator() noexcept = default;
+ inline const_iterator(const iterator &o) noexcept : i(o.i), e(o.e) { }
+
+ inline const Key &key() const noexcept { return i.node()->key; }
+ inline T &value() const noexcept { return (*e)->value; }
+ inline T &operator*() const noexcept { return (*e)->value; }
+ inline T *operator->() const noexcept { return &(*e)->value; }
+ inline bool operator==(const const_iterator &o) const noexcept { return e == o.e; }
+ inline bool operator!=(const const_iterator &o) const noexcept { return e != o.e; }
+
+ inline const_iterator &operator++() noexcept {
+ Q_ASSERT(e && *e);
+ e = &(*e)->next;
+ Q_ASSERT(e);
+ if (!*e) {
+ ++i;
+ e = i.atEnd() ? nullptr : &i.node()->value;
+ }
+ return *this;
+ }
+ inline const_iterator operator++(int) noexcept
+ {
+ const_iterator r = *this;
+ ++(*this);
+ return r;
+ }
+ };
+ friend class const_iterator;
- const_iterator it = begin();
+ class key_iterator
+ {
+ const_iterator i;
- while (it != end()) {
- // Build two equal ranges for i.key(); one for *this and one for other.
- // For *this we can avoid a lookup via equal_range, as we know the beginning of the range.
- auto thisEqualRangeStart = it;
- const Key &thisEqualRangeKey = it.key();
- size_type n = 0;
- do {
- ++it;
- ++n;
- } while (it != end() && it.key() == thisEqualRangeKey);
+ public:
+ typedef typename const_iterator::iterator_category iterator_category;
+ typedef qptrdiff difference_type;
+ typedef Key value_type;
+ typedef const Key *pointer;
+ typedef const Key &reference;
- const auto otherEqualRange = other.equal_range(thisEqualRangeKey);
+ key_iterator() noexcept = default;
+ explicit key_iterator(const_iterator o) noexcept : i(o) { }
- if (n != std::distance(otherEqualRange.first, otherEqualRange.second))
- return false;
+ const Key &operator*() const noexcept { return i.key(); }
+ const Key *operator->() const noexcept { return &i.key(); }
+ bool operator==(key_iterator o) const noexcept { return i == o.i; }
+ bool operator!=(key_iterator o) const noexcept { return i != o.i; }
- // Keys in the ranges are equal by construction; this checks only the values.
- if (!qt_is_permutation(thisEqualRangeStart, it, otherEqualRange.first, otherEqualRange.second))
- return false;
- }
-
- return true;
-}
-
-template <class Key, class T>
-QPair<typename QHash<Key, T>::iterator, typename QHash<Key, T>::iterator> QHash<Key, T>::equal_range(const Key &akey)
-{
- detach();
- auto pair = qAsConst(*this).equal_range(akey);
- return qMakePair(iterator(pair.first.i), iterator(pair.second.i));
-}
+ inline key_iterator &operator++() noexcept { ++i; return *this; }
+ inline key_iterator operator++(int) noexcept { return key_iterator(i++);}
+ const_iterator base() const noexcept { return i; }
+ };
-template <class Key, class T>
-QPair<typename QHash<Key, T>::const_iterator, typename QHash<Key, T>::const_iterator> QHash<Key, T>::equal_range(const Key &akey) const noexcept
-{
- Node *node = *findNode(akey);
- const_iterator firstIt = const_iterator(node);
+ typedef QKeyValueIterator<const Key&, const T&, const_iterator> const_key_value_iterator;
+ typedef QKeyValueIterator<const Key&, T&, iterator> key_value_iterator;
- if (node != e) {
- // equal keys must hash to the same value and so they all
- // end up in the same bucket. So we can use node->next,
- // which only works within a bucket, instead of (out-of-line)
- // QHashData::nextNode()
- while (node->next != e && node->next->key == akey)
- node = node->next;
+ // STL style
+ inline iterator begin() { detach(); return iterator(d->begin()); }
+ inline const_iterator begin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); }
+ inline const_iterator cbegin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); }
+ inline const_iterator constBegin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); }
+ inline iterator end() noexcept { return iterator(); }
+ inline const_iterator end() const noexcept { return const_iterator(); }
+ inline const_iterator cend() const noexcept { return const_iterator(); }
+ inline const_iterator constEnd() const noexcept { return const_iterator(); }
+ inline key_iterator keyBegin() const noexcept { return key_iterator(begin()); }
+ inline key_iterator keyEnd() const noexcept { return key_iterator(end()); }
+ inline key_value_iterator keyValueBegin() noexcept { return key_value_iterator(begin()); }
+ inline key_value_iterator keyValueEnd() noexcept { return key_value_iterator(end()); }
+ inline const_key_value_iterator keyValueBegin() const noexcept { return const_key_value_iterator(begin()); }
+ inline const_key_value_iterator constKeyValueBegin() const noexcept { return const_key_value_iterator(begin()); }
+ inline const_key_value_iterator keyValueEnd() const noexcept { return const_key_value_iterator(end()); }
+ inline const_key_value_iterator constKeyValueEnd() const noexcept { return const_key_value_iterator(end()); }
+
+ iterator detach(const_iterator it)
+ {
+ auto i = it.i;
+ Chain **e = it.e;
+ if (d->ref.isShared()) {
+ // need to store iterator position before detaching
+ qsizetype n = 0;
+ Chain *entry = i.node()->value;
+ while (entry != *it.e) {
+ ++n;
+ entry = entry->next;
+ }
+ Q_ASSERT(entry);
+ detach_helper();
- // 'node' may be the last node in the bucket. To produce the end iterator, we'd
- // need to enter the next bucket in this case, so we need to use
- // QHashData::nextNode() here, which, unlike node->next above, can move between
- // buckets.
- node = concrete(QHashData::nextNode(reinterpret_cast<QHashData::Node *>(node)));
+ i = d->detachedIterator(i);
+ e = &i.node()->value;
+ while (n) {
+ e = &(*e)->next;
+ --n;
+ }
+ Q_ASSERT(e && *e);
+ }
+ return iterator(i, e);
}
- return qMakePair(firstIt, const_iterator(node));
-}
+ iterator erase(const_iterator it)
+ {
+ Q_ASSERT(d);
+ iterator i = detach(it);
+ Chain *e = *i.e;
+ Chain *next = e->next;
+ *i.e = next;
+ delete e;
+ if (!next) {
+ if (i.e == &i.i.node()->value) {
+ // last remaining entry, erase
+ i = iterator(d->erase(i.i));
+ } else {
+ i = iterator(++it.i);
+ }
+ }
+ --m_size;
+ Q_ASSERT(m_size >= 0);
+ return i;
+ }
-template <class Key, class T>
-class QMultiHash : public QHash<Key, T>
-{
-public:
- QMultiHash() noexcept {}
- inline QMultiHash(std::initializer_list<std::pair<Key,T> > list)
+ // more Qt
+ typedef iterator Iterator;
+ typedef const_iterator ConstIterator;
+ inline qsizetype count() const noexcept { return size(); }
+ iterator find(const Key &key)
{
- this->reserve(int(list.size()));
- for (typename std::initializer_list<std::pair<Key,T> >::const_iterator it = list.begin(); it != list.end(); ++it)
- insert(it->first, it->second);
+ if (isEmpty())
+ return end();
+ detach();
+ auto it = d->find(key);
+ if (it.isUnused())
+ it = d->end();
+ return iterator(it);
}
-#ifdef Q_QDOC
- template <typename InputIterator>
- QMultiHash(InputIterator f, InputIterator l);
-#else
- template <typename InputIterator, QtPrivate::IfAssociativeIteratorHasKeyAndValue<InputIterator> = true>
- QMultiHash(InputIterator f, InputIterator l)
+ const_iterator find(const Key &key) const noexcept
{
- QtPrivate::reserveIfForwardIterator(this, f, l);
- for (; f != l; ++f)
- insert(f.key(), f.value());
+ return constFind(key);
+ }
+ const_iterator constFind(const Key &key) const noexcept
+ {
+ if (isEmpty())
+ return end();
+ auto it = d->find(key);
+ if (it.isUnused())
+ it = d->end();
+ return const_iterator(it);
+ }
+ iterator insert(const Key &key, const T &value)
+ {
+ return emplace(key, value);
}
- template <typename InputIterator, QtPrivate::IfAssociativeIteratorHasFirstAndSecond<InputIterator> = true>
- QMultiHash(InputIterator f, InputIterator l)
+ template <typename ...Args>
+ iterator emplace(const Key &key, Args &&... args)
{
- QtPrivate::reserveIfForwardIterator(this, f, l);
- for (; f != l; ++f)
- insert(f->first, f->second);
+ return emplace(Key(key), std::forward<Args>(args)...);
}
-#endif
- // compiler-generated copy/move ctors/assignment operators are fine!
- // compiler-generated destructor is fine!
- QMultiHash(const QHash<Key, T> &other) : QHash<Key, T>(other) {}
- QMultiHash(QHash<Key, T> &&other) noexcept : QHash<Key, T>(std::move(other)) {}
- void swap(QMultiHash &other) noexcept { QHash<Key, T>::swap(other); } // prevent QMultiHash<->QHash swaps
+ template <typename ...Args>
+ iterator emplace(Key &&key, Args &&... args)
+ {
+ detach();
+
+ auto result = d->findOrInsert(key);
+ if (!result.initialized)
+ Node::createInPlace(result.it.node(), std::move(key), std::forward<Args>(args)...);
+ else
+ result.it.node()->insertMulti(std::forward<Args>(args)...);
+ ++m_size;
+ return iterator(result.it);
+ }
+
+
+ float load_factor() const noexcept { return d ? d->loadFactor() : 0; }
+ static float max_load_factor() noexcept { return 0.5; }
+ size_t bucket_count() const noexcept { return d ? d->numBuckets : 0; }
+ static size_t max_bucket_count() noexcept { return QHashPrivate::GrowthPolicy::maxNumBuckets(); }
+
+ inline bool empty() const noexcept { return isEmpty(); }
+
+ inline iterator replace(const Key &key, const T &value)
+ {
+ return emplaceReplace(key, value);
+ }
- inline typename QHash<Key, T>::iterator replace(const Key &key, const T &value)
- { return QHash<Key, T>::insert(key, value); }
+ template <typename ...Args>
+ iterator emplaceReplace(const Key &key, Args &&... args)
+ {
+ return emplaceReplace(Key(key), std::forward<Args>(args)...);
+ }
- typename QHash<Key, T>::iterator insert(const Key &key, const T &value);
+ template <typename ...Args>
+ iterator emplaceReplace(Key &&key, Args &&... args)
+ {
+ detach();
- inline QMultiHash &unite(const QMultiHash &other);
+ auto result = d->findOrInsert(key);
+ if (!result.initialized) {
+ ++m_size;
+ Node::createInPlace(result.it.node(), std::move(key), std::forward<Args>(args)...);
+ } else {
+ result.it.node()->emplaceValue(std::forward<Args>(args)...);
+ }
+ return iterator(result.it);
+ }
inline QMultiHash &operator+=(const QMultiHash &other)
- { return unite(other); }
+ { this->unite(other); return *this; }
inline QMultiHash operator+(const QMultiHash &other) const
{ QMultiHash result = *this; result += other; return result; }
- using QHash<Key, T>::contains;
- using QHash<Key, T>::remove;
- using QHash<Key, T>::count;
- using QHash<Key, T>::find;
- using QHash<Key, T>::constFind;
- using QHash<Key, T>::values;
- using QHash<Key, T>::findNode;
- using QHash<Key, T>::createNode;
- using QHash<Key, T>::concrete;
- using QHash<Key, T>::detach;
+ bool contains(const Key &key, const T &value) const noexcept
+ {
+ if (isEmpty())
+ return false;
+ auto n = d->findNode(key);
+ if (n == nullptr)
+ return false;
+ return n->value->contains(value);
+ }
- using typename QHash<Key, T>::Node;
- using typename QHash<Key, T>::iterator;
- using typename QHash<Key, T>::const_iterator;
+ qsizetype remove(const Key &key, const T &value)
+ {
+ if (isEmpty()) // prevents detaching shared null
+ return false;
+ detach();
- bool contains(const Key &key, const T &value) const;
+ auto it = d->find(key);
+ if (it.isUnused())
+ return 0;
+ qsizetype n = 0;
+ Chain **e = &it.node()->value;
+ while (*e) {
+ Chain *entry = *e;
+ if (entry->value == value) {
+ *e = entry->next;
+ delete entry;
+ ++n;
+ } else {
+ e = &entry->next;
+ }
+ }
+ if (!it.node()->value)
+ d->erase(it);
+ m_size -= n;
+ Q_ASSERT(m_size >= 0);
+ return n;
+ }
- int remove(const Key &key, const T &value);
+ qsizetype count(const Key &key) const noexcept
+ {
+ auto it = d->find(key);
+ if (it.isUnused())
+ return 0;
+ qsizetype n = 0;
+ Chain *e = it.node()->value;
+ while (e) {
+ ++n;
+ e = e->next;
+ }
- int count(const Key &key, const T &value) const;
+ return n;
+ }
- QList<Key> uniqueKeys() const;
+ qsizetype count(const Key &key, const T &value) const noexcept
+ {
+ auto it = d->find(key);
+ if (it.isUnused())
+ return 0;
+ qsizetype n = 0;
+ Chain *e = it.node()->value;
+ while (e) {
+ if (e->value == value)
+ ++n;
+ e = e->next;
+ }
- QList<T> values(const Key &akey) const;
+ return n;
+ }
- typename QHash<Key, T>::iterator find(const Key &key, const T &value) {
- typename QHash<Key, T>::iterator i(find(key));
- typename QHash<Key, T>::iterator end(this->end());
- while (i != end && i.key() == key) {
- if (i.value() == value)
- return i;
- ++i;
- }
- return end;
+ iterator find(const Key &key, const T &value)
+ {
+ detach();
+ auto it = constFind(key, value);
+ return iterator(it.i, it.e);
}
- typename QHash<Key, T>::const_iterator find(const Key &key, const T &value) const {
- typename QHash<Key, T>::const_iterator i(constFind(key));
- typename QHash<Key, T>::const_iterator end(QHash<Key, T>::constEnd());
+ const_iterator find(const Key &key, const T &value) const noexcept
+ {
+ return constFind(key, value);
+ }
+ const_iterator constFind(const Key &key, const T &value) const noexcept
+ {
+ const_iterator i(constFind(key));
+ const_iterator end(constEnd());
while (i != end && i.key() == key) {
if (i.value() == value)
return i;
@@ -1111,229 +1807,108 @@ public:
}
return end;
}
- typename QHash<Key, T>::const_iterator constFind(const Key &key, const T &value) const
- { return find(key, value); }
-private:
- T &operator[](const Key &key);
- const T operator[](const Key &key) const;
-};
-
-template <class Key, class T>
-Q_INLINE_TEMPLATE typename QHash<Key, T>::iterator QMultiHash<Key, T>::insert(const Key &akey, const T &avalue)
-{
- detach();
- this->d->willGrow();
-
- uint h;
- Node **nextNode = findNode(akey, &h);
- return iterator(createNode(h, akey, avalue, nextNode));
-}
-template <class Key, class T>
-Q_INLINE_TEMPLATE QMultiHash<Key, T> &QMultiHash<Key, T>::unite(const QMultiHash &other)
-{
- if (this->d == &QHashData::shared_null) {
- *this = other;
- } else {
-#if QT_DEPRECATED_SINCE(5, 15)
- QMultiHash copy(other);
- const_iterator it = copy.constEnd();
- while (it != copy.constBegin()) {
- it.i = QHashData::previousNode(it.i);
- insert(it.key(), it.value());
- }
-#else
- const QMultiHash copy(other);
- const_iterator it = copy.cbegin();
- const const_iterator end = copy.cend();
- while (it != end) {
- const auto rangeStart = it++;
- while (it != end && rangeStart.key() == it.key())
- ++it;
- const qint64 last = std::distance(rangeStart, it) - 1;
- for (qint64 i = last; i >= 0; --i) {
- auto next = std::next(rangeStart, i);
- insert(next.key(), next.value());
- }
+ QMultiHash &unite(const QMultiHash &other)
+ {
+ if (isEmpty()) {
+ *this = other;
+ } else if (other.isEmpty()) {
+ ;
+ } else {
+ QMultiHash copy(other);
+ detach();
+ for (auto cit = copy.cbegin(); cit != copy.cend(); ++cit)
+ insert(cit.key(), *cit);
}
-#endif
+ return *this;
}
- return *this;
-}
-
-
-template <class Key, class T>
-Q_INLINE_TEMPLATE bool QMultiHash<Key, T>::contains(const Key &key, const T &value) const
-{
- return constFind(key, value) != QHash<Key, T>::constEnd();
-}
-template <class Key, class T>
-Q_INLINE_TEMPLATE int QMultiHash<Key, T>::remove(const Key &key, const T &value)
-{
- int n = 0;
- typename QHash<Key, T>::iterator i(find(key));
- typename QHash<Key, T>::iterator end(QHash<Key, T>::end());
- while (i != end && i.key() == key) {
- if (i.value() == value) {
- i = this->erase(i);
- ++n;
- } else {
- ++i;
- }
+ QPair<iterator, iterator> equal_range(const Key &key)
+ {
+ detach();
+ auto pair = qAsConst(*this).equal_range(key);
+ return qMakePair(iterator(pair.first.i), iterator(pair.second.i));
}
- return n;
-}
-template <class Key, class T>
-Q_INLINE_TEMPLATE int QMultiHash<Key, T>::count(const Key &key, const T &value) const
-{
- int n = 0;
- typename QHash<Key, T>::const_iterator i(constFind(key));
- typename QHash<Key, T>::const_iterator end(QHash<Key, T>::constEnd());
- while (i != end && i.key() == key) {
- if (i.value() == value)
- ++n;
- ++i;
+ QPair<const_iterator, const_iterator> equal_range(const Key &key) const noexcept
+ {
+ auto it = d->find(key);
+ if (it.isUnused())
+ return qMakePair(end(), end());
+ auto end = it;
+ ++end;
+ return qMakePair(const_iterator(it), const_iterator(end));
}
- return n;
-}
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QList<Key> QMultiHash<Key, T>::uniqueKeys() const
-{
- QList<Key> res;
- res.reserve(QHash<Key, T>::size()); // May be too much, but assume short lifetime
- typename QHash<Key, T>::const_iterator i = QHash<Key, T>::begin();
- if (i != QHash<Key, T>::end()) {
- for (;;) {
- const Key &aKey = i.key();
- res.append(aKey);
- do {
- if (++i == QHash<Key, T>::end())
- goto break_out_of_outer_loop;
- } while (aKey == i.key());
+private:
+ void detach_helper()
+ {
+ if (!d) {
+ d = new Data;
+ return;
}
+ Data *dd = new Data(*d);
+ if (!d->ref.deref())
+ delete d;
+ d = dd;
}
-break_out_of_outer_loop:
- return res;
-}
-
-#if QT_DEPRECATED_SINCE(5, 15)
-
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE typename QHash<Key, T>::iterator QHash<Key, T>::insertMulti(const Key &key, const T &value) {
- return static_cast<QMultiHash<Key, T> *>(this)->insert(key, value);
-}
-
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QHash<Key, T> &QHash<Key, T>::unite(const QHash &other) {
- return static_cast<QMultiHash<Key, T> *>(this)->unite(other);
-}
-
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QList<T> QHash<Key, T>::values(const Key &akey) const
-{
- return static_cast<const QMultiHash<Key, T> *>(this)->values(akey);
-}
-
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::uniqueKeys() const
-{
- return static_cast<const QMultiHash<Key, T> *>(this)->uniqueKeys();
-}
-#endif
-
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QList<T> QMultiHash<Key, T>::values(const Key &akey) const
-{
- QList<T> res;
- Node *node = *findNode(akey);
- if (node != this->e) {
- do {
- res.append(node->value);
- } while ((node = node->next) != this->e && node->key == akey);
- }
- return res;
-}
+};
#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
-template <class Key, class T>
+template<class Key, class T>
class QHashIterator
{
typedef typename QHash<Key, T>::const_iterator const_iterator;
typedef const_iterator Item;
QHash<Key, T> c;
const_iterator i, n;
- inline bool item_exists() const { return n != c.constEnd(); }
+ inline bool item_exists() const noexcept { return n != c.constEnd(); }
public:
- inline QHashIterator(const QHash<Key, T> &container)
+ inline QHashIterator(const QHash<Key, T> &container) noexcept
: c(container), i(c.constBegin()), n(c.constEnd())
- {
- }
- inline QHashIterator &operator=(const QHash<Key, T> &container)
+ { }
+ inline QHashIterator &operator=(const QHash<Key, T> &container) noexcept
{
c = container;
i = c.constBegin();
n = c.constEnd();
return *this;
}
- inline void toFront()
+ inline void toFront() noexcept
{
i = c.constBegin();
n = c.constEnd();
}
- inline void toBack()
+ inline void toBack() noexcept
{
i = c.constEnd();
n = c.constEnd();
}
- inline bool hasNext() const { return i != c.constEnd(); }
- inline Item next()
+ inline bool hasNext() const noexcept { return i != c.constEnd(); }
+ inline Item next() noexcept
{
n = i++;
return n;
}
- inline Item peekNext() const { return i; }
- inline const T &value() const
+ inline Item peekNext() const noexcept { return i; }
+ inline const T &value() const noexcept
{
Q_ASSERT(item_exists());
return *n;
}
- inline const Key &key() const
+ inline const Key &key() const noexcept
{
Q_ASSERT(item_exists());
return n.key();
}
- inline bool findNext(const T &t)
+ inline bool findNext(const T &t) noexcept
{
while ((n = i) != c.constEnd())
if (*i++ == t)
return true;
return false;
}
-#if QT_DEPRECATED_SINCE(5, 15)
- inline QT_DEPRECATED_VERSION_5_15 bool hasPrevious() const { return i != c.constBegin(); }
- inline QT_DEPRECATED_VERSION_5_15 Item previous()
- {
- n = --i;
- return n;
- }
- inline QT_DEPRECATED_VERSION_5_15 Item peekPrevious() const
- {
- const_iterator p = i;
- return --p;
- }
- inline bool QT_DEPRECATED_VERSION_5_15 findPrevious(const T &t)
- {
- while (i != c.constBegin())
- if (*(n = --i) == t)
- return true;
- n = c.constEnd();
- return false;
- }
-#endif
};
template<class Key, class T>
@@ -1344,10 +1919,11 @@ class QMutableHashIterator
typedef iterator Item;
QHash<Key, T> *c;
iterator i, n;
- inline bool item_exists() const { return const_iterator(n) != c->constEnd(); }
+ inline bool item_exists() const noexcept { return const_iterator(n) != c->constEnd(); }
public:
- inline QMutableHashIterator(QHash<Key, T> &container) : c(&container)
+ inline QMutableHashIterator(QHash<Key, T> &container)
+ : c(&container)
{
i = c->begin();
n = c->end();
@@ -1364,18 +1940,18 @@ public:
i = c->begin();
n = c->end();
}
- inline void toBack()
+ inline void toBack() noexcept
{
i = c->end();
n = c->end();
}
- inline bool hasNext() const { return const_iterator(i) != c->constEnd(); }
- inline Item next()
+ inline bool hasNext() const noexcept { return const_iterator(i) != c->constEnd(); }
+ inline Item next() noexcept
{
n = i++;
return n;
}
- inline Item peekNext() const { return i; }
+ inline Item peekNext() const noexcept { return i; }
inline void remove()
{
if (const_iterator(n) != c->constEnd()) {
@@ -1388,54 +1964,33 @@ public:
if (const_iterator(n) != c->constEnd())
*n = t;
}
- inline T &value()
+ inline T &value() noexcept
{
Q_ASSERT(item_exists());
return *n;
}
- inline const T &value() const
+ inline const T &value() const noexcept
{
Q_ASSERT(item_exists());
return *n;
}
- inline const Key &key() const
+ inline const Key &key() const noexcept
{
Q_ASSERT(item_exists());
return n.key();
}
- inline bool findNext(const T &t)
+ inline bool findNext(const T &t) noexcept
{
while (const_iterator(n = i) != c->constEnd())
if (*i++ == t)
return true;
return false;
}
-#if QT_DEPRECATED_SINCE(5, 15)
- inline QT_DEPRECATED_VERSION_5_15 bool hasPrevious() const { return const_iterator(i) != c->constBegin(); }
- inline QT_DEPRECATED_VERSION_5_15 Item previous()
- {
- n = --i;
- return n;
- }
- inline QT_DEPRECATED_VERSION_5_15 Item peekPrevious() const
- {
- iterator p = i;
- return --p;
- }
- inline QT_DEPRECATED_VERSION_5_15 bool findPrevious(const T &t)
- {
- while (const_iterator(i) != c->constBegin())
- if (*(n = --i) == t)
- return true;
- n = c->end();
- return false;
- }
-#endif
};
#endif // !QT_NO_JAVA_STYLE_ITERATORS
template <class Key, class T>
-uint qHash(const QHash<Key, T> &key, uint seed = 0)
+size_t qHash(const QHash<Key, T> &key, size_t seed = 0)
noexcept(noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>())))
{
QtPrivate::QHashCombineCommutative hash;
@@ -1448,7 +2003,7 @@ uint qHash(const QHash<Key, T> &key, uint seed = 0)
}
template <class Key, class T>
-inline uint qHash(const QMultiHash<Key, T> &key, uint seed = 0)
+inline size_t qHash(const QMultiHash<Key, T> &key, size_t seed = 0)
noexcept(noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>())))
{
const QHash<Key, T> &key2 = key;
@@ -1457,8 +2012,4 @@ inline uint qHash(const QMultiHash<Key, T> &key, uint seed = 0)
QT_END_NAMESPACE
-#if defined(Q_CC_MSVC)
-#pragma warning( pop )
-#endif
-
#endif // QHASH_H
diff --git a/src/corelib/tools/qhashfunctions.h b/src/corelib/tools/qhashfunctions.h
index 2ff3464912..ef83682433 100644
--- a/src/corelib/tools/qhashfunctions.h
+++ b/src/corelib/tools/qhashfunctions.h
@@ -68,62 +68,100 @@ class QLatin1String;
Q_CORE_EXPORT int qGlobalQHashSeed();
Q_CORE_EXPORT void qSetGlobalQHashSeed(int newSeed);
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHashBits(const void *p, size_t size, uint seed = 0) noexcept;
-
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(char key, uint seed = 0) noexcept { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(uchar key, uint seed = 0) noexcept { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(signed char key, uint seed = 0) noexcept { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(ushort key, uint seed = 0) noexcept { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(short key, uint seed = 0) noexcept { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(uint key, uint seed = 0) noexcept { return key ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(int key, uint seed = 0) noexcept { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(ulong key, uint seed = 0) noexcept
+namespace QHashPrivate {
+
+Q_DECL_CONST_FUNCTION constexpr size_t hash(size_t key, size_t seed) noexcept
+{
+ key ^= seed;
+ if constexpr (sizeof(size_t) == 4) {
+ key ^= key >> 16;
+ key *= UINT32_C(0x45d9f3b);
+ key ^= key >> 16;
+ key *= UINT32_C(0x45d9f3b);
+ key ^= key >> 16;
+ return key;
+ } else {
+ quint64 key64 = key;
+ key64 ^= key64 >> 32;
+ key64 *= UINT64_C(0xd6e8feb86659fd93);
+ key64 ^= key64 >> 32;
+ key64 *= UINT64_C(0xd6e8feb86659fd93);
+ key64 ^= key64 >> 32;
+ return size_t(key64);
+ }
+}
+
+}
+
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHashBits(const void *p, size_t size, size_t seed = 0) noexcept;
+
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline size_t qHash(char key, size_t seed = 0) noexcept
+{ return QHashPrivate::hash(size_t(key), seed); }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline size_t qHash(uchar key, size_t seed = 0) noexcept
+{ return QHashPrivate::hash(size_t(key), seed); }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline size_t qHash(signed char key, size_t seed = 0) noexcept
+{ return QHashPrivate::hash(size_t(key), seed); }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline size_t qHash(ushort key, size_t seed = 0) noexcept
+{ return QHashPrivate::hash(size_t(key), seed); }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline size_t qHash(short key, size_t seed = 0) noexcept
+{ return QHashPrivate::hash(size_t(key), seed); }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline size_t qHash(uint key, size_t seed = 0) noexcept
+{ return QHashPrivate::hash(size_t(key), seed); }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline size_t qHash(int key, size_t seed = 0) noexcept
+{ return QHashPrivate::hash(size_t(key), seed); }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline size_t qHash(ulong key, size_t seed = 0) noexcept
+{ return QHashPrivate::hash(size_t(key), seed); }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline size_t qHash(long key, size_t seed = 0) noexcept
+{ return QHashPrivate::hash(size_t(key), seed); }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline size_t qHash(quint64 key, size_t seed = 0) noexcept
{
- return (sizeof(ulong) > sizeof(uint))
- ? (uint(((key >> (8 * sizeof(uint) - 1)) ^ key) & (~0U)) ^ seed)
- : (uint(key & (~0U)) ^ seed);
+ if (sizeof(quint64) > sizeof(size_t))
+ key ^= (key >> 32);
+ return QHashPrivate::hash(size_t(key), seed);
}
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(long key, uint seed = 0) noexcept { return qHash(ulong(key), seed); }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(quint64 key, uint seed = 0) noexcept
+Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(qint64 key, size_t seed = 0) noexcept { return qHash(quint64(key), seed); }
+Q_DECL_CONST_FUNCTION inline size_t qHash(float key, size_t seed = 0) noexcept
{
- return uint(((key >> (8 * sizeof(uint) - 1)) ^ key) & (~0U)) ^ seed;
+ // ensure -0 gets mapped to 0
+ key += 0.0f;
+ uint k;
+ memcpy(&k, &key, sizeof(float));
+ return QHashPrivate::hash(k, seed);
}
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(qint64 key, uint seed = 0) noexcept { return qHash(quint64(key), seed); }
-Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(float key, uint seed = 0) noexcept;
-Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(double key, uint seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_CONST_FUNCTION size_t qHash(double key, size_t seed = 0) noexcept;
#if !defined(Q_OS_DARWIN) || defined(Q_CLANG_QDOC)
-Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(long double key, uint seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_CONST_FUNCTION size_t qHash(long double key, size_t seed = 0) noexcept;
#endif
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(const QChar key, uint seed = 0) noexcept { return qHash(key.unicode(), seed); }
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QByteArray &key, uint seed = 0) noexcept;
+Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(const QChar key, size_t seed = 0) noexcept { return qHash(key.unicode(), seed); }
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QByteArray &key, size_t seed = 0) noexcept;
#if QT_STRINGVIEW_LEVEL < 2
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QString &key, uint seed = 0) noexcept;
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QStringRef &key, uint seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QString &key, size_t seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QStringRef &key, size_t seed = 0) noexcept;
#endif
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(QStringView key, uint seed = 0) noexcept;
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QBitArray &key, uint seed = 0) noexcept;
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(QLatin1String key, uint seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(QStringView key, size_t seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QBitArray &key, size_t seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(QLatin1String key, size_t seed = 0) noexcept;
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qt_hash(QStringView key, uint chained = 0) noexcept;
-Q_DECL_CONST_FUNCTION inline uint qHash(std::nullptr_t, uint seed = 0) noexcept
+Q_DECL_CONST_FUNCTION constexpr inline size_t qHash(std::nullptr_t, size_t seed = 0) noexcept
{
- return qHash(reinterpret_cast<quintptr>(nullptr), seed);
+ return seed;
}
-template <class T> inline uint qHash(const T *key, uint seed = 0) noexcept
+template <class T> inline size_t qHash(const T *key, size_t seed = 0) noexcept
{
return qHash(reinterpret_cast<quintptr>(key), seed);
}
-template<typename T> inline uint qHash(const T &t, uint seed)
+template<typename T> inline size_t qHash(const T &t, size_t seed)
noexcept(noexcept(qHash(t)))
{ return qHash(t) ^ seed; }
namespace QtPrivate {
struct QHashCombine {
- typedef uint result_type;
+ typedef size_t result_type;
template <typename T>
- Q_DECL_CONSTEXPR result_type operator()(uint seed, const T &t) const noexcept(noexcept(qHash(t)))
+ constexpr result_type operator()(size_t seed, const T &t) const noexcept(noexcept(qHash(t)))
// combiner taken from N3876 / boost::hash_combine
{ return seed ^ (qHash(t) + 0x9e3779b9 + (seed << 6) + (seed >> 2)) ; }
};
@@ -134,37 +172,38 @@ struct QHashCombineCommutative {
// usually what we want: {0,1,3} should hash differently than
// {1,3,0}. Except when it isn't (e.g. for QSet and
// QHash). Therefore, provide a commutative combiner, too.
- typedef uint result_type;
+ typedef size_t result_type;
template <typename T>
- Q_DECL_CONSTEXPR result_type operator()(uint seed, const T &t) const noexcept(noexcept(qHash(t)))
+ constexpr result_type operator()(size_t seed, const T &t) const noexcept(noexcept(qHash(t)))
{ return seed + qHash(t); } // don't use xor!
};
} // namespace QtPrivate
template <typename InputIterator>
-inline uint qHashRange(InputIterator first, InputIterator last, uint seed = 0)
+inline size_t qHashRange(InputIterator first, InputIterator last, size_t seed = 0)
noexcept(noexcept(qHash(*first))) // assume iterator operations don't throw
{
return std::accumulate(first, last, seed, QtPrivate::QHashCombine());
}
template <typename InputIterator>
-inline uint qHashRangeCommutative(InputIterator first, InputIterator last, uint seed = 0)
+inline size_t qHashRangeCommutative(InputIterator first, InputIterator last, size_t seed = 0)
noexcept(noexcept(qHash(*first))) // assume iterator operations don't throw
{
return std::accumulate(first, last, seed, QtPrivate::QHashCombineCommutative());
}
-template <typename T1, typename T2> inline uint qHash(const QPair<T1, T2> &key, uint seed = 0)
+template <typename T1, typename T2> inline size_t qHash(const QPair<T1, T2> &key, size_t seed = 0)
noexcept(noexcept(qHash(key.first, seed)) && noexcept(qHash(key.second, seed)))
{
- uint h1 = qHash(key.first, seed);
- uint h2 = qHash(key.second, seed);
- return ((h1 << 16) | (h1 >> 16)) ^ h2 ^ seed;
+ QtPrivate::QHashCombine hash;
+ seed = hash(seed, key.first);
+ seed = hash(seed, key.second);
+ return seed;
}
-template <typename T1, typename T2> inline uint qHash(const std::pair<T1, T2> &key, uint seed = 0)
+template <typename T1, typename T2> inline size_t qHash(const std::pair<T1, T2> &key, size_t seed = 0)
noexcept(noexcept(qHash(key.first, seed)) && noexcept(qHash(key.second, seed)))
{
QtPrivate::QHashCombine hash;
diff --git a/src/corelib/tools/qiterator.qdoc b/src/corelib/tools/qiterator.qdoc
index 273370e797..9efc1bb48a 100644
--- a/src/corelib/tools/qiterator.qdoc
+++ b/src/corelib/tools/qiterator.qdoc
@@ -210,55 +210,6 @@
*/
/*!
- \class QLinkedListIterator
- \inmodule QtCore
- \obsolete
-
- \brief The QLinkedListIterator class provides a Java-style const iterator for QLinkedList.
-
- QLinkedList has both \l{Java-style iterators} and
- \l{STL-style iterators}. The Java-style iterators are more
- high-level and easier to use than the STL-style iterators; on the
- other hand, they are slightly less efficient.
-
- QLinkedListIterator\<T\> allows you to iterate over a
- QLinkedList\<T\>. If you want to modify the list as you iterate
- over it, use QMutableLinkedListIterator\<T\> instead.
-
- The QLinkedListIterator constructor takes a QLinkedList as
- argument. After construction, the iterator is located at the very
- beginning of the list (before the first item). Here's how to
- iterate over all the elements sequentially:
-
- \snippet code/doc_src_qiterator.cpp 2
-
- The next() function returns the next item in the list and
- advances the iterator. Unlike STL-style iterators, Java-style
- iterators point \e between items rather than directly \e at
- items. The first call to next() advances the iterator to the
- position between the first and second item, and returns the first
- item; the second call to next() advances the iterator to the
- position between the second and third item, and returns the second
- item; and so on.
-
- \image javaiterators1.png
-
- Here's how to iterate over the elements in reverse order:
-
- \snippet code/doc_src_qiterator.cpp 3
-
- If you want to find all occurrences of a particular value, use
- findNext() or findPrevious() in a loop.
-
- Multiple iterators can be used on the same list. If the list is
- modified while a QLinkedListIterator is active, the
- QLinkedListIterator will continue iterating over the original
- list, ignoring the modified copy.
-
- \sa QMutableLinkedListIterator, QLinkedList::const_iterator
-*/
-
-/*!
\class QVectorIterator
\inmodule QtCore
\brief The QVectorIterator class provides a Java-style const iterator for QVector and QStack.
@@ -424,68 +375,6 @@
*/
/*!
- \class QMutableLinkedListIterator
- \inmodule QtCore
- \obsolete
-
- \brief The QMutableLinkedListIterator class provides a Java-style non-const iterator for QLinkedList.
-
- QLinkedList has both \l{Java-style iterators} and
- \l{STL-style iterators}. The Java-style iterators are more
- high-level and easier to use than the STL-style iterators; on the
- other hand, they are slightly less efficient.
-
- QMutableLinkedListIterator\<T\> allows you to iterate over a
- QLinkedList\<T\> and modify the list. If you don't want to modify
- the list (or have a const QLinkedList), use the slightly faster
- QLinkedListIterator\<T\> instead.
-
- The QMutableLinkedListIterator constructor takes a QLinkedList as
- argument. After construction, the iterator is located at the very
- beginning of the list (before the first item). Here's how to
- iterate over all the elements sequentially:
-
- \snippet code/doc_src_qiterator.cpp 11
-
- The next() function returns the next item in the list and
- advances the iterator. Unlike STL-style iterators, Java-style
- iterators point \e between items rather than directly \e at
- items. The first call to next() advances the iterator to the
- position between the first and second item, and returns the first
- item; the second call to next() advances the iterator to the
- position between the second and third item, returning the second
- item; and so on.
-
- \image javaiterators1.png
-
- Here's how to iterate over the elements in reverse order:
-
- \snippet code/doc_src_qiterator.cpp 12
-
- If you want to find all occurrences of a particular value, use
- findNext() or findPrevious() in a loop.
-
- If you want to remove items as you iterate over the list, use
- remove(). If you want to modify the value of an item, use
- setValue(). If you want to insert a new item in the list, use
- insert().
-
- Example:
- \snippet code/doc_src_qiterator.cpp 13
-
- The example traverses a list, replacing negative numbers with
- their absolute values, and eliminating zeroes.
-
- Only one mutable iterator can be active on a given list at any
- time. Furthermore, no changes should be done directly to the list
- while the iterator is active (as opposed to through the
- iterator), since this could invalidate the iterator and lead to
- undefined behavior.
-
- \sa QLinkedListIterator, QLinkedList::iterator
-*/
-
-/*!
\class QMutableVectorIterator
\inmodule QtCore
@@ -604,9 +493,7 @@
/*!
\fn template <class T> QListIterator<T>::QListIterator(const QList<T> &list)
- \fn template <class T> QLinkedListIterator<T>::QLinkedListIterator(const QLinkedList<T> &list)
\fn template <class T> QMutableListIterator<T>::QMutableListIterator(QList<T> &list)
- \fn template <class T> QMutableLinkedListIterator<T>::QMutableLinkedListIterator(QLinkedList<T> &list)
Constructs an iterator for traversing \a list. The iterator is
set to be at the front of the list (before the first item).
@@ -635,9 +522,7 @@
*/
/*! \fn template <class T> QMutableListIterator &QMutableListIterator<T>::operator=(QList<T> &list)
- \fn template <class T> QMutableLinkedListIterator &QMutableLinkedListIterator<T>::operator=(QLinkedList<T> &list)
\fn template <class T> QListIterator &QListIterator<T>::operator=(const QList<T> &list)
- \fn template <class T> QLinkedListIterator &QLinkedListIterator<T>::operator=(const QLinkedList<T> &list)
Makes the iterator operate on \a list. The iterator is set to be
at the front of the list (before the first item).
@@ -664,11 +549,9 @@
*/
/*! \fn template <class T> void QListIterator<T>::toFront()
- \fn template <class T> void QLinkedListIterator<T>::toFront()
\fn template <class T> void QVectorIterator<T>::toFront()
\fn template <class T> void QSetIterator<T>::toFront()
\fn template <class T> void QMutableListIterator<T>::toFront()
- \fn template <class T> void QMutableLinkedListIterator<T>::toFront()
\fn template <class T> void QMutableVectorIterator<T>::toFront()
\fn template <class T> void QMutableSetIterator<T>::toFront()
@@ -679,11 +562,9 @@
*/
/*! \fn template <class T> void QListIterator<T>::toBack()
- \fn template <class T> void QLinkedListIterator<T>::toBack()
\fn template <class T> void QVectorIterator<T>::toBack()
\fn template <class T> void QSetIterator<T>::toBack()
\fn template <class T> void QMutableListIterator<T>::toBack()
- \fn template <class T> void QMutableLinkedListIterator<T>::toBack()
\fn template <class T> void QMutableVectorIterator<T>::toBack()
\fn template <class T> void QMutableSetIterator<T>::toBack()
@@ -694,11 +575,9 @@
*/
/*! \fn template <class T> bool QListIterator<T>::hasNext() const
- \fn template <class T> bool QLinkedListIterator<T>::hasNext() const
\fn template <class T> bool QVectorIterator<T>::hasNext() const
\fn template <class T> bool QSetIterator<T>::hasNext() const
\fn template <class T> bool QMutableListIterator<T>::hasNext() const
- \fn template <class T> bool QMutableLinkedListIterator<T>::hasNext() const
\fn template <class T> bool QMutableVectorIterator<T>::hasNext() const
\fn template <class T> bool QMutableSetIterator<T>::hasNext() const
@@ -710,7 +589,6 @@
*/
/*! \fn template <class T> const T &QListIterator<T>::next()
- \fn template <class T> const T &QLinkedListIterator<T>::next()
\fn template <class T> const T &QVectorIterator<T>::next()
\fn template <class T> const T &QSetIterator<T>::next()
\fn template <class T> const T &QMutableSetIterator<T>::next()
@@ -724,7 +602,6 @@
*/
/*! \fn template <class T> T &QMutableListIterator<T>::next()
- \fn template <class T> T &QMutableLinkedListIterator<T>::next()
\fn template <class T> T &QMutableVectorIterator<T>::next()
Returns a reference to the next item, and advances the iterator
@@ -737,7 +614,6 @@
*/
/*! \fn template <class T> const T &QListIterator<T>::peekNext() const
- \fn template <class T> const T &QLinkedListIterator<T>::peekNext() const
\fn template <class T> const T &QVectorIterator<T>::peekNext() const
\fn template <class T> const T &QSetIterator<T>::peekNext() const
\fn template <class T> const T &QMutableSetIterator<T>::peekNext() const
@@ -751,7 +627,6 @@
*/
/*! \fn template <class T> T &QMutableListIterator<T>::peekNext() const
- \fn template <class T> T &QMutableLinkedListIterator<T>::peekNext() const
\fn template <class T> T &QMutableVectorIterator<T>::peekNext() const
Returns a reference to the next item, without moving the iterator.
@@ -774,11 +649,9 @@
*/
/*! \fn template <class T> bool QListIterator<T>::hasPrevious() const
- \fn template <class T> bool QLinkedListIterator<T>::hasPrevious() const
\fn template <class T> bool QVectorIterator<T>::hasPrevious() const
\fn template <class T> bool QSetIterator<T>::hasPrevious() const
\fn template <class T> bool QMutableListIterator<T>::hasPrevious() const
- \fn template <class T> bool QMutableLinkedListIterator<T>::hasPrevious() const
\fn template <class T> bool QMutableVectorIterator<T>::hasPrevious() const
Returns \c true if there is at least one item behind the iterator,
@@ -802,7 +675,6 @@
*/
/*! \fn template <class T> const T &QListIterator<T>::previous()
- \fn template <class T> const T &QLinkedListIterator<T>::previous()
\fn template <class T> const T &QVectorIterator<T>::previous()
\fn template <class T> const T &QSetIterator<T>::previous()
@@ -816,7 +688,6 @@
*/
/*! \fn template <class T> T &QMutableListIterator<T>::previous()
- \fn template <class T> T &QMutableLinkedListIterator<T>::previous()
\fn template <class T> T &QMutableVectorIterator<T>::previous()
Returns a reference to the previous item and moves the iterator
@@ -841,7 +712,6 @@
*/
/*! \fn template <class T> const T &QListIterator<T>::peekPrevious() const
- \fn template <class T> const T &QLinkedListIterator<T>::peekPrevious() const
\fn template <class T> const T &QVectorIterator<T>::peekPrevious() const
\fn template <class T> const T &QSetIterator<T>::peekPrevious() const
@@ -854,7 +724,6 @@
*/
/*! \fn template <class T> T &QMutableListIterator<T>::peekPrevious() const
- \fn template <class T> T &QMutableLinkedListIterator<T>::peekPrevious() const
\fn template <class T> T &QMutableVectorIterator<T>::peekPrevious() const
Returns a reference to the previous item, without moving the iterator.
@@ -880,11 +749,9 @@
*/
/*! \fn template <class T> bool QListIterator<T>::findNext(const T &value)
- \fn template <class T> bool QLinkedListIterator<T>::findNext(const T &value)
\fn template <class T> bool QVectorIterator<T>::findNext(const T &value)
\fn template <class T> bool QSetIterator<T>::findNext(const T &value)
\fn template <class T> bool QMutableListIterator<T>::findNext(const T &value)
- \fn template <class T> bool QMutableLinkedListIterator<T>::findNext(const T &value)
\fn template <class T> bool QMutableVectorIterator<T>::findNext(const T &value)
Searches for \a value starting from the current iterator position
@@ -898,11 +765,9 @@
*/
/*! \fn template <class T> bool QListIterator<T>::findPrevious(const T &value)
- \fn template <class T> bool QLinkedListIterator<T>::findPrevious(const T &value)
\fn template <class T> bool QVectorIterator<T>::findPrevious(const T &value)
\fn template <class T> bool QSetIterator<T>::findPrevious(const T &value)
\fn template <class T> bool QMutableListIterator<T>::findPrevious(const T &value)
- \fn template <class T> bool QMutableLinkedListIterator<T>::findPrevious(const T &value)
\fn template <class T> bool QMutableVectorIterator<T>::findPrevious(const T &value)
\fn template <class T> bool QMutableSetIterator<T>::findPrevious(const T &value)
@@ -928,17 +793,6 @@
\sa insert(), setValue()
*/
-/*! \fn template <class T> void QMutableLinkedListIterator<T>::remove()
-
- Removes the last item that was jumped over using one of the
- traversal functions (next(), previous(), findNext(), findPrevious()).
-
- Example:
- \snippet code/doc_src_qiterator.cpp 20
-
- \sa insert(), setValue()
-*/
-
/*! \fn template <class T> void QMutableVectorIterator<T>::remove()
Removes the last item that was jumped over using one of the
@@ -975,20 +829,6 @@
\sa value(), remove(), insert()
*/
-/*! \fn template <class T> void QMutableLinkedListIterator<T>::setValue(const T &value) const
-
- Replaces the value of the last item that was jumped over using
- one of the traversal functions with \a value.
-
- The traversal functions are next(), previous(), findNext(), and
- findPrevious().
-
- Example:
- \snippet code/doc_src_qiterator.cpp 24
-
- \sa value(), remove(), insert()
-*/
-
/*! \fn template <class T> void QMutableVectorIterator<T>::setValue(const T &value) const
Replaces the value of the last item that was jumped over using
@@ -1004,7 +844,6 @@
*/
/*! \fn template <class T> const T &QMutableListIterator<T>::value() const
- \fn template <class T> const T &QMutableLinkedListIterator<T>::value() const
\fn template <class T> const T &QMutableVectorIterator<T>::value() const
\fn template <class T> const T &QMutableSetIterator<T>::value() const
@@ -1019,7 +858,6 @@
/*!
\fn template <class T> T &QMutableListIterator<T>::value()
- \fn template <class T> T &QMutableLinkedListIterator<T>::value()
\fn template <class T> T &QMutableVectorIterator<T>::value()
\overload
@@ -1028,7 +866,6 @@
*/
/*! \fn template <class T> void QMutableListIterator<T>::insert(const T &value)
- \fn template <class T> void QMutableLinkedListIterator<T>::insert(const T &value)
\fn template <class T> void QMutableVectorIterator<T>::insert(const T &value)
Inserts \a value at the current iterator position. After the
diff --git a/src/corelib/tools/qlinkedlist.cpp b/src/corelib/tools/qlinkedlist.cpp
deleted file mode 100644
index 6a423545da..0000000000
--- a/src/corelib/tools/qlinkedlist.cpp
+++ /dev/null
@@ -1,1238 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifdef QT_NO_LINKED_LIST
-# undef QT_NO_LINKED_LIST
-#endif
-
-#include "qlinkedlist.h"
-
-QT_BEGIN_NAMESPACE
-
-#if QT_DEPRECATED_SINCE(5, 15)
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-const QLinkedListData QLinkedListData::shared_null = {
- const_cast<QLinkedListData *>(&QLinkedListData::shared_null),
- const_cast<QLinkedListData *>(&QLinkedListData::shared_null),
- Q_REFCOUNT_INITIALIZE_STATIC, 0, true
-};
-
-/*! \class QLinkedList
- \inmodule QtCore
- \obsolete
- \brief The QLinkedList class is a template class that provides linked lists.
-
- \ingroup tools
- \ingroup shared
-
- \reentrant
-
- \note This class is obsolete, please use std::list instead.
-
- QLinkedList\<T\> is one of Qt's generic \l{container classes}. It
- stores a list of values and provides iterator-based access as
- well as \l{constant time} insertions and removals.
-
- QList\<T\>, QLinkedList\<T\>, and QVector\<T\> provide similar
- functionality. Here's an overview:
-
- \list
- \li For most purposes, QList is the right class to use. Its
- index-based API is more convenient than QLinkedList's
- iterator-based API, and it is usually faster than
- QVector because of the way it stores its items in
- memory (see \l{Algorithmic Complexity} for details).
- It also expands to less code in your executable.
- \li If you need a real linked list, with guarantees of \l{constant
- time} insertions in the middle of the list and iterators to
- items rather than indexes, use QLinkedList.
- \li If you want the items to occupy adjacent memory positions,
- use QVector.
- \endlist
-
- Here's an example of a QLinkedList that stores integers and a
- QLinkedList that stores QTime values:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 0
-
- QLinkedList stores a list of items. The default constructor
- creates an empty list. To insert items into the list, you can use
- operator<<():
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 1
-
- If you want to get the first or last item in a linked list, use
- first() or last(). If you want to remove an item from either end
- of the list, use removeFirst() or removeLast(). If you want to
- remove all occurrences of a given value in the list, use
- removeAll().
-
- A common requirement is to remove the first or last item in the
- list and do something with it. For this, QLinkedList provides
- takeFirst() and takeLast(). Here's a loop that removes the items
- from a list one at a time and calls \c delete on them:
- \snippet code/src_corelib_tools_qlinkedlist.cpp 2
-
- QLinkedList's value type must be an \l {assignable data type}. This
- covers most data types that are commonly used, but the compiler
- won't let you, for example, store a QWidget as a value; instead,
- store a QWidget *. A few functions have additional requirements;
- for example, contains() and removeAll() expect the value type to
- support \c operator==(). These requirements are documented on a
- per-function basis.
-
- If you want to insert, modify, or remove items in the middle of
- the list, you must use an iterator. QLinkedList provides both
- \l{Java-style iterators} (QLinkedListIterator and
- QMutableLinkedListIterator) and \l{STL-style iterators}
- (QLinkedList::const_iterator and QLinkedList::iterator). See the
- documentation for these classes for details.
-
- \sa QLinkedListIterator, QMutableLinkedListIterator, QList, QVector
-*/
-
-/*! \fn template <class T> QLinkedList<T>::QLinkedList()
-
- Constructs an empty list.
-*/
-
-/*!
- \fn template <class T> QLinkedList<T>::QLinkedList(QLinkedList<T> &&other)
-
- Move-constructs a QLinkedList instance, making it point at the same
- object that \a other was pointing to.
-
- \since 5.2
-*/
-
-/*! \fn template <class T> QLinkedList<T>::QLinkedList(const QLinkedList<T> &other)
-
- Constructs a copy of \a other.
-
- This operation occurs in \l{constant time}, because QLinkedList
- is \l{implicitly shared}. This makes returning a QLinkedList from
- a function very fast. If a shared instance is modified, it will
- be copied (copy-on-write), and this takes \l{linear time}.
-
- \sa operator=()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::QLinkedList(std::initializer_list<T> list)
- \since 5.2
-
- Constructs a list from the std::initializer_list specified by \a list.
-
- This constructor is only enabled if the compiler supports C++11
- initializer lists.
-*/
-
-/*! \fn template <class T> template<typename InputIterator> QLinkedList<T>::QLinkedList(InputIterator first, InputIterator last)
- \since 5.14
-
- Constructs a list with the contents in the iterator range [\a first, \a last).
-
- The value type of \c InputIterator must be convertible to \c T.
-*/
-
-/*! \fn template <class T> QLinkedList<T>::~QLinkedList()
-
- Destroys the list. References to the values in the list, and all
- iterators over this list, become invalid.
-*/
-
-/*! \fn template <class T> QLinkedList<T> &QLinkedList<T>::operator=(const QLinkedList<T> &other)
-
- Assigns \a other to this list and returns a reference to this
- list.
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::swap(QLinkedList<T> &other)
- \since 4.8
-
- Swaps list \a other with this list. This operation is very
- fast and never fails.
-*/
-
-/*! \fn template <class T> bool QLinkedList<T>::operator==(const QLinkedList<T> &other) const
-
- Returns \c true if \a other is equal to this list; otherwise returns
- false.
-
- Two lists are considered equal if they contain the same values in
- the same order.
-
- This function requires the value type to implement \c
- operator==().
-
- \sa operator!=()
-*/
-
-/*! \fn template <class T> bool QLinkedList<T>::operator!=(const QLinkedList<T> &other) const
-
- Returns \c true if \a other is not equal to this list; otherwise
- returns \c false.
-
- Two lists are considered equal if they contain the same values in
- the same order.
-
- This function requires the value type to implement \c
- operator==().
-
- \sa operator==()
-*/
-
-/*! \fn template <class T> int QLinkedList<T>::size() const
-
- Returns the number of items in the list.
-
- \sa isEmpty(), count()
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::detach()
-
- \internal
-*/
-
-/*! \fn template <class T> bool QLinkedList<T>::isDetached() const
-
- \internal
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::setSharable(bool sharable)
-
- \internal
-*/
-
-/*! \fn template <class T> bool QLinkedList<T>::isSharedWith(const QLinkedList<T> &other) const
-
- \internal
-*/
-
-/*! \fn template <class T> bool QLinkedList<T>::isEmpty() const
-
- Returns \c true if the list contains no items; otherwise returns
- false.
-
- \sa size()
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::clear()
-
- Removes all the items in the list.
-
- \sa removeAll()
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::append(const T &value)
-
- Inserts \a value at the end of the list.
-
- Example:
- \snippet code/src_corelib_tools_qlinkedlist.cpp 3
-
- This is the same as list.insert(end(), \a value).
-
- \sa operator<<(), prepend(), insert()
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::prepend(const T &value)
-
- Inserts \a value at the beginning of the list.
-
- Example:
- \snippet code/src_corelib_tools_qlinkedlist.cpp 4
-
- This is the same as list.insert(begin(), \a value).
-
- \sa append(), insert()
-*/
-
-/*! \fn template <class T> int QLinkedList<T>::removeAll(const T &value)
-
- Removes all occurrences of \a value in the list.
-
- Example:
- \snippet code/src_corelib_tools_qlinkedlist.cpp 5
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- \sa insert()
-*/
-
-/*!
- \fn template <class T> bool QLinkedList<T>::removeOne(const T &value)
- \since 4.4
-
- Removes the first occurrences of \a value in the list. Returns \c true on
- success; otherwise returns \c false.
-
- Example:
- \snippet code/src_corelib_tools_qlinkedlist.cpp 6
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- \sa insert()
-*/
-
-/*! \fn template <class T> bool QLinkedList<T>::contains(const T &value) const
-
- Returns \c true if the list contains an occurrence of \a value;
- otherwise returns \c false.
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- \sa QLinkedListIterator::findNext(), QLinkedListIterator::findPrevious()
-*/
-
-/*! \fn template <class T> int QLinkedList<T>::count(const T &value) const
-
- Returns the number of occurrences of \a value in the list.
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- \sa contains()
-*/
-
-/*! \fn template <class T> bool QLinkedList<T>::startsWith(const T &value) const
- \since 4.5
-
- Returns \c true if the list is not empty and its first
- item is equal to \a value; otherwise returns \c false.
-
- \sa isEmpty(), first()
-*/
-
-/*! \fn template <class T> bool QLinkedList<T>::endsWith(const T &value) const
- \since 4.5
-
- Returns \c true if the list is not empty and its last
- item is equal to \a value; otherwise returns \c false.
-
- \sa isEmpty(), last()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator QLinkedList<T>::begin()
-
- Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in
- the list.
-
- \sa constBegin(), end()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator QLinkedList<T>::begin() const
-
- \overload
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator QLinkedList<T>::cbegin() const
- \since 5.0
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
- in the list.
-
- \sa begin(), cend()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator QLinkedList<T>::constBegin() const
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
- in the list.
-
- \sa begin(), constEnd()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator QLinkedList<T>::end()
-
- Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item
- after the last item in the list.
-
- \sa begin(), constEnd()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator QLinkedList<T>::end() const
-
- \overload
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator QLinkedList<T>::cend() const
- \since 5.0
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- item after the last item in the list.
-
- \sa cbegin(), end()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator QLinkedList<T>::constEnd() const
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- item after the last item in the list.
-
- \sa constBegin(), end()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::reverse_iterator QLinkedList<T>::rbegin()
- \since 5.6
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- item in the list, in reverse order.
-
- \sa begin(), crbegin(), rend()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_reverse_iterator QLinkedList<T>::rbegin() const
- \since 5.6
- \overload
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_reverse_iterator QLinkedList<T>::crbegin() const
- \since 5.6
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- item in the list, in reverse order.
-
- \sa begin(), rbegin(), rend()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::reverse_iterator QLinkedList<T>::rend()
- \since 5.6
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last item in the list, in reverse order.
-
- \sa end(), crend(), rbegin()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_reverse_iterator QLinkedList<T>::rend() const
- \since 5.6
- \overload
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_reverse_iterator QLinkedList<T>::crend() const
- \since 5.6
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to one
- past the last item in the list, in reverse order.
-
- \sa end(), rend(), rbegin()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator QLinkedList<T>::insert(iterator before, const T &value)
-
- Inserts \a value in front of the item pointed to by the iterator
- \a before. Returns an iterator pointing at the inserted item.
-
- \sa erase()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator QLinkedList<T>::erase(iterator pos)
-
- Removes the item pointed to by the iterator \a pos from the list,
- and returns an iterator to the next item in the list (which may be
- end()).
-
- \sa insert()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator QLinkedList<T>::erase(iterator begin, iterator end)
-
- \overload
-
- Removes all the items from \a begin up to (but not including) \a
- end.
-*/
-
-/*! \typedef QLinkedList::Iterator
-
- Qt-style synonym for QLinkedList::iterator.
-*/
-
-/*! \typedef QLinkedList::ConstIterator
-
- Qt-style synonym for QLinkedList::const_iterator.
-*/
-
-/*! \typedef QLinkedList::reverse_iterator
- \since 5.6
-
- The QLinkedList::reverse_iterator typedef provides an STL-style non-const
- reverse iterator for QLinkedList.
-
- It is simply a typedef for \c{std::reverse_iterator<QLinkedList::iterator>}.
-
- \warning Iterators on implicitly shared containers do not work
- exactly like STL-iterators. You should avoid copying a container
- while iterators are active on that container. For more information,
- read \l{Implicit sharing iterator problem}.
-
- \sa QLinkedList::rbegin(), QLinkedList::rend(), QLinkedList::const_reverse_iterator, QLinkedList::iterator
-*/
-
-/*! \typedef QLinkedList::const_reverse_iterator
- \since 5.6
-
- The QLinkedList::const_reverse_iterator typedef provides an STL-style const
- reverse iterator for QLinkedList.
-
- It is simply a typedef for \c{std::reverse_iterator<QLinkedList::const_iterator>}.
-
- \warning Iterators on implicitly shared containers do not work
- exactly like STL-iterators. You should avoid copying a container
- while iterators are active on that container. For more information,
- read \l{Implicit sharing iterator problem}.
-
- \sa QLinkedList::rbegin(), QLinkedList::rend(), QLinkedList::reverse_iterator, QLinkedList::const_iterator
-*/
-
-/*!
- \typedef QLinkedList::size_type
-
- Typedef for int. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QLinkedList::value_type
-
- Typedef for T. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QLinkedList::pointer
-
- Typedef for T *. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QLinkedList::const_pointer
-
- Typedef for const T *. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QLinkedList::reference
-
- Typedef for T &. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QLinkedList::const_reference
-
- Typedef for const T &. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QLinkedList::difference_type
-
- Typedef for ptrdiff_t. Provided for STL compatibility.
-*/
-
-/*! \fn template <class T> int QLinkedList<T>::count() const
-
- Same as size().
-*/
-
-/*! \fn template <class T> T& QLinkedList<T>::first()
-
- Returns a reference to the first item in the list. This function
- assumes that the list isn't empty.
-
- \sa last(), isEmpty()
-*/
-
-/*! \fn template <class T> const T& QLinkedList<T>::first() const
-
- \overload
-*/
-
-/*! \fn template <class T> T& QLinkedList<T>::last()
-
- Returns a reference to the last item in the list. This function
- assumes that the list isn't empty.
-
- \sa first(), isEmpty()
-*/
-
-/*! \fn template <class T> const T& QLinkedList<T>::last() const
-
- \overload
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::removeFirst()
-
- Removes the first item in the list.
-
- This is the same as erase(begin()).
-
- \sa removeLast(), erase()
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::removeLast()
-
- Removes the last item in the list.
-
- \sa removeFirst(), erase()
-*/
-
-/*! \fn template <class T> T QLinkedList<T>::takeFirst()
-
- Removes the first item in the list and returns it.
-
- If you don't use the return value, removeFirst() is more
- efficient.
-
- \sa takeLast(), removeFirst()
-*/
-
-/*! \fn template <class T> T QLinkedList<T>::takeLast()
-
- Removes the last item in the list and returns it.
-
- If you don't use the return value, removeLast() is more
- efficient.
-
- \sa takeFirst(), removeLast()
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::push_back(const T &value)
-
- This function is provided for STL compatibility. It is equivalent
- to append(\a value).
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::push_front(const T &value)
-
- This function is provided for STL compatibility. It is equivalent
- to prepend(\a value).
-*/
-
-/*! \fn template <class T> T& QLinkedList<T>::front()
-
- This function is provided for STL compatibility. It is equivalent
- to first().
-*/
-
-/*! \fn template <class T> const T& QLinkedList<T>::front() const
-
- \overload
-*/
-
-/*! \fn template <class T> T& QLinkedList<T>::back()
-
- This function is provided for STL compatibility. It is equivalent
- to last().
-*/
-
-/*! \fn template <class T> const T& QLinkedList<T>::back() const
-
- \overload
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::pop_front()
-
- This function is provided for STL compatibility. It is equivalent
- to removeFirst().
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::pop_back()
-
- This function is provided for STL compatibility. It is equivalent
- to removeLast().
-*/
-
-/*! \fn template <class T> bool QLinkedList<T>::empty() const
-
- This function is provided for STL compatibility. It is equivalent
- to isEmpty() and returns \c true if the list is empty.
-*/
-
-/*! \fn template <class T> QLinkedList<T> &QLinkedList<T>::operator+=(const QLinkedList<T> &other)
-
- Appends the items of the \a other list to this list and returns a
- reference to this list.
-
- \sa operator+(), append()
-*/
-
-/*! \fn template <class T> void QLinkedList<T>::operator+=(const T &value)
-
- \overload
-
- Appends \a value to the list.
-*/
-
-/*! \fn template <class T> QLinkedList<T> QLinkedList<T>::operator+(const QLinkedList<T> &other) const
-
- Returns a list that contains all the items in this list followed
- by all the items in the \a other list.
-
- \sa operator+=()
-*/
-
-/*! \fn template <class T> QLinkedList<T> &QLinkedList<T>::operator<<(const QLinkedList<T> &other)
-
- Appends the items of the \a other list to this list and returns a
- reference to this list.
-
- \sa operator+=(), append()
-*/
-
-/*! \fn template <class T> QLinkedList<T> &QLinkedList<T>::operator<<(const T &value)
-
- \overload
-
- Appends \a value to the list.
-*/
-
-/*! \class QLinkedList::iterator
- \inmodule QtCore
- \obsolete
- \brief The QLinkedList::iterator class provides an STL-style non-const iterator for QLinkedList.
-
- QLinkedList features both \l{STL-style iterators} and
- \l{Java-style iterators}. The STL-style iterators are more
- low-level and more cumbersome to use; on the other hand, they are
- slightly faster and, for developers who already know STL, have
- the advantage of familiarity.
-
- QLinkedList\<T\>::iterator allows you to iterate over a
- QLinkedList\<T\> and to modify the list item associated with the
- iterator. If you want to iterate over a const QLinkedList, use
- QLinkedList::const_iterator instead. It is generally good
- practice to use QLinkedList::const_iterator on a non-const
- QLinkedList as well, unless you need to change the QLinkedList
- through the iterator. Const iterators are slightly faster, and
- can improve code readability.
-
- The default QLinkedList::iterator constructor creates an
- uninitialized iterator. You must initialize it using a
- function like QLinkedList::begin(), QLinkedList::end(), or
- QLinkedList::insert() before you can start iterating. Here's a
- typical loop that prints all the items stored in a list:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 7
-
- STL-style iterators can be used as arguments to \l{generic
- algorithms}. For example, here's how to find an item in the list:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 8
-
- Let's see a few examples of things we can do with a
- QLinkedList::iterator that we cannot do with a QLinkedList::const_iterator.
- Here's an example that increments every value stored in a
- QLinkedList\<int\> by 2:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 9
-
- Here's an example that removes all the items that start with an
- underscore character in a QLinkedList\<QString\>:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 10
-
- The call to QLinkedList::erase() removes the item pointed to by
- the iterator from the list, and returns an iterator to the next
- item. Here's another way of removing an item while iterating:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 11
-
- It might be tempting to write code like this:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 12
-
- However, this will potentially crash in \c{++i}, because \c i is
- a dangling iterator after the call to erase().
-
- Multiple iterators can be used on the same list. If you add items
- to the list, existing iterators will remain valid. If you remove
- items from the list, iterators that point to the removed items
- will become dangling iterators.
-
- \warning Iterators on implicitly shared containers do not work
- exactly like STL-iterators. You should avoid copying a container
- while iterators are active on that container. For more information,
- read \l{Implicit sharing iterator problem}.
-
- \sa QLinkedList::const_iterator, QMutableLinkedListIterator
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator::iterator()
-
- Constructs an uninitialized iterator.
-
- Functions like operator*() and operator++() should not be called
- on an uninitialized iterator. Use operator=() to assign a value
- to it before using it.
-
- \sa QLinkedList::begin(), QLinkedList::end()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator::iterator(Node *node)
-
- \internal
-*/
-
-/*! \typedef QLinkedList::iterator::iterator_category
-
- \internal
-*/
-
-/*! \typedef QLinkedList::iterator::difference_type
-
- \internal
-*/
-
-/*! \typedef QLinkedList::iterator::value_type
-
- \internal
-*/
-
-/*! \typedef QLinkedList::iterator::pointer
-
- \internal
-*/
-
-/*! \typedef QLinkedList::iterator::reference
-
- \internal
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator::iterator(const iterator &other)
-
- Constructs a copy of \a other.
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator &QLinkedList<T>::iterator::operator=(const iterator &other)
-
- Assigns \a other to this iterator.
-*/
-
-/*!
- \fn template <class T> QLinkedList<T> &QLinkedList<T>::operator=(QLinkedList<T> &&other)
-
- Move-assigns \a other to this QLinkedList instance.
-
- \since 5.2
-*/
-
-/*! \fn template <class T> T &QLinkedList<T>::iterator::operator*() const
-
- Returns a modifiable reference to the current item.
-
- You can change the value of an item by using operator*() on the
- left side of an assignment, for example:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 13
-
- \sa operator->()
-*/
-
-/*! \fn template <class T> T *QLinkedList<T>::iterator::operator->() const
-
- Returns a pointer to the current item.
-
- \sa operator*()
-*/
-
-/*!
- \fn template <class T> bool QLinkedList<T>::iterator::operator==(const iterator &other) const
- \fn template <class T> bool QLinkedList<T>::iterator::operator==(const const_iterator &other) const
-
- Returns \c true if \a other points to the same item as this
- iterator; otherwise returns \c false.
-
- \sa operator!=()
-*/
-
-/*!
- \fn template <class T> bool QLinkedList<T>::iterator::operator!=(const iterator &other) const
- \fn template <class T> bool QLinkedList<T>::iterator::operator!=(const const_iterator &other) const
-
- Returns \c true if \a other points to a different item than this
- iterator; otherwise returns \c false.
-
- \sa operator==()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator &QLinkedList<T>::iterator::operator++()
-
- The prefix ++ operator (\c{++it}) advances the iterator to the
- next item in the list and returns an iterator to the new current
- item.
-
- Calling this function on QLinkedList::end() leads to undefined
- results.
-
- \sa operator--()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator QLinkedList<T>::iterator::operator++(int)
-
- \overload
-
- The postfix ++ operator (\c{it++}) advances the iterator to the
- next item in the list and returns an iterator to the previously
- current item.
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator &QLinkedList<T>::iterator::operator--()
-
- The prefix -- operator (\c{--it}) makes the preceding item
- current and returns an iterator to the new current item.
-
- Calling this function on QLinkedList::begin() leads to undefined
- results.
-
- \sa operator++()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator QLinkedList<T>::iterator::operator--(int)
-
- \overload
-
- The postfix -- operator (\c{it--}) makes the preceding item
- current and returns an iterator to the previously current item.
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator QLinkedList<T>::iterator::operator+(int j) const
-
- Returns an iterator to the item at \a j positions forward from
- this iterator. (If \a j is negative, the iterator goes backward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator-()
-
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator QLinkedList<T>::iterator::operator-(int j) const
-
- Returns an iterator to the item at \a j positions backward from
- this iterator. (If \a j is negative, the iterator goes forward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator+()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator &QLinkedList<T>::iterator::operator+=(int j)
-
- Advances the iterator by \a j items. (If \a j is negative, the
- iterator goes backward.)
-
- \sa operator-=(), operator+()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::iterator &QLinkedList<T>::iterator::operator-=(int j)
-
- Makes the iterator go back by \a j items. (If \a j is negative,
- the iterator goes forward.)
-
- \sa operator+=(), operator-()
-*/
-
-/*! \class QLinkedList::const_iterator
- \inmodule QtCore
- \obsolete
- \brief The QLinkedList::const_iterator class provides an STL-style const iterator for QLinkedList.
-
- QLinkedList features both \l{STL-style iterators} and
- \l{Java-style iterators}. The STL-style iterators are more
- low-level and more cumbersome to use; on the other hand, they are
- slightly faster and, for developers who already know STL, have
- the advantage of familiarity.
-
- QLinkedList\<T\>::const_iterator allows you to iterate over a
- QLinkedList\<T\>. If you want modify the QLinkedList as you iterate
- over it, you must use QLinkedList::iterator instead. It is
- generally good practice to use QLinkedList::const_iterator on a
- non-const QLinkedList as well, unless you need to change the
- QLinkedList through the iterator. Const iterators are slightly
- faster, and can improve code readability.
-
- The default QLinkedList::const_iterator constructor creates an
- uninitialized iterator. You must initialize it using a function
- like QLinkedList::constBegin(), QLinkedList::constEnd(), or
- QLinkedList::insert() before you can start iterating. Here's a
- typical loop that prints all the items stored in a list:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 14
-
- STL-style iterators can be used as arguments to \l{generic
- algorithms}. For example, here's how to find an item in the list:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 15
-
- Multiple iterators can be used on the same list. If you add items
- to the list, existing iterators will remain valid. If you remove
- items from the list, iterators that point to the removed items
- will become dangling iterators.
-
- \warning Iterators on implicitly shared containers do not work
- exactly like STL-iterators. You should avoid copying a container
- while iterators are active on that container. For more information,
- read \l{Implicit sharing iterator problem}.
-
- \sa QLinkedList::iterator, QLinkedListIterator
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator::const_iterator()
-
- Constructs an uninitialized iterator.
-
- Functions like operator*() and operator++() should not be called
- on an uninitialized iterator. Use operator=() to assign a value
- to it before using it.
-
- \sa QLinkedList::constBegin(), QLinkedList::constEnd()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator::const_iterator(Node *node)
-
- \internal
-*/
-
-/*! \typedef QLinkedList::const_iterator::iterator_category
-
- \internal
-*/
-
-/*! \typedef QLinkedList::const_iterator::difference_type
-
- \internal
-*/
-
-/*! \typedef QLinkedList::const_iterator::value_type
-
- \internal
-*/
-
-/*! \typedef QLinkedList::const_iterator::pointer
-
- \internal
-*/
-
-/*! \typedef QLinkedList::const_iterator::reference
-
- \internal
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator::const_iterator(const const_iterator &other)
-
- Constructs a copy of \a other.
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator::const_iterator(iterator other)
-
- Constructs a copy of \a other.
-*/
-
-/*! \fn template <class T> typename QLinkedList<T>::const_iterator &QLinkedList<T>::const_iterator::operator=(const const_iterator &other)
-
- Assigns \a other to this iterator.
-*/
-
-/*! \fn template <class T> const T &QLinkedList<T>::const_iterator::operator*() const
-
- Returns a reference to the current item.
-
- \sa operator->()
-*/
-
-/*! \fn template <class T> const T *QLinkedList<T>::const_iterator::operator->() const
-
- Returns a pointer to the current item.
-
- \sa operator*()
-*/
-
-/*! \fn template <class T> bool QLinkedList<T>::const_iterator::operator==(const const_iterator &other) const
-
- Returns \c true if \a other points to the same item as this
- iterator; otherwise returns \c false.
-
- \sa operator!=()
-*/
-
-/*! \fn template <class T> bool QLinkedList<T>::const_iterator::operator!=(const const_iterator &other) const
-
- Returns \c true if \a other points to a different item than this
- iterator; otherwise returns \c false.
-
- \sa operator==()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator &QLinkedList<T>::const_iterator::operator++()
-
- The prefix ++ operator (\c{++it}) advances the iterator to the
- next item in the list and returns an iterator to the new current
- item.
-
- Calling this function on QLinkedList<T>::constEnd() leads to
- undefined results.
-
- \sa operator--()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator QLinkedList<T>::const_iterator::operator++(int)
-
- \overload
-
- The postfix ++ operator (\c{it++}) advances the iterator to the
- next item in the list and returns an iterator to the previously
- current item.
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator &QLinkedList<T>::const_iterator::operator--()
-
- The prefix -- operator (\c{--it}) makes the preceding item
- current and returns an iterator to the new current item.
-
- Calling this function on QLinkedList::begin() leads to undefined
- results.
-
- \sa operator++()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator QLinkedList<T>::const_iterator::operator--(int)
-
- \overload
-
- The postfix -- operator (\c{it--}) makes the preceding item
- current and returns an iterator to the previously current item.
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator QLinkedList<T>::const_iterator::operator+(int j) const
-
- Returns an iterator to the item at \a j positions forward from
- this iterator. (If \a j is negative, the iterator goes backward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator-()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator QLinkedList<T>::const_iterator::operator-(int j) const
-
- This function returns an iterator to the item at \a j positions backward from
- this iterator. (If \a j is negative, the iterator goes forward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator+()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator &QLinkedList<T>::const_iterator::operator+=(int j)
-
- Advances the iterator by \a j items. (If \a j is negative, the
- iterator goes backward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator-=(), operator+()
-*/
-
-/*! \fn template <class T> QLinkedList<T>::const_iterator &QLinkedList<T>::const_iterator::operator-=(int j)
-
- Makes the iterator go back by \a j items. (If \a j is negative,
- the iterator goes forward.)
-
- This operation can be slow for large \a j values.
-
- \sa operator+=(), operator-()
-*/
-
-/*! \fn template <class T> QDataStream &operator<<(QDataStream &out, const QLinkedList<T> &list)
- \relates QLinkedList
-
- Writes the linked list \a list to stream \a out.
-
- This function requires the value type to implement \c
- operator<<().
-
- \sa{Serializing Qt Data Types}{Format of the QDataStream operators}
-*/
-
-/*! \fn template <class T> QDataStream &operator>>(QDataStream &in, QLinkedList<T> &list)
- \relates QLinkedList
-
- Reads a linked list from stream \a in into \a list.
-
- This function requires the value type to implement \c operator>>().
-
- \sa{Serializing Qt Data Types}{Format of the QDataStream operators}
-*/
-
-/*!
- \since 4.1
- \fn template <class T> QLinkedList<T> QLinkedList<T>::fromStdList(const std::list<T> &list)
-
- Returns a QLinkedList object with the data contained in \a list.
- The order of the elements in the QLinkedList is the same as in \a
- list.
-
- Example:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 16
-
- \sa toStdList()
-*/
-
-/*!
- \since 4.1
- \fn template <class T> std::list<T> QLinkedList<T>::toStdList() const
-
- Returns a std::list object with the data contained in this
- QLinkedList. Example:
-
- \snippet code/src_corelib_tools_qlinkedlist.cpp 17
-
- \sa fromStdList()
-*/
-
-QT_WARNING_POP
-
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlinkedlist.h b/src/corelib/tools/qlinkedlist.h
deleted file mode 100644
index 14fbc34b9d..0000000000
--- a/src/corelib/tools/qlinkedlist.h
+++ /dev/null
@@ -1,615 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QLINKEDLIST_H
-#define QLINKEDLIST_H
-
-#include <QtCore/qglobal.h>
-
-#ifndef QT_NO_LINKED_LIST
-
-#include <QtCore/qiterator.h>
-#include <QtCore/qrefcount.h>
-#include <QtCore/qcontainertools_impl.h>
-#include <QtCore/qdatastream.h>
-#include <QtCore/qtypeinfo.h>
-
-#include <algorithm>
-#include <initializer_list>
-#include <iterator>
-#include <list>
-
-
-#if 0
-// This is needed because of QTBUG-80347
-#pragma qt_class(QLinkedList)
-#pragma qt_class(QLinkedListData)
-#pragma qt_class(QLinkedListNode)
-#endif
-
-#if QT_DEPRECATED_SINCE(5, 15)
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-QT_BEGIN_NAMESPACE
-
-struct QT_DEPRECATED_VERSION_5_15 QLinkedListData
-{
- QLinkedListData *n, *p;
- QtPrivate::RefCount ref;
- int size;
- uint sharable : 1;
-
- Q_CORE_EXPORT static const QLinkedListData shared_null;
-};
-
-template <typename T>
-struct QT_DEPRECATED_VERSION_5_15 QLinkedListNode
-{
- inline QLinkedListNode(const T &arg): t(arg) { }
- QLinkedListNode *n, *p;
- T t;
-};
-
-template <class T>
-class QT_DEPRECATED_VERSION_X_5_15("Use std::list instead") QLinkedList
-{
- typedef QLinkedListNode<T> Node;
- union { QLinkedListData *d; QLinkedListNode<T> *e; };
-
-public:
- inline QLinkedList() noexcept : d(const_cast<QLinkedListData *>(&QLinkedListData::shared_null)) { }
- inline QLinkedList(const QLinkedList<T> &l) : d(l.d) { d->ref.ref(); if (!d->sharable) detach(); }
- inline QLinkedList(std::initializer_list<T> list)
- : QLinkedList(list.begin(), list.end()) {}
- template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
- inline QLinkedList(InputIterator first, InputIterator last)
- : QLinkedList()
- {
- std::copy(first, last, std::back_inserter(*this));
- }
- ~QLinkedList();
- QLinkedList<T> &operator=(const QLinkedList<T> &);
- QLinkedList(QLinkedList<T> &&other) noexcept
- : d(other.d) { other.d = const_cast<QLinkedListData *>(&QLinkedListData::shared_null); }
- QLinkedList<T> &operator=(QLinkedList<T> &&other) noexcept
- { QLinkedList moved(std::move(other)); swap(moved); return *this; }
- inline void swap(QLinkedList<T> &other) noexcept { qSwap(d, other.d); }
- bool operator==(const QLinkedList<T> &l) const;
- inline bool operator!=(const QLinkedList<T> &l) const { return !(*this == l); }
-
- inline int size() const { return d->size; }
- inline void detach()
- { if (d->ref.isShared()) detach_helper2(this->e); }
- inline bool isDetached() const { return !d->ref.isShared(); }
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- inline void setSharable(bool sharable) { if (!sharable) detach(); if (d != &QLinkedListData::shared_null) d->sharable = sharable; }
-#endif
- inline bool isSharedWith(const QLinkedList<T> &other) const { return d == other.d; }
-
- inline bool isEmpty() const { return d->size == 0; }
-
- void clear();
-
- void append(const T &);
- void prepend(const T &);
- T takeFirst();
- T takeLast();
- int removeAll(const T &t);
- bool removeOne(const T &t);
- bool contains(const T &t) const;
- int count(const T &t) const;
-
- class const_iterator;
-
- class iterator
- {
- public:
- typedef std::bidirectional_iterator_tag iterator_category;
- typedef qptrdiff difference_type;
- typedef T value_type;
- typedef T *pointer;
- typedef T &reference;
- Node *i;
- inline iterator() : i(nullptr) {}
- inline iterator(Node *n) : i(n) {}
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
- iterator(const iterator &other) noexcept : i(other.i) {}
- iterator &operator=(const iterator &other) noexcept { i = other.i; return *this; }
- iterator(iterator &&other) noexcept : i(other.i) {}
- iterator &operator=(iterator &&other) noexcept { return *this = other; }
-#endif
- inline T &operator*() const { return i->t; }
- inline T *operator->() const { return &i->t; }
- inline bool operator==(const iterator &o) const { return i == o.i; }
- inline bool operator!=(const iterator &o) const { return i != o.i; }
- inline bool operator==(const const_iterator &o) const
- { return i == o.i; }
- inline bool operator!=(const const_iterator &o) const
- { return i != o.i; }
- inline iterator &operator++() { i = i->n; return *this; }
- inline iterator operator++(int) { Node *n = i; i = i->n; return n; }
- inline iterator &operator--() { i = i->p; return *this; }
- inline iterator operator--(int) { Node *n = i; i = i->p; return n; }
- inline iterator operator+(int j) const
- { Node *n = i; if (j > 0) while (j--) n = n->n; else while (j++) n = n->p; return n; }
- inline iterator operator-(int j) const { return operator+(-j); }
- inline iterator &operator+=(int j) { return *this = *this + j; }
- inline iterator &operator-=(int j) { return *this = *this - j; }
- friend inline iterator operator+(int j, iterator k) { return k + j; }
- };
- friend class iterator;
-
- class const_iterator
- {
- public:
- typedef std::bidirectional_iterator_tag iterator_category;
- typedef qptrdiff difference_type;
- typedef T value_type;
- typedef const T *pointer;
- typedef const T &reference;
- Node *i;
- inline const_iterator() : i(nullptr) {}
- inline const_iterator(Node *n) : i(n) {}
- inline const_iterator(iterator ci) : i(ci.i){}
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
- const_iterator(const const_iterator &other) noexcept : i(other.i) {}
- const_iterator &operator=(const const_iterator &other) noexcept { i = other.i; return *this; }
- const_iterator(const_iterator &&other) noexcept : i(other.i) {}
- const_iterator &operator=(const_iterator &&other) noexcept { return *this = other; }
-#endif
- inline const T &operator*() const { return i->t; }
- inline const T *operator->() const { return &i->t; }
- inline bool operator==(const const_iterator &o) const { return i == o.i; }
- inline bool operator!=(const const_iterator &o) const { return i != o.i; }
- inline const_iterator &operator++() { i = i->n; return *this; }
- inline const_iterator operator++(int) { Node *n = i; i = i->n; return n; }
- inline const_iterator &operator--() { i = i->p; return *this; }
- inline const_iterator operator--(int) { Node *n = i; i = i->p; return n; }
- inline const_iterator operator+(int j) const
- { Node *n = i; if (j > 0) while (j--) n = n->n; else while (j++) n = n->p; return n; }
- inline const_iterator operator-(int j) const { return operator+(-j); }
- inline const_iterator &operator+=(int j) { return *this = *this + j; }
- inline const_iterator &operator-=(int j) { return *this = *this - j; }
- friend inline const_iterator operator+(int j, const_iterator k) { return k + j; }
- };
- friend class const_iterator;
-
- // stl style
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
- inline iterator begin() { detach(); return e->n; }
- inline const_iterator begin() const noexcept { return e->n; }
- inline const_iterator cbegin() const noexcept { return e->n; }
- inline const_iterator constBegin() const noexcept { return e->n; }
- inline iterator end() { detach(); return e; }
- inline const_iterator end() const noexcept { return e; }
- inline const_iterator cend() const noexcept { return e; }
- inline const_iterator constEnd() const noexcept { return e; }
-
- reverse_iterator rbegin() { return reverse_iterator(end()); }
- reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
- const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
-
- iterator insert(iterator before, const T &t);
- iterator erase(iterator pos);
- iterator erase(iterator first, iterator last);
-
- // more Qt
- typedef iterator Iterator;
- typedef const_iterator ConstIterator;
- inline int count() const { return d->size; }
- inline T& first() { Q_ASSERT(!isEmpty()); return *begin(); }
- inline const T& first() const { Q_ASSERT(!isEmpty()); return *begin(); }
- T& last() { Q_ASSERT(!isEmpty()); return *(--end()); }
- const T& last() const { Q_ASSERT(!isEmpty()); return *(--end()); }
- inline void removeFirst() { Q_ASSERT(!isEmpty()); erase(begin()); }
- inline void removeLast() { Q_ASSERT(!isEmpty()); erase(--end()); }
- inline bool startsWith(const T &t) const { return !isEmpty() && first() == t; }
- inline bool endsWith(const T &t) const { return !isEmpty() && last() == t; }
-
- // stl compatibility
- inline void push_back(const T &t) { append(t); }
- inline void push_front(const T &t) { prepend(t); }
- inline T& front() { return first(); }
- inline const T& front() const { return first(); }
- inline T& back() { return last(); }
- inline const T& back() const { return last(); }
- inline void pop_front() { removeFirst(); }
- inline void pop_back() { removeLast(); }
- inline bool empty() const { return isEmpty(); }
- typedef int size_type;
- typedef T value_type;
- typedef value_type *pointer;
- typedef const value_type *const_pointer;
- typedef value_type &reference;
- typedef const value_type &const_reference;
- typedef qptrdiff difference_type;
-
- static inline QLinkedList<T> fromStdList(const std::list<T> &list)
- { QLinkedList<T> tmp; std::copy(list.begin(), list.end(), std::back_inserter(tmp)); return tmp; }
- inline std::list<T> toStdList() const
- { std::list<T> tmp; std::copy(constBegin(), constEnd(), std::back_inserter(tmp)); return tmp; }
-
- // comfort
- QLinkedList<T> &operator+=(const QLinkedList<T> &l);
- QLinkedList<T> operator+(const QLinkedList<T> &l) const;
- inline QLinkedList<T> &operator+=(const T &t) { append(t); return *this; }
- inline QLinkedList<T> &operator<< (const T &t) { append(t); return *this; }
- inline QLinkedList<T> &operator<<(const QLinkedList<T> &l) { *this += l; return *this; }
-
-private:
- void detach_helper();
- iterator detach_helper2(iterator);
- void freeData(QLinkedListData*);
-};
-template <typename T>
-Q_DECLARE_TYPEINFO_BODY(QLinkedList<T>, Q_MOVABLE_TYPE|Q_RELOCATABLE_TYPE);
-
-#if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606
-template <typename InputIterator,
- typename ValueType = typename std::iterator_traits<InputIterator>::value_type,
- QtPrivate::IfIsInputIterator<InputIterator> = true>
-QLinkedList(InputIterator, InputIterator) -> QLinkedList<ValueType>;
-#endif
-
-template <typename T>
-inline QLinkedList<T>::~QLinkedList()
-{
- if (!d->ref.deref())
- freeData(d);
-}
-
-template <typename T>
-void QLinkedList<T>::detach_helper()
-{
- detach_helper2(this->e);
-}
-
-template <typename T>
-typename QLinkedList<T>::iterator QLinkedList<T>::detach_helper2(iterator orgite)
-{
- // detach and convert orgite to an iterator in the detached instance
- bool isEndIterator = (orgite.i == this->e);
- union { QLinkedListData *d; Node *e; } x;
- x.d = new QLinkedListData;
- x.d->ref.initializeOwned();
- x.d->size = d->size;
- x.d->sharable = true;
- Node *original = e->n;
- Node *copy = x.e;
- Node *org = orgite.i;
-
- while (original != org) {
- QT_TRY {
- copy->n = new Node(original->t);
- copy->n->p = copy;
- original = original->n;
- copy = copy->n;
- } QT_CATCH(...) {
- copy->n = x.e;
- Q_ASSERT(!x.d->ref.deref()); // Don't trigger assert in free
- freeData(x.d);
- QT_RETHROW;
- }
- }
- iterator r(copy);
- while (original != e) {
- QT_TRY {
- copy->n = new Node(original->t);
- copy->n->p = copy;
- original = original->n;
- copy = copy->n;
- } QT_CATCH(...) {
- copy->n = x.e;
- Q_ASSERT(!x.d->ref.deref()); // Don't trigger assert in free
- freeData(x.d);
- QT_RETHROW;
- }
- }
- copy->n = x.e;
- x.e->p = copy;
- if (!d->ref.deref())
- freeData(d);
- d = x.d;
- if (!isEndIterator)
- ++r; // since we stored the element right before the original node.
- return r;
-}
-
-template <typename T>
-void QLinkedList<T>::freeData(QLinkedListData *x)
-{
- Node *y = reinterpret_cast<Node*>(x);
- Node *i = y->n;
- Q_ASSERT(x->ref.atomic.loadRelaxed() == 0);
- while (i != y) {
- Node *n = i;
- i = i->n;
- delete n;
- }
- delete x;
-}
-
-template <typename T>
-void QLinkedList<T>::clear()
-{
- *this = QLinkedList<T>();
-}
-
-template <typename T>
-QLinkedList<T> &QLinkedList<T>::operator=(const QLinkedList<T> &l)
-{
- if (d != l.d) {
- QLinkedListData *o = l.d;
- o->ref.ref();
- if (!d->ref.deref())
- freeData(d);
- d = o;
- if (!d->sharable)
- detach_helper();
- }
- return *this;
-}
-
-template <typename T>
-bool QLinkedList<T>::operator== (const QLinkedList<T> &l) const
-{
- if (d->size != l.d->size)
- return false;
- if (e == l.e)
- return true;
- Node *i = e->n;
- Node *il = l.e->n;
- while (i != e) {
- if (! (i->t == il->t))
- return false;
- i = i->n;
- il = il->n;
- }
- return true;
-}
-
-template <typename T>
-void QLinkedList<T>::append(const T &t)
-{
- detach();
- Node *i = new Node(t);
- i->n = e;
- i->p = e->p;
- i->p->n = i;
- e->p = i;
- d->size++;
-}
-
-template <typename T>
-void QLinkedList<T>::prepend(const T &t)
-{
- detach();
- Node *i = new Node(t);
- i->n = e->n;
- i->p = e;
- i->n->p = i;
- e->n = i;
- d->size++;
-}
-
-template <typename T>
-int QLinkedList<T>::removeAll(const T &_t)
-{
- detach();
- const T t = _t;
- Node *i = e->n;
- int c = 0;
- while (i != e) {
- if (i->t == t) {
- Node *n = i;
- i->n->p = i->p;
- i->p->n = i->n;
- i = i->n;
- delete n;
- c++;
- } else {
- i = i->n;
- }
- }
- d->size-=c;
- return c;
-}
-
-template <typename T>
-bool QLinkedList<T>::removeOne(const T &_t)
-{
- detach();
- iterator it = std::find(begin(), end(), _t);
- if (it != end()) {
- erase(it);
- return true;
- }
- return false;
-}
-
-template <typename T>
-inline T QLinkedList<T>::takeFirst()
-{
- T t = std::move(first());
- removeFirst();
- return t;
-}
-
-template <typename T>
-inline T QLinkedList<T>::takeLast()
-{
- T t = std::move(last());
- removeLast();
- return t;
-}
-
-template <typename T>
-bool QLinkedList<T>::contains(const T &t) const
-{
- Node *i = e;
- while ((i = i->n) != e)
- if (i->t == t)
- return true;
- return false;
-}
-
-template <typename T>
-int QLinkedList<T>::count(const T &t) const
-{
- Node *i = e;
- int c = 0;
- while ((i = i->n) != e)
- if (i->t == t)
- c++;
- return c;
-}
-
-
-template <typename T>
-typename QLinkedList<T>::iterator QLinkedList<T>::insert(iterator before, const T &t)
-{
- if (d->ref.isShared())
- before = detach_helper2(before);
-
- Node *i = before.i;
- Node *m = new Node(t);
- m->n = i;
- m->p = i->p;
- m->p->n = m;
- i->p = m;
- d->size++;
- return m;
-}
-
-template <typename T>
-typename QLinkedList<T>::iterator QLinkedList<T>::erase(typename QLinkedList<T>::iterator afirst,
- typename QLinkedList<T>::iterator alast)
-{
- while (afirst != alast)
- erase(afirst++);
- return alast;
-}
-
-
-template <typename T>
-typename QLinkedList<T>::iterator QLinkedList<T>::erase(iterator pos)
-{
- if (d->ref.isShared())
- pos = detach_helper2(pos);
-
- Node *i = pos.i;
- if (i != e) {
- Node *n = i;
- i->n->p = i->p;
- i->p->n = i->n;
- i = i->n;
- delete n;
- d->size--;
- }
- return i;
-}
-
-template <typename T>
-QLinkedList<T> &QLinkedList<T>::operator+=(const QLinkedList<T> &l)
-{
- detach();
- int n = l.d->size;
- d->size += n;
- Node *original = l.e->n;
- while (n--) {
- QT_TRY {
- Node *copy = new Node(original->t);
- original = original->n;
- copy->n = e;
- copy->p = e->p;
- copy->p->n = copy;
- e->p = copy;
- } QT_CATCH(...) {
- // restore the original list
- while (n++<d->size)
- removeLast();
- QT_RETHROW;
- }
- }
- return *this;
-}
-
-template <typename T>
-QLinkedList<T> QLinkedList<T>::operator+(const QLinkedList<T> &l) const
-{
- QLinkedList<T> n = *this;
- n += l;
- return n;
-}
-
-Q_DECLARE_SEQUENTIAL_ITERATOR(LinkedList)
-Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(LinkedList)
-
-#ifndef QT_NO_DATASTREAM
-template <typename T>
-inline QDataStream &operator>>(QDataStream &s, QLinkedList<T> &l)
-{
- return QtPrivate::readListBasedContainer(s, l);
-}
-
-template <typename T>
-inline QDataStream &operator<<(QDataStream &s, const QLinkedList<T> &l)
-{
- return QtPrivate::writeSequentialContainer(s, l);
-}
-#endif
-
-QT_END_NAMESPACE
-
-Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(QLinkedList)
-
-QT_WARNING_POP
-
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
-#endif // QT_NO_LINKED_LIST
-
-#endif // QLINKEDLIST_H
diff --git a/src/corelib/tools/qlist.cpp b/src/corelib/tools/qlist.cpp
index 5d5da20752..62201fd5d6 100644
--- a/src/corelib/tools/qlist.cpp
+++ b/src/corelib/tools/qlist.cpp
@@ -63,2029 +63,4 @@ template class Q_CORE_EXPORT QVector<QPointF>;
template class Q_CORE_EXPORT QVector<QPoint>;
#endif
-
-/*
- QList as an array-list combines the easy-of-use of a random
- access interface with fast list operations and the low memory
- management overhead of an array. Accessing elements by index,
- appending, prepending, and removing elements from both the front
- and the back all happen in constant time O(1). Inserting or
- removing elements at random index positions \ai happens in linear
- time, or more precisly in O(min{i,n-i}) <= O(n/2), with n being
- the number of elements in the list.
-*/
-
-const QListData::Data QListData::shared_null = { Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, 0, { nullptr } };
-
-/*!
- * Detaches the QListData by allocating new memory for a list which will be bigger
- * than the copied one and is expected to grow further.
- * *idx is the desired insertion point and is clamped to the actual size of the list.
- * num is the number of new elements to insert at the insertion point.
- * Returns the old (shared) data, it is up to the caller to deref() and free().
- * For the new data node_copy needs to be called.
- *
- * \internal
- */
-QListData::Data *QListData::detach_grow(int *idx, int num)
-{
- Data *x = d;
- int l = x->end - x->begin;
- int nl = l + num;
- auto blockInfo = qCalculateGrowingBlockSize(nl, sizeof(void *), DataHeaderSize);
- Data* t = static_cast<Data *>(::malloc(blockInfo.size));
- Q_CHECK_PTR(t);
- t->alloc = int(uint(blockInfo.elementCount));
-
- t->ref.initializeOwned();
- // The space reservation algorithm's optimization is biased towards appending:
- // Something which looks like an append will put the data at the beginning,
- // while something which looks like a prepend will put it in the middle
- // instead of at the end. That's based on the assumption that prepending
- // is uncommon and even an initial prepend will eventually be followed by
- // at least some appends.
- int bg;
- if (*idx < 0) {
- *idx = 0;
- bg = (t->alloc - nl) >> 1;
- } else if (*idx > l) {
- *idx = l;
- bg = 0;
- } else if (*idx < (l >> 1)) {
- bg = (t->alloc - nl) >> 1;
- } else {
- bg = 0;
- }
- t->begin = bg;
- t->end = bg + nl;
- d = t;
-
- return x;
-}
-
-/*!
- * Detaches the QListData by allocating new memory for a list which possibly
- * has a different size than the copied one.
- * Returns the old (shared) data, it is up to the caller to deref() and free()
- * For the new data node_copy needs to be called.
- *
- * \internal
- */
-QListData::Data *QListData::detach(int alloc)
-{
- Data *x = d;
- Data* t = static_cast<Data *>(::malloc(qCalculateBlockSize(alloc, sizeof(void*), DataHeaderSize)));
- Q_CHECK_PTR(t);
-
- t->ref.initializeOwned();
- t->alloc = alloc;
- if (!alloc) {
- t->begin = 0;
- t->end = 0;
- } else {
- t->begin = x->begin;
- t->end = x->end;
- }
- d = t;
-
- return x;
-}
-
-void QListData::realloc(int alloc)
-{
- Q_ASSERT(!d->ref.isShared());
- Data *x = static_cast<Data *>(::realloc(d, qCalculateBlockSize(alloc, sizeof(void *), DataHeaderSize)));
- Q_CHECK_PTR(x);
-
- d = x;
- d->alloc = alloc;
- if (!alloc)
- d->begin = d->end = 0;
-}
-
-void QListData::realloc_grow(int growth)
-{
- Q_ASSERT(!d->ref.isShared());
- auto r = qCalculateGrowingBlockSize(d->alloc + growth, sizeof(void *), DataHeaderSize);
- Data *x = static_cast<Data *>(::realloc(d, r.size));
- Q_CHECK_PTR(x);
-
- d = x;
- d->alloc = int(uint(r.elementCount));
-}
-
-void QListData::dispose(Data *d)
-{
- Q_ASSERT(!d->ref.isShared());
- free(d);
-}
-
-// ensures that enough space is available to append n elements
-void **QListData::append(int n)
-{
- Q_ASSERT(!d->ref.isShared());
- int e = d->end;
- if (e + n > d->alloc) {
- int b = d->begin;
- if (b - n >= 2 * d->alloc / 3) {
- // we have enough space. Just not at the end -> move it.
- e -= b;
- ::memcpy(d->array, d->array + b, e * sizeof(void *));
- d->begin = 0;
- } else {
- realloc_grow(n);
- }
- }
- d->end = e + n;
- return d->array + e;
-}
-
-// ensures that enough space is available to append one element
-void **QListData::append()
-{
- return append(1);
-}
-
-// ensures that enough space is available to append the list
-void **QListData::append(const QListData& l)
-{
- return append(l.d->end - l.d->begin);
-}
-
-void **QListData::prepend()
-{
- Q_ASSERT(!d->ref.isShared());
- if (d->begin == 0) {
- if (d->end >= d->alloc / 3)
- realloc_grow(1);
-
- if (d->end < d->alloc / 3)
- d->begin = d->alloc - 2 * d->end;
- else
- d->begin = d->alloc - d->end;
-
- ::memmove(d->array + d->begin, d->array, d->end * sizeof(void *));
- d->end += d->begin;
- }
- return d->array + --d->begin;
-}
-
-void **QListData::insert(int i)
-{
- Q_ASSERT(!d->ref.isShared());
- if (i <= 0)
- return prepend();
- int size = d->end - d->begin;
- if (i >= size)
- return append();
-
- bool leftward = false;
-
- if (d->begin == 0) {
- if (d->end == d->alloc) {
- // If the array is full, we expand it and move some items rightward
- realloc_grow(1);
- } else {
- // If there is free space at the end of the array, we move some items rightward
- }
- } else {
- if (d->end == d->alloc) {
- // If there is free space at the beginning of the array, we move some items leftward
- leftward = true;
- } else {
- // If there is free space at both ends, we move as few items as possible
- leftward = (i < size - i);
- }
- }
-
- if (leftward) {
- --d->begin;
- ::memmove(d->array + d->begin, d->array + d->begin + 1, i * sizeof(void *));
- } else {
- ::memmove(d->array + d->begin + i + 1, d->array + d->begin + i,
- (size - i) * sizeof(void *));
- ++d->end;
- }
- return d->array + d->begin + i;
-}
-
-void QListData::remove(int i)
-{
- Q_ASSERT(!d->ref.isShared());
- i += d->begin;
- if (i - d->begin < d->end - i) {
- if (int offset = i - d->begin)
- ::memmove(d->array + d->begin + 1, d->array + d->begin, offset * sizeof(void *));
- d->begin++;
- } else {
- if (int offset = d->end - i - 1)
- ::memmove(d->array + i, d->array + i + 1, offset * sizeof(void *));
- d->end--;
- }
-}
-
-void QListData::remove(int i, int n)
-{
- Q_ASSERT(!d->ref.isShared());
- i += d->begin;
- int middle = i + n/2;
- if (middle - d->begin < d->end - middle) {
- ::memmove(d->array + d->begin + n, d->array + d->begin,
- (i - d->begin) * sizeof(void*));
- d->begin += n;
- } else {
- ::memmove(d->array + i, d->array + i + n,
- (d->end - i - n) * sizeof(void*));
- d->end -= n;
- }
-}
-
-void QListData::move(int from, int to)
-{
- Q_ASSERT(!d->ref.isShared());
- if (from == to)
- return;
-
- from += d->begin;
- to += d->begin;
- void *t = d->array[from];
-
- if (from < to) {
- if (d->end == d->alloc || 3 * (to - from) < 2 * (d->end - d->begin)) {
- ::memmove(d->array + from, d->array + from + 1, (to - from) * sizeof(void *));
- } else {
- // optimization
- if (int offset = from - d->begin)
- ::memmove(d->array + d->begin + 1, d->array + d->begin, offset * sizeof(void *));
- if (int offset = d->end - (to + 1))
- ::memmove(d->array + to + 2, d->array + to + 1, offset * sizeof(void *));
- ++d->begin;
- ++d->end;
- ++to;
- }
- } else {
- if (d->begin == 0 || 3 * (from - to) < 2 * (d->end - d->begin)) {
- ::memmove(d->array + to + 1, d->array + to, (from - to) * sizeof(void *));
- } else {
- // optimization
- if (int offset = to - d->begin)
- ::memmove(d->array + d->begin - 1, d->array + d->begin, offset * sizeof(void *));
- if (int offset = d->end - (from + 1))
- ::memmove(d->array + from, d->array + from + 1, offset * sizeof(void *));
- --d->begin;
- --d->end;
- --to;
- }
- }
- d->array[to] = t;
-}
-
-void **QListData::erase(void **xi)
-{
- Q_ASSERT(!d->ref.isShared());
- int i = xi - (d->array + d->begin);
- remove(i);
- return d->array + d->begin + i;
-}
-
-/*! \class QList
- \inmodule QtCore
- \brief The QList class is a template class that provides lists.
-
- \ingroup tools
- \ingroup shared
-
- \reentrant
-
- QList\<T\> is one of Qt's generic \l{container classes}. It
- stores items in a list that provides fast index-based access
- and index-based insertions and removals.
-
- QList\<T\>, QLinkedList\<T\>, and QVector\<T\> provide similar
- APIs and functionality. They are often interchangeable, but there
- are performance consequences. Here is an overview of use cases:
-
- \list
- \li QVector should be your default first choice.
- QVector\<T\> will usually give better performance than QList\<T\>,
- because QVector\<T\> always stores its items sequentially in memory,
- where QList\<T\> will allocate its items on the heap unless
- \c {sizeof(T) <= sizeof(void*)} and T has been declared to be
- either a \c{Q_MOVABLE_TYPE} or a \c{Q_PRIMITIVE_TYPE} using
- \l {Q_DECLARE_TYPEINFO}. See the \l {Pros and Cons of Using QList}
- for an explanation.
- \li However, QList is used throughout the Qt APIs for passing
- parameters and for returning values. Use QList to interface with
- those APIs.
- \li If you need a real linked list, which guarantees
- \l {Algorithmic Complexity}{constant time} insertions mid-list and
- uses iterators to items rather than indexes, use QLinkedList.
- \endlist
-
- \note QVector and QVarLengthArray both guarantee C-compatible
- array layout. QList does not. This might be important if your
- application must interface with a C API.
-
- \note Iterators into a QLinkedList and references into
- heap-allocating QLists remain valid as long as the referenced items
- remain in the container. This is not true for iterators and
- references into a QVector and non-heap-allocating QLists.
-
- Internally, QList\<T\> is represented as an array of T if
- \c{sizeof(T) <= sizeof(void*)} and T has been declared to be
- either a \c{Q_MOVABLE_TYPE} or a \c{Q_PRIMITIVE_TYPE} using
- \l {Q_DECLARE_TYPEINFO}. Otherwise, QList\<T\> is represented
- as an array of T* and the items are allocated on the heap.
-
- The array representation allows very fast insertions and
- index-based access. The prepend() and append() operations are
- also very fast because QList preallocates memory at both
- ends of its internal array. (See \l{Algorithmic Complexity} for
- details.
-
- Note, however, that when the conditions specified above are not met,
- each append or insert of a new item requires allocating the new item
- on the heap, and this per item allocation will make QVector a better
- choice for use cases that do a lot of appending or inserting, because
- QVector can allocate memory for many items in a single heap allocation.
-
- Note that the internal array only ever gets bigger over the life
- of the list. It never shrinks. The internal array is deallocated
- by the destructor and by the assignment operator, when one list
- is assigned to another.
-
- Here's an example of a QList that stores integers and
- a QList that stores QDate values:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 0
-
- Qt includes a QStringList class that inherits QList\<QString\>
- and adds a few convenience functions, such as QStringList::join()
- and QStringList::filter(). QString::split() creates QStringLists
- from strings.
-
- QList stores a list of items. The default constructor creates an
- empty list. You can use the initializer-list constructor to create
- a list with elements:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 1a
-
- QList provides these basic functions to add, move, and remove
- items: insert(), replace(), removeAt(), move(), and swap(). In
- addition, it provides the following convenience functions:
- append(), \l{operator<<()}, \l{operator+=()}, prepend(), removeFirst(),
- and removeLast().
-
- \l{operator<<()} allows to conveniently add multiple elements to a list:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 1b
-
- QList uses 0-based indexes, just like C++ arrays. To access the
- item at a particular index position, you can use operator[](). On
- non-const lists, operator[]() returns a reference to the item and
- can be used on the left side of an assignment:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 2
-
- Because QList is implemented as an array of pointers for types
- that are larger than a pointer or are not movable, this operation
- requires (\l{Algorithmic Complexity}{constant time}). For read-only
- access, an alternative syntax is to use at():
-
- \snippet code/src_corelib_tools_qlistdata.cpp 3
-
- at() can be faster than operator[](), because it never causes a
- \l{deep copy} to occur.
-
- A common requirement is to remove an item from a list and do
- something with it. For this, QList provides takeAt(), takeFirst(),
- and takeLast(). Here's a loop that removes the items from a list
- one at a time and calls \c delete on them:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 4
-
- Inserting and removing items at either end of the list is very
- fast (\l{Algorithmic Complexity}{constant time} in most cases),
- because QList preallocates extra space on both sides of its
- internal buffer to allow for fast growth at both ends of the list.
-
- If you want to find all occurrences of a particular value in a
- list, use indexOf() or lastIndexOf(). The former searches forward
- starting from a given index position, the latter searches
- backward. Both return the index of a matching item if they find
- it; otherwise, they return -1. For example:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 5
-
- If you simply want to check whether a list contains a particular
- value, use contains(). If you want to find out how many times a
- particular value occurs in the list, use count(). If you want to
- replace all occurrences of a particular value with another, use
- replace().
-
- QList's value type must be an \l{assignable data type}. This
- covers most data types that are commonly used, but the compiler
- won't let you, for example, store a QWidget as a value; instead,
- store a QWidget *. A few functions have additional requirements;
- for example, indexOf() and lastIndexOf() expect the value type to
- support \c operator==(). These requirements are documented on a
- per-function basis.
-
- Like the other container classes, QList provides \l{Java-style
- iterators} (QListIterator and QMutableListIterator) and
- \l{STL-style iterators} (QList::const_iterator and
- QList::iterator). In practice, these are rarely used, because you
- can use indexes into the QList. QList is implemented in such a way
- that direct index-based access is just as fast as using iterators.
-
- QList does \e not support inserting, prepending, appending or
- replacing with references to its own values. Doing so will cause
- your application to abort with an error message.
-
- To make QList as efficient as possible, its member functions don't
- validate their input before using it. Except for isEmpty(), member
- functions always assume the list is \e not empty. Member functions
- that take index values as parameters always assume their index
- value parameters are in the valid range. This means QList member
- functions can fail. If you define QT_NO_DEBUG when you compile,
- failures will not be detected. If you \e don't define QT_NO_DEBUG,
- failures will be detected using Q_ASSERT() or Q_ASSERT_X() with an
- appropriate message.
-
- To avoid failures when your list can be empty, call isEmpty()
- before calling other member functions. If you must pass an index
- value that might not be in the valid range, check that it is less
- than the value returned by size() but \e not less than 0.
-
- \section1 More Members
-
- If T is a QByteArray, this class has a couple more members that can be
- used. See the documentation for QByteArrayList for more information.
-
- If T is QString, this class has the following additional members:
- \l{QStringList::filter()}{filter},
- \l{QStringList::join()}{join},
- \l{QStringList::removeDuplicates()}{removeDuplicates},
- \l{QStringList::sort()}{sort}.
-
- \section1 More Information on Using Qt Containers
-
- For a detailed discussion comparing Qt containers with each other and
- with STL containers, see \l {Understand the Qt Containers}.
-
- \sa QListIterator, QMutableListIterator, QLinkedList, QVector
-*/
-
-/*!
- \fn template <class T> QList<T>::QList(QList<T> &&other)
-
- Move-constructs a QList instance, making it point at the same
- object that \a other was pointing to.
-
- \since 5.2
-*/
-
-/*! \fn template <class T> template<typename InputIterator> QList<T>::QList(InputIterator first, InputIterator last)
- \since 5.14
-
- Constructs a QList with the contents in the iterator range [\a first, \a last).
-
- The value type of \c InputIterator must be convertible to \c T.
-*/
-
-/*!
- \fn template <class T> QList<T> QList<T>::mid(int pos, int length) const
-
- Returns a sub-list which includes elements from this list,
- starting at position \a pos. If \a length is -1 (the default), all
- elements from \a pos are included; otherwise \a length elements (or
- all remaining elements if there are less than \a length elements)
- are included.
-*/
-
-/*! \fn template <class T> QList<T>::QList()
-
- Constructs an empty list.
-*/
-
-/*! \fn template <class T> QList<T>::QList(const QList<T> &other)
-
- Constructs a copy of \a other.
-
- This operation takes \l{Algorithmic Complexity}{constant time},
- because QList is \l{implicitly shared}. This makes returning a
- QList from a function very fast. If a shared instance is modified,
- it will be copied (copy-on-write), and that takes
- \l{Algorithmic Complexity}{linear time}.
-
- \sa operator=()
-*/
-
-/*! \fn template <class T> QList<T>::QList(std::initializer_list<T> args)
- \since 4.8
-
- Construct a list from the std::initializer_list specified by \a args.
-
- This constructor is only enabled if the compiler supports C++11 initializer
- lists.
-*/
-
-/*! \fn template <class T> QList<T>::~QList()
-
- Destroys the list. References to the values in the list and all
- iterators of this list become invalid.
-*/
-
-/*! \fn template <class T> QList<T> &QList<T>::operator=(const QList<T> &other)
-
- Assigns \a other to this list and returns a reference to this
- list.
-*/
-
-/*!
- \fn template <class T> QList &QList<T>::operator=(QList<T> &&other)
-
- Move-assigns \a other to this QList instance.
-
- \since 5.2
-*/
-
-/*! \fn template <class T> void QList<T>::swap(QList<T> &other)
- \since 4.8
-
- Swaps list \a other with this list. This operation is very
- fast and never fails.
-*/
-
-/*! \fn template <class T> bool QList<T>::operator==(const QList<T> &other) const
-
- Returns \c true if \a other is equal to this list; otherwise returns
- false.
-
- Two lists are considered equal if they contain the same values in
- the same order.
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- \sa operator!=()
-*/
-
-/*! \fn template <class T> bool QList<T>::operator!=(const QList<T> &other) const
-
- Returns \c true if \a other is not equal to this list; otherwise
- returns \c false.
-
- Two lists are considered equal if they contain the same values in
- the same order.
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- \sa operator==()
-*/
-
-/*! \fn template <class T> bool operator<(const QList<T> &lhs, const QList<T> &rhs)
- \since 5.6
- \relates QList
-
- Returns \c true if list \a lhs is
- \l{http://en.cppreference.com/w/cpp/algorithm/lexicographical_compare}
- {lexicographically less than} \a rhs; otherwise returns \c false.
-
- This function requires the value type to have an implementation
- of \c operator<().
-*/
-
-/*! \fn template <class T> bool operator<=(const QList<T> &lhs, const QList<T> &rhs)
- \since 5.6
- \relates QList
-
- Returns \c true if list \a lhs is
- \l{http://en.cppreference.com/w/cpp/algorithm/lexicographical_compare}
- {lexicographically less than or equal to} \a rhs; otherwise returns \c false.
-
- This function requires the value type to have an implementation
- of \c operator<().
-*/
-
-/*! \fn template <class T> bool operator>(const QList<T> &lhs, const QList<T> &rhs)
- \since 5.6
- \relates QList
-
- Returns \c true if list \a lhs is
- \l{http://en.cppreference.com/w/cpp/algorithm/lexicographical_compare}
- {lexicographically greater than} \a rhs; otherwise returns \c false.
-
- This function requires the value type to have an implementation
- of \c operator<().
-*/
-
-/*! \fn template <class T> bool operator>=(const QList<T> &lhs, const QList<T> &rhs)
- \since 5.6
- \relates QList
-
- Returns \c true if list \a lhs is
- \l{http://en.cppreference.com/w/cpp/algorithm/lexicographical_compare}
- {lexicographically greater than or equal to} \a rhs; otherwise returns \c false.
-
- This function requires the value type to have an implementation
- of \c operator<().
-*/
-
-/*!
- \fn template <class T> uint qHash(const QList<T> &key, uint seed = 0)
- \since 5.6
- \relates QList
-
- Returns the hash value for \a key,
- using \a seed to seed the calculation.
-
- This function requires qHash() to be overloaded for the value type \c T.
-*/
-
-/*!
- \fn template <class T> int QList<T>::size() const
-
- Returns the number of items in the list.
-
- \sa isEmpty(), count()
-*/
-
-/*! \fn template <class T> void QList<T>::detach()
-
- \internal
-*/
-
-/*! \fn template <class T> void QList<T>::detachShared()
-
- \internal
-
- like detach(), but does nothing if we're shared_null.
- This prevents needless mallocs, and makes QList more exception safe
- in case of cleanup work done in destructors on empty lists.
-*/
-
-/*! \fn template <class T> bool QList<T>::isDetached() const
-
- \internal
-*/
-
-/*! \fn template <class T> void QList<T>::setSharable(bool sharable)
-
- \internal
-*/
-
-/*! \fn template <class T> bool QList<T>::isSharedWith(const QList<T> &other) const
-
- \internal
-*/
-
-/*! \fn template <class T> bool QList<T>::isEmpty() const
-
- Returns \c true if the list contains no items; otherwise returns
- false.
-
- \sa size()
-*/
-
-/*! \fn template <class T> void QList<T>::clear()
-
- Removes all items from the list.
-
- \sa removeAll()
-*/
-
-/*! \fn template <class T> const T &QList<T>::at(int i) const
-
- Returns the item at index position \a i in the list. \a i must be
- a valid index position in the list (i.e., 0 <= \a i < size()).
-
- This function is very fast (\l{Algorithmic Complexity}{constant time}).
-
- \sa value(), operator[]()
-*/
-
-/*! \fn template <class T> T &QList<T>::operator[](int i)
-
- Returns the item at index position \a i as a modifiable reference.
- \a i must be a valid index position in the list (i.e., 0 <= \a i <
- size()).
-
- If this function is called on a list that is currently being shared, it
- will trigger a copy of all elements. Otherwise, this function runs in
- \l{Algorithmic Complexity}{constant time}. If you do not want to modify
- the list you should use QList::at().
-
- \sa at(), value()
-*/
-
-/*! \fn template <class T> const T &QList<T>::operator[](int i) const
-
- \overload
-
- Same as at(). This function runs in \l{Algorithmic Complexity}{constant time}.
-*/
-
-/*! \fn template <class T> void QList<T>::reserve(int alloc)
-
- Reserve space for \a alloc elements.
-
- If \a alloc is smaller than the current size of the list, nothing will happen.
-
- Use this function to avoid repetetive reallocation of QList's internal
- data if you can predict how many elements will be appended.
- Note that the reservation applies only to the internal pointer array.
-
- \since 4.7
-*/
-
-/*! \fn template <class T> void QList<T>::append(const T &value)
-
- Inserts \a value at the end of the list.
-
- Example:
- \snippet code/src_corelib_tools_qlistdata.cpp 6
-
- This is the same as list.insert(size(), \a value).
-
- If this list is not shared, this operation is typically
- very fast (amortized \l{Algorithmic Complexity}{constant time}),
- because QList preallocates extra space on both sides of its
- internal buffer to allow for fast growth at both ends of the list.
-
- \sa operator<<(), prepend(), insert()
-*/
-
-/*! \fn template <class T> void QList<T>::append(const QList<T> &value)
-
- \overload
-
- \since 4.5
-
- Appends the items of the \a value list to this list.
-
- \sa operator<<(), operator+=()
-*/
-
-/*! \fn template <class T> void QList<T>::prepend(const T &value)
-
- Inserts \a value at the beginning of the list.
-
- Example:
- \snippet code/src_corelib_tools_qlistdata.cpp 7
-
- This is the same as list.insert(0, \a value).
-
- If this list is not shared, this operation is typically
- very fast (amortized \l{Algorithmic Complexity}{constant time}),
- because QList preallocates extra space on both sides of its
- internal buffer to allow for fast growth at both ends of the list.
-
- \sa append(), insert()
-*/
-
-/*! \fn template <class T> void QList<T>::insert(int i, const T &value)
-
- Inserts \a value at index position \a i in the list.
-
- If \a i == 0, the value is prepended to the list. If \a i == size(),
- the value is appended to the list.
-
- Example:
- \snippet code/src_corelib_tools_qlistdata.cpp 8
-
- \sa append(), prepend(), replace(), removeAt()
-*/
-
-/*! \fn template <class T> QList<T>::iterator QList<T>::insert(iterator before, const T &value)
-
- \overload
-
- Inserts \a value in front of the item pointed to by the
- iterator \a before. Returns an iterator pointing at the inserted
- item. Note that the iterator passed to the function will be
- invalid after the call; the returned iterator should be used
- instead.
-*/
-
-/*! \fn template <class T> void QList<T>::replace(int i, const T &value)
-
- Replaces the item at index position \a i with \a value. \a i must
- be a valid index position in the list (i.e., 0 <= \a i < size()).
-
- \sa operator[](), removeAt()
-*/
-
-/*!
- \fn template <class T> int QList<T>::removeAll(const T &value)
-
- Removes all occurrences of \a value in the list and returns the
- number of entries removed.
-
- Example:
- \snippet code/src_corelib_tools_qlistdata.cpp 9
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- \sa removeOne(), removeAt(), takeAt(), replace()
-*/
-
-/*!
- \fn template <class T> bool QList<T>::removeOne(const T &value)
- \since 4.4
-
- Removes the first occurrence of \a value in the list and returns
- true on success; otherwise returns \c false.
-
- Example:
- \snippet code/src_corelib_tools_qlistdata.cpp 10
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- \sa removeAll(), removeAt(), takeAt(), replace()
-*/
-
-/*! \fn template <class T> void QList<T>::removeAt(int i)
-
- Removes the item at index position \a i. \a i must be a valid
- index position in the list (i.e., 0 <= \a i < size()).
-
- \sa takeAt(), removeFirst(), removeLast(), removeOne()
-*/
-
-/*! \fn template <class T> T QList<T>::takeAt(int i)
-
- Removes the item at index position \a i and returns it. \a i must
- be a valid index position in the list (i.e., 0 <= \a i < size()).
-
- If you don't use the return value, removeAt() is more efficient.
-
- \sa removeAt(), takeFirst(), takeLast()
-*/
-
-/*! \fn template <class T> T QList<T>::takeFirst()
-
- Removes the first item in the list and returns it. This is the
- same as takeAt(0). This function assumes the list is not empty. To
- avoid failure, call isEmpty() before calling this function.
-
- If this list is not shared, this operation takes
- \l {Algorithmic Complexity}{constant time}.
-
- If you don't use the return value, removeFirst() is more
- efficient.
-
- \sa takeLast(), takeAt(), removeFirst()
-*/
-
-/*! \fn template <class T> T QList<T>::takeLast()
-
- Removes the last item in the list and returns it. This is the
- same as takeAt(size() - 1). This function assumes the list is
- not empty. To avoid failure, call isEmpty() before calling this
- function.
-
- If this list is not shared, this operation takes
- \l {Algorithmic Complexity}{constant time}.
-
- If you don't use the return value, removeLast() is more
- efficient.
-
- \sa takeFirst(), takeAt(), removeLast()
-*/
-
-/*! \fn template <class T> void QList<T>::move(int from, int to)
-
- Moves the item at index position \a from to index position \a to.
-
- Example:
- \snippet code/src_corelib_tools_qlistdata.cpp 11
-
- This is the same as insert(\a{to}, takeAt(\a{from})).This function
- assumes that both \a from and \a to are at least 0 but less than
- size(). To avoid failure, test that both \a from and \a to are at
- least 0 and less than size().
-
- \sa swap(), insert(), takeAt()
-*/
-
-/*! \fn template <class T> void QList<T>::swap(int i, int j)
-
- \obsolete Use swapItemsAt()
-
- \sa move(), swapItemsAt()
-*/
-
-/*! \fn template <class T> void QList<T>::swapItemsAt(int i, int j)
- \since 5.13
-
- Exchange the item at index position \a i with the item at index
- position \a j. This function assumes that both \a i and \a j are
- at least 0 but less than size(). To avoid failure, test that both
- \a i and \a j are at least 0 and less than size().
-
- Example:
- \snippet code/src_corelib_tools_qlistdata.cpp 12
-
- \sa move()
-*/
-
-/*! \fn template <class T> int QList<T>::indexOf(const T &value, int from = 0) const
-
- Returns the index position of the first occurrence of \a value in
- the list, searching forward from index position \a from. Returns
- -1 if no item matched.
-
- Example:
- \snippet code/src_corelib_tools_qlistdata.cpp 13
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- Note that QList uses 0-based indexes, just like C++ arrays. Negative
- indexes are not supported with the exception of the value mentioned
- above.
-
- \sa lastIndexOf(), contains()
-*/
-
-/*! \fn template <class T> int QList<T>::lastIndexOf(const T &value, int from = -1) const
-
- Returns the index position of the last occurrence of \a value in
- the list, searching backward from index position \a from. If \a
- from is -1 (the default), the search starts at the last item.
- Returns -1 if no item matched.
-
- Example:
- \snippet code/src_corelib_tools_qlistdata.cpp 14
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- Note that QList uses 0-based indexes, just like C++ arrays. Negative
- indexes are not supported with the exception of the value mentioned
- above.
-
- \sa indexOf()
-*/
-
-/*! \fn template <class T> bool QList<T>::contains(const T &value) const
-
- Returns \c true if the list contains an occurrence of \a value;
- otherwise returns \c false.
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- \sa indexOf(), count()
-*/
-
-/*! \fn template <class T> int QList<T>::count(const T &value) const
-
- Returns the number of occurrences of \a value in the list.
-
- This function requires the value type to have an implementation of
- \c operator==().
-
- \sa contains(), indexOf()
-*/
-
-/*! \fn template <class T> bool QList<T>::startsWith(const T &value) const
- \since 4.5
-
- Returns \c true if this list is not empty and its first
- item is equal to \a value; otherwise returns \c false.
-
- \sa isEmpty(), contains()
-*/
-
-/*! \fn template <class T> bool QList<T>::endsWith(const T &value) const
- \since 4.5
-
- Returns \c true if this list is not empty and its last
- item is equal to \a value; otherwise returns \c false.
-
- \sa isEmpty(), contains()
-*/
-
-/*! \fn template <class T> QList<T>::iterator QList<T>::begin()
-
- Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in
- the list.
-
- \sa constBegin(), end()
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator QList<T>::begin() const
-
- \overload
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator QList<T>::cbegin() const
- \since 5.0
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
- in the list.
-
- \sa begin(), cend()
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator QList<T>::constBegin() const
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
- in the list.
-
- \sa begin(), constEnd()
-*/
-
-/*! \fn template <class T> QList<T>::iterator QList<T>::end()
-
- Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item
- after the last item in the list.
-
- \sa begin(), constEnd()
-*/
-
-/*! \fn template <class T> const_iterator QList<T>::end() const
-
- \overload
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator QList<T>::cend() const
- \since 5.0
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- item after the last item in the list.
-
- \sa cbegin(), end()
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator QList<T>::constEnd() const
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- item after the last item in the list.
-
- \sa constBegin(), end()
-*/
-
-/*! \fn template <class T> QList<T>::reverse_iterator QList<T>::rbegin()
- \since 5.6
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- item in the list, in reverse order.
-
- \sa begin(), crbegin(), rend()
-*/
-
-/*! \fn template <class T> QList<T>::const_reverse_iterator QList<T>::rbegin() const
- \since 5.6
- \overload
-*/
-
-/*! \fn template <class T> QList<T>::const_reverse_iterator QList<T>::crbegin() const
- \since 5.6
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- item in the list, in reverse order.
-
- \sa begin(), rbegin(), rend()
-*/
-
-/*! \fn template <class T> QList<T>::reverse_iterator QList<T>::rend()
- \since 5.6
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last item in the list, in reverse order.
-
- \sa end(), crend(), rbegin()
-*/
-
-/*! \fn template <class T> QList<T>::const_reverse_iterator QList<T>::rend() const
- \since 5.6
- \overload
-*/
-
-/*! \fn template <class T> QList<T>::const_reverse_iterator QList<T>::crend() const
- \since 5.6
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to one
- past the last item in the list, in reverse order.
-
- \sa end(), rend(), rbegin()
-*/
-
-/*! \fn template <class T> QList<T>::iterator QList<T>::erase(iterator pos)
-
- Removes the item associated with the iterator \a pos from the
- list, and returns an iterator to the next item in the list (which
- may be end()).
-
- \sa insert(), removeAt()
-*/
-
-/*! \fn template <class T> QList<T>::iterator QList<T>::erase(iterator begin, iterator end)
-
- \overload
-
- Removes all the items from \a begin up to (but not including) \a
- end. Returns an iterator to the same item that \a end referred to
- before the call.
-*/
-
-/*! \typedef QList::Iterator
-
- Qt-style synonym for QList::iterator.
-*/
-
-/*! \typedef QList::ConstIterator
-
- Qt-style synonym for QList::const_iterator.
-*/
-
-/*!
- \typedef QList::size_type
-
- Typedef for int. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QList::value_type
-
- Typedef for T. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QList::difference_type
-
- Typedef for ptrdiff_t. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QList::pointer
-
- Typedef for T *. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QList::const_pointer
-
- Typedef for const T *. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QList::reference
-
- Typedef for T &. Provided for STL compatibility.
-*/
-
-/*!
- \typedef QList::const_reference
-
- Typedef for const T &. Provided for STL compatibility.
-*/
-
-/*! \typedef QList::reverse_iterator
- \since 5.6
-
- The QList::reverse_iterator typedef provides an STL-style non-const
- reverse iterator for QList.
-
- It is simply a typedef for \c{std::reverse_iterator<iterator>}.
-
- \warning Iterators on implicitly shared containers do not work
- exactly like STL-iterators. You should avoid copying a container
- while iterators are active on that container. For more information,
- read \l{Implicit sharing iterator problem}.
-
- \sa QList::rbegin(), QList::rend(), QList::const_reverse_iterator, QList::iterator
-*/
-
-/*! \typedef QList::const_reverse_iterator
- \since 5.6
-
- The QList::const_reverse_iterator typedef provides an STL-style const
- reverse iterator for QList.
-
- It is simply a typedef for \c{std::reverse_iterator<const_iterator>}.
-
- \warning Iterators on implicitly shared containers do not work
- exactly like STL-iterators. You should avoid copying a container
- while iterators are active on that container. For more information,
- read \l{Implicit sharing iterator problem}.
-
- \sa QList::rbegin(), QList::rend(), QList::reverse_iterator, QList::const_iterator
-*/
-
-/*! \fn template <class T> int QList<T>::count() const
-
- Returns the number of items in the list. This is effectively the
- same as size().
-*/
-
-/*! \fn template <class T> int QList<T>::length() const
- \since 4.5
-
- This function is identical to count().
-
- \sa count()
-*/
-
-/*! \fn template <class T> T& QList<T>::first()
-
- Returns a reference to the first item in the list. The list must
- not be empty. If the list can be empty, call isEmpty() before
- calling this function.
-
- \sa constFirst(), last(), isEmpty()
-*/
-
-/*! \fn template <class T> const T& QList<T>::first() const
-
- \overload
-*/
-
-/*! \fn template <class T> const T& QList<T>::constFirst() const
- \since 5.6
-
- Returns a const reference to the first item in the list. The list must
- not be empty. If the list can be empty, call isEmpty() before
- calling this function.
-
- \sa constLast(), isEmpty(), first()
-*/
-
-/*! \fn template <class T> T& QList<T>::last()
-
- Returns a reference to the last item in the list. The list must
- not be empty. If the list can be empty, call isEmpty() before
- calling this function.
-
- \sa constLast(), first(), isEmpty()
-*/
-
-/*! \fn template <class T> const T& QList<T>::last() const
-
- \overload
-*/
-
-/*! \fn template <class T> const T& QList<T>::constLast() const
- \since 5.6
-
- Returns a reference to the last item in the list. The list must
- not be empty. If the list can be empty, call isEmpty() before
- calling this function.
-
- \sa constFirst(), isEmpty(), last()
-*/
-
-/*! \fn template <class T> void QList<T>::removeFirst()
-
- Removes the first item in the list. Calling this function is
- equivalent to calling removeAt(0). The list must not be empty. If
- the list can be empty, call isEmpty() before calling this
- function.
-
- \sa removeAt(), takeFirst()
-*/
-
-/*! \fn template <class T> void QList<T>::removeLast()
-
- Removes the last item in the list. Calling this function is
- equivalent to calling removeAt(size() - 1). The list must not be
- empty. If the list can be empty, call isEmpty() before calling
- this function.
-
- \sa removeAt(), takeLast()
-*/
-
-/*! \fn template <class T> T QList<T>::value(int i) const
-
- Returns the value at index position \a i in the list.
-
- If the index \a i is out of bounds, the function returns a
- \l{default-constructed value}. If you are certain that the index
- is going to be within bounds, you can use at() instead, which is
- slightly faster.
-
- \sa at(), operator[]()
-*/
-
-/*! \fn template <class T> T QList<T>::value(int i, const T &defaultValue) const
-
- \overload
-
- If the index \a i is out of bounds, the function returns
- \a defaultValue.
-*/
-
-/*! \fn template <class T> void QList<T>::push_back(const T &value)
-
- This function is provided for STL compatibility. It is equivalent
- to \l{QList::append()}{append(\a value)}.
-*/
-
-/*! \fn template <class T> void QList<T>::push_front(const T &value)
-
- This function is provided for STL compatibility. It is equivalent
- to \l{QList::prepend()}{prepend(\a value)}.
-*/
-
-/*! \fn template <class T> T& QList<T>::front()
-
- This function is provided for STL compatibility. It is equivalent
- to first(). The list must not be empty. If the list can be empty,
- call isEmpty() before calling this function.
-*/
-
-/*! \fn template <class T> const T& QList<T>::front() const
-
- \overload
-*/
-
-/*! \fn template <class T> T& QList<T>::back()
-
- This function is provided for STL compatibility. It is equivalent
- to last(). The list must not be empty. If the list can be empty,
- call isEmpty() before calling this function.
-*/
-
-/*! \fn template <class T> const T& QList<T>::back() const
-
- \overload
-*/
-
-/*! \fn template <class T> void QList<T>::pop_front()
-
- This function is provided for STL compatibility. It is equivalent
- to removeFirst(). The list must not be empty. If the list can be
- empty, call isEmpty() before calling this function.
-*/
-
-/*! \fn template <class T> void QList<T>::pop_back()
-
- This function is provided for STL compatibility. It is equivalent
- to removeLast(). The list must not be empty. If the list can be
- empty, call isEmpty() before calling this function.
-*/
-
-/*! \fn template <class T> bool QList<T>::empty() const
-
- This function is provided for STL compatibility. It is equivalent
- to isEmpty() and returns \c true if the list is empty.
-*/
-
-/*! \fn template <class T> QList<T> &QList<T>::operator+=(const QList<T> &other)
-
- Appends the items of the \a other list to this list and returns a
- reference to this list.
-
- \sa operator+(), append()
-*/
-
-/*! \fn template <class T> void QList<T>::operator+=(const T &value)
-
- \overload
-
- Appends \a value to the list.
-
- \sa append(), operator<<()
-*/
-
-/*! \fn template <class T> QList<T> QList<T>::operator+(const QList<T> &other) const
-
- Returns a list that contains all the items in this list followed
- by all the items in the \a other list.
-
- \sa operator+=()
-*/
-
-/*! \fn template <class T> QList<T> &QList<T>::operator<<(const QList<T> &other)
-
- Appends the items of the \a other list to this list and returns a
- reference to this list.
-
- \sa operator+=(), append()
-*/
-
-/*! \fn template <class T> void QList<T>::operator<<(const T &value)
-
- \overload
-
- Appends \a value to the list.
-*/
-
-/*! \class QList::iterator
- \inmodule QtCore
- \brief The QList::iterator class provides an STL-style non-const iterator for QList and QQueue.
-
- QList features both \l{STL-style iterators} and \l{Java-style
- iterators}. The STL-style iterators are more low-level and more
- cumbersome to use; on the other hand, they are slightly faster
- and, for developers who already know STL, have the advantage of
- familiarity.
-
- QList\<T\>::iterator allows you to iterate over a QList\<T\> (or
- QQueue\<T\>) and to modify the list item associated with the
- iterator. If you want to iterate over a const QList, use
- QList::const_iterator instead. It is generally good practice to
- use QList::const_iterator on a non-const QList as well, unless
- you need to change the QList through the iterator. Const
- iterators are slightly faster, and can improve code readability.
-
- The default QList::iterator constructor creates an uninitialized
- iterator. You must initialize it using a QList function like
- QList::begin(), QList::end(), or QList::insert() before you can
- start iterating. Here's a typical loop that prints all the items
- stored in a list:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 15
-
- Let's see a few examples of things we can do with a
- QList::iterator that we cannot do with a QList::const_iterator.
- Here's an example that increments every value stored in a
- QList\<int\> by 2:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 16
-
- Most QList functions accept an integer index rather than an
- iterator. For that reason, iterators are rarely useful in
- connection with QList. One place where STL-style iterators do
- make sense is as arguments to \l{generic algorithms}.
-
- For example, here's how to delete all the widgets stored in a
- QList\<QWidget *\>:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 17
-
- Multiple iterators can be used on the same list. However, be
- aware that any non-const function call performed on the QList
- will render all existing iterators undefined. If you need to keep
- iterators over a long period of time, we recommend that you use
- QLinkedList rather than QList.
-
- \warning Iterators on implicitly shared containers do not work
- exactly like STL-iterators. You should avoid copying a container
- while iterators are active on that container. For more information,
- read \l{Implicit sharing iterator problem}.
-
- \sa QList::const_iterator, QMutableListIterator
-*/
-
-/*! \typedef QList::iterator::iterator_category
-
- A synonym for \e {std::random_access_iterator_tag} indicating
- this iterator is a random access iterator.
-*/
-
-/*! \typedef QList::iterator::difference_type
-
- \internal
-*/
-
-/*! \typedef QList::iterator::value_type
-
- \internal
-*/
-
-/*! \typedef QList::iterator::pointer
-
- \internal
-*/
-
-/*! \typedef QList::iterator::reference
-
- \internal
-*/
-
-/*! \fn template <class T> QList<T>::iterator::iterator()
-
- Constructs an uninitialized iterator.
-
- Functions like operator*() and operator++() should not be called
- on an uninitialized iterator. Use operator=() to assign a value
- to it before using it.
-
- \sa QList::begin(), QList::end()
-*/
-
-/*! \fn template <class T> QList<T>::iterator::iterator(Node *node)
-
- \internal
-*/
-
-/*! \fn template <class T> QList<T>::iterator::iterator(const iterator &other)
-
- Constructs a copy of \a other.
-*/
-
-/*! \fn template <class T> T &QList<T>::iterator::operator*() const
-
- Returns a modifiable reference to the current item.
-
- You can change the value of an item by using operator*() on the
- left side of an assignment, for example:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 18
-
- \sa operator->()
-*/
-
-/*! \fn template <class T> T *QList<T>::iterator::operator->() const
-
- Returns a pointer to the current item.
-
- \sa operator*()
-*/
-
-/*! \fn template <class T> T &QList<T>::iterator::operator[](difference_type j) const
-
- Returns a modifiable reference to the item at position *this +
- \a{j}.
-
- This function is provided to make QList iterators behave like C++
- pointers.
-
- \sa operator+()
-*/
-
-/*!
- \fn template <class T> bool QList<T>::iterator::operator==(const iterator &other) const
- \fn template <class T> bool QList<T>::iterator::operator==(const const_iterator &other) const
-
- Returns \c true if \a other points to the same item as this
- iterator; otherwise returns \c false.
-
- \sa operator!=()
-*/
-
-/*!
- \fn template <class T> bool QList<T>::iterator::operator!=(const iterator &other) const
- \fn template <class T> bool QList<T>::iterator::operator!=(const const_iterator &other) const
-
- Returns \c true if \a other points to a different item than this
- iterator; otherwise returns \c false.
-
- \sa operator==()
-*/
-
-/*!
- \fn template <class T> bool QList<T>::iterator::operator<(const iterator& other) const
- \fn template <class T> bool QList<T>::iterator::operator<(const const_iterator& other) const
-
- Returns \c true if the item pointed to by this iterator is less than
- the item pointed to by the \a other iterator.
-*/
-
-/*!
- \fn template <class T> bool QList<T>::iterator::operator<=(const iterator& other) const
- \fn template <class T> bool QList<T>::iterator::operator<=(const const_iterator& other) const
-
- Returns \c true if the item pointed to by this iterator is less than
- or equal to the item pointed to by the \a other iterator.
-*/
-
-/*!
- \fn template <class T> bool QList<T>::iterator::operator>(const iterator& other) const
- \fn template <class T> bool QList<T>::iterator::operator>(const const_iterator& other) const
-
- Returns \c true if the item pointed to by this iterator is greater
- than the item pointed to by the \a other iterator.
-*/
-
-/*!
- \fn template <class T> bool QList<T>::iterator::operator>=(const iterator& other) const
- \fn template <class T> bool QList<T>::iterator::operator>=(const const_iterator& other) const
-
- Returns \c true if the item pointed to by this iterator is greater
- than or equal to the item pointed to by the \a other iterator.
-*/
-
-/*! \fn template <class T> QList<T>::iterator &QList<T>::iterator::operator++()
-
- The prefix ++ operator (\c{++it}) advances the iterator to the
- next item in the list and returns an iterator to the new current
- item.
-
- Calling this function on QList::end() leads to undefined results.
-
- \sa operator--()
-*/
-
-/*! \fn template <class T> QList<T>::iterator QList<T>::iterator::operator++(int)
-
- \overload
-
- The postfix ++ operator (\c{it++}) advances the iterator to the
- next item in the list and returns an iterator to the previously
- current item.
-*/
-
-/*! \fn template <class T> QList<T>::iterator &QList<T>::iterator::operator--()
-
- The prefix -- operator (\c{--it}) makes the preceding item
- current and returns an iterator to the new current item.
-
- Calling this function on QList::begin() leads to undefined results.
-
- \sa operator++()
-*/
-
-/*! \fn template <class T> QList<T>::iterator QList<T>::iterator::operator--(int)
-
- \overload
-
- The postfix -- operator (\c{it--}) makes the preceding item
- current and returns an iterator to the previously current item.
-*/
-
-/*! \fn template <class T> QList<T>::iterator &QList<T>::iterator::operator+=(difference_type j)
-
- Advances the iterator by \a j items. (If \a j is negative, the
- iterator goes backward.)
-
- \sa operator-=(), operator+()
-*/
-
-/*! \fn template <class T> QList<T>::iterator &QList<T>::iterator::operator-=(difference_type j)
-
- Makes the iterator go back by \a j items. (If \a j is negative,
- the iterator goes forward.)
-
- \sa operator+=(), operator-()
-*/
-
-/*! \fn template <class T> QList<T>::iterator QList<T>::iterator::operator+(difference_type j) const
-
- Returns an iterator to the item at \a j positions forward from
- this iterator. (If \a j is negative, the iterator goes backward.)
-
- \sa operator-(), operator+=()
-*/
-
-/*! \fn template <class T> QList<T>::iterator QList<T>::iterator::operator-(difference_type j) const
-
- Returns an iterator to the item at \a j positions backward from
- this iterator. (If \a j is negative, the iterator goes forward.)
-
- \sa operator+(), operator-=()
-*/
-
-/*! \fn template <class T> int QList<T>::iterator::operator-(iterator other) const
-
- Returns the number of items between the item pointed to by \a
- other and the item pointed to by this iterator.
-*/
-
-/*! \class QList::const_iterator
- \inmodule QtCore
- \brief The QList::const_iterator class provides an STL-style const iterator for QList and QQueue.
-
- QList provides both \l{STL-style iterators} and \l{Java-style
- iterators}. The STL-style iterators are more low-level and more
- cumbersome to use; on the other hand, they are slightly faster
- and, for developers who already know STL, have the advantage of
- familiarity.
-
- QList\<T\>::const_iterator allows you to iterate over a
- QList\<T\> (or a QQueue\<T\>). If you want to modify the QList as
- you iterate over it, use QList::iterator instead. It is generally
- good practice to use QList::const_iterator on a non-const QList
- as well, unless you need to change the QList through the
- iterator. Const iterators are slightly faster, and can improve
- code readability.
-
- The default QList::const_iterator constructor creates an
- uninitialized iterator. You must initialize it using a QList
- function like QList::constBegin(), QList::constEnd(), or
- QList::insert() before you can start iterating. Here's a typical
- loop that prints all the items stored in a list:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 19
-
- Most QList functions accept an integer index rather than an
- iterator. For that reason, iterators are rarely useful in
- connection with QList. One place where STL-style iterators do
- make sense is as arguments to \l{generic algorithms}.
-
- For example, here's how to delete all the widgets stored in a
- QList\<QWidget *\>:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 20
-
- Multiple iterators can be used on the same list. However, be
- aware that any non-const function call performed on the QList
- will render all existing iterators undefined. If you need to keep
- iterators over a long period of time, we recommend that you use
- QLinkedList rather than QList.
-
- \warning Iterators on implicitly shared containers do not work
- exactly like STL-iterators. You should avoid copying a container
- while iterators are active on that container. For more information,
- read \l{Implicit sharing iterator problem}.
-
- \sa QList::iterator, QListIterator
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator::const_iterator()
-
- Constructs an uninitialized iterator.
-
- Functions like operator*() and operator++() should not be called
- on an uninitialized iterator. Use operator=() to assign a value
- to it before using it.
-
- \sa QList::constBegin(), QList::constEnd()
-*/
-
-/*! \typedef QList::const_iterator::iterator_category
-
- A synonym for \e {std::random_access_iterator_tag} indicating
- this iterator is a random access iterator.
-*/
-
-/*! \typedef QList::const_iterator::difference_type
-
- \internal
-*/
-
-/*! \typedef QList::const_iterator::value_type
-
- \internal
-*/
-
-/*! \typedef QList::const_iterator::pointer
-
- \internal
-*/
-
-/*! \typedef QList::const_iterator::reference
-
- \internal
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator::const_iterator(Node *node)
-
- \internal
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator::const_iterator(const const_iterator &other)
-
- Constructs a copy of \a other.
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator::const_iterator(const iterator &other)
-
- Constructs a copy of \a other.
-*/
-
-/*! \fn template <class T> const T &QList<T>::const_iterator::operator*() const
-
- Returns the current item.
-
- \sa operator->()
-*/
-
-/*! \fn template <class T> const T *QList<T>::const_iterator::operator->() const
-
- Returns a pointer to the current item.
-
- \sa operator*()
-*/
-
-/*! \fn template <class T> const T &QList<T>::const_iterator::operator[](difference_type j) const
-
- Returns the item at position *this + \a{j}.
-
- This function is provided to make QList iterators behave like C++
- pointers.
-
- \sa operator+()
-*/
-
-/*! \fn template <class T> bool QList<T>::const_iterator::operator==(const const_iterator &other) const
-
- Returns \c true if \a other points to the same item as this
- iterator; otherwise returns \c false.
-
- \sa operator!=()
-*/
-
-/*! \fn template <class T> bool QList<T>::const_iterator::operator!=(const const_iterator &other) const
-
- Returns \c true if \a other points to a different item than this
- iterator; otherwise returns \c false.
-
- \sa operator==()
-*/
-
-/*!
- \fn template <class T> bool QList<T>::const_iterator::operator<(const const_iterator& other) const
-
- Returns \c true if the item pointed to by this iterator is less than
- the item pointed to by the \a other iterator.
-*/
-
-/*!
- \fn template <class T> bool QList<T>::const_iterator::operator<=(const const_iterator& other) const
-
- Returns \c true if the item pointed to by this iterator is less than
- or equal to the item pointed to by the \a other iterator.
-*/
-
-/*!
- \fn template <class T> bool QList<T>::const_iterator::operator>(const const_iterator& other) const
-
- Returns \c true if the item pointed to by this iterator is greater
- than the item pointed to by the \a other iterator.
-*/
-
-/*!
- \fn template <class T> bool QList<T>::const_iterator::operator>=(const const_iterator& other) const
-
- Returns \c true if the item pointed to by this iterator is greater
- than or equal to the item pointed to by the \a other iterator.
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator &QList<T>::const_iterator::operator++()
-
- The prefix ++ operator (\c{++it}) advances the iterator to the
- next item in the list and returns an iterator to the new current
- item.
-
- Calling this function on QList::end() leads to undefined results.
-
- \sa operator--()
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator QList<T>::const_iterator::operator++(int)
-
- \overload
-
- The postfix ++ operator (\c{it++}) advances the iterator to the
- next item in the list and returns an iterator to the previously
- current item.
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator &QList<T>::const_iterator::operator--()
-
- The prefix -- operator (\c{--it}) makes the preceding item
- current and returns an iterator to the new current item.
-
- Calling this function on QList::begin() leads to undefined results.
-
- \sa operator++()
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator QList<T>::const_iterator::operator--(int)
-
- \overload
-
- The postfix -- operator (\c{it--}) makes the preceding item
- current and returns an iterator to the previously current item.
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator &QList<T>::const_iterator::operator+=(difference_type j)
-
- Advances the iterator by \a j items. (If \a j is negative, the
- iterator goes backward.)
-
- \sa operator-=(), operator+()
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator &QList<T>::const_iterator::operator-=(difference_type j)
-
- Makes the iterator go back by \a j items. (If \a j is negative,
- the iterator goes forward.)
-
- \sa operator+=(), operator-()
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator QList<T>::const_iterator::operator+(difference_type j) const
-
- Returns an iterator to the item at \a j positions forward from
- this iterator. (If \a j is negative, the iterator goes backward.)
-
- \sa operator-(), operator+=()
-*/
-
-/*! \fn template <class T> QList<T>::const_iterator QList<T>::const_iterator::operator-(difference_type j) const
-
- Returns an iterator to the item at \a j positions backward from
- this iterator. (If \a j is negative, the iterator goes forward.)
-
- \sa operator+(), operator-=()
-*/
-
-/*! \fn template <class T> int QList<T>::const_iterator::operator-(const_iterator other) const
-
- Returns the number of items between the item pointed to by \a
- other and the item pointed to by this iterator.
-*/
-
-/*! \fn template <class T> QDataStream &operator<<(QDataStream &out, const QList<T> &list)
- \relates QList
-
- Writes the list \a list to stream \a out.
-
- This function requires the value type to implement \c
- operator<<().
-
- \sa{Serializing Qt Data Types}{Format of the QDataStream operators}
-*/
-
-/*! \fn template <class T> QDataStream &operator>>(QDataStream &in, QList<T> &list)
- \relates QList
-
- Reads a list from stream \a in into \a list.
-
- This function requires the value type to implement \c
- operator>>().
-
- \sa{Serializing Qt Data Types}{Format of the QDataStream operators}
-*/
-
-/*! \fn template <class T> QList<T> QList<T>::fromVector(const QVector<T> &vector)
-
- Returns a QList object with the data contained in \a vector.
-
- Example:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 21
-
- \include containers-range-constructor.qdocinc
-
- \sa fromSet(), toVector(), QVector::toList()
-*/
-
-/*! \fn template <class T> QVector<T> QList<T>::toVector() const
-
- Returns a QVector object with the data contained in this QList.
-
- Example:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 22
-
- \include containers-range-constructor.qdocinc
-
- \sa toSet(), fromVector(), QVector::fromList()
-*/
-
-/*! \fn template <class T> QList<T> QList<T>::fromSet(const QSet<T> &set)
-
- Returns a QList object with the data contained in \a set. The
- order of the elements in the QList is undefined.
-
- Example:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 23
-
- \include containers-range-constructor.qdocinc
-
- \sa fromVector(), toSet(), QSet::toList()
-*/
-
-/*! \fn template <class T> QSet<T> QList<T>::toSet() const
-
- Returns a QSet object with the data contained in this QList.
- Since QSet doesn't allow duplicates, the resulting QSet might be
- smaller than the original list was.
-
- Example:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 24
-
- \include containers-range-constructor.qdocinc
-
- \sa toVector(), fromSet(), QSet::fromList()
-*/
-
-/*! \fn template <class T> QList<T> QList<T>::fromStdList(const std::list<T> &list)
-
- Returns a QList object with the data contained in \a list. The
- order of the elements in the QList is the same as in \a list.
-
- Example:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 25
-
- \include containers-range-constructor.qdocinc
-
- \sa toStdList(), QVector::fromStdVector()
-*/
-
-/*! \fn template <class T> std::list<T> QList<T>::toStdList() const
-
- Returns a std::list object with the data contained in this QList.
- Example:
-
- \snippet code/src_corelib_tools_qlistdata.cpp 26
-
- \include containers-range-constructor.qdocinc
-
- \sa fromStdList(), QVector::toStdVector()
-*/
-
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h
index 8a11663c01..515fba6530 100644
--- a/src/corelib/tools/qlist.h
+++ b/src/corelib/tools/qlist.h
@@ -40,1163 +40,19 @@
#ifndef QLIST_H
#define QLIST_H
-#include <QtCore/qalgorithms.h>
-#include <QtCore/qiterator.h>
-#include <QtCore/qrefcount.h>
-#include <QtCore/qarraydata.h>
-#include <QtCore/qhashfunctions.h>
#include <QtCore/qvector.h>
-#include <QtCore/qcontainertools_impl.h>
-
-#include <algorithm>
-#include <initializer_list>
-#include <iterator>
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
-#include <list>
-#endif
-
-#include <stdlib.h>
-#include <new>
-#include <limits.h>
-#include <string.h>
-
-#ifdef Q_CC_MSVC
-#pragma warning( push )
-#pragma warning( disable : 4127 ) // "conditional expression is constant"
-#endif
+#include <QtCore/qcontainerfwd.h>
+#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
QT_BEGIN_NAMESPACE
-
-
-template <typename T> class QVector;
-template <typename T> class QSet;
-
-template <typename T> struct QListSpecialMethods
-{
-protected:
- ~QListSpecialMethods() = default;
-};
-template <> struct QListSpecialMethods<QByteArray>;
-template <> struct QListSpecialMethods<QString>;
-
-struct Q_CORE_EXPORT QListData {
- // tags for tag-dispatching of QList implementations,
- // based on QList's three different memory layouts:
- struct NotArrayCompatibleLayout {};
- struct NotIndirectLayout {};
- struct ArrayCompatibleLayout : NotIndirectLayout {}; // data laid out like a C array
- struct InlineWithPaddingLayout : NotArrayCompatibleLayout, NotIndirectLayout {}; // data laid out like a C array with padding
- struct IndirectLayout : NotArrayCompatibleLayout {}; // data allocated on the heap
-
- struct Data {
- QtPrivate::RefCount ref;
- int alloc, begin, end;
- void *array[1];
- };
- enum { DataHeaderSize = sizeof(Data) - sizeof(void *) };
-
- Data *detach(int alloc);
- Data *detach_grow(int *i, int n);
- void realloc(int alloc);
- void realloc_grow(int growth);
- inline void dispose() { dispose(d); }
- static void dispose(Data *d);
- static const Data shared_null;
- Data *d;
- void **erase(void **xi);
- void **append(int n);
- void **append();
- void **append(const QListData &l);
- void **prepend();
- void **insert(int i);
- void remove(int i);
- void remove(int i, int n);
- void move(int from, int to);
- inline int size() const noexcept { return int(d->end - d->begin); } // q6sizetype
- inline bool isEmpty() const noexcept { return d->end == d->begin; }
- inline void **at(int i) const noexcept { return d->array + d->begin + i; }
- inline void **begin() const noexcept { return d->array + d->begin; }
- inline void **end() const noexcept { return d->array + d->end; }
-};
-
-namespace QtPrivate {
- template <typename V, typename U> int indexOf(const QList<V> &list, const U &u, int from);
- template <typename V, typename U> int lastIndexOf(const QList<V> &list, const U &u, int from);
-}
-
-template <typename T>
-class QList
-#ifndef Q_QDOC
- : public QListSpecialMethods<T>
-#endif
-{
-public:
- struct MemoryLayout
- : std::conditional<
- // must stay isStatic until ### Qt 6 for BC reasons (don't use !isRelocatable)!
- QTypeInfo<T>::isStatic || QTypeInfo<T>::isLarge,
- QListData::IndirectLayout,
- typename std::conditional<
- sizeof(T) == sizeof(void*),
- QListData::ArrayCompatibleLayout,
- QListData::InlineWithPaddingLayout
- >::type>::type {};
-private:
- template <typename V, typename U> friend int QtPrivate::indexOf(const QList<V> &list, const U &u, int from);
- template <typename V, typename U> friend int QtPrivate::lastIndexOf(const QList<V> &list, const U &u, int from);
- struct Node { void *v;
-#if defined(Q_CC_BOR)
- Q_INLINE_TEMPLATE T &t();
-#else
- Q_INLINE_TEMPLATE T &t()
- { return *reinterpret_cast<T*>(QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic
- ? v : this); }
-#endif
- };
-
- union { QListData p; QListData::Data *d; };
-
-public:
- inline QList() noexcept : d(const_cast<QListData::Data *>(&QListData::shared_null)) { }
- QList(const QList<T> &l);
- ~QList();
- QList<T> &operator=(const QList<T> &l);
- inline QList(QList<T> &&other) noexcept
- : d(other.d) { other.d = const_cast<QListData::Data *>(&QListData::shared_null); }
- inline QList &operator=(QList<T> &&other) noexcept
- { QList moved(std::move(other)); swap(moved); return *this; }
- inline void swap(QList<T> &other) noexcept { qSwap(d, other.d); }
- inline QList(std::initializer_list<T> args)
- : QList(args.begin(), args.end()) {}
- template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
- QList(InputIterator first, InputIterator last);
- bool operator==(const QList<T> &l) const;
- inline bool operator!=(const QList<T> &l) const { return !(*this == l); }
-
- inline int size() const noexcept { return p.size(); }
-
- inline void detach() { if (d->ref.isShared()) detach_helper(); }
-
- inline void detachShared()
- {
- // The "this->" qualification is needed for GCCE.
- if (d->ref.isShared() && this->d != &QListData::shared_null)
- detach_helper();
- }
-
- inline bool isDetached() const { return !d->ref.isShared(); }
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- inline void setSharable(bool sharable)
- {
- if (sharable == d->ref.isSharable())
- return;
- if (!sharable)
- detach();
- if (d != &QListData::shared_null)
- d->ref.setSharable(sharable);
- }
-#endif
- inline bool isSharedWith(const QList<T> &other) const noexcept { return d == other.d; }
-
- inline bool isEmpty() const noexcept { return p.isEmpty(); }
-
- void clear();
-
- const T &at(int i) const;
- const T &operator[](int i) const;
- T &operator[](int i);
-
- void reserve(int size);
- void append(const T &t);
- void append(const QList<T> &t);
- void prepend(const T &t);
- void insert(int i, const T &t);
- void replace(int i, const T &t);
- void removeAt(int i);
- int removeAll(const T &t);
- bool removeOne(const T &t);
- T takeAt(int i);
- T takeFirst();
- T takeLast();
- void move(int from, int to);
- void swapItemsAt(int i, int j);
-#if QT_DEPRECATED_SINCE(5, 13) && QT_VERSION < QT_VERSION_CHECK(6,0,0)
- QT_DEPRECATED_X("Use QList<T>::swapItemsAt()")
- void swap(int i, int j) { swapItemsAt(i, j); }
-#endif
- int indexOf(const T &t, int from = 0) const;
- int lastIndexOf(const T &t, int from = -1) const;
- bool contains(const T &t) const;
- int count(const T &t) const;
-
- class const_iterator;
-
- class iterator {
- public:
- Node *i;
- typedef std::random_access_iterator_tag iterator_category;
- // ### Qt6: use int
- typedef qptrdiff difference_type;
- typedef T value_type;
- typedef T *pointer;
- typedef T &reference;
-
- inline iterator() noexcept : i(nullptr) {}
- inline iterator(Node *n) noexcept : i(n) {}
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
- // can't remove it in Qt 5, since doing so would make the type trivial,
- // which changes the way it's passed to functions by value.
- inline iterator(const iterator &o) noexcept : i(o.i){}
- inline iterator &operator=(const iterator &o) noexcept
- { i = o.i; return *this; }
-#endif
- inline T &operator*() const { return i->t(); }
- inline T *operator->() const { return &i->t(); }
- inline T &operator[](difference_type j) const { return i[j].t(); }
- inline bool operator==(const iterator &o) const noexcept { return i == o.i; }
- inline bool operator!=(const iterator &o) const noexcept { return i != o.i; }
- inline bool operator<(const iterator& other) const noexcept { return i < other.i; }
- inline bool operator<=(const iterator& other) const noexcept { return i <= other.i; }
- inline bool operator>(const iterator& other) const noexcept { return i > other.i; }
- inline bool operator>=(const iterator& other) const noexcept { return i >= other.i; }
-#ifndef QT_STRICT_ITERATORS
- inline bool operator==(const const_iterator &o) const noexcept
- { return i == o.i; }
- inline bool operator!=(const const_iterator &o) const noexcept
- { return i != o.i; }
- inline bool operator<(const const_iterator& other) const noexcept
- { return i < other.i; }
- inline bool operator<=(const const_iterator& other) const noexcept
- { return i <= other.i; }
- inline bool operator>(const const_iterator& other) const noexcept
- { return i > other.i; }
- inline bool operator>=(const const_iterator& other) const noexcept
- { return i >= other.i; }
-#endif
- inline iterator &operator++() { ++i; return *this; }
- inline iterator operator++(int) { Node *n = i; ++i; return n; }
- inline iterator &operator--() { i--; return *this; }
- inline iterator operator--(int) { Node *n = i; i--; return n; }
- inline iterator &operator+=(difference_type j) { i+=j; return *this; }
- inline iterator &operator-=(difference_type j) { i-=j; return *this; }
- inline iterator operator+(difference_type j) const { return iterator(i+j); }
- inline iterator operator-(difference_type j) const { return iterator(i-j); }
- friend inline iterator operator+(difference_type j, iterator k) { return k + j; }
- inline int operator-(iterator j) const { return int(i - j.i); }
- };
- friend class iterator;
-
- class const_iterator {
- public:
- Node *i;
- typedef std::random_access_iterator_tag iterator_category;
- // ### Qt6: use int
- typedef qptrdiff difference_type;
- typedef T value_type;
- typedef const T *pointer;
- typedef const T &reference;
-
- inline const_iterator() noexcept : i(nullptr) {}
- inline const_iterator(Node *n) noexcept : i(n) {}
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
- // can't remove it in Qt 5, since doing so would make the type trivial,
- // which changes the way it's passed to functions by value.
- inline const_iterator(const const_iterator &o) noexcept : i(o.i) {}
- inline const_iterator &operator=(const const_iterator &o) noexcept
- { i = o.i; return *this; }
-#endif
-#ifdef QT_STRICT_ITERATORS
- inline explicit const_iterator(const iterator &o) noexcept : i(o.i) {}
-#else
- inline const_iterator(const iterator &o) noexcept : i(o.i) {}
-#endif
- inline const T &operator*() const { return i->t(); }
- inline const T *operator->() const { return &i->t(); }
- inline const T &operator[](difference_type j) const { return i[j].t(); }
- inline bool operator==(const const_iterator &o) const noexcept { return i == o.i; }
- inline bool operator!=(const const_iterator &o) const noexcept { return i != o.i; }
- inline bool operator<(const const_iterator& other) const noexcept { return i < other.i; }
- inline bool operator<=(const const_iterator& other) const noexcept { return i <= other.i; }
- inline bool operator>(const const_iterator& other) const noexcept { return i > other.i; }
- inline bool operator>=(const const_iterator& other) const noexcept { return i >= other.i; }
- inline const_iterator &operator++() { ++i; return *this; }
- inline const_iterator operator++(int) { Node *n = i; ++i; return n; }
- inline const_iterator &operator--() { i--; return *this; }
- inline const_iterator operator--(int) { Node *n = i; i--; return n; }
- inline const_iterator &operator+=(difference_type j) { i+=j; return *this; }
- inline const_iterator &operator-=(difference_type j) { i-=j; return *this; }
- inline const_iterator operator+(difference_type j) const { return const_iterator(i+j); }
- inline const_iterator operator-(difference_type j) const { return const_iterator(i-j); }
- friend inline const_iterator operator+(difference_type j, const_iterator k) { return k + j; }
- inline int operator-(const_iterator j) const { return int(i - j.i); }
- };
- friend class const_iterator;
-
- // stl style
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- inline iterator begin() { detach(); return reinterpret_cast<Node *>(p.begin()); }
- inline const_iterator begin() const noexcept { return reinterpret_cast<Node *>(p.begin()); }
- inline const_iterator cbegin() const noexcept { return reinterpret_cast<Node *>(p.begin()); }
- inline const_iterator constBegin() const noexcept { return reinterpret_cast<Node *>(p.begin()); }
- inline iterator end() { detach(); return reinterpret_cast<Node *>(p.end()); }
- inline const_iterator end() const noexcept { return reinterpret_cast<Node *>(p.end()); }
- inline const_iterator cend() const noexcept { return reinterpret_cast<Node *>(p.end()); }
- inline const_iterator constEnd() const noexcept { return reinterpret_cast<Node *>(p.end()); }
- reverse_iterator rbegin() { return reverse_iterator(end()); }
- reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
- const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
- iterator insert(iterator before, const T &t);
- iterator erase(iterator pos);
- iterator erase(iterator first, iterator last);
-
- // more Qt
- typedef iterator Iterator;
- typedef const_iterator ConstIterator;
- inline int count() const { return p.size(); }
- inline int length() const { return p.size(); } // Same as count()
- inline T& first() { Q_ASSERT(!isEmpty()); return *begin(); }
- inline const T& constFirst() const { return first(); }
- inline const T& first() const { Q_ASSERT(!isEmpty()); return at(0); }
- T& last() { Q_ASSERT(!isEmpty()); return *(--end()); }
- const T& last() const { Q_ASSERT(!isEmpty()); return at(count() - 1); }
- inline const T& constLast() const { return last(); }
- inline void removeFirst() { Q_ASSERT(!isEmpty()); erase(begin()); }
- inline void removeLast() { Q_ASSERT(!isEmpty()); erase(--end()); }
- inline bool startsWith(const T &t) const { return !isEmpty() && first() == t; }
- inline bool endsWith(const T &t) const { return !isEmpty() && last() == t; }
- QList<T> mid(int pos, int length = -1) const;
-
- T value(int i) const;
- T value(int i, const T &defaultValue) const;
-
- // stl compatibility
- inline void push_back(const T &t) { append(t); }
- inline void push_front(const T &t) { prepend(t); }
- inline T& front() { return first(); }
- inline const T& front() const { return first(); }
- inline T& back() { return last(); }
- inline const T& back() const { return last(); }
- inline void pop_front() { removeFirst(); }
- inline void pop_back() { removeLast(); }
- inline bool empty() const { return isEmpty(); }
- typedef int size_type;
- typedef T value_type;
- typedef value_type *pointer;
- typedef const value_type *const_pointer;
- typedef value_type &reference;
- typedef const value_type &const_reference;
- // ### Qt6: use int
- typedef qptrdiff difference_type;
-
- // comfort
- QList<T> &operator+=(const QList<T> &l);
- inline QList<T> operator+(const QList<T> &l) const
- { QList n = *this; n += l; return n; }
- inline QList<T> &operator+=(const T &t)
- { append(t); return *this; }
- inline QList<T> &operator<< (const T &t)
- { append(t); return *this; }
- inline QList<T> &operator<<(const QList<T> &l)
- { *this += l; return *this; }
-
- static QList<T> fromVector(const QVector<T> &vector);
- QVector<T> toVector() const;
-
-#if QT_DEPRECATED_SINCE(5, 14) && QT_VERSION < QT_VERSION_CHECK(6,0,0)
- QT_DEPRECATED_X("Use QList<T>(set.begin(), set.end()) instead.")
- static QList<T> fromSet(const QSet<T> &set);
- QT_DEPRECATED_X("Use QSet<T>(list.begin(), list.end()) instead.")
- QSet<T> toSet() const;
-
- QT_DEPRECATED_X("Use QList<T>(list.begin(), list.end()) instead.")
- static inline QList<T> fromStdList(const std::list<T> &list)
- { return QList<T>(list.begin(), list.end()); }
- QT_DEPRECATED_X("Use std::list<T>(list.begin(), list.end()) instead.")
- inline std::list<T> toStdList() const
- { return std::list<T>(begin(), end()); }
-#endif
-
-private:
- Node *detach_helper_grow(int i, int n);
- void detach_helper(int alloc);
- void detach_helper();
- void dealloc(QListData::Data *d);
-
- void node_construct(Node *n, const T &t);
- void node_destruct(Node *n);
- void node_copy(Node *from, Node *to, Node *src);
- void node_destruct(Node *from, Node *to);
-
- bool isValidIterator(const iterator &i) const noexcept
- {
- const std::less<const Node *> less = {};
- return !less(i.i, cbegin().i) && !less(cend().i, i.i);
- }
-
-private:
- inline bool op_eq_impl(const QList &other, QListData::NotArrayCompatibleLayout) const;
- inline bool op_eq_impl(const QList &other, QListData::ArrayCompatibleLayout) const;
- inline bool contains_impl(const T &, QListData::NotArrayCompatibleLayout) const;
- inline bool contains_impl(const T &, QListData::ArrayCompatibleLayout) const;
- inline int count_impl(const T &, QListData::NotArrayCompatibleLayout) const;
- inline int count_impl(const T &, QListData::ArrayCompatibleLayout) const;
-};
-
-#if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606
-template <typename InputIterator,
- typename ValueType = typename std::iterator_traits<InputIterator>::value_type,
- QtPrivate::IfIsInputIterator<InputIterator> = true>
-QList(InputIterator, InputIterator) -> QList<ValueType>;
-#endif
-
-#if defined(Q_CC_BOR)
-template <typename T>
-Q_INLINE_TEMPLATE T &QList<T>::Node::t()
-{ return QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic ? *(T*)v:*(T*)this; }
-#endif
-
-template <typename T>
-Q_INLINE_TEMPLATE void QList<T>::node_construct(Node *n, const T &t)
-{
- if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) n->v = new T(t);
- else if (QTypeInfo<T>::isComplex) new (n) T(t);
-#if (defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__IBMCPP__)) && !defined(__OPTIMIZE__)
- // This violates pointer aliasing rules, but it is known to be safe (and silent)
- // in unoptimized GCC builds (-fno-strict-aliasing). The other compilers which
- // set the same define are assumed to be safe.
- else *reinterpret_cast<T*>(n) = t;
-#else
- // This is always safe, but penaltizes unoptimized builds a lot.
- else ::memcpy(n, static_cast<const void *>(&t), sizeof(T));
-#endif
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE void QList<T>::node_destruct(Node *n)
-{
- if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) delete reinterpret_cast<T*>(n->v);
- else if (QTypeInfo<T>::isComplex) reinterpret_cast<T*>(n)->~T();
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE void QList<T>::node_copy(Node *from, Node *to, Node *src)
-{
- Node *current = from;
- if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) {
- QT_TRY {
- while(current != to) {
- current->v = new T(*reinterpret_cast<T*>(src->v));
- ++current;
- ++src;
- }
- } QT_CATCH(...) {
- while (current-- != from)
- delete reinterpret_cast<T*>(current->v);
- QT_RETHROW;
- }
-
- } else if (QTypeInfo<T>::isComplex) {
- QT_TRY {
- while(current != to) {
- new (current) T(*reinterpret_cast<T*>(src));
- ++current;
- ++src;
- }
- } QT_CATCH(...) {
- while (current-- != from)
- (reinterpret_cast<T*>(current))->~T();
- QT_RETHROW;
- }
- } else {
- if (src != from && to - from > 0)
- memcpy(from, src, (to - from) * sizeof(Node));
- }
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE void QList<T>::node_destruct(Node *from, Node *to)
-{
- if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic)
- while(from != to) --to, delete reinterpret_cast<T*>(to->v);
- else if (QTypeInfo<T>::isComplex)
- while (from != to) --to, reinterpret_cast<T*>(to)->~T();
-}
-
-template <typename T>
-Q_INLINE_TEMPLATE QList<T> &QList<T>::operator=(const QList<T> &l)
-{
- if (d != l.d) {
- QList<T> tmp(l);
- tmp.swap(*this);
- }
- return *this;
-}
-template <typename T>
-inline typename QList<T>::iterator QList<T>::insert(iterator before, const T &t)
-{
- Q_ASSERT_X(isValidIterator(before), "QList::insert", "The specified iterator argument 'before' is invalid");
-
- int iBefore = int(before.i - reinterpret_cast<Node *>(p.begin()));
- Node *n = nullptr;
- if (d->ref.isShared())
- n = detach_helper_grow(iBefore, 1);
- else
- n = reinterpret_cast<Node *>(p.insert(iBefore));
- QT_TRY {
- node_construct(n, t);
- } QT_CATCH(...) {
- p.remove(iBefore);
- QT_RETHROW;
- }
- return n;
-}
-template <typename T>
-inline typename QList<T>::iterator QList<T>::erase(iterator it)
-{
- Q_ASSERT_X(isValidIterator(it), "QList::erase", "The specified iterator argument 'it' is invalid");
- if (d->ref.isShared()) {
- int offset = int(it.i - reinterpret_cast<Node *>(p.begin()));
- it = begin(); // implies detach()
- it += offset;
- }
- node_destruct(it.i);
- return reinterpret_cast<Node *>(p.erase(reinterpret_cast<void**>(it.i)));
-}
-template <typename T>
-inline const T &QList<T>::at(int i) const
-{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::at", "index out of range");
- return reinterpret_cast<Node *>(p.at(i))->t(); }
-template <typename T>
-inline const T &QList<T>::operator[](int i) const
-{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::operator[]", "index out of range");
- return reinterpret_cast<Node *>(p.at(i))->t(); }
-template <typename T>
-inline T &QList<T>::operator[](int i)
-{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::operator[]", "index out of range");
- detach(); return reinterpret_cast<Node *>(p.at(i))->t(); }
-template <typename T>
-inline void QList<T>::removeAt(int i)
-{
-#if !QT_DEPRECATED_SINCE(5, 15)
- Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::removeAt", "index out of range");
-#endif
- if (i < 0 || i >= p.size()) {
-#if !defined(QT_NO_DEBUG)
- qWarning("QList::removeAt(): Index out of range.");
-#endif
- return;
- }
- detach();
- node_destruct(reinterpret_cast<Node *>(p.at(i))); p.remove(i);
-}
-template <typename T>
-inline T QList<T>::takeAt(int i)
-{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::take", "index out of range");
- detach(); Node *n = reinterpret_cast<Node *>(p.at(i)); T t = std::move(n->t()); node_destruct(n);
- p.remove(i); return t; }
-template <typename T>
-inline T QList<T>::takeFirst()
-{ T t = std::move(first()); removeFirst(); return t; }
-template <typename T>
-inline T QList<T>::takeLast()
-{ T t = std::move(last()); removeLast(); return t; }
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE void QList<T>::reserve(int alloc)
-{
- if (d->alloc < alloc) {
- if (d->ref.isShared())
- detach_helper(alloc);
- else
- p.realloc(alloc);
- }
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE void QList<T>::append(const T &t)
-{
- if (d->ref.isShared()) {
- Node *n = detach_helper_grow(INT_MAX, 1);
- QT_TRY {
- node_construct(n, t);
- } QT_CATCH(...) {
- --d->end;
- QT_RETHROW;
- }
- } else {
- if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) {
- Node *n = reinterpret_cast<Node *>(p.append());
- QT_TRY {
- node_construct(n, t);
- } QT_CATCH(...) {
- --d->end;
- QT_RETHROW;
- }
- } else {
- Node *n, copy;
- node_construct(&copy, t); // t might be a reference to an object in the array
- QT_TRY {
- n = reinterpret_cast<Node *>(p.append());;
- } QT_CATCH(...) {
- node_destruct(&copy);
- QT_RETHROW;
- }
- *n = copy;
- }
- }
-}
-
-template <typename T>
-inline void QList<T>::prepend(const T &t)
-{
- if (d->ref.isShared()) {
- Node *n = detach_helper_grow(0, 1);
- QT_TRY {
- node_construct(n, t);
- } QT_CATCH(...) {
- ++d->begin;
- QT_RETHROW;
- }
- } else {
- if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) {
- Node *n = reinterpret_cast<Node *>(p.prepend());
- QT_TRY {
- node_construct(n, t);
- } QT_CATCH(...) {
- ++d->begin;
- QT_RETHROW;
- }
- } else {
- Node *n, copy;
- node_construct(&copy, t); // t might be a reference to an object in the array
- QT_TRY {
- n = reinterpret_cast<Node *>(p.prepend());;
- } QT_CATCH(...) {
- node_destruct(&copy);
- QT_RETHROW;
- }
- *n = copy;
- }
- }
-}
-
-template <typename T>
-inline void QList<T>::insert(int i, const T &t)
-{
-#if !QT_DEPRECATED_SINCE(5, 15)
- Q_ASSERT_X(i >= 0 && i <= p.size(), "QList<T>::insert", "index out of range");
-#elif !defined(QT_NO_DEBUG)
- if (i < 0 || i > p.size())
- qWarning("QList::insert(): Index out of range.");
-#endif
- if (d->ref.isShared()) {
- Node *n = detach_helper_grow(i, 1);
- QT_TRY {
- node_construct(n, t);
- } QT_CATCH(...) {
- p.remove(i);
- QT_RETHROW;
- }
- } else {
- if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) {
- Node *n = reinterpret_cast<Node *>(p.insert(i));
- QT_TRY {
- node_construct(n, t);
- } QT_CATCH(...) {
- p.remove(i);
- QT_RETHROW;
- }
- } else {
- Node *n, copy;
- node_construct(&copy, t); // t might be a reference to an object in the array
- QT_TRY {
- n = reinterpret_cast<Node *>(p.insert(i));;
- } QT_CATCH(...) {
- node_destruct(&copy);
- QT_RETHROW;
- }
- *n = copy;
- }
- }
-}
-
-template <typename T>
-inline void QList<T>::replace(int i, const T &t)
-{
- Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::replace", "index out of range");
- detach();
- reinterpret_cast<Node *>(p.at(i))->t() = t;
-}
-
-template <typename T>
-inline void QList<T>::swapItemsAt(int i, int j)
-{
- Q_ASSERT_X(i >= 0 && i < p.size() && j >= 0 && j < p.size(),
- "QList<T>::swap", "index out of range");
- detach();
- qSwap(d->array[d->begin + i], d->array[d->begin + j]);
-}
-
-template <typename T>
-inline void QList<T>::move(int from, int to)
-{
- Q_ASSERT_X(from >= 0 && from < p.size() && to >= 0 && to < p.size(),
- "QList<T>::move", "index out of range");
- detach();
- p.move(from, to);
-}
-
template<typename T>
-Q_OUTOFLINE_TEMPLATE QList<T> QList<T>::mid(int pos, int alength) const
-{
- using namespace QtPrivate;
- switch (QContainerImplHelper::mid(size(), &pos, &alength)) {
- case QContainerImplHelper::Null:
- case QContainerImplHelper::Empty:
- return QList<T>();
- case QContainerImplHelper::Full:
- return *this;
- case QContainerImplHelper::Subset:
- break;
- }
-
- QList<T> cpy;
- if (alength <= 0)
- return cpy;
- cpy.reserve(alength);
- cpy.d->end = alength;
- QT_TRY {
- cpy.node_copy(reinterpret_cast<Node *>(cpy.p.begin()),
- reinterpret_cast<Node *>(cpy.p.end()),
- reinterpret_cast<Node *>(p.begin() + pos));
- } QT_CATCH(...) {
- // restore the old end
- cpy.d->end = 0;
- QT_RETHROW;
- }
- return cpy;
-}
-
-template<typename T>
-Q_OUTOFLINE_TEMPLATE T QList<T>::value(int i) const
-{
- if (i < 0 || i >= p.size()) {
- return T();
- }
- return reinterpret_cast<Node *>(p.at(i))->t();
-}
-
+using QMutableListIterator = QMutableVectorIterator<T>;
template<typename T>
-Q_OUTOFLINE_TEMPLATE T QList<T>::value(int i, const T& defaultValue) const
-{
- return ((i < 0 || i >= p.size()) ? defaultValue : reinterpret_cast<Node *>(p.at(i))->t());
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE typename QList<T>::Node *QList<T>::detach_helper_grow(int i, int c)
-{
- Node *n = reinterpret_cast<Node *>(p.begin());
- QListData::Data *x = p.detach_grow(&i, c);
- QT_TRY {
- node_copy(reinterpret_cast<Node *>(p.begin()),
- reinterpret_cast<Node *>(p.begin() + i), n);
- } QT_CATCH(...) {
- p.dispose();
- d = x;
- QT_RETHROW;
- }
- QT_TRY {
- node_copy(reinterpret_cast<Node *>(p.begin() + i + c),
- reinterpret_cast<Node *>(p.end()), n + i);
- } QT_CATCH(...) {
- node_destruct(reinterpret_cast<Node *>(p.begin()),
- reinterpret_cast<Node *>(p.begin() + i));
- p.dispose();
- d = x;
- QT_RETHROW;
- }
-
- if (!x->ref.deref())
- dealloc(x);
-
- return reinterpret_cast<Node *>(p.begin() + i);
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE void QList<T>::detach_helper(int alloc)
-{
- Node *n = reinterpret_cast<Node *>(p.begin());
- QListData::Data *x = p.detach(alloc);
- QT_TRY {
- node_copy(reinterpret_cast<Node *>(p.begin()), reinterpret_cast<Node *>(p.end()), n);
- } QT_CATCH(...) {
- p.dispose();
- d = x;
- QT_RETHROW;
- }
-
- if (!x->ref.deref())
- dealloc(x);
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE void QList<T>::detach_helper()
-{
- detach_helper(d->alloc);
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE QList<T>::QList(const QList<T> &l)
- : QListSpecialMethods<T>(l), d(l.d)
-{
- if (!d->ref.ref()) {
- p.detach(d->alloc);
-
- QT_TRY {
- node_copy(reinterpret_cast<Node *>(p.begin()),
- reinterpret_cast<Node *>(p.end()),
- reinterpret_cast<Node *>(l.p.begin()));
- } QT_CATCH(...) {
- QListData::dispose(d);
- QT_RETHROW;
- }
- }
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE QList<T>::~QList()
-{
- if (!d->ref.deref())
- dealloc(d);
-}
-
-template <typename T>
-template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator>>
-QList<T>::QList(InputIterator first, InputIterator last)
- : QList()
-{
- QtPrivate::reserveIfForwardIterator(this, first, last);
- std::copy(first, last, std::back_inserter(*this));
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE bool QList<T>::operator==(const QList<T> &l) const
-{
- if (d == l.d)
- return true;
- if (p.size() != l.p.size())
- return false;
- return this->op_eq_impl(l, MemoryLayout());
-}
-
-template <typename T>
-inline bool QList<T>::op_eq_impl(const QList &l, QListData::NotArrayCompatibleLayout) const
-{
- Node *i = reinterpret_cast<Node *>(p.begin());
- Node *e = reinterpret_cast<Node *>(p.end());
- Node *li = reinterpret_cast<Node *>(l.p.begin());
- for (; i != e; ++i, ++li) {
- if (!(i->t() == li->t()))
- return false;
- }
- return true;
-}
-
-template <typename T>
-inline bool QList<T>::op_eq_impl(const QList &l, QListData::ArrayCompatibleLayout) const
-{
- const T *lb = reinterpret_cast<const T*>(l.p.begin());
- const T *b = reinterpret_cast<const T*>(p.begin());
- const T *e = reinterpret_cast<const T*>(p.end());
- return std::equal(b, e, QT_MAKE_CHECKED_ARRAY_ITERATOR(lb, l.p.size()));
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE void QList<T>::dealloc(QListData::Data *data)
-{
- node_destruct(reinterpret_cast<Node *>(data->array + data->begin),
- reinterpret_cast<Node *>(data->array + data->end));
- QListData::dispose(data);
-}
-
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE void QList<T>::clear()
-{
- *this = QList<T>();
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE int QList<T>::removeAll(const T &_t)
-{
- int index = indexOf(_t);
- if (index == -1)
- return 0;
-
- const T t = _t;
- detach();
-
- Node *i = reinterpret_cast<Node *>(p.at(index));
- Node *e = reinterpret_cast<Node *>(p.end());
- Node *n = i;
- node_destruct(i);
- while (++i != e) {
- if (i->t() == t)
- node_destruct(i);
- else
- *n++ = *i;
- }
-
- int removedCount = int(e - n);
- d->end -= removedCount;
- return removedCount;
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE bool QList<T>::removeOne(const T &_t)
-{
- int index = indexOf(_t);
- if (index != -1) {
- removeAt(index);
- return true;
- }
- return false;
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE typename QList<T>::iterator QList<T>::erase(typename QList<T>::iterator afirst,
- typename QList<T>::iterator alast)
-{
- Q_ASSERT_X(isValidIterator(afirst), "QList::erase", "The specified iterator argument 'afirst' is invalid");
- Q_ASSERT_X(isValidIterator(alast), "QList::erase", "The specified iterator argument 'alast' is invalid");
-
- if (d->ref.isShared()) {
- // ### A block is erased and a detach is needed. We should shrink and only copy relevant items.
- int offsetfirst = int(afirst.i - reinterpret_cast<Node *>(p.begin()));
- int offsetlast = int(alast.i - reinterpret_cast<Node *>(p.begin()));
- afirst = begin(); // implies detach()
- alast = afirst;
- afirst += offsetfirst;
- alast += offsetlast;
- }
-
- for (Node *n = afirst.i; n < alast.i; ++n)
- node_destruct(n);
- int idx = afirst - begin();
- p.remove(idx, alast - afirst);
- return begin() + idx;
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE QList<T> &QList<T>::operator+=(const QList<T> &l)
-{
- if (!l.isEmpty()) {
- if (d == &QListData::shared_null) {
- *this = l;
- } else {
- Node *n = (d->ref.isShared())
- ? detach_helper_grow(INT_MAX, l.size())
- : reinterpret_cast<Node *>(p.append(l.p));
- QT_TRY {
- node_copy(n, reinterpret_cast<Node *>(p.end()),
- reinterpret_cast<Node *>(l.p.begin()));
- } QT_CATCH(...) {
- // restore the old end
- d->end -= int(reinterpret_cast<Node *>(p.end()) - n);
- QT_RETHROW;
- }
- }
- }
- return *this;
-}
-
-template <typename T>
-inline void QList<T>::append(const QList<T> &t)
-{
- *this += t;
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE int QList<T>::indexOf(const T &t, int from) const
-{
- return QtPrivate::indexOf<T, T>(*this, t, from);
-}
-
-namespace QtPrivate
-{
-template <typename T, typename U>
-int indexOf(const QList<T> &list, const U &u, int from)
-{
- typedef typename QList<T>::Node Node;
-
- if (from < 0)
- from = qMax(from + list.p.size(), 0);
- if (from < list.p.size()) {
- Node *n = reinterpret_cast<Node *>(list.p.at(from -1));
- Node *e = reinterpret_cast<Node *>(list.p.end());
- while (++n != e)
- if (n->t() == u)
- return int(n - reinterpret_cast<Node *>(list.p.begin()));
- }
- return -1;
-}
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE int QList<T>::lastIndexOf(const T &t, int from) const
-{
- return QtPrivate::lastIndexOf<T, T>(*this, t, from);
-}
-
-namespace QtPrivate
-{
-template <typename T, typename U>
-int lastIndexOf(const QList<T> &list, const U &u, int from)
-{
- typedef typename QList<T>::Node Node;
-
- if (from < 0)
- from += list.p.size();
- else if (from >= list.p.size())
- from = list.p.size()-1;
- if (from >= 0) {
- Node *b = reinterpret_cast<Node *>(list.p.begin());
- Node *n = reinterpret_cast<Node *>(list.p.at(from + 1));
- while (n-- != b) {
- if (n->t() == u)
- return int(n - b);
- }
- }
- return -1;
-}
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE bool QList<T>::contains(const T &t) const
-{
- return contains_impl(t, MemoryLayout());
-}
-
-template <typename T>
-inline bool QList<T>::contains_impl(const T &t, QListData::NotArrayCompatibleLayout) const
-{
- Node *e = reinterpret_cast<Node *>(p.end());
- Node *i = reinterpret_cast<Node *>(p.begin());
- for (; i != e; ++i)
- if (i->t() == t)
- return true;
- return false;
-}
-
-template <typename T>
-inline bool QList<T>::contains_impl(const T &t, QListData::ArrayCompatibleLayout) const
-{
- const T *b = reinterpret_cast<const T*>(p.begin());
- const T *e = reinterpret_cast<const T*>(p.end());
- return std::find(b, e, t) != e;
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE int QList<T>::count(const T &t) const
-{
- return this->count_impl(t, MemoryLayout());
-}
-
-template <typename T>
-inline int QList<T>::count_impl(const T &t, QListData::NotArrayCompatibleLayout) const
-{
- int c = 0;
- Node *e = reinterpret_cast<Node *>(p.end());
- Node *i = reinterpret_cast<Node *>(p.begin());
- for (; i != e; ++i)
- if (i->t() == t)
- ++c;
- return c;
-}
-
-template <typename T>
-inline int QList<T>::count_impl(const T &t, QListData::ArrayCompatibleLayout) const
-{
- return int(std::count(reinterpret_cast<const T*>(p.begin()),
- reinterpret_cast<const T*>(p.end()),
- t));
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE QVector<T> QList<T>::toVector() const
-{
- return QVector<T>(begin(), end());
-}
-
-template <typename T>
-QList<T> QList<T>::fromVector(const QVector<T> &vector)
-{
- return vector.toList();
-}
-
-template <typename T>
-Q_OUTOFLINE_TEMPLATE QList<T> QVector<T>::toList() const
-{
- return QList<T>(begin(), end());
-}
-
-template <typename T>
-QVector<T> QVector<T>::fromList(const QList<T> &list)
-{
- return list.toVector();
-}
-
-Q_DECLARE_SEQUENTIAL_ITERATOR(List)
-Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(List)
-
-template <typename T>
-uint qHash(const QList<T> &key, uint seed = 0)
- noexcept(noexcept(qHashRange(key.cbegin(), key.cend(), seed)))
-{
- return qHashRange(key.cbegin(), key.cend(), seed);
-}
-
-template <typename T>
-bool operator<(const QList<T> &lhs, const QList<T> &rhs)
- noexcept(noexcept(std::lexicographical_compare(lhs.begin(), lhs.end(),
- rhs.begin(), rhs.end())))
-{
- return std::lexicographical_compare(lhs.begin(), lhs.end(),
- rhs.begin(), rhs.end());
-}
-
-template <typename T>
-inline bool operator>(const QList<T> &lhs, const QList<T> &rhs)
- noexcept(noexcept(lhs < rhs))
-{
- return rhs < lhs;
-}
-
-template <typename T>
-inline bool operator<=(const QList<T> &lhs, const QList<T> &rhs)
- noexcept(noexcept(lhs < rhs))
-{
- return !(lhs > rhs);
-}
-
-template <typename T>
-inline bool operator>=(const QList<T> &lhs, const QList<T> &rhs)
- noexcept(noexcept(lhs < rhs))
-{
- return !(lhs < rhs);
-}
-
+using QListIterator = QVectorIterator<T>;
QT_END_NAMESPACE
+#endif
#include <QtCore/qbytearraylist.h>
#include <QtCore/qstringlist.h>
-#ifdef Q_CC_MSVC
-#pragma warning( pop )
-#endif
-
#endif // QLIST_H
diff --git a/src/corelib/tools/qmap.cpp b/src/corelib/tools/qmap.cpp
index cd139f01d4..6c9eba0c66 100644
--- a/src/corelib/tools/qmap.cpp
+++ b/src/corelib/tools/qmap.cpp
@@ -301,7 +301,7 @@ void QMapDataBase::recalcMostLeftNode()
mostLeftNode = mostLeftNode->left;
}
-static inline int qMapAlignmentThreshold()
+static inline size_t qMapAlignmentThreshold()
{
// malloc on 32-bit platforms should return pointers that are 8-byte
// aligned or more while on 64-bit platforms they should be 16-byte aligned
@@ -309,14 +309,14 @@ static inline int qMapAlignmentThreshold()
return 2 * sizeof(void*);
}
-static inline void *qMapAllocate(int alloc, int alignment)
+static inline void *qMapAllocate(size_t alloc, size_t alignment)
{
return alignment > qMapAlignmentThreshold()
? qMallocAligned(alloc, alignment)
: ::malloc(alloc);
}
-static inline void qMapDeallocate(QMapNodeBase *node, int alignment)
+static inline void qMapDeallocate(QMapNodeBase *node, size_t alignment)
{
if (alignment > qMapAlignmentThreshold())
qFreeAligned(node);
@@ -324,7 +324,7 @@ static inline void qMapDeallocate(QMapNodeBase *node, int alignment)
::free(node);
}
-QMapNodeBase *QMapDataBase::createNode(int alloc, int alignment, QMapNodeBase *parent, bool left)
+QMapNodeBase *QMapDataBase::createNode(size_t alloc, size_t alignment, QMapNodeBase *parent, bool left)
{
QMapNodeBase *node = static_cast<QMapNodeBase *>(qMapAllocate(alloc, alignment));
Q_CHECK_PTR(node);
@@ -346,7 +346,7 @@ QMapNodeBase *QMapDataBase::createNode(int alloc, int alignment, QMapNodeBase *p
return node;
}
-void QMapDataBase::freeTree(QMapNodeBase *root, int alignment)
+void QMapDataBase::freeTree(QMapNodeBase *root, size_t alignment)
{
if (root->left)
freeTree(root->left, alignment);
@@ -619,7 +619,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa operator==()
*/
-/*! \fn template <class Key, class T> int QMap<Key, T>::size() const
+/*! \fn template <class Key, class T> qsizetype QMap<Key, T>::size() const
Returns the number of (key, value) pairs in the map.
@@ -672,7 +672,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa remove()
*/
-/*! \fn template <class Key, class T> int QMap<Key, T>::remove(const Key &key)
+/*! \fn template <class Key, class T> qsizetype QMap<Key, T>::remove(const Key &key)
Removes all the items that have the key \a key from the map.
Returns the number of items removed which will be 1 if the key
@@ -704,7 +704,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa count(), QMultiMap::contains()
*/
-/*! \fn template <class Key, class T> const T QMap<Key, T>::value(const Key &key, const T &defaultValue) const
+/*! \fn template <class Key, class T> T QMap<Key, T>::value(const Key &key, const T &defaultValue) const
Returns the value associated with the key \a key.
@@ -812,14 +812,14 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa QMultiMap::values()
*/
-/*! \fn template <class Key, class T> int QMap<Key, T>::count(const Key &key) const
+/*! \fn template <class Key, class T> qsizetype QMap<Key, T>::count(const Key &key) const
Returns the number of items associated with key \a key.
\sa contains(), QMultiMap::count()
*/
-/*! \fn template <class Key, class T> int QMap<Key, T>::count() const
+/*! \fn template <class Key, class T> qsizetype QMap<Key, T>::count() const
\overload
@@ -1466,7 +1466,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
current item.
*/
-/*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::iterator::operator+(int j) const
+/*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::iterator::operator+(qsizetype j) const
Returns an iterator to the item at \a j positions forward from
this iterator. (If \a j is negative, the iterator goes backward.)
@@ -1477,7 +1477,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
*/
-/*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::iterator::operator-(int j) const
+/*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::iterator::operator-(qsizetype j) const
Returns an iterator to the item at \a j positions backward from
this iterator. (If \a j is negative, the iterator goes forward.)
@@ -1487,7 +1487,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa operator+()
*/
-/*! \fn template <class Key, class T> QMap<Key, T>::iterator &QMap<Key, T>::iterator::operator+=(int j)
+/*! \fn template <class Key, class T> QMap<Key, T>::iterator &QMap<Key, T>::iterator::operator+=(qsizetype j)
Advances the iterator by \a j items. (If \a j is negative, the
iterator goes backward.)
@@ -1495,7 +1495,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa operator-=(), operator+()
*/
-/*! \fn template <class Key, class T> QMap<Key, T>::iterator &QMap<Key, T>::iterator::operator-=(int j)
+/*! \fn template <class Key, class T> QMap<Key, T>::iterator &QMap<Key, T>::iterator::operator-=(qsizetype j)
Makes the iterator go back by \a j items. (If \a j is negative,
the iterator goes forward.)
@@ -1680,7 +1680,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
current item.
*/
-/*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::const_iterator::operator+(int j) const
+/*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::const_iterator::operator+(qsizetype j) const
Returns an iterator to the item at \a j positions forward from
this iterator. (If \a j is negative, the iterator goes backward.)
@@ -1690,7 +1690,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa operator-()
*/
-/*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::const_iterator::operator-(int j) const
+/*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::const_iterator::operator-(qsizetype j) const
Returns an iterator to the item at \a j positions backward from
this iterator. (If \a j is negative, the iterator goes forward.)
@@ -1700,7 +1700,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa operator+()
*/
-/*! \fn template <class Key, class T> QMap<Key, T>::const_iterator &QMap<Key, T>::const_iterator::operator+=(int j)
+/*! \fn template <class Key, class T> QMap<Key, T>::const_iterator &QMap<Key, T>::const_iterator::operator+=(qsizetype j)
Advances the iterator by \a j items. (If \a j is negative, the
iterator goes backward.)
@@ -1710,7 +1710,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa operator-=(), operator+()
*/
-/*! \fn template <class Key, class T> QMap<Key, T>::const_iterator &QMap<Key, T>::const_iterator::operator-=(int j)
+/*! \fn template <class Key, class T> QMap<Key, T>::const_iterator &QMap<Key, T>::const_iterator::operator-=(qsizetype j)
Makes the iterator go back by \a j items. (If \a j is negative,
the iterator goes forward.)
@@ -2042,7 +2042,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
*/
/*!
- \fn template <class Key, class T> int QMultiMap<Key, T>::remove(const Key &key, const T &value)
+ \fn template <class Key, class T> qsizetype QMultiMap<Key, T>::remove(const Key &key, const T &value)
\since 4.3
Removes all the items that have the key \a key and the value \a
@@ -2052,7 +2052,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
*/
/*!
- \fn template <class Key, class T> int QMultiMap<Key, T>::count(const Key &key, const T &value) const
+ \fn template <class Key, class T> qsizetype QMultiMap<Key, T>::count(const Key &key, const T &value) const
\since 4.3
Returns the number of items with key \a key and value \a value.
diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h
index 0c69d13295..848ba5c4d4 100644
--- a/src/corelib/tools/qmap.h
+++ b/src/corelib/tools/qmap.h
@@ -180,7 +180,7 @@ inline QMapNode<Key, T> *QMapNode<Key, T>::upperBound(const Key &akey)
struct Q_CORE_EXPORT QMapDataBase
{
QtPrivate::RefCount ref;
- int size;
+ qsizetype size;
QMapNodeBase header;
QMapNodeBase *mostLeftNode;
@@ -190,8 +190,8 @@ struct Q_CORE_EXPORT QMapDataBase
void freeNodeAndRebalance(QMapNodeBase *z);
void recalcMostLeftNode();
- QMapNodeBase *createNode(int size, int alignment, QMapNodeBase *parent, bool left);
- void freeTree(QMapNodeBase *root, int alignment);
+ QMapNodeBase *createNode(size_t size, size_t alignment, QMapNodeBase *parent, bool left);
+ void freeTree(QMapNodeBase *root, size_t alignment);
static const QMapDataBase shared_null;
@@ -219,7 +219,7 @@ struct QMapData : public QMapDataBase
Node *createNode(const Key &k, const T &v, Node *parent = nullptr, bool left = false)
{
- Node *n = static_cast<Node *>(QMapDataBase::createNode(sizeof(Node), Q_ALIGNOF(Node),
+ Node *n = static_cast<Node *>(QMapDataBase::createNode(sizeof(Node), alignof(Node),
parent, left));
QT_TRY {
new (&n->key) Key(k);
@@ -243,7 +243,7 @@ struct QMapData : public QMapDataBase
void destroy() {
if (root()) {
root()->destroySubTree();
- freeTree(header.left, Q_ALIGNOF(Node));
+ freeTree(header.left, alignof(Node));
}
freeData(this);
}
@@ -350,33 +350,22 @@ public:
bool operator==(const QMap<Key, T> &other) const;
inline bool operator!=(const QMap<Key, T> &other) const { return !(*this == other); }
- inline int size() const { return d->size; }
+ inline qsizetype size() const { return d->size; }
inline bool isEmpty() const { return d->size == 0; }
inline void detach() { if (d->ref.isShared()) detach_helper(); }
inline bool isDetached() const { return !d->ref.isShared(); }
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- inline void setSharable(bool sharable)
- {
- if (sharable == d->ref.isSharable())
- return;
- if (!sharable)
- detach();
- // Don't call on shared_null
- d->ref.setSharable(sharable);
- }
-#endif
inline bool isSharedWith(const QMap<Key, T> &other) const { return d == other.d; }
void clear();
- int remove(const Key &key);
+ qsizetype remove(const Key &key);
T take(const Key &key);
bool contains(const Key &key) const;
- const Key key(const T &value, const Key &defaultKey = Key()) const;
- const T value(const Key &key, const T &defaultValue = T()) const;
+ Key key(const T &value, const Key &defaultKey = Key()) const;
+ T value(const Key &key, const T &defaultValue = T()) const;
T &operator[](const Key &key);
const T operator[](const Key &key) const;
@@ -387,7 +376,7 @@ public:
QT_DEPRECATED_VERSION_X_5_15("Use QMultiMap for maps storing multiple values with the same key.") QList<Key> uniqueKeys() const;
QT_DEPRECATED_VERSION_X_5_15("Use QMultiMap for maps storing multiple values with the same key.") QList<T> values(const Key &key) const;
#endif
- int count(const Key &key) const;
+ qsizetype count(const Key &key) const;
inline const Key &firstKey() const { Q_ASSERT(!isEmpty()); return constBegin().key(); }
@@ -440,20 +429,15 @@ public:
i = i->previousNode();
return r;
}
- inline iterator operator+(int j) const
+ inline iterator operator+(qsizetype j) const
{ iterator r = *this; if (j > 0) while (j--) ++r; else while (j++) --r; return r; }
- inline iterator operator-(int j) const { return operator+(-j); }
- inline iterator &operator+=(int j) { return *this = *this + j; }
- inline iterator &operator-=(int j) { return *this = *this - j; }
- friend inline iterator operator+(int j, iterator k) { return k + j; }
+ inline iterator operator-(qsizetype j) const { return operator+(-j); }
+ inline iterator &operator+=(qsizetype j) { return *this = *this + j; }
+ inline iterator &operator-=(qsizetype j) { return *this = *this - j; }
+ friend inline iterator operator+(qsizetype j, iterator k) { return k + j; }
-#ifndef QT_STRICT_ITERATORS
- public:
- inline bool operator==(const const_iterator &o) const
- { return i == o.i; }
- inline bool operator!=(const const_iterator &o) const
- { return i != o.i; }
-#endif
+ inline bool operator==(const const_iterator &o) const { return i == o.i; }
+ inline bool operator!=(const const_iterator &o) const { return i != o.i; }
friend class QMap<Key, T>;
friend class QMultiMap<Key, T>;
};
@@ -473,12 +457,7 @@ public:
Q_DECL_CONSTEXPR inline const_iterator() : i(nullptr) { }
inline const_iterator(const Node *node) : i(node) { }
-#ifdef QT_STRICT_ITERATORS
- explicit inline const_iterator(const iterator &o)
-#else
- inline const_iterator(const iterator &o)
-#endif
- { i = o.i; }
+ inline const_iterator(const iterator &o) { i = o.i; }
inline const Key &key() const { return i->key; }
inline const T &value() const { return i->value; }
@@ -505,18 +484,13 @@ public:
i = i->previousNode();
return r;
}
- inline const_iterator operator+(int j) const
+ inline const_iterator operator+(qsizetype j) const
{ const_iterator r = *this; if (j > 0) while (j--) ++r; else while (j++) --r; return r; }
- inline const_iterator operator-(int j) const { return operator+(-j); }
- inline const_iterator &operator+=(int j) { return *this = *this + j; }
- inline const_iterator &operator-=(int j) { return *this = *this - j; }
- friend inline const_iterator operator+(int j, const_iterator k) { return k + j; }
-
-#ifdef QT_STRICT_ITERATORS
- private:
- inline bool operator==(const iterator &o) const { return operator==(const_iterator(o)); }
- inline bool operator!=(const iterator &o) const { return operator!=(const_iterator(o)); }
-#endif
+ inline const_iterator operator-(qsizetype j) const { return operator+(-j); }
+ inline const_iterator &operator+=(qsizetype j) { return *this = *this + j; }
+ inline const_iterator &operator-=(qsizetype j) { return *this = *this - j; }
+ friend inline const_iterator operator+(qsizetype j, const_iterator k) { return k + j; }
+
friend class QMap<Key, T>;
friend class QMultiMap<Key, T>;
};
@@ -573,7 +547,7 @@ public:
// more Qt
typedef iterator Iterator;
typedef const_iterator ConstIterator;
- inline int count() const { return d->size; }
+ inline qsizetype count() const { return d->size; }
iterator find(const Key &key);
const_iterator find(const Key &key) const;
const_iterator constFind(const Key &key) const;
@@ -594,7 +568,7 @@ public:
typedef Key key_type;
typedef T mapped_type;
typedef qptrdiff difference_type;
- typedef int size_type;
+ typedef qsizetype size_type;
inline bool empty() const { return isEmpty(); }
QPair<iterator, iterator> equal_range(const Key &akey);
QPair<const_iterator, const_iterator> equal_range(const Key &akey) const;
@@ -656,7 +630,7 @@ QT_WARNING_PUSH
QT_WARNING_DISABLE_CLANG("-Wreturn-stack-address")
template <class Key, class T>
-Q_INLINE_TEMPLATE const T QMap<Key, T>::value(const Key &akey, const T &adefaultValue) const
+Q_INLINE_TEMPLATE T QMap<Key, T>::value(const Key &akey, const T &adefaultValue) const
{
Node *n = d->findNode(akey);
return n ? n->value : adefaultValue;
@@ -681,7 +655,7 @@ Q_INLINE_TEMPLATE T &QMap<Key, T>::operator[](const Key &akey)
}
template <class Key, class T>
-Q_INLINE_TEMPLATE int QMap<Key, T>::count(const Key &akey) const
+Q_INLINE_TEMPLATE qsizetype QMap<Key, T>::count(const Key &akey) const
{
Node *firstNode;
Node *lastNode;
@@ -904,10 +878,10 @@ void QMap<Key, T>::dump() const
#endif
template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE int QMap<Key, T>::remove(const Key &akey)
+Q_OUTOFLINE_TEMPLATE qsizetype QMap<Key, T>::remove(const Key &akey)
{
detach();
- int n = 0;
+ qsizetype n = 0;
while (Node *node = d->findNode(akey)) {
d->deleteNode(node);
++n;
@@ -940,7 +914,7 @@ Q_OUTOFLINE_TEMPLATE typename QMap<Key, T>::iterator QMap<Key, T>::erase(iterato
if (d->ref.isShared()) {
const_iterator oldBegin = constBegin();
const_iterator old = const_iterator(it);
- int backStepsWithSameKey = 0;
+ qsizetype backStepsWithSameKey = 0;
while (old != oldBegin) {
--old;
@@ -1005,7 +979,7 @@ Q_OUTOFLINE_TEMPLATE QList<Key> QMap<Key, T>::keys(const T &avalue) const
}
template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE const Key QMap<Key, T>::key(const T &avalue, const Key &defaultKey) const
+Q_OUTOFLINE_TEMPLATE Key QMap<Key, T>::key(const T &avalue, const Key &defaultKey) const
{
const_iterator i = begin();
while (i != end()) {
@@ -1157,9 +1131,9 @@ public:
bool contains(const Key &key, const T &value) const;
- int remove(const Key &key, const T &value);
+ qsizetype remove(const Key &key, const T &value);
- int count(const Key &key, const T &value) const;
+ qsizetype count(const Key &key, const T &value) const;
typename QMap<Key, T>::iterator find(const Key &key, const T &value) {
typename QMap<Key, T>::iterator i(find(key));
@@ -1315,9 +1289,9 @@ Q_INLINE_TEMPLATE bool QMultiMap<Key, T>::contains(const Key &key, const T &valu
}
template <class Key, class T>
-Q_INLINE_TEMPLATE int QMultiMap<Key, T>::remove(const Key &key, const T &value)
+Q_INLINE_TEMPLATE qsizetype QMultiMap<Key, T>::remove(const Key &key, const T &value)
{
- int n = 0;
+ qsizetype n = 0;
typename QMap<Key, T>::iterator i(find(key));
typename QMap<Key, T>::iterator end(QMap<Key, T>::end());
while (i != end && !qMapLessThanKey<Key>(key, i.key())) {
@@ -1332,9 +1306,9 @@ Q_INLINE_TEMPLATE int QMultiMap<Key, T>::remove(const Key &key, const T &value)
}
template <class Key, class T>
-Q_INLINE_TEMPLATE int QMultiMap<Key, T>::count(const Key &key, const T &value) const
+Q_INLINE_TEMPLATE qsizetype QMultiMap<Key, T>::count(const Key &key, const T &value) const
{
- int n = 0;
+ qsizetype n = 0;
typename QMap<Key, T>::const_iterator i(constFind(key));
typename QMap<Key, T>::const_iterator end(QMap<Key, T>::constEnd());
while (i != end && !qMapLessThanKey<Key>(key, i.key())) {
diff --git a/src/corelib/tools/qpoint.h b/src/corelib/tools/qpoint.h
index f0a91c4ff8..1258e465dd 100644
--- a/src/corelib/tools/qpoint.h
+++ b/src/corelib/tools/qpoint.h
@@ -265,7 +265,6 @@ public:
#endif
private:
- friend class QMatrix;
friend class QTransform;
qreal xp;
diff --git a/src/corelib/tools/qrefcount.h b/src/corelib/tools/qrefcount.h
index 2e5388ad9a..982a9c2bbf 100644
--- a/src/corelib/tools/qrefcount.h
+++ b/src/corelib/tools/qrefcount.h
@@ -53,10 +53,6 @@ class RefCount
public:
inline bool ref() noexcept {
int count = atomic.loadRelaxed();
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- if (count == 0) // !isSharable
- return false;
-#endif
if (count != -1) // !isStatic
atomic.ref();
return true;
@@ -64,32 +60,11 @@ public:
inline bool deref() noexcept {
int count = atomic.loadRelaxed();
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- if (count == 0) // !isSharable
- return false;
-#endif
if (count == -1) // isStatic
return true;
return atomic.deref();
}
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- bool setSharable(bool sharable) noexcept
- {
- Q_ASSERT(!isShared());
- if (sharable)
- return atomic.testAndSetRelaxed(0, 1);
- else
- return atomic.testAndSetRelaxed(1, 0);
- }
-
- bool isSharable() const noexcept
- {
- // Sharable === Shared ownership.
- return atomic.loadRelaxed() != 0;
- }
-#endif
-
bool isStatic() const noexcept
{
// Persistent object, never deleted
diff --git a/src/corelib/tools/qset.h b/src/corelib/tools/qset.h
index 4b2adcd851..f078e62999 100644
--- a/src/corelib/tools/qset.h
+++ b/src/corelib/tools/qset.h
@@ -86,9 +86,6 @@ public:
inline void detach() { q_hash.detach(); }
inline bool isDetached() const { return q_hash.isDetached(); }
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- inline void setSharable(bool sharable) { q_hash.setSharable(sharable); }
-#endif
inline void clear() { q_hash.clear(); }
@@ -108,11 +105,7 @@ public:
friend class QSet<T>;
public:
-#if QT_DEPRECATED_WARNINGS_SINCE < QT_VERSION_CHECK(5, 15, 0)
- typedef std::bidirectional_iterator_tag iterator_category;
-#else
typedef std::forward_iterator_tag iterator_category;
-#endif
typedef qptrdiff difference_type;
typedef T value_type;
typedef const T *pointer;
@@ -132,15 +125,6 @@ public:
{ return i != o.i; }
inline iterator &operator++() { ++i; return *this; }
inline iterator operator++(int) { iterator r = *this; ++i; return r; }
-#if QT_DEPRECATED_SINCE(5, 15)
- inline QT_DEPRECATED_VERSION_5_15 iterator &operator--() { --i; return *this; }
- inline QT_DEPRECATED_VERSION_5_15 iterator operator--(int) { iterator r = *this; --i; return r; }
- inline QT_DEPRECATED_VERSION_5_15 iterator operator+(int j) const { return i + j; }
- inline QT_DEPRECATED_VERSION_5_15 iterator operator-(int j) const { return i - j; }
- friend inline QT_DEPRECATED_VERSION_5_15 iterator operator+(int j, iterator k) { return k + j; }
- inline QT_DEPRECATED_VERSION_5_15 iterator &operator+=(int j) { i += j; return *this; }
- inline QT_DEPRECATED_VERSION_5_15 iterator &operator-=(int j) { i -= j; return *this; }
-#endif
};
class const_iterator
@@ -151,11 +135,7 @@ public:
friend class QSet<T>;
public:
-#if QT_DEPRECATED_WARNINGS_SINCE < QT_VERSION_CHECK(5, 15, 0)
- typedef std::bidirectional_iterator_tag iterator_category;
-#else
typedef std::forward_iterator_tag iterator_category;
-#endif
typedef qptrdiff difference_type;
typedef T value_type;
typedef const T *pointer;
@@ -173,15 +153,6 @@ public:
inline bool operator!=(const const_iterator &o) const { return i != o.i; }
inline const_iterator &operator++() { ++i; return *this; }
inline const_iterator operator++(int) { const_iterator r = *this; ++i; return r; }
-#if QT_DEPRECATED_SINCE(5, 15)
- inline QT_DEPRECATED_VERSION_5_15 const_iterator &operator--() { --i; return *this; }
- inline QT_DEPRECATED_VERSION_5_15 const_iterator operator--(int) { const_iterator r = *this; --i; return r; }
- inline QT_DEPRECATED_VERSION_5_15 const_iterator operator+(int j) const { return i + j; }
- inline QT_DEPRECATED_VERSION_5_15 const_iterator operator-(int j) const { return i - j; }
- friend inline QT_DEPRECATED_VERSION_5_15 const_iterator operator+(int j, const_iterator k) { return k + j; }
- inline QT_DEPRECATED_VERSION_5_15 const_iterator &operator+=(int j) { i += j; return *this; }
- inline QT_DEPRECATED_VERSION_5_15 const_iterator &operator-=(int j) { i -= j; return *this; }
-#endif
};
// STL style
@@ -194,24 +165,10 @@ public:
inline const_iterator cend() const noexcept { return q_hash.end(); }
inline const_iterator constEnd() const noexcept { return q_hash.constEnd(); }
-#if QT_DEPRECATED_SINCE(5, 15)
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
- reverse_iterator QT_DEPRECATED_VERSION_5_15 rbegin() { return reverse_iterator(end()); }
- reverse_iterator QT_DEPRECATED_VERSION_5_15 rend() { return reverse_iterator(begin()); }
- const_reverse_iterator QT_DEPRECATED_VERSION_5_15 rbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator QT_DEPRECATED_VERSION_5_15 rend() const noexcept { return const_reverse_iterator(begin()); }
- const_reverse_iterator QT_DEPRECATED_VERSION_5_15 crbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator QT_DEPRECATED_VERSION_5_15 crend() const noexcept { return const_reverse_iterator(begin()); }
-#endif
-
- iterator erase(iterator i)
- { return erase(m2c(i)); }
iterator erase(const_iterator i)
{
- Q_ASSERT_X(isValidIterator(i), "QSet::erase", "The specified const_iterator argument 'i' is invalid");
- return q_hash.erase(reinterpret_cast<typename Hash::const_iterator &>(i));
+ Q_ASSERT(i != constEnd());
+ return q_hash.erase(i.i);
}
// more Qt
@@ -260,27 +217,9 @@ public:
{ QSet<T> result = *this; result -= other; return result; }
QList<T> values() const;
-#if QT_DEPRECATED_SINCE(5, 14) && QT_VERSION < QT_VERSION_CHECK(6,0,0)
- QT_DEPRECATED_X("Use values() instead.")
- QList<T> toList() const { return values(); }
- QT_DEPRECATED_X("Use QSet<T>(list.begin(), list.end()) instead.")
- static QSet<T> fromList(const QList<T> &list);
-#endif
private:
Hash q_hash;
-
- static const_iterator m2c(iterator it) noexcept
- { return const_iterator(typename Hash::const_iterator(it.i.i)); }
-
- bool isValidIterator(const iterator &i) const
- {
- return q_hash.isValidIterator(reinterpret_cast<const typename Hash::iterator&>(i));
- }
- bool isValidIterator(const const_iterator &i) const noexcept
- {
- return q_hash.isValidIterator(reinterpret_cast<const typename Hash::const_iterator&>(i));
- }
};
#if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606
@@ -291,7 +230,7 @@ QSet(InputIterator, InputIterator) -> QSet<ValueType>;
#endif
template <typename T>
-uint qHash(const QSet<T> &key, uint seed = 0)
+size_t qHash(const QSet<T> &key, size_t seed = 0)
noexcept(noexcept(qHashRangeCommutative(key.begin(), key.end(), seed)))
{
return qHashRangeCommutative(key.begin(), key.end(), seed);
@@ -338,24 +277,14 @@ Q_INLINE_TEMPLATE bool QSet<T>::intersects(const QSet<T> &other) const
const bool otherIsBigger = other.size() > size();
const QSet &smallestSet = otherIsBigger ? *this : other;
const QSet &biggestSet = otherIsBigger ? other : *this;
- const bool equalSeeds = q_hash.d->seed == other.q_hash.d->seed;
typename QSet::const_iterator i = smallestSet.cbegin();
typename QSet::const_iterator e = smallestSet.cend();
- if (Q_LIKELY(equalSeeds)) {
- // If seeds are equal we take the fast path so no hash is recalculated.
- while (i != e) {
- if (*biggestSet.q_hash.findNode(*i, i.i.i->h) != biggestSet.q_hash.e)
- return true;
- ++i;
- }
- } else {
- while (i != e) {
- if (biggestSet.contains(*i))
- return true;
- ++i;
- }
- }
+ while (i != e) {
+ if (biggestSet.contains(*i))
+ return true;
+ ++i;
+ }
return false;
}
@@ -397,30 +326,6 @@ Q_OUTOFLINE_TEMPLATE QList<T> QSet<T>::values() const
return result;
}
-#if QT_DEPRECATED_SINCE(5, 14) && QT_VERSION < QT_VERSION_CHECK(6,0,0)
-template <typename T>
-Q_OUTOFLINE_TEMPLATE QSet<T> QList<T>::toSet() const
-{
- QSet<T> result;
- result.reserve(size());
- for (int i = 0; i < size(); ++i)
- result.insert(at(i));
- return result;
-}
-
-template <typename T>
-QSet<T> QSet<T>::fromList(const QList<T> &list)
-{
- return list.toSet();
-}
-
-template <typename T>
-QList<T> QList<T>::fromSet(const QSet<T> &set)
-{
- return set.toList();
-}
-#endif
-
Q_DECLARE_SEQUENTIAL_ITERATOR(Set)
#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
@@ -448,14 +353,6 @@ public:
inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
inline bool findNext(const T &t)
{ while (c->constEnd() != (n = i)) if (*i++ == t) return true; return false; }
-#if QT_DEPRECATED_SINCE(5, 15)
- inline QT_DEPRECATED_VERSION_5_15 bool hasPrevious() const { return c->constBegin() != i; }
- inline QT_DEPRECATED_VERSION_5_15 const T &previous() { n = --i; return *n; }
- inline QT_DEPRECATED_VERSION_5_15 const T &peekPrevious() const { iterator p = i; return *--p; }
- inline QT_DEPRECATED_VERSION_5_15 bool findPrevious(const T &t)
- { while (c->constBegin() != i) if (*(n = --i) == t) return true;
- n = c->end(); return false; }
-#endif
};
#endif // QT_NO_JAVA_STYLE_ITERATORS
diff --git a/src/corelib/tools/qset.qdoc b/src/corelib/tools/qset.qdoc
index 42dd1288ac..eb6b542181 100644
--- a/src/corelib/tools/qset.qdoc
+++ b/src/corelib/tools/qset.qdoc
@@ -1136,7 +1136,7 @@
*/
/*!
- \fn template <class T> uint qHash(const QSet<T> &key, uint seed = 0)
+ \fn template <class T> size_t qHash(const QSet<T> &key, size_t seed = 0)
\relates QHash
\since 5.5
diff --git a/src/corelib/tools/qshareddata.h b/src/corelib/tools/qshareddata.h
index f123f8e7b9..ef3e689e92 100644
--- a/src/corelib/tools/qshareddata.h
+++ b/src/corelib/tools/qshareddata.h
@@ -305,12 +305,12 @@ Q_INLINE_TEMPLATE void swap(QExplicitlySharedDataPointer<T> &p1, QExplicitlyShar
{ p1.swap(p2); }
template <class T>
-Q_INLINE_TEMPLATE uint qHash(const QSharedDataPointer<T> &ptr, uint seed = 0) noexcept
+Q_INLINE_TEMPLATE size_t qHash(const QSharedDataPointer<T> &ptr, size_t seed = 0) noexcept
{
return qHash(ptr.data(), seed);
}
template <class T>
-Q_INLINE_TEMPLATE uint qHash(const QExplicitlySharedDataPointer<T> &ptr, uint seed = 0) noexcept
+Q_INLINE_TEMPLATE size_t qHash(const QExplicitlySharedDataPointer<T> &ptr, size_t seed = 0) noexcept
{
return qHash(ptr.data(), seed);
}
diff --git a/src/corelib/tools/qsharedpointer.cpp b/src/corelib/tools/qsharedpointer.cpp
index 0576fb2bd0..499546da4b 100644
--- a/src/corelib/tools/qsharedpointer.cpp
+++ b/src/corelib/tools/qsharedpointer.cpp
@@ -1630,7 +1630,7 @@ void QtSharedPointer::internalSafetyCheckCleanCheck()
qFatal("Internal consistency error: the number of pointers is not equal!");
if (Q_UNLIKELY(!kp->dPointers.isEmpty()))
- qFatal("Pointer cleaning failed: %d entries remaining", kp->dPointers.size());
+ qFatal("Pointer cleaning failed: %d entries remaining", int(kp->dPointers.size()));
# endif
}
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h
index 362d57fb9a..b6aad5ff73 100644
--- a/src/corelib/tools/qsharedpointer_impl.h
+++ b/src/corelib/tools/qsharedpointer_impl.h
@@ -882,7 +882,7 @@ Q_INLINE_TEMPLATE bool operator<(T *ptr1, const QSharedPointer<X> &ptr2)
// qHash
//
template <class T>
-Q_INLINE_TEMPLATE uint qHash(const QSharedPointer<T> &ptr, uint seed = 0)
+Q_INLINE_TEMPLATE size_t qHash(const QSharedPointer<T> &ptr, size_t seed = 0)
{
return QT_PREPEND_NAMESPACE(qHash)(ptr.data(), seed);
}
diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h
deleted file mode 100644
index 26e98c4542..0000000000
--- a/src/corelib/tools/qsimd_p.h
+++ /dev/null
@@ -1,396 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSIMD_P_H
-#define QSIMD_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-
-/*
- * qt_module_config.prf defines the QT_COMPILER_SUPPORTS_XXX macros.
- * They mean the compiler supports the necessary flags and the headers
- * for the x86 and ARM intrinsics:
- * - GCC: the -mXXX or march=YYY flag is necessary before #include
- * up to 4.8; GCC >= 4.9 can include unconditionally
- * - Intel CC: #include can happen unconditionally
- * - MSVC: #include can happen unconditionally
- * - RVCT: ???
- *
- * We will try to include all headers possible under this configuration.
- *
- * MSVC does not define __SSE2__ & family, so we will define them. MSVC 2013 &
- * up do define __AVX__ if the -arch:AVX option is passed on the command-line.
- *
- * Supported XXX are:
- * Flag | Arch | GCC | Intel CC | MSVC |
- * ARM_NEON | ARM | I & C | None | ? |
- * SSE2 | x86 | I & C | I & C | I & C |
- * SSE3 | x86 | I & C | I & C | I only |
- * SSSE3 | x86 | I & C | I & C | I only |
- * SSE4_1 | x86 | I & C | I & C | I only |
- * SSE4_2 | x86 | I & C | I & C | I only |
- * AVX | x86 | I & C | I & C | I & C |
- * AVX2 | x86 | I & C | I & C | I only |
- * AVX512xx | x86 | I & C | I & C | I only |
- * I = intrinsics; C = code generation
- *
- * Code can use the following constructs to determine compiler support & status:
- * - #ifdef __XXX__ (e.g: #ifdef __AVX__ or #ifdef __ARM_NEON__)
- * If this test passes, then the compiler is already generating code for that
- * given sub-architecture. The intrinsics for that sub-architecture are
- * #included and can be used without restriction or runtime check.
- *
- * - #if QT_COMPILER_SUPPORTS(XXX)
- * If this test passes, then the compiler is able to generate code for that
- * given sub-architecture in another translation unit, given the right set of
- * flags. Use of the intrinsics is not guaranteed. This is useful with
- * runtime detection (see below).
- *
- * - #if QT_COMPILER_SUPPORTS_HERE(XXX)
- * If this test passes, then the compiler is able to generate code for that
- * given sub-architecture in this translation unit, even if it is not doing
- * that now (it might be). Individual functions may be tagged with
- * QT_FUNCTION_TARGET(XXX) to cause the compiler to generate code for that
- * sub-arch. Only inside such functions is the use of the intrisics
- * guaranteed to work. This is useful with runtime detection (see below).
- *
- * Runtime detection of a CPU sub-architecture can be done with the
- * qCpuHasFeature(XXX) function. There are two strategies for generating
- * optimized code like that:
- *
- * 1) place the optimized code in a different translation unit (C or assembly
- * sources) and pass the correct flags to the compiler to enable support. Those
- * sources must not include qglobal.h, which means they cannot include this
- * file either. The dispatcher function would look like this:
- *
- * void foo()
- * {
- * #if QT_COMPILER_SUPPORTS(XXX)
- * if (qCpuHasFeature(XXX)) {
- * foo_optimized_xxx();
- * return;
- * }
- * #endif
- * foo_plain();
- * }
- *
- * 2) place the optimized code in a function tagged with QT_FUNCTION_TARGET and
- * surrounded by #if QT_COMPILER_SUPPORTS_HERE(XXX). That code can freely use
- * other Qt code. The dispatcher function would look like this:
- *
- * void foo()
- * {
- * #if QT_COMPILER_SUPPORTS_HERE(XXX)
- * if (qCpuHasFeature(XXX)) {
- * foo_optimized_xxx();
- * return;
- * }
- * #endif
- * foo_plain();
- * }
- */
-
-#if defined(__MINGW64_VERSION_MAJOR) || defined(Q_CC_MSVC)
-#include <intrin.h>
-#endif
-
-#define QT_COMPILER_SUPPORTS(x) (QT_COMPILER_SUPPORTS_ ## x - 0)
-
-#if defined(Q_PROCESSOR_ARM)
-# define QT_COMPILER_SUPPORTS_HERE(x) (__ARM_FEATURE_ ## x)
-# if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 600
- /* GCC requires attributes for a function */
-# define QT_FUNCTION_TARGET(x) __attribute__((__target__(QT_FUNCTION_TARGET_STRING_ ## x)))
-# else
-# define QT_FUNCTION_TARGET(x)
-# endif
-# if !defined(__ARM_FEATURE_NEON) && defined(__ARM_NEON__)
-# define __ARM_FEATURE_NEON // also support QT_COMPILER_SUPPORTS_HERE(NEON)
-# endif
-#elif defined(Q_PROCESSOR_MIPS)
-# define QT_COMPILER_SUPPORTS_HERE(x) (__ ## x ## __)
-# define QT_FUNCTION_TARGET(x)
-# if !defined(__MIPS_DSP__) && defined(__mips_dsp) && defined(Q_PROCESSOR_MIPS_32)
-# define __MIPS_DSP__
-# endif
-# if !defined(__MIPS_DSPR2__) && defined(__mips_dspr2) && defined(Q_PROCESSOR_MIPS_32)
-# define __MIPS_DSPR2__
-# endif
-#elif defined(Q_PROCESSOR_X86) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS)
-# define QT_COMPILER_SUPPORTS_HERE(x) ((__ ## x ## __) || QT_COMPILER_SUPPORTS(x))
-# if defined(Q_CC_GNU) && !defined(Q_CC_INTEL)
- /* GCC requires attributes for a function */
-# define QT_FUNCTION_TARGET(x) __attribute__((__target__(QT_FUNCTION_TARGET_STRING_ ## x)))
-# else
-# define QT_FUNCTION_TARGET(x)
-# endif
-#else
-# define QT_COMPILER_SUPPORTS_HERE(x) (__ ## x ## __)
-# define QT_FUNCTION_TARGET(x)
-#endif
-
-#ifdef Q_PROCESSOR_X86
-/* -- x86 intrinsic support -- */
-
-# if defined(Q_CC_MSVC) && (defined(_M_X64) || _M_IX86_FP >= 2)
-// MSVC doesn't define __SSE2__, so do it ourselves
-# define __SSE__ 1
-# define __SSE2__ 1
-# endif
-
-# ifdef __SSE2__
-// #include the intrinsics
-# include <immintrin.h>
-# endif
-
-# if defined(Q_CC_GNU) && !defined(Q_CC_INTEL)
-// GCC 4.4 and Clang 2.8 added a few more intrinsics there
-# include <x86intrin.h>
-# endif
-
-# if defined(Q_CC_MSVC) && (defined(_M_AVX) || defined(__AVX__))
-// Visual Studio defines __AVX__ when /arch:AVX is passed, but not the earlier macros
-// See: https://msdn.microsoft.com/en-us/library/b0084kay.aspx
-# define __SSE3__ 1
-# define __SSSE3__ 1
-// no Intel CPU supports SSE4a, so don't define it
-# define __SSE4_1__ 1
-# define __SSE4_2__ 1
-# ifndef __AVX__
-# define __AVX__ 1
-# endif
-# endif
-
-# if defined(__SSE4_2__) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS) && (defined(Q_CC_INTEL) || defined(Q_CC_MSVC))
-// POPCNT instructions:
-// All processors that support SSE4.2 support POPCNT
-// (but neither MSVC nor the Intel compiler define this macro)
-# define __POPCNT__ 1
-# endif
-
-// AVX intrinsics
-# if defined(__AVX__) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS) && (defined(Q_CC_INTEL) || defined(Q_CC_MSVC))
-// AES, PCLMULQDQ instructions:
-// All processors that support AVX support PCLMULQDQ
-// (but neither MSVC nor the Intel compiler define this macro)
-# define __PCLMUL__ 1
-# endif
-
-# if defined(__AVX2__) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS) && (defined(Q_CC_INTEL) || defined(Q_CC_MSVC))
-// F16C & RDRAND instructions:
-// All processors that support AVX2 support F16C & RDRAND:
-// (but neither MSVC nor the Intel compiler define these macros)
-# define __F16C__ 1
-# define __RDRND__ 1
-# endif
-
-# if defined(__BMI__) && !defined(__BMI2__) && defined(Q_CC_INTEL)
-// BMI2 instructions:
-// All processors that support BMI support BMI2 (and AVX2)
-// (but neither MSVC nor the Intel compiler define this macro)
-# define __BMI2__ 1
-# endif
-
-# include "qsimd_x86_p.h"
-
-// Haswell sub-architecture
-//
-// The Intel Core 4th generation was codenamed "Haswell" and introduced AVX2,
-// BMI1, BMI2, FMA, LZCNT, MOVBE, which makes it a good divider for a
-// sub-target for us. The first AMD processor with AVX2 support (Zen) has the
-// same features.
-//
-// macOS's fat binaries support the "x86_64h" sub-architecture and the GNU libc
-// ELF loader also supports a "haswell/" subdir (e.g., /usr/lib/haswell).
-# define QT_FUNCTION_TARGET_STRING_ARCH_HASWELL "arch=haswell"
-# if defined(__AVX2__) && defined(__BMI__) && defined(__BMI2__) && defined(__F16C__) && \
- defined(__FMA__) && defined(__LZCNT__) && defined(__RDRND__)
-# define __haswell__ 1
-# endif
-
-// This constant does not include all CPU features found in a Haswell, only
-// those that we'd have optimized code for.
-// Note: must use Q_CONSTEXPR here, as this file may be compiled in C mode.
-QT_BEGIN_NAMESPACE
-static const quint64 CpuFeatureArchHaswell = 0
- | CpuFeatureSSE2
- | CpuFeatureSSE3
- | CpuFeatureSSSE3
- | CpuFeatureSSE4_1
- | CpuFeatureSSE4_2
- | CpuFeatureFMA
- | CpuFeaturePOPCNT
- | CpuFeatureAVX
- | CpuFeatureF16C
- | CpuFeatureAVX2
- | CpuFeatureBMI
- | CpuFeatureBMI2;
-QT_END_NAMESPACE
-
-#endif /* Q_PROCESSOR_X86 */
-
-// Clang compiler fix, see http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20160222/151168.html
-// This should be tweaked with an "upper version" of clang once we know which release fixes the
-// issue. At that point we can rely on __ARM_FEATURE_CRC32 again.
-#if defined(Q_CC_CLANG) && defined(Q_OS_DARWIN) && defined (__ARM_FEATURE_CRC32)
-# undef __ARM_FEATURE_CRC32
-#endif
-
-// NEON intrinsics
-// note: as of GCC 4.9, does not support function targets for ARM
-#if defined(__ARM_NEON) || defined(__ARM_NEON__)
-#include <arm_neon.h>
-#define QT_FUNCTION_TARGET_STRING_NEON "+neon" // unused: gcc doesn't support function targets on non-aarch64, and on Aarch64 NEON is always available.
-#ifndef __ARM_NEON__
-// __ARM_NEON__ is not defined on AArch64, but we need it in our NEON detection.
-#define __ARM_NEON__
-#endif
-#endif
-// AArch64/ARM64
-#if defined(Q_PROCESSOR_ARM_V8) && defined(__ARM_FEATURE_CRC32)
-#if defined(Q_PROCESSOR_ARM_64)
-// only available on aarch64
-#define QT_FUNCTION_TARGET_STRING_CRC32 "+crc"
-#endif
-# include <arm_acle.h>
-#endif
-
-#ifdef __cplusplus
-#include <qatomic.h>
-
-QT_BEGIN_NAMESPACE
-
-#ifndef Q_PROCESSOR_X86
-enum CPUFeatures {
-#if defined(Q_PROCESSOR_ARM)
- CpuFeatureNEON = 2,
- CpuFeatureARM_NEON = CpuFeatureNEON,
- CpuFeatureCRC32 = 4,
-#elif defined(Q_PROCESSOR_MIPS)
- CpuFeatureDSP = 2,
- CpuFeatureDSPR2 = 4,
-#endif
-
- // used only to indicate that the CPU detection was initialised
- QSimdInitialized = 1
-};
-
-static const quint64 qCompilerCpuFeatures = 0
-#if defined __ARM_NEON__
- | CpuFeatureNEON
-#endif
-#if defined __ARM_FEATURE_CRC32
- | CpuFeatureCRC32
-#endif
-#if defined __mips_dsp
- | CpuFeatureDSP
-#endif
-#if defined __mips_dspr2
- | CpuFeatureDSPR2
-#endif
- ;
-#endif
-
-#ifdef Q_ATOMIC_INT64_IS_SUPPORTED
-extern Q_CORE_EXPORT QBasicAtomicInteger<quint64> qt_cpu_features[1];
-#else
-extern Q_CORE_EXPORT QBasicAtomicInteger<unsigned> qt_cpu_features[2];
-#endif
-Q_CORE_EXPORT quint64 qDetectCpuFeatures();
-
-#if defined(Q_PROCESSOR_X86) && QT_COMPILER_SUPPORTS_HERE(RDRND) && !defined(QT_BOOTSTRAPPED)
-Q_CORE_EXPORT qsizetype qRandomCpu(void *, qsizetype) noexcept;
-#else
-static inline qsizetype qRandomCpu(void *, qsizetype) noexcept
-{
- return 0;
-}
-#endif
-
-static inline quint64 qCpuFeatures()
-{
- quint64 features = qt_cpu_features[0].loadRelaxed();
-#ifndef Q_ATOMIC_INT64_IS_SUPPORTED
- features |= quint64(qt_cpu_features[1].loadRelaxed()) << 32;
-#endif
- if (Q_UNLIKELY(features == 0)) {
- features = qDetectCpuFeatures();
- Q_ASSUME(features != 0);
- }
- return features;
-}
-
-#define qCpuHasFeature(feature) (((qCompilerCpuFeatures & CpuFeature ## feature) == CpuFeature ## feature) \
- || ((qCpuFeatures() & CpuFeature ## feature) == CpuFeature ## feature))
-
-inline bool qHasHwrng()
-{
-#if defined(Q_PROCESSOR_X86) && QT_COMPILER_SUPPORTS_HERE(RDRND)
- return qCpuHasFeature(RDRND);
-#else
- return false;
-#endif
-}
-
-#define ALIGNMENT_PROLOGUE_16BYTES(ptr, i, length) \
- for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((4 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x3)) & 0x3))); ++i)
-
-#define ALIGNMENT_PROLOGUE_32BYTES(ptr, i, length) \
- for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((8 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x7)) & 0x7))); ++i)
-
-QT_END_NAMESPACE
-
-#endif // __cplusplus
-
-#define SIMD_EPILOGUE(i, length, max) \
- for (int _i = 0; _i < max && i < length; ++i, ++_i)
-
-#endif // QSIMD_P_H
diff --git a/src/corelib/tools/qsimd_x86.cpp b/src/corelib/tools/qsimd_x86.cpp
deleted file mode 100644
index 509af464b2..0000000000
--- a/src/corelib/tools/qsimd_x86.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-// This is a generated file. DO NOT EDIT.
-// Please see util/x86simdgen/generate.pl
-#include "qsimd_p.h"
-
-static const char features_string[] =
- " sse2\0"
- " sse3\0"
- " ssse3\0"
- " fma\0"
- " sse4.1\0"
- " sse4.2\0"
- " movbe\0"
- " popcnt\0"
- " aes\0"
- " avx\0"
- " f16c\0"
- " rdrnd\0"
- " bmi\0"
- " hle\0"
- " avx2\0"
- " bmi2\0"
- " rtm\0"
- " avx512f\0"
- " avx512dq\0"
- " rdseed\0"
- " avx512ifma\0"
- " avx512pf\0"
- " avx512er\0"
- " avx512cd\0"
- " sha\0"
- " avx512bw\0"
- " avx512vl\0"
- " avx512vbmi\0"
- " avx512vbmi2\0"
- " gfni\0"
- " vaes\0"
- " avx512vnni\0"
- " avx512bitalg\0"
- " avx512vpopcntdq\0"
- " avx5124nniw\0"
- " avx5124fmaps\0"
- "\0";
-
-static const quint16 features_indices[] = {
- 306, 0, 6, 12, 19, 24, 32, 40,
- 47, 55, 60, 65, 71, 78, 83, 88,
- 94, 100, 105, 114, 124, 132, 144, 154,
- 164, 174, 179, 189, 199, 211, 224, 230,
- 236, 248, 262, 279, 292
-};
-
-enum X86CpuidLeaves {
- Leaf1ECX,
- Leaf1EDX,
- Leaf7_0EBX,
- Leaf7_0ECX,
- Leaf7_0EDX,
- X86CpuidMaxLeaf
-};
-
-static const quint8 x86_locators[] = {
- Leaf1EDX*32 + 26, // sse2
- Leaf1ECX*32 + 0, // sse3
- Leaf1ECX*32 + 9, // ssse3
- Leaf1ECX*32 + 12, // fma
- Leaf1ECX*32 + 19, // sse4.1
- Leaf1ECX*32 + 20, // sse4.2
- Leaf1ECX*32 + 22, // movbe
- Leaf1ECX*32 + 23, // popcnt
- Leaf1ECX*32 + 25, // aes
- Leaf1ECX*32 + 28, // avx
- Leaf1ECX*32 + 29, // f16c
- Leaf1ECX*32 + 30, // rdrnd
- Leaf7_0EBX*32 + 3, // bmi
- Leaf7_0EBX*32 + 4, // hle
- Leaf7_0EBX*32 + 5, // avx2
- Leaf7_0EBX*32 + 8, // bmi2
- Leaf7_0EBX*32 + 11, // rtm
- Leaf7_0EBX*32 + 16, // avx512f
- Leaf7_0EBX*32 + 17, // avx512dq
- Leaf7_0EBX*32 + 18, // rdseed
- Leaf7_0EBX*32 + 21, // avx512ifma
- Leaf7_0EBX*32 + 26, // avx512pf
- Leaf7_0EBX*32 + 27, // avx512er
- Leaf7_0EBX*32 + 28, // avx512cd
- Leaf7_0EBX*32 + 29, // sha
- Leaf7_0EBX*32 + 30, // avx512bw
- Leaf7_0EBX*32 + 31, // avx512vl
- Leaf7_0ECX*32 + 1, // avx512vbmi
- Leaf7_0ECX*32 + 6, // avx512vbmi2
- Leaf7_0ECX*32 + 8, // gfni
- Leaf7_0ECX*32 + 9, // vaes
- Leaf7_0ECX*32 + 11, // avx512vnni
- Leaf7_0ECX*32 + 12, // avx512bitalg
- Leaf7_0ECX*32 + 14, // avx512vpopcntdq
- Leaf7_0EDX*32 + 2, // avx5124nniw
- Leaf7_0EDX*32 + 3 // avx5124fmaps
-};
-
-// List of AVX512 features (see detectProcessorFeatures())
-static const quint64 AllAVX512 = 0
- | CpuFeatureAVX512F
- | CpuFeatureAVX512DQ
- | CpuFeatureAVX512IFMA
- | CpuFeatureAVX512PF
- | CpuFeatureAVX512ER
- | CpuFeatureAVX512CD
- | CpuFeatureAVX512BW
- | CpuFeatureAVX512VL
- | CpuFeatureAVX512VBMI
- | CpuFeatureAVX512VBMI2
- | CpuFeatureAVX512VNNI
- | CpuFeatureAVX512BITALG
- | CpuFeatureAVX512VPOPCNTDQ
- | CpuFeatureAVX5124NNIW
- | CpuFeatureAVX5124FMAPS;
diff --git a/src/corelib/tools/qsimd_x86_p.h b/src/corelib/tools/qsimd_x86_p.h
deleted file mode 100644
index 2434e2b797..0000000000
--- a/src/corelib/tools/qsimd_x86_p.h
+++ /dev/null
@@ -1,222 +0,0 @@
-// This is a generated file. DO NOT EDIT.
-// Please see util/x86simdgen/generate.pl
-#ifndef QSIMD_P_H
-# error "Please include <private/qsimd_p.h> instead"
-#endif
-#ifndef QSIMD_X86_P_H
-#define QSIMD_X86_P_H
-
-#include "qsimd_p.h"
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-QT_BEGIN_NAMESPACE
-
-// used only to indicate that the CPU detection was initialized
-#define QSimdInitialized (Q_UINT64_C(1) << 0)
-
-// in CPUID Leaf 1, EDX:
-#define CpuFeatureSSE2 (Q_UINT64_C(1) << 1)
-#define QT_FUNCTION_TARGET_STRING_SSE2 "sse2"
-
-// in CPUID Leaf 1, ECX:
-#define CpuFeatureSSE3 (Q_UINT64_C(1) << 2)
-#define QT_FUNCTION_TARGET_STRING_SSE3 "sse3"
-#define CpuFeatureSSSE3 (Q_UINT64_C(1) << 3)
-#define QT_FUNCTION_TARGET_STRING_SSSE3 "ssse3"
-#define CpuFeatureFMA (Q_UINT64_C(1) << 4)
-#define QT_FUNCTION_TARGET_STRING_FMA "fma"
-#define CpuFeatureSSE4_1 (Q_UINT64_C(1) << 5)
-#define QT_FUNCTION_TARGET_STRING_SSE4_1 "sse4.1"
-#define CpuFeatureSSE4_2 (Q_UINT64_C(1) << 6)
-#define QT_FUNCTION_TARGET_STRING_SSE4_2 "sse4.2"
-#define CpuFeatureMOVBE (Q_UINT64_C(1) << 7)
-#define QT_FUNCTION_TARGET_STRING_MOVBE "movbe"
-#define CpuFeaturePOPCNT (Q_UINT64_C(1) << 8)
-#define QT_FUNCTION_TARGET_STRING_POPCNT "popcnt"
-#define CpuFeatureAES (Q_UINT64_C(1) << 9)
-#define QT_FUNCTION_TARGET_STRING_AES "aes,sse4.2"
-#define CpuFeatureAVX (Q_UINT64_C(1) << 10)
-#define QT_FUNCTION_TARGET_STRING_AVX "avx"
-#define CpuFeatureF16C (Q_UINT64_C(1) << 11)
-#define QT_FUNCTION_TARGET_STRING_F16C "f16c"
-#define CpuFeatureRDRND (Q_UINT64_C(1) << 12)
-#define QT_FUNCTION_TARGET_STRING_RDRND "rdrnd"
-
-// in CPUID Leaf 7, Sub-leaf 0, EBX:
-#define CpuFeatureBMI (Q_UINT64_C(1) << 13)
-#define QT_FUNCTION_TARGET_STRING_BMI "bmi"
-#define CpuFeatureHLE (Q_UINT64_C(1) << 14)
-#define QT_FUNCTION_TARGET_STRING_HLE "hle"
-#define CpuFeatureAVX2 (Q_UINT64_C(1) << 15)
-#define QT_FUNCTION_TARGET_STRING_AVX2 "avx2"
-#define CpuFeatureBMI2 (Q_UINT64_C(1) << 16)
-#define QT_FUNCTION_TARGET_STRING_BMI2 "bmi2"
-#define CpuFeatureRTM (Q_UINT64_C(1) << 17)
-#define QT_FUNCTION_TARGET_STRING_RTM "rtm"
-#define CpuFeatureAVX512F (Q_UINT64_C(1) << 18)
-#define QT_FUNCTION_TARGET_STRING_AVX512F "avx512f"
-#define CpuFeatureAVX512DQ (Q_UINT64_C(1) << 19)
-#define QT_FUNCTION_TARGET_STRING_AVX512DQ "avx512dq"
-#define CpuFeatureRDSEED (Q_UINT64_C(1) << 20)
-#define QT_FUNCTION_TARGET_STRING_RDSEED "rdseed"
-#define CpuFeatureAVX512IFMA (Q_UINT64_C(1) << 21)
-#define QT_FUNCTION_TARGET_STRING_AVX512IFMA "avx512ifma"
-#define CpuFeatureAVX512PF (Q_UINT64_C(1) << 22)
-#define QT_FUNCTION_TARGET_STRING_AVX512PF "avx512pf"
-#define CpuFeatureAVX512ER (Q_UINT64_C(1) << 23)
-#define QT_FUNCTION_TARGET_STRING_AVX512ER "avx512er"
-#define CpuFeatureAVX512CD (Q_UINT64_C(1) << 24)
-#define QT_FUNCTION_TARGET_STRING_AVX512CD "avx512cd"
-#define CpuFeatureSHA (Q_UINT64_C(1) << 25)
-#define QT_FUNCTION_TARGET_STRING_SHA "sha"
-#define CpuFeatureAVX512BW (Q_UINT64_C(1) << 26)
-#define QT_FUNCTION_TARGET_STRING_AVX512BW "avx512bw"
-#define CpuFeatureAVX512VL (Q_UINT64_C(1) << 27)
-#define QT_FUNCTION_TARGET_STRING_AVX512VL "avx512vl"
-
-// in CPUID Leaf 7, Sub-leaf 0, ECX:
-#define CpuFeatureAVX512VBMI (Q_UINT64_C(1) << 28)
-#define QT_FUNCTION_TARGET_STRING_AVX512VBMI "avx512vbmi"
-#define CpuFeatureAVX512VBMI2 (Q_UINT64_C(1) << 29)
-#define QT_FUNCTION_TARGET_STRING_AVX512VBMI2 "avx512vbmi2"
-#define CpuFeatureGFNI (Q_UINT64_C(1) << 30)
-#define QT_FUNCTION_TARGET_STRING_GFNI "gfni"
-#define CpuFeatureVAES (Q_UINT64_C(1) << 31)
-#define QT_FUNCTION_TARGET_STRING_VAES "vaes"
-#define CpuFeatureAVX512VNNI (Q_UINT64_C(1) << 32)
-#define QT_FUNCTION_TARGET_STRING_AVX512VNNI "avx512vnni"
-#define CpuFeatureAVX512BITALG (Q_UINT64_C(1) << 33)
-#define QT_FUNCTION_TARGET_STRING_AVX512BITALG "avx512bitalg"
-#define CpuFeatureAVX512VPOPCNTDQ (Q_UINT64_C(1) << 34)
-#define QT_FUNCTION_TARGET_STRING_AVX512VPOPCNTDQ "avx512vpopcntdq"
-
-// in CPUID Leaf 7, Sub-leaf 0, EDX:
-#define CpuFeatureAVX5124NNIW (Q_UINT64_C(1) << 35)
-#define QT_FUNCTION_TARGET_STRING_AVX5124NNIW "avx5124nniw"
-#define CpuFeatureAVX5124FMAPS (Q_UINT64_C(1) << 36)
-#define QT_FUNCTION_TARGET_STRING_AVX5124FMAPS "avx5124fmaps"
-
-static const quint64 qCompilerCpuFeatures = 0
-#ifdef __SSE2__
- | CpuFeatureSSE2
-#endif
-#ifdef __SSE3__
- | CpuFeatureSSE3
-#endif
-#ifdef __SSSE3__
- | CpuFeatureSSSE3
-#endif
-#ifdef __FMA__
- | CpuFeatureFMA
-#endif
-#ifdef __SSE4_1__
- | CpuFeatureSSE4_1
-#endif
-#ifdef __SSE4_2__
- | CpuFeatureSSE4_2
-#endif
-#ifdef __MOVBE__
- | CpuFeatureMOVBE
-#endif
-#ifdef __POPCNT__
- | CpuFeaturePOPCNT
-#endif
-#ifdef __AES__
- | CpuFeatureAES
-#endif
-#ifdef __AVX__
- | CpuFeatureAVX
-#endif
-#ifdef __F16C__
- | CpuFeatureF16C
-#endif
-#ifdef __RDRND__
- | CpuFeatureRDRND
-#endif
-#ifdef __BMI__
- | CpuFeatureBMI
-#endif
-#ifdef __HLE__
- | CpuFeatureHLE
-#endif
-#ifdef __AVX2__
- | CpuFeatureAVX2
-#endif
-#ifdef __BMI2__
- | CpuFeatureBMI2
-#endif
-#ifdef __RTM__
- | CpuFeatureRTM
-#endif
-#ifdef __AVX512F__
- | CpuFeatureAVX512F
-#endif
-#ifdef __AVX512DQ__
- | CpuFeatureAVX512DQ
-#endif
-#ifdef __RDSEED__
- | CpuFeatureRDSEED
-#endif
-#ifdef __AVX512IFMA__
- | CpuFeatureAVX512IFMA
-#endif
-#ifdef __AVX512PF__
- | CpuFeatureAVX512PF
-#endif
-#ifdef __AVX512ER__
- | CpuFeatureAVX512ER
-#endif
-#ifdef __AVX512CD__
- | CpuFeatureAVX512CD
-#endif
-#ifdef __SHA__
- | CpuFeatureSHA
-#endif
-#ifdef __AVX512BW__
- | CpuFeatureAVX512BW
-#endif
-#ifdef __AVX512VL__
- | CpuFeatureAVX512VL
-#endif
-#ifdef __AVX512VBMI__
- | CpuFeatureAVX512VBMI
-#endif
-#ifdef __AVX512VBMI2__
- | CpuFeatureAVX512VBMI2
-#endif
-#ifdef __GFNI__
- | CpuFeatureGFNI
-#endif
-#ifdef __VAES__
- | CpuFeatureVAES
-#endif
-#ifdef __AVX512VNNI__
- | CpuFeatureAVX512VNNI
-#endif
-#ifdef __AVX512BITALG__
- | CpuFeatureAVX512BITALG
-#endif
-#ifdef __AVX512VPOPCNTDQ__
- | CpuFeatureAVX512VPOPCNTDQ
-#endif
-#ifdef __AVX5124NNIW__
- | CpuFeatureAVX5124NNIW
-#endif
-#ifdef __AVX5124FMAPS__
- | CpuFeatureAVX5124FMAPS
-#endif
- ;
-
-QT_END_NAMESPACE
-
-#endif // QSIMD_X86_P_H
diff --git a/src/corelib/tools/qt_attribution.json b/src/corelib/tools/qt_attribution.json
new file mode 100644
index 0000000000..928ff537ca
--- /dev/null
+++ b/src/corelib/tools/qt_attribution.json
@@ -0,0 +1,15 @@
+{
+ "Id": "siphash",
+ "Name": "SipHash Algorithm",
+ "QDocModule": "qtcore",
+ "QtUsage": "Used in Qt Core (QHash)",
+
+ "Description": "Implements the SipHash algorithm.",
+ "Homepage": "https://131002.net/siphash/",
+ "DownloadLocation": "https://raw.githubusercontent.com/veorq/SipHash/adcbf09b1684a718f594faa650ffc56bacdb0777/siphash24.c",
+
+ "License": "Creative Commons Zero v1.0 Universal",
+ "LicenseId": "CC0-1.0",
+ "LicenseFile": "LICENSE.siphash",
+ "Copyright": "(C) 2012-2014 Jean-Philippe Aumasson, (C) 2012-2014 Daniel J. Bernstein <djb@cr.yp.to>"
+}
diff --git a/src/corelib/tools/qtaggedpointer.h b/src/corelib/tools/qtaggedpointer.h
new file mode 100644
index 0000000000..0c48fa6e4f
--- /dev/null
+++ b/src/corelib/tools/qtaggedpointer.h
@@ -0,0 +1,205 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTAGGEDPOINTER_H
+#define QTAGGEDPOINTER_H
+
+#include <QtCore/qglobal.h>
+#include <QtCore/qalgorithms.h>
+#include <QtCore/qmath.h>
+
+#include <limits.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate {
+ constexpr quint8 nextByteSize(quint8 bits) { return (bits + 7) / 8; }
+
+ template <typename T>
+ struct TagInfo
+ {
+ static constexpr size_t alignment = alignof(T);
+ static_assert((alignment & (alignment - 1)) == 0,
+ "Alignment of template parameter must be power of two");
+
+ static constexpr quint8 tagBits = QtPrivate::qConstexprCountTrailingZeroBits(alignment);
+ static_assert(tagBits > 0,
+ "Alignment of template parameter does not allow any tags");
+
+ static constexpr size_t tagSize = QtPrivate::qConstexprNextPowerOfTwo(nextByteSize(tagBits));
+ static_assert(tagSize < sizeof(quintptr),
+ "Alignment of template parameter allows tags masking away pointer");
+
+ using TagType = typename QIntegerForSize<tagSize>::Unsigned;
+ };
+}
+
+template <typename T, typename Tag = typename QtPrivate::TagInfo<T>::TagType>
+class QTaggedPointer
+{
+public:
+ using Type = T;
+ using TagType = Tag;
+
+ static constexpr quintptr tagMask() { return QtPrivate::TagInfo<T>::alignment - 1; }
+ static constexpr quintptr pointerMask() { return ~tagMask(); }
+
+ explicit QTaggedPointer(T *pointer = nullptr, Tag tag = Tag()) noexcept
+ : d(quintptr(pointer))
+ {
+ Q_STATIC_ASSERT(sizeof(Type*) == sizeof(QTaggedPointer<Type>));
+
+ Q_ASSERT_X((quintptr(pointer) & tagMask()) == 0,
+ "QTaggedPointer<T, Tag>", "Pointer is not aligned");
+
+ setTag(tag);
+ }
+
+ Type &operator*() const noexcept
+ {
+ Q_ASSERT(data());
+ return *data();
+ }
+
+ Type *operator->() const noexcept
+ {
+ return data();
+ }
+
+ explicit operator bool() const noexcept
+ {
+ return !isNull();
+ }
+
+ QTaggedPointer<T, Tag> &operator=(T *other) noexcept
+ {
+ d = reinterpret_cast<quintptr>(other) | (d & tagMask());
+ return *this;
+ }
+
+ QTaggedPointer<T, Tag> &operator=(std::nullptr_t) noexcept
+ {
+ d &= tagMask();
+ return *this;
+ }
+
+ static constexpr Tag maximumTag() noexcept
+ {
+ return TagType(typename QtPrivate::TagInfo<T>::TagType(tagMask()));
+ }
+
+ void setTag(Tag tag)
+ {
+ Q_ASSERT_X((static_cast<typename QtPrivate::TagInfo<T>::TagType>(tag) & pointerMask()) == 0,
+ "QTaggedPointer<T, Tag>::setTag", "Tag is larger than allowed by number of available tag bits");
+
+ d = (d & pointerMask()) | (static_cast<typename QtPrivate::TagInfo<T>::TagType>(tag) & tagMask());
+ }
+
+ Tag tag() const noexcept
+ {
+ return TagType(typename QtPrivate::TagInfo<T>::TagType(d & tagMask()));
+ }
+
+ T* data() const noexcept
+ {
+ return reinterpret_cast<T*>(d & pointerMask());
+ }
+
+ bool isNull() const noexcept
+ {
+ return !data();
+ }
+
+ void swap(QTaggedPointer<T, Tag> &other) noexcept
+ {
+ qSwap(d, other.d);
+ }
+
+ friend inline bool operator==(const QTaggedPointer<T, Tag> &lhs, const QTaggedPointer<T, Tag> &rhs) noexcept
+ {
+ return lhs.data() == rhs.data();
+ }
+
+ friend inline bool operator!=(const QTaggedPointer<T, Tag> &lhs, const QTaggedPointer<T, Tag> &rhs) noexcept
+ {
+ return lhs.data() != rhs.data();
+ }
+
+ friend inline bool operator==(const QTaggedPointer<T, Tag> &lhs, std::nullptr_t) noexcept
+ {
+ return lhs.isNull();
+ }
+
+ friend inline bool operator==(std::nullptr_t, const QTaggedPointer<T, Tag> &rhs) noexcept
+ {
+ return rhs.isNull();
+ }
+
+ friend inline bool operator!=(const QTaggedPointer<T, Tag> &lhs, std::nullptr_t) noexcept
+ {
+ return !lhs.isNull();
+ }
+
+ friend inline bool operator!=(std::nullptr_t, const QTaggedPointer<T, Tag> &rhs) noexcept
+ {
+ return !rhs.isNull();
+ }
+
+ friend inline bool operator!(const QTaggedPointer<T, Tag> &ptr) noexcept
+ {
+ return !ptr.data();
+ }
+
+protected:
+ quintptr d;
+};
+
+template <typename T>
+Q_DECLARE_TYPEINFO_BODY(QTaggedPointer<T>, Q_MOVABLE_TYPE);
+
+template <typename T, typename Tag>
+inline void swap(QTaggedPointer<T, Tag> &p1, QTaggedPointer<T, Tag> &p2) noexcept
+{
+ p1.swap(p2);
+}
+
+QT_END_NAMESPACE
+
+#endif // QTAGGEDPOINTER_H
diff --git a/src/corelib/tools/qtaggedpointer.qdoc b/src/corelib/tools/qtaggedpointer.qdoc
new file mode 100644
index 0000000000..5b335e8739
--- /dev/null
+++ b/src/corelib/tools/qtaggedpointer.qdoc
@@ -0,0 +1,206 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \class QTaggedPointer
+ \internal
+ \inmodule QtCore
+ \brief The QTaggedPointer class provides a low-level wrapper around raw
+ pointers that makes it possible to store additional information in otherwise unused bits.
+
+ \ingroup tools
+ \reentrant
+
+
+ Data structures in C++ tend to have a natural alignment in memory, based on
+ the alignment requirements of the members fields. For example a structure
+ containing an integer tends to be aligned to a 4-byte boundary in memory. That
+ means a pointer holding the address of an instance will always have the lower
+ two bits set to zero. QTaggedPointer makes it possible to store information
+ in these bits, such as a user provided enum. This is called a tag. The API allows
+ reading and writing the tag. When asked for the raw pointer, it will always return
+ a valid address with the bits used for the tag set to zero.
+
+ This pattern may be useful when creating low-level data structures that
+ need to be as dense as possible.
+
+ The first template parameter is the type the tagged pointer should point
+ to. The second template parameter is the type of the tag. If not specified it will
+ default to an unsigned integral. A more powerful pattern though is to define a
+ flag enum and use that as a tag type:
+
+ \code
+ struct LinkedListItem
+ {
+ enum MyFlag {
+ NoOption = 0x0,
+ SomeOption = 0x1,
+ ThirdWay = 0x2
+ };
+ Q_DECLARE_FLAGS(MyFlags, MyFlag)
+
+ QTaggedPointer<LinkedListItem, MyFlag> next;
+
+ ...
+ };
+
+ Q_DECLARE_OPERATORS_FOR_FLAGS(LinkedListItem::MyFlags)
+
+ LinkedListItem &listItem = ...
+ listItem.next = new LinkedListItem;
+ listItem.next.setTag(LinkedListItem::SomeOption | LinkedListItem::ThirdWay);
+ \endcode
+
+ \note QTaggedPointer does not provide ownership. You are responsible for deleting
+ the data the pointer points to.
+*/
+
+/*!
+ \typedef QTaggedPointer::Type
+
+ Typedef for T.
+*/
+
+/*!
+ \typedef QTaggedPointer::TagType
+
+ Typedef for Tag.
+*/
+
+
+/*!
+ \fn template <typename T, typename Tag> explicit QTaggedPointer<T, Tag>::QTaggedPointer(T *pointer = nullptr, Tag tag = Tag()) noexcept
+
+ Creates a tagged pointer that points to \a pointer and stores the specified \a tag.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> T &QTaggedPointer<T, Tag>::operator*() const noexcept
+
+ Provides access to the pointer's members.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> T *QTaggedPointer<T, Tag>::operator->() const noexcept
+
+ Provides access to the pointer's members.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> bool QTaggedPointer<T, Tag>::operator!() const noexcept
+
+ Returns \c true if the pointer is \nullptr.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> explicit QTaggedPointer<T, Tag>::operator bool() const noexcept
+
+ Returns \c true if the pointer is \e not null.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> QTaggedPointer<T, Tag> &QTaggedPointer<T, Tag>::operator=(T *other) noexcept
+
+ Sets the pointer of this to \a other. The tag remains unchanged.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> void QTaggedPointer<T, Tag>::setTag(Tag tag)
+
+ Sets the tag value to the specified \a tag. The pointer remains unchanged.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> Tag QTaggedPointer<T, Tag>::tag() const noexcept
+
+ Returns the tag stored in the tagged pointer.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> Tag QTaggedPointer<T, Tag>::pointer() const noexcept
+
+ Returns the pointer stored in the tagged pointer.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> bool QTaggedPointer<T, Tag>::isNull() const noexcept
+
+ Returns \c true if the pointer is \nullptr; otherwise returns \c false.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> void QTaggedPointer<T, Tag>::swap(QTaggedPointer<T, Tag> &other) noexcept
+
+ Swaps this instance's pointer and tag with the pointer and tag in \a other.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> inline bool operator==(const QTaggedPointer<T, Tag> &lhs, const QTaggedPointer<T, Tag> &rhs) noexcept
+ \relates QTaggedPointer
+
+ Returns \c true if \a lhs is equal to \a rhs; otherwise returns \c false.
+
+ Two tagged pointers are considered equal if they point to the same object. Their tags are not compared.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> inline bool operator!=(const QTaggedPointer<T, Tag> &lhs, const QTaggedPointer<T, Tag> &rhs) noexcept
+ \relates QTaggedPointer
+
+ Returns \c true if \a lhs is not equal to \a rhs; otherwise returns \c false.
+
+ Two tagged pointers are considered equal if they point to the same object. Their tags are not compared.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> inline bool operator==(const QTaggedPointer<T, Tag> &lhs, std::nullptr_t) noexcept
+ \relates QTaggedPointer
+
+ Returns \c true if \a lhs refers to \c nullptr.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> inline bool operator==(std::nullptr_t, const QTaggedPointer<T, Tag> &rhs) noexcept
+ \relates QTaggedPointer
+
+ Returns \c true if \a rhs refers to \c nullptr.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> inline bool operator!=(const QTaggedPointer<T, Tag> &lhs, std::nullptr_t) noexcept
+ \relates QTaggedPointer
+
+ Returns \c true if \a lhs refers to a valid (i.e. non-null) pointer.
+*/
+
+/*!
+ \fn template <typename T, typename Tag> inline bool operator!=(std::nullptr_t, const QTaggedPointer<T, Tag> &rhs) noexcept
+ \relates QTaggedPointer
+
+ Returns \c true if \a rhs refers to a valid (i.e. non-null) pointer.
+*/
+
diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h
index 6be695e317..cf5e2ee8c7 100644
--- a/src/corelib/tools/qvarlengtharray.h
+++ b/src/corelib/tools/qvarlengtharray.h
@@ -57,13 +57,13 @@ QT_BEGIN_NAMESPACE
// Prealloc = 256 by default, specified in qcontainerfwd.h
-template<class T, int Prealloc>
+template<class T, qsizetype Prealloc>
class QVarLengthArray
{
public:
QVarLengthArray() : QVarLengthArray(0) {}
- inline explicit QVarLengthArray(int size);
+ inline explicit QVarLengthArray(qsizetype size);
inline QVarLengthArray(const QVarLengthArray<T, Prealloc> &other)
: a(Prealloc), s(0), ptr(reinterpret_cast<T *>(array))
@@ -104,7 +104,7 @@ public:
QVarLengthArray<T, Prealloc> &operator=(std::initializer_list<T> list)
{
- resize(int(list.size())); // ### q6sizetype
+ resize(qsizetype(list.size()));
std::copy(list.begin(), list.end(),
QT_MAKE_CHECKED_ARRAY_ITERATOR(this->begin(), this->size()));
return *this;
@@ -116,50 +116,50 @@ public:
ptr[s - 1].~T();
--s;
}
- inline int size() const { return s; }
- inline int count() const { return s; }
- inline int length() const { return s; }
+ inline qsizetype size() const { return s; }
+ inline qsizetype count() const { return s; }
+ inline qsizetype length() const { return s; }
inline T& first() { Q_ASSERT(!isEmpty()); return *begin(); }
inline const T& first() const { Q_ASSERT(!isEmpty()); return *begin(); }
T& last() { Q_ASSERT(!isEmpty()); return *(end() - 1); }
const T& last() const { Q_ASSERT(!isEmpty()); return *(end() - 1); }
inline bool isEmpty() const { return (s == 0); }
- inline void resize(int size);
+ inline void resize(qsizetype size);
inline void clear() { resize(0); }
inline void squeeze();
- inline int capacity() const { return a; }
- inline void reserve(int size);
+ inline qsizetype capacity() const { return a; }
+ inline void reserve(qsizetype size);
- inline int indexOf(const T &t, int from = 0) const;
- inline int lastIndexOf(const T &t, int from = -1) const;
+ inline qsizetype indexOf(const T &t, qsizetype from = 0) const;
+ inline qsizetype lastIndexOf(const T &t, qsizetype from = -1) const;
inline bool contains(const T &t) const;
- inline T &operator[](int idx) {
+ inline T &operator[](qsizetype idx) {
Q_ASSERT(idx >= 0 && idx < s);
return ptr[idx];
}
- inline const T &operator[](int idx) const {
+ inline const T &operator[](qsizetype idx) const {
Q_ASSERT(idx >= 0 && idx < s);
return ptr[idx];
}
- inline const T &at(int idx) const { return operator[](idx); }
+ inline const T &at(qsizetype idx) const { return operator[](idx); }
- T value(int i) const;
- T value(int i, const T &defaultValue) const;
+ T value(qsizetype i) const;
+ T value(qsizetype i, const T &defaultValue) const;
inline void append(const T &t) {
if (s == a) { // i.e. s != 0
T copy(t);
realloc(s, s<<1);
- const int idx = s++;
+ const qsizetype idx = s++;
if (QTypeInfo<T>::isComplex) {
new (ptr + idx) T(std::move(copy));
} else {
ptr[idx] = std::move(copy);
}
} else {
- const int idx = s++;
+ const qsizetype idx = s++;
if (QTypeInfo<T>::isComplex) {
new (ptr + idx) T(t);
} else {
@@ -171,14 +171,14 @@ public:
void append(T &&t) {
if (s == a)
realloc(s, s << 1);
- const int idx = s++;
+ const qsizetype idx = s++;
if (QTypeInfo<T>::isComplex)
new (ptr + idx) T(std::move(t));
else
ptr[idx] = std::move(t);
}
- void append(const T *buf, int size);
+ void append(const T *buf, qsizetype size);
inline QVarLengthArray<T, Prealloc> &operator<<(const T &t)
{ append(t); return *this; }
inline QVarLengthArray<T, Prealloc> &operator<<(T &&t)
@@ -190,18 +190,18 @@ public:
void prepend(T &&t);
void prepend(const T &t);
- void insert(int i, T &&t);
- void insert(int i, const T &t);
- void insert(int i, int n, const T &t);
- void replace(int i, const T &t);
- void remove(int i);
- void remove(int i, int n);
+ void insert(qsizetype i, T &&t);
+ void insert(qsizetype i, const T &t);
+ void insert(qsizetype i, qsizetype n, const T &t);
+ void replace(qsizetype i, const T &t);
+ void remove(qsizetype i);
+ void remove(qsizetype i, qsizetype n);
inline T *data() { return ptr; }
inline const T *data() const { return ptr; }
inline const T * constData() const { return ptr; }
- typedef int size_type;
+ typedef qsizetype size_type;
typedef T value_type;
typedef value_type *pointer;
typedef const value_type *const_pointer;
@@ -229,7 +229,7 @@ public:
const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); }
const_reverse_iterator crend() const { return const_reverse_iterator(begin()); }
- iterator insert(const_iterator before, int n, const T &x);
+ iterator insert(const_iterator before, qsizetype n, const T &x);
iterator insert(const_iterator before, T &&x);
inline iterator insert(const_iterator before, const T &x) { return insert(before, 1, x); }
iterator erase(const_iterator begin, const_iterator end);
@@ -247,10 +247,10 @@ public:
void shrink_to_fit() { squeeze(); }
private:
- void realloc(int size, int alloc);
+ void realloc(qsizetype size, qsizetype alloc);
- int a; // capacity
- int s; // size
+ qsizetype a; // capacity
+ qsizetype s; // size
T *ptr; // data
union {
char array[Prealloc * sizeof(T)];
@@ -272,8 +272,8 @@ template <typename InputIterator,
QVarLengthArray(InputIterator, InputIterator) -> QVarLengthArray<ValueType>;
#endif
-template <class T, int Prealloc>
-Q_INLINE_TEMPLATE QVarLengthArray<T, Prealloc>::QVarLengthArray(int asize)
+template <class T, qsizetype Prealloc>
+Q_INLINE_TEMPLATE QVarLengthArray<T, Prealloc>::QVarLengthArray(qsizetype asize)
: s(asize) {
Q_STATIC_ASSERT_X(Prealloc > 0, "QVarLengthArray Prealloc must be greater than 0.");
Q_ASSERT_X(s >= 0, "QVarLengthArray::QVarLengthArray()", "Size must be greater than or equal to 0.");
@@ -292,19 +292,19 @@ Q_INLINE_TEMPLATE QVarLengthArray<T, Prealloc>::QVarLengthArray(int asize)
}
}
-template <class T, int Prealloc>
-Q_INLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::resize(int asize)
+template <class T, qsizetype Prealloc>
+Q_INLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::resize(qsizetype asize)
{ realloc(asize, qMax(asize, a)); }
-template <class T, int Prealloc>
-Q_INLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::reserve(int asize)
+template <class T, qsizetype Prealloc>
+Q_INLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::reserve(qsizetype asize)
{ if (asize > a) realloc(s, asize); }
-template <class T, int Prealloc>
-Q_INLINE_TEMPLATE int QVarLengthArray<T, Prealloc>::indexOf(const T &t, int from) const
+template <class T, qsizetype Prealloc>
+Q_INLINE_TEMPLATE qsizetype QVarLengthArray<T, Prealloc>::indexOf(const T &t, qsizetype from) const
{
if (from < 0)
- from = qMax(from + s, 0);
+ from = qMax(from + s, qsizetype(0));
if (from < s) {
T *n = ptr + from - 1;
T *e = ptr + s;
@@ -315,8 +315,8 @@ Q_INLINE_TEMPLATE int QVarLengthArray<T, Prealloc>::indexOf(const T &t, int from
return -1;
}
-template <class T, int Prealloc>
-Q_INLINE_TEMPLATE int QVarLengthArray<T, Prealloc>::lastIndexOf(const T &t, int from) const
+template <class T, qsizetype Prealloc>
+Q_INLINE_TEMPLATE qsizetype QVarLengthArray<T, Prealloc>::lastIndexOf(const T &t, qsizetype from) const
{
if (from < 0)
from += s;
@@ -333,7 +333,7 @@ Q_INLINE_TEMPLATE int QVarLengthArray<T, Prealloc>::lastIndexOf(const T &t, int
return -1;
}
-template <class T, int Prealloc>
+template <class T, qsizetype Prealloc>
Q_INLINE_TEMPLATE bool QVarLengthArray<T, Prealloc>::contains(const T &t) const
{
T *b = ptr;
@@ -345,14 +345,14 @@ Q_INLINE_TEMPLATE bool QVarLengthArray<T, Prealloc>::contains(const T &t) const
return false;
}
-template <class T, int Prealloc>
-Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::append(const T *abuf, int increment)
+template <class T, qsizetype Prealloc>
+Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::append(const T *abuf, qsizetype increment)
{
Q_ASSERT(abuf);
if (increment <= 0)
return;
- const int asize = s + increment;
+ const qsizetype asize = s + increment;
if (asize >= a)
realloc(s, qMax(s*2, asize));
@@ -367,18 +367,18 @@ Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::append(const T *abuf, in
}
}
-template <class T, int Prealloc>
+template <class T, qsizetype Prealloc>
Q_INLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::squeeze()
{ realloc(s, s); }
-template <class T, int Prealloc>
-Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::realloc(int asize, int aalloc)
+template <class T, qsizetype Prealloc>
+Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::realloc(qsizetype asize, qsizetype aalloc)
{
Q_ASSERT(aalloc >= asize);
T *oldPtr = ptr;
- int osize = s;
+ qsizetype osize = s;
- const int copySize = qMin(asize, osize);
+ const qsizetype copySize = qMin(asize, osize);
Q_ASSUME(copySize >= 0);
if (aalloc != a) {
if (aalloc > Prealloc) {
@@ -402,7 +402,7 @@ Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::realloc(int asize, int a
}
} QT_CATCH(...) {
// clean up all the old objects and then free the old ptr
- int sClean = s;
+ qsizetype sClean = s;
while (sClean < osize)
(oldPtr+(sClean++))->~T();
if (oldPtr != reinterpret_cast<T *>(array) && oldPtr != ptr)
@@ -433,61 +433,60 @@ Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::realloc(int asize, int a
}
}
-template <class T, int Prealloc>
-Q_OUTOFLINE_TEMPLATE T QVarLengthArray<T, Prealloc>::value(int i) const
+template <class T, qsizetype Prealloc>
+Q_OUTOFLINE_TEMPLATE T QVarLengthArray<T, Prealloc>::value(qsizetype i) const
{
- if (uint(i) >= uint(size())) {
+ if (size_t(i) >= size_t(size()))
return T();
- }
return at(i);
}
-template <class T, int Prealloc>
-Q_OUTOFLINE_TEMPLATE T QVarLengthArray<T, Prealloc>::value(int i, const T &defaultValue) const
+template <class T, qsizetype Prealloc>
+Q_OUTOFLINE_TEMPLATE T QVarLengthArray<T, Prealloc>::value(qsizetype i, const T &defaultValue) const
{
- return (uint(i) >= uint(size())) ? defaultValue : at(i);
+ return (size_t(i) >= size_t(size())) ? defaultValue : at(i);
}
-template <class T, int Prealloc>
-inline void QVarLengthArray<T, Prealloc>::insert(int i, T &&t)
+template <class T, qsizetype Prealloc>
+inline void QVarLengthArray<T, Prealloc>::insert(qsizetype i, T &&t)
{ Q_ASSERT_X(i >= 0 && i <= s, "QVarLengthArray::insert", "index out of range");
insert(cbegin() + i, std::move(t)); }
-template <class T, int Prealloc>
-inline void QVarLengthArray<T, Prealloc>::insert(int i, const T &t)
+template <class T, qsizetype Prealloc>
+inline void QVarLengthArray<T, Prealloc>::insert(qsizetype i, const T &t)
{ Q_ASSERT_X(i >= 0 && i <= s, "QVarLengthArray::insert", "index out of range");
insert(begin() + i, 1, t); }
-template <class T, int Prealloc>
-inline void QVarLengthArray<T, Prealloc>::insert(int i, int n, const T &t)
+template <class T, qsizetype Prealloc>
+inline void QVarLengthArray<T, Prealloc>::insert(qsizetype i, qsizetype n, const T &t)
{ Q_ASSERT_X(i >= 0 && i <= s, "QVarLengthArray::insert", "index out of range");
insert(begin() + i, n, t); }
-template <class T, int Prealloc>
-inline void QVarLengthArray<T, Prealloc>::remove(int i, int n)
+template <class T, qsizetype Prealloc>
+inline void QVarLengthArray<T, Prealloc>::remove(qsizetype i, qsizetype n)
{ Q_ASSERT_X(i >= 0 && n >= 0 && i + n <= s, "QVarLengthArray::remove", "index out of range");
erase(begin() + i, begin() + i + n); }
-template <class T, int Prealloc>
-inline void QVarLengthArray<T, Prealloc>::remove(int i)
+template <class T, qsizetype Prealloc>
+inline void QVarLengthArray<T, Prealloc>::remove(qsizetype i)
{ Q_ASSERT_X(i >= 0 && i < s, "QVarLengthArray::remove", "index out of range");
erase(begin() + i, begin() + i + 1); }
-template <class T, int Prealloc>
+template <class T, qsizetype Prealloc>
inline void QVarLengthArray<T, Prealloc>::prepend(T &&t)
{ insert(cbegin(), std::move(t)); }
-template <class T, int Prealloc>
+template <class T, qsizetype Prealloc>
inline void QVarLengthArray<T, Prealloc>::prepend(const T &t)
{ insert(begin(), 1, t); }
-template <class T, int Prealloc>
-inline void QVarLengthArray<T, Prealloc>::replace(int i, const T &t)
+template <class T, qsizetype Prealloc>
+inline void QVarLengthArray<T, Prealloc>::replace(qsizetype i, const T &t)
{
Q_ASSERT_X(i >= 0 && i < s, "QVarLengthArray::replace", "index out of range");
const T copy(t);
data()[i] = copy;
}
-template <class T, int Prealloc>
+template <class T, qsizetype Prealloc>
Q_OUTOFLINE_TEMPLATE typename QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::insert(const_iterator before, T &&t)
{
Q_ASSERT_X(isValidIterator(before), "QVarLengthArray::insert", "The specified const_iterator argument 'before' is invalid");
- int offset = int(before - ptr);
+ qsizetype offset = qsizetype(before - ptr);
reserve(s + 1);
if (!QTypeInfo<T>::isRelocatable) {
T *b = ptr + offset;
@@ -511,12 +510,12 @@ Q_OUTOFLINE_TEMPLATE typename QVarLengthArray<T, Prealloc>::iterator QVarLengthA
return ptr + offset;
}
-template <class T, int Prealloc>
+template <class T, qsizetype Prealloc>
Q_OUTOFLINE_TEMPLATE typename QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::insert(const_iterator before, size_type n, const T &t)
{
Q_ASSERT_X(isValidIterator(before), "QVarLengthArray::insert", "The specified const_iterator argument 'before' is invalid");
- int offset = int(before - ptr);
+ qsizetype offset = qsizetype(before - ptr);
if (n != 0) {
resize(s + n);
const T copy(t);
@@ -540,15 +539,15 @@ Q_OUTOFLINE_TEMPLATE typename QVarLengthArray<T, Prealloc>::iterator QVarLengthA
return ptr + offset;
}
-template <class T, int Prealloc>
+template <class T, qsizetype Prealloc>
Q_OUTOFLINE_TEMPLATE typename QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::erase(const_iterator abegin, const_iterator aend)
{
Q_ASSERT_X(isValidIterator(abegin), "QVarLengthArray::insert", "The specified const_iterator argument 'abegin' is invalid");
Q_ASSERT_X(isValidIterator(aend), "QVarLengthArray::insert", "The specified const_iterator argument 'aend' is invalid");
- int f = int(abegin - ptr);
- int l = int(aend - ptr);
- int n = l - f;
+ qsizetype f = qsizetype(abegin - ptr);
+ qsizetype l = qsizetype(aend - ptr);
+ qsizetype n = l - f;
if (QTypeInfo<T>::isComplex) {
std::copy(ptr + l, ptr + s, QT_MAKE_CHECKED_ARRAY_ITERATOR(ptr + f, s - f));
T *i = ptr + s;
@@ -564,7 +563,7 @@ Q_OUTOFLINE_TEMPLATE typename QVarLengthArray<T, Prealloc>::iterator QVarLengthA
return ptr + f;
}
-template <typename T, int Prealloc1, int Prealloc2>
+template <typename T, qsizetype Prealloc1, qsizetype Prealloc2>
bool operator==(const QVarLengthArray<T, Prealloc1> &l, const QVarLengthArray<T, Prealloc2> &r)
{
if (l.size() != r.size())
@@ -575,13 +574,13 @@ bool operator==(const QVarLengthArray<T, Prealloc1> &l, const QVarLengthArray<T,
return std::equal(b, e, QT_MAKE_CHECKED_ARRAY_ITERATOR(rb, r.size()));
}
-template <typename T, int Prealloc1, int Prealloc2>
+template <typename T, qsizetype Prealloc1, qsizetype Prealloc2>
bool operator!=(const QVarLengthArray<T, Prealloc1> &l, const QVarLengthArray<T, Prealloc2> &r)
{
return !(l == r);
}
-template <typename T, int Prealloc1, int Prealloc2>
+template <typename T, qsizetype Prealloc1, qsizetype Prealloc2>
bool operator<(const QVarLengthArray<T, Prealloc1> &lhs, const QVarLengthArray<T, Prealloc2> &rhs)
noexcept(noexcept(std::lexicographical_compare(lhs.begin(), lhs.end(),
rhs.begin(), rhs.end())))
@@ -590,29 +589,29 @@ bool operator<(const QVarLengthArray<T, Prealloc1> &lhs, const QVarLengthArray<T
rhs.begin(), rhs.end());
}
-template <typename T, int Prealloc1, int Prealloc2>
+template <typename T, qsizetype Prealloc1, qsizetype Prealloc2>
inline bool operator>(const QVarLengthArray<T, Prealloc1> &lhs, const QVarLengthArray<T, Prealloc2> &rhs)
noexcept(noexcept(lhs < rhs))
{
return rhs < lhs;
}
-template <typename T, int Prealloc1, int Prealloc2>
+template <typename T, qsizetype Prealloc1, qsizetype Prealloc2>
inline bool operator<=(const QVarLengthArray<T, Prealloc1> &lhs, const QVarLengthArray<T, Prealloc2> &rhs)
noexcept(noexcept(lhs < rhs))
{
return !(lhs > rhs);
}
-template <typename T, int Prealloc1, int Prealloc2>
+template <typename T, qsizetype Prealloc1, qsizetype Prealloc2>
inline bool operator>=(const QVarLengthArray<T, Prealloc1> &lhs, const QVarLengthArray<T, Prealloc2> &rhs)
noexcept(noexcept(lhs < rhs))
{
return !(lhs < rhs);
}
-template <typename T, int Prealloc>
-uint qHash(const QVarLengthArray<T, Prealloc> &key, uint seed = 0)
+template <typename T, qsizetype Prealloc>
+size_t qHash(const QVarLengthArray<T, Prealloc> &key, size_t seed = 0)
noexcept(noexcept(qHashRange(key.cbegin(), key.cend(), seed)))
{
return qHashRange(key.cbegin(), key.cend(), seed);
diff --git a/src/corelib/tools/qvarlengtharray.qdoc b/src/corelib/tools/qvarlengtharray.qdoc
index 3dab41dd22..e43d6f152a 100644
--- a/src/corelib/tools/qvarlengtharray.qdoc
+++ b/src/corelib/tools/qvarlengtharray.qdoc
@@ -87,10 +87,10 @@
places inside Qt and was added to Qt's public API for the
convenience of advanced users.
- \sa QVector, QList, QLinkedList
+ \sa QVector, QList
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::QVarLengthArray(int size)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::QVarLengthArray(qsizetype size)
Constructs an array with an initial size of \a size elements.
@@ -101,7 +101,7 @@
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::QVarLengthArray(std::initializer_list<T> args)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::QVarLengthArray(std::initializer_list<T> args)
\since 5.5
Constructs an array from the std::initializer_list given by \a args.
@@ -110,7 +110,7 @@
lists.
*/
-/*! \fn template<class T, int Prealloc> template<typename InputIterator> QVarLengthArray<T, Prealloc>::QVarLengthArray(InputIterator first, InputIterator last)
+/*! \fn template<class T, qsizetype Prealloc> template<typename InputIterator> QVarLengthArray<T, Prealloc>::QVarLengthArray(InputIterator first, InputIterator last)
\since 5.14
Constructs an array with the contents in the iterator range [\a first, \a last).
@@ -119,26 +119,26 @@
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::~QVarLengthArray()
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::~QVarLengthArray()
Destroys the array.
*/
-/*! \fn template<class T, int Prealloc> int QVarLengthArray<T, Prealloc>::size() const
+/*! \fn template<class T, qsizetype Prealloc> qsizetype QVarLengthArray<T, Prealloc>::size() const
Returns the number of elements in the array.
\sa isEmpty(), resize()
*/
-/*! \fn template<class T, int Prealloc> int QVarLengthArray<T, Prealloc>::count() const
+/*! \fn template<class T, qsizetype Prealloc> qsizetype QVarLengthArray<T, Prealloc>::count() const
Same as size().
\sa isEmpty(), resize()
*/
-/*! \fn template<class T, int Prealloc> int QVarLengthArray<T, Prealloc>::length() const
+/*! \fn template<class T, qsizetype Prealloc> qsizetype QVarLengthArray<T, Prealloc>::length() const
\since 5.0
Same as size().
@@ -146,7 +146,7 @@
\sa isEmpty(), resize()
*/
-/*! \fn template<class T, int Prealloc> T& QVarLengthArray<T, Prealloc>::first()
+/*! \fn template<class T, qsizetype Prealloc> T& QVarLengthArray<T, Prealloc>::first()
Returns a reference to the first item in the array. The array must
not be empty. If the array can be empty, check isEmpty() before
@@ -155,24 +155,24 @@
\sa last(), isEmpty()
*/
-/*! \fn template<class T, int Prealloc> const T& QVarLengthArray<T, Prealloc>::first() const
+/*! \fn template<class T, qsizetype Prealloc> const T& QVarLengthArray<T, Prealloc>::first() const
\overload
*/
-/*! \fn template<class T, int Prealloc> T& QVarLengthArray<T, Prealloc>::front()
+/*! \fn template<class T, qsizetype Prealloc> T& QVarLengthArray<T, Prealloc>::front()
\since 5.0
Same as first(). Provided for STL-compatibility.
*/
-/*! \fn template<class T, int Prealloc> const T& QVarLengthArray<T, Prealloc>::front() const
+/*! \fn template<class T, qsizetype Prealloc> const T& QVarLengthArray<T, Prealloc>::front() const
\since 5.0
\overload
*/
-/*! \fn template<class T, int Prealloc> T& QVarLengthArray<T, Prealloc>::last()
+/*! \fn template<class T, qsizetype Prealloc> T& QVarLengthArray<T, Prealloc>::last()
Returns a reference to the last item in the array. The array must
not be empty. If the array can be empty, check isEmpty() before
@@ -181,37 +181,37 @@
\sa first(), isEmpty()
*/
-/*! \fn template<class T, int Prealloc> const T& QVarLengthArray<T, Prealloc>::last() const
+/*! \fn template<class T, qsizetype Prealloc> const T& QVarLengthArray<T, Prealloc>::last() const
\overload
*/
-/*! \fn template<class T, int Prealloc> T& QVarLengthArray<T, Prealloc>::back()
+/*! \fn template<class T, qsizetype Prealloc> T& QVarLengthArray<T, Prealloc>::back()
\since 5.0
Same as last(). Provided for STL-compatibility.
*/
-/*! \fn template<class T, int Prealloc> const T& QVarLengthArray<T, Prealloc>::back() const
+/*! \fn template<class T, qsizetype Prealloc> const T& QVarLengthArray<T, Prealloc>::back() const
\since 5.0
\overload
*/
-/*! \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::shrink_to_fit()
+/*! \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::shrink_to_fit()
\since 5.10
Same as squeeze(). Provided for STL-compatibility.
*/
-/*! \fn template<class T, int Prealloc> bool QVarLengthArray<T, Prealloc>::isEmpty() const
+/*! \fn template<class T, qsizetype Prealloc> bool QVarLengthArray<T, Prealloc>::isEmpty() const
Returns \c true if the array has size 0; otherwise returns \c false.
\sa size(), resize()
*/
-/*! \fn template<class T, int Prealloc> bool QVarLengthArray<T, Prealloc>::empty() const
+/*! \fn template<class T, qsizetype Prealloc> bool QVarLengthArray<T, Prealloc>::empty() const
\since 5.0
Returns \c true if the array has size 0; otherwise returns \c false.
@@ -219,14 +219,14 @@
Same as isEmpty(). Provided for STL-compatibility.
*/
-/*! \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::clear()
+/*! \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::clear()
Removes all the elements from the array.
Same as resize(0).
*/
-/*! \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::resize(int size)
+/*! \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::resize(qsizetype size)
Sets the size of the array to \a size. If \a size is greater than
the current size, elements are added to the end. If \a size is
@@ -240,7 +240,7 @@
\sa size(), squeeze()
*/
-/*! \fn template<class T, int Prealloc> int QVarLengthArray<T, Prealloc>::capacity() const
+/*! \fn template<class T, qsizetype Prealloc> qsizetype QVarLengthArray<T, Prealloc>::capacity() const
Returns the maximum number of elements that can be stored in the
array without forcing a reallocation.
@@ -253,7 +253,7 @@
\sa reserve(), squeeze()
*/
-/*! \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::reserve(int size)
+/*! \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::reserve(qsizetype size)
Attempts to allocate memory for at least \a size elements. If you
know in advance how large the array can get, you can call this
@@ -270,7 +270,7 @@
\sa capacity(), squeeze()
*/
-/*! \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::squeeze()
+/*! \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::squeeze()
\since 5.1
Releases any memory not required to store the items.
@@ -284,7 +284,7 @@
\sa reserve(), capacity(), resize()
*/
-/*! \fn template<class T, int Prealloc> T &QVarLengthArray<T, Prealloc>::operator[](int i)
+/*! \fn template<class T, qsizetype Prealloc> T &QVarLengthArray<T, Prealloc>::operator[](qsizetype i)
Returns a reference to the item at index position \a i.
@@ -294,14 +294,14 @@
\sa data(), at()
*/
-/*! \fn template<class T, int Prealloc> const T &QVarLengthArray<T, Prealloc>::operator[](int i) const
+/*! \fn template<class T, qsizetype Prealloc> const T &QVarLengthArray<T, Prealloc>::operator[](qsizetype i) const
\overload
*/
/*!
- \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::append(const T &t)
+ \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::append(const T &t)
Appends item \a t to the array, extending the array if necessary.
@@ -309,7 +309,7 @@
*/
/*!
- \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::push_back(const T &t)
+ \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::push_back(const T &t)
\since 5.0
Appends item \a t to the array, extending the array if necessary.
@@ -317,7 +317,7 @@
*/
/*!
- \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::append(T &&t)
+ \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::append(T &&t)
\overload append
\since 5.9
@@ -331,7 +331,7 @@
*/
/*!
- \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::push_back(T &&t)
+ \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::push_back(T &&t)
\overload push_back
\since 5.9
@@ -345,7 +345,7 @@
*/
/*!
- \fn template<class T, int Prealloc> inline void QVarLengthArray<T, Prealloc>::removeLast()
+ \fn template<class T, qsizetype Prealloc> inline void QVarLengthArray<T, Prealloc>::removeLast()
\since 4.5
Decreases the size of the array by one. The allocated size is not changed.
@@ -354,20 +354,20 @@
*/
/*!
- \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::pop_back()
+ \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::pop_back()
\since 5.0
Same as removeLast(). Provided for STL-compatibility.
*/
/*!
- \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::append(const T *buf, int size)
+ \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::append(const T *buf, qsizetype size)
Appends \a size amount of items referenced by \a buf to this array.
*/
-/*! \fn template<class T, int Prealloc> T *QVarLengthArray<T, Prealloc>::data()
+/*! \fn template<class T, qsizetype Prealloc> T *QVarLengthArray<T, Prealloc>::data()
Returns a pointer to the data stored in the array. The pointer can
be used to access and modify the items in the array.
@@ -383,12 +383,12 @@
\sa constData(), operator[]()
*/
-/*! \fn template<class T, int Prealloc> const T *QVarLengthArray<T, Prealloc>::data() const
+/*! \fn template<class T, qsizetype Prealloc> const T *QVarLengthArray<T, Prealloc>::data() const
\overload
*/
-/*! \fn template<class T, int Prealloc> const T *QVarLengthArray<T, Prealloc>::constData() const
+/*! \fn template<class T, qsizetype Prealloc> const T *QVarLengthArray<T, Prealloc>::constData() const
Returns a const pointer to the data stored in the array. The
pointer can be used to access the items in the array. The
@@ -400,11 +400,11 @@
\sa data(), operator[]()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator=(const QVarLengthArray<T, Prealloc> &other)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator=(const QVarLengthArray<T, Prealloc> &other)
Assigns \a other to this array and returns a reference to this array.
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator=(std::initializer_list<T> list)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator=(std::initializer_list<T> list)
\since 5.5
Assigns the values of \a list to this array, and returns a reference to this array.
@@ -413,11 +413,11 @@
lists.
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::QVarLengthArray(const QVarLengthArray<T, Prealloc> &other)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::QVarLengthArray(const QVarLengthArray<T, Prealloc> &other)
Constructs a copy of \a other.
*/
-/*! \fn template<class T, int Prealloc> const T &QVarLengthArray<T, Prealloc>::at(int i) const
+/*! \fn template<class T, qsizetype Prealloc> const T &QVarLengthArray<T, Prealloc>::at(qsizetype i) const
Returns a reference to the item at index position \a i.
@@ -427,7 +427,7 @@
\sa value(), operator[]()
*/
-/*! \fn template<class T, int Prealloc> T QVarLengthArray<T, Prealloc>::value(int i) const
+/*! \fn template<class T, qsizetype Prealloc> T QVarLengthArray<T, Prealloc>::value(qsizetype i) const
Returns the value at index position \a i.
@@ -439,7 +439,7 @@
\sa at(), operator[]()
*/
-/*! \fn template<class T, int Prealloc> T QVarLengthArray<T, Prealloc>::value(int i, const T &defaultValue) const
+/*! \fn template<class T, qsizetype Prealloc> T QVarLengthArray<T, Prealloc>::value(qsizetype i, const T &defaultValue) const
\overload
@@ -525,8 +525,8 @@
*/
/*!
- \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::prepend(const T &value)
- \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::prepend(T &&value)
+ \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::prepend(const T &value)
+ \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::prepend(T &&value)
\since 4.8
Inserts \a value at the beginning of the array.
@@ -537,13 +537,12 @@
For large arrays, this operation can be slow (\l{linear time}),
because it requires moving all the items in the vector by one
position further in memory. If you want a container class that
- provides a fast prepend() function, use QList or QLinkedList
- instead.
+ provides a fast prepend() function, use std::list instead.
\sa append(), insert()
*/
-/*! \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::replace(int i, const T &value)
+/*! \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::replace(qsizetype i, const T &value)
\since 4.8
Replaces the item at index position \a i with \a value.
@@ -554,7 +553,7 @@
\sa operator[](), remove()
*/
-/*! \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::remove(int i)
+/*! \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::remove(qsizetype i)
\overload
\since 4.8
@@ -564,7 +563,7 @@
\sa insert(), replace()
*/
-/*! \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::remove(int i, int count)
+/*! \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::remove(qsizetype i, qsizetype count)
\overload
\since 4.8
@@ -575,7 +574,7 @@
\sa insert(), replace()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::begin()
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::begin()
\since 4.8
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in
@@ -584,12 +583,12 @@
\sa constBegin(), end()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::begin() const
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::begin() const
\since 4.8
\overload
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::cbegin() const
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::cbegin() const
\since 5.0
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
@@ -598,7 +597,7 @@
\sa begin(), cend()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::constBegin() const
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::constBegin() const
\since 4.8
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
@@ -607,7 +606,7 @@
\sa begin(), constEnd()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::end()
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::end()
\since 4.8
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item
@@ -616,13 +615,13 @@
\sa begin(), constEnd()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::end() const
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::end() const
\since 4.8
\overload
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::cend() const
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::cend() const
\since 5.0
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
@@ -631,7 +630,7 @@
\sa cbegin(), end()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::constEnd() const
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::const_iterator QVarLengthArray<T, Prealloc>::constEnd() const
\since 4.8
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
@@ -640,7 +639,7 @@
\sa constBegin(), end()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::reverse_iterator QVarLengthArray<T, Prealloc>::rbegin()
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::reverse_iterator QVarLengthArray<T, Prealloc>::rbegin()
\since 5.6
Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
@@ -649,12 +648,12 @@
\sa begin(), crbegin(), rend()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::const_reverse_iterator QVarLengthArray<T, Prealloc>::rbegin() const
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::const_reverse_iterator QVarLengthArray<T, Prealloc>::rbegin() const
\since 5.6
\overload
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::const_reverse_iterator QVarLengthArray<T, Prealloc>::crbegin() const
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::const_reverse_iterator QVarLengthArray<T, Prealloc>::crbegin() const
\since 5.6
Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
@@ -663,7 +662,7 @@
\sa begin(), rbegin(), rend()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::reverse_iterator QVarLengthArray<T, Prealloc>::rend()
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::reverse_iterator QVarLengthArray<T, Prealloc>::rend()
\since 5.6
Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
@@ -672,12 +671,12 @@
\sa end(), crend(), rbegin()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::const_reverse_iterator QVarLengthArray<T, Prealloc>::rend() const
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::const_reverse_iterator QVarLengthArray<T, Prealloc>::rend() const
\since 5.6
\overload
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::const_reverse_iterator QVarLengthArray<T, Prealloc>::crend() const
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::const_reverse_iterator QVarLengthArray<T, Prealloc>::crend() const
\since 5.6
Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to one
@@ -686,7 +685,7 @@
\sa end(), rend(), rbegin()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::erase(const_iterator pos)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::erase(const_iterator pos)
\since 4.8
Removes the item pointed to by the iterator \a pos from the
@@ -696,7 +695,7 @@
\sa insert(), remove()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::erase(const_iterator begin, const_iterator end)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::erase(const_iterator begin, const_iterator end)
\overload
\since 4.8
@@ -707,8 +706,8 @@
*/
/*!
- \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::insert(int i, const T &value)
- \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::insert(int i, T &&value)
+ \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::insert(qsizetype i, const T &value)
+ \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::insert(qsizetype i, T &&value)
\since 4.8
Inserts \a value at index position \a i in the array. If \a i is
@@ -718,13 +717,13 @@
For large arrays, this operation can be slow (\l{linear time}),
because it requires moving all the items at indexes \a i and
above by one position further in memory. If you want a container
- class that provides a fast insert() function, use QLinkedList
+ class that provides a fast insert() function, use std::list
instead.
\sa remove()
*/
-/*! \fn template<class T, int Prealloc> void QVarLengthArray<T, Prealloc>::insert(int i, int count, const T &value)
+/*! \fn template<class T, qsizetype Prealloc> void QVarLengthArray<T, Prealloc>::insert(qsizetype i, qsizetype count, const T &value)
\overload
\since 4.8
@@ -733,8 +732,8 @@
vector.
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::insert(const_iterator before, const T &value)
- \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::insert(const_iterator before, T &&value)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::insert(const_iterator before, const T &value)
+ \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::insert(const_iterator before, T &&value)
\overload
\since 4.8
@@ -743,7 +742,7 @@
\a before. Returns an iterator pointing at the inserted item.
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::insert(const_iterator before, int count, const T &value)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc>::iterator QVarLengthArray<T, Prealloc>::insert(const_iterator before, qsizetype count, const T &value)
\since 4.8
Inserts \a count copies of \a value in front of the item pointed to
@@ -753,7 +752,7 @@
-/*! \fn template<class T, int Prealloc1, int Prealloc2> bool operator==(const QVarLengthArray<T, Prealloc1> &left, const QVarLengthArray<T, Prealloc2> &right)
+/*! \fn template<class T, qsizetype Prealloc1, qsizetype Prealloc2> bool operator==(const QVarLengthArray<T, Prealloc1> &left, const QVarLengthArray<T, Prealloc2> &right)
\relates QVarLengthArray
\since 4.8
@@ -768,7 +767,7 @@
\sa operator!=()
*/
-/*! \fn template<typename T, int Prealloc1, int Prealloc2> bool operator!=(const QVarLengthArray<T, Prealloc1> &left, const QVarLengthArray<T, Prealloc2> &right)
+/*! \fn template<typename T, qsizetype Prealloc1, qsizetype Prealloc2> bool operator!=(const QVarLengthArray<T, Prealloc1> &left, const QVarLengthArray<T, Prealloc2> &right)
\relates QVarLengthArray
\since 4.8
@@ -783,7 +782,7 @@
\sa operator==()
*/
-/*! \fn template<typename T, int Prealloc1, int Prealloc2> bool operator<(const QVarLengthArray<T,Prealloc1> &lhs, const QVarLengthArray<T,Prealloc2> &rhs)
+/*! \fn template<typename T, qsizetype Prealloc1, qsizetype Prealloc2> bool operator<(const QVarLengthArray<T,Prealloc1> &lhs, const QVarLengthArray<T,Prealloc2> &rhs)
\since 5.6
\relates QVarLengthArray
@@ -795,7 +794,7 @@
of \c operator<().
*/
-/*! \fn template<typename T, int Prealloc1, int Prealloc2> bool operator<=(const QVarLengthArray<T,Prealloc1> &lhs, const QVarLengthArray<T,Prealloc2> &rhs)
+/*! \fn template<typename T, qsizetype Prealloc1, qsizetype Prealloc2> bool operator<=(const QVarLengthArray<T,Prealloc1> &lhs, const QVarLengthArray<T,Prealloc2> &rhs)
\since 5.6
\relates QVarLengthArray
@@ -807,7 +806,7 @@
of \c operator<().
*/
-/*! \fn template<typename T, int Prealloc1, int Prealloc2> bool operator>(const QVarLengthArray<T,Prealloc1> &lhs, const QVarLengthArray<T,Prealloc2> &rhs)
+/*! \fn template<typename T, qsizetype Prealloc1, qsizetype Prealloc2> bool operator>(const QVarLengthArray<T,Prealloc1> &lhs, const QVarLengthArray<T,Prealloc2> &rhs)
\since 5.6
\relates QVarLengthArray
@@ -819,7 +818,7 @@
of \c operator<().
*/
-/*! \fn template<typename T, int Prealloc1, int Prealloc2> bool operator>=(const QVarLengthArray<T,Prealloc1> &lhs, const QVarLengthArray<T,Prealloc2> &rhs)
+/*! \fn template<typename T, qsizetype Prealloc1, qsizetype Prealloc2> bool operator>=(const QVarLengthArray<T,Prealloc1> &lhs, const QVarLengthArray<T,Prealloc2> &rhs)
\since 5.6
\relates QVarLengthArray
@@ -831,7 +830,7 @@
of \c operator<().
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator<<(const T &value)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator<<(const T &value)
\since 4.8
Appends \a value to the array and returns a reference to this
@@ -840,7 +839,7 @@
\sa append(), operator+=()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator<<(T &&value)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator<<(T &&value)
\since 5.11
\overload
@@ -848,7 +847,7 @@
\sa append(), operator+=()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator+=(const T &value)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator+=(const T &value)
\since 4.8
Appends \a value to the array and returns a reference to this vector.
@@ -856,7 +855,7 @@
\sa append(), operator<<()
*/
-/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator+=(T &&value)
+/*! \fn template<class T, qsizetype Prealloc> QVarLengthArray<T, Prealloc> &QVarLengthArray<T, Prealloc>::operator+=(T &&value)
\since 5.11
\overload
@@ -864,7 +863,7 @@
\sa append(), operator<<()
*/
-/*! \fn template<class T, int Prealloc> int QVarLengthArray<T, Prealloc>::indexOf(const T &value, int from = 0) const
+/*! \fn template<class T, qsizetype Prealloc> qsizetype QVarLengthArray<T, Prealloc>::indexOf(const T &value, qsizetype from = 0) const
\since 5.3
Returns the index position of the first occurrence of \a value in
@@ -877,7 +876,7 @@
\sa lastIndexOf(), contains()
*/
-/*! \fn template<class T, int Prealloc> int QVarLengthArray<T, Prealloc>::lastIndexOf(const T &value, int from = -1) const
+/*! \fn template<class T, qsizetype Prealloc> qsizetype QVarLengthArray<T, Prealloc>::lastIndexOf(const T &value, qsizetype from = -1) const
\since 5.3
Returns the index position of the last occurrence of the value \a
@@ -891,7 +890,7 @@
\sa indexOf(), contains()
*/
-/*! \fn template<class T, int Prealloc> bool QVarLengthArray<T, Prealloc>::contains(const T &value) const
+/*! \fn template<class T, qsizetype Prealloc> bool QVarLengthArray<T, Prealloc>::contains(const T &value) const
\since 5.3
Returns \c true if the array contains an occurrence of \a value;
@@ -904,7 +903,7 @@
*/
/*!
- \fn template <typename T, int Prealloc> uint qHash(const QVarLengthArray<T, Prealloc> &key, uint seed = 0)
+ \fn template <typename T, qsizetype Prealloc> size_t qHash(const QVarLengthArray<T, Prealloc> &key, size_t seed = 0)
\relates QVarLengthArray
\since 5.14
diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h
index 288c082c44..88c942ca15 100644
--- a/src/corelib/tools/qvector.h
+++ b/src/corelib/tools/qvector.h
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2019 Intel Corporation
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -40,127 +41,280 @@
#ifndef QVECTOR_H
#define QVECTOR_H
-#include <QtCore/qalgorithms.h>
-#include <QtCore/qiterator.h>
-#include <QtCore/qrefcount.h>
-#include <QtCore/qarraydata.h>
+#include <QtCore/qarraydatapointer.h>
+#include <QtCore/qnamespace.h>
#include <QtCore/qhashfunctions.h>
-#include <QtCore/qcontainertools_impl.h>
+#include <QtCore/qiterator.h>
-#include <iterator>
+#include <functional>
+#include <limits>
#include <initializer_list>
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
-#include <vector>
-#endif
-#include <stdlib.h>
-#include <string.h>
-
-#include <algorithm>
+#include <type_traits>
QT_BEGIN_NAMESPACE
+namespace QtPrivate {
+ template <typename V, typename U> int indexOf(const QVector<V> &list, const U &u, int from);
+ template <typename V, typename U> int lastIndexOf(const QVector<V> &list, const U &u, int from);
+}
+
+template <typename T> struct QVectorSpecialMethods
+{
+protected:
+ ~QVectorSpecialMethods() = default;
+};
+template <> struct QVectorSpecialMethods<QByteArray>;
+template <> struct QVectorSpecialMethods<QString>;
+
template <typename T>
class QVector
+#ifndef Q_QDOC
+ : public QVectorSpecialMethods<T>
+#endif
{
typedef QTypedArrayData<T> Data;
- Data *d;
+ typedef QArrayDataOps<T> DataOps;
+ typedef QArrayDataPointer<T> DataPointer;
+ class DisableRValueRefs {};
+
+ DataPointer d;
+
+ template <typename V, typename U> friend int QtPrivate::indexOf(const QVector<V> &list, const U &u, int from);
+ template <typename V, typename U> friend int QtPrivate::lastIndexOf(const QVector<V> &list, const U &u, int from);
public:
- inline QVector() noexcept : d(Data::sharedNull()) { }
- explicit QVector(int size);
- QVector(int size, const T &t);
- inline QVector(const QVector<T> &v);
- inline ~QVector() { if (!d->ref.deref()) freeData(d); }
- QVector<T> &operator=(const QVector<T> &v);
- QVector(QVector<T> &&other) noexcept : d(other.d) { other.d = Data::sharedNull(); }
- QVector<T> &operator=(QVector<T> &&other) noexcept
- { QVector moved(std::move(other)); swap(moved); return *this; }
- void swap(QVector<T> &other) noexcept { qSwap(d, other.d); }
- inline QVector(std::initializer_list<T> args);
- QVector<T> &operator=(std::initializer_list<T> args);
- template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
- inline QVector(InputIterator first, InputIterator last);
- explicit QVector(QArrayDataPointerRef<T> ref) noexcept : d(ref.ptr) {}
+ typedef T Type;
+ typedef T value_type;
+ typedef value_type *pointer;
+ typedef const value_type *const_pointer;
+ typedef value_type &reference;
+ typedef const value_type &const_reference;
+ typedef int size_type;
+ typedef qptrdiff difference_type;
+ typedef typename Data::iterator iterator;
+ typedef typename Data::const_iterator const_iterator;
+ typedef iterator Iterator;
+ typedef const_iterator ConstIterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef typename DataPointer::parameter_type parameter_type;
+ using rvalue_ref = typename std::conditional<DataPointer::pass_parameter_by_value, DisableRValueRefs, T &&>::type;
- bool operator==(const QVector<T> &v) const;
- inline bool operator!=(const QVector<T> &v) const { return !(*this == v); }
+private:
+ void resize_internal(int i, Qt::Initialization);
+ bool isValidIterator(const_iterator i) const
+ {
+ const std::less<const T*> less = {};
+ return !less(d->end(), i) && !less(i, d->begin());
+ }
+public:
+ QVector(DataPointer dd) noexcept
+ : d(dd)
+ {
+ }
- inline int size() const { return d->size; }
+public:
+ inline QVector() noexcept { }
+ explicit QVector(int size)
+ : d(Data::allocate(size))
+ {
+ if (size)
+ d->appendInitialize(size);
+ }
+ QVector(int size, const T &t)
+ : d(Data::allocate(size))
+ {
+ if (size)
+ d->copyAppend(size, t);
+ }
- inline bool isEmpty() const { return d->size == 0; }
+ inline QVector(const QVector<T> &other) noexcept : d(other.d) {}
+ QVector(QVector<T> &&other) noexcept : d(std::move(other.d)) {}
+ inline QVector(std::initializer_list<T> args)
+ : d(Data::allocate(args.size()))
+ {
+ if (args.size())
+ d->copyAppend(args.begin(), args.end());
+ }
- void resize(int size);
+ ~QVector() /*noexcept(std::is_nothrow_destructible<T>::value)*/ {}
+ QVector<T> &operator=(const QVector<T> &other) { d = other.d; return *this; }
+ QVector &operator=(QVector &&other) noexcept(std::is_nothrow_destructible<T>::value)
+ {
+ d = std::move(other.d);
+ return *this;
+ }
+ QVector<T> &operator=(std::initializer_list<T> args)
+ {
+ d = DataPointer(Data::allocate(args.size()));
+ if (args.size())
+ d->copyAppend(args.begin(), args.end());
+ return *this;
+ }
+ template <typename InputIterator, QtPrivate::IfIsForwardIterator<InputIterator> = true>
+ QVector(InputIterator i1, InputIterator i2)
+ : d(Data::allocate(std::distance(i1, i2)))
+ {
+ if (std::distance(i1, i2))
+ d->copyAppend(i1, i2);
+ }
- inline int capacity() const { return int(d->alloc); }
- void reserve(int size);
- inline void squeeze()
+ template <typename InputIterator, QtPrivate::IfIsNotForwardIterator<InputIterator> = true>
+ QVector(InputIterator i1, InputIterator i2)
+ : QVector()
{
- if (d->size < int(d->alloc)) {
- if (!d->size) {
- *this = QVector<T>();
- return;
- }
- realloc(d->size);
- }
- if (d->capacityReserved) {
- // capacity reserved in a read only memory would be useless
- // this checks avoid writing to such memory.
- d->capacityReserved = 0;
- }
+ QtPrivate::reserveIfForwardIterator(this, i1, i2);
+ std::copy(i1, i2, std::back_inserter(*this));
}
- inline void detach();
- inline bool isDetached() const { return !d->ref.isShared(); }
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- inline void setSharable(bool sharable)
+ void swap(QVector<T> &other) noexcept { qSwap(d, other.d); }
+
+ friend bool operator==(const QVector &l, const QVector &r)
{
- if (sharable == d->ref.isSharable())
- return;
- if (!sharable)
- detach();
+ if (l.size() != r.size())
+ return false;
+ if (l.begin() == r.begin())
+ return true;
- if (d == Data::unsharableEmpty()) {
- if (sharable)
- d = Data::sharedNull();
+ // do element-by-element comparison
+ return l.d->compare(l.begin(), r.begin(), l.size());
+ }
+ friend bool operator!=(const QVector &l, const QVector &r)
+ {
+ return !(l == r);
+ }
+
+ int size() const noexcept { return int(d->size); }
+ int count() const noexcept { return size(); }
+ int length() const noexcept { return size(); }
+
+ inline bool isEmpty() const noexcept { return d->size == 0; }
+
+ void resize(int size)
+ {
+ resize_internal(size, Qt::Uninitialized);
+ if (size > this->size())
+ d->appendInitialize(size);
+ }
+ void resize(int size, parameter_type c)
+ {
+ resize_internal(size, Qt::Uninitialized);
+ if (size > this->size())
+ d->copyAppend(size - this->size(), c);
+ }
+
+ inline int capacity() const { return int(d->constAllocatedCapacity()); }
+ void reserve(int size);
+ inline void squeeze();
+
+ void detach() { d.detach(); }
+ bool isDetached() const noexcept { return !d->isShared(); }
+
+ inline bool isSharedWith(const QVector<T> &other) const { return d == other.d; }
+
+ pointer data() { detach(); return d->data(); }
+ const_pointer data() const noexcept { return d->data(); }
+ const_pointer constData() const noexcept { return d->data(); }
+ void clear() {
+ if (!size())
+ return;
+ if (d->needsDetach()) {
+ // must allocate memory
+ DataPointer detached(Data::allocate(d.allocatedCapacity(), d->detachFlags()));
+ d.swap(detached);
} else {
- d->ref.setSharable(sharable);
+ d->truncate(0);
}
- Q_ASSERT(d->ref.isSharable() == sharable);
}
+
+ const_reference at(int i) const noexcept
+ {
+ Q_ASSERT_X(size_t(i) < size_t(d->size), "QVector::at", "index out of range");
+ return data()[i];
+ }
+ reference operator[](int i)
+ {
+ Q_ASSERT_X(size_t(i) < size_t(d->size), "QVector::operator[]", "index out of range");
+ detach();
+ return data()[i];
+ }
+ const_reference operator[](int i) const noexcept { return at(i); }
+ void append(const_reference t)
+ { append(const_iterator(std::addressof(t)), const_iterator(std::addressof(t)) + 1); }
+ void append(const_iterator i1, const_iterator i2);
+ void append(rvalue_ref t) { emplaceBack(std::move(t)); }
+ void append(const QVector<T> &l) { append(l.constBegin(), l.constEnd()); }
+ void prepend(rvalue_ref t);
+ void prepend(const T &t);
+
+ template <typename ...Args>
+ reference emplaceBack(Args&&... args) { return *emplace(count(), std::forward<Args>(args)...); }
+
+ iterator insert(int i, parameter_type t)
+ { return insert(i, 1, t); }
+ iterator insert(int i, int n, parameter_type t);
+ iterator insert(const_iterator before, parameter_type t)
+ {
+ Q_ASSERT_X(isValidIterator(before), "QVector::insert", "The specified iterator argument 'before' is invalid");
+ return insert(before, 1, t);
+ }
+ iterator insert(const_iterator before, int n, parameter_type t)
+ {
+ Q_ASSERT_X(isValidIterator(before), "QVector::insert", "The specified iterator argument 'before' is invalid");
+ return insert(std::distance(constBegin(), before), n, t);
+ }
+ iterator insert(const_iterator before, rvalue_ref t)
+ {
+ Q_ASSERT_X(isValidIterator(before), "QVector::insert", "The specified iterator argument 'before' is invalid");
+ return insert(std::distance(constBegin(), before), std::move(t));
+ }
+ iterator insert(int i, rvalue_ref t) { return emplace(i, std::move(t)); }
+
+ template <typename ...Args>
+ iterator emplace(const_iterator before, Args&&... args)
+ {
+ Q_ASSERT_X(isValidIterator(before), "QVector::emplace", "The specified iterator argument 'before' is invalid");
+ return emplace(std::distance(constBegin(), before), std::forward<Args>(args)...);
+ }
+
+ template <typename ...Args>
+ iterator emplace(int i, Args&&... args);
+#if 0
+ template< class InputIt >
+ iterator insert( const_iterator pos, InputIt first, InputIt last );
+ iterator insert( const_iterator pos, std::initializer_list<T> ilist );
#endif
+ void replace(int i, const T &t)
+ {
+ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::replace", "index out of range");
+ const T copy(t);
+ data()[i] = copy;
+ }
+ void replace(int i, rvalue_ref t)
+ {
+ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::replace", "index out of range");
+ const T copy(std::move(t));
+ data()[i] = std::move(copy);
+ }
- inline bool isSharedWith(const QVector<T> &other) const { return d == other.d; }
+ void remove(int i, int n = 1);
+ void removeFirst() { Q_ASSERT(!isEmpty()); remove(0); }
+ void removeLast() { Q_ASSERT(!isEmpty()); remove(size() - 1); }
+ value_type takeFirst() { Q_ASSERT(!isEmpty()); value_type v = std::move(first()); remove(0); return v; }
+ value_type takeLast() { Q_ASSERT(!isEmpty()); value_type v = std::move(last()); remove(size() - 1); return v; }
- inline T *data() { detach(); return d->begin(); }
- inline const T *data() const { return d->begin(); }
- inline const T *constData() const { return d->begin(); }
- void clear();
-
- const T &at(int i) const;
- T &operator[](int i);
- const T &operator[](int i) const;
- void append(const T &t);
- void append(T &&t);
- inline void append(const QVector<T> &l) { *this += l; }
- void prepend(T &&t);
- void prepend(const T &t);
- void insert(int i, T &&t);
- void insert(int i, const T &t);
- void insert(int i, int n, const T &t);
- void replace(int i, const T &t);
- void remove(int i);
- void remove(int i, int n);
- inline void removeFirst() { Q_ASSERT(!isEmpty()); erase(d->begin()); }
- inline void removeLast();
- T takeFirst() { Q_ASSERT(!isEmpty()); T r = std::move(first()); removeFirst(); return r; }
- T takeLast() { Q_ASSERT(!isEmpty()); T r = std::move(last()); removeLast(); return r; }
-
- QVector<T> &fill(const T &t, int size = -1);
-
- int indexOf(const T &t, int from = 0) const;
- int lastIndexOf(const T &t, int from = -1) const;
- bool contains(const T &t) const;
- int count(const T &t) const;
+ QVector<T> &fill(parameter_type t, int size = -1);
+
+ int indexOf(const T &t, int from = 0) const noexcept;
+ int lastIndexOf(const T &t, int from = -1) const noexcept;
+ bool contains(const T &t) const noexcept
+ {
+ return indexOf(t) != -1;
+ }
+ int count(const T &t) const noexcept
+ {
+ return int(std::count(&*cbegin(), &*cend(), t));
+ }
// QList compatibility
void removeAt(int i) { remove(i); }
@@ -169,10 +323,10 @@ public:
const const_iterator ce = this->cend(), cit = std::find(this->cbegin(), ce, t);
if (cit == ce)
return 0;
+ int index = cit - this->cbegin();
// next operation detaches, so ce, cit, t may become invalidated:
const T tCopy = t;
- const int firstFoundIdx = std::distance(this->cbegin(), cit);
- const iterator e = end(), it = std::remove(begin() + firstFoundIdx, e, tCopy);
+ const iterator e = end(), it = std::remove(begin() + index, e, tCopy);
const int result = std::distance(it, e);
erase(it, e);
return result;
@@ -185,7 +339,6 @@ public:
remove(i);
return true;
}
- int length() const { return size(); }
T takeAt(int i) { T t = std::move((*this)[i]); remove(i); return t; }
void move(int from, int to)
{
@@ -202,43 +355,26 @@ public:
}
// STL-style
- typedef typename Data::iterator iterator;
- typedef typename Data::const_iterator const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-#if !defined(QT_STRICT_ITERATORS) || defined(Q_CLANG_QDOC)
- inline iterator begin() { detach(); return d->begin(); }
- inline const_iterator begin() const noexcept { return d->constBegin(); }
- inline const_iterator cbegin() const noexcept { return d->constBegin(); }
- inline const_iterator constBegin() const noexcept { return d->constBegin(); }
- inline iterator end() { detach(); return d->end(); }
- inline const_iterator end() const noexcept { return d->constEnd(); }
- inline const_iterator cend() const noexcept { return d->constEnd(); }
- inline const_iterator constEnd() const noexcept { return d->constEnd(); }
-#else
- inline iterator begin(iterator = iterator()) { detach(); return d->begin(); }
- inline const_iterator begin(const_iterator = const_iterator()) const noexcept { return d->constBegin(); }
- inline const_iterator cbegin(const_iterator = const_iterator()) const noexcept { return d->constBegin(); }
- inline const_iterator constBegin(const_iterator = const_iterator()) const noexcept { return d->constBegin(); }
- inline iterator end(iterator = iterator()) { detach(); return d->end(); }
- inline const_iterator end(const_iterator = const_iterator()) const noexcept { return d->constEnd(); }
- inline const_iterator cend(const_iterator = const_iterator()) const noexcept { return d->constEnd(); }
- inline const_iterator constEnd(const_iterator = const_iterator()) const noexcept { return d->constEnd(); }
-#endif
+ iterator begin() { detach(); return d->begin(); }
+ iterator end() { detach(); return d->end(); }
+
+ const_iterator begin() const noexcept { return d->constBegin(); }
+ const_iterator end() const noexcept { return d->constEnd(); }
+ const_iterator cbegin() const noexcept { return d->constBegin(); }
+ const_iterator cend() const noexcept { return d->constEnd(); }
+ const_iterator constBegin() const noexcept { return d->constBegin(); }
+ const_iterator constEnd() const noexcept { return d->constEnd(); }
reverse_iterator rbegin() { return reverse_iterator(end()); }
reverse_iterator rend() { return reverse_iterator(begin()); }
const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
- iterator insert(iterator before, int n, const T &x);
- inline iterator insert(iterator before, const T &x) { return insert(before, 1, x); }
- inline iterator insert(iterator before, T &&x);
- iterator erase(iterator begin, iterator end);
- inline iterator erase(iterator pos) { return erase(pos, pos+1); }
+
+ iterator erase(const_iterator begin, const_iterator end);
+ inline iterator erase(const_iterator pos) { return erase(pos, pos+1); }
// more Qt
- inline int count() const { return d->size; }
inline T& first() { Q_ASSERT(!isEmpty()); return *begin(); }
inline const T &first() const { Q_ASSERT(!isEmpty()); return *begin(); }
inline const T &constFirst() const { Q_ASSERT(!isEmpty()); return *begin(); }
@@ -249,7 +385,7 @@ public:
inline bool endsWith(const T &t) const { return !isEmpty() && last() == t; }
QVector<T> mid(int pos, int len = -1) const;
- T value(int i) const;
+ T value(int i) const { return value(i, T()); }
T value(int i, const T &defaultValue) const;
void swapItemsAt(int i, int j) {
@@ -260,31 +396,26 @@ public:
}
// STL compatibility
- typedef T value_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef qptrdiff difference_type;
- typedef iterator Iterator;
- typedef const_iterator ConstIterator;
- typedef int size_type;
inline void push_back(const T &t) { append(t); }
- void push_back(T &&t) { append(std::move(t)); }
- void push_front(T &&t) { prepend(std::move(t)); }
+ void push_back(rvalue_ref t) { append(std::move(t)); }
+ void push_front(rvalue_ref t) { prepend(std::move(t)); }
inline void push_front(const T &t) { prepend(t); }
void pop_back() { removeLast(); }
void pop_front() { removeFirst(); }
+
+ template <typename ...Args>
+ reference emplace_back(Args&&... args) { return emplaceBack(std::forward<Args>(args)...); }
+
inline bool empty() const
{ return d->size == 0; }
- inline T& front() { return first(); }
+ inline reference front() { return first(); }
inline const_reference front() const { return first(); }
inline reference back() { return last(); }
inline const_reference back() const { return last(); }
void shrink_to_fit() { squeeze(); }
// comfort
- QVector<T> &operator+=(const QVector<T> &l);
+ QVector<T> &operator+=(const QVector<T> &l) { append(l.cbegin(), l.cend()); return *this; }
inline QVector<T> operator+(const QVector<T> &l) const
{ QVector n = *this; n += l; return n; }
inline QVector<T> &operator+=(const T &t)
@@ -293,37 +424,17 @@ public:
{ append(t); return *this; }
inline QVector<T> &operator<<(const QVector<T> &l)
{ *this += l; return *this; }
- inline QVector<T> &operator+=(T &&t)
+ inline QVector<T> &operator+=(rvalue_ref t)
{ append(std::move(t)); return *this; }
- inline QVector<T> &operator<<(T &&t)
+ inline QVector<T> &operator<<(rvalue_ref t)
{ append(std::move(t)); return *this; }
- static QVector<T> fromList(const QList<T> &list);
- QList<T> toList() const;
+ // Consider deprecating in 6.4 or later
+ static QVector<T> fromList(const QVector<T> &list) { return list; }
+ QVector<T> toList() const { return *this; }
-#if QT_DEPRECATED_SINCE(5, 14) && QT_VERSION < QT_VERSION_CHECK(6,0,0)
- QT_DEPRECATED_X("Use QVector<T>(vector.begin(), vector.end()) instead.")
- static inline QVector<T> fromStdVector(const std::vector<T> &vector)
- { return QVector<T>(vector.begin(), vector.end()); }
- QT_DEPRECATED_X("Use std::vector<T>(vector.begin(), vector.end()) instead.")
- inline std::vector<T> toStdVector() const
- { return std::vector<T>(d->begin(), d->end()); }
-#endif
-private:
- // ### Qt6: remove methods, they are unused
- void reallocData(const int size, const int alloc, QArrayData::AllocationOptions options = QArrayData::Default);
- void reallocData(const int sz) { reallocData(sz, d->alloc); }
- void realloc(int alloc, QArrayData::AllocationOptions options = QArrayData::Default);
- void freeData(Data *d);
- void defaultConstruct(T *from, T *to);
- void copyConstruct(const T *srcFrom, const T *srcTo, T *dstFrom);
- void destruct(T *from, T *to);
- bool isValidIterator(const iterator &i) const
- {
- const std::less<const T*> less = {};
- return !less(d->end(), i) && !less(i, d->begin());
- }
- class AlignmentDummy { Data header; T array[1]; };
+ static inline QVector<T> fromVector(const QVector<T> &vector) { return vector; }
+ inline QVector<T> toVector() const { return *this; }
};
#if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606
@@ -333,785 +444,329 @@ template <typename InputIterator,
QVector(InputIterator, InputIterator) -> QVector<ValueType>;
#endif
-#ifdef Q_CC_MSVC
-// behavior change: an object of POD type constructed with an initializer of the form ()
-// will be default-initialized
-# pragma warning ( push )
-# pragma warning ( disable : 4345 )
-# pragma warning(disable : 4127) // conditional expression is constant
-#endif
-
template <typename T>
-void QVector<T>::defaultConstruct(T *from, T *to)
+inline void QVector<T>::resize_internal(int newSize, Qt::Initialization)
{
- if (QTypeInfo<T>::isComplex) {
- while (from != to) {
- new (from++) T();
- }
- } else {
- ::memset(static_cast<void *>(from), 0, (to - from) * sizeof(T));
- }
-}
+ Q_ASSERT(newSize >= 0);
-template <typename T>
-void QVector<T>::copyConstruct(const T *srcFrom, const T *srcTo, T *dstFrom)
-{
- if (QTypeInfo<T>::isComplex) {
- while (srcFrom != srcTo)
- new (dstFrom++) T(*srcFrom++);
- } else {
- ::memcpy(static_cast<void *>(dstFrom), static_cast<const void *>(srcFrom), (srcTo - srcFrom) * sizeof(T));
- }
-}
-
-template <typename T>
-void QVector<T>::destruct(T *from, T *to)
-{
- if (QTypeInfo<T>::isComplex) {
- while (from != to) {
- from++->~T();
+ if (d->needsDetach() || newSize > capacity()) {
+ // must allocate memory
+ DataPointer detached(Data::allocate(d->detachCapacity(newSize),
+ d->detachFlags()));
+ if (size() && newSize) {
+ detached->copyAppend(constBegin(), constBegin() + qMin(newSize, size()));
}
+ d.swap(detached);
}
-}
-
-template <typename T>
-inline QVector<T>::QVector(const QVector<T> &v)
-{
- if (v.d->ref.ref()) {
- d = v.d;
- } else {
- if (v.d->capacityReserved) {
- d = Data::allocate(v.d->alloc);
- Q_CHECK_PTR(d);
- d->capacityReserved = true;
- } else {
- d = Data::allocate(v.d->size);
- Q_CHECK_PTR(d);
- }
- if (d->alloc) {
- copyConstruct(v.d->begin(), v.d->end(), d->begin());
- d->size = v.d->size;
- }
- }
-}
-#if defined(Q_CC_MSVC)
-#pragma warning( pop )
-#endif
-
-template <typename T>
-void QVector<T>::detach()
-{
- if (!isDetached()) {
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- if (!d->alloc)
- d = Data::unsharableEmpty();
- else
-#endif
- realloc(int(d->alloc));
- }
- Q_ASSERT(isDetached());
+ if (newSize < size())
+ d->truncate(newSize);
}
template <typename T>
void QVector<T>::reserve(int asize)
{
- if (asize > int(d->alloc))
- realloc(asize);
- if (isDetached()
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- && d != Data::unsharableEmpty()
-#endif
- )
- d->capacityReserved = 1;
- Q_ASSERT(capacity() >= asize);
-}
-
-template <typename T>
-void QVector<T>::resize(int asize)
-{
- if (asize == d->size)
- return detach();
- if (asize > int(d->alloc) || !isDetached()) { // there is not enough space
- QArrayData::AllocationOptions opt = asize > int(d->alloc) ? QArrayData::Grow : QArrayData::Default;
- realloc(qMax(int(d->alloc), asize), opt);
+ // capacity() == 0 for immutable data, so this will force a detaching below
+ if (asize <= capacity()) {
+ if (d->flags() & Data::CapacityReserved)
+ return; // already reserved, don't shrink
+ if (!d->isShared()) {
+ // accept current allocation, don't shrink
+ d->flags() |= Data::CapacityReserved;
+ return;
+ }
}
- if (asize < d->size)
- destruct(begin() + asize, end());
- else
- defaultConstruct(end(), begin() + asize);
- d->size = asize;
-}
-template <typename T>
-inline void QVector<T>::clear()
-{
- if (!d->size)
- return;
- destruct(begin(), end());
- d->size = 0;
-}
-template <typename T>
-inline const T &QVector<T>::at(int i) const
-{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::at", "index out of range");
- return d->begin()[i]; }
-template <typename T>
-inline const T &QVector<T>::operator[](int i) const
-{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
- return d->begin()[i]; }
-template <typename T>
-inline T &QVector<T>::operator[](int i)
-{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
- return data()[i]; }
-template <typename T>
-inline void QVector<T>::insert(int i, const T &t)
-{ Q_ASSERT_X(i >= 0 && i <= d->size, "QVector<T>::insert", "index out of range");
- insert(begin() + i, 1, t); }
-template <typename T>
-inline void QVector<T>::insert(int i, int n, const T &t)
-{ Q_ASSERT_X(i >= 0 && i <= d->size, "QVector<T>::insert", "index out of range");
- insert(begin() + i, n, t); }
-template <typename T>
-inline void QVector<T>::insert(int i, T &&t)
-{ Q_ASSERT_X(i >= 0 && i <= d->size, "QVector<T>::insert", "index out of range");
- insert(begin() + i, std::move(t)); }
-template <typename T>
-inline void QVector<T>::remove(int i, int n)
-{ Q_ASSERT_X(i >= 0 && n >= 0 && i + n <= d->size, "QVector<T>::remove", "index out of range");
- erase(d->begin() + i, d->begin() + i + n); }
-template <typename T>
-inline void QVector<T>::remove(int i)
-{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::remove", "index out of range");
- erase(d->begin() + i, d->begin() + i + 1); }
-template <typename T>
-inline void QVector<T>::prepend(const T &t)
-{ insert(begin(), 1, t); }
-template <typename T>
-inline void QVector<T>::prepend(T &&t)
-{ insert(begin(), std::move(t)); }
-template <typename T>
-inline void QVector<T>::replace(int i, const T &t)
-{
- Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::replace", "index out of range");
- const T copy(t);
- data()[i] = copy;
+ DataPointer detached(Data::allocate(qMax(asize, size()),
+ d->detachFlags() | Data::CapacityReserved));
+ detached->copyAppend(constBegin(), constEnd());
+ d.swap(detached);
}
template <typename T>
-QVector<T> &QVector<T>::operator=(const QVector<T> &v)
+inline void QVector<T>::squeeze()
{
- if (v.d != d) {
- QVector<T> tmp(v);
- tmp.swap(*this);
- }
- return *this;
-}
-
-template <typename T>
-QVector<T>::QVector(int asize)
-{
- Q_ASSERT_X(asize >= 0, "QVector::QVector", "Size must be greater than or equal to 0.");
- if (Q_LIKELY(asize > 0)) {
- d = Data::allocate(asize);
- Q_CHECK_PTR(d);
- d->size = asize;
- defaultConstruct(d->begin(), d->end());
- } else {
- d = Data::sharedNull();
+ if (d->needsDetach() || size() != capacity()) {
+ // must allocate memory
+ DataPointer detached(Data::allocate(size(), d->detachFlags() & ~Data::CapacityReserved));
+ if (size()) {
+ detached->copyAppend(constBegin(), constEnd());
+ }
+ d.swap(detached);
}
}
template <typename T>
-QVector<T>::QVector(int asize, const T &t)
+inline void QVector<T>::remove(int i, int n)
{
- Q_ASSERT_X(asize >= 0, "QVector::QVector", "Size must be greater than or equal to 0.");
- if (asize > 0) {
- d = Data::allocate(asize);
- Q_CHECK_PTR(d);
- d->size = asize;
- T* i = d->end();
- while (i != d->begin())
- new (--i) T(t);
- } else {
- d = Data::sharedNull();
- }
-}
+ Q_ASSERT_X(size_t(i) + size_t(n) <= size_t(d->size), "QVector::remove", "index out of range");
+ Q_ASSERT_X(n >= 0, "QVector::remove", "invalid count");
-#if defined(Q_CC_MSVC)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_MSVC(4127) // conditional expression is constant
-#endif // Q_CC_MSVC
+ if (n == 0)
+ return;
-template <typename T>
-QVector<T>::QVector(std::initializer_list<T> args)
-{
- if (args.size() > 0) {
- d = Data::allocate(args.size());
- Q_CHECK_PTR(d);
- // std::initializer_list<T>::iterator is guaranteed to be
- // const T* ([support.initlist]/1), so can be memcpy'ed away from by copyConstruct
- copyConstruct(args.begin(), args.end(), d->begin());
- d->size = int(args.size());
+ const size_t newSize = size() - n;
+ if (d->needsDetach() ||
+ ((d->flags() & Data::CapacityReserved) == 0
+ && newSize < d->allocatedCapacity()/2)) {
+ // allocate memory
+ DataPointer detached(Data::allocate(d->detachCapacity(newSize),
+ d->detachFlags() & ~(Data::GrowsBackwards | Data::GrowsForward)));
+ const_iterator where = constBegin() + i;
+ if (newSize) {
+ detached->copyAppend(constBegin(), where);
+ detached->copyAppend(where + n, constEnd());
+ }
+ d.swap(detached);
} else {
- d = Data::sharedNull();
+ // we're detached and we can just move data around
+ d->erase(d->begin() + i, d->begin() + i + n);
}
}
template <typename T>
-QVector<T> &QVector<T>::operator=(std::initializer_list<T> args)
-{
- QVector<T> tmp(args);
- tmp.swap(*this);
- return *this;
-}
-
-#if defined(Q_CC_MSVC)
-QT_WARNING_POP
-#endif // Q_CC_MSVC
-
+inline void QVector<T>::prepend(const T &t)
+{ insert(0, 1, t); }
template <typename T>
-template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator>>
-QVector<T>::QVector(InputIterator first, InputIterator last)
- : QVector()
-{
- QtPrivate::reserveIfForwardIterator(this, first, last);
- std::copy(first, last, std::back_inserter(*this));
-}
+void QVector<T>::prepend(rvalue_ref t)
+{ insert(0, std::move(t)); }
-template <typename T>
-void QVector<T>::freeData(Data *x)
+template<typename T>
+inline T QVector<T>::value(int i, const T &defaultValue) const
{
- destruct(x->begin(), x->end());
- Data::deallocate(x);
+ return size_t(i) < size_t(d->size) ? at(i) : defaultValue;
}
-#if defined(Q_CC_MSVC)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_MSVC(4127) // conditional expression is constant
-#endif
-
template <typename T>
-void QVector<T>::reallocData(const int asize, const int aalloc, QArrayData::AllocationOptions options)
+inline void QVector<T>::append(const_iterator i1, const_iterator i2)
{
- Q_ASSERT(asize >= 0 && asize <= aalloc);
- Data *x = d;
-
- const bool isShared = d->ref.isShared();
-
- if (aalloc != 0) {
- if (aalloc != int(d->alloc) || isShared) {
- QT_TRY {
- // allocate memory
- x = Data::allocate(aalloc, options);
- Q_CHECK_PTR(x);
- // aalloc is bigger then 0 so it is not [un]sharedEmpty
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- Q_ASSERT(x->ref.isSharable() || options.testFlag(QArrayData::Unsharable));
-#endif
- Q_ASSERT(!x->ref.isStatic());
- x->size = asize;
-
- T *srcBegin = d->begin();
- T *srcEnd = asize > d->size ? d->end() : d->begin() + asize;
- T *dst = x->begin();
-
- if (!QTypeInfoQuery<T>::isRelocatable || (isShared && QTypeInfo<T>::isComplex)) {
- QT_TRY {
- if (isShared || !std::is_nothrow_move_constructible<T>::value) {
- // we can not move the data, we need to copy construct it
- while (srcBegin != srcEnd)
- new (dst++) T(*srcBegin++);
- } else {
- while (srcBegin != srcEnd)
- new (dst++) T(std::move(*srcBegin++));
- }
- } QT_CATCH (...) {
- // destruct already copied objects
- destruct(x->begin(), dst);
- QT_RETHROW;
- }
- } else {
- ::memcpy(static_cast<void *>(dst), static_cast<void *>(srcBegin), (srcEnd - srcBegin) * sizeof(T));
- dst += srcEnd - srcBegin;
-
- // destruct unused / not moved data
- if (asize < d->size)
- destruct(d->begin() + asize, d->end());
- }
-
- if (asize > d->size) {
- // construct all new objects when growing
- if (!QTypeInfo<T>::isComplex) {
- ::memset(static_cast<void *>(dst), 0, (static_cast<T *>(x->end()) - dst) * sizeof(T));
- } else {
- QT_TRY {
- while (dst != x->end())
- new (dst++) T();
- } QT_CATCH (...) {
- // destruct already copied objects
- destruct(x->begin(), dst);
- QT_RETHROW;
- }
- }
- }
- } QT_CATCH (...) {
- Data::deallocate(x);
- QT_RETHROW;
- }
- x->capacityReserved = d->capacityReserved;
- } else {
- Q_ASSERT(int(d->alloc) == aalloc); // resize, without changing allocation size
- Q_ASSERT(isDetached()); // can be done only on detached d
- Q_ASSERT(x == d); // in this case we do not need to allocate anything
- if (asize <= d->size) {
- destruct(x->begin() + asize, x->end()); // from future end to current end
- } else {
- defaultConstruct(x->end(), x->begin() + asize); // from current end to future end
- }
- x->size = asize;
- }
+ if (i1 == i2)
+ return;
+ const size_t newSize = size() + std::distance(i1, i2);
+ if (d->needsDetach() || newSize > d->allocatedCapacity()) {
+ DataPointer detached(Data::allocate(d->detachCapacity(newSize),
+ d->detachFlags() | Data::GrowsForward));
+ detached->copyAppend(constBegin(), constEnd());
+ detached->copyAppend(i1, i2);
+ d.swap(detached);
} else {
- x = Data::sharedNull();
- }
- if (d != x) {
- if (!d->ref.deref()) {
- if (!QTypeInfoQuery<T>::isRelocatable || !aalloc || (isShared && QTypeInfo<T>::isComplex)) {
- // data was copy constructed, we need to call destructors
- // or if !alloc we did nothing to the old 'd'.
- freeData(d);
- } else {
- Data::deallocate(d);
- }
- }
- d = x;
+ // we're detached and we can just move data around
+ d->copyAppend(i1, i2);
}
-
- Q_ASSERT(d->data());
- Q_ASSERT(uint(d->size) <= d->alloc);
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- Q_ASSERT(d != Data::unsharableEmpty());
-#endif
- Q_ASSERT(aalloc ? d != Data::sharedNull() : d == Data::sharedNull());
- Q_ASSERT(d->alloc >= uint(aalloc));
- Q_ASSERT(d->size == asize);
}
-template<typename T>
-void QVector<T>::realloc(int aalloc, QArrayData::AllocationOptions options)
+template <typename T>
+inline typename QVector<T>::iterator
+QVector<T>::insert(int i, int n, parameter_type t)
{
- Q_ASSERT(aalloc >= d->size);
- Data *x = d;
+ Q_ASSERT_X(size_t(i) <= size_t(d->size), "QVector<T>::insert", "index out of range");
- const bool isShared = d->ref.isShared();
+ // we don't have a quick exit for n == 0
+ // it's not worth wasting CPU cycles for that
- QT_TRY {
- // allocate memory
- x = Data::allocate(aalloc, options);
- Q_CHECK_PTR(x);
- // aalloc is bigger then 0 so it is not [un]sharedEmpty
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- Q_ASSERT(x->ref.isSharable() || options.testFlag(QArrayData::Unsharable));
-#endif
- Q_ASSERT(!x->ref.isStatic());
- x->size = d->size;
-
- T *srcBegin = d->begin();
- T *srcEnd = d->end();
- T *dst = x->begin();
-
- if (!QTypeInfoQuery<T>::isRelocatable || (isShared && QTypeInfo<T>::isComplex)) {
- QT_TRY {
- if (isShared || !std::is_nothrow_move_constructible<T>::value) {
- // we can not move the data, we need to copy construct it
- while (srcBegin != srcEnd)
- new (dst++) T(*srcBegin++);
- } else {
- while (srcBegin != srcEnd)
- new (dst++) T(std::move(*srcBegin++));
- }
- } QT_CATCH (...) {
- // destruct already copied objects
- destruct(x->begin(), dst);
- QT_RETHROW;
- }
- } else {
- ::memcpy(static_cast<void *>(dst), static_cast<void *>(srcBegin), (srcEnd - srcBegin) * sizeof(T));
- dst += srcEnd - srcBegin;
- }
+ const size_t newSize = size() + n;
+ if (d->needsDetach() || newSize > d->allocatedCapacity()) {
+ typename Data::ArrayOptions flags = d->detachFlags() | Data::GrowsForward;
+ if (size_t(i) <= newSize / 4)
+ flags |= Data::GrowsBackwards;
- } QT_CATCH (...) {
- Data::deallocate(x);
- QT_RETHROW;
- }
- x->capacityReserved = d->capacityReserved;
-
- Q_ASSERT(d != x);
- if (!d->ref.deref()) {
- if (!QTypeInfoQuery<T>::isRelocatable || !aalloc || (isShared && QTypeInfo<T>::isComplex)) {
- // data was copy constructed, we need to call destructors
- // or if !alloc we did nothing to the old 'd'.
- freeData(d);
+ DataPointer detached(Data::allocate(d->detachCapacity(newSize), flags));
+ const_iterator where = constBegin() + i;
+ detached->copyAppend(constBegin(), where);
+ detached->copyAppend(n, t);
+ detached->copyAppend(where, constEnd());
+ d.swap(detached);
+ } else {
+ // we're detached and we can just move data around
+ if (i == size()) {
+ d->copyAppend(n, t);
} else {
- Data::deallocate(d);
+ T copy(t);
+ d->insert(d.begin() + i, n, copy);
}
}
- d = x;
-
- Q_ASSERT(d->data());
- Q_ASSERT(uint(d->size) <= d->alloc);
-#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- Q_ASSERT(d != Data::unsharableEmpty());
-#endif
- Q_ASSERT(d != Data::sharedNull());
- Q_ASSERT(d->alloc >= uint(aalloc));
-}
-
-#if defined(Q_CC_MSVC)
-QT_WARNING_POP
-#endif
-
-template<typename T>
-Q_OUTOFLINE_TEMPLATE T QVector<T>::value(int i) const
-{
- if (uint(i) >= uint(d->size)) {
- return T();
- }
- return d->begin()[i];
-}
-template<typename T>
-Q_OUTOFLINE_TEMPLATE T QVector<T>::value(int i, const T &defaultValue) const
-{
- return uint(i) >= uint(d->size) ? defaultValue : d->begin()[i];
+ return d.begin() + i;
}
template <typename T>
-void QVector<T>::append(const T &t)
+template <typename ...Args>
+typename QVector<T>::iterator
+QVector<T>::emplace(int i, Args&&... args)
{
- const bool isTooSmall = uint(d->size + 1) > d->alloc;
- if (!isDetached() || isTooSmall) {
- T copy(t);
- QArrayData::AllocationOptions opt(isTooSmall ? QArrayData::Grow : QArrayData::Default);
- realloc(isTooSmall ? d->size + 1 : d->alloc, opt);
-
- if (QTypeInfo<T>::isComplex)
- new (d->end()) T(std::move(copy));
- else
- *d->end() = std::move(copy);
+ Q_ASSERT_X(i >= 0 && i <= d->size, "QVector<T>::insert", "index out of range");
- } else {
- if (QTypeInfo<T>::isComplex)
- new (d->end()) T(t);
- else
- *d->end() = t;
- }
- ++d->size;
-}
-
-template <typename T>
-void QVector<T>::append(T &&t)
-{
- const bool isTooSmall = uint(d->size + 1) > d->alloc;
- if (!isDetached() || isTooSmall) {
- QArrayData::AllocationOptions opt(isTooSmall ? QArrayData::Grow : QArrayData::Default);
- realloc(isTooSmall ? d->size + 1 : d->alloc, opt);
- }
+ const size_t newSize = size() + 1;
+ if (d->needsDetach() || newSize > d->allocatedCapacity()) {
+ typename Data::ArrayOptions flags = d->detachFlags() | Data::GrowsForward;
+ if (size_t(i) <= newSize / 4)
+ flags |= Data::GrowsBackwards;
- new (d->end()) T(std::move(t));
+ DataPointer detached(Data::allocate(d->detachCapacity(newSize), flags));
+ const_iterator where = constBegin() + i;
- ++d->size;
-}
+ // First, create an element to handle cases, when a user moves
+ // the element from a container to the same container
+ detached->createInPlace(detached.begin() + i, std::forward<Args>(args)...);
-template <typename T>
-void QVector<T>::removeLast()
-{
- Q_ASSERT(!isEmpty());
- Q_ASSERT(d->alloc);
+ // Then, put the first part of the elements to the new location
+ detached->copyAppend(constBegin(), where);
- if (d->ref.isShared())
- detach();
- --d->size;
- if (QTypeInfo<T>::isComplex)
- (d->data() + d->size)->~T();
-}
+ // After that, increase the actual size, because we created
+ // one extra element
+ ++detached.size;
-template <typename T>
-typename QVector<T>::iterator QVector<T>::insert(iterator before, size_type n, const T &t)
-{
- Q_ASSERT_X(isValidIterator(before), "QVector::insert", "The specified iterator argument 'before' is invalid");
+ // Finally, put the rest of the elements to the new location
+ detached->copyAppend(where, constEnd());
- const auto offset = std::distance(d->begin(), before);
- if (n != 0) {
- const T copy(t);
- if (!isDetached() || d->size + n > int(d->alloc))
- realloc(d->size + n, QArrayData::Grow);
- if (!QTypeInfoQuery<T>::isRelocatable) {
- T *b = d->end();
- T *i = d->end() + n;
- while (i != b)
- new (--i) T;
- i = d->end();
- T *j = i + n;
- b = d->begin() + offset;
- while (i != b)
- *--j = *--i;
- i = b+n;
- while (i != b)
- *--i = copy;
- } else {
- T *b = d->begin() + offset;
- T *i = b + n;
- memmove(static_cast<void *>(i), static_cast<const void *>(b), (d->size - offset) * sizeof(T));
- while (i != b)
- new (--i) T(copy);
- }
- d->size += n;
- }
- return d->begin() + offset;
-}
-
-template <typename T>
-typename QVector<T>::iterator QVector<T>::insert(iterator before, T &&t)
-{
- Q_ASSERT_X(isValidIterator(before), "QVector::insert", "The specified iterator argument 'before' is invalid");
-
- const auto offset = std::distance(d->begin(), before);
- if (!isDetached() || d->size + 1 > int(d->alloc))
- realloc(d->size + 1, QArrayData::Grow);
- if (!QTypeInfoQuery<T>::isRelocatable) {
- T *i = d->end();
- T *j = i + 1;
- T *b = d->begin() + offset;
- // The new end-element needs to be constructed, the rest must be move assigned
- if (i != b) {
- new (--j) T(std::move(*--i));
- while (i != b)
- *--j = std::move(*--i);
- *b = std::move(t);
- } else {
- new (b) T(std::move(t));
- }
+ d.swap(detached);
} else {
- T *b = d->begin() + offset;
- memmove(static_cast<void *>(b + 1), static_cast<const void *>(b), (d->size - offset) * sizeof(T));
- new (b) T(std::move(t));
+ d->emplace(d.begin() + i, std::forward<Args>(args)...);
}
- d->size += 1;
- return d->begin() + offset;
+ return d.begin() + i;
}
template <typename T>
-typename QVector<T>::iterator QVector<T>::erase(iterator abegin, iterator aend)
+typename QVector<T>::iterator QVector<T>::erase(const_iterator abegin, const_iterator aend)
{
Q_ASSERT_X(isValidIterator(abegin), "QVector::erase", "The specified iterator argument 'abegin' is invalid");
Q_ASSERT_X(isValidIterator(aend), "QVector::erase", "The specified iterator argument 'aend' is invalid");
+ Q_ASSERT(aend >= abegin);
- const auto itemsToErase = aend - abegin;
+ int i = std::distance(d.constBegin(), abegin);
+ int n = std::distance(abegin, aend);
+ remove(i, n);
- if (!itemsToErase)
- return abegin;
-
- Q_ASSERT(abegin >= d->begin());
- Q_ASSERT(aend <= d->end());
- Q_ASSERT(abegin <= aend);
-
- const auto itemsUntouched = abegin - d->begin();
-
- // FIXME we could do a proper realloc, which copy constructs only needed data.
- // FIXME we are about to delete data - maybe it is good time to shrink?
- // FIXME the shrink is also an issue in removeLast, that is just a copy + reduce of this.
- if (d->alloc) {
- detach();
- abegin = d->begin() + itemsUntouched;
- aend = abegin + itemsToErase;
- if (!QTypeInfoQuery<T>::isRelocatable) {
- iterator moveBegin = abegin + itemsToErase;
- iterator moveEnd = d->end();
- while (moveBegin != moveEnd) {
- if (QTypeInfo<T>::isComplex)
- static_cast<T *>(abegin)->~T();
- new (abegin++) T(*moveBegin++);
- }
- if (abegin < d->end()) {
- // destroy rest of instances
- destruct(abegin, d->end());
- }
- } else {
- destruct(abegin, aend);
- // QTBUG-53605: static_cast<void *> masks clang errors of the form
- // error: destination for this 'memmove' call is a pointer to class containing a dynamic class
- // FIXME maybe use std::is_polymorphic (as soon as allowed) to avoid the memmove
- memmove(static_cast<void *>(abegin), static_cast<void *>(aend),
- (d->size - itemsToErase - itemsUntouched) * sizeof(T));
- }
- d->size -= int(itemsToErase);
- }
- return d->begin() + itemsUntouched;
+ return d.begin() + i;
}
template <typename T>
-bool QVector<T>::operator==(const QVector<T> &v) const
+inline QVector<T> &QVector<T>::fill(parameter_type t, int newSize)
{
- if (d == v.d)
- return true;
- if (d->size != v.d->size)
- return false;
- const T *vb = v.d->begin();
- const T *b = d->begin();
- const T *e = d->end();
- return std::equal(b, e, QT_MAKE_CHECKED_ARRAY_ITERATOR(vb, v.d->size));
-}
-
-template <typename T>
-QVector<T> &QVector<T>::fill(const T &from, int asize)
-{
- const T copy(from);
- resize(asize < 0 ? d->size : asize);
- if (d->size) {
- T *i = d->end();
- T *b = d->begin();
- while (i != b)
- *--i = copy;
- }
- return *this;
-}
-
-template <typename T>
-QVector<T> &QVector<T>::operator+=(const QVector &l)
-{
- if (d->size == 0) {
- *this = l;
+ if (newSize == -1)
+ newSize = size();
+ if (d->needsDetach() || newSize > capacity()) {
+ // must allocate memory
+ DataPointer detached(Data::allocate(d->detachCapacity(newSize),
+ d->detachFlags()));
+ detached->copyAppend(newSize, t);
+ d.swap(detached);
} else {
- uint newSize = d->size + l.d->size;
- const bool isTooSmall = newSize > d->alloc;
- if (!isDetached() || isTooSmall) {
- QArrayData::AllocationOptions opt(isTooSmall ? QArrayData::Grow : QArrayData::Default);
- realloc(isTooSmall ? newSize : d->alloc, opt);
- }
-
- if (d->alloc) {
- T *w = d->begin() + newSize;
- T *i = l.d->end();
- T *b = l.d->begin();
- while (i != b) {
- if (QTypeInfo<T>::isComplex)
- new (--w) T(*--i);
- else
- *--w = *--i;
- }
- d->size = newSize;
- }
+ // we're detached
+ const T copy(t);
+ d->assign(d.begin(), d.begin() + qMin(size(), newSize), t);
+ if (newSize > size())
+ d->copyAppend(newSize - size(), copy);
}
return *this;
}
-template <typename T>
-int QVector<T>::indexOf(const T &t, int from) const
+namespace QtPrivate {
+template <typename T, typename U>
+int indexOf(const QVector<T> &vector, const U &u, int from)
{
if (from < 0)
- from = qMax(from + d->size, 0);
- if (from < d->size) {
- T* n = d->begin() + from - 1;
- T* e = d->end();
+ from = qMax(from + vector.size(), 0);
+ if (from < vector.size()) {
+ auto n = vector.begin() + from - 1;
+ auto e = vector.end();
while (++n != e)
- if (*n == t)
- return n - d->begin();
+ if (*n == u)
+ return int(n - vector.begin());
}
return -1;
}
-template <typename T>
-int QVector<T>::lastIndexOf(const T &t, int from) const
+template <typename T, typename U>
+int lastIndexOf(const QVector<T> &vector, const U &u, int from)
{
if (from < 0)
- from += d->size;
- else if (from >= d->size)
- from = d->size-1;
+ from += vector.d->size;
+ else if (from >= vector.size())
+ from = vector.size() - 1;
if (from >= 0) {
- T* b = d->begin();
- T* n = d->begin() + from + 1;
+ auto b = vector.begin();
+ auto n = vector.begin() + from + 1;
while (n != b) {
- if (*--n == t)
- return n - b;
+ if (*--n == u)
+ return int(n - b);
}
}
return -1;
}
+}
template <typename T>
-bool QVector<T>::contains(const T &t) const
+int QVector<T>::indexOf(const T &t, int from) const noexcept
{
- const T *b = d->begin();
- const T *e = d->end();
- return std::find(b, e, t) != e;
+ return QtPrivate::indexOf<T, T>(*this, t, from);
}
template <typename T>
-int QVector<T>::count(const T &t) const
+int QVector<T>::lastIndexOf(const T &t, int from) const noexcept
{
- const T *b = d->begin();
- const T *e = d->end();
- return int(std::count(b, e, t));
+ return QtPrivate::lastIndexOf(*this, t, from);
}
template <typename T>
-Q_OUTOFLINE_TEMPLATE QVector<T> QVector<T>::mid(int pos, int len) const
+inline QVector<T> QVector<T>::mid(int pos, int len) const
{
using namespace QtPrivate;
- switch (QContainerImplHelper::mid(d->size, &pos, &len)) {
+ switch (QContainerImplHelper::mid(d.size, &pos, &len)) {
case QContainerImplHelper::Null:
case QContainerImplHelper::Empty:
- return QVector<T>();
+ return QVector();
case QContainerImplHelper::Full:
return *this;
case QContainerImplHelper::Subset:
break;
}
- QVector<T> midResult;
- midResult.realloc(len);
- T *srcFrom = d->begin() + pos;
- T *srcTo = d->begin() + pos + len;
- midResult.copyConstruct(srcFrom, srcTo, midResult.data());
- midResult.d->size = len;
- return midResult;
+ // Allocate memory
+ DataPointer copied(Data::allocate(len));
+ copied->copyAppend(constBegin() + pos, constBegin() + pos + len);
+ return copied;
}
Q_DECLARE_SEQUENTIAL_ITERATOR(Vector)
Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(Vector)
template <typename T>
-uint qHash(const QVector<T> &key, uint seed = 0)
+size_t qHash(const QVector<T> &key, size_t seed = 0)
noexcept(noexcept(qHashRange(key.cbegin(), key.cend(), seed)))
{
return qHashRange(key.cbegin(), key.cend(), seed);
}
template <typename T>
-bool operator<(const QVector<T> &lhs, const QVector<T> &rhs)
+auto operator<(const QVector<T> &lhs, const QVector<T> &rhs)
noexcept(noexcept(std::lexicographical_compare(lhs.begin(), lhs.end(),
- rhs.begin(), rhs.end())))
+ rhs.begin(), rhs.end())))
+ -> decltype(std::declval<T>() < std::declval<T>())
{
return std::lexicographical_compare(lhs.begin(), lhs.end(),
rhs.begin(), rhs.end());
}
template <typename T>
-inline bool operator>(const QVector<T> &lhs, const QVector<T> &rhs)
+auto operator>(const QVector<T> &lhs, const QVector<T> &rhs)
noexcept(noexcept(lhs < rhs))
+ -> decltype(lhs < rhs)
{
return rhs < lhs;
}
template <typename T>
-inline bool operator<=(const QVector<T> &lhs, const QVector<T> &rhs)
+auto operator<=(const QVector<T> &lhs, const QVector<T> &rhs)
noexcept(noexcept(lhs < rhs))
+ -> decltype(lhs < rhs)
{
return !(lhs > rhs);
}
template <typename T>
-inline bool operator>=(const QVector<T> &lhs, const QVector<T> &rhs)
+auto operator>=(const QVector<T> &lhs, const QVector<T> &rhs)
noexcept(noexcept(lhs < rhs))
+ -> decltype(lhs < rhs)
{
return !(lhs < rhs);
}
@@ -1135,4 +790,7 @@ QVector<uint> QStringView::toUcs4() const { return QtPrivate::convertToUcs4(*thi
QT_END_NAMESPACE
+#include <QtCore/qbytearraylist.h>
+#include <QtCore/qstringlist.h>
+
#endif // QVECTOR_H
diff --git a/src/corelib/tools/qvector.qdoc b/src/corelib/tools/qvector.qdoc
index 116d962411..cbb118ddb9 100644
--- a/src/corelib/tools/qvector.qdoc
+++ b/src/corelib/tools/qvector.qdoc
@@ -39,7 +39,7 @@
stores its items in adjacent memory locations and provides fast
index-based access.
- QList\<T\>, QLinkedList\<T\>, QVector\<T\>, and QVarLengthArray\<T\>
+ QList\<T\>, QVector\<T\>, and QVarLengthArray\<T\>
provide similar APIs and functionality. They are often interchangeable,
but there are performance consequences. Here is an overview of use cases:
@@ -57,18 +57,13 @@
those APIs.
\li If you need a real linked list, which guarantees
\l{Algorithmic Complexity}{constant time} insertions mid-list and
- uses iterators to items rather than indexes, use QLinkedList.
+ uses iterators to items rather than indexes, use std::list.
\endlist
\note QVector and QVarLengthArray both guarantee C-compatible
array layout. QList does not. This might be important if your
application must interface with a C API.
- \note Iterators into a QLinkedList and references into
- heap-allocating QLists remain valid as long as the referenced items
- remain in the container. This is not true for iterators and
- references into a QVector and non-heap-allocating QLists.
-
Here's an example of a QVector that stores integers and a QVector
that stores QString values:
@@ -129,7 +124,7 @@
(\l{linear time}) for large vectors, because they require moving many
items in the vector by one position in memory. If you want a container
class that provides fast insertion/removal in the middle, use
- QList or QLinkedList instead.
+ std::list instead.
Unlike plain C++ arrays, QVectors can be resized at any time by
calling resize(). If the new size is larger than the old size,
@@ -190,8 +185,6 @@
holding a lot of allocated memory, especially large, contiguous blocks.
Such considerations, the configuration of such behavior or any mitigation
are outside the scope of the Qt API.
-
- \sa QVectorIterator, QMutableVectorIterator, QList, QLinkedList
*/
/*!
@@ -398,7 +391,7 @@
*/
/*!
- \fn template <typename T> uint qHash(const QVector<T> &key, uint seed = 0)
+ \fn template <typename T> size_t qHash(const QVector<T> &key, size_t seed = 0)
\since 5.6
\relates QVector
@@ -640,12 +633,34 @@
For large vectors, this operation can be slow (\l{linear time}),
because it requires moving all the items in the vector by one
position further in memory. If you want a container class that
- provides a fast prepend() function, use QList or QLinkedList
+ provides a fast prepend operation, use std::list
instead.
\sa append(), insert()
*/
+/*!
+ \fn template <typename T> template <typename ...Args> T &QVector<T>::emplaceBack(Args&&... args)
+ \fn template <typename T> template <typename ...Args> T &QVector<T>::emplace_back(Args&&... args)
+
+ Adds a new element to the end for the container. This new element
+ is constructed in-place using \a args as the arguments for its
+ construction.
+
+ Returns a reference to the new element.
+
+ Example:
+ \snippet code/src_corelib_tools_qvector.cpp emplace-back
+
+ It is also possible to access a newly created object by using
+ returned reference:
+ \snippet code/src_corelib_tools_qvector.cpp emplace-back-ref
+
+ This is the same as vector.emplace(vector.size(), \a args).
+
+ \sa emplace
+*/
+
/*! \fn template <typename T> void QVector<T>::insert(int i, const T &value)
\fn template <typename T> void QVector<T>::insert(int i, T &&value)
@@ -659,7 +674,7 @@
For large vectors, this operation can be slow (\l{linear time}),
because it requires moving all the items at indexes \a i and
above by one position further in memory. If you want a container
- class that provides a fast insert() function, use QLinkedList
+ class that provides a fast insert() function, use std::list
instead.
\sa append(), prepend(), remove()
@@ -693,6 +708,26 @@
first of the inserted items.
*/
+/*!
+ \fn template <typename T> template <typename ...Args> QVector<T>::iterator QVector<T>::emplace(int i, Args&&... args)
+
+ Extends the container by inserting a new element at position \a i.
+ This new element is constructed in-place using \a args as the
+ arguments for its construction.
+
+ Returns an iterator to the new element.
+
+ Example:
+ \snippet code/src_corelib_tools_qvector.cpp emplace
+
+ \note It is garanteed that the element will be created in place
+ at the beginning, but after that it might be copied or
+ moved to the right position.
+
+ \sa emplaceBack
+*/
+
+
/*! \fn template <typename T> void QVector<T>::replace(int i, const T &value)
Replaces the item at index position \a i with \a value.
@@ -838,6 +873,17 @@
\sa takeFirst(), removeLast()
*/
+/*!
+ \fn template <typename T> template <typename ...Args> QVector<T>::iterator QVector<T>::emplace(QVector<T>::iterator before, Args&&... args)
+
+ \overload
+
+ Creates a new element in front of the item pointed to by the
+ iterator \a before. This new element is constructed in-place
+ using \a args as the arguments for its construction.
+
+ Returns an iterator to the new element.
+*/
/*! \fn template <typename T> QVector<T> &QVector<T>::fill(const T &value, int size = -1)
diff --git a/src/corelib/tools/qvector_msvc.cpp b/src/corelib/tools/qvector_msvc.cpp
index cee343e72b..7e87467d42 100644
--- a/src/corelib/tools/qvector_msvc.cpp
+++ b/src/corelib/tools/qvector_msvc.cpp
@@ -47,12 +47,5 @@
# error "This file must be compiled with no precompiled headers"
#endif
-// invert the setting of QT_STRICT_ITERATORS, whichever it was
-#ifdef QT_STRICT_ITERATORS
-# undef QT_STRICT_ITERATORS
-#else
-# define QT_STRICT_ITERATORS
-#endif
-
// the Q_TEMPLATE_EXTERN at the bottom of qvector.h will do the trick
#include <QtCore/qvector.h>
diff --git a/src/corelib/tools/qversionnumber.cpp b/src/corelib/tools/qversionnumber.cpp
index 58e3c15560..4aed715999 100644
--- a/src/corelib/tools/qversionnumber.cpp
+++ b/src/corelib/tools/qversionnumber.cpp
@@ -541,14 +541,14 @@ QDebug operator<<(QDebug debug, const QVersionNumber &version)
#endif
/*!
- \fn uint qHash(const QVersionNumber &key, uint seed)
+ \fn size_t qHash(const QVersionNumber &key, size_t seed)
\relates QHash
\since 5.6
Returns the hash value for the \a key, using \a seed to seed the
calculation.
*/
-uint qHash(const QVersionNumber &key, uint seed)
+size_t qHash(const QVersionNumber &key, size_t seed)
{
QtPrivate::QHashCombine hash;
for (int i = 0; i < key.segmentCount(); ++i)
@@ -556,5 +556,199 @@ uint qHash(const QVersionNumber &key, uint seed)
return seed;
}
-QT_END_NAMESPACE
+/*!
+ \class QTypeRevision
+ \inmodule QtCore
+ \since 6.0
+ \brief The QTypeRevision class contains a lightweight representation of
+ a version number with two 8-bit segments, major and minor, either
+ of which can be unknown.
+
+ Use this class to describe revisions of a type. Compatible revisions can be
+ expressed as increments of the minor version. Breaking changes can be
+ expressed as increments of the major version. The return values of
+ \l QMetaMethod::revision() and \l QMetaProperty::revision() can be passed to
+ \l QTypeRevision::fromEncodedVersion(). The resulting major and minor versions
+ specify in which Qt versions the properties and methods were added.
+
+ \sa QMetaMethod::revision(), QMetaProperty::revision()
+*/
+
+/*!
+ \fn template<typename Integer> static bool QTypeRevision::isValidSegment(Integer segment)
+
+ Returns true if the given number can be used as either major or minor
+ version in a QTypeRevision. Valid segments need to be \c {>= 0} and \c {< 255}.
+*/
+
+/*!
+ \fn QTypeRevision::QTypeRevision()
+
+ Produces an invalid revision.
+
+ \sa isValid()
+*/
+
+/*!
+ \fn template <typename Major, typename Minor> static QTypeRevision QTypeRevision::fromVersion(Major majorVersion, Minor minorVersion)
+
+ Produces a QTypeRevision from the given \a majorVersion and \a minorVersion,
+ both of which need to be a valid segments.
+
+ \sa isValidSegment()
+*/
+
+/*!
+ \fn template <typename Major> static QTypeRevision QTypeRevision::fromMajorVersion(Major majorVersion)
+
+ Produces a QTypeRevision from the given \a majorVersion with an invalid minor
+ version. \a majorVersion needs to be a valid segment.
+
+ \sa isValidSegment()
+*/
+
+/*!
+ \fn template <typename Minor> static QTypeRevision QTypeRevision::fromMinorVersion(Minor minorVersion)
+
+ Produces a QTypeRevision from the given \a minorVersion with an invalid major
+ version. \a minorVersion needs to be a valid segment.
+
+ \sa isValidSegment()
+*/
+
+/*!
+ \fn template <typename Integer> static QTypeRevision QTypeRevision::fromEncodedVersion(Integer value)
+
+ Produces a QTypeRevision from the given \a value. \a value encodes both the
+ minor and major versions in the least significant and second least
+ significant byte, respectively.
+
+ \a value must not have any bits outside the least significant two bytes set.
+ \c Integer needs to be at least 16 bits wide, and must not have a sign bit
+ in the least significant 16 bits.
+
+ \sa toEncodedVersion()
+*/
+
+/*!
+ \fn static QTypeRevision QTypeRevision::zero()
+
+ Produces a QTypeRevision with major and minor version \c{0}.
+*/
+
+/*!
+ \fn bool QTypeRevision::hasMajorVersion() const
+
+ Returns true if the major version is known, otherwise false.
+
+ \sa majorVersion(), hasMinorVersion()
+*/
+
+/*!
+ \fn quint8 QTypeRevision::majorVersion() const
+
+ Returns the major version encoded in the revision.
+
+ \sa hasMajorVersion(), minorVersion()
+*/
+
+/*!
+ \fn bool QTypeRevision::hasMinorVersion() const
+
+ Returns true if the minor version is known, otherwise false.
+
+ \sa minorVersion(), hasMajorVersion()
+*/
+/*!
+ \fn quint8 QTypeRevision::minorVersion() const
+
+ Returns the minor version encoded in the revision.
+
+ \sa hasMinorVersion(), majorVersion()
+*/
+
+/*!
+ \fn bool QTypeRevision::isValid() const
+
+ Returns true if the major version or the minor version is known,
+ otherwise false.
+
+ \sa hasMajorVersion(), hasMinorVersion()
+*/
+
+/*!
+ \fn template<typename Integer> Integer QTypeRevision::toEncodedVersion() const
+
+ Transforms the revision into an integer value, encoding the minor
+ version into the least significant byte, and the major version into
+ the second least significant byte.
+
+ \c Integer needs to be at least 16 bits wide, and must not have a sign bit
+ in the least significant 16 bits.
+
+ \sa fromEncodedVersion()
+*/
+
+#ifndef QT_NO_DATASTREAM
+/*!
+ \fn QDataStream& operator<<(QDataStream &out, const QTypeRevision &revision)
+ \relates QTypeRevision
+ \since 6.0
+
+ Writes the revision \a revision to stream \a out.
+ */
+QDataStream& operator<<(QDataStream &out, const QTypeRevision &revision)
+{
+ return out << revision.toEncodedVersion<quint16>();
+}
+
+/*!
+ \fn QDataStream& operator>>(QDataStream &in, QTypeRevision &revision)
+ \relates QTypeRevision
+ \since 6.0
+
+ Reads a revision from stream \a in and stores it in \a revision.
+ */
+QDataStream& operator>>(QDataStream &in, QTypeRevision &revision)
+{
+ quint16 value;
+ in >> value;
+ revision = QTypeRevision::fromEncodedVersion(value);
+ return in;
+}
+#endif
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug debug, const QTypeRevision &revision)
+{
+ QDebugStateSaver saver(debug);
+ if (revision.hasMajorVersion()) {
+ if (revision.hasMinorVersion())
+ debug.nospace() << revision.majorVersion() << '.' << revision.minorVersion();
+ else
+ debug.nospace().noquote() << revision.majorVersion() << ".x";
+ } else {
+ if (revision.hasMinorVersion())
+ debug << revision.minorVersion();
+ else
+ debug.noquote() << "invalid";
+ }
+ return debug;
+}
+#endif
+
+/*!
+ \fn size_t qHash(const QTypeRevision &key, size_t seed)
+ \relates QHash
+ \since 6.0
+
+ Returns the hash value for the \a key, using \a seed to seed the
+ calculation.
+*/
+size_t qHash(const QTypeRevision &key, size_t seed)
+{
+ return qHash(key.toEncodedVersion<quint16>(), seed);
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qversionnumber.h b/src/corelib/tools/qversionnumber.h
index d43b86ba51..184aeac692 100644
--- a/src/corelib/tools/qversionnumber.h
+++ b/src/corelib/tools/qversionnumber.h
@@ -47,11 +47,12 @@
#include <QtCore/qvector.h>
#include <QtCore/qmetatype.h>
#include <QtCore/qtypeinfo.h>
+#include <limits>
QT_BEGIN_NAMESPACE
class QVersionNumber;
-Q_CORE_EXPORT uint qHash(const QVersionNumber &key, uint seed = 0);
+Q_CORE_EXPORT size_t qHash(const QVersionNumber &key, size_t seed = 0);
#ifndef QT_NO_DATASTREAM
Q_CORE_EXPORT QDataStream& operator<<(QDataStream &out, const QVersionNumber &version);
@@ -282,7 +283,7 @@ private:
#ifndef QT_NO_DATASTREAM
friend Q_CORE_EXPORT QDataStream& operator>>(QDataStream &in, QVersionNumber &version);
#endif
- friend Q_CORE_EXPORT uint qHash(const QVersionNumber &key, uint seed);
+ friend Q_CORE_EXPORT size_t qHash(const QVersionNumber &key, size_t seed);
};
Q_DECLARE_TYPEINFO(QVersionNumber, Q_MOVABLE_TYPE);
@@ -309,8 +310,160 @@ Q_REQUIRED_RESULT inline bool operator==(const QVersionNumber &lhs, const QVersi
Q_REQUIRED_RESULT inline bool operator!=(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
{ return QVersionNumber::compare(lhs, rhs) != 0; }
+class QTypeRevision;
+Q_CORE_EXPORT size_t qHash(const QTypeRevision &key, size_t seed = 0);
+
+#ifndef QT_NO_DATASTREAM
+Q_CORE_EXPORT QDataStream& operator<<(QDataStream &out, const QTypeRevision &revision);
+Q_CORE_EXPORT QDataStream& operator>>(QDataStream &in, QTypeRevision &revision);
+#endif
+
+class QTypeRevision
+{
+public:
+ template<typename Integer>
+ using if_valid_segment_type = typename std::enable_if<
+ std::is_integral<Integer>::value, bool>::type;
+
+ template<typename Integer>
+ using if_valid_value_type = typename std::enable_if<
+ std::is_integral<Integer>::value
+ && (sizeof(Integer) > sizeof(quint16)
+ || (sizeof(Integer) == sizeof(quint16)
+ && !std::is_signed<Integer>::value)), bool>::type;
+
+ template<typename Integer, if_valid_segment_type<Integer> = true>
+ static constexpr bool isValidSegment(Integer segment)
+ {
+ // using extra parentheses around max to avoid expanding it if it is a macro
+ return segment >= Integer(0)
+ && ((std::numeric_limits<Integer>::max)() < Integer(SegmentUnknown)
+ || segment < Integer(SegmentUnknown));
+ }
+
+ template<typename Major, typename Minor,
+ if_valid_segment_type<Major> = true,
+ if_valid_segment_type<Minor> = true>
+ static constexpr QTypeRevision fromVersion(Major majorVersion, Minor minorVersion)
+ {
+ return Q_ASSERT(isValidSegment(majorVersion)),
+ Q_ASSERT(isValidSegment(minorVersion)),
+ QTypeRevision(quint8(majorVersion), quint8(minorVersion));
+ }
+
+ template<typename Major, if_valid_segment_type<Major> = true>
+ static constexpr QTypeRevision fromMajorVersion(Major majorVersion)
+ {
+ return Q_ASSERT(isValidSegment(majorVersion)),
+ QTypeRevision(quint8(majorVersion), SegmentUnknown);
+ }
+
+ template<typename Minor, if_valid_segment_type<Minor> = true>
+ static constexpr QTypeRevision fromMinorVersion(Minor minorVersion)
+ {
+ return Q_ASSERT(isValidSegment(minorVersion)),
+ QTypeRevision(SegmentUnknown, quint8(minorVersion));
+ }
+
+ template<typename Integer, if_valid_value_type<Integer> = true>
+ static constexpr QTypeRevision fromEncodedVersion(Integer value)
+ {
+ return Q_ASSERT((value & ~Integer(0xffff)) == Integer(0)),
+ QTypeRevision((value & Integer(0xff00)) >> 8, value & Integer(0xff));
+ }
+
+ static constexpr QTypeRevision zero() { return QTypeRevision(0, 0); }
+
+ constexpr QTypeRevision() = default;
+
+ constexpr bool hasMajorVersion() const { return m_majorVersion != SegmentUnknown; }
+ constexpr quint8 majorVersion() const { return m_majorVersion; }
+
+ constexpr bool hasMinorVersion() const { return m_minorVersion != SegmentUnknown; }
+ constexpr quint8 minorVersion() const { return m_minorVersion; }
+
+ constexpr bool isValid() const { return hasMajorVersion() || hasMinorVersion(); }
+
+ template<typename Integer, if_valid_value_type<Integer> = true>
+ constexpr Integer toEncodedVersion() const
+ {
+ return Integer(m_majorVersion << 8) | Integer(m_minorVersion);
+ }
+
+private:
+ enum { SegmentUnknown = quint8(~0U) };
+
+#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ constexpr QTypeRevision(quint8 major, quint8 minor)
+ : m_minorVersion(minor), m_majorVersion(major) {}
+
+ quint8 m_minorVersion = SegmentUnknown;
+ quint8 m_majorVersion = SegmentUnknown;
+#else
+ constexpr QTypeRevision(quint8 major, quint8 minor)
+ : m_majorVersion(major), m_minorVersion(minor) {}
+
+ quint8 m_majorVersion = SegmentUnknown;
+ quint8 m_minorVersion = SegmentUnknown;
+#endif
+};
+
+inline constexpr bool operator==(QTypeRevision lhs, QTypeRevision rhs)
+{
+ return lhs.toEncodedVersion<quint16>() == rhs.toEncodedVersion<quint16>();
+}
+
+inline constexpr bool operator!=(QTypeRevision lhs, QTypeRevision rhs)
+{
+ return lhs.toEncodedVersion<quint16>() != rhs.toEncodedVersion<quint16>();
+}
+
+inline constexpr bool operator<(QTypeRevision lhs, QTypeRevision rhs)
+{
+ return (!lhs.hasMajorVersion() && rhs.hasMajorVersion())
+ // non-0 major > unspecified major > major 0
+ ? rhs.majorVersion() != 0
+ : ((lhs.hasMajorVersion() && !rhs.hasMajorVersion())
+ // major 0 < unspecified major < non-0 major
+ ? lhs.majorVersion() == 0
+ : (lhs.majorVersion() != rhs.majorVersion()
+ // both majors specified and non-0
+ ? lhs.majorVersion() < rhs.majorVersion()
+ : ((!lhs.hasMinorVersion() && rhs.hasMinorVersion())
+ // non-0 minor > unspecified minor > minor 0
+ ? rhs.minorVersion() != 0
+ : ((lhs.hasMinorVersion() && !rhs.hasMinorVersion())
+ // minor 0 < unspecified minor < non-0 minor
+ ? lhs.minorVersion() == 0
+ // both minors specified and non-0
+ : lhs.minorVersion() < rhs.minorVersion()))));
+}
+
+inline constexpr bool operator>(QTypeRevision lhs, QTypeRevision rhs)
+{
+ return lhs != rhs && !(lhs < rhs);
+}
+
+inline constexpr bool operator<=(QTypeRevision lhs, QTypeRevision rhs)
+{
+ return lhs == rhs || lhs < rhs;
+}
+
+inline constexpr bool operator>=(QTypeRevision lhs, QTypeRevision rhs)
+{
+ return lhs == rhs || !(lhs < rhs);
+}
+
+Q_STATIC_ASSERT(sizeof(QTypeRevision) == 2);
+Q_DECLARE_TYPEINFO(QTypeRevision, Q_MOVABLE_TYPE);
+
+#ifndef QT_NO_DEBUG_STREAM
+Q_CORE_EXPORT QDebug operator<<(QDebug, const QTypeRevision &revision);
+#endif
+
QT_END_NAMESPACE
Q_DECLARE_METATYPE(QVersionNumber)
+Q_DECLARE_METATYPE(QTypeRevision)
#endif //QVERSIONNUMBER_H
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index e078ab4409..607a6eaf06 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -13,12 +13,12 @@ HEADERS += \
tools/qcontainertools_impl.h \
tools/qcryptographichash.h \
tools/qduplicatetracker_p.h \
+ tools/qflatmap_p.h \
tools/qfreelist_p.h \
tools/qhash.h \
tools/qhashfunctions.h \
tools/qiterator.h \
tools/qline.h \
- tools/qlinkedlist.h \
tools/qlist.h \
tools/qmakearray_p.h \
tools/qmap.h \
@@ -40,15 +40,14 @@ HEADERS += \
tools/qsharedpointer.h \
tools/qsharedpointer_impl.h \
tools/qset.h \
- tools/qsimd_p.h \
tools/qsize.h \
tools/qstack.h \
tools/qtools_p.h \
+ tools/qtaggedpointer.h \
tools/qvarlengtharray.h \
tools/qvector.h \
tools/qversionnumber.h
-
SOURCES += \
tools/qarraydata.cpp \
tools/qbitarray.cpp \
@@ -56,7 +55,6 @@ SOURCES += \
tools/qfreelist.cpp \
tools/qhash.cpp \
tools/qline.cpp \
- tools/qlinkedlist.cpp \
tools/qlist.cpp \
tools/qpoint.cpp \
tools/qmap.cpp \
@@ -68,7 +66,6 @@ SOURCES += \
tools/qringbuffer.cpp \
tools/qshareddata.cpp \
tools/qsharedpointer.cpp \
- tools/qsimd.cpp \
tools/qsize.cpp \
tools/qversionnumber.cpp
diff --git a/src/dbus/.prev_CMakeLists.txt b/src/dbus/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..1136ebe19b
--- /dev/null
+++ b/src/dbus/.prev_CMakeLists.txt
@@ -0,0 +1,76 @@
+# Generated from dbus.pro.
+
+#####################################################################
+## DBus Module:
+#####################################################################
+
+qt_add_module(DBus
+ QMAKE_MODULE_CONFIG dbusadaptors dbusinterfaces
+ SOURCES
+ dbus_minimal_p.h
+ qdbus_symbols.cpp qdbus_symbols_p.h
+ qdbusabstractadaptor.cpp qdbusabstractadaptor.h qdbusabstractadaptor_p.h
+ qdbusabstractinterface.cpp qdbusabstractinterface.h qdbusabstractinterface_p.h
+ qdbusargument.cpp qdbusargument.h qdbusargument_p.h
+ qdbusconnection.cpp qdbusconnection.h qdbusconnection_p.h
+ qdbusconnectioninterface.cpp qdbusconnectioninterface.h
+ qdbusconnectionmanager_p.h
+ qdbuscontext.cpp qdbuscontext.h qdbuscontext_p.h
+ qdbuserror.cpp qdbuserror.h
+ qdbusextratypes.cpp qdbusextratypes.h
+ qdbusintegrator.cpp qdbusintegrator_p.h
+ qdbusinterface.cpp qdbusinterface.h qdbusinterface_p.h
+ qdbusinternalfilters.cpp
+ qdbusintrospection.cpp qdbusintrospection_p.h
+ qdbusmarshaller.cpp
+ qdbusmessage.cpp qdbusmessage.h qdbusmessage_p.h
+ qdbusmetaobject.cpp
+ qdbusmetatype.cpp qdbusmetatype.h
+ qdbusmisc.cpp
+ qdbuspendingcall.cpp qdbuspendingcall.h qdbuspendingcall_p.h
+ qdbuspendingreply.cpp qdbuspendingreply.h
+ qdbusreply.cpp qdbusreply.h
+ qdbusserver.cpp qdbusserver.h
+ qdbusservicewatcher.cpp qdbusservicewatcher.h
+ qdbusthreaddebug_p.h
+ qdbusunixfiledescriptor.cpp qdbusunixfiledescriptor.h
+ qdbusutil.cpp qdbusutil_p.h
+ qdbusvirtualobject.cpp qdbusvirtualobject.h
+ qdbusxmlgenerator.cpp
+ qdbusxmlparser.cpp qdbusxmlparser_p.h
+ qtdbusglobal.h qtdbusglobal_p.h
+ DEFINES
+ DBUS_API_SUBJECT_TO_CHANGE
+ QT_NO_FOREACH
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+)
+
+#### Keys ignored in scope 1:.:.:dbus.pro:<TRUE>:
+# MODULE_CONFIG = "dbusadaptors" "dbusinterfaces"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(DBus CONDITION QT_FEATURE_dbus_linked
+ DEFINES
+ QT_LINKED_LIBDBUS
+ LIBRARIES
+ dbus-1
+)
+
+qt_extend_target(DBus CONDITION WIN32
+ LIBRARIES
+ advapi32
+ netapi32
+ user32
+ ws2_32
+)
+qt_add_docs(DBus
+ doc/qtdbus.qdocconf
+)
+
diff --git a/src/dbus/CMakeLists.txt b/src/dbus/CMakeLists.txt
new file mode 100644
index 0000000000..ea1d7abaa1
--- /dev/null
+++ b/src/dbus/CMakeLists.txt
@@ -0,0 +1,79 @@
+# Generated from dbus.pro.
+
+#####################################################################
+## DBus Module:
+#####################################################################
+
+qt_add_module(DBus
+ QMAKE_MODULE_CONFIG dbusadaptors dbusinterfaces
+ SOURCES
+ dbus_minimal_p.h
+ qdbus_symbols.cpp qdbus_symbols_p.h
+ qdbusabstractadaptor.cpp qdbusabstractadaptor.h qdbusabstractadaptor_p.h
+ qdbusabstractinterface.cpp qdbusabstractinterface.h qdbusabstractinterface_p.h
+ qdbusargument.cpp qdbusargument.h qdbusargument_p.h
+ qdbusconnection.cpp qdbusconnection.h qdbusconnection_p.h
+ qdbusconnectioninterface.cpp qdbusconnectioninterface.h
+ qdbusconnectionmanager_p.h
+ qdbuscontext.cpp qdbuscontext.h qdbuscontext_p.h
+ qdbuserror.cpp qdbuserror.h
+ qdbusextratypes.cpp qdbusextratypes.h
+ qdbusintegrator.cpp qdbusintegrator_p.h
+ qdbusinterface.cpp qdbusinterface.h qdbusinterface_p.h
+ qdbusinternalfilters.cpp
+ qdbusintrospection.cpp qdbusintrospection_p.h
+ qdbusmarshaller.cpp
+ qdbusmessage.cpp qdbusmessage.h qdbusmessage_p.h
+ qdbusmetaobject.cpp
+ qdbusmetatype.cpp qdbusmetatype.h
+ qdbusmisc.cpp
+ qdbuspendingcall.cpp qdbuspendingcall.h qdbuspendingcall_p.h
+ qdbuspendingreply.cpp qdbuspendingreply.h
+ qdbusreply.cpp qdbusreply.h
+ qdbusserver.cpp qdbusserver.h
+ qdbusservicewatcher.cpp qdbusservicewatcher.h
+ qdbusthreaddebug_p.h
+ qdbusunixfiledescriptor.cpp qdbusunixfiledescriptor.h
+ qdbusutil.cpp qdbusutil_p.h
+ qdbusvirtualobject.cpp qdbusvirtualobject.h
+ qdbusxmlgenerator.cpp
+ qdbusxmlparser.cpp qdbusxmlparser_p.h
+ qtdbusglobal.h qtdbusglobal_p.h
+ DEFINES
+ DBUS_API_SUBJECT_TO_CHANGE
+ QT_NO_FOREACH
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+)
+
+set_source_files_properties(qdbusmarshaller.cpp
+ PROPERTIES HEADER_FILE_ONLY ON) # special case: This file is included by qdbusargument.cpp
+
+#### Keys ignored in scope 1:.:.:dbus.pro:<TRUE>:
+# MODULE_CONFIG = "dbusadaptors" "dbusinterfaces"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(DBus CONDITION QT_FEATURE_dbus_linked
+ DEFINES
+ QT_LINKED_LIBDBUS
+ LIBRARIES
+ dbus-1
+)
+
+qt_extend_target(DBus CONDITION WIN32
+ LIBRARIES
+ advapi32
+ netapi32
+ user32
+ ws2_32
+)
+qt_add_docs(DBus
+ doc/qtdbus.qdocconf
+)
+
diff --git a/src/dbus/Qt5DBusConfigExtras.cmake.in b/src/dbus/Qt5DBusConfigExtras.cmake.in
deleted file mode 100644
index a814678f7b..0000000000
--- a/src/dbus/Qt5DBusConfigExtras.cmake.in
+++ /dev/null
@@ -1,44 +0,0 @@
-
-if (NOT TARGET Qt5::qdbuscpp2xml)
- add_executable(Qt5::qdbuscpp2xml IMPORTED)
-
-!!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
- set(imported_location \"${_qt5DBus_install_prefix}/$${CMAKE_BIN_DIR}qdbuscpp2xml$$CMAKE_BIN_SUFFIX\")
-!!ELSE
- set(imported_location \"$${CMAKE_BIN_DIR}qdbuscpp2xml$$CMAKE_BIN_SUFFIX\")
-!!ENDIF
- _qt5_DBus_check_file_exists(${imported_location})
-
- set_target_properties(Qt5::qdbuscpp2xml PROPERTIES
- IMPORTED_LOCATION ${imported_location}
- )
-endif()
-
-if (NOT TARGET Qt5::qdbusxml2cpp)
- add_executable(Qt5::qdbusxml2cpp IMPORTED)
-
-!!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
- set(imported_location \"${_qt5DBus_install_prefix}/$${CMAKE_BIN_DIR}qdbusxml2cpp$$CMAKE_BIN_SUFFIX\")
-!!ELSE
- set(imported_location \"$${CMAKE_BIN_DIR}qdbusxml2cpp$$CMAKE_BIN_SUFFIX\")
-!!ENDIF
- _qt5_DBus_check_file_exists(${imported_location})
-
- set_target_properties(Qt5::qdbusxml2cpp PROPERTIES
- IMPORTED_LOCATION ${imported_location}
- )
-endif()
-
-set(Qt5DBus_QDBUSCPP2XML_EXECUTABLE Qt5::qdbuscpp2xml)
-set(Qt5DBus_QDBUSXML2CPP_EXECUTABLE Qt5::qdbusxml2cpp)
-
-# Create versionless tool targets.
-foreach(__qt_tool qdbuscpp2xml qdbusxml2cpp)
- if(NOT \"${QT_NO_CREATE_VERSIONLESS_TARGETS}\" AND NOT TARGET Qt::${__qt_tool}
- AND TARGET Qt5::${__qt_tool})
- add_executable(Qt::${__qt_tool} IMPORTED)
- get_target_property(__qt_imported_location Qt5::${__qt_tool} IMPORTED_LOCATION)
- set_target_properties(Qt::${__qt_tool}
- PROPERTIES IMPORTED_LOCATION \"${__qt_imported_location}\")
- endif()
-endforeach()
diff --git a/src/dbus/Qt5DBusMacros.cmake b/src/dbus/Qt5DBusMacros.cmake
deleted file mode 100644
index 1cacccdddd..0000000000
--- a/src/dbus/Qt5DBusMacros.cmake
+++ /dev/null
@@ -1,197 +0,0 @@
-#=============================================================================
-# Copyright 2005-2011 Kitware, Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# * Neither the name of Kitware, Inc. nor the names of its
-# contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#=============================================================================
-
-include(MacroAddFileDependencies)
-
-include(CMakeParseArguments)
-
-function(qt5_add_dbus_interface _sources _interface _basename)
- get_filename_component(_infile ${_interface} ABSOLUTE)
- set(_header "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h")
- set(_impl "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp")
- set(_moc "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc")
-
- get_source_file_property(_nonamespace ${_interface} NO_NAMESPACE)
- if(_nonamespace)
- set(_params -N -m)
- else()
- set(_params -m)
- endif()
-
- get_source_file_property(_classname ${_interface} CLASSNAME)
- if(_classname)
- set(_params ${_params} -c ${_classname})
- endif()
-
- get_source_file_property(_include ${_interface} INCLUDE)
- if(_include)
- set(_params ${_params} -i ${_include})
- endif()
-
- add_custom_command(OUTPUT "${_impl}" "${_header}"
- COMMAND ${Qt5DBus_QDBUSXML2CPP_EXECUTABLE} ${_params} -p ${_basename} ${_infile}
- DEPENDS ${_infile} VERBATIM)
-
- set_source_files_properties("${_impl}" "${_header}" PROPERTIES SKIP_AUTOMOC TRUE)
-
- qt5_generate_moc("${_header}" "${_moc}")
-
- list(APPEND ${_sources} "${_impl}" "${_header}" "${_moc}")
- macro_add_file_dependencies("${_impl}" "${_moc}")
- set(${_sources} ${${_sources}} PARENT_SCOPE)
-endfunction()
-
-if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
- function(qt_add_dbus_interface sources)
- if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
- qt5_add_dbus_interface("${sources}" ${ARGN})
- elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
- qt6_add_dbus_interface("${sources}" ${ARGN})
- endif()
- set("${sources}" "${${sources}}" PARENT_SCOPE)
- endfunction()
-endif()
-
-
-function(qt5_add_dbus_interfaces _sources)
- foreach(_current_FILE ${ARGN})
- get_filename_component(_infile ${_current_FILE} ABSOLUTE)
- get_filename_component(_basename ${_current_FILE} NAME)
- # get the part before the ".xml" suffix
- string(TOLOWER ${_basename} _basename)
- string(REGEX REPLACE "(.*\\.)?([^\\.]+)\\.xml" "\\2" _basename ${_basename})
- qt5_add_dbus_interface(${_sources} ${_infile} ${_basename}interface)
- endforeach()
- set(${_sources} ${${_sources}} PARENT_SCOPE)
-endfunction()
-
-if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
- function(qt_add_dbus_interfaces sources)
- if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
- qt5_add_dbus_interfaces("${sources}" ${ARGN})
- elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
- qt6_add_dbus_interfaces("${sources}" ${ARGN})
- endif()
- set("${sources}" "${${sources}}" PARENT_SCOPE)
- endfunction()
-endif()
-
-
-function(qt5_generate_dbus_interface _header) # _customName OPTIONS -some -options )
- set(options)
- set(oneValueArgs)
- set(multiValueArgs OPTIONS)
-
- cmake_parse_arguments(_DBUS_INTERFACE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
-
- set(_customName ${_DBUS_INTERFACE_UNPARSED_ARGUMENTS})
-
- get_filename_component(_in_file ${_header} ABSOLUTE)
- get_filename_component(_basename ${_header} NAME_WE)
-
- if(_customName)
- if(IS_ABSOLUTE ${_customName})
- get_filename_component(_containingDir ${_customName} PATH)
- if(NOT EXISTS ${_containingDir})
- file(MAKE_DIRECTORY "${_containingDir}")
- endif()
- set(_target ${_customName})
- else()
- set(_target ${CMAKE_CURRENT_BINARY_DIR}/${_customName})
- endif()
- else()
- set(_target ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.xml)
- endif()
-
- add_custom_command(OUTPUT ${_target}
- COMMAND ${Qt5DBus_QDBUSCPP2XML_EXECUTABLE} ${_DBUS_INTERFACE_OPTIONS} ${_in_file} -o ${_target}
- DEPENDS ${_in_file} VERBATIM
- )
-endfunction()
-
-if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
- function(qt_generate_dbus_interface)
- if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
- qt5_generate_dbus_interface(${ARGV})
- elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
- qt6_generate_dbus_interface(${ARGV})
- endif()
- endfunction()
-endif()
-
-
-function(qt5_add_dbus_adaptor _sources _xml_file _include _parentClass) # _optionalBasename _optionalClassName)
- get_filename_component(_infile ${_xml_file} ABSOLUTE)
-
- set(_optionalBasename "${ARGV4}")
- if(_optionalBasename)
- set(_basename ${_optionalBasename} )
- else()
- string(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2adaptor" _basename ${_infile})
- string(TOLOWER ${_basename} _basename)
- endif()
-
- set(_optionalClassName "${ARGV5}")
- set(_header "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h")
- set(_impl "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp")
- set(_moc "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc")
-
- if(_optionalClassName)
- add_custom_command(OUTPUT "${_impl}" "${_header}"
- COMMAND ${Qt5DBus_QDBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -c ${_optionalClassName} -i ${_include} -l ${_parentClass} ${_infile}
- DEPENDS ${_infile} VERBATIM
- )
- else()
- add_custom_command(OUTPUT "${_impl}" "${_header}"
- COMMAND ${Qt5DBus_QDBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -i ${_include} -l ${_parentClass} ${_infile}
- DEPENDS ${_infile} VERBATIM
- )
- endif()
-
- qt5_generate_moc("${_header}" "${_moc}")
- set_source_files_properties("${_impl}" "${_header}" PROPERTIES SKIP_AUTOMOC TRUE)
- macro_add_file_dependencies("${_impl}" "${_moc}")
-
- list(APPEND ${_sources} "${_impl}" "${_header}" "${_moc}")
- set(${_sources} ${${_sources}} PARENT_SCOPE)
-endfunction()
-
-if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
- function(qt_add_dbus_adaptor sources)
- if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
- qt5_add_dbus_adaptor("${sources}" ${ARGN})
- elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
- qt6_add_dbus_adaptor("${sources}" ${ARGN})
- endif()
- set("${sources}" "${${sources}}" PARENT_SCOPE)
- endfunction()
-endif()
diff --git a/src/dbus/Qt6DBusMacros.cmake b/src/dbus/Qt6DBusMacros.cmake
new file mode 100644
index 0000000000..d7bba30148
--- /dev/null
+++ b/src/dbus/Qt6DBusMacros.cmake
@@ -0,0 +1,202 @@
+#=============================================================================
+# Copyright 2005-2011 Kitware, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# * Neither the name of Kitware, Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#=============================================================================
+
+include(MacroAddFileDependencies)
+
+include(CMakeParseArguments)
+
+function(qt6_add_dbus_interface _sources _interface _basename)
+ get_filename_component(_infile ${_interface} ABSOLUTE)
+ set(_header "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h")
+ set(_impl "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp")
+ set(_moc "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc")
+
+ get_source_file_property(_nonamespace ${_interface} NO_NAMESPACE)
+ if(_nonamespace)
+ set(_params -N -m)
+ else()
+ set(_params -m)
+ endif()
+
+ get_source_file_property(_classname ${_interface} CLASSNAME)
+ if(_classname)
+ set(_params ${_params} -c ${_classname})
+ endif()
+
+ get_source_file_property(_include ${_interface} INCLUDE)
+ if(_include)
+ set(_params ${_params} -i ${_include})
+ endif()
+
+ add_custom_command(OUTPUT "${_impl}" "${_header}"
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::qdbusxml2cpp ${_params} -p ${_basename} ${_infile}
+ DEPENDS ${_infile} ${QT_CMAKE_EXPORT_NAMESPACE}::qdbuscpp2xml
+ VERBATIM
+ )
+
+ set_source_files_properties("${_impl}" "${_header}" PROPERTIES SKIP_AUTOMOC TRUE)
+
+ qt6_generate_moc("${_header}" "${_moc}")
+
+ list(APPEND ${_sources} "${_impl}" "${_header}" "${_moc}")
+ macro_add_file_dependencies("${_impl}" "${_moc}")
+ set(${_sources} ${${_sources}} PARENT_SCOPE)
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_add_dbus_interface sources)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_add_dbus_interface("${sources}" ${ARGN})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_add_dbus_interface("${sources}" ${ARGN})
+ endif()
+ set("${sources}" "${${sources}}" PARENT_SCOPE)
+ endfunction()
+endif()
+
+
+function(qt6_add_dbus_interfaces _sources)
+ foreach(_current_FILE ${ARGN})
+ get_filename_component(_infile ${_current_FILE} ABSOLUTE)
+ get_filename_component(_basename ${_current_FILE} NAME)
+ # get the part before the ".xml" suffix
+ string(TOLOWER ${_basename} _basename)
+ string(REGEX REPLACE "(.*\\.)?([^\\.]+)\\.xml" "\\2" _basename ${_basename})
+ qt6_add_dbus_interface(${_sources} ${_infile} ${_basename}interface)
+ endforeach()
+ set(${_sources} ${${_sources}} PARENT_SCOPE)
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_add_dbus_interfaces sources)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_add_dbus_interfaces("${sources}" ${ARGN})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_add_dbus_interfaces("${sources}" ${ARGN})
+ endif()
+ set("${sources}" "${${sources}}" PARENT_SCOPE)
+ endfunction()
+endif()
+
+
+function(qt6_generate_dbus_interface _header) # _customName OPTIONS -some -options )
+ set(options)
+ set(oneValueArgs)
+ set(multiValueArgs OPTIONS)
+
+ cmake_parse_arguments(_DBUS_INTERFACE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+ set(_customName ${_DBUS_INTERFACE_UNPARSED_ARGUMENTS})
+
+ get_filename_component(_in_file ${_header} ABSOLUTE)
+ get_filename_component(_basename ${_header} NAME_WE)
+
+ if(_customName)
+ if(IS_ABSOLUTE ${_customName})
+ get_filename_component(_containingDir ${_customName} PATH)
+ if(NOT EXISTS ${_containingDir})
+ file(MAKE_DIRECTORY "${_containingDir}")
+ endif()
+ set(_target ${_customName})
+ else()
+ set(_target ${CMAKE_CURRENT_BINARY_DIR}/${_customName})
+ endif()
+ else()
+ set(_target ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.xml)
+ endif()
+
+ add_custom_command(OUTPUT ${_target}
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::qdbuscpp2xml ${_DBUS_INTERFACE_OPTIONS} ${_in_file} -o ${_target}
+ DEPENDS ${_in_file} ${QT_CMAKE_EXPORT_NAMESPACE}::qdbuscpp2xml
+ VERBATIM
+ )
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_generate_dbus_interface)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_generate_dbus_interface(${ARGV})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_generate_dbus_interface(${ARGV})
+ endif()
+ endfunction()
+endif()
+
+
+function(qt6_add_dbus_adaptor _sources _xml_file _include _parentClass) # _optionalBasename _optionalClassName)
+ get_filename_component(_infile ${_xml_file} ABSOLUTE)
+
+ set(_optionalBasename "${ARGV4}")
+ if(_optionalBasename)
+ set(_basename ${_optionalBasename} )
+ else()
+ string(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2adaptor" _basename ${_infile})
+ string(TOLOWER ${_basename} _basename)
+ endif()
+
+ set(_optionalClassName "${ARGV5}")
+ set(_header "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h")
+ set(_impl "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp")
+ set(_moc "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc")
+
+ if(_optionalClassName)
+ add_custom_command(OUTPUT "${_impl}" "${_header}"
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::qdbusxml2cpp -m -a ${_basename} -c ${_optionalClassName} -i ${_include} -l ${_parentClass} ${_infile}
+ DEPENDS ${_infile} ${QT_CMAKE_EXPORT_NAMESPACE}::qdbuscpp2xml
+ VERBATIM
+ )
+ else()
+ add_custom_command(OUTPUT "${_impl}" "${_header}"
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::qdbusxml2cpp -m -a ${_basename} -i ${_include} -l ${_parentClass} ${_infile}
+ DEPENDS ${_infile} ${QT_CMAKE_EXPORT_NAMESPACE}::qdbuscpp2xml
+ VERBATIM
+ )
+ endif()
+
+ qt6_generate_moc("${_header}" "${_moc}")
+ set_source_files_properties("${_impl}" "${_header}" PROPERTIES SKIP_AUTOMOC TRUE)
+ macro_add_file_dependencies("${_impl}" "${_moc}")
+
+ list(APPEND ${_sources} "${_impl}" "${_header}" "${_moc}")
+ set(${_sources} ${${_sources}} PARENT_SCOPE)
+endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_add_dbus_adaptor sources)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_add_dbus_adaptor("${sources}" ${ARGN})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_add_dbus_adaptor("${sources}" ${ARGN})
+ endif()
+ set("${sources}" "${${sources}}" PARENT_SCOPE)
+ endfunction()
+endif()
diff --git a/src/dbus/doc/snippets/code/doc_src_qdbusadaptors.cpp b/src/dbus/doc/snippets/code/doc_src_qdbusadaptors.cpp
index 0fc7a2b26c..f5d9fe7889 100644
--- a/src/dbus/doc/snippets/code/doc_src_qdbusadaptors.cpp
+++ b/src/dbus/doc/snippets/code/doc_src_qdbusadaptors.cpp
@@ -62,7 +62,6 @@ QString processRequest(const QString &request, const QDBusMessage &message)
data->request = request;
message.setDelayedReply(true);
data->reply = message.createReply();
- QDBusConnection::sessionBus().send(data->reply);
appendRequest(data);
return QString();
diff --git a/src/dbus/doc/src/dbus-adaptors.qdoc b/src/dbus/doc/src/dbus-adaptors.qdoc
index 496e36ea92..d2a5ac27a8 100644
--- a/src/dbus/doc/src/dbus-adaptors.qdoc
+++ b/src/dbus/doc/src/dbus-adaptors.qdoc
@@ -173,9 +173,6 @@
\snippet code/doc_src_qdbusadaptors.cpp 10
- The use of
- \l{QDBusConnection::send()}{QDBusConnection::sessionBus().send(data->reply)}
- is needed to explicitly inform the caller that the response will be delayed.
In this case, the return value is unimportant; we return an arbitrary value
to satisfy the compiler.
diff --git a/src/dbus/qdbusabstractadaptor.cpp b/src/dbus/qdbusabstractadaptor.cpp
index bf0e33e26e..671f7f25d0 100644
--- a/src/dbus/qdbusabstractadaptor.cpp
+++ b/src/dbus/qdbusabstractadaptor.cpp
@@ -276,11 +276,11 @@ void QDBusAdaptorConnector::polish()
std::sort(adaptors.begin(), adaptors.end());
}
-void QDBusAdaptorConnector::relaySlot(void **argv)
+void QDBusAdaptorConnector::relaySlot(QMethodRawArguments argv)
{
QObject *sndr = sender();
if (Q_LIKELY(sndr)) {
- relay(sndr, senderSignalIndex(), argv);
+ relay(sndr, senderSignalIndex(), argv.arguments);
} else {
qWarning("QtDBus: cannot relay signals from parent %s(%p \"%s\") unless they are emitted in the object's thread %s(%p \"%s\"). "
"Current thread is %s(%p \"%s\").",
@@ -333,120 +333,6 @@ void QDBusAdaptorConnector::relay(QObject *senderObj, int lastSignalIdx, void **
emit relaySignal(realObject, senderMetaObject, lastSignalIdx, args);
}
-// our Meta Object
-// modify carefully: this has been hand-edited!
-// the relaySlot slot gets called with the void** array
-
-struct qt_meta_stringdata_QDBusAdaptorConnector_t {
- QByteArrayData data[10];
- char stringdata[96];
-};
-#define QT_MOC_LITERAL(idx, ofs, len) \
- Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
- offsetof(qt_meta_stringdata_QDBusAdaptorConnector_t, stringdata) + ofs \
- - idx * sizeof(QByteArrayData) \
- )
-static const qt_meta_stringdata_QDBusAdaptorConnector_t qt_meta_stringdata_QDBusAdaptorConnector = {
- {
-QT_MOC_LITERAL(0, 0, 21),
-QT_MOC_LITERAL(1, 22, 11),
-QT_MOC_LITERAL(2, 34, 0),
-QT_MOC_LITERAL(3, 35, 3),
-QT_MOC_LITERAL(4, 39, 18),
-QT_MOC_LITERAL(5, 58, 10),
-QT_MOC_LITERAL(6, 69, 3),
-QT_MOC_LITERAL(7, 73, 4),
-QT_MOC_LITERAL(8, 78, 9),
-QT_MOC_LITERAL(9, 88, 6)
- },
- "QDBusAdaptorConnector\0relaySignal\0\0"
- "obj\0const QMetaObject*\0metaObject\0sid\0"
- "args\0relaySlot\0polish\0"
-};
-#undef QT_MOC_LITERAL
-
-static const uint qt_meta_data_QDBusAdaptorConnector[] = {
-
- // content:
- 7, // revision
- 0, // classname
- 0, 0, // classinfo
- 3, 14, // methods
- 0, 0, // properties
- 0, 0, // enums/sets
- 0, 0, // constructors
- 0, // flags
- 1, // signalCount
-
- // signals: name, argc, parameters, tag, flags
- 1, 4, 29, 2, 0x05,
-
- // slots: name, argc, parameters, tag, flags
- 8, 0, 38, 2, 0x0a,
- 9, 0, 39, 2, 0x0a,
-
- // signals: parameters
- QMetaType::Void, QMetaType::QObjectStar, 0x80000000 | 4, QMetaType::Int, QMetaType::QVariantList, 3, 5, 6, 7,
-
- // slots: parameters
- QMetaType::Void,
- QMetaType::Void,
-
- 0 // eod
-};
-
-void QDBusAdaptorConnector::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
-{
- if (_c == QMetaObject::InvokeMetaMethod) {
- Q_ASSERT(staticMetaObject.cast(_o));
- QDBusAdaptorConnector *_t = static_cast<QDBusAdaptorConnector *>(_o);
- switch (_id) {
- case 0: _t->relaySignal((*reinterpret_cast< QObject*(*)>(_a[1])),(*reinterpret_cast< const QMetaObject*(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3])),(*reinterpret_cast< const QVariantList(*)>(_a[4]))); break;
- case 1: _t->relaySlot(_a); break; // HAND EDIT: add the _a parameter
- case 2: _t->polish(); break;
- default: ;
- }
- }
-}
-
-const QMetaObject QDBusAdaptorConnector::staticMetaObject = {
- { &QObject::staticMetaObject, qt_meta_stringdata_QDBusAdaptorConnector.data,
- qt_meta_data_QDBusAdaptorConnector, qt_static_metacall, nullptr, nullptr }
-};
-
-const QMetaObject *QDBusAdaptorConnector::metaObject() const
-{
- return &staticMetaObject;
-}
-
-void *QDBusAdaptorConnector::qt_metacast(const char *_clname)
-{
- if (!_clname) return nullptr;
- if (!strcmp(_clname, qt_meta_stringdata_QDBusAdaptorConnector.stringdata))
- return static_cast<void*>(const_cast< QDBusAdaptorConnector*>(this));
- return QObject::qt_metacast(_clname);
-}
-
-int QDBusAdaptorConnector::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
-{
- _id = QObject::qt_metacall(_c, _id, _a);
- if (_id < 0)
- return _id;
- if (_c == QMetaObject::InvokeMetaMethod) {
- if (_id < 3)
- qt_static_metacall(this, _c, _id, _a);
- _id -= 3;
- }
- return _id;
-}
-
-// SIGNAL 0
-void QDBusAdaptorConnector::relaySignal(QObject * _t1, const QMetaObject * _t2, int _t3, const QVariantList & _t4)
-{
- void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)), const_cast<void*>(reinterpret_cast<const void*>(&_t3)), const_cast<void*>(reinterpret_cast<const void*>(&_t4)) };
- QMetaObject::activate(this, &staticMetaObject, 0, _a);
-}
-
QT_END_NAMESPACE
#endif // QT_NO_DBUS
diff --git a/src/dbus/qdbusabstractadaptor_p.h b/src/dbus/qdbusabstractadaptor_p.h
index 023b3b1be2..404901381b 100644
--- a/src/dbus/qdbusabstractadaptor_p.h
+++ b/src/dbus/qdbusabstractadaptor_p.h
@@ -92,7 +92,7 @@ public:
class QDBusAdaptorConnector: public QObject
{
- Q_OBJECT_FAKE
+ Q_OBJECT
public: // typedefs
struct AdaptorData
@@ -118,12 +118,11 @@ public: // methods
void disconnectAllSignals(QObject *object);
void relay(QObject *sender, int id, void **);
-//public slots:
- void relaySlot(void **);
+public Q_SLOTS:
+ void relaySlot(QMethodRawArguments a);
void polish();
-protected:
-//signals:
+Q_SIGNALS:
void relaySignal(QObject *obj, const QMetaObject *metaObject, int sid, const QVariantList &args);
public: // member variables
diff --git a/src/dbus/qdbusargument.cpp b/src/dbus/qdbusargument.cpp
index 5a0f0f013b..7e1d847982 100644
--- a/src/dbus/qdbusargument.cpp
+++ b/src/dbus/qdbusargument.cpp
@@ -908,9 +908,10 @@ void QDBusArgument::endArray()
\snippet code/src_qdbus_qdbusargument.cpp 7
- If the type you want to marshall is a QMap or QHash, you need not
- declare an \c{operator<<} function for it, since Qt D-Bus provides
- generic templates to do the job of marshalling the data.
+ You usually don't need to provide an \c{operator<<} or \c{operator>>}
+ function for associative containers such as QHash or std::map,
+ since Qt D-Bus provides generic templates to do the job of marshalling
+ the data.
\sa endMap(), beginStructure(), beginArray(), beginMapEntry()
*/
diff --git a/src/dbus/qdbusargument.h b/src/dbus/qdbusargument.h
index 339f8c5dc8..f388a65bed 100644
--- a/src/dbus/qdbusargument.h
+++ b/src/dbus/qdbusargument.h
@@ -224,7 +224,8 @@ Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QLineF &li
Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QLineF &line);
#endif
-template<template <typename> class Container, typename T>
+template<template <typename> class Container, typename T,
+ typename = typename Container<T>::iterator>
inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<T> &list)
{
int id = qMetaTypeId<T>();
@@ -237,7 +238,8 @@ inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<T> &list)
return arg;
}
-template<template <typename> class Container, typename T>
+template<template <typename> class Container, typename T,
+ typename = typename Container<T>::iterator>
inline const QDBusArgument &operator>>(const QDBusArgument &arg, Container<T> &list)
{
arg.beginArray();
@@ -252,35 +254,6 @@ inline const QDBusArgument &operator>>(const QDBusArgument &arg, Container<T> &l
return arg;
}
-// QList specializations
-template<typename T>
-inline QDBusArgument &operator<<(QDBusArgument &arg, const QList<T> &list)
-{
- int id = qMetaTypeId<T>();
- arg.beginArray(id);
- typename QList<T>::ConstIterator it = list.constBegin();
- typename QList<T>::ConstIterator end = list.constEnd();
- for ( ; it != end; ++it)
- arg << *it;
- arg.endArray();
- return arg;
-}
-
-template<typename T>
-inline const QDBusArgument &operator>>(const QDBusArgument &arg, QList<T> &list)
-{
- arg.beginArray();
- list.clear();
- while (!arg.atEnd()) {
- T item;
- arg >> item;
- list.push_back(item);
- }
- arg.endArray();
-
- return arg;
-}
-
inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantList &list)
{
int id = qMetaTypeId<QDBusVariant>();
@@ -293,15 +266,16 @@ inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantList &list)
return arg;
}
-// QMap specializations
-template<typename Key, typename T>
-inline QDBusArgument &operator<<(QDBusArgument &arg, const QMap<Key, T> &map)
+// Specializations for associative containers
+template <template <typename, typename> class Container, typename Key, typename T,
+ QtPrivate::IfAssociativeIteratorHasKeyAndValue<typename Container<Key, T>::iterator> = true>
+inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<Key, T> &map)
{
int kid = qMetaTypeId<Key>();
int vid = qMetaTypeId<T>();
arg.beginMap(kid, vid);
- typename QMap<Key, T>::ConstIterator it = map.constBegin();
- typename QMap<Key, T>::ConstIterator end = map.constEnd();
+ auto it = map.begin();
+ auto end = map.end();
for ( ; it != end; ++it) {
arg.beginMapEntry();
arg << it.key() << it.value();
@@ -311,8 +285,27 @@ inline QDBusArgument &operator<<(QDBusArgument &arg, const QMap<Key, T> &map)
return arg;
}
-template<typename Key, typename T>
-inline const QDBusArgument &operator>>(const QDBusArgument &arg, QMap<Key, T> &map)
+template <template <typename, typename> class Container, typename Key, typename T,
+ QtPrivate::IfAssociativeIteratorHasFirstAndSecond<typename Container<Key, T>::iterator> = true>
+inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<Key, T> &map)
+{
+ int kid = qMetaTypeId<Key>();
+ int vid = qMetaTypeId<T>();
+ arg.beginMap(kid, vid);
+ auto it = map.begin();
+ auto end = map.end();
+ for ( ; it != end; ++it) {
+ arg.beginMapEntry();
+ arg << it->first << it->second;
+ arg.endMapEntry();
+ }
+ arg.endMap();
+ return arg;
+}
+
+template <template <typename, typename> class Container, typename Key, typename T,
+ typename = typename Container<Key, T>::iterator>
+inline const QDBusArgument &operator>>(const QDBusArgument &arg, Container<Key, T> &map)
{
arg.beginMap();
map.clear();
@@ -321,7 +314,7 @@ inline const QDBusArgument &operator>>(const QDBusArgument &arg, QMap<Key, T> &m
T value;
arg.beginMapEntry();
arg >> key >> value;
- static_cast<QMultiMap<Key, T> &>(map).insert(key, value);
+ map.insert(key, value);
arg.endMapEntry();
}
arg.endMap();
@@ -342,41 +335,6 @@ inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantMap &map)
return arg;
}
-// QHash specializations
-template<typename Key, typename T>
-inline QDBusArgument &operator<<(QDBusArgument &arg, const QHash<Key, T> &map)
-{
- int kid = qMetaTypeId<Key>();
- int vid = qMetaTypeId<T>();
- arg.beginMap(kid, vid);
- typename QHash<Key, T>::ConstIterator it = map.constBegin();
- typename QHash<Key, T>::ConstIterator end = map.constEnd();
- for ( ; it != end; ++it) {
- arg.beginMapEntry();
- arg << it.key() << it.value();
- arg.endMapEntry();
- }
- arg.endMap();
- return arg;
-}
-
-template<typename Key, typename T>
-inline const QDBusArgument &operator>>(const QDBusArgument &arg, QHash<Key, T> &map)
-{
- arg.beginMap();
- map.clear();
- while (!arg.atEnd()) {
- Key key;
- T value;
- arg.beginMapEntry();
- arg >> key >> value;
- static_cast<QMultiHash<Key, T> &>(map).insert(key, value);
- arg.endMapEntry();
- }
- arg.endMap();
- return arg;
-}
-
inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantHash &map)
{
arg.beginMap(QMetaType::QString, qMetaTypeId<QDBusVariant>());
diff --git a/src/dbus/qdbusextratypes.h b/src/dbus/qdbusextratypes.h
index 6bb12ffe49..d172d51294 100644
--- a/src/dbus/qdbusextratypes.h
+++ b/src/dbus/qdbusextratypes.h
@@ -105,7 +105,7 @@ inline bool operator!=(const QDBusObjectPath &lhs, const QDBusObjectPath &rhs)
inline bool operator<(const QDBusObjectPath &lhs, const QDBusObjectPath &rhs)
{ return lhs.path() < rhs.path(); }
-inline uint qHash(const QDBusObjectPath &objectPath, uint seed = 0)
+inline size_t qHash(const QDBusObjectPath &objectPath, size_t seed = 0)
{ return qHash(objectPath.path(), seed); }
@@ -158,7 +158,7 @@ inline bool operator!=(const QDBusSignature &lhs, const QDBusSignature &rhs)
inline bool operator<(const QDBusSignature &lhs, const QDBusSignature &rhs)
{ return lhs.signature() < rhs.signature(); }
-inline uint qHash(const QDBusSignature &signature, uint seed = 0)
+inline size_t qHash(const QDBusSignature &signature, size_t seed = 0)
{ return qHash(signature.signature(), seed); }
class QDBusVariant
diff --git a/src/dbus/qdbusmetaobject.cpp b/src/dbus/qdbusmetaobject.cpp
index 5265568f42..01eb1aee3f 100644
--- a/src/dbus/qdbusmetaobject.cpp
+++ b/src/dbus/qdbusmetaobject.cpp
@@ -127,27 +127,31 @@ QDBusMetaObjectGenerator::QDBusMetaObjectGenerator(const QString &interfaceName,
}
}
-static int registerComplexDBusType(const char *typeName)
+static int registerComplexDBusType(const QByteArray &typeName)
{
- struct QDBusRawTypeHandler {
- static void destruct(void *)
- {
- qFatal("Cannot destruct placeholder type QDBusRawType");
- }
-
- static void *construct(void *, const void *)
- {
- qFatal("Cannot construct placeholder type QDBusRawType");
- return nullptr;
- }
+ struct QDBusRawTypeHandler : QtPrivate::QMetaTypeInterface
+ {
+ const QByteArray name;
+ QDBusRawTypeHandler(const QByteArray &name)
+ : QtPrivate::QMetaTypeInterface {
+ 0, sizeof(void *), sizeof(void *), QMetaType::MovableType, nullptr,
+ name.constData(), 0, QtPrivate::RefCount{0},
+ [](QtPrivate::QMetaTypeInterface *self) {
+ delete static_cast<QDBusRawTypeHandler *>(self);
+ },
+ nullptr, nullptr, nullptr, nullptr, nullptr
+ },
+ name(name)
+ {}
};
- return QMetaType::registerNormalizedType(typeName,
- QDBusRawTypeHandler::destruct,
- QDBusRawTypeHandler::construct,
- sizeof(void *),
- QMetaType::MovableType,
- nullptr);
+ static QBasicMutex mutex;
+ static QHash<QByteArray, QMetaType> hash;
+ QMutexLocker lock(&mutex);
+ QMetaType &metatype = hash[typeName];
+ if (!metatype.isValid())
+ metatype = QMetaType(new QDBusRawTypeHandler(typeName));
+ return metatype.id();
}
Q_DBUS_EXPORT bool qt_dbus_metaobject_skip_annotations = false;
@@ -387,7 +391,7 @@ int QDBusMetaObjectGenerator::aggregateParameterCount(const QMap<QByteArray, Met
QMap<QByteArray, Method>::const_iterator it;
for (it = map.constBegin(); it != map.constEnd(); ++it) {
const Method &m = it.value();
- sum += m.inputTypes.size() + qMax(1, m.outputTypes.size());
+ sum += m.inputTypes.size() + qMax(qsizetype(1), m.outputTypes.size());
}
return sum;
}
@@ -456,7 +460,7 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj)
it != map.constEnd(); ++it) {
const Method &mm = it.value();
- int argc = mm.inputTypes.size() + qMax(0, mm.outputTypes.size() - 1);
+ int argc = mm.inputTypes.size() + qMax(qsizetype(0), mm.outputTypes.size() - 1);
idata[offset++] = strings.enter(mm.name);
idata[offset++] = argc;
@@ -517,6 +521,9 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj)
offset += methodParametersDataSize;
Q_ASSERT(offset == header->propertyData);
+ QMetaType *metaTypes = new QMetaType[properties.count()];
+ int propertyId = 0;
+
// add each property
signatureOffset = header->propertyDBusData;
for (QMap<QByteArray, Property>::ConstIterator it = properties.constBegin();
@@ -531,6 +538,8 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj)
idata[signatureOffset++] = strings.enter(mp.signature);
idata[signatureOffset++] = mp.type;
+
+ metaTypes[propertyId++] = QMetaType(mp.type);
}
Q_ASSERT(offset == header->propertyDBusData);
@@ -547,8 +556,9 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj)
obj->d.relatedMetaObjects = nullptr;
obj->d.static_metacall = nullptr;
obj->d.extradata = nullptr;
- obj->d.stringdata = reinterpret_cast<const QByteArrayData *>(string_data);
+ obj->d.stringdata = reinterpret_cast<const uint *>(string_data);
obj->d.superdata = &QDBusAbstractInterface::staticMetaObject;
+ obj->d.metaTypes = reinterpret_cast<QtPrivate::QMetaTypeInterface *const *>(metaTypes);
}
#if 0
diff --git a/src/dbus/qdbusmetaobject_p.h b/src/dbus/qdbusmetaobject_p.h
index 89fccf9046..a4ed3c355c 100644
--- a/src/dbus/qdbusmetaobject_p.h
+++ b/src/dbus/qdbusmetaobject_p.h
@@ -77,6 +77,7 @@ struct Q_DBUS_EXPORT QDBusMetaObject: public QMetaObject
{
delete [] reinterpret_cast<const char *>(d.stringdata);
delete [] d.data;
+ delete [] reinterpret_cast<const QMetaType *>(d.metaTypes);
}
// methods (slots & signals):
diff --git a/src/dbus/qdbusmisc.cpp b/src/dbus/qdbusmisc.cpp
index 46cf857751..8443246e00 100644
--- a/src/dbus/qdbusmisc.cpp
+++ b/src/dbus/qdbusmisc.cpp
@@ -153,7 +153,7 @@ int qDBusParametersForMethod(const QList<QByteArray> &parameterTypes, QVector<in
QList<QByteArray>::ConstIterator it = parameterTypes.constBegin();
QList<QByteArray>::ConstIterator end = parameterTypes.constEnd();
for ( ; it != end; ++it) {
- const QByteArray &type = *it;
+ QByteArray type = *it;
if (type.endsWith('*')) {
errorMsg = QLatin1String("Pointers are not supported: ") + QLatin1String(type);
return -1;
@@ -180,6 +180,9 @@ int qDBusParametersForMethod(const QList<QByteArray> &parameterTypes, QVector<in
return -1; // not allowed
}
+ if (type.startsWith("QList<"))
+ type = "QVector<" + type.mid(sizeof("QList<") - 1);
+
int id = QMetaType::type(type);
#ifdef QT_BOOTSTRAPPED
// in bootstrap mode QDBusMessage isn't included, thus we need to resolve it manually here
diff --git a/src/gui/.prev_CMakeLists.txt b/src/gui/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..d1464e2966
--- /dev/null
+++ b/src/gui/.prev_CMakeLists.txt
@@ -0,0 +1,628 @@
+# Generated from gui.pro.
+
+#####################################################################
+## Gui Module:
+#####################################################################
+
+qt_add_module(Gui
+ GENERATE_METATYPES
+ PLUGIN_TYPES platforms platforms/darwin xcbglintegrations platformthemes platforminputcontexts generic iconengines imageformats egldeviceintegrations
+ SOURCES
+ image/qbitmap.cpp image/qbitmap.h
+ image/qbmphandler.cpp image/qbmphandler_p.h
+ image/qicon.cpp image/qicon.h image/qicon_p.h
+ image/qiconengine.cpp image/qiconengine.h
+ image/qiconengineplugin.cpp image/qiconengineplugin.h
+ image/qiconloader.cpp image/qiconloader_p.h
+ image/qimage.cpp image/qimage.h image/qimage_p.h
+ image/qimage_conversions.cpp
+ image/qimageiohandler.cpp image/qimageiohandler.h
+ image/qimagepixmapcleanuphooks.cpp image/qimagepixmapcleanuphooks_p.h
+ image/qimagereader.cpp image/qimagereader.h
+ image/qimagereaderwriterhelpers.cpp image/qimagereaderwriterhelpers_p.h
+ image/qimagewriter.cpp image/qimagewriter.h
+ image/qpaintengine_pic.cpp image/qpaintengine_pic_p.h
+ image/qpicture.cpp image/qpicture.h image/qpicture_p.h
+ image/qpixmap.cpp image/qpixmap.h
+ image/qpixmap_blitter.cpp image/qpixmap_blitter_p.h
+ image/qpixmap_raster.cpp image/qpixmap_raster_p.h
+ image/qpixmapcache.cpp image/qpixmapcache.h image/qpixmapcache_p.h
+ image/qplatformpixmap.cpp image/qplatformpixmap.h
+ image/qppmhandler.cpp image/qppmhandler_p.h
+ image/qxbmhandler.cpp image/qxbmhandler_p.h
+ image/qxpmhandler.cpp image/qxpmhandler_p.h
+ itemmodels/qstandarditemmodel.cpp itemmodels/qstandarditemmodel.h itemmodels/qstandarditemmodel_p.h
+ kernel/qclipboard.cpp kernel/qclipboard.h
+ kernel/qcursor.cpp kernel/qcursor.h kernel/qcursor_p.h
+ kernel/qevent.cpp kernel/qevent.h kernel/qevent_p.h
+ kernel/qgenericplugin.cpp kernel/qgenericplugin.h
+ kernel/qgenericpluginfactory.cpp kernel/qgenericpluginfactory.h
+ kernel/qguiapplication.cpp kernel/qguiapplication.h kernel/qguiapplication_p.h
+ kernel/qguivariant.cpp
+ kernel/qhighdpiscaling.cpp kernel/qhighdpiscaling_p.h
+ kernel/qinputdevicemanager.cpp kernel/qinputdevicemanager_p.h
+ kernel/qinputdevicemanager_p_p.h
+ kernel/qinputmethod.cpp kernel/qinputmethod.h kernel/qinputmethod_p.h
+ kernel/qinternalmimedata.cpp kernel/qinternalmimedata_p.h
+ kernel/qkeymapper.cpp kernel/qkeymapper_p.h
+ kernel/qoffscreensurface.cpp kernel/qoffscreensurface.h
+ kernel/qpaintdevicewindow.cpp kernel/qpaintdevicewindow.h kernel/qpaintdevicewindow_p.h
+ kernel/qpalette.cpp kernel/qpalette.h
+ kernel/qpixelformat.cpp kernel/qpixelformat.h
+ kernel/qplatformclipboard.cpp kernel/qplatformclipboard.h
+ kernel/qplatformcursor.cpp kernel/qplatformcursor.h
+ kernel/qplatformdialoghelper.cpp kernel/qplatformdialoghelper.h
+ kernel/qplatformgraphicsbuffer.cpp kernel/qplatformgraphicsbuffer.h
+ kernel/qplatformgraphicsbufferhelper.cpp kernel/qplatformgraphicsbufferhelper.h
+ kernel/qplatforminputcontext.cpp kernel/qplatforminputcontext.h kernel/qplatforminputcontext_p.h
+ kernel/qplatforminputcontextfactory.cpp kernel/qplatforminputcontextfactory_p.h
+ kernel/qplatforminputcontextplugin.cpp kernel/qplatforminputcontextplugin_p.h
+ kernel/qplatformintegration.cpp kernel/qplatformintegration.h
+ kernel/qplatformintegrationfactory.cpp kernel/qplatformintegrationfactory_p.h
+ kernel/qplatformintegrationplugin.cpp kernel/qplatformintegrationplugin.h
+ kernel/qplatformmenu.cpp kernel/qplatformmenu.h
+ kernel/qplatformnativeinterface.cpp kernel/qplatformnativeinterface.h
+ kernel/qplatformoffscreensurface.cpp kernel/qplatformoffscreensurface.h
+ kernel/qplatformscreen.cpp kernel/qplatformscreen.h kernel/qplatformscreen_p.h
+ kernel/qplatformservices.cpp kernel/qplatformservices.h
+ kernel/qplatformsessionmanager.cpp kernel/qplatformsessionmanager.h
+ kernel/qplatformsharedgraphicscache.cpp kernel/qplatformsharedgraphicscache.h
+ kernel/qplatformsurface.cpp kernel/qplatformsurface.h
+ kernel/qplatformsystemtrayicon.cpp kernel/qplatformsystemtrayicon.h
+ kernel/qplatformtheme.cpp kernel/qplatformtheme.h kernel/qplatformtheme_p.h
+ kernel/qplatformthemefactory.cpp kernel/qplatformthemefactory_p.h
+ kernel/qplatformthemeplugin.cpp kernel/qplatformthemeplugin.h
+ kernel/qplatformwindow.cpp kernel/qplatformwindow.h kernel/qplatformwindow_p.h
+ kernel/qrasterwindow.cpp kernel/qrasterwindow.h
+ kernel/qscreen.cpp kernel/qscreen.h kernel/qscreen_p.h
+ kernel/qsessionmanager.cpp kernel/qsessionmanager.h kernel/qsessionmanager_p.h
+ kernel/qstylehints.cpp kernel/qstylehints.h
+ kernel/qsurface.cpp kernel/qsurface.h
+ kernel/qsurfaceformat.cpp kernel/qsurfaceformat.h
+ kernel/qtestsupport_gui.cpp kernel/qtestsupport_gui.h
+ kernel/qtguiglobal.h kernel/qtguiglobal_p.h
+ kernel/qtouchdevice.cpp kernel/qtouchdevice.h kernel/qtouchdevice_p.h
+ kernel/qwindow.cpp kernel/qwindow.h kernel/qwindow_p.h
+ kernel/qwindowdefs.h
+ kernel/qwindowsysteminterface.cpp kernel/qwindowsysteminterface.h kernel/qwindowsysteminterface_p.h
+ math3d/qgenericmatrix.cpp math3d/qgenericmatrix.h
+ math3d/qmatrix4x4.cpp math3d/qmatrix4x4.h
+ math3d/qquaternion.cpp math3d/qquaternion.h
+ math3d/qvector2d.cpp math3d/qvector2d.h
+ math3d/qvector3d.cpp math3d/qvector3d.h
+ math3d/qvector4d.cpp math3d/qvector4d.h
+ painting/qbackingstore.cpp painting/qbackingstore.h
+ painting/qbezier.cpp painting/qbezier_p.h
+ painting/qblendfunctions.cpp painting/qblendfunctions_p.h
+ painting/qblittable.cpp painting/qblittable_p.h
+ painting/qbrush.cpp painting/qbrush.h
+ painting/qcolor.cpp painting/qcolor.h painting/qcolor_p.h
+ painting/qcolormatrix_p.h
+ painting/qcolorspace.cpp painting/qcolorspace.h painting/qcolorspace_p.h
+ painting/qcolortransferfunction_p.h
+ painting/qcolortransfertable_p.h
+ painting/qcolortransform.cpp painting/qcolortransform.h painting/qcolortransform_p.h
+ painting/qcolortrc_p.h
+ painting/qcolortrclut.cpp painting/qcolortrclut_p.h
+ painting/qcompositionfunctions.cpp
+ painting/qcosmeticstroker.cpp painting/qcosmeticstroker_p.h
+ painting/qdatabuffer_p.h
+ painting/qdrawhelper_p.h
+ painting/qdrawhelper_x86_p.h
+ painting/qdrawingprimitive_sse2_p.h
+ painting/qemulationpaintengine.cpp painting/qemulationpaintengine_p.h
+ painting/qfixed_p.h
+ painting/qgrayraster.c painting/qgrayraster_p.h
+ painting/qicc.cpp painting/qicc_p.h
+ painting/qimagescale.cpp
+ painting/qmemrotate.cpp painting/qmemrotate_p.h
+ painting/qoutlinemapper.cpp painting/qoutlinemapper_p.h
+ painting/qpagedpaintdevice.cpp painting/qpagedpaintdevice.h painting/qpagedpaintdevice_p.h
+ painting/qpagelayout.cpp painting/qpagelayout.h
+ painting/qpagesize.cpp painting/qpagesize.h
+ painting/qpaintdevice.cpp painting/qpaintdevice.h
+ painting/qpaintengine.cpp painting/qpaintengine.h painting/qpaintengine_p.h
+ painting/qpaintengine_blitter.cpp painting/qpaintengine_blitter_p.h
+ painting/qpaintengine_raster.cpp painting/qpaintengine_raster_p.h
+ painting/qpaintengineex.cpp painting/qpaintengineex_p.h
+ painting/qpainter.cpp painting/qpainter.h painting/qpainter_p.h
+ painting/qpainterpath.cpp painting/qpainterpath.h painting/qpainterpath_p.h
+ painting/qpathclipper.cpp painting/qpathclipper_p.h
+ painting/qpathsimplifier.cpp painting/qpathsimplifier_p.h
+ painting/qpdf.cpp painting/qpdf_p.h
+ painting/qpdfwriter.cpp painting/qpdfwriter.h
+ painting/qpen.cpp painting/qpen.h
+ painting/qplatformbackingstore.cpp painting/qplatformbackingstore.h
+ painting/qpolygon.cpp painting/qpolygon.h
+ painting/qpolygonclipper_p.h
+ painting/qrasterdefs_p.h
+ painting/qrasterizer.cpp painting/qrasterizer_p.h
+ painting/qrbtree_p.h
+ painting/qregion.cpp painting/qregion.h
+ painting/qrgb.h
+ painting/qrgba64.h painting/qrgba64_p.h
+ painting/qstroker.cpp painting/qstroker_p.h
+ painting/qtextureglyphcache.cpp painting/qtextureglyphcache_p.h
+ painting/qtransform.cpp painting/qtransform.h
+ painting/qtriangulatingstroker.cpp painting/qtriangulatingstroker_p.h
+ painting/qtriangulator.cpp painting/qtriangulator_p.h
+ painting/qvectorpath_p.h
+ rhi/qrhi.cpp rhi/qrhi_p.h
+ rhi/qrhi_p_p.h
+ rhi/qrhinull.cpp rhi/qrhinull_p.h
+ rhi/qrhinull_p_p.h
+ rhi/qrhiprofiler.cpp rhi/qrhiprofiler_p.h
+ rhi/qrhiprofiler_p_p.h
+ rhi/qshader.cpp rhi/qshader_p.h
+ rhi/qshader_p_p.h
+ rhi/qshaderdescription.cpp rhi/qshaderdescription_p.h
+ rhi/qshaderdescription_p_p.h
+ text/qabstracttextdocumentlayout.cpp text/qabstracttextdocumentlayout.h text/qabstracttextdocumentlayout_p.h
+ text/qdistancefield.cpp text/qdistancefield_p.h
+ text/qfont.cpp text/qfont.h text/qfont_p.h
+ text/qfontdatabase.cpp text/qfontdatabase.h text/qfontdatabase_p.h
+ text/qfontengine.cpp text/qfontengine_p.h
+ text/qfontengine_qpf2.cpp
+ text/qfontengineglyphcache.cpp text/qfontengineglyphcache_p.h
+ text/qfontinfo.h
+ text/qfontmetrics.cpp text/qfontmetrics.h
+ text/qfontsubset.cpp text/qfontsubset_p.h
+ text/qfragmentmap.cpp text/qfragmentmap_p.h
+ text/qglyphrun.cpp text/qglyphrun.h text/qglyphrun_p.h
+ text/qinputcontrol.cpp text/qinputcontrol_p.h
+ text/qplatformfontdatabase.cpp text/qplatformfontdatabase.h
+ text/qrawfont.cpp text/qrawfont.h text/qrawfont_p.h
+ text/qstatictext.cpp text/qstatictext.h text/qstatictext_p.h
+ text/qsyntaxhighlighter.cpp text/qsyntaxhighlighter.h
+ text/qtextcursor.cpp text/qtextcursor.h text/qtextcursor_p.h
+ text/qtextdocument.cpp text/qtextdocument.h text/qtextdocument_p.cpp text/qtextdocument_p.h
+ text/qtextdocumentfragment.cpp text/qtextdocumentfragment.h text/qtextdocumentfragment_p.h
+ text/qtextdocumentlayout.cpp text/qtextdocumentlayout_p.h
+ text/qtextdocumentwriter.cpp text/qtextdocumentwriter.h
+ text/qtextengine.cpp text/qtextengine_p.h
+ text/qtextformat.cpp text/qtextformat.h text/qtextformat_p.h
+ text/qtexthtmlparser.cpp text/qtexthtmlparser_p.h
+ text/qtextimagehandler.cpp text/qtextimagehandler_p.h
+ text/qtextlayout.cpp text/qtextlayout.h
+ text/qtextlist.cpp text/qtextlist.h
+ text/qtextobject.cpp text/qtextobject.h text/qtextobject_p.h
+ text/qtextoption.cpp text/qtextoption.h
+ text/qtexttable.cpp text/qtexttable.h text/qtexttable_p.h
+ util/qabstractlayoutstyleinfo.cpp util/qabstractlayoutstyleinfo_p.h
+ util/qastchandler.cpp util/qastchandler_p.h
+ util/qdesktopservices.cpp util/qdesktopservices.h
+ util/qgridlayoutengine.cpp util/qgridlayoutengine_p.h
+ util/qhexstring_p.h
+ util/qktxhandler.cpp util/qktxhandler_p.h
+ util/qlayoutpolicy.cpp util/qlayoutpolicy_p.h
+ util/qpkmhandler.cpp util/qpkmhandler_p.h
+ util/qshaderformat.cpp util/qshaderformat_p.h
+ util/qshadergraph.cpp util/qshadergraph_p.h
+ util/qshadergraphloader.cpp util/qshadergraphloader_p.h
+ util/qshaderlanguage.cpp util/qshaderlanguage_p.h
+ util/qshadernode.cpp util/qshadernode_p.h
+ util/qshadernodeport.cpp util/qshadernodeport_p.h
+ util/qshadernodesloader.cpp util/qshadernodesloader_p.h
+ util/qtexturefiledata.cpp util/qtexturefiledata_p.h
+ util/qtexturefilehandler_p.h
+ util/qtexturefilereader.cpp util/qtexturefilereader_p.h
+ util/qvalidator.cpp util/qvalidator.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ INCLUDE_DIRECTORIES
+ ../3rdparty/VulkanMemoryAllocator
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+ PRECOMPILED_HEADER
+ "kernel/qt_gui_pch.h"
+)
+
+# Resources:
+set_source_files_properties("painting/../../3rdparty/icc/sRGB2014.icc"
+ PROPERTIES QT_RESOURCE_ALIAS "sRGB2014.icc"
+)
+set(qpdf_resource_files
+ "../../3rdparty/icc/sRGB2014.icc"
+ "qpdfa_metadata.xml"
+)
+
+qt_add_resource(Gui "qpdf"
+ PREFIX
+ "/qpdf/"
+ BASE
+ "painting"
+ FILES
+ ${qpdf_resource_files}
+)
+
+if(QT_FEATURE_reduce_relocations AND UNIX AND GCC)
+ target_link_options(Gui PRIVATE
+ "LINKER:--dynamic-list=${CMAKE_CURRENT_LIST_DIR}/QtGui.dynlist")
+endif()
+
+#### Keys ignored in scope 1:.:.:gui.pro:<TRUE>:
+# QMAKE_LIBS = "$$QMAKE_LIBS_GUI"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(Gui CONDITION QT_FEATURE_opengl
+ SOURCES
+ kernel/qopenglcontext.cpp kernel/qopenglcontext.h kernel/qopenglcontext_p.h
+ kernel/qplatformopenglcontext.cpp kernel/qplatformopenglcontext.h
+ opengl/qopengl.cpp opengl/qopengl.h opengl/qopengl_p.h
+ opengl/qopenglextensions_p.h
+ opengl/qopenglextrafunctions.h
+ opengl/qopenglfunctions.cpp opengl/qopenglfunctions.h
+ opengl/qopenglprogrambinarycache.cpp opengl/qopenglprogrambinarycache_p.h
+ rhi/qrhigles2.cpp rhi/qrhigles2_p.h
+ rhi/qrhigles2_p_p.h
+)
+
+#### Keys ignored in scope 2:.:.:gui.pro:QT_FEATURE_opengl:
+# MODULE_CONFIG = "opengl"
+
+#### Keys ignored in scope 3:.:.:gui.pro:QT_FEATURE_angle:
+# MODULE_AUX_INCLUDES = "\$\$QT_MODULE_INCLUDE_BASE/QtANGLE"
+
+qt_extend_target(Gui CONDITION MACOS
+ LIBRARIES
+ ${FWAppKit}
+ PUBLIC_LIBRARIES
+ ${FWAppKit}
+)
+
+qt_extend_target(Gui CONDITION APPLE
+ SOURCES
+ image/qimage_darwin.mm
+ painting/qcoregraphics.mm painting/qcoregraphics_p.h
+ LIBRARIES
+ ${FWCoreGraphics}
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_animation
+ SOURCES
+ animation/qguivariantanimation.cpp
+)
+
+qt_extend_target(Gui CONDITION WIN32
+ SOURCES
+ kernel/qwindowdefs_win.h
+ rhi/qrhid3d11.cpp rhi/qrhid3d11_p.h
+ rhi/qrhid3d11_p_p.h
+ PUBLIC_LIBRARIES
+ d3d11
+ dxgi
+ dxguid
+)
+
+#### Keys ignored in scope 8:.:.:gui.pro:WIN32:
+# CMAKE_WINDOWS_BUILD = "True"
+
+#### Keys ignored in scope 11:.:.:gui.pro:QT_FEATURE_egl:
+# CMAKE_EGL_LIBS = "$$cmakeProcessLibs($$QMAKE_LIBS_EGL)"
+
+#### Keys ignored in scope 12:.:.:gui.pro:NOT QMAKE_LIBDIR_EGL_ISEMPTY:
+# CMAKE_EGL_LIBDIR = "$$cmakeTargetPath($$QMAKE_LIBDIR_EGL)"
+
+#### Keys ignored in scope 13:.:.:gui.pro:QT_FEATURE_opengles2:
+# CMAKE_GL_HEADER_NAME = "GLES2/gl2.h"
+# CMAKE_OPENGL_INCDIRS = "$$cmakePortablePaths($$QMAKE_INCDIR_OPENGL_ES2)"
+# CMAKE_OPENGL_LIBS = "$$cmakeProcessLibs($$QMAKE_LIBS_OPENGL_ES2)"
+# CMAKE_QT_OPENGL_IMPLEMENTATION = "GLESv2"
+
+#### Keys ignored in scope 14:.:.:gui.pro:NOT QMAKE_INCDIR_OPENGL_ES2_ISEMPTY:
+# CMAKE_GL_INCDIRS = "$$cmakeTargetPaths($$QMAKE_INCDIR_OPENGL_ES2)"
+
+#### Keys ignored in scope 15:.:.:gui.pro:NOT QMAKE_LIBDIR_OPENGL_ES2_ISEMPTY:
+# CMAKE_OPENGL_LIBDIR = "$$cmakePortablePaths($$QMAKE_LIBDIR_OPENGL_ES2)"
+
+#### Keys ignored in scope 17:.:.:gui.pro:QT_FEATURE_opengl:
+# CMAKE_GL_HEADER_NAME = "GL/gl.h"
+# CMAKE_OPENGL_INCDIRS = "$$cmakePortablePaths($$QMAKE_INCDIR_OPENGL)"
+# CMAKE_QT_OPENGL_IMPLEMENTATION = "GL"
+
+#### Keys ignored in scope 18:.:.:gui.pro:NOT QMAKE_INCDIR_OPENGL_ISEMPTY:
+# CMAKE_GL_INCDIRS = "$$cmakeTargetPaths($$QMAKE_INCDIR_OPENGL)"
+
+#### Keys ignored in scope 19:.:.:gui.pro:NOT QT_FEATURE_dynamicgl:
+# CMAKE_OPENGL_LIBS = "$$cmakeProcessLibs($$QMAKE_LIBS_OPENGL)"
+
+#### Keys ignored in scope 20:.:.:gui.pro:NOT QMAKE_LIBDIR_OPENGL_ISEMPTY:
+# CMAKE_OPENGL_LIBDIR = "$$cmakePortablePaths($$QMAKE_LIBDIR_OPENGL)"
+
+#### Keys ignored in scope 21:.:.:gui.pro:APPLE:
+# CMAKE_GL_HEADER_NAME = "gl.h"
+
+#### Keys ignored in scope 22:.:.:gui.pro:QT_FEATURE_egl:
+# CMAKE_EGL_INCDIRS = "$$cmakePortablePaths($$QMAKE_INCDIR_EGL)"
+
+qt_extend_target(Gui CONDITION QT_FEATURE_accessibility
+ SOURCES
+ accessible/qaccessible.cpp accessible/qaccessible.h
+ accessible/qaccessiblebridge.cpp accessible/qaccessiblebridge.h
+ accessible/qaccessiblecache.cpp accessible/qaccessiblecache_p.h
+ accessible/qaccessibleobject.cpp accessible/qaccessibleobject.h
+ accessible/qaccessibleplugin.cpp accessible/qaccessibleplugin.h
+ accessible/qplatformaccessibility.cpp accessible/qplatformaccessibility.h
+)
+
+qt_extend_target(Gui CONDITION APPLE AND QT_FEATURE_accessibility
+ SOURCES
+ accessible/qaccessiblecache_mac.mm
+ LIBRARIES
+ ${FWFoundation}
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_action
+ SOURCES
+ kernel/qaction.cpp kernel/qaction.h kernel/qaction_p.h
+ kernel/qactiongroup.cpp kernel/qactiongroup.h kernel/qactiongroup_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_draganddrop
+ SOURCES
+ kernel/qdnd.cpp kernel/qdnd_p.h
+ kernel/qdrag.cpp kernel/qdrag.h
+ kernel/qplatformdrag.cpp kernel/qplatformdrag.h
+ kernel/qshapedpixmapdndwindow.cpp kernel/qshapedpixmapdndwindow_p.h
+ kernel/qsimpledrag.cpp kernel/qsimpledrag_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_shortcut
+ SOURCES
+ kernel/qkeysequence.cpp kernel/qkeysequence.h kernel/qkeysequence_p.h
+ kernel/qshortcut.cpp kernel/qshortcut.h kernel/qshortcut_p.h
+ kernel/qshortcutmap.cpp kernel/qshortcutmap_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_movie
+ SOURCES
+ image/qmovie.cpp image/qmovie.h
+)
+
+qt_extend_target(Gui CONDITION WIN32 AND NOT WINRT
+ SOURCES
+ image/qpixmap_win.cpp
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_png
+ SOURCES
+ image/qpnghandler.cpp image/qpnghandler_p.h
+ LIBRARIES
+ WrapPNG::WrapPNG
+)
+
+#### Keys ignored in scope 38:.:image:image/image.pri:WIN32 AND mingw:
+# GCC_VERSION = "$${QMAKE_GCC_MAJOR_VERSION}.$${QMAKE_GCC_MINOR_VERSION}.$${QMAKE_GCC_PATCH_VERSION}"
+
+qt_extend_target(Gui CONDITION ((QT_FEATURE_png) AND (WIN32 AND mingw)) AND (GCC_VERSION___equals___8.1.0)
+ COMPILE_OPTIONS
+ -fno-reorder-blocks-and-partition
+)
+
+if(NOT ANDROID)
+ qt_add_simd_part(Gui SIMD sse2
+ SOURCES
+ painting/qdrawhelper_sse2.cpp
+ )
+
+ qt_add_simd_part(Gui SIMD ssse3
+ SOURCES
+ image/qimage_ssse3.cpp
+ painting/qdrawhelper_ssse3.cpp
+ )
+
+ qt_add_simd_part(Gui SIMD sse4_1
+ SOURCES
+ painting/qdrawhelper_sse4.cpp
+ painting/qimagescale_sse4.cpp
+ )
+
+ qt_add_simd_part(Gui SIMD neon
+ SOURCES
+ image/qimage_neon.cpp
+ painting/qdrawhelper_neon.cpp painting/qdrawhelper_neon_p.h
+ painting/qimagescale_neon.cpp
+ )
+
+ qt_add_simd_part(Gui SIMD mips_dsp
+ SOURCES
+ painting/qdrawhelper_mips_dsp.cpp painting/qdrawhelper_mips_dsp_p.h
+ painting/qdrawhelper_mips_dsp_asm.S
+ painting/qt_mips_asm_dsp_p.h
+ )
+
+ qt_add_simd_part(Gui SIMD mips_dspr2
+ SOURCES
+ image/qimage_mips_dspr2.cpp
+ image/qimage_mips_dspr2_asm.S
+ painting/qdrawhelper_mips_dspr2_asm.S
+ )
+
+ qt_add_simd_part(Gui SIMD arch_haswell
+ SOURCES
+ painting/qdrawhelper_avx2.cpp
+ )
+endif()
+
+qt_extend_target(Gui CONDITION (NOT (NOT ANDROID)) AND (TEST_architecture_arch STREQUAL arm64 ORTEST_architecture_arch STREQUAL arm)
+ SOURCES
+ image/qimage_neon.cpp
+ painting/qdrawhelper_neon.cpp painting/qdrawhelper_neon_p.h
+ painting/qimagescale_neon.cpp
+)
+
+qt_extend_target(Gui CONDITION ANDROID AND (TEST_architecture_arch STREQUAL i386 OR TEST_architecture_arch STREQUAL x86_64)
+ SOURCES
+ image/qimage_ssse3.cpp
+ painting/qdrawhelper_sse2.cpp
+ painting/qdrawhelper_ssse3.cpp
+ DEFINES
+ QT_COMPILER_SUPPORTS_SSE2 QT_COMPILER_SUPPORTS_SSE2
+ QT_COMPILER_SUPPORTS_SSE3 QT_COMPILER_SUPPORTS_SSE3
+ QT_COMPILER_SUPPORTS_SSSE3 QT_COMPILER_SUPPORTS_SSSE3
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_harfbuzz
+ SOURCES
+ text/qharfbuzzng.cpp text/qharfbuzzng_p.h
+ LIBRARIES
+ WrapHarfbuzz::WrapHarfbuzz
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_textodfwriter
+ SOURCES
+ text/qtextodfwriter.cpp text/qtextodfwriter_p.h
+ text/qzip.cpp
+ text/qzipreader_p.h
+ text/qzipwriter_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_textmarkdownreader
+ SOURCES
+ text/qtextmarkdownimporter.cpp text/qtextmarkdownimporter_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_system_textmarkdownreader AND QT_FEATURE_textmarkdownreader
+ LIBRARIES
+ libmd4c
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_textmarkdownreader AND NOT QT_FEATURE_system_textmarkdownreader
+ SOURCES
+ ../3rdparty/md4c/md4c.c ../3rdparty/md4c/md4c.h
+ DEFINES
+ MD4C_USE_UTF8
+ INCLUDE_DIRECTORIES
+ ../3rdparty/md4c
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_textmarkdownwriter
+ SOURCES
+ text/qtextmarkdownwriter.cpp text/qtextmarkdownwriter_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_cssparser
+ SOURCES
+ painting/qcssutil.cpp
+ text/qcssparser.cpp text/qcssparser_p.h
+)
+
+qt_extend_target(Gui CONDITION UNIX AND NOT ANDROID AND NOT INTEGRITY AND NOT (TEST_architecture_arch STREQUAL "arm64") AND NOT UIKIT
+ DEFINES
+ ENABLE_PIXMAN_DRAWHELPERS
+)
+
+if(UNIX AND NOT ANDROID AND NOT INTEGRITY AND NOT (TEST_architecture_arch STREQUAL "arm64") AND NOT UIKIT)
+ qt_add_simd_part(Gui SIMD neon
+ SOURCES
+ ../3rdparty/pixman/pixman-arm-neon-asm.S
+ painting/qdrawhelper_neon_asm.S
+ )
+endif()
+
+qt_extend_target(Gui CONDITION ANDROID AND TEST_architecture_arch STREQUAL x86_64
+ SOURCES
+ painting/qdrawhelper_sse4.cpp
+ painting/qimagescale_sse4.cpp
+ DEFINES
+ QT_COMPILER_SUPPORTS_SSE4_1
+ QT_COMPILER_SUPPORTS_SSE4_2
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_system_zlib
+ LIBRARIES
+ ZLIB::ZLIB
+)
+
+qt_extend_target(Gui CONDITION NOT QT_FEATURE_system_zlib
+ INCLUDE_DIRECTORIES
+ ../3rdparty/zlib/src
+)
+
+qt_extend_target(Gui CONDITION NOT QT_FEATURE_system_zlib AND NOT no_core_dep
+ LIBRARIES
+ Qt::Core
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_regularexpression
+ SOURCES
+ util/qshadergenerator.cpp util/qshadergenerator_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_undocommand
+ SOURCES
+ util/qundostack.cpp util/qundostack.h util/qundostack_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_undogroup
+ SOURCES
+ util/qundogroup.cpp util/qundogroup.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_vulkan
+ SOURCES
+ rhi/qrhivulkan.cpp rhi/qrhivulkan_p.h
+ rhi/qrhivulkan_p_p.h
+ vulkan/qplatformvulkaninstance.cpp vulkan/qplatformvulkaninstance.h
+ vulkan/qvulkanfunctions.cpp
+ vulkan/qvulkaninstance.cpp vulkan/qvulkaninstance.h
+ vulkan/qvulkanwindow.cpp vulkan/qvulkanwindow.h vulkan/qvulkanwindow_p.h
+ PUBLIC_LIBRARIES
+ Vulkan::Vulkan_nolink
+)
+
+#### Keys ignored in scope 82:.:vulkan:vulkan/vulkan.pri:QT_FEATURE_vkgen:
+# QMAKE_EXTRA_COMPILERS = "qvkgen_h" "qvkgen_ph" "qvkgen_pimpl"
+# QMAKE_QVKGEN_INPUT = "vulkan/vk.xml"
+# QMAKE_QVKGEN_LICENSE_HEADER = "$$QT_SOURCE_TREE/header.LGPL"
+# qvkgen_h.commands = "$$QMAKE_QVKGEN" "${QMAKE_FILE_IN}" "$$shell_quote($$QMAKE_QVKGEN_LICENSE_HEADER)" "${QMAKE_FILE_OUT_PATH}/${QMAKE_FILE_OUT_BASE}"
+# qvkgen_h.input = "QMAKE_QVKGEN_INPUT"
+# qvkgen_h.output = "$$OUT_PWD/vulkan/qvulkanfunctions.h"
+# qvkgen_ph.commands = "$$escape_expand(\\n)"
+# qvkgen_ph.depends = "$$OUT_PWD/vulkan/qvulkanfunctions.h"
+# qvkgen_ph.input = "QMAKE_QVKGEN_INPUT"
+# qvkgen_ph.output = "$$OUT_PWD/vulkan/qvulkanfunctions_p.h"
+# qvkgen_pimpl.commands = "$$escape_expand(\\n)"
+# qvkgen_pimpl.depends = "$$OUT_PWD/vulkan/qvulkanfunctions_p.h"
+# qvkgen_pimpl.input = "QMAKE_QVKGEN_INPUT"
+# qvkgen_pimpl.output = "$$OUT_PWD/vulkan/qvulkanfunctions_p.cpp"
+
+#### Keys ignored in scope 83:.:vulkan:vulkan/vulkan.pri:QT_FEATURE_vulkan:
+# qvkgen_h.variable_out = "HEADERS"
+
+#### Keys ignored in scope 84:.:vulkan:vulkan/vulkan.pri:else:
+# qvkgen_h.CONFIG = "target_predeps" "no_link"
+
+qt_extend_target(Gui CONDITION WASM
+ SOURCES
+ platform/wasm/qwasmlocalfileaccess.cpp platform/wasm/qwasmlocalfileaccess_p.h
+)
+
+qt_extend_target(Gui CONDITION IOS OR MACOS
+ SOURCES
+ rhi/qrhimetal.mm rhi/qrhimetal_p.h
+ rhi/qrhimetal_p_p.h
+ PUBLIC_LIBRARIES
+ ${FWMetal}
+)
+
+qt_extend_target(Gui CONDITION NOT GCC OR NOT QT_COMPILER_VERSION_MAJOR STREQUAL 5
+ SOURCES
+ painting/qdrawhelper.cpp
+ NO_PCH_SOURCES
+ "painting/qdrawhelper.cpp"
+)
+
+
+qt_create_tracepoints(Gui qtgui.tracepoints)
+qt_add_docs(Gui
+ doc/qtgui.qdocconf
+)
+
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
new file mode 100644
index 0000000000..1d67aa5bc0
--- /dev/null
+++ b/src/gui/CMakeLists.txt
@@ -0,0 +1,789 @@
+# Generated from gui.pro.
+
+set(OpenGL_GL_PREFERENCE GLVND) # special case:
+
+#####################################################################
+## Gui Module:
+#####################################################################
+
+# special case begin
+qt_find_package(X11_XCB)
+qt_find_package(WrapHarfbuzz PROVIDED_TARGETS WrapHarfbuzz::WrapHarfbuzz)
+qt_find_package(WrapPNG PROVIDED_TARGETS WrapPNG::WrapPNG)
+
+if (QT_FEATURE_gui)
+ if (WINRT)
+ set(_default_platform "winrt")
+ elseif(WIN32)
+ set(_default_platform "windows")
+ elseif(ANDROID)
+ set(_default_platform "android")
+ elseif(MACOS)
+ set(_default_platform "cocoa")
+ elseif(TVOS OR IOS)
+ set(_default_platform "ios")
+ elseif(WATCHOS)
+ set(_default_platform "minimal")
+ elseif(QNX)
+ set(_default_platform "qnx")
+ elseif(INTEGRITY)
+ set(_default_platform "integrityfb")
+ elseif(HAIKU)
+ set(_default_platform "haiku")
+ elseif(WASM)
+ set(_default_platform "wasm")
+ else()
+ set(_default_platform "xcb")
+ endif()
+
+ set(QT_QPA_DEFAULT_PLATFORM "${_default_platform}" CACHE STRING "QPA default platform")
+endif()
+
+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+ set_source_files_properties(../3rdparty/md4c/md4c.c PROPERTIES COMPILE_FLAGS "-Wno-error=unused-parameter -Wno-error=sign-compare -Wno-error=missing-field-initializers")
+elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
+ set_source_files_properties(../3rdparty/md4c/md4c.c PROPERTIES COMPILE_FLAGS "-Wno-error=unused-parameter -Wno-error=sign-compare -Wno-error=missing-field-initializers -Wno-error=missing-braces")
+endif()
+
+unset(qmake_module_config)
+if(QT_FEATURE_opengl)
+ list(APPEND qmake_module_config opengl)
+endif()
+
+# special case end
+
+qt_add_module(Gui
+ GENERATE_METATYPES
+ PLUGIN_TYPES platforms platforms/darwin xcbglintegrations platformthemes platforminputcontexts generic iconengines imageformats egldeviceintegrations
+ FEATURE_DEPENDENCIES # special case:
+ Qt::Network # special case:
+ QMAKE_MODULE_CONFIG "${qmake_module_config}" # special case
+ SOURCES
+ image/qbitmap.cpp image/qbitmap.h
+ image/qbmphandler.cpp image/qbmphandler_p.h
+ image/qicon.cpp image/qicon.h image/qicon_p.h
+ image/qiconengine.cpp image/qiconengine.h
+ image/qiconengineplugin.cpp image/qiconengineplugin.h
+ image/qiconloader.cpp image/qiconloader_p.h
+ image/qimage.cpp image/qimage.h image/qimage_p.h
+ image/qimage_conversions.cpp
+ image/qimageiohandler.cpp image/qimageiohandler.h
+ image/qimagepixmapcleanuphooks.cpp image/qimagepixmapcleanuphooks_p.h
+ image/qimagereader.cpp image/qimagereader.h
+ image/qimagereaderwriterhelpers.cpp image/qimagereaderwriterhelpers_p.h
+ image/qimagewriter.cpp image/qimagewriter.h
+ image/qpaintengine_pic.cpp image/qpaintengine_pic_p.h
+ image/qpicture.cpp image/qpicture.h image/qpicture_p.h
+ image/qpixmap.cpp image/qpixmap.h
+ image/qpixmap_blitter.cpp image/qpixmap_blitter_p.h
+ image/qpixmap_raster.cpp image/qpixmap_raster_p.h
+ image/qpixmapcache.cpp image/qpixmapcache.h image/qpixmapcache_p.h
+ image/qplatformpixmap.cpp image/qplatformpixmap.h
+ image/qppmhandler.cpp image/qppmhandler_p.h
+ image/qxbmhandler.cpp image/qxbmhandler_p.h
+ image/qxpmhandler.cpp image/qxpmhandler_p.h
+ # itemmodels/qstandarditemmodel.cpp itemmodels/qstandarditemmodel.h itemmodels/qstandarditemmodel_p.h # special case
+ kernel/qclipboard.cpp kernel/qclipboard.h
+ kernel/qcursor.cpp kernel/qcursor.h kernel/qcursor_p.h
+ kernel/qevent.cpp kernel/qevent.h kernel/qevent_p.h
+ kernel/qgenericplugin.cpp kernel/qgenericplugin.h
+ kernel/qgenericpluginfactory.cpp kernel/qgenericpluginfactory.h
+ kernel/qguiapplication.cpp kernel/qguiapplication.h kernel/qguiapplication_p.h
+ kernel/qguivariant.cpp
+ kernel/qhighdpiscaling.cpp kernel/qhighdpiscaling_p.h
+ kernel/qinputdevicemanager.cpp kernel/qinputdevicemanager_p.h
+ kernel/qinputdevicemanager_p_p.h
+ kernel/qinputmethod.cpp kernel/qinputmethod.h kernel/qinputmethod_p.h
+ kernel/qinternalmimedata.cpp kernel/qinternalmimedata_p.h
+ kernel/qkeymapper.cpp kernel/qkeymapper_p.h
+ kernel/qoffscreensurface.cpp kernel/qoffscreensurface.h
+ kernel/qpaintdevicewindow.cpp kernel/qpaintdevicewindow.h kernel/qpaintdevicewindow_p.h
+ kernel/qpalette.cpp kernel/qpalette.h
+ kernel/qpixelformat.cpp kernel/qpixelformat.h
+ kernel/qplatformclipboard.cpp kernel/qplatformclipboard.h
+ kernel/qplatformcursor.cpp kernel/qplatformcursor.h
+ kernel/qplatformdialoghelper.cpp kernel/qplatformdialoghelper.h
+ kernel/qplatformgraphicsbuffer.cpp kernel/qplatformgraphicsbuffer.h
+ kernel/qplatformgraphicsbufferhelper.cpp kernel/qplatformgraphicsbufferhelper.h
+ kernel/qplatforminputcontext.cpp kernel/qplatforminputcontext.h kernel/qplatforminputcontext_p.h
+ kernel/qplatforminputcontextfactory.cpp kernel/qplatforminputcontextfactory_p.h
+ kernel/qplatforminputcontextplugin.cpp kernel/qplatforminputcontextplugin_p.h
+ kernel/qplatformintegration.cpp kernel/qplatformintegration.h
+ kernel/qplatformintegrationfactory.cpp kernel/qplatformintegrationfactory_p.h
+ kernel/qplatformintegrationplugin.cpp kernel/qplatformintegrationplugin.h
+ kernel/qplatformmenu.cpp kernel/qplatformmenu.h
+ kernel/qplatformnativeinterface.cpp kernel/qplatformnativeinterface.h
+ kernel/qplatformoffscreensurface.cpp kernel/qplatformoffscreensurface.h
+ kernel/qplatformscreen.cpp kernel/qplatformscreen.h kernel/qplatformscreen_p.h
+ kernel/qplatformservices.cpp kernel/qplatformservices.h
+ kernel/qplatformsessionmanager.cpp kernel/qplatformsessionmanager.h
+ kernel/qplatformsharedgraphicscache.cpp kernel/qplatformsharedgraphicscache.h
+ kernel/qplatformsurface.cpp kernel/qplatformsurface.h
+ kernel/qplatformsystemtrayicon.cpp kernel/qplatformsystemtrayicon.h
+ kernel/qplatformtheme.cpp kernel/qplatformtheme.h kernel/qplatformtheme_p.h
+ kernel/qplatformthemefactory.cpp kernel/qplatformthemefactory_p.h
+ kernel/qplatformthemeplugin.cpp kernel/qplatformthemeplugin.h
+ kernel/qplatformwindow.cpp kernel/qplatformwindow.h kernel/qplatformwindow_p.h
+ kernel/qrasterwindow.cpp kernel/qrasterwindow.h
+ kernel/qscreen.cpp kernel/qscreen.h kernel/qscreen_p.h
+ kernel/qsessionmanager.cpp kernel/qsessionmanager.h kernel/qsessionmanager_p.h
+ kernel/qstylehints.cpp kernel/qstylehints.h
+ kernel/qsurface.cpp kernel/qsurface.h
+ kernel/qsurfaceformat.cpp kernel/qsurfaceformat.h
+ kernel/qtestsupport_gui.cpp kernel/qtestsupport_gui.h
+ kernel/qtguiglobal.h kernel/qtguiglobal_p.h
+ kernel/qtouchdevice.cpp kernel/qtouchdevice.h kernel/qtouchdevice_p.h
+ kernel/qwindow.cpp kernel/qwindow.h kernel/qwindow_p.h
+ kernel/qwindowdefs.h
+ kernel/qwindowsysteminterface.cpp kernel/qwindowsysteminterface.h kernel/qwindowsysteminterface_p.h
+ math3d/qgenericmatrix.cpp math3d/qgenericmatrix.h
+ math3d/qmatrix4x4.cpp math3d/qmatrix4x4.h
+ math3d/qquaternion.cpp math3d/qquaternion.h
+ math3d/qvector2d.cpp math3d/qvector2d.h
+ math3d/qvector3d.cpp math3d/qvector3d.h
+ math3d/qvector4d.cpp math3d/qvector4d.h
+ painting/qbackingstore.cpp painting/qbackingstore.h
+ painting/qbezier.cpp painting/qbezier_p.h
+ painting/qblendfunctions.cpp painting/qblendfunctions_p.h
+ painting/qblittable.cpp painting/qblittable_p.h
+ painting/qbrush.cpp painting/qbrush.h
+ painting/qcolor.cpp painting/qcolor.h painting/qcolor_p.h
+ painting/qcolormatrix_p.h
+ painting/qcolorspace.cpp painting/qcolorspace.h painting/qcolorspace_p.h
+ painting/qcolortransferfunction_p.h
+ painting/qcolortransfertable_p.h
+ painting/qcolortransform.cpp painting/qcolortransform.h painting/qcolortransform_p.h
+ painting/qcolortrc_p.h
+ painting/qcolortrclut.cpp painting/qcolortrclut_p.h
+ painting/qcompositionfunctions.cpp
+ painting/qcosmeticstroker.cpp painting/qcosmeticstroker_p.h
+ painting/qdatabuffer_p.h
+ painting/qdrawhelper_p.h
+ painting/qdrawhelper_x86_p.h
+ painting/qdrawingprimitive_sse2_p.h
+ painting/qemulationpaintengine.cpp painting/qemulationpaintengine_p.h
+ painting/qfixed_p.h
+ painting/qgrayraster.c painting/qgrayraster_p.h
+ painting/qicc.cpp painting/qicc_p.h
+ painting/qimagescale.cpp
+ painting/qmemrotate.cpp painting/qmemrotate_p.h
+ painting/qoutlinemapper.cpp painting/qoutlinemapper_p.h
+ painting/qpagedpaintdevice.cpp painting/qpagedpaintdevice.h painting/qpagedpaintdevice_p.h
+ painting/qpagelayout.cpp painting/qpagelayout.h
+ painting/qpagesize.cpp painting/qpagesize.h
+ painting/qpaintdevice.cpp painting/qpaintdevice.h
+ painting/qpaintengine.cpp painting/qpaintengine.h painting/qpaintengine_p.h
+ painting/qpaintengine_blitter.cpp painting/qpaintengine_blitter_p.h
+ painting/qpaintengine_raster.cpp painting/qpaintengine_raster_p.h
+ painting/qpaintengineex.cpp painting/qpaintengineex_p.h
+ painting/qpainter.cpp painting/qpainter.h painting/qpainter_p.h
+ painting/qpainterpath.cpp painting/qpainterpath.h painting/qpainterpath_p.h
+ painting/qpathclipper.cpp painting/qpathclipper_p.h
+ painting/qpathsimplifier.cpp painting/qpathsimplifier_p.h
+ painting/qpdf.cpp painting/qpdf_p.h
+ painting/qpdfwriter.cpp painting/qpdfwriter.h
+ painting/qpen.cpp painting/qpen.h
+ painting/qplatformbackingstore.cpp painting/qplatformbackingstore.h
+ painting/qpolygon.cpp painting/qpolygon.h
+ painting/qpolygonclipper_p.h
+ painting/qrangecollection.cpp painting/qrangecollection.h painting/qrangecollection_p.h
+ painting/qrasterdefs_p.h
+ painting/qrasterizer.cpp painting/qrasterizer_p.h
+ painting/qrbtree_p.h
+ painting/qregion.cpp painting/qregion.h
+ painting/qrgb.h
+ painting/qrgba64.h painting/qrgba64_p.h
+ painting/qstroker.cpp painting/qstroker_p.h
+ painting/qtextureglyphcache.cpp painting/qtextureglyphcache_p.h
+ painting/qtransform.cpp painting/qtransform.h
+ painting/qtriangulatingstroker.cpp painting/qtriangulatingstroker_p.h
+ painting/qtriangulator.cpp painting/qtriangulator_p.h
+ painting/qvectorpath_p.h
+ rhi/qrhi.cpp rhi/qrhi_p.h
+ rhi/qrhi_p_p.h
+ rhi/qrhinull.cpp rhi/qrhinull_p.h
+ rhi/qrhinull_p_p.h
+ rhi/qrhiprofiler.cpp rhi/qrhiprofiler_p.h
+ rhi/qrhiprofiler_p_p.h
+ rhi/qshader.cpp rhi/qshader_p.h
+ rhi/qshader_p_p.h
+ rhi/qshaderdescription.cpp rhi/qshaderdescription_p.h
+ rhi/qshaderdescription_p_p.h
+ text/qabstracttextdocumentlayout.cpp text/qabstracttextdocumentlayout.h text/qabstracttextdocumentlayout_p.h
+ text/qdistancefield.cpp text/qdistancefield_p.h
+ text/qfont.cpp text/qfont.h text/qfont_p.h
+ text/qfontdatabase.cpp text/qfontdatabase.h text/qfontdatabase_p.h
+ text/qfontengine.cpp text/qfontengine_p.h
+ text/qfontengine_qpf2.cpp
+ text/qfontengineglyphcache.cpp text/qfontengineglyphcache_p.h
+ text/qfontinfo.h
+ text/qfontmetrics.cpp text/qfontmetrics.h
+ text/qfontsubset.cpp text/qfontsubset_p.h
+ text/qfragmentmap.cpp text/qfragmentmap_p.h
+ text/qglyphrun.cpp text/qglyphrun.h text/qglyphrun_p.h
+ text/qinputcontrol.cpp text/qinputcontrol_p.h
+ text/qplatformfontdatabase.cpp text/qplatformfontdatabase.h
+ text/qrawfont.cpp text/qrawfont.h text/qrawfont_p.h
+ text/qstatictext.cpp text/qstatictext.h text/qstatictext_p.h
+ text/qsyntaxhighlighter.cpp text/qsyntaxhighlighter.h
+ text/qtextcursor.cpp text/qtextcursor.h text/qtextcursor_p.h
+ text/qtextdocument.cpp text/qtextdocument.h text/qtextdocument_p.cpp text/qtextdocument_p.h
+ text/qtextdocumentfragment.cpp text/qtextdocumentfragment.h text/qtextdocumentfragment_p.h
+ text/qtextdocumentlayout.cpp text/qtextdocumentlayout_p.h
+ text/qtextdocumentwriter.cpp text/qtextdocumentwriter.h
+ text/qtextengine.cpp text/qtextengine_p.h
+ text/qtextformat.cpp text/qtextformat.h text/qtextformat_p.h
+ text/qtexthtmlparser.cpp text/qtexthtmlparser_p.h
+ text/qtextimagehandler.cpp text/qtextimagehandler_p.h
+ text/qtextlayout.cpp text/qtextlayout.h
+ text/qtextlist.cpp text/qtextlist.h
+ text/qtextobject.cpp text/qtextobject.h text/qtextobject_p.h
+ text/qtextoption.cpp text/qtextoption.h
+ text/qtexttable.cpp text/qtexttable.h text/qtexttable_p.h
+ util/qabstractlayoutstyleinfo.cpp util/qabstractlayoutstyleinfo_p.h
+ util/qastchandler.cpp util/qastchandler_p.h
+ util/qdesktopservices.cpp util/qdesktopservices.h
+ util/qgridlayoutengine.cpp util/qgridlayoutengine_p.h
+ util/qhexstring_p.h
+ util/qktxhandler.cpp util/qktxhandler_p.h
+ util/qlayoutpolicy.cpp util/qlayoutpolicy_p.h
+ util/qpkmhandler.cpp util/qpkmhandler_p.h
+ util/qshaderformat.cpp util/qshaderformat_p.h
+ util/qshadergraph.cpp util/qshadergraph_p.h
+ util/qshadergraphloader.cpp util/qshadergraphloader_p.h
+ util/qshaderlanguage.cpp util/qshaderlanguage_p.h
+ util/qshadernode.cpp util/qshadernode_p.h
+ util/qshadernodeport.cpp util/qshadernodeport_p.h
+ util/qshadernodesloader.cpp util/qshadernodesloader_p.h
+ util/qtexturefiledata.cpp util/qtexturefiledata_p.h
+ util/qtexturefilehandler_p.h
+ util/qtexturefilereader.cpp util/qtexturefilereader_p.h
+ util/qvalidator.cpp util/qvalidator.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ QT_QPA_DEFAULT_PLATFORM_NAME="${QT_QPA_DEFAULT_PLATFORM}" # special case
+ INCLUDE_DIRECTORIES
+ ../3rdparty/VulkanMemoryAllocator
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+ NO_PCH_SOURCES # special case
+ "painting/qdrawhelper.cpp" # special case
+ PRECOMPILED_HEADER
+ "kernel/qt_gui_pch.h"
+)
+
+# Resources:
+
+set_source_files_properties("painting/../../3rdparty/icc/sRGB2014.icc"
+ PROPERTIES QT_RESOURCE_ALIAS "sRGB2014.icc"
+)
+set(qpdf_resource_files
+ "../../3rdparty/icc/sRGB2014.icc"
+ "qpdfa_metadata.xml"
+)
+
+qt_add_resource(Gui "qpdf"
+ PREFIX
+ "/qpdf/"
+ BASE
+ "painting"
+ FILES
+ ${qpdf_resource_files}
+)
+
+if(QT_FEATURE_reduce_relocations AND UNIX AND GCC)
+ target_link_options(Gui PRIVATE
+ "LINKER:--dynamic-list=${CMAKE_CURRENT_LIST_DIR}/QtGui.dynlist")
+endif()
+
+# special case begin
+# Replace arch_haswell with avx2 feature. That is what is used in the code requireing
+# this file, too!
+qt_add_simd_part(Gui SIMD avx2
+ SOURCES
+ painting/qdrawhelper_avx2.cpp
+)
+# special case end
+
+# special case begin
+qt_extend_target(Gui CONDITION QT_FEATURE_standarditemmodel
+ SOURCES
+ itemmodels/qstandarditemmodel.cpp itemmodels/qstandarditemmodel.h itemmodels/qstandarditemmodel_p.h
+)
+# special case end
+
+
+#### Keys ignored in scope 1:.:.:gui.pro:<TRUE>:
+# MODULE_PLUGIN_TYPES = "platforms" "platforms/darwin" "xcbglintegrations" "platformthemes" "platforminputcontexts" "generic" "iconengines" "imageformats" "egldeviceintegrations"
+# QMAKE_DYNAMIC_LIST_FILE = "$$PWD/QtGui.dynlist"
+# QMAKE_LIBS = "$$QMAKE_LIBS_GUI"
+
+## Scopes:
+#####################################################################
+
+# special case begin
+# With qmake, gui's opengl.pri used CONFIG += opengl, where opengl.prf
+# used direct public linkage against either libGLESv2 or libGL, depending
+# on the opengl _feature_. This is done by hand now here (where the
+# feature is available).
+# DO NOT MOVE THIS TO THE BEGINNING OF THE FILE, the feature variables are not
+# available until the qt_add_module call.
+if(QT_FEATURE_opengl)
+ if(QT_FEATURE_opengles2)
+ find_package(GLESv2)
+ target_link_libraries(Gui PUBLIC GLESv2::GLESv2)
+ else()
+ find_package(OpenGL)
+ target_link_libraries(Gui PUBLIC OpenGL::GL)
+ endif()
+endif()
+# special case end
+
+qt_extend_target(Gui CONDITION QT_FEATURE_opengl
+ SOURCES
+ kernel/qopenglcontext.cpp kernel/qopenglcontext.h kernel/qopenglcontext_p.h
+ kernel/qplatformopenglcontext.cpp kernel/qplatformopenglcontext.h
+ opengl/qopengl.cpp opengl/qopengl.h opengl/qopengl_p.h
+ opengl/qopenglextensions_p.h
+ opengl/qopenglextrafunctions.h
+ opengl/qopenglfunctions.cpp opengl/qopenglfunctions.h
+ opengl/qopenglprogrambinarycache.cpp opengl/qopenglprogrambinarycache_p.h
+ rhi/qrhigles2.cpp rhi/qrhigles2_p.h
+ rhi/qrhigles2_p_p.h
+)
+
+#### Keys ignored in scope 2:.:.:gui.pro:QT_FEATURE_opengl:
+# MODULE_CONFIG = "opengl"
+
+#### Keys ignored in scope 3:.:.:gui.pro:QT_FEATURE_angle:
+# MODULE_AUX_INCLUDES = "\$\$QT_MODULE_INCLUDE_BASE/QtANGLE"
+
+qt_extend_target(Gui CONDITION MACOS
+ LIBRARIES
+ ${FWAppKit}
+ PUBLIC_LIBRARIES
+ ${FWAppKit}
+)
+
+qt_extend_target(Gui CONDITION APPLE
+ SOURCES
+ image/qimage_darwin.mm
+ painting/qcoregraphics.mm painting/qcoregraphics_p.h
+ LIBRARIES
+ ${FWCoreGraphics}
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_animation
+ SOURCES
+ animation/qguivariantanimation.cpp
+)
+
+qt_extend_target(Gui CONDITION WIN32
+ SOURCES
+ kernel/qwindowdefs_win.h
+ rhi/qrhid3d11.cpp rhi/qrhid3d11_p.h
+ rhi/qrhid3d11_p_p.h
+ PUBLIC_LIBRARIES
+ d3d11
+ dxgi
+ dxguid
+)
+
+#### Keys ignored in scope 8:.:.:gui.pro:WIN32:
+# CMAKE_WINDOWS_BUILD = "True"
+
+#### Keys ignored in scope 11:.:.:gui.pro:QT_FEATURE_egl:
+# CMAKE_EGL_LIBS = "$$cmakeProcessLibs($$QMAKE_LIBS_EGL)"
+
+#### Keys ignored in scope 12:.:.:gui.pro:NOT QMAKE_LIBDIR_EGL_ISEMPTY:
+# CMAKE_EGL_LIBDIR = "$$cmakeTargetPath($$QMAKE_LIBDIR_EGL)"
+
+#### Keys ignored in scope 13:.:.:gui.pro:QT_FEATURE_opengles2:
+# CMAKE_GL_HEADER_NAME = "GLES2/gl2.h"
+# CMAKE_OPENGL_INCDIRS = "$$cmakePortablePaths($$QMAKE_INCDIR_OPENGL_ES2)"
+# CMAKE_OPENGL_LIBS = "$$cmakeProcessLibs($$QMAKE_LIBS_OPENGL_ES2)"
+# CMAKE_QT_OPENGL_IMPLEMENTATION = "GLESv2"
+
+#### Keys ignored in scope 14:.:.:gui.pro:NOT QMAKE_INCDIR_OPENGL_ES2_ISEMPTY:
+# CMAKE_GL_INCDIRS = "$$cmakeTargetPaths($$QMAKE_INCDIR_OPENGL_ES2)"
+
+#### Keys ignored in scope 15:.:.:gui.pro:NOT QMAKE_LIBDIR_OPENGL_ES2_ISEMPTY:
+# CMAKE_OPENGL_LIBDIR = "$$cmakePortablePaths($$QMAKE_LIBDIR_OPENGL_ES2)"
+
+#### Keys ignored in scope 17:.:.:gui.pro:QT_FEATURE_opengl:
+# CMAKE_GL_HEADER_NAME = "GL/gl.h"
+# CMAKE_OPENGL_INCDIRS = "$$cmakePortablePaths($$QMAKE_INCDIR_OPENGL)"
+# CMAKE_QT_OPENGL_IMPLEMENTATION = "GL"
+
+#### Keys ignored in scope 18:.:.:gui.pro:NOT QMAKE_INCDIR_OPENGL_ISEMPTY:
+# CMAKE_GL_INCDIRS = "$$cmakeTargetPaths($$QMAKE_INCDIR_OPENGL)"
+
+#### Keys ignored in scope 19:.:.:gui.pro:NOT QT_FEATURE_dynamicgl:
+# CMAKE_OPENGL_LIBS = "$$cmakeProcessLibs($$QMAKE_LIBS_OPENGL)"
+
+#### Keys ignored in scope 20:.:.:gui.pro:NOT QMAKE_LIBDIR_OPENGL_ISEMPTY:
+# CMAKE_OPENGL_LIBDIR = "$$cmakePortablePaths($$QMAKE_LIBDIR_OPENGL)"
+
+#### Keys ignored in scope 21:.:.:gui.pro:APPLE:
+# CMAKE_GL_HEADER_NAME = "gl.h"
+
+#### Keys ignored in scope 22:.:.:gui.pro:QT_FEATURE_egl:
+# CMAKE_EGL_INCDIRS = "$$cmakePortablePaths($$QMAKE_INCDIR_EGL)"
+
+qt_extend_target(Gui CONDITION QT_FEATURE_accessibility
+ SOURCES
+ accessible/qaccessible.cpp accessible/qaccessible.h
+ accessible/qaccessiblebridge.cpp accessible/qaccessiblebridge.h
+ accessible/qaccessiblecache.cpp accessible/qaccessiblecache_p.h
+ accessible/qaccessibleobject.cpp accessible/qaccessibleobject.h
+ accessible/qaccessibleplugin.cpp accessible/qaccessibleplugin.h
+ accessible/qplatformaccessibility.cpp accessible/qplatformaccessibility.h
+)
+
+qt_extend_target(Gui CONDITION APPLE AND QT_FEATURE_accessibility
+ SOURCES
+ accessible/qaccessiblecache_mac.mm
+ LIBRARIES
+ ${FWFoundation}
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_action
+ SOURCES
+ kernel/qaction.cpp kernel/qaction.h kernel/qaction_p.h
+ kernel/qactiongroup.cpp kernel/qactiongroup.h kernel/qactiongroup_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_draganddrop
+ SOURCES
+ kernel/qdnd.cpp kernel/qdnd_p.h
+ kernel/qdrag.cpp kernel/qdrag.h
+ kernel/qplatformdrag.cpp kernel/qplatformdrag.h
+ kernel/qshapedpixmapdndwindow.cpp kernel/qshapedpixmapdndwindow_p.h
+ kernel/qsimpledrag.cpp kernel/qsimpledrag_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_shortcut
+ SOURCES
+ kernel/qkeysequence.cpp kernel/qkeysequence.h kernel/qkeysequence_p.h
+ kernel/qshortcut.cpp kernel/qshortcut.h kernel/qshortcut_p.h
+ kernel/qshortcutmap.cpp kernel/qshortcutmap_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_movie
+ SOURCES
+ image/qmovie.cpp image/qmovie.h
+)
+
+qt_extend_target(Gui CONDITION WIN32 AND NOT WINRT
+ SOURCES
+ image/qpixmap_win.cpp
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_png
+ SOURCES
+ image/qpnghandler.cpp image/qpnghandler_p.h
+ LIBRARIES
+ WrapPNG::WrapPNG
+)
+
+#### Keys ignored in scope 38:.:image:image/image.pri:WIN32 AND mingw:
+# GCC_VERSION = "$${QMAKE_GCC_MAJOR_VERSION}.$${QMAKE_GCC_MINOR_VERSION}.$${QMAKE_GCC_PATCH_VERSION}"
+
+qt_extend_target(Gui CONDITION ((QT_FEATURE_png) AND (WIN32 AND mingw)) AND (GCC_VERSION___equals___8.1.0)
+ COMPILE_OPTIONS
+ -fno-reorder-blocks-and-partition
+)
+
+if(NOT ANDROID)
+ qt_add_simd_part(Gui SIMD sse2
+ SOURCES
+ painting/qdrawhelper_sse2.cpp
+ )
+
+ qt_add_simd_part(Gui SIMD ssse3
+ SOURCES
+ image/qimage_ssse3.cpp
+ painting/qdrawhelper_ssse3.cpp
+ )
+
+ qt_add_simd_part(Gui SIMD sse4_1
+ SOURCES
+ painting/qdrawhelper_sse4.cpp
+ painting/qimagescale_sse4.cpp
+ )
+
+ qt_add_simd_part(Gui SIMD neon
+ SOURCES
+ image/qimage_neon.cpp
+ painting/qdrawhelper_neon.cpp painting/qdrawhelper_neon_p.h
+ painting/qimagescale_neon.cpp
+ )
+
+ qt_add_simd_part(Gui SIMD mips_dsp
+ SOURCES
+ painting/qdrawhelper_mips_dsp.cpp painting/qdrawhelper_mips_dsp_p.h
+ painting/qdrawhelper_mips_dsp_asm.S
+ painting/qt_mips_asm_dsp_p.h
+ )
+
+ qt_add_simd_part(Gui SIMD mips_dspr2
+ SOURCES
+ image/qimage_mips_dspr2.cpp
+ image/qimage_mips_dspr2_asm.S
+ painting/qdrawhelper_mips_dspr2_asm.S
+ )
+
+ qt_add_simd_part(Gui SIMD arch_haswell
+ SOURCES
+ painting/qdrawhelper_avx2.cpp
+ )
+endif()
+
+qt_extend_target(Gui CONDITION ANDROID AND (TEST_architecture_arch STREQUAL arm64 OR TEST_architecture_arch STREQUAL arm) # special case
+ SOURCES
+ image/qimage_neon.cpp
+ painting/qdrawhelper_neon.cpp painting/qdrawhelper_neon_p.h
+ painting/qimagescale_neon.cpp
+)
+
+qt_extend_target(Gui CONDITION ANDROID AND (TEST_architecture_arch STREQUAL i386 OR TEST_architecture_arch STREQUAL x86_64)
+ SOURCES
+ image/qimage_ssse3.cpp
+ painting/qdrawhelper_sse2.cpp
+ painting/qdrawhelper_ssse3.cpp
+ DEFINES
+ QT_COMPILER_SUPPORTS_SSE2 QT_COMPILER_SUPPORTS_SSE2
+ QT_COMPILER_SUPPORTS_SSE3 QT_COMPILER_SUPPORTS_SSE3
+ QT_COMPILER_SUPPORTS_SSSE3 QT_COMPILER_SUPPORTS_SSSE3
+)
+
+# special case begin
+if (MINGW AND CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 8.1.0)
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86048
+ set_source_files_properties(image/qpnghandler.cpp
+ PROPERTIES COMPILE_OPTIONS -fno-reorder-blocks-and-partition
+ )
+endif()
+# special case end
+
+qt_extend_target(Gui CONDITION QT_FEATURE_harfbuzz
+ SOURCES
+ text/qharfbuzzng.cpp text/qharfbuzzng_p.h
+ LIBRARIES
+ WrapHarfbuzz::WrapHarfbuzz
+)
+
+# special case begin
+# Replicate what src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro does, which is link CoreText
+# when targeting uikit.
+
+qt_extend_target(Gui CONDITION QT_FEATURE_harfbuzz AND UIKIT
+ LIBRARIES
+ ${FWCoreText}
+)
+# special case end
+
+qt_extend_target(Gui CONDITION QT_FEATURE_textodfwriter
+ SOURCES
+ text/qtextodfwriter.cpp text/qtextodfwriter_p.h
+ text/qzip.cpp
+ text/qzipreader_p.h
+ text/qzipwriter_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_textmarkdownreader
+ SOURCES
+ text/qtextmarkdownimporter.cpp text/qtextmarkdownimporter_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_system_textmarkdownreader AND QT_FEATURE_textmarkdownreader
+ LIBRARIES
+ libmd4c
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_textmarkdownreader AND NOT QT_FEATURE_system_textmarkdownreader
+ SOURCES
+ ../3rdparty/md4c/md4c.c ../3rdparty/md4c/md4c.h
+ DEFINES
+ MD4C_USE_UTF8
+ INCLUDE_DIRECTORIES
+ ../3rdparty/md4c
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_textmarkdownwriter
+ SOURCES
+ text/qtextmarkdownwriter.cpp text/qtextmarkdownwriter_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_cssparser
+ SOURCES
+ painting/qcssutil.cpp
+ text/qcssparser.cpp text/qcssparser_p.h
+)
+
+qt_extend_target(Gui CONDITION UNIX AND NOT ANDROID AND NOT INTEGRITY AND NOT (TEST_architecture_arch STREQUAL "arm64") AND NOT UIKIT
+ DEFINES
+ ENABLE_PIXMAN_DRAWHELPERS
+)
+
+if(UNIX AND NOT ANDROID AND NOT INTEGRITY AND NOT (TEST_architecture_arch STREQUAL "arm64") AND NOT UIKIT)
+ qt_add_simd_part(Gui SIMD neon
+ SOURCES
+ ../3rdparty/pixman/pixman-arm-neon-asm.S
+ painting/qdrawhelper_neon_asm.S
+ )
+endif()
+
+qt_extend_target(Gui CONDITION ANDROID AND TEST_architecture_arch STREQUAL x86_64
+ SOURCES
+ painting/qdrawhelper_sse4.cpp
+ painting/qimagescale_sse4.cpp
+ DEFINES
+ QT_COMPILER_SUPPORTS_SSE4_1
+ QT_COMPILER_SUPPORTS_SSE4_2
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_system_zlib
+ LIBRARIES
+ ZLIB::ZLIB
+)
+
+qt_extend_target(Gui CONDITION NOT QT_FEATURE_system_zlib
+ INCLUDE_DIRECTORIES
+ ../3rdparty/zlib/src
+)
+
+qt_extend_target(Gui CONDITION NOT QT_FEATURE_system_zlib AND NOT no_core_dep
+ LIBRARIES
+ Qt::Core
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_regularexpression
+ SOURCES
+ util/qshadergenerator.cpp util/qshadergenerator_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_undocommand
+ SOURCES
+ util/qundostack.cpp util/qundostack.h util/qundostack_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_undogroup
+ SOURCES
+ util/qundogroup.cpp util/qundogroup.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_vulkan
+ SOURCES
+ rhi/qrhivulkan.cpp rhi/qrhivulkan_p.h
+ rhi/qrhivulkan_p_p.h
+ vulkan/qplatformvulkaninstance.cpp vulkan/qplatformvulkaninstance.h
+ vulkan/qvulkanfunctions.cpp
+ vulkan/qvulkaninstance.cpp vulkan/qvulkaninstance.h
+ vulkan/qvulkanwindow.cpp vulkan/qvulkanwindow.h vulkan/qvulkanwindow_p.h
+ PUBLIC_LIBRARIES
+ Vulkan::Vulkan_nolink
+)
+
+#### Keys ignored in scope 82:.:vulkan:vulkan/vulkan.pri:QT_FEATURE_vkgen:
+# special case begin
+# We must always generate syncqt-injected header files,
+# because we added a custom command earlier for those for framework builds.
+set(vulkan_fun "qvulkanfunctions.h")
+set(vulkan_fun_p "qvulkanfunctions_p.h")
+set(vulkan_fun_outputs "vulkan/${vulkan_fun}" "vulkan/${vulkan_fun_p}")
+set(vulkan_fun_command_content COMMAND "${CMAKE_COMMAND}" -E make_directory "vulkan")
+if (QT_FEATURE_vulkan)
+ set(vulkan_fun_p_cpp "qvulkanfunctions_p.cpp")
+ list(APPEND vulkan_fun_outputs "vulkan/${vulkan_fun_p_cpp}")
+
+ list(APPEND vulkan_fun_command_content
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::qvkgen
+ "${CMAKE_CURRENT_SOURCE_DIR}/vulkan/vk.xml"
+ "${PROJECT_SOURCE_DIR}/header.LGPL"
+ "${CMAKE_CURRENT_BINARY_DIR}/vulkan/qvulkanfunctions"
+ DEPENDS vulkan/vk.xml
+ COMMENT "Generating vulkan data"
+ )
+
+ extend_target(Gui
+ SOURCES
+ "${CMAKE_CURRENT_BINARY_DIR}/vulkan/${vulkan_fun}"
+ "${CMAKE_CURRENT_BINARY_DIR}/vulkan/${vulkan_fun_p}"
+ "${CMAKE_CURRENT_BINARY_DIR}/vulkan/${vulkan_fun_p_cpp}"
+ )
+else()
+ foreach(file ${vulkan_fun_outputs})
+ list(APPEND vulkan_fun_command_content
+ COMMAND "${CMAKE_COMMAND}" -E touch "${file}")
+ endforeach()
+endif()
+add_custom_command(
+ OUTPUT ${vulkan_fun_outputs}
+ ${vulkan_fun_command_content}
+ WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
+)
+# special case end
+
+#### Keys ignored in scope 68:.:vulkan:vulkan/vulkan.pri:QT_FEATURE_vkgen:
+# QMAKE_EXTRA_COMPILERS = "qvkgen_h" "qvkgen_ph" "qvkgen_pimpl"
+# QMAKE_QVKGEN_INPUT = "vulkan/vk.xml"
+# QMAKE_QVKGEN_LICENSE_HEADER = "$$QT_SOURCE_TREE/header.LGPL"
+# qvkgen_h.commands = "$$QMAKE_QVKGEN" "${QMAKE_FILE_IN}" "$$shell_quote($$QMAKE_QVKGEN_LICENSE_HEADER)" "${QMAKE_FILE_OUT_PATH}/${QMAKE_FILE_OUT_BASE}"
+# qvkgen_h.input = "QMAKE_QVKGEN_INPUT"
+# qvkgen_h.output = "$$OUT_PWD/vulkan/qvulkanfunctions.h"
+# qvkgen_ph.commands = "$$escape_expand(\\n)"
+# qvkgen_ph.depends = "$$OUT_PWD/vulkan/qvulkanfunctions.h"
+# qvkgen_ph.input = "QMAKE_QVKGEN_INPUT"
+# qvkgen_ph.output = "$$OUT_PWD/vulkan/qvulkanfunctions_p.h"
+# qvkgen_pimpl.commands = "$$escape_expand(\\n)"
+# qvkgen_pimpl.depends = "$$OUT_PWD/vulkan/qvulkanfunctions_p.h"
+# qvkgen_pimpl.input = "QMAKE_QVKGEN_INPUT"
+# qvkgen_pimpl.output = "$$OUT_PWD/vulkan/qvulkanfunctions_p.cpp"
+
+#### Keys ignored in scope 83:.:vulkan:vulkan/vulkan.pri:QT_FEATURE_vulkan:
+# qvkgen_h.variable_out = "HEADERS"
+
+#### Keys ignored in scope 84:.:vulkan:vulkan/vulkan.pri:else:
+# qvkgen_h.CONFIG = "target_predeps" "no_link"
+
+qt_extend_target(Gui CONDITION WASM
+ SOURCES
+ platform/wasm/qwasmlocalfileaccess.cpp platform/wasm/qwasmlocalfileaccess_p.h
+)
+
+qt_extend_target(Gui CONDITION IOS OR MACOS
+ SOURCES
+ rhi/qrhimetal.mm rhi/qrhimetal_p.h
+ rhi/qrhimetal_p_p.h
+ PUBLIC_LIBRARIES
+ ${FWMetal}
+)
+
+qt_extend_target(Gui CONDITION NOT GCC OR NOT QT_COMPILER_VERSION_MAJOR STREQUAL 5
+ SOURCES
+ painting/qdrawhelper.cpp
+ NO_PCH_SOURCES
+ "painting/qdrawhelper.cpp"
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_undocommand
+ SOURCES
+ util/qundostack.cpp util/qundostack.h util/qundostack_p.h
+)
+
+qt_extend_target(Gui CONDITION QT_FEATURE_undogroup
+ SOURCES
+ util/qundogroup.cpp util/qundogroup.h
+)
+
+qt_create_tracepoints(Gui qtgui.tracepoints)
+qt_add_docs(Gui
+ doc/qtgui.qdocconf
+)
+
diff --git a/src/gui/Qt5GuiConfigExtras.cmake.in b/src/gui/Qt5GuiConfigExtras.cmake.in
deleted file mode 100644
index 84dbbfebd4..0000000000
--- a/src/gui/Qt5GuiConfigExtras.cmake.in
+++ /dev/null
@@ -1,193 +0,0 @@
-
-!!IF !isEmpty(CMAKE_ANGLE_EGL_DLL_RELEASE)
-
-!!IF isEmpty(CMAKE_INCLUDE_DIR_IS_ABSOLUTE)
-set(Qt5Gui_EGL_INCLUDE_DIRS \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$$CMAKE_INCLUDE_DIR/QtANGLE\")
-!!ELSE
-set(Qt5Gui_EGL_INCLUDE_DIRS \"$$CMAKE_INCLUDE_DIR/QtANGLE\")
-!!ENDIF
-
-_qt5_Gui_check_file_exists(${Qt5Gui_EGL_INCLUDE_DIRS})
-
-list(APPEND Qt5Gui_INCLUDE_DIRS ${Qt5Gui_EGL_INCLUDE_DIRS})
-set_property(TARGET Qt5::Gui APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${Qt5Gui_EGL_INCLUDE_DIRS})
-set(Qt5Gui_OPENGL_INCLUDE_DIRS ${Qt5Gui_EGL_INCLUDE_DIRS})
-
-macro(_populate_qt5gui_gl_target_properties TargetName Configuration LIB_LOCATION IMPLIB_LOCATION)
- set_property(TARGET Qt5::${TargetName} APPEND PROPERTY IMPORTED_CONFIGURATIONS ${Configuration})
-
-!!IF isEmpty(CMAKE_DLL_DIR_IS_ABSOLUTE)
- set(imported_location \"${_qt5Gui_install_prefix}/$${CMAKE_DLL_DIR}${LIB_LOCATION}\")
-!!ELSE
- set(imported_location \"$${CMAKE_DLL_DIR}${LIB_LOCATION}\")
-!!ENDIF
-
-!!IF isEmpty(CMAKE_LIB_DIR_IS_ABSOLUTE)
- set(imported_implib \"${_qt5Gui_install_prefix}/$${CMAKE_LIB_DIR}${IMPLIB_LOCATION}\")
-!!ELSE
- set(imported_implib \"$${CMAKE_LIB_DIR}${IMPLIB_LOCATION}\")
-!!ENDIF
-
- set_target_properties(Qt5::${TargetName} PROPERTIES
- \"IMPORTED_LOCATION_${Configuration}\" ${imported_location}
- \"IMPORTED_IMPLIB_${Configuration}\" ${imported_implib}
- )
-endmacro()
-
-add_library(Qt5::Gui_EGL SHARED IMPORTED)
-_populate_qt5gui_gl_target_properties(Gui_EGL RELEASE $${CMAKE_ANGLE_EGL_DLL_RELEASE} $${CMAKE_ANGLE_EGL_IMPLIB_RELEASE})
-add_library(Qt5::Gui_GLESv2 SHARED IMPORTED)
-_populate_qt5gui_gl_target_properties(Gui_GLESv2 RELEASE $${CMAKE_ANGLE_GLES2_DLL_RELEASE} $${CMAKE_ANGLE_GLES2_IMPLIB_RELEASE})
-
-set_property(TARGET Qt5::Gui_EGL APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${Qt5Gui_EGL_INCLUDE_DIRS})
-set_property(TARGET Qt5::Gui_GLESv2 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${Qt5Gui_OPENGL_INCLUDE_DIRS})
-
-!!IF !isEmpty(CMAKE_DEBUG_TYPE)
-_populate_qt5gui_gl_target_properties(Gui_EGL DEBUG $${CMAKE_ANGLE_EGL_DLL_DEBUG} $${CMAKE_ANGLE_EGL_IMPLIB_DEBUG})
-_populate_qt5gui_gl_target_properties(Gui_GLESv2 DEBUG $${CMAKE_ANGLE_GLES2_DLL_DEBUG} $${CMAKE_ANGLE_GLES2_IMPLIB_DEBUG})
-!!ENDIF
-
-set(Qt5Gui_EGL_LIBRARIES Qt5::Gui_EGL)
-set(Qt5Gui_OPENGL_LIBRARIES Qt5::Gui_GLESv2)
-
-!!ELSE
-
-!!IF !isEmpty(CMAKE_GL_INCDIRS)
-
-set(_GL_INCDIRS $$CMAKE_GL_INCDIRS)
-find_path(_qt5gui_OPENGL_INCLUDE_DIR $$CMAKE_GL_HEADER_NAME
- PATHS ${_GL_INCDIRS}
-)
-if (NOT _qt5gui_OPENGL_INCLUDE_DIR)
- message(FATAL_ERROR \"Failed to find \\\"$$CMAKE_GL_HEADER_NAME\\\" in \\\"${_GL_INCDIRS}\\\".\")
-endif()
-unset(_GL_INCDIRS)
-
-# Don\'t check for existence of the "_qt5gui_OPENGL_INCLUDE_DIR" because it is
-# optional.
-
-list(APPEND Qt5Gui_INCLUDE_DIRS ${_qt5gui_OPENGL_INCLUDE_DIR})
-set_property(TARGET Qt5::Gui APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${_qt5gui_OPENGL_INCLUDE_DIR})
-
-unset(_qt5gui_OPENGL_INCLUDE_DIR CACHE)
-
-!!ENDIF
-
-macro(_qt5gui_find_extra_libs Name Libs LibDir IncDirs)
- set(Qt5Gui_${Name}_LIBRARIES)
-!!IF !mac
- set(Qt5Gui_${Name}_INCLUDE_DIRS ${IncDirs})
-!!ELSE
- foreach(_dir ${IncDirs})
- if (EXISTS ${_dir})
- list(APPEND Qt5Gui_${Name}_INCLUDE_DIRS ${_dir})
- else()
- find_path(_actual_dir ${_dir}) # Look in sdk directories
- if (_actual_dir)
- list(APPEND Qt5Gui_${Name}_INCLUDE_DIRS ${_actual_dir})
- endif()
- unset(_actual_dir CACHE)
- endif()
- endforeach()
-!!ENDIF
- foreach(_lib ${Libs})
- if (IS_ABSOLUTE ${_lib})
- get_filename_component(_libFile ${_lib} NAME_WE)
- if (_libFile MATCHES \"^${CMAKE_SHARED_LIBRARY_PREFIX}(.*)\")
- set(_libFile ${CMAKE_MATCH_1})
- endif()
- else()
- set(_libFile ${_lib})
- endif()
-
- string(REGEX REPLACE "[^_A-Za-z0-9]" "_" _cmake_lib_name ${_libFile})
- if (NOT TARGET Qt5::Gui_${_cmake_lib_name} AND NOT _Qt5Gui_${_cmake_lib_name}_LIBRARY_DONE)
- if (IS_ABSOLUTE ${_lib})
- set(Qt5Gui_${_cmake_lib_name}_LIBRARY ${_lib})
- else()
- find_library(Qt5Gui_${_cmake_lib_name}_LIBRARY ${_lib}
-!!IF !isEmpty(CROSS_COMPILE)
- PATHS \"${LibDir}\"
-!!IF !mac
- NO_DEFAULT_PATH
-!!ENDIF
-!!ENDIF
- )
- endif()
-!!IF mac
- set(Qt5Gui_${_cmake_lib_name}_LIBRARY "${Qt5Gui_${_cmake_lib_name}_LIBRARY}/${_lib}")
- if (NOT EXISTS "${Qt5Gui_${_cmake_lib_name}_LIBRARY}")
- set(Qt5Gui_${_cmake_lib_name}_LIBRARY)
- endif()
-!!ENDIF
- if (NOT Qt5Gui_${_cmake_lib_name}_LIBRARY)
- # The above find_library call doesn\'t work for finding
- # libraries in Windows SDK paths outside of the proper
- # environment, even if the libraries are present. In other
- # cases it is OK for the libraries to not be found
- # because they are optional dependencies of Qt5Gui, needed
- # only if the qopengl.h header is used.
- # We try to find the libraries in the first place because Qt may be
- # compiled with another set of GL libraries (such as coming
- # from ANGLE). The point of these find calls is to try to
- # find the same binaries as Qt is compiled with (as they are
- # in the interface of QtGui), so an effort is made to do so
- # above with paths known to qmake.
- set(_Qt5Gui_${_cmake_lib_name}_LIBRARY_DONE TRUE)
- unset(Qt5Gui_${_cmake_lib_name}_LIBRARY CACHE)
- else()
- add_library(Qt5::Gui_${_cmake_lib_name} SHARED IMPORTED)
- set_property(TARGET Qt5::Gui_${_cmake_lib_name} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${Qt5Gui_${Name}_INCLUDE_DIRS})
-
- set_property(TARGET Qt5::Gui_${_cmake_lib_name} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
- _qt5_Gui_check_file_exists(\"${Qt5Gui_${_cmake_lib_name}_LIBRARY}\")
- set_property(TARGET Qt5::Gui_${_cmake_lib_name} PROPERTY IMPORTED_LOCATION_RELEASE \"${Qt5Gui_${_cmake_lib_name}_LIBRARY}\")
-
-!!IF !isEmpty(CMAKE_WINDOWS_BUILD)
- set_property(TARGET Qt5::Gui_${_cmake_lib_name} PROPERTY IMPORTED_IMPLIB_RELEASE \"${Qt5Gui_${_cmake_lib_name}_LIBRARY}\")
-!!ENDIF
- unset(Qt5Gui_${_cmake_lib_name}_LIBRARY CACHE)
-
- find_library(Qt5Gui_${_cmake_lib_name}_LIBRARY_DEBUG ${_lib}d
- PATHS \"${LibDir}\"
-!!IF !mac
- NO_DEFAULT_PATH
-!!ENDIF
- )
- if (Qt5Gui_${_cmake_lib_name}_LIBRARY_DEBUG)
- set_property(TARGET Qt5::Gui_${_cmake_lib_name} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
- _qt5_Gui_check_file_exists(\"${Qt5Gui_${_cmake_lib_name}_LIBRARY_DEBUG}\")
- set_property(TARGET Qt5::Gui_${_cmake_lib_name} PROPERTY IMPORTED_LOCATION_DEBUG \"${Qt5Gui_${_cmake_lib_name}_LIBRARY_DEBUG}\")
-!!IF !isEmpty(CMAKE_WINDOWS_BUILD)
- set_property(TARGET Qt5::Gui_${_cmake_lib_name} PROPERTY IMPORTED_IMPLIB_DEBUG \"${Qt5Gui_${_cmake_lib_name}_LIBRARY_DEBUG}\")
-!!ENDIF
- endif()
- unset(Qt5Gui_${_cmake_lib_name}_LIBRARY_DEBUG CACHE)
- list(APPEND Qt5Gui_${Name}_LIBRARIES Qt5::Gui_${_cmake_lib_name})
- endif()
- endif()
- endforeach()
-endmacro()
-
-
-!!IF !isEmpty(CMAKE_EGL_LIBS)
-_qt5gui_find_extra_libs(EGL \"$$CMAKE_EGL_LIBS\" \"$$CMAKE_EGL_LIBDIR\" \"$$CMAKE_EGL_INCDIRS\")
-!!ENDIF
-
-!!IF !isEmpty(CMAKE_OPENGL_LIBS)
-_qt5gui_find_extra_libs(OPENGL \"$$CMAKE_OPENGL_LIBS\" \"$$CMAKE_OPENGL_LIBDIR\" \"$$CMAKE_OPENGL_INCDIRS\")
-
-!!ENDIF
-
-!!ENDIF
-
-set(Qt5Gui_OPENGL_IMPLEMENTATION $$CMAKE_QT_OPENGL_IMPLEMENTATION)
-
-get_target_property(_configs Qt5::Gui IMPORTED_CONFIGURATIONS)
-foreach(_config ${_configs})
- set_property(TARGET Qt5::Gui APPEND PROPERTY
- IMPORTED_LINK_DEPENDENT_LIBRARIES_${_config}
- ${Qt5Gui_EGL_LIBRARIES} ${Qt5Gui_OPENGL_LIBRARIES}
- )
-endforeach()
-unset(_configs)
diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp
index a789e65284..6edcd7befa 100644
--- a/src/gui/accessible/qaccessible.cpp
+++ b/src/gui/accessible/qaccessible.cpp
@@ -619,7 +619,6 @@ QAccessible::RootObjectHandler QAccessible::installRootObjectHandler(RootObjectH
QAccessible::ActivationObserver::~ActivationObserver()
{
- // must be empty until ### Qt 6
}
/*!
@@ -1334,7 +1333,6 @@ QColor QAccessibleInterface::backgroundColor() const
*/
QAccessibleEvent::~QAccessibleEvent()
{
- // must be empty until ### Qt 6
}
/*! \fn QAccessible::Event QAccessibleEvent::type() const
@@ -1414,7 +1412,6 @@ QAccessible::Id QAccessibleEvent::uniqueId() const
*/
QAccessibleValueChangeEvent::~QAccessibleValueChangeEvent()
{
- // must be empty until ### Qt 6
}
/*!
@@ -1458,7 +1455,6 @@ QAccessibleValueChangeEvent::~QAccessibleValueChangeEvent()
*/
QAccessibleStateChangeEvent::~QAccessibleStateChangeEvent()
{
- // must be empty until ### Qt 6
}
/*!
@@ -1538,7 +1534,6 @@ QAccessibleStateChangeEvent::~QAccessibleStateChangeEvent()
*/
QAccessibleTableModelChangeEvent::~QAccessibleTableModelChangeEvent()
{
- // must be empty until ### Qt 6
}
/*!
\class QAccessibleTextCursorEvent
@@ -1567,7 +1562,6 @@ QAccessibleTableModelChangeEvent::~QAccessibleTableModelChangeEvent()
*/
QAccessibleTextCursorEvent::~QAccessibleTextCursorEvent()
{
- // must be empty until ### Qt 6
}
@@ -1608,7 +1602,6 @@ QAccessibleTextCursorEvent::~QAccessibleTextCursorEvent()
*/
QAccessibleTextInsertEvent::~QAccessibleTextInsertEvent()
{
- // must be empty until ### Qt 6
}
@@ -1651,7 +1644,6 @@ QAccessibleTextInsertEvent::~QAccessibleTextInsertEvent()
*/
QAccessibleTextRemoveEvent::~QAccessibleTextRemoveEvent()
{
- // must be empty until ### Qt 6
}
/*!
@@ -1713,7 +1705,6 @@ QAccessibleTextRemoveEvent::~QAccessibleTextRemoveEvent()
*/
QAccessibleTextUpdateEvent::~QAccessibleTextUpdateEvent()
{
- // must be empty until ### Qt 6
}
@@ -1748,7 +1739,6 @@ QAccessibleTextUpdateEvent::~QAccessibleTextUpdateEvent()
*/
QAccessibleTextSelectionEvent::~QAccessibleTextSelectionEvent()
{
- // must be empty until ### Qt 6
}
@@ -1978,7 +1968,6 @@ QDebug operator<<(QDebug d, const QAccessibleEvent &ev)
*/
QAccessibleTextInterface::~QAccessibleTextInterface()
{
- // must be empty until ### Qt 6
}
/*!
@@ -2367,7 +2356,6 @@ QString QAccessibleTextInterface::textAtOffset(int offset, QAccessible::TextBoun
*/
QAccessibleEditableTextInterface::~QAccessibleEditableTextInterface()
{
- // must be empty until ### Qt 6
}
/*!
@@ -2412,7 +2400,6 @@ QAccessibleEditableTextInterface::~QAccessibleEditableTextInterface()
*/
QAccessibleValueInterface::~QAccessibleValueInterface()
{
- // must be empty until ### Qt 6
}
/*!
@@ -2476,7 +2463,6 @@ QAccessibleValueInterface::~QAccessibleValueInterface()
*/
QAccessibleImageInterface::~QAccessibleImageInterface()
{
- // must be empty until ### Qt 6
}
/*!
@@ -2496,7 +2482,6 @@ QAccessibleImageInterface::~QAccessibleImageInterface()
*/
QAccessibleTableCellInterface::~QAccessibleTableCellInterface()
{
- // must be empty until ### Qt 6
}
/*!
@@ -2564,7 +2549,6 @@ QAccessibleTableCellInterface::~QAccessibleTableCellInterface()
*/
QAccessibleTableInterface::~QAccessibleTableInterface()
{
- // must be empty until ### Qt 6
}
/*!
@@ -2740,7 +2724,6 @@ QAccessibleTableInterface::~QAccessibleTableInterface()
*/
QAccessibleActionInterface::~QAccessibleActionInterface()
{
- // must be empty until ### Qt 6
}
/*!
diff --git a/src/gui/configure.cmake b/src/gui/configure.cmake
new file mode 100644
index 0000000000..4354fea8bb
--- /dev/null
+++ b/src/gui/configure.cmake
@@ -0,0 +1,1307 @@
+
+
+#### Inputs
+
+# input freetype
+set(INPUT_freetype "undefined" CACHE STRING "")
+set_property(CACHE INPUT_freetype PROPERTY STRINGS undefined no qt system)
+
+# input harfbuzz
+set(INPUT_harfbuzz "undefined" CACHE STRING "")
+set_property(CACHE INPUT_harfbuzz PROPERTY STRINGS undefined no qt system)
+
+# input libjpeg
+set(INPUT_libjpeg "undefined" CACHE STRING "")
+set_property(CACHE INPUT_libjpeg PROPERTY STRINGS undefined no qt system)
+
+# input libmd4c
+set(INPUT_libmd4c "undefined" CACHE STRING "")
+set_property(CACHE INPUT_libmd4c PROPERTY STRINGS undefined no qt system)
+
+# input libpng
+set(INPUT_libpng "undefined" CACHE STRING "")
+set_property(CACHE INPUT_libpng PROPERTY STRINGS undefined no qt system)
+
+
+
+#### Libraries
+
+qt_find_package(ATSPI2 PROVIDED_TARGETS PkgConfig::ATSPI2)
+qt_find_package(DirectFB PROVIDED_TARGETS PkgConfig::DirectFB)
+qt_find_package(Libdrm PROVIDED_TARGETS Libdrm::Libdrm)
+qt_find_package(EGL PROVIDED_TARGETS EGL::EGL)
+qt_find_package(WrapSystemFreetype PROVIDED_TARGETS WrapSystemFreetype::WrapSystemFreetype)
+set_package_properties(WrapFreetype PROPERTIES TYPE REQUIRED)
+qt_find_package(Fontconfig PROVIDED_TARGETS Fontconfig::Fontconfig)
+qt_find_package(gbm PROVIDED_TARGETS gbm::gbm)
+qt_find_package(WrapSystemHarfbuzz PROVIDED_TARGETS WrapSystemHarfbuzz::WrapSystemHarfbuzz)
+qt_find_package(Libinput PROVIDED_TARGETS Libinput::Libinput)
+qt_find_package(JPEG PROVIDED_TARGETS JPEG::JPEG)
+qt_find_package(WrapSystemPNG PROVIDED_TARGETS WrapSystemPNG::WrapSystemPNG)
+qt_find_package(Mtdev PROVIDED_TARGETS PkgConfig::Mtdev)
+qt_find_package(OpenGL PROVIDED_TARGETS OpenGL::GL)
+qt_find_package(GLESv2 PROVIDED_TARGETS GLESv2::GLESv2)
+qt_find_package(Tslib PROVIDED_TARGETS PkgConfig::Tslib)
+qt_find_package(Vulkan PROVIDED_TARGETS Vulkan::Vulkan)
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(Wayland PROVIDED_TARGETS Wayland::Server)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(X11 PROVIDED_TARGETS X11::X11)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(X11 PROVIDED_TARGETS ${X11_SM_LIB} ${X11_ICE_LIB})
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB 1.9 PROVIDED_TARGETS XCB::XCB)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS ICCCM PROVIDED_TARGETS XCB::ICCCM)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS IMAGE PROVIDED_TARGETS XCB::IMAGE)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS KEYSYMS PROVIDED_TARGETS XCB::KEYSYMS)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS RENDERUTIL PROVIDED_TARGETS XCB::RENDERUTIL)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS RANDR PROVIDED_TARGETS XCB::RANDR)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS SHAPE PROVIDED_TARGETS XCB::SHAPE)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS SHM PROVIDED_TARGETS XCB::SHM)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS SYNC PROVIDED_TARGETS XCB::SYNC)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS XFIXES PROVIDED_TARGETS XCB::XFIXES)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS XINERAMA PROVIDED_TARGETS XCB::XINERAMA)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(X11_XCB PROVIDED_TARGETS X11::XCB)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS XKB PROVIDED_TARGETS XCB::XKB)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS RENDER PROVIDED_TARGETS XCB::RENDER)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS GLX PROVIDED_TARGETS XCB::GLX)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XCB COMPONENTS XINPUT PROVIDED_TARGETS XCB::XINPUT)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XKB 0.4.1 PROVIDED_TARGETS XKB::XKB)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XKB_COMMON_X11 0.4.1 PROVIDED_TARGETS PkgConfig::XKB_COMMON_X11)
+endif()
+if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
+ qt_find_package(XRender PROVIDED_TARGETS PkgConfig::XRender)
+endif()
+
+
+#### Tests
+
+# angle_d3d11_qdtd
+qt_config_compile_test(angle_d3d11_qdtd
+ LABEL "D3D11_QUERY_DATA_TIMESTAMP_DISJOINT"
+ CODE
+"
+#include <d3d11.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+D3D11_QUERY_DATA_TIMESTAMP_DISJOINT qdtd;
+(void) qdtd;
+ /* END TEST: */
+ return 0;
+}
+")
+
+# drm_atomic
+qt_config_compile_test(drm_atomic
+ LABEL "DRM Atomic API"
+ LIBRARIES
+ Libdrm::Libdrm
+ CODE
+"#include <stdlib.h>
+#include <stdint.h>
+extern \"C\" {
+#include <xf86drmMode.h>
+#include <xf86drm.h>
+}
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+drmModeAtomicReq *request;
+ /* END TEST: */
+ return 0;
+}
+")
+
+# egl-x11
+qt_config_compile_test(egl_x11
+ LABEL "EGL on X11"
+ LIBRARIES
+ EGL::EGL
+ X11::X11
+ CODE
+"// Check if EGL is compatible with X. Some EGL implementations, typically on
+// embedded devices, are not intended to be used together with X. EGL support
+// has to be disabled in plugins like xcb in this case since the native display,
+// window and pixmap types will be different than what an X-based platform
+// plugin would expect.
+#include <EGL/egl.h>
+#include <X11/Xlib.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+Display *dpy = EGL_DEFAULT_DISPLAY;
+EGLNativeDisplayType egldpy = XOpenDisplay(\"\");
+dpy = egldpy;
+EGLNativeWindowType w = XCreateWindow(dpy, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+XDestroyWindow(dpy, w);
+XCloseDisplay(dpy);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# egl-brcm
+qt_config_compile_test(egl_brcm
+ LABEL "Broadcom EGL (Raspberry Pi)"
+ LIBRARIES
+ EGL::EGL
+ CODE
+"
+#include <EGL/egl.h>
+#include <bcm_host.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+vc_dispmanx_display_open(0);
+ /* END TEST: */
+ return 0;
+}
+"# FIXME: use: unmapped library: bcm_host
+)
+
+# egl-egldevice
+qt_config_compile_test(egl_egldevice
+ LABEL "EGLDevice"
+ LIBRARIES
+ EGL::EGL
+ CODE
+"
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+EGLDeviceEXT device = 0;
+EGLStreamKHR stream = 0;
+EGLOutputLayerEXT layer = 0;
+(void) EGL_DRM_CRTC_EXT;
+ /* END TEST: */
+ return 0;
+}
+")
+
+# egl-mali
+qt_config_compile_test(egl_mali
+ LABEL "Mali EGL"
+ LIBRARIES
+ EGL::EGL
+ CODE
+"
+#include <EGL/fbdev_window.h>
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+fbdev_window *w = 0;
+ /* END TEST: */
+ return 0;
+}
+")
+
+# egl-mali-2
+qt_config_compile_test(egl_mali_2
+ LABEL "Mali 2 EGL"
+ LIBRARIES
+ EGL::EGL
+ CODE
+"
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+mali_native_window *w = 0;
+ /* END TEST: */
+ return 0;
+}
+")
+
+# egl-viv
+qt_config_compile_test(egl_viv
+ LABEL "i.Mx6 EGL"
+ LIBRARIES
+ EGL::EGL
+ CODE
+"
+#include <EGL/egl.h>
+#include <EGL/eglvivante.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+#ifdef __INTEGRITY
+fbGetDisplay();
+#else
+// Do not rely on fbGetDisplay(), since the signature has changed over time.
+// Stick to fbGetDisplayByIndex().
+fbGetDisplayByIndex(0);
+#endif
+ /* END TEST: */
+ return 0;
+}
+"# FIXME: qmake: ['DEFINES += EGL_API_FB=1', '!integrity: DEFINES += LINUX=1']
+)
+
+# egl-openwfd
+qt_config_compile_test(egl_openwfd
+ LABEL "OpenWFD EGL"
+ LIBRARIES
+ EGL::EGL
+ CODE
+"
+#include <wfd.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+wfdEnumerateDevices(nullptr, 0, nullptr);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# egl-rcar
+qt_config_compile_test(egl_rcar
+ LABEL "RCAR EGL"
+ LIBRARIES
+ EGL::EGL
+ GLESv2::GLESv2
+ CODE
+"
+#include <EGL/egl.h>
+extern \"C\" {
+extern unsigned long PVRGrfxServerInit(void);
+}
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+PVRGrfxServerInit();
+ /* END TEST: */
+ return 0;
+}
+")
+
+# evdev
+qt_config_compile_test(evdev
+ LABEL "evdev"
+ CODE
+"#if defined(__FreeBSD__)
+# include <dev/evdev/input.h>
+#else
+# include <linux/input.h>
+# include <linux/kd.h>
+#endif
+enum {
+ e1 = ABS_PRESSURE,
+ e2 = ABS_X,
+ e3 = REL_X,
+ e4 = SYN_REPORT,
+};
+
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+input_event buf[32];
+(void) buf;
+ /* END TEST: */
+ return 0;
+}
+")
+
+# integrityfb
+qt_config_compile_test(integrityfb
+ LABEL "INTEGRITY framebuffer"
+ CODE
+"
+#include <device/fbdriver.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+FBDriver *driver = 0;
+ /* END TEST: */
+ return 0;
+}
+")
+
+# linuxfb
+qt_config_compile_test(linuxfb
+ LABEL "LinuxFB"
+ CODE
+"
+#include <linux/fb.h>
+#include <sys/kd.h>
+#include <sys/ioctl.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+fb_fix_screeninfo finfo;
+fb_var_screeninfo vinfo;
+int fd = 3;
+ioctl(fd, FBIOGET_FSCREENINFO, &finfo);
+ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# opengles3
+qt_config_compile_test(opengles3
+ LABEL "OpenGL ES 3.0"
+ LIBRARIES
+ GLESv2::GLESv2
+ CODE
+"#ifdef __APPLE__
+# include <OpenGLES/ES3/gl.h>
+#else
+# define GL_GLEXT_PROTOTYPES
+# include <GLES3/gl3.h>
+#endif
+
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+static GLfloat f[6];
+glGetStringi(GL_EXTENSIONS, 0);
+glReadBuffer(GL_COLOR_ATTACHMENT1);
+glUniformMatrix2x3fv(0, 0, GL_FALSE, f);
+glMapBufferRange(GL_ARRAY_BUFFER, 0, 0, GL_MAP_READ_BIT);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# opengles31
+qt_config_compile_test(opengles31
+ LABEL "OpenGL ES 3.1"
+ LIBRARIES
+ GLESv2::GLESv2
+ CODE
+"
+#include <GLES3/gl31.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+glDispatchCompute(1, 1, 1);
+glProgramUniform1i(0, 0, 0);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# opengles32
+qt_config_compile_test(opengles32
+ LABEL "OpenGL ES 3.2"
+ LIBRARIES
+ GLESv2::GLESv2
+ CODE
+"
+#include <GLES3/gl32.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+glFramebufferTexture(GL_TEXTURE_2D, GL_DEPTH_STENCIL_ATTACHMENT, 1, 0);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# xcb_syslibs
+qt_config_compile_test(xcb_syslibs
+ LABEL "XCB (extensions)"
+ LIBRARIES
+ XCB::ICCCM
+ XCB::IMAGE
+ XCB::KEYSYMS
+ XCB::RANDR
+ XCB::RENDER
+ XCB::RENDERUTIL
+ XCB::SHAPE
+ XCB::SHM
+ XCB::SYNC
+ XCB::XFIXES
+ XCB::XINERAMA
+ XCB::XKB
+ XCB::XCB
+ CODE
+"// xkb.h is using a variable called 'explicit', which is a reserved keyword in C++
+#define explicit dont_use_cxx_explicit
+#include <xcb/xcb.h>
+#include <xcb/xcb_image.h>
+#include <xcb/xcb_keysyms.h>
+#include <xcb/randr.h>
+#include <xcb/render.h>
+#include <xcb/shape.h>
+#include <xcb/shm.h>
+#include <xcb/sync.h>
+#include <xcb/xfixes.h>
+#include <xcb/xinerama.h>
+#include <xcb/xcb_icccm.h>
+#include <xcb/xcb_renderutil.h>
+#include <xcb/xkb.h>
+#undef explicit
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+int primaryScreen = 0;
+xcb_connection_t *c = xcb_connect(\"\", &primaryScreen);
+/* RENDER */
+xcb_generic_error_t *error = nullptr;
+xcb_render_query_pict_formats_cookie_t formatsCookie =
+ xcb_render_query_pict_formats(c);
+xcb_render_query_pict_formats_reply_t *formatsReply =
+ xcb_render_query_pict_formats_reply(c, formatsCookie, &error);
+/* RENDERUTIL: xcb_renderutil.h include won't compile unless version >= 0.3.9 */
+xcb_render_util_find_standard_format(nullptr, XCB_PICT_STANDARD_ARGB_32);
+/* XKB: This takes more arguments in xcb-xkb < 1.11 */
+xcb_xkb_get_kbd_by_name_replies_key_names_value_list_sizeof(nullptr, 0, 0, 0, 0, 0, 0, 0, 0);
+ /* END TEST: */
+ return 0;
+}
+")
+
+
+
+#### Features
+
+qt_feature("accessibility-atspi-bridge" PUBLIC PRIVATE
+ LABEL "ATSPI Bridge"
+ CONDITION QT_FEATURE_accessibility AND QT_FEATURE_xcb AND QT_FEATURE_dbus AND ATSPI2_FOUND
+)
+qt_feature_definition("accessibility-atspi-bridge" "QT_NO_ACCESSIBILITY_ATSPI_BRIDGE" NEGATE VALUE "1")
+qt_feature("angle" PUBLIC
+ LABEL "ANGLE"
+ AUTODETECT QT_FEATURE_opengles2 OR QT_FEATURE_opengl_dynamic
+ CONDITION NOT QT_FEATURE_opengl_desktop AND QT_FEATURE_dxguid AND tests.fxc AND ( QT_FEATURE_direct3d9 OR ( WINRT AND QT_FEATURE_direct3d11 AND libs.d3dcompiler ) ) OR FIXME
+)
+qt_feature("angle_d3d11_qdtd" PRIVATE
+ LABEL "D3D11_QUERY_DATA_TIMESTAMP_DISJOINT"
+ CONDITION QT_FEATURE_angle AND TEST_angle_d3d11_qdtd
+)
+qt_feature("combined-angle-lib" PUBLIC
+ LABEL "Combined ANGLE Library"
+ AUTODETECT OFF
+ CONDITION QT_FEATURE_angle
+)
+qt_feature("directfb" PRIVATE
+ SECTION "Platform plugins"
+ LABEL "DirectFB"
+ AUTODETECT OFF
+ CONDITION DirectFB_FOUND
+)
+qt_feature("directwrite" PRIVATE
+ LABEL "DirectWrite"
+ CONDITION libs.dwrite OR FIXME
+ EMIT_IF WIN32
+)
+qt_feature("directwrite1" PRIVATE
+ LABEL "DirectWrite 1"
+ CONDITION libs.dwrite_1 OR FIXME
+ EMIT_IF WIN32
+)
+qt_feature("directwrite3" PRIVATE
+ LABEL "DirectWrite 3"
+ CONDITION QT_FEATURE_directwrite1 AND libs.dwrite_3 OR FIXME
+ EMIT_IF WIN32
+)
+qt_feature("directwrite2" PRIVATE
+ LABEL "DirectWrite 2"
+ CONDITION QT_FEATURE_directwrite1 AND libs.dwrite_2 OR FIXME
+ EMIT_IF WIN32
+)
+qt_feature("dxguid" PRIVATE
+ LABEL "DirectX GUID"
+ CONDITION WIN32 AND libs.dxguid OR FIXME
+)
+qt_feature("direct3d9" PRIVATE
+ LABEL "Direct 3D 9"
+ CONDITION WIN32 AND NOT WINRT AND libs.d3d9 OR FIXME
+)
+qt_feature("dxgi" PRIVATE
+ LABEL "DirectX GI"
+ CONDITION WIN32 AND libs.dxgi OR FIXME
+)
+qt_feature("dxgi1_2" PRIVATE
+ LABEL "DirectX GI 1.2"
+ CONDITION QT_FEATURE_dxgi AND libs.dxgi1_2 OR FIXME
+)
+qt_feature("direct3d11" PRIVATE
+ LABEL "Direct 3D 11"
+ CONDITION QT_FEATURE_dxgi AND libs.d3d11 OR FIXME
+)
+qt_feature("direct3d11_1" PRIVATE
+ LABEL "Direct 3D 11.1"
+ CONDITION QT_FEATURE_direct3d11 AND QT_FEATURE_dxgi1_2 AND libs.d3d11_1 OR FIXME
+)
+qt_feature("direct2d" PRIVATE
+ LABEL "Direct 2D"
+ CONDITION WIN32 AND NOT WINRT AND QT_FEATURE_direct3d11 AND libs.d2d1 OR FIXME
+)
+qt_feature("direct2d1_1" PRIVATE
+ LABEL "Direct 2D 1.1"
+ CONDITION QT_FEATURE_direct2d AND libs.d2d1_1 OR FIXME
+)
+qt_feature("evdev" PRIVATE
+ LABEL "evdev"
+ CONDITION QT_FEATURE_thread AND TEST_evdev
+)
+qt_feature("freetype" PUBLIC PRIVATE
+ SECTION "Fonts"
+ LABEL "FreeType"
+ PURPOSE "Supports the FreeType 2 font engine (and its supported font formats)."
+)
+qt_feature_definition("freetype" "QT_NO_FREETYPE" NEGATE VALUE "1")
+qt_feature("system-freetype" PRIVATE
+ LABEL " Using system FreeType"
+ AUTODETECT NOT MSVC
+ CONDITION QT_FEATURE_freetype AND WrapSystemFreetype_FOUND
+ ENABLE INPUT_freetype STREQUAL 'system'
+ DISABLE INPUT_freetype STREQUAL 'qt'
+)
+qt_feature("fontconfig" PUBLIC PRIVATE
+ LABEL "Fontconfig"
+ AUTODETECT NOT APPLE
+ CONDITION NOT MSVC AND QT_FEATURE_system_freetype AND FONTCONFIG_FOUND
+)
+qt_feature_definition("fontconfig" "QT_NO_FONTCONFIG" NEGATE VALUE "1")
+qt_feature("gbm"
+ LABEL "GBM"
+ CONDITION gbm_FOUND
+)
+qt_feature_config("gbm" QMAKE_PUBLIC_QT_CONFIG)
+qt_feature("harfbuzz" PUBLIC PRIVATE
+ LABEL "HarfBuzz"
+)
+qt_feature_definition("harfbuzz" "QT_NO_HARFBUZZ" NEGATE VALUE "1")
+qt_feature("system-harfbuzz" PRIVATE
+ LABEL " Using system HarfBuzz"
+ AUTODETECT NOT APPLE AND NOT WIN32
+ CONDITION QT_FEATURE_harfbuzz AND WrapSystemHarfbuzz_FOUND
+ ENABLE INPUT_harfbuzz STREQUAL 'system'
+ DISABLE INPUT_harfbuzz STREQUAL 'qt'
+)
+qt_feature("qqnx_imf" PRIVATE
+ LABEL "IMF"
+ CONDITION libs.imf OR FIXME
+ EMIT_IF QNX
+)
+qt_feature("integrityfb" PRIVATE
+ SECTION "Platform plugins"
+ LABEL "INTEGRITY framebuffer"
+ CONDITION INTEGRITY AND TEST_integrityfb
+)
+qt_feature("kms" PRIVATE
+ LABEL "KMS"
+ CONDITION Libdrm_FOUND
+)
+qt_feature_config("kms" QMAKE_PUBLIC_QT_CONFIG)
+qt_feature("drm_atomic" PRIVATE
+ LABEL "DRM Atomic API"
+ CONDITION Libdrm_FOUND AND TEST_drm_atomic
+)
+qt_feature("libinput" PRIVATE
+ LABEL "libinput"
+ CONDITION QT_FEATURE_libudev AND Libinput_FOUND
+)
+qt_feature("integrityhid" PRIVATE
+ LABEL "INTEGRITY HID"
+ CONDITION INTEGRITY AND libs.integrityhid OR FIXME
+)
+qt_feature("libinput-axis-api" PRIVATE
+ LABEL "axis API in libinput"
+ CONDITION QT_FEATURE_libinput AND ON
+)
+qt_feature("lgmon"
+ LABEL "lgmon"
+ CONDITION libs.lgmon OR FIXME
+ EMIT_IF QNX
+)
+qt_feature_config("lgmon" QMAKE_PRIVATE_CONFIG)
+qt_feature("linuxfb" PRIVATE
+ SECTION "Platform plugins"
+ LABEL "LinuxFB"
+ CONDITION TEST_linuxfb AND QT_FEATURE_regularexpression
+)
+qt_feature("vsp2" PRIVATE
+ LABEL "VSP2"
+ AUTODETECT OFF
+ CONDITION libs.v4l2 OR FIXME
+)
+qt_feature("vnc" PRIVATE
+ SECTION "Platform plugins"
+ LABEL "VNC"
+ CONDITION ( UNIX AND NOT ANDROID AND NOT APPLE AND NOT WASM ) AND ( QT_FEATURE_regularexpression AND QT_FEATURE_network )
+)
+qt_feature("mtdev" PRIVATE
+ LABEL "mtdev"
+ CONDITION Mtdev_FOUND
+)
+qt_feature("opengles2" PUBLIC
+ LABEL "OpenGL ES 2.0"
+ CONDITION NOT WIN32 AND ( NOT WATCHOS AND NOT QT_FEATURE_opengl_desktop AND GLESv2_FOUND )
+ ENABLE INPUT_opengl STREQUAL 'es2' OR INPUT_angle STREQUAL 'yes'
+ DISABLE INPUT_opengl STREQUAL 'desktop' OR INPUT_opengl STREQUAL 'dynamic' OR INPUT_opengl STREQUAL 'no'
+)
+qt_feature_config("opengles2" QMAKE_PUBLIC_QT_CONFIG)
+qt_feature("opengles3" PUBLIC
+ LABEL "OpenGL ES 3.0"
+ CONDITION QT_FEATURE_opengles2 AND NOT QT_FEATURE_angle AND TEST_opengles3
+)
+qt_feature("opengles31" PUBLIC
+ LABEL "OpenGL ES 3.1"
+ CONDITION QT_FEATURE_opengles3 AND TEST_opengles31
+)
+qt_feature("opengles32" PUBLIC
+ LABEL "OpenGL ES 3.2"
+ CONDITION QT_FEATURE_opengles31 AND TEST_opengles32
+)
+qt_feature("opengl-desktop"
+ LABEL "Desktop OpenGL"
+ CONDITION ( WIN32 AND NOT WINRT AND NOT QT_FEATURE_opengles2 AND ( MSVC OR OpenGL_OpenGL_FOUND ) ) OR ( NOT WATCHOS AND NOT WIN32 AND NOT WASM AND OpenGL_OpenGL_FOUND )
+ ENABLE INPUT_opengl STREQUAL 'desktop'
+ DISABLE INPUT_opengl STREQUAL 'es2' OR INPUT_opengl STREQUAL 'dynamic' OR INPUT_opengl STREQUAL 'no'
+)
+qt_feature("opengl-dynamic"
+ LABEL "Dynamic OpenGL"
+ AUTODETECT OFF
+ CONDITION WIN32 AND NOT WINRT
+ DISABLE INPUT_angle STREQUAL 'yes' OR INPUT_opengl STREQUAL 'no' OR INPUT_opengl STREQUAL 'desktop'
+)
+qt_feature("dynamicgl" PUBLIC
+ LABEL "Dynamic OpenGL: dynamicgl"
+ CONDITION QT_FEATURE_opengl_dynamic
+ DISABLE INPUT_angle STREQUAL 'yes' OR INPUT_opengl STREQUAL 'no' OR INPUT_opengl STREQUAL 'desktop'
+)
+qt_feature_definition("opengl-dynamic" "QT_OPENGL_DYNAMIC")
+qt_feature("opengl" PUBLIC
+ LABEL "OpenGL"
+ CONDITION QT_FEATURE_opengl_desktop OR QT_FEATURE_opengl_dynamic OR QT_FEATURE_opengles2
+)
+qt_feature_definition("opengl" "QT_NO_OPENGL" NEGATE VALUE "1")
+qt_feature("vkgen" PRIVATE
+ LABEL "vkgen"
+ CONDITION QT_FEATURE_xmlstreamreader
+)
+qt_feature("vulkan" PUBLIC
+ LABEL "Vulkan"
+ CONDITION QT_FEATURE_vkgen AND Vulkan_FOUND
+)
+qt_feature("openvg" PUBLIC
+ LABEL "OpenVG"
+ CONDITION libs.openvg OR FIXME
+)
+qt_feature("egl" PUBLIC PRIVATE
+ LABEL "EGL"
+ CONDITION ( QT_FEATURE_opengl OR QT_FEATURE_openvg ) AND ( QT_FEATURE_angle OR EGL_FOUND ) AND ( QT_FEATURE_dlopen OR NOT UNIX OR INTEGRITY )
+)
+qt_feature_definition("egl" "QT_NO_EGL" NEGATE VALUE "1")
+qt_feature("egl_x11" PRIVATE
+ LABEL "EGL on X11"
+ CONDITION QT_FEATURE_thread AND QT_FEATURE_egl AND TEST_egl_x11
+)
+qt_feature("eglfs" PRIVATE
+ SECTION "Platform plugins"
+ LABEL "EGLFS"
+ CONDITION NOT ANDROID AND NOT APPLE AND NOT WIN32 AND NOT WASM AND QT_FEATURE_egl
+)
+qt_feature("eglfs_brcm" PRIVATE
+ LABEL "EGLFS Raspberry Pi"
+ CONDITION QT_FEATURE_eglfs AND TEST_egl_brcm
+)
+qt_feature("eglfs_egldevice" PRIVATE
+ LABEL "EGLFS EGLDevice"
+ CONDITION QT_FEATURE_eglfs AND TEST_egl_egldevice AND QT_FEATURE_kms
+)
+qt_feature("eglfs_gbm" PRIVATE
+ LABEL "EGLFS GBM"
+ CONDITION QT_FEATURE_eglfs AND gbm_FOUND AND QT_FEATURE_kms
+)
+qt_feature("eglfs_vsp2" PRIVATE
+ LABEL "EGLFS VSP2"
+ CONDITION QT_FEATURE_eglfs AND gbm_FOUND AND QT_FEATURE_kms AND QT_FEATURE_vsp2
+)
+qt_feature("eglfs_mali" PRIVATE
+ LABEL "EGLFS Mali"
+ CONDITION QT_FEATURE_eglfs AND ( TEST_egl_mali OR TEST_egl_mali_2 )
+)
+qt_feature("eglfs_viv" PRIVATE
+ LABEL "EGLFS i.Mx6"
+ CONDITION QT_FEATURE_eglfs AND TEST_egl_viv
+)
+qt_feature("eglfs_rcar" PRIVATE
+ LABEL "EGLFS RCAR"
+ CONDITION INTEGRITY AND QT_FEATURE_eglfs AND TEST_egl_rcar
+)
+qt_feature("eglfs_viv_wl" PRIVATE
+ LABEL "EGLFS i.Mx6 Wayland"
+ CONDITION QT_FEATURE_eglfs_viv AND Wayland_FOUND
+)
+qt_feature("eglfs_openwfd" PRIVATE
+ LABEL "EGLFS OpenWFD"
+ CONDITION INTEGRITY AND QT_FEATURE_eglfs AND TEST_egl_openwfd
+)
+qt_feature("eglfs_x11" PRIVATE
+ LABEL "EGLFS X11"
+ CONDITION QT_FEATURE_eglfs AND QT_FEATURE_xcb_xlib AND QT_FEATURE_egl_x11
+)
+qt_feature("gif" PRIVATE
+ LABEL "GIF"
+ CONDITION QT_FEATURE_imageformatplugin
+)
+qt_feature_definition("gif" "QT_NO_IMAGEFORMAT_GIF" NEGATE)
+qt_feature("ico" PUBLIC PRIVATE
+ LABEL "ICO"
+ CONDITION QT_FEATURE_imageformatplugin
+)
+qt_feature_definition("ico" "QT_NO_ICO" NEGATE VALUE "1")
+qt_feature("jpeg" PRIVATE
+ LABEL "JPEG"
+ CONDITION QT_FEATURE_imageformatplugin
+ DISABLE INPUT_libjpeg STREQUAL 'no'
+)
+qt_feature_definition("jpeg" "QT_NO_IMAGEFORMAT_JPEG" NEGATE)
+qt_feature("system-jpeg" PRIVATE
+ LABEL " Using system libjpeg"
+ CONDITION QT_FEATURE_jpeg AND JPEG_FOUND
+ ENABLE INPUT_libjpeg STREQUAL 'system'
+ DISABLE INPUT_libjpeg STREQUAL 'qt'
+)
+qt_feature("png" PRIVATE
+ LABEL "PNG"
+ DISABLE INPUT_libpng STREQUAL 'no'
+)
+qt_feature_definition("png" "QT_NO_IMAGEFORMAT_PNG" NEGATE)
+qt_feature("system-png" PRIVATE
+ LABEL " Using system libpng"
+ AUTODETECT QT_FEATURE_system_zlib
+ CONDITION QT_FEATURE_png AND WrapSystemPNG_FOUND
+ ENABLE INPUT_libpng STREQUAL 'system'
+ DISABLE INPUT_libpng STREQUAL 'qt'
+)
+qt_feature("sessionmanager" PUBLIC
+ SECTION "Kernel"
+ LABEL "Session Management"
+ PURPOSE "Provides an interface to the windowing system's session management."
+)
+qt_feature_definition("sessionmanager" "QT_NO_SESSIONMANAGER" NEGATE VALUE "1")
+qt_feature("tslib" PRIVATE
+ LABEL "tslib"
+ CONDITION Tslib_FOUND
+)
+qt_feature("tuiotouch" PRIVATE
+ LABEL "TuioTouch"
+ PURPOSE "Provides the TuioTouch input plugin."
+ CONDITION QT_FEATURE_network AND QT_FEATURE_udpsocket
+)
+qt_feature("xcb" PRIVATE
+ SECTION "Platform plugins"
+ LABEL "XCB"
+ AUTODETECT NOT APPLE
+ CONDITION QT_FEATURE_thread AND TARGET XCB::XCB AND TEST_xcb_syslibs AND QT_FEATURE_xkbcommon_x11
+)
+qt_feature("xcb-glx-plugin" PRIVATE
+ LABEL "GLX Plugin"
+ CONDITION QT_FEATURE_xcb_xlib AND QT_FEATURE_opengl AND NOT QT_FEATURE_opengles2
+ EMIT_IF QT_FEATURE_xcb
+)
+qt_feature("xcb-glx" PRIVATE
+ LABEL " XCB GLX"
+ CONDITION XCB_GLX_FOUND
+ EMIT_IF QT_FEATURE_xcb AND QT_FEATURE_xcb_glx_plugin
+)
+qt_feature("xcb-egl-plugin" PRIVATE
+ LABEL "EGL-X11 Plugin"
+ CONDITION QT_FEATURE_egl_x11 AND QT_FEATURE_opengl
+ EMIT_IF QT_FEATURE_xcb
+)
+qt_feature("xcb-native-painting" PRIVATE
+ LABEL "Native painting (experimental)"
+ AUTODETECT OFF
+ CONDITION QT_FEATURE_xcb_xlib AND QT_FEATURE_fontconfig AND XRender_FOUND
+ EMIT_IF QT_FEATURE_xcb
+)
+qt_feature("xrender" PRIVATE
+ LABEL "XRender for native painting"
+ CONDITION QT_FEATURE_xcb_native_painting
+ EMIT_IF QT_FEATURE_xcb AND QT_FEATURE_xcb_native_painting
+)
+qt_feature("xcb-xlib" PRIVATE
+ LABEL "XCB Xlib"
+ CONDITION QT_FEATURE_xlib AND X11_XCB_FOUND
+)
+qt_feature("xcb-sm" PRIVATE
+ LABEL "xcb-sm"
+ CONDITION QT_FEATURE_sessionmanager AND X11_SM_FOUND
+ EMIT_IF QT_FEATURE_xcb
+)
+qt_feature("system-xcb-xinput" PRIVATE
+ LABEL "Using system-provided xcb-xinput"
+ CONDITION XCB_XINPUT_FOUND
+ ENABLE INPUT_bundled_xcb_xinput STREQUAL 'no'
+ DISABLE INPUT_bundled_xcb_xinput STREQUAL 'yes'
+ EMIT_IF QT_FEATURE_xcb
+)
+qt_feature("xkbcommon" PRIVATE
+ LABEL "xkbcommon"
+ CONDITION XKB_FOUND
+)
+qt_feature("xkbcommon-x11" PRIVATE
+ LABEL "xkbcommon-x11"
+ CONDITION QT_FEATURE_xkbcommon AND XKB_COMMON_X11_FOUND
+)
+qt_feature("xlib" PRIVATE
+ LABEL "XLib"
+ AUTODETECT NOT APPLE OR QT_FEATURE_xcb
+ CONDITION X11_FOUND
+)
+qt_feature("texthtmlparser" PUBLIC
+ SECTION "Kernel"
+ LABEL "HtmlParser"
+ PURPOSE "Provides a parser for HTML."
+)
+qt_feature_definition("texthtmlparser" "QT_NO_TEXTHTMLPARSER" NEGATE VALUE "1")
+qt_feature("textmarkdownreader" PUBLIC
+ SECTION "Kernel"
+ LABEL "MarkdownReader"
+ PURPOSE "Provides a Markdown (CommonMark and GitHub) reader"
+ ENABLE INPUT_libmd4c STREQUAL 'system' OR INPUT_libmd4c STREQUAL 'qt' OR INPUT_libmd4c STREQUAL 'yes'
+ DISABLE INPUT_libmd4c STREQUAL 'no'
+)
+qt_feature("system-textmarkdownreader" PUBLIC
+ SECTION "Kernel"
+ LABEL " Using system libmd4c"
+ CONDITION libs.libmd4c OR FIXME
+ ENABLE INPUT_libmd4c STREQUAL 'system'
+ DISABLE INPUT_libmd4c STREQUAL 'qt'
+)
+qt_feature("textmarkdownwriter" PUBLIC
+ SECTION "Kernel"
+ LABEL "MarkdownWriter"
+ PURPOSE "Provides a Markdown (CommonMark) writer"
+)
+qt_feature("textodfwriter" PUBLIC
+ SECTION "Kernel"
+ LABEL "OdfWriter"
+ PURPOSE "Provides an ODF writer."
+ CONDITION QT_FEATURE_xmlstreamwriter
+)
+qt_feature_definition("textodfwriter" "QT_NO_TEXTODFWRITER" NEGATE VALUE "1")
+qt_feature("cssparser" PUBLIC
+ SECTION "Kernel"
+ LABEL "CssParser"
+ PURPOSE "Provides a parser for Cascading Style Sheets."
+)
+qt_feature_definition("cssparser" "QT_NO_CSSPARSER" NEGATE VALUE "1")
+qt_feature("draganddrop" PUBLIC
+ SECTION "Kernel"
+ LABEL "Drag and Drop"
+ PURPOSE "Supports the drag and drop mechansim."
+ CONDITION QT_FEATURE_imageformat_xpm
+)
+qt_feature_definition("draganddrop" "QT_NO_DRAGANDDROP" NEGATE VALUE "1")
+qt_feature("action" PUBLIC
+ SECTION "Kernel"
+ LABEL "Q(Gui)Action(Group)"
+ PURPOSE "Provides abstract user interface actions."
+)
+qt_feature_definition("action" "QT_NO_ACTION" NEGATE VALUE "1")
+qt_feature("cursor" PUBLIC
+ SECTION "Kernel"
+ LABEL "QCursor"
+ PURPOSE "Provides mouse cursors."
+)
+qt_feature_definition("cursor" "QT_NO_CURSOR" NEGATE VALUE "1")
+qt_feature("clipboard" PUBLIC
+ SECTION "Kernel"
+ LABEL "QClipboard"
+ PURPOSE "Provides cut and paste operations."
+ CONDITION NOT INTEGRITY AND NOT QNX AND NOT rtems
+)
+qt_feature_definition("clipboard" "QT_NO_CLIPBOARD" NEGATE VALUE "1")
+qt_feature("wheelevent" PUBLIC
+ SECTION "Kernel"
+ LABEL "QWheelEvent"
+ PURPOSE "Supports wheel events."
+)
+qt_feature_definition("wheelevent" "QT_NO_WHEELEVENT" NEGATE VALUE "1")
+qt_feature("tabletevent" PUBLIC
+ SECTION "Kernel"
+ LABEL "QTabletEvent"
+ PURPOSE "Supports tablet events."
+)
+qt_feature_definition("tabletevent" "QT_NO_TABLETEVENT" NEGATE VALUE "1")
+qt_feature("im" PUBLIC
+ SECTION "Kernel"
+ LABEL "QInputContext"
+ PURPOSE "Provides complex input methods."
+ CONDITION QT_FEATURE_library
+)
+qt_feature_definition("im" "QT_NO_IM" NEGATE VALUE "1")
+qt_feature("highdpiscaling" PUBLIC
+ SECTION "Kernel"
+ LABEL "High DPI Scaling"
+ PURPOSE "Provides automatic scaling of DPI-unaware applications on high-DPI displays."
+)
+qt_feature_definition("highdpiscaling" "QT_NO_HIGHDPISCALING" NEGATE VALUE "1")
+qt_feature("validator" PUBLIC
+ SECTION "Widgets"
+ LABEL "QValidator"
+ PURPOSE "Supports validation of input text."
+)
+qt_feature_definition("validator" "QT_NO_VALIDATOR" NEGATE VALUE "1")
+qt_feature("standarditemmodel" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QStandardItemModel"
+ PURPOSE "Provides a generic model for storing custom data."
+ CONDITION QT_FEATURE_itemmodel
+)
+qt_feature_definition("standarditemmodel" "QT_NO_STANDARDITEMMODEL" NEGATE VALUE "1")
+qt_feature("imageformatplugin" PUBLIC
+ SECTION "Images"
+ LABEL "QImageIOPlugin"
+ PURPOSE "Provides a base for writing a image format plugins."
+)
+qt_feature_definition("imageformatplugin" "QT_NO_IMAGEFORMATPLUGIN" NEGATE VALUE "1")
+qt_feature("movie" PUBLIC
+ SECTION "Images"
+ LABEL "QMovie"
+ PURPOSE "Supports animated images."
+)
+qt_feature_definition("movie" "QT_NO_MOVIE" NEGATE VALUE "1")
+qt_feature("imageformat_bmp" PUBLIC
+ SECTION "Images"
+ LABEL "BMP Image Format"
+ PURPOSE "Supports Microsoft's Bitmap image file format."
+)
+qt_feature_definition("imageformat_bmp" "QT_NO_IMAGEFORMAT_BMP" NEGATE VALUE "1")
+qt_feature("imageformat_ppm" PUBLIC
+ SECTION "Images"
+ LABEL "PPM Image Format"
+ PURPOSE "Supports the Portable Pixmap image file format."
+)
+qt_feature_definition("imageformat_ppm" "QT_NO_IMAGEFORMAT_PPM" NEGATE VALUE "1")
+qt_feature("imageformat_xbm" PUBLIC
+ SECTION "Images"
+ LABEL "XBM Image Format"
+ PURPOSE "Supports the X11 Bitmap image file format."
+)
+qt_feature_definition("imageformat_xbm" "QT_NO_IMAGEFORMAT_XBM" NEGATE VALUE "1")
+qt_feature("imageformat_xpm" PUBLIC
+ SECTION "Images"
+ LABEL "XPM Image Format"
+ PURPOSE "Supports the X11 Pixmap image file format."
+)
+qt_feature_definition("imageformat_xpm" "QT_NO_IMAGEFORMAT_XPM" NEGATE VALUE "1")
+qt_feature("imageformat_png" PUBLIC
+ SECTION "Images"
+ LABEL "PNG Image Format"
+ PURPOSE "Supports the Portable Network Graphics image file format."
+)
+qt_feature_definition("imageformat_png" "QT_NO_IMAGEFORMAT_PNG" NEGATE VALUE "1")
+qt_feature("imageformat_jpeg" PUBLIC
+ SECTION "Images"
+ LABEL "JPEG Image Format"
+ PURPOSE "Supports the Joint Photographic Experts Group image file format."
+)
+qt_feature_definition("imageformat_jpeg" "QT_NO_IMAGEFORMAT_JPEG" NEGATE VALUE "1")
+qt_feature("image_heuristic_mask" PUBLIC
+ SECTION "Images"
+ LABEL "QImage::createHeuristicMask()"
+ PURPOSE "Supports creating a 1-bpp heuristic mask for images."
+)
+qt_feature_definition("image_heuristic_mask" "QT_NO_IMAGE_HEURISTIC_MASK" NEGATE VALUE "1")
+qt_feature("image_text" PUBLIC
+ SECTION "Images"
+ LABEL "Image Text"
+ PURPOSE "Supports image file text strings."
+)
+qt_feature_definition("image_text" "QT_NO_IMAGE_TEXT" NEGATE VALUE "1")
+qt_feature("picture" PUBLIC
+ SECTION "Painting"
+ LABEL "QPicture"
+ PURPOSE "Supports recording and replaying QPainter commands."
+)
+qt_feature_definition("picture" "QT_NO_PICTURE" NEGATE VALUE "1")
+qt_feature("colornames" PUBLIC
+ SECTION "Painting"
+ LABEL "Color Names"
+ PURPOSE "Supports color names such as \"red\", used by QColor and by some HTML documents."
+)
+qt_feature_definition("colornames" "QT_NO_COLORNAMES" NEGATE VALUE "1")
+qt_feature("pdf" PUBLIC
+ SECTION "Painting"
+ LABEL "QPdf"
+ PURPOSE "Provides a PDF backend for QPainter."
+ CONDITION QT_FEATURE_temporaryfile
+)
+qt_feature_definition("pdf" "QT_NO_PDF" NEGATE VALUE "1")
+qt_feature("desktopservices" PUBLIC
+ SECTION "Utilities"
+ LABEL "QDesktopServices"
+ PURPOSE "Provides methods for accessing common desktop services."
+)
+qt_feature_definition("desktopservices" "QT_NO_DESKTOPSERVICES" NEGATE VALUE "1")
+qt_feature("systemtrayicon" PUBLIC
+ SECTION "Utilities"
+ LABEL "QSystemTrayIcon"
+ PURPOSE "Provides an icon for an application in the system tray."
+ CONDITION QT_FEATURE_temporaryfile
+)
+qt_feature_definition("systemtrayicon" "QT_NO_SYSTEMTRAYICON" NEGATE VALUE "1")
+qt_feature("accessibility" PUBLIC
+ SECTION "Utilities"
+ LABEL "Accessibility"
+ PURPOSE "Provides accessibility support."
+ CONDITION QT_FEATURE_properties
+)
+qt_feature_definition("accessibility" "QT_NO_ACCESSIBILITY" NEGATE VALUE "1")
+qt_feature("multiprocess" PRIVATE
+ SECTION "Utilities"
+ LABEL "Multi process"
+ PURPOSE "Provides support for detecting the desktop environment, launching external processes and opening URLs."
+ CONDITION NOT INTEGRITY AND NOT rtems
+)
+qt_feature("whatsthis" PUBLIC
+ SECTION "Widget Support"
+ LABEL "QWhatsThis"
+ PURPOSE "Supports displaying \"What's this\" help."
+)
+qt_feature_definition("whatsthis" "QT_NO_WHATSTHIS" NEGATE VALUE "1")
+qt_feature("raster-64bit" PRIVATE
+ SECTION "Painting"
+ LABEL "QPainter - 64 bit raster"
+ PURPOSE "Internal painting support for 64 bit (16 bpc) rasterization."
+)
+qt_feature("undocommand" PUBLIC
+ SECTION "Utilities"
+ LABEL "QUndoCommand"
+ PURPOSE "Applies (redo or) undo of a single change in a document."
+)
+qt_feature_definition("undocommand" "QT_NO_UNDOCOMMAND" NEGATE VALUE "1")
+qt_feature("undostack" PUBLIC
+ SECTION "Utilities"
+ LABEL "QUndoStack"
+ PURPOSE "Provides the ability to (redo or) undo a list of changes in a document."
+ CONDITION QT_FEATURE_undocommand
+)
+qt_feature_definition("undostack" "QT_NO_UNDOSTACK" NEGATE VALUE "1")
+qt_feature("undogroup" PUBLIC
+ SECTION "Utilities"
+ LABEL "QUndoGroup"
+ PURPOSE "Provides the ability to cluster QUndoCommands."
+ CONDITION QT_FEATURE_undostack
+)
+qt_feature_definition("undogroup" "QT_NO_UNDOGROUP" NEGATE VALUE "1")
+qt_configure_add_summary_section(NAME "Qt Gui")
+qt_configure_add_summary_entry(ARGS "accessibility")
+qt_configure_add_summary_entry(ARGS "freetype")
+qt_configure_add_summary_entry(ARGS "system-freetype")
+qt_configure_add_summary_entry(ARGS "harfbuzz")
+qt_configure_add_summary_entry(ARGS "system-harfbuzz")
+qt_configure_add_summary_entry(ARGS "fontconfig")
+qt_configure_add_summary_section(NAME "Image formats")
+qt_configure_add_summary_entry(ARGS "gif")
+qt_configure_add_summary_entry(ARGS "ico")
+qt_configure_add_summary_entry(ARGS "jpeg")
+qt_configure_add_summary_entry(ARGS "system-jpeg")
+qt_configure_add_summary_entry(ARGS "png")
+qt_configure_add_summary_entry(ARGS "system-png")
+qt_configure_end_summary_section() # end of "Image formats" section
+qt_configure_add_summary_section(NAME "Text formats")
+qt_configure_add_summary_entry(ARGS "texthtmlparser")
+qt_configure_add_summary_entry(ARGS "cssparser")
+qt_configure_add_summary_entry(ARGS "textodfwriter")
+qt_configure_add_summary_entry(ARGS "textmarkdownreader")
+qt_configure_add_summary_entry(ARGS "system-textmarkdownreader")
+qt_configure_add_summary_entry(ARGS "textmarkdownwriter")
+qt_configure_end_summary_section() # end of "Text formats" section
+qt_configure_add_summary_entry(ARGS "egl")
+qt_configure_add_summary_entry(ARGS "openvg")
+qt_configure_add_summary_section(NAME "OpenGL")
+qt_configure_add_summary_entry(
+ ARGS "angle"
+ CONDITION WIN32
+)
+qt_configure_add_summary_entry(
+ ARGS "combined-angle-lib"
+ CONDITION QT_FEATURE_angle
+)
+qt_configure_add_summary_entry(ARGS "opengl-desktop")
+qt_configure_add_summary_entry(
+ ARGS "opengl-dynamic"
+ CONDITION WIN32
+)
+qt_configure_add_summary_entry(ARGS "opengles2")
+qt_configure_add_summary_entry(ARGS "opengles3")
+qt_configure_add_summary_entry(ARGS "opengles31")
+qt_configure_add_summary_entry(ARGS "opengles32")
+qt_configure_end_summary_section() # end of "OpenGL" section
+qt_configure_add_summary_entry(ARGS "vulkan")
+qt_configure_add_summary_entry(ARGS "sessionmanager")
+qt_configure_end_summary_section() # end of "Qt Gui" section
+qt_configure_add_summary_section(NAME "Features used by QPA backends")
+qt_configure_add_summary_entry(ARGS "evdev")
+qt_configure_add_summary_entry(ARGS "libinput")
+qt_configure_add_summary_entry(ARGS "integrityhid")
+qt_configure_add_summary_entry(ARGS "mtdev")
+qt_configure_add_summary_entry(ARGS "tslib")
+qt_configure_add_summary_entry(ARGS "xkbcommon")
+qt_configure_add_summary_section(NAME "X11 specific")
+qt_configure_add_summary_entry(ARGS "xlib")
+qt_configure_add_summary_entry(ARGS "xcb-xlib")
+qt_configure_add_summary_entry(ARGS "egl_x11")
+qt_configure_add_summary_entry(ARGS "xkbcommon-x11")
+qt_configure_end_summary_section() # end of "X11 specific" section
+qt_configure_end_summary_section() # end of "Features used by QPA backends" section
+qt_configure_add_summary_section(NAME "QPA backends")
+qt_configure_add_summary_entry(ARGS "directfb")
+qt_configure_add_summary_entry(ARGS "eglfs")
+qt_configure_add_summary_section(NAME "EGLFS details")
+qt_configure_add_summary_entry(ARGS "eglfs_openwfd")
+qt_configure_add_summary_entry(ARGS "eglfs_viv")
+qt_configure_add_summary_entry(ARGS "eglfs_viv_wl")
+qt_configure_add_summary_entry(ARGS "eglfs_rcar")
+qt_configure_add_summary_entry(ARGS "eglfs_egldevice")
+qt_configure_add_summary_entry(ARGS "eglfs_gbm")
+qt_configure_add_summary_entry(ARGS "eglfs_vsp2")
+qt_configure_add_summary_entry(ARGS "eglfs_mali")
+qt_configure_add_summary_entry(ARGS "eglfs_brcm")
+qt_configure_add_summary_entry(ARGS "eglfs_x11")
+qt_configure_end_summary_section() # end of "EGLFS details" section
+qt_configure_add_summary_entry(ARGS "linuxfb")
+qt_configure_add_summary_entry(ARGS "vnc")
+qt_configure_add_summary_entry(
+ ARGS "integrityfb"
+ CONDITION INTEGRITY
+)
+qt_configure_add_summary_section(NAME "QNX")
+qt_configure_add_summary_entry(ARGS "lgmon")
+qt_configure_add_summary_entry(ARGS "qqnx_imf")
+qt_configure_end_summary_section() # end of "QNX" section
+qt_configure_add_summary_section(NAME "XCB")
+qt_configure_add_summary_entry(ARGS "system-xcb-xinput")
+qt_configure_add_summary_entry(ARGS "xcb-native-painting")
+qt_configure_add_summary_section(NAME "GL integrations")
+qt_configure_add_summary_entry(ARGS "xcb-glx-plugin")
+qt_configure_add_summary_entry(ARGS "xcb-glx")
+qt_configure_add_summary_entry(ARGS "xcb-egl-plugin")
+qt_configure_end_summary_section() # end of "GL integrations" section
+qt_configure_end_summary_section() # end of "XCB" section
+qt_configure_add_summary_section(NAME "Windows")
+qt_configure_add_summary_entry(ARGS "direct2d")
+qt_configure_add_summary_entry(ARGS "directwrite")
+qt_configure_add_summary_entry(ARGS "directwrite2")
+qt_configure_end_summary_section() # end of "Windows" section
+qt_configure_end_summary_section() # end of "QPA backends" section
+qt_configure_add_report_entry(
+ TYPE NOTE
+ MESSAGE "XCB support on macOS is minimal and untested. Some features will not work properly or at all (e.g. OpenGL, desktop services or accessibility), or may depend on your system and XQuartz setup."
+ CONDITION QT_FEATURE_xcb AND APPLE
+)
+qt_configure_add_report_entry(
+ TYPE NOTE
+ MESSAGE "Disabling X11 Accessibility Bridge: D-Bus or AT-SPI is missing."
+ CONDITION QT_FEATURE_accessibility AND QT_FEATURE_xcb AND NOT QT_FEATURE_accessibility_atspi_bridge
+)
+qt_configure_add_report_entry(
+ TYPE WARNING
+ MESSAGE "The [-no]-qpa-platform-guard argument is deprecated and has no effect."
+ CONDITION ( NOT INPUT_qpa_platform_guard STREQUAL '' )
+)
+qt_configure_add_report_entry(
+ TYPE WARNING
+ MESSAGE "No QPA platform plugin enabled! This will produce a Qt that cannot run GUI applications. See \"Platform backends\" in the output of --help."
+ CONDITION QT_FEATURE_gui AND LINUX AND NOT ANDROID AND NOT QT_FEATURE_xcb AND NOT QT_FEATURE_eglfs AND NOT QT_FEATURE_directfb AND NOT QT_FEATURE_linuxfb
+)
+qt_configure_add_report_entry(
+ TYPE WARNING
+ MESSAGE "Using OpenGL ES 2.0 on Windows without ANGLE. The build will most likely fail. Specify -opengl desktop to use regular OpenGL."
+ CONDITION WIN32 AND ( QT_FEATURE_opengles2 OR QT_FEATURE_opengl_dynamic ) AND NOT QT_FEATURE_angle
+)
+qt_configure_add_report_entry(
+ TYPE WARNING
+ MESSAGE "On OS X, AAT is supported only with -qt-harfbuzz."
+ CONDITION APPLE AND QT_FEATURE_system_harfbuzz
+)
+qt_configure_add_report_entry(
+ TYPE ERROR
+ MESSAGE "The OpenGL functionality tests failed! You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2], QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform."
+ CONDITION QT_FEATURE_gui AND NOT WATCHOS AND ( NOT INPUT_opengl STREQUAL 'no' ) AND NOT QT_FEATURE_opengl_desktop AND NOT QT_FEATURE_opengles2 AND NOT QT_FEATURE_opengl_dynamic
+)
+qt_configure_add_report_entry(
+ TYPE WARNING
+ MESSAGE "Accessibility disabled. This configuration of Qt is unsupported."
+ CONDITION NOT QT_FEATURE_accessibility
+)
+qt_configure_add_report_entry(
+ TYPE ERROR
+ MESSAGE "XCB plugin requires xkbcommon and xkbcommon-x11, but -no-xkbcommon was provided."
+ CONDITION ( NOT INPUT_xcb STREQUAL '' ) AND ( NOT INPUT_xcb STREQUAL 'no' ) AND INPUT_xkbcommon STREQUAL 'no'
+)
diff --git a/src/gui/configure.json b/src/gui/configure.json
index 5ebcdb99b5..3a3f579446 100644
--- a/src/gui/configure.json
+++ b/src/gui/configure.json
@@ -189,6 +189,20 @@
"-ldwrite"
]
},
+ "dwrite_3": {
+ "label": "DirectWrite 3",
+ "test": {
+ "main": [
+ "IUnknown *factory = 0;",
+ "DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory3),",
+ " &factory);"
+ ]
+ },
+ "headers": "dwrite_3.h",
+ "sources": [
+ "-ldwrite"
+ ]
+ },
"drm": {
"label": "KMS",
"test": {
@@ -288,7 +302,7 @@
"label": "HarfBuzz",
"test": {
"tail": [
- "#if !HB_VERSION_ATLEAST(1, 6, 0)",
+ "#if !HB_VERSION_ATLEAST(2, 6, 0)",
"# error This version of harfbuzz is too old.",
"#endif"
],
@@ -428,6 +442,7 @@
"# include <OpenGL/gl.h>",
"#else",
"# define GL_GLEXT_PROTOTYPES",
+ "# include <GL/gl.h>",
"#endif"
],
"main": [
@@ -438,12 +453,6 @@
"glEnd();"
]
},
- "headers": [
- {
- "condition": "!config.darwin",
- "headers": "GL/gl.h"
- }
- ],
"sources": [
{ "type": "pkgConfig", "args": "gl", "condition": "!config.darwin" },
{ "type": "makeSpec", "spec": "OPENGL" }
@@ -457,6 +466,7 @@
"# include <OpenGLES/ES2/gl.h>",
"#else",
"# define GL_GLEXT_PROTOTYPES",
+ "# include <GLES2/gl2.h>",
"#endif"
],
"main": [
@@ -464,12 +474,6 @@
"glClear(GL_COLOR_BUFFER_BIT);"
]
},
- "headers": [
- {
- "condition": "!config.darwin",
- "headers": "GLES2/gl2.h"
- }
- ],
"sources": [
{ "type": "pkgConfig", "args": "glesv2", "condition": "!config.darwin" },
{ "type": "makeSpec", "spec": "OPENGL_ES2" }
@@ -1111,7 +1115,6 @@
"condition": "!features.opengl-desktop && features.dxguid && tests.fxc && (features.direct3d9 || (config.winrt && features.direct3d11 && libs.d3dcompiler))",
"output": [
"publicFeature",
- { "type": "define", "name": "QT_OPENGL_ES_2_ANGLE" },
{ "type": "varAssign", "name": "QMAKE_FXC_LOCATION", "value": "tests.fxc.value" }
]
},
@@ -1145,6 +1148,12 @@
"condition": "libs.dwrite_1",
"output": [ "privateFeature" ]
},
+ "directwrite3": {
+ "label": "DirectWrite 3",
+ "emitIf": "config.win32",
+ "condition": "features.directwrite1 && libs.dwrite_3",
+ "output": [ "privateFeature" ]
+ },
"directwrite2": {
"label": "DirectWrite 2",
"emitIf": "config.win32",
@@ -1309,33 +1318,28 @@
"condition": "(config.win32 && !features.opengl-dynamic) || (!config.watchos && !features.opengl-desktop && libs.opengl_es2)",
"output": [
"publicFeature",
- "publicQtConfig",
- { "type": "define", "name": "QT_OPENGL_ES" },
- { "type": "define", "name": "QT_OPENGL_ES_2" }
+ "publicQtConfig"
]
},
"opengles3": {
"label": "OpenGL ES 3.0",
"condition": "features.opengles2 && !features.angle && tests.opengles3",
"output": [
- "publicFeature",
- { "type": "define", "name": "QT_OPENGL_ES_3" }
+ "publicFeature"
]
},
"opengles31": {
"label": "OpenGL ES 3.1",
"condition": "features.opengles3 && tests.opengles31",
"output": [
- "publicFeature",
- { "type": "define", "name": "QT_OPENGL_ES_3_1" }
+ "publicFeature"
]
},
"opengles32": {
"label": "OpenGL ES 3.2",
"condition": "features.opengles31 && tests.opengles32",
"output": [
- "publicFeature",
- { "type": "define", "name": "QT_OPENGL_ES_3_2" }
+ "publicFeature"
]
},
"opengl-desktop": {
@@ -1343,8 +1347,7 @@
"autoDetect": "!config.win32",
"enable": "input.opengl == 'desktop'",
"disable": "input.opengl == 'es2' || input.opengl == 'dynamic' || input.opengl == 'no'",
- "condition": "(config.win32 && !config.winrt && !features.opengles2 && (config.msvc || libs.opengl))
- || (!config.watchos && !config.win32 && !config.wasm && libs.opengl)"
+ "condition": "(config.win32 && !config.winrt && !features.opengles2 && (config.msvc || libs.opengl)) || (!config.watchos && !config.win32 && !config.wasm && libs.opengl)"
},
"opengl-dynamic": {
"label": "Dynamic OpenGL",
@@ -1638,15 +1641,9 @@
"condition": "features.imageformat_xpm",
"output": [ "publicFeature", "feature" ]
},
- "shortcut": {
- "label": "QShortcut",
- "purpose": "Provides keyboard accelerators and shortcuts.",
- "section": "Kernel",
- "output": [ "publicFeature", "feature" ]
- },
"action": {
- "label": "QAction",
- "purpose": "Provides widget actions.",
+ "label": "Q(Gui)Action(Group)",
+ "purpose": "Provides abstract user interface actions.",
"section": "Kernel",
"output": [ "publicFeature", "feature" ]
},
@@ -1818,6 +1815,26 @@
"purpose": "Internal painting support for 64 bit (16 bpc) rasterization.",
"section": "Painting",
"output": [ "privateFeature" ]
+ },
+ "undocommand": {
+ "label": "QUndoCommand",
+ "purpose": "Applies (redo or) undo of a single change in a document.",
+ "section": "Utilities",
+ "output": [ "publicFeature", "feature" ]
+ },
+ "undostack": {
+ "label": "QUndoStack",
+ "purpose": "Provides the ability to (redo or) undo a list of changes in a document.",
+ "section": "Utilities",
+ "condition": "features.undocommand",
+ "output": [ "publicFeature", "feature" ]
+ },
+ "undogroup": {
+ "label": "QUndoGroup",
+ "purpose": "Provides the ability to cluster QUndoCommands.",
+ "section": "Utilities",
+ "condition": "features.undostack",
+ "output": [ "publicFeature", "feature" ]
}
},
@@ -1833,9 +1850,7 @@
{
"type": "note",
"condition": "features.xcb && config.darwin",
- "message": "XCB support on macOS is minimal and untested. Some features will
-not work properly or at all (e.g. OpenGL, desktop services or accessibility),
-or may depend on your system and XQuartz setup."
+ "message": "XCB support on macOS is minimal and untested. Some features will not work properly or at all (e.g. OpenGL, desktop services or accessibility), or may depend on your system and XQuartz setup."
},
{
"type": "note",
@@ -1850,16 +1865,12 @@ or may depend on your system and XQuartz setup."
{
"type": "warning",
"condition": "features.gui && config.linux && !config.android && !features.xcb && !features.eglfs && !features.directfb && !features.linuxfb",
- "message": "No QPA platform plugin enabled! This will
-produce a Qt that cannot run GUI applications.
-See \"Platform backends\" in the output of --help."
+ "message": "No QPA platform plugin enabled! This will produce a Qt that cannot run GUI applications. See \"Platform backends\" in the output of --help."
},
{
"type": "warning",
"condition": "config.win32 && (features.opengles2 || features.opengl-dynamic) && !features.angle",
- "message": "Using OpenGL ES 2.0 on Windows without ANGLE.
-The build will most likely fail.
-Specify -opengl desktop to use regular OpenGL."
+ "message": "Using OpenGL ES 2.0 on Windows without ANGLE. The build will most likely fail. Specify -opengl desktop to use regular OpenGL."
},
{
"type": "warning",
@@ -1869,9 +1880,7 @@ Specify -opengl desktop to use regular OpenGL."
{
"type": "error",
"condition": "features.gui && !config.watchos && input.opengl != 'no' && !features.opengl-desktop && !features.opengles2 && !features.opengl-dynamic",
- "message": "The OpenGL functionality tests failed!
-You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2],
-QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform."
+ "message": "The OpenGL functionality tests failed! You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2], QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform."
},
{
"type": "warning",
diff --git a/src/gui/doc/snippets/code/src_gui_util_qvalidator.cpp b/src/gui/doc/snippets/code/src_gui_util_qvalidator.cpp
index cc73ad9a19..1297ad8afe 100644
--- a/src/gui/doc/snippets/code/src_gui_util_qvalidator.cpp
+++ b/src/gui/doc/snippets/code/src_gui_util_qvalidator.cpp
@@ -99,51 +99,6 @@ s = "50";
v.validate(s, pos); // returns Acceptable
//! [2]
-
-//! [3]
-// regexp: optional '-' followed by between 1 and 3 digits
-QRegExp rx("-?\\d{1,3}");
-QValidator *validator = new QRegExpValidator(rx, this);
-
-QLineEdit *edit = new QLineEdit(this);
-edit->setValidator(validator);
-//! [3]
-
-
-//! [4]
-// integers 1 to 9999
-QRegExp rx("[1-9]\\d{0,3}");
-// the validator treats the regexp as "^[1-9]\\d{0,3}$"
-QRegExpValidator v(rx, 0);
-QString s;
-int pos = 0;
-
-s = "0"; v.validate(s, pos); // returns Invalid
-s = "12345"; v.validate(s, pos); // returns Invalid
-s = "1"; v.validate(s, pos); // returns Acceptable
-
-rx.setPattern("\\S+"); // one or more non-whitespace characters
-v.setRegExp(rx);
-s = "myfile.txt"; v.validate(s, pos); // Returns Acceptable
-s = "my file.txt"; v.validate(s, pos); // Returns Invalid
-
-// A, B or C followed by exactly five digits followed by W, X, Y or Z
-rx.setPattern("[A-C]\\d{5}[W-Z]");
-v.setRegExp(rx);
-s = "a12345Z"; v.validate(s, pos); // Returns Invalid
-s = "A12345Z"; v.validate(s, pos); // Returns Acceptable
-s = "B12"; v.validate(s, pos); // Returns Intermediate
-
-// match most 'readme' files
-rx.setPattern("read\\S?me(\.(txt|asc|1st))?");
-rx.setCaseSensitive(false);
-v.setRegExp(rx);
-s = "readme"; v.validate(s, pos); // Returns Acceptable
-s = "README.1ST"; v.validate(s, pos); // Returns Acceptable
-s = "read me.txt"; v.validate(s, pos); // Returns Invalid
-s = "readm"; v.validate(s, pos); // Returns Intermediate
-//! [4]
-
//! [5]
// regexp: optional '-' followed by between 1 and 3 digits
QRegularExpression rx("-?\\d{1,3}");
diff --git a/src/gui/doc/snippets/picture/picture.cpp b/src/gui/doc/snippets/picture/picture.cpp
index 863476fdbf..807c263b19 100644
--- a/src/gui/doc/snippets/picture/picture.cpp
+++ b/src/gui/doc/snippets/picture/picture.cpp
@@ -80,82 +80,3 @@ int main()
painter.end(); // painting done
//! [1]
}
-
- QPicture myPicture;
- {
- // FORMATS
-//! [2]
- const QStringList list = QPicture::inputFormatList();
- for (const QString &string : list)
- myProcessing(string);
-//! [2]
- }
-
- {
- // OUTPUT
-//! [3]
- const QStringList list = QPicture::outputFormatList();
- for (const QString &string : list)
- myProcessing(string);
-//! [3]
- }
-
- {
- // PIC READ
-//! [4]
- QPictureIO iio;
- QPixmap pixmap;
- iio.setFileName("vegeburger.pic");
- if (iio.read()) { // OK
- QPicture picture = iio.picture();
- QPainter painter(&pixmap);
- painter.drawPicture(0, 0, picture);
- }
-//! [4]
- }
-
- {
- QPixmap pixmap;
- // PIC WRITE
-//! [5]
- QPictureIO iio;
- QPicture picture;
- QPainter painter(&picture);
- painter.drawPixmap(0, 0, pixmap);
- iio.setPicture(picture);
- iio.setFileName("vegeburger.pic");
- iio.setFormat("PIC");
- if (iio.write())
- return true; // returned true if written successfully
-//! [5]
- }
-
-}
-
-// SVG READ
-//! [6]
-void readSVG(QPictureIO *picture)
-{
- // read the picture using the picture->ioDevice()
-}
-//! [6]
-
-// SVG WRITE
-//! [7]
-void writeSVG(QPictureIO *picture)
-{
- // write the picture using the picture->ioDevice()
-}
-//! [7]
-
-// USE SVG
-void foo() {
-
-//! [8]
- // add the SVG picture handler
- // ...
-//! [8]
- QPictureIO::defineIOHandler("SVG", 0, 0, readSVG, writeSVG);
- // ...
-
-}
diff --git a/src/gui/doc/src/dontdocument.qdoc b/src/gui/doc/src/dontdocument.qdoc
index b360acefc1..6711644359 100644
--- a/src/gui/doc/src/dontdocument.qdoc
+++ b/src/gui/doc/src/dontdocument.qdoc
@@ -27,37 +27,7 @@
/*!
\dontdocument (QTypeInfo QScreenOrientationChangeEvent QApplicationStateChangeEvent
- QImageTextKeyLang QMetaTypeId QAbstractUndoItem
- QOpenGLVersionStatus
- QOpenGLVersionFunctionsBackend
- QOpenGLVersionFunctionsStorage
- QOpenGLFunctions_1_0_CoreBackend
- QOpenGLFunctions_1_1_CoreBackend
- QOpenGLFunctions_1_2_CoreBackend
- QOpenGLFunctions_1_3_CoreBackend
- QOpenGLFunctions_1_4_CoreBackend
- QOpenGLFunctions_1_5_CoreBackend
- QOpenGLFunctions_2_0_CoreBackend
- QOpenGLFunctions_2_1_CoreBackend
- QOpenGLFunctions_3_0_CoreBackend
- QOpenGLFunctions_3_1_CoreBackend
- QOpenGLFunctions_3_2_CoreBackend
- QOpenGLFunctions_3_3_CoreBackend
- QOpenGLFunctions_4_0_CoreBackend
- QOpenGLFunctions_4_1_CoreBackend
- QOpenGLFunctions_4_2_CoreBackend
- QOpenGLFunctions_4_3_CoreBackend
- QOpenGLFunctions_4_4_CoreBackend
- QOpenGLFunctions_4_5_CoreBackend
- QOpenGLFunctions_1_0_DeprecatedBackend
- QOpenGLFunctions_1_1_DeprecatedBackend
- QOpenGLFunctions_1_2_DeprecatedBackend
- QOpenGLFunctions_1_3_DeprecatedBackend
- QOpenGLFunctions_1_4_DeprecatedBackend
- QOpenGLFunctions_2_0_DeprecatedBackend
- QOpenGLFunctions_3_0_DeprecatedBackend
- QOpenGLFunctions_3_3_DeprecatedBackend
- QOpenGLFunctions_4_5_DeprecatedBackend
+ QMetaTypeId QAbstractUndoItem
QTextFrameLayoutData QPlatformDropQtResponse QPlatformDragQtResponse
QPlatformOffscreenSurface QColorDialogOptions QFontDialogOptions
QFileDialogOptions QMessageDialogOptions QMessageDialogOptions::CustomButton
diff --git a/src/gui/image/image.pri b/src/gui/image/image.pri
index 01e48c17dd..0c033609c4 100644
--- a/src/gui/image/image.pri
+++ b/src/gui/image/image.pri
@@ -14,7 +14,6 @@ HEADERS += \
image/qpaintengine_pic_p.h \
image/qpicture.h \
image/qpicture_p.h \
- image/qpictureformatplugin.h \
image/qpixmap.h \
image/qpixmap_raster_p.h \
image/qpixmap_blitter_p.h \
@@ -38,7 +37,6 @@ SOURCES += \
image/qimagewriter.cpp \
image/qpaintengine_pic.cpp \
image/qpicture.cpp \
- image/qpictureformatplugin.cpp \
image/qpixmap.cpp \
image/qpixmapcache.cpp \
image/qplatformpixmap.cpp \
@@ -59,9 +57,6 @@ win32:!winrt: SOURCES += image/qpixmap_win.cpp
darwin: OBJECTIVE_SOURCES += image/qimage_darwin.mm
-NO_PCH_SOURCES += image/qimage_compat.cpp
-false: SOURCES += $$NO_PCH_SOURCES # Hack for QtCreator
-
# Built-in image format support
HEADERS += \
image/qbmphandler_p.h \
diff --git a/src/gui/image/qbitmap.cpp b/src/gui/image/qbitmap.cpp
index a44f7151b1..88af4073c8 100644
--- a/src/gui/image/qbitmap.cpp
+++ b/src/gui/image/qbitmap.cpp
@@ -310,18 +310,4 @@ QBitmap QBitmap::transformed(const QTransform &matrix) const
return bm;
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \overload
- \obsolete
-
- This convenience function converts the \a matrix to a QTransform
- and calls the overloaded function.
-*/
-QBitmap QBitmap::transformed(const QMatrix &matrix) const
-{
- return transformed(QTransform(matrix));
-}
-#endif
-
QT_END_NAMESPACE
diff --git a/src/gui/image/qbitmap.h b/src/gui/image/qbitmap.h
index 3cc360f670..2bdfa73bdf 100644
--- a/src/gui/image/qbitmap.h
+++ b/src/gui/image/qbitmap.h
@@ -76,10 +76,6 @@ public:
static QBitmap fromData(const QSize &size, const uchar *bits,
QImage::Format monoFormat = QImage::Format_MonoLSB);
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use QBitmap::transformed(QTransform) instead")
- QBitmap transformed(const QMatrix &) const;
-#endif
QBitmap transformed(const QTransform &matrix) const;
typedef QExplicitlySharedDataPointer<QPlatformPixmap> DataPtr;
diff --git a/src/gui/image/qbmphandler.cpp b/src/gui/image/qbmphandler.cpp
index 387c7b7746..d559913161 100644
--- a/src/gui/image/qbmphandler.cpp
+++ b/src/gui/image/qbmphandler.cpp
@@ -777,9 +777,9 @@ bool QBmpHandler::write(const QImage &img)
}
int nbits;
- int bpl_bmp;
+ qsizetype bpl_bmp;
// Calculate a minimum bytes-per-line instead of using whatever value this QImage is using internally.
- int bpl = ((image.width() * image.depth() + 31) >> 5) << 2;
+ qsizetype bpl = ((image.width() * image.depth() + 31) >> 5) << 2;
if (image.depth() == 8 && image.colorCount() <= 16) {
bpl_bmp = (((bpl+1)/2+3)/4)*4;
@@ -791,6 +791,8 @@ bool QBmpHandler::write(const QImage &img)
bpl_bmp = bpl;
nbits = image.depth();
}
+ if (qsizetype(int(bpl_bmp)) != bpl_bmp)
+ return false;
if (m_format == DibFormat) {
QDataStream dibStream(device());
@@ -813,6 +815,8 @@ bool QBmpHandler::write(const QImage &img)
bf.bfReserved2 = 0;
bf.bfOffBits = BMP_FILEHDR_SIZE + BMP_WIN + image.colorCount() * 4;
bf.bfSize = bf.bfOffBits + bpl_bmp*image.height();
+ if (qsizetype(bf.bfSize) != bf.bfOffBits + bpl_bmp*image.height())
+ return false;
s << bf;
// write image
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp
index 2646d298e9..189f12fd5c 100644
--- a/src/gui/image/qimage.cpp
+++ b/src/gui/image/qimage.cpp
@@ -43,7 +43,6 @@
#include "qdatastream.h"
#include "qcolortransform.h"
#include "qmap.h"
-#include "qmatrix.h"
#include "qtransform.h"
#include "qimagereader.h"
#include "qimagewriter.h"
@@ -786,7 +785,7 @@ QImage::QImage(const QSize &size, Format format)
-QImageData *QImageData::create(uchar *data, int width, int height, int bpl, QImage::Format format, bool readOnly, QImageCleanupFunction cleanupFunction, void *cleanupInfo)
+QImageData *QImageData::create(uchar *data, int width, int height, qsizetype bpl, QImage::Format format, bool readOnly, QImageCleanupFunction cleanupFunction, void *cleanupInfo)
{
if (width <= 0 || height <= 0 || !data || format == QImage::Format_Invalid)
return nullptr;
@@ -798,7 +797,7 @@ QImageData *QImageData::create(uchar *data, int width, int height, int bpl, QIm
if (bpl > 0) {
// can't overflow, because has calculateImageParameters already done this multiplication
- const int min_bytes_per_line = (width * depth + 7)/8;
+ const qsizetype min_bytes_per_line = (qsizetype(width) * depth + 7)/8;
if (bpl < min_bytes_per_line)
return nullptr;
@@ -899,13 +898,17 @@ QImage::QImage(const uchar* data, int width, int height, Format format, QImageCl
initially empty and must be sufficiently expanded with
setColorCount() or setColorTable() before the image is used.
*/
+
+#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
+QImage::QImage(uchar *data, int width, int height, qsizetype bytesPerLine, Format format, QImageCleanupFunction cleanupFunction, void *cleanupInfo)
+#else
QImage::QImage(uchar *data, int width, int height, int bytesPerLine, Format format, QImageCleanupFunction cleanupFunction, void *cleanupInfo)
+#endif
:QPaintDevice()
{
d = QImageData::create(data, width, height, bytesPerLine, format, false, cleanupFunction, cleanupInfo);
}
-
/*!
Constructs an image with the given \a width, \a height and \a
format, that uses an existing memory buffer, \a data. The \a width
@@ -931,7 +934,11 @@ QImage::QImage(uchar *data, int width, int height, int bytesPerLine, Format form
data being changed.
*/
+#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
+QImage::QImage(const uchar *data, int width, int height, qsizetype bytesPerLine, Format format, QImageCleanupFunction cleanupFunction, void *cleanupInfo)
+#else
QImage::QImage(const uchar *data, int width, int height, int bytesPerLine, Format format, QImageCleanupFunction cleanupFunction, void *cleanupInfo)
+#endif
:QPaintDevice()
{
d = QImageData::create(const_cast<uchar*>(data), width, height, bytesPerLine, format, true, cleanupFunction, cleanupInfo);
@@ -1170,7 +1177,7 @@ QImage QImage::copy(const QRect& r) const
// Qt for Embedded Linux can create images with non-default bpl
// make sure we don't crash.
if (image.d->nbytes != d->nbytes) {
- int bpl = qMin(bytesPerLine(), image.bytesPerLine());
+ qsizetype bpl = qMin(bytesPerLine(), image.bytesPerLine());
for (int i = 0; i < height(); i++)
memcpy(image.scanLine(i), scanLine(i), bpl);
} else
@@ -1229,7 +1236,7 @@ QImage QImage::copy(const QRect& r) const
if (byteAligned) {
const uchar *src = d->data + ((x * d->depth) >> 3) + y * d->bytes_per_line;
uchar *dest = image.d->data + ((dx * d->depth) >> 3) + dy * image.d->bytes_per_line;
- const int bytes_to_copy = (pixels_to_copy * d->depth) >> 3;
+ const qsizetype bytes_to_copy = (qsizetype(pixels_to_copy) * d->depth) >> 3;
for (int i = 0; i < lines_to_copy; ++i) {
memcpy(dest, src, bytes_to_copy);
src += d->bytes_per_line;
@@ -1386,11 +1393,7 @@ int QImage::colorCount() const
\sa colorTable(), setColor(), {QImage#Image Transformations}{Image
Transformations}
*/
-#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
void QImage::setColorTable(const QVector<QRgb> &colors)
-#else
-void QImage::setColorTable(const QVector<QRgb> colors)
-#endif
{
if (!d)
return;
@@ -1400,11 +1403,7 @@ void QImage::setColorTable(const QVector<QRgb> colors)
if (!d)
return;
-#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
d->colortable = colors;
-#else
- d->colortable = std::move(const_cast<QVector<QRgb>&>(colors));
-#endif
d->has_alpha_clut = false;
for (int i = 0; i < d->colortable.size(); ++i) {
if (qAlpha(d->colortable.at(i)) != 255) {
@@ -1477,25 +1476,6 @@ void QImage::setDevicePixelRatio(qreal scaleFactor)
d->devicePixelRatio = scaleFactor;
}
-#if QT_DEPRECATED_SINCE(5, 10)
-/*!
- \since 4.6
- \obsolete
- Returns the number of bytes occupied by the image data.
-
- Note this method should never be called on an image larger than 2 gigabytes.
- Instead use sizeInBytes().
-
- \sa sizeInBytes(), bytesPerLine(), bits(), {QImage#Image Information}{Image
- Information}
-*/
-int QImage::byteCount() const
-{
- Q_ASSERT(!d || d->nbytes < std::numeric_limits<int>::max());
- return d ? int(d->nbytes) : 0;
-}
-#endif
-
/*!
\since 5.10
Returns the image data size in bytes.
@@ -1515,17 +1495,10 @@ qsizetype QImage::sizeInBytes() const
\sa scanLine()
*/
-#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
qsizetype QImage::bytesPerLine() const
{
return d ? d->bytes_per_line : 0;
}
-#else
-int QImage::bytesPerLine() const
-{
- return d ? d->bytes_per_line : 0;
-}
-#endif
/*!
@@ -1929,11 +1902,11 @@ void QImage::invertPixels(InvertMode mode)
if (depth() < 32) {
// This assumes no alpha-channel as the only formats with non-premultipled alpha are 32bit.
- int bpl = (d->width * d->depth + 7) / 8;
+ qsizetype bpl = (qsizetype(d->width) * d->depth + 7) / 8;
int pad = d->bytes_per_line - bpl;
uchar *sl = d->data;
for (int y=0; y<d->height; ++y) {
- for (int x=0; x<bpl; ++x)
+ for (qsizetype x=0; x<bpl; ++x)
*sl++ ^= 0xff;
sl += pad;
}
@@ -2887,65 +2860,6 @@ QImage QImage::scaledToHeight(int h, Qt::TransformationMode mode) const
return transformed(wm, mode);
}
-
-#if QT_DEPRECATED_SINCE(5, 15)
-
-/*!
- \obsolete
-
- Use trueMatrix(const QTransform &matrix, int w, int h) instead.
-
- \fn QMatrix QImage::trueMatrix(const QMatrix &matrix, int width, int height)
-
- Returns the actual matrix used for transforming an image with the
- given \a width, \a height and \a matrix.
-
- When transforming an image using the transformed() function, the
- transformation matrix is internally adjusted to compensate for
- unwanted translation, i.e. transformed() returns the smallest
- image containing all transformed points of the original image.
- This function returns the modified matrix, which maps points
- correctly from the original image into the new image.
-
- \sa transformed(), {QImage#Image Transformations}{Image
- Transformations}
-*/
-QMatrix QImage::trueMatrix(const QMatrix &matrix, int w, int h)
-{
- return trueMatrix(QTransform(matrix), w, h).toAffine();
-}
-
-/*!
- \obsolete
-
- Use transformed(const QTransform &matrix, Qt::TransformationMode mode) instead.
-
- Returns a copy of the image that is transformed using the given
- transformation \a matrix and transformation \a mode.
-
- The returned image will normally have the same {Image Formats}{format} as
- the original image. However, a complex transformation may result in an
- image where not all pixels are covered by the transformed pixels of the
- original image. In such cases, those background pixels will be assigned a
- transparent color value, and the transformed image will be given a format
- with an alpha channel, even if the orginal image did not have that.
-
- The transformation \a matrix is internally adjusted to compensate
- for unwanted translation; i.e. the image produced is the smallest
- image that contains all the transformed points of the original
- image. Use the trueMatrix() function to retrieve the actual matrix
- used for transforming an image.
-
- \sa trueMatrix(), {QImage#Image Transformations}{Image
- Transformations}
-*/
-QImage QImage::transformed(const QMatrix &matrix, Qt::TransformationMode mode) const
-{
- return transformed(QTransform(matrix), mode);
-}
-
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
/*!
Builds and returns a 1-bpp mask from the alpha buffer in this
image. Returns a null image if the image's format is
@@ -4073,71 +3987,10 @@ void QImage::setText(const QString &key, const QString &value)
}
/*!
- \fn QString QImage::text(const char* key, const char* language) const
- \obsolete
-
- Returns the text recorded for the given \a key in the given \a
- language, or in a default language if \a language is \nullptr.
-
- Use text() instead.
-
- The language the text is recorded in is no longer relevant since
- the text is always set using QString and UTF-8 representation.
-*/
-
-/*!
- \fn QString QImage::text(const QImageTextKeyLang& keywordAndLanguage) const
- \overload
- \obsolete
-
- Returns the text recorded for the given \a keywordAndLanguage.
-
- Use text() instead.
-
- The language the text is recorded in is no longer relevant since
- the text is always set using QString and UTF-8 representation.
-*/
-
-/*!
- \fn void QImage::setText(const char* key, const char* language, const QString& text)
- \obsolete
-
- Sets the image text to the given \a text and associate it with the
- given \a key. The text is recorded in the specified \a language,
- or in a default language if \a language is \nullptr.
-
- Use setText() instead.
-
- The language the text is recorded in is no longer relevant since
- the text is always set using QString and UTF-8 representation.
-
- \omit
- Records string \a for the keyword \a key. The \a key should be
- a portable keyword recognizable by other software - some suggested
- values can be found in
- \l{http://www.libpng.org/pub/png/spec/1.2/png-1.2-pdg.html#C.Anc-text}
- {the PNG specification}. \a s can be any text. \a lang should
- specify the language code (see
- \l{http://www.rfc-editor.org/rfc/rfc1766.txt}{RFC 1766}) or \nullptr.
- \endomit
-*/
-
-/*
- Sets the image bits to the \a pixmap contents and returns a
- reference to the image.
-
- If the image shares data with other images, it will first
- dereference the shared data.
-
- Makes a call to QPixmap::convertToImage().
-*/
-
-/*!
\internal
Used by QPainter to retrieve a paint engine for the image.
*/
-
QPaintEngine *QImage::paintEngine() const
{
if (!d)
@@ -4269,8 +4122,8 @@ int QImage::metric(PaintDeviceMetric metric) const
trigy += m12;
// END OF MACRO
bool qt_xForm_helper(const QTransform &trueMat, int xoffset, int type, int depth,
- uchar *dptr, int dbpl, int p_inc, int dHeight,
- const uchar *sptr, int sbpl, int sWidth, int sHeight)
+ uchar *dptr, qsizetype dbpl, int p_inc, int dHeight,
+ const uchar *sptr, qsizetype sbpl, int sWidth, int sHeight)
{
int m11 = int(trueMat.m11()*4096.0);
int m12 = int(trueMat.m12()*4096.0);
@@ -4383,22 +4236,6 @@ bool qt_xForm_helper(const QTransform &trueMat, int xoffset, int type, int depth
#undef IWX_LSB
#undef IWX_PIX
-/*! \fn int QImage::serialNumber() const
- \obsolete
- Returns a number that identifies the contents of this
- QImage object. Distinct QImage objects can only have the same
- serial number if they refer to the same contents (but they don't
- have to).
-
- Use cacheKey() instead.
-
- \warning The serial number doesn't necessarily change when the
- image is altered. This means that it may be dangerous to use
- it as a cache key.
-
- \sa operator==()
-*/
-
/*!
Returns a number that identifies the contents of this QImage
object. Distinct QImage objects can only have the same key if they
@@ -4828,7 +4665,7 @@ QImage QImage::transformed(const QTransform &matrix, Qt::TransformationMode mode
int bpp = depth();
- int sbpl = bytesPerLine();
+ qsizetype sbpl = bytesPerLine();
const uchar *sptr = bits();
QImage::Format target_format = d->format;
@@ -4883,7 +4720,7 @@ QImage QImage::transformed(const QTransform &matrix, Qt::TransformationMode mode
// create target image (some of the code is from QImage::copy())
int type = format() == Format_Mono ? QT_XFORM_TYPE_MSBFIRST : QT_XFORM_TYPE_LSBFIRST;
- int dbpl = dImage.bytesPerLine();
+ qsizetype dbpl = dImage.bytesPerLine();
qt_xForm_helper(mat, 0, type, bpp, dImage.bits(), dbpl, 0, hd, sptr, sbpl, ws, hs);
}
copyMetadata(dImage.d, d);
@@ -5129,50 +4966,6 @@ QDebug operator<<(QDebug dbg, const QImage &i)
}
#endif
-/*!
- \fn void QImage::setNumColors(int n)
- \obsolete
-
- Resizes the color table to contain \a n entries.
-
- \sa setColorCount()
- */
-
-/*!
- \fn int QImage::numBytes() const
- \obsolete
-
- Returns the number of bytes occupied by the image data.
-
- \sa sizeInBytes()
- */
-
-/*!
- \fn QStringList QImage::textLanguages() const
- \obsolete
-
- Returns the language identifiers for which some texts are recorded.
- Note that if you want to iterate over the list, you should iterate over a copy.
-
- The language the text is recorded in is no longer relevant since the text is
- always set using QString and UTF-8 representation.
-
- \sa textKeys()
- */
-
-/*!
- \fn QList<QImageTextKeyLang> QImage::textList() const
- \obsolete
-
- Returns a list of QImageTextKeyLang objects that enumerate all the texts
- key/language pairs set for this image.
-
- The language the text is recorded in is no longer relevant since the text
- is always set using QString and UTF-8 representation.
-
- \sa textKeys()
- */
-
static Q_CONSTEXPR QPixelFormat pixelformats[] = {
//QImage::Format_Invalid:
QPixelFormat(),
diff --git a/src/gui/image/qimage.h b/src/gui/image/qimage.h
index 56824e5ee7..df8d2729ef 100644
--- a/src/gui/image/qimage.h
+++ b/src/gui/image/qimage.h
@@ -50,10 +50,6 @@
#include <QtCore/qrect.h>
#include <QtCore/qstring.h>
-#if QT_DEPRECATED_SINCE(5, 0)
-#include <QtCore/qstringlist.h>
-#endif
-
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
Q_FORWARD_DECLARE_MUTABLE_CG_TYPE(CGImage);
#endif
@@ -64,35 +60,12 @@ QT_BEGIN_NAMESPACE
class QColorSpace;
class QColorTransform;
class QIODevice;
-class QMatrix;
class QStringList;
class QTransform;
class QVariant;
-template <class T> class QList;
template <class T> class QVector;
struct QImageData;
-class QImageDataMisc; // internal
-#if QT_DEPRECATED_SINCE(5, 0)
-class QImageTextKeyLang {
-public:
- QT_DEPRECATED QImageTextKeyLang(const char* k, const char* l) : key(k), lang(l) { }
- QT_DEPRECATED QImageTextKeyLang() { }
-
- QByteArray key;
- QByteArray lang;
-
- bool operator< (const QImageTextKeyLang& other) const
- { return key < other.key || (key==other.key && lang < other.lang); }
- bool operator== (const QImageTextKeyLang& other) const
- { return key==other.key && lang==other.lang; }
- inline bool operator!= (const QImageTextKeyLang &other) const
- { return !operator==(other); }
-private:
- friend class QImage;
- QImageTextKeyLang(bool /*dummy*/) {}
-};
-#endif
typedef void (*QImageCleanupFunction)(void*);
@@ -143,8 +116,13 @@ public:
QImage(int width, int height, Format format);
QImage(uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
QImage(const uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
+#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
+ QImage(uchar *data, int width, int height, qsizetype bytesPerLine, Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
+ QImage(const uchar *data, int width, int height, qsizetype bytesPerLine, Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
+#else
QImage(uchar *data, int width, int height, int bytesPerLine, Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
QImage(const uchar *data, int width, int height, int bytesPerLine, Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
+#endif
#ifndef QT_NO_IMAGEFORMAT_XPM
explicit QImage(const char * const xpm[]);
@@ -179,7 +157,6 @@ public:
Format format() const;
-#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QIMAGE_COMPAT_CPP)
Q_REQUIRED_RESULT Q_ALWAYS_INLINE QImage convertToFormat(Format f, Qt::ImageConversionFlags flags = Qt::AutoColor) const &
{ return convertToFormat_helper(f, flags); }
Q_REQUIRED_RESULT Q_ALWAYS_INLINE QImage convertToFormat(Format f, Qt::ImageConversionFlags flags = Qt::AutoColor) &&
@@ -189,9 +166,6 @@ public:
else
return convertToFormat_helper(f, flags);
}
-#else
- Q_REQUIRED_RESULT QImage convertToFormat(Format f, Qt::ImageConversionFlags flags = Qt::AutoColor) const;
-#endif
Q_REQUIRED_RESULT QImage convertToFormat(Format f, const QVector<QRgb> &colorTable, Qt::ImageConversionFlags flags = Qt::AutoColor) const;
bool reinterpretAsFormat(Format f);
@@ -217,19 +191,12 @@ public:
const uchar *bits() const;
const uchar *constBits() const;
-#if QT_DEPRECATED_SINCE(5, 10)
- QT_DEPRECATED_X("Use sizeInBytes") int byteCount() const;
-#endif
qsizetype sizeInBytes() const;
uchar *scanLine(int);
const uchar *scanLine(int) const;
const uchar *constScanLine(int) const;
-#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
qsizetype bytesPerLine() const;
-#else
- int bytesPerLine() const;
-#endif
bool valid(int x, int y) const;
bool valid(const QPoint &pt) const;
@@ -250,11 +217,7 @@ public:
void setPixelColor(const QPoint &pt, const QColor &c);
QVector<QRgb> colorTable() const;
-#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
void setColorTable(const QVector<QRgb> &colors);
-#else
- void setColorTable(const QVector<QRgb> colors);
-#endif
qreal devicePixelRatio() const;
void setDevicePixelRatio(qreal scaleFactor);
@@ -283,15 +246,8 @@ public:
Qt::TransformationMode mode = Qt::FastTransformation) const;
QImage scaledToWidth(int w, Qt::TransformationMode mode = Qt::FastTransformation) const;
QImage scaledToHeight(int h, Qt::TransformationMode mode = Qt::FastTransformation) const;
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_X("Use transformed(const QTransform &matrix, Qt::TransformationMode mode)")
- QImage transformed(const QMatrix &matrix, Qt::TransformationMode mode = Qt::FastTransformation) const;
- QT_DEPRECATED_X("trueMatrix(const QTransform &, int w, int h)")
- static QMatrix trueMatrix(const QMatrix &, int w, int h);
-#endif // QT_DEPRECATED_SINCE(5, 15)
QImage transformed(const QTransform &matrix, Qt::TransformationMode mode = Qt::FastTransformation) const;
static QTransform trueMatrix(const QTransform &, int w, int h);
-#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QIMAGE_COMPAT_CPP)
QImage mirrored(bool horizontally = false, bool vertically = true) const &
{ return mirrored_helper(horizontally, vertically); }
QImage &&mirrored(bool horizontally = false, bool vertically = true) &&
@@ -300,10 +256,6 @@ public:
{ return rgbSwapped_helper(); }
QImage &&rgbSwapped() &&
{ rgbSwapped_inplace(); return std::move(*this); }
-#else
- QImage mirrored(bool horizontally = false, bool vertically = true) const;
- QImage rgbSwapped() const;
-#endif
void invertPixels(InvertMode = InvertRgb);
QColorSpace colorSpace() const;
@@ -326,9 +278,6 @@ public:
inline static QImage fromData(const QByteArray &data, const char *format = nullptr)
{ return fromData(reinterpret_cast<const uchar *>(data.constData()), data.size(), format); }
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED inline int serialNumber() const { return cacheKey() >> 32; }
-#endif
qint64 cacheKey() const;
QPaintEngine *paintEngine() const override;
@@ -354,20 +303,6 @@ public:
CGImageRef toCGImage() const Q_DECL_CF_RETURNS_RETAINED;
#endif
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED inline QString text(const char *key, const char *lang = nullptr) const;
- QT_DEPRECATED inline QList<QImageTextKeyLang> textList() const;
- QT_DEPRECATED inline QStringList textLanguages() const;
- QT_DEPRECATED inline QString text(const QImageTextKeyLang&) const;
- QT_DEPRECATED inline void setText(const char* key, const char* lang, const QString&);
-#endif
-
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED inline int numColors() const;
- QT_DEPRECATED inline void setNumColors(int);
- QT_DEPRECATED inline int numBytes() const;
-#endif
-
protected:
virtual int metric(PaintDeviceMetric metric) const override;
QImage mirrored_helper(bool horizontal, bool vertical) const;
@@ -402,99 +337,6 @@ inline void QImage::setPixel(const QPoint &pt, uint index_or_rgb) { setPixel(pt.
inline QColor QImage::pixelColor(const QPoint &pt) const { return pixelColor(pt.x(), pt.y()); }
inline void QImage::setPixelColor(const QPoint &pt, const QColor &c) { setPixelColor(pt.x(), pt.y(), c); }
-#if QT_DEPRECATED_SINCE(5, 0)
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-inline QString QImage::text(const char* key, const char* lang) const
-{
- if (!d)
- return QString();
- QString k = QString::fromLatin1(key);
- if (lang && *lang)
- k += QLatin1Char('/') + QString::fromLatin1(lang);
- return text(k);
-}
-
-inline QList<QImageTextKeyLang> QImage::textList() const
-{
- QList<QImageTextKeyLang> imageTextKeys;
- if (!d)
- return imageTextKeys;
- QStringList keys = textKeys();
- for (int i = 0; i < keys.size(); ++i) {
- int index = keys.at(i).indexOf(QLatin1Char('/'));
- if (index > 0) {
- QImageTextKeyLang tkl(true);
- tkl.key = keys.at(i).left(index).toLatin1();
- tkl.lang = keys.at(i).mid(index+1).toLatin1();
- imageTextKeys += tkl;
- }
- }
-
- return imageTextKeys;
-}
-
-inline QStringList QImage::textLanguages() const
-{
- if (!d)
- return QStringList();
- QStringList keys = textKeys();
- QStringList languages;
- for (int i = 0; i < keys.size(); ++i) {
- int index = keys.at(i).indexOf(QLatin1Char('/'));
- if (index > 0)
- languages += keys.at(i).mid(index+1);
- }
-
- return languages;
-}
-
-inline QString QImage::text(const QImageTextKeyLang&kl) const
-{
- if (!d)
- return QString();
- QString k = QString::fromLatin1(kl.key.constData());
- if (!kl.lang.isEmpty())
- k += QLatin1Char('/') + QString::fromLatin1(kl.lang.constData());
- return text(k);
-}
-
-inline void QImage::setText(const char* key, const char* lang, const QString &s)
-{
- if (!d)
- return;
- detach();
-
- // In case detach() ran out of memory
- if (!d)
- return;
-
- QString k = QString::fromLatin1(key);
- if (lang && *lang)
- k += QLatin1Char('/') + QString::fromLatin1(lang);
- setText(k, s);
-}
-
-QT_WARNING_POP
-
-inline int QImage::numColors() const
-{
- return colorCount();
-}
-
-inline void QImage::setNumColors(int n)
-{
- setColorCount(n);
-}
-
-inline int QImage::numBytes() const
-{
- return int(sizeInBytes());
-}
-#endif
-
// QImage stream functions
#if !defined(QT_NO_DATASTREAM)
diff --git a/src/gui/image/qimage_compat.cpp b/src/gui/image/qimage_compat.cpp
deleted file mode 100644
index ba31a9ac9b..0000000000
--- a/src/gui/image/qimage_compat.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifdef QIMAGE_H
-# error "This file cannot be used with precompiled headers"
-#endif
-#define QT_COMPILING_QIMAGE_COMPAT_CPP
-
-#include "qimage.h"
-
-QT_BEGIN_NAMESPACE
-
-// These implementations must be the same as the inline versions in qimage.h
-
-QImage QImage::convertToFormat(Format f, Qt::ImageConversionFlags flags) const
-{
- return convertToFormat_helper(f, flags);
-}
-
-QImage QImage::mirrored(bool horizontally, bool vertically) const
-{
- return mirrored_helper(horizontally, vertically);
-}
-
-QImage QImage::rgbSwapped() const
-{
- return rgbSwapped_helper();
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/image/qimage_p.h b/src/gui/image/qimage_p.h
index 0930955f5a..6f6f626858 100644
--- a/src/gui/image/qimage_p.h
+++ b/src/gui/image/qimage_p.h
@@ -67,7 +67,7 @@ struct Q_GUI_EXPORT QImageData { // internal image data
QImageData();
~QImageData();
static QImageData *create(const QSize &size, QImage::Format format);
- static QImageData *create(uchar *data, int w, int h, int bpl, QImage::Format format, bool readOnly, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
+ static QImageData *create(uchar *data, int w, int h, qsizetype bpl, QImage::Format format, bool readOnly, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
QAtomicInt ref;
@@ -140,7 +140,7 @@ QImageData::calculateImageParameters(qsizetype width, qsizetype height, qsizetyp
qsizetype dummy;
if (mul_overflow(height, qsizetype(sizeof(uchar *)), &dummy))
return invalid; // why is this here?
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
+#if 1 || QT_VERSION < QT_VERSION_CHECK(6,0,0) // ### can only fix this if QImage dimensions are not int anymore
// Disallow images where width * depth calculations might overflow
if (width > (INT_MAX - 31) / depth)
return invalid;
diff --git a/src/gui/image/qimageiohandler.cpp b/src/gui/image/qimageiohandler.cpp
index 0c9083a16e..9c9ebbccdc 100644
--- a/src/gui/image/qimageiohandler.cpp
+++ b/src/gui/image/qimageiohandler.cpp
@@ -224,7 +224,7 @@
An image format plugin can support three capabilities: reading (\l
CanRead), writing (\l CanWrite) and \e incremental reading (\l
- CanReadIncremental). Reimplement capabilities() in you subclass to
+ CanReadIncremental). Reimplement capabilities() in your subclass to
expose the capabilities of your image format.
create() should create an instance of your QImageIOHandler
@@ -417,17 +417,6 @@ QByteArray QImageIOHandler::format() const
*/
/*!
- \obsolete
-
- Use format() instead.
-*/
-
-QByteArray QImageIOHandler::name() const // ### Qt6: remove
-{
- return format();
-}
-
-/*!
Writes the image \a image to the assigned device. Returns \c true on
success; otherwise returns \c false.
diff --git a/src/gui/image/qimageiohandler.h b/src/gui/image/qimageiohandler.h
index a4acf9dfe0..b6b40029b6 100644
--- a/src/gui/image/qimageiohandler.h
+++ b/src/gui/image/qimageiohandler.h
@@ -69,9 +69,6 @@ public:
void setFormat(const QByteArray &format) const;
QByteArray format() const;
- QT_DEPRECATED_X("Use QImageIOHandler::format() instead")
- virtual QByteArray name() const;
-
virtual bool canRead() const = 0;
virtual bool read(QImage *image) = 0;
virtual bool write(const QImage &image);
diff --git a/src/gui/image/qpicture.cpp b/src/gui/image/qpicture.cpp
index 3a32cc7f15..e46d0ab16b 100644
--- a/src/gui/image/qpicture.cpp
+++ b/src/gui/image/qpicture.cpp
@@ -54,7 +54,6 @@
#include "qpainter.h"
#include "qpainterpath.h"
#include "qpixmap.h"
-#include "qregexp.h"
#include "qregion.h"
#include "qdebug.h"
#include <QtCore/private/qlocking_p.h>
@@ -264,14 +263,14 @@ void QPicture::setData(const char* data, uint size)
\sa save()
*/
-bool QPicture::load(const QString &fileName, const char *format)
+bool QPicture::load(const QString &fileName)
{
QFile f(fileName);
if (!f.open(QIODevice::ReadOnly)) {
operator=(QPicture());
return false;
}
- return load(&f, format);
+ return load(&f);
}
/*!
@@ -280,21 +279,8 @@ bool QPicture::load(const QString &fileName, const char *format)
\a dev is the device to use for loading.
*/
-bool QPicture::load(QIODevice *dev, const char *format)
+bool QPicture::load(QIODevice *dev)
{
- if(format) {
-#ifndef QT_NO_PICTUREIO
- QPictureIO io(dev, format);
- if (io.read()) {
- operator=(io.picture());
- return true;
- }
-#endif
- qWarning("QPicture::load: No such picture format: %s", format);
- operator=(QPicture());
- return false;
- }
-
detach();
QByteArray a = dev->readAll();
@@ -312,7 +298,7 @@ bool QPicture::load(QIODevice *dev, const char *format)
\sa load()
*/
-bool QPicture::save(const QString &fileName, const char *format)
+bool QPicture::save(const QString &fileName)
{
if (paintingActive()) {
qWarning("QPicture::save: still being painted on. "
@@ -320,27 +306,10 @@ bool QPicture::save(const QString &fileName, const char *format)
return false;
}
-
- if(format) {
-#ifndef QT_NO_PICTUREIO
- QPictureIO io(fileName, format);
- bool result = io.write();
- if (result) {
- operator=(io.picture());
- } else if (format)
-#else
- bool result = false;
-#endif
- {
- qWarning("QPicture::save: No such picture format: %s", format);
- }
- return result;
- }
-
QFile f(fileName);
if (!f.open(QIODevice::WriteOnly))
return false;
- return save(&f, format);
+ return save(&f);
}
/*!
@@ -349,7 +318,7 @@ bool QPicture::save(const QString &fileName, const char *format)
\a dev is the device to use for saving.
*/
-bool QPicture::save(QIODevice *dev, const char *format)
+bool QPicture::save(QIODevice *dev)
{
if (paintingActive()) {
qWarning("QPicture::save: still being painted on. "
@@ -357,22 +326,6 @@ bool QPicture::save(QIODevice *dev, const char *format)
return false;
}
- if(format) {
-#ifndef QT_NO_PICTUREIO
- QPictureIO io(dev, format);
- bool result = io.write();
- if (result) {
- operator=(io.picture());
- } else if (format)
-#else
- bool result = false;
-#endif
- {
- qWarning("QPicture::save: No such picture format: %s", format);
- }
- return result;
- }
-
dev->write(d_func()->pictb.buffer(), d_func()->pictb.buffer().size());
return true;
}
@@ -511,7 +464,7 @@ bool QPicture::exec(QPainter *painter, QDataStream &s, int nrecords)
QPen pen;
QBrush brush;
QRegion rgn;
- QMatrix wmatrix;
+ qreal wmatrix[6];
QTransform matrix;
QTransform worldMatrix = painter->transform();
@@ -866,8 +819,12 @@ bool QPicture::exec(QPainter *painter, QDataStream &s, int nrecords)
if (d->formatMajor >= 8) {
s >> matrix >> i_8;
} else {
- s >> wmatrix >> i_8;
- matrix = QTransform(wmatrix);
+ s >> wmatrix[0] >> wmatrix[1]
+ >> wmatrix[2] >> wmatrix[3]
+ >> wmatrix[4] >> wmatrix[5] >> i_8;
+ matrix = QTransform(wmatrix[0], wmatrix[1],
+ wmatrix[2], wmatrix[3],
+ wmatrix[4], wmatrix[5]);
}
// i_8 is always false due to updateXForm() in qpaintengine_pic.cpp
painter->setTransform(matrix * worldMatrix, i_8);
@@ -1189,780 +1146,6 @@ QDataStream &operator>>(QDataStream &s, QPicture &r)
}
#endif // QT_NO_DATASTREAM
-
-#ifndef QT_NO_PICTUREIO
-
-QT_BEGIN_INCLUDE_NAMESPACE
-#include "qregexp.h"
-#include "qpictureformatplugin.h"
-QT_END_INCLUDE_NAMESPACE
-
-#if QT_DEPRECATED_SINCE(5, 10)
-/*!
- \obsolete
-
- Returns a string that specifies the picture format of the file \a
- fileName, or \nullptr if the file cannot be read or if the format
- is not recognized.
-
- \sa load(), save()
-*/
-
-const char* QPicture::pictureFormat(const QString &fileName)
-{
- const QByteArray format = QPictureIO::pictureFormat(fileName);
- // This function returns a const char * from a QByteArray.
- // Double check that the QByteArray is not detached, otherwise
- // we would return a dangling pointer.
- Q_ASSERT(!format.isDetached());
- return format;
-}
-
-/*!
- \obsolete
-
- Returns a list of picture formats that are supported for picture
- input.
-
- \sa outputFormats(), inputFormatList(), QPictureIO
-*/
-QList<QByteArray> QPicture::inputFormats()
-{
- return QPictureIO::inputFormats();
-}
-
-static QStringList qToStringList(const QList<QByteArray> &arr)
-{
- QStringList list;
- const int count = arr.count();
- list.reserve(count);
- for (int i = 0; i < count; ++i)
- list.append(QString::fromLatin1(arr.at(i)));
- return list;
-}
-
-/*!
- \obsolete
-
- Returns a list of picture formats that are supported for picture
- input.
-
- Note that if you want to iterate over the list, you should iterate
- over a copy, e.g.
- \snippet picture/picture.cpp 2
-
- \sa outputFormatList(), inputFormats(), QPictureIO
-*/
-QStringList QPicture::inputFormatList()
-{
- return qToStringList(QPictureIO::inputFormats());
-}
-
-
-/*!
- \obsolete
-
- Returns a list of picture formats that are supported for picture
- output.
-
- Note that if you want to iterate over the list, you should iterate
- over a copy, e.g.
- \snippet picture/picture.cpp 3
-
- \sa inputFormatList(), outputFormats(), QPictureIO
-*/
-QStringList QPicture::outputFormatList()
-{
- return qToStringList(QPictureIO::outputFormats());
-}
-
-/*!
- \obsolete
-
- Returns a list of picture formats that are supported for picture
- output.
-
- \sa inputFormats(), outputFormatList(), QPictureIO
-*/
-QList<QByteArray> QPicture::outputFormats()
-{
- return QPictureIO::outputFormats();
-}
-#endif // QT_DEPRECATED_SINCE(5, 10)
-
-/*****************************************************************************
- QPictureIO member functions
- *****************************************************************************/
-
-/*!
- \obsolete
-
- \class QPictureIO
-
- \brief The QPictureIO class contains parameters for loading and
- saving pictures.
-
- \ingroup painting
- \ingroup io
- \inmodule QtGui
-
- QPictureIO contains a QIODevice object that is used for picture data
- I/O. The programmer can install new picture file formats in addition
- to those that Qt provides.
-
- You don't normally need to use this class; QPicture::load(),
- QPicture::save().
-
- \sa QPicture, QPixmap, QFile
-*/
-
-struct QPictureIOData
-{
- QPicture pi; // picture
- int iostat; // IO status
- QByteArray frmt; // picture format
- QIODevice *iodev; // IO device
- QString fname; // file name
- QString descr; // picture description
- const char *parameters;
- int quality;
- float gamma;
-};
-
-/*!
- Constructs a QPictureIO object with all parameters set to zero.
-*/
-
-QPictureIO::QPictureIO()
-{
- init();
-}
-
-/*!
- Constructs a QPictureIO object with the I/O device \a ioDevice and a
- \a format tag.
-*/
-
-QPictureIO::QPictureIO(QIODevice *ioDevice, const char *format)
-{
- init();
- d->iodev = ioDevice;
- d->frmt = format;
-}
-
-/*!
- Constructs a QPictureIO object with the file name \a fileName and a
- \a format tag.
-*/
-
-QPictureIO::QPictureIO(const QString &fileName, const char* format)
-{
- init();
- d->frmt = format;
- d->fname = fileName;
-}
-
-/*!
- Contains initialization common to all QPictureIO constructors.
-*/
-
-void QPictureIO::init()
-{
- d = new QPictureIOData();
- d->parameters = nullptr;
- d->quality = -1; // default quality of the current format
- d->gamma=0.0f;
- d->iostat = 0;
- d->iodev = nullptr;
-}
-
-/*!
- Destroys the object and all related data.
-*/
-
-QPictureIO::~QPictureIO()
-{
- if (d->parameters)
- delete [] d->parameters;
- delete d;
-}
-
-
-/*****************************************************************************
- QPictureIO picture handler functions
- *****************************************************************************/
-
-class QPictureHandler
-{
-public:
- QPictureHandler(const char *f, const char *h, const QByteArray& fl,
- picture_io_handler r, picture_io_handler w);
- QByteArray format; // picture format
- QRegExp header; // picture header pattern
- enum TMode { Untranslated=0, TranslateIn, TranslateInOut } text_mode;
- picture_io_handler read_picture; // picture read function
- picture_io_handler write_picture; // picture write function
- bool obsolete; // support not "published"
-};
-
-QPictureHandler::QPictureHandler(const char *f, const char *h, const QByteArray& fl,
- picture_io_handler r, picture_io_handler w)
- : format(f), header(QString::fromLatin1(h))
-{
- text_mode = Untranslated;
- if (fl.contains('t'))
- text_mode = TranslateIn;
- else if (fl.contains('T'))
- text_mode = TranslateInOut;
- obsolete = fl.contains('O');
- read_picture = r;
- write_picture = w;
-}
-
-typedef QList<QPictureHandler *> QPHList;
-Q_GLOBAL_STATIC(QPHList, pictureHandlers)
-
-void qt_init_picture_plugins()
-{
- typedef QMultiMap<int, QString> PluginKeyMap;
- typedef PluginKeyMap::const_iterator PluginKeyMapConstIterator;
-
- static QBasicMutex mutex;
- const auto locker = qt_scoped_lock(mutex);
- static QFactoryLoader loader(QPictureFormatInterface_iid,
- QStringLiteral("/pictureformats"));
-
- const PluginKeyMap keyMap = loader.keyMap();
- const PluginKeyMapConstIterator cend = keyMap.constEnd();
- for (PluginKeyMapConstIterator it = keyMap.constBegin(); it != cend; ++it) {
- if (QPictureFormatPlugin *format = qobject_cast<QPictureFormatPlugin*>(loader.instance(it.key())))
- format->installIOHandler(it.value());
- }
-}
-
-static void cleanup()
-{
- // make sure that picture handlers are delete before plugin manager
- if (QPHList *list = pictureHandlers()) {
- qDeleteAll(*list);
- list->clear();
- }
-}
-
-void qt_init_picture_handlers() // initialize picture handlers
-{
- static QBasicAtomicInt done = Q_BASIC_ATOMIC_INITIALIZER(0);
- if (done.testAndSetRelaxed(0, 1)) {
- qAddPostRoutine(cleanup);
- }
-}
-
-static QPictureHandler *get_picture_handler(const char *format)
-{ // get pointer to handler
- qt_init_picture_handlers();
- qt_init_picture_plugins();
- if (QPHList *list = pictureHandlers()) {
- for (int i = 0; i < list->size(); ++i) {
- if (list->at(i)->format == format)
- return list->at(i);
- }
- }
- return nullptr; // no such handler
-}
-
-
-/*!
- Defines a picture I/O handler for the picture format called \a
- format, which is recognized using the regular
- expression defined in \a header, read using \a readPicture and
- written using \a writePicture.
-
- \a flags is a string of single-character flags for this format.
- The only flag defined currently is T (upper case), so the only
- legal value for \a flags are "T" and the empty string. The "T"
- flag means that the picture file is a text file, and Qt should treat
- all newline conventions as equivalent. (XPM files and some PPM
- files are text files for example.)
-
- \a format is used to select a handler to write a QPicture; \a header
- is used to select a handler to read an picture file.
-
- If \a readPicture is \nullptr, the QPictureIO will not be able
- to read pictures in \a format. If \a writePicture is \nullptr,
- the QPictureIO will not be able to write pictures in \a format. If
- both are null, the QPictureIO object is valid but useless.
-
- Example:
- \snippet picture/picture.cpp 6
- \codeline
- \snippet picture/picture.cpp 7
- \codeline
- \snippet picture/picture.cpp 8
-
- Before the regular expression test, all the 0 bytes in the file header are
- converted to 1 bytes. This is done because when Qt was ASCII-based, QRegExp
- could not handle 0 bytes in strings.
-
- The regexp is only applied on the first 14 bytes of the file.
-
- (Note that if one handlerIO supports writing a format and another
- supports reading it, Qt supports both reading and writing. If two
- handlers support the same operation, Qt chooses one arbitrarily.)
-*/
-
-void QPictureIO::defineIOHandler(const char *format,
- const char *header,
- const char *flags,
- picture_io_handler readPicture,
- picture_io_handler writePicture)
-{
- qt_init_picture_handlers();
- if (QPHList *list = pictureHandlers()) {
- QPictureHandler *p;
- p = new QPictureHandler(format, header, QByteArray(flags), readPicture, writePicture);
- list->prepend(p);
- }
-}
-
-
-/*****************************************************************************
- QPictureIO normal member functions
- *****************************************************************************/
-
-/*!
- Returns the picture currently set.
-
- \sa setPicture()
-*/
-const QPicture &QPictureIO::picture() const { return d->pi; }
-
-/*!
- Returns the picture's IO status. A non-zero value indicates an
- error, whereas 0 means that the IO operation was successful.
-
- \sa setStatus()
-*/
-int QPictureIO::status() const { return d->iostat; }
-
-/*!
- Returns the picture format string or \nullptr if no format has been
- explicitly set.
-*/
-const char *QPictureIO::format() const { return d->frmt; }
-
-/*!
- Returns the IO device currently set.
-
- \sa setIODevice()
-*/
-QIODevice *QPictureIO::ioDevice() const { return d->iodev; }
-
-/*!
- Returns the file name currently set.
-
- \sa setFileName()
-*/
-QString QPictureIO::fileName() const { return d->fname; }
-
-
-/*!
- Returns the picture description string.
-
- \sa setDescription()
-*/
-QString QPictureIO::description() const { return d->descr; }
-
-/*!
- Sets the picture to \a picture.
-
- \sa picture()
-*/
-void QPictureIO::setPicture(const QPicture &picture)
-{
- d->pi = picture;
-}
-
-/*!
- Sets the picture IO status to \a status. A non-zero value indicates
- an error, whereas 0 means that the IO operation was successful.
-
- \sa status()
-*/
-void QPictureIO::setStatus(int status)
-{
- d->iostat = status;
-}
-
-/*!
- Sets the picture format to \a format for the picture to be read or
- written.
-
- It is necessary to specify a format before writing an picture, but
- it is not necessary to specify a format before reading an picture.
-
- If no format has been set, Qt guesses the picture format before
- reading it. If a format is set the picture will only be read if it
- has that format.
-
- \sa read(), write(), format()
-*/
-void QPictureIO::setFormat(const char *format)
-{
- d->frmt = format;
-}
-
-/*!
- Sets the IO device to be used for reading or writing an picture.
-
- Setting the IO device allows pictures to be read/written to any
- block-oriented QIODevice.
-
- If \a ioDevice is not null, this IO device will override file name
- settings.
-
- \sa setFileName()
-*/
-void QPictureIO::setIODevice(QIODevice *ioDevice)
-{
- d->iodev = ioDevice;
-}
-
-/*!
- Sets the name of the file to read or write an picture from to \a
- fileName.
-
- \sa setIODevice()
-*/
-void QPictureIO::setFileName(const QString &fileName)
-{
- d->fname = fileName;
-}
-
-/*!
- Returns the quality of the written picture, related to the
- compression ratio.
-
- \sa setQuality(), QPicture::save()
-*/
-int QPictureIO::quality() const
-{
- return d->quality;
-}
-
-/*!
- Sets the quality of the written picture to \a q, related to the
- compression ratio.
-
- \a q must be in the range -1..100. Specify 0 to obtain small
- compressed files, 100 for large uncompressed files. (-1 signifies
- the default compression.)
-
- \sa quality(), QPicture::save()
-*/
-
-void QPictureIO::setQuality(int q)
-{
- d->quality = q;
-}
-
-/*!
- Returns the picture's parameters string.
-
- \sa setParameters()
-*/
-
-const char *QPictureIO::parameters() const
-{
- return d->parameters;
-}
-
-/*!
- Sets the picture's parameter string to \a parameters. This is for
- picture handlers that require special parameters.
-
- Although the current picture formats supported by Qt ignore the
- parameters string, it may be used in future extensions or by
- contributions (for example, JPEG).
-
- \sa parameters()
-*/
-
-void QPictureIO::setParameters(const char *parameters)
-{
- if (d->parameters)
- delete [] d->parameters;
- d->parameters = qstrdup(parameters);
-}
-
-/*!
- Sets the gamma value at which the picture will be viewed to \a
- gamma. If the picture format stores a gamma value for which the
- picture is intended to be used, then this setting will be used to
- modify the picture. Setting to 0.0 will disable gamma correction
- (i.e. any specification in the file will be ignored).
-
- The default value is 0.0.
-
- \sa gamma()
-*/
-void QPictureIO::setGamma(float gamma)
-{
- d->gamma=gamma;
-}
-
-/*!
- Returns the gamma value at which the picture will be viewed.
-
- \sa setGamma()
-*/
-float QPictureIO::gamma() const
-{
- return d->gamma;
-}
-
-/*!
- Sets the picture description string for picture handlers that support
- picture descriptions to \a description.
-
- Currently, no picture format supported by Qt uses the description
- string.
-*/
-
-void QPictureIO::setDescription(const QString &description)
-{
- d->descr = description;
-}
-
-
-/*!
- Returns a string that specifies the picture format of the file \a
- fileName, or null if the file cannot be read or if the format is
- not recognized.
-*/
-
-QByteArray QPictureIO::pictureFormat(const QString &fileName)
-{
- QFile file(fileName);
- QByteArray format;
- if (!file.open(QIODevice::ReadOnly))
- return format;
- format = pictureFormat(&file);
- file.close();
- return format;
-}
-
-/*!
- \overload
-
- Returns a string that specifies the picture format of the picture read
- from IO device \a d, or 0 if the device cannot be read or if the
- format is not recognized.
-
- Make sure that \a d is at the right position in the device (for
- example, at the beginning of the file).
-
- \sa QIODevice::pos()
-*/
-
-QByteArray QPictureIO::pictureFormat(QIODevice *d)
-{
- // if you change this change the documentation for defineIOHandler()
- const int buflen = 14;
-
- char buf[buflen];
- char buf2[buflen];
- qt_init_picture_handlers();
- qt_init_picture_plugins();
- int pos = d->pos(); // save position
- int rdlen = d->read(buf, buflen); // read a few bytes
-
- QByteArray format;
- if (rdlen != buflen)
- return format;
-
- memcpy(buf2, buf, buflen);
-
- for (int n = 0; n < rdlen; n++)
- if (buf[n] == '\0')
- buf[n] = '\001';
- if (rdlen > 0) {
- buf[rdlen - 1] = '\0';
- QString bufStr = QString::fromLatin1(buf);
- if (QPHList *list = pictureHandlers()) {
- for (int i = 0; i < list->size(); ++i) {
- if (list->at(i)->header.indexIn(bufStr) != -1) { // try match with headers
- format = list->at(i)->format;
- break;
- }
- }
- }
- }
- d->seek(pos); // restore position
- return format;
-}
-
-/*!
- Returns a sorted list of picture formats that are supported for
- picture input.
-*/
-QList<QByteArray> QPictureIO::inputFormats()
-{
- QList<QByteArray> result;
-
- qt_init_picture_handlers();
- qt_init_picture_plugins();
-
- if (QPHList *list = pictureHandlers()) {
- for (int i = 0; i < list->size(); ++i) {
- QPictureHandler *p = list->at(i);
- if (p->read_picture && !p->obsolete && !result.contains(p->format))
- result.append(p->format);
- }
- }
- std::sort(result.begin(), result.end());
-
- return result;
-}
-
-/*!
- Returns a sorted list of picture formats that are supported for
- picture output.
-*/
-QList<QByteArray> QPictureIO::outputFormats()
-{
- qt_init_picture_handlers();
- qt_init_picture_plugins();
-
- QList<QByteArray> result;
- if (QPHList *list = pictureHandlers()) {
- for (int i = 0; i < list->size(); ++i) {
- QPictureHandler *p = list->at(i);
- if (p->write_picture && !p->obsolete && !result.contains(p->format))
- result.append(p->format);
- }
- }
- return result;
-}
-
-
-
-/*!
- Reads an picture into memory and returns \c true if the picture was
- successfully read; otherwise returns \c false.
-
- Before reading an picture you must set an IO device or a file name.
- If both an IO device and a file name have been set, the IO device
- will be used.
-
- Setting the picture file format string is optional.
-
- Note that this function does \e not set the \l{format()}{format} used to read the picture. If you need that
- information, use the pictureFormat() static functions.
-
- Example:
-
- \snippet picture/picture.cpp 4
-
- \sa setIODevice(), setFileName(), setFormat(), write(), QPixmap::load()
-*/
-bool QPictureIO::read()
-{
- QFile file;
- QByteArray picture_format;
- QPictureHandler *h;
-
- if (d->iodev) { // read from io device
- // ok, already open
- } else if (!d->fname.isEmpty()) { // read from file
- file.setFileName(d->fname);
- if (!file.open(QIODevice::ReadOnly))
- return false; // cannot open file
- d->iodev = &file;
- } else { // no file name or io device
- return false;
- }
- if (d->frmt.isEmpty()) {
- // Try to guess format
- picture_format = pictureFormat(d->iodev); // get picture format
- if (picture_format.isEmpty()) {
- if (file.isOpen()) { // unknown format
- file.close();
- d->iodev = nullptr;
- }
- return false;
- }
- } else {
- picture_format = d->frmt;
- }
-
- h = get_picture_handler(picture_format);
- if (file.isOpen()) {
-#if !defined(Q_OS_UNIX)
- if (h && h->text_mode) { // reopen in translated mode
- file.close();
- file.open(QIODevice::ReadOnly | QIODevice::Text);
- }
- else
-#endif
- file.seek(0); // position to start
- }
- d->iostat = 1; // assume error
-
- if (h && h->read_picture)
- (*h->read_picture)(this);
-
- if (file.isOpen()) { // picture was read using file
- file.close();
- d->iodev = nullptr;
- }
- return d->iostat == 0; // picture successfully read?
-}
-
-
-/*!
- Writes an picture to an IO device and returns \c true if the picture was
- successfully written; otherwise returns \c false.
-
- Before writing an picture you must set an IO device or a file name.
- If both an IO device and a file name have been set, the IO device
- will be used.
-
- The picture will be written using the specified picture format.
-
- Example:
- \snippet picture/picture.cpp 5
-
- \sa setIODevice(), setFileName(), setFormat(), read(), QPixmap::save()
-*/
-bool QPictureIO::write()
-{
- if (d->frmt.isEmpty())
- return false;
- QPictureHandler *h = get_picture_handler(d->frmt);
- if (!h || !h->write_picture) {
- qWarning("QPictureIO::write: No such picture format handler: %s",
- format());
- return false;
- }
- QFile file;
- if (!d->iodev && !d->fname.isEmpty()) {
- file.setFileName(d->fname);
- bool translate = h->text_mode==QPictureHandler::TranslateInOut;
- QIODevice::OpenMode fmode = translate ? QIODevice::WriteOnly | QIODevice::Text : QIODevice::OpenMode(QIODevice::WriteOnly);
- if (!file.open(fmode)) // couldn't create file
- return false;
- d->iodev = &file;
- }
- d->iostat = 1;
- (*h->write_picture)(this);
- if (file.isOpen()) { // picture was written using file
- file.close();
- d->iodev = nullptr;
- }
- return d->iostat == 0; // picture successfully written?
-}
-#endif //QT_NO_PICTUREIO
-
QT_END_NAMESPACE
#endif // QT_NO_PICTURE
diff --git a/src/gui/image/qpicture.h b/src/gui/image/qpicture.h
index 189e57b9a3..34860985ed 100644
--- a/src/gui/image/qpicture.h
+++ b/src/gui/image/qpicture.h
@@ -48,7 +48,6 @@
QT_BEGIN_NAMESPACE
-
#ifndef QT_NO_PICTURE
class QPicturePrivate;
@@ -69,10 +68,10 @@ public:
bool play(QPainter *p);
- bool load(QIODevice *dev, const char *format = nullptr);
- bool load(const QString &fileName, const char *format = nullptr);
- bool save(QIODevice *dev, const char *format = nullptr);
- bool save(const QString &fileName, const char *format = nullptr);
+ bool load(QIODevice *dev);
+ bool load(const QString &fileName);
+ bool save(QIODevice *dev);
+ bool save(const QString &fileName);
QRect boundingRect() const;
void setBoundingRect(const QRect &r);
@@ -88,14 +87,6 @@ public:
friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &in, const QPicture &p);
friend Q_GUI_EXPORT QDataStream &operator>>(QDataStream &in, QPicture &p);
-#if QT_DEPRECATED_SINCE(5, 10)
- static QT_DEPRECATED const char* pictureFormat(const QString &fileName);
- static QT_DEPRECATED QList<QByteArray> inputFormats();
- static QT_DEPRECATED QList<QByteArray> outputFormats();
- static QT_DEPRECATED QStringList inputFormatList();
- static QT_DEPRECATED QStringList outputFormatList();
-#endif // QT_DEPRECATED_SINCE(5, 10)
-
QPaintEngine *paintEngine() const override;
protected:
@@ -118,67 +109,6 @@ public:
Q_DECLARE_SHARED(QPicture)
-
-#ifndef QT_NO_PICTUREIO
-class QIODevice;
-class QPictureIO;
-typedef void (*picture_io_handler)(QPictureIO *); // picture IO handler
-
-struct QPictureIOData;
-
-class Q_GUI_EXPORT QPictureIO
-{
-public:
- QPictureIO();
- QPictureIO(QIODevice *ioDevice, const char *format);
- QPictureIO(const QString &fileName, const char *format);
- ~QPictureIO();
-
- const QPicture &picture() const;
- int status() const;
- const char *format() const;
- QIODevice *ioDevice() const;
- QString fileName() const;
- int quality() const;
- QString description() const;
- const char *parameters() const;
- float gamma() const;
-
- void setPicture(const QPicture &);
- void setStatus(int);
- void setFormat(const char *);
- void setIODevice(QIODevice *);
- void setFileName(const QString &);
- void setQuality(int);
- void setDescription(const QString &);
- void setParameters(const char *);
- void setGamma(float);
-
- bool read();
- bool write();
-
- static QByteArray pictureFormat(const QString &fileName);
- static QByteArray pictureFormat(QIODevice *);
- static QList<QByteArray> inputFormats();
- static QList<QByteArray> outputFormats();
-
- static void defineIOHandler(const char *format,
- const char *header,
- const char *flags,
- picture_io_handler read_picture,
- picture_io_handler write_picture);
-
-private:
- Q_DISABLE_COPY(QPictureIO)
-
- void init();
-
- QPictureIOData *d;
-};
-
-#endif //QT_NO_PICTUREIO
-
-
/*****************************************************************************
QPicture stream functions
*****************************************************************************/
diff --git a/src/gui/image/qpictureformatplugin.cpp b/src/gui/image/qpictureformatplugin.cpp
deleted file mode 100644
index ef57ad720f..0000000000
--- a/src/gui/image/qpictureformatplugin.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qpictureformatplugin.h"
-#if !defined(QT_NO_PICTURE)
-#include "qpicture.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \obsolete
-
- \class QPictureFormatPlugin
- \brief The QPictureFormatPlugin class provides an abstract base
- for custom picture format plugins.
-
- \ingroup plugins
- \inmodule QtGui
-
- The picture format plugin is a simple plugin interface that makes
- it easy to create custom picture formats that can be used
- transparently by applications.
-
- Writing an picture format plugin is achieved by subclassing this
- base class, reimplementing the pure virtual functions
- loadPicture(), savePicture(), and installIOHandler(), and
- exporting the class with the Q_PLUGIN_METADATA() macro.
-
- The json file containing the metadata should contain one entry
- with the list of picture formats supported by the plugin:
-
- \code
- { "Keys": [ "mypictureformat" ] }
- \endcode
-
- \sa {How to Create Qt Plugins}
-*/
-
-/*!
- \fn bool QPictureFormatPlugin::installIOHandler(const QString &format)
-
- Installs a QPictureIO picture I/O handler for the picture format \a
- format. Returns \c true on success.
-*/
-
-
-/*!
- Constructs an picture format plugin with the given \a parent.
- This is invoked automatically by the moc generated code that exports the plugin.
-*/
-QPictureFormatPlugin::QPictureFormatPlugin(QObject *parent)
- : QObject(parent)
-{
-}
-
-/*!
- Destroys the picture format plugin.
-
- You never have to call this explicitly. Qt destroys a plugin
- automatically when it is no longer used.
-*/
-QPictureFormatPlugin::~QPictureFormatPlugin()
-{
-}
-
-
-/*!
- Loads the picture stored in the file called \a fileName, with the
- given \a format, into *\a picture. Returns \c true on success;
- otherwise returns \c false.
-
- \sa savePicture()
-*/
-bool QPictureFormatPlugin::loadPicture(const QString &format, const QString &fileName, QPicture *picture)
-{
- Q_UNUSED(format)
- Q_UNUSED(fileName)
- Q_UNUSED(picture)
- return false;
-}
-
-/*!
- Saves the given \a picture into the file called \a fileName,
- using the specified \a format. Returns \c true on success; otherwise
- returns \c false.
-
- \sa loadPicture()
-*/
-bool QPictureFormatPlugin::savePicture(const QString &format, const QString &fileName, const QPicture &picture)
-{
- Q_UNUSED(format)
- Q_UNUSED(fileName)
- Q_UNUSED(picture)
- return false;
-}
-
-#endif // QT_NO_PICTURE
-
-QT_END_NAMESPACE
diff --git a/src/gui/image/qpictureformatplugin.h b/src/gui/image/qpictureformatplugin.h
deleted file mode 100644
index 3f59c04d79..0000000000
--- a/src/gui/image/qpictureformatplugin.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QPICTUREFORMATPLUGIN_H
-#define QPICTUREFORMATPLUGIN_H
-
-#include <QtGui/qtguiglobal.h>
-#include <QtCore/qplugin.h>
-#include <QtCore/qfactoryinterface.h>
-
-QT_BEGIN_NAMESPACE
-
-
-#if !defined(QT_NO_PICTURE)
-
-class QPicture;
-class QImage;
-class QString;
-class QStringList;
-
-#define QPictureFormatInterface_iid "org.qt-project.Qt.QPictureFormatInterface"
-
-class Q_GUI_EXPORT QPictureFormatPlugin : public QObject
-{
- Q_OBJECT
-public:
- explicit QPictureFormatPlugin(QObject *parent = nullptr);
- ~QPictureFormatPlugin();
-
- virtual bool loadPicture(const QString &format, const QString &filename, QPicture *pic);
- virtual bool savePicture(const QString &format, const QString &filename, const QPicture &pic);
- virtual bool installIOHandler(const QString &format) = 0;
-
-};
-
-#endif // QT_NO_PICTURE
-
-QT_END_NAMESPACE
-
-#endif // QPICTUREFORMATPLUGIN_H
diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index c8db8b2996..a4c5296d9f 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -458,24 +458,6 @@ QTransform QPixmap::trueMatrix(const QTransform &m, int w, int h)
return QImage::trueMatrix(m, w, h);
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \overload
- \obsolete
-
- Use trueMatrix(const QTransform &m, int w, int h) instead.
-
- This convenience function loads the matrix \a m into a
- QTransform and calls the overloaded function with the
- QTransform and the width \a w and the height \a h.
- */
-QMatrix QPixmap::trueMatrix(const QMatrix &m, int w, int h)
-{
- return trueMatrix(QTransform(m), w, h).toAffine();
-}
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
-
/*!
\fn bool QPixmap::isQBitmap() const
@@ -1238,29 +1220,6 @@ QPixmap QPixmap::transformed(const QTransform &transform,
return data->transformed(transform, mode);
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \overload
- \obsolete
-
- Use transformed(const QTransform &transform, Qt::TransformationMode mode)() instead.
-
- This convenience function loads the \a matrix into a
- QTransform and calls the overloaded function.
- */
-QPixmap QPixmap::transformed(const QMatrix &matrix, Qt::TransformationMode mode) const
-{
- return transformed(QTransform(matrix), mode);
-}
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
-
-
-
-
-
-
-
/*!
\class QPixmap
\inmodule QtGui
diff --git a/src/gui/image/qpixmap.h b/src/gui/image/qpixmap.h
index e47a9fe59e..2708d267b9 100644
--- a/src/gui/image/qpixmap.h
+++ b/src/gui/image/qpixmap.h
@@ -129,12 +129,6 @@ public:
Qt::TransformationMode mode = Qt::FastTransformation) const;
QPixmap scaledToWidth(int w, Qt::TransformationMode mode = Qt::FastTransformation) const;
QPixmap scaledToHeight(int h, Qt::TransformationMode mode = Qt::FastTransformation) const;
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_X("Use transformed(const QTransform &, Qt::TransformationMode mode)")
- QPixmap transformed(const QMatrix &, Qt::TransformationMode mode = Qt::FastTransformation) const;
- QT_DEPRECATED_X("Use trueMatrix(const QTransform &m, int w, int h)")
- static QMatrix trueMatrix(const QMatrix &m, int w, int h);
-#endif // QT_DEPRECATED_SINCE(5, 15)
QPixmap transformed(const QTransform &, Qt::TransformationMode mode = Qt::FastTransformation) const;
static QTransform trueMatrix(const QTransform &m, int w, int h);
diff --git a/src/gui/image/qpixmap_win.cpp b/src/gui/image/qpixmap_win.cpp
index 8aad77b991..be6cd0c5fc 100644
--- a/src/gui/image/qpixmap_win.cpp
+++ b/src/gui/image/qpixmap_win.cpp
@@ -121,7 +121,7 @@ static inline void copyImageDataCreateAlpha(const uchar *data, QImage *target)
const uint mask = target->format() == QImage::Format_RGB32 ? 0xff000000 : 0;
const int height = target->height();
const int width = target->width();
- const int bytesPerLine = width * int(sizeof(QRgb));
+ const qsizetype bytesPerLine = width * sizeof(QRgb);
for (int y = 0; y < height; ++y) {
QRgb *dest = reinterpret_cast<QRgb *>(target->scanLine(y));
const QRgb *src = reinterpret_cast<const QRgb *>(data + y * bytesPerLine);
diff --git a/src/gui/image/qpixmapcache.cpp b/src/gui/image/qpixmapcache.cpp
index 9709df9e0c..118d8c57e8 100644
--- a/src/gui/image/qpixmapcache.cpp
+++ b/src/gui/image/qpixmapcache.cpp
@@ -253,9 +253,9 @@ QT_BEGIN_INCLUDE_NAMESPACE
#include "qpixmapcache.moc"
QT_END_INCLUDE_NAMESPACE
-uint qHash(const QPixmapCache::Key &k)
+size_t qHash(const QPixmapCache::Key &k, size_t seed)
{
- return qHash(QPMCache::get(k)->key);
+ return qHash(QPMCache::get(k)->key, seed);
}
QPMCache::QPMCache()
diff --git a/src/gui/image/qpixmapcache_p.h b/src/gui/image/qpixmapcache_p.h
index ab8e2b7558..fce2b2d9a1 100644
--- a/src/gui/image/qpixmapcache_p.h
+++ b/src/gui/image/qpixmapcache_p.h
@@ -59,7 +59,7 @@
QT_BEGIN_NAMESPACE
-uint qHash(const QPixmapCache::Key &k);
+size_t qHash(const QPixmapCache::Key &k, size_t seed = 0);
class QPixmapCache::KeyData
{
diff --git a/src/gui/image/qplatformpixmap.cpp b/src/gui/image/qplatformpixmap.cpp
index 493f55514e..ea4243ba07 100644
--- a/src/gui/image/qplatformpixmap.cpp
+++ b/src/gui/image/qplatformpixmap.cpp
@@ -183,7 +183,7 @@ QBitmap QPlatformPixmap::mask() const
mask.setColor(0, QColor(Qt::color0).rgba());
mask.setColor(1, QColor(Qt::color1).rgba());
- const int bpl = mask.bytesPerLine();
+ const qsizetype bpl = mask.bytesPerLine();
for (int y = 0; y < h; ++y) {
const QRgb *src = reinterpret_cast<const QRgb*>(image.scanLine(y));
@@ -216,7 +216,7 @@ void QPlatformPixmap::setMask(const QBitmap &mask)
for (int y = 0; y < h; ++y) {
const uchar *mscan = imageMask.scanLine(y);
uchar *tscan = image.scanLine(y);
- int bytesPerLine = image.bytesPerLine();
+ qsizetype bytesPerLine = image.bytesPerLine();
for (int i = 0; i < bytesPerLine; ++i)
tscan[i] &= mscan[i];
}
diff --git a/src/gui/image/qplatformpixmap.h b/src/gui/image/qplatformpixmap.h
index 7635ac2949..9c7f5e5edf 100644
--- a/src/gui/image/qplatformpixmap.h
+++ b/src/gui/image/qplatformpixmap.h
@@ -163,7 +163,7 @@ private:
# define QT_XFORM_TYPE_MSBFIRST 0
# define QT_XFORM_TYPE_LSBFIRST 1
-Q_GUI_EXPORT bool qt_xForm_helper(const QTransform&, int, int, int, uchar*, int, int, int, const uchar*, int, int, int);
+Q_GUI_EXPORT bool qt_xForm_helper(const QTransform&, int, int, int, uchar*, qsizetype, int, int, const uchar*, qsizetype, int, int);
QT_END_NAMESPACE
diff --git a/src/gui/image/qpnghandler.cpp b/src/gui/image/qpnghandler.cpp
index f956f254ee..5738148718 100644
--- a/src/gui/image/qpnghandler.cpp
+++ b/src/gui/image/qpnghandler.cpp
@@ -455,7 +455,7 @@ static void read_image_scaled(QImage *outImage, png_structp png_ptr, png_infop i
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, nullptr, nullptr, nullptr);
png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y, &unit_type);
uchar *data = outImage->bits();
- int bpl = outImage->bytesPerLine();
+ qsizetype bpl = outImage->bytesPerLine();
if (scaledSize.isEmpty() || !width || !height)
return;
@@ -709,7 +709,7 @@ bool QPngHandlerPrivate::readPngImage(QImage *outImage)
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, nullptr, nullptr, nullptr);
png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y, &unit_type);
uchar *data = outImage->bits();
- int bpl = outImage->bytesPerLine();
+ qsizetype bpl = outImage->bytesPerLine();
amp.row_pointers = new png_bytep[height];
for (uint y = 0; y < height; y++)
diff --git a/src/gui/image/qppmhandler.cpp b/src/gui/image/qppmhandler.cpp
index 728259ba9e..16136e6be3 100644
--- a/src/gui/image/qppmhandler.cpp
+++ b/src/gui/image/qppmhandler.cpp
@@ -135,7 +135,7 @@ static inline QRgb scale_pbm_color(quint16 mx, quint16 rv, quint16 gv, quint16 b
static bool read_pbm_body(QIODevice *device, char type, int w, int h, int mcc, QImage *outImage)
{
int nbits, y;
- int pbm_bpl;
+ qsizetype pbm_bpl;
bool raw;
QImage::Format format;
@@ -166,7 +166,7 @@ static bool read_pbm_body(QIODevice *device, char type, int w, int h, int mcc, Q
return false;
}
- pbm_bpl = (nbits*w+7)/8; // bytes per scanline in PBM
+ pbm_bpl = (qsizetype(w) * nbits + 7) / 8; // bytes per scanline in PBM
if (raw) { // read raw data
if (nbits == 32) { // type 6
@@ -225,14 +225,14 @@ static bool read_pbm_body(QIODevice *device, char type, int w, int h, int mcc, Q
if (device->read((char *)p, pbm_bpl) != pbm_bpl)
return false;
if (nbits == 8 && mcc < 255) {
- for (int i = 0; i < pbm_bpl; i++)
+ for (qsizetype i = 0; i < pbm_bpl; i++)
p[i] = (p[i] * 255) / mcc;
}
}
}
} else { // read ascii data
uchar *p;
- int n;
+ qsizetype n;
char buf;
for (y = 0; (y < h) && (device->peek(&buf, 1) == 1); y++) {
p = outImage->scanLine(y);
@@ -367,7 +367,7 @@ static bool write_pbm_image(QIODevice *out, const QImage &sourceImage, const QBy
str.append("255\n");
if (out->write(str, str.length()) != str.length())
return false;
- uint bpl = w * (gray ? 1 : 3);
+ qsizetype bpl = qsizetype(w) * (gray ? 1 : 3);
uchar *buf = new uchar[bpl];
if (image.format() == QImage::Format_Indexed8) {
QVector<QRgb> color = image.colorTable();
@@ -388,7 +388,7 @@ static bool write_pbm_image(QIODevice *out, const QImage &sourceImage, const QBy
*p++ = qBlue(rgb);
}
}
- if (bpl != (uint)out->write((char*)buf, bpl))
+ if (bpl != (qsizetype)out->write((char*)buf, bpl))
return false;
}
} else {
@@ -407,7 +407,7 @@ static bool write_pbm_image(QIODevice *out, const QImage &sourceImage, const QBy
*p++ = color;
}
}
- if (bpl != (uint)out->write((char*)buf, bpl))
+ if (bpl != (qsizetype)out->write((char*)buf, bpl))
return false;
}
}
@@ -420,7 +420,7 @@ static bool write_pbm_image(QIODevice *out, const QImage &sourceImage, const QBy
str.append("255\n");
if (out->write(str, str.length()) != str.length())
return false;
- uint bpl = w * 3;
+ qsizetype bpl = qsizetype(w) * 3;
uchar *buf = new uchar[bpl];
for (uint y=0; y<h; y++) {
const QRgb *b = reinterpret_cast<const QRgb *>(image.constScanLine(y));
@@ -432,7 +432,7 @@ static bool write_pbm_image(QIODevice *out, const QImage &sourceImage, const QBy
*p++ = qGreen(rgb);
*p++ = qBlue(rgb);
}
- if (bpl != (uint)out->write((char*)buf, bpl))
+ if (bpl != (qsizetype)out->write((char*)buf, bpl))
return false;
}
delete [] buf;
diff --git a/src/gui/image/qxbmhandler.cpp b/src/gui/image/qxbmhandler.cpp
index f06561690c..c422826035 100644
--- a/src/gui/image/qxbmhandler.cpp
+++ b/src/gui/image/qxbmhandler.cpp
@@ -44,7 +44,6 @@
#include <qimage.h>
#include <qiodevice.h>
-#include <qregexp.h>
#include <qvariant.h>
#include <stdio.h>
@@ -67,8 +66,6 @@ static bool read_xbm_header(QIODevice *device, int& w, int& h)
const int buflen = 300;
const int maxlen = 4096;
char buf[buflen + 1];
- QRegExp r1(QLatin1String("^#define[ \t]+[a-zA-Z0-9._]+[ \t]+"));
- QRegExp r2(QLatin1String("[0-9]+"));
qint64 readBytes = 0;
qint64 totalReadBytes = 0;
@@ -90,30 +87,38 @@ static bool read_xbm_header(QIODevice *device, int& w, int& h)
return false;
}
- buf[readBytes - 1] = '\0';
- QString sbuf;
- sbuf = QString::fromLatin1(buf);
+ auto parseDefine = [] (const char *buf, int len) -> int {
+ auto isAsciiLetterOrNumber = [] (char ch) -> bool {
+ return (ch >= '0' && ch <= '9') ||
+ (ch >= 'A' && ch <= 'Z') ||
+ (ch >= 'a' && ch <= 'z') ||
+ ch == '_' || ch == '.';
+ };
+ auto isAsciiSpace = [] (char ch) -> bool {
+ return ch == ' ' || ch == '\t';
+ };
+ const char define[] = "#define";
+ constexpr size_t defineLen = sizeof(define) - 1;
+ if (strncmp(buf, define, defineLen) != 0)
+ return 0;
+ int index = defineLen;
+ while (buf[index] && isAsciiSpace(buf[index]))
+ ++index;
+ while (buf[index] && isAsciiLetterOrNumber(buf[index]))
+ ++index;
+ while (buf[index] && isAsciiSpace(buf[index]))
+ ++index;
+
+ return QByteArray(buf + index, len - index).toInt();
+ };
+
// "#define .._width <num>"
- if (r1.indexIn(sbuf) == 0 &&
- r2.indexIn(sbuf, r1.matchedLength()) == r1.matchedLength())
- w = QByteArray(&buf[r1.matchedLength()]).trimmed().toInt();
- else
- return false;
+ w = parseDefine(buf, readBytes - 1);
- // "#define .._height <num>"
readBytes = device->readLine(buf, buflen);
- if (readBytes <= 0)
- return false;
- buf[readBytes - 1] = '\0';
-
- sbuf = QString::fromLatin1(buf);
-
- if (r1.indexIn(sbuf) == 0 &&
- r2.indexIn(sbuf, r1.matchedLength()) == r1.matchedLength())
- h = QByteArray(&buf[r1.matchedLength()]).trimmed().toInt();
- else
- return false;
+ // "#define .._height <num>"
+ h = parseDefine(buf, readBytes - 1);
// format error
if (w <= 0 || w > 32767 || h <= 0 || h > 32767)
diff --git a/src/gui/image/qxpmhandler.cpp b/src/gui/image/qxpmhandler.cpp
index 07fec929bf..5dcc915a57 100644
--- a/src/gui/image/qxpmhandler.cpp
+++ b/src/gui/image/qxpmhandler.cpp
@@ -45,7 +45,6 @@
#include <qbytearraymatcher.h>
#include <qimage.h>
#include <qmap.h>
-#include <qregexp.h>
#include <qtextstream.h>
#include <qvariant.h>
@@ -766,17 +765,26 @@ static QString fbname(const QString &fileName) // get file basename (sort of)
{
QString s = fileName;
if (!s.isEmpty()) {
- int i;
- if ((i = s.lastIndexOf(QLatin1Char('/'))) >= 0)
- s = s.mid(i);
- if ((i = s.lastIndexOf(QLatin1Char('\\'))) >= 0)
- s = s.mid(i);
- QRegExp r(QLatin1String("[a-zA-Z][a-zA-Z0-9_]*"));
- int p = r.indexIn(s);
- if (p == -1)
+ int i = qMax(s.lastIndexOf(QLatin1Char('/')), s.lastIndexOf(QLatin1Char('\\')));
+ if (i < 0)
+ i = 0;
+ auto isAsciiLetterOrNumber = [](QChar ch) -> bool {
+ return (ch.unicode() >= '0' && ch.unicode() <= '9') ||
+ (ch.unicode() >= 'A' && ch.unicode() <= 'Z') ||
+ (ch.unicode() >= 'a' && ch.unicode() <= 'z') ||
+ ch.unicode() == '_';
+ };
+ int start = -1;
+ for (; i < s.length(); ++i) {
+ if (isAsciiLetterOrNumber(s.at(i))) {
+ start = i;
+ } else if (start > 0)
+ break;
+ }
+ if (start < 0)
s.clear();
else
- s = s.mid(p, r.matchedLength());
+ s = s.mid(start, i - start);
}
if (s.isEmpty())
s = QString::fromLatin1("dummy");
diff --git a/src/gui/itemmodels/qstandarditemmodel.cpp b/src/gui/itemmodels/qstandarditemmodel.cpp
index fc9424763e..d0325a7f9e 100644
--- a/src/gui/itemmodels/qstandarditemmodel.cpp
+++ b/src/gui/itemmodels/qstandarditemmodel.cpp
@@ -3150,7 +3150,7 @@ QMimeData *QStandardItemModel::mimeData(const QModelIndexList &indexes) const
for (int i = 0; i < childList.count(); ++i) {
QStandardItem *chi = childList.at(i);
if (chi) {
- itemsSet.erase(itemsSet.constFind(chi));
+ itemsSet.remove(chi);
stack.push(chi);
}
}
diff --git a/src/gui/itemmodels/qstandarditemmodel.h b/src/gui/itemmodels/qstandarditemmodel.h
index a9ee25da75..a66054a04f 100644
--- a/src/gui/itemmodels/qstandarditemmodel.h
+++ b/src/gui/itemmodels/qstandarditemmodel.h
@@ -53,8 +53,6 @@ QT_REQUIRE_CONFIG(standarditemmodel);
QT_BEGIN_NAMESPACE
-template <class T> class QList;
-
class QStandardItemModel;
class QStandardItemPrivate;
@@ -81,12 +79,10 @@ public:
}
inline void setIcon(const QIcon &icon);
-#ifndef QT_NO_TOOLTIP
inline QString toolTip() const {
return qvariant_cast<QString>(data(Qt::ToolTipRole));
}
inline void setToolTip(const QString &toolTip);
-#endif
#ifndef QT_NO_STATUSTIP
inline QString statusTip() const {
@@ -262,10 +258,8 @@ inline void QStandardItem::setText(const QString &atext)
inline void QStandardItem::setIcon(const QIcon &aicon)
{ setData(aicon, Qt::DecorationRole); }
-#ifndef QT_NO_TOOLTIP
inline void QStandardItem::setToolTip(const QString &atoolTip)
{ setData(atoolTip, Qt::ToolTipRole); }
-#endif
#ifndef QT_NO_STATUSTIP
inline void QStandardItem::setStatusTip(const QString &astatusTip)
@@ -344,8 +338,11 @@ public:
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
- // Qt 6: add override keyword
- bool clearItemData(const QModelIndex &index);
+ bool clearItemData(const QModelIndex &index)
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ override
+#endif
+ ;
QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const override;
diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri
index 9c80f1e2cc..548bc18698 100644
--- a/src/gui/kernel/kernel.pri
+++ b/src/gui/kernel/kernel.pri
@@ -48,11 +48,8 @@ HEADERS += \
kernel/qinputmethod.h \
kernel/qinputmethod_p.h \
kernel/qinternalmimedata_p.h \
- kernel/qkeysequence.h \
- kernel/qkeysequence_p.h \
kernel/qkeymapper_p.h \
kernel/qpalette.h \
- kernel/qshortcutmap_p.h \
kernel/qsessionmanager.h \
kernel/qsessionmanager_p.h \
kernel/qwindowdefs.h \
@@ -108,12 +105,10 @@ SOURCES += \
kernel/qevent.cpp \
kernel/qinputmethod.cpp \
kernel/qinternalmimedata.cpp \
- kernel/qkeysequence.cpp \
kernel/qkeymapper.cpp \
kernel/qpalette.cpp \
kernel/qguivariant.cpp \
kernel/qscreen.cpp \
- kernel/qshortcutmap.cpp \
kernel/qstylehints.cpp \
kernel/qtouchdevice.cpp \
kernel/qplatformsharedgraphicscache.cpp \
@@ -131,6 +126,18 @@ SOURCES += \
kernel/qhighdpiscaling.cpp \
kernel/qtestsupport_gui.cpp
+qtConfig(action) {
+ HEADERS += \
+ kernel/qaction.h \
+ kernel/qaction_p.h \
+ kernel/qactiongroup.h \
+ kernel/qactiongroup_p.h
+
+ SOURCES += \
+ kernel/qactiongroup.cpp \
+ kernel/qaction.cpp
+}
+
qtConfig(draganddrop) {
HEADERS += \
kernel/qdnd_p.h \
@@ -151,13 +158,24 @@ qtConfig(opengl) {
HEADERS += \
kernel/qplatformopenglcontext.h \
kernel/qopenglcontext.h \
- kernel/qopenglcontext_p.h \
- kernel/qopenglwindow.h
+ kernel/qopenglcontext_p.h
SOURCES += \
kernel/qplatformopenglcontext.cpp \
- kernel/qopenglcontext.cpp \
- kernel/qopenglwindow.cpp
+ kernel/qopenglcontext.cpp
+}
+
+qtConfig(shortcut) {
+ HEADERS += \
+ kernel/qshortcut.h \
+ kernel/qshortcut_p.h \
+ kernel/qshortcutmap_p.h \
+ kernel/qkeysequence.h \
+ kernel/qkeysequence_p.h
+ SOURCES += \
+ kernel/qshortcut.cpp \
+ kernel/qshortcutmap.cpp \
+ kernel/qkeysequence.cpp
}
win32:HEADERS+=kernel/qwindowdefs_win.h
diff --git a/src/gui/kernel/qaction.cpp b/src/gui/kernel/qaction.cpp
new file mode 100644
index 0000000000..99a614ddd9
--- /dev/null
+++ b/src/gui/kernel/qaction.cpp
@@ -0,0 +1,1378 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaction.h"
+#include "qactiongroup.h"
+
+#include "qaction_p.h"
+#include "qguiapplication.h"
+#include "qevent.h"
+#include "qlist.h"
+#include "qstylehints.h"
+#if QT_CONFIG(shortcut)
+# include <private/qshortcutmap_p.h>
+#endif
+#include <private/qguiapplication_p.h>
+#include <private/qdebug_p.h>
+
+#define QAPP_CHECK(functionName) \
+ if (Q_UNLIKELY(!QCoreApplication::instance())) { \
+ qWarning("QAction: Initialize Q(Gui)Application before calling '" functionName "'."); \
+ return; \
+ }
+
+QT_BEGIN_NAMESPACE
+
+/*
+ internal: guesses a descriptive text from a text suited for a menu entry
+ */
+static QString qt_strippedText(QString s)
+{
+ s.remove(QLatin1String("..."));
+ for (int i = 0; i < s.size(); ++i) {
+ if (s.at(i) == QLatin1Char('&'))
+ s.remove(i, 1);
+ }
+ return s.trimmed();
+}
+
+QActionPrivate *QGuiApplicationPrivate::createActionPrivate() const
+{
+ return new QActionPrivate;
+}
+
+QActionPrivate::QActionPrivate() :
+#if QT_CONFIG(shortcut)
+ autorepeat(1),
+#endif
+ enabled(1), explicitEnabled(0), explicitEnabledValue(1), visible(1), forceInvisible(0), checkable(0),
+ checked(0), separator(0), fontSet(false),
+ iconVisibleInMenu(-1), shortcutVisibleInContextMenu(-1)
+{
+}
+
+#if QT_CONFIG(shortcut)
+static bool dummy(QObject *, Qt::ShortcutContext) { return false; } // only for GUI testing.
+
+QShortcutMap::ContextMatcher QActionPrivate::contextMatcher() const
+{
+ return dummy;
+};
+#endif // QT_CONFIG(shortcut)
+
+QActionPrivate::~QActionPrivate() = default;
+
+void QActionPrivate::destroy()
+{
+}
+
+void QActionPrivate::sendDataChanged()
+{
+ Q_Q(QAction);
+ QActionEvent e(QEvent::ActionChanged, q);
+ QCoreApplication::sendEvent(q, &e);
+
+ emit q->changed();
+}
+
+#if QT_CONFIG(shortcut)
+void QActionPrivate::redoGrab(QShortcutMap &map)
+{
+ Q_Q(QAction);
+ if (shortcutId)
+ map.removeShortcut(shortcutId, q);
+ if (shortcut.isEmpty())
+ return;
+ shortcutId = map.addShortcut(q, shortcut, shortcutContext, contextMatcher());
+ if (!enabled)
+ map.setShortcutEnabled(false, shortcutId, q);
+ if (!autorepeat)
+ map.setShortcutAutoRepeat(false, shortcutId, q);
+}
+
+void QActionPrivate::redoGrabAlternate(QShortcutMap &map)
+{
+ Q_Q(QAction);
+ for(int i = 0; i < alternateShortcutIds.count(); ++i) {
+ if (const int id = alternateShortcutIds.at(i))
+ map.removeShortcut(id, q);
+ }
+ alternateShortcutIds.clear();
+ if (alternateShortcuts.isEmpty())
+ return;
+ for(int i = 0; i < alternateShortcuts.count(); ++i) {
+ const QKeySequence& alternate = alternateShortcuts.at(i);
+ if (!alternate.isEmpty())
+ alternateShortcutIds.append(map.addShortcut(q, alternate, shortcutContext, contextMatcher()));
+ else
+ alternateShortcutIds.append(0);
+ }
+ if (!enabled) {
+ for(int i = 0; i < alternateShortcutIds.count(); ++i) {
+ const int id = alternateShortcutIds.at(i);
+ map.setShortcutEnabled(false, id, q);
+ }
+ }
+ if (!autorepeat) {
+ for(int i = 0; i < alternateShortcutIds.count(); ++i) {
+ const int id = alternateShortcutIds.at(i);
+ map.setShortcutAutoRepeat(false, id, q);
+ }
+ }
+}
+
+void QActionPrivate::setShortcutEnabled(bool enable, QShortcutMap &map)
+{
+ Q_Q(QAction);
+ if (shortcutId)
+ map.setShortcutEnabled(enable, shortcutId, q);
+ for(int i = 0; i < alternateShortcutIds.count(); ++i) {
+ if (const int id = alternateShortcutIds.at(i))
+ map.setShortcutEnabled(enable, id, q);
+ }
+}
+#endif // QT_NO_SHORTCUT
+
+bool QActionPrivate::showStatusText(QObject *object, const QString &str)
+{
+ if (QObject *receiver = object ? object : parent) {
+ QStatusTipEvent tip(str);
+ QCoreApplication::sendEvent(receiver, &tip);
+ return true;
+ }
+ return false;
+}
+
+void QActionPrivate::setMenu(QObject *)
+{
+}
+
+QObject *QActionPrivate::menu() const
+{
+ return nullptr;
+}
+
+/*!
+ \class QAction
+ \brief The QAction class provides an abstraction for user commands
+ that can be added to different user interface components.
+ \since 6.0
+
+ \inmodule QtGui
+
+ In applications many common commands can be invoked via menus,
+ toolbar buttons, and keyboard shortcuts. Since the user expects
+ each command to be performed in the same way, regardless of the
+ user interface used, it is useful to represent each command as
+ an \e action.
+
+ Actions can be added to menus and toolbars, and will
+ automatically keep them in sync. For example, in a word processor,
+ if the user presses a Bold toolbar button, the Bold menu item
+ will automatically be checked.
+
+ A QAction may contain an icon, menu text, a shortcut, status text,
+ "What's This?" text, and a tooltip. Most of these can be set in
+ the constructor. They can also be set independently with
+ setIcon(), setText(), setIconText(), setShortcut(),
+ setStatusTip(), setWhatsThis(), and setToolTip(). For menu items,
+ it is possible to set an individual font with setFont().
+
+ We recommend that actions are created as children of the window
+ they are used in. In most cases actions will be children of
+ the application's main window.
+
+ \section1 QAction in widget applications
+
+ Once a QAction has been created, it should be added to the relevant
+ menu and toolbar, then connected to the slot which will perform
+ the action. For example:
+
+ \snippet mainwindows/application/mainwindow.cpp 19
+
+ Actions are added to widgets using QWidget::addAction() or
+ QGraphicsWidget::addAction(). Note that an action must be added to a
+ widget before it can be used. This is also true when the shortcut should
+ be global (i.e., Qt::ApplicationShortcut as Qt::ShortcutContext).
+
+ Actions can be created as independent objects. But they may
+ also be created during the construction of menus. The QMenu class
+ contains convenience functions for creating actions suitable for
+ use as menu items.
+
+
+ \sa QMenu, QToolBar, {Application Example}
+*/
+
+/*!
+ \fn void QAction::trigger()
+
+ This is a convenience slot that calls activate(Trigger).
+*/
+
+/*!
+ \fn void QAction::hover()
+
+ This is a convenience slot that calls activate(Hover).
+*/
+
+/*!
+ \enum QAction::MenuRole
+
+ This enum describes how an action should be moved into the application menu on \macos.
+
+ \value NoRole This action should not be put into the application menu
+ \value TextHeuristicRole This action should be put in the application menu based on the action's text
+ as described in the QMenuBar documentation.
+ \value ApplicationSpecificRole This action should be put in the application menu with an application specific role
+ \value AboutQtRole This action handles the "About Qt" menu item.
+ \value AboutRole This action should be placed where the "About" menu item is in the application menu. The text of
+ the menu item will be set to "About <application name>". The application name is fetched from the
+ \c{Info.plist} file in the application's bundle (See \l{Qt for macOS - Deployment}).
+ \value PreferencesRole This action should be placed where the "Preferences..." menu item is in the application menu.
+ \value QuitRole This action should be placed where the Quit menu item is in the application menu.
+
+ Setting this value only has effect on items that are in the immediate menus
+ of the menubar, not the submenus of those menus. For example, if you have
+ File menu in your menubar and the File menu has a submenu, setting the
+ MenuRole for the actions in that submenu have no effect. They will never be moved.
+*/
+
+/*!
+ Constructs an action with \a parent. If \a parent is an action
+ group the action will be automatically inserted into the group.
+
+ \note The \a parent argument is optional since Qt 5.7.
+*/
+QAction::QAction(QObject *parent)
+ : QAction(*QGuiApplicationPrivate::instance()->createActionPrivate(), parent)
+{
+}
+
+/*!
+ Constructs an action with some \a text and \a parent. If \a
+ parent is an action group the action will be automatically
+ inserted into the group.
+
+ The action uses a stripped version of \a text (e.g. "\&Menu
+ Option..." becomes "Menu Option") as descriptive text for
+ tool buttons. You can override this by setting a specific
+ description with setText(). The same text will be used for
+ tooltips unless you specify a different text using
+ setToolTip().
+
+*/
+QAction::QAction(const QString &text, QObject *parent)
+ : QAction(parent)
+{
+ Q_D(QAction);
+ d->text = text;
+}
+
+/*!
+ Constructs an action with an \a icon and some \a text and \a
+ parent. If \a parent is an action group the action will be
+ automatically inserted into the group.
+
+ The action uses a stripped version of \a text (e.g. "\&Menu
+ Option..." becomes "Menu Option") as descriptive text for
+ tool buttons. You can override this by setting a specific
+ description with setText(). The same text will be used for
+ tooltips unless you specify a different text using
+ setToolTip().
+*/
+QAction::QAction(const QIcon &icon, const QString &text, QObject *parent)
+ : QAction(text, parent)
+{
+ Q_D(QAction);
+ d->icon = icon;
+}
+
+/*!
+ \internal
+*/
+QAction::QAction(QActionPrivate &dd, QObject *parent)
+ : QObject(dd, parent)
+{
+ Q_D(QAction);
+ d->group = qobject_cast<QActionGroup *>(parent);
+ if (d->group)
+ d->group->addAction(this);
+}
+
+#if QT_CONFIG(shortcut)
+/*!
+ \property QAction::shortcut
+ \brief the action's primary shortcut key
+
+ Valid keycodes for this property can be found in \l Qt::Key and
+ \l Qt::Modifier. There is no default shortcut key.
+*/
+void QAction::setShortcut(const QKeySequence &shortcut)
+{
+ QAPP_CHECK("setShortcut");
+
+ Q_D(QAction);
+ if (d->shortcut == shortcut)
+ return;
+
+ d->shortcut = shortcut;
+ d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
+ d->sendDataChanged();
+}
+
+/*!
+ Sets \a shortcuts as the list of shortcuts that trigger the
+ action. The first element of the list is the primary shortcut.
+
+ \sa shortcut
+*/
+void QAction::setShortcuts(const QList<QKeySequence> &shortcuts)
+{
+ Q_D(QAction);
+
+ QList <QKeySequence> listCopy = shortcuts;
+
+ QKeySequence primary;
+ if (!listCopy.isEmpty())
+ primary = listCopy.takeFirst();
+
+ if (d->shortcut == primary && d->alternateShortcuts == listCopy)
+ return;
+
+ QAPP_CHECK("setShortcuts");
+
+ d->shortcut = primary;
+ d->alternateShortcuts = listCopy;
+ d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
+ d->redoGrabAlternate(QGuiApplicationPrivate::instance()->shortcutMap);
+ d->sendDataChanged();
+}
+
+/*!
+ Sets a platform dependent list of shortcuts based on the \a key.
+ The result of calling this function will depend on the currently running platform.
+ Note that more than one shortcut can assigned by this action.
+ If only the primary shortcut is required, use setShortcut instead.
+
+ \sa QKeySequence::keyBindings()
+*/
+void QAction::setShortcuts(QKeySequence::StandardKey key)
+{
+ QList <QKeySequence> list = QKeySequence::keyBindings(key);
+ setShortcuts(list);
+}
+
+/*!
+ Returns the primary shortcut.
+
+ \sa setShortcuts()
+*/
+QKeySequence QAction::shortcut() const
+{
+ Q_D(const QAction);
+ return d->shortcut;
+}
+
+/*!
+ Returns the list of shortcuts, with the primary shortcut as
+ the first element of the list.
+
+ \sa setShortcuts()
+*/
+QList<QKeySequence> QAction::shortcuts() const
+{
+ Q_D(const QAction);
+ QList <QKeySequence> shortcuts;
+ if (!d->shortcut.isEmpty())
+ shortcuts << d->shortcut;
+ if (!d->alternateShortcuts.isEmpty())
+ shortcuts << d->alternateShortcuts;
+ return shortcuts;
+}
+
+/*!
+ \property QAction::shortcutContext
+ \brief the context for the action's shortcut
+
+ Valid values for this property can be found in \l Qt::ShortcutContext.
+ The default value is Qt::WindowShortcut.
+*/
+void QAction::setShortcutContext(Qt::ShortcutContext context)
+{
+ Q_D(QAction);
+ if (d->shortcutContext == context)
+ return;
+ QAPP_CHECK("setShortcutContext");
+ d->shortcutContext = context;
+ d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
+ d->redoGrabAlternate(QGuiApplicationPrivate::instance()->shortcutMap);
+ d->sendDataChanged();
+}
+
+Qt::ShortcutContext QAction::shortcutContext() const
+{
+ Q_D(const QAction);
+ return d->shortcutContext;
+}
+
+/*!
+ \property QAction::autoRepeat
+ \brief whether the action can auto repeat
+
+ If true, the action will auto repeat when the keyboard shortcut
+ combination is held down, provided that keyboard auto repeat is
+ enabled on the system.
+ The default value is true.
+*/
+void QAction::setAutoRepeat(bool on)
+{
+ Q_D(QAction);
+ if (d->autorepeat == on)
+ return;
+ QAPP_CHECK("setAutoRepeat");
+ d->autorepeat = on;
+ d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
+ d->redoGrabAlternate(QGuiApplicationPrivate::instance()->shortcutMap);
+ d->sendDataChanged();
+}
+
+bool QAction::autoRepeat() const
+{
+ Q_D(const QAction);
+ return d->autorepeat;
+}
+#endif // QT_CONFIG(shortcut)
+
+/*!
+ \property QAction::font
+ \brief the action's font
+
+ The font property is used to render the text set on the
+ QAction. The font can be considered a hint as it will not be
+ consulted in all cases based upon application and style.
+
+ By default, this property contains the application's default font.
+
+ \sa setText()
+*/
+void QAction::setFont(const QFont &font)
+{
+ Q_D(QAction);
+ if (d->font == font)
+ return;
+
+ d->fontSet = true;
+ d->font = font;
+ d->sendDataChanged();
+}
+
+QFont QAction::font() const
+{
+ Q_D(const QAction);
+ return d->font;
+}
+
+
+/*!
+ Destroys the object and frees allocated resources.
+*/
+QAction::~QAction()
+{
+ Q_D(QAction);
+
+ d->destroy();
+
+ if (d->group)
+ d->group->removeAction(this);
+#if QT_CONFIG(shortcut)
+ if (d->shortcutId && qApp) {
+ QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(d->shortcutId, this);
+ for (int id : qAsConst(d->alternateShortcutIds))
+ QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(id, this);
+ }
+#endif
+}
+
+/*!
+ Sets this action group to \a group. The action will be automatically
+ added to the group's list of actions.
+
+ Actions within the group will be mutually exclusive.
+
+ \sa QActionGroup, actionGroup()
+*/
+void QAction::setActionGroup(QActionGroup *group)
+{
+ Q_D(QAction);
+ if(group == d->group)
+ return;
+
+ if(d->group)
+ d->group->removeAction(this);
+ d->group = group;
+ if(group)
+ group->addAction(this);
+ d->sendDataChanged();
+}
+
+/*!
+ Returns the action group for this action. If no action group manages
+ this action, then \nullptr will be returned.
+
+ \sa QActionGroup, setActionGroup()
+*/
+QActionGroup *QAction::actionGroup() const
+{
+ Q_D(const QAction);
+ return d->group;
+}
+
+/*!
+ \since 6.0
+ Returns a list of objects this action has been added to.
+
+ \sa QWidget::addAction(), QGraphicsWidget::addAction()
+*/
+QVector<QObject*> QAction::associatedObjects() const
+{
+ Q_D(const QAction);
+ return d->associatedObjects;
+}
+
+/*!
+ \fn QWidget *QAction::parentWidget() const
+ \obsolete Use parent() with qobject_cast() instead.
+
+ Returns the parent widget.
+*/
+
+/*!
+ \fn QList<QWidget*> QAction::associatedWidgets() const
+ \obsolete Use associatedObjects() with qobject_cast() instead.
+
+ Returns a list of widgets this action has been added to.
+
+ \sa QWidget::addAction(), associatedObjects(), associatedGraphicsWidgets()
+*/
+
+/*!
+ \fn QList<QWidget*> QAction::associatedGraphicsWidgets() const
+ \obsolete Use associatedObjects() with qobject_cast() instead.
+
+ Returns a list of graphics widgets this action has been added to.
+
+ \sa QGraphicsWidget::addAction(), associatedObjects(), associatedWidgets()
+*/
+
+/*!
+ \property QAction::icon
+ \brief the action's icon
+
+ In toolbars, the icon is used as the tool button icon; in menus,
+ it is displayed to the left of the menu text. There is no default
+ icon.
+
+ If a null icon (QIcon::isNull()) is passed into this function,
+ the icon of the action is cleared.
+*/
+void QAction::setIcon(const QIcon &icon)
+{
+ Q_D(QAction);
+ d->icon = icon;
+ d->sendDataChanged();
+}
+
+QIcon QAction::icon() const
+{
+ Q_D(const QAction);
+ return d->icon;
+}
+
+/*!
+ If \a b is true then this action will be considered a separator.
+
+ How a separator is represented depends on the widget it is inserted
+ into. Under most circumstances the text, submenu, and icon will be
+ ignored for separator actions.
+
+ \sa isSeparator()
+*/
+void QAction::setSeparator(bool b)
+{
+ Q_D(QAction);
+ if (d->separator == b)
+ return;
+
+ d->separator = b;
+ d->sendDataChanged();
+}
+
+/*!
+ Returns \c true if this action is a separator action; otherwise it
+ returns \c false.
+
+ \sa setSeparator()
+*/
+bool QAction::isSeparator() const
+{
+ Q_D(const QAction);
+ return d->separator;
+}
+
+/*!
+ \property QAction::text
+ \brief the action's descriptive text
+
+ If the action is added to a menu, the menu option will consist of
+ the icon (if there is one), the text, and the shortcut (if there
+ is one). If the text is not explicitly set in the constructor, or
+ by using setText(), the action's description icon text will be
+ used as text. There is no default text.
+
+ \sa iconText
+*/
+void QAction::setText(const QString &text)
+{
+ Q_D(QAction);
+ if (d->text == text)
+ return;
+
+ d->text = text;
+ d->sendDataChanged();
+}
+
+QString QAction::text() const
+{
+ Q_D(const QAction);
+ QString s = d->text;
+ if(s.isEmpty()) {
+ s = d->iconText;
+ s.replace(QLatin1Char('&'), QLatin1String("&&"));
+ }
+ return s;
+}
+
+/*!
+ \property QAction::iconText
+ \brief the action's descriptive icon text
+
+ If QToolBar::toolButtonStyle is set to a value that permits text to
+ be displayed, the text defined held in this property appears as a
+ label in the relevant tool button.
+
+ It also serves as the default text in menus and tooltips if the action
+ has not been defined with setText() or setToolTip(), and will
+ also be used in toolbar buttons if no icon has been defined using setIcon().
+
+ If the icon text is not explicitly set, the action's normal text will be
+ used for the icon text.
+
+ By default, this property contains an empty string.
+
+ \sa setToolTip(), setStatusTip()
+*/
+void QAction::setIconText(const QString &text)
+{
+ Q_D(QAction);
+ if (d->iconText == text)
+ return;
+
+ d->iconText = text;
+ d->sendDataChanged();
+}
+
+QString QAction::iconText() const
+{
+ Q_D(const QAction);
+ if (d->iconText.isEmpty())
+ return qt_strippedText(d->text);
+ return d->iconText;
+}
+
+/*!
+ \property QAction::toolTip
+ \brief the action's tooltip
+
+ This text is used for the tooltip. If no tooltip is specified,
+ the action's text is used.
+
+ By default, this property contains the action's text.
+
+ \sa setStatusTip(), setShortcut()
+*/
+void QAction::setToolTip(const QString &tooltip)
+{
+ Q_D(QAction);
+ if (d->tooltip == tooltip)
+ return;
+
+ d->tooltip = tooltip;
+ d->sendDataChanged();
+}
+
+QString QAction::toolTip() const
+{
+ Q_D(const QAction);
+ if (d->tooltip.isEmpty()) {
+ if (!d->text.isEmpty())
+ return qt_strippedText(d->text);
+ return qt_strippedText(d->iconText);
+ }
+ return d->tooltip;
+}
+
+/*!
+ \property QAction::statusTip
+ \brief the action's status tip
+
+ The status tip is displayed on all status bars provided by the
+ action's top-level parent widget.
+
+ By default, this property contains an empty string.
+
+ \sa setToolTip(), showStatusText()
+*/
+void QAction::setStatusTip(const QString &statustip)
+{
+ Q_D(QAction);
+ if (d->statustip == statustip)
+ return;
+
+ d->statustip = statustip;
+ d->sendDataChanged();
+}
+
+QString QAction::statusTip() const
+{
+ Q_D(const QAction);
+ return d->statustip;
+}
+
+/*!
+ Updates the relevant status bar for the UI represented by \a object by sending a
+ QStatusTipEvent. Returns \c true if an event was sent, otherwise returns \c false.
+
+ If a null widget is specified, the event is sent to the action's parent.
+
+ \sa statusTip
+*/
+bool QAction::showStatusText(QObject *object)
+{
+ Q_D(QAction);
+ return d->showStatusText(object, statusTip());
+}
+
+/*!
+ \property QAction::whatsThis
+ \brief the action's "What's This?" help text
+
+ The "What's This?" text is used to provide a brief description of
+ the action. The text may contain rich text. There is no default
+ "What's This?" text.
+
+ \sa QWhatsThis
+*/
+void QAction::setWhatsThis(const QString &whatsthis)
+{
+ Q_D(QAction);
+ if (d->whatsthis == whatsthis)
+ return;
+
+ d->whatsthis = whatsthis;
+ d->sendDataChanged();
+}
+
+QString QAction::whatsThis() const
+{
+ Q_D(const QAction);
+ return d->whatsthis;
+}
+
+/*!
+ \enum QAction::Priority
+
+ This enum defines priorities for actions in user interface.
+
+ \value LowPriority The action should not be prioritized in
+ the user interface.
+
+ \value NormalPriority
+
+ \value HighPriority The action should be prioritized in
+ the user interface.
+
+ \sa priority
+*/
+
+
+/*!
+ \property QAction::priority
+
+ \brief the actions's priority in the user interface.
+
+ This property can be set to indicate how the action should be prioritized
+ in the user interface.
+
+ For instance, when toolbars have the Qt::ToolButtonTextBesideIcon
+ mode set, then actions with LowPriority will not show the text
+ labels.
+*/
+void QAction::setPriority(Priority priority)
+{
+ Q_D(QAction);
+ if (d->priority == priority)
+ return;
+
+ d->priority = priority;
+ d->sendDataChanged();
+}
+
+QAction::Priority QAction::priority() const
+{
+ Q_D(const QAction);
+ return d->priority;
+}
+
+/*!
+ \property QAction::checkable
+ \brief whether the action is a checkable action
+
+ A checkable action is one which has an on/off state. For example,
+ in a word processor, a Bold toolbar button may be either on or
+ off. An action which is not a toggle action is a command action;
+ a command action is simply executed, e.g. file save.
+ By default, this property is \c false.
+
+ In some situations, the state of one toggle action should depend
+ on the state of others. For example, "Left Align", "Center" and
+ "Right Align" toggle actions are mutually exclusive. To achieve
+ exclusive toggling, add the relevant toggle actions to a
+ QActionGroup with the QActionGroup::exclusive property set to
+ true.
+
+ \sa setChecked()
+*/
+void QAction::setCheckable(bool b)
+{
+ Q_D(QAction);
+ if (d->checkable == b)
+ return;
+
+ d->checkable = b;
+ QPointer<QAction> guard(this);
+ d->sendDataChanged();
+ if (guard)
+ emit checkableChanged(b);
+ if (guard && d->checked)
+ emit toggled(b);
+}
+
+bool QAction::isCheckable() const
+{
+ Q_D(const QAction);
+ return d->checkable;
+}
+
+/*!
+ \fn void QAction::toggle()
+
+ This is a convenience function for the \l checked property.
+ Connect to it to change the checked state to its opposite state.
+*/
+void QAction::toggle()
+{
+ Q_D(QAction);
+ setChecked(!d->checked);
+}
+
+/*!
+ \property QAction::checked
+ \brief whether the action is checked.
+
+ Only checkable actions can be checked. By default, this is false
+ (the action is unchecked).
+
+ \note The notifier signal for this property is toggled(). As toggling
+ a QAction changes its state, it will also emit a changed() signal.
+
+ \sa checkable, toggled()
+*/
+void QAction::setChecked(bool b)
+{
+ Q_D(QAction);
+ if (d->checked == b)
+ return;
+
+ d->checked = b;
+ if (!d->checkable)
+ return;
+ QPointer<QAction> guard(this);
+ d->sendDataChanged();
+ if (guard)
+ emit toggled(b);
+}
+
+bool QAction::isChecked() const
+{
+ Q_D(const QAction);
+ return d->checked && d->checkable;
+}
+
+/*!
+ \fn void QAction::setDisabled(bool b)
+
+ This is a convenience function for the \l enabled property, that
+ is useful for signals--slots connections. If \a b is true the
+ action is disabled; otherwise it is enabled.
+*/
+
+/*!
+ \property QAction::enabled
+ \brief whether the action is enabled
+
+ Disabled actions cannot be chosen by the user. They do not
+ disappear from menus or toolbars, but they are displayed in a way
+ which indicates that they are unavailable. For example, they might
+ be displayed using only shades of gray.
+
+ \uicontrol{What's This?} help on disabled actions is still available, provided
+ that the QAction::whatsThis property is set.
+
+ An action will be disabled when all widgets to which it is added
+ (with QWidget::addAction()) are disabled or not visible. When an
+ action is disabled, it is not possible to trigger it through its
+ shortcut.
+
+ By default, this property is \c true (actions are enabled).
+
+ \sa text
+*/
+void QAction::setEnabled(bool b)
+{
+ Q_D(QAction);
+ if (d->explicitEnabledValue == b && d->explicitEnabled)
+ return;
+ d->explicitEnabledValue = b;
+ d->explicitEnabled = true;
+ QAPP_CHECK("setEnabled");
+ d->setEnabled(b, false);
+}
+
+bool QActionPrivate::setEnabled(bool b, bool byGroup)
+{
+ Q_Q(QAction);
+ if (b && !visible)
+ b = false;
+ if (b && !byGroup && (group && !group->isEnabled()))
+ b = false;
+ if (b && byGroup && explicitEnabled)
+ b = explicitEnabledValue;
+
+ if (b == enabled)
+ return false;
+
+ enabled = b;
+#if QT_CONFIG(shortcut)
+ setShortcutEnabled(b, QGuiApplicationPrivate::instance()->shortcutMap);
+#endif
+ QPointer guard(q);
+ sendDataChanged();
+ if (guard)
+ emit q->enabledChanged(b);
+ return true;
+}
+
+void QAction::resetEnabled()
+{
+ Q_D(QAction);
+ if (!d->explicitEnabled)
+ return;
+ d->explicitEnabled = false;
+ d->setEnabled(true, false);
+}
+
+bool QAction::isEnabled() const
+{
+ Q_D(const QAction);
+ return d->enabled;
+}
+
+/*!
+ \property QAction::visible
+ \brief whether the action can be seen (e.g. in menus and toolbars)
+
+ If \e visible is true the action can be seen (e.g. in menus and
+ toolbars) and chosen by the user; if \e visible is false the
+ action cannot be seen or chosen by the user.
+
+ Actions which are not visible are \e not grayed out; they do not
+ appear at all.
+
+ By default, this property is \c true (actions are visible).
+*/
+void QAction::setVisible(bool b)
+{
+ Q_D(QAction);
+ if (b == d->visible && b != d->forceInvisible)
+ return;
+ QAPP_CHECK("setVisible");
+ d->forceInvisible = !b;
+ d->visible = b;
+ bool enabled = d->visible;
+ if (enabled && d->explicitEnabled)
+ enabled = d->explicitEnabledValue;
+ if (!d->setEnabled(enabled, false))
+ d->sendDataChanged();
+}
+
+
+bool QAction::isVisible() const
+{
+ Q_D(const QAction);
+ return d->visible;
+}
+
+/*!
+ \reimp
+*/
+bool QAction::event(QEvent *e)
+{
+ Q_D(QAction);
+ if (e->type() == QEvent::ActionChanged) {
+ for (auto object : qAsConst(d->associatedObjects))
+ QCoreApplication::sendEvent(object, e);
+ }
+
+#if QT_CONFIG(shortcut)
+ if (e->type() == QEvent::Shortcut) {
+ QShortcutEvent *se = static_cast<QShortcutEvent *>(e);
+ Q_ASSERT_X(se->key() == d_func()->shortcut || d_func()->alternateShortcuts.contains(se->key()),
+ "QAction::event",
+ "Received shortcut event from incorrect shortcut");
+ if (se->isAmbiguous())
+ qWarning("QAction::event: Ambiguous shortcut overload: %s", se->key().toString(QKeySequence::NativeText).toLatin1().constData());
+ else
+ activate(Trigger);
+ return true;
+ }
+#endif // QT_CONFIG(shortcut)
+ return QObject::event(e);
+}
+
+/*!
+ Returns the user data as set in QAction::setData.
+
+ \sa setData()
+*/
+QVariant QAction::data() const
+{
+ Q_D(const QAction);
+ return d->userData;
+}
+
+/*!
+ Sets the action's internal data to the given \a userData.
+
+ \sa data()
+*/
+void QAction::setData(const QVariant &data)
+{
+ Q_D(QAction);
+ if (d->userData == data)
+ return;
+ d->userData = data;
+ d->sendDataChanged();
+}
+
+/*!
+ Sends the relevant signals for ActionEvent \a event.
+
+ Action-based widgets use this API to cause the QAction
+ to emit signals as well as emitting their own.
+*/
+void QAction::activate(ActionEvent event)
+{
+ Q_D(QAction);
+ if(event == Trigger) {
+ QPointer<QObject> guard = this;
+ if(d->checkable) {
+ // the checked action of an exclusive group may not be unchecked
+ if (d->checked && (d->group
+ && d->group->exclusionPolicy() == QActionGroup::ExclusionPolicy::Exclusive
+ && d->group->checkedAction() == this)) {
+ if (!guard.isNull())
+ emit triggered(true);
+ return;
+ }
+ setChecked(!d->checked);
+ }
+ if (!guard.isNull())
+ emit triggered(d->checked);
+ } else if(event == Hover) {
+ emit hovered();
+ }
+}
+
+/*!
+ \fn void QAction::triggered(bool checked)
+
+ This signal is emitted when an action is activated by the user;
+ for example, when the user clicks a menu option, toolbar button,
+ or presses an action's shortcut key combination, or when trigger()
+ was called. Notably, it is \e not emitted when setChecked() or
+ toggle() is called.
+
+ If the action is checkable, \a checked is true if the action is
+ checked, or false if the action is unchecked.
+
+ \sa activate(), toggled(), checked
+*/
+
+/*!
+ \fn void QAction::toggled(bool checked)
+
+ This signal is emitted whenever a checkable action changes its
+ isChecked() status. This can be the result of a user interaction,
+ or because setChecked() was called. As setChecked() changes the
+ QAction, it emits changed() in addition to toggled().
+
+ \a checked is true if the action is checked, or false if the
+ action is unchecked.
+
+ \sa activate(), triggered(), checked
+*/
+
+/*!
+ \fn void QAction::hovered()
+
+ This signal is emitted when an action is highlighted by the user;
+ for example, when the user pauses with the cursor over a menu option,
+ toolbar button, or presses an action's shortcut key combination.
+
+ \sa activate()
+*/
+
+/*!
+ \fn void QAction::changed()
+
+ This signal is emitted when an action has changed. If you
+ are only interested in actions in a given widget, you can
+ watch for QWidget::actionEvent() sent with an
+ QEvent::ActionChanged.
+
+ \sa QWidget::actionEvent()
+*/
+
+/*!
+ \enum QAction::ActionEvent
+
+ This enum type is used when calling QAction::activate()
+
+ \value Trigger this will cause the QAction::triggered() signal to be emitted.
+
+ \value Hover this will cause the QAction::hovered() signal to be emitted.
+*/
+
+/*!
+ \property QAction::menuRole
+ \brief the action's menu role
+
+ This indicates what role the action serves in the application menu on
+ \macos. By default all actions have the TextHeuristicRole, which means that
+ the action is added based on its text (see QMenuBar for more information).
+
+ The menu role can only be changed before the actions are put into the menu
+ bar in \macos (usually just before the first application window is
+ shown).
+*/
+void QAction::setMenuRole(MenuRole menuRole)
+{
+ Q_D(QAction);
+ if (d->menuRole == menuRole)
+ return;
+
+ d->menuRole = menuRole;
+ d->sendDataChanged();
+}
+
+QAction::MenuRole QAction::menuRole() const
+{
+ Q_D(const QAction);
+ return d->menuRole;
+}
+
+/*!
+ \fn QMenu *QAction::menu() const
+ \obsolete
+
+ Returns the menu contained by this action.
+
+ In widget applications, actions that contain menus can be used to create menu
+ items with submenus, or inserted into toolbars to create buttons with popup menus.
+
+ \sa QMenu::addAction()
+*/
+QObject* QAction::menuObject() const
+{
+ Q_D(const QAction);
+ return d->menu();
+}
+
+/*!
+ \fn void QAction::setMenu(QMenu *menu)
+ \obsolete
+
+ Sets the menu contained by this action to the specified \a menu.
+*/
+void QAction::setMenuObject(QObject *object)
+{
+ Q_D(QAction);
+ d->setMenu(object);
+}
+
+/*!
+ \property QAction::iconVisibleInMenu
+ \brief Whether or not an action should show an icon in a menu
+
+ In some applications, it may make sense to have actions with icons in the
+ toolbar, but not in menus. If true, the icon (if valid) is shown in the menu, when it
+ is false, it is not shown.
+
+ The default is to follow whether the Qt::AA_DontShowIconsInMenus attribute
+ is set for the application. Explicitly settings this property overrides
+ the presence (or abscence) of the attribute.
+
+ For example:
+ \snippet code/src_gui_kernel_qaction.cpp 0
+
+ \sa icon, QCoreApplication::setAttribute()
+*/
+void QAction::setIconVisibleInMenu(bool visible)
+{
+ Q_D(QAction);
+ if (d->iconVisibleInMenu == -1 || visible != bool(d->iconVisibleInMenu)) {
+ int oldValue = d->iconVisibleInMenu;
+ d->iconVisibleInMenu = visible;
+ // Only send data changed if we really need to.
+ if (oldValue != -1
+ || visible == !QCoreApplication::testAttribute(Qt::AA_DontShowIconsInMenus)) {
+ d->sendDataChanged();
+ }
+ }
+}
+
+bool QAction::isIconVisibleInMenu() const
+{
+ Q_D(const QAction);
+ if (d->iconVisibleInMenu == -1) {
+ return !QCoreApplication::testAttribute(Qt::AA_DontShowIconsInMenus);
+ }
+ return d->iconVisibleInMenu;
+}
+
+/*!
+ \property QAction::shortcutVisibleInContextMenu
+ \brief Whether or not an action should show a shortcut in a context menu
+
+ In some applications, it may make sense to have actions with shortcuts in
+ context menus. If true, the shortcut (if valid) is shown when the action is
+ shown via a context menu, when it is false, it is not shown.
+
+ The default is to follow whether the Qt::AA_DontShowShortcutsInContextMenus attribute
+ is set for the application, falling back to the widget style hint.
+ Explicitly setting this property overrides the presence (or abscence) of the attribute.
+
+ \sa shortcut, QCoreApplication::setAttribute()
+*/
+void QAction::setShortcutVisibleInContextMenu(bool visible)
+{
+ Q_D(QAction);
+ if (d->shortcutVisibleInContextMenu == -1 || visible != bool(d->shortcutVisibleInContextMenu)) {
+ int oldValue = d->shortcutVisibleInContextMenu;
+ d->shortcutVisibleInContextMenu = visible;
+ // Only send data changed if we really need to.
+ if (oldValue != -1
+ || visible == !QCoreApplication::testAttribute(Qt::AA_DontShowShortcutsInContextMenus)) {
+ d->sendDataChanged();
+ }
+ }
+}
+
+bool QAction::isShortcutVisibleInContextMenu() const
+{
+ Q_D(const QAction);
+ if (d->shortcutVisibleInContextMenu == -1) {
+ return !QCoreApplication::testAttribute(Qt::AA_DontShowShortcutsInContextMenus)
+ && QGuiApplication::styleHints()->showShortcutsInContextMenus();
+ }
+ return d->shortcutVisibleInContextMenu;
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+Q_GUI_EXPORT QDebug operator<<(QDebug d, const QAction *action)
+{
+ QDebugStateSaver saver(d);
+ d.nospace();
+ d << "QAction(" << static_cast<const void *>(action);
+ if (action) {
+ d << " text=" << action->text();
+ if (!action->toolTip().isEmpty())
+ d << " toolTip=" << action->toolTip();
+ if (action->isCheckable())
+ d << " checked=" << action->isChecked();
+#if QT_CONFIG(shortcut)
+ if (!action->shortcut().isEmpty())
+ d << " shortcut=" << action->shortcut();
+#endif
+ d << " menuRole=";
+ QtDebugUtils::formatQEnum(d, action->menuRole());
+ d << " enabled=" << action->isEnabled();
+ d << " visible=" << action->isVisible();
+ } else {
+ d << '0';
+ }
+ d << ')';
+ return d;
+}
+#endif // QT_NO_DEBUG_STREAM
+
+QT_END_NAMESPACE
+
+#include "moc_qaction.cpp"
diff --git a/src/gui/kernel/qaction.h b/src/gui/kernel/qaction.h
new file mode 100644
index 0000000000..37c6b3a647
--- /dev/null
+++ b/src/gui/kernel/qaction.h
@@ -0,0 +1,276 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QACTION_H
+#define QACTION_H
+
+#include <QtGui/qtguiglobal.h>
+#if QT_CONFIG(shortcut)
+# include <QtGui/qkeysequence.h>
+#endif
+#include <QtGui/qicon.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qvariant.h>
+
+QT_REQUIRE_CONFIG(action);
+
+QT_BEGIN_NAMESPACE
+
+class QActionEvent;
+class QActionGroup;
+class QActionPrivate;
+#if QT_DEPRECATED_SINCE(6,0)
+class QWidget;
+class QGraphicsWidget;
+class QMenu;
+#endif
+
+class Q_GUI_EXPORT QAction : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QAction)
+
+ Q_PROPERTY(bool checkable READ isCheckable WRITE setCheckable NOTIFY checkableChanged FINAL)
+ Q_PROPERTY(bool checked READ isChecked WRITE setChecked NOTIFY toggled)
+ Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged RESET resetEnabled FINAL)
+ Q_PROPERTY(QIcon icon READ icon WRITE setIcon NOTIFY changed)
+ Q_PROPERTY(QString text READ text WRITE setText NOTIFY changed)
+ Q_PROPERTY(QString iconText READ iconText WRITE setIconText NOTIFY changed)
+ Q_PROPERTY(QString toolTip READ toolTip WRITE setToolTip NOTIFY changed)
+ Q_PROPERTY(QString statusTip READ statusTip WRITE setStatusTip NOTIFY changed)
+ Q_PROPERTY(QString whatsThis READ whatsThis WRITE setWhatsThis NOTIFY changed)
+ Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY changed)
+#if QT_CONFIG(shortcut)
+ Q_PROPERTY(QKeySequence shortcut READ shortcut WRITE setShortcut NOTIFY changed)
+ Q_PROPERTY(Qt::ShortcutContext shortcutContext READ shortcutContext WRITE setShortcutContext NOTIFY changed)
+ Q_PROPERTY(bool autoRepeat READ autoRepeat WRITE setAutoRepeat NOTIFY changed)
+#endif // QT_CONFIG(shortcut)
+ Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY changed)
+ Q_PROPERTY(MenuRole menuRole READ menuRole WRITE setMenuRole NOTIFY changed)
+ Q_PROPERTY(bool iconVisibleInMenu READ isIconVisibleInMenu WRITE setIconVisibleInMenu NOTIFY changed)
+ Q_PROPERTY(bool shortcutVisibleInContextMenu READ isShortcutVisibleInContextMenu WRITE setShortcutVisibleInContextMenu NOTIFY changed)
+ Q_PROPERTY(Priority priority READ priority WRITE setPriority)
+
+public:
+ // note this is copied into qplatformmenu.h, which must stay in sync
+ enum MenuRole { NoRole = 0, TextHeuristicRole, ApplicationSpecificRole, AboutQtRole,
+ AboutRole, PreferencesRole, QuitRole };
+ Q_ENUM(MenuRole)
+ enum Priority { LowPriority = 0,
+ NormalPriority = 128,
+ HighPriority = 256};
+ Q_ENUM(Priority)
+ explicit QAction(QObject *parent = nullptr);
+ explicit QAction(const QString &text, QObject *parent = nullptr);
+ explicit QAction(const QIcon &icon, const QString &text, QObject *parent = nullptr);
+
+ ~QAction();
+
+ QVector<QObject *> associatedObjects() const;
+
+#if QT_DEPRECATED_SINCE(6,0)
+#ifdef Q_CLANG_QDOC
+ QWidget *parentWidget() const;
+ QList<QWidget*> associatedWidgets() const;
+ QList<QGraphicsWidget*> associatedGraphicsWidgets() const;
+#else
+ /*
+ These are templates so that instantiation happens only in calling code, when
+ QWidget, QMenu, and QGraphicsWidget can be expected to be fully defined.
+ */
+ template<typename T = QWidget*>
+ T parentWidget() const
+ {
+ auto result = parent();
+ while (result && !qobject_cast<T>(result))
+ result = result->parent();
+ return static_cast<T>(result);
+ }
+
+ template<typename T = QWidget*>
+ QList<T> associatedWidgets() const
+ {
+ QList<T> result;
+ for (auto object : associatedObjects())
+ if (auto widget = qobject_cast<T>(object))
+ result.append(widget);
+ return result;
+ }
+ template<typename T = QGraphicsWidget*>
+ QList<T> associatedGraphicsWidgets() const
+ {
+ QList<T> result;
+ for (auto object : associatedObjects())
+ if (auto graphicsWidget = qobject_cast<T>(object))
+ result.append(graphicsWidget);
+ return result;
+ }
+#endif
+#endif
+
+ void setActionGroup(QActionGroup *group);
+ QActionGroup *actionGroup() const;
+ void setIcon(const QIcon &icon);
+ QIcon icon() const;
+
+ void setText(const QString &text);
+ QString text() const;
+
+ void setIconText(const QString &text);
+ QString iconText() const;
+
+ void setToolTip(const QString &tip);
+ QString toolTip() const;
+
+ void setStatusTip(const QString &statusTip);
+ QString statusTip() const;
+
+ void setWhatsThis(const QString &what);
+ QString whatsThis() const;
+
+ void setPriority(Priority priority);
+ Priority priority() const;
+
+ void setSeparator(bool b);
+ bool isSeparator() const;
+
+#if QT_CONFIG(shortcut)
+ void setShortcut(const QKeySequence &shortcut);
+ QKeySequence shortcut() const;
+
+ void setShortcuts(const QList<QKeySequence> &shortcuts);
+ void setShortcuts(QKeySequence::StandardKey);
+ QList<QKeySequence> shortcuts() const;
+
+ void setShortcutContext(Qt::ShortcutContext context);
+ Qt::ShortcutContext shortcutContext() const;
+
+ void setAutoRepeat(bool);
+ bool autoRepeat() const;
+#endif // QT_CONFIG(shortcut)
+
+ void setFont(const QFont &font);
+ QFont font() const;
+
+ void setCheckable(bool);
+ bool isCheckable() const;
+
+ QVariant data() const;
+ void setData(const QVariant &var);
+
+ bool isChecked() const;
+
+ bool isEnabled() const;
+
+ bool isVisible() const;
+
+ enum ActionEvent { Trigger, Hover };
+ void activate(ActionEvent event);
+
+ void setMenuRole(MenuRole menuRole);
+ MenuRole menuRole() const;
+
+#if QT_DEPRECATED_SINCE(6,0)
+#ifdef Q_CLANG_QDOC
+ QMenu *menu() const;
+ void setMenu(QMenu *menu);
+#else
+ template<typename T = QMenu*>
+ T menu() const
+ {
+ return qobject_cast<T>(menuObject());
+ }
+ template<typename T = QMenu*>
+ void setMenu(T m)
+ {
+ setMenuObject(m);
+ }
+#endif
+#endif
+
+ void setIconVisibleInMenu(bool visible);
+ bool isIconVisibleInMenu() const;
+
+ void setShortcutVisibleInContextMenu(bool show);
+ bool isShortcutVisibleInContextMenu() const;
+
+ bool showStatusText(QObject *object = nullptr);
+
+protected:
+ bool event(QEvent *) override;
+ QAction(QActionPrivate &dd, QObject *parent);
+
+public Q_SLOTS:
+ void trigger() { activate(Trigger); }
+ void hover() { activate(Hover); }
+ void setChecked(bool);
+ void toggle();
+ void setEnabled(bool);
+ void resetEnabled();
+ inline void setDisabled(bool b) { setEnabled(!b); }
+ void setVisible(bool);
+
+Q_SIGNALS:
+ void changed();
+ void enabledChanged(bool enabled);
+ void checkableChanged(bool checkable);
+ void triggered(bool checked = false);
+ void hovered();
+ void toggled(bool);
+
+private:
+ Q_DISABLE_COPY(QAction)
+ friend class QActionGroup;
+ friend class QWidget;
+ friend class QMenu;
+ friend class QMenuPrivate;
+ friend class QToolButton;
+ friend class QGraphicsWidget;
+
+ QObject *menuObject() const;
+ void setMenuObject(QObject *object);
+};
+
+#ifndef QT_NO_DEBUG_STREAM
+Q_GUI_EXPORT QDebug operator<<(QDebug, const QAction *);
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QACTION_H
diff --git a/src/gui/kernel/qaction_p.h b/src/gui/kernel/qaction_p.h
new file mode 100644
index 0000000000..111cb2958b
--- /dev/null
+++ b/src/gui/kernel/qaction_p.h
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QACTION_P_H
+#define QACTION_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/private/qtguiglobal_p.h>
+#include <QtGui/qaction.h>
+#include <QtGui/qfont.h>
+#if QT_CONFIG(shortcut)
+# include <QtGui/private/qshortcutmap_p.h>
+#endif
+#include "private/qobject_p.h"
+
+QT_REQUIRE_CONFIG(action);
+
+QT_BEGIN_NAMESPACE
+
+class QShortcutMap;
+
+class Q_GUI_EXPORT QActionPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QAction)
+public:
+ QActionPrivate();
+ ~QActionPrivate();
+
+ virtual void destroy();
+
+#if QT_CONFIG(shortcut)
+ virtual QShortcutMap::ContextMatcher contextMatcher() const;
+#endif
+
+ static QActionPrivate *get(QAction *q)
+ {
+ return q->d_func();
+ }
+
+ bool setEnabled(bool enable, bool byGroup);
+
+ QPointer<QActionGroup> group;
+ QString text;
+ QString iconText;
+ QIcon icon;
+ QString tooltip;
+ QString statustip;
+ QString whatsthis;
+#if QT_CONFIG(shortcut)
+ QKeySequence shortcut;
+ QList<QKeySequence> alternateShortcuts;
+#endif
+ QVariant userData;
+
+ QObjectList associatedObjects;
+ virtual QObject *menu() const;
+ virtual void setMenu(QObject *menu);
+
+#if QT_CONFIG(shortcut)
+ int shortcutId = 0;
+ QVector<int> alternateShortcutIds;
+ Qt::ShortcutContext shortcutContext = Qt::WindowShortcut;
+ uint autorepeat : 1;
+#endif
+ QFont font;
+ uint enabled : 1, explicitEnabled : 1, explicitEnabledValue : 1;
+ uint visible : 1, forceInvisible : 1;
+ uint checkable : 1;
+ uint checked : 1;
+ uint separator : 1;
+ uint fontSet : 1;
+
+ int iconVisibleInMenu : 2; // Only has values -1, 0, and 1
+ int shortcutVisibleInContextMenu : 2; // Only has values -1, 0, and 1
+
+ QAction::MenuRole menuRole = QAction::TextHeuristicRole;
+ QAction::Priority priority = QAction::NormalPriority;
+
+#if QT_CONFIG(shortcut)
+ void redoGrab(QShortcutMap &map);
+ void redoGrabAlternate(QShortcutMap &map);
+ void setShortcutEnabled(bool enable, QShortcutMap &map);
+#endif // QT_NO_SHORTCUT
+
+ bool showStatusText(QObject *widget, const QString &str);
+ void sendDataChanged();
+};
+
+QT_END_NAMESPACE
+
+#endif // QACTION_P_H
diff --git a/src/gui/kernel/qactiongroup.cpp b/src/gui/kernel/qactiongroup.cpp
new file mode 100644
index 0000000000..6e2efdb74b
--- /dev/null
+++ b/src/gui/kernel/qactiongroup.cpp
@@ -0,0 +1,366 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qactiongroup.h"
+
+#include "qaction.h"
+#include "qaction_p.h"
+#include "qactiongroup_p.h"
+#include "qevent.h"
+#include "qlist.h"
+
+QT_BEGIN_NAMESPACE
+
+QActionGroupPrivate::QActionGroupPrivate() :
+ enabled(1), visible(1)
+{
+}
+
+QActionGroupPrivate::~QActionGroupPrivate() = default;
+
+void QActionGroup::_q_actionChanged()
+{
+ Q_D(QActionGroup);
+ auto action = qobject_cast<QAction*>(sender());
+ Q_ASSERT_X(action != nullptr, "QActionGroup::_q_actionChanged", "internal error");
+ if (d->exclusionPolicy != QActionGroup::ExclusionPolicy::None) {
+ if (action->isChecked()) {
+ if (action != d->current) {
+ if (!d->current.isNull())
+ d->current->setChecked(false);
+ d->current = action;
+ }
+ } else if (action == d->current) {
+ d->current = nullptr;
+ }
+ }
+}
+
+void QActionGroup::_q_actionTriggered()
+{
+ auto action = qobject_cast<QAction*>(sender());
+ Q_ASSERT_X(action != nullptr, "QActionGroup::_q_actionTriggered", "internal error");
+ emit triggered(action);
+}
+
+void QActionGroup::_q_actionHovered()
+{
+ auto action = qobject_cast<QAction*>(sender());
+ Q_ASSERT_X(action != nullptr, "QActionGroup::_q_actionHovered", "internal error");
+ emit hovered(action);
+}
+
+/*!
+ \class QActionGroup
+ \brief The QActionGroup class groups actions together.
+ \since 6.0
+
+ \inmodule QtGui
+
+ QActionGroup is a base class for classes grouping
+ classes inhheriting QAction objects together.
+
+ In some situations it is useful to group QAction objects together.
+ For example, if you have a \uicontrol{Left Align} action, a \uicontrol{Right
+ Align} action, a \uicontrol{Justify} action, and a \uicontrol{Center} action,
+ only one of these actions should be active at any one time. One
+ simple way of achieving this is to group the actions together in
+ an action group, inheriting QActionGroup.
+
+ \sa QAction
+*/
+
+/*!
+ \enum QActionGroup::ExclusionPolicy
+
+ This enum specifies the different policies that can be used to
+ control how the group performs exclusive checking on checkable actions.
+
+ \value None
+ The actions in the group can be checked independently of each other.
+
+ \value Exclusive
+ Exactly one action can be checked at any one time.
+ This is the default policy.
+
+ \value ExclusiveOptional
+ At most one action can be checked at any one time. The actions
+ can also be all unchecked.
+
+ \sa exclusionPolicy
+*/
+
+/*!
+ Constructs an action group for the \a parent object.
+
+ The action group is exclusive by default. Call setExclusive(false)
+ to make the action group non-exclusive. To make the group exclusive
+ but allow unchecking the active action call instead
+ setExclusionPolicy(QActionGroup::ExclusionPolicy::ExclusiveOptional)
+*/
+QActionGroup::QActionGroup(QObject* parent) :
+ QActionGroup(*new QActionGroupPrivate, parent)
+{
+}
+
+QActionGroup::QActionGroup(QActionGroupPrivate &dd, QObject *parent) :
+ QObject(dd, parent)
+{
+}
+
+/*!
+ Destroys the action group.
+*/
+QActionGroup::~QActionGroup() = default;
+
+/*!
+ \fn QAction *QActionGroup::addAction(QAction *action)
+
+ Adds the \a action to this group, and returns it.
+
+ Normally an action is added to a group by creating it with the
+ group as its parent, so this function is not usually used.
+
+ \sa QAction::setActionGroup()
+*/
+QAction *QActionGroup::addAction(QAction* a)
+{
+ Q_D(QActionGroup);
+ if (!d->actions.contains(a)) {
+ d->actions.append(a);
+ QObject::connect(a, &QAction::triggered, this, &QActionGroup::_q_actionTriggered);
+ QObject::connect(a, &QAction::changed, this, &QActionGroup::_q_actionChanged);
+ QObject::connect(a, &QAction::hovered, this, &QActionGroup::_q_actionHovered);
+ }
+ a->d_func()->setEnabled(d->enabled, true);
+ if (!a->d_func()->forceInvisible) {
+ a->setVisible(d->visible);
+ a->d_func()->forceInvisible = false;
+ }
+ if (a->isChecked())
+ d->current = a;
+ QActionGroup *oldGroup = a->d_func()->group;
+ if (oldGroup != this) {
+ if (oldGroup)
+ oldGroup->removeAction(a);
+ a->d_func()->group = this;
+ a->d_func()->sendDataChanged();
+ }
+ return a;
+}
+
+/*!
+ Creates and returns an action with \a text. The newly created
+ action is a child of this action group.
+
+ Normally an action is added to a group by creating it with the
+ group as parent, so this function is not usually used.
+
+ \sa QAction::setActionGroup()
+*/
+QAction *QActionGroup::addAction(const QString &text)
+{
+ return new QAction(text, this);
+}
+
+/*!
+ Creates and returns an action with \a text and an \a icon. The
+ newly created action is a child of this action group.
+
+ Normally an action is added to a group by creating it with the
+ group as its parent, so this function is not usually used.
+
+ \sa QAction::setActionGroup()
+*/
+QAction *QActionGroup::addAction(const QIcon &icon, const QString &text)
+{
+ return new QAction(icon, text, this);
+}
+
+/*!
+ Removes the \a action from this group. The action will have no
+ parent as a result.
+
+ \sa QAction::setActionGroup()
+*/
+void QActionGroup::removeAction(QAction *action)
+{
+ Q_D(QActionGroup);
+ if (d->actions.removeAll(action)) {
+ if (action == d->current)
+ d->current = nullptr;
+ QObject::disconnect(action, &QAction::triggered, this, &QActionGroup::_q_actionTriggered);
+ QObject::disconnect(action, &QAction::changed, this, &QActionGroup::_q_actionChanged);
+ QObject::disconnect(action, &QAction::hovered, this, &QActionGroup::_q_actionHovered);
+ action->d_func()->group = nullptr;
+ }
+}
+
+/*!
+ Returns the list of this groups's actions. This may be empty.
+*/
+QList<QAction*> QActionGroup::actions() const
+{
+ Q_D(const QActionGroup);
+ return d->actions;
+}
+
+/*!
+ \brief Enable or disable the group exclusion checking
+
+ This is a convenience method that calls
+ setExclusionPolicy(ExclusionPolicy::Exclusive) when \a b is true,
+ else setExclusionPolicy(QActionGroup::ExclusionPolicy::None).
+
+ \sa QActionGroup::exclusionPolicy
+*/
+void QActionGroup::setExclusive(bool b)
+{
+ setExclusionPolicy(b ? QActionGroup::ExclusionPolicy::Exclusive
+ : QActionGroup::ExclusionPolicy::None);
+}
+
+/*!
+ \brief Returns true if the group is exclusive
+
+ The group is exclusive if the ExclusionPolicy is either Exclusive
+ or ExclusionOptional.
+
+*/
+bool QActionGroup::isExclusive() const
+{
+ return exclusionPolicy() != QActionGroup::ExclusionPolicy::None;
+}
+
+/*!
+ \property QActionGroup::exclusionPolicy
+ \brief This property holds the group exclusive checking policy
+
+ If exclusionPolicy is set to Exclusive, only one checkable
+ action in the action group can ever be active at any time. If the user
+ chooses another checkable action in the group, the one they chose becomes
+ active and the one that was active becomes inactive. If exclusionPolicy is
+ set to ExclusionOptional the group is exclusive but the active checkable
+ action in the group can be unchecked leaving the group with no actions
+ checked.
+
+ \sa QAction::checkable
+*/
+void QActionGroup::setExclusionPolicy(QActionGroup::ExclusionPolicy policy)
+{
+ Q_D(QActionGroup);
+ d->exclusionPolicy = policy;
+}
+
+QActionGroup::ExclusionPolicy QActionGroup::exclusionPolicy() const
+{
+ Q_D(const QActionGroup);
+ return d->exclusionPolicy;
+}
+
+/*!
+ \fn void QActionGroup::setDisabled(bool b)
+
+ This is a convenience function for the \l enabled property, that
+ is useful for signals--slots connections. If \a b is true the
+ action group is disabled; otherwise it is enabled.
+*/
+
+/*!
+ \property QActionGroup::enabled
+ \brief whether the action group is enabled
+
+ Each action in the group will be enabled or disabled unless it
+ has been explicitly disabled.
+
+ \sa QAction::setEnabled()
+*/
+void QActionGroup::setEnabled(bool b)
+{
+ Q_D(QActionGroup);
+ d->enabled = b;
+ for (auto action : qAsConst(d->actions)) {
+ action->d_func()->setEnabled(b, true);
+ }
+}
+
+bool QActionGroup::isEnabled() const
+{
+ Q_D(const QActionGroup);
+ return d->enabled;
+}
+
+/*!
+ Returns the currently checked action in the group, or \nullptr if
+ none are checked.
+*/
+QAction *QActionGroup::checkedAction() const
+{
+ Q_D(const QActionGroup);
+ return d->current.data();
+}
+
+/*!
+ \property QActionGroup::visible
+ \brief whether the action group is visible
+
+ Each action in the action group will match the visible state of
+ this group unless it has been explicitly hidden.
+
+ \sa QAction::setEnabled()
+*/
+void QActionGroup::setVisible(bool b)
+{
+ Q_D(QActionGroup);
+ d->visible = b;
+ for (auto action : qAsConst(d->actions)) {
+ if (!action->d_func()->forceInvisible) {
+ action->setVisible(b);
+ action->d_func()->forceInvisible = false;
+ }
+ }
+}
+
+bool QActionGroup::isVisible() const
+{
+ Q_D(const QActionGroup);
+ return d->visible;
+}
+
+QT_END_NAMESPACE
diff --git a/src/gui/kernel/qactiongroup.h b/src/gui/kernel/qactiongroup.h
new file mode 100644
index 0000000000..c485654d08
--- /dev/null
+++ b/src/gui/kernel/qactiongroup.h
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGUIACTIONGROUP_H
+#define QGUIACTIONGROUP_H
+
+#include <QtGui/qtguiglobal.h>
+#include <QtGui/qaction.h>
+
+QT_REQUIRE_CONFIG(action);
+
+QT_BEGIN_NAMESPACE
+
+class QActionGroupPrivate;
+
+class Q_GUI_EXPORT QActionGroup : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QActionGroup)
+
+ Q_PROPERTY(QActionGroup::ExclusionPolicy exclusionPolicy READ exclusionPolicy WRITE setExclusionPolicy)
+ Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
+ Q_PROPERTY(bool visible READ isVisible WRITE setVisible)
+
+public:
+ enum class ExclusionPolicy {
+ None,
+ Exclusive,
+ ExclusiveOptional
+ };
+ Q_ENUM(ExclusionPolicy)
+
+ explicit QActionGroup(QObject *parent);
+ ~QActionGroup();
+
+ QAction *addAction(QAction *a);
+ QAction *addAction(const QString &text);
+ QAction *addAction(const QIcon &icon, const QString &text);
+ void removeAction(QAction *a);
+ QList<QAction*> actions() const;
+ QAction *checkedAction() const;
+
+ bool isExclusive() const;
+ bool isEnabled() const;
+ bool isVisible() const;
+ ExclusionPolicy exclusionPolicy() const;
+
+
+public Q_SLOTS:
+ void setEnabled(bool);
+ inline void setDisabled(bool b) { setEnabled(!b); }
+ void setVisible(bool);
+ void setExclusive(bool);
+ void setExclusionPolicy(ExclusionPolicy policy);
+
+Q_SIGNALS:
+ void triggered(QAction *);
+ void hovered(QAction *);
+
+private Q_SLOTS:
+ void _q_actionTriggered();
+ void _q_actionHovered();
+ void _q_actionChanged();
+
+protected:
+ QActionGroup(QActionGroupPrivate &dd, QObject *parent);
+
+private:
+ Q_DISABLE_COPY(QActionGroup)
+};
+
+QT_END_NAMESPACE
+
+#endif // QGUIACTIONGROUP_H
diff --git a/src/gui/kernel/qactiongroup_p.h b/src/gui/kernel/qactiongroup_p.h
new file mode 100644
index 0000000000..4b503783ed
--- /dev/null
+++ b/src/gui/kernel/qactiongroup_p.h
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGUIACTIONGROUP_P_H
+#define QGUIACTIONGROUP_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/private/qtguiglobal_p.h>
+#include <QtGui/qactiongroup.h>
+#include <QtGui/qfont.h>
+#if QT_CONFIG(shortcut)
+# include <QtGui/private/qshortcutmap_p.h>
+#endif
+#include "private/qobject_p.h"
+
+QT_REQUIRE_CONFIG(action);
+
+QT_BEGIN_NAMESPACE
+
+class Q_GUI_EXPORT QActionGroupPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QActionGroup)
+public:
+ enum Signal { Triggered, Hovered };
+
+ QActionGroupPrivate();
+ ~QActionGroupPrivate();
+
+ virtual void emitSignal(Signal, QAction *) {}
+
+ QList<QAction *> actions;
+ QPointer<QAction> current;
+ uint enabled : 1;
+ uint visible : 1;
+ QActionGroup::ExclusionPolicy exclusionPolicy = QActionGroup::ExclusionPolicy::Exclusive;
+
+private:
+ void _q_actionTriggered(); //private slot
+ void _q_actionChanged(); //private slot
+ void _q_actionHovered(); //private slot
+};
+
+QT_END_NAMESPACE
+
+#endif // QACTIONGROUP_P_H
diff --git a/src/gui/kernel/qclipboard.cpp b/src/gui/kernel/qclipboard.cpp
index db22ef2486..72f27d3e49 100644
--- a/src/gui/kernel/qclipboard.cpp
+++ b/src/gui/kernel/qclipboard.cpp
@@ -47,7 +47,7 @@
#include "qbuffer.h"
#include "qimage.h"
#if QT_CONFIG(textcodec)
-#include "qtextcodec.h"
+#include "private/qutfcodec_p.h"
#endif
#include "private/qguiapplication_p.h"
@@ -301,14 +301,9 @@ QString QClipboard::text(QString &subtype, Mode mode) const
const QByteArray rawData = data->data(QLatin1String("text/") + subtype);
#if QT_CONFIG(textcodec)
- QTextCodec* codec = QTextCodec::codecForMib(106); // utf-8 is default
- if (subtype == QLatin1String("html"))
- codec = QTextCodec::codecForHtml(rawData, codec);
- else
- codec = QTextCodec::codecForUtfText(rawData, codec);
- return codec->toUnicode(rawData);
+ return qFromUtfEncoded(rawData);
#else // textcodec
- return rawData;
+ return QString::fromUtf8(rawData);
#endif // textcodec
}
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index 466e70db30..834f969680 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -1235,7 +1235,7 @@ Qt::KeyboardModifiers QKeyEvent::modifiers() const
return QInputEvent::modifiers();
}
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
/*!
\fn bool QKeyEvent::matches(QKeySequence::StandardKey key) const
\since 4.2
@@ -1251,7 +1251,7 @@ bool QKeyEvent::matches(QKeySequence::StandardKey matchKey) const
const QList<QKeySequence> bindings = QKeySequence::keyBindings(matchKey);
return bindings.contains(QKeySequence(searchkey));
}
-#endif // QT_NO_SHORTCUT
+#endif // QT_CONFIG(shortcut)
/*!
@@ -2063,7 +2063,6 @@ QInputMethodEvent::QInputMethodEvent(const QInputMethodEvent &other)
QInputMethodEvent::~QInputMethodEvent()
{
- // must be empty until ### Qt 6
}
/*!
@@ -2292,7 +2291,6 @@ QVariant QInputMethodQueryEvent::value(Qt::InputMethodQuery query) const
\value FourDMouse A 4D Mouse.
\value RotationStylus A special stylus that also knows about rotation
(a 6D stylus). \since 4.1
- \omitvalue XFreeEraser
*/
/*!
@@ -2369,52 +2367,6 @@ QTabletEvent::QTabletEvent(Type type, const QPointF &pos, const QPointF &globalP
{
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- Construct a tablet event of the given \a type.
-
- The \a pos parameter indicates where the event occurred in the
- widget; \a globalPos is the corresponding position in absolute
- coordinates.
-
- \a pressure contains the pressure exerted on the \a device.
-
- \a pointerType describes the type of pen that is being used.
-
- \a xTilt and \a yTilt contain the device's degree of tilt from the
- x and y axes respectively.
-
- \a keyState specifies which keyboard modifiers are pressed (e.g.,
- \uicontrol{Ctrl}).
-
- The \a uniqueID parameter contains the unique ID for the current device.
-
- The \a z parameter contains the coordinate of the device on the tablet, this
- is usually given by a wheel on 4D mouse. If the device does not support a
- Z-axis, pass zero here.
-
- The \a tangentialPressure parameter contins the tangential pressure of an air
- brush. If the device does not support tangential pressure, pass 0 here.
-
- \a rotation contains the device's rotation in degrees. 4D mice support
- rotation. If the device does not support rotation, pass 0 here.
-
- \sa pos(), globalPos(), device(), pressure(), xTilt(), yTilt(), uniqueId(), rotation(),
- tangentialPressure(), z()
-
- \deprecated in 5.4: use the constructor with MouseButton status
-*/
-
-QTabletEvent::QTabletEvent(Type type, const QPointF &pos, const QPointF &globalPos,
- int device, int pointerType,
- qreal pressure, int xTilt, int yTilt, qreal tangentialPressure,
- qreal rotation, int z, Qt::KeyboardModifiers keyState, qint64 uniqueID)
- : QTabletEvent(type, pos, globalPos, device, pointerType, pressure, xTilt, yTilt,
- tangentialPressure, rotation, z, keyState, uniqueID, Qt::NoButton, Qt::NoButton)
-{
-}
-#endif
-
/*!
\internal
*/
@@ -2452,12 +2404,6 @@ Qt::MouseButtons QTabletEvent::buttons() const
}
/*!
- \fn TabletDevices QTabletEvent::device() const
-
- \deprecated Use deviceType().
-*/
-
-/*!
\fn TabletDevices QTabletEvent::deviceType() const
Returns the type of device that generated the event.
@@ -2585,7 +2531,7 @@ Qt::MouseButtons QTabletEvent::buttons() const
Returns the global x position of the mouse pointer at the time of
the event.
- \sa globalY(), globalPos(), hiResGlobalX()
+ \sa globalY(), globalPos()
*/
/*!
@@ -2594,7 +2540,7 @@ Qt::MouseButtons QTabletEvent::buttons() const
Returns the global y position of the tablet device at the time of
the event.
- \sa globalX(), globalPos(), hiResGlobalY()
+ \sa globalX(), globalPos()
*/
/*!
@@ -2621,22 +2567,6 @@ Qt::MouseButtons QTabletEvent::buttons() const
*/
/*!
- \fn qreal &QTabletEvent::hiResGlobalX() const
-
- The high precision x position of the tablet device.
-
- \obsolete use globalPosF()
-*/
-
-/*!
- \fn qreal &QTabletEvent::hiResGlobalY() const
-
- The high precision y position of the tablet device.
-
- \obsolete use globalPosF()
-*/
-
-/*!
\fn const QPointF &QTabletEvent::posF() const
Returns the position of the device, relative to the widget that
@@ -2718,10 +2648,6 @@ QNativeGestureEvent::QNativeGestureEvent(Qt::NativeGestureType type, const QPoin
{ }
#endif
-typedef QHash<const QNativeGestureEvent*, const QTouchDevice*> NativeGestureEventDataHash;
-// ### Qt6: move this to a member in QNativeGestureEvent
-Q_GLOBAL_STATIC(NativeGestureEventDataHash, g_nativeGestureEventDataHash)
-
/*!
Constructs a native gesture event of type \a type originating from \a device.
@@ -2736,27 +2662,20 @@ QNativeGestureEvent::QNativeGestureEvent(Qt::NativeGestureType type, const QTouc
const QPointF &screenPos, qreal realValue, ulong sequenceId, quint64 intValue)
: QInputEvent(QEvent::NativeGesture), mGestureType(type),
mLocalPos(localPos), mWindowPos(windowPos), mScreenPos(screenPos), mRealValue(realValue),
- mSequenceId(sequenceId), mIntValue(intValue)
+ mSequenceId(sequenceId), mIntValue(intValue), mDevice(device)
{
- g_nativeGestureEventDataHash->insert(this, device);
}
QNativeGestureEvent::~QNativeGestureEvent()
-{
- g_nativeGestureEventDataHash->remove(this);
-}
+ = default;
/*!
+ \fn const QTouchDevice *QNativeGestureEvent::device() const
\since 5.10
Returns the device.
*/
-const QTouchDevice *QNativeGestureEvent::device() const
-{
- return g_nativeGestureEventDataHash->value(this);
-}
-
/*!
\fn QNativeGestureEvent::gestureType() const
\since 5.2
@@ -3363,8 +3282,8 @@ QWhatsThisClickedEvent::~QWhatsThisClickedEvent()
\ingroup events
\inmodule QtGui
- Actions can be added to widgets using QWidget::addAction(). This
- generates an \l ActionAdded event, which you can handle to provide
+ Actions can be added to controls, for example by using QWidget::addAction().
+ This generates an \l ActionAdded event, which you can handle to provide
custom behavior. For example, QToolBar reimplements
QWidget::actionEvent() to create \l{QToolButton}s for the
actions.
@@ -3615,7 +3534,7 @@ QToolBarChangeEvent::~QToolBarChangeEvent()
#endif // QT_NO_TOOLBAR
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
/*!
Constructs a shortcut event for the given \a key press,
@@ -3636,7 +3555,7 @@ QShortcutEvent::~QShortcutEvent()
{
}
-#endif // QT_NO_SHORTCUT
+#endif // QT_CONFIG(shortcut)
#ifndef QT_NO_DEBUG_STREAM
@@ -3990,7 +3909,7 @@ QT_WARNING_POP
dbg << ')';
}
break;
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
case QEvent::Shortcut: {
const QShortcutEvent *se = static_cast<const QShortcutEvent *>(e);
dbg << "QShortcutEvent(" << se->key().toString() << ", id=" << se->shortcutId();
@@ -5014,9 +4933,8 @@ void QTouchEvent::TouchPoint::setFlags(InfoFlags flags)
The \a startPos is the position of a touch or mouse event that started the scrolling.
*/
QScrollPrepareEvent::QScrollPrepareEvent(const QPointF &startPos)
- : QEvent(QEvent::ScrollPrepare), m_target(nullptr), m_startPos(startPos)
+ : QEvent(QEvent::ScrollPrepare), m_startPos(startPos)
{
- Q_UNUSED(m_target);
}
/*!
@@ -5313,7 +5231,7 @@ bool operator==(QPointingDeviceUniqueId lhs, QPointingDeviceUniqueId rhs) noexce
Returns the hash value for \a key, using \a seed to seed the calculation.
*/
-uint qHash(QPointingDeviceUniqueId key, uint seed) noexcept
+size_t qHash(QPointingDeviceUniqueId key, size_t seed) noexcept
{
return qHash(key.numericId(), seed);
}
diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h
index 4aba9ff729..fb1df36848 100644
--- a/src/gui/kernel/qevent.h
+++ b/src/gui/kernel/qevent.h
@@ -41,29 +41,31 @@
#define QEVENT_H
#include <QtGui/qtguiglobal.h>
-#include <QtGui/qwindowdefs.h>
-#include <QtGui/qregion.h>
+
+#include <QtCore/qcoreevent.h>
+#include <QtCore/qiodevice.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qstring.h>
-#include <QtGui/qkeysequence.h>
-#include <QtCore/qcoreevent.h>
#include <QtCore/qvariant.h>
-#include <QtCore/qmap.h> // ### Qt 6: Remove
#include <QtCore/qvector.h>
-#include <QtCore/qset.h> // ### Qt 6: Remove
#include <QtCore/qurl.h>
-#include <QtCore/qfile.h> // ### Qt 6: Replace by <QtCore/qiodevice.h> and forward declare QFile
+#include <QtGui/qregion.h>
#include <QtGui/qvector2d.h>
-#include <QtGui/qtouchdevice.h> // ### Qt 6: Replace by forward declaration
+#include <QtGui/qwindowdefs.h>
-QT_BEGIN_NAMESPACE
+#if QT_CONFIG(shortcut)
+# include <QtGui/qkeysequence.h>
+#endif
+QT_BEGIN_NAMESPACE
+class QFile;
class QAction;
-#ifndef QT_NO_GESTURES
+class QScreen;
+class QTouchDevice;
+#if QT_CONFIG(gestures)
class QGesture;
#endif
-class QScreen;
class Q_GUI_EXPORT QInputEvent : public QEvent
{
@@ -134,10 +136,6 @@ public:
inline void setLocalPos(const QPointF &localPosition) { l = localPosition; }
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED inline QPointF posF() const { return l; }
-#endif
-
Qt::MouseEventSource source() const;
Qt::MouseEventFlags flags() const;
@@ -273,20 +271,11 @@ class Q_GUI_EXPORT QTabletEvent : public QInputEvent
{
Q_GADGET
public:
- enum TabletDevice { NoDevice, Puck, Stylus, Airbrush, FourDMouse,
- XFreeEraser /*internal*/, RotationStylus };
+ enum TabletDevice { NoDevice, Puck, Stylus, Airbrush, FourDMouse, RotationStylus };
Q_ENUM(TabletDevice)
enum PointerType { UnknownPointer, Pen, Cursor, Eraser };
Q_ENUM(PointerType)
-#if QT_DEPRECATED_SINCE(5, 15)
- // Actually deprecated since 5.4, in docs
- QT_DEPRECATED_VERSION_X_5_15("Use the other QTabletEvent constructor")
- QTabletEvent(Type t, const QPointF &pos, const QPointF &globalPos,
- int device, int pointerType, qreal pressure, int xTilt, int yTilt,
- qreal tangentialPressure, qreal rotation, int z,
- Qt::KeyboardModifiers keyState, qint64 uniqueID); // ### remove in Qt 6
-#endif
QTabletEvent(Type t, const QPointF &pos, const QPointF &globalPos,
int device, int pointerType, qreal pressure, int xTilt, int yTilt,
qreal tangentialPressure, qreal rotation, int z,
@@ -296,9 +285,6 @@ public:
inline QPoint pos() const { return mPos.toPoint(); }
inline QPoint globalPos() const { return mGPos.toPoint(); }
-#if QT_DEPRECATED_SINCE(5,0)
- QT_DEPRECATED inline const QPointF &hiResGlobalPos() const { return mPos; }
-#endif
inline const QPointF &posF() const { return mPos; }
inline const QPointF &globalPosF() const { return mGPos; }
@@ -307,14 +293,6 @@ public:
inline int y() const { return qRound(mPos.y()); }
inline int globalX() const { return qRound(mGPos.x()); }
inline int globalY() const { return qRound(mGPos.y()); }
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_VERSION_X_5_15("use globalPosF().x()")
- inline qreal hiResGlobalX() const { return mGPos.x(); }
- QT_DEPRECATED_VERSION_X_5_15("use globalPosF().y()")
- inline qreal hiResGlobalY() const { return mGPos.y(); }
- QT_DEPRECATED_VERSION_X_5_15("Use deviceType()")
- inline TabletDevice device() const { return TabletDevice(mDev); }
-#endif
inline TabletDevice deviceType() const { return TabletDevice(mDev); }
inline PointerType pointerType() const { return PointerType(mPointerType); }
inline qint64 uniqueId() const { return mUnique; }
@@ -339,7 +317,7 @@ protected:
};
#endif // QT_CONFIG(tabletevent)
-#ifndef QT_NO_GESTURES
+#if QT_CONFIG(gestures)
class Q_GUI_EXPORT QNativeGestureEvent : public QInputEvent
{
public:
@@ -361,7 +339,7 @@ public:
const QPointF &windowPos() const { return mWindowPos; }
const QPointF &screenPos() const { return mScreenPos; }
- const QTouchDevice *device() const;
+ const QTouchDevice *device() const { return mDevice; }
protected:
Qt::NativeGestureType mGestureType;
@@ -371,8 +349,9 @@ protected:
qreal mRealValue;
ulong mSequenceId;
quint64 mIntValue;
+ const QTouchDevice *mDevice;
};
-#endif // QT_NO_GESTURES
+#endif // QT_CONFIG(gestures)
class Q_GUI_EXPORT QKeyEvent : public QInputEvent
{
@@ -385,7 +364,7 @@ public:
~QKeyEvent();
int key() const { return k; }
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
bool matches(QKeySequence::StandardKey key) const;
#endif
Qt::KeyboardModifiers modifiers() const;
@@ -397,22 +376,6 @@ public:
inline quint32 nativeVirtualKey() const { return nVirtualKey; }
inline quint32 nativeModifiers() const { return nModifiers; }
- // Functions for the extended key event information
-#if QT_DEPRECATED_SINCE(5, 0)
- static inline QKeyEvent *createExtendedKeyEvent(Type type, int key, Qt::KeyboardModifiers modifiers,
- quint32 nativeScanCode, quint32 nativeVirtualKey,
- quint32 nativeModifiers,
- const QString& text = QString(), bool autorep = false,
- ushort count = 1)
- {
- return new QKeyEvent(type, key, modifiers,
- nativeScanCode, nativeVirtualKey, nativeModifiers,
- text, autorep, count);
- }
-
- inline bool hasExtendedInfo() const { return true; }
-#endif
-
protected:
QString txt;
int k;
@@ -761,7 +724,7 @@ private:
};
#endif
-#ifndef QT_NO_ACTION
+#if QT_CONFIG(action)
class Q_GUI_EXPORT QActionEvent : public QEvent
{
QAction *act, *bef;
@@ -772,7 +735,7 @@ public:
inline QAction *action() const { return act; }
inline QAction *before() const { return bef; }
};
-#endif
+#endif // QT_CONFIG(action)
class Q_GUI_EXPORT QFileOpenEvent : public QEvent
{
@@ -802,7 +765,7 @@ private:
};
#endif
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
class Q_GUI_EXPORT QShortcutEvent : public QEvent
{
public:
@@ -837,10 +800,10 @@ private:
Q_GUI_EXPORT QDebug operator<<(QDebug, const QEvent *);
#endif
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
inline bool operator==(QKeyEvent *e, QKeySequence::StandardKey key){return (e ? e->matches(key) : false);}
inline bool operator==(QKeySequence::StandardKey key, QKeyEvent *e){return (e ? e->matches(key) : false);}
-#endif // QT_NO_SHORTCUT
+#endif // QT_CONFIG(shortcut)
class Q_GUI_EXPORT QPointingDeviceUniqueId
{
@@ -865,18 +828,10 @@ private:
};
Q_DECLARE_TYPEINFO(QPointingDeviceUniqueId, Q_MOVABLE_TYPE);
-#if 0
-#pragma qt_sync_suspend_processing
-#endif
-template <> class QList<QPointingDeviceUniqueId> {}; // to prevent instantiation: use QVector instead
-#if 0
-#pragma qt_sync_resume_processing
-#endif
-
Q_GUI_EXPORT bool operator==(QPointingDeviceUniqueId lhs, QPointingDeviceUniqueId rhs) noexcept;
inline bool operator!=(QPointingDeviceUniqueId lhs, QPointingDeviceUniqueId rhs) noexcept
{ return !operator==(lhs, rhs); }
-Q_GUI_EXPORT uint qHash(QPointingDeviceUniqueId key, uint seed = 0) noexcept;
+Q_GUI_EXPORT size_t qHash(QPointingDeviceUniqueId key, size_t seed = 0) noexcept;
@@ -991,13 +946,6 @@ public:
friend class QQuickMultiPointTouchArea;
};
-#if QT_DEPRECATED_SINCE(5, 0)
- enum DeviceType {
- TouchScreen,
- TouchPad
- };
-#endif
-
explicit QTouchEvent(QEvent::Type eventType,
QTouchDevice *device = nullptr,
Qt::KeyboardModifiers modifiers = Qt::NoModifier,
@@ -1007,9 +955,6 @@ public:
inline QWindow *window() const { return _window; }
inline QObject *target() const { return _target; }
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED inline QTouchEvent::DeviceType deviceType() const { return static_cast<DeviceType>(int(_device->type())); }
-#endif
inline Qt::TouchPointStates touchPointStates() const { return _touchPointStates; }
inline const QList<QTouchEvent::TouchPoint> &touchPoints() const { return _touchPoints; }
inline QTouchDevice *device() const { return _device; }
@@ -1060,7 +1005,6 @@ public:
void setContentPos(const QPointF &pos);
private:
- QObject* m_target; // Qt 6 remove.
QPointF m_startPos;
QSizeF m_viewportSize;
QRectF m_contentPosRange;
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index 13369dc8f6..1d71c6d075 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -614,6 +614,13 @@ static QWindowGeometrySpecification windowGeometrySpecification = Q_WINDOW_GEOME
\li \c {dpiawareness=[0|1|2]} Sets the DPI awareness of the process
(see \l{High DPI Displays}, since Qt 5.4).
\li \c {fontengine=freetype}, uses the FreeType font engine.
+ \li \c {fontengine=directwrite}, uses the experimental DirectWrite
+ font database and defaults to using the DirectWrite font
+ engine (which is otherwise only used for some font types
+ or font properties.) This affects font selection and aims
+ to provide font naming more consistent with other platforms,
+ but does not support all font formats, such as Postscript
+ Type-1 or Microsoft FNT fonts.
\li \c {menus=[native|none]}, controls the use of native menus.
Native menus are implemented using Win32 API and are simpler than
@@ -1208,14 +1215,18 @@ Q_LOGGING_CATEGORY(lcQpaPluginLoading, "qt.qpa.plugin");
static void init_platform(const QString &pluginNamesWithArguments, const QString &platformPluginPath, const QString &platformThemeName, int &argc, char **argv)
{
- QStringList plugins = pluginNamesWithArguments.split(QLatin1Char(';'));
+ QStringList plugins = pluginNamesWithArguments.split(QLatin1Char(';'), Qt::SkipEmptyParts);
QStringList platformArguments;
QStringList availablePlugins = QPlatformIntegrationFactory::keys(platformPluginPath);
for (const auto &pluginArgument : plugins) {
// Split into platform name and arguments
- QStringList arguments = pluginArgument.split(QLatin1Char(':'));
+ QStringList arguments = pluginArgument.split(QLatin1Char(':'), Qt::SkipEmptyParts);
+ if (arguments.isEmpty())
+ continue;
const QString name = arguments.takeFirst().toLower();
QString argumentsKey = name;
+ if (name.isEmpty())
+ continue;
argumentsKey[0] = argumentsKey.at(0).toUpper();
arguments.append(QLibraryInfo::platformPluginArguments(argumentsKey));
@@ -2738,9 +2749,9 @@ void QGuiApplicationPrivate::processContextMenuEvent(QWindowSystemInterfacePriva
}
#endif
-Q_GUI_EXPORT uint qHash(const QGuiApplicationPrivate::ActiveTouchPointsKey &k)
+Q_GUI_EXPORT size_t qHash(const QGuiApplicationPrivate::ActiveTouchPointsKey &k, size_t seed)
{
- return qHash(k.device) + k.touchPointId;
+ return (qHash(k.device) + k.touchPointId) ^ seed;
}
Q_GUI_EXPORT bool operator==(const QGuiApplicationPrivate::ActiveTouchPointsKey &a,
diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h
index 5239b58c97..8ce8f2b2d6 100644
--- a/src/gui/kernel/qguiapplication_p.h
+++ b/src/gui/kernel/qguiapplication_p.h
@@ -62,7 +62,10 @@
#include <qpa/qwindowsysteminterface.h>
#include <qpa/qwindowsysteminterface_p.h>
-#include "private/qshortcutmap_p.h"
+#if QT_CONFIG(shortcut)
+# include "private/qshortcutmap_p.h"
+#endif
+
#include <qicon.h>
QT_BEGIN_NAMESPACE
@@ -75,6 +78,12 @@ class QPlatformDragQtResponse;
class QDrag;
#endif // QT_CONFIG(draganddrop)
class QInputDeviceManager;
+#ifndef QT_NO_ACTION
+class QActionPrivate;
+#endif
+#if QT_CONFIG(shortcut)
+class QShortcutPrivate;
+#endif
class Q_GUI_EXPORT QGuiApplicationPrivate : public QCoreApplicationPrivate
{
@@ -263,7 +272,7 @@ public:
QIcon forcedWindowIcon;
static QList<QObject *> generic_plugin_list;
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
QShortcutMap shortcutMap;
#endif
@@ -323,6 +332,13 @@ public:
static void resetCachedDevicePixelRatio();
+#ifndef QT_NO_ACTION
+ virtual QActionPrivate *createActionPrivate() const;
+#endif
+#ifndef QT_NO_SHORTCUT
+ virtual QShortcutPrivate *createShortcutPrivate() const;
+#endif
+
protected:
virtual void notifyThemeChanged();
@@ -356,7 +372,7 @@ private:
static qreal m_maxDevicePixelRatio;
};
-Q_GUI_EXPORT uint qHash(const QGuiApplicationPrivate::ActiveTouchPointsKey &k);
+Q_GUI_EXPORT size_t qHash(const QGuiApplicationPrivate::ActiveTouchPointsKey &k, size_t seed = 0);
Q_GUI_EXPORT bool operator==(const QGuiApplicationPrivate::ActiveTouchPointsKey &a,
const QGuiApplicationPrivate::ActiveTouchPointsKey &b);
diff --git a/src/gui/kernel/qguivariant.cpp b/src/gui/kernel/qguivariant.cpp
index c9c45ba815..e0e0d11ae3 100644
--- a/src/gui/kernel/qguivariant.cpp
+++ b/src/gui/kernel/qguivariant.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtGui module of the Qt Toolkit.
@@ -45,7 +45,9 @@
#include "qcursor.h"
#include "qfont.h"
#include "qimage.h"
-#include "qkeysequence.h"
+#if QT_CONFIG(shortcut)
+# include "qkeysequence.h"
+#endif
#include "qtransform.h"
#include "qpalette.h"
#include "qpen.h"
@@ -99,19 +101,6 @@ struct GuiTypesFilter {
};
};
-static void construct(QVariant::Private *x, const void *copy)
-{
- const int type = x->type;
- QVariantConstructor<GuiTypesFilter> constructor(x, copy);
- QMetaTypeSwitcher::switcher<void>(constructor, type, nullptr);
-}
-
-static void clear(QVariant::Private *d)
-{
- QVariantDestructor<GuiTypesFilter> destructor(d);
- QMetaTypeSwitcher::switcher<void>(destructor, d->type, nullptr);
-}
-
// This class is a hack that customizes access to QPolygon and QPolygonF
template<class Filter>
class QGuiVariantIsNull : public QVariantIsNull<Filter> {
@@ -129,7 +118,7 @@ public:
static bool isNull(const QVariant::Private *d)
{
QGuiVariantIsNull<GuiTypesFilter> isNull(d);
- return QMetaTypeSwitcher::switcher<bool>(isNull, d->type, nullptr);
+ return QMetaTypeSwitcher::switcher<bool>(isNull, d->type().id(), nullptr);
}
// This class is a hack that customizes access to QPixmap, QBitmap, QCursor and QIcon
@@ -171,7 +160,7 @@ public:
static bool compare(const QVariant::Private *a, const QVariant::Private *b)
{
QGuiVariantComparator<GuiTypesFilter> comparator(a, b);
- return QMetaTypeSwitcher::switcher<bool>(comparator, a->type, nullptr);
+ return QMetaTypeSwitcher::switcher<bool>(comparator, a->type().id(), nullptr);
}
static bool convert(const QVariant::Private *d, int t,
@@ -179,7 +168,7 @@ static bool convert(const QVariant::Private *d, int t,
{
switch (t) {
case QMetaType::QByteArray:
- if (d->type == QMetaType::QColor) {
+ if (d->type().id() == QMetaType::QColor) {
const QColor *c = v_cast<QColor>(d);
*static_cast<QByteArray *>(result) = c->name(c->alpha() != 255 ? QColor::HexArgb : QColor::HexRgb).toLatin1();
return true;
@@ -187,8 +176,8 @@ static bool convert(const QVariant::Private *d, int t,
break;
case QMetaType::QString: {
QString *str = static_cast<QString *>(result);
- switch (d->type) {
-#ifndef QT_NO_SHORTCUT
+ switch (d->type().id()) {
+#if QT_CONFIG(shortcut)
case QMetaType::QKeySequence:
*str = (*v_cast<QKeySequence>(d)).toString(QKeySequence::NativeText);
return true;
@@ -207,13 +196,13 @@ static bool convert(const QVariant::Private *d, int t,
break;
}
case QMetaType::QPixmap:
- if (d->type == QMetaType::QImage) {
+ if (d->type().id() == QMetaType::QImage) {
*static_cast<QPixmap *>(result) = QPixmap::fromImage(*v_cast<QImage>(d));
return true;
- } else if (d->type == QMetaType::QBitmap) {
+ } else if (d->type().id() == QMetaType::QBitmap) {
*static_cast<QPixmap *>(result) = *v_cast<QBitmap>(d);
return true;
- } else if (d->type == QMetaType::QBrush) {
+ } else if (d->type().id() == QMetaType::QBrush) {
if (v_cast<QBrush>(d)->style() == Qt::TexturePattern) {
*static_cast<QPixmap *>(result) = v_cast<QBrush>(d)->texture();
return true;
@@ -221,26 +210,26 @@ static bool convert(const QVariant::Private *d, int t,
}
break;
case QMetaType::QImage:
- if (d->type == QMetaType::QPixmap) {
+ if (d->type().id() == QMetaType::QPixmap) {
*static_cast<QImage *>(result) = v_cast<QPixmap>(d)->toImage();
return true;
- } else if (d->type == QMetaType::QBitmap) {
+ } else if (d->type().id() == QMetaType::QBitmap) {
*static_cast<QImage *>(result) = v_cast<QBitmap>(d)->toImage();
return true;
}
break;
case QMetaType::QBitmap:
- if (d->type == QMetaType::QPixmap) {
+ if (d->type().id() == QMetaType::QPixmap) {
*static_cast<QBitmap *>(result) = *v_cast<QPixmap>(d);
return true;
- } else if (d->type == QMetaType::QImage) {
+ } else if (d->type().id() == QMetaType::QImage) {
*static_cast<QBitmap *>(result) = QBitmap::fromImage(*v_cast<QImage>(d));
return true;
}
break;
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
case QMetaType::Int:
- if (d->type == QMetaType::QKeySequence) {
+ if (d->type().id() == QMetaType::QKeySequence) {
const QKeySequence &seq = *v_cast<QKeySequence>(d);
*static_cast<int *>(result) = seq.isEmpty() ? 0 : seq[0];
return true;
@@ -248,20 +237,20 @@ static bool convert(const QVariant::Private *d, int t,
break;
#endif
case QMetaType::QFont:
- if (d->type == QMetaType::QString) {
+ if (d->type().id() == QMetaType::QString) {
QFont *f = static_cast<QFont *>(result);
f->fromString(*v_cast<QString>(d));
return true;
}
break;
case QMetaType::QColor:
- if (d->type == QMetaType::QString) {
+ if (d->type().id() == QMetaType::QString) {
static_cast<QColor *>(result)->setNamedColor(*v_cast<QString>(d));
return static_cast<QColor *>(result)->isValid();
- } else if (d->type == QMetaType::QByteArray) {
+ } else if (d->type().id() == QMetaType::QByteArray) {
static_cast<QColor *>(result)->setNamedColor(QLatin1String(*v_cast<QByteArray>(d)));
return true;
- } else if (d->type == QMetaType::QBrush) {
+ } else if (d->type().id() == QMetaType::QBrush) {
if (v_cast<QBrush>(d)->style() == Qt::SolidPattern) {
*static_cast<QColor *>(result) = v_cast<QBrush>(d)->color();
return true;
@@ -269,18 +258,18 @@ static bool convert(const QVariant::Private *d, int t,
}
break;
case QMetaType::QBrush:
- if (d->type == QMetaType::QColor) {
+ if (d->type().id() == QMetaType::QColor) {
*static_cast<QBrush *>(result) = QBrush(*v_cast<QColor>(d));
return true;
- } else if (d->type == QMetaType::QPixmap) {
+ } else if (d->type().id() == QMetaType::QPixmap) {
*static_cast<QBrush *>(result) = QBrush(*v_cast<QPixmap>(d));
return true;
}
break;
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
case QMetaType::QKeySequence: {
QKeySequence *seq = static_cast<QKeySequence *>(result);
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QString:
*seq = QKeySequence(*v_cast<QString>(d));
return true;
@@ -311,13 +300,11 @@ static void streamDebug(QDebug dbg, const QVariant &v)
{
QVariant::Private *d = const_cast<QVariant::Private *>(&v.data_ptr());
QVariantDebugStream<GuiTypesFilter> stream(dbg, d);
- QMetaTypeSwitcher::switcher<void>(stream, d->type, nullptr);
+ QMetaTypeSwitcher::switcher<void>(stream, d->type().id(), nullptr);
}
#endif
const QVariant::Handler qt_gui_variant_handler = {
- construct,
- clear,
isNull,
#ifndef QT_NO_DATASTREAM
nullptr,
@@ -336,19 +323,41 @@ const QVariant::Handler qt_gui_variant_handler = {
#define QT_IMPL_METATYPEINTERFACE_GUI_TYPES(MetaTypeName, MetaTypeId, RealName) \
QT_METATYPE_INTERFACE_INIT(RealName),
-static const QMetaTypeInterface qVariantGuiHelper[] = {
- QT_FOR_EACH_STATIC_GUI_CLASS(QT_IMPL_METATYPEINTERFACE_GUI_TYPES)
-};
+static const struct : QMetaTypeModuleHelper
+{
+ QtPrivate::QMetaTypeInterface *interfaceForType(int type) const override {
+ switch (type) {
+ QT_FOR_EACH_STATIC_GUI_CLASS(QT_METATYPE_CONVERT_ID_TO_TYPE)
+ default: return nullptr;
+ }
+ }
+#ifndef QT_NO_DATASTREAM
+ bool save(QDataStream &stream, int type, const void *data) const override {
+ switch (type) {
+ QT_FOR_EACH_STATIC_GUI_CLASS(QT_METATYPE_DATASTREAM_SAVE)
+ default: return false;
+ }
+ }
+ bool load(QDataStream &stream, int type, void *data) const override {
+ switch (type) {
+ QT_FOR_EACH_STATIC_GUI_CLASS(QT_METATYPE_DATASTREAM_LOAD)
+ default: return false;
+ }
+ }
+#endif
+
+} qVariantGuiHelper;
+
#undef QT_IMPL_METATYPEINTERFACE_GUI_TYPES
} // namespace used to hide QVariant handler
-extern Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeGuiHelper;
+extern Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeGuiHelper;
void qRegisterGuiVariant()
{
QVariantPrivate::registerHandler(QModulesPrivate::Gui, &qt_gui_variant_handler);
- qMetaTypeGuiHelper = qVariantGuiHelper;
+ qMetaTypeGuiHelper = &qVariantGuiHelper;
}
Q_CONSTRUCTOR_FUNCTION(qRegisterGuiVariant)
diff --git a/src/gui/kernel/qkeymapper_p.h b/src/gui/kernel/qkeymapper_p.h
index 8364557020..fd53747fdd 100644
--- a/src/gui/kernel/qkeymapper_p.h
+++ b/src/gui/kernel/qkeymapper_p.h
@@ -53,7 +53,6 @@
#include <QtGui/private/qtguiglobal_p.h>
#include <qobject.h>
#include <private/qobject_p.h>
-#include <qkeysequence.h>
#include <qlist.h>
#include <qlocale.h>
#include <qevent.h>
diff --git a/src/gui/kernel/qkeysequence.cpp b/src/gui/kernel/qkeysequence.cpp
index a75b8ef920..cfc93eacac 100644
--- a/src/gui/kernel/qkeysequence.cpp
+++ b/src/gui/kernel/qkeysequence.cpp
@@ -42,8 +42,6 @@
#include <qpa/qplatformtheme.h>
#include "private/qguiapplication_p.h"
-#if !defined(QT_NO_SHORTCUT) || defined(Q_CLANG_QDOC)
-
#include "qdebug.h"
#include <QtCore/qhashfunctions.h>
#ifndef QT_NO_DATASTREAM
@@ -1469,7 +1467,7 @@ bool QKeySequence::operator==(const QKeySequence &other) const
Calculates the hash value of \a key, using
\a seed to seed the calculation.
*/
-uint qHash(const QKeySequence &key, uint seed) noexcept
+size_t qHash(const QKeySequence &key, size_t seed) noexcept
{
return qHashRange(key.d->key, key.d->key + QKeySequencePrivate::MaxKeyCount, seed);
}
@@ -1679,9 +1677,6 @@ QDebug operator<<(QDebug dbg, const QKeySequence &p)
}
#endif
-#endif // QT_NO_SHORTCUT
-
-
/*!
\typedef QKeySequence::DataPtr
\internal
diff --git a/src/gui/kernel/qkeysequence.h b/src/gui/kernel/qkeysequence.h
index 3dcbbe5941..67c79519e6 100644
--- a/src/gui/kernel/qkeysequence.h
+++ b/src/gui/kernel/qkeysequence.h
@@ -44,10 +44,9 @@
#include <QtCore/qstring.h>
#include <QtCore/qobjectdefs.h>
-QT_BEGIN_NAMESPACE
-
+QT_REQUIRE_CONFIG(shortcut);
-#if !defined(QT_NO_SHORTCUT) || defined(Q_CLANG_QDOC)
+QT_BEGIN_NAMESPACE
class QKeySequence;
@@ -66,7 +65,7 @@ void qt_set_sequence_auto_mnemonic(bool b);
class QVariant;
class QKeySequencePrivate;
-Q_GUI_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QKeySequence &key, uint seed = 0) noexcept;
+Q_GUI_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QKeySequence &key, size_t seed = 0) noexcept;
class Q_GUI_EXPORT QKeySequence
{
@@ -212,7 +211,7 @@ private:
friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &in, const QKeySequence &ks);
friend Q_GUI_EXPORT QDataStream &operator>>(QDataStream &in, QKeySequence &ks);
- friend Q_GUI_EXPORT uint qHash(const QKeySequence &key, uint seed) noexcept;
+ friend Q_GUI_EXPORT size_t qHash(const QKeySequence &key, size_t seed) noexcept;
friend class QShortcutMap;
friend class QShortcut;
@@ -227,17 +226,6 @@ Q_DECLARE_SHARED(QKeySequence)
Q_GUI_EXPORT QDebug operator<<(QDebug, const QKeySequence &);
#endif
-#else
-
-class Q_GUI_EXPORT QKeySequence
-{
-public:
- QKeySequence() {}
- QKeySequence(int) {}
-};
-
-#endif // QT_NO_SHORTCUT
-
QT_END_NAMESPACE
#endif // QKEYSEQUENCE_H
diff --git a/src/gui/kernel/qkeysequence_p.h b/src/gui/kernel/qkeysequence_p.h
index fbcab5d34e..8c59505561 100644
--- a/src/gui/kernel/qkeysequence_p.h
+++ b/src/gui/kernel/qkeysequence_p.h
@@ -56,9 +56,10 @@
#include <algorithm>
+QT_REQUIRE_CONFIG(shortcut);
+
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_SHORTCUT
struct QKeyBinding
{
QKeySequence::StandardKey standardKey;
@@ -87,7 +88,6 @@ public:
Q_GUI_EXPORT static QString keyName(int key, QKeySequence::SequenceFormat format);
static int decodeString(QString accel, QKeySequence::SequenceFormat format);
};
-#endif // QT_NO_SHORTCUT
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qopenglcontext.cpp b/src/gui/kernel/qopenglcontext.cpp
index ac5e279a79..9a03333537 100644
--- a/src/gui/kernel/qopenglcontext.cpp
+++ b/src/gui/kernel/qopenglcontext.cpp
@@ -54,171 +54,11 @@
#include <qpa/qplatformnativeinterface.h>
#include <private/qopenglextensions_p.h>
-#include <private/qopenglversionfunctionsfactory_p.h>
-
-#include <private/qopengltexturehelper_p.h>
#include <QDebug>
-#ifndef QT_OPENGL_ES_2
-#include <QOpenGLFunctions_1_0>
-#include <QOpenGLFunctions_3_2_Core>
-#endif
-
QT_BEGIN_NAMESPACE
-class QOpenGLVersionProfilePrivate
-{
-public:
- QOpenGLVersionProfilePrivate()
- : majorVersion(0),
- minorVersion(0),
- profile(QSurfaceFormat::NoProfile)
- {}
-
- int majorVersion;
- int minorVersion;
- QSurfaceFormat::OpenGLContextProfile profile;
-};
-
-
-/*!
- \class QOpenGLVersionProfile
- \inmodule QtGui
- \since 5.1
- \brief The QOpenGLVersionProfile class represents the version and if applicable
- the profile of an OpenGL context.
-
- An object of this class can be passed to QOpenGLContext::versionFunctions() to
- request a functions object for a specific version and profile of OpenGL.
-
- It also contains some helper functions to check if a version supports profiles
- or is a legacy version.
-*/
-
-/*!
- Creates a default invalid QOpenGLVersionProfile object.
-*/
-QOpenGLVersionProfile::QOpenGLVersionProfile()
- : d(new QOpenGLVersionProfilePrivate)
-{
-}
-
-/*!
- Creates a QOpenGLVersionProfile object initialised with the version and profile
- from \a format.
-*/
-QOpenGLVersionProfile::QOpenGLVersionProfile(const QSurfaceFormat &format)
- : d(new QOpenGLVersionProfilePrivate)
-{
- d->majorVersion = format.majorVersion();
- d->minorVersion = format.minorVersion();
- d->profile = format.profile();
-}
-
-/*!
- Constructs a copy of \a other.
-*/
-QOpenGLVersionProfile::QOpenGLVersionProfile(const QOpenGLVersionProfile &other)
- : d(new QOpenGLVersionProfilePrivate)
-{
- *d = *(other.d);
-}
-
-/*!
- Destroys the QOpenGLVersionProfile object.
-*/
-QOpenGLVersionProfile::~QOpenGLVersionProfile()
-{
- delete d;
-}
-
-/*!
- Assigns the version and profile of \a rhs to this QOpenGLVersionProfile object.
-*/
-QOpenGLVersionProfile &QOpenGLVersionProfile::operator=(const QOpenGLVersionProfile &rhs)
-{
- if (this == &rhs)
- return *this;
- *d = *(rhs.d);
- return *this;
-}
-
-/*!
- Returns a QPair<int,int> where the components represent the major and minor OpenGL
- version numbers respectively.
-
- \sa setVersion()
-*/
-QPair<int, int> QOpenGLVersionProfile::version() const
-{
- return qMakePair( d->majorVersion, d->minorVersion);
-}
-
-/*!
- Sets the major and minor version numbers to \a majorVersion and \a minorVersion respectively.
-
- \sa version()
-*/
-void QOpenGLVersionProfile::setVersion(int majorVersion, int minorVersion)
-{
- d->majorVersion = majorVersion;
- d->minorVersion = minorVersion;
-}
-
-/*!
- Returns the OpenGL profile. Only makes sense if profiles are supported by this version.
-
- \sa setProfile()
-*/
-QSurfaceFormat::OpenGLContextProfile QOpenGLVersionProfile::profile() const
-{
- return d->profile;
-}
-
-/*!
- Sets the OpenGL profile \a profile. Only makes sense if profiles are supported by
- this version.
-
- \sa profile()
-*/
-void QOpenGLVersionProfile::setProfile(QSurfaceFormat::OpenGLContextProfile profile)
-{
- d->profile = profile;
-}
-
-/*!
- Returns \c true if profiles are supported by the OpenGL version returned by version(). Only
- OpenGL versions >= 3.2 support profiles.
-
- \sa profile(), version()
-*/
-bool QOpenGLVersionProfile::hasProfiles() const
-{
- return ( d->majorVersion > 3
- || (d->majorVersion == 3 && d->minorVersion > 1));
-}
-
-/*!
- Returns \c true is the OpenGL version returned by version() contains deprecated functions
- and does not support profiles i.e. if the OpenGL version is <= 3.1.
-*/
-bool QOpenGLVersionProfile::isLegacyVersion() const
-{
- return (d->majorVersion < 3 || (d->majorVersion == 3 && d->minorVersion == 0));
-}
-
-/*!
- Returns \c true if the version number is valid. Note that for a default constructed
- QOpenGLVersionProfile object this function will return \c false.
-
- \sa setVersion(), version()
-*/
-bool QOpenGLVersionProfile::isValid() const
-{
- return d->majorVersion > 0 && d->minorVersion >= 0;
-}
-
class QGuiGLThreadContext
{
public:
@@ -366,7 +206,7 @@ int QOpenGLContextPrivate::maxTextureSize()
QOpenGLFunctions *funcs = q->functions();
funcs->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size);
-#ifndef QT_OPENGL_ES
+#if !QT_CONFIG(opengles2)
if (!q->isOpenGLES()) {
GLenum proxy = GL_PROXY_TEXTURE_2D;
@@ -374,20 +214,8 @@ int QOpenGLContextPrivate::maxTextureSize()
GLint next = 64;
funcs->glTexImage2D(proxy, 0, GL_RGBA, next, next, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
- QOpenGLFunctions_1_0 *gl1funcs = nullptr;
- QOpenGLFunctions_3_2_Core *gl3funcs = nullptr;
-
- if (q->format().profile() == QSurfaceFormat::CoreProfile)
- gl3funcs = q->versionFunctions<QOpenGLFunctions_3_2_Core>();
- else
- gl1funcs = q->versionFunctions<QOpenGLFunctions_1_0>();
-
- Q_ASSERT(gl1funcs || gl3funcs);
-
- if (gl1funcs)
- gl1funcs->glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &size);
- else
- gl3funcs->glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &size);
+ QOpenGLExtraFunctions *extraFuncs = q->extraFunctions();
+ extraFuncs->glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &size);
if (size == 0) {
return max_texture_size;
@@ -399,16 +227,12 @@ int QOpenGLContextPrivate::maxTextureSize()
if (next > max_texture_size)
break;
funcs->glTexImage2D(proxy, 0, GL_RGBA, next, next, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
- if (gl1funcs)
- gl1funcs->glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &next);
- else
- gl3funcs->glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &next);
-
+ extraFuncs->glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &next);
} while (next > size);
max_texture_size = size;
}
-#endif // QT_OPENGL_ES
+#endif // QT_CONFIG(opengles2)
return max_texture_size;
}
@@ -641,7 +465,6 @@ bool QOpenGLContext::create()
*/
void QOpenGLContext::destroy()
{
- deleteQGLContext();
Q_D(QOpenGLContext);
if (d->platformGLContext)
emit aboutToBeDestroyed();
@@ -655,16 +478,10 @@ void QOpenGLContext::destroy()
delete d->functions;
d->functions = nullptr;
- for (QAbstractOpenGLFunctions *func : qAsConst(d->externalVersionFunctions)) {
- QAbstractOpenGLFunctionsPrivate *func_d = QAbstractOpenGLFunctionsPrivate::get(func);
- func_d->owningContext = nullptr;
- func_d->initialized = false;
+ if (d->textureFunctionsDestroyCallback) {
+ d->textureFunctionsDestroyCallback();
+ d->textureFunctionsDestroyCallback = nullptr;
}
- d->externalVersionFunctions.clear();
- qDeleteAll(d->versionFunctions);
- d->versionFunctions.clear();
-
- delete d->textureFunctions;
d->textureFunctions = nullptr;
d->nativeHandle = QVariant();
@@ -757,115 +574,6 @@ QOpenGLExtraFunctions *QOpenGLContext::extraFunctions() const
}
/*!
- \fn T *QOpenGLContext::versionFunctions() const
-
- \overload versionFunctions()
-
- Returns a pointer to an object that provides access to all functions for
- the version and profile of this context. There is no need to call
- QAbstractOpenGLFunctions::initializeOpenGLFunctions() as long as this context
- is current. It is also possible to call this function when the context is not
- current, but in that case it is the caller's responsibility to ensure proper
- initialization by calling QAbstractOpenGLFunctions::initializeOpenGLFunctions()
- afterwards.
-
- Usually one would use the template version of this function to automatically
- have the result cast to the correct type.
-
- \code
- QOpenGLFunctions_3_3_Core* funcs = 0;
- funcs = context->versionFunctions<QOpenGLFunctions_3_3_Core>();
- if (!funcs) {
- qWarning() << "Could not obtain required OpenGL context version";
- exit(1);
- }
- \endcode
-
- It is possible to request a functions object for a different version and profile
- than that for which the context was created. To do this either use the template
- version of this function specifying the desired functions object type as the
- template parameter or by passing in a QOpenGLVersionProfile object as an argument
- to the non-template function.
-
- Note that requests for function objects of other versions or profiles can fail and
- in doing so will return \nullptr. Situations in which creation of the functions
- object can fail are if the request cannot be satisfied due to asking for functions
- that are not in the version or profile of this context. For example:
-
- \list
- \li Requesting a 3.3 core profile functions object would succeed.
- \li Requesting a 3.3 compatibility profile functions object would fail. We would fail
- to resolve the deprecated functions.
- \li Requesting a 4.3 core profile functions object would fail. We would fail to resolve
- the new core functions introduced in versions 4.0-4.3.
- \li Requesting a 3.1 functions object would succeed. There is nothing in 3.1 that is not
- also in 3.3 core.
- \endlist
-
- Note that if creating a functions object via this method that the QOpenGLContext
- retains ownership of the object. This is to allow the object to be cached and shared.
-*/
-
-/*!
- Returns a pointer to an object that provides access to all functions for the
- \a versionProfile of this context. There is no need to call
- QAbstractOpenGLFunctions::initializeOpenGLFunctions() as long as this context
- is current. It is also possible to call this function when the context is not
- current, but in that case it is the caller's responsibility to ensure proper
- initialization by calling QAbstractOpenGLFunctions::initializeOpenGLFunctions()
- afterwards.
-
- Usually one would use the template version of this function to automatically
- have the result cast to the correct type.
-*/
-QAbstractOpenGLFunctions *QOpenGLContext::versionFunctions(const QOpenGLVersionProfile &versionProfile) const
-{
-#ifndef QT_OPENGL_ES_2
- if (isOpenGLES()) {
- qWarning("versionFunctions: Not supported on OpenGL ES");
- return nullptr;
- }
-#endif // QT_OPENGL_ES_2
-
- Q_D(const QOpenGLContext);
- const QSurfaceFormat f = format();
-
- // Ensure we have a valid version and profile. Default to context's if none specified
- QOpenGLVersionProfile vp = versionProfile;
- if (!vp.isValid())
- vp = QOpenGLVersionProfile(f);
-
- // Check that context is compatible with requested version
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < vp.version())
- return nullptr;
-
- // If this context only offers core profile functions then we can't create
- // function objects for legacy or compatibility profile requests
- if (((vp.hasProfiles() && vp.profile() != QSurfaceFormat::CoreProfile) || vp.isLegacyVersion())
- && f.profile() == QSurfaceFormat::CoreProfile)
- return nullptr;
-
- // Create object if suitable one not cached
- QAbstractOpenGLFunctions* funcs = nullptr;
- auto it = d->versionFunctions.constFind(vp);
- if (it == d->versionFunctions.constEnd()) {
- funcs = QOpenGLVersionFunctionsFactory::create(vp);
- if (funcs) {
- funcs->setOwningContext(this);
- d->versionFunctions.insert(vp, funcs);
- }
- } else {
- funcs = it.value();
- }
-
- if (funcs && QOpenGLContext::currentContext() == this)
- funcs->initializeOpenGLFunctions();
-
- return funcs;
-}
-
-/*!
Returns the set of OpenGL extensions supported by this context.
The context or a sharing context must be current.
@@ -1192,44 +900,6 @@ QScreen *QOpenGLContext::screen() const
}
/*!
- internal: Needs to have a pointer to qGLContext. But since this is in Qt GUI we can't
- have any type information.
-
- \internal
-*/
-void *QOpenGLContext::qGLContextHandle() const
-{
- Q_D(const QOpenGLContext);
- return d->qGLContextHandle;
-}
-
-/*!
- internal: If the delete function is specified QOpenGLContext "owns"
- the passed context handle and will use the delete function to destroy it.
-
- \internal
-*/
-void QOpenGLContext::setQGLContextHandle(void *handle,void (*qGLContextDeleteFunction)(void *))
-{
- Q_D(QOpenGLContext);
- d->qGLContextHandle = handle;
- d->qGLContextDeleteFunction = qGLContextDeleteFunction;
-}
-
-/*!
- \internal
-*/
-void QOpenGLContext::deleteQGLContext()
-{
- Q_D(QOpenGLContext);
- if (d->qGLContextDeleteFunction && d->qGLContextHandle) {
- d->qGLContextDeleteFunction(d->qGLContextHandle);
- d->qGLContextDeleteFunction = nullptr;
- d->qGLContextHandle = nullptr;
- }
-}
-
-/*!
Returns the platform-specific handle for the OpenGL implementation that
is currently in use. (for example, a HMODULE on Windows)
@@ -1287,7 +957,7 @@ QOpenGLContext::OpenGLModuleType QOpenGLContext::openGLModuleType()
#if defined(QT_OPENGL_DYNAMIC)
Q_ASSERT(qGuiApp);
return QGuiApplicationPrivate::instance()->platformIntegration()->openGLModuleType();
-#elif defined(QT_OPENGL_ES_2)
+#elif QT_CONFIG(opengles2)
return LibGLES;
#else
return LibGL;
@@ -1352,33 +1022,6 @@ QOpenGLContext *QOpenGLContext::globalShareContext()
/*!
\internal
*/
-QOpenGLVersionFunctionsStorage *QOpenGLContext::functionsBackendStorage() const
-{
- Q_D(const QOpenGLContext);
- return &d->versionFunctionsStorage;
-}
-
-/*!
- \internal
- */
-void QOpenGLContext::insertExternalFunctions(QAbstractOpenGLFunctions *f)
-{
- Q_D(QOpenGLContext);
- d->externalVersionFunctions.insert(f);
-}
-
-/*!
- \internal
- */
-void QOpenGLContext::removeExternalFunctions(QAbstractOpenGLFunctions *f)
-{
- Q_D(QOpenGLContext);
- d->externalVersionFunctions.remove(f);
-}
-
-/*!
- \internal
-*/
QOpenGLTextureHelper* QOpenGLContext::textureFunctions() const
{
Q_D(const QOpenGLContext);
@@ -1388,10 +1031,11 @@ QOpenGLTextureHelper* QOpenGLContext::textureFunctions() const
/*!
\internal
*/
-void QOpenGLContext::setTextureFunctions(QOpenGLTextureHelper* textureFuncs)
+void QOpenGLContext::setTextureFunctions(QOpenGLTextureHelper* textureFuncs, std::function<void()> destroyCallback)
{
Q_D(QOpenGLContext);
d->textureFunctions = textureFuncs;
+ d->textureFunctionsDestroyCallback = destroyCallback;
}
/*!
@@ -1682,21 +1326,6 @@ void QOpenGLMultiGroupSharedResource::cleanup(QOpenGLContextGroup *group, QOpenG
}
#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug debug, const QOpenGLVersionProfile &vp)
-{
- QDebugStateSaver saver(debug);
- debug.nospace();
- debug << "QOpenGLVersionProfile(";
- if (vp.isValid()) {
- debug << vp.version().first << '.' << vp.version().second
- << ", profile=" << vp.profile();
- } else {
- debug << "invalid";
- }
- debug << ')';
- return debug;
-}
-
QDebug operator<<(QDebug debug, const QOpenGLContext *ctx)
{
QDebugStateSaver saver(debug);
diff --git a/src/gui/kernel/qopenglcontext.h b/src/gui/kernel/qopenglcontext.h
index 9cfaa52f17..a0d8a3edba 100644
--- a/src/gui/kernel/qopenglcontext.h
+++ b/src/gui/kernel/qopenglcontext.h
@@ -58,13 +58,7 @@
#endif
#include <QtGui/qopengl.h>
-#include <QtGui/qopenglversionfunctions.h>
-#if QT_DEPRECATED_SINCE(5, 6)
-#include <QtCore/qhash.h>
-#endif
-#include <QtCore/qhashfunctions.h>
-#include <QtCore/qpair.h>
#include <QtCore/qvariant.h>
QT_BEGIN_NAMESPACE
@@ -79,50 +73,6 @@ class QPlatformOpenGLContext;
class QScreen;
class QSurface;
-class QOpenGLVersionProfilePrivate;
-
-class Q_GUI_EXPORT QOpenGLVersionProfile
-{
-public:
- QOpenGLVersionProfile();
- explicit QOpenGLVersionProfile(const QSurfaceFormat &format);
- QOpenGLVersionProfile(const QOpenGLVersionProfile &other);
- ~QOpenGLVersionProfile();
-
- QOpenGLVersionProfile &operator=(const QOpenGLVersionProfile &rhs);
-
- QPair<int, int> version() const;
- void setVersion(int majorVersion, int minorVersion);
-
- QSurfaceFormat::OpenGLContextProfile profile() const;
- void setProfile(QSurfaceFormat::OpenGLContextProfile profile);
-
- bool hasProfiles() const;
- bool isLegacyVersion() const;
- bool isValid() const;
-
-private:
- QOpenGLVersionProfilePrivate* d;
-};
-
-inline uint qHash(const QOpenGLVersionProfile &v, uint seed = 0)
-{
- return qHash(static_cast<int>(v.profile() * 1000)
- + v.version().first * 100 + v.version().second * 10, seed);
-}
-
-inline bool operator==(const QOpenGLVersionProfile &lhs, const QOpenGLVersionProfile &rhs)
-{
- if (lhs.profile() != rhs.profile())
- return false;
- return lhs.version() == rhs.version();
-}
-
-inline bool operator!=(const QOpenGLVersionProfile &lhs, const QOpenGLVersionProfile &rhs)
-{
- return !operator==(lhs, rhs);
-}
-
class Q_GUI_EXPORT QOpenGLContextGroup : public QObject
{
Q_OBJECT
@@ -188,15 +138,6 @@ public:
QOpenGLFunctions *functions() const;
QOpenGLExtraFunctions *extraFunctions() const;
- QAbstractOpenGLFunctions *versionFunctions(const QOpenGLVersionProfile &versionProfile = QOpenGLVersionProfile()) const;
-
- template<class TYPE>
- TYPE *versionFunctions() const
- {
- QOpenGLVersionProfile v = TYPE::versionProfile();
- return static_cast<TYPE*>(versionFunctions(v));
- }
-
QSet<QByteArray> extensions() const;
bool hasExtension(const QByteArray &extension) const;
@@ -218,8 +159,6 @@ Q_SIGNALS:
void aboutToBeDestroyed();
private:
- friend class QGLContext;
- friend class QGLPixelBuffer;
friend class QOpenGLContextResourceBase;
friend class QOpenGLPaintDevice;
friend class QOpenGLGlyphTexture;
@@ -234,16 +173,8 @@ private:
friend class QAbstractOpenGLFunctionsPrivate;
friend class QOpenGLTexturePrivate;
- void *qGLContextHandle() const;
- void setQGLContextHandle(void *handle,void (*qGLContextDeleteFunction)(void *));
- void deleteQGLContext();
-
- QOpenGLVersionFunctionsStorage* functionsBackendStorage() const;
- void insertExternalFunctions(QAbstractOpenGLFunctions *f);
- void removeExternalFunctions(QAbstractOpenGLFunctions *f);
-
QOpenGLTextureHelper* textureFunctions() const;
- void setTextureFunctions(QOpenGLTextureHelper* textureFuncs);
+ void setTextureFunctions(QOpenGLTextureHelper* textureFuncs, std::function<void()> destroyCallback);
void destroy();
@@ -251,7 +182,6 @@ private:
};
#ifndef QT_NO_DEBUG_STREAM
-Q_GUI_EXPORT QDebug operator<<(QDebug debug, const QOpenGLVersionProfile &vp);
Q_GUI_EXPORT QDebug operator<<(QDebug debug, const QOpenGLContext *ctx);
Q_GUI_EXPORT QDebug operator<<(QDebug debug, const QOpenGLContextGroup *cg);
#endif // !QT_NO_DEBUG_STREAM
diff --git a/src/gui/kernel/qopenglcontext_p.h b/src/gui/kernel/qopenglcontext_p.h
index 833cfb20c3..ede41d5a93 100644
--- a/src/gui/kernel/qopenglcontext_p.h
+++ b/src/gui/kernel/qopenglcontext_p.h
@@ -192,20 +192,25 @@ class QPaintEngineEx;
class QOpenGLFunctions;
class QOpenGLTextureHelper;
+class Q_GUI_EXPORT QOpenGLContextVersionFunctionHelper
+{
+public:
+ virtual ~QOpenGLContextVersionFunctionHelper() {}
+};
+
class Q_GUI_EXPORT QOpenGLContextPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QOpenGLContext)
public:
QOpenGLContextPrivate()
- : qGLContextHandle(nullptr)
- , qGLContextDeleteFunction(nullptr)
- , platformGLContext(nullptr)
+ : platformGLContext(nullptr)
, shareContext(nullptr)
, shareGroup(nullptr)
, screen(nullptr)
, surface(nullptr)
, functions(nullptr)
, textureFunctions(nullptr)
+ , versionFunctions(nullptr)
, max_texture_size(-1)
, workaround_brokenFBOReadBack(false)
, workaround_brokenTexSubImage(false)
@@ -222,14 +227,9 @@ public:
{
//do not delete the QOpenGLContext handle here as it is deleted in
//QWidgetPrivate::deleteTLSysExtra()
- }
-
- mutable QHash<QOpenGLVersionProfile, QAbstractOpenGLFunctions *> versionFunctions;
- mutable QOpenGLVersionFunctionsStorage versionFunctionsStorage;
- mutable QSet<QAbstractOpenGLFunctions *> externalVersionFunctions;
- void *qGLContextHandle;
- void (*qGLContextDeleteFunction)(void *handle);
+ delete versionFunctions;
+ }
QSurfaceFormat requestedFormat;
QPlatformOpenGLContext *platformGLContext;
@@ -240,6 +240,8 @@ public:
QOpenGLFunctions *functions;
mutable QSet<QByteArray> extensionNames;
QOpenGLTextureHelper* textureFunctions;
+ std::function<void()> textureFunctionsDestroyCallback;
+ QOpenGLContextVersionFunctionHelper *versionFunctions;
GLint max_texture_size;
diff --git a/src/gui/kernel/qopenglwindow.cpp b/src/gui/kernel/qopenglwindow.cpp
deleted file mode 100644
index 2ea8f43711..0000000000
--- a/src/gui/kernel/qopenglwindow.cpp
+++ /dev/null
@@ -1,698 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenglwindow.h"
-#include "qpaintdevicewindow_p.h"
-#include <QtGui/QOpenGLFramebufferObject>
-#include <QtGui/QOpenGLPaintDevice>
-#include <QtGui/QOpenGLFunctions>
-#include <QtGui/QOpenGLTextureBlitter>
-#include <QtGui/private/qopenglextensions_p.h>
-#include <QtGui/private/qopenglcontext_p.h>
-#include <QtGui/QMatrix4x4>
-#include <QtGui/QOffscreenSurface>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLWindow
- \inmodule QtGui
- \since 5.4
- \brief The QOpenGLWindow class is a convenience subclass of QWindow to perform OpenGL painting.
-
- QOpenGLWindow is an enhanced QWindow that allows easily creating windows that
- perform OpenGL rendering using an API that is compatible with QOpenGLWidget
- and is similar to the legacy QGLWidget. Unlike QOpenGLWidget, QOpenGLWindow
- has no dependency on the widgets module and offers better performance.
-
- A typical application will subclass QOpenGLWindow and reimplement the following
- virtual functions:
-
- \list
-
- \li initializeGL() to perform OpenGL resource initialization
-
- \li resizeGL() to set up the transformation matrices and other window size dependent resources
-
- \li paintGL() to issue OpenGL commands or draw using QPainter
-
- \endlist
-
- To schedule a repaint, call the update() function. Note that this will not
- immediately result in a call to paintGL(). Calling update() multiple times in
- a row will not change the behavior in any way.
-
- This is a slot so it can be connected to a \l QTimer::timeout() signal to
- perform animation. Note however that in the modern OpenGL world it is a much
- better choice to rely on synchronization to the vertical refresh rate of the
- display. See \l{QSurfaceFormat::setSwapInterval()}{setSwapInterval()} on a
- description of the swap interval. With a swap interval of \c 1, which is the
- case on most systems by default, the
- \l{QOpenGLContext::swapBuffers()}{swapBuffers()} call, that is executed
- internally by QOpenGLWindow after each repaint, will block and wait for
- vsync. This means that whenever the swap is done, an update can be scheduled
- again by calling update(), without relying on timers.
-
- To request a specific configuration for the context, use setFormat()
- like for any other QWindow. This allows, among others, requesting a
- given OpenGL version and profile, or enabling depth and stencil
- buffers.
-
- Unlike QWindow, QOpenGLWindow allows opening a painter on itself and perform
- QPainter-based drawing.
-
- QOpenGLWindow supports multiple update behaviors. The default,
- \c NoPartialUpdate is equivalent to a regular, OpenGL-based QWindow or the
- legacy QGLWidget. In contrast, \c PartialUpdateBlit and \c PartialUpdateBlend are
- more in line with QOpenGLWidget's way of working, where there is always an
- extra, dedicated framebuffer object present. These modes allow, by
- sacrificing some performance, redrawing only a smaller area on each paint and
- having the rest of the content preserved from of the previous frame. This is
- useful for applications than render incrementally using QPainter, because
- this way they do not have to redraw the entire window content on each
- paintGL() call.
-
- Similarly to QOpenGLWidget, QOpenGLWindow supports the Qt::AA_ShareOpenGLContexts
- attribute. When enabled, the OpenGL contexts of all QOpenGLWindow instances will share
- with each other. This allows accessing each other's shareable OpenGL resources.
-
- For more information on graphics in Qt, see \l {Graphics}.
- */
-
-/*!
- \enum QOpenGLWindow::UpdateBehavior
-
- This enum describes the update strategy of the QOpenGLWindow.
-
- \value NoPartialUpdate Indicates that the entire window surface will
- redrawn on each update and so no additional framebuffers are needed.
- This is the setting used in most cases and is equivalent to how drawing
- directly via QWindow would function.
-
- \value PartialUpdateBlit Indicates that the drawing performed in paintGL()
- does not cover the entire window. In this case an extra framebuffer object
- is created under the hood, and rendering performed in paintGL() will target
- this framebuffer. This framebuffer is then blitted onto the window surface's
- default framebuffer after each paint. This allows having QPainter-based drawing
- code in paintGL() which only repaints a smaller area at a time, because, unlike
- NoPartialUpdate, the previous content is preserved.
-
- \value PartialUpdateBlend Similar to PartialUpdateBlit, but instead of using
- framebuffer blits, the contents of the extra framebuffer is rendered by
- drawing a textured quad with blending enabled. This, unlike PartialUpdateBlit,
- allows alpha blended content and works even when the glBlitFramebuffer is
- not available. Performance-wise this setting is likely to be somewhat slower
- than PartialUpdateBlit.
- */
-
-/*!
- \fn void QOpenGLWindow::frameSwapped()
-
- This signal is emitted after the potentially blocking
- \l{QOpenGLContext::swapBuffers()}{buffer swap} has been done. Applications
- that wish to continuously repaint synchronized to the vertical refresh,
- should issue an update() upon this signal. This allows for a much smoother
- experience compared to the traditional usage of timers.
-*/
-
-// GLES2 builds won't have these constants with the suffixless names
-#ifndef GL_READ_FRAMEBUFFER
-#define GL_READ_FRAMEBUFFER 0x8CA8
-#endif
-#ifndef GL_DRAW_FRAMEBUFFER
-#define GL_DRAW_FRAMEBUFFER 0x8CA9
-#endif
-
-class QOpenGLWindowPaintDevice : public QOpenGLPaintDevice
-{
-public:
- QOpenGLWindowPaintDevice(QOpenGLWindow *window) : m_window(window) { }
- void ensureActiveTarget() override;
-
- QOpenGLWindow *m_window;
-};
-
-class QOpenGLWindowPrivate : public QPaintDeviceWindowPrivate
-{
- Q_DECLARE_PUBLIC(QOpenGLWindow)
-public:
- QOpenGLWindowPrivate(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior)
- : updateBehavior(updateBehavior)
- , hasFboBlit(false)
- , shareContext(shareContext)
- {
- if (!shareContext)
- this->shareContext = qt_gl_global_share_context();
- }
-
- ~QOpenGLWindowPrivate();
-
- static QOpenGLWindowPrivate *get(QOpenGLWindow *w) { return w->d_func(); }
-
- void bindFBO();
- void initialize();
-
- void beginPaint(const QRegion &region) override;
- void endPaint() override;
- void flush(const QRegion &region) override;
-
- QOpenGLWindow::UpdateBehavior updateBehavior;
- bool hasFboBlit;
- QScopedPointer<QOpenGLContext> context;
- QOpenGLContext *shareContext;
- QScopedPointer<QOpenGLFramebufferObject> fbo;
- QScopedPointer<QOpenGLWindowPaintDevice> paintDevice;
- QOpenGLTextureBlitter blitter;
- QColor backgroundColor;
- QScopedPointer<QOffscreenSurface> offscreenSurface;
-};
-
-QOpenGLWindowPrivate::~QOpenGLWindowPrivate()
-{
- Q_Q(QOpenGLWindow);
- if (q->isValid()) {
- q->makeCurrent(); // this works even when the platformwindow is destroyed
- paintDevice.reset(nullptr);
- fbo.reset(nullptr);
- blitter.destroy();
- q->doneCurrent();
- }
-}
-
-void QOpenGLWindowPrivate::initialize()
-{
- Q_Q(QOpenGLWindow);
-
- if (context)
- return;
-
- if (!q->handle())
- qWarning("Attempted to initialize QOpenGLWindow without a platform window");
-
- context.reset(new QOpenGLContext);
- context->setShareContext(shareContext);
- context->setFormat(q->requestedFormat());
- if (!context->create())
- qWarning("QOpenGLWindow::beginPaint: Failed to create context");
- if (!context->makeCurrent(q))
- qWarning("QOpenGLWindow::beginPaint: Failed to make context current");
-
- paintDevice.reset(new QOpenGLWindowPaintDevice(q));
- if (updateBehavior == QOpenGLWindow::PartialUpdateBlit)
- hasFboBlit = QOpenGLFramebufferObject::hasOpenGLFramebufferBlit();
-
- q->initializeGL();
-}
-
-void QOpenGLWindowPrivate::beginPaint(const QRegion &region)
-{
- Q_UNUSED(region);
- Q_Q(QOpenGLWindow);
-
- initialize();
- context->makeCurrent(q);
-
- const int deviceWidth = q->width() * q->devicePixelRatio();
- const int deviceHeight = q->height() * q->devicePixelRatio();
- const QSize deviceSize(deviceWidth, deviceHeight);
- if (updateBehavior > QOpenGLWindow::NoPartialUpdate) {
- if (!fbo || fbo->size() != deviceSize) {
- QOpenGLFramebufferObjectFormat fboFormat;
- fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
- const int samples = q->requestedFormat().samples();
- if (samples > 0) {
- if (updateBehavior != QOpenGLWindow::PartialUpdateBlend)
- fboFormat.setSamples(samples);
- else
- qWarning("QOpenGLWindow: PartialUpdateBlend does not support multisampling");
- }
- fbo.reset(new QOpenGLFramebufferObject(deviceSize, fboFormat));
- markWindowAsDirty();
- }
- } else {
- markWindowAsDirty();
- }
-
- paintDevice->setSize(QSize(deviceWidth, deviceHeight));
- paintDevice->setDevicePixelRatio(q->devicePixelRatio());
- context->functions()->glViewport(0, 0, deviceWidth, deviceHeight);
-
- context->functions()->glBindFramebuffer(GL_FRAMEBUFFER, context->defaultFramebufferObject());
-
- q->paintUnderGL();
-
- if (updateBehavior > QOpenGLWindow::NoPartialUpdate)
- fbo->bind();
-}
-
-void QOpenGLWindowPrivate::endPaint()
-{
- Q_Q(QOpenGLWindow);
-
- if (updateBehavior > QOpenGLWindow::NoPartialUpdate)
- fbo->release();
-
- context->functions()->glBindFramebuffer(GL_FRAMEBUFFER, context->defaultFramebufferObject());
-
- if (updateBehavior == QOpenGLWindow::PartialUpdateBlit && hasFboBlit) {
- const int deviceWidth = q->width() * q->devicePixelRatio();
- const int deviceHeight = q->height() * q->devicePixelRatio();
- QOpenGLExtensions extensions(context.data());
- extensions.glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo->handle());
- extensions.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, context->defaultFramebufferObject());
- extensions.glBlitFramebuffer(0, 0, deviceWidth, deviceHeight,
- 0, 0, deviceWidth, deviceHeight,
- GL_COLOR_BUFFER_BIT, GL_NEAREST);
- } else if (updateBehavior > QOpenGLWindow::NoPartialUpdate) {
- if (updateBehavior == QOpenGLWindow::PartialUpdateBlend) {
- context->functions()->glEnable(GL_BLEND);
- context->functions()->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
- if (!blitter.isCreated())
- blitter.create();
-
- QRect windowRect(QPoint(0, 0), fbo->size());
- QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(windowRect, windowRect);
- blitter.bind();
- blitter.blit(fbo->texture(), target, QOpenGLTextureBlitter::OriginBottomLeft);
- blitter.release();
-
- if (updateBehavior == QOpenGLWindow::PartialUpdateBlend)
- context->functions()->glDisable(GL_BLEND);
- }
-
- q->paintOverGL();
-}
-
-void QOpenGLWindowPrivate::bindFBO()
-{
- if (updateBehavior > QOpenGLWindow::NoPartialUpdate)
- fbo->bind();
- else
- QOpenGLFramebufferObject::bindDefault();
-}
-
-void QOpenGLWindowPrivate::flush(const QRegion &region)
-{
- Q_UNUSED(region);
- Q_Q(QOpenGLWindow);
- context->swapBuffers(q);
- emit q->frameSwapped();
-}
-
-void QOpenGLWindowPaintDevice::ensureActiveTarget()
-{
- QOpenGLWindowPrivate::get(m_window)->bindFBO();
-}
-
-/*!
- Constructs a new QOpenGLWindow with the given \a parent and \a updateBehavior.
-
- \sa QOpenGLWindow::UpdateBehavior
- */
-QOpenGLWindow::QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior, QWindow *parent)
- : QPaintDeviceWindow(*(new QOpenGLWindowPrivate(nullptr, updateBehavior)), parent)
-{
- setSurfaceType(QSurface::OpenGLSurface);
-}
-
-/*!
- Constructs a new QOpenGLWindow with the given \a parent and \a updateBehavior. The QOpenGLWindow's context will share with \a shareContext.
-
- \sa QOpenGLWindow::UpdateBehavior shareContext
-*/
-QOpenGLWindow::QOpenGLWindow(QOpenGLContext *shareContext, UpdateBehavior updateBehavior, QWindow *parent)
- : QPaintDeviceWindow(*(new QOpenGLWindowPrivate(shareContext, updateBehavior)), parent)
-{
- setSurfaceType(QSurface::OpenGLSurface);
-}
-
-/*!
- Destroys the QOpenGLWindow instance, freeing its resources.
-
- The OpenGLWindow's context is made current in the destructor, allowing for
- safe destruction of any child object that may need to release OpenGL
- resources belonging to the context provided by this window.
-
- \warning if you have objects wrapping OpenGL resources (such as
- QOpenGLBuffer, QOpenGLShaderProgram, etc.) as members of a QOpenGLWindow
- subclass, you may need to add a call to makeCurrent() in that subclass'
- destructor as well. Due to the rules of C++ object destruction, those objects
- will be destroyed \e{before} calling this function (but after that the
- destructor of the subclass has run), therefore making the OpenGL context
- current in this function happens too late for their safe disposal.
-
- \sa makeCurrent
-
- \since 5.5
-*/
-QOpenGLWindow::~QOpenGLWindow()
-{
- makeCurrent();
-}
-
-/*!
- \return the update behavior for this QOpenGLWindow.
-*/
-QOpenGLWindow::UpdateBehavior QOpenGLWindow::updateBehavior() const
-{
- Q_D(const QOpenGLWindow);
- return d->updateBehavior;
-}
-
-/*!
- \return \c true if the window's OpenGL resources, like the context, have
- been successfully initialized. Note that the return value is always \c false
- until the window becomes exposed (shown).
-*/
-bool QOpenGLWindow::isValid() const
-{
- Q_D(const QOpenGLWindow);
- return d->context && d->context->isValid();
-}
-
-/*!
- Prepares for rendering OpenGL content for this window by making the
- corresponding context current and binding the framebuffer object, if there is
- one, in that context context.
-
- It is not necessary to call this function in most cases, because it is called
- automatically before invoking paintGL(). It is provided nonetheless to support
- advanced, multi-threaded scenarios where a thread different than the GUI or main
- thread may want to update the surface or framebuffer contents. See QOpenGLContext
- for more information on threading related issues.
-
- This function is suitable for calling also when the underlying platform window
- is already destroyed. This means that it is safe to call this function from
- a QOpenGLWindow subclass' destructor. If there is no native window anymore,
- an offscreen surface is used instead. This ensures that OpenGL resource
- cleanup operations in the destructor will always work, as long as
- this function is called first.
-
- \sa QOpenGLContext, context(), paintGL(), doneCurrent()
- */
-void QOpenGLWindow::makeCurrent()
-{
- Q_D(QOpenGLWindow);
-
- if (!isValid())
- return;
-
- // The platform window may be destroyed at this stage and therefore
- // makeCurrent() may not safely be called with 'this'.
- if (handle()) {
- d->context->makeCurrent(this);
- } else {
- if (!d->offscreenSurface) {
- d->offscreenSurface.reset(new QOffscreenSurface(screen()));
- d->offscreenSurface->setFormat(d->context->format());
- d->offscreenSurface->create();
- }
- d->context->makeCurrent(d->offscreenSurface.data());
- }
-
- d->bindFBO();
-}
-
-/*!
- Releases the context.
-
- It is not necessary to call this function in most cases, since the widget
- will make sure the context is bound and released properly when invoking
- paintGL().
-
- \sa makeCurrent()
- */
-void QOpenGLWindow::doneCurrent()
-{
- Q_D(QOpenGLWindow);
-
- if (!isValid())
- return;
-
- d->context->doneCurrent();
-}
-
-/*!
- \return The QOpenGLContext used by this window or \c 0 if not yet initialized.
- */
-QOpenGLContext *QOpenGLWindow::context() const
-{
- Q_D(const QOpenGLWindow);
- return d->context.data();
-}
-
-/*!
- \return The QOpenGLContext requested to be shared with this window's QOpenGLContext.
-*/
-QOpenGLContext *QOpenGLWindow::shareContext() const
-{
- Q_D(const QOpenGLWindow);
- return d->shareContext;
-}
-
-/*!
- The framebuffer object handle used by this window.
-
- When the update behavior is set to \c NoPartialUpdate, there is no separate
- framebuffer object. In this case the returned value is the ID of the
- default framebuffer.
-
- Otherwise the value of the ID of the framebuffer object or \c 0 if not
- yet initialized.
- */
-GLuint QOpenGLWindow::defaultFramebufferObject() const
-{
- Q_D(const QOpenGLWindow);
- if (d->updateBehavior > NoPartialUpdate && d->fbo)
- return d->fbo->handle();
- else if (QOpenGLContext *ctx = QOpenGLContext::currentContext())
- return ctx->defaultFramebufferObject();
- else
- return 0;
-}
-
-extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha);
-
-/*!
- Returns a copy of the framebuffer.
-
- \note This is a potentially expensive operation because it relies on
- glReadPixels() to read back the pixels. This may be slow and can stall the
- GPU pipeline.
-
- \note When used together with update behavior \c NoPartialUpdate, the returned
- image may not contain the desired content when called after the front and back
- buffers have been swapped (unless preserved swap is enabled in the underlying
- windowing system interface). In this mode the function reads from the back
- buffer and the contents of that may not match the content on the screen (the
- front buffer). In this case the only place where this function can safely be
- used is paintGL() or paintOverGL().
- */
-QImage QOpenGLWindow::grabFramebuffer()
-{
- if (!isValid())
- return QImage();
-
- makeCurrent();
-
- const bool hasAlpha = format().hasAlpha();
- QImage img = qt_gl_read_framebuffer(size() * devicePixelRatio(), hasAlpha, hasAlpha);
- img.setDevicePixelRatio(devicePixelRatio());
- return img;
-}
-
-/*!
- This virtual function is called once before the first call to paintGL() or
- resizeGL(). Reimplement it in a subclass.
-
- This function should set up any required OpenGL resources and state.
-
- There is no need to call makeCurrent() because this has already been done
- when this function is called. Note however that the framebuffer, in case
- partial update mode is used, is not yet available at this stage, so avoid
- issuing draw calls from here. Defer such calls to paintGL() instead.
-
- \sa paintGL(), resizeGL()
- */
-void QOpenGLWindow::initializeGL()
-{
-}
-
-/*!
- This virtual function is called whenever the widget has been resized.
- Reimplement it in a subclass. The new size is passed in \a w and \a h.
-
- \note This is merely a convenience function in order to provide an API that is
- compatible with QOpenGLWidget. Unlike with QOpenGLWidget, derived classes are
- free to choose to override resizeEvent() instead of this function.
-
- \note Avoid issuing OpenGL commands from this function as there may not be a
- context current when it is invoked. If it cannot be avoided, call makeCurrent().
-
- \note Scheduling updates from here is not necessary. The windowing systems
- will send expose events that trigger an update automatically.
-
- \sa initializeGL(), paintGL()
- */
-void QOpenGLWindow::resizeGL(int w, int h)
-{
- Q_UNUSED(w);
- Q_UNUSED(h);
-}
-
-/*!
- This virtual function is called whenever the window contents needs to be
- painted. Reimplement it in a subclass.
-
- There is no need to call makeCurrent() because this has already
- been done when this function is called.
-
- Before invoking this function, the context and the framebuffer, if there is
- one, are bound, and the viewport is set up by a call to glViewport(). No
- other state is set and no clearing or drawing is performed by the framework.
-
- \note When using a partial update behavior, like \c PartialUpdateBlend, the
- output of the previous paintGL() call is preserved and, after the additional
- drawing perfomed in the current invocation of the function, the content is
- blitted or blended over the content drawn directly to the window in
- paintUnderGL().
-
- \sa initializeGL(), resizeGL(), paintUnderGL(), paintOverGL(), UpdateBehavior
- */
-void QOpenGLWindow::paintGL()
-{
-}
-
-/*!
- The virtual function is called before each invocation of paintGL().
-
- When the update mode is set to \c NoPartialUpdate, there is no difference
- between this function and paintGL(), performing rendering in either of them
- leads to the same result.
-
- The difference becomes significant when using \c PartialUpdateBlend, where an
- extra framebuffer object is used. There, paintGL() targets this additional
- framebuffer object, which preserves its contents, while paintUnderGL() and
- paintOverGL() target the default framebuffer, i.e. directly the window
- surface, the contents of which is lost after each displayed frame.
-
- \note Avoid relying on this function when the update behavior is
- \c PartialUpdateBlit. This mode involves blitting the extra framebuffer used by
- paintGL() onto the default framebuffer after each invocation of paintGL(),
- thus overwriting all drawing generated in this function.
-
- \sa paintGL(), paintOverGL(), UpdateBehavior
- */
-void QOpenGLWindow::paintUnderGL()
-{
-}
-
-/*!
- This virtual function is called after each invocation of paintGL().
-
- When the update mode is set to NoPartialUpdate, there is no difference
- between this function and paintGL(), performing rendering in either of them
- leads to the same result.
-
- Like paintUnderGL(), rendering in this function targets the default
- framebuffer of the window, regardless of the update behavior. It gets called
- after paintGL() has returned and the blit (PartialUpdateBlit) or quad drawing
- (PartialUpdateBlend) has been done.
-
- \sa paintGL(), paintUnderGL(), UpdateBehavior
- */
-void QOpenGLWindow::paintOverGL()
-{
-}
-
-/*!
- Paint \a event handler. Calls paintGL().
-
- \sa paintGL()
- */
-void QOpenGLWindow::paintEvent(QPaintEvent *event)
-{
- Q_UNUSED(event);
- paintGL();
-}
-
-/*!
- Resize \a event handler. Calls resizeGL().
-
- \sa resizeGL()
- */
-void QOpenGLWindow::resizeEvent(QResizeEvent *event)
-{
- Q_UNUSED(event);
- Q_D(QOpenGLWindow);
- d->initialize();
- resizeGL(width(), height());
-}
-
-/*!
- \internal
- */
-int QOpenGLWindow::metric(PaintDeviceMetric metric) const
-{
- Q_D(const QOpenGLWindow);
-
- switch (metric) {
- case PdmDepth:
- if (d->paintDevice)
- return d->paintDevice->depth();
- break;
- default:
- break;
- }
- return QPaintDeviceWindow::metric(metric);
-}
-
-/*!
- \internal
- */
-QPaintDevice *QOpenGLWindow::redirected(QPoint *) const
-{
- Q_D(const QOpenGLWindow);
- if (QOpenGLContext::currentContext() == d->context.data())
- return d->paintDevice.data();
- return nullptr;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/kernel/qopenglwindow.h b/src/gui/kernel/qopenglwindow.h
deleted file mode 100644
index 7b3bf004a3..0000000000
--- a/src/gui/kernel/qopenglwindow.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLWINDOW_H
-#define QOPENGLWINDOW_H
-
-#include <QtGui/qtguiglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtGui/QPaintDeviceWindow>
-#include <QtGui/QOpenGLContext>
-#include <QtGui/QImage>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLWindowPrivate;
-
-class Q_GUI_EXPORT QOpenGLWindow : public QPaintDeviceWindow
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QOpenGLWindow)
-
-public:
- enum UpdateBehavior {
- NoPartialUpdate,
- PartialUpdateBlit,
- PartialUpdateBlend
- };
-
- explicit QOpenGLWindow(UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr);
- explicit QOpenGLWindow(QOpenGLContext *shareContext, UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr);
- ~QOpenGLWindow();
-
- UpdateBehavior updateBehavior() const;
- bool isValid() const;
-
- void makeCurrent();
- void doneCurrent();
-
- QOpenGLContext *context() const;
- QOpenGLContext *shareContext() const;
-
- GLuint defaultFramebufferObject() const;
-
- QImage grabFramebuffer();
-
-Q_SIGNALS:
- void frameSwapped();
-
-protected:
- virtual void initializeGL();
- virtual void resizeGL(int w, int h);
- virtual void paintGL();
- virtual void paintUnderGL();
- virtual void paintOverGL();
-
- void paintEvent(QPaintEvent *event) override;
- void resizeEvent(QResizeEvent *event) override;
- int metric(PaintDeviceMetric metric) const override;
- QPaintDevice *redirected(QPoint *) const override;
-
-private:
- Q_DISABLE_COPY(QOpenGLWindow)
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-
-#endif
diff --git a/src/gui/kernel/qpalette.cpp b/src/gui/kernel/qpalette.cpp
index 397c50f3dc..f6180be8a8 100644
--- a/src/gui/kernel/qpalette.cpp
+++ b/src/gui/kernel/qpalette.cpp
@@ -44,10 +44,28 @@
#include "qvariant.h"
#include "qdebug.h"
+#include <QtCore/qmetaobject.h>
+
QT_BEGIN_NAMESPACE
static int qt_palette_count = 1;
+static constexpr QPalette::ResolveMask colorRoleOffset(QPalette::ColorGroup colorGroup)
+{
+ return QPalette::NColorRoles * colorGroup;
+}
+
+static constexpr QPalette::ResolveMask bitPosition(QPalette::ColorGroup colorGroup,
+ QPalette::ColorRole colorRole)
+{
+ return colorRole + colorRoleOffset(colorGroup);
+}
+
+Q_STATIC_ASSERT_X(bitPosition(QPalette::ColorGroup(QPalette::NColorGroups - 1),
+ QPalette::ColorRole(QPalette::NColorRoles - 1))
+ < sizeof(QPalette::ResolveMask) * CHAR_BIT,
+ "The resolve mask type is not wide enough to fit the entire bit mask.");
+
class QPalettePrivate {
public:
QPalettePrivate() : ref(1), ser_no(qt_palette_count++), detach_no(0) { }
@@ -321,11 +339,8 @@ static void qt_palette_from_color(QPalette &pal, const QColor &button)
Returns the placeholder text brush of the current color group.
- \note Before Qt 5.12, the placeholder text color was hard-coded in the code as
- QPalette::text().color() where an alpha of 128 was applied.
- We continue to support this behavior by default, unless you set your own brush.
- One can get back the original placeholder color setting the special QBrush default
- constructor as placeholder brush.
+ \note Before Qt 5.12, the placeholder text color was hard-coded as QPalette::text().color()
+ with an alpha of 128 applied. In Qt 6, it is an independent color.
\sa ColorRole, brush()
*/
@@ -538,8 +553,6 @@ static void qt_palette_from_color(QPalette &pal, const QColor &button)
QPalette::QPalette()
: d(nullptr)
{
- data.current_group = Active;
- data.resolve_mask = 0;
// Initialize to application palette if present, else default to black.
// This makes it possible to instantiate QPalette outside QGuiApplication,
// for example in the platform plugins.
@@ -549,7 +562,7 @@ QPalette::QPalette()
} else {
init();
qt_palette_from_color(*this, Qt::black);
- data.resolve_mask = 0;
+ data.resolveMask = 0;
}
}
@@ -681,8 +694,6 @@ QPalette::~QPalette()
/*!\internal*/
void QPalette::init() {
d = new QPalettePrivate;
- data.resolve_mask = 0;
- data.current_group = Active; //as a default..
}
/*!
@@ -739,7 +750,7 @@ const QBrush &QPalette::brush(ColorGroup gr, ColorRole cr) const
Q_ASSERT(cr < NColorRoles);
if(gr >= (int)NColorGroups) {
if(gr == Current) {
- gr = (ColorGroup)data.current_group;
+ gr = data.currentGroup;
} else {
qWarning("QPalette::brush: Unknown ColorGroup: %d", (int)gr);
gr = Active;
@@ -777,38 +788,18 @@ void QPalette::setBrush(ColorGroup cg, ColorRole cr, const QBrush &b)
}
if (cg == Current) {
- cg = ColorGroup(data.current_group);
+ cg = data.currentGroup;
} else if (cg >= NColorGroups) {
qWarning("QPalette::setBrush: Unknown ColorGroup: %d", cg);
cg = Active;
}
- // For placeholder we want to continue to respect the original behavior, which is
- // derivating the text color, but only if user has not yet set his own brush.
- // We then use Qt::NoBrush as an inernal way to know if the brush is customized or not.
-
- // ### Qt 6 - remove this special case
- // Part 1 - Restore initial color to the given color group
- if (cr == PlaceholderText && b == QBrush()) {
- QColor col = brush(Text).color();
- col.setAlpha(128);
- setBrush(cg, PlaceholderText, QBrush(col, Qt::NoBrush));
- return;
- }
-
if (d->br[cg][cr] != b) {
detach();
d->br[cg][cr] = b;
}
- data.resolve_mask |= (1<<cr);
-
- // ### Qt 6 - remove this special case
- // Part 2 - Update initial color to the given color group
- if (cr == Text && d->br[cg][PlaceholderText].style() == Qt::NoBrush) {
- QColor col = brush(Text).color();
- col.setAlpha(128);
- setBrush(cg, PlaceholderText, QBrush(col, Qt::NoBrush));
- }
+
+ data.resolveMask |= ResolveMask(1) << bitPosition(cg, cr);
}
/*!
@@ -817,12 +808,30 @@ void QPalette::setBrush(ColorGroup cg, ColorRole cr, const QBrush &b)
Returns \c true if the ColorGroup \a cg and ColorRole \a cr has been
set previously on this palette; otherwise returns \c false.
- \sa setBrush()
+ The ColorGroup \a cg should be less than QPalette::NColorGroups,
+ but you can use QPalette::Current. In this case, the previously
+ set current color group will be used.
+
+ The ColorRole \a cr should be less than QPalette::NColorRoles.
+
+ \sa setBrush(), currentColorGroup()
*/
bool QPalette::isBrushSet(ColorGroup cg, ColorRole cr) const
{
- Q_UNUSED(cg);
- return (data.resolve_mask & (1<<cr));
+ if (cg == Current)
+ cg = data.currentGroup;
+
+ if (cg >= NColorGroups) {
+ qWarning() << "Wrong color group:" << cg;
+ return false;
+ }
+
+ if (cr >= NColorRoles) {
+ qWarning() << "Wrong color role:" << cr;
+ return false;
+ }
+
+ return data.resolveMask & (ResolveMask(1) << bitPosition(cg, cr));
}
/*!
@@ -887,7 +896,7 @@ bool QPalette::isEqual(QPalette::ColorGroup group1, QPalette::ColorGroup group2)
{
if(group1 >= (int)NColorGroups) {
if(group1 == Current) {
- group1 = (ColorGroup)data.current_group;
+ group1 = data.currentGroup;
} else {
qWarning("QPalette::brush: Unknown ColorGroup(1): %d", (int)group1);
group1 = Active;
@@ -895,7 +904,7 @@ bool QPalette::isEqual(QPalette::ColorGroup group1, QPalette::ColorGroup group2)
}
if(group2 >= (int)NColorGroups) {
if(group2 == Current) {
- group2 = (ColorGroup)data.current_group;
+ group2 = data.currentGroup;
} else {
qWarning("QPalette::brush: Unknown ColorGroup(2): %d", (int)group2);
group2 = Active;
@@ -946,21 +955,25 @@ qint64 QPalette::cacheKey() const
*/
QPalette QPalette::resolve(const QPalette &other) const
{
- if ((*this == other && data.resolve_mask == other.data.resolve_mask)
- || data.resolve_mask == 0) {
+ if ((*this == other && data.resolveMask == other.data.resolveMask)
+ || data.resolveMask == 0) {
QPalette o = other;
- o.data.resolve_mask = data.resolve_mask;
+ o.data.resolveMask = data.resolveMask;
return o;
}
QPalette palette(*this);
palette.detach();
- for(int role = 0; role < (int)NColorRoles; role++)
- if (!(data.resolve_mask & (1<<role)))
- for(int grp = 0; grp < (int)NColorGroups; grp++)
+ for (int role = 0; role < int(NColorRoles); ++role) {
+ for (int grp = 0; grp < int(NColorGroups); ++grp) {
+ if (!(data.resolveMask & (ResolveMask(1) << bitPosition(ColorGroup(grp), ColorRole(role))))) {
palette.d->br[grp][role] = other.d->br[grp][role];
- palette.data.resolve_mask |= other.data.resolve_mask;
+ }
+ }
+ }
+
+ palette.data.resolveMask |= other.data.resolveMask;
return palette;
}
@@ -971,7 +984,12 @@ QPalette QPalette::resolve(const QPalette &other) const
*/
/*!
- \fn void QPalette::resolve(uint mask)
+ \typedef ResolveMaskType
+ \internal
+ */
+
+/*!
+ \fn void QPalette::resolve(ResolveMaskType mask)
\internal
*/
@@ -1105,10 +1123,15 @@ void QPalette::setColorGroup(ColorGroup cg, const QBrush &windowText, const QBru
QBrush(Qt::blue), QBrush(Qt::magenta), QBrush(toolTipBase),
QBrush(toolTipText));
- data.resolve_mask &= ~(1 << Highlight);
- data.resolve_mask &= ~(1 << HighlightedText);
- data.resolve_mask &= ~(1 << LinkVisited);
- data.resolve_mask &= ~(1 << Link);
+ for (int cr = Highlight; cr <= LinkVisited; ++cr) {
+ if (cg == All) {
+ for (int group = Active; group < NColorGroups; ++group) {
+ data.resolveMask &= ~(ResolveMask(1) << bitPosition(ColorGroup(group), ColorRole(cr)));
+ }
+ } else {
+ data.resolveMask &= ~(ResolveMask(1) << bitPosition(ColorGroup(cg), ColorRole(cr)));
+ }
+ }
}
@@ -1177,6 +1200,8 @@ Q_GUI_EXPORT QPalette qt_fusionPalette()
QColor button = backGround;
QColor shadow = dark.darker(135);
QColor disabledShadow = shadow.lighter(150);
+ QColor placeholder = text;
+ placeholder.setAlpha(128);
QPalette fusionPalette(Qt::black,backGround,light,dark,mid,text,base);
fusionPalette.setBrush(QPalette::Midlight, midLight);
@@ -1194,40 +1219,65 @@ Q_GUI_EXPORT QPalette qt_fusionPalette()
fusionPalette.setBrush(QPalette::Active, QPalette::Highlight, QColor(48, 140, 198));
fusionPalette.setBrush(QPalette::Inactive, QPalette::Highlight, QColor(48, 140, 198));
fusionPalette.setBrush(QPalette::Disabled, QPalette::Highlight, QColor(145, 145, 145));
+
+ fusionPalette.setBrush(QPalette::PlaceholderText, placeholder);
+
return fusionPalette;
}
#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug dbg, const QPalette &p)
+static QString groupsToString(const QPalette &p, QPalette::ColorRole cr)
{
- const char *colorGroupNames[] = {"Active", "Disabled", "Inactive"};
- const char *colorRoleNames[] =
- {"WindowText", "Button", "Light", "Midlight", "Dark", "Mid", "Text",
- "BrightText", "ButtonText", "Base", "Window", "Shadow", "Highlight",
- "HighlightedText", "Link", "LinkVisited", "AlternateBase", "NoRole",
- "ToolTipBase","ToolTipText", "PlaceholderText" };
- QDebugStateSaver saver(dbg);
- QDebug nospace = dbg.nospace();
- const uint mask = p.resolve();
- nospace << "QPalette(resolve=" << Qt::hex << Qt::showbase << mask << ',';
- for (int role = 0; role < (int)QPalette::NColorRoles; ++role) {
- if (mask & (1<<role)) {
- if (role)
- nospace << ',';
- nospace << colorRoleNames[role] << ":[";
- for (int group = 0; group < (int)QPalette::NColorGroups; ++group) {
- if (group)
- nospace << ',';
- const QRgb color = p.color(static_cast<QPalette::ColorGroup>(group),
- static_cast<QPalette::ColorRole>(role)).rgba();
- nospace << colorGroupNames[group] << ':' << color;
- }
- nospace << ']';
+ const auto groupEnum = QMetaEnum::fromType<QPalette::ColorGroup>();
+
+ QString groupString;
+ for (int group = 0; group < QPalette::NColorGroups; ++group) {
+ const auto cg = QPalette::ColorGroup(group);
+
+ if (p.isBrushSet(cg, cr)) {
+ const auto &color = p.color(cg, cr);
+ groupString += QString::fromUtf8(groupEnum.valueToKey(cg)) + QLatin1Char(':') +
+ color.name(QColor::HexArgb) + QLatin1Char(',');
}
}
- nospace << ')' << Qt::noshowbase << Qt::dec;
- return dbg;
+ groupString.chop(1);
+
+ return groupString;
}
+
+static QString rolesToString(const QPalette &p)
+{
+ const auto roleEnum = QMetaEnum::fromType<QPalette::ColorRole>();
+
+ QString roleString;
+ for (int role = 0; role < QPalette::NColorRoles; ++role) {
+ const auto cr = QPalette::ColorRole(role);
+
+ auto groupString = groupsToString(p, cr);
+ if (!groupString.isEmpty())
+ roleString += QString::fromUtf8(roleEnum.valueToKey(cr)) + QStringLiteral(":[") +
+ groupString + QStringLiteral("],");
+ }
+ roleString.chop(1);
+
+ return roleString;
+}
+
+QDebug operator<<(QDebug dbg, const QPalette &p)
+{
+ QDebugStateSaver saver(dbg);
+ dbg.nospace();
+
+ dbg << "QPalette(resolve=" << Qt::hex << Qt::showbase << p.resolve();
+
+ auto roleString = rolesToString(p);
+ if (!roleString.isEmpty())
+ dbg << ',' << roleString;
+
+ dbg << ')';
+
+ return dbg;
+ }
#endif
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qpalette.h b/src/gui/kernel/qpalette.h
index d3a840d9ad..fd0ef2e2d9 100644
--- a/src/gui/kernel/qpalette.h
+++ b/src/gui/kernel/qpalette.h
@@ -72,14 +72,13 @@ public:
{ other.d = nullptr; }
inline QPalette &operator=(QPalette &&other) noexcept
{
- for_faster_swapping_dont_use = other.for_faster_swapping_dont_use;
- qSwap(d, other.d); return *this;
+ swap(other); return *this;
}
void swap(QPalette &other) noexcept
{
+ qSwap(data, other.data);
qSwap(d, other.d);
- qSwap(for_faster_swapping_dont_use, other.for_faster_swapping_dont_use);
}
operator QVariant() const;
@@ -103,8 +102,8 @@ public:
};
Q_ENUM(ColorRole)
- inline ColorGroup currentColorGroup() const { return static_cast<ColorGroup>(data.current_group); }
- inline void setCurrentColorGroup(ColorGroup cg) { data.current_group = cg; }
+ inline ColorGroup currentColorGroup() const { return data.currentGroup; }
+ inline void setCurrentColorGroup(ColorGroup cg) { data.currentGroup = cg; }
inline const QColor &color(ColorGroup cg, ColorRole cr) const
{ return brush(cg, cr).color(); }
@@ -158,9 +157,11 @@ public:
#endif
qint64 cacheKey() const;
- QPalette resolve(const QPalette &) const;
- inline uint resolve() const { return data.resolve_mask; }
- inline void resolve(uint mask) { data.resolve_mask = mask; }
+ QPalette resolve(const QPalette &other) const;
+
+ using ResolveMask = quint64;
+ inline ResolveMask resolve() const { return data.resolveMask; }
+ inline void resolve(ResolveMask mask) { data.resolveMask = mask; }
private:
void setColorGroup(ColorGroup cr, const QBrush &windowText, const QBrush &button,
@@ -185,13 +186,11 @@ private:
QPalettePrivate *d;
struct Data {
- uint current_group : 4;
- uint resolve_mask : 28;
- };
- union {
- Data data;
- quint32 for_faster_swapping_dont_use;
+ ResolveMask resolveMask{0};
+ ColorGroup currentGroup{Active};
};
+ Data data;
+
friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &s, const QPalette &p);
};
diff --git a/src/gui/kernel/qplatformcursor.cpp b/src/gui/kernel/qplatformcursor.cpp
index 5a438a54a2..1330b5bf31 100644
--- a/src/gui/kernel/qplatformcursor.cpp
+++ b/src/gui/kernel/qplatformcursor.cpp
@@ -622,7 +622,7 @@ void QPlatformCursorImage::set(const uchar *data, const uchar *mask,
int x = -1, w = 0;
uchar *cursor_data = cursorImage.bits();
- int bpl = cursorImage.bytesPerLine();
+ qsizetype bpl = cursorImage.bytesPerLine();
for (int i = 0; i < height; i++)
{
for (int j = 0; j < bytesPerLine; j++, data++, mask++)
diff --git a/src/gui/kernel/qplatformdialoghelper.cpp b/src/gui/kernel/qplatformdialoghelper.cpp
index 33cd004234..443f5d2552 100644
--- a/src/gui/kernel/qplatformdialoghelper.cpp
+++ b/src/gui/kernel/qplatformdialoghelper.cpp
@@ -790,6 +790,7 @@ QStringList QPlatformFileDialogHelper::cleanFilterList(const QString &filter)
f = match.captured(2);
return f.split(QLatin1Char(' '), Qt::SkipEmptyParts);
#else
+ Q_UNUSED(filter)
return QStringList();
#endif
}
diff --git a/src/gui/kernel/qplatformgraphicsbufferhelper.cpp b/src/gui/kernel/qplatformgraphicsbufferhelper.cpp
index c67e6d15cb..34cb7d0274 100644
--- a/src/gui/kernel/qplatformgraphicsbufferhelper.cpp
+++ b/src/gui/kernel/qplatformgraphicsbufferhelper.cpp
@@ -213,7 +213,7 @@ bool QPlatformGraphicsBufferHelper::bindSWToTexture(const QPlatformGraphicsBuffe
if (rect.isNull() || rect == QRect(QPoint(0,0),size)) {
funcs->glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, size.width(), size.height(), 0, GL_RGBA, pixelType, image.constBits());
} else {
-#ifndef QT_OPENGL_ES_2
+#if !QT_CONFIG(opengles2)
if (!ctx->isOpenGLES()) {
funcs->glPixelStorei(GL_UNPACK_ROW_LENGTH, image.width());
funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, rect.x(), rect.y(), rect.width(), rect.height(), GL_RGBA, pixelType,
diff --git a/src/gui/kernel/qplatformgraphicsbufferhelper.h b/src/gui/kernel/qplatformgraphicsbufferhelper.h
index bfe61713d4..36afd4877b 100644
--- a/src/gui/kernel/qplatformgraphicsbufferhelper.h
+++ b/src/gui/kernel/qplatformgraphicsbufferhelper.h
@@ -46,7 +46,7 @@
QT_BEGIN_NAMESPACE
namespace QPlatformGraphicsBufferHelper {
- bool lockAndBindToTexture(QPlatformGraphicsBuffer *graphicsBuffer, bool *swizzleRandB, bool *premultipliedB, const QRect &rect = QRect());
+ Q_GUI_EXPORT bool lockAndBindToTexture(QPlatformGraphicsBuffer *graphicsBuffer, bool *swizzleRandB, bool *premultipliedB, const QRect &rect = QRect());
bool bindSWToTexture(const QPlatformGraphicsBuffer *graphicsBuffer, bool *swizzleRandB = nullptr, bool *premultipliedB = nullptr, const QRect &rect = QRect());
}
diff --git a/src/gui/kernel/qplatformmenu.h b/src/gui/kernel/qplatformmenu.h
index 28c29a704c..8e470aefd3 100644
--- a/src/gui/kernel/qplatformmenu.h
+++ b/src/gui/kernel/qplatformmenu.h
@@ -52,7 +52,9 @@
#include <QtGui/qtguiglobal.h>
#include <QtCore/qpointer.h>
#include <QtGui/QFont>
-#include <QtGui/QKeySequence>
+#if QT_CONFIG(shortcut)
+# include <QtGui/QKeySequence>
+#endif
#include <QtGui/QIcon>
QT_BEGIN_NAMESPACE
@@ -85,7 +87,7 @@ public:
virtual void setRole(MenuRole role) = 0;
virtual void setCheckable(bool checkable) = 0;
virtual void setChecked(bool isChecked) = 0;
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
virtual void setShortcut(const QKeySequence& shortcut) = 0;
#endif
virtual void setEnabled(bool enabled) = 0;
diff --git a/src/gui/kernel/qplatformtheme.cpp b/src/gui/kernel/qplatformtheme.cpp
index 71521c0339..93fd59e53f 100644
--- a/src/gui/kernel/qplatformtheme.cpp
+++ b/src/gui/kernel/qplatformtheme.cpp
@@ -167,7 +167,7 @@ QT_BEGIN_NAMESPACE
*/
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
// Table of key bindings. It must be sorted on key sequence:
// The integer value of VK_KEY | Modifier Keys (e.g., VK_META, and etc.)
// A priority of 1 indicates that this is the primary key binding when multiple are defined.
@@ -623,7 +623,7 @@ static inline int maybeSwapShortcut(int shortcut)
}
#endif
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
// mixed-mode predicate: all of these overloads are actually needed (but not all for every compiler)
struct ByStandardKey {
typedef bool result_type;
@@ -688,6 +688,7 @@ QString QPlatformTheme::standardButtonText(int button) const
return QPlatformTheme::defaultStandardButtonText(button);
}
+#if QT_CONFIG(shortcut)
/*!
Returns the mnemonic that should be used for a standard \a button.
@@ -700,6 +701,7 @@ QKeySequence QPlatformTheme::standardButtonShortcut(int button) const
Q_UNUSED(button)
return QKeySequence();
}
+#endif // QT_CONFIG(shortcut)
QString QPlatformTheme::defaultStandardButtonText(int button)
{
@@ -784,7 +786,7 @@ unsigned QPlatformThemePrivate::currentKeyPlatforms()
{
const uint keyboardScheme = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::KeyboardScheme).toInt();
unsigned result = 1u << keyboardScheme;
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
if (keyboardScheme == QPlatformTheme::KdeKeyboardScheme
|| keyboardScheme == QPlatformTheme::GnomeKeyboardScheme
|| keyboardScheme == QPlatformTheme::CdeKeyboardScheme)
diff --git a/src/gui/kernel/qplatformtheme.h b/src/gui/kernel/qplatformtheme.h
index 3185fc4541..6ed612b785 100644
--- a/src/gui/kernel/qplatformtheme.h
+++ b/src/gui/kernel/qplatformtheme.h
@@ -51,7 +51,9 @@
#include <QtGui/qtguiglobal.h>
#include <QtCore/QScopedPointer>
-#include <QtGui/QKeySequence>
+#if QT_CONFIG(shortcut)
+# include <QtGui/QKeySequence>
+#endif
QT_BEGIN_NAMESPACE
@@ -312,12 +314,14 @@ public:
QPlatformTheme::IconOptions iconOptions = { }) const;
virtual QIconEngine *createIconEngine(const QString &iconName) const;
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
virtual QList<QKeySequence> keyBindings(QKeySequence::StandardKey key) const;
#endif
virtual QString standardButtonText(int button) const;
+#if QT_CONFIG(shortcut)
virtual QKeySequence standardButtonShortcut(int button) const;
+#endif
static QVariant defaultThemeHint(ThemeHint hint);
static QString defaultStandardButtonText(int button);
diff --git a/src/gui/kernel/qplatformtheme_p.h b/src/gui/kernel/qplatformtheme_p.h
index 73deb890bb..2c16fec141 100644
--- a/src/gui/kernel/qplatformtheme_p.h
+++ b/src/gui/kernel/qplatformtheme_p.h
@@ -52,7 +52,9 @@
//
#include <QtGui/private/qtguiglobal_p.h>
-#include "private/qkeysequence_p.h"
+#if QT_CONFIG(shortcut)
+# include "private/qkeysequence_p.h"
+#endif
QT_BEGIN_NAMESPACE
@@ -67,7 +69,7 @@ public:
void initializeSystemPalette();
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
static const QKeyBinding keyBindings[];
static const uint numberOfKeyBindings;
#endif
diff --git a/src/gui/kernel/qshortcut.cpp b/src/gui/kernel/qshortcut.cpp
new file mode 100644
index 0000000000..c4305d5a7f
--- /dev/null
+++ b/src/gui/kernel/qshortcut.cpp
@@ -0,0 +1,483 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qshortcut.h"
+#include "qshortcut_p.h"
+
+#include <qevent.h>
+#include <qguiapplication.h>
+#include <qwindow.h>
+#include <private/qguiapplication_p.h>
+#include <qpa/qplatformmenu.h>
+
+QT_BEGIN_NAMESPACE
+
+#define QAPP_CHECK(functionName) \
+ if (Q_UNLIKELY(!qApp)) { \
+ qWarning("QShortcut: Initialize QGuiApplication before calling '" functionName "'."); \
+ return; \
+ }
+
+/*!
+ \class QShortcut
+ \brief The QShortcut class is used to create keyboard shortcuts.
+
+ \ingroup events
+ \inmodule QtGui
+
+ The QShortcut class provides a way of connecting keyboard
+ shortcuts to Qt's \l{signals and slots} mechanism, so that
+ objects can be informed when a shortcut is executed. The shortcut
+ can be set up to contain all the key presses necessary to
+ describe a keyboard shortcut, including the states of modifier
+ keys such as \uicontrol Shift, \uicontrol Ctrl, and \uicontrol Alt.
+
+ \target mnemonic
+
+ In widget applications, certain widgets can use '&' in front of a character.
+ This will automatically create a mnemonic (a shortcut) for that character,
+ e.g. "E&xit" will create the shortcut \uicontrol Alt+X (use '&&'
+ to display an actual ampersand). The widget might consume and perform
+ an action on a given shortcut. On X11 the ampersand will not be
+ shown and the character will be underlined. On Windows, shortcuts
+ are normally not displayed until the user presses the \uicontrol Alt
+ key, but this is a setting the user can change. On Mac, shortcuts
+ are disabled by default. Call \l qt_set_sequence_auto_mnemonic() to
+ enable them. However, because mnemonic shortcuts do not fit in
+ with Aqua's guidelines, Qt will not show the shortcut character
+ underlined.
+
+ For applications that use menus, it may be more convenient to
+ use the convenience functions provided in the QMenu class to
+ assign keyboard shortcuts to menu items as they are created.
+ Alternatively, shortcuts may be associated with other types of
+ actions in the QAction class.
+
+ The simplest way to create a shortcut for a particular widget is
+ to construct the shortcut with a key sequence. For example:
+
+ \snippet code/src_gui_kernel_qshortcut.cpp 0
+
+ When the user types the \l{QKeySequence}{key sequence}
+ for a given shortcut, the shortcut's activated() signal is
+ emitted. (In the case of ambiguity, the activatedAmbiguously()
+ signal is emitted.) A shortcut is "listened for" by Qt's event
+ loop when the shortcut's parent widget is receiving events.
+
+ A shortcut's key sequence can be set with setKey() and retrieved
+ with key(). A shortcut can be enabled or disabled with
+ setEnabled(), and can have "What's This?" help text set with
+ setWhatsThis().
+
+ \sa QShortcutEvent, QKeySequence, QAction
+*/
+
+/*!
+ \fn void QShortcut::activated()
+
+ This signal is emitted when the user types the shortcut's key
+ sequence.
+
+ \sa activatedAmbiguously()
+*/
+
+/*!
+ \fn void QShortcut::activatedAmbiguously()
+
+ When a key sequence is being typed at the keyboard, it is said to
+ be ambiguous as long as it matches the start of more than one
+ shortcut.
+
+ When a shortcut's key sequence is completed,
+ activatedAmbiguously() is emitted if the key sequence is still
+ ambiguous (i.e., it is the start of one or more other shortcuts).
+ The activated() signal is not emitted in this case.
+
+ \sa activated()
+*/
+
+static bool simpleContextMatcher(QObject *object, Qt::ShortcutContext context)
+{
+ auto guiShortcut = qobject_cast<QShortcut *>(object);
+ if (QGuiApplication::applicationState() != Qt::ApplicationActive || guiShortcut == nullptr)
+ return false;
+ if (context == Qt::ApplicationShortcut)
+ return true;
+ auto focusWindow = QGuiApplication::focusWindow();
+ if (!focusWindow)
+ return false;
+ auto window = qobject_cast<const QWindow *>(guiShortcut->parent());
+ if (!window)
+ return false;
+ if (focusWindow == window && focusWindow->isTopLevel())
+ return context == Qt::WindowShortcut || context == Qt::WidgetWithChildrenShortcut;
+ return focusWindow->isAncestorOf(window, QWindow::ExcludeTransients);
+}
+
+QShortcutMap::ContextMatcher QShortcutPrivate::contextMatcher() const
+{
+ return simpleContextMatcher;
+}
+
+void QShortcutPrivate::redoGrab(QShortcutMap &map)
+{
+ Q_Q(QShortcut);
+ if (Q_UNLIKELY(!parent)) {
+ qWarning("QShortcut: No window parent defined");
+ return;
+ }
+
+ if (sc_id)
+ map.removeShortcut(sc_id, q);
+ if (sc_sequence.isEmpty())
+ return;
+ sc_id = map.addShortcut(q, sc_sequence, sc_context, contextMatcher());
+ if (!sc_enabled)
+ map.setShortcutEnabled(false, sc_id, q);
+ if (!sc_autorepeat)
+ map.setShortcutAutoRepeat(false, sc_id, q);
+}
+
+QShortcutPrivate *QGuiApplicationPrivate::createShortcutPrivate() const
+{
+ return new QShortcutPrivate;
+}
+
+/*!
+ Constructs a QShortcut object for the \a parent, which should be a
+ QWindow or a QWidget.
+
+ Since no shortcut key sequence is specified, the shortcut will not emit any
+ signals.
+
+ \sa setKey()
+*/
+QShortcut::QShortcut(QObject *parent)
+ : QObject(*QGuiApplicationPrivate::instance()->createShortcutPrivate(), parent)
+{
+ Q_ASSERT(parent != nullptr);
+}
+
+/*!
+ Constructs a QShortcut object for the \a parent, which should be a
+ QWindow or a QWidget.
+
+ The shortcut operates on its parent, listening for \l{QShortcutEvent}s that
+ match the \a key sequence. Depending on the ambiguity of the event, the
+ shortcut will call the \a member function, or the \a ambiguousMember function,
+ if the key press was in the shortcut's \a context.
+*/
+QShortcut::QShortcut(const QKeySequence &key, QObject *parent,
+ const char *member, const char *ambiguousMember,
+ Qt::ShortcutContext context)
+ : QShortcut(parent)
+{
+ Q_D(QShortcut);
+ d->sc_context = context;
+ d->sc_sequence = key;
+ d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
+ if (member)
+ connect(this, SIGNAL(activated()), parent, member);
+ if (ambiguousMember)
+ connect(this, SIGNAL(activatedAmbiguously()), parent, ambiguousMember);
+}
+
+
+/*!
+ \fn template<typename Functor>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ Functor functor,
+ Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
+ \since 5.15
+ \overload
+
+ This is a QShortcut convenience constructor which connects the shortcut's
+ \l{QShortcut::activated()}{activated()} signal to the \a functor.
+*/
+/*!
+ \fn template<typename Functor>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ const QObject *context, Functor functor,
+ Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
+ \since 5.15
+ \overload
+
+ This is a QShortcut convenience constructor which connects the shortcut's
+ \l{QShortcut::activated()}{activated()} signal to the \a functor.
+
+ The \a functor can be a pointer to a member function of the \a context object.
+
+ If the \a context object is destroyed, the \a functor will not be called.
+*/
+/*!
+ \fn template<typename Functor, typename FunctorAmbiguous>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ const QObject *context1, Functor functor,
+ FunctorAmbiguous functorAmbiguous,
+ Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
+ \since 5.15
+ \overload
+
+ This is a QShortcut convenience constructor which connects the shortcut's
+ \l{QShortcut::activated()}{activated()} signal to the \a functor and
+ \l{QShortcut::activatedAmbiguously()}{activatedAmbiguously()}
+ signal to the \a FunctorAmbiguous.
+
+ The \a functor and \a FunctorAmbiguous can be a pointer to a member
+ function of the \a context object.
+
+ If the \a context object is destroyed, the \a functor and
+ \a FunctorAmbiguous will not be called.
+*/
+/*!
+ \fn template<typename Functor, typename FunctorAmbiguous>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ const QObject *context1, Functor functor,
+ const QObject *context2, FunctorAmbiguous functorAmbiguous,
+ Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
+ \since 5.15
+ \overload
+
+ This is a QShortcut convenience constructor which connects the shortcut's
+ \l{QShortcut::activated()}{activated()} signal to the \a functor and
+ \l{QShortcut::activatedAmbiguously()}{activatedAmbiguously()}
+ signal to the \a FunctorAmbiguous.
+
+ The \a functor can be a pointer to a member function of the
+ \a context1 object.
+ The \a FunctorAmbiguous can be a pointer to a member function of the
+ \a context2 object.
+
+ If the \a context1 object is destroyed, the \a functor will not be called.
+ If the \a context2 object is destroyed, the \a FunctorAmbiguous
+ will not be called.
+*/
+
+/*!
+ Destroys the shortcut.
+*/
+QShortcut::~QShortcut()
+{
+ Q_D(QShortcut);
+ if (qApp)
+ QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(d->sc_id, this);
+}
+
+/*!
+ \property QShortcut::key
+ \brief the shortcut's key sequence
+
+ This is a key sequence with an optional combination of Shift, Ctrl,
+ and Alt. The key sequence may be supplied in a number of ways:
+
+ \snippet code/src_gui_kernel_qshortcut.cpp 1
+
+ By default, this property contains an empty key sequence.
+*/
+void QShortcut::setKey(const QKeySequence &key)
+{
+ Q_D(QShortcut);
+ if (d->sc_sequence == key)
+ return;
+ QAPP_CHECK("setKey");
+ d->sc_sequence = key;
+ d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
+}
+
+QKeySequence QShortcut::key() const
+{
+ Q_D(const QShortcut);
+ return d->sc_sequence;
+}
+
+/*!
+ \property QShortcut::enabled
+ \brief whether the shortcut is enabled
+
+ An enabled shortcut emits the activated() or activatedAmbiguously()
+ signal when a QShortcutEvent occurs that matches the shortcut's
+ key() sequence.
+
+ If the application is in \c WhatsThis mode the shortcut will not emit
+ the signals, but will show the "What's This?" text instead.
+
+ By default, this property is \c true.
+
+ \sa whatsThis
+*/
+void QShortcut::setEnabled(bool enable)
+{
+ Q_D(QShortcut);
+ if (d->sc_enabled == enable)
+ return;
+ QAPP_CHECK("setEnabled");
+ d->sc_enabled = enable;
+ QGuiApplicationPrivate::instance()->shortcutMap.setShortcutEnabled(enable, d->sc_id, this);
+}
+
+bool QShortcut::isEnabled() const
+{
+ Q_D(const QShortcut);
+ return d->sc_enabled;
+}
+
+/*!
+ \property QShortcut::context
+ \brief the context in which the shortcut is valid
+
+ A shortcut's context decides in which circumstances a shortcut is
+ allowed to be triggered. The normal context is Qt::WindowShortcut,
+ which allows the shortcut to trigger if the parent (the widget
+ containing the shortcut) is a subwidget of the active top-level
+ window.
+
+ By default, this property is set to Qt::WindowShortcut.
+*/
+void QShortcut::setContext(Qt::ShortcutContext context)
+{
+ Q_D(QShortcut);
+ if (d->sc_context == context)
+ return;
+ QAPP_CHECK("setContext");
+ d->sc_context = context;
+ d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
+}
+
+Qt::ShortcutContext QShortcut::context() const
+{
+ Q_D(const QShortcut);
+ return d->sc_context;
+}
+
+/*!
+ \property QShortcut::autoRepeat
+ \brief whether the shortcut can auto repeat
+
+ If true, the shortcut will auto repeat when the keyboard shortcut
+ combination is held down, provided that keyboard auto repeat is
+ enabled on the system.
+ The default value is true.
+*/
+void QShortcut::setAutoRepeat(bool on)
+{
+ Q_D(QShortcut);
+ if (d->sc_autorepeat == on)
+ return;
+ QAPP_CHECK("setAutoRepeat");
+ d->sc_autorepeat = on;
+ QGuiApplicationPrivate::instance()->shortcutMap.setShortcutAutoRepeat(on, d->sc_id, this);
+}
+
+bool QShortcut::autoRepeat() const
+{
+ Q_D(const QShortcut);
+ return d->sc_autorepeat;
+}
+
+
+/*!
+ \property QShortcut::whatsThis
+ \brief the shortcut's "What's This?" help text
+
+ The text will be shown when a widget application is in "What's
+ This?" mode and the user types the shortcut key() sequence.
+
+ To set "What's This?" help on a menu item (with or without a
+ shortcut key), set the help on the item's action.
+
+ By default, this property contains an empty string.
+
+ This property has no effect in applications that don't use
+ widgets.
+
+ \sa QWhatsThis::inWhatsThisMode(), QAction::setWhatsThis()
+*/
+void QShortcut::setWhatsThis(const QString &text)
+{
+ Q_D(QShortcut);
+ d->sc_whatsthis = text;
+}
+
+QString QShortcut::whatsThis() const
+{
+ Q_D(const QShortcut);
+ return d->sc_whatsthis;
+}
+
+
+/*!
+ Returns the shortcut's ID.
+
+ \sa QShortcutEvent::shortcutId()
+*/
+int QShortcut::id() const
+{
+ Q_D(const QShortcut);
+ return d->sc_id;
+}
+
+/*!
+ \fn QWidget *QShortcut::parentWidget() const
+
+ Returns the shortcut's parent widget.
+*/
+
+/*!
+ \internal
+*/
+bool QShortcut::event(QEvent *e)
+{
+ Q_D(QShortcut);
+ if (d->sc_enabled && e->type() == QEvent::Shortcut) {
+ auto se = static_cast<QShortcutEvent *>(e);
+ if (se->shortcutId() == d->sc_id && se->key() == d->sc_sequence
+ && !d->handleWhatsThis()) {
+ if (se->isAmbiguous())
+ emit activatedAmbiguously();
+ else
+ emit activated();
+ return true;
+ }
+ }
+ return QObject::event(e);
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qshortcut.cpp"
diff --git a/src/gui/kernel/qshortcut.h b/src/gui/kernel/qshortcut.h
new file mode 100644
index 0000000000..1b90a21925
--- /dev/null
+++ b/src/gui/kernel/qshortcut.h
@@ -0,0 +1,168 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSHORTCUT_H
+#define QSHORTCUT_H
+
+#include <QtGui/qtguiglobal.h>
+#include <QtGui/qkeysequence.h>
+#include <QtCore/qobject.h>
+
+QT_REQUIRE_CONFIG(shortcut);
+
+QT_BEGIN_NAMESPACE
+
+class QShortcutPrivate;
+class QWindow;
+
+class Q_GUI_EXPORT QShortcut : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QShortcut)
+ Q_PROPERTY(QKeySequence key READ key WRITE setKey)
+ Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
+ Q_PROPERTY(bool autoRepeat READ autoRepeat WRITE setAutoRepeat)
+ Q_PROPERTY(Qt::ShortcutContext context READ context WRITE setContext)
+public:
+ explicit QShortcut(QObject *parent);
+ explicit QShortcut(const QKeySequence& key, QObject *parent,
+ const char *member = nullptr, const char *ambiguousMember = nullptr,
+ Qt::ShortcutContext context = Qt::WindowShortcut);
+
+#ifdef Q_CLANG_QDOC
+ template<typename Functor>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ Functor functor,
+ Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
+ template<typename Functor>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ const QObject *context, Functor functor,
+ Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
+ template<typename Functor, typename FunctorAmbiguous>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ const QObject *context1, Functor functor,
+ FunctorAmbiguous functorAmbiguous,
+ Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
+ template<typename Functor, typename FunctorAmbiguous>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ const QObject *context1, Functor functor,
+ const QObject *context2, FunctorAmbiguous functorAmbiguous,
+ Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
+#else
+ template<typename Func1>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ Func1 slot1,
+ Qt::ShortcutContext context = Qt::WindowShortcut)
+ : QShortcut(key, parent, static_cast<const char*>(nullptr), static_cast<const char*>(nullptr), context)
+ {
+ connect(this, &QShortcut::activated, std::move(slot1));
+ }
+ template<class Obj1, typename Func1>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ const Obj1 *object1, Func1 slot1,
+ Qt::ShortcutContext context = Qt::WindowShortcut,
+ typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<Obj1*>::Value>::type* = 0)
+ : QShortcut(key, parent, static_cast<const char*>(nullptr), static_cast<const char*>(nullptr), context)
+ {
+ connect(this, &QShortcut::activated, object1, std::move(slot1));
+ }
+ template<class Obj1, typename Func1, typename Func2>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ const Obj1 *object1, Func1 slot1, Func2 slot2,
+ Qt::ShortcutContext context = Qt::WindowShortcut,
+ typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<Obj1*>::Value>::type* = 0)
+ : QShortcut(key, parent, static_cast<const char*>(nullptr), static_cast<const char*>(nullptr), context)
+ {
+ connect(this, &QShortcut::activated, object1, std::move(slot1));
+ connect(this, &QShortcut::activatedAmbiguously, object1, std::move(slot2));
+ }
+ template<class Obj1, typename Func1, class Obj2, typename Func2>
+ QShortcut(const QKeySequence &key, QObject *parent,
+ const Obj1 *object1, Func1 slot1,
+ const Obj2 *object2, Func2 slot2,
+ Qt::ShortcutContext context = Qt::WindowShortcut,
+ typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<Obj1*>::Value>::type* = 0,
+ typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<Obj2*>::Value>::type* = 0)
+ : QShortcut(key, parent, static_cast<const char*>(nullptr), static_cast<const char*>(nullptr), context)
+ {
+ connect(this, &QShortcut::activated, object1, std::move(slot1));
+ connect(this, &QShortcut::activatedAmbiguously, object2, std::move(slot2));
+ }
+#endif
+
+ ~QShortcut();
+
+ void setKey(const QKeySequence& key);
+ QKeySequence key() const;
+
+ void setEnabled(bool enable);
+ bool isEnabled() const;
+
+ void setContext(Qt::ShortcutContext context);
+ Qt::ShortcutContext context() const;
+
+ void setAutoRepeat(bool on);
+ bool autoRepeat() const;
+
+ int id() const;
+
+ void setWhatsThis(const QString &text);
+ QString whatsThis() const;
+
+#if QT_DEPRECATED_SINCE(6,0)
+#ifdef Q_CLANG_QDOC
+ QWidget *parentWidget() const;
+#else
+ template<typename T = QWidget*>
+ inline T parentWidget() const
+ { return static_cast<T>(QObject::parent()); }
+#endif
+#endif
+
+Q_SIGNALS:
+ void activated();
+ void activatedAmbiguously();
+
+protected:
+ bool event(QEvent *e) override;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSHORTCUT_H
diff --git a/src/gui/kernel/qshortcut_p.h b/src/gui/kernel/qshortcut_p.h
new file mode 100644
index 0000000000..254745960f
--- /dev/null
+++ b/src/gui/kernel/qshortcut_p.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSHORTCUT_P_H
+#define QSHORTCUT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/private/qtguiglobal_p.h>
+#include "qshortcut.h"
+#include <QtGui/qkeysequence.h>
+
+#include <QtCore/qstring.h>
+#include <QtCore/private/qobject_p.h>
+
+#include <private/qshortcutmap_p.h>
+
+
+
+QT_BEGIN_NAMESPACE
+
+class QShortcutMap;
+
+/*
+ \internal
+ Private data accessed through d-pointer.
+*/
+class Q_GUI_EXPORT QShortcutPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QShortcut)
+public:
+ QShortcutPrivate() = default;
+
+ virtual QShortcutMap::ContextMatcher contextMatcher() const;
+ virtual bool handleWhatsThis() { return false; }
+
+ QKeySequence sc_sequence;
+ QString sc_whatsthis;
+ Qt::ShortcutContext sc_context = Qt::WindowShortcut;
+ bool sc_enabled = true;
+ bool sc_autorepeat = true;
+ int sc_id = 0;
+ void redoGrab(QShortcutMap &map);
+};
+
+QT_END_NAMESPACE
+
+#endif // QSHORTCUT_P_H
diff --git a/src/gui/kernel/qshortcutmap.cpp b/src/gui/kernel/qshortcutmap.cpp
index a7ea20266b..6039101cf4 100644
--- a/src/gui/kernel/qshortcutmap.cpp
+++ b/src/gui/kernel/qshortcutmap.cpp
@@ -49,8 +49,6 @@
#include <algorithm>
-#ifndef QT_NO_SHORTCUT
-
QT_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(lcShortcutMap, "qt.gui.shortcutmap")
@@ -689,5 +687,3 @@ void QShortcutMap::dumpMap() const
#endif
QT_END_NAMESPACE
-
-#endif // QT_NO_SHORTCUT
diff --git a/src/gui/kernel/qshortcutmap_p.h b/src/gui/kernel/qshortcutmap_p.h
index 8fc68229fb..aa3dd969f0 100644
--- a/src/gui/kernel/qshortcutmap_p.h
+++ b/src/gui/kernel/qshortcutmap_p.h
@@ -56,9 +56,9 @@
#include "QtCore/qvector.h"
#include "QtCore/qscopedpointer.h"
-QT_BEGIN_NAMESPACE
+QT_REQUIRE_CONFIG(shortcut);
-#ifndef QT_NO_SHORTCUT
+QT_BEGIN_NAMESPACE
// To enable dump output uncomment below
//#define Dump_QShortcutMap
@@ -106,8 +106,6 @@ private:
QScopedPointer<QShortcutMapPrivate> d_ptr;
};
-#endif // QT_NO_SHORTCUT
-
QT_END_NAMESPACE
#endif // QSHORTCUTMAP_P_H
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index 702c055fbb..fd89e479b8 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -515,6 +515,11 @@ void QWindowPrivate::create(bool recursive, WId nativeHandle)
if (platformWindow)
return;
+ // avoid losing update requests when re-creating
+ const bool needsUpdate = updateRequestPending;
+ // the platformWindow, if there was one, is now gone, so make this flag reflect reality now
+ updateRequestPending = false;
+
if (q->parent())
q->parent()->create();
@@ -553,8 +558,8 @@ void QWindowPrivate::create(bool recursive, WId nativeHandle)
QPlatformSurfaceEvent e(QPlatformSurfaceEvent::SurfaceCreated);
QGuiApplication::sendEvent(q, &e);
- if (updateRequestPending)
- platformWindow->requestUpdate();
+ if (needsUpdate)
+ q->requestUpdate();
}
void QWindowPrivate::clearFocusObject()
diff --git a/src/gui/kernel/qwindow.h b/src/gui/kernel/qwindow.h
index 7aae7ffffa..de6d7ffd31 100644
--- a/src/gui/kernel/qwindow.h
+++ b/src/gui/kernel/qwindow.h
@@ -119,11 +119,11 @@ class Q_GUI_EXPORT QWindow : public QObject, public QSurface
Q_PROPERTY(int maximumWidth READ maximumWidth WRITE setMaximumWidth NOTIFY maximumWidthChanged)
Q_PROPERTY(int maximumHeight READ maximumHeight WRITE setMaximumHeight NOTIFY maximumHeightChanged)
Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged)
- Q_PROPERTY(bool active READ isActive NOTIFY activeChanged REVISION 1)
- Q_PROPERTY(Visibility visibility READ visibility WRITE setVisibility NOTIFY visibilityChanged REVISION 1)
+ Q_PROPERTY(bool active READ isActive NOTIFY activeChanged REVISION(2, 1))
+ Q_PROPERTY(Visibility visibility READ visibility WRITE setVisibility NOTIFY visibilityChanged REVISION(2, 1))
Q_PROPERTY(Qt::ScreenOrientation contentOrientation READ contentOrientation WRITE reportContentOrientationChange NOTIFY contentOrientationChanged)
- Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity NOTIFY opacityChanged REVISION 1)
- Q_PRIVATE_PROPERTY(QWindow::d_func(), QWindow* transientParent MEMBER transientParent WRITE setTransientParent NOTIFY transientParentChanged REVISION 13)
+ Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity NOTIFY opacityChanged REVISION(2, 1))
+ Q_PRIVATE_PROPERTY(QWindow::d_func(), QWindow* transientParent MEMBER transientParent WRITE setTransientParent NOTIFY transientParentChanged REVISION(2, 13))
public:
enum Visibility {
@@ -277,7 +277,7 @@ public:
#endif
public Q_SLOTS:
- Q_REVISION(1) void requestActivate();
+ Q_REVISION(2, 1) void requestActivate();
void setVisible(bool visible);
@@ -309,15 +309,15 @@ public Q_SLOTS:
void setMaximumWidth(int w);
void setMaximumHeight(int h);
- Q_REVISION(1) void alert(int msec);
+ Q_REVISION(2, 1) void alert(int msec);
- Q_REVISION(3) void requestUpdate();
+ Q_REVISION(2 ,3) void requestUpdate();
Q_SIGNALS:
void screenChanged(QScreen *screen);
void modalityChanged(Qt::WindowModality modality);
void windowStateChanged(Qt::WindowState windowState);
- Q_REVISION(2) void windowTitleChanged(const QString &title);
+ Q_REVISION(2, 2) void windowTitleChanged(const QString &title);
void xChanged(int arg);
void yChanged(int arg);
@@ -331,15 +331,15 @@ Q_SIGNALS:
void maximumHeightChanged(int arg);
void visibleChanged(bool arg);
- Q_REVISION(1) void visibilityChanged(QWindow::Visibility visibility);
- Q_REVISION(1) void activeChanged();
+ Q_REVISION(2, 1) void visibilityChanged(QWindow::Visibility visibility);
+ Q_REVISION(2, 1) void activeChanged();
void contentOrientationChanged(Qt::ScreenOrientation orientation);
void focusObjectChanged(QObject *object);
- Q_REVISION(1) void opacityChanged(qreal opacity);
+ Q_REVISION(2, 1) void opacityChanged(qreal opacity);
- Q_REVISION(13) void transientParentChanged(QWindow *transientParent);
+ Q_REVISION(2, 13) void transientParentChanged(QWindow *transientParent);
protected:
virtual void exposeEvent(QExposeEvent *);
diff --git a/src/gui/kernel/qwindowdefs.h b/src/gui/kernel/qwindowdefs.h
index b4f3ed4712..5d4955c436 100644
--- a/src/gui/kernel/qwindowdefs.h
+++ b/src/gui/kernel/qwindowdefs.h
@@ -43,6 +43,7 @@
#include <QtGui/qtguiglobal.h>
#include <QtCore/qobjectdefs.h>
#include <QtCore/qnamespace.h>
+#include <QtCore/qcontainerfwd.h>
QT_BEGIN_NAMESPACE
@@ -67,7 +68,6 @@ class QFontMetrics;
class QFontInfo;
class QPen;
class QBrush;
-class QMatrix;
class QPixmap;
class QBitmap;
class QMovie;
@@ -80,7 +80,6 @@ class QString;
class QByteArray;
class QApplication;
-template<typename T> class QList;
typedef QList<QWidget *> QWidgetList;
typedef QList<QWindow *> QWindowList;
diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp
index 90541eb314..5658968de4 100644
--- a/src/gui/kernel/qwindowsysteminterface.cpp
+++ b/src/gui/kernel/qwindowsysteminterface.cpp
@@ -449,7 +449,7 @@ bool QWindowSystemInterface::handleFrameStrutMouseEvent(QWindow *window, ulong t
bool QWindowSystemInterface::handleShortcutEvent(QWindow *window, ulong timestamp, int keyCode, Qt::KeyboardModifiers modifiers, quint32 nativeScanCode,
quint32 nativeVirtualKey, quint32 nativeModifiers, const QString &text, bool autorepeat, ushort count)
{
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
if (!window)
window = QGuiApplication::focusWindow();
@@ -1257,7 +1257,7 @@ Q_GUI_EXPORT void qt_handleKeyEvent(QWindow *window, QEvent::Type t, int k, Qt::
Q_GUI_EXPORT bool qt_sendShortcutOverrideEvent(QObject *o, ulong timestamp, int k, Qt::KeyboardModifiers mods, const QString &text = QString(), bool autorep = false, ushort count = 1)
{
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
// FIXME: This method should not allow targeting a specific object, but should
// instead forward the event to a window, which then takes care of normal event
diff --git a/src/gui/math3d/qmatrix4x4.cpp b/src/gui/math3d/qmatrix4x4.cpp
index cdaed788e9..2adb94573b 100644
--- a/src/gui/math3d/qmatrix4x4.cpp
+++ b/src/gui/math3d/qmatrix4x4.cpp
@@ -40,7 +40,6 @@
#include "qmatrix4x4.h"
#include <QtCore/qmath.h>
#include <QtCore/qvariant.h>
-#include <QtGui/qmatrix.h>
#include <QtGui/qtransform.h>
#include <cmath>
@@ -187,42 +186,6 @@ QMatrix4x4::QMatrix4x4(const float *values, int cols, int rows)
flagBits = General;
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \obsolete
-
- Constructs a 4x4 matrix from a conventional Qt 2D affine
- transformation \a matrix.
-
- If \a matrix has a special type (identity, translate, scale, etc),
- the programmer should follow this constructor with a call to
- optimize() if they wish QMatrix4x4 to optimize further
- calls to translate(), scale(), etc.
-
- \sa toAffine(), optimize()
-*/
-QMatrix4x4::QMatrix4x4(const QMatrix& matrix)
-{
- m[0][0] = matrix.m11();
- m[0][1] = matrix.m12();
- m[0][2] = 0.0f;
- m[0][3] = 0.0f;
- m[1][0] = matrix.m21();
- m[1][1] = matrix.m22();
- m[1][2] = 0.0f;
- m[1][3] = 0.0f;
- m[2][0] = 0.0f;
- m[2][1] = 0.0f;
- m[2][2] = 1.0f;
- m[2][3] = 0.0f;
- m[3][0] = matrix.dx();
- m[3][1] = matrix.dy();
- m[3][2] = 0.0f;
- m[3][3] = 1.0f;
- flagBits = Translation | Scale | Rotation2D;
-}
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
/*!
Constructs a 4x4 matrix from the conventional Qt 2D
transformation matrix \a transform.
@@ -1663,26 +1626,6 @@ void QMatrix4x4::copyDataTo(float *values) const
values[row * 4 + col] = float(m[col][row]);
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \obsolete
-
- Use toTransform() instead.
-
- Returns the conventional Qt 2D affine transformation matrix that
- corresponds to this matrix. It is assumed that this matrix
- only contains 2D affine transformation elements.
-
- \sa toTransform()
-*/
-QMatrix QMatrix4x4::toAffine() const
-{
- return QMatrix(m[0][0], m[0][1],
- m[1][0], m[1][1],
- m[3][0], m[3][1]);
-}
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
/*!
Returns the conventional Qt 2D transformation matrix that
corresponds to this matrix.
diff --git a/src/gui/math3d/qmatrix4x4.h b/src/gui/math3d/qmatrix4x4.h
index 6a726a197c..95f4db92ec 100644
--- a/src/gui/math3d/qmatrix4x4.h
+++ b/src/gui/math3d/qmatrix4x4.h
@@ -52,7 +52,6 @@ QT_BEGIN_NAMESPACE
#ifndef QT_NO_MATRIX4X4
-class QMatrix;
class QTransform;
class QVariant;
@@ -72,9 +71,6 @@ public:
QMatrix4x4(const float *values, int cols, int rows);
QMatrix4x4(const QTransform& transform);
-#if QT_DEPRECATED_SINCE(5, 15)
- QMatrix4x4(const QMatrix& matrix);
-#endif // QT_DEPRECATED_SINCE(5, 15)
inline const float& operator()(int row, int column) const;
inline float& operator()(int row, int column);
@@ -158,9 +154,6 @@ public:
void copyDataTo(float *values) const;
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_X("Use toTransform()") QMatrix toAffine() const;
-#endif // QT_DEPRECATED_SINCE(5, 15)
QTransform toTransform() const;
QTransform toTransform(float distanceToPlane) const;
@@ -191,6 +184,7 @@ public:
friend Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QMatrix4x4 &m);
#endif
+ void projectedRotate(float angle, float x, float y, float z);
private:
float m[4][4]; // Column-major order to match OpenGL.
int flagBits; // Flag bits from the enum below.
@@ -210,10 +204,6 @@ private:
explicit QMatrix4x4(int) { }
QMatrix4x4 orthonormalInverse() const;
-
- void projectedRotate(float angle, float x, float y, float z);
-
- friend class QGraphicsRotation;
};
QT_WARNING_PUSH
diff --git a/src/gui/opengl/opengl.pri b/src/gui/opengl/opengl.pri
index 24758afdeb..85fdb609cd 100644
--- a/src/gui/opengl/opengl.pri
+++ b/src/gui/opengl/opengl.pri
@@ -4,125 +4,14 @@ qtConfig(opengl): CONFIG += opengl
qtConfig(opengles2): CONFIG += opengles2
qtConfig(opengl) {
-
HEADERS += opengl/qopengl.h \
opengl/qopengl_p.h \
opengl/qopenglfunctions.h \
- opengl/qopenglframebufferobject.h \
- opengl/qopenglframebufferobject_p.h \
- opengl/qopenglpaintdevice.h \
- opengl/qopenglpaintdevice_p.h \
- opengl/qopenglbuffer.h \
- opengl/qopenglshaderprogram.h \
opengl/qopenglextensions_p.h \
- opengl/qopenglgradientcache_p.h \
- opengl/qopengltexturecache_p.h \
- opengl/qopenglengineshadermanager_p.h \
- opengl/qopengl2pexvertexarray_p.h \
- opengl/qopenglpaintengine_p.h \
- opengl/qopenglengineshadersource_p.h \
- opengl/qopenglcustomshaderstage_p.h \
- opengl/qopengltextureglyphcache_p.h \
- opengl/qopenglshadercache_p.h \
- opengl/qopenglversionfunctions.h \
- opengl/qopenglversionfunctionsfactory_p.h \
- opengl/qopenglvertexarrayobject.h \
- opengl/qopengldebug.h \
- opengl/qopengltextureblitter.h \
- opengl/qopengltexture.h \
- opengl/qopengltexture_p.h \
- opengl/qopengltexturehelper_p.h \
- opengl/qopengltextureuploader_p.h \
- opengl/qopenglpixeltransferoptions.h \
opengl/qopenglextrafunctions.h \
opengl/qopenglprogrambinarycache_p.h
SOURCES += opengl/qopengl.cpp \
opengl/qopenglfunctions.cpp \
- opengl/qopenglframebufferobject.cpp \
- opengl/qopenglpaintdevice.cpp \
- opengl/qopenglbuffer.cpp \
- opengl/qopenglshaderprogram.cpp \
- opengl/qopenglgradientcache.cpp \
- opengl/qopengltexturecache.cpp \
- opengl/qopenglengineshadermanager.cpp \
- opengl/qopengl2pexvertexarray.cpp \
- opengl/qopenglpaintengine.cpp \
- opengl/qopenglcustomshaderstage.cpp \
- opengl/qopengltextureglyphcache.cpp \
- opengl/qopenglversionfunctions.cpp \
- opengl/qopenglversionfunctionsfactory.cpp \
- opengl/qopenglvertexarrayobject.cpp \
- opengl/qopengldebug.cpp \
- opengl/qopengltextureblitter.cpp \
- opengl/qopengltexture.cpp \
- opengl/qopengltexturehelper.cpp \
- opengl/qopengltextureuploader.cpp \
- opengl/qopenglpixeltransferoptions.cpp \
opengl/qopenglprogrambinarycache.cpp
-
- !qtConfig(opengles2) {
- HEADERS += opengl/qopenglfunctions_1_0.h \
- opengl/qopenglfunctions_1_1.h \
- opengl/qopenglfunctions_1_2.h \
- opengl/qopenglfunctions_1_3.h \
- opengl/qopenglfunctions_1_4.h \
- opengl/qopenglfunctions_1_5.h \
- opengl/qopenglfunctions_2_0.h \
- opengl/qopenglfunctions_2_1.h \
- opengl/qopenglfunctions_3_0.h \
- opengl/qopenglfunctions_3_1.h \
- opengl/qopenglfunctions_3_2_core.h \
- opengl/qopenglfunctions_3_3_core.h \
- opengl/qopenglfunctions_4_0_core.h \
- opengl/qopenglfunctions_4_1_core.h \
- opengl/qopenglfunctions_4_2_core.h \
- opengl/qopenglfunctions_4_3_core.h \
- opengl/qopenglfunctions_4_4_core.h \
- opengl/qopenglfunctions_4_5_core.h \
- opengl/qopenglfunctions_3_2_compatibility.h \
- opengl/qopenglfunctions_3_3_compatibility.h \
- opengl/qopenglfunctions_4_0_compatibility.h \
- opengl/qopenglfunctions_4_1_compatibility.h \
- opengl/qopenglfunctions_4_2_compatibility.h \
- opengl/qopenglfunctions_4_3_compatibility.h \
- opengl/qopenglfunctions_4_4_compatibility.h \
- opengl/qopenglfunctions_4_5_compatibility.h \
- opengl/qopenglqueryhelper_p.h \
- opengl/qopengltimerquery.h
-
- SOURCES += opengl/qopenglfunctions_1_0.cpp \
- opengl/qopenglfunctions_1_1.cpp \
- opengl/qopenglfunctions_1_2.cpp \
- opengl/qopenglfunctions_1_3.cpp \
- opengl/qopenglfunctions_1_4.cpp \
- opengl/qopenglfunctions_1_5.cpp \
- opengl/qopenglfunctions_2_0.cpp \
- opengl/qopenglfunctions_2_1.cpp \
- opengl/qopenglfunctions_3_0.cpp \
- opengl/qopenglfunctions_3_1.cpp \
- opengl/qopenglfunctions_3_2_core.cpp \
- opengl/qopenglfunctions_3_3_core.cpp \
- opengl/qopenglfunctions_4_0_core.cpp \
- opengl/qopenglfunctions_4_1_core.cpp \
- opengl/qopenglfunctions_4_2_core.cpp \
- opengl/qopenglfunctions_4_3_core.cpp \
- opengl/qopenglfunctions_4_4_core.cpp \
- opengl/qopenglfunctions_4_5_core.cpp \
- opengl/qopenglfunctions_3_2_compatibility.cpp \
- opengl/qopenglfunctions_3_3_compatibility.cpp \
- opengl/qopenglfunctions_4_0_compatibility.cpp \
- opengl/qopenglfunctions_4_1_compatibility.cpp \
- opengl/qopenglfunctions_4_2_compatibility.cpp \
- opengl/qopenglfunctions_4_3_compatibility.cpp \
- opengl/qopenglfunctions_4_4_compatibility.cpp \
- opengl/qopenglfunctions_4_5_compatibility.cpp \
- opengl/qopengltimerquery.cpp
- }
-
- qtConfig(opengles2) {
- HEADERS += opengl/qopenglfunctions_es2.h
-
- SOURCES += opengl/qopenglfunctions_es2.cpp
- }
}
diff --git a/src/gui/opengl/qopengl.h b/src/gui/opengl/qopengl.h
index 3a2393ea58..995206f248 100644
--- a/src/gui/opengl/qopengl.h
+++ b/src/gui/opengl/qopengl.h
@@ -63,9 +63,9 @@
// access to additional functionality the drivers may expose but
// which the system headers do not.
-#if defined(QT_OPENGL_ES_2)
+#if QT_CONFIG(opengles2)
# if defined(Q_OS_IOS) || defined(Q_OS_TVOS)
-# if defined(QT_OPENGL_ES_3)
+# if QT_CONFIG(opengles3)
# include <OpenGLES/ES3/gl.h>
# include <OpenGLES/ES3/glext.h>
# else
@@ -83,7 +83,7 @@ typedef void* GLeglImageOES;
# elif !defined(Q_OS_DARWIN) // "uncontrolled" ES2 platforms
-// In "es2" builds (QT_OPENGL_ES_2) additional defines indicate GLES 3.0 or
+// In "es2" builds (QT_CONFIG(opengles2)) additional defines indicate GLES 3.0 or
// higher is available *at build time*. In this case include the corresponding
// header. These are backwards compatible and it should be safe to include
// headers on top of each other, meaning that applications can include gl2.h
@@ -101,11 +101,11 @@ typedef void* GLeglImageOES;
# define QGL_TEMP_GLEXT_PROTO
# endif
-# if defined(QT_OPENGL_ES_3_2)
+# if QT_CONFIG(opengles32)
# include <GLES3/gl32.h>
-# elif defined(QT_OPENGL_ES_3_1)
+# elif QT_CONFIG(opengles31)
# include <GLES3/gl31.h>
-# elif defined(QT_OPENGL_ES_3)
+# elif QT_CONFIG(opengles3)
# include <GLES3/gl3.h>
# else
# include <GLES2/gl2.h>
@@ -145,10 +145,10 @@ typedef char GLchar;
# endif
# include <QtGui/qopenglext.h>
# endif // Q_OS_MAC
-#endif // QT_OPENGL_ES_2
+#endif // !QT_CONFIG(opengles2)
// Desktops can support OpenGL 4.
-#if !defined(QT_OPENGL_ES_2)
+#if !QT_CONFIG(opengles2)
#define QT_OPENGL_3
#define QT_OPENGL_3_2
#define QT_OPENGL_4
@@ -162,7 +162,7 @@ QT_BEGIN_NAMESPACE
// When all else fails we provide sensible fallbacks - this is needed to
// allow compilation on OS X 10.6
-#if !defined(QT_OPENGL_ES_2)
+#if !QT_CONFIG(opengles2)
// OS X 10.6 doesn't define these which are needed below
// OS X 10.7 and later defien them in gl3.h
diff --git a/src/gui/opengl/qopengl2pexvertexarray.cpp b/src/gui/opengl/qopengl2pexvertexarray.cpp
deleted file mode 100644
index 04781f63c7..0000000000
--- a/src/gui/opengl/qopengl2pexvertexarray.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopengl2pexvertexarray_p.h"
-
-#include <private/qbezier_p.h>
-
-QT_BEGIN_NAMESPACE
-
-void QOpenGL2PEXVertexArray::clear()
-{
- vertexArray.reset();
- vertexArrayStops.reset();
- boundingRectDirty = true;
-}
-
-
-QOpenGLRect QOpenGL2PEXVertexArray::boundingRect() const
-{
- if (boundingRectDirty)
- return QOpenGLRect(0.0, 0.0, 0.0, 0.0);
- else
- return QOpenGLRect(minX, minY, maxX, maxY);
-}
-
-void QOpenGL2PEXVertexArray::addClosingLine(int index)
-{
- QPointF point(vertexArray.at(index));
- if (point != QPointF(vertexArray.last()))
- vertexArray.add(point);
-}
-
-void QOpenGL2PEXVertexArray::addCentroid(const QVectorPath &path, int subPathIndex)
-{
- const QPointF *const points = reinterpret_cast<const QPointF *>(path.points());
- const QPainterPath::ElementType *const elements = path.elements();
-
- QPointF sum = points[subPathIndex];
- int count = 1;
-
- for (int i = subPathIndex + 1; i < path.elementCount() && (!elements || elements[i] != QPainterPath::MoveToElement); ++i) {
- sum += points[i];
- ++count;
- }
-
- const QPointF centroid = sum / qreal(count);
- vertexArray.add(centroid);
-}
-
-void QOpenGL2PEXVertexArray::addPath(const QVectorPath &path, GLfloat curveInverseScale, bool outline)
-{
- const QPointF* const points = reinterpret_cast<const QPointF*>(path.points());
- const QPainterPath::ElementType* const elements = path.elements();
-
- if (boundingRectDirty) {
- minX = maxX = points[0].x();
- minY = maxY = points[0].y();
- boundingRectDirty = false;
- }
-
- if (!outline && !path.isConvex())
- addCentroid(path, 0);
-
- int lastMoveTo = vertexArray.size();
- vertexArray.add(points[0]); // The first element is always a moveTo
-
- do {
- if (!elements) {
-// qDebug("QVectorPath has no elements");
- // If the path has a null elements pointer, the elements implicitly
- // start with a moveTo (already added) and continue with lineTos:
- for (int i=1; i<path.elementCount(); ++i)
- lineToArray(points[i].x(), points[i].y());
-
- break;
- }
-// qDebug("QVectorPath has element types");
-
- for (int i=1; i<path.elementCount(); ++i) {
- switch (elements[i]) {
- case QPainterPath::MoveToElement:
- if (!outline)
- addClosingLine(lastMoveTo);
-// qDebug("element[%d] is a MoveToElement", i);
- vertexArrayStops.add(vertexArray.size());
- if (!outline) {
- if (!path.isConvex()) addCentroid(path, i);
- lastMoveTo = vertexArray.size();
- }
- lineToArray(points[i].x(), points[i].y()); // Add the moveTo as a new vertex
- break;
- case QPainterPath::LineToElement:
-// qDebug("element[%d] is a LineToElement", i);
- lineToArray(points[i].x(), points[i].y());
- break;
- case QPainterPath::CurveToElement: {
- QBezier b = QBezier::fromPoints(*(((const QPointF *) points) + i - 1),
- points[i],
- points[i+1],
- points[i+2]);
- QRectF bounds = b.bounds();
- // threshold based on same algorithm as in qtriangulatingstroker.cpp
- int threshold = qMin<float>(64, qMax(bounds.width(), bounds.height()) * 3.14f / (curveInverseScale * 6));
- if (threshold < 3) threshold = 3;
- qreal one_over_threshold_minus_1 = qreal(1) / (threshold - 1);
- for (int t=0; t<threshold; ++t) {
- QPointF pt = b.pointAt(t * one_over_threshold_minus_1);
- lineToArray(pt.x(), pt.y());
- }
- i += 2;
- break; }
- default:
- break;
- }
- }
- } while (0);
-
- if (!outline)
- addClosingLine(lastMoveTo);
- vertexArrayStops.add(vertexArray.size());
-}
-
-void QOpenGL2PEXVertexArray::lineToArray(const GLfloat x, const GLfloat y)
-{
- vertexArray.add(QOpenGLPoint(x, y));
-
- if (x > maxX)
- maxX = x;
- else if (x < minX)
- minX = x;
- if (y > maxY)
- maxY = y;
- else if (y < minY)
- minY = y;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopengl2pexvertexarray_p.h b/src/gui/opengl/qopengl2pexvertexarray_p.h
deleted file mode 100644
index 5dc060ff3d..0000000000
--- a/src/gui/opengl/qopengl2pexvertexarray_p.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QOPENGL2PEXVERTEXARRAY_P_H
-#define QOPENGL2PEXVERTEXARRAY_P_H
-
-#include <QtGui/private/qtguiglobal_p.h>
-#include <QRectF>
-
-#include <private/qdatabuffer_p.h>
-#include <private/qvectorpath_p.h>
-#include <private/qopenglcontext_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLPoint
-{
-public:
- QOpenGLPoint(GLfloat new_x, GLfloat new_y) :
- x(new_x), y(new_y) {};
-
- QOpenGLPoint(const QPointF &p) :
- x(p.x()), y(p.y()) {};
-
- QOpenGLPoint(const QPointF* p) :
- x(p->x()), y(p->y()) {};
-
- GLfloat x;
- GLfloat y;
-
- operator QPointF() {return QPointF(x,y);}
- operator QPointF() const {return QPointF(x,y);}
-};
-
-struct QOpenGLRect
-{
- QOpenGLRect(const QRectF &r)
- : left(r.left()), top(r.top()), right(r.right()), bottom(r.bottom()) {}
-
- QOpenGLRect(GLfloat l, GLfloat t, GLfloat r, GLfloat b)
- : left(l), top(t), right(r), bottom(b) {}
-
- GLfloat left;
- GLfloat top;
- GLfloat right;
- GLfloat bottom;
-
- operator QRectF() const {return QRectF(left, top, right-left, bottom-top);}
-};
-
-class QOpenGL2PEXVertexArray
-{
-public:
- QOpenGL2PEXVertexArray() :
- vertexArray(0), vertexArrayStops(0),
- maxX(-2e10), maxY(-2e10), minX(2e10), minY(2e10),
- boundingRectDirty(true)
- { }
-
- inline void addRect(const QRectF &rect)
- {
- qreal top = rect.top();
- qreal left = rect.left();
- qreal bottom = rect.bottom();
- qreal right = rect.right();
-
- vertexArray << QOpenGLPoint(left, top)
- << QOpenGLPoint(right, top)
- << QOpenGLPoint(right, bottom)
- << QOpenGLPoint(right, bottom)
- << QOpenGLPoint(left, bottom)
- << QOpenGLPoint(left, top);
- }
-
- inline void addQuad(const QRectF &rect)
- {
- qreal top = rect.top();
- qreal left = rect.left();
- qreal bottom = rect.bottom();
- qreal right = rect.right();
-
- vertexArray << QOpenGLPoint(left, top)
- << QOpenGLPoint(right, top)
- << QOpenGLPoint(left, bottom)
- << QOpenGLPoint(right, bottom);
-
- }
-
- inline void addVertex(const GLfloat x, const GLfloat y)
- {
- vertexArray.add(QOpenGLPoint(x, y));
- }
-
- void addPath(const QVectorPath &path, GLfloat curveInverseScale, bool outline = true);
- void clear();
-
- QOpenGLPoint* data() {return vertexArray.data();}
- int *stops() const { return vertexArrayStops.data(); }
- int stopCount() const { return vertexArrayStops.size(); }
- QOpenGLRect boundingRect() const;
-
- int vertexCount() const { return vertexArray.size(); }
-
- void lineToArray(const GLfloat x, const GLfloat y);
-
-private:
- QDataBuffer<QOpenGLPoint> vertexArray;
- QDataBuffer<int> vertexArrayStops;
-
- GLfloat maxX;
- GLfloat maxY;
- GLfloat minX;
- GLfloat minY;
- bool boundingRectDirty;
- void addClosingLine(int index);
- void addCentroid(const QVectorPath &path, int subPathIndex);
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/gui/opengl/qopengl_p.h b/src/gui/opengl/qopengl_p.h
index cda062eacf..07fd159ba8 100644
--- a/src/gui/opengl/qopengl_p.h
+++ b/src/gui/opengl/qopengl_p.h
@@ -133,9 +133,9 @@ inline bool operator!=(const QOpenGLConfig::Gpu &a, const QOpenGLConfig::Gpu &b)
return !a.equals(b);
}
-inline uint qHash(const QOpenGLConfig::Gpu &gpu)
+inline size_t qHash(const QOpenGLConfig::Gpu &gpu, size_t seed = 0)
{
- return qHash(gpu.vendorId) + qHash(gpu.deviceId) + qHash(gpu.driverVersion);
+ return (qHash(gpu.vendorId) + qHash(gpu.deviceId) + qHash(gpu.driverVersion)) ^ seed;
}
QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglbuffer.cpp b/src/gui/opengl/qopenglbuffer.cpp
deleted file mode 100644
index 5387cc06e3..0000000000
--- a/src/gui/opengl/qopenglbuffer.cpp
+++ /dev/null
@@ -1,618 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtGui/qopengl.h>
-#include <QtGui/private/qopenglcontext_p.h>
-#include <QtCore/qatomic.h>
-#include "qopenglbuffer.h"
-#include <private/qopenglextensions_p.h>
-
-#ifndef GL_CONTEXT_LOST
-#define GL_CONTEXT_LOST 0x0507
-#endif
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLBuffer
- \brief The QOpenGLBuffer class provides functions for creating and managing OpenGL buffer objects.
- \since 5.0
- \ingroup painting-3D
- \inmodule QtGui
-
- Buffer objects are created in the OpenGL server so that the
- client application can avoid uploading vertices, indices,
- texture image data, etc every time they are needed.
-
- QOpenGLBuffer objects can be copied around as a reference to the
- underlying OpenGL buffer object:
-
- \snippet code/src_gui_opengl_qopenglbuffer.cpp 0
-
- QOpenGLBuffer performs a shallow copy when objects are copied in this
- manner, but does not implement copy-on-write semantics. The original
- object will be affected whenever the copy is modified.
-*/
-
-/*!
- \enum QOpenGLBuffer::Type
- This enum defines the type of OpenGL buffer object to create with QOpenGLBuffer.
-
- \value VertexBuffer Vertex buffer object for use when specifying
- vertex arrays.
- \value IndexBuffer Index buffer object for use with \c{glDrawElements()}.
- \value PixelPackBuffer Pixel pack buffer object for reading pixel
- data from the OpenGL server (for example, with \c{glReadPixels()}).
- Not supported under OpenGL/ES.
- \value PixelUnpackBuffer Pixel unpack buffer object for writing pixel
- data to the OpenGL server (for example, with \c{glTexImage2D()}).
- Not supported under OpenGL/ES.
-*/
-
-/*!
- \enum QOpenGLBuffer::UsagePattern
- This enum defines the usage pattern of a QOpenGLBuffer object.
-
- \value StreamDraw The data will be set once and used a few times
- for drawing operations. Under OpenGL/ES 1.1 this is identical
- to StaticDraw.
- \value StreamRead The data will be set once and used a few times
- for reading data back from the OpenGL server. Not supported
- under OpenGL/ES.
- \value StreamCopy The data will be set once and used a few times
- for reading data back from the OpenGL server for use in further
- drawing operations. Not supported under OpenGL/ES.
- \value StaticDraw The data will be set once and used many times
- for drawing operations.
- \value StaticRead The data will be set once and used many times
- for reading data back from the OpenGL server. Not supported
- under OpenGL/ES.
- \value StaticCopy The data will be set once and used many times
- for reading data back from the OpenGL server for use in further
- drawing operations. Not supported under OpenGL/ES.
- \value DynamicDraw The data will be modified repeatedly and used
- many times for drawing operations.
- \value DynamicRead The data will be modified repeatedly and used
- many times for reading data back from the OpenGL server.
- Not supported under OpenGL/ES.
- \value DynamicCopy The data will be modified repeatedly and used
- many times for reading data back from the OpenGL server for
- use in further drawing operations. Not supported under OpenGL/ES.
-*/
-
-/*!
- \enum QOpenGLBuffer::Access
- This enum defines the access mode for QOpenGLBuffer::map().
-
- \value ReadOnly The buffer will be mapped for reading only.
- \value WriteOnly The buffer will be mapped for writing only.
- \value ReadWrite The buffer will be mapped for reading and writing.
-*/
-
-/*!
- \enum QOpenGLBuffer::RangeAccessFlag
- This enum defines the access mode bits for QOpenGLBuffer::mapRange().
-
- \value RangeRead The buffer will be mapped for reading.
- \value RangeWrite The buffer will be mapped for writing.
- \value RangeInvalidate Discard the previous contents of the specified range.
- \value RangeInvalidateBuffer Discard the previous contents of the entire buffer.
- \value RangeFlushExplicit Indicates that modifications are to be flushed explicitly via \c glFlushMappedBufferRange.
- \value RangeUnsynchronized Indicates that pending operations should not be synchronized before returning from mapRange().
-*/
-
-class QOpenGLBufferPrivate
-{
-public:
- QOpenGLBufferPrivate(QOpenGLBuffer::Type t)
- : ref(1),
- type(t),
- guard(nullptr),
- usagePattern(QOpenGLBuffer::StaticDraw),
- actualUsagePattern(QOpenGLBuffer::StaticDraw),
- funcs(nullptr)
- {
- }
-
- QAtomicInt ref;
- QOpenGLBuffer::Type type;
- QOpenGLSharedResourceGuard *guard;
- QOpenGLBuffer::UsagePattern usagePattern;
- QOpenGLBuffer::UsagePattern actualUsagePattern;
- QOpenGLExtensions *funcs;
-};
-
-/*!
- Constructs a new buffer object of type QOpenGLBuffer::VertexBuffer.
-
- Note: this constructor just creates the QOpenGLBuffer instance. The actual
- buffer object in the OpenGL server is not created until create() is called.
-
- \sa create()
-*/
-QOpenGLBuffer::QOpenGLBuffer()
- : d_ptr(new QOpenGLBufferPrivate(QOpenGLBuffer::VertexBuffer))
-{
-}
-
-/*!
- Constructs a new buffer object of \a type.
-
- Note: this constructor just creates the QOpenGLBuffer instance. The actual
- buffer object in the OpenGL server is not created until create() is called.
-
- \sa create()
-*/
-QOpenGLBuffer::QOpenGLBuffer(QOpenGLBuffer::Type type)
- : d_ptr(new QOpenGLBufferPrivate(type))
-{
-}
-
-/*!
- Constructs a shallow copy of \a other.
-
- Note: QOpenGLBuffer does not implement copy-on-write semantics,
- so \a other will be affected whenever the copy is modified.
-*/
-QOpenGLBuffer::QOpenGLBuffer(const QOpenGLBuffer &other)
- : d_ptr(other.d_ptr)
-{
- d_ptr->ref.ref();
-}
-
-/*!
- Destroys this buffer object, including the storage being
- used in the OpenGL server.
-*/
-QOpenGLBuffer::~QOpenGLBuffer()
-{
- if (!d_ptr->ref.deref()) {
- destroy();
- delete d_ptr;
- }
-}
-
-/*!
- Assigns a shallow copy of \a other to this object.
-
- Note: QOpenGLBuffer does not implement copy-on-write semantics,
- so \a other will be affected whenever the copy is modified.
-*/
-QOpenGLBuffer &QOpenGLBuffer::operator=(const QOpenGLBuffer &other)
-{
- if (d_ptr != other.d_ptr) {
- other.d_ptr->ref.ref();
- if (!d_ptr->ref.deref()) {
- destroy();
- delete d_ptr;
- }
- d_ptr = other.d_ptr;
- }
- return *this;
-}
-
-/*!
- Returns the type of buffer represented by this object.
-*/
-QOpenGLBuffer::Type QOpenGLBuffer::type() const
-{
- Q_D(const QOpenGLBuffer);
- return d->type;
-}
-
-/*!
- Returns the usage pattern for this buffer object.
- The default value is StaticDraw.
-
- \sa setUsagePattern()
-*/
-QOpenGLBuffer::UsagePattern QOpenGLBuffer::usagePattern() const
-{
- Q_D(const QOpenGLBuffer);
- return d->usagePattern;
-}
-
-/*!
- Sets the usage pattern for this buffer object to \a value.
- This function must be called before allocate() or write().
-
- \sa usagePattern(), allocate(), write()
-*/
-void QOpenGLBuffer::setUsagePattern(QOpenGLBuffer::UsagePattern value)
-{
- Q_D(QOpenGLBuffer);
- d->usagePattern = d->actualUsagePattern = value;
-}
-
-namespace {
- void freeBufferFunc(QOpenGLFunctions *funcs, GLuint id)
- {
- funcs->glDeleteBuffers(1, &id);
- }
-}
-
-/*!
- Creates the buffer object in the OpenGL server. Returns \c true if
- the object was created; false otherwise.
-
- This function must be called with a current QOpenGLContext.
- The buffer will be bound to and can only be used in
- that context (or any other context that is shared with it).
-
- This function will return false if the OpenGL implementation
- does not support buffers, or there is no current QOpenGLContext.
-
- \sa isCreated(), allocate(), write(), destroy()
-*/
-bool QOpenGLBuffer::create()
-{
- Q_D(QOpenGLBuffer);
- if (d->guard && d->guard->id())
- return true;
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (ctx) {
- delete d->funcs;
- d->funcs = new QOpenGLExtensions(ctx);
- GLuint bufferId = 0;
- d->funcs->glGenBuffers(1, &bufferId);
- if (bufferId) {
- if (d->guard)
- d->guard->free();
-
- d->guard = new QOpenGLSharedResourceGuard(ctx, bufferId, freeBufferFunc);
- return true;
- }
- }
- return false;
-}
-
-/*!
- Returns \c true if this buffer has been created; false otherwise.
-
- \sa create(), destroy()
-*/
-bool QOpenGLBuffer::isCreated() const
-{
- Q_D(const QOpenGLBuffer);
- return d->guard && d->guard->id();
-}
-
-/*!
- Destroys this buffer object, including the storage being
- used in the OpenGL server. All references to the buffer will
- become invalid.
-*/
-void QOpenGLBuffer::destroy()
-{
- Q_D(QOpenGLBuffer);
- if (d->guard) {
- d->guard->free();
- d->guard = nullptr;
- }
- delete d->funcs;
- d->funcs = nullptr;
-}
-
-/*!
- Reads the \a count bytes in this buffer starting at \a offset
- into \a data. Returns \c true on success; false if reading from
- the buffer is not supported. Buffer reading is not supported
- under OpenGL/ES.
-
- It is assumed that this buffer has been bound to the current context.
-
- \sa write(), bind()
-*/
-bool QOpenGLBuffer::read(int offset, void *data, int count)
-{
-#if !defined(QT_OPENGL_ES)
- Q_D(QOpenGLBuffer);
- if (!d->funcs->hasOpenGLFeature(QOpenGLFunctions::Buffers) || !d->guard->id())
- return false;
-
- while (true) { // Clear error state.
- GLenum error = d->funcs->glGetError();
- if (error == GL_NO_ERROR)
- break;
- if (error == GL_CONTEXT_LOST)
- return false;
- };
- d->funcs->glGetBufferSubData(d->type, offset, count, data);
- return d->funcs->glGetError() == GL_NO_ERROR;
-#else
- Q_UNUSED(offset);
- Q_UNUSED(data);
- Q_UNUSED(count);
- return false;
-#endif
-}
-
-/*!
- Replaces the \a count bytes of this buffer starting at \a offset
- with the contents of \a data. Any other bytes in the buffer
- will be left unmodified.
-
- It is assumed that create() has been called on this buffer and that
- it has been bound to the current context.
-
- \sa create(), read(), allocate()
-*/
-void QOpenGLBuffer::write(int offset, const void *data, int count)
-{
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QOpenGLBuffer::write(): buffer not created");
-#endif
- Q_D(QOpenGLBuffer);
- if (d->guard && d->guard->id())
- d->funcs->glBufferSubData(d->type, offset, count, data);
-}
-
-/*!
- Allocates \a count bytes of space to the buffer, initialized to
- the contents of \a data. Any previous contents will be removed.
-
- It is assumed that create() has been called on this buffer and that
- it has been bound to the current context.
-
- \sa create(), read(), write()
-*/
-void QOpenGLBuffer::allocate(const void *data, int count)
-{
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QOpenGLBuffer::allocate(): buffer not created");
-#endif
- Q_D(QOpenGLBuffer);
- if (d->guard && d->guard->id())
- d->funcs->glBufferData(d->type, count, data, d->actualUsagePattern);
-}
-
-/*!
- \fn void QOpenGLBuffer::allocate(int count)
- \overload
-
- Allocates \a count bytes of space to the buffer. Any previous
- contents will be removed.
-
- It is assumed that create() has been called on this buffer and that
- it has been bound to the current context.
-
- \sa create(), write()
-*/
-
-/*!
- Binds the buffer associated with this object to the current
- OpenGL context. Returns \c false if binding was not possible, usually because
- type() is not supported on this OpenGL implementation.
-
- The buffer must be bound to the same QOpenGLContext current when create()
- was called, or to another QOpenGLContext that is sharing with it.
- Otherwise, false will be returned from this function.
-
- \sa release(), create()
-*/
-bool QOpenGLBuffer::bind()
-{
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QOpenGLBuffer::bind(): buffer not created");
-#endif
- Q_D(const QOpenGLBuffer);
- GLuint bufferId = d->guard ? d->guard->id() : 0;
- if (bufferId) {
- if (d->guard->group() != QOpenGLContextGroup::currentContextGroup()) {
-#ifndef QT_NO_DEBUG
- qWarning("QOpenGLBuffer::bind: buffer is not valid in the current context");
-#endif
- return false;
- }
- d->funcs->glBindBuffer(d->type, bufferId);
- return true;
- } else {
- return false;
- }
-}
-
-/*!
- Releases the buffer associated with this object from the
- current OpenGL context.
-
- This function must be called with the same QOpenGLContext current
- as when bind() was called on the buffer.
-
- \sa bind()
-*/
-void QOpenGLBuffer::release()
-{
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QOpenGLBuffer::release(): buffer not created");
-#endif
- Q_D(const QOpenGLBuffer);
- if (d->guard && d->guard->id())
- d->funcs->glBindBuffer(d->type, 0);
-}
-
-/*!
- Releases the buffer associated with \a type in the current
- QOpenGLContext.
-
- This function is a direct call to \c{glBindBuffer(type, 0)}
- for use when the caller does not know which QOpenGLBuffer has
- been bound to the context but wants to make sure that it
- is released.
-
- \snippet code/src_gui_opengl_qopenglbuffer.cpp 1
-*/
-void QOpenGLBuffer::release(QOpenGLBuffer::Type type)
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (ctx)
- ctx->functions()->glBindBuffer(GLenum(type), 0);
-}
-
-/*!
- Returns the OpenGL identifier associated with this buffer; zero if
- the buffer has not been created.
-
- \sa isCreated()
-*/
-GLuint QOpenGLBuffer::bufferId() const
-{
- Q_D(const QOpenGLBuffer);
- return d->guard ? d->guard->id() : 0;
-}
-
-/*!
- Returns the size of the data in this buffer, for reading operations.
- Returns -1 if fetching the buffer size is not supported, or the
- buffer has not been created.
-
- It is assumed that this buffer has been bound to the current context.
-
- \sa isCreated(), bind()
-*/
-int QOpenGLBuffer::size() const
-{
- Q_D(const QOpenGLBuffer);
- if (!d->guard || !d->guard->id())
- return -1;
- GLint value = -1;
- d->funcs->glGetBufferParameteriv(d->type, GL_BUFFER_SIZE, &value);
- return value;
-}
-
-/*!
- Maps the contents of this buffer into the application's memory
- space and returns a pointer to it. Returns null if memory
- mapping is not possible. The \a access parameter indicates the
- type of access to be performed.
-
- It is assumed that create() has been called on this buffer and that
- it has been bound to the current context.
-
- \note This function is only supported under OpenGL ES 2.0 or
- earlier if the \c GL_OES_mapbuffer extension is present.
-
- \note On OpenGL ES 3.0 and newer, or, in case if desktop OpenGL,
- if \c GL_ARB_map_buffer_range is supported, this function uses
- \c glMapBufferRange instead of \c glMapBuffer.
-
- \sa unmap(), create(), bind(), mapRange()
-*/
-void *QOpenGLBuffer::map(QOpenGLBuffer::Access access)
-{
- Q_D(QOpenGLBuffer);
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QOpenGLBuffer::map(): buffer not created");
-#endif
- if (!d->guard || !d->guard->id())
- return nullptr;
- if (d->funcs->hasOpenGLExtension(QOpenGLExtensions::MapBufferRange)) {
- QOpenGLBuffer::RangeAccessFlags rangeAccess;
- switch (access) {
- case QOpenGLBuffer::ReadOnly:
- rangeAccess = QOpenGLBuffer::RangeRead;
- break;
- case QOpenGLBuffer::WriteOnly:
- rangeAccess = QOpenGLBuffer::RangeWrite;
- break;
- case QOpenGLBuffer::ReadWrite:
- rangeAccess = QOpenGLBuffer::RangeRead | QOpenGLBuffer::RangeWrite;
- break;
- }
- return d->funcs->glMapBufferRange(d->type, 0, size(), rangeAccess);
- } else {
- return d->funcs->glMapBuffer(d->type, access);
- }
-}
-
-/*!
- Maps the range specified by \a offset and \a count of the contents
- of this buffer into the application's memory space and returns a
- pointer to it. Returns null if memory mapping is not possible.
- The \a access parameter specifies a combination of access flags.
-
- It is assumed that create() has been called on this buffer and that
- it has been bound to the current context.
-
- \note This function is not available on OpenGL ES 2.0 and earlier.
-
- \sa unmap(), create(), bind()
- */
-void *QOpenGLBuffer::mapRange(int offset, int count, QOpenGLBuffer::RangeAccessFlags access)
-{
- Q_D(QOpenGLBuffer);
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QOpenGLBuffer::mapRange(): buffer not created");
-#endif
- if (!d->guard || !d->guard->id())
- return nullptr;
- return d->funcs->glMapBufferRange(d->type, offset, count, access);
-}
-
-/*!
- Unmaps the buffer after it was mapped into the application's
- memory space with a previous call to map(). Returns \c true if
- the unmap succeeded; false otherwise.
-
- It is assumed that this buffer has been bound to the current context,
- and that it was previously mapped with map().
-
- \note This function is only supported under OpenGL ES 2.0 and
- earlier if the \c{GL_OES_mapbuffer} extension is present.
-
- \sa map()
-*/
-bool QOpenGLBuffer::unmap()
-{
- Q_D(QOpenGLBuffer);
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QOpenGLBuffer::unmap(): buffer not created");
-#endif
- if (!d->guard || !d->guard->id())
- return false;
- return d->funcs->glUnmapBuffer(d->type) == GL_TRUE;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglbuffer.h b/src/gui/opengl/qopenglbuffer.h
deleted file mode 100644
index a810783731..0000000000
--- a/src/gui/opengl/qopenglbuffer.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLBUFFER_H
-#define QOPENGLBUFFER_H
-
-#include <QtGui/qtguiglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtCore/qscopedpointer.h>
-#include <QtGui/qopengl.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QOpenGLBufferPrivate;
-
-class Q_GUI_EXPORT QOpenGLBuffer
-{
-public:
- enum Type
- {
- VertexBuffer = 0x8892, // GL_ARRAY_BUFFER
- IndexBuffer = 0x8893, // GL_ELEMENT_ARRAY_BUFFER
- PixelPackBuffer = 0x88EB, // GL_PIXEL_PACK_BUFFER
- PixelUnpackBuffer = 0x88EC // GL_PIXEL_UNPACK_BUFFER
- };
-
- QOpenGLBuffer();
- explicit QOpenGLBuffer(QOpenGLBuffer::Type type);
- QOpenGLBuffer(const QOpenGLBuffer &other);
- ~QOpenGLBuffer();
-
- QOpenGLBuffer &operator=(const QOpenGLBuffer &other);
-
- enum UsagePattern
- {
- StreamDraw = 0x88E0, // GL_STREAM_DRAW
- StreamRead = 0x88E1, // GL_STREAM_READ
- StreamCopy = 0x88E2, // GL_STREAM_COPY
- StaticDraw = 0x88E4, // GL_STATIC_DRAW
- StaticRead = 0x88E5, // GL_STATIC_READ
- StaticCopy = 0x88E6, // GL_STATIC_COPY
- DynamicDraw = 0x88E8, // GL_DYNAMIC_DRAW
- DynamicRead = 0x88E9, // GL_DYNAMIC_READ
- DynamicCopy = 0x88EA // GL_DYNAMIC_COPY
- };
-
- enum Access
- {
- ReadOnly = 0x88B8, // GL_READ_ONLY
- WriteOnly = 0x88B9, // GL_WRITE_ONLY
- ReadWrite = 0x88BA // GL_READ_WRITE
- };
-
- enum RangeAccessFlag
- {
- RangeRead = 0x0001, // GL_MAP_READ_BIT
- RangeWrite = 0x0002, // GL_MAP_WRITE_BIT
- RangeInvalidate = 0x0004, // GL_MAP_INVALIDATE_RANGE_BIT
- RangeInvalidateBuffer = 0x0008, // GL_MAP_INVALIDATE_BUFFER_BIT
- RangeFlushExplicit = 0x0010, // GL_MAP_FLUSH_EXPLICIT_BIT
- RangeUnsynchronized = 0x0020 // GL_MAP_UNSYNCHRONIZED_BIT
- };
- Q_DECLARE_FLAGS(RangeAccessFlags, RangeAccessFlag)
-
- QOpenGLBuffer::Type type() const;
-
- QOpenGLBuffer::UsagePattern usagePattern() const;
- void setUsagePattern(QOpenGLBuffer::UsagePattern value);
-
- bool create();
- bool isCreated() const;
-
- void destroy();
-
- bool bind();
- void release();
-
- static void release(QOpenGLBuffer::Type type);
-
- GLuint bufferId() const;
-
- int size() const;
-
- bool read(int offset, void *data, int count);
- void write(int offset, const void *data, int count);
-
- void allocate(const void *data, int count);
- inline void allocate(int count) { allocate(nullptr, count); }
-
- void *map(QOpenGLBuffer::Access access);
- void *mapRange(int offset, int count, QOpenGLBuffer::RangeAccessFlags access);
- bool unmap();
-
-private:
- QOpenGLBufferPrivate *d_ptr;
-
- Q_DECLARE_PRIVATE(QOpenGLBuffer)
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLBuffer::RangeAccessFlags)
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-
-#endif
diff --git a/src/gui/opengl/qopenglcustomshaderstage.cpp b/src/gui/opengl/qopenglcustomshaderstage.cpp
deleted file mode 100644
index a95a0a5767..0000000000
--- a/src/gui/opengl/qopenglcustomshaderstage.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenglcustomshaderstage_p.h"
-#include "qopenglengineshadermanager_p.h"
-#include "qopenglpaintengine_p.h"
-#include <private/qpainter_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLCustomShaderStagePrivate
-{
-public:
- QOpenGLCustomShaderStagePrivate() :
- m_manager(nullptr) {}
-
- QPointer<QOpenGLEngineShaderManager> m_manager;
- QByteArray m_source;
-};
-
-
-
-
-QOpenGLCustomShaderStage::QOpenGLCustomShaderStage()
- : d_ptr(new QOpenGLCustomShaderStagePrivate)
-{
-}
-
-QOpenGLCustomShaderStage::~QOpenGLCustomShaderStage()
-{
- Q_D(QOpenGLCustomShaderStage);
- if (d->m_manager) {
- d->m_manager->removeCustomStage();
- d->m_manager->sharedShaders->cleanupCustomStage(this);
- }
- delete d_ptr;
-}
-
-void QOpenGLCustomShaderStage::setUniformsDirty()
-{
- Q_D(QOpenGLCustomShaderStage);
- if (d->m_manager)
- d->m_manager->setDirty(); // ### Probably a bit overkill!
-}
-
-bool QOpenGLCustomShaderStage::setOnPainter(QPainter* p)
-{
- Q_D(QOpenGLCustomShaderStage);
- if (p->paintEngine()->type() != QPaintEngine::OpenGL2) {
- qWarning("QOpenGLCustomShaderStage::setOnPainter() - paint engine not OpenGL2");
- return false;
- }
- if (d->m_manager)
- qWarning("Custom shader is already set on a painter");
-
- QOpenGL2PaintEngineEx *engine = static_cast<QOpenGL2PaintEngineEx*>(p->paintEngine());
- d->m_manager = QOpenGL2PaintEngineExPrivate::shaderManagerForEngine(engine);
- Q_ASSERT(d->m_manager);
-
- d->m_manager->setCustomStage(this);
- return true;
-}
-
-void QOpenGLCustomShaderStage::removeFromPainter(QPainter* p)
-{
- Q_D(QOpenGLCustomShaderStage);
- if (p->paintEngine()->type() != QPaintEngine::OpenGL2)
- return;
-
- QOpenGL2PaintEngineEx *engine = static_cast<QOpenGL2PaintEngineEx*>(p->paintEngine());
- d->m_manager = QOpenGL2PaintEngineExPrivate::shaderManagerForEngine(engine);
- Q_ASSERT(d->m_manager);
-
- // Just set the stage to null, don't call removeCustomStage().
- // This should leave the program in a compiled/linked state
- // if the next custom shader stage is this one again.
- d->m_manager->setCustomStage(nullptr);
- d->m_manager = nullptr;
-}
-
-QByteArray QOpenGLCustomShaderStage::source() const
-{
- Q_D(const QOpenGLCustomShaderStage);
- return d->m_source;
-}
-
-// Called by the shader manager if another custom shader is attached or
-// the manager is deleted
-void QOpenGLCustomShaderStage::setInactive()
-{
- Q_D(QOpenGLCustomShaderStage);
- d->m_manager = nullptr;
-}
-
-void QOpenGLCustomShaderStage::setSource(const QByteArray& s)
-{
- Q_D(QOpenGLCustomShaderStage);
- d->m_source = s;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglcustomshaderstage_p.h b/src/gui/opengl/qopenglcustomshaderstage_p.h
deleted file mode 100644
index ce3e9efd23..0000000000
--- a/src/gui/opengl/qopenglcustomshaderstage_p.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGL_CUSTOM_SHADER_STAGE_H
-#define QOPENGL_CUSTOM_SHADER_STAGE_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtGui/private/qtguiglobal_p.h>
-#include <QOpenGLShaderProgram>
-
-QT_BEGIN_NAMESPACE
-
-
-class QPainter;
-class QOpenGLCustomShaderStagePrivate;
-class Q_GUI_EXPORT QOpenGLCustomShaderStage
-{
- Q_DECLARE_PRIVATE(QOpenGLCustomShaderStage)
-public:
- QOpenGLCustomShaderStage();
- virtual ~QOpenGLCustomShaderStage();
- virtual void setUniforms(QOpenGLShaderProgram*) {}
-
- void setUniformsDirty();
-
- bool setOnPainter(QPainter*);
- void removeFromPainter(QPainter*);
- QByteArray source() const;
-
- void setInactive();
-protected:
- void setSource(const QByteArray&);
-
-private:
- QOpenGLCustomShaderStagePrivate* d_ptr;
-
- Q_DISABLE_COPY_MOVE(QOpenGLCustomShaderStage)
-};
-
-
-QT_END_NAMESPACE
-
-
-#endif
diff --git a/src/gui/opengl/qopengldebug.cpp b/src/gui/opengl/qopengldebug.cpp
deleted file mode 100644
index 310006feaf..0000000000
--- a/src/gui/opengl/qopengldebug.cpp
+++ /dev/null
@@ -1,1826 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/private/qobject_p.h>
-#include <QtCore/qglobal.h>
-#include <QtCore/qvarlengtharray.h>
-#include <QtGui/qopengl.h>
-#include <QtGui/qopenglfunctions.h>
-#include <QtGui/qoffscreensurface.h>
-
-#include "qopengldebug.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLDebugMessage
- \brief The QOpenGLDebugMessage class wraps an OpenGL debug message.
- \inmodule QtGui
- \reentrant
- \since 5.1
- \ingroup shared
- \ingroup painting-3D
-
- Debug messages are usually created by the OpenGL server and then read by
- OpenGL clients (either from the OpenGL internal debug log, or logged in real-time).
- A debug message has a textual representation, a vendor-specific numeric id,
- a source, a type and a severity.
-
- It's also possible for applications or third-party libraries and toolkits
- to create and insert messages in the debug log. In order to do so, you can use
- the createApplicationMessage() or the createThirdPartyMessage() static functions.
-
- \sa QOpenGLDebugLogger
-*/
-
-/*!
- \class QOpenGLDebugLogger
- \brief The QOpenGLDebugLogger enables logging of OpenGL debugging messages.
- \inmodule QtGui
- \since 5.1
- \ingroup painting-3D
-
- \tableofcontents
-
- \section1 Introduction
-
- OpenGL programming can be very error prone. Most of the time, a single
- failing call to OpenGL can cause an entire portion of an application to
- stop working, with nothing being drawn on the screen.
-
- The only way to be sure that no errors are being returned from the OpenGL
- implementation is checking with \c{glGetError} after each and every API
- call. Moreover, OpenGL errors stack up, therefore glGetError should always
- be used in a loop like this:
-
- \snippet code/src_gui_opengl_qopengldebug.cpp 0
-
- If you try to clear the error stack, make sure not just keep going until
- GL_NO_ERROR is returned but also break on GL_CONTEXT_LOST as that error
- value will keep repeating.
-
- There are also many other information we are interested in (as application
- developers), for instance performance issues, or warnings about using
- deprecated APIs. Those kind of messages are not reported through the
- ordinary OpenGL error reporting mechanisms.
-
- QOpenGLDebugLogger aims at addressing these issues by providing access to
- the \e{OpenGL debug log}. If your OpenGL implementation supports it (by
- exposing the \c{GL_KHR_debug} extension), messages from the OpenGL server
- will be either logged in an internal OpenGL log, or passed in "real-time"
- to listeners as they're generated from OpenGL.
-
- QOpenGLDebugLogger supports both these modes of operation. Refer to the
- following sections to find out the differences between them.
-
- \section1 Creating an OpenGL Debug Context
-
- For efficiency reasons, OpenGL implementations are allowed not to create
- any debug output at all, unless the OpenGL context is a debug context. In order
- to create a debug context from Qt, you must set the QSurfaceFormat::DebugContext
- format option on the QSurfaceFormat used to create the QOpenGLContext object:
-
- \snippet code/src_gui_opengl_qopengldebug.cpp 1
-
- Note that requesting a 3.2 OpenGL Core Profile is just for the example's
- purposes; this class is not tied to any specific OpenGL or OpenGL ES
- version, as it relies on the availability of the \c{GL_KHR_debug} extension
- (see below).
-
- \section1 Creating and Initializing a QOpenGLDebugLogger
-
- QOpenGLDebugLogger is a simple QObject-derived class. Just like all QObject
- subclasses, you create an instance (and optionally specify a parent
- object), and like the other OpenGL functions in Qt you \e{must} initialize
- it before usage by calling initialize() whilst there is a current OpenGL context:
-
- \snippet code/src_gui_opengl_qopengldebug.cpp 2
-
- Note that the \c{GL_KHR_debug} extension \e{must} be available in the context
- in order to access the messages logged by OpenGL. You can check the
- presence of this extension by calling:
-
- \snippet code/src_gui_opengl_qopengldebug.cpp 3
-
- where \c{ctx} is a valid QOpenGLContext. If the extension is not available,
- initialize() will return false.
-
- \section1 Reading the Internal OpenGL Debug Log
-
- OpenGL implementations keep an internal log of debug messages. Messages
- stored in this log can be retrieved by using the loggedMessages() function:
-
- \snippet code/src_gui_opengl_qopengldebug.cpp 4
-
- The internal log has a limited size; when it fills up, older messages will
- get discarded to make room for the new incoming messages. When you call
- loggedMessages(), the internal log will be emptied as well.
-
- If you want to be sure not to lose any debug message, you must use real-time
- logging instead of calling this function. However, debug messages might
- still be generated in the timespan between context creation and activation
- of real-time logging (or, in general, when the real-time logging is disabled).
-
- \section1 Real-time logging of messages
-
- It is also possible to receive a stream of debug messages from the OpenGL
- server \e{as they are generated} by the implementation. In order to do so,
- you need to connect a suitable slot to the messageLogged() signal, and
- start logging by calling startLogging():
-
- \snippet code/src_gui_opengl_qopengldebug.cpp 5
-
- Similarly, logging can be disabled at any time by calling the stopLogging()
- function.
-
- Real-time logging can be either asynchronous or synchronous, depending on
- the parameter passed to startLogging(). When logging in asynchronous mode
- (the default, as it has a very small overhead), the OpenGL implementation
- can generate messages at any time, and/or in an order which is different from the
- order of the OpenGL commands which caused those messages to be logged.
- The messages could also be generated from a thread that it's different from
- the thread the context is currently bound to. This is because OpenGL
- implementations are usually highly threaded and asynchronous, and therefore
- no warranties are made about the relative order and the timings of the
- debug messages.
-
- On the other hand, logging in synchronous mode has a high overhead, but
- the OpenGL implementation guarantees that all the messages caused by a
- certain command are received in order, before the command returns,
- and from the same thread the OpenGL context is bound to.
-
- This means that when logging in synchronous mode you will be able to run
- your OpenGL application in a debugger, put a breakpoint on a slot connected
- to the messageLogged() signal, and see in the backtrace the exact call
- that caused the logged message. This can be extremely useful to debug
- an OpenGL problem. Note that if OpenGL rendering is happening in another
- thread, you must force the signal/slot connection type to Qt::DirectConnection
- in order to be able to see the actual backtrace.
-
- Refer to the LoggingMode enum documentation for more information about
- logging modes.
-
- \note When real-time logging is enabled, debug messages will \e{not} be
- inserted in the internal OpenGL debug log any more; messages already
- present in the internal log will not be deleted, nor they will be emitted
- through the messageLogged() signal. Since some messages might be generated
- before real-time logging is started (and therefore be kept in the internal
- OpenGL log), it is important to always check if it contains any message
- after calling startLogging().
-
- \section1 Inserting Messages in the Debug Log
-
- It is possible for applications and libraries to insert custom messages in
- the debug log, for instance for marking a group of related OpenGL commands
- and therefore being then able to identify eventual messages coming from them.
-
- In order to do so, you can create a QOpenGLDebugMessage object by calling
- \l{QOpenGLDebugMessage::}{createApplicationMessage()} or
- \l{QOpenGLDebugMessage::}{createThirdPartyMessage()}, and then inserting it
- into the log by calling logMessage():
-
- \snippet code/src_gui_opengl_qopengldebug.cpp 6
-
- Note that OpenGL implementations have a vendor-specific limit to the length
- of the messages that can be inserted in the debug log. You can retrieve
- this length by calling the maximumMessageLength() method; messages longer
- than the limit will automatically get truncated.
-
- \section1 Controlling the Debug Output
-
- QOpenGLDebugMessage is also able to apply filters to the debug messages, and
- therefore limit the amount of messages logged. You can enable or disable
- logging of messages by calling enableMessages() and disableMessages()
- respectively. By default, all messages are logged.
-
- It is possible to enable or disable messages by selecting them by:
-
- \list
- \li source, type and severity (and including all ids in the selection);
- \li id, source and type (and including all severities in the selection).
- \endlist
-
- Note that the "enabled" status for a given message is a property of the
- (id, source, type, severity) tuple; the message attributes \e{do not} form
- a hierarchy of any kind. You should be careful about the order of the calls
- to enableMessages() and disableMessages(), as it will change which
- messages will are enabled / disabled.
-
- It's not possible to filter by the message text itself; applications
- have to do that on their own (in slots connected to the messageLogged()
- signal, or after fetching the messages in the internal debug log
- through loggedMessages()).
-
- In order to simplify the management of the enabled / disabled statuses,
- QOpenGLDebugMessage also supports the concept of \c{debug groups}. A debug
- group contains the group of enabled / disabled configurations of debug
- messages. Moreover, debug groups are organized in a stack: it is possible
- to push and pop groups by calling pushGroup() and popGroup() respectively.
- (When an OpenGL context is created, there is already a group in the stack).
-
- The enableMessages() and disableMessages() functions will modify the
- configuration in the current debug group, that is, the one at the top of
- the debug groups stack.
-
- When a new group is pushed onto the debug groups stack, it will inherit
- the configuration of the group that was previously on the top of the stack.
- Vice versa, popping a debug group will restore the configuration of
- the debug group that becomes the new top.
-
- Pushing (respectively popping) debug groups will also automatically generate
- a debug message of type QOpenGLDebugMessage::GroupPushType (respectively
- \l{QOpenGLDebugMessage::}{GroupPopType}).
-
- \sa QOpenGLDebugMessage
-*/
-
-/*!
- \enum QOpenGLDebugMessage::Source
-
- The Source enum defines the source of the debug message.
-
- \value InvalidSource
- The source of the message is invalid; this is the source of a
- default-constructed QOpenGLDebugMessage object.
-
- \value APISource
- The message was generated in response to OpenGL API calls.
-
- \value WindowSystemSource
- The message was generated by the window system.
-
- \value ShaderCompilerSource
- The message was generated by the shader compiler.
-
- \value ThirdPartySource
- The message was generated by a third party, for instance an OpenGL
- framework a or debugging toolkit.
-
- \value ApplicationSource
- The message was generated by the application itself.
-
- \value OtherSource
- The message was generated by a source not included in this
- enumeration.
-
- \omitvalue LastSource
-
- \value AnySource
- This value corresponds to a mask of all possible message sources.
-*/
-
-/*!
- \enum QOpenGLDebugMessage::Type
-
- The Type enum defines the type of the debug message.
-
- \value InvalidType
- The type of the message is invalid; this is the type of a
- default-constructed QOpenGLDebugMessage object.
-
- \value ErrorType
- The message represents an error.
-
- \value DeprecatedBehaviorType
- The message represents an usage of deprecated behavior.
-
- \value UndefinedBehaviorType
- The message represents an usage of undefined behavior.
-
- \value PortabilityType
- The message represents an usage of vendor-specific behavior,
- that might pose portability concerns.
-
- \value PerformanceType
- The message represents a performance issue.
-
- \value OtherType
- The message represents a type not included in this
- enumeration.
-
- \value MarkerType
- The message represents a marker in the debug log.
-
- \value GroupPushType
- The message represents a debug group push operation.
-
- \value GroupPopType
- The message represents a debug group pop operation.
-
- \omitvalue LastType
-
- \value AnyType
- This value corresponds to a mask of all possible message types.
-*/
-
-/*!
- \enum QOpenGLDebugMessage::Severity
-
- The Severity enum defines the severity of the debug message.
-
- \value InvalidSeverity
- The severity of the message is invalid; this is the severity of a
- default-constructed QOpenGLDebugMessage object.
-
- \value HighSeverity
- The message has a high severity.
-
- \value MediumSeverity
- The message has a medium severity.
-
- \value LowSeverity
- The message has a low severity.
-
- \value NotificationSeverity
- The message is a notification.
-
- \omitvalue LastSeverity
-
- \value AnySeverity
- This value corresponds to a mask of all possible message severities.
-*/
-
-/*!
- \property QOpenGLDebugLogger::loggingMode
-
- \brief the logging mode passed to startLogging().
-
- Note that logging must have been started or the value of this property
- will be meaningless.
-
- \sa startLogging(), isLogging()
-*/
-/*!
- \enum QOpenGLDebugLogger::LoggingMode
-
- The LoggingMode enum defines the logging mode of the logger object.
-
- \value AsynchronousLogging
- Messages from the OpenGL server are logged asynchronously. This means
- that messages can be logged some time after the corresponding OpenGL
- actions that caused them, and even be received in an out-of-order
- fashion, depending on the OpenGL implementation. This mode has a very low
- performance penalty, as OpenGL implementations are heavily threaded
- and asynchronous by nature.
-
- \value SynchronousLogging
- Messages from the OpenGL server are logged synchronously and
- sequentially. This has a severe performance hit, as OpenGL
- implementations are very asynchronous by nature; but it's very useful
- to debug OpenGL problems, as OpenGL guarantees that the messages
- generated by a OpenGL command will be logged before the corresponding
- command execution has returned. Therefore, you can install a breakpoint
- on the messageLogged() signal and see in the backtrace which OpenGL
- command caused it; the only caveat is that if you are using OpenGL from
- multiple threads you may need to force direct connection when
- connecting to the messageLogged() signal.
-*/
-
-// When using OpenGL ES 2.0, all the necessary GL_KHR_debug constants are
-// provided in qopengles2ext.h. Unfortunately, newer versions of that file
-// suffix everything with _KHR which causes extra headache when the goal is
-// to have a single piece of code that builds in all our target
-// environments. Therefore, try to detect this and use our custom defines
-// instead, which we anyway need for OS X.
-
-#if defined(GL_KHR_debug) && defined(GL_DEBUG_SOURCE_API_KHR)
-#define USE_MANUAL_DEFS
-#endif
-
-// Under OSX (at least up to 10.8) we cannot include our copy of glext.h,
-// but we use the system-wide one, which unfortunately lacks all the needed
-// defines/typedefs. In order to make the code compile, we just add here
-// the GL_KHR_debug defines.
-
-#ifndef GL_KHR_debug
-#define GL_KHR_debug 1
-#define USE_MANUAL_DEFS
-#endif
-
-#ifdef USE_MANUAL_DEFS
-
-#ifndef GL_DEBUG_OUTPUT_SYNCHRONOUS
-#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
-#endif
-#ifndef GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH
-#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
-#endif
-#ifndef GL_DEBUG_CALLBACK_FUNCTION
-#define GL_DEBUG_CALLBACK_FUNCTION 0x8244
-#endif
-#ifndef GL_DEBUG_CALLBACK_USER_PARAM
-#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
-#endif
-#ifndef GL_DEBUG_SOURCE_API
-#define GL_DEBUG_SOURCE_API 0x8246
-#endif
-#ifndef GL_DEBUG_SOURCE_WINDOW_SYSTEM
-#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
-#endif
-#ifndef GL_DEBUG_SOURCE_SHADER_COMPILER
-#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
-#endif
-#ifndef GL_DEBUG_SOURCE_THIRD_PARTY
-#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
-#endif
-#ifndef GL_DEBUG_SOURCE_APPLICATION
-#define GL_DEBUG_SOURCE_APPLICATION 0x824A
-#endif
-#ifndef GL_DEBUG_SOURCE_OTHER
-#define GL_DEBUG_SOURCE_OTHER 0x824B
-#endif
-#ifndef GL_DEBUG_TYPE_ERROR
-#define GL_DEBUG_TYPE_ERROR 0x824C
-#endif
-#ifndef GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR
-#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
-#endif
-#ifndef GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR
-#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
-#endif
-#ifndef GL_DEBUG_TYPE_PORTABILITY
-#define GL_DEBUG_TYPE_PORTABILITY 0x824F
-#endif
-#ifndef GL_DEBUG_TYPE_PERFORMANCE
-#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
-#endif
-#ifndef GL_DEBUG_TYPE_OTHER
-#define GL_DEBUG_TYPE_OTHER 0x8251
-#endif
-#ifndef GL_DEBUG_TYPE_MARKER
-#define GL_DEBUG_TYPE_MARKER 0x8268
-#endif
-#ifndef GL_DEBUG_TYPE_PUSH_GROUP
-#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
-#endif
-#ifndef GL_DEBUG_TYPE_POP_GROUP
-#define GL_DEBUG_TYPE_POP_GROUP 0x826A
-#endif
-#ifndef GL_DEBUG_SEVERITY_NOTIFICATION
-#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
-#endif
-#ifndef GL_MAX_DEBUG_GROUP_STACK_DEPTH
-#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
-#endif
-#ifndef GL_DEBUG_GROUP_STACK_DEPTH
-#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
-#endif
-#ifndef GL_BUFFER
-#define GL_BUFFER 0x82E0
-#endif
-#ifndef GL_SHADER
-#define GL_SHADER 0x82E1
-#endif
-#ifndef GL_PROGRAM
-#define GL_PROGRAM 0x82E2
-#endif
-#ifndef GL_QUERY
-#define GL_QUERY 0x82E3
-#endif
-#ifndef GL_PROGRAM_PIPELINE
-#define GL_PROGRAM_PIPELINE 0x82E4
-#endif
-#ifndef GL_SAMPLER
-#define GL_SAMPLER 0x82E6
-#endif
-#ifndef GL_DISPLAY_LIST
-#define GL_DISPLAY_LIST 0x82E7
-#endif
-#ifndef GL_MAX_LABEL_LENGTH
-#define GL_MAX_LABEL_LENGTH 0x82E8
-#endif
-#ifndef GL_MAX_DEBUG_MESSAGE_LENGTH
-#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
-#endif
-#ifndef GL_MAX_DEBUG_LOGGED_MESSAGES
-#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
-#endif
-#ifndef GL_DEBUG_LOGGED_MESSAGES
-#define GL_DEBUG_LOGGED_MESSAGES 0x9145
-#endif
-#ifndef GL_DEBUG_SEVERITY_HIGH
-#define GL_DEBUG_SEVERITY_HIGH 0x9146
-#endif
-#ifndef GL_DEBUG_SEVERITY_MEDIUM
-#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
-#endif
-#ifndef GL_DEBUG_SEVERITY_LOW
-#define GL_DEBUG_SEVERITY_LOW 0x9148
-#endif
-#ifndef GL_DEBUG_OUTPUT
-#define GL_DEBUG_OUTPUT 0x92E0
-#endif
-#ifndef GL_CONTEXT_FLAG_DEBUG_BIT
-#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
-#endif
-#ifndef GL_STACK_OVERFLOW
-#define GL_STACK_OVERFLOW 0x0503
-#endif
-#ifndef GL_STACK_UNDERFLOW
-#define GL_STACK_UNDERFLOW 0x0504
-#endif
-
-typedef void (QOPENGLF_APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const GLvoid *userParam);
-
-#endif /* USE_MANUAL_DEFS */
-
-
-/*!
- \internal
-*/
-static QOpenGLDebugMessage::Source qt_messageSourceFromGL(GLenum source)
-{
- switch (source) {
- case GL_DEBUG_SOURCE_API:
- return QOpenGLDebugMessage::APISource;
- case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
- return QOpenGLDebugMessage::WindowSystemSource;
- case GL_DEBUG_SOURCE_SHADER_COMPILER:
- return QOpenGLDebugMessage::ShaderCompilerSource;
- case GL_DEBUG_SOURCE_THIRD_PARTY:
- return QOpenGLDebugMessage::ThirdPartySource;
- case GL_DEBUG_SOURCE_APPLICATION:
- return QOpenGLDebugMessage::ApplicationSource;
- case GL_DEBUG_SOURCE_OTHER:
- return QOpenGLDebugMessage::OtherSource;
- }
-
- Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message source from GL");
- return QOpenGLDebugMessage::OtherSource;
-}
-
-/*!
- \internal
-*/
-static GLenum qt_messageSourceToGL(QOpenGLDebugMessage::Source source)
-{
- switch (source) {
- case QOpenGLDebugMessage::InvalidSource:
- break;
- case QOpenGLDebugMessage::APISource:
- return GL_DEBUG_SOURCE_API;
- case QOpenGLDebugMessage::WindowSystemSource:
- return GL_DEBUG_SOURCE_WINDOW_SYSTEM;
- case QOpenGLDebugMessage::ShaderCompilerSource:
- return GL_DEBUG_SOURCE_SHADER_COMPILER;
- case QOpenGLDebugMessage::ThirdPartySource:
- return GL_DEBUG_SOURCE_THIRD_PARTY;
- case QOpenGLDebugMessage::ApplicationSource:
- return GL_DEBUG_SOURCE_APPLICATION;
- case QOpenGLDebugMessage::OtherSource:
- return GL_DEBUG_SOURCE_OTHER;
- case QOpenGLDebugMessage::AnySource:
- break;
- }
-
- Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid message source");
- return GL_DEBUG_SOURCE_OTHER;
-}
-
-/*!
- \internal
-*/
-static QString qt_messageSourceToString(QOpenGLDebugMessage::Source source)
-{
- switch (source) {
- case QOpenGLDebugMessage::InvalidSource:
- return QStringLiteral("InvalidSource");
- case QOpenGLDebugMessage::APISource:
- return QStringLiteral("APISource");
- case QOpenGLDebugMessage::WindowSystemSource:
- return QStringLiteral("WindowSystemSource");
- case QOpenGLDebugMessage::ShaderCompilerSource:
- return QStringLiteral("ShaderCompilerSource");
- case QOpenGLDebugMessage::ThirdPartySource:
- return QStringLiteral("ThirdPartySource");
- case QOpenGLDebugMessage::ApplicationSource:
- return QStringLiteral("ApplicationSource");
- case QOpenGLDebugMessage::OtherSource:
- return QStringLiteral("OtherSource");
- case QOpenGLDebugMessage::AnySource:
- return QStringLiteral("AnySource");
- }
-
- Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message source");
- return QString();
-}
-
-/*!
- \internal
-*/
-static QOpenGLDebugMessage::Type qt_messageTypeFromGL(GLenum type)
-{
- switch (type) {
- case GL_DEBUG_TYPE_ERROR:
- return QOpenGLDebugMessage::ErrorType;
- case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
- return QOpenGLDebugMessage::DeprecatedBehaviorType;
- case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
- return QOpenGLDebugMessage::UndefinedBehaviorType;
- case GL_DEBUG_TYPE_PORTABILITY:
- return QOpenGLDebugMessage::PortabilityType;
- case GL_DEBUG_TYPE_PERFORMANCE:
- return QOpenGLDebugMessage::PerformanceType;
- case GL_DEBUG_TYPE_OTHER:
- return QOpenGLDebugMessage::OtherType;
- case GL_DEBUG_TYPE_MARKER:
- return QOpenGLDebugMessage::MarkerType;
- case GL_DEBUG_TYPE_PUSH_GROUP:
- return QOpenGLDebugMessage::GroupPushType;
- case GL_DEBUG_TYPE_POP_GROUP:
- return QOpenGLDebugMessage::GroupPopType;
- }
-
- Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message type from GL");
- return QOpenGLDebugMessage::OtherType;
-}
-
-/*!
- \internal
-*/
-static GLenum qt_messageTypeToGL(QOpenGLDebugMessage::Type type)
-{
- switch (type) {
- case QOpenGLDebugMessage::InvalidType:
- break;
- case QOpenGLDebugMessage::ErrorType:
- return GL_DEBUG_TYPE_ERROR;
- case QOpenGLDebugMessage::DeprecatedBehaviorType:
- return GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR;
- case QOpenGLDebugMessage::UndefinedBehaviorType:
- return GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR;
- case QOpenGLDebugMessage::PortabilityType:
- return GL_DEBUG_TYPE_PORTABILITY;
- case QOpenGLDebugMessage::PerformanceType:
- return GL_DEBUG_TYPE_PERFORMANCE;
- case QOpenGLDebugMessage::OtherType:
- return GL_DEBUG_TYPE_OTHER;
- case QOpenGLDebugMessage::MarkerType:
- return GL_DEBUG_TYPE_MARKER;
- case QOpenGLDebugMessage::GroupPushType:
- return GL_DEBUG_TYPE_PUSH_GROUP;
- case QOpenGLDebugMessage::GroupPopType:
- return GL_DEBUG_TYPE_POP_GROUP;
- case QOpenGLDebugMessage::AnyType:
- break;
- }
-
- Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid message type");
- return GL_DEBUG_TYPE_OTHER;
-}
-
-/*!
- \internal
-*/
-static QString qt_messageTypeToString(QOpenGLDebugMessage::Type type)
-{
- switch (type) {
- case QOpenGLDebugMessage::InvalidType:
- return QStringLiteral("InvalidType");
- case QOpenGLDebugMessage::ErrorType:
- return QStringLiteral("ErrorType");
- case QOpenGLDebugMessage::DeprecatedBehaviorType:
- return QStringLiteral("DeprecatedBehaviorType");
- case QOpenGLDebugMessage::UndefinedBehaviorType:
- return QStringLiteral("UndefinedBehaviorType");
- case QOpenGLDebugMessage::PortabilityType:
- return QStringLiteral("PortabilityType");
- case QOpenGLDebugMessage::PerformanceType:
- return QStringLiteral("PerformanceType");
- case QOpenGLDebugMessage::OtherType:
- return QStringLiteral("OtherType");
- case QOpenGLDebugMessage::MarkerType:
- return QStringLiteral("MarkerType");
- case QOpenGLDebugMessage::GroupPushType:
- return QStringLiteral("GroupPushType");
- case QOpenGLDebugMessage::GroupPopType:
- return QStringLiteral("GroupPopType");
- case QOpenGLDebugMessage::AnyType:
- return QStringLiteral("AnyType");
- }
-
- Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message type");
- return QString();
-}
-
-/*!
- \internal
-*/
-static QOpenGLDebugMessage::Severity qt_messageSeverityFromGL(GLenum severity)
-{
- switch (severity) {
- case GL_DEBUG_SEVERITY_HIGH:
- return QOpenGLDebugMessage::HighSeverity;
- case GL_DEBUG_SEVERITY_MEDIUM:
- return QOpenGLDebugMessage::MediumSeverity;
- case GL_DEBUG_SEVERITY_LOW:
- return QOpenGLDebugMessage::LowSeverity;
- case GL_DEBUG_SEVERITY_NOTIFICATION:
- return QOpenGLDebugMessage::NotificationSeverity;
- }
-
- Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message severity from GL");
- return QOpenGLDebugMessage::NotificationSeverity;
-}
-
-/*!
- \internal
-*/
-static GLenum qt_messageSeverityToGL(QOpenGLDebugMessage::Severity severity)
-{
- switch (severity) {
- case QOpenGLDebugMessage::InvalidSeverity:
- break;
- case QOpenGLDebugMessage::HighSeverity:
- return GL_DEBUG_SEVERITY_HIGH;
- case QOpenGLDebugMessage::MediumSeverity:
- return GL_DEBUG_SEVERITY_MEDIUM;
- case QOpenGLDebugMessage::LowSeverity:
- return GL_DEBUG_SEVERITY_LOW;
- case QOpenGLDebugMessage::NotificationSeverity:
- return GL_DEBUG_SEVERITY_NOTIFICATION;
- case QOpenGLDebugMessage::AnySeverity:
- break;
- }
-
- Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid message severity");
- return GL_DEBUG_SEVERITY_NOTIFICATION;
-}
-
-/*!
- \internal
-*/
-static QString qt_messageSeverityToString(QOpenGLDebugMessage::Severity severity)
-{
- switch (severity) {
- case QOpenGLDebugMessage::InvalidSeverity:
- return QStringLiteral("InvalidSeverity");
- case QOpenGLDebugMessage::HighSeverity:
- return QStringLiteral("HighSeverity");
- case QOpenGLDebugMessage::MediumSeverity:
- return QStringLiteral("MediumSeverity");
- case QOpenGLDebugMessage::LowSeverity:
- return QStringLiteral("LowSeverity");
- case QOpenGLDebugMessage::NotificationSeverity:
- return QStringLiteral("NotificationSeverity");
- case QOpenGLDebugMessage::AnySeverity:
- return QStringLiteral("AnySeverity");
- }
-
- Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message severity");
- return QString();
-}
-
-class QOpenGLDebugMessagePrivate : public QSharedData
-{
-public:
- QOpenGLDebugMessagePrivate();
-
- QString message;
- GLuint id;
- QOpenGLDebugMessage::Source source;
- QOpenGLDebugMessage::Type type;
- QOpenGLDebugMessage::Severity severity;
-};
-
-/*!
- \internal
-*/
-QOpenGLDebugMessagePrivate::QOpenGLDebugMessagePrivate()
- : message(),
- id(0),
- source(QOpenGLDebugMessage::InvalidSource),
- type(QOpenGLDebugMessage::InvalidType),
- severity(QOpenGLDebugMessage::InvalidSeverity)
-{
-}
-
-
-/*!
- Constructs a debug message with an empty message string, id set to 0,
- source set to InvalidSource, type set to InvalidType, and severity set to
- InvalidSeverity.
-
- \note This constructor should not be used to create a debug message;
- instead, use the createApplicationMessage() or the createThirdPartyMessage()
- static functions.
-
- \sa createApplicationMessage(), createThirdPartyMessage()
-*/
-QOpenGLDebugMessage::QOpenGLDebugMessage()
- : d(new QOpenGLDebugMessagePrivate)
-{
-}
-
-/*!
- Constructs a debug message as a copy of \a debugMessage.
-
- \sa operator=()
-*/
-QOpenGLDebugMessage::QOpenGLDebugMessage(const QOpenGLDebugMessage &debugMessage)
- : d(debugMessage.d)
-{
-}
-
-/*!
- Destroys this debug message.
-*/
-QOpenGLDebugMessage::~QOpenGLDebugMessage()
-{
-}
-
-/*!
- Assigns the message \a debugMessage to this object, and returns a reference
- to the copy.
-*/
-QOpenGLDebugMessage &QOpenGLDebugMessage::operator=(const QOpenGLDebugMessage &debugMessage)
-{
- d = debugMessage.d;
- return *this;
-}
-
-/*!
- \fn QOpenGLDebugMessage &QOpenGLDebugMessage::operator=(QOpenGLDebugMessage &&debugMessage)
-
- Move-assigns \a debugMessage to this object.
-*/
-
-/*!
- \fn void QOpenGLDebugMessage::swap(QOpenGLDebugMessage &debugMessage)
-
- Swaps the message \a debugMessage with this message. This operation is very
- fast and never fails.
-*/
-
-/*!
- Returns the source of the debug message.
-*/
-QOpenGLDebugMessage::Source QOpenGLDebugMessage::source() const
-{
- return d->source;
-}
-
-/*!
- Returns the type of the debug message.
-*/
-QOpenGLDebugMessage::Type QOpenGLDebugMessage::type() const
-{
- return d->type;
-}
-
-/*!
- Returns the severity of the debug message.
-*/
-QOpenGLDebugMessage::Severity QOpenGLDebugMessage::severity() const
-{
- return d->severity;
-}
-
-/*!
- Returns the id of the debug message. Ids are generally vendor-specific.
-*/
-GLuint QOpenGLDebugMessage::id() const
-{
- return d->id;
-}
-
-/*!
- Returns the textual message contained by this debug message.
-*/
-QString QOpenGLDebugMessage::message() const
-{
- return d->message;
-}
-
-/*!
- Constructs and returns a debug message with \a text as its text, \a id
- as id, \a severity as severity, and \a type as type. The message source
- will be set to ApplicationSource.
-
- \sa QOpenGLDebugLogger::logMessage(), createThirdPartyMessage()
-*/
-QOpenGLDebugMessage QOpenGLDebugMessage::createApplicationMessage(const QString &text,
- GLuint id,
- QOpenGLDebugMessage::Severity severity,
- QOpenGLDebugMessage::Type type)
-{
- QOpenGLDebugMessage m;
- m.d->message = text;
- m.d->id = id;
- m.d->severity = severity;
- m.d->type = type;
- m.d->source = ApplicationSource;
- return m;
-}
-
-/*!
- Constructs and returns a debug message with \a text as its text, \a id
- as id, \a severity as severity, and \a type as type. The message source
- will be set to ThirdPartySource.
-
- \sa QOpenGLDebugLogger::logMessage(), createApplicationMessage()
-*/
-QOpenGLDebugMessage QOpenGLDebugMessage::createThirdPartyMessage(const QString &text,
- GLuint id,
- QOpenGLDebugMessage::Severity severity,
- QOpenGLDebugMessage::Type type)
-{
- QOpenGLDebugMessage m;
- m.d->message = text;
- m.d->id = id;
- m.d->severity = severity;
- m.d->type = type;
- m.d->source = ThirdPartySource;
- return m;
-}
-
-/*!
- Returns \c true if this debug message is equal to \a debugMessage, or false
- otherwise. Two debugging messages are equal if they have the same textual
- message, the same id, the same source, the same type and the same severity.
-
- \sa operator!=()
-*/
-bool QOpenGLDebugMessage::operator==(const QOpenGLDebugMessage &debugMessage) const
-{
- return (d == debugMessage.d)
- || (d->id == debugMessage.d->id
- && d->source == debugMessage.d->source
- && d->type == debugMessage.d->type
- && d->severity == debugMessage.d->severity
- && d->message == debugMessage.d->message);
-}
-
-/*!
- \fn bool QOpenGLDebugMessage::operator!=(const QOpenGLDebugMessage &debugMessage) const
-
- Returns \c true if this message is different from \a debugMessage, or false
- otherwise.
-
- \sa operator==()
-*/
-
-#ifndef QT_NO_DEBUG_STREAM
-/*!
- \relates QOpenGLDebugMessage
-
- Writes the source \a source into the debug object \a debug for debugging
- purposes.
-*/
-QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Source source)
-{
- QDebugStateSaver saver(debug);
- debug.nospace() << "QOpenGLDebugMessage::Source("
- << qt_messageSourceToString(source)
- << ')';
- return debug;
-}
-
-/*!
- \relates QOpenGLDebugMessage
-
- Writes the type \a type into the debug object \a debug for debugging
- purposes.
-*/
-QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Type type)
-{
- QDebugStateSaver saver(debug);
- debug.nospace() << "QOpenGLDebugMessage::Type("
- << qt_messageTypeToString(type)
- << ')';
- return debug;
-}
-
-/*!
- \relates QOpenGLDebugMessage
-
- Writes the severity \a severity into the debug object \a debug for debugging
- purposes.
-*/
-QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Severity severity)
-{
- QDebugStateSaver saver(debug);
- debug.nospace() << "QOpenGLDebugMessage::Severity("
- << qt_messageSeverityToString(severity)
- << ')';
- return debug;
-}
-
-/*!
- \relates QOpenGLDebugMessage
-
- Writes the message \a message into the debug object \a debug for debugging
- purposes.
-*/
-QDebug operator<<(QDebug debug, const QOpenGLDebugMessage &message)
-{
- QDebugStateSaver saver(debug);
- debug.nospace() << "QOpenGLDebugMessage("
- << qt_messageSourceToString(message.source()) << ", "
- << message.id() << ", "
- << message.message() << ", "
- << qt_messageSeverityToString(message.severity()) << ", "
- << qt_messageTypeToString(message.type()) << ')';
- return debug;
-
-}
-#endif // QT_NO_DEBUG_STREAM
-
-typedef void (QOPENGLF_APIENTRYP qt_glDebugMessageControl_t)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
-typedef void (QOPENGLF_APIENTRYP qt_glDebugMessageInsert_t)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
-typedef void (QOPENGLF_APIENTRYP qt_glDebugMessageCallback_t)(GLDEBUGPROC callback, const void *userParam);
-typedef GLuint (QOPENGLF_APIENTRYP qt_glGetDebugMessageLog_t)(GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
-typedef void (QOPENGLF_APIENTRYP qt_glPushDebugGroup_t)(GLenum source, GLuint id, GLsizei length, const GLchar *message);
-typedef void (QOPENGLF_APIENTRYP qt_glPopDebugGroup_t)();
-typedef void (QOPENGLF_APIENTRYP qt_glGetPointerv_t)(GLenum pname, GLvoid **params);
-
-class QOpenGLDebugLoggerPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QOpenGLDebugLogger)
-public:
- QOpenGLDebugLoggerPrivate();
-
- void handleMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *rawMessage);
- void controlDebugMessages(QOpenGLDebugMessage::Sources sources,
- QOpenGLDebugMessage::Types types,
- QOpenGLDebugMessage::Severities severities,
- const QVector<GLuint> &ids,
- const QByteArray &callerName,
- bool enable);
- void _q_contextAboutToBeDestroyed();
-
- qt_glDebugMessageControl_t glDebugMessageControl;
- qt_glDebugMessageInsert_t glDebugMessageInsert;
- qt_glDebugMessageCallback_t glDebugMessageCallback;
- qt_glGetDebugMessageLog_t glGetDebugMessageLog;
- qt_glPushDebugGroup_t glPushDebugGroup;
- qt_glPopDebugGroup_t glPopDebugGroup;
- qt_glGetPointerv_t glGetPointerv;
-
- GLDEBUGPROC oldDebugCallbackFunction;
- void *oldDebugCallbackParameter;
- QOpenGLContext *context;
- GLint maxMessageLength;
- QOpenGLDebugLogger::LoggingMode loggingMode;
- bool initialized : 1;
- bool isLogging : 1;
- bool debugWasEnabled : 1;
- bool syncDebugWasEnabled : 1;
-};
-
-/*!
- \internal
-*/
-QOpenGLDebugLoggerPrivate::QOpenGLDebugLoggerPrivate()
- : glDebugMessageControl(nullptr),
- glDebugMessageInsert(nullptr),
- glDebugMessageCallback(nullptr),
- glGetDebugMessageLog(nullptr),
- glPushDebugGroup(nullptr),
- glPopDebugGroup(nullptr),
- oldDebugCallbackFunction(nullptr),
- context(nullptr),
- maxMessageLength(0),
- loggingMode(QOpenGLDebugLogger::AsynchronousLogging),
- initialized(false),
- isLogging(false),
- debugWasEnabled(false),
- syncDebugWasEnabled(false)
-{
-}
-
-/*!
- \internal
-*/
-void QOpenGLDebugLoggerPrivate::handleMessage(GLenum source,
- GLenum type,
- GLuint id,
- GLenum severity,
- GLsizei length,
- const GLchar *rawMessage)
-{
- if (oldDebugCallbackFunction)
- oldDebugCallbackFunction(source, type, id, severity, length, rawMessage, oldDebugCallbackParameter);
-
- QOpenGLDebugMessage message;
-
- QOpenGLDebugMessagePrivate *messagePrivate = message.d.data();
- messagePrivate->source = qt_messageSourceFromGL(source);
- messagePrivate->type = qt_messageTypeFromGL(type);
- messagePrivate->id = id;
- messagePrivate->severity = qt_messageSeverityFromGL(severity);
- // not passing the length to fromUtf8, as some bugged OpenGL drivers
- // do not handle the length correctly. Just rely on the message to be NUL terminated.
- messagePrivate->message = QString::fromUtf8(rawMessage);
-
- Q_Q(QOpenGLDebugLogger);
- emit q->messageLogged(message);
-}
-
-/*!
- \internal
-*/
-void QOpenGLDebugLoggerPrivate::controlDebugMessages(QOpenGLDebugMessage::Sources sources,
- QOpenGLDebugMessage::Types types,
- QOpenGLDebugMessage::Severities severities,
- const QVector<GLuint> &ids,
- const QByteArray &callerName,
- bool enable)
-{
- if (!initialized) {
- qWarning("QOpenGLDebugLogger::%s(): object must be initialized before enabling/disabling messages", callerName.constData());
- return;
- }
- if (sources == QOpenGLDebugMessage::InvalidSource) {
- qWarning("QOpenGLDebugLogger::%s(): invalid source specified", callerName.constData());
- return;
- }
- if (types == QOpenGLDebugMessage::InvalidType) {
- qWarning("QOpenGLDebugLogger::%s(): invalid type specified", callerName.constData());
- return;
- }
- if (severities == QOpenGLDebugMessage::InvalidSeverity) {
- qWarning("QOpenGLDebugLogger::%s(): invalid severity specified", callerName.constData());
- return;
- }
-
- QVarLengthArray<GLenum, 8> glSources;
- QVarLengthArray<GLenum, 8> glTypes;
- QVarLengthArray<GLenum, 8> glSeverities;
-
- if (ids.count() > 0) {
- Q_ASSERT(severities == QOpenGLDebugMessage::AnySeverity);
-
- // The GL_KHR_debug extension says:
- //
- // - If <count> is greater than zero, then <ids> is an array of <count>
- // message IDs for the specified combination of <source> and <type>. In
- // this case, if <source> or <type> is DONT_CARE, or <severity> is not
- // DONT_CARE, the error INVALID_OPERATION is generated. If <count> is
- // zero, the value if <ids> is ignored.
- //
- // This means we can't convert AnySource or AnyType into DONT_CARE, but we have to roll
- // them into individual sources/types.
-
- if (sources == QOpenGLDebugMessage::AnySource) {
- sources = QOpenGLDebugMessage::InvalidSource;
- for (uint i = 1; i <= QOpenGLDebugMessage::LastSource; i = i << 1)
- sources |= QOpenGLDebugMessage::Source(i);
- }
-
- if (types == QOpenGLDebugMessage::AnyType) {
- types = QOpenGLDebugMessage::InvalidType;
- for (uint i = 1; i <= QOpenGLDebugMessage::LastType; i = i << 1)
- types |= QOpenGLDebugMessage::Type(i);
- }
- }
-
-#define CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS(type, source, target) \
- if (source == QOpenGLDebugMessage::Any ## type) { \
- target << GL_DONT_CARE; \
- } else { \
- for (uint i = 1; i <= QOpenGLDebugMessage::Last ## type; i = i << 1) \
- if (source.testFlag(QOpenGLDebugMessage:: type (i))) \
- target << qt_message ## type ## ToGL (QOpenGLDebugMessage:: type (i)); \
- }
-
- CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS(Source, sources, glSources)
- CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS(Type, types, glTypes)
- CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS(Severity, severities, glSeverities)
-#undef CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS
-
- const GLsizei idCount = ids.count();
- // The GL_KHR_debug extension says that if idCount is 0, idPtr must be ignored.
- // Unfortunately, some bugged drivers do NOT ignore it, so pass NULL in case.
- const GLuint * const idPtr = idCount ? ids.constData() : nullptr;
-
- for (GLenum source : glSources)
- for (GLenum type : glTypes)
- for (GLenum severity : glSeverities)
- glDebugMessageControl(source, type, severity, idCount, idPtr, GLboolean(enable));
-}
-
-/*!
- \internal
-*/
-void QOpenGLDebugLoggerPrivate::_q_contextAboutToBeDestroyed()
-{
- Q_ASSERT(context);
-
- // Re-make our context current somehow, otherwise stopLogging will fail.
-
- // Save the current context and its surface in case we need to set them back
- QOpenGLContext *currentContext = QOpenGLContext::currentContext();
- QSurface *currentSurface = nullptr;
-
- QScopedPointer<QOffscreenSurface> offscreenSurface;
-
- if (context != currentContext) {
- // Make our old context current on a temporary surface
- if (currentContext)
- currentSurface = currentContext->surface();
-
- offscreenSurface.reset(new QOffscreenSurface);
- offscreenSurface->setFormat(context->format());
- offscreenSurface->create();
- if (!context->makeCurrent(offscreenSurface.data()))
- qWarning("QOpenGLDebugLoggerPrivate::_q_contextAboutToBeDestroyed(): could not make the owning GL context current for cleanup");
- }
-
- Q_Q(QOpenGLDebugLogger);
- q->stopLogging();
-
- if (offscreenSurface) {
- // We did change the current context: set it back
- if (currentContext)
- currentContext->makeCurrent(currentSurface);
- else
- context->doneCurrent();
- }
-
- QObject::disconnect(context, SIGNAL(aboutToBeDestroyed()), q, SLOT(_q_contextAboutToBeDestroyed()));
- context = nullptr;
- initialized = false;
-}
-
-extern "C" {
-static void QOPENGLF_APIENTRY qt_opengl_debug_callback(GLenum source,
- GLenum type,
- GLuint id,
- GLenum severity,
- GLsizei length,
- const GLchar *rawMessage,
- const GLvoid *userParam)
-{
- QOpenGLDebugLoggerPrivate *loggerPrivate = static_cast<QOpenGLDebugLoggerPrivate *>(const_cast<GLvoid *>(userParam));
- loggerPrivate->handleMessage(source, type, id, severity, length, rawMessage);
-}
-}
-
-/*!
- Constructs a new logger object with the given \a parent.
-
- \note The object must be initialized before logging can happen.
-
- \sa initialize()
-*/
-QOpenGLDebugLogger::QOpenGLDebugLogger(QObject *parent)
- : QObject(*new QOpenGLDebugLoggerPrivate, parent)
-{
- // QOpenGLDebugMessage is going to be mostly used as an argument
- // of a cross thread connection, therefore let's ease the life for the users
- // and register the type for them.
- qRegisterMetaType<QOpenGLDebugMessage>();
-}
-
-/*!
- Destroys the logger object.
-*/
-QOpenGLDebugLogger::~QOpenGLDebugLogger()
-{
- stopLogging();
-}
-
-/*!
- Initializes the object in the current OpenGL context. The context must
- support the \c{GL_KHR_debug} extension for the initialization to succeed.
- The object must be initialized before any logging can happen.
-
- It is safe to call this function multiple times from the same context.
-
- This function can also be used to change the context of a previously
- initialized object; note that in this case the object must not be logging
- when you call this function.
-
- Returns \c true if the logger is successfully initialized; false otherwise.
-
- \sa QOpenGLContext
-*/
-bool QOpenGLDebugLogger::initialize()
-{
- QOpenGLContext *context = QOpenGLContext::currentContext();
- if (!context) {
- qWarning("QOpenGLDebugLogger::initialize(): no current OpenGL context found.");
- return false;
- }
-
- Q_D(QOpenGLDebugLogger);
- if (d->context == context) {
- // context is non-NULL, d->context is non NULL only on successful initialization.
- Q_ASSERT(d->initialized);
- return true;
- }
-
- if (d->isLogging) {
- qWarning("QOpenGLDebugLogger::initialize(): cannot initialize the object while logging. Please stop the logging first.");
- return false;
- }
-
- if (d->context)
- disconnect(d->context, SIGNAL(aboutToBeDestroyed()), this, SLOT(_q_contextAboutToBeDestroyed()));
-
- d->initialized = false;
- d->context = nullptr;
-
- if (!context->hasExtension(QByteArrayLiteral("GL_KHR_debug")))
- return false;
-
- d->context = context;
- connect(d->context, SIGNAL(aboutToBeDestroyed()), this, SLOT(_q_contextAboutToBeDestroyed()));
-
-#define GET_DEBUG_PROC_ADDRESS(procName) \
- d->procName = reinterpret_cast< qt_ ## procName ## _t >( \
- d->context->getProcAddress(d->context->isOpenGLES() ? (#procName "KHR") : (#procName)) \
- );
-
- GET_DEBUG_PROC_ADDRESS(glDebugMessageControl);
- GET_DEBUG_PROC_ADDRESS(glDebugMessageInsert);
- GET_DEBUG_PROC_ADDRESS(glDebugMessageCallback);
- GET_DEBUG_PROC_ADDRESS(glGetDebugMessageLog);
- GET_DEBUG_PROC_ADDRESS(glPushDebugGroup);
- GET_DEBUG_PROC_ADDRESS(glPopDebugGroup);
- GET_DEBUG_PROC_ADDRESS(glGetPointerv)
-
-#undef GET_DEBUG_PROC_ADDRESS
-
- QOpenGLContext::currentContext()->functions()->glGetIntegerv(GL_MAX_DEBUG_MESSAGE_LENGTH, &d->maxMessageLength);
-
-#ifndef QT_NO_DEBUG
- if (!d->context->format().testOption(QSurfaceFormat::DebugContext)) {
- qWarning("QOpenGLDebugLogger::initialize(): the current context is not a debug context:\n"
- " this means that the GL may not generate any debug output at all.\n"
- " To avoid this warning, try creating the context with the\n"
- " QSurfaceFormat::DebugContext surface format option.");
- }
-#endif // QT_NO_DEBUG
-
- d->initialized = true;
- return true;
-}
-
-/*!
- Returns \c true if this object is currently logging, false otherwise.
-
- \sa startLogging()
-*/
-bool QOpenGLDebugLogger::isLogging() const
-{
- Q_D(const QOpenGLDebugLogger);
- return d->isLogging;
-}
-
-/*!
- Starts logging messages coming from the OpenGL server. When a new message
- is received, the signal messageLogged() is emitted, carrying the logged
- message as argument.
-
- \a loggingMode specifies whether the logging must be asynchronous (the default)
- or synchronous.
-
- QOpenGLDebugLogger will record the values of \c{GL_DEBUG_OUTPUT} and
- \c{GL_DEBUG_OUTPUT_SYNCHRONOUS} when logging is started, and set them back
- when logging is stopped. Moreover, any user-defined OpenGL debug callback
- installed when this function is invoked will be restored when logging is
- stopped; QOpenGLDebugLogger will ensure that the pre-existing callback will
- still be invoked when logging.
-
- \note It's not possible to change the logging mode without stopping and
- starting logging again. This might change in a future version of Qt.
-
- \note The object must be initialized before logging can happen.
-
- \sa stopLogging(), initialize()
-*/
-void QOpenGLDebugLogger::startLogging(QOpenGLDebugLogger::LoggingMode loggingMode)
-{
- Q_D(QOpenGLDebugLogger);
- if (!d->initialized) {
- qWarning("QOpenGLDebugLogger::startLogging(): object must be initialized before logging can start");
- return;
- }
- if (d->isLogging) {
- qWarning("QOpenGLDebugLogger::startLogging(): this object is already logging");
- return;
- }
-
- d->isLogging = true;
- d->loggingMode = loggingMode;
-
- d->glGetPointerv(GL_DEBUG_CALLBACK_FUNCTION, reinterpret_cast<void **>(&d->oldDebugCallbackFunction));
- d->glGetPointerv(GL_DEBUG_CALLBACK_USER_PARAM, &d->oldDebugCallbackParameter);
-
- d->glDebugMessageCallback(&qt_opengl_debug_callback, d);
-
- QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
- d->debugWasEnabled = funcs->glIsEnabled(GL_DEBUG_OUTPUT);
- d->syncDebugWasEnabled = funcs->glIsEnabled(GL_DEBUG_OUTPUT_SYNCHRONOUS);
-
- if (d->loggingMode == SynchronousLogging)
- funcs->glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
- else
- funcs->glDisable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
-
- funcs->glEnable(GL_DEBUG_OUTPUT);
-}
-
-/*!
- Returns the logging mode of the object.
-
- \sa startLogging()
-*/
-QOpenGLDebugLogger::LoggingMode QOpenGLDebugLogger::loggingMode() const
-{
- Q_D(const QOpenGLDebugLogger);
- return d->loggingMode;
-}
-
-/*!
- Stops logging messages from the OpenGL server.
-
- \sa startLogging()
-*/
-void QOpenGLDebugLogger::stopLogging()
-{
- Q_D(QOpenGLDebugLogger);
- if (!d->isLogging)
- return;
-
- QOpenGLContext *currentContext = QOpenGLContext::currentContext();
- if (!currentContext || currentContext != d->context) {
- qWarning("QOpenGLDebugLogger::stopLogging(): attempting to stop logging with the wrong OpenGL context current");
- return;
- }
-
- d->isLogging = false;
-
- d->glDebugMessageCallback(d->oldDebugCallbackFunction, d->oldDebugCallbackParameter);
-
- QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
- if (!d->debugWasEnabled)
- funcs->glDisable(GL_DEBUG_OUTPUT);
-
- if (d->syncDebugWasEnabled)
- funcs->glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
- else
- funcs->glDisable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
-}
-
-/*!
- Inserts the message \a debugMessage into the OpenGL debug log. This provides
- a way for applications or libraries to insert custom messages that can
- ease the debugging of OpenGL applications.
-
- \note \a debugMessage must have QOpenGLDebugMessage::ApplicationSource or
- QOpenGLDebugMessage::ThirdPartySource as its source, and a valid
- type and severity, otherwise it will not be inserted into the log.
-
- \note The object must be initialized before logging can happen.
-
- \sa initialize()
-*/
-void QOpenGLDebugLogger::logMessage(const QOpenGLDebugMessage &debugMessage)
-{
- Q_D(QOpenGLDebugLogger);
- if (!d->initialized) {
- qWarning("QOpenGLDebugLogger::logMessage(): object must be initialized before logging messages");
- return;
- }
- if (debugMessage.source() != QOpenGLDebugMessage::ApplicationSource
- && debugMessage.source() != QOpenGLDebugMessage::ThirdPartySource) {
- qWarning("QOpenGLDebugLogger::logMessage(): using a message source different from ApplicationSource\n"
- " or ThirdPartySource is not supported by GL_KHR_debug. The message will not be logged.");
- return;
- }
- if (debugMessage.type() == QOpenGLDebugMessage::InvalidType
- || debugMessage.type() == QOpenGLDebugMessage::AnyType
- || debugMessage.severity() == QOpenGLDebugMessage::InvalidSeverity
- || debugMessage.severity() == QOpenGLDebugMessage::AnySeverity) {
- qWarning("QOpenGLDebugLogger::logMessage(): the message has a non-valid type and/or severity. The message will not be logged.");
- return;
- }
-
- const GLenum source = qt_messageSourceToGL(debugMessage.source());
- const GLenum type = qt_messageTypeToGL(debugMessage.type());
- const GLenum severity = qt_messageSeverityToGL(debugMessage.severity());
- QByteArray rawMessage = debugMessage.message().toUtf8();
- rawMessage.append('\0');
-
- if (rawMessage.length() > d->maxMessageLength) {
- qWarning("QOpenGLDebugLogger::logMessage(): message too long, truncating it\n"
- " (%d bytes long, but the GL accepts up to %d bytes)", rawMessage.length(), d->maxMessageLength);
- rawMessage.resize(d->maxMessageLength - 1);
- rawMessage.append('\0');
- }
-
- // Don't pass rawMessage.length(), as unfortunately bugged
- // OpenGL drivers will eat the trailing NUL in the message. Just rely
- // on the message being NUL terminated.
- d->glDebugMessageInsert(source,
- type,
- debugMessage.id(),
- severity,
- -1,
- rawMessage.constData());
-}
-
-/*!
- Pushes a debug group with name \a name, id \a id, and source \a source onto
- the debug groups stack. If the group is successfully pushed, OpenGL will
- automatically log a message with message \a name, id \a id, source \a
- source, type QOpenGLDebugMessage::GroupPushType and severity
- QOpenGLDebugMessage::NotificationSeverity.
-
- The newly pushed group will inherit the same filtering settings of the
- group that was on the top of the stack; that is, the filtering will not be
- changed by pushing a new group.
-
- \note The \a source must either be QOpenGLDebugMessage::ApplicationSource or
- QOpenGLDebugMessage::ThirdPartySource, otherwise the group will not be pushed.
-
- \note The object must be initialized before managing debug groups.
-
- \sa popGroup(), enableMessages(), disableMessages()
-*/
-void QOpenGLDebugLogger::pushGroup(const QString &name, GLuint id, QOpenGLDebugMessage::Source source)
-{
- Q_D(QOpenGLDebugLogger);
- if (!d->initialized) {
- qWarning("QOpenGLDebugLogger::pushGroup(): object must be initialized before pushing a debug group");
- return;
- }
- if (source != QOpenGLDebugMessage::ApplicationSource
- && source != QOpenGLDebugMessage::ThirdPartySource) {
- qWarning("QOpenGLDebugLogger::pushGroup(): using a source different from ApplicationSource\n"
- " or ThirdPartySource is not supported by GL_KHR_debug. The group will not be pushed.");
- return;
- }
-
- QByteArray rawName = name.toUtf8();
- rawName.append('\0');
- if (rawName.length() > d->maxMessageLength) {
- qWarning("QOpenGLDebugLogger::pushGroup(): group name too long, truncating it\n"
- " (%d bytes long, but the GL accepts up to %d bytes)", rawName.length(), d->maxMessageLength);
- rawName.resize(d->maxMessageLength - 1);
- rawName.append('\0');
- }
-
- // Don't pass rawMessage.length(), as unfortunately bugged
- // OpenGL drivers will eat the trailing NUL in the name. Just rely
- // on the name being NUL terminated.
- d->glPushDebugGroup(qt_messageSourceToGL(source), id, -1, rawName.constData());
-}
-
-/*!
- Pops the topmost debug group from the debug groups stack. If the group is
- successfully popped, OpenGL will automatically log a message with message,
- id and source matching those of the popped group, type
- QOpenGLDebugMessage::GroupPopType and severity
- QOpenGLDebugMessage::NotificationSeverity.
-
- Popping a debug group will restore the message filtering settings of the
- group that becomes the top of the debug groups stack.
-
- \note The object must be initialized before managing debug groups.
-
- \sa pushGroup()
-*/
-void QOpenGLDebugLogger::popGroup()
-{
- Q_D(QOpenGLDebugLogger);
- if (!d->initialized) {
- qWarning("QOpenGLDebugLogger::pushGroup(): object must be initialized before popping a debug group");
- return;
- }
-
- d->glPopDebugGroup();
-}
-
-/*!
- Enables the logging of messages from the given \a sources, of the given \a
- types and with the given \a severities and any message id.
-
- The logging will be enabled in the current control group.
-
- \sa disableMessages(), pushGroup(), popGroup()
-*/
-void QOpenGLDebugLogger::enableMessages(QOpenGLDebugMessage::Sources sources,
- QOpenGLDebugMessage::Types types,
- QOpenGLDebugMessage::Severities severities)
-{
- Q_D(QOpenGLDebugLogger);
- d->controlDebugMessages(sources,
- types,
- severities,
- QVector<GLuint>(),
- QByteArrayLiteral("enableMessages"),
- true);
-}
-
-/*!
- Enables the logging of messages with the given \a ids, from the given \a
- sources and of the given \a types and any severity.
-
- The logging will be enabled in the current control group.
-
- \sa disableMessages(), pushGroup(), popGroup()
-*/
-void QOpenGLDebugLogger::enableMessages(const QVector<GLuint> &ids,
- QOpenGLDebugMessage::Sources sources,
- QOpenGLDebugMessage::Types types)
-{
- Q_D(QOpenGLDebugLogger);
- d->controlDebugMessages(sources,
- types,
- QOpenGLDebugMessage::AnySeverity,
- ids,
- QByteArrayLiteral("enableMessages"),
- true);
-}
-
-/*!
- Disables the logging of messages with the given \a sources, of the given \a
- types and with the given \a severities and any message id.
-
- The logging will be disabled in the current control group.
-
- \sa enableMessages(), pushGroup(), popGroup()
-*/
-void QOpenGLDebugLogger::disableMessages(QOpenGLDebugMessage::Sources sources,
- QOpenGLDebugMessage::Types types,
- QOpenGLDebugMessage::Severities severities)
-{
- Q_D(QOpenGLDebugLogger);
- d->controlDebugMessages(sources,
- types,
- severities,
- QVector<GLuint>(),
- QByteArrayLiteral("disableMessages"),
- false);
-}
-
-/*!
- Disables the logging of messages with the given \a ids, from the given \a
- sources and of the given \a types and any severity.
-
- The logging will be disabled in the current control group.
-
- \sa enableMessages(), pushGroup(), popGroup()
-*/
-void QOpenGLDebugLogger::disableMessages(const QVector<GLuint> &ids,
- QOpenGLDebugMessage::Sources sources,
- QOpenGLDebugMessage::Types types)
-{
- Q_D(QOpenGLDebugLogger);
- d->controlDebugMessages(sources,
- types,
- QOpenGLDebugMessage::AnySeverity,
- ids,
- QByteArrayLiteral("disableMessages"),
- false);
-}
-
-/*!
- Reads all the available messages in the OpenGL internal debug log and
- returns them. Moreover, this function will clear the internal debug log,
- so that subsequent invocations will not return messages that were
- already returned.
-
- \sa startLogging()
-*/
-QList<QOpenGLDebugMessage> QOpenGLDebugLogger::loggedMessages() const
-{
- Q_D(const QOpenGLDebugLogger);
- if (!d->initialized) {
- qWarning("QOpenGLDebugLogger::loggedMessages(): object must be initialized before reading logged messages");
- return QList<QOpenGLDebugMessage>();
- }
-
- static const GLuint maxMessageCount = 128;
- GLuint messagesRead;
- GLenum messageSources[maxMessageCount];
- GLenum messageTypes[maxMessageCount];
- GLuint messageIds[maxMessageCount];
- GLenum messageSeverities[maxMessageCount];
- GLsizei messageLengths[maxMessageCount];
-
- QByteArray messagesBuffer;
- messagesBuffer.resize(maxMessageCount * d->maxMessageLength);
-
- QList<QOpenGLDebugMessage> messages;
- do {
- messagesRead = d->glGetDebugMessageLog(maxMessageCount,
- GLsizei(messagesBuffer.size()),
- messageSources,
- messageTypes,
- messageIds,
- messageSeverities,
- messageLengths,
- messagesBuffer.data());
-
- const char *messagesBufferPtr = messagesBuffer.constData();
- for (GLuint i = 0; i < messagesRead; ++i) {
- QOpenGLDebugMessage message;
-
- QOpenGLDebugMessagePrivate *messagePrivate = message.d.data();
- messagePrivate->source = qt_messageSourceFromGL(messageSources[i]);
- messagePrivate->type = qt_messageTypeFromGL(messageTypes[i]);
- messagePrivate->id = messageIds[i];
- messagePrivate->severity = qt_messageSeverityFromGL(messageSeverities[i]);
- messagePrivate->message = QString::fromUtf8(messagesBufferPtr, messageLengths[i] - 1);
-
- messagesBufferPtr += messageLengths[i];
- messages << message;
- }
- } while (messagesRead == maxMessageCount);
-
- return messages;
-}
-
-/*!
- \fn void QOpenGLDebugLogger::messageLogged(const QOpenGLDebugMessage &debugMessage)
-
- This signal is emitted when a debug message (wrapped by the \a debugMessage
- argument) is logged from the OpenGL server.
-
- Depending on the OpenGL implementation, this signal can be emitted
- from other threads than the one(s) the receiver(s) lives in, and even
- different from the thread the QOpenGLContext in which this object has
- been initialized lives in. Moreover, the signal could be emitted from
- multiple threads at the same time. This is normally not a problem,
- as Qt will utilize a queued connection for cross-thread signal emissions,
- but if you force the connection type to Direct then you must be aware of
- the potential races in the slots connected to this signal.
-
- If logging have been started in SynchronousLogging mode, OpenGL guarantees
- that this signal will be emitted from the same thread the QOpenGLContext
- has been bound to, and no concurrent invocations will ever happen.
-
- \note Logging must have been started, or this signal will not be emitted.
-
- \sa startLogging()
-*/
-
-/*!
- Returns the maximum supported length, in bytes, for the text of the messages
- passed to logMessage(). This is also the maximum length of a debug group
- name, as pushing or popping groups will automatically log a message with
- the debug group name as the message text.
-
- If a message text is too long, it will be automatically truncated by
- QOpenGLDebugLogger.
-
- \note Message texts are encoded in UTF-8 when they get passed to OpenGL, so
- their size in bytes does not usually match the amount of UTF-16 code units,
- as returned, for instance, by QString::length(). (It does if the message contains
- 7-bit ASCII only data, which is typical for debug messages.)
-*/
-qint64 QOpenGLDebugLogger::maximumMessageLength() const
-{
- Q_D(const QOpenGLDebugLogger);
- if (!d->initialized) {
- qWarning("QOpenGLDebugLogger::maximumMessageLength(): object must be initialized before reading the maximum message length");
- return -1;
- }
- return d->maxMessageLength;
-}
-
-
-QT_END_NAMESPACE
-
-#include "moc_qopengldebug.cpp"
diff --git a/src/gui/opengl/qopengldebug.h b/src/gui/opengl/qopengldebug.h
deleted file mode 100644
index 7363985d60..0000000000
--- a/src/gui/opengl/qopengldebug.h
+++ /dev/null
@@ -1,221 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLDEBUG_H
-#define QOPENGLDEBUG_H
-
-#include <QtGui/qtguiglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtCore/qshareddata.h>
-#include <QtCore/qflags.h>
-#include <QtCore/qlist.h>
-#include <QtCore/qvector.h>
-#include <QtCore/qmetatype.h>
-#include <QtCore/qdebug.h>
-#include <QtGui/qopenglcontext.h>
-
-#if defined(Q_CLANG_QDOC)
-#undef GLuint
-typedef unsigned int GLuint;
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLDebugLogger;
-class QOpenGLDebugLoggerPrivate;
-class QOpenGLDebugMessagePrivate;
-
-class Q_GUI_EXPORT QOpenGLDebugMessage
-{
-public:
- enum Source {
- InvalidSource = 0x00000000,
- APISource = 0x00000001,
- WindowSystemSource = 0x00000002,
- ShaderCompilerSource = 0x00000004,
- ThirdPartySource = 0x00000008,
- ApplicationSource = 0x00000010,
- OtherSource = 0x00000020,
- LastSource = OtherSource, // private API
- AnySource = 0xffffffff
- };
- Q_DECLARE_FLAGS(Sources, Source)
-
- enum Type {
- InvalidType = 0x00000000,
- ErrorType = 0x00000001,
- DeprecatedBehaviorType = 0x00000002,
- UndefinedBehaviorType = 0x00000004,
- PortabilityType = 0x00000008,
- PerformanceType = 0x00000010,
- OtherType = 0x00000020,
- MarkerType = 0x00000040,
- GroupPushType = 0x00000080,
- GroupPopType = 0x00000100,
- LastType = GroupPopType, // private API
- AnyType = 0xffffffff
- };
- Q_DECLARE_FLAGS(Types, Type)
-
- enum Severity {
- InvalidSeverity = 0x00000000,
- HighSeverity = 0x00000001,
- MediumSeverity = 0x00000002,
- LowSeverity = 0x00000004,
- NotificationSeverity = 0x00000008,
- LastSeverity = NotificationSeverity, // private API
- AnySeverity = 0xffffffff
- };
- Q_DECLARE_FLAGS(Severities, Severity)
-
- QOpenGLDebugMessage();
- QOpenGLDebugMessage(const QOpenGLDebugMessage &debugMessage);
-
- QOpenGLDebugMessage &operator=(const QOpenGLDebugMessage &debugMessage);
- QOpenGLDebugMessage &operator=(QOpenGLDebugMessage &&other) noexcept { swap(other); return *this; }
- ~QOpenGLDebugMessage();
-
- void swap(QOpenGLDebugMessage &other) noexcept { qSwap(d, other.d); }
-
- Source source() const;
- Type type() const;
- Severity severity() const;
- GLuint id() const;
- QString message() const;
-
- static QOpenGLDebugMessage createApplicationMessage(const QString &text,
- GLuint id = 0,
- Severity severity = NotificationSeverity,
- Type type = OtherType);
- static QOpenGLDebugMessage createThirdPartyMessage(const QString &text,
- GLuint id = 0,
- Severity severity = NotificationSeverity,
- Type type = OtherType);
-
- bool operator==(const QOpenGLDebugMessage &debugMessage) const;
- inline bool operator!=(const QOpenGLDebugMessage &debugMessage) const { return !operator==(debugMessage); }
-
-private:
- friend class QOpenGLDebugLogger;
- friend class QOpenGLDebugLoggerPrivate;
- QSharedDataPointer<QOpenGLDebugMessagePrivate> d;
-};
-
-Q_DECLARE_SHARED(QOpenGLDebugMessage)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLDebugMessage::Sources)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLDebugMessage::Types)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLDebugMessage::Severities)
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_GUI_EXPORT QDebug operator<<(QDebug debug, const QOpenGLDebugMessage &message);
-Q_GUI_EXPORT QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Source source);
-Q_GUI_EXPORT QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Type type);
-Q_GUI_EXPORT QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Severity severity);
-#endif
-
-class QOpenGLDebugLoggerPrivate;
-
-class Q_GUI_EXPORT QOpenGLDebugLogger : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(LoggingMode loggingMode READ loggingMode)
-
-public:
- enum LoggingMode {
- AsynchronousLogging,
- SynchronousLogging
- };
- Q_ENUM(LoggingMode)
-
- explicit QOpenGLDebugLogger(QObject *parent = nullptr);
- ~QOpenGLDebugLogger();
-
- bool initialize();
-
- bool isLogging() const;
- LoggingMode loggingMode() const;
-
- qint64 maximumMessageLength() const;
-
- void pushGroup(const QString &name,
- GLuint id = 0,
- QOpenGLDebugMessage::Source source = QOpenGLDebugMessage::ApplicationSource);
- void popGroup();
-
- void enableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
- QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType,
- QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity);
-
- void enableMessages(const QVector<GLuint> &ids,
- QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
- QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType);
-
- void disableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
- QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType,
- QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity);
-
- void disableMessages(const QVector<GLuint> &ids,
- QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
- QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType);
-
- QList<QOpenGLDebugMessage> loggedMessages() const;
-
-public Q_SLOTS:
- void logMessage(const QOpenGLDebugMessage &debugMessage);
- void startLogging(LoggingMode loggingMode = AsynchronousLogging);
- void stopLogging();
-
-Q_SIGNALS:
- void messageLogged(const QOpenGLDebugMessage &debugMessage);
-
-private:
- Q_DISABLE_COPY(QOpenGLDebugLogger)
- Q_DECLARE_PRIVATE(QOpenGLDebugLogger)
- Q_PRIVATE_SLOT(d_func(), void _q_contextAboutToBeDestroyed())
-};
-
-QT_END_NAMESPACE
-
-Q_DECLARE_METATYPE(QOpenGLDebugMessage)
-
-#endif // QT_NO_OPENGL
-
-#endif // QOPENGLDEBUG_H
diff --git a/src/gui/opengl/qopenglengineshadermanager.cpp b/src/gui/opengl/qopenglengineshadermanager.cpp
deleted file mode 100644
index a569975486..0000000000
--- a/src/gui/opengl/qopenglengineshadermanager.cpp
+++ /dev/null
@@ -1,898 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenglengineshadermanager_p.h"
-#include "qopenglengineshadersource_p.h"
-#include "qopenglpaintengine_p.h"
-#include "qopenglshadercache_p.h"
-
-#include <QtGui/private/qopenglcontext_p.h>
-#include <QtCore/qthreadstorage.h>
-
-#include <algorithm>
-
-#if defined(QT_DEBUG)
-#include <QMetaEnum>
-#endif
-
-// #define QT_GL_SHARED_SHADER_DEBUG
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLEngineSharedShadersResource : public QOpenGLSharedResource
-{
-public:
- QOpenGLEngineSharedShadersResource(QOpenGLContext *ctx)
- : QOpenGLSharedResource(ctx->shareGroup())
- , m_shaders(new QOpenGLEngineSharedShaders(ctx))
- {
- }
-
- ~QOpenGLEngineSharedShadersResource()
- {
- delete m_shaders;
- }
-
- void invalidateResource() override
- {
- delete m_shaders;
- m_shaders = nullptr;
- }
-
- void freeResource(QOpenGLContext *) override
- {
- }
-
- QOpenGLEngineSharedShaders *shaders() const { return m_shaders; }
-
-private:
- QOpenGLEngineSharedShaders *m_shaders;
-};
-
-class QOpenGLShaderStorage
-{
-public:
- QOpenGLEngineSharedShaders *shadersForThread(QOpenGLContext *context) {
- QOpenGLMultiGroupSharedResource *&shaders = m_storage.localData();
- if (!shaders)
- shaders = new QOpenGLMultiGroupSharedResource;
- QOpenGLEngineSharedShadersResource *resource =
- shaders->value<QOpenGLEngineSharedShadersResource>(context);
- return resource ? resource->shaders() : nullptr;
- }
-
-private:
- QThreadStorage<QOpenGLMultiGroupSharedResource *> m_storage;
-};
-
-Q_GLOBAL_STATIC(QOpenGLShaderStorage, qt_shader_storage);
-
-QOpenGLEngineSharedShaders *QOpenGLEngineSharedShaders::shadersForContext(QOpenGLContext *context)
-{
- return qt_shader_storage()->shadersForThread(context);
-}
-
-const char* QOpenGLEngineSharedShaders::qShaderSnippets[] = {
- 0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0
-};
-
-QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context)
- : blitShaderProg(nullptr)
- , simpleShaderProg(nullptr)
-{
-
-/*
- Rather than having the shader source array statically initialised, it is initialised
- here instead. This is to allow new shader names to be inserted or existing names moved
- around without having to change the order of the glsl strings. It is hoped this will
- make future hard-to-find runtime bugs more obvious and generally give more solid code.
-*/
-
- // Check if the user has requested an OpenGL 3.2 Core Profile or higher
- // and if so use GLSL 1.50 core shaders instead of legacy ones.
- const QSurfaceFormat &fmt = context->format();
- const bool isCoreProfile = fmt.profile() == QSurfaceFormat::CoreProfile && fmt.version() >= qMakePair(3,2);
-
- const char** code = qShaderSnippets; // shortcut
-
- if (isCoreProfile) {
- code[MainVertexShader] = qopenglslMainVertexShader_core;
- code[MainWithTexCoordsVertexShader] = qopenglslMainWithTexCoordsVertexShader_core;
- code[MainWithTexCoordsAndOpacityVertexShader] = qopenglslMainWithTexCoordsAndOpacityVertexShader_core;
-
- code[UntransformedPositionVertexShader] = qopenglslUntransformedPositionVertexShader_core;
- code[PositionOnlyVertexShader] = qopenglslPositionOnlyVertexShader_core;
- code[ComplexGeometryPositionOnlyVertexShader] = qopenglslComplexGeometryPositionOnlyVertexShader_core;
- code[PositionWithPatternBrushVertexShader] = qopenglslPositionWithPatternBrushVertexShader_core;
- code[PositionWithLinearGradientBrushVertexShader] = qopenglslPositionWithLinearGradientBrushVertexShader_core;
- code[PositionWithConicalGradientBrushVertexShader] = qopenglslPositionWithConicalGradientBrushVertexShader_core;
- code[PositionWithRadialGradientBrushVertexShader] = qopenglslPositionWithRadialGradientBrushVertexShader_core;
- code[PositionWithTextureBrushVertexShader] = qopenglslPositionWithTextureBrushVertexShader_core;
- code[AffinePositionWithPatternBrushVertexShader] = qopenglslAffinePositionWithPatternBrushVertexShader_core;
- code[AffinePositionWithLinearGradientBrushVertexShader] = qopenglslAffinePositionWithLinearGradientBrushVertexShader_core;
- code[AffinePositionWithConicalGradientBrushVertexShader] = qopenglslAffinePositionWithConicalGradientBrushVertexShader_core;
- code[AffinePositionWithRadialGradientBrushVertexShader] = qopenglslAffinePositionWithRadialGradientBrushVertexShader_core;
- code[AffinePositionWithTextureBrushVertexShader] = qopenglslAffinePositionWithTextureBrushVertexShader_core;
-
- code[MainFragmentShader_MO] = qopenglslMainFragmentShader_MO_core;
- code[MainFragmentShader_M] = qopenglslMainFragmentShader_M_core;
- code[MainFragmentShader_O] = qopenglslMainFragmentShader_O_core;
- code[MainFragmentShader] = qopenglslMainFragmentShader_core;
- code[MainFragmentShader_ImageArrays] = qopenglslMainFragmentShader_ImageArrays_core;
-
- code[ImageSrcFragmentShader] = qopenglslImageSrcFragmentShader_core;
- code[ImageSrcWithPatternFragmentShader] = qopenglslImageSrcWithPatternFragmentShader_core;
- code[NonPremultipliedImageSrcFragmentShader] = qopenglslNonPremultipliedImageSrcFragmentShader_core;
- code[GrayscaleImageSrcFragmentShader] = qopenglslGrayscaleImageSrcFragmentShader_core;
- code[AlphaImageSrcFragmentShader] = qopenglslAlphaImageSrcFragmentShader_core;
- code[CustomImageSrcFragmentShader] = qopenglslCustomSrcFragmentShader_core; // Calls "customShader", which must be appended
- code[SolidBrushSrcFragmentShader] = qopenglslSolidBrushSrcFragmentShader_core;
-
- code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_core;
- code[TextureBrushSrcWithPatternFragmentShader] = qopenglslTextureBrushSrcWithPatternFragmentShader_core;
- code[PatternBrushSrcFragmentShader] = qopenglslPatternBrushSrcFragmentShader_core;
- code[LinearGradientBrushSrcFragmentShader] = qopenglslLinearGradientBrushSrcFragmentShader_core;
- code[RadialGradientBrushSrcFragmentShader] = qopenglslRadialGradientBrushSrcFragmentShader_core;
- code[ConicalGradientBrushSrcFragmentShader] = qopenglslConicalGradientBrushSrcFragmentShader_core;
- code[ShockingPinkSrcFragmentShader] = qopenglslShockingPinkSrcFragmentShader_core;
-
- code[NoMaskFragmentShader] = "";
- code[MaskFragmentShader] = qopenglslMaskFragmentShader_core;
- code[RgbMaskFragmentShaderPass1] = qopenglslRgbMaskFragmentShaderPass1_core;
- code[RgbMaskFragmentShaderPass2] = qopenglslRgbMaskFragmentShaderPass2_core;
- code[RgbMaskWithGammaFragmentShader] = ""; //###
- } else {
- code[MainVertexShader] = qopenglslMainVertexShader;
- code[MainWithTexCoordsVertexShader] = qopenglslMainWithTexCoordsVertexShader;
- code[MainWithTexCoordsAndOpacityVertexShader] = qopenglslMainWithTexCoordsAndOpacityVertexShader;
-
- code[UntransformedPositionVertexShader] = qopenglslUntransformedPositionVertexShader;
- code[PositionOnlyVertexShader] = qopenglslPositionOnlyVertexShader;
- code[ComplexGeometryPositionOnlyVertexShader] = qopenglslComplexGeometryPositionOnlyVertexShader;
- code[PositionWithPatternBrushVertexShader] = qopenglslPositionWithPatternBrushVertexShader;
- code[PositionWithLinearGradientBrushVertexShader] = qopenglslPositionWithLinearGradientBrushVertexShader;
- code[PositionWithConicalGradientBrushVertexShader] = qopenglslPositionWithConicalGradientBrushVertexShader;
- code[PositionWithRadialGradientBrushVertexShader] = qopenglslPositionWithRadialGradientBrushVertexShader;
- code[PositionWithTextureBrushVertexShader] = qopenglslPositionWithTextureBrushVertexShader;
- code[AffinePositionWithPatternBrushVertexShader] = qopenglslAffinePositionWithPatternBrushVertexShader;
- code[AffinePositionWithLinearGradientBrushVertexShader] = qopenglslAffinePositionWithLinearGradientBrushVertexShader;
- code[AffinePositionWithConicalGradientBrushVertexShader] = qopenglslAffinePositionWithConicalGradientBrushVertexShader;
- code[AffinePositionWithRadialGradientBrushVertexShader] = qopenglslAffinePositionWithRadialGradientBrushVertexShader;
- code[AffinePositionWithTextureBrushVertexShader] = qopenglslAffinePositionWithTextureBrushVertexShader;
-
- code[MainFragmentShader_MO] = qopenglslMainFragmentShader_MO;
- code[MainFragmentShader_M] = qopenglslMainFragmentShader_M;
- code[MainFragmentShader_O] = qopenglslMainFragmentShader_O;
- code[MainFragmentShader] = qopenglslMainFragmentShader;
- code[MainFragmentShader_ImageArrays] = qopenglslMainFragmentShader_ImageArrays;
-
- code[ImageSrcFragmentShader] = qopenglslImageSrcFragmentShader;
- code[ImageSrcWithPatternFragmentShader] = qopenglslImageSrcWithPatternFragmentShader;
- code[NonPremultipliedImageSrcFragmentShader] = qopenglslNonPremultipliedImageSrcFragmentShader;
- code[GrayscaleImageSrcFragmentShader] = qopenglslGrayscaleImageSrcFragmentShader;
- code[AlphaImageSrcFragmentShader] = qopenglslAlphaImageSrcFragmentShader;
- code[CustomImageSrcFragmentShader] = qopenglslCustomSrcFragmentShader; // Calls "customShader", which must be appended
- code[SolidBrushSrcFragmentShader] = qopenglslSolidBrushSrcFragmentShader;
- code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader;
- code[TextureBrushSrcWithPatternFragmentShader] = qopenglslTextureBrushSrcWithPatternFragmentShader;
- code[PatternBrushSrcFragmentShader] = qopenglslPatternBrushSrcFragmentShader;
- code[LinearGradientBrushSrcFragmentShader] = qopenglslLinearGradientBrushSrcFragmentShader;
- code[RadialGradientBrushSrcFragmentShader] = qopenglslRadialGradientBrushSrcFragmentShader;
- code[ConicalGradientBrushSrcFragmentShader] = qopenglslConicalGradientBrushSrcFragmentShader;
- code[ShockingPinkSrcFragmentShader] = qopenglslShockingPinkSrcFragmentShader;
-
- code[NoMaskFragmentShader] = "";
- code[MaskFragmentShader] = qopenglslMaskFragmentShader;
- code[RgbMaskFragmentShaderPass1] = qopenglslRgbMaskFragmentShaderPass1;
- code[RgbMaskFragmentShaderPass2] = qopenglslRgbMaskFragmentShaderPass2;
- code[RgbMaskWithGammaFragmentShader] = ""; //###
- }
-
- // The composition shaders are just layout qualifiers and the same
- // for all profiles that support them.
- code[NoCompositionModeFragmentShader] = "";
- code[MultiplyCompositionModeFragmentShader] = qopenglslMultiplyCompositionModeFragmentShader;
- code[ScreenCompositionModeFragmentShader] = qopenglslScreenCompositionModeFragmentShader;
- code[OverlayCompositionModeFragmentShader] = qopenglslOverlayCompositionModeFragmentShader;
- code[DarkenCompositionModeFragmentShader] = qopenglslDarkenCompositionModeFragmentShader;
- code[LightenCompositionModeFragmentShader] = qopenglslLightenCompositionModeFragmentShader;
- code[ColorDodgeCompositionModeFragmentShader] = qopenglslColorDodgeCompositionModeFragmentShader;
- code[ColorBurnCompositionModeFragmentShader] = qopenglslColorBurnCompositionModeFragmentShader;
- code[HardLightCompositionModeFragmentShader] = qopenglslHardLightCompositionModeFragmentShader;
- code[SoftLightCompositionModeFragmentShader] = qopenglslSoftLightCompositionModeFragmentShader;
- code[DifferenceCompositionModeFragmentShader] = qopenglslDifferenceCompositionModeFragmentShader;
- code[ExclusionCompositionModeFragmentShader] = qopenglslExclusionCompositionModeFragmentShader;
-
-#if defined(QT_DEBUG)
- // Check that all the elements have been filled:
- for (int i = 0; i < TotalSnippetCount; ++i) {
- if (Q_UNLIKELY(!qShaderSnippets[i])) {
- qFatal("Shader snippet for %s (#%d) is missing!",
- snippetNameStr(SnippetName(i)).constData(), i);
- }
- }
-#endif
-
- QByteArray vertexSource;
- QByteArray fragSource;
-
- // Compile up the simple shader:
-#ifdef Q_OS_WASM
- vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);
- vertexSource.append(qShaderSnippets[MainVertexShader]);
-#else
- vertexSource.append(qShaderSnippets[MainVertexShader]);
- vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);
-#endif
- fragSource.append(qShaderSnippets[MainFragmentShader]);
- fragSource.append(qShaderSnippets[ShockingPinkSrcFragmentShader]);
-
- simpleShaderProg = new QOpenGLShaderProgram;
-
- CachedShader simpleShaderCache(fragSource, vertexSource);
-
- bool inCache = simpleShaderCache.load(simpleShaderProg, context);
-
- if (!inCache) {
- if (!simpleShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource))
- qWarning("Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile");
- if (!simpleShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource))
- qWarning("Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile");
-
- simpleShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
- }
-
- simpleShaderProg->link();
-
- if (Q_UNLIKELY(!simpleShaderProg->isLinked())) {
- qCritical("Errors linking simple shader: %s", qPrintable(simpleShaderProg->log()));
- } else {
- if (!inCache)
- simpleShaderCache.store(simpleShaderProg, context);
- }
-
- // Compile the blit shader:
- vertexSource.clear();
- vertexSource.append(qShaderSnippets[MainWithTexCoordsVertexShader]);
- vertexSource.append(qShaderSnippets[UntransformedPositionVertexShader]);
-
- fragSource.clear();
- fragSource.append(qShaderSnippets[MainFragmentShader]);
- fragSource.append(qShaderSnippets[ImageSrcFragmentShader]);
-
- blitShaderProg = new QOpenGLShaderProgram;
-
- CachedShader blitShaderCache(fragSource, vertexSource);
-
- inCache = blitShaderCache.load(blitShaderProg, context);
-
- if (!inCache) {
- if (!blitShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource))
- qWarning("Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile");
- if (!blitShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource))
- qWarning("Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile");
-
- blitShaderProg->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
- blitShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- }
-
- blitShaderProg->link();
- if (Q_UNLIKELY(!blitShaderProg->isLinked())) {
- qCritical("Errors linking blit shader: %s", qPrintable(blitShaderProg->log()));
- } else {
- if (!inCache)
- blitShaderCache.store(blitShaderProg, context);
- }
-
-#ifdef QT_GL_SHARED_SHADER_DEBUG
- qDebug(" -> QOpenGLEngineSharedShaders() %p for thread %p.", this, QThread::currentThread());
-#endif
-}
-
-QOpenGLEngineSharedShaders::~QOpenGLEngineSharedShaders()
-{
-#ifdef QT_GL_SHARED_SHADER_DEBUG
- qDebug(" -> ~QOpenGLEngineSharedShaders() %p for thread %p.", this, QThread::currentThread());
-#endif
- qDeleteAll(cachedPrograms);
- cachedPrograms.clear();
-
- if (blitShaderProg) {
- delete blitShaderProg;
- blitShaderProg = nullptr;
- }
-
- if (simpleShaderProg) {
- delete simpleShaderProg;
- simpleShaderProg = nullptr;
- }
-}
-
-#if defined (QT_DEBUG)
-QByteArray QOpenGLEngineSharedShaders::snippetNameStr(SnippetName name)
-{
- QMetaEnum m = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("SnippetName"));
- return QByteArray(m.valueToKey(name));
-}
-#endif
-
-// The address returned here will only be valid until next time this function is called.
-// The program is return bound.
-QOpenGLEngineShaderProg *QOpenGLEngineSharedShaders::findProgramInCache(const QOpenGLEngineShaderProg &prog)
-{
- for (int i = 0; i < cachedPrograms.size(); ++i) {
- QOpenGLEngineShaderProg *cachedProg = cachedPrograms[i];
- if (*cachedProg == prog) {
- // Move the program to the top of the list as a poor-man's cache algo
- cachedPrograms.move(i, 0);
- cachedProg->program->bind();
- return cachedProg;
- }
- }
-
- QScopedPointer<QOpenGLEngineShaderProg> newProg;
-
- do {
- QByteArray fragSource;
- // Insert the custom stage before the srcPixel shader to work around an ATI driver bug
- // where you cannot forward declare a function that takes a sampler as argument.
- if (prog.srcPixelFragShader == CustomImageSrcFragmentShader)
- fragSource.append(prog.customStageSource);
- fragSource.append(qShaderSnippets[prog.mainFragShader]);
- fragSource.append(qShaderSnippets[prog.srcPixelFragShader]);
- if (prog.compositionFragShader)
- fragSource.append(qShaderSnippets[prog.compositionFragShader]);
- if (prog.maskFragShader)
- fragSource.append(qShaderSnippets[prog.maskFragShader]);
-
- QByteArray vertexSource;
-#ifdef Q_OS_WASM
- vertexSource.append(qShaderSnippets[prog.positionVertexShader]);
- vertexSource.append(qShaderSnippets[prog.mainVertexShader]);
-#else
- vertexSource.append(qShaderSnippets[prog.mainVertexShader]);
- vertexSource.append(qShaderSnippets[prog.positionVertexShader]);
-#endif
- QScopedPointer<QOpenGLShaderProgram> shaderProgram(new QOpenGLShaderProgram);
-
- CachedShader shaderCache(fragSource, vertexSource);
- bool inCache = shaderCache.load(shaderProgram.data(), QOpenGLContext::currentContext());
-
- if (!inCache) {
- if (!shaderProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource)) {
- QByteArray description;
-#if defined(QT_DEBUG)
- description.append("Vertex shader: main=");
- description.append(snippetNameStr(prog.mainVertexShader));
- description.append(", position=");
- description.append(snippetNameStr(prog.positionVertexShader));
-#endif
- qWarning("Warning: \"%s\" failed to compile!", description.constData());
- break;
- }
- if (!shaderProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource)) {
- QByteArray description;
-#if defined(QT_DEBUG)
- description.append("Fragment shader: main=");
- description.append(snippetNameStr(prog.mainFragShader));
- description.append(", srcPixel=");
- description.append(snippetNameStr(prog.srcPixelFragShader));
- if (prog.compositionFragShader) {
- description.append(", composition=");
- description.append(snippetNameStr(prog.compositionFragShader));
- }
- if (prog.maskFragShader) {
- description.append(", mask=");
- description.append(snippetNameStr(prog.maskFragShader));
- }
-#endif
- qWarning("Warning: \"%s\" failed to compile!", description.constData());
- break;
- }
-
- // We have to bind the vertex attribute names before the program is linked:
- shaderProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- if (prog.useTextureCoords)
- shaderProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
- if (prog.useOpacityAttribute)
- shaderProgram->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR);
- if (prog.usePmvMatrixAttribute) {
- shaderProgram->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
- shaderProgram->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
- shaderProgram->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
- }
- }
-
- newProg.reset(new QOpenGLEngineShaderProg(prog));
- newProg->program = shaderProgram.take();
-
- newProg->program->link();
- if (newProg->program->isLinked()) {
- if (!inCache)
- shaderCache.store(newProg->program, QOpenGLContext::currentContext());
- } else {
- QString error;
- error = QLatin1String("Shader program failed to link")
- + QLatin1String(" Error Log:\n")
- + QLatin1String(" ") + newProg->program->log();
- qWarning() << error;
- break;
- }
-
- newProg->program->bind();
-
- if (newProg->maskFragShader != QOpenGLEngineSharedShaders::NoMaskFragmentShader) {
- GLuint location = newProg->program->uniformLocation("maskTexture");
- newProg->program->setUniformValue(location, QT_MASK_TEXTURE_UNIT);
- }
-
- if (cachedPrograms.count() > 30) {
- // The cache is full, so delete the last 5 programs in the list.
- // These programs will be least used, as a program us bumped to
- // the top of the list when it's used.
- for (int i = 0; i < 5; ++i) {
- delete cachedPrograms.last();
- cachedPrograms.removeLast();
- }
- }
-
- cachedPrograms.insert(0, newProg.data());
- } while (false);
-
- return newProg.take();
-}
-
-void QOpenGLEngineSharedShaders::cleanupCustomStage(QOpenGLCustomShaderStage* stage)
-{
- auto hasStageAsCustomShaderSouce = [stage](QOpenGLEngineShaderProg *cachedProg) -> bool {
- if (cachedProg->customStageSource == stage->source()) {
- delete cachedProg;
- return true;
- }
- return false;
- };
- cachedPrograms.erase(std::remove_if(cachedPrograms.begin(), cachedPrograms.end(),
- hasStageAsCustomShaderSouce),
- cachedPrograms.end());
-}
-
-
-QOpenGLEngineShaderManager::QOpenGLEngineShaderManager(QOpenGLContext* context)
- : ctx(context),
- shaderProgNeedsChanging(true),
- complexGeometry(false),
- srcPixelType(Qt::NoBrush),
- opacityMode(NoOpacity),
- maskType(NoMask),
- compositionMode(QPainter::CompositionMode_SourceOver),
- customSrcStage(nullptr),
- currentShaderProg(nullptr)
-{
- sharedShaders = QOpenGLEngineSharedShaders::shadersForContext(context);
-}
-
-QOpenGLEngineShaderManager::~QOpenGLEngineShaderManager()
-{
- //###
- removeCustomStage();
-}
-
-GLuint QOpenGLEngineShaderManager::getUniformLocation(Uniform id)
-{
- if (!currentShaderProg)
- return 0;
-
- QVector<uint> &uniformLocations = currentShaderProg->uniformLocations;
- if (uniformLocations.isEmpty())
- uniformLocations.fill(GLuint(-1), NumUniforms);
-
- const char uniformNames[][26] = {
- "imageTexture",
- "patternColor",
- "globalOpacity",
- "depth",
- "maskTexture",
- "fragmentColor",
- "linearData",
- "angle",
- "halfViewportSize",
- "fmp",
- "fmp2_m_radius2",
- "inverse_2_fmp2_m_radius2",
- "sqrfr",
- "bradius",
- "invertedTextureSize",
- "brushTransform",
- "brushTexture",
- "matrix"
- };
-
- if (uniformLocations.at(id) == GLuint(-1))
- uniformLocations[id] = currentShaderProg->program->uniformLocation(uniformNames[id]);
-
- return uniformLocations.at(id);
-}
-
-
-void QOpenGLEngineShaderManager::optimiseForBrushTransform(QTransform::TransformationType transformType)
-{
- Q_UNUSED(transformType); // Currently ignored
-}
-
-void QOpenGLEngineShaderManager::setDirty()
-{
- shaderProgNeedsChanging = true;
-}
-
-void QOpenGLEngineShaderManager::setSrcPixelType(Qt::BrushStyle style)
-{
- Q_ASSERT(style != Qt::NoBrush);
- if (srcPixelType == PixelSrcType(style))
- return;
-
- srcPixelType = style;
- shaderProgNeedsChanging = true; //###
-}
-
-void QOpenGLEngineShaderManager::setSrcPixelType(PixelSrcType type)
-{
- if (srcPixelType == type)
- return;
-
- srcPixelType = type;
- shaderProgNeedsChanging = true; //###
-}
-
-void QOpenGLEngineShaderManager::setOpacityMode(OpacityMode mode)
-{
- if (opacityMode == mode)
- return;
-
- opacityMode = mode;
- shaderProgNeedsChanging = true; //###
-}
-
-void QOpenGLEngineShaderManager::setMaskType(MaskType type)
-{
- if (maskType == type)
- return;
-
- maskType = type;
- shaderProgNeedsChanging = true; //###
-}
-
-void QOpenGLEngineShaderManager::setCompositionMode(QPainter::CompositionMode mode)
-{
- if (compositionMode == mode)
- return;
-
- bool wasAdvanced = compositionMode > QPainter::CompositionMode_Plus;
- bool isAdvanced = mode > QPainter::CompositionMode_Plus;
-
- compositionMode = mode;
- shaderProgNeedsChanging = shaderProgNeedsChanging || wasAdvanced || isAdvanced;
-}
-
-void QOpenGLEngineShaderManager::setCustomStage(QOpenGLCustomShaderStage* stage)
-{
- if (customSrcStage)
- removeCustomStage();
- customSrcStage = stage;
- shaderProgNeedsChanging = true;
-}
-
-void QOpenGLEngineShaderManager::removeCustomStage()
-{
- if (customSrcStage)
- customSrcStage->setInactive();
- customSrcStage = nullptr;
- shaderProgNeedsChanging = true;
-}
-
-QOpenGLShaderProgram* QOpenGLEngineShaderManager::currentProgram()
-{
- if (currentShaderProg)
- return currentShaderProg->program;
- else
- return sharedShaders->simpleProgram();
-}
-
-void QOpenGLEngineShaderManager::useSimpleProgram()
-{
- sharedShaders->simpleProgram()->bind();
- QOpenGLContextPrivate* ctx_d = ctx->d_func();
- Q_UNUSED(ctx_d);
-
- QOpenGL2PaintEngineEx *active_engine = static_cast<QOpenGL2PaintEngineEx *>(ctx_d->active_engine);
-
- active_engine->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
- active_engine->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, false);
- active_engine->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false);
-
- shaderProgNeedsChanging = true;
-}
-
-void QOpenGLEngineShaderManager::useBlitProgram()
-{
- sharedShaders->blitProgram()->bind();
- QOpenGLContextPrivate* ctx_d = ctx->d_func();
- QOpenGL2PaintEngineEx *active_engine = static_cast<QOpenGL2PaintEngineEx *>(ctx_d->active_engine);
- active_engine->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
- active_engine->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, true);
- active_engine->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false);
- shaderProgNeedsChanging = true;
-}
-
-QOpenGLShaderProgram* QOpenGLEngineShaderManager::simpleProgram()
-{
- return sharedShaders->simpleProgram();
-}
-
-QOpenGLShaderProgram* QOpenGLEngineShaderManager::blitProgram()
-{
- return sharedShaders->blitProgram();
-}
-
-
-
-// Select & use the correct shader program using the current state.
-// Returns \c true if program needed changing.
-bool QOpenGLEngineShaderManager::useCorrectShaderProg()
-{
- if (!shaderProgNeedsChanging)
- return false;
-
- bool useCustomSrc = customSrcStage != nullptr;
- if (useCustomSrc && srcPixelType != QOpenGLEngineShaderManager::ImageSrc && srcPixelType != Qt::TexturePattern) {
- useCustomSrc = false;
- qWarning("QOpenGLEngineShaderManager - Ignoring custom shader stage for non image src");
- }
-
- QOpenGLEngineShaderProg requiredProgram;
-
- bool texCoords = false;
-
- // Choose vertex shader shader position function (which typically also sets
- // varyings) and the source pixel (srcPixel) fragment shader function:
- requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::InvalidSnippetName;
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::InvalidSnippetName;
- bool isAffine = brushTransform.isAffine();
- if ( (srcPixelType >= Qt::Dense1Pattern) && (srcPixelType <= Qt::DiagCrossPattern) ) {
- if (isAffine)
- requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::AffinePositionWithPatternBrushVertexShader;
- else
- requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionWithPatternBrushVertexShader;
-
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::PatternBrushSrcFragmentShader;
- }
- else switch (srcPixelType) {
- default:
- case Qt::NoBrush:
- qFatal("QOpenGLEngineShaderManager::useCorrectShaderProg() - Qt::NoBrush style is set");
- break;
- case QOpenGLEngineShaderManager::ImageSrc:
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ImageSrcFragmentShader;
- requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
- texCoords = true;
- break;
- case QOpenGLEngineShaderManager::NonPremultipliedImageSrc:
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::NonPremultipliedImageSrcFragmentShader;
- requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
- texCoords = true;
- break;
- case QOpenGLEngineShaderManager::GrayscaleImageSrc:
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::GrayscaleImageSrcFragmentShader;
- requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
- texCoords = true;
- break;
- case QOpenGLEngineShaderManager::AlphaImageSrc:
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::AlphaImageSrcFragmentShader;
- requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
- texCoords = true;
- break;
- case QOpenGLEngineShaderManager::PatternSrc:
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ImageSrcWithPatternFragmentShader;
- requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
- texCoords = true;
- break;
- case QOpenGLEngineShaderManager::TextureSrcWithPattern:
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::TextureBrushSrcWithPatternFragmentShader;
- requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
- : QOpenGLEngineSharedShaders::PositionWithTextureBrushVertexShader;
- break;
- case Qt::SolidPattern:
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::SolidBrushSrcFragmentShader;
- requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
- break;
- case Qt::LinearGradientPattern:
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::LinearGradientBrushSrcFragmentShader;
- requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithLinearGradientBrushVertexShader
- : QOpenGLEngineSharedShaders::PositionWithLinearGradientBrushVertexShader;
- break;
- case Qt::ConicalGradientPattern:
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ConicalGradientBrushSrcFragmentShader;
- requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithConicalGradientBrushVertexShader
- : QOpenGLEngineSharedShaders::PositionWithConicalGradientBrushVertexShader;
- break;
- case Qt::RadialGradientPattern:
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::RadialGradientBrushSrcFragmentShader;
- requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithRadialGradientBrushVertexShader
- : QOpenGLEngineSharedShaders::PositionWithRadialGradientBrushVertexShader;
- break;
- case Qt::TexturePattern:
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::TextureBrushSrcFragmentShader;
- requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
- : QOpenGLEngineSharedShaders::PositionWithTextureBrushVertexShader;
- break;
- };
-
- if (useCustomSrc) {
- requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::CustomImageSrcFragmentShader;
- requiredProgram.customStageSource = customSrcStage->source();
- }
-
- const bool hasCompose = compositionMode > QPainter::CompositionMode_Plus;
- const bool hasMask = maskType != QOpenGLEngineShaderManager::NoMask;
-
- // Choose fragment shader main function:
- if (opacityMode == AttributeOpacity) {
- Q_ASSERT(!hasCompose && !hasMask);
- requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_ImageArrays;
- } else {
- bool useGlobalOpacity = (opacityMode == UniformOpacity);
- if (hasMask && useGlobalOpacity)
- requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_MO;
- if (hasMask && !useGlobalOpacity)
- requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_M;
- if (!hasMask && useGlobalOpacity)
- requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_O;
- if (!hasMask && !useGlobalOpacity)
- requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader;
- }
-
- if (hasMask) {
- if (maskType == PixelMask) {
- requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::MaskFragmentShader;
- texCoords = true;
- } else if (maskType == SubPixelMaskPass1) {
- requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskFragmentShaderPass1;
- texCoords = true;
- } else if (maskType == SubPixelMaskPass2) {
- requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskFragmentShaderPass2;
- texCoords = true;
- } else if (maskType == SubPixelWithGammaMask) {
- requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskWithGammaFragmentShader;
- texCoords = true;
- } else {
- qCritical("QOpenGLEngineShaderManager::useCorrectShaderProg() - Unknown mask type");
- }
- } else {
- requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::NoMaskFragmentShader;
- }
-
- if (hasCompose) {
- switch (compositionMode) {
- case QPainter::CompositionMode_Multiply:
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::MultiplyCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Screen:
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ScreenCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Overlay:
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::OverlayCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Darken:
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::DarkenCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Lighten:
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::LightenCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_ColorDodge:
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ColorDodgeCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_ColorBurn:
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ColorBurnCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_HardLight:
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::HardLightCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_SoftLight:
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::SoftLightCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Difference:
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::DifferenceCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Exclusion:
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ExclusionCompositionModeFragmentShader;
- break;
- default:
- qWarning("QOpenGLEngineShaderManager::useCorrectShaderProg() - Unsupported composition mode");
- }
- } else {
- requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::NoCompositionModeFragmentShader;
- }
-
- // Choose vertex shader main function
- if (opacityMode == AttributeOpacity) {
- Q_ASSERT(texCoords);
- requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainWithTexCoordsAndOpacityVertexShader;
- } else if (texCoords) {
- requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainWithTexCoordsVertexShader;
- } else {
- requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainVertexShader;
- }
- requiredProgram.useTextureCoords = texCoords;
- requiredProgram.useOpacityAttribute = (opacityMode == AttributeOpacity);
- if (complexGeometry && srcPixelType == Qt::SolidPattern) {
- requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::ComplexGeometryPositionOnlyVertexShader;
- requiredProgram.usePmvMatrixAttribute = false;
- } else {
- requiredProgram.usePmvMatrixAttribute = true;
-
- // Force complexGeometry off, since we currently don't support that mode for
- // non-solid brushes
- complexGeometry = false;
- }
-
- // At this point, requiredProgram is fully populated so try to find the program in the cache
- currentShaderProg = sharedShaders->findProgramInCache(requiredProgram);
-
- if (currentShaderProg && useCustomSrc) {
- customSrcStage->setUniforms(currentShaderProg->program);
- }
-
- // Make sure all the vertex attribute arrays the program uses are enabled (and the ones it
- // doesn't use are disabled)
- QOpenGLContextPrivate* ctx_d = ctx->d_func();
- QOpenGL2PaintEngineEx *active_engine = static_cast<QOpenGL2PaintEngineEx *>(ctx_d->active_engine);
- active_engine->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
- active_engine->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, currentShaderProg && currentShaderProg->useTextureCoords);
- active_engine->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, currentShaderProg && currentShaderProg->useOpacityAttribute);
-
- shaderProgNeedsChanging = false;
- return true;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglengineshadermanager_p.h b/src/gui/opengl/qopenglengineshadermanager_p.h
deleted file mode 100644
index 14c79f5de3..0000000000
--- a/src/gui/opengl/qopenglengineshadermanager_p.h
+++ /dev/null
@@ -1,507 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-/*
- VERTEX SHADERS
- ==============
-
- Vertex shaders are specified as multiple (partial) shaders. On desktop,
- this works fine. On ES, QOpenGLShader & QOpenGLShaderProgram will make partial
- shaders work by concatenating the source in each QOpenGLShader and compiling
- it as a single shader. This is abstracted nicely by QOpenGLShaderProgram and
- the GL2 engine doesn't need to worry about it.
-
- Generally, there's two vertex shader objects. The position shaders are
- the ones which set gl_Position. There's also two "main" vertex shaders,
- one which just calls the position shader and another which also passes
- through some texture coordinates from a vertex attribute array to a
- varying. These texture coordinates are used for mask position in text
- rendering and for the source coordinates in drawImage/drawPixmap. There's
- also a "Simple" vertex shader for rendering a solid colour (used to render
- into the stencil buffer where the actual colour value is discarded).
-
- The position shaders for brushes look scary. This is because many of the
- calculations which logically belong in the fragment shader have been moved
- into the vertex shader to improve performance. This is why the position
- calculation is in a separate shader. Not only does it calculate the
- position, but it also calculates some data to be passed to the fragment
- shader as a varying. It is optimal to move as much of the calculation as
- possible into the vertex shader as this is executed less often.
-
- The varyings passed to the fragment shaders are interpolated (which is
- cheap). Unfortunately, GL will apply perspective correction to the
- interpolation calusing errors. To get around this, the vertex shader must
- apply perspective correction itself and set the w-value of gl_Position to
- zero. That way, GL will be tricked into thinking it doesn't need to apply a
- perspective correction and use linear interpolation instead (which is what
- we want). Of course, if the brush transform is affeine, no perspective
- correction is needed and a simpler vertex shader can be used instead.
-
- So there are the following "main" vertex shaders:
- qopenglslMainVertexShader
- qopenglslMainWithTexCoordsVertexShader
-
- And the following position vertex shaders:
- qopenglslPositionOnlyVertexShader
- qopenglslPositionWithTextureBrushVertexShader
- qopenglslPositionWithPatternBrushVertexShader
- qopenglslPositionWithLinearGradientBrushVertexShader
- qopenglslPositionWithRadialGradientBrushVertexShader
- qopenglslPositionWithConicalGradientBrushVertexShader
- qopenglslAffinePositionWithTextureBrushVertexShader
- qopenglslAffinePositionWithPatternBrushVertexShader
- qopenglslAffinePositionWithLinearGradientBrushVertexShader
- qopenglslAffinePositionWithRadialGradientBrushVertexShader
- qopenglslAffinePositionWithConicalGradientBrushVertexShader
-
- Leading to 23 possible vertex shaders
-
-
- FRAGMENT SHADERS
- ================
-
- Fragment shaders are also specified as multiple (partial) shaders. The
- different fragment shaders represent the different stages in Qt's fragment
- pipeline. There are 1-3 stages in this pipeline: First stage is to get the
- fragment's colour value. The next stage is to get the fragment's mask value
- (coverage value for anti-aliasing) and the final stage is to blend the
- incoming fragment with the background (for composition modes not supported
- by GL).
-
- Of these, the first stage will always be present. If Qt doesn't need to
- apply anti-aliasing (because it's off or handled by multisampling) then
- the coverage value doesn't need to be applied. (Note: There are two types
- of mask, one for regular anti-aliasing and one for sub-pixel anti-
- aliasing.) If the composition mode is one which GL supports natively then
- the blending stage doesn't need to be applied.
-
- As eash stage can have multiple implementations, they are abstracted as
- GLSL function calls with the following signatures:
-
- Brushes & image drawing are implementations of "qcolorp vec4 srcPixel()":
- qopenglslImageSrcFragShader
- qopenglslImageSrcWithPatternFragShader
- qopenglslNonPremultipliedImageSrcFragShader
- qopenglslSolidBrushSrcFragShader
- qopenglslTextureBrushSrcFragShader
- qopenglslTextureBrushWithPatternFragShader
- qopenglslPatternBrushSrcFragShader
- qopenglslLinearGradientBrushSrcFragShader
- qopenglslRadialGradientBrushSrcFragShader
- qopenglslConicalGradientBrushSrcFragShader
- NOTE: It is assumed the colour returned by srcPixel() is pre-multiplied
-
- Masks are implementations of "qcolorp vec4 applyMask(qcolorp vec4 src)":
- qopenglslMaskFragmentShader
- qopenglslRgbMaskFragmentShaderPass1
- qopenglslRgbMaskFragmentShaderPass2
- qopenglslRgbMaskWithGammaFragmentShader
-
- Composition modes are "qcolorp vec4 compose(qcolorp vec4 src)":
- qopenglslColorBurnCompositionModeFragmentShader
- qopenglslColorDodgeCompositionModeFragmentShader
- qopenglslDarkenCompositionModeFragmentShader
- qopenglslDifferenceCompositionModeFragmentShader
- qopenglslExclusionCompositionModeFragmentShader
- qopenglslHardLightCompositionModeFragmentShader
- qopenglslLightenCompositionModeFragmentShader
- qopenglslMultiplyCompositionModeFragmentShader
- qopenglslOverlayCompositionModeFragmentShader
- qopenglslScreenCompositionModeFragmentShader
- qopenglslSoftLightCompositionModeFragmentShader
-
-
- Note: In the future, some GLSL compilers will support an extension allowing
- a new 'color' precision specifier. To support this, qcolorp is used for
- all color components so it can be defined to colorp or lowp depending upon
- the implementation.
-
- So there are differnt frament shader main functions, depending on the
- number & type of pipelines the fragment needs to go through.
-
- The choice of which main() fragment shader string to use depends on:
- - Use of global opacity
- - Brush style (some brushes apply opacity themselves)
- - Use & type of mask (TODO: Need to support high quality anti-aliasing & text)
- - Use of non-GL Composition mode
-
- Leading to the following fragment shader main functions:
- gl_FragColor = compose(applyMask(srcPixel()*globalOpacity));
- gl_FragColor = compose(applyMask(srcPixel()));
- gl_FragColor = applyMask(srcPixel()*globalOpacity);
- gl_FragColor = applyMask(srcPixel());
- gl_FragColor = compose(srcPixel()*globalOpacity);
- gl_FragColor = compose(srcPixel());
- gl_FragColor = srcPixel()*globalOpacity;
- gl_FragColor = srcPixel();
-
- Called:
- qopenglslMainFragmentShader_CMO
- qopenglslMainFragmentShader_CM
- qopenglslMainFragmentShader_MO
- qopenglslMainFragmentShader_M
- qopenglslMainFragmentShader_CO
- qopenglslMainFragmentShader_C
- qopenglslMainFragmentShader_O
- qopenglslMainFragmentShader
-
- Where:
- M = Mask
- C = Composition
- O = Global Opacity
-
-
- CUSTOM SHADER CODE
- ==================
-
- The use of custom shader code is supported by the engine for drawImage and
- drawPixmap calls. This is implemented via hooks in the fragment pipeline.
-
- The custom shader is passed to the engine as a partial fragment shader
- (QOpenGLCustomShaderStage). The shader will implement a pre-defined method name
- which Qt's fragment pipeline will call:
-
- lowp vec4 customShader(lowp sampler2d imageTexture, highp vec2 textureCoords)
-
- The provided src and srcCoords parameters can be used to sample from the
- source image.
-
- Transformations, clipping, opacity, and composition modes set using QPainter
- will be respected when using the custom shader hook.
-*/
-
-#ifndef QOPENGLENGINE_SHADER_MANAGER_H
-#define QOPENGLENGINE_SHADER_MANAGER_H
-
-#include <QtGui/private/qtguiglobal_p.h>
-#include <QOpenGLShader>
-#include <QOpenGLShaderProgram>
-#include <QPainter>
-#include <private/qopenglcontext_p.h>
-#include <private/qopenglcustomshaderstage_p.h>
-
-QT_BEGIN_NAMESPACE
-
-
-
-/*
-struct QOpenGLEngineCachedShaderProg
-{
- QOpenGLEngineCachedShaderProg(QOpenGLEngineShaderManager::ShaderName vertexMain,
- QOpenGLEngineShaderManager::ShaderName vertexPosition,
- QOpenGLEngineShaderManager::ShaderName fragMain,
- QOpenGLEngineShaderManager::ShaderName pixelSrc,
- QOpenGLEngineShaderManager::ShaderName mask,
- QOpenGLEngineShaderManager::ShaderName composition);
-
- int cacheKey;
- QOpenGLShaderProgram* program;
-}
-*/
-
-static const GLuint QT_VERTEX_COORDS_ATTR = 0;
-static const GLuint QT_TEXTURE_COORDS_ATTR = 1;
-static const GLuint QT_OPACITY_ATTR = 2;
-static const GLuint QT_PMV_MATRIX_1_ATTR = 3;
-static const GLuint QT_PMV_MATRIX_2_ATTR = 4;
-static const GLuint QT_PMV_MATRIX_3_ATTR = 5;
-
-class QOpenGLEngineShaderProg;
-
-class Q_GUI_EXPORT QOpenGLEngineSharedShaders
-{
- Q_GADGET
-public:
-
- enum SnippetName {
- MainVertexShader,
- MainWithTexCoordsVertexShader,
- MainWithTexCoordsAndOpacityVertexShader,
-
- // UntransformedPositionVertexShader must be first in the list:
- UntransformedPositionVertexShader,
- PositionOnlyVertexShader,
- ComplexGeometryPositionOnlyVertexShader,
- PositionWithPatternBrushVertexShader,
- PositionWithLinearGradientBrushVertexShader,
- PositionWithConicalGradientBrushVertexShader,
- PositionWithRadialGradientBrushVertexShader,
- PositionWithTextureBrushVertexShader,
- AffinePositionWithPatternBrushVertexShader,
- AffinePositionWithLinearGradientBrushVertexShader,
- AffinePositionWithConicalGradientBrushVertexShader,
- AffinePositionWithRadialGradientBrushVertexShader,
- AffinePositionWithTextureBrushVertexShader,
-
- // MainFragmentShader_CMO must be first in the list:
- MainFragmentShader_MO,
- MainFragmentShader_M,
- MainFragmentShader_O,
- MainFragmentShader,
- MainFragmentShader_ImageArrays,
-
- // ImageSrcFragmentShader must be first in the list::
- ImageSrcFragmentShader,
- ImageSrcWithPatternFragmentShader,
- NonPremultipliedImageSrcFragmentShader,
- GrayscaleImageSrcFragmentShader,
- AlphaImageSrcFragmentShader,
- CustomImageSrcFragmentShader,
- SolidBrushSrcFragmentShader,
- TextureBrushSrcFragmentShader,
- TextureBrushSrcWithPatternFragmentShader,
- PatternBrushSrcFragmentShader,
- LinearGradientBrushSrcFragmentShader,
- RadialGradientBrushSrcFragmentShader,
- ConicalGradientBrushSrcFragmentShader,
- ShockingPinkSrcFragmentShader,
-
- // NoMaskFragmentShader must be first in the list:
- NoMaskFragmentShader,
- MaskFragmentShader,
- RgbMaskFragmentShaderPass1,
- RgbMaskFragmentShaderPass2,
- RgbMaskWithGammaFragmentShader,
-
- // NoCompositionModeFragmentShader must be first in the list:
- NoCompositionModeFragmentShader,
- MultiplyCompositionModeFragmentShader,
- ScreenCompositionModeFragmentShader,
- OverlayCompositionModeFragmentShader,
- DarkenCompositionModeFragmentShader,
- LightenCompositionModeFragmentShader,
- ColorDodgeCompositionModeFragmentShader,
- ColorBurnCompositionModeFragmentShader,
- HardLightCompositionModeFragmentShader,
- SoftLightCompositionModeFragmentShader,
- DifferenceCompositionModeFragmentShader,
- ExclusionCompositionModeFragmentShader,
-
- TotalSnippetCount, InvalidSnippetName
- };
-#if defined (QT_DEBUG)
- Q_ENUM(SnippetName)
- static QByteArray snippetNameStr(SnippetName snippetName);
-#endif
-
-/*
- // These allow the ShaderName enum to be used as a cache key
- const int mainVertexOffset = 0;
- const int positionVertexOffset = (1<<2) - PositionOnlyVertexShader;
- const int mainFragOffset = (1<<6) - MainFragmentShader_CMO;
- const int srcPixelOffset = (1<<10) - ImageSrcFragmentShader;
- const int maskOffset = (1<<14) - NoMaskShader;
- const int compositionOffset = (1 << 16) - MultiplyCompositionModeFragmentShader;
-*/
-
- QOpenGLEngineSharedShaders(QOpenGLContext *context);
- ~QOpenGLEngineSharedShaders();
-
- QOpenGLShaderProgram *simpleProgram() { return simpleShaderProg; }
- QOpenGLShaderProgram *blitProgram() { return blitShaderProg; }
- // Compile the program if it's not already in the cache, return the item in the cache.
- QOpenGLEngineShaderProg *findProgramInCache(const QOpenGLEngineShaderProg &prog);
- // Compile the custom shader if it's not already in the cache, return the item in the cache.
-
- static QOpenGLEngineSharedShaders *shadersForContext(QOpenGLContext *context);
-
- // Ideally, this would be static and cleanup all programs in all contexts which
- // contain the custom code. Currently it is just a hint and we rely on deleted
- // custom shaders being cleaned up by being kicked out of the cache when it's
- // full.
- void cleanupCustomStage(QOpenGLCustomShaderStage* stage);
-
-private:
- QOpenGLShaderProgram *blitShaderProg;
- QOpenGLShaderProgram *simpleShaderProg;
- QList<QOpenGLEngineShaderProg*> cachedPrograms;
-
- static const char* qShaderSnippets[TotalSnippetCount];
-};
-
-
-class QOpenGLEngineShaderProg
-{
-public:
- QOpenGLEngineShaderProg() : program(nullptr) {}
-
- ~QOpenGLEngineShaderProg() {
- if (program)
- delete program;
- }
-
- QOpenGLEngineSharedShaders::SnippetName mainVertexShader;
- QOpenGLEngineSharedShaders::SnippetName positionVertexShader;
- QOpenGLEngineSharedShaders::SnippetName mainFragShader;
- QOpenGLEngineSharedShaders::SnippetName srcPixelFragShader;
- QOpenGLEngineSharedShaders::SnippetName maskFragShader;
- QOpenGLEngineSharedShaders::SnippetName compositionFragShader;
-
- QByteArray customStageSource; //TODO: Decent cache key for custom stages
- QOpenGLShaderProgram* program;
-
- QVector<uint> uniformLocations;
-
- bool useTextureCoords;
- bool useOpacityAttribute;
- bool usePmvMatrixAttribute;
-
- bool operator==(const QOpenGLEngineShaderProg& other) const {
- // We don't care about the program
- return ( mainVertexShader == other.mainVertexShader &&
- positionVertexShader == other.positionVertexShader &&
- mainFragShader == other.mainFragShader &&
- srcPixelFragShader == other.srcPixelFragShader &&
- maskFragShader == other.maskFragShader &&
- compositionFragShader == other.compositionFragShader &&
- customStageSource == other.customStageSource
- );
- }
-};
-
-class Q_GUI_EXPORT QOpenGLEngineShaderManager : public QObject
-{
- Q_OBJECT
-public:
- QOpenGLEngineShaderManager(QOpenGLContext* context);
- ~QOpenGLEngineShaderManager();
-
- enum MaskType {NoMask, PixelMask, SubPixelMaskPass1, SubPixelMaskPass2, SubPixelWithGammaMask};
- enum PixelSrcType {
- ImageSrc = Qt::TexturePattern+1,
- NonPremultipliedImageSrc = Qt::TexturePattern+2,
- PatternSrc = Qt::TexturePattern+3,
- TextureSrcWithPattern = Qt::TexturePattern+4,
- GrayscaleImageSrc = Qt::TexturePattern+5,
- AlphaImageSrc = Qt::TexturePattern+6,
- };
-
- enum Uniform {
- ImageTexture,
- PatternColor,
- GlobalOpacity,
- Depth,
- MaskTexture,
- FragmentColor,
- LinearData,
- Angle,
- HalfViewportSize,
- Fmp,
- Fmp2MRadius2,
- Inverse2Fmp2MRadius2,
- SqrFr,
- BRadius,
- InvertedTextureSize,
- BrushTransform,
- BrushTexture,
- Matrix,
- NumUniforms
- };
-
- enum OpacityMode {
- NoOpacity,
- UniformOpacity,
- AttributeOpacity
- };
-
- // There are optimizations we can do, depending on the brush transform:
- // 1) May not have to apply perspective-correction
- // 2) Can use lower precision for matrix
- void optimiseForBrushTransform(QTransform::TransformationType transformType);
- void setSrcPixelType(Qt::BrushStyle);
- void setSrcPixelType(PixelSrcType); // For non-brush sources, like pixmaps & images
- void setOpacityMode(OpacityMode);
- void setMaskType(MaskType);
- void setCompositionMode(QPainter::CompositionMode);
- void setCustomStage(QOpenGLCustomShaderStage* stage);
- void removeCustomStage();
-
- GLuint getUniformLocation(Uniform id);
-
- void setDirty(); // someone has manually changed the current shader program
- bool useCorrectShaderProg(); // returns true if the shader program needed to be changed
-
- void useSimpleProgram();
- void useBlitProgram();
- void setHasComplexGeometry(bool hasComplexGeometry)
- {
- complexGeometry = hasComplexGeometry;
- shaderProgNeedsChanging = true;
- }
- bool hasComplexGeometry() const
- {
- return complexGeometry;
- }
-
- QOpenGLShaderProgram* currentProgram(); // Returns pointer to the shader the manager has chosen
- QOpenGLShaderProgram* simpleProgram(); // Used to draw into e.g. stencil buffers
- QOpenGLShaderProgram* blitProgram(); // Used to blit a texture into the framebuffer
-
- QOpenGLEngineSharedShaders* sharedShaders;
-
-private:
- QOpenGLContext* ctx;
- bool shaderProgNeedsChanging;
- bool complexGeometry;
-
- // Current state variables which influence the choice of shader:
- QTransform brushTransform;
- int srcPixelType;
- OpacityMode opacityMode;
- MaskType maskType;
- QPainter::CompositionMode compositionMode;
- QOpenGLCustomShaderStage* customSrcStage;
-
- QOpenGLEngineShaderProg* currentShaderProg;
-};
-
-QT_END_NAMESPACE
-
-#endif //QOPENGLENGINE_SHADER_MANAGER_H
diff --git a/src/gui/opengl/qopenglengineshadersource_p.h b/src/gui/opengl/qopenglengineshadersource_p.h
deleted file mode 100644
index 3ac599b6c2..0000000000
--- a/src/gui/opengl/qopenglengineshadersource_p.h
+++ /dev/null
@@ -1,970 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-
-#ifndef QOPENGL_ENGINE_SHADER_SOURCE_H
-#define QOPENGL_ENGINE_SHADER_SOURCE_H
-
-#include <QtGui/private/qtguiglobal_p.h>
-#include "qopenglengineshadermanager_p.h"
-
-QT_BEGIN_NAMESPACE
-
-
-static const char* const qopenglslMainVertexShader = "\n\
- void setPosition(); \n\
- void main(void) \n\
- { \n\
- setPosition(); \n\
- }\n";
-
-static const char* const qopenglslMainWithTexCoordsVertexShader = "\n\
- attribute highp vec2 textureCoordArray; \n\
- varying highp vec2 textureCoords; \n\
- void setPosition(); \n\
- void main(void) \n\
- { \n\
- setPosition(); \n\
- textureCoords = textureCoordArray; \n\
- }\n";
-
-static const char* const qopenglslMainWithTexCoordsAndOpacityVertexShader = "\n\
- attribute highp vec2 textureCoordArray; \n\
- attribute lowp float opacityArray; \n\
- varying highp vec2 textureCoords; \n\
- varying lowp float opacity; \n\
- void setPosition(); \n\
- void main(void) \n\
- { \n\
- setPosition(); \n\
- textureCoords = textureCoordArray; \n\
- opacity = opacityArray; \n\
- }\n";
-
-// NOTE: We let GL do the perspective correction so texture lookups in the fragment
-// shader are also perspective corrected.
-static const char* const qopenglslPositionOnlyVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray; \n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- void setPosition(void) \n\
- { \n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position = vec4(transformedPos.xy, 0.0, transformedPos.z); \n\
- }\n";
-
-static const char* const qopenglslComplexGeometryPositionOnlyVertexShader = "\n\
- uniform highp mat3 matrix; \n\
- attribute highp vec2 vertexCoordsArray; \n\
- void setPosition(void) \n\
- { \n\
- gl_Position = vec4(matrix * vec3(vertexCoordsArray, 1), 1);\n\
- } \n";
-
-static const char* const qopenglslUntransformedPositionVertexShader = "\n\
- attribute highp vec4 vertexCoordsArray; \n\
- void setPosition(void) \n\
- { \n\
- gl_Position = vertexCoordsArray; \n\
- }\n";
-
-// Pattern Brush - This assumes the texture size is 8x8 and thus, the inverted size is 0.125
-static const char* const qopenglslPositionWithPatternBrushVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray; \n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- uniform mediump vec2 halfViewportSize; \n\
- uniform highp vec2 invertedTextureSize; \n\
- uniform highp mat3 brushTransform; \n\
- varying highp vec2 patternTexCoords; \n\
- void setPosition(void) \n\
- { \n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1.0); \n\
- mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- patternTexCoords.xy = (hTexCoords.xy * 0.125) * invertedHTexCoordsZ; \n\
- }\n";
-
-static const char* const qopenglslAffinePositionWithPatternBrushVertexShader
- = qopenglslPositionWithPatternBrushVertexShader;
-
-static const char* const qopenglslPatternBrushSrcFragmentShader = "\n\
- uniform sampler2D brushTexture; \n\
- uniform lowp vec4 patternColor; \n\
- varying highp vec2 patternTexCoords;\n\
- lowp vec4 srcPixel() \n\
- { \n\
- return patternColor * (1.0 - texture2D(brushTexture, patternTexCoords).r); \n\
- }\n";
-
-
-// Linear Gradient Brush
-static const char* const qopenglslPositionWithLinearGradientBrushVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray; \n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- uniform mediump vec2 halfViewportSize; \n\
- uniform highp vec3 linearData; \n\
- uniform highp mat3 brushTransform; \n\
- varying mediump float index; \n\
- void setPosition() \n\
- { \n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- index = (dot(linearData.xy, hTexCoords.xy) * linearData.z) * invertedHTexCoordsZ; \n\
- }\n";
-
-static const char* const qopenglslAffinePositionWithLinearGradientBrushVertexShader
- = qopenglslPositionWithLinearGradientBrushVertexShader;
-
-static const char* const qopenglslLinearGradientBrushSrcFragmentShader = "\n\
- uniform sampler2D brushTexture; \n\
- varying mediump float index; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- mediump vec2 val = vec2(index, 0.5); \n\
- return texture2D(brushTexture, val); \n\
- }\n";
-
-
-// Conical Gradient Brush
-static const char* const qopenglslPositionWithConicalGradientBrushVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray; \n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- uniform mediump vec2 halfViewportSize; \n\
- uniform highp mat3 brushTransform; \n\
- varying highp vec2 A; \n\
- void setPosition(void) \n\
- { \n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- A = hTexCoords.xy * invertedHTexCoordsZ; \n\
- }\n";
-
-static const char* const qopenglslAffinePositionWithConicalGradientBrushVertexShader
- = qopenglslPositionWithConicalGradientBrushVertexShader;
-
-static const char* const qopenglslConicalGradientBrushSrcFragmentShader = "\n\
- #define INVERSE_2PI 0.1591549430918953358 \n\
- uniform sampler2D brushTexture; \n\
- uniform mediump float angle; \n\
- varying highp vec2 A; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- highp float t; \n\
- if (abs(A.y) == abs(A.x)) \n\
- t = (atan(-A.y + 0.002, A.x) + angle) * INVERSE_2PI; \n\
- else \n\
- t = (atan(-A.y, A.x) + angle) * INVERSE_2PI; \n\
- return texture2D(brushTexture, vec2(t - floor(t), 0.5)); \n\
- }\n";
-
-
-// Radial Gradient Brush
-static const char* const qopenglslPositionWithRadialGradientBrushVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray;\n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- uniform mediump vec2 halfViewportSize; \n\
- uniform highp mat3 brushTransform; \n\
- uniform highp vec2 fmp; \n\
- uniform mediump vec3 bradius; \n\
- varying highp float b; \n\
- varying highp vec2 A; \n\
- void setPosition(void) \n\
- {\n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- A = hTexCoords.xy * invertedHTexCoordsZ; \n\
- b = bradius.x + 2.0 * dot(A, fmp); \n\
- }\n";
-
-static const char* const qopenglslAffinePositionWithRadialGradientBrushVertexShader
- = qopenglslPositionWithRadialGradientBrushVertexShader;
-
-static const char* const qopenglslRadialGradientBrushSrcFragmentShader = "\n\
- uniform sampler2D brushTexture; \n\
- uniform highp float fmp2_m_radius2; \n\
- uniform highp float inverse_2_fmp2_m_radius2; \n\
- uniform highp float sqrfr; \n\
- varying highp float b; \n\
- varying highp vec2 A; \n\
- uniform mediump vec3 bradius; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- highp float c = sqrfr-dot(A, A); \n\
- highp float det = b*b - 4.0*fmp2_m_radius2*c; \n\
- lowp vec4 result = vec4(0.0); \n\
- if (det >= 0.0) { \n\
- highp float detSqrt = sqrt(det); \n\
- highp float w = max((-b - detSqrt) * inverse_2_fmp2_m_radius2, (-b + detSqrt) * inverse_2_fmp2_m_radius2); \n\
- if (bradius.y + w * bradius.z >= 0.0) \n\
- result = texture2D(brushTexture, vec2(w, 0.5)); \n\
- } \n\
- return result; \n\
- }\n";
-
-
-// Texture Brush
-static const char* const qopenglslPositionWithTextureBrushVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray; \n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- uniform mediump vec2 halfViewportSize; \n\
- uniform highp vec2 invertedTextureSize; \n\
- uniform highp mat3 brushTransform; \n\
- varying highp vec2 brushTextureCoords; \n\
- void setPosition(void) \n\
- { \n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- brushTextureCoords.xy = (hTexCoords.xy * invertedTextureSize) * gl_Position.w; \n\
- }\n";
-
-static const char* const qopenglslAffinePositionWithTextureBrushVertexShader
- = qopenglslPositionWithTextureBrushVertexShader;
-
-static const char* const qopenglslTextureBrushSrcFragmentShader = "\n\
- varying highp vec2 brushTextureCoords; \n\
- uniform sampler2D brushTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return texture2D(brushTexture, brushTextureCoords); \n\
- }\n";
-
-static const char* const qopenglslTextureBrushSrcWithPatternFragmentShader = "\n\
- varying highp vec2 brushTextureCoords; \n\
- uniform lowp vec4 patternColor; \n\
- uniform sampler2D brushTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return patternColor * (1.0 - texture2D(brushTexture, brushTextureCoords).r); \n\
- }\n";
-
-// Solid Fill Brush
-static const char* const qopenglslSolidBrushSrcFragmentShader = "\n\
- uniform lowp vec4 fragmentColor; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return fragmentColor; \n\
- }\n";
-
-static const char* const qopenglslImageSrcFragmentShader = "\n\
- varying highp vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n"
- "return texture2D(imageTexture, textureCoords); \n"
- "}\n";
-
-static const char* const qopenglslCustomSrcFragmentShader = "\n\
- varying highp vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return customShader(imageTexture, textureCoords); \n\
- }\n";
-
-static const char* const qopenglslImageSrcWithPatternFragmentShader = "\n\
- varying highp vec2 textureCoords; \n\
- uniform lowp vec4 patternColor; \n\
- uniform sampler2D imageTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return patternColor * (1.0 - texture2D(imageTexture, textureCoords).r); \n\
- }\n";
-
-static const char* const qopenglslNonPremultipliedImageSrcFragmentShader = "\n\
- varying highp vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- lowp vec4 sample = texture2D(imageTexture, textureCoords); \n\
- sample.rgb = sample.rgb * sample.a; \n\
- return sample; \n\
- }\n";
-
-static const char* const qopenglslGrayscaleImageSrcFragmentShader = "\n\
- varying highp vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return texture2D(imageTexture, textureCoords).rrra; \n\
- }\n";
-
-static const char* const qopenglslAlphaImageSrcFragmentShader = "\n\
- varying highp vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return vec4(0, 0, 0, texture2D(imageTexture, textureCoords).r); \n\
- }\n";
-
-static const char* const qopenglslShockingPinkSrcFragmentShader = "\n\
- lowp vec4 srcPixel() \n\
- { \n\
- return vec4(0.98, 0.06, 0.75, 1.0); \n\
- }\n";
-
-static const char* const qopenglslMainFragmentShader_ImageArrays = "\n\
- varying lowp float opacity; \n\
- lowp vec4 srcPixel(); \n\
- void main() \n\
- { \n\
- gl_FragColor = srcPixel() * opacity; \n\
- }\n";
-
-static const char* const qopenglslMainFragmentShader_MO = "\n\
- uniform lowp float globalOpacity; \n\
- lowp vec4 srcPixel(); \n\
- lowp vec4 applyMask(lowp vec4); \n\
- void main() \n\
- { \n\
- gl_FragColor = applyMask(srcPixel()*globalOpacity); \n\
- }\n";
-
-static const char* const qopenglslMainFragmentShader_M = "\n\
- lowp vec4 srcPixel(); \n\
- lowp vec4 applyMask(lowp vec4); \n\
- void main() \n\
- { \n\
- gl_FragColor = applyMask(srcPixel()); \n\
- }\n";
-
-static const char* const qopenglslMainFragmentShader_O = "\n\
- uniform lowp float globalOpacity; \n\
- lowp vec4 srcPixel(); \n\
- void main() \n\
- { \n\
- gl_FragColor = srcPixel()*globalOpacity; \n\
- }\n";
-
-static const char* const qopenglslMainFragmentShader = "\n\
- lowp vec4 srcPixel(); \n\
- void main() \n\
- { \n\
- gl_FragColor = srcPixel(); \n\
- }\n";
-
-static const char* const qopenglslMaskFragmentShader = "\n\
- varying highp vec2 textureCoords;\n\
- uniform sampler2D maskTexture;\n\
- lowp vec4 applyMask(lowp vec4 src) \n\
- {\n\
- lowp vec4 mask = texture2D(maskTexture, textureCoords); \n\
- return src * mask.a; \n\
- }\n";
-
-// For source over with subpixel antialiasing, the final color is calculated per component as follows
-// (.a is alpha component, .c is red, green or blue component):
-// alpha = src.a * mask.c * opacity
-// dest.c = dest.c * (1 - alpha) + src.c * alpha
-//
-// In the first pass, calculate: dest.c = dest.c * (1 - alpha) with blend funcs: zero, 1 - source color
-// In the second pass, calculate: dest.c = dest.c + src.c * alpha with blend funcs: one, one
-//
-// If source is a solid color (src is constant), only the first pass is needed, with blend funcs: constant, 1 - source color
-
-// For source composition with subpixel antialiasing, the final color is calculated per component as follows:
-// alpha = src.a * mask.c * opacity
-// dest.c = dest.c * (1 - mask.c) + src.c * alpha
-//
-
-static const char* const qopenglslRgbMaskFragmentShaderPass1 = "\n\
- varying highp vec2 textureCoords;\n\
- uniform sampler2D maskTexture;\n\
- lowp vec4 applyMask(lowp vec4 src) \n\
- { \n\
- lowp vec4 mask = texture2D(maskTexture, textureCoords); \n\
- return src.a * mask; \n\
- }\n";
-
-static const char* const qopenglslRgbMaskFragmentShaderPass2 = "\n\
- varying highp vec2 textureCoords;\n\
- uniform sampler2D maskTexture;\n\
- lowp vec4 applyMask(lowp vec4 src) \n\
- { \n\
- lowp vec4 mask = texture2D(maskTexture, textureCoords); \n\
- return src * mask; \n\
- }\n";
-
-static const char* const qopenglslMultiplyCompositionModeFragmentShader = "\n\
- #ifdef GL_KHR_blend_equation_advanced\n\
- layout(blend_support_multiply) out;\n\
- #endif\n";
-
-static const char* const qopenglslScreenCompositionModeFragmentShader = "\n\
- #ifdef GL_KHR_blend_equation_advanced\n\
- layout(blend_support_screen) out;\n\
- #endif\n";
-
-static const char* const qopenglslOverlayCompositionModeFragmentShader = "\n\
- #ifdef GL_KHR_blend_equation_advanced\n\
- layout(blend_support_overlay) out;\n\
- #endif\n";
-
-static const char* const qopenglslDarkenCompositionModeFragmentShader = "\n\
- #ifdef GL_KHR_blend_equation_advanced\n\
- layout(blend_support_darken) out;\n\
- #endif\n";
-
-static const char* const qopenglslLightenCompositionModeFragmentShader = "\n\
- #ifdef GL_KHR_blend_equation_advanced\n\
- layout(blend_support_lighten) out;\n\
- #endif\n";
-
-static const char* const qopenglslColorDodgeCompositionModeFragmentShader = "\n\
- #ifdef GL_KHR_blend_equation_advanced\n\
- layout(blend_support_colordodge) out;\n\
- #endif\n";
-
-static const char* const qopenglslColorBurnCompositionModeFragmentShader = "\n\
- #ifdef GL_KHR_blend_equation_advanced\n\
- layout(blend_support_colorburn) out;\n\
- #endif\n";
-
-static const char* const qopenglslHardLightCompositionModeFragmentShader = "\n\
- #ifdef GL_KHR_blend_equation_advanced\n\
- layout(blend_support_hardlight) out;\n\
- #endif\n";
-
-static const char* const qopenglslSoftLightCompositionModeFragmentShader = "\n\
- #ifdef GL_KHR_blend_equation_advanced\n\
- layout(blend_support_softlight) out;\n\
- #endif\n";
-
-static const char* const qopenglslDifferenceCompositionModeFragmentShader = "\n\
- #ifdef GL_KHR_blend_equation_advanced\n\
- layout(blend_support_difference) out;\n\
- #endif\n";
-
-static const char* const qopenglslExclusionCompositionModeFragmentShader = "\n\
- #ifdef GL_KHR_blend_equation_advanced\n\
- layout(blend_support_exclusion) out;\n\
- #endif\n";
-
-/*
- Left to implement:
- RgbMaskFragmentShader,
- RgbMaskWithGammaFragmentShader,
-*/
-
-/*
- OpenGL 3.2+ Core Profile shaders
- The following shader snippets are copies of the snippets above
- but use the modern GLSL 1.5 keywords. New shaders should make
- a snippet for both profiles and add them appropriately in the
- shader manager.
-*/
-static const char* const qopenglslMainVertexShader_core =
- "#version 150 core\n\
- void setPosition(); \n\
- void main(void) \n\
- { \n\
- setPosition(); \n\
- }\n";
-
-static const char* const qopenglslMainWithTexCoordsVertexShader_core =
- "#version 150 core\n\
- in vec2 textureCoordArray; \n\
- out vec2 textureCoords; \n\
- void setPosition(); \n\
- void main(void) \n\
- { \n\
- setPosition(); \n\
- textureCoords = textureCoordArray; \n\
- }\n";
-
-static const char* const qopenglslMainWithTexCoordsAndOpacityVertexShader_core =
- "#version 150 core\n\
- in vec2 textureCoordArray; \n\
- in float opacityArray; \n\
- out vec2 textureCoords; \n\
- out float opacity; \n\
- void setPosition(); \n\
- void main(void) \n\
- { \n\
- setPosition(); \n\
- textureCoords = textureCoordArray; \n\
- opacity = opacityArray; \n\
- }\n";
-
-// NOTE: We let GL do the perspective correction so texture lookups in the fragment
-// shader are also perspective corrected.
-static const char* const qopenglslPositionOnlyVertexShader_core = "\n\
- in vec2 vertexCoordsArray; \n\
- in vec3 pmvMatrix1; \n\
- in vec3 pmvMatrix2; \n\
- in vec3 pmvMatrix3; \n\
- void setPosition(void) \n\
- { \n\
- mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position = vec4(transformedPos.xy, 0.0, transformedPos.z); \n\
- }\n";
-
-static const char* const qopenglslComplexGeometryPositionOnlyVertexShader_core = "\n\
- in vec2 vertexCoordsArray; \n\
- uniform mat3 matrix; \n\
- void setPosition(void) \n\
- { \n\
- gl_Position = vec4(matrix * vec3(vertexCoordsArray, 1), 1);\n\
- } \n";
-
-static const char* const qopenglslUntransformedPositionVertexShader_core = "\n\
- in vec4 vertexCoordsArray; \n\
- void setPosition(void) \n\
- { \n\
- gl_Position = vertexCoordsArray; \n\
- }\n";
-
-// Pattern Brush - This assumes the texture size is 8x8 and thus, the inverted size is 0.125
-static const char* const qopenglslPositionWithPatternBrushVertexShader_core = "\n\
- in vec2 vertexCoordsArray; \n\
- in vec3 pmvMatrix1; \n\
- in vec3 pmvMatrix2; \n\
- in vec3 pmvMatrix3; \n\
- out vec2 patternTexCoords; \n\
- uniform vec2 halfViewportSize; \n\
- uniform vec2 invertedTextureSize; \n\
- uniform mat3 brushTransform; \n\
- void setPosition(void) \n\
- { \n\
- mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1.0); \n\
- float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- patternTexCoords.xy = (hTexCoords.xy * 0.125) * invertedHTexCoordsZ; \n\
- }\n";
-
-static const char* const qopenglslAffinePositionWithPatternBrushVertexShader_core
- = qopenglslPositionWithPatternBrushVertexShader_core;
-
-static const char* const qopenglslPatternBrushSrcFragmentShader_core = "\n\
- in vec2 patternTexCoords;\n\
- uniform sampler2D brushTexture; \n\
- uniform vec4 patternColor; \n\
- vec4 srcPixel() \n\
- { \n\
- return patternColor * (1.0 - texture(brushTexture, patternTexCoords).r); \n\
- }\n";
-
-
-// Linear Gradient Brush
-static const char* const qopenglslPositionWithLinearGradientBrushVertexShader_core = "\n\
- in vec2 vertexCoordsArray; \n\
- in vec3 pmvMatrix1; \n\
- in vec3 pmvMatrix2; \n\
- in vec3 pmvMatrix3; \n\
- out float index; \n\
- uniform vec2 halfViewportSize; \n\
- uniform vec3 linearData; \n\
- uniform mat3 brushTransform; \n\
- void setPosition() \n\
- { \n\
- mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- index = (dot(linearData.xy, hTexCoords.xy) * linearData.z) * invertedHTexCoordsZ; \n\
- }\n";
-
-static const char* const qopenglslAffinePositionWithLinearGradientBrushVertexShader_core
- = qopenglslPositionWithLinearGradientBrushVertexShader_core;
-
-static const char* const qopenglslLinearGradientBrushSrcFragmentShader_core = "\n\
- uniform sampler2D brushTexture; \n\
- in float index; \n\
- vec4 srcPixel() \n\
- { \n\
- vec2 val = vec2(index, 0.5); \n\
- return texture(brushTexture, val); \n\
- }\n";
-
-
-// Conical Gradient Brush
-static const char* const qopenglslPositionWithConicalGradientBrushVertexShader_core = "\n\
- in vec2 vertexCoordsArray; \n\
- in vec3 pmvMatrix1; \n\
- in vec3 pmvMatrix2; \n\
- in vec3 pmvMatrix3; \n\
- out vec2 A; \n\
- uniform vec2 halfViewportSize; \n\
- uniform mat3 brushTransform; \n\
- void setPosition(void) \n\
- { \n\
- mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- A = hTexCoords.xy * invertedHTexCoordsZ; \n\
- }\n";
-
-static const char* const qopenglslAffinePositionWithConicalGradientBrushVertexShader_core
- = qopenglslPositionWithConicalGradientBrushVertexShader_core;
-
-static const char* const qopenglslConicalGradientBrushSrcFragmentShader_core = "\n\
- #define INVERSE_2PI 0.1591549430918953358 \n\
- in vec2 A; \n\
- uniform sampler2D brushTexture; \n\
- uniform float angle; \n\
- vec4 srcPixel() \n\
- { \n\
- float t; \n\
- if (abs(A.y) == abs(A.x)) \n\
- t = (atan(-A.y + 0.002, A.x) + angle) * INVERSE_2PI; \n\
- else \n\
- t = (atan(-A.y, A.x) + angle) * INVERSE_2PI; \n\
- return texture(brushTexture, vec2(t - floor(t), 0.5)); \n\
- }\n";
-
-
-// Radial Gradient Brush
-static const char* const qopenglslPositionWithRadialGradientBrushVertexShader_core = "\n\
- in vec2 vertexCoordsArray;\n\
- in vec3 pmvMatrix1; \n\
- in vec3 pmvMatrix2; \n\
- in vec3 pmvMatrix3; \n\
- out float b; \n\
- out vec2 A; \n\
- uniform vec2 halfViewportSize; \n\
- uniform mat3 brushTransform; \n\
- uniform vec2 fmp; \n\
- uniform vec3 bradius; \n\
- void setPosition(void) \n\
- {\n\
- mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- A = hTexCoords.xy * invertedHTexCoordsZ; \n\
- b = bradius.x + 2.0 * dot(A, fmp); \n\
- }\n";
-
-static const char* const qopenglslAffinePositionWithRadialGradientBrushVertexShader_core
- = qopenglslPositionWithRadialGradientBrushVertexShader_core;
-
-static const char* const qopenglslRadialGradientBrushSrcFragmentShader_core = "\n\
- in float b; \n\
- in vec2 A; \n\
- uniform sampler2D brushTexture; \n\
- uniform float fmp2_m_radius2; \n\
- uniform float inverse_2_fmp2_m_radius2; \n\
- uniform float sqrfr; \n\
- uniform vec3 bradius; \n\
- \n\
- vec4 srcPixel() \n\
- { \n\
- float c = sqrfr-dot(A, A); \n\
- float det = b*b - 4.0*fmp2_m_radius2*c; \n\
- vec4 result = vec4(0.0); \n\
- if (det >= 0.0) { \n\
- float detSqrt = sqrt(det); \n\
- float w = max((-b - detSqrt) * inverse_2_fmp2_m_radius2, (-b + detSqrt) * inverse_2_fmp2_m_radius2); \n\
- if (bradius.y + w * bradius.z >= 0.0) \n\
- result = texture(brushTexture, vec2(w, 0.5)); \n\
- } \n\
- return result; \n\
- }\n";
-
-
-// Texture Brush
-static const char* const qopenglslPositionWithTextureBrushVertexShader_core = "\n\
- in vec2 vertexCoordsArray; \n\
- in vec3 pmvMatrix1; \n\
- in vec3 pmvMatrix2; \n\
- in vec3 pmvMatrix3; \n\
- out vec2 brushTextureCoords; \n\
- uniform vec2 halfViewportSize; \n\
- uniform vec2 invertedTextureSize; \n\
- uniform mat3 brushTransform; \n\
- \n\
- void setPosition(void) \n\
- { \n\
- mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- brushTextureCoords.xy = (hTexCoords.xy * invertedTextureSize) * gl_Position.w; \n\
- }\n";
-
-static const char* const qopenglslAffinePositionWithTextureBrushVertexShader_core
- = qopenglslPositionWithTextureBrushVertexShader_core;
-
-static const char* const qopenglslTextureBrushSrcFragmentShader_core = "\n\
- in vec2 brushTextureCoords; \n\
- uniform sampler2D brushTexture; \n\
- vec4 srcPixel() \n\
- { \n\
- return texture(brushTexture, brushTextureCoords); \n\
- }\n";
-
-static const char* const qopenglslTextureBrushSrcWithPatternFragmentShader_core = "\n\
- in vec2 brushTextureCoords; \n\
- uniform vec4 patternColor; \n\
- uniform sampler2D brushTexture; \n\
- vec4 srcPixel() \n\
- { \n\
- return patternColor * (1.0 - texture(brushTexture, brushTextureCoords).r); \n\
- }\n";
-
-// Solid Fill Brush
-static const char* const qopenglslSolidBrushSrcFragmentShader_core = "\n\
- uniform vec4 fragmentColor; \n\
- vec4 srcPixel() \n\
- { \n\
- return fragmentColor; \n\
- }\n";
-
-static const char* const qopenglslImageSrcFragmentShader_core = "\n\
- in vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- vec4 srcPixel() \n\
- { \n\
- return texture(imageTexture, textureCoords); \n\
- }\n";
-
-static const char* const qopenglslCustomSrcFragmentShader_core = "\n\
- in vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- vec4 srcPixel() \n\
- { \n\
- return customShader(imageTexture, textureCoords); \n\
- }\n";
-
-static const char* const qopenglslImageSrcWithPatternFragmentShader_core = "\n\
- in vec2 textureCoords; \n\
- uniform vec4 patternColor; \n\
- uniform sampler2D imageTexture; \n\
- vec4 srcPixel() \n\
- { \n\
- return patternColor * (1.0 - texture(imageTexture, textureCoords).r); \n\
- }\n";
-
-static const char* const qopenglslNonPremultipliedImageSrcFragmentShader_core = "\n\
- in vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- vec4 srcPixel() \n\
- { \n\
- vec4 sample = texture(imageTexture, textureCoords); \n\
- sample.rgb = sample.rgb * sample.a; \n\
- return sample; \n\
- }\n";
-
-static const char* const qopenglslGrayscaleImageSrcFragmentShader_core = "\n\
- in vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- vec4 srcPixel() \n\
- { \n\
- return texture(imageTexture, textureCoords).rrra; \n\
- }\n";
-
-static const char* const qopenglslAlphaImageSrcFragmentShader_core = "\n\
- in vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- vec4 srcPixel() \n\
- { \n\
- return vec4(0, 0, 0, texture(imageTexture, textureCoords).r); \n\
- }\n";
-
-static const char* const qopenglslShockingPinkSrcFragmentShader_core = "\n\
- vec4 srcPixel() \n\
- { \n\
- return vec4(0.98, 0.06, 0.75, 1.0); \n\
- }\n";
-
-static const char* const qopenglslMainFragmentShader_ImageArrays_core =
- "#version 150 core\n\
- in float opacity; \n\
- out vec4 fragColor; \n\
- vec4 srcPixel(); \n\
- void main() \n\
- { \n\
- fragColor = srcPixel() * opacity; \n\
- }\n";
-
-static const char* const qopenglslMainFragmentShader_MO_core =
- "#version 150 core\n\
- out vec4 fragColor; \n\
- uniform float globalOpacity; \n\
- vec4 srcPixel(); \n\
- vec4 applyMask(vec4); \n\
- void main() \n\
- { \n\
- fragColor = applyMask(srcPixel()*globalOpacity); \n\
- }\n";
-
-static const char* const qopenglslMainFragmentShader_M_core =
- "#version 150 core\n\
- out vec4 fragColor; \n\
- vec4 srcPixel(); \n\
- vec4 applyMask(vec4); \n\
- void main() \n\
- { \n\
- fragColor = applyMask(srcPixel()); \n\
- }\n";
-
-static const char* const qopenglslMainFragmentShader_O_core =
- "#version 150 core\n\
- out vec4 fragColor; \n\
- uniform float globalOpacity; \n\
- vec4 srcPixel(); \n\
- void main() \n\
- { \n\
- fragColor = srcPixel()*globalOpacity; \n\
- }\n";
-
-static const char* const qopenglslMainFragmentShader_core =
- "#version 150 core\n\
- out vec4 fragColor; \n\
- vec4 srcPixel(); \n\
- void main() \n\
- { \n\
- fragColor = srcPixel(); \n\
- }\n";
-
-static const char* const qopenglslMaskFragmentShader_core = "\n\
- in vec2 textureCoords;\n\
- uniform sampler2D maskTexture;\n\
- vec4 applyMask(vec4 src) \n\
- {\n\
- vec4 mask = texture(maskTexture, textureCoords); \n\
- return src * mask.r; \n\
- }\n";
-
-// For source over with subpixel antialiasing, the final color is calculated per component as follows
-// (.a is alpha component, .c is red, green or blue component):
-// alpha = src.a * mask.c * opacity
-// dest.c = dest.c * (1 - alpha) + src.c * alpha
-//
-// In the first pass, calculate: dest.c = dest.c * (1 - alpha) with blend funcs: zero, 1 - source color
-// In the second pass, calculate: dest.c = dest.c + src.c * alpha with blend funcs: one, one
-//
-// If source is a solid color (src is constant), only the first pass is needed, with blend funcs: constant, 1 - source color
-
-// For source composition with subpixel antialiasing, the final color is calculated per component as follows:
-// alpha = src.a * mask.c * opacity
-// dest.c = dest.c * (1 - mask.c) + src.c * alpha
-//
-
-static const char* const qopenglslRgbMaskFragmentShaderPass1_core = "\n\
- in vec2 textureCoords;\n\
- uniform sampler2D maskTexture;\n\
- vec4 applyMask(vec4 src) \n\
- { \n\
- vec4 mask = texture(maskTexture, textureCoords); \n\
- return src.a * mask; \n\
- }\n";
-
-static const char* const qopenglslRgbMaskFragmentShaderPass2_core = "\n\
- in vec2 textureCoords;\n\
- uniform sampler2D maskTexture;\n\
- vec4 applyMask(vec4 src) \n\
- { \n\
- vec4 mask = texture(maskTexture, textureCoords); \n\
- return src * mask; \n\
- }\n";
-
-/*
- Left to implement:
- RgbMaskFragmentShader_core,
- RgbMaskWithGammaFragmentShader_core,
-*/
-
-QT_END_NAMESPACE
-
-#endif // GLGC_SHADER_SOURCE_H
diff --git a/src/gui/opengl/qopenglextrafunctions.h b/src/gui/opengl/qopenglextrafunctions.h
index faac2dce4e..4b02b1a60d 100644
--- a/src/gui/opengl/qopenglextrafunctions.h
+++ b/src/gui/opengl/qopenglextrafunctions.h
@@ -53,7 +53,7 @@
#endif
// GLES build without having included gl32.h -> GLDEBUGPROC is still need for the protos, define it here
-#if defined(QT_OPENGL_ES_2) && !defined(QT_OPENGL_ES_3_2)
+#if QT_CONFIG(opengles2) && !QT_CONFIG(opengles32)
typedef void (QOPENGLF_APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
#endif
diff --git a/src/gui/opengl/qopenglframebufferobject.cpp b/src/gui/opengl/qopenglframebufferobject.cpp
deleted file mode 100644
index d7a6d32218..0000000000
--- a/src/gui/opengl/qopenglframebufferobject.cpp
+++ /dev/null
@@ -1,1857 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenglframebufferobject.h"
-#include "qopenglframebufferobject_p.h"
-
-#include <qdebug.h>
-#include <private/qopengl_p.h>
-#include <private/qopenglcontext_p.h>
-#include <private/qopenglextensions_p.h>
-#include <private/qfont_p.h>
-
-#include <qwindow.h>
-#include <qimage.h>
-#include <QtCore/qbytearray.h>
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_DEBUG
-#define QT_RESET_GLERROR() \
-{ \
- while (true) {\
- GLenum error = QOpenGLContext::currentContext()->functions()->glGetError(); \
- if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST) \
- break; \
- } \
-}
-#define QT_CHECK_GLERROR() \
-{ \
- GLenum err = QOpenGLContext::currentContext()->functions()->glGetError(); \
- if (err != GL_NO_ERROR && err != GL_CONTEXT_LOST) { \
- qDebug("[%s line %d] OpenGL Error: %d", \
- __FILE__, __LINE__, (int)err); \
- } \
-}
-#else
-#define QT_RESET_GLERROR() {}
-#define QT_CHECK_GLERROR() {}
-#endif
-
-#ifndef GL_MAX_SAMPLES
-#define GL_MAX_SAMPLES 0x8D57
-#endif
-
-#ifndef GL_RENDERBUFFER_SAMPLES
-#define GL_RENDERBUFFER_SAMPLES 0x8CAB
-#endif
-
-#ifndef GL_DEPTH24_STENCIL8
-#define GL_DEPTH24_STENCIL8 0x88F0
-#endif
-
-#ifndef GL_DEPTH_COMPONENT24
-#define GL_DEPTH_COMPONENT24 0x81A6
-#endif
-
-#ifndef GL_DEPTH_COMPONENT24_OES
-#define GL_DEPTH_COMPONENT24_OES 0x81A6
-#endif
-
-#ifndef GL_READ_FRAMEBUFFER
-#define GL_READ_FRAMEBUFFER 0x8CA8
-#endif
-
-#ifndef GL_DRAW_FRAMEBUFFER
-#define GL_DRAW_FRAMEBUFFER 0x8CA9
-#endif
-
-#ifndef GL_RGB8
-#define GL_RGB8 0x8051
-#endif
-
-#ifndef GL_RGB10
-#define GL_RGB10 0x8052
-#endif
-
-#ifndef GL_RGB16
-#define GL_RGB16 0x8054
-#endif
-
-#ifndef GL_RGBA8
-#define GL_RGBA8 0x8058
-#endif
-
-#ifndef GL_RGB10_A2
-#define GL_RGB10_A2 0x8059
-#endif
-
-#ifndef GL_RGBA16
-#define GL_RGBA16 0x805B
-#endif
-
-#ifndef GL_BGRA
-#define GL_BGRA 0x80E1
-#endif
-
-#ifndef GL_UNSIGNED_INT_8_8_8_8_REV
-#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
-#endif
-
-#ifndef GL_UNSIGNED_INT_2_10_10_10_REV
-#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
-#endif
-
-#ifndef GL_CONTEXT_LOST
-#define GL_CONTEXT_LOST 0x0507
-#endif
-
-#ifndef GL_DEPTH_STENCIL_ATTACHMENT
-#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
-#endif
-
-#ifndef GL_DEPTH_STENCIL
-#define GL_DEPTH_STENCIL 0x84F9
-#endif
-
-
-
-/*!
- \class QOpenGLFramebufferObjectFormat
- \brief The QOpenGLFramebufferObjectFormat class specifies the format of an OpenGL
- framebuffer object.
- \inmodule QtGui
-
- \since 5.0
-
- \ingroup painting-3D
-
- A framebuffer object has several characteristics:
- \list
- \li \l{setSamples()}{Number of samples per pixels.}
- \li \l{setAttachment()}{Depth and/or stencil attachments.}
- \li \l{setTextureTarget()}{Texture target.}
- \li \l{setInternalTextureFormat()}{Internal texture format.}
- \endlist
-
- Note that the desired attachments or number of samples per pixels might not
- be supported by the hardware driver. Call QOpenGLFramebufferObject::format()
- after creating a QOpenGLFramebufferObject to find the exact format that was
- used to create the frame buffer object.
-
- \sa QOpenGLFramebufferObject
-*/
-
-/*!
- \internal
-*/
-void QOpenGLFramebufferObjectFormat::detach()
-{
- if (d->ref.loadRelaxed() != 1) {
- QOpenGLFramebufferObjectFormatPrivate *newd
- = new QOpenGLFramebufferObjectFormatPrivate(d);
- if (!d->ref.deref())
- delete d;
- d = newd;
- }
-}
-
-/*!
- Creates a QOpenGLFramebufferObjectFormat object for specifying
- the format of an OpenGL framebuffer object.
-
- By default the format specifies a non-multisample framebuffer object with no
- depth/stencil attachments, texture target \c GL_TEXTURE_2D, and internal format \c GL_RGBA8.
- On OpenGL/ES systems, the default internal format is \c GL_RGBA.
-
- \sa samples(), attachment(), internalTextureFormat()
-*/
-
-QOpenGLFramebufferObjectFormat::QOpenGLFramebufferObjectFormat()
-{
- d = new QOpenGLFramebufferObjectFormatPrivate;
-}
-
-/*!
- Constructs a copy of \a other.
-*/
-
-QOpenGLFramebufferObjectFormat::QOpenGLFramebufferObjectFormat(const QOpenGLFramebufferObjectFormat &other)
-{
- d = other.d;
- d->ref.ref();
-}
-
-/*!
- Assigns \a other to this object.
-*/
-
-QOpenGLFramebufferObjectFormat &QOpenGLFramebufferObjectFormat::operator=(const QOpenGLFramebufferObjectFormat &other)
-{
- if (d != other.d) {
- other.d->ref.ref();
- if (!d->ref.deref())
- delete d;
- d = other.d;
- }
- return *this;
-}
-
-/*!
- Destroys the QOpenGLFramebufferObjectFormat.
-*/
-QOpenGLFramebufferObjectFormat::~QOpenGLFramebufferObjectFormat()
-{
- if (!d->ref.deref())
- delete d;
-}
-
-/*!
- Sets the number of samples per pixel for a multisample framebuffer object
- to \a samples. The default sample count of 0 represents a regular
- non-multisample framebuffer object.
-
- If the desired amount of samples per pixel is not supported by the hardware
- then the maximum number of samples per pixel will be used. Note that
- multisample framebuffer objects cannot be bound as textures. Also, the
- \c{GL_EXT_framebuffer_multisample} extension is required to create a
- framebuffer with more than one sample per pixel.
-
- \sa samples()
-*/
-void QOpenGLFramebufferObjectFormat::setSamples(int samples)
-{
- detach();
- d->samples = samples;
-}
-
-/*!
- Returns the number of samples per pixel if a framebuffer object
- is a multisample framebuffer object. Otherwise, returns 0.
- The default value is 0.
-
- \sa setSamples()
-*/
-int QOpenGLFramebufferObjectFormat::samples() const
-{
- return d->samples;
-}
-
-/*!
- Enables mipmapping if \a enabled is true; otherwise disables it.
-
- Mipmapping is disabled by default.
-
- If mipmapping is enabled, additional memory will be allocated for
- the mipmap levels. The mipmap levels can be updated by binding the
- texture and calling glGenerateMipmap(). Mipmapping cannot be enabled
- for multisampled framebuffer objects.
-
- \sa mipmap(), QOpenGLFramebufferObject::texture()
-*/
-void QOpenGLFramebufferObjectFormat::setMipmap(bool enabled)
-{
- detach();
- d->mipmap = enabled;
-}
-
-/*!
- Returns \c true if mipmapping is enabled.
-
- \sa setMipmap()
-*/
-bool QOpenGLFramebufferObjectFormat::mipmap() const
-{
- return d->mipmap;
-}
-
-/*!
- Sets the attachment configuration of a framebuffer object to \a attachment.
-
- \sa attachment()
-*/
-void QOpenGLFramebufferObjectFormat::setAttachment(QOpenGLFramebufferObject::Attachment attachment)
-{
- detach();
- d->attachment = attachment;
-}
-
-/*!
- Returns the configuration of the depth and stencil buffers attached to
- a framebuffer object. The default is QOpenGLFramebufferObject::NoAttachment.
-
- \sa setAttachment()
-*/
-QOpenGLFramebufferObject::Attachment QOpenGLFramebufferObjectFormat::attachment() const
-{
- return d->attachment;
-}
-
-/*!
- Sets the texture target of the texture attached to a framebuffer object to
- \a target. Ignored for multisample framebuffer objects.
-
- \sa textureTarget(), samples()
-*/
-void QOpenGLFramebufferObjectFormat::setTextureTarget(GLenum target)
-{
- detach();
- d->target = target;
-}
-
-/*!
- Returns the texture target of the texture attached to a framebuffer object.
- Ignored for multisample framebuffer objects. The default is
- \c GL_TEXTURE_2D.
-
- \sa setTextureTarget(), samples()
-*/
-GLenum QOpenGLFramebufferObjectFormat::textureTarget() const
-{
- return d->target;
-}
-
-/*!
- Sets the internal format of a framebuffer object's texture or
- multisample framebuffer object's color buffer to
- \a internalTextureFormat.
-
- \sa internalTextureFormat()
-*/
-void QOpenGLFramebufferObjectFormat::setInternalTextureFormat(GLenum internalTextureFormat)
-{
- detach();
- d->internal_format = internalTextureFormat;
-}
-
-/*!
- Returns the internal format of a framebuffer object's texture or
- multisample framebuffer object's color buffer. The default is
- \c GL_RGBA8 on desktop OpenGL systems, and \c GL_RGBA on
- OpenGL/ES systems.
-
- \sa setInternalTextureFormat()
-*/
-GLenum QOpenGLFramebufferObjectFormat::internalTextureFormat() const
-{
- return d->internal_format;
-}
-
-/*!
- Returns \c true if all the options of this framebuffer object format
- are the same as \a other; otherwise returns \c false.
-*/
-bool QOpenGLFramebufferObjectFormat::operator==(const QOpenGLFramebufferObjectFormat& other) const
-{
- if (d == other.d)
- return true;
- else
- return d->equals(other.d);
-}
-
-/*!
- Returns \c false if all the options of this framebuffer object format
- are the same as \a other; otherwise returns \c true.
-*/
-bool QOpenGLFramebufferObjectFormat::operator!=(const QOpenGLFramebufferObjectFormat& other) const
-{
- return !(*this == other);
-}
-
-bool QOpenGLFramebufferObjectPrivate::checkFramebufferStatus(QOpenGLContext *ctx) const
-{
- if (!ctx)
- return false; // Context no longer exists.
- GLenum status = ctx->functions()->glCheckFramebufferStatus(GL_FRAMEBUFFER);
- switch(status) {
- case GL_NO_ERROR:
- case GL_FRAMEBUFFER_COMPLETE:
- return true;
- case GL_FRAMEBUFFER_UNSUPPORTED:
- qDebug("QOpenGLFramebufferObject: Unsupported framebuffer format.");
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
- qDebug("QOpenGLFramebufferObject: Framebuffer incomplete attachment.");
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
- qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, missing attachment.");
- break;
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT
- case GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT:
- qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, duplicate attachment.");
- break;
-#endif
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS
- case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
- qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, attached images must have same dimensions.");
- break;
-#endif
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_FORMATS
- case GL_FRAMEBUFFER_INCOMPLETE_FORMATS:
- qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, attached images must have same format.");
- break;
-#endif
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER
- case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
- qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, missing draw buffer.");
- break;
-#endif
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER
- case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
- qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, missing read buffer.");
- break;
-#endif
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
- case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
- qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, attachments must have same number of samples per pixel.");
- break;
-#endif
- default:
- qDebug() <<"QOpenGLFramebufferObject: An undefined error has occurred: "<< status;
- break;
- }
- return false;
-}
-
-namespace
-{
- void freeFramebufferFunc(QOpenGLFunctions *funcs, GLuint id)
- {
- funcs->glDeleteFramebuffers(1, &id);
- }
-
- void freeRenderbufferFunc(QOpenGLFunctions *funcs, GLuint id)
- {
- funcs->glDeleteRenderbuffers(1, &id);
- }
-
- void freeTextureFunc(QOpenGLFunctions *funcs, GLuint id)
- {
- funcs->glDeleteTextures(1, &id);
- }
-}
-
-void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSize &size,
- QOpenGLFramebufferObject::Attachment attachment,
- GLenum texture_target, GLenum internal_format,
- GLint samples, bool mipmap)
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
-
- funcs.initializeOpenGLFunctions();
-
- if (!funcs.hasOpenGLFeature(QOpenGLFunctions::Framebuffers))
- return;
-
- // Fall back to using a normal non-msaa FBO if we don't have support for MSAA
- if (!funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample)
- || !funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit)) {
- samples = 0;
- } else if (!ctx->isOpenGLES() || ctx->format().majorVersion() >= 3) {
- GLint maxSamples;
- funcs.glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
- samples = qBound(0, int(samples), int(maxSamples));
- }
-
- colorAttachments.append(ColorAttachment(size, internal_format));
-
- dsSize = size;
-
- samples = qMax(0, samples);
- requestedSamples = samples;
-
- target = texture_target;
-
- QT_RESET_GLERROR(); // reset error state
- GLuint fbo = 0;
-
- funcs.glGenFramebuffers(1, &fbo);
- funcs.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
-
- QOpenGLContextPrivate::get(ctx)->qgl_current_fbo_invalid = true;
-
- QT_CHECK_GLERROR();
-
- format.setTextureTarget(target);
- format.setInternalTextureFormat(internal_format);
- format.setMipmap(mipmap);
-
- if (samples == 0)
- initTexture(0);
- else
- initColorBuffer(0, &samples);
-
- format.setSamples(int(samples));
-
- initDepthStencilAttachments(ctx, attachment);
-
- if (valid)
- fbo_guard = new QOpenGLSharedResourceGuard(ctx, fbo, freeFramebufferFunc);
- else
- funcs.glDeleteFramebuffers(1, &fbo);
-
- QT_CHECK_GLERROR();
-}
-
-void QOpenGLFramebufferObjectPrivate::initTexture(int idx)
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- GLuint texture = 0;
-
- funcs.glGenTextures(1, &texture);
- funcs.glBindTexture(target, texture);
-
- funcs.glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- funcs.glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- funcs.glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- funcs.glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- ColorAttachment &color(colorAttachments[idx]);
-
- GLuint pixelType = GL_UNSIGNED_BYTE;
- if (color.internalFormat == GL_RGB10_A2 || color.internalFormat == GL_RGB10)
- pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
- else if (color.internalFormat == GL_RGB16 || color.internalFormat == GL_RGBA16)
- pixelType = GL_UNSIGNED_SHORT;
-
- funcs.glTexImage2D(target, 0, color.internalFormat, color.size.width(), color.size.height(), 0,
- GL_RGBA, pixelType, nullptr);
- if (format.mipmap()) {
- int width = color.size.width();
- int height = color.size.height();
- int level = 0;
- while (width > 1 || height > 1) {
- width = qMax(1, width >> 1);
- height = qMax(1, height >> 1);
- ++level;
- funcs.glTexImage2D(target, level, color.internalFormat, width, height, 0,
- GL_RGBA, pixelType, nullptr);
- }
- }
- funcs.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + idx,
- target, texture, 0);
-
- QT_CHECK_GLERROR();
- funcs.glBindTexture(target, 0);
- valid = checkFramebufferStatus(ctx);
- if (valid) {
- color.guard = new QOpenGLSharedResourceGuard(ctx, texture, freeTextureFunc);
- } else {
- funcs.glDeleteTextures(1, &texture);
- }
-}
-
-void QOpenGLFramebufferObjectPrivate::initColorBuffer(int idx, GLint *samples)
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- GLuint color_buffer = 0;
-
- ColorAttachment &color(colorAttachments[idx]);
-
- GLenum storageFormat = color.internalFormat;
- // ES requires a sized format. The older desktop extension does not. Correct the format on ES.
- if (ctx->isOpenGLES()) {
- if (color.internalFormat == GL_RGBA) {
- if (funcs.hasOpenGLExtension(QOpenGLExtensions::Sized8Formats))
- storageFormat = GL_RGBA8;
- else
- storageFormat = GL_RGBA4;
- } else if (color.internalFormat == GL_RGB10) {
- // GL_RGB10 is not allowed in ES for glRenderbufferStorage.
- storageFormat = GL_RGB10_A2;
- }
- }
-
- funcs.glGenRenderbuffers(1, &color_buffer);
- funcs.glBindRenderbuffer(GL_RENDERBUFFER, color_buffer);
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, *samples, storageFormat, color.size.width(), color.size.height());
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + idx,
- GL_RENDERBUFFER, color_buffer);
-
- QT_CHECK_GLERROR();
- valid = checkFramebufferStatus(ctx);
- if (valid) {
- // Query the actual number of samples. This can be greater than the requested
- // value since the typically supported values are 0, 4, 8, ..., and the
- // requests are mapped to the next supported value.
- funcs.glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, samples);
- color.guard = new QOpenGLSharedResourceGuard(ctx, color_buffer, freeRenderbufferFunc);
- } else {
- funcs.glDeleteRenderbuffers(1, &color_buffer);
- }
-}
-
-void QOpenGLFramebufferObjectPrivate::initDepthStencilAttachments(QOpenGLContext *ctx,
- QOpenGLFramebufferObject::Attachment attachment)
-{
- // Use the same sample count for all attachments. format.samples() already contains
- // the actual number of samples for the color attachment and is not suitable. Use
- // requestedSamples instead.
- const int samples = requestedSamples;
-
- // free existing attachments
- if (depth_buffer_guard) {
-#ifdef Q_OS_WASM
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
-#else
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
-#endif
- depth_buffer_guard->free();
- }
- if (stencil_buffer_guard) {
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
- if (stencil_buffer_guard != depth_buffer_guard)
- stencil_buffer_guard->free();
- }
-
- depth_buffer_guard = nullptr;
- stencil_buffer_guard = nullptr;
-
- GLuint depth_buffer = 0;
- GLuint stencil_buffer = 0;
-
- // In practice, a combined depth-stencil buffer is supported by all desktop platforms, while a
- // separate stencil buffer is not. On embedded devices however, a combined depth-stencil buffer
- // might not be supported while separate buffers are, according to QTBUG-12861.
-#ifdef Q_OS_WASM
- // WebGL doesn't allow separately attach buffers to
- // STENCIL_ATTACHMENT and DEPTH_ATTACHMENT
- // QTBUG-69913
- if (attachment == QOpenGLFramebufferObject::CombinedDepthStencil) {
- funcs.glGenRenderbuffers(1, &depth_buffer);
- funcs.glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
- Q_ASSERT(funcs.glIsRenderbuffer(depth_buffer));
-
- if (samples != 0 ) {
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH24_STENCIL8, dsSize.width(), dsSize.height());
- } else {
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL,
- dsSize.width(), dsSize.height());
- }
-
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, depth_buffer);
-
- valid = checkFramebufferStatus(ctx);
- if (!valid) {
- funcs.glDeleteRenderbuffers(1, &depth_buffer);
- depth_buffer = 0;
- }
- }
-#else
- if (attachment == QOpenGLFramebufferObject::CombinedDepthStencil
- && funcs.hasOpenGLExtension(QOpenGLExtensions::PackedDepthStencil))
- {
- // depth and stencil buffer needs another extension
- funcs.glGenRenderbuffers(1, &depth_buffer);
- funcs.glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
- Q_ASSERT(funcs.glIsRenderbuffer(depth_buffer));
- if (samples != 0 && funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample))
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH24_STENCIL8, dsSize.width(), dsSize.height());
- else
- funcs.glRenderbufferStorage(GL_RENDERBUFFER,
- GL_DEPTH24_STENCIL8, dsSize.width(), dsSize.height());
-
- stencil_buffer = depth_buffer;
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
- GL_RENDERBUFFER, depth_buffer);
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, stencil_buffer);
-
- valid = checkFramebufferStatus(ctx);
- if (!valid) {
- funcs.glDeleteRenderbuffers(1, &depth_buffer);
- stencil_buffer = depth_buffer = 0;
- }
- }
-
- if (depth_buffer == 0 && (attachment == QOpenGLFramebufferObject::CombinedDepthStencil
- || (attachment == QOpenGLFramebufferObject::Depth)))
- {
- funcs.glGenRenderbuffers(1, &depth_buffer);
- funcs.glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
- Q_ASSERT(funcs.glIsRenderbuffer(depth_buffer));
- if (samples != 0 && funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample)) {
- if (ctx->isOpenGLES()) {
- if (funcs.hasOpenGLExtension(QOpenGLExtensions::Depth24))
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH_COMPONENT24, dsSize.width(), dsSize.height());
- else
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH_COMPONENT16, dsSize.width(), dsSize.height());
- } else {
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH_COMPONENT, dsSize.width(), dsSize.height());
- }
- } else {
- if (ctx->isOpenGLES()) {
- if (funcs.hasOpenGLExtension(QOpenGLExtensions::Depth24)) {
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24,
- dsSize.width(), dsSize.height());
- } else {
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
- dsSize.width(), dsSize.height());
- }
- } else {
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, dsSize.width(), dsSize.height());
- }
- }
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
- GL_RENDERBUFFER, depth_buffer);
- valid = checkFramebufferStatus(ctx);
- if (!valid) {
- funcs.glDeleteRenderbuffers(1, &depth_buffer);
- depth_buffer = 0;
- }
- }
-
- if (stencil_buffer == 0 && (attachment == QOpenGLFramebufferObject::CombinedDepthStencil)) {
- funcs.glGenRenderbuffers(1, &stencil_buffer);
- funcs.glBindRenderbuffer(GL_RENDERBUFFER, stencil_buffer);
- Q_ASSERT(funcs.glIsRenderbuffer(stencil_buffer));
-
-#ifdef QT_OPENGL_ES
- GLenum storage = GL_STENCIL_INDEX8;
-#else
- GLenum storage = ctx->isOpenGLES() ? GL_STENCIL_INDEX8 : GL_STENCIL_INDEX;
-#endif
-
- if (samples != 0 && funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample))
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, storage, dsSize.width(), dsSize.height());
- else
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, storage, dsSize.width(), dsSize.height());
-
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, stencil_buffer);
- valid = checkFramebufferStatus(ctx);
- if (!valid) {
- funcs.glDeleteRenderbuffers(1, &stencil_buffer);
- stencil_buffer = 0;
- }
- }
-#endif //Q_OS_WASM
-
- // The FBO might have become valid after removing the depth or stencil buffer.
- valid = checkFramebufferStatus(ctx);
-
-#ifdef Q_OS_WASM
- if (depth_buffer) {
-#else
- if (depth_buffer && stencil_buffer) {
-#endif
- fbo_attachment = QOpenGLFramebufferObject::CombinedDepthStencil;
- } else if (depth_buffer) {
- fbo_attachment = QOpenGLFramebufferObject::Depth;
- } else {
- fbo_attachment = QOpenGLFramebufferObject::NoAttachment;
- }
-
- if (valid) {
- if (depth_buffer)
- depth_buffer_guard = new QOpenGLSharedResourceGuard(ctx, depth_buffer, freeRenderbufferFunc);
- if (stencil_buffer) {
- if (stencil_buffer == depth_buffer)
- stencil_buffer_guard = depth_buffer_guard;
- else
- stencil_buffer_guard = new QOpenGLSharedResourceGuard(ctx, stencil_buffer, freeRenderbufferFunc);
- }
- } else {
- if (depth_buffer)
- funcs.glDeleteRenderbuffers(1, &depth_buffer);
- if (stencil_buffer && depth_buffer != stencil_buffer)
- funcs.glDeleteRenderbuffers(1, &stencil_buffer);
- }
- QT_CHECK_GLERROR();
-
- format.setAttachment(fbo_attachment);
-}
-
-/*!
- \class QOpenGLFramebufferObject
- \brief The QOpenGLFramebufferObject class encapsulates an OpenGL framebuffer object.
- \since 5.0
- \inmodule QtGui
-
- \ingroup painting-3D
-
- The QOpenGLFramebufferObject class encapsulates an OpenGL framebuffer
- object, defined by the \c{GL_EXT_framebuffer_object} extension. It provides
- a rendering surface that can be painted on with a QPainter with the help of
- QOpenGLPaintDevice, or rendered to using native OpenGL calls. This surface
- can be bound and used as a regular texture in your own OpenGL drawing code.
- By default, the QOpenGLFramebufferObject class generates a 2D OpenGL
- texture (using the \c{GL_TEXTURE_2D} target), which is used as the internal
- rendering target.
-
- \b{It is important to have a current OpenGL context when creating a
- QOpenGLFramebufferObject, otherwise initialization will fail.}
-
- Create the QOpenGLFrameBufferObject instance with the CombinedDepthStencil
- attachment if you want QPainter to render correctly. Note that you need to
- create a QOpenGLFramebufferObject with more than one sample per pixel for
- primitives to be antialiased when drawing using a QPainter. To create a
- multisample framebuffer object you should use one of the constructors that
- take a QOpenGLFramebufferObjectFormat parameter, and set the
- QOpenGLFramebufferObjectFormat::samples() property to a non-zero value.
-
- For multisample framebuffer objects a color render buffer is created,
- otherwise a texture with the specified texture target is created.
- The color render buffer or texture will have the specified internal
- format, and will be bound to the \c GL_COLOR_ATTACHMENT0
- attachment in the framebuffer object.
-
- Multiple render targets are also supported, in case the OpenGL
- implementation supports this. Here there will be multiple textures (or, in
- case of multisampling, renderbuffers) present and each of them will get
- attached to \c GL_COLOR_ATTACHMENT0, \c 1, \c 2, ...
-
- If you want to use a framebuffer object with multisampling enabled
- as a texture, you first need to copy from it to a regular framebuffer
- object using QOpenGLContext::blitFramebuffer().
-
- It is possible to draw into a QOpenGLFramebufferObject using QPainter and
- QOpenGLPaintDevice in a separate thread.
-*/
-
-
-/*!
- \enum QOpenGLFramebufferObject::Attachment
-
- This enum type is used to configure the depth and stencil buffers
- attached to the framebuffer object when it is created.
-
- \value NoAttachment No attachment is added to the framebuffer object. Note that the
- OpenGL depth and stencil tests won't work when rendering to a
- framebuffer object without any depth or stencil buffers.
- This is the default value.
-
- \value CombinedDepthStencil If the \c GL_EXT_packed_depth_stencil extension is present,
- a combined depth and stencil buffer is attached.
- If the extension is not present, only a depth buffer is attached.
-
- \value Depth A depth buffer is attached to the framebuffer object.
-
- \sa attachment()
-*/
-
-static inline GLenum effectiveInternalFormat(GLenum internalFormat)
-{
- if (!internalFormat)
-#ifdef QT_OPENGL_ES_2
- internalFormat = GL_RGBA;
-#else
- internalFormat = QOpenGLContext::currentContext()->isOpenGLES() ? GL_RGBA : GL_RGBA8;
-#endif
- return internalFormat;
-}
-
-/*!
-
- Constructs an OpenGL framebuffer object and binds a 2D OpenGL texture
- to the buffer of the size \a size. The texture is bound to the
- \c GL_COLOR_ATTACHMENT0 target in the framebuffer object.
-
- The \a target parameter is used to specify the OpenGL texture
- target. The default target is \c GL_TEXTURE_2D. Keep in mind that
- \c GL_TEXTURE_2D textures must have a power of 2 width and height
- (e.g. 256x512), unless you are using OpenGL 2.0 or higher.
-
- By default, no depth and stencil buffers are attached. This behavior
- can be toggled using one of the overloaded constructors.
-
- The default internal texture format is \c GL_RGBA8 for desktop
- OpenGL, and \c GL_RGBA for OpenGL/ES.
-
- It is important that you have a current OpenGL context set when
- creating the QOpenGLFramebufferObject, otherwise the initialization
- will fail.
-
- \sa size(), texture(), attachment()
-*/
-
-QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, GLenum target)
- : d_ptr(new QOpenGLFramebufferObjectPrivate)
-{
- Q_D(QOpenGLFramebufferObject);
- d->init(this, size, NoAttachment, target, effectiveInternalFormat(0));
-}
-
-/*!
-
- Constructs an OpenGL framebuffer object and binds a 2D OpenGL texture
- to the buffer of the given \a width and \a height.
-
- \sa size(), texture()
-*/
-QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, GLenum target)
- : QOpenGLFramebufferObject(QSize(width, height), target)
-{
-}
-
-/*!
-
- Constructs an OpenGL framebuffer object of the given \a size based on the
- supplied \a format.
-*/
-
-QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, const QOpenGLFramebufferObjectFormat &format)
- : d_ptr(new QOpenGLFramebufferObjectPrivate)
-{
- Q_D(QOpenGLFramebufferObject);
- d->init(this, size, format.attachment(), format.textureTarget(), format.internalTextureFormat(),
- format.samples(), format.mipmap());
-}
-
-/*!
-
- Constructs an OpenGL framebuffer object of the given \a width and \a height
- based on the supplied \a format.
-*/
-
-QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, const QOpenGLFramebufferObjectFormat &format)
- : QOpenGLFramebufferObject(QSize(width, height), format)
-{
-}
-
-/*!
-
- Constructs an OpenGL framebuffer object and binds a texture to the
- buffer of the given \a width and \a height.
-
- The \a attachment parameter describes the depth/stencil buffer
- configuration, \a target the texture target and \a internalFormat
- the internal texture format. The default texture target is \c
- GL_TEXTURE_2D, while the default internal format is \c GL_RGBA8
- for desktop OpenGL and \c GL_RGBA for OpenGL/ES.
-
- \sa size(), texture(), attachment()
-*/
-QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, Attachment attachment,
- GLenum target, GLenum internalFormat)
- : d_ptr(new QOpenGLFramebufferObjectPrivate)
-{
- Q_D(QOpenGLFramebufferObject);
- d->init(this, QSize(width, height), attachment, target, effectiveInternalFormat(internalFormat));
-}
-
-/*!
-
- Constructs an OpenGL framebuffer object and binds a texture to the
- buffer of the given \a size.
-
- The \a attachment parameter describes the depth/stencil buffer
- configuration, \a target the texture target and \a internalFormat
- the internal texture format. The default texture target is \c
- GL_TEXTURE_2D, while the default internal format is \c GL_RGBA8
- for desktop OpenGL and \c GL_RGBA for OpenGL/ES.
-
- \sa size(), texture(), attachment()
-*/
-QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, Attachment attachment,
- GLenum target, GLenum internalFormat)
- : d_ptr(new QOpenGLFramebufferObjectPrivate)
-{
- Q_D(QOpenGLFramebufferObject);
- d->init(this, size, attachment, target, effectiveInternalFormat(internalFormat));
-}
-
-/*!
-
- Destroys the framebuffer object and frees any allocated resources.
-*/
-QOpenGLFramebufferObject::~QOpenGLFramebufferObject()
-{
- Q_D(QOpenGLFramebufferObject);
- if (isBound())
- release();
-
- for (const auto &color : qAsConst(d->colorAttachments)) {
- if (color.guard)
- color.guard->free();
- }
- d->colorAttachments.clear();
-
- if (d->depth_buffer_guard)
- d->depth_buffer_guard->free();
- if (d->stencil_buffer_guard && d->stencil_buffer_guard != d->depth_buffer_guard)
- d->stencil_buffer_guard->free();
- if (d->fbo_guard)
- d->fbo_guard->free();
-
- QOpenGLContextPrivate *contextPrv = QOpenGLContextPrivate::get(QOpenGLContext::currentContext());
- if (contextPrv && contextPrv->qgl_current_fbo == this) {
- contextPrv->qgl_current_fbo_invalid = true;
- contextPrv->qgl_current_fbo = nullptr;
- }
-}
-
-/*!
- Creates and attaches an additional texture or renderbuffer of \a size width
- and height.
-
- There is always an attachment at GL_COLOR_ATTACHMENT0. Call this function
- to set up additional attachments at GL_COLOR_ATTACHMENT1,
- GL_COLOR_ATTACHMENT2, ...
-
- When \a internalFormat is not \c 0, it specifies the internal format of the
- texture or renderbuffer. Otherwise a default of GL_RGBA or GL_RGBA8 is
- used.
-
- \note This is only functional when multiple render targets are supported by
- the OpenGL implementation. When that is not the case, the function will not
- add any additional color attachments. Call
- QOpenGLFunctions::hasOpenGLFeature() with
- QOpenGLFunctions::MultipleRenderTargets at runtime to check if MRT is
- supported.
-
- \note The internal format of the color attachments may differ but there may
- be limitations on the supported combinations, depending on the drivers.
-
- \note The size of the color attachments may differ but rendering is limited
- to the area that fits all the attachments, according to the OpenGL
- specification. Some drivers may not be fully conformant in this respect,
- however.
-
- \since 5.6
- */
-void QOpenGLFramebufferObject::addColorAttachment(const QSize &size, GLenum internalFormat)
-{
- Q_D(QOpenGLFramebufferObject);
-
- if (!QOpenGLContext::currentContext()->functions()->hasOpenGLFeature(QOpenGLFunctions::MultipleRenderTargets)) {
- qWarning("Multiple render targets not supported, ignoring extra color attachment request");
- return;
- }
-
- QOpenGLFramebufferObjectPrivate::ColorAttachment color(size, effectiveInternalFormat(internalFormat));
- d->colorAttachments.append(color);
- const int idx = d->colorAttachments.count() - 1;
-
- if (d->requestedSamples == 0) {
- d->initTexture(idx);
- } else {
- GLint samples = d->requestedSamples;
- d->initColorBuffer(idx, &samples);
- }
-}
-
-/*! \overload
-
- Creates and attaches an additional texture or renderbuffer of size \a width and \a height.
-
- When \a internalFormat is not \c 0, it specifies the internal format of the texture or
- renderbuffer. Otherwise a default of GL_RGBA or GL_RGBA8 is used.
-
- \since 5.6
- */
-void QOpenGLFramebufferObject::addColorAttachment(int width, int height, GLenum internalFormat)
-{
- addColorAttachment(QSize(width, height), internalFormat);
-}
-
-/*!
- \fn bool QOpenGLFramebufferObject::isValid() const
-
- Returns \c true if the framebuffer object is valid.
-
- The framebuffer can become invalid if the initialization process
- fails, the user attaches an invalid buffer to the framebuffer
- object, or a non-power of two width/height is specified as the
- texture size if the texture target is \c{GL_TEXTURE_2D}.
- The non-power of two limitation does not apply if the OpenGL version
- is 2.0 or higher, or if the GL_ARB_texture_non_power_of_two extension
- is present.
-
- The framebuffer can also become invalid if the QOpenGLContext that
- the framebuffer was created within is destroyed and there are
- no other shared contexts that can take over ownership of the
- framebuffer.
-*/
-bool QOpenGLFramebufferObject::isValid() const
-{
- Q_D(const QOpenGLFramebufferObject);
- return d->valid && d->fbo_guard && d->fbo_guard->id();
-}
-
-/*!
- \fn bool QOpenGLFramebufferObject::bind()
-
- Switches rendering from the default, windowing system provided
- framebuffer to this framebuffer object.
- Returns \c true upon success, false otherwise.
-
- \note If takeTexture() was called, a new texture is created and associated
- with the framebuffer object. This is potentially expensive and changes the
- context state (the currently bound texture).
-
- \sa release()
-*/
-bool QOpenGLFramebufferObject::bind()
-{
- if (!isValid())
- return false;
- Q_D(QOpenGLFramebufferObject);
- QOpenGLContext *current = QOpenGLContext::currentContext();
- if (!current)
- return false;
-#ifdef QT_DEBUG
- if (current->shareGroup() != d->fbo_guard->group())
- qWarning("QOpenGLFramebufferObject::bind() called from incompatible context");
-#endif
-
- d->funcs.glBindFramebuffer(GL_FRAMEBUFFER, d->fbo());
-
- QOpenGLContextPrivate::get(current)->qgl_current_fbo_invalid = true;
- QOpenGLContextPrivate::get(current)->qgl_current_fbo = this;
-
- if (d->format.samples() == 0) {
- // Create new textures to replace the ones stolen via takeTexture().
- for (int i = 0; i < d->colorAttachments.count(); ++i) {
- if (!d->colorAttachments.at(i).guard)
- d->initTexture(i);
- }
- }
-
- return d->valid;
-}
-
-/*!
- \fn bool QOpenGLFramebufferObject::release()
-
- Switches rendering back to the default, windowing system provided
- framebuffer.
- Returns \c true upon success, false otherwise.
-
- \sa bind()
-*/
-bool QOpenGLFramebufferObject::release()
-{
- if (!isValid())
- return false;
-
- QOpenGLContext *current = QOpenGLContext::currentContext();
- if (!current)
- return false;
-
- Q_D(QOpenGLFramebufferObject);
-#ifdef QT_DEBUG
- if (current->shareGroup() != d->fbo_guard->group())
- qWarning("QOpenGLFramebufferObject::release() called from incompatible context");
-#endif
-
- if (current) {
- d->funcs.glBindFramebuffer(GL_FRAMEBUFFER, current->defaultFramebufferObject());
-
- QOpenGLContextPrivate *contextPrv = QOpenGLContextPrivate::get(current);
- contextPrv->qgl_current_fbo_invalid = true;
- contextPrv->qgl_current_fbo = nullptr;
- }
-
- return true;
-}
-
-/*!
- \fn GLuint QOpenGLFramebufferObject::texture() const
-
- Returns the texture id for the texture attached as the default
- rendering target in this framebuffer object. This texture id can
- be bound as a normal texture in your own OpenGL code.
-
- If a multisample framebuffer object is used then the value returned
- from this function will be invalid.
-
- When multiple textures are attached, the return value is the ID of
- the first one.
-
- \sa takeTexture(), textures()
-*/
-GLuint QOpenGLFramebufferObject::texture() const
-{
- Q_D(const QOpenGLFramebufferObject);
- return d->colorAttachments[0].guard ? d->colorAttachments[0].guard->id() : 0;
-}
-
-/*!
- Returns the texture id for all attached textures.
-
- If a multisample framebuffer object is used, then an empty vector is returned.
-
- \since 5.6
-
- \sa takeTexture(), texture()
-*/
-QVector<GLuint> QOpenGLFramebufferObject::textures() const
-{
- Q_D(const QOpenGLFramebufferObject);
- QVector<GLuint> ids;
- if (d->format.samples() != 0)
- return ids;
- ids.reserve(d->colorAttachments.count());
- for (const auto &color : d->colorAttachments)
- ids.append(color.guard ? color.guard->id() : 0);
- return ids;
-}
-
-/*!
- \fn GLuint QOpenGLFramebufferObject::takeTexture()
-
- Returns the texture id for the texture attached to this framebuffer
- object. The ownership of the texture is transferred to the caller.
-
- If the framebuffer object is currently bound, an implicit release()
- will be done. During the next call to bind() a new texture will be
- created.
-
- If a multisample framebuffer object is used, then there is no
- texture and the return value from this function will be invalid.
- Similarly, incomplete framebuffer objects will also return 0.
-
- \since 5.3
-
- \sa texture(), bind(), release()
- */
-GLuint QOpenGLFramebufferObject::takeTexture()
-{
- return takeTexture(0);
-}
-
-/*! \overload
-
- Returns the texture id for the texture attached to the color attachment of
- index \a colorAttachmentIndex of this framebuffer object. The ownership of
- the texture is transferred to the caller.
-
- When \a colorAttachmentIndex is \c 0, the behavior is identical to the
- parameter-less variant of this function.
-
- If the framebuffer object is currently bound, an implicit release()
- will be done. During the next call to bind() a new texture will be
- created.
-
- If a multisample framebuffer object is used, then there is no
- texture and the return value from this function will be invalid.
- Similarly, incomplete framebuffer objects will also return 0.
-
- \since 5.6
- */
-GLuint QOpenGLFramebufferObject::takeTexture(int colorAttachmentIndex)
-{
- Q_D(QOpenGLFramebufferObject);
- GLuint id = 0;
- if (isValid() && d->format.samples() == 0 && d->colorAttachments.count() > colorAttachmentIndex) {
- QOpenGLContext *current = QOpenGLContext::currentContext();
- if (current && current->shareGroup() == d->fbo_guard->group() && isBound())
- release();
- auto &guard = d->colorAttachments[colorAttachmentIndex].guard;
- id = guard ? guard->id() : 0;
- // Do not call free() on texture_guard, just null it out.
- // This way the texture will not be deleted when the guard is destroyed.
- guard = nullptr;
- }
- return id;
-}
-
-/*!
- \return the size of the color and depth/stencil attachments attached to
- this framebuffer object.
-*/
-QSize QOpenGLFramebufferObject::size() const
-{
- Q_D(const QOpenGLFramebufferObject);
- return d->dsSize;
-}
-
-/*!
- \return the sizes of all color attachments attached to this framebuffer
- object.
-
- \since 5.6
-*/
-QVector<QSize> QOpenGLFramebufferObject::sizes() const
-{
- Q_D(const QOpenGLFramebufferObject);
- QVector<QSize> sz;
- sz.reserve(d->colorAttachments.size());
- for (const auto &color : d->colorAttachments)
- sz.append(color.size);
- return sz;
-}
-
-/*!
- \fn int QOpenGLFramebufferObject::width() const
-
- Returns the width of the framebuffer object attachments.
-*/
-
-/*!
- \fn int QOpenGLFramebufferObject::height() const
-
- Returns the height of the framebuffer object attachments.
-*/
-
-/*!
- Returns the format of this framebuffer object.
-*/
-QOpenGLFramebufferObjectFormat QOpenGLFramebufferObject::format() const
-{
- Q_D(const QOpenGLFramebufferObject);
- return d->format;
-}
-
-static inline QImage qt_gl_read_framebuffer_rgba8(const QSize &size, bool include_alpha, QOpenGLContext *context)
-{
- QOpenGLFunctions *funcs = context->functions();
- const int w = size.width();
- const int h = size.height();
- bool isOpenGL12orBetter = !context->isOpenGLES() && (context->format().majorVersion() >= 2 || context->format().minorVersion() >= 2);
- if (isOpenGL12orBetter) {
- QImage img(size, include_alpha ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32);
- funcs->glReadPixels(0, 0, w, h, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, img.bits());
- return img;
- }
-
- // For OpenGL ES stick with the byte ordered format / RGBA readback format
- // since that is the only spec mandated way. (also, skip the
- // GL_IMPLEMENTATION_COLOR_READ_FORMAT mess since there is nothing saying a
- // BGRA capable impl would return BGRA from there)
-
- QImage rgbaImage(size, include_alpha ? QImage::Format_RGBA8888_Premultiplied : QImage::Format_RGBX8888);
- funcs->glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, rgbaImage.bits());
- return rgbaImage;
-}
-
-static inline QImage qt_gl_read_framebuffer_rgb10a2(const QSize &size, bool include_alpha, QOpenGLContext *context)
-{
- // We assume OpenGL 1.2+ or ES 3.0+ here.
- QImage img(size, include_alpha ? QImage::Format_A2BGR30_Premultiplied : QImage::Format_BGR30);
- context->functions()->glReadPixels(0, 0, size.width(), size.height(), GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, img.bits());
- return img;
-}
-
-static inline QImage qt_gl_read_framebuffer_rgba16(const QSize &size, bool include_alpha, QOpenGLContext *context)
-{
- // We assume OpenGL 1.2+ or ES 3.0+ here.
- QImage img(size, include_alpha ? QImage::Format_RGBA64_Premultiplied : QImage::Format_RGBX64);
- context->functions()->glReadPixels(0, 0, size.width(), size.height(), GL_RGBA, GL_UNSIGNED_SHORT, img.bits());
- return img;
-}
-
-static QImage qt_gl_read_framebuffer(const QSize &size, GLenum internal_format, bool include_alpha, bool flip)
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- QOpenGLFunctions *funcs = ctx->functions();
- while (true) {
- GLenum error = funcs->glGetError();
- if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST)
- break;
- }
- switch (internal_format) {
- case GL_RGB:
- case GL_RGB8:
- return qt_gl_read_framebuffer_rgba8(size, false, ctx).mirrored(false, flip);
- case GL_RGB10:
- return qt_gl_read_framebuffer_rgb10a2(size, false, ctx).mirrored(false, flip);
- case GL_RGB10_A2:
- return qt_gl_read_framebuffer_rgb10a2(size, include_alpha, ctx).mirrored(false, flip);
- case GL_RGB16:
- return qt_gl_read_framebuffer_rgba16(size, false, ctx).mirrored(false, flip);
- case GL_RGBA16:
- return qt_gl_read_framebuffer_rgba16(size, include_alpha, ctx).mirrored(false, flip);
- case GL_RGBA:
- case GL_RGBA8:
- default:
- return qt_gl_read_framebuffer_rgba8(size, include_alpha, ctx).mirrored(false, flip);
- }
-
- Q_UNREACHABLE();
- return QImage();
-}
-
-Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha)
-{
- return qt_gl_read_framebuffer(size, alpha_format ? GL_RGBA : GL_RGB, include_alpha, true);
-}
-
-/*!
- \fn QImage QOpenGLFramebufferObject::toImage(bool flipped) const
-
- Returns the contents of this framebuffer object as a QImage.
-
- If \a flipped is true the image is flipped from OpenGL coordinates to raster coordinates.
- If used together with QOpenGLPaintDevice, \a flipped should be the opposite of the value
- of QOpenGLPaintDevice::paintFlipped().
-
- The returned image has a format of premultiplied ARGB32 or RGB32. The latter
- is used only when internalTextureFormat() is set to \c GL_RGB. Since Qt 5.2
- the function will fall back to premultiplied RGBA8888 or RGBx8888 when
- reading to (A)RGB32 is not supported, and this includes OpenGL ES. Since Qt
- 5.4 an A2BGR30 image is returned if the internal format is RGB10_A2, and since
- Qt 5.12 a RGBA64 image is return if the internal format is RGBA16.
-
- If the rendering in the framebuffer was not done with premultiplied alpha in mind,
- create a wrapper QImage with a non-premultiplied format. This is necessary before
- performing operations like QImage::save() because otherwise the image data would get
- unpremultiplied, even though it was not premultiplied in the first place. To create
- such a wrapper without performing a copy of the pixel data, do the following:
-
- \code
- QImage fboImage(fbo.toImage());
- QImage image(fboImage.constBits(), fboImage.width(), fboImage.height(), QImage::Format_ARGB32);
- \endcode
-
- For multisampled framebuffer objects the samples are resolved using the
- \c{GL_EXT_framebuffer_blit} extension. If the extension is not available, the contents
- of the returned image is undefined.
-
- For singlesampled framebuffers the contents is retrieved via \c glReadPixels. This is
- a potentially expensive and inefficient operation. Therefore it is recommended that
- this function is used as seldom as possible.
-
- \sa QOpenGLPaintDevice::paintFlipped()
-*/
-
-QImage QOpenGLFramebufferObject::toImage(bool flipped) const
-{
- return toImage(flipped, 0);
-}
-
-/*!
- \fn QImage QOpenGLFramebufferObject::toImage() const
- \overload
-
- Returns the contents of this framebuffer object as a QImage. This method flips
- the image from OpenGL coordinates to raster coordinates.
-*/
-// ### Qt 6: Remove this method and make it a default argument instead.
-QImage QOpenGLFramebufferObject::toImage() const
-{
- return toImage(true, 0);
-}
-
-/*! \overload
-
- Returns the contents of the color attachment of index \a
- colorAttachmentIndex of this framebuffer object as a QImage. This method
- flips the image from OpenGL coordinates to raster coordinates when \a
- flipped is set to \c true.
-
- \note This overload is only fully functional when multiple render targets are
- supported by the OpenGL implementation. When that is not the case, only one
- color attachment will be set up.
-
- \since 5.6
-*/
-QImage QOpenGLFramebufferObject::toImage(bool flipped, int colorAttachmentIndex) const
-{
- Q_D(const QOpenGLFramebufferObject);
- if (!d->valid)
- return QImage();
-
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (!ctx) {
- qWarning("QOpenGLFramebufferObject::toImage() called without a current context");
- return QImage();
- }
-
- if (d->colorAttachments.count() <= colorAttachmentIndex) {
- qWarning("QOpenGLFramebufferObject::toImage() called for missing color attachment");
- return QImage();
- }
-
- GLuint prevFbo = 0;
- ctx->functions()->glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *) &prevFbo);
-
- if (prevFbo != d->fbo())
- const_cast<QOpenGLFramebufferObject *>(this)->bind();
-
- QImage image;
- QOpenGLExtraFunctions *extraFuncs = ctx->extraFunctions();
- // qt_gl_read_framebuffer doesn't work on a multisample FBO
- if (format().samples() != 0) {
- QRect rect(QPoint(0, 0), size());
- QOpenGLFramebufferObjectFormat fmt;
- if (extraFuncs->hasOpenGLFeature(QOpenGLFunctions::MultipleRenderTargets)) {
- fmt.setInternalTextureFormat(d->colorAttachments[colorAttachmentIndex].internalFormat);
- QOpenGLFramebufferObject temp(d->colorAttachments[colorAttachmentIndex].size, fmt);
- blitFramebuffer(&temp, rect, const_cast<QOpenGLFramebufferObject *>(this), rect,
- GL_COLOR_BUFFER_BIT, GL_NEAREST,
- colorAttachmentIndex, 0);
- image = temp.toImage(flipped);
- } else {
- fmt.setInternalTextureFormat(d->colorAttachments[0].internalFormat);
- QOpenGLFramebufferObject temp(size(), fmt);
- blitFramebuffer(&temp, rect, const_cast<QOpenGLFramebufferObject *>(this), rect);
- image = temp.toImage(flipped);
- }
- } else {
- if (extraFuncs->hasOpenGLFeature(QOpenGLFunctions::MultipleRenderTargets)) {
- extraFuncs->glReadBuffer(GL_COLOR_ATTACHMENT0 + colorAttachmentIndex);
- image = qt_gl_read_framebuffer(d->colorAttachments[colorAttachmentIndex].size,
- d->colorAttachments[colorAttachmentIndex].internalFormat,
- true, flipped);
- extraFuncs->glReadBuffer(GL_COLOR_ATTACHMENT0);
- } else {
- image = qt_gl_read_framebuffer(d->colorAttachments[0].size,
- d->colorAttachments[0].internalFormat,
- true, flipped);
- }
- }
-
- if (prevFbo != d->fbo())
- ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER, prevFbo);
-
- return image;
-}
-
-/*!
- \fn bool QOpenGLFramebufferObject::bindDefault()
-
- Switches rendering back to the default, windowing system provided
- framebuffer.
- Returns \c true upon success, false otherwise.
-
- \sa bind(), release()
-*/
-bool QOpenGLFramebufferObject::bindDefault()
-{
- QOpenGLContext *ctx = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
-
- if (ctx) {
- ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER, ctx->defaultFramebufferObject());
- QOpenGLContextPrivate::get(ctx)->qgl_current_fbo_invalid = true;
- QOpenGLContextPrivate::get(ctx)->qgl_current_fbo = nullptr;
- }
-#ifdef QT_DEBUG
- else
- qWarning("QOpenGLFramebufferObject::bindDefault() called without current context.");
-#endif
-
- return ctx != nullptr;
-}
-
-/*!
- \fn bool QOpenGLFramebufferObject::hasOpenGLFramebufferObjects()
-
- Returns \c true if the OpenGL \c{GL_EXT_framebuffer_object} extension
- is present on this system; otherwise returns \c false.
-*/
-bool QOpenGLFramebufferObject::hasOpenGLFramebufferObjects()
-{
- return QOpenGLContext::currentContext()->functions()->hasOpenGLFeature(QOpenGLFunctions::Framebuffers);
-}
-
-/*!
- \fn GLuint QOpenGLFramebufferObject::handle() const
-
- Returns the OpenGL framebuffer object handle for this framebuffer
- object (returned by the \c{glGenFrameBuffersEXT()} function). This
- handle can be used to attach new images or buffers to the
- framebuffer. The user is responsible for cleaning up and
- destroying these objects.
-*/
-GLuint QOpenGLFramebufferObject::handle() const
-{
- Q_D(const QOpenGLFramebufferObject);
- return d->fbo();
-}
-
-/*!
- Returns the status of the depth and stencil buffers attached to
- this framebuffer object.
-*/
-
-QOpenGLFramebufferObject::Attachment QOpenGLFramebufferObject::attachment() const
-{
- Q_D(const QOpenGLFramebufferObject);
- if (d->valid)
- return d->fbo_attachment;
- return NoAttachment;
-}
-
-/*!
- Sets the attachments of the framebuffer object to \a attachment.
-
- This can be used to free or reattach the depth and stencil buffer
- attachments as needed.
-
- \note This function alters the current framebuffer binding.
- */
-void QOpenGLFramebufferObject::setAttachment(QOpenGLFramebufferObject::Attachment attachment)
-{
- Q_D(QOpenGLFramebufferObject);
- if (attachment == d->fbo_attachment || !isValid())
- return;
- QOpenGLContext *current = QOpenGLContext::currentContext();
- if (!current)
- return;
-#ifdef QT_DEBUG
- if (current->shareGroup() != d->fbo_guard->group())
- qWarning("QOpenGLFramebufferObject::setAttachment() called from incompatible context");
-#endif
- d->funcs.glBindFramebuffer(GL_FRAMEBUFFER, d->fbo());
- QOpenGLContextPrivate::get(current)->qgl_current_fbo_invalid = true;
- d->initDepthStencilAttachments(current, attachment);
-}
-
-/*!
- Returns \c true if the framebuffer object is currently bound to the current context,
- otherwise false is returned.
-*/
-bool QOpenGLFramebufferObject::isBound() const
-{
- Q_D(const QOpenGLFramebufferObject);
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (!ctx)
- return false;
- GLint fbo = 0;
- ctx->functions()->glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fbo);
- return GLuint(fbo) == d->fbo();
-}
-
-/*!
- \fn bool QOpenGLFramebufferObject::hasOpenGLFramebufferBlit()
-
- Returns \c true if the OpenGL \c{GL_EXT_framebuffer_blit} extension
- is present on this system; otherwise returns \c false.
-
- \sa blitFramebuffer()
-*/
-bool QOpenGLFramebufferObject::hasOpenGLFramebufferBlit()
-{
- return QOpenGLExtensions(QOpenGLContext::currentContext()).hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit);
-}
-
-
-/*!
- \overload
-
- Convenience overload to blit between two framebuffer objects.
-*/
-void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target,
- QOpenGLFramebufferObject *source,
- GLbitfield buffers, GLenum filter)
-{
- if (!target && !source)
- return;
-
- QSize targetSize;
- QSize sourceSize;
-
- if (target)
- targetSize = target->size();
- if (source)
- sourceSize = source->size();
-
- if (targetSize.isEmpty())
- targetSize = sourceSize;
- else if (sourceSize.isEmpty())
- sourceSize = targetSize;
-
- blitFramebuffer(target, QRect(QPoint(0, 0), targetSize),
- source, QRect(QPoint(0, 0), sourceSize),
- buffers, filter);
-}
-
-/*! \overload
- *
- Convenience overload to blit between two framebuffer objects.
-*/
-void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
- QOpenGLFramebufferObject *source, const QRect &sourceRect,
- GLbitfield buffers,
- GLenum filter)
-{
- blitFramebuffer(target, targetRect, source, sourceRect, buffers, filter, 0, 0);
-}
-
-/*!
- \enum QOpenGLFramebufferObject::FramebufferRestorePolicy
- \since 5.7
-
- This enum type is used to configure the behavior related to restoring
- framebuffer bindings when calling blitFramebuffer().
-
- \value DontRestoreFramebufferBinding Do not restore the previous framebuffer binding.
- The caller is responsible for tracking and setting
- the framebuffer binding as needed.
-
- \value RestoreFramebufferBindingToDefault After the blit operation, bind the default
- framebuffer.
-
- \value RestoreFrameBufferBinding Restore the previously bound framebuffer. This is
- potentially expensive because of the need to
- query the currently bound framebuffer.
-
- \sa blitFramebuffer()
-*/
-
-/*!
- \since 5.7
-
- Blits from the \a sourceRect rectangle in the \a source framebuffer
- object to the \a targetRect rectangle in the \a target framebuffer object.
-
- If \a source or \a target is 0, the default framebuffer will be used
- instead of a framebuffer object as source or target respectively.
-
- This function will have no effect unless hasOpenGLFramebufferBlit() returns
- true.
-
- The \a buffers parameter should be a mask consisting of any combination of
- \c GL_COLOR_BUFFER_BIT, \c GL_DEPTH_BUFFER_BIT, and
- \c GL_STENCIL_BUFFER_BIT. Any buffer type that is not present both
- in the source and target buffers is ignored.
-
- The \a sourceRect and \a targetRect rectangles may have different sizes;
- in this case \a buffers should not contain \c GL_DEPTH_BUFFER_BIT or
- \c GL_STENCIL_BUFFER_BIT. The \a filter parameter should be set to
- \c GL_LINEAR or \c GL_NEAREST, and specifies whether linear or nearest
- interpolation should be used when scaling is performed.
-
- If \a source equals \a target a copy is performed within the same buffer.
- Results are undefined if the source and target rectangles overlap and
- have different sizes. The sizes must also be the same if any of the
- framebuffer objects are multisample framebuffers.
-
- \note The scissor test will restrict the blit area if enabled.
-
- When multiple render targets are in use, \a readColorAttachmentIndex and \a
- drawColorAttachmentIndex specify the index of the color attachments in the
- source and destination framebuffers.
-
- The \a restorePolicy determines if the framebuffer that was bound prior to
- calling this function should be restored, or if the default framebuffer
- should be bound before returning, of if the caller is responsible for
- tracking and setting the bound framebuffer. Restoring the previous
- framebuffer can be relatively expensive due to the call to \c{glGetIntegerv}
- which on some OpenGL drivers may imply a pipeline stall.
-
- \sa hasOpenGLFramebufferBlit()
-*/
-void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
- QOpenGLFramebufferObject *source, const QRect &sourceRect,
- GLbitfield buffers,
- GLenum filter,
- int readColorAttachmentIndex,
- int drawColorAttachmentIndex,
- QOpenGLFramebufferObject::FramebufferRestorePolicy restorePolicy)
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (!ctx)
- return;
-
- QOpenGLExtensions extensions(ctx);
- if (!extensions.hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit))
- return;
-
- GLuint prevFbo = 0;
- if (restorePolicy == RestoreFrameBufferBinding)
- ctx->functions()->glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *) &prevFbo);
-
- const int sx0 = sourceRect.left();
- const int sx1 = sourceRect.left() + sourceRect.width();
- const int sy0 = sourceRect.top();
- const int sy1 = sourceRect.top() + sourceRect.height();
-
- const int tx0 = targetRect.left();
- const int tx1 = targetRect.left() + targetRect.width();
- const int ty0 = targetRect.top();
- const int ty1 = targetRect.top() + targetRect.height();
-
- const GLuint defaultFboId = ctx->defaultFramebufferObject();
-
- extensions.glBindFramebuffer(GL_READ_FRAMEBUFFER, source ? source->handle() : defaultFboId);
- extensions.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, target ? target->handle() : defaultFboId);
-
- const bool supportsMRT = extensions.hasOpenGLFeature(QOpenGLFunctions::MultipleRenderTargets);
- if (supportsMRT) {
- extensions.glReadBuffer(GL_COLOR_ATTACHMENT0 + readColorAttachmentIndex);
- if (target) {
- GLenum drawBuf = GL_COLOR_ATTACHMENT0 + drawColorAttachmentIndex;
- extensions.glDrawBuffers(1, &drawBuf);
- }
- }
-
- extensions.glBlitFramebuffer(sx0, sy0, sx1, sy1,
- tx0, ty0, tx1, ty1,
- buffers, filter);
-
- if (supportsMRT)
- extensions.glReadBuffer(GL_COLOR_ATTACHMENT0);
-
- switch (restorePolicy) {
- case RestoreFrameBufferBinding:
- ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER, prevFbo); // sets both READ and DRAW
- break;
-
- case RestoreFramebufferBindingToDefault:
- ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER, ctx->defaultFramebufferObject()); // sets both READ and DRAW
- break;
-
- case DontRestoreFramebufferBinding:
- break;
- }
-}
-
-/*!
- \overload
-
- Convenience overload to blit between two framebuffer objects and
- to restore the previous framebuffer binding. Equivalent to calling
- blitFramebuffer(target, targetRect, source, sourceRect, buffers, filter,
- readColorAttachmentIndex, drawColorAttachmentIndex,
- RestoreFrameBufferBinding).
-*/
-void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
- QOpenGLFramebufferObject *source, const QRect &sourceRect,
- GLbitfield buffers,
- GLenum filter,
- int readColorAttachmentIndex,
- int drawColorAttachmentIndex)
-{
- blitFramebuffer(target, targetRect, source, sourceRect,
- buffers, filter,
- readColorAttachmentIndex,
- drawColorAttachmentIndex,
- RestoreFrameBufferBinding);
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglframebufferobject.h b/src/gui/opengl/qopenglframebufferobject.h
deleted file mode 100644
index 161054d1bf..0000000000
--- a/src/gui/opengl/qopenglframebufferobject.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLFRAMEBUFFEROBJECT_H
-#define QOPENGLFRAMEBUFFEROBJECT_H
-
-#include <QtGui/qtguiglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtGui/qopengl.h>
-#include <QtGui/qpaintdevice.h>
-
-#include <QtCore/qscopedpointer.h>
-
-#if defined(Q_CLANG_QDOC)
-#undef GLuint
-typedef unsigned int GLuint;
-#undef GLenum
-typedef unsigned int GLenum;
-#undef GL_TEXTURE_2D
-#define GL_TEXTURE_2D 0x0DE1
-#undef GLbitfield
-typedef unsigned int GLbitfield;
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLFramebufferObjectPrivate;
-class QOpenGLFramebufferObjectFormat;
-
-class Q_GUI_EXPORT QOpenGLFramebufferObject
-{
- Q_DECLARE_PRIVATE(QOpenGLFramebufferObject)
-public:
- enum Attachment {
- NoAttachment,
- CombinedDepthStencil,
- Depth
- };
-
- explicit QOpenGLFramebufferObject(const QSize &size, GLenum target = GL_TEXTURE_2D);
- QOpenGLFramebufferObject(int width, int height, GLenum target = GL_TEXTURE_2D);
-
- QOpenGLFramebufferObject(const QSize &size, Attachment attachment,
- GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0);
- QOpenGLFramebufferObject(int width, int height, Attachment attachment,
- GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0);
-
- QOpenGLFramebufferObject(const QSize &size, const QOpenGLFramebufferObjectFormat &format);
- QOpenGLFramebufferObject(int width, int height, const QOpenGLFramebufferObjectFormat &format);
-
- virtual ~QOpenGLFramebufferObject();
-
- void addColorAttachment(const QSize &size, GLenum internalFormat = 0);
- void addColorAttachment(int width, int height, GLenum internalFormat = 0);
-
- QOpenGLFramebufferObjectFormat format() const;
-
- bool isValid() const;
- bool isBound() const;
- bool bind();
- bool release();
-
- int width() const { return size().width(); }
- int height() const { return size().height(); }
-
- GLuint texture() const;
- QVector<GLuint> textures() const;
-
- GLuint takeTexture();
- GLuint takeTexture(int colorAttachmentIndex);
-
- QSize size() const;
- QVector<QSize> sizes() const;
-
- QImage toImage() const;
- QImage toImage(bool flipped) const;
- QImage toImage(bool flipped, int colorAttachmentIndex) const;
-
- Attachment attachment() const;
- void setAttachment(Attachment attachment);
-
- GLuint handle() const;
-
- static bool bindDefault();
-
- static bool hasOpenGLFramebufferObjects();
-
- static bool hasOpenGLFramebufferBlit();
-
- enum FramebufferRestorePolicy {
- DontRestoreFramebufferBinding,
- RestoreFramebufferBindingToDefault,
- RestoreFrameBufferBinding
- };
-
- static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
- QOpenGLFramebufferObject *source, const QRect &sourceRect,
- GLbitfield buffers,
- GLenum filter,
- int readColorAttachmentIndex,
- int drawColorAttachmentIndex,
- FramebufferRestorePolicy restorePolicy);
- static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
- QOpenGLFramebufferObject *source, const QRect &sourceRect,
- GLbitfield buffers,
- GLenum filter,
- int readColorAttachmentIndex,
- int drawColorAttachmentIndex);
- static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
- QOpenGLFramebufferObject *source, const QRect &sourceRect,
- GLbitfield buffers = GL_COLOR_BUFFER_BIT,
- GLenum filter = GL_NEAREST);
- static void blitFramebuffer(QOpenGLFramebufferObject *target,
- QOpenGLFramebufferObject *source,
- GLbitfield buffers = GL_COLOR_BUFFER_BIT,
- GLenum filter = GL_NEAREST);
-
-private:
- Q_DISABLE_COPY(QOpenGLFramebufferObject)
- QScopedPointer<QOpenGLFramebufferObjectPrivate> d_ptr;
- friend class QOpenGLPaintDevice;
- friend class QOpenGLFBOGLPaintDevice;
-};
-
-class QOpenGLFramebufferObjectFormatPrivate;
-class Q_GUI_EXPORT QOpenGLFramebufferObjectFormat
-{
-public:
- QOpenGLFramebufferObjectFormat();
- QOpenGLFramebufferObjectFormat(const QOpenGLFramebufferObjectFormat &other);
- QOpenGLFramebufferObjectFormat &operator=(const QOpenGLFramebufferObjectFormat &other);
- ~QOpenGLFramebufferObjectFormat();
-
- void setSamples(int samples);
- int samples() const;
-
- void setMipmap(bool enabled);
- bool mipmap() const;
-
- void setAttachment(QOpenGLFramebufferObject::Attachment attachment);
- QOpenGLFramebufferObject::Attachment attachment() const;
-
- void setTextureTarget(GLenum target);
- GLenum textureTarget() const;
-
- void setInternalTextureFormat(GLenum internalTextureFormat);
- GLenum internalTextureFormat() const;
-
- bool operator==(const QOpenGLFramebufferObjectFormat& other) const;
- bool operator!=(const QOpenGLFramebufferObjectFormat& other) const;
-
-private:
- QOpenGLFramebufferObjectFormatPrivate *d;
-
- void detach();
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-
-#endif // QOPENGLFRAMEBUFFEROBJECT_H
diff --git a/src/gui/opengl/qopenglframebufferobject_p.h b/src/gui/opengl/qopenglframebufferobject_p.h
deleted file mode 100644
index 644bb6c59b..0000000000
--- a/src/gui/opengl/qopenglframebufferobject_p.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLFRAMEBUFFEROBJECT_P_H
-#define QOPENGLFRAMEBUFFEROBJECT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtGui/private/qtguiglobal_p.h>
-#include <qopenglframebufferobject.h>
-#include <private/qopenglcontext_p.h>
-#include <private/qopenglextensions_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLFramebufferObjectFormatPrivate
-{
-public:
- QOpenGLFramebufferObjectFormatPrivate()
- : ref(1),
- samples(0),
- attachment(QOpenGLFramebufferObject::NoAttachment),
- target(GL_TEXTURE_2D),
- mipmap(false)
- {
-#ifndef QT_OPENGL_ES_2
- // There is nothing that says QOpenGLFramebufferObjectFormat needs a current
- // context, so we need a fallback just to be safe, even though in pratice there
- // will usually be a context current.
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- const bool isES = ctx ? ctx->isOpenGLES() : QOpenGLContext::openGLModuleType() != QOpenGLContext::LibGL;
- internal_format = isES ? GL_RGBA : GL_RGBA8;
-#else
- internal_format = GL_RGBA;
-#endif
- }
- QOpenGLFramebufferObjectFormatPrivate
- (const QOpenGLFramebufferObjectFormatPrivate *other)
- : ref(1),
- samples(other->samples),
- attachment(other->attachment),
- target(other->target),
- internal_format(other->internal_format),
- mipmap(other->mipmap)
- {
- }
- bool equals(const QOpenGLFramebufferObjectFormatPrivate *other)
- {
- return samples == other->samples &&
- attachment == other->attachment &&
- target == other->target &&
- internal_format == other->internal_format &&
- mipmap == other->mipmap;
- }
-
- QAtomicInt ref;
- int samples;
- QOpenGLFramebufferObject::Attachment attachment;
- GLenum target;
- GLenum internal_format;
- uint mipmap : 1;
-};
-
-class QOpenGLFramebufferObjectPrivate
-{
-public:
- QOpenGLFramebufferObjectPrivate() : fbo_guard(nullptr), depth_buffer_guard(nullptr)
- , stencil_buffer_guard(nullptr)
- , valid(false) {}
- ~QOpenGLFramebufferObjectPrivate() {}
-
- void init(QOpenGLFramebufferObject *q, const QSize &size,
- QOpenGLFramebufferObject::Attachment attachment,
- GLenum texture_target, GLenum internal_format,
- GLint samples = 0, bool mipmap = false);
- void initTexture(int idx);
- void initColorBuffer(int idx, GLint *samples);
- void initDepthStencilAttachments(QOpenGLContext *ctx, QOpenGLFramebufferObject::Attachment attachment);
-
- bool checkFramebufferStatus(QOpenGLContext *ctx) const;
- QOpenGLSharedResourceGuard *fbo_guard;
- QOpenGLSharedResourceGuard *depth_buffer_guard;
- QOpenGLSharedResourceGuard *stencil_buffer_guard;
- GLenum target;
- QSize dsSize;
- QOpenGLFramebufferObjectFormat format;
- int requestedSamples;
- uint valid : 1;
- QOpenGLFramebufferObject::Attachment fbo_attachment;
- QOpenGLExtensions funcs;
-
- struct ColorAttachment {
- ColorAttachment() : internalFormat(0), guard(nullptr) { }
- ColorAttachment(const QSize &size, GLenum internalFormat)
- : size(size), internalFormat(internalFormat), guard(nullptr) { }
- QSize size;
- GLenum internalFormat;
- QOpenGLSharedResourceGuard *guard;
- };
- QVector<ColorAttachment> colorAttachments;
-
- inline GLuint fbo() const { return fbo_guard ? fbo_guard->id() : 0; }
-};
-
-
-QT_END_NAMESPACE
-
-#endif // QOPENGLFRAMEBUFFEROBJECT_P_H
diff --git a/src/gui/opengl/qopenglfunctions.cpp b/src/gui/opengl/qopenglfunctions.cpp
index 11ca802ee6..a95f064ac5 100644
--- a/src/gui/opengl/qopenglfunctions.cpp
+++ b/src/gui/opengl/qopenglfunctions.cpp
@@ -2129,7 +2129,7 @@ Func resolve(QOpenGLContext *context, const char *name, Func)
#define RESOLVE(name) \
resolve(context, "gl"#name, name)
-#ifndef QT_OPENGL_ES_2
+#if !QT_CONFIG(opengles2)
// some fallback functions
static void QOPENGLF_APIENTRY qopenglfSpecialClearDepthf(GLclampf depth)
@@ -2167,14 +2167,14 @@ static void QOPENGLF_APIENTRY qopenglfSpecialReleaseShaderCompiler()
{
}
-#endif // !QT_OPENGL_ES_2
+#endif // !QT_CONFIG(opengles2)
QOpenGLFunctionsPrivate::QOpenGLFunctionsPrivate(QOpenGLContext *c)
{
init(c);
-#ifndef QT_OPENGL_ES_2
+#if !QT_CONFIG(opengles2)
// setup fallbacks in case some methods couldn't get resolved
bool es = QOpenGLContext::currentContext()->isOpenGLES();
if (!f.ClearDepthf || !es)
diff --git a/src/gui/opengl/qopenglfunctions.h b/src/gui/opengl/qopenglfunctions.h
index 4554291bbd..66bdac5ca5 100644
--- a/src/gui/opengl/qopenglfunctions.h
+++ b/src/gui/opengl/qopenglfunctions.h
@@ -56,7 +56,7 @@
//#define Q_ENABLE_OPENGL_FUNCTIONS_DEBUG
-#ifdef QT_OPENGL_ES
+#if QT_CONFIG(opengles2)
typedef double GLdouble;
#endif
@@ -599,7 +599,7 @@ struct QOpenGLFunctionsPrivate
inline void QOpenGLFunctions::glBindTexture(GLenum target, GLuint texture)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBindTexture(target, texture);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -610,7 +610,7 @@ inline void QOpenGLFunctions::glBindTexture(GLenum target, GLuint texture)
inline void QOpenGLFunctions::glBlendFunc(GLenum sfactor, GLenum dfactor)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBlendFunc(sfactor, dfactor);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -621,7 +621,7 @@ inline void QOpenGLFunctions::glBlendFunc(GLenum sfactor, GLenum dfactor)
inline void QOpenGLFunctions::glClear(GLbitfield mask)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glClear(mask);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -632,7 +632,7 @@ inline void QOpenGLFunctions::glClear(GLbitfield mask)
inline void QOpenGLFunctions::glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glClearColor(red, green, blue, alpha);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -643,7 +643,7 @@ inline void QOpenGLFunctions::glClearColor(GLclampf red, GLclampf green, GLclamp
inline void QOpenGLFunctions::glClearStencil(GLint s)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glClearStencil(s);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -654,7 +654,7 @@ inline void QOpenGLFunctions::glClearStencil(GLint s)
inline void QOpenGLFunctions::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glColorMask(red, green, blue, alpha);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -665,7 +665,7 @@ inline void QOpenGLFunctions::glColorMask(GLboolean red, GLboolean green, GLbool
inline void QOpenGLFunctions::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glCopyTexImage2D(target, level, internalformat, x, y, width,height, border);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -676,7 +676,7 @@ inline void QOpenGLFunctions::glCopyTexImage2D(GLenum target, GLint level, GLenu
inline void QOpenGLFunctions::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -687,7 +687,7 @@ inline void QOpenGLFunctions::glCopyTexSubImage2D(GLenum target, GLint level, GL
inline void QOpenGLFunctions::glCullFace(GLenum mode)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glCullFace(mode);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -698,7 +698,7 @@ inline void QOpenGLFunctions::glCullFace(GLenum mode)
inline void QOpenGLFunctions::glDeleteTextures(GLsizei n, const GLuint* textures)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDeleteTextures(n, textures);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -709,7 +709,7 @@ inline void QOpenGLFunctions::glDeleteTextures(GLsizei n, const GLuint* textures
inline void QOpenGLFunctions::glDepthFunc(GLenum func)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDepthFunc(func);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -720,7 +720,7 @@ inline void QOpenGLFunctions::glDepthFunc(GLenum func)
inline void QOpenGLFunctions::glDepthMask(GLboolean flag)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDepthMask(flag);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -731,7 +731,7 @@ inline void QOpenGLFunctions::glDepthMask(GLboolean flag)
inline void QOpenGLFunctions::glDisable(GLenum cap)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDisable(cap);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -742,7 +742,7 @@ inline void QOpenGLFunctions::glDisable(GLenum cap)
inline void QOpenGLFunctions::glDrawArrays(GLenum mode, GLint first, GLsizei count)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDrawArrays(mode, first, count);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -753,7 +753,7 @@ inline void QOpenGLFunctions::glDrawArrays(GLenum mode, GLint first, GLsizei cou
inline void QOpenGLFunctions::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDrawElements(mode, count, type, indices);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -764,7 +764,7 @@ inline void QOpenGLFunctions::glDrawElements(GLenum mode, GLsizei count, GLenum
inline void QOpenGLFunctions::glEnable(GLenum cap)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glEnable(cap);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -775,7 +775,7 @@ inline void QOpenGLFunctions::glEnable(GLenum cap)
inline void QOpenGLFunctions::glFinish()
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glFinish();
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -786,7 +786,7 @@ inline void QOpenGLFunctions::glFinish()
inline void QOpenGLFunctions::glFlush()
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glFlush();
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -797,7 +797,7 @@ inline void QOpenGLFunctions::glFlush()
inline void QOpenGLFunctions::glFrontFace(GLenum mode)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glFrontFace(mode);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -808,7 +808,7 @@ inline void QOpenGLFunctions::glFrontFace(GLenum mode)
inline void QOpenGLFunctions::glGenTextures(GLsizei n, GLuint* textures)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGenTextures(n, textures);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -819,7 +819,7 @@ inline void QOpenGLFunctions::glGenTextures(GLsizei n, GLuint* textures)
inline void QOpenGLFunctions::glGetBooleanv(GLenum pname, GLboolean* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetBooleanv(pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -830,7 +830,7 @@ inline void QOpenGLFunctions::glGetBooleanv(GLenum pname, GLboolean* params)
inline GLenum QOpenGLFunctions::glGetError()
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLenum result = ::glGetError();
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -841,7 +841,7 @@ inline GLenum QOpenGLFunctions::glGetError()
inline void QOpenGLFunctions::glGetFloatv(GLenum pname, GLfloat* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetFloatv(pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -852,7 +852,7 @@ inline void QOpenGLFunctions::glGetFloatv(GLenum pname, GLfloat* params)
inline void QOpenGLFunctions::glGetIntegerv(GLenum pname, GLint* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetIntegerv(pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -863,7 +863,7 @@ inline void QOpenGLFunctions::glGetIntegerv(GLenum pname, GLint* params)
inline const GLubyte *QOpenGLFunctions::glGetString(GLenum name)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
const GLubyte *result = ::glGetString(name);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -875,7 +875,7 @@ inline const GLubyte *QOpenGLFunctions::glGetString(GLenum name)
inline void QOpenGLFunctions::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetTexParameterfv(target, pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -886,7 +886,7 @@ inline void QOpenGLFunctions::glGetTexParameterfv(GLenum target, GLenum pname, G
inline void QOpenGLFunctions::glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetTexParameteriv(target, pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -897,7 +897,7 @@ inline void QOpenGLFunctions::glGetTexParameteriv(GLenum target, GLenum pname, G
inline void QOpenGLFunctions::glHint(GLenum target, GLenum mode)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glHint(target, mode);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -908,7 +908,7 @@ inline void QOpenGLFunctions::glHint(GLenum target, GLenum mode)
inline GLboolean QOpenGLFunctions::glIsEnabled(GLenum cap)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLboolean result = ::glIsEnabled(cap);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -920,7 +920,7 @@ inline GLboolean QOpenGLFunctions::glIsEnabled(GLenum cap)
inline GLboolean QOpenGLFunctions::glIsTexture(GLuint texture)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLboolean result = ::glIsTexture(texture);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -932,7 +932,7 @@ inline GLboolean QOpenGLFunctions::glIsTexture(GLuint texture)
inline void QOpenGLFunctions::glLineWidth(GLfloat width)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glLineWidth(width);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -943,7 +943,7 @@ inline void QOpenGLFunctions::glLineWidth(GLfloat width)
inline void QOpenGLFunctions::glPixelStorei(GLenum pname, GLint param)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glPixelStorei(pname, param);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -954,7 +954,7 @@ inline void QOpenGLFunctions::glPixelStorei(GLenum pname, GLint param)
inline void QOpenGLFunctions::glPolygonOffset(GLfloat factor, GLfloat units)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glPolygonOffset(factor, units);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -965,7 +965,7 @@ inline void QOpenGLFunctions::glPolygonOffset(GLfloat factor, GLfloat units)
inline void QOpenGLFunctions::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glReadPixels(x, y, width, height, format, type, pixels);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -976,7 +976,7 @@ inline void QOpenGLFunctions::glReadPixels(GLint x, GLint y, GLsizei width, GLsi
inline void QOpenGLFunctions::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glScissor(x, y, width, height);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -987,7 +987,7 @@ inline void QOpenGLFunctions::glScissor(GLint x, GLint y, GLsizei width, GLsizei
inline void QOpenGLFunctions::glStencilFunc(GLenum func, GLint ref, GLuint mask)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glStencilFunc(func, ref, mask);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -998,7 +998,7 @@ inline void QOpenGLFunctions::glStencilFunc(GLenum func, GLint ref, GLuint mask)
inline void QOpenGLFunctions::glStencilMask(GLuint mask)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glStencilMask(mask);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1009,7 +1009,7 @@ inline void QOpenGLFunctions::glStencilMask(GLuint mask)
inline void QOpenGLFunctions::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glStencilOp(fail, zfail, zpass);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1020,7 +1020,7 @@ inline void QOpenGLFunctions::glStencilOp(GLenum fail, GLenum zfail, GLenum zpas
inline void QOpenGLFunctions::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glTexImage2D(target, level, internalformat, width,height, border, format, type, pixels);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1031,7 +1031,7 @@ inline void QOpenGLFunctions::glTexImage2D(GLenum target, GLint level, GLint int
inline void QOpenGLFunctions::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glTexParameterf(target, pname, param);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1042,7 +1042,7 @@ inline void QOpenGLFunctions::glTexParameterf(GLenum target, GLenum pname, GLflo
inline void QOpenGLFunctions::glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glTexParameterfv(target, pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1053,7 +1053,7 @@ inline void QOpenGLFunctions::glTexParameterfv(GLenum target, GLenum pname, cons
inline void QOpenGLFunctions::glTexParameteri(GLenum target, GLenum pname, GLint param)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glTexParameteri(target, pname, param);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1064,7 +1064,7 @@ inline void QOpenGLFunctions::glTexParameteri(GLenum target, GLenum pname, GLint
inline void QOpenGLFunctions::glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glTexParameteriv(target, pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1075,7 +1075,7 @@ inline void QOpenGLFunctions::glTexParameteriv(GLenum target, GLenum pname, cons
inline void QOpenGLFunctions::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1086,7 +1086,7 @@ inline void QOpenGLFunctions::glTexSubImage2D(GLenum target, GLint level, GLint
inline void QOpenGLFunctions::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glViewport(x, y, width, height);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1099,7 +1099,7 @@ inline void QOpenGLFunctions::glViewport(GLint x, GLint y, GLsizei width, GLsize
inline void QOpenGLFunctions::glActiveTexture(GLenum texture)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glActiveTexture(texture);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1110,7 +1110,7 @@ inline void QOpenGLFunctions::glActiveTexture(GLenum texture)
inline void QOpenGLFunctions::glAttachShader(GLuint program, GLuint shader)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glAttachShader(program, shader);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1121,7 +1121,7 @@ inline void QOpenGLFunctions::glAttachShader(GLuint program, GLuint shader)
inline void QOpenGLFunctions::glBindAttribLocation(GLuint program, GLuint index, const char* name)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBindAttribLocation(program, index, name);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1132,7 +1132,7 @@ inline void QOpenGLFunctions::glBindAttribLocation(GLuint program, GLuint index,
inline void QOpenGLFunctions::glBindBuffer(GLenum target, GLuint buffer)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBindBuffer(target, buffer);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1145,7 +1145,7 @@ inline void QOpenGLFunctions::glBindFramebuffer(GLenum target, GLuint framebuffe
{
if (framebuffer == 0)
framebuffer = QOpenGLContext::currentContext()->defaultFramebufferObject();
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBindFramebuffer(target, framebuffer);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1156,7 +1156,7 @@ inline void QOpenGLFunctions::glBindFramebuffer(GLenum target, GLuint framebuffe
inline void QOpenGLFunctions::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBindRenderbuffer(target, renderbuffer);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1167,7 +1167,7 @@ inline void QOpenGLFunctions::glBindRenderbuffer(GLenum target, GLuint renderbuf
inline void QOpenGLFunctions::glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBlendColor(red, green, blue, alpha);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1178,7 +1178,7 @@ inline void QOpenGLFunctions::glBlendColor(GLclampf red, GLclampf green, GLclamp
inline void QOpenGLFunctions::glBlendEquation(GLenum mode)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBlendEquation(mode);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1189,7 +1189,7 @@ inline void QOpenGLFunctions::glBlendEquation(GLenum mode)
inline void QOpenGLFunctions::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBlendEquationSeparate(modeRGB, modeAlpha);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1200,7 +1200,7 @@ inline void QOpenGLFunctions::glBlendEquationSeparate(GLenum modeRGB, GLenum mod
inline void QOpenGLFunctions::glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1211,7 +1211,7 @@ inline void QOpenGLFunctions::glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB,
inline void QOpenGLFunctions::glBufferData(GLenum target, qopengl_GLsizeiptr size, const void* data, GLenum usage)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBufferData(target, size, data, usage);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1222,7 +1222,7 @@ inline void QOpenGLFunctions::glBufferData(GLenum target, qopengl_GLsizeiptr siz
inline void QOpenGLFunctions::glBufferSubData(GLenum target, qopengl_GLintptr offset, qopengl_GLsizeiptr size, const void* data)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glBufferSubData(target, offset, size, data);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1233,7 +1233,7 @@ inline void QOpenGLFunctions::glBufferSubData(GLenum target, qopengl_GLintptr of
inline GLenum QOpenGLFunctions::glCheckFramebufferStatus(GLenum target)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLenum result = ::glCheckFramebufferStatus(target);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1245,7 +1245,7 @@ inline GLenum QOpenGLFunctions::glCheckFramebufferStatus(GLenum target)
inline void QOpenGLFunctions::glClearDepthf(GLclampf depth)
{
-#if defined(QT_OPENGL_ES) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glClearDepthf(depth);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1256,7 +1256,7 @@ inline void QOpenGLFunctions::glClearDepthf(GLclampf depth)
inline void QOpenGLFunctions::glCompileShader(GLuint shader)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glCompileShader(shader);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1267,7 +1267,7 @@ inline void QOpenGLFunctions::glCompileShader(GLuint shader)
inline void QOpenGLFunctions::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1278,7 +1278,7 @@ inline void QOpenGLFunctions::glCompressedTexImage2D(GLenum target, GLint level,
inline void QOpenGLFunctions::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1289,7 +1289,7 @@ inline void QOpenGLFunctions::glCompressedTexSubImage2D(GLenum target, GLint lev
inline GLuint QOpenGLFunctions::glCreateProgram()
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLuint result = ::glCreateProgram();
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1301,7 +1301,7 @@ inline GLuint QOpenGLFunctions::glCreateProgram()
inline GLuint QOpenGLFunctions::glCreateShader(GLenum type)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLuint result = ::glCreateShader(type);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1313,7 +1313,7 @@ inline GLuint QOpenGLFunctions::glCreateShader(GLenum type)
inline void QOpenGLFunctions::glDeleteBuffers(GLsizei n, const GLuint* buffers)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDeleteBuffers(n, buffers);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1324,7 +1324,7 @@ inline void QOpenGLFunctions::glDeleteBuffers(GLsizei n, const GLuint* buffers)
inline void QOpenGLFunctions::glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDeleteFramebuffers(n, framebuffers);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1335,7 +1335,7 @@ inline void QOpenGLFunctions::glDeleteFramebuffers(GLsizei n, const GLuint* fram
inline void QOpenGLFunctions::glDeleteProgram(GLuint program)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDeleteProgram(program);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1346,7 +1346,7 @@ inline void QOpenGLFunctions::glDeleteProgram(GLuint program)
inline void QOpenGLFunctions::glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDeleteRenderbuffers(n, renderbuffers);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1357,7 +1357,7 @@ inline void QOpenGLFunctions::glDeleteRenderbuffers(GLsizei n, const GLuint* ren
inline void QOpenGLFunctions::glDeleteShader(GLuint shader)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDeleteShader(shader);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1368,7 +1368,7 @@ inline void QOpenGLFunctions::glDeleteShader(GLuint shader)
inline void QOpenGLFunctions::glDepthRangef(GLclampf zNear, GLclampf zFar)
{
-#if defined(QT_OPENGL_ES) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDepthRangef(zNear, zFar);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1379,7 +1379,7 @@ inline void QOpenGLFunctions::glDepthRangef(GLclampf zNear, GLclampf zFar)
inline void QOpenGLFunctions::glDetachShader(GLuint program, GLuint shader)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDetachShader(program, shader);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1390,7 +1390,7 @@ inline void QOpenGLFunctions::glDetachShader(GLuint program, GLuint shader)
inline void QOpenGLFunctions::glDisableVertexAttribArray(GLuint index)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glDisableVertexAttribArray(index);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1401,7 +1401,7 @@ inline void QOpenGLFunctions::glDisableVertexAttribArray(GLuint index)
inline void QOpenGLFunctions::glEnableVertexAttribArray(GLuint index)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glEnableVertexAttribArray(index);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1412,7 +1412,7 @@ inline void QOpenGLFunctions::glEnableVertexAttribArray(GLuint index)
inline void QOpenGLFunctions::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1423,7 +1423,7 @@ inline void QOpenGLFunctions::glFramebufferRenderbuffer(GLenum target, GLenum at
inline void QOpenGLFunctions::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glFramebufferTexture2D(target, attachment, textarget, texture, level);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1434,7 +1434,7 @@ inline void QOpenGLFunctions::glFramebufferTexture2D(GLenum target, GLenum attac
inline void QOpenGLFunctions::glGenBuffers(GLsizei n, GLuint* buffers)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGenBuffers(n, buffers);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1445,7 +1445,7 @@ inline void QOpenGLFunctions::glGenBuffers(GLsizei n, GLuint* buffers)
inline void QOpenGLFunctions::glGenerateMipmap(GLenum target)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGenerateMipmap(target);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1456,7 +1456,7 @@ inline void QOpenGLFunctions::glGenerateMipmap(GLenum target)
inline void QOpenGLFunctions::glGenFramebuffers(GLsizei n, GLuint* framebuffers)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGenFramebuffers(n, framebuffers);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1467,7 +1467,7 @@ inline void QOpenGLFunctions::glGenFramebuffers(GLsizei n, GLuint* framebuffers)
inline void QOpenGLFunctions::glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGenRenderbuffers(n, renderbuffers);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1478,7 +1478,7 @@ inline void QOpenGLFunctions::glGenRenderbuffers(GLsizei n, GLuint* renderbuffer
inline void QOpenGLFunctions::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetActiveAttrib(program, index, bufsize, length, size, type, name);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1489,7 +1489,7 @@ inline void QOpenGLFunctions::glGetActiveAttrib(GLuint program, GLuint index, GL
inline void QOpenGLFunctions::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetActiveUniform(program, index, bufsize, length, size, type, name);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1500,7 +1500,7 @@ inline void QOpenGLFunctions::glGetActiveUniform(GLuint program, GLuint index, G
inline void QOpenGLFunctions::glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetAttachedShaders(program, maxcount, count, shaders);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1511,7 +1511,7 @@ inline void QOpenGLFunctions::glGetAttachedShaders(GLuint program, GLsizei maxco
inline GLint QOpenGLFunctions::glGetAttribLocation(GLuint program, const char* name)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLint result = ::glGetAttribLocation(program, name);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1523,7 +1523,7 @@ inline GLint QOpenGLFunctions::glGetAttribLocation(GLuint program, const char* n
inline void QOpenGLFunctions::glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetBufferParameteriv(target, pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1534,7 +1534,7 @@ inline void QOpenGLFunctions::glGetBufferParameteriv(GLenum target, GLenum pname
inline void QOpenGLFunctions::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1545,7 +1545,7 @@ inline void QOpenGLFunctions::glGetFramebufferAttachmentParameteriv(GLenum targe
inline void QOpenGLFunctions::glGetProgramiv(GLuint program, GLenum pname, GLint* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetProgramiv(program, pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1556,7 +1556,7 @@ inline void QOpenGLFunctions::glGetProgramiv(GLuint program, GLenum pname, GLint
inline void QOpenGLFunctions::glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetProgramInfoLog(program, bufsize, length, infolog);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1567,7 +1567,7 @@ inline void QOpenGLFunctions::glGetProgramInfoLog(GLuint program, GLsizei bufsiz
inline void QOpenGLFunctions::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetRenderbufferParameteriv(target, pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1578,7 +1578,7 @@ inline void QOpenGLFunctions::glGetRenderbufferParameteriv(GLenum target, GLenum
inline void QOpenGLFunctions::glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetShaderiv(shader, pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1589,7 +1589,7 @@ inline void QOpenGLFunctions::glGetShaderiv(GLuint shader, GLenum pname, GLint*
inline void QOpenGLFunctions::glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetShaderInfoLog(shader, bufsize, length, infolog);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1600,7 +1600,7 @@ inline void QOpenGLFunctions::glGetShaderInfoLog(GLuint shader, GLsizei bufsize,
inline void QOpenGLFunctions::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1611,7 +1611,7 @@ inline void QOpenGLFunctions::glGetShaderPrecisionFormat(GLenum shadertype, GLen
inline void QOpenGLFunctions::glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetShaderSource(shader, bufsize, length, source);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1622,7 +1622,7 @@ inline void QOpenGLFunctions::glGetShaderSource(GLuint shader, GLsizei bufsize,
inline void QOpenGLFunctions::glGetUniformfv(GLuint program, GLint location, GLfloat* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetUniformfv(program, location, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1633,7 +1633,7 @@ inline void QOpenGLFunctions::glGetUniformfv(GLuint program, GLint location, GLf
inline void QOpenGLFunctions::glGetUniformiv(GLuint program, GLint location, GLint* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetUniformiv(program, location, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1644,7 +1644,7 @@ inline void QOpenGLFunctions::glGetUniformiv(GLuint program, GLint location, GLi
inline GLint QOpenGLFunctions::glGetUniformLocation(GLuint program, const char* name)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLint result = ::glGetUniformLocation(program, name);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1656,7 +1656,7 @@ inline GLint QOpenGLFunctions::glGetUniformLocation(GLuint program, const char*
inline void QOpenGLFunctions::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetVertexAttribfv(index, pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1667,7 +1667,7 @@ inline void QOpenGLFunctions::glGetVertexAttribfv(GLuint index, GLenum pname, GL
inline void QOpenGLFunctions::glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetVertexAttribiv(index, pname, params);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1678,7 +1678,7 @@ inline void QOpenGLFunctions::glGetVertexAttribiv(GLuint index, GLenum pname, GL
inline void QOpenGLFunctions::glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glGetVertexAttribPointerv(index, pname, pointer);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1689,7 +1689,7 @@ inline void QOpenGLFunctions::glGetVertexAttribPointerv(GLuint index, GLenum pna
inline GLboolean QOpenGLFunctions::glIsBuffer(GLuint buffer)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLboolean result = ::glIsBuffer(buffer);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1701,7 +1701,7 @@ inline GLboolean QOpenGLFunctions::glIsBuffer(GLuint buffer)
inline GLboolean QOpenGLFunctions::glIsFramebuffer(GLuint framebuffer)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLboolean result = ::glIsFramebuffer(framebuffer);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1713,7 +1713,7 @@ inline GLboolean QOpenGLFunctions::glIsFramebuffer(GLuint framebuffer)
inline GLboolean QOpenGLFunctions::glIsProgram(GLuint program)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLboolean result = ::glIsProgram(program);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1725,7 +1725,7 @@ inline GLboolean QOpenGLFunctions::glIsProgram(GLuint program)
inline GLboolean QOpenGLFunctions::glIsRenderbuffer(GLuint renderbuffer)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLboolean result = ::glIsRenderbuffer(renderbuffer);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1737,7 +1737,7 @@ inline GLboolean QOpenGLFunctions::glIsRenderbuffer(GLuint renderbuffer)
inline GLboolean QOpenGLFunctions::glIsShader(GLuint shader)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
GLboolean result = ::glIsShader(shader);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1749,7 +1749,7 @@ inline GLboolean QOpenGLFunctions::glIsShader(GLuint shader)
inline void QOpenGLFunctions::glLinkProgram(GLuint program)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glLinkProgram(program);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1760,7 +1760,7 @@ inline void QOpenGLFunctions::glLinkProgram(GLuint program)
inline void QOpenGLFunctions::glReleaseShaderCompiler()
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glReleaseShaderCompiler();
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1771,7 +1771,7 @@ inline void QOpenGLFunctions::glReleaseShaderCompiler()
inline void QOpenGLFunctions::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glRenderbufferStorage(target, internalformat, width, height);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1782,7 +1782,7 @@ inline void QOpenGLFunctions::glRenderbufferStorage(GLenum target, GLenum intern
inline void QOpenGLFunctions::glSampleCoverage(GLclampf value, GLboolean invert)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glSampleCoverage(value, invert);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1793,7 +1793,7 @@ inline void QOpenGLFunctions::glSampleCoverage(GLclampf value, GLboolean invert)
inline void QOpenGLFunctions::glShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLint length)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glShaderBinary(n, shaders, binaryformat, binary, length);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1804,7 +1804,7 @@ inline void QOpenGLFunctions::glShaderBinary(GLint n, const GLuint* shaders, GLe
inline void QOpenGLFunctions::glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glShaderSource(shader, count, string, length);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1815,7 +1815,7 @@ inline void QOpenGLFunctions::glShaderSource(GLuint shader, GLsizei count, const
inline void QOpenGLFunctions::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glStencilFuncSeparate(face, func, ref, mask);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1826,7 +1826,7 @@ inline void QOpenGLFunctions::glStencilFuncSeparate(GLenum face, GLenum func, GL
inline void QOpenGLFunctions::glStencilMaskSeparate(GLenum face, GLuint mask)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glStencilMaskSeparate(face, mask);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1837,7 +1837,7 @@ inline void QOpenGLFunctions::glStencilMaskSeparate(GLenum face, GLuint mask)
inline void QOpenGLFunctions::glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glStencilOpSeparate(face, fail, zfail, zpass);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1848,7 +1848,7 @@ inline void QOpenGLFunctions::glStencilOpSeparate(GLenum face, GLenum fail, GLen
inline void QOpenGLFunctions::glUniform1f(GLint location, GLfloat x)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform1f(location, x);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1859,7 +1859,7 @@ inline void QOpenGLFunctions::glUniform1f(GLint location, GLfloat x)
inline void QOpenGLFunctions::glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform1fv(location, count, v);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1870,7 +1870,7 @@ inline void QOpenGLFunctions::glUniform1fv(GLint location, GLsizei count, const
inline void QOpenGLFunctions::glUniform1i(GLint location, GLint x)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform1i(location, x);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1881,7 +1881,7 @@ inline void QOpenGLFunctions::glUniform1i(GLint location, GLint x)
inline void QOpenGLFunctions::glUniform1iv(GLint location, GLsizei count, const GLint* v)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform1iv(location, count, v);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1892,7 +1892,7 @@ inline void QOpenGLFunctions::glUniform1iv(GLint location, GLsizei count, const
inline void QOpenGLFunctions::glUniform2f(GLint location, GLfloat x, GLfloat y)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform2f(location, x, y);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1903,7 +1903,7 @@ inline void QOpenGLFunctions::glUniform2f(GLint location, GLfloat x, GLfloat y)
inline void QOpenGLFunctions::glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform2fv(location, count, v);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1914,7 +1914,7 @@ inline void QOpenGLFunctions::glUniform2fv(GLint location, GLsizei count, const
inline void QOpenGLFunctions::glUniform2i(GLint location, GLint x, GLint y)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform2i(location, x, y);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1925,7 +1925,7 @@ inline void QOpenGLFunctions::glUniform2i(GLint location, GLint x, GLint y)
inline void QOpenGLFunctions::glUniform2iv(GLint location, GLsizei count, const GLint* v)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform2iv(location, count, v);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1936,7 +1936,7 @@ inline void QOpenGLFunctions::glUniform2iv(GLint location, GLsizei count, const
inline void QOpenGLFunctions::glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform3f(location, x, y, z);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1947,7 +1947,7 @@ inline void QOpenGLFunctions::glUniform3f(GLint location, GLfloat x, GLfloat y,
inline void QOpenGLFunctions::glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform3fv(location, count, v);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1958,7 +1958,7 @@ inline void QOpenGLFunctions::glUniform3fv(GLint location, GLsizei count, const
inline void QOpenGLFunctions::glUniform3i(GLint location, GLint x, GLint y, GLint z)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform3i(location, x, y, z);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1969,7 +1969,7 @@ inline void QOpenGLFunctions::glUniform3i(GLint location, GLint x, GLint y, GLin
inline void QOpenGLFunctions::glUniform3iv(GLint location, GLsizei count, const GLint* v)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform3iv(location, count, v);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1980,7 +1980,7 @@ inline void QOpenGLFunctions::glUniform3iv(GLint location, GLsizei count, const
inline void QOpenGLFunctions::glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform4f(location, x, y, z, w);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -1991,7 +1991,7 @@ inline void QOpenGLFunctions::glUniform4f(GLint location, GLfloat x, GLfloat y,
inline void QOpenGLFunctions::glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform4fv(location, count, v);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2002,7 +2002,7 @@ inline void QOpenGLFunctions::glUniform4fv(GLint location, GLsizei count, const
inline void QOpenGLFunctions::glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform4i(location, x, y, z, w);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2013,7 +2013,7 @@ inline void QOpenGLFunctions::glUniform4i(GLint location, GLint x, GLint y, GLin
inline void QOpenGLFunctions::glUniform4iv(GLint location, GLsizei count, const GLint* v)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniform4iv(location, count, v);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2024,7 +2024,7 @@ inline void QOpenGLFunctions::glUniform4iv(GLint location, GLsizei count, const
inline void QOpenGLFunctions::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniformMatrix2fv(location, count, transpose, value);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2035,7 +2035,7 @@ inline void QOpenGLFunctions::glUniformMatrix2fv(GLint location, GLsizei count,
inline void QOpenGLFunctions::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniformMatrix3fv(location, count, transpose, value);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2046,7 +2046,7 @@ inline void QOpenGLFunctions::glUniformMatrix3fv(GLint location, GLsizei count,
inline void QOpenGLFunctions::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUniformMatrix4fv(location, count, transpose, value);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2057,7 +2057,7 @@ inline void QOpenGLFunctions::glUniformMatrix4fv(GLint location, GLsizei count,
inline void QOpenGLFunctions::glUseProgram(GLuint program)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glUseProgram(program);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2068,7 +2068,7 @@ inline void QOpenGLFunctions::glUseProgram(GLuint program)
inline void QOpenGLFunctions::glValidateProgram(GLuint program)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glValidateProgram(program);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2079,7 +2079,7 @@ inline void QOpenGLFunctions::glValidateProgram(GLuint program)
inline void QOpenGLFunctions::glVertexAttrib1f(GLuint indx, GLfloat x)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glVertexAttrib1f(indx, x);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2090,7 +2090,7 @@ inline void QOpenGLFunctions::glVertexAttrib1f(GLuint indx, GLfloat x)
inline void QOpenGLFunctions::glVertexAttrib1fv(GLuint indx, const GLfloat* values)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glVertexAttrib1fv(indx, values);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2101,7 +2101,7 @@ inline void QOpenGLFunctions::glVertexAttrib1fv(GLuint indx, const GLfloat* valu
inline void QOpenGLFunctions::glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glVertexAttrib2f(indx, x, y);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2112,7 +2112,7 @@ inline void QOpenGLFunctions::glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y
inline void QOpenGLFunctions::glVertexAttrib2fv(GLuint indx, const GLfloat* values)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glVertexAttrib2fv(indx, values);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2123,7 +2123,7 @@ inline void QOpenGLFunctions::glVertexAttrib2fv(GLuint indx, const GLfloat* valu
inline void QOpenGLFunctions::glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glVertexAttrib3f(indx, x, y, z);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2134,7 +2134,7 @@ inline void QOpenGLFunctions::glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y
inline void QOpenGLFunctions::glVertexAttrib3fv(GLuint indx, const GLfloat* values)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glVertexAttrib3fv(indx, values);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2145,7 +2145,7 @@ inline void QOpenGLFunctions::glVertexAttrib3fv(GLuint indx, const GLfloat* valu
inline void QOpenGLFunctions::glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glVertexAttrib4f(indx, x, y, z, w);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2156,7 +2156,7 @@ inline void QOpenGLFunctions::glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y
inline void QOpenGLFunctions::glVertexAttrib4fv(GLuint indx, const GLfloat* values)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glVertexAttrib4fv(indx, values);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
@@ -2167,7 +2167,7 @@ inline void QOpenGLFunctions::glVertexAttrib4fv(GLuint indx, const GLfloat* valu
inline void QOpenGLFunctions::glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
{
-#if defined(QT_OPENGL_ES_2) && defined(Q_OS_ANDROID)
+#if QT_CONFIG(opengles2) && defined(Q_OS_ANDROID)
::glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
#else
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
diff --git a/src/gui/opengl/qopenglfunctions_1_0.cpp b/src/gui/opengl/qopenglfunctions_1_0.cpp
deleted file mode 100644
index f9d93ce210..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_0.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_1_0.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_1_0
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_1_0 class provides all functions for OpenGL 1.0 specification.
-
- This class is a wrapper for functions from OpenGL 1.0 specification.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_1_0::QOpenGLFunctions_1_0()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_1_0::~QOpenGLFunctions_1_0()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_1_0::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_1_0::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_1_0::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(1, 0))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_1_0::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(1, 0);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_1_0.h b/src/gui/opengl/qopenglfunctions_1_0.h
deleted file mode 100644
index cddb7251ed..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_0.h
+++ /dev/null
@@ -1,1929 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_1_0_H
-#define QOPENGLVERSIONFUNCTIONS_1_0_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_1_0 : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_1_0();
- ~QOpenGLFunctions_1_0();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_1_0::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_0::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_1_0::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_1_0::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_1_0::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_1_0::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_1_0::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_1_0::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_0::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_0::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_1_0::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_1_0::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_1_0::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_1_0::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_1_0::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_1_0::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_1_0::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_1_0::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_1_0::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_1_0::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_0::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_1_0::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_1_0::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_1_0::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_0::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_1_0::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_0::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_0::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_0::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_0::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_1_0::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_1_0::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_1_0::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_1_0::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_1_0::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_1_0::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_1_0::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_1_0::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_1_0::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_0::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_0::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_1_0::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_0::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_0::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_1_0::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_1_0::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_1_0::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_0::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_1_0::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_1_0::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_1_0::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_0::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_0::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_0::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_0::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_0::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_1_0::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_0::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_0::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_0::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_1_0::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_1_0::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_1_0::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_0::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_0::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_0::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_0::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_0::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_0::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_0::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_0::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_1_0::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_1_0::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_1_0::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_1_0::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_1_0::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_0::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_1_0::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_1_0::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_1_0::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_1_0::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_1_0::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_1_0::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_1_0::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_1_0::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_1_0::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_0::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_1_0::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_0::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_0::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_1_0::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_1_0::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_0::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_0::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_0::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_0::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_0::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_0::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_0::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_0::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_0::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_0::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_0::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_0::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_0::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_1_0::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_1_0::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_1_0::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_1_0::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_1_0::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_1_0::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_1_0::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_1_0::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_1_0::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_1_0::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_1_0::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_0::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_1_0::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_1_0::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_1_0::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_1_0::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_1_0::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_1_0::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_1_0::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_1_0::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_1_1.cpp b/src/gui/opengl/qopenglfunctions_1_1.cpp
deleted file mode 100644
index b0f7538d48..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_1.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_1_1.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_1_1
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_1_1 class provides all functions for OpenGL 1.1 specification.
-
- This class is a wrapper for functions from OpenGL 1.1 specification.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_1_1::QOpenGLFunctions_1_1()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_1_1::~QOpenGLFunctions_1_1()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_1_1::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_1_1::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_1_1::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(1, 1))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_1_1::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(1, 1);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_1_1.h b/src/gui/opengl/qopenglfunctions_1_1.h
deleted file mode 100644
index 8a9f16ec4c..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_1.h
+++ /dev/null
@@ -1,2119 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_1_1_H
-#define QOPENGLVERSIONFUNCTIONS_1_1_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_1_1 : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_1_1();
- ~QOpenGLFunctions_1_1();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_1_1::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_1::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_1_1::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_1_1::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_1_1::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_1_1::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_1_1::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_1_1::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_1::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_1::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_1_1::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_1_1::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_1_1::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_1_1::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_1_1::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_1_1::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_1_1::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_1_1::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_1_1::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_1_1::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_1::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_1_1::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_1_1::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_1_1::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_1::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_1_1::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_1::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_1::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_1::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_1::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_1_1::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_1_1::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_1_1::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_1_1::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_1_1::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_1_1::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_1_1::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_1_1::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_1_1::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_1_1::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_1_1::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_1_1::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_1::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_1::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_1::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_1::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_1_1::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_1_1::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_1_1::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_1_1::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_1_1::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_1_1::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_1_1::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_1_1::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_1::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_1::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_1_1::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_1::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_1::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_1_1::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_1_1::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_1_1::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_1::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_1_1::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_1_1::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_1_1::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_1::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_1::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_1::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_1::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_1::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_1_1::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_1::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_1::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_1::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_1_1::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_1_1::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_1_1::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_1::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_1::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_1::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_1::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_1::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_1::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_1::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_1::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_1_1::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_1_1::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_1_1::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_1_1::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_1_1::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_1::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_1_1::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_1_1::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_1_1::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_1_1::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_1_1::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_1_1::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_1_1::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_1_1::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_1_1::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_1::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_1_1::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_1::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_1::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_1_1::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_1_1::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_1::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_1::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_1::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_1::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_1::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_1::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_1::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_1::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_1::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_1::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_1::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_1::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_1::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_1_1::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_1_1::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_1_1::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_1_1::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_1_1::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_1_1::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_1_1::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_1_1::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_1_1::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_1_1::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_1_1::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_1::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_1_1::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_1_1::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_1_1::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_1_1::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_1_1::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_1_1::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_1_1::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_1_1::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_1_1::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_1_1::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_1_1::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_1_1::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_1_1::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_1::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_1::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_1::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_1::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_1::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_1_1::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_1::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_1_1::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_1::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_1_2.cpp b/src/gui/opengl/qopenglfunctions_1_2.cpp
deleted file mode 100644
index 5f137b0237..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_2.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_1_2.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_1_2
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_1_2 class provides all functions for OpenGL 1.2 specification.
-
- This class is a wrapper for functions from OpenGL 1.2 specification.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_1_2::QOpenGLFunctions_1_2()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_1_2::~QOpenGLFunctions_1_2()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_1_2::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_1_2::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_1_2::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(1, 2))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_1_2::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(1, 2);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_1_2.h b/src/gui/opengl/qopenglfunctions_1_2.h
deleted file mode 100644
index 7daca0923d..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_2.h
+++ /dev/null
@@ -1,2357 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_1_2_H
-#define QOPENGLVERSIONFUNCTIONS_1_2_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_1_2 : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_1_2();
- ~QOpenGLFunctions_1_2();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_1_2::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_2::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_1_2::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_1_2::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_1_2::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_1_2::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_1_2::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_1_2::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_2::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_2::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_1_2::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_1_2::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_1_2::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_1_2::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_1_2::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_1_2::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_1_2::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_1_2::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_1_2::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_1_2::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_2::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_1_2::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_1_2::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_1_2::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_2::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_1_2::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_2::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_2::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_2::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_2::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_1_2::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_1_2::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_1_2::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_1_2::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_1_2::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_1_2::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_1_2::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_1_2::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_1_2::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_1_2::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_1_2::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_1_2::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_2::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_2::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_2::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_2::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_1_2::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_1_2::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_1_2::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_1_2::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_1_2::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_2::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_2::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_2::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_1_2::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_1_2::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_1_2::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_1_2::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_1_2::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_1_2::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_2::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_2::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_1_2::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_2::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_2::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_1_2::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_1_2::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_1_2::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_2::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_1_2::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_1_2::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_1_2::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_2::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_2::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_2::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_2::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_2::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_1_2::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_2::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_2::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_2::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_1_2::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_1_2::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_1_2::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_2::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_2::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_2::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_2::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_2::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_2::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_2::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_2::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_1_2::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_1_2::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_1_2::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_1_2::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_1_2::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_2::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_1_2::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_1_2::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_1_2::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_1_2::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_1_2::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_1_2::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_1_2::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_1_2::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_1_2::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_2::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_1_2::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_2::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_1_2::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_1_2::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_2::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_2::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_2::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_2::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_2::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_2::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_2::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_2::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_2::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_2::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_2::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_2::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_2::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_1_2::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_1_2::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_1_2::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_1_2::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_1_2::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_1_2::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_1_2::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_1_2::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_1_2::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_1_2::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_1_2::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_2::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_1_2::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_1_2::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_1_2::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_1_2::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_1_2::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_1_2::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_1_2::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_1_2::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_1_2::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_1_2::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_1_2::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_1_2::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_1_2::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_2::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_2::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_2::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_2::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_2::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_1_2::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_2::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_1_2::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_2::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_1_2::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_1_2::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_1_2::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_1_2::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_1_2::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_1_2::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_1_2::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_1_2::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_1_2::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_2::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_2::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_2::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_2::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_2::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_2::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_1_2::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_1_2::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_2::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_2::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_1_3.cpp b/src/gui/opengl/qopenglfunctions_1_3.cpp
deleted file mode 100644
index 0b5ff2fee5..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_3.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_1_3.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_1_3
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_1_3 class provides all functions for OpenGL 1.3 specification.
-
- This class is a wrapper for functions from OpenGL 1.3 specification.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_1_3::QOpenGLFunctions_1_3()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_1_3::~QOpenGLFunctions_1_3()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_1_3::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_1_3::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_1_3::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(1, 3))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_1_3::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(1, 3);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_1_3.h b/src/gui/opengl/qopenglfunctions_1_3.h
deleted file mode 100644
index b527b57946..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_3.h
+++ /dev/null
@@ -1,2643 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_1_3_H
-#define QOPENGLVERSIONFUNCTIONS_1_3_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_1_3 : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_1_3();
- ~QOpenGLFunctions_1_3();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_1_3::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_3::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_1_3::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_1_3::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_1_3::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_1_3::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_1_3::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_1_3::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_3::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_3::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_1_3::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_1_3::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_1_3::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_1_3::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_1_3::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_1_3::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_1_3::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_1_3::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_1_3::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_1_3::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_3::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_1_3::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_1_3::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_1_3::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_3::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_1_3::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_3::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_3::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_3::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_3::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_1_3::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_1_3::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_1_3::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_1_3::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_1_3::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_1_3::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_1_3::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_1_3::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_1_3::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_1_3::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_1_3::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_1_3::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_3::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_3::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_3::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_3::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_1_3::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_1_3::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_1_3::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_1_3::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_1_3::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_3::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_3::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_3::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_1_3::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_1_3::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_1_3::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_1_3::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_3::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_3::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_3::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_3::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_3::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_3::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_1_3::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_1_3::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_1_3::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_1_3::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_1_3::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_3::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_3::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_1_3::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_3::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_3::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_1_3::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_1_3::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_1_3::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_3::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_1_3::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_1_3::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_1_3::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_3::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_3::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_3::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_3::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_3::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_1_3::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_3::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_3::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_3::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_1_3::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_1_3::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_1_3::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_3::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_3::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_3::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_3::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_3::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_3::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_3::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_3::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_1_3::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_1_3::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_1_3::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_1_3::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_1_3::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_3::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_1_3::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_1_3::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_1_3::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_1_3::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_1_3::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_1_3::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_1_3::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_1_3::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_1_3::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_3::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_1_3::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_3::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_1_3::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_1_3::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_3::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_3::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_3::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_3::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_3::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_3::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_3::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_3::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_3::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_3::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_3::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_3::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_3::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_1_3::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_1_3::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_1_3::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_1_3::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_1_3::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_1_3::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_1_3::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_1_3::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_1_3::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_1_3::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_1_3::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_3::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_1_3::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_1_3::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_1_3::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_1_3::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_1_3::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_1_3::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_1_3::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_1_3::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_1_3::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_1_3::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_1_3::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_1_3::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_1_3::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_3::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_3::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_3::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_3::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_3::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_1_3::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_3::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_1_3::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_3::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_1_3::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_1_3::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_1_3::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_1_3::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_1_3::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_1_3::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_1_3::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_1_3::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_1_3::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_3::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_3::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_3::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_3::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_3::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_3::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_1_3::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_1_3::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_3::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_3::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_1_3::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_3::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_3::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_3::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_3::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_1_3::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_1_4.cpp b/src/gui/opengl/qopenglfunctions_1_4.cpp
deleted file mode 100644
index 9419c1aa85..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_4.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_1_4.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_1_4
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_1_4 class provides all functions for OpenGL 1.4 specification.
-
- This class is a wrapper for functions from OpenGL 1.4 specification.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_1_4::QOpenGLFunctions_1_4()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_1_4::~QOpenGLFunctions_1_4()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_1_4::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_1_4::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_1_4::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(1, 4))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_1_4::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(1, 4);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_1_4.h b/src/gui/opengl/qopenglfunctions_1_4.h
deleted file mode 100644
index 1f3f5a9c0a..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_4.h
+++ /dev/null
@@ -1,2923 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_1_4_H
-#define QOPENGLVERSIONFUNCTIONS_1_4_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_1_4 : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_1_4();
- ~QOpenGLFunctions_1_4();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_1_4::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_4::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_1_4::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_1_4::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_1_4::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_1_4::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_1_4::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_1_4::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_4::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_4::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_1_4::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_1_4::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_1_4::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_1_4::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_1_4::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_1_4::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_1_4::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_1_4::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_1_4::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_1_4::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_4::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_1_4::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_1_4::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_1_4::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_4::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_1_4::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_4::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_4::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_4::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_4::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_1_4::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_1_4::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_1_4::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_1_4::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_1_4::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_1_4::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_1_4::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_1_4::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_1_4::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_1_4::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_1_4::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_1_4::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_4::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_4::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_4::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_4::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_1_4::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_1_4::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_1_4::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_1_4::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_1_4::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_4::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_4::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_4::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_1_4::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_1_4::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_1_4::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_1_4::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_4::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_4::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_4::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_4::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_4::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_4::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_1_4::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_1_4::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_1_4::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_1_4::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_1_4::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_1_4::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_1_4::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_4::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_4::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_1_4::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_4::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_4::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_1_4::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_1_4::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_1_4::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_4::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_1_4::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_1_4::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_1_4::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_4::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_4::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_4::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_4::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_4::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_1_4::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_4::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_4::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_4::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_1_4::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_1_4::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_1_4::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_4::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_4::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_4::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_4::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_4::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_4::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_4::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_4::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_1_4::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_1_4::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_1_4::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_1_4::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_1_4::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_4::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_1_4::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_1_4::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_1_4::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_1_4::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_1_4::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_1_4::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_1_4::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_1_4::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_1_4::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_4::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_1_4::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_4::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_1_4::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_1_4::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_4::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_4::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_4::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_4::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_4::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_4::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_4::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_4::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_4::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_4::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_4::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_4::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_1_4::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_1_4::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_1_4::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_1_4::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_1_4::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_1_4::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_1_4::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_1_4::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_1_4::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_1_4::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_1_4::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_1_4::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_1_4::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_1_4::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_1_4::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_1_4::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_1_4::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_1_4::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_1_4::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_1_4::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_1_4::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_1_4::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_1_4::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_4::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_4::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_4::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_4::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_4::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_1_4::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_4::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_1_4::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_4::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_1_4::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_1_4::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_1_4::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_1_4::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_1_4::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_1_4::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_1_4::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_1_4::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_1_4::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_4::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_4::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_4::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_4::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_4::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_4::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_1_4::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_1_4::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_4::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_4::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_1_4::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_4::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_4::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_4::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_4::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_1_4::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_1_4::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_1_4::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_4::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_4::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_1_4::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_1_4::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_1_4::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_1_5.cpp b/src/gui/opengl/qopenglfunctions_1_5.cpp
deleted file mode 100644
index 3fa7668a36..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_5.cpp
+++ /dev/null
@@ -1,217 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_1_5.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_1_5
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_1_5 class provides all functions for OpenGL 1.5 specification.
-
- This class is a wrapper for functions from OpenGL 1.5 specification.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_1_5::QOpenGLFunctions_1_5()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_1_5::~QOpenGLFunctions_1_5()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_1_5::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_1_5::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_1_5::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(1, 5))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_1_5::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(1, 5);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_1_5.h b/src/gui/opengl/qopenglfunctions_1_5.h
deleted file mode 100644
index d2f5311211..0000000000
--- a/src/gui/opengl/qopenglfunctions_1_5.h
+++ /dev/null
@@ -1,3046 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_1_5_H
-#define QOPENGLVERSIONFUNCTIONS_1_5_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_1_5 : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_1_5();
- ~QOpenGLFunctions_1_5();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_1_5::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_5::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_1_5::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_1_5::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_1_5::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_1_5::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_1_5::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_1_5::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_5::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_5::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_1_5::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_1_5::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_1_5::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_1_5::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_1_5::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_1_5::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_1_5::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_1_5::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_1_5::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_1_5::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_5::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_1_5::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_1_5::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_1_5::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_5::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_1_5::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_1_5::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_5::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_5::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_5::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_1_5::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_1_5::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_1_5::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_1_5::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_1_5::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_1_5::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_1_5::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_1_5::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_1_5::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_1_5::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_1_5::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_1_5::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_5::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_5::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_5::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_5::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_1_5::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_1_5::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_1_5::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_1_5::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_1_5::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_5::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_5::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_5::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_1_5::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_1_5::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_1_5::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_1_5::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_5::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_5::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_5::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_5::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_5::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_1_5::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_1_5::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_1_5::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_1_5::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_1_5::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_1_5::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_1_5::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_1_5::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_1_5::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_1_5::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_1_5::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_1_5::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_1_5::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_1_5::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_1_5::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_1_5::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_1_5::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_1_5::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_1_5::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_1_5::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_1_5::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_1_5::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_1_5::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_5::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_5::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_1_5::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_5::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_5::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_1_5::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_1_5::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_1_5::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_5::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_1_5::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_1_5::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_1_5::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_5::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_5::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_1_5::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_5::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_1_5::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_1_5::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_5::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_5::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_1_5::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_1_5::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_1_5::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_1_5::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_5::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_1_5::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_5::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_1_5::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_5::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_1_5::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_5::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_1_5::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_1_5::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_1_5::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_1_5::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_1_5::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_1_5::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_5::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_1_5::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_1_5::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_1_5::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_1_5::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_1_5::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_1_5::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_1_5::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_1_5::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_1_5::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_1_5::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_1_5::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_1_5::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_1_5::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_1_5::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_5::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_5::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_5::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_5::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_5::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_5::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_1_5::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_5::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_5::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_5::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_5::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_1_5::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_1_5::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_1_5::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_1_5::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_1_5::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_1_5::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_1_5::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_1_5::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_1_5::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_1_5::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_1_5::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_1_5::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_1_5::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_1_5::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_1_5::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_1_5::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_1_5::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_1_5::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_1_5::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_1_5::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_1_5::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_1_5::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_1_5::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_1_5::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_5::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_5::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_5::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_5::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_5::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_1_5::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_5::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_1_5::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_5::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_1_5::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_1_5::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_1_5::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_1_5::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_1_5::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_1_5::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_1_5::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_1_5::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_1_5::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_5::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_1_5::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_5::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_5::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_1_5::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_5::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_1_5::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_1_5::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_1_5::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_1_5::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_1_5::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_5::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_5::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_1_5::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_1_5::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_1_5::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_1_5::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_1_5::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_1_5::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_1_5::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_1_5::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_1_5::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_1_5::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_2_0.cpp b/src/gui/opengl/qopenglfunctions_2_0.cpp
deleted file mode 100644
index 29eb055a1d..0000000000
--- a/src/gui/opengl/qopenglfunctions_2_0.cpp
+++ /dev/null
@@ -1,227 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_2_0.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_2_0
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_2_0 class provides all functions for OpenGL 2.0 specification.
-
- This class is a wrapper for functions from OpenGL 2.0 specification.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_2_0::QOpenGLFunctions_2_0()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
- , m_reserved_2_0_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_2_0::~QOpenGLFunctions_2_0()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_2_0::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_2_0::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_2_0::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(2, 0))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_2_0::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(2, 0);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_2_0.h b/src/gui/opengl/qopenglfunctions_2_0.h
deleted file mode 100644
index 556597a9b3..0000000000
--- a/src/gui/opengl/qopenglfunctions_2_0.h
+++ /dev/null
@@ -1,3614 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_2_0_H
-#define QOPENGLVERSIONFUNCTIONS_2_0_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_2_0 : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_2_0();
- ~QOpenGLFunctions_2_0();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
- // OpenGL 2.0 deprecated functions
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
- void *m_reserved_2_0_Deprecated; // To maintain BC
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_2_0::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_2_0::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_2_0::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_2_0::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_2_0::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_2_0::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_2_0::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_2_0::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_0::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_2_0::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_2_0::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_2_0::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_2_0::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_2_0::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_2_0::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_2_0::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_2_0::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_2_0::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_2_0::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_2_0::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_0::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_2_0::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_2_0::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_2_0::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_0::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_2_0::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_2_0::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_0::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_0::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_2_0::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_2_0::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_2_0::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_2_0::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_2_0::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_2_0::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_2_0::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_2_0::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_2_0::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_2_0::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_2_0::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_2_0::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_2_0::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_0::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_0::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_2_0::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_2_0::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_2_0::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_2_0::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_2_0::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_2_0::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_2_0::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_2_0::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_0::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_0::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_2_0::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_2_0::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_2_0::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_2_0::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_0::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_0::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_0::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_0::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_0::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_0::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_2_0::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_2_0::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_2_0::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_2_0::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_2_0::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_2_0::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_2_0::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_2_0::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_2_0::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_2_0::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_2_0::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_2_0::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_2_0::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_2_0::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_2_0::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_2_0::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_2_0::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_2_0::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_2_0::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_0::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_2_0::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_2_0::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_2_0::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_2_0::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_2_0::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_2_0::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_2_0::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_2_0::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_2_0::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_2_0::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_2_0::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_2_0::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_2_0::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_2_0::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_2_0::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_2_0::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_2_0::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_2_0::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_2_0::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_2_0::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_2_0::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_2_0::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_2_0::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_2_0::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_2_0::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_2_0::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_2_0::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_2_0::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_2_0::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_2_0::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_2_0::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_2_0::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_2_0::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_2_0::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_2_0::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_2_0::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_2_0::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_2_0::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_2_0::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_2_0::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_2_0::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_2_0::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_2_0::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_2_0::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_2_0::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_2_0::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_2_0::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_2_0::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_2_0::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_2_0::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_2_0::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_2_0::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_2_0::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_2_0::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_2_0::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_0::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_2_0::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_2_0::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_2_0::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_2_0::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_2_0::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_2_0::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_2_0::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_2_0::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_2_0::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_2_0::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_2_0::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_2_0::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_2_0::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_2_0::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_2_0::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_2_0::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_2_0::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_2_0::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_2_0::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_2_0::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_0::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_2_0::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_2_0::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_2_0::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_2_0::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_2_0::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_2_0::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_2_0::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_2_0::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_2_0::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_2_0::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_2_0::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_2_0::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_2_0::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_2_0::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_2_0::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_2_0::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_2_0::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_2_0::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_2_0::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_2_0::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_2_0::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_2_0::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_2_0::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_2_0::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_2_0::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_2_0::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_2_0::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_2_0::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_2_0::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_2_0::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_2_0::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_2_0::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_2_0::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_2_0::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_2_0::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_2_0::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_2_0::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_2_0::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_2_0::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_2_0::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_2_0::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_2_0::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_2_0::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_2_0::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_2_0::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_2_0::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_2_0::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_2_0::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_0::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_0::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_0::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_0::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_0::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_2_0::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_0::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_2_0::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_0::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_2_0::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_2_0::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_2_0::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_2_0::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_2_0::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_2_0::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_2_0::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_2_0::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_2_0::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_2_0::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_2_0::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_2_0::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_2_0::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_2_0::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_2_0::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_2_0::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_2_0::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_2_0::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_0::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_2_0::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_2_0::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_2_0::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_2_0::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_2_0::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_2_0::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_2_0::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_2_0::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_0::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_0::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_2_0::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_2_0::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_2_0::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-// OpenGL 2.0 deprecated functions
-inline void QOpenGLFunctions_2_0::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_2_0::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_2_1.cpp b/src/gui/opengl/qopenglfunctions_2_1.cpp
deleted file mode 100644
index 8a7170dd7d..0000000000
--- a/src/gui/opengl/qopenglfunctions_2_1.cpp
+++ /dev/null
@@ -1,236 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_2_1.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_2_1
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_2_1 class provides all functions for OpenGL 2.1 specification.
-
- This class is a wrapper for functions from OpenGL 2.1 specification.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_2_1::QOpenGLFunctions_2_1()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
- , m_reserved_2_0_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_2_1::~QOpenGLFunctions_2_1()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_2_1::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_2_1::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_2_1::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(2, 1))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_2_1::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(2, 1);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_2_1.h b/src/gui/opengl/qopenglfunctions_2_1.h
deleted file mode 100644
index f053222c71..0000000000
--- a/src/gui/opengl/qopenglfunctions_2_1.h
+++ /dev/null
@@ -1,3659 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_2_1_H
-#define QOPENGLVERSIONFUNCTIONS_2_1_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_2_1 : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_2_1();
- ~QOpenGLFunctions_2_1();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
- // OpenGL 2.0 deprecated functions
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
-
- // OpenGL 2.1 deprecated functions
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
- void *m_reserved_2_0_Deprecated; // To maintain BC
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_2_1::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_2_1::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_2_1::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_2_1::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_2_1::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_2_1::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_2_1::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_2_1::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_1::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_2_1::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_2_1::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_2_1::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_2_1::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_2_1::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_2_1::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_2_1::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_2_1::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_2_1::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_2_1::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_2_1::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_1::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_2_1::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_2_1::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_2_1::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_1::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_2_1::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_2_1::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_1::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_1::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_2_1::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_2_1::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_2_1::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_2_1::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_2_1::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_2_1::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_2_1::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_2_1::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_2_1::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_2_1::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_2_1::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_2_1::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_2_1::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_1::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_1::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_2_1::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_2_1::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_2_1::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_2_1::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_2_1::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_2_1::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_2_1::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_2_1::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_1::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_1::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_2_1::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_2_1::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_2_1::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_2_1::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_1::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_1::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_1::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_1::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_1::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_2_1::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_2_1::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_2_1::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_2_1::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_2_1::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_2_1::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_2_1::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_2_1::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_2_1::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_2_1::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_2_1::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_2_1::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_2_1::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_2_1::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_2_1::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_2_1::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_2_1::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_2_1::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_2_1::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_2_1::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_1::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_2_1::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_2_1::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_2_1::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_2_1::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_2_1::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_2_1::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_2_1::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_2_1::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_2_1::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_2_1::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_2_1::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_2_1::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_2_1::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_2_1::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_2_1::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_2_1::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_2_1::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_2_1::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_2_1::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_2_1::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_2_1::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_2_1::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_2_1::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_2_1::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_2_1::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_2_1::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_2_1::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_2_1::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_2_1::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_2_1::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_2_1::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_2_1::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_2_1::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_2_1::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_2_1::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_2_1::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_2_1::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_2_1::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_2_1::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_2_1::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_2_1::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_2_1::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_2_1::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_2_1::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_2_1::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_2_1::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_2_1::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_2_1::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_2_1::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_2_1::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_2_1::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_2_1::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_2_1::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_2_1::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_2_1::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_2_1::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_2_1::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_2_1::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_2_1::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_2_1::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_2_1::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_2_1::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_2_1::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_2_1::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_2_1::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_2_1::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_2_1::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_2_1::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_2_1::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_2_1::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_2_1::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_2_1::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_2_1::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_2_1::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_2_1::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_2_1::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_1::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_2_1::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_2_1::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_2_1::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_2_1::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_2_1::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_2_1::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_2_1::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_2_1::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_2_1::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_2_1::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_2_1::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_2_1::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_2_1::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_2_1::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_2_1::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_2_1::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_2_1::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_2_1::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_2_1::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_2_1::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_2_1::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_2_1::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_2_1::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_2_1::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_2_1::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_2_1::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_2_1::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_2_1::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_2_1::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_2_1::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_2_1::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_2_1::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_2_1::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_2_1::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_2_1::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_2_1::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_2_1::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_2_1::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_2_1::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_2_1::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_2_1::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_2_1::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_2_1::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_2_1::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_2_1::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_2_1::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_2_1::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_2_1::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_1::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_1::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_1::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_1::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_1::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_2_1::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_1::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_2_1::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_1::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_2_1::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_2_1::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_2_1::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_2_1::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_2_1::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_2_1::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_2_1::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_2_1::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_2_1::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_2_1::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_2_1::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_2_1::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_2_1::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_2_1::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_2_1::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_2_1::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_2_1::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_2_1::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_2_1::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_2_1::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_2_1::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_2_1::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_2_1::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_2_1::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_2_1::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_2_1::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_2_1::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_2_1::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_2_1::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_2_1::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_2_1::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_2_1::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-// OpenGL 2.0 deprecated functions
-inline void QOpenGLFunctions_2_1::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_2_1::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-
-// OpenGL 2.1 deprecated functions
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_3_0.cpp b/src/gui/opengl/qopenglfunctions_3_0.cpp
deleted file mode 100644
index 7d0e900659..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_0.cpp
+++ /dev/null
@@ -1,246 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_3_0.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_3_0
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_3_0 class provides all functions for OpenGL 3.0 specification.
-
- This class is a wrapper for functions from OpenGL 3.0 specification.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_3_0::QOpenGLFunctions_3_0()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
- , m_reserved_2_0_Deprecated(nullptr)
- , m_reserved_3_0_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_3_0::~QOpenGLFunctions_3_0()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_3_0::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_3_0::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_3_0::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(3, 0))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_3_0::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(3, 0);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_3_0.h b/src/gui/opengl/qopenglfunctions_3_0.h
deleted file mode 100644
index c592050c24..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_0.h
+++ /dev/null
@@ -1,4173 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_3_0_H
-#define QOPENGLVERSIONFUNCTIONS_3_0_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_3_0 : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_3_0();
- ~QOpenGLFunctions_3_0();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
- // OpenGL 2.0 deprecated functions
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
-
- // OpenGL 2.1 deprecated functions
-
- // OpenGL 3.0 deprecated functions
- void glVertexAttribI4usv(GLuint index, const GLushort *v);
- void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
- void glVertexAttribI4sv(GLuint index, const GLshort *v);
- void glVertexAttribI4bv(GLuint index, const GLbyte *v);
- void glVertexAttribI4uiv(GLuint index, const GLuint *v);
- void glVertexAttribI3uiv(GLuint index, const GLuint *v);
- void glVertexAttribI2uiv(GLuint index, const GLuint *v);
- void glVertexAttribI1uiv(GLuint index, const GLuint *v);
- void glVertexAttribI4iv(GLuint index, const GLint *v);
- void glVertexAttribI3iv(GLuint index, const GLint *v);
- void glVertexAttribI2iv(GLuint index, const GLint *v);
- void glVertexAttribI1iv(GLuint index, const GLint *v);
- void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
- void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
- void glVertexAttribI1ui(GLuint index, GLuint x);
- void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
- void glVertexAttribI2i(GLuint index, GLint x, GLint y);
- void glVertexAttribI1i(GLuint index, GLint x);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
- void *m_reserved_2_0_Deprecated; // To maintain BC
- void *m_reserved_3_0_Deprecated; // To maintain BC
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_3_0::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_0::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_0::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_3_0::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_3_0::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_3_0::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_0::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_0::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_3_0::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_3_0::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_0::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_3_0::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_3_0::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_3_0::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_3_0::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_3_0::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_3_0::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_3_0::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_0::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_3_0::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_3_0::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_3_0::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_0::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_3_0::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_0::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_0::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_0::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_0::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_3_0::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_3_0::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_3_0::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_3_0::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_3_0::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_3_0::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_3_0::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_3_0::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_0::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_0::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_3_0::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_0::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_0::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_0::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_0::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_3_0::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_3_0::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_3_0::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_0::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_3_0::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_0::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_0::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_0::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_0::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_3_0::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_3_0::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_3_0::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_0::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_0::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_0::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_0::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_0::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_0::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_3_0::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_3_0::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_3_0::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_3_0::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_3_0::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_3_0::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_0::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_0::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_3_0::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_0::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_0::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_3_0::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_3_0::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_3_0::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_3_0::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_3_0::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_3_0::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_3_0::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_3_0::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_3_0::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_3_0::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_3_0::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_0::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_3_0::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_0::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_0::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_3_0::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_0::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_3_0::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_0::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_0::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_0::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_0::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_0::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_3_0::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_3_0::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_3_0::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_3_0::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_3_0::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_3_0::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_0::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_3_0::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_0::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_3_0::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_3_0::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_3_0::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_3_0::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_0::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_0::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_0::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_0::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_3_0::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_3_0::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_3_0::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_0::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_3_0::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_3_0::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_3_0::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_3_0::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_3_0::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_3_0::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_3_0::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_0::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_0::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_3_0::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_0::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_0::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_0::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_0::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_3_0::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_3_0::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_0::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_0::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_0::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_3_0::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_0::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_3_0::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_3_0::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_3_0::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_0::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_3_0::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_3_0::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_3_0::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_3_0::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_3_0::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_0::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_0::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_0::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_0::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_3_0::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_3_0::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_3_0::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_3_0::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_0::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_0::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_3_0::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_0::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_0::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_3_0::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_3_0::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_3_0::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_3_0::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_3_0::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_3_0::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_3_0::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_3_0::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_3_0::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_0::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_3_0::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_3_0::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_3_0::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_3_0::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_3_0::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_3_0::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_3_0::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_0::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_0::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_3_0::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_3_0::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_3_0::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_3_0::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_3_0::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_3_0::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_3_0::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_3_0::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_3_0::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_3_0::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_3_0::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_0::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_3_0::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_3_0::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_3_0::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_3_0::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_3_0::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_3_0::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_3_0::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_3_0::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_3_0::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_3_0::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_3_0::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_0::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_3_0::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_3_0::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_0::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_0::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_0::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_0::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_0::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_0::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_0::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_0::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_0::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_0::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_0::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_0::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_3_0::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_3_0::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_3_0::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_3_0::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_3_0::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_3_0::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_3_0::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_3_0::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_3_0::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_3_0::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_3_0::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_3_0::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_3_0::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_3_0::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_3_0::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_3_0::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_3_0::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_3_0::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_3_0::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_3_0::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_3_0::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_3_0::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_3_0::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_3_0::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_3_0::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_3_0::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_3_0::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_3_0::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_3_0::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_3_0::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_3_0::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_3_0::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_3_0::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_3_0::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_0::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_0::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_3_0::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_3_0::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_0::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_3_0::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_3_0::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_0::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_0::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_3_0::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_0::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_0::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_0::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_0::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_3_0::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_3_0::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_3_0::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_0::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_0::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_3_0::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_3_0::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_3_0::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-// OpenGL 2.0 deprecated functions
-inline void QOpenGLFunctions_3_0::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-
-// OpenGL 2.1 deprecated functions
-
-// OpenGL 3.0 deprecated functions
-inline void QOpenGLFunctions_3_0::glVertexAttribI4usv(GLuint index, const GLushort *v)
-{
- d_3_0_Core->f.VertexAttribI4usv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
- d_3_0_Core->f.VertexAttribI4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI4sv(GLuint index, const GLshort *v)
-{
- d_3_0_Core->f.VertexAttribI4sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI4bv(GLuint index, const GLbyte *v)
-{
- d_3_0_Core->f.VertexAttribI4bv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI3uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI3uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI2uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI2uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI1uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI1uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI4iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI4iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI3iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI3iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI2iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI2iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI1iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI1iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
- d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
- d_3_0_Core->f.VertexAttribI2ui(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI1ui(GLuint index, GLuint x)
-{
- d_3_0_Core->f.VertexAttribI1ui(index, x);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
- d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI2i(GLuint index, GLint x, GLint y)
-{
- d_3_0_Core->f.VertexAttribI2i(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_0::glVertexAttribI1i(GLuint index, GLint x)
-{
- d_3_0_Core->f.VertexAttribI1i(index, x);
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_3_1.cpp b/src/gui/opengl/qopenglfunctions_3_1.cpp
deleted file mode 100644
index c25b124af8..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_1.cpp
+++ /dev/null
@@ -1,205 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_3_1.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_3_1
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_3_1 class provides all functions for OpenGL 3.1 specification.
-
- This class is a wrapper for functions from OpenGL 3.1 specification.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_3_1::QOpenGLFunctions_3_1()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
-{
-}
-
-QOpenGLFunctions_3_1::~QOpenGLFunctions_3_1()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_3_1::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_3_1::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_3_1::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(3, 1))
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_3_1::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(3, 1);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_3_1.h b/src/gui/opengl/qopenglfunctions_3_1.h
deleted file mode 100644
index 3a8d3891f3..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_1.h
+++ /dev/null
@@ -1,1601 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_3_1_H
-#define QOPENGLVERSIONFUNCTIONS_3_1_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_3_1 : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_3_1();
- ~QOpenGLFunctions_3_1();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_3_1::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_1::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_3_1::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_3_1::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_1::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_3_1::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_3_1::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_3_1::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_1::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_1::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_3_1::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_3_1::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_3_1::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_3_1::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_1::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_3_1::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_3_1::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_3_1::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_3_1::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_3_1::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_3_1::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_3_1::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_1::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_3_1::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_3_1::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_3_1::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_1::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_3_1::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_1::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_1::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_1::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_1::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_1::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_1::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_3_1::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_3_1::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_3_1::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_3_1::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_3_1::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_3_1::glIndexubv(const GLubyte *c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_1::glIndexub(GLubyte c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline GLboolean QOpenGLFunctions_3_1::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_3_1::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_1::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_1::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_3_1::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_1::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_1::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_1::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_1::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_3_1::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_3_1::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_3_1::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- Q_UNUSED(pname);
- Q_UNUSED(params);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_1::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_1::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_3_1::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_1::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_1::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_1::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_1::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_3_1::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_3_1::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_3_1::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_1::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_1::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_1::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_1::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_1::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_1::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_3_1::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_3_1::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_3_1::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_1::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_3_1::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_3_1::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_3_1::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_3_1::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_3_1::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_3_1::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_1::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_1::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_3_1::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_3_1::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_1::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_1::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_3_1::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_3_1::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_3_1::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_3_1::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_3_1::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_3_1::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_1::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_3_1::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_3_1::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_3_1::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_3_1::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_3_1::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_3_1::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_3_1::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_3_1::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_3_1::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_1::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_3_1::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_1::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_1::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_3_1::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_1::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_3_1::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_1::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_1::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_1::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_1::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_1::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_3_1::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_3_1::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_3_1::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_3_1::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_3_1::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_3_1::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_1::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_3_1::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_1::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_3_1::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_3_1::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_3_1::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_3_1::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_1::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_1::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_1::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_1::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_3_1::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_3_1::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_3_1::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_1::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_3_1::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_3_1::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_3_1::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_3_1::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_3_1::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_3_1::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_3_1::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_1::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_1::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_1::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_3_1::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_1::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_1::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_1::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_1::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_1::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_3_1::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_3_1::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_1::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_1::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_1::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_1::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_3_1::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_1::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_3_1::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_1::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_3_1::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_3_1::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_3_1::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_1::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_3_1::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_3_1::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_3_1::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_3_1::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_3_1::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_3_1::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_1::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_1::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_1::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_1::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_3_1::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_3_1::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_3_1::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_3_1::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_3_1::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_3_1::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_3_1::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_3_1::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_3_1::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_3_1::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_3_1::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_3_1::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_3_2_compatibility.cpp b/src/gui/opengl/qopenglfunctions_3_2_compatibility.cpp
deleted file mode 100644
index 3e4fd96dc2..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_2_compatibility.cpp
+++ /dev/null
@@ -1,265 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_3_2_compatibility.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_3_2_Compatibility
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_3_2_Compatibility class provides all functions for OpenGL 3.2 compatibility profile.
-
- This class is a wrapper for functions from OpenGL 3.2 compatibility profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_3_2_Compatibility::QOpenGLFunctions_3_2_Compatibility()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
- , m_reserved_2_0_Deprecated(nullptr)
- , m_reserved_3_0_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_3_2_Compatibility::~QOpenGLFunctions_3_2_Compatibility()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_3_2_Compatibility::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_3_2_Compatibility::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_3_2_Compatibility::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(3, 2))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_3_2_Compatibility::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(3, 2);
- v.setProfile(QSurfaceFormat::CompatibilityProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_3_2_compatibility.h b/src/gui/opengl/qopenglfunctions_3_2_compatibility.h
deleted file mode 100644
index 391e725953..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_2_compatibility.h
+++ /dev/null
@@ -1,4377 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_3_2_COMPATIBILITY_H
-#define QOPENGLVERSIONFUNCTIONS_3_2_COMPATIBILITY_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_3_2_Compatibility : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_3_2_Compatibility();
- ~QOpenGLFunctions_3_2_Compatibility();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
- // OpenGL 2.0 deprecated functions
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
-
- // OpenGL 2.1 deprecated functions
-
- // OpenGL 3.0 deprecated functions
- void glVertexAttribI4usv(GLuint index, const GLushort *v);
- void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
- void glVertexAttribI4sv(GLuint index, const GLshort *v);
- void glVertexAttribI4bv(GLuint index, const GLbyte *v);
- void glVertexAttribI4uiv(GLuint index, const GLuint *v);
- void glVertexAttribI3uiv(GLuint index, const GLuint *v);
- void glVertexAttribI2uiv(GLuint index, const GLuint *v);
- void glVertexAttribI1uiv(GLuint index, const GLuint *v);
- void glVertexAttribI4iv(GLuint index, const GLint *v);
- void glVertexAttribI3iv(GLuint index, const GLint *v);
- void glVertexAttribI2iv(GLuint index, const GLint *v);
- void glVertexAttribI1iv(GLuint index, const GLint *v);
- void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
- void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
- void glVertexAttribI1ui(GLuint index, GLuint x);
- void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
- void glVertexAttribI2i(GLuint index, GLint x, GLint y);
- void glVertexAttribI1i(GLuint index, GLint x);
-
- // OpenGL 3.1 deprecated functions
-
- // OpenGL 3.2 deprecated functions
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
- void *m_reserved_2_0_Deprecated; // To maintain BC
- void *m_reserved_3_0_Deprecated; // To maintain BC
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_3_2_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_2_Compatibility::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_3_2_Compatibility::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_3_2_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_3_2_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_3_2_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_3_2_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_3_2_Compatibility::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_3_2_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_3_2_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_3_2_Compatibility::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_3_2_Compatibility::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_3_2_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_3_2_Compatibility::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_2_Compatibility::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_3_2_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_3_2_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_3_2_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_3_2_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_3_2_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_3_2_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_3_2_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_3_2_Compatibility::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_3_2_Compatibility::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_3_2_Compatibility::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_3_2_Compatibility::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_3_2_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-// OpenGL 2.0 deprecated functions
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-
-// OpenGL 2.1 deprecated functions
-
-// OpenGL 3.0 deprecated functions
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
-{
- d_3_0_Core->f.VertexAttribI4usv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
- d_3_0_Core->f.VertexAttribI4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
-{
- d_3_0_Core->f.VertexAttribI4sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
-{
- d_3_0_Core->f.VertexAttribI4bv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI3uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI2uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI1uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI4iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI3iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI2iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI1iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
- d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
- d_3_0_Core->f.VertexAttribI2ui(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
-{
- d_3_0_Core->f.VertexAttribI1ui(index, x);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
- d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
-{
- d_3_0_Core->f.VertexAttribI2i(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
-{
- d_3_0_Core->f.VertexAttribI1i(index, x);
-}
-
-
-// OpenGL 3.1 deprecated functions
-
-// OpenGL 3.2 deprecated functions
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_3_2_core.cpp b/src/gui/opengl/qopenglfunctions_3_2_core.cpp
deleted file mode 100644
index ea89fc9e48..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_2_core.cpp
+++ /dev/null
@@ -1,215 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_3_2_core.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_3_2_Core
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_3_2_Core class provides all functions for OpenGL 3.2 core profile.
-
- This class is a wrapper for functions from OpenGL 3.2 core profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_3_2_Core::QOpenGLFunctions_3_2_Core()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
-{
-}
-
-QOpenGLFunctions_3_2_Core::~QOpenGLFunctions_3_2_Core()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_3_2_Core::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_3_2_Core::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_3_2_Core::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(3, 2))
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_3_2_Core::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(3, 2);
- v.setProfile(QSurfaceFormat::CoreProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_3_2_core.h b/src/gui/opengl/qopenglfunctions_3_2_core.h
deleted file mode 100644
index 1eafb6f441..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_2_core.h
+++ /dev/null
@@ -1,1720 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_3_2_CORE_H
-#define QOPENGLVERSIONFUNCTIONS_3_2_CORE_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_3_2_Core : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_3_2_Core();
- ~QOpenGLFunctions_3_2_Core();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_3_2_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Core::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_2_Core::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_3_2_Core::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_3_2_Core::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_3_2_Core::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_3_2_Core::glIndexubv(const GLubyte *c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_2_Core::glIndexub(GLubyte c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Core::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- Q_UNUSED(pname);
- Q_UNUSED(params);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_3_2_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_3_2_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_3_2_Core::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_3_2_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Core::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_3_2_Core::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Core::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Core::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_3_2_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Core::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Core::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_3_2_Core::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_3_2_Core::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_3_2_Core::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_3_2_Core::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_3_2_Core::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_3_2_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_3_2_Core::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_3_2_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_3_2_Core::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Core::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Core::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_2_Core::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_3_2_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_3_2_Core::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Core::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_3_2_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_3_2_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_3_2_Core::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_3_2_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_3_2_Core::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_3_2_Core::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_2_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_3_3_compatibility.cpp b/src/gui/opengl/qopenglfunctions_3_3_compatibility.cpp
deleted file mode 100644
index a26d7d99b1..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_3_compatibility.cpp
+++ /dev/null
@@ -1,282 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_3_3_compatibility.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_3_3_Compatibility
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_3_3_Compatibility class provides all functions for OpenGL 3.3 compatibility profile.
-
- This class is a wrapper for functions from OpenGL 3.3 compatibility profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_3_3_Compatibility::QOpenGLFunctions_3_3_Compatibility()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
- , m_reserved_2_0_Deprecated(nullptr)
- , d_3_3_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_3_3_Compatibility::~QOpenGLFunctions_3_3_Compatibility()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
- if (d_3_3_Deprecated) {
- d_3_3_Deprecated->refs.deref();
- Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_3_3_Compatibility::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_3_3_Compatibility::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
- d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_3_3_Compatibility::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(3, 3))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_3_3_Compatibility::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(3, 3);
- v.setProfile(QSurfaceFormat::CompatibilityProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_3_3_compatibility.h b/src/gui/opengl/qopenglfunctions_3_3_compatibility.h
deleted file mode 100644
index 185dd5aab4..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_3_compatibility.h
+++ /dev/null
@@ -1,4734 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_3_3_COMPATIBILITY_H
-#define QOPENGLVERSIONFUNCTIONS_3_3_COMPATIBILITY_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_3_3_Compatibility : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_3_3_Compatibility();
- ~QOpenGLFunctions_3_3_Compatibility();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
- // OpenGL 2.0 deprecated functions
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
-
- // OpenGL 2.1 deprecated functions
-
- // OpenGL 3.0 deprecated functions
- void glVertexAttribI4usv(GLuint index, const GLushort *v);
- void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
- void glVertexAttribI4sv(GLuint index, const GLshort *v);
- void glVertexAttribI4bv(GLuint index, const GLbyte *v);
- void glVertexAttribI4uiv(GLuint index, const GLuint *v);
- void glVertexAttribI3uiv(GLuint index, const GLuint *v);
- void glVertexAttribI2uiv(GLuint index, const GLuint *v);
- void glVertexAttribI1uiv(GLuint index, const GLuint *v);
- void glVertexAttribI4iv(GLuint index, const GLint *v);
- void glVertexAttribI3iv(GLuint index, const GLint *v);
- void glVertexAttribI2iv(GLuint index, const GLint *v);
- void glVertexAttribI1iv(GLuint index, const GLint *v);
- void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
- void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
- void glVertexAttribI1ui(GLuint index, GLuint x);
- void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
- void glVertexAttribI2i(GLuint index, GLint x, GLint y);
- void glVertexAttribI1i(GLuint index, GLint x);
-
- // OpenGL 3.1 deprecated functions
-
- // OpenGL 3.2 deprecated functions
-
- // OpenGL 3.3 deprecated functions
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
- void *m_reserved_2_0_Deprecated; // To maintain BC
- QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_3_3_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_3_Compatibility::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_3_3_Compatibility::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_3_3_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_3_3_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_3_3_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_3_3_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_3_3_Compatibility::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_3_3_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_3_3_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_3_3_Compatibility::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_3_3_Compatibility::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_3_3_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_3_3_Compatibility::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_3_Compatibility::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_3_3_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_3_3_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_3_3_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_3_3_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_3_3_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_3_3_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP4uiv(type, color);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorP4ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP4ui(type, color);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.NormalP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.NormalP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP4uiv(type, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexP4ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP4ui(type, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP3uiv(type, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexP3ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP3ui(type, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP2uiv(type, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexP2ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP2ui(type, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_3_3_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_3_3_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_3_3_Compatibility::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_3_3_Compatibility::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_3_3_Compatibility::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_3_3_Compatibility::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_3_3_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-// OpenGL 2.0 deprecated functions
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-
-// OpenGL 2.1 deprecated functions
-
-// OpenGL 3.0 deprecated functions
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
-{
- d_3_0_Core->f.VertexAttribI4usv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
- d_3_0_Core->f.VertexAttribI4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
-{
- d_3_0_Core->f.VertexAttribI4sv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
-{
- d_3_0_Core->f.VertexAttribI4bv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI3uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI2uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI1uiv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI4iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI3iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI2iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI1iv(index, v);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
- d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
- d_3_0_Core->f.VertexAttribI2ui(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
-{
- d_3_0_Core->f.VertexAttribI1ui(index, x);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
- d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
-{
- d_3_0_Core->f.VertexAttribI2i(index, x, y);
-}
-
-inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
-{
- d_3_0_Core->f.VertexAttribI1i(index, x);
-}
-
-
-// OpenGL 3.1 deprecated functions
-
-// OpenGL 3.2 deprecated functions
-
-// OpenGL 3.3 deprecated functions
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_3_3_core.cpp b/src/gui/opengl/qopenglfunctions_3_3_core.cpp
deleted file mode 100644
index 277ad1eb14..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_3_core.cpp
+++ /dev/null
@@ -1,224 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_3_3_core.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_3_3_Core
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_3_3_Core class provides all functions for OpenGL 3.3 core profile.
-
- This class is a wrapper for functions from OpenGL 3.3 core profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_3_3_Core::QOpenGLFunctions_3_3_Core()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
-{
-}
-
-QOpenGLFunctions_3_3_Core::~QOpenGLFunctions_3_3_Core()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_3_3_Core::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_3_3_Core::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_3_3_Core::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(3, 3))
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_3_3_Core::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(3, 3);
- v.setProfile(QSurfaceFormat::CoreProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_3_3_core.h b/src/gui/opengl/qopenglfunctions_3_3_core.h
deleted file mode 100644
index 47d54d717e..0000000000
--- a/src/gui/opengl/qopenglfunctions_3_3_core.h
+++ /dev/null
@@ -1,2141 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_3_3_CORE_H
-#define QOPENGLVERSIONFUNCTIONS_3_3_CORE_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_3_3_Core : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_3_3_Core();
- ~QOpenGLFunctions_3_3_Core();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_3_3_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_3_Core::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_3_3_Core::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_3_3_Core::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_3_3_Core::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_3_3_Core::glIndexubv(const GLubyte *c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glIndexub(GLubyte c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- Q_UNUSED(pname);
- Q_UNUSED(params);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_3_3_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_3_3_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_3_3_Core::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_3_3_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_3_3_Core::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_3_3_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_3_3_Core::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_3_3_Core::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_3_3_Core::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_3_3_Core::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_3_3_Core::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_3_3_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_3_3_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_3_3_Core::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_3_3_Core::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_3_3_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_3_3_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_3_3_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_3_3_Core::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_3_3_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_3_3_Core::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_3_3_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glColorP4uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glColorP4ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glColorP3uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glColorP3ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glNormalP3ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexP4ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexP3ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexP2ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_3_3_Core::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_3_3_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-inline void QOpenGLFunctions_3_3_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_0_compatibility.cpp b/src/gui/opengl/qopenglfunctions_4_0_compatibility.cpp
deleted file mode 100644
index 655f1e6fd4..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_0_compatibility.cpp
+++ /dev/null
@@ -1,291 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_0_compatibility.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_0_Compatibility
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_4_0_Compatibility class provides all functions for OpenGL 4.0 compatibility profile.
-
- This class is a wrapper for functions from OpenGL 4.0 compatibility profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_0_Compatibility::QOpenGLFunctions_4_0_Compatibility()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
- , m_reserved_2_0_Deprecated(nullptr)
- , d_3_3_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_4_0_Compatibility::~QOpenGLFunctions_4_0_Compatibility()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
- if (d_3_3_Deprecated) {
- d_3_3_Deprecated->refs.deref();
- Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_0_Compatibility::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_0_Compatibility::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
- d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_0_Compatibility::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 0))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_0_Compatibility::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 0);
- v.setProfile(QSurfaceFormat::CompatibilityProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_0_compatibility.h b/src/gui/opengl/qopenglfunctions_4_0_compatibility.h
deleted file mode 100644
index c0e42443d3..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_0_compatibility.h
+++ /dev/null
@@ -1,5019 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_0_COMPATIBILITY_H
-#define QOPENGLVERSIONFUNCTIONS_4_0_COMPATIBILITY_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_0_Compatibility : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_0_Compatibility();
- ~QOpenGLFunctions_4_0_Compatibility();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
- void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
- // OpenGL 2.0 deprecated functions
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
-
- // OpenGL 2.1 deprecated functions
-
- // OpenGL 3.0 deprecated functions
- void glVertexAttribI4usv(GLuint index, const GLushort *v);
- void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
- void glVertexAttribI4sv(GLuint index, const GLshort *v);
- void glVertexAttribI4bv(GLuint index, const GLbyte *v);
- void glVertexAttribI4uiv(GLuint index, const GLuint *v);
- void glVertexAttribI3uiv(GLuint index, const GLuint *v);
- void glVertexAttribI2uiv(GLuint index, const GLuint *v);
- void glVertexAttribI1uiv(GLuint index, const GLuint *v);
- void glVertexAttribI4iv(GLuint index, const GLint *v);
- void glVertexAttribI3iv(GLuint index, const GLint *v);
- void glVertexAttribI2iv(GLuint index, const GLint *v);
- void glVertexAttribI1iv(GLuint index, const GLint *v);
- void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
- void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
- void glVertexAttribI1ui(GLuint index, GLuint x);
- void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
- void glVertexAttribI2i(GLuint index, GLint x, GLint y);
- void glVertexAttribI1i(GLuint index, GLint x);
-
- // OpenGL 3.1 deprecated functions
-
- // OpenGL 3.2 deprecated functions
-
- // OpenGL 3.3 deprecated functions
-
- // OpenGL 4.0 deprecated functions
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
- void *m_reserved_2_0_Deprecated; // To maintain BC
- QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_0_Compatibility::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_4_0_Compatibility::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_4_0_Compatibility::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_0_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_0_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_0_Compatibility::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_0_Compatibility::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_4_0_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_0_Compatibility::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_0_Compatibility::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_0_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_0_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_0_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_0_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP4uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorP4ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP4ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.NormalP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.NormalP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP4uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexP4ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP4ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP3uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexP3ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP3ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP2uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexP2ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP2ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_0_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_0_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_0_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_4_0_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_4_0_Compatibility::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_4_0_Compatibility::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_4_0_Compatibility::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_4_0_Compatibility::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_4_0_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-// OpenGL 2.0 deprecated functions
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-
-// OpenGL 2.1 deprecated functions
-
-// OpenGL 3.0 deprecated functions
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
-{
- d_3_0_Core->f.VertexAttribI4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
- d_3_0_Core->f.VertexAttribI4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
-{
- d_3_0_Core->f.VertexAttribI4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
-{
- d_3_0_Core->f.VertexAttribI4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI3uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI2uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI1uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI3iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI2iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI1iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
- d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
- d_3_0_Core->f.VertexAttribI2ui(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
-{
- d_3_0_Core->f.VertexAttribI1ui(index, x);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
- d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
-{
- d_3_0_Core->f.VertexAttribI2i(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
-{
- d_3_0_Core->f.VertexAttribI1i(index, x);
-}
-
-
-// OpenGL 3.1 deprecated functions
-
-// OpenGL 3.2 deprecated functions
-
-// OpenGL 3.3 deprecated functions
-
-// OpenGL 4.0 deprecated functions
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_0_core.cpp b/src/gui/opengl/qopenglfunctions_4_0_core.cpp
deleted file mode 100644
index 60453d147c..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_0_core.cpp
+++ /dev/null
@@ -1,233 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_0_core.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_0_Core
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_4_0_Core class provides all functions for OpenGL 4.0 core profile.
-
- This class is a wrapper for functions from OpenGL 4.0 core profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_0_Core::QOpenGLFunctions_4_0_Core()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
-{
-}
-
-QOpenGLFunctions_4_0_Core::~QOpenGLFunctions_4_0_Core()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_0_Core::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_0_Core::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_0_Core::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 0))
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_0_Core::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 0);
- v.setProfile(QSurfaceFormat::CoreProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_0_core.h b/src/gui/opengl/qopenglfunctions_4_0_core.h
deleted file mode 100644
index 6cb55e86f7..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_0_core.h
+++ /dev/null
@@ -1,2422 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_0_CORE_H
-#define QOPENGLVERSIONFUNCTIONS_4_0_CORE_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_0_Core : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_0_Core();
- ~QOpenGLFunctions_4_0_Core();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
- void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_0_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_0_Core::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_4_0_Core::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_0_Core::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_0_Core::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_4_0_Core::glIndexubv(const GLubyte *c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glIndexub(GLubyte c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- Q_UNUSED(pname);
- Q_UNUSED(params);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_0_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_0_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_0_Core::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_0_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_4_0_Core::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_0_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_0_Core::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_0_Core::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_0_Core::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_0_Core::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_0_Core::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_4_0_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_0_Core::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_0_Core::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_0_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_0_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_0_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_0_Core::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_0_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_0_Core::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_0_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glColorP4uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glColorP4ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glColorP3uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glColorP3ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glNormalP3ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexP4ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexP3ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexP2ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_0_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_0_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_0_Core::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_0_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_0_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_0_Core::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_1_compatibility.cpp b/src/gui/opengl/qopenglfunctions_4_1_compatibility.cpp
deleted file mode 100644
index bdea8b5ba9..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_1_compatibility.cpp
+++ /dev/null
@@ -1,300 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_1_compatibility.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_1_Compatibility
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_4_1_Compatibility class provides all functions for OpenGL 4.1 compatibility profile.
-
- This class is a wrapper for functions from OpenGL 4.1 compatibility profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_1_Compatibility::QOpenGLFunctions_4_1_Compatibility()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
- , d_4_1_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
- , m_reserved_2_0_Deprecated(nullptr)
- , d_3_3_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_4_1_Compatibility::~QOpenGLFunctions_4_1_Compatibility()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
- if (d_4_1_Core) {
- d_4_1_Core->refs.deref();
- Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
- if (d_3_3_Deprecated) {
- d_3_3_Deprecated->refs.deref();
- Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_1_Compatibility::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_1_Compatibility::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
- d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
- d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_1_Compatibility::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 1))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_1_Compatibility::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 1);
- v.setProfile(QSurfaceFormat::CompatibilityProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_1_compatibility.h b/src/gui/opengl/qopenglfunctions_4_1_compatibility.h
deleted file mode 100644
index bee169b50c..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_1_compatibility.h
+++ /dev/null
@@ -1,5556 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_1_COMPATIBILITY_H
-#define QOPENGLVERSIONFUNCTIONS_4_1_COMPATIBILITY_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_1_Compatibility : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_1_Compatibility();
- ~QOpenGLFunctions_4_1_Compatibility();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
- void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
- // OpenGL 4.1 core functions
- void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
- void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
- void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
- void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
- void glScissorIndexedv(GLuint index, const GLint *v);
- void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
- void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
- void glViewportIndexedfv(GLuint index, const GLfloat *v);
- void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
- void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
- void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
- void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glVertexAttribL4dv(GLuint index, const GLdouble *v);
- void glVertexAttribL3dv(GLuint index, const GLdouble *v);
- void glVertexAttribL2dv(GLuint index, const GLdouble *v);
- void glVertexAttribL1dv(GLuint index, const GLdouble *v);
- void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttribL1d(GLuint index, GLdouble x);
- void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glValidateProgramPipeline(GLuint pipeline);
- void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
- void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
- void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
- void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
- void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
- void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
- void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform1i(GLuint program, GLint location, GLint v0);
- void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- GLboolean glIsProgramPipeline(GLuint pipeline);
- void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
- void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- void glBindProgramPipeline(GLuint pipeline);
- GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
- void glActiveShaderProgram(GLuint pipeline, GLuint program);
- void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- void glProgramParameteri(GLuint program, GLenum pname, GLint value);
- void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
- void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
- void glClearDepthf(GLfloat dd);
- void glDepthRangef(GLfloat n, GLfloat f);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
- void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
- void glReleaseShaderCompiler();
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
- // OpenGL 2.0 deprecated functions
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
-
- // OpenGL 2.1 deprecated functions
-
- // OpenGL 3.0 deprecated functions
- void glVertexAttribI4usv(GLuint index, const GLushort *v);
- void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
- void glVertexAttribI4sv(GLuint index, const GLshort *v);
- void glVertexAttribI4bv(GLuint index, const GLbyte *v);
- void glVertexAttribI4uiv(GLuint index, const GLuint *v);
- void glVertexAttribI3uiv(GLuint index, const GLuint *v);
- void glVertexAttribI2uiv(GLuint index, const GLuint *v);
- void glVertexAttribI1uiv(GLuint index, const GLuint *v);
- void glVertexAttribI4iv(GLuint index, const GLint *v);
- void glVertexAttribI3iv(GLuint index, const GLint *v);
- void glVertexAttribI2iv(GLuint index, const GLint *v);
- void glVertexAttribI1iv(GLuint index, const GLint *v);
- void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
- void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
- void glVertexAttribI1ui(GLuint index, GLuint x);
- void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
- void glVertexAttribI2i(GLuint index, GLint x, GLint y);
- void glVertexAttribI1i(GLuint index, GLint x);
-
- // OpenGL 3.1 deprecated functions
-
- // OpenGL 3.2 deprecated functions
-
- // OpenGL 3.3 deprecated functions
-
- // OpenGL 4.0 deprecated functions
-
- // OpenGL 4.1 deprecated functions
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
- QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
- void *m_reserved_2_0_Deprecated; // To maintain BC
- QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_1_Compatibility::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_4_1_Compatibility::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_4_1_Compatibility::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_1_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_1_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_1_Compatibility::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_1_Compatibility::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_4_1_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_1_Compatibility::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_1_Compatibility::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_1_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_1_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_1_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_1_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP4uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorP4ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP4ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.NormalP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.NormalP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP4uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexP4ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP4ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP3uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexP3ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP3ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP2uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexP2ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP2ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_1_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_1_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_1_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-// OpenGL 4.1 core functions
-inline void QOpenGLFunctions_4_1_Compatibility::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
-{
- d_4_1_Core->f.GetDoublei_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
-{
- d_4_1_Core->f.GetFloati_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
-{
- d_4_1_Core->f.DepthRangeIndexed(index, n, f);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
-{
- d_4_1_Core->f.DepthRangeArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glScissorIndexedv(GLuint index, const GLint *v)
-{
- d_4_1_Core->f.ScissorIndexedv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
-{
- d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
-{
- d_4_1_Core->f.ScissorArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glViewportIndexedfv(GLuint index, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportIndexedfv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
-{
- d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL4dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL3dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL2dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL1dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_4_1_Core->f.VertexAttribL2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL1d(GLuint index, GLdouble x)
-{
- d_4_1_Core->f.VertexAttribL1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glValidateProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.ValidateProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
-{
- d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
-{
- d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
- d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
-{
- d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
- d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
- d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
-{
- d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
-{
- d_4_1_Core->f.ProgramUniform1d(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
-{
- d_4_1_Core->f.ProgramUniform1f(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1i(GLuint program, GLint location, GLint v0)
-{
- d_4_1_Core->f.ProgramUniform1i(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
- d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsProgramPipeline(GLuint pipeline)
-{
- return d_4_1_Core->f.IsProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_1_Core->f.GenProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
-{
- d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBindProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.BindProgramPipeline(pipeline);
-}
-
-inline GLuint QOpenGLFunctions_4_1_Compatibility::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
-{
- return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glActiveShaderProgram(GLuint pipeline, GLuint program)
-{
- d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
- d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramParameteri(GLuint program, GLenum pname, GLint value)
-{
- d_4_1_Core->f.ProgramParameteri(program, pname, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
-{
- d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClearDepthf(GLfloat dd)
-{
- d_4_1_Core->f.ClearDepthf(dd);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDepthRangef(GLfloat n, GLfloat f)
-{
- d_4_1_Core->f.DepthRangef(n, f);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
-{
- d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glReleaseShaderCompiler()
-{
- d_4_1_Core->f.ReleaseShaderCompiler();
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_4_1_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_4_1_Compatibility::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_4_1_Compatibility::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_4_1_Compatibility::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_4_1_Compatibility::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_4_1_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-// OpenGL 2.0 deprecated functions
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-
-// OpenGL 2.1 deprecated functions
-
-// OpenGL 3.0 deprecated functions
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
-{
- d_3_0_Core->f.VertexAttribI4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
- d_3_0_Core->f.VertexAttribI4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
-{
- d_3_0_Core->f.VertexAttribI4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
-{
- d_3_0_Core->f.VertexAttribI4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI3uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI2uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI1uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI3iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI2iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI1iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
- d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
- d_3_0_Core->f.VertexAttribI2ui(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
-{
- d_3_0_Core->f.VertexAttribI1ui(index, x);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
- d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
-{
- d_3_0_Core->f.VertexAttribI2i(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
-{
- d_3_0_Core->f.VertexAttribI1i(index, x);
-}
-
-
-// OpenGL 3.1 deprecated functions
-
-// OpenGL 3.2 deprecated functions
-
-// OpenGL 3.3 deprecated functions
-
-// OpenGL 4.0 deprecated functions
-
-// OpenGL 4.1 deprecated functions
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_1_core.cpp b/src/gui/opengl/qopenglfunctions_4_1_core.cpp
deleted file mode 100644
index b21742d9c1..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_1_core.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_1_core.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_1_Core
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_4_1_Core class provides all functions for OpenGL 4.1 core profile.
-
- This class is a wrapper for functions from OpenGL 4.1 core profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_1_Core::QOpenGLFunctions_4_1_Core()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
- , d_4_1_Core(nullptr)
-{
-}
-
-QOpenGLFunctions_4_1_Core::~QOpenGLFunctions_4_1_Core()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
- if (d_4_1_Core) {
- d_4_1_Core->refs.deref();
- Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_1_Core::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_1_Core::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
- d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_1_Core::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 1))
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_1_Core::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 1);
- v.setProfile(QSurfaceFormat::CoreProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_1_core.h b/src/gui/opengl/qopenglfunctions_4_1_core.h
deleted file mode 100644
index 3a4fd0743b..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_1_core.h
+++ /dev/null
@@ -1,2955 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_1_CORE_H
-#define QOPENGLVERSIONFUNCTIONS_4_1_CORE_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_1_Core : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_1_Core();
- ~QOpenGLFunctions_4_1_Core();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
- void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
- // OpenGL 4.1 core functions
- void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
- void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
- void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
- void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
- void glScissorIndexedv(GLuint index, const GLint *v);
- void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
- void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
- void glViewportIndexedfv(GLuint index, const GLfloat *v);
- void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
- void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
- void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
- void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glVertexAttribL4dv(GLuint index, const GLdouble *v);
- void glVertexAttribL3dv(GLuint index, const GLdouble *v);
- void glVertexAttribL2dv(GLuint index, const GLdouble *v);
- void glVertexAttribL1dv(GLuint index, const GLdouble *v);
- void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttribL1d(GLuint index, GLdouble x);
- void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glValidateProgramPipeline(GLuint pipeline);
- void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
- void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
- void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
- void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
- void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
- void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
- void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform1i(GLuint program, GLint location, GLint v0);
- void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- GLboolean glIsProgramPipeline(GLuint pipeline);
- void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
- void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- void glBindProgramPipeline(GLuint pipeline);
- GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
- void glActiveShaderProgram(GLuint pipeline, GLuint program);
- void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- void glProgramParameteri(GLuint program, GLenum pname, GLint value);
- void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
- void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
- void glClearDepthf(GLfloat dd);
- void glDepthRangef(GLfloat n, GLfloat f);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
- void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
- void glReleaseShaderCompiler();
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
- QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_1_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_1_Core::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_4_1_Core::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_1_Core::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_1_Core::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_4_1_Core::glIndexubv(const GLubyte *c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glIndexub(GLubyte c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- Q_UNUSED(pname);
- Q_UNUSED(params);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_1_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_1_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_1_Core::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_1_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_4_1_Core::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_1_Core::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_1_Core::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_1_Core::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_1_Core::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_1_Core::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_4_1_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_1_Core::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_1_Core::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_1_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_1_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_1_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_1_Core::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_1_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_1_Core::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glColorP4uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glColorP4ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glColorP3uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glColorP3ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glNormalP3ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexP4ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexP3ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexP2ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_1_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_1_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_1_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_1_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-// OpenGL 4.1 core functions
-inline void QOpenGLFunctions_4_1_Core::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
-{
- d_4_1_Core->f.GetDoublei_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
-{
- d_4_1_Core->f.GetFloati_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
-{
- d_4_1_Core->f.DepthRangeIndexed(index, n, f);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
-{
- d_4_1_Core->f.DepthRangeArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glScissorIndexedv(GLuint index, const GLint *v)
-{
- d_4_1_Core->f.ScissorIndexedv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
-{
- d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
-{
- d_4_1_Core->f.ScissorArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glViewportIndexedfv(GLuint index, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportIndexedfv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
-{
- d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribL4dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribL3dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribL2dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribL1dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_4_1_Core->f.VertexAttribL2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glVertexAttribL1d(GLuint index, GLdouble x)
-{
- d_4_1_Core->f.VertexAttribL1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glValidateProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.ValidateProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
-{
- d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
-{
- d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
- d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
-{
- d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
- d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
- d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
-{
- d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
-{
- d_4_1_Core->f.ProgramUniform1d(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
-{
- d_4_1_Core->f.ProgramUniform1f(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramUniform1i(GLuint program, GLint location, GLint v0)
-{
- d_4_1_Core->f.ProgramUniform1i(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
- d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_1_Core::glIsProgramPipeline(GLuint pipeline)
-{
- return d_4_1_Core->f.IsProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_1_Core->f.GenProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
-{
- d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glBindProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.BindProgramPipeline(pipeline);
-}
-
-inline GLuint QOpenGLFunctions_4_1_Core::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
-{
- return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glActiveShaderProgram(GLuint pipeline, GLuint program)
-{
- d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
- d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramParameteri(GLuint program, GLenum pname, GLint value)
-{
- d_4_1_Core->f.ProgramParameteri(program, pname, value);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
-{
- d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glClearDepthf(GLfloat dd)
-{
- d_4_1_Core->f.ClearDepthf(dd);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glDepthRangef(GLfloat n, GLfloat f)
-{
- d_4_1_Core->f.DepthRangef(n, f);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
-{
- d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_1_Core::glReleaseShaderCompiler()
-{
- d_4_1_Core->f.ReleaseShaderCompiler();
-}
-
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_2_compatibility.cpp b/src/gui/opengl/qopenglfunctions_4_2_compatibility.cpp
deleted file mode 100644
index 41ab9ae762..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_2_compatibility.cpp
+++ /dev/null
@@ -1,309 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_2_compatibility.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_2_Compatibility
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_4_2_Compatibility class provides all functions for OpenGL 4.2 compatibility profile.
-
- This class is a wrapper for functions from OpenGL 4.2 compatibility profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_2_Compatibility::QOpenGLFunctions_4_2_Compatibility()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
- , d_4_1_Core(nullptr)
- , d_4_2_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
- , m_reserved_2_0_Deprecated(nullptr)
- , d_3_3_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_4_2_Compatibility::~QOpenGLFunctions_4_2_Compatibility()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
- if (d_4_1_Core) {
- d_4_1_Core->refs.deref();
- Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
- }
- if (d_4_2_Core) {
- d_4_2_Core->refs.deref();
- Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
- if (d_3_3_Deprecated) {
- d_3_3_Deprecated->refs.deref();
- Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_2_Compatibility::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_2_Compatibility::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
- d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
- d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
- d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_2_Compatibility::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 2))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_2_Compatibility::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 2);
- v.setProfile(QSurfaceFormat::CompatibilityProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_2_compatibility.h b/src/gui/opengl/qopenglfunctions_4_2_compatibility.h
deleted file mode 100644
index a48d581c2d..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_2_compatibility.h
+++ /dev/null
@@ -1,5647 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_2_COMPATIBILITY_H
-#define QOPENGLVERSIONFUNCTIONS_4_2_COMPATIBILITY_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-// MemoryBarrier is a macro on some architectures on Windows
-#ifdef Q_OS_WIN
-#pragma push_macro("MemoryBarrier")
-#undef MemoryBarrier
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_2_Compatibility : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_2_Compatibility();
- ~QOpenGLFunctions_4_2_Compatibility();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
- void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
- // OpenGL 4.1 core functions
- void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
- void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
- void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
- void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
- void glScissorIndexedv(GLuint index, const GLint *v);
- void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
- void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
- void glViewportIndexedfv(GLuint index, const GLfloat *v);
- void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
- void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
- void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
- void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glVertexAttribL4dv(GLuint index, const GLdouble *v);
- void glVertexAttribL3dv(GLuint index, const GLdouble *v);
- void glVertexAttribL2dv(GLuint index, const GLdouble *v);
- void glVertexAttribL1dv(GLuint index, const GLdouble *v);
- void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttribL1d(GLuint index, GLdouble x);
- void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glValidateProgramPipeline(GLuint pipeline);
- void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
- void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
- void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
- void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
- void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
- void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
- void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform1i(GLuint program, GLint location, GLint v0);
- void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- GLboolean glIsProgramPipeline(GLuint pipeline);
- void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
- void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- void glBindProgramPipeline(GLuint pipeline);
- GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
- void glActiveShaderProgram(GLuint pipeline, GLuint program);
- void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- void glProgramParameteri(GLuint program, GLenum pname, GLint value);
- void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
- void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
- void glClearDepthf(GLfloat dd);
- void glDepthRangef(GLfloat n, GLfloat f);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
- void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
- void glReleaseShaderCompiler();
-
- // OpenGL 4.2 core functions
- void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
- void glMemoryBarrier(GLbitfield barriers);
- void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
- void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
- void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
- void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
- void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
- void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
- void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
- void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
- // OpenGL 2.0 deprecated functions
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
-
- // OpenGL 2.1 deprecated functions
-
- // OpenGL 3.0 deprecated functions
- void glVertexAttribI4usv(GLuint index, const GLushort *v);
- void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
- void glVertexAttribI4sv(GLuint index, const GLshort *v);
- void glVertexAttribI4bv(GLuint index, const GLbyte *v);
- void glVertexAttribI4uiv(GLuint index, const GLuint *v);
- void glVertexAttribI3uiv(GLuint index, const GLuint *v);
- void glVertexAttribI2uiv(GLuint index, const GLuint *v);
- void glVertexAttribI1uiv(GLuint index, const GLuint *v);
- void glVertexAttribI4iv(GLuint index, const GLint *v);
- void glVertexAttribI3iv(GLuint index, const GLint *v);
- void glVertexAttribI2iv(GLuint index, const GLint *v);
- void glVertexAttribI1iv(GLuint index, const GLint *v);
- void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
- void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
- void glVertexAttribI1ui(GLuint index, GLuint x);
- void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
- void glVertexAttribI2i(GLuint index, GLint x, GLint y);
- void glVertexAttribI1i(GLuint index, GLint x);
-
- // OpenGL 3.1 deprecated functions
-
- // OpenGL 3.2 deprecated functions
-
- // OpenGL 3.3 deprecated functions
-
- // OpenGL 4.0 deprecated functions
-
- // OpenGL 4.1 deprecated functions
-
- // OpenGL 4.2 deprecated functions
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
- QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
- QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
- void *m_reserved_2_0_Deprecated; // To maintain BC
- QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_2_Compatibility::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_4_2_Compatibility::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_4_2_Compatibility::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_2_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_2_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_2_Compatibility::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_2_Compatibility::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_4_2_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_2_Compatibility::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_2_Compatibility::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_2_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_2_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_2_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_2_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP4uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorP4ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP4ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.NormalP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.NormalP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP4uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexP4ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP4ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP3uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexP3ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP3ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP2uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexP2ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP2ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_2_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_2_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_2_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-// OpenGL 4.1 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
-{
- d_4_1_Core->f.GetDoublei_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
-{
- d_4_1_Core->f.GetFloati_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
-{
- d_4_1_Core->f.DepthRangeIndexed(index, n, f);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
-{
- d_4_1_Core->f.DepthRangeArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glScissorIndexedv(GLuint index, const GLint *v)
-{
- d_4_1_Core->f.ScissorIndexedv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
-{
- d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
-{
- d_4_1_Core->f.ScissorArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glViewportIndexedfv(GLuint index, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportIndexedfv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
-{
- d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL4dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL3dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL2dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL1dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_4_1_Core->f.VertexAttribL2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL1d(GLuint index, GLdouble x)
-{
- d_4_1_Core->f.VertexAttribL1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glValidateProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.ValidateProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
-{
- d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
-{
- d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
- d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
-{
- d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
- d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
- d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
-{
- d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
-{
- d_4_1_Core->f.ProgramUniform1d(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
-{
- d_4_1_Core->f.ProgramUniform1f(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1i(GLuint program, GLint location, GLint v0)
-{
- d_4_1_Core->f.ProgramUniform1i(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
- d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsProgramPipeline(GLuint pipeline)
-{
- return d_4_1_Core->f.IsProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_1_Core->f.GenProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
-{
- d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.BindProgramPipeline(pipeline);
-}
-
-inline GLuint QOpenGLFunctions_4_2_Compatibility::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
-{
- return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glActiveShaderProgram(GLuint pipeline, GLuint program)
-{
- d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
- d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramParameteri(GLuint program, GLenum pname, GLint value)
-{
- d_4_1_Core->f.ProgramParameteri(program, pname, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
-{
- d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClearDepthf(GLfloat dd)
-{
- d_4_1_Core->f.ClearDepthf(dd);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDepthRangef(GLfloat n, GLfloat f)
-{
- d_4_1_Core->f.DepthRangef(n, f);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
-{
- d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glReleaseShaderCompiler()
-{
- d_4_1_Core->f.ReleaseShaderCompiler();
-}
-
-
-// OpenGL 4.2 core functions
-inline void QOpenGLFunctions_4_2_Compatibility::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
-{
- d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMemoryBarrier(GLbitfield barriers)
-{
- d_4_2_Core->f.MemoryBarrier(barriers);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
-{
- d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
-{
- d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
-{
- d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_4_2_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_4_2_Compatibility::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_4_2_Compatibility::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_4_2_Compatibility::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_4_2_Compatibility::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_4_2_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-// OpenGL 2.0 deprecated functions
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-
-// OpenGL 2.1 deprecated functions
-
-// OpenGL 3.0 deprecated functions
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
-{
- d_3_0_Core->f.VertexAttribI4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
- d_3_0_Core->f.VertexAttribI4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
-{
- d_3_0_Core->f.VertexAttribI4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
-{
- d_3_0_Core->f.VertexAttribI4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI3uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI2uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI1uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI3iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI2iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI1iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
- d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
- d_3_0_Core->f.VertexAttribI2ui(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
-{
- d_3_0_Core->f.VertexAttribI1ui(index, x);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
- d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
-{
- d_3_0_Core->f.VertexAttribI2i(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
-{
- d_3_0_Core->f.VertexAttribI1i(index, x);
-}
-
-
-// OpenGL 3.1 deprecated functions
-
-// OpenGL 3.2 deprecated functions
-
-// OpenGL 3.3 deprecated functions
-
-// OpenGL 4.0 deprecated functions
-
-// OpenGL 4.1 deprecated functions
-
-// OpenGL 4.2 deprecated functions
-
-
-QT_END_NAMESPACE
-
-#ifdef Q_OS_WIN
-#pragma pop_macro("MemoryBarrier")
-#endif
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_2_core.cpp b/src/gui/opengl/qopenglfunctions_4_2_core.cpp
deleted file mode 100644
index 38dbe1b596..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_2_core.cpp
+++ /dev/null
@@ -1,251 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_2_core.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_2_Core
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_4_2_Core class provides all functions for OpenGL 4.2 core profile.
-
- This class is a wrapper for functions from OpenGL 4.2 core profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_2_Core::QOpenGLFunctions_4_2_Core()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
- , d_4_1_Core(nullptr)
- , d_4_2_Core(nullptr)
-{
-}
-
-QOpenGLFunctions_4_2_Core::~QOpenGLFunctions_4_2_Core()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
- if (d_4_1_Core) {
- d_4_1_Core->refs.deref();
- Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
- }
- if (d_4_2_Core) {
- d_4_2_Core->refs.deref();
- Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_2_Core::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_2_Core::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
- d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
- d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_2_Core::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 2))
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_2_Core::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 2);
- v.setProfile(QSurfaceFormat::CoreProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_2_core.h b/src/gui/opengl/qopenglfunctions_4_2_core.h
deleted file mode 100644
index 5ca98e9808..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_2_core.h
+++ /dev/null
@@ -1,3042 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_2_CORE_H
-#define QOPENGLVERSIONFUNCTIONS_4_2_CORE_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-// MemoryBarrier is a macro on some architectures on Windows
-#ifdef Q_OS_WIN
-#pragma push_macro("MemoryBarrier")
-#undef MemoryBarrier
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_2_Core : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_2_Core();
- ~QOpenGLFunctions_4_2_Core();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
- void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
- // OpenGL 4.1 core functions
- void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
- void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
- void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
- void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
- void glScissorIndexedv(GLuint index, const GLint *v);
- void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
- void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
- void glViewportIndexedfv(GLuint index, const GLfloat *v);
- void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
- void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
- void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
- void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glVertexAttribL4dv(GLuint index, const GLdouble *v);
- void glVertexAttribL3dv(GLuint index, const GLdouble *v);
- void glVertexAttribL2dv(GLuint index, const GLdouble *v);
- void glVertexAttribL1dv(GLuint index, const GLdouble *v);
- void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttribL1d(GLuint index, GLdouble x);
- void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glValidateProgramPipeline(GLuint pipeline);
- void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
- void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
- void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
- void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
- void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
- void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
- void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform1i(GLuint program, GLint location, GLint v0);
- void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- GLboolean glIsProgramPipeline(GLuint pipeline);
- void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
- void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- void glBindProgramPipeline(GLuint pipeline);
- GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
- void glActiveShaderProgram(GLuint pipeline, GLuint program);
- void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- void glProgramParameteri(GLuint program, GLenum pname, GLint value);
- void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
- void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
- void glClearDepthf(GLfloat dd);
- void glDepthRangef(GLfloat n, GLfloat f);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
- void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
- void glReleaseShaderCompiler();
-
- // OpenGL 4.2 core functions
- void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
- void glMemoryBarrier(GLbitfield barriers);
- void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
- void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
- void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
- void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
- void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
- void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
- void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
- void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
- QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
- QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_2_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_2_Core::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_4_2_Core::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_2_Core::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_2_Core::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_4_2_Core::glIndexubv(const GLubyte *c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glIndexub(GLubyte c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- Q_UNUSED(pname);
- Q_UNUSED(params);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_2_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_2_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_2_Core::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_2_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_4_2_Core::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_2_Core::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_2_Core::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_2_Core::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_2_Core::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_2_Core::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_4_2_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_2_Core::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_2_Core::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_2_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_2_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_2_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_2_Core::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_2_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_2_Core::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glColorP4uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glColorP4ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glColorP3uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glColorP3ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glNormalP3ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexP4ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexP3ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexP2ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_2_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_2_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_2_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_2_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-// OpenGL 4.1 core functions
-inline void QOpenGLFunctions_4_2_Core::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
-{
- d_4_1_Core->f.GetDoublei_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
-{
- d_4_1_Core->f.GetFloati_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
-{
- d_4_1_Core->f.DepthRangeIndexed(index, n, f);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
-{
- d_4_1_Core->f.DepthRangeArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glScissorIndexedv(GLuint index, const GLint *v)
-{
- d_4_1_Core->f.ScissorIndexedv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
-{
- d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
-{
- d_4_1_Core->f.ScissorArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glViewportIndexedfv(GLuint index, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportIndexedfv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
-{
- d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribL4dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribL3dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribL2dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribL1dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_4_1_Core->f.VertexAttribL2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glVertexAttribL1d(GLuint index, GLdouble x)
-{
- d_4_1_Core->f.VertexAttribL1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glValidateProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.ValidateProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
-{
- d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
-{
- d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
- d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
-{
- d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
- d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
- d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
-{
- d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
-{
- d_4_1_Core->f.ProgramUniform1d(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
-{
- d_4_1_Core->f.ProgramUniform1f(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramUniform1i(GLuint program, GLint location, GLint v0)
-{
- d_4_1_Core->f.ProgramUniform1i(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
- d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_2_Core::glIsProgramPipeline(GLuint pipeline)
-{
- return d_4_1_Core->f.IsProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_1_Core->f.GenProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
-{
- d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.BindProgramPipeline(pipeline);
-}
-
-inline GLuint QOpenGLFunctions_4_2_Core::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
-{
- return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glActiveShaderProgram(GLuint pipeline, GLuint program)
-{
- d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
- d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramParameteri(GLuint program, GLenum pname, GLint value)
-{
- d_4_1_Core->f.ProgramParameteri(program, pname, value);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
-{
- d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glClearDepthf(GLfloat dd)
-{
- d_4_1_Core->f.ClearDepthf(dd);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDepthRangef(GLfloat n, GLfloat f)
-{
- d_4_1_Core->f.DepthRangef(n, f);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
-{
- d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glReleaseShaderCompiler()
-{
- d_4_1_Core->f.ReleaseShaderCompiler();
-}
-
-
-// OpenGL 4.2 core functions
-inline void QOpenGLFunctions_4_2_Core::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
-{
- d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glMemoryBarrier(GLbitfield barriers)
-{
- d_4_2_Core->f.MemoryBarrier(barriers);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
-{
- d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
-{
- d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
-{
- d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_2_Core::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
-}
-
-
-
-QT_END_NAMESPACE
-
-#ifdef Q_OS_WIN
-#pragma pop_macro("MemoryBarrier")
-#endif
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_3_compatibility.cpp b/src/gui/opengl/qopenglfunctions_4_3_compatibility.cpp
deleted file mode 100644
index 1b23d08ee2..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_3_compatibility.cpp
+++ /dev/null
@@ -1,318 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_3_compatibility.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_3_Compatibility
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_4_3_Compatibility class provides all functions for OpenGL 4.3 compatibility profile.
-
- This class is a wrapper for functions from OpenGL 4.3 compatibility profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_3_Compatibility::QOpenGLFunctions_4_3_Compatibility()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
- , d_4_1_Core(nullptr)
- , d_4_2_Core(nullptr)
- , d_4_3_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
- , m_reserved_2_0_Deprecated(nullptr)
- , d_3_3_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_4_3_Compatibility::~QOpenGLFunctions_4_3_Compatibility()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
- if (d_4_1_Core) {
- d_4_1_Core->refs.deref();
- Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
- }
- if (d_4_2_Core) {
- d_4_2_Core->refs.deref();
- Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
- }
- if (d_4_3_Core) {
- d_4_3_Core->refs.deref();
- Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
- if (d_3_3_Deprecated) {
- d_3_3_Deprecated->refs.deref();
- Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_3_Compatibility::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_3_Compatibility::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
- d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
- d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
- d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
- d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_3_Compatibility::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 3))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_3_Compatibility::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 3);
- v.setProfile(QSurfaceFormat::CompatibilityProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_3_compatibility.h b/src/gui/opengl/qopenglfunctions_4_3_compatibility.h
deleted file mode 100644
index d969f5b3b4..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_3_compatibility.h
+++ /dev/null
@@ -1,5854 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_3_COMPATIBILITY_H
-#define QOPENGLVERSIONFUNCTIONS_4_3_COMPATIBILITY_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-// MemoryBarrier is a macro on some architectures on Windows
-#ifdef Q_OS_WIN
-#pragma push_macro("MemoryBarrier")
-#undef MemoryBarrier
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_3_Compatibility : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_3_Compatibility();
- ~QOpenGLFunctions_4_3_Compatibility();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
- void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
- // OpenGL 4.1 core functions
- void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
- void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
- void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
- void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
- void glScissorIndexedv(GLuint index, const GLint *v);
- void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
- void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
- void glViewportIndexedfv(GLuint index, const GLfloat *v);
- void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
- void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
- void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
- void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glVertexAttribL4dv(GLuint index, const GLdouble *v);
- void glVertexAttribL3dv(GLuint index, const GLdouble *v);
- void glVertexAttribL2dv(GLuint index, const GLdouble *v);
- void glVertexAttribL1dv(GLuint index, const GLdouble *v);
- void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttribL1d(GLuint index, GLdouble x);
- void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glValidateProgramPipeline(GLuint pipeline);
- void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
- void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
- void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
- void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
- void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
- void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
- void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform1i(GLuint program, GLint location, GLint v0);
- void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- GLboolean glIsProgramPipeline(GLuint pipeline);
- void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
- void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- void glBindProgramPipeline(GLuint pipeline);
- GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
- void glActiveShaderProgram(GLuint pipeline, GLuint program);
- void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- void glProgramParameteri(GLuint program, GLenum pname, GLint value);
- void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
- void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
- void glClearDepthf(GLfloat dd);
- void glDepthRangef(GLfloat n, GLfloat f);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
- void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
- void glReleaseShaderCompiler();
-
- // OpenGL 4.2 core functions
- void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
- void glMemoryBarrier(GLbitfield barriers);
- void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
- void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
- void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
- void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
- void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
- void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
- void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
- void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
-
- // OpenGL 4.3 core functions
- void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
- GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
- GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
- void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
- GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
- void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
- void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
- void glInvalidateBufferData(GLuint buffer);
- void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
- void glInvalidateTexImage(GLuint texture, GLint level);
- void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
- void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
- void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
- void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
- void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
- void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
- void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
- void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
- void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
- void glDispatchComputeIndirect(GLintptr indirect);
- void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
- void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
- void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
- void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glResetMinmax(GLenum target);
- void glResetHistogram(GLenum target);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
- // OpenGL 2.0 deprecated functions
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
-
- // OpenGL 2.1 deprecated functions
-
- // OpenGL 3.0 deprecated functions
- void glVertexAttribI4usv(GLuint index, const GLushort *v);
- void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
- void glVertexAttribI4sv(GLuint index, const GLshort *v);
- void glVertexAttribI4bv(GLuint index, const GLbyte *v);
- void glVertexAttribI4uiv(GLuint index, const GLuint *v);
- void glVertexAttribI3uiv(GLuint index, const GLuint *v);
- void glVertexAttribI2uiv(GLuint index, const GLuint *v);
- void glVertexAttribI1uiv(GLuint index, const GLuint *v);
- void glVertexAttribI4iv(GLuint index, const GLint *v);
- void glVertexAttribI3iv(GLuint index, const GLint *v);
- void glVertexAttribI2iv(GLuint index, const GLint *v);
- void glVertexAttribI1iv(GLuint index, const GLint *v);
- void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
- void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
- void glVertexAttribI1ui(GLuint index, GLuint x);
- void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
- void glVertexAttribI2i(GLuint index, GLint x, GLint y);
- void glVertexAttribI1i(GLuint index, GLint x);
-
- // OpenGL 3.1 deprecated functions
-
- // OpenGL 3.2 deprecated functions
-
- // OpenGL 3.3 deprecated functions
-
- // OpenGL 4.0 deprecated functions
-
- // OpenGL 4.1 deprecated functions
-
- // OpenGL 4.2 deprecated functions
-
- // OpenGL 4.3 deprecated functions
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
- QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
- QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
- QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
- void *m_reserved_2_0_Deprecated; // To maintain BC
- QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_3_Compatibility::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_4_3_Compatibility::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_4_3_Compatibility::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_3_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_3_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Compatibility::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Compatibility::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_4_3_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_3_Compatibility::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_3_Compatibility::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_3_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_3_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_3_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP4uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorP4ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP4ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.NormalP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.NormalP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP4uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexP4ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP4ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP3uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexP3ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP3ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP2uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexP2ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP2ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_3_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_3_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-// OpenGL 4.1 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
-{
- d_4_1_Core->f.GetDoublei_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
-{
- d_4_1_Core->f.GetFloati_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
-{
- d_4_1_Core->f.DepthRangeIndexed(index, n, f);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
-{
- d_4_1_Core->f.DepthRangeArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glScissorIndexedv(GLuint index, const GLint *v)
-{
- d_4_1_Core->f.ScissorIndexedv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
-{
- d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
-{
- d_4_1_Core->f.ScissorArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glViewportIndexedfv(GLuint index, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportIndexedfv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
-{
- d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL4dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL3dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL2dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL1dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_4_1_Core->f.VertexAttribL2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL1d(GLuint index, GLdouble x)
-{
- d_4_1_Core->f.VertexAttribL1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glValidateProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.ValidateProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
-{
- d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
-{
- d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
- d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
-{
- d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
- d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
- d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
-{
- d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
-{
- d_4_1_Core->f.ProgramUniform1d(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
-{
- d_4_1_Core->f.ProgramUniform1f(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1i(GLuint program, GLint location, GLint v0)
-{
- d_4_1_Core->f.ProgramUniform1i(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
- d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsProgramPipeline(GLuint pipeline)
-{
- return d_4_1_Core->f.IsProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_1_Core->f.GenProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
-{
- d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.BindProgramPipeline(pipeline);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Compatibility::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
-{
- return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glActiveShaderProgram(GLuint pipeline, GLuint program)
-{
- d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
- d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramParameteri(GLuint program, GLenum pname, GLint value)
-{
- d_4_1_Core->f.ProgramParameteri(program, pname, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
-{
- d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearDepthf(GLfloat dd)
-{
- d_4_1_Core->f.ClearDepthf(dd);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDepthRangef(GLfloat n, GLfloat f)
-{
- d_4_1_Core->f.DepthRangef(n, f);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
-{
- d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glReleaseShaderCompiler()
-{
- d_4_1_Core->f.ReleaseShaderCompiler();
-}
-
-
-// OpenGL 4.2 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
-{
- d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMemoryBarrier(GLbitfield barriers)
-{
- d_4_2_Core->f.MemoryBarrier(barriers);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
-{
- d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
-{
- d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
-{
- d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
-}
-
-
-// OpenGL 4.3 core functions
-inline void QOpenGLFunctions_4_3_Compatibility::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
-{
- d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
-}
-
-inline GLint QOpenGLFunctions_4_3_Compatibility::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
-}
-
-inline GLint QOpenGLFunctions_4_3_Compatibility::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
-{
- d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
-{
- d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Compatibility::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
-{
- d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateBufferData(GLuint buffer)
-{
- d_4_3_Core->f.InvalidateBufferData(buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
-{
- d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateTexImage(GLuint texture, GLint level)
-{
- d_4_3_Core->f.InvalidateTexImage(texture, level);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
-{
- d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_4_3_Core->f.FramebufferParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
-{
- d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
-{
- d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
-{
- d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
-{
- d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
-{
- d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDispatchComputeIndirect(GLintptr indirect)
-{
- d_4_3_Core->f.DispatchComputeIndirect(indirect);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
-{
- d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_4_3_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_4_3_Compatibility::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Compatibility::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_4_3_Compatibility::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_4_3_Compatibility::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_4_3_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-// OpenGL 2.0 deprecated functions
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-
-// OpenGL 2.1 deprecated functions
-
-// OpenGL 3.0 deprecated functions
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
-{
- d_3_0_Core->f.VertexAttribI4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
- d_3_0_Core->f.VertexAttribI4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
-{
- d_3_0_Core->f.VertexAttribI4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
-{
- d_3_0_Core->f.VertexAttribI4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI3uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI2uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI1uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI3iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI2iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI1iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
- d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
- d_3_0_Core->f.VertexAttribI2ui(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
-{
- d_3_0_Core->f.VertexAttribI1ui(index, x);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
- d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
-{
- d_3_0_Core->f.VertexAttribI2i(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
-{
- d_3_0_Core->f.VertexAttribI1i(index, x);
-}
-
-
-// OpenGL 3.1 deprecated functions
-
-// OpenGL 3.2 deprecated functions
-
-// OpenGL 3.3 deprecated functions
-
-// OpenGL 4.0 deprecated functions
-
-// OpenGL 4.1 deprecated functions
-
-// OpenGL 4.2 deprecated functions
-
-// OpenGL 4.3 deprecated functions
-
-
-QT_END_NAMESPACE
-
-#ifdef Q_OS_WIN
-#pragma pop_macro("MemoryBarrier")
-#endif
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_3_core.cpp b/src/gui/opengl/qopenglfunctions_4_3_core.cpp
deleted file mode 100644
index 8a867471b8..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_3_core.cpp
+++ /dev/null
@@ -1,260 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_3_core.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_3_Core
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_4_3_Core class provides all functions for OpenGL 4.3 core profile.
-
- This class is a wrapper for functions from OpenGL 4.3 core profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_3_Core::QOpenGLFunctions_4_3_Core()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
- , d_4_1_Core(nullptr)
- , d_4_2_Core(nullptr)
- , d_4_3_Core(nullptr)
-{
-}
-
-QOpenGLFunctions_4_3_Core::~QOpenGLFunctions_4_3_Core()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
- if (d_4_1_Core) {
- d_4_1_Core->refs.deref();
- Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
- }
- if (d_4_2_Core) {
- d_4_2_Core->refs.deref();
- Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
- }
- if (d_4_3_Core) {
- d_4_3_Core->refs.deref();
- Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_3_Core::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_3_Core::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
- d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
- d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
- d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_3_Core::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 3))
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_3_Core::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 3);
- v.setProfile(QSurfaceFormat::CoreProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_3_core.h b/src/gui/opengl/qopenglfunctions_4_3_core.h
deleted file mode 100644
index 13675caf62..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_3_core.h
+++ /dev/null
@@ -1,3246 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_3_CORE_H
-#define QOPENGLVERSIONFUNCTIONS_4_3_CORE_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-// MemoryBarrier is a macro on some architectures on Windows
-#ifdef Q_OS_WIN
-#pragma push_macro("MemoryBarrier")
-#undef MemoryBarrier
-#endif
-
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_3_Core : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_3_Core();
- ~QOpenGLFunctions_4_3_Core();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *params);
- void glGetFloatv(GLenum pname, GLfloat *params);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *params);
- void glGetBooleanv(GLenum pname, GLboolean *params);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
- void glReadBuffer(GLenum mode);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum mode);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glGetPointerv(GLenum pname, GLvoid* *params);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
- void glBlendEquation(GLenum mode);
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- GLvoid* glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint index, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *params);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
- void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
- // OpenGL 4.1 core functions
- void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
- void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
- void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
- void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
- void glScissorIndexedv(GLuint index, const GLint *v);
- void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
- void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
- void glViewportIndexedfv(GLuint index, const GLfloat *v);
- void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
- void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
- void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
- void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- void glVertexAttribL4dv(GLuint index, const GLdouble *v);
- void glVertexAttribL3dv(GLuint index, const GLdouble *v);
- void glVertexAttribL2dv(GLuint index, const GLdouble *v);
- void glVertexAttribL1dv(GLuint index, const GLdouble *v);
- void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttribL1d(GLuint index, GLdouble x);
- void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glValidateProgramPipeline(GLuint pipeline);
- void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
- void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
- void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
- void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
- void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
- void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
- void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform1i(GLuint program, GLint location, GLint v0);
- void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- GLboolean glIsProgramPipeline(GLuint pipeline);
- void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
- void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- void glBindProgramPipeline(GLuint pipeline);
- GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
- void glActiveShaderProgram(GLuint pipeline, GLuint program);
- void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- void glProgramParameteri(GLuint program, GLenum pname, GLint value);
- void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
- void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
- void glClearDepthf(GLfloat dd);
- void glDepthRangef(GLfloat n, GLfloat f);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
- void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
- void glReleaseShaderCompiler();
-
- // OpenGL 4.2 core functions
- void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
- void glMemoryBarrier(GLbitfield barriers);
- void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
- void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
- void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
- void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
- void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
- void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
- void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
- void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
-
- // OpenGL 4.3 core functions
- void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
- GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
- GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
- void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
- GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
- void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
- void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
- void glInvalidateBufferData(GLuint buffer);
- void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
- void glInvalidateTexImage(GLuint texture, GLint level);
- void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
- void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
- void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
- void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
- void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
- void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
- void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
- void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
- void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
- void glDispatchComputeIndirect(GLintptr indirect);
- void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
- void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
- void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
- QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
- QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
- QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_3_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_3_Core::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetIntegerv(GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetFloatv(GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetFloatv(pname, params);
-}
-
-inline GLenum QOpenGLFunctions_4_3_Core::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetDoublev(GLenum pname, GLdouble *params)
-{
- d_1_0_Core->f.GetDoublev(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetBooleanv(GLenum pname, GLboolean *params)
-{
- d_1_0_Core->f.GetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glReadBuffer(GLenum mode)
-{
- d_1_0_Core->f.ReadBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_3_Core::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_3_Core::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawBuffer(GLenum mode)
-{
- d_1_0_Core->f.DrawBuffer(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline void QOpenGLFunctions_4_3_Core::glIndexubv(const GLubyte *c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glIndexub(GLubyte c)
-{
- Q_UNUSED(c);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetPointerv(GLenum pname, GLvoid* *params)
-{
- Q_UNUSED(pname);
- Q_UNUSED(params);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_3_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_3_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_3_Core::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_3_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline GLvoid* QOpenGLFunctions_4_3_Core::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_3_Core::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_3_Core::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Core::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Core::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline GLvoid* QOpenGLFunctions_4_3_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_3_Core::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_3_Core::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_3_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_3_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_3_Core::glSampleMaski(GLuint index, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(index, mask);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetInteger64v(GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetInteger64v(pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_3_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_3_Core::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glColorP4uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glColorP4ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glColorP3uiv(GLenum type, const GLuint *color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glColorP3ui(GLenum type, GLuint color)
-{
- Q_UNUSED(type);
- Q_UNUSED(color);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glNormalP3ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- Q_UNUSED(texture);
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- Q_UNUSED(type);
- Q_UNUSED(coords);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexP4ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexP3ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexP2ui(GLenum type, GLuint value)
-{
- Q_UNUSED(type);
- Q_UNUSED(value);
- QOPENGL_DEPRECATEDFUNCTION;
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_3_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_3_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_3_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-// OpenGL 4.1 core functions
-inline void QOpenGLFunctions_4_3_Core::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
-{
- d_4_1_Core->f.GetDoublei_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
-{
- d_4_1_Core->f.GetFloati_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
-{
- d_4_1_Core->f.DepthRangeIndexed(index, n, f);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
-{
- d_4_1_Core->f.DepthRangeArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glScissorIndexedv(GLuint index, const GLint *v)
-{
- d_4_1_Core->f.ScissorIndexedv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
-{
- d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
-{
- d_4_1_Core->f.ScissorArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glViewportIndexedfv(GLuint index, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportIndexedfv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
-{
- d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
- d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribL4dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribL3dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribL2dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribL1dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_4_1_Core->f.VertexAttribL2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribL1d(GLuint index, GLdouble x)
-{
- d_4_1_Core->f.VertexAttribL1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glValidateProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.ValidateProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
-{
- d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
-{
- d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
- d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
-{
- d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
- d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
- d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
-{
- d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
-{
- d_4_1_Core->f.ProgramUniform1d(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
-{
- d_4_1_Core->f.ProgramUniform1f(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramUniform1i(GLuint program, GLint location, GLint v0)
-{
- d_4_1_Core->f.ProgramUniform1i(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
- d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_3_Core::glIsProgramPipeline(GLuint pipeline)
-{
- return d_4_1_Core->f.IsProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_1_Core->f.GenProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
-{
- d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.BindProgramPipeline(pipeline);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Core::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
-{
- return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glActiveShaderProgram(GLuint pipeline, GLuint program)
-{
- d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
- d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramParameteri(GLuint program, GLenum pname, GLint value)
-{
- d_4_1_Core->f.ProgramParameteri(program, pname, value);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
-{
- d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClearDepthf(GLfloat dd)
-{
- d_4_1_Core->f.ClearDepthf(dd);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDepthRangef(GLfloat n, GLfloat f)
-{
- d_4_1_Core->f.DepthRangef(n, f);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
-{
- d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
-{
- d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glReleaseShaderCompiler()
-{
- d_4_1_Core->f.ReleaseShaderCompiler();
-}
-
-
-// OpenGL 4.2 core functions
-inline void QOpenGLFunctions_4_3_Core::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
-{
- d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMemoryBarrier(GLbitfield barriers)
-{
- d_4_2_Core->f.MemoryBarrier(barriers);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
-{
- d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
-{
- d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
-{
- d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
-}
-
-
-// OpenGL 4.3 core functions
-inline void QOpenGLFunctions_4_3_Core::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
-{
- d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
-}
-
-inline GLint QOpenGLFunctions_4_3_Core::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
-}
-
-inline GLint QOpenGLFunctions_4_3_Core::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
-{
- d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
-{
- d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
-}
-
-inline GLuint QOpenGLFunctions_4_3_Core::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
-{
- d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glInvalidateBufferData(GLuint buffer)
-{
- d_4_3_Core->f.InvalidateBufferData(buffer);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
-{
- d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glInvalidateTexImage(GLuint texture, GLint level)
-{
- d_4_3_Core->f.InvalidateTexImage(texture, level);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
-{
- d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_4_3_Core->f.FramebufferParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
-{
- d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
-{
- d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
-{
- d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
-{
- d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
-{
- d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDispatchComputeIndirect(GLintptr indirect)
-{
- d_4_3_Core->f.DispatchComputeIndirect(indirect);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
-{
- d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_3_Core::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
-}
-
-
-
-QT_END_NAMESPACE
-
-#ifdef Q_OS_WIN
-#pragma pop_macro("MemoryBarrier")
-#endif
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_4_compatibility.cpp b/src/gui/opengl/qopenglfunctions_4_4_compatibility.cpp
deleted file mode 100644
index 4fc4b50100..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_4_compatibility.cpp
+++ /dev/null
@@ -1,326 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_4_compatibility.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_4_Compatibility
- \inmodule QtGui
- \since 5.5
- \wrapper
- \brief The QOpenGLFunctions_4_4_Compatibility class provides all functions for OpenGL 4.4 compatibility profile.
-
- This class is a wrapper for functions from OpenGL 4.4 compatibility profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_4_Compatibility::QOpenGLFunctions_4_4_Compatibility()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
- , d_4_1_Core(nullptr)
- , d_4_2_Core(nullptr)
- , d_4_3_Core(nullptr)
- , d_4_4_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
- , d_3_3_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_4_4_Compatibility::~QOpenGLFunctions_4_4_Compatibility()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
- if (d_4_1_Core) {
- d_4_1_Core->refs.deref();
- Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
- }
- if (d_4_2_Core) {
- d_4_2_Core->refs.deref();
- Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
- }
- if (d_4_3_Core) {
- d_4_3_Core->refs.deref();
- Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
- }
- if (d_4_4_Core) {
- d_4_4_Core->refs.deref();
- Q_ASSERT(d_4_4_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
- if (d_3_3_Deprecated) {
- d_3_3_Deprecated->refs.deref();
- Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_4_Compatibility::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_4_Compatibility::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
- d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
- d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
- d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_4_CoreBackend::versionStatus());
- d_4_4_Core = static_cast<QOpenGLFunctions_4_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
- d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_4_Compatibility::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 4))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_4_Compatibility::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 4);
- v.setProfile(QSurfaceFormat::CompatibilityProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_4_compatibility.h b/src/gui/opengl/qopenglfunctions_4_4_compatibility.h
deleted file mode 100644
index 0acab349a1..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_4_compatibility.h
+++ /dev/null
@@ -1,5976 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_4_COMPATIBILITY_H
-#define QOPENGLVERSIONFUNCTIONS_4_4_COMPATIBILITY_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-// MemoryBarrier is a macro on some architectures on Windows
-#ifdef Q_OS_WIN
-#pragma push_macro("MemoryBarrier")
-#undef MemoryBarrier
-#endif
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_4_Compatibility : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_4_Compatibility();
- ~QOpenGLFunctions_4_4_Compatibility();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *data);
- void glGetFloatv(GLenum pname, GLfloat *data);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *data);
- void glGetBooleanv(GLenum pname, GLboolean *data);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
- void glReadBuffer(GLenum src);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum buf);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glBlendEquation(GLenum mode);
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, void *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, void * *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- void * glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
- void glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- void * glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glVertexAttribI4usv(GLuint index, const GLushort *v);
- void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
- void glVertexAttribI4sv(GLuint index, const GLshort *v);
- void glVertexAttribI4bv(GLuint index, const GLbyte *v);
- void glVertexAttribI4uiv(GLuint index, const GLuint *v);
- void glVertexAttribI3uiv(GLuint index, const GLuint *v);
- void glVertexAttribI2uiv(GLuint index, const GLuint *v);
- void glVertexAttribI1uiv(GLuint index, const GLuint *v);
- void glVertexAttribI4iv(GLuint index, const GLint *v);
- void glVertexAttribI3iv(GLuint index, const GLint *v);
- void glVertexAttribI2iv(GLuint index, const GLint *v);
- void glVertexAttribI1iv(GLuint index, const GLint *v);
- void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
- void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
- void glVertexAttribI1ui(GLuint index, GLuint x);
- void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
- void glVertexAttribI2i(GLuint index, GLint x, GLint y);
- void glVertexAttribI1i(GLuint index, GLint x);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices);
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint maskNumber, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *data);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
- void glDrawArraysIndirect(GLenum mode, const void *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
- // OpenGL 4.1 core functions
- void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
- void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
- void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
- void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
- void glScissorIndexedv(GLuint index, const GLint *v);
- void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
- void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
- void glViewportIndexedfv(GLuint index, const GLfloat *v);
- void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
- void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
- void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
- void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glVertexAttribL4dv(GLuint index, const GLdouble *v);
- void glVertexAttribL3dv(GLuint index, const GLdouble *v);
- void glVertexAttribL2dv(GLuint index, const GLdouble *v);
- void glVertexAttribL1dv(GLuint index, const GLdouble *v);
- void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttribL1d(GLuint index, GLdouble x);
- void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glValidateProgramPipeline(GLuint pipeline);
- void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
- void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
- void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
- void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
- void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
- void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
- void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform1i(GLuint program, GLint location, GLint v0);
- void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- GLboolean glIsProgramPipeline(GLuint pipeline);
- void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
- void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- void glBindProgramPipeline(GLuint pipeline);
- GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
- void glActiveShaderProgram(GLuint pipeline, GLuint program);
- void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- void glProgramParameteri(GLuint program, GLenum pname, GLint value);
- void glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
- void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
- void glClearDepthf(GLfloat dd);
- void glDepthRangef(GLfloat n, GLfloat f);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
- void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
- void glReleaseShaderCompiler();
-
- // OpenGL 4.2 core functions
- void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
- void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
- void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
- void glMemoryBarrier(GLbitfield barriers);
- void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
- void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
- void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
- void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
- void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
- void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
-
- // OpenGL 4.3 core functions
- void glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
- void glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
- void glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
- void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
- void glPopDebugGroup();
- void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message);
- GLuint glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
- void glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
- void glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
- void glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
- void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
- void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
- void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
- void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
- void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
- void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
- GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
- GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
- void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
- GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
- void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
- void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
- void glInvalidateBufferData(GLuint buffer);
- void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
- void glInvalidateTexImage(GLuint texture, GLint level);
- void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
- void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
- void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
- void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
- void glDispatchComputeIndirect(GLintptr indirect);
- void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
- void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
- void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
-
- // OpenGL 4.4 core functions
- void glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
- void glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures);
- void glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers);
- void glBindTextures(GLuint first, GLsizei count, const GLuint *textures);
- void glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);
- void glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers);
- void glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
- void glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
- void glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const void *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const void *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const void *pointer);
- void glGetPointerv(GLenum pname, void * *params);
- void glIndexPointer(GLenum type, GLsizei stride, const void *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const void *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, void *table);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, void *image);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glResetHistogram(GLenum target);
- void glResetMinmax(GLenum target);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const void *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
- // OpenGL 2.0 deprecated functions
-
- // OpenGL 2.1 deprecated functions
-
- // OpenGL 3.0 deprecated functions
-
- // OpenGL 3.1 deprecated functions
-
- // OpenGL 3.2 deprecated functions
-
- // OpenGL 3.3 deprecated functions
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
-
- // OpenGL 4.0 deprecated functions
-
- // OpenGL 4.1 deprecated functions
-
- // OpenGL 4.2 deprecated functions
-
- // OpenGL 4.3 deprecated functions
-
- // OpenGL 4.4 deprecated functions
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
- QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
- QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
- QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
- QOpenGLFunctions_4_4_CoreBackend* d_4_4_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
- QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_4_Compatibility::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetIntegerv(GLenum pname, GLint *data)
-{
- d_1_0_Core->f.GetIntegerv(pname, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetFloatv(GLenum pname, GLfloat *data)
-{
- d_1_0_Core->f.GetFloatv(pname, data);
-}
-
-inline GLenum QOpenGLFunctions_4_4_Compatibility::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetDoublev(GLenum pname, GLdouble *data)
-{
- d_1_0_Core->f.GetDoublev(pname, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetBooleanv(GLenum pname, GLboolean *data)
-{
- d_1_0_Core->f.GetBooleanv(pname, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glReadBuffer(GLenum src)
-{
- d_1_0_Core->f.ReadBuffer(src);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawBuffer(GLenum buf)
-{
- d_1_0_Core->f.DrawBuffer(buf);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, void *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, void * *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline void * QOpenGLFunctions_4_4_Compatibility::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_4_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_4_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, shaders);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Compatibility::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Compatibility::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline void * QOpenGLFunctions_4_4_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_4_Compatibility::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_4_Compatibility::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_4_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
-{
- d_3_0_Core->f.VertexAttribI4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
- d_3_0_Core->f.VertexAttribI4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
-{
- d_3_0_Core->f.VertexAttribI4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
-{
- d_3_0_Core->f.VertexAttribI4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI3uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI2uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI1uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI3iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI2iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI1iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
- d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
- d_3_0_Core->f.VertexAttribI2ui(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
-{
- d_3_0_Core->f.VertexAttribI1ui(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
- d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
-{
- d_3_0_Core->f.VertexAttribI2i(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
-{
- d_3_0_Core->f.VertexAttribI1i(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glSampleMaski(GLuint maskNumber, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(maskNumber, mask);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetInteger64v(GLenum pname, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64v(pname, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_4_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_4_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_4_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_4_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawArraysIndirect(GLenum mode, const void *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-// OpenGL 4.1 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
-{
- d_4_1_Core->f.GetDoublei_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
-{
- d_4_1_Core->f.GetFloati_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
-{
- d_4_1_Core->f.DepthRangeIndexed(index, n, f);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
-{
- d_4_1_Core->f.DepthRangeArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glScissorIndexedv(GLuint index, const GLint *v)
-{
- d_4_1_Core->f.ScissorIndexedv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
-{
- d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
-{
- d_4_1_Core->f.ScissorArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glViewportIndexedfv(GLuint index, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportIndexedfv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
-{
- d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL4dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL3dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL2dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL1dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_4_1_Core->f.VertexAttribL2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL1d(GLuint index, GLdouble x)
-{
- d_4_1_Core->f.VertexAttribL1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glValidateProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.ValidateProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
-{
- d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
-{
- d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
- d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
-{
- d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
- d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
- d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
-{
- d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
-{
- d_4_1_Core->f.ProgramUniform1d(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
-{
- d_4_1_Core->f.ProgramUniform1f(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1i(GLuint program, GLint location, GLint v0)
-{
- d_4_1_Core->f.ProgramUniform1i(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
- d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsProgramPipeline(GLuint pipeline)
-{
- return d_4_1_Core->f.IsProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_1_Core->f.GenProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
-{
- d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.BindProgramPipeline(pipeline);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Compatibility::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
-{
- return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glActiveShaderProgram(GLuint pipeline, GLuint program)
-{
- d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
- d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramParameteri(GLuint program, GLenum pname, GLint value)
-{
- d_4_1_Core->f.ProgramParameteri(program, pname, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
-{
- d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
-{
- d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearDepthf(GLfloat dd)
-{
- d_4_1_Core->f.ClearDepthf(dd);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDepthRangef(GLfloat n, GLfloat f)
-{
- d_4_1_Core->f.DepthRangef(n, f);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
-{
- d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length)
-{
- d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glReleaseShaderCompiler()
-{
- d_4_1_Core->f.ReleaseShaderCompiler();
-}
-
-
-// OpenGL 4.2 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
-{
- d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMemoryBarrier(GLbitfield barriers)
-{
- d_4_2_Core->f.MemoryBarrier(barriers);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
-{
- d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
-{
- d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
-{
- d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
-}
-
-
-// OpenGL 4.3 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
- d_4_3_Core->f.GetObjectPtrLabel(ptr, bufSize, length, label);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
-{
- d_4_3_Core->f.ObjectPtrLabel(ptr, length, label);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
- d_4_3_Core->f.GetObjectLabel(identifier, name, bufSize, length, label);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
-{
- d_4_3_Core->f.ObjectLabel(identifier, name, length, label);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPopDebugGroup()
-{
- d_4_3_Core->f.PopDebugGroup();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
-{
- d_4_3_Core->f.PushDebugGroup(source, id, length, message);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Compatibility::glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)
-{
- return d_4_3_Core->f.GetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
-{
- d_4_3_Core->f.DebugMessageCallback(callback, userParam);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)
-{
- d_4_3_Core->f.DebugMessageInsert(source, type, id, severity, length, buf);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)
-{
- d_4_3_Core->f.DebugMessageControl(source, type, severity, count, ids, enabled);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
-{
- d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
-{
- d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
-{
- d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
-{
- d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
-{
- d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
-}
-
-inline GLint QOpenGLFunctions_4_4_Compatibility::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
-}
-
-inline GLint QOpenGLFunctions_4_4_Compatibility::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
-{
- d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
-{
- d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Compatibility::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
-{
- d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateBufferData(GLuint buffer)
-{
- d_4_3_Core->f.InvalidateBufferData(buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
-{
- d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateTexImage(GLuint texture, GLint level)
-{
- d_4_3_Core->f.InvalidateTexImage(texture, level);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
-{
- d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_4_3_Core->f.FramebufferParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
-{
- d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDispatchComputeIndirect(GLintptr indirect)
-{
- d_4_3_Core->f.DispatchComputeIndirect(indirect);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
-{
- d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
-}
-
-
-// OpenGL 4.4 core functions
-inline void QOpenGLFunctions_4_4_Compatibility::glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
-{
- d_4_4_Core->f.BindVertexBuffers(first, count, buffers, offsets, strides);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
-{
- d_4_4_Core->f.BindImageTextures(first, count, textures);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
-{
- d_4_4_Core->f.BindSamplers(first, count, samplers);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindTextures(GLuint first, GLsizei count, const GLuint *textures)
-{
- d_4_4_Core->f.BindTextures(first, count, textures);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes)
-{
- d_4_4_Core->f.BindBuffersRange(target, first, count, buffers, offsets, sizes);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers)
-{
- d_4_4_Core->f.BindBuffersBase(target, first, count, buffers);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
-{
- d_4_4_Core->f.ClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
-{
- d_4_4_Core->f.ClearTexImage(texture, level, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
-{
- d_4_4_Core->f.BufferStorage(target, size, data, flags);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_4_4_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_4_4_Compatibility::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Compatibility::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCallLists(GLsizei n, GLenum type, const void *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_4_4_Compatibility::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetPointerv(GLenum pname, void * *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glEdgeFlagPointer(GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_4_4_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, void *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, void *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, void *row, void *column, void *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_4_4_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-// OpenGL 2.0 deprecated functions
-
-// OpenGL 2.1 deprecated functions
-
-// OpenGL 3.0 deprecated functions
-
-// OpenGL 3.1 deprecated functions
-
-// OpenGL 3.2 deprecated functions
-
-// OpenGL 3.3 deprecated functions
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP4uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColorP4ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP4ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.NormalP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.NormalP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP4uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexP4ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP4ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP3uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexP3ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP3ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP2uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_4_Compatibility::glVertexP2ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP2ui(type, value);
-}
-
-
-// OpenGL 4.0 deprecated functions
-
-// OpenGL 4.1 deprecated functions
-
-// OpenGL 4.2 deprecated functions
-
-// OpenGL 4.3 deprecated functions
-
-// OpenGL 4.4 deprecated functions
-
-
-QT_END_NAMESPACE
-
-#ifdef Q_OS_WIN
-#pragma pop_macro("MemoryBarrier")
-#endif
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_4_core.cpp b/src/gui/opengl/qopenglfunctions_4_4_core.cpp
deleted file mode 100644
index 6169c7f455..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_4_core.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_4_core.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_4_Core
- \inmodule QtGui
- \since 5.5
- \wrapper
- \brief The QOpenGLFunctions_4_4_Core class provides all functions for OpenGL 4.4 core profile.
-
- This class is a wrapper for functions from OpenGL 4.4 core profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_4_Core::QOpenGLFunctions_4_4_Core()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
- , d_4_1_Core(nullptr)
- , d_4_2_Core(nullptr)
- , d_4_3_Core(nullptr)
- , d_4_4_Core(nullptr)
-{
-}
-
-QOpenGLFunctions_4_4_Core::~QOpenGLFunctions_4_4_Core()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
- if (d_4_1_Core) {
- d_4_1_Core->refs.deref();
- Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
- }
- if (d_4_2_Core) {
- d_4_2_Core->refs.deref();
- Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
- }
- if (d_4_3_Core) {
- d_4_3_Core->refs.deref();
- Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
- }
- if (d_4_4_Core) {
- d_4_4_Core->refs.deref();
- Q_ASSERT(d_4_4_Core->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_4_Core::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_4_Core::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
- d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
- d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
- d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_4_CoreBackend::versionStatus());
- d_4_4_Core = static_cast<QOpenGLFunctions_4_4_CoreBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_4_Core::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 4))
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_4_Core::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 4);
- v.setProfile(QSurfaceFormat::CoreProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_4_core.h b/src/gui/opengl/qopenglfunctions_4_4_core.h
deleted file mode 100644
index 1ad6f40214..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_4_core.h
+++ /dev/null
@@ -1,3430 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_4_CORE_H
-#define QOPENGLVERSIONFUNCTIONS_4_4_CORE_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-// MemoryBarrier is a macro on some architectures on Windows
-#ifdef Q_OS_WIN
-#pragma push_macro("MemoryBarrier")
-#undef MemoryBarrier
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_4_Core : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_4_Core();
- ~QOpenGLFunctions_4_4_Core();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *data);
- void glGetFloatv(GLenum pname, GLfloat *data);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *data);
- void glGetBooleanv(GLenum pname, GLboolean *data);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
- void glReadBuffer(GLenum src);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum buf);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glBlendEquation(GLenum mode);
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, void *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, void * *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- void * glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
- void glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- void * glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glVertexAttribI4usv(GLuint index, const GLushort *v);
- void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
- void glVertexAttribI4sv(GLuint index, const GLshort *v);
- void glVertexAttribI4bv(GLuint index, const GLbyte *v);
- void glVertexAttribI4uiv(GLuint index, const GLuint *v);
- void glVertexAttribI3uiv(GLuint index, const GLuint *v);
- void glVertexAttribI2uiv(GLuint index, const GLuint *v);
- void glVertexAttribI1uiv(GLuint index, const GLuint *v);
- void glVertexAttribI4iv(GLuint index, const GLint *v);
- void glVertexAttribI3iv(GLuint index, const GLint *v);
- void glVertexAttribI2iv(GLuint index, const GLint *v);
- void glVertexAttribI1iv(GLuint index, const GLint *v);
- void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
- void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
- void glVertexAttribI1ui(GLuint index, GLuint x);
- void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
- void glVertexAttribI2i(GLuint index, GLint x, GLint y);
- void glVertexAttribI1i(GLuint index, GLint x);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices);
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint maskNumber, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *data);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
- void glDrawArraysIndirect(GLenum mode, const void *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
- // OpenGL 4.1 core functions
- void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
- void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
- void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
- void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
- void glScissorIndexedv(GLuint index, const GLint *v);
- void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
- void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
- void glViewportIndexedfv(GLuint index, const GLfloat *v);
- void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
- void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
- void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
- void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glVertexAttribL4dv(GLuint index, const GLdouble *v);
- void glVertexAttribL3dv(GLuint index, const GLdouble *v);
- void glVertexAttribL2dv(GLuint index, const GLdouble *v);
- void glVertexAttribL1dv(GLuint index, const GLdouble *v);
- void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttribL1d(GLuint index, GLdouble x);
- void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glValidateProgramPipeline(GLuint pipeline);
- void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
- void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
- void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
- void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
- void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
- void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
- void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform1i(GLuint program, GLint location, GLint v0);
- void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- GLboolean glIsProgramPipeline(GLuint pipeline);
- void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
- void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- void glBindProgramPipeline(GLuint pipeline);
- GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
- void glActiveShaderProgram(GLuint pipeline, GLuint program);
- void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- void glProgramParameteri(GLuint program, GLenum pname, GLint value);
- void glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
- void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
- void glClearDepthf(GLfloat dd);
- void glDepthRangef(GLfloat n, GLfloat f);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
- void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
- void glReleaseShaderCompiler();
-
- // OpenGL 4.2 core functions
- void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
- void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
- void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
- void glMemoryBarrier(GLbitfield barriers);
- void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
- void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
- void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
- void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
- void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
- void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
-
- // OpenGL 4.3 core functions
- void glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
- void glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
- void glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
- void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
- void glPopDebugGroup();
- void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message);
- GLuint glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
- void glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
- void glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
- void glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
- void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
- void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
- void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
- void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
- void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
- void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
- GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
- GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
- void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
- GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
- void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
- void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
- void glInvalidateBufferData(GLuint buffer);
- void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
- void glInvalidateTexImage(GLuint texture, GLint level);
- void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
- void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
- void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
- void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
- void glDispatchComputeIndirect(GLintptr indirect);
- void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
- void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
- void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
-
- // OpenGL 4.4 core functions
- void glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
- void glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures);
- void glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers);
- void glBindTextures(GLuint first, GLsizei count, const GLuint *textures);
- void glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);
- void glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers);
- void glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
- void glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
- void glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
- QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
- QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
- QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
- QOpenGLFunctions_4_4_CoreBackend* d_4_4_Core;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_4_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_4_Core::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetIntegerv(GLenum pname, GLint *data)
-{
- d_1_0_Core->f.GetIntegerv(pname, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetFloatv(GLenum pname, GLfloat *data)
-{
- d_1_0_Core->f.GetFloatv(pname, data);
-}
-
-inline GLenum QOpenGLFunctions_4_4_Core::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetDoublev(GLenum pname, GLdouble *data)
-{
- d_1_0_Core->f.GetDoublev(pname, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetBooleanv(GLenum pname, GLboolean *data)
-{
- d_1_0_Core->f.GetBooleanv(pname, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glReadBuffer(GLenum src)
-{
- d_1_0_Core->f.ReadBuffer(src);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_4_Core::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_4_Core::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawBuffer(GLenum buf)
-{
- d_1_0_Core->f.DrawBuffer(buf);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_4_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_4_Core::glGetCompressedTexImage(GLenum target, GLint level, void *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_4_Core::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_4_Core::glGetBufferPointerv(GLenum target, GLenum pname, void * *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline void * QOpenGLFunctions_4_4_Core::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_4_Core::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_4_Core::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, shaders);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Core::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Core::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline void * QOpenGLFunctions_4_4_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_4_Core::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_4_Core::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_4_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4usv(GLuint index, const GLushort *v)
-{
- d_3_0_Core->f.VertexAttribI4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
- d_3_0_Core->f.VertexAttribI4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4sv(GLuint index, const GLshort *v)
-{
- d_3_0_Core->f.VertexAttribI4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4bv(GLuint index, const GLbyte *v)
-{
- d_3_0_Core->f.VertexAttribI4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI3uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI3uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI2uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI2uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI1uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI1uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI3iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI3iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI2iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI2iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI1iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI1iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
- d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
- d_3_0_Core->f.VertexAttribI2ui(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI1ui(GLuint index, GLuint x)
-{
- d_3_0_Core->f.VertexAttribI1ui(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
- d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI2i(GLuint index, GLint x, GLint y)
-{
- d_3_0_Core->f.VertexAttribI2i(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribI1i(GLuint index, GLint x)
-{
- d_3_0_Core->f.VertexAttribI1i(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_4_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_4_Core::glSampleMaski(GLuint maskNumber, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(maskNumber, mask);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetInteger64v(GLenum pname, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64v(pname, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_4_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_4_Core::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_4_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_4_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_4_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawArraysIndirect(GLenum mode, const void *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-// OpenGL 4.1 core functions
-inline void QOpenGLFunctions_4_4_Core::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
-{
- d_4_1_Core->f.GetDoublei_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
-{
- d_4_1_Core->f.GetFloati_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
-{
- d_4_1_Core->f.DepthRangeIndexed(index, n, f);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
-{
- d_4_1_Core->f.DepthRangeArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glScissorIndexedv(GLuint index, const GLint *v)
-{
- d_4_1_Core->f.ScissorIndexedv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
-{
- d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
-{
- d_4_1_Core->f.ScissorArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glViewportIndexedfv(GLuint index, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportIndexedfv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
-{
- d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribL4dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribL3dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribL2dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribL1dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_4_1_Core->f.VertexAttribL2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribL1d(GLuint index, GLdouble x)
-{
- d_4_1_Core->f.VertexAttribL1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glValidateProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.ValidateProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
-{
- d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
-{
- d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
- d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
-{
- d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
- d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
- d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
-{
- d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
-{
- d_4_1_Core->f.ProgramUniform1d(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
-{
- d_4_1_Core->f.ProgramUniform1f(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramUniform1i(GLuint program, GLint location, GLint v0)
-{
- d_4_1_Core->f.ProgramUniform1i(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
- d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_4_Core::glIsProgramPipeline(GLuint pipeline)
-{
- return d_4_1_Core->f.IsProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_1_Core->f.GenProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
-{
- d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.BindProgramPipeline(pipeline);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Core::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
-{
- return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glActiveShaderProgram(GLuint pipeline, GLuint program)
-{
- d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
- d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramParameteri(GLuint program, GLenum pname, GLint value)
-{
- d_4_1_Core->f.ProgramParameteri(program, pname, value);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
-{
- d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
-{
- d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearDepthf(GLfloat dd)
-{
- d_4_1_Core->f.ClearDepthf(dd);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDepthRangef(GLfloat n, GLfloat f)
-{
- d_4_1_Core->f.DepthRangef(n, f);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
-{
- d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length)
-{
- d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glReleaseShaderCompiler()
-{
- d_4_1_Core->f.ReleaseShaderCompiler();
-}
-
-
-// OpenGL 4.2 core functions
-inline void QOpenGLFunctions_4_4_Core::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
-{
- d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glMemoryBarrier(GLbitfield barriers)
-{
- d_4_2_Core->f.MemoryBarrier(barriers);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
-{
- d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
-{
- d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
-{
- d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
-}
-
-
-// OpenGL 4.3 core functions
-inline void QOpenGLFunctions_4_4_Core::glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
- d_4_3_Core->f.GetObjectPtrLabel(ptr, bufSize, length, label);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
-{
- d_4_3_Core->f.ObjectPtrLabel(ptr, length, label);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
- d_4_3_Core->f.GetObjectLabel(identifier, name, bufSize, length, label);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
-{
- d_4_3_Core->f.ObjectLabel(identifier, name, length, label);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPopDebugGroup()
-{
- d_4_3_Core->f.PopDebugGroup();
-}
-
-inline void QOpenGLFunctions_4_4_Core::glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
-{
- d_4_3_Core->f.PushDebugGroup(source, id, length, message);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Core::glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)
-{
- return d_4_3_Core->f.GetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
-{
- d_4_3_Core->f.DebugMessageCallback(callback, userParam);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)
-{
- d_4_3_Core->f.DebugMessageInsert(source, type, id, severity, length, buf);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)
-{
- d_4_3_Core->f.DebugMessageControl(source, type, severity, count, ids, enabled);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
-{
- d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
-{
- d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
-{
- d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
-{
- d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
-{
- d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
-}
-
-inline GLint QOpenGLFunctions_4_4_Core::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
-}
-
-inline GLint QOpenGLFunctions_4_4_Core::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
-{
- d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
-{
- d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
-}
-
-inline GLuint QOpenGLFunctions_4_4_Core::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
-{
- d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glInvalidateBufferData(GLuint buffer)
-{
- d_4_3_Core->f.InvalidateBufferData(buffer);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
-{
- d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glInvalidateTexImage(GLuint texture, GLint level)
-{
- d_4_3_Core->f.InvalidateTexImage(texture, level);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
-{
- d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_4_3_Core->f.FramebufferParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
-{
- d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDispatchComputeIndirect(GLintptr indirect)
-{
- d_4_3_Core->f.DispatchComputeIndirect(indirect);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
-{
- d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
-}
-
-
-// OpenGL 4.4 core functions
-inline void QOpenGLFunctions_4_4_Core::glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
-{
- d_4_4_Core->f.BindVertexBuffers(first, count, buffers, offsets, strides);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
-{
- d_4_4_Core->f.BindImageTextures(first, count, textures);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
-{
- d_4_4_Core->f.BindSamplers(first, count, samplers);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindTextures(GLuint first, GLsizei count, const GLuint *textures)
-{
- d_4_4_Core->f.BindTextures(first, count, textures);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes)
-{
- d_4_4_Core->f.BindBuffersRange(target, first, count, buffers, offsets, sizes);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers)
-{
- d_4_4_Core->f.BindBuffersBase(target, first, count, buffers);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
-{
- d_4_4_Core->f.ClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
-{
- d_4_4_Core->f.ClearTexImage(texture, level, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_4_Core::glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
-{
- d_4_4_Core->f.BufferStorage(target, size, data, flags);
-}
-
-
-
-QT_END_NAMESPACE
-
-#ifdef Q_OS_WIN
-#pragma pop_macro("MemoryBarrier")
-#endif
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_5_compatibility.cpp b/src/gui/opengl/qopenglfunctions_4_5_compatibility.cpp
deleted file mode 100644
index 02af443498..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_5_compatibility.cpp
+++ /dev/null
@@ -1,344 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_5_compatibility.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_5_Compatibility
- \inmodule QtGui
- \since 5.5
- \wrapper
- \brief The QOpenGLFunctions_4_5_Compatibility class provides all functions for OpenGL 4.5 compatibility profile.
-
- This class is a wrapper for functions from OpenGL 4.5 compatibility profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_5_Compatibility::QOpenGLFunctions_4_5_Compatibility()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
- , d_4_1_Core(nullptr)
- , d_4_2_Core(nullptr)
- , d_4_3_Core(nullptr)
- , d_4_4_Core(nullptr)
- , d_4_5_Core(nullptr)
- , d_1_0_Deprecated(nullptr)
- , d_1_1_Deprecated(nullptr)
- , d_1_2_Deprecated(nullptr)
- , d_1_3_Deprecated(nullptr)
- , d_1_4_Deprecated(nullptr)
- , d_3_3_Deprecated(nullptr)
- , d_4_5_Deprecated(nullptr)
-{
-}
-
-QOpenGLFunctions_4_5_Compatibility::~QOpenGLFunctions_4_5_Compatibility()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
- if (d_4_1_Core) {
- d_4_1_Core->refs.deref();
- Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
- }
- if (d_4_2_Core) {
- d_4_2_Core->refs.deref();
- Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
- }
- if (d_4_3_Core) {
- d_4_3_Core->refs.deref();
- Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
- }
- if (d_4_4_Core) {
- d_4_4_Core->refs.deref();
- Q_ASSERT(d_4_4_Core->refs.loadRelaxed());
- }
- if (d_4_5_Core) {
- d_4_5_Core->refs.deref();
- Q_ASSERT(d_4_5_Core->refs.loadRelaxed());
- }
- if (d_1_0_Deprecated) {
- d_1_0_Deprecated->refs.deref();
- Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
- }
- if (d_1_1_Deprecated) {
- d_1_1_Deprecated->refs.deref();
- Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
- }
- if (d_1_2_Deprecated) {
- d_1_2_Deprecated->refs.deref();
- Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
- }
- if (d_1_3_Deprecated) {
- d_1_3_Deprecated->refs.deref();
- Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
- }
- if (d_1_4_Deprecated) {
- d_1_4_Deprecated->refs.deref();
- Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
- }
- if (d_3_3_Deprecated) {
- d_3_3_Deprecated->refs.deref();
- Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
- }
- if (d_4_5_Deprecated) {
- d_4_5_Deprecated->refs.deref();
- Q_ASSERT(d_4_5_Deprecated->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_5_Compatibility::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_5_Compatibility::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
- d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
- d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
- d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_4_CoreBackend::versionStatus());
- d_4_4_Core = static_cast<QOpenGLFunctions_4_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_5_CoreBackend::versionStatus());
- d_4_5_Core = static_cast<QOpenGLFunctions_4_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
- d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
- d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
- d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
- d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
- d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
- d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_5_DeprecatedBackend::versionStatus());
- d_4_5_Deprecated = static_cast<QOpenGLFunctions_4_5_DeprecatedBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_5_Compatibility::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 5))
- return false;
-
- if (f.profile() == QSurfaceFormat::CoreProfile)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_5_Compatibility::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 5);
- v.setProfile(QSurfaceFormat::CompatibilityProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_5_compatibility.h b/src/gui/opengl/qopenglfunctions_4_5_compatibility.h
deleted file mode 100644
index 9d9d14548b..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_5_compatibility.h
+++ /dev/null
@@ -1,6694 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_5_COMPATIBILITY_H
-#define QOPENGLVERSIONFUNCTIONS_4_5_COMPATIBILITY_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-// MemoryBarrier is a macro on some architectures on Windows
-#ifdef Q_OS_WIN
-#pragma push_macro("MemoryBarrier")
-#undef MemoryBarrier
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_5_Compatibility : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_5_Compatibility();
- ~QOpenGLFunctions_4_5_Compatibility();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *data);
- void glGetFloatv(GLenum pname, GLfloat *data);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *data);
- void glGetBooleanv(GLenum pname, GLboolean *data);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
- void glReadBuffer(GLenum src);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum buf);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glBlendEquation(GLenum mode);
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, void *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, void * *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- void * glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
- void glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- void * glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glVertexAttribI4usv(GLuint index, const GLushort *v);
- void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
- void glVertexAttribI4sv(GLuint index, const GLshort *v);
- void glVertexAttribI4bv(GLuint index, const GLbyte *v);
- void glVertexAttribI4uiv(GLuint index, const GLuint *v);
- void glVertexAttribI3uiv(GLuint index, const GLuint *v);
- void glVertexAttribI2uiv(GLuint index, const GLuint *v);
- void glVertexAttribI1uiv(GLuint index, const GLuint *v);
- void glVertexAttribI4iv(GLuint index, const GLint *v);
- void glVertexAttribI3iv(GLuint index, const GLint *v);
- void glVertexAttribI2iv(GLuint index, const GLint *v);
- void glVertexAttribI1iv(GLuint index, const GLint *v);
- void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
- void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
- void glVertexAttribI1ui(GLuint index, GLuint x);
- void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
- void glVertexAttribI2i(GLuint index, GLint x, GLint y);
- void glVertexAttribI1i(GLuint index, GLint x);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices);
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint maskNumber, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *data);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
- void glDrawArraysIndirect(GLenum mode, const void *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
- // OpenGL 4.1 core functions
- void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
- void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
- void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
- void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
- void glScissorIndexedv(GLuint index, const GLint *v);
- void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
- void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
- void glViewportIndexedfv(GLuint index, const GLfloat *v);
- void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
- void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
- void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
- void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glVertexAttribL4dv(GLuint index, const GLdouble *v);
- void glVertexAttribL3dv(GLuint index, const GLdouble *v);
- void glVertexAttribL2dv(GLuint index, const GLdouble *v);
- void glVertexAttribL1dv(GLuint index, const GLdouble *v);
- void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttribL1d(GLuint index, GLdouble x);
- void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glValidateProgramPipeline(GLuint pipeline);
- void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
- void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
- void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
- void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
- void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
- void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
- void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform1i(GLuint program, GLint location, GLint v0);
- void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- GLboolean glIsProgramPipeline(GLuint pipeline);
- void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
- void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- void glBindProgramPipeline(GLuint pipeline);
- GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
- void glActiveShaderProgram(GLuint pipeline, GLuint program);
- void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- void glProgramParameteri(GLuint program, GLenum pname, GLint value);
- void glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
- void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
- void glClearDepthf(GLfloat dd);
- void glDepthRangef(GLfloat n, GLfloat f);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
- void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
- void glReleaseShaderCompiler();
-
- // OpenGL 4.2 core functions
- void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
- void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
- void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
- void glMemoryBarrier(GLbitfield barriers);
- void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
- void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
- void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
- void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
- void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
- void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
-
- // OpenGL 4.3 core functions
- void glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
- void glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
- void glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
- void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
- void glPopDebugGroup();
- void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message);
- GLuint glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
- void glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
- void glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
- void glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
- void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
- void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
- void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
- void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
- void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
- void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
- GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
- GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
- void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
- GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
- void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
- void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
- void glInvalidateBufferData(GLuint buffer);
- void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
- void glInvalidateTexImage(GLuint texture, GLint level);
- void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
- void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
- void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
- void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
- void glDispatchComputeIndirect(GLintptr indirect);
- void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
- void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
- void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
-
- // OpenGL 4.4 core functions
- void glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
- void glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures);
- void glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers);
- void glBindTextures(GLuint first, GLsizei count, const GLuint *textures);
- void glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);
- void glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers);
- void glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
- void glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
- void glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
-
- // OpenGL 4.5 core functions
- void glTextureBarrier();
- void glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
- void glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params);
- void glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params);
- void glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
- void glGetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params);
- void glGetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
- void glGetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels);
- GLenum glGetGraphicsResetStatus();
- void glGetCompressedTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels);
- void glGetTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
- void glMemoryBarrierByRegion(GLbitfield barriers);
- void glCreateQueries(GLenum target, GLsizei n, GLuint *ids);
- void glCreateProgramPipelines(GLsizei n, GLuint *pipelines);
- void glCreateSamplers(GLsizei n, GLuint *samplers);
- void glGetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64 *param);
- void glGetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint *param);
- void glGetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param);
- void glVertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor);
- void glVertexArrayAttribLFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexArrayAttribIFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexArrayAttribFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
- void glVertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex);
- void glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
- void glVertexArrayVertexBuffer(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
- void glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer);
- void glEnableVertexArrayAttrib(GLuint vaobj, GLuint index);
- void glDisableVertexArrayAttrib(GLuint vaobj, GLuint index);
- void glCreateVertexArrays(GLsizei n, GLuint *arrays);
- void glGetTextureParameteriv(GLuint texture, GLenum pname, GLint *params);
- void glGetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params);
- void glGetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params);
- void glGetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params);
- void glGetTextureLevelParameteriv(GLuint texture, GLint level, GLenum pname, GLint *params);
- void glGetTextureLevelParameterfv(GLuint texture, GLint level, GLenum pname, GLfloat *params);
- void glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, void *pixels);
- void glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
- void glBindTextureUnit(GLuint unit, GLuint texture);
- void glGenerateTextureMipmap(GLuint texture);
- void glTextureParameteriv(GLuint texture, GLenum pname, const GLint *param);
- void glTextureParameterIuiv(GLuint texture, GLenum pname, const GLuint *params);
- void glTextureParameterIiv(GLuint texture, GLenum pname, const GLint *params);
- void glTextureParameteri(GLuint texture, GLenum pname, GLint param);
- void glTextureParameterfv(GLuint texture, GLenum pname, const GLfloat *param);
- void glTextureParameterf(GLuint texture, GLenum pname, GLfloat param);
- void glCopyTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
- void glTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
- void glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
- void glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
- void glTextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glTextureStorage3D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- void glTextureStorage2D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- void glTextureStorage1D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);
- void glTextureBufferRange(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size);
- void glTextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer);
- void glCreateTextures(GLenum target, GLsizei n, GLuint *textures);
- void glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params);
- void glNamedRenderbufferStorageMultisample(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glNamedRenderbufferStorage(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);
- void glCreateRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params);
- void glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param);
- GLenum glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target);
- void glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil);
- void glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value);
- void glInvalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
- void glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments);
- void glNamedFramebufferReadBuffer(GLuint framebuffer, GLenum src);
- void glNamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum *bufs);
- void glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf);
- void glNamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);
- void glNamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param);
- void glNamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glCreateFramebuffers(GLsizei n, GLuint *framebuffers);
- void glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, void *data);
- void glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void * *params);
- void glGetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64 *params);
- void glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params);
- void glFlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length);
- GLboolean glUnmapNamedBuffer(GLuint buffer);
- void * glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access);
- void * glMapNamedBuffer(GLuint buffer, GLenum access);
- void glClearNamedBufferSubData(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data);
- void glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);
- void glCopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size);
- void glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, const void *data);
- void glNamedBufferData(GLuint buffer, GLsizei size, const void *data, GLenum usage);
- void glNamedBufferStorage(GLuint buffer, GLsizei size, const void *data, GLbitfield flags);
- void glCreateBuffers(GLsizei n, GLuint *buffers);
- void glGetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param);
- void glGetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param);
- void glGetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param);
- void glTransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size);
- void glTransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer);
- void glCreateTransformFeedbacks(GLsizei n, GLuint *ids);
- void glClipControl(GLenum origin, GLenum depth);
-
- // OpenGL 1.0 deprecated functions
- void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- void glTranslated(GLdouble x, GLdouble y, GLdouble z);
- void glScalef(GLfloat x, GLfloat y, GLfloat z);
- void glScaled(GLdouble x, GLdouble y, GLdouble z);
- void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
- void glPushMatrix();
- void glPopMatrix();
- void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- void glMultMatrixd(const GLdouble *m);
- void glMultMatrixf(const GLfloat *m);
- void glMatrixMode(GLenum mode);
- void glLoadMatrixd(const GLdouble *m);
- void glLoadMatrixf(const GLfloat *m);
- void glLoadIdentity();
- void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
- GLboolean glIsList(GLuint list);
- void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
- void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
- void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
- void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
- void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetPolygonStipple(GLubyte *mask);
- void glGetPixelMapusv(GLenum map, GLushort *values);
- void glGetPixelMapuiv(GLenum map, GLuint *values);
- void glGetPixelMapfv(GLenum map, GLfloat *values);
- void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
- void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- void glGetMapiv(GLenum target, GLenum query, GLint *v);
- void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
- void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
- void glGetLightiv(GLenum light, GLenum pname, GLint *params);
- void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- void glGetClipPlane(GLenum plane, GLdouble *equation);
- void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
- void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
- void glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values);
- void glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values);
- void glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values);
- void glPixelTransferi(GLenum pname, GLint param);
- void glPixelTransferf(GLenum pname, GLfloat param);
- void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
- void glAlphaFunc(GLenum func, GLfloat ref);
- void glEvalPoint2(GLint i, GLint j);
- void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
- void glEvalPoint1(GLint i);
- void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
- void glEvalCoord2fv(const GLfloat *u);
- void glEvalCoord2f(GLfloat u, GLfloat v);
- void glEvalCoord2dv(const GLdouble *u);
- void glEvalCoord2d(GLdouble u, GLdouble v);
- void glEvalCoord1fv(const GLfloat *u);
- void glEvalCoord1f(GLfloat u);
- void glEvalCoord1dv(const GLdouble *u);
- void glEvalCoord1d(GLdouble u);
- void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
- void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
- void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
- void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
- void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
- void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
- void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
- void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
- void glPushAttrib(GLbitfield mask);
- void glPopAttrib();
- void glAccum(GLenum op, GLfloat value);
- void glIndexMask(GLuint mask);
- void glClearIndex(GLfloat c);
- void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glPushName(GLuint name);
- void glPopName();
- void glPassThrough(GLfloat token);
- void glLoadName(GLuint name);
- void glInitNames();
- GLint glRenderMode(GLenum mode);
- void glSelectBuffer(GLsizei size, GLuint *buffer);
- void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
- void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
- void glTexGeni(GLenum coord, GLenum pname, GLint param);
- void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
- void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
- void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
- void glTexGend(GLenum coord, GLenum pname, GLdouble param);
- void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- void glTexEnvi(GLenum target, GLenum pname, GLint param);
- void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- void glShadeModel(GLenum mode);
- void glPolygonStipple(const GLubyte *mask);
- void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
- void glMateriali(GLenum face, GLenum pname, GLint param);
- void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- void glMaterialf(GLenum face, GLenum pname, GLfloat param);
- void glLineStipple(GLint factor, GLushort pattern);
- void glLightModeliv(GLenum pname, const GLint *params);
- void glLightModeli(GLenum pname, GLint param);
- void glLightModelfv(GLenum pname, const GLfloat *params);
- void glLightModelf(GLenum pname, GLfloat param);
- void glLightiv(GLenum light, GLenum pname, const GLint *params);
- void glLighti(GLenum light, GLenum pname, GLint param);
- void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- void glLightf(GLenum light, GLenum pname, GLfloat param);
- void glFogiv(GLenum pname, const GLint *params);
- void glFogi(GLenum pname, GLint param);
- void glFogfv(GLenum pname, const GLfloat *params);
- void glFogf(GLenum pname, GLfloat param);
- void glColorMaterial(GLenum face, GLenum mode);
- void glClipPlane(GLenum plane, const GLdouble *equation);
- void glVertex4sv(const GLshort *v);
- void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertex4iv(const GLint *v);
- void glVertex4i(GLint x, GLint y, GLint z, GLint w);
- void glVertex4fv(const GLfloat *v);
- void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertex4dv(const GLdouble *v);
- void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertex3sv(const GLshort *v);
- void glVertex3s(GLshort x, GLshort y, GLshort z);
- void glVertex3iv(const GLint *v);
- void glVertex3i(GLint x, GLint y, GLint z);
- void glVertex3fv(const GLfloat *v);
- void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
- void glVertex3dv(const GLdouble *v);
- void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
- void glVertex2sv(const GLshort *v);
- void glVertex2s(GLshort x, GLshort y);
- void glVertex2iv(const GLint *v);
- void glVertex2i(GLint x, GLint y);
- void glVertex2fv(const GLfloat *v);
- void glVertex2f(GLfloat x, GLfloat y);
- void glVertex2dv(const GLdouble *v);
- void glVertex2d(GLdouble x, GLdouble y);
- void glTexCoord4sv(const GLshort *v);
- void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
- void glTexCoord4iv(const GLint *v);
- void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
- void glTexCoord4fv(const GLfloat *v);
- void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glTexCoord4dv(const GLdouble *v);
- void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glTexCoord3sv(const GLshort *v);
- void glTexCoord3s(GLshort s, GLshort t, GLshort r);
- void glTexCoord3iv(const GLint *v);
- void glTexCoord3i(GLint s, GLint t, GLint r);
- void glTexCoord3fv(const GLfloat *v);
- void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
- void glTexCoord3dv(const GLdouble *v);
- void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
- void glTexCoord2sv(const GLshort *v);
- void glTexCoord2s(GLshort s, GLshort t);
- void glTexCoord2iv(const GLint *v);
- void glTexCoord2i(GLint s, GLint t);
- void glTexCoord2fv(const GLfloat *v);
- void glTexCoord2f(GLfloat s, GLfloat t);
- void glTexCoord2dv(const GLdouble *v);
- void glTexCoord2d(GLdouble s, GLdouble t);
- void glTexCoord1sv(const GLshort *v);
- void glTexCoord1s(GLshort s);
- void glTexCoord1iv(const GLint *v);
- void glTexCoord1i(GLint s);
- void glTexCoord1fv(const GLfloat *v);
- void glTexCoord1f(GLfloat s);
- void glTexCoord1dv(const GLdouble *v);
- void glTexCoord1d(GLdouble s);
- void glRectsv(const GLshort *v1, const GLshort *v2);
- void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
- void glRectiv(const GLint *v1, const GLint *v2);
- void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
- void glRectfv(const GLfloat *v1, const GLfloat *v2);
- void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
- void glRectdv(const GLdouble *v1, const GLdouble *v2);
- void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
- void glRasterPos4sv(const GLshort *v);
- void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
- void glRasterPos4iv(const GLint *v);
- void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
- void glRasterPos4fv(const GLfloat *v);
- void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glRasterPos4dv(const GLdouble *v);
- void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glRasterPos3sv(const GLshort *v);
- void glRasterPos3s(GLshort x, GLshort y, GLshort z);
- void glRasterPos3iv(const GLint *v);
- void glRasterPos3i(GLint x, GLint y, GLint z);
- void glRasterPos3fv(const GLfloat *v);
- void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glRasterPos3dv(const GLdouble *v);
- void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glRasterPos2sv(const GLshort *v);
- void glRasterPos2s(GLshort x, GLshort y);
- void glRasterPos2iv(const GLint *v);
- void glRasterPos2i(GLint x, GLint y);
- void glRasterPos2fv(const GLfloat *v);
- void glRasterPos2f(GLfloat x, GLfloat y);
- void glRasterPos2dv(const GLdouble *v);
- void glRasterPos2d(GLdouble x, GLdouble y);
- void glNormal3sv(const GLshort *v);
- void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
- void glNormal3iv(const GLint *v);
- void glNormal3i(GLint nx, GLint ny, GLint nz);
- void glNormal3fv(const GLfloat *v);
- void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- void glNormal3dv(const GLdouble *v);
- void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
- void glNormal3bv(const GLbyte *v);
- void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
- void glIndexsv(const GLshort *c);
- void glIndexs(GLshort c);
- void glIndexiv(const GLint *c);
- void glIndexi(GLint c);
- void glIndexfv(const GLfloat *c);
- void glIndexf(GLfloat c);
- void glIndexdv(const GLdouble *c);
- void glIndexd(GLdouble c);
- void glEnd();
- void glEdgeFlagv(const GLboolean *flag);
- void glEdgeFlag(GLboolean flag);
- void glColor4usv(const GLushort *v);
- void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
- void glColor4uiv(const GLuint *v);
- void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
- void glColor4ubv(const GLubyte *v);
- void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- void glColor4sv(const GLshort *v);
- void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
- void glColor4iv(const GLint *v);
- void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
- void glColor4fv(const GLfloat *v);
- void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glColor4dv(const GLdouble *v);
- void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
- void glColor4bv(const GLbyte *v);
- void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
- void glColor3usv(const GLushort *v);
- void glColor3us(GLushort red, GLushort green, GLushort blue);
- void glColor3uiv(const GLuint *v);
- void glColor3ui(GLuint red, GLuint green, GLuint blue);
- void glColor3ubv(const GLubyte *v);
- void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glColor3sv(const GLshort *v);
- void glColor3s(GLshort red, GLshort green, GLshort blue);
- void glColor3iv(const GLint *v);
- void glColor3i(GLint red, GLint green, GLint blue);
- void glColor3fv(const GLfloat *v);
- void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glColor3dv(const GLdouble *v);
- void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glColor3bv(const GLbyte *v);
- void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
- void glBegin(GLenum mode);
- void glListBase(GLuint base);
- GLuint glGenLists(GLsizei range);
- void glDeleteLists(GLuint list, GLsizei range);
- void glCallLists(GLsizei n, GLenum type, const void *lists);
- void glCallList(GLuint list);
- void glEndList();
- void glNewList(GLuint list, GLenum mode);
-
- // OpenGL 1.1 deprecated functions
- void glPushClientAttrib(GLbitfield mask);
- void glPopClientAttrib();
- void glIndexubv(const GLubyte *c);
- void glIndexub(GLubyte c);
- void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
- GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
- void glVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glNormalPointer(GLenum type, GLsizei stride, const void *pointer);
- void glInterleavedArrays(GLenum format, GLsizei stride, const void *pointer);
- void glGetPointerv(GLenum pname, void * *params);
- void glIndexPointer(GLenum type, GLsizei stride, const void *pointer);
- void glEnableClientState(GLenum array);
- void glEdgeFlagPointer(GLsizei stride, const void *pointer);
- void glDisableClientState(GLenum array);
- void glColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glArrayElement(GLint i);
-
- // OpenGL 1.2 deprecated functions
- void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);
- void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glGetColorTable(GLenum target, GLenum format, GLenum type, void *table);
- void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
- void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);
- void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
- void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);
- void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);
- void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
- void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
- void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
- void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
- void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, void *image);
- void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);
- void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);
- void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
- void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
- void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
- void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
- void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
- void glResetHistogram(GLenum target);
- void glResetMinmax(GLenum target);
-
- // OpenGL 1.3 deprecated functions
- void glMultTransposeMatrixd(const GLdouble *m);
- void glMultTransposeMatrixf(const GLfloat *m);
- void glLoadTransposeMatrixd(const GLdouble *m);
- void glLoadTransposeMatrixf(const GLfloat *m);
- void glMultiTexCoord4sv(GLenum target, const GLshort *v);
- void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
- void glMultiTexCoord4iv(GLenum target, const GLint *v);
- void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
- void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
- void glMultiTexCoord3sv(GLenum target, const GLshort *v);
- void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
- void glMultiTexCoord3iv(GLenum target, const GLint *v);
- void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
- void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
- void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
- void glMultiTexCoord2sv(GLenum target, const GLshort *v);
- void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
- void glMultiTexCoord2iv(GLenum target, const GLint *v);
- void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
- void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
- void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
- void glMultiTexCoord1sv(GLenum target, const GLshort *v);
- void glMultiTexCoord1s(GLenum target, GLshort s);
- void glMultiTexCoord1iv(GLenum target, const GLint *v);
- void glMultiTexCoord1i(GLenum target, GLint s);
- void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
- void glMultiTexCoord1f(GLenum target, GLfloat s);
- void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
- void glMultiTexCoord1d(GLenum target, GLdouble s);
- void glClientActiveTexture(GLenum texture);
-
- // OpenGL 1.4 deprecated functions
- void glWindowPos3sv(const GLshort *v);
- void glWindowPos3s(GLshort x, GLshort y, GLshort z);
- void glWindowPos3iv(const GLint *v);
- void glWindowPos3i(GLint x, GLint y, GLint z);
- void glWindowPos3fv(const GLfloat *v);
- void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
- void glWindowPos3dv(const GLdouble *v);
- void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
- void glWindowPos2sv(const GLshort *v);
- void glWindowPos2s(GLshort x, GLshort y);
- void glWindowPos2iv(const GLint *v);
- void glWindowPos2i(GLint x, GLint y);
- void glWindowPos2fv(const GLfloat *v);
- void glWindowPos2f(GLfloat x, GLfloat y);
- void glWindowPos2dv(const GLdouble *v);
- void glWindowPos2d(GLdouble x, GLdouble y);
- void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glSecondaryColor3usv(const GLushort *v);
- void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
- void glSecondaryColor3uiv(const GLuint *v);
- void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
- void glSecondaryColor3ubv(const GLubyte *v);
- void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
- void glSecondaryColor3sv(const GLshort *v);
- void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
- void glSecondaryColor3iv(const GLint *v);
- void glSecondaryColor3i(GLint red, GLint green, GLint blue);
- void glSecondaryColor3fv(const GLfloat *v);
- void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
- void glSecondaryColor3dv(const GLdouble *v);
- void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
- void glSecondaryColor3bv(const GLbyte *v);
- void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
- void glFogCoordPointer(GLenum type, GLsizei stride, const void *pointer);
- void glFogCoorddv(const GLdouble *coord);
- void glFogCoordd(GLdouble coord);
- void glFogCoordfv(const GLfloat *coord);
- void glFogCoordf(GLfloat coord);
-
- // OpenGL 1.5 deprecated functions
-
- // OpenGL 2.0 deprecated functions
-
- // OpenGL 2.1 deprecated functions
-
- // OpenGL 3.0 deprecated functions
-
- // OpenGL 3.1 deprecated functions
-
- // OpenGL 3.2 deprecated functions
-
- // OpenGL 3.3 deprecated functions
- void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
- void glSecondaryColorP3ui(GLenum type, GLuint color);
- void glColorP4uiv(GLenum type, const GLuint *color);
- void glColorP4ui(GLenum type, GLuint color);
- void glColorP3uiv(GLenum type, const GLuint *color);
- void glColorP3ui(GLenum type, GLuint color);
- void glNormalP3uiv(GLenum type, const GLuint *coords);
- void glNormalP3ui(GLenum type, GLuint coords);
- void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
- void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
- void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
- void glTexCoordP4uiv(GLenum type, const GLuint *coords);
- void glTexCoordP4ui(GLenum type, GLuint coords);
- void glTexCoordP3uiv(GLenum type, const GLuint *coords);
- void glTexCoordP3ui(GLenum type, GLuint coords);
- void glTexCoordP2uiv(GLenum type, const GLuint *coords);
- void glTexCoordP2ui(GLenum type, GLuint coords);
- void glTexCoordP1uiv(GLenum type, const GLuint *coords);
- void glTexCoordP1ui(GLenum type, GLuint coords);
- void glVertexP4uiv(GLenum type, const GLuint *value);
- void glVertexP4ui(GLenum type, GLuint value);
- void glVertexP3uiv(GLenum type, const GLuint *value);
- void glVertexP3ui(GLenum type, GLuint value);
- void glVertexP2uiv(GLenum type, const GLuint *value);
- void glVertexP2ui(GLenum type, GLuint value);
-
- // OpenGL 4.0 deprecated functions
-
- // OpenGL 4.1 deprecated functions
-
- // OpenGL 4.2 deprecated functions
-
- // OpenGL 4.3 deprecated functions
-
- // OpenGL 4.4 deprecated functions
-
- // OpenGL 4.5 deprecated functions
- void glGetnMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
- void glGetnHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
- void glGetnSeparableFilter(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span);
- void glGetnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image);
- void glGetnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);
- void glGetnPolygonStipple(GLsizei bufSize, GLubyte *pattern);
- void glGetnPixelMapusv(GLenum map, GLsizei bufSize, GLushort *values);
- void glGetnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint *values);
- void glGetnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat *values);
- void glGetnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint *v);
- void glGetnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);
- void glGetnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
- QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
- QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
- QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
- QOpenGLFunctions_4_4_CoreBackend* d_4_4_Core;
- QOpenGLFunctions_4_5_CoreBackend* d_4_5_Core;
- QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
- QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
- QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
- QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
- QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
- QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
- QOpenGLFunctions_4_5_DeprecatedBackend* d_4_5_Deprecated;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_5_Compatibility::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetIntegerv(GLenum pname, GLint *data)
-{
- d_1_0_Core->f.GetIntegerv(pname, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetFloatv(GLenum pname, GLfloat *data)
-{
- d_1_0_Core->f.GetFloatv(pname, data);
-}
-
-inline GLenum QOpenGLFunctions_4_5_Compatibility::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetDoublev(GLenum pname, GLdouble *data)
-{
- d_1_0_Core->f.GetDoublev(pname, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetBooleanv(GLenum pname, GLboolean *data)
-{
- d_1_0_Core->f.GetBooleanv(pname, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glReadBuffer(GLenum src)
-{
- d_1_0_Core->f.ReadBuffer(src);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawBuffer(GLenum buf)
-{
- d_1_0_Core->f.DrawBuffer(buf);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, void *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, void * *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline void * QOpenGLFunctions_4_5_Compatibility::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_5_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_5_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, shaders);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Compatibility::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Compatibility::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline void * QOpenGLFunctions_4_5_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_5_Compatibility::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_5_Compatibility::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_5_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
-{
- d_3_0_Core->f.VertexAttribI4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
- d_3_0_Core->f.VertexAttribI4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
-{
- d_3_0_Core->f.VertexAttribI4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
-{
- d_3_0_Core->f.VertexAttribI4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI3uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI2uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI1uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI3iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI2iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI1iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
- d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
- d_3_0_Core->f.VertexAttribI2ui(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
-{
- d_3_0_Core->f.VertexAttribI1ui(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
- d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
-{
- d_3_0_Core->f.VertexAttribI2i(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
-{
- d_3_0_Core->f.VertexAttribI1i(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glSampleMaski(GLuint maskNumber, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(maskNumber, mask);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetInteger64v(GLenum pname, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64v(pname, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_5_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_5_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_5_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_5_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawArraysIndirect(GLenum mode, const void *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-// OpenGL 4.1 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
-{
- d_4_1_Core->f.GetDoublei_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
-{
- d_4_1_Core->f.GetFloati_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
-{
- d_4_1_Core->f.DepthRangeIndexed(index, n, f);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
-{
- d_4_1_Core->f.DepthRangeArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glScissorIndexedv(GLuint index, const GLint *v)
-{
- d_4_1_Core->f.ScissorIndexedv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
-{
- d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
-{
- d_4_1_Core->f.ScissorArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glViewportIndexedfv(GLuint index, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportIndexedfv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
-{
- d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL4dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL3dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL2dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL1dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_4_1_Core->f.VertexAttribL2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL1d(GLuint index, GLdouble x)
-{
- d_4_1_Core->f.VertexAttribL1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glValidateProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.ValidateProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
-{
- d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
-{
- d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
- d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
-{
- d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
- d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
- d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
-{
- d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
-{
- d_4_1_Core->f.ProgramUniform1d(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
-{
- d_4_1_Core->f.ProgramUniform1f(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1i(GLuint program, GLint location, GLint v0)
-{
- d_4_1_Core->f.ProgramUniform1i(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
- d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsProgramPipeline(GLuint pipeline)
-{
- return d_4_1_Core->f.IsProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_1_Core->f.GenProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
-{
- d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.BindProgramPipeline(pipeline);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Compatibility::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
-{
- return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glActiveShaderProgram(GLuint pipeline, GLuint program)
-{
- d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
- d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramParameteri(GLuint program, GLenum pname, GLint value)
-{
- d_4_1_Core->f.ProgramParameteri(program, pname, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
-{
- d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
-{
- d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearDepthf(GLfloat dd)
-{
- d_4_1_Core->f.ClearDepthf(dd);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDepthRangef(GLfloat n, GLfloat f)
-{
- d_4_1_Core->f.DepthRangef(n, f);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
-{
- d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length)
-{
- d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glReleaseShaderCompiler()
-{
- d_4_1_Core->f.ReleaseShaderCompiler();
-}
-
-
-// OpenGL 4.2 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
-{
- d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMemoryBarrier(GLbitfield barriers)
-{
- d_4_2_Core->f.MemoryBarrier(barriers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
-{
- d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
-{
- d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
-{
- d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
-}
-
-
-// OpenGL 4.3 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
- d_4_3_Core->f.GetObjectPtrLabel(ptr, bufSize, length, label);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
-{
- d_4_3_Core->f.ObjectPtrLabel(ptr, length, label);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
- d_4_3_Core->f.GetObjectLabel(identifier, name, bufSize, length, label);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
-{
- d_4_3_Core->f.ObjectLabel(identifier, name, length, label);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPopDebugGroup()
-{
- d_4_3_Core->f.PopDebugGroup();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
-{
- d_4_3_Core->f.PushDebugGroup(source, id, length, message);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Compatibility::glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)
-{
- return d_4_3_Core->f.GetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
-{
- d_4_3_Core->f.DebugMessageCallback(callback, userParam);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)
-{
- d_4_3_Core->f.DebugMessageInsert(source, type, id, severity, length, buf);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)
-{
- d_4_3_Core->f.DebugMessageControl(source, type, severity, count, ids, enabled);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
-{
- d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
-{
- d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
-{
- d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
-{
- d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
-{
- d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
-}
-
-inline GLint QOpenGLFunctions_4_5_Compatibility::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
-}
-
-inline GLint QOpenGLFunctions_4_5_Compatibility::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
-{
- d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
-{
- d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Compatibility::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
-{
- d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateBufferData(GLuint buffer)
-{
- d_4_3_Core->f.InvalidateBufferData(buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
-{
- d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateTexImage(GLuint texture, GLint level)
-{
- d_4_3_Core->f.InvalidateTexImage(texture, level);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
-{
- d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_4_3_Core->f.FramebufferParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
-{
- d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDispatchComputeIndirect(GLintptr indirect)
-{
- d_4_3_Core->f.DispatchComputeIndirect(indirect);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
-{
- d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
-}
-
-
-// OpenGL 4.4 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
-{
- d_4_4_Core->f.BindVertexBuffers(first, count, buffers, offsets, strides);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
-{
- d_4_4_Core->f.BindImageTextures(first, count, textures);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
-{
- d_4_4_Core->f.BindSamplers(first, count, samplers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindTextures(GLuint first, GLsizei count, const GLuint *textures)
-{
- d_4_4_Core->f.BindTextures(first, count, textures);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes)
-{
- d_4_4_Core->f.BindBuffersRange(target, first, count, buffers, offsets, sizes);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers)
-{
- d_4_4_Core->f.BindBuffersBase(target, first, count, buffers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
-{
- d_4_4_Core->f.ClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
-{
- d_4_4_Core->f.ClearTexImage(texture, level, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
-{
- d_4_4_Core->f.BufferStorage(target, size, data, flags);
-}
-
-
-// OpenGL 4.5 core functions
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureBarrier()
-{
- d_4_5_Core->f.TextureBarrier();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data)
-{
- d_4_5_Core->f.ReadnPixels(x, y, width, height, format, type, bufSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params)
-{
- d_4_5_Core->f.GetnUniformuiv(program, location, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
-{
- d_4_5_Core->f.GetnUniformiv(program, location, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
-{
- d_4_5_Core->f.GetnUniformfv(program, location, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params)
-{
- d_4_5_Core->f.GetnUniformdv(program, location, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetnTexImage(target, level, format, type, bufSize, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetnCompressedTexImage(target, lod, bufSize, pixels);
-}
-
-inline GLenum QOpenGLFunctions_4_5_Compatibility::glGetGraphicsResetStatus()
-{
- return d_4_5_Core->f.GetGraphicsResetStatus();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetCompressedTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMemoryBarrierByRegion(GLbitfield barriers)
-{
- d_4_5_Core->f.MemoryBarrierByRegion(barriers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCreateQueries(GLenum target, GLsizei n, GLuint *ids)
-{
- d_4_5_Core->f.CreateQueries(target, n, ids);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCreateProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_5_Core->f.CreateProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCreateSamplers(GLsizei n, GLuint *samplers)
-{
- d_4_5_Core->f.CreateSamplers(n, samplers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64 *param)
-{
- d_4_5_Core->f.GetVertexArrayIndexed64iv(vaobj, index, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint *param)
-{
- d_4_5_Core->f.GetVertexArrayIndexediv(vaobj, index, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param)
-{
- d_4_5_Core->f.GetVertexArrayiv(vaobj, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor)
-{
- d_4_5_Core->f.VertexArrayBindingDivisor(vaobj, bindingindex, divisor);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayAttribLFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_5_Core->f.VertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayAttribIFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_5_Core->f.VertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayAttribFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
-{
- d_4_5_Core->f.VertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex)
-{
- d_4_5_Core->f.VertexArrayAttribBinding(vaobj, attribindex, bindingindex);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
-{
- d_4_5_Core->f.VertexArrayVertexBuffers(vaobj, first, count, buffers, offsets, strides);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayVertexBuffer(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
-{
- d_4_5_Core->f.VertexArrayVertexBuffer(vaobj, bindingindex, buffer, offset, stride);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer)
-{
- d_4_5_Core->f.VertexArrayElementBuffer(vaobj, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEnableVertexArrayAttrib(GLuint vaobj, GLuint index)
-{
- d_4_5_Core->f.EnableVertexArrayAttrib(vaobj, index);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDisableVertexArrayAttrib(GLuint vaobj, GLuint index)
-{
- d_4_5_Core->f.DisableVertexArrayAttrib(vaobj, index);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCreateVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_4_5_Core->f.CreateVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureParameteriv(GLuint texture, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetTextureParameteriv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params)
-{
- d_4_5_Core->f.GetTextureParameterIuiv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetTextureParameterIiv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params)
-{
- d_4_5_Core->f.GetTextureParameterfv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureLevelParameteriv(GLuint texture, GLint level, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetTextureLevelParameteriv(texture, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureLevelParameterfv(GLuint texture, GLint level, GLenum pname, GLfloat *params)
-{
- d_4_5_Core->f.GetTextureLevelParameterfv(texture, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetCompressedTextureImage(texture, level, bufSize, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetTextureImage(texture, level, format, type, bufSize, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBindTextureUnit(GLuint unit, GLuint texture)
-{
- d_4_5_Core->f.BindTextureUnit(unit, texture);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGenerateTextureMipmap(GLuint texture)
-{
- d_4_5_Core->f.GenerateTextureMipmap(texture);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameteriv(GLuint texture, GLenum pname, const GLint *param)
-{
- d_4_5_Core->f.TextureParameteriv(texture, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameterIuiv(GLuint texture, GLenum pname, const GLuint *params)
-{
- d_4_5_Core->f.TextureParameterIuiv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameterIiv(GLuint texture, GLenum pname, const GLint *params)
-{
- d_4_5_Core->f.TextureParameterIiv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameteri(GLuint texture, GLenum pname, GLint param)
-{
- d_4_5_Core->f.TextureParameteri(texture, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameterfv(GLuint texture, GLenum pname, const GLfloat *param)
-{
- d_4_5_Core->f.TextureParameterfv(texture, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameterf(GLuint texture, GLenum pname, GLfloat param)
-{
- d_4_5_Core->f.TextureParameterf(texture, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.CopyTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.CopyTextureSubImage2D(texture, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_4_5_Core->f.CopyTextureSubImage1D(texture, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
-{
- d_4_5_Core->f.CompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
-{
- d_4_5_Core->f.CompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
-{
- d_4_5_Core->f.CompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
-{
- d_4_5_Core->f.TextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
-{
- d_4_5_Core->f.TextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
-{
- d_4_5_Core->f.TextureSubImage1D(texture, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_4_5_Core->f.TextureStorage3DMultisample(texture, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_4_5_Core->f.TextureStorage2DMultisample(texture, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureStorage3D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_5_Core->f.TextureStorage3D(texture, levels, internalformat, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureStorage2D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.TextureStorage2D(texture, levels, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureStorage1D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width)
-{
- d_4_5_Core->f.TextureStorage1D(texture, levels, internalformat, width);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureBufferRange(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size)
-{
- d_4_5_Core->f.TextureBufferRange(texture, internalformat, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer)
-{
- d_4_5_Core->f.TextureBuffer(texture, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCreateTextures(GLenum target, GLsizei n, GLuint *textures)
-{
- d_4_5_Core->f.CreateTextures(target, n, textures);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetNamedRenderbufferParameteriv(renderbuffer, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedRenderbufferStorageMultisample(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.NamedRenderbufferStorageMultisample(renderbuffer, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedRenderbufferStorage(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.NamedRenderbufferStorage(renderbuffer, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCreateRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_4_5_Core->f.CreateRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param)
-{
- d_4_5_Core->f.GetNamedFramebufferParameteriv(framebuffer, pname, param);
-}
-
-inline GLenum QOpenGLFunctions_4_5_Compatibility::glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target)
-{
- return d_4_5_Core->f.CheckNamedFramebufferStatus(framebuffer, target);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_4_5_Core->f.BlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil)
-{
- d_4_5_Core->f.ClearNamedFramebufferfi(framebuffer, buffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_4_5_Core->f.ClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_4_5_Core->f.ClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_4_5_Core->f.ClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.InvalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments)
-{
- d_4_5_Core->f.InvalidateNamedFramebufferData(framebuffer, numAttachments, attachments);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferReadBuffer(GLuint framebuffer, GLenum src)
-{
- d_4_5_Core->f.NamedFramebufferReadBuffer(framebuffer, src);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum *bufs)
-{
- d_4_5_Core->f.NamedFramebufferDrawBuffers(framebuffer, n, bufs);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf)
-{
- d_4_5_Core->f.NamedFramebufferDrawBuffer(framebuffer, buf);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_4_5_Core->f.NamedFramebufferTextureLayer(framebuffer, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)
-{
- d_4_5_Core->f.NamedFramebufferTexture(framebuffer, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param)
-{
- d_4_5_Core->f.NamedFramebufferParameteri(framebuffer, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_4_5_Core->f.NamedFramebufferRenderbuffer(framebuffer, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCreateFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_4_5_Core->f.CreateFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, void *data)
-{
- d_4_5_Core->f.GetNamedBufferSubData(buffer, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void * *params)
-{
- d_4_5_Core->f.GetNamedBufferPointerv(buffer, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64 *params)
-{
- d_4_5_Core->f.GetNamedBufferParameteri64v(buffer, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetNamedBufferParameteriv(buffer, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length)
-{
- d_4_5_Core->f.FlushMappedNamedBufferRange(buffer, offset, length);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glUnmapNamedBuffer(GLuint buffer)
-{
- return d_4_5_Core->f.UnmapNamedBuffer(buffer);
-}
-
-inline void * QOpenGLFunctions_4_5_Compatibility::glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access)
-{
- return d_4_5_Core->f.MapNamedBufferRange(buffer, offset, length, access);
-}
-
-inline void * QOpenGLFunctions_4_5_Compatibility::glMapNamedBuffer(GLuint buffer, GLenum access)
-{
- return d_4_5_Core->f.MapNamedBuffer(buffer, access);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedBufferSubData(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data)
-{
- d_4_5_Core->f.ClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data)
-{
- d_4_5_Core->f.ClearNamedBufferData(buffer, internalformat, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size)
-{
- d_4_5_Core->f.CopyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, const void *data)
-{
- d_4_5_Core->f.NamedBufferSubData(buffer, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedBufferData(GLuint buffer, GLsizei size, const void *data, GLenum usage)
-{
- d_4_5_Core->f.NamedBufferData(buffer, size, data, usage);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNamedBufferStorage(GLuint buffer, GLsizei size, const void *data, GLbitfield flags)
-{
- d_4_5_Core->f.NamedBufferStorage(buffer, size, data, flags);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCreateBuffers(GLsizei n, GLuint *buffers)
-{
- d_4_5_Core->f.CreateBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param)
-{
- d_4_5_Core->f.GetTransformFeedbacki64_v(xfb, pname, index, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param)
-{
- d_4_5_Core->f.GetTransformFeedbacki_v(xfb, pname, index, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param)
-{
- d_4_5_Core->f.GetTransformFeedbackiv(xfb, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size)
-{
- d_4_5_Core->f.TransformFeedbackBufferRange(xfb, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer)
-{
- d_4_5_Core->f.TransformFeedbackBufferBase(xfb, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCreateTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_5_Core->f.CreateTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClipControl(GLenum origin, GLenum depth)
-{
- d_4_5_Core->f.ClipControl(origin, depth);
-}
-
-
-// OpenGL 1.0 deprecated functions
-inline void QOpenGLFunctions_4_5_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Translatef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Translated(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Scalef(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Scaled(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Rotated(angle, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPushMatrix()
-{
- d_1_0_Deprecated->f.PushMatrix();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPopMatrix()
-{
- d_1_0_Deprecated->f.PopMatrix();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.MultMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.MultMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMatrixMode(GLenum mode)
-{
- d_1_0_Deprecated->f.MatrixMode(mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLoadMatrixd(const GLdouble *m)
-{
- d_1_0_Deprecated->f.LoadMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLoadMatrixf(const GLfloat *m)
-{
- d_1_0_Deprecated->f.LoadMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLoadIdentity()
-{
- d_1_0_Deprecated->f.LoadIdentity();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
-{
- d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsList(GLuint list)
-{
- return d_1_0_Deprecated->f.IsList(list);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
-{
- d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetPolygonStipple(GLubyte *mask)
-{
- d_1_0_Deprecated->f.GetPolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
-{
- d_1_0_Deprecated->f.GetPixelMapusv(map, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
-{
- d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
-{
- d_1_0_Deprecated->f.GetPixelMapfv(map, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
-{
- d_1_0_Deprecated->f.GetMapiv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
-{
- d_1_0_Deprecated->f.GetMapfv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
-{
- d_1_0_Deprecated->f.GetMapdv(target, query, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
-{
- d_1_0_Deprecated->f.GetLightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
- d_1_0_Deprecated->f.GetLightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
-{
- d_1_0_Deprecated->f.GetClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
-{
- d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
-{
- d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values)
-{
- d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values)
-{
- d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values)
-{
- d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPixelTransferi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.PixelTransferi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.PixelTransferf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
-{
- d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
-{
- d_1_0_Deprecated->f.AlphaFunc(func, ref);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalPoint2(GLint i, GLint j)
-{
- d_1_0_Deprecated->f.EvalPoint2(i, j);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
-{
- d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalPoint1(GLint i)
-{
- d_1_0_Deprecated->f.EvalPoint1(i);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
-{
- d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord2fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord2fv(u);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
-{
- d_1_0_Deprecated->f.EvalCoord2f(u, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord2dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord2dv(u);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
-{
- d_1_0_Deprecated->f.EvalCoord2d(u, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord1fv(const GLfloat *u)
-{
- d_1_0_Deprecated->f.EvalCoord1fv(u);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord1f(GLfloat u)
-{
- d_1_0_Deprecated->f.EvalCoord1f(u);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord1dv(const GLdouble *u)
-{
- d_1_0_Deprecated->f.EvalCoord1dv(u);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord1d(GLdouble u)
-{
- d_1_0_Deprecated->f.EvalCoord1d(u);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
-{
- d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
-{
- d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
-{
- d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
-{
- d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
-{
- d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
-{
- d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPushAttrib(GLbitfield mask)
-{
- d_1_0_Deprecated->f.PushAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPopAttrib()
-{
- d_1_0_Deprecated->f.PopAttrib();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glAccum(GLenum op, GLfloat value)
-{
- d_1_0_Deprecated->f.Accum(op, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexMask(GLuint mask)
-{
- d_1_0_Deprecated->f.IndexMask(mask);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearIndex(GLfloat c)
-{
- d_1_0_Deprecated->f.ClearIndex(c);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPushName(GLuint name)
-{
- d_1_0_Deprecated->f.PushName(name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPopName()
-{
- d_1_0_Deprecated->f.PopName();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPassThrough(GLfloat token)
-{
- d_1_0_Deprecated->f.PassThrough(token);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLoadName(GLuint name)
-{
- d_1_0_Deprecated->f.LoadName(name);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glInitNames()
-{
- d_1_0_Deprecated->f.InitNames();
-}
-
-inline GLint QOpenGLFunctions_4_5_Compatibility::glRenderMode(GLenum mode)
-{
- return d_1_0_Deprecated->f.RenderMode(mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
-{
- d_1_0_Deprecated->f.SelectBuffer(size, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
-{
- d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexGeni(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexGenf(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
-{
- d_1_0_Deprecated->f.TexGendv(coord, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
-{
- d_1_0_Deprecated->f.TexGend(coord, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.TexEnviv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.TexEnvi(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.TexEnvf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glShadeModel(GLenum mode)
-{
- d_1_0_Deprecated->f.ShadeModel(mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPolygonStipple(const GLubyte *mask)
-{
- d_1_0_Deprecated->f.PolygonStipple(mask);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Materialiv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Materiali(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Materialfv(face, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Materialf(face, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLineStipple(GLint factor, GLushort pattern)
-{
- d_1_0_Deprecated->f.LineStipple(factor, pattern);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.LightModeliv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLightModeli(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.LightModeli(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.LightModelfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLightModelf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.LightModelf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Lightiv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Lighti(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Lightfv(light, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Lightf(light, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFogiv(GLenum pname, const GLint *params)
-{
- d_1_0_Deprecated->f.Fogiv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFogi(GLenum pname, GLint param)
-{
- d_1_0_Deprecated->f.Fogi(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
-{
- d_1_0_Deprecated->f.Fogfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFogf(GLenum pname, GLfloat param)
-{
- d_1_0_Deprecated->f.Fogf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColorMaterial(GLenum face, GLenum mode)
-{
- d_1_0_Deprecated->f.ColorMaterial(face, mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
-{
- d_1_0_Deprecated->f.ClipPlane(plane, equation);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex4sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex4iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex4fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex4dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex3sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.Vertex3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex3iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.Vertex3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex3fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.Vertex3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex3dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.Vertex3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Vertex2sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.Vertex2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Vertex2iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.Vertex2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Vertex2fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.Vertex2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Vertex2dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertex2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.Vertex2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord4sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord4iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
-{
- d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord4fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord4dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord3sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
-{
- d_1_0_Deprecated->f.TexCoord3s(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord3iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
-{
- d_1_0_Deprecated->f.TexCoord3i(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord3fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_0_Deprecated->f.TexCoord3f(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord3dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_0_Deprecated->f.TexCoord3d(s, t, r);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord2sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2s(GLshort s, GLshort t)
-{
- d_1_0_Deprecated->f.TexCoord2s(s, t);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord2iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2i(GLint s, GLint t)
-{
- d_1_0_Deprecated->f.TexCoord2i(s, t);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord2fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
-{
- d_1_0_Deprecated->f.TexCoord2f(s, t);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord2dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
-{
- d_1_0_Deprecated->f.TexCoord2d(s, t);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.TexCoord1sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1s(GLshort s)
-{
- d_1_0_Deprecated->f.TexCoord1s(s);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1iv(const GLint *v)
-{
- d_1_0_Deprecated->f.TexCoord1iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1i(GLint s)
-{
- d_1_0_Deprecated->f.TexCoord1i(s);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.TexCoord1fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1f(GLfloat s)
-{
- d_1_0_Deprecated->f.TexCoord1f(s);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.TexCoord1dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1d(GLdouble s)
-{
- d_1_0_Deprecated->f.TexCoord1d(s);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
-{
- d_1_0_Deprecated->f.Rectsv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
-{
- d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
-{
- d_1_0_Deprecated->f.Rectiv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
-{
- d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
-{
- d_1_0_Deprecated->f.Rectfv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
-{
- d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
-{
- d_1_0_Deprecated->f.Rectdv(v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
-{
- d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos4sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos4iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
-{
- d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos4fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos4dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_0_Deprecated->f.RasterPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
-{
- d_1_0_Deprecated->f.RasterPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_0_Deprecated->f.RasterPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_0_Deprecated->f.RasterPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.RasterPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2s(GLshort x, GLshort y)
-{
- d_1_0_Deprecated->f.RasterPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2iv(const GLint *v)
-{
- d_1_0_Deprecated->f.RasterPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2i(GLint x, GLint y)
-{
- d_1_0_Deprecated->f.RasterPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.RasterPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
-{
- d_1_0_Deprecated->f.RasterPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.RasterPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
-{
- d_1_0_Deprecated->f.RasterPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormal3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Normal3sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
-{
- d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormal3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Normal3iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
-{
- d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormal3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Normal3fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
- d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormal3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Normal3dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
-{
- d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormal3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Normal3bv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
-{
- d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexsv(const GLshort *c)
-{
- d_1_0_Deprecated->f.Indexsv(c);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexs(GLshort c)
-{
- d_1_0_Deprecated->f.Indexs(c);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexiv(const GLint *c)
-{
- d_1_0_Deprecated->f.Indexiv(c);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexi(GLint c)
-{
- d_1_0_Deprecated->f.Indexi(c);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexfv(const GLfloat *c)
-{
- d_1_0_Deprecated->f.Indexfv(c);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexf(GLfloat c)
-{
- d_1_0_Deprecated->f.Indexf(c);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexdv(const GLdouble *c)
-{
- d_1_0_Deprecated->f.Indexdv(c);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexd(GLdouble c)
-{
- d_1_0_Deprecated->f.Indexd(c);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEnd()
-{
- d_1_0_Deprecated->f.End();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEdgeFlagv(const GLboolean *flag)
-{
- d_1_0_Deprecated->f.EdgeFlagv(flag);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEdgeFlag(GLboolean flag)
-{
- d_1_0_Deprecated->f.EdgeFlag(flag);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color4usv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
-{
- d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color4uiv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
-{
- d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color4ubv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
- d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color4sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
-{
- d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color4iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
-{
- d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color4fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color4dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
-{
- d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color4bv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
-{
- d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3usv(const GLushort *v)
-{
- d_1_0_Deprecated->f.Color3usv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_0_Deprecated->f.Color3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3uiv(const GLuint *v)
-{
- d_1_0_Deprecated->f.Color3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_0_Deprecated->f.Color3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3ubv(const GLubyte *v)
-{
- d_1_0_Deprecated->f.Color3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_0_Deprecated->f.Color3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3sv(const GLshort *v)
-{
- d_1_0_Deprecated->f.Color3sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_0_Deprecated->f.Color3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3iv(const GLint *v)
-{
- d_1_0_Deprecated->f.Color3iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_0_Deprecated->f.Color3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3fv(const GLfloat *v)
-{
- d_1_0_Deprecated->f.Color3fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_0_Deprecated->f.Color3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3dv(const GLdouble *v)
-{
- d_1_0_Deprecated->f.Color3dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_0_Deprecated->f.Color3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3bv(const GLbyte *v)
-{
- d_1_0_Deprecated->f.Color3bv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_0_Deprecated->f.Color3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
-{
- d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glBegin(GLenum mode)
-{
- d_1_0_Deprecated->f.Begin(mode);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glListBase(GLuint base)
-{
- d_1_0_Deprecated->f.ListBase(base);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Compatibility::glGenLists(GLsizei range)
-{
- return d_1_0_Deprecated->f.GenLists(range);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDeleteLists(GLuint list, GLsizei range)
-{
- d_1_0_Deprecated->f.DeleteLists(list, range);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCallLists(GLsizei n, GLenum type, const void *lists)
-{
- d_1_0_Deprecated->f.CallLists(n, type, lists);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCallList(GLuint list)
-{
- d_1_0_Deprecated->f.CallList(list);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEndList()
-{
- d_1_0_Deprecated->f.EndList();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNewList(GLuint list, GLenum mode)
-{
- d_1_0_Deprecated->f.NewList(list, mode);
-}
-
-
-// OpenGL 1.1 deprecated functions
-inline void QOpenGLFunctions_4_5_Compatibility::glPushClientAttrib(GLbitfield mask)
-{
- d_1_1_Deprecated->f.PushClientAttrib(mask);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPopClientAttrib()
-{
- d_1_1_Deprecated->f.PopClientAttrib();
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexubv(const GLubyte *c)
-{
- d_1_1_Deprecated->f.Indexubv(c);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexub(GLubyte c)
-{
- d_1_1_Deprecated->f.Indexub(c);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
-{
- d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
-{
- return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetPointerv(GLenum pname, void * *params)
-{
- d_1_1_Deprecated->f.GetPointerv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEnableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.EnableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glEdgeFlagPointer(GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glDisableClientState(GLenum array)
-{
- d_1_1_Deprecated->f.DisableClientState(array);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glArrayElement(GLint i)
-{
- d_1_1_Deprecated->f.ArrayElement(i);
-}
-
-
-// OpenGL 1.2 deprecated functions
-inline void QOpenGLFunctions_4_5_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table)
-{
- d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, void *table)
-{
- d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data)
-{
- d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image)
-{
- d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, void *image)
-{
- d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, void *row, void *column, void *span)
-{
- d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column)
-{
- d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values)
-{
- d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values)
-{
- d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
-{
- d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glResetHistogram(GLenum target)
-{
- d_1_2_Deprecated->f.ResetHistogram(target);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glResetMinmax(GLenum target)
-{
- d_1_2_Deprecated->f.ResetMinmax(target);
-}
-
-
-// OpenGL 1.3 deprecated functions
-inline void QOpenGLFunctions_4_5_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.MultTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
-{
- d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
-{
- d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
-{
- d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
-{
- d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
-{
- d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
-{
- d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glClientActiveTexture(GLenum texture)
-{
- d_1_3_Deprecated->f.ClientActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 deprecated functions
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos3sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
-{
- d_1_4_Deprecated->f.WindowPos3s(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos3iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
-{
- d_1_4_Deprecated->f.WindowPos3i(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos3fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
-{
- d_1_4_Deprecated->f.WindowPos3f(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos3dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
-{
- d_1_4_Deprecated->f.WindowPos3d(x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.WindowPos2sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2s(GLshort x, GLshort y)
-{
- d_1_4_Deprecated->f.WindowPos2s(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2iv(const GLint *v)
-{
- d_1_4_Deprecated->f.WindowPos2iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2i(GLint x, GLint y)
-{
- d_1_4_Deprecated->f.WindowPos2i(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.WindowPos2fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
-{
- d_1_4_Deprecated->f.WindowPos2f(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.WindowPos2dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
-{
- d_1_4_Deprecated->f.WindowPos2d(x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3usv(const GLushort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3usv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3uiv(const GLuint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3uiv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3ubv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3sv(const GLshort *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3sv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3iv(const GLint *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3iv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3fv(const GLfloat *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3fv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3dv(const GLdouble *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3dv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3bv(const GLbyte *v)
-{
- d_1_4_Deprecated->f.SecondaryColor3bv(v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
-{
- d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const void *pointer)
-{
- d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFogCoorddv(const GLdouble *coord)
-{
- d_1_4_Deprecated->f.FogCoorddv(coord);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFogCoordd(GLdouble coord)
-{
- d_1_4_Deprecated->f.FogCoordd(coord);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFogCoordfv(const GLfloat *coord)
-{
- d_1_4_Deprecated->f.FogCoordfv(coord);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glFogCoordf(GLfloat coord)
-{
- d_1_4_Deprecated->f.FogCoordf(coord);
-}
-
-
-// OpenGL 1.5 deprecated functions
-
-// OpenGL 2.0 deprecated functions
-
-// OpenGL 2.1 deprecated functions
-
-// OpenGL 3.0 deprecated functions
-
-// OpenGL 3.1 deprecated functions
-
-// OpenGL 3.2 deprecated functions
-
-// OpenGL 3.3 deprecated functions
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP4uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColorP4ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP4ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
-{
- d_3_3_Deprecated->f.ColorP3uiv(type, color);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glColorP3ui(GLenum type, GLuint color)
-{
- d_3_3_Deprecated->f.ColorP3ui(type, color);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.NormalP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.NormalP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
-{
- d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
-{
- d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP4uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexP4ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP4ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP3uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexP3ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP3ui(type, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
-{
- d_3_3_Deprecated->f.VertexP2uiv(type, value);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glVertexP2ui(GLenum type, GLuint value)
-{
- d_3_3_Deprecated->f.VertexP2ui(type, value);
-}
-
-
-// OpenGL 4.0 deprecated functions
-
-// OpenGL 4.1 deprecated functions
-
-// OpenGL 4.2 deprecated functions
-
-// OpenGL 4.3 deprecated functions
-
-// OpenGL 4.4 deprecated functions
-
-// OpenGL 4.5 deprecated functions
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values)
-{
- d_4_5_Deprecated->f.GetnMinmax(target, reset, format, type, bufSize, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values)
-{
- d_4_5_Deprecated->f.GetnHistogram(target, reset, format, type, bufSize, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnSeparableFilter(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span)
-{
- d_4_5_Deprecated->f.GetnSeparableFilter(target, format, type, rowBufSize, row, columnBufSize, column, span);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image)
-{
- d_4_5_Deprecated->f.GetnConvolutionFilter(target, format, type, bufSize, image);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table)
-{
- d_4_5_Deprecated->f.GetnColorTable(target, format, type, bufSize, table);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnPolygonStipple(GLsizei bufSize, GLubyte *pattern)
-{
- d_4_5_Deprecated->f.GetnPolygonStipple(bufSize, pattern);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnPixelMapusv(GLenum map, GLsizei bufSize, GLushort *values)
-{
- d_4_5_Deprecated->f.GetnPixelMapusv(map, bufSize, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint *values)
-{
- d_4_5_Deprecated->f.GetnPixelMapuiv(map, bufSize, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat *values)
-{
- d_4_5_Deprecated->f.GetnPixelMapfv(map, bufSize, values);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint *v)
-{
- d_4_5_Deprecated->f.GetnMapiv(target, query, bufSize, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v)
-{
- d_4_5_Deprecated->f.GetnMapfv(target, query, bufSize, v);
-}
-
-inline void QOpenGLFunctions_4_5_Compatibility::glGetnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v)
-{
- d_4_5_Deprecated->f.GetnMapdv(target, query, bufSize, v);
-}
-
-
-
-QT_END_NAMESPACE
-
-#ifdef Q_OS_WIN
-#pragma pop_macro("MemoryBarrier")
-#endif
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_4_5_core.cpp b/src/gui/opengl/qopenglfunctions_4_5_core.cpp
deleted file mode 100644
index 9c0369e5f2..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_5_core.cpp
+++ /dev/null
@@ -1,278 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglfunctions_4_5_core.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_4_5_Core
- \inmodule QtGui
- \since 5.5
- \wrapper
- \brief The QOpenGLFunctions_4_5_Core class provides all functions for OpenGL 4.5 core profile.
-
- This class is a wrapper for functions from OpenGL 4.5 core profile.
- See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
- for function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_4_5_Core::QOpenGLFunctions_4_5_Core()
- : QAbstractOpenGLFunctions()
- , d_1_0_Core(nullptr)
- , d_1_1_Core(nullptr)
- , d_1_2_Core(nullptr)
- , d_1_3_Core(nullptr)
- , d_1_4_Core(nullptr)
- , d_1_5_Core(nullptr)
- , d_2_0_Core(nullptr)
- , d_2_1_Core(nullptr)
- , d_3_0_Core(nullptr)
- , d_3_1_Core(nullptr)
- , d_3_2_Core(nullptr)
- , d_3_3_Core(nullptr)
- , d_4_0_Core(nullptr)
- , d_4_1_Core(nullptr)
- , d_4_2_Core(nullptr)
- , d_4_3_Core(nullptr)
- , d_4_4_Core(nullptr)
- , d_4_5_Core(nullptr)
-{
-}
-
-QOpenGLFunctions_4_5_Core::~QOpenGLFunctions_4_5_Core()
-{
- if (d_1_0_Core) {
- d_1_0_Core->refs.deref();
- Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
- }
- if (d_1_1_Core) {
- d_1_1_Core->refs.deref();
- Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
- }
- if (d_1_2_Core) {
- d_1_2_Core->refs.deref();
- Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
- }
- if (d_1_3_Core) {
- d_1_3_Core->refs.deref();
- Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
- }
- if (d_1_4_Core) {
- d_1_4_Core->refs.deref();
- Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
- }
- if (d_1_5_Core) {
- d_1_5_Core->refs.deref();
- Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
- }
- if (d_2_0_Core) {
- d_2_0_Core->refs.deref();
- Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
- }
- if (d_2_1_Core) {
- d_2_1_Core->refs.deref();
- Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
- }
- if (d_3_0_Core) {
- d_3_0_Core->refs.deref();
- Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
- }
- if (d_3_1_Core) {
- d_3_1_Core->refs.deref();
- Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
- }
- if (d_3_2_Core) {
- d_3_2_Core->refs.deref();
- Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
- }
- if (d_3_3_Core) {
- d_3_3_Core->refs.deref();
- Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
- }
- if (d_4_0_Core) {
- d_4_0_Core->refs.deref();
- Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
- }
- if (d_4_1_Core) {
- d_4_1_Core->refs.deref();
- Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
- }
- if (d_4_2_Core) {
- d_4_2_Core->refs.deref();
- Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
- }
- if (d_4_3_Core) {
- d_4_3_Core->refs.deref();
- Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
- }
- if (d_4_4_Core) {
- d_4_4_Core->refs.deref();
- Q_ASSERT(d_4_4_Core->refs.loadRelaxed());
- }
- if (d_4_5_Core) {
- d_4_5_Core->refs.deref();
- Q_ASSERT(d_4_5_Core->refs.loadRelaxed());
- }
-}
-
-bool QOpenGLFunctions_4_5_Core::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is capable of resolving all needed functions
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_4_5_Core::isContextCompatible(context))
- {
- // Associate with private implementation, creating if necessary
- // Function pointers in the backends are resolved at creation time
- QOpenGLVersionFunctionsBackend* d = nullptr;
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
- d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
- d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
- d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
- d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
- d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
- d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
- d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
- d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
- d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
- d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
- d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
- d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
- d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
- d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
- d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
- d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_4_CoreBackend::versionStatus());
- d_4_4_Core = static_cast<QOpenGLFunctions_4_4_CoreBackend*>(d);
- d->refs.ref();
-
- d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_5_CoreBackend::versionStatus());
- d_4_5_Core = static_cast<QOpenGLFunctions_4_5_CoreBackend*>(d);
- d->refs.ref();
-
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_4_5_Core::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(4, 5))
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_4_5_Core::versionProfile()
-{
- QOpenGLVersionProfile v;
- v.setVersion(4, 5);
- v.setProfile(QSurfaceFormat::CoreProfile);
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_4_5_core.h b/src/gui/opengl/qopenglfunctions_4_5_core.h
deleted file mode 100644
index bf872c628b..0000000000
--- a/src/gui/opengl/qopenglfunctions_4_5_core.h
+++ /dev/null
@@ -1,4072 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_4_5_CORE_H
-#define QOPENGLVERSIONFUNCTIONS_4_5_CORE_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-// MemoryBarrier is a macro on some architectures on Windows
-#ifdef Q_OS_WIN
-#pragma push_macro("MemoryBarrier")
-#undef MemoryBarrier
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class Q_GUI_EXPORT QOpenGLFunctions_4_5_Core : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_4_5_Core();
- ~QOpenGLFunctions_4_5_Core();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL 1.0 core functions
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- void glDepthRange(GLdouble nearVal, GLdouble farVal);
- GLboolean glIsEnabled(GLenum cap);
- void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
- const GLubyte * glGetString(GLenum name);
- void glGetIntegerv(GLenum pname, GLint *data);
- void glGetFloatv(GLenum pname, GLfloat *data);
- GLenum glGetError();
- void glGetDoublev(GLenum pname, GLdouble *data);
- void glGetBooleanv(GLenum pname, GLboolean *data);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
- void glReadBuffer(GLenum src);
- void glPixelStorei(GLenum pname, GLint param);
- void glPixelStoref(GLenum pname, GLfloat param);
- void glDepthFunc(GLenum func);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glLogicOp(GLenum opcode);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glFlush();
- void glFinish();
- void glEnable(GLenum cap);
- void glDisable(GLenum cap);
- void glDepthMask(GLboolean flag);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glStencilMask(GLuint mask);
- void glClearDepth(GLdouble depth);
- void glClearStencil(GLint s);
- void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glClear(GLbitfield mask);
- void glDrawBuffer(GLenum buf);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
- void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glPolygonMode(GLenum face, GLenum mode);
- void glPointSize(GLfloat size);
- void glLineWidth(GLfloat width);
- void glHint(GLenum target, GLenum mode);
- void glFrontFace(GLenum mode);
- void glCullFace(GLenum mode);
-
- // OpenGL 1.1 core functions
- GLboolean glIsTexture(GLuint texture);
- void glGenTextures(GLsizei n, GLuint *textures);
- void glDeleteTextures(GLsizei n, const GLuint *textures);
- void glBindTexture(GLenum target, GLuint texture);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
- void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
-
- // OpenGL 1.2 core functions
- void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void glBlendEquation(GLenum mode);
- void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
- void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
- void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
-
- // OpenGL 1.3 core functions
- void glGetCompressedTexImage(GLenum target, GLint level, void *img);
- void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
- void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
- void glSampleCoverage(GLfloat value, GLboolean invert);
- void glActiveTexture(GLenum texture);
-
- // OpenGL 1.4 core functions
- void glPointParameteriv(GLenum pname, const GLint *params);
- void glPointParameteri(GLenum pname, GLint param);
- void glPointParameterfv(GLenum pname, const GLfloat *params);
- void glPointParameterf(GLenum pname, GLfloat param);
- void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount);
- void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
- void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-
- // OpenGL 1.5 core functions
- void glGetBufferPointerv(GLenum target, GLenum pname, void * *params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- GLboolean glUnmapBuffer(GLenum target);
- void * glMapBuffer(GLenum target, GLenum access);
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
- void glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
- GLboolean glIsBuffer(GLuint buffer);
- void glGenBuffers(GLsizei n, GLuint *buffers);
- void glDeleteBuffers(GLsizei n, const GLuint *buffers);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
- void glEndQuery(GLenum target);
- void glBeginQuery(GLenum target, GLuint id);
- GLboolean glIsQuery(GLuint id);
- void glDeleteQueries(GLsizei n, const GLuint *ids);
- void glGenQueries(GLsizei n, GLuint *ids);
-
- // OpenGL 2.0 core functions
- void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
- void glVertexAttrib4usv(GLuint index, const GLushort *v);
- void glVertexAttrib4uiv(GLuint index, const GLuint *v);
- void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4sv(GLuint index, const GLshort *v);
- void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
- void glVertexAttrib4iv(GLuint index, const GLint *v);
- void glVertexAttrib4fv(GLuint index, const GLfloat *v);
- void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4dv(GLuint index, const GLdouble *v);
- void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttrib4bv(GLuint index, const GLbyte *v);
- void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
- void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
- void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
- void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
- void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
- void glVertexAttrib4Niv(GLuint index, const GLint *v);
- void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
- void glVertexAttrib3sv(GLuint index, const GLshort *v);
- void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
- void glVertexAttrib3fv(GLuint index, const GLfloat *v);
- void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3dv(GLuint index, const GLdouble *v);
- void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttrib2sv(GLuint index, const GLshort *v);
- void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
- void glVertexAttrib2fv(GLuint index, const GLfloat *v);
- void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void glVertexAttrib2dv(GLuint index, const GLdouble *v);
- void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttrib1sv(GLuint index, const GLshort *v);
- void glVertexAttrib1s(GLuint index, GLshort x);
- void glVertexAttrib1fv(GLuint index, const GLfloat *v);
- void glVertexAttrib1f(GLuint index, GLfloat x);
- void glVertexAttrib1dv(GLuint index, const GLdouble *v);
- void glVertexAttrib1d(GLuint index, GLdouble x);
- void glValidateProgram(GLuint program);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniform4iv(GLint location, GLsizei count, const GLint *value);
- void glUniform3iv(GLint location, GLsizei count, const GLint *value);
- void glUniform2iv(GLint location, GLsizei count, const GLint *value);
- void glUniform1iv(GLint location, GLsizei count, const GLint *value);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- void glUniform2i(GLint location, GLint v0, GLint v1);
- void glUniform1i(GLint location, GLint v0);
- void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- void glUniform1f(GLint location, GLfloat v0);
- void glUseProgram(GLuint program);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
- void glLinkProgram(GLuint program);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsProgram(GLuint program);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
- void glGetUniformiv(GLuint program, GLint location, GLint *params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
- GLint glGetUniformLocation(GLuint program, const GLchar *name);
- void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- GLint glGetAttribLocation(GLuint program, const GLchar *name);
- void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- void glEnableVertexAttribArray(GLuint index);
- void glDisableVertexAttribArray(GLuint index);
- void glDetachShader(GLuint program, GLuint shader);
- void glDeleteShader(GLuint shader);
- void glDeleteProgram(GLuint program);
- GLuint glCreateShader(GLenum type);
- GLuint glCreateProgram();
- void glCompileShader(GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void glAttachShader(GLuint program, GLuint shader);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
- void glDrawBuffers(GLsizei n, const GLenum *bufs);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-
- // OpenGL 2.1 core functions
- void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- // OpenGL 3.0 core functions
- GLboolean glIsVertexArray(GLuint array);
- void glGenVertexArrays(GLsizei n, GLuint *arrays);
- void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- void glBindVertexArray(GLuint array);
- void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- void * glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glGenerateMipmap(GLenum target);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- const GLubyte * glGetStringi(GLenum name, GLuint index);
- void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
- void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
- void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glUniform2ui(GLint location, GLuint v0, GLuint v1);
- void glUniform1ui(GLint location, GLuint v0);
- GLint glGetFragDataLocation(GLuint program, const GLchar *name);
- void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
- void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
- void glVertexAttribI4usv(GLuint index, const GLushort *v);
- void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
- void glVertexAttribI4sv(GLuint index, const GLshort *v);
- void glVertexAttribI4bv(GLuint index, const GLbyte *v);
- void glVertexAttribI4uiv(GLuint index, const GLuint *v);
- void glVertexAttribI3uiv(GLuint index, const GLuint *v);
- void glVertexAttribI2uiv(GLuint index, const GLuint *v);
- void glVertexAttribI1uiv(GLuint index, const GLuint *v);
- void glVertexAttribI4iv(GLuint index, const GLint *v);
- void glVertexAttribI3iv(GLuint index, const GLint *v);
- void glVertexAttribI2iv(GLuint index, const GLint *v);
- void glVertexAttribI1iv(GLuint index, const GLint *v);
- void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
- void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
- void glVertexAttribI1ui(GLuint index, GLuint x);
- void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
- void glVertexAttribI2i(GLuint index, GLint x, GLint y);
- void glVertexAttribI1i(GLuint index, GLint x);
- void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glEndConditionalRender();
- void glBeginConditionalRender(GLuint id, GLenum mode);
- void glClampColor(GLenum target, GLenum clamp);
- void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
- void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
- void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glEndTransformFeedback();
- void glBeginTransformFeedback(GLenum primitiveMode);
- GLboolean glIsEnabledi(GLenum target, GLuint index);
- void glDisablei(GLenum target, GLuint index);
- void glEnablei(GLenum target, GLuint index);
- void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
- void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
- // OpenGL 3.1 core functions
- void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
- void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices);
- void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
- void glPrimitiveRestartIndex(GLuint index);
- void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
-
- // OpenGL 3.2 core functions
- void glSampleMaski(GLuint maskNumber, GLbitfield mask);
- void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
- void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
- void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- void glGetInteger64v(GLenum pname, GLint64 *data);
- void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void glDeleteSync(GLsync sync);
- GLboolean glIsSync(GLsync sync);
- GLsync glFenceSync(GLenum condition, GLbitfield flags);
- void glProvokingVertex(GLenum mode);
- void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex);
- void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
- void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
- void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-
- // OpenGL 3.3 core functions
- void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
- void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
- void glVertexAttribDivisor(GLuint index, GLuint divisor);
- void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
- void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void glQueryCounter(GLuint id, GLenum target);
- void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
- void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
- void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void glBindSampler(GLuint unit, GLuint sampler);
- GLboolean glIsSampler(GLuint sampler);
- void glDeleteSamplers(GLsizei count, const GLuint *samplers);
- void glGenSamplers(GLsizei count, GLuint *samplers);
- GLint glGetFragDataIndex(GLuint program, const GLchar *name);
- void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
-
- // OpenGL 4.0 core functions
- void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
- void glEndQueryIndexed(GLenum target, GLuint index);
- void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
- void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
- void glDrawTransformFeedback(GLenum mode, GLuint id);
- void glResumeTransformFeedback();
- void glPauseTransformFeedback();
- GLboolean glIsTransformFeedback(GLuint id);
- void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void glBindTransformFeedback(GLenum target, GLuint id);
- void glPatchParameterfv(GLenum pname, const GLfloat *values);
- void glPatchParameteri(GLenum pname, GLint value);
- void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
- void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
- void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
- void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
- void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
- GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
- GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
- void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
- void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
- void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
- void glUniform2d(GLint location, GLdouble x, GLdouble y);
- void glUniform1d(GLint location, GLdouble x);
- void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
- void glDrawArraysIndirect(GLenum mode, const void *indirect);
- void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- void glBlendEquationi(GLuint buf, GLenum mode);
- void glMinSampleShading(GLfloat value);
-
- // OpenGL 4.1 core functions
- void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
- void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
- void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
- void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
- void glScissorIndexedv(GLuint index, const GLint *v);
- void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
- void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
- void glViewportIndexedfv(GLuint index, const GLfloat *v);
- void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
- void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
- void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
- void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
- void glVertexAttribL4dv(GLuint index, const GLdouble *v);
- void glVertexAttribL3dv(GLuint index, const GLdouble *v);
- void glVertexAttribL2dv(GLuint index, const GLdouble *v);
- void glVertexAttribL1dv(GLuint index, const GLdouble *v);
- void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
- void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
- void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
- void glVertexAttribL1d(GLuint index, GLdouble x);
- void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- void glValidateProgramPipeline(GLuint pipeline);
- void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
- void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
- void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
- void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
- void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
- void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
- void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
- void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
- void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void glProgramUniform1i(GLuint program, GLint location, GLint v0);
- void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- GLboolean glIsProgramPipeline(GLuint pipeline);
- void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
- void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- void glBindProgramPipeline(GLuint pipeline);
- GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
- void glActiveShaderProgram(GLuint pipeline, GLuint program);
- void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- void glProgramParameteri(GLuint program, GLenum pname, GLint value);
- void glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
- void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
- void glClearDepthf(GLfloat dd);
- void glDepthRangef(GLfloat n, GLfloat f);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
- void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
- void glReleaseShaderCompiler();
-
- // OpenGL 4.2 core functions
- void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
- void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
- void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
- void glMemoryBarrier(GLbitfield barriers);
- void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
- void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
- void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
- void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
- void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
- void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
-
- // OpenGL 4.3 core functions
- void glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
- void glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
- void glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
- void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
- void glPopDebugGroup();
- void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message);
- GLuint glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
- void glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
- void glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
- void glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
- void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
- void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
- void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
- void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
- void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
- void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
- GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
- GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
- void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
- GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
- void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
- void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
- void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
- void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
- void glInvalidateBufferData(GLuint buffer);
- void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
- void glInvalidateTexImage(GLuint texture, GLint level);
- void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
- void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
- void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
- void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
- void glDispatchComputeIndirect(GLintptr indirect);
- void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
- void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
- void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
-
- // OpenGL 4.4 core functions
- void glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
- void glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures);
- void glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers);
- void glBindTextures(GLuint first, GLsizei count, const GLuint *textures);
- void glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);
- void glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers);
- void glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
- void glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
- void glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
-
- // OpenGL 4.5 core functions
- void glTextureBarrier();
- void glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
- void glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params);
- void glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params);
- void glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
- void glGetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params);
- void glGetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
- void glGetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels);
- GLenum glGetGraphicsResetStatus();
- void glGetCompressedTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels);
- void glGetTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
- void glMemoryBarrierByRegion(GLbitfield barriers);
- void glCreateQueries(GLenum target, GLsizei n, GLuint *ids);
- void glCreateProgramPipelines(GLsizei n, GLuint *pipelines);
- void glCreateSamplers(GLsizei n, GLuint *samplers);
- void glGetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64 *param);
- void glGetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint *param);
- void glGetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param);
- void glVertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor);
- void glVertexArrayAttribLFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexArrayAttribIFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- void glVertexArrayAttribFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
- void glVertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex);
- void glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
- void glVertexArrayVertexBuffer(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
- void glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer);
- void glEnableVertexArrayAttrib(GLuint vaobj, GLuint index);
- void glDisableVertexArrayAttrib(GLuint vaobj, GLuint index);
- void glCreateVertexArrays(GLsizei n, GLuint *arrays);
- void glGetTextureParameteriv(GLuint texture, GLenum pname, GLint *params);
- void glGetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params);
- void glGetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params);
- void glGetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params);
- void glGetTextureLevelParameteriv(GLuint texture, GLint level, GLenum pname, GLint *params);
- void glGetTextureLevelParameterfv(GLuint texture, GLint level, GLenum pname, GLfloat *params);
- void glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, void *pixels);
- void glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
- void glBindTextureUnit(GLuint unit, GLuint texture);
- void glGenerateTextureMipmap(GLuint texture);
- void glTextureParameteriv(GLuint texture, GLenum pname, const GLint *param);
- void glTextureParameterIuiv(GLuint texture, GLenum pname, const GLuint *params);
- void glTextureParameterIiv(GLuint texture, GLenum pname, const GLint *params);
- void glTextureParameteri(GLuint texture, GLenum pname, GLint param);
- void glTextureParameterfv(GLuint texture, GLenum pname, const GLfloat *param);
- void glTextureParameterf(GLuint texture, GLenum pname, GLfloat param);
- void glCopyTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- void glCopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
- void glCompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
- void glCompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
- void glTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
- void glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
- void glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
- void glTextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- void glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- void glTextureStorage3D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- void glTextureStorage2D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- void glTextureStorage1D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);
- void glTextureBufferRange(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size);
- void glTextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer);
- void glCreateTextures(GLenum target, GLsizei n, GLuint *textures);
- void glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params);
- void glNamedRenderbufferStorageMultisample(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- void glNamedRenderbufferStorage(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);
- void glCreateRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params);
- void glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param);
- GLenum glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target);
- void glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- void glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil);
- void glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value);
- void glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value);
- void glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value);
- void glInvalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
- void glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments);
- void glNamedFramebufferReadBuffer(GLuint framebuffer, GLenum src);
- void glNamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum *bufs);
- void glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf);
- void glNamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);
- void glNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);
- void glNamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param);
- void glNamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glCreateFramebuffers(GLsizei n, GLuint *framebuffers);
- void glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, void *data);
- void glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void * *params);
- void glGetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64 *params);
- void glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params);
- void glFlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length);
- GLboolean glUnmapNamedBuffer(GLuint buffer);
- void * glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access);
- void * glMapNamedBuffer(GLuint buffer, GLenum access);
- void glClearNamedBufferSubData(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data);
- void glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);
- void glCopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size);
- void glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, const void *data);
- void glNamedBufferData(GLuint buffer, GLsizei size, const void *data, GLenum usage);
- void glNamedBufferStorage(GLuint buffer, GLsizei size, const void *data, GLbitfield flags);
- void glCreateBuffers(GLsizei n, GLuint *buffers);
- void glGetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param);
- void glGetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param);
- void glGetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param);
- void glTransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size);
- void glTransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer);
- void glCreateTransformFeedbacks(GLsizei n, GLuint *ids);
- void glClipControl(GLenum origin, GLenum depth);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
- QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
- QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
- QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
- QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
- QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
- QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
- QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
- QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
- QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
- QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
- QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
- QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
- QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
- QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
- QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
- QOpenGLFunctions_4_4_CoreBackend* d_4_4_Core;
- QOpenGLFunctions_4_5_CoreBackend* d_4_5_Core;
-};
-
-// OpenGL 1.0 core functions
-inline void QOpenGLFunctions_4_5_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Viewport(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
-{
- d_1_0_Core->f.DepthRange(nearVal, farVal);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsEnabled(GLenum cap)
-{
- return d_1_0_Core->f.IsEnabled(cap);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_0_Core->f.GetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- d_1_0_Core->f.GetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
-{
- d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_5_Core::glGetString(GLenum name)
-{
- return d_1_0_Core->f.GetString(name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetIntegerv(GLenum pname, GLint *data)
-{
- d_1_0_Core->f.GetIntegerv(pname, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetFloatv(GLenum pname, GLfloat *data)
-{
- d_1_0_Core->f.GetFloatv(pname, data);
-}
-
-inline GLenum QOpenGLFunctions_4_5_Core::glGetError()
-{
- return d_1_0_Core->f.GetError();
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetDoublev(GLenum pname, GLdouble *data)
-{
- d_1_0_Core->f.GetDoublev(pname, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetBooleanv(GLenum pname, GLboolean *data)
-{
- d_1_0_Core->f.GetBooleanv(pname, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
-{
- d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glReadBuffer(GLenum src)
-{
- d_1_0_Core->f.ReadBuffer(src);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPixelStorei(GLenum pname, GLint param)
-{
- d_1_0_Core->f.PixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPixelStoref(GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.PixelStoref(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDepthFunc(GLenum func)
-{
- d_1_0_Core->f.DepthFunc(func);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- d_1_0_Core->f.StencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- d_1_0_Core->f.StencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glLogicOp(GLenum opcode)
-{
- d_1_0_Core->f.LogicOp(opcode);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- d_1_0_Core->f.BlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFlush()
-{
- d_1_0_Core->f.Flush();
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFinish()
-{
- d_1_0_Core->f.Finish();
-}
-
-inline void QOpenGLFunctions_4_5_Core::glEnable(GLenum cap)
-{
- d_1_0_Core->f.Enable(cap);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDisable(GLenum cap)
-{
- d_1_0_Core->f.Disable(cap);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDepthMask(GLboolean flag)
-{
- d_1_0_Core->f.DepthMask(flag);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- d_1_0_Core->f.ColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glStencilMask(GLuint mask)
-{
- d_1_0_Core->f.StencilMask(mask);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearDepth(GLdouble depth)
-{
- d_1_0_Core->f.ClearDepth(depth);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearStencil(GLint s)
-{
- d_1_0_Core->f.ClearStencil(s);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_0_Core->f.ClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClear(GLbitfield mask)
-{
- d_1_0_Core->f.Clear(mask);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawBuffer(GLenum buf)
-{
- d_1_0_Core->f.DrawBuffer(buf);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- d_1_0_Core->f.TexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_1_0_Core->f.TexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- d_1_0_Core->f.TexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- d_1_0_Core->f.TexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_0_Core->f.Scissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPolygonMode(GLenum face, GLenum mode)
-{
- d_1_0_Core->f.PolygonMode(face, mode);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPointSize(GLfloat size)
-{
- d_1_0_Core->f.PointSize(size);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glLineWidth(GLfloat width)
-{
- d_1_0_Core->f.LineWidth(width);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glHint(GLenum target, GLenum mode)
-{
- d_1_0_Core->f.Hint(target, mode);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFrontFace(GLenum mode)
-{
- d_1_0_Core->f.FrontFace(mode);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCullFace(GLenum mode)
-{
- d_1_0_Core->f.CullFace(mode);
-}
-
-
-// OpenGL 1.1 core functions
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsTexture(GLuint texture)
-{
- return d_1_1_Core->f.IsTexture(texture);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGenTextures(GLsizei n, GLuint *textures)
-{
- d_1_1_Core->f.GenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
-{
- d_1_1_Core->f.DeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindTexture(GLenum target, GLuint texture)
-{
- d_1_1_Core->f.BindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
-{
- d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
-{
- d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
-{
- d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- d_1_1_Core->f.PolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
-{
- d_1_1_Core->f.DrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- d_1_1_Core->f.DrawArrays(mode, first, count);
-}
-
-
-// OpenGL 1.2 core functions
-inline void QOpenGLFunctions_4_5_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- d_1_2_Core->f.BlendColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBlendEquation(GLenum mode)
-{
- d_1_2_Core->f.BlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
-{
- d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
-{
- d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices)
-{
- d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
-}
-
-
-// OpenGL 1.3 core functions
-inline void QOpenGLFunctions_4_5_Core::glGetCompressedTexImage(GLenum target, GLint level, void *img)
-{
- d_1_3_Core->f.GetCompressedTexImage(target, level, img);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
-{
- d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glSampleCoverage(GLfloat value, GLboolean invert)
-{
- d_1_3_Core->f.SampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glActiveTexture(GLenum texture)
-{
- d_1_3_Core->f.ActiveTexture(texture);
-}
-
-
-// OpenGL 1.4 core functions
-inline void QOpenGLFunctions_4_5_Core::glPointParameteriv(GLenum pname, const GLint *params)
-{
- d_1_4_Core->f.PointParameteriv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPointParameteri(GLenum pname, GLint param)
-{
- d_1_4_Core->f.PointParameteri(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
-{
- d_1_4_Core->f.PointParameterfv(pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPointParameterf(GLenum pname, GLfloat param)
-{
- d_1_4_Core->f.PointParameterf(pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
-{
- d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
-{
- d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
-}
-
-
-// OpenGL 1.5 core functions
-inline void QOpenGLFunctions_4_5_Core::glGetBufferPointerv(GLenum target, GLenum pname, void * *params)
-{
- d_1_5_Core->f.GetBufferPointerv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glUnmapBuffer(GLenum target)
-{
- return d_1_5_Core->f.UnmapBuffer(target);
-}
-
-inline void * QOpenGLFunctions_4_5_Core::glMapBuffer(GLenum target, GLenum access)
-{
- return d_1_5_Core->f.MapBuffer(target, access);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data)
-{
- d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
-{
- d_1_5_Core->f.BufferSubData(target, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
-{
- d_1_5_Core->f.BufferData(target, size, data, usage);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsBuffer(GLuint buffer)
-{
- return d_1_5_Core->f.IsBuffer(buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGenBuffers(GLsizei n, GLuint *buffers)
-{
- d_1_5_Core->f.GenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
- d_1_5_Core->f.DeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindBuffer(GLenum target, GLuint buffer)
-{
- d_1_5_Core->f.BindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- d_1_5_Core->f.GetQueryiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glEndQuery(GLenum target)
-{
- d_1_5_Core->f.EndQuery(target);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBeginQuery(GLenum target, GLuint id)
-{
- d_1_5_Core->f.BeginQuery(target, id);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsQuery(GLuint id)
-{
- return d_1_5_Core->f.IsQuery(id);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
-{
- d_1_5_Core->f.DeleteQueries(n, ids);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGenQueries(GLsizei n, GLuint *ids)
-{
- d_1_5_Core->f.GenQueries(n, ids);
-}
-
-
-// OpenGL 2.0 core functions
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)
-{
- d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4usv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4uiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
-{
- d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4iv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib4fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4bv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nusv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
- d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
-{
- d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib4Nsv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Niv(GLuint index, const GLint *v)
-{
- d_2_0_Core->f.VertexAttrib4Niv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
- d_2_0_Core->f.VertexAttrib4Nbv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib3sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
-{
- d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib3fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib2sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
-{
- d_2_0_Core->f.VertexAttrib2s(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib2fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- d_2_0_Core->f.VertexAttrib2f(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_2_0_Core->f.VertexAttrib2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1sv(GLuint index, const GLshort *v)
-{
- d_2_0_Core->f.VertexAttrib1sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1s(GLuint index, GLshort x)
-{
- d_2_0_Core->f.VertexAttrib1s(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1fv(GLuint index, const GLfloat *v)
-{
- d_2_0_Core->f.VertexAttrib1fv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1f(GLuint index, GLfloat x)
-{
- d_2_0_Core->f.VertexAttrib1f(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1dv(GLuint index, const GLdouble *v)
-{
- d_2_0_Core->f.VertexAttrib1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1d(GLuint index, GLdouble x)
-{
- d_2_0_Core->f.VertexAttrib1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glValidateProgram(GLuint program)
-{
- d_2_0_Core->f.ValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform4iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform3iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform2iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
-{
- d_2_0_Core->f.Uniform1iv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform4fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform3fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform2fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
-{
- d_2_0_Core->f.Uniform1fv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform2i(GLint location, GLint v0, GLint v1)
-{
- d_2_0_Core->f.Uniform2i(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform1i(GLint location, GLint v0)
-{
- d_2_0_Core->f.Uniform1i(location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
-{
- d_2_0_Core->f.Uniform2f(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform1f(GLint location, GLfloat v0)
-{
- d_2_0_Core->f.Uniform1f(location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUseProgram(GLuint program)
-{
- d_2_0_Core->f.UseProgram(program);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
-{
- d_2_0_Core->f.ShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glLinkProgram(GLuint program)
-{
- d_2_0_Core->f.LinkProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsShader(GLuint shader)
-{
- return d_2_0_Core->f.IsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsProgram(GLuint program)
-{
- return d_2_0_Core->f.IsProgram(program);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer)
-{
- d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
-{
- d_2_0_Core->f.GetUniformiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- d_2_0_Core->f.GetUniformfv(program, location, params);
-}
-
-inline GLint QOpenGLFunctions_4_5_Core::glGetUniformLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
- d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- d_2_0_Core->f.GetProgramiv(program, pname, params);
-}
-
-inline GLint QOpenGLFunctions_4_5_Core::glGetAttribLocation(GLuint program, const GLchar *name)
-{
- return d_2_0_Core->f.GetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
-{
- d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, shaders);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
- d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glEnableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.EnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDisableVertexAttribArray(GLuint index)
-{
- d_2_0_Core->f.DisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDetachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.DetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteShader(GLuint shader)
-{
- d_2_0_Core->f.DeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteProgram(GLuint program)
-{
- d_2_0_Core->f.DeleteProgram(program);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Core::glCreateShader(GLenum type)
-{
- return d_2_0_Core->f.CreateShader(type);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Core::glCreateProgram()
-{
- return d_2_0_Core->f.CreateProgram();
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCompileShader(GLuint shader)
-{
- d_2_0_Core->f.CompileShader(shader);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- d_2_0_Core->f.BindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glAttachShader(GLuint program, GLuint shader)
-{
- d_2_0_Core->f.AttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- d_2_0_Core->f.StencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
-{
- d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
-{
- d_2_0_Core->f.DrawBuffers(n, bufs);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-
-// OpenGL 2.1 core functions
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
-}
-
-
-// OpenGL 3.0 core functions
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsVertexArray(GLuint array)
-{
- return d_3_0_Core->f.IsVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_3_0_Core->f.GenVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- d_3_0_Core->f.DeleteVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindVertexArray(GLuint array)
-{
- d_3_0_Core->f.BindVertexArray(array);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
-{
- d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
-}
-
-inline void * QOpenGLFunctions_4_5_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
- return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGenerateMipmap(GLenum target)
-{
- d_3_0_Core->f.GenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
- d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
-}
-
-inline GLenum QOpenGLFunctions_4_5_Core::glCheckFramebufferStatus(GLenum target)
-{
- return d_3_0_Core->f.CheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_3_0_Core->f.GenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- d_3_0_Core->f.BindFramebuffer(target, framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsFramebuffer(GLuint framebuffer)
-{
- return d_3_0_Core->f.IsFramebuffer(framebuffer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsRenderbuffer(GLuint renderbuffer)
-{
- return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
-}
-
-inline const GLubyte * QOpenGLFunctions_4_5_Core::glGetStringi(GLenum name, GLuint index)
-{
- return d_3_0_Core->f.GetStringi(name, index);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
-{
- d_3_0_Core->f.TexParameterIuiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
-{
- d_3_0_Core->f.TexParameterIiv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform4uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform3uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform2uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- d_3_0_Core->f.Uniform1uiv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- d_3_0_Core->f.Uniform2ui(location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform1ui(GLint location, GLuint v0)
-{
- d_3_0_Core->f.Uniform1ui(location, v0);
-}
-
-inline GLint QOpenGLFunctions_4_5_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
-{
- return d_3_0_Core->f.GetFragDataLocation(program, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
-{
- d_3_0_Core->f.BindFragDataLocation(program, color, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- d_3_0_Core->f.GetUniformuiv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4usv(GLuint index, const GLushort *v)
-{
- d_3_0_Core->f.VertexAttribI4usv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
-{
- d_3_0_Core->f.VertexAttribI4ubv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4sv(GLuint index, const GLshort *v)
-{
- d_3_0_Core->f.VertexAttribI4sv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4bv(GLuint index, const GLbyte *v)
-{
- d_3_0_Core->f.VertexAttribI4bv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI4uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI3uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI3uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI2uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI2uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI1uiv(GLuint index, const GLuint *v)
-{
- d_3_0_Core->f.VertexAttribI1uiv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI4iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI3iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI3iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI2iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI2iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI1iv(GLuint index, const GLint *v)
-{
- d_3_0_Core->f.VertexAttribI1iv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
- d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
- d_3_0_Core->f.VertexAttribI2ui(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI1ui(GLuint index, GLuint x)
-{
- d_3_0_Core->f.VertexAttribI1ui(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
-{
- d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI2i(GLuint index, GLint x, GLint y)
-{
- d_3_0_Core->f.VertexAttribI2i(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribI1i(GLuint index, GLint x)
-{
- d_3_0_Core->f.VertexAttribI1i(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glEndConditionalRender()
-{
- d_3_0_Core->f.EndConditionalRender();
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBeginConditionalRender(GLuint id, GLenum mode)
-{
- d_3_0_Core->f.BeginConditionalRender(id, mode);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClampColor(GLenum target, GLenum clamp)
-{
- d_3_0_Core->f.ClampColor(target, clamp);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
-{
- d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const *varyings, GLenum bufferMode)
-{
- d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
-{
- d_3_0_Core->f.BindBufferBase(target, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glEndTransformFeedback()
-{
- d_3_0_Core->f.EndTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBeginTransformFeedback(GLenum primitiveMode)
-{
- d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsEnabledi(GLenum target, GLuint index)
-{
- return d_3_0_Core->f.IsEnabledi(target, index);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDisablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Disablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glEnablei(GLenum target, GLuint index)
-{
- d_3_0_Core->f.Enablei(target, index);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- d_3_0_Core->f.GetIntegeri_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- d_3_0_Core->f.GetBooleani_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
- d_3_0_Core->f.ColorMaski(index, r, g, b, a);
-}
-
-
-// OpenGL 3.1 core functions
-inline void QOpenGLFunctions_4_5_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
- d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
-{
- d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
- d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices)
-{
- d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
-{
- d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPrimitiveRestartIndex(GLuint index)
-{
- d_3_1_Core->f.PrimitiveRestartIndex(index);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
-{
- d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
-{
- d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
-}
-
-
-// OpenGL 3.2 core functions
-inline void QOpenGLFunctions_4_5_Core::glSampleMaski(GLuint maskNumber, GLbitfield mask)
-{
- d_3_2_Core->f.SampleMaski(maskNumber, mask);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- d_3_2_Core->f.GetMultisamplefv(pname, index, val);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
- d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
-{
- d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64i_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetInteger64v(GLenum pname, GLint64 *data)
-{
- d_3_2_Core->f.GetInteger64v(pname, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- d_3_2_Core->f.WaitSync(sync, flags, timeout);
-}
-
-inline GLenum QOpenGLFunctions_4_5_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteSync(GLsync sync)
-{
- d_3_2_Core->f.DeleteSync(sync);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsSync(GLsync sync)
-{
- return d_3_2_Core->f.IsSync(sync);
-}
-
-inline GLsync QOpenGLFunctions_4_5_Core::glFenceSync(GLenum condition, GLbitfield flags)
-{
- return d_3_2_Core->f.FenceSync(condition, flags);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProvokingVertex(GLenum mode)
-{
- d_3_2_Core->f.ProvokingVertex(mode);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex)
-{
- d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
-{
- d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
-}
-
-
-// OpenGL 3.3 core functions
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
-{
- d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
-{
- d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
-{
- d_3_3_Core->f.VertexAttribDivisor(index, divisor);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glQueryCounter(GLuint id, GLenum target)
-{
- d_3_3_Core->f.QueryCounter(id, target);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
-{
- d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindSampler(GLuint unit, GLuint sampler)
-{
- d_3_3_Core->f.BindSampler(unit, sampler);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsSampler(GLuint sampler)
-{
- return d_3_3_Core->f.IsSampler(sampler);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
-{
- d_3_3_Core->f.DeleteSamplers(count, samplers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGenSamplers(GLsizei count, GLuint *samplers)
-{
- d_3_3_Core->f.GenSamplers(count, samplers);
-}
-
-inline GLint QOpenGLFunctions_4_5_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
-{
- return d_3_3_Core->f.GetFragDataIndex(program, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
-{
- d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
-}
-
-
-// OpenGL 4.0 core functions
-inline void QOpenGLFunctions_4_5_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
-{
- d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glEndQueryIndexed(GLenum target, GLuint index)
-{
- d_4_0_Core->f.EndQueryIndexed(target, index);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
-{
- d_4_0_Core->f.BeginQueryIndexed(target, index, id);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
-{
- d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
-{
- d_4_0_Core->f.DrawTransformFeedback(mode, id);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glResumeTransformFeedback()
-{
- d_4_0_Core->f.ResumeTransformFeedback();
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPauseTransformFeedback()
-{
- d_4_0_Core->f.PauseTransformFeedback();
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsTransformFeedback(GLuint id)
-{
- return d_4_0_Core->f.IsTransformFeedback(id);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_0_Core->f.GenTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindTransformFeedback(GLenum target, GLuint id)
-{
- d_4_0_Core->f.BindTransformFeedback(target, id);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
-{
- d_4_0_Core->f.PatchParameterfv(pname, values);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPatchParameteri(GLenum pname, GLint value)
-{
- d_4_0_Core->f.PatchParameteri(pname, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
-{
- d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
-{
- d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
-{
- d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
-}
-
-inline GLint QOpenGLFunctions_4_5_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
-{
- return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
-{
- d_4_0_Core->f.GetUniformdv(program, location, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform4dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform3dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform2dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_0_Core->f.Uniform1dv(location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_0_Core->f.Uniform4d(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_0_Core->f.Uniform3d(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
-{
- d_4_0_Core->f.Uniform2d(location, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUniform1d(GLint location, GLdouble x)
-{
- d_4_0_Core->f.Uniform1d(location, x);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
-{
- d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawArraysIndirect(GLenum mode, const void *indirect)
-{
- d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
-{
- d_4_0_Core->f.BlendFunci(buf, src, dst);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
- d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBlendEquationi(GLuint buf, GLenum mode)
-{
- d_4_0_Core->f.BlendEquationi(buf, mode);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glMinSampleShading(GLfloat value)
-{
- d_4_0_Core->f.MinSampleShading(value);
-}
-
-
-// OpenGL 4.1 core functions
-inline void QOpenGLFunctions_4_5_Core::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
-{
- d_4_1_Core->f.GetDoublei_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
-{
- d_4_1_Core->f.GetFloati_v(target, index, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
-{
- d_4_1_Core->f.DepthRangeIndexed(index, n, f);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
-{
- d_4_1_Core->f.DepthRangeArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glScissorIndexedv(GLuint index, const GLint *v)
-{
- d_4_1_Core->f.ScissorIndexedv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
-{
- d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
-{
- d_4_1_Core->f.ScissorArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glViewportIndexedfv(GLuint index, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportIndexedfv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
-{
- d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
-{
- d_4_1_Core->f.ViewportArrayv(first, count, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
-{
- d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
-{
- d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribL4dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL4dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribL3dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL3dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribL2dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL2dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribL1dv(GLuint index, const GLdouble *v)
-{
- d_4_1_Core->f.VertexAttribL1dv(index, v);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
-{
- d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
- d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
- d_4_1_Core->f.VertexAttribL2d(index, x, y);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribL1d(GLuint index, GLdouble x)
-{
- d_4_1_Core->f.VertexAttribL1d(index, x);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
- d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glValidateProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.ValidateProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
-{
- d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
- d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
- d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
-{
- d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
- d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
- d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
-{
- d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
- d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
- d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
-{
- d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
-{
- d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
-{
- d_4_1_Core->f.ProgramUniform1d(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
-{
- d_4_1_Core->f.ProgramUniform1f(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramUniform1i(GLuint program, GLint location, GLint v0)
-{
- d_4_1_Core->f.ProgramUniform1i(program, location, v0);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
- d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glIsProgramPipeline(GLuint pipeline)
-{
- return d_4_1_Core->f.IsProgramPipeline(pipeline);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_1_Core->f.GenProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
-{
- d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindProgramPipeline(GLuint pipeline)
-{
- d_4_1_Core->f.BindProgramPipeline(pipeline);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Core::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
-{
- return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glActiveShaderProgram(GLuint pipeline, GLuint program)
-{
- d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
- d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramParameteri(GLuint program, GLenum pname, GLint value)
-{
- d_4_1_Core->f.ProgramParameteri(program, pname, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
-{
- d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
-{
- d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearDepthf(GLfloat dd)
-{
- d_4_1_Core->f.ClearDepthf(dd);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDepthRangef(GLfloat n, GLfloat f)
-{
- d_4_1_Core->f.DepthRangef(n, f);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
-{
- d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length)
-{
- d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glReleaseShaderCompiler()
-{
- d_4_1_Core->f.ReleaseShaderCompiler();
-}
-
-
-// OpenGL 4.2 core functions
-inline void QOpenGLFunctions_4_5_Core::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
-{
- d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
-{
- d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glMemoryBarrier(GLbitfield barriers)
-{
- d_4_2_Core->f.MemoryBarrier(barriers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
-{
- d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
-{
- d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
-{
- d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
-{
- d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
-}
-
-
-// OpenGL 4.3 core functions
-inline void QOpenGLFunctions_4_5_Core::glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
- d_4_3_Core->f.GetObjectPtrLabel(ptr, bufSize, length, label);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
-{
- d_4_3_Core->f.ObjectPtrLabel(ptr, length, label);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
- d_4_3_Core->f.GetObjectLabel(identifier, name, bufSize, length, label);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
-{
- d_4_3_Core->f.ObjectLabel(identifier, name, length, label);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPopDebugGroup()
-{
- d_4_3_Core->f.PopDebugGroup();
-}
-
-inline void QOpenGLFunctions_4_5_Core::glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
-{
- d_4_3_Core->f.PushDebugGroup(source, id, length, message);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Core::glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)
-{
- return d_4_3_Core->f.GetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
-{
- d_4_3_Core->f.DebugMessageCallback(callback, userParam);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)
-{
- d_4_3_Core->f.DebugMessageInsert(source, type, id, severity, length, buf);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)
-{
- d_4_3_Core->f.DebugMessageControl(source, type, severity, count, ids, enabled);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
-{
- d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
-{
- d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
-{
- d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
-{
- d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
-{
- d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
- d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
-{
- d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
-}
-
-inline GLint QOpenGLFunctions_4_5_Core::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
-}
-
-inline GLint QOpenGLFunctions_4_5_Core::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
-{
- d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
-{
- d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
-}
-
-inline GLuint QOpenGLFunctions_4_5_Core::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
-{
- d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
-{
- d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glInvalidateBufferData(GLuint buffer)
-{
- d_4_3_Core->f.InvalidateBufferData(buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
-{
- d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glInvalidateTexImage(GLuint texture, GLint level)
-{
- d_4_3_Core->f.InvalidateTexImage(texture, level);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
-{
- d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
-{
- d_4_3_Core->f.FramebufferParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
-{
- d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDispatchComputeIndirect(GLintptr indirect)
-{
- d_4_3_Core->f.DispatchComputeIndirect(indirect);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
-{
- d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
-{
- d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
-}
-
-
-// OpenGL 4.4 core functions
-inline void QOpenGLFunctions_4_5_Core::glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
-{
- d_4_4_Core->f.BindVertexBuffers(first, count, buffers, offsets, strides);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
-{
- d_4_4_Core->f.BindImageTextures(first, count, textures);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
-{
- d_4_4_Core->f.BindSamplers(first, count, samplers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindTextures(GLuint first, GLsizei count, const GLuint *textures)
-{
- d_4_4_Core->f.BindTextures(first, count, textures);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes)
-{
- d_4_4_Core->f.BindBuffersRange(target, first, count, buffers, offsets, sizes);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers)
-{
- d_4_4_Core->f.BindBuffersBase(target, first, count, buffers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
-{
- d_4_4_Core->f.ClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
-{
- d_4_4_Core->f.ClearTexImage(texture, level, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
-{
- d_4_4_Core->f.BufferStorage(target, size, data, flags);
-}
-
-
-// OpenGL 4.5 core functions
-inline void QOpenGLFunctions_4_5_Core::glTextureBarrier()
-{
- d_4_5_Core->f.TextureBarrier();
-}
-
-inline void QOpenGLFunctions_4_5_Core::glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data)
-{
- d_4_5_Core->f.ReadnPixels(x, y, width, height, format, type, bufSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params)
-{
- d_4_5_Core->f.GetnUniformuiv(program, location, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
-{
- d_4_5_Core->f.GetnUniformiv(program, location, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
-{
- d_4_5_Core->f.GetnUniformfv(program, location, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params)
-{
- d_4_5_Core->f.GetnUniformdv(program, location, bufSize, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetnTexImage(target, level, format, type, bufSize, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetnCompressedTexImage(target, lod, bufSize, pixels);
-}
-
-inline GLenum QOpenGLFunctions_4_5_Core::glGetGraphicsResetStatus()
-{
- return d_4_5_Core->f.GetGraphicsResetStatus();
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetCompressedTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glMemoryBarrierByRegion(GLbitfield barriers)
-{
- d_4_5_Core->f.MemoryBarrierByRegion(barriers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCreateQueries(GLenum target, GLsizei n, GLuint *ids)
-{
- d_4_5_Core->f.CreateQueries(target, n, ids);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCreateProgramPipelines(GLsizei n, GLuint *pipelines)
-{
- d_4_5_Core->f.CreateProgramPipelines(n, pipelines);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCreateSamplers(GLsizei n, GLuint *samplers)
-{
- d_4_5_Core->f.CreateSamplers(n, samplers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64 *param)
-{
- d_4_5_Core->f.GetVertexArrayIndexed64iv(vaobj, index, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint *param)
-{
- d_4_5_Core->f.GetVertexArrayIndexediv(vaobj, index, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param)
-{
- d_4_5_Core->f.GetVertexArrayiv(vaobj, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor)
-{
- d_4_5_Core->f.VertexArrayBindingDivisor(vaobj, bindingindex, divisor);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexArrayAttribLFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_5_Core->f.VertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexArrayAttribIFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
- d_4_5_Core->f.VertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexArrayAttribFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
-{
- d_4_5_Core->f.VertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex)
-{
- d_4_5_Core->f.VertexArrayAttribBinding(vaobj, attribindex, bindingindex);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
-{
- d_4_5_Core->f.VertexArrayVertexBuffers(vaobj, first, count, buffers, offsets, strides);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexArrayVertexBuffer(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
-{
- d_4_5_Core->f.VertexArrayVertexBuffer(vaobj, bindingindex, buffer, offset, stride);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer)
-{
- d_4_5_Core->f.VertexArrayElementBuffer(vaobj, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glEnableVertexArrayAttrib(GLuint vaobj, GLuint index)
-{
- d_4_5_Core->f.EnableVertexArrayAttrib(vaobj, index);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glDisableVertexArrayAttrib(GLuint vaobj, GLuint index)
-{
- d_4_5_Core->f.DisableVertexArrayAttrib(vaobj, index);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCreateVertexArrays(GLsizei n, GLuint *arrays)
-{
- d_4_5_Core->f.CreateVertexArrays(n, arrays);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTextureParameteriv(GLuint texture, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetTextureParameteriv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params)
-{
- d_4_5_Core->f.GetTextureParameterIuiv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetTextureParameterIiv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params)
-{
- d_4_5_Core->f.GetTextureParameterfv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTextureLevelParameteriv(GLuint texture, GLint level, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetTextureLevelParameteriv(texture, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTextureLevelParameterfv(GLuint texture, GLint level, GLenum pname, GLfloat *params)
-{
- d_4_5_Core->f.GetTextureLevelParameterfv(texture, level, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetCompressedTextureImage(texture, level, bufSize, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
-{
- d_4_5_Core->f.GetTextureImage(texture, level, format, type, bufSize, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBindTextureUnit(GLuint unit, GLuint texture)
-{
- d_4_5_Core->f.BindTextureUnit(unit, texture);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGenerateTextureMipmap(GLuint texture)
-{
- d_4_5_Core->f.GenerateTextureMipmap(texture);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureParameteriv(GLuint texture, GLenum pname, const GLint *param)
-{
- d_4_5_Core->f.TextureParameteriv(texture, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureParameterIuiv(GLuint texture, GLenum pname, const GLuint *params)
-{
- d_4_5_Core->f.TextureParameterIuiv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureParameterIiv(GLuint texture, GLenum pname, const GLint *params)
-{
- d_4_5_Core->f.TextureParameterIiv(texture, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureParameteri(GLuint texture, GLenum pname, GLint param)
-{
- d_4_5_Core->f.TextureParameteri(texture, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureParameterfv(GLuint texture, GLenum pname, const GLfloat *param)
-{
- d_4_5_Core->f.TextureParameterfv(texture, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureParameterf(GLuint texture, GLenum pname, GLfloat param)
-{
- d_4_5_Core->f.TextureParameterf(texture, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCopyTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.CopyTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCopyTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.CopyTextureSubImage2D(texture, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
-{
- d_4_5_Core->f.CopyTextureSubImage1D(texture, level, xoffset, x, y, width);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
-{
- d_4_5_Core->f.CompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
-{
- d_4_5_Core->f.CompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
-{
- d_4_5_Core->f.CompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
-{
- d_4_5_Core->f.TextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
-{
- d_4_5_Core->f.TextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
-{
- d_4_5_Core->f.TextureSubImage1D(texture, level, xoffset, width, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
- d_4_5_Core->f.TextureStorage3DMultisample(texture, samples, internalformat, width, height, depth, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
- d_4_5_Core->f.TextureStorage2DMultisample(texture, samples, internalformat, width, height, fixedsamplelocations);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureStorage3D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
- d_4_5_Core->f.TextureStorage3D(texture, levels, internalformat, width, height, depth);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureStorage2D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.TextureStorage2D(texture, levels, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureStorage1D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width)
-{
- d_4_5_Core->f.TextureStorage1D(texture, levels, internalformat, width);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureBufferRange(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size)
-{
- d_4_5_Core->f.TextureBufferRange(texture, internalformat, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer)
-{
- d_4_5_Core->f.TextureBuffer(texture, internalformat, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCreateTextures(GLenum target, GLsizei n, GLuint *textures)
-{
- d_4_5_Core->f.CreateTextures(target, n, textures);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetNamedRenderbufferParameteriv(renderbuffer, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedRenderbufferStorageMultisample(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.NamedRenderbufferStorageMultisample(renderbuffer, samples, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedRenderbufferStorage(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.NamedRenderbufferStorage(renderbuffer, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCreateRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- d_4_5_Core->f.CreateRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param)
-{
- d_4_5_Core->f.GetNamedFramebufferParameteriv(framebuffer, pname, param);
-}
-
-inline GLenum QOpenGLFunctions_4_5_Core::glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target)
-{
- return d_4_5_Core->f.CheckNamedFramebufferStatus(framebuffer, target);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
- d_4_5_Core->f.BlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil)
-{
- d_4_5_Core->f.ClearNamedFramebufferfi(framebuffer, buffer, depth, stencil);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
- d_4_5_Core->f.ClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
- d_4_5_Core->f.ClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value)
-{
- d_4_5_Core->f.ClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glInvalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- d_4_5_Core->f.InvalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, x, y, width, height);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments)
-{
- d_4_5_Core->f.InvalidateNamedFramebufferData(framebuffer, numAttachments, attachments);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferReadBuffer(GLuint framebuffer, GLenum src)
-{
- d_4_5_Core->f.NamedFramebufferReadBuffer(framebuffer, src);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum *bufs)
-{
- d_4_5_Core->f.NamedFramebufferDrawBuffers(framebuffer, n, bufs);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf)
-{
- d_4_5_Core->f.NamedFramebufferDrawBuffer(framebuffer, buf);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
- d_4_5_Core->f.NamedFramebufferTextureLayer(framebuffer, attachment, texture, level, layer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)
-{
- d_4_5_Core->f.NamedFramebufferTexture(framebuffer, attachment, texture, level);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param)
-{
- d_4_5_Core->f.NamedFramebufferParameteri(framebuffer, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- d_4_5_Core->f.NamedFramebufferRenderbuffer(framebuffer, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCreateFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- d_4_5_Core->f.CreateFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, void *data)
-{
- d_4_5_Core->f.GetNamedBufferSubData(buffer, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void * *params)
-{
- d_4_5_Core->f.GetNamedBufferPointerv(buffer, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64 *params)
-{
- d_4_5_Core->f.GetNamedBufferParameteri64v(buffer, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params)
-{
- d_4_5_Core->f.GetNamedBufferParameteriv(buffer, pname, params);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glFlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length)
-{
- d_4_5_Core->f.FlushMappedNamedBufferRange(buffer, offset, length);
-}
-
-inline GLboolean QOpenGLFunctions_4_5_Core::glUnmapNamedBuffer(GLuint buffer)
-{
- return d_4_5_Core->f.UnmapNamedBuffer(buffer);
-}
-
-inline void * QOpenGLFunctions_4_5_Core::glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access)
-{
- return d_4_5_Core->f.MapNamedBufferRange(buffer, offset, length, access);
-}
-
-inline void * QOpenGLFunctions_4_5_Core::glMapNamedBuffer(GLuint buffer, GLenum access)
-{
- return d_4_5_Core->f.MapNamedBuffer(buffer, access);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearNamedBufferSubData(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data)
-{
- d_4_5_Core->f.ClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data)
-{
- d_4_5_Core->f.ClearNamedBufferData(buffer, internalformat, format, type, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size)
-{
- d_4_5_Core->f.CopyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, const void *data)
-{
- d_4_5_Core->f.NamedBufferSubData(buffer, offset, size, data);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedBufferData(GLuint buffer, GLsizei size, const void *data, GLenum usage)
-{
- d_4_5_Core->f.NamedBufferData(buffer, size, data, usage);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glNamedBufferStorage(GLuint buffer, GLsizei size, const void *data, GLbitfield flags)
-{
- d_4_5_Core->f.NamedBufferStorage(buffer, size, data, flags);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCreateBuffers(GLsizei n, GLuint *buffers)
-{
- d_4_5_Core->f.CreateBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param)
-{
- d_4_5_Core->f.GetTransformFeedbacki64_v(xfb, pname, index, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param)
-{
- d_4_5_Core->f.GetTransformFeedbacki_v(xfb, pname, index, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glGetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param)
-{
- d_4_5_Core->f.GetTransformFeedbackiv(xfb, pname, param);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size)
-{
- d_4_5_Core->f.TransformFeedbackBufferRange(xfb, index, buffer, offset, size);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glTransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer)
-{
- d_4_5_Core->f.TransformFeedbackBufferBase(xfb, index, buffer);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glCreateTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- d_4_5_Core->f.CreateTransformFeedbacks(n, ids);
-}
-
-inline void QOpenGLFunctions_4_5_Core::glClipControl(GLenum origin, GLenum depth)
-{
- d_4_5_Core->f.ClipControl(origin, depth);
-}
-
-
-
-QT_END_NAMESPACE
-
-#ifdef Q_OS_WIN
-#pragma pop_macro("MemoryBarrier")
-#endif
-
-
-#endif // QT_NO_OPENGL && !QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglfunctions_es2.cpp b/src/gui/opengl/qopenglfunctions_es2.cpp
deleted file mode 100644
index dd2b3af80b..0000000000
--- a/src/gui/opengl/qopenglfunctions_es2.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenglfunctions_es2.h"
-#include "qopenglcontext.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLFunctions_ES2
- \inmodule QtGui
- \since 5.1
- \wrapper
- \brief The QOpenGLFunctions_ES2 class provides all functions for OpenGL ES 2.
-
- This class is a wrapper for OpenGL ES 2 functions. See reference pages on
- \l {http://www.khronos.org/opengles/sdk/docs/man/}{khronos.org} for
- function documentation.
-
- \sa QAbstractOpenGLFunctions
-*/
-
-QOpenGLFunctions_ES2::QOpenGLFunctions_ES2()
- : QAbstractOpenGLFunctions()
- , d_es2(0)
-{
-}
-
-QOpenGLFunctions_ES2::~QOpenGLFunctions_ES2()
-{
-}
-
-bool QOpenGLFunctions_ES2::initializeOpenGLFunctions()
-{
- if ( isInitialized() )
- return true;
-
- QOpenGLContext* context = QOpenGLContext::currentContext();
-
- // If owned by a context object make sure it is current.
- // Also check that current context is compatible
- if (((owningContext() && owningContext() == context) || !owningContext())
- && QOpenGLFunctions_ES2::isContextCompatible(context))
- {
- // Nothing to do, just flag that we are initialized
- QAbstractOpenGLFunctions::initializeOpenGLFunctions();
- }
- return isInitialized();
-}
-
-bool QOpenGLFunctions_ES2::isContextCompatible(QOpenGLContext *context)
-{
- Q_ASSERT(context);
- QSurfaceFormat f = context->format();
- const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
- if (v < qMakePair(2, 0))
- return false;
- if (f.renderableType() != QSurfaceFormat::OpenGLES)
- return false;
-
- return true;
-}
-
-QOpenGLVersionProfile QOpenGLFunctions_ES2::versionProfile()
-{
- QOpenGLVersionProfile v;
- return v;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglfunctions_es2.h b/src/gui/opengl/qopenglfunctions_es2.h
deleted file mode 100644
index 851eb5951b..0000000000
--- a/src/gui/opengl/qopenglfunctions_es2.h
+++ /dev/null
@@ -1,931 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_ES2_H
-#define QOPENGLVERSIONFUNCTIONS_ES2_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if defined(QT_OPENGL_ES_2) || defined(Q_QDOC)
-
-#include <QtGui/QOpenGLVersionFunctions>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLFunctions_ES2Private;
-
-class Q_GUI_EXPORT QOpenGLFunctions_ES2 : public QAbstractOpenGLFunctions
-{
-public:
- QOpenGLFunctions_ES2();
- ~QOpenGLFunctions_ES2();
-
- bool initializeOpenGLFunctions() override;
-
- // OpenGL ES2 core functions
- void glActiveTexture(GLenum texture);
- void glAttachShader(GLuint program, GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const GLchar* name);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- void glBindTexture(GLenum target, GLuint texture);
- void glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
- void glBlendEquation(GLenum mode);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
- void glBlendFunc(GLenum sfactor, GLenum dfactor);
- void glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
- void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glClear(GLbitfield mask);
- void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
- void glClearDepthf(GLclampf depth);
- void glClearStencil(GLint s);
- void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void glCompileShader(GLuint shader);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data);
- void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- GLuint glCreateProgram(void);
- GLuint glCreateShader(GLenum type);
- void glCullFace(GLenum mode);
- void glDeleteBuffers(GLsizei n, const GLuint* buffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers);
- void glDeleteProgram(GLuint program);
- void glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers);
- void glDeleteShader(GLuint shader);
- void glDeleteTextures(GLsizei n, const GLuint* textures);
- void glDepthFunc(GLenum func);
- void glDepthMask(GLboolean flag);
- void glDepthRangef(GLclampf zNear, GLclampf zFar);
- void glDetachShader(GLuint program, GLuint shader);
- void glDisable(GLenum cap);
- void glDisableVertexAttribArray(GLuint index);
- void glDrawArrays(GLenum mode, GLint first, GLsizei count);
- void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
- void glEnable(GLenum cap);
- void glEnableVertexAttribArray(GLuint index);
- void glFinish(void);
- void glFlush(void);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glFrontFace(GLenum mode);
- void glGenBuffers(GLsizei n, GLuint* buffers);
- void glGenerateMipmap(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint* framebuffers);
- void glGenRenderbuffers(GLsizei n, GLuint* renderbuffers);
- void glGenTextures(GLsizei n, GLuint* textures);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
- void glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
- int glGetAttribLocation(GLuint program, const GLchar* name);
- void glGetBooleanv(GLenum pname, GLboolean* params);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params);
- GLenum glGetError(void);
- void glGetFloatv(GLenum pname, GLfloat* params);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params);
- void glGetIntegerv(GLenum pname, GLint* params);
- void glGetProgramiv(GLuint program, GLenum pname, GLint* params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint* params);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
- void glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
- const GLubyte* glGetString(GLenum name);
- void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params);
- void glGetTexParameteriv(GLenum target, GLenum pname, GLint* params);
- void glGetUniformfv(GLuint program, GLint location, GLfloat* params);
- void glGetUniformiv(GLuint program, GLint location, GLint* params);
- int glGetUniformLocation(GLuint program, const GLchar* name);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer);
- void glHint(GLenum target, GLenum mode);
- GLboolean glIsBuffer(GLuint buffer);
- GLboolean glIsEnabled(GLenum cap);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- GLboolean glIsProgram(GLuint program);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- GLboolean glIsShader(GLuint shader);
- GLboolean glIsTexture(GLuint texture);
- void glLineWidth(GLfloat width);
- void glLinkProgram(GLuint program);
- void glPixelStorei(GLenum pname, GLint param);
- void glPolygonOffset(GLfloat factor, GLfloat units);
- void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
- void glReleaseShaderCompiler(void);
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glSampleCoverage(GLclampf value, GLboolean invert);
- void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length);
- void glShaderSource(GLuint shader, GLsizei count, const GLchar* *string, const GLint* length);
- void glStencilFunc(GLenum func, GLint ref, GLuint mask);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilMask(GLuint mask);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
- void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
- void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- void glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params);
- void glTexParameteri(GLenum target, GLenum pname, GLint param);
- void glTexParameteriv(GLenum target, GLenum pname, const GLint* params);
- void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels);
- void glUniform1f(GLint location, GLfloat x);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat* v);
- void glUniform1i(GLint location, GLint x);
- void glUniform1iv(GLint location, GLsizei count, const GLint* v);
- void glUniform2f(GLint location, GLfloat x, GLfloat y);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat* v);
- void glUniform2i(GLint location, GLint x, GLint y);
- void glUniform2iv(GLint location, GLsizei count, const GLint* v);
- void glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat* v);
- void glUniform3i(GLint location, GLint x, GLint y, GLint z);
- void glUniform3iv(GLint location, GLsizei count, const GLint* v);
- void glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat* v);
- void glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w);
- void glUniform4iv(GLint location, GLsizei count, const GLint* v);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
- void glUseProgram(GLuint program);
- void glValidateProgram(GLuint program);
- void glVertexAttrib1f(GLuint indx, GLfloat x);
- void glVertexAttrib1fv(GLuint indx, const GLfloat* values);
- void glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
- void glVertexAttrib2fv(GLuint indx, const GLfloat* values);
- void glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3fv(GLuint indx, const GLfloat* values);
- void glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4fv(GLuint indx, const GLfloat* values);
- void glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr);
- void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
-
-private:
- friend class QOpenGLContext;
-
- static bool isContextCompatible(QOpenGLContext *context);
- static QOpenGLVersionProfile versionProfile();
-
- // For future expansion - not used
- QOpenGLFunctions_ES2Private* d_es2;
-};
-
-// OpenGL ES2 core functions
-inline void QOpenGLFunctions_ES2::glActiveTexture(GLenum texture)
-{
- ::glActiveTexture(texture);
-}
-
-inline void QOpenGLFunctions_ES2::glAttachShader(GLuint program, GLuint shader)
-{
- ::glAttachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_ES2::glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
-{
- ::glBindAttribLocation(program, index, name);
-}
-
-inline void QOpenGLFunctions_ES2::glBindBuffer(GLenum target, GLuint buffer)
-{
- ::glBindBuffer(target, buffer);
-}
-
-inline void QOpenGLFunctions_ES2::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- ::glBindFramebuffer(target, framebuffer);
-}
-
-inline void QOpenGLFunctions_ES2::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- ::glBindRenderbuffer(target, renderbuffer);
-}
-
-inline void QOpenGLFunctions_ES2::glBindTexture(GLenum target, GLuint texture)
-{
- ::glBindTexture(target, texture);
-}
-
-inline void QOpenGLFunctions_ES2::glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
-{
- ::glBlendColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_ES2::glBlendEquation(GLenum mode)
-{
- ::glBlendEquation(mode);
-}
-
-inline void QOpenGLFunctions_ES2::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- ::glBlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-inline void QOpenGLFunctions_ES2::glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
- ::glBlendFunc(sfactor, dfactor);
-}
-
-inline void QOpenGLFunctions_ES2::glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- ::glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QOpenGLFunctions_ES2::glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
-{
- ::glBufferData(target, size, data, usage);
-}
-
-inline void QOpenGLFunctions_ES2::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
-{
- ::glBufferSubData(target, offset, size, data);
-}
-
-inline GLenum QOpenGLFunctions_ES2::glCheckFramebufferStatus(GLenum target)
-{
- return ::glCheckFramebufferStatus(target);
-}
-
-inline void QOpenGLFunctions_ES2::glClear(GLbitfield mask)
-{
- ::glClear(mask);
-}
-
-inline void QOpenGLFunctions_ES2::glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
-{
- ::glClearColor(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_ES2::glClearDepthf(GLclampf depth)
-{
- ::glClearDepthf(depth);
-}
-
-inline void QOpenGLFunctions_ES2::glClearStencil(GLint s)
-{
- ::glClearStencil(s);
-}
-
-inline void QOpenGLFunctions_ES2::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- ::glColorMask(red, green, blue, alpha);
-}
-
-inline void QOpenGLFunctions_ES2::glCompileShader(GLuint shader)
-{
- ::glCompileShader(shader);
-}
-
-inline void QOpenGLFunctions_ES2::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data)
-{
- ::glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QOpenGLFunctions_ES2::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data)
-{
- ::glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline void QOpenGLFunctions_ES2::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
- ::glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-inline void QOpenGLFunctions_ES2::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- ::glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-inline GLuint QOpenGLFunctions_ES2::glCreateProgram(void)
-{
- return ::glCreateProgram();
-}
-
-inline GLuint QOpenGLFunctions_ES2::glCreateShader(GLenum type)
-{
- return ::glCreateShader(type);
-}
-
-inline void QOpenGLFunctions_ES2::glCullFace(GLenum mode)
-{
- ::glCullFace(mode);
-}
-
-inline void QOpenGLFunctions_ES2::glDeleteBuffers(GLsizei n, const GLuint* buffers)
-{
- ::glDeleteBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_ES2::glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
-{
- ::glDeleteFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_ES2::glDeleteProgram(GLuint program)
-{
- ::glDeleteProgram(program);
-}
-
-inline void QOpenGLFunctions_ES2::glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
-{
- ::glDeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_ES2::glDeleteShader(GLuint shader)
-{
- ::glDeleteShader(shader);
-}
-
-inline void QOpenGLFunctions_ES2::glDeleteTextures(GLsizei n, const GLuint* textures)
-{
- ::glDeleteTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_ES2::glDepthFunc(GLenum func)
-{
- ::glDepthFunc(func);
-}
-
-inline void QOpenGLFunctions_ES2::glDepthMask(GLboolean flag)
-{
- ::glDepthMask(flag);
-}
-
-inline void QOpenGLFunctions_ES2::glDepthRangef(GLclampf zNear, GLclampf zFar)
-{
- ::glDepthRangef(zNear, zFar);
-}
-
-inline void QOpenGLFunctions_ES2::glDetachShader(GLuint program, GLuint shader)
-{
- ::glDetachShader(program, shader);
-}
-
-inline void QOpenGLFunctions_ES2::glDisable(GLenum cap)
-{
- ::glDisable(cap);
-}
-
-inline void QOpenGLFunctions_ES2::glDisableVertexAttribArray(GLuint index)
-{
- ::glDisableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_ES2::glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
- ::glDrawArrays(mode, first, count);
-}
-
-inline void QOpenGLFunctions_ES2::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
-{
- ::glDrawElements(mode, count, type, indices);
-}
-
-inline void QOpenGLFunctions_ES2::glEnable(GLenum cap)
-{
- ::glEnable(cap);
-}
-
-inline void QOpenGLFunctions_ES2::glEnableVertexAttribArray(GLuint index)
-{
- ::glEnableVertexAttribArray(index);
-}
-
-inline void QOpenGLFunctions_ES2::glFinish(void)
-{
- ::glFinish();
-}
-
-inline void QOpenGLFunctions_ES2::glFlush(void)
-{
- ::glFlush();
-}
-
-inline void QOpenGLFunctions_ES2::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- ::glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QOpenGLFunctions_ES2::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- ::glFramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QOpenGLFunctions_ES2::glFrontFace(GLenum mode)
-{
- ::glFrontFace(mode);
-}
-
-inline void QOpenGLFunctions_ES2::glGenBuffers(GLsizei n, GLuint* buffers)
-{
- ::glGenBuffers(n, buffers);
-}
-
-inline void QOpenGLFunctions_ES2::glGenerateMipmap(GLenum target)
-{
- ::glGenerateMipmap(target);
-}
-
-inline void QOpenGLFunctions_ES2::glGenFramebuffers(GLsizei n, GLuint* framebuffers)
-{
- ::glGenFramebuffers(n, framebuffers);
-}
-
-inline void QOpenGLFunctions_ES2::glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
-{
- ::glGenRenderbuffers(n, renderbuffers);
-}
-
-inline void QOpenGLFunctions_ES2::glGenTextures(GLsizei n, GLuint* textures)
-{
- ::glGenTextures(n, textures);
-}
-
-inline void QOpenGLFunctions_ES2::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
-{
- ::glGetActiveAttrib(program, index, bufsize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_ES2::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
-{
- ::glGetActiveUniform(program, index, bufsize, length, size, type, name);
-}
-
-inline void QOpenGLFunctions_ES2::glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
-{
- ::glGetAttachedShaders(program, maxcount, count, shaders);
-}
-
-inline int QOpenGLFunctions_ES2::glGetAttribLocation(GLuint program, const GLchar* name)
-{
- return ::glGetAttribLocation(program, name);
-}
-
-inline void QOpenGLFunctions_ES2::glGetBooleanv(GLenum pname, GLboolean* params)
-{
- ::glGetBooleanv(pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
-{
- ::glGetBufferParameteriv(target, pname, params);
-}
-
-inline GLenum QOpenGLFunctions_ES2::glGetError(void)
-{
- return ::glGetError();
-}
-
-inline void QOpenGLFunctions_ES2::glGetFloatv(GLenum pname, GLfloat* params)
-{
- ::glGetFloatv(pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
-{
- ::glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetIntegerv(GLenum pname, GLint* params)
-{
- ::glGetIntegerv(pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetProgramiv(GLuint program, GLenum pname, GLint* params)
-{
- ::glGetProgramiv(program, pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
-{
- ::glGetProgramInfoLog(program, bufsize, length, infolog);
-}
-
-inline void QOpenGLFunctions_ES2::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
-{
- ::glGetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
-{
- ::glGetShaderiv(shader, pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
-{
- ::glGetShaderInfoLog(shader, bufsize, length, infolog);
-}
-
-inline void QOpenGLFunctions_ES2::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
-{
- ::glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QOpenGLFunctions_ES2::glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
-{
- ::glGetShaderSource(shader, bufsize, length, source);
-}
-
-inline const GLubyte* QOpenGLFunctions_ES2::glGetString(GLenum name)
-{
- return ::glGetString(name);
-}
-
-inline void QOpenGLFunctions_ES2::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
-{
- ::glGetTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
-{
- ::glGetTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetUniformfv(GLuint program, GLint location, GLfloat* params)
-{
- ::glGetUniformfv(program, location, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetUniformiv(GLuint program, GLint location, GLint* params)
-{
- ::glGetUniformiv(program, location, params);
-}
-
-inline int QOpenGLFunctions_ES2::glGetUniformLocation(GLuint program, const GLchar* name)
-{
- return ::glGetUniformLocation(program, name);
-}
-
-inline void QOpenGLFunctions_ES2::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
-{
- ::glGetVertexAttribfv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
-{
- ::glGetVertexAttribiv(index, pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
-{
- ::glGetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline void QOpenGLFunctions_ES2::glHint(GLenum target, GLenum mode)
-{
- ::glHint(target, mode);
-}
-
-inline GLboolean QOpenGLFunctions_ES2::glIsBuffer(GLuint buffer)
-{
- return ::glIsBuffer(buffer);
-}
-
-inline GLboolean QOpenGLFunctions_ES2::glIsEnabled(GLenum cap)
-{
- return ::glIsEnabled(cap);
-}
-
-inline GLboolean QOpenGLFunctions_ES2::glIsFramebuffer(GLuint framebuffer)
-{
- return ::glIsFramebuffer(framebuffer);
-}
-
-inline GLboolean QOpenGLFunctions_ES2::glIsProgram(GLuint program)
-{
- return ::glIsProgram(program);
-}
-
-inline GLboolean QOpenGLFunctions_ES2::glIsRenderbuffer(GLuint renderbuffer)
-{
- return ::glIsRenderbuffer(renderbuffer);
-}
-
-inline GLboolean QOpenGLFunctions_ES2::glIsShader(GLuint shader)
-{
- return ::glIsShader(shader);
-}
-
-inline GLboolean QOpenGLFunctions_ES2::glIsTexture(GLuint texture)
-{
- return ::glIsTexture(texture);
-}
-
-inline void QOpenGLFunctions_ES2::glLineWidth(GLfloat width)
-{
- ::glLineWidth(width);
-}
-
-inline void QOpenGLFunctions_ES2::glLinkProgram(GLuint program)
-{
- ::glLinkProgram(program);
-}
-
-inline void QOpenGLFunctions_ES2::glPixelStorei(GLenum pname, GLint param)
-{
- ::glPixelStorei(pname, param);
-}
-
-inline void QOpenGLFunctions_ES2::glPolygonOffset(GLfloat factor, GLfloat units)
-{
- ::glPolygonOffset(factor, units);
-}
-
-inline void QOpenGLFunctions_ES2::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
-{
- ::glReadPixels(x, y, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_ES2::glReleaseShaderCompiler(void)
-{
- ::glReleaseShaderCompiler();
-}
-
-inline void QOpenGLFunctions_ES2::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- ::glRenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QOpenGLFunctions_ES2::glSampleCoverage(GLclampf value, GLboolean invert)
-{
- ::glSampleCoverage(value, invert);
-}
-
-inline void QOpenGLFunctions_ES2::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- ::glScissor(x, y, width, height);
-}
-
-inline void QOpenGLFunctions_ES2::glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
-{
- ::glShaderBinary(n, shaders, binaryformat, binary, length);
-}
-
-inline void QOpenGLFunctions_ES2::glShaderSource(GLuint shader, GLsizei count, const GLchar* *string, const GLint* length)
-{
- ::glShaderSource(shader, count, string, length);
-}
-
-inline void QOpenGLFunctions_ES2::glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- ::glStencilFunc(func, ref, mask);
-}
-
-inline void QOpenGLFunctions_ES2::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- ::glStencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QOpenGLFunctions_ES2::glStencilMask(GLuint mask)
-{
- ::glStencilMask(mask);
-}
-
-inline void QOpenGLFunctions_ES2::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- ::glStencilMaskSeparate(face, mask);
-}
-
-inline void QOpenGLFunctions_ES2::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- ::glStencilOp(fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_ES2::glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
-{
- ::glStencilOpSeparate(face, fail, zfail, zpass);
-}
-
-inline void QOpenGLFunctions_ES2::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
-{
- ::glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_ES2::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- ::glTexParameterf(target, pname, param);
-}
-
-inline void QOpenGLFunctions_ES2::glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
-{
- ::glTexParameterfv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
- ::glTexParameteri(target, pname, param);
-}
-
-inline void QOpenGLFunctions_ES2::glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
-{
- ::glTexParameteriv(target, pname, params);
-}
-
-inline void QOpenGLFunctions_ES2::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels)
-{
- ::glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform1f(GLint location, GLfloat x)
-{
- ::glUniform1f(location, x);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
-{
- ::glUniform1fv(location, count, v);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform1i(GLint location, GLint x)
-{
- ::glUniform1i(location, x);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform1iv(GLint location, GLsizei count, const GLint* v)
-{
- ::glUniform1iv(location, count, v);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform2f(GLint location, GLfloat x, GLfloat y)
-{
- ::glUniform2f(location, x, y);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
-{
- ::glUniform2fv(location, count, v);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform2i(GLint location, GLint x, GLint y)
-{
- ::glUniform2i(location, x, y);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform2iv(GLint location, GLsizei count, const GLint* v)
-{
- ::glUniform2iv(location, count, v);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
-{
- ::glUniform3f(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
-{
- ::glUniform3fv(location, count, v);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform3i(GLint location, GLint x, GLint y, GLint z)
-{
- ::glUniform3i(location, x, y, z);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform3iv(GLint location, GLsizei count, const GLint* v)
-{
- ::glUniform3iv(location, count, v);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- ::glUniform4f(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
-{
- ::glUniform4fv(location, count, v);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
-{
- ::glUniform4i(location, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_ES2::glUniform4iv(GLint location, GLsizei count, const GLint* v)
-{
- ::glUniform4iv(location, count, v);
-}
-
-inline void QOpenGLFunctions_ES2::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-{
- ::glUniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_ES2::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-{
- ::glUniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_ES2::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-{
- ::glUniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QOpenGLFunctions_ES2::glUseProgram(GLuint program)
-{
- ::glUseProgram(program);
-}
-
-inline void QOpenGLFunctions_ES2::glValidateProgram(GLuint program)
-{
- ::glValidateProgram(program);
-}
-
-inline void QOpenGLFunctions_ES2::glVertexAttrib1f(GLuint indx, GLfloat x)
-{
- ::glVertexAttrib1f(indx, x);
-}
-
-inline void QOpenGLFunctions_ES2::glVertexAttrib1fv(GLuint indx, const GLfloat* values)
-{
- ::glVertexAttrib1fv(indx, values);
-}
-
-inline void QOpenGLFunctions_ES2::glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
-{
- ::glVertexAttrib2f(indx, x, y);
-}
-
-inline void QOpenGLFunctions_ES2::glVertexAttrib2fv(GLuint indx, const GLfloat* values)
-{
- ::glVertexAttrib2fv(indx, values);
-}
-
-inline void QOpenGLFunctions_ES2::glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
-{
- ::glVertexAttrib3f(indx, x, y, z);
-}
-
-inline void QOpenGLFunctions_ES2::glVertexAttrib3fv(GLuint indx, const GLfloat* values)
-{
- ::glVertexAttrib3fv(indx, values);
-}
-
-inline void QOpenGLFunctions_ES2::glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- ::glVertexAttrib4f(indx, x, y, z, w);
-}
-
-inline void QOpenGLFunctions_ES2::glVertexAttrib4fv(GLuint indx, const GLfloat* values)
-{
- ::glVertexAttrib4fv(indx, values);
-}
-
-inline void QOpenGLFunctions_ES2::glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
-{
- ::glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
-}
-
-inline void QOpenGLFunctions_ES2::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- ::glViewport(x, y, width, height);
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_OPENGL_ES_2
-
-#endif
diff --git a/src/gui/opengl/qopenglgradientcache.cpp b/src/gui/opengl/qopenglgradientcache.cpp
deleted file mode 100644
index 3aa4c0d2e6..0000000000
--- a/src/gui/opengl/qopenglgradientcache.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenglgradientcache_p.h"
-#include <private/qdrawhelper_p.h>
-#include <private/qopenglcontext_p.h>
-#include <private/qrgba64_p.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qrandom.h>
-#include "qopenglfunctions.h"
-#include "qopenglextensions_p.h"
-
-#ifndef GL_RGBA16
-#define GL_RGBA16 0x805B
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGL2GradientCacheWrapper
-{
-public:
- QOpenGL2GradientCache *cacheForContext(QOpenGLContext *context) {
- QMutexLocker lock(&m_mutex);
- return m_resource.value<QOpenGL2GradientCache>(context);
- }
-
-private:
- QOpenGLMultiGroupSharedResource m_resource;
- QMutex m_mutex;
-};
-
-Q_GLOBAL_STATIC(QOpenGL2GradientCacheWrapper, qt_gradient_caches)
-
-QOpenGL2GradientCache::QOpenGL2GradientCache(QOpenGLContext *ctx)
- : QOpenGLSharedResource(ctx->shareGroup())
-{
-}
-
-QOpenGL2GradientCache::~QOpenGL2GradientCache()
-{
- cache.clear();
-}
-
-QOpenGL2GradientCache *QOpenGL2GradientCache::cacheForContext(QOpenGLContext *context)
-{
- return qt_gradient_caches()->cacheForContext(context);
-}
-
-void QOpenGL2GradientCache::invalidateResource()
-{
- QMutexLocker lock(&m_mutex);
- cache.clear();
-}
-
-void QOpenGL2GradientCache::freeResource(QOpenGLContext *)
-{
- cleanCache();
-}
-
-void QOpenGL2GradientCache::cleanCache()
-{
- QMutexLocker lock(&m_mutex);
- QOpenGLGradientColorTableHash::const_iterator it = cache.constBegin();
- QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
- for (; it != cache.constEnd(); ++it) {
- const CacheInfo &cache_info = it.value();
- funcs->glDeleteTextures(1, &cache_info.texId);
- }
- cache.clear();
-}
-
-GLuint QOpenGL2GradientCache::getBuffer(const QGradient &gradient, qreal opacity)
-{
- quint64 hash_val = 0;
-
- const QGradientStops stops = gradient.stops();
- for (int i = 0; i < stops.size() && i <= 2; i++)
- hash_val += stops[i].second.rgba();
-
- const QMutexLocker lock(&m_mutex);
- QOpenGLGradientColorTableHash::const_iterator it = cache.constFind(hash_val);
-
- if (it == cache.constEnd())
- return addCacheElement(hash_val, gradient, opacity);
- else {
- do {
- const CacheInfo &cache_info = it.value();
- if (cache_info.stops == stops && cache_info.opacity == opacity
- && cache_info.interpolationMode == gradient.interpolationMode())
- {
- return cache_info.texId;
- }
- ++it;
- } while (it != cache.constEnd() && it.key() == hash_val);
- // an exact match for these stops and opacity was not found, create new cache
- return addCacheElement(hash_val, gradient, opacity);
- }
-}
-
-
-GLuint QOpenGL2GradientCache::addCacheElement(quint64 hash_val, const QGradient &gradient, qreal opacity)
-{
- QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
- if (cache.size() == maxCacheSize()) {
- int elem_to_remove = QRandomGenerator::global()->bounded(maxCacheSize());
- quint64 key = cache.keys()[elem_to_remove];
-
- // need to call glDeleteTextures on each removed cache entry:
- QOpenGLGradientColorTableHash::const_iterator it = cache.constFind(key);
- do {
- funcs->glDeleteTextures(1, &it.value().texId);
- } while (++it != cache.constEnd() && it.key() == key);
- cache.remove(key); // may remove more than 1, but OK
- }
-
- CacheInfo cache_entry(gradient.stops(), opacity, gradient.interpolationMode());
- funcs->glGenTextures(1, &cache_entry.texId);
- funcs->glBindTexture(GL_TEXTURE_2D, cache_entry.texId);
- if (static_cast<QOpenGLExtensions *>(funcs)->hasOpenGLExtension(QOpenGLExtensions::Sized16Formats)) {
- QRgba64 buffer[1024];
- generateGradientColorTable(gradient, buffer, paletteSize(), opacity);
- funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, paletteSize(), 1,
- 0, GL_RGBA, GL_UNSIGNED_SHORT, buffer);
- } else {
- uint buffer[1024];
- generateGradientColorTable(gradient, buffer, paletteSize(), opacity);
- funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, paletteSize(), 1,
- 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
- }
- return cache.insert(hash_val, cache_entry).value().texId;
-}
-
-
-//TODO: Let GL generate the texture using an FBO
-void QOpenGL2GradientCache::generateGradientColorTable(const QGradient& gradient, QRgba64 *colorTable, int size, qreal opacity) const
-{
- int pos = 0;
- const QGradientStops s = gradient.stops();
-
- bool colorInterpolation = (gradient.interpolationMode() == QGradient::ColorInterpolation);
-
- uint alpha = qRound(opacity * 256);
- QRgba64 current_color = combineAlpha256(s[0].second.rgba64(), alpha);
- qreal incr = 1.0 / qreal(size);
- qreal fpos = 1.5 * incr;
- colorTable[pos++] = qPremultiply(current_color);
-
- while (fpos <= s.first().first) {
- colorTable[pos] = colorTable[pos - 1];
- pos++;
- fpos += incr;
- }
-
- if (colorInterpolation)
- current_color = qPremultiply(current_color);
-
- const int sLast = s.size() - 1;
- for (int i = 0; i < sLast; ++i) {
- qreal delta = 1/(s[i+1].first - s[i].first);
- QRgba64 next_color = combineAlpha256(s[i + 1].second.rgba64(), alpha);
- if (colorInterpolation)
- next_color = qPremultiply(next_color);
-
- while (fpos < s[i+1].first && pos < size) {
- int dist = int(256 * ((fpos - s[i].first) * delta));
- int idist = 256 - dist;
- if (colorInterpolation)
- colorTable[pos] = interpolate256(current_color, idist, next_color, dist);
- else
- colorTable[pos] = qPremultiply(interpolate256(current_color, idist, next_color, dist));
- ++pos;
- fpos += incr;
- }
- current_color = next_color;
- }
-
- Q_ASSERT(s.size() > 0);
-
- QRgba64 last_color = qPremultiply(combineAlpha256(s[sLast].second.rgba64(), alpha));
- for (;pos < size; ++pos)
- colorTable[pos] = last_color;
-
- // Make sure the last color stop is represented at the end of the table
- colorTable[size-1] = last_color;
-}
-
-void QOpenGL2GradientCache::generateGradientColorTable(const QGradient& gradient, uint *colorTable, int size, qreal opacity) const
-{
- int pos = 0;
- const QGradientStops s = gradient.stops();
-
- bool colorInterpolation = (gradient.interpolationMode() == QGradient::ColorInterpolation);
-
- uint alpha = qRound(opacity * 256);
- // Qt LIES! It returns ARGB (on little-endian AND on big-endian)
- uint current_color = ARGB_COMBINE_ALPHA(s[0].second.rgba(), alpha);
- qreal incr = 1.0 / qreal(size);
- qreal fpos = 1.5 * incr;
- colorTable[pos++] = ARGB2RGBA(qPremultiply(current_color));
-
- while (fpos <= s.first().first) {
- colorTable[pos] = colorTable[pos - 1];
- pos++;
- fpos += incr;
- }
-
- if (colorInterpolation)
- current_color = qPremultiply(current_color);
-
- const int sLast = s.size() - 1;
- for (int i = 0; i < sLast; ++i) {
- qreal delta = 1/(s[i+1].first - s[i].first);
- uint next_color = ARGB_COMBINE_ALPHA(s[i + 1].second.rgba(), alpha);
- if (colorInterpolation)
- next_color = qPremultiply(next_color);
-
- while (fpos < s[i+1].first && pos < size) {
- int dist = int(256 * ((fpos - s[i].first) * delta));
- int idist = 256 - dist;
- if (colorInterpolation)
- colorTable[pos] = ARGB2RGBA(INTERPOLATE_PIXEL_256(current_color, idist, next_color, dist));
- else
- colorTable[pos] = ARGB2RGBA(qPremultiply(INTERPOLATE_PIXEL_256(current_color, idist, next_color, dist)));
- ++pos;
- fpos += incr;
- }
- current_color = next_color;
- }
-
- Q_ASSERT(s.size() > 0);
-
- uint last_color = ARGB2RGBA(qPremultiply(ARGB_COMBINE_ALPHA(s[sLast].second.rgba(), alpha)));
- for (;pos < size; ++pos)
- colorTable[pos] = last_color;
-
- // Make sure the last color stop is represented at the end of the table
- colorTable[size-1] = last_color;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglgradientcache_p.h b/src/gui/opengl/qopenglgradientcache_p.h
deleted file mode 100644
index 1d34223bdd..0000000000
--- a/src/gui/opengl/qopenglgradientcache_p.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLGRADIENTCACHE_P_H
-#define QOPENGLGRADIENTCACHE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtGui/private/qtguiglobal_p.h>
-#include <QMultiHash>
-#include <QObject>
-#include <private/qopenglcontext_p.h>
-#include <QtCore/qmutex.h>
-#include <QGradient>
-#include <qrgba64.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGL2GradientCache : public QOpenGLSharedResource
-{
- struct CacheInfo
- {
- inline CacheInfo(QGradientStops s, qreal op, QGradient::InterpolationMode mode) :
- stops(std::move(s)), opacity(op), interpolationMode(mode) {}
-
- GLuint texId;
- QGradientStops stops;
- qreal opacity;
- QGradient::InterpolationMode interpolationMode;
- };
-
- typedef QMultiHash<quint64, CacheInfo> QOpenGLGradientColorTableHash;
-
-public:
- static QOpenGL2GradientCache *cacheForContext(QOpenGLContext *context);
-
- QOpenGL2GradientCache(QOpenGLContext *);
- ~QOpenGL2GradientCache();
-
- GLuint getBuffer(const QGradient &gradient, qreal opacity);
- inline int paletteSize() const { return 1024; }
-
- void invalidateResource() override;
- void freeResource(QOpenGLContext *ctx) override;
-
-private:
- inline int maxCacheSize() const { return 60; }
- inline void generateGradientColorTable(const QGradient& gradient,
- QRgba64 *colorTable,
- int size, qreal opacity) const;
- inline void generateGradientColorTable(const QGradient& gradient,
- uint *colorTable,
- int size, qreal opacity) const;
- GLuint addCacheElement(quint64 hash_val, const QGradient &gradient, qreal opacity);
- void cleanCache();
-
- QOpenGLGradientColorTableHash cache;
- QMutex m_mutex;
-};
-
-QT_END_NAMESPACE
-
-#endif // QOPENGLGRADIENTCACHE_P_H
diff --git a/src/gui/opengl/qopenglpaintdevice.cpp b/src/gui/opengl/qopenglpaintdevice.cpp
deleted file mode 100644
index 3920a10467..0000000000
--- a/src/gui/opengl/qopenglpaintdevice.cpp
+++ /dev/null
@@ -1,372 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qopenglpaintdevice.h>
-#include <qpaintengine.h>
-#include <qthreadstorage.h>
-
-#include <private/qopenglpaintdevice_p.h>
-#include <private/qobject_p.h>
-#include <private/qopenglcontext_p.h>
-#include <private/qopenglframebufferobject_p.h>
-#include <private/qopenglpaintengine_p.h>
-
-// for qt_defaultDpiX/Y
-#include <private/qfont_p.h>
-
-#include <qopenglfunctions.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLPaintDevice
- \brief The QOpenGLPaintDevice class enables painting to an OpenGL context using QPainter.
- \since 5.0
- \inmodule QtGui
-
- \ingroup painting-3D
-
- The QOpenGLPaintDevice uses the \b current QOpenGL context to render
- QPainter draw commands. The context is captured upon construction. It
- requires support for OpenGL (ES) 2.0 or higher.
-
- \section1 Performance
-
- The QOpenGLPaintDevice is almost always hardware accelerated and
- has the potential of being much faster than software
- rasterization. However, it is more sensitive to state changes, and
- therefore requires the drawing commands to be carefully ordered to
- achieve optimal performance.
-
- \section1 Antialiasing and Quality
-
- Antialiasing in the OpenGL paint engine is done using
- multisampling. Most hardware require significantly more memory to
- do multisampling and the resulting quality is not on par with the
- quality of the software paint engine. The OpenGL paint engine's
- strength lies in its performance, not its visual rendering
- quality.
-
- \section1 State Changes
-
- When painting to a QOpenGLPaintDevice using QPainter, the state of
- the current OpenGL context will be altered by the paint engine to
- reflect its needs. Applications should not rely upon the OpenGL
- state being reset to its original conditions, particularly the
- current shader program, OpenGL viewport, texture units, and
- drawing modes.
-
- \section1 Mixing QPainter and OpenGL
-
- When intermixing QPainter and OpenGL, it is important to notify
- QPainter that the OpenGL state may have been cluttered so it can
- restore its internal state. This is achieved by calling \l
- QPainter::beginNativePainting() before starting the OpenGL
- rendering and calling \l QPainter::endNativePainting() after
- finishing.
-
- \sa {OpenGL Window Example}
-
-*/
-
-/*!
- Constructs a QOpenGLPaintDevice.
-
- The QOpenGLPaintDevice is only valid for the current context.
-
- \sa QOpenGLContext::currentContext()
-*/
-QOpenGLPaintDevice::QOpenGLPaintDevice()
- : d_ptr(new QOpenGLPaintDevicePrivate(QSize()))
-{
-}
-
-/*!
- Constructs a QOpenGLPaintDevice with the given \a size.
-
- The QOpenGLPaintDevice is only valid for the current context.
-
- \sa QOpenGLContext::currentContext()
-*/
-QOpenGLPaintDevice::QOpenGLPaintDevice(const QSize &size)
- : d_ptr(new QOpenGLPaintDevicePrivate(size))
-{
-}
-
-/*!
- Constructs a QOpenGLPaintDevice with the given \a width and \a height.
-
- The QOpenGLPaintDevice is only valid for the current context.
-
- \sa QOpenGLContext::currentContext()
-*/
-QOpenGLPaintDevice::QOpenGLPaintDevice(int width, int height)
- : QOpenGLPaintDevice(QSize(width, height))
-{
-}
-
-/*!
- \internal
- */
-QOpenGLPaintDevice::QOpenGLPaintDevice(QOpenGLPaintDevicePrivate &dd)
- : d_ptr(&dd)
-{
-}
-
-/*!
- Destroys the QOpenGLPaintDevice.
-*/
-
-QOpenGLPaintDevice::~QOpenGLPaintDevice()
-{
- delete d_ptr->engine;
-}
-
-/*!
- \fn int QOpenGLPaintDevice::devType() const
- \internal
- \reimp
-*/
-
-QOpenGLPaintDevicePrivate::QOpenGLPaintDevicePrivate(const QSize &sz)
- : size(sz)
- , ctx(QOpenGLContext::currentContext())
- , dpmx(qt_defaultDpiX() * 100. / 2.54)
- , dpmy(qt_defaultDpiY() * 100. / 2.54)
- , devicePixelRatio(1.0)
- , flipped(false)
- , engine(nullptr)
-{
-}
-
-QOpenGLPaintDevicePrivate::~QOpenGLPaintDevicePrivate()
-{
-}
-
-class QOpenGLEngineThreadStorage
-{
-public:
- QPaintEngine *engine() {
- QPaintEngine *&localEngine = storage.localData();
- if (!localEngine)
- localEngine = new QOpenGL2PaintEngineEx;
- return localEngine;
- }
-
-private:
- QThreadStorage<QPaintEngine *> storage;
-};
-
-Q_GLOBAL_STATIC(QOpenGLEngineThreadStorage, qt_opengl_engine)
-
-/*!
- \reimp
-*/
-
-QPaintEngine *QOpenGLPaintDevice::paintEngine() const
-{
- if (d_ptr->engine)
- return d_ptr->engine;
-
- QPaintEngine *engine = qt_opengl_engine()->engine();
- if (engine->isActive() && engine->paintDevice() != this) {
- d_ptr->engine = new QOpenGL2PaintEngineEx;
- return d_ptr->engine;
- }
-
- return engine;
-}
-
-/*!
- Returns the OpenGL context associated with the paint device.
-*/
-
-QOpenGLContext *QOpenGLPaintDevice::context() const
-{
- return d_ptr->ctx;
-}
-
-/*!
- Returns the pixel size of the paint device.
-
- \sa setSize()
-*/
-
-QSize QOpenGLPaintDevice::size() const
-{
- return d_ptr->size;
-}
-
-/*!
- Sets the pixel size of the paint device to \a size.
-
- \sa size()
-*/
-
-void QOpenGLPaintDevice::setSize(const QSize &size)
-{
- d_ptr->size = size;
-}
-
-/*!
- Sets the device pixel ratio for the paint device to \a devicePixelRatio.
-*/
-void QOpenGLPaintDevice::setDevicePixelRatio(qreal devicePixelRatio)
-{
- d_ptr->devicePixelRatio = devicePixelRatio;
-}
-
-/*!
- \reimp
-*/
-
-int QOpenGLPaintDevice::metric(QPaintDevice::PaintDeviceMetric metric) const
-{
- switch (metric) {
- case PdmWidth:
- return d_ptr->size.width();
- case PdmHeight:
- return d_ptr->size.height();
- case PdmDepth:
- return 32;
- case PdmWidthMM:
- return qRound(d_ptr->size.width() * 1000 / d_ptr->dpmx);
- case PdmHeightMM:
- return qRound(d_ptr->size.height() * 1000 / d_ptr->dpmy);
- case PdmNumColors:
- return 0;
- case PdmDpiX:
- return qRound(d_ptr->dpmx * 0.0254);
- case PdmDpiY:
- return qRound(d_ptr->dpmy * 0.0254);
- case PdmPhysicalDpiX:
- return qRound(d_ptr->dpmx * 0.0254);
- case PdmPhysicalDpiY:
- return qRound(d_ptr->dpmy * 0.0254);
- case PdmDevicePixelRatio:
- return d_ptr->devicePixelRatio;
- case PdmDevicePixelRatioScaled:
- return d_ptr->devicePixelRatio * QPaintDevice::devicePixelRatioFScale();
-
- default:
- qWarning("QOpenGLPaintDevice::metric() - metric %d not known", metric);
- return 0;
- }
-}
-
-/*!
- Returns the number of pixels per meter horizontally.
-
- \sa setDotsPerMeterX()
-*/
-
-qreal QOpenGLPaintDevice::dotsPerMeterX() const
-{
- return d_ptr->dpmx;
-}
-
-/*!
- Returns the number of pixels per meter vertically.
-
- \sa setDotsPerMeterY()
-*/
-
-qreal QOpenGLPaintDevice::dotsPerMeterY() const
-{
- return d_ptr->dpmy;
-}
-
-/*!
- Sets the number of pixels per meter horizontally to \a dpmx.
-
- \sa dotsPerMeterX()
-*/
-
-void QOpenGLPaintDevice::setDotsPerMeterX(qreal dpmx)
-{
- d_ptr->dpmx = dpmx;
-}
-
-/*!
- Sets the number of pixels per meter vertically to \a dpmy.
-
- \sa dotsPerMeterY()
-*/
-
-void QOpenGLPaintDevice::setDotsPerMeterY(qreal dpmy)
-{
- d_ptr->dpmx = dpmy;
-}
-
-/*!
- Sets whether painting should be flipped around the Y-axis or not to \a flipped.
-
- \sa paintFlipped()
-*/
-void QOpenGLPaintDevice::setPaintFlipped(bool flipped)
-{
- d_ptr->flipped = flipped;
-}
-
-/*!
- Returns \c true if painting is flipped around the Y-axis.
-
- \sa setPaintFlipped()
-*/
-
-bool QOpenGLPaintDevice::paintFlipped() const
-{
- return d_ptr->flipped;
-}
-
-/*!
- This virtual method is provided as a callback to allow re-binding a target
- frame buffer object or context when different QOpenGLPaintDevice instances
- are issuing draw calls alternately.
-
- \l{QPainter::beginNativePainting()}{beginNativePainting()} will also trigger
- this method.
-
- The default implementation does nothing.
-*/
-void QOpenGLPaintDevice::ensureActiveTarget()
-{
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglpaintdevice.h b/src/gui/opengl/qopenglpaintdevice.h
deleted file mode 100644
index 54118f2926..0000000000
--- a/src/gui/opengl/qopenglpaintdevice.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLPAINTDEVICE_H
-#define QOPENGLPAINTDEVICE_H
-
-#include <QtGui/qtguiglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtGui/qpaintdevice.h>
-#include <QtGui/qopengl.h>
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLPaintDevicePrivate;
-
-class Q_GUI_EXPORT QOpenGLPaintDevice : public QPaintDevice
-{
- Q_DECLARE_PRIVATE(QOpenGLPaintDevice)
-public:
- QOpenGLPaintDevice();
- explicit QOpenGLPaintDevice(const QSize &size);
- QOpenGLPaintDevice(int width, int height);
- ~QOpenGLPaintDevice();
-
- int devType() const override { return QInternal::OpenGL; }
- QPaintEngine *paintEngine() const override;
-
- QOpenGLContext *context() const;
- QSize size() const;
- void setSize(const QSize &size);
- void setDevicePixelRatio(qreal devicePixelRatio);
-
- qreal dotsPerMeterX() const;
- qreal dotsPerMeterY() const;
-
- void setDotsPerMeterX(qreal);
- void setDotsPerMeterY(qreal);
-
- void setPaintFlipped(bool flipped);
- bool paintFlipped() const;
-
- virtual void ensureActiveTarget();
-
-protected:
- QOpenGLPaintDevice(QOpenGLPaintDevicePrivate &dd);
- int metric(QPaintDevice::PaintDeviceMetric metric) const override;
-
- Q_DISABLE_COPY(QOpenGLPaintDevice)
- QScopedPointer<QOpenGLPaintDevicePrivate> d_ptr;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-
-#endif // QOPENGLPAINTDEVICE_H
diff --git a/src/gui/opengl/qopenglpaintdevice_p.h b/src/gui/opengl/qopenglpaintdevice_p.h
deleted file mode 100644
index 3683ebebac..0000000000
--- a/src/gui/opengl/qopenglpaintdevice_p.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGL_PAINTDEVICE_P_H
-#define QOPENGL_PAINTDEVICE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of the Qt OpenGL classes. This header file may change from
-// version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtGui/private/qtguiglobal_p.h>
-#include <qopenglpaintdevice.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLContext;
-class QPaintEngine;
-
-class Q_GUI_EXPORT QOpenGLPaintDevicePrivate
-{
-public:
- QOpenGLPaintDevicePrivate(const QSize &size);
- virtual ~QOpenGLPaintDevicePrivate();
-
- static QOpenGLPaintDevicePrivate *get(QOpenGLPaintDevice *dev) { return dev->d_func(); }
-
- virtual void beginPaint() { }
- virtual void endPaint() { }
-
-public:
- QSize size;
- QOpenGLContext *ctx;
-
- qreal dpmx;
- qreal dpmy;
- qreal devicePixelRatio;
-
- bool flipped;
-
- QPaintEngine *engine;
-};
-
-QT_END_NAMESPACE
-
-#endif // QOPENGL_PAINTDEVICE_P_H
diff --git a/src/gui/opengl/qopenglpaintengine.cpp b/src/gui/opengl/qopenglpaintengine.cpp
deleted file mode 100644
index b53c9a3eab..0000000000
--- a/src/gui/opengl/qopenglpaintengine.cpp
+++ /dev/null
@@ -1,2702 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*
- When the active program changes, we need to update it's uniforms.
- We could track state for each program and only update stale uniforms
- - Could lead to lots of overhead if there's a lot of programs
- We could update all the uniforms when the program changes
- - Could end up updating lots of uniforms which don't need updating
-
- Updating uniforms should be cheap, so the overhead of updating up-to-date
- uniforms should be minimal. It's also less complex.
-
- Things which _may_ cause a different program to be used:
- - Change in brush/pen style
- - Change in painter opacity
- - Change in composition mode
-
- Whenever we set a mode on the shader manager - it needs to tell us if it had
- to switch to a different program.
-
- The shader manager should only switch when we tell it to. E.g. if we set a new
- brush style and then switch to transparent painter, we only want it to compile
- and use the correct program when we really need it.
-*/
-
-// #define QT_OPENGL_CACHE_AS_VBOS
-
-#include "qopenglgradientcache_p.h"
-#include "qopengltexturecache_p.h"
-#include "qopenglpaintengine_p.h"
-#include "qopenglpaintdevice_p.h"
-
-#include <string.h> //for memcpy
-#include <qmath.h>
-
-#include <private/qopengl_p.h>
-#include <private/qopenglcontext_p.h>
-#include <private/qopenglextensions_p.h>
-#include <private/qpaintengineex_p.h>
-#include <QPaintEngine>
-#include <private/qpainter_p.h>
-#include <private/qfontengine_p.h>
-#include <private/qdatabuffer_p.h>
-#include <private/qstatictext_p.h>
-#include <private/qtriangulator_p.h>
-
-#include "qopenglengineshadermanager_p.h"
-#include "qopengl2pexvertexarray_p.h"
-#include "qopengltextureglyphcache_p.h"
-
-#include <QDebug>
-
-#ifndef GL_KHR_blend_equation_advanced
-#define GL_KHR_blend_equation_advanced 1
-#define GL_MULTIPLY_KHR 0x9294
-#define GL_SCREEN_KHR 0x9295
-#define GL_OVERLAY_KHR 0x9296
-#define GL_DARKEN_KHR 0x9297
-#define GL_LIGHTEN_KHR 0x9298
-#define GL_COLORDODGE_KHR 0x9299
-#define GL_COLORBURN_KHR 0x929A
-#define GL_HARDLIGHT_KHR 0x929B
-#define GL_SOFTLIGHT_KHR 0x929C
-#define GL_DIFFERENCE_KHR 0x929E
-#define GL_EXCLUSION_KHR 0x92A0
-#endif /* GL_KHR_blend_equation_advanced */
-
-#ifndef GL_KHR_blend_equation_advanced_coherent
-#define GL_KHR_blend_equation_advanced_coherent 1
-#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285
-#endif /* GL_KHR_blend_equation_advanced_coherent */
-
-QT_BEGIN_NAMESPACE
-
-
-Q_GUI_EXPORT QImage qt_imageForBrush(int brushStyle, bool invert);
-
-////////////////////////////////// Private Methods //////////////////////////////////////////
-
-QOpenGL2PaintEngineExPrivate::~QOpenGL2PaintEngineExPrivate()
-{
- delete shaderManager;
-
- vertexBuffer.destroy();
- texCoordBuffer.destroy();
- opacityBuffer.destroy();
- indexBuffer.destroy();
- vao.destroy();
-
- if (elementIndicesVBOId != 0) {
- funcs.glDeleteBuffers(1, &elementIndicesVBOId);
- elementIndicesVBOId = 0;
- }
-}
-
-inline QColor qt_premultiplyColor(QColor c, GLfloat opacity)
-{
- qreal alpha = c.alphaF() * opacity;
- c.setAlphaF(alpha);
- c.setRedF(c.redF() * alpha);
- c.setGreenF(c.greenF() * alpha);
- c.setBlueF(c.blueF() * alpha);
- return c;
-}
-
-
-void QOpenGL2PaintEngineExPrivate::setBrush(const QBrush& brush)
-{
- if (qbrush_fast_equals(currentBrush, brush))
- return;
-
- const Qt::BrushStyle newStyle = qbrush_style(brush);
- Q_ASSERT(newStyle != Qt::NoBrush);
-
- currentBrush = brush;
- if (!currentBrushImage.isNull())
- currentBrushImage = QImage();
- brushUniformsDirty = true; // All brushes have at least one uniform
-
- if (newStyle > Qt::SolidPattern)
- brushTextureDirty = true;
-
- if (currentBrush.style() == Qt::TexturePattern
- && qHasPixmapTexture(brush) && brush.texture().isQBitmap())
- {
- shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::TextureSrcWithPattern);
- } else {
- shaderManager->setSrcPixelType(newStyle);
- }
- shaderManager->optimiseForBrushTransform(currentBrush.transform().type());
-}
-
-
-void QOpenGL2PaintEngineExPrivate::useSimpleShader()
-{
- shaderManager->useSimpleProgram();
-
- if (matrixDirty)
- updateMatrix();
-}
-
-/*
- Single entry-point for activating, binding, and setting properties.
-
- Allows keeping track of (caching) the latest texture unit and bound
- texture in a central place, so that we can skip re-binding unless
- needed.
-
- \note Any code or Qt API that internally activates or binds will
- not affect the cache used by this function, which means they will
- lead to inconsisent state. QPainter::beginNativePainting() takes
- care of resetting the cache, so for user–code this is fine, but
- internally in the paint engine care must be taken to not call
- functions that may activate or bind under our feet.
-*/
-template<typename T>
-void QOpenGL2PaintEngineExPrivate::updateTexture(GLenum textureUnit, const T &texture, GLenum wrapMode, GLenum filterMode, TextureUpdateMode updateMode)
-{
- static const GLenum target = GL_TEXTURE_2D;
-
- activateTextureUnit(textureUnit);
-
- GLuint textureId = bindTexture(texture);
-
- if (updateMode == UpdateIfNeeded && textureId == lastTextureUsed)
- return;
-
- lastTextureUsed = textureId;
-
- funcs.glTexParameteri(target, GL_TEXTURE_WRAP_S, wrapMode);
- funcs.glTexParameteri(target, GL_TEXTURE_WRAP_T, wrapMode);
-
- funcs.glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filterMode);
- funcs.glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filterMode);
-}
-
-void QOpenGL2PaintEngineExPrivate::activateTextureUnit(GLenum textureUnit)
-{
- if (textureUnit != lastTextureUnitUsed) {
- funcs.glActiveTexture(GL_TEXTURE0 + textureUnit);
- lastTextureUnitUsed = textureUnit;
-
- // We simplify things by keeping a single cached value of the last
- // texture that was bound, instead of one per texture unit. This
- // means that switching texture units could potentially mean we
- // need a re-bind and corresponding parameter updates.
- lastTextureUsed = GLuint(-1);
- }
-}
-
-template<>
-GLuint QOpenGL2PaintEngineExPrivate::bindTexture(const GLuint &textureId)
-{
- if (textureId != lastTextureUsed)
- funcs.glBindTexture(GL_TEXTURE_2D, textureId);
-
- return textureId;
-}
-
-template<>
-GLuint QOpenGL2PaintEngineExPrivate::bindTexture(const QImage &image)
-{
- return QOpenGLTextureCache::cacheForContext(ctx)->bindTexture(ctx, image);
-}
-
-template<>
-GLuint QOpenGL2PaintEngineExPrivate::bindTexture(const QPixmap &pixmap)
-{
- return QOpenGLTextureCache::cacheForContext(ctx)->bindTexture(ctx, pixmap);
-}
-
-template<>
-GLuint QOpenGL2PaintEngineExPrivate::bindTexture(const QGradient &gradient)
-{
- // We apply global opacity in the fragment shaders, so we always pass 1.0
- // for opacity to the cache.
- GLuint textureId = QOpenGL2GradientCache::cacheForContext(ctx)->getBuffer(gradient, 1.0);
-
- // QOpenGL2GradientCache::getBuffer() may bind and generate a new texture if it
- // hasn't been cached yet, but will otherwise return an unbound texture id. To
- // be sure that the texture is bound, we unfortunately have to bind again,
- // which results in the initial generation of the texture doing two binds.
- return bindTexture(textureId);
-}
-
-struct ImageWithBindOptions
-{
- const QImage &image;
- QOpenGLTextureUploader::BindOptions options;
-};
-
-template<>
-GLuint QOpenGL2PaintEngineExPrivate::bindTexture(const ImageWithBindOptions &imageWithOptions)
-{
- return QOpenGLTextureCache::cacheForContext(ctx)->bindTexture(ctx, imageWithOptions.image, imageWithOptions.options);
-}
-
-inline static bool isPowerOfTwo(int x)
-{
- // Assumption: x >= 1
- return x == (x & -x);
-}
-
-void QOpenGL2PaintEngineExPrivate::updateBrushTexture()
-{
- Q_Q(QOpenGL2PaintEngineEx);
-// qDebug("QOpenGL2PaintEngineExPrivate::updateBrushTexture()");
- Qt::BrushStyle style = currentBrush.style();
-
- bool smoothPixmapTransform = q->state()->renderHints & QPainter::SmoothPixmapTransform;
- GLenum filterMode = smoothPixmapTransform ? GL_LINEAR : GL_NEAREST;
-
- if ( (style >= Qt::Dense1Pattern) && (style <= Qt::DiagCrossPattern) ) {
- // Get the image data for the pattern
- QImage textureImage = qt_imageForBrush(style, false);
-
- updateTexture(QT_BRUSH_TEXTURE_UNIT, textureImage, GL_REPEAT, filterMode, ForceUpdate);
- }
- else if (style >= Qt::LinearGradientPattern && style <= Qt::ConicalGradientPattern) {
- // Gradiant brush: All the gradiants use the same texture
-
- const QGradient *gradient = currentBrush.gradient();
-
- GLenum wrapMode = GL_CLAMP_TO_EDGE;
- if (gradient->spread() == QGradient::RepeatSpread || gradient->type() == QGradient::ConicalGradient)
- wrapMode = GL_REPEAT;
- else if (gradient->spread() == QGradient::ReflectSpread)
- wrapMode = GL_MIRRORED_REPEAT;
-
- updateTexture(QT_BRUSH_TEXTURE_UNIT, *gradient, wrapMode, filterMode, ForceUpdate);
- }
- else if (style == Qt::TexturePattern) {
- currentBrushImage = currentBrush.textureImage();
-
- int max_texture_size = ctx->d_func()->maxTextureSize();
- QSize newSize = currentBrushImage.size();
- newSize = newSize.boundedTo(QSize(max_texture_size, max_texture_size));
- if (!QOpenGLContext::currentContext()->functions()->hasOpenGLFeature(QOpenGLFunctions::NPOTTextureRepeat)) {
- if (!isPowerOfTwo(newSize.width()) || !isPowerOfTwo(newSize.height())) {
- newSize.setHeight(qNextPowerOfTwo(newSize.height() - 1));
- newSize.setWidth(qNextPowerOfTwo(newSize.width() - 1));
- }
- }
- if (currentBrushImage.size() != newSize)
- currentBrushImage = currentBrushImage.scaled(newSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
-
- GLuint wrapMode = GL_REPEAT;
-
- updateTexture(QT_BRUSH_TEXTURE_UNIT, currentBrushImage, wrapMode, filterMode, ForceUpdate);
- }
- brushTextureDirty = false;
-}
-
-
-void QOpenGL2PaintEngineExPrivate::updateBrushUniforms()
-{
-// qDebug("QOpenGL2PaintEngineExPrivate::updateBrushUniforms()");
- Qt::BrushStyle style = currentBrush.style();
-
- if (style == Qt::NoBrush)
- return;
-
- QTransform brushQTransform = currentBrush.transform();
-
- if (style == Qt::SolidPattern) {
- QColor col = qt_premultiplyColor(currentBrush.color(), (GLfloat)q->state()->opacity);
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::FragmentColor), col);
- }
- else {
- // All other brushes have a transform and thus need the translation point:
- QPointF translationPoint;
-
- if (style <= Qt::DiagCrossPattern) {
- QColor col = qt_premultiplyColor(currentBrush.color(), (GLfloat)q->state()->opacity);
-
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::PatternColor), col);
-
- QVector2D halfViewportSize(width*0.5, height*0.5);
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::HalfViewportSize), halfViewportSize);
- }
- else if (style == Qt::LinearGradientPattern) {
- const QLinearGradient *g = static_cast<const QLinearGradient *>(currentBrush.gradient());
-
- QPointF realStart = g->start();
- QPointF realFinal = g->finalStop();
- translationPoint = realStart;
-
- QPointF l = realFinal - realStart;
-
- QVector3D linearData(
- l.x(),
- l.y(),
- 1.0f / (l.x() * l.x() + l.y() * l.y())
- );
-
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::LinearData), linearData);
-
- QVector2D halfViewportSize(width*0.5, height*0.5);
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::HalfViewportSize), halfViewportSize);
- }
- else if (style == Qt::ConicalGradientPattern) {
- const QConicalGradient *g = static_cast<const QConicalGradient *>(currentBrush.gradient());
- translationPoint = g->center();
-
- GLfloat angle = -qDegreesToRadians(g->angle());
-
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::Angle), angle);
-
- QVector2D halfViewportSize(width*0.5, height*0.5);
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::HalfViewportSize), halfViewportSize);
- }
- else if (style == Qt::RadialGradientPattern) {
- const QRadialGradient *g = static_cast<const QRadialGradient *>(currentBrush.gradient());
- QPointF realCenter = g->center();
- QPointF realFocal = g->focalPoint();
- qreal realRadius = g->centerRadius() - g->focalRadius();
- translationPoint = realFocal;
-
- QPointF fmp = realCenter - realFocal;
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::Fmp), fmp);
-
- GLfloat fmp2_m_radius2 = -fmp.x() * fmp.x() - fmp.y() * fmp.y() + realRadius*realRadius;
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::Fmp2MRadius2), fmp2_m_radius2);
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::Inverse2Fmp2MRadius2),
- GLfloat(1.0 / (2.0*fmp2_m_radius2)));
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::SqrFr),
- GLfloat(g->focalRadius() * g->focalRadius()));
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::BRadius),
- GLfloat(2 * (g->centerRadius() - g->focalRadius()) * g->focalRadius()),
- g->focalRadius(),
- g->centerRadius() - g->focalRadius());
-
- QVector2D halfViewportSize(width*0.5, height*0.5);
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::HalfViewportSize), halfViewportSize);
- }
- else if (style == Qt::TexturePattern) {
- const QPixmap& texPixmap = currentBrush.texture();
-
- if (qHasPixmapTexture(currentBrush) && currentBrush.texture().isQBitmap()) {
- QColor col = qt_premultiplyColor(currentBrush.color(), (GLfloat)q->state()->opacity);
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::PatternColor), col);
- }
-
- QSizeF invertedTextureSize(1.0 / texPixmap.width(), 1.0 / texPixmap.height());
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::InvertedTextureSize), invertedTextureSize);
-
- QVector2D halfViewportSize(width*0.5, height*0.5);
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::HalfViewportSize), halfViewportSize);
- }
- else
- qWarning("QOpenGL2PaintEngineEx: Unimplemented fill style");
-
- const QPointF &brushOrigin = q->state()->brushOrigin;
- QTransform matrix = q->state()->matrix;
- matrix.translate(brushOrigin.x(), brushOrigin.y());
-
- QTransform translate(1, 0, 0, 1, -translationPoint.x(), -translationPoint.y());
- qreal m22 = -1;
- qreal dy = height;
- if (device->paintFlipped()) {
- m22 = 1;
- dy = 0;
- }
- QTransform gl_to_qt(1, 0, 0, m22, 0, dy);
- QTransform inv_matrix = gl_to_qt * (brushQTransform * matrix).inverted() * translate;
-
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::BrushTransform), inv_matrix);
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::BrushTexture), QT_BRUSH_TEXTURE_UNIT);
- }
- brushUniformsDirty = false;
-}
-
-
-// This assumes the shader manager has already setup the correct shader program
-void QOpenGL2PaintEngineExPrivate::updateMatrix()
-{
-// qDebug("QOpenGL2PaintEngineExPrivate::updateMatrix()");
-
- const QTransform& transform = q->state()->matrix;
-
- // The projection matrix converts from Qt's coordinate system to GL's coordinate system
- // * GL's viewport is 2x2, Qt's is width x height
- // * GL has +y -> -y going from bottom -> top, Qt is the other way round
- // * GL has [0,0] in the center, Qt has it in the top-left
- //
- // This results in the Projection matrix below, which is multiplied by the painter's
- // transformation matrix, as shown below:
- //
- // Projection Matrix Painter Transform
- // ------------------------------------------------ ------------------------
- // | 2.0 / width | 0.0 | -1.0 | | m11 | m21 | dx |
- // | 0.0 | -2.0 / height | 1.0 | * | m12 | m22 | dy |
- // | 0.0 | 0.0 | 1.0 | | m13 | m23 | m33 |
- // ------------------------------------------------ ------------------------
- //
- // NOTE: The resultant matrix is also transposed, as GL expects column-major matracies
-
- const GLfloat wfactor = 2.0f / width;
- GLfloat hfactor = -2.0f / height;
-
- GLfloat dx = transform.dx();
- GLfloat dy = transform.dy();
-
- if (device->paintFlipped()) {
- hfactor *= -1;
- dy -= height;
- }
-
- // Non-integer translates can have strange effects for some rendering operations such as
- // anti-aliased text rendering. In such cases, we snap the translate to the pixel grid.
- if (snapToPixelGrid && transform.type() == QTransform::TxTranslate) {
- // 0.50 needs to rounded down to 0.0 for consistency with raster engine:
- dx = std::ceil(dx - 0.5f);
- dy = std::ceil(dy - 0.5f);
- }
- pmvMatrix[0][0] = (wfactor * transform.m11()) - transform.m13();
- pmvMatrix[1][0] = (wfactor * transform.m21()) - transform.m23();
- pmvMatrix[2][0] = (wfactor * dx) - transform.m33();
- pmvMatrix[0][1] = (hfactor * transform.m12()) + transform.m13();
- pmvMatrix[1][1] = (hfactor * transform.m22()) + transform.m23();
- pmvMatrix[2][1] = (hfactor * dy) + transform.m33();
- pmvMatrix[0][2] = transform.m13();
- pmvMatrix[1][2] = transform.m23();
- pmvMatrix[2][2] = transform.m33();
-
- // 1/10000 == 0.0001, so we have good enough res to cover curves
- // that span the entire widget...
- inverseScale = qMax(1 / qMax( qMax(qAbs(transform.m11()), qAbs(transform.m22())),
- qMax(qAbs(transform.m12()), qAbs(transform.m21())) ),
- qreal(0.0001));
-
- matrixDirty = false;
- matrixUniformDirty = true;
-
- // Set the PMV matrix attribute. As we use an attributes rather than uniforms, we only
- // need to do this once for every matrix change and persists across all shader programs.
- funcs.glVertexAttrib3fv(QT_PMV_MATRIX_1_ATTR, pmvMatrix[0]);
- funcs.glVertexAttrib3fv(QT_PMV_MATRIX_2_ATTR, pmvMatrix[1]);
- funcs.glVertexAttrib3fv(QT_PMV_MATRIX_3_ATTR, pmvMatrix[2]);
-
- dasher.setInvScale(inverseScale);
- stroker.setInvScale(inverseScale);
-}
-
-
-void QOpenGL2PaintEngineExPrivate::updateCompositionMode()
-{
- // NOTE: The entire paint engine works on pre-multiplied data - which is why some of these
- // composition modes look odd.
-// qDebug() << "QOpenGL2PaintEngineExPrivate::updateCompositionMode() - Setting GL composition mode for " << q->state()->composition_mode;
- if (ctx->functions()->hasOpenGLFeature(QOpenGLFunctions::BlendEquationAdvanced)) {
- if (q->state()->composition_mode <= QPainter::CompositionMode_Plus) {
- funcs.glDisable(GL_BLEND_ADVANCED_COHERENT_KHR);
- funcs.glBlendEquation(GL_FUNC_ADD);
- } else {
- funcs.glEnable(GL_BLEND_ADVANCED_COHERENT_KHR);
- }
- shaderManager->setCompositionMode(q->state()->composition_mode);
- } else {
- if (q->state()->composition_mode > QPainter::CompositionMode_Plus) {
- qWarning("Unsupported composition mode");
- compositionModeDirty = false;
- return;
- }
- }
- switch(q->state()->composition_mode) {
- case QPainter::CompositionMode_SourceOver:
- funcs.glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_DestinationOver:
- funcs.glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE);
- break;
- case QPainter::CompositionMode_Clear:
- funcs.glBlendFunc(GL_ZERO, GL_ZERO);
- break;
- case QPainter::CompositionMode_Source:
- funcs.glBlendFunc(GL_ONE, GL_ZERO);
- break;
- case QPainter::CompositionMode_Destination:
- funcs.glBlendFunc(GL_ZERO, GL_ONE);
- break;
- case QPainter::CompositionMode_SourceIn:
- funcs.glBlendFunc(GL_DST_ALPHA, GL_ZERO);
- break;
- case QPainter::CompositionMode_DestinationIn:
- funcs.glBlendFunc(GL_ZERO, GL_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_SourceOut:
- funcs.glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ZERO);
- break;
- case QPainter::CompositionMode_DestinationOut:
- funcs.glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_SourceAtop:
- funcs.glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_DestinationAtop:
- funcs.glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_Xor:
- funcs.glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_Plus:
- funcs.glBlendFunc(GL_ONE, GL_ONE);
- break;
- case QPainter::CompositionMode_Multiply:
- funcs.glBlendEquation(GL_MULTIPLY_KHR);
- break;
- case QPainter::CompositionMode_Screen:
- funcs.glBlendEquation(GL_SCREEN_KHR);
- break;
- case QPainter::CompositionMode_Overlay:
- funcs.glBlendEquation(GL_OVERLAY_KHR);
- break;
- case QPainter::CompositionMode_Darken:
- funcs.glBlendEquation(GL_DARKEN_KHR);
- break;
- case QPainter::CompositionMode_Lighten:
- funcs.glBlendEquation(GL_LIGHTEN_KHR);
- break;
- case QPainter::CompositionMode_ColorDodge:
- funcs.glBlendEquation(GL_COLORDODGE_KHR);
- break;
- case QPainter::CompositionMode_ColorBurn:
- funcs.glBlendEquation(GL_COLORBURN_KHR);
- break;
- case QPainter::CompositionMode_HardLight:
- funcs.glBlendEquation(GL_HARDLIGHT_KHR);
- break;
- case QPainter::CompositionMode_SoftLight:
- funcs.glBlendEquation(GL_SOFTLIGHT_KHR);
- break;
- case QPainter::CompositionMode_Difference:
- funcs.glBlendEquation(GL_DIFFERENCE_KHR);
- break;
- case QPainter::CompositionMode_Exclusion:
- funcs.glBlendEquation(GL_EXCLUSION_KHR);
- break;
- default:
- qWarning("Unsupported composition mode");
- break;
- }
-
- compositionModeDirty = false;
-}
-
-static inline void setCoords(GLfloat *coords, const QOpenGLRect &rect)
-{
- coords[0] = rect.left;
- coords[1] = rect.top;
- coords[2] = rect.right;
- coords[3] = rect.top;
- coords[4] = rect.right;
- coords[5] = rect.bottom;
- coords[6] = rect.left;
- coords[7] = rect.bottom;
-}
-
-void QOpenGL2PaintEngineExPrivate::drawTexture(const QOpenGLRect& dest, const QOpenGLRect& src, const QSize &textureSize, bool opaque, bool pattern)
-{
- // Setup for texture drawing
- currentBrush = noBrush;
-
- if (snapToPixelGrid) {
- snapToPixelGrid = false;
- matrixDirty = true;
- }
-
- if (prepareForDraw(opaque))
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::ImageTexture), QT_IMAGE_TEXTURE_UNIT);
-
- if (pattern) {
- QColor col = qt_premultiplyColor(q->state()->pen.color(), (GLfloat)q->state()->opacity);
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::PatternColor), col);
- }
-
- GLfloat dx = 1.0 / textureSize.width();
- GLfloat dy = 1.0 / textureSize.height();
-
- QOpenGLRect srcTextureRect(src.left*dx, src.top*dy, src.right*dx, src.bottom*dy);
-
- setCoords(staticVertexCoordinateArray, dest);
- setCoords(staticTextureCoordinateArray, srcTextureRect);
-
- setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
- setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, true);
-
- uploadData(QT_VERTEX_COORDS_ATTR, staticVertexCoordinateArray, 8);
- uploadData(QT_TEXTURE_COORDS_ATTR, staticTextureCoordinateArray, 8);
-
- funcs.glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-}
-
-void QOpenGL2PaintEngineEx::beginNativePainting()
-{
- Q_D(QOpenGL2PaintEngineEx);
- ensureActive();
- d->transferMode(BrushDrawingMode);
-
- d->nativePaintingActive = true;
-
- d->funcs.glUseProgram(0);
-
- // Disable all the vertex attribute arrays:
- for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i)
- d->funcs.glDisableVertexAttribArray(i);
-
-#if !defined(QT_OPENGL_ES_2) && !defined(QT_OPENGL_DYNAMIC)
- Q_ASSERT(QOpenGLContext::currentContext());
- const QOpenGLContext *ctx = d->ctx;
- const QSurfaceFormat &fmt = d->device->context()->format();
- if (fmt.majorVersion() < 3 || (fmt.majorVersion() == 3 && fmt.minorVersion() < 1)
- || (fmt.majorVersion() == 3 && fmt.minorVersion() == 1 && ctx->hasExtension(QByteArrayLiteral("GL_ARB_compatibility")))
- || fmt.profile() == QSurfaceFormat::CompatibilityProfile)
- {
- // be nice to people who mix OpenGL 1.x code with QPainter commands
- // by setting modelview and projection matrices to mirror the GL 1
- // paint engine
- const QTransform& mtx = state()->matrix;
-
- float mv_matrix[4][4] =
- {
- { float(mtx.m11()), float(mtx.m12()), 0, float(mtx.m13()) },
- { float(mtx.m21()), float(mtx.m22()), 0, float(mtx.m23()) },
- { 0, 0, 1, 0 },
- { float(mtx.dx()), float(mtx.dy()), 0, float(mtx.m33()) }
- };
-
- const QSize sz = d->device->size();
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0, sz.width(), sz.height(), 0, -999999, 999999);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadMatrixf(&mv_matrix[0][0]);
- }
-#endif // QT_OPENGL_ES_2
-
- d->resetGLState();
-
- // We don't know what texture units and textures the native painting
- // will activate and bind, so we can't assume anything when we return
- // from the native painting.
- d->lastTextureUnitUsed = QT_UNKNOWN_TEXTURE_UNIT;
- d->lastTextureUsed = GLuint(-1);
-
- d->dirtyStencilRegion = QRect(0, 0, d->width, d->height);
-
- d->shaderManager->setDirty();
-
- d->needsSync = true;
-}
-
-void QOpenGL2PaintEngineExPrivate::resetGLState()
-{
- activateTextureUnit(QT_DEFAULT_TEXTURE_UNIT);
-
- funcs.glDisable(GL_BLEND);
- funcs.glDisable(GL_STENCIL_TEST);
- funcs.glDisable(GL_DEPTH_TEST);
- funcs.glDisable(GL_SCISSOR_TEST);
- funcs.glDepthMask(true);
- funcs.glDepthFunc(GL_LESS);
- funcs.glClearDepthf(1);
- funcs.glStencilMask(0xff);
- funcs.glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- funcs.glStencilFunc(GL_ALWAYS, 0, 0xff);
- setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, false);
- setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, false);
- setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false);
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- // gl_Color, corresponding to vertex attribute 3, may have been changed
- float color[] = { 1.0f, 1.0f, 1.0f, 1.0f };
- funcs.glVertexAttrib4fv(3, color);
- }
- if (vao.isCreated()) {
- vao.release();
- funcs.glBindBuffer(GL_ARRAY_BUFFER, 0);
- funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- }
-}
-
-void QOpenGL2PaintEngineEx::endNativePainting()
-{
- Q_D(QOpenGL2PaintEngineEx);
- d->needsSync = true;
- d->nativePaintingActive = false;
-}
-
-void QOpenGL2PaintEngineEx::invalidateState()
-{
- Q_D(QOpenGL2PaintEngineEx);
- d->needsSync = true;
-}
-
-bool QOpenGL2PaintEngineEx::isNativePaintingActive() const {
- Q_D(const QOpenGL2PaintEngineEx);
- return d->nativePaintingActive;
-}
-
-void QOpenGL2PaintEngineExPrivate::transferMode(EngineMode newMode)
-{
- if (newMode == mode)
- return;
-
- if (newMode == TextDrawingMode) {
- shaderManager->setHasComplexGeometry(true);
- } else {
- shaderManager->setHasComplexGeometry(false);
- }
-
- if (newMode == ImageDrawingMode) {
- uploadData(QT_VERTEX_COORDS_ATTR, staticVertexCoordinateArray, 8);
- uploadData(QT_TEXTURE_COORDS_ATTR, staticTextureCoordinateArray, 8);
- }
-
- if (newMode == ImageArrayDrawingMode || newMode == ImageOpacityArrayDrawingMode) {
- uploadData(QT_VERTEX_COORDS_ATTR, (GLfloat*)vertexCoordinateArray.data(), vertexCoordinateArray.vertexCount() * 2);
- uploadData(QT_TEXTURE_COORDS_ATTR, (GLfloat*)textureCoordinateArray.data(), textureCoordinateArray.vertexCount() * 2);
-
- if (newMode == ImageOpacityArrayDrawingMode)
- uploadData(QT_OPACITY_ATTR, (GLfloat*)opacityArray.data(), opacityArray.size());
- }
-
- // This needs to change when we implement high-quality anti-aliasing...
- if (newMode != TextDrawingMode)
- shaderManager->setMaskType(QOpenGLEngineShaderManager::NoMask);
-
- mode = newMode;
-}
-
-struct QOpenGL2PEVectorPathCache
-{
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- GLuint vbo;
- GLuint ibo;
-#else
- float *vertices;
- void *indices;
-#endif
- int vertexCount;
- int indexCount;
- GLenum primitiveType;
- qreal iscale;
- QVertexIndexVector::Type indexType;
-};
-
-void QOpenGL2PaintEngineExPrivate::cleanupVectorPath(QPaintEngineEx *engine, void *data)
-{
- QOpenGL2PEVectorPathCache *c = (QOpenGL2PEVectorPathCache *) data;
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- Q_ASSERT(engine->type() == QPaintEngine::OpenGL2);
- static_cast<QOpenGL2PaintEngineEx *>(engine)->d_func()->unusedVBOSToClean << c->vbo;
- if (c->ibo)
- d->unusedIBOSToClean << c->ibo;
-#else
- Q_UNUSED(engine);
- free(c->vertices);
- free(c->indices);
-#endif
- delete c;
-}
-
-// Assumes everything is configured for the brush you want to use
-void QOpenGL2PaintEngineExPrivate::fill(const QVectorPath& path)
-{
- transferMode(BrushDrawingMode);
-
- if (snapToPixelGrid) {
- snapToPixelGrid = false;
- matrixDirty = true;
- }
-
- // Might need to call updateMatrix to re-calculate inverseScale
- if (matrixDirty)
- updateMatrix();
-
- const bool supportsElementIndexUint = funcs.hasOpenGLExtension(QOpenGLExtensions::ElementIndexUint);
-
- const QPointF* const points = reinterpret_cast<const QPointF*>(path.points());
-
- // Check to see if there's any hints
- if (path.shape() == QVectorPath::RectangleHint) {
- QOpenGLRect rect(points[0].x(), points[0].y(), points[2].x(), points[2].y());
- prepareForDraw(currentBrush.isOpaque());
- composite(rect);
- } else if (path.isConvex()) {
-
- if (path.isCacheable()) {
- QVectorPath::CacheEntry *data = path.lookupCacheData(q);
- QOpenGL2PEVectorPathCache *cache;
-
- bool updateCache = false;
-
- if (data) {
- cache = (QOpenGL2PEVectorPathCache *) data->data;
- // Check if scale factor is exceeded and regenerate if so...
- qreal scaleFactor = cache->iscale / inverseScale;
- if (scaleFactor < 0.5 || scaleFactor > 2.0) {
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- glDeleteBuffers(1, &cache->vbo);
- cache->vbo = 0;
- Q_ASSERT(cache->ibo == 0);
-#else
- free(cache->vertices);
- Q_ASSERT(cache->indices == nullptr);
-#endif
- updateCache = true;
- }
- } else {
- cache = new QOpenGL2PEVectorPathCache;
- data = const_cast<QVectorPath &>(path).addCacheData(q, cache, cleanupVectorPath);
- updateCache = true;
- }
-
- // Flatten the path at the current scale factor and fill it into the cache struct.
- if (updateCache) {
- vertexCoordinateArray.clear();
- vertexCoordinateArray.addPath(path, inverseScale, false);
- int vertexCount = vertexCoordinateArray.vertexCount();
- int floatSizeInBytes = vertexCount * 2 * sizeof(float);
- cache->vertexCount = vertexCount;
- cache->indexCount = 0;
- cache->primitiveType = GL_TRIANGLE_FAN;
- cache->iscale = inverseScale;
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- funcs.glGenBuffers(1, &cache->vbo);
- funcs.glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
- funcs.glBufferData(GL_ARRAY_BUFFER, floatSizeInBytes, vertexCoordinateArray.data(), GL_STATIC_DRAW);
- cache->ibo = 0;
-#else
- cache->vertices = (float *) malloc(floatSizeInBytes);
- memcpy(cache->vertices, vertexCoordinateArray.data(), floatSizeInBytes);
- cache->indices = nullptr;
-#endif
- }
-
- prepareForDraw(currentBrush.isOpaque());
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- funcs.glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
- uploadData(QT_VERTEX_COORD_ATTR, 0, cache->vertexCount);
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, 0);
-#else
- uploadData(QT_VERTEX_COORDS_ATTR, cache->vertices, cache->vertexCount * 2);
-#endif
- funcs.glDrawArrays(cache->primitiveType, 0, cache->vertexCount);
-
- } else {
- // printf(" - Marking path as cachable...\n");
- // Tag it for later so that if the same path is drawn twice, it is assumed to be static and thus cachable
- path.makeCacheable();
- vertexCoordinateArray.clear();
- vertexCoordinateArray.addPath(path, inverseScale, false);
- prepareForDraw(currentBrush.isOpaque());
- drawVertexArrays(vertexCoordinateArray, GL_TRIANGLE_FAN);
- }
-
- } else {
- bool useCache = path.isCacheable();
- if (useCache) {
- QRectF bbox = path.controlPointRect();
- // If the path doesn't fit within these limits, it is possible that the triangulation will fail.
- useCache &= (bbox.left() > -0x8000 * inverseScale)
- && (bbox.right() < 0x8000 * inverseScale)
- && (bbox.top() > -0x8000 * inverseScale)
- && (bbox.bottom() < 0x8000 * inverseScale);
- }
-
- if (useCache) {
- QVectorPath::CacheEntry *data = path.lookupCacheData(q);
- QOpenGL2PEVectorPathCache *cache;
-
- bool updateCache = false;
-
- if (data) {
- cache = (QOpenGL2PEVectorPathCache *) data->data;
- // Check if scale factor is exceeded and regenerate if so...
- qreal scaleFactor = cache->iscale / inverseScale;
- if (scaleFactor < 0.5 || scaleFactor > 2.0) {
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- glDeleteBuffers(1, &cache->vbo);
- glDeleteBuffers(1, &cache->ibo);
-#else
- free(cache->vertices);
- free(cache->indices);
-#endif
- updateCache = true;
- }
- } else {
- cache = new QOpenGL2PEVectorPathCache;
- data = const_cast<QVectorPath &>(path).addCacheData(q, cache, cleanupVectorPath);
- updateCache = true;
- }
-
- // Flatten the path at the current scale factor and fill it into the cache struct.
- if (updateCache) {
- QTriangleSet polys = qTriangulate(path, QTransform().scale(1 / inverseScale, 1 / inverseScale), 1, supportsElementIndexUint);
- cache->vertexCount = polys.vertices.size() / 2;
- cache->indexCount = polys.indices.size();
- cache->primitiveType = GL_TRIANGLES;
- cache->iscale = inverseScale;
- cache->indexType = polys.indices.type();
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- funcs.glGenBuffers(1, &cache->vbo);
- funcs.glGenBuffers(1, &cache->ibo);
- funcs.glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
- funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo);
-
- if (polys.indices.type() == QVertexIndexVector::UnsignedInt)
- funcs.glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint32) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW);
- else
- funcs.glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint16) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW);
-
- QVarLengthArray<float> vertices(polys.vertices.size());
- for (int i = 0; i < polys.vertices.size(); ++i)
- vertices[i] = float(inverseScale * polys.vertices.at(i));
- funcs.glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(), vertices.data(), GL_STATIC_DRAW);
-#else
- cache->vertices = (float *) malloc(sizeof(float) * polys.vertices.size());
- if (polys.indices.type() == QVertexIndexVector::UnsignedInt) {
- cache->indices = (quint32 *) malloc(sizeof(quint32) * polys.indices.size());
- memcpy(cache->indices, polys.indices.data(), sizeof(quint32) * polys.indices.size());
- } else {
- cache->indices = (quint16 *) malloc(sizeof(quint16) * polys.indices.size());
- memcpy(cache->indices, polys.indices.data(), sizeof(quint16) * polys.indices.size());
- }
- for (int i = 0; i < polys.vertices.size(); ++i)
- cache->vertices[i] = float(inverseScale * polys.vertices.at(i));
-#endif
- }
-
- prepareForDraw(currentBrush.isOpaque());
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- funcs.glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
- funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo);
- uploadData(QT_VERTEX_COORDS_ATTR, 0, cache->vertexCount);
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, 0);
- if (cache->indexType == QVertexIndexVector::UnsignedInt)
- funcs.glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, 0);
- else
- funcs.glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, 0);
- funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- funcs.glBindBuffer(GL_ARRAY_BUFFER, 0);
-#else
- uploadData(QT_VERTEX_COORDS_ATTR, cache->vertices, cache->vertexCount * 2);
- const GLenum indexValueType = cache->indexType == QVertexIndexVector::UnsignedInt ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
- const bool useIndexVbo = uploadIndexData(cache->indices, indexValueType, cache->indexCount);
- funcs.glDrawElements(cache->primitiveType, cache->indexCount, indexValueType, useIndexVbo ? nullptr : cache->indices);
-#endif
-
- } else {
- // printf(" - Marking path as cachable...\n");
- // Tag it for later so that if the same path is drawn twice, it is assumed to be static and thus cachable
- path.makeCacheable();
-
- if (device->context()->format().stencilBufferSize() <= 0) {
- // If there is no stencil buffer, triangulate the path instead.
-
- QRectF bbox = path.controlPointRect();
- // If the path doesn't fit within these limits, it is possible that the triangulation will fail.
- bool withinLimits = (bbox.left() > -0x8000 * inverseScale)
- && (bbox.right() < 0x8000 * inverseScale)
- && (bbox.top() > -0x8000 * inverseScale)
- && (bbox.bottom() < 0x8000 * inverseScale);
- if (withinLimits) {
- QTriangleSet polys = qTriangulate(path, QTransform().scale(1 / inverseScale, 1 / inverseScale), 1, supportsElementIndexUint);
-
- QVarLengthArray<float> vertices(polys.vertices.size());
- for (int i = 0; i < polys.vertices.size(); ++i)
- vertices[i] = float(inverseScale * polys.vertices.at(i));
-
- prepareForDraw(currentBrush.isOpaque());
- uploadData(QT_VERTEX_COORDS_ATTR, vertices.constData(), vertices.size());
- const GLenum indexValueType = funcs.hasOpenGLExtension(QOpenGLExtensions::ElementIndexUint) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
- const bool useIndexVbo = uploadIndexData(polys.indices.data(), indexValueType, polys.indices.size());
- funcs.glDrawElements(GL_TRIANGLES, polys.indices.size(), indexValueType, useIndexVbo ? nullptr : polys.indices.data());
- } else {
- // We can't handle big, concave painter paths with OpenGL without stencil buffer.
- qWarning("Painter path exceeds +/-32767 pixels.");
- }
- return;
- }
-
- // The path is too complicated & needs the stencil technique
- vertexCoordinateArray.clear();
- vertexCoordinateArray.addPath(path, inverseScale, false);
-
- fillStencilWithVertexArray(vertexCoordinateArray, path.hasWindingFill());
-
- funcs.glStencilMask(0xff);
- funcs.glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
-
- if (q->state()->clipTestEnabled) {
- // Pass when high bit is set, replace stencil value with current clip
- funcs.glStencilFunc(GL_NOTEQUAL, q->state()->currentClip, GL_STENCIL_HIGH_BIT);
- } else if (path.hasWindingFill()) {
- // Pass when any bit is set, replace stencil value with 0
- funcs.glStencilFunc(GL_NOTEQUAL, 0, 0xff);
- } else {
- // Pass when high bit is set, replace stencil value with 0
- funcs.glStencilFunc(GL_NOTEQUAL, 0, GL_STENCIL_HIGH_BIT);
- }
- prepareForDraw(currentBrush.isOpaque());
-
- // Stencil the brush onto the dest buffer
- composite(vertexCoordinateArray.boundingRect());
- funcs.glStencilMask(0);
- updateClipScissorTest();
- }
- }
-}
-
-
-void QOpenGL2PaintEngineExPrivate::fillStencilWithVertexArray(const float *data,
- int count,
- int *stops,
- int stopCount,
- const QOpenGLRect &bounds,
- StencilFillMode mode)
-{
- Q_ASSERT(count || stops);
-
-// qDebug("QOpenGL2PaintEngineExPrivate::fillStencilWithVertexArray()");
- funcs.glStencilMask(0xff); // Enable stencil writes
-
- if (dirtyStencilRegion.intersects(currentScissorBounds)) {
- const QRegion clearRegion = dirtyStencilRegion.intersected(currentScissorBounds);
- funcs.glClearStencil(0); // Clear to zero
- for (const QRect &rect : clearRegion) {
-#ifndef QT_GL_NO_SCISSOR_TEST
- setScissor(rect);
-#endif
- funcs.glClear(GL_STENCIL_BUFFER_BIT);
- }
-
- dirtyStencilRegion -= currentScissorBounds;
-
-#ifndef QT_GL_NO_SCISSOR_TEST
- updateClipScissorTest();
-#endif
- }
-
- funcs.glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // Disable color writes
- useSimpleShader();
- funcs.glEnable(GL_STENCIL_TEST); // For some reason, this has to happen _after_ the simple shader is use()'d
-
- if (mode == WindingFillMode) {
- Q_ASSERT(stops && !count);
- if (q->state()->clipTestEnabled) {
- // Flatten clip values higher than current clip, and set high bit to match current clip
- funcs.glStencilFunc(GL_LEQUAL, GL_STENCIL_HIGH_BIT | q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
- funcs.glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
- composite(bounds);
-
- funcs.glStencilFunc(GL_EQUAL, GL_STENCIL_HIGH_BIT, GL_STENCIL_HIGH_BIT);
- } else if (!stencilClean) {
- // Clear stencil buffer within bounding rect
- funcs.glStencilFunc(GL_ALWAYS, 0, 0xff);
- funcs.glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO);
- composite(bounds);
- }
-
- // Inc. for front-facing triangle
- funcs.glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_INCR_WRAP, GL_INCR_WRAP);
- // Dec. for back-facing "holes"
- funcs.glStencilOpSeparate(GL_BACK, GL_KEEP, GL_DECR_WRAP, GL_DECR_WRAP);
- funcs.glStencilMask(~GL_STENCIL_HIGH_BIT);
- drawVertexArrays(data, stops, stopCount, GL_TRIANGLE_FAN);
-
- if (q->state()->clipTestEnabled) {
- // Clear high bit of stencil outside of path
- funcs.glStencilFunc(GL_EQUAL, q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
- funcs.glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
- funcs.glStencilMask(GL_STENCIL_HIGH_BIT);
- composite(bounds);
- }
- } else if (mode == OddEvenFillMode) {
- funcs.glStencilMask(GL_STENCIL_HIGH_BIT);
- funcs.glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT); // Simply invert the stencil bit
- drawVertexArrays(data, stops, stopCount, GL_TRIANGLE_FAN);
-
- } else { // TriStripStrokeFillMode
- Q_ASSERT(count && !stops); // tristrips generated directly, so no vertexArray or stops
- funcs.glStencilMask(GL_STENCIL_HIGH_BIT);
-#if 0
- funcs.glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT); // Simply invert the stencil bit
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, data);
- funcs.glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
-#else
-
- funcs.glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
- if (q->state()->clipTestEnabled) {
- funcs.glStencilFunc(GL_LEQUAL, q->state()->currentClip | GL_STENCIL_HIGH_BIT,
- ~GL_STENCIL_HIGH_BIT);
- } else {
- funcs.glStencilFunc(GL_ALWAYS, GL_STENCIL_HIGH_BIT, 0xff);
- }
-
- uploadData(QT_VERTEX_COORDS_ATTR, data, count * 2);
- funcs.glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
-#endif
- }
-
- // Enable color writes & disable stencil writes
- funcs.glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-}
-
-/*
- If the maximum value in the stencil buffer is GL_STENCIL_HIGH_BIT - 1,
- restore the stencil buffer to a pristine state. The current clip region
- is set to 1, and the rest to 0.
-*/
-void QOpenGL2PaintEngineExPrivate::resetClipIfNeeded()
-{
- if (maxClip != (GL_STENCIL_HIGH_BIT - 1))
- return;
-
- Q_Q(QOpenGL2PaintEngineEx);
-
- useSimpleShader();
- funcs.glEnable(GL_STENCIL_TEST);
- funcs.glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
-
- QRectF bounds = q->state()->matrix.inverted().mapRect(QRectF(0, 0, width, height));
- QOpenGLRect rect(bounds.left(), bounds.top(), bounds.right(), bounds.bottom());
-
- // Set high bit on clip region
- funcs.glStencilFunc(GL_LEQUAL, q->state()->currentClip, 0xff);
- funcs.glStencilOp(GL_KEEP, GL_INVERT, GL_INVERT);
- funcs.glStencilMask(GL_STENCIL_HIGH_BIT);
- composite(rect);
-
- // Reset clipping to 1 and everything else to zero
- funcs.glStencilFunc(GL_NOTEQUAL, 0x01, GL_STENCIL_HIGH_BIT);
- funcs.glStencilOp(GL_ZERO, GL_REPLACE, GL_REPLACE);
- funcs.glStencilMask(0xff);
- composite(rect);
-
- q->state()->currentClip = 1;
- q->state()->canRestoreClip = false;
-
- maxClip = 1;
-
- funcs.glStencilMask(0x0);
- funcs.glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-}
-
-bool QOpenGL2PaintEngineExPrivate::prepareForCachedGlyphDraw(const QFontEngineGlyphCache &cache)
-{
- Q_Q(QOpenGL2PaintEngineEx);
-
- Q_ASSERT(cache.transform().type() <= QTransform::TxScale);
-
- QTransform &transform = q->state()->matrix;
- transform.scale(1.0 / cache.transform().m11(), 1.0 / cache.transform().m22());
- bool ret = prepareForDraw(false);
- transform.scale(cache.transform().m11(), cache.transform().m22());
-
- return ret;
-}
-
-bool QOpenGL2PaintEngineExPrivate::prepareForDraw(bool srcPixelsAreOpaque)
-{
- if (brushTextureDirty && (mode == TextDrawingMode || mode == BrushDrawingMode))
- updateBrushTexture();
-
- if (compositionModeDirty)
- updateCompositionMode();
-
- if (matrixDirty)
- updateMatrix();
-
- const bool stateHasOpacity = q->state()->opacity < 0.99f;
- if (q->state()->composition_mode == QPainter::CompositionMode_Source
- || (q->state()->composition_mode == QPainter::CompositionMode_SourceOver
- && srcPixelsAreOpaque && !stateHasOpacity))
- {
- funcs.glDisable(GL_BLEND);
- } else {
- funcs.glEnable(GL_BLEND);
- }
-
- QOpenGLEngineShaderManager::OpacityMode opacityMode;
- if (mode == ImageOpacityArrayDrawingMode) {
- opacityMode = QOpenGLEngineShaderManager::AttributeOpacity;
- } else {
- opacityMode = stateHasOpacity ? QOpenGLEngineShaderManager::UniformOpacity
- : QOpenGLEngineShaderManager::NoOpacity;
- if (stateHasOpacity && (mode != ImageDrawingMode && mode != ImageArrayDrawingMode)) {
- // Using a brush
- bool brushIsPattern = (currentBrush.style() >= Qt::Dense1Pattern) &&
- (currentBrush.style() <= Qt::DiagCrossPattern);
-
- if ((currentBrush.style() == Qt::SolidPattern) || brushIsPattern)
- opacityMode = QOpenGLEngineShaderManager::NoOpacity; // Global opacity handled by srcPixel shader
- }
- }
- shaderManager->setOpacityMode(opacityMode);
-
- bool changed = shaderManager->useCorrectShaderProg();
- // If the shader program needs changing, we change it and mark all uniforms as dirty
- if (changed) {
- // The shader program has changed so mark all uniforms as dirty:
- brushUniformsDirty = true;
- opacityUniformDirty = true;
- matrixUniformDirty = true;
- }
-
- if (brushUniformsDirty && (mode == TextDrawingMode || mode == BrushDrawingMode))
- updateBrushUniforms();
-
- if (opacityMode == QOpenGLEngineShaderManager::UniformOpacity && opacityUniformDirty) {
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::GlobalOpacity), (GLfloat)q->state()->opacity);
- opacityUniformDirty = false;
- }
-
- if (matrixUniformDirty && shaderManager->hasComplexGeometry()) {
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::Matrix),
- pmvMatrix);
- matrixUniformDirty = false;
- }
-
- return changed;
-}
-
-void QOpenGL2PaintEngineExPrivate::composite(const QOpenGLRect& boundingRect)
-{
- setCoords(staticVertexCoordinateArray, boundingRect);
-
- uploadData(QT_VERTEX_COORDS_ATTR, staticVertexCoordinateArray, 8);
- funcs.glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-}
-
-// Draws the vertex array as a set of <vertexArrayStops.size()> triangle fans.
-void QOpenGL2PaintEngineExPrivate::drawVertexArrays(const float *data, int *stops, int stopCount,
- GLenum primitive)
-{
- // Now setup the pointer to the vertex array:
- uploadData(QT_VERTEX_COORDS_ATTR, data, stops[stopCount-1] * 2);
-
- int previousStop = 0;
- for (int i=0; i<stopCount; ++i) {
- int stop = stops[i];
-
- funcs.glDrawArrays(primitive, previousStop, stop - previousStop);
- previousStop = stop;
- }
-}
-
-/////////////////////////////////// Public Methods //////////////////////////////////////////
-
-QOpenGL2PaintEngineEx::QOpenGL2PaintEngineEx()
- : QPaintEngineEx(*(new QOpenGL2PaintEngineExPrivate(this)))
-{
- gccaps &= ~QPaintEngine::RasterOpModes;
-}
-
-QOpenGL2PaintEngineEx::~QOpenGL2PaintEngineEx()
-{
-}
-
-void QOpenGL2PaintEngineEx::fill(const QVectorPath &path, const QBrush &brush)
-{
- Q_D(QOpenGL2PaintEngineEx);
-
- if (qbrush_style(brush) == Qt::NoBrush)
- return;
- ensureActive();
- d->setBrush(brush);
- d->fill(path);
-}
-
-Q_GUI_EXPORT bool qt_scaleForTransform(const QTransform &transform, qreal *scale); // qtransform.cpp
-
-
-void QOpenGL2PaintEngineEx::stroke(const QVectorPath &path, const QPen &pen)
-{
- Q_D(QOpenGL2PaintEngineEx);
-
- const QBrush &penBrush = qpen_brush(pen);
- if (qpen_style(pen) == Qt::NoPen || qbrush_style(penBrush) == Qt::NoBrush)
- return;
-
- QOpenGL2PaintEngineState *s = state();
- if (qt_pen_is_cosmetic(pen, state()->renderHints) && !qt_scaleForTransform(s->transform(), nullptr)) {
- // QTriangulatingStroker class is not meant to support cosmetically sheared strokes.
- QPaintEngineEx::stroke(path, pen);
- return;
- }
-
- ensureActive();
- d->setBrush(penBrush);
- d->stroke(path, pen);
-}
-
-void QOpenGL2PaintEngineExPrivate::stroke(const QVectorPath &path, const QPen &pen)
-{
- const QOpenGL2PaintEngineState *s = q->state();
- if (snapToPixelGrid) {
- snapToPixelGrid = false;
- matrixDirty = true;
- }
-
- const Qt::PenStyle penStyle = qpen_style(pen);
- const QBrush &penBrush = qpen_brush(pen);
- const bool opaque = penBrush.isOpaque() && s->opacity > 0.99;
-
- transferMode(BrushDrawingMode);
-
- // updateMatrix() is responsible for setting the inverse scale on
- // the strokers, so we need to call it here and not wait for
- // prepareForDraw() down below.
- updateMatrix();
-
- QRectF clip = q->state()->matrix.inverted().mapRect(q->state()->clipEnabled
- ? q->state()->rectangleClip
- : QRectF(0, 0, width, height));
-
- if (penStyle == Qt::SolidLine) {
- stroker.process(path, pen, clip, s->renderHints);
-
- } else { // Some sort of dash
- dasher.process(path, pen, clip, s->renderHints);
-
- QVectorPath dashStroke(dasher.points(),
- dasher.elementCount(),
- dasher.elementTypes());
- stroker.process(dashStroke, pen, clip, s->renderHints);
- }
-
- if (!stroker.vertexCount())
- return;
-
- if (opaque) {
- prepareForDraw(opaque);
-
- uploadData(QT_VERTEX_COORDS_ATTR, stroker.vertices(), stroker.vertexCount());
- funcs.glDrawArrays(GL_TRIANGLE_STRIP, 0, stroker.vertexCount() / 2);
- } else {
- qreal width = qpen_widthf(pen) / 2;
- if (width == 0)
- width = 0.5;
- qreal extra = pen.joinStyle() == Qt::MiterJoin
- ? qMax(pen.miterLimit() * width, width)
- : width;
-
- if (qt_pen_is_cosmetic(pen, q->state()->renderHints))
- extra = extra * inverseScale;
-
- QRectF bounds = path.controlPointRect().adjusted(-extra, -extra, extra, extra);
-
- fillStencilWithVertexArray(stroker.vertices(), stroker.vertexCount() / 2,
- nullptr, 0, bounds, QOpenGL2PaintEngineExPrivate::TriStripStrokeFillMode);
-
- funcs.glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
-
- // Pass when any bit is set, replace stencil value with 0
- funcs.glStencilFunc(GL_NOTEQUAL, 0, GL_STENCIL_HIGH_BIT);
- prepareForDraw(false);
-
- // Stencil the brush onto the dest buffer
- composite(bounds);
-
- funcs.glStencilMask(0);
-
- updateClipScissorTest();
- }
-}
-
-void QOpenGL2PaintEngineEx::penChanged() { }
-void QOpenGL2PaintEngineEx::brushChanged() { }
-void QOpenGL2PaintEngineEx::brushOriginChanged() { }
-
-void QOpenGL2PaintEngineEx::opacityChanged()
-{
-// qDebug("QOpenGL2PaintEngineEx::opacityChanged()");
- Q_D(QOpenGL2PaintEngineEx);
- state()->opacityChanged = true;
-
- Q_ASSERT(d->shaderManager);
- d->brushUniformsDirty = true;
- d->opacityUniformDirty = true;
-}
-
-void QOpenGL2PaintEngineEx::compositionModeChanged()
-{
-// qDebug("QOpenGL2PaintEngineEx::compositionModeChanged()");
- Q_D(QOpenGL2PaintEngineEx);
- state()->compositionModeChanged = true;
- d->compositionModeDirty = true;
-}
-
-void QOpenGL2PaintEngineEx::renderHintsChanged()
-{
- state()->renderHintsChanged = true;
-
-#ifndef QT_OPENGL_ES_2
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- Q_D(QOpenGL2PaintEngineEx);
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- if ((state()->renderHints & QPainter::Antialiasing)
-#if QT_DEPRECATED_SINCE(5, 14)
- || (state()->renderHints & QPainter::HighQualityAntialiasing)
-#endif
- )
- d->funcs.glEnable(GL_MULTISAMPLE);
- else
- d->funcs.glDisable(GL_MULTISAMPLE);
-QT_WARNING_POP
- }
-#endif // QT_OPENGL_ES_2
-
- Q_D(QOpenGL2PaintEngineEx);
-
- // This is a somewhat sneaky way of conceptually making the next call to
- // updateTexture() use FoceUpdate for the TextureUpdateMode. We need this
- // as new render hints may require updating the filter mode.
- d->lastTextureUsed = GLuint(-1);
-
- d->brushTextureDirty = true;
-// qDebug("QOpenGL2PaintEngineEx::renderHintsChanged() not implemented!");
-}
-
-void QOpenGL2PaintEngineEx::transformChanged()
-{
- Q_D(QOpenGL2PaintEngineEx);
- d->matrixDirty = true;
- state()->matrixChanged = true;
-}
-
-
-static const QRectF scaleRect(const QRectF &r, qreal sx, qreal sy)
-{
- return QRectF(r.x() * sx, r.y() * sy, r.width() * sx, r.height() * sy);
-}
-
-void QOpenGL2PaintEngineEx::drawPixmap(const QRectF& dest, const QPixmap & pixmap, const QRectF & src)
-{
- Q_D(QOpenGL2PaintEngineEx);
- QOpenGLContext *ctx = d->ctx;
-
- // Draw pixmaps that are really images as images since drawImage has
- // better handling of non-default image formats.
- if (pixmap.paintEngine()->type() == QPaintEngine::Raster && !pixmap.isQBitmap())
- return drawImage(dest, pixmap.toImage(), src);
-
- int max_texture_size = ctx->d_func()->maxTextureSize();
- if (pixmap.width() > max_texture_size || pixmap.height() > max_texture_size) {
- QPixmap scaled = pixmap.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
-
- const qreal sx = scaled.width() / qreal(pixmap.width());
- const qreal sy = scaled.height() / qreal(pixmap.height());
-
- drawPixmap(dest, scaled, scaleRect(src, sx, sy));
- return;
- }
-
- ensureActive();
- d->transferMode(ImageDrawingMode);
-
- GLenum filterMode = state()->renderHints & QPainter::SmoothPixmapTransform ? GL_LINEAR : GL_NEAREST;
- d->updateTexture(QT_IMAGE_TEXTURE_UNIT, pixmap, GL_CLAMP_TO_EDGE, filterMode);
-
- bool isBitmap = pixmap.isQBitmap();
- bool isOpaque = !isBitmap && !pixmap.hasAlpha();
-
- d->shaderManager->setSrcPixelType(isBitmap ? QOpenGLEngineShaderManager::PatternSrc : QOpenGLEngineShaderManager::ImageSrc);
-
- QOpenGLRect srcRect(src.left(), src.top(), src.right(), src.bottom());
- d->drawTexture(dest, srcRect, pixmap.size(), isOpaque, isBitmap);
-}
-
-void QOpenGL2PaintEngineEx::drawImage(const QRectF& dest, const QImage& image, const QRectF& src,
- Qt::ImageConversionFlags)
-{
- Q_D(QOpenGL2PaintEngineEx);
- QOpenGLContext *ctx = d->ctx;
-
- int max_texture_size = ctx->d_func()->maxTextureSize();
- if (image.width() > max_texture_size || image.height() > max_texture_size) {
- QImage scaled = image.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
-
- const qreal sx = scaled.width() / qreal(image.width());
- const qreal sy = scaled.height() / qreal(image.height());
-
- drawImage(dest, scaled, scaleRect(src, sx, sy));
- return;
- }
-
- ensureActive();
- d->transferMode(ImageDrawingMode);
-
- QOpenGLTextureUploader::BindOptions bindOption = QOpenGLTextureUploader::PremultipliedAlphaBindOption;
- // Use specialized bind for formats we have specialized shaders for.
- switch (image.format()) {
- case QImage::Format_RGBA8888:
- case QImage::Format_ARGB32:
- case QImage::Format_RGBA64:
- d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::NonPremultipliedImageSrc);
- bindOption = { };
- break;
- case QImage::Format_Alpha8:
- if (ctx->functions()->hasOpenGLFeature(QOpenGLFunctions::TextureRGFormats)) {
- d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::AlphaImageSrc);
- bindOption = QOpenGLTextureUploader::UseRedForAlphaAndLuminanceBindOption;
- } else
- d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
- break;
- case QImage::Format_Grayscale8:
- case QImage::Format_Grayscale16:
- if (ctx->functions()->hasOpenGLFeature(QOpenGLFunctions::TextureRGFormats)) {
- d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::GrayscaleImageSrc);
- bindOption = QOpenGLTextureUploader::UseRedForAlphaAndLuminanceBindOption;
- } else
- d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
- break;
- default:
- d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
- break;
- }
-
- ImageWithBindOptions imageWithOptions = { image, bindOption };
- GLenum filterMode = state()->renderHints & QPainter::SmoothPixmapTransform ? GL_LINEAR : GL_NEAREST;
- d->updateTexture(QT_IMAGE_TEXTURE_UNIT, imageWithOptions, GL_CLAMP_TO_EDGE, filterMode);
-
- d->drawTexture(dest, src, image.size(), !image.hasAlphaChannel());
-}
-
-void QOpenGL2PaintEngineEx::drawStaticTextItem(QStaticTextItem *textItem)
-{
- Q_D(QOpenGL2PaintEngineEx);
-
- ensureActive();
-
- QPainterState *s = state();
-
- QFontEngine *fontEngine = textItem->fontEngine();
- if (shouldDrawCachedGlyphs(fontEngine, s->matrix)) {
- QFontEngine::GlyphFormat glyphFormat = fontEngine->glyphFormat != QFontEngine::Format_None
- ? fontEngine->glyphFormat : d->glyphCacheFormat;
- if (glyphFormat == QFontEngine::Format_A32) {
- if (d->device->context()->format().alphaBufferSize() > 0 || s->matrix.type() > QTransform::TxTranslate
- || (s->composition_mode != QPainter::CompositionMode_Source
- && s->composition_mode != QPainter::CompositionMode_SourceOver))
- {
- glyphFormat = QFontEngine::Format_A8;
- }
- }
-
- d->drawCachedGlyphs(glyphFormat, textItem);
- } else {
- QPaintEngineEx::drawStaticTextItem(textItem);
- }
-}
-
-bool QOpenGL2PaintEngineEx::drawTexture(const QRectF &dest, GLuint textureId, const QSize &size, const QRectF &src)
-{
- Q_D(QOpenGL2PaintEngineEx);
- if (!d->shaderManager)
- return false;
-
- ensureActive();
- d->transferMode(ImageDrawingMode);
-
- GLenum filterMode = state()->renderHints & QPainter::SmoothPixmapTransform ? GL_LINEAR : GL_NEAREST;
- d->updateTexture(QT_IMAGE_TEXTURE_UNIT, textureId, GL_CLAMP_TO_EDGE, filterMode);
-
- d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
-
- QOpenGLRect srcRect(src.left(), src.bottom(), src.right(), src.top());
- d->drawTexture(dest, srcRect, size, false);
-
- return true;
-}
-
-void QOpenGL2PaintEngineEx::drawTextItem(const QPointF &p, const QTextItem &textItem)
-{
- Q_D(QOpenGL2PaintEngineEx);
-
- ensureActive();
- QOpenGL2PaintEngineState *s = state();
-
- const QTextItemInt &ti = static_cast<const QTextItemInt &>(textItem);
-
- QTransform::TransformationType txtype = s->matrix.type();
-
- QFontEngine::GlyphFormat glyphFormat = ti.fontEngine->glyphFormat != QFontEngine::Format_None
- ? ti.fontEngine->glyphFormat : d->glyphCacheFormat;
-
- if (glyphFormat == QFontEngine::Format_A32) {
- if (d->device->context()->format().alphaBufferSize() > 0 || txtype > QTransform::TxTranslate
- || (state()->composition_mode != QPainter::CompositionMode_Source
- && state()->composition_mode != QPainter::CompositionMode_SourceOver))
- {
- glyphFormat = QFontEngine::Format_A8;
- }
- }
-
- if (shouldDrawCachedGlyphs(ti.fontEngine, s->matrix)) {
- QVarLengthArray<QFixedPoint> positions;
- QVarLengthArray<glyph_t> glyphs;
- QTransform matrix = QTransform::fromTranslate(p.x(), p.y());
- ti.fontEngine->getGlyphPositions(ti.glyphs, matrix, ti.flags, glyphs, positions);
-
- {
- QStaticTextItem staticTextItem;
- staticTextItem.setFontEngine(ti.fontEngine);
- staticTextItem.glyphs = glyphs.data();
- staticTextItem.numGlyphs = glyphs.size();
- staticTextItem.glyphPositions = positions.data();
-
- d->drawCachedGlyphs(glyphFormat, &staticTextItem);
- }
- return;
- }
-
- QPaintEngineEx::drawTextItem(p, ti);
-}
-
-namespace {
-
- class QOpenGLStaticTextUserData: public QStaticTextUserData
- {
- public:
- QOpenGLStaticTextUserData()
- : QStaticTextUserData(OpenGLUserData), cacheSize(0, 0), cacheSerialNumber(0)
- {
- }
-
- ~QOpenGLStaticTextUserData()
- {
- }
-
- QSize cacheSize;
- QOpenGL2PEXVertexArray vertexCoordinateArray;
- QOpenGL2PEXVertexArray textureCoordinateArray;
- QFontEngine::GlyphFormat glyphFormat;
- int cacheSerialNumber;
- };
-
-}
-
-
-// #define QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO
-
-bool QOpenGL2PaintEngineEx::shouldDrawCachedGlyphs(QFontEngine *fontEngine, const QTransform &t) const
-{
- // The paint engine does not support projected cached glyph drawing
- if (t.type() == QTransform::TxProject)
- return false;
-
- // The font engine might not support filling the glyph cache
- // with the given transform applied, in which case we need to
- // fall back to the QPainterPath code-path.
- if (!fontEngine->supportsTransformation(t)) {
- // Except that drawing paths is slow, so for scales between
- // 0.5 and 2.0 we leave the glyph cache untransformed and deal
- // with the transform ourselves when painting, resulting in
- // drawing 1x cached glyphs with a smooth-scale.
- float det = t.determinant();
- if (det >= 0.25f && det <= 4.f) {
- // Assuming the baseclass still agrees
- return QPaintEngineEx::shouldDrawCachedGlyphs(fontEngine, t);
- }
-
- return false; // Fall back to path-drawing
- }
-
- return QPaintEngineEx::shouldDrawCachedGlyphs(fontEngine, t);
-}
-
-void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngine::GlyphFormat glyphFormat,
- QStaticTextItem *staticTextItem)
-{
- Q_Q(QOpenGL2PaintEngineEx);
-
- QOpenGL2PaintEngineState *s = q->state();
-
- void *cacheKey = ctx; // use context, not the shareGroup() -> the GL glyph cache uses FBOs which may not be shareable
- bool recreateVertexArrays = false;
-
- QTransform glyphCacheTransform;
- QFontEngine *fe = staticTextItem->fontEngine();
- if (fe->supportsTransformation(s->matrix)) {
- // The font-engine supports rendering glyphs with the current transform, so we
- // build a glyph-cache with the scale pre-applied, so that the cache contains
- // glyphs with the appropriate resolution in the case of retina displays.
- glyphCacheTransform = s->matrix.type() < QTransform::TxRotate ?
- QTransform::fromScale(qAbs(s->matrix.m11()), qAbs(s->matrix.m22())) :
- QTransform::fromScale(
- QVector2D(s->matrix.m11(), s->matrix.m12()).length(),
- QVector2D(s->matrix.m21(), s->matrix.m22()).length());
- }
-
- QOpenGLTextureGlyphCache *cache =
- (QOpenGLTextureGlyphCache *) fe->glyphCache(cacheKey, glyphFormat, glyphCacheTransform);
- if (!cache || cache->glyphFormat() != glyphFormat || cache->contextGroup() == nullptr) {
- cache = new QOpenGLTextureGlyphCache(glyphFormat, glyphCacheTransform);
- fe->setGlyphCache(cacheKey, cache);
- recreateVertexArrays = true;
- }
-
- if (staticTextItem->userDataNeedsUpdate) {
- recreateVertexArrays = true;
- } else if (staticTextItem->userData() == nullptr) {
- recreateVertexArrays = true;
- } else if (staticTextItem->userData()->type != QStaticTextUserData::OpenGLUserData) {
- recreateVertexArrays = true;
- } else {
- QOpenGLStaticTextUserData *userData = static_cast<QOpenGLStaticTextUserData *>(staticTextItem->userData());
- if (userData->glyphFormat != glyphFormat) {
- recreateVertexArrays = true;
- } else if (userData->cacheSerialNumber != cache->serialNumber()) {
- recreateVertexArrays = true;
- }
- }
-
- // We only need to update the cache with new glyphs if we are actually going to recreate the vertex arrays.
- // If the cache size has changed, we do need to regenerate the vertices, but we don't need to repopulate the
- // cache so this text is performed before we test if the cache size has changed.
- if (recreateVertexArrays) {
- cache->setPaintEnginePrivate(this);
- if (!cache->populate(fe, staticTextItem->numGlyphs,
- staticTextItem->glyphs, staticTextItem->glyphPositions)) {
- // No space for glyphs in cache. We need to reset it and try again.
- cache->clear();
- cache->populate(fe, staticTextItem->numGlyphs,
- staticTextItem->glyphs, staticTextItem->glyphPositions);
- }
-
- if (cache->hasPendingGlyphs()) {
- // Filling in the glyphs binds and sets parameters, so we need to
- // ensure that the glyph cache doesn't mess with whatever unit
- // is currently active. Note that the glyph cache internally
- // uses the image texture unit for blitting to the cache, while
- // we switch between image and mask units when drawing.
- static const GLenum glypchCacheTextureUnit = QT_IMAGE_TEXTURE_UNIT;
- activateTextureUnit(glypchCacheTextureUnit);
-
- cache->fillInPendingGlyphs();
-
- // We assume the cache can be trusted on which texture was bound
- lastTextureUsed = cache->texture();
-
- // But since the brush and image texture units are possibly shared
- // we may have to re-bind brush textures after filling in the cache.
- brushTextureDirty = (QT_BRUSH_TEXTURE_UNIT == glypchCacheTextureUnit);
- }
- cache->setPaintEnginePrivate(nullptr);
- }
-
- if (cache->width() == 0 || cache->height() == 0)
- return;
-
- if (glyphFormat == QFontEngine::Format_ARGB)
- transferMode(ImageArrayDrawingMode);
- else
- transferMode(TextDrawingMode);
-
- int margin = fe->glyphMargin(glyphFormat);
-
- GLfloat dx = 1.0 / cache->width();
- GLfloat dy = 1.0 / cache->height();
-
- // Use global arrays by default
- QOpenGL2PEXVertexArray *vertexCoordinates = &vertexCoordinateArray;
- QOpenGL2PEXVertexArray *textureCoordinates = &textureCoordinateArray;
-
- if (staticTextItem->useBackendOptimizations) {
- QOpenGLStaticTextUserData *userData = nullptr;
-
- if (staticTextItem->userData() == nullptr
- || staticTextItem->userData()->type != QStaticTextUserData::OpenGLUserData) {
-
- userData = new QOpenGLStaticTextUserData();
- staticTextItem->setUserData(userData);
-
- } else {
- userData = static_cast<QOpenGLStaticTextUserData*>(staticTextItem->userData());
- }
-
- userData->glyphFormat = glyphFormat;
- userData->cacheSerialNumber = cache->serialNumber();
-
- // Use cache if backend optimizations is turned on
- vertexCoordinates = &userData->vertexCoordinateArray;
- textureCoordinates = &userData->textureCoordinateArray;
-
- QSize size(cache->width(), cache->height());
- if (userData->cacheSize != size) {
- recreateVertexArrays = true;
- userData->cacheSize = size;
- }
- }
-
- if (recreateVertexArrays) {
- vertexCoordinates->clear();
- textureCoordinates->clear();
-
- bool supportsSubPixelPositions = fe->supportsSubPixelPositions();
- for (int i=0; i<staticTextItem->numGlyphs; ++i) {
- QFixed subPixelPosition;
- if (supportsSubPixelPositions)
- subPixelPosition = fe->subPixelPositionForX(staticTextItem->glyphPositions[i].x);
-
- QTextureGlyphCache::GlyphAndSubPixelPosition glyph(staticTextItem->glyphs[i], subPixelPosition);
-
- const QTextureGlyphCache::Coord &c = cache->coords[glyph];
- if (c.isNull())
- continue;
-
- int x = qFloor(staticTextItem->glyphPositions[i].x.toReal() * cache->transform().m11()) + c.baseLineX - margin;
- int y = qRound(staticTextItem->glyphPositions[i].y.toReal() * cache->transform().m22()) - c.baseLineY - margin;
-
- vertexCoordinates->addQuad(QRectF(x, y, c.w, c.h));
- textureCoordinates->addQuad(QRectF(c.x*dx, c.y*dy, c.w * dx, c.h * dy));
- }
-
- staticTextItem->userDataNeedsUpdate = false;
- }
-
- int numGlyphs = vertexCoordinates->vertexCount() / 4;
- if (numGlyphs == 0)
- return;
-
- if (elementIndices.size() < numGlyphs*6) {
- Q_ASSERT(elementIndices.size() % 6 == 0);
- int j = elementIndices.size() / 6 * 4;
- while (j < numGlyphs*4) {
- elementIndices.append(j + 0);
- elementIndices.append(j + 0);
- elementIndices.append(j + 1);
- elementIndices.append(j + 2);
- elementIndices.append(j + 3);
- elementIndices.append(j + 3);
-
- j += 4;
- }
-
-#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
- if (elementIndicesVBOId == 0)
- funcs.glGenBuffers(1, &elementIndicesVBOId);
-
- funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementIndicesVBOId);
- funcs.glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementIndices.size() * sizeof(GLushort),
- elementIndices.constData(), GL_STATIC_DRAW);
-#endif
- } else {
-#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
- funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementIndicesVBOId);
-#endif
- }
-
- if (glyphFormat != QFontEngine::Format_ARGB || recreateVertexArrays) {
- uploadData(QT_VERTEX_COORDS_ATTR, (GLfloat*)vertexCoordinates->data(), vertexCoordinates->vertexCount() * 2);
- uploadData(QT_TEXTURE_COORDS_ATTR, (GLfloat*)textureCoordinates->data(), textureCoordinates->vertexCount() * 2);
- }
-
- if (!snapToPixelGrid) {
- snapToPixelGrid = true;
- matrixDirty = true;
- }
-
- QBrush pensBrush = q->state()->pen.brush();
- setBrush(pensBrush);
-
- if (glyphFormat == QFontEngine::Format_A32) {
-
- // Subpixel antialiasing without gamma correction
-
- QPainter::CompositionMode compMode = q->state()->composition_mode;
- Q_ASSERT(compMode == QPainter::CompositionMode_Source
- || compMode == QPainter::CompositionMode_SourceOver);
-
- shaderManager->setMaskType(QOpenGLEngineShaderManager::SubPixelMaskPass1);
-
- if (pensBrush.style() == Qt::SolidPattern) {
- // Solid patterns can get away with only one pass.
- QColor c = pensBrush.color();
- qreal oldOpacity = q->state()->opacity;
- if (compMode == QPainter::CompositionMode_Source) {
- c = qt_premultiplyColor(c, q->state()->opacity);
- q->state()->opacity = 1;
- opacityUniformDirty = true;
- }
-
- compositionModeDirty = false; // I can handle this myself, thank you very much
- prepareForCachedGlyphDraw(*cache);
-
- // prepareForCachedGlyphDraw() have set the opacity on the current shader, so the opacity state can now be reset.
- if (compMode == QPainter::CompositionMode_Source) {
- q->state()->opacity = oldOpacity;
- opacityUniformDirty = true;
- }
-
- funcs.glEnable(GL_BLEND);
- funcs.glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_SRC_COLOR);
- funcs.glBlendColor(c.redF(), c.greenF(), c.blueF(), c.alphaF());
- } else {
- // Other brush styles need two passes.
-
- qreal oldOpacity = q->state()->opacity;
- if (compMode == QPainter::CompositionMode_Source) {
- q->state()->opacity = 1;
- opacityUniformDirty = true;
- pensBrush = Qt::white;
- setBrush(pensBrush);
- }
-
- compositionModeDirty = false; // I can handle this myself, thank you very much
- prepareForCachedGlyphDraw(*cache);
- funcs.glEnable(GL_BLEND);
- funcs.glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
-
- updateTexture(QT_MASK_TEXTURE_UNIT, cache->texture(), GL_REPEAT, GL_NEAREST, ForceUpdate);
-
-#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
- funcs.glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, 0);
-#else
- const bool useIndexVbo = uploadIndexData(elementIndices.data(), GL_UNSIGNED_SHORT, 6 * numGlyphs);
- funcs.glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, useIndexVbo ? nullptr : elementIndices.data());
-#endif
-
- shaderManager->setMaskType(QOpenGLEngineShaderManager::SubPixelMaskPass2);
-
- if (compMode == QPainter::CompositionMode_Source) {
- q->state()->opacity = oldOpacity;
- opacityUniformDirty = true;
- pensBrush = q->state()->pen.brush();
- setBrush(pensBrush);
- }
-
- compositionModeDirty = false;
- prepareForCachedGlyphDraw(*cache);
- funcs.glEnable(GL_BLEND);
- funcs.glBlendFunc(GL_ONE, GL_ONE);
- }
- compositionModeDirty = true;
- } else if (glyphFormat == QFontEngine::Format_ARGB) {
- currentBrush = noBrush;
- shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
- if (prepareForCachedGlyphDraw(*cache))
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::ImageTexture), QT_IMAGE_TEXTURE_UNIT);
- } else {
- // Grayscale/mono glyphs
-
- shaderManager->setMaskType(QOpenGLEngineShaderManager::PixelMask);
- prepareForCachedGlyphDraw(*cache);
- }
-
- GLenum textureUnit = QT_MASK_TEXTURE_UNIT;
- if (glyphFormat == QFontEngine::Format_ARGB)
- textureUnit = QT_IMAGE_TEXTURE_UNIT;
-
- QOpenGLTextureGlyphCache::FilterMode filterMode = (s->matrix.type() > QTransform::TxTranslate) ?
- QOpenGLTextureGlyphCache::Linear : QOpenGLTextureGlyphCache::Nearest;
-
- GLenum glFilterMode = filterMode == QOpenGLTextureGlyphCache::Linear ? GL_LINEAR : GL_NEAREST;
-
- TextureUpdateMode updateMode = UpdateIfNeeded;
- if (cache->filterMode() != filterMode) {
- updateMode = ForceUpdate;
- cache->setFilterMode(filterMode);
- }
-
- updateTexture(textureUnit, cache->texture(), GL_REPEAT, glFilterMode, updateMode);
-
-#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
- funcs.glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, 0);
- funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-#else
- const bool useIndexVbo = uploadIndexData(elementIndices.data(), GL_UNSIGNED_SHORT, 6 * numGlyphs);
- funcs.glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, useIndexVbo ? nullptr : elementIndices.data());
-#endif
-}
-
-void QOpenGL2PaintEngineEx::drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap,
- QPainter::PixmapFragmentHints hints)
-{
- Q_D(QOpenGL2PaintEngineEx);
- // Use fallback for extended composition modes.
- if (state()->composition_mode > QPainter::CompositionMode_Plus) {
- QPaintEngineEx::drawPixmapFragments(fragments, fragmentCount, pixmap, hints);
- return;
- }
-
- ensureActive();
- int max_texture_size = d->ctx->d_func()->maxTextureSize();
- if (pixmap.width() > max_texture_size || pixmap.height() > max_texture_size) {
- QPixmap scaled = pixmap.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
- d->drawPixmapFragments(fragments, fragmentCount, scaled, hints);
- } else {
- d->drawPixmapFragments(fragments, fragmentCount, pixmap, hints);
- }
-}
-
-
-void QOpenGL2PaintEngineExPrivate::drawPixmapFragments(const QPainter::PixmapFragment *fragments,
- int fragmentCount, const QPixmap &pixmap,
- QPainter::PixmapFragmentHints hints)
-{
- GLfloat dx = 1.0f / pixmap.size().width();
- GLfloat dy = 1.0f / pixmap.size().height();
-
- vertexCoordinateArray.clear();
- textureCoordinateArray.clear();
- opacityArray.reset();
-
- if (snapToPixelGrid) {
- snapToPixelGrid = false;
- matrixDirty = true;
- }
-
- bool allOpaque = true;
-
- for (int i = 0; i < fragmentCount; ++i) {
- qreal s = 0;
- qreal c = 1;
- if (fragments[i].rotation != 0) {
- s = qFastSin(qDegreesToRadians(fragments[i].rotation));
- c = qFastCos(qDegreesToRadians(fragments[i].rotation));
- }
-
- qreal right = 0.5 * fragments[i].scaleX * fragments[i].width;
- qreal bottom = 0.5 * fragments[i].scaleY * fragments[i].height;
- QOpenGLPoint bottomRight(right * c - bottom * s, right * s + bottom * c);
- QOpenGLPoint bottomLeft(-right * c - bottom * s, -right * s + bottom * c);
-
- vertexCoordinateArray.addVertex(bottomRight.x + fragments[i].x, bottomRight.y + fragments[i].y);
- vertexCoordinateArray.addVertex(-bottomLeft.x + fragments[i].x, -bottomLeft.y + fragments[i].y);
- vertexCoordinateArray.addVertex(-bottomRight.x + fragments[i].x, -bottomRight.y + fragments[i].y);
- vertexCoordinateArray.addVertex(-bottomRight.x + fragments[i].x, -bottomRight.y + fragments[i].y);
- vertexCoordinateArray.addVertex(bottomLeft.x + fragments[i].x, bottomLeft.y + fragments[i].y);
- vertexCoordinateArray.addVertex(bottomRight.x + fragments[i].x, bottomRight.y + fragments[i].y);
-
- QOpenGLRect src(fragments[i].sourceLeft * dx, fragments[i].sourceTop * dy,
- (fragments[i].sourceLeft + fragments[i].width) * dx,
- (fragments[i].sourceTop + fragments[i].height) * dy);
-
- textureCoordinateArray.addVertex(src.right, src.bottom);
- textureCoordinateArray.addVertex(src.right, src.top);
- textureCoordinateArray.addVertex(src.left, src.top);
- textureCoordinateArray.addVertex(src.left, src.top);
- textureCoordinateArray.addVertex(src.left, src.bottom);
- textureCoordinateArray.addVertex(src.right, src.bottom);
-
- qreal opacity = fragments[i].opacity * q->state()->opacity;
- opacityArray << opacity << opacity << opacity << opacity << opacity << opacity;
- allOpaque &= (opacity >= 0.99f);
- }
-
- transferMode(ImageOpacityArrayDrawingMode);
-
- GLenum filterMode = q->state()->renderHints & QPainter::SmoothPixmapTransform ? GL_LINEAR : GL_NEAREST;
- updateTexture(QT_IMAGE_TEXTURE_UNIT, pixmap, GL_CLAMP_TO_EDGE, filterMode);
-
- bool isBitmap = pixmap.isQBitmap();
- bool isOpaque = !isBitmap && (!pixmap.hasAlpha() || (hints & QPainter::OpaqueHint)) && allOpaque;
-
- // Setup for texture drawing
- currentBrush = noBrush;
- shaderManager->setSrcPixelType(isBitmap ? QOpenGLEngineShaderManager::PatternSrc
- : QOpenGLEngineShaderManager::ImageSrc);
- if (prepareForDraw(isOpaque))
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::ImageTexture), QT_IMAGE_TEXTURE_UNIT);
-
- if (isBitmap) {
- QColor col = qt_premultiplyColor(q->state()->pen.color(), (GLfloat)q->state()->opacity);
- shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::PatternColor), col);
- }
-
- funcs.glDrawArrays(GL_TRIANGLES, 0, 6 * fragmentCount);
-}
-
-bool QOpenGL2PaintEngineEx::begin(QPaintDevice *pdev)
-{
- Q_D(QOpenGL2PaintEngineEx);
-
- Q_ASSERT(pdev->devType() == QInternal::OpenGL);
- d->device = static_cast<QOpenGLPaintDevice*>(pdev);
-
- if (!d->device)
- return false;
-
- d->device->ensureActiveTarget();
-
- if (d->device->context() != QOpenGLContext::currentContext() || !d->device->context()) {
- qWarning("QPainter::begin(): QOpenGLPaintDevice's context needs to be current");
- return false;
- }
-
- if (d->ctx != QOpenGLContext::currentContext()
- || (d->ctx && QOpenGLContext::currentContext() && d->ctx->format() != QOpenGLContext::currentContext()->format())) {
- d->vertexBuffer.destroy();
- d->texCoordBuffer.destroy();
- d->opacityBuffer.destroy();
- d->indexBuffer.destroy();
- d->vao.destroy();
- }
-
- d->ctx = QOpenGLContext::currentContext();
- d->ctx->d_func()->active_engine = this;
-
- QOpenGLPaintDevicePrivate::get(d->device)->beginPaint();
-
- d->funcs.initializeOpenGLFunctions();
-
- // Generate a new Vertex Array Object if we don't have one already. We can
- // only hit the VAO-based path when using a core profile context. This is
- // because while non-core contexts can support VAOs via extensions, legacy
- // components like the QtOpenGL module do not know about VAOs. There are
- // still tests for QGL-QOpenGL paint engine interoperability, so keep the
- // status quo for now, and avoid introducing a VAO in non-core contexts.
- const bool needsVAO = d->ctx->format().profile() == QSurfaceFormat::CoreProfile
- && d->ctx->format().version() >= qMakePair(3, 2);
- if (needsVAO && !d->vao.isCreated()) {
- bool created = d->vao.create();
-
- // If we managed to create it then we have a profile that supports VAOs
- if (created) {
- d->vao.bind();
-
- // Generate a new Vertex Buffer Object if we don't have one already
- if (!d->vertexBuffer.isCreated()) {
- d->vertexBuffer.create();
- // Set its usage to StreamDraw, we will use this buffer only a few times before refilling it
- d->vertexBuffer.setUsagePattern(QOpenGLBuffer::StreamDraw);
- }
- if (!d->texCoordBuffer.isCreated()) {
- d->texCoordBuffer.create();
- d->texCoordBuffer.setUsagePattern(QOpenGLBuffer::StreamDraw);
- }
- if (!d->opacityBuffer.isCreated()) {
- d->opacityBuffer.create();
- d->opacityBuffer.setUsagePattern(QOpenGLBuffer::StreamDraw);
- }
- if (!d->indexBuffer.isCreated()) {
- d->indexBuffer.create();
- d->indexBuffer.setUsagePattern(QOpenGLBuffer::StreamDraw);
- }
- }
- }
-
- for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i)
- d->vertexAttributeArraysEnabledState[i] = false;
-
- const QSize sz = d->device->size();
- d->width = sz.width();
- d->height = sz.height();
- d->mode = BrushDrawingMode;
- d->brushTextureDirty = true;
- d->brushUniformsDirty = true;
- d->matrixUniformDirty = true;
- d->matrixDirty = true;
- d->compositionModeDirty = true;
- d->opacityUniformDirty = true;
- d->needsSync = true;
- d->useSystemClip = !systemClip().isEmpty();
- d->currentBrush = QBrush();
-
- d->dirtyStencilRegion = QRect(0, 0, d->width, d->height);
- d->stencilClean = true;
-
- d->shaderManager = new QOpenGLEngineShaderManager(d->ctx);
-
- d->funcs.glDisable(GL_STENCIL_TEST);
- d->funcs.glDisable(GL_DEPTH_TEST);
- d->funcs.glDisable(GL_SCISSOR_TEST);
-
- d->glyphCacheFormat = QFontEngine::Format_A8;
-
-#ifndef QT_OPENGL_ES_2
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- d->funcs.glDisable(GL_MULTISAMPLE);
- d->glyphCacheFormat = QFontEngine::Format_A32;
- d->multisamplingAlwaysEnabled = false;
- } else
-#endif // QT_OPENGL_ES_2
- {
- // OpenGL ES can't switch MSAA off, so if the gl paint device is
- // multisampled, it's always multisampled.
- d->multisamplingAlwaysEnabled = d->device->context()->format().samples() > 1;
- }
-
- return true;
-}
-
-bool QOpenGL2PaintEngineEx::end()
-{
- Q_D(QOpenGL2PaintEngineEx);
-
- QOpenGLPaintDevicePrivate::get(d->device)->endPaint();
-
- QOpenGLContext *ctx = d->ctx;
- d->funcs.glUseProgram(0);
- d->transferMode(BrushDrawingMode);
-
- ctx->d_func()->active_engine = nullptr;
-
- d->resetGLState();
-
- delete d->shaderManager;
- d->shaderManager = nullptr;
- d->currentBrush = QBrush();
-
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- if (!d->unusedVBOSToClean.isEmpty()) {
- glDeleteBuffers(d->unusedVBOSToClean.size(), d->unusedVBOSToClean.constData());
- d->unusedVBOSToClean.clear();
- }
- if (!d->unusedIBOSToClean.isEmpty()) {
- glDeleteBuffers(d->unusedIBOSToClean.size(), d->unusedIBOSToClean.constData());
- d->unusedIBOSToClean.clear();
- }
-#endif
-
- return false;
-}
-
-void QOpenGL2PaintEngineEx::ensureActive()
-{
- Q_D(QOpenGL2PaintEngineEx);
- QOpenGLContext *ctx = d->ctx;
-
- if (d->vao.isCreated())
- d->vao.bind();
-
- if (isActive() && ctx->d_func()->active_engine != this) {
- ctx->d_func()->active_engine = this;
- d->needsSync = true;
- }
-
- if (d->needsSync) {
- d->device->ensureActiveTarget();
-
- d->transferMode(BrushDrawingMode);
- d->funcs.glViewport(0, 0, d->width, d->height);
- d->needsSync = false;
- d->shaderManager->setDirty();
- d->syncGlState();
- for (int i = 0; i < 3; ++i)
- d->vertexAttribPointers[i] = (GLfloat*)-1; // Assume the pointers are clobbered
- setState(state());
- }
-}
-
-void QOpenGL2PaintEngineExPrivate::updateClipScissorTest()
-{
- Q_Q(QOpenGL2PaintEngineEx);
- if (q->state()->clipTestEnabled) {
- funcs.glEnable(GL_STENCIL_TEST);
- funcs.glStencilFunc(GL_LEQUAL, q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
- } else {
- funcs.glDisable(GL_STENCIL_TEST);
- funcs.glStencilFunc(GL_ALWAYS, 0, 0xff);
- }
-
-#ifdef QT_GL_NO_SCISSOR_TEST
- currentScissorBounds = QRect(0, 0, width, height);
-#else
- QRect bounds = q->state()->rectangleClip;
- if (!q->state()->clipEnabled) {
- if (useSystemClip)
- bounds = systemClip.boundingRect();
- else
- bounds = QRect(0, 0, width, height);
- } else {
- if (useSystemClip)
- bounds = bounds.intersected(systemClip.boundingRect());
- else
- bounds = bounds.intersected(QRect(0, 0, width, height));
- }
-
- currentScissorBounds = bounds;
-
- if (bounds == QRect(0, 0, width, height)) {
- funcs.glDisable(GL_SCISSOR_TEST);
- } else {
- funcs.glEnable(GL_SCISSOR_TEST);
- setScissor(bounds);
- }
-#endif
-}
-
-void QOpenGL2PaintEngineExPrivate::setScissor(const QRect &rect)
-{
- const int left = rect.left();
- const int width = rect.width();
- int bottom = height - (rect.top() + rect.height());
- if (device->paintFlipped()) {
- bottom = rect.top();
- }
- const int height = rect.height();
-
- funcs.glScissor(left, bottom, width, height);
-}
-
-void QOpenGL2PaintEngineEx::clipEnabledChanged()
-{
- Q_D(QOpenGL2PaintEngineEx);
-
- state()->clipChanged = true;
-
- if (painter()->hasClipping())
- d->regenerateClip();
- else
- d->systemStateChanged();
-}
-
-void QOpenGL2PaintEngineExPrivate::clearClip(uint value)
-{
- dirtyStencilRegion -= currentScissorBounds;
-
- funcs.glStencilMask(0xff);
- funcs.glClearStencil(value);
- funcs.glClear(GL_STENCIL_BUFFER_BIT);
- funcs.glStencilMask(0x0);
-
- q->state()->needsClipBufferClear = false;
-}
-
-void QOpenGL2PaintEngineExPrivate::writeClip(const QVectorPath &path, uint value)
-{
- transferMode(BrushDrawingMode);
-
- if (snapToPixelGrid) {
- snapToPixelGrid = false;
- matrixDirty = true;
- }
-
- if (matrixDirty)
- updateMatrix();
-
- stencilClean = false;
-
- const bool singlePass = !path.hasWindingFill()
- && (((q->state()->currentClip == maxClip - 1) && q->state()->clipTestEnabled)
- || q->state()->needsClipBufferClear);
- const uint referenceClipValue = q->state()->needsClipBufferClear ? 1 : q->state()->currentClip;
-
- if (q->state()->needsClipBufferClear)
- clearClip(1);
-
- if (path.isEmpty()) {
- funcs.glEnable(GL_STENCIL_TEST);
- funcs.glStencilFunc(GL_LEQUAL, value, ~GL_STENCIL_HIGH_BIT);
- return;
- }
-
- if (q->state()->clipTestEnabled)
- funcs.glStencilFunc(GL_LEQUAL, q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
- else
- funcs.glStencilFunc(GL_ALWAYS, 0, 0xff);
-
- vertexCoordinateArray.clear();
- vertexCoordinateArray.addPath(path, inverseScale, false);
-
- if (!singlePass)
- fillStencilWithVertexArray(vertexCoordinateArray, path.hasWindingFill());
-
- funcs.glColorMask(false, false, false, false);
- funcs.glEnable(GL_STENCIL_TEST);
- useSimpleShader();
-
- if (singlePass) {
- // Under these conditions we can set the new stencil value in a single
- // pass, by using the current value and the "new value" as the toggles
-
- funcs.glStencilFunc(GL_LEQUAL, referenceClipValue, ~GL_STENCIL_HIGH_BIT);
- funcs.glStencilOp(GL_KEEP, GL_INVERT, GL_INVERT);
- funcs.glStencilMask(value ^ referenceClipValue);
-
- drawVertexArrays(vertexCoordinateArray, GL_TRIANGLE_FAN);
- } else {
- funcs.glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
- funcs.glStencilMask(0xff);
-
- if (!q->state()->clipTestEnabled && path.hasWindingFill()) {
- // Pass when any clip bit is set, set high bit
- funcs.glStencilFunc(GL_NOTEQUAL, GL_STENCIL_HIGH_BIT, ~GL_STENCIL_HIGH_BIT);
- composite(vertexCoordinateArray.boundingRect());
- }
-
- // Pass when high bit is set, replace stencil value with new clip value
- funcs.glStencilFunc(GL_NOTEQUAL, value, GL_STENCIL_HIGH_BIT);
-
- composite(vertexCoordinateArray.boundingRect());
- }
-
- funcs.glStencilFunc(GL_LEQUAL, value, ~GL_STENCIL_HIGH_BIT);
- funcs.glStencilMask(0);
-
- funcs.glColorMask(true, true, true, true);
-}
-
-void QOpenGL2PaintEngineEx::clip(const QVectorPath &path, Qt::ClipOperation op)
-{
-// qDebug("QOpenGL2PaintEngineEx::clip()");
- Q_D(QOpenGL2PaintEngineEx);
-
- state()->clipChanged = true;
-
- ensureActive();
-
- if (op == Qt::ReplaceClip) {
- op = Qt::IntersectClip;
- if (d->hasClipOperations()) {
- d->systemStateChanged();
- state()->canRestoreClip = false;
- }
- }
-
-#ifndef QT_GL_NO_SCISSOR_TEST
- if (!path.isEmpty() && op == Qt::IntersectClip && (path.shape() == QVectorPath::RectangleHint)) {
- const QPointF* const points = reinterpret_cast<const QPointF*>(path.points());
- QRectF rect(points[0], points[2]);
-
- if (state()->matrix.type() <= QTransform::TxScale
- || (state()->matrix.type() == QTransform::TxRotate
- && qFuzzyIsNull(state()->matrix.m11())
- && qFuzzyIsNull(state()->matrix.m22())))
- {
- state()->rectangleClip = state()->rectangleClip.intersected(state()->matrix.mapRect(rect).toRect());
- d->updateClipScissorTest();
- return;
- }
- }
-#endif
-
- const QRect pathRect = state()->matrix.mapRect(path.controlPointRect()).toAlignedRect();
-
- switch (op) {
- case Qt::NoClip:
- if (d->useSystemClip) {
- state()->clipTestEnabled = true;
- state()->currentClip = 1;
- } else {
- state()->clipTestEnabled = false;
- }
- state()->rectangleClip = QRect(0, 0, d->width, d->height);
- state()->canRestoreClip = false;
- d->updateClipScissorTest();
- break;
- case Qt::IntersectClip:
- state()->rectangleClip = state()->rectangleClip.intersected(pathRect);
- d->updateClipScissorTest();
- d->resetClipIfNeeded();
- ++d->maxClip;
- d->writeClip(path, d->maxClip);
- state()->currentClip = d->maxClip;
- state()->clipTestEnabled = true;
- break;
- default:
- break;
- }
-}
-
-void QOpenGL2PaintEngineExPrivate::regenerateClip()
-{
- systemStateChanged();
- replayClipOperations();
-}
-
-void QOpenGL2PaintEngineExPrivate::systemStateChanged()
-{
- Q_Q(QOpenGL2PaintEngineEx);
-
- q->state()->clipChanged = true;
-
- if (systemClip.isEmpty()) {
- useSystemClip = false;
- } else {
- if (q->paintDevice()->devType() == QInternal::Widget && currentClipDevice) {
- //QWidgetPrivate *widgetPrivate = qt_widget_private(static_cast<QWidget *>(currentClipDevice)->window());
- //useSystemClip = widgetPrivate->extra && widgetPrivate->extra->inRenderWithPainter;
- useSystemClip = true;
- } else {
- useSystemClip = true;
- }
- }
-
- q->state()->clipTestEnabled = false;
- q->state()->needsClipBufferClear = true;
-
- q->state()->currentClip = 1;
- maxClip = 1;
-
- q->state()->rectangleClip = useSystemClip ? systemClip.boundingRect() : QRect(0, 0, width, height);
- updateClipScissorTest();
-
- if (systemClip.rectCount() == 1) {
- if (systemClip.boundingRect() == QRect(0, 0, width, height))
- useSystemClip = false;
-#ifndef QT_GL_NO_SCISSOR_TEST
- // scissoring takes care of the system clip
- return;
-#endif
- }
-
- if (useSystemClip) {
- clearClip(0);
-
- QPainterPath path;
- path.addRegion(systemClip);
-
- q->state()->currentClip = 0;
- writeClip(qtVectorPathForPath(q->state()->matrix.inverted().map(path)), 1);
- q->state()->currentClip = 1;
- q->state()->clipTestEnabled = true;
- }
-}
-
-void QOpenGL2PaintEngineEx::setState(QPainterState *new_state)
-{
- // qDebug("QOpenGL2PaintEngineEx::setState()");
-
- Q_D(QOpenGL2PaintEngineEx);
-
- QOpenGL2PaintEngineState *s = static_cast<QOpenGL2PaintEngineState *>(new_state);
- QOpenGL2PaintEngineState *old_state = state();
-
- QPaintEngineEx::setState(s);
-
- if (s->isNew) {
- // Newly created state object. The call to setState()
- // will either be followed by a call to begin(), or we are
- // setting the state as part of a save().
- s->isNew = false;
- return;
- }
-
- // Setting the state as part of a restore().
-
- if (old_state == s || old_state->renderHintsChanged)
- renderHintsChanged();
-
- if (old_state == s || old_state->matrixChanged)
- d->matrixDirty = true;
-
- if (old_state == s || old_state->compositionModeChanged)
- d->compositionModeDirty = true;
-
- if (old_state == s || old_state->opacityChanged)
- d->opacityUniformDirty = true;
-
- if (old_state == s || old_state->clipChanged) {
- if (old_state && old_state != s && old_state->canRestoreClip) {
- d->updateClipScissorTest();
- d->funcs.glDepthFunc(GL_LEQUAL);
- } else {
- d->regenerateClip();
- }
- }
-}
-
-QPainterState *QOpenGL2PaintEngineEx::createState(QPainterState *orig) const
-{
- if (orig)
- const_cast<QOpenGL2PaintEngineEx *>(this)->ensureActive();
-
- QOpenGL2PaintEngineState *s;
- if (!orig)
- s = new QOpenGL2PaintEngineState();
- else
- s = new QOpenGL2PaintEngineState(*static_cast<QOpenGL2PaintEngineState *>(orig));
-
- s->matrixChanged = false;
- s->compositionModeChanged = false;
- s->opacityChanged = false;
- s->renderHintsChanged = false;
- s->clipChanged = false;
-
- return s;
-}
-
-QOpenGL2PaintEngineState::QOpenGL2PaintEngineState(QOpenGL2PaintEngineState &other)
- : QPainterState(other)
-{
- isNew = true;
- needsClipBufferClear = other.needsClipBufferClear;
- clipTestEnabled = other.clipTestEnabled;
- currentClip = other.currentClip;
- canRestoreClip = other.canRestoreClip;
- rectangleClip = other.rectangleClip;
-}
-
-QOpenGL2PaintEngineState::QOpenGL2PaintEngineState()
-{
- isNew = true;
- needsClipBufferClear = true;
- clipTestEnabled = false;
- canRestoreClip = true;
-}
-
-QOpenGL2PaintEngineState::~QOpenGL2PaintEngineState()
-{
-}
-
-void QOpenGL2PaintEngineExPrivate::setVertexAttribArrayEnabled(int arrayIndex, bool enabled)
-{
- Q_ASSERT(arrayIndex < QT_GL_VERTEX_ARRAY_TRACKED_COUNT);
-
- if (vertexAttributeArraysEnabledState[arrayIndex] && !enabled)
- funcs.glDisableVertexAttribArray(arrayIndex);
-
- if (!vertexAttributeArraysEnabledState[arrayIndex] && enabled)
- funcs.glEnableVertexAttribArray(arrayIndex);
-
- vertexAttributeArraysEnabledState[arrayIndex] = enabled;
-}
-
-void QOpenGL2PaintEngineExPrivate::syncGlState()
-{
- for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i) {
- if (vertexAttributeArraysEnabledState[i])
- funcs.glEnableVertexAttribArray(i);
- else
- funcs.glDisableVertexAttribArray(i);
- }
-}
-
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglpaintengine_p.h b/src/gui/opengl/qopenglpaintengine_p.h
deleted file mode 100644
index 81f17572b2..0000000000
--- a/src/gui/opengl/qopenglpaintengine_p.h
+++ /dev/null
@@ -1,396 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLPAINTENGINE_P_H
-#define QOPENGLPAINTENGINE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtGui/private/qtguiglobal_p.h>
-#include <QDebug>
-
-#include <qopenglpaintdevice.h>
-
-#include <private/qpaintengineex_p.h>
-#include <private/qopenglengineshadermanager_p.h>
-#include <private/qopengl2pexvertexarray_p.h>
-#include <private/qfontengine_p.h>
-#include <private/qdatabuffer_p.h>
-#include <private/qtriangulatingstroker_p.h>
-
-#include <private/qopenglextensions_p.h>
-
-#include <QOpenGLVertexArrayObject>
-#include <QOpenGLBuffer>
-
-enum EngineMode {
- ImageDrawingMode,
- TextDrawingMode,
- BrushDrawingMode,
- ImageArrayDrawingMode,
- ImageOpacityArrayDrawingMode
-};
-
-QT_BEGIN_NAMESPACE
-
-#define GL_STENCIL_HIGH_BIT GLuint(0x80)
-#define QT_UNKNOWN_TEXTURE_UNIT GLuint(-1)
-#define QT_DEFAULT_TEXTURE_UNIT GLuint(0)
-#define QT_BRUSH_TEXTURE_UNIT GLuint(0)
-#define QT_IMAGE_TEXTURE_UNIT GLuint(0) //Can be the same as brush texture unit
-#define QT_MASK_TEXTURE_UNIT GLuint(1)
-#define QT_BACKGROUND_TEXTURE_UNIT GLuint(2)
-
-class QOpenGL2PaintEngineExPrivate;
-
-class QOpenGL2PaintEngineState : public QPainterState
-{
-public:
- QOpenGL2PaintEngineState(QOpenGL2PaintEngineState &other);
- QOpenGL2PaintEngineState();
- ~QOpenGL2PaintEngineState();
-
- uint isNew : 1;
- uint needsClipBufferClear : 1;
- uint clipTestEnabled : 1;
- uint canRestoreClip : 1;
- uint matrixChanged : 1;
- uint compositionModeChanged : 1;
- uint opacityChanged : 1;
- uint renderHintsChanged : 1;
- uint clipChanged : 1;
- uint currentClip : 8;
-
- QRect rectangleClip;
-};
-
-class Q_GUI_EXPORT QOpenGL2PaintEngineEx : public QPaintEngineEx
-{
- Q_DECLARE_PRIVATE(QOpenGL2PaintEngineEx)
-public:
- QOpenGL2PaintEngineEx();
- ~QOpenGL2PaintEngineEx();
-
- bool begin(QPaintDevice *device) override;
- void ensureActive();
- bool end() override;
-
- virtual void clipEnabledChanged() override;
- virtual void penChanged() override;
- virtual void brushChanged() override;
- virtual void brushOriginChanged() override;
- virtual void opacityChanged() override;
- virtual void compositionModeChanged() override;
- virtual void renderHintsChanged() override;
- virtual void transformChanged() override;
-
- virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) override;
- virtual void drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap,
- QPainter::PixmapFragmentHints hints) override;
- virtual void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
- Qt::ImageConversionFlags flags = Qt::AutoColor) override;
- virtual void drawTextItem(const QPointF &p, const QTextItem &textItem) override;
- virtual void fill(const QVectorPath &path, const QBrush &brush) override;
- virtual void stroke(const QVectorPath &path, const QPen &pen) override;
- virtual void clip(const QVectorPath &path, Qt::ClipOperation op) override;
-
- virtual void drawStaticTextItem(QStaticTextItem *textItem) override;
-
- bool drawTexture(const QRectF &r, GLuint textureId, const QSize &size, const QRectF &sr);
-
- Type type() const override { return OpenGL2; }
-
- virtual void setState(QPainterState *s) override;
- virtual QPainterState *createState(QPainterState *orig) const override;
- inline QOpenGL2PaintEngineState *state() {
- return static_cast<QOpenGL2PaintEngineState *>(QPaintEngineEx::state());
- }
- inline const QOpenGL2PaintEngineState *state() const {
- return static_cast<const QOpenGL2PaintEngineState *>(QPaintEngineEx::state());
- }
-
- void beginNativePainting() override;
- void endNativePainting() override;
-
- void invalidateState();
-
- void setRenderTextActive(bool);
-
- bool isNativePaintingActive() const;
- bool requiresPretransformedGlyphPositions(QFontEngine *, const QTransform &) const override { return false; }
- bool shouldDrawCachedGlyphs(QFontEngine *, const QTransform &) const override;
-
-private:
- Q_DISABLE_COPY_MOVE(QOpenGL2PaintEngineEx)
-
- friend class QOpenGLEngineShaderManager;
-};
-
-// This probably needs to grow to GL_MAX_VERTEX_ATTRIBS, but 3 is ok for now as that's
-// all the GL2 engine uses:
-#define QT_GL_VERTEX_ARRAY_TRACKED_COUNT 3
-
-class QOpenGL2PaintEngineExPrivate : public QPaintEngineExPrivate
-{
- Q_DECLARE_PUBLIC(QOpenGL2PaintEngineEx)
-public:
- enum StencilFillMode {
- OddEvenFillMode,
- WindingFillMode,
- TriStripStrokeFillMode
- };
-
- QOpenGL2PaintEngineExPrivate(QOpenGL2PaintEngineEx *q_ptr) :
- q(q_ptr),
- shaderManager(nullptr),
- width(0), height(0),
- ctx(nullptr),
- useSystemClip(true),
- elementIndicesVBOId(0),
- opacityArray(0),
- snapToPixelGrid(false),
- nativePaintingActive(false),
- inverseScale(1),
- lastTextureUnitUsed(QT_UNKNOWN_TEXTURE_UNIT),
- vertexBuffer(QOpenGLBuffer::VertexBuffer),
- texCoordBuffer(QOpenGLBuffer::VertexBuffer),
- opacityBuffer(QOpenGLBuffer::VertexBuffer),
- indexBuffer(QOpenGLBuffer::IndexBuffer)
- { }
-
- ~QOpenGL2PaintEngineExPrivate();
-
- void updateBrushTexture();
- void updateBrushUniforms();
- void updateMatrix();
- void updateCompositionMode();
-
- enum TextureUpdateMode { UpdateIfNeeded, ForceUpdate };
- template<typename T>
- void updateTexture(GLenum textureUnit, const T &texture, GLenum wrapMode, GLenum filterMode, TextureUpdateMode updateMode = UpdateIfNeeded);
- template<typename T>
- GLuint bindTexture(const T &texture);
- void activateTextureUnit(GLenum textureUnit);
-
- void resetGLState();
-
- // fill, stroke, drawTexture, drawPixmaps & drawCachedGlyphs are the main rendering entry-points,
- // however writeClip can also be thought of as en entry point as it does similar things.
- void fill(const QVectorPath &path);
- void stroke(const QVectorPath &path, const QPen &pen);
- void drawTexture(const QOpenGLRect& dest, const QOpenGLRect& src, const QSize &textureSize, bool opaque, bool pattern = false);
- void drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap,
- QPainter::PixmapFragmentHints hints);
- void drawCachedGlyphs(QFontEngine::GlyphFormat glyphFormat, QStaticTextItem *staticTextItem);
-
- // Calls glVertexAttributePointer if the pointer has changed
- inline void uploadData(unsigned int arrayIndex, const GLfloat *data, GLuint count);
- inline bool uploadIndexData(const void *data, GLenum indexValueType, GLuint count);
-
- // draws whatever is in the vertex array:
- void drawVertexArrays(const float *data, int *stops, int stopCount, GLenum primitive);
- void drawVertexArrays(QOpenGL2PEXVertexArray &vertexArray, GLenum primitive) {
- drawVertexArrays((const float *) vertexArray.data(), vertexArray.stops(), vertexArray.stopCount(), primitive);
- }
-
- // Composites the bounding rect onto dest buffer:
- void composite(const QOpenGLRect& boundingRect);
-
- // Calls drawVertexArrays to render into stencil buffer:
- void fillStencilWithVertexArray(const float *data, int count, int *stops, int stopCount, const QOpenGLRect &bounds, StencilFillMode mode);
- void fillStencilWithVertexArray(QOpenGL2PEXVertexArray& vertexArray, bool useWindingFill) {
- fillStencilWithVertexArray((const float *) vertexArray.data(), 0, vertexArray.stops(), vertexArray.stopCount(),
- vertexArray.boundingRect(),
- useWindingFill ? WindingFillMode : OddEvenFillMode);
- }
-
- void setBrush(const QBrush& brush);
- void transferMode(EngineMode newMode);
- bool prepareForDraw(bool srcPixelsAreOpaque); // returns true if the program has changed
- bool prepareForCachedGlyphDraw(const QFontEngineGlyphCache &cache);
- inline void useSimpleShader();
- inline GLuint location(const QOpenGLEngineShaderManager::Uniform uniform) {
- return shaderManager->getUniformLocation(uniform);
- }
-
- void clearClip(uint value);
- void writeClip(const QVectorPath &path, uint value);
- void resetClipIfNeeded();
-
- void updateClipScissorTest();
- void setScissor(const QRect &rect);
- void regenerateClip();
- void systemStateChanged() override;
-
- void setVertexAttribArrayEnabled(int arrayIndex, bool enabled = true);
- void syncGlState();
-
- static QOpenGLEngineShaderManager* shaderManagerForEngine(QOpenGL2PaintEngineEx *engine) { return engine->d_func()->shaderManager; }
- static QOpenGL2PaintEngineExPrivate *getData(QOpenGL2PaintEngineEx *engine) { return engine->d_func(); }
- static void cleanupVectorPath(QPaintEngineEx *engine, void *data);
-
- QOpenGLExtensions funcs;
-
- QOpenGL2PaintEngineEx* q;
- QOpenGLEngineShaderManager* shaderManager;
- QOpenGLPaintDevice* device;
- int width, height;
- QOpenGLContext *ctx;
- EngineMode mode;
- QFontEngine::GlyphFormat glyphCacheFormat;
-
- bool vertexAttributeArraysEnabledState[QT_GL_VERTEX_ARRAY_TRACKED_COUNT];
-
- // Dirty flags
- bool matrixDirty; // Implies matrix uniforms are also dirty
- bool compositionModeDirty;
- bool brushTextureDirty;
- bool brushUniformsDirty;
- bool opacityUniformDirty;
- bool matrixUniformDirty;
-
- bool stencilClean; // Has the stencil not been used for clipping so far?
- bool useSystemClip;
- QRegion dirtyStencilRegion;
- QRect currentScissorBounds;
- uint maxClip;
-
- QBrush currentBrush; // May not be the state's brush!
- const QBrush noBrush;
-
- QImage currentBrushImage;
-
- QOpenGL2PEXVertexArray vertexCoordinateArray;
- QOpenGL2PEXVertexArray textureCoordinateArray;
- QVector<GLushort> elementIndices;
- GLuint elementIndicesVBOId;
- QDataBuffer<GLfloat> opacityArray;
- GLfloat staticVertexCoordinateArray[8];
- GLfloat staticTextureCoordinateArray[8];
-
- bool snapToPixelGrid;
- bool nativePaintingActive;
- GLfloat pmvMatrix[3][3];
- GLfloat inverseScale;
-
- GLenum lastTextureUnitUsed;
- GLuint lastTextureUsed;
-
- QOpenGLVertexArrayObject vao;
- QOpenGLBuffer vertexBuffer;
- QOpenGLBuffer texCoordBuffer;
- QOpenGLBuffer opacityBuffer;
- QOpenGLBuffer indexBuffer;
-
- bool needsSync;
- bool multisamplingAlwaysEnabled;
-
- QTriangulatingStroker stroker;
- QDashedStrokeProcessor dasher;
-
- QVector<GLuint> unusedVBOSToClean;
- QVector<GLuint> unusedIBOSToClean;
-
- const GLfloat *vertexAttribPointers[3];
-};
-
-
-void QOpenGL2PaintEngineExPrivate::uploadData(unsigned int arrayIndex, const GLfloat *data, GLuint count)
-{
- Q_ASSERT(arrayIndex < 3);
-
- // If a vertex array object is created we have a profile that supports them
- // and we will upload the data via a QOpenGLBuffer. Otherwise we will use
- // the legacy way of uploading the data via glVertexAttribPointer.
- if (vao.isCreated()) {
- if (arrayIndex == QT_VERTEX_COORDS_ATTR) {
- vertexBuffer.bind();
- vertexBuffer.allocate(data, count * sizeof(float));
- }
- if (arrayIndex == QT_TEXTURE_COORDS_ATTR) {
- texCoordBuffer.bind();
- texCoordBuffer.allocate(data, count * sizeof(float));
- }
- if (arrayIndex == QT_OPACITY_ATTR) {
- opacityBuffer.bind();
- opacityBuffer.allocate(data, count * sizeof(float));
- }
- if (arrayIndex == QT_OPACITY_ATTR)
- funcs.glVertexAttribPointer(arrayIndex, 1, GL_FLOAT, GL_FALSE, 0, nullptr);
- else
- funcs.glVertexAttribPointer(arrayIndex, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
- } else {
- // If we already uploaded the data we don't have to do it again
- if (data == vertexAttribPointers[arrayIndex])
- return;
-
- // Store the data in cache and upload it to the graphics card.
- vertexAttribPointers[arrayIndex] = data;
- if (arrayIndex == QT_OPACITY_ATTR)
- funcs.glVertexAttribPointer(arrayIndex, 1, GL_FLOAT, GL_FALSE, 0, data);
- else
- funcs.glVertexAttribPointer(arrayIndex, 2, GL_FLOAT, GL_FALSE, 0, data);
- }
-}
-
-bool QOpenGL2PaintEngineExPrivate::uploadIndexData(const void *data, GLenum indexValueType, GLuint count)
-{
- // Follow the uploadData() logic: VBOs are used only when VAO support is available.
- // Otherwise the legacy client-side pointer path is used.
- if (vao.isCreated()) {
- Q_ASSERT(indexValueType == GL_UNSIGNED_SHORT || indexValueType == GL_UNSIGNED_INT);
- indexBuffer.bind();
- indexBuffer.allocate(data, count * (indexValueType == GL_UNSIGNED_SHORT ? sizeof(quint16) : sizeof(quint32)));
- return true;
- }
- return false;
-}
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/gui/opengl/qopenglpixeltransferoptions.cpp b/src/gui/opengl/qopenglpixeltransferoptions.cpp
deleted file mode 100644
index b0d953d76b..0000000000
--- a/src/gui/opengl/qopenglpixeltransferoptions.cpp
+++ /dev/null
@@ -1,263 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenglpixeltransferoptions.h"
-#include <QSharedData>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- * \class QOpenGLPixelTransferOptions
- *
- * \brief The QOpenGLPixelTransferOptions class describes the pixel storage
- * modes that affect the unpacking of pixels during texture upload.
- */
-
-/*!
- * \fn QOpenGLPixelTransferOptions & QOpenGLPixelTransferOptions::operator=(QOpenGLPixelTransferOptions &&other)
- * \internal
- */
-
-/*!
- * \fn void QOpenGLPixelTransferOptions::swap(QOpenGLPixelTransferOptions &other)
- * \internal
- */
-
-class QOpenGLPixelTransferOptionsData : public QSharedData
-{
-public:
- QOpenGLPixelTransferOptionsData()
- : alignment(4)
- , skipImages(0)
- , skipRows(0)
- , skipPixels(0)
- , imageHeight(0)
- , rowLength(0)
- , lsbFirst(false)
- , swapBytes(false)
- {}
-
- int alignment;
- int skipImages;
- int skipRows;
- int skipPixels;
- int imageHeight;
- int rowLength;
- bool lsbFirst;
- bool swapBytes;
-};
-
-/*!
- * Constructs a new QOpenGLPixelTransferOptions instance with the default settings.
- */
-QOpenGLPixelTransferOptions::QOpenGLPixelTransferOptions()
- : data(new QOpenGLPixelTransferOptionsData)
-{
-}
-
-/*!
- * \internal
- */
-QOpenGLPixelTransferOptions::QOpenGLPixelTransferOptions(const QOpenGLPixelTransferOptions &rhs)
- : data(rhs.data)
-{
-}
-
-/*!
- * \internal
- */
-QOpenGLPixelTransferOptions &QOpenGLPixelTransferOptions::operator=(const QOpenGLPixelTransferOptions &rhs)
-{
- if (this != &rhs)
- data.operator=(rhs.data);
- return *this;
-}
-
-/*!
- * Destructor.
- */
-QOpenGLPixelTransferOptions::~QOpenGLPixelTransferOptions()
-{
-}
-
-/*!
- * Sets the \a alignment requirements for each pixel row. Corresponds to \c GL_UNPACK_ALIGNMENT.
- * The default value is 4, as specified by OpenGL.
- */
-void QOpenGLPixelTransferOptions::setAlignment(int alignment)
-{
- data->alignment = alignment;
-}
-
-/*!
- * \return the current alignment requirement for each pixel row.
- */
-int QOpenGLPixelTransferOptions::alignment() const
-{
- return data->alignment;
-}
-
-/*!
- * Sets the number of images that are skipped to \a skipImages.
- * Corresponds to \c GL_UNPACK_SKIP_IMAGES. Equivalent to incrementing the pointer
- * passed to QOpenGLTexture::setData(). The default value is 0.
- */
-void QOpenGLPixelTransferOptions::setSkipImages(int skipImages)
-{
- data->skipImages = skipImages;
-}
-
-/*!
- * \return the number of images that are skipped.
- */
-int QOpenGLPixelTransferOptions::skipImages() const
-{
- return data->skipImages;
-}
-
-/*!
- * Sets the number of rows that are skipped to \a skipRows.
- * Corresponds to \c GL_UNPACK_SKIP_ROWS. Equivalent to incrementing the pointer
- * passed to QOpenGLTexture::setData(). The default value is 0.
- */
-void QOpenGLPixelTransferOptions::setSkipRows(int skipRows)
-{
- data->skipRows = skipRows;
-}
-
-/*!
- * \return the number of rows that are skipped.
- */
-int QOpenGLPixelTransferOptions::skipRows() const
-{
- return data->skipRows;
-}
-
-/*!
- * Sets the number of pixels that are skipped to \a skipPixels.
- * Corresponds to \c GL_UNPACK_SKIP_PIXELS. Equivalent to incrementing the pointer
- * passed to QOpenGLTexture::setData(). The default value is 0.
- */
-void QOpenGLPixelTransferOptions::setSkipPixels(int skipPixels)
-{
- data->skipPixels = skipPixels;
-}
-
-/*!
- * \return the number of pixels that are skipped.
- */
-int QOpenGLPixelTransferOptions::skipPixels() const
-{
- return data->skipPixels;
-}
-
-/*!
- * Sets the image height for 3D textures to \a imageHeight.
- * Corresponds to \c GL_UNPACK_IMAGE_HEIGHT.
- * The default value is 0.
- */
-void QOpenGLPixelTransferOptions::setImageHeight(int imageHeight)
-{
- data->imageHeight = imageHeight;
-}
-
-/*!
- * \return the currently set image height.
- */
-int QOpenGLPixelTransferOptions::imageHeight() const
-{
- return data->imageHeight;
-}
-
-/*!
- * Sets the number of pixels in a row to \a rowLength.
- * Corresponds to \c GL_UNPACK_ROW_LENGTH.
- * The default value is 0.
- */
-void QOpenGLPixelTransferOptions::setRowLength(int rowLength)
-{
- data->rowLength = rowLength;
-}
-
-/*!
- * \return the currently set row length.
- */
-int QOpenGLPixelTransferOptions::rowLength() const
-{
- return data->rowLength;
-}
-
-/*!
- * \a lsbFirst specifies if bits within a byte are ordered from least to most significat.
- * The default value is \c false, meaning that the first bit in each byte is the
- * most significant one. This is significant for bitmap data only.
- * Corresponds to \c GL_UNPACK_LSB_FIRST.
- */
-void QOpenGLPixelTransferOptions::setLeastSignificantByteFirst(bool lsbFirst)
-{
- data->lsbFirst = lsbFirst;
-}
-
-/*!
- * \return \c true if bits within a byte are ordered from least to most significant.
- */
-bool QOpenGLPixelTransferOptions::isLeastSignificantBitFirst() const
-{
- return data->lsbFirst;
-}
-
-/*!
- * \a swapBytes specifies if the byte ordering for multibyte components is reversed.
- * The default value is \c false.
- * Corresponds to \c GL_UNPACK_SWAP_BYTES.
- */
-void QOpenGLPixelTransferOptions::setSwapBytesEnabled(bool swapBytes)
-{
- data->swapBytes = swapBytes;
-}
-
-/*!
- * \return \c true if the byte ordering for multibyte components is reversed.
- */
-bool QOpenGLPixelTransferOptions::isSwapBytesEnabled() const
-{
- return data->swapBytes;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglpixeltransferoptions.h b/src/gui/opengl/qopenglpixeltransferoptions.h
deleted file mode 100644
index 195543ae90..0000000000
--- a/src/gui/opengl/qopenglpixeltransferoptions.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLPIXELUPLOADOPTIONS_H
-#define QOPENGLPIXELUPLOADOPTIONS_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL)
-
-#include <QtCore/QSharedDataPointer>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLPixelTransferOptionsData;
-
-class Q_GUI_EXPORT QOpenGLPixelTransferOptions
-{
-public:
- QOpenGLPixelTransferOptions();
- QOpenGLPixelTransferOptions(const QOpenGLPixelTransferOptions &);
- QOpenGLPixelTransferOptions &operator=(QOpenGLPixelTransferOptions &&other) noexcept
- { swap(other); return *this; }
- QOpenGLPixelTransferOptions &operator=(const QOpenGLPixelTransferOptions &);
- ~QOpenGLPixelTransferOptions();
-
- void swap(QOpenGLPixelTransferOptions &other) noexcept
- { data.swap(other.data); }
-
- void setAlignment(int alignment);
- int alignment() const;
-
- void setSkipImages(int skipImages);
- int skipImages() const;
-
- void setSkipRows(int skipRows);
- int skipRows() const;
-
- void setSkipPixels(int skipPixels);
- int skipPixels() const;
-
- void setImageHeight(int imageHeight);
- int imageHeight() const;
-
- void setRowLength(int rowLength);
- int rowLength() const;
-
- void setLeastSignificantByteFirst(bool lsbFirst);
- bool isLeastSignificantBitFirst() const;
-
- void setSwapBytesEnabled(bool swapBytes);
- bool isSwapBytesEnabled() const;
-
-private:
- QSharedDataPointer<QOpenGLPixelTransferOptionsData> data;
-};
-
-Q_DECLARE_SHARED(QOpenGLPixelTransferOptions)
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-
-#endif // QOPENGLPIXELUPLOADOPTIONS_H
diff --git a/src/gui/opengl/qopenglprogrambinarycache.cpp b/src/gui/opengl/qopenglprogrambinarycache.cpp
index 72bdacf43f..631c3d151b 100644
--- a/src/gui/opengl/qopenglprogrambinarycache.cpp
+++ b/src/gui/opengl/qopenglprogrambinarycache.cpp
@@ -45,7 +45,6 @@
#include <QDir>
#include <QSaveFile>
#include <QCoreApplication>
-#include <QLoggingCategory>
#include <QCryptographicHash>
#ifdef Q_OS_UNIX
@@ -191,7 +190,7 @@ bool QOpenGLProgramBinaryCache::setProgramBinary(uint programId, uint blobFormat
if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST)
break;
}
-#if defined(QT_OPENGL_ES_2)
+#if QT_CONFIG(opengles2)
if (context->isOpenGLES() && context->format().majorVersion() < 3) {
initializeProgramBinaryOES(context);
programBinaryOES(programId, blobFormat, p, blobSize);
@@ -413,7 +412,7 @@ void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId)
*p++ = 0;
GLint outSize = 0;
-#if defined(QT_OPENGL_ES_2)
+#if QT_CONFIG(opengles2)
if (context->isOpenGLES() && context->format().majorVersion() < 3) {
QMutexLocker lock(&m_mutex);
initializeProgramBinaryOES(context);
@@ -444,7 +443,7 @@ void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId)
}
}
-#if defined(QT_OPENGL_ES_2)
+#if QT_CONFIG(opengles2)
void QOpenGLProgramBinaryCache::initializeProgramBinaryOES(QOpenGLContext *context)
{
if (m_programBinaryOESInitialized)
diff --git a/src/gui/opengl/qopenglprogrambinarycache_p.h b/src/gui/opengl/qopenglprogrambinarycache_p.h
index f1cf24cd87..1642d6efab 100644
--- a/src/gui/opengl/qopenglprogrambinarycache_p.h
+++ b/src/gui/opengl/qopenglprogrambinarycache_p.h
@@ -54,6 +54,7 @@
#include <QtGui/qtguiglobal.h>
#include <QtCore/qcache.h>
#include <QtCore/qmutex.h>
+#include <QtCore/QLoggingCategory>
#include <QtGui/private/qopenglcontext_p.h>
#include <QtGui/private/qshader_p.h>
@@ -63,10 +64,12 @@ QT_BEGIN_NAMESPACE
// therefore stay independent from QOpenGLShader(Program). Must rely only on
// QOpenGLContext/Functions.
-class QOpenGLProgramBinaryCache
+Q_GUI_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcOpenGLProgramDiskCache)
+
+class Q_GUI_EXPORT QOpenGLProgramBinaryCache
{
public:
- struct ShaderDesc {
+ struct Q_GUI_EXPORT ShaderDesc {
ShaderDesc() { }
ShaderDesc(QShader::Stage stage, const QByteArray &source = QByteArray())
: stage(stage), source(source)
@@ -74,7 +77,7 @@ public:
QShader::Stage stage;
QByteArray source;
};
- struct ProgramDesc {
+ struct Q_GUI_EXPORT ProgramDesc {
QVector<ShaderDesc> shaders;
QByteArray cacheKey() const;
};
@@ -100,7 +103,7 @@ private:
uint format;
};
QCache<QByteArray, MemCacheEntry> m_memCache;
-#if defined(QT_OPENGL_ES_2)
+#if QT_CONFIG(opengles2)
void (QOPENGLF_APIENTRYP programBinaryOES)(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
void (QOPENGLF_APIENTRYP getProgramBinaryOES)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
void initializeProgramBinaryOES(QOpenGLContext *context);
@@ -114,7 +117,7 @@ private:
// per-context basis, not just once per process. QOpenGLSharedResource enables this,
// although it's once-per-sharing-context-group, not per-context. Still, this should
// be good enough in practice.
-class QOpenGLProgramBinarySupportCheck : public QOpenGLSharedResource
+class Q_GUI_EXPORT QOpenGLProgramBinarySupportCheck : public QOpenGLSharedResource
{
public:
QOpenGLProgramBinarySupportCheck(QOpenGLContext *context);
diff --git a/src/gui/opengl/qopenglqueryhelper_p.h b/src/gui/opengl/qopenglqueryhelper_p.h
deleted file mode 100644
index ad91ca9f96..0000000000
--- a/src/gui/opengl/qopenglqueryhelper_p.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLQUERYHELPER_P_H
-#define QOPENGLQUERYHELPER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtGui/private/qtguiglobal_p.h>
-
-#if !defined(QT_OPENGL_ES_2)
-
-#include <QtGui/QOpenGLContext>
-
-QT_BEGIN_NAMESPACE
-
-// Helper class used by QOpenGLTimerQuery and later will be used by
-// QOpenGLOcclusionQuery
-class QOpenGLQueryHelper
-{
-public:
- QOpenGLQueryHelper(QOpenGLContext *context)
- : GetQueryObjectuiv(nullptr),
- GetQueryObjectiv(nullptr),
- GetQueryiv(nullptr),
- EndQuery(nullptr),
- BeginQuery(nullptr),
- IsQuery(nullptr),
- DeleteQueries(nullptr),
- GenQueries(nullptr),
- GetInteger64v(nullptr),
- GetQueryObjectui64v(nullptr),
- GetQueryObjecti64v(nullptr),
- QueryCounter(nullptr)
- {
- Q_ASSERT(context);
-
- // Core in OpenGL >=1.5
- GetQueryObjectuiv = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLuint *)>(context->getProcAddress("glGetQueryObjectuiv"));
- GetQueryObjectiv = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint *)>(context->getProcAddress("glGetQueryObjectiv"));
- GetQueryiv = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLenum , GLint *)>(context->getProcAddress("glGetQueryiv"));
- EndQuery = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glEndQuery"));
- BeginQuery = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLuint )>(context->getProcAddress("glBeginQuery"));
- IsQuery = reinterpret_cast<GLboolean (QOPENGLF_APIENTRYP)(GLuint )>(context->getProcAddress("glIsQuery"));
- DeleteQueries = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , const GLuint *)>(context->getProcAddress("glDeleteQueries"));
- GenQueries = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , GLuint *)>(context->getProcAddress("glGenQueries"));
-
- // Core in OpenGL >=3.2
- GetInteger64v = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint64 *)>(context->getProcAddress("glGetInteger64v"));
-
- // Core in OpenGL >=3.3 / ARB_timer_query
- GetQueryObjectui64v = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLuint64 *)>(context->getProcAddress("glGetQueryObjectui64v"));
- GetQueryObjecti64v = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint64 *)>(context->getProcAddress("glGetQueryObjecti64v"));
- QueryCounter = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum )>(context->getProcAddress("glQueryCounter"));
- }
-
- inline void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
- {
- GetQueryObjectuiv(id, pname, params);
- }
-
- inline void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
- {
- GetQueryObjectiv(id, pname, params);
- }
-
- inline void glGetQueryiv(GLenum target, GLenum pname, GLint *params)
- {
- GetQueryiv(target, pname, params);
- }
-
- inline void glEndQuery(GLenum target)
- {
- EndQuery(target);
- }
-
- inline void glBeginQuery(GLenum target, GLuint id)
- {
- BeginQuery(target, id);
- }
-
- inline GLboolean glIsQuery(GLuint id)
- {
- return IsQuery(id);
- }
-
- inline void glDeleteQueries(GLsizei n, const GLuint *ids)
- {
- DeleteQueries(n, ids);
- }
-
- inline void glGenQueries(GLsizei n, GLuint *ids)
- {
- GenQueries(n, ids);
- }
-
- inline void glGetInteger64v(GLenum pname, GLint64 *params)
- {
- GetInteger64v(pname, params);
- }
-
- inline void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
- {
- GetQueryObjectui64v(id, pname, params);
- }
-
- inline void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
- {
- GetQueryObjecti64v(id, pname, params);
- }
-
- inline void glQueryCounter(GLuint id, GLenum target)
- {
- QueryCounter(id, target);
- }
-
-private:
- // Core in OpenGL >=1.5
- void (QOPENGLF_APIENTRYP GetQueryObjectuiv)(GLuint id, GLenum pname, GLuint *params);
- void (QOPENGLF_APIENTRYP GetQueryObjectiv)(GLuint id, GLenum pname, GLint *params);
- void (QOPENGLF_APIENTRYP GetQueryiv)(GLenum target, GLenum pname, GLint *params);
- void (QOPENGLF_APIENTRYP EndQuery)(GLenum target);
- void (QOPENGLF_APIENTRYP BeginQuery)(GLenum target, GLuint id);
- GLboolean (QOPENGLF_APIENTRYP IsQuery)(GLuint id);
- void (QOPENGLF_APIENTRYP DeleteQueries)(GLsizei n, const GLuint *ids);
- void (QOPENGLF_APIENTRYP GenQueries)(GLsizei n, GLuint *ids);
-
- // Core in OpenGL >=3.2
- void (QOPENGLF_APIENTRYP GetInteger64v)(GLenum pname, GLint64 *params);
-
- // Core in OpenGL >=3.3 and provided by ARB_timer_query
- void (QOPENGLF_APIENTRYP GetQueryObjectui64v)(GLuint id, GLenum pname, GLuint64 *params);
- void (QOPENGLF_APIENTRYP GetQueryObjecti64v)(GLuint id, GLenum pname, GLint64 *params);
- void (QOPENGLF_APIENTRYP QueryCounter)(GLuint id, GLenum target);
-};
-
-QT_END_NAMESPACE
-
-#endif
-
-#endif // QOPENGLQUERYHELPER_P_H
diff --git a/src/gui/opengl/qopenglshadercache_p.h b/src/gui/opengl/qopenglshadercache_p.h
deleted file mode 100644
index 0f730602b0..0000000000
--- a/src/gui/opengl/qopenglshadercache_p.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QOPENGLSHADERCACHE_P_H
-#define QOPENGLSHADERCACHE_P_H
-
-#include <QtGui/private/qtguiglobal_p.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QOpenGLShaderProgram;
-class QOpenGLContext;
-
-class CachedShader
-{
-public:
- inline CachedShader(const QByteArray &, const QByteArray &)
- {}
-
- inline bool isCached()
- {
- return false;
- }
-
- inline bool load(QOpenGLShaderProgram *, QOpenGLContext *)
- {
- return false;
- }
-
- inline bool store(QOpenGLShaderProgram *, QOpenGLContext *)
- {
- return false;
- }
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/gui/opengl/qopenglshaderprogram.cpp b/src/gui/opengl/qopenglshaderprogram.cpp
deleted file mode 100644
index 7e89d9c8d4..0000000000
--- a/src/gui/opengl/qopenglshaderprogram.cpp
+++ /dev/null
@@ -1,3812 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenglshaderprogram.h"
-#include "qopenglprogrambinarycache_p.h"
-#include "qopenglextrafunctions.h"
-#include "private/qopenglcontext_p.h"
-#include <QtCore/private/qobject_p.h>
-#include <QtCore/qdebug.h>
-#include <QtCore/qfile.h>
-#include <QtCore/qvarlengtharray.h>
-#include <QtCore/qvector.h>
-#include <QtCore/qloggingcategory.h>
-#include <QtGui/qtransform.h>
-#include <QtGui/QColor>
-#include <QtGui/QSurfaceFormat>
-
-#if !defined(QT_OPENGL_ES_2)
-#include <QtGui/qopenglfunctions_4_0_core.h>
-#endif
-
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLShaderProgram
- \brief The QOpenGLShaderProgram class allows OpenGL shader programs to be linked and used.
- \since 5.0
- \ingroup painting-3D
- \inmodule QtGui
-
- \section1 Introduction
-
- This class supports shader programs written in the OpenGL Shading
- Language (GLSL) and in the OpenGL/ES Shading Language (GLSL/ES).
-
- QOpenGLShader and QOpenGLShaderProgram shelter the programmer from the details of
- compiling and linking vertex and fragment shaders.
-
- The following example creates a vertex shader program using the
- supplied source \c{code}. Once compiled and linked, the shader
- program is activated in the current QOpenGLContext by calling
- QOpenGLShaderProgram::bind():
-
- \snippet code/src_gui_qopenglshaderprogram.cpp 0
-
- \section1 Writing Portable Shaders
-
- Shader programs can be difficult to reuse across OpenGL implementations
- because of varying levels of support for standard vertex attributes and
- uniform variables. In particular, GLSL/ES lacks all of the
- standard variables that are present on desktop OpenGL systems:
- \c{gl_Vertex}, \c{gl_Normal}, \c{gl_Color}, and so on. Desktop OpenGL
- lacks the variable qualifiers \c{highp}, \c{mediump}, and \c{lowp}.
-
- The QOpenGLShaderProgram class makes the process of writing portable shaders
- easier by prefixing all shader programs with the following lines on
- desktop OpenGL:
-
- \code
- #define highp
- #define mediump
- #define lowp
- \endcode
-
- This makes it possible to run most GLSL/ES shader programs
- on desktop systems. The programmer should restrict themselves
- to just features that are present in GLSL/ES, and avoid
- standard variable names that only work on the desktop.
-
- \section1 Simple Shader Example
-
- \snippet code/src_gui_qopenglshaderprogram.cpp 1
-
- With the above shader program active, we can draw a green triangle
- as follows:
-
- \snippet code/src_gui_qopenglshaderprogram.cpp 2
-
- \section1 Binary Shaders and Programs
-
- Binary shaders may be specified using \c{glShaderBinary()} on
- the return value from QOpenGLShader::shaderId(). The QOpenGLShader instance
- containing the binary can then be added to the shader program with
- addShader() and linked in the usual fashion with link().
-
- Binary programs may be specified using \c{glProgramBinaryOES()}
- on the return value from programId(). Then the application should
- call link(), which will notice that the program has already been
- specified and linked, allowing other operations to be performed
- on the shader program. The shader program's id can be explicitly
- created using the create() function.
-
- \section2 Caching Program Binaries
-
- As of Qt 5.9, support for caching program binaries on disk is built in. To
- enable this, switch to using addCacheableShaderFromSourceCode() and
- addCacheableShaderFromSourceFile(). With an OpenGL ES 3.x context or support
- for \c{GL_ARB_get_program_binary}, this will transparently cache program
- binaries under QStandardPaths::GenericCacheLocation or
- QStandardPaths::CacheLocation. When support is not available, calling the
- cacheable function variants is equivalent to the normal ones.
-
- \note Some drivers do not have any binary formats available, even though
- they advertise the extension or offer OpenGL ES 3.0. In this case program
- binary support will be disabled.
-
- \sa QOpenGLShader
-*/
-
-/*!
- \class QOpenGLShader
- \brief The QOpenGLShader class allows OpenGL shaders to be compiled.
- \since 5.0
- \ingroup painting-3D
- \inmodule QtGui
-
- This class supports shaders written in the OpenGL Shading Language (GLSL)
- and in the OpenGL/ES Shading Language (GLSL/ES).
-
- QOpenGLShader and QOpenGLShaderProgram shelter the programmer from the details of
- compiling and linking vertex and fragment shaders.
-
- \sa QOpenGLShaderProgram
-*/
-
-/*!
- \enum QOpenGLShader::ShaderTypeBit
- This enum specifies the type of QOpenGLShader that is being created.
-
- \value Vertex Vertex shader written in the OpenGL Shading Language (GLSL).
- \value Fragment Fragment shader written in the OpenGL Shading Language (GLSL).
- \value Geometry Geometry shaders written in the OpenGL Shading Language (GLSL)
- (requires OpenGL >= 3.2 or OpenGL ES >= 3.2).
- \value TessellationControl Tessellation control shaders written in the OpenGL
- shading language (GLSL) (requires OpenGL >= 4.0 or OpenGL ES >= 3.2).
- \value TessellationEvaluation Tessellation evaluation shaders written in the OpenGL
- shading language (GLSL) (requires OpenGL >= 4.0 or OpenGL ES >= 3.2).
- \value Compute Compute shaders written in the OpenGL shading language (GLSL)
- (requires OpenGL >= 4.3 or OpenGL ES >= 3.1).
-*/
-
-Q_DECLARE_LOGGING_CATEGORY(lcOpenGLProgramDiskCache)
-
-// For GLES 3.1/3.2
-#ifndef GL_GEOMETRY_SHADER
-#define GL_GEOMETRY_SHADER 0x8DD9
-#endif
-#ifndef GL_TESS_CONTROL_SHADER
-#define GL_TESS_CONTROL_SHADER 0x8E88
-#endif
-#ifndef GL_TESS_EVALUATION_SHADER
-#define GL_TESS_EVALUATION_SHADER 0x8E87
-#endif
-#ifndef GL_COMPUTE_SHADER
-#define GL_COMPUTE_SHADER 0x91B9
-#endif
-#ifndef GL_MAX_GEOMETRY_OUTPUT_VERTICES
-#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0
-#endif
-#ifndef GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS
-#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
-#endif
-#ifndef GL_PATCH_VERTICES
-#define GL_PATCH_VERTICES 0x8E72
-#endif
-#ifndef GL_PATCH_DEFAULT_OUTER_LEVEL
-#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74
-#endif
-#ifndef GL_PATCH_DEFAULT_INNER_LEVEL
-#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73
-#endif
-
-#ifndef QT_OPENGL_ES_2
-static inline bool isFormatGLES(const QSurfaceFormat &f)
-{
- return (f.renderableType() == QSurfaceFormat::OpenGLES);
-}
-#endif
-
-static inline bool supportsGeometry(const QSurfaceFormat &f)
-{
- return f.version() >= qMakePair(3, 2);
-}
-
-static inline bool supportsCompute(const QSurfaceFormat &f)
-{
-#ifndef QT_OPENGL_ES_2
- if (!isFormatGLES(f))
- return f.version() >= qMakePair(4, 3);
- else
- return f.version() >= qMakePair(3, 1);
-#else
- return f.version() >= qMakePair(3, 1);
-#endif
-}
-
-static inline bool supportsTessellation(const QSurfaceFormat &f)
-{
-#ifndef QT_OPENGL_ES_2
- if (!isFormatGLES(f))
- return f.version() >= qMakePair(4, 0);
- else
- return f.version() >= qMakePair(3, 2);
-#else
- return f.version() >= qMakePair(3, 2);
-#endif
-}
-
-class QOpenGLShaderPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QOpenGLShader)
-public:
- QOpenGLShaderPrivate(QOpenGLContext *ctx, QOpenGLShader::ShaderType type)
- : shaderGuard(nullptr)
- , shaderType(type)
- , compiled(false)
- , glfuncs(new QOpenGLExtraFunctions(ctx))
- , supportsGeometryShaders(false)
- , supportsTessellationShaders(false)
- , supportsComputeShaders(false)
- {
- if (shaderType & QOpenGLShader::Geometry)
- supportsGeometryShaders = supportsGeometry(ctx->format());
- else if (shaderType & (QOpenGLShader::TessellationControl | QOpenGLShader::TessellationEvaluation))
- supportsTessellationShaders = supportsTessellation(ctx->format());
- else if (shaderType & QOpenGLShader::Compute)
- supportsComputeShaders = supportsCompute(ctx->format());
- }
- ~QOpenGLShaderPrivate();
-
- QOpenGLSharedResourceGuard *shaderGuard;
- QOpenGLShader::ShaderType shaderType;
- bool compiled;
- QString log;
-
- QOpenGLExtraFunctions *glfuncs;
-
- // Support for geometry shaders
- bool supportsGeometryShaders;
- // Support for tessellation shaders
- bool supportsTessellationShaders;
- // Support for compute shaders
- bool supportsComputeShaders;
-
-
- bool create();
- bool compile(QOpenGLShader *q);
- void deleteShader();
-};
-
-namespace {
- void freeShaderFunc(QOpenGLFunctions *funcs, GLuint id)
- {
- funcs->glDeleteShader(id);
- }
-}
-
-QOpenGLShaderPrivate::~QOpenGLShaderPrivate()
-{
- delete glfuncs;
- if (shaderGuard)
- shaderGuard->free();
-}
-
-bool QOpenGLShaderPrivate::create()
-{
- QOpenGLContext *context = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
- if (!context)
- return false;
- GLuint shader = 0;
- if (shaderType == QOpenGLShader::Vertex) {
- shader = glfuncs->glCreateShader(GL_VERTEX_SHADER);
- } else if (shaderType == QOpenGLShader::Geometry && supportsGeometryShaders) {
- shader = glfuncs->glCreateShader(GL_GEOMETRY_SHADER);
- } else if (shaderType == QOpenGLShader::TessellationControl && supportsTessellationShaders) {
- shader = glfuncs->glCreateShader(GL_TESS_CONTROL_SHADER);
- } else if (shaderType == QOpenGLShader::TessellationEvaluation && supportsTessellationShaders) {
- shader = glfuncs->glCreateShader(GL_TESS_EVALUATION_SHADER);
- } else if (shaderType == QOpenGLShader::Compute && supportsComputeShaders) {
- shader = glfuncs->glCreateShader(GL_COMPUTE_SHADER);
- } else if (shaderType == QOpenGLShader::Fragment) {
- shader = glfuncs->glCreateShader(GL_FRAGMENT_SHADER);
- }
- if (!shader) {
- qWarning("QOpenGLShader: could not create shader");
- return false;
- }
- shaderGuard = new QOpenGLSharedResourceGuard(context, shader, freeShaderFunc);
- return true;
-}
-
-bool QOpenGLShaderPrivate::compile(QOpenGLShader *q)
-{
- GLuint shader = shaderGuard ? shaderGuard->id() : 0;
- if (!shader)
- return false;
-
- // Try to compile shader
- glfuncs->glCompileShader(shader);
- GLint value = 0;
-
- // Get compilation status
- glfuncs->glGetShaderiv(shader, GL_COMPILE_STATUS, &value);
- compiled = (value != 0);
-
- if (!compiled) {
- // Compilation failed, try to provide some information about the failure
- QString name = q->objectName();
-
- const char *types[] = {
- "Fragment",
- "Vertex",
- "Geometry",
- "Tessellation Control",
- "Tessellation Evaluation",
- "Compute",
- ""
- };
-
- const char *type = types[6];
- switch (shaderType) {
- case QOpenGLShader::Fragment:
- type = types[0]; break;
- case QOpenGLShader::Vertex:
- type = types[1]; break;
- case QOpenGLShader::Geometry:
- type = types[2]; break;
- case QOpenGLShader::TessellationControl:
- type = types[3]; break;
- case QOpenGLShader::TessellationEvaluation:
- type = types[4]; break;
- case QOpenGLShader::Compute:
- type = types[5]; break;
- }
-
- // Get info and source code lengths
- GLint infoLogLength = 0;
- GLint sourceCodeLength = 0;
- char *logBuffer = nullptr;
- char *sourceCodeBuffer = nullptr;
-
- // Get the compilation info log
- glfuncs->glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
-
- if (infoLogLength > 1) {
- GLint temp;
- logBuffer = new char [infoLogLength];
- glfuncs->glGetShaderInfoLog(shader, infoLogLength, &temp, logBuffer);
- }
-
- // Get the source code
- glfuncs->glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &sourceCodeLength);
-
- if (sourceCodeLength > 1) {
- GLint temp;
- sourceCodeBuffer = new char [sourceCodeLength];
- glfuncs->glGetShaderSource(shader, sourceCodeLength, &temp, sourceCodeBuffer);
- }
-
- if (logBuffer)
- log = QString::fromLatin1(logBuffer);
- else
- log = QLatin1String("failed");
-
- if (name.isEmpty())
- qWarning("QOpenGLShader::compile(%s): %s", type, qPrintable(log));
- else
- qWarning("QOpenGLShader::compile(%s)[%s]: %s", type, qPrintable(name), qPrintable(log));
-
- // Dump the source code if we got it
- if (sourceCodeBuffer) {
- qWarning("*** Problematic %s shader source code ***\n"
- "%ls\n"
- "***",
- type, qUtf16Printable(QString::fromLatin1(sourceCodeBuffer)));
- }
-
- // Cleanup
- delete [] logBuffer;
- delete [] sourceCodeBuffer;
- }
-
- return compiled;
-}
-
-void QOpenGLShaderPrivate::deleteShader()
-{
- if (shaderGuard) {
- shaderGuard->free();
- shaderGuard = nullptr;
- }
-}
-
-/*!
- Constructs a new QOpenGLShader object of the specified \a type
- and attaches it to \a parent. If shader programs are not supported,
- QOpenGLShaderProgram::hasOpenGLShaderPrograms() will return false.
-
- This constructor is normally followed by a call to compileSourceCode()
- or compileSourceFile().
-
- The shader will be associated with the current QOpenGLContext.
-
- \sa compileSourceCode(), compileSourceFile()
-*/
-QOpenGLShader::QOpenGLShader(QOpenGLShader::ShaderType type, QObject *parent)
- : QObject(*new QOpenGLShaderPrivate(QOpenGLContext::currentContext(), type), parent)
-{
- Q_D(QOpenGLShader);
- d->create();
-}
-
-/*!
- Deletes this shader. If the shader has been attached to a
- QOpenGLShaderProgram object, then the actual shader will stay around
- until the QOpenGLShaderProgram is destroyed.
-*/
-QOpenGLShader::~QOpenGLShader()
-{
-}
-
-/*!
- Returns the type of this shader.
-*/
-QOpenGLShader::ShaderType QOpenGLShader::shaderType() const
-{
- Q_D(const QOpenGLShader);
- return d->shaderType;
-}
-
-static const char qualifierDefines[] =
- "#define lowp\n"
- "#define mediump\n"
- "#define highp\n";
-
-#if defined(QT_OPENGL_ES) && !defined(QT_OPENGL_FORCE_SHADER_DEFINES)
-// The "highp" qualifier doesn't exist in fragment shaders
-// on all ES platforms. When it doesn't exist, use "mediump".
-#define QOpenGL_REDEFINE_HIGHP 1
-static const char redefineHighp[] =
- "#ifndef GL_FRAGMENT_PRECISION_HIGH\n"
- "#define highp mediump\n"
- "#endif\n";
-#endif
-
-// Boiler-plate header to have the layout attributes available we need later
-static const char blendEquationAdvancedHeader[] =
- "#ifdef GL_KHR_blend_equation_advanced\n"
- "#extension GL_ARB_fragment_coord_conventions : enable\n"
- "#extension GL_KHR_blend_equation_advanced : enable\n"
- "#endif\n";
-
-struct QVersionDirectivePosition
-{
- Q_DECL_CONSTEXPR QVersionDirectivePosition(int position = 0, int line = -1)
- : position(position)
- , line(line)
- {
- }
-
- Q_DECL_CONSTEXPR bool hasPosition() const
- {
- return position > 0;
- }
-
- const int position;
- const int line;
-};
-
-static QVersionDirectivePosition findVersionDirectivePosition(const char *source)
-{
- Q_ASSERT(source);
-
- // According to the GLSL spec the #version directive must not be
- // preceded by anything but whitespace and comments.
- // In order to not get confused by #version directives within a
- // multiline comment, we need to do some minimal comment parsing
- // while searching for the directive.
- enum {
- Normal,
- StartOfLine,
- PreprocessorDirective,
- CommentStarting,
- MultiLineComment,
- SingleLineComment,
- CommentEnding
- } state = StartOfLine;
-
- const char *c = source;
- while (*c) {
- switch (state) {
- case PreprocessorDirective:
- if (*c == ' ' || *c == '\t')
- break;
- if (!strncmp(c, "version", strlen("version"))) {
- // Found version directive
- c += strlen("version");
- while (*c && *c != '\n')
- ++c;
- int splitPosition = c - source + 1;
- int linePosition = int(std::count(source, c, '\n')) + 1;
- return QVersionDirectivePosition(splitPosition, linePosition);
- } else if (*c == '/')
- state = CommentStarting;
- else if (*c == '\n')
- state = StartOfLine;
- else
- state = Normal;
- break;
- case StartOfLine:
- if (*c == ' ' || *c == '\t')
- break;
- else if (*c == '#') {
- state = PreprocessorDirective;
- break;
- }
- state = Normal;
- Q_FALLTHROUGH();
- case Normal:
- if (*c == '/')
- state = CommentStarting;
- else if (*c == '\n')
- state = StartOfLine;
- break;
- case CommentStarting:
- if (*c == '*')
- state = MultiLineComment;
- else if (*c == '/')
- state = SingleLineComment;
- else
- state = Normal;
- break;
- case MultiLineComment:
- if (*c == '*')
- state = CommentEnding;
- break;
- case SingleLineComment:
- if (*c == '\n')
- state = Normal;
- break;
- case CommentEnding:
- if (*c == '/')
- state = Normal;
- else if (*c != QLatin1Char('*'))
- state = MultiLineComment;
- break;
- }
- ++c;
- }
-
- return QVersionDirectivePosition(0, 1);
-}
-
-/*!
- Sets the \a source code for this shader and compiles it.
- Returns \c true if the source was successfully compiled, false otherwise.
-
- \sa compileSourceFile()
-*/
-bool QOpenGLShader::compileSourceCode(const char *source)
-{
- Q_D(QOpenGLShader);
- // This method breaks the shader code into two parts:
- // 1. Up to and including an optional #version directive.
- // 2. The rest.
- // If a #version directive exists, qualifierDefines and redefineHighp
- // are inserted after. Otherwise they are inserted right at the start.
- // In both cases a #line directive is appended in order to compensate
- // for line number changes in case of compiler errors.
-
- if (d->shaderGuard && d->shaderGuard->id() && source) {
- const QVersionDirectivePosition versionDirectivePosition = findVersionDirectivePosition(source);
-
- QVarLengthArray<const char *, 5> sourceChunks;
- QVarLengthArray<GLint, 5> sourceChunkLengths;
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
-
- if (versionDirectivePosition.hasPosition()) {
- // Append source up to and including the #version directive
- sourceChunks.append(source);
- sourceChunkLengths.append(GLint(versionDirectivePosition.position));
- } else {
- // QTBUG-55733: Intel on Windows with Compatibility profile requires a #version always
- if (ctx->format().profile() == QSurfaceFormat::CompatibilityProfile) {
- const char *vendor = reinterpret_cast<const char *>(ctx->functions()->glGetString(GL_VENDOR));
- if (vendor && !strcmp(vendor, "Intel")) {
- static const char version110[] = "#version 110\n";
- sourceChunks.append(version110);
- sourceChunkLengths.append(GLint(sizeof(version110)) - 1);
- }
- }
- }
- if (d->shaderType == Fragment) {
- sourceChunks.append(blendEquationAdvancedHeader);
- sourceChunkLengths.append(GLint(sizeof(blendEquationAdvancedHeader) - 1));
- }
-
- // The precision qualifiers are useful on OpenGL/ES systems,
- // but usually not present on desktop systems.
- const QSurfaceFormat currentSurfaceFormat = ctx->format();
- QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(QOpenGLContext::currentContext());
- if (currentSurfaceFormat.renderableType() == QSurfaceFormat::OpenGL
- || ctx_d->workaround_missingPrecisionQualifiers
-#ifdef QT_OPENGL_FORCE_SHADER_DEFINES
- || true
-#endif
- ) {
- sourceChunks.append(qualifierDefines);
- sourceChunkLengths.append(GLint(sizeof(qualifierDefines) - 1));
- }
-
-#ifdef QOpenGL_REDEFINE_HIGHP
- if (d->shaderType == Fragment && !ctx_d->workaround_missingPrecisionQualifiers
- && QOpenGLContext::currentContext()->isOpenGLES()) {
- sourceChunks.append(redefineHighp);
- sourceChunkLengths.append(GLint(sizeof(redefineHighp) - 1));
- }
-#endif
-
- QByteArray lineDirective;
- // #line is rejected by some drivers:
- // "2.1 Mesa 8.1-devel (git-48a3d4e)" or "MESA 2.1 Mesa 8.1-devel"
- const char *version = reinterpret_cast<const char *>(ctx->functions()->glGetString(GL_VERSION));
- if (!version || !strstr(version, "2.1 Mesa 8")) {
- // Append #line directive in order to compensate for text insertion
- lineDirective = QStringLiteral("#line %1\n").arg(versionDirectivePosition.line).toUtf8();
- sourceChunks.append(lineDirective.constData());
- sourceChunkLengths.append(GLint(lineDirective.length()));
- }
-
- // Append rest of shader code
- sourceChunks.append(source + versionDirectivePosition.position);
- sourceChunkLengths.append(GLint(qstrlen(source + versionDirectivePosition.position)));
-
- d->glfuncs->glShaderSource(d->shaderGuard->id(), sourceChunks.size(), sourceChunks.data(), sourceChunkLengths.data());
- return d->compile(this);
- } else {
- return false;
- }
-}
-
-/*!
- \overload
-
- Sets the \a source code for this shader and compiles it.
- Returns \c true if the source was successfully compiled, false otherwise.
-
- \sa compileSourceFile()
-*/
-bool QOpenGLShader::compileSourceCode(const QByteArray& source)
-{
- return compileSourceCode(source.constData());
-}
-
-/*!
- \overload
-
- Sets the \a source code for this shader and compiles it.
- Returns \c true if the source was successfully compiled, false otherwise.
-
- \sa compileSourceFile()
-*/
-bool QOpenGLShader::compileSourceCode(const QString& source)
-{
- return compileSourceCode(source.toLatin1().constData());
-}
-
-/*!
- Sets the source code for this shader to the contents of \a fileName
- and compiles it. Returns \c true if the file could be opened and the
- source compiled, false otherwise.
-
- \sa compileSourceCode()
-*/
-bool QOpenGLShader::compileSourceFile(const QString& fileName)
-{
- QFile file(fileName);
- if (!file.open(QFile::ReadOnly)) {
- qWarning() << "QOpenGLShader: Unable to open file" << fileName;
- return false;
- }
-
- QByteArray contents = file.readAll();
- return compileSourceCode(contents.constData());
-}
-
-/*!
- Returns the source code for this shader.
-
- \sa compileSourceCode()
-*/
-QByteArray QOpenGLShader::sourceCode() const
-{
- Q_D(const QOpenGLShader);
- GLuint shader = d->shaderGuard ? d->shaderGuard->id() : 0;
- if (!shader)
- return QByteArray();
- GLint size = 0;
- d->glfuncs->glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &size);
- if (size <= 0)
- return QByteArray();
- GLint len = 0;
- char *source = new char [size];
- d->glfuncs->glGetShaderSource(shader, size, &len, source);
- QByteArray src(source);
- delete [] source;
- return src;
-}
-
-/*!
- Returns \c true if this shader has been compiled; false otherwise.
-
- \sa compileSourceCode(), compileSourceFile()
-*/
-bool QOpenGLShader::isCompiled() const
-{
- Q_D(const QOpenGLShader);
- return d->compiled;
-}
-
-/*!
- Returns the errors and warnings that occurred during the last compile.
-
- \sa compileSourceCode(), compileSourceFile()
-*/
-QString QOpenGLShader::log() const
-{
- Q_D(const QOpenGLShader);
- return d->log;
-}
-
-/*!
- Returns the OpenGL identifier associated with this shader.
-
- \sa QOpenGLShaderProgram::programId()
-*/
-GLuint QOpenGLShader::shaderId() const
-{
- Q_D(const QOpenGLShader);
- return d->shaderGuard ? d->shaderGuard->id() : 0;
-}
-
-class QOpenGLShaderProgramPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QOpenGLShaderProgram)
-public:
- QOpenGLShaderProgramPrivate()
- : programGuard(nullptr)
- , linked(false)
- , inited(false)
- , removingShaders(false)
- , glfuncs(new QOpenGLExtraFunctions)
-#ifndef QT_OPENGL_ES_2
- , tessellationFuncs(nullptr)
-#endif
- , linkBinaryRecursion(false)
- {
- }
- ~QOpenGLShaderProgramPrivate();
-
- QOpenGLSharedResourceGuard *programGuard;
- bool linked;
- bool inited;
- bool removingShaders;
-
- QString log;
- QList<QOpenGLShader *> shaders;
- QList<QOpenGLShader *> anonShaders;
-
- QOpenGLExtraFunctions *glfuncs;
-#ifndef QT_OPENGL_ES_2
- // for tessellation features not in GLES 3.2
- QOpenGLFunctions_4_0_Core *tessellationFuncs;
-#endif
-
- bool hasShader(QOpenGLShader::ShaderType type) const;
-
- QOpenGLProgramBinaryCache::ProgramDesc binaryProgram;
- bool isCacheDisabled() const;
- bool compileCacheable();
- bool linkBinary();
-
- bool linkBinaryRecursion;
-};
-
-namespace {
- void freeProgramFunc(QOpenGLFunctions *funcs, GLuint id)
- {
- funcs->glDeleteProgram(id);
- }
-}
-
-
-QOpenGLShaderProgramPrivate::~QOpenGLShaderProgramPrivate()
-{
- delete glfuncs;
- if (programGuard)
- programGuard->free();
-}
-
-bool QOpenGLShaderProgramPrivate::hasShader(QOpenGLShader::ShaderType type) const
-{
- for (QOpenGLShader *shader : shaders) {
- if (shader->shaderType() == type)
- return true;
- }
- return false;
-}
-
-/*!
- Constructs a new shader program and attaches it to \a parent.
- The program will be invalid until addShader() is called.
-
- The shader program will be associated with the current QOpenGLContext.
-
- \sa addShader()
-*/
-QOpenGLShaderProgram::QOpenGLShaderProgram(QObject *parent)
- : QObject(*new QOpenGLShaderProgramPrivate, parent)
-{
-}
-
-/*!
- Deletes this shader program.
-*/
-QOpenGLShaderProgram::~QOpenGLShaderProgram()
-{
-}
-
-/*!
- Requests the shader program's id to be created immediately. Returns \c true
- if successful; \c false otherwise.
-
- This function is primarily useful when combining QOpenGLShaderProgram
- with other OpenGL functions that operate directly on the shader
- program id, like \c {GL_OES_get_program_binary}.
-
- When the shader program is used normally, the shader program's id will
- be created on demand.
-
- \sa programId()
-
- \since 5.3
- */
-bool QOpenGLShaderProgram::create()
-{
- return init();
-}
-
-bool QOpenGLShaderProgram::init()
-{
- Q_D(QOpenGLShaderProgram);
- if ((d->programGuard && d->programGuard->id()) || d->inited)
- return true;
- d->inited = true;
- QOpenGLContext *context = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
- if (!context)
- return false;
- d->glfuncs->initializeOpenGLFunctions();
-
-#ifndef QT_OPENGL_ES_2
- if (!context->isOpenGLES() && context->format().version() >= qMakePair(4, 0)) {
- d->tessellationFuncs = context->versionFunctions<QOpenGLFunctions_4_0_Core>();
- d->tessellationFuncs->initializeOpenGLFunctions();
- }
-#endif
-
- GLuint program = d->glfuncs->glCreateProgram();
- if (!program) {
- qWarning("QOpenGLShaderProgram: could not create shader program");
- return false;
- }
- if (d->programGuard)
- delete d->programGuard;
- d->programGuard = new QOpenGLSharedResourceGuard(context, program, freeProgramFunc);
- return true;
-}
-
-/*!
- Adds a compiled \a shader to this shader program. Returns \c true
- if the shader could be added, or false otherwise.
-
- Ownership of the \a shader object remains with the caller.
- It will not be deleted when this QOpenGLShaderProgram instance
- is deleted. This allows the caller to add the same shader
- to multiple shader programs.
-
- \sa addShaderFromSourceCode(), addShaderFromSourceFile()
- \sa removeShader(), link(), removeAllShaders()
-*/
-bool QOpenGLShaderProgram::addShader(QOpenGLShader *shader)
-{
- Q_D(QOpenGLShaderProgram);
- if (!init())
- return false;
- if (d->shaders.contains(shader))
- return true; // Already added to this shader program.
- if (d->programGuard && d->programGuard->id() && shader) {
- if (!shader->d_func()->shaderGuard || !shader->d_func()->shaderGuard->id())
- return false;
- if (d->programGuard->group() != shader->d_func()->shaderGuard->group()) {
- qWarning("QOpenGLShaderProgram::addShader: Program and shader are not associated with same context.");
- return false;
- }
- d->glfuncs->glAttachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
- d->linked = false; // Program needs to be relinked.
- d->shaders.append(shader);
- connect(shader, SIGNAL(destroyed()), this, SLOT(shaderDestroyed()));
- return true;
- } else {
- return false;
- }
-}
-
-/*!
- Compiles \a source as a shader of the specified \a type and
- adds it to this shader program. Returns \c true if compilation
- was successful, false otherwise. The compilation errors
- and warnings will be made available via log().
-
- This function is intended to be a short-cut for quickly
- adding vertex and fragment shaders to a shader program without
- creating an instance of QOpenGLShader first.
-
- \sa addShader(), addShaderFromSourceFile()
- \sa removeShader(), link(), log(), removeAllShaders()
-*/
-bool QOpenGLShaderProgram::addShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source)
-{
- Q_D(QOpenGLShaderProgram);
- if (!init())
- return false;
- QOpenGLShader *shader = new QOpenGLShader(type, this);
- if (!shader->compileSourceCode(source)) {
- d->log = shader->log();
- delete shader;
- return false;
- }
- d->anonShaders.append(shader);
- return addShader(shader);
-}
-
-/*!
- \overload
-
- Compiles \a source as a shader of the specified \a type and
- adds it to this shader program. Returns \c true if compilation
- was successful, false otherwise. The compilation errors
- and warnings will be made available via log().
-
- This function is intended to be a short-cut for quickly
- adding vertex and fragment shaders to a shader program without
- creating an instance of QOpenGLShader first.
-
- \sa addShader(), addShaderFromSourceFile()
- \sa removeShader(), link(), log(), removeAllShaders()
-*/
-bool QOpenGLShaderProgram::addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray& source)
-{
- return addShaderFromSourceCode(type, source.constData());
-}
-
-/*!
- \overload
-
- Compiles \a source as a shader of the specified \a type and
- adds it to this shader program. Returns \c true if compilation
- was successful, false otherwise. The compilation errors
- and warnings will be made available via log().
-
- This function is intended to be a short-cut for quickly
- adding vertex and fragment shaders to a shader program without
- creating an instance of QOpenGLShader first.
-
- \sa addShader(), addShaderFromSourceFile()
- \sa removeShader(), link(), log(), removeAllShaders()
-*/
-bool QOpenGLShaderProgram::addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString& source)
-{
- return addShaderFromSourceCode(type, source.toLatin1().constData());
-}
-
-/*!
- Compiles the contents of \a fileName as a shader of the specified
- \a type and adds it to this shader program. Returns \c true if
- compilation was successful, false otherwise. The compilation errors
- and warnings will be made available via log().
-
- This function is intended to be a short-cut for quickly
- adding vertex and fragment shaders to a shader program without
- creating an instance of QOpenGLShader first.
-
- \sa addShader(), addShaderFromSourceCode()
-*/
-bool QOpenGLShaderProgram::addShaderFromSourceFile
- (QOpenGLShader::ShaderType type, const QString& fileName)
-{
- Q_D(QOpenGLShaderProgram);
- if (!init())
- return false;
- QOpenGLShader *shader = new QOpenGLShader(type, this);
- if (!shader->compileSourceFile(fileName)) {
- d->log = shader->log();
- delete shader;
- return false;
- }
- d->anonShaders.append(shader);
- return addShader(shader);
-}
-
-/*!
- Registers the shader of the specified \a type and \a source to this
- program. Unlike addShaderFromSourceCode(), this function does not perform
- compilation. Compilation is deferred to link(), and may not happen at all,
- because link() may potentially use a program binary from Qt's shader disk
- cache. This will typically lead to a significant increase in performance.
-
- \return true if the shader has been registered or, in the non-cached case,
- compiled successfully; false if there was an error. The compilation error
- messages can be retrieved via log().
-
- When the disk cache is disabled, via Qt::AA_DisableShaderDiskCache for
- example, or the OpenGL context has no support for context binaries, calling
- this function is equivalent to addShaderFromSourceCode().
-
- \since 5.9
- \sa addShaderFromSourceCode(), addCacheableShaderFromSourceFile()
- */
-bool QOpenGLShaderProgram::addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source)
-{
- Q_D(QOpenGLShaderProgram);
- if (!init())
- return false;
- if (d->isCacheDisabled())
- return addShaderFromSourceCode(type, source);
-
- return addCacheableShaderFromSourceCode(type, QByteArray(source));
-}
-
-static inline QShader::Stage qt_shaderTypeToStage(QOpenGLShader::ShaderType type)
-{
- switch (type) {
- case QOpenGLShader::Vertex:
- return QShader::VertexStage;
- case QOpenGLShader::Fragment:
- return QShader::FragmentStage;
- case QOpenGLShader::Geometry:
- return QShader::GeometryStage;
- case QOpenGLShader::TessellationControl:
- return QShader::TessellationControlStage;
- case QOpenGLShader::TessellationEvaluation:
- return QShader::TessellationEvaluationStage;
- case QOpenGLShader::Compute:
- return QShader::ComputeStage;
- }
- return QShader::VertexStage;
-}
-
-static inline QOpenGLShader::ShaderType qt_shaderStageToType(QShader::Stage stage)
-{
- switch (stage) {
- case QShader::VertexStage:
- return QOpenGLShader::Vertex;
- case QShader::TessellationControlStage:
- return QOpenGLShader::TessellationControl;
- case QShader::TessellationEvaluationStage:
- return QOpenGLShader::TessellationEvaluation;
- case QShader::GeometryStage:
- return QOpenGLShader::Geometry;
- case QShader::FragmentStage:
- return QOpenGLShader::Fragment;
- case QShader::ComputeStage:
- return QOpenGLShader::Compute;
- }
- return QOpenGLShader::Vertex;
-}
-
-/*!
- \overload
-
- Registers the shader of the specified \a type and \a source to this
- program. Unlike addShaderFromSourceCode(), this function does not perform
- compilation. Compilation is deferred to link(), and may not happen at all,
- because link() may potentially use a program binary from Qt's shader disk
- cache. This will typically lead to a significant increase in performance.
-
- \return true if the shader has been registered or, in the non-cached case,
- compiled successfully; false if there was an error. The compilation error
- messages can be retrieved via log().
-
- When the disk cache is disabled, via Qt::AA_DisableShaderDiskCache for
- example, or the OpenGL context has no support for context binaries, calling
- this function is equivalent to addShaderFromSourceCode().
-
- \since 5.9
- \sa addShaderFromSourceCode(), addCacheableShaderFromSourceFile()
- */
-bool QOpenGLShaderProgram::addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray &source)
-{
- Q_D(QOpenGLShaderProgram);
- if (!init())
- return false;
- if (d->isCacheDisabled())
- return addShaderFromSourceCode(type, source);
-
- d->binaryProgram.shaders.append(QOpenGLProgramBinaryCache::ShaderDesc(qt_shaderTypeToStage(type), source));
- return true;
-}
-
-/*!
- \overload
-
- Registers the shader of the specified \a type and \a source to this
- program. Unlike addShaderFromSourceCode(), this function does not perform
- compilation. Compilation is deferred to link(), and may not happen at all,
- because link() may potentially use a program binary from Qt's shader disk
- cache. This will typically lead to a significant increase in performance.
-
- When the disk cache is disabled, via Qt::AA_DisableShaderDiskCache for
- example, or the OpenGL context has no support for context binaries, calling
- this function is equivalent to addShaderFromSourceCode().
-
- \since 5.9
- \sa addShaderFromSourceCode(), addCacheableShaderFromSourceFile()
- */
-bool QOpenGLShaderProgram::addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString &source)
-{
- Q_D(QOpenGLShaderProgram);
- if (!init())
- return false;
- if (d->isCacheDisabled())
- return addShaderFromSourceCode(type, source);
-
- return addCacheableShaderFromSourceCode(type, source.toUtf8().constData());
-}
-
-/*!
- Registers the shader of the specified \a type and \a fileName to this
- program. Unlike addShaderFromSourceFile(), this function does not perform
- compilation. Compilation is deferred to link(), and may not happen at all,
- because link() may potentially use a program binary from Qt's shader disk
- cache. This will typically lead to a significant increase in performance.
-
- \return true if the file has been read successfully, false if the file could
- not be opened or the normal, non-cached compilation of the shader has
- failed. The compilation error messages can be retrieved via log().
-
- When the disk cache is disabled, via Qt::AA_DisableShaderDiskCache for
- example, or the OpenGL context has no support for context binaries, calling
- this function is equivalent to addShaderFromSourceFile().
-
- \since 5.9
- \sa addShaderFromSourceFile(), addCacheableShaderFromSourceCode()
- */
-bool QOpenGLShaderProgram::addCacheableShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString &fileName)
-{
- Q_D(QOpenGLShaderProgram);
- if (!init())
- return false;
- if (d->isCacheDisabled())
- return addShaderFromSourceFile(type, fileName);
-
- QOpenGLProgramBinaryCache::ShaderDesc shader(qt_shaderTypeToStage(type));
- // NB! It could be tempting to defer reading the file contents and just
- // hash the filename as the cache key, perhaps combined with last-modified
- // timestamp checks. However, this would raise a number of issues (no
- // timestamps for files in the resource system; preference for global, not
- // per-application cache items (where filenames may clash); resource-based
- // shaders from libraries like Qt Quick; etc.), so just avoid it.
- QFile f(fileName);
- if (f.open(QIODevice::ReadOnly | QIODevice::Text)) {
- shader.source = f.readAll();
- f.close();
- } else {
- qWarning("QOpenGLShaderProgram: Unable to open file %s", qPrintable(fileName));
- return false;
- }
- d->binaryProgram.shaders.append(shader);
- return true;
-}
-
-/*!
- Removes \a shader from this shader program. The object is not deleted.
-
- The shader program must be valid in the current QOpenGLContext.
-
- \sa addShader(), link(), removeAllShaders()
-*/
-void QOpenGLShaderProgram::removeShader(QOpenGLShader *shader)
-{
- Q_D(QOpenGLShaderProgram);
- if (d->programGuard && d->programGuard->id()
- && shader && shader->d_func()->shaderGuard)
- {
- d->glfuncs->glDetachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
- }
- d->linked = false; // Program needs to be relinked.
- if (shader) {
- d->shaders.removeAll(shader);
- d->anonShaders.removeAll(shader);
- disconnect(shader, SIGNAL(destroyed()), this, SLOT(shaderDestroyed()));
- }
-}
-
-/*!
- Returns a list of all shaders that have been added to this shader
- program using addShader().
-
- \sa addShader(), removeShader()
-*/
-QList<QOpenGLShader *> QOpenGLShaderProgram::shaders() const
-{
- Q_D(const QOpenGLShaderProgram);
- return d->shaders;
-}
-
-/*!
- Removes all of the shaders that were added to this program previously.
- The QOpenGLShader objects for the shaders will not be deleted if they
- were constructed externally. QOpenGLShader objects that are constructed
- internally by QOpenGLShaderProgram will be deleted.
-
- \sa addShader(), removeShader()
-*/
-void QOpenGLShaderProgram::removeAllShaders()
-{
- Q_D(QOpenGLShaderProgram);
- d->removingShaders = true;
- for (QOpenGLShader *shader : qAsConst(d->shaders)) {
- if (d->programGuard && d->programGuard->id()
- && shader && shader->d_func()->shaderGuard)
- {
- d->glfuncs->glDetachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
- }
- }
- // Delete shader objects that were created anonymously.
- qDeleteAll(d->anonShaders);
- d->shaders.clear();
- d->anonShaders.clear();
- d->binaryProgram = QOpenGLProgramBinaryCache::ProgramDesc();
- d->linked = false; // Program needs to be relinked.
- d->removingShaders = false;
-}
-
-/*!
- Links together the shaders that were added to this program with
- addShader(). Returns \c true if the link was successful or
- false otherwise. If the link failed, the error messages can
- be retrieved with log().
-
- Subclasses can override this function to initialize attributes
- and uniform variables for use in specific shader programs.
-
- If the shader program was already linked, calling this
- function again will force it to be re-linked.
-
- When shaders were added to this program via
- addCacheableShaderFromSourceCode() or addCacheableShaderFromSourceFile(),
- program binaries are supported, and a cached binary is available on disk,
- actual compilation and linking are skipped. Instead, link() will initialize
- the program with the binary blob via glProgramBinary(). If there is no
- cached version of the program or it was generated with a different driver
- version, the shaders will be compiled from source and the program will get
- linked normally. This allows seamless upgrading of the graphics drivers,
- without having to worry about potentially incompatible binary formats.
-
- \sa addShader(), log()
-*/
-bool QOpenGLShaderProgram::link()
-{
- Q_D(QOpenGLShaderProgram);
- GLuint program = d->programGuard ? d->programGuard->id() : 0;
- if (!program)
- return false;
-
- if (!d->linkBinaryRecursion && d->shaders.isEmpty() && !d->binaryProgram.shaders.isEmpty())
- return d->linkBinary();
-
- GLint value;
- if (d->shaders.isEmpty()) {
- // If there are no explicit shaders, then it is possible that the
- // application added a program binary with glProgramBinaryOES(), or
- // otherwise populated the shaders itself. This is also the case when
- // we are recursively called back from linkBinary() after a successful
- // glProgramBinary(). Check to see if the program is already linked and
- // bail out if so.
- value = 0;
- d->glfuncs->glGetProgramiv(program, GL_LINK_STATUS, &value);
- d->linked = (value != 0);
- if (d->linked)
- return true;
- }
-
- d->glfuncs->glLinkProgram(program);
- value = 0;
- d->glfuncs->glGetProgramiv(program, GL_LINK_STATUS, &value);
- d->linked = (value != 0);
- value = 0;
- d->glfuncs->glGetProgramiv(program, GL_INFO_LOG_LENGTH, &value);
- d->log = QString();
- if (value > 1) {
- char *logbuf = new char [value];
- GLint len;
- d->glfuncs->glGetProgramInfoLog(program, value, &len, logbuf);
- d->log = QString::fromLatin1(logbuf);
- if (!d->linked && !d->linkBinaryRecursion) {
- QString name = objectName();
- if (name.isEmpty())
- qWarning("QOpenGLShader::link: %ls", qUtf16Printable(d->log));
- else
- qWarning("QOpenGLShader::link[%ls]: %ls", qUtf16Printable(name), qUtf16Printable(d->log));
- }
- delete [] logbuf;
- }
- return d->linked;
-}
-
-/*!
- Returns \c true if this shader program has been linked; false otherwise.
-
- \sa link()
-*/
-bool QOpenGLShaderProgram::isLinked() const
-{
- Q_D(const QOpenGLShaderProgram);
- return d->linked;
-}
-
-/*!
- Returns the errors and warnings that occurred during the last link()
- or addShader() with explicitly specified source code.
-
- \sa link()
-*/
-QString QOpenGLShaderProgram::log() const
-{
- Q_D(const QOpenGLShaderProgram);
- return d->log;
-}
-
-/*!
- Binds this shader program to the active QOpenGLContext and makes
- it the current shader program. Any previously bound shader program
- is released. This is equivalent to calling \c{glUseProgram()} on
- programId(). Returns \c true if the program was successfully bound;
- false otherwise. If the shader program has not yet been linked,
- or it needs to be re-linked, this function will call link().
-
- \sa link(), release()
-*/
-bool QOpenGLShaderProgram::bind()
-{
- Q_D(QOpenGLShaderProgram);
- GLuint program = d->programGuard ? d->programGuard->id() : 0;
- if (!program)
- return false;
- if (!d->linked && !link())
- return false;
-#ifndef QT_NO_DEBUG
- if (d->programGuard->group() != QOpenGLContextGroup::currentContextGroup()) {
- qWarning("QOpenGLShaderProgram::bind: program is not valid in the current context.");
- return false;
- }
-#endif
- d->glfuncs->glUseProgram(program);
- return true;
-}
-
-/*!
- Releases the active shader program from the current QOpenGLContext.
- This is equivalent to calling \c{glUseProgram(0)}.
-
- \sa bind()
-*/
-void QOpenGLShaderProgram::release()
-{
- Q_D(QOpenGLShaderProgram);
-#ifndef QT_NO_DEBUG
- if (d->programGuard && d->programGuard->group() != QOpenGLContextGroup::currentContextGroup())
- qWarning("QOpenGLShaderProgram::release: program is not valid in the current context.");
-#endif
- d->glfuncs->glUseProgram(0);
-}
-
-/*!
- Returns the OpenGL identifier associated with this shader program.
-
- \sa QOpenGLShader::shaderId()
-*/
-GLuint QOpenGLShaderProgram::programId() const
-{
- Q_D(const QOpenGLShaderProgram);
- GLuint id = d->programGuard ? d->programGuard->id() : 0;
- if (id)
- return id;
-
- // Create the identifier if we don't have one yet. This is for
- // applications that want to create the attached shader configuration
- // themselves, particularly those using program binaries.
- if (!const_cast<QOpenGLShaderProgram *>(this)->init())
- return 0;
- return d->programGuard ? d->programGuard->id() : 0;
-}
-
-/*!
- Binds the attribute \a name to the specified \a location. This
- function can be called before or after the program has been linked.
- Any attributes that have not been explicitly bound when the program
- is linked will be assigned locations automatically.
-
- When this function is called after the program has been linked,
- the program will need to be relinked for the change to take effect.
-
- \sa attributeLocation()
-*/
-void QOpenGLShaderProgram::bindAttributeLocation(const char *name, int location)
-{
- Q_D(QOpenGLShaderProgram);
- if (!init() || !d->programGuard || !d->programGuard->id())
- return;
- d->glfuncs->glBindAttribLocation(d->programGuard->id(), location, name);
- d->linked = false; // Program needs to be relinked.
-}
-
-/*!
- \overload
-
- Binds the attribute \a name to the specified \a location. This
- function can be called before or after the program has been linked.
- Any attributes that have not been explicitly bound when the program
- is linked will be assigned locations automatically.
-
- When this function is called after the program has been linked,
- the program will need to be relinked for the change to take effect.
-
- \sa attributeLocation()
-*/
-void QOpenGLShaderProgram::bindAttributeLocation(const QByteArray& name, int location)
-{
- bindAttributeLocation(name.constData(), location);
-}
-
-/*!
- \overload
-
- Binds the attribute \a name to the specified \a location. This
- function can be called before or after the program has been linked.
- Any attributes that have not been explicitly bound when the program
- is linked will be assigned locations automatically.
-
- When this function is called after the program has been linked,
- the program will need to be relinked for the change to take effect.
-
- \sa attributeLocation()
-*/
-void QOpenGLShaderProgram::bindAttributeLocation(const QString& name, int location)
-{
- bindAttributeLocation(name.toLatin1().constData(), location);
-}
-
-/*!
- Returns the location of the attribute \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- attribute for this shader program.
-
- \sa uniformLocation(), bindAttributeLocation()
-*/
-int QOpenGLShaderProgram::attributeLocation(const char *name) const
-{
- Q_D(const QOpenGLShaderProgram);
- if (d->linked && d->programGuard && d->programGuard->id()) {
- return d->glfuncs->glGetAttribLocation(d->programGuard->id(), name);
- } else {
- qWarning("QOpenGLShaderProgram::attributeLocation(%s): shader program is not linked", name);
- return -1;
- }
-}
-
-/*!
- \overload
-
- Returns the location of the attribute \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- attribute for this shader program.
-
- \sa uniformLocation(), bindAttributeLocation()
-*/
-int QOpenGLShaderProgram::attributeLocation(const QByteArray& name) const
-{
- return attributeLocation(name.constData());
-}
-
-/*!
- \overload
-
- Returns the location of the attribute \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- attribute for this shader program.
-
- \sa uniformLocation(), bindAttributeLocation()
-*/
-int QOpenGLShaderProgram::attributeLocation(const QString& name) const
-{
- return attributeLocation(name.toLatin1().constData());
-}
-
-/*!
- Sets the attribute at \a location in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(int location, GLfloat value)
-{
- Q_D(QOpenGLShaderProgram);
- if (location != -1)
- d->glfuncs->glVertexAttrib1fv(location, &value);
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(const char *name, GLfloat value)
-{
- setAttributeValue(attributeLocation(name), value);
-}
-
-/*!
- Sets the attribute at \a location in the current context to
- the 2D vector (\a x, \a y).
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(int location, GLfloat x, GLfloat y)
-{
- Q_D(QOpenGLShaderProgram);
- if (location != -1) {
- GLfloat values[2] = {x, y};
- d->glfuncs->glVertexAttrib2fv(location, values);
- }
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to
- the 2D vector (\a x, \a y).
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(const char *name, GLfloat x, GLfloat y)
-{
- setAttributeValue(attributeLocation(name), x, y);
-}
-
-/*!
- Sets the attribute at \a location in the current context to
- the 3D vector (\a x, \a y, \a z).
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue
- (int location, GLfloat x, GLfloat y, GLfloat z)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[3] = {x, y, z};
- d->glfuncs->glVertexAttrib3fv(location, values);
- }
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to
- the 3D vector (\a x, \a y, \a z).
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue
- (const char *name, GLfloat x, GLfloat y, GLfloat z)
-{
- setAttributeValue(attributeLocation(name), x, y, z);
-}
-
-/*!
- Sets the attribute at \a location in the current context to
- the 4D vector (\a x, \a y, \a z, \a w).
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue
- (int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- Q_D(QOpenGLShaderProgram);
- if (location != -1) {
- GLfloat values[4] = {x, y, z, w};
- d->glfuncs->glVertexAttrib4fv(location, values);
- }
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to
- the 4D vector (\a x, \a y, \a z, \a w).
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue
- (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- setAttributeValue(attributeLocation(name), x, y, z, w);
-}
-
-/*!
- Sets the attribute at \a location in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(int location, const QVector2D& value)
-{
- Q_D(QOpenGLShaderProgram);
- if (location != -1)
- d->glfuncs->glVertexAttrib2fv(location, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(const char *name, const QVector2D& value)
-{
- setAttributeValue(attributeLocation(name), value);
-}
-
-/*!
- Sets the attribute at \a location in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(int location, const QVector3D& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glVertexAttrib3fv(location, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(const char *name, const QVector3D& value)
-{
- setAttributeValue(attributeLocation(name), value);
-}
-
-/*!
- Sets the attribute at \a location in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(int location, const QVector4D& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glVertexAttrib4fv(location, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(const char *name, const QVector4D& value)
-{
- setAttributeValue(attributeLocation(name), value);
-}
-
-/*!
- Sets the attribute at \a location in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(int location, const QColor& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(value.redF()), GLfloat(value.greenF()),
- GLfloat(value.blueF()), GLfloat(value.alphaF())};
- d->glfuncs->glVertexAttrib4fv(location, values);
- }
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue(const char *name, const QColor& value)
-{
- setAttributeValue(attributeLocation(name), value);
-}
-
-/*!
- Sets the attribute at \a location in the current context to the
- contents of \a values, which contains \a columns elements, each
- consisting of \a rows elements. The \a rows value should be
- 1, 2, 3, or 4. This function is typically used to set matrix
- values and column vectors.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue
- (int location, const GLfloat *values, int columns, int rows)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (rows < 1 || rows > 4) {
- qWarning("QOpenGLShaderProgram::setAttributeValue: rows %d not supported", rows);
- return;
- }
- if (location != -1) {
- while (columns-- > 0) {
- if (rows == 1)
- d->glfuncs->glVertexAttrib1fv(location, values);
- else if (rows == 2)
- d->glfuncs->glVertexAttrib2fv(location, values);
- else if (rows == 3)
- d->glfuncs->glVertexAttrib3fv(location, values);
- else
- d->glfuncs->glVertexAttrib4fv(location, values);
- values += rows;
- ++location;
- }
- }
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to the
- contents of \a values, which contains \a columns elements, each
- consisting of \a rows elements. The \a rows value should be
- 1, 2, 3, or 4. This function is typically used to set matrix
- values and column vectors.
-
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::setAttributeValue
- (const char *name, const GLfloat *values, int columns, int rows)
-{
- setAttributeValue(attributeLocation(name), values, columns, rows);
-}
-
-/*!
- Sets an array of vertex \a values on the attribute at \a location
- in this shader program. The \a tupleSize indicates the number of
- components per vertex (1, 2, 3, or 4), and the \a stride indicates
- the number of bytes between vertices. A default \a stride value
- of zero indicates that the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QOpenGLShaderProgram::setAttributeArray
- (int location, const GLfloat *values, int tupleSize, int stride)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, tupleSize, GL_FLOAT, GL_FALSE,
- stride, values);
- }
-}
-
-/*!
- Sets an array of 2D vertex \a values on the attribute at \a location
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QOpenGLShaderProgram::setAttributeArray
- (int location, const QVector2D *values, int stride)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE,
- stride, values);
- }
-}
-
-/*!
- Sets an array of 3D vertex \a values on the attribute at \a location
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QOpenGLShaderProgram::setAttributeArray
- (int location, const QVector3D *values, int stride)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, 3, GL_FLOAT, GL_FALSE,
- stride, values);
- }
-}
-
-/*!
- Sets an array of 4D vertex \a values on the attribute at \a location
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QOpenGLShaderProgram::setAttributeArray
- (int location, const QVector4D *values, int stride)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, 4, GL_FLOAT, GL_FALSE,
- stride, values);
- }
-}
-
-/*!
- Sets an array of vertex \a values on the attribute at \a location
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The \a type indicates the type of elements in the \a values array,
- usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a tupleSize
- indicates the number of components per vertex: 1, 2, 3, or 4.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- The setAttributeBuffer() function can be used to set the attribute
- array to an offset within a vertex buffer.
-
- \note Normalization will be enabled. If this is not desired, call
- glVertexAttribPointer directly through QOpenGLFunctions.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray(), setAttributeBuffer()
-*/
-void QOpenGLShaderProgram::setAttributeArray
- (int location, GLenum type, const void *values, int tupleSize, int stride)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, tupleSize, type, GL_TRUE,
- stride, values);
- }
-}
-
-/*!
- \overload
-
- Sets an array of vertex \a values on the attribute called \a name
- in this shader program. The \a tupleSize indicates the number of
- components per vertex (1, 2, 3, or 4), and the \a stride indicates
- the number of bytes between vertices. A default \a stride value
- of zero indicates that the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on \a name. Otherwise the value specified with setAttributeValue()
- for \a name will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QOpenGLShaderProgram::setAttributeArray
- (const char *name, const GLfloat *values, int tupleSize, int stride)
-{
- setAttributeArray(attributeLocation(name), values, tupleSize, stride);
-}
-
-/*!
- \overload
-
- Sets an array of 2D vertex \a values on the attribute called \a name
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on \a name. Otherwise the value specified with setAttributeValue()
- for \a name will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QOpenGLShaderProgram::setAttributeArray
- (const char *name, const QVector2D *values, int stride)
-{
- setAttributeArray(attributeLocation(name), values, stride);
-}
-
-/*!
- \overload
-
- Sets an array of 3D vertex \a values on the attribute called \a name
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on \a name. Otherwise the value specified with setAttributeValue()
- for \a name will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QOpenGLShaderProgram::setAttributeArray
- (const char *name, const QVector3D *values, int stride)
-{
- setAttributeArray(attributeLocation(name), values, stride);
-}
-
-/*!
- \overload
-
- Sets an array of 4D vertex \a values on the attribute called \a name
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on \a name. Otherwise the value specified with setAttributeValue()
- for \a name will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QOpenGLShaderProgram::setAttributeArray
- (const char *name, const QVector4D *values, int stride)
-{
- setAttributeArray(attributeLocation(name), values, stride);
-}
-
-/*!
- \overload
-
- Sets an array of vertex \a values on the attribute called \a name
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The \a type indicates the type of elements in the \a values array,
- usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a tupleSize
- indicates the number of components per vertex: 1, 2, 3, or 4.
-
- The array will become active when enableAttributeArray() is called
- on the \a name. Otherwise the value specified with
- setAttributeValue() for \a name will be used.
-
- The setAttributeBuffer() function can be used to set the attribute
- array to an offset within a vertex buffer.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray(), setAttributeBuffer()
-*/
-void QOpenGLShaderProgram::setAttributeArray
- (const char *name, GLenum type, const void *values, int tupleSize, int stride)
-{
- setAttributeArray(attributeLocation(name), type, values, tupleSize, stride);
-}
-
-/*!
- Sets an array of vertex values on the attribute at \a location in
- this shader program, starting at a specific \a offset in the
- currently bound vertex buffer. The \a stride indicates the number
- of bytes between vertices. A default \a stride value of zero
- indicates that the vertices are densely packed in the value array.
-
- The \a type indicates the type of elements in the vertex value
- array, usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a
- tupleSize indicates the number of components per vertex: 1, 2, 3,
- or 4.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- \note Normalization will be enabled. If this is not desired, call
- glVertexAttribPointer directly through QOpenGLFunctions.
-
- \sa setAttributeArray()
-*/
-void QOpenGLShaderProgram::setAttributeBuffer
- (int location, GLenum type, int offset, int tupleSize, int stride)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, tupleSize, type, GL_TRUE, stride,
- reinterpret_cast<const void *>(qintptr(offset)));
- }
-}
-
-/*!
- \overload
-
- Sets an array of vertex values on the attribute called \a name
- in this shader program, starting at a specific \a offset in the
- currently bound vertex buffer. The \a stride indicates the number
- of bytes between vertices. A default \a stride value of zero
- indicates that the vertices are densely packed in the value array.
-
- The \a type indicates the type of elements in the vertex value
- array, usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a
- tupleSize indicates the number of components per vertex: 1, 2, 3,
- or 4.
-
- The array will become active when enableAttributeArray() is called
- on the \a name. Otherwise the value specified with
- setAttributeValue() for \a name will be used.
-
- \sa setAttributeArray()
-*/
-void QOpenGLShaderProgram::setAttributeBuffer
- (const char *name, GLenum type, int offset, int tupleSize, int stride)
-{
- setAttributeBuffer(attributeLocation(name), type, offset, tupleSize, stride);
-}
-
-/*!
- Enables the vertex array at \a location in this shader program
- so that the value set by setAttributeArray() on \a location
- will be used by the shader program.
-
- \sa disableAttributeArray(), setAttributeArray(), setAttributeValue()
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::enableAttributeArray(int location)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glEnableVertexAttribArray(location);
-}
-
-/*!
- \overload
-
- Enables the vertex array called \a name in this shader program
- so that the value set by setAttributeArray() on \a name
- will be used by the shader program.
-
- \sa disableAttributeArray(), setAttributeArray(), setAttributeValue()
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::enableAttributeArray(const char *name)
-{
- enableAttributeArray(attributeLocation(name));
-}
-
-/*!
- Disables the vertex array at \a location in this shader program
- that was enabled by a previous call to enableAttributeArray().
-
- \sa enableAttributeArray(), setAttributeArray(), setAttributeValue()
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::disableAttributeArray(int location)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glDisableVertexAttribArray(location);
-}
-
-/*!
- \overload
-
- Disables the vertex array called \a name in this shader program
- that was enabled by a previous call to enableAttributeArray().
-
- \sa enableAttributeArray(), setAttributeArray(), setAttributeValue()
- \sa setUniformValue()
-*/
-void QOpenGLShaderProgram::disableAttributeArray(const char *name)
-{
- disableAttributeArray(attributeLocation(name));
-}
-
-/*!
- Returns the location of the uniform variable \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- uniform variable for this shader program.
-
- \sa attributeLocation()
-*/
-int QOpenGLShaderProgram::uniformLocation(const char *name) const
-{
- Q_D(const QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (d->linked && d->programGuard && d->programGuard->id()) {
- return d->glfuncs->glGetUniformLocation(d->programGuard->id(), name);
- } else {
- qWarning("QOpenGLShaderProgram::uniformLocation(%s): shader program is not linked", name);
- return -1;
- }
-}
-
-/*!
- \overload
-
- Returns the location of the uniform variable \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- uniform variable for this shader program.
-
- \sa attributeLocation()
-*/
-int QOpenGLShaderProgram::uniformLocation(const QByteArray& name) const
-{
- return uniformLocation(name.constData());
-}
-
-/*!
- \overload
-
- Returns the location of the uniform variable \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- uniform variable for this shader program.
-
- \sa attributeLocation()
-*/
-int QOpenGLShaderProgram::uniformLocation(const QString& name) const
-{
- return uniformLocation(name.toLatin1().constData());
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, GLfloat value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform1fv(location, 1, &value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, GLfloat value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, GLint value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform1i(location, value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, GLint value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
- This function should be used when setting sampler values.
-
- \note This function is not aware of unsigned int support in modern OpenGL
- versions and therefore treats \a value as a GLint and calls glUniform1i.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, GLuint value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform1i(location, value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value. This function should be used when setting sampler values.
-
- \note This function is not aware of unsigned int support in modern OpenGL
- versions and therefore treats \a value as a GLint and calls glUniform1i.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, GLuint value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the 2D vector (\a x, \a y).
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, GLfloat x, GLfloat y)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[2] = {x, y};
- d->glfuncs->glUniform2fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context to
- the 2D vector (\a x, \a y).
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, GLfloat x, GLfloat y)
-{
- setUniformValue(uniformLocation(name), x, y);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the 3D vector (\a x, \a y, \a z).
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue
- (int location, GLfloat x, GLfloat y, GLfloat z)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[3] = {x, y, z};
- d->glfuncs->glUniform3fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context to
- the 3D vector (\a x, \a y, \a z).
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue
- (const char *name, GLfloat x, GLfloat y, GLfloat z)
-{
- setUniformValue(uniformLocation(name), x, y, z);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the 4D vector (\a x, \a y, \a z, \a w).
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue
- (int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {x, y, z, w};
- d->glfuncs->glUniform4fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context to
- the 4D vector (\a x, \a y, \a z, \a w).
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue
- (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- setUniformValue(uniformLocation(name), x, y, z, w);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QVector2D& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform2fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QVector2D& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QVector3D& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform3fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QVector3D& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QVector4D& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform4fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QVector4D& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the red, green, blue, and alpha components of \a color.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QColor& color)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(color.redF()), GLfloat(color.greenF()),
- GLfloat(color.blueF()), GLfloat(color.alphaF())};
- d->glfuncs->glUniform4fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context to
- the red, green, blue, and alpha components of \a color.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QColor& color)
-{
- setUniformValue(uniformLocation(name), color);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the x and y coordinates of \a point.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QPoint& point)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(point.x()), GLfloat(point.y())};
- d->glfuncs->glUniform2fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable associated with \a name in the current
- context to the x and y coordinates of \a point.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QPoint& point)
-{
- setUniformValue(uniformLocation(name), point);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the x and y coordinates of \a point.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QPointF& point)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(point.x()), GLfloat(point.y())};
- d->glfuncs->glUniform2fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable associated with \a name in the current
- context to the x and y coordinates of \a point.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QPointF& point)
-{
- setUniformValue(uniformLocation(name), point);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the width and height of the given \a size.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QSize& size)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(size.width()), GLfloat(size.height())};
- d->glfuncs->glUniform2fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable associated with \a name in the current
- context to the width and height of the given \a size.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QSize& size)
-{
- setUniformValue(uniformLocation(name), size);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the width and height of the given \a size.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QSizeF& size)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(size.width()), GLfloat(size.height())};
- d->glfuncs->glUniform2fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable associated with \a name in the current
- context to the width and height of the given \a size.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QSizeF& size)
-{
- setUniformValue(uniformLocation(name), size);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 2x2 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix2x2& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- d->glfuncs->glUniformMatrix2fv(location, 1, GL_FALSE, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 2x2 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix2x2& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 2x3 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat2x3, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec3.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix2x3& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- d->glfuncs->glUniform3fv(location, 2, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 2x3 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat2x3, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec3.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix2x3& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 2x4 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat2x4, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec4.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix2x4& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- d->glfuncs->glUniform4fv(location, 2, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 2x4 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat2x4, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec4.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix2x4& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 3x2 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat3x2, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec2.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix3x2& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- d->glfuncs->glUniform2fv(location, 3, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 3x2 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat3x2, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec2.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix3x2& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 3x3 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix3x3& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 3x3 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix3x3& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 3x4 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat3x4, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec4.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix3x4& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- d->glfuncs->glUniform4fv(location, 3, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 3x4 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat3x4, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec4.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix3x4& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 4x2 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat4x2, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec2.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix4x2& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- d->glfuncs->glUniform2fv(location, 4, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 4x2 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat4x2, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec2.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix4x2& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 4x3 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat4x3, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec3.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix4x3& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- d->glfuncs->glUniform3fv(location, 4, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 4x3 matrix \a value.
-
- \note This function is not aware of non square matrix support,
- that is, GLSL types like mat4x3, that is present in modern OpenGL
- versions. Instead, it treats the uniform as an array of vec3.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix4x3& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 4x4 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix4x4& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- d->glfuncs->glUniformMatrix4fv(location, 1, GL_FALSE, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 4x4 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix4x4& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable at \a location in the current context
- to a 2x2 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const GLfloat value[2][2])
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniformMatrix2fv(location, 1, GL_FALSE, value[0]);
-}
-
-/*!
- \overload
-
- Sets the uniform variable at \a location in the current context
- to a 3x3 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const GLfloat value[3][3])
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, value[0]);
-}
-
-/*!
- \overload
-
- Sets the uniform variable at \a location in the current context
- to a 4x4 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const GLfloat value[4][4])
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniformMatrix4fv(location, 1, GL_FALSE, value[0]);
-}
-
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 2x2 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const GLfloat value[2][2])
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 3x3 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const GLfloat value[3][3])
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 4x4 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValue(const char *name, const GLfloat value[4][4])
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to a
- 3x3 transformation matrix \a value that is specified as a QTransform value.
-
- To set a QTransform value as a 4x4 matrix in a shader, use
- \c{setUniformValue(location, QMatrix4x4(value))}.
-*/
-void QOpenGLShaderProgram::setUniformValue(int location, const QTransform& value)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat mat[3][3] = {
- {GLfloat(value.m11()), GLfloat(value.m12()), GLfloat(value.m13())},
- {GLfloat(value.m21()), GLfloat(value.m22()), GLfloat(value.m23())},
- {GLfloat(value.m31()), GLfloat(value.m32()), GLfloat(value.m33())}
- };
- d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, mat[0]);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context to a
- 3x3 transformation matrix \a value that is specified as a QTransform value.
-
- To set a QTransform value as a 4x4 matrix in a shader, use
- \c{setUniformValue(name, QMatrix4x4(value))}.
-*/
-void QOpenGLShaderProgram::setUniformValue
- (const char *name, const QTransform& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const GLint *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform1iv(location, count, values);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray
- (const char *name, const GLint *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count elements of \a values. This overload
- should be used when setting an array of sampler values.
-
- \note This function is not aware of unsigned int support in modern OpenGL
- versions and therefore treats \a values as a GLint and calls glUniform1iv.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const GLuint *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform1iv(location, count, reinterpret_cast<const GLint *>(values));
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count elements of \a values. This overload
- should be used when setting an array of sampler values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray
- (const char *name, const GLuint *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count elements of \a values. Each element
- has \a tupleSize components. The \a tupleSize must be 1, 2, 3, or 4.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const GLfloat *values, int count, int tupleSize)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- if (tupleSize == 1)
- d->glfuncs->glUniform1fv(location, count, values);
- else if (tupleSize == 2)
- d->glfuncs->glUniform2fv(location, count, values);
- else if (tupleSize == 3)
- d->glfuncs->glUniform3fv(location, count, values);
- else if (tupleSize == 4)
- d->glfuncs->glUniform4fv(location, count, values);
- else
- qWarning("QOpenGLShaderProgram::setUniformValue: size %d not supported", tupleSize);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count elements of \a values. Each element
- has \a tupleSize components. The \a tupleSize must be 1, 2, 3, or 4.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray
- (const char *name, const GLfloat *values, int count, int tupleSize)
-{
- setUniformValueArray(uniformLocation(name), values, count, tupleSize);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 2D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QVector2D *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform2fv(location, count, reinterpret_cast<const GLfloat *>(values));
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 2D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QVector2D *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 3D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QVector3D *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform3fv(location, count, reinterpret_cast<const GLfloat *>(values));
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 3D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QVector3D *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 4D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QVector4D *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform4fv(location, count, reinterpret_cast<const GLfloat *>(values));
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 4D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QVector4D *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-// We have to repack matrix arrays from qreal to GLfloat.
-#define setUniformMatrixArray(func,location,values,count,type,cols,rows) \
- if (location == -1 || count <= 0) \
- return; \
- if (sizeof(type) == sizeof(GLfloat) * cols * rows) { \
- func(location, count, GL_FALSE, \
- reinterpret_cast<const GLfloat *>(values[0].constData())); \
- } else { \
- QVarLengthArray<GLfloat> temp(cols * rows * count); \
- for (int index = 0; index < count; ++index) { \
- for (int index2 = 0; index2 < (cols * rows); ++index2) { \
- temp.data()[cols * rows * index + index2] = \
- values[index].constData()[index2]; \
- } \
- } \
- func(location, count, GL_FALSE, temp.constData()); \
- }
-#define setUniformGenericMatrixArray(colfunc,location,values,count,type,cols,rows) \
- if (location == -1 || count <= 0) \
- return; \
- if (sizeof(type) == sizeof(GLfloat) * cols * rows) { \
- const GLfloat *data = reinterpret_cast<const GLfloat *> \
- (values[0].constData()); \
- colfunc(location, count * cols, data); \
- } else { \
- QVarLengthArray<GLfloat> temp(cols * rows * count); \
- for (int index = 0; index < count; ++index) { \
- for (int index2 = 0; index2 < (cols * rows); ++index2) { \
- temp.data()[cols * rows * index + index2] = \
- values[index].constData()[index2]; \
- } \
- } \
- colfunc(location, count * cols, temp.constData()); \
- }
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 2x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix2x2 *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- setUniformMatrixArray
- (d->glfuncs->glUniformMatrix2fv, location, values, count, QMatrix2x2, 2, 2);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 2x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x2 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 2x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix2x3 *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform3fv, location, values, count,
- QMatrix2x3, 2, 3);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 2x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x3 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 2x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix2x4 *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform4fv, location, values, count,
- QMatrix2x4, 2, 4);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 2x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x4 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 3x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix3x2 *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform2fv, location, values, count,
- QMatrix3x2, 3, 2);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 3x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x2 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 3x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix3x3 *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- setUniformMatrixArray
- (d->glfuncs->glUniformMatrix3fv, location, values, count, QMatrix3x3, 3, 3);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 3x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x3 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 3x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix3x4 *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform4fv, location, values, count,
- QMatrix3x4, 3, 4);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 3x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x4 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 4x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix4x2 *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform2fv, location, values, count,
- QMatrix4x2, 4, 2);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 4x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4x2 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 4x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix4x3 *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform3fv, location, values, count,
- QMatrix4x3, 4, 3);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 4x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4x3 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 4x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix4x4 *values, int count)
-{
- Q_D(QOpenGLShaderProgram);
- Q_UNUSED(d);
- setUniformMatrixArray
- (d->glfuncs->glUniformMatrix4fv, location, values, count, QMatrix4x4, 4, 4);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 4x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4x4 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Returns the hardware limit for how many vertices a geometry shader
- can output.
-*/
-int QOpenGLShaderProgram::maxGeometryOutputVertices() const
-{
- GLint n = 0;
- Q_D(const QOpenGLShaderProgram);
- d->glfuncs->glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &n);
- return n;
-}
-
-/*!
- Use this function to specify to OpenGL the number of vertices in
- a patch to \a count. A patch is a custom OpenGL primitive whose interpretation
- is entirely defined by the tessellation shader stages. Therefore, calling
- this function only makes sense when using a QOpenGLShaderProgram
- containing tessellation stage shaders. When using OpenGL tessellation,
- the only primitive that can be rendered with \c{glDraw*()} functions is
- \c{GL_PATCHES}.
-
- This is equivalent to calling glPatchParameteri(GL_PATCH_VERTICES, count).
-
- \note This modifies global OpenGL state and is not specific to this
- QOpenGLShaderProgram instance. You should call this in your render
- function when needed, as QOpenGLShaderProgram will not apply this for
- you. This is purely a convenience function.
-
- \sa patchVertexCount()
-*/
-void QOpenGLShaderProgram::setPatchVertexCount(int count)
-{
- Q_D(QOpenGLShaderProgram);
- d->glfuncs->glPatchParameteri(GL_PATCH_VERTICES, count);
-}
-
-/*!
- Returns the number of vertices per-patch to be used when rendering.
-
- \note This returns the global OpenGL state value. It is not specific to
- this QOpenGLShaderProgram instance.
-
- \sa setPatchVertexCount()
-*/
-int QOpenGLShaderProgram::patchVertexCount() const
-{
- int patchVertices = 0;
- Q_D(const QOpenGLShaderProgram);
- d->glfuncs->glGetIntegerv(GL_PATCH_VERTICES, &patchVertices);
- return patchVertices;
-}
-
-/*!
- Sets the default outer tessellation levels to be used by the tessellation
- primitive generator in the event that the tessellation control shader
- does not output them to \a levels. For more details on OpenGL and Tessellation
- shaders see \l{OpenGL Tessellation Shaders}.
-
- The \a levels argument should be a QVector consisting of 4 floats. Not all
- of the values make sense for all tessellation modes. If you specify a vector with
- fewer than 4 elements, the remaining elements will be given a default value of 1.
-
- \note This modifies global OpenGL state and is not specific to this
- QOpenGLShaderProgram instance. You should call this in your render
- function when needed, as QOpenGLShaderProgram will not apply this for
- you. This is purely a convenience function.
-
- \note This function is only available with OpenGL >= 4.0 and is not supported
- with OpenGL ES 3.2.
-
- \sa defaultOuterTessellationLevels(), setDefaultInnerTessellationLevels()
-*/
-void QOpenGLShaderProgram::setDefaultOuterTessellationLevels(const QVector<float> &levels)
-{
-#ifndef QT_OPENGL_ES_2
- Q_D(QOpenGLShaderProgram);
- if (d->tessellationFuncs) {
- QVector<float> tessLevels = levels;
-
- // Ensure we have the required 4 outer tessellation levels
- // Use default of 1 for missing entries (same as spec)
- const int argCount = 4;
- if (tessLevels.size() < argCount) {
- tessLevels.reserve(argCount);
- for (int i = tessLevels.size(); i < argCount; ++i)
- tessLevels.append(1.0f);
- }
- d->tessellationFuncs->glPatchParameterfv(GL_PATCH_DEFAULT_OUTER_LEVEL, tessLevels.data());
- }
-#else
- Q_UNUSED(levels);
-#endif
-}
-
-/*!
- Returns the default outer tessellation levels to be used by the tessellation
- primitive generator in the event that the tessellation control shader
- does not output them. For more details on OpenGL and Tessellation shaders see
- \l{OpenGL Tessellation Shaders}.
-
- Returns a QVector of floats describing the outer tessellation levels. The vector
- will always have four elements but not all of them make sense for every mode
- of tessellation.
-
- \note This returns the global OpenGL state value. It is not specific to
- this QOpenGLShaderProgram instance.
-
- \note This function is only supported with OpenGL >= 4.0 and will not
- return valid results with OpenGL ES 3.2.
-
- \sa setDefaultOuterTessellationLevels(), defaultInnerTessellationLevels()
-*/
-QVector<float> QOpenGLShaderProgram::defaultOuterTessellationLevels() const
-{
-#ifndef QT_OPENGL_ES_2
- QVector<float> tessLevels(4, 1.0f);
- Q_D(const QOpenGLShaderProgram);
- if (d->tessellationFuncs)
- d->tessellationFuncs->glGetFloatv(GL_PATCH_DEFAULT_OUTER_LEVEL, tessLevels.data());
- return tessLevels;
-#else
- return QVector<float>();
-#endif
-}
-
-/*!
- Sets the default outer tessellation levels to be used by the tessellation
- primitive generator in the event that the tessellation control shader
- does not output them to \a levels. For more details on OpenGL and Tessellation shaders see
- \l{OpenGL Tessellation Shaders}.
-
- The \a levels argument should be a QVector consisting of 2 floats. Not all
- of the values make sense for all tessellation modes. If you specify a vector with
- fewer than 2 elements, the remaining elements will be given a default value of 1.
-
- \note This modifies global OpenGL state and is not specific to this
- QOpenGLShaderProgram instance. You should call this in your render
- function when needed, as QOpenGLShaderProgram will not apply this for
- you. This is purely a convenience function.
-
- \note This function is only available with OpenGL >= 4.0 and is not supported
- with OpenGL ES 3.2.
-
- \sa defaultInnerTessellationLevels(), setDefaultOuterTessellationLevels()
-*/
-void QOpenGLShaderProgram::setDefaultInnerTessellationLevels(const QVector<float> &levels)
-{
-#ifndef QT_OPENGL_ES_2
- Q_D(QOpenGLShaderProgram);
- if (d->tessellationFuncs) {
- QVector<float> tessLevels = levels;
-
- // Ensure we have the required 2 inner tessellation levels
- // Use default of 1 for missing entries (same as spec)
- const int argCount = 2;
- if (tessLevels.size() < argCount) {
- tessLevels.reserve(argCount);
- for (int i = tessLevels.size(); i < argCount; ++i)
- tessLevels.append(1.0f);
- }
- d->tessellationFuncs->glPatchParameterfv(GL_PATCH_DEFAULT_INNER_LEVEL, tessLevels.data());
- }
-#else
- Q_UNUSED(levels);
-#endif
-}
-
-/*!
- Returns the default inner tessellation levels to be used by the tessellation
- primitive generator in the event that the tessellation control shader
- does not output them. For more details on OpenGL and Tessellation shaders see
- \l{OpenGL Tessellation Shaders}.
-
- Returns a QVector of floats describing the inner tessellation levels. The vector
- will always have two elements but not all of them make sense for every mode
- of tessellation.
-
- \note This returns the global OpenGL state value. It is not specific to
- this QOpenGLShaderProgram instance.
-
- \note This function is only supported with OpenGL >= 4.0 and will not
- return valid results with OpenGL ES 3.2.
-
- \sa setDefaultInnerTessellationLevels(), defaultOuterTessellationLevels()
-*/
-QVector<float> QOpenGLShaderProgram::defaultInnerTessellationLevels() const
-{
-#ifndef QT_OPENGL_ES_2
- QVector<float> tessLevels(2, 1.0f);
- Q_D(const QOpenGLShaderProgram);
- if (d->tessellationFuncs)
- d->tessellationFuncs->glGetFloatv(GL_PATCH_DEFAULT_INNER_LEVEL, tessLevels.data());
- return tessLevels;
-#else
- return QVector<float>();
-#endif
-}
-
-
-/*!
- Returns \c true if shader programs written in the OpenGL Shading
- Language (GLSL) are supported on this system; false otherwise.
-
- The \a context is used to resolve the GLSL extensions.
- If \a context is \nullptr, then QOpenGLContext::currentContext()
- is used.
-*/
-bool QOpenGLShaderProgram::hasOpenGLShaderPrograms(QOpenGLContext *context)
-{
- if (!context)
- context = QOpenGLContext::currentContext();
- if (!context)
- return false;
- return QOpenGLFunctions(context).hasOpenGLFeature(QOpenGLFunctions::Shaders);
-}
-
-/*!
- \internal
-*/
-void QOpenGLShaderProgram::shaderDestroyed()
-{
- Q_D(QOpenGLShaderProgram);
- QOpenGLShader *shader = qobject_cast<QOpenGLShader *>(sender());
- if (shader && !d->removingShaders)
- removeShader(shader);
-}
-
-/*!
- Returns \c true if shader programs of type \a type are supported on
- this system; false otherwise.
-
- The \a context is used to resolve the GLSL extensions.
- If \a context is \nullptr, then QOpenGLContext::currentContext()
- is used.
-*/
-bool QOpenGLShader::hasOpenGLShaders(ShaderType type, QOpenGLContext *context)
-{
- if (!context)
- context = QOpenGLContext::currentContext();
- if (!context)
- return false;
-
- if ((type & ~(Geometry | Vertex | Fragment | TessellationControl | TessellationEvaluation | Compute)) || type == 0)
- return false;
-
- if (type & QOpenGLShader::Geometry)
- return supportsGeometry(context->format());
- else if (type & (QOpenGLShader::TessellationControl | QOpenGLShader::TessellationEvaluation))
- return supportsTessellation(context->format());
- else if (type & QOpenGLShader::Compute)
- return supportsCompute(context->format());
-
- // Unconditional support of vertex and fragment shaders implicitly assumes
- // a minimum OpenGL version of 2.0
- return true;
-}
-
-bool QOpenGLShaderProgramPrivate::isCacheDisabled() const
-{
- static QOpenGLProgramBinarySupportCheckWrapper binSupportCheck;
- return !binSupportCheck.get(QOpenGLContext::currentContext())->isSupported();
-}
-
-bool QOpenGLShaderProgramPrivate::compileCacheable()
-{
- Q_Q(QOpenGLShaderProgram);
- for (const QOpenGLProgramBinaryCache::ShaderDesc &shader : qAsConst(binaryProgram.shaders)) {
- QScopedPointer<QOpenGLShader> s(new QOpenGLShader(qt_shaderStageToType(shader.stage), q));
- if (!s->compileSourceCode(shader.source)) {
- log = s->log();
- return false;
- }
- anonShaders.append(s.take());
- if (!q->addShader(anonShaders.last()))
- return false;
- }
- return true;
-}
-
-bool QOpenGLShaderProgramPrivate::linkBinary()
-{
- static QOpenGLProgramBinaryCache binCache;
-
- Q_Q(QOpenGLShaderProgram);
-
- const QByteArray cacheKey = binaryProgram.cacheKey();
- if (lcOpenGLProgramDiskCache().isEnabled(QtDebugMsg))
- qCDebug(lcOpenGLProgramDiskCache, "program with %d shaders, cache key %s",
- binaryProgram.shaders.count(), cacheKey.constData());
-
- bool needsCompile = true;
- if (binCache.load(cacheKey, q->programId())) {
- qCDebug(lcOpenGLProgramDiskCache, "Program binary received from cache");
- needsCompile = false;
- }
-
- bool needsSave = false;
- if (needsCompile) {
- qCDebug(lcOpenGLProgramDiskCache, "Program binary not in cache, compiling");
- if (compileCacheable())
- needsSave = true;
- else
- return false;
- }
-
- linkBinaryRecursion = true;
- bool ok = q->link();
- linkBinaryRecursion = false;
- if (ok && needsSave)
- binCache.save(cacheKey, q->programId());
-
- return ok;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglshaderprogram.h b/src/gui/opengl/qopenglshaderprogram.h
deleted file mode 100644
index c79101fd4d..0000000000
--- a/src/gui/opengl/qopenglshaderprogram.h
+++ /dev/null
@@ -1,318 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLSHADERPROGRAM_H
-#define QOPENGLSHADERPROGRAM_H
-
-#include <QtGui/qtguiglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtGui/qopengl.h>
-#include <QtGui/qvector2d.h>
-#include <QtGui/qvector3d.h>
-#include <QtGui/qvector4d.h>
-#include <QtGui/qmatrix4x4.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QOpenGLContext;
-class QOpenGLShaderProgram;
-class QOpenGLShaderPrivate;
-
-class Q_GUI_EXPORT QOpenGLShader : public QObject
-{
- Q_OBJECT
-public:
- enum ShaderTypeBit
- {
- Vertex = 0x0001,
- Fragment = 0x0002,
- Geometry = 0x0004,
- TessellationControl = 0x0008,
- TessellationEvaluation = 0x0010,
- Compute = 0x0020
- };
- Q_DECLARE_FLAGS(ShaderType, ShaderTypeBit)
-
- explicit QOpenGLShader(QOpenGLShader::ShaderType type, QObject *parent = nullptr);
- ~QOpenGLShader();
-
- QOpenGLShader::ShaderType shaderType() const;
-
- bool compileSourceCode(const char *source);
- bool compileSourceCode(const QByteArray& source);
- bool compileSourceCode(const QString& source);
- bool compileSourceFile(const QString& fileName);
-
- QByteArray sourceCode() const;
-
- bool isCompiled() const;
- QString log() const;
-
- GLuint shaderId() const;
-
- static bool hasOpenGLShaders(ShaderType type, QOpenGLContext *context = nullptr);
-
-private:
- friend class QOpenGLShaderProgram;
-
- Q_DISABLE_COPY(QOpenGLShader)
- Q_DECLARE_PRIVATE(QOpenGLShader)
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLShader::ShaderType)
-
-
-class QOpenGLShaderProgramPrivate;
-
-class Q_GUI_EXPORT QOpenGLShaderProgram : public QObject
-{
- Q_OBJECT
-public:
- explicit QOpenGLShaderProgram(QObject *parent = nullptr);
- ~QOpenGLShaderProgram();
-
- bool addShader(QOpenGLShader *shader);
- void removeShader(QOpenGLShader *shader);
- QList<QOpenGLShader *> shaders() const;
-
- bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source);
- bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray& source);
- bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString& source);
- bool addShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString& fileName);
-
- bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source);
- bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray &source);
- bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString &source);
- bool addCacheableShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString &fileName);
-
- void removeAllShaders();
-
- virtual bool link();
- bool isLinked() const;
- QString log() const;
-
- bool bind();
- void release();
-
- bool create();
-
- GLuint programId() const;
-
- int maxGeometryOutputVertices() const;
-
- void setPatchVertexCount(int count);
- int patchVertexCount() const;
-
- void setDefaultOuterTessellationLevels(const QVector<float> &levels);
- QVector<float> defaultOuterTessellationLevels() const;
-
- void setDefaultInnerTessellationLevels(const QVector<float> &levels);
- QVector<float> defaultInnerTessellationLevels() const;
-
- void bindAttributeLocation(const char *name, int location);
- void bindAttributeLocation(const QByteArray& name, int location);
- void bindAttributeLocation(const QString& name, int location);
-
- int attributeLocation(const char *name) const;
- int attributeLocation(const QByteArray& name) const;
- int attributeLocation(const QString& name) const;
-
- void setAttributeValue(int location, GLfloat value);
- void setAttributeValue(int location, GLfloat x, GLfloat y);
- void setAttributeValue(int location, GLfloat x, GLfloat y, GLfloat z);
- void setAttributeValue(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void setAttributeValue(int location, const QVector2D& value);
- void setAttributeValue(int location, const QVector3D& value);
- void setAttributeValue(int location, const QVector4D& value);
- void setAttributeValue(int location, const QColor& value);
- void setAttributeValue(int location, const GLfloat *values, int columns, int rows);
-
- void setAttributeValue(const char *name, GLfloat value);
- void setAttributeValue(const char *name, GLfloat x, GLfloat y);
- void setAttributeValue(const char *name, GLfloat x, GLfloat y, GLfloat z);
- void setAttributeValue(const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void setAttributeValue(const char *name, const QVector2D& value);
- void setAttributeValue(const char *name, const QVector3D& value);
- void setAttributeValue(const char *name, const QVector4D& value);
- void setAttributeValue(const char *name, const QColor& value);
- void setAttributeValue(const char *name, const GLfloat *values, int columns, int rows);
-
- void setAttributeArray
- (int location, const GLfloat *values, int tupleSize, int stride = 0);
- void setAttributeArray
- (int location, const QVector2D *values, int stride = 0);
- void setAttributeArray
- (int location, const QVector3D *values, int stride = 0);
- void setAttributeArray
- (int location, const QVector4D *values, int stride = 0);
- void setAttributeArray
- (int location, GLenum type, const void *values, int tupleSize, int stride = 0);
- void setAttributeArray
- (const char *name, const GLfloat *values, int tupleSize, int stride = 0);
- void setAttributeArray
- (const char *name, const QVector2D *values, int stride = 0);
- void setAttributeArray
- (const char *name, const QVector3D *values, int stride = 0);
- void setAttributeArray
- (const char *name, const QVector4D *values, int stride = 0);
- void setAttributeArray
- (const char *name, GLenum type, const void *values, int tupleSize, int stride = 0);
-
- void setAttributeBuffer
- (int location, GLenum type, int offset, int tupleSize, int stride = 0);
- void setAttributeBuffer
- (const char *name, GLenum type, int offset, int tupleSize, int stride = 0);
-
- void enableAttributeArray(int location);
- void enableAttributeArray(const char *name);
- void disableAttributeArray(int location);
- void disableAttributeArray(const char *name);
-
- int uniformLocation(const char *name) const;
- int uniformLocation(const QByteArray& name) const;
- int uniformLocation(const QString& name) const;
-
- void setUniformValue(int location, GLfloat value);
- void setUniformValue(int location, GLint value);
- void setUniformValue(int location, GLuint value);
- void setUniformValue(int location, GLfloat x, GLfloat y);
- void setUniformValue(int location, GLfloat x, GLfloat y, GLfloat z);
- void setUniformValue(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void setUniformValue(int location, const QVector2D& value);
- void setUniformValue(int location, const QVector3D& value);
- void setUniformValue(int location, const QVector4D& value);
- void setUniformValue(int location, const QColor& color);
- void setUniformValue(int location, const QPoint& point);
- void setUniformValue(int location, const QPointF& point);
- void setUniformValue(int location, const QSize& size);
- void setUniformValue(int location, const QSizeF& size);
- void setUniformValue(int location, const QMatrix2x2& value);
- void setUniformValue(int location, const QMatrix2x3& value);
- void setUniformValue(int location, const QMatrix2x4& value);
- void setUniformValue(int location, const QMatrix3x2& value);
- void setUniformValue(int location, const QMatrix3x3& value);
- void setUniformValue(int location, const QMatrix3x4& value);
- void setUniformValue(int location, const QMatrix4x2& value);
- void setUniformValue(int location, const QMatrix4x3& value);
- void setUniformValue(int location, const QMatrix4x4& value);
- void setUniformValue(int location, const GLfloat value[2][2]);
- void setUniformValue(int location, const GLfloat value[3][3]);
- void setUniformValue(int location, const GLfloat value[4][4]);
- void setUniformValue(int location, const QTransform& value);
-
- void setUniformValue(const char *name, GLfloat value);
- void setUniformValue(const char *name, GLint value);
- void setUniformValue(const char *name, GLuint value);
- void setUniformValue(const char *name, GLfloat x, GLfloat y);
- void setUniformValue(const char *name, GLfloat x, GLfloat y, GLfloat z);
- void setUniformValue(const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void setUniformValue(const char *name, const QVector2D& value);
- void setUniformValue(const char *name, const QVector3D& value);
- void setUniformValue(const char *name, const QVector4D& value);
- void setUniformValue(const char *name, const QColor& color);
- void setUniformValue(const char *name, const QPoint& point);
- void setUniformValue(const char *name, const QPointF& point);
- void setUniformValue(const char *name, const QSize& size);
- void setUniformValue(const char *name, const QSizeF& size);
- void setUniformValue(const char *name, const QMatrix2x2& value);
- void setUniformValue(const char *name, const QMatrix2x3& value);
- void setUniformValue(const char *name, const QMatrix2x4& value);
- void setUniformValue(const char *name, const QMatrix3x2& value);
- void setUniformValue(const char *name, const QMatrix3x3& value);
- void setUniformValue(const char *name, const QMatrix3x4& value);
- void setUniformValue(const char *name, const QMatrix4x2& value);
- void setUniformValue(const char *name, const QMatrix4x3& value);
- void setUniformValue(const char *name, const QMatrix4x4& value);
- void setUniformValue(const char *name, const GLfloat value[2][2]);
- void setUniformValue(const char *name, const GLfloat value[3][3]);
- void setUniformValue(const char *name, const GLfloat value[4][4]);
- void setUniformValue(const char *name, const QTransform& value);
-
- void setUniformValueArray(int location, const GLfloat *values, int count, int tupleSize);
- void setUniformValueArray(int location, const GLint *values, int count);
- void setUniformValueArray(int location, const GLuint *values, int count);
- void setUniformValueArray(int location, const QVector2D *values, int count);
- void setUniformValueArray(int location, const QVector3D *values, int count);
- void setUniformValueArray(int location, const QVector4D *values, int count);
- void setUniformValueArray(int location, const QMatrix2x2 *values, int count);
- void setUniformValueArray(int location, const QMatrix2x3 *values, int count);
- void setUniformValueArray(int location, const QMatrix2x4 *values, int count);
- void setUniformValueArray(int location, const QMatrix3x2 *values, int count);
- void setUniformValueArray(int location, const QMatrix3x3 *values, int count);
- void setUniformValueArray(int location, const QMatrix3x4 *values, int count);
- void setUniformValueArray(int location, const QMatrix4x2 *values, int count);
- void setUniformValueArray(int location, const QMatrix4x3 *values, int count);
- void setUniformValueArray(int location, const QMatrix4x4 *values, int count);
-
- void setUniformValueArray(const char *name, const GLfloat *values, int count, int tupleSize);
- void setUniformValueArray(const char *name, const GLint *values, int count);
- void setUniformValueArray(const char *name, const GLuint *values, int count);
- void setUniformValueArray(const char *name, const QVector2D *values, int count);
- void setUniformValueArray(const char *name, const QVector3D *values, int count);
- void setUniformValueArray(const char *name, const QVector4D *values, int count);
- void setUniformValueArray(const char *name, const QMatrix2x2 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix2x3 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix2x4 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix3x2 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix3x3 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix3x4 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix4x2 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix4x3 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix4x4 *values, int count);
-
- static bool hasOpenGLShaderPrograms(QOpenGLContext *context = nullptr);
-
-private Q_SLOTS:
- void shaderDestroyed();
-
-private:
- Q_DISABLE_COPY(QOpenGLShaderProgram)
- Q_DECLARE_PRIVATE(QOpenGLShaderProgram)
-
- bool init();
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-
-#endif
diff --git a/src/gui/opengl/qopengltexture.cpp b/src/gui/opengl/qopengltexture.cpp
deleted file mode 100644
index 5490ad8025..0000000000
--- a/src/gui/opengl/qopengltexture.cpp
+++ /dev/null
@@ -1,4988 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopengltexture.h"
-#include "qopengltexture_p.h"
-#include "qopengltexturehelper_p.h"
-#include "qopenglfunctions.h"
-#include <QtGui/qcolor.h>
-#include <QtGui/qopenglcontext.h>
-#include <QtCore/qdebug.h>
-#include <private/qobject_p.h>
-#include <private/qopenglcontext_p.h>
-
-QT_BEGIN_NAMESPACE
-
-//this is to work around GL_TEXTURE_WRAP_R_OES which also has 0x8072 as value
-#if !defined(GL_TEXTURE_WRAP_R)
- #define GL_TEXTURE_WRAP_R 0x8072
-#endif
-
-QOpenGLTexturePrivate::QOpenGLTexturePrivate(QOpenGLTexture::Target textureTarget,
- QOpenGLTexture *qq)
- : q_ptr(qq),
- context(nullptr),
- target(textureTarget),
- textureId(0),
- format(QOpenGLTexture::NoFormat),
- formatClass(QOpenGLTexture::NoFormatClass),
- requestedMipLevels(1),
- mipLevels(-1),
- layers(1),
- faces(1),
- samples(0),
- fixedSamplePositions(true),
- baseLevel(0),
- maxLevel(1000),
- depthStencilMode(QOpenGLTexture::DepthMode),
- comparisonFunction(QOpenGLTexture::CompareLessEqual),
- comparisonMode(QOpenGLTexture::CompareNone),
- minFilter(QOpenGLTexture::Nearest),
- magFilter(QOpenGLTexture::Nearest),
- maxAnisotropy(1.0f),
- minLevelOfDetail(-1000.0f),
- maxLevelOfDetail(1000.0f),
- levelOfDetailBias(0.0f),
- textureView(false),
- autoGenerateMipMaps(true),
- storageAllocated(false),
- texFuncs(nullptr),
- functions(nullptr)
-{
- dimensions[0] = dimensions[1] = dimensions[2] = 1;
-
- switch (target) {
- case QOpenGLTexture::Target1D:
- bindingTarget = QOpenGLTexture::BindingTarget1D;
- break;
- case QOpenGLTexture::Target1DArray:
- bindingTarget = QOpenGLTexture::BindingTarget1DArray;
- break;
- case QOpenGLTexture::Target2D:
- bindingTarget = QOpenGLTexture::BindingTarget2D;
- break;
- case QOpenGLTexture::Target2DArray:
- bindingTarget = QOpenGLTexture::BindingTarget2DArray;
- break;
- case QOpenGLTexture::Target3D:
- bindingTarget = QOpenGLTexture::BindingTarget3D;
- break;
- case QOpenGLTexture::TargetCubeMap:
- bindingTarget = QOpenGLTexture::BindingTargetCubeMap;
- faces = 6;
- break;
- case QOpenGLTexture::TargetCubeMapArray:
- bindingTarget = QOpenGLTexture::BindingTargetCubeMapArray;
- faces = 6;
- break;
- case QOpenGLTexture::Target2DMultisample:
- bindingTarget = QOpenGLTexture::BindingTarget2DMultisample;
- break;
- case QOpenGLTexture::Target2DMultisampleArray:
- bindingTarget = QOpenGLTexture::BindingTarget2DMultisampleArray;
- break;
- case QOpenGLTexture::TargetRectangle:
- bindingTarget = QOpenGLTexture::BindingTargetRectangle;
- break;
- case QOpenGLTexture::TargetBuffer:
- bindingTarget = QOpenGLTexture::BindingTargetBuffer;
- break;
- }
-
- swizzleMask[0] = QOpenGLTexture::RedValue;
- swizzleMask[1] = QOpenGLTexture::GreenValue;
- swizzleMask[2] = QOpenGLTexture::BlueValue;
- swizzleMask[3] = QOpenGLTexture::AlphaValue;
-
- wrapModes[0] = wrapModes[1] = wrapModes[2] = target == QOpenGLTexture::TargetRectangle
- ? QOpenGLTexture::ClampToEdge : QOpenGLTexture::Repeat;
-}
-
-QOpenGLTexturePrivate::~QOpenGLTexturePrivate()
-{
- destroy();
-}
-
-void QOpenGLTexturePrivate::initializeOpenGLFunctions()
-{
- // If we already have a functions object, there is nothing to do
- if (texFuncs)
- return;
-
- // See if the context already has a suitable resource we can use.
- // If not create a functions object and add it to the context in case
- // others wish to use it too
- texFuncs = context->textureFunctions();
- if (!texFuncs) {
- texFuncs = new QOpenGLTextureHelper(context);
- context->setTextureFunctions(texFuncs);
- }
-}
-
-bool QOpenGLTexturePrivate::create()
-{
- if (textureId != 0)
- return true;
-
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (!ctx) {
- qWarning("Requires a valid current OpenGL context.\n"
- "Texture has not been created");
- return false;
- }
- context = ctx;
- functions = ctx->functions();
-
- // Resolve any functions we will need based upon context version and create the texture
- initializeOpenGLFunctions();
-
- // What features do we have?
- QOpenGLTexture::Feature feature = QOpenGLTexture::ImmutableStorage;
- while (feature != QOpenGLTexture::MaxFeatureFlag) {
- if (QOpenGLTexture::hasFeature(feature))
- features |= feature;
- feature = static_cast<QOpenGLTexture::Feature>(feature << 1);
- }
-
- functions->glGenTextures(1, &textureId);
- return textureId != 0;
-}
-
-void QOpenGLTexturePrivate::destroy()
-{
- if (!textureId) {
- // not created or already destroyed
- return;
- }
- QOpenGLContext *currentContext = QOpenGLContext::currentContext();
- if (!currentContext) {
- qWarning("QOpenGLTexturePrivate::destroy() called without a current context.\n"
- "Texture has not been destroyed");
- return;
- }
- if (!QOpenGLContext::areSharing(currentContext, context)) {
-
- qWarning("QOpenGLTexturePrivate::destroy() called but texture context %p"
- " is not shared with current context %p.\n"
- "Texture has not been destroyed",
- static_cast<const void *>(context),
- static_cast<const void *>(currentContext));
- return;
- }
-
- functions->glDeleteTextures(1, &textureId);
-
- context = nullptr;
- functions = nullptr;
- textureId = 0;
- format = QOpenGLTexture::NoFormat;
- formatClass = QOpenGLTexture::NoFormatClass;
- requestedMipLevels = 1;
- mipLevels = -1;
- layers = 1;
- faces = 1;
- samples = 0;
- fixedSamplePositions = true,
- baseLevel = 0;
- maxLevel = 1000;
- depthStencilMode = QOpenGLTexture::DepthMode;
- minFilter = QOpenGLTexture::Nearest;
- magFilter = QOpenGLTexture::Nearest;
- maxAnisotropy = 1.0f;
- minLevelOfDetail = -1000.0f;
- maxLevelOfDetail = 1000.0f;
- levelOfDetailBias = 0.0f;
- textureView = false;
- autoGenerateMipMaps = true;
- storageAllocated = false;
- texFuncs = nullptr;
-
- swizzleMask[0] = QOpenGLTexture::RedValue;
- swizzleMask[1] = QOpenGLTexture::GreenValue;
- swizzleMask[2] = QOpenGLTexture::BlueValue;
- swizzleMask[3] = QOpenGLTexture::AlphaValue;
-
- wrapModes[0] = wrapModes[1] = wrapModes[2] = target == QOpenGLTexture::TargetRectangle
- ? QOpenGLTexture::ClampToEdge : QOpenGLTexture::Repeat;
-}
-
-void QOpenGLTexturePrivate::bind()
-{
- functions->glBindTexture(target, textureId);
-}
-
-void QOpenGLTexturePrivate::bind(uint unit, QOpenGLTexture::TextureUnitReset reset)
-{
- GLint oldTextureUnit = 0;
- if (reset == QOpenGLTexture::ResetTextureUnit)
- functions->glGetIntegerv(GL_ACTIVE_TEXTURE, &oldTextureUnit);
-
- texFuncs->glActiveTexture(GL_TEXTURE0 + unit);
- functions->glBindTexture(target, textureId);
-
- if (reset == QOpenGLTexture::ResetTextureUnit)
- texFuncs->glActiveTexture(GL_TEXTURE0 + oldTextureUnit);
-}
-
-void QOpenGLTexturePrivate::release()
-{
- functions->glBindTexture(target, 0);
-}
-
-void QOpenGLTexturePrivate::release(uint unit, QOpenGLTexture::TextureUnitReset reset)
-{
- GLint oldTextureUnit = 0;
- if (reset == QOpenGLTexture::ResetTextureUnit)
- functions->glGetIntegerv(GL_ACTIVE_TEXTURE, &oldTextureUnit);
-
- texFuncs->glActiveTexture(GL_TEXTURE0 + unit);
- functions->glBindTexture(target, 0);
-
- if (reset == QOpenGLTexture::ResetTextureUnit)
- texFuncs->glActiveTexture(GL_TEXTURE0 + oldTextureUnit);
-}
-
-bool QOpenGLTexturePrivate::isBound() const
-{
- GLint boundTextureId = 0;
- functions->glGetIntegerv(bindingTarget, &boundTextureId);
- return (static_cast<GLuint>(boundTextureId) == textureId);
-}
-
-bool QOpenGLTexturePrivate::isBound(uint unit) const
-{
- GLint oldTextureUnit = 0;
- functions->glGetIntegerv(GL_ACTIVE_TEXTURE, &oldTextureUnit);
-
- GLint boundTextureId = 0;
- texFuncs->glActiveTexture(GL_TEXTURE0 + unit);
- functions->glGetIntegerv(bindingTarget, &boundTextureId);
- bool result = (static_cast<GLuint>(boundTextureId) == textureId);
-
- texFuncs->glActiveTexture(GL_TEXTURE0 + oldTextureUnit);
- return result;
-}
-
-int QOpenGLTexturePrivate::evaluateMipLevels() const
-{
- switch (target) {
- case QOpenGLTexture::Target1D:
- case QOpenGLTexture::Target1DArray:
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::Target2DArray:
- case QOpenGLTexture::Target3D:
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetCubeMapArray:
- return qMin(maximumMipLevelCount(), qMax(1, requestedMipLevels));
-
- case QOpenGLTexture::TargetRectangle:
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- case QOpenGLTexture::TargetBuffer:
- default:
- return 1;
- }
-}
-
-static bool isSizedTextureFormat(QOpenGLTexture::TextureFormat internalFormat)
-{
- switch (internalFormat) {
- case QOpenGLTexture::NoFormat:
- return false;
-
- case QOpenGLTexture::R8_UNorm:
- case QOpenGLTexture::RG8_UNorm:
- case QOpenGLTexture::RGB8_UNorm:
- case QOpenGLTexture::RGBA8_UNorm:
- case QOpenGLTexture::R16_UNorm:
- case QOpenGLTexture::RG16_UNorm:
- case QOpenGLTexture::RGB16_UNorm:
- case QOpenGLTexture::RGBA16_UNorm:
- case QOpenGLTexture::R8_SNorm:
- case QOpenGLTexture::RG8_SNorm:
- case QOpenGLTexture::RGB8_SNorm:
- case QOpenGLTexture::RGBA8_SNorm:
- case QOpenGLTexture::R16_SNorm:
- case QOpenGLTexture::RG16_SNorm:
- case QOpenGLTexture::RGB16_SNorm:
- case QOpenGLTexture::RGBA16_SNorm:
- case QOpenGLTexture::R8U:
- case QOpenGLTexture::RG8U:
- case QOpenGLTexture::RGB8U:
- case QOpenGLTexture::RGBA8U:
- case QOpenGLTexture::R16U:
- case QOpenGLTexture::RG16U:
- case QOpenGLTexture::RGB16U:
- case QOpenGLTexture::RGBA16U:
- case QOpenGLTexture::R32U:
- case QOpenGLTexture::RG32U:
- case QOpenGLTexture::RGB32U:
- case QOpenGLTexture::RGBA32U:
- case QOpenGLTexture::R8I:
- case QOpenGLTexture::RG8I:
- case QOpenGLTexture::RGB8I:
- case QOpenGLTexture::RGBA8I:
- case QOpenGLTexture::R16I:
- case QOpenGLTexture::RG16I:
- case QOpenGLTexture::RGB16I:
- case QOpenGLTexture::RGBA16I:
- case QOpenGLTexture::R32I:
- case QOpenGLTexture::RG32I:
- case QOpenGLTexture::RGB32I:
- case QOpenGLTexture::RGBA32I:
- case QOpenGLTexture::R16F:
- case QOpenGLTexture::RG16F:
- case QOpenGLTexture::RGB16F:
- case QOpenGLTexture::RGBA16F:
- case QOpenGLTexture::R32F:
- case QOpenGLTexture::RG32F:
- case QOpenGLTexture::RGB32F:
- case QOpenGLTexture::RGBA32F:
- case QOpenGLTexture::RGB9E5:
- case QOpenGLTexture::RG11B10F:
- case QOpenGLTexture::RG3B2:
- case QOpenGLTexture::R5G6B5:
- case QOpenGLTexture::RGB5A1:
- case QOpenGLTexture::RGBA4:
- case QOpenGLTexture::RGB10A2:
-
- case QOpenGLTexture::D16:
- case QOpenGLTexture::D24:
- case QOpenGLTexture::D32:
- case QOpenGLTexture::D32F:
-
- case QOpenGLTexture::D24S8:
- case QOpenGLTexture::D32FS8X24:
-
- case QOpenGLTexture::S8:
-
- case QOpenGLTexture::RGB_DXT1:
- case QOpenGLTexture::RGBA_DXT1:
- case QOpenGLTexture::RGBA_DXT3:
- case QOpenGLTexture::RGBA_DXT5:
- case QOpenGLTexture::R_ATI1N_UNorm:
- case QOpenGLTexture::R_ATI1N_SNorm:
- case QOpenGLTexture::RG_ATI2N_UNorm:
- case QOpenGLTexture::RG_ATI2N_SNorm:
- case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
- case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
- case QOpenGLTexture::RGB_BP_UNorm:
- case QOpenGLTexture::SRGB8:
- case QOpenGLTexture::SRGB8_Alpha8:
- case QOpenGLTexture::SRGB_DXT1:
- case QOpenGLTexture::SRGB_Alpha_DXT1:
- case QOpenGLTexture::SRGB_Alpha_DXT3:
- case QOpenGLTexture::SRGB_Alpha_DXT5:
- case QOpenGLTexture::SRGB_BP_UNorm:
- case QOpenGLTexture::R11_EAC_UNorm:
- case QOpenGLTexture::R11_EAC_SNorm:
- case QOpenGLTexture::RG11_EAC_UNorm:
- case QOpenGLTexture::RG11_EAC_SNorm:
- case QOpenGLTexture::RGB8_ETC2:
- case QOpenGLTexture::SRGB8_ETC2:
- case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
- case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
- case QOpenGLTexture::RGBA8_ETC2_EAC:
- case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
- case QOpenGLTexture::RGBA_ASTC_4x4:
- case QOpenGLTexture::RGBA_ASTC_5x4:
- case QOpenGLTexture::RGBA_ASTC_5x5:
- case QOpenGLTexture::RGBA_ASTC_6x5:
- case QOpenGLTexture::RGBA_ASTC_6x6:
- case QOpenGLTexture::RGBA_ASTC_8x5:
- case QOpenGLTexture::RGBA_ASTC_8x6:
- case QOpenGLTexture::RGBA_ASTC_8x8:
- case QOpenGLTexture::RGBA_ASTC_10x5:
- case QOpenGLTexture::RGBA_ASTC_10x6:
- case QOpenGLTexture::RGBA_ASTC_10x8:
- case QOpenGLTexture::RGBA_ASTC_10x10:
- case QOpenGLTexture::RGBA_ASTC_12x10:
- case QOpenGLTexture::RGBA_ASTC_12x12:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
- return true;
-
- case QOpenGLTexture::RGB8_ETC1:
- return false;
-
- case QOpenGLTexture::DepthFormat:
- case QOpenGLTexture::AlphaFormat:
-
- case QOpenGLTexture::RGBFormat:
- case QOpenGLTexture::RGBAFormat:
-
- case QOpenGLTexture::LuminanceFormat:
-
- case QOpenGLTexture::LuminanceAlphaFormat:
- return false;
- }
-
- Q_UNREACHABLE();
- return false;
-}
-
-static bool isTextureTargetMultisample(QOpenGLTexture::Target target)
-{
- switch (target) {
- case QOpenGLTexture::Target1D:
- case QOpenGLTexture::Target1DArray:
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::Target2DArray:
- case QOpenGLTexture::Target3D:
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetCubeMapArray:
- return false;
-
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- return true;
-
- case QOpenGLTexture::TargetRectangle:
- case QOpenGLTexture::TargetBuffer:
- return false;
- }
-
- Q_UNREACHABLE();
- return false;
-}
-
-bool QOpenGLTexturePrivate::isUsingImmutableStorage() const
-{
- // Use immutable storage whenever possible, falling back to mutable
- // Note that if multisample textures are not supported at all, we'll still fail into
- // the mutable storage allocation
- return isSizedTextureFormat(format)
- && (isTextureTargetMultisample(target)
- ? features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)
- : features.testFlag(QOpenGLTexture::ImmutableStorage));
-}
-
-void QOpenGLTexturePrivate::allocateStorage(QOpenGLTexture::PixelFormat pixelFormat, QOpenGLTexture::PixelType pixelType)
-{
- // Resolve the actual number of mipmap levels we can use
- mipLevels = evaluateMipLevels();
-
- if (isUsingImmutableStorage())
- allocateImmutableStorage();
- else
- allocateMutableStorage(pixelFormat, pixelType);
-}
-
-static QOpenGLTexture::PixelFormat pixelFormatCompatibleWithInternalFormat(QOpenGLTexture::TextureFormat internalFormat)
-{
- switch (internalFormat) {
- case QOpenGLTexture::NoFormat:
- return QOpenGLTexture::NoSourceFormat;
-
- case QOpenGLTexture::R8_UNorm:
- return QOpenGLTexture::Red;
-
- case QOpenGLTexture::RG8_UNorm:
- return QOpenGLTexture::RG;
-
- case QOpenGLTexture::RGB8_UNorm:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::RGBA8_UNorm:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::R16_UNorm:
- return QOpenGLTexture::Red;
-
- case QOpenGLTexture::RG16_UNorm:
- return QOpenGLTexture::RG;
-
- case QOpenGLTexture::RGB16_UNorm:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::RGBA16_UNorm:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::R8_SNorm:
- return QOpenGLTexture::Red;
-
- case QOpenGLTexture::RG8_SNorm:
- return QOpenGLTexture::RG;
-
- case QOpenGLTexture::RGB8_SNorm:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::RGBA8_SNorm:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::R16_SNorm:
- return QOpenGLTexture::Red;
-
- case QOpenGLTexture::RG16_SNorm:
- return QOpenGLTexture::RG;
-
- case QOpenGLTexture::RGB16_SNorm:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::RGBA16_SNorm:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::R8U:
- return QOpenGLTexture::Red_Integer;
-
- case QOpenGLTexture::RG8U:
- return QOpenGLTexture::RG_Integer;
-
- case QOpenGLTexture::RGB8U:
- return QOpenGLTexture::RGB_Integer;
-
- case QOpenGLTexture::RGBA8U:
- return QOpenGLTexture::RGBA_Integer;
-
- case QOpenGLTexture::R16U:
- return QOpenGLTexture::Red_Integer;
-
- case QOpenGLTexture::RG16U:
- return QOpenGLTexture::RG_Integer;
-
- case QOpenGLTexture::RGB16U:
- return QOpenGLTexture::RGB_Integer;
-
- case QOpenGLTexture::RGBA16U:
- return QOpenGLTexture::RGBA_Integer;
-
- case QOpenGLTexture::R32U:
- return QOpenGLTexture::Red_Integer;
-
- case QOpenGLTexture::RG32U:
- return QOpenGLTexture::RG_Integer;
-
- case QOpenGLTexture::RGB32U:
- return QOpenGLTexture::RGB_Integer;
-
- case QOpenGLTexture::RGBA32U:
- return QOpenGLTexture::RGBA_Integer;
-
- case QOpenGLTexture::R8I:
- return QOpenGLTexture::Red_Integer;
-
- case QOpenGLTexture::RG8I:
- return QOpenGLTexture::RG_Integer;
-
- case QOpenGLTexture::RGB8I:
- return QOpenGLTexture::RGB_Integer;
-
- case QOpenGLTexture::RGBA8I:
- return QOpenGLTexture::RGBA_Integer;
-
- case QOpenGLTexture::R16I:
- return QOpenGLTexture::Red_Integer;
-
- case QOpenGLTexture::RG16I:
- return QOpenGLTexture::RG_Integer;
-
- case QOpenGLTexture::RGB16I:
- return QOpenGLTexture::RGB_Integer;
-
- case QOpenGLTexture::RGBA16I:
- return QOpenGLTexture::RGBA_Integer;
-
- case QOpenGLTexture::R32I:
- return QOpenGLTexture::Red_Integer;
-
- case QOpenGLTexture::RG32I:
- return QOpenGLTexture::RG_Integer;
-
- case QOpenGLTexture::RGB32I:
- return QOpenGLTexture::RGB_Integer;
-
- case QOpenGLTexture::RGBA32I:
- return QOpenGLTexture::RGBA_Integer;
-
- case QOpenGLTexture::R16F:
- return QOpenGLTexture::Red;
-
- case QOpenGLTexture::RG16F:
- return QOpenGLTexture::RG;
-
- case QOpenGLTexture::RGB16F:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::RGBA16F:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::R32F:
- return QOpenGLTexture::Red;
-
- case QOpenGLTexture::RG32F:
- return QOpenGLTexture::RG;
-
- case QOpenGLTexture::RGB32F:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::RGBA32F:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::RGB9E5:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::RG11B10F:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::RG3B2:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::R5G6B5:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::RGB5A1:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::RGBA4:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::RGB10A2:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::D16:
- case QOpenGLTexture::D24:
- case QOpenGLTexture::D32:
- case QOpenGLTexture::D32F:
- return QOpenGLTexture::Depth;
-
- case QOpenGLTexture::D24S8:
- case QOpenGLTexture::D32FS8X24:
- return QOpenGLTexture::DepthStencil;
-
- case QOpenGLTexture::S8:
- return QOpenGLTexture::Stencil;
-
- case QOpenGLTexture::RGB_DXT1:
- case QOpenGLTexture::RGBA_DXT1:
- case QOpenGLTexture::RGBA_DXT3:
- case QOpenGLTexture::RGBA_DXT5:
- case QOpenGLTexture::R_ATI1N_UNorm:
- case QOpenGLTexture::R_ATI1N_SNorm:
- case QOpenGLTexture::RG_ATI2N_UNorm:
- case QOpenGLTexture::RG_ATI2N_SNorm:
- case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
- case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
- case QOpenGLTexture::RGB_BP_UNorm:
- case QOpenGLTexture::SRGB8:
- case QOpenGLTexture::SRGB8_Alpha8:
- case QOpenGLTexture::SRGB_DXT1:
- case QOpenGLTexture::SRGB_Alpha_DXT1:
- case QOpenGLTexture::SRGB_Alpha_DXT3:
- case QOpenGLTexture::SRGB_Alpha_DXT5:
- case QOpenGLTexture::SRGB_BP_UNorm:
- case QOpenGLTexture::RGB8_ETC1:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::R11_EAC_UNorm:
- case QOpenGLTexture::R11_EAC_SNorm:
- return QOpenGLTexture::Red;
-
- case QOpenGLTexture::RG11_EAC_UNorm:
- case QOpenGLTexture::RG11_EAC_SNorm:
- return QOpenGLTexture::RG;
-
- case QOpenGLTexture::RGB8_ETC2:
- case QOpenGLTexture::SRGB8_ETC2:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
- case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::RGBA8_ETC2_EAC:
- case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::RGBA_ASTC_4x4:
- case QOpenGLTexture::RGBA_ASTC_5x4:
- case QOpenGLTexture::RGBA_ASTC_5x5:
- case QOpenGLTexture::RGBA_ASTC_6x5:
- case QOpenGLTexture::RGBA_ASTC_6x6:
- case QOpenGLTexture::RGBA_ASTC_8x5:
- case QOpenGLTexture::RGBA_ASTC_8x6:
- case QOpenGLTexture::RGBA_ASTC_8x8:
- case QOpenGLTexture::RGBA_ASTC_10x5:
- case QOpenGLTexture::RGBA_ASTC_10x6:
- case QOpenGLTexture::RGBA_ASTC_10x8:
- case QOpenGLTexture::RGBA_ASTC_10x10:
- case QOpenGLTexture::RGBA_ASTC_12x10:
- case QOpenGLTexture::RGBA_ASTC_12x12:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::DepthFormat:
- return QOpenGLTexture::Depth;
-
- case QOpenGLTexture::AlphaFormat:
- return QOpenGLTexture::Alpha;
-
- case QOpenGLTexture::RGBFormat:
- return QOpenGLTexture::RGB;
-
- case QOpenGLTexture::RGBAFormat:
- return QOpenGLTexture::RGBA;
-
- case QOpenGLTexture::LuminanceFormat:
- return QOpenGLTexture::Luminance;
-
- case QOpenGLTexture::LuminanceAlphaFormat:
- return QOpenGLTexture::LuminanceAlpha;
- }
-
- Q_UNREACHABLE();
- return QOpenGLTexture::NoSourceFormat;
-}
-
-static QOpenGLTexture::PixelType pixelTypeCompatibleWithInternalFormat(QOpenGLTexture::TextureFormat internalFormat)
-{
- switch (internalFormat) {
- case QOpenGLTexture::NoFormat:
- return QOpenGLTexture::NoPixelType;
-
- case QOpenGLTexture::R8_UNorm:
- case QOpenGLTexture::RG8_UNorm:
- case QOpenGLTexture::RGB8_UNorm:
- case QOpenGLTexture::RGBA8_UNorm:
- case QOpenGLTexture::R16_UNorm:
- case QOpenGLTexture::RG16_UNorm:
- case QOpenGLTexture::RGB16_UNorm:
- case QOpenGLTexture::RGBA16_UNorm:
- return QOpenGLTexture::UInt8;
-
- case QOpenGLTexture::R8_SNorm:
- case QOpenGLTexture::RG8_SNorm:
- case QOpenGLTexture::RGB8_SNorm:
- case QOpenGLTexture::RGBA8_SNorm:
- case QOpenGLTexture::R16_SNorm:
- case QOpenGLTexture::RG16_SNorm:
- case QOpenGLTexture::RGB16_SNorm:
- case QOpenGLTexture::RGBA16_SNorm:
- return QOpenGLTexture::Int8;
-
- case QOpenGLTexture::R8U:
- case QOpenGLTexture::RG8U:
- case QOpenGLTexture::RGB8U:
- case QOpenGLTexture::RGBA8U:
- case QOpenGLTexture::R16U:
- case QOpenGLTexture::RG16U:
- case QOpenGLTexture::RGB16U:
- case QOpenGLTexture::RGBA16U:
- case QOpenGLTexture::R32U:
- case QOpenGLTexture::RG32U:
- case QOpenGLTexture::RGB32U:
- case QOpenGLTexture::RGBA32U:
- return QOpenGLTexture::UInt8;
-
- case QOpenGLTexture::R8I:
- case QOpenGLTexture::RG8I:
- case QOpenGLTexture::RGB8I:
- case QOpenGLTexture::RGBA8I:
- case QOpenGLTexture::R16I:
- case QOpenGLTexture::RG16I:
- case QOpenGLTexture::RGB16I:
- case QOpenGLTexture::RGBA16I:
- case QOpenGLTexture::R32I:
- case QOpenGLTexture::RG32I:
- case QOpenGLTexture::RGB32I:
- case QOpenGLTexture::RGBA32I:
- return QOpenGLTexture::Int8;
-
- case QOpenGLTexture::R16F:
- case QOpenGLTexture::RG16F:
- case QOpenGLTexture::RGB16F:
- case QOpenGLTexture::RGBA16F:
- return QOpenGLTexture::Float16;
-
- case QOpenGLTexture::R32F:
- case QOpenGLTexture::RG32F:
- case QOpenGLTexture::RGB32F:
- case QOpenGLTexture::RGBA32F:
- return QOpenGLTexture::Float32;
-
- case QOpenGLTexture::RGB9E5:
- return QOpenGLTexture::UInt16_RGB5A1_Rev;
-
- case QOpenGLTexture::RG11B10F:
- return QOpenGLTexture::UInt32_RG11B10F;
-
- case QOpenGLTexture::RG3B2:
- return QOpenGLTexture::UInt8_RG3B2;
-
- case QOpenGLTexture::R5G6B5:
- return QOpenGLTexture::UInt16_R5G6B5;
-
- case QOpenGLTexture::RGB5A1:
- return QOpenGLTexture::UInt16_RGB5A1;
-
- case QOpenGLTexture::RGBA4:
- return QOpenGLTexture::UInt16_RGBA4;
-
- case QOpenGLTexture::RGB10A2:
- return QOpenGLTexture::UInt32_RGB10A2;
-
- case QOpenGLTexture::D16:
- return QOpenGLTexture::UInt16;
-
- case QOpenGLTexture::D24:
- case QOpenGLTexture::D32:
- return QOpenGLTexture::UInt32;
-
- case QOpenGLTexture::D32F:
- return QOpenGLTexture::Float32;
-
- case QOpenGLTexture::D24S8:
- return QOpenGLTexture::UInt32_D24S8;
-
- case QOpenGLTexture::D32FS8X24:
- return QOpenGLTexture::Float32_D32_UInt32_S8_X24;
-
- case QOpenGLTexture::S8:
- return QOpenGLTexture::UInt8;
-
- case QOpenGLTexture::RGB_DXT1:
- case QOpenGLTexture::RGBA_DXT1:
- case QOpenGLTexture::RGBA_DXT3:
- case QOpenGLTexture::RGBA_DXT5:
- case QOpenGLTexture::R_ATI1N_UNorm:
- case QOpenGLTexture::R_ATI1N_SNorm:
- case QOpenGLTexture::RG_ATI2N_UNorm:
- case QOpenGLTexture::RG_ATI2N_SNorm:
- case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
- case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
- case QOpenGLTexture::RGB_BP_UNorm:
- case QOpenGLTexture::SRGB8:
- case QOpenGLTexture::SRGB8_Alpha8:
- case QOpenGLTexture::SRGB_DXT1:
- case QOpenGLTexture::SRGB_Alpha_DXT1:
- case QOpenGLTexture::SRGB_Alpha_DXT3:
- case QOpenGLTexture::SRGB_Alpha_DXT5:
- case QOpenGLTexture::SRGB_BP_UNorm:
- case QOpenGLTexture::R11_EAC_UNorm:
- case QOpenGLTexture::R11_EAC_SNorm:
- case QOpenGLTexture::RG11_EAC_UNorm:
- case QOpenGLTexture::RG11_EAC_SNorm:
- case QOpenGLTexture::RGB8_ETC2:
- case QOpenGLTexture::SRGB8_ETC2:
- case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
- case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
- case QOpenGLTexture::RGBA8_ETC2_EAC:
- case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
- case QOpenGLTexture::RGB8_ETC1:
- case QOpenGLTexture::RGBA_ASTC_4x4:
- case QOpenGLTexture::RGBA_ASTC_5x4:
- case QOpenGLTexture::RGBA_ASTC_5x5:
- case QOpenGLTexture::RGBA_ASTC_6x5:
- case QOpenGLTexture::RGBA_ASTC_6x6:
- case QOpenGLTexture::RGBA_ASTC_8x5:
- case QOpenGLTexture::RGBA_ASTC_8x6:
- case QOpenGLTexture::RGBA_ASTC_8x8:
- case QOpenGLTexture::RGBA_ASTC_10x5:
- case QOpenGLTexture::RGBA_ASTC_10x6:
- case QOpenGLTexture::RGBA_ASTC_10x8:
- case QOpenGLTexture::RGBA_ASTC_10x10:
- case QOpenGLTexture::RGBA_ASTC_12x10:
- case QOpenGLTexture::RGBA_ASTC_12x12:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
- return QOpenGLTexture::UInt8;
-
- case QOpenGLTexture::DepthFormat:
- return QOpenGLTexture::UInt32;
-
- case QOpenGLTexture::AlphaFormat:
- case QOpenGLTexture::RGBFormat:
- case QOpenGLTexture::RGBAFormat:
- case QOpenGLTexture::LuminanceFormat:
- case QOpenGLTexture::LuminanceAlphaFormat:
- return QOpenGLTexture::UInt8;
- }
-
- Q_UNREACHABLE();
- return QOpenGLTexture::NoPixelType;
-}
-
-static bool isCompressedFormat(QOpenGLTexture::TextureFormat internalFormat)
-{
- switch (internalFormat) {
- case QOpenGLTexture::NoFormat:
-
- case QOpenGLTexture::R8_UNorm:
- case QOpenGLTexture::RG8_UNorm:
- case QOpenGLTexture::RGB8_UNorm:
- case QOpenGLTexture::RGBA8_UNorm:
- case QOpenGLTexture::R16_UNorm:
- case QOpenGLTexture::RG16_UNorm:
- case QOpenGLTexture::RGB16_UNorm:
- case QOpenGLTexture::RGBA16_UNorm:
- case QOpenGLTexture::R8_SNorm:
- case QOpenGLTexture::RG8_SNorm:
- case QOpenGLTexture::RGB8_SNorm:
- case QOpenGLTexture::RGBA8_SNorm:
- case QOpenGLTexture::R16_SNorm:
- case QOpenGLTexture::RG16_SNorm:
- case QOpenGLTexture::RGB16_SNorm:
- case QOpenGLTexture::RGBA16_SNorm:
- case QOpenGLTexture::R8U:
- case QOpenGLTexture::RG8U:
- case QOpenGLTexture::RGB8U:
- case QOpenGLTexture::RGBA8U:
- case QOpenGLTexture::R16U:
- case QOpenGLTexture::RG16U:
- case QOpenGLTexture::RGB16U:
- case QOpenGLTexture::RGBA16U:
- case QOpenGLTexture::R32U:
- case QOpenGLTexture::RG32U:
- case QOpenGLTexture::RGB32U:
- case QOpenGLTexture::RGBA32U:
- case QOpenGLTexture::R8I:
- case QOpenGLTexture::RG8I:
- case QOpenGLTexture::RGB8I:
- case QOpenGLTexture::RGBA8I:
- case QOpenGLTexture::R16I:
- case QOpenGLTexture::RG16I:
- case QOpenGLTexture::RGB16I:
- case QOpenGLTexture::RGBA16I:
- case QOpenGLTexture::R32I:
- case QOpenGLTexture::RG32I:
- case QOpenGLTexture::RGB32I:
- case QOpenGLTexture::RGBA32I:
- case QOpenGLTexture::R16F:
- case QOpenGLTexture::RG16F:
- case QOpenGLTexture::RGB16F:
- case QOpenGLTexture::RGBA16F:
- case QOpenGLTexture::R32F:
- case QOpenGLTexture::RG32F:
- case QOpenGLTexture::RGB32F:
- case QOpenGLTexture::RGBA32F:
- case QOpenGLTexture::RGB9E5:
- case QOpenGLTexture::RG11B10F:
- case QOpenGLTexture::RG3B2:
- case QOpenGLTexture::R5G6B5:
- case QOpenGLTexture::RGB5A1:
- case QOpenGLTexture::RGBA4:
- case QOpenGLTexture::RGB10A2:
-
- case QOpenGLTexture::D16:
- case QOpenGLTexture::D24:
- case QOpenGLTexture::D32:
- case QOpenGLTexture::D32F:
-
- case QOpenGLTexture::D24S8:
- case QOpenGLTexture::D32FS8X24:
-
- case QOpenGLTexture::S8:
- return false;
-
- case QOpenGLTexture::RGB_DXT1:
- case QOpenGLTexture::RGBA_DXT1:
- case QOpenGLTexture::RGBA_DXT3:
- case QOpenGLTexture::RGBA_DXT5:
- case QOpenGLTexture::R_ATI1N_UNorm:
- case QOpenGLTexture::R_ATI1N_SNorm:
- case QOpenGLTexture::RG_ATI2N_UNorm:
- case QOpenGLTexture::RG_ATI2N_SNorm:
- case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
- case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
- case QOpenGLTexture::RGB_BP_UNorm:
- case QOpenGLTexture::SRGB8:
- case QOpenGLTexture::SRGB8_Alpha8:
- case QOpenGLTexture::SRGB_DXT1:
- case QOpenGLTexture::SRGB_Alpha_DXT1:
- case QOpenGLTexture::SRGB_Alpha_DXT3:
- case QOpenGLTexture::SRGB_Alpha_DXT5:
- case QOpenGLTexture::SRGB_BP_UNorm:
- case QOpenGLTexture::R11_EAC_UNorm:
- case QOpenGLTexture::R11_EAC_SNorm:
- case QOpenGLTexture::RG11_EAC_UNorm:
- case QOpenGLTexture::RG11_EAC_SNorm:
- case QOpenGLTexture::RGB8_ETC2:
- case QOpenGLTexture::SRGB8_ETC2:
- case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
- case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
- case QOpenGLTexture::RGBA8_ETC2_EAC:
- case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
- case QOpenGLTexture::RGB8_ETC1:
- case QOpenGLTexture::RGBA_ASTC_4x4:
- case QOpenGLTexture::RGBA_ASTC_5x4:
- case QOpenGLTexture::RGBA_ASTC_5x5:
- case QOpenGLTexture::RGBA_ASTC_6x5:
- case QOpenGLTexture::RGBA_ASTC_6x6:
- case QOpenGLTexture::RGBA_ASTC_8x5:
- case QOpenGLTexture::RGBA_ASTC_8x6:
- case QOpenGLTexture::RGBA_ASTC_8x8:
- case QOpenGLTexture::RGBA_ASTC_10x5:
- case QOpenGLTexture::RGBA_ASTC_10x6:
- case QOpenGLTexture::RGBA_ASTC_10x8:
- case QOpenGLTexture::RGBA_ASTC_10x10:
- case QOpenGLTexture::RGBA_ASTC_12x10:
- case QOpenGLTexture::RGBA_ASTC_12x12:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
- return true;
-
- case QOpenGLTexture::DepthFormat:
- case QOpenGLTexture::AlphaFormat:
- case QOpenGLTexture::RGBFormat:
- case QOpenGLTexture::RGBAFormat:
- case QOpenGLTexture::LuminanceFormat:
- case QOpenGLTexture::LuminanceAlphaFormat:
- return false;
- }
-
- Q_UNREACHABLE();
- return false;
-}
-
-void QOpenGLTexturePrivate::allocateMutableStorage(QOpenGLTexture::PixelFormat pixelFormat, QOpenGLTexture::PixelType pixelType)
-{
- // There is no way to allocate mutable storage for compressed textures in in
- // versions older than OpenGL 3.1 and OpenGL ES 3.0, because the older specs
- // do not mandate accepting null data pointers for glCompressedTexImage*D,
- // unlike glTexImage*D (which in turn does not accept compressed formats).
- if (isCompressedFormat(format)) {
- storageAllocated = true;
- return;
- }
-
- switch (target) {
- case QOpenGLTexture::TargetBuffer:
- // Buffer textures get their storage from an external OpenGL buffer
- qWarning("Buffer textures do not allocate storage");
- return;
-
- case QOpenGLTexture::Target1D:
- if (features.testFlag(QOpenGLTexture::Texture1D)) {
- for (int level = 0; level < mipLevels; ++level)
- texFuncs->glTextureImage1D(textureId, target, bindingTarget, level, format,
- mipLevelSize(level, dimensions[0]),
- 0,
- pixelFormat, pixelType, nullptr);
- } else {
- qWarning("1D textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::Target1DArray:
- if (features.testFlag(QOpenGLTexture::Texture1D)
- && features.testFlag(QOpenGLTexture::TextureArrays)) {
- for (int level = 0; level < mipLevels; ++level)
- texFuncs->glTextureImage2D(textureId, target, bindingTarget, level, format,
- mipLevelSize(level, dimensions[0]),
- layers,
- 0,
- pixelFormat, pixelType, nullptr);
- } else {
- qWarning("1D array textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::TargetRectangle:
- for (int level = 0; level < mipLevels; ++level)
- texFuncs->glTextureImage2D(textureId, target, bindingTarget, level, format,
- mipLevelSize(level, dimensions[0]),
- mipLevelSize(level, dimensions[1]),
- 0,
- pixelFormat, pixelType, nullptr);
- break;
-
- case QOpenGLTexture::TargetCubeMap: {
- // Cubemaps are the odd one out. We have to allocate storage for each
- // face and miplevel using the special cubemap face targets rather than
- // GL_TARGET_CUBEMAP.
- const QOpenGLTexture::CubeMapFace faceTargets[] = {
- QOpenGLTexture::CubeMapPositiveX, QOpenGLTexture::CubeMapNegativeX,
- QOpenGLTexture::CubeMapPositiveY, QOpenGLTexture::CubeMapNegativeY,
- QOpenGLTexture::CubeMapPositiveZ, QOpenGLTexture::CubeMapNegativeZ
- };
-
- for (int faceTarget = 0; faceTarget < 6; ++faceTarget) {
- for (int level = 0; level < mipLevels; ++level) {
- texFuncs->glTextureImage2D(textureId, faceTargets[faceTarget], bindingTarget,
- level, format,
- mipLevelSize(level, dimensions[0]),
- mipLevelSize(level, dimensions[1]),
- 0,
- pixelFormat, pixelType, nullptr);
- }
- }
- break;
- }
-
- case QOpenGLTexture::Target2DArray:
- if (features.testFlag(QOpenGLTexture::TextureArrays)) {
- for (int level = 0; level < mipLevels; ++level)
- texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
- mipLevelSize(level, dimensions[0]),
- mipLevelSize(level, dimensions[1]),
- layers,
- 0,
- pixelFormat, pixelType, nullptr);
- } else {
- qWarning("Array textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::TargetCubeMapArray:
- // Cubemap arrays must specify number of layer-faces (6 * layers) as depth parameter
- if (features.testFlag(QOpenGLTexture::TextureCubeMapArrays)) {
- for (int level = 0; level < mipLevels; ++level)
- texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
- mipLevelSize(level, dimensions[0]),
- mipLevelSize(level, dimensions[1]),
- 6 * layers,
- 0,
- pixelFormat, pixelType, nullptr);
- } else {
- qWarning("Cubemap Array textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::Target3D:
- if (features.testFlag(QOpenGLTexture::Texture3D)) {
- for (int level = 0; level < mipLevels; ++level)
- texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
- mipLevelSize(level, dimensions[0]),
- mipLevelSize(level, dimensions[1]),
- mipLevelSize(level, dimensions[2]),
- 0,
- pixelFormat, pixelType, nullptr);
- } else {
- qWarning("3D textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::Target2DMultisample:
- if (features.testFlag(QOpenGLTexture::TextureMultisample)) {
- texFuncs->glTextureImage2DMultisample(textureId, target, bindingTarget, samples, format,
- dimensions[0], dimensions[1],
- fixedSamplePositions);
- } else {
- qWarning("Multisample textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::Target2DMultisampleArray:
- if (features.testFlag(QOpenGLTexture::TextureMultisample)
- && features.testFlag(QOpenGLTexture::TextureArrays)) {
- texFuncs->glTextureImage3DMultisample(textureId, target, bindingTarget, samples, format,
- dimensions[0], dimensions[1], layers,
- fixedSamplePositions);
- } else {
- qWarning("Multisample array textures are not supported");
- return;
- }
- break;
- }
-
- storageAllocated = true;
-}
-
-void QOpenGLTexturePrivate::allocateImmutableStorage()
-{
- switch (target) {
- case QOpenGLTexture::TargetBuffer:
- // Buffer textures get their storage from an external OpenGL buffer
- qWarning("Buffer textures do not allocate storage");
- return;
-
- case QOpenGLTexture::Target1D:
- if (features.testFlag(QOpenGLTexture::Texture1D)) {
- texFuncs->glTextureStorage1D(textureId, target, bindingTarget, mipLevels, format,
- dimensions[0]);
- } else {
- qWarning("1D textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::Target1DArray:
- if (features.testFlag(QOpenGLTexture::Texture1D)
- && features.testFlag(QOpenGLTexture::TextureArrays)) {
- texFuncs->glTextureStorage2D(textureId, target, bindingTarget, mipLevels, format,
- dimensions[0], layers);
- } else {
- qWarning("1D array textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetRectangle:
- texFuncs->glTextureStorage2D(textureId, target, bindingTarget, mipLevels, format,
- dimensions[0], dimensions[1]);
- break;
-
- case QOpenGLTexture::Target2DArray:
- if (features.testFlag(QOpenGLTexture::TextureArrays)) {
- texFuncs->glTextureStorage3D(textureId, target, bindingTarget, mipLevels, format,
- dimensions[0], dimensions[1], layers);
- } else {
- qWarning("Array textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::TargetCubeMapArray:
- // Cubemap arrays must specify number of layer-faces (6 * layers) as depth parameter
- if (features.testFlag(QOpenGLTexture::TextureCubeMapArrays)) {
- texFuncs->glTextureStorage3D(textureId, target, bindingTarget, mipLevels, format,
- dimensions[0], dimensions[1], 6 * layers);
- } else {
- qWarning("Cubemap Array textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::Target3D:
- if (features.testFlag(QOpenGLTexture::Texture3D)) {
- texFuncs->glTextureStorage3D(textureId, target, bindingTarget, mipLevels, format,
- dimensions[0], dimensions[1], dimensions[2]);
- } else {
- qWarning("3D textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::Target2DMultisample:
- if (features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)) {
- texFuncs->glTextureStorage2DMultisample(textureId, target, bindingTarget, samples, format,
- dimensions[0], dimensions[1],
- fixedSamplePositions);
- } else {
- qWarning("Multisample textures are not supported");
- return;
- }
- break;
-
- case QOpenGLTexture::Target2DMultisampleArray:
- if (features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)
- && features.testFlag(QOpenGLTexture::TextureArrays)) {
- texFuncs->glTextureStorage3DMultisample(textureId, target, bindingTarget, samples, format,
- dimensions[0], dimensions[1], layers,
- fixedSamplePositions);
- } else {
- qWarning("Multisample array textures are not supported");
- return;
- }
- break;
- }
-
- storageAllocated = true;
-}
-
-void QOpenGLTexturePrivate::setData(int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
- QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- switch (target) {
- case QOpenGLTexture::Target1D:
- Q_UNUSED(layer);
- Q_UNUSED(cubeFace);
- Q_UNUSED(layerCount);
- texFuncs->glTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
- 0, mipLevelSize( mipLevel, dimensions[0] ),
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::Target1DArray:
- Q_UNUSED(cubeFace);
- texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
- 0, layer,
- mipLevelSize(mipLevel, dimensions[0]),
- layerCount,
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::Target2D:
- Q_UNUSED(layer);
- Q_UNUSED(cubeFace);
- Q_UNUSED(layerCount);
- texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
- 0, 0,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::Target2DArray:
- Q_UNUSED(cubeFace);
- texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
- 0, 0, layer,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- layerCount,
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::Target3D:
- Q_UNUSED(cubeFace);
- Q_UNUSED(layerCount);
- texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
- 0, 0, layer,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- mipLevelSize(mipLevel, dimensions[2]),
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::TargetCubeMap:
- Q_UNUSED(layer);
- Q_UNUSED(layerCount);
- texFuncs->glTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
- 0, 0,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::TargetCubeMapArray: {
- int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
- int layerFace = 6 * layer + faceIndex;
- texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
- 0, 0, layerFace,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- layerCount,
- sourceFormat, sourceType, data, options);
- break;
- }
-
- case QOpenGLTexture::TargetRectangle:
- Q_UNUSED(mipLevel);
- Q_UNUSED(layer);
- Q_UNUSED(cubeFace);
- Q_UNUSED(layerCount);
- texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, 0,
- 0, 0,
- dimensions[0],
- dimensions[1],
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- case QOpenGLTexture::TargetBuffer:
- // We don't upload pixel data for these targets
- qWarning("QOpenGLTexture::setData(): Texture target does not support pixel data upload");
- break;
- }
-
- // If requested perform automatic mip map generation
- if (mipLevel == 0 && autoGenerateMipMaps && mipLevels > 1) {
- Q_Q(QOpenGLTexture);
- q->generateMipMaps();
- }
-}
-
-void QOpenGLTexturePrivate::setData(int xOffset, int yOffset, int zOffset, int width, int height, int depth,
- int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
- QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- switch (target) {
- case QOpenGLTexture::Target1D:
- Q_UNUSED(layer);
- Q_UNUSED(cubeFace);
- Q_UNUSED(layerCount);
- Q_UNUSED(yOffset);
- Q_UNUSED(zOffset);
- Q_UNUSED(height);
- Q_UNUSED(depth);
- texFuncs->glTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
- xOffset, width,
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::Target1DArray:
- Q_UNUSED(cubeFace);
- Q_UNUSED(yOffset);
- Q_UNUSED(zOffset);
- Q_UNUSED(height);
- Q_UNUSED(depth);
- texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
- xOffset, layer,
- width,
- layerCount,
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::Target2D:
- Q_UNUSED(layer);
- Q_UNUSED(cubeFace);
- Q_UNUSED(layerCount);
- Q_UNUSED(zOffset);
- Q_UNUSED(depth);
- texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
- xOffset, yOffset,
- width, height,
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::Target2DArray:
- Q_UNUSED(cubeFace);
- Q_UNUSED(zOffset);
- Q_UNUSED(depth);
- texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
- xOffset, yOffset, layer,
- width, height, layerCount,
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::Target3D:
- Q_UNUSED(cubeFace);
- Q_UNUSED(layerCount);
- texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
- xOffset, yOffset, zOffset,
- width, height, depth,
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::TargetCubeMap:
- Q_UNUSED(layer);
- Q_UNUSED(layerCount);
- Q_UNUSED(zOffset);
- Q_UNUSED(depth);
- texFuncs->glTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
- xOffset, yOffset,
- width, height,
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::TargetCubeMapArray: {
- Q_UNUSED(zOffset);
- Q_UNUSED(depth);
- int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
- int layerFace = 6 * layer + faceIndex;
- texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
- xOffset, yOffset, layerFace,
- width, height,
- layerCount,
- sourceFormat, sourceType, data, options);
- break;
- }
-
- case QOpenGLTexture::TargetRectangle:
- Q_UNUSED(mipLevel);
- Q_UNUSED(layer);
- Q_UNUSED(cubeFace);
- Q_UNUSED(layerCount);
- Q_UNUSED(zOffset);
- Q_UNUSED(depth);
- texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, 0,
- xOffset, yOffset,
- width, height,
- sourceFormat, sourceType, data, options);
- break;
-
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- case QOpenGLTexture::TargetBuffer:
- // We don't upload pixel data for these targets
- qWarning("QOpenGLTexture::setData(): Texture target does not support pixel data upload");
- break;
- }
-
- // If requested perform automatic mip map generation
- if (mipLevel == 0 && autoGenerateMipMaps && mipLevels > 1) {
- Q_Q(QOpenGLTexture);
- q->generateMipMaps();
- }
-}
-
-
-void QOpenGLTexturePrivate::setCompressedData(int mipLevel, int layer, int layerCount,
- QOpenGLTexture::CubeMapFace cubeFace,
- int dataSize, const void *data,
- const QOpenGLPixelTransferOptions * const options)
-{
- if (!isCompressedFormat(format)) {
- qWarning("Cannot set compressed data for non-compressed format 0x%x", format);
- return;
- }
-
- const bool needsFullSpec = !isUsingImmutableStorage(); // was allocateStorage() a no-op?
-
- switch (target) {
- case QOpenGLTexture::Target1D:
- Q_UNUSED(layer);
- Q_UNUSED(cubeFace);
- Q_UNUSED(layerCount);
- if (needsFullSpec) {
- texFuncs->glCompressedTextureImage1D(textureId, target, bindingTarget, mipLevel,
- format,
- mipLevelSize(mipLevel, dimensions[0]),
- 0, dataSize, data, options);
- } else {
- texFuncs->glCompressedTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
- 0, mipLevelSize( mipLevel, dimensions[0] ),
- format, dataSize, data, options);
- }
- break;
-
- case QOpenGLTexture::Target1DArray:
- Q_UNUSED(cubeFace);
- if (!needsFullSpec) {
- texFuncs->glCompressedTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
- 0, layer,
- mipLevelSize(mipLevel, dimensions[0]),
- layerCount,
- format, dataSize, data, options);
- }
- break;
-
- case QOpenGLTexture::Target2D:
- Q_UNUSED(layer);
- Q_UNUSED(cubeFace);
- Q_UNUSED(layerCount);
- if (needsFullSpec) {
- texFuncs->glCompressedTextureImage2D(textureId, target, bindingTarget, mipLevel,
- format,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- 0, dataSize, data, options);
- } else {
- texFuncs->glCompressedTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
- 0, 0,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- format, dataSize, data, options);
- }
- break;
-
- case QOpenGLTexture::Target2DArray:
- Q_UNUSED(cubeFace);
- if (!needsFullSpec) {
- texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
- 0, 0, layer,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- layerCount,
- format, dataSize, data, options);
- }
- break;
-
- case QOpenGLTexture::Target3D:
- Q_UNUSED(cubeFace);
- Q_UNUSED(layerCount);
- if (needsFullSpec) {
- texFuncs->glCompressedTextureImage3D(textureId, target, bindingTarget, mipLevel,
- format,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- mipLevelSize(mipLevel, dimensions[2]),
- 0, dataSize, data, options);
- } else {
- texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
- 0, 0, layer,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- mipLevelSize(mipLevel, dimensions[2]),
- format, dataSize, data, options);
- }
- break;
-
- case QOpenGLTexture::TargetCubeMap:
- Q_UNUSED(layer);
- Q_UNUSED(layerCount);
- if (needsFullSpec) {
- texFuncs->glCompressedTextureImage2D(textureId, cubeFace, bindingTarget, mipLevel,
- format,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- 0, dataSize, data, options);
- } else {
- texFuncs->glCompressedTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
- 0, 0,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- format, dataSize, data, options);
- }
- break;
-
- case QOpenGLTexture::TargetCubeMapArray: {
- int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
- int layerFace = 6 * layer + faceIndex;
- if (!needsFullSpec) {
- texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
- 0, 0, layerFace,
- mipLevelSize(mipLevel, dimensions[0]),
- mipLevelSize(mipLevel, dimensions[1]),
- layerCount,
- format, dataSize, data, options);
- }
- break;
- }
-
- case QOpenGLTexture::TargetRectangle:
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- case QOpenGLTexture::TargetBuffer:
- // We don't upload pixel data for these targets
- qWarning("QOpenGLTexture::setCompressedData(): Texture target does not support pixel data upload");
- break;
- }
-
- // If requested perform automatic mip map generation
- if (mipLevel == 0 && autoGenerateMipMaps && mipLevels > 1) {
- Q_Q(QOpenGLTexture);
- q->generateMipMaps();
- }
-}
-
-void QOpenGLTexturePrivate::setWrapMode(QOpenGLTexture::WrapMode mode)
-{
- switch (target) {
- case QOpenGLTexture::Target1D:
- case QOpenGLTexture::Target1DArray:
- case QOpenGLTexture::TargetBuffer:
- wrapModes[0] = mode;
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
- break;
-
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::Target2DArray:
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetCubeMapArray:
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- case QOpenGLTexture::TargetRectangle:
- wrapModes[0] = wrapModes[1] = mode;
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
- break;
-
- case QOpenGLTexture::Target3D:
- wrapModes[0] = wrapModes[1] = wrapModes[2] = mode;
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_R, mode);
- break;
- }
-}
-
-void QOpenGLTexturePrivate::setWrapMode(QOpenGLTexture::CoordinateDirection direction, QOpenGLTexture::WrapMode mode)
-{
- switch (target) {
- case QOpenGLTexture::Target1D:
- case QOpenGLTexture::Target1DArray:
- case QOpenGLTexture::TargetBuffer:
- switch (direction) {
- case QOpenGLTexture::DirectionS:
- wrapModes[0] = mode;
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
- break;
-
- case QOpenGLTexture::DirectionT:
- case QOpenGLTexture::DirectionR:
- qWarning("QOpenGLTexture::setWrapMode() direction not valid for this texture target");
- break;
- }
- break;
-
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::Target2DArray:
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetCubeMapArray:
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- case QOpenGLTexture::TargetRectangle:
- switch (direction) {
- case QOpenGLTexture::DirectionS:
- wrapModes[0] = mode;
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
- break;
-
- case QOpenGLTexture::DirectionT:
- wrapModes[1] = mode;
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
- break;
-
- case QOpenGLTexture::DirectionR:
- qWarning("QOpenGLTexture::setWrapMode() direction not valid for this texture target");
- break;
- }
- break;
-
- case QOpenGLTexture::Target3D:
- switch (direction) {
- case QOpenGLTexture::DirectionS:
- wrapModes[0] = mode;
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
- break;
-
- case QOpenGLTexture::DirectionT:
- wrapModes[1] = mode;
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
- break;
-
- case QOpenGLTexture::DirectionR:
- wrapModes[2] = mode;
- texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
- break;
- }
- break;
- }
-}
-
-QOpenGLTexture::WrapMode QOpenGLTexturePrivate::wrapMode(QOpenGLTexture::CoordinateDirection direction) const
-{
- switch (target) {
- case QOpenGLTexture::Target1D:
- case QOpenGLTexture::Target1DArray:
- case QOpenGLTexture::TargetBuffer:
- switch (direction) {
- case QOpenGLTexture::DirectionS:
- return wrapModes[0];
-
- case QOpenGLTexture::DirectionT:
- case QOpenGLTexture::DirectionR:
- qWarning("QOpenGLTexture::wrapMode() direction not valid for this texture target");
- return QOpenGLTexture::Repeat;
- }
- break;
-
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::Target2DArray:
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetCubeMapArray:
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- case QOpenGLTexture::TargetRectangle:
- switch (direction) {
- case QOpenGLTexture::DirectionS:
- return wrapModes[0];
-
- case QOpenGLTexture::DirectionT:
- return wrapModes[1];
-
- case QOpenGLTexture::DirectionR:
- qWarning("QOpenGLTexture::wrapMode() direction not valid for this texture target");
- return QOpenGLTexture::Repeat;
- }
- break;
-
- case QOpenGLTexture::Target3D:
- switch (direction) {
- case QOpenGLTexture::DirectionS:
- return wrapModes[0];
-
- case QOpenGLTexture::DirectionT:
- return wrapModes[1];
-
- case QOpenGLTexture::DirectionR:
- return wrapModes[2];
- }
- break;
- }
- // Should never get here
- Q_ASSERT(false);
- return QOpenGLTexture::Repeat;
-}
-
-QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target viewTarget,
- QOpenGLTexture::TextureFormat viewFormat,
- int minimumMipmapLevel, int maximumMipmapLevel,
- int minimumLayer, int maximumLayer) const
-{
- // Do sanity checks - see http://www.opengl.org/wiki/GLAPI/glTextureView
-
- // Check the targets are compatible
- bool viewTargetCompatible = false;
- switch (target) {
- case QOpenGLTexture::Target1D:
- case QOpenGLTexture::Target1DArray:
- viewTargetCompatible = (viewTarget == QOpenGLTexture::Target1D
- || viewTarget == QOpenGLTexture::Target1DArray);
- break;
-
-
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::Target2DArray:
- viewTargetCompatible = (viewTarget == QOpenGLTexture::Target2D
- || viewTarget == QOpenGLTexture::Target2DArray);
- break;
-
- case QOpenGLTexture::Target3D:
- viewTargetCompatible = (viewTarget == QOpenGLTexture::Target3D);
- break;
-
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetCubeMapArray:
- viewTargetCompatible = (viewTarget == QOpenGLTexture::TargetCubeMap
- || viewTarget == QOpenGLTexture::Target2D
- || viewTarget == QOpenGLTexture::Target2DArray
- || viewTarget == QOpenGLTexture::TargetCubeMapArray);
- break;
-
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- viewTargetCompatible = (viewTarget == QOpenGLTexture::Target2DMultisample
- || viewTarget == QOpenGLTexture::Target2DMultisampleArray);
- break;
-
- case QOpenGLTexture::TargetRectangle:
- viewTargetCompatible = (viewTarget == QOpenGLTexture::TargetRectangle);
- break;
-
- case QOpenGLTexture::TargetBuffer:
- // Cannot be used with texture views
- break;
- }
-
- if (!viewTargetCompatible) {
- qWarning("QOpenGLTexture::createTextureView(): Incompatible source and view targets");
- return nullptr;
- }
-
- // Check the formats are compatible
- bool viewFormatCompatible = false;
- switch (formatClass) {
- case QOpenGLTexture::NoFormatClass:
- break;
-
- case QOpenGLTexture::FormatClass_128Bit:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA32F
- || viewFormat == QOpenGLTexture::RGBA32U
- || viewFormat == QOpenGLTexture::RGBA32I);
- break;
-
- case QOpenGLTexture::FormatClass_96Bit:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB32F
- || viewFormat == QOpenGLTexture::RGB32U
- || viewFormat == QOpenGLTexture::RGB32I);
- break;
-
- case QOpenGLTexture::FormatClass_64Bit:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA16F
- || viewFormat == QOpenGLTexture::RG32F
- || viewFormat == QOpenGLTexture::RGBA16U
- || viewFormat == QOpenGLTexture::RG32U
- || viewFormat == QOpenGLTexture::RGBA16I
- || viewFormat == QOpenGLTexture::RG32I
- || viewFormat == QOpenGLTexture::RGBA16_UNorm
- || viewFormat == QOpenGLTexture::RGBA16_SNorm);
- break;
-
- case QOpenGLTexture::FormatClass_48Bit:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB16_UNorm
- || viewFormat == QOpenGLTexture::RGB16_SNorm
- || viewFormat == QOpenGLTexture::RGB16F
- || viewFormat == QOpenGLTexture::RGB16U
- || viewFormat == QOpenGLTexture::RGB16I);
- break;
-
- case QOpenGLTexture::FormatClass_32Bit:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RG16F
- || viewFormat == QOpenGLTexture::RG11B10F
- || viewFormat == QOpenGLTexture::R32F
- || viewFormat == QOpenGLTexture::RGB10A2
- || viewFormat == QOpenGLTexture::RGBA8U
- || viewFormat == QOpenGLTexture::RG16U
- || viewFormat == QOpenGLTexture::R32U
- || viewFormat == QOpenGLTexture::RGBA8I
- || viewFormat == QOpenGLTexture::RG16I
- || viewFormat == QOpenGLTexture::R32I
- || viewFormat == QOpenGLTexture::RGBA8_UNorm
- || viewFormat == QOpenGLTexture::RG16_UNorm
- || viewFormat == QOpenGLTexture::RGBA8_SNorm
- || viewFormat == QOpenGLTexture::RG16_SNorm
- || viewFormat == QOpenGLTexture::SRGB8_Alpha8
- || viewFormat == QOpenGLTexture::RGB9E5);
- break;
-
- case QOpenGLTexture::FormatClass_24Bit:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB8_UNorm
- || viewFormat == QOpenGLTexture::RGB8_SNorm
- || viewFormat == QOpenGLTexture::SRGB8
- || viewFormat == QOpenGLTexture::RGB8U
- || viewFormat == QOpenGLTexture::RGB8I);
- break;
-
- case QOpenGLTexture::FormatClass_16Bit:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::R16F
- || viewFormat == QOpenGLTexture::RG8U
- || viewFormat == QOpenGLTexture::R16U
- || viewFormat == QOpenGLTexture::RG8I
- || viewFormat == QOpenGLTexture::R16I
- || viewFormat == QOpenGLTexture::RG8_UNorm
- || viewFormat == QOpenGLTexture::R16_UNorm
- || viewFormat == QOpenGLTexture::RG8_SNorm
- || viewFormat == QOpenGLTexture::R16_SNorm);
- break;
-
- case QOpenGLTexture::FormatClass_8Bit:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::R8U
- || viewFormat == QOpenGLTexture::R8I
- || viewFormat == QOpenGLTexture::R8_UNorm
- || viewFormat == QOpenGLTexture::R8_SNorm);
- break;
-
- case QOpenGLTexture::FormatClass_RGTC1_R:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::R_ATI1N_UNorm
- || viewFormat == QOpenGLTexture::R_ATI1N_SNorm);
- break;
-
- case QOpenGLTexture::FormatClass_RGTC2_RG:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RG_ATI2N_UNorm
- || viewFormat == QOpenGLTexture::RG_ATI2N_SNorm);
- break;
-
- case QOpenGLTexture::FormatClass_BPTC_Unorm:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_BP_UNorm
- || viewFormat == QOpenGLTexture::SRGB_BP_UNorm);
- break;
-
- case QOpenGLTexture::FormatClass_BPTC_Float:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT
- || viewFormat == QOpenGLTexture::RGB_BP_SIGNED_FLOAT);
- break;
-
- case QOpenGLTexture::FormatClass_S3TC_DXT1_RGB:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_DXT1
- || viewFormat == QOpenGLTexture::SRGB_DXT1);
- break;
-
- case QOpenGLTexture::FormatClass_S3TC_DXT1_RGBA:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT1
- || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT1);
- break;
-
- case QOpenGLTexture::FormatClass_S3TC_DXT3_RGBA:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT3
- || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT3);
- break;
-
- case QOpenGLTexture::FormatClass_S3TC_DXT5_RGBA:
- viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT5
- || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT5);
- break;
-
- case QOpenGLTexture::FormatClass_Unique:
- viewFormatCompatible = (viewFormat == format);
- break;
- }
-
- if (!viewFormatCompatible) {
- qWarning("QOpenGLTexture::createTextureView(): Incompatible source and view formats");
- return nullptr;
- }
-
-
- // Create a view
- QOpenGLTexture *view = new QOpenGLTexture(viewTarget);
- view->setFormat(viewFormat);
- view->create();
- view->d_ptr->textureView = true;
- texFuncs->glTextureView(view->textureId(), viewTarget, textureId, viewFormat,
- minimumMipmapLevel, maximumMipmapLevel - minimumMipmapLevel + 1,
- minimumLayer, maximumLayer - minimumLayer + 1);
- return view;
-}
-
-
-/*!
- \class QOpenGLTexture
- \inmodule QtGui
- \since 5.2
- \wrapper
- \brief The QOpenGLTexture class encapsulates an OpenGL texture object.
-
- QOpenGLTexture makes it easy to work with OpenGL textures and the myriad features
- and targets that they offer depending upon the capabilities of your OpenGL implementation.
-
- The typical usage pattern for QOpenGLTexture is
- \list
- \li Instantiate the object specifying the texture target type
- \li Set properties that affect the storage requirements e.g. storage format, dimensions
- \li Allocate the server-side storage
- \li Optionally upload pixel data
- \li Optionally set any additional properties e.g. filtering and border options
- \li Render with texture or render to texture
- \endlist
-
- In the common case of simply using a QImage as the source of texture pixel data
- most of the above steps are performed automatically.
-
- \code
- // Prepare texture
- QOpenGLTexture *texture = new QOpenGLTexture(QImage(fileName).mirrored());
- texture->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
- texture->setMagnificationFilter(QOpenGLTexture::Linear);
- ...
- // Render with texture
- texture->bind();
- glDrawArrays(...);
- \endcode
-
- Note that the QImage is mirrored vertically to account for the fact that
- OpenGL and QImage use opposite directions for the y axis. Another option
- would be to transform your texture coordinates.
-*/
-
-/*!
- \enum QOpenGLTexture::Filter
- This enum defines the filtering parameters for a QOpenGLTexture object.
- \value Nearest Equivalent to GL_NEAREST
- \value Linear Equivalent to GL_LINEAR
- \value NearestMipMapNearest Equivalent to GL_NEAREST_MIPMAP_NEAREST
- \value NearestMipMapLinear Equivalent to GL_NEAREST_MIPMAP_LINEAR
- \value LinearMipMapNearest Equivalent to GL_LINEAR_MIPMAP_NEAREST
- \value LinearMipMapLinear Equivalent to GL_LINEAR_MIPMAP_LINEAR
-*/
-
-/*!
- \enum QOpenGLTexture::Target
- This enum defines the texture target of a QOpenGLTexture object.
- For more information on creating array textures, see \l{Array Texture}.
-
- \value Target1D A 1-dimensional texture.
- Equivalent to GL_TEXTURE_1D.
- \value Target1DArray An array of 1-dimensional textures.
- Equivalent to GL_TEXTURE_1D_ARRAY
- \value Target2D A 2-dimensional texture.
- Equivalent to GL_TEXTURE_2D
- \value Target2DArray An array of 2-dimensional textures.
- Equivalent to GL_TEXTURE_2D_ARRAY
- \value Target3D A 3-dimensional texture.
- Equivalent to GL_TEXTURE_3D
- \value TargetCubeMap A cubemap texture.
- Equivalent to GL_TEXTURE_CUBE_MAP
- \value TargetCubeMapArray An array of cubemap textures.
- Equivalent to GL_TEXTURE_CUBE_MAP_ARRAY
- \value Target2DMultisample A 2-dimensional texture with multisample support.
- Equivalent to GL_TEXTURE_2D_MULTISAMPLE
- \value Target2DMultisampleArray An array of 2-dimensional textures with multisample support.
- Equivalent to GL_TEXTURE_2D_MULTISAMPLE_ARRAY
- \value TargetRectangle A rectangular 2-dimensional texture.
- Equivalent to GL_TEXTURE_RECTANGLE
- \value TargetBuffer A texture with data from an OpenGL buffer object.
- Equivalent to GL_TEXTURE_BUFFER
-*/
-
-/*!
- \enum QOpenGLTexture::BindingTarget
- This enum defines the possible binding targets of texture units.
-
- \value BindingTarget1D Equivalent to GL_TEXTURE_BINDING_1D
- \value BindingTarget1DArray Equivalent to GL_TEXTURE_BINDING_1D_ARRAY
- \value BindingTarget2D Equivalent to GL_TEXTURE_BINDING_2D
- \value BindingTarget2DArray Equivalent to GL_TEXTURE_BINDING_2D_ARRAY
- \value BindingTarget3D Equivalent to GL_TEXTURE_BINDING_3D
- \value BindingTargetCubeMap Equivalent to GL_TEXTURE_BINDING_CUBE_MAP
- \value BindingTargetCubeMapArray Equivalent to GL_TEXTURE_BINDING_CUBE_MAP_ARRAY
- \value BindingTarget2DMultisample Equivalent to GL_TEXTURE_BINDING_2D_MULTISAMPLE
- \value BindingTarget2DMultisampleArray Equivalent to GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY
- \value BindingTargetRectangle Equivalent to GL_TEXTURE_BINDING_RECTANGLE
- \value BindingTargetBuffer Equivalent to GL_TEXTURE_BINDING_BUFFER
-*/
-
-/*!
- \enum QOpenGLTexture::MipMapGeneration
- This enum defines the options to control mipmap generation.
-
- \value GenerateMipMaps Mipmaps should be generated
- \value DontGenerateMipMaps Mipmaps should not be generated
-*/
-
-/*!
- \enum QOpenGLTexture::TextureUnitReset
- This enum defines options ot control texture unit activation.
-
- \value ResetTextureUnit The previous active texture unit will be reset
- \value DontResetTextureUnit The previous active texture unit will not be rest
-*/
-
-/*!
- \enum QOpenGLTexture::TextureFormat
- This enum defines the possible texture formats. Depending upon your OpenGL
- implementation only a subset of these may be supported.
-
- \value NoFormat Equivalent to GL_NONE
-
- \value R8_UNorm Equivalent to GL_R8
- \value RG8_UNorm Equivalent to GL_RG8
- \value RGB8_UNorm Equivalent to GL_RGB8
- \value RGBA8_UNorm Equivalent to GL_RGBA8
-
- \value R16_UNorm Equivalent to GL_R16
- \value RG16_UNorm Equivalent to GL_RG16
- \value RGB16_UNorm Equivalent to GL_RGB16
- \value RGBA16_UNorm Equivalent to GL_RGBA16
-
- \value R8_SNorm Equivalent to GL_R8_SNORM
- \value RG8_SNorm Equivalent to GL_RG8_SNORM
- \value RGB8_SNorm Equivalent to GL_RGB8_SNORM
- \value RGBA8_SNorm Equivalent to GL_RGBA8_SNORM
-
- \value R16_SNorm Equivalent to GL_R16_SNORM
- \value RG16_SNorm Equivalent to GL_RG16_SNORM
- \value RGB16_SNorm Equivalent to GL_RGB16_SNORM
- \value RGBA16_SNorm Equivalent to GL_RGBA16_SNORM
-
- \value R8U Equivalent to GL_R8UI
- \value RG8U Equivalent to GL_RG8UI
- \value RGB8U Equivalent to GL_RGB8UI
- \value RGBA8U Equivalent to GL_RGBA8UI
-
- \value R16U Equivalent to GL_R16UI
- \value RG16U Equivalent to GL_RG16UI
- \value RGB16U Equivalent to GL_RGB16UI
- \value RGBA16U Equivalent to GL_RGBA16UI
-
- \value R32U Equivalent to GL_R32UI
- \value RG32U Equivalent to GL_RG32UI
- \value RGB32U Equivalent to GL_RGB32UI
- \value RGBA32U Equivalent to GL_RGBA32UI
-
- \value R8I Equivalent to GL_R8I
- \value RG8I Equivalent to GL_RG8I
- \value RGB8I Equivalent to GL_RGB8I
- \value RGBA8I Equivalent to GL_RGBA8I
-
- \value R16I Equivalent to GL_R16I
- \value RG16I Equivalent to GL_RG16I
- \value RGB16I Equivalent to GL_RGB16I
- \value RGBA16I Equivalent to GL_RGBA16I
-
- \value R32I Equivalent to GL_R32I
- \value RG32I Equivalent to GL_RG32I
- \value RGB32I Equivalent to GL_RGB32I
- \value RGBA32I Equivalent to GL_RGBA32I
-
- \value R16F Equivalent to GL_R16F
- \value RG16F Equivalent to GL_RG16F
- \value RGB16F Equivalent to GL_RGB16F
- \value RGBA16F Equivalent to GL_RGBA16F
-
- \value R32F Equivalent to GL_R32F
- \value RG32F Equivalent to GL_RG32F
- \value RGB32F Equivalent to GL_RGB32F
- \value RGBA32F Equivalent to GL_RGBA32F
-
- \value RGB9E5 Equivalent to GL_RGB9_E5
- \value RG11B10F Equivalent to GL_R11F_G11F_B10F
- \value RG3B2 Equivalent to GL_R3_G3_B2
- \value R5G6B5 Equivalent to GL_RGB565
- \value RGB5A1 Equivalent to GL_RGB5_A1
- \value RGBA4 Equivalent to GL_RGBA4
- \value RGB10A2 Equivalent to GL_RGB10_A2UI
-
- \value D16 Equivalent to GL_DEPTH_COMPONENT16
- \value D24 Equivalent to GL_DEPTH_COMPONENT24
- \value D24S8 Equivalent to GL_DEPTH24_STENCIL8
- \value D32 Equivalent to GL_DEPTH_COMPONENT32
- \value D32F Equivalent to GL_DEPTH_COMPONENT32F
- \value D32FS8X24 Equivalent to GL_DEPTH32F_STENCIL8
- \value S8 Equivalent to GL_STENCIL_INDEX8. Introduced in Qt 5.4
-
- \value RGB_DXT1 Equivalent to GL_COMPRESSED_RGB_S3TC_DXT1_EXT
- \value RGBA_DXT1 Equivalent to GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
- \value RGBA_DXT3 Equivalent to GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
- \value RGBA_DXT5 Equivalent to GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
- \value R_ATI1N_UNorm Equivalent to GL_COMPRESSED_RED_RGTC1
- \value R_ATI1N_SNorm Equivalent to GL_COMPRESSED_SIGNED_RED_RGTC1
- \value RG_ATI2N_UNorm Equivalent to GL_COMPRESSED_RG_RGTC2
- \value RG_ATI2N_SNorm Equivalent to GL_COMPRESSED_SIGNED_RG_RGTC2
- \value RGB_BP_UNSIGNED_FLOAT Equivalent to GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
- \value RGB_BP_SIGNED_FLOAT Equivalent to GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
- \value RGB_BP_UNorm Equivalent to GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
- \value R11_EAC_UNorm Equivalent to GL_COMPRESSED_R11_EAC
- \value R11_EAC_SNorm Equivalent to GL_COMPRESSED_SIGNED_R11_EAC
- \value RG11_EAC_UNorm Equivalent to GL_COMPRESSED_RG11_EAC
- \value RG11_EAC_SNorm Equivalent to GL_COMPRESSED_SIGNED_RG11_EAC
- \value RGB8_ETC2 Equivalent to GL_COMPRESSED_RGB8_ETC2
- \value SRGB8_ETC2 Equivalent to GL_COMPRESSED_SRGB8_ETC2
- \value RGB8_PunchThrough_Alpha1_ETC2 Equivalent to GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
- \value SRGB8_PunchThrough_Alpha1_ETC2 Equivalent to GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
- \value RGBA8_ETC2_EAC Equivalent to GL_COMPRESSED_RGBA8_ETC2_EAC
- \value SRGB8_Alpha8_ETC2_EAC Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
- \value RGB8_ETC1 Equivalent to GL_ETC1_RGB8_OES
- \value RGBA_ASTC_4x4 Equivalent to GL_COMPRESSED_RGBA_ASTC_4x4_KHR
- \value RGBA_ASTC_5x4 Equivalent to GL_COMPRESSED_RGBA_ASTC_5x4_KHR
- \value RGBA_ASTC_5x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_5x5_KHR
- \value RGBA_ASTC_6x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_6x5_KHR
- \value RGBA_ASTC_6x6 Equivalent to GL_COMPRESSED_RGBA_ASTC_6x6_KHR
- \value RGBA_ASTC_8x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_8x5_KHR
- \value RGBA_ASTC_8x6 Equivalent to GL_COMPRESSED_RGBA_ASTC_8x6_KHR
- \value RGBA_ASTC_8x8 Equivalent to GL_COMPRESSED_RGBA_ASTC_8x8_KHR
- \value RGBA_ASTC_10x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x5_KHR
- \value RGBA_ASTC_10x6 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x6_KHR
- \value RGBA_ASTC_10x8 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x8_KHR
- \value RGBA_ASTC_10x10 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x10_KHR
- \value RGBA_ASTC_12x10 Equivalent to GL_COMPRESSED_RGBA_ASTC_12x10_KHR
- \value RGBA_ASTC_12x12 Equivalent to GL_COMPRESSED_RGBA_ASTC_12x12_KHR
- \value SRGB8_Alpha8_ASTC_4x4 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR
- \value SRGB8_Alpha8_ASTC_5x4 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR
- \value SRGB8_Alpha8_ASTC_5x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR
- \value SRGB8_Alpha8_ASTC_6x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR
- \value SRGB8_Alpha8_ASTC_6x6 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR
- \value SRGB8_Alpha8_ASTC_8x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR
- \value SRGB8_Alpha8_ASTC_8x6 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR
- \value SRGB8_Alpha8_ASTC_8x8 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR
- \value SRGB8_Alpha8_ASTC_10x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR
- \value SRGB8_Alpha8_ASTC_10x6 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR
- \value SRGB8_Alpha8_ASTC_10x8 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR
- \value SRGB8_Alpha8_ASTC_10x10 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR
- \value SRGB8_Alpha8_ASTC_12x10 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR
- \value SRGB8_Alpha8_ASTC_12x12 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR
-
- \value SRGB8 Equivalent to GL_SRGB8
- \value SRGB8_Alpha8 Equivalent to GL_SRGB8_ALPHA8
- \value SRGB_DXT1 Equivalent to GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
- \value SRGB_Alpha_DXT1 Equivalent to GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
- \value SRGB_Alpha_DXT3 Equivalent to GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
- \value SRGB_Alpha_DXT5 Equivalent to GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
- \value SRGB_BP_UNorm Equivalent to GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
-
- \value DepthFormat Equivalent to GL_DEPTH_COMPONENT (only OpenGL ES 3 or ES 2 with OES_depth_texture)
- \value AlphaFormat Equivalent to GL_ALPHA (OpenGL ES 2 only)
- \value RGBFormat Equivalent to GL_RGB (OpenGL ES 2 only)
- \value RGBAFormat Equivalent to GL_RGBA (OpenGL ES 2 only)
- \value LuminanceFormat Equivalent to GL_LUMINANCE (OpenGL ES 2 only)
- \value LuminanceAlphaFormat Equivalent to GL_LUMINANCE_ALPHA (OpenGL ES 2 only)
-*/
-
-/*!
- \enum QOpenGLTexture::CubeMapFace
- This enum defines the possible CubeMap faces.
-
- \value CubeMapPositiveX Equivalent to GL_TEXTURE_CUBE_MAP_POSITIVE_X
- \value CubeMapNegativeX Equivalent to GL_TEXTURE_CUBE_MAP_NEGATIVE_X
- \value CubeMapPositiveY Equivalent to GL_TEXTURE_CUBE_MAP_POSITIVE_Y
- \value CubeMapNegativeY Equivalent to GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
- \value CubeMapPositiveZ Equivalent to GL_TEXTURE_CUBE_MAP_POSITIVE_Z
- \value CubeMapNegativeZ Equivalent to GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
-*/
-
-/*!
- \enum QOpenGLTexture::PixelFormat
- This enum defines the possible client-side pixel formats for a pixel
- transfer operation.
-
- \value NoSourceFormat Equivalent to GL_NONE
- \value Red Equivalent to GL_RED
- \value RG Equivalent to GL_RG
- \value RGB Equivalent to GL_RGB
- \value BGR Equivalent to GL_BGR
- \value RGBA Equivalent to GL_RGBA
- \value BGRA Equivalent to GL_BGRA
- \value Red_Integer Equivalent to GL_RED_INTEGER
- \value RG_Integer Equivalent to GL_RG_INTEGER
- \value RGB_Integer Equivalent to GL_RGB_INTEGER
- \value BGR_Integer Equivalent to GL_BGR_INTEGER
- \value RGBA_Integer Equivalent to GL_RGBA_INTEGER
- \value BGRA_Integer Equivalent to GL_BGRA_INTEGER
- \value Stencil Equivalent to GL_STENCIL_INDEX. Introduced in Qt 5.4
- \value Depth Equivalent to GL_DEPTH_COMPONENT
- \value DepthStencil Equivalent to GL_DEPTH_STENCIL
- \value Alpha Equivalent to GL_ALPHA (OpenGL ES 2 only)
- \value Luminance Equivalent to GL_LUMINANCE (OpenGL ES 2 only)
- \value LuminanceAlpha Equivalent to GL_LUMINANCE_ALPHA (OpenGL ES 2 only)
-
-*/
-
-/*!
- \enum QOpenGLTexture::PixelType
- This enum defines the possible pixel data types for a pixel transfer operation
-
- \value NoPixelType Equivalent to GL_NONE
- \value Int8 Equivalent to GL_BYTE
- \value UInt8 Equivalent to GL_UNSIGNED_BYTE
- \value Int16 Equivalent to GL_SHORT
- \value UInt16 Equivalent to GL_UNSIGNED_SHORT
- \value Int32 Equivalent to GL_INT
- \value UInt32 Equivalent to GL_UNSIGNED_INT
- \value Float16 Equivalent to GL_HALF_FLOAT
- \value Float16OES Equivalent to GL_HALF_FLOAT_OES
- \value Float32 Equivalent to GL_FLOAT
- \value UInt32_RGB9_E5 Equivalent to GL_UNSIGNED_INT_5_9_9_9_REV
- \value UInt32_RG11B10F Equivalent to GL_UNSIGNED_INT_10F_11F_11F_REV
- \value UInt8_RG3B2 Equivalent to GL_UNSIGNED_BYTE_3_3_2
- \value UInt8_RG3B2_Rev Equivalent to GL_UNSIGNED_BYTE_2_3_3_REV
- \value UInt16_RGB5A1 Equivalent to GL_UNSIGNED_SHORT_5_5_5_1
- \value UInt16_RGB5A1_Rev Equivalent to GL_UNSIGNED_SHORT_1_5_5_5_REV
- \value UInt16_R5G6B5 Equivalent to GL_UNSIGNED_SHORT_5_6_5
- \value UInt16_R5G6B5_Rev Equivalent to GL_UNSIGNED_SHORT_5_6_5_REV
- \value UInt16_RGBA4 Equivalent to GL_UNSIGNED_SHORT_4_4_4_4
- \value UInt16_RGBA4_Rev Equivalent to GL_UNSIGNED_SHORT_4_4_4_4_REV
- \value UInt32_RGBA8 Equivalent to GL_UNSIGNED_INT_8_8_8_8
- \value UInt32_RGBA8_Rev Equivalent to GL_UNSIGNED_INT_8_8_8_8_REV
- \value UInt32_RGB10A2 Equivalent to GL_UNSIGNED_INT_10_10_10_2
- \value UInt32_RGB10A2_Rev Equivalent to GL_UNSIGNED_INT_2_10_10_10_REV
- \value UInt32_D24S8 Equivalent to GL_UNSIGNED_INT_24_8. Introduced in Qt 5.4
- \value Float32_D32_UInt32_S8_X24 Equivalent to GL_FLOAT_32_UNSIGNED_INT_24_8_REV. Introduced in Qt 5.4
-*/
-
-/*!
- \enum QOpenGLTexture::Feature
- This enum defines the OpenGL texture-related features that can be tested for.
-
- \value ImmutableStorage Support for immutable texture storage
- \value ImmutableMultisampleStorage Support for immutable texture storage with
- multisample targets
- \value TextureRectangle Support for the GL_TEXTURE_RECTANGLE target
- \value TextureArrays Support for texture targets with array layers
- \value Texture3D Support for the 3 dimensional texture target
- \value TextureMultisample Support for texture targets that have multisample capabilities
- \value TextureBuffer Support for textures that use OpenGL buffer objects
- as their data source
- \value TextureCubeMapArrays Support for cubemap array texture target
- \value Swizzle Support for texture component swizzle masks
- \value StencilTexturing Support for stencil texturing (i.e. looking up depth or stencil
- components of a combined depth/stencil format texture in GLSL shaders).
- \value AnisotropicFiltering Support for anisotropic texture filtering
- \value NPOTTextures Basic support for non-power-of-two textures
- \value NPOTTextureRepeat Full support for non-power-of-two textures including texture
- repeat modes
- \value Texture1D Support for the 1 dimensional texture target
- \value TextureComparisonOperators Support for texture comparison operators
- \value TextureMipMapLevel Support for setting the base and maximum mipmap levels
-*/
-
-/*!
- \enum QOpenGLTexture::SwizzleComponent
- This enum defines the texture color components that can be assigned a swizzle mask.
-
- \value SwizzleRed The red component. Equivalent to GL_TEXTURE_SWIZZLE_R
- \value SwizzleGreen The green component. Equivalent to GL_TEXTURE_SWIZZLE_G
- \value SwizzleBlue The blue component. Equivalent to GL_TEXTURE_SWIZZLE_B
- \value SwizzleAlpha The alpha component. Equivalent to GL_TEXTURE_SWIZZLE_A
-*/
-
-/*!
- \enum QOpenGLTexture::SwizzleValue
- This enum defines the possible mask values for texture swizzling.
-
- \value RedValue Maps the component to the red channel. Equivalent to GL_RED
- \value GreenValue Maps the component to the green channel. Equivalent to GL_GREEN
- \value BlueValue Maps the component to the blue channel. Equivalent to GL_BLUE
- \value AlphaValue Maps the component to the alpha channel. Equivalent to GL_ALPHA
- \value ZeroValue Maps the component to a fixed value of 0. Equivalent to GL_ZERO
- \value OneValue Maps the component to a fixed value of 1. Equivalent to GL_ONE
-*/
-
-/*!
- \enum QOpenGLTexture::WrapMode
- This enum defines the possible texture coordinate wrapping modes.
-
- \value Repeat Texture coordinate is repeated. Equivalent to GL_REPEAT
- \value MirroredRepeat Texture coordinate is reflected about 0 and 1. Equivalent to GL_MIRRORED_REPEAT
- \value ClampToEdge Clamps the texture coordinates to [0,1]. Equivalent to GL_CLAMP_TO_EDGE
- \value ClampToBorder As for ClampToEdge but also blends samples at 0 and 1 with a
- fixed border color. Equivalent to GL_CLAMP_TO_BORDER
-*/
-
-/*!
- \enum QOpenGLTexture::CoordinateDirection
- This enum defines the possible texture coordinate directions
-
- \value DirectionS The horizontal direction. Equivalent to GL_TEXTURE_WRAP_S
- \value DirectionT The vertical direction. Equivalent to GL_TEXTURE_WRAP_T
- \value DirectionR The depth direction. Equivalent to GL_TEXTURE_WRAP_R
-*/
-
-/*!
- Creates a QOpenGLTexture object that can later be bound to \a target.
-
- This does not create the underlying OpenGL texture object. Therefore,
- construction using this constructor does not require a valid current
- OpenGL context.
-*/
-QOpenGLTexture::QOpenGLTexture(Target target)
- : d_ptr(new QOpenGLTexturePrivate(target, this))
-{
-}
-
-/*!
- Creates a QOpenGLTexture object that can later be bound to the 2D texture
- target and contains the pixel data contained in \a image. If you wish
- to have a chain of mipmaps generated then set \a genMipMaps to \c true (this
- is the default).
-
- This does create the underlying OpenGL texture object. Therefore,
- construction using this constructor does require a valid current
- OpenGL context.
-*/
-QOpenGLTexture::QOpenGLTexture(const QImage& image, MipMapGeneration genMipMaps)
- : QOpenGLTexture(QOpenGLTexture::Target2D)
-{
- setData(image, genMipMaps);
-}
-
-QOpenGLTexture::~QOpenGLTexture()
-{
-}
-
-/*!
- Returns the binding target of this texture.
-
- \since 5.4
-*/
-QOpenGLTexture::Target QOpenGLTexture::target() const
-{
- Q_D(const QOpenGLTexture);
- return d->target;
-}
-
-/*!
- Creates the underlying OpenGL texture object. This requires a current valid
- OpenGL context. If the texture object already exists, this function does
- nothing.
-
- Once the texture object is created you can obtain the object
- name from the textureId() function. This may be useful if you wish to make
- some raw OpenGL calls related to this texture.
-
- Normally it should not be necessary to call this function directly as all
- functions that set properties of the texture object implicitly call create()
- on your behalf.
-
- Returns \c true if the creation succeeded, otherwise returns \c false.
-
- \sa destroy(), isCreated(), textureId()
-*/
-bool QOpenGLTexture::create()
-{
- Q_D(QOpenGLTexture);
- return d->create();
-}
-
-/*!
- Destroys the underlying OpenGL texture object. This requires a current valid
- OpenGL context.
-
- \sa create(), isCreated(), textureId()
-*/
-void QOpenGLTexture::destroy()
-{
- Q_D(QOpenGLTexture);
- return d->destroy();
-}
-
-/*!
- Returns \c true if the underlying OpenGL texture object has been created.
-
- \sa create(), destroy(), textureId()
-*/
-bool QOpenGLTexture::isCreated() const
-{
- Q_D(const QOpenGLTexture);
- return d->textureId != 0;
-}
-
-/*!
- Returns the name of the underlying OpenGL texture object or 0 if it has
- not yet been created.
-
- \sa create(), destroy(), isCreated()
-*/
-GLuint QOpenGLTexture::textureId() const
-{
- Q_D(const QOpenGLTexture);
- return d->textureId;
-}
-
-/*!
- Binds this texture to the currently active texture unit ready for
- rendering. Note that you do not need to bind QOpenGLTexture objects
- in order to modify them as the implementation makes use of the
- EXT_direct_state_access extension where available and simulates it
- where it is not.
-
- \sa release()
-*/
-void QOpenGLTexture::bind()
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->bind();
-}
-
-/*!
- Binds this texture to texture unit \a unit ready for
- rendering. Note that you do not need to bind QOpenGLTexture objects
- in order to modify them as the implementation makes use of the
- EXT_direct_state_access extension where available and simulates it
- where it is not.
-
- If parameter \a reset is \c true then this function will restore
- the active unit to the texture unit that was active upon entry.
-
- \sa release()
-*/
-void QOpenGLTexture::bind(uint unit, TextureUnitReset reset)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->bind(unit, reset);
-}
-
-/*!
- Unbinds this texture from the currently active texture unit.
-
- \sa bind()
-*/
-void QOpenGLTexture::release()
-{
- Q_D(QOpenGLTexture);
- d->release();
-}
-
-/*!
- Unbinds this texture from texture unit \a unit.
-
- If parameter \a reset is \c true then this function
- will restore the active unit to the texture unit that was active
- upon entry.
-*/
-void QOpenGLTexture::release(uint unit, TextureUnitReset reset)
-{
- Q_D(QOpenGLTexture);
- d->release(unit, reset);
-}
-
-/*!
- Returns \c true if this texture is bound to the corresponding target
- of the currently active texture unit.
-
- \sa bind(), release()
-*/
-bool QOpenGLTexture::isBound() const
-{
- Q_D(const QOpenGLTexture);
- Q_ASSERT(d->textureId);
- return d->isBound();
-}
-
-/*!
- Returns \c true if this texture is bound to the corresponding target
- of texture unit \a unit.
-
- \sa bind(), release()
-*/
-bool QOpenGLTexture::isBound(uint unit)
-{
- Q_D(const QOpenGLTexture);
- Q_ASSERT(d->textureId);
- return d->isBound(unit);
-}
-
-/*!
- Returns the textureId of the texture that is bound to the \a target
- of the currently active texture unit.
-*/
-GLuint QOpenGLTexture::boundTextureId(BindingTarget target)
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (!ctx) {
- qWarning("QOpenGLTexture::boundTextureId() requires a valid current context");
- return 0;
- }
-
- GLint textureId = 0;
- ctx->functions()->glGetIntegerv(target, &textureId);
- return static_cast<GLuint>(textureId);
-}
-
-/*!
- Returns the textureId of the texture that is bound to the \a target
- of the texture unit \a unit.
-*/
-GLuint QOpenGLTexture::boundTextureId(uint unit, BindingTarget target)
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (!ctx) {
- qWarning("QOpenGLTexture::boundTextureId() requires a valid current context");
- return 0;
- }
-
- QOpenGLFunctions *funcs = ctx->functions();
- funcs->initializeOpenGLFunctions();
-
- GLint oldTextureUnit = 0;
- funcs->glGetIntegerv(GL_ACTIVE_TEXTURE, &oldTextureUnit);
-
- funcs->glActiveTexture(unit);
- GLint textureId = 0;
- funcs->glGetIntegerv(target, &textureId);
- funcs->glActiveTexture(oldTextureUnit);
-
- return static_cast<GLuint>(textureId);
-}
-
-/*!
- Sets the format of this texture object to \a format. This function
- must be called before texture storage is allocated.
-
- Note that all formats may not be supported. The exact set of supported
- formats is dependent upon your OpenGL implementation and version.
-
- \sa format(), allocateStorage()
-*/
-void QOpenGLTexture::setFormat(TextureFormat format)
-{
- Q_D(QOpenGLTexture);
- d->create();
- if (isStorageAllocated()) {
- qWarning("QOpenGLTexture::setFormat(): Cannot change format once storage has been allocated");
- return;
- }
-
- d->format = format;
-
- switch (format) {
- case NoFormat:
- d->formatClass = NoFormatClass;
- break;
-
- case RGBA32F:
- case RGBA32U:
- case RGBA32I:
- d->formatClass = FormatClass_128Bit;
- break;
-
- case RGB32F:
- case RGB32U:
- case RGB32I:
- d->formatClass = FormatClass_96Bit;
- break;
-
- case RGBA16F:
- case RG32F:
- case RGBA16U:
- case RG32U:
- case RGBA16I:
- case RG32I:
- case RGBA16_UNorm:
- case RGBA16_SNorm:
- d->formatClass = FormatClass_64Bit;
- break;
-
- case RGB16_UNorm:
- case RGB16_SNorm:
- case RGB16F:
- case RGB16U:
- case RGB16I:
- d->formatClass = FormatClass_48Bit;
- break;
-
- case RG16F:
- case RG11B10F:
- case R32F:
- case RGB10A2:
- case RGBA8U:
- case RG16U:
- case R32U:
- case RGBA8I:
- case RG16I:
- case R32I:
- case RGBA8_UNorm:
- case RG16_UNorm:
- case RGBA8_SNorm:
- case RG16_SNorm:
- case SRGB8_Alpha8:
- case RGB9E5:
- d->formatClass = FormatClass_32Bit;
- break;
-
- case RGB8_UNorm:
- case RGB8_SNorm:
- case SRGB8:
- case RGB8U:
- case RGB8I:
- d->formatClass = FormatClass_24Bit;
- break;
-
- case R16F:
- case RG8U:
- case R16U:
- case RG8I:
- case R16I:
- case RG8_UNorm:
- case R16_UNorm:
- case RG8_SNorm:
- case R16_SNorm:
- d->formatClass = FormatClass_16Bit;
- break;
-
- case R8U:
- case R8I:
- case R8_UNorm:
- case R8_SNorm:
- d->formatClass = FormatClass_8Bit;
- break;
-
- case R_ATI1N_UNorm:
- case R_ATI1N_SNorm:
- d->formatClass = FormatClass_RGTC1_R;
- break;
-
- case RG_ATI2N_UNorm:
- case RG_ATI2N_SNorm:
- d->formatClass = FormatClass_RGTC2_RG;
- break;
-
- case RGB_BP_UNorm:
- case SRGB_BP_UNorm:
- d->formatClass = FormatClass_BPTC_Unorm;
- break;
-
- case RGB_BP_UNSIGNED_FLOAT:
- case RGB_BP_SIGNED_FLOAT:
- d->formatClass = FormatClass_BPTC_Float;
- break;
-
- case RGB_DXT1:
- case SRGB_DXT1:
- d->formatClass = FormatClass_S3TC_DXT1_RGB;
- break;
-
- case RGBA_DXT1:
- case SRGB_Alpha_DXT1:
- d->formatClass = FormatClass_S3TC_DXT1_RGBA;
- break;
-
- case RGBA_DXT3:
- case SRGB_Alpha_DXT3:
- d->formatClass = FormatClass_S3TC_DXT3_RGBA;
- break;
-
- case RGBA_DXT5:
- case SRGB_Alpha_DXT5:
- d->formatClass = FormatClass_S3TC_DXT5_RGBA;
- break;
-
- case QOpenGLTexture::R11_EAC_UNorm:
- case QOpenGLTexture::R11_EAC_SNorm:
- case QOpenGLTexture::RG11_EAC_UNorm:
- case QOpenGLTexture::RG11_EAC_SNorm:
- case QOpenGLTexture::RGB8_ETC2:
- case QOpenGLTexture::SRGB8_ETC2:
- case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
- case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
- case QOpenGLTexture::RGBA8_ETC2_EAC:
- case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
- case QOpenGLTexture::RGB8_ETC1:
- case RG3B2:
- case R5G6B5:
- case RGB5A1:
- case RGBA4:
- case D16:
- case D24:
- case D24S8:
- case D32:
- case D32F:
- case D32FS8X24:
- case S8:
- case DepthFormat:
- case AlphaFormat:
- case RGBFormat:
- case RGBAFormat:
- case LuminanceFormat:
- case LuminanceAlphaFormat:
- case QOpenGLTexture::RGBA_ASTC_4x4:
- case QOpenGLTexture::RGBA_ASTC_5x4:
- case QOpenGLTexture::RGBA_ASTC_5x5:
- case QOpenGLTexture::RGBA_ASTC_6x5:
- case QOpenGLTexture::RGBA_ASTC_6x6:
- case QOpenGLTexture::RGBA_ASTC_8x5:
- case QOpenGLTexture::RGBA_ASTC_8x6:
- case QOpenGLTexture::RGBA_ASTC_8x8:
- case QOpenGLTexture::RGBA_ASTC_10x5:
- case QOpenGLTexture::RGBA_ASTC_10x6:
- case QOpenGLTexture::RGBA_ASTC_10x8:
- case QOpenGLTexture::RGBA_ASTC_10x10:
- case QOpenGLTexture::RGBA_ASTC_12x10:
- case QOpenGLTexture::RGBA_ASTC_12x12:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
- case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
- d->formatClass = FormatClass_Unique;
- break;
- }
-}
-
-/*!
- Returns the format of this texture object.
-
- \sa setFormat()
-*/
-QOpenGLTexture::TextureFormat QOpenGLTexture::format() const
-{
- Q_D(const QOpenGLTexture);
- return d->format;
-}
-
-static bool isNpot(int width, int height = 1, int depth = 1)
-{
- return width & (width-1) || height & (height-1) || depth & (depth-1);
-}
-
-/*!
- Sets the dimensions of this texture object to \a width,
- \a height, and \a depth. The default for each dimension is 1.
- The maximum allowable texture size is dependent upon your OpenGL
- implementation. Allocating storage for a texture less than the
- maximum size can still fail if your system is low on resources.
-
- If a non-power-of-two \a width, \a height or \a depth is provided and your
- OpenGL implementation doesn't have support for repeating non-power-of-two
- textures, then the wrap mode is automatically set to ClampToEdge.
-
- \sa width(), height(), depth()
-*/
-void QOpenGLTexture::setSize(int width, int height, int depth)
-{
- Q_D(QOpenGLTexture);
- d->create();
- if (isStorageAllocated()) {
- qWarning("Cannot resize a texture that already has storage allocated.\n"
- "To do so, destroy() the texture and then create() and setSize()");
- return;
- }
-
- if (isNpot(width, height, depth) && !hasFeature(Feature::NPOTTextureRepeat) && d->target != Target::TargetRectangle)
- d->setWrapMode(WrapMode::ClampToEdge);
-
- switch (d->target) {
- case QOpenGLTexture::Target1D:
- case QOpenGLTexture::Target1DArray:
- case QOpenGLTexture::TargetBuffer:
- d->dimensions[0] = width;
- Q_UNUSED(height);
- Q_UNUSED(depth);
- break;
-
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::Target2DArray:
- case QOpenGLTexture::TargetRectangle:
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- d->dimensions[0] = width;
- d->dimensions[1] = height;
- Q_UNUSED(depth);
- break;
-
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetCubeMapArray:
- if (width != height)
- qWarning("QAbstractOpenGLTexture::setSize(): Cube map textures must be square");
- d->dimensions[0] = d->dimensions[1] = width;
- Q_UNUSED(depth);
- break;
-
- case QOpenGLTexture::Target3D:
- d->dimensions[0] = width;
- d->dimensions[1] = height;
- d->dimensions[2] = depth;
- break;
- }
-}
-
-/*!
- Returns the width of a 1D, 2D or 3D texture.
-
- \sa height(), depth(), setSize()
-*/
-int QOpenGLTexture::width() const
-{
- Q_D(const QOpenGLTexture);
- return d->dimensions[0];
-}
-
-/*!
- Returns the height of a 2D or 3D texture.
-
- \sa width(), depth(), setSize()
-*/
-int QOpenGLTexture::height() const
-{
- Q_D(const QOpenGLTexture);
- return d->dimensions[1];
-}
-
-/*!
- Returns the depth of a 3D texture.
-
- \sa width(), height(), setSize()
-*/
-int QOpenGLTexture::depth() const
-{
- Q_D(const QOpenGLTexture);
- return d->dimensions[2];
-}
-
-/*!
- For texture targets that support mipmaps, this function
- sets the requested number of mipmap \a levels to allocate storage
- for. This function should be called before storage is allocated
- for the texture.
-
- If the texture target does not support mipmaps this function
- has no effect.
-
- \sa mipLevels(), maximumMipLevels(), isStorageAllocated()
-*/
-void QOpenGLTexture::setMipLevels(int levels)
-{
- Q_D(QOpenGLTexture);
- d->create();
- if (isStorageAllocated()) {
- qWarning("Cannot set mip levels on a texture that already has storage allocated.\n"
- "To do so, destroy() the texture and then create() and setMipLevels()");
- return;
- }
-
- switch (d->target) {
- case QOpenGLTexture::Target1D:
- case QOpenGLTexture::Target1DArray:
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::Target2DArray:
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetCubeMapArray:
- case QOpenGLTexture::Target3D:
- d->requestedMipLevels = levels;
- break;
-
- case QOpenGLTexture::TargetBuffer:
- case QOpenGLTexture::TargetRectangle:
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- qWarning("QAbstractOpenGLTexture::setMipLevels(): This texture target does not support mipmaps");
- break;
- }
-}
-
-/*!
- Returns the number of mipmap levels for this texture. If storage
- has not yet been allocated for this texture it returns the
- requested number of mipmap levels.
-
- \sa setMipLevels(), maximumMipLevels(), isStorageAllocated()
-*/
-int QOpenGLTexture::mipLevels() const
-{
- Q_D(const QOpenGLTexture);
- return isStorageAllocated() ? d->mipLevels : d->requestedMipLevels;
-}
-
-/*!
- Returns the maximum number of mipmap levels that this texture
- can have given the current dimensions.
-
- \sa setMipLevels(), mipLevels(), setSize()
-*/
-int QOpenGLTexture::maximumMipLevels() const
-{
- Q_D(const QOpenGLTexture);
- return d->maximumMipLevelCount();
-}
-
-/*!
- Sets the number of array \a layers to allocate storage for. This
- function should be called before storage is allocated for the texture.
-
- For targets that do not support array layers this function has
- no effect.
-
- \sa layers(), isStorageAllocated()
-*/
-void QOpenGLTexture::setLayers(int layers)
-{
- Q_D(QOpenGLTexture);
- d->create();
- if (isStorageAllocated()) {
- qWarning("Cannot set layers on a texture that already has storage allocated.\n"
- "To do so, destroy() the texture and then create() and setLayers()");
- return;
- }
-
- switch (d->target) {
- case QOpenGLTexture::Target1DArray:
- case QOpenGLTexture::Target2DArray:
- case QOpenGLTexture::TargetCubeMapArray:
- case QOpenGLTexture::Target2DMultisampleArray:
- d->layers = layers;
- break;
-
- case QOpenGLTexture::Target1D:
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::Target3D:
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetBuffer:
- case QOpenGLTexture::TargetRectangle:
- case QOpenGLTexture::Target2DMultisample:
- qWarning("Texture target does not support array layers");
- break;
- }
-}
-
-/*!
- Returns the number of array layers for this texture. If
- storage has not yet been allocated for this texture then
- this function returns the requested number of array layers.
-
- For texture targets that do not support array layers this
- will return 1.
-
- \sa setLayers(), isStorageAllocated()
-*/
-int QOpenGLTexture::layers() const
-{
- Q_D(const QOpenGLTexture);
- return d->layers;
-}
-
-/*!
- Returns the number of faces for this texture. For cubemap
- and cubemap array type targets this will be 6.
-
- For non-cubemap type targets this will return 1.
-*/
-int QOpenGLTexture::faces() const
-{
- Q_D(const QOpenGLTexture);
- return d->faces;
-}
-
-/*!
- Sets the number of \a samples to allocate storage for when rendering to
- a multisample capable texture target. This function should
- be called before storage is allocated for the texture.
-
- For targets that do not support multisampling this function has
- no effect.
-
- \sa samples(), isStorageAllocated()
-*/
-void QOpenGLTexture::setSamples(int samples)
-{
- Q_D(QOpenGLTexture);
- d->create();
- if (isStorageAllocated()) {
- qWarning("Cannot set sample count on a texture that already has storage allocated.\n"
- "To do so, destroy() the texture and then create() and setSamples()");
- return;
- }
-
- switch (d->target) {
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- d->samples = samples;
- break;
-
- case QOpenGLTexture::Target1D:
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::Target3D:
- case QOpenGLTexture::Target1DArray:
- case QOpenGLTexture::Target2DArray:
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetCubeMapArray:
- case QOpenGLTexture::TargetBuffer:
- case QOpenGLTexture::TargetRectangle:
-
- qWarning("Texture target does not support multisampling");
- break;
- }
-}
-
-/*!
- Returns the number of multisample sample points for this texture.
- If storage has not yet been allocated for this texture then
- this function returns the requested number of samples.
-
- For texture targets that do not support multisampling this
- will return 0.
-
- \sa setSamples(), isStorageAllocated()
-*/
-int QOpenGLTexture::samples() const
-{
- Q_D(const QOpenGLTexture);
- return d->samples;
-}
-
-/*!
- Sets whether the sample positions and number of samples used with
- a multisample capable texture target to \a fixed. If set to \c true
- the sample positions and number of samples used are the same for
- all texels in the image and will not depend upon the image size or
- internal format. This function should be called before storage is allocated
- for the texture.
-
- For targets that do not support multisampling this function has
- no effect.
-
- The default value is \c true.
-
- \sa isFixedSamplePositions(), isStorageAllocated()
-*/
-void QOpenGLTexture::setFixedSamplePositions(bool fixed)
-{
- Q_D(QOpenGLTexture);
- d->create();
- if (isStorageAllocated()) {
- qWarning("Cannot set sample positions on a texture that already has storage allocated.\n"
- "To do so, destroy() the texture and then create() and setFixedSamplePositions()");
- return;
- }
-
- switch (d->target) {
- case QOpenGLTexture::Target2DMultisample:
- case QOpenGLTexture::Target2DMultisampleArray:
- d->fixedSamplePositions = fixed;
- break;
-
- case QOpenGLTexture::Target1D:
- case QOpenGLTexture::Target2D:
- case QOpenGLTexture::Target3D:
- case QOpenGLTexture::Target1DArray:
- case QOpenGLTexture::Target2DArray:
- case QOpenGLTexture::TargetCubeMap:
- case QOpenGLTexture::TargetCubeMapArray:
- case QOpenGLTexture::TargetBuffer:
- case QOpenGLTexture::TargetRectangle:
-
- qWarning("Texture target does not support multisampling");
- break;
- }
-}
-
-/*!
- Returns whether this texture uses a fixed pattern of multisample
- samples. If storage has not yet been allocated for this texture then
- this function returns the requested fixed sample position setting.
-
- For texture targets that do not support multisampling this
- will return \c true.
-
- \sa setFixedSamplePositions(), isStorageAllocated()
-*/
-bool QOpenGLTexture::isFixedSamplePositions() const
-{
- Q_D(const QOpenGLTexture);
- return d->fixedSamplePositions;
-}
-
-/*!
- Allocates server-side storage for this texture object taking
- into account, the format, dimensions, mipmap levels, array
- layers and cubemap faces.
-
- Once storage has been allocated it is no longer possible to change
- these properties.
-
- If supported QOpenGLTexture makes use of immutable texture
- storage.
-
- Once storage has been allocated for the texture then pixel data
- can be uploaded via one of the setData() overloads.
-
- \note If immutable texture storage is not available,
- then a default pixel format and pixel type will be used to
- create the mutable storage. You can use the other
- allocateStorage() overload to specify exactly the pixel format
- and the pixel type to use when allocating mutable storage;
- this is particulary useful under certain OpenGL ES implementations
- (notably, OpenGL ES 2), where the pixel format and the pixel type
- used at allocation time must perfectly match the format
- and the type passed to any subsequent setData() call.
-
- \sa isStorageAllocated(), setData()
-*/
-void QOpenGLTexture::allocateStorage()
-{
- Q_D(QOpenGLTexture);
- if (d->create()) {
- const QOpenGLTexture::PixelFormat pixelFormat = pixelFormatCompatibleWithInternalFormat(d->format);
- const QOpenGLTexture::PixelType pixelType = pixelTypeCompatibleWithInternalFormat(d->format);
- d->allocateStorage(pixelFormat, pixelType);
- }
-}
-
-/*!
- \since 5.5
-
- Allocates server-side storage for this texture object taking
- into account, the format, dimensions, mipmap levels, array
- layers and cubemap faces.
-
- Once storage has been allocated it is no longer possible to change
- these properties.
-
- If supported QOpenGLTexture makes use of immutable texture
- storage. However, if immutable texture storage is not available,
- then the specified \a pixelFormat and \a pixelType will be used
- to allocate mutable storage; note that in certain OpenGL implementations
- (notably, OpenGL ES 2) they must perfectly match the format
- and the type passed to any subsequent setData() call.
-
- Once storage has been allocated for the texture then pixel data
- can be uploaded via one of the setData() overloads.
-
- \sa isStorageAllocated(), setData()
-*/
-void QOpenGLTexture::allocateStorage(QOpenGLTexture::PixelFormat pixelFormat, QOpenGLTexture::PixelType pixelType)
-{
- Q_D(QOpenGLTexture);
- if (d->create())
- d->allocateStorage(pixelFormat, pixelType);
-}
-
-/*!
- Returns \c true if server-side storage for this texture as been
- allocated.
-
- The texture format, dimensions, mipmap levels and array layers
- cannot be altered once storage ihas been allocated.
-
- \sa allocateStorage(), setSize(), setMipLevels(), setLayers(), setFormat()
-*/
-bool QOpenGLTexture::isStorageAllocated() const
-{
- Q_D(const QOpenGLTexture);
- return d->storageAllocated;
-}
-
-/*!
- Attempts to create a texture view onto this texture. A texture
- view is somewhat analogous to a view in SQL in that it presents
- a restricted or reinterpreted view of the original data. Texture
- views do not allocate any more server-side storage, insted relying
- on the storage buffer of the source texture.
-
- Texture views are only available when using immutable storage. For
- more information on texture views see
- http://www.opengl.org/wiki/Texture_Storage#Texture_views.
-
- The \a target argument specifies the target to use for the view.
- Only some targets can be used depending upon the target of the original
- target. For e.g. a view onto a Target1DArray texture can specify
- either Target1DArray or Target1D but for the latter the number of
- array layers specified with \a minimumLayer and \a maximumLayer must
- be exactly 1.
-
- Simpliar constraints apply for the \a viewFormat. See the above link
- and the specification for more details.
-
- The \a minimumMipmapLevel, \a maximumMipmapLevel, \a minimumLayer,
- and \a maximumLayer arguments serve to restrict the parts of the
- texture accessible by the texture view.
-
- If creation of the texture view fails this function will return
- 0. If the function succeeds it will return a pointer to a new
- QOpenGLTexture object that will return \c true from its isTextureView()
- function.
-
- \sa isTextureView()
-*/
-QOpenGLTexture *QOpenGLTexture::createTextureView(Target target,
- TextureFormat viewFormat,
- int minimumMipmapLevel, int maximumMipmapLevel,
- int minimumLayer, int maximumLayer) const
-{
- Q_D(const QOpenGLTexture);
- if (!isStorageAllocated()) {
- qWarning("Cannot set create a texture view of a texture that does not have storage allocated.");
- return nullptr;
- }
- Q_ASSERT(maximumMipmapLevel >= minimumMipmapLevel);
- Q_ASSERT(maximumLayer >= minimumLayer);
- return d->createTextureView(target, viewFormat,
- minimumMipmapLevel, maximumMipmapLevel,
- minimumLayer, maximumLayer);
-}
-
-/*!
- Returns \c true if this texture object is actually a view onto another
- texture object.
-
- \sa createTextureView()
-*/
-bool QOpenGLTexture::isTextureView() const
-{
- Q_D(const QOpenGLTexture);
- Q_ASSERT(d->textureId);
- return d->textureView;
-}
-
-/*!
- Uploads pixel \a data for this texture object \a mipLevel, array \a layer, and \a cubeFace.
- Storage must have been allocated before uploading pixel data. Some overloads of setData()
- will set appropriate dimensions, mipmap levels, and array layers and then allocate storage
- for you if they have enough information to do so. This will be noted in the function
- documentation.
-
- The structure of the pixel data pointed to by \a data is specified by \a sourceFormat
- and \a sourceType. The pixel data upload can optionally be controlled by \a options.
-
- If using a compressed format() then you should use setCompressedData() instead of this
- function.
-
- \since 5.3
- \sa setCompressedData()
-*/
-void QOpenGLTexture::setData(int mipLevel, int layer, CubeMapFace cubeFace,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- if (!isStorageAllocated()) {
- qWarning("Cannot set data on a texture that does not have storage allocated.\n"
- "To do so call allocateStorage() before this function");
- return;
- }
- d->setData(mipLevel, layer, 1, cubeFace, sourceFormat, sourceType, data, options);
-}
-
-/*!
- \since 5.9
- \overload
-
- Parameter \a layerCount is the number of layers in a texture array
- that are being uploaded/populated by this call.
-*/
-void QOpenGLTexture::setData(int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace, QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType, const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- if (!isStorageAllocated()) {
- qWarning("Cannot set data on a texture that does not have storage allocated.\n"
- "To do so call allocateStorage() before this function");
- return;
- }
- d->setData(mipLevel, layer, layerCount, cubeFace, sourceFormat, sourceType, data, options);
-}
-
-/*!
- \since 5.3
- \overload
-*/
-void QOpenGLTexture::setData(int mipLevel, int layer,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setData(mipLevel, layer, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
-}
-
-/*!
- \since 5.3
- \overload
-*/
-void QOpenGLTexture::setData(int mipLevel,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setData(mipLevel, 0, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
-}
-
-/*!
- \since 5.3
- \overload
-*/
-void QOpenGLTexture::setData(PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setData(0, 0, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
-}
-
-/*!
- \since 5.14
- \overload
-
- This overload is to be used to update a part of the texture. Parameters \a
- xOffset, \a yOffset, \a zOffset specify the texel offsets within the
- texture. Parameters \a width, \a height and \a depth specify the dimensions
- of the sub image.
-
- The structure of the pixel data pointed to by \a data is specified by \a
- sourceFormat and \a sourceType. The pixel data upload can optionally be
- controlled by \a options.
-*/
-void QOpenGLTexture::setData(int xOffset, int yOffset, int zOffset,
- int width, int height, int depth,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setData(xOffset, yOffset, zOffset,
- width, height, depth,
- 0, 0, 1,
- QOpenGLTexture::CubeMapPositiveX, sourceFormat,
- sourceType, data, options);
-}
-
-/*!
- \since 5.14
- \overload
-
- This overload is to be used to update a part of the texture. Parameters \a
- xOffset, \a yOffset, \a zOffset specify the texel offsets within the
- texture. Parameters \a width, \a height and \a depth specify the dimensions
- of the sub image. The mip map level the sub image we want to
- update is specified with \a mipLevel.
-
- The structure of the pixel data pointed to by \a data is specified by \a
- sourceFormat and \a sourceType. The pixel data upload can optionally be
- controlled by \a options.
-*/
-void QOpenGLTexture::setData(int xOffset, int yOffset, int zOffset,
- int width, int height, int depth,
- int mipLevel,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setData(xOffset, yOffset, zOffset,
- width, height, depth,
- mipLevel, 0, 1,
- QOpenGLTexture::CubeMapPositiveX, sourceFormat,
- sourceType, data, options);
-}
-
-/*!
- \since 5.14
- \overload
-
- This overload is to be used to update a part of the texture. Parameters \a
- xOffset, \a yOffset, \a zOffset specify the texel offsets within the
- texture. Parameters \a width, \a height and \a depth specify the dimensions
- of the sub image. The mip map level and layerof the sub image we want to
- update are specified with \a mipLevel and \a layer.
-
- The structure of the pixel data pointed to by \a data is specified by \a
- sourceFormat and \a sourceType. The pixel data upload can optionally be
- controlled by \a options.
-*/
-void QOpenGLTexture::setData(int xOffset, int yOffset, int zOffset,
- int width, int height, int depth,
- int mipLevel, int layer,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setData(xOffset, yOffset, zOffset,
- width, height, depth,
- mipLevel, layer, 1,
- QOpenGLTexture::CubeMapPositiveX, sourceFormat,
- sourceType, data, options);
-}
-
-/*!
- \since 5.14
- \overload
-
- This overload is to be used to update a part of the texture. Parameters \a
- xOffset, \a yOffset, \a zOffset specify the texel offsets within the
- texture. Parameters \a width, \a height and \a depth specify the dimensions
- of the sub image.The mip map level, layer and cube map face of the sub
- image we want to update are specified with \a mipLevel, \a layer and \a
- face.
-
- The structure of the pixel data pointed to by \a data is specified by \a
- sourceFormat and \a sourceType. The pixel data upload can optionally be
- controlled by \a options.
-*/
-void QOpenGLTexture::setData(int xOffset, int yOffset, int zOffset,
- int width, int height, int depth,
- int mipLevel, int layer,
- CubeMapFace face,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setData(xOffset, yOffset, zOffset,
- width, height, depth,
- mipLevel, layer, 1,
- face, sourceFormat,
- sourceType, data, options);
-}
-
-/*!
- \since 5.14
- \overload
-
- This overload is to be used to update a part of the texture. Parameters \a
- xOffset, \a yOffset, \a zOffset specify the texel offsets within the
- texture. Parameters \a width, \a height and \a depth specify the dimensions
- of the sub image.The mip map level, starting layer, cube map face and
- number of layers of the sub image we want to update are specified with \a
- mipLevel, \a layer, \a face and \a layerCount.
-
- The structure of the pixel data pointed to by \a data is specified by \a
- sourceFormat and \a sourceType. The pixel data upload can optionally be
- controlled by \a options.
-*/
-void QOpenGLTexture::setData(int xOffset, int yOffset, int zOffset,
- int width, int height, int depth,
- int mipLevel, int layer,
- CubeMapFace face, int layerCount,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setData(xOffset, yOffset, zOffset,
- width, height, depth,
- mipLevel, layer, layerCount,
- face, sourceFormat,
- sourceType, data, options);
-}
-
-#if QT_DEPRECATED_SINCE(5, 3)
-/*!
- \obsolete
- \overload
-
- \sa setCompressedData()
-*/
-void QOpenGLTexture::setData(int mipLevel, int layer, CubeMapFace cubeFace,
- PixelFormat sourceFormat, PixelType sourceType,
- void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- if (!isStorageAllocated()) {
- qWarning("Cannot set data on a texture that does not have storage allocated.\n"
- "To do so call allocateStorage() before this function");
- return;
- }
- d->setData(mipLevel, layer, 1, cubeFace, sourceFormat, sourceType, data, options);
-}
-
-/*!
- \obsolete
- \overload
-*/
-void QOpenGLTexture::setData(int mipLevel, int layer,
- PixelFormat sourceFormat, PixelType sourceType,
- void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setData(mipLevel, layer, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
-}
-
-/*!
- \obsolete
- \overload
-*/
-void QOpenGLTexture::setData(int mipLevel,
- PixelFormat sourceFormat, PixelType sourceType,
- void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setData(mipLevel, 0, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
-}
-
-/*!
- \obsolete
- \overload
-*/
-void QOpenGLTexture::setData(PixelFormat sourceFormat, PixelType sourceType,
- void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setData(0, 0, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
-}
-#endif
-
-/*!
- This overload of setData() will allocate storage for you.
- The pixel data is contained in \a image. Mipmaps are generated by default.
- Set \a genMipMaps to \l DontGenerateMipMaps to turn off mipmap generation.
-
- \overload
-*/
-void QOpenGLTexture::setData(const QImage& image, MipMapGeneration genMipMaps)
-{
- QOpenGLContext *context = QOpenGLContext::currentContext();
- if (!context) {
- qWarning("QOpenGLTexture::setData() requires a valid current context");
- return;
- }
-
- if (image.isNull()) {
- qWarning("QOpenGLTexture::setData() tried to set a null image");
- return;
- }
-
- if (context->isOpenGLES() && context->format().majorVersion() < 3)
- setFormat(QOpenGLTexture::RGBAFormat);
- else
- setFormat(QOpenGLTexture::RGBA8_UNorm);
-
- setSize(image.width(), image.height());
- setMipLevels(genMipMaps == GenerateMipMaps ? maximumMipLevels() : 1);
- allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::UInt8);
-
- // Upload pixel data and generate mipmaps
- QImage glImage = image.convertToFormat(QImage::Format_RGBA8888);
- QOpenGLPixelTransferOptions uploadOptions;
- uploadOptions.setAlignment(1);
- setData(0, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, glImage.constBits(), &uploadOptions);
-}
-
-/*!
- Uploads compressed pixel \a data to \a mipLevel, array \a layer, and \a cubeFace.
- The pixel transfer can optionally be controlled with \a options. The \a dataSize
- argument should specify the size of the data pointed to by \a data.
-
- If not using a compressed format() then you should use setData() instead of this
- function.
-
- \since 5.3
-*/
-void QOpenGLTexture::setCompressedData(int mipLevel, int layer, CubeMapFace cubeFace,
- int dataSize, const void *data,
- const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- if (!isStorageAllocated()) {
- qWarning("Cannot set data on a texture that does not have storage allocated.\n"
- "To do so call allocateStorage() before this function");
- return;
- }
- d->setCompressedData(mipLevel, layer, 1, cubeFace, dataSize, data, options);
-}
-
-/*!
- \since 5.9
- \overload
-
- Parameter \a layerCount is the number of layers in a texture array
- that are being uploaded/populated by this call.
-*/
-void QOpenGLTexture::setCompressedData(int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace, int dataSize, const void *data, const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- if (!isStorageAllocated()) {
- qWarning("Cannot set data on a texture that does not have storage allocated.\n"
- "To do so call allocateStorage() before this function");
- return;
- }
- d->setCompressedData(mipLevel, layer, layerCount, cubeFace, dataSize, data, options);
-}
-
-/*!
- \overload
-*/
-void QOpenGLTexture::setCompressedData(int mipLevel, int layer, int dataSize, const void *data,
- const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setCompressedData(mipLevel, layer, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
-}
-
-/*!
- \overload
-*/
-void QOpenGLTexture::setCompressedData(int mipLevel, int dataSize, const void *data,
- const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setCompressedData(mipLevel, 0, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
-}
-
-/*!
- \overload
-*/
-void QOpenGLTexture::setCompressedData(int dataSize, const void *data,
- const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setCompressedData(0, 0, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
-}
-
-#if QT_DEPRECATED_SINCE(5, 3)
-/*!
- \obsolete
- \overload
-*/
-void QOpenGLTexture::setCompressedData(int mipLevel, int layer, CubeMapFace cubeFace,
- int dataSize, void *data,
- const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- if (!isStorageAllocated()) {
- qWarning("Cannot set data on a texture that does not have storage allocated.\n"
- "To do so call allocateStorage() before this function");
- return;
- }
- d->setCompressedData(mipLevel, layer, 1, cubeFace, dataSize, data, options);
-}
-
-/*!
- \obsolete
- \overload
-*/
-void QOpenGLTexture::setCompressedData(int mipLevel, int layer, int dataSize, void *data,
- const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setCompressedData(mipLevel, layer, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
-}
-
-/*!
- \obsolete
- \overload
-*/
-void QOpenGLTexture::setCompressedData(int mipLevel, int dataSize, void *data,
- const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setCompressedData(mipLevel, 0, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
-}
-
-/*!
- \obsolete
- \overload
-*/
-void QOpenGLTexture::setCompressedData(int dataSize, void *data,
- const QOpenGLPixelTransferOptions * const options)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->textureId);
- d->setCompressedData(0, 0, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
-}
-#endif
-
-/*!
- Returns \c true if your OpenGL implementation and version supports the texture
- feature \a feature.
-*/
-bool QOpenGLTexture::hasFeature(Feature feature)
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (!ctx) {
- qWarning("QOpenGLTexture::hasFeature() requires a valid current context");
- return false;
- }
-
- QSurfaceFormat f = ctx->format();
-
- bool supported = false;
-
-#if !defined(QT_OPENGL_ES_2)
- if (!ctx->isOpenGLES()) {
- switch (feature) {
- case ImmutableMultisampleStorage:
- supported = f.version() >= qMakePair(4, 3)
- || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_storage_multisample"));
- break;
-
- case TextureBuffer:
- supported = f.version() >= qMakePair(3, 0)
- || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_buffer_object"));
- break;
-
- case StencilTexturing:
- supported = f.version() >= qMakePair(4, 3)
- || ctx->hasExtension(QByteArrayLiteral("GL_ARB_stencil_texturing"));
- break;
-
- case ImmutableStorage:
- supported = f.version() >= qMakePair(4, 2)
- || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_storage"))
- || ctx->hasExtension(QByteArrayLiteral("GL_EXT_texture_storage"));
- break;
-
- case TextureCubeMapArrays:
- supported = f.version() >= qMakePair(4, 0)
- || ctx->hasExtension(QByteArrayLiteral("ARB_texture_cube_map_array"));
- break;
-
- case Swizzle:
- supported = f.version() >= qMakePair(3, 3)
- || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_swizzle"));
- break;
-
- case TextureMultisample:
- supported = f.version() >= qMakePair(3, 2)
- || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_multisample"));
- break;
-
- case TextureArrays:
- supported = f.version() >= qMakePair(3, 0)
- || ctx->hasExtension(QByteArrayLiteral("GL_EXT_texture_array"));
- break;
-
- case TextureRectangle:
- supported = f.version() >= qMakePair(2, 1)
- || ctx->hasExtension(QByteArrayLiteral("ARB_texture_rectangle"));
- break;
-
- case Texture3D:
- supported = f.version() >= qMakePair(1, 3);
- break;
-
- case AnisotropicFiltering:
- supported = ctx->hasExtension(QByteArrayLiteral("GL_EXT_texture_filter_anisotropic"));
- break;
-
- case NPOTTextures:
- case NPOTTextureRepeat:
- supported = ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_non_power_of_two"));
- break;
-
- case Texture1D:
- supported = f.version() >= qMakePair(1, 1);
- break;
-
- case TextureComparisonOperators:
- // GL 1.4 and GL_ARB_shadow alone support only LEQUAL and GEQUAL;
- // since we're talking about history anyhow avoid to be extra pedantic
- // in the feature set, and simply claim supported if we have the full set of operators
- // (which has been added into 1.5 / GL_EXT_shadow_funcs).
- supported = f.version() >= qMakePair(1, 5)
- || (ctx->hasExtension(QByteArrayLiteral("GL_ARB_shadow"))
- && ctx->hasExtension(QByteArrayLiteral("GL_EXT_shadow_funcs")));
- break;
-
- case TextureMipMapLevel:
- supported = f.version() >= qMakePair(1, 2);
- break;
-
- case MaxFeatureFlag:
- break;
- }
- }
-
- if (ctx->isOpenGLES())
-#endif
- {
- const char *renderer = reinterpret_cast<const char *>(ctx->functions()->glGetString(GL_RENDERER));
- switch (feature) {
- case ImmutableStorage:
- supported = (f.version() >= qMakePair(3, 0) || ctx->hasExtension(QByteArrayLiteral("GL_EXT_texture_storage")))
- && !(renderer && strstr(renderer, "Mali")); // do not use on Mali: QTBUG-45106
- break;
-
- case ImmutableMultisampleStorage:
- supported = f.version() >= qMakePair(3, 1);
- break;
-
- case TextureRectangle:
- break;
-
- case TextureArrays:
- supported = f.version() >= qMakePair(3, 0);
- break;
-
- case Texture3D:
- supported = f.version() >= qMakePair(3, 0)
- || ctx->hasExtension(QByteArrayLiteral("GL_OES_texture_3D"));
- break;
-
- case TextureMultisample:
- supported = f.version() >= qMakePair(3, 1);
- break;
-
- case TextureBuffer:
- break;
-
- case TextureCubeMapArrays:
- break;
-
- case Swizzle:
- supported = f.version() >= qMakePair(3, 0);
- break;
-
- case StencilTexturing:
- break;
-
- case AnisotropicFiltering:
- supported = ctx->hasExtension(QByteArrayLiteral("GL_EXT_texture_filter_anisotropic"));
- break;
-
- case NPOTTextures:
- case NPOTTextureRepeat:
- supported = f.version() >= qMakePair(3,0)
- || ctx->hasExtension(QByteArrayLiteral("GL_OES_texture_npot"))
- || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_non_power_of_two"));
- break;
-
- case Texture1D:
- break;
-
- case TextureComparisonOperators:
- supported = f.version() >= qMakePair(3, 0)
- || ctx->hasExtension(QByteArrayLiteral("GL_EXT_shadow_samplers"));
- break;
-
- case TextureMipMapLevel:
- supported = f.version() >= qMakePair(3, 0);
- break;
-
- case MaxFeatureFlag:
- break;
- }
- }
-
- return supported;
-}
-
-/*!
- Sets the base mipmap level used for all texture lookups with this texture to \a baseLevel.
-
- \note This function has no effect on Qt built for OpenGL ES 2.
- \sa mipBaseLevel(), setMipMaxLevel(), setMipLevelRange()
-*/
-void QOpenGLTexture::setMipBaseLevel(int baseLevel)
-{
- Q_D(QOpenGLTexture);
- d->create();
- if (!d->features.testFlag(TextureMipMapLevel)) {
- qWarning("QOpenGLTexture::setMipBaseLevel: requires OpenGL >= 1.2 or OpenGL ES >= 3.0");
- return;
- }
- Q_ASSERT(d->textureId);
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(baseLevel <= d->maxLevel);
- d->baseLevel = baseLevel;
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_BASE_LEVEL, baseLevel);
-}
-
-/*!
- Returns the mipmap base level used for all texture lookups with this texture.
- The default is 0.
-
- \sa setMipBaseLevel(), mipMaxLevel(), mipLevelRange()
-*/
-int QOpenGLTexture::mipBaseLevel() const
-{
- Q_D(const QOpenGLTexture);
- return d->baseLevel;
-}
-
-/*!
- Sets the maximum mipmap level used for all texture lookups with this texture to \a maxLevel.
-
- \note This function has no effect on Qt built for OpenGL ES 2.
- \sa mipMaxLevel(), setMipBaseLevel(), setMipLevelRange()
-*/
-void QOpenGLTexture::setMipMaxLevel(int maxLevel)
-{
- Q_D(QOpenGLTexture);
- d->create();
- if (!d->features.testFlag(TextureMipMapLevel)) {
- qWarning("QOpenGLTexture::setMipMaxLevel: requires OpenGL >= 1.2 or OpenGL ES >= 3.0");
- return;
- }
- Q_ASSERT(d->textureId);
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->baseLevel <= maxLevel);
- d->maxLevel = maxLevel;
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAX_LEVEL, maxLevel);
-}
-
-/*!
- Returns the mipmap maximum level used for all texture lookups with this texture.
-
- \sa setMipMaxLevel(), mipBaseLevel(), mipLevelRange()
-*/
-int QOpenGLTexture::mipMaxLevel() const
-{
- Q_D(const QOpenGLTexture);
- return d->maxLevel;
-}
-
-/*!
- Sets the range of mipmap levels that can be used for texture lookups with this texture
- to range from \a baseLevel to \a maxLevel.
-
- \note This function has no effect on Qt built for OpenGL ES 2.
- \sa setMipBaseLevel(), setMipMaxLevel(), mipLevelRange()
-*/
-void QOpenGLTexture::setMipLevelRange(int baseLevel, int maxLevel)
-{
- Q_D(QOpenGLTexture);
- d->create();
- if (!d->features.testFlag(TextureMipMapLevel)) {
- qWarning("QOpenGLTexture::setMipLevelRange: requires OpenGL >= 1.2 or OpenGL ES >= 3.0");
- return;
- }
- Q_ASSERT(d->textureId);
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(baseLevel <= maxLevel);
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_BASE_LEVEL, baseLevel);
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAX_LEVEL, maxLevel);
-}
-
-/*!
- Returns the range of mipmap levels that can be used for texture lookups with this texture.
-
- \sa mipBaseLevel(), mipMaxLevel()
-*/
-QPair<int, int> QOpenGLTexture::mipLevelRange() const
-{
- Q_D(const QOpenGLTexture);
- return qMakePair(d->baseLevel, d->maxLevel);
-}
-
-/*!
- If \a enabled is \c true, enables automatic mipmap generation for this texture object
- to occur whenever the level 0 mipmap data is set via setData().
-
- The automatic mipmap generation is enabled by default.
-
- \note Mipmap generation is not supported for compressed textures with OpenGL ES 2.0.
-
- \sa isAutoMipMapGenerationEnabled(), generateMipMaps()
-*/
-void QOpenGLTexture::setAutoMipMapGenerationEnabled(bool enabled)
-{
- Q_D(QOpenGLTexture);
- d->autoGenerateMipMaps = enabled;
-}
-
-/*!
- Returns whether auto mipmap generation is enabled for this texture object.
-
- \sa setAutoMipMapGenerationEnabled(), generateMipMaps()
-*/
-bool QOpenGLTexture::isAutoMipMapGenerationEnabled() const
-{
- Q_D(const QOpenGLTexture);
- return d->autoGenerateMipMaps;
-}
-
-/*!
- Generates mipmaps for this texture object from mipmap level 0. If you are
- using a texture target and filtering option that requires mipmaps and you
- have disabled automatic mipmap generation then you need to call this function
- or the overload to create the mipmap chain.
-
- \note Mipmap generation is not supported for compressed textures with OpenGL ES.
-
- \sa setAutoMipMapGenerationEnabled(), setMipLevels(), mipLevels()
-*/
-void QOpenGLTexture::generateMipMaps()
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- if (isCompressedFormat(d->format)) {
- if (QOpenGLContext *ctx = QOpenGLContext::currentContext())
- if (ctx->isOpenGLES())
- return;
- }
- d->texFuncs->glGenerateTextureMipmap(d->textureId, d->target, d->bindingTarget);
-}
-
-/*!
- Generates mipmaps for this texture object from mipmap level \a baseLevel. If you are
- using a texture target and filtering option that requires mipmaps and you
- have disabled automatic mipmap generation then you need to call this function
- or the overload to create the mipmap chain.
-
- The generation of mipmaps to above \a baseLevel is achieved by setting the mipmap
- base level to \a baseLevel and then generating the mipmap chain. If \a resetBaseLevel
- is \c true, then the baseLevel of the texture will be reset to its previous value.
-
- \sa setAutoMipMapGenerationEnabled(), setMipLevels(), mipLevels()
-*/
-void QOpenGLTexture::generateMipMaps(int baseLevel, bool resetBaseLevel)
-{
- Q_D(QOpenGLTexture);
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- if (isCompressedFormat(d->format)) {
- if (QOpenGLContext *ctx = QOpenGLContext::currentContext())
- if (ctx->isOpenGLES())
- return;
- }
- int oldBaseLevel;
- if (resetBaseLevel)
- oldBaseLevel = mipBaseLevel();
- setMipBaseLevel(baseLevel);
- d->texFuncs->glGenerateTextureMipmap(d->textureId, d->target, d->bindingTarget);
- if (resetBaseLevel)
- setMipBaseLevel(oldBaseLevel);
-}
-
-/*!
- GLSL shaders are able to reorder the components of the vec4 returned by texture
- functions. It is also desirable to be able to control this reordering from CPU
- side code. This is made possible by swizzle masks since OpenGL 3.3.
-
- Each component of the texture can be mapped to one of the SwizzleValue options.
-
- This function maps \a component to the output \a value.
-
- \note This function has no effect on Mac and Qt built for OpenGL ES 2.
- \sa swizzleMask()
-*/
-void QOpenGLTexture::setSwizzleMask(SwizzleComponent component, SwizzleValue value)
-{
-#if !defined(Q_OS_MAC) && !defined(QT_OPENGL_ES_2)
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- if (!d->features.testFlag(Swizzle)) {
- qWarning("QOpenGLTexture::setSwizzleMask() requires OpenGL >= 3.3");
- return;
- }
- d->swizzleMask[component - SwizzleRed] = value;
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, component, value);
- return;
- }
-#else
- Q_UNUSED(component);
- Q_UNUSED(value);
-#endif
- qWarning("QOpenGLTexture: Texture swizzling is not supported");
-}
-
-/*!
- Parameters \a {r}, \a {g}, \a {b}, and \a {a} are values used for setting
- the colors red, green, blue, and the alpha value.
- \overload
-*/
-void QOpenGLTexture::setSwizzleMask(SwizzleValue r, SwizzleValue g,
- SwizzleValue b, SwizzleValue a)
-{
-#if !defined(Q_OS_MAC) && !defined(QT_OPENGL_ES_2)
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- if (!d->features.testFlag(Swizzle)) {
- qWarning("QOpenGLTexture::setSwizzleMask() requires OpenGL >= 3.3");
- return;
- }
- GLint swizzleMask[] = {GLint(r), GLint(g), GLint(b), GLint(a)};
- d->swizzleMask[0] = r;
- d->swizzleMask[1] = g;
- d->swizzleMask[2] = b;
- d->swizzleMask[3] = a;
- d->texFuncs->glTextureParameteriv(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
- return;
- }
-#else
- Q_UNUSED(r);
- Q_UNUSED(g);
- Q_UNUSED(b);
- Q_UNUSED(a);
-#endif
- qWarning("QOpenGLTexture: Texture swizzling is not supported");
-}
-
-/*!
- Returns the swizzle mask for texture \a component.
-*/
-QOpenGLTexture::SwizzleValue QOpenGLTexture::swizzleMask(SwizzleComponent component) const
-{
- Q_D(const QOpenGLTexture);
- return d->swizzleMask[component - SwizzleRed];
-}
-
-/*!
- \enum QOpenGLTexture::DepthStencilMode
- \since 5.4
- This enum specifies which component of a depth/stencil texture is
- accessed when the texture is sampled.
-
- \value DepthMode Equivalent to GL_DEPTH_COMPONENT.
- \value StencilMode Equivalent to GL_STENCIL_INDEX.
-*/
-
-/*!
- If using a texture that has a combined depth/stencil format this function sets
- which component of the texture is accessed to \a mode.
-
- When the parameter is set to DepthMode, then accessing it from the
- shader will access the depth component as a single float, as normal. But when
- the parameter is set to StencilMode, the shader will access the stencil component.
-
- \note This function has no effect on Mac and Qt built for OpenGL ES 2.
- \since 5.4
- \sa depthStencilMode()
-*/
-void QOpenGLTexture::setDepthStencilMode(QOpenGLTexture::DepthStencilMode mode)
-{
-#if !defined(Q_OS_MAC) && !defined(QT_OPENGL_ES_2)
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- if (!d->features.testFlag(StencilTexturing)) {
- qWarning("QOpenGLTexture::setDepthStencilMode() requires OpenGL >= 4.3 or GL_ARB_stencil_texturing");
- return;
- }
- d->depthStencilMode = mode;
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_DEPTH_STENCIL_TEXTURE_MODE, mode);
- return;
- }
-#else
- Q_UNUSED(mode);
-#endif
- qWarning("QOpenGLTexture: DepthStencil Mode is not supported");
-}
-
-/*!
- Returns the depth stencil mode for textures using a combined depth/stencil format.
-
- \since 5.4
- \sa setDepthStencilMode()
-*/
-QOpenGLTexture::DepthStencilMode QOpenGLTexture::depthStencilMode() const
-{
- Q_D(const QOpenGLTexture);
- return d->depthStencilMode;
-}
-
-/*!
- \enum QOpenGLTexture::ComparisonFunction
- \since 5.5
- This enum specifies which comparison operator is used when texture comparison
- is enabled on this texture.
-
- \value CompareLessEqual Equivalent to GL_LEQUAL.
- \value CompareGreaterEqual Equivalent to GL_GEQUAL.
- \value CompareLess Equivalent to GL_LESS.
- \value CompareGreater Equivalent to GL_GREATER.
- \value CompareEqual Equivalent to GL_EQUAL.
- \value CommpareNotEqual Equivalent to GL_NOTEQUAL.
- \value CompareAlways Equivalent to GL_ALWAYS.
- \value CompareNever Equivalent to GL_NEVER.
-
-*/
-
-/*!
- \since 5.5
-
- Sets the texture comparison function on this texture to \a function. The texture
- comparison function is used by shadow samplers when sampling a depth texture.
-
- \sa comparisonFunction()
-*/
-void QOpenGLTexture::setComparisonFunction(QOpenGLTexture::ComparisonFunction function)
-{
- Q_D(QOpenGLTexture);
- d->create();
- if (!d->features.testFlag(TextureComparisonOperators)) {
- qWarning("QOpenGLTexture::setComparisonFunction: requires OpenGL >= 1.5 or OpenGL ES >= 3.0");
- return;
- }
- d->comparisonFunction = function;
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_COMPARE_FUNC, function);
-}
-
-/*!
- \since 5.5
-
- Returns the texture comparison operator set on this texture. By default, a
- texture has a CompareLessEqual comparison function.
-
- \sa setComparisonFunction()
-*/
-QOpenGLTexture::ComparisonFunction QOpenGLTexture::comparisonFunction() const
-{
- Q_D(const QOpenGLTexture);
- return d->comparisonFunction;
-}
-
-/*!
- \enum QOpenGLTexture::ComparisonMode
- \since 5.5
- This enum specifies which comparison mode is used when sampling this texture.
-
- \value CompareRefToTexture Equivalent to GL_COMPARE_REF_TO_TEXTURE.
- \value CompareNone Equivalent to GL_NONE.
-*/
-
-/*!
- \since 5.5
-
- Sets the texture comparison mode on this texture to \a mode. The texture
- comparison mode is used by shadow samplers when sampling a depth texture.
-
- \sa comparisonMode()
-*/
-void QOpenGLTexture::setComparisonMode(QOpenGLTexture::ComparisonMode mode)
-{
- Q_D(QOpenGLTexture);
- d->create();
- if (!d->features.testFlag(TextureComparisonOperators)) {
- qWarning("QOpenGLTexture::setComparisonMode: requires OpenGL >= 1.5 or OpenGL ES >= 3.0");
- return;
- }
- d->comparisonMode = mode;
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_COMPARE_MODE, mode);
-}
-
-/*!
- \since 5.5
-
- Returns the texture comparison mode set on this texture. By default, a
- texture has a CompareNone comparison mode (i.e. comparisons are disabled).
-
- \sa setComparisonMode()
-*/
-QOpenGLTexture::ComparisonMode QOpenGLTexture::comparisonMode() const
-{
- Q_D(const QOpenGLTexture);
- return d->comparisonMode;
-}
-
-/*!
- Sets the filter used for minification to \a filter.
-
- \sa minificationFilter(), setMagnificationFilter(), setMinMagFilters()
-*/
-void QOpenGLTexture::setMinificationFilter(QOpenGLTexture::Filter filter)
-{
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- d->minFilter = filter;
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MIN_FILTER, filter);
-}
-
-/*!
- Returns the minification filter.
-
- \sa setMinificationFilter()
-*/
-QOpenGLTexture::Filter QOpenGLTexture::minificationFilter() const
-{
- Q_D(const QOpenGLTexture);
- return d->minFilter;
-}
-
-/*!
- Sets the magnification filter to \a filter.
-
- \sa magnificationFilter(), setMinificationFilter(), setMinMagFilters()
-*/
-void QOpenGLTexture::setMagnificationFilter(QOpenGLTexture::Filter filter)
-{
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- d->magFilter = filter;
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAG_FILTER, filter);
-}
-
-/*!
- Returns the magnification filter.
-
- \sa setMagnificationFilter()
-*/
-QOpenGLTexture::Filter QOpenGLTexture::magnificationFilter() const
-{
- Q_D(const QOpenGLTexture);
- return d->magFilter;
-}
-
-/*!
- Sets the minification filter to \a minificationFilter and the magnification filter
- to \a magnificationFilter.
-
- \sa minMagFilters(), setMinificationFilter(), setMagnificationFilter()
-*/
-void QOpenGLTexture::setMinMagFilters(QOpenGLTexture::Filter minificationFilter,
- QOpenGLTexture::Filter magnificationFilter)
-{
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- d->minFilter = minificationFilter;
- d->magFilter = magnificationFilter;
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MIN_FILTER, minificationFilter);
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAG_FILTER, magnificationFilter);
-}
-
-/*!
- Returns the current minification and magnification filters.
-
- \sa setMinMagFilters()
-*/
-QPair<QOpenGLTexture::Filter, QOpenGLTexture::Filter> QOpenGLTexture::minMagFilters() const
-{
- Q_D(const QOpenGLTexture);
- return QPair<QOpenGLTexture::Filter, QOpenGLTexture::Filter>(d->minFilter, d->magFilter);
-}
-
-/*!
- If your OpenGL implementation supports the GL_EXT_texture_filter_anisotropic extension
- this function sets the maximum anisotropy level to \a anisotropy.
-
- \sa maximumAnisotropy()
-*/
-void QOpenGLTexture::setMaximumAnisotropy(float anisotropy)
-{
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- if (!d->features.testFlag(AnisotropicFiltering)) {
- qWarning("QOpenGLTexture::setMaximumAnisotropy() requires GL_EXT_texture_filter_anisotropic");
- return;
- }
- d->maxAnisotropy = anisotropy;
- d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisotropy);
-}
-
-/*!
- Returns the maximum level of anisotropy to be accounted for when performing texture lookups.
- This requires the GL_EXT_texture_filter_anisotropic extension.
-
- \sa setMaximumAnisotropy()
-*/
-float QOpenGLTexture::maximumAnisotropy() const
-{
- Q_D(const QOpenGLTexture);
- return d->maxAnisotropy;
-}
-
-/*!
- Sets the wrap (or repeat mode) for all texture dimentions to \a mode.
-
- \sa wrapMode()
-*/
-void QOpenGLTexture::setWrapMode(QOpenGLTexture::WrapMode mode)
-{
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- d->setWrapMode(mode);
-}
-
-/*!
- Holds the texture dimension \a direction.
- \overload
-*/
-void QOpenGLTexture::setWrapMode(QOpenGLTexture::CoordinateDirection direction, QOpenGLTexture::WrapMode mode)
-{
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- d->setWrapMode(direction, mode);
-}
-
-/*!
- Returns the wrap mode for the texture dimension \a direction.
-
- \sa setWrapMode()
-*/
-QOpenGLTexture::WrapMode QOpenGLTexture::wrapMode(QOpenGLTexture::CoordinateDirection direction) const
-{
- Q_D(const QOpenGLTexture);
- return d->wrapMode(direction);
-}
-
-/*!
- Sets the border color of the texture to \a color.
-
- \note This function has no effect on Mac and Qt built for OpenGL ES 2.
- \sa borderColor()
-*/
-void QOpenGLTexture::setBorderColor(QColor color)
-{
- setBorderColor(static_cast<float>(color.redF()), static_cast<float>(color.greenF()),
- static_cast<float>(color.blueF()), static_cast<float>(color.alphaF()));
-}
-
-/*!
- Sets the color red to \a {r}, green to \a {g}, blue to \a {b}, and \a {a} to the
- alpha value.
- \overload
-*/
-void QOpenGLTexture::setBorderColor(float r, float g, float b, float a)
-{
-#if !defined(QT_OPENGL_ES_2)
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- float values[4];
- values[0] = r;
- values[1] = g;
- values[2] = b;
- values[3] = a;
- d->borderColor.clear();
- for (int i = 0; i < 4; ++i)
- d->borderColor.append(QVariant(values[i]));
- d->texFuncs->glTextureParameterfv(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_BORDER_COLOR, values);
- return;
- }
-#else
- Q_UNUSED(r);
- Q_UNUSED(g);
- Q_UNUSED(b);
- Q_UNUSED(a);
-#endif
- qWarning("QOpenGLTexture: Border color is not supported");
-}
-
-/*!
- Sets the color red to \a {r}, green to \a {g}, blue to \a {b}, and the alpha
- value to \a {a}.
- \overload
-*/
-void QOpenGLTexture::setBorderColor(int r, int g, int b, int a)
-{
-#if !defined(QT_OPENGL_ES_2)
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- int values[4];
- values[0] = r;
- values[1] = g;
- values[2] = b;
- values[3] = a;
- d->borderColor.clear();
- for (int i = 0; i < 4; ++i)
- d->borderColor.append(QVariant(values[i]));
- d->texFuncs->glTextureParameteriv(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_BORDER_COLOR, values);
- return;
- }
-#else
- Q_UNUSED(r);
- Q_UNUSED(g);
- Q_UNUSED(b);
- Q_UNUSED(a);
-#endif
- qWarning("QOpenGLTexture: Border color is not supported");
-
- // TODO Handle case of using glTextureParameterIiv() based on format
-}
-
-/*!
- Sets the color red to \a {r}, green to \a {g}, blue to \a {b}, and the alpha
- value to \a {a}.
- \overload
-*/
-void QOpenGLTexture::setBorderColor(uint r, uint g, uint b, uint a)
-{
-#if !defined(QT_OPENGL_ES_2)
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- int values[4];
- values[0] = int(r);
- values[1] = int(g);
- values[2] = int(b);
- values[3] = int(a);
- d->borderColor.clear();
- for (int i = 0; i < 4; ++i)
- d->borderColor.append(QVariant(values[i]));
- d->texFuncs->glTextureParameteriv(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_BORDER_COLOR, values);
- return;
- }
-#else
- Q_UNUSED(r);
- Q_UNUSED(g);
- Q_UNUSED(b);
- Q_UNUSED(a);
-#endif
- qWarning("QOpenGLTexture: Border color is not supported");
-
- // TODO Handle case of using glTextureParameterIuiv() based on format
-}
-
-/*!
- Returns the borderColor of this texture.
-
- \sa setBorderColor()
-*/
-QColor QOpenGLTexture::borderColor() const
-{
- Q_D(const QOpenGLTexture);
- QColor c(0.0f, 0.0f, 0.0f, 0.0f);
- if (!d->borderColor.isEmpty()) {
- c.setRedF(d->borderColor.at(0).toFloat());
- c.setGreenF(d->borderColor.at(1).toFloat());
- c.setBlueF(d->borderColor.at(2).toFloat());
- c.setAlphaF(d->borderColor.at(3).toFloat());
- }
- return c;
-}
-
-/*!
- Writes the texture border color into the first four elements
- of the array pointed to by \a border.
-
- \sa setBorderColor()
-*/
-void QOpenGLTexture::borderColor(float *border) const
-{
- Q_D(const QOpenGLTexture);
- Q_ASSERT(border);
- if (d->borderColor.isEmpty()) {
- for (int i = 0; i < 4; ++i)
- border[i] = 0.0f;
- } else {
- for (int i = 0; i < 4; ++i)
- border[i] = d->borderColor.at(i).toFloat();
- }
-}
-
-/*!
- Writes the texture border color into the first four elements
- of the array pointed to by \a border.
-
- \overload
-*/
-void QOpenGLTexture::borderColor(int *border) const
-{
- Q_D(const QOpenGLTexture);
- Q_ASSERT(border);
- if (d->borderColor.isEmpty()) {
- for (int i = 0; i < 4; ++i)
- border[i] = 0;
- } else {
- for (int i = 0; i < 4; ++i)
- border[i] = d->borderColor.at(i).toInt();
- }
-}
-
-/*!
- Writes the texture border color into the first four elements
- of the array pointed to by \a border.
-
- \overload
-*/
-void QOpenGLTexture::borderColor(unsigned int *border) const
-{
- Q_D(const QOpenGLTexture);
- Q_ASSERT(border);
- if (d->borderColor.isEmpty()) {
- for (int i = 0; i < 4; ++i)
- border[i] = 0;
- } else {
- for (int i = 0; i < 4; ++i)
- border[i] = d->borderColor.at(i).toUInt();
- }
-}
-
-/*!
- Sets the minimum level of detail to \a value. This limits the selection of highest
- resolution mipmap (lowest mipmap level). The default value is -1000.
-
- \note This function has no effect on Qt built for OpenGL ES 2.
- \sa minimumLevelOfDetail(), setMaximumLevelOfDetail(), setLevelOfDetailRange()
-*/
-void QOpenGLTexture::setMinimumLevelOfDetail(float value)
-{
-#if !defined(QT_OPENGL_ES_2)
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- Q_ASSERT(value < d->maxLevelOfDetail);
- d->minLevelOfDetail = value;
- d->texFuncs->glTextureParameterf(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MIN_LOD, value);
- return;
- }
-#else
- Q_UNUSED(value);
-#endif
- qWarning("QOpenGLTexture: Detail level is not supported");
-}
-
-/*!
- Returns the minimum level of detail parameter.
-
- \sa setMinimumLevelOfDetail(), maximumLevelOfDetail(), levelOfDetailRange()
-*/
-float QOpenGLTexture::minimumLevelOfDetail() const
-{
- Q_D(const QOpenGLTexture);
- return d->minLevelOfDetail;
-}
-
-/*!
- Sets the maximum level of detail to \a value. This limits the selection of lowest
- resolution mipmap (highest mipmap level). The default value is 1000.
-
- \note This function has no effect on Qt built for OpenGL ES 2.
- \sa maximumLevelOfDetail(), setMinimumLevelOfDetail(), setLevelOfDetailRange()
-*/
-void QOpenGLTexture::setMaximumLevelOfDetail(float value)
-{
-#if !defined(QT_OPENGL_ES_2)
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- Q_ASSERT(value > d->minLevelOfDetail);
- d->maxLevelOfDetail = value;
- d->texFuncs->glTextureParameterf(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAX_LOD, value);
- return;
- }
-#else
- Q_UNUSED(value);
-#endif
- qWarning("QOpenGLTexture: Detail level is not supported");
-}
-
-/*!
- Returns the maximum level of detail parameter.
-
- \sa setMaximumLevelOfDetail(), minimumLevelOfDetail(), levelOfDetailRange()
-*/
-float QOpenGLTexture::maximumLevelOfDetail() const
-{
- Q_D(const QOpenGLTexture);
- return d->maxLevelOfDetail;
-}
-
-/*!
- Sets the minimum level of detail parameters to \a min and the maximum level
- to \a max.
- \note This function has no effect on Qt built for OpenGL ES 2.
- \sa levelOfDetailRange(), setMinimumLevelOfDetail(), setMaximumLevelOfDetail()
-*/
-void QOpenGLTexture::setLevelOfDetailRange(float min, float max)
-{
-#if !defined(QT_OPENGL_ES_2)
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- Q_ASSERT(min < max);
- d->minLevelOfDetail = min;
- d->maxLevelOfDetail = max;
- d->texFuncs->glTextureParameterf(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MIN_LOD, min);
- d->texFuncs->glTextureParameterf(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAX_LOD, max);
- return;
- }
-#else
- Q_UNUSED(min);
- Q_UNUSED(max);
-#endif
- qWarning("QOpenGLTexture: Detail level is not supported");
-}
-
-/*!
- Returns the minimum and maximum level of detail parameters.
-
- \sa setLevelOfDetailRange(), minimumLevelOfDetail(), maximumLevelOfDetail()
-*/
-QPair<float, float> QOpenGLTexture::levelOfDetailRange() const
-{
- Q_D(const QOpenGLTexture);
- return qMakePair(d->minLevelOfDetail, d->maxLevelOfDetail);
-}
-
-/*!
- Sets the level of detail bias to \a bias.
- Level of detail bias affects the point at which mipmapping levels change.
- Increasing values for level of detail bias makes the overall images blurrier
- or smoother. Decreasing values make the overall images sharper.
-
- \note This function has no effect on Qt built for OpenGL ES 2.
- \sa levelofDetailBias()
-*/
-void QOpenGLTexture::setLevelofDetailBias(float bias)
-{
-#if !defined(QT_OPENGL_ES_2)
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- Q_D(QOpenGLTexture);
- d->create();
- Q_ASSERT(d->texFuncs);
- Q_ASSERT(d->textureId);
- d->levelOfDetailBias = bias;
- d->texFuncs->glTextureParameterf(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_LOD_BIAS, bias);
- return;
- }
-#else
- Q_UNUSED(bias);
-#endif
- qWarning("QOpenGLTexture: Detail level is not supported");
-}
-
-/*!
- Returns the level of detail bias parameter.
-
- \sa setLevelofDetailBias()
-*/
-float QOpenGLTexture::levelofDetailBias() const
-{
- Q_D(const QOpenGLTexture);
- return d->levelOfDetailBias;
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug debug, const QOpenGLTexture *t)
-{
- QDebugStateSaver saver(debug);
- debug.nospace();
- debug << "QOpenGLTexture(";
- if (t) {
- const QOpenGLTexturePrivate *d = t->d_ptr.data();
- debug << d->target << ", bindingTarget=" << d->bindingTarget
- << ", size=[" << d->dimensions[0]
- << ", " << d->dimensions[1];
- if (d->target == QOpenGLTexture::Target3D)
- debug << ", " << d->dimensions[2];
- debug << "], format=" << d->format << ", formatClass=" << d->formatClass;
- if (t->isCreated())
- debug << ", textureId=" << d->textureId;
- if (t->isBound())
- debug << ", [bound]";
- if (t->isTextureView())
- debug << ", [view]";
- if (d->fixedSamplePositions)
- debug << ", [fixedSamplePositions]";
- debug << ", mipLevels=" << d->requestedMipLevels << ", layers=" << d->layers
- << ", faces=" << d->faces << ", samples=" << d->samples
- << ", depthStencilMode=" << d->depthStencilMode << ", comparisonFunction="
- << d->comparisonFunction << ", comparisonMode=" << d->comparisonMode
- << ", features=" << d->features << ", minificationFilter=" << d->minFilter
- << ", magnificationFilter=" << d->magFilter << ", wrapMode=" << d->wrapModes[0];
- } else {
- debug << '0';
- }
- debug << ')';
- return debug;
-}
-#endif // QT_NO_DEBUG_STREAM
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopengltexture.h b/src/gui/opengl/qopengltexture.h
deleted file mode 100644
index 7d984babc8..0000000000
--- a/src/gui/opengl/qopengltexture.h
+++ /dev/null
@@ -1,663 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLABSTRACTTEXTURE_H
-#define QOPENGLABSTRACTTEXTURE_H
-
-#include <QtGui/qtguiglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtGui/qopengl.h>
-#include <QtGui/qimage.h>
-#include <QtCore/QScopedPointer>
-
-QT_BEGIN_NAMESPACE
-
-class QDebug;
-class QOpenGLTexturePrivate;
-class QOpenGLPixelTransferOptions;
-
-class Q_GUI_EXPORT QOpenGLTexture
-{
- Q_GADGET
-public:
- enum Target {
- Target1D = 0x0DE0, // GL_TEXTURE_1D
- Target1DArray = 0x8C18, // GL_TEXTURE_1D_ARRAY
- Target2D = 0x0DE1, // GL_TEXTURE_2D
- Target2DArray = 0x8C1A, // GL_TEXTURE_2D_ARRAY
- Target3D = 0x806F, // GL_TEXTURE_3D
- TargetCubeMap = 0x8513, // GL_TEXTURE_CUBE_MAP
- TargetCubeMapArray = 0x9009, // GL_TEXTURE_CUBE_MAP_ARRAY
- Target2DMultisample = 0x9100, // GL_TEXTURE_2D_MULTISAMPLE
- Target2DMultisampleArray = 0x9102, // GL_TEXTURE_2D_MULTISAMPLE_ARRAY
- TargetRectangle = 0x84F5, // GL_TEXTURE_RECTANGLE
- TargetBuffer = 0x8C2A // GL_TEXTURE_BUFFER
- };
- Q_ENUM(Target)
-
- enum BindingTarget {
- BindingTarget1D = 0x8068, // GL_TEXTURE_BINDING_1D
- BindingTarget1DArray = 0x8C1C, // GL_TEXTURE_BINDING_1D_ARRAY
- BindingTarget2D = 0x8069, // GL_TEXTURE_BINDING_2D
- BindingTarget2DArray = 0x8C1D, // GL_TEXTURE_BINDING_2D_ARRAY
- BindingTarget3D = 0x806A, // GL_TEXTURE_BINDING_3D
- BindingTargetCubeMap = 0x8514, // GL_TEXTURE_BINDING_CUBE_MAP
- BindingTargetCubeMapArray = 0x900A, // GL_TEXTURE_BINDING_CUBE_MAP_ARRAY
- BindingTarget2DMultisample = 0x9104, // GL_TEXTURE_BINDING_2D_MULTISAMPLE
- BindingTarget2DMultisampleArray = 0x9105, // GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY
- BindingTargetRectangle = 0x84F6, // GL_TEXTURE_BINDING_RECTANGLE
- BindingTargetBuffer = 0x8C2C // GL_TEXTURE_BINDING_BUFFER
- };
- Q_ENUM(BindingTarget)
-
- enum MipMapGeneration {
- GenerateMipMaps,
- DontGenerateMipMaps
- };
- Q_ENUM(MipMapGeneration)
-
- enum TextureUnitReset {
- ResetTextureUnit,
- DontResetTextureUnit
- };
- Q_ENUM(TextureUnitReset)
-
- enum TextureFormat {
- NoFormat = 0, // GL_NONE
-
- // Unsigned normalized formats
- R8_UNorm = 0x8229, // GL_R8
- RG8_UNorm = 0x822B, // GL_RG8
- RGB8_UNorm = 0x8051, // GL_RGB8
- RGBA8_UNorm = 0x8058, // GL_RGBA8
-
- R16_UNorm = 0x822A, // GL_R16
- RG16_UNorm = 0x822C, // GL_RG16
- RGB16_UNorm = 0x8054, // GL_RGB16
- RGBA16_UNorm = 0x805B, // GL_RGBA16
-
- // Signed normalized formats
- R8_SNorm = 0x8F94, // GL_R8_SNORM
- RG8_SNorm = 0x8F95, // GL_RG8_SNORM
- RGB8_SNorm = 0x8F96, // GL_RGB8_SNORM
- RGBA8_SNorm = 0x8F97, // GL_RGBA8_SNORM
-
- R16_SNorm = 0x8F98, // GL_R16_SNORM
- RG16_SNorm = 0x8F99, // GL_RG16_SNORM
- RGB16_SNorm = 0x8F9A, // GL_RGB16_SNORM
- RGBA16_SNorm = 0x8F9B, // GL_RGBA16_SNORM
-
- // Unsigned integer formats
- R8U = 0x8232, // GL_R8UI
- RG8U = 0x8238, // GL_RG8UI
- RGB8U = 0x8D7D, // GL_RGB8UI
- RGBA8U = 0x8D7C, // GL_RGBA8UI
-
- R16U = 0x8234, // GL_R16UI
- RG16U = 0x823A, // GL_RG16UI
- RGB16U = 0x8D77, // GL_RGB16UI
- RGBA16U = 0x8D76, // GL_RGBA16UI
-
- R32U = 0x8236, // GL_R32UI
- RG32U = 0x823C, // GL_RG32UI
- RGB32U = 0x8D71, // GL_RGB32UI
- RGBA32U = 0x8D70, // GL_RGBA32UI
-
- // Signed integer formats
- R8I = 0x8231, // GL_R8I
- RG8I = 0x8237, // GL_RG8I
- RGB8I = 0x8D8F, // GL_RGB8I
- RGBA8I = 0x8D8E, // GL_RGBA8I
-
- R16I = 0x8233, // GL_R16I
- RG16I = 0x8239, // GL_RG16I
- RGB16I = 0x8D89, // GL_RGB16I
- RGBA16I = 0x8D88, // GL_RGBA16I
-
- R32I = 0x8235, // GL_R32I
- RG32I = 0x823B, // GL_RG32I
- RGB32I = 0x8D83, // GL_RGB32I
- RGBA32I = 0x8D82, // GL_RGBA32I
-
- // Floating point formats
- R16F = 0x822D, // GL_R16F
- RG16F = 0x822F, // GL_RG16F
- RGB16F = 0x881B, // GL_RGB16F
- RGBA16F = 0x881A, // GL_RGBA16F
-
- R32F = 0x822E, // GL_R32F
- RG32F = 0x8230, // GL_RG32F
- RGB32F = 0x8815, // GL_RGB32F
- RGBA32F = 0x8814, // GL_RGBA32F
-
- // Packed formats
- RGB9E5 = 0x8C3D, // GL_RGB9_E5
- RG11B10F = 0x8C3A, // GL_R11F_G11F_B10F
- RG3B2 = 0x2A10, // GL_R3_G3_B2
- R5G6B5 = 0x8D62, // GL_RGB565
- RGB5A1 = 0x8057, // GL_RGB5_A1
- RGBA4 = 0x8056, // GL_RGBA4
- RGB10A2 = 0x906F, // GL_RGB10_A2UI
-
- // Depth formats
- D16 = 0x81A5, // GL_DEPTH_COMPONENT16
- D24 = 0x81A6, // GL_DEPTH_COMPONENT24
- D24S8 = 0x88F0, // GL_DEPTH24_STENCIL8
- D32 = 0x81A7, // GL_DEPTH_COMPONENT32
- D32F = 0x8CAC, // GL_DEPTH_COMPONENT32F
- D32FS8X24 = 0x8CAD, // GL_DEPTH32F_STENCIL8
- S8 = 0x8D48, // GL_STENCIL_INDEX8
-
- // Compressed formats
- RGB_DXT1 = 0x83F0, // GL_COMPRESSED_RGB_S3TC_DXT1_EXT
- RGBA_DXT1 = 0x83F1, // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
- RGBA_DXT3 = 0x83F2, // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
- RGBA_DXT5 = 0x83F3, // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
- R_ATI1N_UNorm = 0x8DBB, // GL_COMPRESSED_RED_RGTC1
- R_ATI1N_SNorm = 0x8DBC, // GL_COMPRESSED_SIGNED_RED_RGTC1
- RG_ATI2N_UNorm = 0x8DBD, // GL_COMPRESSED_RG_RGTC2
- RG_ATI2N_SNorm = 0x8DBE, // GL_COMPRESSED_SIGNED_RG_RGTC2
- RGB_BP_UNSIGNED_FLOAT = 0x8E8F, // GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
- RGB_BP_SIGNED_FLOAT = 0x8E8E, // GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
- RGB_BP_UNorm = 0x8E8C, // GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
- R11_EAC_UNorm = 0x9270, // GL_COMPRESSED_R11_EAC
- R11_EAC_SNorm = 0x9271, // GL_COMPRESSED_SIGNED_R11_EAC
- RG11_EAC_UNorm = 0x9272, // GL_COMPRESSED_RG11_EAC
- RG11_EAC_SNorm = 0x9273, // GL_COMPRESSED_SIGNED_RG11_EAC
- RGB8_ETC2 = 0x9274, // GL_COMPRESSED_RGB8_ETC2
- SRGB8_ETC2 = 0x9275, // GL_COMPRESSED_SRGB8_ETC2
- RGB8_PunchThrough_Alpha1_ETC2 = 0x9276, // GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
- SRGB8_PunchThrough_Alpha1_ETC2 = 0x9277, // GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
- RGBA8_ETC2_EAC = 0x9278, // GL_COMPRESSED_RGBA8_ETC2_EAC
- SRGB8_Alpha8_ETC2_EAC = 0x9279, // GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
- RGB8_ETC1 = 0x8D64, // GL_ETC1_RGB8_OES
- RGBA_ASTC_4x4 = 0x93B0, // GL_COMPRESSED_RGBA_ASTC_4x4_KHR
- RGBA_ASTC_5x4 = 0x93B1, // GL_COMPRESSED_RGBA_ASTC_5x4_KHR
- RGBA_ASTC_5x5 = 0x93B2, // GL_COMPRESSED_RGBA_ASTC_5x5_KHR
- RGBA_ASTC_6x5 = 0x93B3, // GL_COMPRESSED_RGBA_ASTC_6x5_KHR
- RGBA_ASTC_6x6 = 0x93B4, // GL_COMPRESSED_RGBA_ASTC_6x6_KHR
- RGBA_ASTC_8x5 = 0x93B5, // GL_COMPRESSED_RGBA_ASTC_8x5_KHR
- RGBA_ASTC_8x6 = 0x93B6, // GL_COMPRESSED_RGBA_ASTC_8x6_KHR
- RGBA_ASTC_8x8 = 0x93B7, // GL_COMPRESSED_RGBA_ASTC_8x8_KHR
- RGBA_ASTC_10x5 = 0x93B8, // GL_COMPRESSED_RGBA_ASTC_10x5_KHR
- RGBA_ASTC_10x6 = 0x93B9, // GL_COMPRESSED_RGBA_ASTC_10x6_KHR
- RGBA_ASTC_10x8 = 0x93BA, // GL_COMPRESSED_RGBA_ASTC_10x8_KHR
- RGBA_ASTC_10x10 = 0x93BB, // GL_COMPRESSED_RGBA_ASTC_10x10_KHR
- RGBA_ASTC_12x10 = 0x93BC, // GL_COMPRESSED_RGBA_ASTC_12x10_KHR
- RGBA_ASTC_12x12 = 0x93BD, // GL_COMPRESSED_RGBA_ASTC_12x12_KHR
- SRGB8_Alpha8_ASTC_4x4 = 0x93D0, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR
- SRGB8_Alpha8_ASTC_5x4 = 0x93D1, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR
- SRGB8_Alpha8_ASTC_5x5 = 0x93D2, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR
- SRGB8_Alpha8_ASTC_6x5 = 0x93D3, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR
- SRGB8_Alpha8_ASTC_6x6 = 0x93D4, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR
- SRGB8_Alpha8_ASTC_8x5 = 0x93D5, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR
- SRGB8_Alpha8_ASTC_8x6 = 0x93D6, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR
- SRGB8_Alpha8_ASTC_8x8 = 0x93D7, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR
- SRGB8_Alpha8_ASTC_10x5 = 0x93D8, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR
- SRGB8_Alpha8_ASTC_10x6 = 0x93D9, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR
- SRGB8_Alpha8_ASTC_10x8 = 0x93DA, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR
- SRGB8_Alpha8_ASTC_10x10 = 0x93DB, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR
- SRGB8_Alpha8_ASTC_12x10 = 0x93DC, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR
- SRGB8_Alpha8_ASTC_12x12 = 0x93DD, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR
-
- // sRGB formats
- SRGB8 = 0x8C41, // GL_SRGB8
- SRGB8_Alpha8 = 0x8C43, // GL_SRGB8_ALPHA8
- SRGB_DXT1 = 0x8C4C, // GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
- SRGB_Alpha_DXT1 = 0x8C4D, // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
- SRGB_Alpha_DXT3 = 0x8C4E, // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
- SRGB_Alpha_DXT5 = 0x8C4F, // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
- SRGB_BP_UNorm = 0x8E8D, // GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
-
- // ES 2 formats
- DepthFormat = 0x1902, // GL_DEPTH_COMPONENT
- AlphaFormat = 0x1906, // GL_ALPHA
- RGBFormat = 0x1907, // GL_RGB
- RGBAFormat = 0x1908, // GL_RGBA
- LuminanceFormat = 0x1909, // GL_LUMINANCE
- LuminanceAlphaFormat = 0x190A
-
- };
- Q_ENUM(TextureFormat)
-
- // This is not used externally yet but is reserved to allow checking of
- // compatibility between texture formats
-#ifndef Q_QDOC
- enum TextureFormatClass {
- NoFormatClass,
- FormatClass_128Bit,
- FormatClass_96Bit,
- FormatClass_64Bit,
- FormatClass_48Bit,
- FormatClass_32Bit,
- FormatClass_24Bit,
- FormatClass_16Bit,
- FormatClass_8Bit,
- FormatClass_RGTC1_R,
- FormatClass_RGTC2_RG,
- FormatClass_BPTC_Unorm,
- FormatClass_BPTC_Float,
- FormatClass_S3TC_DXT1_RGB,
- FormatClass_S3TC_DXT1_RGBA,
- FormatClass_S3TC_DXT3_RGBA,
- FormatClass_S3TC_DXT5_RGBA,
- FormatClass_Unique
- };
-#endif
-
- enum CubeMapFace {
- CubeMapPositiveX = 0x8515, // GL_TEXTURE_CUBE_MAP_POSITIVE_X
- CubeMapNegativeX = 0x8516, // GL_TEXTURE_CUBE_MAP_NEGATIVE_X
- CubeMapPositiveY = 0x8517, // GL_TEXTURE_CUBE_MAP_POSITIVE_Y
- CubeMapNegativeY = 0x8518, // GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
- CubeMapPositiveZ = 0x8519, // GL_TEXTURE_CUBE_MAP_POSITIVE_Z
- CubeMapNegativeZ = 0x851A // GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
- };
- Q_ENUM(CubeMapFace)
-
- enum PixelFormat {
- NoSourceFormat = 0, // GL_NONE
- Red = 0x1903, // GL_RED
- RG = 0x8227, // GL_RG
- RGB = 0x1907, // GL_RGB
- BGR = 0x80E0, // GL_BGR
- RGBA = 0x1908, // GL_RGBA
- BGRA = 0x80E1, // GL_BGRA
- Red_Integer = 0x8D94, // GL_RED_INTEGER
- RG_Integer = 0x8228, // GL_RG_INTEGER
- RGB_Integer = 0x8D98, // GL_RGB_INTEGER
- BGR_Integer = 0x8D9A, // GL_BGR_INTEGER
- RGBA_Integer = 0x8D99, // GL_RGBA_INTEGER
- BGRA_Integer = 0x8D9B, // GL_BGRA_INTEGER
- Stencil = 0x1901, // GL_STENCIL_INDEX
- Depth = 0x1902, // GL_DEPTH_COMPONENT
- DepthStencil = 0x84F9, // GL_DEPTH_STENCIL
- Alpha = 0x1906, // GL_ALPHA
- Luminance = 0x1909, // GL_LUMINANCE
- LuminanceAlpha = 0x190A // GL_LUMINANCE_ALPHA
- };
- Q_ENUM(PixelFormat)
-
- enum PixelType {
- NoPixelType = 0, // GL_NONE
- Int8 = 0x1400, // GL_BYTE
- UInt8 = 0x1401, // GL_UNSIGNED_BYTE
- Int16 = 0x1402, // GL_SHORT
- UInt16 = 0x1403, // GL_UNSIGNED_SHORT
- Int32 = 0x1404, // GL_INT
- UInt32 = 0x1405, // GL_UNSIGNED_INT
- Float16 = 0x140B, // GL_HALF_FLOAT
- Float16OES = 0x8D61, // GL_HALF_FLOAT_OES
- Float32 = 0x1406, // GL_FLOAT
- UInt32_RGB9_E5 = 0x8C3E, // GL_UNSIGNED_INT_5_9_9_9_REV
- UInt32_RG11B10F = 0x8C3B, // GL_UNSIGNED_INT_10F_11F_11F_REV
- UInt8_RG3B2 = 0x8032, // GL_UNSIGNED_BYTE_3_3_2
- UInt8_RG3B2_Rev = 0x8362, // GL_UNSIGNED_BYTE_2_3_3_REV
- UInt16_RGB5A1 = 0x8034, // GL_UNSIGNED_SHORT_5_5_5_1
- UInt16_RGB5A1_Rev = 0x8366, // GL_UNSIGNED_SHORT_1_5_5_5_REV
- UInt16_R5G6B5 = 0x8363, // GL_UNSIGNED_SHORT_5_6_5
- UInt16_R5G6B5_Rev = 0x8364, // GL_UNSIGNED_SHORT_5_6_5_REV
- UInt16_RGBA4 = 0x8033, // GL_UNSIGNED_SHORT_4_4_4_4
- UInt16_RGBA4_Rev = 0x8365, // GL_UNSIGNED_SHORT_4_4_4_4_REV
- UInt32_RGBA8 = 0x8035, // GL_UNSIGNED_INT_8_8_8_8
- UInt32_RGBA8_Rev = 0x8367, // GL_UNSIGNED_INT_8_8_8_8_REV
- UInt32_RGB10A2 = 0x8036, // GL_UNSIGNED_INT_10_10_10_2
- UInt32_RGB10A2_Rev = 0x8368, // GL_UNSIGNED_INT_2_10_10_10_REV
- UInt32_D24S8 = 0x84FA, // GL_UNSIGNED_INT_24_8
- Float32_D32_UInt32_S8_X24 = 0x8DAD // GL_FLOAT_32_UNSIGNED_INT_24_8_REV
- };
- Q_ENUM(PixelType)
-
- enum SwizzleComponent {
- SwizzleRed = 0x8E42, // GL_TEXTURE_SWIZZLE_R
- SwizzleGreen = 0x8E43, // GL_TEXTURE_SWIZZLE_G
- SwizzleBlue = 0x8E44, // GL_TEXTURE_SWIZZLE_B
- SwizzleAlpha = 0x8E45 // GL_TEXTURE_SWIZZLE_A
- };
- Q_ENUM(SwizzleComponent)
-
- enum SwizzleValue {
- RedValue = 0x1903, // GL_RED
- GreenValue = 0x1904, // GL_GREEN
- BlueValue = 0x1905, // GL_BLUE
- AlphaValue = 0x1906, // GL_ALPHA
- ZeroValue = 0, // GL_ZERO
- OneValue = 1 // GL_ONE
- };
- Q_ENUM(SwizzleValue)
-
- enum WrapMode {
- Repeat = 0x2901, // GL_REPEAT
- MirroredRepeat = 0x8370, // GL_MIRRORED_REPEAT
- ClampToEdge = 0x812F, // GL_CLAMP_TO_EDGE
- ClampToBorder = 0x812D // GL_CLAMP_TO_BORDER
- };
- Q_ENUM(WrapMode)
-
- enum CoordinateDirection {
- DirectionS = 0x2802, // GL_TEXTURE_WRAP_S
- DirectionT = 0x2803, // GL_TEXTURE_WRAP_T
- DirectionR = 0x8072 // GL_TEXTURE_WRAP_R
- };
- Q_ENUM(CoordinateDirection)
-
- // Features
- enum Feature {
- ImmutableStorage = 0x00000001,
- ImmutableMultisampleStorage = 0x00000002,
- TextureRectangle = 0x00000004,
- TextureArrays = 0x00000008,
- Texture3D = 0x00000010,
- TextureMultisample = 0x00000020,
- TextureBuffer = 0x00000040,
- TextureCubeMapArrays = 0x00000080,
- Swizzle = 0x00000100,
- StencilTexturing = 0x00000200,
- AnisotropicFiltering = 0x00000400,
- NPOTTextures = 0x00000800,
- NPOTTextureRepeat = 0x00001000,
- Texture1D = 0x00002000,
- TextureComparisonOperators = 0x00004000,
- TextureMipMapLevel = 0x00008000,
-#ifndef Q_QDOC
- MaxFeatureFlag = 0x00010000
-#endif
- };
- Q_DECLARE_FLAGS(Features, Feature)
- Q_ENUM(Feature)
-
- explicit QOpenGLTexture(Target target);
- explicit QOpenGLTexture(const QImage& image, MipMapGeneration genMipMaps = GenerateMipMaps);
- ~QOpenGLTexture();
-
- Target target() const;
-
- // Creation and destruction
- bool create();
- void destroy();
- bool isCreated() const;
- GLuint textureId() const;
-
- // Binding and releasing
- void bind();
- void bind(uint unit, TextureUnitReset reset = DontResetTextureUnit);
- void release();
- void release(uint unit, TextureUnitReset reset = DontResetTextureUnit);
-
- bool isBound() const;
- bool isBound(uint unit);
- static GLuint boundTextureId(BindingTarget target);
- static GLuint boundTextureId(uint unit, BindingTarget target);
-
- // Storage allocation
- void setFormat(TextureFormat format);
- TextureFormat format() const;
- void setSize(int width, int height = 1, int depth = 1);
- int width() const;
- int height() const;
- int depth() const;
- void setMipLevels(int levels);
- int mipLevels() const;
- int maximumMipLevels() const;
- void setLayers(int layers);
- int layers() const;
- int faces() const;
- void setSamples(int samples);
- int samples() const;
- void setFixedSamplePositions(bool fixed);
- bool isFixedSamplePositions() const;
- void allocateStorage();
- void allocateStorage(PixelFormat pixelFormat, PixelType pixelType);
- bool isStorageAllocated() const;
-
- QOpenGLTexture *createTextureView(Target target,
- TextureFormat viewFormat,
- int minimumMipmapLevel, int maximumMipmapLevel,
- int minimumLayer, int maximumLayer) const;
- bool isTextureView() const;
-
- // Pixel transfer
- // ### Qt 6: remove the non-const void * overloads
-#if QT_DEPRECATED_SINCE(5, 3)
- QT_DEPRECATED void setData(int mipLevel, int layer, CubeMapFace cubeFace,
- PixelFormat sourceFormat, PixelType sourceType,
- void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
- QT_DEPRECATED void setData(int mipLevel, int layer,
- PixelFormat sourceFormat, PixelType sourceType,
- void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
- QT_DEPRECATED void setData(int mipLevel,
- PixelFormat sourceFormat, PixelType sourceType,
- void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
- QT_DEPRECATED void setData(PixelFormat sourceFormat, PixelType sourceType,
- void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
-#endif // QT_DEPRECATED_SINCE(5, 3)
-
- void setData(int mipLevel, int layer, CubeMapFace cubeFace,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
- void setData(int mipLevel, int layer, int layerCount, CubeMapFace cubeFace,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
- void setData(int mipLevel, int layer,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
- void setData(int mipLevel,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
- void setData(PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
-
- void setData(int xOffset, int yOffset, int zOffset,
- int width, int height, int depth,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
- void setData(int xOffset, int yOffset, int zOffset,
- int width, int height, int depth, int mipLevel,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
- void setData(int xOffset, int yOffset, int zOffset,
- int width, int height, int depth,
- int mipLevel, int layer,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
- void setData(int xOffset, int yOffset, int zOffset,
- int width, int height, int depth,
- int mipLevel, int layer,
- CubeMapFace cubeFace,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
- void setData(int xOffset, int yOffset, int zOffset,
- int width, int height, int depth,
- int mipLevel, int layer,
- CubeMapFace cubeFace, int layerCount,
- PixelFormat sourceFormat, PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
-
- // Compressed data upload
- // ### Qt 6: remove the non-const void * overloads
-#if QT_DEPRECATED_SINCE(5, 3)
- QT_DEPRECATED void setCompressedData(int mipLevel, int layer, CubeMapFace cubeFace,
- int dataSize, void *data,
- const QOpenGLPixelTransferOptions * const options = nullptr);
- QT_DEPRECATED void setCompressedData(int mipLevel, int layer,
- int dataSize, void *data,
- const QOpenGLPixelTransferOptions * const options = nullptr);
- QT_DEPRECATED void setCompressedData(int mipLevel, int dataSize, void *data,
- const QOpenGLPixelTransferOptions * const options = nullptr);
- QT_DEPRECATED void setCompressedData(int dataSize, void *data,
- const QOpenGLPixelTransferOptions * const options = nullptr);
-#endif // QT_DEPRECATED_SINCE(5, 3)
-
- void setCompressedData(int mipLevel, int layer, CubeMapFace cubeFace,
- int dataSize, const void *data,
- const QOpenGLPixelTransferOptions * const options = nullptr);
- void setCompressedData(int mipLevel, int layer, int layerCount, CubeMapFace cubeFace,
- int dataSize, const void *data,
- const QOpenGLPixelTransferOptions * const options = nullptr);
- void setCompressedData(int mipLevel, int layer,
- int dataSize, const void *data,
- const QOpenGLPixelTransferOptions * const options = nullptr);
- void setCompressedData(int mipLevel, int dataSize, const void *data,
- const QOpenGLPixelTransferOptions * const options = nullptr);
- void setCompressedData(int dataSize, const void *data,
- const QOpenGLPixelTransferOptions * const options = nullptr);
-
- // Helpful overloads for setData
- void setData(const QImage& image, MipMapGeneration genMipMaps = GenerateMipMaps);
-
- static bool hasFeature(Feature feature);
-
- // Texture Parameters
- void setMipBaseLevel(int baseLevel);
- int mipBaseLevel() const;
- void setMipMaxLevel(int maxLevel);
- int mipMaxLevel() const;
- void setMipLevelRange(int baseLevel, int maxLevel);
- QPair<int, int> mipLevelRange() const;
-
- void setAutoMipMapGenerationEnabled(bool enabled);
- bool isAutoMipMapGenerationEnabled() const;
-
- void generateMipMaps();
- void generateMipMaps(int baseLevel, bool resetBaseLevel = true);
-
- void setSwizzleMask(SwizzleComponent component, SwizzleValue value);
- void setSwizzleMask(SwizzleValue r, SwizzleValue g,
- SwizzleValue b, SwizzleValue a);
- SwizzleValue swizzleMask(SwizzleComponent component) const;
-
- enum DepthStencilMode {
- DepthMode = 0x1902, // GL_DEPTH_COMPONENT
- StencilMode = 0x1901 // GL_STENCIL_INDEX
- };
- Q_ENUM(DepthStencilMode)
-
- void setDepthStencilMode(DepthStencilMode mode);
- DepthStencilMode depthStencilMode() const;
-
- enum ComparisonFunction {
- CompareLessEqual = 0x0203, // GL_LEQUAL
- CompareGreaterEqual = 0x0206, // GL_GEQUAL
- CompareLess = 0x0201, // GL_LESS
- CompareGreater = 0x0204, // GL_GREATER
- CompareEqual = 0x0202, // GL_EQUAL
- CommpareNotEqual = 0x0205, // GL_NOTEQUAL
- CompareAlways = 0x0207, // GL_ALWAYS
- CompareNever = 0x0200 // GL_NEVER
- };
- Q_ENUM(ComparisonFunction)
-
- void setComparisonFunction(ComparisonFunction function);
- ComparisonFunction comparisonFunction() const;
-
- enum ComparisonMode {
- CompareRefToTexture = 0x884E, // GL_COMPARE_REF_TO_TEXTURE
- CompareNone = 0x0000 // GL_NONE
- };
-
- void setComparisonMode(ComparisonMode mode);
- ComparisonMode comparisonMode() const;
-
- // Sampling Parameters
- enum Filter {
- Nearest = 0x2600, // GL_NEAREST
- Linear = 0x2601, // GL_LINEAR
- NearestMipMapNearest = 0x2700, // GL_NEAREST_MIPMAP_NEAREST
- NearestMipMapLinear = 0x2702, // GL_NEAREST_MIPMAP_LINEAR
- LinearMipMapNearest = 0x2701, // GL_LINEAR_MIPMAP_NEAREST
- LinearMipMapLinear = 0x2703 // GL_LINEAR_MIPMAP_LINEAR
- };
- Q_ENUM(Filter)
-
- void setMinificationFilter(Filter filter);
- Filter minificationFilter() const;
- void setMagnificationFilter(Filter filter);
- Filter magnificationFilter() const;
- void setMinMagFilters(Filter minificationFilter,
- Filter magnificationFilter);
- QPair<Filter, Filter> minMagFilters() const;
- void setMaximumAnisotropy(float anisotropy);
- float maximumAnisotropy() const;
-
- void setWrapMode(WrapMode mode);
- void setWrapMode(CoordinateDirection direction, WrapMode mode);
- WrapMode wrapMode(CoordinateDirection direction) const;
-
- void setBorderColor(QColor color);
- void setBorderColor(float r, float g, float b, float a);
- void setBorderColor(int r, int g, int b, int a);
- void setBorderColor(uint r, uint g, uint b, uint a);
-
- QColor borderColor() const;
- void borderColor(float *border) const;
- void borderColor(int *border) const;
- void borderColor(unsigned int *border) const;
-
- void setMinimumLevelOfDetail(float value);
- float minimumLevelOfDetail() const;
- void setMaximumLevelOfDetail(float value);
- float maximumLevelOfDetail() const;
- void setLevelOfDetailRange(float min, float max);
- QPair<float, float> levelOfDetailRange() const;
- void setLevelofDetailBias(float bias);
- float levelofDetailBias() const;
-
-#ifndef QT_NO_DEBUG_STREAM
- friend Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QOpenGLTexture *t);
-#endif
-
-private:
- Q_DISABLE_COPY(QOpenGLTexture)
- Q_DECLARE_PRIVATE(QOpenGLTexture)
- QScopedPointer<QOpenGLTexturePrivate> d_ptr;
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLTexture::Features)
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_GUI_EXPORT QDebug operator<<(QDebug debug, const QOpenGLTexture *t);
-#endif
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-
-#endif // QOPENGLABSTRACTTEXTURE_H
diff --git a/src/gui/opengl/qopengltexture_p.h b/src/gui/opengl/qopengltexture_p.h
deleted file mode 100644
index 9f3457ad0a..0000000000
--- a/src/gui/opengl/qopengltexture_p.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QABSTRACTOPENGLTEXTURE_P_H
-#define QABSTRACTOPENGLTEXTURE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QT_NO_OPENGL
-
-#include <QtGui/private/qtguiglobal_p.h>
-#include "private/qobject_p.h"
-#include "qopengltexture.h"
-#include "qopengl.h"
-
-#include <cmath>
-
-namespace {
-inline double qLog2(const double x)
-{
- return std::log(x) / std::log(2.0);
-}
-}
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLContext;
-class QOpenGLTextureHelper;
-class QOpenGLFunctions;
-
-class QOpenGLTexturePrivate
-{
-public:
- QOpenGLTexturePrivate(QOpenGLTexture::Target textureTarget,
- QOpenGLTexture *qq);
- ~QOpenGLTexturePrivate();
-
- Q_DECLARE_PUBLIC(QOpenGLTexture)
-
- void resetFuncs(QOpenGLTextureHelper *funcs);
- void initializeOpenGLFunctions();
-
- bool create();
- void destroy();
-
- void bind();
- void bind(uint unit, QOpenGLTexture::TextureUnitReset reset = QOpenGLTexture::DontResetTextureUnit);
- void release();
- void release(uint unit, QOpenGLTexture::TextureUnitReset reset = QOpenGLTexture::DontResetTextureUnit);
- bool isBound() const;
- bool isBound(uint unit) const;
-
- void allocateStorage(QOpenGLTexture::PixelFormat pixelFormat, QOpenGLTexture::PixelType pixelType);
- void allocateMutableStorage(QOpenGLTexture::PixelFormat pixelFormat, QOpenGLTexture::PixelType pixelType);
- void allocateImmutableStorage();
- void setData(int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
- QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options);
- void setData(int xOffset, int yOffset, int zOffset, int width, int height, int depth,
- int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
- QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
- const void *data, const QOpenGLPixelTransferOptions * const options);
- void setCompressedData(int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
- int dataSize, const void *data,
- const QOpenGLPixelTransferOptions * const options);
-
-
- void setWrapMode(QOpenGLTexture::WrapMode mode);
- void setWrapMode(QOpenGLTexture::CoordinateDirection direction, QOpenGLTexture::WrapMode mode);
- QOpenGLTexture::WrapMode wrapMode(QOpenGLTexture::CoordinateDirection direction) const;
-
- QOpenGLTexture *createTextureView(QOpenGLTexture::Target target, QOpenGLTexture::TextureFormat viewFormat,
- int minimumMipmapLevel, int maximumMipmapLevel,
- int minimumLayer, int maximumLayer) const;
-
- int evaluateMipLevels() const;
-
- inline int maximumMipLevelCount() const
- {
- return 1 + std::floor(qLog2(qMax(dimensions[0], qMax(dimensions[1], dimensions[2]))));
- }
-
- static inline int mipLevelSize(int mipLevel, int baseLevelSize)
- {
- return std::floor(double(qMax(1, baseLevelSize >> mipLevel)));
- }
-
- bool isUsingImmutableStorage() const;
-
- QOpenGLTexture *q_ptr;
- QOpenGLContext *context;
- QOpenGLTexture::Target target;
- QOpenGLTexture::BindingTarget bindingTarget;
- GLuint textureId;
- QOpenGLTexture::TextureFormat format;
- QOpenGLTexture::TextureFormatClass formatClass;
- int dimensions[3];
- int requestedMipLevels;
- int mipLevels;
- int layers;
- int faces;
-
- int samples;
- bool fixedSamplePositions;
-
- int baseLevel;
- int maxLevel;
-
- QOpenGLTexture::SwizzleValue swizzleMask[4];
- QOpenGLTexture::DepthStencilMode depthStencilMode;
- QOpenGLTexture::ComparisonFunction comparisonFunction;
- QOpenGLTexture::ComparisonMode comparisonMode;
-
- QOpenGLTexture::Filter minFilter;
- QOpenGLTexture::Filter magFilter;
- float maxAnisotropy;
- QOpenGLTexture::WrapMode wrapModes[3];
- QVariantList borderColor;
- float minLevelOfDetail;
- float maxLevelOfDetail;
- float levelOfDetailBias;
-
- bool textureView;
- bool autoGenerateMipMaps;
- bool storageAllocated;
-
- QOpenGLTextureHelper *texFuncs;
- QOpenGLFunctions *functions;
-
- QOpenGLTexture::Features features;
-};
-
-QT_END_NAMESPACE
-
-#undef Q_CALL_MEMBER_FUNCTION
-
-#endif // QT_NO_OPENGL
-
-#endif // QABSTRACTOPENGLTEXTURE_P_H
diff --git a/src/gui/opengl/qopengltextureblitter.cpp b/src/gui/opengl/qopengltextureblitter.cpp
deleted file mode 100644
index b709f2f639..0000000000
--- a/src/gui/opengl/qopengltextureblitter.cpp
+++ /dev/null
@@ -1,682 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopengltextureblitter.h"
-
-#include <QtGui/QOpenGLBuffer>
-#include <QtGui/QOpenGLShaderProgram>
-#include <QtGui/QOpenGLVertexArrayObject>
-#include <QtGui/QOpenGLContext>
-#include <QtGui/QOpenGLFunctions>
-
-#ifndef GL_TEXTURE_EXTERNAL_OES
-#define GL_TEXTURE_EXTERNAL_OES 0x8D65
-#endif
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLTextureBlitter
- \brief The QOpenGLTextureBlitter class provides a convenient way to draw textured quads via OpenGL.
- \since 5.8
- \ingroup painting-3D
- \inmodule QtGui
-
- Drawing textured quads, in order to get the contents of a texture
- onto the screen, is a common operation when developing 2D user
- interfaces. QOpenGLTextureBlitter provides a convenience class to
- avoid repeating vertex data, shader sources, buffer and program
- management and matrix calculations.
-
- For example, a QOpenGLWidget subclass can do the following to draw
- the contents rendered into a framebuffer at the pixel position \c{(x, y)}:
-
- \code
- void OpenGLWidget::initializeGL()
- {
- m_blitter.create();
- m_fbo = new QOpenGLFramebufferObject(size);
- }
-
- void OpenGLWidget::paintGL()
- {
- m_fbo->bind();
- // update offscreen content
- m_fbo->release();
-
- m_blitter.bind();
- const QRect targetRect(QPoint(x, y), m_fbo->size());
- const QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(targetRect, QRect(QPoint(0, 0), m_fbo->size()));
- m_blitter.blit(m_fbo->texture(), target, QOpenGLTextureBlitter::OriginBottomLeft);
- m_blitter.release();
- }
- \endcode
-
- The blitter implements GLSL shaders both for GLSL 1.00 (suitable
- for OpenGL (ES) 2.x and compatibility profiles of newer OpenGL
- versions) and version 150 (suitable for core profile contexts with
- OpenGL 3.2 and newer).
- */
-
-static const char vertex_shader150[] =
- "#version 150 core\n"
- "in vec3 vertexCoord;"
- "in vec2 textureCoord;"
- "out vec2 uv;"
- "uniform mat4 vertexTransform;"
- "uniform mat3 textureTransform;"
- "void main() {"
- " uv = (textureTransform * vec3(textureCoord,1.0)).xy;"
- " gl_Position = vertexTransform * vec4(vertexCoord,1.0);"
- "}";
-
-static const char fragment_shader150[] =
- "#version 150 core\n"
- "in vec2 uv;"
- "out vec4 fragcolor;"
- "uniform sampler2D textureSampler;"
- "uniform bool swizzle;"
- "uniform float opacity;"
- "void main() {"
- " vec4 tmpFragColor = texture(textureSampler, uv);"
- " tmpFragColor.a *= opacity;"
- " fragcolor = swizzle ? tmpFragColor.bgra : tmpFragColor;"
- "}";
-
-static const char vertex_shader[] =
- "attribute highp vec3 vertexCoord;"
- "attribute highp vec2 textureCoord;"
- "varying highp vec2 uv;"
- "uniform highp mat4 vertexTransform;"
- "uniform highp mat3 textureTransform;"
- "void main() {"
- " uv = (textureTransform * vec3(textureCoord,1.0)).xy;"
- " gl_Position = vertexTransform * vec4(vertexCoord,1.0);"
- "}";
-
-static const char fragment_shader[] =
- "varying highp vec2 uv;"
- "uniform sampler2D textureSampler;"
- "uniform bool swizzle;"
- "uniform highp float opacity;"
- "void main() {"
- " highp vec4 tmpFragColor = texture2D(textureSampler,uv);"
- " tmpFragColor.a *= opacity;"
- " gl_FragColor = swizzle ? tmpFragColor.bgra : tmpFragColor;"
- "}";
-
-static const char fragment_shader_external_oes[] =
- "#extension GL_OES_EGL_image_external : require\n"
- "varying highp vec2 uv;"
- "uniform samplerExternalOES textureSampler;\n"
- "uniform bool swizzle;"
- "uniform highp float opacity;"
- "void main() {"
- " highp vec4 tmpFragColor = texture2D(textureSampler, uv);"
- " tmpFragColor.a *= opacity;"
- " gl_FragColor = swizzle ? tmpFragColor.bgra : tmpFragColor;"
- "}";
-
-static const GLfloat vertex_buffer_data[] = {
- -1,-1, 0,
- -1, 1, 0,
- 1,-1, 0,
- -1, 1, 0,
- 1,-1, 0,
- 1, 1, 0
-};
-
-static const GLfloat texture_buffer_data[] = {
- 0, 0,
- 0, 1,
- 1, 0,
- 0, 1,
- 1, 0,
- 1, 1
-};
-
-class TextureBinder
-{
-public:
- TextureBinder(GLenum target, GLuint textureId) : m_target(target)
- {
- QOpenGLContext::currentContext()->functions()->glBindTexture(m_target, textureId);
- }
- ~TextureBinder()
- {
- QOpenGLContext::currentContext()->functions()->glBindTexture(m_target, 0);
- }
-
-private:
- GLenum m_target;
-};
-
-class QOpenGLTextureBlitterPrivate
-{
-public:
- enum TextureMatrixUniform {
- User,
- Identity,
- IdentityFlipped
- };
-
- enum ProgramIndex {
- TEXTURE_2D,
- TEXTURE_EXTERNAL_OES
- };
-
- QOpenGLTextureBlitterPrivate() :
- swizzle(false),
- opacity(1.0f),
- vao(new QOpenGLVertexArrayObject),
- currentTarget(TEXTURE_2D)
- { }
-
- bool buildProgram(ProgramIndex idx, const char *vs, const char *fs);
-
- void blit(GLuint texture, const QMatrix4x4 &vertexTransform, const QMatrix3x3 &textureTransform);
- void blit(GLuint texture, const QMatrix4x4 &vertexTransform, QOpenGLTextureBlitter::Origin origin);
-
- void prepareProgram(const QMatrix4x4 &vertexTransform);
-
- QOpenGLBuffer vertexBuffer;
- QOpenGLBuffer textureBuffer;
- struct Program {
- Program() :
- vertexCoordAttribPos(0),
- vertexTransformUniformPos(0),
- textureCoordAttribPos(0),
- textureTransformUniformPos(0),
- swizzleUniformPos(0),
- opacityUniformPos(0),
- swizzle(false),
- opacity(0.0f),
- textureMatrixUniformState(User)
- { }
- QScopedPointer<QOpenGLShaderProgram> glProgram;
- GLuint vertexCoordAttribPos;
- GLuint vertexTransformUniformPos;
- GLuint textureCoordAttribPos;
- GLuint textureTransformUniformPos;
- GLuint swizzleUniformPos;
- GLuint opacityUniformPos;
- bool swizzle;
- float opacity;
- TextureMatrixUniform textureMatrixUniformState;
- } programs[2];
- bool swizzle;
- float opacity;
- QScopedPointer<QOpenGLVertexArrayObject> vao;
- GLenum currentTarget;
-};
-
-static inline QOpenGLTextureBlitterPrivate::ProgramIndex targetToProgramIndex(GLenum target)
-{
- switch (target) {
- case GL_TEXTURE_2D:
- return QOpenGLTextureBlitterPrivate::TEXTURE_2D;
- case GL_TEXTURE_EXTERNAL_OES:
- return QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES;
- default:
- qWarning("Unsupported texture target 0x%x", target);
- return QOpenGLTextureBlitterPrivate::TEXTURE_2D;
- }
-}
-
-void QOpenGLTextureBlitterPrivate::prepareProgram(const QMatrix4x4 &vertexTransform)
-{
- Program *program = &programs[targetToProgramIndex(currentTarget)];
-
- vertexBuffer.bind();
- program->glProgram->setAttributeBuffer(program->vertexCoordAttribPos, GL_FLOAT, 0, 3, 0);
- program->glProgram->enableAttributeArray(program->vertexCoordAttribPos);
- vertexBuffer.release();
-
- program->glProgram->setUniformValue(program->vertexTransformUniformPos, vertexTransform);
-
- textureBuffer.bind();
- program->glProgram->setAttributeBuffer(program->textureCoordAttribPos, GL_FLOAT, 0, 2, 0);
- program->glProgram->enableAttributeArray(program->textureCoordAttribPos);
- textureBuffer.release();
-
- if (swizzle != program->swizzle) {
- program->glProgram->setUniformValue(program->swizzleUniformPos, swizzle);
- program->swizzle = swizzle;
- }
-
- if (opacity != program->opacity) {
- program->glProgram->setUniformValue(program->opacityUniformPos, opacity);
- program->opacity = opacity;
- }
-}
-
-void QOpenGLTextureBlitterPrivate::blit(GLuint texture,
- const QMatrix4x4 &vertexTransform,
- const QMatrix3x3 &textureTransform)
-{
- TextureBinder binder(currentTarget, texture);
- prepareProgram(vertexTransform);
-
- Program *program = &programs[targetToProgramIndex(currentTarget)];
- program->glProgram->setUniformValue(program->textureTransformUniformPos, textureTransform);
- program->textureMatrixUniformState = User;
-
- QOpenGLContext::currentContext()->functions()->glDrawArrays(GL_TRIANGLES, 0, 6);
-}
-
-void QOpenGLTextureBlitterPrivate::blit(GLuint texture,
- const QMatrix4x4 &vertexTransform,
- QOpenGLTextureBlitter::Origin origin)
-{
- TextureBinder binder(currentTarget, texture);
- prepareProgram(vertexTransform);
-
- Program *program = &programs[targetToProgramIndex(currentTarget)];
- if (origin == QOpenGLTextureBlitter::OriginTopLeft) {
- if (program->textureMatrixUniformState != IdentityFlipped) {
- QMatrix3x3 flipped;
- flipped(1,1) = -1;
- flipped(1,2) = 1;
- program->glProgram->setUniformValue(program->textureTransformUniformPos, flipped);
- program->textureMatrixUniformState = IdentityFlipped;
- }
- } else if (program->textureMatrixUniformState != Identity) {
- program->glProgram->setUniformValue(program->textureTransformUniformPos, QMatrix3x3());
- program->textureMatrixUniformState = Identity;
- }
-
- QOpenGLContext::currentContext()->functions()->glDrawArrays(GL_TRIANGLES, 0, 6);
-}
-
-bool QOpenGLTextureBlitterPrivate::buildProgram(ProgramIndex idx, const char *vs, const char *fs)
-{
- Program *p = &programs[idx];
-
- p->glProgram.reset(new QOpenGLShaderProgram);
-
- p->glProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vs);
- p->glProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fs);
- p->glProgram->link();
- if (!p->glProgram->isLinked()) {
- qWarning() << "Could not link shader program:\n" << p->glProgram->log();
- return false;
- }
-
- p->glProgram->bind();
-
- p->vertexCoordAttribPos = p->glProgram->attributeLocation("vertexCoord");
- p->vertexTransformUniformPos = p->glProgram->uniformLocation("vertexTransform");
- p->textureCoordAttribPos = p->glProgram->attributeLocation("textureCoord");
- p->textureTransformUniformPos = p->glProgram->uniformLocation("textureTransform");
- p->swizzleUniformPos = p->glProgram->uniformLocation("swizzle");
- p->opacityUniformPos = p->glProgram->uniformLocation("opacity");
-
- p->glProgram->setUniformValue(p->swizzleUniformPos, false);
-
- // minmize state left set after a create()
- p->glProgram->release();
-
- return true;
-}
-
-/*!
- Constructs a new QOpenGLTextureBlitter instance.
-
- \note no graphics resources are initialized in the
- constructor. This makes it safe to place plain
- QOpenGLTextureBlitter members into classes because the actual
- initialization that depends on the OpenGL context happens only in
- create().
- */
-QOpenGLTextureBlitter::QOpenGLTextureBlitter()
- : d_ptr(new QOpenGLTextureBlitterPrivate)
-{
-}
-
-/*!
- Destructs the instance.
-
- \note When the OpenGL context - or a context sharing resources
- with it - that was current when calling create() is not current,
- graphics resources will not be released. Therefore, it is
- recommended to call destroy() manually instead of relying on the
- destructor to perform OpenGL resource cleanup.
- */
-QOpenGLTextureBlitter::~QOpenGLTextureBlitter()
-{
- destroy();
-}
-
-/*!
- Initializes the graphics resources used by the blitter.
-
- \return \c true if successful, \c false if there was a
- failure. Failures can occur when there is no OpenGL context
- current on the current thread, or when shader compilation fails
- for some reason.
-
- \sa isCreated(), destroy()
- */
-bool QOpenGLTextureBlitter::create()
-{
- QOpenGLContext *currentContext = QOpenGLContext::currentContext();
- if (!currentContext)
- return false;
-
- Q_D(QOpenGLTextureBlitter);
-
- if (d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram)
- return true;
-
- QSurfaceFormat format = currentContext->format();
- if (format.profile() == QSurfaceFormat::CoreProfile && format.version() >= qMakePair(3,2)) {
- if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_2D, vertex_shader150, fragment_shader150))
- return false;
- } else {
- if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_2D, vertex_shader, fragment_shader))
- return false;
- if (supportsExternalOESTarget())
- if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES, vertex_shader, fragment_shader_external_oes))
- return false;
- }
-
- // Create and bind the VAO, if supported.
- QOpenGLVertexArrayObject::Binder vaoBinder(d->vao.data());
-
- d->vertexBuffer.create();
- d->vertexBuffer.bind();
- d->vertexBuffer.allocate(vertex_buffer_data, sizeof(vertex_buffer_data));
- d->vertexBuffer.release();
-
- d->textureBuffer.create();
- d->textureBuffer.bind();
- d->textureBuffer.allocate(texture_buffer_data, sizeof(texture_buffer_data));
- d->textureBuffer.release();
-
- return true;
-}
-
-/*!
- \return \c true if create() was called and succeeded. \c false otherwise.
-
- \sa create(), destroy()
- */
-bool QOpenGLTextureBlitter::isCreated() const
-{
- Q_D(const QOpenGLTextureBlitter);
- return d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram;
-}
-
-/*!
- Frees all graphics resources held by the blitter. Assumes that
- the OpenGL context, or another context sharing resources with it,
- that was current on the thread when invoking create() is current.
-
- The function has no effect when the blitter is not in created state.
-
- \sa create()
- */
-void QOpenGLTextureBlitter::destroy()
-{
- if (!isCreated())
- return;
- Q_D(QOpenGLTextureBlitter);
- d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram.reset();
- d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES].glProgram.reset();
- d->vertexBuffer.destroy();
- d->textureBuffer.destroy();
- d->vao.reset();
-}
-
-/*!
- \return \c true when bind() accepts \c GL_TEXTURE_EXTERNAL_OES as
- its target argument.
-
- \sa bind(), blit()
- */
-bool QOpenGLTextureBlitter::supportsExternalOESTarget() const
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- return ctx && ctx->isOpenGLES() && ctx->hasExtension("GL_OES_EGL_image_external");
-}
-
-/*!
- Binds the graphics resources used by the blitter. This must be
- called before calling blit(). Code modifying the OpenGL state
- should be avoided between the call to bind() and blit() because
- otherwise conflicts may arise.
-
- \a target is the texture target for the source texture and must be
- either \c GL_TEXTURE_2D or \c GL_OES_EGL_image_external.
-
- \sa release(), blit()
- */
-void QOpenGLTextureBlitter::bind(GLenum target)
-{
- Q_D(QOpenGLTextureBlitter);
-
- if (d->vao->isCreated())
- d->vao->bind();
-
- d->currentTarget = target;
- QOpenGLTextureBlitterPrivate::Program *p = &d->programs[targetToProgramIndex(target)];
- p->glProgram->bind();
-
- d->vertexBuffer.bind();
- p->glProgram->setAttributeBuffer(p->vertexCoordAttribPos, GL_FLOAT, 0, 3, 0);
- p->glProgram->enableAttributeArray(p->vertexCoordAttribPos);
- d->vertexBuffer.release();
-
- d->textureBuffer.bind();
- p->glProgram->setAttributeBuffer(p->textureCoordAttribPos, GL_FLOAT, 0, 2, 0);
- p->glProgram->enableAttributeArray(p->textureCoordAttribPos);
- d->textureBuffer.release();
-}
-
-/*!
- Unbinds the graphics resources used by the blitter.
-
- \sa bind()
- */
-void QOpenGLTextureBlitter::release()
-{
- Q_D(QOpenGLTextureBlitter);
- d->programs[targetToProgramIndex(d->currentTarget)].glProgram->release();
- if (d->vao->isCreated())
- d->vao->release();
-}
-
-/*!
- Sets whether swizzling is enabled for the red and blue color channels to
- \a swizzle. An BGRA to RGBA conversion (occurring in the shader on
- the GPU, instead of a slow CPU-side transformation) can be useful
- when the source texture contains data from a QImage with a format
- like QImage::Format_ARGB32 which maps to BGRA on little endian
- systems.
-
- By default the red-blue swizzle is disabled since this is what a
- texture attached to an framebuffer object or a texture based on a
- byte ordered QImage format (like QImage::Format_RGBA8888) needs.
- */
-void QOpenGLTextureBlitter::setRedBlueSwizzle(bool swizzle)
-{
- Q_D(QOpenGLTextureBlitter);
- d->swizzle = swizzle;
-}
-
-/*!
- Changes the opacity to \a opacity. The default opacity is 1.0.
-
- \note the blitter does not alter the blend state. It is up to the
- caller of blit() to ensure the correct blend settings are active.
-
- */
-void QOpenGLTextureBlitter::setOpacity(float opacity)
-{
- Q_D(QOpenGLTextureBlitter);
- d->opacity = opacity;
-}
-
-/*!
- \enum QOpenGLTextureBlitter::Origin
-
- \value OriginBottomLeft Indicates that the data in the texture
- follows the OpenGL convention of coordinate systems, meaning Y is
- running from bottom to top.
-
- \value OriginTopLeft Indicates that the data in the texture has Y
- running from top to bottom, which is typical with regular,
- unflipped image data.
-
- \sa blit()
- */
-
-/*!
- Performs the blit with the source texture \a texture.
-
- \a targetTransform specifies the transformation applied. This is
- usually generated by the targetTransform() helper function.
-
- \a sourceOrigin specifies if the image data needs flipping. When
- \a texture corresponds to a texture attached to an FBO pass
- OriginBottomLeft. On the other hand, when \a texture is based on
- unflipped image data, pass OriginTopLeft. This is more efficient
- than using QImage::mirrored().
-
- \sa targetTransform(), Origin, bind()
- */
-void QOpenGLTextureBlitter::blit(GLuint texture,
- const QMatrix4x4 &targetTransform,
- Origin sourceOrigin)
-{
- Q_D(QOpenGLTextureBlitter);
- d->blit(texture,targetTransform, sourceOrigin);
-}
-
-/*!
- Performs the blit with the source texture \a texture.
-
- \a targetTransform specifies the transformation applied. This is
- usually generated by the targetTransform() helper function.
-
- \a sourceTransform specifies the transformation applied to the
- source. This allows using only a sub-rect of the source
- texture. This is usually generated by the sourceTransform() helper
- function.
-
- \sa sourceTransform(), targetTransform(), Origin, bind()
- */
-void QOpenGLTextureBlitter::blit(GLuint texture,
- const QMatrix4x4 &targetTransform,
- const QMatrix3x3 &sourceTransform)
-{
- Q_D(QOpenGLTextureBlitter);
- d->blit(texture, targetTransform, sourceTransform);
-}
-
-/*!
- Calculates a target transform suitable for blit().
-
- \a target is the target rectangle in pixels. \a viewport describes
- the source dimensions and will in most cases be set to (0, 0,
- image width, image height).
-
- For unscaled output the size of \a target and \a viewport should
- match.
-
- \sa blit()
- */
-QMatrix4x4 QOpenGLTextureBlitter::targetTransform(const QRectF &target,
- const QRect &viewport)
-{
- qreal x_scale = target.width() / viewport.width();
- qreal y_scale = target.height() / viewport.height();
-
- const QPointF relative_to_viewport = target.topLeft() - viewport.topLeft();
- qreal x_translate = x_scale - 1 + ((relative_to_viewport.x() / viewport.width()) * 2);
- qreal y_translate = -y_scale + 1 - ((relative_to_viewport.y() / viewport.height()) * 2);
-
- QMatrix4x4 matrix;
- matrix(0,3) = x_translate;
- matrix(1,3) = y_translate;
-
- matrix(0,0) = x_scale;
- matrix(1,1) = y_scale;
-
- return matrix;
-}
-
-/*!
- Calculates a 3x3 matrix suitable as the input to blit(). This is
- used when only a part of the texture is to be used in the blit.
-
- \a subTexture is the desired source rectangle in pixels, \a
- textureSize is the full width and height of the texture data. \a
- origin specifies the orientation of the image data when it comes
- to the Y axis.
-
- \sa blit(), Origin
- */
-QMatrix3x3 QOpenGLTextureBlitter::sourceTransform(const QRectF &subTexture,
- const QSize &textureSize,
- Origin origin)
-{
- qreal x_scale = subTexture.width() / textureSize.width();
- qreal y_scale = subTexture.height() / textureSize.height();
-
- const QPointF topLeft = subTexture.topLeft();
- qreal x_translate = topLeft.x() / textureSize.width();
- qreal y_translate = topLeft.y() / textureSize.height();
-
- if (origin == OriginTopLeft) {
- y_scale = -y_scale;
- y_translate = 1 - y_translate;
- }
-
- QMatrix3x3 matrix;
- matrix(0,2) = x_translate;
- matrix(1,2) = y_translate;
-
- matrix(0,0) = x_scale;
- matrix(1,1) = y_scale;
-
- return matrix;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopengltextureblitter.h b/src/gui/opengl/qopengltextureblitter.h
deleted file mode 100644
index 2f7c6b1a0a..0000000000
--- a/src/gui/opengl/qopengltextureblitter.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLTEXTUREBLITTER_H
-#define QOPENGLTEXTUREBLITTER_H
-
-#include <QtGui/qtguiglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtGui/qopengl.h>
-#include <QtGui/QMatrix3x3>
-#include <QtGui/QMatrix4x4>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLTextureBlitterPrivate;
-
-class Q_GUI_EXPORT QOpenGLTextureBlitter
-{
-public:
- QOpenGLTextureBlitter();
- ~QOpenGLTextureBlitter();
-
- enum Origin {
- OriginBottomLeft,
- OriginTopLeft
- };
-
- bool create();
- bool isCreated() const;
- void destroy();
-
- bool supportsExternalOESTarget() const;
-
- void bind(GLenum target = GL_TEXTURE_2D);
- void release();
-
- void setRedBlueSwizzle(bool swizzle);
- void setOpacity(float opacity);
-
- void blit(GLuint texture, const QMatrix4x4 &targetTransform, Origin sourceOrigin);
- void blit(GLuint texture, const QMatrix4x4 &targetTransform, const QMatrix3x3 &sourceTransform);
-
- static QMatrix4x4 targetTransform(const QRectF &target, const QRect &viewport);
- static QMatrix3x3 sourceTransform(const QRectF &subTexture, const QSize &textureSize, Origin origin);
-
-private:
- Q_DISABLE_COPY(QOpenGLTextureBlitter)
- Q_DECLARE_PRIVATE(QOpenGLTextureBlitter)
- QScopedPointer<QOpenGLTextureBlitterPrivate> d_ptr;
-};
-
-QT_END_NAMESPACE
-
-#endif
-
-#endif //QOPENGLTEXTUREBLITTER_H
diff --git a/src/gui/opengl/qopengltexturecache.cpp b/src/gui/opengl/qopengltexturecache.cpp
deleted file mode 100644
index ef07dbe109..0000000000
--- a/src/gui/opengl/qopengltexturecache.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopengltexturecache_p.h"
-#include "qopengltextureuploader_p.h"
-#include <qmath.h>
-#include <qopenglfunctions.h>
-#include <private/qimagepixmapcleanuphooks_p.h>
-#include <qpa/qplatformpixmap.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLTextureCacheWrapper
-{
-public:
- QOpenGLTextureCacheWrapper()
- {
- QImagePixmapCleanupHooks::instance()->addPlatformPixmapModificationHook(cleanupTexturesForPixmapData);
- QImagePixmapCleanupHooks::instance()->addPlatformPixmapDestructionHook(cleanupTexturesForPixmapData);
- QImagePixmapCleanupHooks::instance()->addImageHook(cleanupTexturesForCacheKey);
- }
-
- ~QOpenGLTextureCacheWrapper()
- {
- QImagePixmapCleanupHooks::instance()->removePlatformPixmapModificationHook(cleanupTexturesForPixmapData);
- QImagePixmapCleanupHooks::instance()->removePlatformPixmapDestructionHook(cleanupTexturesForPixmapData);
- QImagePixmapCleanupHooks::instance()->removeImageHook(cleanupTexturesForCacheKey);
- }
-
- QOpenGLTextureCache *cacheForContext(QOpenGLContext *context) {
- QMutexLocker lock(&m_mutex);
- return m_resource.value<QOpenGLTextureCache>(context);
- }
-
- static void cleanupTexturesForCacheKey(qint64 key);
- static void cleanupTexturesForPixmapData(QPlatformPixmap *pmd);
-
-private:
- QOpenGLMultiGroupSharedResource m_resource;
- QMutex m_mutex;
-};
-
-Q_GLOBAL_STATIC(QOpenGLTextureCacheWrapper, qt_texture_caches)
-
-QOpenGLTextureCache *QOpenGLTextureCache::cacheForContext(QOpenGLContext *context)
-{
- return qt_texture_caches()->cacheForContext(context);
-}
-
-void QOpenGLTextureCacheWrapper::cleanupTexturesForCacheKey(qint64 key)
-{
- QList<QOpenGLSharedResource *> resources = qt_texture_caches()->m_resource.resources();
- for (QList<QOpenGLSharedResource *>::iterator it = resources.begin(); it != resources.end(); ++it)
- static_cast<QOpenGLTextureCache *>(*it)->invalidate(key);
-}
-
-void QOpenGLTextureCacheWrapper::cleanupTexturesForPixmapData(QPlatformPixmap *pmd)
-{
- cleanupTexturesForCacheKey(pmd->cacheKey());
-}
-
-QOpenGLTextureCache::QOpenGLTextureCache(QOpenGLContext *ctx)
- : QOpenGLSharedResource(ctx->shareGroup())
- , m_cache(256 * 1024) // 256 MB cache
-{
-}
-
-QOpenGLTextureCache::~QOpenGLTextureCache()
-{
-}
-
-GLuint QOpenGLTextureCache::bindTexture(QOpenGLContext *context, const QPixmap &pixmap, QOpenGLTextureUploader::BindOptions options)
-{
- if (pixmap.isNull())
- return 0;
- QMutexLocker locker(&m_mutex);
- qint64 key = pixmap.cacheKey();
-
- // A QPainter is active on the image - take the safe route and replace the texture.
- if (!pixmap.paintingActive()) {
- QOpenGLCachedTexture *entry = m_cache.object(key);
- if (entry && entry->options() == options) {
- context->functions()->glBindTexture(GL_TEXTURE_2D, entry->id());
- return entry->id();
- }
- }
-
- GLuint id = bindTexture(context, key, pixmap.toImage(), options);
- if (id > 0)
- QImagePixmapCleanupHooks::enableCleanupHooks(pixmap);
-
- return id;
-}
-
-GLuint QOpenGLTextureCache::bindTexture(QOpenGLContext *context, const QImage &image, QOpenGLTextureUploader::BindOptions options)
-{
- if (image.isNull())
- return 0;
- QMutexLocker locker(&m_mutex);
- qint64 key = image.cacheKey();
-
- // A QPainter is active on the image - take the safe route and replace the texture.
- if (!image.paintingActive()) {
- QOpenGLCachedTexture *entry = m_cache.object(key);
- if (entry && entry->options() == options) {
- context->functions()->glBindTexture(GL_TEXTURE_2D, entry->id());
- return entry->id();
- }
- }
-
- QImage img = image;
- if (!context->functions()->hasOpenGLFeature(QOpenGLFunctions::NPOTTextures))
- options |= QOpenGLTextureUploader::PowerOfTwoBindOption;
-
- GLuint id = bindTexture(context, key, img, options);
- if (id > 0)
- QImagePixmapCleanupHooks::enableCleanupHooks(image);
-
- return id;
-}
-
-GLuint QOpenGLTextureCache::bindTexture(QOpenGLContext *context, qint64 key, const QImage &image, QOpenGLTextureUploader::BindOptions options)
-{
- GLuint id;
- QOpenGLFunctions *funcs = context->functions();
- funcs->glGenTextures(1, &id);
- funcs->glBindTexture(GL_TEXTURE_2D, id);
-
- int cost = QOpenGLTextureUploader::textureImage(GL_TEXTURE_2D, image, options);
-
- m_cache.insert(key, new QOpenGLCachedTexture(id, options, context), cost / 1024);
-
- return id;
-}
-
-void QOpenGLTextureCache::invalidate(qint64 key)
-{
- QMutexLocker locker(&m_mutex);
- m_cache.remove(key);
-}
-
-void QOpenGLTextureCache::invalidateResource()
-{
- m_cache.clear();
-}
-
-void QOpenGLTextureCache::freeResource(QOpenGLContext *)
-{
- Q_ASSERT(false); // the texture cache lives until the context group disappears
-}
-
-static void freeTexture(QOpenGLFunctions *funcs, GLuint id)
-{
- funcs->glDeleteTextures(1, &id);
-}
-
-QOpenGLCachedTexture::QOpenGLCachedTexture(GLuint id, QOpenGLTextureUploader::BindOptions options, QOpenGLContext *context) : m_options(options)
-{
- m_resource = new QOpenGLSharedResourceGuard(context, id, freeTexture);
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopengltexturecache_p.h b/src/gui/opengl/qopengltexturecache_p.h
deleted file mode 100644
index 88ef06e744..0000000000
--- a/src/gui/opengl/qopengltexturecache_p.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QOPENGLTEXTURECACHE_P_H
-#define QOPENGLTEXTURECACHE_P_H
-
-#include <QtGui/private/qtguiglobal_p.h>
-#include <QHash>
-#include <QObject>
-#include <QCache>
-#include <private/qopenglcontext_p.h>
-#include <private/qopengltextureuploader_p.h>
-#include <QtCore/qmutex.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLCachedTexture;
-
-class Q_GUI_EXPORT QOpenGLTextureCache : public QOpenGLSharedResource
-{
-public:
- static QOpenGLTextureCache *cacheForContext(QOpenGLContext *context);
-
- QOpenGLTextureCache(QOpenGLContext *);
- ~QOpenGLTextureCache();
-
- GLuint bindTexture(QOpenGLContext *context, const QPixmap &pixmap,
- QOpenGLTextureUploader::BindOptions options = QOpenGLTextureUploader::PremultipliedAlphaBindOption);
- GLuint bindTexture(QOpenGLContext *context, const QImage &image,
- QOpenGLTextureUploader::BindOptions options = QOpenGLTextureUploader::PremultipliedAlphaBindOption);
-
- void invalidate(qint64 key);
-
- void invalidateResource() override;
- void freeResource(QOpenGLContext *ctx) override;
-
-private:
- GLuint bindTexture(QOpenGLContext *context, qint64 key, const QImage &image, QOpenGLTextureUploader::BindOptions options);
-
- QMutex m_mutex;
- QCache<quint64, QOpenGLCachedTexture> m_cache;
-};
-
-class QOpenGLCachedTexture
-{
-public:
- QOpenGLCachedTexture(GLuint id, QOpenGLTextureUploader::BindOptions options, QOpenGLContext *context);
- ~QOpenGLCachedTexture() { m_resource->free(); }
-
- GLuint id() const { return m_resource->id(); }
- QOpenGLTextureUploader::BindOptions options() const { return m_options; }
-
-private:
- QOpenGLSharedResourceGuard *m_resource;
- QOpenGLTextureUploader::BindOptions m_options;
-};
-
-QT_END_NAMESPACE
-
-#endif
-
diff --git a/src/gui/opengl/qopengltextureglyphcache.cpp b/src/gui/opengl/qopengltextureglyphcache.cpp
deleted file mode 100644
index 41027d26e0..0000000000
--- a/src/gui/opengl/qopengltextureglyphcache.cpp
+++ /dev/null
@@ -1,485 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopengltextureglyphcache_p.h"
-#include "qopenglpaintengine_p.h"
-#include "private/qopenglengineshadersource_p.h"
-#include "qopenglextensions_p.h"
-#include <qrgb.h>
-#include <private/qdrawhelper_p.h>
-
-QT_BEGIN_NAMESPACE
-
-
-static int next_qopengltextureglyphcache_serial_number()
-{
- static QBasicAtomicInt serial = Q_BASIC_ATOMIC_INITIALIZER(0);
- return 1 + serial.fetchAndAddRelaxed(1);
-}
-
-QOpenGLTextureGlyphCache::QOpenGLTextureGlyphCache(QFontEngine::GlyphFormat format, const QTransform &matrix, const QColor &color)
- : QImageTextureGlyphCache(format, matrix, color)
- , m_textureResource(nullptr)
- , pex(nullptr)
- , m_blitProgram(nullptr)
- , m_filterMode(Nearest)
- , m_serialNumber(next_qopengltextureglyphcache_serial_number())
- , m_buffer(QOpenGLBuffer::VertexBuffer)
-{
-#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
- qDebug(" -> QOpenGLTextureGlyphCache() %p for context %p.", this, QOpenGLContext::currentContext());
-#endif
- m_vertexCoordinateArray[0] = -1.0f;
- m_vertexCoordinateArray[1] = -1.0f;
- m_vertexCoordinateArray[2] = 1.0f;
- m_vertexCoordinateArray[3] = -1.0f;
- m_vertexCoordinateArray[4] = 1.0f;
- m_vertexCoordinateArray[5] = 1.0f;
- m_vertexCoordinateArray[6] = -1.0f;
- m_vertexCoordinateArray[7] = 1.0f;
-
- m_textureCoordinateArray[0] = 0.0f;
- m_textureCoordinateArray[1] = 0.0f;
- m_textureCoordinateArray[2] = 1.0f;
- m_textureCoordinateArray[3] = 0.0f;
- m_textureCoordinateArray[4] = 1.0f;
- m_textureCoordinateArray[5] = 1.0f;
- m_textureCoordinateArray[6] = 0.0f;
- m_textureCoordinateArray[7] = 1.0f;
-}
-
-QOpenGLTextureGlyphCache::~QOpenGLTextureGlyphCache()
-{
-#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
- qDebug(" -> ~QOpenGLTextureGlyphCache() %p.", this);
-#endif
- clear();
-}
-
-#if !defined(QT_OPENGL_ES_2)
-static inline bool isCoreProfile()
-{
- return QOpenGLContext::currentContext()->format().profile() == QSurfaceFormat::CoreProfile;
-}
-#endif
-
-void QOpenGLTextureGlyphCache::createTextureData(int width, int height)
-{
- QOpenGLContext *ctx = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
- if (ctx == nullptr) {
- qWarning("QOpenGLTextureGlyphCache::createTextureData: Called with no context");
- return;
- }
-
- // create in QImageTextureGlyphCache baseclass is meant to be called
- // only to create the initial image and does not preserve the content,
- // so we don't call when this function is called from resize.
- if (ctx->d_func()->workaround_brokenFBOReadBack && image().isNull())
- QImageTextureGlyphCache::createTextureData(width, height);
-
- // Make the lower glyph texture size 16 x 16.
- if (width < 16)
- width = 16;
- if (height < 16)
- height = 16;
-
- if (m_textureResource && !m_textureResource->m_texture) {
- delete m_textureResource;
- m_textureResource = nullptr;
- }
-
- if (!m_textureResource)
- m_textureResource = new QOpenGLGlyphTexture(ctx);
-
- QOpenGLFunctions *funcs = ctx->functions();
- funcs->glGenTextures(1, &m_textureResource->m_texture);
- funcs->glBindTexture(GL_TEXTURE_2D, m_textureResource->m_texture);
-
- m_textureResource->m_width = width;
- m_textureResource->m_height = height;
-
- if (m_format == QFontEngine::Format_A32 || m_format == QFontEngine::Format_ARGB) {
- QVarLengthArray<uchar> data(width * height * 4);
- for (int i = 0; i < data.size(); ++i)
- data[i] = 0;
- funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);
- } else {
- QVarLengthArray<uchar> data(width * height);
- for (int i = 0; i < data.size(); ++i)
- data[i] = 0;
-#if !defined(QT_OPENGL_ES_2)
- const GLint internalFormat = isCoreProfile() ? GL_R8 : GL_ALPHA;
- const GLenum format = isCoreProfile() ? GL_RED : GL_ALPHA;
-#else
- const GLint internalFormat = GL_ALPHA;
- const GLenum format = GL_ALPHA;
-#endif
- funcs->glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, GL_UNSIGNED_BYTE, &data[0]);
- }
-
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- m_filterMode = Nearest;
-
- if (!m_buffer.isCreated()) {
- m_buffer.create();
- m_buffer.bind();
- static GLfloat buf[sizeof(m_vertexCoordinateArray) + sizeof(m_textureCoordinateArray)];
- memcpy(buf, m_vertexCoordinateArray, sizeof(m_vertexCoordinateArray));
- memcpy(buf + (sizeof(m_vertexCoordinateArray) / sizeof(GLfloat)),
- m_textureCoordinateArray,
- sizeof(m_textureCoordinateArray));
- m_buffer.allocate(buf, sizeof(buf));
- m_buffer.release();
- }
-
- if (!m_vao.isCreated())
- m_vao.create();
-}
-
-void QOpenGLTextureGlyphCache::setupVertexAttribs()
-{
- m_buffer.bind();
- m_blitProgram->setAttributeBuffer(int(QT_VERTEX_COORDS_ATTR), GL_FLOAT, 0, 2);
- m_blitProgram->setAttributeBuffer(int(QT_TEXTURE_COORDS_ATTR), GL_FLOAT, sizeof(m_vertexCoordinateArray), 2);
- m_blitProgram->enableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
- m_blitProgram->enableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
- m_buffer.release();
-}
-
-static void load_glyph_image_to_texture(QOpenGLContext *ctx,
- QImage &img,
- GLuint texture,
- int tx, int ty)
-{
- QOpenGLFunctions *funcs = ctx->functions();
-
- const int imgWidth = img.width();
- const int imgHeight = img.height();
-
- if (img.format() == QImage::Format_Mono) {
- img = img.convertToFormat(QImage::Format_Grayscale8);
- } else if (img.depth() == 32) {
- if (img.format() == QImage::Format_RGB32
- // We need to make the alpha component equal to the average of the RGB values.
- // This is needed when drawing sub-pixel antialiased text on translucent targets.
-#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- || img.format() == QImage::Format_ARGB32_Premultiplied
-#else
- || (img.format() == QImage::Format_ARGB32_Premultiplied
- && ctx->isOpenGLES())
-#endif
- ) {
- for (int y = 0; y < imgHeight; ++y) {
- QRgb *src = (QRgb *) img.scanLine(y);
- for (int x = 0; x < imgWidth; ++x) {
- int r = qRed(src[x]);
- int g = qGreen(src[x]);
- int b = qBlue(src[x]);
- int avg;
- if (img.format() == QImage::Format_RGB32)
- avg = (r + g + b + 1) / 3; // "+1" for rounding.
- else // Format_ARGB_Premultiplied
- avg = qAlpha(src[x]);
-
- src[x] = qRgba(r, g, b, avg);
- // swizzle the bits to accommodate for the GL_RGBA upload.
-#if Q_BYTE_ORDER != Q_BIG_ENDIAN
- if (ctx->isOpenGLES())
-#endif
- src[x] = ARGB2RGBA(src[x]);
- }
- }
- }
- }
-
- funcs->glBindTexture(GL_TEXTURE_2D, texture);
- if (img.depth() == 32) {
-#ifdef QT_OPENGL_ES_2
- GLenum fmt = GL_RGBA;
-#else
- GLenum fmt = ctx->isOpenGLES() ? GL_RGBA : GL_BGRA;
-#endif // QT_OPENGL_ES_2
-
-#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- fmt = GL_RGBA;
-#endif
- funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, tx, ty, imgWidth, imgHeight, fmt, GL_UNSIGNED_BYTE, img.constBits());
- } else {
- // The scanlines in image are 32-bit aligned, even for mono or 8-bit formats. This
- // is good because it matches the default of 4 bytes for GL_UNPACK_ALIGNMENT.
-#if !defined(QT_OPENGL_ES_2)
- const GLenum format = isCoreProfile() ? GL_RED : GL_ALPHA;
-#else
- const GLenum format = GL_ALPHA;
-#endif
- funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, tx, ty, imgWidth, imgHeight, format, GL_UNSIGNED_BYTE, img.constBits());
- }
-}
-
-static void load_glyph_image_region_to_texture(QOpenGLContext *ctx,
- const QImage &srcImg,
- int x, int y,
- int w, int h,
- GLuint texture,
- int tx, int ty)
-{
- Q_ASSERT(x + w <= srcImg.width() && y + h <= srcImg.height());
-
- QImage img;
- if (x != 0 || y != 0 || w != srcImg.width() || h != srcImg.height())
- img = srcImg.copy(x, y, w, h);
- else
- img = srcImg;
-
- load_glyph_image_to_texture(ctx, img, texture, tx, ty);
-}
-
-void QOpenGLTextureGlyphCache::resizeTextureData(int width, int height)
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (ctx == nullptr) {
- qWarning("QOpenGLTextureGlyphCache::resizeTextureData: Called with no context");
- return;
- }
-
- QOpenGLFunctions *funcs = ctx->functions();
- GLint oldFbo;
- funcs->glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFbo);
-
- int oldWidth = m_textureResource->m_width;
- int oldHeight = m_textureResource->m_height;
-
- // Make the lower glyph texture size 16 x 16.
- if (width < 16)
- width = 16;
- if (height < 16)
- height = 16;
-
- GLuint oldTexture = m_textureResource->m_texture;
- createTextureData(width, height);
-
- if (ctx->d_func()->workaround_brokenFBOReadBack) {
- QImageTextureGlyphCache::resizeTextureData(width, height);
- load_glyph_image_region_to_texture(ctx, image(), 0, 0, qMin(oldWidth, width), qMin(oldHeight, height),
- m_textureResource->m_texture, 0, 0);
- return;
- }
-
- // ### the QTextureGlyphCache API needs to be reworked to allow
- // ### resizeTextureData to fail
-
- funcs->glBindFramebuffer(GL_FRAMEBUFFER, m_textureResource->m_fbo);
-
- GLuint tmp_texture;
- funcs->glGenTextures(1, &tmp_texture);
- funcs->glBindTexture(GL_TEXTURE_2D, tmp_texture);
- funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, oldWidth, oldHeight, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- m_filterMode = Nearest;
- funcs->glBindTexture(GL_TEXTURE_2D, 0);
- funcs->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D, tmp_texture, 0);
-
- funcs->glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
- funcs->glBindTexture(GL_TEXTURE_2D, oldTexture);
-
- if (pex != nullptr)
- pex->transferMode(BrushDrawingMode);
-
- funcs->glDisable(GL_STENCIL_TEST);
- funcs->glDisable(GL_DEPTH_TEST);
- funcs->glDisable(GL_SCISSOR_TEST);
- funcs->glDisable(GL_BLEND);
-
- funcs->glViewport(0, 0, oldWidth, oldHeight);
-
- QOpenGLShaderProgram *blitProgram = nullptr;
- if (pex == nullptr) {
- if (m_blitProgram == nullptr) {
- m_blitProgram = new QOpenGLShaderProgram;
- const bool isCoreProfile = ctx->format().profile() == QSurfaceFormat::CoreProfile;
-
- {
- QString source;
-#ifdef Q_OS_WASM
- source.append(QLatin1String(isCoreProfile ? qopenglslUntransformedPositionVertexShader_core : qopenglslUntransformedPositionVertexShader));
- source.append(QLatin1String(isCoreProfile ? qopenglslMainWithTexCoordsVertexShader_core : qopenglslMainWithTexCoordsVertexShader));
-#else
- source.append(QLatin1String(isCoreProfile ? qopenglslMainWithTexCoordsVertexShader_core : qopenglslMainWithTexCoordsVertexShader));
- source.append(QLatin1String(isCoreProfile ? qopenglslUntransformedPositionVertexShader_core : qopenglslUntransformedPositionVertexShader));
-#endif
- m_blitProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, source);
- }
-
- {
- QString source;
-#ifdef Q_OS_WASM
- source.append(QLatin1String(isCoreProfile ? qopenglslImageSrcFragmentShader_core : qopenglslImageSrcFragmentShader));
- source.append(QLatin1String(isCoreProfile ? qopenglslMainFragmentShader_core : qopenglslMainFragmentShader));
-#else
- source.append(QLatin1String(isCoreProfile ? qopenglslMainFragmentShader_core : qopenglslMainFragmentShader));
- source.append(QLatin1String(isCoreProfile ? qopenglslImageSrcFragmentShader_core : qopenglslImageSrcFragmentShader));
-#endif
- m_blitProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, source);
- }
-
- m_blitProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- m_blitProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
-
- m_blitProgram->link();
-
- if (m_vao.isCreated()) {
- m_vao.bind();
- setupVertexAttribs();
- }
- }
-
- if (m_vao.isCreated())
- m_vao.bind();
- else
- setupVertexAttribs();
-
- m_blitProgram->bind();
- blitProgram = m_blitProgram;
-
- } else {
- pex->uploadData(QT_VERTEX_COORDS_ATTR, m_vertexCoordinateArray, 8);
- pex->uploadData(QT_TEXTURE_COORDS_ATTR, m_textureCoordinateArray, 8);
-
- pex->shaderManager->useBlitProgram();
- blitProgram = pex->shaderManager->blitProgram();
- }
-
- blitProgram->setUniformValue("imageTexture", QT_IMAGE_TEXTURE_UNIT);
-
- funcs->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
- funcs->glBindTexture(GL_TEXTURE_2D, m_textureResource->m_texture);
-
- funcs->glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, oldWidth, oldHeight);
-
- funcs->glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_RENDERBUFFER, 0);
- funcs->glDeleteTextures(1, &tmp_texture);
- funcs->glDeleteTextures(1, &oldTexture);
-
- funcs->glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)oldFbo);
-
- if (pex != nullptr) {
- funcs->glViewport(0, 0, pex->width, pex->height);
- pex->updateClipScissorTest();
- } else {
- if (m_vao.isCreated()) {
- m_vao.release();
- } else {
- m_blitProgram->disableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
- m_blitProgram->disableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
- }
- }
-}
-
-void QOpenGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed subPixelPosition)
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (ctx == nullptr) {
- qWarning("QOpenGLTextureGlyphCache::fillTexture: Called with no context");
- return;
- }
-
- if (ctx->d_func()->workaround_brokenFBOReadBack) {
- QImageTextureGlyphCache::fillTexture(c, glyph, subPixelPosition);
- load_glyph_image_region_to_texture(ctx, image(), c.x, c.y, c.w, c.h, m_textureResource->m_texture, c.x, c.y);
- return;
- }
-
- QImage mask = textureMapForGlyph(glyph, subPixelPosition);
- load_glyph_image_to_texture(ctx, mask, m_textureResource->m_texture, c.x, c.y);
-}
-
-int QOpenGLTextureGlyphCache::glyphPadding() const
-{
- return 1;
-}
-
-int QOpenGLTextureGlyphCache::maxTextureWidth() const
-{
- QOpenGLContext *ctx = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
- if (ctx == nullptr)
- return QImageTextureGlyphCache::maxTextureWidth();
- else
- return ctx->d_func()->maxTextureSize();
-}
-
-int QOpenGLTextureGlyphCache::maxTextureHeight() const
-{
- QOpenGLContext *ctx = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
- if (ctx == nullptr)
- return QImageTextureGlyphCache::maxTextureHeight();
-
- if (ctx->d_func()->workaround_brokenTexSubImage)
- return qMin(1024, ctx->d_func()->maxTextureSize());
- else
- return ctx->d_func()->maxTextureSize();
-}
-
-void QOpenGLTextureGlyphCache::clear()
-{
- if (m_textureResource)
- m_textureResource->free();
- m_textureResource = nullptr;
-
- delete m_blitProgram;
- m_blitProgram = nullptr;
-
- m_w = 0;
- m_h = 0;
- m_cx = 0;
- m_cy = 0;
- m_currentRowHeight = 0;
- coords.clear();
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopengltextureglyphcache_p.h b/src/gui/opengl/qopengltextureglyphcache_p.h
deleted file mode 100644
index 4bea4a463a..0000000000
--- a/src/gui/opengl/qopengltextureglyphcache_p.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLTEXTUREGLYPHCACHE_P_H
-#define QOPENGLTEXTUREGLYPHCACHE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtGui/private/qtguiglobal_p.h>
-#include <private/qtextureglyphcache_p.h>
-#include <private/qopenglcontext_p.h>
-#include <qopenglshaderprogram.h>
-#include <qopenglfunctions.h>
-#include <qopenglbuffer.h>
-#include <qopenglvertexarrayobject.h>
-
-// #define QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGL2PaintEngineExPrivate;
-
-class QOpenGLGlyphTexture : public QOpenGLSharedResource
-{
-public:
- explicit QOpenGLGlyphTexture(QOpenGLContext *ctx)
- : QOpenGLSharedResource(ctx->shareGroup())
- , m_width(0)
- , m_height(0)
- {
- if (!ctx->d_func()->workaround_brokenFBOReadBack)
- QOpenGLFunctions(ctx).glGenFramebuffers(1, &m_fbo);
-
-#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
- qDebug(" -> QOpenGLGlyphTexture() %p for context %p.", this, ctx);
-#endif
- }
-
- void freeResource(QOpenGLContext *context) override
- {
- QOpenGLContext *ctx = context;
-#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
- qDebug("~QOpenGLGlyphTexture() %p for context %p.", this, ctx);
-#endif
- if (!ctx->d_func()->workaround_brokenFBOReadBack)
- ctx->functions()->glDeleteFramebuffers(1, &m_fbo);
- if (m_width || m_height)
- ctx->functions()->glDeleteTextures(1, &m_texture);
- }
-
- void invalidateResource() override
- {
- m_texture = 0;
- m_fbo = 0;
- m_width = 0;
- m_height = 0;
- }
-
- GLuint m_texture;
- GLuint m_fbo;
- int m_width;
- int m_height;
-};
-
-class Q_GUI_EXPORT QOpenGLTextureGlyphCache : public QImageTextureGlyphCache
-{
-public:
- QOpenGLTextureGlyphCache(QFontEngine::GlyphFormat glyphFormat, const QTransform &matrix, const QColor &color = QColor());
- ~QOpenGLTextureGlyphCache();
-
- virtual void createTextureData(int width, int height) override;
- virtual void resizeTextureData(int width, int height) override;
- virtual void fillTexture(const Coord &c, glyph_t glyph, QFixed subPixelPosition) override;
- virtual int glyphPadding() const override;
- virtual int maxTextureWidth() const override;
- virtual int maxTextureHeight() const override;
-
- inline GLuint texture() const {
- QOpenGLTextureGlyphCache *that = const_cast<QOpenGLTextureGlyphCache *>(this);
- QOpenGLGlyphTexture *glyphTexture = that->m_textureResource;
- return glyphTexture ? glyphTexture->m_texture : 0;
- }
-
- inline int width() const {
- QOpenGLTextureGlyphCache *that = const_cast<QOpenGLTextureGlyphCache *>(this);
- QOpenGLGlyphTexture *glyphTexture = that->m_textureResource;
- return glyphTexture ? glyphTexture->m_width : 0;
- }
- inline int height() const {
- QOpenGLTextureGlyphCache *that = const_cast<QOpenGLTextureGlyphCache *>(this);
- QOpenGLGlyphTexture *glyphTexture = that->m_textureResource;
- return glyphTexture ? glyphTexture->m_height : 0;
- }
-
- inline void setPaintEnginePrivate(QOpenGL2PaintEngineExPrivate *p) { pex = p; }
-
- inline const QOpenGLContextGroup *contextGroup() const { return m_textureResource ? m_textureResource->group() : nullptr; }
-
- inline int serialNumber() const { return m_serialNumber; }
-
- enum FilterMode {
- Nearest,
- Linear
- };
- FilterMode filterMode() const { return m_filterMode; }
- void setFilterMode(FilterMode m) { m_filterMode = m; }
-
- void clear();
-
- QOpenGL2PaintEngineExPrivate *paintEnginePrivate() const
- {
- return pex;
- }
-
-private:
- void setupVertexAttribs();
-
- QOpenGLGlyphTexture *m_textureResource;
-
- QOpenGL2PaintEngineExPrivate *pex;
- QOpenGLShaderProgram *m_blitProgram;
- FilterMode m_filterMode;
-
- GLfloat m_vertexCoordinateArray[8];
- GLfloat m_textureCoordinateArray[8];
-
- int m_serialNumber;
-
- QOpenGLBuffer m_buffer;
- QOpenGLVertexArrayObject m_vao;
-};
-
-QT_END_NAMESPACE
-
-#endif // QOPENGLTEXTUREGLYPHCACHE_P_H
-
diff --git a/src/gui/opengl/qopengltexturehelper.cpp b/src/gui/opengl/qopengltexturehelper.cpp
deleted file mode 100644
index 6709edc4e2..0000000000
--- a/src/gui/opengl/qopengltexturehelper.cpp
+++ /dev/null
@@ -1,589 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopengltexturehelper_p.h"
-
-#include <QOpenGLContext>
-#include <private/qopenglextensions_p.h>
-
-QT_BEGIN_NAMESPACE
-
-QOpenGLTextureHelper::QOpenGLTextureHelper(QOpenGLContext *context)
-{
- functions = context->functions();
- // Resolve EXT_direct_state_access entry points if present.
-
- // However, disable it on some systems where DSA is known to be unreliable.
- bool allowDSA = true;
- const char *renderer = reinterpret_cast<const char *>(context->functions()->glGetString(GL_RENDERER));
- // QTBUG-40653, QTBUG-44988
- if (renderer && strstr(renderer, "AMD Radeon HD"))
- allowDSA = false;
-
- if (allowDSA && !context->isOpenGLES()
- && context->hasExtension(QByteArrayLiteral("GL_EXT_direct_state_access"))) {
- TextureParameteriEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , GLint )>(context->getProcAddress("glTextureParameteriEXT"));
- TextureParameterivEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , const GLint *)>(context->getProcAddress("glTextureParameterivEXT"));
- TextureParameterfEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , GLfloat )>(context->getProcAddress("glTextureParameterfEXT"));
- TextureParameterfvEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , const GLfloat *)>(context->getProcAddress("glTextureParameterfvEXT"));
- GenerateTextureMipmapEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum )>(context->getProcAddress("glGenerateTextureMipmapEXT"));
- TextureStorage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei )>(context->getProcAddress("glTextureStorage3DEXT"));
- TextureStorage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei )>(context->getProcAddress("glTextureStorage2DEXT"));
- TextureStorage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei )>(context->getProcAddress("glTextureStorage1DEXT"));
- TextureStorage3DMultisampleEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureStorage3DMultisampleEXT"));
- TextureStorage2DMultisampleEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureStorage2DMultisampleEXT"));
- TextureImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage3DEXT"));
- TextureImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage2DEXT"));
- TextureImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage1DEXT"));
- TextureSubImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage3DEXT"));
- TextureSubImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage2DEXT"));
- TextureSubImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage1DEXT"));
- CompressedTextureSubImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage1DEXT"));
- CompressedTextureSubImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage2DEXT"));
- CompressedTextureSubImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage3DEXT"));
- CompressedTextureImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage1DEXT"));
- CompressedTextureImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage2DEXT"));
- CompressedTextureImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage3DEXT"));
-
- // Use the real DSA functions
- TextureParameteri = &QOpenGLTextureHelper::dsa_TextureParameteri;
- TextureParameteriv = &QOpenGLTextureHelper::dsa_TextureParameteriv;
- TextureParameterf = &QOpenGLTextureHelper::dsa_TextureParameterf;
- TextureParameterfv = &QOpenGLTextureHelper::dsa_TextureParameterfv;
- GenerateTextureMipmap = &QOpenGLTextureHelper::dsa_GenerateTextureMipmap;
- TextureStorage3D = &QOpenGLTextureHelper::dsa_TextureStorage3D;
- TextureStorage2D = &QOpenGLTextureHelper::dsa_TextureStorage2D;
- TextureStorage1D = &QOpenGLTextureHelper::dsa_TextureStorage1D;
- TextureStorage3DMultisample = &QOpenGLTextureHelper::dsa_TextureStorage3DMultisample;
- TextureStorage2DMultisample = &QOpenGLTextureHelper::dsa_TextureStorage2DMultisample;
- TextureImage3D = &QOpenGLTextureHelper::dsa_TextureImage3D;
- TextureImage2D = &QOpenGLTextureHelper::dsa_TextureImage2D;
- TextureImage1D = &QOpenGLTextureHelper::dsa_TextureImage1D;
- TextureSubImage3D = &QOpenGLTextureHelper::dsa_TextureSubImage3D;
- TextureSubImage2D = &QOpenGLTextureHelper::dsa_TextureSubImage2D;
- TextureSubImage1D = &QOpenGLTextureHelper::dsa_TextureSubImage1D;
- CompressedTextureSubImage1D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage1D;
- CompressedTextureSubImage2D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage2D;
- CompressedTextureSubImage3D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage3D;
- CompressedTextureImage1D = &QOpenGLTextureHelper::dsa_CompressedTextureImage1D;
- CompressedTextureImage2D = &QOpenGLTextureHelper::dsa_CompressedTextureImage2D;
- CompressedTextureImage3D = &QOpenGLTextureHelper::dsa_CompressedTextureImage3D;
- } else {
- // Use our own DSA emulation
- TextureParameteri = &QOpenGLTextureHelper::qt_TextureParameteri;
- TextureParameteriv = &QOpenGLTextureHelper::qt_TextureParameteriv;
- TextureParameterf = &QOpenGLTextureHelper::qt_TextureParameterf;
- TextureParameterfv = &QOpenGLTextureHelper::qt_TextureParameterfv;
- GenerateTextureMipmap = &QOpenGLTextureHelper::qt_GenerateTextureMipmap;
- TextureStorage3D = &QOpenGLTextureHelper::qt_TextureStorage3D;
- TextureStorage2D = &QOpenGLTextureHelper::qt_TextureStorage2D;
- TextureStorage1D = &QOpenGLTextureHelper::qt_TextureStorage1D;
- TextureStorage3DMultisample = &QOpenGLTextureHelper::qt_TextureStorage3DMultisample;
- TextureStorage2DMultisample = &QOpenGLTextureHelper::qt_TextureStorage2DMultisample;
- TextureImage3D = &QOpenGLTextureHelper::qt_TextureImage3D;
- TextureImage2D = &QOpenGLTextureHelper::qt_TextureImage2D;
- TextureImage1D = &QOpenGLTextureHelper::qt_TextureImage1D;
- TextureSubImage3D = &QOpenGLTextureHelper::qt_TextureSubImage3D;
- TextureSubImage2D = &QOpenGLTextureHelper::qt_TextureSubImage2D;
- TextureSubImage1D = &QOpenGLTextureHelper::qt_TextureSubImage1D;
- CompressedTextureSubImage1D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage1D;
- CompressedTextureSubImage2D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage2D;
- CompressedTextureSubImage3D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage3D;
- CompressedTextureImage1D = &QOpenGLTextureHelper::qt_CompressedTextureImage1D;
- CompressedTextureImage2D = &QOpenGLTextureHelper::qt_CompressedTextureImage2D;
- CompressedTextureImage3D = &QOpenGLTextureHelper::qt_CompressedTextureImage3D;
- }
-
- // Some DSA functions are part of NV_texture_multisample instead
- if (!context->isOpenGLES()
- && context->hasExtension(QByteArrayLiteral("GL_NV_texture_multisample"))) {
- TextureImage3DMultisampleNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLint , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureImage3DMultisampleNV"));
- TextureImage2DMultisampleNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLint , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureImage2DMultisampleNV"));
-
- TextureImage3DMultisample = &QOpenGLTextureHelper::dsa_TextureImage3DMultisample;
- TextureImage2DMultisample = &QOpenGLTextureHelper::dsa_TextureImage2DMultisample;
- } else {
- TextureImage3DMultisample = &QOpenGLTextureHelper::qt_TextureImage3DMultisample;
- TextureImage2DMultisample = &QOpenGLTextureHelper::qt_TextureImage2DMultisample;
- }
-
-#if defined(QT_OPENGL_ES_2)
- // Here we are targeting OpenGL ES 2.0+ only. This is likely using EGL, where,
- // similarly to WGL, non-extension functions (i.e. any function that is part of the
- // GLES spec) *may* not be queried via eglGetProcAddress.
-
- // OpenGL 1.0
- TexImage1D = 0;
-
- // OpenGL 1.1
- TexSubImage1D = 0;
-
- // OpenGL 1.3
- GetCompressedTexImage = 0;
- CompressedTexSubImage1D = 0;
- CompressedTexSubImage2D = ::glCompressedTexSubImage2D;
- CompressedTexImage1D = 0;
- CompressedTexImage2D = ::glCompressedTexImage2D;
- ActiveTexture = ::glActiveTexture;
-
- // OpenGL 3.0
- GenerateMipmap = ::glGenerateMipmap;
-
- // OpenGL 3.2
- TexImage3DMultisample = 0;
- TexImage2DMultisample = 0;
-
- // OpenGL 4.2
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (ctx->format().majorVersion() >= 3) {
- // OpenGL ES 3.0+ has immutable storage for 2D and 3D at least.
- QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
- TexStorage3D = extra->f.TexStorage3D;
- TexStorage2D = extra->f.TexStorage2D;
- } else {
- TexStorage3D = 0;
- TexStorage2D = 0;
- }
- TexStorage1D = 0;
-
- // OpenGL 4.3
- TexStorage3DMultisample = 0;
- TexStorage2DMultisample = 0;
- TexBufferRange = 0;
- TextureView = 0;
-
- // OpenGL ES 3.1+ has TexStorage2DMultisample
- if (ctx->format().version() >= qMakePair(3, 1)) {
- QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
- TexStorage2DMultisample = extra->f.TexStorage2DMultisample;
- }
-
-#endif
-
- if (context->isOpenGLES() && context->hasExtension(QByteArrayLiteral("GL_OES_texture_3D"))) {
- TexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid*)>(context->getProcAddress("glTexImage3DOES"));
- TexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid*)>(context->getProcAddress("glTexSubImage3DOES"));
- CompressedTexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid*)>(context->getProcAddress("glCompressedTexImage3DOES"));
- CompressedTexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid*)>(context->getProcAddress("glCompressedTexSubImage3DOES"));
- } else {
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (ctx->isOpenGLES() && ctx->format().majorVersion() >= 3) {
- // OpenGL ES 3.0+ has glTexImage3D.
- QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
- TexImage3D = extra->f.TexImage3D;
- TexSubImage3D = extra->f.TexSubImage3D;
- CompressedTexImage3D = extra->f.CompressedTexImage3D;
- CompressedTexSubImage3D = extra->f.CompressedTexSubImage3D;
- } else {
- // OpenGL 1.2
- TexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexImage3D"));
- TexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexSubImage3D"));
-
- // OpenGL 1.3
- CompressedTexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage3D"));
- CompressedTexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage3D"));
- }
- }
-
-#ifndef QT_OPENGL_ES_2
- // OpenGL 1.0 and 1.1
- TexImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexImage1D"));
- TexSubImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexSubImage1D"));\
-
- // OpenGL 1.3
- GetCompressedTexImage = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLvoid *)>(context->getProcAddress("glGetCompressedTexImage"));
- CompressedTexSubImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage1D"));
- CompressedTexSubImage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage2D"));
- CompressedTexImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage1D"));
- CompressedTexImage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage2D"));
- ActiveTexture = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glActiveTexture"));
-
- // OpenGL 3.0
- GenerateMipmap = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glGenerateMipmap"));
-
- // OpenGL 3.2
- TexImage3DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLint , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexImage3DMultisample"));
- TexImage2DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLint , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexImage2DMultisample"));
-
- // OpenGL 4.2
- TexStorage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei )>(context->getProcAddress("glTexStorage3D"));
- TexStorage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei )>(context->getProcAddress("glTexStorage2D"));
- TexStorage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei )>(context->getProcAddress("glTexStorage1D"));
-
- // OpenGL 4.3
- TexStorage3DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexStorage3DMultisample"));
- TexStorage2DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexStorage2DMultisample"));
- TexBufferRange = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLenum , GLuint , GLintptr , GLsizeiptr )>(context->getProcAddress("glTexBufferRange"));
- TextureView = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLuint , GLenum , GLuint , GLuint , GLuint , GLuint )>(context->getProcAddress("glTextureView"));
-#endif
-}
-
-void QOpenGLTextureHelper::dsa_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param)
-{
- Q_UNUSED(bindingTarget);
- TextureParameteriEXT(texture, target, pname, param);
-}
-
-void QOpenGLTextureHelper::dsa_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params)
-{
- Q_UNUSED(bindingTarget);
- TextureParameterivEXT(texture, target, pname, params);
-}
-
-void QOpenGLTextureHelper::dsa_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param)
-{
- Q_UNUSED(bindingTarget);
- TextureParameterfEXT(texture, target, pname, param);
-}
-
-void QOpenGLTextureHelper::dsa_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params)
-{
- Q_UNUSED(bindingTarget);
- TextureParameterfvEXT(texture, target, pname, params);
-}
-
-void QOpenGLTextureHelper::dsa_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget)
-{
- Q_UNUSED(bindingTarget);
- GenerateTextureMipmapEXT(texture, target);
-}
-
-void QOpenGLTextureHelper::dsa_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)
-{
- Q_UNUSED(bindingTarget);
- TextureStorage3DEXT(texture, target, levels, internalFormat, width, height, depth);
-}
-
-void QOpenGLTextureHelper::dsa_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)
-{
- Q_UNUSED(bindingTarget);
- TextureStorage2DEXT(texture, target, levels, internalFormat, width, height);
-}
-
-void QOpenGLTextureHelper::dsa_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width)
-{
- Q_UNUSED(bindingTarget);
- TextureStorage1DEXT(texture, target, levels, internalFormat, width);
-}
-
-void QOpenGLTextureHelper::dsa_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
-{
- Q_UNUSED(bindingTarget);
- TextureStorage3DMultisampleEXT(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations);
-}
-
-void QOpenGLTextureHelper::dsa_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
-{
- Q_UNUSED(bindingTarget);
- TextureStorage2DMultisampleEXT(texture, target, samples, internalFormat, width, height, fixedSampleLocations);
-}
-
-void QOpenGLTextureHelper::dsa_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- Q_UNUSED(bindingTarget);
- TextureImage3DEXT(texture, target, level, internalFormat, width, height, depth, border, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::dsa_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- Q_UNUSED(bindingTarget);
- TextureImage2DEXT(texture, target, level, internalFormat, width, height, border, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::dsa_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- Q_UNUSED(bindingTarget);
- TextureImage1DEXT(texture, target, level, internalFormat, width, border, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::dsa_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- Q_UNUSED(bindingTarget);
- TextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::dsa_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- Q_UNUSED(bindingTarget);
- TextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::dsa_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- Q_UNUSED(bindingTarget);
- TextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::dsa_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
-{
- Q_UNUSED(bindingTarget);
- TextureImage3DMultisampleNV(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations);
-}
-
-void QOpenGLTextureHelper::dsa_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
-{
- Q_UNUSED(bindingTarget);
- TextureImage2DMultisampleNV(texture, target, samples, internalFormat, width, height, fixedSampleLocations);
-}
-
-void QOpenGLTextureHelper::dsa_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits)
-{
- Q_UNUSED(bindingTarget);
- CompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits);
-}
-
-void QOpenGLTextureHelper::dsa_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits)
-{
- Q_UNUSED(bindingTarget);
- CompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits);
-}
-
-void QOpenGLTextureHelper::dsa_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits)
-{
- Q_UNUSED(bindingTarget);
- CompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
-}
-
-void QOpenGLTextureHelper::dsa_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits)
-{
- Q_UNUSED(bindingTarget);
- CompressedTextureImage1DEXT(texture, target, level, internalFormat, width, border, imageSize, bits);
-}
-
-void QOpenGLTextureHelper::dsa_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits)
-{
- Q_UNUSED(bindingTarget);
- CompressedTextureImage2DEXT(texture, target, level, internalFormat, width, height, border, imageSize, bits);
-}
-
-void QOpenGLTextureHelper::dsa_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits)
-{
- Q_UNUSED(bindingTarget);
- CompressedTextureImage3DEXT(texture, target, level, internalFormat, width, height, depth, border, imageSize, bits);
-}
-
-namespace {
-
-class TextureBinder
-{
-public:
- TextureBinder(QOpenGLFunctions *functions, GLuint texture, GLenum target, GLenum bindingTarget)
- : m_functions(functions)
- {
- // For cubemaps we can't use the standard DSA emulation as it is illegal to
- // try to bind a texture to one of the cubemap face targets. So we force the
- // target and binding target to the cubemap values in this case.
- switch (target) {
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- bindingTarget = GL_TEXTURE_BINDING_CUBE_MAP;
- m_target = GL_TEXTURE_CUBE_MAP;
- break;
-
- default:
- m_target = target;
- break;
- }
-
- m_functions->glGetIntegerv(bindingTarget, &m_oldTexture);
- m_functions->glBindTexture(m_target, texture);
- }
-
- ~TextureBinder()
- {
- m_functions->glBindTexture(m_target, m_oldTexture);
- }
-
-private:
- QOpenGLFunctions *m_functions;
- GLenum m_target;
- GLint m_oldTexture;
-};
-
-} // namespace
-
-void QOpenGLTextureHelper::qt_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- functions->glTexParameteri(target, pname, param);
-}
-
-void QOpenGLTextureHelper::qt_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- functions->glTexParameteriv(target, pname, params);
-}
-
-void QOpenGLTextureHelper::qt_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- functions->glTexParameterf(target, pname, param);
-}
-
-void QOpenGLTextureHelper::qt_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- functions->glTexParameterfv(target, pname, params);
-}
-
-void QOpenGLTextureHelper::qt_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- functions->glGenerateMipmap(target);
-}
-
-void QOpenGLTextureHelper::qt_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glTexStorage3D(target, levels, internalFormat, width, height, depth);
-}
-
-void QOpenGLTextureHelper::qt_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glTexStorage2D(target, levels, internalFormat, width, height);
-}
-
-void QOpenGLTextureHelper::qt_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glTexStorage1D(target, levels, internalFormat, width);
-}
-
-void QOpenGLTextureHelper::qt_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glTexStorage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
-}
-
-void QOpenGLTextureHelper::qt_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glTexStorage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
-}
-
-void QOpenGLTextureHelper::qt_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::qt_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- functions->glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::qt_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glTexImage1D(target, level, internalFormat, width, border, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::qt_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::qt_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- functions->glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::qt_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glTexSubImage1D(target, level, xoffset, width, format, type, pixels);
-}
-
-void QOpenGLTextureHelper::qt_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glTexImage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
-}
-
-void QOpenGLTextureHelper::qt_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glTexImage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
-}
-
-void QOpenGLTextureHelper::qt_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, bits);
-}
-
-void QOpenGLTextureHelper::qt_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, bits);
-}
-
-void QOpenGLTextureHelper::qt_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
-}
-
-void QOpenGLTextureHelper::qt_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glCompressedTexImage1D(target, level, internalFormat, width, border, imageSize, bits);
-}
-
-void QOpenGLTextureHelper::qt_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glCompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, bits);
-}
-
-void QOpenGLTextureHelper::qt_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits)
-{
- TextureBinder binder(functions, texture, target, bindingTarget);
- glCompressedTexImage3D(target, level, internalFormat, width, height, depth, border, imageSize, bits);
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopengltexturehelper_p.h b/src/gui/opengl/qopengltexturehelper_p.h
deleted file mode 100644
index 62d0125daf..0000000000
--- a/src/gui/opengl/qopengltexturehelper_p.h
+++ /dev/null
@@ -1,797 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLTEXTUREHELPER_P_H
-#define QOPENGLTEXTUREHELPER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtGui/private/qtguiglobal_p.h>
-
-#ifndef QT_NO_OPENGL
-
-#include "qopengl.h"
-#include "qopenglpixeltransferoptions.h"
-#include "qopengltexture.h"
-#include "qopenglfunctions.h"
-
-QT_BEGIN_NAMESPACE
-
-// Constants for OpenGL and OpenGL ES 3.0+ which are not available with OpenGL ES 2.0.
-#ifndef GL_TEXTURE_BASE_LEVEL
-#define GL_TEXTURE_BASE_LEVEL 0x813C
-#endif
-#ifndef GL_TEXTURE_MAX_LEVEL
-#define GL_TEXTURE_MAX_LEVEL 0x813D
-#endif
-#ifndef GL_TEXTURE_COMPARE_MODE
-#define GL_TEXTURE_COMPARE_MODE 0x884C
-#endif
-#ifndef GL_TEXTURE_COMPARE_FUNC
-#define GL_TEXTURE_COMPARE_FUNC 0x884D
-#endif
-
-// use GL_APICALL only on Android + __clang__
-#if !defined(Q_OS_ANDROID) || !defined(__clang__)
-# undef GL_APICALL
-# define GL_APICALL
-#elif !defined(GL_APICALL)
-# define GL_APICALL
-#endif
-
-class QOpenGLContext;
-
-class QOpenGLTextureHelper
-{
-public:
- QOpenGLTextureHelper(QOpenGLContext *context);
-
- // DSA-like API. Will either use real DSA or our emulation
- inline void glTextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param)
- {
- (this->*TextureParameteri)(texture, target, bindingTarget, pname, param);
- }
-
- inline void glTextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params)
- {
- (this->*TextureParameteriv)(texture, target, bindingTarget, pname, params);
- }
-
- inline void glTextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param)
- {
- (this->*TextureParameterf)(texture, target, bindingTarget, pname, param);
- }
-
- inline void glTextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params)
- {
- (this->*TextureParameterfv)(texture, target, bindingTarget, pname, params);
- }
-
- inline void glGenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget)
- {
- (this->*GenerateTextureMipmap)(texture, target, bindingTarget);
- }
-
- inline void glTextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
- GLsizei width, GLsizei height, GLsizei depth)
- {
- (this->*TextureStorage3D)(texture, target, bindingTarget, levels, internalFormat, width, height, depth);
- }
-
- inline void glTextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
- GLsizei width, GLsizei height)
- {
- (this->*TextureStorage2D)(texture, target, bindingTarget, levels, internalFormat, width, height);
- }
-
- inline void glTextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
- GLsizei width)
- {
- (this->*TextureStorage1D)(texture, target, bindingTarget, levels, internalFormat, width);
- }
-
- inline void glTextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat,
- GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
- {
- (this->*TextureStorage3DMultisample)(texture, target, bindingTarget, samples, internalFormat, width, height, depth, fixedSampleLocations);
- }
-
- inline void glTextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat,
- GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
- {
- (this->*TextureStorage2DMultisample)(texture, target, bindingTarget, samples, internalFormat, width, height, fixedSampleLocations);
- }
-
- inline void glTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
- {
- (this->*TextureImage3D)(texture, target, bindingTarget, level, internalFormat, width, height, depth, border, format, type, pixels);
- }
-
- inline void glTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
- {
- (this->*TextureImage2D)(texture, target, bindingTarget, level, internalFormat, width, height, border, format, type, pixels);
- }
-
- inline void glTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
- {
- (this->*TextureImage1D)(texture, target, bindingTarget, level, internalFormat, width, border, format, type, pixels);
- }
-
- inline void glTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
- GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
- const GLvoid *pixels, const QOpenGLPixelTransferOptions * const options = nullptr)
- {
- if (options) {
- QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
- setPixelUploadOptions(*options);
- (this->*TextureSubImage3D)(texture, target, bindingTarget, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
- setPixelUploadOptions(oldOptions);
- } else {
- (this->*TextureSubImage3D)(texture, target, bindingTarget, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
- }
- }
-
- inline void glTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset,
- GLsizei width, GLsizei height, GLenum format, GLenum type,
- const GLvoid *pixels, const QOpenGLPixelTransferOptions * const options = nullptr)
- {
- if (options) {
- QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
- setPixelUploadOptions(*options);
- (this->*TextureSubImage2D)(texture, target, bindingTarget, level, xoffset, yoffset, width, height, format, type, pixels);
- setPixelUploadOptions(oldOptions);
- } else {
- (this->*TextureSubImage2D)(texture, target, bindingTarget, level, xoffset, yoffset, width, height, format, type, pixels);
- }
- }
-
- inline void glTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset,
- GLsizei width, GLenum format, GLenum type,
- const GLvoid *pixels, const QOpenGLPixelTransferOptions * const options = nullptr)
- {
- if (options) {
- QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
- setPixelUploadOptions(*options);
- (this->*TextureSubImage1D)(texture, target, bindingTarget, level, xoffset, width, format, type, pixels);
- setPixelUploadOptions(oldOptions);
- } else {
- (this->*TextureSubImage1D)(texture, target, bindingTarget, level, xoffset, width, format, type, pixels);
- }
- }
-
- inline void glTextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat,
- GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
- {
- (this->*TextureImage3DMultisample)(texture, target, bindingTarget, samples, internalFormat, width, height, depth, fixedSampleLocations);
- }
-
- inline void glTextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat,
- GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
- {
- (this->*TextureImage2DMultisample)(texture, target, bindingTarget, samples, internalFormat, width, height, fixedSampleLocations);
- }
-
- inline void glCompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLsizei width,
- GLenum format, GLsizei imageSize, const GLvoid *bits,
- const QOpenGLPixelTransferOptions * const options = nullptr)
- {
- if (options) {
- QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
- setPixelUploadOptions(*options);
- (this->*CompressedTextureSubImage1D)(texture, target, bindingTarget, level, xoffset, width, format, imageSize, bits);
- setPixelUploadOptions(oldOptions);
- } else {
- (this->*CompressedTextureSubImage1D)(texture, target, bindingTarget, level, xoffset, width, format, imageSize, bits);
- }
- }
-
- inline void glCompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLint yoffset,
- GLsizei width, GLsizei height,
- GLenum format, GLsizei imageSize, const GLvoid *bits,
- const QOpenGLPixelTransferOptions * const options = nullptr)
- {
- if (options) {
- QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
- setPixelUploadOptions(*options);
- (this->*CompressedTextureSubImage2D)(texture, target, bindingTarget, level, xoffset, yoffset, width, height, format, imageSize, bits);
- setPixelUploadOptions(oldOptions);
- } else {
- (this->*CompressedTextureSubImage2D)(texture, target, bindingTarget, level, xoffset, yoffset, width, height, format, imageSize, bits);
- }
- }
-
- inline void glCompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLint yoffset, GLint zoffset,
- GLsizei width, GLsizei height, GLsizei depth,
- GLenum format, GLsizei imageSize, const GLvoid *bits,
- const QOpenGLPixelTransferOptions * const options = nullptr)
- {
- if (options) {
- QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
- setPixelUploadOptions(*options);
- (this->*CompressedTextureSubImage3D)(texture, target, bindingTarget, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
- setPixelUploadOptions(oldOptions);
- } else {
- (this->*CompressedTextureSubImage3D)(texture, target, bindingTarget, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
- }
- }
-
- inline void glCompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLenum internalFormat, GLsizei width,
- GLint border, GLsizei imageSize, const GLvoid *bits,
- const QOpenGLPixelTransferOptions * const options = nullptr)
- {
- if (options) {
- QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
- setPixelUploadOptions(*options);
- (this->*CompressedTextureImage1D)(texture, target, bindingTarget, level, internalFormat, width, border, imageSize, bits);
- setPixelUploadOptions(oldOptions);
- } else {
- (this->*CompressedTextureImage1D)(texture, target, bindingTarget, level, internalFormat, width, border, imageSize, bits);
- }
- }
-
- inline void glCompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLenum internalFormat, GLsizei width, GLsizei height,
- GLint border, GLsizei imageSize, const GLvoid *bits,
- const QOpenGLPixelTransferOptions * const options = nullptr)
-
- {
- if (options) {
- QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
- setPixelUploadOptions(*options);
- (this->*CompressedTextureImage2D)(texture, target, bindingTarget, level, internalFormat, width, height, border, imageSize, bits);
- setPixelUploadOptions(oldOptions);
- } else {
- (this->*CompressedTextureImage2D)(texture, target, bindingTarget, level, internalFormat, width, height, border, imageSize, bits);
- }
- }
-
- inline void glCompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
- GLint border, GLsizei imageSize, const GLvoid *bits,
- const QOpenGLPixelTransferOptions * const options = nullptr)
- {
- if (options) {
- QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
- setPixelUploadOptions(*options);
- (this->*CompressedTextureImage3D)(texture, target, bindingTarget, level, internalFormat, width, height, depth, border, imageSize, bits);
- setPixelUploadOptions(oldOptions);
- } else {
- (this->*CompressedTextureImage3D)(texture, target, bindingTarget, level, internalFormat, width, height, depth, border, imageSize, bits);
- }
- }
-
-private:
- // DSA wrapper (so we can use pointer to member function as switch)
- void dsa_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param);
-
- void dsa_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params);
-
- void dsa_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param);
-
- void dsa_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params);
-
- void dsa_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget);
-
- void dsa_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
- GLsizei width, GLsizei height, GLsizei depth);
-
- void dsa_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
- GLsizei width, GLsizei height);
-
- void dsa_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
- GLsizei width);
-
- void dsa_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat,
- GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
-
- void dsa_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat,
- GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
-
- void dsa_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-
- void dsa_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-
- void dsa_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-
- void dsa_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
- GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
-
- void dsa_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset,
- GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
-
- void dsa_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset,
- GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
-
- void dsa_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat,
- GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
-
- void dsa_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat,
- GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
-
- void dsa_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLsizei width,
- GLenum format, GLsizei imageSize, const GLvoid *bits);
-
- void dsa_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLint yoffset,
- GLsizei width, GLsizei height,
- GLenum format, GLsizei imageSize, const GLvoid *bits);
-
- void dsa_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLint yoffset, GLint zoffset,
- GLsizei width, GLsizei height, GLsizei depth,
- GLenum format, GLsizei imageSize, const GLvoid *bits);
-
- void dsa_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLenum internalFormat, GLsizei width,
- GLint border, GLsizei imageSize, const GLvoid *bits);
-
- void dsa_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLenum internalFormat, GLsizei width, GLsizei height,
- GLint border, GLsizei imageSize, const GLvoid *bits);
-
- void dsa_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
- GLint border, GLsizei imageSize, const GLvoid *bits);
-
- // DSA emulation API
- void qt_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param);
-
- void qt_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params);
-
- void qt_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param);
-
- void qt_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params);
-
- void qt_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget);
-
- void qt_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels,
- GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth);
-
- void qt_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels,
- GLenum internalFormat, GLsizei width, GLsizei height);
-
- void qt_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels,
- GLenum internalFormat, GLsizei width);
-
- void qt_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples,
- GLenum internalFormat, GLsizei width, GLsizei height,
- GLsizei depth, GLboolean fixedSampleLocations);
-
- void qt_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples,
- GLenum internalFormat, GLsizei width, GLsizei height,
- GLboolean fixedSampleLocations);
-
- void qt_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLsizei height, GLsizei depth,
- GLint border, GLenum format, GLenum type,
- const GLvoid *pixels);
-
- void qt_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLsizei height,
- GLint border, GLenum format, GLenum type,
- const GLvoid *pixels);
-
- void qt_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLint border, GLenum format, GLenum type,
- const GLvoid *pixels);
-
- void qt_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLint yoffset, GLint zoffset,
- GLsizei width, GLsizei height, GLsizei depth,
- GLenum format, GLenum type, const GLvoid *pixels);
-
- void qt_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLint yoffset,
- GLsizei width, GLsizei height,
- GLenum format, GLenum type, const GLvoid *pixels);
-
- void qt_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLsizei width,
- GLenum format, GLenum type, const GLvoid *pixels);
-
- void qt_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples,
- GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth,
- GLboolean fixedSampleLocations);
-
- void qt_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples,
- GLint internalFormat, GLsizei width, GLsizei height,
- GLboolean fixedSampleLocations);
-
- void qt_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLsizei width, GLenum format,
- GLsizei imageSize, const GLvoid *bits);
-
- void qt_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLint yoffset,
- GLsizei width, GLsizei height,
- GLenum format, GLsizei imageSize, const GLvoid *bits);
-
- void qt_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
- GLint xoffset, GLint yoffset, GLint zoffset,
- GLsizei width, GLsizei height, GLsizei depth,
- GLenum format, GLsizei imageSize, const GLvoid *bits);
-
- void qt_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLint border,
- GLsizei imageSize, const GLvoid *bits);
-
- void qt_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLsizei height, GLint border,
- GLsizei imageSize, const GLvoid *bits);
-
- void qt_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
- GLsizei width, GLsizei height, GLsizei depth, GLint border,
- GLsizei imageSize, const GLvoid *bits);
-
-public:
- // Raw OpenGL functions, resolved and used by our DSA-like static functions if no EXT_direct_state_access is available
-
- // OpenGL 1.0
- inline void glTexImage1D(GLenum target, GLint level, GLint internalFormat,
- GLsizei width, GLint border,
- GLenum format, GLenum type, const GLvoid *pixels)
- {
- TexImage1D(target, level, internalFormat, width, border, format, type, pixels);
- }
-
- // OpenGL 1.1
- inline void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width,
- GLenum format, GLenum type, const GLvoid *pixels)
- {
- TexSubImage1D(target, level, xoffset, width, format, type, pixels);
- }
-
- // OpenGL 1.2
- inline void glTexImage3D(GLenum target, GLint level, GLint internalFormat,
- GLsizei width, GLsizei height, GLsizei depth, GLint border,
- GLenum format, GLenum type, const GLvoid *pixels)
- {
- TexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels);
- }
-
- inline void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
- GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
- {
- TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
- }
-
- // OpenGL 1.3
- inline void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
- {
- GetCompressedTexImage(target, level, img);
- }
-
- inline void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width,
- GLenum format, GLsizei imageSize, const GLvoid *data)
- {
- CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
- }
-
- inline void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
- GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
- {
- CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
- }
-
- inline void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
- GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
- {
- CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
- }
-
- inline void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalFormat, GLsizei width,
- GLint border, GLsizei imageSize, const GLvoid *data)
- {
- CompressedTexImage1D(target, level, internalFormat, width, border, imageSize, data);
- }
-
- inline void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height,
- GLint border, GLsizei imageSize, const GLvoid *data)
- {
- CompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, data);
- }
-
- inline void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalFormat,
- GLsizei width, GLsizei height, GLsizei depth,
- GLint border, GLsizei imageSize, const GLvoid *data)
- {
- CompressedTexImage3D(target, level, internalFormat, width, height, depth, border, imageSize, data);
- }
-
- inline void glActiveTexture(GLenum texture)
- {
- ActiveTexture(texture);
- }
-
- // OpenGL 3.0
- inline void glGenerateMipmap(GLenum target)
- {
- GenerateMipmap(target);
- }
-
- // OpenGL 3.2
- inline void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalFormat,
- GLsizei width, GLsizei height, GLsizei depth,
- GLboolean fixedSampleLocations)
- {
- TexImage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
- }
-
- inline void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalFormat,
- GLsizei width, GLsizei height,
- GLboolean fixedSampleLocations)
- {
- TexImage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
- }
-
- // OpenGL 4.2
- inline void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)
- {
- TexStorage3D(target, levels, internalFormat, width, height, depth);
- }
-
- inline void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)
- {
- TexStorage2D(target, levels, internalFormat, width, height);
- }
-
- inline void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width)
- {
- TexStorage1D(target, levels, internalFormat, width);
- }
-
- // OpenGL 4.3
- inline void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalFormat,
- GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
- {
- TexStorage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
- }
-
- inline void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalFormat,
- GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
- {
- TexStorage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
- }
-
- inline void glTexBufferRange(GLenum target, GLenum internalFormat, GLuint buffer,
- GLintptr offset, GLsizeiptr size)
- {
- TexBufferRange(target, internalFormat, buffer, offset, size);
- }
-
- inline void glTextureView(GLuint texture, GLenum target, GLuint origTexture, GLenum internalFormat,
- GLuint minLevel, GLuint numLevels, GLuint minLayer, GLuint numLayers)
- {
- TextureView(texture, target, origTexture, internalFormat, minLevel, numLevels, minLayer, numLayers);
- }
-
- // Helper functions
- inline QOpenGLPixelTransferOptions savePixelUploadOptions()
- {
- QOpenGLPixelTransferOptions options;
- int val = 0;
- functions->glGetIntegerv(GL_UNPACK_ALIGNMENT, &val);
- options.setAlignment(val);
-#if !defined(QT_OPENGL_ES_2)
- functions->glGetIntegerv(GL_UNPACK_SKIP_IMAGES, &val);
- options.setSkipImages(val);
- functions->glGetIntegerv(GL_UNPACK_SKIP_ROWS, &val);
- options.setSkipRows(val);
- functions->glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &val);
- options.setSkipPixels(val);
- functions->glGetIntegerv(GL_UNPACK_IMAGE_HEIGHT, &val);
- options.setImageHeight(val);
- functions->glGetIntegerv(GL_UNPACK_ROW_LENGTH, &val);
- options.setRowLength(val);
- GLboolean b = GL_FALSE;
- functions->glGetBooleanv(GL_UNPACK_LSB_FIRST, &b);
- options.setLeastSignificantByteFirst(b);
- functions->glGetBooleanv(GL_UNPACK_SWAP_BYTES, &b);
- options.setSwapBytesEnabled(b);
-#endif
- return options;
- }
-
- inline void setPixelUploadOptions(const QOpenGLPixelTransferOptions &options)
- {
- functions->glPixelStorei(GL_UNPACK_ALIGNMENT, options.alignment());
-#if !defined(QT_OPENGL_ES_2)
- functions->glPixelStorei(GL_UNPACK_SKIP_IMAGES, options.skipImages());
- functions->glPixelStorei(GL_UNPACK_SKIP_ROWS, options.skipRows());
- functions->glPixelStorei(GL_UNPACK_SKIP_PIXELS, options.skipPixels());
- functions->glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, options.imageHeight());
- functions->glPixelStorei(GL_UNPACK_ROW_LENGTH, options.rowLength());
- functions->glPixelStorei(GL_UNPACK_LSB_FIRST, options.isLeastSignificantBitFirst());
- functions->glPixelStorei(GL_UNPACK_SWAP_BYTES, options.isSwapBytesEnabled());
-#endif
- }
-
- QOpenGLFunctions *functions;
-private:
- // Typedefs and pointers to member functions used to switch between EXT_direct_state_access and our own emulated DSA.
- // The argument match the corresponding GL function, but there's an extra "GLenum bindingTarget" which gets used with
- // the DSA emulation -- it contains the right GL_BINDING_TEXTURE_X to use.
- typedef void (QOpenGLTextureHelper::*TextureParameteriMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param);
- typedef void (QOpenGLTextureHelper::*TextureParameterivMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params);
- typedef void (QOpenGLTextureHelper::*TextureParameterfMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param);
- typedef void (QOpenGLTextureHelper::*TextureParameterfvMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params);
- typedef void (QOpenGLTextureHelper::*GenerateTextureMipmapMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget);
- typedef void (QOpenGLTextureHelper::*TextureStorage3DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth);
- typedef void (QOpenGLTextureHelper::*TextureStorage2DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height);
- typedef void (QOpenGLTextureHelper::*TextureStorage1DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width);
- typedef void (QOpenGLTextureHelper::*TextureStorage3DMultisampleMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
- typedef void (QOpenGLTextureHelper::*TextureStorage2DMultisampleMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
- typedef void (QOpenGLTextureHelper::*TextureImage3DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- typedef void (QOpenGLTextureHelper::*TextureImage2DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- typedef void (QOpenGLTextureHelper::*TextureImage1DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- typedef void (QOpenGLTextureHelper::*TextureSubImage3DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- typedef void (QOpenGLTextureHelper::*TextureSubImage2DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- typedef void (QOpenGLTextureHelper::*TextureSubImage1DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- typedef void (QOpenGLTextureHelper::*TextureImage3DMultisampleMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
- typedef void (QOpenGLTextureHelper::*TextureImage2DMultisampleMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
- typedef void (QOpenGLTextureHelper::*CompressedTextureSubImage1DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits);
- typedef void (QOpenGLTextureHelper::*CompressedTextureSubImage2DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits);
- typedef void (QOpenGLTextureHelper::*CompressedTextureSubImage3DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits);
- typedef void (QOpenGLTextureHelper::*CompressedTextureImage1DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits);
- typedef void (QOpenGLTextureHelper::*CompressedTextureImage2DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits);
- typedef void (QOpenGLTextureHelper::*CompressedTextureImage3DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits);
-
-
- TextureParameteriMemberFunc TextureParameteri;
- TextureParameterivMemberFunc TextureParameteriv;
- TextureParameterfMemberFunc TextureParameterf;
- TextureParameterfvMemberFunc TextureParameterfv;
- GenerateTextureMipmapMemberFunc GenerateTextureMipmap;
- TextureStorage3DMemberFunc TextureStorage3D;
- TextureStorage2DMemberFunc TextureStorage2D;
- TextureStorage1DMemberFunc TextureStorage1D;
- TextureStorage3DMultisampleMemberFunc TextureStorage3DMultisample;
- TextureStorage2DMultisampleMemberFunc TextureStorage2DMultisample;
- TextureImage3DMemberFunc TextureImage3D;
- TextureImage2DMemberFunc TextureImage2D;
- TextureImage1DMemberFunc TextureImage1D;
- TextureSubImage3DMemberFunc TextureSubImage3D;
- TextureSubImage2DMemberFunc TextureSubImage2D;
- TextureSubImage1DMemberFunc TextureSubImage1D;
- TextureImage3DMultisampleMemberFunc TextureImage3DMultisample;
- TextureImage2DMultisampleMemberFunc TextureImage2DMultisample;
- CompressedTextureSubImage1DMemberFunc CompressedTextureSubImage1D;
- CompressedTextureSubImage2DMemberFunc CompressedTextureSubImage2D;
- CompressedTextureSubImage3DMemberFunc CompressedTextureSubImage3D;
- CompressedTextureImage1DMemberFunc CompressedTextureImage1D;
- CompressedTextureImage2DMemberFunc CompressedTextureImage2D;
- CompressedTextureImage3DMemberFunc CompressedTextureImage3D;
-
- // Raw function pointers for core and DSA functions
-
- // EXT_direct_state_access used when DSA is available
- void (QOPENGLF_APIENTRYP TextureParameteriEXT)(GLuint texture, GLenum target, GLenum pname, GLint param);
- void (QOPENGLF_APIENTRYP TextureParameterivEXT)(GLuint texture, GLenum target, GLenum pname, const GLint *params);
- void (QOPENGLF_APIENTRYP TextureParameterfEXT)(GLuint texture, GLenum target, GLenum pname, GLfloat param);
- void (QOPENGLF_APIENTRYP TextureParameterfvEXT)(GLuint texture, GLenum target, GLenum pname, const GLfloat *params);
- void (QOPENGLF_APIENTRYP GenerateTextureMipmapEXT)(GLuint texture, GLenum target);
- void (QOPENGLF_APIENTRYP TextureStorage3DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth);
- void (QOPENGLF_APIENTRYP TextureStorage2DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height);
- void (QOPENGLF_APIENTRYP TextureStorage1DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width);
- void (QOPENGLF_APIENTRYP TextureStorage3DMultisampleEXT)(GLuint texture, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
- void (QOPENGLF_APIENTRYP TextureStorage2DMultisampleEXT)(GLuint texture, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
- void (QOPENGLF_APIENTRYP TextureImage3DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void (QOPENGLF_APIENTRYP TextureImage2DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void (QOPENGLF_APIENTRYP TextureImage1DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void (QOPENGLF_APIENTRYP TextureSubImage3DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
- void (QOPENGLF_APIENTRYP TextureSubImage2DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
- void (QOPENGLF_APIENTRYP TextureSubImage1DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
- void (QOPENGLF_APIENTRYP CompressedTextureSubImage1DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits);
- void (QOPENGLF_APIENTRYP CompressedTextureSubImage2DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits);
- void (QOPENGLF_APIENTRYP CompressedTextureSubImage3DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits);
- void (QOPENGLF_APIENTRYP CompressedTextureImage1DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits);
- void (QOPENGLF_APIENTRYP CompressedTextureImage2DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits);
- void (QOPENGLF_APIENTRYP CompressedTextureImage3DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits);
-
-
- // Plus some missing ones that are in the NV_texture_multisample extension instead
- void (QOPENGLF_APIENTRYP TextureImage3DMultisampleNV)(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
- void (QOPENGLF_APIENTRYP TextureImage2DMultisampleNV)(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
-
- // OpenGL 1.0
- void (QOPENGLF_APIENTRYP TexImage1D)(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-
- // OpenGL 1.1
- void (QOPENGLF_APIENTRYP TexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
-
- // OpenGL 1.2
- void (QOPENGLF_APIENTRYP TexImage3D)(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- void (QOPENGLF_APIENTRYP TexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
-
- // OpenGL 1.3
- void (QOPENGLF_APIENTRYP GetCompressedTexImage)(GLenum target, GLint level, GLvoid *img);
- void (QOPENGLF_APIENTRYP CompressedTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
- GL_APICALL void (QOPENGLF_APIENTRYP CompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
- void (QOPENGLF_APIENTRYP CompressedTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
- void (QOPENGLF_APIENTRYP CompressedTexImage1D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
- GL_APICALL void (QOPENGLF_APIENTRYP CompressedTexImage2D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
- void (QOPENGLF_APIENTRYP CompressedTexImage3D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
- GL_APICALL void (QOPENGLF_APIENTRYP ActiveTexture)(GLenum texture);
-
- // OpenGL 3.0
- GL_APICALL void (QOPENGLF_APIENTRYP GenerateMipmap)(GLenum target);
-
- // OpenGL 3.2
- void (QOPENGLF_APIENTRYP TexImage3DMultisample)(GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
- void (QOPENGLF_APIENTRYP TexImage2DMultisample)(GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
-
- // OpenGL 4.2
- void (QOPENGLF_APIENTRYP TexStorage3D)(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth);
- void (QOPENGLF_APIENTRYP TexStorage2D)(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height);
- void (QOPENGLF_APIENTRYP TexStorage1D)(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width);
-
- // OpenGL 4.3
- void (QOPENGLF_APIENTRYP TexStorage3DMultisample)(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
- void (QOPENGLF_APIENTRYP TexStorage2DMultisample)(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
- void (QOPENGLF_APIENTRYP TexBufferRange)(GLenum target, GLenum internalFormat, GLuint buffer, GLintptr offset, GLsizeiptr size);
- void (QOPENGLF_APIENTRYP TextureView)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
-};
-
-QT_END_NAMESPACE
-
-#undef Q_CALL_MEMBER_FUNCTION
-
-#endif // QT_NO_OPENGL
-
-#endif // QOPENGLTEXTUREHELPER_P_H
diff --git a/src/gui/opengl/qopengltextureuploader.cpp b/src/gui/opengl/qopengltextureuploader.cpp
deleted file mode 100644
index 9e393bc47a..0000000000
--- a/src/gui/opengl/qopengltextureuploader.cpp
+++ /dev/null
@@ -1,381 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopengltextureuploader_p.h"
-
-#include <qimage.h>
-#include <qmath.h>
-#include <qopenglfunctions.h>
-#include <private/qopenglcontext_p.h>
-#include <private/qopenglextensions_p.h>
-
-#ifndef GL_RED
-#define GL_RED 0x1903
-#endif
-
-#ifndef GL_GREEN
-#define GL_GREEN 0x1904
-#endif
-
-#ifndef GL_BLUE
-#define GL_BLUE 0x1905
-#endif
-
-#ifndef GL_RGB10_A2
-#define GL_RGB10_A2 0x8059
-#endif
-
-#ifndef GL_RGBA16
-#define GL_RGBA16 0x805B
-#endif
-
-#ifndef GL_BGR
-#define GL_BGR 0x80E0
-#endif
-
-#ifndef GL_BGRA
-#define GL_BGRA 0x80E1
-#endif
-
-#ifndef GL_UNSIGNED_INT_8_8_8_8_REV
-#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
-#endif
-
-#ifndef GL_UNSIGNED_INT_2_10_10_10_REV
-#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
-#endif
-
-#ifndef GL_TEXTURE_SWIZZLE_R
-#define GL_TEXTURE_SWIZZLE_R 0x8E42
-#endif
-
-#ifndef GL_TEXTURE_SWIZZLE_G
-#define GL_TEXTURE_SWIZZLE_G 0x8E43
-#endif
-
-#ifndef GL_TEXTURE_SWIZZLE_B
-#define GL_TEXTURE_SWIZZLE_B 0x8E44
-#endif
-
-#ifndef GL_TEXTURE_SWIZZLE_A
-#define GL_TEXTURE_SWIZZLE_A 0x8E45
-#endif
-
-#ifndef GL_SRGB
-#define GL_SRGB 0x8C40
-#endif
-#ifndef GL_SRGB_ALPHA
-#define GL_SRGB_ALPHA 0x8C42
-#endif
-
-QT_BEGIN_NAMESPACE
-
-qsizetype QOpenGLTextureUploader::textureImage(GLenum target, const QImage &image, QOpenGLTextureUploader::BindOptions options, QSize maxSize)
-{
- QOpenGLContext *context = QOpenGLContext::currentContext();
- QOpenGLExtensions *funcs = static_cast<QOpenGLExtensions*>(context->functions());
-
- QImage tx;
- GLenum externalFormat;
- GLenum internalFormat;
- GLuint pixelType;
- QImage::Format targetFormat = QImage::Format_Invalid;
- const bool isOpenGL12orBetter = !context->isOpenGLES() && (context->format().majorVersion() >= 2 || context->format().minorVersion() >= 2);
- const bool isOpenGLES3orBetter = context->isOpenGLES() && context->format().majorVersion() >= 3;
- const bool sRgbBinding = (options & SRgbBindOption);
- Q_ASSERT(isOpenGL12orBetter || context->isOpenGLES());
- Q_ASSERT((options & (SRgbBindOption | UseRedForAlphaAndLuminanceBindOption)) != (SRgbBindOption | UseRedForAlphaAndLuminanceBindOption));
-
- switch (image.format()) {
- case QImage::Format_RGB32:
- case QImage::Format_ARGB32:
- case QImage::Format_ARGB32_Premultiplied:
- if (isOpenGL12orBetter) {
- externalFormat = GL_BGRA;
- internalFormat = GL_RGBA;
- pixelType = GL_UNSIGNED_INT_8_8_8_8_REV;
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
- // Without GL_UNSIGNED_INT_8_8_8_8_REV, BGRA only matches ARGB on little endian:
- } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::BGRATextureFormat) && !sRgbBinding) {
- // The GL_EXT_texture_format_BGRA8888 extension requires the internal format to match the external.
- externalFormat = internalFormat = GL_BGRA;
- pixelType = GL_UNSIGNED_BYTE;
- } else if (context->isOpenGLES() && context->hasExtension(QByteArrayLiteral("GL_APPLE_texture_format_BGRA8888"))) {
- // Is only allowed as an external format like OpenGL.
- externalFormat = GL_BGRA;
- internalFormat = GL_RGBA;
- pixelType = GL_UNSIGNED_BYTE;
-#endif
- } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
- funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_BLUE);
- funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_RED);
-#else
- funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_GREEN);
- funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, GL_BLUE);
- funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_ALPHA);
- funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, GL_RED);
-#endif
- externalFormat = internalFormat = GL_RGBA;
- pixelType = GL_UNSIGNED_BYTE;
- } else {
- // No support for direct ARGB32 upload.
- break;
- }
- targetFormat = image.format();
- break;
- case QImage::Format_BGR30:
- case QImage::Format_A2BGR30_Premultiplied:
- if (sRgbBinding) {
- // Always needs conversion
- break;
- } else if (isOpenGL12orBetter || isOpenGLES3orBetter) {
- pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
- externalFormat = GL_RGBA;
- internalFormat = GL_RGB10_A2;
- targetFormat = image.format();
- }
- break;
- case QImage::Format_RGB30:
- case QImage::Format_A2RGB30_Premultiplied:
- if (sRgbBinding) {
- // Always needs conversion
- break;
- } else if (isOpenGL12orBetter) {
- pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
- externalFormat = GL_BGRA;
- internalFormat = GL_RGB10_A2;
- targetFormat = image.format();
- } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
- funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_RED);
- funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_BLUE);
- pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
- externalFormat = GL_RGBA;
- internalFormat = GL_RGB10_A2;
- targetFormat = image.format();
- }
- break;
- case QImage::Format_RGB444:
- case QImage::Format_RGB555:
- case QImage::Format_RGB16:
- if (isOpenGL12orBetter || context->isOpenGLES()) {
- externalFormat = internalFormat = GL_RGB;
- pixelType = GL_UNSIGNED_SHORT_5_6_5;
- targetFormat = QImage::Format_RGB16;
- }
- break;
- case QImage::Format_RGB666:
- case QImage::Format_RGB888:
- externalFormat = internalFormat = GL_RGB;
- pixelType = GL_UNSIGNED_BYTE;
- targetFormat = QImage::Format_RGB888;
- break;
- case QImage::Format_BGR888:
- if (isOpenGL12orBetter) {
- externalFormat = GL_BGR;
- internalFormat = GL_RGB;
- pixelType = GL_UNSIGNED_BYTE;
- targetFormat = QImage::Format_BGR888;
- } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
- funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_RED);
- funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_BLUE);
- externalFormat = internalFormat = GL_RGB;
- pixelType = GL_UNSIGNED_BYTE;
- targetFormat = QImage::Format_BGR888;
- }
- break;
- case QImage::Format_RGBX8888:
- case QImage::Format_RGBA8888:
- case QImage::Format_RGBA8888_Premultiplied:
- externalFormat = internalFormat = GL_RGBA;
- pixelType = GL_UNSIGNED_BYTE;
- targetFormat = image.format();
- break;
- case QImage::Format_RGBX64:
- case QImage::Format_RGBA64:
- case QImage::Format_RGBA64_Premultiplied:
- externalFormat = internalFormat = GL_RGBA;
- if (isOpenGL12orBetter || (context->isOpenGLES() && context->format().majorVersion() >= 3))
- internalFormat = GL_RGBA16;
- pixelType = GL_UNSIGNED_SHORT;
- targetFormat = image.format();
- break;
- case QImage::Format_Indexed8:
- if (sRgbBinding) {
- // Always needs conversion
- break;
- } else if (options & UseRedForAlphaAndLuminanceBindOption) {
- externalFormat = internalFormat = GL_RED;
- pixelType = GL_UNSIGNED_BYTE;
- targetFormat = image.format();
- }
- break;
- case QImage::Format_Alpha8:
- if (sRgbBinding) {
- // Always needs conversion
- break;
- } else if (options & UseRedForAlphaAndLuminanceBindOption) {
- externalFormat = internalFormat = GL_RED;
- pixelType = GL_UNSIGNED_BYTE;
- targetFormat = image.format();
- } else if (context->isOpenGLES() || context->format().profile() != QSurfaceFormat::CoreProfile) {
- externalFormat = internalFormat = GL_ALPHA;
- pixelType = GL_UNSIGNED_BYTE;
- targetFormat = image.format();
- } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ALPHA);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_ZERO);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_ZERO);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ZERO);
- externalFormat = internalFormat = GL_RED;
- pixelType = GL_UNSIGNED_BYTE;
- targetFormat = image.format();
- }
- break;
- case QImage::Format_Grayscale8:
- if (sRgbBinding) {
- // Always needs conversion
- break;
- } else if (options & UseRedForAlphaAndLuminanceBindOption) {
- externalFormat = internalFormat = GL_RED;
- pixelType = GL_UNSIGNED_BYTE;
- targetFormat = image.format();
- } else if (context->isOpenGLES() || context->format().profile() != QSurfaceFormat::CoreProfile) {
- externalFormat = internalFormat = GL_LUMINANCE;
- pixelType = GL_UNSIGNED_BYTE;
- targetFormat = image.format();
- } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ONE);
- externalFormat = internalFormat = GL_RED;
- pixelType = GL_UNSIGNED_BYTE;
- targetFormat = image.format();
- }
- break;
- case QImage::Format_Grayscale16:
- if (sRgbBinding) {
- // Always needs conversion
- break;
- } else if (options & UseRedForAlphaAndLuminanceBindOption) {
- externalFormat = internalFormat = GL_RED;
- pixelType = GL_UNSIGNED_SHORT;
- targetFormat = image.format();
- } else if (context->isOpenGLES() || context->format().profile() != QSurfaceFormat::CoreProfile) {
- externalFormat = internalFormat = GL_LUMINANCE;
- pixelType = GL_UNSIGNED_SHORT;
- targetFormat = image.format();
- } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ONE);
- externalFormat = internalFormat = GL_RED;
- pixelType = GL_UNSIGNED_SHORT;
- targetFormat = image.format();
- }
- break;
- default:
- break;
- }
-
- // If no direct upload was detected above, convert to RGBA8888 and upload that
- if (targetFormat == QImage::Format_Invalid) {
- externalFormat = internalFormat = GL_RGBA;
- pixelType = GL_UNSIGNED_BYTE;
- if (!image.hasAlphaChannel())
- targetFormat = QImage::Format_RGBX8888;
- else
- targetFormat = QImage::Format_RGBA8888;
- }
-
- if (options & PremultipliedAlphaBindOption) {
- if (targetFormat == QImage::Format_ARGB32)
- targetFormat = QImage::Format_ARGB32_Premultiplied;
- else if (targetFormat == QImage::Format_RGBA8888)
- targetFormat = QImage::Format_RGBA8888_Premultiplied;
- else if (targetFormat == QImage::Format_RGBA64)
- targetFormat = QImage::Format_RGBA64_Premultiplied;
- } else {
- if (targetFormat == QImage::Format_ARGB32_Premultiplied)
- targetFormat = QImage::Format_ARGB32;
- else if (targetFormat == QImage::Format_RGBA8888_Premultiplied)
- targetFormat = QImage::Format_RGBA8888;
- else if (targetFormat == QImage::Format_RGBA64_Premultiplied)
- targetFormat = QImage::Format_RGBA64;
- }
-
- if (sRgbBinding) {
- Q_ASSERT(internalFormat == GL_RGBA || internalFormat == GL_RGB);
- if (image.hasAlphaChannel())
- internalFormat = GL_SRGB_ALPHA;
- else
- internalFormat = GL_SRGB;
- }
-
- if (image.format() != targetFormat)
- tx = image.convertToFormat(targetFormat);
- else
- tx = image;
-
- QSize newSize = tx.size();
- if (!maxSize.isEmpty())
- newSize = newSize.boundedTo(maxSize);
- if (options & PowerOfTwoBindOption) {
- newSize.setWidth(qNextPowerOfTwo(newSize.width() - 1));
- newSize.setHeight(qNextPowerOfTwo(newSize.height() - 1));
- }
-
- if (newSize != tx.size())
- tx = tx.scaled(newSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
-
- // Handle cases where the QImage is actually a sub image of its image data:
- qsizetype naturalBpl = ((qsizetype(tx.width()) * tx.depth() + 31) >> 5) << 2;
- if (tx.bytesPerLine() != naturalBpl)
- tx = tx.copy(tx.rect());
-
- funcs->glTexImage2D(target, 0, internalFormat, tx.width(), tx.height(), 0, externalFormat, pixelType, tx.constBits());
-
- qsizetype cost = qint64(tx.width()) * tx.height() * tx.depth() / 8;
-
- return cost;
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopengltextureuploader_p.h b/src/gui/opengl/qopengltextureuploader_p.h
deleted file mode 100644
index 0dcf709d7e..0000000000
--- a/src/gui/opengl/qopengltextureuploader_p.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QOPENGLTEXTUREUPLOADER_P_H
-#define QOPENGLTEXTUREUPLOADER_P_H
-
-#include <QtCore/qsize.h>
-#include <QtGui/private/qtguiglobal_p.h>
-#include <QtGui/private/qopenglcontext_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QImage;
-
-class Q_GUI_EXPORT QOpenGLTextureUploader
-{
-public:
- enum BindOption {
- NoBindOption = 0x0000,
- PremultipliedAlphaBindOption = 0x0001,
- UseRedForAlphaAndLuminanceBindOption = 0x0002,
- SRgbBindOption = 0x0004,
- PowerOfTwoBindOption = 0x0008
- };
- Q_DECLARE_FLAGS(BindOptions, BindOption)
- Q_FLAGS(BindOptions)
-
- static qsizetype textureImage(GLenum target, const QImage &image, BindOptions options, QSize maxSize = QSize());
-
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLTextureUploader::BindOptions)
-
-QT_END_NAMESPACE
-
-#endif
-
diff --git a/src/gui/opengl/qopengltimerquery.cpp b/src/gui/opengl/qopengltimerquery.cpp
deleted file mode 100644
index a4e10b42f7..0000000000
--- a/src/gui/opengl/qopengltimerquery.cpp
+++ /dev/null
@@ -1,880 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopengltimerquery.h"
-
-#include "qopenglqueryhelper_p.h"
-#include <QtCore/private/qobject_p.h>
-#include <QtGui/QOpenGLContext>
-#include <QtGui/QOpenGLFunctions>
-
-QT_BEGIN_NAMESPACE
-
-// Helper class used as fallback if OpenGL <3.3 is being used with EXT_timer_query
-class QExtTimerQueryHelper
-{
-public:
- QExtTimerQueryHelper(QOpenGLContext *context)
- {
- Q_ASSERT(context);
- GetQueryObjectui64vEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLuint64EXT *)>(context->getProcAddress("glGetQueryObjectui64vEXT"));
- GetQueryObjecti64vEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint64EXT *)>(context->getProcAddress("glGetQueryObjecti64vEXT"));
- }
-
- inline void glGetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64EXT *params)
- {
- GetQueryObjectui64vEXT(id, pname, params);
- }
-
- inline void glGetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64EXT *params)
- {
- GetQueryObjecti64vEXT(id, pname, params);
- }
-
-private:
- void (QOPENGLF_APIENTRYP GetQueryObjectui64vEXT)(GLuint id, GLenum pname, GLuint64EXT *params);
- void (QOPENGLF_APIENTRYP GetQueryObjecti64vEXT)(GLuint id, GLenum pname, GLint64EXT *params);
-};
-
-class QOpenGLTimerQueryPrivate : public QObjectPrivate
-{
-public:
- QOpenGLTimerQueryPrivate()
- : QObjectPrivate(),
- context(nullptr),
- ext(nullptr),
- timeInterval(0),
- timer(0)
- {
- }
-
- ~QOpenGLTimerQueryPrivate()
- {
- delete core;
- delete ext;
- }
-
- bool create();
- void destroy();
- void begin();
- void end();
- GLuint64 waitForTimeStamp() const;
- void recordTimestamp();
- bool isResultAvailable() const;
- GLuint64 result() const;
-
- // There are several cases we must handle:
- // OpenGL >=3.3 includes timer queries as a core feature
- // ARB_timer_query has same functionality as above. Requires OpenGL 3.2
- // EXT_timer_query offers limited support. Can be used with OpenGL >=1.5
- //
- // Note that some implementations (OS X) provide OpenGL 3.2 but do not expose the
- // ARB_timer_query extension. In such situations we must also be able to handle
- // using the EXT_timer_query extension with any version of OpenGL.
- //
- // OpenGL 1.5 or above contains the generic query API and OpenGL 3.3 and
- // ARB_timer_query provide the 64-bit query API. These are wrapped by
- // QOpenGLQueryHelper. All we need to handle in addition is the EXT_timer_query
- // case and to take care not to call the Core/ARB functions when we only
- // have EXT_timer_query available.
- QOpenGLContext *context;
- QOpenGLQueryHelper *core;
- QExtTimerQueryHelper *ext;
- mutable GLuint64 timeInterval;
- GLuint timer;
-};
-
-bool QOpenGLTimerQueryPrivate::create()
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
-
- if (timer && context == ctx)
- return true;
-
- context = ctx;
- if (!context) {
- qWarning("A current OpenGL context is required to create timer query objects");
- return false;
- }
-
- if (context->isOpenGLES()) {
- qWarning("QOpenGLTimerQuery: Not supported on OpenGL ES");
- return false;
- }
-
- // Resolve the functions provided by OpenGL 1.5 and OpenGL 3.3 or ARB_timer_query
- core = new QOpenGLQueryHelper(context);
-
- // Check to see if we also need to resolve the functions for EXT_timer_query
- QSurfaceFormat f = context->format();
- if (f.version() <= qMakePair<int, int>(3, 2)
- && !context->hasExtension(QByteArrayLiteral("GL_ARB_timer_query"))
- && context->hasExtension(QByteArrayLiteral("GL_EXT_timer_query"))) {
- ext = new QExtTimerQueryHelper(context);
- } else if (f.version() <= qMakePair<int, int>(3, 2)
- && !context->hasExtension(QByteArrayLiteral("GL_ARB_timer_query"))
- && !context->hasExtension(QByteArrayLiteral("GL_EXT_timer_query"))) {
- qWarning("QOpenGLTimerQuery requires one of:\n"
- " OpenGL 3.3 or newer,\n"
- " OpenGL 3.2 and the ARB_timer_query extension\n"
- " or the EXT_timer query extension");
- return false;
- }
-
- core->glGenQueries(1, &timer);
- return (timer != 0);
-}
-
-void QOpenGLTimerQueryPrivate::destroy()
-{
- if (!timer)
- return;
-
- core->glDeleteQueries(1, &timer);
- timer = 0;
- context = nullptr;
-}
-
-// GL_TIME_ELAPSED_EXT is not defined on OS X 10.6
-#if !defined(GL_TIME_ELAPSED_EXT)
-#define GL_TIME_ELAPSED_EXT 0x88BF
-#endif
-
-// GL_TIME_ELAPSED is not defined on OS X 10.7 or 10.8 yet
-#if !defined(GL_TIME_ELAPSED)
-#define GL_TIME_ELAPSED GL_TIME_ELAPSED_EXT
-#endif
-
-void QOpenGLTimerQueryPrivate::begin()
-{
- core->glBeginQuery(GL_TIME_ELAPSED, timer);
-}
-
-void QOpenGLTimerQueryPrivate::end()
-{
- core->glEndQuery(GL_TIME_ELAPSED);
-}
-
-void QOpenGLTimerQueryPrivate::recordTimestamp()
-{
- // Don't call glQueryCounter if we only have EXT_timer_query
-#if defined(GL_TIMESTAMP)
- if (!ext)
- core->glQueryCounter(timer, GL_TIMESTAMP);
- else
- qWarning("QOpenGLTimerQuery::recordTimestamp() requires OpenGL 3.3 or GL_ARB_timer_query");
-#else
- qWarning("QOpenGLTimerQuery::recordTimestamp() requires OpenGL 3.3 or GL_ARB_timer_query");
-#endif
-}
-
-GLuint64 QOpenGLTimerQueryPrivate::waitForTimeStamp() const
-{
- GLint64 tmp = 0;
-#if defined(GL_TIMESTAMP)
- if (!ext)
- core->glGetInteger64v(GL_TIMESTAMP, &tmp);
- else
- qWarning("QOpenGLTimerQuery::waitForTimestamp() requires OpenGL 3.3 or GL_ARB_timer_query");
-#else
- qWarning("QOpenGLTimerQuery::waitForTimestamp() requires OpenGL 3.3 or GL_ARB_timer_query");
-#endif
- GLuint64 timestamp(tmp);
- return timestamp;
-}
-
-bool QOpenGLTimerQueryPrivate::isResultAvailable() const
-{
- GLuint available = GL_FALSE;
- core->glGetQueryObjectuiv(timer, GL_QUERY_RESULT_AVAILABLE, &available);
- return available;
-}
-
-GLuint64 QOpenGLTimerQueryPrivate::result() const
-{
- if (!ext)
- core->glGetQueryObjectui64v(timer, GL_QUERY_RESULT, &timeInterval);
- else
- ext->glGetQueryObjectui64vEXT(timer, GL_QUERY_RESULT, &timeInterval);
- return timeInterval;
-}
-
-/*!
- \class QOpenGLTimerQuery
- \brief The QOpenGLTimerQuery class wraps an OpenGL timer query object.
- \inmodule QtGui
- \since 5.1
- \ingroup painting-3D
-
- OpenGL timer query objects are OpenGL managed resources to measure the
- execution times of sequences of OpenGL commands on the GPU.
-
- OpenGL offers various levels of support for timer queries, depending on
- the version of OpenGL you have and the presence of the ARB_timer_query or
- EXT_timer_query extensions. The support can be summarized as:
-
- \list
- \li OpenGL >=3.3 offers full support for all timer query functionality.
- \li OpenGL 3.2 with the ARB_timer_query extension offers full support
- for all timer query functionality.
- \li OpenGL <=3.2 with the EXT_timer_query extension offers limited support
- in that the timestamp of the GPU cannot be queried. Places where this
- impacts functions provided by Qt classes will be highlighted in the
- function documentation.
- \li OpenGL ES 2 (and OpenGL ES 3) do not provide any support for OpenGL
- timer queries.
- \endlist
-
- OpenGL represents time with a granularity of 1 nanosecond (1e-9 seconds). As a
- consequence of this, 32-bit integers would only give a total possible duration
- of approximately 4 seconds, which would not be difficult to exceed in poorly
- performing or lengthy operations. OpenGL therefore uses 64 bit integer types
- to represent times. A GLuint64 variable has enough width to contain a duration
- of hundreds of years, which is plenty for real-time rendering needs.
-
- As with the other Qt OpenGL classes, QOpenGLTimerQuery has a create()
- function to create the underlying OpenGL object. This is to allow the developer to
- ensure that there is a valid current OpenGL context at the time.
-
- Once created, timer queries can be issued in one of several ways. The simplest
- method is to delimit a block of commands with calls to begin() and end(). This
- instructs OpenGL to measure the time taken from completing all commands issued
- prior to begin() until the completion of all commands issued prior to end().
-
- At the end of a frame we can retrieve the results by calling waitForResult().
- As this function's name implies, it blocks CPU execution until OpenGL notifies
- that the timer query result is available. To avoid blocking, you can check
- if the query result is available by calling isResultAvailable(). Note that
- modern GPUs are deeply pipelined and query results may not become available for
- between 1-5 frames after they were issued.
-
- Note that OpenGL does not permit nesting or interleaving of multiple timer queries
- using begin() and end(). Using multiple timer queries and recordTimestamp() avoids
- this limitation. When using recordTimestamp() the result can be obtained at
- some later time using isResultAvailable() and waitForResult(). Qt provides the
- convenience class QOpenGLTimeMonitor that helps with using multiple query objects.
-
- \sa QOpenGLTimeMonitor
-*/
-
-/*!
- Creates a QOpenGLTimerQuery instance with the given \a parent. You must call create()
- with a valid OpenGL context before using.
-*/
-QOpenGLTimerQuery::QOpenGLTimerQuery(QObject *parent)
- : QObject(*new QOpenGLTimerQueryPrivate, parent)
-{
-}
-
-/*!
- Destroys the QOpenGLTimerQuery and the underlying OpenGL resource.
-*/
-QOpenGLTimerQuery::~QOpenGLTimerQuery()
-{
- QOpenGLContext* ctx = QOpenGLContext::currentContext();
-
- Q_D(QOpenGLTimerQuery);
- QOpenGLContext *oldContext = nullptr;
- if (d->context != ctx) {
- oldContext = ctx;
- if (d->context->makeCurrent(oldContext->surface())) {
- ctx = d->context;
- } else {
- qWarning("QOpenGLTimerQuery::~QOpenGLTimerQuery() failed to make query objects's context current");
- ctx = nullptr;
- }
- }
-
- if (ctx)
- destroy();
-
- if (oldContext) {
- if (!oldContext->makeCurrent(oldContext->surface()))
- qWarning("QOpenGLTimerQuery::~QOpenGLTimerQuery() failed to restore current context");
- }
-}
-
-/*!
- Creates the underlying OpenGL timer query object. There must be a valid OpenGL context
- that supports query objects current for this function to succeed.
-
- Returns \c true if the OpenGL timer query object was successfully created.
-*/
-bool QOpenGLTimerQuery::create()
-{
- Q_D(QOpenGLTimerQuery);
- return d->create();
-}
-
-/*!
- Destroys the underlying OpenGL timer query object. The context that was current when
- create() was called must be current when calling this function.
-*/
-void QOpenGLTimerQuery::destroy()
-{
- Q_D(QOpenGLTimerQuery);
- d->destroy();
-}
-
-/*!
- Returns \c true if the underlying OpenGL query object has been created. If this
- returns \c true and the associated OpenGL context is current, then you are able to issue
- queries with this object.
-*/
-bool QOpenGLTimerQuery::isCreated() const
-{
- Q_D(const QOpenGLTimerQuery);
- return (d->timer != 0);
-}
-
-/*!
- Returns the id of the underlying OpenGL query object.
-*/
-GLuint QOpenGLTimerQuery::objectId() const
-{
- Q_D(const QOpenGLTimerQuery);
- return d->timer;
-}
-
-/*!
- Marks the start point in the OpenGL command queue for a sequence of commands to
- be timed by this query object.
-
- This is useful for simple use-cases. Usually it is better to use recordTimestamp().
-
- \sa end(), isResultAvailable(), waitForResult(), recordTimestamp()
-*/
-void QOpenGLTimerQuery::begin()
-{
- Q_D(QOpenGLTimerQuery);
- d->begin();
-}
-
-/*!
- Marks the end point in the OpenGL command queue for a sequence of commands to
- be timed by this query object.
-
- This is useful for simple use-cases. Usually it is better to use recordTimestamp().
-
- \sa begin(), isResultAvailable(), waitForResult(), recordTimestamp()
-*/
-void QOpenGLTimerQuery::end()
-{
- Q_D(QOpenGLTimerQuery);
- d->end();
-}
-
-/*!
- Places a marker in the OpenGL command queue for the GPU to record the timestamp
- when this marker is reached by the GPU. This function is non-blocking and the
- result will become available at some later time.
-
- The availability of the result can be checked with isResultAvailable(). The result
- can be fetched with waitForResult() which will block if the result is not yet
- available.
-
- \sa waitForResult(), isResultAvailable(), begin(), end()
-*/
-void QOpenGLTimerQuery::recordTimestamp()
-{
- Q_D(QOpenGLTimerQuery);
- return d->recordTimestamp();
-}
-
-/*!
- Returns the current timestamp of the GPU when all previously issued OpenGL
- commands have been received but not necessarily executed by the GPU.
-
- This function blocks until the result is returned.
-
- \sa recordTimestamp()
-*/
-GLuint64 QOpenGLTimerQuery::waitForTimestamp() const
-{
- Q_D(const QOpenGLTimerQuery);
- return d->waitForTimeStamp();
-}
-
-/*!
- Returns \c true if the OpenGL timer query result is available.
-
- This function is non-blocking and ideally should be used to check for the
- availability of the query result before calling waitForResult().
-
- \sa waitForResult()
-*/
-bool QOpenGLTimerQuery::isResultAvailable() const
-{
- Q_D(const QOpenGLTimerQuery);
- return d->isResultAvailable();
-}
-
-/*!
- Returns the result of the OpenGL timer query.
-
- This function will block until the result is made available by OpenGL. It is
- recommended to call isResultAvailable() to ensure that the result is available
- to avoid unnecessary blocking and stalling.
-
- \sa isResultAvailable()
-*/
-GLuint64 QOpenGLTimerQuery::waitForResult() const
-{
- Q_D(const QOpenGLTimerQuery);
- return d->result();
-}
-
-
-class QOpenGLTimeMonitorPrivate : public QObjectPrivate
-{
-public:
- QOpenGLTimeMonitorPrivate()
- : QObjectPrivate(),
- timers(),
- timeSamples(),
- context(nullptr),
- core(nullptr),
- ext(nullptr),
- requestedSampleCount(2),
- currentSample(-1),
- timerQueryActive(false)
- {
- }
-
- ~QOpenGLTimeMonitorPrivate()
- {
- delete core;
- delete ext;
- }
-
- bool create();
- void destroy();
- void recordSample();
- bool isResultAvailable() const;
- QVector<GLuint64> samples() const;
- QVector<GLuint64> intervals() const;
- void reset();
-
- QVector<GLuint> timers;
- mutable QVector<GLuint64> timeSamples;
-
- QOpenGLContext *context;
- QOpenGLQueryHelper *core;
- QExtTimerQueryHelper *ext;
-
- int requestedSampleCount;
- int currentSample;
- mutable bool timerQueryActive;
-};
-
-bool QOpenGLTimeMonitorPrivate::create()
-{
- if (!timers.isEmpty() && timers.at(0) != 0 && timers.size() == requestedSampleCount)
- return true;
-
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (context && context != ctx) {
- qWarning("QTimeMonitor: Attempting to use different OpenGL context to recreate timers.\n"
- "Please call destroy() first or use the same context to previously create");
- return false;
- }
-
- context = ctx;
- if (!context) {
- qWarning("A current OpenGL context is required to create timer query objects");
- return false;
- }
-
- // Resize the vectors that hold the timers and the recorded samples
- timers.resize(requestedSampleCount);
- timeSamples.resize(requestedSampleCount);
-
- // Resolve the functions provided by OpenGL 1.5 and OpenGL 3.3 or ARB_timer_query
- core = new QOpenGLQueryHelper(context);
-
- // Check to see if we also need to resolve the functions for EXT_timer_query
- QSurfaceFormat f = context->format();
- if (f.version() <= qMakePair<int, int>(3, 2)
- && !context->hasExtension(QByteArrayLiteral("GL_ARB_timer_query"))
- && context->hasExtension(QByteArrayLiteral("GL_EXT_timer_query"))) {
- ext = new QExtTimerQueryHelper(context);
- } else if (f.version() <= qMakePair<int, int>(3, 2)
- && !context->hasExtension(QByteArrayLiteral("GL_ARB_timer_query"))
- && !context->hasExtension(QByteArrayLiteral("GL_EXT_timer_query"))) {
- qWarning("QOpenGLTimeMonitor requires one of:\n"
- " OpenGL 3.3 or newer,\n"
- " OpenGL 3.2 and the ARB_timer_query extension\n"
- " or the EXT_timer query extension");
- return false;
- }
-
- core->glGenQueries(requestedSampleCount, timers.data());
- return (timers.at(0) != 0);
-}
-
-void QOpenGLTimeMonitorPrivate::destroy()
-{
- if (timers.isEmpty() || timers.at(0) == 0)
- return;
-
- core->glDeleteQueries(timers.size(), timers.data());
- timers.clear();
- delete core;
- core = nullptr;
- delete ext;
- ext = nullptr;
- context = nullptr;
-}
-
-void QOpenGLTimeMonitorPrivate::recordSample()
-{
- // Use glQueryCounter() and GL_TIMESTAMP where available.
- // Otherwise, simulate it with glBeginQuery()/glEndQuery()
- if (!ext) {
-#if defined(GL_TIMESTAMP)
- core->glQueryCounter(timers.at(++currentSample), GL_TIMESTAMP);
-#endif
- } else {
- if (currentSample == -1) {
- core->glBeginQuery(GL_TIME_ELAPSED_EXT, timers.at(++currentSample));
- timerQueryActive = true;
- } else if (currentSample < timers.size() - 1) {
- core->glEndQuery(GL_TIME_ELAPSED_EXT);
- core->glBeginQuery(GL_TIME_ELAPSED_EXT, timers.at(++currentSample));
- } else {
- if (timerQueryActive) {
- core->glEndQuery(GL_TIME_ELAPSED_EXT);
- timerQueryActive = false;
- }
- }
- }
-}
-
-bool QOpenGLTimeMonitorPrivate::isResultAvailable() const
-{
- // The OpenGL spec says that if a query result is ready then the results of all queries
- // of the same type issued before it must also be ready. Therefore we only need to check
- // the availability of the result for the last issued query
- GLuint available = GL_FALSE;
- core->glGetQueryObjectuiv(timers.at(currentSample), GL_QUERY_RESULT_AVAILABLE, &available);
- return available;
-}
-
-QVector<GLuint64> QOpenGLTimeMonitorPrivate::samples() const
-{
- // For the Core and ARB options just ask for the timestamp for each timer query.
- // For the EXT implementation we cannot obtain timestamps so we defer any result
- // collection to the intervals() function
- if (!ext) {
- for (int i = 0; i <= currentSample; ++i)
- core->glGetQueryObjectui64v(timers.at(i), GL_QUERY_RESULT, &timeSamples[i]);
- } else {
- qWarning("QOpenGLTimeMonitor::samples() requires OpenGL >=3.3\n"
- "or OpenGL 3.2 and GL_ARB_timer_query");
- }
- return timeSamples;
-}
-
-QVector<GLuint64> QOpenGLTimeMonitorPrivate::intervals() const
-{
- QVector<GLuint64> intervals(timers.size() - 1);
- if (!ext) {
- // Obtain the timestamp samples and calculate the interval durations
- const QVector<GLuint64> timeStamps = samples();
- for (int i = 0; i < intervals.size(); ++i)
- intervals[i] = timeStamps[i+1] - timeStamps[i];
- } else {
- // Stop the last timer if needed
- if (timerQueryActive) {
- core->glEndQuery(GL_TIME_ELAPSED_EXT);
- timerQueryActive = false;
- }
-
- // Obtain the results from all timers apart from the redundant last one. In this
- // case the results actually are the intervals not timestamps
- for (int i = 0; i < currentSample; ++i)
- ext->glGetQueryObjectui64vEXT(timers.at(i), GL_QUERY_RESULT, &intervals[i]);
- }
-
- return intervals;
-}
-
-void QOpenGLTimeMonitorPrivate::reset()
-{
- currentSample = -1;
- timeSamples.fill(0);
-}
-
-
-/*!
- \class QOpenGLTimeMonitor
- \brief The QOpenGLTimeMonitor class wraps a sequence of OpenGL timer query objects.
- \inmodule QtGui
- \since 5.1
- \ingroup painting-3D
-
- The QOpenGLTimeMonitor class is a convenience wrapper around a collection of OpenGL
- timer query objects used to measure intervals of time on the GPU to the level of
- granularity required by your rendering application.
-
- The OpenGL timer queries objects are queried in sequence to record the GPU
- timestamps at positions of interest in your rendering code. Once the results for
- all issues timer queries become available, the results can be fetched and
- QOpenGLTimerMonitor will calculate the recorded time intervals for you.
-
- The typical use case of this class is to either profile your application's rendering
- algorithms or to adjust those algorithms in real-time for dynamic performance/quality
- balancing.
-
- Prior to using QOpenGLTimeMonitor in your rendering function you should set the
- required number of sample points that you wish to record by calling setSamples(). Note
- that measuring N sample points will produce N-1 time intervals. Once you have set the
- number of sample points, call the create() function with a valid current OpenGL context
- to create the necessary query timer objects. These steps are usually performed just
- once in an initialization function.
-
- Use the recordSample() function to delimit blocks of code containing OpenGL commands
- that you wish to time. You can check availability of the resulting time
- samples and time intervals with isResultAvailable(). The calculated time intervals and
- the raw timestamp samples can be retrieved with the blocking waitForIntervals() and
- waitForSamples() functions respectively.
-
- After retrieving the results and before starting a new round of taking samples
- (for example, in the next frame) be sure to call the reset() function which will clear
- the cached results and reset the timer index back to the first timer object.
-
- \sa QOpenGLTimerQuery
-*/
-
-/*!
- Creates a QOpenGLTimeMonitor instance with the given \a parent. You must call create()
- with a valid OpenGL context before using.
-
- \sa setSampleCount(), create()
-*/
-QOpenGLTimeMonitor::QOpenGLTimeMonitor(QObject *parent)
- : QObject(*new QOpenGLTimeMonitorPrivate, parent)
-{
-}
-
-/*!
- Destroys the QOpenGLTimeMonitor and any underlying OpenGL resources.
-*/
-QOpenGLTimeMonitor::~QOpenGLTimeMonitor()
-{
- QOpenGLContext* ctx = QOpenGLContext::currentContext();
-
- Q_D(QOpenGLTimeMonitor);
- QOpenGLContext *oldContext = nullptr;
- if (d->context != ctx) {
- oldContext = ctx;
- if (d->context->makeCurrent(oldContext->surface())) {
- ctx = d->context;
- } else {
- qWarning("QOpenGLTimeMonitor::~QOpenGLTimeMonitor() failed to make time monitor's context current");
- ctx = nullptr;
- }
- }
-
- if (ctx)
- destroy();
-
- if (oldContext) {
- if (!oldContext->makeCurrent(oldContext->surface()))
- qWarning("QOpenGLTimeMonitor::~QOpenGLTimeMonitor() failed to restore current context");
- }
-}
-
-/*!
- Sets the number of sample points to \a sampleCount. After setting the number
- of samples with this function, you must call create() to instantiate the underlying
- OpenGL timer query objects.
-
- The new \a sampleCount must be at least 2.
-
- \sa sampleCount(), create(), recordSample()
-*/
-void QOpenGLTimeMonitor::setSampleCount(int sampleCount)
-{
- // We need at least 2 samples to get an interval
- if (sampleCount < 2)
- return;
- Q_D(QOpenGLTimeMonitor);
- d->requestedSampleCount = sampleCount;
-}
-
-/*!
- Returns the number of sample points that have been requested with
- setSampleCount(). If create was successfully called following setSampleCount(),
- then the value returned will be the actual number of sample points
- that can be used.
-
- The default value for sample count is 2, leading to the measurement of a
- single interval.
-
- \sa setSampleCount()
-*/
-int QOpenGLTimeMonitor::sampleCount() const
-{
- Q_D(const QOpenGLTimeMonitor);
- return d->requestedSampleCount;
-}
-
-/*!
- Instantiate sampleCount() OpenGL timer query objects that will be used
- to track the amount of time taken to execute OpenGL commands between
- successive calls to recordSample().
-
- Returns \c true if the OpenGL timer query objects could be created.
-
- \sa destroy(), setSampleCount(), recordSample()
-*/
-bool QOpenGLTimeMonitor::create()
-{
- Q_D(QOpenGLTimeMonitor);
- return d->create();
-}
-
-/*!
- Destroys any OpenGL timer query objects used within this instance.
-
- \sa create()
-*/
-void QOpenGLTimeMonitor::destroy()
-{
- Q_D(QOpenGLTimeMonitor);
- d->destroy();
-}
-
-/*!
- Returns \c true if the underlying OpenGL query objects have been created. If this
- returns \c true and the associated OpenGL context is current, then you are able to record
- time samples with this object.
-*/
-bool QOpenGLTimeMonitor::isCreated() const
-{
- Q_D(const QOpenGLTimeMonitor);
- return (!d->timers.isEmpty() && d->timers.at(0) != 0);
-}
-
-/*!
- Returns a QVector containing the object Ids of the OpenGL timer query objects.
-*/
-QVector<GLuint> QOpenGLTimeMonitor::objectIds() const
-{
- Q_D(const QOpenGLTimeMonitor);
- return d->timers;
-}
-
-/*!
- Issues an OpenGL timer query at this point in the OpenGL command queue. Calling this
- function in a sequence in your application's rendering function, will build up
- details of the GPU time taken to execute the OpenGL commands between successive
- calls to this function.
-
- \sa setSampleCount(), isResultAvailable(), waitForSamples(), waitForIntervals()
-*/
-int QOpenGLTimeMonitor::recordSample()
-{
- Q_D(QOpenGLTimeMonitor);
- d->recordSample();
- return d->currentSample;
-}
-
-/*!
- Returns \c true if the OpenGL timer query results are available.
-
- \sa waitForSamples(), waitForIntervals()
-*/
-bool QOpenGLTimeMonitor::isResultAvailable() const
-{
- Q_D(const QOpenGLTimeMonitor);
- return d->isResultAvailable();
-}
-
-/*!
- Returns a QVector containing the GPU timestamps taken with recordSample().
-
- This function will block until OpenGL indicates the results are available. It
- is recommended to check the availability of the result prior to calling this
- function with isResultAvailable().
-
- \note This function only works on systems that have OpenGL >=3.3 or the
- ARB_timer_query extension. See QOpenGLTimerQuery for more details.
-
- \sa waitForIntervals(), isResultAvailable()
-*/
-QVector<GLuint64> QOpenGLTimeMonitor::waitForSamples() const
-{
- Q_D(const QOpenGLTimeMonitor);
- return d->samples();
-}
-
-/*!
- Returns a QVector containing the time intervals delimited by the calls to
- recordSample(). The resulting vector will contain one fewer element as
- this represents the intervening intervals rather than the actual timestamp
- samples.
-
- This function will block until OpenGL indicates the results are available. It
- is recommended to check the availability of the result prior to calling this
- function with isResultAvailable().
-
- \sa waitForSamples(), isResultAvailable()
-*/
-QVector<GLuint64> QOpenGLTimeMonitor::waitForIntervals() const
-{
- Q_D(const QOpenGLTimeMonitor);
- return d->intervals();
-}
-
-/*!
- Resets the time monitor ready for use in another frame of rendering. Call
- this once you have obtained the previous results and before calling
- recordSample() for the first time on the next frame.
-
- \sa recordSample()
-*/
-void QOpenGLTimeMonitor::reset()
-{
- Q_D(QOpenGLTimeMonitor);
- d->reset();
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopengltimerquery.h b/src/gui/opengl/qopengltimerquery.h
deleted file mode 100644
index 27da74a3fb..0000000000
--- a/src/gui/opengl/qopengltimerquery.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLTIMERQUERY_H
-#define QOPENGLTIMERQUERY_H
-
-#include <QtGui/qtguiglobal.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
-
-#include <QtCore/QObject>
-#include <QtGui/qopengl.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLTimerQueryPrivate;
-
-class Q_GUI_EXPORT QOpenGLTimerQuery : public QObject
-{
- Q_OBJECT
-
-public:
- explicit QOpenGLTimerQuery(QObject *parent = nullptr);
- ~QOpenGLTimerQuery();
-
- bool create();
- void destroy();
- bool isCreated() const;
- GLuint objectId() const;
-
- void begin();
- void end();
- GLuint64 waitForTimestamp() const;
- void recordTimestamp();
- bool isResultAvailable() const;
- GLuint64 waitForResult() const;
-
-private:
- Q_DECLARE_PRIVATE(QOpenGLTimerQuery)
- Q_DISABLE_COPY(QOpenGLTimerQuery)
-};
-
-
-class QOpenGLTimeMonitorPrivate;
-
-class Q_GUI_EXPORT QOpenGLTimeMonitor : public QObject
-{
- Q_OBJECT
-
-public:
- explicit QOpenGLTimeMonitor(QObject *parent = nullptr);
- ~QOpenGLTimeMonitor();
-
- void setSampleCount(int sampleCount);
- int sampleCount() const;
-
- bool create();
- void destroy();
- bool isCreated() const;
- QVector<GLuint> objectIds() const;
-
- int recordSample();
-
- bool isResultAvailable() const;
-
- QVector<GLuint64> waitForSamples() const;
- QVector<GLuint64> waitForIntervals() const;
-
- void reset();
-
-private:
- Q_DECLARE_PRIVATE(QOpenGLTimeMonitor)
- Q_DISABLE_COPY(QOpenGLTimeMonitor)
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-
-#endif // QOPENGLTIMERQUERY_H
diff --git a/src/gui/opengl/qopenglversionfunctions.cpp b/src/gui/opengl/qopenglversionfunctions.cpp
deleted file mode 100644
index 5a108335a9..0000000000
--- a/src/gui/opengl/qopenglversionfunctions.cpp
+++ /dev/null
@@ -1,353 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglversionfunctions.h"
-#include "qopenglcontext.h"
-#include "qdebug.h"
-
-QT_BEGIN_NAMESPACE
-
-#define QT_OPENGL_COUNT_FUNCTIONS(ret, name, args) +1
-#define QT_OPENGL_FUNCTION_NAMES(ret, name, args) \
- "gl"#name"\0"
-#define QT_OPENGL_IMPLEMENT(CLASS, FUNCTIONS) \
-void CLASS::init() \
-{ \
- const char *names = FUNCTIONS(QT_OPENGL_FUNCTION_NAMES); \
- const char *name = names; \
- for (int i = 0; i < FUNCTIONS(QT_OPENGL_COUNT_FUNCTIONS); ++i) { \
- functions[i] = context->getProcAddress(name); \
- name += strlen(name) + 1; \
- } \
-}
-
-QOpenGLVersionFunctionsStorage::QOpenGLVersionFunctionsStorage()
- : backends(nullptr)
-{
-}
-
-QOpenGLVersionFunctionsStorage::~QOpenGLVersionFunctionsStorage()
-{
-#ifndef QT_OPENGL_ES
- if (backends) {
-
- int i = 0;
-
-#define DELETE_BACKEND(X) \
- if (backends[i] && !--backends[i]->refs) \
- delete static_cast<QOpenGLFunctions_##X##Backend*>(backends[i]); \
- ++i;
-
- QT_OPENGL_VERSIONS(DELETE_BACKEND)
-#undef DELETE_BACKEND
- delete[] backends;
- }
-#endif
-}
-
-QOpenGLVersionFunctionsBackend *QOpenGLVersionFunctionsStorage::backend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v)
-{
-#ifdef QT_OPENGL_ES
- Q_UNUSED(context);
- Q_UNUSED(v);
- return 0;
-#else
- if (!backends) {
- backends = new QOpenGLVersionFunctionsBackend *[QOpenGLVersionFunctionsBackend::OpenGLVersionBackendCount];
- memset(backends, 0, sizeof(QOpenGLVersionFunctionsBackend *)*QOpenGLVersionFunctionsBackend::OpenGLVersionBackendCount);
- }
- if (backends[v])
- return backends[v];
-
- switch(v) {
-#define VERSION_ENUM(X) QOpenGLVersionFunctionsBackend::OpenGL_##X
-#define CREATE_BACKEND(X) \
- case VERSION_ENUM(X): \
- backends[VERSION_ENUM(X)] = new QOpenGLFunctions_##X##Backend(context); \
- break;
- QT_OPENGL_VERSIONS(CREATE_BACKEND)
- case QOpenGLVersionFunctionsBackend::OpenGLVersionBackendCount:
- Q_UNREACHABLE();
- }
- // the storage keeps one ref
- ++backends[v]->refs;
- return backends[v];
-#endif
-}
-
-QOpenGLVersionFunctionsBackend *QAbstractOpenGLFunctionsPrivate::functionsBackend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v)
-{
- Q_ASSERT(context);
- QOpenGLVersionFunctionsStorage *storage = context->functionsBackendStorage();
- return storage->backend(context, v);
-}
-
-void QAbstractOpenGLFunctionsPrivate::insertExternalFunctions(QOpenGLContext *context, QAbstractOpenGLFunctions *f)
-{
- Q_ASSERT(context);
- context->insertExternalFunctions(f);
-}
-
-void QAbstractOpenGLFunctionsPrivate::removeExternalFunctions(QOpenGLContext *context, QAbstractOpenGLFunctions *f)
-{
- Q_ASSERT(context);
- context->removeExternalFunctions(f);
-}
-
-/*!
- \class QAbstractOpenGLFunctions
- \inmodule QtGui
- \since 5.1
- \brief The QAbstractOpenGLFunctions class is the base class of a family of
- classes that expose all functions for each OpenGL version and
- profile.
-
- OpenGL implementations on different platforms are able to link to a variable
- number of OpenGL functions depending upon the OpenGL ABI on that platform.
- For example, on Microsoft Windows only functions up to those in OpenGL 1.1
- can be linked to at build time. All other functions must be resolved at
- runtime. The traditional solution to this has been to use either
- QOpenGLContext::getProcAddress() or QOpenGLFunctions. The former is tedious
- and error prone and means dealing directly with function pointers. The
- latter only exposes those functions common to OpenGL ES 2 and desktop
- OpenGL. There is however much new OpenGL functionality that is useful when
- writing real world OpenGL applications.
-
- Qt now provides a family of classes which all inherit from
- QAbstractOpenGLFunctions which expose every core OpenGL function by way of a
- corresponding member function. There is a class for every valid combination
- of OpenGL version and profile. Each class follows the naming convention:
- \badcode
- QOpenGLFunctions_<MAJOR VERSION>_<MINOR VERSION>[_PROFILE]
- \endcode
-
- For OpenGL versions 1.0 through to 3.0 there are no profiles, leading to the
- classes:
-
- \list
- \li QOpenGLFunctions_1_0
- \li QOpenGLFunctions_1_1
- \li QOpenGLFunctions_1_2
- \li QOpenGLFunctions_1_3
- \li QOpenGLFunctions_1_4
- \li QOpenGLFunctions_1_5
- \li QOpenGLFunctions_2_0
- \li QOpenGLFunctions_2_1
- \li QOpenGLFunctions_3_0
- \endlist
-
- where each class inherits from QAbstractOpenGLFunctions.
-
- OpenGL version 3.1 removed many deprecated functions leading to a much
- simpler and generic API.
-
- With OpenGL 3.2 the concept of profiles was introduced. Two profiles are
- currently defined for OpenGL: Core and Compatibility.
-
- The Core profile does not include any of the functions that were removed
- in OpenGL 3.1. The Compatibility profile contains all functions in the
- Core profile of the same version plus all of the functions that were
- removed in OpenGL 3.1. In this way the Compatibility profile classes allow
- use of newer OpenGL functionality but also allows you to keep using your
- legacy OpenGL code. For new OpenGL code the Core profile should be
- preferred.
-
- Please note that some vendors, notably Apple, do not implement the
- Compatibility profile. Therefore if you wish to target new OpenGL features
- on \macos then you should ensure that you request a Core profile context via
- QSurfaceFormat::setProfile().
-
- Qt provides classes for all version and Core and Compatibility profile
- combinations. The classes for OpenGL versions 3.1 through to 4.3 are:
-
- \list
- \li QOpenGLFunctions_3_1
- \li QOpenGLFunctions_3_2_Core
- \li QOpenGLFunctions_3_2_Compatibility
- \li QOpenGLFunctions_3_3_Core
- \li QOpenGLFunctions_3_3_Compatibility
- \li QOpenGLFunctions_4_0_Core
- \li QOpenGLFunctions_4_0_Compatibility
- \li QOpenGLFunctions_4_1_Core
- \li QOpenGLFunctions_4_1_Compatibility
- \li QOpenGLFunctions_4_2_Core
- \li QOpenGLFunctions_4_2_Compatibility
- \li QOpenGLFunctions_4_3_Core
- \li QOpenGLFunctions_4_3_Compatibility
- \endlist
-
- where each class inherits from QAbstractOpenGLFunctions.
-
- A pointer to an object of the class corresponding to the version and
- profile of OpenGL in use can be obtained from
- QOpenGLContext::versionFunctions(). If obtained in this way, note that
- the QOpenGLContext retains ownership of the object. This is so that only
- one instance need be created.
-
- Before calling any of the exposed OpenGL functions you must ensure that the
- object has resolved the function pointers to the OpenGL functions. This
- only needs to be done once per instance with initializeOpenGLFunctions().
- Once initialized, the object can be used to call any OpenGL function for
- the corresponding version and profile. Note that initializeOpenGLFunctions()
- can fail in some circumstances so check the return value. Situations in
- which initialization can fail are if you have a functions object for a version
- or profile that contains functions that are not part of the context being
- used to resolve the function pointers.
-
- If you exclusively use function objects then you will get compile time
- errors if you attempt to use a function not included in that version and
- profile. This is obviously a lot easier to debug than undefined behavior
- at run time.
-
- \sa QOpenGLContext::versionFunctions()
-*/
-/*!
- Constructs a QAbstractOpenGLFunctions object.
-*/
-QAbstractOpenGLFunctions::QAbstractOpenGLFunctions()
- : d_ptr(new QAbstractOpenGLFunctionsPrivate)
-{
-}
-
-/*!
- Destroys a QAbstractOpenGLFunctions object.
-*/
-QAbstractOpenGLFunctions::~QAbstractOpenGLFunctions()
-{
- Q_D(QAbstractOpenGLFunctions);
- if (d->owningContext)
- d->removeExternalFunctions(d->owningContext, this);
- delete d_ptr;
-}
-
-/*! \internal
- */
-bool QAbstractOpenGLFunctions::initializeOpenGLFunctions()
-{
- Q_D(QAbstractOpenGLFunctions);
- d->initialized = true;
-
- // For a subclass whose instance is not created via
- // QOpenGLContext::versionFunctions() owningContext is not set. Set it now
- // and register such instances to the context as external ones. These are
- // not owned by the context but still need certain cleanup when the context
- // is destroyed.
- if (!d->owningContext) {
- d->owningContext = QOpenGLContext::currentContext();
- if (d->owningContext)
- d->insertExternalFunctions(d->owningContext, this);
- }
-
- return true;
-}
-
-/*! \internal
- */
-bool QAbstractOpenGLFunctions::isInitialized() const
-{
- Q_D(const QAbstractOpenGLFunctions);
- return d->initialized;
-}
-
-/*! \internal
- */
-void QAbstractOpenGLFunctions::setOwningContext(const QOpenGLContext *context)
-{
- Q_D(QAbstractOpenGLFunctions);
- d->owningContext = const_cast<QOpenGLContext*>(context);
-}
-
-/*! \internal
- */
-QOpenGLContext *QAbstractOpenGLFunctions::owningContext() const
-{
- Q_D(const QAbstractOpenGLFunctions);
- return d->owningContext;
-}
-
-#if !defined(QT_OPENGL_ES_2)
-
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_0_CoreBackend, QT_OPENGL_1_0_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_1_CoreBackend, QT_OPENGL_1_1_FUNCTIONS)
-
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_2_CoreBackend, QT_OPENGL_1_2_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_3_CoreBackend, QT_OPENGL_1_3_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_4_CoreBackend, QT_OPENGL_1_4_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_5_CoreBackend, QT_OPENGL_1_5_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_2_0_CoreBackend, QT_OPENGL_2_0_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_2_1_CoreBackend, QT_OPENGL_2_1_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_0_CoreBackend, QT_OPENGL_3_0_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_1_CoreBackend, QT_OPENGL_3_1_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_2_CoreBackend, QT_OPENGL_3_2_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_3_CoreBackend, QT_OPENGL_3_3_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_0_CoreBackend, QT_OPENGL_4_0_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_1_CoreBackend, QT_OPENGL_4_1_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_2_CoreBackend, QT_OPENGL_4_2_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_3_CoreBackend, QT_OPENGL_4_3_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_4_CoreBackend, QT_OPENGL_4_4_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_5_CoreBackend, QT_OPENGL_4_5_FUNCTIONS)
-
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_0_DeprecatedBackend, QT_OPENGL_1_0_DEPRECATED_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_1_DeprecatedBackend, QT_OPENGL_1_1_DEPRECATED_FUNCTIONS)
-
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_2_DeprecatedBackend, QT_OPENGL_1_2_DEPRECATED_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_3_DeprecatedBackend, QT_OPENGL_1_3_DEPRECATED_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_4_DeprecatedBackend, QT_OPENGL_1_4_DEPRECATED_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_2_0_DeprecatedBackend, QT_OPENGL_2_0_DEPRECATED_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_0_DeprecatedBackend, QT_OPENGL_3_0_DEPRECATED_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_3_DeprecatedBackend, QT_OPENGL_3_3_DEPRECATED_FUNCTIONS)
-QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_5_DeprecatedBackend, QT_OPENGL_4_5_DEPRECATED_FUNCTIONS)
-
-#else
-
-// No backends for OpenGL ES 2
-
-#endif // !QT_OPENGL_ES_2
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglversionfunctions.h b/src/gui/opengl/qopenglversionfunctions.h
deleted file mode 100644
index 4835ea4871..0000000000
--- a/src/gui/opengl/qopenglversionfunctions.h
+++ /dev/null
@@ -1,1912 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONS_H
-#define QOPENGLVERSIONFUNCTIONS_H
-
-#include <QtGui/qtguiglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#if QT_DEPRECATED_SINCE(5, 6)
-#include <QtCore/qhash.h>
-#endif
-#include <QtCore/qhashfunctions.h>
-#include <QtCore/qpair.h>
-#include <QtGui/qopengl.h>
-
-// MemoryBarrier is a macro on some architectures on Windows
-#ifdef Q_OS_WIN
-#pragma push_macro("MemoryBarrier")
-#undef MemoryBarrier
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLContext;
-
-#if 0
-// silence syncqt warnings
-#pragma qt_class(QOpenGLVersionFunctions)
-#pragma qt_sync_stop_processing
-#endif
-
-#define QOPENGL_DEPRECATEDFUNCTION \
- qFatal("This function was erroneously included in previous versions of Qt and is here only for binary compatibility. " \
- "If you need to use this function, please use a legacy OpenGL version or a Compatibility profile.")
-
-struct QOpenGLVersionStatus
-{
- enum OpenGLStatus {
- CoreStatus,
- DeprecatedStatus,
- InvalidStatus
- };
-
- Q_DECL_CONSTEXPR QOpenGLVersionStatus()
- : version(0, 0),
- status(InvalidStatus)
- {}
-
- Q_DECL_CONSTEXPR QOpenGLVersionStatus(int majorVersion, int minorVersion, QOpenGLVersionStatus::OpenGLStatus functionStatus)
- : version(majorVersion, minorVersion),
- status(functionStatus)
- {}
-
- QPair<int, int> version;
- OpenGLStatus status;
-};
-
-inline uint qHash(const QOpenGLVersionStatus &v, uint seed = 0) noexcept
-{
- return qHash(static_cast<int>(v.status * 1000)
- + v.version.first * 100 + v.version.second * 10, seed);
-}
-
-Q_DECL_CONSTEXPR inline bool operator==(const QOpenGLVersionStatus &lhs, const QOpenGLVersionStatus &rhs)
-{
- return lhs.status == rhs.status && lhs.version == rhs.version;
-}
-
-Q_DECL_CONSTEXPR inline bool operator!=(const QOpenGLVersionStatus &lhs, const QOpenGLVersionStatus &rhs)
-{
- return !operator==(lhs, rhs);
-}
-
-#define QT_OPENGL_DECLARE_FUNCTIONS(ret, name, args) \
- ret (QOPENGLF_APIENTRYP name)args;
-#define QT_OPENGL_COUNT_FUNCTIONS(ret, name, args) +1
-
-#define QT_OPENGL_DECLARE(FUNCTIONS) \
-public: \
- struct Functions { \
- FUNCTIONS(QT_OPENGL_DECLARE_FUNCTIONS) \
- }; \
- union { \
- QFunctionPointer functions[FUNCTIONS(QT_OPENGL_COUNT_FUNCTIONS)]; \
- Functions f; \
- }; \
-private: \
- void init()
-
-class QOpenGLVersionFunctionsBackend
-{
-public:
-#define QT_OPENGL_VERSIONS(F) \
- F(1_0_Core) \
- F(1_1_Core) \
- F(1_2_Core) \
- F(1_3_Core) \
- F(1_4_Core) \
- F(1_5_Core) \
- F(2_0_Core) \
- F(2_1_Core) \
- F(3_0_Core) \
- F(3_1_Core) \
- F(3_2_Core) \
- F(3_3_Core) \
- F(4_0_Core) \
- F(4_1_Core) \
- F(4_2_Core) \
- F(4_3_Core) \
- F(4_4_Core) \
- F(4_5_Core) \
- F(1_0_Deprecated) \
- F(1_1_Deprecated) \
- F(1_2_Deprecated) \
- F(1_3_Deprecated) \
- F(1_4_Deprecated) \
- F(2_0_Deprecated) \
- F(3_0_Deprecated) \
- F(3_3_Deprecated) \
- F(4_5_Deprecated) \
-
-#define VERSION_ENUM(X) OpenGL_##X,
- enum Version {
- QT_OPENGL_VERSIONS(VERSION_ENUM)
- OpenGLVersionBackendCount
- };
-#undef VERSION_ENUM
-
- QOpenGLVersionFunctionsBackend(QOpenGLContext *ctx)
- : context(ctx)
- {}
-
- QOpenGLContext *context;
- QAtomicInt refs;
-};
-
-class QOpenGLVersionFunctionsStorage
-{
-public:
- QOpenGLVersionFunctionsStorage();
- ~QOpenGLVersionFunctionsStorage();
-
- QOpenGLVersionFunctionsBackend *backend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v);
-
- QOpenGLVersionFunctionsBackend **backends;
-};
-
-class QAbstractOpenGLFunctions;
-
-class QAbstractOpenGLFunctionsPrivate
-{
-public:
- QAbstractOpenGLFunctionsPrivate()
- : owningContext(nullptr),
- initialized(false)
- {}
-
- static QOpenGLVersionFunctionsBackend *functionsBackend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v);
- static void insertExternalFunctions(QOpenGLContext *context, QAbstractOpenGLFunctions *f);
- static void removeExternalFunctions(QOpenGLContext *context, QAbstractOpenGLFunctions *f);
-
- static QAbstractOpenGLFunctionsPrivate *get(QAbstractOpenGLFunctions *q);
-
- QOpenGLContext *owningContext;
- bool initialized;
-};
-
-class Q_GUI_EXPORT QAbstractOpenGLFunctions
-{
-public:
- virtual ~QAbstractOpenGLFunctions();
-
- virtual bool initializeOpenGLFunctions();
-
- Q_DISABLE_COPY(QAbstractOpenGLFunctions)
- Q_DECLARE_PRIVATE(QAbstractOpenGLFunctions)
-
-protected:
- QAbstractOpenGLFunctions();
- QAbstractOpenGLFunctionsPrivate *d_ptr;
-
- bool isInitialized() const;
-
- void setOwningContext(const QOpenGLContext *context);
- QOpenGLContext *owningContext() const;
-
- friend class QOpenGLContext;
-};
-
-inline QAbstractOpenGLFunctionsPrivate *QAbstractOpenGLFunctionsPrivate::get(QAbstractOpenGLFunctions *q)
-{
- return q->d_func();
-}
-
-#if !defined(QT_OPENGL_ES_2)
-
-class QOpenGLFunctions_1_0_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_1_0_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_1_0_Core; }
-
- // OpenGL 1.0 core functions
-#define QT_OPENGL_1_0_FUNCTIONS(F) \
- F(void, Viewport, (GLint x, GLint y, GLsizei width, GLsizei height)) \
- F(void, DepthRange, (GLdouble nearVal, GLdouble farVal)) \
- F(GLboolean, IsEnabled, (GLenum cap)) \
- F(void, GetTexLevelParameteriv, (GLenum target, GLint level, GLenum pname, GLint *params)) \
- F(void, GetTexLevelParameterfv, (GLenum target, GLint level, GLenum pname, GLfloat *params)) \
- F(void, GetTexParameteriv, (GLenum target, GLenum pname, GLint *params)) \
- F(void, GetTexParameterfv, (GLenum target, GLenum pname, GLfloat *params)) \
- F(void, GetTexImage, (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)) \
- F(const GLubyte *, GetString, (GLenum name)) \
- F(void, GetIntegerv, (GLenum pname, GLint *data)) \
- F(void, GetFloatv, (GLenum pname, GLfloat *data)) \
- F(GLenum, GetError, ()) \
- F(void, GetDoublev, (GLenum pname, GLdouble *data)) \
- F(void, GetBooleanv, (GLenum pname, GLboolean *data)) \
- F(void, ReadPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)) \
- F(void, ReadBuffer, (GLenum src)) \
- F(void, PixelStorei, (GLenum pname, GLint param)) \
- F(void, PixelStoref, (GLenum pname, GLfloat param)) \
- F(void, DepthFunc, (GLenum func)) \
- F(void, StencilOp, (GLenum fail, GLenum zfail, GLenum zpass)) \
- F(void, StencilFunc, (GLenum func, GLint ref, GLuint mask)) \
- F(void, LogicOp, (GLenum opcode)) \
- F(void, BlendFunc, (GLenum sfactor, GLenum dfactor)) \
- F(void, Flush, ()) \
- F(void, Finish, ()) \
- F(void, Enable, (GLenum cap)) \
- F(void, Disable, (GLenum cap)) \
- F(void, DepthMask, (GLboolean flag)) \
- F(void, ColorMask, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)) \
- F(void, StencilMask, (GLuint mask)) \
- F(void, ClearDepth, (GLdouble depth)) \
- F(void, ClearStencil, (GLint s)) \
- F(void, ClearColor, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) \
- F(void, Clear, (GLbitfield mask)) \
- F(void, DrawBuffer, (GLenum buf)) \
- F(void, TexImage2D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) \
- F(void, TexImage1D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) \
- F(void, TexParameteriv, (GLenum target, GLenum pname, const GLint *params)) \
- F(void, TexParameteri, (GLenum target, GLenum pname, GLint param)) \
- F(void, TexParameterfv, (GLenum target, GLenum pname, const GLfloat *params)) \
- F(void, TexParameterf, (GLenum target, GLenum pname, GLfloat param)) \
- F(void, Scissor, (GLint x, GLint y, GLsizei width, GLsizei height)) \
- F(void, PolygonMode, (GLenum face, GLenum mode)) \
- F(void, PointSize, (GLfloat size)) \
- F(void, LineWidth, (GLfloat width)) \
- F(void, Hint, (GLenum target, GLenum mode)) \
- F(void, FrontFace, (GLenum mode)) \
- F(void, CullFace, (GLenum mode)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_1_0_FUNCTIONS);
-};
-
-class QOpenGLFunctions_1_1_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_1_1_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_1_1_Core; }
-
- // OpenGL 1.1 core functions
-#define QT_OPENGL_1_1_FUNCTIONS(F) \
- F(void, Indexubv, (const GLubyte *c)) \
- F(void, Indexub, (GLubyte c)) \
- F(GLboolean, IsTexture, (GLuint texture)) \
- F(void, GenTextures, (GLsizei n, GLuint *textures)) \
- F(void, DeleteTextures, (GLsizei n, const GLuint *textures)) \
- F(void, BindTexture, (GLenum target, GLuint texture)) \
- F(void, TexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)) \
- F(void, TexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)) \
- F(void, CopyTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)) \
- F(void, CopyTexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)) \
- F(void, CopyTexImage2D, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)) \
- F(void, CopyTexImage1D, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)) \
- F(void, PolygonOffset, (GLfloat factor, GLfloat units)) \
- F(void, GetPointerv, (GLenum pname, GLvoid* *params)) \
- F(void, DrawElements, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)) \
- F(void, DrawArrays, (GLenum mode, GLint first, GLsizei count)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_1_1_FUNCTIONS);
-};
-
-class QOpenGLFunctions_1_2_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_1_2_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_1_2_Core; }
-
- // OpenGL 1.2 core functions
-#define QT_OPENGL_1_2_FUNCTIONS(F) \
- F(void, CopyTexSubImage3D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)) \
- F(void, TexSubImage3D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)) \
- F(void, TexImage3D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) \
- F(void, DrawRangeElements, (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)) \
- F(void, BlendEquation, (GLenum mode)) \
- F(void, BlendColor, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_1_2_FUNCTIONS);
-};
-
-class QOpenGLFunctions_1_3_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_1_3_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_1_3_Core; }
-
- // OpenGL 1.3 core functions
-#define QT_OPENGL_1_3_FUNCTIONS(F) \
- F(void, GetCompressedTexImage, (GLenum target, GLint level, GLvoid *img)) \
- F(void, CompressedTexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)) \
- F(void, CompressedTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)) \
- F(void, CompressedTexSubImage3D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)) \
- F(void, CompressedTexImage1D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)) \
- F(void, CompressedTexImage2D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)) \
- F(void, CompressedTexImage3D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)) \
- F(void, SampleCoverage, (GLfloat value, GLboolean invert)) \
- F(void, ActiveTexture, (GLenum texture)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_1_3_FUNCTIONS);
-};
-
-class QOpenGLFunctions_1_4_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_1_4_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_1_4_Core; }
-
- // OpenGL 1.4 core functions
-#define QT_OPENGL_1_4_FUNCTIONS(F) \
- F(void, PointParameteriv, (GLenum pname, const GLint *params)) \
- F(void, PointParameteri, (GLenum pname, GLint param)) \
- F(void, PointParameterfv, (GLenum pname, const GLfloat *params)) \
- F(void, PointParameterf, (GLenum pname, GLfloat param)) \
- F(void, MultiDrawElements, (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)) \
- F(void, MultiDrawArrays, (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)) \
- F(void, BlendFuncSeparate, (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_1_4_FUNCTIONS);
-};
-
-class QOpenGLFunctions_1_5_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_1_5_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_1_5_Core; }
-
- // OpenGL 1.5 core functions
-#define QT_OPENGL_1_5_FUNCTIONS(F) \
- F(void, GetBufferPointerv, (GLenum target, GLenum pname, GLvoid* *params)) \
- F(void, GetBufferParameteriv, (GLenum target, GLenum pname, GLint *params)) \
- F(GLboolean, UnmapBuffer, (GLenum target)) \
- F(GLvoid*, MapBuffer, (GLenum target, GLenum access)) \
- F(void, GetBufferSubData, (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)) \
- F(void, BufferSubData, (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)) \
- F(void, BufferData, (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)) \
- F(GLboolean, IsBuffer, (GLuint buffer)) \
- F(void, GenBuffers, (GLsizei n, GLuint *buffers)) \
- F(void, DeleteBuffers, (GLsizei n, const GLuint *buffers)) \
- F(void, BindBuffer, (GLenum target, GLuint buffer)) \
- F(void, GetQueryObjectuiv, (GLuint id, GLenum pname, GLuint *params)) \
- F(void, GetQueryObjectiv, (GLuint id, GLenum pname, GLint *params)) \
- F(void, GetQueryiv, (GLenum target, GLenum pname, GLint *params)) \
- F(void, EndQuery, (GLenum target)) \
- F(void, BeginQuery, (GLenum target, GLuint id)) \
- F(GLboolean, IsQuery, (GLuint id)) \
- F(void, DeleteQueries, (GLsizei n, const GLuint *ids)) \
- F(void, GenQueries, (GLsizei n, GLuint *ids)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_1_5_FUNCTIONS);
-};
-
-class QOpenGLFunctions_2_0_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_2_0_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_2_0_Core; }
-
- // OpenGL 2.0 core functions
-#define QT_OPENGL_2_0_FUNCTIONS(F) \
- F(void, VertexAttribPointer, (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)) \
- F(void, ValidateProgram, (GLuint program)) \
- F(void, UniformMatrix4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, UniformMatrix3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, UniformMatrix2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, Uniform4iv, (GLint location, GLsizei count, const GLint *value)) \
- F(void, Uniform3iv, (GLint location, GLsizei count, const GLint *value)) \
- F(void, Uniform2iv, (GLint location, GLsizei count, const GLint *value)) \
- F(void, Uniform1iv, (GLint location, GLsizei count, const GLint *value)) \
- F(void, Uniform4fv, (GLint location, GLsizei count, const GLfloat *value)) \
- F(void, Uniform3fv, (GLint location, GLsizei count, const GLfloat *value)) \
- F(void, Uniform2fv, (GLint location, GLsizei count, const GLfloat *value)) \
- F(void, Uniform1fv, (GLint location, GLsizei count, const GLfloat *value)) \
- F(void, Uniform4i, (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)) \
- F(void, Uniform3i, (GLint location, GLint v0, GLint v1, GLint v2)) \
- F(void, Uniform2i, (GLint location, GLint v0, GLint v1)) \
- F(void, Uniform1i, (GLint location, GLint v0)) \
- F(void, Uniform4f, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)) \
- F(void, Uniform3f, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)) \
- F(void, Uniform2f, (GLint location, GLfloat v0, GLfloat v1)) \
- F(void, Uniform1f, (GLint location, GLfloat v0)) \
- F(void, UseProgram, (GLuint program)) \
- F(void, ShaderSource, (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)) \
- F(void, LinkProgram, (GLuint program)) \
- F(GLboolean, IsShader, (GLuint shader)) \
- F(GLboolean, IsProgram, (GLuint program)) \
- F(void, GetVertexAttribPointerv, (GLuint index, GLenum pname, GLvoid* *pointer)) \
- F(void, GetVertexAttribiv, (GLuint index, GLenum pname, GLint *params)) \
- F(void, GetVertexAttribfv, (GLuint index, GLenum pname, GLfloat *params)) \
- F(void, GetVertexAttribdv, (GLuint index, GLenum pname, GLdouble *params)) \
- F(void, GetUniformiv, (GLuint program, GLint location, GLint *params)) \
- F(void, GetUniformfv, (GLuint program, GLint location, GLfloat *params)) \
- F(GLint, GetUniformLocation, (GLuint program, const GLchar *name)) \
- F(void, GetShaderSource, (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)) \
- F(void, GetShaderInfoLog, (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)) \
- F(void, GetShaderiv, (GLuint shader, GLenum pname, GLint *params)) \
- F(void, GetProgramInfoLog, (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)) \
- F(void, GetProgramiv, (GLuint program, GLenum pname, GLint *params)) \
- F(GLint, GetAttribLocation, (GLuint program, const GLchar *name)) \
- F(void, GetAttachedShaders, (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)) \
- F(void, GetActiveUniform, (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)) \
- F(void, GetActiveAttrib, (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)) \
- F(void, EnableVertexAttribArray, (GLuint index)) \
- F(void, DisableVertexAttribArray, (GLuint index)) \
- F(void, DetachShader, (GLuint program, GLuint shader)) \
- F(void, DeleteShader, (GLuint shader)) \
- F(void, DeleteProgram, (GLuint program)) \
- F(GLuint, CreateShader, (GLenum type)) \
- F(GLuint, CreateProgram, ()) \
- F(void, CompileShader, (GLuint shader)) \
- F(void, BindAttribLocation, (GLuint program, GLuint index, const GLchar *name)) \
- F(void, AttachShader, (GLuint program, GLuint shader)) \
- F(void, StencilMaskSeparate, (GLenum face, GLuint mask)) \
- F(void, StencilFuncSeparate, (GLenum face, GLenum func, GLint ref, GLuint mask)) \
- F(void, StencilOpSeparate, (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)) \
- F(void, DrawBuffers, (GLsizei n, const GLenum *bufs)) \
- F(void, BlendEquationSeparate, (GLenum modeRGB, GLenum modeAlpha)) \
- F(void, VertexAttrib4usv, (GLuint index, const GLushort *v)) \
- F(void, VertexAttrib4uiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttrib4ubv, (GLuint index, const GLubyte *v)) \
- F(void, VertexAttrib4sv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttrib4s, (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)) \
- F(void, VertexAttrib4iv, (GLuint index, const GLint *v)) \
- F(void, VertexAttrib4fv, (GLuint index, const GLfloat *v)) \
- F(void, VertexAttrib4f, (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)) \
- F(void, VertexAttrib4dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttrib4d, (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
- F(void, VertexAttrib4bv, (GLuint index, const GLbyte *v)) \
- F(void, VertexAttrib4Nusv, (GLuint index, const GLushort *v)) \
- F(void, VertexAttrib4Nuiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttrib4Nubv, (GLuint index, const GLubyte *v)) \
- F(void, VertexAttrib4Nub, (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)) \
- F(void, VertexAttrib4Nsv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttrib4Niv, (GLuint index, const GLint *v)) \
- F(void, VertexAttrib4Nbv, (GLuint index, const GLbyte *v)) \
- F(void, VertexAttrib3sv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttrib3s, (GLuint index, GLshort x, GLshort y, GLshort z)) \
- F(void, VertexAttrib3fv, (GLuint index, const GLfloat *v)) \
- F(void, VertexAttrib3f, (GLuint index, GLfloat x, GLfloat y, GLfloat z)) \
- F(void, VertexAttrib3dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttrib3d, (GLuint index, GLdouble x, GLdouble y, GLdouble z)) \
- F(void, VertexAttrib2sv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttrib2s, (GLuint index, GLshort x, GLshort y)) \
- F(void, VertexAttrib2fv, (GLuint index, const GLfloat *v)) \
- F(void, VertexAttrib2f, (GLuint index, GLfloat x, GLfloat y)) \
- F(void, VertexAttrib2dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttrib2d, (GLuint index, GLdouble x, GLdouble y)) \
- F(void, VertexAttrib1sv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttrib1s, (GLuint index, GLshort x)) \
- F(void, VertexAttrib1fv, (GLuint index, const GLfloat *v)) \
- F(void, VertexAttrib1f, (GLuint index, GLfloat x)) \
- F(void, VertexAttrib1dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttrib1d, (GLuint index, GLdouble x)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_2_0_FUNCTIONS);
-};
-
-class QOpenGLFunctions_2_1_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_2_1_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_2_1_Core; }
-
- // OpenGL 2.1 core functions
-#define QT_OPENGL_2_1_FUNCTIONS(F) \
- F(void, UniformMatrix4x3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, UniformMatrix3x4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, UniformMatrix4x2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, UniformMatrix2x4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, UniformMatrix3x2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, UniformMatrix2x3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_2_1_FUNCTIONS);
-};
-
-class QOpenGLFunctions_3_0_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_3_0_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_3_0_Core; }
-
- // OpenGL 3.0 core functions
-#define QT_OPENGL_3_0_FUNCTIONS(F) \
- F(GLboolean, IsVertexArray, (GLuint array)) \
- F(void, GenVertexArrays, (GLsizei n, GLuint *arrays)) \
- F(void, DeleteVertexArrays, (GLsizei n, const GLuint *arrays)) \
- F(void, BindVertexArray, (GLuint array)) \
- F(void, FlushMappedBufferRange, (GLenum target, GLintptr offset, GLsizeiptr length)) \
- F(GLvoid *, MapBufferRange, (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)) \
- F(void, FramebufferTextureLayer, (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)) \
- F(void, RenderbufferStorageMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)) \
- F(void, BlitFramebuffer, (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)) \
- F(void, GenerateMipmap, (GLenum target)) \
- F(void, GetFramebufferAttachmentParameteriv, (GLenum target, GLenum attachment, GLenum pname, GLint *params)) \
- F(void, FramebufferRenderbuffer, (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)) \
- F(void, FramebufferTexture3D, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)) \
- F(void, FramebufferTexture2D, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)) \
- F(void, FramebufferTexture1D, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)) \
- F(GLenum, CheckFramebufferStatus, (GLenum target)) \
- F(void, GenFramebuffers, (GLsizei n, GLuint *framebuffers)) \
- F(void, DeleteFramebuffers, (GLsizei n, const GLuint *framebuffers)) \
- F(void, BindFramebuffer, (GLenum target, GLuint framebuffer)) \
- F(GLboolean, IsFramebuffer, (GLuint framebuffer)) \
- F(void, GetRenderbufferParameteriv, (GLenum target, GLenum pname, GLint *params)) \
- F(void, RenderbufferStorage, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height)) \
- F(void, GenRenderbuffers, (GLsizei n, GLuint *renderbuffers)) \
- F(void, DeleteRenderbuffers, (GLsizei n, const GLuint *renderbuffers)) \
- F(void, BindRenderbuffer, (GLenum target, GLuint renderbuffer)) \
- F(GLboolean, IsRenderbuffer, (GLuint renderbuffer)) \
- F(const GLubyte *, GetStringi, (GLenum name, GLuint index)) \
- F(void, ClearBufferfi, (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)) \
- F(void, ClearBufferfv, (GLenum buffer, GLint drawbuffer, const GLfloat *value)) \
- F(void, ClearBufferuiv, (GLenum buffer, GLint drawbuffer, const GLuint *value)) \
- F(void, ClearBufferiv, (GLenum buffer, GLint drawbuffer, const GLint *value)) \
- F(void, GetTexParameterIuiv, (GLenum target, GLenum pname, GLuint *params)) \
- F(void, GetTexParameterIiv, (GLenum target, GLenum pname, GLint *params)) \
- F(void, TexParameterIuiv, (GLenum target, GLenum pname, const GLuint *params)) \
- F(void, TexParameterIiv, (GLenum target, GLenum pname, const GLint *params)) \
- F(void, Uniform4uiv, (GLint location, GLsizei count, const GLuint *value)) \
- F(void, Uniform3uiv, (GLint location, GLsizei count, const GLuint *value)) \
- F(void, Uniform2uiv, (GLint location, GLsizei count, const GLuint *value)) \
- F(void, Uniform1uiv, (GLint location, GLsizei count, const GLuint *value)) \
- F(void, Uniform4ui, (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)) \
- F(void, Uniform3ui, (GLint location, GLuint v0, GLuint v1, GLuint v2)) \
- F(void, Uniform2ui, (GLint location, GLuint v0, GLuint v1)) \
- F(void, Uniform1ui, (GLint location, GLuint v0)) \
- F(GLint, GetFragDataLocation, (GLuint program, const GLchar *name)) \
- F(void, BindFragDataLocation, (GLuint program, GLuint color, const GLchar *name)) \
- F(void, GetUniformuiv, (GLuint program, GLint location, GLuint *params)) \
- F(void, GetVertexAttribIuiv, (GLuint index, GLenum pname, GLuint *params)) \
- F(void, GetVertexAttribIiv, (GLuint index, GLenum pname, GLint *params)) \
- F(void, VertexAttribIPointer, (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
- F(void, EndConditionalRender, ()) \
- F(void, BeginConditionalRender, (GLuint id, GLenum mode)) \
- F(void, ClampColor, (GLenum target, GLenum clamp)) \
- F(void, GetTransformFeedbackVarying, (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)) \
- F(void, TransformFeedbackVaryings, (GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)) \
- F(void, BindBufferBase, (GLenum target, GLuint index, GLuint buffer)) \
- F(void, BindBufferRange, (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)) \
- F(void, EndTransformFeedback, ()) \
- F(void, BeginTransformFeedback, (GLenum primitiveMode)) \
- F(GLboolean, IsEnabledi, (GLenum target, GLuint index)) \
- F(void, Disablei, (GLenum target, GLuint index)) \
- F(void, Enablei, (GLenum target, GLuint index)) \
- F(void, GetIntegeri_v,(GLenum target, GLuint index, GLint *data)) \
- F(void, GetBooleani_v,(GLenum target, GLuint index, GLboolean *data)) \
- F(void, ColorMaski, (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)) \
- F(void, VertexAttribI4usv, (GLuint index, const GLushort *v)) \
- F(void, VertexAttribI4ubv, (GLuint index, const GLubyte *v)) \
- F(void, VertexAttribI4sv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttribI4bv, (GLuint index, const GLbyte *v)) \
- F(void, VertexAttribI4uiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttribI3uiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttribI2uiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttribI1uiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttribI4iv, (GLuint index, const GLint *v)) \
- F(void, VertexAttribI3iv, (GLuint index, const GLint *v)) \
- F(void, VertexAttribI2iv, (GLuint index, const GLint *v)) \
- F(void, VertexAttribI1iv, (GLuint index, const GLint *v)) \
- F(void, VertexAttribI4ui, (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)) \
- F(void, VertexAttribI3ui, (GLuint index, GLuint x, GLuint y, GLuint z)) \
- F(void, VertexAttribI2ui, (GLuint index, GLuint x, GLuint y)) \
- F(void, VertexAttribI1ui, (GLuint index, GLuint x)) \
- F(void, VertexAttribI4i, (GLuint index, GLint x, GLint y, GLint z, GLint w)) \
- F(void, VertexAttribI3i, (GLuint index, GLint x, GLint y, GLint z)) \
- F(void, VertexAttribI2i, (GLuint index, GLint x, GLint y)) \
- F(void, VertexAttribI1i, (GLuint index, GLint x)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_3_0_FUNCTIONS);
-};
-
-class QOpenGLFunctions_3_1_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_3_1_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_3_1_Core; }
-
- // OpenGL 3.1 core functions
-#define QT_OPENGL_3_1_FUNCTIONS(F) \
- F(void, CopyBufferSubData, (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)) \
- F(void, UniformBlockBinding, (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)) \
- F(void, GetActiveUniformBlockName, (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)) \
- F(void, GetActiveUniformBlockiv, (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)) \
- F(GLuint, GetUniformBlockIndex, (GLuint program, const GLchar *uniformBlockName)) \
- F(void, GetActiveUniformName, (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)) \
- F(void, GetActiveUniformsiv, (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)) \
- F(void, GetUniformIndices, (GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)) \
- F(void, PrimitiveRestartIndex, (GLuint index)) \
- F(void, TexBuffer, (GLenum target, GLenum internalformat, GLuint buffer)) \
- F(void, DrawElementsInstanced, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)) \
- F(void, DrawArraysInstanced, (GLenum mode, GLint first, GLsizei count, GLsizei instancecount)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_3_1_FUNCTIONS);
-};
-
-class QOpenGLFunctions_3_2_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_3_2_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_3_2_Core; }
-
- // OpenGL 3.2 core functions
-#define QT_OPENGL_3_2_FUNCTIONS(F) \
- F(void, SampleMaski, (GLuint maskNumber, GLbitfield mask)) \
- F(void, GetMultisamplefv, (GLenum pname, GLuint index, GLfloat *val)) \
- F(void, TexImage3DMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)) \
- F(void, TexImage2DMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)) \
- F(void, GetSynciv, (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)) \
- F(void, GetInteger64v, (GLenum pname, GLint64 *data)) \
- F(void, WaitSync, (GLsync sync, GLbitfield flags, GLuint64 timeout)) \
- F(GLenum, ClientWaitSync, (GLsync sync, GLbitfield flags, GLuint64 timeout)) \
- F(void, DeleteSync, (GLsync sync)) \
- F(GLboolean, IsSync, (GLsync sync)) \
- F(GLsync, FenceSync, (GLenum condition, GLbitfield flags)) \
- F(void, ProvokingVertex, (GLenum mode)) \
- F(void, MultiDrawElementsBaseVertex, (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)) \
- F(void, DrawElementsInstancedBaseVertex, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)) \
- F(void, DrawRangeElementsBaseVertex, (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)) \
- F(void, DrawElementsBaseVertex, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)) \
- F(void, FramebufferTexture, (GLenum target, GLenum attachment, GLuint texture, GLint level)) \
- F(void, GetBufferParameteri64v, (GLenum target, GLenum pname, GLint64 *params)) \
- F(void, GetInteger64i_v,(GLenum target, GLuint index, GLint64 *data))
-
- QT_OPENGL_DECLARE(QT_OPENGL_3_2_FUNCTIONS);
-};
-
-class QOpenGLFunctions_3_3_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_3_3_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_3_3_Core; }
-
- // OpenGL 3.3 core functions
-#define QT_OPENGL_3_3_FUNCTIONS(F) \
- F(void, VertexAttribP4uiv, (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)) \
- F(void, VertexAttribP4ui, (GLuint index, GLenum type, GLboolean normalized, GLuint value)) \
- F(void, VertexAttribP3uiv, (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)) \
- F(void, VertexAttribP3ui, (GLuint index, GLenum type, GLboolean normalized, GLuint value)) \
- F(void, VertexAttribP2uiv, (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)) \
- F(void, VertexAttribP2ui, (GLuint index, GLenum type, GLboolean normalized, GLuint value)) \
- F(void, VertexAttribP1uiv, (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)) \
- F(void, VertexAttribP1ui, (GLuint index, GLenum type, GLboolean normalized, GLuint value)) \
- F(void, SecondaryColorP3uiv, (GLenum type, const GLuint *color)) \
- F(void, SecondaryColorP3ui, (GLenum type, GLuint color)) \
- F(void, ColorP4uiv, (GLenum type, const GLuint *color)) \
- F(void, ColorP4ui, (GLenum type, GLuint color)) \
- F(void, ColorP3uiv, (GLenum type, const GLuint *color)) \
- F(void, ColorP3ui, (GLenum type, GLuint color)) \
- F(void, NormalP3uiv, (GLenum type, const GLuint *coords)) \
- F(void, NormalP3ui, (GLenum type, GLuint coords)) \
- F(void, MultiTexCoordP4uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
- F(void, MultiTexCoordP4ui, (GLenum texture, GLenum type, GLuint coords)) \
- F(void, MultiTexCoordP3uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
- F(void, MultiTexCoordP3ui, (GLenum texture, GLenum type, GLuint coords)) \
- F(void, MultiTexCoordP2uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
- F(void, MultiTexCoordP2ui, (GLenum texture, GLenum type, GLuint coords)) \
- F(void, MultiTexCoordP1uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
- F(void, MultiTexCoordP1ui, (GLenum texture, GLenum type, GLuint coords)) \
- F(void, TexCoordP4uiv, (GLenum type, const GLuint *coords)) \
- F(void, TexCoordP4ui, (GLenum type, GLuint coords)) \
- F(void, TexCoordP3uiv, (GLenum type, const GLuint *coords)) \
- F(void, TexCoordP3ui, (GLenum type, GLuint coords)) \
- F(void, TexCoordP2uiv, (GLenum type, const GLuint *coords)) \
- F(void, TexCoordP2ui, (GLenum type, GLuint coords)) \
- F(void, TexCoordP1uiv, (GLenum type, const GLuint *coords)) \
- F(void, TexCoordP1ui, (GLenum type, GLuint coords)) \
- F(void, VertexP4uiv, (GLenum type, const GLuint *value)) \
- F(void, VertexP4ui, (GLenum type, GLuint value)) \
- F(void, VertexP3uiv, (GLenum type, const GLuint *value)) \
- F(void, VertexP3ui, (GLenum type, GLuint value)) \
- F(void, VertexP2uiv, (GLenum type, const GLuint *value)) \
- F(void, VertexP2ui, (GLenum type, GLuint value)) \
- F(void, GetQueryObjectui64v, (GLuint id, GLenum pname, GLuint64 *params)) \
- F(void, GetQueryObjecti64v, (GLuint id, GLenum pname, GLint64 *params)) \
- F(void, QueryCounter, (GLuint id, GLenum target)) \
- F(void, GetSamplerParameterIuiv, (GLuint sampler, GLenum pname, GLuint *params)) \
- F(void, GetSamplerParameterfv, (GLuint sampler, GLenum pname, GLfloat *params)) \
- F(void, GetSamplerParameterIiv, (GLuint sampler, GLenum pname, GLint *params)) \
- F(void, GetSamplerParameteriv, (GLuint sampler, GLenum pname, GLint *params)) \
- F(void, SamplerParameterIuiv, (GLuint sampler, GLenum pname, const GLuint *param)) \
- F(void, SamplerParameterIiv, (GLuint sampler, GLenum pname, const GLint *param)) \
- F(void, SamplerParameterfv, (GLuint sampler, GLenum pname, const GLfloat *param)) \
- F(void, SamplerParameterf, (GLuint sampler, GLenum pname, GLfloat param)) \
- F(void, SamplerParameteriv, (GLuint sampler, GLenum pname, const GLint *param)) \
- F(void, SamplerParameteri, (GLuint sampler, GLenum pname, GLint param)) \
- F(void, BindSampler, (GLuint unit, GLuint sampler)) \
- F(GLboolean, IsSampler, (GLuint sampler)) \
- F(void, DeleteSamplers, (GLsizei count, const GLuint *samplers)) \
- F(void, GenSamplers, (GLsizei count, GLuint *samplers)) \
- F(GLint, GetFragDataIndex, (GLuint program, const GLchar *name)) \
- F(void, BindFragDataLocationIndexed, (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)) \
- F(void, VertexAttribDivisor, (GLuint index, GLuint divisor)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_3_3_FUNCTIONS);
-};
-
-class QOpenGLFunctions_4_0_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_4_0_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_4_0_Core; }
-
- // OpenGL 4.0 core functions
-#define QT_OPENGL_4_0_FUNCTIONS(F) \
- F(void, GetQueryIndexediv, (GLenum target, GLuint index, GLenum pname, GLint *params)) \
- F(void, EndQueryIndexed, (GLenum target, GLuint index)) \
- F(void, BeginQueryIndexed, (GLenum target, GLuint index, GLuint id)) \
- F(void, DrawTransformFeedbackStream, (GLenum mode, GLuint id, GLuint stream)) \
- F(void, DrawTransformFeedback, (GLenum mode, GLuint id)) \
- F(void, ResumeTransformFeedback, ()) \
- F(void, PauseTransformFeedback, ()) \
- F(GLboolean, IsTransformFeedback, (GLuint id)) \
- F(void, GenTransformFeedbacks, (GLsizei n, GLuint *ids)) \
- F(void, DeleteTransformFeedbacks, (GLsizei n, const GLuint *ids)) \
- F(void, BindTransformFeedback, (GLenum target, GLuint id)) \
- F(void, PatchParameterfv, (GLenum pname, const GLfloat *values)) \
- F(void, PatchParameteri, (GLenum pname, GLint value)) \
- F(void, GetProgramStageiv, (GLuint program, GLenum shadertype, GLenum pname, GLint *values)) \
- F(void, GetUniformSubroutineuiv, (GLenum shadertype, GLint location, GLuint *params)) \
- F(void, UniformSubroutinesuiv, (GLenum shadertype, GLsizei count, const GLuint *indices)) \
- F(void, GetActiveSubroutineName, (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)) \
- F(void, GetActiveSubroutineUniformName, (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)) \
- F(void, GetActiveSubroutineUniformiv, (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)) \
- F(GLuint, GetSubroutineIndex, (GLuint program, GLenum shadertype, const GLchar *name)) \
- F(GLint, GetSubroutineUniformLocation, (GLuint program, GLenum shadertype, const GLchar *name)) \
- F(void, GetUniformdv, (GLuint program, GLint location, GLdouble *params)) \
- F(void, UniformMatrix4x3dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, UniformMatrix4x2dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, UniformMatrix3x4dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, UniformMatrix3x2dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, UniformMatrix2x4dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, UniformMatrix2x3dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, UniformMatrix4dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, UniformMatrix3dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, UniformMatrix2dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, Uniform4dv, (GLint location, GLsizei count, const GLdouble *value)) \
- F(void, Uniform3dv, (GLint location, GLsizei count, const GLdouble *value)) \
- F(void, Uniform2dv, (GLint location, GLsizei count, const GLdouble *value)) \
- F(void, Uniform1dv, (GLint location, GLsizei count, const GLdouble *value)) \
- F(void, Uniform4d, (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
- F(void, Uniform3d, (GLint location, GLdouble x, GLdouble y, GLdouble z)) \
- F(void, Uniform2d, (GLint location, GLdouble x, GLdouble y)) \
- F(void, Uniform1d, (GLint location, GLdouble x)) \
- F(void, DrawElementsIndirect, (GLenum mode, GLenum type, const GLvoid *indirect)) \
- F(void, DrawArraysIndirect, (GLenum mode, const GLvoid *indirect)) \
- F(void, BlendFuncSeparatei, (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)) \
- F(void, BlendFunci, (GLuint buf, GLenum src, GLenum dst)) \
- F(void, BlendEquationSeparatei, (GLuint buf, GLenum modeRGB, GLenum modeAlpha)) \
- F(void, BlendEquationi, (GLuint buf, GLenum mode)) \
- F(void, MinSampleShading, (GLfloat value)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_4_0_FUNCTIONS);
-};
-
-class QOpenGLFunctions_4_1_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_4_1_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_4_1_Core; }
-
- // OpenGL 4.1 core functions
-#define QT_OPENGL_4_1_FUNCTIONS(F) \
- F(void, GetDoublei_v, (GLenum target, GLuint index, GLdouble *data)) \
- F(void, GetFloati_v,(GLenum target, GLuint index, GLfloat *data)) \
- F(void, DepthRangeIndexed, (GLuint index, GLdouble n, GLdouble f)) \
- F(void, DepthRangeArrayv, (GLuint first, GLsizei count, const GLdouble *v)) \
- F(void, ScissorIndexedv, (GLuint index, const GLint *v)) \
- F(void, ScissorIndexed, (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)) \
- F(void, ScissorArrayv, (GLuint first, GLsizei count, const GLint *v)) \
- F(void, ViewportIndexedfv, (GLuint index, const GLfloat *v)) \
- F(void, ViewportIndexedf, (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)) \
- F(void, ViewportArrayv, (GLuint first, GLsizei count, const GLfloat *v)) \
- F(void, GetVertexAttribLdv, (GLuint index, GLenum pname, GLdouble *params)) \
- F(void, VertexAttribLPointer, (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
- F(void, VertexAttribL4dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttribL3dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttribL2dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttribL1dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttribL4d, (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
- F(void, VertexAttribL3d, (GLuint index, GLdouble x, GLdouble y, GLdouble z)) \
- F(void, VertexAttribL2d, (GLuint index, GLdouble x, GLdouble y)) \
- F(void, VertexAttribL1d, (GLuint index, GLdouble x)) \
- F(void, GetProgramPipelineInfoLog, (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)) \
- F(void, ValidateProgramPipeline, (GLuint pipeline)) \
- F(void, ProgramUniformMatrix4x3dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, ProgramUniformMatrix3x4dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, ProgramUniformMatrix4x2dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, ProgramUniformMatrix2x4dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, ProgramUniformMatrix3x2dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, ProgramUniformMatrix2x3dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, ProgramUniformMatrix4x3fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, ProgramUniformMatrix3x4fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, ProgramUniformMatrix4x2fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, ProgramUniformMatrix2x4fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, ProgramUniformMatrix3x2fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, ProgramUniformMatrix2x3fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, ProgramUniformMatrix4dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, ProgramUniformMatrix3dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, ProgramUniformMatrix2dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
- F(void, ProgramUniformMatrix4fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, ProgramUniformMatrix3fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, ProgramUniformMatrix2fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
- F(void, ProgramUniform4uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value)) \
- F(void, ProgramUniform4ui, (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)) \
- F(void, ProgramUniform4dv, (GLuint program, GLint location, GLsizei count, const GLdouble *value)) \
- F(void, ProgramUniform4d, (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)) \
- F(void, ProgramUniform4fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value)) \
- F(void, ProgramUniform4f, (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)) \
- F(void, ProgramUniform4iv, (GLuint program, GLint location, GLsizei count, const GLint *value)) \
- F(void, ProgramUniform4i, (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)) \
- F(void, ProgramUniform3uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value)) \
- F(void, ProgramUniform3ui, (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)) \
- F(void, ProgramUniform3dv, (GLuint program, GLint location, GLsizei count, const GLdouble *value)) \
- F(void, ProgramUniform3d, (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)) \
- F(void, ProgramUniform3fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value)) \
- F(void, ProgramUniform3f, (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)) \
- F(void, ProgramUniform3iv, (GLuint program, GLint location, GLsizei count, const GLint *value)) \
- F(void, ProgramUniform3i, (GLuint program, GLint location, GLint v0, GLint v1, GLint v2)) \
- F(void, ProgramUniform2uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value)) \
- F(void, ProgramUniform2ui, (GLuint program, GLint location, GLuint v0, GLuint v1)) \
- F(void, ProgramUniform2dv, (GLuint program, GLint location, GLsizei count, const GLdouble *value)) \
- F(void, ProgramUniform2d, (GLuint program, GLint location, GLdouble v0, GLdouble v1)) \
- F(void, ProgramUniform2fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value)) \
- F(void, ProgramUniform2f, (GLuint program, GLint location, GLfloat v0, GLfloat v1)) \
- F(void, ProgramUniform2iv, (GLuint program, GLint location, GLsizei count, const GLint *value)) \
- F(void, ProgramUniform2i, (GLuint program, GLint location, GLint v0, GLint v1)) \
- F(void, ProgramUniform1uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value)) \
- F(void, ProgramUniform1ui, (GLuint program, GLint location, GLuint v0)) \
- F(void, ProgramUniform1dv, (GLuint program, GLint location, GLsizei count, const GLdouble *value)) \
- F(void, ProgramUniform1d, (GLuint program, GLint location, GLdouble v0)) \
- F(void, ProgramUniform1fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value)) \
- F(void, ProgramUniform1f, (GLuint program, GLint location, GLfloat v0)) \
- F(void, ProgramUniform1iv, (GLuint program, GLint location, GLsizei count, const GLint *value)) \
- F(void, ProgramUniform1i, (GLuint program, GLint location, GLint v0)) \
- F(void, GetProgramPipelineiv, (GLuint pipeline, GLenum pname, GLint *params)) \
- F(GLboolean, IsProgramPipeline, (GLuint pipeline)) \
- F(void, GenProgramPipelines, (GLsizei n, GLuint *pipelines)) \
- F(void, DeleteProgramPipelines, (GLsizei n, const GLuint *pipelines)) \
- F(void, BindProgramPipeline, (GLuint pipeline)) \
- F(GLuint, CreateShaderProgramv, (GLenum type, GLsizei count, const GLchar* const *strings)) \
- F(void, ActiveShaderProgram, (GLuint pipeline, GLuint program)) \
- F(void, UseProgramStages, (GLuint pipeline, GLbitfield stages, GLuint program)) \
- F(void, ProgramParameteri, (GLuint program, GLenum pname, GLint value)) \
- F(void, ProgramBinary, (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)) \
- F(void, GetProgramBinary, (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)) \
- F(void, ClearDepthf, (GLfloat dd)) \
- F(void, DepthRangef, (GLfloat n, GLfloat f)) \
- F(void, GetShaderPrecisionFormat, (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)) \
- F(void, ShaderBinary, (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)) \
- F(void, ReleaseShaderCompiler, ()) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_4_1_FUNCTIONS);
-};
-
-class QOpenGLFunctions_4_2_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_4_2_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_4_2_Core; }
-
- // OpenGL 4.2 core functions
-#define QT_OPENGL_4_2_FUNCTIONS(F) \
- F(void, TexStorage3D, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)) \
- F(void, TexStorage2D, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)) \
- F(void, TexStorage1D, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)) \
- F(void, MemoryBarrier, (GLbitfield barriers)) \
- F(void, BindImageTexture, (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)) \
- F(void, GetActiveAtomicCounterBufferiv, (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)) \
- F(void, GetInternalformativ, (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)) \
- F(void, DrawTransformFeedbackStreamInstanced, (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)) \
- F(void, DrawTransformFeedbackInstanced, (GLenum mode, GLuint id, GLsizei instancecount)) \
- F(void, DrawElementsInstancedBaseVertexBaseInstance, (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)) \
- F(void, DrawElementsInstancedBaseInstance, (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)) \
- F(void, DrawArraysInstancedBaseInstance, (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_4_2_FUNCTIONS);
-};
-
-class QOpenGLFunctions_4_3_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_4_3_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_4_3_Core; }
-
- // OpenGL 4.3 core functions
-#define QT_OPENGL_4_3_FUNCTIONS(F) \
- F(void, TexStorage3DMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)) \
- F(void, TexStorage2DMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)) \
- F(void, TexBufferRange, (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)) \
- F(void, ShaderStorageBlockBinding, (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)) \
- F(GLint, GetProgramResourceLocationIndex, (GLuint program, GLenum programInterface, const GLchar *name)) \
- F(GLint, GetProgramResourceLocation, (GLuint program, GLenum programInterface, const GLchar *name)) \
- F(void, GetProgramResourceiv, (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)) \
- F(void, GetProgramResourceName, (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)) \
- F(GLuint, GetProgramResourceIndex, (GLuint program, GLenum programInterface, const GLchar *name)) \
- F(void, GetProgramInterfaceiv, (GLuint program, GLenum programInterface, GLenum pname, GLint *params)) \
- F(void, MultiDrawElementsIndirect, (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)) \
- F(void, MultiDrawArraysIndirect, (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)) \
- F(void, InvalidateSubFramebuffer, (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)) \
- F(void, InvalidateFramebuffer, (GLenum target, GLsizei numAttachments, const GLenum *attachments)) \
- F(void, InvalidateBufferData, (GLuint buffer)) \
- F(void, InvalidateBufferSubData, (GLuint buffer, GLintptr offset, GLsizeiptr length)) \
- F(void, InvalidateTexImage, (GLuint texture, GLint level)) \
- F(void, InvalidateTexSubImage, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)) \
- F(void, GetInternalformati64v, (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)) \
- F(void, GetFramebufferParameteriv, (GLenum target, GLenum pname, GLint *params)) \
- F(void, FramebufferParameteri, (GLenum target, GLenum pname, GLint param)) \
- F(void, VertexBindingDivisor, (GLuint bindingindex, GLuint divisor)) \
- F(void, VertexAttribBinding, (GLuint attribindex, GLuint bindingindex)) \
- F(void, VertexAttribLFormat, (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)) \
- F(void, VertexAttribIFormat, (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)) \
- F(void, VertexAttribFormat, (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)) \
- F(void, BindVertexBuffer, (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)) \
- F(void, TextureView, (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)) \
- F(void, CopyImageSubData, (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)) \
- F(void, DispatchComputeIndirect, (GLintptr indirect)) \
- F(void, DispatchCompute, (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)) \
- F(void, ClearBufferSubData, (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)) \
- F(void, ClearBufferData, (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)) \
- F(void, GetObjectPtrLabel, (const GLvoid *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)) \
- F(void, ObjectPtrLabel, (const GLvoid *ptr, GLsizei length, const GLchar *label)) \
- F(void, GetObjectLabel, (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)) \
- F(void, ObjectLabel, (GLenum identifier, GLuint name, GLsizei length, const GLchar *label)) \
- F(void, PopDebugGroup, ()) \
- F(void, PushDebugGroup, (GLenum source, GLuint id, GLsizei length, const GLchar *message)) \
- F(GLuint, GetDebugMessageLog, (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)) \
- F(void, DebugMessageCallback, (GLDEBUGPROC callback, const GLvoid *userParam)) \
- F(void, DebugMessageInsert, (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)) \
- F(void, DebugMessageControl, (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_4_3_FUNCTIONS);
-};
-
-class QOpenGLFunctions_4_4_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_4_4_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_4_4_Core; }
-
- // OpenGL 4.4 core functions
-#define QT_OPENGL_4_4_FUNCTIONS(F) \
- F(void, BindVertexBuffers, (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)) \
- F(void, BindImageTextures, (GLuint first, GLsizei count, const GLuint *textures)) \
- F(void, BindSamplers, (GLuint first, GLsizei count, const GLuint *samplers)) \
- F(void, BindTextures, (GLuint first, GLsizei count, const GLuint *textures)) \
- F(void, BindBuffersRange, (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes)) \
- F(void, BindBuffersBase, (GLenum target, GLuint first, GLsizei count, const GLuint *buffers)) \
- F(void, ClearTexSubImage, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)) \
- F(void, ClearTexImage, (GLuint texture, GLint level, GLenum format, GLenum type, const void *data)) \
- F(void, BufferStorage, (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_4_4_FUNCTIONS);
-};
-
-class QOpenGLFunctions_4_5_CoreBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_4_5_CoreBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_4_5_Core; }
-
- // OpenGL 4.5 core functions
-#define QT_OPENGL_4_5_FUNCTIONS(F) \
- F(void, TextureBarrier, ()) \
- F(void, ReadnPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data)) \
- F(void, GetnUniformuiv, (GLuint program, GLint location, GLsizei bufSize, GLuint *params)) \
- F(void, GetnUniformiv, (GLuint program, GLint location, GLsizei bufSize, GLint *params)) \
- F(void, GetnUniformfv, (GLuint program, GLint location, GLsizei bufSize, GLfloat *params)) \
- F(void, GetnUniformdv, (GLuint program, GLint location, GLsizei bufSize, GLdouble *params)) \
- F(void, GetnTexImage, (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)) \
- F(void, GetnCompressedTexImage, (GLenum target, GLint lod, GLsizei bufSize, void *pixels)) \
- F(GLenum, GetGraphicsResetStatus, ()) \
- F(void, GetCompressedTextureSubImage, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels)) \
- F(void, GetTextureSubImage, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels)) \
- F(void, MemoryBarrierByRegion, (GLbitfield barriers)) \
- F(void, CreateQueries, (GLenum target, GLsizei n, GLuint *ids)) \
- F(void, CreateProgramPipelines, (GLsizei n, GLuint *pipelines)) \
- F(void, CreateSamplers, (GLsizei n, GLuint *samplers)) \
- F(void, GetVertexArrayIndexed64iv, (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param)) \
- F(void, GetVertexArrayIndexediv, (GLuint vaobj, GLuint index, GLenum pname, GLint *param)) \
- F(void, GetVertexArrayiv, (GLuint vaobj, GLenum pname, GLint *param)) \
- F(void, VertexArrayBindingDivisor, (GLuint vaobj, GLuint bindingindex, GLuint divisor)) \
- F(void, VertexArrayAttribLFormat, (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)) \
- F(void, VertexArrayAttribIFormat, (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)) \
- F(void, VertexArrayAttribFormat, (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)) \
- F(void, VertexArrayAttribBinding, (GLuint vaobj, GLuint attribindex, GLuint bindingindex)) \
- F(void, VertexArrayVertexBuffers, (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)) \
- F(void, VertexArrayVertexBuffer, (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)) \
- F(void, VertexArrayElementBuffer, (GLuint vaobj, GLuint buffer)) \
- F(void, EnableVertexArrayAttrib, (GLuint vaobj, GLuint index)) \
- F(void, DisableVertexArrayAttrib, (GLuint vaobj, GLuint index)) \
- F(void, CreateVertexArrays, (GLsizei n, GLuint *arrays)) \
- F(void, GetTextureParameteriv, (GLuint texture, GLenum pname, GLint *params)) \
- F(void, GetTextureParameterIuiv, (GLuint texture, GLenum pname, GLuint *params)) \
- F(void, GetTextureParameterIiv, (GLuint texture, GLenum pname, GLint *params)) \
- F(void, GetTextureParameterfv, (GLuint texture, GLenum pname, GLfloat *params)) \
- F(void, GetTextureLevelParameteriv, (GLuint texture, GLint level, GLenum pname, GLint *params)) \
- F(void, GetTextureLevelParameterfv, (GLuint texture, GLint level, GLenum pname, GLfloat *params)) \
- F(void, GetCompressedTextureImage, (GLuint texture, GLint level, GLsizei bufSize, void *pixels)) \
- F(void, GetTextureImage, (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)) \
- F(void, BindTextureUnit, (GLuint unit, GLuint texture)) \
- F(void, GenerateTextureMipmap, (GLuint texture)) \
- F(void, TextureParameteriv, (GLuint texture, GLenum pname, const GLint *param)) \
- F(void, TextureParameterIuiv, (GLuint texture, GLenum pname, const GLuint *params)) \
- F(void, TextureParameterIiv, (GLuint texture, GLenum pname, const GLint *params)) \
- F(void, TextureParameteri, (GLuint texture, GLenum pname, GLint param)) \
- F(void, TextureParameterfv, (GLuint texture, GLenum pname, const GLfloat *param)) \
- F(void, TextureParameterf, (GLuint texture, GLenum pname, GLfloat param)) \
- F(void, CopyTextureSubImage3D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)) \
- F(void, CopyTextureSubImage2D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)) \
- F(void, CopyTextureSubImage1D, (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)) \
- F(void, CompressedTextureSubImage3D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)) \
- F(void, CompressedTextureSubImage2D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)) \
- F(void, CompressedTextureSubImage1D, (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)) \
- F(void, TextureSubImage3D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)) \
- F(void, TextureSubImage2D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)) \
- F(void, TextureSubImage1D, (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)) \
- F(void, TextureStorage3DMultisample, (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)) \
- F(void, TextureStorage2DMultisample, (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)) \
- F(void, TextureStorage3D, (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)) \
- F(void, TextureStorage2D, (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)) \
- F(void, TextureStorage1D, (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width)) \
- F(void, TextureBufferRange, (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size)) \
- F(void, TextureBuffer, (GLuint texture, GLenum internalformat, GLuint buffer)) \
- F(void, CreateTextures, (GLenum target, GLsizei n, GLuint *textures)) \
- F(void, GetNamedRenderbufferParameteriv, (GLuint renderbuffer, GLenum pname, GLint *params)) \
- F(void, NamedRenderbufferStorageMultisample, (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)) \
- F(void, NamedRenderbufferStorage, (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height)) \
- F(void, CreateRenderbuffers, (GLsizei n, GLuint *renderbuffers)) \
- F(void, GetNamedFramebufferAttachmentParameteriv, (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params)) \
- F(void, GetNamedFramebufferParameteriv, (GLuint framebuffer, GLenum pname, GLint *param)) \
- F(GLenum, CheckNamedFramebufferStatus, (GLuint framebuffer, GLenum target)) \
- F(void, BlitNamedFramebuffer, (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)) \
- F(void, ClearNamedFramebufferfi, (GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil)) \
- F(void, ClearNamedFramebufferfv, (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value)) \
- F(void, ClearNamedFramebufferuiv, (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value)) \
- F(void, ClearNamedFramebufferiv, (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value)) \
- F(void, InvalidateNamedFramebufferSubData, (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)) \
- F(void, InvalidateNamedFramebufferData, (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments)) \
- F(void, NamedFramebufferReadBuffer, (GLuint framebuffer, GLenum src)) \
- F(void, NamedFramebufferDrawBuffers, (GLuint framebuffer, GLsizei n, const GLenum *bufs)) \
- F(void, NamedFramebufferDrawBuffer, (GLuint framebuffer, GLenum buf)) \
- F(void, NamedFramebufferTextureLayer, (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)) \
- F(void, NamedFramebufferTexture, (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)) \
- F(void, NamedFramebufferParameteri, (GLuint framebuffer, GLenum pname, GLint param)) \
- F(void, NamedFramebufferRenderbuffer, (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)) \
- F(void, CreateFramebuffers, (GLsizei n, GLuint *framebuffers)) \
- F(void, GetNamedBufferSubData, (GLuint buffer, GLintptr offset, GLsizei size, void *data)) \
- F(void, GetNamedBufferPointerv, (GLuint buffer, GLenum pname, GLvoid* *params)) \
- F(void, GetNamedBufferParameteri64v, (GLuint buffer, GLenum pname, GLint64 *params)) \
- F(void, GetNamedBufferParameteriv, (GLuint buffer, GLenum pname, GLint *params)) \
- F(void, FlushMappedNamedBufferRange, (GLuint buffer, GLintptr offset, GLsizei length)) \
- F(GLboolean, UnmapNamedBuffer, (GLuint buffer)) \
- F(GLvoid *, MapNamedBufferRange, (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access)) \
- F(GLvoid *, MapNamedBuffer, (GLuint buffer, GLenum access)) \
- F(void, ClearNamedBufferSubData, (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data)) \
- F(void, ClearNamedBufferData, (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data)) \
- F(void, CopyNamedBufferSubData, (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size)) \
- F(void, NamedBufferSubData, (GLuint buffer, GLintptr offset, GLsizei size, const void *data)) \
- F(void, NamedBufferData, (GLuint buffer, GLsizei size, const void *data, GLenum usage)) \
- F(void, NamedBufferStorage, (GLuint buffer, GLsizei size, const void *data, GLbitfield flags)) \
- F(void, CreateBuffers, (GLsizei n, GLuint *buffers)) \
- F(void, GetTransformFeedbacki64_v,(GLuint xfb, GLenum pname, GLuint index, GLint64 *param)) \
- F(void, GetTransformFeedbacki_v,(GLuint xfb, GLenum pname, GLuint index, GLint *param)) \
- F(void, GetTransformFeedbackiv, (GLuint xfb, GLenum pname, GLint *param)) \
- F(void, TransformFeedbackBufferRange, (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size)) \
- F(void, TransformFeedbackBufferBase, (GLuint xfb, GLuint index, GLuint buffer)) \
- F(void, CreateTransformFeedbacks, (GLsizei n, GLuint *ids)) \
- F(void, ClipControl, (GLenum origin, GLenum depth)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_4_5_FUNCTIONS);
-};
-
-class QOpenGLFunctions_1_0_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_1_0_DeprecatedBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_1_0_Deprecated; }
-
- // OpenGL 1.0 deprecated functions
-#define QT_OPENGL_1_0_DEPRECATED_FUNCTIONS(F) \
- F(void, Translatef, (GLfloat x, GLfloat y, GLfloat z)) \
- F(void, Translated, (GLdouble x, GLdouble y, GLdouble z)) \
- F(void, Scalef, (GLfloat x, GLfloat y, GLfloat z)) \
- F(void, Scaled, (GLdouble x, GLdouble y, GLdouble z)) \
- F(void, Rotatef, (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)) \
- F(void, Rotated, (GLdouble angle, GLdouble x, GLdouble y, GLdouble z)) \
- F(void, PushMatrix, ()) \
- F(void, PopMatrix, ()) \
- F(void, Ortho, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)) \
- F(void, MultMatrixd, (const GLdouble *m)) \
- F(void, MultMatrixf, (const GLfloat *m)) \
- F(void, MatrixMode, (GLenum mode)) \
- F(void, LoadMatrixd, (const GLdouble *m)) \
- F(void, LoadMatrixf, (const GLfloat *m)) \
- F(void, LoadIdentity, ()) \
- F(void, Frustum, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)) \
- F(GLboolean, IsList, (GLuint list)) \
- F(void, GetTexGeniv, (GLenum coord, GLenum pname, GLint *params)) \
- F(void, GetTexGenfv, (GLenum coord, GLenum pname, GLfloat *params)) \
- F(void, GetTexGendv, (GLenum coord, GLenum pname, GLdouble *params)) \
- F(void, GetTexEnviv, (GLenum target, GLenum pname, GLint *params)) \
- F(void, GetTexEnvfv, (GLenum target, GLenum pname, GLfloat *params)) \
- F(void, GetPolygonStipple, (GLubyte *mask)) \
- F(void, GetPixelMapusv, (GLenum map, GLushort *values)) \
- F(void, GetPixelMapuiv, (GLenum map, GLuint *values)) \
- F(void, GetPixelMapfv, (GLenum map, GLfloat *values)) \
- F(void, GetMaterialiv, (GLenum face, GLenum pname, GLint *params)) \
- F(void, GetMaterialfv, (GLenum face, GLenum pname, GLfloat *params)) \
- F(void, GetMapiv, (GLenum target, GLenum query, GLint *v)) \
- F(void, GetMapfv, (GLenum target, GLenum query, GLfloat *v)) \
- F(void, GetMapdv, (GLenum target, GLenum query, GLdouble *v)) \
- F(void, GetLightiv, (GLenum light, GLenum pname, GLint *params)) \
- F(void, GetLightfv, (GLenum light, GLenum pname, GLfloat *params)) \
- F(void, GetClipPlane, (GLenum plane, GLdouble *equation)) \
- F(void, DrawPixels, (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)) \
- F(void, CopyPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)) \
- F(void, PixelMapusv, (GLenum map, GLsizei mapsize, const GLushort *values)) \
- F(void, PixelMapuiv, (GLenum map, GLsizei mapsize, const GLuint *values)) \
- F(void, PixelMapfv, (GLenum map, GLsizei mapsize, const GLfloat *values)) \
- F(void, PixelTransferi, (GLenum pname, GLint param)) \
- F(void, PixelTransferf, (GLenum pname, GLfloat param)) \
- F(void, PixelZoom, (GLfloat xfactor, GLfloat yfactor)) \
- F(void, AlphaFunc, (GLenum func, GLfloat ref)) \
- F(void, EvalPoint2, (GLint i, GLint j)) \
- F(void, EvalMesh2, (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)) \
- F(void, EvalPoint1, (GLint i)) \
- F(void, EvalMesh1, (GLenum mode, GLint i1, GLint i2)) \
- F(void, EvalCoord2fv, (const GLfloat *u)) \
- F(void, EvalCoord2f, (GLfloat u, GLfloat v)) \
- F(void, EvalCoord2dv, (const GLdouble *u)) \
- F(void, EvalCoord2d, (GLdouble u, GLdouble v)) \
- F(void, EvalCoord1fv, (const GLfloat *u)) \
- F(void, EvalCoord1f, (GLfloat u)) \
- F(void, EvalCoord1dv, (const GLdouble *u)) \
- F(void, EvalCoord1d, (GLdouble u)) \
- F(void, MapGrid2f, (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)) \
- F(void, MapGrid2d, (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)) \
- F(void, MapGrid1f, (GLint un, GLfloat u1, GLfloat u2)) \
- F(void, MapGrid1d, (GLint un, GLdouble u1, GLdouble u2)) \
- F(void, Map2f, (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)) \
- F(void, Map2d, (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)) \
- F(void, Map1f, (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)) \
- F(void, Map1d, (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)) \
- F(void, PushAttrib, (GLbitfield mask)) \
- F(void, PopAttrib, ()) \
- F(void, Accum, (GLenum op, GLfloat value)) \
- F(void, IndexMask, (GLuint mask)) \
- F(void, ClearIndex, (GLfloat c)) \
- F(void, ClearAccum, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) \
- F(void, PushName, (GLuint name)) \
- F(void, PopName, ()) \
- F(void, PassThrough, (GLfloat token)) \
- F(void, LoadName, (GLuint name)) \
- F(void, InitNames, ()) \
- F(GLint, RenderMode, (GLenum mode)) \
- F(void, SelectBuffer, (GLsizei size, GLuint *buffer)) \
- F(void, FeedbackBuffer, (GLsizei size, GLenum type, GLfloat *buffer)) \
- F(void, TexGeniv, (GLenum coord, GLenum pname, const GLint *params)) \
- F(void, TexGeni, (GLenum coord, GLenum pname, GLint param)) \
- F(void, TexGenfv, (GLenum coord, GLenum pname, const GLfloat *params)) \
- F(void, TexGenf, (GLenum coord, GLenum pname, GLfloat param)) \
- F(void, TexGendv, (GLenum coord, GLenum pname, const GLdouble *params)) \
- F(void, TexGend, (GLenum coord, GLenum pname, GLdouble param)) \
- F(void, TexEnviv, (GLenum target, GLenum pname, const GLint *params)) \
- F(void, TexEnvi, (GLenum target, GLenum pname, GLint param)) \
- F(void, TexEnvfv, (GLenum target, GLenum pname, const GLfloat *params)) \
- F(void, TexEnvf, (GLenum target, GLenum pname, GLfloat param)) \
- F(void, ShadeModel, (GLenum mode)) \
- F(void, PolygonStipple, (const GLubyte *mask)) \
- F(void, Materialiv, (GLenum face, GLenum pname, const GLint *params)) \
- F(void, Materiali, (GLenum face, GLenum pname, GLint param)) \
- F(void, Materialfv, (GLenum face, GLenum pname, const GLfloat *params)) \
- F(void, Materialf, (GLenum face, GLenum pname, GLfloat param)) \
- F(void, LineStipple, (GLint factor, GLushort pattern)) \
- F(void, LightModeliv, (GLenum pname, const GLint *params)) \
- F(void, LightModeli, (GLenum pname, GLint param)) \
- F(void, LightModelfv, (GLenum pname, const GLfloat *params)) \
- F(void, LightModelf, (GLenum pname, GLfloat param)) \
- F(void, Lightiv, (GLenum light, GLenum pname, const GLint *params)) \
- F(void, Lighti, (GLenum light, GLenum pname, GLint param)) \
- F(void, Lightfv, (GLenum light, GLenum pname, const GLfloat *params)) \
- F(void, Lightf, (GLenum light, GLenum pname, GLfloat param)) \
- F(void, Fogiv, (GLenum pname, const GLint *params)) \
- F(void, Fogi, (GLenum pname, GLint param)) \
- F(void, Fogfv, (GLenum pname, const GLfloat *params)) \
- F(void, Fogf, (GLenum pname, GLfloat param)) \
- F(void, ColorMaterial, (GLenum face, GLenum mode)) \
- F(void, ClipPlane, (GLenum plane, const GLdouble *equation)) \
- F(void, Vertex4sv, (const GLshort *v)) \
- F(void, Vertex4s, (GLshort x, GLshort y, GLshort z, GLshort w)) \
- F(void, Vertex4iv, (const GLint *v)) \
- F(void, Vertex4i, (GLint x, GLint y, GLint z, GLint w)) \
- F(void, Vertex4fv, (const GLfloat *v)) \
- F(void, Vertex4f, (GLfloat x, GLfloat y, GLfloat z, GLfloat w)) \
- F(void, Vertex4dv, (const GLdouble *v)) \
- F(void, Vertex4d, (GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
- F(void, Vertex3sv, (const GLshort *v)) \
- F(void, Vertex3s, (GLshort x, GLshort y, GLshort z)) \
- F(void, Vertex3iv, (const GLint *v)) \
- F(void, Vertex3i, (GLint x, GLint y, GLint z)) \
- F(void, Vertex3fv, (const GLfloat *v)) \
- F(void, Vertex3f, (GLfloat x, GLfloat y, GLfloat z)) \
- F(void, Vertex3dv, (const GLdouble *v)) \
- F(void, Vertex3d, (GLdouble x, GLdouble y, GLdouble z)) \
- F(void, Vertex2sv, (const GLshort *v)) \
- F(void, Vertex2s, (GLshort x, GLshort y)) \
- F(void, Vertex2iv, (const GLint *v)) \
- F(void, Vertex2i, (GLint x, GLint y)) \
- F(void, Vertex2fv, (const GLfloat *v)) \
- F(void, Vertex2f, (GLfloat x, GLfloat y)) \
- F(void, Vertex2dv, (const GLdouble *v)) \
- F(void, Vertex2d, (GLdouble x, GLdouble y)) \
- F(void, TexCoord4sv, (const GLshort *v)) \
- F(void, TexCoord4s, (GLshort s, GLshort t, GLshort r, GLshort q)) \
- F(void, TexCoord4iv, (const GLint *v)) \
- F(void, TexCoord4i, (GLint s, GLint t, GLint r, GLint q)) \
- F(void, TexCoord4fv, (const GLfloat *v)) \
- F(void, TexCoord4f, (GLfloat s, GLfloat t, GLfloat r, GLfloat q)) \
- F(void, TexCoord4dv, (const GLdouble *v)) \
- F(void, TexCoord4d, (GLdouble s, GLdouble t, GLdouble r, GLdouble q)) \
- F(void, TexCoord3sv, (const GLshort *v)) \
- F(void, TexCoord3s, (GLshort s, GLshort t, GLshort r)) \
- F(void, TexCoord3iv, (const GLint *v)) \
- F(void, TexCoord3i, (GLint s, GLint t, GLint r)) \
- F(void, TexCoord3fv, (const GLfloat *v)) \
- F(void, TexCoord3f, (GLfloat s, GLfloat t, GLfloat r)) \
- F(void, TexCoord3dv, (const GLdouble *v)) \
- F(void, TexCoord3d, (GLdouble s, GLdouble t, GLdouble r)) \
- F(void, TexCoord2sv, (const GLshort *v)) \
- F(void, TexCoord2s, (GLshort s, GLshort t)) \
- F(void, TexCoord2iv, (const GLint *v)) \
- F(void, TexCoord2i, (GLint s, GLint t)) \
- F(void, TexCoord2fv, (const GLfloat *v)) \
- F(void, TexCoord2f, (GLfloat s, GLfloat t)) \
- F(void, TexCoord2dv, (const GLdouble *v)) \
- F(void, TexCoord2d, (GLdouble s, GLdouble t)) \
- F(void, TexCoord1sv, (const GLshort *v)) \
- F(void, TexCoord1s, (GLshort s)) \
- F(void, TexCoord1iv, (const GLint *v)) \
- F(void, TexCoord1i, (GLint s)) \
- F(void, TexCoord1fv, (const GLfloat *v)) \
- F(void, TexCoord1f, (GLfloat s)) \
- F(void, TexCoord1dv, (const GLdouble *v)) \
- F(void, TexCoord1d, (GLdouble s)) \
- F(void, Rectsv, (const GLshort *v1, const GLshort *v2)) \
- F(void, Rects, (GLshort x1, GLshort y1, GLshort x2, GLshort y2)) \
- F(void, Rectiv, (const GLint *v1, const GLint *v2)) \
- F(void, Recti, (GLint x1, GLint y1, GLint x2, GLint y2)) \
- F(void, Rectfv, (const GLfloat *v1, const GLfloat *v2)) \
- F(void, Rectf, (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)) \
- F(void, Rectdv, (const GLdouble *v1, const GLdouble *v2)) \
- F(void, Rectd, (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)) \
- F(void, RasterPos4sv, (const GLshort *v)) \
- F(void, RasterPos4s, (GLshort x, GLshort y, GLshort z, GLshort w)) \
- F(void, RasterPos4iv, (const GLint *v)) \
- F(void, RasterPos4i, (GLint x, GLint y, GLint z, GLint w)) \
- F(void, RasterPos4fv, (const GLfloat *v)) \
- F(void, RasterPos4f, (GLfloat x, GLfloat y, GLfloat z, GLfloat w)) \
- F(void, RasterPos4dv, (const GLdouble *v)) \
- F(void, RasterPos4d, (GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
- F(void, RasterPos3sv, (const GLshort *v)) \
- F(void, RasterPos3s, (GLshort x, GLshort y, GLshort z)) \
- F(void, RasterPos3iv, (const GLint *v)) \
- F(void, RasterPos3i, (GLint x, GLint y, GLint z)) \
- F(void, RasterPos3fv, (const GLfloat *v)) \
- F(void, RasterPos3f, (GLfloat x, GLfloat y, GLfloat z)) \
- F(void, RasterPos3dv, (const GLdouble *v)) \
- F(void, RasterPos3d, (GLdouble x, GLdouble y, GLdouble z)) \
- F(void, RasterPos2sv, (const GLshort *v)) \
- F(void, RasterPos2s, (GLshort x, GLshort y)) \
- F(void, RasterPos2iv, (const GLint *v)) \
- F(void, RasterPos2i, (GLint x, GLint y)) \
- F(void, RasterPos2fv, (const GLfloat *v)) \
- F(void, RasterPos2f, (GLfloat x, GLfloat y)) \
- F(void, RasterPos2dv, (const GLdouble *v)) \
- F(void, RasterPos2d, (GLdouble x, GLdouble y)) \
- F(void, Normal3sv, (const GLshort *v)) \
- F(void, Normal3s, (GLshort nx, GLshort ny, GLshort nz)) \
- F(void, Normal3iv, (const GLint *v)) \
- F(void, Normal3i, (GLint nx, GLint ny, GLint nz)) \
- F(void, Normal3fv, (const GLfloat *v)) \
- F(void, Normal3f, (GLfloat nx, GLfloat ny, GLfloat nz)) \
- F(void, Normal3dv, (const GLdouble *v)) \
- F(void, Normal3d, (GLdouble nx, GLdouble ny, GLdouble nz)) \
- F(void, Normal3bv, (const GLbyte *v)) \
- F(void, Normal3b, (GLbyte nx, GLbyte ny, GLbyte nz)) \
- F(void, Indexsv, (const GLshort *c)) \
- F(void, Indexs, (GLshort c)) \
- F(void, Indexiv, (const GLint *c)) \
- F(void, Indexi, (GLint c)) \
- F(void, Indexfv, (const GLfloat *c)) \
- F(void, Indexf, (GLfloat c)) \
- F(void, Indexdv, (const GLdouble *c)) \
- F(void, Indexd, (GLdouble c)) \
- F(void, End, ()) \
- F(void, EdgeFlagv, (const GLboolean *flag)) \
- F(void, EdgeFlag, (GLboolean flag)) \
- F(void, Color4usv, (const GLushort *v)) \
- F(void, Color4us, (GLushort red, GLushort green, GLushort blue, GLushort alpha)) \
- F(void, Color4uiv, (const GLuint *v)) \
- F(void, Color4ui, (GLuint red, GLuint green, GLuint blue, GLuint alpha)) \
- F(void, Color4ubv, (const GLubyte *v)) \
- F(void, Color4ub, (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)) \
- F(void, Color4sv, (const GLshort *v)) \
- F(void, Color4s, (GLshort red, GLshort green, GLshort blue, GLshort alpha)) \
- F(void, Color4iv, (const GLint *v)) \
- F(void, Color4i, (GLint red, GLint green, GLint blue, GLint alpha)) \
- F(void, Color4fv, (const GLfloat *v)) \
- F(void, Color4f, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) \
- F(void, Color4dv, (const GLdouble *v)) \
- F(void, Color4d, (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)) \
- F(void, Color4bv, (const GLbyte *v)) \
- F(void, Color4b, (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)) \
- F(void, Color3usv, (const GLushort *v)) \
- F(void, Color3us, (GLushort red, GLushort green, GLushort blue)) \
- F(void, Color3uiv, (const GLuint *v)) \
- F(void, Color3ui, (GLuint red, GLuint green, GLuint blue)) \
- F(void, Color3ubv, (const GLubyte *v)) \
- F(void, Color3ub, (GLubyte red, GLubyte green, GLubyte blue)) \
- F(void, Color3sv, (const GLshort *v)) \
- F(void, Color3s, (GLshort red, GLshort green, GLshort blue)) \
- F(void, Color3iv, (const GLint *v)) \
- F(void, Color3i, (GLint red, GLint green, GLint blue)) \
- F(void, Color3fv, (const GLfloat *v)) \
- F(void, Color3f, (GLfloat red, GLfloat green, GLfloat blue)) \
- F(void, Color3dv, (const GLdouble *v)) \
- F(void, Color3d, (GLdouble red, GLdouble green, GLdouble blue)) \
- F(void, Color3bv, (const GLbyte *v)) \
- F(void, Color3b, (GLbyte red, GLbyte green, GLbyte blue)) \
- F(void, Bitmap, (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)) \
- F(void, Begin, (GLenum mode)) \
- F(void, ListBase, (GLuint base)) \
- F(GLuint, GenLists, (GLsizei range)) \
- F(void, DeleteLists, (GLuint list, GLsizei range)) \
- F(void, CallLists, (GLsizei n, GLenum type, const GLvoid *lists)) \
- F(void, CallList, (GLuint list)) \
- F(void, EndList, ()) \
- F(void, NewList, (GLuint list, GLenum mode)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_1_0_DEPRECATED_FUNCTIONS);
-};
-
-class QOpenGLFunctions_1_1_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_1_1_DeprecatedBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_1_1_Deprecated; }
-
- // OpenGL 1.1 deprecated functions
-#define QT_OPENGL_1_1_DEPRECATED_FUNCTIONS(F) \
- F(void, PushClientAttrib, (GLbitfield mask)) \
- F(void, PopClientAttrib, ()) \
- F(void, PrioritizeTextures, (GLsizei n, const GLuint *textures, const GLfloat *priorities)) \
- F(GLboolean, AreTexturesResident, (GLsizei n, const GLuint *textures, GLboolean *residences)) \
- F(void, VertexPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
- F(void, TexCoordPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
- F(void, NormalPointer, (GLenum type, GLsizei stride, const GLvoid *pointer)) \
- F(void, InterleavedArrays, (GLenum format, GLsizei stride, const GLvoid *pointer)) \
- F(void, IndexPointer, (GLenum type, GLsizei stride, const GLvoid *pointer)) \
- F(void, EnableClientState, (GLenum array)) \
- F(void, EdgeFlagPointer, (GLsizei stride, const GLvoid *pointer)) \
- F(void, DisableClientState, (GLenum array)) \
- F(void, ColorPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
- F(void, ArrayElement, (GLint i)) \
- F(void, Indexubv, (const GLubyte *c)) \
- F(void, Indexub, (GLubyte c)) \
- F(void, GetPointerv, (GLenum pname, GLvoid* *params)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_1_1_DEPRECATED_FUNCTIONS);
-};
-
-class QOpenGLFunctions_1_2_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_1_2_DeprecatedBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_1_2_Deprecated; }
-
- // OpenGL 1.2 deprecated functions
-#define QT_OPENGL_1_2_DEPRECATED_FUNCTIONS(F) \
- F(void, ColorTableParameterfv, (GLenum target, GLenum pname, const GLfloat *params)) \
- F(void, ColorTableParameteriv, (GLenum target, GLenum pname, const GLint *params)) \
- F(void, CopyColorTable, (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)) \
- F(void, GetColorTable, (GLenum target, GLenum format, GLenum type, GLvoid *table)) \
- F(void, GetColorTableParameterfv, (GLenum target, GLenum pname, GLfloat *params)) \
- F(void, GetColorTableParameteriv, (GLenum target, GLenum pname, GLint *params)) \
- F(void, ColorSubTable, (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)) \
- F(void, CopyColorSubTable, (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)) \
- F(void, ConvolutionFilter1D, (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)) \
- F(void, ConvolutionFilter2D, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)) \
- F(void, ConvolutionParameterf, (GLenum target, GLenum pname, GLfloat params)) \
- F(void, ConvolutionParameterfv, (GLenum target, GLenum pname, const GLfloat *params)) \
- F(void, ConvolutionParameteri, (GLenum target, GLenum pname, GLint params)) \
- F(void, ConvolutionParameteriv, (GLenum target, GLenum pname, const GLint *params)) \
- F(void, CopyConvolutionFilter1D, (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)) \
- F(void, CopyConvolutionFilter2D, (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)) \
- F(void, GetConvolutionFilter, (GLenum target, GLenum format, GLenum type, GLvoid *image)) \
- F(void, GetConvolutionParameterfv, (GLenum target, GLenum pname, GLfloat *params)) \
- F(void, GetConvolutionParameteriv, (GLenum target, GLenum pname, GLint *params)) \
- F(void, GetSeparableFilter, (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)) \
- F(void, SeparableFilter2D, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)) \
- F(void, GetHistogram, (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)) \
- F(void, GetHistogramParameterfv, (GLenum target, GLenum pname, GLfloat *params)) \
- F(void, GetHistogramParameteriv, (GLenum target, GLenum pname, GLint *params)) \
- F(void, GetMinmax, (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)) \
- F(void, GetMinmaxParameterfv, (GLenum target, GLenum pname, GLfloat *params)) \
- F(void, GetMinmaxParameteriv, (GLenum target, GLenum pname, GLint *params)) \
- F(void, Histogram, (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)) \
- F(void, Minmax, (GLenum target, GLenum internalformat, GLboolean sink)) \
- F(void, ResetHistogram, (GLenum target)) \
- F(void, ResetMinmax, (GLenum target)) \
- F(void, ColorTable, (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_1_2_DEPRECATED_FUNCTIONS);
-};
-
-class QOpenGLFunctions_1_3_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_1_3_DeprecatedBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_1_3_Deprecated; }
-
- // OpenGL 1.3 deprecated functions
-#define QT_OPENGL_1_3_DEPRECATED_FUNCTIONS(F) \
- F(void, MultTransposeMatrixd, (const GLdouble *m)) \
- F(void, MultTransposeMatrixf, (const GLfloat *m)) \
- F(void, LoadTransposeMatrixd, (const GLdouble *m)) \
- F(void, LoadTransposeMatrixf, (const GLfloat *m)) \
- F(void, MultiTexCoord4sv, (GLenum target, const GLshort *v)) \
- F(void, MultiTexCoord4s, (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)) \
- F(void, MultiTexCoord4iv, (GLenum target, const GLint *v)) \
- F(void, MultiTexCoord4i, (GLenum target, GLint s, GLint t, GLint r, GLint q)) \
- F(void, MultiTexCoord4fv, (GLenum target, const GLfloat *v)) \
- F(void, MultiTexCoord4f, (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)) \
- F(void, MultiTexCoord4dv, (GLenum target, const GLdouble *v)) \
- F(void, MultiTexCoord4d, (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)) \
- F(void, MultiTexCoord3sv, (GLenum target, const GLshort *v)) \
- F(void, MultiTexCoord3s, (GLenum target, GLshort s, GLshort t, GLshort r)) \
- F(void, MultiTexCoord3iv, (GLenum target, const GLint *v)) \
- F(void, MultiTexCoord3i, (GLenum target, GLint s, GLint t, GLint r)) \
- F(void, MultiTexCoord3fv, (GLenum target, const GLfloat *v)) \
- F(void, MultiTexCoord3f, (GLenum target, GLfloat s, GLfloat t, GLfloat r)) \
- F(void, MultiTexCoord3dv, (GLenum target, const GLdouble *v)) \
- F(void, MultiTexCoord3d, (GLenum target, GLdouble s, GLdouble t, GLdouble r)) \
- F(void, MultiTexCoord2sv, (GLenum target, const GLshort *v)) \
- F(void, MultiTexCoord2s, (GLenum target, GLshort s, GLshort t)) \
- F(void, MultiTexCoord2iv, (GLenum target, const GLint *v)) \
- F(void, MultiTexCoord2i, (GLenum target, GLint s, GLint t)) \
- F(void, MultiTexCoord2fv, (GLenum target, const GLfloat *v)) \
- F(void, MultiTexCoord2f, (GLenum target, GLfloat s, GLfloat t)) \
- F(void, MultiTexCoord2dv, (GLenum target, const GLdouble *v)) \
- F(void, MultiTexCoord2d, (GLenum target, GLdouble s, GLdouble t)) \
- F(void, MultiTexCoord1sv, (GLenum target, const GLshort *v)) \
- F(void, MultiTexCoord1s, (GLenum target, GLshort s)) \
- F(void, MultiTexCoord1iv, (GLenum target, const GLint *v)) \
- F(void, MultiTexCoord1i, (GLenum target, GLint s)) \
- F(void, MultiTexCoord1fv, (GLenum target, const GLfloat *v)) \
- F(void, MultiTexCoord1f, (GLenum target, GLfloat s)) \
- F(void, MultiTexCoord1dv, (GLenum target, const GLdouble *v)) \
- F(void, MultiTexCoord1d, (GLenum target, GLdouble s)) \
- F(void, ClientActiveTexture, (GLenum texture)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_1_3_DEPRECATED_FUNCTIONS);
-};
-
-class QOpenGLFunctions_1_4_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_1_4_DeprecatedBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_1_4_Deprecated; }
-
- // OpenGL 1.4 deprecated functions
-#define QT_OPENGL_1_4_DEPRECATED_FUNCTIONS(F) \
- F(void, WindowPos3sv, (const GLshort *v)) \
- F(void, WindowPos3s, (GLshort x, GLshort y, GLshort z)) \
- F(void, WindowPos3iv, (const GLint *v)) \
- F(void, WindowPos3i, (GLint x, GLint y, GLint z)) \
- F(void, WindowPos3fv, (const GLfloat *v)) \
- F(void, WindowPos3f, (GLfloat x, GLfloat y, GLfloat z)) \
- F(void, WindowPos3dv, (const GLdouble *v)) \
- F(void, WindowPos3d, (GLdouble x, GLdouble y, GLdouble z)) \
- F(void, WindowPos2sv, (const GLshort *v)) \
- F(void, WindowPos2s, (GLshort x, GLshort y)) \
- F(void, WindowPos2iv, (const GLint *v)) \
- F(void, WindowPos2i, (GLint x, GLint y)) \
- F(void, WindowPos2fv, (const GLfloat *v)) \
- F(void, WindowPos2f, (GLfloat x, GLfloat y)) \
- F(void, WindowPos2dv, (const GLdouble *v)) \
- F(void, WindowPos2d, (GLdouble x, GLdouble y)) \
- F(void, SecondaryColorPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
- F(void, SecondaryColor3usv, (const GLushort *v)) \
- F(void, SecondaryColor3us, (GLushort red, GLushort green, GLushort blue)) \
- F(void, SecondaryColor3uiv, (const GLuint *v)) \
- F(void, SecondaryColor3ui, (GLuint red, GLuint green, GLuint blue)) \
- F(void, SecondaryColor3ubv, (const GLubyte *v)) \
- F(void, SecondaryColor3ub, (GLubyte red, GLubyte green, GLubyte blue)) \
- F(void, SecondaryColor3sv, (const GLshort *v)) \
- F(void, SecondaryColor3s, (GLshort red, GLshort green, GLshort blue)) \
- F(void, SecondaryColor3iv, (const GLint *v)) \
- F(void, SecondaryColor3i, (GLint red, GLint green, GLint blue)) \
- F(void, SecondaryColor3fv, (const GLfloat *v)) \
- F(void, SecondaryColor3f, (GLfloat red, GLfloat green, GLfloat blue)) \
- F(void, SecondaryColor3dv, (const GLdouble *v)) \
- F(void, SecondaryColor3d, (GLdouble red, GLdouble green, GLdouble blue)) \
- F(void, SecondaryColor3bv, (const GLbyte *v)) \
- F(void, SecondaryColor3b, (GLbyte red, GLbyte green, GLbyte blue)) \
- F(void, FogCoordPointer, (GLenum type, GLsizei stride, const GLvoid *pointer)) \
- F(void, FogCoorddv, (const GLdouble *coord)) \
- F(void, FogCoordd, (GLdouble coord)) \
- F(void, FogCoordfv, (const GLfloat *coord)) \
- F(void, FogCoordf, (GLfloat coord)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_1_4_DEPRECATED_FUNCTIONS);
-};
-
-class QOpenGLFunctions_2_0_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_2_0_DeprecatedBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_2_0_Deprecated; }
-
- // OpenGL 2.0 deprecated functions
-#define QT_OPENGL_2_0_DEPRECATED_FUNCTIONS(F) \
- F(void, VertexAttrib4usv, (GLuint index, const GLushort *v)) \
- F(void, VertexAttrib4uiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttrib4ubv, (GLuint index, const GLubyte *v)) \
- F(void, VertexAttrib4sv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttrib4s, (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)) \
- F(void, VertexAttrib4iv, (GLuint index, const GLint *v)) \
- F(void, VertexAttrib4fv, (GLuint index, const GLfloat *v)) \
- F(void, VertexAttrib4f, (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)) \
- F(void, VertexAttrib4dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttrib4d, (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
- F(void, VertexAttrib4bv, (GLuint index, const GLbyte *v)) \
- F(void, VertexAttrib4Nusv, (GLuint index, const GLushort *v)) \
- F(void, VertexAttrib4Nuiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttrib4Nubv, (GLuint index, const GLubyte *v)) \
- F(void, VertexAttrib4Nub, (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)) \
- F(void, VertexAttrib4Nsv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttrib4Niv, (GLuint index, const GLint *v)) \
- F(void, VertexAttrib4Nbv, (GLuint index, const GLbyte *v)) \
- F(void, VertexAttrib3sv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttrib3s, (GLuint index, GLshort x, GLshort y, GLshort z)) \
- F(void, VertexAttrib3fv, (GLuint index, const GLfloat *v)) \
- F(void, VertexAttrib3f, (GLuint index, GLfloat x, GLfloat y, GLfloat z)) \
- F(void, VertexAttrib3dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttrib3d, (GLuint index, GLdouble x, GLdouble y, GLdouble z)) \
- F(void, VertexAttrib2sv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttrib2s, (GLuint index, GLshort x, GLshort y)) \
- F(void, VertexAttrib2fv, (GLuint index, const GLfloat *v)) \
- F(void, VertexAttrib2f, (GLuint index, GLfloat x, GLfloat y)) \
- F(void, VertexAttrib2dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttrib2d, (GLuint index, GLdouble x, GLdouble y)) \
- F(void, VertexAttrib1sv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttrib1s, (GLuint index, GLshort x)) \
- F(void, VertexAttrib1fv, (GLuint index, const GLfloat *v)) \
- F(void, VertexAttrib1f, (GLuint index, GLfloat x)) \
- F(void, VertexAttrib1dv, (GLuint index, const GLdouble *v)) \
- F(void, VertexAttrib1d, (GLuint index, GLdouble x)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_2_0_DEPRECATED_FUNCTIONS);
-};
-
-class QOpenGLFunctions_3_0_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_3_0_DeprecatedBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_3_0_Deprecated; }
-
- // OpenGL 3.0 deprecated functions
-#define QT_OPENGL_3_0_DEPRECATED_FUNCTIONS(F) \
- F(void, VertexAttribI4usv, (GLuint index, const GLushort *v)) \
- F(void, VertexAttribI4ubv, (GLuint index, const GLubyte *v)) \
- F(void, VertexAttribI4sv, (GLuint index, const GLshort *v)) \
- F(void, VertexAttribI4bv, (GLuint index, const GLbyte *v)) \
- F(void, VertexAttribI4uiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttribI3uiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttribI2uiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttribI1uiv, (GLuint index, const GLuint *v)) \
- F(void, VertexAttribI4iv, (GLuint index, const GLint *v)) \
- F(void, VertexAttribI3iv, (GLuint index, const GLint *v)) \
- F(void, VertexAttribI2iv, (GLuint index, const GLint *v)) \
- F(void, VertexAttribI1iv, (GLuint index, const GLint *v)) \
- F(void, VertexAttribI4ui, (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)) \
- F(void, VertexAttribI3ui, (GLuint index, GLuint x, GLuint y, GLuint z)) \
- F(void, VertexAttribI2ui, (GLuint index, GLuint x, GLuint y)) \
- F(void, VertexAttribI1ui, (GLuint index, GLuint x)) \
- F(void, VertexAttribI4i, (GLuint index, GLint x, GLint y, GLint z, GLint w)) \
- F(void, VertexAttribI3i, (GLuint index, GLint x, GLint y, GLint z)) \
- F(void, VertexAttribI2i, (GLuint index, GLint x, GLint y)) \
- F(void, VertexAttribI1i, (GLuint index, GLint x)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_3_0_DEPRECATED_FUNCTIONS);
-};
-
-class QOpenGLFunctions_3_3_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_3_3_DeprecatedBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_3_3_Deprecated; }
-
- // OpenGL 3.3 deprecated functions
-#define QT_OPENGL_3_3_DEPRECATED_FUNCTIONS(F) \
- F(void, SecondaryColorP3uiv, (GLenum type, const GLuint *color)) \
- F(void, SecondaryColorP3ui, (GLenum type, GLuint color)) \
- F(void, ColorP4uiv, (GLenum type, const GLuint *color)) \
- F(void, ColorP4ui, (GLenum type, GLuint color)) \
- F(void, ColorP3uiv, (GLenum type, const GLuint *color)) \
- F(void, ColorP3ui, (GLenum type, GLuint color)) \
- F(void, NormalP3uiv, (GLenum type, const GLuint *coords)) \
- F(void, NormalP3ui, (GLenum type, GLuint coords)) \
- F(void, MultiTexCoordP4uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
- F(void, MultiTexCoordP4ui, (GLenum texture, GLenum type, GLuint coords)) \
- F(void, MultiTexCoordP3uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
- F(void, MultiTexCoordP3ui, (GLenum texture, GLenum type, GLuint coords)) \
- F(void, MultiTexCoordP2uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
- F(void, MultiTexCoordP2ui, (GLenum texture, GLenum type, GLuint coords)) \
- F(void, MultiTexCoordP1uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
- F(void, MultiTexCoordP1ui, (GLenum texture, GLenum type, GLuint coords)) \
- F(void, TexCoordP4uiv, (GLenum type, const GLuint *coords)) \
- F(void, TexCoordP4ui, (GLenum type, GLuint coords)) \
- F(void, TexCoordP3uiv, (GLenum type, const GLuint *coords)) \
- F(void, TexCoordP3ui, (GLenum type, GLuint coords)) \
- F(void, TexCoordP2uiv, (GLenum type, const GLuint *coords)) \
- F(void, TexCoordP2ui, (GLenum type, GLuint coords)) \
- F(void, TexCoordP1uiv, (GLenum type, const GLuint *coords)) \
- F(void, TexCoordP1ui, (GLenum type, GLuint coords)) \
- F(void, VertexP4uiv, (GLenum type, const GLuint *value)) \
- F(void, VertexP4ui, (GLenum type, GLuint value)) \
- F(void, VertexP3uiv, (GLenum type, const GLuint *value)) \
- F(void, VertexP3ui, (GLenum type, GLuint value)) \
- F(void, VertexP2uiv, (GLenum type, const GLuint *value)) \
- F(void, VertexP2ui, (GLenum type, GLuint value)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_3_3_DEPRECATED_FUNCTIONS);
-};
-
-class QOpenGLFunctions_4_5_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
-{
-public:
- QOpenGLFunctions_4_5_DeprecatedBackend(QOpenGLContext *c)
- : QOpenGLVersionFunctionsBackend(c)
- {
- init();
- }
-
- Q_DECL_CONSTEXPR static Version versionStatus()
- { return OpenGL_4_5_Deprecated; }
-
- // OpenGL 4.5 deprecated functions
-#define QT_OPENGL_4_5_DEPRECATED_FUNCTIONS(F) \
- F(void, GetnMinmax, (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values)) \
- F(void, GetnHistogram, (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values)) \
- F(void, GetnSeparableFilter, (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span)) \
- F(void, GetnConvolutionFilter, (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image)) \
- F(void, GetnColorTable, (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table)) \
- F(void, GetnPolygonStipple, (GLsizei bufSize, GLubyte *pattern)) \
- F(void, GetnPixelMapusv, (GLenum map, GLsizei bufSize, GLushort *values)) \
- F(void, GetnPixelMapuiv, (GLenum map, GLsizei bufSize, GLuint *values)) \
- F(void, GetnPixelMapfv, (GLenum map, GLsizei bufSize, GLfloat *values)) \
- F(void, GetnMapiv, (GLenum target, GLenum query, GLsizei bufSize, GLint *v)) \
- F(void, GetnMapfv, (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v)) \
- F(void, GetnMapdv, (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v)) \
-
- QT_OPENGL_DECLARE(QT_OPENGL_4_5_DEPRECATED_FUNCTIONS);
-};
-
-#else
-
-// No need for backend classes with function pointers with ES2.
-// All function addresses are independent of context and display.
-
-#endif // !QT_OPENGL_ES_2
-
-#undef QT_OPENGL_DECLARE_FUNCTIONS
-#undef QT_OPENGL_COUNT_FUNCTIONS
-#undef QT_OPENGL_DECLARE
-
-
-QT_END_NAMESPACE
-
-#ifdef Q_OS_WIN
-#pragma pop_macro("MemoryBarrier")
-#endif
-
-#endif // QT_NO_OPENGL
-
-#endif
diff --git a/src/gui/opengl/qopenglversionfunctionsfactory.cpp b/src/gui/opengl/qopenglversionfunctionsfactory.cpp
deleted file mode 100644
index ca7daedf34..0000000000
--- a/src/gui/opengl/qopenglversionfunctionsfactory.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#include "qopenglversionfunctionsfactory_p.h"
-
-#if !defined(QT_OPENGL_ES_2)
-#include "qopenglfunctions_4_5_core.h"
-#include "qopenglfunctions_4_5_compatibility.h"
-#include "qopenglfunctions_4_4_core.h"
-#include "qopenglfunctions_4_4_compatibility.h"
-#include "qopenglfunctions_4_3_core.h"
-#include "qopenglfunctions_4_3_compatibility.h"
-#include "qopenglfunctions_4_2_core.h"
-#include "qopenglfunctions_4_2_compatibility.h"
-#include "qopenglfunctions_4_1_core.h"
-#include "qopenglfunctions_4_1_compatibility.h"
-#include "qopenglfunctions_4_0_core.h"
-#include "qopenglfunctions_4_0_compatibility.h"
-#include "qopenglfunctions_3_3_core.h"
-#include "qopenglfunctions_3_3_compatibility.h"
-#include "qopenglfunctions_3_2_core.h"
-#include "qopenglfunctions_3_2_compatibility.h"
-#include "qopenglfunctions_3_1.h"
-#include "qopenglfunctions_3_0.h"
-#include "qopenglfunctions_2_1.h"
-#include "qopenglfunctions_2_0.h"
-#include "qopenglfunctions_1_5.h"
-#include "qopenglfunctions_1_4.h"
-#include "qopenglfunctions_1_3.h"
-#include "qopenglfunctions_1_2.h"
-#include "qopenglfunctions_1_1.h"
-#include "qopenglfunctions_1_0.h"
-#else
-#include "qopenglfunctions_es2.h"
-#endif
-
-QT_BEGIN_NAMESPACE
-
-QAbstractOpenGLFunctions *QOpenGLVersionFunctionsFactory::create(const QOpenGLVersionProfile &versionProfile)
-{
-#if !defined(QT_OPENGL_ES_2)
- const int major = versionProfile.version().first;
- const int minor = versionProfile.version().second;
-
- if (versionProfile.hasProfiles()) {
- switch (versionProfile.profile()) {
- case QSurfaceFormat::CoreProfile:
- if (major == 4 && minor == 5)
- return new QOpenGLFunctions_4_5_Core;
- else if (major == 4 && minor == 4)
- return new QOpenGLFunctions_4_4_Core;
- else if (major == 4 && minor == 3)
- return new QOpenGLFunctions_4_3_Core;
- else if (major == 4 && minor == 2)
- return new QOpenGLFunctions_4_2_Core;
- else if (major == 4 && minor == 1)
- return new QOpenGLFunctions_4_1_Core;
- else if (major == 4 && minor == 0)
- return new QOpenGLFunctions_4_0_Core;
- else if (major == 3 && minor == 3)
- return new QOpenGLFunctions_3_3_Core;
- else if (major == 3 && minor == 2)
- return new QOpenGLFunctions_3_2_Core;
- break;
-
- case QSurfaceFormat::CompatibilityProfile:
- if (major == 4 && minor == 5)
- return new QOpenGLFunctions_4_5_Compatibility;
- else if (major == 4 && minor == 4)
- return new QOpenGLFunctions_4_4_Compatibility;
- else if (major == 4 && minor == 3)
- return new QOpenGLFunctions_4_3_Compatibility;
- else if (major == 4 && minor == 2)
- return new QOpenGLFunctions_4_2_Compatibility;
- else if (major == 4 && minor == 1)
- return new QOpenGLFunctions_4_1_Compatibility;
- else if (major == 4 && minor == 0)
- return new QOpenGLFunctions_4_0_Compatibility;
- else if (major == 3 && minor == 3)
- return new QOpenGLFunctions_3_3_Compatibility;
- else if (major == 3 && minor == 2)
- return new QOpenGLFunctions_3_2_Compatibility;
- break;
-
- case QSurfaceFormat::NoProfile:
- default:
- break;
- };
- } else {
- if (major == 3 && minor == 1)
- return new QOpenGLFunctions_3_1;
- else if (major == 3 && minor == 0)
- return new QOpenGLFunctions_3_0;
- else if (major == 2 && minor == 1)
- return new QOpenGLFunctions_2_1;
- else if (major == 2 && minor == 0)
- return new QOpenGLFunctions_2_0;
- else if (major == 1 && minor == 5)
- return new QOpenGLFunctions_1_5;
- else if (major == 1 && minor == 4)
- return new QOpenGLFunctions_1_4;
- else if (major == 1 && minor == 3)
- return new QOpenGLFunctions_1_3;
- else if (major == 1 && minor == 2)
- return new QOpenGLFunctions_1_2;
- else if (major == 1 && minor == 1)
- return new QOpenGLFunctions_1_1;
- else if (major == 1 && minor == 0)
- return new QOpenGLFunctions_1_0;
- }
- return nullptr;
-#else
- Q_UNUSED(versionProfile);
- return new QOpenGLFunctions_ES2;
-#endif
-}
-
-QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglversionfunctionsfactory_p.h b/src/gui/opengl/qopenglversionfunctionsfactory_p.h
deleted file mode 100644
index 469a9cc624..0000000000
--- a/src/gui/opengl/qopenglversionfunctionsfactory_p.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-**
-** This file was generated by glgen version 0.1
-** Command line was: glgen
-**
-** glgen is Copyright (C) 2012 Klaralvdalens Datakonsult AB (KDAB)
-**
-** This is an auto-generated file.
-** Do not edit! All changes made to it will be lost.
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERSIONFUNCTIONFACTORY_P_H
-#define QOPENGLVERSIONFUNCTIONFACTORY_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtGui/private/qtguiglobal_p.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtGui/qopenglcontext.h>
-
-QT_BEGIN_NAMESPACE
-
-class QAbstractOpenGLFunctions;
-
-class QOpenGLVersionFunctionsFactory
-{
-public:
- static QAbstractOpenGLFunctions *create(const QOpenGLVersionProfile &versionProfile);
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-
-#endif
diff --git a/src/gui/opengl/qopenglvertexarrayobject.cpp b/src/gui/opengl/qopenglvertexarrayobject.cpp
deleted file mode 100644
index f15fe06ee8..0000000000
--- a/src/gui/opengl/qopenglvertexarrayobject.cpp
+++ /dev/null
@@ -1,531 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sean Harmer <sean.harmer@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenglvertexarrayobject.h"
-
-#include <QtCore/private/qobject_p.h>
-#include <QtCore/qthread.h>
-#include <QtGui/qopenglcontext.h>
-#include <QtGui/qoffscreensurface.h>
-#include <QtGui/qguiapplication.h>
-
-#include <QtGui/qopenglfunctions_3_0.h>
-#include <QtGui/qopenglfunctions_3_2_core.h>
-
-#include <private/qopenglextensions_p.h>
-#include <private/qopenglvertexarrayobject_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLFunctions_3_0;
-class QOpenGLFunctions_3_2_Core;
-
-void qtInitializeVertexArrayObjectHelper(QOpenGLVertexArrayObjectHelper *helper, QOpenGLContext *context)
-{
- Q_ASSERT(helper);
- Q_ASSERT(context);
-
- bool tryARB = true;
-
- if (context->isOpenGLES()) {
- if (context->format().majorVersion() >= 3) {
- QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
- helper->GenVertexArrays = extra->f.GenVertexArrays;
- helper->DeleteVertexArrays = extra->f.DeleteVertexArrays;
- helper->BindVertexArray = extra->f.BindVertexArray;
- helper->IsVertexArray = extra->f.IsVertexArray;
- tryARB = false;
- } else if (context->hasExtension(QByteArrayLiteral("GL_OES_vertex_array_object"))) {
- helper->GenVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_GenVertexArrays_t>(context->getProcAddress("glGenVertexArraysOES"));
- helper->DeleteVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_DeleteVertexArrays_t>(context->getProcAddress("glDeleteVertexArraysOES"));
- helper->BindVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_BindVertexArray_t>(context->getProcAddress("glBindVertexArrayOES"));
- helper->IsVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_IsVertexArray_t>(context->getProcAddress("glIsVertexArrayOES"));
- tryARB = false;
- }
- } else if (context->hasExtension(QByteArrayLiteral("GL_APPLE_vertex_array_object")) &&
- !context->hasExtension(QByteArrayLiteral("GL_ARB_vertex_array_object"))) {
- helper->GenVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_GenVertexArrays_t>(context->getProcAddress("glGenVertexArraysAPPLE"));
- helper->DeleteVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_DeleteVertexArrays_t>(context->getProcAddress("glDeleteVertexArraysAPPLE"));
- helper->BindVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_BindVertexArray_t>(context->getProcAddress("glBindVertexArrayAPPLE"));
- helper->IsVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_IsVertexArray_t>(context->getProcAddress("glIsVertexArrayAPPLE"));
- tryARB = false;
- }
-
- if (tryARB && context->hasExtension(QByteArrayLiteral("GL_ARB_vertex_array_object"))) {
- helper->GenVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_GenVertexArrays_t>(context->getProcAddress("glGenVertexArrays"));
- helper->DeleteVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_DeleteVertexArrays_t>(context->getProcAddress("glDeleteVertexArrays"));
- helper->BindVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_BindVertexArray_t>(context->getProcAddress("glBindVertexArray"));
- helper->IsVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_IsVertexArray_t>(context->getProcAddress("glIsVertexArray"));
- }
-}
-
-class QOpenGLVertexArrayObjectPrivate : public QObjectPrivate
-{
-public:
- QOpenGLVertexArrayObjectPrivate()
- : vao(0)
- , vaoFuncsType(NotSupported)
- , context(nullptr)
- {
- }
-
- ~QOpenGLVertexArrayObjectPrivate()
- {
- if (vaoFuncsType == ARB || vaoFuncsType == APPLE || vaoFuncsType == OES)
- delete vaoFuncs.helper;
- }
-
- bool create();
- void destroy();
- void bind();
- void release();
- void _q_contextAboutToBeDestroyed();
-
- Q_DECLARE_PUBLIC(QOpenGLVertexArrayObject)
-
- GLuint vao;
-
- union {
- QOpenGLFunctions_3_0 *core_3_0;
- QOpenGLFunctions_3_2_Core *core_3_2;
- QOpenGLVertexArrayObjectHelper *helper;
- } vaoFuncs;
- enum {
- NotSupported,
- Core_3_0,
- Core_3_2,
- ARB,
- APPLE,
- OES
- } vaoFuncsType;
-
- QOpenGLContext *context;
-};
-
-bool QOpenGLVertexArrayObjectPrivate::create()
-{
- if (vao) {
- qWarning("QOpenGLVertexArrayObject::create() VAO is already created");
- return false;
- }
-
- Q_Q(QOpenGLVertexArrayObject);
-
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (!ctx) {
- qWarning("QOpenGLVertexArrayObject::create() requires a valid current OpenGL context");
- return false;
- }
-
- //Fail early, if context is the same as ctx, it means we have tried to initialize for this context and failed
- if (ctx == context)
- return false;
-
- context = ctx;
- QObject::connect(context, SIGNAL(aboutToBeDestroyed()), q, SLOT(_q_contextAboutToBeDestroyed()));
-
- if (ctx->isOpenGLES()) {
- if (ctx->format().majorVersion() >= 3 || ctx->hasExtension(QByteArrayLiteral("GL_OES_vertex_array_object"))) {
- vaoFuncs.helper = new QOpenGLVertexArrayObjectHelper(ctx);
- vaoFuncsType = OES;
- vaoFuncs.helper->glGenVertexArrays(1, &vao);
- }
- } else {
- vaoFuncs.core_3_0 = nullptr;
- vaoFuncsType = NotSupported;
- QSurfaceFormat format = ctx->format();
-#ifndef QT_OPENGL_ES_2
- if (format.version() >= qMakePair<int, int>(3,2)) {
- vaoFuncs.core_3_2 = ctx->versionFunctions<QOpenGLFunctions_3_2_Core>();
- vaoFuncsType = Core_3_2;
- vaoFuncs.core_3_2->glGenVertexArrays(1, &vao);
- } else if (format.majorVersion() >= 3) {
- vaoFuncs.core_3_0 = ctx->versionFunctions<QOpenGLFunctions_3_0>();
- vaoFuncsType = Core_3_0;
- vaoFuncs.core_3_0->glGenVertexArrays(1, &vao);
- } else
-#endif
- if (ctx->hasExtension(QByteArrayLiteral("GL_ARB_vertex_array_object"))) {
- vaoFuncs.helper = new QOpenGLVertexArrayObjectHelper(ctx);
- vaoFuncsType = ARB;
- vaoFuncs.helper->glGenVertexArrays(1, &vao);
- } else if (ctx->hasExtension(QByteArrayLiteral("GL_APPLE_vertex_array_object"))) {
- vaoFuncs.helper = new QOpenGLVertexArrayObjectHelper(ctx);
- vaoFuncsType = APPLE;
- vaoFuncs.helper->glGenVertexArrays(1, &vao);
- }
- }
-
- return (vao != 0);
-}
-
-void QOpenGLVertexArrayObjectPrivate::destroy()
-{
- Q_Q(QOpenGLVertexArrayObject);
-
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- QOpenGLContext *oldContext = nullptr;
- QSurface *oldContextSurface = nullptr;
- QScopedPointer<QOffscreenSurface> offscreenSurface;
- if (context && context != ctx) {
- oldContext = ctx;
- oldContextSurface = ctx ? ctx->surface() : nullptr;
- // Before going through the effort of creating an offscreen surface
- // check that we are on the GUI thread because otherwise many platforms
- // will not able to create that offscreen surface.
- if (QThread::currentThread() != qGuiApp->thread()) {
- ctx = nullptr;
- } else {
- // Cannot just make the current surface current again with another context.
- // The format may be incompatible and some platforms (iOS) may impose
- // restrictions on using a window with different contexts. Create an
- // offscreen surface (a pbuffer or a hidden window) instead to be safe.
- offscreenSurface.reset(new QOffscreenSurface);
- offscreenSurface->setFormat(context->format());
- offscreenSurface->create();
- if (context->makeCurrent(offscreenSurface.data())) {
- ctx = context;
- } else {
- qWarning("QOpenGLVertexArrayObject::destroy() failed to make VAO's context current");
- ctx = nullptr;
- }
- }
- }
-
- if (context) {
- QObject::disconnect(context, SIGNAL(aboutToBeDestroyed()), q, SLOT(_q_contextAboutToBeDestroyed()));
- context = nullptr;
- }
-
- if (vao && ctx) {
- switch (vaoFuncsType) {
-#ifndef QT_OPENGL_ES_2
- case Core_3_2:
- vaoFuncs.core_3_2->glDeleteVertexArrays(1, &vao);
- break;
- case Core_3_0:
- vaoFuncs.core_3_0->glDeleteVertexArrays(1, &vao);
- break;
-#endif
- case ARB:
- case APPLE:
- case OES:
- vaoFuncs.helper->glDeleteVertexArrays(1, &vao);
- break;
- default:
- break;
- }
-
- vao = 0;
- }
-
- if (oldContext && oldContextSurface) {
- if (!oldContext->makeCurrent(oldContextSurface))
- qWarning("QOpenGLVertexArrayObject::destroy() failed to restore current context");
- }
-}
-
-/*!
- \internal
-*/
-void QOpenGLVertexArrayObjectPrivate::_q_contextAboutToBeDestroyed()
-{
- destroy();
-}
-
-void QOpenGLVertexArrayObjectPrivate::bind()
-{
- switch (vaoFuncsType) {
-#ifndef QT_OPENGL_ES_2
- case Core_3_2:
- vaoFuncs.core_3_2->glBindVertexArray(vao);
- break;
- case Core_3_0:
- vaoFuncs.core_3_0->glBindVertexArray(vao);
- break;
-#endif
- case ARB:
- case APPLE:
- case OES:
- vaoFuncs.helper->glBindVertexArray(vao);
- break;
- default:
- break;
- }
-}
-
-void QOpenGLVertexArrayObjectPrivate::release()
-{
- switch (vaoFuncsType) {
-#ifndef QT_OPENGL_ES_2
- case Core_3_2:
- vaoFuncs.core_3_2->glBindVertexArray(0);
- break;
- case Core_3_0:
- vaoFuncs.core_3_0->glBindVertexArray(0);
- break;
-#endif
- case ARB:
- case APPLE:
- case OES:
- vaoFuncs.helper->glBindVertexArray(0);
- break;
- default:
- break;
- }
-}
-
-
-/*!
- \class QOpenGLVertexArrayObject
- \brief The QOpenGLVertexArrayObject class wraps an OpenGL Vertex Array Object.
- \inmodule QtGui
- \since 5.1
- \ingroup painting-3D
-
- A Vertex Array Object (VAO) is an OpenGL container object that encapsulates
- the state needed to specify per-vertex attribute data to the OpenGL pipeline.
- To put it another way, a VAO remembers the states of buffer objects (see
- QOpenGLBuffer) and their associated state (e.g. vertex attribute divisors).
- This allows a very easy and efficient method of switching between OpenGL buffer
- states for rendering different "objects" in a scene. The QOpenGLVertexArrayObject
- class is a thin wrapper around an OpenGL VAO.
-
- For the desktop, VAOs are supported as a core feature in OpenGL 3.0 or newer and by the
- GL_ARB_vertex_array_object for older versions. On OpenGL ES 2, VAOs are provided by
- the optional GL_OES_vertex_array_object extension. You can check the version of
- OpenGL with QOpenGLContext::surfaceFormat() and check for the presence of extensions
- with QOpenGLContext::hasExtension().
-
- As with the other Qt OpenGL classes, QOpenGLVertexArrayObject has a create()
- function to create the underlying OpenGL object. This is to allow the developer to
- ensure that there is a valid current OpenGL context at the time.
-
- Once you have successfully created a VAO the typical usage pattern is:
-
- \list
- \li In scene initialization function, for each visual object:
- \list
- \li Bind the VAO
- \li Set vertex data state for this visual object (vertices, normals, texture coordinates etc.)
- \li Unbind (release()) the VAO
- \endlist
- \li In render function, for each visual object:
- \list
- \li Bind the VAO (and shader program if needed)
- \li Call a glDraw*() function
- \li Unbind (release()) the VAO
- \endlist
- \endlist
-
- The act of binding the VAO in the render function has the effect of restoring
- all of the vertex data state setup in the initialization phase. In this way we can
- set a great deal of state when setting up a VAO and efficiently switch between
- state sets of objects to be rendered. Using VAOs also allows the OpenGL driver
- to amortise the validation checks of the vertex data.
-
- \note Vertex Array Objects, like all other OpenGL container objects, are specific
- to the context for which they were created and cannot be shared amongst a
- context group.
-
- \sa QOpenGLVertexArrayObject::Binder, QOpenGLBuffer
-*/
-
-/*!
- Creates a QOpenGLVertexArrayObject with the given \a parent. You must call create()
- with a valid OpenGL context before using.
-*/
-QOpenGLVertexArrayObject::QOpenGLVertexArrayObject(QObject* parent)
- : QObject(*new QOpenGLVertexArrayObjectPrivate, parent)
-{
-}
-
-/*!
- \internal
-*/
-QOpenGLVertexArrayObject::QOpenGLVertexArrayObject(QOpenGLVertexArrayObjectPrivate &dd)
- : QObject(dd)
-{
-}
-
-/*!
- Destroys the QOpenGLVertexArrayObject and the underlying OpenGL resource.
-*/
-QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject()
-{
- destroy();
-}
-
-/*!
- Creates the underlying OpenGL vertex array object. There must be a valid OpenGL context
- that supports vertex array objects current for this function to succeed.
-
- Returns \c true if the OpenGL vertex array object was successfully created.
-
- When the return value is \c false, vertex array object support is not available. This
- is not an error: on systems with OpenGL 2.x or OpenGL ES 2.0 vertex array objects may
- not be supported. The application is free to continue execution in this case, but it
- then has to be prepared to operate in a VAO-less manner too. This means that instead
- of merely calling bind(), the value of isCreated() must be checked and the vertex
- arrays has to be initialized in the traditional way when there is no vertex array
- object present.
-
- \sa isCreated()
-*/
-bool QOpenGLVertexArrayObject::create()
-{
- Q_D(QOpenGLVertexArrayObject);
- return d->create();
-}
-
-/*!
- Destroys the underlying OpenGL vertex array object. There must be a valid OpenGL context
- that supports vertex array objects current for this function to succeed.
-*/
-void QOpenGLVertexArrayObject::destroy()
-{
- Q_D(QOpenGLVertexArrayObject);
- d->destroy();
-}
-
-/*!
- Returns \c true is the underlying OpenGL vertex array object has been created. If this
- returns \c true and the associated OpenGL context is current, then you are able to bind()
- this object.
-*/
-bool QOpenGLVertexArrayObject::isCreated() const
-{
- Q_D(const QOpenGLVertexArrayObject);
- return (d->vao != 0);
-}
-
-/*!
- Returns the id of the underlying OpenGL vertex array object.
-*/
-GLuint QOpenGLVertexArrayObject::objectId() const
-{
- Q_D(const QOpenGLVertexArrayObject);
- return d->vao;
-}
-
-/*!
- Binds this vertex array object to the OpenGL binding point. From this point on
- and until release() is called or another vertex array object is bound, any
- modifications made to vertex data state are stored inside this vertex array object.
-
- If another vertex array object is then bound you can later restore the set of
- state associated with this object by calling bind() on this object once again.
- This allows efficient changes between vertex data states in rendering functions.
-*/
-void QOpenGLVertexArrayObject::bind()
-{
- Q_D(QOpenGLVertexArrayObject);
- d->bind();
-}
-
-/*!
- Unbinds this vertex array object by binding the default vertex array object (id = 0).
-*/
-void QOpenGLVertexArrayObject::release()
-{
- Q_D(QOpenGLVertexArrayObject);
- d->release();
-}
-
-
-/*!
- \class QOpenGLVertexArrayObject::Binder
- \brief The QOpenGLVertexArrayObject::Binder class is a convenience class to help
- with the binding and releasing of OpenGL Vertex Array Objects.
- \inmodule QtGui
- \reentrant
- \since 5.1
- \ingroup painting-3D
-
- QOpenGLVertexArrayObject::Binder is a simple convenience class that can be used
- to assist with the binding and releasing of QOpenGLVertexArrayObject instances.
- This class is to QOpenGLVertexArrayObject as QMutexLocker is to QMutex.
-
- This class implements the RAII principle which helps to ensure behavior in
- complex code or in the presence of exceptions.
-
- The constructor of this class accepts a QOpenGLVertexArrayObject (VAO) as an
- argument and attempts to bind the VAO, calling QOpenGLVertexArrayObject::create()
- if necessary. The destructor of this class calls QOpenGLVertexArrayObject::release()
- which unbinds the VAO.
-
- If needed the VAO can be temporarily unbound with the release() function and bound
- once more with rebind().
-
- \sa QOpenGLVertexArrayObject
-*/
-
-/*!
- \fn QOpenGLVertexArrayObject::Binder::Binder(QOpenGLVertexArrayObject *v)
-
- Creates a QOpenGLVertexArrayObject::Binder object and binds \a v by calling
- QOpenGLVertexArrayObject::bind(). If necessary it first calls
- QOpenGLVertexArrayObject::create().
-*/
-
-/*!
- \fn QOpenGLVertexArrayObject::Binder::~Binder()
-
- Destroys the QOpenGLVertexArrayObject::Binder and releases the associated vertex array object.
-*/
-
-/*!
- \fn QOpenGLVertexArrayObject::Binder::release()
-
- Can be used to temporarily release the associated vertex array object.
-
- \sa rebind()
-*/
-
-/*!
- \fn QOpenGLVertexArrayObject::Binder::rebind()
-
- Can be used to rebind the associated vertex array object.
-
- \sa release()
-*/
-
-QT_END_NAMESPACE
-
-#include "moc_qopenglvertexarrayobject.cpp"
diff --git a/src/gui/opengl/qopenglvertexarrayobject.h b/src/gui/opengl/qopenglvertexarrayobject.h
deleted file mode 100644
index b81ae6a2a9..0000000000
--- a/src/gui/opengl/qopenglvertexarrayobject.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sean Harmer <sean.harmer@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERTEXARRAYOBJECT_H
-#define QOPENGLVERTEXARRAYOBJECT_H
-
-#include <QtGui/qtguiglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtCore/QObject>
-#include <QtGui/qopengl.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLVertexArrayObjectPrivate;
-
-class Q_GUI_EXPORT QOpenGLVertexArrayObject : public QObject
-{
- Q_OBJECT
-
-public:
- explicit QOpenGLVertexArrayObject(QObject* parent = nullptr);
- ~QOpenGLVertexArrayObject();
-
- bool create();
- void destroy();
- bool isCreated() const;
- GLuint objectId() const;
- void bind();
- void release();
-
- class Q_GUI_EXPORT Binder
- {
- public:
- inline Binder(QOpenGLVertexArrayObject *v)
- : vao(v)
- {
- Q_ASSERT(v);
- if (vao->isCreated() || vao->create())
- vao->bind();
- }
-
- inline ~Binder()
- {
- release();
- }
-
- inline void release()
- {
- vao->release();
- }
-
- inline void rebind()
- {
- vao->bind();
- }
-
- private:
- Q_DISABLE_COPY(Binder)
- QOpenGLVertexArrayObject *vao;
- };
-
-private:
- Q_DISABLE_COPY(QOpenGLVertexArrayObject)
- Q_DECLARE_PRIVATE(QOpenGLVertexArrayObject)
- Q_PRIVATE_SLOT(d_func(), void _q_contextAboutToBeDestroyed())
- QOpenGLVertexArrayObject(QOpenGLVertexArrayObjectPrivate &dd);
-};
-
-QT_END_NAMESPACE
-
-#endif
-
-#endif // QOPENGLVERTEXARRAYOBJECT_H
diff --git a/src/gui/opengl/qopenglvertexarrayobject_p.h b/src/gui/opengl/qopenglvertexarrayobject_p.h
deleted file mode 100644
index fd3a6f0f89..0000000000
--- a/src/gui/opengl/qopenglvertexarrayobject_p.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sean Harmer <sean.harmer@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLVERTEXARRAYOBJECT_P_H
-#define QOPENGLVERTEXARRAYOBJECT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of the Qt OpenGL classes. This header file may change from
-// version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtGui/qopengl.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLVertexArrayObjectHelper;
-class QOpenGLContext;
-
-void Q_GUI_EXPORT qtInitializeVertexArrayObjectHelper(QOpenGLVertexArrayObjectHelper *helper, QOpenGLContext *context);
-
-class QOpenGLVertexArrayObjectHelper
-{
- Q_DISABLE_COPY(QOpenGLVertexArrayObjectHelper)
-
-public:
- explicit inline QOpenGLVertexArrayObjectHelper(QOpenGLContext *context)
- : GenVertexArrays(nullptr)
- , DeleteVertexArrays(nullptr)
- , BindVertexArray(nullptr)
- , IsVertexArray(nullptr)
- {
- qtInitializeVertexArrayObjectHelper(this, context);
- }
-
- inline bool isValid() const
- {
- return GenVertexArrays && DeleteVertexArrays && BindVertexArray && IsVertexArray;
- }
-
- inline void glGenVertexArrays(GLsizei n, GLuint *arrays) const
- {
- GenVertexArrays(n, arrays);
- }
-
- inline void glDeleteVertexArrays(GLsizei n, const GLuint *arrays) const
- {
- DeleteVertexArrays(n, arrays);
- }
-
- inline void glBindVertexArray(GLuint array) const
- {
- BindVertexArray(array);
- }
-
- inline GLboolean glIsVertexArray(GLuint array) const
- {
- return IsVertexArray(array);
- }
-
-private:
- friend void Q_GUI_EXPORT qtInitializeVertexArrayObjectHelper(QOpenGLVertexArrayObjectHelper *helper, QOpenGLContext *context);
-
- // Function signatures are equivalent between desktop core, ARB, APPLE, ES 3 and ES 2 extensions
- typedef void (QOPENGLF_APIENTRYP qt_GenVertexArrays_t)(GLsizei n, GLuint *arrays);
- typedef void (QOPENGLF_APIENTRYP qt_DeleteVertexArrays_t)(GLsizei n, const GLuint *arrays);
- typedef void (QOPENGLF_APIENTRYP qt_BindVertexArray_t)(GLuint array);
- typedef GLboolean (QOPENGLF_APIENTRYP qt_IsVertexArray_t)(GLuint array);
-
- qt_GenVertexArrays_t GenVertexArrays;
- qt_DeleteVertexArrays_t DeleteVertexArrays;
- qt_BindVertexArray_t BindVertexArray;
- qt_IsVertexArray_t IsVertexArray;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-
-#endif // QOPENGLVERTEXARRAYOBJECT_P_H
diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri
index 94a88f55dc..4d32c592d1 100644
--- a/src/gui/painting/painting.pri
+++ b/src/gui/painting/painting.pri
@@ -26,7 +26,6 @@ HEADERS += \
painting/qfixed_p.h \
painting/qgrayraster_p.h \
painting/qicc_p.h \
- painting/qmatrix.h \
painting/qmemrotate_p.h \
painting/qoutlinemapper_p.h \
painting/qpagedpaintdevice.h \
@@ -50,6 +49,8 @@ HEADERS += \
painting/qpen.h \
painting/qpolygon.h \
painting/qpolygonclipper_p.h \
+ painting/qrangecollection.h \
+ painting/qrangecollection_p.h \
painting/qrasterdefs_p.h \
painting/qrasterizer_p.h \
painting/qrbtree_p.h \
@@ -83,7 +84,6 @@ SOURCES += \
painting/qgrayraster.c \
painting/qicc.cpp \
painting/qimagescale.cpp \
- painting/qmatrix.cpp \
painting/qmemrotate.cpp \
painting/qoutlinemapper.cpp \
painting/qpagedpaintdevice.cpp \
@@ -101,6 +101,7 @@ SOURCES += \
painting/qpdfwriter.cpp \
painting/qpen.cpp \
painting/qpolygon.cpp \
+ painting/qrangecollection.cpp \
painting/qrasterizer.cpp \
painting/qregion.cpp \
painting/qstroker.cpp \
diff --git a/src/gui/painting/qbackingstore.cpp b/src/gui/painting/qbackingstore.cpp
index 2147d9d61d..5bbc03db80 100644
--- a/src/gui/painting/qbackingstore.cpp
+++ b/src/gui/painting/qbackingstore.cpp
@@ -322,7 +322,7 @@ void Q_GUI_EXPORT qt_scrollRectInImage(QImage &img, const QRect &rect, const QPo
// make sure we don't detach
uchar *mem = const_cast<uchar*>(const_cast<const QImage &>(img).bits());
- int lineskip = img.bytesPerLine();
+ qsizetype lineskip = img.bytesPerLine();
int depth = img.depth() >> 3;
const QRect imageRect(0, 0, img.width(), img.height());
diff --git a/src/gui/painting/qbrush.cpp b/src/gui/painting/qbrush.cpp
index 28cc20bfc5..c8fc447446 100644
--- a/src/gui/painting/qbrush.cpp
+++ b/src/gui/painting/qbrush.cpp
@@ -892,26 +892,6 @@ bool QBrush::isOpaque() const
return false;
}
-
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \since 4.2
- \obsolete
-
- Use setTransform() instead.
-
- Sets \a matrix as an explicit transformation matrix on the
- current brush. The brush transformation matrix is merged with
- QPainter transformation matrix to produce the final result.
-
- \sa matrix()
-*/
-void QBrush::setMatrix(const QMatrix &matrix)
-{
- setTransform(QTransform(matrix));
-}
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
/*!
\since 4.3
diff --git a/src/gui/painting/qbrush.h b/src/gui/painting/qbrush.h
index 3a01248c57..621387615b 100644
--- a/src/gui/painting/qbrush.h
+++ b/src/gui/painting/qbrush.h
@@ -46,7 +46,6 @@
#include <QtCore/qvector.h>
#include <QtCore/qscopedpointer.h>
#include <QtGui/qcolor.h>
-#include <QtGui/qmatrix.h>
#include <QtGui/qtransform.h>
#include <QtGui/qimage.h>
#include <QtGui/qpixmap.h>
@@ -89,11 +88,6 @@ public:
inline Qt::BrushStyle style() const;
void setStyle(Qt::BrushStyle);
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_X("Use transform()") inline const QMatrix &matrix() const;
- QT_DEPRECATED_X("Use setTransform()") void setMatrix(const QMatrix &mat);
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
inline QTransform transform() const;
void setTransform(const QTransform &);
@@ -159,10 +153,6 @@ struct QBrushData
inline Qt::BrushStyle QBrush::style() const { return d->style; }
inline const QColor &QBrush::color() const { return d->color; }
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_DEPRECATED_X("Use transform()")
-inline const QMatrix &QBrush::matrix() const { return d->transform.toAffine(); }
-#endif // QT_DEPRECATED_SINCE(5, 15)
inline QTransform QBrush::transform() const { return d->transform; }
inline bool QBrush::isDetached() const { return d->ref.loadRelaxed() == 1; }
diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp
index f15f6aeebd..eac2a50c8c 100644
--- a/src/gui/painting/qcolor.cpp
+++ b/src/gui/painting/qcolor.cpp
@@ -855,18 +855,6 @@ QColor::QColor(Spec spec) noexcept
*/
/*!
- Returns the name of the color in the format "#RRGGBB"; i.e. a "#"
- character followed by three two-digit hexadecimal numbers.
-
- \sa setNamedColor()
-*/
-
-QString QColor::name() const
-{
- return name(HexRgb);
-}
-
-/*!
\since 5.2
Returns the name of the color in the specified \a format.
@@ -1086,6 +1074,7 @@ void QColor::setHsvF(qreal h, qreal s, qreal v, qreal a)
|| (v < qreal(0.0) || v > qreal(1.0))
|| (a < qreal(0.0) || a > qreal(1.0))) {
qWarning("QColor::setHsvF: HSV parameters out of range");
+ invalidate();
return;
}
@@ -1198,7 +1187,8 @@ void QColor::setHslF(qreal h, qreal s, qreal l, qreal a)
|| (s < qreal(0.0) || s > qreal(1.0))
|| (l < qreal(0.0) || l > qreal(1.0))
|| (a < qreal(0.0) || a > qreal(1.0))) {
- qWarning("QColor::setHsvF: HSV parameters out of range");
+ qWarning("QColor::setHslF: HSL parameters out of range");
+ invalidate();
return;
}
@@ -1224,7 +1214,7 @@ void QColor::setHslF(qreal h, qreal s, qreal l, qreal a)
void QColor::setHsl(int h, int s, int l, int a)
{
if (h < -1 || (uint)s > 255 || (uint)l > 255 || (uint)a > 255) {
- qWarning("QColor::setHsv: HSV parameters out of range");
+ qWarning("QColor::setHsl: HSL parameters out of range");
invalidate();
return;
}
@@ -2626,16 +2616,6 @@ QColor QColor::fromHslF(qreal h, qreal s, qreal l, qreal a)
}
/*!
- \obsolete
-
- Use the \c const overload instead.
-*/
-void QColor::getCmyk(int *c, int *m, int *y, int *k, int *a)
-{
- const_cast<const QColor *>(this)->getCmyk(c, m, y, k, a);
-}
-
-/*!
Sets the contents pointed to by \a c, \a m, \a y, \a k, and \a a, to the
cyan, magenta, yellow, black, and alpha-channel (transparency) components
of the color's CMYK value.
@@ -2665,16 +2645,6 @@ void QColor::getCmyk(int *c, int *m, int *y, int *k, int *a) const
}
/*!
- \obsolete
-
- Use the \c const overload instead.
-*/
-void QColor::getCmykF(qreal *c, qreal *m, qreal *y, qreal *k, qreal *a)
-{
- const_cast<const QColor *>(this)->getCmykF(c, m, y, k, a);
-}
-
-/*!
Sets the contents pointed to by \a c, \a m, \a y, \a k, and \a a, to the
cyan, magenta, yellow, black, and alpha-channel (transparency) components
of the color's CMYK value.
@@ -2719,6 +2689,7 @@ void QColor::setCmyk(int c, int m, int y, int k, int a)
|| k < 0 || k > 255
|| a < 0 || a > 255) {
qWarning("QColor::setCmyk: CMYK parameters out of range");
+ invalidate();
return;
}
@@ -2748,6 +2719,7 @@ void QColor::setCmykF(qreal c, qreal m, qreal y, qreal k, qreal a)
|| k < qreal(0.0) || k > qreal(1.0)
|| a < qreal(0.0) || a > qreal(1.0)) {
qWarning("QColor::setCmykF: CMYK parameters out of range");
+ invalidate();
return;
}
@@ -2920,18 +2892,6 @@ QColor QColor::dark(int factor) const noexcept
}
#endif
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
-/*!
- Assigns a copy of \a color to this color, and returns a reference to it.
-*/
-QColor &QColor::operator=(const QColor &color) noexcept
-{
- cspec = color.cspec;
- ct.argb = color.ct.argb;
- return *this;
-}
-#endif
-
/*! \overload
Assigns a copy of \a color and returns a reference to this color.
*/
diff --git a/src/gui/painting/qcolor.h b/src/gui/painting/qcolor.h
index 0189f4e5f1..ad624e6b60 100644
--- a/src/gui/painting/qcolor.h
+++ b/src/gui/painting/qcolor.h
@@ -46,6 +46,8 @@
#include <QtCore/qstringlist.h>
#include <QtGui/qrgba64.h>
+#include <limits.h>
+
QT_BEGIN_NAMESPACE
@@ -87,24 +89,11 @@ public:
inline QColor(QLatin1String name);
QColor(Spec spec) noexcept;
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
- // ### Qt 6: remove all of these, the trivial ones are fine.
- Q_DECL_CONSTEXPR QColor(const QColor &color) noexcept
- : cspec(color.cspec), ct(color.ct)
- {}
- Q_DECL_CONSTEXPR QColor(QColor &&other) noexcept : cspec(other.cspec), ct(other.ct) {}
- QColor &operator=(QColor &&other) noexcept
- { cspec = other.cspec; ct = other.ct; return *this; }
- QColor &operator=(const QColor &) noexcept;
-#endif // Qt < 6
-
QColor &operator=(Qt::GlobalColor color) noexcept;
bool isValid() const noexcept;
- // ### Qt 6: merge overloads
- QString name() const;
- QString name(NameFormat format) const;
+ QString name(NameFormat format = HexRgb) const;
#if QT_STRINGVIEW_LEVEL < 2
void setNamedColor(const QString& name);
@@ -180,11 +169,9 @@ public:
qreal yellowF() const noexcept;
qreal blackF() const noexcept;
- void getCmyk(int *c, int *m, int *y, int *k, int *a = nullptr); // ### Qt 6: remove
void getCmyk(int *c, int *m, int *y, int *k, int *a = nullptr) const;
void setCmyk(int c, int m, int y, int k, int a = 255);
- void getCmykF(qreal *c, qreal *m, qreal *y, qreal *k, qreal *a = nullptr); // ### Qt 6: remove
void getCmykF(qreal *c, qreal *m, qreal *y, qreal *k, qreal *a = nullptr) const;
void setCmykF(qreal c, qreal m, qreal y, qreal k, qreal a = 1.0);
diff --git a/src/gui/painting/qcolormatrix_p.h b/src/gui/painting/qcolormatrix_p.h
index edb2d32258..749aad3b2c 100644
--- a/src/gui/painting/qcolormatrix_p.h
+++ b/src/gui/painting/qcolormatrix_p.h
@@ -112,7 +112,7 @@ inline bool operator!=(const QColorVector &v1, const QColorVector &v2)
// A matrix mapping 3 value colors.
-// Not using QMatrix because only floats are needed and performance is critical.
+// Not using QTransform because only floats are needed and performance is critical.
class QColorMatrix
{
public:
diff --git a/src/gui/painting/qcoregraphics.mm b/src/gui/painting/qcoregraphics.mm
index 94ba004c93..1125a9183c 100644
--- a/src/gui/painting/qcoregraphics.mm
+++ b/src/gui/painting/qcoregraphics.mm
@@ -240,18 +240,33 @@ QColor qt_mac_toQColor(CGColorRef color)
QColor qt_mac_toQColor(const NSColor *color)
{
QColor qtColor;
- NSString *colorSpace = [color colorSpaceName];
- if (colorSpace == NSDeviceCMYKColorSpace) {
- CGFloat cyan, magenta, yellow, black, alpha;
- [color getCyan:&cyan magenta:&magenta yellow:&yellow black:&black alpha:&alpha];
- qtColor.setCmykF(cyan, magenta, yellow, black, alpha);
- } else {
- NSColor *tmpColor;
- tmpColor = [color colorUsingColorSpaceName:NSDeviceRGBColorSpace];
- CGFloat red, green, blue, alpha;
+ switch (color.type) {
+ case NSColorTypeComponentBased: {
+ const NSColorSpace *colorSpace = [color colorSpace];
+ if (colorSpace == NSColorSpace.genericRGBColorSpace
+ && color.numberOfComponents == 4) { // rbga
+ CGFloat components[4];
+ [color getComponents:components];
+ qtColor.setRgbF(components[0], components[1], components[2], components[3]);
+ break;
+ } else if (colorSpace == NSColorSpace.genericCMYKColorSpace
+ && color.numberOfComponents == 5) { // cmyk + alpha
+ CGFloat components[5];
+ [color getComponents:components];
+ qtColor.setCmykF(components[0], components[1], components[2], components[3], components[4]);
+ break;
+ }
+ }
+ Q_FALLTHROUGH();
+ default: {
+ const NSColor *tmpColor = [color colorUsingColorSpace:NSColorSpace.genericRGBColorSpace];
+ CGFloat red = 0, green = 0, blue = 0, alpha = 0;
[tmpColor getRed:&red green:&green blue:&blue alpha:&alpha];
qtColor.setRgbF(red, green, blue, alpha);
+ break;
+ }
}
+
return qtColor;
}
#endif
@@ -277,9 +292,9 @@ static bool qt_mac_isSystemColorOrInstance(const NSColor *color, NSString *color
// We specifically do not want isKindOfClass: here
if ([color.className isEqualToString:className]) // NSPatternColorSpace
return true;
- if ([color.catalogNameComponent isEqualToString:@"System"] &&
- [color.colorNameComponent isEqualToString:colorNameComponent] &&
- [color.colorSpaceName isEqualToString:NSNamedColorSpace])
+ if (color.type == NSColorTypeCatalog &&
+ [color.catalogNameComponent isEqualToString:@"System"] &&
+ [color.colorNameComponent isEqualToString:colorNameComponent])
return true;
return false;
}
@@ -335,8 +350,8 @@ QBrush qt_mac_toQBrush(const NSColor *color, QPalette::ColorGroup colorGroup)
return qtBrush;
}
- if (NSColor *patternColor = [color colorUsingColorSpaceName:NSPatternColorSpace]) {
- NSImage *patternImage = patternColor.patternImage;
+ if (color.type == NSColorTypePattern) {
+ NSImage *patternImage = color.patternImage;
const QSizeF sz(patternImage.size.width, patternImage.size.height);
// FIXME: QBrush is not resolution independent (QTBUG-49774)
qtBrush.setTexture(qt_mac_toQPixmap(patternImage, sz));
diff --git a/src/gui/painting/qdatabuffer_p.h b/src/gui/painting/qdatabuffer_p.h
index 181d19da0b..676750b716 100644
--- a/src/gui/painting/qdatabuffer_p.h
+++ b/src/gui/painting/qdatabuffer_p.h
@@ -116,7 +116,7 @@ public:
capacity = 1;
while (capacity < size)
capacity *= 2;
- buffer = (Type*) realloc(buffer, capacity * sizeof(Type));
+ buffer = (Type*) realloc(static_cast<void*>(buffer), capacity * sizeof(Type));
Q_CHECK_PTR(buffer);
}
}
@@ -124,7 +124,7 @@ public:
inline void shrink(int size) {
capacity = size;
if (size) {
- buffer = (Type*) realloc(buffer, capacity * sizeof(Type));
+ buffer = (Type*) realloc(static_cast<void*>(buffer), capacity * sizeof(Type));
Q_CHECK_PTR(buffer);
} else {
free(buffer);
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index f153557077..abf13d5953 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -2842,15 +2842,15 @@ static void QT_FASTCALL fetchTransformedBilinearARGB32PM_fast_rotate_helper(uint
fy += fdy;
++b;
}
- uint *boundedEnd = end; \
- if (fdx > 0) \
- boundedEnd = qMin(boundedEnd, b + (max_fx - fx) / fdx); \
- else if (fdx < 0) \
- boundedEnd = qMin(boundedEnd, b + (min_fx - fx) / fdx); \
- if (fdy > 0) \
- boundedEnd = qMin(boundedEnd, b + (max_fy - fy) / fdy); \
- else if (fdy < 0) \
- boundedEnd = qMin(boundedEnd, b + (min_fy - fy) / fdy); \
+ uint *boundedEnd = end;
+ if (fdx > 0)
+ boundedEnd = qMin(boundedEnd, b + (max_fx - fx) / fdx);
+ else if (fdx < 0)
+ boundedEnd = qMin(boundedEnd, b + (min_fx - fx) / fdx);
+ if (fdy > 0)
+ boundedEnd = qMin(boundedEnd, b + (max_fy - fy) / fdy);
+ else if (fdy < 0)
+ boundedEnd = qMin(boundedEnd, b + (min_fy - fy) / fdy);
// until boundedEnd we can now have a fast middle part without boundary checks
#if defined(__SSE2__)
@@ -2906,7 +2906,7 @@ static void QT_FASTCALL fetchTransformedBilinearARGB32PM_fast_rotate_helper(uint
int32x4_t v_fdy = vdupq_n_s32(fdy * 4);
const uchar *textureData = image.imageData;
- const int bytesPerLine = image.bytesPerLine;
+ const qsizetype bytesPerLine = image.bytesPerLine;
int32x4_t v_fx = vmovq_n_s32(fx);
int32x4_t v_fy = vmovq_n_s32(fy);
diff --git a/src/gui/painting/qdrawhelper_ssse3.cpp b/src/gui/painting/qdrawhelper_ssse3.cpp
index 14d7047bb6..a175b591dd 100644
--- a/src/gui/painting/qdrawhelper_ssse3.cpp
+++ b/src/gui/painting/qdrawhelper_ssse3.cpp
@@ -197,7 +197,7 @@ void qt_memfill24_ssse3(quint24 *dest, quint24 color, qsizetype count)
quint24 *end = dest + count;
constexpr uchar x = 2, y = 1, z = 0;
- Q_DECL_ALIGN(__m128i) static const uchar
+ alignas(__m128i) static const uchar
shuffleMask[16 + 1] = { x, y, z, x, y, z, x, y, z, x, y, z, x, y, z, x, y };
__m128i mval1 = _mm_shuffle_epi8(m, _mm_load_si128(reinterpret_cast<const __m128i *>(shuffleMask)));
diff --git a/src/gui/painting/qicc.cpp b/src/gui/painting/qicc.cpp
index 2b5cd58fb1..e2257c27da 100644
--- a/src/gui/painting/qicc.cpp
+++ b/src/gui/painting/qicc.cpp
@@ -136,7 +136,7 @@ enum class Tag : quint32 {
aabg = IccTag('a', 'a', 'b', 'g'),
};
-inline uint qHash(const Tag &key, uint seed = 0)
+inline size_t qHash(const Tag &key, size_t seed = 0)
{
return qHash(quint32(key), seed);
}
diff --git a/src/gui/painting/qmatrix.cpp b/src/gui/painting/qmatrix.cpp
deleted file mode 100644
index 7ebd2dbd09..0000000000
--- a/src/gui/painting/qmatrix.cpp
+++ /dev/null
@@ -1,1191 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qmatrix.h"
-
-#include "qdatastream.h"
-#include "qdebug.h"
-#include "qhashfunctions.h"
-#include "qregion.h"
-#include "qpainterpath.h"
-#include "qpainterpath_p.h"
-#include "qtransform.h"
-#include "qvariant.h"
-#include <qmath.h>
-
-#include <limits.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QMatrix
- \brief The QMatrix class specifies 2D transformations of a
- coordinate system.
- \obsolete
-
- \ingroup painting
- \inmodule QtGui
-
- A matrix specifies how to translate, scale, shear or rotate the
- coordinate system, and is typically used when rendering graphics.
- QMatrix, in contrast to QTransform, does not allow perspective
- transformations. QTransform is the recommended transformation
- class in Qt.
-
- A QMatrix object can be built using the setMatrix(), scale(),
- rotate(), translate() and shear() functions. Alternatively, it
- can be built by applying \l {QMatrix#Basic Matrix
- Operations}{basic matrix operations}. The matrix can also be
- defined when constructed, and it can be reset to the identity
- matrix (the default) using the reset() function.
-
- The QMatrix class supports mapping of graphic primitives: A given
- point, line, polygon, region, or painter path can be mapped to the
- coordinate system defined by \e this matrix using the map()
- function. In case of a rectangle, its coordinates can be
- transformed using the mapRect() function. A rectangle can also be
- transformed into a \e polygon (mapped to the coordinate system
- defined by \e this matrix), using the mapToPolygon() function.
-
- QMatrix provides the isIdentity() function which returns \c true if
- the matrix is the identity matrix, and the isInvertible() function
- which returns \c true if the matrix is non-singular (i.e. AB = BA =
- I). The inverted() function returns an inverted copy of \e this
- matrix if it is invertible (otherwise it returns the identity
- matrix). In addition, QMatrix provides the determinant() function
- returning the matrix's determinant.
-
- Finally, the QMatrix class supports matrix multiplication, and
- objects of the class can be streamed as well as compared.
-
- \tableofcontents
-
- \section1 Rendering Graphics
-
- When rendering graphics, the matrix defines the transformations
- but the actual transformation is performed by the drawing routines
- in QPainter.
-
- By default, QPainter operates on the associated device's own
- coordinate system. The standard coordinate system of a
- QPaintDevice has its origin located at the top-left position. The
- \e x values increase to the right; \e y values increase
- downward. For a complete description, see the \l {Coordinate
- System}{coordinate system} documentation.
-
- QPainter has functions to translate, scale, shear and rotate the
- coordinate system without using a QMatrix. For example:
-
- \table 100%
- \row
- \li \inlineimage qmatrix-simpletransformation.png
- \li
- \snippet matrix/matrix.cpp 0
- \endtable
-
- Although these functions are very convenient, it can be more
- efficient to build a QMatrix and call QPainter::setMatrix() if you
- want to perform more than a single transform operation. For
- example:
-
- \table 100%
- \row
- \li \inlineimage qmatrix-combinedtransformation.png
- \li
- \snippet matrix/matrix.cpp 1
- \endtable
-
- \section1 Basic Matrix Operations
-
- \image qmatrix-representation.png
-
- A QMatrix object contains a 3 x 3 matrix. The \c dx and \c dy
- elements specify horizontal and vertical translation. The \c m11
- and \c m22 elements specify horizontal and vertical scaling. And
- finally, the \c m21 and \c m12 elements specify horizontal and
- vertical \e shearing.
-
- QMatrix transforms a point in the plane to another point using the
- following formulas:
-
- \snippet code/src_gui_painting_qmatrix.cpp 0
-
- The point \e (x, y) is the original point, and \e (x', y') is the
- transformed point. \e (x', y') can be transformed back to \e (x,
- y) by performing the same operation on the inverted() matrix.
-
- The various matrix elements can be set when constructing the
- matrix, or by using the setMatrix() function later on. They can also
- be manipulated using the translate(), rotate(), scale() and
- shear() convenience functions, The currently set values can be
- retrieved using the m11(), m12(), m21(), m22(), dx() and dy()
- functions.
-
- Translation is the simplest transformation. Setting \c dx and \c
- dy will move the coordinate system \c dx units along the X axis
- and \c dy units along the Y axis. Scaling can be done by setting
- \c m11 and \c m22. For example, setting \c m11 to 2 and \c m22 to
- 1.5 will double the height and increase the width by 50%. The
- identity matrix has \c m11 and \c m22 set to 1 (all others are set
- to 0) mapping a point to itself. Shearing is controlled by \c m12
- and \c m21. Setting these elements to values different from zero
- will twist the coordinate system. Rotation is achieved by
- carefully setting both the shearing factors and the scaling
- factors.
-
- Here's the combined transformations example using basic matrix
- operations:
-
- \table 100%
- \row
- \li \inlineimage qmatrix-combinedtransformation.png
- \li
- \snippet matrix/matrix.cpp 2
- \endtable
-
- \sa QPainter, QTransform, {Coordinate System},
- {painting/affine}{Affine Transformations Example}, {Transformations Example}
-*/
-
-
-// some defines to inline some code
-#define MAPDOUBLE(x, y, nx, ny) \
-{ \
- qreal fx = x; \
- qreal fy = y; \
- nx = _m11*fx + _m21*fy + _dx; \
- ny = _m12*fx + _m22*fy + _dy; \
-}
-
-#define MAPINT(x, y, nx, ny) \
-{ \
- qreal fx = x; \
- qreal fy = y; \
- nx = qRound(_m11*fx + _m21*fy + _dx); \
- ny = qRound(_m12*fx + _m22*fy + _dy); \
-}
-
-/*****************************************************************************
- QMatrix member functions
- *****************************************************************************/
-/*!
- \fn QMatrix::QMatrix(Qt::Initialization)
- \internal
-*/
-
-/*!
- Constructs an identity matrix.
-
- All elements are set to zero except \c m11 and \c m22 (specifying
- the scale), which are set to 1.
-
- \sa reset()
-*/
-
-QMatrix::QMatrix()
- : _m11(1.)
- , _m12(0.)
- , _m21(0.)
- , _m22(1.)
- , _dx(0.)
- , _dy(0.)
-{
-}
-
-/*!
- Constructs a matrix with the elements, \a m11, \a m12, \a m21, \a
- m22, \a dx and \a dy.
-
- \sa setMatrix()
-*/
-
-QMatrix::QMatrix(qreal m11, qreal m12, qreal m21, qreal m22, qreal dx, qreal dy)
- : _m11(m11)
- , _m12(m12)
- , _m21(m21)
- , _m22(m22)
- , _dx(dx)
- , _dy(dy)
-{
-}
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-/*!
- Constructs a matrix that is a copy of the given \a matrix.
- */
-QMatrix::QMatrix(const QMatrix &matrix) noexcept
- : _m11(matrix._m11)
- , _m12(matrix._m12)
- , _m21(matrix._m21)
- , _m22(matrix._m22)
- , _dx(matrix._dx)
- , _dy(matrix._dy)
-{
-}
-#endif
-
-/*!
- Sets the matrix elements to the specified values, \a m11, \a m12,
- \a m21, \a m22, \a dx and \a dy.
-
- Note that this function replaces the previous values. QMatrix
- provide the translate(), rotate(), scale() and shear() convenience
- functions to manipulate the various matrix elements based on the
- currently defined coordinate system.
-
- \sa QMatrix()
-*/
-
-void QMatrix::setMatrix(qreal m11, qreal m12, qreal m21, qreal m22, qreal dx, qreal dy)
-{
- _m11 = m11;
- _m12 = m12;
- _m21 = m21;
- _m22 = m22;
- _dx = dx;
- _dy = dy;
-}
-
-
-/*!
- \fn qreal QMatrix::m11() const
-
- Returns the horizontal scaling factor.
-
- \sa scale(), {QMatrix#Basic Matrix Operations}{Basic Matrix
- Operations}
-*/
-
-/*!
- \fn qreal QMatrix::m12() const
-
- Returns the vertical shearing factor.
-
- \sa shear(), {QMatrix#Basic Matrix Operations}{Basic Matrix
- Operations}
-*/
-
-/*!
- \fn qreal QMatrix::m21() const
-
- Returns the horizontal shearing factor.
-
- \sa shear(), {QMatrix#Basic Matrix Operations}{Basic Matrix
- Operations}
-*/
-
-/*!
- \fn qreal QMatrix::m22() const
-
- Returns the vertical scaling factor.
-
- \sa scale(), {QMatrix#Basic Matrix Operations}{Basic Matrix
- Operations}
-*/
-
-/*!
- \fn qreal QMatrix::dx() const
-
- Returns the horizontal translation factor.
-
- \sa translate(), {QMatrix#Basic Matrix Operations}{Basic Matrix
- Operations}
-*/
-
-/*!
- \fn qreal QMatrix::dy() const
-
- Returns the vertical translation factor.
-
- \sa translate(), {QMatrix#Basic Matrix Operations}{Basic Matrix
- Operations}
-*/
-
-
-/*!
- Maps the given coordinates \a x and \a y into the coordinate
- system defined by this matrix. The resulting values are put in *\a
- tx and *\a ty, respectively.
-
- The coordinates are transformed using the following formulas:
-
- \snippet code/src_gui_painting_qmatrix.cpp 1
-
- The point (x, y) is the original point, and (x', y') is the
- transformed point.
-
- \sa {QMatrix#Basic Matrix Operations}{Basic Matrix Operations}
-*/
-
-void QMatrix::map(qreal x, qreal y, qreal *tx, qreal *ty) const
-{
- MAPDOUBLE(x, y, *tx, *ty);
-}
-
-
-
-/*!
- \overload
-
- Maps the given coordinates \a x and \a y into the coordinate
- system defined by this matrix. The resulting values are put in *\a
- tx and *\a ty, respectively. Note that the transformed coordinates
- are rounded to the nearest integer.
-*/
-
-void QMatrix::map(int x, int y, int *tx, int *ty) const
-{
- MAPINT(x, y, *tx, *ty);
-}
-
-QRect QMatrix::mapRect(const QRect &rect) const
-{
- QRect result;
- if (_m12 == 0.0F && _m21 == 0.0F) {
- int x = qRound(_m11*rect.x() + _dx);
- int y = qRound(_m22*rect.y() + _dy);
- int w = qRound(_m11*rect.width());
- int h = qRound(_m22*rect.height());
- if (w < 0) {
- w = -w;
- x -= w;
- }
- if (h < 0) {
- h = -h;
- y -= h;
- }
- result = QRect(x, y, w, h);
- } else {
- // see mapToPolygon for explanations of the algorithm.
- qreal x0, y0;
- qreal x, y;
- MAPDOUBLE(rect.left(), rect.top(), x0, y0);
- qreal xmin = x0;
- qreal ymin = y0;
- qreal xmax = x0;
- qreal ymax = y0;
- MAPDOUBLE(rect.right() + 1, rect.top(), x, y);
- xmin = qMin(xmin, x);
- ymin = qMin(ymin, y);
- xmax = qMax(xmax, x);
- ymax = qMax(ymax, y);
- MAPDOUBLE(rect.right() + 1, rect.bottom() + 1, x, y);
- xmin = qMin(xmin, x);
- ymin = qMin(ymin, y);
- xmax = qMax(xmax, x);
- ymax = qMax(ymax, y);
- MAPDOUBLE(rect.left(), rect.bottom() + 1, x, y);
- xmin = qMin(xmin, x);
- ymin = qMin(ymin, y);
- xmax = qMax(xmax, x);
- ymax = qMax(ymax, y);
- result = QRect(qRound(xmin), qRound(ymin), qRound(xmax)-qRound(xmin), qRound(ymax)-qRound(ymin));
- }
- return result;
-}
-
-/*!
- \fn QRectF QMatrix::mapRect(const QRectF &rectangle) const
-
- Creates and returns a QRectF object that is a copy of the given \a
- rectangle, mapped into the coordinate system defined by this
- matrix.
-
- The rectangle's coordinates are transformed using the following
- formulas:
-
- \snippet code/src_gui_painting_qmatrix.cpp 2
-
- If rotation or shearing has been specified, this function returns
- the \e bounding rectangle. To retrieve the exact region the given
- \a rectangle maps to, use the mapToPolygon() function instead.
-
- \sa mapToPolygon(), {QMatrix#Basic Matrix Operations}{Basic Matrix
- Operations}
-*/
-QRectF QMatrix::mapRect(const QRectF &rect) const
-{
- QRectF result;
- if (_m12 == 0.0F && _m21 == 0.0F) {
- qreal x = _m11*rect.x() + _dx;
- qreal y = _m22*rect.y() + _dy;
- qreal w = _m11*rect.width();
- qreal h = _m22*rect.height();
- if (w < 0) {
- w = -w;
- x -= w;
- }
- if (h < 0) {
- h = -h;
- y -= h;
- }
- result = QRectF(x, y, w, h);
- } else {
- qreal x0, y0;
- qreal x, y;
- MAPDOUBLE(rect.x(), rect.y(), x0, y0);
- qreal xmin = x0;
- qreal ymin = y0;
- qreal xmax = x0;
- qreal ymax = y0;
- MAPDOUBLE(rect.x() + rect.width(), rect.y(), x, y);
- xmin = qMin(xmin, x);
- ymin = qMin(ymin, y);
- xmax = qMax(xmax, x);
- ymax = qMax(ymax, y);
- MAPDOUBLE(rect.x() + rect.width(), rect.y() + rect.height(), x, y);
- xmin = qMin(xmin, x);
- ymin = qMin(ymin, y);
- xmax = qMax(xmax, x);
- ymax = qMax(ymax, y);
- MAPDOUBLE(rect.x(), rect.y() + rect.height(), x, y);
- xmin = qMin(xmin, x);
- ymin = qMin(ymin, y);
- xmax = qMax(xmax, x);
- ymax = qMax(ymax, y);
- result = QRectF(xmin, ymin, xmax-xmin, ymax - ymin);
- }
- return result;
-}
-
-/*!
- \fn QRect QMatrix::mapRect(const QRect &rectangle) const
- \overload
-
- Creates and returns a QRect object that is a copy of the given \a
- rectangle, mapped into the coordinate system defined by this
- matrix. Note that the transformed coordinates are rounded to the
- nearest integer.
-*/
-
-
-/*!
- \fn QPoint operator*(const QPoint &point, const QMatrix &matrix)
- \relates QMatrix
-
- This is the same as \a{matrix}.map(\a{point}).
-
- \sa QMatrix::map()
-*/
-
-QPoint QMatrix::map(const QPoint &p) const
-{
- qreal fx = p.x();
- qreal fy = p.y();
- return QPoint(qRound(_m11*fx + _m21*fy + _dx),
- qRound(_m12*fx + _m22*fy + _dy));
-}
-
-/*!
- \fn QPointF operator*(const QPointF &point, const QMatrix &matrix)
- \relates QMatrix
-
- Same as \a{matrix}.map(\a{point}).
-
- \sa QMatrix::map()
-*/
-
-/*!
- \overload
-
- Creates and returns a QPointF object that is a copy of the given
- \a point, mapped into the coordinate system defined by this
- matrix.
-*/
-QPointF QMatrix::map(const QPointF &point) const
-{
- qreal fx = point.x();
- qreal fy = point.y();
- return QPointF(_m11*fx + _m21*fy + _dx, _m12*fx + _m22*fy + _dy);
-}
-
-/*!
- \fn QPoint QMatrix::map(const QPoint &point) const
- \overload
-
- Creates and returns a QPoint object that is a copy of the given \a
- point, mapped into the coordinate system defined by this
- matrix. Note that the transformed coordinates are rounded to the
- nearest integer.
-*/
-
-/*!
- \fn QLineF operator*(const QLineF &line, const QMatrix &matrix)
- \relates QMatrix
-
- This is the same as \a{matrix}.map(\a{line}).
-
- \sa QMatrix::map()
-*/
-
-/*!
- \fn QLine operator*(const QLine &line, const QMatrix &matrix)
- \relates QMatrix
-
- This is the same as \a{matrix}.map(\a{line}).
-
- \sa QMatrix::map()
-*/
-
-/*!
- \overload
-
- Creates and returns a QLineF object that is a copy of the given \a
- line, mapped into the coordinate system defined by this matrix.
-*/
-QLineF QMatrix::map(const QLineF &line) const
-{
- return QLineF(map(line.p1()), map(line.p2()));
-}
-
-/*!
- \overload
-
- Creates and returns a QLine object that is a copy of the given \a
- line, mapped into the coordinate system defined by this matrix.
- Note that the transformed coordinates are rounded to the nearest
- integer.
-*/
-QLine QMatrix::map(const QLine &line) const
-{
- return QLine(map(line.p1()), map(line.p2()));
-}
-
-/*!
- \fn QPolygonF operator *(const QPolygonF &polygon, const QMatrix &matrix)
- \relates QMatrix
-
- This is the same as \a{matrix}.map(\a{polygon}).
-
- \sa QMatrix::map()
-*/
-
-/*!
- \fn QPolygon operator*(const QPolygon &polygon, const QMatrix &matrix)
- \relates QMatrix
-
- This is the same as \a{matrix}.map(\a{polygon}).
-
- \sa QMatrix::map()
-*/
-
-QPolygon QMatrix::map(const QPolygon &a) const
-{
- int size = a.size();
- int i;
- QPolygon p(size);
- const QPoint *da = a.constData();
- QPoint *dp = p.data();
- for(i = 0; i < size; i++) {
- MAPINT(da[i].x(), da[i].y(), dp[i].rx(), dp[i].ry());
- }
- return p;
-}
-
-/*!
- \fn QPolygonF QMatrix::map(const QPolygonF &polygon) const
- \overload
-
- Creates and returns a QPolygonF object that is a copy of the given
- \a polygon, mapped into the coordinate system defined by this
- matrix.
-*/
-QPolygonF QMatrix::map(const QPolygonF &a) const
-{
- int size = a.size();
- int i;
- QPolygonF p(size);
- const QPointF *da = a.constData();
- QPointF *dp = p.data();
- for(i = 0; i < size; i++) {
- MAPDOUBLE(da[i].xp, da[i].yp, dp[i].xp, dp[i].yp);
- }
- return p;
-}
-
-/*!
- \fn QPolygon QMatrix::map(const QPolygon &polygon) const
- \overload
-
- Creates and returns a QPolygon object that is a copy of the given
- \a polygon, mapped into the coordinate system defined by this
- matrix. Note that the transformed coordinates are rounded to the
- nearest integer.
-*/
-
-/*!
- \fn QRegion operator*(const QRegion &region, const QMatrix &matrix)
- \relates QMatrix
-
- This is the same as \a{matrix}.map(\a{region}).
-
- \sa QMatrix::map()
-*/
-
-extern QPainterPath qt_regionToPath(const QRegion &region);
-
-/*!
- \fn QRegion QMatrix::map(const QRegion &region) const
- \overload
-
- Creates and returns a QRegion object that is a copy of the given
- \a region, mapped into the coordinate system defined by this matrix.
-
- Calling this method can be rather expensive if rotations or
- shearing are used.
-*/
-QRegion QMatrix::map(const QRegion &r) const
-{
- if (_m11 == 1.0 && _m22 == 1.0 && _m12 == 0.0 && _m21 == 0.0) { // translate or identity
- if (_dx == 0.0 && _dy == 0.0) // Identity
- return r;
- QRegion copy(r);
- copy.translate(qRound(_dx), qRound(_dy));
- return copy;
- }
-
- QPainterPath p = map(qt_regionToPath(r));
- return p.toFillPolygon(QTransform()).toPolygon();
-}
-
-/*!
- \fn QPainterPath operator *(const QPainterPath &path, const QMatrix &matrix)
- \relates QMatrix
-
- This is the same as \a{matrix}.map(\a{path}).
-
- \sa QMatrix::map()
-*/
-
-/*!
- \overload
-
- Creates and returns a QPainterPath object that is a copy of the
- given \a path, mapped into the coordinate system defined by this
- matrix.
-*/
-QPainterPath QMatrix::map(const QPainterPath &path) const
-{
- if (path.isEmpty())
- return QPainterPath();
-
- QPainterPath copy = path;
-
- // Translate or identity
- if (_m11 == 1.0 && _m22 == 1.0 && _m12 == 0.0 && _m21 == 0.0) {
-
- // Translate
- if (_dx != 0.0 || _dy != 0.0) {
- copy.detach();
- for (int i=0; i<path.elementCount(); ++i) {
- QPainterPath::Element &e = copy.d_ptr->elements[i];
- e.x += _dx;
- e.y += _dy;
- }
- }
-
- // Full xform
- } else {
- copy.detach();
- for (int i=0; i<path.elementCount(); ++i) {
- QPainterPath::Element &e = copy.d_ptr->elements[i];
- qreal fx = e.x, fy = e.y;
- e.x = _m11*fx + _m21*fy + _dx;
- e.y = _m12*fx + _m22*fy + _dy;
- }
- }
-
- return copy;
-}
-
-/*!
- \fn QPolygon QMatrix::mapToPolygon(const QRect &rectangle) const
-
- Creates and returns a QPolygon representation of the given \a
- rectangle, mapped into the coordinate system defined by this
- matrix.
-
- The rectangle's coordinates are transformed using the following
- formulas:
-
- \snippet code/src_gui_painting_qmatrix.cpp 3
-
- Polygons and rectangles behave slightly differently when
- transformed (due to integer rounding), so
- \c{matrix.map(QPolygon(rectangle))} is not always the same as
- \c{matrix.mapToPolygon(rectangle)}.
-
- \sa mapRect(), {QMatrix#Basic Matrix Operations}{Basic Matrix
- Operations}
-*/
-QPolygon QMatrix::mapToPolygon(const QRect &rect) const
-{
- QPolygon a(4);
- qreal x[4], y[4];
- if (_m12 == 0.0F && _m21 == 0.0F) {
- x[0] = _m11*rect.x() + _dx;
- y[0] = _m22*rect.y() + _dy;
- qreal w = _m11*rect.width();
- qreal h = _m22*rect.height();
- if (w < 0) {
- w = -w;
- x[0] -= w;
- }
- if (h < 0) {
- h = -h;
- y[0] -= h;
- }
- x[1] = x[0]+w;
- x[2] = x[1];
- x[3] = x[0];
- y[1] = y[0];
- y[2] = y[0]+h;
- y[3] = y[2];
- } else {
- qreal right = rect.x() + rect.width();
- qreal bottom = rect.y() + rect.height();
- MAPDOUBLE(rect.x(), rect.y(), x[0], y[0]);
- MAPDOUBLE(right, rect.y(), x[1], y[1]);
- MAPDOUBLE(right, bottom, x[2], y[2]);
- MAPDOUBLE(rect.x(), bottom, x[3], y[3]);
- }
-#if 0
- int i;
- for(i = 0; i< 4; i++)
- qDebug("coords(%d) = (%f/%f) (%d/%d)", i, x[i], y[i], qRound(x[i]), qRound(y[i]));
- qDebug("width=%f, height=%f", qSqrt((x[1]-x[0])*(x[1]-x[0]) + (y[1]-y[0])*(y[1]-y[0])),
- qSqrt((x[0]-x[3])*(x[0]-x[3]) + (y[0]-y[3])*(y[0]-y[3])));
-#endif
- // all coordinates are correctly, tranform to a pointarray
- // (rounding to the next integer)
- a.setPoints(4, qRound(x[0]), qRound(y[0]),
- qRound(x[1]), qRound(y[1]),
- qRound(x[2]), qRound(y[2]),
- qRound(x[3]), qRound(y[3]));
- return a;
-}
-
-/*!
- Resets the matrix to an identity matrix, i.e. all elements are set
- to zero, except \c m11 and \c m22 (specifying the scale) which are
- set to 1.
-
- \sa QMatrix(), isIdentity(), {QMatrix#Basic Matrix
- Operations}{Basic Matrix Operations}
-*/
-
-void QMatrix::reset()
-{
- _m11 = _m22 = 1.0;
- _m12 = _m21 = _dx = _dy = 0.0;
-}
-
-/*!
- \fn bool QMatrix::isIdentity() const
-
- Returns \c true if the matrix is the identity matrix, otherwise
- returns \c false.
-
- \sa reset()
-*/
-
-/*!
- Moves the coordinate system \a dx along the x axis and \a dy along
- the y axis, and returns a reference to the matrix.
-
- \sa setMatrix()
-*/
-
-QMatrix &QMatrix::translate(qreal dx, qreal dy)
-{
- _dx += dx*_m11 + dy*_m21;
- _dy += dy*_m22 + dx*_m12;
- return *this;
-}
-
-/*!
- \fn QMatrix &QMatrix::scale(qreal sx, qreal sy)
-
- Scales the coordinate system by \a sx horizontally and \a sy
- vertically, and returns a reference to the matrix.
-
- \sa setMatrix()
-*/
-
-QMatrix &QMatrix::scale(qreal sx, qreal sy)
-{
- _m11 *= sx;
- _m12 *= sx;
- _m21 *= sy;
- _m22 *= sy;
- return *this;
-}
-
-/*!
- Shears the coordinate system by \a sh horizontally and \a sv
- vertically, and returns a reference to the matrix.
-
- \sa setMatrix()
-*/
-
-QMatrix &QMatrix::shear(qreal sh, qreal sv)
-{
- qreal tm11 = sv*_m21;
- qreal tm12 = sv*_m22;
- qreal tm21 = sh*_m11;
- qreal tm22 = sh*_m12;
- _m11 += tm11;
- _m12 += tm12;
- _m21 += tm21;
- _m22 += tm22;
- return *this;
-}
-
-const qreal deg2rad = qreal(0.017453292519943295769); // pi/180
-
-/*!
- \fn QMatrix &QMatrix::rotate(qreal degrees)
-
- Rotates the coordinate system the given \a degrees
- counterclockwise.
-
- Note that if you apply a QMatrix to a point defined in widget
- coordinates, the direction of the rotation will be clockwise
- because the y-axis points downwards.
-
- Returns a reference to the matrix.
-
- \sa setMatrix()
-*/
-
-QMatrix &QMatrix::rotate(qreal a)
-{
- qreal sina = 0;
- qreal cosa = 0;
- if (a == 90. || a == -270.)
- sina = 1.;
- else if (a == 270. || a == -90.)
- sina = -1.;
- else if (a == 180.)
- cosa = -1.;
- else{
- qreal b = deg2rad*a; // convert to radians
- sina = qSin(b); // fast and convenient
- cosa = qCos(b);
- }
- qreal tm11 = cosa*_m11 + sina*_m21;
- qreal tm12 = cosa*_m12 + sina*_m22;
- qreal tm21 = -sina*_m11 + cosa*_m21;
- qreal tm22 = -sina*_m12 + cosa*_m22;
- _m11 = tm11; _m12 = tm12;
- _m21 = tm21; _m22 = tm22;
- return *this;
-}
-
-/*!
- \fn bool QMatrix::isInvertible() const
-
- Returns \c true if the matrix is invertible, otherwise returns \c false.
-
- \sa inverted()
-*/
-
-/*!
- \since 4.6
- \fn qreal QMatrix::determinant() const
-
- Returns the matrix's determinant.
-*/
-
-/*!
- Returns an inverted copy of this matrix.
-
- If the matrix is singular (not invertible), the returned matrix is
- the identity matrix. If \a invertible is valid (i.e. not 0), its
- value is set to true if the matrix is invertible, otherwise it is
- set to false.
-
- \sa isInvertible()
-*/
-
-QMatrix QMatrix::inverted(bool *invertible) const
-{
- qreal dtr = determinant();
- if (dtr == 0.0) {
- if (invertible)
- *invertible = false; // singular matrix
- return QMatrix(true);
- }
- else { // invertible matrix
- if (invertible)
- *invertible = true;
- qreal dinv = 1.0/dtr;
- return QMatrix((_m22*dinv), (-_m12*dinv),
- (-_m21*dinv), (_m11*dinv),
- ((_m21*_dy - _m22*_dx)*dinv),
- ((_m12*_dx - _m11*_dy)*dinv),
- true);
- }
-}
-
-
-/*!
- \fn bool QMatrix::operator==(const QMatrix &matrix) const
-
- Returns \c true if this matrix is equal to the given \a matrix,
- otherwise returns \c false.
-*/
-
-bool QMatrix::operator==(const QMatrix &m) const
-{
- return _m11 == m._m11 &&
- _m12 == m._m12 &&
- _m21 == m._m21 &&
- _m22 == m._m22 &&
- _dx == m._dx &&
- _dy == m._dy;
-}
-
-
-/*!
- \since 5.6
- \relates QMatrix
-
- Returns the hash value for \a key, using
- \a seed to seed the calculation.
-*/
-uint qHash(const QMatrix &key, uint seed) noexcept
-{
- QtPrivate::QHashCombine hash;
- seed = hash(seed, key.m11());
- seed = hash(seed, key.m12());
- seed = hash(seed, key.m21());
- seed = hash(seed, key.m22());
- seed = hash(seed, key.dx());
- seed = hash(seed, key.dy());
- return seed;
-}
-
-/*!
- \fn bool QMatrix::operator!=(const QMatrix &matrix) const
-
- Returns \c true if this matrix is not equal to the given \a matrix,
- otherwise returns \c false.
-*/
-
-bool QMatrix::operator!=(const QMatrix &m) const
-{
- return _m11 != m._m11 ||
- _m12 != m._m12 ||
- _m21 != m._m21 ||
- _m22 != m._m22 ||
- _dx != m._dx ||
- _dy != m._dy;
-}
-
-/*!
- \fn QMatrix &QMatrix::operator *=(const QMatrix &matrix)
- \overload
-
- Returns the result of multiplying this matrix by the given \a
- matrix.
-*/
-
-QMatrix &QMatrix::operator *=(const QMatrix &m)
-{
- qreal tm11 = _m11*m._m11 + _m12*m._m21;
- qreal tm12 = _m11*m._m12 + _m12*m._m22;
- qreal tm21 = _m21*m._m11 + _m22*m._m21;
- qreal tm22 = _m21*m._m12 + _m22*m._m22;
-
- qreal tdx = _dx*m._m11 + _dy*m._m21 + m._dx;
- qreal tdy = _dx*m._m12 + _dy*m._m22 + m._dy;
-
- _m11 = tm11; _m12 = tm12;
- _m21 = tm21; _m22 = tm22;
- _dx = tdx; _dy = tdy;
- return *this;
-}
-
-/*!
- \fn QMatrix QMatrix::operator *(const QMatrix &matrix) const
-
- Returns the result of multiplying this matrix by the given \a
- matrix.
-
- Note that matrix multiplication is not commutative, i.e. a*b !=
- b*a.
-*/
-
-QMatrix QMatrix::operator *(const QMatrix &m) const
-{
- qreal tm11 = _m11*m._m11 + _m12*m._m21;
- qreal tm12 = _m11*m._m12 + _m12*m._m22;
- qreal tm21 = _m21*m._m11 + _m22*m._m21;
- qreal tm22 = _m21*m._m12 + _m22*m._m22;
-
- qreal tdx = _dx*m._m11 + _dy*m._m21 + m._dx;
- qreal tdy = _dx*m._m12 + _dy*m._m22 + m._dy;
- return QMatrix(tm11, tm12, tm21, tm22, tdx, tdy, true);
-}
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-/*!
- Assigns the given \a matrix's values to this matrix.
-*/
-QMatrix &QMatrix::operator=(const QMatrix &matrix) noexcept
-{
- _m11 = matrix._m11;
- _m12 = matrix._m12;
- _m21 = matrix._m21;
- _m22 = matrix._m22;
- _dx = matrix._dx;
- _dy = matrix._dy;
- return *this;
-}
-#endif
-
-/*!
- \since 4.2
-
- Returns the matrix as a QVariant.
-*/
-QMatrix::operator QVariant() const
-{
- return QVariant(QMetaType::QMatrix, this);
-}
-
-Q_GUI_EXPORT QPainterPath operator *(const QPainterPath &p, const QMatrix &m)
-{
- return m.map(p);
-}
-
-
-/*****************************************************************************
- QMatrix stream functions
- *****************************************************************************/
-#ifndef QT_NO_DATASTREAM
-/*!
- \fn QDataStream &operator<<(QDataStream &stream, const QMatrix &matrix)
- \relates QMatrix
-
- Writes the given \a matrix to the given \a stream and returns a
- reference to the stream.
-
- \sa {Serializing Qt Data Types}
-*/
-
-QDataStream &operator<<(QDataStream &s, const QMatrix &m)
-{
- if (s.version() == 1) {
- s << (float)m.m11() << (float)m.m12() << (float)m.m21()
- << (float)m.m22() << (float)m.dx() << (float)m.dy();
- } else {
- s << double(m.m11())
- << double(m.m12())
- << double(m.m21())
- << double(m.m22())
- << double(m.dx())
- << double(m.dy());
- }
- return s;
-}
-
-/*!
- \fn QDataStream &operator>>(QDataStream &stream, QMatrix &matrix)
- \relates QMatrix
-
- Reads the given \a matrix from the given \a stream and returns a
- reference to the stream.
-
- \sa {Serializing Qt Data Types}
-*/
-
-QDataStream &operator>>(QDataStream &s, QMatrix &m)
-{
- if (s.version() == 1) {
- float m11, m12, m21, m22, dx, dy;
- s >> m11; s >> m12; s >> m21; s >> m22;
- s >> dx; s >> dy;
- m.setMatrix(m11, m12, m21, m22, dx, dy);
- }
- else {
- double m11, m12, m21, m22, dx, dy;
- s >> m11;
- s >> m12;
- s >> m21;
- s >> m22;
- s >> dx;
- s >> dy;
- m.setMatrix(m11, m12, m21, m22, dx, dy);
- }
- return s;
-}
-#endif // QT_NO_DATASTREAM
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug dbg, const QMatrix &m)
-{
- QDebugStateSaver saver(dbg);
- dbg.nospace() << "QMatrix("
- << "11=" << m.m11()
- << " 12=" << m.m12()
- << " 21=" << m.m21()
- << " 22=" << m.m22()
- << " dx=" << m.dx()
- << " dy=" << m.dy()
- << ')';
- return dbg;
-}
-#endif
-
-/*!
- \fn bool qFuzzyCompare(const QMatrix& m1, const QMatrix& m2)
-
- \relates QMatrix
- \since 4.6
-
- \brief The qFuzzyCompare function is for comparing two matrices
- using a fuzziness factor.
-
- Returns \c true if \a m1 and \a m2 are equal, allowing for a small
- fuzziness factor for floating-point comparisons; false otherwise.
-*/
-
-QT_END_NAMESPACE
diff --git a/src/gui/painting/qmatrix.h b/src/gui/painting/qmatrix.h
deleted file mode 100644
index a167260ade..0000000000
--- a/src/gui/painting/qmatrix.h
+++ /dev/null
@@ -1,194 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QMATRIX_H
-#define QMATRIX_H
-
-#include <QtGui/qtguiglobal.h>
-#include <QtGui/qpolygon.h>
-#include <QtGui/qregion.h>
-#include <QtGui/qwindowdefs.h>
-#include <QtCore/qline.h>
-#include <QtCore/qpoint.h>
-#include <QtCore/qrect.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QPainterPath;
-class QVariant;
-
-class Q_GUI_EXPORT QMatrix // 2D transform matrix
-{
-public:
- inline explicit QMatrix(Qt::Initialization) {}
- QMatrix();
- QMatrix(qreal m11, qreal m12, qreal m21, qreal m22,
- qreal dx, qreal dy);
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- // ### Qt 6: remove; the compiler-generated ones are fine!
- QMatrix &operator=(QMatrix &&other) noexcept // = default
- { memcpy(static_cast<void *>(this), static_cast<void *>(&other), sizeof(QMatrix)); return *this; }
- QMatrix &operator=(const QMatrix &) noexcept; // = default
- QMatrix(QMatrix &&other) noexcept // = default
- { memcpy(static_cast<void *>(this), static_cast<void *>(&other), sizeof(QMatrix)); }
- QMatrix(const QMatrix &other) noexcept; // = default
-#endif
-
- void setMatrix(qreal m11, qreal m12, qreal m21, qreal m22,
- qreal dx, qreal dy);
-
- qreal m11() const { return _m11; }
- qreal m12() const { return _m12; }
- qreal m21() const { return _m21; }
- qreal m22() const { return _m22; }
- qreal dx() const { return _dx; }
- qreal dy() const { return _dy; }
-
- void map(int x, int y, int *tx, int *ty) const;
- void map(qreal x, qreal y, qreal *tx, qreal *ty) const;
- QRect mapRect(const QRect &) const;
- QRectF mapRect(const QRectF &) const;
-
- QPoint map(const QPoint &p) const;
- QPointF map(const QPointF&p) const;
- QLine map(const QLine &l) const;
- QLineF map(const QLineF &l) const;
- QPolygonF map(const QPolygonF &a) const;
- QPolygon map(const QPolygon &a) const;
- QRegion map(const QRegion &r) const;
- QPainterPath map(const QPainterPath &p) const;
- QPolygon mapToPolygon(const QRect &r) const;
-
- void reset();
- inline bool isIdentity() const;
-
- QMatrix &translate(qreal dx, qreal dy);
- QMatrix &scale(qreal sx, qreal sy);
- QMatrix &shear(qreal sh, qreal sv);
- QMatrix &rotate(qreal a);
-
- bool isInvertible() const { return !qFuzzyIsNull(_m11*_m22 - _m12*_m21); }
- qreal determinant() const { return _m11*_m22 - _m12*_m21; }
-
- Q_REQUIRED_RESULT QMatrix inverted(bool *invertible = nullptr) const;
-
- bool operator==(const QMatrix &) const;
- bool operator!=(const QMatrix &) const;
-
- QMatrix &operator*=(const QMatrix &);
- QMatrix operator*(const QMatrix &o) const;
-
- operator QVariant() const;
-
-private:
- inline QMatrix(bool)
- : _m11(1.)
- , _m12(0.)
- , _m21(0.)
- , _m22(1.)
- , _dx(0.)
- , _dy(0.) {}
- inline QMatrix(qreal am11, qreal am12, qreal am21, qreal am22, qreal adx, qreal ady, bool)
- : _m11(am11)
- , _m12(am12)
- , _m21(am21)
- , _m22(am22)
- , _dx(adx)
- , _dy(ady) {}
- friend class QTransform;
- qreal _m11, _m12;
- qreal _m21, _m22;
- qreal _dx, _dy;
-};
-Q_DECLARE_TYPEINFO(QMatrix, Q_MOVABLE_TYPE);
-
-Q_GUI_EXPORT Q_DECL_CONST_FUNCTION uint qHash(const QMatrix &key, uint seed = 0) noexcept;
-
-// mathematical semantics
-inline QPoint operator*(const QPoint &p, const QMatrix &m)
-{ return m.map(p); }
-inline QPointF operator*(const QPointF &p, const QMatrix &m)
-{ return m.map(p); }
-inline QLineF operator*(const QLineF &l, const QMatrix &m)
-{ return m.map(l); }
-inline QLine operator*(const QLine &l, const QMatrix &m)
-{ return m.map(l); }
-inline QPolygon operator *(const QPolygon &a, const QMatrix &m)
-{ return m.map(a); }
-inline QPolygonF operator *(const QPolygonF &a, const QMatrix &m)
-{ return m.map(a); }
-inline QRegion operator *(const QRegion &r, const QMatrix &m)
-{ return m.map(r); }
-Q_GUI_EXPORT QPainterPath operator *(const QPainterPath &p, const QMatrix &m);
-
-inline bool QMatrix::isIdentity() const
-{
- return qFuzzyIsNull(_m11 - 1) && qFuzzyIsNull(_m22 - 1) && qFuzzyIsNull(_m12)
- && qFuzzyIsNull(_m21) && qFuzzyIsNull(_dx) && qFuzzyIsNull(_dy);
-}
-
-inline bool qFuzzyCompare(const QMatrix& m1, const QMatrix& m2)
-{
- return qFuzzyCompare(m1.m11(), m2.m11())
- && qFuzzyCompare(m1.m12(), m2.m12())
- && qFuzzyCompare(m1.m21(), m2.m21())
- && qFuzzyCompare(m1.m22(), m2.m22())
- && qFuzzyCompare(m1.dx(), m2.dx())
- && qFuzzyCompare(m1.dy(), m2.dy());
-}
-
-
-/*****************************************************************************
- QMatrix stream functions
- *****************************************************************************/
-
-#ifndef QT_NO_DATASTREAM
-Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QMatrix &);
-Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QMatrix &);
-#endif
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_GUI_EXPORT QDebug operator<<(QDebug, const QMatrix &);
-#endif
-
-QT_END_NAMESPACE
-
-#endif // QMATRIX_H
diff --git a/src/gui/painting/qpagedpaintdevice.cpp b/src/gui/painting/qpagedpaintdevice.cpp
index 3fdd0206b7..e6d3a38427 100644
--- a/src/gui/painting/qpagedpaintdevice.cpp
+++ b/src/gui/painting/qpagedpaintdevice.cpp
@@ -80,6 +80,7 @@ class QDummyPagedPaintDevicePrivate : public QPagedPaintDevicePrivate
QPagedPaintDevicePrivate::~QPagedPaintDevicePrivate()
{
+ delete rangeCollection;
}
/*!
diff --git a/src/gui/painting/qpagedpaintdevice_p.h b/src/gui/painting/qpagedpaintdevice_p.h
index 3a43bd7828..1717727be4 100644
--- a/src/gui/painting/qpagedpaintdevice_p.h
+++ b/src/gui/painting/qpagedpaintdevice_p.h
@@ -53,6 +53,7 @@
#include <QtGui/private/qtguiglobal_p.h>
#include <qpagedpaintdevice.h>
+#include <qrangecollection.h>
QT_BEGIN_NAMESPACE
@@ -60,8 +61,7 @@ class Q_GUI_EXPORT QPagedPaintDevicePrivate
{
public:
QPagedPaintDevicePrivate()
- : fromPage(0),
- toPage(0),
+ : rangeCollection(new QRangeCollection),
pageOrderAscending(true),
printSelectionOnly(false)
{
@@ -83,8 +83,7 @@ public:
static inline QPagedPaintDevicePrivate *get(QPagedPaintDevice *pd) { return pd->d; }
// These are currently required to keep QPrinter functionality working in QTextDocument::print()
- int fromPage;
- int toPage;
+ QRangeCollection *rangeCollection;
bool pageOrderAscending;
bool printSelectionOnly;
};
diff --git a/src/gui/painting/qpaintdevice.qdoc b/src/gui/painting/qpaintdevice.qdoc
index 0cba864523..3b93faed84 100644
--- a/src/gui/painting/qpaintdevice.qdoc
+++ b/src/gui/painting/qpaintdevice.qdoc
@@ -39,8 +39,7 @@
right and Y increases downwards. The unit is one pixel.
The drawing capabilities of QPaintDevice are currently implemented
- by the QWidget, QImage, QPixmap, QGLPixelBuffer, QPicture, and
- QPrinter subclasses.
+ by the QWidget, QImage, QPixmap, QPicture, and QPrinter subclasses.
To implement support for a new backend, you must derive from
QPaintDevice and reimplement the virtual paintEngine() function to
diff --git a/src/gui/painting/qpaintengine.cpp b/src/gui/painting/qpaintengine.cpp
index 6b34911c15..fc5c125b72 100644
--- a/src/gui/painting/qpaintengine.cpp
+++ b/src/gui/painting/qpaintengine.cpp
@@ -508,7 +508,7 @@ void QPaintEngine::drawEllipse(const QRectF &rect)
if (hasFeature(PainterPaths)) {
drawPath(path);
} else {
- QPolygonF polygon = path.toFillPolygon(QTransform());
+ QPolygonF polygon = path.toFillPolygon();
drawPolygon(polygon.data(), polygon.size(), ConvexMode);
}
}
diff --git a/src/gui/painting/qpaintengine.h b/src/gui/painting/qpaintengine.h
index e90020dbbf..73727e463d 100644
--- a/src/gui/painting/qpaintengine.h
+++ b/src/gui/painting/qpaintengine.h
@@ -273,9 +273,6 @@ public:
QBrush backgroundBrush() const;
Qt::BGMode backgroundMode() const;
QFont font() const;
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_X("Use transform()") QMatrix matrix() const;
-#endif // QT_DEPRECATED_SINCE(5, 15)
QTransform transform() const;
Qt::ClipOperation clipOperation() const;
diff --git a/src/gui/painting/qpaintengine_raster_p.h b/src/gui/painting/qpaintengine_raster_p.h
index 089aadc3f7..1244ea6709 100644
--- a/src/gui/painting/qpaintengine_raster_p.h
+++ b/src/gui/painting/qpaintengine_raster_p.h
@@ -434,14 +434,14 @@ public:
QImage::Format prepare(QImage *image);
- uchar *scanLine(int y) { Q_ASSERT(y>=0); Q_ASSERT(y<m_height); return m_buffer + y * qsizetype(bytes_per_line); }
+ uchar *scanLine(int y) { Q_ASSERT(y>=0); Q_ASSERT(y<m_height); return m_buffer + y * bytes_per_line; }
int width() const { return m_width; }
int height() const { return m_height; }
- int bytesPerLine() const { return bytes_per_line; }
+ qsizetype bytesPerLine() const { return bytes_per_line; }
int bytesPerPixel() const { return bytes_per_pixel; }
template<typename T>
- int stride() { return bytes_per_line / sizeof(T); }
+ int stride() { return static_cast<int>(bytes_per_line / sizeof(T)); }
uchar *buffer() const { return m_buffer; }
@@ -456,7 +456,7 @@ public:
private:
int m_width;
int m_height;
- int bytes_per_line;
+ qsizetype bytes_per_line;
int bytes_per_pixel;
uchar *m_buffer;
};
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 390147463d..fc93ffa19f 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -96,10 +96,15 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const
QTextItem::RenderFlags flags, qreal width,
const QTextCharFormat &charFormat);
// Helper function to calculate left most position, width and flags for decoration drawing
-Q_GUI_EXPORT void qt_draw_decoration_for_glyphs(QPainter *painter, const glyph_t *glyphArray,
- const QFixedPoint *positions, int glyphCount,
- QFontEngine *fontEngine, const QFont &font,
- const QTextCharFormat &charFormat);
+static void qt_draw_decoration_for_glyphs(QPainter *painter,
+ const QPointF &decorationPosition,
+ const glyph_t *glyphArray,
+ const QFixedPoint *positions,
+ int glyphCount,
+ QFontEngine *fontEngine,
+ bool underline,
+ bool overline,
+ bool strikeOut);
static inline QGradient::CoordinateMode coordinateMode(const QBrush &brush)
{
@@ -1924,8 +1929,7 @@ bool QPainter::end()
}
if (d->states.size() > 1) {
- qWarning("QPainter::end: Painter ended with %d saved states",
- d->states.size());
+ qWarning("QPainter::end: Painter ended with %d saved states", int(d->states.size()));
}
if (d->engine->autoDestruct()) {
@@ -2555,19 +2559,19 @@ QRegion QPainter::clipRegion() const
case QPainterClipInfo::PathClip: {
QTransform matrix = (info.matrix * d->invMatrix);
if (lastWasNothing) {
- region = QRegion((info.path * matrix).toFillPolygon(QTransform()).toPolygon(),
+ region = QRegion((info.path * matrix).toFillPolygon().toPolygon(),
info.path.fillRule());
lastWasNothing = false;
continue;
}
if (info.operation == Qt::IntersectClip) {
- region &= QRegion((info.path * matrix).toFillPolygon(QTransform()).toPolygon(),
+ region &= QRegion((info.path * matrix).toFillPolygon().toPolygon(),
info.path.fillRule());
} else if (info.operation == Qt::NoClip) {
lastWasNothing = true;
region = QRegion();
} else {
- region = QRegion((info.path * matrix).toFillPolygon(QTransform()).toPolygon(),
+ region = QRegion((info.path * matrix).toFillPolygon().toPolygon(),
info.path.fillRule());
}
break;
@@ -2891,175 +2895,6 @@ void QPainter::setClipRegion(const QRegion &r, Qt::ClipOperation op)
d->updateState(d->state);
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \since 4.2
- \obsolete
-
- Sets the transformation matrix to \a matrix and enables transformations.
-
- \note It is advisable to use setWorldTransform() instead of this function to
- preserve the properties of perspective transformations.
-
- If \a combine is true, then \a matrix is combined with the current
- transformation matrix; otherwise \a matrix replaces the current
- transformation matrix.
-
- If \a matrix is the identity matrix and \a combine is false, this
- function calls setWorldMatrixEnabled(false). (The identity matrix is the
- matrix where QMatrix::m11() and QMatrix::m22() are 1.0 and the
- rest are 0.0.)
-
- The following functions can transform the coordinate system without using
- a QMatrix:
- \list
- \li translate()
- \li scale()
- \li shear()
- \li rotate()
- \endlist
-
- They operate on the painter's worldMatrix() and are implemented like this:
-
- \snippet code/src_gui_painting_qpainter.cpp 4
-
- Note that when using setWorldMatrix() function you should always have
- \a combine be true when you are drawing into a QPicture. Otherwise
- it may not be possible to replay the picture with additional
- transformations; using the translate(), scale(), etc. convenience
- functions is safe.
-
- For more information about the coordinate system, transformations
- and window-viewport conversion, see \l {Coordinate System}.
-
- \sa setWorldTransform(), QTransform
-*/
-
-void QPainter::setWorldMatrix(const QMatrix &matrix, bool combine)
-{
- setWorldTransform(QTransform(matrix), combine);
-}
-
-/*!
- \since 4.2
- \obsolete
-
- Returns the world transformation matrix.
-
- It is advisable to use worldTransform() because worldMatrix() does not
- preserve the properties of perspective transformations.
-
- \sa {QPainter#Coordinate Transformations}{Coordinate Transformations},
- {Coordinate System}
-*/
-
-const QMatrix &QPainter::worldMatrix() const
-{
- Q_D(const QPainter);
- if (!d->engine) {
- qWarning("QPainter::worldMatrix: Painter not active");
- return d->fakeState()->transform.toAffine();
- }
- return d->state->worldMatrix.toAffine();
-}
-
-/*!
- \obsolete
-
- Use setWorldTransform() instead.
-
- \sa setWorldTransform()
-*/
-
-void QPainter::setMatrix(const QMatrix &matrix, bool combine)
-{
- setWorldTransform(QTransform(matrix), combine);
-}
-
-/*!
- \obsolete
-
- Use worldTransform() instead.
-
- \sa worldTransform()
-*/
-
-const QMatrix &QPainter::matrix() const
-{
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- return worldMatrix();
-QT_WARNING_POP
-}
-
-
-/*!
- \since 4.2
- \obsolete
-
- Returns the transformation matrix combining the current
- window/viewport and world transformation.
-
- It is advisable to use combinedTransform() instead of this
- function to preserve the properties of perspective transformations.
-
- \sa setWorldTransform(), setWindow(), setViewport()
-*/
-QMatrix QPainter::combinedMatrix() const
-{
- return combinedTransform().toAffine();
-}
-
-
-/*!
- \obsolete
-
- Returns the matrix that transforms from logical coordinates to
- device coordinates of the platform dependent paint device.
-
- \note It is advisable to use deviceTransform() instead of this
- function to preserve the properties of perspective transformations.
-
- This function is \e only needed when using platform painting
- commands on the platform dependent handle (Qt::HANDLE), and the
- platform does not do transformations nativly.
-
- The QPaintEngine::PaintEngineFeature enum can be queried to
- determine whether the platform performs the transformations or
- not.
-
- \sa worldMatrix(), QPaintEngine::hasFeature(),
-*/
-const QMatrix &QPainter::deviceMatrix() const
-{
- Q_D(const QPainter);
- if (!d->engine) {
- qWarning("QPainter::deviceMatrix: Painter not active");
- return d->fakeState()->transform.toAffine();
- }
- return d->state->matrix.toAffine();
-}
-
-/*!
- \obsolete
-
- Resets any transformations that were made using translate(), scale(),
- shear(), rotate(), setWorldMatrix(), setViewport() and
- setWindow().
-
- It is advisable to use resetTransform() instead of this function
- to preserve the properties of perspective transformations.
-
- \sa {QPainter#Coordinate Transformations}{Coordinate
- Transformations}
-*/
-
-void QPainter::resetMatrix()
-{
- resetTransform();
-}
-#endif
-
/*!
\since 4.2
@@ -3109,34 +2944,6 @@ bool QPainter::worldMatrixEnabled() const
return d->state->WxF;
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \obsolete
-
- Use setWorldMatrixEnabled() instead.
-
- \sa setWorldMatrixEnabled()
-*/
-
-void QPainter::setMatrixEnabled(bool enable)
-{
- setWorldMatrixEnabled(enable);
-}
-
-/*!
- \obsolete
-
- Use worldMatrixEnabled() instead
-
- \sa worldMatrixEnabled()
-*/
-
-bool QPainter::matrixEnabled() const
-{
- return worldMatrixEnabled();
-}
-#endif
-
/*!
Scales the coordinate system by (\a{sx}, \a{sy}).
@@ -5607,40 +5414,31 @@ void QPainter::drawGlyphRun(const QPointF &position, const QGlyphRun &glyphRun)
fixedPointPositions[i] = QFixedPoint::fromPointF(processedPosition);
}
- d->drawGlyphs(glyphIndexes, fixedPointPositions.data(), count, fontD->fontEngine,
- glyphRun.overline(), glyphRun.underline(), glyphRun.strikeOut());
+ d->drawGlyphs(engineRequiresPretransformedGlyphPositions
+ ? d->state->transform().map(position)
+ : position,
+ glyphIndexes,
+ fixedPointPositions.data(),
+ count,
+ fontD->fontEngine,
+ glyphRun.overline(),
+ glyphRun.underline(),
+ glyphRun.strikeOut());
}
-void QPainterPrivate::drawGlyphs(const quint32 *glyphArray, QFixedPoint *positions,
+void QPainterPrivate::drawGlyphs(const QPointF &decorationPosition,
+ const quint32 *glyphArray,
+ QFixedPoint *positions,
int glyphCount,
- QFontEngine *fontEngine, bool overline, bool underline,
+ QFontEngine *fontEngine,
+ bool overline,
+ bool underline,
bool strikeOut)
{
Q_Q(QPainter);
updateState(state);
- QFixed leftMost;
- QFixed rightMost;
- QFixed baseLine;
- for (int i=0; i<glyphCount; ++i) {
- glyph_metrics_t gm = fontEngine->boundingBox(glyphArray[i]);
- if (i == 0 || leftMost > positions[i].x)
- leftMost = positions[i].x;
-
- // We don't support glyphs that do not share a common baseline. If this turns out to
- // be a relevant use case, then we need to find clusters of glyphs that share a baseline
- // and do a drawTextItemDecorations call per cluster.
- if (i == 0 || baseLine < positions[i].y)
- baseLine = positions[i].y;
-
- // We use the advance rather than the actual bounds to match the algorithm in drawText()
- if (i == 0 || rightMost < positions[i].x + gm.xoff)
- rightMost = positions[i].x + gm.xoff;
- }
-
- QFixed width = rightMost - leftMost;
-
if (extended != nullptr && state->matrix.isAffine()) {
QStaticTextItem staticTextItem;
staticTextItem.color = state->pen.color();
@@ -5674,21 +5472,15 @@ void QPainterPrivate::drawGlyphs(const quint32 *glyphArray, QFixedPoint *positio
engine->drawTextItem(QPointF(0, 0), textItem);
}
- QTextItemInt::RenderFlags flags;
- if (underline)
- flags |= QTextItemInt::Underline;
- if (overline)
- flags |= QTextItemInt::Overline;
- if (strikeOut)
- flags |= QTextItemInt::StrikeOut;
-
- drawTextItemDecoration(q, QPointF(leftMost.toReal(), baseLine.toReal()),
- fontEngine,
- nullptr, // textEngine
- (underline
- ? QTextCharFormat::SingleUnderline
- : QTextCharFormat::NoUnderline),
- flags, width.toReal(), QTextCharFormat());
+ qt_draw_decoration_for_glyphs(q,
+ decorationPosition,
+ glyphArray,
+ positions,
+ glyphCount,
+ fontEngine,
+ underline,
+ overline,
+ strikeOut);
}
#endif // QT_NO_RAWFONT
@@ -5868,9 +5660,15 @@ void QPainter::drawStaticText(const QPointF &topLeftPosition, const QStaticText
}
d->extended->drawStaticTextItem(item);
- qt_draw_decoration_for_glyphs(this, item->glyphs, item->glyphPositions,
- item->numGlyphs, item->fontEngine(), staticText_d->font,
- QTextCharFormat());
+ qt_draw_decoration_for_glyphs(this,
+ topLeftPosition,
+ item->glyphs,
+ item->glyphPositions,
+ item->numGlyphs,
+ item->fontEngine(),
+ staticText_d->font.underline(),
+ staticText_d->font.overline(),
+ staticText_d->font.strikeOut());
}
if (currentColor != oldPen.color())
setPen(oldPen);
@@ -6375,49 +6173,44 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const
painter->setRenderHint(QPainter::Qt4CompatiblePainting);
}
-Q_GUI_EXPORT void qt_draw_decoration_for_glyphs(QPainter *painter, const glyph_t *glyphArray,
- const QFixedPoint *positions, int glyphCount,
- QFontEngine *fontEngine, const QFont &font,
- const QTextCharFormat &charFormat)
+static void qt_draw_decoration_for_glyphs(QPainter *painter,
+ const QPointF &decorationPosition,
+ const glyph_t *glyphArray,
+ const QFixedPoint *positions,
+ int glyphCount,
+ QFontEngine *fontEngine,
+ bool underline,
+ bool overline,
+ bool strikeOut)
{
- if (!(font.underline() || font.strikeOut() || font.overline()))
+ if (!underline && !overline && !strikeOut)
return;
- QFixed leftMost;
- QFixed rightMost;
- QFixed baseLine;
- for (int i=0; i<glyphCount; ++i) {
- glyph_metrics_t gm = fontEngine->boundingBox(glyphArray[i]);
- if (i == 0 || leftMost > positions[i].x)
- leftMost = positions[i].x;
-
- // We don't support glyphs that do not share a common baseline. If this turns out to
- // be a relevant use case, then we need to find clusters of glyphs that share a baseline
- // and do a drawTextItemDecoration call per cluster.
- if (i == 0 || baseLine < positions[i].y)
- baseLine = positions[i].y;
-
- // We use the advance rather than the actual bounds to match the algorithm in drawText()
- if (i == 0 || rightMost < positions[i].x + gm.xoff)
- rightMost = positions[i].x + gm.xoff;
- }
-
- QFixed width = rightMost - leftMost;
QTextItem::RenderFlags flags;
-
- if (font.underline())
+ if (underline)
flags |= QTextItem::Underline;
- if (font.overline())
+ if (overline)
flags |= QTextItem::Overline;
- if (font.strikeOut())
+ if (strikeOut)
flags |= QTextItem::StrikeOut;
- drawTextItemDecoration(painter, QPointF(leftMost.toReal(), baseLine.toReal()),
+ bool rtl = positions[glyphCount - 1].x < positions[0].x;
+ QFixed baseline = positions[0].y;
+ glyph_metrics_t gm = fontEngine->boundingBox(glyphArray[rtl ? 0 : glyphCount - 1]);
+
+ qreal width = rtl
+ ? (positions[0].x + gm.xoff - positions[glyphCount - 1].x).toReal()
+ : (positions[glyphCount - 1].x + gm.xoff - positions[0].x).toReal();
+
+ drawTextItemDecoration(painter,
+ QPointF(decorationPosition.x(), baseline.toReal()),
fontEngine,
nullptr, // textEngine
- font.underline() ? QTextCharFormat::SingleUnderline
- : QTextCharFormat::NoUnderline, flags,
- width.toReal(), charFormat);
+ underline ? QTextCharFormat::SingleUnderline
+ : QTextCharFormat::NoUnderline,
+ flags,
+ width,
+ QTextCharFormat());
}
void QPainter::drawTextItem(const QPointF &p, const QTextItem &ti)
@@ -8084,33 +7877,6 @@ QFont QPaintEngineState::font() const
return static_cast<const QPainterState *>(this)->font;
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \since 4.2
- \obsolete
-
- Use transform() instead.
-
- Returns the matrix in the current paint engine
- state.
-
- \note It is advisable to use transform() instead of this function to
- preserve the properties of perspective transformations.
-
- This variable should only be used when the state() returns a
- combination which includes the QPaintEngine::DirtyTransform flag.
-
- \sa state(), QPaintEngine::updateState()
-*/
-
-QMatrix QPaintEngineState::matrix() const
-{
- const QPainterState *st = static_cast<const QPainterState *>(this);
-
- return st->matrix.toAffine();
-}
-#endif
-
/*!
\since 4.3
diff --git a/src/gui/painting/qpainter.h b/src/gui/painting/qpainter.h
index 77c6504d2e..52de8b6839 100644
--- a/src/gui/painting/qpainter.h
+++ b/src/gui/painting/qpainter.h
@@ -53,7 +53,6 @@
#include <QtGui/qpolygon.h>
#include <QtGui/qpen.h>
#include <QtGui/qbrush.h>
-#include <QtGui/qmatrix.h>
#include <QtGui/qtransform.h>
#include <QtGui/qfontinfo.h>
#include <QtGui/qfontmetrics.h>
@@ -236,35 +235,11 @@ public:
void restore();
// XForm functions
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use setTransform() instead")
- void setMatrix(const QMatrix &matrix, bool combine = false);
- QT_DEPRECATED_X("Use transform() instead")
- const QMatrix &matrix() const;
- QT_DEPRECATED_X("Use deviceTransform() instead")
- const QMatrix &deviceMatrix() const;
- QT_DEPRECATED_X("Use resetTransform() instead")
- void resetMatrix();
-#endif
-
void setTransform(const QTransform &transform, bool combine = false);
const QTransform &transform() const;
const QTransform &deviceTransform() const;
void resetTransform();
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use setWorldTransform() instead")
- void setWorldMatrix(const QMatrix &matrix, bool combine = false);
- QT_DEPRECATED_X("Use worldTransform() instead")
- const QMatrix &worldMatrix() const;
- QT_DEPRECATED_X("Use combinedTransform() instead")
- QMatrix combinedMatrix() const;
- QT_DEPRECATED_X("Use setWorldMatrixEnabled() instead")
- void setMatrixEnabled(bool enabled);
- QT_DEPRECATED_X("Use worldMatrixEnabled() instead")
- bool matrixEnabled() const;
-#endif
-
void setWorldTransform(const QTransform &matrix, bool combine = false);
const QTransform &worldTransform() const;
diff --git a/src/gui/painting/qpainter_p.h b/src/gui/painting/qpainter_p.h
index dafd6e33be..870381d48a 100644
--- a/src/gui/painting/qpainter_p.h
+++ b/src/gui/painting/qpainter_p.h
@@ -235,7 +235,7 @@ public:
void drawTextItem(const QPointF &p, const QTextItem &_ti, QTextEngine *textEngine);
#if !defined(QT_NO_RAWFONT)
- void drawGlyphs(const quint32 *glyphArray, QFixedPoint *positionArray, int glyphCount,
+ void drawGlyphs(const QPointF &decorationPosition, const quint32 *glyphArray, QFixedPoint *positionArray, int glyphCount,
QFontEngine *fontEngine, bool overline = false, bool underline = false,
bool strikeOut = false);
#endif
diff --git a/src/gui/painting/qpainterpath.cpp b/src/gui/painting/qpainterpath.cpp
index ab60afd9cd..e3cdc218b2 100644
--- a/src/gui/painting/qpainterpath.cpp
+++ b/src/gui/painting/qpainterpath.cpp
@@ -44,7 +44,6 @@
#include <qdebug.h>
#include <qiodevice.h>
#include <qlist.h>
-#include <qmatrix.h>
#include <qpen.h>
#include <qpolygon.h>
#include <qtextlayout.h>
@@ -1660,19 +1659,6 @@ QList<QPolygonF> QPainterPath::toSubpathPolygons(const QTransform &matrix) const
return flatCurves;
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \overload
- \obsolete
-
- Use toSubpathPolygons(const QTransform &matrix) instead.
- */
-QList<QPolygonF> QPainterPath::toSubpathPolygons(const QMatrix &matrix) const
-{
- return toSubpathPolygons(QTransform(matrix));
-}
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
/*!
Converts the path into a list of polygons using the
QTransform \a matrix, and returns the list.
@@ -1792,19 +1778,6 @@ QList<QPolygonF> QPainterPath::toFillPolygons(const QTransform &matrix) const
return polys;
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \overload
- \obsolete
-
- Use toFillPolygons(const QTransform &matrix) instead.
- */
-QList<QPolygonF> QPainterPath::toFillPolygons(const QMatrix &matrix) const
-{
- return toFillPolygons(QTransform(matrix));
-}
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
//same as qt_polygon_isect_line in qpolygon.cpp
static void qt_painterpath_isect_line(const QPointF &p1,
const QPointF &p2,
@@ -2898,7 +2871,6 @@ void QPainterPathStroker::setDashOffset(qreal offset)
*/
QPolygonF QPainterPath::toFillPolygon(const QTransform &matrix) const
{
-
const QList<QPolygonF> flats = toSubpathPolygons(matrix);
QPolygonF polygon;
if (flats.isEmpty())
@@ -2914,19 +2886,6 @@ QPolygonF QPainterPath::toFillPolygon(const QTransform &matrix) const
return polygon;
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \overload
- \obsolete
-
- Use toFillPolygon(const QTransform &matrix) instead.
-*/
-QPolygonF QPainterPath::toFillPolygon(const QMatrix &matrix) const
-{
- return toFillPolygon(QTransform(matrix));
-}
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
//derivative of the equation
static inline qreal slopeAt(qreal t, qreal a, qreal b, qreal c, qreal d)
{
diff --git a/src/gui/painting/qpainterpath.h b/src/gui/painting/qpainterpath.h
index 8d4bdf2e19..aa43c74bee 100644
--- a/src/gui/painting/qpainterpath.h
+++ b/src/gui/painting/qpainterpath.h
@@ -41,7 +41,6 @@
#define QPAINTERPATH_H
#include <QtGui/qtguiglobal.h>
-#include <QtGui/qmatrix.h>
#include <QtGui/qtransform.h>
#include <QtCore/qglobal.h>
#include <QtCore/qrect.h>
@@ -60,6 +59,7 @@ class QPainterPathStrokerPrivate;
class QPen;
class QPolygonF;
class QRegion;
+class QTransform;
class QVectorPath;
class Q_GUI_EXPORT QPainterPath
@@ -177,14 +177,6 @@ public:
Q_REQUIRED_RESULT QPainterPath toReversed() const;
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_X("Use toSubpathPolygons(const QTransform &)")
- QList<QPolygonF> toSubpathPolygons(const QMatrix &matrix) const;
- QT_DEPRECATED_X("Use toFillPolygons(const QTransform &")
- QList<QPolygonF> toFillPolygons(const QMatrix &matrix) const;
- QT_DEPRECATED_X("Use toFillPolygon(const QTransform &)")
- QPolygonF toFillPolygon(const QMatrix &matrix) const;
-#endif // QT_DEPRECATED_SINCE(5, 15)
QList<QPolygonF> toSubpathPolygons(const QTransform &matrix = QTransform()) const;
QList<QPolygonF> toFillPolygons(const QTransform &matrix = QTransform()) const;
QPolygonF toFillPolygon(const QTransform &matrix = QTransform()) const;
@@ -239,7 +231,6 @@ private:
friend class QPainterPathData;
friend class QPainterPathStroker;
friend class QPainterPathStrokerPrivate;
- friend class QMatrix;
friend class QTransform;
friend class QVectorPath;
friend Q_GUI_EXPORT const QVectorPath &qtVectorPathForPath(const QPainterPath &);
diff --git a/src/gui/painting/qpainterpath_p.h b/src/gui/painting/qpainterpath_p.h
index a420e0b3d9..d52243b0df 100644
--- a/src/gui/painting/qpainterpath_p.h
+++ b/src/gui/painting/qpainterpath_p.h
@@ -74,7 +74,6 @@ public:
friend class QPainterPathData;
friend class QPainterPathStroker;
friend class QPainterPathStrokerPrivate;
- friend class QMatrix;
friend class QTransform;
friend class QVectorPath;
friend struct QPainterPathPrivateDeleter;
diff --git a/src/gui/painting/qplatformbackingstore.cpp b/src/gui/painting/qplatformbackingstore.cpp
index c092a7153f..e8ac494e04 100644
--- a/src/gui/painting/qplatformbackingstore.cpp
+++ b/src/gui/painting/qplatformbackingstore.cpp
@@ -40,43 +40,8 @@
#include "qplatformbackingstore.h"
#include <qwindow.h>
#include <qpixmap.h>
-#include <private/qwindow_p.h>
-
-#include <qopengl.h>
-#include <qopenglcontext.h>
-#include <QtGui/QMatrix4x4>
-#include <QtGui/QOpenGLShaderProgram>
-#include <QtGui/QOpenGLContext>
-#include <QtGui/QOpenGLFunctions>
-#ifndef QT_NO_OPENGL
-#include <QtGui/qopengltextureblitter.h>
-#include <QtGui/qoffscreensurface.h>
-#endif
-#include <qpa/qplatformgraphicsbuffer.h>
-#include <qpa/qplatformgraphicsbufferhelper.h>
-#ifndef GL_TEXTURE_BASE_LEVEL
-#define GL_TEXTURE_BASE_LEVEL 0x813C
-#endif
-#ifndef GL_TEXTURE_MAX_LEVEL
-#define GL_TEXTURE_MAX_LEVEL 0x813D
-#endif
-#ifndef GL_UNPACK_ROW_LENGTH
-#define GL_UNPACK_ROW_LENGTH 0x0CF2
-#endif
-#ifndef GL_RGB10_A2
-#define GL_RGB10_A2 0x8059
-#endif
-#ifndef GL_UNSIGNED_INT_2_10_10_10_REV
-#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
-#endif
-
-#ifndef GL_FRAMEBUFFER_SRGB
-#define GL_FRAMEBUFFER_SRGB 0x8DB9
-#endif
-#ifndef GL_FRAMEBUFFER_SRGB_CAPABLE
-#define GL_FRAMEBUFFER_SRGB_CAPABLE 0x8DBA
-#endif
+#include <QtCore/private/qobject_p.h>
QT_BEGIN_NAMESPACE
@@ -88,38 +53,19 @@ public:
QPlatformBackingStorePrivate(QWindow *w)
: window(w)
, backingStore(nullptr)
-#ifndef QT_NO_OPENGL
- , textureId(0)
- , blitter(nullptr)
-#endif
{
}
~QPlatformBackingStorePrivate()
{
#ifndef QT_NO_OPENGL
- if (context) {
- QOffscreenSurface offscreenSurface;
- offscreenSurface.setFormat(context->format());
- offscreenSurface.create();
- context->makeCurrent(&offscreenSurface);
- if (textureId)
- context->functions()->glDeleteTextures(1, &textureId);
- if (blitter)
- blitter->destroy();
- }
- delete blitter;
+ delete openGLSupport;
#endif
}
QWindow *window;
QBackingStore *backingStore;
#ifndef QT_NO_OPENGL
- QScopedPointer<QOpenGLContext> context;
- mutable GLuint textureId;
- mutable QSize textureSize;
- mutable bool needsSwizzle;
- mutable bool premultiplied;
- QOpenGLTextureBlitter *blitter;
+ QPlatformBackingStoreOpenGLSupportBase *openGLSupport = nullptr;
#endif
};
@@ -240,83 +186,20 @@ void QPlatformTextureList::clear()
*/
#ifndef QT_NO_OPENGL
-
-static inline QRect deviceRect(const QRect &rect, QWindow *window)
-{
- QRect deviceRect(rect.topLeft() * window->devicePixelRatio(),
- rect.size() * window->devicePixelRatio());
- return deviceRect;
-}
-
-static inline QPoint deviceOffset(const QPoint &pt, QWindow *window)
-{
- return pt * window->devicePixelRatio();
-}
-
-static QRegion deviceRegion(const QRegion &region, QWindow *window, const QPoint &offset)
-{
- if (offset.isNull() && window->devicePixelRatio() <= 1)
- return region;
-
- QVector<QRect> rects;
- rects.reserve(region.rectCount());
- for (const QRect &rect : region)
- rects.append(deviceRect(rect.translated(offset), window));
-
- QRegion deviceRegion;
- deviceRegion.setRects(rects.constData(), rects.count());
- return deviceRegion;
-}
-
-static inline QRect toBottomLeftRect(const QRect &topLeftRect, int windowHeight)
-{
- return QRect(topLeftRect.x(), windowHeight - topLeftRect.bottomRight().y() - 1,
- topLeftRect.width(), topLeftRect.height());
-}
-
-static void blitTextureForWidget(const QPlatformTextureList *textures, int idx, QWindow *window, const QRect &deviceWindowRect,
- QOpenGLTextureBlitter *blitter, const QPoint &offset, bool canUseSrgb)
-{
- const QRect clipRect = textures->clipRect(idx);
- if (clipRect.isEmpty())
- return;
-
- QRect rectInWindow = textures->geometry(idx);
- // relative to the TLW, not necessarily our window (if the flush is for a native child widget), have to adjust
- rectInWindow.translate(-offset);
-
- const QRect clippedRectInWindow = rectInWindow & clipRect.translated(rectInWindow.topLeft());
- const QRect srcRect = toBottomLeftRect(clipRect, rectInWindow.height());
-
- const QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(deviceRect(clippedRectInWindow, window),
- deviceWindowRect);
-
- const QMatrix3x3 source = QOpenGLTextureBlitter::sourceTransform(deviceRect(srcRect, window),
- deviceRect(rectInWindow, window).size(),
- QOpenGLTextureBlitter::OriginBottomLeft);
-
- QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
- const bool srgb = textures->flags(idx).testFlag(QPlatformTextureList::TextureIsSrgb);
- if (srgb && canUseSrgb)
- funcs->glEnable(GL_FRAMEBUFFER_SRGB);
-
- blitter->blit(textures->textureId(idx), target, source);
-
- if (srgb && canUseSrgb)
- funcs->glDisable(GL_FRAMEBUFFER_SRGB);
-}
-
/*!
Flushes the given \a region from the specified \a window onto the
screen, and composes it with the specified \a textures.
- The default implementation retrieves the contents using toTexture()
+ If OpenGLSupport has been enabled using \c setOpenGLSupport,
+ the default implementation retrieves the contents using toTexture()
and composes using OpenGL. May be reimplemented in subclasses if there
is a more efficient native way to do it.
\note \a region is relative to the window which may not be top-level in case
\a window corresponds to a native child widget. \a offset is the position of
the native child relative to the top-level window.
+
+ \sa setOpenGLSupport()
*/
void QPlatformBackingStore::composeAndFlush(QWindow *window, const QRegion &region,
@@ -324,162 +207,13 @@ void QPlatformBackingStore::composeAndFlush(QWindow *window, const QRegion &regi
QPlatformTextureList *textures,
bool translucentBackground)
{
- if (!qt_window_private(window)->receivedExpose)
- return;
-
- if (!d_ptr->context) {
- d_ptr->context.reset(new QOpenGLContext);
- d_ptr->context->setFormat(d_ptr->window->requestedFormat());
- d_ptr->context->setScreen(d_ptr->window->screen());
- d_ptr->context->setShareContext(qt_window_private(d_ptr->window)->shareContext());
- if (!d_ptr->context->create()) {
- qCWarning(lcQpaBackingStore, "composeAndFlush: QOpenGLContext creation failed");
- return;
- }
- }
-
- bool current = d_ptr->context->makeCurrent(window);
-
- if (!current && !d_ptr->context->isValid()) {
- delete d_ptr->blitter;
- d_ptr->blitter = nullptr;
- d_ptr->textureId = 0;
- current = d_ptr->context->create() && d_ptr->context->makeCurrent(window);
- }
-
- if (!current) {
- qCWarning(lcQpaBackingStore, "composeAndFlush: makeCurrent() failed");
- return;
- }
-
- qCDebug(lcQpaBackingStore) << "Composing and flushing" << region << "of" << window
- << "at offset" << offset << "with" << textures->count() << "texture(s) in" << textures;
-
- QWindowPrivate::get(window)->lastComposeTime.start();
-
- QOpenGLFunctions *funcs = d_ptr->context->functions();
- funcs->glViewport(0, 0, qRound(window->width() * window->devicePixelRatio()), qRound(window->height() * window->devicePixelRatio()));
- funcs->glClearColor(0, 0, 0, translucentBackground ? 0 : 1);
- funcs->glClear(GL_COLOR_BUFFER_BIT);
-
- if (!d_ptr->blitter) {
- d_ptr->blitter = new QOpenGLTextureBlitter;
- d_ptr->blitter->create();
- }
-
- d_ptr->blitter->bind();
-
- const QRect deviceWindowRect = deviceRect(QRect(QPoint(), window->size()), window);
- const QPoint deviceWindowOffset = deviceOffset(offset, window);
-
- bool canUseSrgb = false;
- // If there are any sRGB textures in the list, check if the destination
- // framebuffer is sRGB capable.
- for (int i = 0; i < textures->count(); ++i) {
- if (textures->flags(i).testFlag(QPlatformTextureList::TextureIsSrgb)) {
- GLint cap = 0;
- funcs->glGetIntegerv(GL_FRAMEBUFFER_SRGB_CAPABLE, &cap);
- if (cap)
- canUseSrgb = true;
- break;
- }
- }
-
- // Textures for renderToTexture widgets.
- for (int i = 0; i < textures->count(); ++i) {
- if (!textures->flags(i).testFlag(QPlatformTextureList::StacksOnTop))
- blitTextureForWidget(textures, i, window, deviceWindowRect, d_ptr->blitter, offset, canUseSrgb);
- }
-
- // Backingstore texture with the normal widgets.
- GLuint textureId = 0;
- QOpenGLTextureBlitter::Origin origin = QOpenGLTextureBlitter::OriginTopLeft;
- if (QPlatformGraphicsBuffer *graphicsBuffer = this->graphicsBuffer()) {
- if (graphicsBuffer->size() != d_ptr->textureSize) {
- if (d_ptr->textureId)
- funcs->glDeleteTextures(1, &d_ptr->textureId);
- funcs->glGenTextures(1, &d_ptr->textureId);
- funcs->glBindTexture(GL_TEXTURE_2D, d_ptr->textureId);
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (!ctx->isOpenGLES() || ctx->format().majorVersion() >= 3) {
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
- }
- funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- if (QPlatformGraphicsBufferHelper::lockAndBindToTexture(graphicsBuffer, &d_ptr->needsSwizzle, &d_ptr->premultiplied)) {
- d_ptr->textureSize = graphicsBuffer->size();
- } else {
- d_ptr->textureSize = QSize(0,0);
- }
-
- graphicsBuffer->unlock();
- } else if (!region.isEmpty()){
- funcs->glBindTexture(GL_TEXTURE_2D, d_ptr->textureId);
- QPlatformGraphicsBufferHelper::lockAndBindToTexture(graphicsBuffer, &d_ptr->needsSwizzle, &d_ptr->premultiplied);
- graphicsBuffer->unlock();
- }
-
- if (graphicsBuffer->origin() == QPlatformGraphicsBuffer::OriginBottomLeft)
- origin = QOpenGLTextureBlitter::OriginBottomLeft;
- textureId = d_ptr->textureId;
- } else {
- TextureFlags flags;
- textureId = toTexture(deviceRegion(region, window, offset), &d_ptr->textureSize, &flags);
- d_ptr->needsSwizzle = (flags & TextureSwizzle) != 0;
- d_ptr->premultiplied = (flags & TexturePremultiplied) != 0;
- if (flags & TextureFlip)
- origin = QOpenGLTextureBlitter::OriginBottomLeft;
- }
-
- funcs->glEnable(GL_BLEND);
- if (d_ptr->premultiplied)
- funcs->glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
+ if (auto *c = d_ptr->openGLSupport)
+ c->composeAndFlush(window, region, offset, textures, translucentBackground);
else
- funcs->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
-
- if (textureId) {
- if (d_ptr->needsSwizzle)
- d_ptr->blitter->setRedBlueSwizzle(true);
- // The backingstore is for the entire tlw.
- // In case of native children offset tells the position relative to the tlw.
- const QRect srcRect = toBottomLeftRect(deviceWindowRect.translated(deviceWindowOffset), d_ptr->textureSize.height());
- const QMatrix3x3 source = QOpenGLTextureBlitter::sourceTransform(srcRect,
- d_ptr->textureSize,
- origin);
- d_ptr->blitter->blit(textureId, QMatrix4x4(), source);
- if (d_ptr->needsSwizzle)
- d_ptr->blitter->setRedBlueSwizzle(false);
- }
-
- // Textures for renderToTexture widgets that have WA_AlwaysStackOnTop set.
- bool blendIsPremultiplied = d_ptr->premultiplied;
- for (int i = 0; i < textures->count(); ++i) {
- const QPlatformTextureList::Flags flags = textures->flags(i);
- if (flags.testFlag(QPlatformTextureList::NeedsPremultipliedAlphaBlending)) {
- if (!blendIsPremultiplied) {
- funcs->glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
- blendIsPremultiplied = true;
- }
- } else {
- if (blendIsPremultiplied) {
- funcs->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
- blendIsPremultiplied = false;
- }
- }
- if (flags.testFlag(QPlatformTextureList::StacksOnTop))
- blitTextureForWidget(textures, i, window, deviceWindowRect, d_ptr->blitter, offset, canUseSrgb);
- }
-
- funcs->glDisable(GL_BLEND);
- d_ptr->blitter->release();
-
- d_ptr->context->swapBuffers(window);
+ qWarning() << Q_FUNC_INFO << "no opengl support set";
}
#endif
+
/*!
Implemented in subclasses to return the content of the backingstore as a QImage.
@@ -504,7 +238,8 @@ QImage QPlatformBackingStore::toImage() const
The ownership of the texture is not transferred. The caller must not store
the return value between calls, but instead call this function before each use.
- The default implementation returns a cached texture if \a dirtyRegion is empty and
+ If OpenGLSupport has been enabled using \c setOpenGLSupport,
+ the default implementation returns a cached texture if \a dirtyRegion is empty and
\a textureSize matches the backingstore size, otherwise it retrieves the content using
toImage() and performs a texture upload. This works only if the value of \a textureSize
is preserved between the calls to this function.
@@ -520,141 +255,17 @@ QImage QPlatformBackingStore::toImage() const
flags will be set to include \c TextureFlip.
\note \a dirtyRegion is relative to the backingstore so no adjustment is needed.
+
+ \sa setOpenGLSupport()
*/
GLuint QPlatformBackingStore::toTexture(const QRegion &dirtyRegion, QSize *textureSize, TextureFlags *flags) const
{
- Q_ASSERT(textureSize);
- Q_ASSERT(flags);
-
- QImage image = toImage();
- QSize imageSize = image.size();
-
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- GLenum internalFormat = GL_RGBA;
- GLuint pixelType = GL_UNSIGNED_BYTE;
-
- bool needsConversion = false;
- *flags = { };
- switch (image.format()) {
- case QImage::Format_ARGB32_Premultiplied:
- *flags |= TexturePremultiplied;
- Q_FALLTHROUGH();
- case QImage::Format_RGB32:
- case QImage::Format_ARGB32:
- *flags |= TextureSwizzle;
- break;
- case QImage::Format_RGBA8888_Premultiplied:
- *flags |= TexturePremultiplied;
- Q_FALLTHROUGH();
- case QImage::Format_RGBX8888:
- case QImage::Format_RGBA8888:
- break;
- case QImage::Format_BGR30:
- case QImage::Format_A2BGR30_Premultiplied:
- if (!ctx->isOpenGLES() || ctx->format().majorVersion() >= 3) {
- pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
- internalFormat = GL_RGB10_A2;
- *flags |= TexturePremultiplied;
- } else {
- needsConversion = true;
- }
- break;
- case QImage::Format_RGB30:
- case QImage::Format_A2RGB30_Premultiplied:
- if (!ctx->isOpenGLES() || ctx->format().majorVersion() >= 3) {
- pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
- internalFormat = GL_RGB10_A2;
- *flags |= TextureSwizzle | TexturePremultiplied;
- } else {
- needsConversion = true;
- }
- break;
- default:
- needsConversion = true;
- break;
- }
- if (imageSize.isEmpty()) {
- *textureSize = imageSize;
+ if (auto *c = d_ptr->openGLSupport)
+ return c->toTexture(dirtyRegion, textureSize, flags);
+ else {
+ qWarning() << Q_FUNC_INFO << "no opengl support set";
return 0;
}
-
- // Must rely on the input only, not d_ptr.
- // With the default composeAndFlush() textureSize is &d_ptr->textureSize.
- bool resized = *textureSize != imageSize;
- if (dirtyRegion.isEmpty() && !resized)
- return d_ptr->textureId;
-
- *textureSize = imageSize;
-
- if (needsConversion)
- image = image.convertToFormat(QImage::Format_RGBA8888);
-
- // The image provided by the backingstore may have a stride larger than width * 4, for
- // instance on platforms that manually implement client-side decorations.
- static const int bytesPerPixel = 4;
- const int strideInPixels = image.bytesPerLine() / bytesPerPixel;
- const bool hasUnpackRowLength = !ctx->isOpenGLES() || ctx->format().majorVersion() >= 3;
-
- QOpenGLFunctions *funcs = ctx->functions();
-
- if (hasUnpackRowLength) {
- funcs->glPixelStorei(GL_UNPACK_ROW_LENGTH, strideInPixels);
- } else if (strideInPixels != image.width()) {
- // No UNPACK_ROW_LENGTH on ES 2.0 and yet we would need it. This case is typically
- // hit with QtWayland which is rarely used in combination with a ES2.0-only GL
- // implementation. Therefore, accept the performance hit and do a copy.
- image = image.copy();
- }
-
- if (resized) {
- if (d_ptr->textureId)
- funcs->glDeleteTextures(1, &d_ptr->textureId);
- funcs->glGenTextures(1, &d_ptr->textureId);
- funcs->glBindTexture(GL_TEXTURE_2D, d_ptr->textureId);
- if (!ctx->isOpenGLES() || ctx->format().majorVersion() >= 3) {
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
- }
- funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- funcs->glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, imageSize.width(), imageSize.height(), 0, GL_RGBA, pixelType,
- const_cast<uchar*>(image.constBits()));
- } else {
- funcs->glBindTexture(GL_TEXTURE_2D, d_ptr->textureId);
- QRect imageRect = image.rect();
- QRect rect = dirtyRegion.boundingRect() & imageRect;
-
- if (hasUnpackRowLength) {
- funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, rect.x(), rect.y(), rect.width(), rect.height(), GL_RGBA, pixelType,
- image.constScanLine(rect.y()) + rect.x() * bytesPerPixel);
- } else {
- // if the rect is wide enough it's cheaper to just
- // extend it instead of doing an image copy
- if (rect.width() >= imageRect.width() / 2) {
- rect.setX(0);
- rect.setWidth(imageRect.width());
- }
-
- // if the sub-rect is full-width we can pass the image data directly to
- // OpenGL instead of copying, since there's no gap between scanlines
-
- if (rect.width() == imageRect.width()) {
- funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, rect.y(), rect.width(), rect.height(), GL_RGBA, pixelType,
- image.constScanLine(rect.y()));
- } else {
- funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, rect.x(), rect.y(), rect.width(), rect.height(), GL_RGBA, pixelType,
- image.copy(rect).constBits());
- }
- }
- }
-
- if (hasUnpackRowLength)
- funcs->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
-
- return d_ptr->textureId;
}
#endif // QT_NO_OPENGL
@@ -706,6 +317,18 @@ QBackingStore *QPlatformBackingStore::backingStore() const
return d_ptr->backingStore;
}
+#ifndef QT_NO_OPENGL
+/*!
+ Injects an OpenGL implementation helper. Platform integrations need to
+ call this if they intend to use the default OpenGL implementations of
+ composeAndFlush or toTexture.
+*/
+void QPlatformBackingStore::setOpenGLSupport(QPlatformBackingStoreOpenGLSupportBase *openGLSupport)
+{
+ d_ptr->openGLSupport = openGLSupport;
+}
+#endif // QT_NO_OPENGL
+
/*!
This function is called before painting onto the surface begins,
with the \a region in which the painting will occur.
diff --git a/src/gui/painting/qplatformbackingstore.h b/src/gui/painting/qplatformbackingstore.h
index 7aa054f1e2..2a3d7d20b5 100644
--- a/src/gui/painting/qplatformbackingstore.h
+++ b/src/gui/painting/qplatformbackingstore.h
@@ -67,11 +67,10 @@ class QRect;
class QPoint;
class QImage;
class QPlatformBackingStorePrivate;
-class QPlatformWindow;
class QPlatformTextureList;
class QPlatformTextureListPrivate;
-class QOpenGLContext;
class QPlatformGraphicsBuffer;
+class QPlatformBackingStoreOpenGLSupportBase;
#ifndef QT_NO_OPENGL
class Q_GUI_EXPORT QPlatformTextureList : public QObject
@@ -118,6 +117,8 @@ public:
QWindow *window() const;
QBackingStore *backingStore() const;
+ void setOpenGLSupport(QPlatformBackingStoreOpenGLSupportBase *openGLSupport);
+
virtual QPaintDevice *paintDevice() = 0;
virtual void flush(QWindow *window, const QRegion &region, const QPoint &offset) = 0;
@@ -154,6 +155,17 @@ private:
};
#ifndef QT_NO_OPENGL
+class Q_GUI_EXPORT QPlatformBackingStoreOpenGLSupportBase // pure interface
+{
+public:
+ virtual void composeAndFlush(QWindow *window, const QRegion &region, const QPoint &offset,
+ QPlatformTextureList *textures, bool translucentBackground) = 0;
+ virtual GLuint toTexture(const QRegion &dirtyRegion, QSize *textureSize, QPlatformBackingStore::TextureFlags *flags) const = 0;
+ virtual ~QPlatformBackingStoreOpenGLSupportBase() {}
+};
+#endif // QT_NO_OPENGL
+
+#ifndef QT_NO_OPENGL
Q_DECLARE_OPERATORS_FOR_FLAGS(QPlatformBackingStore::TextureFlags)
#endif
diff --git a/src/gui/painting/qpolygon.cpp b/src/gui/painting/qpolygon.cpp
index 4fe819cae0..e9a8793bd0 100644
--- a/src/gui/painting/qpolygon.cpp
+++ b/src/gui/painting/qpolygon.cpp
@@ -899,7 +899,7 @@ QPolygon QPolygon::united(const QPolygon &r) const
QPainterPath subject; subject.addPolygon(*this);
QPainterPath clip; clip.addPolygon(r);
- return subject.united(clip).toFillPolygon(QTransform()).toPolygon();
+ return subject.united(clip).toFillPolygon().toPolygon();
}
/*!
@@ -918,7 +918,7 @@ QPolygon QPolygon::intersected(const QPolygon &r) const
QPainterPath subject; subject.addPolygon(*this);
QPainterPath clip; clip.addPolygon(r);
- return subject.intersected(clip).toFillPolygon(QTransform()).toPolygon();
+ return subject.intersected(clip).toFillPolygon().toPolygon();
}
/*!
@@ -936,7 +936,7 @@ QPolygon QPolygon::subtracted(const QPolygon &r) const
QPainterPath subject; subject.addPolygon(*this);
QPainterPath clip; clip.addPolygon(r);
- return subject.subtracted(clip).toFillPolygon(QTransform()).toPolygon();
+ return subject.subtracted(clip).toFillPolygon().toPolygon();
}
/*!
@@ -975,7 +975,7 @@ QPolygonF QPolygonF::united(const QPolygonF &r) const
QPainterPath subject; subject.addPolygon(*this);
QPainterPath clip; clip.addPolygon(r);
- return subject.united(clip).toFillPolygon(QTransform());
+ return subject.united(clip).toFillPolygon();
}
/*!
@@ -994,7 +994,7 @@ QPolygonF QPolygonF::intersected(const QPolygonF &r) const
QPainterPath subject; subject.addPolygon(*this);
QPainterPath clip; clip.addPolygon(r);
- return subject.intersected(clip).toFillPolygon(QTransform());
+ return subject.intersected(clip).toFillPolygon();
}
/*!
@@ -1011,7 +1011,7 @@ QPolygonF QPolygonF::subtracted(const QPolygonF &r) const
{
QPainterPath subject; subject.addPolygon(*this);
QPainterPath clip; clip.addPolygon(r);
- return subject.subtracted(clip).toFillPolygon(QTransform());
+ return subject.subtracted(clip).toFillPolygon();
}
/*!
diff --git a/src/gui/painting/qpolygon.h b/src/gui/painting/qpolygon.h
index 93fab55aa1..584965af3b 100644
--- a/src/gui/painting/qpolygon.h
+++ b/src/gui/painting/qpolygon.h
@@ -47,8 +47,6 @@
QT_BEGIN_NAMESPACE
-
-class QMatrix;
class QTransform;
class QRect;
class QVariant;
diff --git a/src/gui/painting/qrangecollection.cpp b/src/gui/painting/qrangecollection.cpp
new file mode 100644
index 0000000000..9acb36a000
--- /dev/null
+++ b/src/gui/painting/qrangecollection.cpp
@@ -0,0 +1,281 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qrangecollection.h"
+#include "qrangecollection_p.h"
+
+#include <QtCore/qstack.h>
+
+QT_BEGIN_NAMESPACE
+
+void QRangeCollectionPrivate::mergeIntervals()
+{
+ const int count = intervals.count();
+
+ if (count <= 0)
+ return;
+
+ std::sort(intervals.begin(), intervals.end());
+
+ QStack<QPair<int, int>> stack;
+ stack.push(intervals[0]);
+
+ for (int i = 1; i < count; i++) {
+ QPair<int, int> &top = stack.top();
+
+ if (top.second < intervals[i].first)
+ stack.push(intervals[i]);
+ else if (top.second < intervals[i].second)
+ top.second = intervals[i].second;
+ }
+
+ std::sort(intervals.begin(), intervals.end());
+
+ intervals = stack;
+}
+
+/*!
+ \class QRangeCollection
+ \brief The QRangeCollection class represents a collection of decimal intervals.
+ \inmodule QtGui
+ \ingroup painting
+ \since 6.0
+
+ QRangeCollection manages a set of decimal intervals.
+
+ Use QPrinter::rangeCollection() to access the collection of page ranges
+ associated with a QPrinter.
+*/
+
+QRangeCollection::QRangeCollection()
+ : d_ptr(new QRangeCollectionPrivate(this))
+{
+}
+
+/*!
+ Destroys the collection.
+*/
+QRangeCollection::~QRangeCollection()
+{
+}
+
+/*!
+ Inserts a single number into the collection.
+ */
+void QRangeCollection::addPage(int pageNumber)
+{
+ Q_D(QRangeCollection);
+ if (pageNumber <= 0) {
+ qWarning("QRangeCollection::addPage: 'pageNumber' must be greater than 0");
+ return;
+ }
+ d->intervals.append(qMakePair(pageNumber, pageNumber));
+ d->mergeIntervals();
+}
+
+/*!
+ Inserts a range into the collection.
+ */
+void QRangeCollection::addRange(int from, int to)
+{
+ Q_D(QRangeCollection);
+ if (from <= 0 || to <= 0) {
+ qWarning("QRangeCollection::addRange: 'from' and 'to' must be greater than 0");
+ return;
+ }
+ if (to < from) {
+ qWarning("QRangeCollection::addRange: 'from' must be less than or equal to 'to'");
+ std::swap(from, to);
+ }
+ d->intervals.append(qMakePair(from, to));
+ d->mergeIntervals();
+}
+
+/*!
+ Returns a list with the values of the ranges used in this collection.
+ */
+QList<QPair<int, int>> QRangeCollection::toList() const
+{
+ Q_D(const QRangeCollection);
+ return d->intervals.toList();
+}
+
+/*!
+ * Removes all ranges from this collection.
+ */
+void QRangeCollection::clear()
+{
+ Q_D(QRangeCollection);
+ d->intervals.clear();
+}
+
+/*!
+ Constructs the range collection from a string representation.
+
+ \code
+ QPrinter printer;
+ printer->rangeCollection()->parse("1-3,6-7");
+ \endcode
+ */
+bool QRangeCollection::parse(const QString &ranges)
+{
+ Q_D(QRangeCollection);
+ const QStringList items = ranges.split(',');
+ for (const QString &item : items) {
+ if (item.isEmpty()) {
+ d->intervals.clear();
+ return false;
+ }
+
+ if (item.contains(QLatin1Char('-'))) {
+ const QStringList rangeItems = item.split('-');
+ if (rangeItems.count() != 2) {
+ d->intervals.clear();
+ return false;
+ }
+
+ bool ok;
+ const int number1 = rangeItems[0].toInt(&ok);
+ if (!ok) {
+ d->intervals.clear();
+ return false;
+ }
+
+ const int number2 = rangeItems[1].toInt(&ok);
+ if (!ok) {
+ d->intervals.clear();
+ return false;
+ }
+
+ if (number1 < 1 || number2 < 1 || number2 < number1) {
+ d->intervals.clear();
+ return false;
+ }
+
+ d->intervals.append(qMakePair(number1, number2));
+
+ } else {
+ bool ok;
+ const int number = item.toInt(&ok);
+ if (!ok) {
+ d->intervals.clear();
+ return false;
+ }
+
+ if (number < 1) {
+ d->intervals.clear();
+ return false;
+ }
+
+ d->intervals.append(qMakePair(number, number));
+ }
+ }
+
+ d->mergeIntervals();
+ return true;
+}
+
+/*!
+ Returns the string representation of the ranges in the collection.
+ */
+QString QRangeCollection::toString() const
+{
+ Q_D(const QRangeCollection);
+ QString result;
+
+ for (const QPair<int, int> &pair : d->intervals) {
+ if (!result.isEmpty())
+ result += QLatin1Char(',');
+
+ if (pair.first == pair.second)
+ result += QString::number(pair.first);
+ else
+ result += QStringLiteral("%1-%2").arg(pair.first).arg(pair.second);
+ }
+
+ return result;
+}
+
+/*!
+ Returns \c true if the collection contains an occurrence
+ or a bounding range of \a pageNumber; otherwise returns
+ \c false.
+ */
+bool QRangeCollection::contains(int pageNumber) const
+{
+ Q_D(const QRangeCollection);
+ for (const QPair<int, int> &pair : d->intervals) {
+ if (pair.first <= pageNumber && pair.second >= pageNumber)
+ return true;
+ }
+ return false;
+}
+
+/*!
+ Returns \c true if the collection is empty; otherwise returns \c false.
+*/
+bool QRangeCollection::isEmpty() const
+{
+ Q_D(const QRangeCollection);
+ return d->intervals.isEmpty();
+}
+
+/*!
+ Returns the index of the first page covered by the range collection.
+*/
+int QRangeCollection::firstPage() const
+{
+ Q_D(const QRangeCollection);
+ if (d->intervals.isEmpty())
+ return 0;
+ return d->intervals.first().first;
+}
+
+/*!
+ Returns the index of the last page covered by the range collection.
+*/
+int QRangeCollection::lastPage() const
+{
+ Q_D(const QRangeCollection);
+ if (d->intervals.isEmpty())
+ return 0;
+ return d->intervals.last().second;
+}
+
+QT_END_NAMESPACE
diff --git a/src/gui/painting/qrangecollection.h b/src/gui/painting/qrangecollection.h
new file mode 100644
index 0000000000..310adaab05
--- /dev/null
+++ b/src/gui/painting/qrangecollection.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QRANGECOLLECTION_H
+#define QRANGECOLLECTION_H
+
+#include <QtGui/qtguiglobal.h>
+#include <QtCore/qpair.h>
+#include <QtCore/qscopedpointer.h>
+#include <QtCore/qvector.h>
+
+QT_BEGIN_NAMESPACE
+
+class QRangeCollectionPrivate;
+
+class Q_GUI_EXPORT QRangeCollection
+{
+ Q_DECLARE_PRIVATE(QRangeCollection)
+public:
+ explicit QRangeCollection();
+ ~QRangeCollection();
+
+ void addPage(int pageNumber);
+ void addRange(int from, int to);
+ QList<QPair<int, int>> toList() const;
+ void clear();
+
+ bool parse(const QString &ranges);
+ QString toString() const;
+
+ bool contains(const int pageNumber) const;
+ bool isEmpty() const;
+ int firstPage() const;
+ int lastPage() const;
+
+private:
+ QScopedPointer<QRangeCollectionPrivate> d_ptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QRANGECOLLECTION_H
diff --git a/src/gui/painting/qrangecollection_p.h b/src/gui/painting/qrangecollection_p.h
new file mode 100644
index 0000000000..9f930c18d3
--- /dev/null
+++ b/src/gui/painting/qrangecollection_p.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QRANGECOLLECTION_P_H
+#define QRANGECOLLECTION_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+
+#include <QtGui/private/qtguiglobal_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_GUI_EXPORT QRangeCollectionPrivate
+{
+ Q_DECLARE_PUBLIC(QRangeCollection)
+public:
+ QRangeCollectionPrivate(QRangeCollection *rangeCollection)
+ : q_ptr(rangeCollection)
+ {
+ }
+
+ void mergeIntervals();
+
+ QVector<QPair<int, int>> intervals;
+ QRangeCollection *q_ptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QRANGECOLLECTION_P_H
diff --git a/src/gui/painting/qregion.cpp b/src/gui/painting/qregion.cpp
index bac042c784..a10a2cb2d0 100644
--- a/src/gui/painting/qregion.cpp
+++ b/src/gui/painting/qregion.cpp
@@ -2845,7 +2845,7 @@ static bool RectInRegion(QRegionPrivate *region, int rx, int ry, uint rwidth, ui
break;
}
}
- return partIn ? ((ry <= prect->bottom()) ? RectanglePart : RectangleIn) : RectangleOut;
+ return partIn;
}
// END OF Region.c extract
// START OF poly.h extract
@@ -3561,7 +3561,7 @@ static void PtsToRegion(int numFullPtBlocks, int iCurPtBlock,
int extendTo = 0;
bool needsExtend = false;
QVarLengthArray<QRegionSpan> row;
- int rowSize = 0;
+ qsizetype rowSize = 0;
reg->extents.setLeft(INT_MAX);
reg->extents.setRight(INT_MIN);
@@ -3917,7 +3917,7 @@ QRegion::QRegion(const QRect &r, RegionType t)
} else if (t == Ellipse) {
QPainterPath path;
path.addEllipse(r.x(), r.y(), r.width(), r.height());
- QPolygon a = path.toSubpathPolygons(QTransform()).at(0).toPolygon();
+ QPolygon a = path.toSubpathPolygons().at(0).toPolygon();
d->qt_rgn = PolygonRegion(a.constData(), a.size(), EvenOddRule);
}
}
diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp
index 141b195a42..3728060caf 100644
--- a/src/gui/painting/qtextureglyphcache.cpp
+++ b/src/gui/painting/qtextureglyphcache.cpp
@@ -352,7 +352,7 @@ void QImageTextureGlyphCache::fillTexture(const Coord &c, glyph_t g, QFixed subP
int mw = qMin(mask.width(), c.w);
int mh = qMin(mask.height(), c.h);
uchar *d = m_image.bits();
- int dbpl = m_image.bytesPerLine();
+ qsizetype dbpl = m_image.bytesPerLine();
for (int y = 0; y < c.h; ++y) {
uchar *dest = d + (c.y + y) *dbpl + c.x/8;
@@ -374,7 +374,7 @@ void QImageTextureGlyphCache::fillTexture(const Coord &c, glyph_t g, QFixed subP
int mw = qMin(mask.width(), c.w);
int mh = qMin(mask.height(), c.h);
uchar *d = m_image.bits();
- int dbpl = m_image.bytesPerLine();
+ qsizetype dbpl = m_image.bytesPerLine();
if (mask.depth() == 1) {
for (int y = 0; y < c.h; ++y) {
diff --git a/src/gui/painting/qtextureglyphcache_p.h b/src/gui/painting/qtextureglyphcache_p.h
index b6fc7230a8..2f99f44741 100644
--- a/src/gui/painting/qtextureglyphcache_p.h
+++ b/src/gui/painting/qtextureglyphcache_p.h
@@ -156,7 +156,7 @@ protected:
int m_currentRowHeight; // Height of last row
};
-inline uint qHash(const QTextureGlyphCache::GlyphAndSubPixelPosition &g)
+inline size_t qHash(const QTextureGlyphCache::GlyphAndSubPixelPosition &g)
{
return (g.glyph << 8) | (g.subPixelPosition * 10).round().toInt();
}
diff --git a/src/gui/painting/qtransform.cpp b/src/gui/painting/qtransform.cpp
index 9d8bb0c3e2..41237592d5 100644
--- a/src/gui/painting/qtransform.cpp
+++ b/src/gui/painting/qtransform.cpp
@@ -41,7 +41,6 @@
#include "qdatastream.h"
#include "qdebug.h"
#include "qhashfunctions.h"
-#include "qmatrix.h"
#include "qregion.h"
#include "qpainterpath.h"
#include "qpainterpath_p.h"
@@ -76,20 +75,20 @@ static void nanWarning(const char *func)
ny = FY_; \
break; \
case TxTranslate: \
- nx = FX_ + affine._dx; \
- ny = FY_ + affine._dy; \
+ nx = FX_ + m_matrix[2][0]; \
+ ny = FY_ + m_matrix[2][1]; \
break; \
case TxScale: \
- nx = affine._m11 * FX_ + affine._dx; \
- ny = affine._m22 * FY_ + affine._dy; \
+ nx = m_matrix[0][0] * FX_ + m_matrix[2][0]; \
+ ny = m_matrix[1][1] * FY_ + m_matrix[2][1]; \
break; \
case TxRotate: \
case TxShear: \
case TxProject: \
- nx = affine._m11 * FX_ + affine._m21 * FY_ + affine._dx; \
- ny = affine._m12 * FX_ + affine._m22 * FY_ + affine._dy; \
+ nx = m_matrix[0][0] * FX_ + m_matrix[1][0] * FY_ + m_matrix[2][0]; \
+ ny = m_matrix[0][1] * FX_ + m_matrix[1][1] * FY_ + m_matrix[2][1]; \
if (t == TxProject) { \
- qreal w = (m_13 * FX_ + m_23 * FY_ + m_33); \
+ qreal w = (m_matrix[0][2] * FX_ + m_matrix[1][2] * FY_ + m_matrix[2][2]); \
if (w < qreal(Q_NEAR_CLIP)) w = qreal(Q_NEAR_CLIP); \
w = 1./w; \
nx *= w; \
@@ -109,14 +108,6 @@ static void nanWarning(const char *func)
or project the coordinate system, and is typically used when
rendering graphics.
- QTransform differs from QMatrix in that it is a true 3x3 matrix,
- allowing perspective transformations. QTransform's toAffine()
- method allows casting QTransform to QMatrix. If a perspective
- transformation has been specified on the matrix, then the
- conversion will cause loss of data.
-
- QTransform is the recommended transformation class in Qt.
-
A QTransform object can be built using the setMatrix(), scale(),
rotate(), translate() and shear() functions. Alternatively, it
can be built by applying \l {QTransform#Basic Matrix
@@ -261,8 +252,7 @@ static void nanWarning(const char *func)
\sa reset()
*/
QTransform::QTransform()
- : affine(true)
- , m_13(0), m_23(0), m_33(1)
+ : m_matrix{ {1, 0, 0}, {0, 1, 0}, {0, 0, 1} }
, m_type(TxNone)
, m_dirty(TxNone)
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
@@ -282,8 +272,7 @@ QTransform::QTransform()
QTransform::QTransform(qreal h11, qreal h12, qreal h13,
qreal h21, qreal h22, qreal h23,
qreal h31, qreal h32, qreal h33)
- : affine(h11, h12, h21, h22, h31, h32, true)
- , m_13(h13), m_23(h23), m_33(h33)
+ : m_matrix{ {h11, h12, h13}, {h21, h22, h23}, {h31, h32, h33} }
, m_type(TxNone)
, m_dirty(TxProject)
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
@@ -301,8 +290,7 @@ QTransform::QTransform(qreal h11, qreal h12, qreal h13,
*/
QTransform::QTransform(qreal h11, qreal h12, qreal h21,
qreal h22, qreal dx, qreal dy)
- : affine(h11, h12, h21, h22, dx, dy, true)
- , m_13(0), m_23(0), m_33(1)
+ : m_matrix{ {h11, h12, 0}, {h21, h22, 0}, {dx, dy, 1} }
, m_type(TxNone)
, m_dirty(TxShear)
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
@@ -311,44 +299,23 @@ QTransform::QTransform(qreal h11, qreal h12, qreal h21,
{
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \fn QTransform::QTransform(const QMatrix &matrix)
- \obsolete
-
- Constructs a matrix that is a copy of the given \a matrix.
- Note that the \c m13, \c m23, and \c m33 elements are set to 0, 0,
- and 1 respectively.
- */
-QTransform::QTransform(const QMatrix &mtx)
- : affine(mtx._m11, mtx._m12, mtx._m21, mtx._m22, mtx._dx, mtx._dy, true),
- m_13(0), m_23(0), m_33(1)
- , m_type(TxNone)
- , m_dirty(TxShear)
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- , d(nullptr)
-#endif
-{
-}
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
/*!
Returns the adjoint of this matrix.
*/
QTransform QTransform::adjoint() const
{
qreal h11, h12, h13,
- h21, h22, h23,
- h31, h32, h33;
- h11 = affine._m22*m_33 - m_23*affine._dy;
- h21 = m_23*affine._dx - affine._m21*m_33;
- h31 = affine._m21*affine._dy - affine._m22*affine._dx;
- h12 = m_13*affine._dy - affine._m12*m_33;
- h22 = affine._m11*m_33 - m_13*affine._dx;
- h32 = affine._m12*affine._dx - affine._m11*affine._dy;
- h13 = affine._m12*m_23 - m_13*affine._m22;
- h23 = m_13*affine._m21 - affine._m11*m_23;
- h33 = affine._m11*affine._m22 - affine._m12*affine._m21;
+ h21, h22, h23,
+ h31, h32, h33;
+ h11 = m_matrix[1][1] * m_matrix[2][2] - m_matrix[1][2] * m_matrix[2][1];
+ h21 = m_matrix[1][2] * m_matrix[2][0] - m_matrix[1][0] * m_matrix[2][2];
+ h31 = m_matrix[1][0] * m_matrix[2][1] - m_matrix[1][1] * m_matrix[2][0];
+ h12 = m_matrix[0][2] * m_matrix[2][1] - m_matrix[0][1] * m_matrix[2][2];
+ h22 = m_matrix[0][0] * m_matrix[2][2] - m_matrix[0][2] * m_matrix[2][0];
+ h32 = m_matrix[0][1] * m_matrix[2][0] - m_matrix[0][0] * m_matrix[2][1];
+ h13 = m_matrix[0][1] * m_matrix[1][2] - m_matrix[0][2] * m_matrix[1][1];
+ h23 = m_matrix[0][2] * m_matrix[1][0] - m_matrix[0][0] * m_matrix[1][2];
+ h33 = m_matrix[0][0] * m_matrix[1][1] - m_matrix[0][1] * m_matrix[1][0];
return QTransform(h11, h12, h13,
h21, h22, h23,
@@ -360,9 +327,9 @@ QTransform QTransform::adjoint() const
*/
QTransform QTransform::transposed() const
{
- QTransform t(affine._m11, affine._m21, affine._dx,
- affine._m12, affine._m22, affine._dy,
- m_13, m_23, m_33, true);
+ QTransform t(m_matrix[0][0], m_matrix[1][0], m_matrix[2][0],
+ m_matrix[0][1], m_matrix[1][1], m_matrix[2][1],
+ m_matrix[0][2], m_matrix[1][2], m_matrix[2][2], true);
return t;
}
@@ -385,23 +352,23 @@ QTransform QTransform::inverted(bool *invertible) const
case TxNone:
break;
case TxTranslate:
- invert.affine._dx = -affine._dx;
- invert.affine._dy = -affine._dy;
+ invert.m_matrix[2][0] = -m_matrix[2][0];
+ invert.m_matrix[2][1] = -m_matrix[2][1];
break;
case TxScale:
- inv = !qFuzzyIsNull(affine._m11);
- inv &= !qFuzzyIsNull(affine._m22);
+ inv = !qFuzzyIsNull(m_matrix[0][0]);
+ inv &= !qFuzzyIsNull(m_matrix[1][1]);
if (inv) {
- invert.affine._m11 = 1. / affine._m11;
- invert.affine._m22 = 1. / affine._m22;
- invert.affine._dx = -affine._dx * invert.affine._m11;
- invert.affine._dy = -affine._dy * invert.affine._m22;
+ invert.m_matrix[0][0] = 1. / m_matrix[0][0];
+ invert.m_matrix[1][1] = 1. / m_matrix[1][1];
+ invert.m_matrix[2][0] = -m_matrix[2][0] * invert.m_matrix[0][0];
+ invert.m_matrix[2][1] = -m_matrix[2][1] * invert.m_matrix[1][1];
}
break;
- case TxRotate:
- case TxShear:
- invert.affine = affine.inverted(&inv);
- break;
+// case TxRotate:
+// case TxShear:
+// invert.affine = affine.inverted(&inv);
+// break;
default:
// general case
qreal det = determinant();
@@ -442,24 +409,24 @@ QTransform &QTransform::translate(qreal dx, qreal dy)
switch(inline_type()) {
case TxNone:
- affine._dx = dx;
- affine._dy = dy;
+ m_matrix[2][0] = dx;
+ m_matrix[2][1] = dy;
break;
case TxTranslate:
- affine._dx += dx;
- affine._dy += dy;
+ m_matrix[2][0] += dx;
+ m_matrix[2][1] += dy;
break;
case TxScale:
- affine._dx += dx*affine._m11;
- affine._dy += dy*affine._m22;
+ m_matrix[2][0] += dx * m_matrix[0][0];
+ m_matrix[2][1] += dy * m_matrix[1][1];
break;
case TxProject:
- m_33 += dx*m_13 + dy*m_23;
+ m_matrix[2][2] += dx * m_matrix[0][2] + dy * m_matrix[1][2];
Q_FALLTHROUGH();
case TxShear:
case TxRotate:
- affine._dx += dx*affine._m11 + dy*affine._m21;
- affine._dy += dy*affine._m22 + dx*affine._m12;
+ m_matrix[2][0] += dx * m_matrix[0][0] + dy * m_matrix[1][0];
+ m_matrix[2][1] += dy * m_matrix[1][1] + dx * m_matrix[0][1];
break;
}
if (m_dirty < TxTranslate)
@@ -511,21 +478,21 @@ QTransform & QTransform::scale(qreal sx, qreal sy)
switch(inline_type()) {
case TxNone:
case TxTranslate:
- affine._m11 = sx;
- affine._m22 = sy;
+ m_matrix[0][0] = sx;
+ m_matrix[1][1] = sy;
break;
case TxProject:
- m_13 *= sx;
- m_23 *= sy;
+ m_matrix[0][2] *= sx;
+ m_matrix[1][2] *= sy;
Q_FALLTHROUGH();
case TxRotate:
case TxShear:
- affine._m12 *= sx;
- affine._m21 *= sy;
+ m_matrix[0][1] *= sx;
+ m_matrix[1][0] *= sy;
Q_FALLTHROUGH();
case TxScale:
- affine._m11 *= sx;
- affine._m22 *= sy;
+ m_matrix[0][0] *= sx;
+ m_matrix[1][1] *= sy;
break;
}
if (m_dirty < TxScale)
@@ -577,28 +544,30 @@ QTransform & QTransform::shear(qreal sh, qreal sv)
switch(inline_type()) {
case TxNone:
case TxTranslate:
- affine._m12 = sv;
- affine._m21 = sh;
+ m_matrix[0][1] = sv;
+ m_matrix[1][0] = sh;
break;
case TxScale:
- affine._m12 = sv*affine._m22;
- affine._m21 = sh*affine._m11;
+ m_matrix[0][1] = sv*m_matrix[1][1];
+ m_matrix[1][0] = sh*m_matrix[0][0];
break;
case TxProject: {
- qreal tm13 = sv*m_23;
- qreal tm23 = sh*m_13;
- m_13 += tm13;
- m_23 += tm23;
+ qreal tm13 = sv * m_matrix[1][2];
+ qreal tm23 = sh * m_matrix[0][2];
+ m_matrix[0][2] += tm13;
+ m_matrix[1][2] += tm23;
}
Q_FALLTHROUGH();
case TxRotate:
case TxShear: {
- qreal tm11 = sv*affine._m21;
- qreal tm22 = sh*affine._m12;
- qreal tm12 = sv*affine._m22;
- qreal tm21 = sh*affine._m11;
- affine._m11 += tm11; affine._m12 += tm12;
- affine._m21 += tm21; affine._m22 += tm22;
+ qreal tm11 = sv * m_matrix[1][0];
+ qreal tm22 = sh * m_matrix[0][1];
+ qreal tm12 = sv * m_matrix[1][1];
+ qreal tm21 = sh * m_matrix[0][0];
+ m_matrix[0][0] += tm11;
+ m_matrix[0][1] += tm12;
+ m_matrix[1][0] += tm21;
+ m_matrix[1][1] += tm22;
break;
}
}
@@ -653,35 +622,39 @@ QTransform & QTransform::rotate(qreal a, Qt::Axis axis)
switch(inline_type()) {
case TxNone:
case TxTranslate:
- affine._m11 = cosa;
- affine._m12 = sina;
- affine._m21 = -sina;
- affine._m22 = cosa;
+ m_matrix[0][0] = cosa;
+ m_matrix[0][1] = sina;
+ m_matrix[1][0] = -sina;
+ m_matrix[1][1] = cosa;
break;
case TxScale: {
- qreal tm11 = cosa*affine._m11;
- qreal tm12 = sina*affine._m22;
- qreal tm21 = -sina*affine._m11;
- qreal tm22 = cosa*affine._m22;
- affine._m11 = tm11; affine._m12 = tm12;
- affine._m21 = tm21; affine._m22 = tm22;
+ qreal tm11 = cosa * m_matrix[0][0];
+ qreal tm12 = sina * m_matrix[1][1];
+ qreal tm21 = -sina * m_matrix[0][0];
+ qreal tm22 = cosa * m_matrix[1][1];
+ m_matrix[0][0] = tm11;
+ m_matrix[0][1] = tm12;
+ m_matrix[1][0] = tm21;
+ m_matrix[1][1] = tm22;
break;
}
case TxProject: {
- qreal tm13 = cosa*m_13 + sina*m_23;
- qreal tm23 = -sina*m_13 + cosa*m_23;
- m_13 = tm13;
- m_23 = tm23;
+ qreal tm13 = cosa * m_matrix[0][2] + sina * m_matrix[1][2];
+ qreal tm23 = -sina * m_matrix[0][2] + cosa * m_matrix[1][2];
+ m_matrix[0][2] = tm13;
+ m_matrix[1][2] = tm23;
Q_FALLTHROUGH();
}
case TxRotate:
case TxShear: {
- qreal tm11 = cosa*affine._m11 + sina*affine._m21;
- qreal tm12 = cosa*affine._m12 + sina*affine._m22;
- qreal tm21 = -sina*affine._m11 + cosa*affine._m21;
- qreal tm22 = -sina*affine._m12 + cosa*affine._m22;
- affine._m11 = tm11; affine._m12 = tm12;
- affine._m21 = tm21; affine._m22 = tm22;
+ qreal tm11 = cosa * m_matrix[0][0] + sina * m_matrix[1][0];
+ qreal tm12 = cosa * m_matrix[0][1] + sina * m_matrix[1][1];
+ qreal tm21 = -sina * m_matrix[0][0] + cosa * m_matrix[1][0];
+ qreal tm22 = -sina * m_matrix[0][1] + cosa * m_matrix[1][1];
+ m_matrix[0][0] = tm11;
+ m_matrix[0][1] = tm12;
+ m_matrix[1][0] = tm21;
+ m_matrix[1][1] = tm22;
break;
}
}
@@ -690,11 +663,11 @@ QTransform & QTransform::rotate(qreal a, Qt::Axis axis)
} else {
QTransform result;
if (axis == Qt::YAxis) {
- result.affine._m11 = cosa;
- result.m_13 = -sina * inv_dist_to_plane;
+ result.m_matrix[0][0] = cosa;
+ result.m_matrix[0][2] = -sina * inv_dist_to_plane;
} else {
- result.affine._m22 = cosa;
- result.m_23 = -sina * inv_dist_to_plane;
+ result.m_matrix[1][1] = cosa;
+ result.m_matrix[1][2] = -sina * inv_dist_to_plane;
}
result.m_type = TxProject;
*this = result * *this;
@@ -732,35 +705,39 @@ QTransform & QTransform::rotateRadians(qreal a, Qt::Axis axis)
switch(inline_type()) {
case TxNone:
case TxTranslate:
- affine._m11 = cosa;
- affine._m12 = sina;
- affine._m21 = -sina;
- affine._m22 = cosa;
+ m_matrix[0][0] = cosa;
+ m_matrix[0][1] = sina;
+ m_matrix[1][0] = -sina;
+ m_matrix[1][1] = cosa;
break;
case TxScale: {
- qreal tm11 = cosa*affine._m11;
- qreal tm12 = sina*affine._m22;
- qreal tm21 = -sina*affine._m11;
- qreal tm22 = cosa*affine._m22;
- affine._m11 = tm11; affine._m12 = tm12;
- affine._m21 = tm21; affine._m22 = tm22;
+ qreal tm11 = cosa * m_matrix[0][0];
+ qreal tm12 = sina * m_matrix[1][1];
+ qreal tm21 = -sina * m_matrix[0][0];
+ qreal tm22 = cosa * m_matrix[1][1];
+ m_matrix[0][0] = tm11;
+ m_matrix[0][1] = tm12;
+ m_matrix[1][0] = tm21;
+ m_matrix[1][1] = tm22;
break;
}
case TxProject: {
- qreal tm13 = cosa*m_13 + sina*m_23;
- qreal tm23 = -sina*m_13 + cosa*m_23;
- m_13 = tm13;
- m_23 = tm23;
+ qreal tm13 = cosa * m_matrix[0][2] + sina * m_matrix[1][2];
+ qreal tm23 = -sina * m_matrix[0][2] + cosa * m_matrix[1][2];
+ m_matrix[0][2] = tm13;
+ m_matrix[1][2] = tm23;
Q_FALLTHROUGH();
}
case TxRotate:
case TxShear: {
- qreal tm11 = cosa*affine._m11 + sina*affine._m21;
- qreal tm12 = cosa*affine._m12 + sina*affine._m22;
- qreal tm21 = -sina*affine._m11 + cosa*affine._m21;
- qreal tm22 = -sina*affine._m12 + cosa*affine._m22;
- affine._m11 = tm11; affine._m12 = tm12;
- affine._m21 = tm21; affine._m22 = tm22;
+ qreal tm11 = cosa * m_matrix[0][0] + sina * m_matrix[1][0];
+ qreal tm12 = cosa * m_matrix[0][1] + sina * m_matrix[1][1];
+ qreal tm21 = -sina * m_matrix[0][0] + cosa * m_matrix[1][0];
+ qreal tm22 = -sina * m_matrix[0][1] + cosa * m_matrix[1][1];
+ m_matrix[0][0] = tm11;
+ m_matrix[0][1] = tm12;
+ m_matrix[1][0] = tm21;
+ m_matrix[1][1] = tm22;
break;
}
}
@@ -769,11 +746,11 @@ QTransform & QTransform::rotateRadians(qreal a, Qt::Axis axis)
} else {
QTransform result;
if (axis == Qt::YAxis) {
- result.affine._m11 = cosa;
- result.m_13 = -sina * inv_dist_to_plane;
+ result.m_matrix[0][0] = cosa;
+ result.m_matrix[0][2] = -sina * inv_dist_to_plane;
} else {
- result.affine._m22 = cosa;
- result.m_23 = -sina * inv_dist_to_plane;
+ result.m_matrix[1][1] = cosa;
+ result.m_matrix[1][2] = -sina * inv_dist_to_plane;
}
result.m_type = TxProject;
*this = result * *this;
@@ -788,15 +765,15 @@ QTransform & QTransform::rotateRadians(qreal a, Qt::Axis axis)
*/
bool QTransform::operator==(const QTransform &o) const
{
- return affine._m11 == o.affine._m11 &&
- affine._m12 == o.affine._m12 &&
- affine._m21 == o.affine._m21 &&
- affine._m22 == o.affine._m22 &&
- affine._dx == o.affine._dx &&
- affine._dy == o.affine._dy &&
- m_13 == o.m_13 &&
- m_23 == o.m_23 &&
- m_33 == o.m_33;
+ return m_matrix[0][0] == o.m_matrix[0][0] &&
+ m_matrix[0][1] == o.m_matrix[0][1] &&
+ m_matrix[1][0] == o.m_matrix[1][0] &&
+ m_matrix[1][1] == o.m_matrix[1][1] &&
+ m_matrix[2][0] == o.m_matrix[2][0] &&
+ m_matrix[2][1] == o.m_matrix[2][1] &&
+ m_matrix[0][2] == o.m_matrix[0][2] &&
+ m_matrix[1][2] == o.m_matrix[1][2] &&
+ m_matrix[2][2] == o.m_matrix[2][2];
}
/*!
@@ -806,7 +783,7 @@ bool QTransform::operator==(const QTransform &o) const
Returns the hash value for \a key, using
\a seed to seed the calculation.
*/
-uint qHash(const QTransform &key, uint seed) noexcept
+size_t qHash(const QTransform &key, size_t seed) noexcept
{
QtPrivate::QHashCombine hash;
seed = hash(seed, key.m11());
@@ -854,56 +831,59 @@ QTransform & QTransform::operator*=(const QTransform &o)
case TxNone:
break;
case TxTranslate:
- affine._dx += o.affine._dx;
- affine._dy += o.affine._dy;
+ m_matrix[2][0] += o.m_matrix[2][0];
+ m_matrix[2][1] += o.m_matrix[2][1];
break;
case TxScale:
{
- qreal m11 = affine._m11*o.affine._m11;
- qreal m22 = affine._m22*o.affine._m22;
+ qreal m11 = m_matrix[0][0] * o.m_matrix[0][0];
+ qreal m22 = m_matrix[1][1] * o.m_matrix[1][1];
- qreal m31 = affine._dx*o.affine._m11 + o.affine._dx;
- qreal m32 = affine._dy*o.affine._m22 + o.affine._dy;
+ qreal m31 = m_matrix[2][0] * o.m_matrix[0][0] + o.m_matrix[2][0];
+ qreal m32 = m_matrix[2][1] * o.m_matrix[1][1] + o.m_matrix[2][1];
- affine._m11 = m11;
- affine._m22 = m22;
- affine._dx = m31; affine._dy = m32;
+ m_matrix[0][0] = m11;
+ m_matrix[1][1] = m22;
+ m_matrix[2][0] = m31; m_matrix[2][1] = m32;
break;
}
case TxRotate:
case TxShear:
{
- qreal m11 = affine._m11*o.affine._m11 + affine._m12*o.affine._m21;
- qreal m12 = affine._m11*o.affine._m12 + affine._m12*o.affine._m22;
+ qreal m11 = m_matrix[0][0] * o.m_matrix[0][0] + m_matrix[0][1] * o.m_matrix[1][0];
+ qreal m12 = m_matrix[0][0] * o.m_matrix[0][1] + m_matrix[0][1] * o.m_matrix[1][1];
- qreal m21 = affine._m21*o.affine._m11 + affine._m22*o.affine._m21;
- qreal m22 = affine._m21*o.affine._m12 + affine._m22*o.affine._m22;
+ qreal m21 = m_matrix[1][0] * o.m_matrix[0][0] + m_matrix[1][1] * o.m_matrix[1][0];
+ qreal m22 = m_matrix[1][0] * o.m_matrix[0][1] + m_matrix[1][1] * o.m_matrix[1][1];
- qreal m31 = affine._dx*o.affine._m11 + affine._dy*o.affine._m21 + o.affine._dx;
- qreal m32 = affine._dx*o.affine._m12 + affine._dy*o.affine._m22 + o.affine._dy;
+ qreal m31 = m_matrix[2][0] * o.m_matrix[0][0] + m_matrix[2][1] * o.m_matrix[1][0] + o.m_matrix[2][0];
+ qreal m32 = m_matrix[2][0] * o.m_matrix[0][1] + m_matrix[2][1] * o.m_matrix[1][1] + o.m_matrix[2][1];
- affine._m11 = m11; affine._m12 = m12;
- affine._m21 = m21; affine._m22 = m22;
- affine._dx = m31; affine._dy = m32;
+ m_matrix[0][0] = m11;
+ m_matrix[0][1] = m12;
+ m_matrix[1][0] = m21;
+ m_matrix[1][1] = m22;
+ m_matrix[2][0] = m31;
+ m_matrix[2][1] = m32;
break;
}
case TxProject:
{
- qreal m11 = affine._m11*o.affine._m11 + affine._m12*o.affine._m21 + m_13*o.affine._dx;
- qreal m12 = affine._m11*o.affine._m12 + affine._m12*o.affine._m22 + m_13*o.affine._dy;
- qreal m13 = affine._m11*o.m_13 + affine._m12*o.m_23 + m_13*o.m_33;
+ qreal m11 = m_matrix[0][0] * o.m_matrix[0][0] + m_matrix[0][1] * o.m_matrix[1][0] + m_matrix[0][2] * o.m_matrix[2][0];
+ qreal m12 = m_matrix[0][0] * o.m_matrix[0][1] + m_matrix[0][1] * o.m_matrix[1][1] + m_matrix[0][2] * o.m_matrix[2][1];
+ qreal m13 = m_matrix[0][0] * o.m_matrix[0][2] + m_matrix[0][1] * o.m_matrix[1][2] + m_matrix[0][2] * o.m_matrix[2][2];
- qreal m21 = affine._m21*o.affine._m11 + affine._m22*o.affine._m21 + m_23*o.affine._dx;
- qreal m22 = affine._m21*o.affine._m12 + affine._m22*o.affine._m22 + m_23*o.affine._dy;
- qreal m23 = affine._m21*o.m_13 + affine._m22*o.m_23 + m_23*o.m_33;
+ qreal m21 = m_matrix[1][0] * o.m_matrix[0][0] + m_matrix[1][1] * o.m_matrix[1][0] + m_matrix[1][2] * o.m_matrix[2][0];
+ qreal m22 = m_matrix[1][0] * o.m_matrix[0][1] + m_matrix[1][1] * o.m_matrix[1][1] + m_matrix[1][2] * o.m_matrix[2][1];
+ qreal m23 = m_matrix[1][0] * o.m_matrix[0][2] + m_matrix[1][1] * o.m_matrix[1][2] + m_matrix[1][2] * o.m_matrix[2][2];
- qreal m31 = affine._dx*o.affine._m11 + affine._dy*o.affine._m21 + m_33*o.affine._dx;
- qreal m32 = affine._dx*o.affine._m12 + affine._dy*o.affine._m22 + m_33*o.affine._dy;
- qreal m33 = affine._dx*o.m_13 + affine._dy*o.m_23 + m_33*o.m_33;
+ qreal m31 = m_matrix[2][0] * o.m_matrix[0][0] + m_matrix[2][1] * o.m_matrix[1][0] + m_matrix[2][2] * o.m_matrix[2][0];
+ qreal m32 = m_matrix[2][0] * o.m_matrix[0][1] + m_matrix[2][1] * o.m_matrix[1][1] + m_matrix[2][2] * o.m_matrix[2][1];
+ qreal m33 = m_matrix[2][0] * o.m_matrix[0][2] + m_matrix[2][1] * o.m_matrix[1][2] + m_matrix[2][2] * o.m_matrix[2][2];
- affine._m11 = m11; affine._m12 = m12; m_13 = m13;
- affine._m21 = m21; affine._m22 = m22; m_23 = m23;
- affine._dx = m31; affine._dy = m32; m_33 = m33;
+ m_matrix[0][0] = m11; m_matrix[0][1] = m12; m_matrix[0][2] = m13;
+ m_matrix[1][0] = m21; m_matrix[1][1] = m22; m_matrix[1][2] = m23;
+ m_matrix[2][0] = m31; m_matrix[2][1] = m32; m_matrix[2][2] = m33;
}
}
@@ -937,56 +917,57 @@ QTransform QTransform::operator*(const QTransform &m) const
case TxNone:
break;
case TxTranslate:
- t.affine._dx = affine._dx + m.affine._dx;
- t.affine._dy += affine._dy + m.affine._dy;
+ t.m_matrix[2][0] = m_matrix[2][0] + m.m_matrix[2][0];
+ t.m_matrix[2][1] = m_matrix[2][1] + m.m_matrix[2][1];
break;
case TxScale:
{
- qreal m11 = affine._m11*m.affine._m11;
- qreal m22 = affine._m22*m.affine._m22;
+ qreal m11 = m_matrix[0][0] * m.m_matrix[0][0];
+ qreal m22 = m_matrix[1][1] * m.m_matrix[1][1];
- qreal m31 = affine._dx*m.affine._m11 + m.affine._dx;
- qreal m32 = affine._dy*m.affine._m22 + m.affine._dy;
+ qreal m31 = m_matrix[2][0] * m.m_matrix[0][0] + m.m_matrix[2][0];
+ qreal m32 = m_matrix[2][1] * m.m_matrix[1][1] + m.m_matrix[2][1];
- t.affine._m11 = m11;
- t.affine._m22 = m22;
- t.affine._dx = m31; t.affine._dy = m32;
+ t.m_matrix[0][0] = m11;
+ t.m_matrix[1][1] = m22;
+ t.m_matrix[2][0] = m31;
+ t.m_matrix[2][1] = m32;
break;
}
case TxRotate:
case TxShear:
{
- qreal m11 = affine._m11*m.affine._m11 + affine._m12*m.affine._m21;
- qreal m12 = affine._m11*m.affine._m12 + affine._m12*m.affine._m22;
+ qreal m11 = m_matrix[0][0] * m.m_matrix[0][0] + m_matrix[0][1] * m.m_matrix[1][0];
+ qreal m12 = m_matrix[0][0] * m.m_matrix[0][1] + m_matrix[0][1] * m.m_matrix[1][1];
- qreal m21 = affine._m21*m.affine._m11 + affine._m22*m.affine._m21;
- qreal m22 = affine._m21*m.affine._m12 + affine._m22*m.affine._m22;
+ qreal m21 = m_matrix[1][0] * m.m_matrix[0][0] + m_matrix[1][1] * m.m_matrix[1][0];
+ qreal m22 = m_matrix[1][0] * m.m_matrix[0][1] + m_matrix[1][1] * m.m_matrix[1][1];
- qreal m31 = affine._dx*m.affine._m11 + affine._dy*m.affine._m21 + m.affine._dx;
- qreal m32 = affine._dx*m.affine._m12 + affine._dy*m.affine._m22 + m.affine._dy;
+ qreal m31 = m_matrix[2][0] * m.m_matrix[0][0] + m_matrix[2][1] * m.m_matrix[1][0] + m.m_matrix[2][0];
+ qreal m32 = m_matrix[2][0] * m.m_matrix[0][1] + m_matrix[2][1] * m.m_matrix[1][1] + m.m_matrix[2][1];
- t.affine._m11 = m11; t.affine._m12 = m12;
- t.affine._m21 = m21; t.affine._m22 = m22;
- t.affine._dx = m31; t.affine._dy = m32;
+ t.m_matrix[0][0] = m11; t.m_matrix[0][1] = m12;
+ t.m_matrix[1][0] = m21; t.m_matrix[1][1] = m22;
+ t.m_matrix[2][0] = m31; t.m_matrix[2][1] = m32;
break;
}
case TxProject:
{
- qreal m11 = affine._m11*m.affine._m11 + affine._m12*m.affine._m21 + m_13*m.affine._dx;
- qreal m12 = affine._m11*m.affine._m12 + affine._m12*m.affine._m22 + m_13*m.affine._dy;
- qreal m13 = affine._m11*m.m_13 + affine._m12*m.m_23 + m_13*m.m_33;
+ qreal m11 = m_matrix[0][0] * m.m_matrix[0][0] + m_matrix[0][1] * m.m_matrix[1][0] + m_matrix[0][2] * m.m_matrix[2][0];
+ qreal m12 = m_matrix[0][0] * m.m_matrix[0][1] + m_matrix[0][1] * m.m_matrix[1][1] + m_matrix[0][2] * m.m_matrix[2][1];
+ qreal m13 = m_matrix[0][0] * m.m_matrix[0][2] + m_matrix[0][1] * m.m_matrix[1][2] + m_matrix[0][2] * m.m_matrix[2][2];
- qreal m21 = affine._m21*m.affine._m11 + affine._m22*m.affine._m21 + m_23*m.affine._dx;
- qreal m22 = affine._m21*m.affine._m12 + affine._m22*m.affine._m22 + m_23*m.affine._dy;
- qreal m23 = affine._m21*m.m_13 + affine._m22*m.m_23 + m_23*m.m_33;
+ qreal m21 = m_matrix[1][0] * m.m_matrix[0][0] + m_matrix[1][1] * m.m_matrix[1][0] + m_matrix[1][2] * m.m_matrix[2][0];
+ qreal m22 = m_matrix[1][0] * m.m_matrix[0][1] + m_matrix[1][1] * m.m_matrix[1][1] + m_matrix[1][2] * m.m_matrix[2][1];
+ qreal m23 = m_matrix[1][0] * m.m_matrix[0][2] + m_matrix[1][1] * m.m_matrix[1][2] + m_matrix[1][2] * m.m_matrix[2][2];
- qreal m31 = affine._dx*m.affine._m11 + affine._dy*m.affine._m21 + m_33*m.affine._dx;
- qreal m32 = affine._dx*m.affine._m12 + affine._dy*m.affine._m22 + m_33*m.affine._dy;
- qreal m33 = affine._dx*m.m_13 + affine._dy*m.m_23 + m_33*m.m_33;
+ qreal m31 = m_matrix[2][0] * m.m_matrix[0][0] + m_matrix[2][1] * m.m_matrix[1][0] + m_matrix[2][2] * m.m_matrix[2][0];
+ qreal m32 = m_matrix[2][0] * m.m_matrix[0][1] + m_matrix[2][1] * m.m_matrix[1][1] + m_matrix[2][2] * m.m_matrix[2][1];
+ qreal m33 = m_matrix[2][0] * m.m_matrix[0][2] + m_matrix[2][1] * m.m_matrix[1][2] + m_matrix[2][2] * m.m_matrix[2][2];
- t.affine._m11 = m11; t.affine._m12 = m12; t.m_13 = m13;
- t.affine._m21 = m21; t.affine._m22 = m22; t.m_23 = m23;
- t.affine._dx = m31; t.affine._dy = m32; t.m_33 = m33;
+ t.m_matrix[0][0] = m11; t.m_matrix[0][1] = m12; t.m_matrix[0][2] = m13;
+ t.m_matrix[1][0] = m21; t.m_matrix[1][1] = m22; t.m_matrix[1][2] = m23;
+ t.m_matrix[2][0] = m31; t.m_matrix[2][1] = m32; t.m_matrix[2][2] = m33;
}
}
@@ -1034,15 +1015,15 @@ QTransform QTransform::operator*(const QTransform &m) const
*/
QTransform & QTransform::operator=(const QTransform &matrix) noexcept
{
- affine._m11 = matrix.affine._m11;
- affine._m12 = matrix.affine._m12;
- affine._m21 = matrix.affine._m21;
- affine._m22 = matrix.affine._m22;
- affine._dx = matrix.affine._dx;
- affine._dy = matrix.affine._dy;
- m_13 = matrix.m_13;
- m_23 = matrix.m_23;
- m_33 = matrix.m_33;
+ m_matrix[0][0] = matrix.m_matrix[0][0];
+ m_matrix[0][1] = matrix.m_matrix[0][1];
+ m_matrix[1][0] = matrix.m_matrix[1][0];
+ m_matrix[1][1] = matrix.m_matrix[1][1];
+ m_matrix[2][0] = matrix.m_matrix[2][0];
+ m_matrix[2][1] = matrix.m_matrix[2][1];
+ m_matrix[0][2] = matrix.m_matrix[0][2];
+ m_matrix[1][2] = matrix.m_matrix[1][2];
+ m_matrix[2][2] = matrix.m_matrix[2][2];
m_type = matrix.m_type;
m_dirty = matrix.m_dirty;
@@ -1060,8 +1041,8 @@ QTransform & QTransform::operator=(const QTransform &matrix) noexcept
*/
void QTransform::reset()
{
- affine._m11 = affine._m22 = m_33 = 1.0;
- affine._m12 = m_13 = affine._m21 = m_23 = affine._dx = affine._dy = 0;
+ m_matrix[0][0] = m_matrix[1][1] = m_matrix[2][2] = 1.0;
+ m_matrix[0][1] = m_matrix[0][2] = m_matrix[1][0] = m_matrix[1][2] = m_matrix[2][0] = m_matrix[2][1] = 0;
m_type = TxNone;
m_dirty = TxNone;
}
@@ -1179,20 +1160,20 @@ QPoint QTransform::map(const QPoint &p) const
y = fy;
break;
case TxTranslate:
- x = fx + affine._dx;
- y = fy + affine._dy;
+ x = fx + m_matrix[2][0];
+ y = fy + m_matrix[2][1];
break;
case TxScale:
- x = affine._m11 * fx + affine._dx;
- y = affine._m22 * fy + affine._dy;
+ x = m_matrix[0][0] * fx + m_matrix[2][0];
+ y = m_matrix[1][1] * fy + m_matrix[2][1];
break;
case TxRotate:
case TxShear:
case TxProject:
- x = affine._m11 * fx + affine._m21 * fy + affine._dx;
- y = affine._m12 * fx + affine._m22 * fy + affine._dy;
+ x = m_matrix[0][0] * fx + m_matrix[1][0] * fy + m_matrix[2][0];
+ y = m_matrix[0][1] * fx + m_matrix[1][1] * fy + m_matrix[2][1];
if (t == TxProject) {
- qreal w = 1./(m_13 * fx + m_23 * fy + m_33);
+ qreal w = 1./(m_matrix[0][2] * fx + m_matrix[1][2] * fy + m_matrix[2][2]);
x *= w;
y *= w;
}
@@ -1230,20 +1211,20 @@ QPointF QTransform::map(const QPointF &p) const
y = fy;
break;
case TxTranslate:
- x = fx + affine._dx;
- y = fy + affine._dy;
+ x = fx + m_matrix[2][0];
+ y = fy + m_matrix[2][1];
break;
case TxScale:
- x = affine._m11 * fx + affine._dx;
- y = affine._m22 * fy + affine._dy;
+ x = m_matrix[0][0] * fx + m_matrix[2][0];
+ y = m_matrix[1][1] * fy + m_matrix[2][1];
break;
case TxRotate:
case TxShear:
case TxProject:
- x = affine._m11 * fx + affine._m21 * fy + affine._dx;
- y = affine._m12 * fx + affine._m22 * fy + affine._dy;
+ x = m_matrix[0][0] * fx + m_matrix[1][0] * fy + m_matrix[2][0];
+ y = m_matrix[0][1] * fx + m_matrix[1][1] * fy + m_matrix[2][1];
if (t == TxProject) {
- qreal w = 1./(m_13 * fx + m_23 * fy + m_33);
+ qreal w = 1./(m_matrix[0][2] * fx + m_matrix[1][2] * fy + m_matrix[2][2]);
x *= w;
y *= w;
}
@@ -1303,29 +1284,29 @@ QLine QTransform::map(const QLine &l) const
y2 = fy2;
break;
case TxTranslate:
- x1 = fx1 + affine._dx;
- y1 = fy1 + affine._dy;
- x2 = fx2 + affine._dx;
- y2 = fy2 + affine._dy;
+ x1 = fx1 + m_matrix[2][0];
+ y1 = fy1 + m_matrix[2][1];
+ x2 = fx2 + m_matrix[2][0];
+ y2 = fy2 + m_matrix[2][1];
break;
case TxScale:
- x1 = affine._m11 * fx1 + affine._dx;
- y1 = affine._m22 * fy1 + affine._dy;
- x2 = affine._m11 * fx2 + affine._dx;
- y2 = affine._m22 * fy2 + affine._dy;
+ x1 = m_matrix[0][0] * fx1 + m_matrix[2][0];
+ y1 = m_matrix[1][1] * fy1 + m_matrix[2][1];
+ x2 = m_matrix[0][0] * fx2 + m_matrix[2][0];
+ y2 = m_matrix[1][1] * fy2 + m_matrix[2][1];
break;
case TxRotate:
case TxShear:
case TxProject:
- x1 = affine._m11 * fx1 + affine._m21 * fy1 + affine._dx;
- y1 = affine._m12 * fx1 + affine._m22 * fy1 + affine._dy;
- x2 = affine._m11 * fx2 + affine._m21 * fy2 + affine._dx;
- y2 = affine._m12 * fx2 + affine._m22 * fy2 + affine._dy;
+ x1 = m_matrix[0][0] * fx1 + m_matrix[1][0] * fy1 + m_matrix[2][0];
+ y1 = m_matrix[0][1] * fx1 + m_matrix[1][1] * fy1 + m_matrix[2][1];
+ x2 = m_matrix[0][0] * fx2 + m_matrix[1][0] * fy2 + m_matrix[2][0];
+ y2 = m_matrix[0][1] * fx2 + m_matrix[1][1] * fy2 + m_matrix[2][1];
if (t == TxProject) {
- qreal w = 1./(m_13 * fx1 + m_23 * fy1 + m_33);
+ qreal w = 1./(m_matrix[0][2] * fx1 + m_matrix[1][2] * fy1 + m_matrix[2][2]);
x1 *= w;
y1 *= w;
- w = 1./(m_13 * fx2 + m_23 * fy2 + m_33);
+ w = 1./(m_matrix[0][2] * fx2 + m_matrix[1][2] * fy2 + m_matrix[2][2]);
x2 *= w;
y2 *= w;
}
@@ -1362,29 +1343,29 @@ QLineF QTransform::map(const QLineF &l) const
y2 = fy2;
break;
case TxTranslate:
- x1 = fx1 + affine._dx;
- y1 = fy1 + affine._dy;
- x2 = fx2 + affine._dx;
- y2 = fy2 + affine._dy;
+ x1 = fx1 + m_matrix[2][0];
+ y1 = fy1 + m_matrix[2][1];
+ x2 = fx2 + m_matrix[2][0];
+ y2 = fy2 + m_matrix[2][1];
break;
case TxScale:
- x1 = affine._m11 * fx1 + affine._dx;
- y1 = affine._m22 * fy1 + affine._dy;
- x2 = affine._m11 * fx2 + affine._dx;
- y2 = affine._m22 * fy2 + affine._dy;
+ x1 = m_matrix[0][0] * fx1 + m_matrix[2][0];
+ y1 = m_matrix[1][1] * fy1 + m_matrix[2][1];
+ x2 = m_matrix[0][0] * fx2 + m_matrix[2][0];
+ y2 = m_matrix[1][1] * fy2 + m_matrix[2][1];
break;
case TxRotate:
case TxShear:
case TxProject:
- x1 = affine._m11 * fx1 + affine._m21 * fy1 + affine._dx;
- y1 = affine._m12 * fx1 + affine._m22 * fy1 + affine._dy;
- x2 = affine._m11 * fx2 + affine._m21 * fy2 + affine._dx;
- y2 = affine._m12 * fx2 + affine._m22 * fy2 + affine._dy;
+ x1 = m_matrix[0][0] * fx1 + m_matrix[1][0] * fy1 + m_matrix[2][0];
+ y1 = m_matrix[0][1] * fx1 + m_matrix[1][1] * fy1 + m_matrix[2][1];
+ x2 = m_matrix[0][0] * fx2 + m_matrix[1][0] * fy2 + m_matrix[2][0];
+ y2 = m_matrix[0][1] * fx2 + m_matrix[1][1] * fy2 + m_matrix[2][1];
if (t == TxProject) {
- qreal w = 1./(m_13 * fx1 + m_23 * fy1 + m_33);
+ qreal w = 1./(m_matrix[0][2] * fx1 + m_matrix[1][2] * fy1 + m_matrix[2][2]);
x1 *= w;
y1 *= w;
- w = 1./(m_13 * fx2 + m_23 * fy2 + m_33);
+ w = 1./(m_matrix[0][2] * fx2 + m_matrix[1][2] * fy2 + m_matrix[2][2]);
x2 *= w;
y2 *= w;
}
@@ -1445,7 +1426,7 @@ QPolygonF QTransform::map(const QPolygonF &a) const
{
TransformationType t = inline_type();
if (t <= TxTranslate)
- return a.translated(affine._dx, affine._dy);
+ return a.translated(m_matrix[2][0], m_matrix[2][1]);
if (t >= QTransform::TxProject)
return mapProjective(*this, a);
@@ -1475,7 +1456,7 @@ QPolygon QTransform::map(const QPolygon &a) const
{
TransformationType t = inline_type();
if (t <= TxTranslate)
- return a.translated(qRound(affine._dx), qRound(affine._dy));
+ return a.translated(qRound(m_matrix[2][0]), qRound(m_matrix[2][1]));
if (t >= QTransform::TxProject)
return mapProjective(*this, QPolygonF(a)).toPolygon();
@@ -1524,7 +1505,7 @@ QRegion QTransform::map(const QRegion &r) const
if (t == TxTranslate) {
QRegion copy(r);
- copy.translate(qRound(affine._dx), qRound(affine._dy));
+ copy.translate(qRound(m_matrix[2][0]), qRound(m_matrix[2][1]));
return copy;
}
@@ -1547,7 +1528,7 @@ QRegion QTransform::map(const QRegion &r) const
}
QPainterPath p = map(qt_regionToPath(r));
- return p.toFillPolygon(QTransform()).toPolygon();
+ return p.toFillPolygon().toPolygon();
}
struct QHomogeneousCoordinate
@@ -1703,7 +1684,7 @@ QPainterPath QTransform::map(const QPainterPath &path) const
QPainterPath copy = path;
if (t == TxTranslate) {
- copy.translate(affine._dx, affine._dy);
+ copy.translate(m_matrix[2][0], m_matrix[2][1]);
} else {
copy.detach();
// Full xform
@@ -1743,10 +1724,10 @@ QPolygon QTransform::mapToPolygon(const QRect &rect) const
QPolygon a(4);
qreal x[4] = { 0, 0, 0, 0 }, y[4] = { 0, 0, 0, 0 };
if (t <= TxScale) {
- x[0] = affine._m11*rect.x() + affine._dx;
- y[0] = affine._m22*rect.y() + affine._dy;
- qreal w = affine._m11*rect.width();
- qreal h = affine._m22*rect.height();
+ x[0] = m_matrix[0][0]*rect.x() + m_matrix[2][0];
+ y[0] = m_matrix[1][1]*rect.y() + m_matrix[2][1];
+ qreal w = m_matrix[0][0]*rect.width();
+ qreal h = m_matrix[1][1]*rect.height();
if (w < 0) {
w = -w;
x[0] -= w;
@@ -1903,9 +1884,9 @@ void QTransform::setMatrix(qreal m11, qreal m12, qreal m13,
qreal m21, qreal m22, qreal m23,
qreal m31, qreal m32, qreal m33)
{
- affine._m11 = m11; affine._m12 = m12; m_13 = m13;
- affine._m21 = m21; affine._m22 = m22; m_23 = m23;
- affine._dx = m31; affine._dy = m32; m_33 = m33;
+ m_matrix[0][0] = m11; m_matrix[0][1] = m12; m_matrix[0][2] = m13;
+ m_matrix[1][0] = m21; m_matrix[1][1] = m22; m_matrix[1][2] = m23;
+ m_matrix[2][0] = m31; m_matrix[2][1] = m32; m_matrix[2][2] = m33;
m_type = TxNone;
m_dirty = TxProject;
}
@@ -1922,13 +1903,13 @@ QRect QTransform::mapRect(const QRect &rect) const
{
TransformationType t = inline_type();
if (t <= TxTranslate)
- return rect.translated(qRound(affine._dx), qRound(affine._dy));
+ return rect.translated(qRound(m_matrix[2][0]), qRound(m_matrix[2][1]));
if (t <= TxScale) {
- int x = qRound(affine._m11*rect.x() + affine._dx);
- int y = qRound(affine._m22*rect.y() + affine._dy);
- int w = qRound(affine._m11*rect.width());
- int h = qRound(affine._m22*rect.height());
+ int x = qRound(m_matrix[0][0] * rect.x() + m_matrix[2][0]);
+ int y = qRound(m_matrix[1][1] * rect.y() + m_matrix[2][1]);
+ int w = qRound(m_matrix[0][0] * rect.width());
+ int h = qRound(m_matrix[1][1] * rect.height());
if (w < 0) {
w = -w;
x -= w;
@@ -1992,13 +1973,13 @@ QRectF QTransform::mapRect(const QRectF &rect) const
{
TransformationType t = inline_type();
if (t <= TxTranslate)
- return rect.translated(affine._dx, affine._dy);
+ return rect.translated(m_matrix[2][0], m_matrix[2][1]);
if (t <= TxScale) {
- qreal x = affine._m11*rect.x() + affine._dx;
- qreal y = affine._m22*rect.y() + affine._dy;
- qreal w = affine._m11*rect.width();
- qreal h = affine._m22*rect.height();
+ qreal x = m_matrix[0][0] * rect.x() + m_matrix[2][0];
+ qreal y = m_matrix[1][1] * rect.y() + m_matrix[2][1];
+ qreal w = m_matrix[0][0] * rect.width();
+ qreal h = m_matrix[1][1] * rect.height();
if (w < 0) {
w = -w;
x -= w;
@@ -2085,20 +2066,6 @@ void QTransform::map(int x, int y, int *tx, int *ty) const
*ty = qRound(fy);
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \obsolete
- Returns the QTransform as an affine matrix.
-
- \warning If a perspective transformation has been specified,
- then the conversion will cause loss of data.
-*/
-const QMatrix &QTransform::toAffine() const
-{
- return affine;
-}
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
/*!
Returns the transformation type of this matrix.
@@ -2118,15 +2085,15 @@ QTransform::TransformationType QTransform::type() const
switch (static_cast<TransformationType>(m_dirty)) {
case TxProject:
- if (!qFuzzyIsNull(m_13) || !qFuzzyIsNull(m_23) || !qFuzzyIsNull(m_33 - 1)) {
+ if (!qFuzzyIsNull(m_matrix[0][2]) || !qFuzzyIsNull(m_matrix[1][2]) || !qFuzzyIsNull(m_matrix[2][2] - 1)) {
m_type = TxProject;
break;
}
Q_FALLTHROUGH();
case TxShear:
case TxRotate:
- if (!qFuzzyIsNull(affine._m12) || !qFuzzyIsNull(affine._m21)) {
- const qreal dot = affine._m11 * affine._m12 + affine._m21 * affine._m22;
+ if (!qFuzzyIsNull(m_matrix[0][1]) || !qFuzzyIsNull(m_matrix[1][0])) {
+ const qreal dot = m_matrix[0][0] * m_matrix[0][1] + m_matrix[1][0] * m_matrix[1][1];
if (qFuzzyIsNull(dot))
m_type = TxRotate;
else
@@ -2135,13 +2102,13 @@ QTransform::TransformationType QTransform::type() const
}
Q_FALLTHROUGH();
case TxScale:
- if (!qFuzzyIsNull(affine._m11 - 1) || !qFuzzyIsNull(affine._m22 - 1)) {
+ if (!qFuzzyIsNull(m_matrix[0][0] - 1) || !qFuzzyIsNull(m_matrix[1][1] - 1)) {
m_type = TxScale;
break;
}
Q_FALLTHROUGH();
case TxTranslate:
- if (!qFuzzyIsNull(affine._dx) || !qFuzzyIsNull(affine._dy)) {
+ if (!qFuzzyIsNull(m_matrix[2][0]) || !qFuzzyIsNull(m_matrix[2][1])) {
m_type = TxTranslate;
break;
}
@@ -2390,4 +2357,50 @@ bool qt_scaleForTransform(const QTransform &transform, qreal *scale)
}
}
+QDataStream & operator>>(QDataStream &s, QTransform::Affine &m)
+{
+ if (s.version() == 1) {
+ float m11, m12, m21, m22, dx, dy;
+ s >> m11; s >> m12; s >> m21; s >> m22; s >> dx; s >> dy;
+
+ m.m_matrix[0][0] = m11;
+ m.m_matrix[0][1] = m12;
+ m.m_matrix[1][0] = m21;
+ m.m_matrix[1][1] = m22;
+ m.m_matrix[2][0] = dx;
+ m.m_matrix[2][1] = dy;
+ } else {
+ s >> m.m_matrix[0][0];
+ s >> m.m_matrix[0][1];
+ s >> m.m_matrix[1][0];
+ s >> m.m_matrix[1][1];
+ s >> m.m_matrix[2][0];
+ s >> m.m_matrix[2][1];
+ }
+ m.m_matrix[0][2] = 0;
+ m.m_matrix[1][2] = 0;
+ m.m_matrix[2][2] = 1;
+ return s;
+}
+
+QDataStream &operator<<(QDataStream &s, const QTransform::Affine &m)
+{
+ if (s.version() == 1) {
+ s << (float)m.m_matrix[0][0]
+ << (float)m.m_matrix[0][1]
+ << (float)m.m_matrix[1][0]
+ << (float)m.m_matrix[1][1]
+ << (float)m.m_matrix[2][0]
+ << (float)m.m_matrix[2][1];
+ } else {
+ s << m.m_matrix[0][0]
+ << m.m_matrix[0][1]
+ << m.m_matrix[1][0]
+ << m.m_matrix[1][1]
+ << m.m_matrix[2][0]
+ << m.m_matrix[2][1];
+ }
+ return s;
+}
+
QT_END_NAMESPACE
diff --git a/src/gui/painting/qtransform.h b/src/gui/painting/qtransform.h
index 41cbfc35f2..6e04559c1b 100644
--- a/src/gui/painting/qtransform.h
+++ b/src/gui/painting/qtransform.h
@@ -40,7 +40,6 @@
#define QTRANSFORM_H
#include <QtGui/qtguiglobal.h>
-#include <QtGui/qmatrix.h>
#include <QtGui/qpolygon.h>
#include <QtGui/qregion.h>
#include <QtGui/qwindowdefs.h>
@@ -65,16 +64,13 @@ public:
TxProject = 0x10
};
- inline explicit QTransform(Qt::Initialization) : affine(Qt::Uninitialized) {}
+ inline explicit QTransform(Qt::Initialization) {}
QTransform();
QTransform(qreal h11, qreal h12, qreal h13,
qreal h21, qreal h22, qreal h23,
qreal h31, qreal h32, qreal h33 = 1.0);
QTransform(qreal h11, qreal h12, qreal h21,
qreal h22, qreal dx, qreal dy);
-#if QT_DEPRECATED_SINCE(5, 15)
- explicit QTransform(const QMatrix &mtx);
-#endif // QT_DEPRECATED_SINCE(5, 15)
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
// ### Qt 6: remove; the compiler-generated ones are fine!
@@ -159,10 +155,6 @@ public:
void map(int x, int y, int *tx, int *ty) const;
void map(qreal x, qreal y, qreal *tx, qreal *ty) const;
-#if QT_DEPRECATED_SINCE(5, 15)
- const QMatrix &toAffine() const;
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
QTransform &operator*=(qreal div);
QTransform &operator/=(qreal div);
QTransform &operator+=(qreal div);
@@ -172,11 +164,20 @@ public:
static QTransform fromScale(qreal dx, qreal dy);
private:
+ struct Affine {
+ qreal (& m_matrix)[3][3];
+ };
+
+public:
+ auto asAffineMatrix() { return Affine { m_matrix }; }
+ friend Q_GUI_EXPORT QDataStream &operator>>(QDataStream &s, Affine &m);
+ friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &s, const Affine &m);
+
+private:
inline QTransform(qreal h11, qreal h12, qreal h13,
qreal h21, qreal h22, qreal h23,
qreal h31, qreal h32, qreal h33, bool)
- : affine(h11, h12, h21, h22, h31, h32, true)
- , m_13(h13), m_23(h23), m_33(h33)
+ : m_matrix{ {h11, h12, h13}, {h21, h22, h23}, {h31, h32, h33} }
, m_type(TxNone)
, m_dirty(TxProject)
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
@@ -185,8 +186,7 @@ private:
{
}
inline QTransform(bool)
- : affine(true)
- , m_13(0), m_23(0), m_33(1)
+ : m_matrix{ {1, 0, 0}, {0, 1, 0}, {0, 0, 1} }
, m_type(TxNone)
, m_dirty(TxNone)
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
@@ -195,10 +195,7 @@ private:
{
}
inline TransformationType inline_type() const;
- QMatrix affine;
- qreal m_13;
- qreal m_23;
- qreal m_33;
+ qreal m_matrix[3][3];
mutable uint m_type : 5;
mutable uint m_dirty : 5;
@@ -209,7 +206,7 @@ private:
};
Q_DECLARE_TYPEINFO(QTransform, Q_MOVABLE_TYPE);
-Q_GUI_EXPORT Q_DECL_CONST_FUNCTION uint qHash(const QTransform &key, uint seed = 0) noexcept;
+Q_GUI_EXPORT Q_DECL_CONST_FUNCTION size_t qHash(const QTransform &key, size_t seed = 0) noexcept;
/******* inlines *****/
inline QTransform::TransformationType QTransform::inline_type() const
@@ -249,8 +246,9 @@ inline bool QTransform::isTranslating() const
inline qreal QTransform::determinant() const
{
- return affine._m11*(m_33*affine._m22-affine._dy*m_23) -
- affine._m21*(m_33*affine._m12-affine._dy*m_13)+affine._dx*(m_23*affine._m12-affine._m22*m_13);
+ return m_matrix[0][0] * (m_matrix[2][2] * m_matrix[1][1] - m_matrix[2][1] * m_matrix[1][2]) -
+ m_matrix[1][0] * (m_matrix[2][2] * m_matrix[0][1] - m_matrix[2][1] * m_matrix[0][2]) +
+ m_matrix[2][0] * (m_matrix[1][2] * m_matrix[0][1] - m_matrix[1][1] * m_matrix[0][2]);
}
#if QT_DEPRECATED_SINCE(5, 13)
inline qreal QTransform::det() const
@@ -260,47 +258,47 @@ inline qreal QTransform::det() const
#endif
inline qreal QTransform::m11() const
{
- return affine._m11;
+ return m_matrix[0][0];
}
inline qreal QTransform::m12() const
{
- return affine._m12;
+ return m_matrix[0][1];
}
inline qreal QTransform::m13() const
{
- return m_13;
+ return m_matrix[0][2];
}
inline qreal QTransform::m21() const
{
- return affine._m21;
+ return m_matrix[1][0];
}
inline qreal QTransform::m22() const
{
- return affine._m22;
+ return m_matrix[1][1];
}
inline qreal QTransform::m23() const
{
- return m_23;
+ return m_matrix[1][2];
}
inline qreal QTransform::m31() const
{
- return affine._dx;
+ return m_matrix[2][0];
}
inline qreal QTransform::m32() const
{
- return affine._dy;
+ return m_matrix[2][1];
}
inline qreal QTransform::m33() const
{
- return m_33;
+ return m_matrix[2][2];
}
inline qreal QTransform::dx() const
{
- return affine._dx;
+ return m_matrix[2][0];
}
inline qreal QTransform::dy() const
{
- return affine._dy;
+ return m_matrix[2][1];
}
QT_WARNING_PUSH
@@ -312,15 +310,15 @@ inline QTransform &QTransform::operator*=(qreal num)
{
if (num == 1.)
return *this;
- affine._m11 *= num;
- affine._m12 *= num;
- m_13 *= num;
- affine._m21 *= num;
- affine._m22 *= num;
- m_23 *= num;
- affine._dx *= num;
- affine._dy *= num;
- m_33 *= num;
+ m_matrix[0][0] *= num;
+ m_matrix[0][1] *= num;
+ m_matrix[0][2] *= num;
+ m_matrix[1][0] *= num;
+ m_matrix[1][1] *= num;
+ m_matrix[1][2] *= num;
+ m_matrix[2][0] *= num;
+ m_matrix[2][1] *= num;
+ m_matrix[2][2] *= num;
if (m_dirty < TxScale)
m_dirty = TxScale;
return *this;
@@ -336,15 +334,15 @@ inline QTransform &QTransform::operator+=(qreal num)
{
if (num == 0)
return *this;
- affine._m11 += num;
- affine._m12 += num;
- m_13 += num;
- affine._m21 += num;
- affine._m22 += num;
- m_23 += num;
- affine._dx += num;
- affine._dy += num;
- m_33 += num;
+ m_matrix[0][0] += num;
+ m_matrix[0][1] += num;
+ m_matrix[0][2] += num;
+ m_matrix[1][0] += num;
+ m_matrix[1][1] += num;
+ m_matrix[1][2] += num;
+ m_matrix[2][0] += num;
+ m_matrix[2][1] += num;
+ m_matrix[2][2] += num;
m_dirty = TxProject;
return *this;
}
@@ -352,15 +350,15 @@ inline QTransform &QTransform::operator-=(qreal num)
{
if (num == 0)
return *this;
- affine._m11 -= num;
- affine._m12 -= num;
- m_13 -= num;
- affine._m21 -= num;
- affine._m22 -= num;
- m_23 -= num;
- affine._dx -= num;
- affine._dy -= num;
- m_33 -= num;
+ m_matrix[0][0] -= num;
+ m_matrix[0][1] -= num;
+ m_matrix[0][2] -= num;
+ m_matrix[1][0] -= num;
+ m_matrix[1][1] -= num;
+ m_matrix[1][2] -= num;
+ m_matrix[2][0] -= num;
+ m_matrix[2][1] -= num;
+ m_matrix[2][2] -= num;
m_dirty = TxProject;
return *this;
}
diff --git a/src/gui/rhi/qrhi.cpp b/src/gui/rhi/qrhi.cpp
index 83c1e8eaa2..7d2af37e96 100644
--- a/src/gui/rhi/qrhi.cpp
+++ b/src/gui/rhi/qrhi.cpp
@@ -711,7 +711,7 @@ bool operator!=(const QRhiDepthStencilClearValue &a, const QRhiDepthStencilClear
\relates QRhiDepthStencilClearValue
*/
-uint qHash(const QRhiDepthStencilClearValue &v, uint seed) Q_DECL_NOTHROW
+size_t qHash(const QRhiDepthStencilClearValue &v, size_t seed) Q_DECL_NOTHROW
{
return seed * (uint(qFloor(qreal(v.depthClearValue()) * 100)) + v.stencilClearValue());
}
@@ -807,7 +807,7 @@ bool operator!=(const QRhiViewport &a, const QRhiViewport &b) Q_DECL_NOTHROW
\relates QRhiViewport
*/
-uint qHash(const QRhiViewport &v, uint seed) Q_DECL_NOTHROW
+size_t qHash(const QRhiViewport &v, size_t seed) Q_DECL_NOTHROW
{
const std::array<float, 4> r = v.viewport();
return seed + uint(r[0]) + uint(r[1]) + uint(r[2]) + uint(r[3])
@@ -898,7 +898,7 @@ bool operator!=(const QRhiScissor &a, const QRhiScissor &b) Q_DECL_NOTHROW
\relates QRhiScissor
*/
-uint qHash(const QRhiScissor &v, uint seed) Q_DECL_NOTHROW
+size_t qHash(const QRhiScissor &v, size_t seed) Q_DECL_NOTHROW
{
const std::array<int, 4> r = v.scissor();
return seed + uint(r[0]) + uint(r[1]) + uint(r[2]) + uint(r[3]);
@@ -1032,7 +1032,7 @@ bool operator!=(const QRhiVertexInputBinding &a, const QRhiVertexInputBinding &b
\relates QRhiVertexInputBinding
*/
-uint qHash(const QRhiVertexInputBinding &v, uint seed) Q_DECL_NOTHROW
+size_t qHash(const QRhiVertexInputBinding &v, size_t seed) Q_DECL_NOTHROW
{
return seed + v.stride() + v.classification();
}
@@ -1185,7 +1185,7 @@ bool operator!=(const QRhiVertexInputAttribute &a, const QRhiVertexInputAttribut
\relates QRhiVertexInputAttribute
*/
-uint qHash(const QRhiVertexInputAttribute &v, uint seed) Q_DECL_NOTHROW
+size_t qHash(const QRhiVertexInputAttribute &v, size_t seed) Q_DECL_NOTHROW
{
return seed + uint(v.binding()) + uint(v.location()) + uint(v.format()) + v.offset();
}
@@ -1246,13 +1246,13 @@ bool operator!=(const QRhiVertexInputLayout &a, const QRhiVertexInputLayout &b)
\relates QRhiVertexInputLayout
*/
-uint qHash(const QRhiVertexInputLayout &v, uint seed) Q_DECL_NOTHROW
+size_t qHash(const QRhiVertexInputLayout &v, size_t seed) Q_DECL_NOTHROW
{
return qHash(v.m_bindings, seed) + qHash(v.m_attributes, seed);
}
#ifndef QT_NO_DEBUG_STREAM
-template<typename T, int N>
+template<typename T, qsizetype N>
QDebug operator<<(QDebug dbg, const QVarLengthArray<T, N> &vla)
{
return QtPrivate::printSequentialContainer(dbg, "VLA", vla);
@@ -1336,7 +1336,7 @@ bool operator!=(const QRhiShaderStage &a, const QRhiShaderStage &b) Q_DECL_NOTHR
\relates QRhiShaderStage
*/
-uint qHash(const QRhiShaderStage &v, uint seed) Q_DECL_NOTHROW
+size_t qHash(const QRhiShaderStage &v, size_t seed) Q_DECL_NOTHROW
{
return v.type() + qHash(v.shader(), seed) + v.shaderVariant();
}
@@ -3182,7 +3182,7 @@ bool operator!=(const QRhiShaderResourceBinding &a, const QRhiShaderResourceBind
\relates QRhiShaderResourceBinding
*/
-uint qHash(const QRhiShaderResourceBinding &b, uint seed) Q_DECL_NOTHROW
+size_t qHash(const QRhiShaderResourceBinding &b, size_t seed) Q_DECL_NOTHROW
{
const QRhiShaderResourceBinding::Data *d = b.data();
return seed + uint(d->binding) + 10 * uint(d->stage) + 100 * uint(d->type)
diff --git a/src/gui/rhi/qrhi_p.h b/src/gui/rhi/qrhi_p.h
index 9d906d7bbd..5c4cf4a144 100644
--- a/src/gui/rhi/qrhi_p.h
+++ b/src/gui/rhi/qrhi_p.h
@@ -94,7 +94,7 @@ Q_DECLARE_TYPEINFO(QRhiDepthStencilClearValue, Q_MOVABLE_TYPE);
Q_GUI_EXPORT bool operator==(const QRhiDepthStencilClearValue &a, const QRhiDepthStencilClearValue &b) Q_DECL_NOTHROW;
Q_GUI_EXPORT bool operator!=(const QRhiDepthStencilClearValue &a, const QRhiDepthStencilClearValue &b) Q_DECL_NOTHROW;
-Q_GUI_EXPORT uint qHash(const QRhiDepthStencilClearValue &v, uint seed = 0) Q_DECL_NOTHROW;
+Q_GUI_EXPORT size_t qHash(const QRhiDepthStencilClearValue &v, size_t seed = 0) Q_DECL_NOTHROW;
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiDepthStencilClearValue &);
#endif
@@ -126,7 +126,7 @@ Q_DECLARE_TYPEINFO(QRhiViewport, Q_MOVABLE_TYPE);
Q_GUI_EXPORT bool operator==(const QRhiViewport &a, const QRhiViewport &b) Q_DECL_NOTHROW;
Q_GUI_EXPORT bool operator!=(const QRhiViewport &a, const QRhiViewport &b) Q_DECL_NOTHROW;
-Q_GUI_EXPORT uint qHash(const QRhiViewport &v, uint seed = 0) Q_DECL_NOTHROW;
+Q_GUI_EXPORT size_t qHash(const QRhiViewport &v, size_t seed = 0) Q_DECL_NOTHROW;
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiViewport &);
#endif
@@ -150,7 +150,7 @@ Q_DECLARE_TYPEINFO(QRhiScissor, Q_MOVABLE_TYPE);
Q_GUI_EXPORT bool operator==(const QRhiScissor &a, const QRhiScissor &b) Q_DECL_NOTHROW;
Q_GUI_EXPORT bool operator!=(const QRhiScissor &a, const QRhiScissor &b) Q_DECL_NOTHROW;
-Q_GUI_EXPORT uint qHash(const QRhiScissor &v, uint seed = 0) Q_DECL_NOTHROW;
+Q_GUI_EXPORT size_t qHash(const QRhiScissor &v, size_t seed = 0) Q_DECL_NOTHROW;
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiScissor &);
#endif
@@ -185,7 +185,7 @@ Q_DECLARE_TYPEINFO(QRhiVertexInputBinding, Q_MOVABLE_TYPE);
Q_GUI_EXPORT bool operator==(const QRhiVertexInputBinding &a, const QRhiVertexInputBinding &b) Q_DECL_NOTHROW;
Q_GUI_EXPORT bool operator!=(const QRhiVertexInputBinding &a, const QRhiVertexInputBinding &b) Q_DECL_NOTHROW;
-Q_GUI_EXPORT uint qHash(const QRhiVertexInputBinding &v, uint seed = 0) Q_DECL_NOTHROW;
+Q_GUI_EXPORT size_t qHash(const QRhiVertexInputBinding &v, size_t seed = 0) Q_DECL_NOTHROW;
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiVertexInputBinding &);
#endif
@@ -229,7 +229,7 @@ Q_DECLARE_TYPEINFO(QRhiVertexInputAttribute, Q_MOVABLE_TYPE);
Q_GUI_EXPORT bool operator==(const QRhiVertexInputAttribute &a, const QRhiVertexInputAttribute &b) Q_DECL_NOTHROW;
Q_GUI_EXPORT bool operator!=(const QRhiVertexInputAttribute &a, const QRhiVertexInputAttribute &b) Q_DECL_NOTHROW;
-Q_GUI_EXPORT uint qHash(const QRhiVertexInputAttribute &v, uint seed = 0) Q_DECL_NOTHROW;
+Q_GUI_EXPORT size_t qHash(const QRhiVertexInputAttribute &v, size_t seed = 0) Q_DECL_NOTHROW;
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiVertexInputAttribute &);
#endif
@@ -265,7 +265,7 @@ private:
QVarLengthArray<QRhiVertexInputAttribute, 8> m_attributes;
friend Q_GUI_EXPORT bool operator==(const QRhiVertexInputLayout &a, const QRhiVertexInputLayout &b) Q_DECL_NOTHROW;
- friend Q_GUI_EXPORT uint qHash(const QRhiVertexInputLayout &v, uint seed) Q_DECL_NOTHROW;
+ friend Q_GUI_EXPORT size_t qHash(const QRhiVertexInputLayout &v, size_t seed) Q_DECL_NOTHROW;
friend Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiVertexInputLayout &);
};
@@ -273,7 +273,7 @@ Q_DECLARE_TYPEINFO(QRhiVertexInputLayout, Q_MOVABLE_TYPE);
Q_GUI_EXPORT bool operator==(const QRhiVertexInputLayout &a, const QRhiVertexInputLayout &b) Q_DECL_NOTHROW;
Q_GUI_EXPORT bool operator!=(const QRhiVertexInputLayout &a, const QRhiVertexInputLayout &b) Q_DECL_NOTHROW;
-Q_GUI_EXPORT uint qHash(const QRhiVertexInputLayout &v, uint seed = 0) Q_DECL_NOTHROW;
+Q_GUI_EXPORT size_t qHash(const QRhiVertexInputLayout &v, size_t seed = 0) Q_DECL_NOTHROW;
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiVertexInputLayout &);
#endif
@@ -310,7 +310,7 @@ Q_DECLARE_TYPEINFO(QRhiShaderStage, Q_MOVABLE_TYPE);
Q_GUI_EXPORT bool operator==(const QRhiShaderStage &a, const QRhiShaderStage &b) Q_DECL_NOTHROW;
Q_GUI_EXPORT bool operator!=(const QRhiShaderStage &a, const QRhiShaderStage &b) Q_DECL_NOTHROW;
-Q_GUI_EXPORT uint qHash(const QRhiShaderStage &s, uint seed = 0) Q_DECL_NOTHROW;
+Q_GUI_EXPORT size_t qHash(const QRhiShaderStage &s, size_t seed = 0) Q_DECL_NOTHROW;
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiShaderStage &);
#endif
@@ -411,7 +411,7 @@ Q_DECLARE_TYPEINFO(QRhiShaderResourceBinding, Q_MOVABLE_TYPE);
Q_GUI_EXPORT bool operator==(const QRhiShaderResourceBinding &a, const QRhiShaderResourceBinding &b) Q_DECL_NOTHROW;
Q_GUI_EXPORT bool operator!=(const QRhiShaderResourceBinding &a, const QRhiShaderResourceBinding &b) Q_DECL_NOTHROW;
-Q_GUI_EXPORT uint qHash(const QRhiShaderResourceBinding &b, uint seed = 0) Q_DECL_NOTHROW;
+Q_GUI_EXPORT size_t qHash(const QRhiShaderResourceBinding &b, size_t seed = 0) Q_DECL_NOTHROW;
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiShaderResourceBinding &);
#endif
diff --git a/src/gui/rhi/qrhid3d11.cpp b/src/gui/rhi/qrhid3d11.cpp
index ed202958f3..0665304a19 100644
--- a/src/gui/rhi/qrhid3d11.cpp
+++ b/src/gui/rhi/qrhid3d11.cpp
@@ -4161,7 +4161,7 @@ bool QD3D11SwapChain::buildOrResize()
qWarning("Failed to create D3D11 swapchain: %s", qPrintable(comErrorMessage(hr)));
return false;
}
- rhiD->dxgiFactory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER);
+ rhiD->dxgiFactory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_WINDOW_CHANGES);
} else {
releaseBuffers();
const UINT count = useFlipDiscard ? BUFFER_COUNT : 1;
diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp
index 395ae4b93f..227dace90f 100644
--- a/src/gui/rhi/qrhigles2.cpp
+++ b/src/gui/rhi/qrhigles2.cpp
@@ -289,8 +289,6 @@ QT_BEGIN_NAMESPACE
#define GL_MAP_READ_BIT 0x0001
#endif
-Q_DECLARE_LOGGING_CATEGORY(lcOpenGLProgramDiskCache)
-
/*!
Constructs a new QRhiGles2InitParams.
diff --git a/src/gui/rhi/qrhivulkan.cpp b/src/gui/rhi/qrhivulkan.cpp
index 26c153afff..211ee195e5 100644
--- a/src/gui/rhi/qrhivulkan.cpp
+++ b/src/gui/rhi/qrhivulkan.cpp
@@ -1296,16 +1296,11 @@ bool QRhiVulkan::recreateSwapChain(QRhiSwapChain *swapChain)
VkSurfaceCapabilitiesKHR surfaceCaps;
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physDev, swapChainD->surface, &surfaceCaps);
quint32 reqBufferCount;
- if (swapChainD->m_flags.testFlag(QRhiSwapChain::MinimalBufferCount)) {
+ if (swapChainD->m_flags.testFlag(QRhiSwapChain::MinimalBufferCount) || surfaceCaps.maxImageCount == 0) {
reqBufferCount = qMax<quint32>(2, surfaceCaps.minImageCount);
} else {
- const quint32 maxBuffers = QVkSwapChain::MAX_BUFFER_COUNT;
- if (surfaceCaps.maxImageCount)
- reqBufferCount = qMax(qMin(surfaceCaps.maxImageCount, maxBuffers), surfaceCaps.minImageCount);
- else
- reqBufferCount = qMax<quint32>(2, surfaceCaps.minImageCount);
+ reqBufferCount = qMax(qMin<quint32>(surfaceCaps.maxImageCount, 3), surfaceCaps.minImageCount);
}
-
VkSurfaceTransformFlagBitsKHR preTransform =
(surfaceCaps.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR)
? VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR
@@ -1389,23 +1384,19 @@ bool QRhiVulkan::recreateSwapChain(QRhiSwapChain *swapChain)
return false;
}
- if (actualSwapChainBufferCount > QVkSwapChain::MAX_BUFFER_COUNT) {
- qWarning("Too many swapchain buffers (%u)", actualSwapChainBufferCount);
- return false;
- }
if (actualSwapChainBufferCount != reqBufferCount)
qCDebug(QRHI_LOG_INFO, "Actual swapchain buffer count is %u", actualSwapChainBufferCount);
swapChainD->bufferCount = int(actualSwapChainBufferCount);
- VkImage swapChainImages[QVkSwapChain::MAX_BUFFER_COUNT];
- err = vkGetSwapchainImagesKHR(dev, swapChainD->sc, &actualSwapChainBufferCount, swapChainImages);
+ QVarLengthArray<VkImage, QVkSwapChain::EXPECTED_MAX_BUFFER_COUNT> swapChainImages(actualSwapChainBufferCount);
+ err = vkGetSwapchainImagesKHR(dev, swapChainD->sc, &actualSwapChainBufferCount, swapChainImages.data());
if (err != VK_SUCCESS) {
qWarning("Failed to get swapchain images: %d", err);
return false;
}
- VkImage msaaImages[QVkSwapChain::MAX_BUFFER_COUNT];
- VkImageView msaaViews[QVkSwapChain::MAX_BUFFER_COUNT];
+ QVarLengthArray<VkImage, QVkSwapChain::EXPECTED_MAX_BUFFER_COUNT> msaaImages(swapChainD->bufferCount);
+ QVarLengthArray<VkImageView, QVkSwapChain::EXPECTED_MAX_BUFFER_COUNT> msaaViews(swapChainD->bufferCount);
if (swapChainD->samples > VK_SAMPLE_COUNT_1_BIT) {
if (!createTransientImage(swapChainD->colorFormat,
swapChainD->pixelSize,
@@ -1413,8 +1404,8 @@ bool QRhiVulkan::recreateSwapChain(QRhiSwapChain *swapChain)
VK_IMAGE_ASPECT_COLOR_BIT,
swapChainD->samples,
&swapChainD->msaaImageMem,
- msaaImages,
- msaaViews,
+ msaaImages.data(),
+ msaaViews.data(),
swapChainD->bufferCount))
{
qWarning("Failed to create transient image for MSAA color buffer");
@@ -1427,6 +1418,7 @@ bool QRhiVulkan::recreateSwapChain(QRhiSwapChain *swapChain)
fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
+ swapChainD->imageRes.resize(swapChainD->bufferCount);
for (int i = 0; i < swapChainD->bufferCount; ++i) {
QVkSwapChain::ImageResources &image(swapChainD->imageRes[i]);
image.image = swapChainImages[i];
diff --git a/src/gui/rhi/qrhivulkan_p_p.h b/src/gui/rhi/qrhivulkan_p_p.h
index 62516e268d..d90b1d1364 100644
--- a/src/gui/rhi/qrhivulkan_p_p.h
+++ b/src/gui/rhi/qrhivulkan_p_p.h
@@ -587,7 +587,7 @@ struct QVkSwapChain : public QRhiSwapChain
bool ensureSurface();
- static const quint32 MAX_BUFFER_COUNT = 3;
+ static const quint32 EXPECTED_MAX_BUFFER_COUNT = 4;
QWindow *window = nullptr;
QSize pixelSize;
@@ -617,7 +617,8 @@ struct QVkSwapChain : public QRhiSwapChain
ScImageUseTransferSource
};
LastUse lastUse = ScImageUseNone;
- } imageRes[MAX_BUFFER_COUNT];
+ };
+ QVarLengthArray<ImageResources, EXPECTED_MAX_BUFFER_COUNT> imageRes;
struct FrameResources {
VkFence imageFence = VK_NULL_HANDLE;
diff --git a/src/gui/rhi/qshader.cpp b/src/gui/rhi/qshader.cpp
index 945f4820c2..b5c1aca8be 100644
--- a/src/gui/rhi/qshader.cpp
+++ b/src/gui/rhi/qshader.cpp
@@ -543,9 +543,9 @@ bool operator==(const QShader &lhs, const QShader &rhs) Q_DECL_NOTHROW
\relates QShader
*/
-uint qHash(const QShader &s, uint seed) Q_DECL_NOTHROW
+size_t qHash(const QShader &s, size_t seed) Q_DECL_NOTHROW
{
- uint h = s.stage();
+ size_t h = s.stage();
for (auto it = s.d->shaders.constBegin(), itEnd = s.d->shaders.constEnd(); it != itEnd; ++it)
h += qHash(it.key(), seed) + qHash(it.value().shader(), seed);
return h;
@@ -596,7 +596,7 @@ bool operator==(const QShaderKey &lhs, const QShaderKey &rhs) Q_DECL_NOTHROW
\relates QShaderKey
*/
-uint qHash(const QShaderKey &k, uint seed) Q_DECL_NOTHROW
+size_t qHash(const QShaderKey &k, size_t seed) Q_DECL_NOTHROW
{
return seed + 10 * k.source() + k.sourceVersion().version() + k.sourceVersion().flags() + k.sourceVariant();
}
diff --git a/src/gui/rhi/qshader_p.h b/src/gui/rhi/qshader_p.h
index 4b561b6fa9..f2d3c4ac2f 100644
--- a/src/gui/rhi/qshader_p.h
+++ b/src/gui/rhi/qshader_p.h
@@ -158,7 +158,7 @@ private:
QShaderPrivate *d;
friend struct QShaderPrivate;
friend Q_GUI_EXPORT bool operator==(const QShader &, const QShader &) Q_DECL_NOTHROW;
- friend Q_GUI_EXPORT uint qHash(const QShader &, uint) Q_DECL_NOTHROW;
+ friend Q_GUI_EXPORT size_t qHash(const QShader &, size_t) Q_DECL_NOTHROW;
#ifndef QT_NO_DEBUG_STREAM
friend Q_GUI_EXPORT QDebug operator<<(QDebug, const QShader &);
#endif
@@ -190,7 +190,7 @@ private:
Q_DECLARE_TYPEINFO(QShaderKey, Q_MOVABLE_TYPE);
Q_GUI_EXPORT bool operator==(const QShader &lhs, const QShader &rhs) Q_DECL_NOTHROW;
-Q_GUI_EXPORT uint qHash(const QShader &s, uint seed = 0) Q_DECL_NOTHROW;
+Q_GUI_EXPORT size_t qHash(const QShader &s, size_t seed = 0) Q_DECL_NOTHROW;
inline bool operator!=(const QShader &lhs, const QShader &rhs) Q_DECL_NOTHROW
{
@@ -216,7 +216,7 @@ inline bool operator!=(const QShaderCode &lhs, const QShaderCode &rhs) Q_DECL_NO
return !(lhs == rhs);
}
-Q_GUI_EXPORT uint qHash(const QShaderKey &k, uint seed = 0) Q_DECL_NOTHROW;
+Q_GUI_EXPORT size_t qHash(const QShaderKey &k, size_t seed = 0) Q_DECL_NOTHROW;
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug, const QShader &);
diff --git a/src/gui/text/qabstracttextdocumentlayout.cpp b/src/gui/text/qabstracttextdocumentlayout.cpp
index 8528f59844..48b7f85413 100644
--- a/src/gui/text/qabstracttextdocumentlayout.cpp
+++ b/src/gui/text/qabstracttextdocumentlayout.cpp
@@ -53,7 +53,6 @@ QAbstractTextDocumentLayoutPrivate::~QAbstractTextDocumentLayoutPrivate()
QTextObjectInterface::~QTextObjectInterface()
{
- // must be empty until ### Qt 6
}
/*!
@@ -568,7 +567,7 @@ void QAbstractTextDocumentLayoutPrivate::_q_handlerDestroyed(QObject *obj)
*/
int QAbstractTextDocumentLayout::formatIndex(int pos)
{
- QTextDocumentPrivate *pieceTable = qobject_cast<QTextDocument *>(parent())->docHandle();
+ QTextDocumentPrivate *pieceTable = QTextDocumentPrivate::get(qobject_cast<QTextDocument *>(parent()));
return pieceTable->find(pos).value()->format;
}
@@ -579,7 +578,7 @@ int QAbstractTextDocumentLayout::formatIndex(int pos)
*/
QTextCharFormat QAbstractTextDocumentLayout::format(int pos)
{
- QTextDocumentPrivate *pieceTable = qobject_cast<QTextDocument *>(parent())->docHandle();
+ QTextDocumentPrivate *pieceTable = QTextDocumentPrivate::get(qobject_cast<QTextDocument *>(parent()));
int idx = pieceTable->find(pos).value()->format;
return pieceTable->formatCollection()->charFormat(idx);
}
@@ -645,7 +644,7 @@ QTextFormat QAbstractTextDocumentLayout::formatAt(const QPointF &pos) const
block = block.next();
}
- QTextDocumentPrivate *pieceTable = qobject_cast<const QTextDocument *>(parent())->docHandle();
+ const QTextDocumentPrivate *pieceTable = QTextDocumentPrivate::get(qobject_cast<const QTextDocument *>(parent()));
QTextDocumentPrivate::FragmentIterator it = pieceTable->find(cursorPos);
return pieceTable->formatCollection()->format(it->format);
}
diff --git a/src/gui/text/qabstracttextdocumentlayout_p.h b/src/gui/text/qabstracttextdocumentlayout_p.h
index d631ce3197..88035eb66d 100644
--- a/src/gui/text/qabstracttextdocumentlayout_p.h
+++ b/src/gui/text/qabstracttextdocumentlayout_p.h
@@ -53,6 +53,7 @@
#include <QtGui/private/qtguiglobal_p.h>
#include "private/qobject_p.h"
+#include "qtextdocument_p.h"
#include "QtCore/qhash.h"
QT_BEGIN_NAMESPACE
@@ -78,7 +79,7 @@ public:
document = doc;
docPrivate = nullptr;
if (doc)
- docPrivate = doc->docHandle();
+ docPrivate = QTextDocumentPrivate::get(doc);
}
inline int _q_dynamicPageCountSlot() const
diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp
index 8f0d7d9d38..959566d4c1 100644
--- a/src/gui/text/qfont.cpp
+++ b/src/gui/text/qfont.cpp
@@ -2086,7 +2086,7 @@ QString QFont::toString() const
\relates QFont
\since 5.3
*/
-uint qHash(const QFont &font, uint seed) noexcept
+size_t qHash(const QFont &font, size_t seed) noexcept
{
return qHash(QFontPrivate::get(font)->request, seed);
}
diff --git a/src/gui/text/qfont.h b/src/gui/text/qfont.h
index e5734679ed..6317613b67 100644
--- a/src/gui/text/qfont.h
+++ b/src/gui/text/qfont.h
@@ -347,7 +347,7 @@ private:
Q_DECLARE_SHARED(QFont)
-Q_GUI_EXPORT uint qHash(const QFont &font, uint seed = 0) noexcept;
+Q_GUI_EXPORT size_t qHash(const QFont &font, size_t seed = 0) noexcept;
inline bool QFont::bold() const
{ return weight() > Medium; }
diff --git a/src/gui/text/qfont_p.h b/src/gui/text/qfont_p.h
index adbb7a0121..cc210a695b 100644
--- a/src/gui/text/qfont_p.h
+++ b/src/gui/text/qfont_p.h
@@ -136,7 +136,7 @@ struct QFontDef
}
};
-inline uint qHash(const QFontDef &fd, uint seed = 0) noexcept
+inline size_t qHash(const QFontDef &fd, size_t seed = 0) noexcept
{
QtPrivate::QHashCombine hash;
seed = hash(seed, qRound64(fd.pixelSize*10000)); // use only 4 fractional digits
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index f2fd585835..523895bc0e 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -38,6 +38,7 @@
****************************************************************************/
#include "qfontdatabase.h"
+#include "qfontdatabase_p.h"
#include "qloggingcategory.h"
#include "qalgorithms.h"
#include "qguiapplication.h"
@@ -173,71 +174,6 @@ static int getFontWeight(const QString &weightString)
}
-struct QtFontSize
-{
-
- void *handle;
-
- unsigned short pixelSize : 16;
-};
-
-
-
-struct QtFontStyle
-{
- struct Key {
- Key(const QString &styleString);
- Key() : style(QFont::StyleNormal),
- weight(QFont::Normal), stretch(0) { }
- Key(const Key &o) : style(o.style), weight(o.weight), stretch(o.stretch) { }
- uint style : 2;
- signed int weight : 8;
- signed int stretch : 12;
-
- bool operator==(const Key & other) {
- return (style == other.style && weight == other.weight &&
- (stretch == 0 || other.stretch == 0 || stretch == other.stretch));
- }
- bool operator!=(const Key &other) {
- return !operator==(other);
- }
- bool operator <(const Key &o) {
- int x = (style << 12) + (weight << 14) + stretch;
- int y = (o.style << 12) + (o.weight << 14) + o.stretch;
- return (x < y);
- }
- };
-
- QtFontStyle(const Key &k)
- : key(k), bitmapScalable(false), smoothScalable(false),
- count(0), pixelSizes(nullptr)
- {
- }
-
- ~QtFontStyle() {
- while (count) {
- // bitfield count-- in while condition does not work correctly in mwccsym2
- count--;
- QPlatformIntegration *integration = QGuiApplicationPrivate::platformIntegration();
- if (integration) {
- integration->fontDatabase()->releaseHandle(pixelSizes[count].handle);
- }
- }
- free(pixelSizes);
- }
-
- Key key;
- bool bitmapScalable : 1;
- bool smoothScalable : 1;
- signed int count : 30;
- QtFontSize *pixelSizes;
- QString styleName;
-
- bool antialiased;
-
- QtFontSize *pixelSize(unsigned short size, bool = false);
-};
-
QtFontStyle::Key::Key(const QString &styleString)
: style(QFont::StyleNormal), weight(QFont::Normal), stretch(0)
{
@@ -284,22 +220,6 @@ QtFontSize *QtFontStyle::pixelSize(unsigned short size, bool add)
return pixelSizes + (count++);
}
-struct QtFontFoundry
-{
- QtFontFoundry(const QString &n) : name(n), count(0), styles(nullptr) {}
- ~QtFontFoundry() {
- while (count--)
- delete styles[count];
- free(styles);
- }
-
- QString name;
-
- int count;
- QtFontStyle **styles;
- QtFontStyle *style(const QtFontStyle::Key &, const QString & = QString(), bool = false);
-};
-
QtFontStyle *QtFontFoundry::style(const QtFontStyle::Key &key, const QString &styleName, bool create)
{
int pos = 0;
@@ -331,46 +251,6 @@ QtFontStyle *QtFontFoundry::style(const QtFontStyle::Key &key, const QString &st
return styles[pos];
}
-
-struct QtFontFamily
-{
- enum WritingSystemStatus {
- Unknown = 0,
- Supported = 1,
- UnsupportedFT = 2,
- Unsupported = UnsupportedFT
- };
-
- QtFontFamily(const QString &n)
- :
- populated(false),
- fixedPitch(false),
- name(n), count(0), foundries(nullptr)
- {
- memset(writingSystems, 0, sizeof(writingSystems));
- }
- ~QtFontFamily() {
- while (count--)
- delete foundries[count];
- free(foundries);
- }
-
- bool populated : 1;
- bool fixedPitch : 1;
-
- QString name;
- QStringList aliases;
- int count;
- QtFontFoundry **foundries;
-
- unsigned char writingSystems[QFontDatabase::WritingSystemsCount];
-
- bool matchesFamilyName(const QString &familyName) const;
- QtFontFoundry *foundry(const QString &f, bool = false);
-
- void ensurePopulated();
-};
-
QtFontFoundry *QtFontFamily::foundry(const QString &f, bool create)
{
if (f.isNull() && count == 1)
@@ -414,85 +294,6 @@ void QtFontFamily::ensurePopulated()
Q_ASSERT_X(populated, Q_FUNC_INFO, qPrintable(name));
}
-
-struct FallbacksCacheKey {
- QString family;
- QFont::Style style;
- QFont::StyleHint styleHint;
- QChar::Script script;
-};
-
-inline bool operator==(const FallbacksCacheKey &lhs, const FallbacksCacheKey &rhs) noexcept
-{
- return lhs.script == rhs.script &&
- lhs.styleHint == rhs.styleHint &&
- lhs.style == rhs.style &&
- lhs.family == rhs.family;
-}
-
-inline bool operator!=(const FallbacksCacheKey &lhs, const FallbacksCacheKey &rhs) noexcept
-{
- return !operator==(lhs, rhs);
-}
-
-inline uint qHash(const FallbacksCacheKey &key, uint seed = 0) noexcept
-{
- QtPrivate::QHashCombine hash;
- seed = hash(seed, key.family);
- seed = hash(seed, int(key.style));
- seed = hash(seed, int(key.styleHint));
- seed = hash(seed, int(key.script));
- return seed;
-}
-
-
-class QFontDatabasePrivate
-{
-public:
- QFontDatabasePrivate()
- : count(0), families(nullptr),
- fallbacksCache(64)
- { }
-
- ~QFontDatabasePrivate() {
- free();
- }
-
- enum FamilyRequestFlags {
- RequestFamily = 0,
- EnsureCreated,
- EnsurePopulated
- };
-
- QtFontFamily *family(const QString &f, FamilyRequestFlags flags = EnsurePopulated);
- void free() {
- while (count--)
- delete families[count];
- ::free(families);
- families = nullptr;
- count = 0;
- // don't clear the memory fonts!
- }
-
- int count;
- QtFontFamily **families;
-
- QCache<FallbacksCacheKey, QStringList> fallbacksCache;
-
-
- struct ApplicationFont {
- QString fileName;
- QByteArray data;
- QStringList families;
- };
- QVector<ApplicationFont> applicationFonts;
- int addAppFont(const QByteArray &fontData, const QString &fileName);
- bool isApplicationFont(const QString &fileName);
-
- void invalidate();
-};
-Q_DECLARE_TYPEINFO(QFontDatabasePrivate::ApplicationFont, Q_MOVABLE_TYPE);
-
void QFontDatabasePrivate::invalidate()
{
QFontCache::instance()->clear();
@@ -597,7 +398,32 @@ Q_GUI_EXPORT int qt_script_for_writing_system(QFontDatabase::WritingSystem writi
}
+/*!
+ \internal
+
+ Tests if the given family \a family supports writing system \a writingSystem,
+ including the special case for Han script mapping to several subsequent writing systems
+*/
+static bool familySupportsWritingSystem(QtFontFamily *family, size_t writingSystem)
+{
+ Q_ASSERT(family != nullptr);
+ Q_ASSERT(writingSystem != QFontDatabase::Any && writingSystem < QFontDatabase::WritingSystemsCount);
+
+ size_t ws = writingSystem;
+ do {
+ if ((family->writingSystems[ws] & QtFontFamily::Supported) != 0)
+ return true;
+ } while (writingSystem >= QFontDatabase::SimplifiedChinese && writingSystem <= QFontDatabase::Japanese && ++ws <= QFontDatabase::Japanese);
+
+ return false;
+}
+Q_GUI_EXPORT QFontDatabase::WritingSystem qt_writing_system_for_script(int script)
+{
+ return QFontDatabase::WritingSystem(std::find(scriptForWritingSystem,
+ scriptForWritingSystem + QFontDatabase::WritingSystemsCount,
+ script) - scriptForWritingSystem);
+}
/*!
\internal
@@ -723,6 +549,10 @@ QRecursiveMutex *qt_fontdatabase_mutex()
return fontDatabaseMutex();
}
+QFontDatabasePrivate *QFontDatabasePrivate::instance()
+{
+ return privateDb();
+}
void qt_registerFont(const QString &familyName, const QString &stylename,
const QString &foundryname, int weight,
@@ -814,9 +644,7 @@ QStringList QPlatformFontDatabase::fallbacksForFamily(const QString &family, QFo
QStringList preferredFallbacks;
QStringList otherFallbacks;
- size_t writingSystem = std::find(scriptForWritingSystem,
- scriptForWritingSystem + QFontDatabase::WritingSystemsCount,
- script) - scriptForWritingSystem;
+ auto writingSystem = qt_writing_system_for_script(script);
if (writingSystem >= QFontDatabase::WritingSystemsCount)
writingSystem = QFontDatabase::Any;
@@ -826,7 +654,7 @@ QStringList QPlatformFontDatabase::fallbacksForFamily(const QString &family, QFo
f->ensurePopulated();
- if (writingSystem > QFontDatabase::Any && f->writingSystems[writingSystem] != QtFontFamily::Supported)
+ if (writingSystem != QFontDatabase::Any && !familySupportsWritingSystem(f, writingSystem))
continue;
for (int j = 0; j < f->count; ++j) {
@@ -855,7 +683,7 @@ static QStringList fallbacksForFamily(const QString &family, QFont::Style style,
if (!db->count)
initializeDb();
- const FallbacksCacheKey cacheKey = { family, style, styleHint, script };
+ const QtFontFallbacksCacheKey cacheKey = { family, style, styleHint, script };
if (const QStringList *fallbacks = db->fallbacksCache.object(cacheKey))
return *fallbacks;
@@ -899,7 +727,7 @@ static void initializeDb()
if (!db->count) {
QGuiApplicationPrivate::platformIntegration()->fontDatabase()->populateFontDatabase();
for (int i = 0; i < db->applicationFonts.count(); i++) {
- if (!db->applicationFonts.at(i).families.isEmpty())
+ if (!db->applicationFonts.at(i).properties.isEmpty())
registerFont(&db->applicationFonts[i]);
}
}
@@ -1027,9 +855,22 @@ QFontEngine *loadEngine(int script, const QFontDef &request,
return engine;
}
+QtFontStyle::~QtFontStyle()
+{
+ while (count) {
+ // bitfield count-- in while condition does not work correctly in mwccsym2
+ count--;
+ QPlatformIntegration *integration = QGuiApplicationPrivate::platformIntegration();
+ if (integration)
+ integration->fontDatabase()->releaseHandle(pixelSizes[count].handle);
+ }
+
+ free(pixelSizes);
+}
+
static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt)
{
- fnt->families = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->addApplicationFont(fnt->data,fnt->fileName);
+ QGuiApplicationPrivate::platformIntegration()->fontDatabase()->addApplicationFont(fnt->data, fnt->fileName, fnt);
}
static QtFontStyle *bestStyle(QtFontFoundry *foundry, const QtFontStyle::Key &styleKey,
@@ -1253,8 +1094,7 @@ static int match(int script, const QFontDef &request,
load(family_name, script);
- size_t writingSystem = std::find(scriptForWritingSystem, scriptForWritingSystem +
- QFontDatabase::WritingSystemsCount, script) - scriptForWritingSystem;
+ auto writingSystem = qt_writing_system_for_script(script);
if (writingSystem >= QFontDatabase::WritingSystemsCount)
writingSystem = QFontDatabase::Any;
@@ -1271,7 +1111,7 @@ static int match(int script, const QFontDef &request,
test.family->ensurePopulated();
// Check if family is supported in the script we want
- if (writingSystem != QFontDatabase::Any && !(test.family->writingSystems[writingSystem] & QtFontFamily::Supported))
+ if (writingSystem != QFontDatabase::Any && !familySupportsWritingSystem(test.family, writingSystem))
continue;
// as we know the script is supported, we can be sure
@@ -2433,7 +2273,7 @@ int QFontDatabasePrivate::addAppFont(const QByteArray &fontData, const QString &
int i;
for (i = 0; i < applicationFonts.count(); ++i)
- if (applicationFonts.at(i).families.isEmpty())
+ if (applicationFonts.at(i).properties.isEmpty())
break;
if (i >= applicationFonts.count()) {
applicationFonts.append(ApplicationFont());
@@ -2445,7 +2285,7 @@ int QFontDatabasePrivate::addAppFont(const QByteArray &fontData, const QString &
bool wasEmpty = privateDb()->count == 0;
registerFont(&font);
- if (font.families.isEmpty())
+ if (font.properties.isEmpty())
return -1;
applicationFonts[i] = font;
@@ -2534,7 +2374,14 @@ int QFontDatabase::addApplicationFontFromData(const QByteArray &fontData)
QStringList QFontDatabase::applicationFontFamilies(int id)
{
QMutexLocker locker(fontDatabaseMutex());
- return privateDb()->applicationFonts.value(id).families;
+
+ QStringList ret;
+ ret.reserve(privateDb()->applicationFonts.value(id).properties.size());
+
+ for (const auto &properties : privateDb()->applicationFonts.value(id).properties)
+ ret.append(properties.familyName);
+
+ return ret;
}
/*!
@@ -2857,9 +2704,7 @@ QString QFontDatabase::resolveFontFamilyAlias(const QString &family)
Q_GUI_EXPORT QStringList qt_sort_families_by_writing_system(QChar::Script script, const QStringList &families)
{
- size_t writingSystem = std::find(scriptForWritingSystem,
- scriptForWritingSystem + QFontDatabase::WritingSystemsCount,
- script) - scriptForWritingSystem;
+ size_t writingSystem = qt_writing_system_for_script(script);
if (writingSystem == QFontDatabase::Any
|| writingSystem >= QFontDatabase::WritingSystemsCount) {
return families;
@@ -2881,7 +2726,7 @@ Q_GUI_EXPORT QStringList qt_sort_families_by_writing_system(QChar::Script script
uint order = i;
if (testFamily == nullptr
- || (testFamily->writingSystems[writingSystem] & QtFontFamily::Supported) == 0) {
+ || !familySupportsWritingSystem(testFamily, writingSystem)) {
order |= 1u << 31;
}
diff --git a/src/gui/text/qfontdatabase.h b/src/gui/text/qfontdatabase.h
index 80b092f177..63e6b48e4f 100644
--- a/src/gui/text/qfontdatabase.h
+++ b/src/gui/text/qfontdatabase.h
@@ -49,7 +49,6 @@ QT_BEGIN_NAMESPACE
class QStringList;
-template <class T> class QList;
struct QFontDef;
class QFontEngine;
diff --git a/src/gui/text/qfontdatabase_p.h b/src/gui/text/qfontdatabase_p.h
new file mode 100644
index 0000000000..48b4fe8603
--- /dev/null
+++ b/src/gui/text/qfontdatabase_p.h
@@ -0,0 +1,279 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QFONTDATABASE_P_H
+#define QFONTDATABASE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of internal files. This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qcache.h>
+
+#include <QtGui/qfontdatabase.h>
+
+QT_BEGIN_NAMESPACE
+
+struct QtFontFallbacksCacheKey
+{
+ QString family;
+ QFont::Style style;
+ QFont::StyleHint styleHint;
+ QChar::Script script;
+};
+
+inline bool operator==(const QtFontFallbacksCacheKey &lhs, const QtFontFallbacksCacheKey &rhs) noexcept
+{
+ return lhs.script == rhs.script &&
+ lhs.styleHint == rhs.styleHint &&
+ lhs.style == rhs.style &&
+ lhs.family == rhs.family;
+}
+
+inline bool operator!=(const QtFontFallbacksCacheKey &lhs, const QtFontFallbacksCacheKey &rhs) noexcept
+{
+ return !operator==(lhs, rhs);
+}
+
+inline size_t qHash(const QtFontFallbacksCacheKey &key, size_t seed = 0) noexcept
+{
+ QtPrivate::QHashCombine hash;
+ seed = hash(seed, key.family);
+ seed = hash(seed, int(key.style));
+ seed = hash(seed, int(key.styleHint));
+ seed = hash(seed, int(key.script));
+ return seed;
+}
+
+struct Q_GUI_EXPORT QtFontSize
+{
+ void *handle;
+ unsigned short pixelSize : 16;
+};
+
+struct Q_GUI_EXPORT QtFontStyle
+{
+ struct Key
+ {
+ Key(const QString &styleString);
+
+ Key()
+ : style(QFont::StyleNormal)
+ , weight(QFont::Normal)
+ , stretch(0)
+ {}
+
+ Key(const Key &o)
+ : style(o.style)
+ , weight(o.weight)
+ , stretch(o.stretch)
+ {}
+
+ uint style : 2;
+ signed int weight : 8;
+ signed int stretch : 12;
+
+ bool operator==(const Key &other)
+ {
+ return (style == other.style && weight == other.weight &&
+ (stretch == 0 || other.stretch == 0 || stretch == other.stretch));
+ }
+
+ bool operator!=(const Key &other)
+ {
+ return !operator==(other);
+ }
+
+ bool operator<(const Key &o)
+ {
+ int x = (style << 12) + (weight << 14) + stretch;
+ int y = (o.style << 12) + (o.weight << 14) + o.stretch;
+ return (x < y);
+ }
+ };
+
+ QtFontStyle(const Key &k)
+ : key(k)
+ , bitmapScalable(false)
+ , smoothScalable(false)
+ , count(0)
+ , pixelSizes(nullptr)
+ {
+ }
+
+ ~QtFontStyle();
+
+ QtFontSize *pixelSize(unsigned short size, bool = false);
+
+ Key key;
+ bool bitmapScalable : 1;
+ bool smoothScalable : 1;
+ signed int count : 30;
+ QtFontSize *pixelSizes;
+ QString styleName;
+ bool antialiased;
+};
+
+struct Q_GUI_EXPORT QtFontFoundry
+{
+ QtFontFoundry(const QString &n)
+ : name(n)
+ , count(0)
+ , styles(nullptr)
+ {}
+
+ ~QtFontFoundry()
+ {
+ while (count--)
+ delete styles[count];
+ free(styles);
+ }
+
+ QString name;
+ int count;
+ QtFontStyle **styles;
+ QtFontStyle *style(const QtFontStyle::Key &, const QString & = QString(), bool = false);
+};
+
+struct Q_GUI_EXPORT QtFontFamily
+{
+ enum WritingSystemStatus {
+ Unknown = 0,
+ Supported = 1,
+ UnsupportedFT = 2,
+ Unsupported = UnsupportedFT
+ };
+
+ QtFontFamily(const QString &n)
+ :
+ populated(false),
+ fixedPitch(false),
+ name(n), count(0), foundries(nullptr)
+ {
+ memset(writingSystems, 0, sizeof(writingSystems));
+ }
+ ~QtFontFamily() {
+ while (count--)
+ delete foundries[count];
+ free(foundries);
+ }
+
+ bool populated : 1;
+ bool fixedPitch : 1;
+
+ QString name;
+ QStringList aliases;
+ int count;
+ QtFontFoundry **foundries;
+
+ unsigned char writingSystems[QFontDatabase::WritingSystemsCount];
+
+ bool matchesFamilyName(const QString &familyName) const;
+ QtFontFoundry *foundry(const QString &f, bool = false);
+
+ void ensurePopulated();
+};
+
+class Q_GUI_EXPORT QFontDatabasePrivate
+{
+public:
+ QFontDatabasePrivate()
+ : count(0)
+ , families(nullptr)
+ , fallbacksCache(64)
+ { }
+
+ ~QFontDatabasePrivate() {
+ free();
+ }
+
+ enum FamilyRequestFlags {
+ RequestFamily = 0,
+ EnsureCreated,
+ EnsurePopulated
+ };
+
+ QtFontFamily *family(const QString &f, FamilyRequestFlags flags = EnsurePopulated);
+ void free() {
+ while (count--)
+ delete families[count];
+ ::free(families);
+ families = nullptr;
+ count = 0;
+ // don't clear the memory fonts!
+ }
+
+ int count;
+ QtFontFamily **families;
+
+ QCache<QtFontFallbacksCacheKey, QStringList> fallbacksCache;
+ struct ApplicationFont {
+ QString fileName;
+ QByteArray data;
+
+ struct Properties {
+ QString familyName;
+ QString styleName;
+ int weight = 0;
+ QFont::Style style = QFont::StyleNormal;
+ int stretch = QFont::Unstretched;
+ };
+
+ QVector<Properties> properties;
+ };
+ QVector<ApplicationFont> applicationFonts;
+ int addAppFont(const QByteArray &fontData, const QString &fileName);
+ bool isApplicationFont(const QString &fileName);
+
+ static QFontDatabasePrivate *instance();
+
+ void invalidate();
+};
+Q_DECLARE_TYPEINFO(QFontDatabasePrivate::ApplicationFont, Q_MOVABLE_TYPE);
+
+QT_END_NAMESPACE
+
+#endif // QFONTDATABASE_P_H
diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp
index b6046b0fc5..7712ce71c6 100644
--- a/src/gui/text/qfontengine.cpp
+++ b/src/gui/text/qfontengine.cpp
@@ -57,7 +57,6 @@
# include "qharfbuzzng_p.h"
# include <harfbuzz/hb-ot.h>
#endif
-#include <private/qharfbuzz_p.h>
#include <algorithm>
#include <limits.h>
@@ -102,75 +101,6 @@ bool qt_useHarfbuzzNG()
}
#endif
-Q_STATIC_ASSERT(sizeof(HB_Glyph) == sizeof(glyph_t));
-Q_STATIC_ASSERT(sizeof(HB_Fixed) == sizeof(QFixed));
-
-static HB_Bool hb_stringToGlyphs(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool rightToLeft)
-{
- QFontEngine *fe = (QFontEngine *)font->userData;
-
- const QChar *str = reinterpret_cast<const QChar *>(string);
-
- QGlyphLayout qglyphs;
- qglyphs.numGlyphs = *numGlyphs;
- qglyphs.glyphs = glyphs;
- int nGlyphs = *numGlyphs;
- bool result = fe->stringToCMap(str, length, &qglyphs, &nGlyphs, QFontEngine::GlyphIndicesOnly);
- *numGlyphs = nGlyphs;
-
- if (rightToLeft && result && !fe->symbol) {
- QStringIterator it(str, str + length);
- while (it.hasNext()) {
- const uint ucs4 = it.next();
- const uint mirrored = QChar::mirroredChar(ucs4);
- if (Q_UNLIKELY(mirrored != ucs4))
- *glyphs = fe->glyphIndex(mirrored);
- ++glyphs;
- }
- }
-
- return result;
-}
-
-static void hb_getAdvances(HB_Font font, const HB_Glyph *glyphs, hb_uint32 numGlyphs, HB_Fixed *advances, int flags)
-{
- QFontEngine *fe = (QFontEngine *)font->userData;
-
- QGlyphLayout qglyphs;
- qglyphs.numGlyphs = numGlyphs;
- qglyphs.glyphs = const_cast<glyph_t *>(glyphs);
- qglyphs.advances = reinterpret_cast<QFixed *>(advances);
-
- fe->recalcAdvances(&qglyphs, (flags & HB_ShaperFlag_UseDesignMetrics) ? QFontEngine::DesignMetrics : QFontEngine::ShaperFlags{});
-}
-
-static HB_Bool hb_canRender(HB_Font font, const HB_UChar16 *string, hb_uint32 length)
-{
- QFontEngine *fe = (QFontEngine *)font->userData;
- return fe->canRender(reinterpret_cast<const QChar *>(string), length);
-}
-
-static void hb_getGlyphMetrics(HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *metrics)
-{
- QFontEngine *fe = (QFontEngine *)font->userData;
- glyph_metrics_t m = fe->boundingBox(glyph);
- metrics->x = m.x.value();
- metrics->y = m.y.value();
- metrics->width = m.width.value();
- metrics->height = m.height.value();
- metrics->xOffset = m.xoff.value();
- metrics->yOffset = m.yoff.value();
-}
-
-static HB_Fixed hb_getFontMetric(HB_Font font, HB_FontMetric metric)
-{
- if (metric == HB_FontAscent) {
- QFontEngine *fe = (QFontEngine *)font->userData;
- return fe->ascent().value();
- }
- return 0;
-}
-
int QFontEngine::getPointInOutline(glyph_t glyph, int flags, quint32 point, QFixed *xpos, QFixed *ypos, quint32 *nPoints)
{
Q_UNUSED(glyph)
@@ -182,36 +112,6 @@ int QFontEngine::getPointInOutline(glyph_t glyph, int flags, quint32 point, QFix
return Err_Not_Covered;
}
-static HB_Error hb_getPointInOutline(HB_Font font, HB_Glyph glyph, int flags, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints)
-{
- QFontEngine *fe = (QFontEngine *)font->userData;
- return (HB_Error)fe->getPointInOutline(glyph, flags, point, (QFixed *)xpos, (QFixed *)ypos, (quint32 *)nPoints);
-}
-
-static const HB_FontClass hb_fontClass = {
- hb_stringToGlyphs, hb_getAdvances, hb_canRender, hb_getPointInOutline,
- hb_getGlyphMetrics, hb_getFontMetric
-};
-
-static HB_Error hb_getSFntTable(void *font, HB_Tag tableTag, HB_Byte *buffer, HB_UInt *length)
-{
- QFontEngine::FaceData *data = (QFontEngine::FaceData *)font;
- Q_ASSERT(data);
-
- qt_get_font_table_func_t get_font_table = data->get_font_table;
- Q_ASSERT(get_font_table);
-
- if (!get_font_table(data->user_data, tableTag, buffer, length))
- return HB_Err_Invalid_Argument;
- return HB_Err_Ok;
-}
-
-static void hb_freeFace(void *face)
-{
- qHBFreeFace((HB_Face)face);
-}
-
-
static bool qt_get_font_table_default(void *user_data, uint tag, uchar *buffer, uint *length)
{
QFontEngine *fe = (QFontEngine *)user_data;
@@ -301,32 +201,7 @@ void *QFontEngine::harfbuzzFont() const
if (qt_useHarfbuzzNG())
return hb_qt_font_get_for_engine(const_cast<QFontEngine *>(this));
#endif
- if (!font_) {
- HB_Face hbFace = (HB_Face)harfbuzzFace();
- if (hbFace->font_for_init) {
- void *data = hbFace->font_for_init;
- q_check_ptr(qHBLoadFace(hbFace));
- free(data);
- }
-
- HB_FontRec *hbFont = (HB_FontRec *) malloc(sizeof(HB_FontRec));
- Q_CHECK_PTR(hbFont);
- hbFont->klass = &hb_fontClass;
- hbFont->userData = const_cast<QFontEngine *>(this);
-
- qint64 emSquare = emSquareSize().truncate();
- Q_ASSERT(emSquare == emSquareSize().toInt()); // ensure no truncation
- if (emSquare == 0)
- emSquare = 1000; // a fallback value suitable for Type1 fonts
- hbFont->y_ppem = fontDef.pixelSize;
- hbFont->x_ppem = fontDef.pixelSize * fontDef.stretch / 100;
- // same as QFixed(x)/QFixed(emSquare) but without int32 overflow for x
- hbFont->x_scale = (((qint64)hbFont->x_ppem << 6) * 0x10000L + (emSquare >> 1)) / emSquare;
- hbFont->y_scale = (((qint64)hbFont->y_ppem << 6) * 0x10000L + (emSquare >> 1)) / emSquare;
-
- font_ = Holder(hbFont, free);
- }
- return font_.get();
+ return nullptr;
}
void *QFontEngine::harfbuzzFace() const
@@ -336,19 +211,7 @@ void *QFontEngine::harfbuzzFace() const
if (qt_useHarfbuzzNG())
return hb_qt_face_get_for_engine(const_cast<QFontEngine *>(this));
#endif
- if (!face_) {
- QFontEngine::FaceData *data = (QFontEngine::FaceData *)malloc(sizeof(QFontEngine::FaceData));
- Q_CHECK_PTR(data);
- data->user_data = faceData.user_data;
- data->get_font_table = faceData.get_font_table;
-
- HB_Face hbFace = qHBNewFace(data, hb_getSFntTable);
- Q_CHECK_PTR(hbFace);
- hbFace->isSymbolFont = symbol;
-
- face_ = Holder(hbFace, hb_freeFace);
- }
- return face_.get();
+ return nullptr;
}
bool QFontEngine::supportsScript(QChar::Script script) const
@@ -364,36 +227,25 @@ bool QFontEngine::supportsScript(QChar::Script script) const
#if QT_CONFIG(harfbuzz)
if (qt_useHarfbuzzNG()) {
-#if defined(Q_OS_DARWIN)
// in AAT fonts, 'gsub' table is effectively replaced by 'mort'/'morx' table
uint len;
if (getSfntTableData(MAKE_TAG('m','o','r','t'), 0, &len) || getSfntTableData(MAKE_TAG('m','o','r','x'), 0, &len))
return true;
-#endif
- bool ret = false;
if (hb_face_t *face = hb_qt_face_get_for_engine(const_cast<QFontEngine *>(this))) {
- hb_tag_t script_tag_1, script_tag_2;
- hb_ot_tags_from_script(hb_qt_script_to_script(script), &script_tag_1, &script_tag_2);
-
- unsigned int script_index;
- ret = hb_ot_layout_table_find_script(face, HB_OT_TAG_GSUB, script_tag_1, &script_index);
- if (!ret) {
- ret = hb_ot_layout_table_find_script(face, HB_OT_TAG_GSUB, script_tag_2, &script_index);
- if (!ret && script_tag_2 != HB_OT_TAG_DEFAULT_SCRIPT)
- ret = hb_ot_layout_table_find_script(face, HB_OT_TAG_GSUB, HB_OT_TAG_DEFAULT_SCRIPT, &script_index);
- }
+ unsigned int script_count = HB_OT_MAX_TAGS_PER_SCRIPT;
+ hb_tag_t script_tags[HB_OT_MAX_TAGS_PER_SCRIPT];
+
+ hb_ot_tags_from_script_and_language(hb_qt_script_to_script(script), HB_LANGUAGE_INVALID,
+ &script_count, script_tags,
+ nullptr, nullptr);
+
+ if (hb_ot_layout_table_select_script(face, HB_OT_TAG_GSUB, script_count, script_tags, nullptr, nullptr))
+ return true;
}
- return ret;
}
#endif
- HB_Face hbFace = (HB_Face)harfbuzzFace();
- if (hbFace->font_for_init) {
- void *data = hbFace->font_for_init;
- q_check_ptr(qHBLoadFace(hbFace));
- free(data);
- }
- return hbFace->supported_scripts[script_to_hbscript(script)];
+ return false;
}
bool QFontEngine::canRender(const QChar *str, int len) const
@@ -757,10 +609,10 @@ Q_GUI_EXPORT void qt_addBitmapToPath(qreal x0, qreal y0, const uchar *image_data
// set up edges
for (int y = 0; y <= h; ++y) {
for (int x = 0; x <= w; ++x) {
- bool topLeft = (x == 0)|(y == 0) ? false : SET(x - 1, y - 1);
- bool topRight = (x == w)|(y == 0) ? false : SET(x, y - 1);
- bool bottomLeft = (x == 0)|(y == h) ? false : SET(x - 1, y);
- bool bottomRight = (x == w)|(y == h) ? false : SET(x, y);
+ bool topLeft = (x == 0 || y == 0) ? false : SET(x - 1, y - 1);
+ bool topRight = (x == w || y == 0) ? false : SET(x, y - 1);
+ bool bottomLeft = (x == 0 || y == h) ? false : SET(x - 1, y);
+ bool bottomRight = (x == w || y == h) ? false : SET(x, y);
GRID(x, y) = 0;
if ((!topRight) & bottomRight)
@@ -807,14 +659,14 @@ void QFontEngine::addBitmapFontToPath(qreal x, qreal y, const QGlyphLayout &glyp
const int w = alphaMask.width();
const int h = alphaMask.height();
- const int srcBpl = alphaMask.bytesPerLine();
+ const qsizetype srcBpl = alphaMask.bytesPerLine();
QImage bitmap;
if (alphaMask.depth() == 1) {
bitmap = alphaMask;
} else {
bitmap = QImage(w, h, QImage::Format_Mono);
const uchar *imageData = alphaMask.bits();
- const int destBpl = bitmap.bytesPerLine();
+ const qsizetype destBpl = bitmap.bytesPerLine();
uchar *bitmapData = bitmap.bits();
for (int yi = 0; yi < h; ++yi) {
diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h
index 03e14c737a..0fa8f8e826 100644
--- a/src/gui/text/qfontengine_p.h
+++ b/src/gui/text/qfontengine_p.h
@@ -399,7 +399,7 @@ inline bool operator ==(const QFontEngine::FaceId &f1, const QFontEngine::FaceId
return f1.index == f2.index && f1.encoding == f2.encoding && f1.filename == f2.filename && f1.uuid == f2.uuid;
}
-inline uint qHash(const QFontEngine::FaceId &f, uint seed = 0)
+inline size_t qHash(const QFontEngine::FaceId &f, size_t seed = 0)
noexcept(noexcept(qHash(f.filename)))
{
QtPrivate::QHashCombine hash;
diff --git a/src/gui/text/qfontengine_qpf2.cpp b/src/gui/text/qfontengine_qpf2.cpp
index e00f9d058c..d636bca510 100644
--- a/src/gui/text/qfontengine_qpf2.cpp
+++ b/src/gui/text/qfontengine_qpf2.cpp
@@ -168,7 +168,7 @@ const QFontEngineQPF2::Glyph *QFontEngineQPF2::findGlyph(glyph_t g) const
bool QFontEngineQPF2::verifyHeader(const uchar *data, int size)
{
- VERIFY(quintptr(data) % Q_ALIGNOF(Header) == 0);
+ VERIFY(quintptr(data) % alignof(Header) == 0);
VERIFY(size >= int(sizeof(Header)));
const Header *header = reinterpret_cast<const Header *>(data);
if (header->magic[0] != 'Q'
diff --git a/src/gui/text/qfontmetrics.h b/src/gui/text/qfontmetrics.h
index e92a1514a1..8e1b043b55 100644
--- a/src/gui/text/qfontmetrics.h
+++ b/src/gui/text/qfontmetrics.h
@@ -49,12 +49,8 @@
QT_BEGIN_NAMESPACE
-
-
-class QTextCodec;
class QRect;
-
class Q_GUI_EXPORT QFontMetrics
{
public:
diff --git a/src/gui/text/qharfbuzzng.cpp b/src/gui/text/qharfbuzzng.cpp
index 4613aff9e8..0ee44192b1 100644
--- a/src/gui/text/qharfbuzzng.cpp
+++ b/src/gui/text/qharfbuzzng.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Copyright (C) 2013 Konstantin Ritt
** Contact: https://www.qt.io/licensing/
**
@@ -82,7 +82,7 @@ static const hb_script_t _qtscript_to_hbscript[] = {
HB_SCRIPT_HANGUL,
HB_SCRIPT_ETHIOPIC,
HB_SCRIPT_CHEROKEE,
- HB_SCRIPT_CANADIAN_ABORIGINAL,
+ HB_SCRIPT_CANADIAN_SYLLABICS,
HB_SCRIPT_OGHAM,
HB_SCRIPT_RUNIC,
HB_SCRIPT_KHMER,
@@ -218,20 +218,22 @@ static const hb_script_t _qtscript_to_hbscript[] = {
HB_SCRIPT_SOYOMBO,
HB_SCRIPT_ZANABAZAR_SQUARE,
- // Unicode 12.1 additions (not present in harfbuzz-ng 1.7.4)
- hb_script_t(HB_TAG('D', 'o', 'g', 'r')), // Script_Dogra
- hb_script_t(HB_TAG('G', 'o', 'n', 'g')), // Script_GunjalaGondi
- hb_script_t(HB_TAG('R', 'o', 'h', 'g')), // Script_HanifiRohingya
- hb_script_t(HB_TAG('M', 'a', 'k', 'a')), // Script_Makasar
- hb_script_t(HB_TAG('M', 'e', 'd', 'f')), // Script_Medefaidrin
- hb_script_t(HB_TAG('S', 'o', 'g', 'o')), // Script_OldSogdian
- hb_script_t(HB_TAG('S', 'o', 'g', 'd')), // Script_Sogdian
- hb_script_t(HB_TAG('E', 'l', 'y', 'm')), // Script_Elymaic
- hb_script_t(HB_TAG('N', 'a', 'n', 'd')), // Script_Nandinagari
- hb_script_t(HB_TAG('H', 'm', 'n', 'p')), // Script_NyiakengPuachueHmong
- hb_script_t(HB_TAG('W', 'c', 'h', 'o')), // Script_Wancho
-
- // Unicode 13.0 additions (as above)
+ // Unicode 11.0 additions
+ HB_SCRIPT_DOGRA,
+ HB_SCRIPT_GUNJALA_GONDI,
+ HB_SCRIPT_HANIFI_ROHINGYA,
+ HB_SCRIPT_MAKASAR,
+ HB_SCRIPT_MEDEFAIDRIN,
+ HB_SCRIPT_OLD_SOGDIAN,
+ HB_SCRIPT_SOGDIAN,
+
+ // Unicode 12.0 additions
+ HB_SCRIPT_ELYMAIC,
+ HB_SCRIPT_NANDINAGARI,
+ HB_SCRIPT_NYIAKENG_PUACHUE_HMONG,
+ HB_SCRIPT_WANCHO,
+
+ // Unicode 13.0 additions (not present in harfbuzz-ng 2.6.4)
hb_script_t(HB_TAG('C', 'h', 'o', 'r')), // Script_Chorasmian
hb_script_t(HB_TAG('D', 'i', 'v', 'e')), // Script_DivesAkuru
hb_script_t(HB_TAG('K', 'h', 'i', 't')), // Script_KhitanSmallScript
@@ -261,15 +263,6 @@ _hb_qt_unicode_combining_class(hb_unicode_funcs_t * /*ufuncs*/,
return hb_unicode_combining_class_t(QChar::combiningClass(unicode));
}
-static unsigned int
-_hb_qt_unicode_eastasian_width(hb_unicode_funcs_t * /*ufuncs*/,
- hb_codepoint_t /*unicode*/,
- void * /*user_data*/)
-{
- qCritical("hb_qt_unicode_eastasian_width: not implemented!");
- return 1;
-}
-
static const hb_unicode_general_category_t _qtcategory_to_hbcategory[] = {
HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK, // Mn
HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK, // Mc
@@ -405,37 +398,17 @@ _hb_qt_unicode_decompose(hb_unicode_funcs_t * /*ufuncs*/,
return true;
}
-static unsigned int
-_hb_qt_unicode_decompose_compatibility(hb_unicode_funcs_t * /*ufuncs*/,
- hb_codepoint_t u,
- hb_codepoint_t *decomposed,
- void * /*user_data*/)
-{
- const QString normalized = QChar::decomposition(u);
-
- uint outlen = 0;
- QStringIterator it(normalized);
- while (it.hasNext()) {
- Q_ASSERT(outlen < HB_UNICODE_MAX_DECOMPOSITION_LEN);
- decomposed[outlen++] = it.next();
- }
-
- return outlen;
-}
-
struct _hb_unicode_funcs_t {
_hb_unicode_funcs_t()
{
funcs = hb_unicode_funcs_create(NULL);
hb_unicode_funcs_set_combining_class_func(funcs, _hb_qt_unicode_combining_class, NULL, NULL);
- hb_unicode_funcs_set_eastasian_width_func(funcs, _hb_qt_unicode_eastasian_width, NULL, NULL);
hb_unicode_funcs_set_general_category_func(funcs, _hb_qt_unicode_general_category, NULL, NULL);
hb_unicode_funcs_set_mirroring_func(funcs, _hb_qt_unicode_mirroring, NULL, NULL);
hb_unicode_funcs_set_script_func(funcs, _hb_qt_unicode_script, NULL, NULL);
hb_unicode_funcs_set_compose_func(funcs, _hb_qt_unicode_compose, NULL, NULL);
hb_unicode_funcs_set_decompose_func(funcs, _hb_qt_unicode_decompose, NULL, NULL);
- hb_unicode_funcs_set_decompose_compatibility_func(funcs, _hb_qt_unicode_decompose_compatibility, NULL, NULL);
}
~_hb_unicode_funcs_t()
{
@@ -619,11 +592,6 @@ struct _hb_qt_font_funcs_t {
Q_GLOBAL_STATIC(_hb_qt_font_funcs_t, qt_ffuncs)
-hb_font_funcs_t *hb_qt_get_font_funcs()
-{
- return qt_ffuncs()->funcs;
-}
-
static hb_blob_t *
_hb_qt_reference_table(hb_face_t * /*face*/, hb_tag_t tag, void *user_data)
@@ -639,13 +607,14 @@ _hb_qt_reference_table(hb_face_t * /*face*/, hb_tag_t tag, void *user_data)
return hb_blob_get_empty();
char *buffer = static_cast<char *>(malloc(length));
- Q_CHECK_PTR(buffer);
+ if (q_check_ptr(buffer) == nullptr)
+ return nullptr;
if (Q_UNLIKELY(!get_font_table(data->user_data, tag, reinterpret_cast<uchar *>(buffer), &length)))
- length = 0;
+ return nullptr;
return hb_blob_create(const_cast<const char *>(buffer), length,
- HB_MEMORY_MODE_READONLY,
+ HB_MEMORY_MODE_WRITABLE,
buffer, free);
}
@@ -658,10 +627,6 @@ _hb_qt_face_create(QFontEngine *fe)
data->get_font_table = fe->faceData.get_font_table;
hb_face_t *face = hb_face_create_for_tables(_hb_qt_reference_table, (void *)data, free);
- if (Q_UNLIKELY(hb_face_is_immutable(face))) {
- hb_face_destroy(face);
- return NULL;
- }
hb_face_set_index(face, fe->faceId().index);
hb_face_set_upem(face, fe->emSquareSize().truncate());
@@ -672,8 +637,7 @@ _hb_qt_face_create(QFontEngine *fe)
static void
_hb_qt_face_release(void *user_data)
{
- if (Q_LIKELY(user_data))
- hb_face_destroy(static_cast<hb_face_t *>(user_data));
+ hb_face_destroy(static_cast<hb_face_t *>(user_data));
}
hb_face_t *hb_qt_face_get_for_engine(QFontEngine *fe)
@@ -691,20 +655,13 @@ static inline hb_font_t *
_hb_qt_font_create(QFontEngine *fe)
{
hb_face_t *face = hb_qt_face_get_for_engine(fe);
- if (Q_UNLIKELY(!face))
- return NULL;
hb_font_t *font = hb_font_create(face);
- if (Q_UNLIKELY(hb_font_is_immutable(font))) {
- hb_font_destroy(font);
- return NULL;
- }
-
const qreal y_ppem = fe->fontDef.pixelSize;
const qreal x_ppem = (fe->fontDef.pixelSize * fe->fontDef.stretch) / 100.0;
- hb_font_set_funcs(font, hb_qt_get_font_funcs(), (void *)fe, NULL);
+ hb_font_set_funcs(font, qt_ffuncs()->funcs, fe, nullptr);
hb_font_set_scale(font, QFixed::fromReal(x_ppem).value(), -QFixed::fromReal(y_ppem).value());
hb_font_set_ppem(font, int(x_ppem), int(y_ppem));
@@ -716,8 +673,7 @@ _hb_qt_font_create(QFontEngine *fe)
static void
_hb_qt_font_release(void *user_data)
{
- if (Q_LIKELY(user_data))
- hb_font_destroy(static_cast<hb_font_t *>(user_data));
+ hb_font_destroy(static_cast<hb_font_t *>(user_data));
}
hb_font_t *hb_qt_font_get_for_engine(QFontEngine *fe)
diff --git a/src/gui/text/qharfbuzzng_p.h b/src/gui/text/qharfbuzzng_p.h
index fabf222bae..4fb7e0aef7 100644
--- a/src/gui/text/qharfbuzzng_p.h
+++ b/src/gui/text/qharfbuzzng_p.h
@@ -58,24 +58,33 @@ QT_REQUIRE_CONFIG(harfbuzz);
#include <QtCore/qchar.h>
-#include <harfbuzz/hb.h>
+#if defined(QT_BUILD_GUI_LIB)
+# include <harfbuzz/hb.h>
+#else
+// a minimal set of HB types required for Qt libs other than Gui
+
+typedef struct hb_face_t hb_face_t;
+typedef struct hb_font_t hb_font_t;
+
+#endif // QT_BUILD_GUI_LIB
QT_BEGIN_NAMESPACE
class QFontEngine;
+#if defined(QT_BUILD_GUI_LIB)
+
// Unicode
-Q_GUI_EXPORT hb_script_t hb_qt_script_to_script(QChar::Script script);
-Q_GUI_EXPORT QChar::Script hb_qt_script_from_script(hb_script_t script);
+hb_script_t hb_qt_script_to_script(QChar::Script script);
+QChar::Script hb_qt_script_from_script(hb_script_t script);
-Q_GUI_EXPORT hb_unicode_funcs_t *hb_qt_get_unicode_funcs();
+hb_unicode_funcs_t *hb_qt_get_unicode_funcs();
+#endif // QT_BUILD_GUI_LIB
// Font
-Q_GUI_EXPORT hb_font_funcs_t *hb_qt_get_font_funcs();
-
Q_GUI_EXPORT hb_face_t *hb_qt_face_get_for_engine(QFontEngine *fe);
Q_GUI_EXPORT hb_font_t *hb_qt_font_get_for_engine(QFontEngine *fe);
diff --git a/src/gui/text/qplatformfontdatabase.cpp b/src/gui/text/qplatformfontdatabase.cpp
index 48ba8987f3..0e19f6866f 100644
--- a/src/gui/text/qplatformfontdatabase.cpp
+++ b/src/gui/text/qplatformfontdatabase.cpp
@@ -40,6 +40,7 @@
#include "qplatformfontdatabase.h"
#include <QtGui/private/qfontengine_p.h>
#include <QtGui/private/qfontengine_qpf2_p.h>
+#include <QtGui/private/qfontdatabase_p.h>
#include <QtGui/QGuiApplication>
#include <QtGui/QScreen>
#include <qpa/qplatformscreen.h>
@@ -376,16 +377,27 @@ QFontEngine *QPlatformFontDatabase::fontEngine(const QByteArray &fontData, qreal
or using the font contained in the file referenced by \a fileName. Returns
a list of family names, or an empty list if the font could not be added.
+ If \a applicationFont is non-null, its \c properties vector should be filled
+ with information from the loaded fonts. This is exposed through FontLoader in
+ Qt Quick where it is needed for disambiguating fonts in the same family. When
+ the function exits, the \a applicationFont should contain an entry of properties
+ per font in the file, or it should be empty if no font was loaded.
+
\note The default implementation of this function does not add an application
font. Subclasses should reimplement this function to perform the necessary
loading and registration of fonts.
*/
-QStringList QPlatformFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
+QStringList QPlatformFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont)
{
Q_UNUSED(fontData);
Q_UNUSED(fileName);
+ Q_UNUSED(applicationFont);
+
+ if (applicationFont != nullptr)
+ applicationFont->properties.clear();
qWarning("This plugin does not support application fonts");
+
return QStringList();
}
@@ -534,6 +546,32 @@ enum CsbBits {
};
/*!
+ Helper function that determines the writing system support based on the contents of the OS/2 table
+ in the font.
+
+ \since 6.0
+*/
+QSupportedWritingSystems QPlatformFontDatabase::writingSystemsFromOS2Table(const char *os2Table, size_t length)
+{
+ if (length >= 86) {
+ quint32 unicodeRange[4] = {
+ qFromBigEndian<quint32>(os2Table + 42),
+ qFromBigEndian<quint32>(os2Table + 46),
+ qFromBigEndian<quint32>(os2Table + 50),
+ qFromBigEndian<quint32>(os2Table + 54)
+ };
+ quint32 codePageRange[2] = {
+ qFromBigEndian<quint32>(os2Table + 78),
+ qFromBigEndian<quint32>(os2Table + 82)
+ };
+
+ return writingSystemsFromTrueTypeBits(unicodeRange, codePageRange);
+ }
+
+ return QSupportedWritingSystems();
+}
+
+/*!
Helper function that determines the writing systems support by a given
\a unicodeRange and \a codePageRange.
diff --git a/src/gui/text/qplatformfontdatabase.h b/src/gui/text/qplatformfontdatabase.h
index f79c5db625..2d25d9a036 100644
--- a/src/gui/text/qplatformfontdatabase.h
+++ b/src/gui/text/qplatformfontdatabase.h
@@ -59,6 +59,7 @@
#include <QtGui/QFontDatabase>
#include <QtGui/private/qfontengine_p.h>
#include <QtGui/private/qfont_p.h>
+#include <QtGui/private/qfontdatabase_p.h>
QT_BEGIN_NAMESPACE
@@ -111,7 +112,7 @@ public:
virtual QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QChar::Script script);
virtual QFontEngine *fontEngine(const QFontDef &fontDef, void *handle);
virtual QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const;
- virtual QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName);
+ virtual QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *font = nullptr);
virtual void releaseHandle(void *handle);
virtual QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference);
@@ -127,6 +128,7 @@ public:
// helper
static QSupportedWritingSystems writingSystemsFromTrueTypeBits(quint32 unicodeRange[4], quint32 codePageRange[2]);
+ static QSupportedWritingSystems writingSystemsFromOS2Table(const char *os2Table, size_t length);
static QFont::Weight weightFromInteger(int weight);
//callback
diff --git a/src/gui/text/qrawfont.cpp b/src/gui/text/qrawfont.cpp
index b4b60cbaaf..cc96c9262b 100644
--- a/src/gui/text/qrawfont.cpp
+++ b/src/gui/text/qrawfont.cpp
@@ -323,7 +323,7 @@ bool QRawFont::operator==(const QRawFont &other) const
\relates QRawFont
\since 5.8
*/
-uint qHash(const QRawFont &font, uint seed) noexcept
+size_t qHash(const QRawFont &font, size_t seed) noexcept
{
return qHash(QRawFontPrivate::get(font)->fontEngine, seed);
}
diff --git a/src/gui/text/qrawfont.h b/src/gui/text/qrawfont.h
index c6289d6c93..823c92b050 100644
--- a/src/gui/text/qrawfont.h
+++ b/src/gui/text/qrawfont.h
@@ -156,7 +156,7 @@ Q_DECLARE_SHARED(QRawFont)
Q_DECLARE_OPERATORS_FOR_FLAGS(QRawFont::LayoutFlags)
-Q_GUI_EXPORT uint qHash(const QRawFont &font, uint seed = 0) noexcept;
+Q_GUI_EXPORT size_t qHash(const QRawFont &font, size_t seed = 0) noexcept;
inline QVector<QPointF> QRawFont::advancesForGlyphIndexes(const QVector<quint32> &glyphIndexes, QRawFont::LayoutFlags layoutFlags) const
{
diff --git a/src/gui/text/qsyntaxhighlighter.cpp b/src/gui/text/qsyntaxhighlighter.cpp
index b50957d63d..8abcac5dec 100644
--- a/src/gui/text/qsyntaxhighlighter.cpp
+++ b/src/gui/text/qsyntaxhighlighter.cpp
@@ -173,7 +173,7 @@ void QSyntaxHighlighterPrivate::reformatBlocks(int from, int charsRemoved, int c
if (lastBlock.isValid())
endPosition = lastBlock.position() + lastBlock.length();
else
- endPosition = doc->docHandle()->length();
+ endPosition = QTextDocumentPrivate::get(doc)->length();
bool forceHighlightOfNextBlock = false;
diff --git a/src/gui/text/qtextcursor.cpp b/src/gui/text/qtextcursor.cpp
index fa323ef4bd..c579eca1ff 100644
--- a/src/gui/text/qtextcursor.cpp
+++ b/src/gui/text/qtextcursor.cpp
@@ -1052,7 +1052,7 @@ QTextCursor::QTextCursor()
Constructs a cursor pointing to the beginning of the \a document.
*/
QTextCursor::QTextCursor(QTextDocument *document)
- : d(new QTextCursorPrivate(document->docHandle()))
+ : d(new QTextCursorPrivate(QTextDocumentPrivate::get(document)))
{
}
@@ -1060,7 +1060,7 @@ QTextCursor::QTextCursor(QTextDocument *document)
Constructs a cursor pointing to the beginning of the \a frame.
*/
QTextCursor::QTextCursor(QTextFrame *frame)
- : d(new QTextCursorPrivate(frame->document()->docHandle()))
+ : d(new QTextCursorPrivate(QTextDocumentPrivate::get(frame->document())))
{
d->adjusted_anchor = d->anchor = d->position = frame->firstPosition();
}
@@ -1070,7 +1070,7 @@ QTextCursor::QTextCursor(QTextFrame *frame)
Constructs a cursor pointing to the beginning of the \a block.
*/
QTextCursor::QTextCursor(const QTextBlock &block)
- : d(new QTextCursorPrivate(block.docHandle()))
+ : d(new QTextCursorPrivate(const_cast<QTextDocumentPrivate *>(QTextDocumentPrivate::get(block))))
{
d->adjusted_anchor = d->anchor = d->position = block.position();
}
@@ -2264,7 +2264,7 @@ void QTextCursor::insertFragment(const QTextDocumentFragment &fragment)
d->setX();
if (fragment.d && fragment.d->doc)
- d->priv->mergeCachedResources(fragment.d->doc->docHandle());
+ d->priv->mergeCachedResources(QTextDocumentPrivate::get(fragment.d->doc));
}
/*!
diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp
index 64ba01d4e5..9cc1ba6c1c 100644
--- a/src/gui/text/qtextdocument.cpp
+++ b/src/gui/text/qtextdocument.cpp
@@ -40,13 +40,13 @@
#include "qtextdocument.h"
#include <qtextformat.h>
#include "qtextcursor_p.h"
+#include "qtextdocument_p.h"
#include "qtextdocumentlayout_p.h"
#include "qtextdocumentfragment.h"
#include "qtextdocumentfragment_p.h"
#include "qtexttable.h"
#include "qtextlist.h"
#include <qdebug.h>
-#include <qregexp.h>
#if QT_CONFIG(regularexpression)
#include <qregularexpression.h>
#endif
@@ -1328,7 +1328,8 @@ static bool findInBlock(const QTextBlock &block, const QString &expression, int
}
}
//we have a hit, return the cursor for that.
- *cursor = QTextCursorPrivate::fromPosition(block.docHandle(), block.position() + idx);
+ *cursor = QTextCursorPrivate::fromPosition(const_cast<QTextDocumentPrivate *>(QTextDocumentPrivate::get(block)),
+ block.position() + idx);
cursor->setPosition(cursor->position() + expression.length(), QTextCursor::KeepAnchor);
return true;
}
@@ -1420,139 +1421,10 @@ QTextCursor QTextDocument::find(const QString &subString, const QTextCursor &cur
return find(subString, pos, options);
}
-
-#ifndef QT_NO_REGEXP
-static bool findInBlock(const QTextBlock &block, const QRegExp &expression, int offset,
- QTextDocument::FindFlags options, QTextCursor *cursor)
-{
- QRegExp expr(expression);
- QString text = block.text();
- text.replace(QChar::Nbsp, QLatin1Char(' '));
-
- int idx = -1;
- while (offset >=0 && offset <= text.length()) {
- idx = (options & QTextDocument::FindBackward) ?
- expr.lastIndexIn(text, offset) : expr.indexIn(text, offset);
- if (idx == -1)
- return false;
-
- if (options & QTextDocument::FindWholeWords) {
- const int start = idx;
- const int end = start + expr.matchedLength();
- if ((start != 0 && text.at(start - 1).isLetterOrNumber())
- || (end != text.length() && text.at(end).isLetterOrNumber())) {
- //if this is not a whole word, continue the search in the string
- offset = (options & QTextDocument::FindBackward) ? idx-1 : end+1;
- idx = -1;
- continue;
- }
- }
- //we have a hit, return the cursor for that.
- *cursor = QTextCursorPrivate::fromPosition(block.docHandle(), block.position() + idx);
- cursor->setPosition(cursor->position() + expr.matchedLength(), QTextCursor::KeepAnchor);
- return true;
- }
- return false;
-}
-
-/*!
- \overload
-
- Finds the next occurrence that matches the given regular expression,
- \a expr, within the same paragraph in the document.
-
- The search starts at the given \a from position, and proceeds forwards
- through the document unless specified otherwise in the search options.
- The \a options control the type of search performed. The FindCaseSensitively
- option is ignored for this overload, use QRegExp::caseSensitivity instead.
-
- Returns a cursor with the match selected if a match was found; otherwise
- returns a null cursor.
-
- If the \a from position is 0 (the default) the search begins from the beginning
- of the document; otherwise it begins at the specified position.
-*/
-QTextCursor QTextDocument::find(const QRegExp & expr, int from, FindFlags options) const
-{
- Q_D(const QTextDocument);
-
- if (expr.isEmpty())
- return QTextCursor();
-
- int pos = from;
- //the cursor is positioned between characters, so for a backward search
- //do not include the character given in the position.
- if (options & FindBackward) {
- --pos ;
- if(pos < 0)
- return QTextCursor();
- }
-
- QTextCursor cursor;
- QTextBlock block = d->blocksFind(pos);
- int blockOffset = pos - block.position();
- if (!(options & FindBackward)) {
- while (block.isValid()) {
- if (findInBlock(block, expr, blockOffset, options, &cursor))
- return cursor;
- block = block.next();
- blockOffset = 0;
- }
- } else {
- while (block.isValid()) {
- if (findInBlock(block, expr, blockOffset, options, &cursor))
- return cursor;
- block = block.previous();
- blockOffset = block.length() - 1;
- }
- }
-
- return QTextCursor();
-}
-
-/*!
- \overload
-
- Finds the next occurrence that matches the given regular expression,
- \a expr, within the same paragraph in the document.
-
- The search starts at the position of the given from \a cursor, and proceeds
- forwards through the document unless specified otherwise in the search
- options. The \a options control the type of search performed. The FindCaseSensitively
- option is ignored for this overload, use QRegExp::caseSensitivity instead.
-
- Returns a cursor with the match selected if a match was found; otherwise
- returns a null cursor.
-
- If the given \a cursor has a selection, the search begins after the
- selection; otherwise it begins at the cursor's position.
-
- By default the search is case insensitive, and can match text anywhere in the
- document.
-*/
-QTextCursor QTextDocument::find(const QRegExp &expr, const QTextCursor &cursor, FindFlags options) const
-{
- int pos = 0;
- if (!cursor.isNull()) {
- if (options & QTextDocument::FindBackward)
- pos = cursor.selectionStart();
- else
- pos = cursor.selectionEnd();
- }
- return find(expr, pos, options);
-}
-#endif // QT_REGEXP
-
#if QT_CONFIG(regularexpression)
-static bool findInBlock(const QTextBlock &block, const QRegularExpression &expression, int offset,
+static bool findInBlock(const QTextBlock &block, const QRegularExpression &expr, int offset,
QTextDocument::FindFlags options, QTextCursor *cursor)
{
- QRegularExpression expr(expression);
- if (!(options & QTextDocument::FindCaseSensitively))
- expr.setPatternOptions(expr.patternOptions() | QRegularExpression::CaseInsensitiveOption);
- else
- expr.setPatternOptions(expr.patternOptions() & ~QRegularExpression::CaseInsensitiveOption);
-
QString text = block.text();
text.replace(QChar::Nbsp, QLatin1Char(' '));
QRegularExpressionMatch match;
@@ -1576,7 +1448,8 @@ static bool findInBlock(const QTextBlock &block, const QRegularExpression &expre
}
}
//we have a hit, return the cursor for that.
- *cursor = QTextCursorPrivate::fromPosition(block.docHandle(), block.position() + idx);
+ *cursor = QTextCursorPrivate::fromPosition(const_cast<QTextDocumentPrivate *>(QTextDocumentPrivate::get(block)),
+ block.position() + idx);
cursor->setPosition(cursor->position() + match.capturedLength(), QTextCursor::KeepAnchor);
return true;
}
@@ -1619,16 +1492,22 @@ QTextCursor QTextDocument::find(const QRegularExpression &expr, int from, FindFl
QTextBlock block = d->blocksFind(pos);
int blockOffset = pos - block.position();
+ QRegularExpression expression(expr);
+ if (!(options & QTextDocument::FindCaseSensitively))
+ expression.setPatternOptions(expr.patternOptions() | QRegularExpression::CaseInsensitiveOption);
+ else
+ expression.setPatternOptions(expr.patternOptions() & ~QRegularExpression::CaseInsensitiveOption);
+
if (!(options & FindBackward)) {
while (block.isValid()) {
- if (findInBlock(block, expr, blockOffset, options, &cursor))
+ if (findInBlock(block, expression, blockOffset, options, &cursor))
return cursor;
block = block.next();
blockOffset = 0;
}
} else {
while (block.isValid()) {
- if (findInBlock(block, expr, blockOffset, options, &cursor))
+ if (findInBlock(block, expression, blockOffset, options, &cursor))
return cursor;
block = block.previous();
blockOffset = block.length() - 1;
@@ -1737,7 +1616,7 @@ QTextObject *QTextDocument::objectForFormat(const QTextFormat &f) const
QTextBlock QTextDocument::findBlock(int pos) const
{
Q_D(const QTextDocument);
- return QTextBlock(docHandle(), d->blockMap().findNode(pos));
+ return QTextBlock(const_cast<QTextDocumentPrivate *>(d), d->blockMap().findNode(pos));
}
/*!
@@ -1749,7 +1628,7 @@ QTextBlock QTextDocument::findBlock(int pos) const
QTextBlock QTextDocument::findBlockByNumber(int blockNumber) const
{
Q_D(const QTextDocument);
- return QTextBlock(docHandle(), d->blockMap().findNode(blockNumber, 1));
+ return QTextBlock(const_cast<QTextDocumentPrivate *>(d), d->blockMap().findNode(blockNumber, 1));
}
/*!
@@ -1761,7 +1640,7 @@ QTextBlock QTextDocument::findBlockByNumber(int blockNumber) const
QTextBlock QTextDocument::findBlockByLineNumber(int lineNumber) const
{
Q_D(const QTextDocument);
- return QTextBlock(docHandle(), d->blockMap().findNode(lineNumber, 2));
+ return QTextBlock(const_cast<QTextDocumentPrivate *>(d), d->blockMap().findNode(lineNumber, 2));
}
/*!
@@ -1772,7 +1651,7 @@ QTextBlock QTextDocument::findBlockByLineNumber(int lineNumber) const
QTextBlock QTextDocument::begin() const
{
Q_D(const QTextDocument);
- return QTextBlock(docHandle(), d->blockMap().begin().n);
+ return QTextBlock(const_cast<QTextDocumentPrivate *>(d), d->blockMap().begin().n);
}
/*!
@@ -1789,7 +1668,8 @@ QTextBlock QTextDocument::begin() const
*/
QTextBlock QTextDocument::end() const
{
- return QTextBlock(docHandle(), 0);
+ Q_D(const QTextDocument);
+ return QTextBlock(const_cast<QTextDocumentPrivate *>(d), 0);
}
/*!
@@ -1799,7 +1679,7 @@ QTextBlock QTextDocument::end() const
QTextBlock QTextDocument::firstBlock() const
{
Q_D(const QTextDocument);
- return QTextBlock(docHandle(), d->blockMap().begin().n);
+ return QTextBlock(const_cast<QTextDocumentPrivate *>(d), d->blockMap().begin().n);
}
/*!
@@ -1809,7 +1689,7 @@ QTextBlock QTextDocument::firstBlock() const
QTextBlock QTextDocument::lastBlock() const
{
Q_D(const QTextDocument);
- return QTextBlock(docHandle(), d->blockMap().last().n);
+ return QTextBlock(const_cast<QTextDocumentPrivate *>(d), d->blockMap().last().n);
}
/*!
@@ -1893,12 +1773,14 @@ QFont QTextDocument::defaultFont() const
bool QTextDocument::isModified() const
{
- return docHandle()->isModified();
+ Q_D(const QTextDocument);
+ return d->isModified();
}
void QTextDocument::setModified(bool m)
{
- docHandle()->setModified(m);
+ Q_D(QTextDocument);
+ d->setModified(m);
}
#ifndef QT_NO_PRINTER
@@ -2046,8 +1928,9 @@ void QTextDocument::print(QPagedPaintDevice *printer) const
clonedDoc->setPageSize(body.size());
}
- int fromPage = pd->fromPage;
- int toPage = pd->toPage;
+ QRangeCollection *rangeCollection = pd->rangeCollection;
+ int fromPage = rangeCollection->firstPage();
+ int toPage = rangeCollection->lastPage();
if (fromPage == 0 && toPage == 0) {
fromPage = 1;
@@ -2073,7 +1956,8 @@ void QTextDocument::print(QPagedPaintDevice *printer) const
int page = fromPage;
while (true) {
- printPage(page, &p, doc, body, pageNumberPos);
+ if (rangeCollection->isEmpty() || rangeCollection->contains(page))
+ printPage(page, &p, doc, body, pageNumberPos);
if (page == toPage)
break;
@@ -2276,7 +2160,11 @@ static QString colorValue(QColor color)
if (color.alpha() == 255) {
result = color.name();
} else if (color.alpha()) {
- QString alphaValue = QString::number(color.alphaF(), 'f', 6).remove(QRegExp(QLatin1String("\\.?0*$")));
+ QString alphaValue = QString::number(color.alphaF(), 'f', 6);
+ while (alphaValue.length() > 1 && alphaValue.at(alphaValue.size() - 1) == QLatin1Char('0'))
+ alphaValue.chop(1);
+ if (alphaValue.at(alphaValue.size() - 1) == QLatin1Char('.'))
+ alphaValue.chop(1);
result = QString::fromLatin1("rgba(%1,%2,%3,%4)").arg(color.red())
.arg(color.green())
.arg(color.blue())
@@ -2314,17 +2202,16 @@ static QStringList resolvedFontFamilies(const QTextCharFormat &format)
perfect, especially for complex documents, due to the limitations
of HTML.
*/
-QString QTextHtmlExporter::toHtml(const QByteArray &encoding, ExportMode mode)
+QString QTextHtmlExporter::toHtml(ExportMode mode)
{
html = QLatin1String("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" />");
- html.reserve(doc->docHandle()->length());
+ html.reserve(QTextDocumentPrivate::get(doc)->length());
fragmentMarkers = (mode == ExportFragment);
- if (!encoding.isEmpty())
- html += QString::fromLatin1("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=%1\" />").arg(QString::fromLatin1(encoding));
+ html += QString::fromLatin1("<meta charset=\"utf-8\" />");
QString title = doc->metaInformation(QTextDocument::DocumentTitle);
if (!title.isEmpty())
@@ -2779,10 +2666,10 @@ void QTextHtmlExporter::emitFragment(const QTextFragment &fragment)
txt = txt.toHtmlEscaped();
// split for [\n{LineSeparator}]
- QString forcedLineBreakRegExp = QString::fromLatin1("[\\na]");
- forcedLineBreakRegExp[3] = QChar::LineSeparator;
// space in BR on purpose for compatibility with old-fashioned browsers
- html += txt.replace(QRegExp(forcedLineBreakRegExp), QLatin1String("<br />"));
+ txt.replace(QLatin1Char('\n'), QLatin1String("<br />"));
+ txt.replace(QChar::LineSeparator, QLatin1String("<br />"));
+ html += txt;
}
if (attributesEmitted)
@@ -2889,8 +2776,9 @@ void QTextHtmlExporter::emitBlock(const QTextBlock &block)
int p = block.position();
if (p > 0)
--p;
- QTextDocumentPrivate::FragmentIterator frag = doc->docHandle()->find(p);
- QChar ch = doc->docHandle()->buffer().at(frag->stringPosition);
+
+ QTextDocumentPrivate::FragmentIterator frag = QTextDocumentPrivate::get(doc)->find(p);
+ QChar ch = QTextDocumentPrivate::get(doc)->buffer().at(frag->stringPosition);
if (ch == QTextBeginningOfFrame
|| ch == QTextEndOfFrame)
return;
@@ -3008,7 +2896,7 @@ void QTextHtmlExporter::emitBlock(const QTextBlock &block)
for (; !it.atEnd(); ++it)
emitFragment(it.fragment());
- if (fragmentMarkers && block.position() + block.length() == doc->docHandle()->length())
+ if (fragmentMarkers && block.position() + block.length() == QTextDocumentPrivate::get(doc)->length())
html += QLatin1String("<!--EndFragment-->");
if (pre)
@@ -3046,27 +2934,27 @@ QString QTextHtmlExporter::findUrlForImage(const QTextDocument *doc, qint64 cach
if (QTextDocument *parent = qobject_cast<QTextDocument *>(doc->parent()))
return findUrlForImage(parent, cacheKey, isPixmap);
- if (doc && doc->docHandle()) {
- QTextDocumentPrivate *priv = doc->docHandle();
- QMap<QUrl, QVariant>::const_iterator it = priv->cachedResources.constBegin();
- for (; it != priv->cachedResources.constEnd(); ++it) {
+ const QTextDocumentPrivate *priv = QTextDocumentPrivate::get(doc);
+ Q_ASSERT(priv != nullptr);
- const QVariant &v = it.value();
- if (v.userType() == QMetaType::QImage && !isPixmap) {
- if (qvariant_cast<QImage>(v).cacheKey() == cacheKey)
- break;
- }
+ QMap<QUrl, QVariant>::const_iterator it = priv->cachedResources.constBegin();
+ for (; it != priv->cachedResources.constEnd(); ++it) {
- if (v.userType() == QMetaType::QPixmap && isPixmap) {
- if (qvariant_cast<QPixmap>(v).cacheKey() == cacheKey)
- break;
- }
+ const QVariant &v = it.value();
+ if (v.userType() == QMetaType::QImage && !isPixmap) {
+ if (qvariant_cast<QImage>(v).cacheKey() == cacheKey)
+ break;
}
- if (it != priv->cachedResources.constEnd())
- url = it.key().toString();
+ if (v.userType() == QMetaType::QPixmap && isPixmap) {
+ if (qvariant_cast<QPixmap>(v).cacheKey() == cacheKey)
+ break;
+ }
}
+ if (it != priv->cachedResources.constEnd())
+ url = it.key().toString();
+
return url;
}
@@ -3350,23 +3238,17 @@ void QTextHtmlExporter::emitFrameStyle(const QTextFrameFormat &format, FrameType
/*!
Returns a string containing an HTML representation of the document.
- The \a encoding parameter specifies the value for the charset attribute
- in the html header. For example if 'utf-8' is specified then the
- beginning of the generated html will look like this:
- \snippet code/src_gui_text_qtextdocument.cpp 0
-
- If no encoding is specified then no such meta information is generated.
-
+ The content of the document specifies its encoding to be UTF-8.
If you later on convert the returned html string into a byte array for
- transmission over a network or when saving to disk you should specify
- the encoding you're going to use for the conversion to a byte array here.
+ transmission over a network or when saving to disk you should use
+ QString::toUtf8() to convert the string to a QByteArray.
\sa {Supported HTML Subset}
*/
#ifndef QT_NO_TEXTHTMLPARSER
-QString QTextDocument::toHtml(const QByteArray &encoding) const
+QString QTextDocument::toHtml() const
{
- return QTextHtmlExporter(this).toHtml(encoding);
+ return QTextHtmlExporter(this).toHtml();
}
#endif // QT_NO_TEXTHTMLPARSER
@@ -3435,18 +3317,6 @@ QVector<QTextFormat> QTextDocument::allFormats() const
return d->formatCollection()->formats;
}
-
-/*!
- \internal
-
- So that not all classes have to be friends of each other...
-*/
-QTextDocumentPrivate *QTextDocument::docHandle() const
-{
- Q_D(const QTextDocument);
- return const_cast<QTextDocumentPrivate *>(d);
-}
-
/*!
\since 4.4
\fn QTextDocument::undoCommandAdded()
diff --git a/src/gui/text/qtextdocument.h b/src/gui/text/qtextdocument.h
index 2459c78768..369851ceea 100644
--- a/src/gui/text/qtextdocument.h
+++ b/src/gui/text/qtextdocument.h
@@ -147,7 +147,7 @@ public:
QString metaInformation(MetaInformation info) const;
#ifndef QT_NO_TEXTHTMLPARSER
- QString toHtml(const QByteArray &encoding = QByteArray()) const;
+ QString toHtml() const;
void setHtml(const QString &html);
#endif
@@ -186,11 +186,6 @@ public:
QTextCursor find(const QString &subString, int from = 0, FindFlags options = FindFlags()) const;
QTextCursor find(const QString &subString, const QTextCursor &cursor, FindFlags options = FindFlags()) const;
-#ifndef QT_NO_REGEXP
- QTextCursor find(const QRegExp &expr, int from = 0, FindFlags options = FindFlags()) const;
- QTextCursor find(const QRegExp &expr, const QTextCursor &cursor, FindFlags options = FindFlags()) const;
-#endif
-
#if QT_CONFIG(regularexpression)
QTextCursor find(const QRegularExpression &expr, int from = 0, FindFlags options = FindFlags()) const;
QTextCursor find(const QRegularExpression &expr, const QTextCursor &cursor, FindFlags options = FindFlags()) const;
@@ -316,8 +311,6 @@ protected:
Q_INVOKABLE virtual QVariant loadResource(int type, const QUrl &name);
QTextDocument(QTextDocumentPrivate &dd, QObject *parent);
-public:
- QTextDocumentPrivate *docHandle() const;
private:
Q_DISABLE_COPY(QTextDocument)
Q_DECLARE_PRIVATE(QTextDocument)
diff --git a/src/gui/text/qtextdocument_p.h b/src/gui/text/qtextdocument_p.h
index ce8e905eb0..35d605007d 100644
--- a/src/gui/text/qtextdocument_p.h
+++ b/src/gui/text/qtextdocument_p.h
@@ -65,6 +65,7 @@
#include "QtGui/qtextcursor.h"
#include "QtCore/qmap.h"
#include "QtCore/qvariant.h"
+#include "QtCore/qset.h"
#include "QtCore/qurl.h"
#include "private/qcssparser_p.h"
@@ -295,6 +296,36 @@ public:
bool ensureMaximumBlockCount();
+ static inline const QTextDocumentPrivate *get(const QTextDocument *document)
+ {
+ return document->d_func();
+ }
+
+ static inline QTextDocumentPrivate *get(QTextDocument *document)
+ {
+ return document->d_func();
+ }
+
+ static inline QTextDocumentPrivate *get(QTextBlock &block)
+ {
+ return block.p;
+ }
+
+ static inline const QTextDocumentPrivate *get(const QTextBlock &block)
+ {
+ return block.p;
+ }
+
+ static inline QTextDocumentPrivate *get(QTextObject *object)
+ {
+ return get(object->document());
+ }
+
+ static inline const QTextDocumentPrivate *get(const QTextObject *object)
+ {
+ return get(object->document());
+ }
+
private:
QTextDocumentPrivate(const QTextDocumentPrivate& m);
QTextDocumentPrivate& operator= (const QTextDocumentPrivate& m);
@@ -373,7 +404,7 @@ public:
ExportFragment
};
- QString toHtml(const QByteArray &encoding, ExportMode mode = ExportEntireDocument);
+ QString toHtml(ExportMode mode = ExportEntireDocument);
private:
enum StyleMode { EmitStyleTag, OmitStyleTag };
diff --git a/src/gui/text/qtextdocumentfragment.cpp b/src/gui/text/qtextdocumentfragment.cpp
index d7bc707491..6ea13f176f 100644
--- a/src/gui/text/qtextdocumentfragment.cpp
+++ b/src/gui/text/qtextdocumentfragment.cpp
@@ -224,13 +224,14 @@ QTextDocumentFragmentPrivate::QTextDocumentFragmentPrivate(const QTextCursor &_c
if (!_cursor.hasSelection())
return;
- doc->docHandle()->beginEditBlock();
+ QTextDocumentPrivate *p = QTextDocumentPrivate::get(doc);
+ p->beginEditBlock();
QTextCursor destCursor(doc);
QTextCopyHelper(_cursor, destCursor).copy();
- doc->docHandle()->endEditBlock();
+ p->endEditBlock();
if (_cursor.d)
- doc->docHandle()->mergeCachedResources(_cursor.d->priv);
+ p->mergeCachedResources(_cursor.d->priv);
}
void QTextDocumentFragmentPrivate::insert(QTextCursor &_cursor) const
@@ -353,7 +354,7 @@ QTextDocumentFragment::~QTextDocumentFragment()
*/
bool QTextDocumentFragment::isEmpty() const
{
- return !d || !d->doc || d->doc->docHandle()->length() <= 1;
+ return d == nullptr || d->doc == nullptr || QTextDocumentPrivate::get(d->doc)->length() <= 1;
}
/*!
@@ -375,17 +376,16 @@ QString QTextDocumentFragment::toPlainText() const
/*!
\since 4.2
- Returns the contents of the document fragment as HTML,
- using the specified \a encoding (e.g., "UTF-8", "ISO 8859-1").
+ Returns the contents of the document fragment as HTML.
- \sa toPlainText(), QTextDocument::toHtml(), QTextCodec
+ \sa toPlainText(), QTextDocument::toHtml()
*/
-QString QTextDocumentFragment::toHtml(const QByteArray &encoding) const
+QString QTextDocumentFragment::toHtml() const
{
if (!d)
return QString();
- return QTextHtmlExporter(d->doc).toHtml(encoding, QTextHtmlExporter::ExportFragment);
+ return QTextHtmlExporter(d->doc).toHtml(QTextHtmlExporter::ExportFragment);
}
#endif // QT_NO_TEXTHTMLPARSER
@@ -1267,12 +1267,6 @@ void QTextHtmlImporter::appendBlock(const QTextBlockFormat &format, QTextCharFor
*/
#ifndef QT_NO_TEXTHTMLPARSER
-
-QTextDocumentFragment QTextDocumentFragment::fromHtml(const QString &html)
-{
- return fromHtml(html, nullptr);
-}
-
/*!
\fn QTextDocumentFragment QTextDocumentFragment::fromHtml(const QString &text, const QTextDocument *resourceProvider)
\since 4.2
diff --git a/src/gui/text/qtextdocumentfragment.h b/src/gui/text/qtextdocumentfragment.h
index a56f6d06d6..2283b06c6c 100644
--- a/src/gui/text/qtextdocumentfragment.h
+++ b/src/gui/text/qtextdocumentfragment.h
@@ -65,13 +65,12 @@ public:
QString toPlainText() const;
#ifndef QT_NO_TEXTHTMLPARSER
- QString toHtml(const QByteArray &encoding = QByteArray()) const;
+ QString toHtml() const;
#endif // QT_NO_TEXTHTMLPARSER
static QTextDocumentFragment fromPlainText(const QString &plainText);
#ifndef QT_NO_TEXTHTMLPARSER
- static QTextDocumentFragment fromHtml(const QString &html);
- static QTextDocumentFragment fromHtml(const QString &html, const QTextDocument *resourceProvider);
+ static QTextDocumentFragment fromHtml(const QString &html, const QTextDocument *resourceProvider = nullptr);
#endif // QT_NO_TEXTHTMLPARSER
private:
diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp
index 9d70873590..91e5595fbf 100644
--- a/src/gui/text/qtextdocumentlayout.cpp
+++ b/src/gui/text/qtextdocumentlayout.cpp
@@ -3400,7 +3400,7 @@ void QTextDocumentLayoutPrivate::layoutFlow(QTextFrame::Iterator it, QTextLayout
} else {
currentLazyLayoutPosition = checkPoints.constLast().positionInFrame;
// #######
- //checkPoints.last().positionInFrame = q->document()->docHandle()->length();
+ //checkPoints.last().positionInFrame = QTextDocumentPrivate::get(q->document())->length();
}
}
@@ -4146,7 +4146,7 @@ int QTextDocumentLayout::layoutStatus() const
int pos = d->currentLazyLayoutPosition;
if (pos == -1)
return 100;
- return pos * 100 / d->document->docHandle()->length();
+ return pos * 100 / QTextDocumentPrivate::get(d->document)->length();
}
void QTextDocumentLayout::timerEvent(QTimerEvent *e)
diff --git a/src/gui/text/qtextdocumentwriter.cpp b/src/gui/text/qtextdocumentwriter.cpp
index 0bafa5d9ff..4a57268486 100644
--- a/src/gui/text/qtextdocumentwriter.cpp
+++ b/src/gui/text/qtextdocumentwriter.cpp
@@ -41,9 +41,6 @@
#include <QtCore/qfile.h>
#include <QtCore/qbytearray.h>
#include <QtCore/qfileinfo.h>
-#if QT_CONFIG(textcodec)
-#include <QtCore/qtextcodec.h>
-#endif
#include <QtCore/qtextstream.h>
#include <QtCore/qdebug.h>
#include "qtextdocument.h"
@@ -68,9 +65,6 @@ public:
QByteArray format;
QIODevice *device;
bool deleteDevice;
-#if QT_CONFIG(textcodec)
- QTextCodec *codec;
-#endif
QTextDocumentWriter *q;
};
@@ -109,9 +103,6 @@ public:
QTextDocumentWriterPrivate::QTextDocumentWriterPrivate(QTextDocumentWriter *qq)
: device(nullptr),
deleteDevice(false),
-#if QT_CONFIG(textcodec)
- codec(QTextCodec::codecForName("utf-8")),
-#endif
q(qq)
{
}
@@ -263,9 +254,6 @@ bool QTextDocumentWriter::write(const QTextDocument *document)
#ifndef QT_NO_TEXTODFWRITER
if (format == "odf" || format == "opendocumentformat" || format == "odt") {
QTextOdfWriter writer(*document, d->device);
-#if QT_CONFIG(textcodec)
- writer.setCodec(d->codec);
-#endif
return writer.writeAll();
}
#endif // QT_NO_TEXTODFWRITER
@@ -288,11 +276,7 @@ bool QTextDocumentWriter::write(const QTextDocument *document)
qWarning("QTextDocumentWriter::write: the device cannot be opened for writing");
return false;
}
- QTextStream ts(d->device);
-#if QT_CONFIG(textcodec)
- ts.setCodec(d->codec);
- ts << document->toHtml(d->codec->name());
-#endif
+ d->device->write(document->toHtml().toUtf8());
d->device->close();
return true;
}
@@ -304,7 +288,7 @@ bool QTextDocumentWriter::write(const QTextDocument *document)
}
QTextStream ts(d->device);
#if QT_CONFIG(textcodec)
- ts.setCodec(d->codec);
+ ts.setCodec("utf-8");
#endif
ts << document->toPlainText();
d->device->close();
@@ -329,32 +313,6 @@ bool QTextDocumentWriter::write(const QTextDocumentFragment &fragment)
}
/*!
- Sets the codec for this stream to \a codec. The codec is used for
- encoding any data that is written. By default, QTextDocumentWriter
- uses UTF-8.
-*/
-
-#if QT_CONFIG(textcodec)
-void QTextDocumentWriter::setCodec(QTextCodec *codec)
-{
- if (codec == nullptr)
- codec = QTextCodec::codecForName("UTF-8");
- Q_ASSERT(codec);
- d->codec = codec;
-}
-#endif
-
-/*!
- Returns the codec that is currently assigned to the writer.
-*/
-#if QT_CONFIG(textcodec)
-QTextCodec *QTextDocumentWriter::codec() const
-{
- return d->codec;
-}
-#endif
-
-/*!
Returns the list of document formats supported by QTextDocumentWriter.
By default, Qt can write the following formats:
diff --git a/src/gui/text/qtextdocumentwriter.h b/src/gui/text/qtextdocumentwriter.h
index 4a57b181b4..cb34da7e8e 100644
--- a/src/gui/text/qtextdocumentwriter.h
+++ b/src/gui/text/qtextdocumentwriter.h
@@ -70,11 +70,6 @@ public:
bool write(const QTextDocument *document);
bool write(const QTextDocumentFragment &fragment);
-#if QT_CONFIG(textcodec)
- void setCodec(QTextCodec *codec);
- QTextCodec *codec() const;
-#endif
-
static QList<QByteArray> supportedDocumentFormats();
private:
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 26e8141184..990dfa2537 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -1510,7 +1510,12 @@ void QTextEngine::shapeText(int item) const
itemBoundaries.append(0);
}
- if (Q_UNLIKELY(!shapingEnabled)) {
+#if QT_CONFIG(harfbuzz)
+ if (Q_LIKELY(shapingEnabled && qt_useHarfbuzzNG())) {
+ si.num_glyphs = shapeTextWithHarfbuzzNG(si, string, itemLength, fontEngine, itemBoundaries, kerningEnabled, letterSpacing != 0);
+ } else
+#endif
+ {
ushort *log_clusters = logClusters(&si);
int glyph_pos = 0;
@@ -1540,12 +1545,6 @@ void QTextEngine::shapeText(int item) const
}
si.num_glyphs = glyph_pos;
-#if QT_CONFIG(harfbuzz)
- } else if (Q_LIKELY(qt_useHarfbuzzNG())) {
- si.num_glyphs = shapeTextWithHarfbuzzNG(si, string, itemLength, fontEngine, itemBoundaries, kerningEnabled, letterSpacing != 0);
-#endif
- } else {
- si.num_glyphs = shapeTextWithHarfbuzz(si, string, itemLength, fontEngine, itemBoundaries, kerningEnabled);
}
if (Q_UNLIKELY(si.num_glyphs == 0)) {
Q_UNREACHABLE(); // ### report shaping errors somehow
@@ -1627,7 +1626,8 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si,
props.direction = si.analysis.bidiLevel % 2 ? HB_DIRECTION_RTL : HB_DIRECTION_LTR;
QChar::Script script = QChar::Script(si.analysis.script);
props.script = hb_qt_script_to_script(script);
- // ### props.language = hb_language_get_default_for_script(props.script);
+ // ### TODO get_default_for_script?
+ props.language = hb_language_get_default(); // use default language from locale
for (int k = 0; k < itemBoundaries.size(); k += 3) {
const uint item_pos = itemBoundaries[k];
@@ -1642,22 +1642,7 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si,
hb_buffer_clear_contents(buffer);
hb_buffer_add_utf16(buffer, reinterpret_cast<const uint16_t *>(string) + item_pos, item_length, 0, item_length);
-#if defined(Q_OS_DARWIN)
- // ### temporary workaround for QTBUG-38113
- // CoreText throws away the PDF token, while the OpenType backend will replace it with
- // a zero-advance glyph. This becomes a real issue when PDF is the last character,
- // since it gets treated like if it were a grapheme extender, so we
- // temporarily replace it with some visible grapheme starter.
- bool endsWithPDF = actualFontEngine->type() == QFontEngine::Mac && string[item_pos + item_length - 1] == 0x202c;
- if (Q_UNLIKELY(endsWithPDF)) {
- uint num_glyphs;
- hb_glyph_info_t *infos = hb_buffer_get_glyph_infos(buffer, &num_glyphs);
- infos[num_glyphs - 1].codepoint = '.';
- }
-#endif
-
hb_buffer_set_segment_properties(buffer, &props);
- hb_buffer_guess_segment_properties(buffer);
uint buffer_flags = HB_BUFFER_FLAG_DEFAULT;
// Symbol encoding used to encode various crap in the 32..255 character code range,
@@ -1680,28 +1665,21 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si,
bool dontLigate = hasLetterSpacing && !scriptRequiresOpenType;
const hb_feature_t features[5] = {
- { HB_TAG('k','e','r','n'), !!kerningEnabled, 0, uint(-1) },
- { HB_TAG('l','i','g','a'), !dontLigate, 0, uint(-1) },
- { HB_TAG('c','l','i','g'), !dontLigate, 0, uint(-1) },
- { HB_TAG('d','l','i','g'), !dontLigate, 0, uint(-1) },
- { HB_TAG('h','l','i','g'), !dontLigate, 0, uint(-1) } };
+ { HB_TAG('k','e','r','n'), !!kerningEnabled, HB_FEATURE_GLOBAL_START, HB_FEATURE_GLOBAL_END },
+ { HB_TAG('l','i','g','a'), false, HB_FEATURE_GLOBAL_START, HB_FEATURE_GLOBAL_END },
+ { HB_TAG('c','l','i','g'), false, HB_FEATURE_GLOBAL_START, HB_FEATURE_GLOBAL_END },
+ { HB_TAG('d','l','i','g'), false, HB_FEATURE_GLOBAL_START, HB_FEATURE_GLOBAL_END },
+ { HB_TAG('h','l','i','g'), false, HB_FEATURE_GLOBAL_START, HB_FEATURE_GLOBAL_END }
+ };
const int num_features = dontLigate ? 5 : 1;
- const char *const *shaper_list = nullptr;
-#if defined(Q_OS_DARWIN)
- // What's behind QFontEngine::FaceData::user_data isn't compatible between different font engines
- // - specifically functions in hb-coretext.cc would run into undefined behavior with data
- // from non-CoreText engine. The other shapers works with that engine just fine.
- if (actualFontEngine->type() != QFontEngine::Mac) {
- static const char *s_shaper_list_without_coretext[] = {
- "graphite2",
- "ot",
- "fallback",
- nullptr
- };
- shaper_list = s_shaper_list_without_coretext;
- }
-#endif
+ // whitelist cross-platforms shapers only
+ static const char *shaper_list[] = {
+ "graphite2",
+ "ot",
+ "fallback",
+ nullptr
+ };
bool shapedOk = hb_shape_full(hb_font, buffer, features, num_features, shaper_list);
if (Q_UNLIKELY(!shapedOk)) {
@@ -1753,35 +1731,11 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si,
while (str_pos < item_length)
log_clusters[str_pos++] = last_glyph_pos;
-#if defined(Q_OS_DARWIN)
- if (Q_UNLIKELY(endsWithPDF)) {
- int last_glyph_idx = num_glyphs - 1;
- g.glyphs[last_glyph_idx] = 0xffff;
- g.advances[last_glyph_idx] = QFixed();
- g.offsets[last_glyph_idx].x = QFixed();
- g.offsets[last_glyph_idx].y = QFixed();
- g.attributes[last_glyph_idx].clusterStart = true;
- g.attributes[last_glyph_idx].dontPrint = true;
-
- log_clusters[item_length - 1] = glyphs_shaped + last_glyph_idx;
- }
-#endif
-
if (Q_UNLIKELY(engineIdx != 0)) {
for (quint32 i = 0; i < num_glyphs; ++i)
g.glyphs[i] |= (engineIdx << 24);
}
-#ifdef Q_OS_DARWIN
- if (actualFontEngine->type() == QFontEngine::Mac) {
- if (actualFontEngine->fontDef.stretch != 100 && actualFontEngine->fontDef.stretch != QFont::AnyStretch) {
- QFixed stretch = QFixed(int(actualFontEngine->fontDef.stretch)) / QFixed(100);
- for (uint i = 0; i < num_glyphs; ++i)
- g.advances[i] *= stretch;
- }
- }
-#endif
-
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
if (!actualFontEngine->supportsSubPixelPositions() || (actualFontEngine->fontDef.styleStrategy & QFont::ForceIntegerMetrics)) {
@@ -1800,138 +1754,6 @@ QT_WARNING_POP
#endif // harfbuzz
-
-QT_BEGIN_INCLUDE_NAMESPACE
-
-#include <private/qharfbuzz_p.h>
-
-QT_END_INCLUDE_NAMESPACE
-
-Q_STATIC_ASSERT(sizeof(HB_Glyph) == sizeof(glyph_t));
-Q_STATIC_ASSERT(sizeof(HB_Fixed) == sizeof(QFixed));
-Q_STATIC_ASSERT(sizeof(HB_FixedPoint) == sizeof(QFixedPoint));
-
-static inline void moveGlyphData(const QGlyphLayout &destination, const QGlyphLayout &source, int num)
-{
- if (num > 0 && destination.glyphs != source.glyphs)
- memmove(destination.glyphs, source.glyphs, num * sizeof(glyph_t));
-}
-
-int QTextEngine::shapeTextWithHarfbuzz(const QScriptItem &si, const ushort *string, int itemLength, QFontEngine *fontEngine, const QVector<uint> &itemBoundaries, bool kerningEnabled) const
-{
- HB_ShaperItem entire_shaper_item;
- memset(&entire_shaper_item, 0, sizeof(entire_shaper_item));
- entire_shaper_item.string = reinterpret_cast<const HB_UChar16 *>(string);
- entire_shaper_item.stringLength = itemLength;
- entire_shaper_item.item.script = script_to_hbscript(si.analysis.script);
- entire_shaper_item.item.pos = 0;
- entire_shaper_item.item.length = itemLength;
- entire_shaper_item.item.bidiLevel = si.analysis.bidiLevel;
-
- entire_shaper_item.shaperFlags = 0;
- if (!kerningEnabled)
- entire_shaper_item.shaperFlags |= HB_ShaperFlag_NoKerning;
- if (option.useDesignMetrics())
- entire_shaper_item.shaperFlags |= HB_ShaperFlag_UseDesignMetrics;
-
- // ensure we are not asserting in HB_HeuristicSetGlyphAttributes()
- entire_shaper_item.num_glyphs = 0;
- for (int i = 0; i < itemLength; ++i, ++entire_shaper_item.num_glyphs) {
- if (QChar::isHighSurrogate(string[i]) && i + 1 < itemLength && QChar::isLowSurrogate(string[i + 1]))
- ++i;
- }
-
-
- int remaining_glyphs = entire_shaper_item.num_glyphs;
- int glyph_pos = 0;
- // for each item shape using harfbuzz and store the results in our layoutData's glyphs array.
- for (int k = 0; k < itemBoundaries.size(); k += 3) {
- HB_ShaperItem shaper_item = entire_shaper_item;
- shaper_item.item.pos = itemBoundaries[k];
- if (k + 4 < itemBoundaries.size()) {
- shaper_item.item.length = itemBoundaries[k + 3] - shaper_item.item.pos;
- shaper_item.num_glyphs = itemBoundaries[k + 4] - itemBoundaries[k + 1];
- } else { // last combo in the list, avoid out of bounds access.
- shaper_item.item.length -= shaper_item.item.pos - entire_shaper_item.item.pos;
- shaper_item.num_glyphs -= itemBoundaries[k + 1];
- }
- shaper_item.initialGlyphCount = shaper_item.num_glyphs;
- if (shaper_item.num_glyphs < shaper_item.item.length)
- shaper_item.num_glyphs = shaper_item.item.length;
-
- uint engineIdx = itemBoundaries[k + 2];
- QFontEngine *actualFontEngine = fontEngine;
- if (fontEngine->type() == QFontEngine::Multi) {
- actualFontEngine = static_cast<QFontEngineMulti *>(fontEngine)->engine(engineIdx);
-
- if ((si.analysis.bidiLevel % 2) == 0)
- shaper_item.glyphIndicesPresent = true;
- }
-
- shaper_item.font = (HB_Font)actualFontEngine->harfbuzzFont();
- shaper_item.face = (HB_Face)actualFontEngine->harfbuzzFace();
-
- remaining_glyphs -= shaper_item.initialGlyphCount;
-
- QVarLengthArray<HB_GlyphAttributes, 128> hbGlyphAttributes;
- do {
- if (!ensureSpace(glyph_pos + shaper_item.num_glyphs + remaining_glyphs))
- return 0;
- if (hbGlyphAttributes.size() < int(shaper_item.num_glyphs)) {
- hbGlyphAttributes.resize(shaper_item.num_glyphs);
- memset(hbGlyphAttributes.data(), 0, hbGlyphAttributes.size() * sizeof(HB_GlyphAttributes));
- }
-
- const QGlyphLayout g = availableGlyphs(&si).mid(glyph_pos);
- if (fontEngine->type() == QFontEngine::Multi && shaper_item.num_glyphs > shaper_item.item.length)
- moveGlyphData(g.mid(shaper_item.num_glyphs), g.mid(shaper_item.initialGlyphCount), remaining_glyphs);
-
- shaper_item.glyphs = reinterpret_cast<HB_Glyph *>(g.glyphs);
- shaper_item.advances = reinterpret_cast<HB_Fixed *>(g.advances);
- shaper_item.offsets = reinterpret_cast<HB_FixedPoint *>(g.offsets);
- shaper_item.attributes = hbGlyphAttributes.data();
-
- if (engineIdx != 0 && shaper_item.glyphIndicesPresent) {
- for (quint32 i = 0; i < shaper_item.initialGlyphCount; ++i)
- shaper_item.glyphs[i] &= 0x00ffffff;
- }
-
- shaper_item.log_clusters = logClusters(&si) + shaper_item.item.pos - entire_shaper_item.item.pos;
- } while (!qShapeItem(&shaper_item)); // this does the actual shaping via harfbuzz.
-
- QGlyphLayout g = availableGlyphs(&si).mid(glyph_pos, shaper_item.num_glyphs);
- if (fontEngine->type() == QFontEngine::Multi)
- moveGlyphData(g.mid(shaper_item.num_glyphs), g.mid(shaper_item.initialGlyphCount), remaining_glyphs);
-
- for (quint32 i = 0; i < shaper_item.num_glyphs; ++i) {
- HB_GlyphAttributes hbAttrs = hbGlyphAttributes.at(i);
- QGlyphAttributes &attrs = g.attributes[i];
- attrs.clusterStart = hbAttrs.clusterStart;
- attrs.dontPrint = hbAttrs.dontPrint;
- attrs.justification = hbAttrs.justification;
- }
-
- for (quint32 i = 0; i < shaper_item.item.length; ++i) {
- // Workaround wrong log_clusters for surrogates (i.e. QTBUG-39875)
- if (shaper_item.log_clusters[i] >= shaper_item.num_glyphs)
- shaper_item.log_clusters[i] = shaper_item.num_glyphs - 1;
- shaper_item.log_clusters[i] += glyph_pos;
- }
-
- if (kerningEnabled && !shaper_item.kerning_applied)
- actualFontEngine->doKerning(&g, option.useDesignMetrics() ? QFontEngine::DesignMetrics : QFontEngine::ShaperFlags{});
-
- if (engineIdx != 0) {
- for (quint32 i = 0; i < shaper_item.num_glyphs; ++i)
- g.glyphs[i] |= (engineIdx << 24);
- }
-
- glyph_pos += shaper_item.num_glyphs;
- }
-
- return glyph_pos;
-}
-
void QTextEngine::init(QTextEngine *e)
{
e->ignoreBidi = false;
@@ -1985,7 +1807,7 @@ const QCharAttributes *QTextEngine::attributes() const
for (int i = 0; i < layoutData->items.size(); ++i) {
const QScriptItem &si = layoutData->items.at(i);
scriptItems[i].position = si.position;
- scriptItems[i].script = si.analysis.script;
+ scriptItems[i].script = QChar::Script(si.analysis.script);
}
QUnicodeTools::initCharAttributes(reinterpret_cast<const ushort *>(layoutData->string.constData()),
@@ -2005,7 +1827,7 @@ void QTextEngine::shape(int item) const
auto &li = layoutData->items[item];
if (li.analysis.flags == QScriptAnalysis::Object) {
ensureSpace(1);
- if (block.docHandle()) {
+ if (QTextDocumentPrivate::get(block) != nullptr) {
docLayout()->resizeInlineObject(QTextInlineObject(item, const_cast<QTextEngine *>(this)),
li.position + block.position(),
format(&li));
@@ -2061,7 +1883,7 @@ void QTextEngine::validate() const
if (layoutData)
return;
layoutData = new LayoutData();
- if (block.docHandle()) {
+ if (QTextDocumentPrivate::get(block) != nullptr) {
layoutData->string = block.text();
const bool nextBlockValid = block.next().isValid();
if (!nextBlockValid && option.flags() & QTextOption::ShowDocumentTerminator) {
@@ -2098,10 +1920,14 @@ void QTextEngine::itemize() const
layoutData->hasBidi = bidi.process();
{
- QVarLengthArray<uchar> scripts(length);
- QUnicodeTools::initScripts(string, length, scripts.data());
- for (int i = 0; i < length; ++i)
- analysis[i].script = scripts.at(i);
+ QUnicodeTools::ScriptItemArray scriptItems;
+ QUnicodeTools::initScripts(string, length, &scriptItems);
+ for (int i = 0; i < scriptItems.length(); ++i) {
+ const auto &item = scriptItems.at(i);
+ int end = i < scriptItems.length() - 1 ? scriptItems.at(i + 1).position : length;
+ for (int j = item.position; j < end; ++j)
+ analysis[j].script = item.script;
+ }
}
const ushort *uc = string;
@@ -2137,26 +1963,16 @@ void QTextEngine::itemize() const
analysis->flags = QScriptAnalysis::None;
break;
}
-#if !QT_CONFIG(harfbuzz)
- analysis->script = hbscript_to_script(script_to_hbscript(analysis->script));
-#endif
++uc;
++analysis;
}
if (option.flags() & QTextOption::ShowLineAndParagraphSeparators) {
(analysis-1)->flags = QScriptAnalysis::LineOrParagraphSeparator; // to exclude it from width
}
-#if QT_CONFIG(harfbuzz)
- analysis = scriptAnalysis.data();
- if (!qt_useHarfbuzzNG()) {
- for (int i = 0; i < length; ++i)
- analysis[i].script = hbscript_to_script(script_to_hbscript(analysis[i].script));
- }
-#endif
Itemizer itemizer(layoutData->string, scriptAnalysis.data(), layoutData->items);
- const QTextDocumentPrivate *p = block.docHandle();
+ const QTextDocumentPrivate *p = QTextDocumentPrivate::get(block);
if (p) {
SpecialData *s = specialData;
@@ -2434,9 +2250,10 @@ QFont QTextEngine::font(const QScriptItem &si) const
QTextCharFormat f = format(&si);
font = f.font();
- if (block.docHandle() && block.docHandle()->layout()) {
+ const QTextDocumentPrivate *document_d = QTextDocumentPrivate::get(block);
+ if (document_d != nullptr && document_d->layout() != nullptr) {
// Make sure we get the right dpi on printers
- QPaintDevice *pdev = block.docHandle()->layout()->paintDevice();
+ QPaintDevice *pdev = document_d->layout()->paintDevice();
if (pdev)
font = QFont(font, pdev);
} else {
@@ -2511,9 +2328,9 @@ QFontEngine *QTextEngine::fontEngine(const QScriptItem &si, QFixed *ascent, QFix
QTextCharFormat f = format(&si);
font = f.font();
- if (block.docHandle() && block.docHandle()->layout()) {
+ if (QTextDocumentPrivate::get(block) != nullptr && QTextDocumentPrivate::get(block)->layout() != nullptr) {
// Make sure we get the right dpi on printers
- QPaintDevice *pdev = block.docHandle()->layout()->paintDevice();
+ QPaintDevice *pdev = QTextDocumentPrivate::get(block)->layout()->paintDevice();
if (pdev)
font = QFont(font, pdev);
} else {
@@ -2810,10 +2627,10 @@ void QScriptLine::setDefaultHeight(QTextEngine *eng)
QFont f;
QFontEngine *e;
- if (eng->block.docHandle() && eng->block.docHandle()->layout()) {
+ if (QTextDocumentPrivate::get(eng->block) != nullptr && QTextDocumentPrivate::get(eng->block)->layout() != nullptr) {
f = eng->block.charFormat().font();
// Make sure we get the right dpi on printers
- QPaintDevice *pdev = eng->block.docHandle()->layout()->paintDevice();
+ QPaintDevice *pdev = QTextDocumentPrivate::get(eng->block)->layout()->paintDevice();
if (pdev)
f = QFont(f, pdev);
e = f.d->engineForScript(QChar::Script_Common);
@@ -2975,7 +2792,7 @@ int QTextEngine::formatIndex(const QScriptItem *si) const
return collection->indexForFormat(specialData->resolvedFormats.at(si - &layoutData->items.at(0)));
}
- QTextDocumentPrivate *p = block.docHandle();
+ const QTextDocumentPrivate *p = QTextDocumentPrivate::get(block);
if (!p)
return -1;
int pos = si->position;
@@ -3100,7 +2917,7 @@ void QTextEngine::indexFormats()
{
QTextFormatCollection *collection = formatCollection();
if (!collection) {
- Q_ASSERT(!block.docHandle());
+ Q_ASSERT(QTextDocumentPrivate::get(block) == nullptr);
specialData->formatCollection.reset(new QTextFormatCollection);
collection = specialData->formatCollection.data();
}
@@ -3362,8 +3179,8 @@ QFixed QTextEngine::calculateTabWidth(int item, QFixed x) const
const QScriptItem &si = layoutData->items[item];
QFixed dpiScale = 1;
- if (block.docHandle() && block.docHandle()->layout()) {
- QPaintDevice *pdev = block.docHandle()->layout()->paintDevice();
+ if (QTextDocumentPrivate::get(block) != nullptr && QTextDocumentPrivate::get(block)->layout() != nullptr) {
+ QPaintDevice *pdev = QTextDocumentPrivate::get(block)->layout()->paintDevice();
if (pdev)
dpiScale = QFixed::fromReal(pdev->logicalDpiY() / qreal(qt_defaultDpiY()));
} else {
@@ -3525,8 +3342,8 @@ void QTextEngine::resolveFormats() const
}
QTextCharFormat &format = resolvedFormats[i];
- if (block.docHandle()) {
- // when we have a docHandle, formatIndex might still return a valid index based
+ if (QTextDocumentPrivate::get(block) != nullptr) {
+ // when we have a QTextDocumentPrivate, formatIndex might still return a valid index based
// on the preeditPosition. for all other cases, we cleared the resolved format indices
format = collection->charFormat(formatIndex(si));
}
diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h
index f069951ce5..ab4dc59594 100644
--- a/src/gui/text/qtextengine_p.h
+++ b/src/gui/text/qtextengine_p.h
@@ -525,14 +525,14 @@ public:
int findItem(int strPos, int firstItem = 0) const;
inline QTextFormatCollection *formatCollection() const {
- if (block.docHandle())
- return block.docHandle()->formatCollection();
+ if (QTextDocumentPrivate::get(block) != nullptr)
+ return const_cast<QTextFormatCollection *>(QTextDocumentPrivate::get(block)->formatCollection());
return specialData ? specialData->formatCollection.data() : nullptr;
}
QTextCharFormat format(const QScriptItem *si) const;
inline QAbstractTextDocumentLayout *docLayout() const {
- Q_ASSERT(block.docHandle());
- return block.docHandle()->document()->documentLayout();
+ Q_ASSERT(QTextDocumentPrivate::get(block) != nullptr);
+ return QTextDocumentPrivate::get(block)->document()->documentLayout();
}
int formatIndex(const QScriptItem *si) const;
@@ -589,14 +589,14 @@ public:
ItemDecorationList overlineList;
inline bool visualCursorMovement() const
- { return visualMovement || (block.docHandle() && block.docHandle()->defaultCursorMoveStyle == Qt::VisualMoveStyle); }
+ { return visualMovement || (QTextDocumentPrivate::get(block) != nullptr && QTextDocumentPrivate::get(block)->defaultCursorMoveStyle == Qt::VisualMoveStyle); }
inline int preeditAreaPosition() const { return specialData ? specialData->preeditPosition : -1; }
inline QString preeditAreaText() const { return specialData ? specialData->preeditText : QString(); }
void setPreeditArea(int position, const QString &text);
inline bool hasFormats() const
- { return block.docHandle() || (specialData && !specialData->formats.isEmpty()); }
+ { return QTextDocumentPrivate::get(block) != nullptr || (specialData && !specialData->formats.isEmpty()); }
inline QVector<QTextLayout::FormatRange> formats() const
{ return specialData ? specialData->formats : QVector<QTextLayout::FormatRange>(); }
void setFormats(const QVector<QTextLayout::FormatRange> &formats);
@@ -609,7 +609,7 @@ private:
QString preeditText;
QVector<QTextLayout::FormatRange> formats;
QVector<QTextCharFormat> resolvedFormats;
- // only used when no docHandle is available
+ // only used when no QTextDocumentPrivate is available
QScopedPointer<QTextFormatCollection> formatCollection;
};
SpecialData *specialData;
@@ -662,7 +662,6 @@ private:
bool kerningEnabled,
bool hasLetterSpacing) const;
#endif
- int shapeTextWithHarfbuzz(const QScriptItem &si, const ushort *string, int itemLength, QFontEngine *fontEngine, const QVector<uint> &itemBoundaries, bool kerningEnabled) const;
int endOfLine(int lineNum);
int beginningOfLine(int lineNum);
diff --git a/src/gui/text/qtextformat.cpp b/src/gui/text/qtextformat.cpp
index 10b8ade117..e94fad8890 100644
--- a/src/gui/text/qtextformat.cpp
+++ b/src/gui/text/qtextformat.cpp
@@ -201,10 +201,9 @@ public:
inline void insertProperty(qint32 key, const QVariant &value)
{
hashDirty = true;
- if ((key >= QTextFormat::FirstFontProperty && key <= QTextFormat::LastFontProperty)
- || key == QTextFormat::FontLetterSpacingType) {
+ if (key >= QTextFormat::FirstFontProperty && key <= QTextFormat::LastFontProperty)
fontDirty = true;
- }
+
for (int i = 0; i < props.count(); ++i)
if (props.at(i).key == key) {
props[i].value = value;
@@ -218,10 +217,8 @@ public:
for (int i = 0; i < props.count(); ++i)
if (props.at(i).key == key) {
hashDirty = true;
- if ((key >= QTextFormat::FirstFontProperty && key <= QTextFormat::LastFontProperty)
- || key == QTextFormat::FontLetterSpacingType) {
+ if (key >= QTextFormat::FirstFontProperty && key <= QTextFormat::LastFontProperty)
fontDirty = true;
- }
props.remove(i);
return;
}
@@ -444,7 +441,22 @@ void QTextFormatPrivate::recalcFont() const
#ifndef QT_NO_DATASTREAM
Q_GUI_EXPORT QDataStream &operator<<(QDataStream &stream, const QTextFormat &fmt)
{
- stream << fmt.format_type << fmt.properties();
+ QMap<int, QVariant> properties = fmt.properties();
+ if (stream.version() < QDataStream::Qt_6_0) {
+ auto it = properties.find(QTextFormat::FontLetterSpacingType);
+ if (it != properties.end()) {
+ properties[QTextFormat::OldFontLetterSpacingType] = it.value();
+ properties.erase(it);
+ }
+
+ it = properties.find(QTextFormat::FontStretch);
+ if (it != properties.end()) {
+ properties[QTextFormat::OldFontStretch] = it.value();
+ properties.erase(it);
+ }
+ }
+
+ stream << fmt.format_type << properties;
return stream;
}
@@ -459,8 +471,14 @@ Q_GUI_EXPORT QDataStream &operator>>(QDataStream &stream, QTextFormat &fmt)
fmt.d = new QTextFormatPrivate();
for (QMap<qint32, QVariant>::ConstIterator it = properties.constBegin();
- it != properties.constEnd(); ++it)
- fmt.d->insertProperty(it.key(), it.value());
+ it != properties.constEnd(); ++it) {
+ qint32 key = it.key();
+ if (key == QTextFormat::OldFontLetterSpacingType)
+ key = QTextFormat::FontLetterSpacingType;
+ else if (key == QTextFormat::OldFontStretch)
+ key = QTextFormat::FontStretch;
+ fmt.d->insertProperty(key, it.value());
+ }
return stream;
}
@@ -620,6 +638,8 @@ Q_GUI_EXPORT QDataStream &operator>>(QDataStream &stream, QTextFormat &fmt)
\value IsAnchor
\value AnchorHref
\value AnchorName
+ \omitvalue OldFontLetterSpacingType
+ \omitvalue OldFontStretch
\value ObjectType
List properties
diff --git a/src/gui/text/qtextformat.h b/src/gui/text/qtextformat.h
index 28da0fe344..b4db18289e 100644
--- a/src/gui/text/qtextformat.h
+++ b/src/gui/text/qtextformat.h
@@ -184,16 +184,16 @@ public:
// character properties
FirstFontProperty = 0x1FE0,
FontCapitalization = FirstFontProperty,
- FontLetterSpacingType = 0x2033,
FontLetterSpacing = 0x1FE1,
FontWordSpacing = 0x1FE2,
- FontStretch = 0x2034,
FontStyleHint = 0x1FE3,
FontStyleStrategy = 0x1FE4,
FontKerning = 0x1FE5,
FontHintingPreference = 0x1FE6,
FontFamilies = 0x1FE7,
FontStyleName = 0x1FE8,
+ FontLetterSpacingType = 0x1FE9,
+ FontStretch = 0x1FEA,
FontFamily = 0x2000,
FontPointSize = 0x2001,
FontSizeAdjustment = 0x2002,
@@ -207,7 +207,7 @@ public:
FontPixelSize = 0x2009,
LastFontProperty = FontPixelSize,
- TextUnderlineColor = 0x2010,
+ TextUnderlineColor = 0x2020,
TextVerticalAlignment = 0x2021,
TextOutline = 0x2022,
TextUnderlineStyle = 0x2023,
@@ -216,6 +216,12 @@ public:
IsAnchor = 0x2030,
AnchorHref = 0x2031,
AnchorName = 0x2032,
+
+ // Included for backwards compatibility with old QDataStreams.
+ // Should not be referenced in user code.
+ OldFontLetterSpacingType = 0x2033,
+ OldFontStretch = 0x2034,
+
ObjectType = 0x2f00,
// list properties
diff --git a/src/gui/text/qtexthtmlparser.cpp b/src/gui/text/qtexthtmlparser.cpp
index f003544391..76ff99aae0 100644
--- a/src/gui/text/qtexthtmlparser.cpp
+++ b/src/gui/text/qtexthtmlparser.cpp
@@ -1373,7 +1373,7 @@ void QTextHtmlParserNode::applyCssDeclarations(const QVector<QCss::Declaration>
case QCss::QtForegroundTextureCacheKey:
{
- if (resourceProvider != nullptr && resourceProvider->docHandle() != nullptr) {
+ if (resourceProvider != nullptr && QTextDocumentPrivate::get(resourceProvider) != nullptr) {
bool ok;
qint64 searchKey = decl.d->values.first().variant.toLongLong(&ok);
if (ok)
@@ -1415,7 +1415,7 @@ void QTextHtmlParserNode::applyCssDeclarations(const QVector<QCss::Declaration>
void QTextHtmlParserNode::applyForegroundImage(qint64 searchKey, const QTextDocument *resourceProvider)
{
- QTextDocumentPrivate *priv = resourceProvider->docHandle();
+ const QTextDocumentPrivate *priv = QTextDocumentPrivate::get(resourceProvider);
for (int i = 0; i < priv->formats.numFormats(); ++i) {
QTextCharFormat format = priv->formats.charFormat(i);
if (format.isValid()) {
@@ -2110,7 +2110,7 @@ QVector<QCss::Declaration> QTextHtmlParser::declarationsForNode(int node) const
+ externalStyleSheets.count()
+ inlineStyleSheets.count());
if (resourceProvider)
- selector.styleSheets[idx++] = resourceProvider->docHandle()->parsedDefaultStyleSheet;
+ selector.styleSheets[idx++] = QTextDocumentPrivate::get(resourceProvider)->parsedDefaultStyleSheet;
for (int i = 0; i < externalStyleSheets.count(); ++i, ++idx)
selector.styleSheets[idx] = externalStyleSheets.at(i).sheet;
diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp
index 50faee4853..4d0a9e3a7c 100644
--- a/src/gui/text/qtextlayout.cpp
+++ b/src/gui/text/qtextlayout.cpp
@@ -491,8 +491,8 @@ void QTextLayout::setPreeditArea(int position, const QString &text)
return;
d->setPreeditArea(position, text);
- if (d->block.docHandle())
- d->block.docHandle()->documentChange(d->block.position(), d->block.length());
+ if (QTextDocumentPrivate::get(d->block) != nullptr)
+ QTextDocumentPrivate::get(d->block)->documentChange(d->block.position(), d->block.length());
}
/*!
@@ -538,8 +538,8 @@ void QTextLayout::setFormats(const QVector<FormatRange> &formats)
{
d->setFormats(formats);
- if (d->block.docHandle())
- d->block.docHandle()->documentChange(d->block.position(), d->block.length());
+ if (QTextDocumentPrivate::get(d->block) != nullptr)
+ QTextDocumentPrivate::get(d->block)->documentChange(d->block.position(), d->block.length());
}
#if QT_DEPRECATED_SINCE(5, 6)
@@ -1919,7 +1919,7 @@ void QTextLine::layout_helper(int maxGlyphs)
lbh.whiteSpaceOrObject = true;
lbh.tmpData.length++;
- if (eng->block.docHandle()) {
+ if (QTextDocumentPrivate::get(eng->block) != nullptr) {
QTextInlineObject inlineObject(item, eng);
QTextFormat f = inlineObject.format();
eng->docLayout()->positionInlineObject(inlineObject, eng->block.position() + current.position, f);
@@ -2065,7 +2065,7 @@ found:
line += lbh.tmpData;
}
- if (hasInlineObject && eng->block.docHandle()) {
+ if (hasInlineObject && QTextDocumentPrivate::get(eng->block) != nullptr) {
// position top/bottom aligned inline objects
if (maxInlineObjectHeight > line.ascent + line.descent) {
// extend line height if required
@@ -2571,7 +2571,7 @@ void QTextLine::draw(QPainter *p, const QPointF &pos, const QTextLayout::FormatR
if (eng->hasFormats()) {
p->save();
- if (si.analysis.flags == QScriptAnalysis::Object && eng->block.docHandle()) {
+ if (si.analysis.flags == QScriptAnalysis::Object && QTextDocumentPrivate::get(eng->block)) {
QFixed itemY = y - si.ascent;
if (format.verticalAlignment() == QTextCharFormat::AlignTop) {
itemY = y - lineBase;
diff --git a/src/gui/text/qtextlist.cpp b/src/gui/text/qtextlist.cpp
index 5857afa048..25f2d7adf8 100644
--- a/src/gui/text/qtextlist.cpp
+++ b/src/gui/text/qtextlist.cpp
@@ -304,7 +304,7 @@ void QTextList::remove(const QTextBlock &block)
QTextBlockFormat fmt = block.blockFormat();
fmt.setIndent(fmt.indent() + format().indent());
fmt.setObjectIndex(-1);
- block.docHandle()->setBlockFormat(block, block, fmt, QTextDocumentPrivate::SetFormat);
+ const_cast<QTextDocumentPrivate *>(QTextDocumentPrivate::get(block))->setBlockFormat(block, block, fmt, QTextDocumentPrivate::SetFormat);
}
/*!
@@ -316,7 +316,7 @@ void QTextList::add(const QTextBlock &block)
{
QTextBlockFormat fmt = block.blockFormat();
fmt.setObjectIndex(objectIndex());
- block.docHandle()->setBlockFormat(block, block, fmt, QTextDocumentPrivate::SetFormat);
+ const_cast<QTextDocumentPrivate *>(QTextDocumentPrivate::get(block))->setBlockFormat(block, block, fmt, QTextDocumentPrivate::SetFormat);
}
QT_END_NAMESPACE
diff --git a/src/gui/text/qtextobject.cpp b/src/gui/text/qtextobject.cpp
index 77dcae0dc8..1476a8a58f 100644
--- a/src/gui/text/qtextobject.cpp
+++ b/src/gui/text/qtextobject.cpp
@@ -171,14 +171,6 @@ QTextDocument *QTextObject::document() const
}
/*!
- \internal
-*/
-QTextDocumentPrivate *QTextObject::docHandle() const
-{
- return static_cast<const QTextDocument *>(parent())->docHandle();
-}
-
-/*!
\class QTextBlockGroup
\reentrant
@@ -270,7 +262,7 @@ void QTextBlockGroup::blockRemoved(const QTextBlock &block)
d->blocks.removeAll(block);
d->markBlocksDirty();
if (d->blocks.isEmpty()) {
- document()->docHandle()->deleteObject(this);
+ QTextDocumentPrivate::get(document())->deleteObject(this);
return;
}
}
@@ -576,7 +568,7 @@ void QTextFramePrivate::remove_me()
Q_Q(QTextFrame);
if (fragment_start == 0 && fragment_end == 0
&& !parentFrame) {
- q->document()->docHandle()->deleteObject(q);
+ QTextDocumentPrivate::get(q->document())->deleteObject(q);
return;
}
@@ -630,7 +622,7 @@ void QTextFramePrivate::remove_me()
*/
QTextFrame::iterator QTextFrame::begin() const
{
- const QTextDocumentPrivate *priv = docHandle();
+ const QTextDocumentPrivate *priv = QTextDocumentPrivate::get(this);
int b = priv->blockMap().findNode(firstPosition());
int e = priv->blockMap().findNode(lastPosition()+1);
return iterator(const_cast<QTextFrame *>(this), b, b, e);
@@ -643,7 +635,7 @@ QTextFrame::iterator QTextFrame::begin() const
*/
QTextFrame::iterator QTextFrame::end() const
{
- const QTextDocumentPrivate *priv = docHandle();
+ const QTextDocumentPrivate *priv = QTextDocumentPrivate::get(this);
int b = priv->blockMap().findNode(firstPosition());
int e = priv->blockMap().findNode(lastPosition()+1);
return iterator(const_cast<QTextFrame *>(this), e, b, e);
@@ -724,7 +716,7 @@ QTextBlock QTextFrame::iterator::currentBlock() const
{
if (!f)
return QTextBlock();
- return QTextBlock(f->docHandle(), cb);
+ return QTextBlock(QTextDocumentPrivate::get(f), cb);
}
/*!
@@ -734,7 +726,7 @@ QTextBlock QTextFrame::iterator::currentBlock() const
*/
QTextFrame::iterator &QTextFrame::iterator::operator++()
{
- const QTextDocumentPrivate *priv = f->docHandle();
+ const QTextDocumentPrivate *priv = QTextDocumentPrivate::get(f);
const QTextDocumentPrivate::BlockMap &map = priv->blockMap();
if (cf) {
int end = cf->lastPosition() + 1;
@@ -772,7 +764,7 @@ QTextFrame::iterator &QTextFrame::iterator::operator++()
*/
QTextFrame::iterator &QTextFrame::iterator::operator--()
{
- const QTextDocumentPrivate *priv = f->docHandle();
+ const QTextDocumentPrivate *priv = QTextDocumentPrivate::get(f);
const QTextDocumentPrivate::BlockMap &map = priv->blockMap();
if (cf) {
int start = cf->firstPosition() - 1;
@@ -1014,12 +1006,6 @@ bool QTextBlock::isValid() const
*/
/*!
- \fn QTextDocumentPrivate *QTextBlock::docHandle() const
-
- \internal
-*/
-
-/*!
\fn int QTextBlock::fragmentIndex() const
\internal
diff --git a/src/gui/text/qtextobject.h b/src/gui/text/qtextobject.h
index 215a76fb4d..22e5e4e593 100644
--- a/src/gui/text/qtextobject.h
+++ b/src/gui/text/qtextobject.h
@@ -75,8 +75,6 @@ public:
int objectIndex() const;
- QTextDocumentPrivate *docHandle() const;
-
protected:
QTextObject(QTextObjectPrivate &p, QTextDocument *doc);
@@ -287,7 +285,6 @@ public:
QTextBlock next() const;
QTextBlock previous() const;
- inline QTextDocumentPrivate *docHandle() const { return p; }
inline int fragmentIndex() const { return n; }
private:
diff --git a/src/gui/text/qtextodfwriter.cpp b/src/gui/text/qtextodfwriter.cpp
index 155ec43c50..1613fa201c 100644
--- a/src/gui/text/qtextodfwriter.cpp
+++ b/src/gui/text/qtextodfwriter.cpp
@@ -998,7 +998,6 @@ QTextOdfWriter::QTextOdfWriter(const QTextDocument &document, QIODevice *device)
m_document(&document),
m_device(device),
m_strategy(nullptr),
- m_codec(nullptr),
m_createArchive(true)
{
}
@@ -1015,10 +1014,6 @@ bool QTextOdfWriter::writeAll()
return false;
}
QXmlStreamWriter writer(m_strategy->contentStream);
-#if QT_CONFIG(textcodec)
- if (m_codec)
- writer.setCodec(m_codec);
-#endif
// prettyfy
writer.setAutoFormatting(true);
writer.setAutoFormattingIndent(2);
@@ -1036,16 +1031,16 @@ bool QTextOdfWriter::writeAll()
writer.writeAttribute(officeNS, QString::fromLatin1("version"), QString::fromLatin1("1.2"));
// add fragments. (for character formats)
- QTextDocumentPrivate::FragmentIterator fragIt = m_document->docHandle()->begin();
+ QTextDocumentPrivate::FragmentIterator fragIt = QTextDocumentPrivate::get(m_document)->begin();
QSet<int> formats;
- while (fragIt != m_document->docHandle()->end()) {
+ while (fragIt != QTextDocumentPrivate::get(m_document)->end()) {
const QTextFragmentData * const frag = fragIt.value();
formats << frag->format;
++fragIt;
}
// add blocks (for blockFormats)
- QTextDocumentPrivate::BlockMap &blocks = m_document->docHandle()->blockMap();
+ QTextDocumentPrivate::BlockMap &blocks = const_cast<QTextDocumentPrivate *>(QTextDocumentPrivate::get(m_document))->blockMap();
QTextDocumentPrivate::BlockMap::Iterator blockIt = blocks.begin();
while (blockIt != blocks.end()) {
const QTextBlockData * const block = blockIt.value();
diff --git a/src/gui/text/qtextodfwriter_p.h b/src/gui/text/qtextodfwriter_p.h
index 98a6fdfa96..53d9084d80 100644
--- a/src/gui/text/qtextodfwriter_p.h
+++ b/src/gui/text/qtextodfwriter_p.h
@@ -86,7 +86,6 @@ public:
QTextOdfWriter(const QTextDocument &document, QIODevice *device);
bool writeAll();
- void setCodec(QTextCodec *codec) { m_codec = codec; }
void setCreateArchive(bool on) { m_createArchive = on; }
bool createArchive() const { return m_createArchive; }
@@ -116,7 +115,6 @@ private:
QIODevice *m_device;
QOutputStrategy *m_strategy;
- QTextCodec *m_codec;
bool m_createArchive;
QStack<QTextList *> m_listStack;
diff --git a/src/gui/text/qtextoption.h b/src/gui/text/qtextoption.h
index 8b57278633..808076603a 100644
--- a/src/gui/text/qtextoption.h
+++ b/src/gui/text/qtextoption.h
@@ -48,8 +48,6 @@
QT_BEGIN_NAMESPACE
-
-template <typename T> class QList;
struct QTextOptionPrivate;
class Q_GUI_EXPORT QTextOption
@@ -135,11 +133,11 @@ public:
bool useDesignMetrics() const { return design; }
private:
- uint align : 8;
+ uint align : 9;
uint wordWrap : 4;
uint design : 1;
uint direction : 2;
- uint unused : 17;
+ uint unused : 16;
uint unused2; // ### Qt 6: remove unnecessary, extra 32 bits
uint f;
qreal tab;
diff --git a/src/gui/text/qtexttable.cpp b/src/gui/text/qtexttable.cpp
index 39f26d5d42..ceef4d785a 100644
--- a/src/gui/text/qtexttable.cpp
+++ b/src/gui/text/qtexttable.cpp
@@ -121,7 +121,7 @@ void QTextTableCell::setFormat(const QTextCharFormat &format)
QTextCharFormat fmt = format;
fmt.clearProperty(QTextFormat::ObjectIndex);
fmt.setObjectType(QTextFormat::TableCellObject);
- QTextDocumentPrivate *p = table->docHandle();
+ QTextDocumentPrivate *p = const_cast<QTextDocumentPrivate *>(QTextDocumentPrivate::get(table));
QTextDocumentPrivate::FragmentIterator frag(&p->fragmentMap(), fragment);
QTextFormatCollection *c = p->formatCollection();
@@ -137,8 +137,8 @@ void QTextTableCell::setFormat(const QTextCharFormat &format)
*/
QTextCharFormat QTextTableCell::format() const
{
- QTextDocumentPrivate *p = table->docHandle();
- QTextFormatCollection *c = p->formatCollection();
+ const QTextDocumentPrivate *p = QTextDocumentPrivate::get(table);
+ const QTextFormatCollection *c = p->formatCollection();
QTextCharFormat fmt = c->charFormat(tableCellFormatIndex());
fmt.setObjectType(QTextFormat::TableCellObject);
@@ -154,7 +154,7 @@ QTextCharFormat QTextTableCell::format() const
*/
int QTextTableCell::tableCellFormatIndex() const
{
- QTextDocumentPrivate *p = table->docHandle();
+ const QTextDocumentPrivate *p = QTextDocumentPrivate::get(table);
return QTextDocumentPrivate::FragmentIterator(&p->fragmentMap(), fragment)->format;
}
@@ -248,7 +248,7 @@ QTextCursor QTextTableCell::lastCursorPosition() const
*/
int QTextTableCell::firstPosition() const
{
- QTextDocumentPrivate *p = table->docHandle();
+ const QTextDocumentPrivate *p = QTextDocumentPrivate::get(table);
return p->fragmentMap().position(fragment) + 1;
}
@@ -259,7 +259,7 @@ int QTextTableCell::firstPosition() const
*/
int QTextTableCell::lastPosition() const
{
- QTextDocumentPrivate *p = table->docHandle();
+ const QTextDocumentPrivate *p = QTextDocumentPrivate::get(table);
const QTextTablePrivate *td = table->d_func();
int index = table->d_func()->findCellIndex(fragment);
int f;
@@ -278,7 +278,7 @@ int QTextTableCell::lastPosition() const
*/
QTextFrame::iterator QTextTableCell::begin() const
{
- QTextDocumentPrivate *p = table->docHandle();
+ const QTextDocumentPrivate *p = QTextDocumentPrivate::get(table);
int b = p->blockMap().findNode(firstPosition());
int e = p->blockMap().findNode(lastPosition()+1);
return QTextFrame::iterator(const_cast<QTextTable *>(table), b, b, e);
@@ -291,7 +291,7 @@ QTextFrame::iterator QTextTableCell::begin() const
*/
QTextFrame::iterator QTextTableCell::end() const
{
- QTextDocumentPrivate *p = table->docHandle();
+ const QTextDocumentPrivate *p = QTextDocumentPrivate::get(table);
int b = p->blockMap().findNode(firstPosition());
int e = p->blockMap().findNode(lastPosition()+1);
return QTextFrame::iterator(const_cast<QTextTable *>(table), e, b, e);
diff --git a/src/gui/text/text.pri b/src/gui/text/text.pri
index 464ff3953b..ab93975344 100644
--- a/src/gui/text/text.pri
+++ b/src/gui/text/text.pri
@@ -3,6 +3,7 @@
HEADERS += \
text/qfont.h \
text/qfontdatabase.h \
+ text/qfontdatabase_p.h \
text/qfontengine_p.h \
text/qfontengineglyphcache_p.h \
text/qfontinfo.h \
diff --git a/src/gui/util/qgridlayoutengine.cpp b/src/gui/util/qgridlayoutengine.cpp
index 4af5e47f8f..f2d549b48f 100644
--- a/src/gui/util/qgridlayoutengine.cpp
+++ b/src/gui/util/qgridlayoutengine.cpp
@@ -960,7 +960,7 @@ void QGridLayoutEngine::insertItem(QGridLayoutItem *item, int index)
{
maybeExpandGrid(item->lastRow(), item->lastColumn());
- if (index == -1)
+ if (index < 0 || index >= q_items.size())
q_items.append(item);
else
q_items.insert(index, item);
@@ -1336,7 +1336,7 @@ void QGridLayoutEngine::fillRowData(QGridLayoutRowData *rowData,
if (rowIsIdenticalToPrevious && item != itemAt(row - 1, column, orientation))
rowIsIdenticalToPrevious = false;
- if (item && !item->isIgnored())
+ if (item && !item->isEmpty())
rowIsEmpty = false;
}
diff --git a/src/gui/util/qgridlayoutengine_p.h b/src/gui/util/qgridlayoutengine_p.h
index 181326103b..908aeda0c3 100644
--- a/src/gui/util/qgridlayoutengine_p.h
+++ b/src/gui/util/qgridlayoutengine_p.h
@@ -303,7 +303,7 @@ public:
virtual QLayoutPolicy::Policy sizePolicy(Qt::Orientation orientation) const = 0;
virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const = 0;
- virtual bool isIgnored() const { return false; }
+ virtual bool isEmpty() const { return false; }
virtual void setGeometry(const QRectF &rect) = 0;
/*
diff --git a/src/gui/util/qtexturefiledata.cpp b/src/gui/util/qtexturefiledata.cpp
index 41cbd1b15a..3c8130c229 100644
--- a/src/gui/util/qtexturefiledata.cpp
+++ b/src/gui/util/qtexturefiledata.cpp
@@ -38,11 +38,7 @@
****************************************************************************/
#include "qtexturefiledata_p.h"
-#include <QMetaEnum>
#include <QSize>
-#if QT_CONFIG(opengl)
-#include <QOpenGLTexture>
-#endif
QT_BEGIN_NAMESPACE
@@ -247,13 +243,7 @@ void QTextureFileData::setLogName(const QByteArray &name)
static QByteArray glFormatName(quint32 fmt)
{
- const char *id = nullptr;
-#if QT_CONFIG(opengl)
- id = QMetaEnum::fromType<QOpenGLTexture::TextureFormat>().valueToKey(fmt);
-#endif
- QByteArray res(id ? id : "(?)");
- res += " [0x" + QByteArray::number(fmt, 16).rightJustified(4, '0') + ']';
- return res;
+ return QByteArray("0x" + QByteArray::number(fmt, 16).rightJustified(4, '0'));
}
QDebug operator<<(QDebug dbg, const QTextureFileData &d)
diff --git a/src/gui/util/qundogroup.cpp b/src/gui/util/qundogroup.cpp
new file mode 100644
index 0000000000..2f4c81b046
--- /dev/null
+++ b/src/gui/util/qundogroup.cpp
@@ -0,0 +1,515 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qundogroup.h"
+#include "qundostack.h"
+#include "qundostack_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QUndoGroupPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QUndoGroup)
+public:
+ QUndoGroupPrivate() : active(nullptr) {}
+
+ QUndoStack *active;
+ QList<QUndoStack*> stack_list;
+};
+
+/*!
+ \class QUndoGroup
+ \brief The QUndoGroup class is a group of QUndoStack objects.
+ \since 4.2
+ \inmodule QtWidgets
+
+ For an overview of the Qt's undo framework, see the
+ \l{qundo.html}{overview}.
+
+ An application often has multiple undo stacks, one for each opened document. At the
+ same time, an application usually has one undo action and one redo action, which
+ triggers undo or redo in the active document.
+
+ QUndoGroup is a group of QUndoStack objects, one of which may be active. It has
+ an undo() and redo() slot, which calls QUndoStack::undo() and QUndoStack::redo()
+ for the active stack. It also has the functions createUndoAction() and createRedoAction().
+ The actions returned by these functions behave in the same way as those returned by
+ QUndoStack::createUndoAction() and QUndoStack::createRedoAction() of the active
+ stack.
+
+ Stacks are added to a group with addStack() and removed with removeStack(). A stack
+ is implicitly added to a group when it is created with the group as its parent
+ QObject.
+
+ It is the programmer's responsibility to specify which stack is active by
+ calling QUndoStack::setActive(), usually when the associated document window receives focus.
+ The active stack may also be set with setActiveStack(), and is returned by activeStack().
+
+ When a stack is added to a group using addStack(), the group does not take ownership
+ of the stack. This means the stack has to be deleted separately from the group. When
+ a stack is deleted, it is automatically removed from a group. A stack may belong to
+ only one group. Adding it to another group will cause it to be removed from the previous
+ group.
+
+ A QUndoGroup is also useful in conjunction with QUndoView. If a QUndoView is
+ set to watch a group using QUndoView::setGroup(), it will update itself to display
+ the active stack.
+*/
+
+/*!
+ Creates an empty QUndoGroup object with parent \a parent.
+
+ \sa addStack()
+*/
+
+QUndoGroup::QUndoGroup(QObject *parent)
+ : QObject(*new QUndoGroupPrivate(), parent)
+{
+}
+
+/*!
+ Destroys the QUndoGroup.
+*/
+QUndoGroup::~QUndoGroup()
+{
+ // Ensure all QUndoStacks no longer refer to this group.
+ Q_D(QUndoGroup);
+ QList<QUndoStack *>::iterator it = d->stack_list.begin();
+ QList<QUndoStack *>::iterator end = d->stack_list.end();
+ while (it != end) {
+ (*it)->d_func()->group = nullptr;
+ ++it;
+ }
+}
+
+/*!
+ Adds \a stack to this group. The group does not take ownership of the stack. Another
+ way of adding a stack to a group is by specifying the group as the stack's parent
+ QObject in QUndoStack::QUndoStack(). In this case, the stack is deleted when the
+ group is deleted, in the usual manner of QObjects.
+
+ \sa removeStack(), stacks(), QUndoStack::QUndoStack()
+*/
+
+void QUndoGroup::addStack(QUndoStack *stack)
+{
+ Q_D(QUndoGroup);
+
+ if (d->stack_list.contains(stack))
+ return;
+ d->stack_list.append(stack);
+
+ if (QUndoGroup *other = stack->d_func()->group)
+ other->removeStack(stack);
+ stack->d_func()->group = this;
+}
+
+/*!
+ Removes \a stack from this group. If the stack was the active stack in the group,
+ the active stack becomes 0.
+
+ \sa addStack(), stacks(), QUndoStack::~QUndoStack()
+*/
+
+void QUndoGroup::removeStack(QUndoStack *stack)
+{
+ Q_D(QUndoGroup);
+
+ if (d->stack_list.removeAll(stack) == 0)
+ return;
+ if (stack == d->active)
+ setActiveStack(nullptr);
+ stack->d_func()->group = nullptr;
+}
+
+/*!
+ Returns a list of stacks in this group.
+
+ \sa addStack(), removeStack()
+*/
+
+QList<QUndoStack*> QUndoGroup::stacks() const
+{
+ Q_D(const QUndoGroup);
+ return d->stack_list;
+}
+
+/*!
+ Sets the active stack of this group to \a stack.
+
+ If the stack is not a member of this group, this function does nothing.
+
+ Synonymous with calling QUndoStack::setActive() on \a stack.
+
+ The actions returned by createUndoAction() and createRedoAction() will now behave
+ in the same way as those returned by \a stack's QUndoStack::createUndoAction()
+ and QUndoStack::createRedoAction().
+
+ \sa QUndoStack::setActive(), activeStack()
+*/
+
+void QUndoGroup::setActiveStack(QUndoStack *stack)
+{
+ Q_D(QUndoGroup);
+ if (d->active == stack)
+ return;
+
+ if (d->active != nullptr) {
+ disconnect(d->active, SIGNAL(canUndoChanged(bool)),
+ this, SIGNAL(canUndoChanged(bool)));
+ disconnect(d->active, SIGNAL(undoTextChanged(QString)),
+ this, SIGNAL(undoTextChanged(QString)));
+ disconnect(d->active, SIGNAL(canRedoChanged(bool)),
+ this, SIGNAL(canRedoChanged(bool)));
+ disconnect(d->active, SIGNAL(redoTextChanged(QString)),
+ this, SIGNAL(redoTextChanged(QString)));
+ disconnect(d->active, SIGNAL(indexChanged(int)),
+ this, SIGNAL(indexChanged(int)));
+ disconnect(d->active, SIGNAL(cleanChanged(bool)),
+ this, SIGNAL(cleanChanged(bool)));
+ }
+
+ d->active = stack;
+
+ if (d->active == nullptr) {
+ emit canUndoChanged(false);
+ emit undoTextChanged(QString());
+ emit canRedoChanged(false);
+ emit redoTextChanged(QString());
+ emit cleanChanged(true);
+ emit indexChanged(0);
+ } else {
+ connect(d->active, SIGNAL(canUndoChanged(bool)),
+ this, SIGNAL(canUndoChanged(bool)));
+ connect(d->active, SIGNAL(undoTextChanged(QString)),
+ this, SIGNAL(undoTextChanged(QString)));
+ connect(d->active, SIGNAL(canRedoChanged(bool)),
+ this, SIGNAL(canRedoChanged(bool)));
+ connect(d->active, SIGNAL(redoTextChanged(QString)),
+ this, SIGNAL(redoTextChanged(QString)));
+ connect(d->active, SIGNAL(indexChanged(int)),
+ this, SIGNAL(indexChanged(int)));
+ connect(d->active, SIGNAL(cleanChanged(bool)),
+ this, SIGNAL(cleanChanged(bool)));
+ emit canUndoChanged(d->active->canUndo());
+ emit undoTextChanged(d->active->undoText());
+ emit canRedoChanged(d->active->canRedo());
+ emit redoTextChanged(d->active->redoText());
+ emit cleanChanged(d->active->isClean());
+ emit indexChanged(d->active->index());
+ }
+
+ emit activeStackChanged(d->active);
+}
+
+/*!
+ Returns the active stack of this group.
+
+ If none of the stacks are active, or if the group is empty, this function
+ returns \nullptr.
+
+ \sa setActiveStack(), QUndoStack::setActive()
+*/
+
+QUndoStack *QUndoGroup::activeStack() const
+{
+ Q_D(const QUndoGroup);
+ return d->active;
+}
+
+#ifndef QT_NO_ACTION
+
+/*!
+ Creates an undo QAction object with parent \a parent.
+
+ Triggering this action will cause a call to QUndoStack::undo() on the active stack.
+ The text of this action will always be the text of the command which will be undone
+ in the next call to undo(), prefixed by \a prefix. If there is no command available
+ for undo, if the group is empty or if none of the stacks are active, this action will
+ be disabled.
+
+ If \a prefix is empty, the default template "Undo %1" is used instead of prefix.
+ Before Qt 4.8, the prefix "Undo" was used by default.
+
+ \sa createRedoAction(), canUndo(), QUndoCommand::text()
+*/
+
+QAction *QUndoGroup::createUndoAction(QObject *parent, const QString &prefix) const
+{
+ QAction *action = new QAction(parent);
+ action->setEnabled(canUndo());
+
+ QString effectivePrefix = prefix;
+ QString defaultText;
+ if (prefix.isEmpty()) {
+ effectivePrefix = tr("Undo %1");
+ defaultText = tr("Undo", "Default text for undo action");
+ }
+
+ QUndoStackPrivate::setPrefixedText(action, effectivePrefix, defaultText, undoText());
+
+ connect(this, &QUndoGroup::canUndoChanged, action, &QAction::setEnabled);
+ connect(this, &QUndoGroup::undoTextChanged, action, [=](const QString &text) {
+ QUndoStackPrivate::setPrefixedText(action, effectivePrefix, defaultText, text);
+ });
+ connect(action, &QAction::triggered, this, &QUndoGroup::undo);
+
+ return action;
+}
+
+/*!
+ Creates an redo QAction object with parent \a parent.
+
+ Triggering this action will cause a call to QUndoStack::redo() on the active stack.
+ The text of this action will always be the text of the command which will be redone
+ in the next call to redo(), prefixed by \a prefix. If there is no command available
+ for redo, if the group is empty or if none of the stacks are active, this action will
+ be disabled.
+
+ If \a prefix is empty, the default template "Redo %1" is used instead of prefix.
+ Before Qt 4.8, the prefix "Redo" was used by default.
+
+ \sa createUndoAction(), canRedo(), QUndoCommand::text()
+*/
+
+QAction *QUndoGroup::createRedoAction(QObject *parent, const QString &prefix) const
+{
+ QAction *action = new QAction(parent);
+ action->setEnabled(canRedo());
+
+ QString effectivePrefix = prefix;
+ QString defaultText;
+ if (prefix.isEmpty()) {
+ effectivePrefix = tr("Redo %1");
+ defaultText = tr("Redo", "Default text for redo action");
+ }
+
+ QUndoStackPrivate::setPrefixedText(action, effectivePrefix, defaultText, redoText());
+
+ connect(this, &QUndoGroup::canRedoChanged, action, &QAction::setEnabled);
+ connect(this, &QUndoGroup::redoTextChanged, action, [=](const QString &text) {
+ QUndoStackPrivate::setPrefixedText(action, effectivePrefix, defaultText, text);
+ });
+ connect(action, &QAction::triggered, this, &QUndoGroup::redo);
+ return action;
+}
+
+#endif // QT_NO_ACTION
+
+/*!
+ Calls QUndoStack::undo() on the active stack.
+
+ If none of the stacks are active, or if the group is empty, this function
+ does nothing.
+
+ \sa redo(), canUndo(), setActiveStack()
+*/
+
+void QUndoGroup::undo()
+{
+ Q_D(QUndoGroup);
+ if (d->active != nullptr)
+ d->active->undo();
+}
+
+/*!
+ Calls QUndoStack::redo() on the active stack.
+
+ If none of the stacks are active, or if the group is empty, this function
+ does nothing.
+
+ \sa undo(), canRedo(), setActiveStack()
+*/
+
+
+void QUndoGroup::redo()
+{
+ Q_D(QUndoGroup);
+ if (d->active != nullptr)
+ d->active->redo();
+}
+
+/*!
+ Returns the value of the active stack's QUndoStack::canUndo().
+
+ If none of the stacks are active, or if the group is empty, this function
+ returns \c false.
+
+ \sa canRedo(), setActiveStack()
+*/
+
+bool QUndoGroup::canUndo() const
+{
+ Q_D(const QUndoGroup);
+ return d->active != nullptr && d->active->canUndo();
+}
+
+/*!
+ Returns the value of the active stack's QUndoStack::canRedo().
+
+ If none of the stacks are active, or if the group is empty, this function
+ returns \c false.
+
+ \sa canUndo(), setActiveStack()
+*/
+
+bool QUndoGroup::canRedo() const
+{
+ Q_D(const QUndoGroup);
+ return d->active != nullptr && d->active->canRedo();
+}
+
+/*!
+ Returns the value of the active stack's QUndoStack::undoText().
+
+ If none of the stacks are active, or if the group is empty, this function
+ returns an empty string.
+
+ \sa redoText(), setActiveStack()
+*/
+
+QString QUndoGroup::undoText() const
+{
+ Q_D(const QUndoGroup);
+ return d->active == nullptr ? QString() : d->active->undoText();
+}
+
+/*!
+ Returns the value of the active stack's QUndoStack::redoText().
+
+ If none of the stacks are active, or if the group is empty, this function
+ returns an empty string.
+
+ \sa undoText(), setActiveStack()
+*/
+
+QString QUndoGroup::redoText() const
+{
+ Q_D(const QUndoGroup);
+ return d->active == nullptr ? QString() : d->active->redoText();
+}
+
+/*!
+ Returns the value of the active stack's QUndoStack::isClean().
+
+ If none of the stacks are active, or if the group is empty, this function
+ returns \c true.
+
+ \sa setActiveStack()
+*/
+
+bool QUndoGroup::isClean() const
+{
+ Q_D(const QUndoGroup);
+ return d->active == nullptr || d->active->isClean();
+}
+
+/*! \fn void QUndoGroup::activeStackChanged(QUndoStack *stack)
+
+ This signal is emitted whenever the active stack of the group changes. This can happen
+ when setActiveStack() or QUndoStack::setActive() is called, or when the active stack
+ is removed form the group. \a stack is the new active stack. If no stack is active,
+ \a stack is 0.
+
+ \sa setActiveStack(), QUndoStack::setActive()
+*/
+
+/*! \fn void QUndoGroup::indexChanged(int idx)
+
+ This signal is emitted whenever the active stack emits QUndoStack::indexChanged()
+ or the active stack changes.
+
+ \a idx is the new current index, or 0 if the active stack is 0.
+
+ \sa QUndoStack::indexChanged(), setActiveStack()
+*/
+
+/*! \fn void QUndoGroup::cleanChanged(bool clean)
+
+ This signal is emitted whenever the active stack emits QUndoStack::cleanChanged()
+ or the active stack changes.
+
+ \a clean is the new state, or true if the active stack is 0.
+
+ \sa QUndoStack::cleanChanged(), setActiveStack()
+*/
+
+/*! \fn void QUndoGroup::canUndoChanged(bool canUndo)
+
+ This signal is emitted whenever the active stack emits QUndoStack::canUndoChanged()
+ or the active stack changes.
+
+ \a canUndo is the new state, or false if the active stack is 0.
+
+ \sa QUndoStack::canUndoChanged(), setActiveStack()
+*/
+
+/*! \fn void QUndoGroup::canRedoChanged(bool canRedo)
+
+ This signal is emitted whenever the active stack emits QUndoStack::canRedoChanged()
+ or the active stack changes.
+
+ \a canRedo is the new state, or false if the active stack is 0.
+
+ \sa QUndoStack::canRedoChanged(), setActiveStack()
+*/
+
+/*! \fn void QUndoGroup::undoTextChanged(const QString &undoText)
+
+ This signal is emitted whenever the active stack emits QUndoStack::undoTextChanged()
+ or the active stack changes.
+
+ \a undoText is the new state, or an empty string if the active stack is 0.
+
+ \sa QUndoStack::undoTextChanged(), setActiveStack()
+*/
+
+/*! \fn void QUndoGroup::redoTextChanged(const QString &redoText)
+
+ This signal is emitted whenever the active stack emits QUndoStack::redoTextChanged()
+ or the active stack changes.
+
+ \a redoText is the new state, or an empty string if the active stack is 0.
+
+ \sa QUndoStack::redoTextChanged(), setActiveStack()
+*/
+
+QT_END_NAMESPACE
+
+#include "moc_qundogroup.cpp"
diff --git a/src/gui/util/qundogroup.h b/src/gui/util/qundogroup.h
new file mode 100644
index 0000000000..ef5b053610
--- /dev/null
+++ b/src/gui/util/qundogroup.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QUNDOGROUP_H
+#define QUNDOGROUP_H
+
+#include <QtGui/qtguiglobal.h>
+#include <QtCore/qobject.h>
+#include <QtCore/qstring.h>
+
+QT_REQUIRE_CONFIG(undogroup);
+
+QT_BEGIN_NAMESPACE
+
+class QUndoGroupPrivate;
+class QUndoStack;
+class QAction;
+
+class Q_GUI_EXPORT QUndoGroup : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QUndoGroup)
+
+public:
+ explicit QUndoGroup(QObject *parent = nullptr);
+ ~QUndoGroup();
+
+ void addStack(QUndoStack *stack);
+ void removeStack(QUndoStack *stack);
+ QList<QUndoStack*> stacks() const;
+ QUndoStack *activeStack() const;
+
+#ifndef QT_NO_ACTION
+ QAction *createUndoAction(QObject *parent, const QString &prefix = QString()) const;
+ QAction *createRedoAction(QObject *parent, const QString &prefix = QString()) const;
+#endif // QT_NO_ACTION
+
+ bool canUndo() const;
+ bool canRedo() const;
+ QString undoText() const;
+ QString redoText() const;
+ bool isClean() const;
+
+public Q_SLOTS:
+ void undo();
+ void redo();
+ void setActiveStack(QUndoStack *stack);
+
+Q_SIGNALS:
+ void activeStackChanged(QUndoStack *stack);
+ void indexChanged(int idx);
+ void cleanChanged(bool clean);
+ void canUndoChanged(bool canUndo);
+ void canRedoChanged(bool canRedo);
+ void undoTextChanged(const QString &undoText);
+ void redoTextChanged(const QString &redoText);
+
+private:
+ Q_DISABLE_COPY(QUndoGroup)
+};
+
+QT_END_NAMESPACE
+
+#endif // QUNDOGROUP_H
diff --git a/src/gui/util/qundostack.cpp b/src/gui/util/qundostack.cpp
new file mode 100644
index 0000000000..f7b5024389
--- /dev/null
+++ b/src/gui/util/qundostack.cpp
@@ -0,0 +1,1390 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/qdebug.h>
+#include "qundostack.h"
+#if QT_CONFIG(undogroup)
+#include "qundogroup.h"
+#endif
+#include "qundostack_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QUndoCommand
+ \brief The QUndoCommand class is the base class of all commands stored on a QUndoStack.
+ \since 4.2
+
+ \inmodule QtWidgets
+
+ For an overview of Qt's Undo Framework, see the
+ \l{Overview of Qt's Undo Framework}{overview document}.
+
+ A QUndoCommand represents a single editing action on a document; for example,
+ inserting or deleting a block of text in a text editor. QUndoCommand can apply
+ a change to the document with redo() and undo the change with undo(). The
+ implementations for these functions must be provided in a derived class.
+
+ \snippet code/src_gui_util_qundostack.cpp 0
+
+ A QUndoCommand has an associated text(). This is a short string
+ describing what the command does. It is used to update the text
+ properties of the stack's undo and redo actions; see
+ QUndoStack::createUndoAction() and QUndoStack::createRedoAction().
+
+ QUndoCommand objects are owned by the stack they were pushed on.
+ QUndoStack deletes a command if it has been undone and a new command is pushed. For example:
+
+\snippet code/src_gui_util_qundostack.cpp 1
+
+ In effect, when a command is pushed, it becomes the top-most command
+ on the stack.
+
+ To support command compression, QUndoCommand has an id() and the virtual function
+ mergeWith(). These functions are used by QUndoStack::push().
+
+ To support command macros, a QUndoCommand object can have any number of child
+ commands. Undoing or redoing the parent command will cause the child
+ commands to be undone or redone. A command can be assigned
+ to a parent explicitly in the constructor. In this case, the command
+ will be owned by the parent.
+
+ The parent in this case is usually an empty command, in that it doesn't
+ provide its own implementation of undo() and redo(). Instead, it uses
+ the base implementations of these functions, which simply call undo() or
+ redo() on all its children. The parent should, however, have a meaningful
+ text().
+
+ \snippet code/src_gui_util_qundostack.cpp 2
+
+ Another way to create macros is to use the convenience functions
+ QUndoStack::beginMacro() and QUndoStack::endMacro().
+
+ \sa QUndoStack
+*/
+
+/*!
+ Constructs a QUndoCommand object with the given \a parent and \a text.
+
+ If \a parent is not \nullptr, this command is appended to parent's
+ child list. The parent command then owns this command and will delete
+ it in its destructor.
+
+ \sa ~QUndoCommand()
+*/
+
+QUndoCommand::QUndoCommand(const QString &text, QUndoCommand *parent)
+ : QUndoCommand(parent)
+{
+ setText(text);
+}
+
+/*!
+ Constructs a QUndoCommand object with parent \a parent.
+
+ If \a parent is not \nullptr, this command is appended to parent's
+ child list. The parent command then owns this command and will delete
+ it in its destructor.
+
+ \sa ~QUndoCommand()
+*/
+
+QUndoCommand::QUndoCommand(QUndoCommand *parent)
+{
+ d = new QUndoCommandPrivate;
+ if (parent != nullptr)
+ parent->d->child_list.append(this);
+}
+
+/*!
+ Destroys the QUndoCommand object and all child commands.
+
+ \sa QUndoCommand()
+*/
+
+QUndoCommand::~QUndoCommand()
+{
+ qDeleteAll(d->child_list);
+ delete d;
+}
+
+/*!
+ \since 5.9
+
+ Returns whether the command is obsolete.
+
+ The boolean is used for the automatic removal of commands that are not necessary in the
+ stack anymore. The isObsolete function is checked in the functions QUndoStack::push(),
+ QUndoStack::undo(), QUndoStack::redo(), and QUndoStack::setIndex().
+
+ \sa setObsolete(), mergeWith(), QUndoStack::push(), QUndoStack::undo(), QUndoStack::redo()
+*/
+
+bool QUndoCommand::isObsolete() const
+{
+ return d->obsolete;
+}
+
+/*!
+ \since 5.9
+
+ Sets whether the command is obsolete to \a obsolete.
+
+ \sa isObsolete(), mergeWith(), QUndoStack::push(), QUndoStack::undo(), QUndoStack::redo()
+*/
+
+void QUndoCommand::setObsolete(bool obsolete)
+{
+ d->obsolete = obsolete;
+}
+
+/*!
+ Returns the ID of this command.
+
+ A command ID is used in command compression. It must be an integer unique to
+ this command's class, or -1 if the command doesn't support compression.
+
+ If the command supports compression this function must be overridden in the
+ derived class to return the correct ID. The base implementation returns -1.
+
+ QUndoStack::push() will only try to merge two commands if they have the
+ same ID, and the ID is not -1.
+
+ \sa mergeWith(), QUndoStack::push()
+*/
+
+int QUndoCommand::id() const
+{
+ return -1;
+}
+
+/*!
+ Attempts to merge this command with \a command. Returns \c true on
+ success; otherwise returns \c false.
+
+ If this function returns \c true, calling this command's redo() must have the same
+ effect as redoing both this command and \a command.
+ Similarly, calling this command's undo() must have the same effect as undoing
+ \a command and this command.
+
+ QUndoStack will only try to merge two commands if they have the same id, and
+ the id is not -1.
+
+ The default implementation returns \c false.
+
+ \snippet code/src_gui_util_qundostack.cpp 3
+
+ \sa id(), QUndoStack::push()
+*/
+
+bool QUndoCommand::mergeWith(const QUndoCommand *command)
+{
+ Q_UNUSED(command)
+ return false;
+}
+
+/*!
+ Applies a change to the document. This function must be implemented in
+ the derived class. Calling QUndoStack::push(),
+ QUndoStack::undo() or QUndoStack::redo() from this function leads to
+ undefined beahavior.
+
+ The default implementation calls redo() on all child commands.
+
+ \sa undo()
+*/
+
+void QUndoCommand::redo()
+{
+ for (int i = 0; i < d->child_list.size(); ++i)
+ d->child_list.at(i)->redo();
+}
+
+/*!
+ Reverts a change to the document. After undo() is called, the state of
+ the document should be the same as before redo() was called. This function must
+ be implemented in the derived class. Calling QUndoStack::push(),
+ QUndoStack::undo() or QUndoStack::redo() from this function leads to
+ undefined beahavior.
+
+ The default implementation calls undo() on all child commands in reverse order.
+
+ \sa redo()
+*/
+
+void QUndoCommand::undo()
+{
+ for (int i = d->child_list.size() - 1; i >= 0; --i)
+ d->child_list.at(i)->undo();
+}
+
+/*!
+ Returns a short text string describing what this command does; for example,
+ "insert text".
+
+ The text is used for names of items in QUndoView.
+
+ \sa actionText(), setText(), QUndoStack::createUndoAction(), QUndoStack::createRedoAction()
+*/
+
+QString QUndoCommand::text() const
+{
+ return d->text;
+}
+
+/*!
+ \since 4.8
+
+ Returns a short text string describing what this command does; for example,
+ "insert text".
+
+ The text is used when the text properties of the stack's undo and redo
+ actions are updated.
+
+ \sa text(), setText(), QUndoStack::createUndoAction(), QUndoStack::createRedoAction()
+*/
+
+QString QUndoCommand::actionText() const
+{
+ return d->actionText;
+}
+
+/*!
+ Sets the command's text to be the \a text specified.
+
+ The specified text should be a short user-readable string describing what this
+ command does.
+
+ If you need to have two different strings for text() and actionText(), separate
+ them with "\\n" and pass into this function. Even if you do not use this feature
+ for English strings during development, you can still let translators use two
+ different strings in order to match specific languages' needs.
+ The described feature and the function actionText() are available since Qt 4.8.
+
+ \sa text(), actionText(), QUndoStack::createUndoAction(), QUndoStack::createRedoAction()
+*/
+
+void QUndoCommand::setText(const QString &text)
+{
+ int cdpos = text.indexOf(QLatin1Char('\n'));
+ if (cdpos > 0) {
+ d->text = text.left(cdpos);
+ d->actionText = text.mid(cdpos + 1);
+ } else {
+ d->text = text;
+ d->actionText = text;
+ }
+}
+
+/*!
+ \since 4.4
+
+ Returns the number of child commands in this command.
+
+ \sa child()
+*/
+
+int QUndoCommand::childCount() const
+{
+ return d->child_list.count();
+}
+
+/*!
+ \since 4.4
+
+ Returns the child command at \a index.
+
+ \sa childCount(), QUndoStack::command()
+*/
+
+const QUndoCommand *QUndoCommand::child(int index) const
+{
+ if (index < 0 || index >= d->child_list.count())
+ return nullptr;
+ return d->child_list.at(index);
+}
+
+#if QT_CONFIG(undostack)
+
+/*!
+ \class QUndoStack
+ \brief The QUndoStack class is a stack of QUndoCommand objects.
+ \since 4.2
+
+ \inmodule QtWidgets
+
+ For an overview of Qt's Undo Framework, see the
+ \l{Overview of Qt's Undo Framework}{overview document}.
+
+ An undo stack maintains a stack of commands that have been applied to a
+ document.
+
+ New commands are pushed on the stack using push(). Commands can be
+ undone and redone using undo() and redo(), or by triggering the
+ actions returned by createUndoAction() and createRedoAction().
+
+ QUndoStack keeps track of the \a current command. This is the command
+ which will be executed by the next call to redo(). The index of this
+ command is returned by index(). The state of the edited object can be
+ rolled forward or back using setIndex(). If the top-most command on the
+ stack has already been redone, index() is equal to count().
+
+ QUndoStack provides support for undo and redo actions, command
+ compression, command macros, and supports the concept of a
+ \e{clean state}.
+
+ \section1 Undo and Redo Actions
+
+ QUndoStack provides convenient undo and redo QAction objects, which
+ can be inserted into a menu or a toolbar. When commands are undone or
+ redone, QUndoStack updates the text properties of these actions
+ to reflect what change they will trigger. The actions are also disabled
+ when no command is available for undo or redo. These actions
+ are returned by QUndoStack::createUndoAction() and QUndoStack::createRedoAction().
+
+ \section1 Command Compression and Macros
+
+ Command compression is useful when several commands can be compressed
+ into a single command that can be undone and redone in a single operation.
+ For example, when a user types a character in a text editor, a new command
+ is created. This command inserts the character into the document at the
+ cursor position. However, it is more convenient for the user to be able
+ to undo or redo typing of whole words, sentences, or paragraphs.
+ Command compression allows these single-character commands to be merged
+ into a single command which inserts or deletes sections of text.
+ For more information, see QUndoCommand::mergeWith() and push().
+
+ A command macro is a sequence of commands, all of which are undone and
+ redone in one go. Command macros are created by giving a command a list
+ of child commands.
+ Undoing or redoing the parent command will cause the child commands to
+ be undone or redone. Command macros may be created explicitly
+ by specifying a parent in the QUndoCommand constructor, or by using the
+ convenience functions beginMacro() and endMacro().
+
+ Although command compression and macros appear to have the same effect to the
+ user, they often have different uses in an application. Commands that
+ perform small changes to a document may be usefully compressed if there is
+ no need to individually record them, and if only larger changes are relevant
+ to the user.
+ However, for commands that need to be recorded individually, or those that
+ cannot be compressed, it is useful to use macros to provide a more convenient
+ user experience while maintaining a record of each command.
+
+ \section1 Clean State
+
+ QUndoStack supports the concept of a clean state. When the
+ document is saved to disk, the stack can be marked as clean using
+ setClean(). Whenever the stack returns to this state through undoing and
+ redoing commands, it emits the signal cleanChanged(). This signal
+ is also emitted when the stack leaves the clean state. This signal is
+ usually used to enable and disable the save actions in the application,
+ and to update the document's title to reflect that it contains unsaved
+ changes.
+
+ \section1 Obsolete Commands
+
+ QUndoStack is able to delete commands from the stack if the command is no
+ longer needed. One example may be to delete a command when two commands are
+ merged together in such a way that the merged command has no function. This
+ can be seen with move commands where the user moves their mouse to one part
+ of the screen and then moves it to the original position. The merged command
+ results in a mouse movement of 0. This command can be deleted since it serves
+ no purpose. Another example is with networking commands that fail due to connection
+ issues. In this case, the command is to be removed from the stack because the redo()
+ and undo() functions have no function since there was connection issues.
+
+ A command can be marked obsolete with the QUndoCommand::setObsolete() function.
+ The QUndoCommand::isObsolete() flag is checked in QUndoStack::push(),
+ QUndoStack::undo(), QUndoStack::redo(), and QUndoStack::setIndex() after calling
+ QUndoCommand::undo(), QUndoCommand::redo() and QUndoCommand:mergeWith() where
+ applicable.
+
+ If a command is set obsolete and the clean index is greater than or equal to the
+ current command index, then the clean index will be reset when the command is
+ deleted from the stack.
+
+ \sa QUndoCommand, QUndoView
+*/
+
+/*! \internal
+ Sets the current index to \a idx, emitting appropriate signals. If \a clean is true,
+ makes \a idx the clean index as well.
+*/
+
+void QUndoStackPrivate::setIndex(int idx, bool clean)
+{
+ Q_Q(QUndoStack);
+
+ bool was_clean = index == clean_index;
+
+ if (idx != index) {
+ index = idx;
+ emit q->indexChanged(index);
+ emit q->canUndoChanged(q->canUndo());
+ emit q->undoTextChanged(q->undoText());
+ emit q->canRedoChanged(q->canRedo());
+ emit q->redoTextChanged(q->redoText());
+ }
+
+ if (clean)
+ clean_index = index;
+
+ bool is_clean = index == clean_index;
+ if (is_clean != was_clean)
+ emit q->cleanChanged(is_clean);
+}
+
+/*! \internal
+ If the number of commands on the stack exceedes the undo limit, deletes commands from
+ the bottom of the stack.
+
+ Returns \c true if commands were deleted.
+*/
+
+bool QUndoStackPrivate::checkUndoLimit()
+{
+ if (undo_limit <= 0 || !macro_stack.isEmpty() || undo_limit >= command_list.count())
+ return false;
+
+ int del_count = command_list.count() - undo_limit;
+
+ for (int i = 0; i < del_count; ++i)
+ delete command_list.takeFirst();
+
+ index -= del_count;
+ if (clean_index != -1) {
+ if (clean_index < del_count)
+ clean_index = -1; // we've deleted the clean command
+ else
+ clean_index -= del_count;
+ }
+
+ return true;
+}
+
+/*!
+ Constructs an empty undo stack with the parent \a parent. The
+ stack will initially be in the clean state. If \a parent is a
+ QUndoGroup object, the stack is automatically added to the group.
+
+ \sa push()
+*/
+
+QUndoStack::QUndoStack(QObject *parent)
+ : QObject(*(new QUndoStackPrivate), parent)
+{
+#if QT_CONFIG(undogroup)
+ if (QUndoGroup *group = qobject_cast<QUndoGroup*>(parent))
+ group->addStack(this);
+#endif
+}
+
+/*!
+ Destroys the undo stack, deleting any commands that are on it. If the
+ stack is in a QUndoGroup, the stack is automatically removed from the group.
+
+ \sa QUndoStack()
+*/
+
+QUndoStack::~QUndoStack()
+{
+#if QT_CONFIG(undogroup)
+ Q_D(QUndoStack);
+ if (d->group != nullptr)
+ d->group->removeStack(this);
+#endif
+ clear();
+}
+
+/*!
+ Clears the command stack by deleting all commands on it, and returns the stack
+ to the clean state.
+
+ Commands are not undone or redone; the state of the edited object remains
+ unchanged.
+
+ This function is usually used when the contents of the document are
+ abandoned.
+
+ \sa QUndoStack()
+*/
+
+void QUndoStack::clear()
+{
+ Q_D(QUndoStack);
+
+ if (d->command_list.isEmpty())
+ return;
+
+ bool was_clean = isClean();
+
+ d->macro_stack.clear();
+ qDeleteAll(d->command_list);
+ d->command_list.clear();
+
+ d->index = 0;
+ d->clean_index = 0;
+
+ emit indexChanged(0);
+ emit canUndoChanged(false);
+ emit undoTextChanged(QString());
+ emit canRedoChanged(false);
+ emit redoTextChanged(QString());
+
+ if (!was_clean)
+ emit cleanChanged(true);
+}
+
+/*!
+ Pushes \a cmd on the stack or merges it with the most recently executed command.
+ In either case, executes \a cmd by calling its redo() function.
+
+ If \a cmd's id is not -1, and if the id is the same as that of the
+ most recently executed command, QUndoStack will attempt to merge the two
+ commands by calling QUndoCommand::mergeWith() on the most recently executed
+ command. If QUndoCommand::mergeWith() returns \c true, \a cmd is deleted.
+
+ After calling QUndoCommand::redo() and, if applicable, QUndoCommand::mergeWith(),
+ QUndoCommand::isObsolete() will be called for \a cmd or the merged command.
+ If QUndoCommand::isObsolete() returns \c true, then \a cmd or the merged command
+ will be deleted from the stack.
+
+ In all other cases \a cmd is simply pushed on the stack.
+
+ If commands were undone before \a cmd was pushed, the current command and
+ all commands above it are deleted. Hence \a cmd always ends up being the
+ top-most on the stack.
+
+ Once a command is pushed, the stack takes ownership of it. There
+ are no getters to return the command, since modifying it after it has
+ been executed will almost always lead to corruption of the document's
+ state.
+
+ \sa QUndoCommand::id(), QUndoCommand::mergeWith()
+*/
+
+void QUndoStack::push(QUndoCommand *cmd)
+{
+ Q_D(QUndoStack);
+ if (!cmd->isObsolete())
+ cmd->redo();
+
+ bool macro = !d->macro_stack.isEmpty();
+
+ QUndoCommand *cur = nullptr;
+ if (macro) {
+ QUndoCommand *macro_cmd = d->macro_stack.constLast();
+ if (!macro_cmd->d->child_list.isEmpty())
+ cur = macro_cmd->d->child_list.constLast();
+ } else {
+ if (d->index > 0)
+ cur = d->command_list.at(d->index - 1);
+ while (d->index < d->command_list.size())
+ delete d->command_list.takeLast();
+ if (d->clean_index > d->index)
+ d->clean_index = -1; // we've deleted the clean state
+ }
+
+ bool try_merge = cur != nullptr
+ && cur->id() != -1
+ && cur->id() == cmd->id()
+ && (macro || d->index != d->clean_index);
+
+ if (try_merge && cur->mergeWith(cmd)) {
+ delete cmd;
+
+ if (macro) {
+ if (cur->isObsolete())
+ delete d->macro_stack.constLast()->d->child_list.takeLast();
+ } else {
+ if (cur->isObsolete()) {
+ delete d->command_list.takeLast();
+
+ d->setIndex(d->index - 1, false);
+ } else {
+ emit indexChanged(d->index);
+ emit canUndoChanged(canUndo());
+ emit undoTextChanged(undoText());
+ emit canRedoChanged(canRedo());
+ emit redoTextChanged(redoText());
+ }
+ }
+ } else if (cmd->isObsolete()) {
+ delete cmd; // command should be deleted and NOT added to the stack
+ } else {
+ if (macro) {
+ d->macro_stack.constLast()->d->child_list.append(cmd);
+ } else {
+ d->command_list.append(cmd);
+ d->checkUndoLimit();
+ d->setIndex(d->index + 1, false);
+ }
+ }
+}
+
+/*!
+ Marks the stack as clean and emits cleanChanged() if the stack was
+ not already clean.
+
+ This is typically called when a document is saved, for example.
+
+ Whenever the stack returns to this state through the use of undo/redo
+ commands, it emits the signal cleanChanged(). This signal is also
+ emitted when the stack leaves the clean state.
+
+ \sa isClean(), resetClean(), cleanIndex()
+*/
+
+void QUndoStack::setClean()
+{
+ Q_D(QUndoStack);
+ if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
+ qWarning("QUndoStack::setClean(): cannot set clean in the middle of a macro");
+ return;
+ }
+
+ d->setIndex(d->index, true);
+}
+
+/*!
+ \since 5.8
+
+ Leaves the clean state and emits cleanChanged() if the stack was clean.
+ This method resets the clean index to -1.
+
+ This is typically called in the following cases, when a document has been:
+ \list
+ \li created basing on some template and has not been saved,
+ so no filename has been associated with the document yet.
+ \li restored from a backup file.
+ \li changed outside of the editor and the user did not reload it.
+ \endlist
+
+ \sa isClean(), setClean(), cleanIndex()
+*/
+
+void QUndoStack::resetClean()
+{
+ Q_D(QUndoStack);
+ const bool was_clean = isClean();
+ d->clean_index = -1;
+ if (was_clean)
+ emit cleanChanged(false);
+}
+
+/*!
+ \since 5.12
+ \property QUndoStack::clean
+ \brief the clean status of this stack.
+
+ This property indicates whether or not the stack is clean. For example, a
+ stack is clean when a document has been saved.
+
+ \sa isClean(), setClean(), resetClean(), cleanIndex()
+*/
+
+/*!
+ If the stack is in the clean state, returns \c true; otherwise returns \c false.
+
+ \sa setClean(), cleanIndex()
+*/
+
+bool QUndoStack::isClean() const
+{
+ Q_D(const QUndoStack);
+ if (!d->macro_stack.isEmpty())
+ return false;
+ return d->clean_index == d->index;
+}
+
+/*!
+ Returns the clean index. This is the index at which setClean() was called.
+
+ A stack may not have a clean index. This happens if a document is saved,
+ some commands are undone, then a new command is pushed. Since
+ push() deletes all the undone commands before pushing the new command, the stack
+ can't return to the clean state again. In this case, this function returns -1.
+ The -1 may also be returned after an explicit call to resetClean().
+
+ \sa isClean(), setClean()
+*/
+
+int QUndoStack::cleanIndex() const
+{
+ Q_D(const QUndoStack);
+ return d->clean_index;
+}
+
+/*!
+ Undoes the command below the current command by calling QUndoCommand::undo().
+ Decrements the current command index.
+
+ If the stack is empty, or if the bottom command on the stack has already been
+ undone, this function does nothing.
+
+ After the command is undone, if QUndoCommand::isObsolete() returns \c true,
+ then the command will be deleted from the stack. Additionally, if the clean
+ index is greater than or equal to the current command index, then the clean
+ index is reset.
+
+ \sa redo(), index()
+*/
+
+void QUndoStack::undo()
+{
+ Q_D(QUndoStack);
+ if (d->index == 0)
+ return;
+
+ if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
+ qWarning("QUndoStack::undo(): cannot undo in the middle of a macro");
+ return;
+ }
+
+ int idx = d->index - 1;
+ QUndoCommand *cmd = d->command_list.at(idx);
+
+ if (!cmd->isObsolete())
+ cmd->undo();
+
+ if (cmd->isObsolete()) { // A separate check is done b/c the undo command may set obsolete flag
+ delete d->command_list.takeAt(idx);
+
+ if (d->clean_index > idx)
+ resetClean();
+ }
+
+ d->setIndex(idx, false);
+}
+
+/*!
+ Redoes the current command by calling QUndoCommand::redo(). Increments the current
+ command index.
+
+ If the stack is empty, or if the top command on the stack has already been
+ redone, this function does nothing.
+
+ If QUndoCommand::isObsolete() returns true for the current command, then
+ the command will be deleted from the stack. Additionally, if the clean
+ index is greater than or equal to the current command index, then the clean
+ index is reset.
+
+ \sa undo(), index()
+*/
+
+void QUndoStack::redo()
+{
+ Q_D(QUndoStack);
+ if (d->index == d->command_list.size())
+ return;
+
+ if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
+ qWarning("QUndoStack::redo(): cannot redo in the middle of a macro");
+ return;
+ }
+
+ int idx = d->index;
+ QUndoCommand *cmd = d->command_list.at(idx);
+
+ if (!cmd->isObsolete())
+ cmd->redo(); // A separate check is done b/c the undo command may set obsolete flag
+
+ if (cmd->isObsolete()) {
+ delete d->command_list.takeAt(idx);
+
+ if (d->clean_index > idx)
+ resetClean();
+ } else {
+ d->setIndex(d->index + 1, false);
+ }
+}
+
+/*!
+ Returns the number of commands on the stack. Macro commands are counted as
+ one command.
+
+ \sa index(), setIndex(), command()
+*/
+
+int QUndoStack::count() const
+{
+ Q_D(const QUndoStack);
+ return d->command_list.size();
+}
+
+/*!
+ Returns the index of the current command. This is the command that will be
+ executed on the next call to redo(). It is not always the top-most command
+ on the stack, since a number of commands may have been undone.
+
+ \sa undo(), redo(), count()
+*/
+
+int QUndoStack::index() const
+{
+ Q_D(const QUndoStack);
+ return d->index;
+}
+
+/*!
+ Repeatedly calls undo() or redo() until the current command index reaches
+ \a idx. This function can be used to roll the state of the document forwards
+ of backwards. indexChanged() is emitted only once.
+
+ \sa index(), count(), undo(), redo()
+*/
+
+void QUndoStack::setIndex(int idx)
+{
+ Q_D(QUndoStack);
+ if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
+ qWarning("QUndoStack::setIndex(): cannot set index in the middle of a macro");
+ return;
+ }
+
+ if (idx < 0)
+ idx = 0;
+ else if (idx > d->command_list.size())
+ idx = d->command_list.size();
+
+ int i = d->index;
+ while (i < idx) {
+ QUndoCommand *cmd = d->command_list.at(i);
+
+ if (!cmd->isObsolete())
+ cmd->redo(); // A separate check is done b/c the undo command may set obsolete flag
+
+ if (cmd->isObsolete()) {
+ delete d->command_list.takeAt(i);
+
+ if (d->clean_index > i)
+ resetClean();
+
+ idx--; // Subtract from idx because we removed a command
+ } else {
+ i++;
+ }
+ }
+
+ while (i > idx) {
+ QUndoCommand *cmd = d->command_list.at(--i);
+
+ cmd->undo();
+ if (cmd->isObsolete()) {
+ delete d->command_list.takeAt(i);
+
+ if (d->clean_index > i)
+ resetClean();
+ }
+ }
+
+ d->setIndex(idx, false);
+}
+
+/*!
+ \since 5.12
+ \property QUndoStack::canUndo
+ \brief whether this stack can undo.
+
+ This property indicates whether or not there is a command that can be
+ undone.
+
+ \sa canUndo(), index(), canRedo()
+*/
+
+/*!
+ Returns \c true if there is a command available for undo; otherwise returns \c false.
+
+ This function returns \c false if the stack is empty, or if the bottom command
+ on the stack has already been undone.
+
+ Synonymous with index() == 0.
+
+ \sa index(), canRedo()
+*/
+
+bool QUndoStack::canUndo() const
+{
+ Q_D(const QUndoStack);
+ if (!d->macro_stack.isEmpty())
+ return false;
+ return d->index > 0;
+}
+
+/*!
+ \since 5.12
+ \property QUndoStack::canRedo
+ \brief whether this stack can redo.
+
+ This property indicates whether or not there is a command that can be
+ redone.
+
+ \sa canRedo(), index(), canUndo()
+*/
+
+/*!
+ Returns \c true if there is a command available for redo; otherwise returns \c false.
+
+ This function returns \c false if the stack is empty or if the top command
+ on the stack has already been redone.
+
+ Synonymous with index() == count().
+
+ \sa index(), canUndo()
+*/
+
+bool QUndoStack::canRedo() const
+{
+ Q_D(const QUndoStack);
+ if (!d->macro_stack.isEmpty())
+ return false;
+ return d->index < d->command_list.size();
+}
+
+/*!
+ \since 5.12
+ \property QUndoStack::undoText
+ \brief the undo text of the next command that is undone.
+
+ This property holds the text of the command which will be undone in the
+ next call to undo().
+
+ \sa undoText(), QUndoCommand::actionText(), redoText()
+*/
+
+/*!
+ Returns the text of the command which will be undone in the next call to undo().
+
+ \sa QUndoCommand::actionText(), redoText()
+*/
+
+QString QUndoStack::undoText() const
+{
+ Q_D(const QUndoStack);
+ if (!d->macro_stack.isEmpty())
+ return QString();
+ if (d->index > 0)
+ return d->command_list.at(d->index - 1)->actionText();
+ return QString();
+}
+
+/*!
+ \since 5.12
+ \property QUndoStack::redoText
+ \brief the redo text of the next command that is redone.
+
+ This property holds the text of the command which will be redone in the
+ next call to redo().
+
+ \sa redoText(), QUndoCommand::actionText(), undoText()
+*/
+
+/*!
+ Returns the text of the command which will be redone in the next call to redo().
+
+ \sa QUndoCommand::actionText(), undoText()
+*/
+
+QString QUndoStack::redoText() const
+{
+ Q_D(const QUndoStack);
+ if (!d->macro_stack.isEmpty())
+ return QString();
+ if (d->index < d->command_list.size())
+ return d->command_list.at(d->index)->actionText();
+ return QString();
+}
+
+#ifndef QT_NO_ACTION
+
+/*!
+ \internal
+
+ Sets the text property of \a action to \a text, applying \a prefix, and falling back to \a defaultText if \a text is empty.
+*/
+void QUndoStackPrivate::setPrefixedText(QAction *action, const QString &prefix, const QString &defaultText, const QString &text)
+{
+ if (defaultText.isEmpty()) {
+ QString s = prefix;
+ if (!prefix.isEmpty() && !text.isEmpty())
+ s.append(QLatin1Char(' '));
+ s.append(text);
+ action->setText(s);
+ } else {
+ if (text.isEmpty())
+ action->setText(defaultText);
+ else
+ action->setText(prefix.arg(text));
+ }
+};
+
+/*!
+ Creates an undo QAction object with the given \a parent.
+
+ Triggering this action will cause a call to undo(). The text of this action
+ is the text of the command which will be undone in the next call to undo(),
+ prefixed by the specified \a prefix. If there is no command available for undo,
+ this action will be disabled.
+
+ If \a prefix is empty, the default template "Undo %1" is used instead of prefix.
+ Before Qt 4.8, the prefix "Undo" was used by default.
+
+ \sa createRedoAction(), canUndo(), QUndoCommand::text()
+*/
+
+QAction *QUndoStack::createUndoAction(QObject *parent, const QString &prefix) const
+{
+ QAction *action = new QAction(parent);
+ action->setEnabled(canUndo());
+
+ QString effectivePrefix = prefix;
+ QString defaultText;
+ if (prefix.isEmpty()) {
+ effectivePrefix = tr("Undo %1");
+ defaultText = tr("Undo", "Default text for undo action");
+ }
+
+ QUndoStackPrivate::setPrefixedText(action, effectivePrefix, defaultText, undoText());
+
+ connect(this, &QUndoStack::canUndoChanged, action, &QAction::setEnabled);
+ connect(this, &QUndoStack::undoTextChanged, action, [=](const QString &text) {
+ QUndoStackPrivate::setPrefixedText(action, effectivePrefix, defaultText, text);
+ });
+ connect(action, &QAction::triggered, this, &QUndoStack::undo);
+
+ return action;
+}
+
+/*!
+ Creates an redo QAction object with the given \a parent.
+
+ Triggering this action will cause a call to redo(). The text of this action
+ is the text of the command which will be redone in the next call to redo(),
+ prefixed by the specified \a prefix. If there is no command available for redo,
+ this action will be disabled.
+
+ If \a prefix is empty, the default template "Redo %1" is used instead of prefix.
+ Before Qt 4.8, the prefix "Redo" was used by default.
+
+ \sa createUndoAction(), canRedo(), QUndoCommand::text()
+*/
+
+QAction *QUndoStack::createRedoAction(QObject *parent, const QString &prefix) const
+{
+ QAction *action = new QAction(parent);
+ action->setEnabled(canRedo());
+
+ QString effectivePrefix = prefix;
+ QString defaultText;
+ if (prefix.isEmpty()) {
+ effectivePrefix = tr("Redo %1");
+ defaultText = tr("Redo", "Default text for redo action");
+ }
+
+ QUndoStackPrivate::setPrefixedText(action, effectivePrefix, defaultText, redoText());
+
+ connect(this, &QUndoStack::canRedoChanged, action, &QAction::setEnabled);
+ connect(this, &QUndoStack::redoTextChanged, action, [=](const QString &text) {
+ QUndoStackPrivate::setPrefixedText(action, effectivePrefix, defaultText, text);
+ });
+ connect(action, &QAction::triggered, this, &QUndoStack::redo);
+
+ return action;
+}
+
+#endif // QT_NO_ACTION
+
+/*!
+ Begins composition of a macro command with the given \a text description.
+
+ An empty command described by the specified \a text is pushed on the stack.
+ Any subsequent commands pushed on the stack will be appended to the empty
+ command's children until endMacro() is called.
+
+ Calls to beginMacro() and endMacro() may be nested, but every call to
+ beginMacro() must have a matching call to endMacro().
+
+ While a macro is being composed, the stack is disabled. This means that:
+ \list
+ \li indexChanged() and cleanChanged() are not emitted,
+ \li canUndo() and canRedo() return false,
+ \li calling undo() or redo() has no effect,
+ \li the undo/redo actions are disabled.
+ \endlist
+
+ The stack becomes enabled and appropriate signals are emitted when endMacro()
+ is called for the outermost macro.
+
+ \snippet code/src_gui_util_qundostack.cpp 4
+
+ This code is equivalent to:
+
+ \snippet code/src_gui_util_qundostack.cpp 5
+
+ \sa endMacro()
+*/
+
+void QUndoStack::beginMacro(const QString &text)
+{
+ Q_D(QUndoStack);
+ QUndoCommand *cmd = new QUndoCommand();
+ cmd->setText(text);
+
+ if (d->macro_stack.isEmpty()) {
+ while (d->index < d->command_list.size())
+ delete d->command_list.takeLast();
+ if (d->clean_index > d->index)
+ d->clean_index = -1; // we've deleted the clean state
+ d->command_list.append(cmd);
+ } else {
+ d->macro_stack.constLast()->d->child_list.append(cmd);
+ }
+ d->macro_stack.append(cmd);
+
+ if (d->macro_stack.count() == 1) {
+ emit canUndoChanged(false);
+ emit undoTextChanged(QString());
+ emit canRedoChanged(false);
+ emit redoTextChanged(QString());
+ }
+}
+
+/*!
+ Ends composition of a macro command.
+
+ If this is the outermost macro in a set nested macros, this function emits
+ indexChanged() once for the entire macro command.
+
+ \sa beginMacro()
+*/
+
+void QUndoStack::endMacro()
+{
+ Q_D(QUndoStack);
+ if (Q_UNLIKELY(d->macro_stack.isEmpty())) {
+ qWarning("QUndoStack::endMacro(): no matching beginMacro()");
+ return;
+ }
+
+ d->macro_stack.removeLast();
+
+ if (d->macro_stack.isEmpty()) {
+ d->checkUndoLimit();
+ d->setIndex(d->index + 1, false);
+ }
+}
+
+/*!
+ \since 4.4
+
+ Returns a const pointer to the command at \a index.
+
+ This function returns a const pointer, because modifying a command,
+ once it has been pushed onto the stack and executed, almost always
+ causes corruption of the state of the document, if the command is
+ later undone or redone.
+
+ \sa QUndoCommand::child()
+*/
+const QUndoCommand *QUndoStack::command(int index) const
+{
+ Q_D(const QUndoStack);
+
+ if (index < 0 || index >= d->command_list.count())
+ return nullptr;
+ return d->command_list.at(index);
+}
+
+/*!
+ Returns the text of the command at index \a idx.
+
+ \sa beginMacro()
+*/
+
+QString QUndoStack::text(int idx) const
+{
+ Q_D(const QUndoStack);
+
+ if (idx < 0 || idx >= d->command_list.size())
+ return QString();
+ return d->command_list.at(idx)->text();
+}
+
+/*!
+ \property QUndoStack::undoLimit
+ \brief the maximum number of commands on this stack.
+ \since 4.3
+
+ When the number of commands on a stack exceedes the stack's undoLimit, commands are
+ deleted from the bottom of the stack. Macro commands (commands with child commands)
+ are treated as one command. The default value is 0, which means that there is no
+ limit.
+
+ This property may only be set when the undo stack is empty, since setting it on a
+ non-empty stack might delete the command at the current index. Calling setUndoLimit()
+ on a non-empty stack prints a warning and does nothing.
+*/
+
+void QUndoStack::setUndoLimit(int limit)
+{
+ Q_D(QUndoStack);
+
+ if (Q_UNLIKELY(!d->command_list.isEmpty())) {
+ qWarning("QUndoStack::setUndoLimit(): an undo limit can only be set when the stack is empty");
+ return;
+ }
+
+ if (limit == d->undo_limit)
+ return;
+ d->undo_limit = limit;
+ d->checkUndoLimit();
+}
+
+int QUndoStack::undoLimit() const
+{
+ Q_D(const QUndoStack);
+
+ return d->undo_limit;
+}
+
+/*!
+ \property QUndoStack::active
+ \brief the active status of this stack.
+
+ An application often has multiple undo stacks, one for each opened document. The active
+ stack is the one associated with the currently active document. If the stack belongs
+ to a QUndoGroup, calls to QUndoGroup::undo() or QUndoGroup::redo() will be forwarded
+ to this stack when it is active. If the QUndoGroup is watched by a QUndoView, the view
+ will display the contents of this stack when it is active. If the stack does not belong to
+ a QUndoGroup, making it active has no effect.
+
+ It is the programmer's responsibility to specify which stack is active by
+ calling setActive(), usually when the associated document window receives focus.
+
+ \sa QUndoGroup
+*/
+
+void QUndoStack::setActive(bool active)
+{
+#if !QT_CONFIG(undogroup)
+ Q_UNUSED(active);
+#else
+ Q_D(QUndoStack);
+
+ if (d->group != nullptr) {
+ if (active)
+ d->group->setActiveStack(this);
+ else if (d->group->activeStack() == this)
+ d->group->setActiveStack(nullptr);
+ }
+#endif
+}
+
+bool QUndoStack::isActive() const
+{
+#if !QT_CONFIG(undogroup)
+ return true;
+#else
+ Q_D(const QUndoStack);
+ return d->group == nullptr || d->group->activeStack() == this;
+#endif
+}
+
+/*!
+ \fn void QUndoStack::indexChanged(int idx)
+
+ This signal is emitted whenever a command modifies the state of the document.
+ This happens when a command is undone or redone. When a macro
+ command is undone or redone, or setIndex() is called, this signal
+ is emitted only once.
+
+ \a idx specifies the index of the current command, ie. the command which will be
+ executed on the next call to redo().
+
+ \sa index(), setIndex()
+*/
+
+/*!
+ \fn void QUndoStack::cleanChanged(bool clean)
+
+ This signal is emitted whenever the stack enters or leaves the clean state.
+ If \a clean is true, the stack is in a clean state; otherwise this signal
+ indicates that it has left the clean state.
+
+ \sa isClean(), setClean()
+*/
+
+/*!
+ \fn void QUndoStack::undoTextChanged(const QString &undoText)
+
+ This signal is emitted whenever the value of undoText() changes. It is
+ used to update the text property of the undo action returned by createUndoAction().
+ \a undoText specifies the new text.
+*/
+
+/*!
+ \fn void QUndoStack::canUndoChanged(bool canUndo)
+
+ This signal is emitted whenever the value of canUndo() changes. It is
+ used to enable or disable the undo action returned by createUndoAction().
+ \a canUndo specifies the new value.
+*/
+
+/*!
+ \fn void QUndoStack::redoTextChanged(const QString &redoText)
+
+ This signal is emitted whenever the value of redoText() changes. It is
+ used to update the text property of the redo action returned by createRedoAction().
+ \a redoText specifies the new text.
+*/
+
+/*!
+ \fn void QUndoStack::canRedoChanged(bool canRedo)
+
+ This signal is emitted whenever the value of canRedo() changes. It is
+ used to enable or disable the redo action returned by createRedoAction().
+ \a canRedo specifies the new value.
+*/
+
+QT_END_NAMESPACE
+
+#include "moc_qundostack.cpp"
+
+#endif // QT_CONFIG(undostack)
diff --git a/src/gui/util/qundostack.h b/src/gui/util/qundostack.h
new file mode 100644
index 0000000000..c137e7d942
--- /dev/null
+++ b/src/gui/util/qundostack.h
@@ -0,0 +1,157 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QUNDOSTACK_H
+#define QUNDOSTACK_H
+
+#include <QtGui/qtguiglobal.h>
+#include <QtCore/qobject.h>
+#include <QtCore/qstring.h>
+
+QT_REQUIRE_CONFIG(undocommand);
+
+QT_BEGIN_NAMESPACE
+
+class QAction;
+class QUndoCommandPrivate;
+class QUndoStackPrivate;
+
+class Q_GUI_EXPORT QUndoCommand
+{
+ QUndoCommandPrivate *d;
+
+public:
+ explicit QUndoCommand(QUndoCommand *parent = nullptr);
+ explicit QUndoCommand(const QString &text, QUndoCommand *parent = nullptr);
+ virtual ~QUndoCommand();
+
+ virtual void undo();
+ virtual void redo();
+
+ QString text() const;
+ QString actionText() const;
+ void setText(const QString &text);
+
+ bool isObsolete() const;
+ void setObsolete(bool obsolete);
+
+ virtual int id() const;
+ virtual bool mergeWith(const QUndoCommand *other);
+
+ int childCount() const;
+ const QUndoCommand *child(int index) const;
+
+private:
+ Q_DISABLE_COPY(QUndoCommand)
+ friend class QUndoStack;
+};
+
+#if QT_CONFIG(undostack)
+
+class Q_GUI_EXPORT QUndoStack : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QUndoStack)
+ Q_PROPERTY(bool active READ isActive WRITE setActive)
+ Q_PROPERTY(int undoLimit READ undoLimit WRITE setUndoLimit)
+ Q_PROPERTY(bool canUndo READ canUndo NOTIFY canUndoChanged)
+ Q_PROPERTY(bool canRedo READ canRedo NOTIFY canRedoChanged)
+ Q_PROPERTY(QString undoText READ undoText NOTIFY undoTextChanged)
+ Q_PROPERTY(QString redoText READ redoText NOTIFY redoTextChanged)
+ Q_PROPERTY(bool clean READ isClean NOTIFY cleanChanged)
+
+public:
+ explicit QUndoStack(QObject *parent = nullptr);
+ ~QUndoStack();
+ void clear();
+
+ void push(QUndoCommand *cmd);
+
+ bool canUndo() const;
+ bool canRedo() const;
+ QString undoText() const;
+ QString redoText() const;
+
+ int count() const;
+ int index() const;
+ QString text(int idx) const;
+
+#ifndef QT_NO_ACTION
+ QAction *createUndoAction(QObject *parent, const QString &prefix = QString()) const;
+ QAction *createRedoAction(QObject *parent, const QString &prefix = QString()) const;
+#endif // QT_NO_ACTION
+
+ bool isActive() const;
+ bool isClean() const;
+ int cleanIndex() const;
+
+ void beginMacro(const QString &text);
+ void endMacro();
+
+ void setUndoLimit(int limit);
+ int undoLimit() const;
+
+ const QUndoCommand *command(int index) const;
+
+public Q_SLOTS:
+ void setClean();
+ void resetClean();
+ void setIndex(int idx);
+ void undo();
+ void redo();
+ void setActive(bool active = true);
+
+Q_SIGNALS:
+ void indexChanged(int idx);
+ void cleanChanged(bool clean);
+ void canUndoChanged(bool canUndo);
+ void canRedoChanged(bool canRedo);
+ void undoTextChanged(const QString &undoText);
+ void redoTextChanged(const QString &redoText);
+
+private:
+ Q_DISABLE_COPY(QUndoStack)
+ friend class QUndoGroup;
+};
+
+#endif // QT_CONFIG(undostack)
+
+QT_END_NAMESPACE
+
+#endif // QUNDOSTACK_H
diff --git a/src/gui/util/qundostack_p.h b/src/gui/util/qundostack_p.h
new file mode 100644
index 0000000000..5f2c438a83
--- /dev/null
+++ b/src/gui/util/qundostack_p.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QUNDOSTACK_P_H
+#define QUNDOSTACK_P_H
+
+#include <QtGui/private/qtguiglobal_p.h>
+#include <private/qobject_p.h>
+#include <QtCore/qlist.h>
+#include <QtCore/qstring.h>
+#if QT_CONFIG(action)
+# include <QtGui/qaction.h>
+#endif
+
+#include "qundostack.h"
+
+QT_BEGIN_NAMESPACE
+class QUndoCommand;
+class QUndoGroup;
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+class QUndoCommandPrivate
+{
+public:
+ QUndoCommandPrivate() : id(-1), obsolete(false) {}
+ QList<QUndoCommand*> child_list;
+ QString text;
+ QString actionText;
+ int id;
+ bool obsolete;
+};
+
+#if QT_CONFIG(undostack)
+
+class QUndoStackPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QUndoStack)
+public:
+ QUndoStackPrivate() : index(0), clean_index(0), group(nullptr), undo_limit(0) {}
+
+ QList<QUndoCommand*> command_list;
+ QList<QUndoCommand*> macro_stack;
+ int index;
+ int clean_index;
+ QUndoGroup *group;
+ int undo_limit;
+
+ void setIndex(int idx, bool clean);
+ bool checkUndoLimit();
+
+#ifndef QT_NO_ACTION
+ static void setPrefixedText(QAction *action, const QString &prefix, const QString &defaultText, const QString &text);
+#endif
+};
+
+QT_END_NAMESPACE
+#endif // QT_CONFIG(undostack)
+#endif // QUNDOSTACK_P_H
diff --git a/src/gui/util/qvalidator.cpp b/src/gui/util/qvalidator.cpp
index 6e87faf534..b968592c01 100644
--- a/src/gui/util/qvalidator.cpp
+++ b/src/gui/util/qvalidator.cpp
@@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE
The class itself is abstract. Two subclasses, \l QIntValidator and
\l QDoubleValidator, provide basic numeric-range checking, and \l
- QRegExpValidator provides general checking using a custom regular
+ QRegularExpressionValidator provides general checking using a custom regular
expression.
If the built-in validators aren't sufficient, you can subclass
@@ -114,7 +114,7 @@ QT_BEGIN_NAMESPACE
QValidator is typically used with QLineEdit, QSpinBox and
QComboBox.
- \sa QIntValidator, QDoubleValidator, QRegExpValidator, {Line Edits Example}
+ \sa QIntValidator, QDoubleValidator, QRegularExpressionValidator, {Line Edits Example}
*/
@@ -192,13 +192,6 @@ QT_BEGIN_NAMESPACE
\internal
*/
-/*!
- \fn void QRegExpValidator::regExpChanged(const QRegExp &regExp)
-
- This signal is emitted after the regExp property changed.
- \internal
-*/
-
class QValidatorPrivate : public QObjectPrivate{
Q_DECLARE_PUBLIC(QValidator)
public:
@@ -328,7 +321,7 @@ void QValidator::fixup(QString &) const
is not set by default, the validator will accept group separators. It is thus
recommended to use QLocale::toInt() to obtain the numeric value.
- \sa QDoubleValidator, QRegExpValidator, QLocale::toInt(), {Line Edits Example}
+ \sa QDoubleValidator, QRegularExpressionValidator, QLocale::toInt(), {Line Edits Example}
*/
/*!
@@ -468,8 +461,6 @@ void QIntValidator::fixup(QString &input) const
input = locale().toString(entered);
}
-// FIXME: Qt 6: Make QIntValidator::setRange() non-virtual
-
/*!
Sets the range of the validator to only accept integers between \a
bottom and \a top inclusive.
@@ -539,8 +530,6 @@ QValidator::QValidator(QValidatorPrivate &d, QObject *parent)
{
}
-#ifndef QT_NO_REGEXP
-
class QDoubleValidatorPrivate : public QValidatorPrivate
{
Q_DECLARE_PUBLIC(QDoubleValidator)
@@ -582,7 +571,7 @@ public:
is not set by default, the validator will accept group separators. It is thus
recommended to use QLocale::toDouble() to obtain the numeric value.
- \sa QIntValidator, QRegExpValidator, QLocale::toDouble(), {Line Edits Example}
+ \sa QIntValidator, QRegularExpressionValidator, QLocale::toDouble(), {Line Edits Example}
*/
/*!
@@ -704,7 +693,7 @@ QValidator::State QDoubleValidatorPrivate::validateWithLocale(QString &input, QL
if (notation == QDoubleValidator::StandardNotation) {
double max = qMax(qAbs(q->b), qAbs(q->t));
- if (max < LLONG_MAX) {
+ if (max < double(LLONG_MAX)) {
qlonglong n = pow10(numDigits(qlonglong(max)));
// In order to get the highest possible number in the intermediate
// range we need to get 10 to the power of the number of digits
@@ -722,8 +711,6 @@ QValidator::State QDoubleValidatorPrivate::validateWithLocale(QString &input, QL
return QValidator::Intermediate;
}
-// FIXME: Qt 6: Make QDoubleValidator::setRange() non-virtual
-
/*!
Sets the validator to accept doubles from \a minimum to \a maximum
inclusive, with at most \a decimals digits after the decimal
@@ -823,122 +810,6 @@ QDoubleValidator::Notation QDoubleValidator::notation() const
return d->notation;
}
-/*!
- \class QRegExpValidator
- \brief The QRegExpValidator class is used to check a string
- against a regular expression.
- \inmodule QtGui
-
- QRegExpValidator uses a regular expression (regexp) to
- determine whether an input string is \l Acceptable, \l
- Intermediate, or \l Invalid. The regexp can either be supplied
- when the QRegExpValidator is constructed, or at a later time.
-
- When QRegExpValidator determines whether a string is \l Acceptable
- or not, the regexp is treated as if it begins with the start of string
- assertion (\b{^}) and ends with the end of string assertion
- (\b{$}); the match is against the entire input string, or from
- the given position if a start position greater than zero is given.
-
- If a string is a prefix of an \l Acceptable string, it is considered
- \l Intermediate. For example, "" and "A" are \l Intermediate for the
- regexp \b{[A-Z][0-9]} (whereas "_" would be \l Invalid).
-
- For a brief introduction to Qt's regexp engine, see \l QRegExp.
-
- Example of use:
- \snippet code/src_gui_util_qvalidator.cpp 3
-
- Below we present some examples of validators. In practice they would
- normally be associated with a widget as in the example above.
-
- \snippet code/src_gui_util_qvalidator.cpp 4
-
- \sa QRegExp, QIntValidator, QDoubleValidator, {Settings Editor Example}
-*/
-
-/*!
- Constructs a validator with a \a parent object that accepts
- any string (including an empty one) as valid.
-*/
-
-QRegExpValidator::QRegExpValidator(QObject *parent)
- : QRegExpValidator(QRegExp(QString::fromLatin1(".*")), parent)
-{
-}
-
-/*!
- Constructs a validator with a \a parent object that
- accepts all strings that match the regular expression \a rx.
-
- The match is made against the entire string; e.g. if the regexp is
- \b{[A-Fa-f0-9]+} it will be treated as \b{^[A-Fa-f0-9]+$}.
-*/
-
-QRegExpValidator::QRegExpValidator(const QRegExp& rx, QObject *parent)
- : QValidator(parent), r(rx)
-{
-}
-
-
-/*!
- Destroys the validator.
-*/
-
-QRegExpValidator::~QRegExpValidator()
-{
-}
-
-/*!
- Returns \l Acceptable if \a input is matched by the regular
- expression for this validator, \l Intermediate if it has matched
- partially (i.e. could be a valid match if additional valid
- characters are added), and \l Invalid if \a input is not matched.
-
- Additionally, if \a input is not matched, the \a pos parameter is set to
- the length of the \a input parameter.
-
- For example, if the regular expression is \b{\\w\\d\\d}
- (word-character, digit, digit) then "A57" is \l Acceptable,
- "E5" is \l Intermediate, and "+9" is \l Invalid.
-
- \sa QRegExp::exactMatch()
-*/
-
-QValidator::State QRegExpValidator::validate(QString &input, int& pos) const
-{
- QRegExp copy = r;
- if (copy.exactMatch(input)) {
- return Acceptable;
- } else {
- if (copy.matchedLength() == input.size()) {
- return Intermediate;
- } else {
- pos = input.size();
- return Invalid;
- }
- }
-}
-
-/*!
- \property QRegExpValidator::regExp
- \brief the regular expression used for validation
-
- By default, this property contains a regular expression with the pattern \c{.*}
- that matches any string.
-*/
-
-void QRegExpValidator::setRegExp(const QRegExp& rx)
-{
- if (r != rx) {
- r = rx;
- emit regExpChanged(r);
- emit changed();
- }
-}
-
-#endif
-
#if QT_CONFIG(regularexpression)
/*!
@@ -969,7 +840,7 @@ void QRegExpValidator::setRegExp(const QRegExp& rx)
\snippet code/src_gui_util_qvalidator.cpp 6
- \sa QRegularExpression, QIntValidator, QDoubleValidator, QRegExpValidator
+ \sa QRegularExpression, QIntValidator, QDoubleValidator
*/
class QRegularExpressionValidatorPrivate : public QValidatorPrivate
diff --git a/src/gui/util/qvalidator.h b/src/gui/util/qvalidator.h
index f0e72e3814..7e72a60f24 100644
--- a/src/gui/util/qvalidator.h
+++ b/src/gui/util/qvalidator.h
@@ -44,7 +44,6 @@
#include <QtGui/qtguiglobal.h>
#include <QtCore/qobject.h>
#include <QtCore/qstring.h>
-#include <QtCore/qregexp.h>
#if QT_CONFIG(regularexpression)
# include <QtCore/qregularexpression.h>
#endif
@@ -105,7 +104,7 @@ public:
void setBottom(int);
void setTop(int);
- virtual void setRange(int bottom, int top);
+ void setRange(int bottom, int top);
int bottom() const { return b; }
int top() const { return t; }
@@ -120,8 +119,6 @@ private:
int t;
};
-#ifndef QT_NO_REGEXP
-
class QDoubleValidatorPrivate;
class Q_GUI_EXPORT QDoubleValidator : public QValidator
@@ -144,7 +141,7 @@ public:
Q_ENUM(Notation)
QValidator::State validate(QString &, int &) const override;
- virtual void setRange(double bottom, double top, int decimals = 0);
+ void setRange(double bottom, double top, int decimals = 0);
void setBottom(double);
void setTop(double);
void setDecimals(int);
@@ -170,33 +167,6 @@ private:
int dec;
};
-
-class Q_GUI_EXPORT QRegExpValidator : public QValidator
-{
- Q_OBJECT
- Q_PROPERTY(QRegExp regExp READ regExp WRITE setRegExp NOTIFY regExpChanged)
-
-public:
- explicit QRegExpValidator(QObject *parent = nullptr);
- explicit QRegExpValidator(const QRegExp& rx, QObject *parent = nullptr);
- ~QRegExpValidator();
-
- virtual QValidator::State validate(QString& input, int& pos) const override;
-
- void setRegExp(const QRegExp& rx);
- const QRegExp& regExp() const { return r; }
-
-Q_SIGNALS:
- void regExpChanged(const QRegExp& regExp);
-
-private:
- Q_DISABLE_COPY(QRegExpValidator)
-
- QRegExp r;
-};
-
-#endif // QT_NO_REGEXP
-
#if QT_CONFIG(regularexpression)
class QRegularExpressionValidatorPrivate;
@@ -211,7 +181,7 @@ public:
explicit QRegularExpressionValidator(const QRegularExpression &re, QObject *parent = nullptr);
~QRegularExpressionValidator();
- virtual QValidator::State validate(QString &input, int &pos) const override;
+ QValidator::State validate(QString &input, int &pos) const override;
QRegularExpression regularExpression() const;
diff --git a/src/gui/util/util.pri b/src/gui/util/util.pri
index d3402133d6..a799c3e591 100644
--- a/src/gui/util/util.pri
+++ b/src/gui/util/util.pri
@@ -46,3 +46,16 @@ qtConfig(regularexpression) {
SOURCES += \
util/qshadergenerator.cpp
}
+
+qtConfig(undocommand) {
+ HEADERS += \
+ util/qundostack.h \
+ util/qundostack_p.h
+
+ SOURCES += util/qundostack.cpp
+}
+
+qtConfig(undogroup) {
+ HEADERS += util/qundogroup.h
+ SOURCES += util/qundogroup.cpp
+}
diff --git a/src/gui/vulkan/qvulkaninstance.cpp b/src/gui/vulkan/qvulkaninstance.cpp
index 555dee3a9c..ddee0e47a4 100644
--- a/src/gui/vulkan/qvulkaninstance.cpp
+++ b/src/gui/vulkan/qvulkaninstance.cpp
@@ -358,7 +358,7 @@ QVulkanInstance::~QVulkanInstance()
*/
/*!
- \fn uint qHash(const QVulkanLayer &key, uint seed)
+ \fn size_t qHash(const QVulkanLayer &key, size_t seed)
\since 5.10
\relates QVulkanLayer
@@ -401,7 +401,7 @@ QVulkanInstance::~QVulkanInstance()
*/
/*!
- \fn uint qHash(const QVulkanExtension &key, uint seed)
+ \fn size_t qHash(const QVulkanExtension &key, size_t seed)
\since 5.10
\relates QVulkanExtension
diff --git a/src/gui/vulkan/qvulkaninstance.h b/src/gui/vulkan/qvulkaninstance.h
index 5b3db9a4c8..ea0b04da95 100644
--- a/src/gui/vulkan/qvulkaninstance.h
+++ b/src/gui/vulkan/qvulkaninstance.h
@@ -91,7 +91,7 @@ inline bool operator==(const QVulkanLayer &lhs, const QVulkanLayer &rhs) noexcep
inline bool operator!=(const QVulkanLayer &lhs, const QVulkanLayer &rhs) noexcept
{ return !(lhs == rhs); }
-inline uint qHash(const QVulkanLayer &key, uint seed = 0) noexcept
+inline size_t qHash(const QVulkanLayer &key, size_t seed = 0) noexcept
{
QtPrivate::QHashCombine hash;
seed = hash(seed, key.name);
@@ -114,7 +114,7 @@ inline bool operator==(const QVulkanExtension &lhs, const QVulkanExtension &rhs)
inline bool operator!=(const QVulkanExtension &lhs, const QVulkanExtension &rhs) noexcept
{ return !(lhs == rhs); }
-inline uint qHash(const QVulkanExtension &key, uint seed = 0) noexcept
+inline size_t qHash(const QVulkanExtension &key, size_t seed = 0) noexcept
{
QtPrivate::QHashCombine hash;
seed = hash(seed, key.name);
diff --git a/src/network/.prev_CMakeLists.txt b/src/network/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..1af21c806b
--- /dev/null
+++ b/src/network/.prev_CMakeLists.txt
@@ -0,0 +1,436 @@
+# Generated from network.pro.
+
+#####################################################################
+## Network Module:
+#####################################################################
+
+qt_add_module(Network
+ SOURCES
+ access/qabstractnetworkcache.cpp access/qabstractnetworkcache.h access/qabstractnetworkcache_p.h
+ access/qhsts.cpp access/qhsts_p.h
+ access/qhstspolicy.cpp access/qhstspolicy.h
+ access/qnetworkaccessauthenticationmanager.cpp access/qnetworkaccessauthenticationmanager_p.h
+ access/qnetworkaccessbackend.cpp access/qnetworkaccessbackend_p.h
+ access/qnetworkaccesscache.cpp access/qnetworkaccesscache_p.h
+ access/qnetworkaccesscachebackend.cpp access/qnetworkaccesscachebackend_p.h
+ access/qnetworkaccessdebugpipebackend.cpp access/qnetworkaccessdebugpipebackend_p.h
+ access/qnetworkaccessfilebackend.cpp access/qnetworkaccessfilebackend_p.h
+ access/qnetworkaccessmanager.cpp access/qnetworkaccessmanager.h access/qnetworkaccessmanager_p.h
+ access/qnetworkcookie.cpp access/qnetworkcookie.h access/qnetworkcookie_p.h
+ access/qnetworkcookiejar.cpp access/qnetworkcookiejar.h access/qnetworkcookiejar_p.h
+ access/qnetworkfile.cpp access/qnetworkfile_p.h
+ access/qnetworkreply.cpp access/qnetworkreply.h access/qnetworkreply_p.h
+ access/qnetworkreplydataimpl.cpp access/qnetworkreplydataimpl_p.h
+ access/qnetworkreplyfileimpl.cpp access/qnetworkreplyfileimpl_p.h
+ access/qnetworkreplyimpl.cpp access/qnetworkreplyimpl_p.h
+ access/qnetworkrequest.cpp access/qnetworkrequest.h access/qnetworkrequest_p.h
+ kernel/qauthenticator.cpp kernel/qauthenticator.h kernel/qauthenticator_p.h
+ kernel/qhostaddress.cpp kernel/qhostaddress.h kernel/qhostaddress_p.h
+ kernel/qhostinfo.cpp kernel/qhostinfo.h kernel/qhostinfo_p.h
+ kernel/qnetconmonitor_p.h
+ kernel/qnetworkdatagram.cpp kernel/qnetworkdatagram.h kernel/qnetworkdatagram_p.h
+ kernel/qnetworkinterface.cpp kernel/qnetworkinterface.h kernel/qnetworkinterface_p.h
+ kernel/qnetworkinterface_unix_p.h
+ kernel/qnetworkproxy.cpp kernel/qnetworkproxy.h
+ kernel/qtnetworkglobal.h kernel/qtnetworkglobal_p.h
+ socket/qabstractsocket.cpp socket/qabstractsocket.h socket/qabstractsocket_p.h
+ socket/qabstractsocketengine.cpp socket/qabstractsocketengine_p.h
+ socket/qtcpserver.cpp socket/qtcpserver.h socket/qtcpserver_p.h
+ socket/qtcpsocket.cpp socket/qtcpsocket.h socket/qtcpsocket_p.h
+ socket/qudpsocket.cpp socket/qudpsocket.h
+ ssl/qasn1element.cpp ssl/qasn1element_p.h
+ ssl/qpassworddigestor.cpp ssl/qpassworddigestor.h
+ ssl/qssl.cpp ssl/qssl.h ssl/qssl_p.h
+ ssl/qsslcertificate.cpp ssl/qsslcertificate.h ssl/qsslcertificate_p.h
+ ssl/qsslcertificateextension.cpp ssl/qsslcertificateextension.h ssl/qsslcertificateextension_p.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ INCLUDE_DIRECTORIES
+ kernel
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+ PRECOMPILED_HEADER
+ "../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:network.pro:<TRUE>:
+# MODULE_WINRT_CAPABILITIES = "internetClient" "internetClientServer" "privateNetworkClientServer"
+# QMAKE_LIBS = "$$QMAKE_LIBS_NETWORK"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(Network CONDITION MSVC AND (TEST_architecture_arch STREQUAL "i386")
+ LINK_OPTIONS
+ "/BASE:0x64000000"
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_ftp
+ SOURCES
+ access/qftp.cpp access/qftp_p.h
+ access/qnetworkaccessftpbackend.cpp access/qnetworkaccessftpbackend_p.h
+ kernel/qurlinfo.cpp kernel/qurlinfo_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_networkdiskcache
+ SOURCES
+ access/qnetworkdiskcache.cpp access/qnetworkdiskcache.h access/qnetworkdiskcache_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_settings
+ SOURCES
+ access/qhstsstore.cpp access/qhstsstore_p.h
+)
+
+qt_extend_target(Network CONDITION APPLE
+ LIBRARIES
+ ${FWCoreFoundation}
+ ${FWSecurity}
+)
+
+qt_extend_target(Network CONDITION WASM
+ SOURCES
+ access/qnetworkreplywasmimpl.cpp access/qnetworkreplywasmimpl_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_http
+ SOURCES
+ access/http2/bitstreams.cpp access/http2/bitstreams_p.h
+ access/http2/hpack.cpp access/http2/hpack_p.h
+ access/http2/hpacktable.cpp access/http2/hpacktable_p.h
+ access/http2/http2frames.cpp access/http2/http2frames_p.h
+ access/http2/http2protocol.cpp access/http2/http2protocol_p.h
+ access/http2/http2streams.cpp access/http2/http2streams_p.h
+ access/http2/huffman.cpp access/http2/huffman_p.h
+ access/qabstractprotocolhandler.cpp access/qabstractprotocolhandler_p.h
+ access/qhttp2configuration.cpp access/qhttp2configuration.h
+ access/qhttp2protocolhandler.cpp access/qhttp2protocolhandler_p.h
+ access/qhttpmultipart.cpp access/qhttpmultipart.h access/qhttpmultipart_p.h
+ access/qhttpnetworkconnection.cpp access/qhttpnetworkconnection_p.h
+ access/qhttpnetworkconnectionchannel.cpp access/qhttpnetworkconnectionchannel_p.h
+ access/qhttpnetworkheader.cpp access/qhttpnetworkheader_p.h
+ access/qhttpnetworkreply.cpp access/qhttpnetworkreply_p.h
+ access/qhttpnetworkrequest.cpp access/qhttpnetworkrequest_p.h
+ access/qhttpprotocolhandler.cpp access/qhttpprotocolhandler_p.h
+ access/qhttpthreaddelegate.cpp access/qhttpthreaddelegate_p.h
+ access/qnetworkreplyhttpimpl.cpp access/qnetworkreplyhttpimpl_p.h
+ socket/qhttpsocketengine.cpp socket/qhttpsocketengine_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_system_zlib
+ LIBRARIES
+ ZLIB::ZLIB
+)
+
+qt_extend_target(Network CONDITION NOT QT_FEATURE_system_zlib
+ INCLUDE_DIRECTORIES
+ ../3rdparty/zlib/src
+)
+
+qt_extend_target(Network CONDITION NOT QT_FEATURE_system_zlib AND NOT no_core_dep
+ LIBRARIES
+ Qt::Core
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_topleveldomain
+ SOURCES
+ kernel/qtldurl.cpp kernel/qtldurl_p.h
+ kernel/qurltlds_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dnslookup
+ SOURCES
+ kernel/qdnslookup.cpp kernel/qdnslookup.h kernel/qdnslookup_p.h
+)
+
+qt_extend_target(Network CONDITION UNIX
+ SOURCES
+ kernel/qhostinfo_unix.cpp
+ socket/qnativesocketengine_unix.cpp
+ socket/qnet_unix_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dlopen AND UNIX
+ LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_linux_netlink AND UNIX
+ SOURCES
+ kernel/qnetworkinterface_linux.cpp
+)
+
+qt_extend_target(Network CONDITION UNIX AND NOT QT_FEATURE_linux_netlink
+ SOURCES
+ kernel/qnetworkinterface_unix.cpp
+)
+
+qt_extend_target(Network CONDITION ANDROID AND QT_FEATURE_dnslookup
+ SOURCES
+ kernel/qdnslookup_android.cpp
+)
+
+qt_extend_target(Network CONDITION WIN32
+ SOURCES
+ kernel/qhostinfo_win.cpp
+)
+
+qt_extend_target(Network CONDITION WIN32 AND NOT WINRT
+ SOURCES
+ kernel/qnetworkinterface_win.cpp
+ kernel/qnetworkproxy_win.cpp
+ socket/qnativesocketengine_win.cpp
+ LIBRARIES
+ advapi32
+ dnsapi
+ iphlpapi
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dnslookup AND WIN32 AND NOT WINRT
+ SOURCES
+ kernel/qdnslookup_win.cpp
+)
+
+qt_extend_target(Network CONDITION WINRT
+ SOURCES
+ kernel/qnetworkinterface_winrt.cpp
+ socket/qnativesocketengine_winrt.cpp socket/qnativesocketengine_winrt_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dnslookup AND WINRT
+ SOURCES
+ kernel/qdnslookup_winrt.cpp
+)
+
+qt_extend_target(Network CONDITION APPLE AND NOT UIKIT
+ LIBRARIES
+ ${FWCoreServices}
+ ${FWSystemConfiguration}
+)
+
+qt_extend_target(Network CONDITION IOS OR MACOS
+ SOURCES
+ kernel/qnetconmonitor_darwin.mm
+ LIBRARIES
+ ${FWSystemConfiguration}
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_netlistmgr AND NOT IOS AND NOT MACOS
+ SOURCES
+ kernel/qnetconmonitor_win.cpp
+)
+
+qt_extend_target(Network CONDITION NOT IOS AND NOT MACOS AND NOT QT_FEATURE_netlistmgr
+ SOURCES
+ kernel/qnetconmonitor_stub.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_gssapi
+ LIBRARIES
+ GSSAPI::GSSAPI
+)
+
+qt_extend_target(Network CONDITION UIKIT
+ SOURCES
+ kernel/qnetworkinterface_uikit_p.h
+)
+
+qt_extend_target(Network CONDITION MACOS
+ SOURCES
+ kernel/qnetworkproxy_mac.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_libproxy AND NOT MACOS AND (UNIX OR WINRT)
+ SOURCES
+ kernel/qnetworkproxy_libproxy.cpp
+ LIBRARIES
+ ${CMAKE_DL_LIBS}
+ PkgConfig::Libproxy
+)
+
+qt_extend_target(Network CONDITION NOT MACOS AND NOT QT_FEATURE_libproxy AND (UNIX OR WINRT)
+ SOURCES
+ kernel/qnetworkproxy_generic.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_socks5
+ SOURCES
+ socket/qsocks5socketengine.cpp socket/qsocks5socketengine_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_sctp
+ SOURCES
+ socket/qsctpserver.cpp socket/qsctpserver.h socket/qsctpserver_p.h
+ socket/qsctpsocket.cpp socket/qsctpsocket.h socket/qsctpsocket_p.h
+)
+
+qt_extend_target(Network CONDITION NOT WINRT
+ SOURCES
+ socket/qnativesocketengine.cpp socket/qnativesocketengine_p.h
+)
+
+qt_extend_target(Network CONDITION MSVC
+ MOC_OPTIONS
+ "-D_WINSOCK_DEPRECATED_NO_WARNINGS"
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_localserver
+ SOURCES
+ socket/qlocalserver.cpp socket/qlocalserver.h socket/qlocalserver_p.h
+ socket/qlocalsocket.cpp socket/qlocalsocket.h socket/qlocalsocket_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_localserver AND (INTEGRITY OR WINRT)
+ SOURCES
+ socket/qlocalserver_tcp.cpp
+ socket/qlocalsocket_tcp.cpp
+ DEFINES
+ QT_LOCALSOCKET_TCP
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_localserver AND UNIX AND NOT INTEGRITY AND NOT WINRT
+ SOURCES
+ socket/qlocalserver_unix.cpp
+ socket/qlocalsocket_unix.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_localserver AND WIN32 AND NOT WINRT
+ SOURCES
+ socket/qlocalserver_win.cpp
+ socket/qlocalsocket_win.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_system_proxies
+ DEFINES
+ QT_USE_SYSTEM_PROXIES
+)
+
+qt_extend_target(Network CONDITION NOT QT_FEATURE_openssl
+ SOURCES
+ ssl/qsslcertificate_qt.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_ssl
+ SOURCES
+ ssl/qocspresponse.cpp ssl/qocspresponse.h ssl/qocspresponse_p.h
+ ssl/qsslcipher.cpp ssl/qsslcipher.h ssl/qsslcipher_p.h
+ ssl/qsslconfiguration.cpp ssl/qsslconfiguration.h ssl/qsslconfiguration_p.h
+ ssl/qssldiffiehellmanparameters.cpp ssl/qssldiffiehellmanparameters.h ssl/qssldiffiehellmanparameters_p.h
+ ssl/qsslellipticcurve.cpp ssl/qsslellipticcurve.h
+ ssl/qsslerror.cpp ssl/qsslerror.h
+ ssl/qsslkey.h ssl/qsslkey_p.cpp ssl/qsslkey_p.h
+ ssl/qsslpresharedkeyauthenticator.cpp ssl/qsslpresharedkeyauthenticator.h ssl/qsslpresharedkeyauthenticator_p.h
+ ssl/qsslsocket.cpp ssl/qsslsocket.h ssl/qsslsocket_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_ssl AND WINRT
+ SOURCES
+ ssl/qsslcertificate_winrt.cpp
+ ssl/qssldiffiehellmanparameters_dummy.cpp
+ ssl/qsslellipticcurve_dummy.cpp
+ ssl/qsslkey_qt.cpp
+ ssl/qsslkey_winrt.cpp
+ ssl/qsslsocket_winrt.cpp ssl/qsslsocket_winrt_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_schannel AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qsslcertificate_schannel.cpp
+ ssl/qssldiffiehellmanparameters_dummy.cpp
+ ssl/qsslellipticcurve_dummy.cpp
+ ssl/qsslkey_qt.cpp
+ ssl/qsslkey_schannel.cpp
+ ssl/qsslsocket_qt.cpp
+ ssl/qsslsocket_schannel.cpp ssl/qsslsocket_schannel_p.h
+ LIBRARIES
+ Crypt32
+ Secur32
+ bcrypt
+ ncrypt
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_securetransport AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qssldiffiehellmanparameters_dummy.cpp
+ ssl/qsslellipticcurve_dummy.cpp
+ ssl/qsslkey_mac.cpp
+ ssl/qsslkey_qt.cpp
+ ssl/qsslsocket_mac.cpp ssl/qsslsocket_mac_p.h
+ ssl/qsslsocket_mac_shared.cpp
+ ssl/qsslsocket_qt.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dtls AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qdtls.cpp ssl/qdtls.h ssl/qdtls_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qsslcertificate_openssl.cpp
+ ssl/qsslcontext_openssl.cpp ssl/qsslcontext_openssl_p.h
+ ssl/qssldiffiehellmanparameters_openssl.cpp
+ ssl/qsslellipticcurve_openssl.cpp
+ ssl/qsslkey_openssl.cpp
+ ssl/qsslsocket_openssl.cpp ssl/qsslsocket_openssl_p.h
+ ssl/qsslsocket_openssl_symbols.cpp ssl/qsslsocket_openssl_symbols_p.h
+ DEFINES
+ OPENSSL_API_COMPAT=0x10100000L
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dtls AND QT_FEATURE_openssl AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qdtls_openssl.cpp ssl/qdtls_openssl_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_ocsp AND QT_FEATURE_openssl AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qocsp_p.h
+)
+
+qt_extend_target(Network CONDITION APPLE AND QT_FEATURE_openssl AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qsslsocket_mac_shared.cpp
+)
+
+qt_extend_target(Network CONDITION ANDROID AND QT_FEATURE_openssl AND QT_FEATURE_ssl AND NOT ANDROID_EMBEDDED
+ SOURCES
+ ssl/qsslsocket_openssl_android.cpp
+)
+
+qt_extend_target(Network CONDITION ANDROID AND QT_FEATURE_openssl AND QT_FEATURE_openssl_linked AND QT_FEATURE_ssl AND build_pass
+ LIBRARIES
+ crypto_${CMAKE_SYSTEM_PROCESSOR}
+ ssl_${CMAKE_SYSTEM_PROCESSOR}
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_openssl_linked AND QT_FEATURE_ssl AND NOT ANDROID
+ LIBRARIES
+ WrapOpenSSL::WrapOpenSSL
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND NOT QT_FEATURE_openssl_linked
+ LIBRARIES
+ WrapOpenSSLHeaders::WrapOpenSSLHeaders
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND WIN32
+ SOURCES
+ ssl/qwindowscarootfetcher.cpp ssl/qwindowscarootfetcher_p.h
+ LIBRARIES
+ crypt32
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dnslookup AND UNIX AND NOT ANDROID AND NOT INTEGRITY
+ SOURCES
+ kernel/qdnslookup_unix.cpp
+)
+qt_add_docs(Network
+ doc/qtnetwork.qdocconf
+)
+
diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt
new file mode 100644
index 0000000000..6ff806fef9
--- /dev/null
+++ b/src/network/CMakeLists.txt
@@ -0,0 +1,437 @@
+# Generated from network.pro.
+
+#####################################################################
+## Network Module:
+#####################################################################
+
+qt_add_module(Network
+ SOURCES
+ access/qabstractnetworkcache.cpp access/qabstractnetworkcache.h access/qabstractnetworkcache_p.h
+ access/qhsts.cpp access/qhsts_p.h
+ access/qhstspolicy.cpp access/qhstspolicy.h
+ access/qnetworkaccessauthenticationmanager.cpp access/qnetworkaccessauthenticationmanager_p.h
+ access/qnetworkaccessbackend.cpp access/qnetworkaccessbackend_p.h
+ access/qnetworkaccesscache.cpp access/qnetworkaccesscache_p.h
+ access/qnetworkaccesscachebackend.cpp access/qnetworkaccesscachebackend_p.h
+ access/qnetworkaccessdebugpipebackend.cpp access/qnetworkaccessdebugpipebackend_p.h
+ access/qnetworkaccessfilebackend.cpp access/qnetworkaccessfilebackend_p.h
+ access/qnetworkaccessmanager.cpp access/qnetworkaccessmanager.h access/qnetworkaccessmanager_p.h
+ access/qnetworkcookie.cpp access/qnetworkcookie.h access/qnetworkcookie_p.h
+ access/qnetworkcookiejar.cpp access/qnetworkcookiejar.h access/qnetworkcookiejar_p.h
+ access/qnetworkfile.cpp access/qnetworkfile_p.h
+ access/qnetworkreply.cpp access/qnetworkreply.h access/qnetworkreply_p.h
+ access/qnetworkreplydataimpl.cpp access/qnetworkreplydataimpl_p.h
+ access/qnetworkreplyfileimpl.cpp access/qnetworkreplyfileimpl_p.h
+ access/qnetworkreplyimpl.cpp access/qnetworkreplyimpl_p.h
+ access/qnetworkrequest.cpp access/qnetworkrequest.h access/qnetworkrequest_p.h
+ kernel/qauthenticator.cpp kernel/qauthenticator.h kernel/qauthenticator_p.h
+ kernel/qhostaddress.cpp kernel/qhostaddress.h kernel/qhostaddress_p.h
+ kernel/qhostinfo.cpp kernel/qhostinfo.h kernel/qhostinfo_p.h
+ kernel/qnetconmonitor_p.h
+ kernel/qnetworkdatagram.cpp kernel/qnetworkdatagram.h kernel/qnetworkdatagram_p.h
+ kernel/qnetworkinterface.cpp kernel/qnetworkinterface.h kernel/qnetworkinterface_p.h
+ kernel/qnetworkinterface_unix_p.h
+ kernel/qnetworkproxy.cpp kernel/qnetworkproxy.h
+ kernel/qtnetworkglobal.h kernel/qtnetworkglobal_p.h
+ socket/qabstractsocket.cpp socket/qabstractsocket.h socket/qabstractsocket_p.h
+ socket/qabstractsocketengine.cpp socket/qabstractsocketengine_p.h
+ socket/qtcpserver.cpp socket/qtcpserver.h socket/qtcpserver_p.h
+ socket/qtcpsocket.cpp socket/qtcpsocket.h socket/qtcpsocket_p.h
+ socket/qudpsocket.cpp socket/qudpsocket.h
+ ssl/qasn1element.cpp ssl/qasn1element_p.h
+ ssl/qpassworddigestor.cpp ssl/qpassworddigestor.h
+ ssl/qssl.cpp ssl/qssl.h ssl/qssl_p.h
+ ssl/qsslcertificate.cpp ssl/qsslcertificate.h ssl/qsslcertificate_p.h
+ ssl/qsslcertificateextension.cpp ssl/qsslcertificateextension.h ssl/qsslcertificateextension_p.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ INCLUDE_DIRECTORIES
+ kernel
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+ PRECOMPILED_HEADER
+ "../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:network.pro:<TRUE>:
+# MODULE_WINRT_CAPABILITIES = "internetClient" "internetClientServer" "privateNetworkClientServer"
+# QMAKE_LIBS = "$$QMAKE_LIBS_NETWORK"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(Network CONDITION MSVC AND (TEST_architecture_arch STREQUAL "i386")
+ LINK_OPTIONS
+ "/BASE:0x64000000"
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_ftp
+ SOURCES
+ access/qftp.cpp access/qftp_p.h
+ access/qnetworkaccessftpbackend.cpp access/qnetworkaccessftpbackend_p.h
+ kernel/qurlinfo.cpp kernel/qurlinfo_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_networkdiskcache
+ SOURCES
+ access/qnetworkdiskcache.cpp access/qnetworkdiskcache.h access/qnetworkdiskcache_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_settings
+ SOURCES
+ access/qhstsstore.cpp access/qhstsstore_p.h
+)
+
+qt_extend_target(Network CONDITION APPLE
+ LIBRARIES
+ ${FWCoreFoundation}
+ ${FWSecurity}
+)
+
+qt_extend_target(Network CONDITION WASM
+ SOURCES
+ access/qnetworkreplywasmimpl.cpp access/qnetworkreplywasmimpl_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_http
+ SOURCES
+ access/http2/bitstreams.cpp access/http2/bitstreams_p.h
+ access/http2/hpack.cpp access/http2/hpack_p.h
+ access/http2/hpacktable.cpp access/http2/hpacktable_p.h
+ access/http2/http2frames.cpp access/http2/http2frames_p.h
+ access/http2/http2protocol.cpp access/http2/http2protocol_p.h
+ access/http2/http2streams.cpp access/http2/http2streams_p.h
+ access/http2/huffman.cpp access/http2/huffman_p.h
+ access/qabstractprotocolhandler.cpp access/qabstractprotocolhandler_p.h
+ access/qhttp2configuration.cpp access/qhttp2configuration.h
+ access/qhttp2protocolhandler.cpp access/qhttp2protocolhandler_p.h
+ access/qhttpmultipart.cpp access/qhttpmultipart.h access/qhttpmultipart_p.h
+ access/qhttpnetworkconnection.cpp access/qhttpnetworkconnection_p.h
+ access/qhttpnetworkconnectionchannel.cpp access/qhttpnetworkconnectionchannel_p.h
+ access/qhttpnetworkheader.cpp access/qhttpnetworkheader_p.h
+ access/qhttpnetworkreply.cpp access/qhttpnetworkreply_p.h
+ access/qhttpnetworkrequest.cpp access/qhttpnetworkrequest_p.h
+ access/qhttpprotocolhandler.cpp access/qhttpprotocolhandler_p.h
+ access/qhttpthreaddelegate.cpp access/qhttpthreaddelegate_p.h
+ access/qnetworkreplyhttpimpl.cpp access/qnetworkreplyhttpimpl_p.h
+ socket/qhttpsocketengine.cpp socket/qhttpsocketengine_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_system_zlib
+ LIBRARIES
+ ZLIB::ZLIB
+)
+
+qt_extend_target(Network CONDITION NOT QT_FEATURE_system_zlib
+ INCLUDE_DIRECTORIES
+ ../3rdparty/zlib/src
+)
+
+qt_extend_target(Network CONDITION NOT QT_FEATURE_system_zlib AND NOT no_core_dep
+ LIBRARIES
+ Qt::Core
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_topleveldomain
+ SOURCES
+ kernel/qtldurl.cpp kernel/qtldurl_p.h
+ kernel/qurltlds_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dnslookup
+ SOURCES
+ kernel/qdnslookup.cpp kernel/qdnslookup.h kernel/qdnslookup_p.h
+)
+
+qt_extend_target(Network CONDITION UNIX
+ SOURCES
+ kernel/qhostinfo_unix.cpp
+ socket/qnativesocketengine_unix.cpp
+ socket/qnet_unix_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dlopen AND UNIX
+ LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_linux_netlink AND UNIX
+ SOURCES
+ kernel/qnetworkinterface_linux.cpp
+)
+
+qt_extend_target(Network CONDITION UNIX AND NOT QT_FEATURE_linux_netlink
+ SOURCES
+ kernel/qnetworkinterface_unix.cpp
+)
+
+qt_extend_target(Network CONDITION ANDROID AND QT_FEATURE_dnslookup
+ SOURCES
+ kernel/qdnslookup_android.cpp
+)
+
+qt_extend_target(Network CONDITION WIN32
+ SOURCES
+ kernel/qhostinfo_win.cpp
+)
+
+qt_extend_target(Network CONDITION WIN32 AND NOT WINRT
+ SOURCES
+ kernel/qnetworkinterface_win.cpp
+ kernel/qnetworkproxy_win.cpp
+ socket/qnativesocketengine_win.cpp
+ LIBRARIES
+ advapi32
+ dnsapi
+ iphlpapi
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dnslookup AND WIN32 AND NOT WINRT
+ SOURCES
+ kernel/qdnslookup_win.cpp
+)
+
+qt_extend_target(Network CONDITION WINRT
+ SOURCES
+ kernel/qnetworkinterface_winrt.cpp
+ socket/qnativesocketengine_winrt.cpp socket/qnativesocketengine_winrt_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dnslookup AND WINRT
+ SOURCES
+ kernel/qdnslookup_winrt.cpp
+)
+
+qt_extend_target(Network CONDITION APPLE AND NOT UIKIT
+ LIBRARIES
+ ${FWCoreServices}
+ ${FWSystemConfiguration}
+)
+
+qt_extend_target(Network CONDITION IOS OR MACOS
+ SOURCES
+ kernel/qnetconmonitor_darwin.mm
+ LIBRARIES
+ ${FWSystemConfiguration}
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_netlistmgr AND NOT IOS AND NOT MACOS
+ SOURCES
+ kernel/qnetconmonitor_win.cpp
+)
+
+qt_extend_target(Network CONDITION NOT IOS AND NOT MACOS AND NOT QT_FEATURE_netlistmgr
+ SOURCES
+ kernel/qnetconmonitor_stub.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_gssapi
+ LIBRARIES
+ GSSAPI::GSSAPI
+)
+
+qt_extend_target(Network CONDITION UIKIT
+ SOURCES
+ kernel/qnetworkinterface_uikit_p.h
+)
+
+qt_extend_target(Network CONDITION MACOS
+ SOURCES
+ kernel/qnetworkproxy_mac.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_libproxy AND NOT MACOS AND (UNIX OR WINRT)
+ SOURCES
+ kernel/qnetworkproxy_libproxy.cpp
+ LIBRARIES
+ ${CMAKE_DL_LIBS}
+ PkgConfig::Libproxy
+)
+
+qt_extend_target(Network CONDITION NOT MACOS AND NOT QT_FEATURE_libproxy AND (UNIX OR WINRT)
+ SOURCES
+ kernel/qnetworkproxy_generic.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_socks5
+ SOURCES
+ socket/qsocks5socketengine.cpp socket/qsocks5socketengine_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_sctp
+ SOURCES
+ socket/qsctpserver.cpp socket/qsctpserver.h socket/qsctpserver_p.h
+ socket/qsctpsocket.cpp socket/qsctpsocket.h socket/qsctpsocket_p.h
+)
+
+qt_extend_target(Network CONDITION NOT WINRT
+ SOURCES
+ socket/qnativesocketengine.cpp socket/qnativesocketengine_p.h
+)
+
+qt_extend_target(Network CONDITION MSVC
+ MOC_OPTIONS
+ "-D_WINSOCK_DEPRECATED_NO_WARNINGS"
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_localserver
+ SOURCES
+ socket/qlocalserver.cpp socket/qlocalserver.h socket/qlocalserver_p.h
+ socket/qlocalsocket.cpp socket/qlocalsocket.h socket/qlocalsocket_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_localserver AND (INTEGRITY OR WINRT)
+ SOURCES
+ socket/qlocalserver_tcp.cpp
+ socket/qlocalsocket_tcp.cpp
+ DEFINES
+ QT_LOCALSOCKET_TCP
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_localserver AND UNIX AND NOT INTEGRITY AND NOT WINRT
+ SOURCES
+ socket/qlocalserver_unix.cpp
+ socket/qlocalsocket_unix.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_localserver AND WIN32 AND NOT WINRT
+ SOURCES
+ socket/qlocalserver_win.cpp
+ socket/qlocalsocket_win.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_system_proxies
+ DEFINES
+ QT_USE_SYSTEM_PROXIES
+)
+
+qt_extend_target(Network CONDITION NOT QT_FEATURE_openssl
+ SOURCES
+ ssl/qsslcertificate_qt.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_ssl
+ SOURCES
+ ssl/qocspresponse.cpp ssl/qocspresponse.h ssl/qocspresponse_p.h
+ ssl/qsslcipher.cpp ssl/qsslcipher.h ssl/qsslcipher_p.h
+ ssl/qsslconfiguration.cpp ssl/qsslconfiguration.h ssl/qsslconfiguration_p.h
+ ssl/qssldiffiehellmanparameters.cpp ssl/qssldiffiehellmanparameters.h ssl/qssldiffiehellmanparameters_p.h
+ ssl/qsslellipticcurve.cpp ssl/qsslellipticcurve.h
+ ssl/qsslerror.cpp ssl/qsslerror.h
+ ssl/qsslkey.h ssl/qsslkey_p.cpp ssl/qsslkey_p.h
+ ssl/qsslpresharedkeyauthenticator.cpp ssl/qsslpresharedkeyauthenticator.h ssl/qsslpresharedkeyauthenticator_p.h
+ ssl/qsslsocket.cpp ssl/qsslsocket.h ssl/qsslsocket_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_ssl AND WINRT
+ SOURCES
+ ssl/qsslcertificate_winrt.cpp
+ ssl/qssldiffiehellmanparameters_dummy.cpp
+ ssl/qsslellipticcurve_dummy.cpp
+ ssl/qsslkey_qt.cpp
+ ssl/qsslkey_winrt.cpp
+ ssl/qsslsocket_winrt.cpp ssl/qsslsocket_winrt_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_schannel AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qsslcertificate_schannel.cpp
+ ssl/qssldiffiehellmanparameters_dummy.cpp
+ ssl/qsslellipticcurve_dummy.cpp
+ ssl/qsslkey_qt.cpp
+ ssl/qsslkey_schannel.cpp
+ ssl/qsslsocket_qt.cpp
+ ssl/qsslsocket_schannel.cpp ssl/qsslsocket_schannel_p.h
+ LIBRARIES
+ Crypt32
+ Secur32
+ bcrypt
+ ncrypt
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_securetransport AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qssldiffiehellmanparameters_dummy.cpp
+ ssl/qsslellipticcurve_dummy.cpp
+ ssl/qsslkey_mac.cpp
+ ssl/qsslkey_qt.cpp
+ ssl/qsslsocket_mac.cpp ssl/qsslsocket_mac_p.h
+ ssl/qsslsocket_mac_shared.cpp
+ ssl/qsslsocket_qt.cpp
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dtls AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qdtls.cpp ssl/qdtls.h ssl/qdtls_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qsslcertificate_openssl.cpp
+ ssl/qsslcontext_openssl.cpp ssl/qsslcontext_openssl_p.h
+ ssl/qssldiffiehellmanparameters_openssl.cpp
+ ssl/qsslellipticcurve_openssl.cpp
+ ssl/qsslkey_openssl.cpp
+ ssl/qsslsocket_openssl.cpp ssl/qsslsocket_openssl_p.h
+ ssl/qsslsocket_openssl_symbols.cpp ssl/qsslsocket_openssl_symbols_p.h
+ DEFINES
+ OPENSSL_API_COMPAT=0x10100000L
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dtls AND QT_FEATURE_openssl AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qdtls_openssl.cpp ssl/qdtls_openssl_p.h
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_ocsp AND QT_FEATURE_openssl AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qocsp_p.h
+)
+
+qt_extend_target(Network CONDITION APPLE AND QT_FEATURE_openssl AND QT_FEATURE_ssl
+ SOURCES
+ ssl/qsslsocket_mac_shared.cpp
+)
+
+qt_extend_target(Network CONDITION ANDROID AND QT_FEATURE_openssl AND QT_FEATURE_ssl AND NOT ANDROID_EMBEDDED
+ SOURCES
+ ssl/qsslsocket_openssl_android.cpp
+)
+
+qt_extend_target(Network CONDITION ANDROID AND QT_FEATURE_openssl AND QT_FEATURE_openssl_linked AND QT_FEATURE_ssl AND build_pass
+ LIBRARIES
+ crypto_${CMAKE_SYSTEM_PROCESSOR}
+ ssl_${CMAKE_SYSTEM_PROCESSOR}
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_openssl_linked AND QT_FEATURE_ssl AND NOT ANDROID
+ LIBRARIES
+ WrapOpenSSL::WrapOpenSSL
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND NOT QT_FEATURE_openssl_linked
+ LIBRARIES
+ WrapOpenSSLHeaders::WrapOpenSSLHeaders
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND WIN32
+ SOURCES
+ ssl/qwindowscarootfetcher.cpp ssl/qwindowscarootfetcher_p.h
+ LIBRARIES
+ crypt32
+)
+
+qt_extend_target(Network CONDITION QT_FEATURE_dnslookup AND UNIX AND NOT ANDROID AND NOT INTEGRITY
+ SOURCES
+ kernel/qdnslookup_unix.cpp
+)
+qt_add_docs(Network
+ doc/qtnetwork.qdocconf
+)
+
+qt_extend_target(Network CONDITION WIN32 PUBLIC_LIBRARIES ws2_32) # special case: mkspecs/common/msvc-desktop.conf
diff --git a/src/network/access/access.pri b/src/network/access/access.pri
index cfb20dcd71..083fbbf5fd 100644
--- a/src/network/access/access.pri
+++ b/src/network/access/access.pri
@@ -114,11 +114,4 @@ qtConfig(http) {
access/qhttpthreaddelegate_p.h \
access/qnetworkreplyhttpimpl_p.h \
access/qhttp2configuration.h
-
- qtConfig(ssl) {
- SOURCES += \
- access/qspdyprotocolhandler.cpp
- HEADERS += \
- access/qspdyprotocolhandler_p.h
- }
}
diff --git a/src/network/access/qabstractnetworkcache.h b/src/network/access/qabstractnetworkcache.h
index e357dfe58f..a4048c5b8f 100644
--- a/src/network/access/qabstractnetworkcache.h
+++ b/src/network/access/qabstractnetworkcache.h
@@ -52,7 +52,6 @@ QT_BEGIN_NAMESPACE
class QIODevice;
class QDateTime;
class QUrl;
-template<class T> class QList;
class QNetworkCacheMetaDataPrivate;
class Q_NETWORK_EXPORT QNetworkCacheMetaData
diff --git a/src/network/access/qftp.cpp b/src/network/access/qftp.cpp
index 2589c64b1c..048c272780 100644
--- a/src/network/access/qftp.cpp
+++ b/src/network/access/qftp.cpp
@@ -47,7 +47,7 @@
#include "qtcpsocket.h"
#include "qurlinfo_p.h"
#include "qstringlist.h"
-#include "qregexp.h"
+#include "qregularexpression.h"
#include "qtimer.h"
#include "qfileinfo.h"
#include "qtcpserver.h"
@@ -317,10 +317,6 @@ void QFtpDTP::connectToHost(const QString & host, quint16 port)
socket = nullptr;
}
socket = new QTcpSocket(this);
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //copy network session down to the socket
- socket->setProperty("_q_networksession", property("_q_networksession"));
-#endif
socket->setObjectName(QLatin1String("QFtpDTP Passive state socket"));
connect(socket, SIGNAL(connected()), SLOT(socketConnected()));
connect(socket, SIGNAL(readyRead()), SLOT(socketReadyRead()));
@@ -333,10 +329,6 @@ void QFtpDTP::connectToHost(const QString & host, quint16 port)
int QFtpDTP::setupListener(const QHostAddress &address)
{
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //copy network session down to the socket
- listener.setProperty("_q_networksession", property("_q_networksession"));
-#endif
if (!listener.isListening() && !listener.listen(address, 0))
return -1;
return listener.serverPort();
@@ -621,18 +613,20 @@ bool QFtpDTP::parseDir(const QByteArray &buffer, const QString &userName, QUrlIn
QString bufferStr = QString::fromUtf8(buffer).trimmed();
// Unix style FTP servers
- QRegExp unixPattern(QLatin1String("^([\\-dl])([a-zA-Z\\-]{9,9})\\s+\\d+\\s+(\\S*)\\s+"
- "(\\S*)\\s+(\\d+)\\s+(\\S+\\s+\\S+\\s+\\S+)\\s+(\\S.*)"));
- if (unixPattern.indexIn(bufferStr) == 0) {
- _q_parseUnixDir(unixPattern.capturedTexts(), userName, info);
+ QRegularExpression unixPattern(QLatin1String("^([\\-dl])([a-zA-Z\\-]{9,9})\\s+\\d+\\s+(\\S*)\\s+"
+ "(\\S*)\\s+(\\d+)\\s+(\\S+\\s+\\S+\\s+\\S+)\\s+(\\S.*)"));
+ auto unixPatternMatch = unixPattern.match(bufferStr);
+ if (unixPatternMatch.hasMatch()) {
+ _q_parseUnixDir(unixPatternMatch.capturedTexts(), userName, info);
return true;
}
// DOS style FTP servers
- QRegExp dosPattern(QLatin1String("^(\\d\\d-\\d\\d-\\d\\d\\ \\ \\d\\d:\\d\\d[AP]M)\\s+"
- "(<DIR>|\\d+)\\s+(\\S.*)$"));
- if (dosPattern.indexIn(bufferStr) == 0) {
- _q_parseDosDir(dosPattern.capturedTexts(), userName, info);
+ QRegularExpression dosPattern(QLatin1String("^(\\d\\d-\\d\\d-\\d\\d\\ \\ \\d\\d:\\d\\d[AP]M)\\s+"
+ "(<DIR>|\\d+)\\s+(\\S.*)$"));
+ auto dosPatternMatch = dosPattern.match(bufferStr);
+ if (dosPatternMatch.hasMatch()) {
+ _q_parseDosDir(dosPatternMatch.capturedTexts(), userName, info);
return true;
}
@@ -817,11 +811,6 @@ QFtpPI::QFtpPI(QObject *parent) :
void QFtpPI::connectToHost(const QString &host, quint16 port)
{
emit connectState(QFtp::HostLookup);
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //copy network session down to the socket & DTP
- commandSocket.setProperty("_q_networksession", property("_q_networksession"));
- dtp.setProperty("_q_networksession", property("_q_networksession"));
-#endif
commandSocket.connectToHost(host, port);
}
@@ -1064,14 +1053,15 @@ bool QFtpPI::processReply()
// both examples where the parenthesis are used, and where
// they are missing. We need to scan for the address and host
// info.
- QRegExp addrPortPattern(QLatin1String("(\\d+),(\\d+),(\\d+),(\\d+),(\\d+),(\\d+)"));
- if (addrPortPattern.indexIn(replyText) == -1) {
+ QRegularExpression addrPortPattern(QLatin1String("(\\d+),(\\d+),(\\d+),(\\d+),(\\d+),(\\d+)"));
+ auto addrPortMatch = addrPortPattern.match(replyText);
+ if (!addrPortMatch.hasMatch()) {
#if defined(QFTPPI_DEBUG)
qDebug("QFtp: bad 227 response -- address and port information missing");
#endif
// this error should be reported
} else {
- const QStringList lst = addrPortPattern.capturedTexts();
+ const QStringList lst = addrPortMatch.capturedTexts();
QString host = lst[1] + QLatin1Char('.') + lst[2] + QLatin1Char('.') + lst[3] + QLatin1Char('.') + lst[4];
quint16 port = (lst[5].toUInt() << 8) + lst[6].toUInt();
waitForDtpToConnect = true;
@@ -2287,10 +2277,6 @@ void QFtpPrivate::_q_startNextCommand()
c->rawCmds.clear();
_q_piFinished(QLatin1String("Proxy set to ") + proxyHost + QLatin1Char(':') + QString::number(proxyPort));
} else if (c->command == QFtp::ConnectToHost) {
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //copy network session down to the PI
- pi.setProperty("_q_networksession", q->property("_q_networksession"));
-#endif
if (!proxyHost.isEmpty()) {
host = c->rawCmds.at(0);
port = c->rawCmds.at(1).toUInt();
diff --git a/src/network/access/qhsts_p.h b/src/network/access/qhsts_p.h
index c219d9eab5..b5be4ff455 100644
--- a/src/network/access/qhsts_p.h
+++ b/src/network/access/qhsts_p.h
@@ -66,7 +66,6 @@
QT_BEGIN_NAMESPACE
-template<typename T> class QList;
template <typename T> class QVector;
class Q_AUTOTEST_EXPORT QHstsCache
diff --git a/src/network/access/qhttp2protocolhandler.cpp b/src/network/access/qhttp2protocolhandler.cpp
index 03f7261275..ac90714132 100644
--- a/src/network/access/qhttp2protocolhandler.cpp
+++ b/src/network/access/qhttp2protocolhandler.cpp
@@ -338,13 +338,13 @@ bool QHttp2ProtocolHandler::sendRequest()
// so we cannot create new streams.
m_channel->emitFinishedWithError(QNetworkReply::ProtocolUnknownError,
"GOAWAY received, cannot start a request");
- m_channel->spdyRequestsToSend.clear();
+ m_channel->h2RequestsToSend.clear();
return false;
}
// Process 'fake' (created by QNetworkAccessManager::connectToHostEncrypted())
// requests first:
- auto &requests = m_channel->spdyRequestsToSend;
+ auto &requests = m_channel->h2RequestsToSend;
for (auto it = requests.begin(), endIt = requests.end(); it != endIt;) {
const auto &pair = *it;
const QString scheme(pair.first.url().scheme());
@@ -868,7 +868,7 @@ void QHttp2ProtocolHandler::handleGOAWAY()
m_channel->emitFinishedWithError(QNetworkReply::ProtocolUnknownError,
"GOAWAY received, cannot start a request");
// Also, prevent further calls to sendRequest:
- m_channel->spdyRequestsToSend.clear();
+ m_channel->h2RequestsToSend.clear();
QNetworkReply::NetworkError error = QNetworkReply::NoError;
QString message;
@@ -1287,7 +1287,7 @@ quint32 QHttp2ProtocolHandler::createNewStream(const HttpMessagePair &message, b
const auto replyPrivate = reply->d_func();
replyPrivate->connection = m_connection;
replyPrivate->connectionChannel = m_channel;
- reply->setSpdyWasUsed(true);
+ reply->setHttp2WasUsed(true);
streamIDs.insert(reply, newStreamID);
connect(reply, SIGNAL(destroyed(QObject*)),
this, SLOT(_q_replyDestroyed(QObject*)));
@@ -1393,7 +1393,7 @@ void QHttp2ProtocolHandler::deleteActiveStream(quint32 streamID)
}
removeFromSuspended(streamID);
- if (m_channel->spdyRequestsToSend.size())
+ if (m_channel->h2RequestsToSend.size())
QMetaObject::invokeMethod(this, "sendRequest", Qt::QueuedConnection);
}
@@ -1512,7 +1512,7 @@ void QHttp2ProtocolHandler::initReplyFromPushPromise(const HttpMessagePair &mess
Q_ASSERT(promisedData.contains(cacheKey));
auto promise = promisedData.take(cacheKey);
Q_ASSERT(message.second);
- message.second->setSpdyWasUsed(true);
+ message.second->setHttp2WasUsed(true);
qCDebug(QT_HTTP2) << "found cached/promised response on stream" << promise.reservedID;
diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp
index fce01bf349..f916ee2981 100644
--- a/src/network/access/qhttpnetworkconnection.cpp
+++ b/src/network/access/qhttpnetworkconnection.cpp
@@ -82,9 +82,6 @@ QHttpNetworkConnectionPrivate::QHttpNetworkConnectionPrivate(const QString &host
hostName(hostName), port(port), encrypt(encrypt), delayIpv4(true)
, activeChannelCount(type == QHttpNetworkConnection::ConnectionTypeHTTP2
|| type == QHttpNetworkConnection::ConnectionTypeHTTP2Direct
-#ifndef QT_NO_SSL
- || type == QHttpNetworkConnection::ConnectionTypeSPDY
-#endif
? 1 : defaultHttpChannelCount)
, channelCount(defaultHttpChannelCount)
#ifndef QT_NO_NETWORKPROXY
@@ -93,9 +90,9 @@ QHttpNetworkConnectionPrivate::QHttpNetworkConnectionPrivate(const QString &host
, preConnectRequests(0)
, connectionType(type)
{
- // We allocate all 6 channels even if it's SPDY or HTTP/2 enabled
- // connection: in case the protocol negotiation via NPN/ALPN fails,
- // we will have normally working HTTP/1.1.
+ // We allocate all 6 channels even if it's HTTP/2 enabled connection:
+ // in case the protocol negotiation via NPN/ALPN fails, we will have
+ // normally working HTTP/1.1.
Q_ASSERT(channelCount >= activeChannelCount);
channels = new QHttpNetworkConnectionChannel[channelCount];
}
@@ -135,10 +132,6 @@ void QHttpNetworkConnectionPrivate::init()
for (int i = 0; i < channelCount; i++) {
channels[i].setConnection(this->q_func());
channels[i].ssl = encrypt;
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //push session down to channels
- channels[i].networkSession = networkSession;
-#endif
}
delayedConnectionTimer.setSingleShot(true);
@@ -641,10 +634,10 @@ QHttpNetworkReply* QHttpNetworkConnectionPrivate::queueRequest(const QHttpNetwor
break;
}
}
- else { // SPDY, HTTP/2 ('h2' mode)
+ else { // HTTP/2 ('h2' mode)
if (!pair.second->d_func()->requestIsPrepared)
prepareRequest(pair);
- channels[0].spdyRequestsToSend.insert(request.priority(), pair);
+ channels[0].h2RequestsToSend.insert(request.priority(), pair);
}
#ifndef Q_OS_WINRT
@@ -680,7 +673,7 @@ void QHttpNetworkConnectionPrivate::fillHttp2Queue()
for (auto &pair : highPriorityQueue) {
if (!pair.second->d_func()->requestIsPrepared)
prepareRequest(pair);
- channels[0].spdyRequestsToSend.insert(QHttpNetworkRequest::HighPriority, pair);
+ channels[0].h2RequestsToSend.insert(QHttpNetworkRequest::HighPriority, pair);
}
highPriorityQueue.clear();
@@ -688,7 +681,7 @@ void QHttpNetworkConnectionPrivate::fillHttp2Queue()
for (auto &pair : lowPriorityQueue) {
if (!pair.second->d_func()->requestIsPrepared)
prepareRequest(pair);
- channels[0].spdyRequestsToSend.insert(pair.first.priority(), pair);
+ channels[0].h2RequestsToSend.insert(pair.first.priority(), pair);
}
lowPriorityQueue.clear();
@@ -984,12 +977,12 @@ void QHttpNetworkConnectionPrivate::removeReply(QHttpNetworkReply *reply)
}
}
#ifndef QT_NO_SSL
- // is the reply inside the SPDY pipeline of this channel already?
- QMultiMap<int, HttpMessagePair>::iterator it = channels[i].spdyRequestsToSend.begin();
- QMultiMap<int, HttpMessagePair>::iterator end = channels[i].spdyRequestsToSend.end();
+ // is the reply inside the H2 pipeline of this channel already?
+ QMultiMap<int, HttpMessagePair>::iterator it = channels[i].h2RequestsToSend.begin();
+ QMultiMap<int, HttpMessagePair>::iterator end = channels[i].h2RequestsToSend.end();
for (; it != end; ++it) {
if (it.value().second == reply) {
- channels[i].spdyRequestsToSend.remove(it.key());
+ channels[i].h2RequestsToSend.remove(it.key());
QMetaObject::invokeMethod(q, "_q_startNextRequest", Qt::QueuedConnection);
return;
@@ -1068,9 +1061,8 @@ void QHttpNetworkConnectionPrivate::_q_startNextRequest()
break;
}
case QHttpNetworkConnection::ConnectionTypeHTTP2Direct:
- case QHttpNetworkConnection::ConnectionTypeHTTP2:
- case QHttpNetworkConnection::ConnectionTypeSPDY: {
- if (channels[0].spdyRequestsToSend.isEmpty() && channels[0].switchedToHttp2)
+ case QHttpNetworkConnection::ConnectionTypeHTTP2: {
+ if (channels[0].h2RequestsToSend.isEmpty() && channels[0].switchedToHttp2)
return;
if (networkLayerState == IPv4)
@@ -1079,7 +1071,7 @@ void QHttpNetworkConnectionPrivate::_q_startNextRequest()
channels[0].networkLayerPreference = QAbstractSocket::IPv6Protocol;
channels[0].ensureConnection();
if (channels[0].socket && channels[0].socket->state() == QAbstractSocket::ConnectedState
- && !channels[0].pendingEncrypt && channels[0].spdyRequestsToSend.size())
+ && !channels[0].pendingEncrypt && channels[0].h2RequestsToSend.size())
channels[0].sendRequest();
break;
}
@@ -1234,19 +1226,18 @@ void QHttpNetworkConnectionPrivate::_q_hostLookupFinished(const QHostInfo &info)
if (dequeueRequest(channels[0].socket)) {
emitReplyError(channels[0].socket, channels[0].reply, QNetworkReply::HostNotFoundError);
networkLayerState = QHttpNetworkConnectionPrivate::Unknown;
- } else if (connectionType == QHttpNetworkConnection::ConnectionTypeSPDY
- || connectionType == QHttpNetworkConnection::ConnectionTypeHTTP2
+ } else if (connectionType == QHttpNetworkConnection::ConnectionTypeHTTP2
|| connectionType == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
- for (const HttpMessagePair &spdyPair : qAsConst(channels[0].spdyRequestsToSend)) {
+ for (const HttpMessagePair &h2Pair : qAsConst(channels[0].h2RequestsToSend)) {
// emit error for all replies
- QHttpNetworkReply *currentReply = spdyPair.second;
+ QHttpNetworkReply *currentReply = h2Pair.second;
Q_ASSERT(currentReply);
emitReplyError(channels[0].socket, currentReply, QNetworkReply::HostNotFoundError);
}
} else {
// Should not happen: we start a host lookup before sending a request,
- // so it's natural to have requests either in SPDY/HTTP/2 queue,
- // or in low/high priority queues.
+ // so it's natural to have requests either in HTTP/2 queue, or in low/high
+ // priority queues.
qWarning("QHttpNetworkConnectionPrivate::_q_hostLookupFinished"
" could not de-queue request, failed to report HostNotFoundError");
networkLayerState = QHttpNetworkConnectionPrivate::Unknown;
@@ -1272,19 +1263,6 @@ void QHttpNetworkConnectionPrivate::startNetworkLayerStateLookup()
channels[1].networkLayerPreference = QAbstractSocket::IPv6Protocol;
int timeout = 300;
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- if (networkSession) {
- const QNetworkConfiguration::BearerType bearerType = networkSession->configuration().bearerType();
- if (bearerType == QNetworkConfiguration::Bearer2G)
- timeout = 800;
- else if (bearerType == QNetworkConfiguration::BearerCDMA2000)
- timeout = 500;
- else if (bearerType == QNetworkConfiguration::BearerWCDMA)
- timeout = 500;
- else if (bearerType == QNetworkConfiguration::BearerHSPA)
- timeout = 400;
- }
-#endif
delayedConnectionTimer.start(timeout);
if (delayIpv4)
channels[1].ensureConnection();
@@ -1314,37 +1292,6 @@ void QHttpNetworkConnectionPrivate::_q_connectDelayedChannel()
channels[1].ensureConnection();
}
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
-QHttpNetworkConnection::QHttpNetworkConnection(const QString &hostName, quint16 port, bool encrypt,
- QHttpNetworkConnection::ConnectionType connectionType,
- QObject *parent, QSharedPointer<QNetworkSession> networkSession)
- : QObject(*(new QHttpNetworkConnectionPrivate(hostName, port, encrypt, connectionType)), parent)
-{
- Q_D(QHttpNetworkConnection);
- d->networkSession = std::move(networkSession);
- d->init();
- if (QNetworkStatusMonitor::isEnabled()) {
- connect(&d->connectionMonitor, &QNetworkConnectionMonitor::reachabilityChanged,
- this, &QHttpNetworkConnection::onlineStateChanged, Qt::QueuedConnection);
- }
-}
-
-QHttpNetworkConnection::QHttpNetworkConnection(quint16 connectionCount, const QString &hostName,
- quint16 port, bool encrypt, QObject *parent,
- QSharedPointer<QNetworkSession> networkSession,
- QHttpNetworkConnection::ConnectionType connectionType)
- : QObject(*(new QHttpNetworkConnectionPrivate(connectionCount, hostName, port, encrypt,
- connectionType)), parent)
-{
- Q_D(QHttpNetworkConnection);
- d->networkSession = std::move(networkSession);
- d->init();
- if (QNetworkStatusMonitor::isEnabled()) {
- connect(&d->connectionMonitor, &QNetworkConnectionMonitor::reachabilityChanged,
- this, &QHttpNetworkConnection::onlineStateChanged, Qt::QueuedConnection);
- }
-}
-#else
QHttpNetworkConnection::QHttpNetworkConnection(const QString &hostName, quint16 port, bool encrypt,
QHttpNetworkConnection::ConnectionType connectionType, QObject *parent)
: QObject(*(new QHttpNetworkConnectionPrivate(hostName, port, encrypt , connectionType)), parent)
@@ -1370,7 +1317,6 @@ QHttpNetworkConnection::QHttpNetworkConnection(quint16 connectionCount, const QS
this, &QHttpNetworkConnection::onlineStateChanged, Qt::QueuedConnection);
}
}
-#endif // QT_NO_BEARERMANAGEMENT
QHttpNetworkConnection::~QHttpNetworkConnection()
{
@@ -1576,17 +1522,12 @@ void QHttpNetworkConnectionPrivate::emitProxyAuthenticationRequired(const QHttpN
pauseConnection();
QHttpNetworkReply *reply;
if (connectionType == QHttpNetworkConnection::ConnectionTypeHTTP2
- || connectionType == QHttpNetworkConnection::ConnectionTypeHTTP2Direct
-#if QT_CONFIG(ssl)
- || connectionType == QHttpNetworkConnection::ConnectionTypeSPDY
-#endif
- ) {
-
+ || connectionType == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
// we choose the reply to emit the proxyAuth signal from somewhat arbitrarily,
// but that does not matter because the signal will ultimately be emitted
// by the QNetworkAccessManager.
- Q_ASSERT(chan->spdyRequestsToSend.count() > 0);
- reply = chan->spdyRequestsToSend.cbegin().value().second;
+ Q_ASSERT(chan->h2RequestsToSend.count() > 0);
+ reply = chan->h2RequestsToSend.cbegin().value().second;
} else { // HTTP
reply = chan->reply;
}
diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h
index 845b55bc5d..7aecbba2a4 100644
--- a/src/network/access/qhttpnetworkconnection_p.h
+++ b/src/network/access/qhttpnetworkconnection_p.h
@@ -55,7 +55,6 @@
#include <QtNetwork/qnetworkrequest.h>
#include <QtNetwork/qnetworkreply.h>
#include <QtNetwork/qabstractsocket.h>
-#include <QtNetwork/qnetworksession.h>
#include <qhttp2configuration.h>
@@ -96,28 +95,16 @@ public:
enum ConnectionType {
ConnectionTypeHTTP,
- ConnectionTypeSPDY,
ConnectionTypeHTTP2,
ConnectionTypeHTTP2Direct
};
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- explicit QHttpNetworkConnection(const QString &hostName, quint16 port = 80, bool encrypt = false,
- ConnectionType connectionType = ConnectionTypeHTTP,
- QObject *parent = nullptr, QSharedPointer<QNetworkSession> networkSession
- = QSharedPointer<QNetworkSession>());
- QHttpNetworkConnection(quint16 channelCount, const QString &hostName, quint16 port = 80,
- bool encrypt = false, QObject *parent = nullptr,
- QSharedPointer<QNetworkSession> networkSession = QSharedPointer<QNetworkSession>(),
- ConnectionType connectionType = ConnectionTypeHTTP);
-#else
explicit QHttpNetworkConnection(const QString &hostName, quint16 port = 80, bool encrypt = false,
ConnectionType connectionType = ConnectionTypeHTTP,
QObject *parent = 0);
QHttpNetworkConnection(quint16 channelCount, const QString &hostName, quint16 port = 80,
bool encrypt = false, QObject *parent = 0,
ConnectionType connectionType = ConnectionTypeHTTP);
-#endif
~QHttpNetworkConnection();
//The hostname to which this is connected to.
@@ -172,7 +159,6 @@ private:
friend class QHttpNetworkConnectionChannel;
friend class QHttp2ProtocolHandler;
friend class QHttpProtocolHandler;
- friend class QSpdyProtocolHandler;
Q_PRIVATE_SLOT(d_func(), void _q_startNextRequest())
Q_PRIVATE_SLOT(d_func(), void _q_hostLookupFinished(QHostInfo))
@@ -292,10 +278,6 @@ public:
QSharedPointer<QSslContext> sslContext;
#endif
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- QSharedPointer<QNetworkSession> networkSession;
-#endif
-
QHttp2Configuration http2Parameters;
QString peerVerifyName;
diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp
index 95850efe36..ba05e75794 100644
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp
@@ -48,7 +48,6 @@
#include <private/qhttp2protocolhandler_p.h>
#include <private/qhttpprotocolhandler_p.h>
-#include <private/qspdyprotocolhandler_p.h>
#include <private/http2protocol_p.h>
#ifndef QT_NO_SSL
@@ -57,10 +56,6 @@
# include <QtNetwork/qsslcipher.h>
#endif
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
-#include "private/qnetworksession_p.h"
-#endif
-
#include "private/qnetconmonitor_p.h"
QT_BEGIN_NAMESPACE
@@ -124,11 +119,6 @@ void QHttpNetworkConnectionChannel::init()
#else
socket = new QTcpSocket;
#endif
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //push session down to socket
- if (networkSession)
- socket->setProperty("_q_networksession", QVariant::fromValue(networkSession));
-#endif
#ifndef QT_NO_NETWORKPROXY
// Set by QNAM anyway, but let's be safe here
socket->setProxy(QNetworkProxy::NoProxy);
@@ -934,7 +924,7 @@ void QHttpNetworkConnectionChannel::_q_connected()
} else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
state = QHttpNetworkConnectionChannel::IdleState;
protocolHandler.reset(new QHttp2ProtocolHandler(this));
- if (spdyRequestsToSend.count() > 0) {
+ if (h2RequestsToSend.count() > 0) {
// In case our peer has sent us its settings (window size, max concurrent streams etc.)
// let's give _q_receiveReply a chance to read them first ('invokeMethod', QueuedConnection).
QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);
@@ -1112,15 +1102,11 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket
|| !connection->d_func()->lowPriorityQueue.isEmpty());
if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
- || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct
-#ifndef QT_NO_SSL
- || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeSPDY
-#endif
- ) {
- QList<HttpMessagePair> spdyPairs = spdyRequestsToSend.values();
- for (int a = 0; a < spdyPairs.count(); ++a) {
+ || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
+ QList<HttpMessagePair> h2Pairs = h2RequestsToSend.values();
+ for (int a = 0; a < h2Pairs.count(); ++a) {
// emit error for all replies
- QHttpNetworkReply *currentReply = spdyPairs.at(a).second;
+ QHttpNetworkReply *currentReply = h2Pairs.at(a).second;
Q_ASSERT(currentReply);
emit currentReply->finishedWithError(errorCode, errorString);
}
@@ -1147,12 +1133,8 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket
void QHttpNetworkConnectionChannel::_q_proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator* auth)
{
if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
- || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct
-#ifndef QT_NO_SSL
- || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeSPDY
-#endif
- ) {
- if (spdyRequestsToSend.count() > 0)
+ || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
+ if (h2RequestsToSend.count() > 0)
connection->d_func()->emitProxyAuthenticationRequired(this, proxy, auth);
} else { // HTTP
// Need to dequeue the request before we can emit the error.
@@ -1175,9 +1157,9 @@ void QHttpNetworkConnectionChannel::emitFinishedWithError(QNetworkReply::Network
{
if (reply)
emit reply->finishedWithError(error, QHttpNetworkConnectionChannel::tr(message));
- QList<HttpMessagePair> spdyPairs = spdyRequestsToSend.values();
- for (int a = 0; a < spdyPairs.count(); ++a) {
- QHttpNetworkReply *currentReply = spdyPairs.at(a).second;
+ QList<HttpMessagePair> h2Pairs = h2RequestsToSend.values();
+ for (int a = 0; a < h2Pairs.count(); ++a) {
+ QHttpNetworkReply *currentReply = h2Pairs.at(a).second;
Q_ASSERT(currentReply);
emit currentReply->finishedWithError(error, QHttpNetworkConnectionChannel::tr(message));
}
@@ -1199,12 +1181,6 @@ void QHttpNetworkConnectionChannel::_q_encrypted()
QByteArray nextProtocol = sslSocket->sslConfiguration().nextNegotiatedProtocol();
if (nextProtocol == QSslConfiguration::NextProtocolHttp1_1) {
// fall through to create a QHttpProtocolHandler
- } else if (nextProtocol == QSslConfiguration::NextProtocolSpdy3_0) {
- protocolHandler.reset(new QSpdyProtocolHandler(this));
- connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeSPDY);
- // no need to re-queue requests, if SPDY was enabled on the request it
- // has gone to the SPDY queue already
- break;
} else if (nextProtocol == QSslConfiguration::ALPNProtocolHTTP2) {
switchedToHttp2 = true;
protocolHandler.reset(new QHttp2ProtocolHandler(this));
@@ -1233,8 +1209,6 @@ void QHttpNetworkConnectionChannel::_q_encrypted()
// it again on other channels that our connection can create/open.
if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2)
protocols.removeAll(QSslConfiguration::ALPNProtocolHTTP2);
- else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeSPDY)
- protocols.removeAll(QSslConfiguration::NextProtocolSpdy3_0);
if (nProtocols > protocols.size()) {
sslConfiguration->setAllowedNextProtocols(protocols);
@@ -1244,13 +1218,13 @@ void QHttpNetworkConnectionChannel::_q_encrypted()
}
connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP);
- // We use only one channel for SPDY or HTTP/2, but normally six for
+ // We use only one channel for HTTP/2, but normally six for
// HTTP/1.1 - let's restore this number to the reserved number of
// channels:
if (connection->d_func()->activeChannelCount < connection->d_func()->channelCount) {
connection->d_func()->activeChannelCount = connection->d_func()->channelCount;
- // re-queue requests from SPDY queue to HTTP queue, if any
- requeueSpdyRequests();
+ // re-queue requests from HTTP/2 queue to HTTP queue, if any
+ requeueHttp2Requests();
}
break;
}
@@ -1270,11 +1244,9 @@ void QHttpNetworkConnectionChannel::_q_encrypted()
state = QHttpNetworkConnectionChannel::IdleState;
pendingEncrypt = false;
- if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeSPDY ||
- connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2 ||
+ if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2 ||
connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
- // we call setSpdyWasUsed(true) on the replies in the SPDY handler when the request is sent
- if (spdyRequestsToSend.count() > 0) {
+ if (h2RequestsToSend.count() > 0) {
// In case our peer has sent us its settings (window size, max concurrent streams etc.)
// let's give _q_receiveReply a chance to read them first ('invokeMethod', QueuedConnection).
QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);
@@ -1283,7 +1255,7 @@ void QHttpNetworkConnectionChannel::_q_encrypted()
if (!reply)
connection->d_func()->dequeueRequest(socket);
if (reply) {
- reply->setSpdyWasUsed(false);
+ reply->setHttp2WasUsed(false);
Q_ASSERT(reply->d_func()->connectionChannel == this);
emit reply->encrypted();
}
@@ -1292,13 +1264,12 @@ void QHttpNetworkConnectionChannel::_q_encrypted()
}
}
-void QHttpNetworkConnectionChannel::requeueSpdyRequests()
+void QHttpNetworkConnectionChannel::requeueHttp2Requests()
{
- QList<HttpMessagePair> spdyPairs = spdyRequestsToSend.values();
- for (int a = 0; a < spdyPairs.count(); ++a) {
- connection->d_func()->requeueRequest(spdyPairs.at(a));
- }
- spdyRequestsToSend.clear();
+ QList<HttpMessagePair> h2Pairs = h2RequestsToSend.values();
+ for (int a = 0; a < h2Pairs.count(); ++a)
+ connection->d_func()->requeueRequest(h2Pairs.at(a));
+ h2RequestsToSend.clear();
}
void QHttpNetworkConnectionChannel::_q_sslErrors(const QList<QSslError> &errors)
@@ -1316,11 +1287,11 @@ void QHttpNetworkConnectionChannel::_q_sslErrors(const QList<QSslError> &errors)
emit reply->sslErrors(errors);
}
#ifndef QT_NO_SSL
- else { // SPDY
- QList<HttpMessagePair> spdyPairs = spdyRequestsToSend.values();
- for (int a = 0; a < spdyPairs.count(); ++a) {
+ else { // HTTP/2
+ QList<HttpMessagePair> h2Pairs = h2RequestsToSend.values();
+ for (int a = 0; a < h2Pairs.count(); ++a) {
// emit SSL errors for all replies
- QHttpNetworkReply *currentReply = spdyPairs.at(a).second;
+ QHttpNetworkReply *currentReply = h2Pairs.at(a).second;
Q_ASSERT(currentReply);
emit currentReply->sslErrors(errors);
}
@@ -1340,10 +1311,10 @@ void QHttpNetworkConnectionChannel::_q_preSharedKeyAuthenticationRequired(QSslPr
if (reply)
emit reply->preSharedKeyAuthenticationRequired(authenticator);
} else {
- QList<HttpMessagePair> spdyPairs = spdyRequestsToSend.values();
- for (int a = 0; a < spdyPairs.count(); ++a) {
+ QList<HttpMessagePair> h2Pairs = h2RequestsToSend.values();
+ for (int a = 0; a < h2Pairs.count(); ++a) {
// emit SSL errors for all replies
- QHttpNetworkReply *currentReply = spdyPairs.at(a).second;
+ QHttpNetworkReply *currentReply = h2Pairs.at(a).second;
Q_ASSERT(currentReply);
emit currentReply->preSharedKeyAuthenticationRequired(authenticator);
}
diff --git a/src/network/access/qhttpnetworkconnectionchannel_p.h b/src/network/access/qhttpnetworkconnectionchannel_p.h
index d8ac3979d1..a0f25a6430 100644
--- a/src/network/access/qhttpnetworkconnectionchannel_p.h
+++ b/src/network/access/qhttpnetworkconnectionchannel_p.h
@@ -123,10 +123,7 @@ public:
bool authenticationCredentialsSent;
bool proxyCredentialsSent;
QScopedPointer<QAbstractProtocolHandler> protocolHandler;
- // SPDY or HTTP/2 requests; SPDY is TLS-only, but
- // HTTP/2 can be cleartext also, that's why it's
- // outside of QT_NO_SSL section. Sorted by priority:
- QMultiMap<int, HttpMessagePair> spdyRequestsToSend;
+ QMultiMap<int, HttpMessagePair> h2RequestsToSend;
bool switchedToHttp2 = false;
#ifndef QT_NO_SSL
bool ignoreAllSslErrors;
@@ -135,13 +132,10 @@ public:
void ignoreSslErrors();
void ignoreSslErrors(const QList<QSslError> &errors);
void setSslConfiguration(const QSslConfiguration &config);
- void requeueSpdyRequests(); // when we wanted SPDY but got HTTP
+ void requeueHttp2Requests(); // when we wanted HTTP/2 but got HTTP/1.1
#endif
// to emit the signal for all in-flight replies:
void emitFinishedWithError(QNetworkReply::NetworkError error, const char *message);
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- QSharedPointer<QNetworkSession> networkSession;
-#endif
// HTTP pipelining -> http://en.wikipedia.org/wiki/Http_pipelining
enum PipeliningSupport {
diff --git a/src/network/access/qhttpnetworkreply.cpp b/src/network/access/qhttpnetworkreply.cpp
index 2024c0fefb..66a431c5f9 100644
--- a/src/network/access/qhttpnetworkreply.cpp
+++ b/src/network/access/qhttpnetworkreply.cpp
@@ -292,14 +292,14 @@ bool QHttpNetworkReply::isPipeliningUsed() const
return d_func()->pipeliningUsed;
}
-bool QHttpNetworkReply::isSpdyUsed() const
+bool QHttpNetworkReply::isHttp2Used() const
{
- return d_func()->spdyUsed;
+ return d_func()->h2Used;
}
-void QHttpNetworkReply::setSpdyWasUsed(bool spdy)
+void QHttpNetworkReply::setHttp2WasUsed(bool h2)
{
- d_func()->spdyUsed = spdy;
+ d_func()->h2Used = h2;
}
qint64 QHttpNetworkReply::removedContentLength() const
@@ -329,15 +329,11 @@ QHttpNetworkReplyPrivate::QHttpNetworkReplyPrivate(const QUrl &newUrl)
forceConnectionCloseEnabled(false),
lastChunkRead(false),
currentChunkSize(0), currentChunkRead(0), readBufferMaxSize(0),
- windowSizeDownload(65536), // 64K initial window size according to SPDY standard
- windowSizeUpload(65536), // 64K initial window size according to SPDY standard
- currentlyReceivedDataInWindow(0),
- currentlyUploadedDataInWindow(0),
totallyUploadedData(0),
removedContentLength(-1),
connection(nullptr),
autoDecompress(false), responseData(), requestIsPrepared(false)
- ,pipeliningUsed(false), spdyUsed(false), downstreamLimited(false)
+ ,pipeliningUsed(false), h2Used(false), downstreamLimited(false)
,userProvidedDownloadBuffer(nullptr)
#ifndef QT_NO_COMPRESS
,inflateStrm(nullptr)
@@ -994,7 +990,6 @@ bool QHttpNetworkReplyPrivate::expectContent()
void QHttpNetworkReplyPrivate::eraseData()
{
- compressedData.clear();
responseData.clear();
}
diff --git a/src/network/access/qhttpnetworkreply_p.h b/src/network/access/qhttpnetworkreply_p.h
index 9c03a403e1..59010606b9 100644
--- a/src/network/access/qhttpnetworkreply_p.h
+++ b/src/network/access/qhttpnetworkreply_p.h
@@ -139,8 +139,8 @@ public:
bool isFinished() const;
bool isPipeliningUsed() const;
- bool isSpdyUsed() const;
- void setSpdyWasUsed(bool spdy);
+ bool isHttp2Used() const;
+ void setHttp2WasUsed(bool h2Used);
qint64 removedContentLength() const;
bool isRedirecting() const;
@@ -253,11 +253,7 @@ public:
qint64 currentChunkSize;
qint64 currentChunkRead;
qint64 readBufferMaxSize;
- qint32 windowSizeDownload; // only for SPDY
- qint32 windowSizeUpload; // only for SPDY
- qint32 currentlyReceivedDataInWindow; // only for SPDY
- qint32 currentlyUploadedDataInWindow; // only for SPDY
- qint64 totallyUploadedData; // only for SPDY
+ qint64 totallyUploadedData; // HTTP/2
qint64 removedContentLength;
QPointer<QHttpNetworkConnection> connection;
QPointer<QHttpNetworkConnectionChannel> connectionChannel;
@@ -266,11 +262,10 @@ public:
bool autoDecompress;
QByteDataBuffer responseData; // uncompressed body
- QByteArray compressedData; // compressed body (temporary)
bool requestIsPrepared;
bool pipeliningUsed;
- bool spdyUsed;
+ bool h2Used;
bool downstreamLimited;
char* userProvidedDownloadBuffer;
diff --git a/src/network/access/qhttpnetworkrequest.cpp b/src/network/access/qhttpnetworkrequest.cpp
index 5fb8885bdf..0b03e6e69e 100644
--- a/src/network/access/qhttpnetworkrequest.cpp
+++ b/src/network/access/qhttpnetworkrequest.cpp
@@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE
QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(QHttpNetworkRequest::Operation op,
QHttpNetworkRequest::Priority pri, const QUrl &newUrl)
: QHttpNetworkHeaderPrivate(newUrl), operation(op), priority(pri), uploadByteDevice(nullptr),
- autoDecompress(false), pipeliningAllowed(false), spdyAllowed(false), http2Allowed(false),
+ autoDecompress(false), pipeliningAllowed(false), http2Allowed(false),
http2Direct(false), withCredentials(true), preConnect(false), redirectCount(0),
redirectPolicy(QNetworkRequest::ManualRedirectPolicy)
{
@@ -59,7 +59,6 @@ QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(const QHttpNetworkRequest
uploadByteDevice(other.uploadByteDevice),
autoDecompress(other.autoDecompress),
pipeliningAllowed(other.pipeliningAllowed),
- spdyAllowed(other.spdyAllowed),
http2Allowed(other.http2Allowed),
http2Direct(other.http2Direct),
withCredentials(other.withCredentials),
@@ -83,7 +82,6 @@ bool QHttpNetworkRequestPrivate::operator==(const QHttpNetworkRequestPrivate &ot
&& (uploadByteDevice == other.uploadByteDevice)
&& (autoDecompress == other.autoDecompress)
&& (pipeliningAllowed == other.pipeliningAllowed)
- && (spdyAllowed == other.spdyAllowed)
&& (http2Allowed == other.http2Allowed)
&& (http2Direct == other.http2Direct)
// we do not clear the customVerb in setOperation
@@ -339,16 +337,6 @@ void QHttpNetworkRequest::setPipeliningAllowed(bool b)
d->pipeliningAllowed = b;
}
-bool QHttpNetworkRequest::isSPDYAllowed() const
-{
- return d->spdyAllowed;
-}
-
-void QHttpNetworkRequest::setSPDYAllowed(bool b)
-{
- d->spdyAllowed = b;
-}
-
bool QHttpNetworkRequest::isHTTP2Allowed() const
{
return d->http2Allowed;
diff --git a/src/network/access/qhttpnetworkrequest_p.h b/src/network/access/qhttpnetworkrequest_p.h
index fb4896195b..f263e348ef 100644
--- a/src/network/access/qhttpnetworkrequest_p.h
+++ b/src/network/access/qhttpnetworkrequest_p.h
@@ -116,9 +116,6 @@ public:
bool isPipeliningAllowed() const;
void setPipeliningAllowed(bool b);
- bool isSPDYAllowed() const;
- void setSPDYAllowed(bool b);
-
bool isHTTP2Allowed() const;
void setHTTP2Allowed(bool b);
@@ -176,7 +173,6 @@ public:
mutable QNonContiguousByteDevice* uploadByteDevice;
bool autoDecompress;
bool pipeliningAllowed;
- bool spdyAllowed;
bool http2Allowed;
bool http2Direct;
bool withCredentials;
diff --git a/src/network/access/qhttpthreaddelegate.cpp b/src/network/access/qhttpthreaddelegate.cpp
index dcc8c9337e..30403b1848 100644
--- a/src/network/access/qhttpthreaddelegate.cpp
+++ b/src/network/access/qhttpthreaddelegate.cpp
@@ -181,17 +181,9 @@ class QNetworkAccessCachedHttpConnection: public QHttpNetworkConnection,
{
// Q_OBJECT
public:
-#ifdef QT_NO_BEARERMANAGEMENT
QNetworkAccessCachedHttpConnection(const QString &hostName, quint16 port, bool encrypt,
QHttpNetworkConnection::ConnectionType connectionType)
: QHttpNetworkConnection(hostName, port, encrypt, connectionType)
-#else // ### Qt6: Remove section
- QNetworkAccessCachedHttpConnection(const QString &hostName, quint16 port, bool encrypt,
- QHttpNetworkConnection::ConnectionType connectionType,
- QSharedPointer<QNetworkSession> networkSession)
- : QHttpNetworkConnection(hostName, port, encrypt, connectionType, /*parent=*/nullptr,
- std::move(networkSession))
-#endif
{
setExpires(true);
setShareable(true);
@@ -236,7 +228,7 @@ QHttpThreadDelegate::QHttpThreadDelegate(QObject *parent) :
, synchronous(false)
, incomingStatusCode(0)
, isPipeliningUsed(false)
- , isSpdyUsed(false)
+ , isHttp2Used(false)
, incomingContentLength(-1)
, removedContentLength(-1)
, incomingErrorCode(QNetworkReply::NoError)
@@ -320,17 +312,6 @@ void QHttpThreadDelegate::startRequest()
}
}
-#ifndef QT_NO_SSL
- if (!isH2 && httpRequest.isSPDYAllowed() && ssl) {
- connectionType = QHttpNetworkConnection::ConnectionTypeSPDY;
- urlCopy.setScheme(QStringLiteral("spdy")); // to differentiate SPDY requests from HTTPS requests
- QList<QByteArray> nextProtocols;
- nextProtocols << QSslConfiguration::NextProtocolSpdy3_0
- << QSslConfiguration::NextProtocolHttp1_1;
- incomingSslConfiguration->setAllowedNextProtocols(nextProtocols);
- }
-#endif // QT_NO_SSL
-
#ifndef QT_NO_NETWORKPROXY
if (transparentProxy.type() != QNetworkProxy::NoProxy)
cacheKey = makeCacheKey(urlCopy, &transparentProxy, httpRequest.peerVerifyName());
@@ -345,14 +326,8 @@ void QHttpThreadDelegate::startRequest()
if (!httpConnection) {
// no entry in cache; create an object
// the http object is actually a QHttpNetworkConnection
-#ifdef QT_NO_BEARERMANAGEMENT
httpConnection = new QNetworkAccessCachedHttpConnection(urlCopy.host(), urlCopy.port(), ssl,
connectionType);
-#else // ### Qt6: Remove section
- httpConnection = new QNetworkAccessCachedHttpConnection(urlCopy.host(), urlCopy.port(), ssl,
- connectionType,
- networkSession);
-#endif // QT_NO_BEARERMANAGEMENT
if (connectionType == QHttpNetworkConnection::ConnectionTypeHTTP2
|| connectionType == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
httpConnection->setHttp2Parameters(http2Parameters);
@@ -658,7 +633,7 @@ void QHttpThreadDelegate::headerChangedSlot()
isPipeliningUsed = httpReply->isPipeliningUsed();
incomingContentLength = httpReply->contentLength();
removedContentLength = httpReply->removedContentLength();
- isSpdyUsed = httpReply->isSpdyUsed();
+ isHttp2Used = httpReply->isHttp2Used();
emit downloadMetaData(incomingHeaders,
incomingStatusCode,
@@ -667,7 +642,7 @@ void QHttpThreadDelegate::headerChangedSlot()
downloadBuffer,
incomingContentLength,
removedContentLength,
- isSpdyUsed);
+ isHttp2Used);
}
void QHttpThreadDelegate::synchronousHeaderChangedSlot()
@@ -683,7 +658,7 @@ void QHttpThreadDelegate::synchronousHeaderChangedSlot()
incomingStatusCode = httpReply->statusCode();
incomingReasonPhrase = httpReply->reasonPhrase();
isPipeliningUsed = httpReply->isPipeliningUsed();
- isSpdyUsed = httpReply->isSpdyUsed();
+ isHttp2Used = httpReply->isHttp2Used();
incomingContentLength = httpReply->contentLength();
}
diff --git a/src/network/access/qhttpthreaddelegate_p.h b/src/network/access/qhttpthreaddelegate_p.h
index a5272fc15c..5849d3427f 100644
--- a/src/network/access/qhttpthreaddelegate_p.h
+++ b/src/network/access/qhttpthreaddelegate_p.h
@@ -112,15 +112,12 @@ public:
int incomingStatusCode;
QString incomingReasonPhrase;
bool isPipeliningUsed;
- bool isSpdyUsed;
+ bool isHttp2Used;
qint64 incomingContentLength;
qint64 removedContentLength;
QNetworkReply::NetworkError incomingErrorCode;
QString incomingErrorDetail;
QHttp2Configuration http2Parameters;
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- QSharedPointer<QNetworkSession> networkSession;
-#endif
protected:
// The zerocopy download buffer, if used:
diff --git a/src/network/access/qnetworkaccessbackend.cpp b/src/network/access/qnetworkaccessbackend.cpp
index 9d7e7200fa..8013785cc1 100644
--- a/src/network/access/qnetworkaccessbackend.cpp
+++ b/src/network/access/qnetworkaccessbackend.cpp
@@ -39,13 +39,11 @@
#include "qnetworkaccessbackend_p.h"
#include "qnetworkaccessmanager_p.h"
-#include "qnetworkconfigmanager.h"
#include "qnetworkrequest.h"
#include "qnetworkreply.h"
#include "qnetworkreply_p.h"
#include "QtCore/qmutex.h"
#include "QtCore/qstringlist.h"
-#include "QtNetwork/private/qnetworksession_p.h"
#include "qnetworkaccesscachebackend_p.h"
#include "qabstractnetworkcache.h"
@@ -371,30 +369,6 @@ void QNetworkAccessBackend::sslErrors(const QList<QSslError> &errors)
*/
bool QNetworkAccessBackend::start()
{
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- // For bearer, check if session start is required
- QSharedPointer<QNetworkSession> networkSession(manager->getNetworkSession());
- if (networkSession) {
- // session required
- if (networkSession->isOpen() &&
- networkSession->state() == QNetworkSession::Connected) {
- // Session is already open and ready to use.
- // copy network session down to the backend
- setProperty("_q_networksession", QVariant::fromValue(networkSession));
- } else {
- // Session not ready, but can skip for loopback connections
-
- // This is not ideal.
- // Don't need an open session for localhost access.
- if (!reply->url.isLocalFile()) {
- const QString host = reply->url.host();
- if (host != QLatin1String("localhost") && !QHostAddress(host).isLoopback())
- return false; // need to wait for session to be opened
- }
- }
- }
-#endif
-
#ifndef QT_NO_NETWORKPROXY
reply->proxyList = manager->queryProxy(QNetworkProxyQuery(url()));
#endif
diff --git a/src/network/access/qnetworkaccesscache.cpp b/src/network/access/qnetworkaccesscache.cpp
index ba092f2618..4d65761a0b 100644
--- a/src/network/access/qnetworkaccesscache.cpp
+++ b/src/network/access/qnetworkaccesscache.cpp
@@ -121,8 +121,9 @@ void QNetworkAccessCache::clear()
NodeHash::Iterator it = hashCopy.begin();
NodeHash::Iterator end = hashCopy.end();
for ( ; it != end; ++it) {
- it->object->key.clear();
- it->object->dispose();
+ (*it)->object->key.clear();
+ (*it)->object->dispose();
+ delete (*it);
}
// now delete:
@@ -139,11 +140,10 @@ void QNetworkAccessCache::clear()
*/
void QNetworkAccessCache::linkEntry(const QByteArray &key)
{
- NodeHash::Iterator it = hash.find(key);
- if (it == hash.end())
+ Node * const node = hash.value(key);
+ if (!node)
return;
- Node *const node = &it.value();
Q_ASSERT(node != oldest && node != newest);
Q_ASSERT(node->older == nullptr && node->newer == nullptr);
Q_ASSERT(node->useCount == 0);
@@ -168,12 +168,10 @@ void QNetworkAccessCache::linkEntry(const QByteArray &key)
*/
bool QNetworkAccessCache::unlinkEntry(const QByteArray &key)
{
- NodeHash::Iterator it = hash.find(key);
- if (it == hash.end())
+ Node * const node = hash.value(key);
+ if (!node)
return false;
- Node *const node = &it.value();
-
bool wasOldest = false;
if (node == oldest) {
oldest = node->newer;
@@ -230,6 +228,7 @@ void QNetworkAccessCache::timerEvent(QTimerEvent *)
oldest->object->dispose();
hash.remove(oldest->key); // oldest gets deleted
+ delete oldest;
oldest = next;
}
@@ -249,16 +248,20 @@ void QNetworkAccessCache::addEntry(const QByteArray &key, CacheableObject *entry
if (unlinkEntry(key))
updateTimer();
- Node &node = hash[key]; // create the entry in the hash if it didn't exist
- if (node.useCount)
- qWarning("QNetworkAccessCache::addEntry: overriding active cache entry '%s'",
- key.constData());
- if (node.object)
- node.object->dispose();
- node.object = entry;
- node.object->key = key;
- node.key = key;
- node.useCount = 1;
+ Node *node = hash.value(key);
+ if (!node) {
+ node = new Node;
+ hash.insert(key, node);
+ }
+
+ if (node->useCount)
+ qWarning("QNetworkAccessCache::addEntry: overriding active cache entry '%s'", key.constData());
+ if (node->object)
+ node->object->dispose();
+ node->object = entry;
+ node->object->key = key;
+ node->key = key;
+ node->useCount = 1;
}
bool QNetworkAccessCache::hasEntry(const QByteArray &key) const
@@ -268,11 +271,9 @@ bool QNetworkAccessCache::hasEntry(const QByteArray &key) const
bool QNetworkAccessCache::requestEntry(const QByteArray &key, QObject *target, const char *member)
{
- NodeHash::Iterator it = hash.find(key);
- if (it == hash.end())
- return false; // no such entry
-
- Node *node = &it.value();
+ Node *node = hash.value(key);
+ if (!node)
+ return false;
if (node->useCount > 0 && !node->object->shareable) {
// object is not shareable and is in use
@@ -294,13 +295,14 @@ bool QNetworkAccessCache::requestEntry(const QByteArray &key, QObject *target, c
QNetworkAccessCache::CacheableObject *QNetworkAccessCache::requestEntryNow(const QByteArray &key)
{
- NodeHash::Iterator it = hash.find(key);
- if (it == hash.end())
+ Node *node = hash.value(key);
+ if (!node)
return nullptr;
- if (it->useCount > 0) {
- if (it->object->shareable) {
- ++it->useCount;
- return it->object;
+
+ if (node->useCount > 0) {
+ if (node->object->shareable) {
+ ++node->useCount;
+ return node->object;
}
// object in use and not shareable
@@ -309,23 +311,21 @@ QNetworkAccessCache::CacheableObject *QNetworkAccessCache::requestEntryNow(const
// entry not in use, let the caller have it
bool wasOldest = unlinkEntry(key);
- ++it->useCount;
+ ++node->useCount;
if (wasOldest)
updateTimer();
- return it->object;
+ return node->object;
}
void QNetworkAccessCache::releaseEntry(const QByteArray &key)
{
- NodeHash::Iterator it = hash.find(key);
- if (it == hash.end()) {
- qWarning("QNetworkAccessCache::releaseEntry: trying to release key '%s' that is not in cache",
- key.constData());
+ Node *node = hash.value(key);
+ if (!node) {
+ qWarning("QNetworkAccessCache::releaseEntry: trying to release key '%s' that is not in cache", key.constData());
return;
}
- Node *node = &it.value();
Q_ASSERT(node->useCount > 0);
// are there other objects waiting?
@@ -356,14 +356,12 @@ void QNetworkAccessCache::releaseEntry(const QByteArray &key)
void QNetworkAccessCache::removeEntry(const QByteArray &key)
{
- NodeHash::Iterator it = hash.find(key);
- if (it == hash.end()) {
- qWarning("QNetworkAccessCache::removeEntry: trying to remove key '%s' that is not in cache",
- key.constData());
+ Node *node = hash.value(key);
+ if (!node) {
+ qWarning("QNetworkAccessCache::removeEntry: trying to remove key '%s' that is not in cache", key.constData());
return;
}
- Node *node = &it.value();
if (unlinkEntry(key))
updateTimer();
if (node->useCount > 1)
@@ -372,6 +370,7 @@ void QNetworkAccessCache::removeEntry(const QByteArray &key)
node->object->key.clear();
hash.remove(node->key);
+ delete node;
}
QT_END_NAMESPACE
diff --git a/src/network/access/qnetworkaccesscache_p.h b/src/network/access/qnetworkaccesscache_p.h
index 69ea649a8a..9f7001d044 100644
--- a/src/network/access/qnetworkaccesscache_p.h
+++ b/src/network/access/qnetworkaccesscache_p.h
@@ -71,7 +71,7 @@ class QNetworkAccessCache: public QObject
Q_OBJECT
public:
struct Node;
- typedef QHash<QByteArray, Node> NodeHash;
+ typedef QHash<QByteArray, Node *> NodeHash;
class CacheableObject
{
diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp
index 7b09608499..7f5439a16e 100644
--- a/src/network/access/qnetworkaccessftpbackend.cpp
+++ b/src/network/access/qnetworkaccessftpbackend.cpp
@@ -161,10 +161,6 @@ void QNetworkAccessFtpBackend::open()
if (!objectCache->requestEntry(cacheKey, this,
SLOT(ftpConnectionReady(QNetworkAccessCache::CacheableObject*)))) {
ftp = new QNetworkAccessCachedFtpConnection;
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //copy network session down to the QFtp
- ftp->setProperty("_q_networksession", property("_q_networksession"));
-#endif
#ifndef QT_NO_NETWORKPROXY
if (proxy.type() == QNetworkProxy::FtpCachingProxy)
ftp->setProxy(proxy.hostName(), proxy.port());
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 6f6aa73f62..63a816b9dc 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -54,9 +54,6 @@
#include "qhstsstore_p.h"
#endif // QT_CONFIG(settings)
-#include "QtNetwork/qnetworksession.h"
-#include "QtNetwork/private/qsharednetworksession_p.h"
-
#if QT_CONFIG(ftp)
#include "qnetworkaccessftpbackend_p.h"
#endif
@@ -71,7 +68,6 @@
#include "QtCore/qvector.h"
#include "QtNetwork/private/qauthenticator_p.h"
#include "QtNetwork/qsslconfiguration.h"
-#include "QtNetwork/qnetworkconfigmanager.h"
#include "QtNetwork/private/http2protocol_p.h"
#if QT_CONFIG(http)
@@ -479,20 +475,7 @@ QNetworkAccessManager::QNetworkAccessManager(QObject *parent)
if (QNetworkStatusMonitor::isEnabled()) {
connect(&d->statusMonitor, SIGNAL(onlineStateChanged(bool)),
SLOT(_q_onlineStateChanged(bool)));
-#ifdef QT_NO_BEARERMANAGEMENT
d->networkAccessible = d->statusMonitor.isNetworkAccessible();
-#else
- d->networkAccessible = d->statusMonitor.isNetworkAccessible() ? Accessible : NotAccessible;
- } else {
- // if a session is required, we track online state through
- // the QNetworkSession's signals if a request is already made.
- // we need to track current accessibility state by default
- //
- connect(&d->networkConfigurationManager, SIGNAL(onlineStateChanged(bool)),
- SLOT(_q_onlineStateChanged(bool)));
- connect(&d->networkConfigurationManager, SIGNAL(configurationChanged(QNetworkConfiguration)),
- SLOT(_q_configurationChanged(QNetworkConfiguration)));
-#endif // QT_NO_BEARERMANAGEMENT
}
}
@@ -993,186 +976,6 @@ QNetworkReply *QNetworkAccessManager::deleteResource(const QNetworkRequest &requ
return d_func()->postProcess(createRequest(QNetworkAccessManager::DeleteOperation, request));
}
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
-
-/*!
- \since 4.7
- \obsolete
-
- Sets the network configuration that will be used when creating the
- \l {QNetworkSession}{network session} to \a config.
-
- The network configuration is used to create and open a network session before any request that
- requires network access is process. If no network configuration is explicitly set via this
- function the network configuration returned by
- QNetworkConfigurationManager::defaultConfiguration() will be used.
-
- To restore the default network configuration set the network configuration to the value
- returned from QNetworkConfigurationManager::defaultConfiguration().
-
- Setting a network configuration means that the QNetworkAccessManager instance will only
- be using the specified one. In particular, if the default network configuration changes
- (upon e.g. Wifi being available), this new configuration needs to be enabled
- manually if desired.
-
- \snippet code/src_network_access_qnetworkaccessmanager.cpp 2
-
- If an invalid network configuration is set, a network session will not be created. In this
- case network requests will be processed regardless, but may fail. For example:
-
- \snippet code/src_network_access_qnetworkaccessmanager.cpp 3
-
- \sa configuration(), QNetworkSession
-*/
-void QNetworkAccessManager::setConfiguration(const QNetworkConfiguration &config)
-{
- Q_D(QNetworkAccessManager);
-
- d->networkConfiguration = config;
- d->customNetworkConfiguration = true;
- d->createSession(config);
-}
-
-/*!
- \since 4.7
- \obsolete
-
- Returns the network configuration that will be used to create the
- \l {QNetworkSession}{network session} which will be used when processing network requests.
-
- \sa setConfiguration(), activeConfiguration()
-*/
-QNetworkConfiguration QNetworkAccessManager::configuration() const
-{
- Q_D(const QNetworkAccessManager);
-
- QSharedPointer<QNetworkSession> session(d->getNetworkSession());
- if (session && !d->statusMonitor.isEnabled()) {
- return session->configuration();
- } else {
- return d->networkConfigurationManager.defaultConfiguration();
- }
-}
-
-/*!
- \since 4.7
- \obsolete
-
- Returns the current active network configuration.
-
- If the network configuration returned by configuration() is of type
- QNetworkConfiguration::ServiceNetwork this function will return the current active child
- network configuration of that configuration. Otherwise returns the same network configuration
- as configuration().
-
- Use this function to return the actual network configuration currently in use by the network
- session.
-
- \sa configuration()
-*/
-QNetworkConfiguration QNetworkAccessManager::activeConfiguration() const
-{
- Q_D(const QNetworkAccessManager);
-
- QSharedPointer<QNetworkSession> networkSession(d->getNetworkSession());
- if (networkSession && !d->statusMonitor.isEnabled()) {
- return d->networkConfigurationManager.configurationFromIdentifier(
- networkSession->sessionProperty(QLatin1String("ActiveConfiguration")).toString());
- } else {
- return d->networkConfigurationManager.defaultConfiguration();
- }
-}
-
-/*!
- \since 4.7
- \obsolete
-
- Overrides the reported network accessibility. If \a accessible is NotAccessible the reported
- network accessiblity will always be NotAccessible. Otherwise the reported network
- accessibility will reflect the actual device state.
-*/
-void QNetworkAccessManager::setNetworkAccessible(QNetworkAccessManager::NetworkAccessibility accessible)
-{
- Q_D(QNetworkAccessManager);
-
- d->defaultAccessControl = accessible == NotAccessible ? false : true;
-
- if (d->networkAccessible != accessible) {
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- NetworkAccessibility previous = networkAccessible();
- d->networkAccessible = accessible;
- NetworkAccessibility current = networkAccessible();
- if (previous != current)
- emit networkAccessibleChanged(current);
-QT_WARNING_POP
- }
-}
-
-/*!
- \since 4.7
- \obsolete
-
- Returns the current network accessibility.
-*/
-QNetworkAccessManager::NetworkAccessibility QNetworkAccessManager::networkAccessible() const
-{
- Q_D(const QNetworkAccessManager);
-
- if (d->statusMonitor.isEnabled()) {
- if (!d->statusMonitor.isMonitoring())
- d->statusMonitor.start();
- return d->networkAccessible;
- }
-
- if (d->customNetworkConfiguration && d->networkConfiguration.state().testFlag(QNetworkConfiguration::Undefined))
- return UnknownAccessibility;
-
- if (d->networkSessionRequired) {
- QSharedPointer<QNetworkSession> networkSession(d->getNetworkSession());
- if (networkSession) {
- // d->online holds online/offline state of this network session.
- if (d->online)
- return d->networkAccessible;
- else
- return NotAccessible;
- } else {
- if (d->defaultAccessControl) {
- if (d->online)
- return d->networkAccessible;
- else
- return NotAccessible;
- }
- return (d->networkAccessible);
- }
- } else {
- if (d->online)
- return d->networkAccessible;
- else
- return NotAccessible;
- }
-}
-
-/*!
- \internal
-
- Returns the network session currently in use.
- This can be changed at any time, ownership remains with the QNetworkAccessManager
-*/
-const QWeakPointer<const QNetworkSession> QNetworkAccessManagerPrivate::getNetworkSession(const QNetworkAccessManager *q)
-{
- return q->d_func()->networkSessionWeakRef;
-}
-
-QSharedPointer<QNetworkSession> QNetworkAccessManagerPrivate::getNetworkSession() const
-{
- if (networkSessionStrongRef)
- return networkSessionStrongRef;
- return networkSessionWeakRef.toStrongRef();
-}
-
-#endif // QT_NO_BEARERMANAGEMENT
-
#ifndef QT_NO_SSL
/*!
\since 5.2
@@ -1230,12 +1033,10 @@ void QNetworkAccessManager::connectToHostEncrypted(const QString &hostName, quin
if (sslConfiguration != QSslConfiguration::defaultConfiguration())
request.setSslConfiguration(sslConfiguration);
- // There is no way to enable SPDY/HTTP2 via a request, so we need to check
- // the ssl configuration whether SPDY/HTTP2 is allowed here.
+ // There is no way to enable HTTP2 via a request, so we need to check
+ // the ssl configuration whether HTTP2 is allowed here.
if (sslConfiguration.allowedNextProtocols().contains(QSslConfiguration::ALPNProtocolHTTP2))
request.setAttribute(QNetworkRequest::Http2AllowedAttribute, true);
- else if (sslConfiguration.allowedNextProtocols().contains(QSslConfiguration::NextProtocolSpdy3_0))
- request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, true);
request.setPeerVerifyName(peerName);
get(request);
@@ -1450,12 +1251,7 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
// See the code in ctor - QNetworkStatusMonitor allows us to
// immediately set 'networkAccessible' even before we start
// the monitor.
-#ifdef QT_NO_BEARERMANAGEMENT
- if (!d->networkAccessible
-#else
- if (d->networkAccessible == NotAccessible
-#endif // QT_NO_BEARERMANAGEMENT
- && !isLocalFile) {
+ if (!d->networkAccessible && !isLocalFile) {
QHostAddress dest;
QString host = req.url().host().toLower();
if (!(dest.setAddress(host) && dest.isLoopback())
@@ -1467,35 +1263,6 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
if (!d->statusMonitor.isMonitoring() && !d->statusMonitor.start())
qWarning(lcNetMon, "failed to start network status monitoring");
- } else {
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- // Return a disabled network reply if network access is disabled.
- // Except if the scheme is empty or file:// or if the host resolves to a loopback address.
- if (d->networkAccessible == NotAccessible && !isLocalFile) {
- QHostAddress dest;
- QString host = req.url().host().toLower();
- if (!(dest.setAddress(host) && dest.isLoopback()) && host != QLatin1String("localhost")
- && host != QHostInfo::localHostName().toLower()) {
- return new QDisabledNetworkReply(this, req, op);
- }
- }
-
- if (!d->networkSessionStrongRef && (d->initializeSession || !d->networkConfiguration.identifier().isEmpty())) {
- if (!d->networkConfiguration.identifier().isEmpty()) {
- if ((d->networkConfiguration.state() & QNetworkConfiguration::Defined)
- && d->networkConfiguration != d->networkConfigurationManager.defaultConfiguration())
- d->createSession(d->networkConfigurationManager.defaultConfiguration());
- else
- d->createSession(d->networkConfiguration);
-
- } else {
- if (d->networkSessionRequired)
- d->createSession(d->networkConfigurationManager.defaultConfiguration());
- else
- d->initializeSession = false;
- }
- }
-#endif
}
#endif
QNetworkRequest request = req;
@@ -1552,26 +1319,12 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
}
#endif
QNetworkReplyHttpImpl *reply = new QNetworkReplyHttpImpl(this, request, op, outgoingData);
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- if (!d->statusMonitor.isEnabled()) {
- connect(this, SIGNAL(networkSessionConnected()),
- reply, SLOT(_q_networkSessionConnected()));
- }
-#endif
return reply;
}
#endif // QT_CONFIG(http)
// first step: create the reply
QNetworkReplyImpl *reply = new QNetworkReplyImpl(this);
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- // NETMONTODO: network reply impl must be augmented to use the same monitoring
- // capabilities as http network reply impl does. Once it does: uncomment the condition below
- if (!isLocalFile /*&& !d->statusMonitor.isEnabled()*/) {
- connect(this, SIGNAL(networkSessionConnected()),
- reply, SLOT(_q_networkSessionConnected()));
- }
-#endif
QNetworkReplyImplPrivate *priv = reply->d_func();
priv->manager = this;
@@ -1754,15 +1507,6 @@ void QNetworkAccessManagerPrivate::_q_replyFinished(QNetworkReply *reply)
emit q->finished(reply);
if (reply->request().attribute(QNetworkRequest::AutoDeleteReplyOnFinishAttribute, false).toBool())
QMetaObject::invokeMethod(reply, [reply] { reply->deleteLater(); }, Qt::QueuedConnection);
-
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- // If there are no active requests, release our reference to the network session.
- // It will not be destroyed immediately, but rather when the connection cache is flushed
- // after 2 minutes.
- activeReplyCount--;
- if (networkSessionStrongRef && activeReplyCount == 0)
- networkSessionStrongRef.clear();
-#endif
}
void QNetworkAccessManagerPrivate::_q_replyEncrypted(QNetworkReply *reply)
@@ -1813,9 +1557,6 @@ QNetworkReply *QNetworkAccessManagerPrivate::postProcess(QNetworkReply *reply)
q->connect(reply, SIGNAL(sslErrors(QList<QSslError>)), SLOT(_q_replySslErrors(QList<QSslError>)));
q->connect(reply, SIGNAL(preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator*)), SLOT(_q_replyPreSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator*)));
#endif
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- activeReplyCount++;
-#endif
return reply;
}
@@ -1983,233 +1724,11 @@ void QNetworkAccessManagerPrivate::destroyThread()
}
}
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
-void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &config)
-{
- Q_Q(QNetworkAccessManager);
-
- initializeSession = false;
-
- //resurrect weak ref if possible
- networkSessionStrongRef = networkSessionWeakRef.toStrongRef();
-
- QSharedPointer<QNetworkSession> newSession;
- if (config.isValid())
- newSession = QSharedNetworkSessionManager::getSession(config);
-
- QNetworkSession::State oldState = QNetworkSession::Invalid;
- if (networkSessionStrongRef) {
- //do nothing if new and old session are the same
- if (networkSessionStrongRef == newSession)
- return;
- //disconnect from old session
- QObject::disconnect(networkSessionStrongRef.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()));
- QObject::disconnect(networkSessionStrongRef.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
- QObject::disconnect(networkSessionStrongRef.data(), SIGNAL(stateChanged(QNetworkSession::State)),
- q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)));
- QObject::disconnect(networkSessionStrongRef.data(), SIGNAL(error(QNetworkSession::SessionError)),
- q, SLOT(_q_networkSessionFailed(QNetworkSession::SessionError)));
- oldState = networkSessionStrongRef->state();
- }
-
- //switch to new session (null if config was invalid)
- networkSessionStrongRef = newSession;
- networkSessionWeakRef = networkSessionStrongRef.toWeakRef();
-
- if (!networkSessionStrongRef) {
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- if (networkAccessible == QNetworkAccessManager::NotAccessible || !online)
- emit q->networkAccessibleChanged(QNetworkAccessManager::NotAccessible);
- else
- emit q->networkAccessibleChanged(QNetworkAccessManager::UnknownAccessibility);
-QT_WARNING_POP
-
- return;
- }
-
- //connect to new session
- QObject::connect(networkSessionStrongRef.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()), Qt::QueuedConnection);
- //QueuedConnection is used to avoid deleting the networkSession inside its closed signal
- QObject::connect(networkSessionStrongRef.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()), Qt::QueuedConnection);
- QObject::connect(networkSessionStrongRef.data(), SIGNAL(stateChanged(QNetworkSession::State)),
- q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)), Qt::QueuedConnection);
- QObject::connect(networkSessionStrongRef.data(), SIGNAL(error(QNetworkSession::SessionError)),
- q, SLOT(_q_networkSessionFailed(QNetworkSession::SessionError)));
-
- const QNetworkSession::State newState = networkSessionStrongRef->state();
- if (newState != oldState) {
- QMetaObject::invokeMethod(q, "_q_networkSessionStateChanged", Qt::QueuedConnection,
- Q_ARG(QNetworkSession::State, newState));
- }
-}
-
-void QNetworkAccessManagerPrivate::_q_networkSessionClosed()
-{
- Q_Q(QNetworkAccessManager);
- QSharedPointer<QNetworkSession> networkSession(getNetworkSession());
- if (networkSession) {
- networkConfiguration = networkSession->configuration();
-
- //disconnect from old session
- QObject::disconnect(networkSession.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()));
- QObject::disconnect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
- QObject::disconnect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)),
- q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)));
- QObject::disconnect(networkSession.data(), SIGNAL(error(QNetworkSession::SessionError)),
- q, SLOT(_q_networkSessionFailed(QNetworkSession::SessionError)));
-
- networkSessionStrongRef.clear();
- networkSessionWeakRef.clear();
- }
-}
-
-void QNetworkAccessManagerPrivate::_q_networkSessionStateChanged(QNetworkSession::State state)
-{
- Q_Q(QNetworkAccessManager);
- bool reallyOnline = false;
- //Do not emit the networkSessionConnected signal here, except for roaming -> connected
- //transition, otherwise it is emitted twice in a row when opening a connection.
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- if (state == QNetworkSession::Connected && lastSessionState != QNetworkSession::Roaming)
- emit q->networkSessionConnected();
- lastSessionState = state;
-
- if (online && (state == QNetworkSession::Disconnected
- || state == QNetworkSession::NotAvailable)) {
- const auto cfgs = networkConfigurationManager.allConfigurations();
- for (const QNetworkConfiguration &cfg : cfgs) {
- if (cfg.state().testFlag(QNetworkConfiguration::Active)) {
- reallyOnline = true;
- }
- }
- } else if (state == QNetworkSession::Connected || state == QNetworkSession::Roaming) {
- reallyOnline = true;
- }
- online = reallyOnline;
-
- if (!reallyOnline) {
- if (state != QNetworkSession::Connected && state != QNetworkSession::Roaming) {
- if (networkAccessible != QNetworkAccessManager::NotAccessible) {
- networkAccessible = QNetworkAccessManager::NotAccessible;
- emit q->networkAccessibleChanged(networkAccessible);
- }
- }
- } else {
- if (defaultAccessControl)
- if (networkAccessible != QNetworkAccessManager::Accessible) {
- networkAccessible = QNetworkAccessManager::Accessible;
- emit q->networkAccessibleChanged(networkAccessible);
- }
- }
- if (online && (state != QNetworkSession::Connected && state != QNetworkSession::Roaming)) {
- _q_networkSessionClosed();
- createSession(q->configuration());
- }
-QT_WARNING_POP
-}
-
-void QNetworkAccessManagerPrivate::_q_onlineStateChanged(bool isOnline)
-{
- Q_Q(QNetworkAccessManager);
-
- if (statusMonitor.isEnabled()) {
- networkAccessible = isOnline ? QNetworkAccessManager::Accessible : QNetworkAccessManager::NotAccessible;
- return;
- }
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
- // if the user set a config, we only care whether this one is active.
- // Otherwise, this QNAM is online if there is an online config.
- if (customNetworkConfiguration) {
- online = (networkConfiguration.state() & QNetworkConfiguration::Active);
- } else {
- if (online != isOnline) {
- online = isOnline;
- _q_networkSessionClosed();
- createSession(q->configuration());
- }
- }
- if (online) {
- if (defaultAccessControl) {
- if (networkAccessible != QNetworkAccessManager::Accessible) {
- networkAccessible = QNetworkAccessManager::Accessible;
- emit q->networkAccessibleChanged(networkAccessible);
- }
- }
- } else {
- if (networkAccessible != QNetworkAccessManager::NotAccessible) {
- networkAccessible = QNetworkAccessManager::NotAccessible;
- emit q->networkAccessibleChanged(networkAccessible);
- }
- }
-QT_WARNING_POP
-}
-
-void QNetworkAccessManagerPrivate::_q_configurationChanged(const QNetworkConfiguration &configuration)
-{
- if (statusMonitor.isEnabled())
- return;
-
- const QString id = configuration.identifier();
- if (configuration.state().testFlag(QNetworkConfiguration::Active)) {
- if (!onlineConfigurations.contains(id)) {
- QSharedPointer<QNetworkSession> session(getNetworkSession());
- if (session) {
- if (online && session->configuration().identifier()
- != networkConfigurationManager.defaultConfiguration().identifier()) {
-
- onlineConfigurations.insert(id);
- // CHECK: If it's having Active flag - why would it be disconnected ???
- //this one disconnected but another one is online,
- // close and create new session
- _q_networkSessionClosed();
- createSession(networkConfigurationManager.defaultConfiguration());
- }
- }
- }
-
- } else if (onlineConfigurations.contains(id)) {
- //this one is disconnecting
- // CHECK: If it disconnected while we create a session over a down configuration ???
- onlineConfigurations.remove(id);
- if (!onlineConfigurations.isEmpty()) {
- _q_networkSessionClosed();
- createSession(configuration);
- }
- }
-}
-
-
-void QNetworkAccessManagerPrivate::_q_networkSessionFailed(QNetworkSession::SessionError)
-{
- if (statusMonitor.isEnabled())
- return;
-
- const auto cfgs = networkConfigurationManager.allConfigurations();
- for (const QNetworkConfiguration &cfg : cfgs) {
- if (cfg.state().testFlag(QNetworkConfiguration::Active)) {
- online = true;
- _q_networkSessionClosed();
- createSession(networkConfigurationManager.defaultConfiguration());
- return;
- }
- }
-}
-
-#else
-
void QNetworkAccessManagerPrivate::_q_onlineStateChanged(bool isOnline)
{
networkAccessible = isOnline;
}
-#endif // QT_NO_BEARERMANAGEMENT
-
#if QT_CONFIG(http)
QNetworkRequest QNetworkAccessManagerPrivate::prepareMultipart(const QNetworkRequest &request, QHttpMultiPart *multiPart)
{
diff --git a/src/network/access/qnetworkaccessmanager.h b/src/network/access/qnetworkaccessmanager.h
index 6f7f90ce14..3a08c30a21 100644
--- a/src/network/access/qnetworkaccessmanager.h
+++ b/src/network/access/qnetworkaccessmanager.h
@@ -56,7 +56,6 @@ class QIODevice;
class QAbstractNetworkCache;
class QAuthenticator;
class QByteArray;
-template<typename T> class QList;
class QNetworkCookie;
class QNetworkCookieJar;
class QNetworkReply;
@@ -64,9 +63,6 @@ class QNetworkProxy;
class QNetworkProxyFactory;
class QSslError;
class QHstsPolicy;
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
-class QNetworkConfiguration;
-#endif
class QHttpMultiPart;
class QNetworkReplyImplPrivate;
@@ -75,9 +71,6 @@ class Q_NETWORK_EXPORT QNetworkAccessManager: public QObject
{
Q_OBJECT
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- Q_PROPERTY(NetworkAccessibility networkAccessible READ networkAccessible WRITE setNetworkAccessible NOTIFY networkAccessibleChanged)
-#endif
public:
enum Operation {
@@ -91,18 +84,6 @@ public:
UnknownOperation = 0
};
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- enum QT_DEPRECATED_NETWORK_API_5_15 NetworkAccessibility {
- UnknownAccessibility = -1,
- NotAccessible = 0,
- Accessible = 1
- };
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- Q_ENUM(NetworkAccessibility)
-QT_WARNING_POP
-#endif
-
explicit QNetworkAccessManager(QObject *parent = nullptr);
~QNetworkAccessManager();
@@ -149,18 +130,6 @@ QT_WARNING_POP
QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QHttpMultiPart *multiPart);
#endif
-#if !defined(QT_NO_BEARERMANAGEMENT) // ### Qt6: Remove section
- QT_DEPRECATED_VERSION_5_15 void setConfiguration(const QNetworkConfiguration &config);
- QT_DEPRECATED_VERSION_5_15 QNetworkConfiguration configuration() const;
- QT_DEPRECATED_VERSION_5_15 QNetworkConfiguration activeConfiguration() const;
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- QT_DEPRECATED_VERSION_5_15 void setNetworkAccessible(NetworkAccessibility accessible);
- QT_DEPRECATED_VERSION_5_15 NetworkAccessibility networkAccessible() const;
-QT_WARNING_POP
-#endif
-
#ifndef QT_NO_SSL
void connectToHostEncrypted(const QString &hostName, quint16 port = 443,
const QSslConfiguration &sslConfiguration = QSslConfiguration::defaultConfiguration());
@@ -191,19 +160,6 @@ Q_SIGNALS:
void preSharedKeyAuthenticationRequired(QNetworkReply *reply, QSslPreSharedKeyAuthenticator *authenticator);
#endif
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- QT_DEPRECATED_VERSION_5_15 void networkSessionConnected();
-
-#ifndef Q_MOC_RUN // moc has trouble with the expansion of these macros
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-#endif
- QT_DEPRECATED_VERSION_5_15 void networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility accessible);
-#ifndef Q_MOC_RUN // moc has trouble with the expansion of these macros
-QT_WARNING_POP
-#endif
-#endif
-
protected:
virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request,
QIODevice *outgoingData = nullptr);
@@ -223,12 +179,6 @@ private:
Q_DECLARE_PRIVATE(QNetworkAccessManager)
Q_PRIVATE_SLOT(d_func(), void _q_replySslErrors(QList<QSslError>))
Q_PRIVATE_SLOT(d_func(), void _q_replyPreSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator*))
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionClosed())
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionStateChanged(QNetworkSession::State))
- Q_PRIVATE_SLOT(d_func(), void _q_configurationChanged(const QNetworkConfiguration &))
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionFailed(QNetworkSession::SessionError))
-#endif
Q_PRIVATE_SLOT(d_func(), void _q_onlineStateChanged(bool))
};
diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h
index 7926463d56..e0f4d19d6f 100644
--- a/src/network/access/qnetworkaccessmanager_p.h
+++ b/src/network/access/qnetworkaccessmanager_p.h
@@ -60,11 +60,7 @@
#include "qhsts_p.h"
#include "private/qobject_p.h"
#include "QtNetwork/qnetworkproxy.h"
-#include "QtNetwork/qnetworksession.h"
#include "qnetworkaccessauthenticationmanager_p.h"
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
-#include "QtNetwork/qnetworkconfigmanager.h"
-#endif
#if QT_CONFIG(settings)
#include "qhstsstore_p.h"
@@ -87,33 +83,11 @@ public:
#ifndef QT_NO_NETWORKPROXY
proxyFactory(nullptr),
#endif
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- lastSessionState(QNetworkSession::Invalid),
- networkConfiguration(networkConfigurationManager.defaultConfiguration()),
- customNetworkConfiguration(false),
- networkSessionRequired(networkConfigurationManager.capabilities()
- & QNetworkConfigurationManager::NetworkSessionRequired),
- activeReplyCount(0),
- online(false),
- initializeSession(true),
-#endif
cookieJarCreated(false),
defaultAccessControl(true),
redirectPolicy(QNetworkRequest::ManualRedirectPolicy),
authenticationManager(QSharedPointer<QNetworkAccessAuthenticationManager>::create())
{
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- // we would need all active configurations to check for
- // d->networkConfigurationManager.isOnline(), which is asynchronous
- // and potentially expensive. We can just check the configuration here
- online = (networkConfiguration.state().testFlag(QNetworkConfiguration::Active));
- if (online)
- networkAccessible = QNetworkAccessManager::Accessible;
- else if (networkConfiguration.state().testFlag(QNetworkConfiguration::Undefined))
- networkAccessible = QNetworkAccessManager::UnknownAccessibility;
- else
- networkAccessible = QNetworkAccessManager::NotAccessible;
-#endif
}
~QNetworkAccessManagerPrivate();
@@ -153,21 +127,6 @@ public:
QStringList backendSupportedSchemes() const;
void _q_onlineStateChanged(bool isOnline);
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- void createSession(const QNetworkConfiguration &config);
- QSharedPointer<QNetworkSession> getNetworkSession() const;
-
- void _q_networkSessionClosed();
- void _q_networkSessionNewConfigurationActivated();
- void _q_networkSessionPreferredConfigurationChanged(const QNetworkConfiguration &config,
- bool isSeamless);
- void _q_networkSessionStateChanged(QNetworkSession::State state);
-
- void _q_configurationChanged(const QNetworkConfiguration &configuration);
- void _q_networkSessionFailed(QNetworkSession::SessionError error);
-
- QSet<QString> onlineConfigurations;
-#endif
#if QT_CONFIG(http)
QNetworkRequest prepareMultipart(const QNetworkRequest &request, QHttpMultiPart *multiPart);
@@ -186,23 +145,7 @@ public:
QNetworkProxyFactory *proxyFactory;
#endif
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- QSharedPointer<QNetworkSession> networkSessionStrongRef;
- QWeakPointer<QNetworkSession> networkSessionWeakRef;
- QNetworkSession::State lastSessionState;
- QNetworkConfigurationManager networkConfigurationManager;
- QNetworkConfiguration networkConfiguration;
- // we need to track whether the user set a config or not,
- // because the default config might change
- bool customNetworkConfiguration;
- bool networkSessionRequired;
- QNetworkAccessManager::NetworkAccessibility networkAccessible;
- int activeReplyCount;
- bool online;
- bool initializeSession;
-#else
bool networkAccessible = true;
-#endif
bool cookieJarCreated;
bool defaultAccessControl;
@@ -231,9 +174,6 @@ public:
int transferTimeout = 0;
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- Q_AUTOTEST_EXPORT static const QWeakPointer<const QNetworkSession> getNetworkSession(const QNetworkAccessManager *manager);
-#endif
Q_DECLARE_PUBLIC(QNetworkAccessManager)
};
diff --git a/src/network/access/qnetworkcookie.cpp b/src/network/access/qnetworkcookie.cpp
index 47f6112b22..16c38d89ab 100644
--- a/src/network/access/qnetworkcookie.cpp
+++ b/src/network/access/qnetworkcookie.cpp
@@ -46,7 +46,7 @@
#include "QtCore/qdebug.h"
#include "QtCore/qlist.h"
#include "QtCore/qlocale.h"
-#include <QtCore/qregexp.h>
+#include <QtCore/qregularexpression.h>
#include "QtCore/qstring.h"
#include "QtCore/qstringlist.h"
#include "QtCore/qurl.h"
@@ -593,7 +593,7 @@ static QDateTime parseDateString(const QByteArray &dateString)
int zoneOffset = -1;
// hour:minute:second.ms pm
- QRegExp timeRx(QLatin1String("(\\d{1,2}):(\\d{1,2})(:(\\d{1,2})|)(\\.(\\d{1,3})|)((\\s{0,}(am|pm))|)"));
+ QRegularExpression timeRx(QLatin1String("(\\d{1,2}):(\\d{1,2})(:(\\d{1,2})|)(\\.(\\d{1,3})|)((\\s{0,}(am|pm))|)"));
int at = 0;
while (at < dateString.length()) {
@@ -673,21 +673,23 @@ static QDateTime parseDateString(const QByteArray &dateString)
&& (dateString[at + 2] == ':' || dateString[at + 1] == ':')) {
// While the date can be found all over the string the format
// for the time is set and a nice regexp can be used.
- int pos = timeRx.indexIn(QLatin1String(dateString), at);
+ QRegularExpressionMatch match;
+ int pos = QString::fromLatin1(dateString).indexOf(timeRx, at, &match);
if (pos != -1) {
- QStringList list = timeRx.capturedTexts();
- int h = atoi(list.at(1).toLatin1().constData());
- int m = atoi(list.at(2).toLatin1().constData());
- int s = atoi(list.at(4).toLatin1().constData());
- int ms = atoi(list.at(6).toLatin1().constData());
- if (h < 12 && !list.at(9).isEmpty())
- if (list.at(9) == QLatin1String("pm"))
+ QStringList list = match.capturedTexts();
+ int h = match.captured(1).toInt();
+ int m = match.captured(2).toInt();
+ int s = match.captured(4).toInt();
+ int ms = match.captured(6).toInt();
+ QString ampm = match.captured(9);
+ if (h < 12 && !ampm.isEmpty())
+ if (ampm == QLatin1String("pm"))
h += 12;
time = QTime(h, m, s, ms);
#ifdef PARSEDATESTRINGDEBUG
qDebug() << "Time:" << list << timeRx.matchedLength();
#endif
- at += timeRx.matchedLength();
+ at += match.capturedLength();
continue;
}
}
diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp
index 2a9d281256..d02b209d51 100644
--- a/src/network/access/qnetworkreplyhttpimpl.cpp
+++ b/src/network/access/qnetworkreplyhttpimpl.cpp
@@ -164,21 +164,6 @@ static QHash<QByteArray, QByteArray> parseHttpOptionHeader(const QByteArray &hea
}
}
-#if QT_CONFIG(bearermanagement) // ### Qt6: Remove section
-static bool isSessionNeeded(const QUrl &url)
-{
- if (QNetworkStatusMonitor::isEnabled()) {
- // In case QNetworkStatus/QNetConManager are in business,
- // no session, no bearer manager are involved.
- return false;
- }
- // Connections to the local machine does not require a session
- QString host = url.host().toLower();
- return !QHostAddress(host).isLoopback() && host != QLatin1String("localhost")
- && host != QSysInfo::machineHostName().toLower();
-}
-#endif // bearer management
-
QNetworkReplyHttpImpl::QNetworkReplyHttpImpl(QNetworkAccessManager* const manager,
const QNetworkRequest& request,
QNetworkAccessManager::Operation& operation,
@@ -775,9 +760,6 @@ void QNetworkReplyHttpImplPrivate::postRequest(const QNetworkRequest &newHttpReq
if (newHttpRequest.attribute(QNetworkRequest::HttpPipeliningAllowedAttribute).toBool())
httpRequest.setPipeliningAllowed(true);
- if (request.attribute(QNetworkRequest::SpdyAllowedAttribute).toBool())
- httpRequest.setSPDYAllowed(true);
-
if (request.attribute(QNetworkRequest::Http2AllowedAttribute).toBool())
httpRequest.setHTTP2Allowed(true);
@@ -801,10 +783,6 @@ void QNetworkReplyHttpImplPrivate::postRequest(const QNetworkRequest &newHttpReq
QHttpThreadDelegate *delegate = new QHttpThreadDelegate;
// Propagate Http/2 settings:
delegate->http2Parameters = request.http2Configuration();
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- if (!QNetworkStatusMonitor::isEnabled())
- delegate->networkSession = managerPrivate->getNetworkSession();
-#endif
// For the synchronous HTTP, this is the normal way the delegate gets deleted
// For the asynchronous HTTP this is a safety measure, the delegate deletes itself when HTTP is finished
@@ -969,7 +947,7 @@ void QNetworkReplyHttpImplPrivate::postRequest(const QNetworkRequest &newHttpReq
QSharedPointer<char>(),
delegate->incomingContentLength,
delegate->removedContentLength,
- delegate->isSpdyUsed);
+ delegate->isHttp2Used);
replyDownloadData(delegate->synchronousDownloadData);
httpError(delegate->incomingErrorCode, delegate->incomingErrorDetail);
} else {
@@ -981,7 +959,7 @@ void QNetworkReplyHttpImplPrivate::postRequest(const QNetworkRequest &newHttpReq
QSharedPointer<char>(),
delegate->incomingContentLength,
delegate->removedContentLength,
- delegate->isSpdyUsed);
+ delegate->isHttp2Used);
replyDownloadData(delegate->synchronousDownloadData);
}
@@ -1209,24 +1187,6 @@ void QNetworkReplyHttpImplPrivate::followRedirect()
if (managerPrivate->thread)
managerPrivate->thread->disconnect();
-#if QT_CONFIG(bearermanagement) // ### Qt6: Remove section
- // If the original request didn't need a session (i.e. it was to localhost)
- // then we might not have a session open, to which to redirect, if the
- // new URL is remote. When this happens, we need to open the session now:
- if (isSessionNeeded(url)) {
- if (auto session = managerPrivate->getNetworkSession()) {
- if (session->state() != QNetworkSession::State::Connected || !session->isOpen()) {
- startWaitForSession(session);
- // Need to set 'request' to the redirectRequest so that when QNAM restarts
- // the request after the session starts it will not repeat the previous request.
- request = redirectRequest;
- // Return now, QNAM will start the request when the session has started.
- return;
- }
- }
- }
-#endif // bearer management
-
QMetaObject::invokeMethod(q, "start", Qt::QueuedConnection,
Q_ARG(QNetworkRequest, redirectRequest));
}
@@ -1256,7 +1216,7 @@ void QNetworkReplyHttpImplPrivate::replyDownloadMetaData(const QList<QPair<QByte
QSharedPointer<char> db,
qint64 contentLength,
qint64 removedContentLength,
- bool spdyWasUsed)
+ bool h2Used)
{
Q_Q(QNetworkReplyHttpImpl);
Q_UNUSED(contentLength);
@@ -1282,16 +1242,7 @@ void QNetworkReplyHttpImplPrivate::replyDownloadMetaData(const QList<QPair<QByte
}
q->setAttribute(QNetworkRequest::HttpPipeliningWasUsedAttribute, pu);
- const QVariant http2Allowed = request.attribute(QNetworkRequest::Http2AllowedAttribute);
- const QVariant http2Direct = request.attribute(QNetworkRequest::Http2DirectAttribute);
- if ((http2Allowed.isValid() && http2Allowed.toBool())
- || (http2Direct.isValid() && http2Direct.toBool())) {
- q->setAttribute(QNetworkRequest::Http2WasUsedAttribute, spdyWasUsed);
- q->setAttribute(QNetworkRequest::SpdyWasUsedAttribute, false);
- } else {
- q->setAttribute(QNetworkRequest::SpdyWasUsedAttribute, spdyWasUsed);
- q->setAttribute(QNetworkRequest::Http2WasUsedAttribute, false);
- }
+ q->setAttribute(QNetworkRequest::Http2WasUsedAttribute, h2Used);
// reconstruct the HTTP header
QList<QPair<QByteArray, QByteArray> > headerMap = hm;
@@ -1794,68 +1745,9 @@ void QNetworkReplyHttpImplPrivate::setResumeOffset(quint64 offset)
*/
bool QNetworkReplyHttpImplPrivate::start(const QNetworkRequest &newHttpRequest)
{
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- QSharedPointer<QNetworkSession> networkSession(managerPrivate->getNetworkSession());
- if (!networkSession || QNetworkStatusMonitor::isEnabled()) {
-#endif
- postRequest(newHttpRequest);
- return true;
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- }
-
- // This is not ideal.
- if (!isSessionNeeded(url)) {
- // Don't need to check for an open session if we don't need one.
- postRequest(newHttpRequest);
- return true;
- }
-
- if (networkSession->isOpen() &&
- networkSession->state() == QNetworkSession::Connected) {
- Q_Q(QNetworkReplyHttpImpl);
- QObject::connect(networkSession.data(), SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)),
- q, SLOT(_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies)));
- postRequest(newHttpRequest);
- return true;
- } else if (synchronous) {
- // Command line applications using the synchronous path such as xmlpatterns may need an extra push.
- networkSession->open();
- if (networkSession->waitForOpened()) {
- postRequest(newHttpRequest);
- return true;
- }
- }
- return false;
-#endif
-}
-
-#if QT_CONFIG(bearermanagement) // ### Qt6: Remove section
-bool QNetworkReplyHttpImplPrivate::startWaitForSession(QSharedPointer<QNetworkSession> &session)
-{
- Q_Q(QNetworkReplyHttpImpl);
- state = WaitingForSession;
-
- if (session) {
- QObject::connect(session.data(), SIGNAL(error(QNetworkSession::SessionError)),
- q, SLOT(_q_networkSessionFailed()), Qt::QueuedConnection);
-
- if (!session->isOpen()) {
- QVariant isBackground = request.attribute(QNetworkRequest::BackgroundRequestAttribute,
- QVariant::fromValue(false));
- session->setSessionProperty(QStringLiteral("ConnectInBackground"), isBackground);
- session->open();
- }
- return true;
- }
- const Qt::ConnectionType connection = synchronous ? Qt::DirectConnection : Qt::QueuedConnection;
- qWarning("Backend is waiting for QNetworkSession to connect, but there is none!");
- QMetaObject::invokeMethod(q, "_q_error", connection,
- Q_ARG(QNetworkReply::NetworkError, QNetworkReply::NetworkSessionFailedError),
- Q_ARG(QString, QCoreApplication::translate("QNetworkReply", "Network session error.")));
- QMetaObject::invokeMethod(q, "_q_finished", connection);
- return false;
+ postRequest(newHttpRequest);
+ return true;
}
-#endif // QT_CONFIG(bearermanagement)
void QNetworkReplyHttpImplPrivate::_q_startOperation()
{
@@ -1865,31 +1757,7 @@ void QNetworkReplyHttpImplPrivate::_q_startOperation()
state = Working;
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- // Do not start background requests if they are not allowed by session policy
- QSharedPointer<QNetworkSession> session(manager->d_func()->getNetworkSession());
- QVariant isBackground = request.attribute(QNetworkRequest::BackgroundRequestAttribute, QVariant::fromValue(false));
- if (isBackground.toBool() && session && session->usagePolicies().testFlag(QNetworkSession::NoBackgroundTrafficPolicy)) {
- QMetaObject::invokeMethod(q, "_q_error", synchronous ? Qt::DirectConnection : Qt::QueuedConnection,
- Q_ARG(QNetworkReply::NetworkError, QNetworkReply::BackgroundRequestNotAllowedError),
- Q_ARG(QString, QCoreApplication::translate("QNetworkReply", "Background request not allowed.")));
- QMetaObject::invokeMethod(q, "_q_finished", synchronous ? Qt::DirectConnection : Qt::QueuedConnection);
- return;
- }
-
- if (!start(request)) {
- // backend failed to start because the session state is not Connected.
- // QNetworkAccessManager will call reply->backend->start() again for us when the session
- // state changes.
- if (!startWaitForSession(session))
- return;
- } else if (session && !QNetworkStatusMonitor::isEnabled()) {
- QObject::connect(session.data(), SIGNAL(stateChanged(QNetworkSession::State)),
- q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)),
- Qt::QueuedConnection);
- }
-#else
- if (!start(request)) {
+ if (!start(request)) { // @todo next commit: cleanup, start now always returns true
qWarning("Backend start failed");
QMetaObject::invokeMethod(q, "_q_error", synchronous ? Qt::DirectConnection : Qt::QueuedConnection,
Q_ARG(QNetworkReply::NetworkError, QNetworkReply::UnknownNetworkError),
@@ -1897,7 +1765,6 @@ void QNetworkReplyHttpImplPrivate::_q_startOperation()
QMetaObject::invokeMethod(q, "_q_finished", synchronous ? Qt::DirectConnection : Qt::QueuedConnection);
return;
}
-#endif // QT_NO_BEARERMANAGEMENT
setupTransferTimeout();
if (synchronous) {
@@ -2061,80 +1928,6 @@ void QNetworkReplyHttpImplPrivate::setupTransferTimeout()
}
}
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
-void QNetworkReplyHttpImplPrivate::_q_networkSessionConnected()
-{
- Q_Q(QNetworkReplyHttpImpl);
- Q_ASSERT(managerPrivate);
-
- QSharedPointer<QNetworkSession> session = managerPrivate->getNetworkSession();
- if (!session)
- return;
-
- if (session->state() != QNetworkSession::Connected)
- return;
-
- switch (state) {
- case QNetworkReplyPrivate::Buffering:
- case QNetworkReplyPrivate::Working:
- case QNetworkReplyPrivate::Reconnecting:
- // Migrate existing downloads to new network connection.
- migrateBackend();
- break;
- case QNetworkReplyPrivate::WaitingForSession:
- // Start waiting requests.
- QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection);
- break;
- default:
- ;
- }
-}
-
-void QNetworkReplyHttpImplPrivate::_q_networkSessionStateChanged(QNetworkSession::State sessionState)
-{
- if (sessionState == QNetworkSession::Disconnected
- && state != Idle && state != Reconnecting) {
- error(QNetworkReplyImpl::NetworkSessionFailedError,
- QCoreApplication::translate("QNetworkReply", "Network session error."));
- finished();
- }
-}
-
-void QNetworkReplyHttpImplPrivate::_q_networkSessionFailed()
-{
- // Abort waiting and working replies.
- if (state == WaitingForSession || state == Working) {
- state = Working;
- QSharedPointer<QNetworkSession> session(manager->d_func()->getNetworkSession());
- QString errorStr;
- if (session)
- errorStr = session->errorString();
- else
- errorStr = QCoreApplication::translate("QNetworkReply", "Network session error.");
- error(QNetworkReplyImpl::NetworkSessionFailedError, errorStr);
- finished();
- }
-}
-
-void QNetworkReplyHttpImplPrivate::_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies newPolicies)
-{
- if (request.attribute(QNetworkRequest::BackgroundRequestAttribute).toBool()) {
- if (newPolicies & QNetworkSession::NoBackgroundTrafficPolicy) {
- // Abort waiting and working replies.
- if (state == WaitingForSession || state == Working) {
- state = Working;
- error(QNetworkReply::BackgroundRequestNotAllowedError,
- QCoreApplication::translate("QNetworkReply", "Background request not allowed."));
- finished();
- }
- // ### if canResume(), then we could resume automatically
- }
- }
-
-}
-#endif
-
-
// need to have this function since the reply is a private member variable
// and the special backends need to access this.
void QNetworkReplyHttpImplPrivate::emitReplyUploadProgress(qint64 bytesSent, qint64 bytesTotal)
@@ -2197,28 +1990,6 @@ void QNetworkReplyHttpImplPrivate::finished()
if (preMigrationDownloaded != Q_INT64_C(-1))
totalSize = totalSize.toLongLong() + preMigrationDownloaded;
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- Q_ASSERT(managerPrivate);
- QSharedPointer<QNetworkSession> session = managerPrivate->getNetworkSession();
- if (!QNetworkStatusMonitor::isEnabled() && session && session->state() == QNetworkSession::Roaming &&
- state == Working && errorCode != QNetworkReply::OperationCanceledError) {
- // only content with a known size will fail with a temporary network failure error
- if (!totalSize.isNull()) {
- if (bytesDownloaded != totalSize) {
- if (migrateBackend()) {
- // either we are migrating or the request is finished/aborted
- if (state == Reconnecting || state == WaitingForSession) {
- return; // exit early if we are migrating.
- }
- } else {
- error(QNetworkReply::TemporaryNetworkFailureError,
- QNetworkReply::tr("Temporary network failure."));
- }
- }
- }
- }
-#endif
-
// if we don't know the total size of or we received everything save the cache
if (totalSize.isNull() || totalSize == -1 || bytesDownloaded == totalSize)
completeCacheSave();
diff --git a/src/network/access/qnetworkreplyhttpimpl_p.h b/src/network/access/qnetworkreplyhttpimpl_p.h
index c4de63990b..eef4b13d12 100644
--- a/src/network/access/qnetworkreplyhttpimpl_p.h
+++ b/src/network/access/qnetworkreplyhttpimpl_p.h
@@ -66,7 +66,6 @@
#include <private/qhttpnetworkrequest_p.h>
#include <private/qnetworkreply_p.h>
#include <QtNetwork/QNetworkProxy>
-#include <QtNetwork/QNetworkSession> // ### Qt6: Remove include
#ifndef QT_NO_SSL
#include <QtNetwork/QSslConfiguration>
@@ -102,12 +101,6 @@ public:
Q_PRIVATE_SLOT(d_func(), void _q_bufferOutgoingData())
Q_PRIVATE_SLOT(d_func(), void _q_bufferOutgoingDataFinished())
Q_PRIVATE_SLOT(d_func(), void _q_transferTimedOut())
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionConnected())
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionFailed())
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionStateChanged(QNetworkSession::State))
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies))
-#endif
Q_PRIVATE_SLOT(d_func(), void _q_finished())
Q_PRIVATE_SLOT(d_func(), void _q_error(QNetworkReply::NetworkError, const QString &))
@@ -162,10 +155,6 @@ signals:
class QNetworkReplyHttpImplPrivate: public QNetworkReplyPrivate
{
-#if QT_CONFIG(bearermanagement) // ### Qt6: Remove section
- bool startWaitForSession(QSharedPointer<QNetworkSession> &session);
-#endif
-
public:
static QHttpNetworkRequest::Priority convert(const QNetworkRequest::Priority& prio);
@@ -186,12 +175,6 @@ public:
void _q_transferTimedOut();
void setupTransferTimeout();
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- void _q_networkSessionConnected();
- void _q_networkSessionFailed();
- void _q_networkSessionStateChanged(QNetworkSession::State);
- void _q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies);
-#endif
void _q_finished();
void finished();
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index a0b4ace470..b0674823f7 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -45,7 +45,6 @@
#include "QtCore/qcoreapplication.h"
#include "QtCore/qdatetime.h"
#include "QtNetwork/qsslconfiguration.h"
-#include "QtNetwork/qnetworksession.h" // ### Qt6: Remove include
#include "qnetworkaccessmanager_p.h"
#include <QtCore/QCoreApplication>
@@ -81,6 +80,7 @@ void QNetworkReplyImplPrivate::_q_startOperation()
// note: if that method is called directly, it cannot happen that the backend is 0,
// because we just checked via a qobject_cast that we got a http backend (see
// QNetworkReplyImplPrivate::setup())
+ qDebug() << "backend:" << backend; // @temp
if (!backend) {
error(QNetworkReplyImpl::ProtocolUnknownError,
QCoreApplication::translate("QNetworkReply", "Protocol \"%1\" is unknown").arg(url.scheme())); // not really true!;
@@ -88,66 +88,15 @@ void QNetworkReplyImplPrivate::_q_startOperation()
return;
}
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- Q_Q(QNetworkReplyImpl);
- // Do not start background requests if they are not allowed by session policy
- QSharedPointer<QNetworkSession> session(manager->d_func()->getNetworkSession());
- QVariant isBackground = backend->request().attribute(QNetworkRequest::BackgroundRequestAttribute, QVariant::fromValue(false));
- if (isBackground.toBool() && session && session->usagePolicies().testFlag(QNetworkSession::NoBackgroundTrafficPolicy)) {
- error(QNetworkReply::BackgroundRequestNotAllowedError,
- QCoreApplication::translate("QNetworkReply", "Background request not allowed."));
- finished();
- return;
- }
-#endif
-
if (!backend->start()) {
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- // backend failed to start because the session state is not Connected.
- // QNetworkAccessManager will call _q_startOperation again for us when the session
- // state changes.
- state = WaitingForSession;
-
- if (session) {
- QObject::connect(session.data(), SIGNAL(error(QNetworkSession::SessionError)),
- q, SLOT(_q_networkSessionFailed()));
-
- if (!session->isOpen()) {
- session->setSessionProperty(QStringLiteral("ConnectInBackground"), isBackground);
- session->open();
- }
- } else {
- qWarning("Backend is waiting for QNetworkSession to connect, but there is none!");
- state = Working;
- error(QNetworkReplyImpl::NetworkSessionFailedError,
- QCoreApplication::translate("QNetworkReply", "Network session error."));
- finished();
- }
-#else
qWarning("Backend start failed");
state = Working;
error(QNetworkReplyImpl::UnknownNetworkError,
QCoreApplication::translate("QNetworkReply", "backend start error."));
finished();
-#endif
return;
- } else {
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- if (session) {
- QObject::connect(session.data(), SIGNAL(stateChanged(QNetworkSession::State)),
- q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)), Qt::QueuedConnection);
- }
-#endif
}
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- if (session) {
- //get notification of policy changes.
- QObject::connect(session.data(), SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)),
- q, SLOT(_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies)));
- }
-#endif
-
// Prepare timer for progress notifications
downloadProgressSignalChoke.start();
uploadProgressSignalChoke.invalidate();
@@ -287,80 +236,6 @@ void QNetworkReplyImplPrivate::_q_bufferOutgoingData()
}
}
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
-void QNetworkReplyImplPrivate::_q_networkSessionConnected()
-{
- Q_Q(QNetworkReplyImpl);
-
- if (manager.isNull())
- return;
-
- QSharedPointer<QNetworkSession> session = manager->d_func()->getNetworkSession();
- if (!session)
- return;
-
- if (session->state() != QNetworkSession::Connected)
- return;
-
- switch (state) {
- case QNetworkReplyPrivate::Buffering:
- case QNetworkReplyPrivate::Working:
- case QNetworkReplyPrivate::Reconnecting:
- // Migrate existing downloads to new network connection.
- migrateBackend();
- break;
- case QNetworkReplyPrivate::WaitingForSession:
- // Start waiting requests.
- QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection);
- break;
- default:
- ;
- }
-}
-
-void QNetworkReplyImplPrivate::_q_networkSessionStateChanged(QNetworkSession::State sessionState)
-{
- if (sessionState == QNetworkSession::Disconnected
- && state != Idle && state != Reconnecting) {
- error(QNetworkReplyImpl::NetworkSessionFailedError,
- QCoreApplication::translate("QNetworkReply", "Network session error."));
- finished();
- }
-}
-
-void QNetworkReplyImplPrivate::_q_networkSessionFailed()
-{
- // Abort waiting and working replies.
- if (state == WaitingForSession || state == Working) {
- state = Working;
- QSharedPointer<QNetworkSession> session(manager->d_func()->getNetworkSession());
- QString errorStr;
- if (session)
- errorStr = session->errorString();
- else
- errorStr = QCoreApplication::translate("QNetworkReply", "Network session error.");
- error(QNetworkReplyImpl::NetworkSessionFailedError, errorStr);
- finished();
- }
-}
-
-void QNetworkReplyImplPrivate::_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies newPolicies)
-{
- if (backend->request().attribute(QNetworkRequest::BackgroundRequestAttribute).toBool()) {
- if (newPolicies & QNetworkSession::NoBackgroundTrafficPolicy) {
- // Abort waiting and working replies.
- if (state == WaitingForSession || state == Working) {
- state = Working;
- error(QNetworkReply::BackgroundRequestNotAllowedError,
- QCoreApplication::translate("QNetworkReply", "Background request not allowed."));
- finished();
- }
- // ### if backend->canResume(), then we could resume automatically, however no backend supports resuming
- }
- }
-}
-#endif
-
void QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation op, const QNetworkRequest &req,
QIODevice *data)
{
@@ -786,29 +661,6 @@ void QNetworkReplyImplPrivate::finished()
if (preMigrationDownloaded != Q_INT64_C(-1))
totalSize = totalSize.toLongLong() + preMigrationDownloaded;
- if (!manager.isNull()) {
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- QSharedPointer<QNetworkSession> session (manager->d_func()->getNetworkSession());
- if (session && session->state() == QNetworkSession::Roaming &&
- state == Working && errorCode != QNetworkReply::OperationCanceledError) {
- // only content with a known size will fail with a temporary network failure error
- if (!totalSize.isNull()) {
- if (bytesDownloaded != totalSize) {
- if (migrateBackend()) {
- // either we are migrating or the request is finished/aborted
- if (state == Reconnecting || state == WaitingForSession) {
- resumeNotificationHandling();
- return; // exit early if we are migrating.
- }
- } else {
- error(QNetworkReply::TemporaryNetworkFailureError,
- QNetworkReply::tr("Temporary network failure."));
- }
- }
- }
- }
-#endif
- }
resumeNotificationHandling();
state = Finished;
diff --git a/src/network/access/qnetworkreplyimpl_p.h b/src/network/access/qnetworkreplyimpl_p.h
index f98f773775..6a100d9a03 100644
--- a/src/network/access/qnetworkreplyimpl_p.h
+++ b/src/network/access/qnetworkreplyimpl_p.h
@@ -62,7 +62,6 @@
#include "private/qringbuffer_p.h"
#include "private/qbytedata_p.h"
#include <QSharedPointer>
-#include <QtNetwork/QNetworkSession> // ### Qt6: Remove include
QT_BEGIN_NAMESPACE
@@ -92,12 +91,6 @@ public:
Q_PRIVATE_SLOT(d_func(), void _q_copyReadChannelFinished())
Q_PRIVATE_SLOT(d_func(), void _q_bufferOutgoingData())
Q_PRIVATE_SLOT(d_func(), void _q_bufferOutgoingDataFinished())
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionConnected())
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionFailed())
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionStateChanged(QNetworkSession::State))
- Q_PRIVATE_SLOT(d_func(), void _q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies))
-#endif
#ifndef QT_NO_SSL
protected:
@@ -124,12 +117,6 @@ public:
void _q_copyReadChannelFinished();
void _q_bufferOutgoingData();
void _q_bufferOutgoingDataFinished();
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- void _q_networkSessionConnected();
- void _q_networkSessionFailed();
- void _q_networkSessionStateChanged(QNetworkSession::State);
- void _q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies);
-#endif
void setup(QNetworkAccessManager::Operation op, const QNetworkRequest &request,
QIODevice *outgoingData);
diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp
index 6cd56499c5..f8cb3feb69 100644
--- a/src/network/access/qnetworkrequest.cpp
+++ b/src/network/access/qnetworkrequest.cpp
@@ -269,20 +269,6 @@ QT_BEGIN_NAMESPACE
Indicates that this is a background transfer, rather than a user initiated
transfer. Depending on the platform, background transfers may be subject
to different policies.
- The QNetworkSession ConnectInBackground property will be set according to
- this attribute.
-
- \value SpdyAllowedAttribute
- Requests only, type: QMetaType::Bool (default: false)
- Indicates whether the QNetworkAccessManager code is
- allowed to use SPDY with this request. This applies only
- to SSL requests, and depends on the server supporting SPDY.
- Obsolete, use Http2 instead of Spdy.
-
- \value SpdyWasUsedAttribute
- Replies only, type: QMetaType::Bool
- Indicates whether SPDY was used for receiving
- this reply. Obsolete, use Http2 instead of Spdy.
\value Http2AllowedAttribute
Requests only, type: QMetaType::Bool (default: false)
@@ -295,12 +281,6 @@ QT_BEGIN_NAMESPACE
Indicates whether HTTP/2 was used for receiving this reply.
(This value was introduced in 5.9.)
- \value HTTP2AllowedAttribute
- Obsolete alias for Http2AllowedAttribute.
-
- \value HTTP2WasUsedAttribute
- Obsolete alias for Http2WasUsedAttribute.
-
\value EmitAllUploadProgressSignalsAttribute
Requests only, type: QMetaType::Bool (default: false)
Indicates whether all upload signals should be emitted.
diff --git a/src/network/access/qnetworkrequest.h b/src/network/access/qnetworkrequest.h
index 66b9a43e01..035b5b378a 100644
--- a/src/network/access/qnetworkrequest.h
+++ b/src/network/access/qnetworkrequest.h
@@ -89,18 +89,10 @@ public:
DownloadBufferAttribute, // internal
SynchronousRequestAttribute, // internal
BackgroundRequestAttribute,
-#if QT_DEPRECATED_SINCE(5, 15)
- SpdyAllowedAttribute,
- SpdyWasUsedAttribute,
-#endif // QT_DEPRECATED_SINCE(5, 15)
EmitAllUploadProgressSignalsAttribute = BackgroundRequestAttribute + 3,
FollowRedirectsAttribute,
Http2AllowedAttribute,
Http2WasUsedAttribute,
-#if QT_DEPRECATED_SINCE(5, 15)
- HTTP2AllowedAttribute Q_DECL_ENUMERATOR_DEPRECATED_X("Use Http2AllowedAttribute") = Http2AllowedAttribute,
- HTTP2WasUsedAttribute Q_DECL_ENUMERATOR_DEPRECATED_X("Use Http2WasUsedAttribute"),
-#endif // QT_DEPRECATED_SINCE(5, 15)
OriginalContentLengthAttribute,
RedirectPolicyAttribute,
Http2DirectAttribute,
diff --git a/src/network/access/qspdyprotocolhandler.cpp b/src/network/access/qspdyprotocolhandler.cpp
deleted file mode 100644
index eef8df288d..0000000000
--- a/src/network/access/qspdyprotocolhandler.cpp
+++ /dev/null
@@ -1,1304 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <private/qspdyprotocolhandler_p.h>
-#include <private/qnoncontiguousbytedevice_p.h>
-#include <private/qhttpnetworkconnectionchannel_p.h>
-#include <QtCore/QtEndian>
-
-#if !defined(QT_NO_SSL)
-
-QT_BEGIN_NAMESPACE
-
-static const char spdyDictionary[] = {
- 0x00, 0x00, 0x00, 0x07, 0x6f, 0x70, 0x74, 0x69, // ....opti
- 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x04, 0x68, // ons....h
- 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x04, 0x70, // ead....p
- 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x70, // ost....p
- 0x75, 0x74, 0x00, 0x00, 0x00, 0x06, 0x64, 0x65, // ut....de
- 0x6c, 0x65, 0x74, 0x65, 0x00, 0x00, 0x00, 0x05, // lete....
- 0x74, 0x72, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00, // trace...
- 0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x00, // .accept.
- 0x00, 0x00, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, // ...accep
- 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, // t-charse
- 0x74, 0x00, 0x00, 0x00, 0x0f, 0x61, 0x63, 0x63, // t....acc
- 0x65, 0x70, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f, // ept-enco
- 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x0f, // ding....
- 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x6c, // accept-l
- 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, // anguage.
- 0x00, 0x00, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70, // ...accep
- 0x74, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, // t-ranges
- 0x00, 0x00, 0x00, 0x03, 0x61, 0x67, 0x65, 0x00, // ....age.
- 0x00, 0x00, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77, // ...allow
- 0x00, 0x00, 0x00, 0x0d, 0x61, 0x75, 0x74, 0x68, // ....auth
- 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, // orizatio
- 0x6e, 0x00, 0x00, 0x00, 0x0d, 0x63, 0x61, 0x63, // n....cac
- 0x68, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, // he-contr
- 0x6f, 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f, // ol....co
- 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, // nnection
- 0x00, 0x00, 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, // ....cont
- 0x65, 0x6e, 0x74, 0x2d, 0x62, 0x61, 0x73, 0x65, // ent-base
- 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, 0x6e, 0x74, // ....cont
- 0x65, 0x6e, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f, // ent-enco
- 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, // ding....
- 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, // content-
- 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, // language
- 0x00, 0x00, 0x00, 0x0e, 0x63, 0x6f, 0x6e, 0x74, // ....cont
- 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, // ent-leng
- 0x74, 0x68, 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, // th....co
- 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x6f, // ntent-lo
- 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, // cation..
- 0x00, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, // ..conten
- 0x74, 0x2d, 0x6d, 0x64, 0x35, 0x00, 0x00, 0x00, // t-md5...
- 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, // .content
- 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, // -range..
- 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, // ..conten
- 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x00, 0x00, // t-type..
- 0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x00, 0x00, // ..date..
- 0x00, 0x04, 0x65, 0x74, 0x61, 0x67, 0x00, 0x00, // ..etag..
- 0x00, 0x06, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, // ..expect
- 0x00, 0x00, 0x00, 0x07, 0x65, 0x78, 0x70, 0x69, // ....expi
- 0x72, 0x65, 0x73, 0x00, 0x00, 0x00, 0x04, 0x66, // res....f
- 0x72, 0x6f, 0x6d, 0x00, 0x00, 0x00, 0x04, 0x68, // rom....h
- 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x08, 0x69, // ost....i
- 0x66, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, // f-match.
- 0x00, 0x00, 0x11, 0x69, 0x66, 0x2d, 0x6d, 0x6f, // ...if-mo
- 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2d, 0x73, // dified-s
- 0x69, 0x6e, 0x63, 0x65, 0x00, 0x00, 0x00, 0x0d, // ince....
- 0x69, 0x66, 0x2d, 0x6e, 0x6f, 0x6e, 0x65, 0x2d, // if-none-
- 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x00, 0x00, // match...
- 0x08, 0x69, 0x66, 0x2d, 0x72, 0x61, 0x6e, 0x67, // .if-rang
- 0x65, 0x00, 0x00, 0x00, 0x13, 0x69, 0x66, 0x2d, // e....if-
- 0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, // unmodifi
- 0x65, 0x64, 0x2d, 0x73, 0x69, 0x6e, 0x63, 0x65, // ed-since
- 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x61, 0x73, 0x74, // ....last
- 0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, // -modifie
- 0x64, 0x00, 0x00, 0x00, 0x08, 0x6c, 0x6f, 0x63, // d....loc
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, // ation...
- 0x0c, 0x6d, 0x61, 0x78, 0x2d, 0x66, 0x6f, 0x72, // .max-for
- 0x77, 0x61, 0x72, 0x64, 0x73, 0x00, 0x00, 0x00, // wards...
- 0x06, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x00, // .pragma.
- 0x00, 0x00, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, // ...proxy
- 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, // -authent
- 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, // icate...
- 0x13, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61, // .proxy-a
- 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, // uthoriza
- 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x05, // tion....
- 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, 0x00, // range...
- 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, // .referer
- 0x00, 0x00, 0x00, 0x0b, 0x72, 0x65, 0x74, 0x72, // ....retr
- 0x79, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x00, // y-after.
- 0x00, 0x00, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, // ...serve
- 0x72, 0x00, 0x00, 0x00, 0x02, 0x74, 0x65, 0x00, // r....te.
- 0x00, 0x00, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, // ...trail
- 0x65, 0x72, 0x00, 0x00, 0x00, 0x11, 0x74, 0x72, // er....tr
- 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, 0x65, // ansfer-e
- 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x00, // ncoding.
- 0x00, 0x00, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, // ...upgra
- 0x64, 0x65, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x73, // de....us
- 0x65, 0x72, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, // er-agent
- 0x00, 0x00, 0x00, 0x04, 0x76, 0x61, 0x72, 0x79, // ....vary
- 0x00, 0x00, 0x00, 0x03, 0x76, 0x69, 0x61, 0x00, // ....via.
- 0x00, 0x00, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, // ...warni
- 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, 0x77, 0x77, // ng....ww
- 0x77, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, // w-authen
- 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, // ticate..
- 0x00, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, // ..method
- 0x00, 0x00, 0x00, 0x03, 0x67, 0x65, 0x74, 0x00, // ....get.
- 0x00, 0x00, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, // ...statu
- 0x73, 0x00, 0x00, 0x00, 0x06, 0x32, 0x30, 0x30, // s....200
- 0x20, 0x4f, 0x4b, 0x00, 0x00, 0x00, 0x07, 0x76, // .OK....v
- 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x00, // ersion..
- 0x00, 0x08, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, // ..HTTP.1
- 0x2e, 0x31, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72, // .1....ur
- 0x6c, 0x00, 0x00, 0x00, 0x06, 0x70, 0x75, 0x62, // l....pub
- 0x6c, 0x69, 0x63, 0x00, 0x00, 0x00, 0x0a, 0x73, // lic....s
- 0x65, 0x74, 0x2d, 0x63, 0x6f, 0x6f, 0x6b, 0x69, // et-cooki
- 0x65, 0x00, 0x00, 0x00, 0x0a, 0x6b, 0x65, 0x65, // e....kee
- 0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x00, // p-alive.
- 0x00, 0x00, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, // ...origi
- 0x6e, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x32, // n1001012
- 0x30, 0x31, 0x32, 0x30, 0x32, 0x32, 0x30, 0x35, // 01202205
- 0x32, 0x30, 0x36, 0x33, 0x30, 0x30, 0x33, 0x30, // 20630030
- 0x32, 0x33, 0x30, 0x33, 0x33, 0x30, 0x34, 0x33, // 23033043
- 0x30, 0x35, 0x33, 0x30, 0x36, 0x33, 0x30, 0x37, // 05306307
- 0x34, 0x30, 0x32, 0x34, 0x30, 0x35, 0x34, 0x30, // 40240540
- 0x36, 0x34, 0x30, 0x37, 0x34, 0x30, 0x38, 0x34, // 64074084
- 0x30, 0x39, 0x34, 0x31, 0x30, 0x34, 0x31, 0x31, // 09410411
- 0x34, 0x31, 0x32, 0x34, 0x31, 0x33, 0x34, 0x31, // 41241341
- 0x34, 0x34, 0x31, 0x35, 0x34, 0x31, 0x36, 0x34, // 44154164
- 0x31, 0x37, 0x35, 0x30, 0x32, 0x35, 0x30, 0x34, // 17502504
- 0x35, 0x30, 0x35, 0x32, 0x30, 0x33, 0x20, 0x4e, // 505203.N
- 0x6f, 0x6e, 0x2d, 0x41, 0x75, 0x74, 0x68, 0x6f, // on-Autho
- 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, // ritative
- 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, // .Informa
- 0x74, 0x69, 0x6f, 0x6e, 0x32, 0x30, 0x34, 0x20, // tion204.
- 0x4e, 0x6f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65, // No.Conte
- 0x6e, 0x74, 0x33, 0x30, 0x31, 0x20, 0x4d, 0x6f, // nt301.Mo
- 0x76, 0x65, 0x64, 0x20, 0x50, 0x65, 0x72, 0x6d, // ved.Perm
- 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x34, // anently4
- 0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52, // 00.Bad.R
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x34, 0x30, // equest40
- 0x31, 0x20, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68, // 1.Unauth
- 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x34, 0x30, // orized40
- 0x33, 0x20, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, // 3.Forbid
- 0x64, 0x65, 0x6e, 0x34, 0x30, 0x34, 0x20, 0x4e, // den404.N
- 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, // ot.Found
- 0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, 0x74, 0x65, // 500.Inte
- 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, // rnal.Ser
- 0x76, 0x65, 0x72, 0x20, 0x45, 0x72, 0x72, 0x6f, // ver.Erro
- 0x72, 0x35, 0x30, 0x31, 0x20, 0x4e, 0x6f, 0x74, // r501.Not
- 0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, // .Impleme
- 0x6e, 0x74, 0x65, 0x64, 0x35, 0x30, 0x33, 0x20, // nted503.
- 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, // Service.
- 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, // Unavaila
- 0x62, 0x6c, 0x65, 0x4a, 0x61, 0x6e, 0x20, 0x46, // bleJan.F
- 0x65, 0x62, 0x20, 0x4d, 0x61, 0x72, 0x20, 0x41, // eb.Mar.A
- 0x70, 0x72, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x4a, // pr.May.J
- 0x75, 0x6e, 0x20, 0x4a, 0x75, 0x6c, 0x20, 0x41, // un.Jul.A
- 0x75, 0x67, 0x20, 0x53, 0x65, 0x70, 0x74, 0x20, // ug.Sept.
- 0x4f, 0x63, 0x74, 0x20, 0x4e, 0x6f, 0x76, 0x20, // Oct.Nov.
- 0x44, 0x65, 0x63, 0x20, 0x30, 0x30, 0x3a, 0x30, // Dec.00.0
- 0x30, 0x3a, 0x30, 0x30, 0x20, 0x4d, 0x6f, 0x6e, // 0.00.Mon
- 0x2c, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x57, // ..Tue..W
- 0x65, 0x64, 0x2c, 0x20, 0x54, 0x68, 0x75, 0x2c, // ed..Thu.
- 0x20, 0x46, 0x72, 0x69, 0x2c, 0x20, 0x53, 0x61, // .Fri..Sa
- 0x74, 0x2c, 0x20, 0x53, 0x75, 0x6e, 0x2c, 0x20, // t..Sun..
- 0x47, 0x4d, 0x54, 0x63, 0x68, 0x75, 0x6e, 0x6b, // GMTchunk
- 0x65, 0x64, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, // ed.text.
- 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x69, 0x6d, 0x61, // html.ima
- 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0x2c, 0x69, // ge.png.i
- 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x67, // mage.jpg
- 0x2c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, // .image.g
- 0x69, 0x66, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, // if.appli
- 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, // cation.x
- 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, // ml.appli
- 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, // cation.x
- 0x68, 0x74, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, 0x6c, // html.xml
- 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, // .text.pl
- 0x61, 0x69, 0x6e, 0x2c, 0x74, 0x65, 0x78, 0x74, // ain.text
- 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, // .javascr
- 0x69, 0x70, 0x74, 0x2c, 0x70, 0x75, 0x62, 0x6c, // ipt.publ
- 0x69, 0x63, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, // icprivat
- 0x65, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65, // emax-age
- 0x3d, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x64, 0x65, // .gzip.de
- 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x64, // flate.sd
- 0x63, 0x68, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, // chcharse
- 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x63, // t.utf-8c
- 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x69, // harset.i
- 0x73, 0x6f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d, // so-8859-
- 0x31, 0x2c, 0x75, 0x74, 0x66, 0x2d, 0x2c, 0x2a, // 1.utf-..
- 0x2c, 0x65, 0x6e, 0x71, 0x3d, 0x30, 0x2e // .enq.0.
-};
-
-// uncomment to debug
-//static void printHex(const QByteArray &ba)
-//{
-// QByteArray hex;
-// QByteArray clearText;
-// for (int a = 0; a < ba.count(); ++a) {
-// QByteArray currentHexChar = QByteArray(1, ba.at(a)).toHex().rightJustified(2, ' ');
-// QByteArray currentChar;
-// if (ba.at(a) >= 32 && ba.at(a) < 126) { // if ASCII, print the letter
-// currentChar = QByteArray(1, ba.at(a));
-// } else {
-// currentChar = " ";
-// }
-// clearText.append(currentChar.rightJustified(2, ' '));
-// hex.append(currentHexChar);
-// hex.append(' ');
-// clearText.append(' ');
-// }
-// int chunkSize = 102; // 12 == 4 bytes per line
-// for (int a = 0; a < hex.count(); a += chunkSize) {
-// qDebug() << hex.mid(a, chunkSize);
-// qDebug() << clearText.mid(a, chunkSize);
-// }
-//}
-
-QSpdyProtocolHandler::QSpdyProtocolHandler(QHttpNetworkConnectionChannel *channel)
- : QObject(nullptr), QAbstractProtocolHandler(channel),
- m_nextStreamID(-1),
- m_maxConcurrentStreams(100), // 100 is recommended in the SPDY RFC
- m_initialWindowSize(0),
- m_waitingForCompleteStream(false)
-{
- m_inflateStream.zalloc = Z_NULL;
- m_inflateStream.zfree = Z_NULL;
- m_inflateStream.opaque = Z_NULL;
- int zlibRet = inflateInit(&m_inflateStream);
- Q_ASSERT(zlibRet == Z_OK);
-
- m_deflateStream.zalloc = Z_NULL;
- m_deflateStream.zfree = Z_NULL;
- m_deflateStream.opaque = Z_NULL;
-
- // Do actually not compress (i.e. compression level = 0)
- // when sending the headers because of the CRIME attack
- zlibRet = deflateInit(&m_deflateStream, /* compression level = */ 0);
- Q_ASSERT(zlibRet == Z_OK);
- Q_UNUSED(zlibRet); // silence -Wunused-variable
-}
-
-QSpdyProtocolHandler::~QSpdyProtocolHandler()
-{
- deflateEnd(&m_deflateStream);
- deflateEnd(&m_inflateStream);
-}
-
-bool QSpdyProtocolHandler::sendRequest()
-{
- Q_ASSERT(!m_reply);
-
- int maxPossibleRequests = m_maxConcurrentStreams - m_inFlightStreams.count();
- Q_ASSERT(maxPossibleRequests >= 0);
- if (maxPossibleRequests == 0)
- return true; // return early if max concurrent requests are exceeded
-
- m_channel->state = QHttpNetworkConnectionChannel::WritingState;
-
- int requestsToSend = qMin(m_channel->spdyRequestsToSend.size(), maxPossibleRequests);
-
- QMultiMap<int, HttpMessagePair>::iterator it = m_channel->spdyRequestsToSend.begin();
- // requests will be ordered by priority (see QMultiMap doc)
- for (int a = 0; a < requestsToSend; ++a) {
- HttpMessagePair currentPair = *it;
- QHttpNetworkRequest currentRequest = currentPair.first;
- QHttpNetworkReply *currentReply = currentPair.second;
-
- currentReply->setSpdyWasUsed(true);
- qint32 streamID = generateNextStreamID();
- m_streamIDs.insert(currentReply, streamID);
-
- currentReply->setRequest(currentRequest);
- currentReply->d_func()->connection = m_connection;
- currentReply->d_func()->connectionChannel = m_channel;
- m_inFlightStreams.insert(streamID, currentPair);
- connect(currentReply, SIGNAL(destroyed(QObject*)), this, SLOT(_q_replyDestroyed(QObject*)));
-
- sendSYN_STREAM(currentPair, streamID, /* associatedToStreamID = */ 0);
- m_channel->spdyRequestsToSend.erase(it++);
- }
- m_channel->state = QHttpNetworkConnectionChannel::IdleState;
- return true;
-}
-
-void QSpdyProtocolHandler::_q_replyDestroyed(QObject* reply)
-{
- qint32 streamID = m_streamIDs.take(reply);
- if (m_inFlightStreams.remove(streamID))
- sendRST_STREAM(streamID, RST_STREAM_CANCEL);
-}
-
-void QSpdyProtocolHandler::_q_receiveReply()
-{
- Q_ASSERT(m_socket);
-
- // only run when the QHttpNetworkConnection is not currently being destructed, e.g.
- // this function is called from _q_disconnected which is called because
- // of ~QHttpNetworkConnectionPrivate
- if (!qobject_cast<QHttpNetworkConnection*>(m_connection)) {
- return;
- }
-
- if (bytesAvailable() < 8)
- return; // cannot read frame headers, wait for more data
-
- char frameHeadersRaw[8];
- if (!readNextChunk(8, frameHeadersRaw))
- return; // this should not happen, we just checked
-
- const QByteArray frameHeaders(frameHeadersRaw, 8); // ### try without memcpy
- if (frameHeadersRaw[0] & 0x80) {
- handleControlFrame(frameHeaders);
- } else {
- handleDataFrame(frameHeaders);
- }
-
- // after handling the current frame, check whether there is more data waiting
- if (m_socket->bytesAvailable() > 0)
- QMetaObject::invokeMethod(m_channel, "_q_receiveReply", Qt::QueuedConnection);
-}
-
-void QSpdyProtocolHandler::_q_readyRead()
-{
- _q_receiveReply();
-}
-
-static qint16 twoBytesToInt(const char *bytes)
-{
- return qFromBigEndian<qint16>(bytes);
-}
-
-static qint32 threeBytesToInt(const char *bytes)
-{
- return qFromBigEndian<qint32>(bytes) >> 8;
-}
-
-static qint32 fourBytesToInt(const char *bytes)
-{
- return qFromBigEndian<qint32>(bytes);
-}
-
-static void appendIntToThreeBytes(char *output, qint32 number)
-{
- qToBigEndian<qint16>(number, output + 1);
- qToBigEndian<qint8>(number >> 16, output);
-}
-
-static void appendIntToFourBytes(char *output, qint32 number)
-{
- qToBigEndian<qint32>(number, output);
-}
-
-static QByteArray intToFourBytes(qint32 number) // ### try to use appendIntToFourBytes where possible
-{
- char data[4];
- qToBigEndian<qint32>(number, data);
- QByteArray ret(data, 4);
- return ret;
-}
-
-static QByteArray intToThreeBytes(qint32 number)
-{
- char data[4];
- qToBigEndian<qint32>(number << 8, data);
- QByteArray ret(data, 3);
- return ret;
-}
-
-static qint32 getStreamID(const char *bytes)
-{
- // eliminate most significant bit; it might be 0 or 1 depending on whether
- // we are dealing with a control or data frame
- return fourBytesToInt(bytes) & 0x3fffffff;
-}
-
-static QByteArray headerField(const QByteArray &name, const QByteArray &value)
-{
- QByteArray ret;
- ret.reserve(name.count() + value.count() + 8); // 4 byte for length each
- ret.append(intToFourBytes(name.count()));
- ret.append(name);
- ret.append(intToFourBytes(value.count()));
- ret.append(value);
- return ret;
-}
-
-bool QSpdyProtocolHandler::uncompressHeader(const QByteArray &input, QByteArray *output)
-{
- const size_t chunkSize = 1024;
- char outputRaw[chunkSize];
- // input bytes will not be changed by zlib, so it is safe to const_cast here
- m_inflateStream.next_in = const_cast<Bytef *>(reinterpret_cast<const Bytef *>(input.constData()));
- m_inflateStream.avail_in = input.count();
- m_inflateStream.total_in = input.count();
- int zlibRet;
-
- do {
- m_inflateStream.next_out = reinterpret_cast<Bytef *>(outputRaw);
- m_inflateStream.avail_out = chunkSize;
- zlibRet = inflate(&m_inflateStream, Z_SYNC_FLUSH);
- if (zlibRet == Z_NEED_DICT) {
- zlibRet = inflateSetDictionary(&m_inflateStream,
- reinterpret_cast<const Bytef*>(spdyDictionary),
- /* dictionaryLength = */ 1423);
- Q_ASSERT(zlibRet == Z_OK);
- continue;
- }
- switch (zlibRet) {
- case Z_BUF_ERROR: {
- if (m_inflateStream.avail_in == 0) {
- int outputSize = chunkSize - m_inflateStream.avail_out;
- output->append(outputRaw, outputSize);
- m_inflateStream.avail_out = chunkSize;
- }
- break;
- }
- case Z_OK: {
- int outputSize = chunkSize - m_inflateStream.avail_out;
- output->append(outputRaw, outputSize);
- break;
- }
- default: {
- qWarning("got unexpected zlib return value: %d", zlibRet);
- return false;
- }
- }
- } while (m_inflateStream.avail_in > 0 && zlibRet != Z_STREAM_END);
-
- Q_ASSERT(m_inflateStream.avail_in == 0);
- return true;
-}
-
-QByteArray QSpdyProtocolHandler::composeHeader(const QHttpNetworkRequest &request)
-{
- QByteArray uncompressedHeader;
- uncompressedHeader.reserve(300); // rough estimate
-
- // calculate additional headers first, because we need to know the size
- // ### do not partially copy the list, but restrict the set header fields
- // in QHttpNetworkConnection
- QVector<QPair<QByteArray, QByteArray> > additionalHeaders;
- for (int a = 0; a < request.header().count(); ++a) {
- QByteArray key = request.header().at(a).first;
- if (key == "Connection" || key == "Host" || key == "Keep-Alive"
- || key == "Proxy-Connection" || key == "Transfer-Encoding")
- continue; // those headers are not valid (section 3.2.1)
- additionalHeaders.append(request.header().at(a));
- }
-
- qint32 numberOfHeaderPairs = 5 + additionalHeaders.count(); // 5 mandatory below + the additional ones
- uncompressedHeader.append(intToFourBytes(numberOfHeaderPairs));
-
- // mandatory header fields:
-
- uncompressedHeader.append(headerField(":method", request.methodName()));
-#ifndef QT_NO_NETWORKPROXY
- bool useProxy = m_connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy;
- uncompressedHeader.append(headerField(":path", request.uri(useProxy)));
-#else
- uncompressedHeader.append(headerField(":path", request.uri(false)));
-#endif
- uncompressedHeader.append(headerField(":version", "HTTP/1.1"));
-
- uncompressedHeader.append(headerField(":host", request.url().authority(QUrl::FullyEncoded | QUrl::RemoveUserInfo).toLatin1()));
-
- uncompressedHeader.append(headerField(":scheme", request.url().scheme().toLatin1()));
-
- // end of mandatory header fields
-
- // now add the additional headers
- for (int a = 0; a < additionalHeaders.count(); ++a) {
- uncompressedHeader.append(headerField(additionalHeaders.at(a).first.toLower(),
- additionalHeaders.at(a).second));
- }
-
- m_deflateStream.total_in = uncompressedHeader.count();
- m_deflateStream.avail_in = uncompressedHeader.count();
- m_deflateStream.next_in = reinterpret_cast<unsigned char *>(uncompressedHeader.data());
- int outputBytes = uncompressedHeader.count() + 30; // 30 bytes of compression header overhead
- m_deflateStream.avail_out = outputBytes;
- unsigned char *out = new unsigned char[outputBytes];
- m_deflateStream.next_out = out;
- int availOutBefore = m_deflateStream.avail_out;
- int zlibRet = deflate(&m_deflateStream, Z_SYNC_FLUSH); // do everything in one go since we use no compression
- int compressedHeaderSize = availOutBefore - m_deflateStream.avail_out;
- Q_ASSERT(zlibRet == Z_OK); // otherwise, we need to allocate more outputBytes
- Q_UNUSED(zlibRet); // silence -Wunused-variable
- Q_ASSERT(m_deflateStream.avail_in == 0);
- QByteArray compressedHeader(reinterpret_cast<char *>(out), compressedHeaderSize);
- delete[] out;
-
- return compressedHeader;
-}
-
-quint64 QSpdyProtocolHandler::bytesAvailable() const
-{
- Q_ASSERT(m_socket);
- return m_spdyBuffer.byteAmount() + m_socket->bytesAvailable();
-}
-
-bool QSpdyProtocolHandler::readNextChunk(qint64 length, char *sink)
-{
- qint64 expectedReadBytes = length;
- qint64 requiredBytesFromBuffer = 0;
-
- if (m_waitingForCompleteStream) {
- requiredBytesFromBuffer = qMin(length, m_spdyBuffer.byteAmount());
- // ### if next chunk from buffer bigger than what we want to read,
- // we have to call read() (which memcpy's). Otherwise, we can just
- // read the next chunk without memcpy'ing.
- qint64 bytesReadFromBuffer = m_spdyBuffer.read(sink, requiredBytesFromBuffer);
- Q_ASSERT(bytesReadFromBuffer == requiredBytesFromBuffer);
- if (length <= bytesReadFromBuffer) {
- return true; // buffer > required size -> no need to read from socket
- }
- expectedReadBytes -= requiredBytesFromBuffer;
- }
- qint64 readBytes = m_socket->read(sink + requiredBytesFromBuffer, expectedReadBytes);
-
- if (readBytes < expectedReadBytes) {
- m_waitingForCompleteStream = true;
- // ### this is inefficient, we should not put back so much data into the buffer
- QByteArray temp(sink, requiredBytesFromBuffer + readBytes);
- m_spdyBuffer.append(temp);
- return false;
- } else {
- return true; // buffer must be cleared by calling function
- }
-}
-
-void QSpdyProtocolHandler::sendControlFrame(FrameType type,
- ControlFrameFlags flags,
- const char *data,
- quint32 length)
-{
- // frame type and stream ID
- char header[8];
- header[0] = 0x80u; // leftmost bit == 1 -> is a control frame
- header[1] = 0x03; // 3 bit == version 3
- header[2] = 0;
- switch (type) {
- case FrameType_CREDENTIAL: {
- qWarning("sending SPDY CREDENTIAL frame is not yet implemented"); // QTBUG-36188
- return;
- }
- default:
- header[3] = type;
- }
-
- // flags
- header[4] = 0;
- if (flags & ControlFrame_FLAG_FIN || length == 0) {
- Q_ASSERT(type == FrameType_SYN_STREAM || type == FrameType_SYN_REPLY
- || type == FrameType_HEADERS || length == 0);
- header[4] |= ControlFrame_FLAG_FIN;
- }
- if (flags & ControlFrame_FLAG_UNIDIRECTIONAL) {
- Q_ASSERT(type == FrameType_SYN_STREAM);
- header[4] |= ControlFrame_FLAG_UNIDIRECTIONAL;
- }
-
- // length
- appendIntToThreeBytes(header + 5, length);
-
- qint64 written = m_socket->write(header, 8);
- Q_ASSERT(written == 8);
- written = m_socket->write(data, length);
- Q_ASSERT(written == length);
- Q_UNUSED(written); // silence -Wunused-variable
-}
-
-void QSpdyProtocolHandler::sendSYN_STREAM(const HttpMessagePair &messagePair,
- qint32 streamID, qint32 associatedToStreamID)
-{
- QHttpNetworkRequest request = messagePair.first;
- QHttpNetworkReply *reply = messagePair.second;
-
- ControlFrameFlags flags;
-
- if (!request.uploadByteDevice()) {
- // no upload -> this is the last frame, send the FIN flag
- flags |= ControlFrame_FLAG_FIN;
- reply->d_func()->state = QHttpNetworkReplyPrivate::SPDYHalfClosed;
- } else {
- reply->d_func()->state = QHttpNetworkReplyPrivate::SPDYUploading;
-
- // hack: set the stream ID on the device directly, so when we get
- // the signal for uploading we know which stream we are sending on
- m_streamIDs.insert(request.uploadByteDevice(), streamID);
-
- QObject::connect(request.uploadByteDevice(), SIGNAL(readyRead()), this,
- SLOT(_q_uploadDataReadyRead()), Qt::QueuedConnection);
- QObject::connect(request.uploadByteDevice(), SIGNAL(destroyed(QObject*)), this,
- SLOT(_q_uploadDataDestroyed(QObject *)));
- }
-
- QByteArray namesAndValues = composeHeader(request);
- quint32 length = namesAndValues.count() + 10; // 10 == 4 for Stream-ID + 4 for Associated-To-Stream-ID
- // + 2 for Priority, Unused and Slot
-
- QByteArray wireData;
- wireData.reserve(length);
- wireData.append(intToFourBytes(streamID));
- wireData.append(intToFourBytes(associatedToStreamID));
-
- // priority (3 bits) / unused (5 bits) / slot (8 bits)
- char prioAndSlot[2];
- switch (request.priority()) {
- case QHttpNetworkRequest::HighPriority:
- prioAndSlot[0] = 0x00; // == prio 0 (highest)
- break;
- case QHttpNetworkRequest::NormalPriority:
- prioAndSlot[0] = 0x80u; // == prio 4
- break;
- case QHttpNetworkRequest::LowPriority:
- prioAndSlot[0] = 0xe0u; // == prio 7 (lowest)
- break;
- }
- prioAndSlot[1] = 0x00; // slot in client certificates (not supported currently)
- wireData.append(prioAndSlot, 2);
-
- wireData.append(namesAndValues);
-
- sendControlFrame(FrameType_SYN_STREAM, flags, wireData.constData(), length);
-
- if (reply->d_func()->state == QHttpNetworkReplyPrivate::SPDYUploading)
- uploadData(streamID);
-}
-
-void QSpdyProtocolHandler::_q_uploadDataDestroyed(QObject *uploadData)
-{
- m_streamIDs.remove(uploadData);
-}
-
-void QSpdyProtocolHandler::sendRST_STREAM(qint32 streamID, RST_STREAM_STATUS_CODE statusCode)
-{
- char wireData[8];
- appendIntToFourBytes(wireData, streamID);
- appendIntToFourBytes(wireData + 4, statusCode);
- sendControlFrame(FrameType_RST_STREAM, /* flags = */ { }, wireData, /* length = */ 8);
-}
-
-void QSpdyProtocolHandler::sendPING(quint32 pingID)
-{
- char rawData[4];
- appendIntToFourBytes(rawData, pingID);
- sendControlFrame(FrameType_PING, /* flags = */ { }, rawData, /* length = */ 4);
-}
-
-bool QSpdyProtocolHandler::uploadData(qint32 streamID)
-{
- // we only rely on SPDY flow control here and don't care about TCP buffers
- if (!m_inFlightStreams.contains(streamID)) {
- sendRST_STREAM(streamID, RST_STREAM_INVALID_STREAM);
- return false;
- }
-
- HttpMessagePair messagePair = m_inFlightStreams.value(streamID);
- QHttpNetworkRequest request = messagePair.first;
- QHttpNetworkReply *reply = messagePair.second;
- Q_ASSERT(reply);
- QHttpNetworkReplyPrivate *replyPrivate = reply->d_func();
- Q_ASSERT(replyPrivate);
-
- if (reply->d_func()->state == QHttpNetworkReplyPrivate::SPDYHalfClosed || reply->d_func()->state == QHttpNetworkReplyPrivate::SPDYClosed) {
- qWarning("Trying to upload to closed stream");
- return false;
- }
-
- qint32 dataLeftInWindow = replyPrivate->windowSizeUpload
- - replyPrivate->currentlyUploadedDataInWindow;
-
- while (dataLeftInWindow > 0 && !request.uploadByteDevice()->atEnd()) {
-
- // get pointer to upload data
- qint64 currentReadSize = 0;
- const char *readPointer = request.uploadByteDevice()->readPointer(dataLeftInWindow,
- currentReadSize);
-
- if (currentReadSize == -1) {
- // premature eof happened
- m_connection->d_func()->emitReplyError(m_socket, reply,
- QNetworkReply::UnknownNetworkError);
- return false;
- } else if (readPointer == nullptr || currentReadSize == 0) {
- // nothing to read currently, break the loop
- break;
- } else {
- DataFrameFlags flags;
- // we will send the FIN flag later if appropriate
- qint64 currentWriteSize = sendDataFrame(streamID, flags, currentReadSize, readPointer);
- if (currentWriteSize == -1 || currentWriteSize != currentReadSize) {
- // socket broke down
- m_connection->d_func()->emitReplyError(m_socket, reply,
- QNetworkReply::UnknownNetworkError);
- return false;
- } else {
- replyPrivate->currentlyUploadedDataInWindow += currentWriteSize;
- replyPrivate->totallyUploadedData += currentWriteSize;
- dataLeftInWindow = replyPrivate->windowSizeUpload
- - replyPrivate->currentlyUploadedDataInWindow;
- request.uploadByteDevice()->advanceReadPointer(currentWriteSize);
-
- emit reply->dataSendProgress(replyPrivate->totallyUploadedData,
- request.contentLength());
- }
- }
- }
- if (replyPrivate->totallyUploadedData == request.contentLength()) {
- DataFrameFlags finFlag = DataFrame_FLAG_FIN;
- qint64 writeSize = sendDataFrame(streamID, finFlag, 0, nullptr);
- Q_ASSERT(writeSize == 0);
- Q_UNUSED(writeSize); // silence -Wunused-variable
- replyPrivate->state = QHttpNetworkReplyPrivate::SPDYHalfClosed;
- if (reply->request().uploadByteDevice())
- reply->request().uploadByteDevice()->disconnect(this);
- // ### this will not work if the content length is not known, but
- // then again many servers will fail in this case anyhow according
- // to the SPDY RFC
- }
- return true;
-}
-
-void QSpdyProtocolHandler::_q_uploadDataReadyRead()
-{
- QNonContiguousByteDevice *device = qobject_cast<QNonContiguousByteDevice *>(sender());
- Q_ASSERT(device);
- qint32 streamID = m_streamIDs.value(device);
- Q_ASSERT(streamID > 0);
- uploadData(streamID);
-}
-
-void QSpdyProtocolHandler::sendWINDOW_UPDATE(qint32 streamID, quint32 deltaWindowSize)
-{
- char windowUpdateData[8];
- appendIntToFourBytes(windowUpdateData, streamID);
- appendIntToFourBytes(windowUpdateData + 4, deltaWindowSize);
-
- sendControlFrame(FrameType_WINDOW_UPDATE, /* flags = */ { }, windowUpdateData, /* length = */ 8);
-}
-
-qint64 QSpdyProtocolHandler::sendDataFrame(qint32 streamID, DataFrameFlags flags,
- quint32 length, const char *data)
-{
- QByteArray wireData;
- wireData.reserve(8);
-
- wireData.append(intToFourBytes(streamID));
- wireData.append(flags);
- wireData.append(intToThreeBytes(length));
-
- Q_ASSERT(m_socket);
- m_socket->write(wireData);
-
- if (data) {
- qint64 ret = m_socket->write(data, length);
- return ret;
- } else {
- return 0; // nothing to write, e.g. FIN flag
- }
-}
-
-void QSpdyProtocolHandler::handleControlFrame(const QByteArray &frameHeaders) // ### make it char *
-{
- Q_ASSERT(frameHeaders.count() >= 8);
- qint16 version = twoBytesToInt(frameHeaders.constData());
- version &= 0x3fff; // eliminate most significant bit to determine version
- Q_ASSERT(version == 3);
-
- qint16 type = twoBytesToInt(frameHeaders.constData() + 2);
-
- char flags = frameHeaders.at(4);
- qint32 length = threeBytesToInt(frameHeaders.constData() + 5);
- Q_ASSERT(length > 0);
-
- QByteArray frameData;
- frameData.resize(length);
- if (!readNextChunk(length, frameData.data())) {
- // put back the frame headers to the buffer
- m_spdyBuffer.prepend(frameHeaders);
- return; // we couldn't read the whole frame and need to wait
- } else {
- m_spdyBuffer.clear();
- m_waitingForCompleteStream = false;
- }
-
- switch (type) {
- case FrameType_SYN_STREAM: {
- handleSYN_STREAM(flags, length, frameData);
- break;
- }
- case FrameType_SYN_REPLY: {
- handleSYN_REPLY(flags, length, frameData);
- break;
- }
- case FrameType_RST_STREAM: {
- handleRST_STREAM(flags, length, frameData);
- break;
- }
- case FrameType_SETTINGS: {
- handleSETTINGS(flags, length, frameData);
- break;
- }
- case FrameType_PING: {
- handlePING(flags, length, frameData);
- break;
- }
- case FrameType_GOAWAY: {
- handleGOAWAY(flags, length, frameData);
- break;
- }
- case FrameType_HEADERS: {
- handleHEADERS(flags, length, frameData);
- break;
- }
- case FrameType_WINDOW_UPDATE: {
- handleWINDOW_UPDATE(flags, length, frameData);
- break;
- }
- default:
- qWarning("cannot handle frame of type %d", int(type));
- }
-}
-
-void QSpdyProtocolHandler::handleSYN_STREAM(char /*flags*/, quint32 /*length*/,
- const QByteArray &frameData)
-{
- // not implemented; will be implemented when servers start using it
- // we just tell the server that we do not accept that
-
- qint32 streamID = getStreamID(frameData.constData());
-
- sendRST_STREAM(streamID, RST_STREAM_REFUSED_STREAM);
-}
-
-void QSpdyProtocolHandler::handleSYN_REPLY(char flags, quint32 /*length*/, const QByteArray &frameData)
-{
- parseHttpHeaders(flags, frameData);
-}
-
-void QSpdyProtocolHandler::parseHttpHeaders(char flags, const QByteArray &frameData)
-{
- qint32 streamID = getStreamID(frameData.constData());
- const auto it = m_inFlightStreams.constFind(streamID);
- if (it == m_inFlightStreams.cend()) {
- sendRST_STREAM(streamID, RST_STREAM_INVALID_STREAM);
- return;
- }
-
- flags &= 0x3f;
- bool flag_fin = flags & 0x01;
-
- QByteArray headerValuePairs = frameData.mid(4);
-
- HttpMessagePair pair = it.value();
- QHttpNetworkReply *httpReply = pair.second;
- Q_ASSERT(httpReply != nullptr);
-
- if (httpReply->d_func()->state == QHttpNetworkReplyPrivate::SPDYClosed) {
- sendRST_STREAM(streamID, RST_STREAM_STREAM_ALREADY_CLOSED);
- return;
- }
-
- QByteArray uncompressedHeader;
- if (!uncompressHeader(headerValuePairs, &uncompressedHeader)) {
- qWarning("error reading header from SYN_REPLY message");
- return;
- }
-
- qint32 headerCount = fourBytesToInt(uncompressedHeader.constData());
- if (headerCount * 8 > uncompressedHeader.size()) {
- qWarning("error parsing header from SYN_REPLY message");
- sendRST_STREAM(streamID, RST_STREAM_PROTOCOL_ERROR);
- return;
- }
- qint32 readPointer = 4;
- for (qint32 a = 0; a < headerCount; ++a) {
- qint32 count = fourBytesToInt(uncompressedHeader.constData() + readPointer);
- readPointer += 4;
- QByteArray name = uncompressedHeader.mid(readPointer, count);
- readPointer += count;
- if (readPointer > uncompressedHeader.size()) {
- qWarning("error parsing header from SYN_REPLY message");
- sendRST_STREAM(streamID, RST_STREAM_PROTOCOL_ERROR);
- return;
- }
- count = fourBytesToInt(uncompressedHeader.constData() + readPointer);
- readPointer += 4;
- QByteArray value = uncompressedHeader.mid(readPointer, count);
- readPointer += count;
- if (readPointer > uncompressedHeader.size()) {
- qWarning("error parsing header from SYN_REPLY message");
- sendRST_STREAM(streamID, RST_STREAM_PROTOCOL_ERROR);
- return;
- }
- if (name == ":status") {
- httpReply->setStatusCode(value.left(3).toInt());
- httpReply->d_func()->reasonPhrase = QString::fromLatin1(value.mid(4));
- } else if (name == ":version") {
- int majorVersion = value.at(5) - 48;
- int minorVersion = value.at(7) - 48;
- httpReply->d_func()->majorVersion = majorVersion;
- httpReply->d_func()->minorVersion = minorVersion;
- } else if (name == "content-length") {
- httpReply->setContentLength(value.toLongLong());
- } else {
- value.replace('\0', name == "set-cookie" ? "\n" : ", ");
- httpReply->setHeaderField(name, value);
- }
- }
- emit httpReply->headerChanged();
-
- if (flag_fin) {
- if (httpReply->d_func()->state != QHttpNetworkReplyPrivate::SPDYHalfClosed)
- sendDataFrame(streamID, DataFrame_FLAG_FIN, 0, nullptr);
- replyFinished(httpReply, streamID);
- }
-}
-
-void QSpdyProtocolHandler::handleRST_STREAM(char /*flags*/, quint32 length,
- const QByteArray &frameData)
-{
- // flags are ignored
-
- Q_ASSERT(length == 8);
- Q_UNUSED(length); // silence -Wunused-parameter
- qint32 streamID = getStreamID(frameData.constData());
- QHttpNetworkReply *httpReply = m_inFlightStreams.value(streamID).second;
-
- qint32 statusCodeInt = fourBytesToInt(frameData.constData() + 4);
- RST_STREAM_STATUS_CODE statusCode = static_cast<RST_STREAM_STATUS_CODE>(statusCodeInt);
- QNetworkReply::NetworkError errorCode;
- QByteArray errorMessage;
-
- switch (statusCode) {
- case RST_STREAM_PROTOCOL_ERROR:
- errorCode = QNetworkReply::ProtocolFailure;
- errorMessage = "SPDY protocol error";
- break;
- case RST_STREAM_INVALID_STREAM:
- errorCode = QNetworkReply::ProtocolFailure;
- errorMessage = "SPDY stream is not active";
- break;
- case RST_STREAM_REFUSED_STREAM:
- errorCode = QNetworkReply::ProtocolFailure;
- errorMessage = "SPDY stream was refused";
- break;
- case RST_STREAM_UNSUPPORTED_VERSION:
- errorCode = QNetworkReply::ProtocolUnknownError;
- errorMessage = "SPDY version is unknown to the server";
- break;
- case RST_STREAM_CANCEL:
- errorCode = QNetworkReply::ProtocolFailure;
- errorMessage = "SPDY stream is no longer needed";
- break;
- case RST_STREAM_INTERNAL_ERROR:
- errorCode = QNetworkReply::InternalServerError;
- errorMessage = "Internal server error";
- break;
- case RST_STREAM_FLOW_CONTROL_ERROR:
- errorCode = QNetworkReply::ProtocolFailure;
- errorMessage = "peer violated the flow control protocol";
- break;
- case RST_STREAM_STREAM_IN_USE:
- errorCode = QNetworkReply::ProtocolFailure;
- errorMessage = "server received a SYN_REPLY for an already open stream";
- break;
- case RST_STREAM_STREAM_ALREADY_CLOSED:
- errorCode = QNetworkReply::ProtocolFailure;
- errorMessage = "server received data or a SYN_REPLY for an already half-closed stream";
- break;
- case RST_STREAM_INVALID_CREDENTIALS:
- errorCode = QNetworkReply::ContentAccessDenied;
- errorMessage = "server received invalid credentials";
- break;
- case RST_STREAM_FRAME_TOO_LARGE:
- errorCode = QNetworkReply::ProtocolFailure;
- errorMessage = "server cannot process the frame because it is too large";
- break;
- default:
- qWarning("could not understand servers RST_STREAM status code");
- errorCode = QNetworkReply::ProtocolFailure;
- errorMessage = "got SPDY RST_STREAM message with unknown error code";
- }
- if (httpReply)
- replyFinishedWithError(httpReply, streamID, errorCode, errorMessage.constData());
-}
-
-void QSpdyProtocolHandler::handleSETTINGS(char flags, quint32 /*length*/, const QByteArray &frameData)
-{
- Q_ASSERT(frameData.count() > 0);
-
- SETTINGS_Flags settingsFlags = static_cast<SETTINGS_Flags>(flags);
- if (settingsFlags & FLAG_SETTINGS_CLEAR_SETTINGS) {
- // ### clear all persistent settings; since we do not persist settings
- // as of now, we don't need to clear anything either
- }
-
- qint32 numberOfEntries = fourBytesToInt(frameData.constData());
- Q_ASSERT(numberOfEntries > 0);
- for (int a = 0, frameDataIndex = 4; a < numberOfEntries; ++a, frameDataIndex += 8) {
- SETTINGS_ID_Flag idFlag = static_cast<SETTINGS_ID_Flag>(frameData[frameDataIndex]);
- if (idFlag & FLAG_SETTINGS_PERSIST_VALUE) {
- // ### we SHOULD persist the settings here according to the RFC, but we don't have to,
- // so implement that later
- } // the other value is only sent by us, but not received
-
- quint32 uniqueID = static_cast<SETTINGS_ID>(
- threeBytesToInt(frameData.constData() + frameDataIndex + 1));
- quint32 value = fourBytesToInt(frameData.constData() + frameDataIndex + 4);
- switch (uniqueID) {
- case SETTINGS_UPLOAD_BANDWIDTH: {
- // ignored for now, just an estimated informative value
- break;
- }
- case SETTINGS_DOWNLOAD_BANDWIDTH: {
- // ignored for now, just an estimated informative value
- break;
- }
- case SETTINGS_ROUND_TRIP_TIME: {
- // ignored for now, just an estimated informative value
- break;
- }
- case SETTINGS_MAX_CONCURRENT_STREAMS: {
- m_maxConcurrentStreams = value;
- break;
- }
- case SETTINGS_CURRENT_CWND: {
- // ignored for now, just an informative value
- break;
- }
- case SETTINGS_DOWNLOAD_RETRANS_RATE: {
- // ignored for now, just an estimated informative value
- break;
- }
- case SETTINGS_INITIAL_WINDOW_SIZE: {
- m_initialWindowSize = value;
- break;
- }
- case SETTINGS_CLIENT_CERTIFICATE_VECTOR_SIZE: {
- // client certificates are not supported
- break;
- }
- default:
- qWarning("found unknown settings value %u", uint(value));
- }
- }
-}
-
-void QSpdyProtocolHandler::handlePING(char /*flags*/, quint32 length, const QByteArray &frameData)
-{
- // flags are ignored
-
- Q_ASSERT(length == 4);
- Q_UNUSED(length); // silence -Wunused-parameter
- quint32 pingID = fourBytesToInt(frameData.constData());
-
- // odd numbered IDs must be ignored
- if ((pingID & 1) == 0) // is even?
- sendPING(pingID);
-}
-
-void QSpdyProtocolHandler::handleGOAWAY(char /*flags*/, quint32 /*length*/,
- const QByteArray &frameData)
-{
- // flags are ignored
-
- qint32 statusCode = static_cast<GOAWAY_STATUS>(fourBytesToInt(frameData.constData() + 4));
- QNetworkReply::NetworkError errorCode;
- switch (statusCode) {
- case GOAWAY_OK: {
- errorCode = QNetworkReply::NoError;
- break;
- }
- case GOAWAY_PROTOCOL_ERROR: {
- errorCode = QNetworkReply::ProtocolFailure;
- break;
- }
- case GOAWAY_INTERNAL_ERROR: {
- errorCode = QNetworkReply::InternalServerError;
- break;
- }
- default:
- qWarning("unexpected status code %d", int(statusCode));
- errorCode = QNetworkReply::ProtocolUnknownError;
- }
-
- qint32 lastGoodStreamID = getStreamID(frameData.constData());
-
- // emit errors for all replies after the last good stream ID
- Q_ASSERT(m_connection);
- for (qint32 currentStreamID = lastGoodStreamID + 2; currentStreamID <= m_nextStreamID;
- ++currentStreamID) {
- QHttpNetworkReply *reply = m_inFlightStreams.value(currentStreamID).second;
- Q_ASSERT(reply);
- m_connection->d_func()->emitReplyError(m_socket, reply, errorCode);
- }
- // ### we could make sure a new session is initiated anyhow
-}
-
-void QSpdyProtocolHandler::handleHEADERS(char flags, quint32 /*length*/,
- const QByteArray &frameData)
-{
- parseHttpHeaders(flags, frameData);
-}
-
-void QSpdyProtocolHandler::handleWINDOW_UPDATE(char /*flags*/, quint32 /*length*/,
- const QByteArray &frameData)
-{
- qint32 streamID = getStreamID(frameData.constData());
- qint32 deltaWindowSize = fourBytesToInt(frameData.constData() + 4);
-
- const auto it = m_inFlightStreams.constFind(streamID);
- if (it == m_inFlightStreams.cend()) {
- sendRST_STREAM(streamID, RST_STREAM_INVALID_STREAM);
- return;
- }
-
- QHttpNetworkReply *reply = it.value().second;
- Q_ASSERT(reply);
- QHttpNetworkReplyPrivate *replyPrivate = reply->d_func();
- Q_ASSERT(replyPrivate);
-
- // Ignore WINDOW_UPDATE if we are already done.
- if (replyPrivate->state == QHttpNetworkReplyPrivate::SPDYHalfClosed || replyPrivate->state == QHttpNetworkReplyPrivate::SPDYClosed)
- return;
-
- replyPrivate->currentlyUploadedDataInWindow = replyPrivate->windowSizeUpload - deltaWindowSize;
- uploadData(streamID); // we hopefully can continue to upload
-}
-
-
-void QSpdyProtocolHandler::handleDataFrame(const QByteArray &frameHeaders)
-{
- Q_ASSERT(frameHeaders.count() >= 8);
-
- qint32 streamID = getStreamID(frameHeaders.constData());
- const auto it = m_inFlightStreams.constFind(streamID);
- if (it == m_inFlightStreams.cend()) {
- sendRST_STREAM(streamID, RST_STREAM_INVALID_STREAM);
- return;
- }
-
- unsigned char flags = static_cast<unsigned char>(frameHeaders.at(4));
- flags &= 0x3f;
- bool flag_fin = flags & 0x01;
- bool flag_compress = flags & 0x02;
- qint32 length = threeBytesToInt(frameHeaders.constData() + 5);
-
- QByteArray data;
- data.resize(length);
- if (!readNextChunk(length, data.data())) {
- // put back the frame headers to the buffer
- m_spdyBuffer.prepend(frameHeaders);
- return; // we couldn't read the whole frame and need to wait
- } else {
- m_spdyBuffer.clear();
- m_waitingForCompleteStream = false;
- }
-
- HttpMessagePair pair = it.value();
- QHttpNetworkRequest httpRequest = pair.first;
- QHttpNetworkReply *httpReply = pair.second;
- Q_ASSERT(httpReply != nullptr);
-
- QHttpNetworkReplyPrivate *replyPrivate = httpReply->d_func();
-
- if (replyPrivate->state == QHttpNetworkReplyPrivate::SPDYClosed) {
- sendRST_STREAM(streamID, RST_STREAM_STREAM_ALREADY_CLOSED);
- return;
- }
-
- // check whether we need to send WINDOW_UPDATE (i.e. tell the sender it can send more)
- replyPrivate->currentlyReceivedDataInWindow += length;
- qint32 dataLeftInWindow = replyPrivate->windowSizeDownload - replyPrivate->currentlyReceivedDataInWindow;
-
- if (replyPrivate->currentlyReceivedDataInWindow > 0
- && dataLeftInWindow < replyPrivate->windowSizeDownload / 2) {
-
- // socket read buffer size is 64K actually, hard coded in the channel
- // We can read way more than 64K per socket, because the window size
- // here is per stream.
- if (replyPrivate->windowSizeDownload >= m_socket->readBufferSize()) {
- replyPrivate->windowSizeDownload = m_socket->readBufferSize();
- } else {
- replyPrivate->windowSizeDownload *= 1.5;
- }
- QMetaObject::invokeMethod(this, "sendWINDOW_UPDATE", Qt::QueuedConnection,
- Q_ARG(qint32, streamID),
- Q_ARG(quint32, replyPrivate->windowSizeDownload));
- // setting the current data count to 0 is a race condition,
- // because we call sendWINDOW_UPDATE through the event loop.
- // But then again, the whole situation is a race condition because
- // we don't know when the packet will arrive at the server; so
- // this is most likely good enough here.
- replyPrivate->currentlyReceivedDataInWindow = 0;
- }
-
- httpReply->d_func()->compressedData.append(data);
-
-
- replyPrivate->totalProgress += length;
-
- if (httpRequest.d->autoDecompress && httpReply->d_func()->isCompressed()) {
- QByteDataBuffer inDataBuffer; // ### should we introduce one in the http reply?
- inDataBuffer.append(data);
- qint64 compressedCount = httpReply->d_func()->uncompressBodyData(&inDataBuffer,
- &replyPrivate->responseData);
- Q_ASSERT(compressedCount >= 0);
- Q_UNUSED(compressedCount); // silence -Wunused-variable
- } else {
- replyPrivate->responseData.append(data);
- }
-
- if (replyPrivate->shouldEmitSignals()) {
- emit httpReply->readyRead();
- emit httpReply->dataReadProgress(replyPrivate->totalProgress, replyPrivate->bodyLength);
- }
-
- if (flag_compress) {
- qWarning("SPDY level compression is not supported");
- }
-
- if (flag_fin) {
- if (httpReply->d_func()->state != QHttpNetworkReplyPrivate::SPDYHalfClosed)
- sendDataFrame(streamID, DataFrame_FLAG_FIN, 0, nullptr);
- replyFinished(httpReply, streamID);
- }
-}
-
-void QSpdyProtocolHandler::replyFinished(QHttpNetworkReply *httpReply, qint32 streamID)
-{
- httpReply->d_func()->state = QHttpNetworkReplyPrivate::SPDYClosed;
- httpReply->disconnect(this);
- if (httpReply->request().uploadByteDevice())
- httpReply->request().uploadByteDevice()->disconnect(this);
- int streamsRemoved = m_inFlightStreams.remove(streamID);
- Q_ASSERT(streamsRemoved == 1);
- Q_UNUSED(streamsRemoved); // silence -Wunused-variable
- emit httpReply->finished();
-}
-
-void QSpdyProtocolHandler::replyFinishedWithError(QHttpNetworkReply *httpReply, qint32 streamID,
- QNetworkReply::NetworkError errorCode, const char *errorMessage)
-{
- Q_ASSERT(httpReply);
- httpReply->d_func()->state = QHttpNetworkReplyPrivate::SPDYClosed;
- httpReply->disconnect(this);
- if (httpReply->request().uploadByteDevice())
- httpReply->request().uploadByteDevice()->disconnect(this);
- int streamsRemoved = m_inFlightStreams.remove(streamID);
- Q_ASSERT(streamsRemoved == 1);
- Q_UNUSED(streamsRemoved); // silence -Wunused-variable
- emit httpReply->finishedWithError(errorCode, QSpdyProtocolHandler::tr(errorMessage));
-}
-
-qint32 QSpdyProtocolHandler::generateNextStreamID()
-{
- // stream IDs initiated by the client must be odd
- m_nextStreamID += 2;
- return m_nextStreamID;
-}
-
-QT_END_NAMESPACE
-
-#endif // !defined(QT_NO_SSL)
diff --git a/src/network/access/qspdyprotocolhandler_p.h b/src/network/access/qspdyprotocolhandler_p.h
deleted file mode 100644
index 14e2ff388a..0000000000
--- a/src/network/access/qspdyprotocolhandler_p.h
+++ /dev/null
@@ -1,232 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSPDYPROTOCOLHANDLER_H
-#define QSPDYPROTOCOLHANDLER_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of the Network Access API. This header file may change from
-// version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtNetwork/private/qtnetworkglobal_p.h>
-#include <private/qabstractprotocolhandler_p.h>
-#include <QtNetwork/qnetworkreply.h>
-#include <private/qbytedata_p.h>
-
-#include <zlib.h>
-
-QT_REQUIRE_CONFIG(http);
-
-#if !defined(QT_NO_SSL)
-
-QT_BEGIN_NAMESPACE
-
-class QHttpNetworkRequest;
-
-#ifndef HttpMessagePair
-typedef QPair<QHttpNetworkRequest, QHttpNetworkReply*> HttpMessagePair;
-#endif
-
-class QSpdyProtocolHandler : public QObject, public QAbstractProtocolHandler {
- Q_OBJECT
-public:
- QSpdyProtocolHandler(QHttpNetworkConnectionChannel *channel);
- ~QSpdyProtocolHandler();
-
- enum DataFrameFlag {
- DataFrame_FLAG_FIN = 0x01,
- DataFrame_FLAG_COMPRESS = 0x02
- };
-
- Q_DECLARE_FLAGS(DataFrameFlags, DataFrameFlag)
-
- enum ControlFrameFlag {
- ControlFrame_FLAG_FIN = 0x01,
- ControlFrame_FLAG_UNIDIRECTIONAL = 0x02
- };
-
- Q_DECLARE_FLAGS(ControlFrameFlags, ControlFrameFlag)
-
- enum SETTINGS_Flag {
- FLAG_SETTINGS_CLEAR_SETTINGS = 0x01
- };
-
- Q_DECLARE_FLAGS(SETTINGS_Flags, SETTINGS_Flag)
-
- enum SETTINGS_ID_Flag {
- FLAG_SETTINGS_PERSIST_VALUE = 0x01,
- FLAG_SETTINGS_PERSISTED = 0x02
- };
-
- Q_DECLARE_FLAGS(SETTINGS_ID_Flags, SETTINGS_ID_Flag)
-
- virtual void _q_receiveReply() override;
- virtual void _q_readyRead() override;
- virtual bool sendRequest() override;
-
-private slots:
- void _q_uploadDataReadyRead();
- void _q_replyDestroyed(QObject*);
- void _q_uploadDataDestroyed(QObject *);
-
-private:
-
- enum FrameType {
- FrameType_SYN_STREAM = 1,
- FrameType_SYN_REPLY = 2,
- FrameType_RST_STREAM = 3,
- FrameType_SETTINGS = 4,
- FrameType_PING = 6,
- FrameType_GOAWAY = 7,
- FrameType_HEADERS = 8,
- FrameType_WINDOW_UPDATE = 9,
- FrameType_CREDENTIAL // has a special type
- };
-
- enum StatusCode {
- StatusCode_PROTOCOL_ERROR = 1,
- StatusCode_INVALID_STREAM = 2,
- StatusCode_REFUSED_STREAM = 3,
- StatusCode_UNSUPPORTED_VERSION = 4,
- StatusCode_CANCEL = 5,
- StatusCode_INTERNAL_ERROR = 6,
- StatusCode_FLOW_CONTROL_ERROR = 7,
- StatusCode_STREAM_IN_USE = 8,
- StatusCode_STREAM_ALREADY_CLOSED = 9,
- StatusCode_INVALID_CREDENTIALS = 10,
- StatusCode_FRAME_TOO_LARGE = 11
- };
-
- enum SETTINGS_ID {
- SETTINGS_UPLOAD_BANDWIDTH = 1,
- SETTINGS_DOWNLOAD_BANDWIDTH = 2,
- SETTINGS_ROUND_TRIP_TIME = 3,
- SETTINGS_MAX_CONCURRENT_STREAMS = 4,
- SETTINGS_CURRENT_CWND = 5,
- SETTINGS_DOWNLOAD_RETRANS_RATE = 6,
- SETTINGS_INITIAL_WINDOW_SIZE = 7,
- SETTINGS_CLIENT_CERTIFICATE_VECTOR_SIZE = 8
- };
-
- enum GOAWAY_STATUS {
- GOAWAY_OK = 0,
- GOAWAY_PROTOCOL_ERROR = 1,
- GOAWAY_INTERNAL_ERROR = 11
- };
-
- enum RST_STREAM_STATUS_CODE {
- RST_STREAM_PROTOCOL_ERROR = 1,
- RST_STREAM_INVALID_STREAM = 2,
- RST_STREAM_REFUSED_STREAM = 3,
- RST_STREAM_UNSUPPORTED_VERSION = 4,
- RST_STREAM_CANCEL = 5,
- RST_STREAM_INTERNAL_ERROR = 6,
- RST_STREAM_FLOW_CONTROL_ERROR = 7,
- RST_STREAM_STREAM_IN_USE = 8,
- RST_STREAM_STREAM_ALREADY_CLOSED = 9,
- RST_STREAM_INVALID_CREDENTIALS = 10,
- RST_STREAM_FRAME_TOO_LARGE = 11
- };
-
- quint64 bytesAvailable() const;
- bool readNextChunk(qint64 length, char *sink);
-
- void sendControlFrame(FrameType type, ControlFrameFlags flags, const char *data, quint32 length);
-
- void sendSYN_STREAM(const HttpMessagePair &pair, qint32 streamID,
- qint32 associatedToStreamID);
- void sendRST_STREAM(qint32 streamID, RST_STREAM_STATUS_CODE statusCode);
- void sendPING(quint32 pingID);
-
- bool uploadData(qint32 streamID);
- Q_INVOKABLE void sendWINDOW_UPDATE(qint32 streamID, quint32 deltaWindowSize);
-
- qint64 sendDataFrame(qint32 streamID, DataFrameFlags flags, quint32 length,
- const char *data);
-
- QByteArray composeHeader(const QHttpNetworkRequest &request);
- bool uncompressHeader(const QByteArray &input, QByteArray *output);
-
- void handleControlFrame(const QByteArray &frameHeaders);
- void handleDataFrame(const QByteArray &frameHeaders);
-
- void handleSYN_STREAM(char, quint32, const QByteArray &frameData);
- void handleSYN_REPLY(char flags, quint32, const QByteArray &frameData);
- void handleRST_STREAM(char flags, quint32 length, const QByteArray &frameData);
- void handleSETTINGS(char flags, quint32 length, const QByteArray &frameData);
- void handlePING(char, quint32 length, const QByteArray &frameData);
- void handleGOAWAY(char flags, quint32, const QByteArray &frameData);
- void handleHEADERS(char flags, quint32, const QByteArray &frameData);
- void handleWINDOW_UPDATE(char, quint32, const QByteArray &frameData);
-
- qint32 generateNextStreamID();
- void parseHttpHeaders(char flags, const QByteArray &frameData);
-
- void replyFinished(QHttpNetworkReply *httpReply, qint32 streamID);
- void replyFinishedWithError(QHttpNetworkReply *httpReply, qint32 streamID,
- QNetworkReply::NetworkError errorCode, const char *errorMessage);
-
- qint32 m_nextStreamID;
- QHash<quint32, HttpMessagePair> m_inFlightStreams;
- qint32 m_maxConcurrentStreams;
- quint32 m_initialWindowSize;
- QByteDataBuffer m_spdyBuffer;
- bool m_waitingForCompleteStream;
- z_stream m_deflateStream;
- z_stream m_inflateStream;
- QHash<QObject *, qint32> m_streamIDs;
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QSpdyProtocolHandler::DataFrameFlags)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QSpdyProtocolHandler::ControlFrameFlags)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QSpdyProtocolHandler::SETTINGS_Flags)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QSpdyProtocolHandler::SETTINGS_ID_Flags)
-
-QT_END_NAMESPACE
-
-#endif // !defined(QT_NO_SSL)
-
-#endif // QSPDYPROTOCOLHANDLER_H
diff --git a/src/network/bearer/bearer.pri b/src/network/bearer/bearer.pri
deleted file mode 100644
index d58d5ec168..0000000000
--- a/src/network/bearer/bearer.pri
+++ /dev/null
@@ -1,19 +0,0 @@
-# Qt network bearer management module
-
-HEADERS += bearer/qnetworkconfiguration.h \
- bearer/qnetworksession.h \
- bearer/qnetworkconfigmanager.h \
- bearer/qnetworkconfigmanager_p.h \
- bearer/qnetworkconfiguration_p.h \
- bearer/qnetworksession_p.h \
- bearer/qbearerengine_p.h \
- bearer/qbearerplugin_p.h \
- bearer/qsharednetworksession_p.h
-
-SOURCES += bearer/qnetworksession.cpp \
- bearer/qnetworkconfigmanager.cpp \
- bearer/qnetworkconfiguration.cpp \
- bearer/qnetworkconfigmanager_p.cpp \
- bearer/qbearerengine.cpp \
- bearer/qbearerplugin.cpp \
- bearer/qsharednetworksession.cpp
diff --git a/src/network/bearer/qbearerengine.cpp b/src/network/bearer/qbearerengine.cpp
deleted file mode 100644
index 06bf449611..0000000000
--- a/src/network/bearer/qbearerengine.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qbearerengine_p.h"
-#include <QtCore/private/qlocking_p.h>
-
-#include <algorithm>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-static void cleanUpConfigurations(QHash<QString, QNetworkConfigurationPrivatePointer> &configurations)
-{
- for (auto &ptr : qExchange(configurations, {})) {
- ptr->isValid = false;
- ptr->id.clear();
- }
-}
-
-static bool hasUsedConfiguration(const QHash<QString, QNetworkConfigurationPrivatePointer> &configurations)
-{
- auto isUsed = [](const QNetworkConfigurationPrivatePointer &ptr) {
- return ptr->ref.loadRelaxed() > 1;
- };
- const auto end = configurations.end();
- return std::find_if(configurations.begin(), end, isUsed) != end;
-}
-
-QBearerEngine::QBearerEngine(QObject *parent)
- : QObject(parent)
-{
-}
-
-QBearerEngine::~QBearerEngine()
-{
- cleanUpConfigurations(snapConfigurations);
- cleanUpConfigurations(accessPointConfigurations);
- cleanUpConfigurations(userChoiceConfigurations);
-}
-
-bool QBearerEngine::requiresPolling() const
-{
- return false;
-}
-
-/*
- Returns \c true if configurations are in use; otherwise returns \c false.
-
- If configurations are in use and requiresPolling() returns \c true, polling will be enabled for
- this engine.
-*/
-bool QBearerEngine::configurationsInUse() const
-{
- const auto locker = qt_scoped_lock(mutex);
- return hasUsedConfiguration(accessPointConfigurations)
- || hasUsedConfiguration(snapConfigurations)
- || hasUsedConfiguration(userChoiceConfigurations);
-}
-
-QT_END_NAMESPACE
-
-#include "moc_qbearerengine_p.cpp"
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/network/bearer/qbearerengine_p.h b/src/network/bearer/qbearerengine_p.h
deleted file mode 100644
index c69f478b26..0000000000
--- a/src/network/bearer/qbearerengine_p.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBEARERENGINE_P_H
-#define QBEARERENGINE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtNetwork/private/qtnetworkglobal_p.h>
-#include "qnetworkconfiguration_p.h"
-#include "qnetworksession.h"
-#include "qnetworkconfigmanager.h"
-
-#include <QtCore/qobject.h>
-#include <QtCore/qglobal.h>
-#include <QtCore/qlist.h>
-#include <QtCore/qstring.h>
-#include <QtCore/qhash.h>
-#include <QtCore/qsharedpointer.h>
-#include <QtCore/qmutex.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkConfiguration;
-
-class Q_NETWORK_EXPORT QBearerEngine : public QObject
-{
- Q_OBJECT
-
- friend class QNetworkConfigurationManagerPrivate;
-
-public:
- explicit QBearerEngine(QObject *parent = nullptr);
- virtual ~QBearerEngine();
-
- virtual bool hasIdentifier(const QString &id) = 0;
-
- virtual QNetworkConfigurationManager::Capabilities capabilities() const = 0;
-
- virtual QNetworkSessionPrivate *createSessionBackend() = 0;
-
- virtual QNetworkConfigurationPrivatePointer defaultConfiguration() = 0;
-
- virtual bool requiresPolling() const;
- bool configurationsInUse() const;
-
-Q_SIGNALS:
- void configurationAdded(QNetworkConfigurationPrivatePointer config);
- void configurationRemoved(QNetworkConfigurationPrivatePointer config);
- void configurationChanged(QNetworkConfigurationPrivatePointer config);
- void updateCompleted();
-
-protected:
- //this table contains an up to date list of all configs at any time.
- //it must be updated if configurations change, are added/removed or
- //the members of ServiceNetworks change
- QHash<QString, QNetworkConfigurationPrivatePointer> accessPointConfigurations;
- QHash<QString, QNetworkConfigurationPrivatePointer> snapConfigurations;
- QHash<QString, QNetworkConfigurationPrivatePointer> userChoiceConfigurations;
-
- mutable QRecursiveMutex mutex;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
-
-#endif // QBEARERENGINE_P_H
diff --git a/src/network/bearer/qbearerplugin.cpp b/src/network/bearer/qbearerplugin.cpp
deleted file mode 100644
index ec0d06e94c..0000000000
--- a/src/network/bearer/qbearerplugin.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qbearerplugin_p.h"
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-QBearerEnginePlugin::QBearerEnginePlugin(QObject *parent)
- : QObject(parent)
-{
-}
-
-QBearerEnginePlugin::~QBearerEnginePlugin()
-{
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/network/bearer/qbearerplugin_p.h b/src/network/bearer/qbearerplugin_p.h
deleted file mode 100644
index ac787d0541..0000000000
--- a/src/network/bearer/qbearerplugin_p.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBEARERPLUGIN_P_H
-#define QBEARERPLUGIN_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtNetwork/private/qtnetworkglobal_p.h>
-#include "qbearerengine_p.h"
-
-#include <QtCore/qplugin.h>
-#include <QtCore/qfactoryinterface.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-
-#define QBearerEngineFactoryInterface_iid "org.qt-project.Qt.QBearerEngineFactoryInterface"
-
-class Q_NETWORK_EXPORT QBearerEnginePlugin : public QObject
-{
- Q_OBJECT
-public:
- explicit QBearerEnginePlugin(QObject *parent = nullptr);
- virtual ~QBearerEnginePlugin();
-
- virtual QBearerEngine *create(const QString &key) const = 0;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
-
-#endif // QBEARERPLUGIN_P_H
diff --git a/src/network/bearer/qnetworkconfigmanager.cpp b/src/network/bearer/qnetworkconfigmanager.cpp
deleted file mode 100644
index eb3eb59c83..0000000000
--- a/src/network/bearer/qnetworkconfigmanager.cpp
+++ /dev/null
@@ -1,389 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtNetwork/private/qtnetworkglobal_p.h>
-
-#include "qnetworkconfigmanager.h"
-
-#include "qnetworkconfigmanager_p.h"
-#include "qbearerengine_p.h"
-
-#include <QtCore/qstringlist.h>
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qthread.h>
-#include <QtCore/private/qcoreapplication_p.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-static QBasicAtomicPointer<QNetworkConfigurationManagerPrivate> connManager_ptr;
-static QBasicAtomicInt appShutdown;
-
-static void connManager_prepare()
-{
- int shutdown = appShutdown.fetchAndStoreAcquire(0);
- Q_ASSERT(shutdown == 0 || shutdown == 1);
- Q_UNUSED(shutdown);
-}
-
-static void connManager_cleanup()
-{
- // this is not atomic or thread-safe!
- int shutdown = appShutdown.fetchAndStoreAcquire(1);
- Q_ASSERT(shutdown == 0);
- Q_UNUSED(shutdown);
- QNetworkConfigurationManagerPrivate *cmp = connManager_ptr.fetchAndStoreAcquire(nullptr);
- if (cmp)
- cmp->cleanup();
-}
-
-void QNetworkConfigurationManagerPrivate::addPreAndPostRoutine()
-{
- qAddPreRoutine(connManager_prepare);
- qAddPostRoutine(connManager_cleanup);
-}
-
-QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate()
-{
- QNetworkConfigurationManagerPrivate *ptr = connManager_ptr.loadAcquire();
- int shutdown = appShutdown.loadAcquire();
- if (!ptr && !shutdown) {
- static QBasicMutex connManager_mutex;
- QMutexLocker locker(&connManager_mutex);
- if (!(ptr = connManager_ptr.loadAcquire())) {
- ptr = new QNetworkConfigurationManagerPrivate;
-
- if (QCoreApplicationPrivate::mainThread() == QThread::currentThread()) {
- // right thread or no main thread yet
- ptr->addPreAndPostRoutine();
- ptr->initialize();
- } else {
- // wrong thread, we need to make the main thread do this
- QObject *obj = new QObject;
- QObject::connect(obj, SIGNAL(destroyed()), ptr, SLOT(addPreAndPostRoutine()), Qt::DirectConnection);
- ptr->initialize(); // this moves us to the right thread
- obj->moveToThread(QCoreApplicationPrivate::mainThread());
- obj->deleteLater();
- }
-
- connManager_ptr.storeRelease(ptr);
- }
- }
- return ptr;
-}
-
-/*!
- \class QNetworkConfigurationManager
- \obsolete
-
- \brief The QNetworkConfigurationManager class manages the network configurations provided
- by the system.
-
- \since 4.7
-
- \inmodule QtNetwork
- \ingroup network
-
- QNetworkConfigurationManager provides access to the network configurations known to the system and
- enables applications to detect the system capabilities (with regards to network sessions) at runtime.
-
- A QNetworkConfiguration abstracts a set of configuration options describing how a
- network interface has to be configured to connect to a particular target network.
- QNetworkConfigurationManager maintains and updates the global list of
- QNetworkConfigurations. Applications can access and filter this list via
- allConfigurations(). If a new configuration is added or an existing one is removed or changed
- the configurationAdded(), configurationRemoved() and configurationChanged() signals are emitted
- respectively.
-
- The defaultConfiguration() can be used when intending to immediately create a new
- network session without caring about the particular configuration. It returns
- a \l QNetworkConfiguration::Discovered configuration. If there are not any
- discovered ones an invalid configuration is returned.
-
- Some configuration updates may require some time to perform updates. A WLAN scan is
- such an example. Unless the platform performs internal updates it may be required to
- manually trigger configuration updates via QNetworkConfigurationManager::updateConfigurations().
- The completion of the update process is indicated by emitting the updateCompleted()
- signal. The update process ensures that every existing QNetworkConfiguration instance
- is updated. There is no need to ask for a renewed configuration list via allConfigurations().
-
- \sa QNetworkConfiguration
-*/
-
-/*!
- \fn void QNetworkConfigurationManager::configurationAdded(const QNetworkConfiguration &config)
-
- This signal is emitted whenever a new network configuration is added to the system. The new
- configuration is specified by \a config.
-*/
-
-/*!
- \fn void QNetworkConfigurationManager::configurationRemoved(const QNetworkConfiguration &config)
-
- This signal is emitted when a configuration is about to be removed from the system. The removed
- configuration, specified by \a config, is invalid but retains name and identifier.
-*/
-
-/*!
- \fn void QNetworkConfigurationManager::updateCompleted()
-
- This signal is emitted when the configuration update has been completed. Such an update can
- be initiated via \l updateConfigurations().
-*/
-
-/*! \fn void QNetworkConfigurationManager::configurationChanged(const QNetworkConfiguration &config)
-
- This signal is emitted when the \l {QNetworkConfiguration::state()}{state} of \a config changes.
-*/
-
-/*!
- \fn void QNetworkConfigurationManager::onlineStateChanged(bool isOnline)
-
- This signal is emitted when the device changes from online to offline mode or vice versa.
- \a isOnline represents the new state of the device.
-
- The state is considered to be online for as long as
- \l{allConfigurations()}{allConfigurations}(QNetworkConfiguration::Active) returns a list with
- at least one entry.
-*/
-
-/*!
- \enum QNetworkConfigurationManager::Capability
-
- Specifies the system capabilities of the bearer API. The possible values are:
-
- \value CanStartAndStopInterfaces Network sessions and their underlying access points can be
- started and stopped. If this flag is not set QNetworkSession
- can only monitor but not influence the state of access points.
- On some platforms this feature may require elevated user
- permissions. This option is platform specific and may not
- always be available.
- \value DirectConnectionRouting Network sessions and their sockets can be bound to a
- particular network interface. Any packet that passes through
- the socket goes to the specified network interface and thus
- disregards standard routing table entries. This may be useful
- when two interfaces can reach overlapping IP ranges or an
- application has specific needs in regards to target networks.
- This option is platform specific and may not always be
- available.
- \value SystemSessionSupport If this flag is set the underlying platform ensures that a
- network interface is not shut down until the last network
- session has been \l{QNetworkSession::close()}{closed()}. This
- works across multiple processes. If the platform session
- support is missing this API can only ensure the above behavior
- for network sessions within the same process.
- In general mobile platforms have such
- support whereas most desktop platform lack this capability.
- \value ApplicationLevelRoaming The system gives applications control over the systems roaming
- behavior. Applications can initiate roaming (in case the
- current link is not suitable) and are consulted if the system
- has identified a more suitable access point.
- \value ForcedRoaming The system disconnects an existing access point and reconnects
- via a more suitable one. The application does not have any
- control over this process and has to reconnect its active
- sockets.
- \value DataStatistics If this flag is set QNetworkSession can provide statistics
- about transmitted and received data.
- \value NetworkSessionRequired If this flag is set the platform requires that a network
- session is created before network operations can be performed.
-*/
-
-/*!
- Constructs a QNetworkConfigurationManager with the given \a parent.
-
- Note that to ensure a valid list of current configurations immediately available, updating
- is done during construction which causes some delay.
-*/
-QNetworkConfigurationManager::QNetworkConfigurationManager(QObject *parent)
- : QObject(parent)
-{
- QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
- if (priv) {
- connect(priv, SIGNAL(configurationAdded(QNetworkConfiguration)),
- this, SIGNAL(configurationAdded(QNetworkConfiguration)));
- connect(priv, SIGNAL(configurationRemoved(QNetworkConfiguration)),
- this, SIGNAL(configurationRemoved(QNetworkConfiguration)));
- connect(priv, SIGNAL(configurationChanged(QNetworkConfiguration)),
- this, SIGNAL(configurationChanged(QNetworkConfiguration)));
- connect(priv, SIGNAL(onlineStateChanged(bool)),
- this, SIGNAL(onlineStateChanged(bool)));
- connect(priv, SIGNAL(configurationUpdateComplete()),
- this, SIGNAL(updateCompleted()));
-
- priv->enablePolling();
- }
-}
-
-/*!
- Frees the resources associated with the QNetworkConfigurationManager object.
-*/
-QNetworkConfigurationManager::~QNetworkConfigurationManager()
-{
- QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
- if (priv)
- priv->disablePolling();
-}
-
-
-/*!
- Returns the default configuration to be used. This function always returns a discovered
- configuration; otherwise an invalid configuration.
-
- In some cases it may be required to call updateConfigurations() and wait for the
- updateCompleted() signal before calling this function.
-
- \sa allConfigurations()
-*/
-QNetworkConfiguration QNetworkConfigurationManager::defaultConfiguration() const
-{
- QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
- if (priv)
- return priv->defaultConfiguration();
-
- return QNetworkConfiguration();
-}
-
-/*!
- Returns the list of configurations which comply with the given \a filter.
-
- By default this function returns all (defined and undefined) configurations.
-
- A wireless network with a particular SSID may only be accessible in a
- certain area despite the fact that the system has a valid configuration
- for it. Therefore the filter flag may be used to limit the list to
- discovered and possibly connected configurations only.
-
- If \a filter is set to zero this function returns all possible configurations.
-
- Note that this function returns the states for all configurations as they are known at
- the time of this function call. If for instance a configuration of type WLAN is defined
- the system may have to perform a WLAN scan in order to determine whether it is
- actually available. To obtain the most accurate state updateConfigurations() should
- be used to update each configuration's state. Note that such an update may require
- some time. It's completion is signalled by updateCompleted(). In the absence of a
- configuration update this function returns the best estimate at the time of the call.
- Therefore, if WLAN configurations are of interest, it is recommended that
- updateConfigurations() is called once after QNetworkConfigurationManager
- instantiation (WLAN scans are too time consuming to perform in constructor).
- After this the data is kept automatically up-to-date as the system reports
- any changes.
-*/
-QList<QNetworkConfiguration> QNetworkConfigurationManager::allConfigurations(QNetworkConfiguration::StateFlags filter) const
-{
- QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
- if (priv)
- return priv->allConfigurations(filter);
-
- return QList<QNetworkConfiguration>();
-}
-
-/*!
- Returns the QNetworkConfiguration for \a identifier; otherwise returns an
- invalid QNetworkConfiguration.
-
- \sa QNetworkConfiguration::identifier()
-*/
-QNetworkConfiguration QNetworkConfigurationManager::configurationFromIdentifier(const QString &identifier) const
-{
- QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
- if (priv)
- return priv->configurationFromIdentifier(identifier);
-
- return QNetworkConfiguration();
-}
-
-/*!
- Returns \c true if the system is considered to be connected to another device via an active
- network interface; otherwise returns \c false.
-
- This is equivalent to the following code snippet:
-
- \snippet code/src_network_bearer_qnetworkconfigmanager.cpp 0
-
- \sa onlineStateChanged()
-*/
-bool QNetworkConfigurationManager::isOnline() const
-{
- QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
- if (priv)
- return priv->isOnline();
-
- return false;
-}
-
-/*!
- Returns the capabilities supported by the current platform.
-*/
-QNetworkConfigurationManager::Capabilities QNetworkConfigurationManager::capabilities() const
-{
- QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
- if (priv)
- return priv->capabilities();
-
- return {};
-}
-
-/*!
- Initiates an update of all configurations. This may be used to initiate WLAN scans or other
- time consuming updates which may be required to obtain the correct state for configurations.
-
- This call is asynchronous. On completion of this update the updateCompleted() signal is
- emitted. If new configurations are discovered or old ones were removed or changed the update
- process may trigger the emission of one or multiple configurationAdded(),
- configurationRemoved() and configurationChanged() signals.
-
- If a configuration state changes as a result of this update all existing QNetworkConfiguration
- instances are updated automatically.
-
- \sa allConfigurations()
-*/
-void QNetworkConfigurationManager::updateConfigurations()
-{
- QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
- if (priv)
- priv->performAsyncConfigurationUpdate();
-}
-
-QT_END_NAMESPACE
-
-#include "moc_qnetworkconfigmanager.cpp"
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/network/bearer/qnetworkconfigmanager.h b/src/network/bearer/qnetworkconfigmanager.h
deleted file mode 100644
index b8f09f3d68..0000000000
--- a/src/network/bearer/qnetworkconfigmanager.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNETWORKCONFIGMANAGER_H
-#define QNETWORKCONFIGMANAGER_H
-
-#if 0
-#pragma qt_class(QNetworkConfigurationManager)
-#endif
-
-#include <QtNetwork/qtnetworkglobal.h>
-#include <QtCore/qobject.h>
-#include <QtNetwork/qnetworkconfiguration.h>
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkConfigurationManagerPrivate;
-class QT_DEPRECATED_BEARER_MANAGEMENT Q_NETWORK_EXPORT QNetworkConfigurationManager : public QObject
-{
- Q_OBJECT
-
-public:
- enum Capability {
- CanStartAndStopInterfaces = 0x00000001,
- DirectConnectionRouting = 0x00000002,
- SystemSessionSupport = 0x00000004,
- ApplicationLevelRoaming = 0x00000008,
- ForcedRoaming = 0x00000010,
- DataStatistics = 0x00000020,
- NetworkSessionRequired = 0x00000040
- };
-
- Q_DECLARE_FLAGS(Capabilities, Capability)
-
- explicit QNetworkConfigurationManager(QObject *parent = nullptr);
- virtual ~QNetworkConfigurationManager();
-
- QNetworkConfigurationManager::Capabilities capabilities() const;
-
- QNetworkConfiguration defaultConfiguration() const;
- QList<QNetworkConfiguration> allConfigurations(QNetworkConfiguration::StateFlags flags = QNetworkConfiguration::StateFlags()) const;
- QNetworkConfiguration configurationFromIdentifier(const QString &identifier) const;
-
- bool isOnline() const;
-
-public Q_SLOTS:
- void updateConfigurations();
-
-Q_SIGNALS:
- void configurationAdded(const QNetworkConfiguration &config);
- void configurationRemoved(const QNetworkConfiguration &config);
- void configurationChanged(const QNetworkConfiguration &config);
- void onlineStateChanged(bool isOnline);
- void updateCompleted();
-
-private:
- Q_DISABLE_COPY(QNetworkConfigurationManager)
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QNetworkConfigurationManager::Capabilities)
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
-
-QT_WARNING_POP
-
-#endif // QNETWORKCONFIGMANAGER_H
diff --git a/src/network/bearer/qnetworkconfigmanager_p.cpp b/src/network/bearer/qnetworkconfigmanager_p.cpp
deleted file mode 100644
index f0aa452dd3..0000000000
--- a/src/network/bearer/qnetworkconfigmanager_p.cpp
+++ /dev/null
@@ -1,517 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qnetworkconfigmanager_p.h"
-#include "qbearerplugin_p.h"
-
-#include <QtCore/qdebug.h>
-#include <QtCore/qtimer.h>
-#include <QtCore/qstringlist.h>
-#include <QtCore/qthread.h>
-#include <QtCore/private/qcoreapplication_p.h>
-#include <QtCore/private/qlocking_p.h>
-#include <QtCore/private/qthread_p.h>
-
-#include <QtCore/qbytearray.h>
-#include <QtCore/qglobal.h>
-
-#include <utility>
-
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-QNetworkConfigurationManagerPrivate::QNetworkConfigurationManagerPrivate()
- : QObject(), pollTimer(nullptr),
- loader(QBearerEngineFactoryInterface_iid, QLatin1String("/bearer")),
- forcedPolling(0), firstUpdate(true)
-{
- qRegisterMetaType<QNetworkConfiguration>();
- qRegisterMetaType<QNetworkConfigurationPrivatePointer>();
-}
-
-void QNetworkConfigurationManagerPrivate::initialize()
-{
- //Two stage construction, because we only want to do this heavyweight work for the winner of the Q_GLOBAL_STATIC race.
- bearerThread = new QDaemonThread();
- bearerThread->setObjectName(QStringLiteral("Qt bearer thread"));
-
- bearerThread->moveToThread(QCoreApplicationPrivate::mainThread()); // because cleanup() is called in main thread context.
- moveToThread(bearerThread);
- bearerThread->start();
- updateConfigurations();
-}
-
-QNetworkConfigurationManagerPrivate::~QNetworkConfigurationManagerPrivate()
-{
- QMutexLocker locker(&mutex);
-
- qDeleteAll(sessionEngines);
- sessionEngines.clear();
- if (bearerThread)
- bearerThread->quit();
-}
-
-void QNetworkConfigurationManagerPrivate::cleanup()
-{
- QThread* thread = bearerThread;
- deleteLater();
- if (thread->wait(QDeadlineTimer(5000)))
- delete thread;
-}
-
-QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration() const
-{
- QMutexLocker locker(&mutex);
-
- for (QBearerEngine *engine : sessionEngines) {
- QNetworkConfigurationPrivatePointer ptr = engine->defaultConfiguration();
- if (ptr) {
- QNetworkConfiguration config;
- config.d = ptr;
- return config;
- }
- }
-
- // Engines don't have a default configuration.
-
- // Return first active snap
- QNetworkConfigurationPrivatePointer defaultConfiguration;
-
- for (QBearerEngine *engine : sessionEngines) {
- const auto locker = qt_scoped_lock(engine->mutex);
-
- for (const auto &ptr : qAsConst(engine->snapConfigurations)) {
- const auto locker = qt_scoped_lock(ptr->mutex);
-
- if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- QNetworkConfiguration config;
- config.d = ptr;
- return config;
- } else if (!defaultConfiguration) {
- if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered)
- defaultConfiguration = ptr;
- }
- }
- }
-
- // No Active SNAPs return first Discovered SNAP.
- if (defaultConfiguration) {
- QNetworkConfiguration config;
- config.d = defaultConfiguration;
- return config;
- }
-
- /*
- No Active or Discovered SNAPs, find the perferred access point.
- The following priority order is used:
-
- 1. Active Ethernet
- 2. Active WLAN
- 3. Active Other
- 4. Discovered Ethernet
- 5. Discovered WLAN
- 6. Discovered Other
- */
-
- for (QBearerEngine *engine : sessionEngines) {
-
- QMutexLocker locker(&engine->mutex);
-
- for (const auto &ptr : qAsConst(engine->accessPointConfigurations)) {
-
- QMutexLocker configLocker(&ptr->mutex);
- QNetworkConfiguration::BearerType bearerType = ptr->bearerType;
-
- if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered) {
- if (!defaultConfiguration) {
- defaultConfiguration = ptr;
- } else {
- QMutexLocker defaultConfigLocker(&defaultConfiguration->mutex);
-
- if (defaultConfiguration->state == ptr->state) {
- switch (defaultConfiguration->bearerType) {
- case QNetworkConfiguration::BearerEthernet:
- // do nothing
- break;
- case QNetworkConfiguration::BearerWLAN:
- // Ethernet beats WLAN
- defaultConfiguration = ptr;
- break;
- default:
- // Ethernet and WLAN beats other
- if (bearerType == QNetworkConfiguration::BearerEthernet ||
- bearerType == QNetworkConfiguration::BearerWLAN) {
- defaultConfiguration = ptr;
- }
- }
- } else {
- // active beats discovered
- if ((defaultConfiguration->state & QNetworkConfiguration::Active) !=
- QNetworkConfiguration::Active) {
- defaultConfiguration = ptr;
- }
- }
- }
- }
- }
- }
-
- // No Active InternetAccessPoint return first Discovered InternetAccessPoint.
- if (defaultConfiguration) {
- QNetworkConfiguration config;
- config.d = defaultConfiguration;
- return config;
- }
-
- return QNetworkConfiguration();
-}
-
-QList<QNetworkConfiguration> QNetworkConfigurationManagerPrivate::allConfigurations(QNetworkConfiguration::StateFlags filter) const
-{
- QList<QNetworkConfiguration> result;
-
- QMutexLocker locker(&mutex);
-
- for (QBearerEngine *engine : sessionEngines) {
-
- const auto locker = qt_scoped_lock(engine->mutex);
-
- //find all InternetAccessPoints
- for (const auto &ptr : qAsConst(engine->accessPointConfigurations)) {
- const auto locker = qt_scoped_lock(ptr->mutex);
-
- if ((ptr->state & filter) == filter) {
- QNetworkConfiguration pt;
- pt.d = ptr;
- result << pt;
- }
- }
-
- //find all service networks
- for (const auto &ptr : qAsConst(engine->snapConfigurations)) {
- const auto locker = qt_scoped_lock(ptr->mutex);
-
- if ((ptr->state & filter) == filter) {
- QNetworkConfiguration pt;
- pt.d = ptr;
- result << pt;
- }
- }
- }
-
- return result;
-}
-
-QNetworkConfiguration QNetworkConfigurationManagerPrivate::configurationFromIdentifier(const QString &identifier) const
-{
- QNetworkConfiguration item;
-
- const auto locker = qt_scoped_lock(mutex);
-
- for (QBearerEngine *engine : sessionEngines) {
- const auto locker = qt_scoped_lock(engine->mutex);
- if (auto ptr = engine->accessPointConfigurations.value(identifier)) {
- item.d = std::move(ptr);
- break;
- }
- if (auto ptr = engine->snapConfigurations.value(identifier)) {
- item.d = std::move(ptr);
- break;
- }
- if (auto ptr = engine->userChoiceConfigurations.value(identifier)) {
- item.d = std::move(ptr);
- break;
- }
- }
-
- return item;
-}
-
-bool QNetworkConfigurationManagerPrivate::isOnline() const
-{
- const auto locker = qt_scoped_lock(mutex);
-
- // We need allConfigurations since onlineConfigurations is filled with queued connections
- // and thus is not always (more importantly just after creation) up to date
- return !allConfigurations(QNetworkConfiguration::Active).isEmpty();
-}
-
-QNetworkConfigurationManager::Capabilities QNetworkConfigurationManagerPrivate::capabilities() const
-{
- const auto locker = qt_scoped_lock(mutex);
-
- QNetworkConfigurationManager::Capabilities capFlags;
-
- for (QBearerEngine *engine : sessionEngines)
- capFlags |= engine->capabilities();
-
- return capFlags;
-}
-
-void QNetworkConfigurationManagerPrivate::configurationAdded(QNetworkConfigurationPrivatePointer ptr)
-{
- const auto locker = qt_scoped_lock(mutex);
-
- if (!firstUpdate) {
- QNetworkConfiguration item;
- item.d = ptr;
- emit configurationAdded(item);
- }
-
- auto ptrLocker = qt_unique_lock(ptr->mutex);
- if (ptr->state == QNetworkConfiguration::Active) {
- const auto id = ptr->id;
- ptrLocker.unlock();
- onlineConfigurations.insert(id);
- if (!firstUpdate && onlineConfigurations.count() == 1)
- emit onlineStateChanged(true);
- }
-}
-
-void QNetworkConfigurationManagerPrivate::configurationRemoved(QNetworkConfigurationPrivatePointer ptr)
-{
- const auto locker = qt_scoped_lock(mutex);
-
- {
- const auto locker = qt_scoped_lock(ptr->mutex);
- ptr->isValid = false;
- }
-
- if (!firstUpdate) {
- QNetworkConfiguration item;
- item.d = ptr;
- emit configurationRemoved(item);
- }
-
- onlineConfigurations.remove(ptr->id);
- if (!firstUpdate && onlineConfigurations.isEmpty())
- emit onlineStateChanged(false);
-}
-
-void QNetworkConfigurationManagerPrivate::configurationChanged(QNetworkConfigurationPrivatePointer ptr)
-{
- const auto locker = qt_scoped_lock(mutex);
-
- if (!firstUpdate) {
- QNetworkConfiguration item;
- item.d = ptr;
- emit configurationChanged(item);
- }
-
- bool previous = !onlineConfigurations.isEmpty();
-
- {
- const auto locker = qt_scoped_lock(ptr->mutex);
- if (ptr->state == QNetworkConfiguration::Active)
- onlineConfigurations.insert(ptr->id);
- else
- onlineConfigurations.remove(ptr->id);
- }
-
- bool online = !onlineConfigurations.isEmpty();
-
- if (!firstUpdate && online != previous)
- emit onlineStateChanged(online);
-}
-
-void QNetworkConfigurationManagerPrivate::updateConfigurations()
-{
- typedef QMultiMap<int, QString> PluginKeyMap;
- typedef PluginKeyMap::const_iterator PluginKeyMapConstIterator;
-
- auto locker = qt_unique_lock(mutex);
-
- if (firstUpdate) {
- if (qobject_cast<QBearerEngine *>(sender()))
- return;
-
- updating = false;
-
- bool envOK = false;
- const int skipGeneric = qEnvironmentVariableIntValue("QT_EXCLUDE_GENERIC_BEARER", &envOK);
- QBearerEngine *generic = nullptr;
- QFactoryLoader *l = &loader;
- const PluginKeyMap keyMap = l->keyMap();
- const PluginKeyMapConstIterator cend = keyMap.constEnd();
- QStringList addedEngines;
- for (PluginKeyMapConstIterator it = keyMap.constBegin(); it != cend; ++it) {
- const QString &key = it.value();
- if (addedEngines.contains(key))
- continue;
-
- addedEngines.append(key);
- if (QBearerEngine *engine = qLoadPlugin<QBearerEngine, QBearerEnginePlugin>(l, key)) {
- if (key == QLatin1String("generic"))
- generic = engine;
- else
- sessionEngines.append(engine);
-
- engine->moveToThread(bearerThread);
-
- connect(engine, SIGNAL(updateCompleted()),
- this, SLOT(updateConfigurations()),
- Qt::QueuedConnection);
- connect(engine, SIGNAL(configurationAdded(QNetworkConfigurationPrivatePointer)),
- this, SLOT(configurationAdded(QNetworkConfigurationPrivatePointer)),
- Qt::QueuedConnection);
- connect(engine, SIGNAL(configurationRemoved(QNetworkConfigurationPrivatePointer)),
- this, SLOT(configurationRemoved(QNetworkConfigurationPrivatePointer)),
- Qt::QueuedConnection);
- connect(engine, SIGNAL(configurationChanged(QNetworkConfigurationPrivatePointer)),
- this, SLOT(configurationChanged(QNetworkConfigurationPrivatePointer)),
- Qt::QueuedConnection);
- }
- }
-
- if (generic) {
- if (!envOK || skipGeneric <= 0)
- sessionEngines.append(generic);
- else
- delete generic;
- }
- }
-
- QBearerEngine *engine = qobject_cast<QBearerEngine *>(sender());
- if (engine && !updatingEngines.isEmpty())
- updatingEngines.remove(engine);
-
- if (updating && updatingEngines.isEmpty()) {
- updating = false;
- emit configurationUpdateComplete();
- }
-
- if (engine && !pollingEngines.isEmpty()) {
- pollingEngines.remove(engine);
- if (pollingEngines.isEmpty())
- startPolling();
- }
-
- if (firstUpdate) {
- firstUpdate = false;
- const QList<QBearerEngine*> enginesToInitialize = sessionEngines; //shallow copy the list in case it is modified when we unlock mutex
- locker.unlock();
- for (QBearerEngine* engine : enginesToInitialize)
- QMetaObject::invokeMethod(engine, "initialize", Qt::BlockingQueuedConnection);
- }
-}
-
-void QNetworkConfigurationManagerPrivate::performAsyncConfigurationUpdate()
-{
- const auto locker = qt_scoped_lock(mutex);
-
- if (sessionEngines.isEmpty()) {
- emit configurationUpdateComplete();
- return;
- }
-
- updating = true;
-
- for (QBearerEngine *engine : qAsConst(sessionEngines)) {
- updatingEngines.insert(engine);
- QMetaObject::invokeMethod(engine, "requestUpdate");
- }
-}
-
-QList<QBearerEngine *> QNetworkConfigurationManagerPrivate::engines() const
-{
- const auto locker = qt_scoped_lock(mutex);
-
- return sessionEngines;
-}
-
-void QNetworkConfigurationManagerPrivate::startPolling()
-{
- const auto locker = qt_scoped_lock(mutex);
- if (!pollTimer) {
- pollTimer = new QTimer(this);
- bool ok;
- int interval = qEnvironmentVariableIntValue("QT_BEARER_POLL_TIMEOUT", &ok);
- if (!ok)
- interval = 10000;//default 10 seconds
- pollTimer->setInterval(interval);
- pollTimer->setSingleShot(true);
- connect(pollTimer, SIGNAL(timeout()), this, SLOT(pollEngines()));
- }
-
- if (pollTimer->isActive())
- return;
-
- for (QBearerEngine *engine : qAsConst(sessionEngines)) {
- if (engine->requiresPolling() && (forcedPolling || engine->configurationsInUse())) {
- pollTimer->start();
- break;
- }
- }
- performAsyncConfigurationUpdate();
-}
-
-void QNetworkConfigurationManagerPrivate::pollEngines()
-{
- const auto locker = qt_scoped_lock(mutex);
-
- for (QBearerEngine *engine : qAsConst(sessionEngines)) {
- if (engine->requiresPolling() && (forcedPolling || engine->configurationsInUse())) {
- pollingEngines.insert(engine);
- QMetaObject::invokeMethod(engine, "requestUpdate");
- }
- }
-}
-
-void QNetworkConfigurationManagerPrivate::enablePolling()
-{
- const auto locker = qt_scoped_lock(mutex);
-
- ++forcedPolling;
-
- if (forcedPolling == 1)
- QMetaObject::invokeMethod(this, "startPolling");
-}
-
-void QNetworkConfigurationManagerPrivate::disablePolling()
-{
- const auto locker = qt_scoped_lock(mutex);
-
- --forcedPolling;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/network/bearer/qnetworkconfigmanager_p.h b/src/network/bearer/qnetworkconfigmanager_p.h
deleted file mode 100644
index 4819c2027c..0000000000
--- a/src/network/bearer/qnetworkconfigmanager_p.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNETWORKCONFIGMANAGER_P_H
-#define QNETWORKCONFIGMANAGER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtNetwork/private/qtnetworkglobal_p.h>
-#include "qnetworkconfigmanager.h"
-#include "qnetworkconfiguration_p.h"
-
-#include <QtCore/private/qfactoryloader_p.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qset.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-class QBearerEngine;
-class QTimer;
-
-class Q_NETWORK_EXPORT QNetworkConfigurationManagerPrivate : public QObject
-{
- Q_OBJECT
-
-public:
- QNetworkConfigurationManagerPrivate();
- virtual ~QNetworkConfigurationManagerPrivate();
-
- QNetworkConfiguration defaultConfiguration() const;
- QList<QNetworkConfiguration> allConfigurations(QNetworkConfiguration::StateFlags filter) const;
- QNetworkConfiguration configurationFromIdentifier(const QString &identifier) const;
-
- bool isOnline() const;
-
- QNetworkConfigurationManager::Capabilities capabilities() const;
-
- void performAsyncConfigurationUpdate();
-
- QList<QBearerEngine *> engines() const;
-
- void enablePolling();
- void disablePolling();
-
- void initialize();
- void cleanup();
-public Q_SLOTS:
- void updateConfigurations();
-
- static void addPreAndPostRoutine();
-
-Q_SIGNALS:
- void configurationAdded(const QNetworkConfiguration &config);
- void configurationRemoved(const QNetworkConfiguration &config);
- void configurationChanged(const QNetworkConfiguration &config);
- void configurationUpdateComplete();
- void onlineStateChanged(bool isOnline);
-
-private Q_SLOTS:
- void configurationAdded(QNetworkConfigurationPrivatePointer ptr);
- void configurationRemoved(QNetworkConfigurationPrivatePointer ptr);
- void configurationChanged(QNetworkConfigurationPrivatePointer ptr);
-
- void pollEngines();
-
-
-private:
- Q_INVOKABLE void startPolling();
- QTimer *pollTimer;
- QThread *bearerThread;
-
-private:
- mutable QRecursiveMutex mutex;
-
- QFactoryLoader loader;
- QList<QBearerEngine *> sessionEngines;
-
- QSet<QString> onlineConfigurations;
-
- QSet<QBearerEngine *> pollingEngines;
- QSet<QBearerEngine *> updatingEngines;
- int forcedPolling;
- bool updating;
-
- bool firstUpdate;
-};
-
-Q_NETWORK_EXPORT QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate();
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
-
-#endif // QNETWORKCONFMANAGER_P_H
diff --git a/src/network/bearer/qnetworkconfiguration.cpp b/src/network/bearer/qnetworkconfiguration.cpp
deleted file mode 100644
index f016dea590..0000000000
--- a/src/network/bearer/qnetworkconfiguration.cpp
+++ /dev/null
@@ -1,596 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtNetwork/private/qtnetworkglobal_p.h>
-
-#include "qnetworkconfiguration.h"
-#include "qnetworkconfiguration_p.h"
-#include <QDebug>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QNetworkConfiguration
- \obsolete
-
- \brief The QNetworkConfiguration class provides an abstraction of one or more access point configurations.
-
- \since 4.7
-
- \inmodule QtNetwork
- \ingroup network
- \ingroup shared
-
- QNetworkConfiguration encapsulates a single access point or service network.
- In most cases a single access point configuration can be mapped to one network
- interface. However a single network interface may not always map to only one
- access point configuration. Multiple configurations for the same
- network device may enable multiple access points. An example
- device that could exhibit such a configuration might be a
- Smartphone which allows the user to manage multiple WLAN
- configurations while the device itself has only one WLAN network device.
-
- The QNetworkConfiguration also supports the concept of service networks.
- This concept allows the grouping of multiple access point configurations
- into one entity. Such a group is called service network and can be
- beneficial in cases whereby a network session to a
- particular destination network is required (e.g. a company network).
- When using a service network the user doesn't usually care which one of the
- connectivity options is chosen (e.g. corporate WLAN or VPN via GPRS)
- as long as he can reach the company's target server. Depending
- on the current position and time some of the access points that make
- up the service network may not even be available. Furthermore
- automated access point roaming can be enabled which enables the device
- to change the network interface configuration dynamically while maintaining
- the applications connection to the target network. It allows adaption
- to the changing environment and may enable optimization with regards to
- cost, speed or other network parameters.
-
- Special configurations of type UserChoice provide a placeholder configuration which is
- resolved to an actual network configuration by the platform when a
- \l {QNetworkSession}{session} is \l {QNetworkSession::open()}{opened}. Not all platforms
- support the concept of a user choice configuration.
-
- \section1 Configuration States
-
- The list of available configurations can be obtained via
- QNetworkConfigurationManager::allConfigurations(). A configuration can have
- multiple states. The \l Defined configuration state indicates that the configuration
- is stored on the device. However the configuration is not yet ready to be activated
- as e.g. a WLAN may not be available at the current time.
-
- The \l Discovered state implies that the configuration is \l Defined and
- the outside conditions are such that the configuration can be used immediately
- to open a new network session. An example of such an outside condition may be
- that the Ethernet cable is actually connected to the device or that the WLAN
- with the specified SSID is in range.
-
- The \l Active state implies that the configuration is \l Discovered. A configuration
- in this state is currently being used by an application. The underlying network
- interface has a valid IP configuration and can transfer IP packets between the
- device and the target network.
-
- The \l Undefined state indicates that the system has knowledge of possible target
- networks but cannot actually use that knowledge to connect to it. An example
- for such a state could be an encrypted WLAN that has been discovered
- but the user hasn't actually saved a configuration including the required password
- which would allow the device to connect to it.
-
- Depending on the type of configuration some states are transient in nature. A GPRS/UMTS
- connection may almost always be \l Discovered if the GSM/UMTS network is available.
- However if the GSM/UMTS network loses the connection the associated configuration may change its state
- from \l Discovered to \l Defined as well. A similar use case might be triggered by
- WLAN availability. QNetworkConfigurationManager::updateConfigurations() can be used to
- manually trigger updates of states. Note that some platforms do not require such updates
- as they implicitly change the state once it has been discovered. If the state of a
- configuration changes all related QNetworkConfiguration instances change their state automatically.
-
- \sa QNetworkSession, QNetworkConfigurationManager
-*/
-
-/*!
- \enum QNetworkConfiguration::Type
-
- This enum describes the type of configuration.
-
- \value InternetAccessPoint The configuration specifies the details for a single access point.
- Note that configurations of type InternetAccessPoint may be part
- of other QNetworkConfigurations of type ServiceNetwork.
- \value ServiceNetwork The configuration is based on a group of QNetworkConfigurations of
- type InternetAccessPoint. All group members can reach the same
- target network. This type of configuration is a mandatory
- requirement for roaming enabled network sessions. On some
- platforms this form of configuration may also be called Service
- Network Access Point (SNAP).
- \value UserChoice The configuration is a placeholder which will be resolved to an
- actual configuration by the platform when a session is opened. Depending
- on the platform the selection may generate a popup dialog asking the user
- for his preferred choice.
- \value Invalid The configuration is invalid.
-*/
-
-/*!
- \enum QNetworkConfiguration::StateFlag
-
- Specifies the configuration states.
-
- \value Undefined This state is used for transient configurations such as newly discovered
- WLANs for which the user has not actually created a configuration yet.
- \value Defined Defined configurations are known to the system but are not immediately
- usable (e.g. a configured WLAN is not within range or the Ethernet cable
- is currently not plugged into the machine).
- \value Discovered A discovered configuration can be immediately used to create a new
- QNetworkSession. An example of a discovered configuration could be a WLAN
- which is within in range. If the device moves out of range the discovered
- flag is dropped. A second example is a GPRS configuration which generally
- remains discovered for as long as the device has network coverage. A
- configuration that has this state is also in state
- QNetworkConfiguration::Defined. If the configuration is a service network
- this flag is set if at least one of the underlying access points
- configurations has the Discovered state.
- \value Active The configuration is currently used by an open network session
- (see \l QNetworkSession::isOpen()). However this does not mean that the
- current process is the entity that created the open session. It merely
- indicates that if a new QNetworkSession were to be constructed based on
- this configuration \l QNetworkSession::state() would return
- \l QNetworkSession::Connected. This state implies the
- QNetworkConfiguration::Discovered state.
-*/
-
-/*!
- \enum QNetworkConfiguration::Purpose
-
- Specifies the purpose of the configuration.
-
- \value UnknownPurpose The configuration doesn't specify any purpose. This is the default value.
- \value PublicPurpose The configuration can be used for general purpose internet access.
- \value PrivatePurpose The configuration is suitable to access a private network such as an office Intranet.
- \value ServiceSpecificPurpose The configuration can be used for operator specific services (e.g.
- receiving MMS messages or content streaming).
-*/
-
-/*!
- \enum QNetworkConfiguration::BearerType
-
- Specifies the type of bearer used by a configuration.
-
- \value BearerUnknown The type of bearer is unknown or unspecified. The bearerTypeName()
- function may return additional information.
- \value BearerEthernet The configuration is for an Ethernet interfaces.
- \value BearerWLAN The configuration is for a Wireless LAN interface.
- \value Bearer2G The configuration is for a CSD, GPRS, HSCSD, EDGE or cdmaOne interface.
- \value Bearer3G The configuration is for a 3G interface.
- \value Bearer4G The configuration is for a 4G interface.
- \value BearerCDMA2000 The configuration is for CDMA interface.
- \value BearerWCDMA The configuration is for W-CDMA/UMTS interface.
- \value BearerHSPA The configuration is for High Speed Packet Access (HSPA) interface.
- \value BearerBluetooth The configuration is for a Bluetooth interface.
- \value BearerWiMAX The configuration is for a WiMAX interface.
- \value BearerEVDO The configuration is for an EVDO (3G) interface.
- \value BearerLTE The configuration is for a LTE (4G) interface.
-*/
-
-/*!
- Constructs an invalid configuration object.
-
- \sa isValid()
-*/
-QNetworkConfiguration::QNetworkConfiguration()
- : d(nullptr)
-{
-}
-
-/*!
- Creates a copy of the QNetworkConfiguration object contained in \a other.
-*/
-QNetworkConfiguration::QNetworkConfiguration(const QNetworkConfiguration &other)
- : d(other.d)
-{
-}
-
-/*!
- Frees the resources associated with the QNetworkConfiguration object.
-*/
-QNetworkConfiguration::~QNetworkConfiguration()
-{
-}
-
-/*!
- Copies the content of the QNetworkConfiguration object contained in \a other into this one.
-*/
-QNetworkConfiguration &QNetworkConfiguration::operator=(const QNetworkConfiguration &other)
-{
- d = other.d;
- return *this;
-}
-
-/*!
- \fn void QNetworkConfiguration::swap(QNetworkConfiguration &other)
- \since 5.0
-
- Swaps this network configuration with \a other. This function is
- very fast and never fails.
-*/
-
-/*!
- Returns \c true, if this configuration is the same as the \a other
- configuration given; otherwise returns \c false.
-*/
-bool QNetworkConfiguration::operator==(const QNetworkConfiguration &other) const
-{
- return (d == other.d);
-}
-
-/*!
- \fn bool QNetworkConfiguration::operator!=(const QNetworkConfiguration &other) const
-
- Returns \c true if this configuration is not the same as the \a other
- configuration given; otherwise returns \c false.
-*/
-
-/*!
- Returns the user visible name of this configuration.
-
- The name may either be the name of the underlying access point or the
- name for service network that this configuration represents.
-*/
-QString QNetworkConfiguration::name() const
-{
- if (!d)
- return QString();
-
- QMutexLocker locker(&d->mutex);
- return d->name;
-}
-
-/*!
- Returns the unique and platform specific identifier for this network configuration;
- otherwise an empty string.
-*/
-QString QNetworkConfiguration::identifier() const
-{
- if (!d)
- return QString();
-
- QMutexLocker locker(&d->mutex);
- return d->id;
-}
-
-/*!
- Returns the type of the configuration.
-
- A configuration can represent a single access point configuration or
- a set of access point configurations. Such a set is called service network.
- A configuration that is based on a service network can potentially support
- roaming of network sessions.
-*/
-QNetworkConfiguration::Type QNetworkConfiguration::type() const
-{
- if (!d)
- return QNetworkConfiguration::Invalid;
-
- QMutexLocker locker(&d->mutex);
- return d->type;
-}
-
-/*!
- Returns \c true if this QNetworkConfiguration object is valid.
- A configuration may become invalid if the user deletes the configuration or
- the configuration was default-constructed.
-
- The addition and removal of configurations can be monitored via the
- QNetworkConfigurationManager.
-
- \sa QNetworkConfigurationManager
-*/
-bool QNetworkConfiguration::isValid() const
-{
- if (!d)
- return false;
-
- QMutexLocker locker(&d->mutex);
- return d->isValid;
-}
-
-/*!
- \since 5.9
-
- Returns the connect timeout of this configuration.
-
- \sa setConnectTimeout
-*/
-int QNetworkConfiguration::connectTimeout() const
-{
- if (!d)
- return QNetworkConfigurationPrivate::DefaultTimeout;
- QMutexLocker locker(&d->mutex);
- return d->timeout;
-}
-
-/*!
- \since 5.9
-
- Sets the connect timeout of this configuration to \a timeout.
- This allows control of the timeout used by \c QAbstractSocket
- to establish a connection.
-
- \note \a timeout is in millisecond.
-
- \warning This will have no effect if the bearer plugin doesn't have
- the CanStartAndStopInterfaces capability.
-
- Returns true if succeeded.
-
- \sa connectTimeout
-*/
-bool QNetworkConfiguration::setConnectTimeout(int timeout)
-{
- if (!d)
- return false;
- QMutexLocker locker(&d->mutex);
- d->timeout = timeout;
- return true;
-}
-
-/*!
- Returns the current state of the configuration.
-*/
-QNetworkConfiguration::StateFlags QNetworkConfiguration::state() const
-{
- if (!d)
- return QNetworkConfiguration::Undefined;
-
- QMutexLocker locker(&d->mutex);
- return d->state;
-}
-
-/*!
- Returns the purpose of this configuration.
-
- The purpose field may be used to programmatically determine the
- purpose of a configuration. Such information is usually part of the
- access point or service network meta data.
-*/
-QNetworkConfiguration::Purpose QNetworkConfiguration::purpose() const
-{
- if (!d)
- return QNetworkConfiguration::UnknownPurpose;
-
- QMutexLocker locker(&d->mutex);
- return d->purpose;
-}
-
-/*!
- Returns \c true if this configuration supports roaming; otherwise false.
-*/
-bool QNetworkConfiguration::isRoamingAvailable() const
-{
- if (!d)
- return false;
-
- QMutexLocker locker(&d->mutex);
- return d->roamingSupported;
-}
-
-/*!
- Returns all sub configurations of this network configuration in priority order. The first sub
- configuration in the list has the highest priority.
-
- Only network configurations of type \l ServiceNetwork can have children. Otherwise this
- function returns an empty list.
-*/
-QList<QNetworkConfiguration> QNetworkConfiguration::children() const
-{
- return {};
-}
-
-/*!
- Returns the type of bearer used by this network configuration.
-
- If the bearer type is \l {QNetworkConfiguration::BearerUnknown}{unknown} the bearerTypeName()
- function can be used to retrieve a textural type name for the bearer.
-
- An invalid network configuration always returns the BearerUnknown value.
-
- \sa bearerTypeName(), bearerTypeFamily()
-*/
-QNetworkConfiguration::BearerType QNetworkConfiguration::bearerType() const
-{
- if (!isValid())
- return BearerUnknown;
-
- QMutexLocker locker(&d->mutex);
- return d->bearerType;
-}
-
-/*!
- \since 5.2
-
- Returns the bearer type family used by this network configuration.
- The following table lists how bearerType() values map to
- bearerTypeFamily() values:
-
- \table
- \header
- \li bearer type
- \li bearer type family
- \row
- \li BearerUnknown, Bearer2G, BearerEthernet, BearerWLAN,
- BearerBluetooth
- \li (same type)
- \row
- \li BearerCDMA2000, BearerEVDO, BearerWCDMA, BearerHSPA, Bearer3G
- \li Bearer3G
- \row
- \li BearerWiMAX, BearerLTE, Bearer4G
- \li Bearer4G
- \endtable
-
- An invalid network configuration always returns the BearerUnknown value.
-
- \sa bearerType(), bearerTypeName()
-*/
-QNetworkConfiguration::BearerType QNetworkConfiguration::bearerTypeFamily() const
-{
- QNetworkConfiguration::BearerType type = bearerType();
- switch (type) {
- case QNetworkConfiguration::BearerUnknown: // fallthrough
- case QNetworkConfiguration::Bearer2G: // fallthrough
- case QNetworkConfiguration::BearerEthernet: // fallthrough
- case QNetworkConfiguration::BearerWLAN: // fallthrough
- case QNetworkConfiguration::BearerBluetooth:
- return type;
- case QNetworkConfiguration::BearerCDMA2000: // fallthrough
- case QNetworkConfiguration::BearerEVDO: // fallthrough
- case QNetworkConfiguration::BearerWCDMA: // fallthrough
- case QNetworkConfiguration::BearerHSPA: // fallthrough
- case QNetworkConfiguration::Bearer3G:
- return QNetworkConfiguration::Bearer3G;
- case QNetworkConfiguration::BearerWiMAX: // fallthrough
- case QNetworkConfiguration::BearerLTE: // fallthrough
- case QNetworkConfiguration::Bearer4G:
- return QNetworkConfiguration::Bearer4G;
- default:
- qWarning() << "unknown bearer type" << type;
- return QNetworkConfiguration::BearerUnknown;
- }
-}
-/*!
- Returns the type of bearer used by this network configuration as a string.
-
- The string is not translated and therefore cannot be shown to the user. The subsequent table
- shows the fixed mappings between BearerType and the bearer type name for known types. If the
- BearerType is unknown this function may return additional information if it is available;
- otherwise an empty string will be returned.
-
- \table
- \header
- \li BearerType
- \li Value
- \row
- \li BearerUnknown
- \li The session is based on an unknown or unspecified bearer type. The value of the
- string returned describes the bearer type.
- \row
- \li BearerEthernet
- \li Ethernet
- \row
- \li BearerWLAN
- \li WLAN
- \row
- \li Bearer2G
- \li 2G
- \row
- \li Bearer3G
- \li 3G
- \row
- \li Bearer4G
- \li 4G
- \row
- \li BearerCDMA2000
- \li CDMA2000
- \row
- \li BearerWCDMA
- \li WCDMA
- \row
- \li BearerHSPA
- \li HSPA
- \row
- \li BearerBluetooth
- \li Bluetooth
- \row
- \li BearerWiMAX
- \li WiMAX
- \row
- \li BearerEVDO
- \li EVDO
- \row
- \li BearerLTE
- \li LTE
- \endtable
-
- This function returns an empty string if this is an invalid configuration, a network
- configuration of type \l QNetworkConfiguration::ServiceNetwork or
- \l QNetworkConfiguration::UserChoice.
-
- \sa bearerType(), bearerTypeFamily()
-*/
-QString QNetworkConfiguration::bearerTypeName() const
-{
- if (!isValid())
- return QString();
-
- QMutexLocker locker(&d->mutex);
-
- if (d->type == QNetworkConfiguration::ServiceNetwork ||
- d->type == QNetworkConfiguration::UserChoice)
- return QString();
-
- switch (d->bearerType) {
- case BearerEthernet:
- return QStringLiteral("Ethernet");
- case BearerWLAN:
- return QStringLiteral("WLAN");
- case Bearer2G:
- return QStringLiteral("2G");
- case Bearer3G:
- return QStringLiteral("3G");
- case Bearer4G:
- return QStringLiteral("4G");
- case BearerCDMA2000:
- return QStringLiteral("CDMA2000");
- case BearerWCDMA:
- return QStringLiteral("WCDMA");
- case BearerHSPA:
- return QStringLiteral("HSPA");
- case BearerBluetooth:
- return QStringLiteral("Bluetooth");
- case BearerWiMAX:
- return QStringLiteral("WiMAX");
- case BearerEVDO:
- return QStringLiteral("EVDO");
- case BearerLTE:
- return QStringLiteral("LTE");
- case BearerUnknown:
- break;
- }
- return QStringLiteral("Unknown");
-}
-
-QT_END_NAMESPACE
diff --git a/src/network/bearer/qnetworkconfiguration.h b/src/network/bearer/qnetworkconfiguration.h
deleted file mode 100644
index 69864a3165..0000000000
--- a/src/network/bearer/qnetworkconfiguration.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNETWORKCONFIGURATION_H
-#define QNETWORKCONFIGURATION_H
-
-#if 0
-#pragma qt_class(QNetworkConfiguration)
-#endif
-
-#include <QtNetwork/qtnetworkglobal.h>
-
-#include <QtCore/qshareddata.h>
-#include <QtCore/qstring.h>
-#include <QtCore/qlist.h>
-#include <QtCore/qmetatype.h>
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkConfigurationPrivate;
-class QT_DEPRECATED_BEARER_MANAGEMENT Q_NETWORK_EXPORT QNetworkConfiguration
-{
-public:
- QNetworkConfiguration();
- QNetworkConfiguration(const QNetworkConfiguration& other);
- QNetworkConfiguration &operator=(QNetworkConfiguration &&other) noexcept { swap(other); return *this; }
- QNetworkConfiguration &operator=(const QNetworkConfiguration &other);
- ~QNetworkConfiguration();
-
- void swap(QNetworkConfiguration &other) noexcept { qSwap(d, other.d); }
-
- bool operator==(const QNetworkConfiguration &other) const;
- inline bool operator!=(const QNetworkConfiguration &other) const
- { return !operator==(other); }
-
- enum Type {
- InternetAccessPoint = 0,
- ServiceNetwork,
- UserChoice,
- Invalid
- };
-
- enum Purpose {
- UnknownPurpose = 0,
- PublicPurpose,
- PrivatePurpose,
- ServiceSpecificPurpose
- };
-
- enum StateFlag {
- Undefined = 0x0000001,
- Defined = 0x0000002,
- Discovered = 0x0000006,
- Active = 0x000000e
- };
- Q_DECLARE_FLAGS(StateFlags, StateFlag)
-
- enum BearerType {
- BearerUnknown,
- BearerEthernet,
- BearerWLAN,
- Bearer2G,
- BearerCDMA2000,
- BearerWCDMA,
- BearerHSPA,
- BearerBluetooth,
- BearerWiMAX,
- BearerEVDO,
- BearerLTE,
- Bearer3G,
- Bearer4G
- };
-
- StateFlags state() const;
- Type type() const;
- Purpose purpose() const;
-
- BearerType bearerType() const;
- BearerType bearerTypeFamily() const;
- QString bearerTypeName() const;
-
- QString identifier() const;
- bool isRoamingAvailable() const;
- QList<QNetworkConfiguration> children() const;
-
- QString name() const;
- bool isValid() const;
-
- int connectTimeout() const;
- bool setConnectTimeout(int timeout);
-
-private:
- friend class QNetworkConfigurationPrivate;
- friend class QNetworkConfigurationManager;
- friend class QNetworkConfigurationManagerPrivate;
- friend class QNetworkSessionPrivate;
- QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> d;
-};
-
-Q_DECLARE_SHARED(QNetworkConfiguration)
-
-QT_END_NAMESPACE
-
-Q_DECLARE_METATYPE(QNetworkConfiguration)
-
-QT_WARNING_POP
-
-#endif // QNETWORKCONFIGURATION_H
diff --git a/src/network/bearer/qnetworkconfiguration_p.h b/src/network/bearer/qnetworkconfiguration_p.h
deleted file mode 100644
index 96854fe831..0000000000
--- a/src/network/bearer/qnetworkconfiguration_p.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNETWORKCONFIGURATIONPRIVATE_H
-#define QNETWORKCONFIGURATIONPRIVATE_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtNetwork/private/qtnetworkglobal_p.h>
-#include "qnetworkconfiguration.h"
-
-#include <QtCore/qshareddata.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qmap.h>
-
-QT_BEGIN_NAMESPACE
-
-typedef QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> QNetworkConfigurationPrivatePointer;
-class QNetworkConfigurationPrivate : public QSharedData
-{
-public:
- QNetworkConfigurationPrivate() :
- type(QNetworkConfiguration::Invalid),
- purpose(QNetworkConfiguration::UnknownPurpose),
- bearerType(QNetworkConfiguration::BearerUnknown),
- isValid(false), roamingSupported(false),
- timeout(DefaultTimeout)
- {}
-
- mutable QRecursiveMutex mutex;
-
- QString name;
- QString id;
-
- QNetworkConfiguration::StateFlags state;
- QNetworkConfiguration::Type type;
- QNetworkConfiguration::Purpose purpose;
- QNetworkConfiguration::BearerType bearerType;
-
- bool isValid;
- bool roamingSupported;
- int timeout;
-
- static Q_CONSTEXPR int DefaultTimeout = 30000;
-
-private:
- Q_DISABLE_COPY_MOVE(QNetworkConfigurationPrivate)
-};
-
-QT_END_NAMESPACE
-
-Q_DECLARE_METATYPE(QNetworkConfigurationPrivatePointer)
-
-#endif // QNETWORKCONFIGURATIONPRIVATE_H
diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp
deleted file mode 100644
index 4e8ed1619b..0000000000
--- a/src/network/bearer/qnetworksession.cpp
+++ /dev/null
@@ -1,743 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtNetwork/private/qtnetworkglobal_p.h>
-
-#include "qnetworksession.h"
-#include "qnetworksession_p.h"
-#include "qbearerengine_p.h"
-
-#include <QEventLoop>
-#include <QMetaMethod>
-#include <QTimer>
-#include <QThread>
-
-#include "qnetworkconfigmanager_p.h"
-
-// for QNetworkSession::interface
-#ifdef interface
-# undef interface
-#endif
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QNetworkSession
- \obsolete
-
- \brief The QNetworkSession class provides control over the system's access points
- and enables session management for cases when multiple clients access the same access point.
-
- \since 4.7
-
- \inmodule QtNetwork
- \ingroup network
-
- A QNetworkSession enables control over the system's network interfaces. The session's configuration
- parameter are determined via the QNetworkConfiguration object to which it is bound. Depending on the
- type of the session (single access point or service network) a session may be linked to one or more
- network interfaces. By means of \l{open()}{opening} and \l{close()}{closing} of network sessions
- a developer can start and stop the systems network interfaces. If the configuration represents
- multiple access points (see \l QNetworkConfiguration::ServiceNetwork) more advanced features such as roaming may be supported.
-
- QNetworkSession supports session management within the same process and depending on the platform's
- capabilities may support out-of-process sessions. If the same
- network configuration is used by multiple open sessions the underlying network interface is only terminated once
- the last session has been closed.
-
- \section1 Roaming
-
- Applications may connect to the preferredConfigurationChanged() signal in order to
- receive notifications when a more suitable access point becomes available.
- In response to this signal the application must either initiate the roaming via migrate()
- or ignore() the new access point. Once the session has roamed the
- newConfigurationActivated() signal is emitted. The application may now test the
- carrier and must either accept() or reject() it. The session will return to the previous
- access point if the roaming was rejected. The subsequent state diagram depicts the required
- state transitions.
-
- \image roaming-states.png
-
- Some platforms may distinguish forced roaming and application level roaming (ALR).
- ALR implies that the application controls (via migrate(), ignore(), accept() and reject())
- whether a network session can roam from one access point to the next. Such control is useful
- if the application maintains stateful socket connections and wants to control the transition from
- one interface to the next. Forced roaming implies that the system automatically roams to the next network without
- consulting the application. This has the advantage that the application can make use of roaming features
- without actually being aware of it. It is expected that the application detects that the underlying
- socket is broken and automatically reconnects via the new network link.
-
- If the platform supports both modes of roaming, an application indicates its preference
- by connecting to the preferredConfigurationChanged() signal. Connecting to this signal means that
- the application wants to take control over the roaming behavior and therefore implies application
- level roaming. If the client does not connect to the preferredConfigurationChanged(), forced roaming
- is used. If forced roaming is not supported the network session will not roam by default.
-
- Some applications may want to suppress any form of roaming altogether. Possible use cases may be
- high priority downloads or remote services which cannot handle a roaming enabled client. Clients
- can suppress roaming by connecting to the preferredConfigurationChanged() signal and answer each
- signal emission with ignore().
-
- \sa QNetworkConfiguration, QNetworkConfigurationManager
-*/
-
-/*!
- \enum QNetworkSession::State
-
- This enum describes the connectivity state of the session. If the session is based on a
- single access point configuration the state of the session is the same as the state of the
- associated network interface.
-
- \value Invalid The session is invalid due to an invalid configuration. This may
- happen due to a removed access point or a configuration that was
- invalid to begin with.
- \value NotAvailable The session is based on a defined but not yet discovered QNetworkConfiguration
- (see \l QNetworkConfiguration::StateFlag).
- \value Connecting The network session is being established.
- \value Connected The network session is connected. If the current process wishes to use this session
- it has to register its interest by calling open(). A network session
- is considered to be ready for socket operations if it isOpen() and connected.
- \value Closing The network session is in the process of being shut down.
- \value Disconnected The network session is not connected. The associated QNetworkConfiguration
- has the state QNetworkConfiguration::Discovered.
- \value Roaming The network session is roaming from one access point to another
- access point.
-*/
-
-/*!
- \enum QNetworkSession::SessionError
-
- This enum describes the session errors that can occur.
-
- \value UnknownSessionError An unidentified error occurred.
- \value SessionAbortedError The session was aborted by the user or system.
- \value RoamingError The session cannot roam to a new configuration.
- \value OperationNotSupportedError The operation is not supported for current configuration.
- \value InvalidConfigurationError The operation cannot currently be performed for the
- current configuration.
-*/
-
-/*!
- \enum QNetworkSession::UsagePolicy
- \since 5.0
-
- These flags allow the system to inform the application of network usage restrictions that
- may be in place.
-
- \value NoPolicy No policy in force, usage is unrestricted.
- \value NoBackgroundTrafficPolicy Background network traffic (not user initiated) should be avoided
- for example to save battery or data charges
-*/
-
-/*!
- \fn void QNetworkSession::stateChanged(QNetworkSession::State state)
-
- This signal is emitted whenever the state of the network session changes.
- The \a state parameter is the new state.
-
- \sa state()
-*/
-
-/*!
- \fn void QNetworkSession::error(QNetworkSession::SessionError error)
-
- This signal is emitted after an error occurred. The \a error parameter
- describes the error that occurred.
-
- \sa error(), errorString()
-*/
-
-/*!
- \fn void QNetworkSession::preferredConfigurationChanged(const QNetworkConfiguration &config, bool isSeamless)
-
- This signal is emitted when the preferred configuration/access point for the
- session changes. Only sessions which are based on service network configurations
- may emit this signal. \a config can be used to determine access point specific
- details such as proxy settings and \a isSeamless indicates whether roaming will
- break the sessions IP address.
-
- As a consequence to this signal the application must either start the roaming process
- by calling migrate() or choose to ignore() the new access point.
-
- If the roaming process is non-seamless the IP address will change which means that
- a socket becomes invalid. However seamless mobility can ensure that the local IP address
- does not change. This is achieved by using a virtual IP address which is bound to the actual
- link address. During the roaming process the virtual address is attached to the new link
- address.
-
- Some platforms may support the concept of Forced Roaming and Application Level Roaming (ALR).
- Forced roaming implies that the platform may simply roam to a new configuration without
- consulting applications. It is up to the application to detect the link layer loss and reestablish
- its sockets. In contrast ALR provides the opportunity to prevent the system from roaming.
- If this session is based on a configuration that supports roaming the application can choose
- whether it wants to be consulted (ALR use case) by connecting to this signal. For as long as this signal
- connection remains the session remains registered as a roaming stakeholder; otherwise roaming will
- be enforced by the platform.
-
- \sa migrate(), ignore(), QNetworkConfiguration::isRoamingAvailable()
-*/
-
-/*!
- \fn void QNetworkSession::newConfigurationActivated()
-
- This signal is emitted once the session has roamed to the new access point.
- The application may reopen its socket and test the suitability of the new network link.
- Subsequently it must either accept() or reject() the new access point.
-
- \sa accept(), reject()
-*/
-
-/*!
- \fn void QNetworkSession::opened()
-
- This signal is emitted when the network session has been opened.
-
- The underlying network interface will not be shut down as long as the session remains open.
- Note that this feature is dependent on \l{QNetworkConfigurationManager::SystemSessionSupport}{system wide session support}.
-*/
-
-/*!
- \fn void QNetworkSession::closed()
-
- This signal is emitted when the network session has been closed.
-*/
-
-/*!
- \fn void QNetworkSession::usagePoliciesChanged(QNetworkSession::UsagePolicies usagePolicies)
- \since 5.0
-
- This signal is emitted when the \a usagePolicies in force are changed by the system.
-*/
-
-/*!
- Constructs a session based on \a connectionConfig with the given \a parent.
-
- \sa QNetworkConfiguration
-*/
-QNetworkSession::QNetworkSession(const QNetworkConfiguration &connectionConfig, QObject *parent)
- : QObject(parent), d(nullptr)
-{
- qRegisterMetaType<QNetworkSession::State>();
- qRegisterMetaType<QNetworkSession::SessionError>();
- qRegisterMetaType<QNetworkSession::UsagePolicies>();
-
- // invalid configuration
- if (!connectionConfig.identifier().isEmpty()) {
- auto priv = qNetworkConfigurationManagerPrivate();
- const auto engines = priv ? priv->engines() : QList<QBearerEngine *>();
- for (QBearerEngine *engine : engines) {
- if (engine->hasIdentifier(connectionConfig.identifier())) {
- d = engine->createSessionBackend();
- d->q = this;
- d->publicConfig = connectionConfig;
- d->syncStateWithInterface();
- connect(d, SIGNAL(quitPendingWaitsForOpened()), this, SIGNAL(opened()));
- connect(d, SIGNAL(error(QNetworkSession::SessionError)),
- this, SIGNAL(error(QNetworkSession::SessionError)));
- connect(d, SIGNAL(stateChanged(QNetworkSession::State)),
- this, SIGNAL(stateChanged(QNetworkSession::State)));
- connect(d, SIGNAL(closed()), this, SIGNAL(closed()));
- connect(d, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)),
- this, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)));
- connect(d, SIGNAL(newConfigurationActivated()),
- this, SIGNAL(newConfigurationActivated()));
- connect(d, SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)),
- this, SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)));
- break;
- }
- }
- }
-}
-
-/*!
- Frees the resources associated with the QNetworkSession object.
-*/
-QNetworkSession::~QNetworkSession()
-{
- delete d;
-}
-
-/*!
- Creates an open session which increases the session counter on the underlying network interface.
- The system will not terminate a network interface until the session reference counter reaches zero.
- Therefore an open session allows an application to register its use of the interface.
-
- As a result of calling open() the interface will be started if it is not connected/up yet.
- Some platforms may not provide support for out-of-process sessions. On such platforms the session
- counter ignores any sessions held by another process. The platform capabilities can be
- detected via QNetworkConfigurationManager::capabilities().
-
- Note that this call is asynchronous. Depending on the outcome of this call the results can be enquired
- by connecting to the stateChanged(), opened() or error() signals.
-
- It is not a requirement to open a session in order to monitor the underlying network interface.
-
- \sa close(), stop(), isOpen()
-*/
-void QNetworkSession::open()
-{
- if (d)
- d->open();
- else
- emit error(InvalidConfigurationError);
-}
-
-/*!
- Waits until the session has been opened, up to \a msecs milliseconds. If the session has been opened, this
- function returns \c true; otherwise it returns \c false. In the case where it returns \c false, you can call error()
- to determine the cause of the error.
-
- The following example waits up to one second for the session to be opened:
-
- \snippet code/src_network_bearer_qnetworksession.cpp 0
-
- If \a msecs is -1, this function will not time out.
-
- \sa open(), error()
-*/
-bool QNetworkSession::waitForOpened(int msecs)
-{
- if (!d)
- return false;
-
- if (d->isOpen)
- return true;
-
- if (!(d->state == Connecting || d->state == Connected)) {
- return false;
- }
-
- QEventLoop loop;
- QObject::connect(d, SIGNAL(quitPendingWaitsForOpened()), &loop, SLOT(quit()));
- QObject::connect(this, SIGNAL(error(QNetworkSession::SessionError)), &loop, SLOT(quit()));
-
- //final call
- if (msecs >= 0)
- QTimer::singleShot(msecs, &loop, SLOT(quit()));
-
- // enter the event loop and wait for opened/error/timeout
- loop.exec(QEventLoop::ExcludeUserInputEvents | QEventLoop::WaitForMoreEvents);
-
- return d->isOpen;
-}
-
-/*!
- Decreases the session counter on the associated network configuration. If the session counter reaches zero
- the active network interface is shut down. This also means that state() will only change from \l Connected to
- \l Disconnected if the current session was the last open session.
-
- If the platform does not support out-of-process sessions calling this function does not stop the
- interface. In this case \l{stop()} has to be used to force a shut down.
- The platform capabilities can be detected via QNetworkConfigurationManager::capabilities().
-
- Note that this call is asynchronous. Depending on the outcome of this call the results can be enquired
- by connecting to the stateChanged(), opened() or error() signals.
-
- \sa open(), stop(), isOpen()
-*/
-void QNetworkSession::close()
-{
- if (d)
- d->close();
-}
-
-/*!
- Invalidates all open sessions against the network interface and therefore stops the
- underlying network interface. This function always changes the session's state() flag to
- \l Disconnected.
-
- \sa open(), close()
-*/
-void QNetworkSession::stop()
-{
- if (d)
- d->stop();
-}
-
-/*!
- Returns the QNetworkConfiguration that this network session object is based on.
-
- \sa QNetworkConfiguration
-*/
-QNetworkConfiguration QNetworkSession::configuration() const
-{
- return d ? d->publicConfig : QNetworkConfiguration();
-}
-
-#ifndef QT_NO_NETWORKINTERFACE
-/*!
- Returns the network interface that is used by this session.
-
- This function only returns a valid QNetworkInterface when this session is \l Connected.
-
- The returned interface may change as a result of a roaming process.
-
- \sa state()
-*/
-QNetworkInterface QNetworkSession::interface() const
-{
- return d ? d->currentInterface() : QNetworkInterface();
-}
-#endif
-
-/*!
- Returns \c true if this session is open. If the number of all open sessions is greater than
- zero the underlying network interface will remain connected/up.
-
- The session can be controlled via open() and close().
-*/
-bool QNetworkSession::isOpen() const
-{
- return d ? d->isOpen : false;
-}
-
-/*!
- Returns the state of the session.
-
- If the session is based on a single access point configuration the state of the
- session is the same as the state of the associated network interface. Therefore
- a network session object can be used to monitor network interfaces.
-
- A \l QNetworkConfiguration::ServiceNetwork based session summarizes the state of all its children
- and therefore returns the \l Connected state if at least one of the service network's
- \l {QNetworkConfiguration::children()}{children()} configurations is active.
-
- Note that it is not required to hold an open session in order to obtain the network interface state.
- A connected but closed session may be used to monitor network interfaces whereas an open and connected
- session object may prevent the network interface from being shut down.
-
- \sa error(), stateChanged()
-*/
-QNetworkSession::State QNetworkSession::state() const
-{
- return d ? d->state : QNetworkSession::Invalid;
-}
-
-/*!
- Returns the type of error that last occurred.
-
- \sa state(), errorString()
-*/
-QNetworkSession::SessionError QNetworkSession::error() const
-{
- return d ? d->error() : InvalidConfigurationError;
-}
-
-/*!
- Returns a human-readable description of the last device error that
- occurred.
-
- \sa error()
-*/
-QString QNetworkSession::errorString() const
-{
- return d ? d->errorString() : tr("Invalid configuration.");
-}
-
-/*!
- Returns the value for property \a key.
-
- A network session can have properties attached which may describe the session in more details.
- This function can be used to gain access to those properties.
-
- The following property keys are guaranteed to be specified on all platforms:
-
- \table 80%
- \header
- \li Key \li Description
- \row
- \li ActiveConfiguration
- \li If the session \l isOpen() this property returns the identifier of the
- QNetworkConfiguration that is used by this session; otherwise an empty string.
-
- The main purpose of this key is to determine which Internet access point is used
- if the session is based on a \l{QNetworkConfiguration::ServiceNetwork}{ServiceNetwork}.
- The following code snippet highlights the difference:
- \snippet code/src_network_bearer_qnetworksession.cpp 1
- \row
- \li UserChoiceConfiguration
- \li If the session \l isOpen() and is bound to a QNetworkConfiguration of type
- UserChoice, this property returns the identifier of the QNetworkConfiguration that the
- configuration resolved to when \l open() was called; otherwise an empty string.
-
- The purpose of this key is to determine the real QNetworkConfiguration that the
- session is using. This key is different from \e ActiveConfiguration in that
- this key may return an identifier for either a
- \l {QNetworkConfiguration::ServiceNetwork}{service network} or a
- \l {QNetworkConfiguration::InternetAccessPoint}{Internet access points} configurations,
- whereas \e ActiveConfiguration always returns identifiers to
- \l {QNetworkConfiguration::InternetAccessPoint}{Internet access points} configurations.
- \row
- \li ConnectInBackground
- \li Setting this property to \e true before calling \l open() implies that the connection attempt
- is made but if no connection can be established, the user is not connsulted and asked to select
- a suitable connection. This property is not set by default and support for it depends on the platform.
-
- \row
- \li AutoCloseSessionTimeout
- \li If the session requires polling to keep its state up to date, this property holds
- the timeout in milliseconds before the session will automatically close. If the
- value of this property is -1 the session will not automatically close. This property
- is set to -1 by default.
-
- The purpose of this property is to minimize resource use on platforms that use
- polling to update the state of the session. Applications can set the value of this
- property to the desired timeout before the session is closed. In response to the
- closed() signal the network session should be deleted to ensure that all polling is
- stopped. The session can then be recreated once it is required again. This property
- has no effect for sessions that do not require polling.
- \endtable
-*/
-QVariant QNetworkSession::sessionProperty(const QString &key) const
-{
- if (!d || !d->publicConfig.isValid())
- return QVariant();
-
- if (key == QLatin1String("ActiveConfiguration"))
- return d->isOpen ? d->activeConfig.identifier() : QString();
-
- if (key == QLatin1String("UserChoiceConfiguration")) {
- if (!d->isOpen || d->publicConfig.type() != QNetworkConfiguration::UserChoice)
- return QString();
-
- if (d->serviceConfig.isValid())
- return d->serviceConfig.identifier();
- else
- return d->activeConfig.identifier();
- }
-
- return d->sessionProperty(key);
-}
-
-/*!
- Sets the property \a value on the session. The property is identified using
- \a key. Removing an already set property can be achieved by passing an
- invalid QVariant.
-
- Note that the \e UserChoiceConfiguration and \e ActiveConfiguration
- properties are read only and cannot be changed using this method.
-*/
-void QNetworkSession::setSessionProperty(const QString &key, const QVariant &value)
-{
- if (!d)
- return;
-
- if (key == QLatin1String("ActiveConfiguration") ||
- key == QLatin1String("UserChoiceConfiguration")) {
- return;
- }
-
- d->setSessionProperty(key, value);
-}
-
-/*!
- Instructs the session to roam to the new access point. The old access point remains active
- until the application calls accept().
-
- The newConfigurationActivated() signal is emitted once roaming has been completed.
-
- \sa accept()
-*/
-void QNetworkSession::migrate()
-{
- if (d)
- d->migrate();
-}
-
-/*!
- This function indicates that the application does not wish to roam the session.
-
- \sa migrate()
-*/
-void QNetworkSession::ignore()
-{
- if (d)
- d->ignore();
-}
-
-/*!
- Instructs the session to permanently accept the new access point. Once this function
- has been called the session may not return to the old access point.
-
- The old access point may be closed in the process if there are no other network sessions for it.
- Therefore any open socket that still uses the old access point
- may become unusable and should be closed before completing the migration.
-*/
-void QNetworkSession::accept()
-{
- if (d)
- d->accept();
-}
-
-/*!
- The new access point is not suitable for the application. By calling this function the
- session returns to the previous access point/configuration. This action may invalidate
- any socket that has been created via the not desired access point.
-
- \sa accept()
-*/
-void QNetworkSession::reject()
-{
- if (d)
- d->reject();
-}
-
-
-/*!
- Returns the amount of data sent in bytes; otherwise 0.
-
- This field value includes the usage across all open network
- sessions which use the same network interface.
-
- If the session is based on a service network configuration the number of
- sent bytes across all active member configurations are returned.
-
- This function may not always be supported on all platforms and returns 0.
- The platform capability can be detected via QNetworkConfigurationManager::DataStatistics.
-
- \note On some platforms this function may run the main event loop.
-*/
-quint64 QNetworkSession::bytesWritten() const
-{
- return d ? d->bytesWritten() : Q_UINT64_C(0);
-}
-
-/*!
- Returns the amount of data received in bytes; otherwise 0.
-
- This field value includes the usage across all open network
- sessions which use the same network interface.
-
- If the session is based on a service network configuration the number of
- sent bytes across all active member configurations are returned.
-
- This function may not always be supported on all platforms and returns 0.
- The platform capability can be detected via QNetworkConfigurationManager::DataStatistics.
-
- \note On some platforms this function may run the main event loop.
-*/
-quint64 QNetworkSession::bytesReceived() const
-{
- return d ? d->bytesReceived() : Q_UINT64_C(0);
-}
-
-/*!
- Returns the number of seconds that the session has been active.
-*/
-quint64 QNetworkSession::activeTime() const
-{
- return d ? d->activeTime() : Q_UINT64_C(0);
-}
-
-/*!
- Returns the network usage policies currently in force by the system.
-*/
-QNetworkSession::UsagePolicies QNetworkSession::usagePolicies() const
-{
- return d ? d->usagePolicies() : QNetworkSession::NoPolicy;
-}
-
-/*!
- \internal
- Change usage policies for unit testing.
- In normal use, the policies are published by the bearer plugin
-*/
-void QNetworkSessionPrivate::setUsagePolicies(QNetworkSession &session, QNetworkSession::UsagePolicies policies)
-{
- if (!session.d)
- return;
- session.d->setUsagePolicies(policies);
-}
-
-/*!
- \internal
-
- This function is required to detect whether the client wants to control
- the roaming process. If he connects to preferredConfigurationChanged() signal
- he intends to influence it. Otherwise QNetworkSession always roams
- without registering this session as a stakeholder in the roaming process.
-
- For more details check the Forced vs ALR roaming section in the QNetworkSession
- class description.
-*/
-void QNetworkSession::connectNotify(const QMetaMethod &signal)
-{
- QObject::connectNotify(signal);
-
- if (!d)
- return;
-
- //check for preferredConfigurationChanged() signal connect notification
- //This is not required on all platforms
- static const QMetaMethod preferredConfigurationChangedSignal =
- QMetaMethod::fromSignal(&QNetworkSession::preferredConfigurationChanged);
- if (signal == preferredConfigurationChangedSignal)
- d->setALREnabled(true);
-}
-
-/*!
- \internal
-
- This function is called when the client disconnects from the
- preferredConfigurationChanged() signal.
-
- \sa connectNotify()
-*/
-void QNetworkSession::disconnectNotify(const QMetaMethod &signal)
-{
- QObject::disconnectNotify(signal);
-
- if (!d)
- return;
-
- //check for preferredConfigurationChanged() signal disconnect notification
- //This is not required on all platforms
- static const QMetaMethod preferredConfigurationChangedSignal =
- QMetaMethod::fromSignal(&QNetworkSession::preferredConfigurationChanged);
- if (signal == preferredConfigurationChangedSignal)
- d->setALREnabled(false);
-}
-
-QT_END_NAMESPACE
-
-#include "moc_qnetworksession.cpp"
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/network/bearer/qnetworksession.h b/src/network/bearer/qnetworksession.h
deleted file mode 100644
index 65d90b0a82..0000000000
--- a/src/network/bearer/qnetworksession.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNETWORKSESSION_H
-#define QNETWORKSESSION_H
-
-#if 0
-#pragma qt_class(QNetworkSession)
-#endif
-
-#include <QtNetwork/qtnetworkglobal.h>
-#include <QtCore/qobject.h>
-#include <QtCore/qstring.h>
-#include <QtNetwork/qnetworkinterface.h>
-#include <QtCore/qvariant.h>
-#include <QtNetwork/qnetworkconfiguration.h>
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-#if defined(Q_OS_WIN) && defined(interface)
-#undef interface
-#endif
-
-#include <QtCore/qshareddata.h>
-QT_BEGIN_NAMESPACE
-
-class QNetworkSessionPrivate;
-class QT_DEPRECATED_BEARER_MANAGEMENT Q_NETWORK_EXPORT QNetworkSession : public QObject
-{
- Q_OBJECT
-
-public:
- enum State {
- Invalid = 0,
- NotAvailable,
- Connecting,
- Connected,
- Closing,
- Disconnected,
- Roaming
- };
-
- enum SessionError {
- UnknownSessionError = 0,
- SessionAbortedError,
- RoamingError,
- OperationNotSupportedError,
- InvalidConfigurationError
- };
-
- enum UsagePolicy {
- NoPolicy = 0,
- NoBackgroundTrafficPolicy = 1
- };
-
- Q_DECLARE_FLAGS(UsagePolicies, UsagePolicy)
-
- explicit QNetworkSession(const QNetworkConfiguration &connConfig, QObject *parent = nullptr);
- virtual ~QNetworkSession();
-
- bool isOpen() const;
- QNetworkConfiguration configuration() const;
-#ifndef QT_NO_NETWORKINTERFACE
- QNetworkInterface interface() const;
-#endif
-
- State state() const;
- SessionError error() const;
- QString errorString() const;
- QVariant sessionProperty(const QString &key) const;
- void setSessionProperty(const QString &key, const QVariant &value);
-
- quint64 bytesWritten() const;
- quint64 bytesReceived() const;
- quint64 activeTime() const;
-
- QNetworkSession::UsagePolicies usagePolicies() const;
-
- bool waitForOpened(int msecs = 30000);
-
-public Q_SLOTS:
- void open();
- void close();
- void stop();
-
- //roaming related slots
- void migrate();
- void ignore();
- void accept();
- void reject();
-
-Q_SIGNALS:
- void stateChanged(QNetworkSession::State);
- void opened();
- void closed();
- void error(QNetworkSession::SessionError);
- void preferredConfigurationChanged(const QNetworkConfiguration &config, bool isSeamless);
- void newConfigurationActivated();
- void usagePoliciesChanged(QNetworkSession::UsagePolicies usagePolicies);
-
-protected:
- virtual void connectNotify(const QMetaMethod &signal) override;
- virtual void disconnectNotify(const QMetaMethod &signal) override;
-
-private:
- Q_DISABLE_COPY(QNetworkSession)
- friend class QNetworkSessionPrivate;
- QNetworkSessionPrivate *d;
-};
-
-QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QNetworkSession::State)
-Q_DECLARE_METATYPE(QNetworkSession::SessionError)
-Q_DECLARE_METATYPE(QNetworkSession::UsagePolicies)
-
-#endif // QT_NO_BEARERMANAGEMENT
-
-QT_WARNING_POP
-
-#endif // QNETWORKSESSION_H
diff --git a/src/network/bearer/qnetworksession_p.h b/src/network/bearer/qnetworksession_p.h
deleted file mode 100644
index 7c1ff63b68..0000000000
--- a/src/network/bearer/qnetworksession_p.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNETWORKSESSIONPRIVATE_H
-#define QNETWORKSESSIONPRIVATE_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtNetwork/private/qtnetworkglobal_p.h>
-#include "qnetworksession.h"
-#include "qnetworkconfiguration_p.h"
-#include "QtCore/qsharedpointer.h"
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-class Q_NETWORK_EXPORT QNetworkSessionPrivate : public QObject
-{
- Q_OBJECT
-
- friend class QNetworkSession;
-
-public:
- QNetworkSessionPrivate() : QObject(),
- state(QNetworkSession::Invalid), isOpen(false)
- {}
- virtual ~QNetworkSessionPrivate()
- {}
-
- //called by QNetworkSession constructor and ensures
- //that the state is immediately updated (w/o actually opening
- //a session). Also this function should take care of
- //notification hooks to discover future state changes.
- virtual void syncStateWithInterface() = 0;
-
-#ifndef QT_NO_NETWORKINTERFACE
- virtual QNetworkInterface currentInterface() const = 0;
-#endif
- virtual QVariant sessionProperty(const QString &key) const = 0;
- virtual void setSessionProperty(const QString &key, const QVariant &value) = 0;
-
- virtual void open() = 0;
- virtual void close() = 0;
- virtual void stop() = 0;
-
- virtual void setALREnabled(bool /*enabled*/) {}
- virtual void migrate() = 0;
- virtual void accept() = 0;
- virtual void ignore() = 0;
- virtual void reject() = 0;
-
- virtual QString errorString() const = 0; //must return translated string
- virtual QNetworkSession::SessionError error() const = 0;
-
- virtual quint64 bytesWritten() const = 0;
- virtual quint64 bytesReceived() const = 0;
- virtual quint64 activeTime() const = 0;
-
- virtual QNetworkSession::UsagePolicies usagePolicies() const = 0;
- virtual void setUsagePolicies(QNetworkSession::UsagePolicies) = 0;
-
- static void setUsagePolicies(QNetworkSession&, QNetworkSession::UsagePolicies); //for unit testing
-protected:
- inline QNetworkConfigurationPrivatePointer privateConfiguration(const QNetworkConfiguration &config) const
- {
- return config.d;
- }
-
- inline void setPrivateConfiguration(QNetworkConfiguration &config,
- const QNetworkConfigurationPrivatePointer &ptr) const
- {
- config.d = ptr;
- }
-
-Q_SIGNALS:
- //releases any pending waitForOpened() calls
- void quitPendingWaitsForOpened();
-
- void error(QNetworkSession::SessionError error);
- void stateChanged(QNetworkSession::State state);
- void closed();
- void newConfigurationActivated();
- void preferredConfigurationChanged(const QNetworkConfiguration &config, bool isSeamless);
- void usagePoliciesChanged(QNetworkSession::UsagePolicies);
-
-protected:
- QNetworkSession *q;
-
- // The config set on QNetworkSession.
- QNetworkConfiguration publicConfig;
-
- // If publicConfig is a ServiceNetwork this is a copy of publicConfig.
- // If publicConfig is an UserChoice that is resolved to a ServiceNetwork this is the actual
- // ServiceNetwork configuration.
- QNetworkConfiguration serviceConfig;
-
- // This is the actual active configuration currently in use by the session.
- // Either a copy of publicConfig or one of serviceConfig.children().
- QNetworkConfiguration activeConfig;
-
- QNetworkSession::State state;
- bool isOpen;
-
- QRecursiveMutex mutex;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
-
-#endif // QNETWORKSESSIONPRIVATE_H
diff --git a/src/network/bearer/qsharednetworksession.cpp b/src/network/bearer/qsharednetworksession.cpp
deleted file mode 100644
index b3e9892f4b..0000000000
--- a/src/network/bearer/qsharednetworksession.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsharednetworksession_p.h"
-#include "qbearerengine_p.h"
-#include <QThreadStorage>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-QThreadStorage<QSharedNetworkSessionManager *> tls;
-
-inline QSharedNetworkSessionManager* sharedNetworkSessionManager()
-{
- QSharedNetworkSessionManager* rv = tls.localData();
- if (!rv) {
- rv = new QSharedNetworkSessionManager;
- tls.setLocalData(rv);
- }
- return rv;
-}
-
-struct DeleteLater {
- void operator()(QObject* obj) const
- {
- obj->deleteLater();
- }
-};
-
-template <typename Container>
-static void maybe_prune_expired(Container &c)
-{
- if (c.size() > 16) {
- for (auto it = c.cbegin(), end = c.cend(); it != end; /*erasing*/) {
- if (!it->second.lock())
- it = c.erase(it);
- else
- ++it;
- }
- }
-}
-
-QSharedPointer<QNetworkSession> QSharedNetworkSessionManager::getSession(const QNetworkConfiguration &config)
-{
- QSharedNetworkSessionManager *m = sharedNetworkSessionManager();
- maybe_prune_expired(m->sessions);
- auto &entry = m->sessions[config];
- //if already have a session, return it
- if (auto p = entry.toStrongRef())
- return p;
- //otherwise make one
- QSharedPointer<QNetworkSession> session(new QNetworkSession(config), DeleteLater{});
- entry = session;
- return session;
-}
-
-void QSharedNetworkSessionManager::setSession(const QNetworkConfiguration &config, QSharedPointer<QNetworkSession> session)
-{
- QSharedNetworkSessionManager *m = sharedNetworkSessionManager();
- m->sessions[config] = std::move(session);
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/network/bearer/qsharednetworksession_p.h b/src/network/bearer/qsharednetworksession_p.h
deleted file mode 100644
index f22f9eeacb..0000000000
--- a/src/network/bearer/qsharednetworksession_p.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSHAREDNETWORKSESSIONPRIVATE_H
-#define QSHAREDNETWORKSESSIONPRIVATE_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtNetwork/private/qtnetworkglobal_p.h>
-#include "qnetworksession.h"
-#include "qnetworkconfiguration.h"
-#include <QSharedPointer>
-#include <QWeakPointer>
-#include <QMutex>
-
-#include <unordered_map>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-namespace QtPrivate {
-struct NetworkConfigurationHash {
- using result_type = size_t;
- using argument_type = QNetworkConfiguration;
- size_t operator()(const QNetworkConfiguration &config) const noexcept
- {
- return std::hash<size_t>{}(size_t(config.type()) | (size_t(config.bearerType()) << 8) | (size_t(config.purpose()) << 16));
- }
-};
-}
-
-class QSharedNetworkSessionManager
-{
-public:
- static QSharedPointer<QNetworkSession> getSession(const QNetworkConfiguration &config);
- static void setSession(const QNetworkConfiguration &config, QSharedPointer<QNetworkSession> session);
-private:
- std::unordered_map<QNetworkConfiguration, QWeakPointer<QNetworkSession>, QtPrivate::NetworkConfigurationHash> sessions;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
-
-#endif //QSHAREDNETWORKSESSIONPRIVATE_H
-
diff --git a/src/network/configure.cmake b/src/network/configure.cmake
new file mode 100644
index 0000000000..ae9deb79ed
--- /dev/null
+++ b/src/network/configure.cmake
@@ -0,0 +1,445 @@
+
+
+#### Inputs
+
+
+
+#### Libraries
+
+qt_find_package(Libproxy PROVIDED_TARGETS PkgConfig::Libproxy)
+qt_find_package(WrapOpenSSLHeaders PROVIDED_TARGETS WrapOpenSSLHeaders::WrapOpenSSLHeaders)
+# openssl_headers
+qt_config_compile_test(openssl_headers
+ LIBRARIES
+ WrapOpenSSLHeaders::WrapOpenSSLHeaders
+ CODE
+"
+#include <openssl/ssl.h>
+#include <openssl/opensslv.h>
+#if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER-0 < 0x10100000L
+# error OpenSSL >= 1.1.0 is required
+#endif
+#if !defined(OPENSSL_NO_EC) && !defined(SSL_CTRL_SET_CURVES)
+# error OpenSSL was reported as >= 1.1.0 but is missing required features, possibly it's libressl which is unsupported
+#endif
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+
+ /* END TEST: */
+ return 0;
+}
+")
+
+qt_find_package(WrapOpenSSL PROVIDED_TARGETS WrapOpenSSL::WrapOpenSSL)
+# openssl
+qt_config_compile_test(openssl
+ LIBRARIES
+ WrapOpenSSL::WrapOpenSSL
+ CODE
+"
+#include <openssl/ssl.h>
+#include <openssl/opensslv.h>
+#if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER-0 < 0x10100000L
+# error OpenSSL >= 1.1.0 is required
+#endif
+#if !defined(OPENSSL_NO_EC) && !defined(SSL_CTRL_SET_CURVES)
+# error OpenSSL was reported as >= 1.1.0 but is missing required features, possibly it's libressl which is unsupported
+#endif
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+SSL_free(SSL_new(0));
+ /* END TEST: */
+ return 0;
+}
+")
+
+qt_find_package(GSSAPI PROVIDED_TARGETS GSSAPI::GSSAPI)
+
+
+#### Tests
+
+# getifaddrs
+qt_config_compile_test(getifaddrs
+ LABEL "getifaddrs()"
+ CODE
+"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <ifaddrs.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+ifaddrs *list;
+getifaddrs(&list);
+freeifaddrs(list);
+ /* END TEST: */
+ return 0;
+}
+"# FIXME: use: unmapped library: network
+)
+
+# ipv6ifname
+qt_config_compile_test(ipv6ifname
+ LABEL "IPv6 ifname"
+ CODE
+"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+char buf[IFNAMSIZ];
+if_nametoindex(\"eth0\");
+if_indextoname(1, buf);
+if_freenameindex(if_nameindex());
+ /* END TEST: */
+ return 0;
+}
+"# FIXME: use: unmapped library: network
+)
+
+# linux-netlink
+qt_config_compile_test(linux_netlink
+ LABEL "Linux AF_NETLINK sockets"
+ CODE
+"
+#include <asm/types.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+#include <sys/socket.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+struct rtattr rta = { };
+struct ifinfomsg ifi = {};
+struct ifaddrmsg ifa = {};
+struct ifa_cacheinfo ci;
+ci.ifa_prefered = ci.ifa_valid = 0;
+(void)RTM_NEWLINK; (void)RTM_NEWADDR;
+(void)IFLA_ADDRESS; (void)IFLA_IFNAME;
+(void)IFA_ADDRESS; (void)IFA_LABEL; (void)IFA_CACHEINFO;
+(void)(IFA_F_SECONDARY | IFA_F_DEPRECATED | IFA_F_PERMANENT | IFA_F_MANAGETEMPADDR);
+ /* END TEST: */
+ return 0;
+}
+")
+
+# sctp
+qt_config_compile_test(sctp
+ LABEL "SCTP support"
+ CODE
+"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+sctp_initmsg sctpInitMsg;
+socklen_t sctpInitMsgSize = sizeof(sctpInitMsg);
+(void) socket(PF_INET, SOCK_STREAM, IPPROTO_SCTP);
+(void) getsockopt(-1, SOL_SCTP, SCTP_INITMSG, &sctpInitMsg, &sctpInitMsgSize);
+ /* END TEST: */
+ return 0;
+}
+"# FIXME: use: unmapped library: network
+)
+
+# dtls
+qt_config_compile_test(dtls
+ LABEL "DTLS support in OpenSSL"
+ LIBRARIES
+ WrapOpenSSLHeaders::WrapOpenSSLHeaders
+ CODE
+"
+#include <openssl/ssl.h>
+#if defined(OPENSSL_NO_DTLS) || !defined(DTLS1_2_VERSION)
+# error OpenSSL without DTLS support
+#endif
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+
+ /* END TEST: */
+ return 0;
+}
+")
+
+# ocsp
+qt_config_compile_test(ocsp
+ LABEL "OCSP stapling support in OpenSSL"
+ LIBRARIES
+ WrapOpenSSLHeaders::WrapOpenSSLHeaders
+ CODE
+"
+#include <openssl/ssl.h>
+#include <openssl/ocsp.h>
+#if defined(OPENSSL_NO_OCSP) || defined(OPENSSL_NO_TLSEXT)
+# error OpenSSL without OCSP stapling
+#endif
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+
+ /* END TEST: */
+ return 0;
+}
+")
+
+# netlistmgr
+qt_config_compile_test(netlistmgr
+ LABEL "Network List Manager"
+ CODE
+"
+#include <netlistmgr.h>
+#include <wrl/client.h>
+
+int main(int argc, char **argv)
+{
+ (void)argc; (void)argv;
+ /* BEGIN TEST: */
+using namespace Microsoft::WRL;
+ComPtr<INetworkListManager> networkListManager;
+ComPtr<IConnectionPoint> connectionPoint;
+ComPtr<IConnectionPointContainer> connectionPointContainer;
+networkListManager.As(&connectionPointContainer);
+connectionPointContainer->FindConnectionPoint(IID_INetworkConnectionEvents, &connectionPoint);
+ /* END TEST: */
+ return 0;
+}
+"# FIXME: qmake: LIBS += -lOle32
+)
+
+
+
+#### Features
+
+qt_feature("corewlan" PUBLIC PRIVATE
+ LABEL "CoreWLan"
+ CONDITION libs.corewlan OR FIXME
+ EMIT_IF APPLE
+)
+qt_feature_definition("corewlan" "QT_NO_COREWLAN" NEGATE VALUE "1")
+qt_feature("getifaddrs" PUBLIC
+ LABEL "getifaddrs()"
+ CONDITION TEST_getifaddrs
+)
+qt_feature_definition("getifaddrs" "QT_NO_GETIFADDRS" NEGATE VALUE "1")
+qt_feature("ipv6ifname" PUBLIC
+ LABEL "IPv6 ifname"
+ CONDITION TEST_ipv6ifname
+)
+qt_feature_definition("ipv6ifname" "QT_NO_IPV6IFNAME" NEGATE VALUE "1")
+qt_feature("libproxy" PRIVATE
+ LABEL "libproxy"
+ AUTODETECT OFF
+ CONDITION Libproxy_FOUND
+)
+qt_feature("linux-netlink" PRIVATE
+ LABEL "Linux AF_NETLINK"
+ CONDITION LINUX AND TEST_linux_netlink
+)
+qt_feature("openssl" PRIVATE
+ LABEL "OpenSSL"
+ CONDITION QT_FEATURE_openssl_runtime OR QT_FEATURE_openssl_linked
+ ENABLE false
+)
+qt_feature_definition("openssl" "QT_NO_OPENSSL" NEGATE)
+qt_feature_config("openssl" QMAKE_PUBLIC_QT_CONFIG)
+qt_feature("openssl-runtime"
+ AUTODETECT NOT WINRT AND NOT WASM
+ CONDITION NOT QT_FEATURE_securetransport AND NOT QT_FEATURE_schannel AND TEST_openssl_headers
+ ENABLE INPUT_openssl STREQUAL 'yes' OR INPUT_openssl STREQUAL 'runtime'
+ DISABLE INPUT_openssl STREQUAL 'no' OR INPUT_openssl STREQUAL 'linked' OR INPUT_ssl STREQUAL 'no'
+)
+qt_feature("openssl-linked" PRIVATE
+ LABEL " Qt directly linked to OpenSSL"
+ AUTODETECT OFF
+ CONDITION NOT QT_FEATURE_securetransport AND NOT QT_FEATURE_schannel AND TEST_openssl
+ ENABLE INPUT_openssl STREQUAL 'linked'
+)
+qt_feature_definition("openssl-linked" "QT_LINKED_OPENSSL")
+qt_feature("securetransport" PUBLIC
+ LABEL "SecureTransport"
+ CONDITION APPLE AND ( INPUT_openssl STREQUAL '' OR INPUT_openssl STREQUAL 'no' )
+ DISABLE INPUT_securetransport STREQUAL 'no' OR INPUT_ssl STREQUAL 'no'
+)
+qt_feature_definition("securetransport" "QT_SECURETRANSPORT")
+qt_feature("schannel" PUBLIC
+ LABEL "Schannel"
+ CONDITION INPUT_schannel STREQUAL 'yes' AND WIN32 AND NOT WINRT AND ( INPUT_openssl STREQUAL '' OR INPUT_openssl STREQUAL 'no' )
+ DISABLE INPUT_schannel STREQUAL 'no' OR INPUT_ssl STREQUAL 'no'
+)
+qt_feature_definition("schannel" "QT_SCHANNEL")
+qt_feature("ssl" PUBLIC
+ LABEL "SSL"
+ CONDITION WINRT OR QT_FEATURE_securetransport OR QT_FEATURE_openssl OR QT_FEATURE_schannel
+)
+qt_feature_definition("ssl" "QT_NO_SSL" NEGATE VALUE "1")
+qt_feature("dtls" PUBLIC
+ SECTION "Networking"
+ LABEL "DTLS"
+ PURPOSE "Provides a DTLS implementation"
+ CONDITION QT_FEATURE_openssl AND QT_FEATURE_udpsocket AND TEST_dtls
+)
+qt_feature("ocsp" PUBLIC
+ SECTION "Networking"
+ LABEL "OCSP-stapling"
+ PURPOSE "Provides OCSP stapling support"
+ CONDITION QT_FEATURE_opensslv11 AND TEST_ocsp
+)
+qt_feature("opensslv11" PUBLIC
+ LABEL "OpenSSL 1.1"
+ CONDITION QT_FEATURE_openssl
+)
+qt_feature("sctp" PUBLIC
+ LABEL "SCTP"
+ AUTODETECT OFF
+ CONDITION TEST_sctp
+)
+qt_feature_definition("sctp" "QT_NO_SCTP" NEGATE VALUE "1")
+qt_feature("system-proxies" PRIVATE
+ LABEL "Use system proxies"
+)
+qt_feature("ftp" PUBLIC
+ SECTION "Networking"
+ LABEL "FTP"
+ PURPOSE "Provides support for the File Transfer Protocol in QNetworkAccessManager."
+ AUTODETECT OFF
+ CONDITION QT_FEATURE_textdate AND QT_FEATURE_regularexpression
+)
+qt_feature_definition("ftp" "QT_NO_FTP" NEGATE VALUE "1")
+qt_feature("http" PUBLIC
+ SECTION "Networking"
+ LABEL "HTTP"
+ PURPOSE "Provides support for the Hypertext Transfer Protocol in QNetworkAccessManager."
+ CONDITION QT_FEATURE_thread
+)
+qt_feature_definition("http" "QT_NO_HTTP" NEGATE VALUE "1")
+qt_feature("udpsocket" PUBLIC
+ SECTION "Networking"
+ LABEL "QUdpSocket"
+ PURPOSE "Provides access to UDP sockets."
+)
+qt_feature_definition("udpsocket" "QT_NO_UDPSOCKET" NEGATE VALUE "1")
+qt_feature("networkproxy" PUBLIC
+ SECTION "Networking"
+ LABEL "QNetworkProxy"
+ PURPOSE "Provides network proxy support."
+)
+qt_feature_definition("networkproxy" "QT_NO_NETWORKPROXY" NEGATE VALUE "1")
+qt_feature("socks5" PUBLIC
+ SECTION "Networking"
+ LABEL "SOCKS5"
+ PURPOSE "Provides SOCKS5 support in QNetworkProxy."
+ CONDITION QT_FEATURE_networkproxy
+)
+qt_feature_definition("socks5" "QT_NO_SOCKS5" NEGATE VALUE "1")
+qt_feature("networkinterface" PUBLIC
+ SECTION "Networking"
+ LABEL "QNetworkInterface"
+ PURPOSE "Supports enumerating a host's IP addresses and network interfaces."
+ CONDITION NOT WASM
+)
+qt_feature_definition("networkinterface" "QT_NO_NETWORKINTERFACE" NEGATE VALUE "1")
+qt_feature("networkdiskcache" PUBLIC
+ SECTION "Networking"
+ LABEL "QNetworkDiskCache"
+ PURPOSE "Provides a disk cache for network resources."
+ CONDITION QT_FEATURE_temporaryfile
+)
+qt_feature_definition("networkdiskcache" "QT_NO_NETWORKDISKCACHE" NEGATE VALUE "1")
+qt_feature("localserver" PUBLIC
+ SECTION "Networking"
+ LABEL "QLocalServer"
+ PURPOSE "Provides a local socket based server."
+ CONDITION QT_FEATURE_temporaryfile
+)
+qt_feature_definition("localserver" "QT_NO_LOCALSERVER" NEGATE VALUE "1")
+qt_feature("dnslookup" PUBLIC
+ SECTION "Networking"
+ LABEL "QDnsLookup"
+ PURPOSE "Provides API for DNS lookups."
+)
+qt_feature("gssapi" PUBLIC
+ SECTION "Networking"
+ LABEL "GSSAPI"
+ PURPOSE "Enable SPNEGO authentication through GSSAPI"
+ CONDITION NOT WIN32 AND GSSAPI_FOUND
+)
+qt_feature_definition("gssapi" "QT_NO_GSSAPI" NEGATE VALUE "1")
+qt_feature("sspi" PUBLIC
+ SECTION "Networking"
+ LABEL "SSPI"
+ PURPOSE "Enable NTLM/SPNEGO authentication through SSPI"
+ CONDITION WIN32 AND NOT WINRT
+)
+qt_feature_definition("sspi" "QT_NO_SSPI" NEGATE VALUE "1")
+qt_feature("netlistmgr" PRIVATE
+ SECTION "Networking"
+ LABEL "Network List Manager"
+ PURPOSE "Use Network List Manager to keep track of network connectivity"
+ CONDITION WIN32 AND TEST_netlistmgr
+)
+qt_feature("topleveldomain" PUBLIC
+ SECTION "Networking"
+ LABEL "qTopLevelDomain()"
+ PURPOSE "Provides support for extracting the top level domain from URLs. If enabled, a binary dump of the Public Suffix List (http://www.publicsuffix.org, Mozilla License) is included. The data is then also used in QNetworkCookieJar::validateCookie."
+)
+qt_configure_add_summary_section(NAME "Qt Network")
+qt_configure_add_summary_entry(
+ ARGS "corewlan"
+ CONDITION APPLE
+)
+qt_configure_add_summary_entry(ARGS "getifaddrs")
+qt_configure_add_summary_entry(ARGS "ipv6ifname")
+qt_configure_add_summary_entry(ARGS "libproxy")
+qt_configure_add_summary_entry(
+ ARGS "linux-netlink"
+ CONDITION LINUX
+)
+qt_configure_add_summary_entry(
+ ARGS "securetransport"
+ CONDITION APPLE
+)
+qt_configure_add_summary_entry(
+ ARGS "schannel"
+ CONDITION WIN32 AND NOT WINRT
+)
+qt_configure_add_summary_entry(ARGS "openssl")
+qt_configure_add_summary_entry(ARGS "openssl-linked")
+qt_configure_add_summary_entry(ARGS "opensslv11")
+qt_configure_add_summary_entry(ARGS "dtls")
+qt_configure_add_summary_entry(ARGS "ocsp")
+qt_configure_add_summary_entry(ARGS "ftp")
+qt_configure_add_summary_entry(ARGS "sctp")
+qt_configure_add_summary_entry(ARGS "system-proxies")
+qt_configure_add_summary_entry(ARGS "gssapi")
+qt_configure_end_summary_section() # end of "Qt Network" section
+qt_configure_add_report_entry(
+ TYPE NOTE
+ MESSAGE "When linking against OpenSSL, you can override the default library names through OPENSSL_LIBS. For example: OPENSSL_LIBS='-L/opt/ssl/lib -lssl -lcrypto' ./configure -openssl-linked"
+ CONDITION NOT ANDROID AND QT_FEATURE_openssl_linked AND TEST_openssl.source NOT = 0 AND INPUT_openssl.prefix STREQUAL '' AND INPUT_openssl.libs STREQUAL '' AND INPUT_openssl.libs.debug STREQUAL '' OR FIXME
+)
+qt_configure_add_report_entry(
+ TYPE WARNING
+ MESSAGE "Some of libproxy's plugins may use incompatible Qt versions. Some platforms and distributions ship libproxy with plugins, such as config_kde4.so, that are linked against old versions of Qt, and libproxy loads these plugins automatically when initialized. If Qt is not in a namespace, that loading causes a crash. Even if the systems on which you build and test have no such plugins, your users' systems may have them. We therefore recommend that you combine -libproxy with -qtnamespace when configuring Qt."
+ CONDITION QT_FEATURE_libproxy AND INPUT_qt_namespace STREQUAL ''
+)
diff --git a/src/network/configure.json b/src/network/configure.json
index 289d84fbb4..254a36d725 100644
--- a/src/network/configure.json
+++ b/src/network/configure.json
@@ -343,7 +343,8 @@
"label": "FTP",
"purpose": "Provides support for the File Transfer Protocol in QNetworkAccessManager.",
"section": "Networking",
- "condition": "features.textdate",
+ "autoDetect": false,
+ "condition": "features.textdate && features.regularexpression",
"output": [ "publicFeature", "feature" ]
},
"http": {
@@ -386,17 +387,6 @@
"condition": "features.temporaryfile",
"output": [ "publicFeature", "feature" ]
},
- "bearermanagement": {
- "label": "Bearer management (deprecated)",
- "purpose": "Provides bearer management for the network stack.",
- "section": "Networking",
- "condition": "features.thread && features.library && features.networkinterface && features.properties",
- "output": [
- "publicFeature",
- "feature",
- { "type": "define", "negative": true, "name": "QT_NO_BEARERMANAGEMENT" }
- ]
- },
"localserver": {
"label": "QLocalServer",
"purpose": "Provides a local socket based server.",
@@ -430,6 +420,12 @@
"section": "Networking",
"condition": "config.win32 && tests.netlistmgr",
"output": [ "privateFeature" ]
+ },
+ "topleveldomain": {
+ "label": "qTopLevelDomain()",
+ "purpose": "Provides support for extracting the top level domain from URLs. If enabled, a binary dump of the Public Suffix List (http://www.publicsuffix.org, Mozilla License) is included. The data is then also used in QNetworkCookieJar::validateCookie.",
+ "section": "Networking",
+ "output": [ "publicFeature" ]
}
},
@@ -446,15 +442,7 @@ For example:
{
"type": "warning",
"condition": "features.libproxy && input.qt_namespace == ''",
- "message": "Some of libproxy's plugins may use incompatible Qt versions.
-
- Some platforms and distributions ship libproxy with plugins, such
- as config_kde4.so, that are linked against old versions of Qt; and
- libproxy loads these plugins automatically when initialized. If Qt
- is not in a namespace, that loading causes a crash. Even if the
- systems on which you build and test have no such plugins, your
- users' systems may have them. We therefore recommend that you
- combine -libproxy with -qtnamespace when configuring Qt."
+ "message": "Some of libproxy's plugins may use incompatible Qt versions. Some platforms and distributions ship libproxy with plugins, such as config_kde4.so, that are linked against old versions of Qt; and libproxy loads these plugins automatically when initialized. If Qt is not in a namespace, that loading causes a crash. Even if the systems on which you build and test have no such plugins, your users' systems may have them. We therefore recommend that you combine -libproxy with -qtnamespace when configuring Qt."
}
],
@@ -488,6 +476,7 @@ For example:
"opensslv11",
"dtls",
"ocsp",
+ "ftp",
"sctp",
"system-proxies",
"gssapi"
diff --git a/src/network/doc/snippets/code/src_network_access_qnetworkaccessmanager.cpp b/src/network/doc/snippets/code/src_network_access_qnetworkaccessmanager.cpp
index d317137dad..39a3199bf7 100644
--- a/src/network/doc/snippets/code/src_network_access_qnetworkaccessmanager.cpp
+++ b/src/network/doc/snippets/code/src_network_access_qnetworkaccessmanager.cpp
@@ -70,15 +70,6 @@ connect(reply, &QNetworkReply::sslErrors,
this, &MyClass::slotSslErrors);
//! [1]
-//! [2]
-QNetworkConfigurationManager manager;
-networkAccessManager->setConfiguration(manager.defaultConfiguration());
-//! [2]
-
-//! [3]
-networkAccessManager->setConfiguration(QNetworkConfiguration());
-//! [3]
-
//! [4]
networkAccessManager->setNetworkAccessible(QNetworkAccessManager::NotAccessible);
//! [4]
diff --git a/src/network/doc/snippets/code/src_network_bearer_qnetworkconfigmanager.cpp b/src/network/doc/snippets/code/src_network_bearer_qnetworkconfigmanager.cpp
deleted file mode 100644
index 42992f08d9..0000000000
--- a/src/network/doc/snippets/code/src_network_bearer_qnetworkconfigmanager.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
-QNetworkConfigurationManager mgr;
-QList<QNetworkConfiguration> activeConfigs = mgr.allConfigurations(QNetworkConfiguration::Active);
-if (activeConfigs.count() > 0)
- Q_ASSERT(mgr.isOnline());
-else
- Q_ASSERT(!mgr.isOnline());
-//! [0]
diff --git a/src/network/doc/snippets/code/src_network_bearer_qnetworksession.cpp b/src/network/doc/snippets/code/src_network_bearer_qnetworksession.cpp
deleted file mode 100644
index b88b6d1768..0000000000
--- a/src/network/doc/snippets/code/src_network_bearer_qnetworksession.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
- session->open();
- if (session->waitForOpened(1000))
- qDebug("Open!");
-//! [0]
-
-//! [1]
- QNetworkConfigurationManager mgr;
- QNetworkConfiguration ap = mgr.defaultConfiguration();
- QNetworkSession *session = new QNetworkSession(ap);
- ... //code activates session
-
- QString ident = session->sessionProperty("ActiveConfiguration").toString();
- if ( ap.type() == QNetworkConfiguration::ServiceNetwork ) {
- Q_ASSERT( ap.identifier() != ident );
- Q_ASSERT( ap.children().contains( mgr.configurationFromIdentifier(ident) ) );
- } else if ( ap.type() == QNetworkConfiguration::InternetAccessPoint ) {
- Q_ASSERT( ap.identifier() == ident );
- }
- \endcode
-//! [1]
diff --git a/src/network/doc/snippets/code/src_network_ssl_qsslcertificate.cpp b/src/network/doc/snippets/code/src_network_ssl_qsslcertificate.cpp
index b381ae7b6e..62502afe61 100644
--- a/src/network/doc/snippets/code/src_network_ssl_qsslcertificate.cpp
+++ b/src/network/doc/snippets/code/src_network_ssl_qsslcertificate.cpp
@@ -48,14 +48,6 @@
**
****************************************************************************/
-//! [0]
-const auto certs = QSslCertificate::fromPath("C:/ssl/certificate.*.pem",
- QSsl::Pem, QRegExp::Wildcard);
-for (const QSslCertificate &cert : certs) {
- qDebug() << cert.issuerInfo(QSslCertificate::Organization);
-}
-//! [0]
-
//! [1]
const auto certs = QSslCertificate::fromPath("C:/ssl/certificate.*.pem",
QSsl::Pem, QSslCertificate::Wildcard);
diff --git a/src/network/doc/src/bearermanagement.qdoc b/src/network/doc/src/bearermanagement.qdoc
deleted file mode 100644
index 8aec894269..0000000000
--- a/src/network/doc/src/bearermanagement.qdoc
+++ /dev/null
@@ -1,242 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
-\page bearer-management.html
-
-\title Bearer Management
-\brief An API to control the system's connectivity state.
-
-\warning Bearer management is deprecated and will be removed in Qt 6.0.
-
-Bearer Management controls the connectivity state of the system so that
-the user can start or stop interfaces or roam transparently between
-access points.
-
-\tableofcontents
-
-
-\section1 Overview
-
-The Bearer Management API controls the system's connectivity state. This
-incorporates simple information such as whether the device is online and
-how many interfaces there are as well as enables the application developer
-to start, stop network interfaces and influences other connection specific
-details. Depending on the platform's capabilities it may even provide
-session management so that a network interface remains up for as long as
-clients have a registered interest in them while at the same time
-optimizes the interface's uptime.
-
-This API does not provide support for management of network configurations
-themselves. It is up to the platform to provide infrastructure which
-enables to user to create, edit or delete network configurations.
-
-\section2 The API in Detail
-
-Computer systems manage their network interfaces via a set of configurations.
-Each configuration describes a set of parameters which instruct the system
-how a particular network interface is started. One of the most simplistic
-examples might be an Ethernet configuration that links a network card to a
-DHCP server. A more complex example might be a Wireless LAN configuration
-which may comprise of hardware details such as the WLAN card address,
-WLAN access point details (e.g ESSID, encryption details) and user specific
-information (for example username and password). Once the network interface
-was configured and started according to the configuration blue print,
-multiple applications are free to use this link layer connection/session
-for their own socket operations. Note that the QNetworkConfiguration object
-only provides limited information about the configuration details themselves.
-It's main purpose is to act as a configuration identifier through which link
-layer connections can be created, destroyed and monitored.
-
-QNetworkSession provides two types of use cases. It enables the monitoring of
-physical network interfaces and management of network sessions. Network sessions
-are a common feature on mobile devices where multiple applications
-can request network sessions as they see fit. The system consolidates and tracks
-active network sessions for the same network interface by maintaining the link
-layer connections until the last session has been closed. The subsequent table
-lists the major QNetworkSession functions and how they fit into the session and
-hardware management categories:
-
-\table 60%
-\header \li Interface management \li Session management
-\row \li QNetworkSession::stop() \li QNetworkSession::open()
-\row \li QNetworkSession::interface() \li QNetworkSession::close()
-\row \li QNetworkSession::state() \li QNetworkSession::isOpen()
-\row \li QNetworkSession::bytesWritten() \li QNetworkSession::migrate()
-\row \li QNetworkSession::bytesReceived() \li QNetworkSession::ignore()
-\row \li QNetworkSession::activeTime() \li QNetworkSession::accept()
-\row \li QNetworkSession::stateChanged() \li QNetworkSession::reject()
-\row \li \li QNetworkSession::opened()
-\row \li \li QNetworkSession::closed()
-\endtable
-
-The state of the session represents the state of the underlying access point
-whereas the session's openness implies the networking/connectivity state available
-to the current process.
-
-Possible use cases for interface management are network management related
-applications which intend to monitor the connectivity state but do not engage
-in network communication themselves. Any application wanting to open a socket
-to a remote address will typically use session management related functionality.
-
-\section3 Service networks
-
-Some mobile platforms use the concept of grouped access points (also
-called SNAP or Service Network Access Point). In principle multiple
-configurations are grouped together and possibly even prioritized when
-compared to each other. This is useful for use cases where all
-configurations serve a similar purpose or context. A common context could
-be that they provide access to the public Internet or possibly only to the
-office Intranet. By providing a pool of configurations the system can make
-a decision based on given priorities which usually map to factors such as
-speed, availability and cost. Furthermore the system can automatically
-roam from one access point to the next one while ensuring minimal impact on
-the user experience.
-
-The \l{QNetworkConfiguration::Type} flag specifies to what category a
-configuration belongs. The \l{QNetworkConfiguration::InternetAccessPoint}
-type is the most common example. It represents a configuration that can be
-used to create a session. The above mentioned grouping behavior is provided
-by \l {QNetworkConfiguration::ServiceNetwork} configurations. Service
-networks are place holders until such time when the user attempts to
-\l {QNetworkSession::open()}{open()} a new session. At that point in time
-the system determines which of the configurations \l{QNetworkConfiguration::children()}
-is best to use. The selection algorithm is provided by the platform and is usually managed
-by network settings applications. A service network can only have one level of indirection
-which implies children can only be of type \l {QNetworkConfiguration::InternetAccessPoint}.
-
-Most systems allow the user to define the systems default configuration.
-Usually the default behavior is either a service network, a particular
-Internet access point or the user instructs the platform to ask the user
-once an application requests the network. User interaction is generally
-implemented by some sort of system dialog which shows up at the appropriate
-point in time. The application does not have to handle the user input. This
-API provides the \l QNetworkConfigurationManager::defaultConfiguration()
-call which serves a similar purpose. The subsequent code snippet provides
-a quick way how an application can quickly create a new network session
-without (or only minimal) user interaction:
-
-\code
- // Set Internet Access Point
- QNetworkConfigurationManager manager;
- const bool canStartIAP = (manager.capabilities()
- & QNetworkConfigurationManager::CanStartAndStopInterfaces);
- // Is there default access point, use it
- QNetworkConfiguration cfg = manager.defaultConfiguration();
- if (!cfg.isValid() || (!canStartIAP && cfg.state() != QNetworkConfiguration::Active)) {
- QMessageBox::information(this, tr("Network"), tr(
- "No Access Point found."));
- return;
- }
-
- session = new QNetworkSession(cfg, this);
- session->open();
- session->waitForOpened(-1);
-\endcode
-
-To accommodate the "Ask user" use case the default configuration can be of
-type QNetworkConfiguration::UserChoice. A user choice configuration is
-resolved as part of the \l {QNetworkSession::open()} call. Note that a
-\l{QNetworkConfiguration::UserChoice}{UserChoice} configuration is only
-ever returned via \l {QNetworkConfigurationManager::defaultConfiguration()}
-and not \l QNetworkConfigurationManager::allConfigurations().
-
-On systems which do not maintain a list of
-\l {QNetworkConfigurationManager::defaultConfiguration()}{defaultConfiguration()}
-an invalid configuration is returned. A possible workaround could be to
-implement a custom dialog which is populated based on what
-\l QNetworkConfigurationManager::allConfigurations() returns.
-
-\section3 Managing network sessions
-
-A QNetworkSession object separates a \l {QNetworkSession::state()}{state()}
-and an \l{QNetworkSession::isOpen()}{isOpen()} condition.
-
-The state() attribute enables developers to detect whether the system
-currently maintains a global network session for the given
-QNetworkConfiguration. If \l {QNetworkSession::isOpen()}{isOpen()}
-returns \c true the QNetworkSession instance at hand was at least one of the
-entities requesting the global network session. This distinction is
-required to support the notion of session registrations. For as long as
-there are one or more open QNetworkSession instances the underlying
-network interface is not shut down. Therefore the session
-\l{QNetworkSession::state()}{state()} can be used to monitor the state of
-network interfaces.
-
-An open session is created by calling \l {QNetworkSession::open()} and
-closed via \l{QNetworkSession::close()}, respectively. If the session
-is \l{QNetworkSession::Disconnected}{disconnected} at the time of the
-\l{QNetworkSession::open()}{open()} call the underlying interface is started;
-otherwise only the reference counter against the global session is
-incremented. The opposite behavior can be observed when using
-\l{QNetworkSession::close()}{close()}.
-
-In some use cases it may be necessary to turn the interface off despite of
-open sessions. This can be achieved by calling
-\l{QNetworkSession::stop()}{stop()}. An example use case could be a
-network manager type of application allowing the user to control the
-overall state of the devices connectivity.
-
-Global (inter-process) session support is platform dependent and can be
-detected via \l {QNetworkConfigurationManager::SystemSessionSupport}.
-If the system does not support global session calling
-\l{QNetworkSession::close()}{close()} never stops the interface.
-
-\section3 Roaming
-
-Roaming is the process of reconnecting a device from one network to another
-while minimizing the impact on the application. The system notifies the application
-about link layer changes so that the required preparation can be taken.
-The most common reaction would be to reinitialize sockets and to renegotiate
-stateful connections with other parties. In the most extreme cases applications
-may even prevent the roaming altogether.
-
-Roaming is initiated when the system determines that a more appropriate access point
-becomes available to the user. In general such a decision is based on cost, network speed
-or network type (access to certain private networks may only be provided via certain access points).
-Almost all devices providing roaming support have some form of global configuration application
-enabling the user to define such groups of access points (service networks) and priorities.
-
-This API supports two types of roaming. Application level roaming (ALR)
-provides the most control over the process. Applications will be notified about upcoming
-link layer changes and get the opportunity to test the new access point. Eventually they can
-reject or accept the link layer change. The second form of roaming is referred to as Forced Roaming.
-The system simply changes the link layer without consulting the application. It is up to
-the application to detect that some of its internal socket may have become invalid. As a consequence
-it has to reinitialize those sockets and reestablish the previous user session without
-any interruption. Forced roaming has the advantage that applications don't have to
-manage the entire roaming process by themselves.
-
-QNetworkSession is the central class for managing roaming related issues.
-
-\section3 Platform capabilities
-
-Some API features are not available on all platforms. The
-\l QNetworkConfigurationManager::Capability should be used to detect
-platform features at runtime.
-
-*/
diff --git a/src/network/doc/src/network-programming.qdoc b/src/network/doc/src/network-programming.qdoc
index 654227f971..96bbd8d38b 100644
--- a/src/network/doc/src/network-programming.qdoc
+++ b/src/network/doc/src/network-programming.qdoc
@@ -43,9 +43,6 @@
QTcpServer and QUdpSocket that represent low level network concepts,
and high level classes such as QNetworkRequest, QNetworkReply and
QNetworkAccessManager to perform network operations using common protocols.
- It also offers classes such as QNetworkConfiguration,
- QNetworkConfigurationManager and QNetworkSession that implement bearer
- management.
\tableofcontents
diff --git a/src/network/kernel/kernel.pri b/src/network/kernel/kernel.pri
index 110d9f56bf..7dd5b1d97e 100644
--- a/src/network/kernel/kernel.pri
+++ b/src/network/kernel/kernel.pri
@@ -26,6 +26,13 @@ SOURCES += kernel/qauthenticator.cpp \
kernel/qnetworkinterface.cpp \
kernel/qnetworkproxy.cpp
+
+qtConfig(topleveldomain) {
+ HEADERS += kernel/qurltlds_p.h \
+ kernel/qtldurl_p.h
+ SOURCES += kernel/qtldurl.cpp
+}
+
qtConfig(ftp) {
HEADERS += kernel/qurlinfo_p.h
SOURCES += kernel/qurlinfo.cpp
diff --git a/src/network/kernel/qhostaddress.cpp b/src/network/kernel/qhostaddress.cpp
index ed1c23ed6e..b9fc129685 100644
--- a/src/network/kernel/qhostaddress.cpp
+++ b/src/network/kernel/qhostaddress.cpp
@@ -1333,7 +1333,7 @@ QDebug operator<<(QDebug d, const QHostAddress &address)
\relates QHostAddress
Returns a hash of the host address \a key, using \a seed to seed the calculation.
*/
-uint qHash(const QHostAddress &key, uint seed) noexcept
+size_t qHash(const QHostAddress &key, size_t seed) noexcept
{
return qHashBits(key.d->a6.c, 16, seed);
}
diff --git a/src/network/kernel/qhostaddress.h b/src/network/kernel/qhostaddress.h
index 799247695e..ffa08aca30 100644
--- a/src/network/kernel/qhostaddress.h
+++ b/src/network/kernel/qhostaddress.h
@@ -66,7 +66,7 @@ typedef QIPv6Address Q_IPV6ADDR;
class QHostAddress;
// qHash is a friend, but we can't use default arguments for friends (§8.3.6.4)
-Q_NETWORK_EXPORT uint qHash(const QHostAddress &key, uint seed = 0) noexcept;
+Q_NETWORK_EXPORT size_t qHash(const QHostAddress &key, size_t seed = 0) noexcept;
class Q_NETWORK_EXPORT QHostAddress
{
@@ -154,7 +154,7 @@ public:
static QPair<QHostAddress, int> parseSubnet(const QString &subnet);
- friend Q_NETWORK_EXPORT uint qHash(const QHostAddress &key, uint seed) noexcept;
+ friend Q_NETWORK_EXPORT size_t qHash(const QHostAddress &key, size_t seed) noexcept;
protected:
friend class QHostAddressPrivate;
QExplicitlySharedDataPointer<QHostAddressPrivate> d;
diff --git a/src/network/kernel/qhostinfo.cpp b/src/network/kernel/qhostinfo.cpp
index 93be053ef3..115f3445b9 100644
--- a/src/network/kernel/qhostinfo.cpp
+++ b/src/network/kernel/qhostinfo.cpp
@@ -51,7 +51,6 @@
#include <qstringlist.h>
#include <qthread.h>
#include <qurl.h>
-#include <private/qnetworksession_p.h>
#include <algorithm>
diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index d7875a0673..cc34d575b2 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -70,7 +70,6 @@
#include <QElapsedTimer>
#include <QCache>
-#include <QNetworkSession>
#include <QSharedPointer>
#include <atomic>
diff --git a/src/network/kernel/qnetworkinterface.h b/src/network/kernel/qnetworkinterface.h
index 4caedaa38f..c65ea58860 100644
--- a/src/network/kernel/qnetworkinterface.h
+++ b/src/network/kernel/qnetworkinterface.h
@@ -50,7 +50,6 @@
QT_BEGIN_NAMESPACE
class QDeadlineTimer;
-template<typename T> class QList;
class QNetworkAddressEntryPrivate;
class Q_NETWORK_EXPORT QNetworkAddressEntry
diff --git a/src/network/kernel/qnetworkproxy.cpp b/src/network/kernel/qnetworkproxy.cpp
index 3cabdd0bd5..75f81a0037 100644
--- a/src/network/kernel/qnetworkproxy.cpp
+++ b/src/network/kernel/qnetworkproxy.cpp
@@ -241,10 +241,6 @@
#include "qstringlist.h"
#include "qurl.h"
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
-#include <QtNetwork/QNetworkConfiguration>
-#endif
-
QT_BEGIN_NAMESPACE
class QSocks5SocketEngineHandler;
@@ -1128,73 +1124,6 @@ QNetworkProxyQuery::QNetworkProxyQuery(quint16 bindPort, const QString &protocol
d->type = queryType;
}
-#if !defined(QT_NO_BEARERMANAGEMENT) && QT_DEPRECATED_SINCE(5, 10)
-/*!
- \deprecated
-
- Constructs a QNetworkProxyQuery with the URL \a requestUrl and
- sets the query type to \a queryType. The specified \a networkConfiguration
- parameter is ignored.
-
- \sa protocolTag(), peerHostName(), peerPort(), networkConfiguration()
-*/
-QNetworkProxyQuery::QNetworkProxyQuery(const QNetworkConfiguration &networkConfiguration,
- const QUrl &requestUrl, QueryType queryType)
-{
- Q_UNUSED(networkConfiguration)
- d->remote = requestUrl;
- d->type = queryType;
-}
-
-/*!
- \deprecated
-
- Constructs a QNetworkProxyQuery of type \a queryType and sets the
- protocol tag to be \a protocolTag. This constructor is suitable
- for QNetworkProxyQuery::TcpSocket queries, because it sets the
- peer hostname to \a hostname and the peer's port number to \a
- port. The specified \a networkConfiguration parameter is ignored.
-
- \sa networkConfiguration()
-*/
-QNetworkProxyQuery::QNetworkProxyQuery(const QNetworkConfiguration &networkConfiguration,
- const QString &hostname, int port,
- const QString &protocolTag,
- QueryType queryType)
-{
- Q_UNUSED(networkConfiguration);
- d->remote.setScheme(protocolTag);
- d->remote.setHost(hostname);
- d->remote.setPort(port);
- d->type = queryType;
-}
-
-/*!
- \deprecated
-
- Constructs a QNetworkProxyQuery of type \a queryType and sets the
- protocol tag to be \a protocolTag. This constructor is suitable
- for QNetworkProxyQuery::TcpSocket queries because it sets the
- local port number to \a bindPort. The specified \a networkConfiguration
- parameter is ignored.
-
- Note that \a bindPort is of type quint16 to indicate the exact
- port number that is requested. The value of -1 (unknown) is not
- allowed in this context.
-
- \sa localPort(), networkConfiguration()
-*/
-QNetworkProxyQuery::QNetworkProxyQuery(const QNetworkConfiguration &networkConfiguration,
- quint16 bindPort, const QString &protocolTag,
- QueryType queryType)
-{
- Q_UNUSED(networkConfiguration);
- d->remote.setScheme(protocolTag);
- d->localPort = bindPort;
- d->type = queryType;
-}
-#endif // !defined(QT_NO_BEARERMANAGEMENT) && QT_DEPRECATED_SINCE(5, 10)
-
/*!
Constructs a QNetworkProxyQuery object that is a copy of \a other.
*/
@@ -1417,33 +1346,6 @@ void QNetworkProxyQuery::setUrl(const QUrl &url)
d->remote = url;
}
-#if !defined(QT_NO_BEARERMANAGEMENT) && QT_DEPRECATED_SINCE(5, 10)
-/*!
- \deprecated
-
- Returns QNetworkConfiguration().
-
- \sa setNetworkConfiguration()
-*/
-QNetworkConfiguration QNetworkProxyQuery::networkConfiguration() const
-{
- return QNetworkConfiguration();
-}
-
-/*!
- \deprecated
-
- This function does nothing. The specified \a networkConfiguration parameter
- is ignored.
-
- \sa networkConfiguration()
-*/
-void QNetworkProxyQuery::setNetworkConfiguration(const QNetworkConfiguration &networkConfiguration)
-{
- Q_UNUSED(networkConfiguration);
-}
-#endif // !defined(QT_NO_BEARERMANAGEMENT) && QT_DEPRECATED_SINCE(5, 10)
-
/*!
\class QNetworkProxyFactory
\brief The QNetworkProxyFactory class provides fine-grained proxy selection.
diff --git a/src/network/kernel/qnetworkproxy.h b/src/network/kernel/qnetworkproxy.h
index d267e744e3..1f0409e8ab 100644
--- a/src/network/kernel/qnetworkproxy.h
+++ b/src/network/kernel/qnetworkproxy.h
@@ -51,7 +51,6 @@ QT_BEGIN_NAMESPACE
class QUrl;
-class QNetworkConfiguration;
class QNetworkProxyQueryPrivate;
class Q_NETWORK_EXPORT QNetworkProxyQuery
@@ -75,22 +74,6 @@ public:
QueryType queryType = TcpSocket);
explicit QNetworkProxyQuery(quint16 bindPort, const QString &protocolTag = QString(),
QueryType queryType = TcpServer);
-#if !defined(QT_NO_BEARERMANAGEMENT) && QT_DEPRECATED_SINCE(5, 10)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- Q_DECL_DEPRECATED_X("QNetworkConfiguration support in QNetworkProxy is deprecated")
- QNetworkProxyQuery(const QNetworkConfiguration &networkConfiguration,
- const QUrl &requestUrl, QueryType queryType = UrlRequest);
- Q_DECL_DEPRECATED_X("QNetworkConfiguration support in QNetworkProxy is deprecated")
- QNetworkProxyQuery(const QNetworkConfiguration &networkConfiguration,
- const QString &hostname, int port, const QString &protocolTag = QString(),
- QueryType queryType = TcpSocket);
- Q_DECL_DEPRECATED_X("QNetworkConfiguration support in QNetworkProxy is deprecated")
- QNetworkProxyQuery(const QNetworkConfiguration &networkConfiguration,
- quint16 bindPort, const QString &protocolTag = QString(),
- QueryType queryType = TcpServer);
-QT_WARNING_POP
-#endif
QNetworkProxyQuery(const QNetworkProxyQuery &other);
QNetworkProxyQuery &operator=(QNetworkProxyQuery &&other) noexcept { swap(other); return *this; }
QNetworkProxyQuery &operator=(const QNetworkProxyQuery &other);
@@ -120,16 +103,6 @@ QT_WARNING_POP
QUrl url() const;
void setUrl(const QUrl &url);
-#if !defined(QT_NO_BEARERMANAGEMENT) && QT_DEPRECATED_SINCE(5, 10)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- Q_DECL_DEPRECATED_X("QNetworkConfiguration support in QNetworkProxy is deprecated")
- QNetworkConfiguration networkConfiguration() const;
- Q_DECL_DEPRECATED_X("QNetworkConfiguration support in QNetworkProxy is deprecated")
- void setNetworkConfiguration(const QNetworkConfiguration &networkConfiguration);
-QT_WARNING_POP
-#endif
-
private:
QSharedDataPointer<QNetworkProxyQueryPrivate> d;
};
diff --git a/src/network/kernel/qnetworkproxy_mac.cpp b/src/network/kernel/qnetworkproxy_mac.cpp
index 67fda24ea6..4c582bfa71 100644
--- a/src/network/kernel/qnetworkproxy_mac.cpp
+++ b/src/network/kernel/qnetworkproxy_mac.cpp
@@ -45,7 +45,7 @@
#include <CoreFoundation/CoreFoundation.h>
#include <SystemConfiguration/SystemConfiguration.h>
-#include <QtCore/QRegExp>
+#include <QtCore/QRegularExpression>
#include <QtCore/QStringList>
#include <QtCore/QUrl>
#include <QtCore/qendian.h>
@@ -110,8 +110,9 @@ static bool isHostExcluded(CFDictionaryRef dict, const QString &host)
return true; // excluded
} else {
// do wildcard matching
- QRegExp rx(entry, Qt::CaseInsensitive, QRegExp::Wildcard);
- if (rx.exactMatch(host))
+ QRegularExpression rx(QRegularExpression::wildcardToRegularExpression(entry),
+ QRegularExpression::CaseInsensitiveOption);
+ if (rx.match(host).hasMatch())
return true;
}
}
diff --git a/src/network/kernel/qnetworkproxy_win.cpp b/src/network/kernel/qnetworkproxy_win.cpp
index 56397814b0..dffc0adf8f 100644
--- a/src/network/kernel/qnetworkproxy_win.cpp
+++ b/src/network/kernel/qnetworkproxy_win.cpp
@@ -43,7 +43,7 @@
#include <qmutex.h>
#include <qstringlist.h>
-#include <qregexp.h>
+#include <qregularexpression.h>
#include <qurl.h>
#include <private/qsystemlibrary_p.h>
#include <qnetworkinterface.h>
@@ -212,8 +212,9 @@ static bool isBypassed(const QString &host, const QStringList &bypassList)
return true; // excluded
} else {
// do wildcard matching
- QRegExp rx(entry, Qt::CaseInsensitive, QRegExp::Wildcard);
- if (rx.exactMatch(host))
+ QRegularExpression rx(QRegularExpression::wildcardToRegularExpression(entry),
+ QRegularExpression::CaseInsensitiveOption);
+ if (rx.match(host).hasMatch())
return true;
}
}
diff --git a/src/network/kernel/qtldurl.cpp b/src/network/kernel/qtldurl.cpp
new file mode 100644
index 0000000000..c2f7d1de26
--- /dev/null
+++ b/src/network/kernel/qtldurl.cpp
@@ -0,0 +1,139 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qglobal.h>
+
+#include <QtNetwork/private/qtnetworkglobal_p.h>
+
+#if QT_CONFIG(topleveldomain)
+
+#include "qplatformdefs.h"
+#include "qurl.h"
+#include "private/qurltlds_p.h"
+#include "private/qtldurl_p.h"
+#include "QtCore/qstring.h"
+#include "QtCore/qvector.h"
+
+QT_BEGIN_NAMESPACE
+
+enum TLDMatchType {
+ ExactMatch,
+ SuffixMatch,
+ ExceptionMatch,
+};
+
+static bool containsTLDEntry(QStringView entry, TLDMatchType match)
+{
+ const QStringView matchSymbols[] = {
+ u"",
+ u"*",
+ u"!",
+ };
+ const auto symbol = matchSymbols[match];
+ int index = qt_hash(entry, qt_hash(symbol)) % tldCount;
+
+ // select the right chunk from the big table
+ short chunk = 0;
+ uint chunkIndex = tldIndices[index], offset = 0;
+ while (chunk < tldChunkCount && tldIndices[index] >= tldChunks[chunk]) {
+ chunkIndex -= tldChunks[chunk];
+ offset += tldChunks[chunk];
+ chunk++;
+ }
+
+ // check all the entries from the given index
+ while (chunkIndex < tldIndices[index+1] - offset) {
+ const auto utf8 = tldData[chunk] + chunkIndex;
+ if ((symbol.isEmpty() || QLatin1Char(*utf8) == symbol) && entry == QString::fromUtf8(utf8 + symbol.size()))
+ return true;
+ chunkIndex += qstrlen(utf8) + 1; // +1 for the ending \0
+ }
+ return false;
+}
+
+/*!
+ \internal
+
+ Return the top-level-domain per Qt's copy of the Mozilla public suffix list of
+ \a domain.
+*/
+
+Q_NETWORK_EXPORT QString qTopLevelDomain(const QString &domain)
+{
+ const QString domainLower = domain.toLower();
+ QVector<QStringRef> sections = domainLower.splitRef(QLatin1Char('.'), Qt::SkipEmptyParts);
+ if (sections.isEmpty())
+ return QString();
+
+ QString level, tld;
+ for (int j = sections.count() - 1; j >= 0; --j) {
+ level.prepend(QLatin1Char('.') + sections.at(j));
+ if (qIsEffectiveTLD(level.rightRef(level.size() - 1)))
+ tld = level;
+ }
+ return tld;
+}
+
+/*!
+ \internal
+
+ Return true if \a domain is a top-level-domain per Qt's copy of the Mozilla public suffix list.
+*/
+
+Q_NETWORK_EXPORT bool qIsEffectiveTLD(const QStringRef &domain)
+{
+ // for domain 'foo.bar.com':
+ // 1. return if TLD table contains 'foo.bar.com'
+ // 2. else if table contains '*.bar.com',
+ // 3. test that table does not contain '!foo.bar.com'
+
+ if (containsTLDEntry(domain, ExactMatch)) // 1
+ return true;
+
+ const int dot = domain.indexOf(QLatin1Char('.'));
+ if (dot < 0) // Actual TLD: may be effective if the subject of a wildcard rule:
+ return containsTLDEntry(QString(QLatin1Char('.') + domain), SuffixMatch);
+ if (containsTLDEntry(domain.mid(dot), SuffixMatch)) // 2
+ return !containsTLDEntry(domain, ExceptionMatch); // 3
+ return false;
+}
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/network/kernel/qtldurl_p.h b/src/network/kernel/qtldurl_p.h
new file mode 100644
index 0000000000..a6948cfd48
--- /dev/null
+++ b/src/network/kernel/qtldurl_p.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTLDURL_P_H
+#define QTLDURL_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of qDecodeDataUrl. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtNetwork/private/qtnetworkglobal_p.h>
+#include "QtCore/qurl.h"
+#include "QtCore/qstring.h"
+
+QT_REQUIRE_CONFIG(topleveldomain);
+
+QT_BEGIN_NAMESPACE
+
+Q_NETWORK_EXPORT QString qTopLevelDomain(const QString &domain);
+Q_NETWORK_EXPORT bool qIsEffectiveTLD(const QStringRef &domain);
+inline bool qIsEffectiveTLD(const QString &domain)
+{
+ return qIsEffectiveTLD(QStringRef(&domain));
+}
+
+QT_END_NAMESPACE
+
+#endif // QDATAURL_P_H
diff --git a/src/network/kernel/qurltlds_p.h b/src/network/kernel/qurltlds_p.h
new file mode 100644
index 0000000000..1257c0e6e1
--- /dev/null
+++ b/src/network/kernel/qurltlds_p.h
@@ -0,0 +1,14467 @@
+// License: MPL 2.0/GPL 2.0/LGPL 3
+//
+// The contents of this file are subject to the Mozilla Public License Version
+// 2.0 (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+// http://www.mozilla.org/MPL/
+//
+// Software distributed under the License is distributed on an "AS IS" basis,
+// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+// for the specific language governing rights and limitations under the
+// License.
+//
+// The Original Code is the Public Suffix List.
+//
+// The Initial Developer of the Original Code is
+// Jo Hermans <jo.hermans@gmail.com>.
+// Portions created by the Initial Developer are Copyright (C) 2007
+// the Initial Developer. All Rights Reserved.
+//
+// Contributor(s):
+// Ruben Arakelyan <ruben@wackomenace.co.uk>
+// Gervase Markham <gerv@gerv.net>
+// Pamela Greene <pamg.bugs@gmail.com>
+// David Triendl <david@triendl.name>
+// Jothan Frakes <jothan@gmail.com>
+// The kind representatives of many TLD registries
+//
+// Alternatively, the contents of this file may be used under the terms of
+// either the GNU General Public License Version 2 or later (the "GPL"), or
+// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+// in which case the provisions of the GPL or the LGPL are applicable instead
+// of those above. If you wish to allow use of your version of this file only
+// under the terms of either the GPL or the LGPL, and not to allow others to
+// use your version of this file under the terms of the MPL, indicate your
+// decision by deleting the provisions above and replace them with the notice
+// and other provisions required by the GPL or the LGPL. If you do not delete
+// the provisions above, a recipient may use your version of this file under
+// the terms of any one of the MPL, the GPL or the LGPL.
+//
+
+#ifndef QURLTLD_P_H
+#define QURLTLD_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the Network Access and Core framework. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtNetwork/private/qtnetworkglobal_p.h>
+
+QT_BEGIN_NAMESPACE
+
+// note to maintainer:
+// this file should be updated before each release ->
+// for instructions see the program at
+// util/corelib/qurl-generateTLDs/
+
+static const quint16 tldCount = 8830;
+static const quint32 tldIndices[] = {
+0,
+16,
+28,
+45,
+45,
+45,
+78,
+78,
+106,
+128,
+169,
+202,
+220,
+237,
+237,
+260,
+260,
+270,
+270,
+281,
+302,
+302,
+302,
+302,
+328,
+337,
+369,
+369,
+382,
+382,
+396,
+409,
+422,
+422,
+422,
+422,
+439,
+454,
+472,
+506,
+506,
+506,
+506,
+552,
+552,
+565,
+565,
+570,
+604,
+604,
+604,
+604,
+618,
+636,
+641,
+656,
+656,
+656,
+660,
+670,
+670,
+670,
+674,
+674,
+707,
+714,
+768,
+792,
+815,
+821,
+873,
+873,
+883,
+883,
+893,
+893,
+893,
+893,
+899,
+899,
+909,
+917,
+925,
+949,
+949,
+962,
+962,
+962,
+975,
+1011,
+1011,
+1048,
+1064,
+1064,
+1064,
+1071,
+1085,
+1085,
+1113,
+1149,
+1157,
+1157,
+1157,
+1176,
+1176,
+1176,
+1176,
+1191,
+1212,
+1217,
+1228,
+1256,
+1256,
+1256,
+1274,
+1274,
+1301,
+1354,
+1386,
+1386,
+1430,
+1450,
+1450,
+1450,
+1450,
+1450,
+1472,
+1472,
+1491,
+1491,
+1500,
+1500,
+1531,
+1531,
+1539,
+1551,
+1561,
+1588,
+1588,
+1603,
+1620,
+1640,
+1640,
+1650,
+1650,
+1680,
+1680,
+1680,
+1680,
+1680,
+1685,
+1704,
+1704,
+1704,
+1710,
+1722,
+1722,
+1722,
+1732,
+1732,
+1754,
+1754,
+1769,
+1791,
+1803,
+1803,
+1803,
+1809,
+1809,
+1845,
+1866,
+1900,
+1912,
+1912,
+1919,
+1935,
+1935,
+1944,
+1944,
+1944,
+1944,
+1951,
+1970,
+1970,
+1998,
+1998,
+2012,
+2017,
+2017,
+2017,
+2022,
+2030,
+2030,
+2036,
+2060,
+2065,
+2065,
+2088,
+2118,
+2157,
+2177,
+2177,
+2177,
+2193,
+2202,
+2219,
+2219,
+2219,
+2219,
+2219,
+2229,
+2229,
+2229,
+2229,
+2229,
+2229,
+2238,
+2238,
+2238,
+2238,
+2238,
+2238,
+2238,
+2252,
+2273,
+2291,
+2291,
+2295,
+2295,
+2308,
+2308,
+2308,
+2313,
+2353,
+2353,
+2353,
+2353,
+2378,
+2378,
+2397,
+2397,
+2402,
+2416,
+2434,
+2459,
+2466,
+2473,
+2491,
+2513,
+2513,
+2513,
+2518,
+2526,
+2526,
+2541,
+2557,
+2566,
+2566,
+2583,
+2599,
+2610,
+2610,
+2625,
+2643,
+2643,
+2676,
+2711,
+2711,
+2728,
+2728,
+2738,
+2738,
+2746,
+2746,
+2759,
+2792,
+2792,
+2812,
+2812,
+2820,
+2831,
+2831,
+2837,
+2864,
+2884,
+2915,
+2919,
+2919,
+2919,
+2925,
+2932,
+2960,
+2960,
+2964,
+2983,
+3007,
+3037,
+3046,
+3046,
+3062,
+3071,
+3092,
+3100,
+3100,
+3143,
+3143,
+3143,
+3167,
+3167,
+3167,
+3167,
+3167,
+3174,
+3183,
+3192,
+3201,
+3221,
+3221,
+3253,
+3269,
+3286,
+3310,
+3310,
+3324,
+3336,
+3336,
+3336,
+3336,
+3352,
+3391,
+3391,
+3420,
+3426,
+3441,
+3441,
+3441,
+3448,
+3466,
+3466,
+3481,
+3493,
+3526,
+3526,
+3551,
+3558,
+3558,
+3583,
+3583,
+3583,
+3583,
+3620,
+3620,
+3620,
+3626,
+3646,
+3646,
+3690,
+3729,
+3736,
+3736,
+3776,
+3798,
+3818,
+3836,
+3857,
+3857,
+3880,
+3880,
+3890,
+3908,
+3908,
+3908,
+3917,
+3933,
+3933,
+3933,
+3955,
+3955,
+3968,
+3982,
+3999,
+3999,
+4006,
+4024,
+4059,
+4059,
+4059,
+4075,
+4092,
+4092,
+4108,
+4138,
+4138,
+4138,
+4138,
+4138,
+4165,
+4171,
+4177,
+4184,
+4202,
+4222,
+4222,
+4238,
+4261,
+4268,
+4268,
+4287,
+4293,
+4306,
+4312,
+4326,
+4383,
+4401,
+4413,
+4448,
+4453,
+4476,
+4512,
+4522,
+4559,
+4575,
+4575,
+4575,
+4575,
+4575,
+4593,
+4652,
+4652,
+4652,
+4652,
+4675,
+4685,
+4685,
+4696,
+4727,
+4739,
+4739,
+4746,
+4746,
+4767,
+4779,
+4799,
+4799,
+4805,
+4805,
+4812,
+4812,
+4826,
+4846,
+4846,
+4862,
+4868,
+4887,
+4887,
+4887,
+4887,
+4887,
+4915,
+4933,
+4950,
+4968,
+4972,
+4985,
+4985,
+4985,
+4985,
+4997,
+5003,
+5003,
+5019,
+5019,
+5028,
+5053,
+5059,
+5059,
+5059,
+5059,
+5078,
+5078,
+5091,
+5124,
+5151,
+5180,
+5220,
+5220,
+5239,
+5263,
+5274,
+5274,
+5288,
+5303,
+5313,
+5330,
+5347,
+5384,
+5384,
+5401,
+5407,
+5423,
+5423,
+5423,
+5429,
+5451,
+5474,
+5496,
+5518,
+5530,
+5540,
+5540,
+5562,
+5591,
+5597,
+5597,
+5614,
+5618,
+5647,
+5657,
+5657,
+5657,
+5679,
+5696,
+5696,
+5705,
+5712,
+5735,
+5735,
+5764,
+5764,
+5764,
+5764,
+5764,
+5772,
+5776,
+5791,
+5806,
+5812,
+5833,
+5853,
+5873,
+5873,
+5891,
+5903,
+5916,
+5916,
+5916,
+5936,
+5954,
+5964,
+5964,
+5975,
+5975,
+5985,
+6020,
+6043,
+6056,
+6056,
+6056,
+6067,
+6067,
+6077,
+6077,
+6083,
+6092,
+6101,
+6111,
+6132,
+6149,
+6155,
+6159,
+6159,
+6217,
+6226,
+6226,
+6226,
+6286,
+6286,
+6286,
+6298,
+6336,
+6336,
+6336,
+6392,
+6392,
+6401,
+6425,
+6433,
+6444,
+6466,
+6483,
+6493,
+6493,
+6505,
+6516,
+6540,
+6547,
+6547,
+6564,
+6564,
+6604,
+6604,
+6604,
+6612,
+6612,
+6633,
+6633,
+6633,
+6660,
+6681,
+6681,
+6681,
+6681,
+6699,
+6756,
+6768,
+6799,
+6817,
+6817,
+6838,
+6838,
+6838,
+6853,
+6875,
+6875,
+6875,
+6887,
+6887,
+6893,
+6893,
+6893,
+6933,
+6933,
+6940,
+6947,
+6969,
+6983,
+6983,
+6983,
+6983,
+7017,
+7017,
+7024,
+7024,
+7042,
+7051,
+7058,
+7058,
+7066,
+7066,
+7066,
+7092,
+7092,
+7092,
+7092,
+7092,
+7116,
+7132,
+7132,
+7139,
+7172,
+7205,
+7205,
+7217,
+7217,
+7217,
+7225,
+7225,
+7225,
+7236,
+7247,
+7258,
+7258,
+7265,
+7276,
+7317,
+7322,
+7362,
+7382,
+7382,
+7382,
+7387,
+7387,
+7387,
+7387,
+7387,
+7387,
+7415,
+7474,
+7486,
+7486,
+7495,
+7511,
+7524,
+7549,
+7581,
+7591,
+7591,
+7591,
+7591,
+7598,
+7598,
+7634,
+7643,
+7668,
+7668,
+7675,
+7697,
+7697,
+7697,
+7706,
+7773,
+7804,
+7814,
+7814,
+7828,
+7828,
+7828,
+7828,
+7848,
+7848,
+7865,
+7884,
+7899,
+7906,
+7924,
+7924,
+7955,
+8003,
+8020,
+8034,
+8073,
+8073,
+8073,
+8073,
+8073,
+8073,
+8073,
+8083,
+8098,
+8120,
+8137,
+8144,
+8144,
+8175,
+8186,
+8186,
+8210,
+8217,
+8217,
+8217,
+8217,
+8244,
+8249,
+8249,
+8249,
+8249,
+8267,
+8267,
+8267,
+8267,
+8280,
+8280,
+8280,
+8302,
+8330,
+8357,
+8357,
+8388,
+8424,
+8424,
+8444,
+8451,
+8468,
+8484,
+8500,
+8500,
+8500,
+8518,
+8518,
+8518,
+8518,
+8518,
+8544,
+8563,
+8582,
+8592,
+8592,
+8607,
+8627,
+8654,
+8723,
+8723,
+8744,
+8744,
+8763,
+8811,
+8811,
+8811,
+8824,
+8846,
+8891,
+8909,
+8939,
+8939,
+8939,
+8974,
+8984,
+8996,
+8996,
+8996,
+9003,
+9023,
+9035,
+9052,
+9052,
+9052,
+9062,
+9075,
+9075,
+9093,
+9093,
+9106,
+9112,
+9112,
+9142,
+9155,
+9159,
+9159,
+9159,
+9166,
+9173,
+9187,
+9217,
+9239,
+9256,
+9256,
+9277,
+9302,
+9302,
+9322,
+9341,
+9353,
+9353,
+9353,
+9366,
+9370,
+9382,
+9382,
+9382,
+9382,
+9382,
+9401,
+9401,
+9415,
+9427,
+9448,
+9483,
+9500,
+9551,
+9582,
+9582,
+9582,
+9594,
+9625,
+9635,
+9645,
+9674,
+9701,
+9701,
+9701,
+9731,
+9743,
+9753,
+9803,
+9820,
+9820,
+9820,
+9820,
+9846,
+9861,
+9873,
+9873,
+9873,
+9897,
+9904,
+9920,
+9928,
+9928,
+9928,
+9950,
+9950,
+9950,
+9950,
+9950,
+9950,
+9950,
+9965,
+9984,
+9984,
+9991,
+9991,
+10010,
+10054,
+10061,
+10061,
+10061,
+10061,
+10061,
+10061,
+10115,
+10115,
+10122,
+10126,
+10126,
+10126,
+10126,
+10137,
+10137,
+10143,
+10143,
+10170,
+10170,
+10186,
+10186,
+10186,
+10186,
+10186,
+10186,
+10186,
+10193,
+10201,
+10201,
+10201,
+10216,
+10225,
+10225,
+10262,
+10269,
+10284,
+10305,
+10352,
+10370,
+10379,
+10399,
+10399,
+10399,
+10399,
+10399,
+10410,
+10430,
+10436,
+10436,
+10436,
+10464,
+10464,
+10464,
+10475,
+10492,
+10513,
+10513,
+10522,
+10541,
+10551,
+10569,
+10575,
+10599,
+10599,
+10618,
+10618,
+10618,
+10641,
+10641,
+10641,
+10641,
+10641,
+10659,
+10659,
+10677,
+10677,
+10713,
+10713,
+10713,
+10756,
+10771,
+10785,
+10801,
+10819,
+10837,
+10837,
+10837,
+10841,
+10841,
+10863,
+10882,
+10882,
+10898,
+10898,
+10905,
+10905,
+10905,
+10905,
+10915,
+10915,
+10919,
+10928,
+10948,
+10970,
+10980,
+10992,
+10992,
+11002,
+11002,
+11002,
+11018,
+11018,
+11043,
+11043,
+11043,
+11060,
+11067,
+11086,
+11104,
+11109,
+11109,
+11109,
+11147,
+11147,
+11178,
+11185,
+11185,
+11194,
+11194,
+11194,
+11199,
+11199,
+11236,
+11261,
+11261,
+11270,
+11333,
+11343,
+11343,
+11354,
+11354,
+11354,
+11354,
+11366,
+11366,
+11401,
+11401,
+11401,
+11401,
+11422,
+11445,
+11445,
+11445,
+11445,
+11471,
+11478,
+11500,
+11500,
+11500,
+11504,
+11516,
+11524,
+11560,
+11560,
+11566,
+11578,
+11578,
+11578,
+11610,
+11610,
+11632,
+11632,
+11643,
+11643,
+11643,
+11643,
+11652,
+11652,
+11652,
+11697,
+11720,
+11724,
+11745,
+11761,
+11772,
+11808,
+11808,
+11823,
+11863,
+11883,
+11883,
+11896,
+11896,
+11908,
+11930,
+11936,
+11942,
+11942,
+11987,
+12003,
+12029,
+12029,
+12049,
+12068,
+12083,
+12083,
+12121,
+12121,
+12121,
+12132,
+12136,
+12136,
+12136,
+12136,
+12136,
+12148,
+12148,
+12163,
+12170,
+12170,
+12188,
+12202,
+12208,
+12208,
+12213,
+12225,
+12242,
+12242,
+12242,
+12264,
+12264,
+12297,
+12312,
+12335,
+12335,
+12344,
+12375,
+12375,
+12384,
+12406,
+12406,
+12406,
+12406,
+12406,
+12406,
+12406,
+12406,
+12412,
+12424,
+12424,
+12424,
+12424,
+12434,
+12440,
+12440,
+12479,
+12494,
+12505,
+12505,
+12520,
+12526,
+12526,
+12526,
+12526,
+12570,
+12588,
+12600,
+12612,
+12631,
+12631,
+12631,
+12631,
+12631,
+12631,
+12647,
+12659,
+12659,
+12668,
+12708,
+12736,
+12741,
+12741,
+12741,
+12753,
+12753,
+12753,
+12759,
+12767,
+12786,
+12794,
+12810,
+12836,
+12836,
+12848,
+12888,
+12899,
+12914,
+12914,
+12914,
+12921,
+12943,
+12953,
+12978,
+12989,
+12989,
+12989,
+13006,
+13006,
+13022,
+13035,
+13073,
+13097,
+13118,
+13168,
+13177,
+13191,
+13200,
+13200,
+13214,
+13234,
+13234,
+13234,
+13234,
+13276,
+13282,
+13311,
+13321,
+13321,
+13321,
+13327,
+13334,
+13361,
+13378,
+13397,
+13412,
+13420,
+13426,
+13444,
+13444,
+13444,
+13467,
+13467,
+13467,
+13467,
+13479,
+13479,
+13502,
+13502,
+13502,
+13514,
+13535,
+13543,
+13596,
+13596,
+13596,
+13596,
+13596,
+13596,
+13603,
+13603,
+13603,
+13636,
+13647,
+13647,
+13647,
+13657,
+13698,
+13698,
+13698,
+13716,
+13716,
+13723,
+13741,
+13751,
+13751,
+13762,
+13762,
+13762,
+13762,
+13762,
+13762,
+13770,
+13803,
+13812,
+13812,
+13838,
+13855,
+13866,
+13866,
+13866,
+13900,
+13900,
+13947,
+13960,
+13960,
+13972,
+13990,
+13990,
+14040,
+14054,
+14073,
+14073,
+14073,
+14082,
+14131,
+14145,
+14166,
+14166,
+14166,
+14203,
+14210,
+14234,
+14250,
+14261,
+14286,
+14286,
+14286,
+14290,
+14336,
+14367,
+14367,
+14383,
+14409,
+14409,
+14409,
+14415,
+14441,
+14441,
+14457,
+14465,
+14484,
+14484,
+14484,
+14484,
+14495,
+14514,
+14521,
+14521,
+14521,
+14521,
+14539,
+14549,
+14568,
+14568,
+14593,
+14606,
+14613,
+14649,
+14676,
+14708,
+14708,
+14712,
+14734,
+14752,
+14765,
+14782,
+14830,
+14830,
+14830,
+14838,
+14838,
+14855,
+14898,
+14898,
+14920,
+14967,
+14967,
+14967,
+14999,
+15009,
+15009,
+15009,
+15018,
+15047,
+15047,
+15047,
+15070,
+15083,
+15093,
+15099,
+15139,
+15139,
+15146,
+15165,
+15165,
+15187,
+15217,
+15222,
+15244,
+15244,
+15268,
+15296,
+15302,
+15308,
+15308,
+15308,
+15308,
+15308,
+15308,
+15317,
+15324,
+15336,
+15355,
+15355,
+15355,
+15355,
+15355,
+15372,
+15372,
+15391,
+15403,
+15414,
+15446,
+15446,
+15453,
+15459,
+15463,
+15500,
+15500,
+15513,
+15513,
+15522,
+15542,
+15599,
+15617,
+15624,
+15654,
+15668,
+15688,
+15688,
+15718,
+15718,
+15718,
+15725,
+15725,
+15741,
+15756,
+15756,
+15817,
+15817,
+15856,
+15856,
+15874,
+15884,
+15884,
+15893,
+15922,
+15940,
+15958,
+15967,
+15967,
+15967,
+15967,
+15967,
+15967,
+15967,
+15967,
+15967,
+15980,
+15980,
+15980,
+16017,
+16051,
+16051,
+16051,
+16062,
+16062,
+16062,
+16069,
+16073,
+16073,
+16087,
+16103,
+16103,
+16103,
+16128,
+16128,
+16152,
+16201,
+16228,
+16228,
+16228,
+16268,
+16277,
+16296,
+16337,
+16357,
+16397,
+16397,
+16397,
+16397,
+16419,
+16462,
+16462,
+16469,
+16493,
+16493,
+16493,
+16493,
+16502,
+16502,
+16502,
+16536,
+16544,
+16575,
+16575,
+16575,
+16649,
+16649,
+16674,
+16674,
+16674,
+16674,
+16686,
+16686,
+16731,
+16754,
+16768,
+16768,
+16776,
+16783,
+16783,
+16783,
+16799,
+16819,
+16838,
+16838,
+16863,
+16884,
+16893,
+16915,
+16915,
+16931,
+16931,
+16946,
+16971,
+16975,
+17003,
+17013,
+17026,
+17041,
+17041,
+17041,
+17041,
+17069,
+17115,
+17151,
+17151,
+17151,
+17155,
+17155,
+17155,
+17177,
+17230,
+17237,
+17244,
+17258,
+17258,
+17299,
+17304,
+17304,
+17331,
+17370,
+17383,
+17389,
+17397,
+17417,
+17417,
+17438,
+17443,
+17443,
+17443,
+17453,
+17486,
+17486,
+17504,
+17522,
+17522,
+17539,
+17556,
+17556,
+17576,
+17596,
+17596,
+17596,
+17606,
+17610,
+17617,
+17617,
+17621,
+17625,
+17630,
+17660,
+17676,
+17691,
+17701,
+17754,
+17781,
+17804,
+17804,
+17824,
+17839,
+17850,
+17850,
+17850,
+17850,
+17856,
+17856,
+17856,
+17879,
+17879,
+17929,
+17929,
+17934,
+17956,
+17956,
+17956,
+17956,
+17956,
+17962,
+17984,
+18008,
+18008,
+18008,
+18008,
+18019,
+18019,
+18030,
+18030,
+18051,
+18070,
+18070,
+18082,
+18082,
+18123,
+18123,
+18130,
+18144,
+18181,
+18257,
+18257,
+18267,
+18267,
+18267,
+18267,
+18281,
+18320,
+18327,
+18345,
+18348,
+18351,
+18377,
+18380,
+18396,
+18396,
+18404,
+18404,
+18409,
+18424,
+18427,
+18444,
+18465,
+18497,
+18518,
+18524,
+18527,
+18555,
+18573,
+18576,
+18582,
+18594,
+18597,
+18603,
+18635,
+18635,
+18638,
+18674,
+18694,
+18738,
+18761,
+18764,
+18770,
+18776,
+18776,
+18782,
+18788,
+18791,
+18809,
+18822,
+18850,
+18853,
+18856,
+18859,
+18862,
+18862,
+18885,
+18919,
+18919,
+18938,
+18944,
+18958,
+18961,
+18974,
+18991,
+19004,
+19026,
+19033,
+19047,
+19098,
+19161,
+19161,
+19174,
+19194,
+19211,
+19211,
+19214,
+19221,
+19231,
+19261,
+19270,
+19273,
+19306,
+19306,
+19320,
+19320,
+19357,
+19357,
+19357,
+19363,
+19377,
+19418,
+19425,
+19437,
+19437,
+19437,
+19466,
+19485,
+19485,
+19485,
+19502,
+19506,
+19509,
+19509,
+19512,
+19518,
+19518,
+19521,
+19524,
+19535,
+19558,
+19561,
+19564,
+19564,
+19582,
+19628,
+19638,
+19680,
+19680,
+19700,
+19703,
+19706,
+19709,
+19712,
+19734,
+19738,
+19761,
+19761,
+19794,
+19798,
+19801,
+19805,
+19808,
+19811,
+19811,
+19811,
+19858,
+19861,
+19861,
+19867,
+19873,
+19902,
+19912,
+19930,
+19930,
+19930,
+19951,
+19954,
+19957,
+19960,
+19963,
+19963,
+19973,
+20023,
+20026,
+20029,
+20052,
+20052,
+20052,
+20065,
+20076,
+20091,
+20135,
+20140,
+20152,
+20152,
+20155,
+20175,
+20185,
+20193,
+20215,
+20221,
+20243,
+20283,
+20304,
+20304,
+20336,
+20345,
+20367,
+20367,
+20382,
+20385,
+20385,
+20388,
+20418,
+20424,
+20436,
+20459,
+20459,
+20459,
+20462,
+20481,
+20512,
+20523,
+20526,
+20564,
+20564,
+20600,
+20600,
+20641,
+20644,
+20663,
+20669,
+20675,
+20686,
+20689,
+20699,
+20715,
+20729,
+20729,
+20732,
+20759,
+20764,
+20785,
+20794,
+20824,
+20839,
+20842,
+20906,
+20927,
+20942,
+20948,
+20991,
+21000,
+21030,
+21051,
+21051,
+21054,
+21094,
+21094,
+21097,
+21129,
+21136,
+21158,
+21223,
+21234,
+21237,
+21252,
+21272,
+21291,
+21306,
+21318,
+21335,
+21342,
+21359,
+21359,
+21367,
+21367,
+21376,
+21395,
+21445,
+21445,
+21470,
+21505,
+21505,
+21552,
+21571,
+21579,
+21582,
+21585,
+21625,
+21670,
+21684,
+21704,
+21707,
+21731,
+21734,
+21764,
+21772,
+21779,
+21815,
+21839,
+21842,
+21873,
+21885,
+21885,
+21885,
+21885,
+21885,
+21885,
+21885,
+21897,
+21920,
+21940,
+21943,
+21961,
+21972,
+21991,
+21999,
+21999,
+22012,
+22025,
+22034,
+22056,
+22059,
+22059,
+22062,
+22065,
+22081,
+22084,
+22096,
+22163,
+22193,
+22206,
+22209,
+22224,
+22249,
+22271,
+22274,
+22277,
+22317,
+22325,
+22325,
+22328,
+22334,
+22340,
+22351,
+22374,
+22383,
+22410,
+22436,
+22446,
+22469,
+22480,
+22483,
+22523,
+22540,
+22547,
+22563,
+22566,
+22591,
+22594,
+22594,
+22616,
+22622,
+22622,
+22656,
+22659,
+22667,
+22667,
+22681,
+22698,
+22705,
+22705,
+22721,
+22754,
+22770,
+22770,
+22795,
+22837,
+22854,
+22854,
+22884,
+22894,
+22894,
+22946,
+22946,
+22981,
+22989,
+22989,
+23005,
+23005,
+23034,
+23040,
+23058,
+23082,
+23097,
+23108,
+23108,
+23108,
+23108,
+23108,
+23119,
+23146,
+23154,
+23175,
+23175,
+23192,
+23215,
+23232,
+23270,
+23270,
+23270,
+23270,
+23297,
+23312,
+23330,
+23350,
+23354,
+23354,
+23361,
+23361,
+23361,
+23361,
+23361,
+23382,
+23382,
+23382,
+23392,
+23405,
+23405,
+23420,
+23420,
+23438,
+23438,
+23438,
+23450,
+23471,
+23483,
+23493,
+23493,
+23496,
+23496,
+23496,
+23510,
+23518,
+23537,
+23557,
+23564,
+23599,
+23618,
+23652,
+23659,
+23676,
+23676,
+23676,
+23690,
+23709,
+23737,
+23737,
+23755,
+23765,
+23765,
+23788,
+23792,
+23792,
+23792,
+23803,
+23821,
+23863,
+23863,
+23863,
+23879,
+23886,
+23911,
+23931,
+23944,
+23955,
+23955,
+23970,
+23974,
+23980,
+24006,
+24038,
+24044,
+24044,
+24044,
+24052,
+24052,
+24063,
+24063,
+24116,
+24135,
+24152,
+24193,
+24199,
+24223,
+24245,
+24245,
+24251,
+24272,
+24288,
+24288,
+24303,
+24323,
+24354,
+24360,
+24360,
+24391,
+24391,
+24391,
+24406,
+24406,
+24406,
+24415,
+24415,
+24433,
+24464,
+24464,
+24489,
+24506,
+24514,
+24524,
+24524,
+24545,
+24574,
+24587,
+24587,
+24593,
+24599,
+24626,
+24664,
+24664,
+24679,
+24688,
+24688,
+24688,
+24694,
+24712,
+24712,
+24724,
+24756,
+24794,
+24836,
+24836,
+24850,
+24880,
+24893,
+24902,
+24902,
+24943,
+24943,
+24965,
+24991,
+25023,
+25034,
+25034,
+25034,
+25051,
+25059,
+25059,
+25079,
+25089,
+25095,
+25102,
+25102,
+25102,
+25121,
+25121,
+25121,
+25128,
+25156,
+25166,
+25194,
+25201,
+25246,
+25246,
+25274,
+25274,
+25281,
+25302,
+25318,
+25326,
+25334,
+25356,
+25369,
+25369,
+25385,
+25385,
+25385,
+25385,
+25385,
+25385,
+25385,
+25385,
+25397,
+25430,
+25437,
+25480,
+25501,
+25501,
+25508,
+25573,
+25602,
+25621,
+25641,
+25665,
+25729,
+25734,
+25752,
+25783,
+25783,
+25783,
+25806,
+25821,
+25821,
+25838,
+25838,
+25856,
+25856,
+25861,
+25861,
+25867,
+25895,
+25895,
+25895,
+25902,
+25902,
+25910,
+25910,
+25917,
+25928,
+25944,
+25951,
+25965,
+25965,
+25972,
+25980,
+25984,
+25984,
+25984,
+26007,
+26042,
+26060,
+26070,
+26091,
+26102,
+26102,
+26124,
+26124,
+26144,
+26161,
+26161,
+26161,
+26176,
+26201,
+26232,
+26250,
+26287,
+26293,
+26316,
+26364,
+26371,
+26409,
+26409,
+26409,
+26409,
+26422,
+26422,
+26427,
+26427,
+26449,
+26449,
+26455,
+26460,
+26466,
+26483,
+26483,
+26502,
+26517,
+26529,
+26529,
+26548,
+26548,
+26590,
+26610,
+26645,
+26645,
+26658,
+26658,
+26694,
+26700,
+26715,
+26715,
+26715,
+26722,
+26730,
+26730,
+26730,
+26755,
+26755,
+26772,
+26772,
+26772,
+26792,
+26823,
+26823,
+26846,
+26846,
+26846,
+26846,
+26846,
+26846,
+26872,
+26920,
+26920,
+26920,
+26954,
+26954,
+26961,
+26970,
+26970,
+26976,
+26976,
+27005,
+27005,
+27049,
+27068,
+27068,
+27098,
+27112,
+27116,
+27116,
+27116,
+27116,
+27120,
+27139,
+27139,
+27139,
+27149,
+27170,
+27177,
+27198,
+27198,
+27234,
+27261,
+27261,
+27311,
+27311,
+27317,
+27317,
+27317,
+27351,
+27355,
+27355,
+27355,
+27355,
+27376,
+27376,
+27398,
+27398,
+27398,
+27427,
+27444,
+27444,
+27444,
+27454,
+27490,
+27503,
+27503,
+27517,
+27517,
+27527,
+27527,
+27545,
+27560,
+27566,
+27566,
+27566,
+27574,
+27574,
+27660,
+27667,
+27667,
+27720,
+27720,
+27732,
+27751,
+27751,
+27773,
+27782,
+27791,
+27791,
+27803,
+27815,
+27815,
+27828,
+27828,
+27868,
+27868,
+27868,
+27868,
+27868,
+27868,
+27868,
+27884,
+27884,
+27884,
+27895,
+27895,
+27914,
+27914,
+27919,
+27919,
+27962,
+27962,
+27962,
+28010,
+28017,
+28032,
+28058,
+28058,
+28063,
+28063,
+28063,
+28094,
+28106,
+28106,
+28156,
+28165,
+28175,
+28210,
+28263,
+28285,
+28285,
+28303,
+28323,
+28323,
+28323,
+28329,
+28350,
+28388,
+28413,
+28461,
+28461,
+28474,
+28497,
+28512,
+28522,
+28522,
+28551,
+28551,
+28581,
+28597,
+28597,
+28597,
+28597,
+28612,
+28624,
+28624,
+28652,
+28652,
+28657,
+28657,
+28685,
+28685,
+28685,
+28685,
+28685,
+28699,
+28720,
+28742,
+28742,
+28742,
+28742,
+28742,
+28755,
+28767,
+28767,
+28767,
+28767,
+28779,
+28779,
+28797,
+28819,
+28861,
+28868,
+28868,
+28902,
+28902,
+28902,
+28906,
+28925,
+28925,
+28941,
+28959,
+28959,
+28959,
+28981,
+28981,
+28994,
+28998,
+28998,
+29004,
+29004,
+29004,
+29016,
+29016,
+29016,
+29016,
+29016,
+29030,
+29047,
+29047,
+29047,
+29065,
+29080,
+29080,
+29093,
+29127,
+29157,
+29171,
+29191,
+29191,
+29202,
+29224,
+29224,
+29247,
+29247,
+29264,
+29277,
+29277,
+29281,
+29281,
+29281,
+29281,
+29296,
+29337,
+29350,
+29350,
+29357,
+29364,
+29373,
+29373,
+29383,
+29383,
+29383,
+29392,
+29402,
+29448,
+29448,
+29466,
+29466,
+29492,
+29492,
+29500,
+29544,
+29544,
+29564,
+29599,
+29612,
+29612,
+29625,
+29639,
+29648,
+29676,
+29689,
+29701,
+29701,
+29701,
+29701,
+29743,
+29750,
+29750,
+29750,
+29761,
+29797,
+29812,
+29812,
+29812,
+29812,
+29812,
+29839,
+29839,
+29845,
+29845,
+29851,
+29851,
+29887,
+29908,
+29908,
+29908,
+29926,
+29938,
+29938,
+29949,
+29949,
+29972,
+29972,
+29972,
+29991,
+29997,
+29997,
+29997,
+29997,
+30004,
+30004,
+30004,
+30017,
+30025,
+30025,
+30025,
+30032,
+30032,
+30032,
+30032,
+30032,
+30032,
+30032,
+30032,
+30054,
+30054,
+30072,
+30088,
+30102,
+30102,
+30102,
+30106,
+30106,
+30122,
+30122,
+30141,
+30141,
+30141,
+30165,
+30187,
+30187,
+30187,
+30193,
+30193,
+30203,
+30203,
+30214,
+30221,
+30235,
+30235,
+30235,
+30242,
+30268,
+30268,
+30277,
+30277,
+30307,
+30314,
+30319,
+30336,
+30336,
+30363,
+30363,
+30363,
+30363,
+30363,
+30395,
+30401,
+30401,
+30401,
+30410,
+30431,
+30446,
+30446,
+30484,
+30484,
+30484,
+30484,
+30527,
+30546,
+30546,
+30560,
+30571,
+30612,
+30635,
+30646,
+30657,
+30657,
+30688,
+30703,
+30703,
+30735,
+30735,
+30752,
+30760,
+30786,
+30786,
+30786,
+30805,
+30805,
+30815,
+30836,
+30836,
+30836,
+30836,
+30861,
+30869,
+30876,
+30876,
+30915,
+30937,
+30943,
+30958,
+30979,
+30979,
+30979,
+30979,
+30979,
+30994,
+31023,
+31023,
+31040,
+31065,
+31075,
+31109,
+31116,
+31116,
+31157,
+31178,
+31227,
+31255,
+31255,
+31262,
+31287,
+31287,
+31306,
+31313,
+31313,
+31333,
+31333,
+31333,
+31333,
+31333,
+31348,
+31348,
+31364,
+31364,
+31364,
+31364,
+31364,
+31364,
+31383,
+31402,
+31418,
+31433,
+31445,
+31467,
+31474,
+31505,
+31549,
+31549,
+31556,
+31586,
+31586,
+31621,
+31631,
+31631,
+31665,
+31678,
+31678,
+31721,
+31721,
+31760,
+31786,
+31786,
+31796,
+31811,
+31854,
+31854,
+31871,
+31871,
+31871,
+31881,
+31918,
+31918,
+31928,
+31928,
+31928,
+31937,
+31937,
+31937,
+31937,
+31937,
+31937,
+31937,
+31945,
+31958,
+31972,
+31984,
+31991,
+31991,
+32000,
+32000,
+32008,
+32008,
+32008,
+32032,
+32062,
+32062,
+32104,
+32120,
+32147,
+32158,
+32158,
+32174,
+32212,
+32222,
+32241,
+32252,
+32260,
+32282,
+32282,
+32286,
+32327,
+32346,
+32384,
+32384,
+32396,
+32396,
+32415,
+32415,
+32415,
+32415,
+32432,
+32432,
+32442,
+32452,
+32489,
+32506,
+32519,
+32573,
+32573,
+32590,
+32597,
+32604,
+32604,
+32620,
+32643,
+32650,
+32660,
+32680,
+32713,
+32750,
+32773,
+32780,
+32780,
+32780,
+32813,
+32833,
+32864,
+32874,
+32874,
+32893,
+32903,
+32910,
+32923,
+32969,
+32994,
+32994,
+33001,
+33008,
+33015,
+33022,
+33032,
+33045,
+33052,
+33113,
+33139,
+33150,
+33171,
+33183,
+33206,
+33264,
+33307,
+33319,
+33319,
+33338,
+33345,
+33364,
+33388,
+33388,
+33400,
+33400,
+33400,
+33414,
+33457,
+33464,
+33476,
+33503,
+33550,
+33550,
+33560,
+33573,
+33573,
+33580,
+33585,
+33585,
+33585,
+33607,
+33607,
+33614,
+33622,
+33669,
+33710,
+33710,
+33736,
+33760,
+33760,
+33771,
+33792,
+33804,
+33823,
+33823,
+33823,
+33830,
+33867,
+33872,
+33889,
+33894,
+33900,
+33900,
+33924,
+33924,
+33953,
+33978,
+33997,
+34005,
+34017,
+34024,
+34048,
+34087,
+34093,
+34118,
+34130,
+34139,
+34146,
+34161,
+34180,
+34197,
+34204,
+34214,
+34221,
+34221,
+34238,
+34254,
+34261,
+34261,
+34268,
+34275,
+34280,
+34310,
+34326,
+34350,
+34419,
+34426,
+34466,
+34476,
+34506,
+34506,
+34520,
+34520,
+34527,
+34527,
+34534,
+34546,
+34546,
+34560,
+34590,
+34599,
+34612,
+34612,
+34612,
+34628,
+34647,
+34659,
+34702,
+34751,
+34772,
+34799,
+34815,
+34815,
+34860,
+34903,
+34915,
+34915,
+34932,
+34947,
+34947,
+34953,
+34953,
+34967,
+34983,
+34993,
+35016,
+35033,
+35077,
+35086,
+35103,
+35125,
+35143,
+35150,
+35150,
+35150,
+35150,
+35177,
+35177,
+35177,
+35204,
+35239,
+35246,
+35253,
+35253,
+35265,
+35277,
+35328,
+35328,
+35348,
+35355,
+35385,
+35385,
+35397,
+35397,
+35397,
+35397,
+35408,
+35463,
+35463,
+35463,
+35463,
+35480,
+35487,
+35511,
+35553,
+35553,
+35560,
+35591,
+35591,
+35606,
+35625,
+35645,
+35657,
+35696,
+35703,
+35710,
+35717,
+35744,
+35764,
+35771,
+35785,
+35785,
+35785,
+35827,
+35852,
+35892,
+35918,
+35918,
+35924,
+35954,
+35976,
+35986,
+35986,
+36029,
+36042,
+36047,
+36047,
+36092,
+36132,
+36132,
+36153,
+36163,
+36174,
+36180,
+36203,
+36203,
+36218,
+36218,
+36225,
+36255,
+36255,
+36262,
+36285,
+36307,
+36333,
+36356,
+36396,
+36410,
+36433,
+36433,
+36473,
+36480,
+36528,
+36535,
+36551,
+36563,
+36577,
+36602,
+36638,
+36648,
+36663,
+36679,
+36679,
+36707,
+36707,
+36721,
+36721,
+36733,
+36757,
+36773,
+36802,
+36839,
+36883,
+36899,
+36911,
+36931,
+36954,
+36954,
+36969,
+37016,
+37034,
+37034,
+37053,
+37065,
+37080,
+37104,
+37136,
+37136,
+37152,
+37159,
+37177,
+37223,
+37254,
+37280,
+37298,
+37312,
+37319,
+37355,
+37380,
+37380,
+37406,
+37431,
+37455,
+37470,
+37476,
+37503,
+37542,
+37561,
+37561,
+37573,
+37596,
+37615,
+37634,
+37634,
+37653,
+37660,
+37660,
+37713,
+37738,
+37751,
+37794,
+37824,
+37837,
+37837,
+37853,
+37853,
+37859,
+37859,
+37888,
+37895,
+37895,
+37911,
+37933,
+37940,
+37959,
+37976,
+37988,
+38000,
+38033,
+38040,
+38040,
+38040,
+38046,
+38075,
+38075,
+38089,
+38098,
+38102,
+38145,
+38158,
+38165,
+38193,
+38193,
+38228,
+38275,
+38279,
+38290,
+38300,
+38300,
+38320,
+38320,
+38340,
+38363,
+38363,
+38370,
+38381,
+38386,
+38397,
+38412,
+38412,
+38422,
+38422,
+38464,
+38491,
+38491,
+38491,
+38491,
+38510,
+38510,
+38519,
+38519,
+38519,
+38519,
+38526,
+38552,
+38573,
+38612,
+38618,
+38618,
+38636,
+38641,
+38641,
+38646,
+38658,
+38670,
+38688,
+38695,
+38719,
+38746,
+38746,
+38774,
+38774,
+38778,
+38790,
+38795,
+38795,
+38838,
+38838,
+38849,
+38849,
+38849,
+38849,
+38862,
+38862,
+38862,
+38862,
+38878,
+38918,
+38926,
+38941,
+38941,
+38951,
+38976,
+38993,
+38999,
+39017,
+39033,
+39051,
+39051,
+39051,
+39051,
+39065,
+39107,
+39107,
+39107,
+39112,
+39125,
+39143,
+39160,
+39181,
+39199,
+39210,
+39224,
+39224,
+39228,
+39247,
+39255,
+39255,
+39297,
+39297,
+39297,
+39311,
+39320,
+39337,
+39337,
+39361,
+39370,
+39370,
+39376,
+39385,
+39391,
+39391,
+39397,
+39403,
+39423,
+39427,
+39437,
+39463,
+39463,
+39487,
+39487,
+39487,
+39487,
+39501,
+39501,
+39514,
+39520,
+39527,
+39527,
+39527,
+39531,
+39531,
+39560,
+39560,
+39593,
+39593,
+39593,
+39617,
+39630,
+39647,
+39660,
+39660,
+39676,
+39686,
+39699,
+39737,
+39761,
+39761,
+39769,
+39792,
+39810,
+39845,
+39854,
+39878,
+39900,
+39906,
+39906,
+39951,
+39951,
+39951,
+39951,
+39975,
+40011,
+40011,
+40044,
+40062,
+40062,
+40062,
+40062,
+40090,
+40100,
+40115,
+40115,
+40115,
+40115,
+40119,
+40124,
+40154,
+40174,
+40178,
+40182,
+40182,
+40182,
+40182,
+40182,
+40216,
+40216,
+40216,
+40216,
+40216,
+40216,
+40231,
+40242,
+40261,
+40267,
+40290,
+40302,
+40327,
+40353,
+40353,
+40357,
+40374,
+40408,
+40408,
+40408,
+40412,
+40412,
+40443,
+40464,
+40464,
+40464,
+40464,
+40474,
+40474,
+40493,
+40514,
+40514,
+40514,
+40532,
+40568,
+40593,
+40593,
+40593,
+40610,
+40624,
+40645,
+40655,
+40655,
+40675,
+40694,
+40699,
+40699,
+40699,
+40738,
+40738,
+40758,
+40770,
+40776,
+40776,
+40793,
+40817,
+40823,
+40828,
+40866,
+40891,
+40904,
+40933,
+40944,
+40953,
+40953,
+40963,
+40969,
+40969,
+40969,
+40976,
+40976,
+40976,
+40976,
+40983,
+40983,
+40998,
+40998,
+41016,
+41016,
+41026,
+41044,
+41070,
+41105,
+41116,
+41162,
+41177,
+41223,
+41223,
+41223,
+41223,
+41231,
+41231,
+41231,
+41231,
+41257,
+41273,
+41273,
+41292,
+41308,
+41308,
+41331,
+41346,
+41364,
+41364,
+41364,
+41376,
+41376,
+41382,
+41388,
+41388,
+41388,
+41388,
+41388,
+41401,
+41417,
+41433,
+41446,
+41466,
+41488,
+41488,
+41521,
+41534,
+41577,
+41577,
+41593,
+41604,
+41625,
+41665,
+41665,
+41678,
+41678,
+41678,
+41696,
+41720,
+41737,
+41755,
+41771,
+41805,
+41811,
+41811,
+41830,
+41891,
+41891,
+41920,
+41920,
+41926,
+41947,
+41999,
+41999,
+41999,
+41999,
+42010,
+42042,
+42042,
+42048,
+42059,
+42076,
+42076,
+42093,
+42100,
+42100,
+42120,
+42120,
+42128,
+42151,
+42168,
+42181,
+42215,
+42233,
+42233,
+42233,
+42233,
+42233,
+42233,
+42239,
+42268,
+42297,
+42312,
+42318,
+42326,
+42326,
+42331,
+42345,
+42356,
+42356,
+42356,
+42374,
+42382,
+42400,
+42409,
+42409,
+42423,
+42423,
+42441,
+42470,
+42470,
+42482,
+42495,
+42513,
+42513,
+42520,
+42524,
+42541,
+42541,
+42596,
+42609,
+42609,
+42616,
+42635,
+42651,
+42681,
+42725,
+42744,
+42767,
+42767,
+42773,
+42805,
+42805,
+42805,
+42805,
+42805,
+42805,
+42830,
+42841,
+42852,
+42866,
+42883,
+42883,
+42883,
+42883,
+42883,
+42894,
+42932,
+42932,
+42975,
+42975,
+43001,
+43009,
+43009,
+43009,
+43009,
+43019,
+43035,
+43035,
+43055,
+43055,
+43055,
+43061,
+43061,
+43061,
+43067,
+43073,
+43096,
+43120,
+43136,
+43136,
+43160,
+43160,
+43160,
+43160,
+43160,
+43169,
+43169,
+43169,
+43181,
+43195,
+43204,
+43216,
+43240,
+43261,
+43290,
+43290,
+43307,
+43324,
+43337,
+43337,
+43337,
+43337,
+43346,
+43357,
+43398,
+43409,
+43417,
+43428,
+43467,
+43467,
+43467,
+43467,
+43488,
+43497,
+43538,
+43550,
+43571,
+43571,
+43586,
+43606,
+43606,
+43606,
+43606,
+43634,
+43634,
+43668,
+43668,
+43668,
+43668,
+43682,
+43713,
+43733,
+43733,
+43740,
+43760,
+43760,
+43780,
+43815,
+43833,
+43879,
+43904,
+43904,
+43904,
+43920,
+43927,
+43933,
+43933,
+43933,
+43951,
+43956,
+43978,
+43978,
+43978,
+44003,
+44003,
+44023,
+44034,
+44054,
+44054,
+44060,
+44075,
+44075,
+44089,
+44089,
+44089,
+44110,
+44128,
+44134,
+44155,
+44162,
+44189,
+44189,
+44189,
+44189,
+44212,
+44240,
+44240,
+44240,
+44255,
+44255,
+44255,
+44265,
+44297,
+44297,
+44297,
+44304,
+44304,
+44304,
+44304,
+44304,
+44304,
+44332,
+44332,
+44347,
+44347,
+44347,
+44368,
+44389,
+44407,
+44407,
+44451,
+44467,
+44486,
+44486,
+44486,
+44486,
+44503,
+44503,
+44547,
+44559,
+44570,
+44570,
+44570,
+44582,
+44610,
+44610,
+44610,
+44620,
+44620,
+44620,
+44620,
+44632,
+44632,
+44636,
+44642,
+44649,
+44699,
+44699,
+44720,
+44733,
+44738,
+44750,
+44750,
+44750,
+44750,
+44750,
+44750,
+44750,
+44765,
+44765,
+44765,
+44774,
+44774,
+44774,
+44774,
+44774,
+44787,
+44798,
+44798,
+44798,
+44813,
+44846,
+44846,
+44867,
+44867,
+44867,
+44867,
+44867,
+44867,
+44877,
+44889,
+44896,
+44896,
+44896,
+44896,
+44896,
+44896,
+44896,
+44896,
+44907,
+44920,
+44931,
+44944,
+44944,
+44951,
+44956,
+44956,
+44975,
+44975,
+44999,
+45017,
+45017,
+45017,
+45034,
+45034,
+45034,
+45034,
+45038,
+45044,
+45048,
+45048,
+45060,
+45093,
+45093,
+45112,
+45121,
+45121,
+45121,
+45128,
+45128,
+45157,
+45157,
+45157,
+45178,
+45190,
+45190,
+45190,
+45190,
+45204,
+45220,
+45239,
+45239,
+45260,
+45283,
+45295,
+45309,
+45345,
+45352,
+45352,
+45352,
+45352,
+45352,
+45352,
+45352,
+45357,
+45357,
+45357,
+45357,
+45371,
+45371,
+45371,
+45371,
+45438,
+45449,
+45467,
+45497,
+45522,
+45530,
+45535,
+45544,
+45544,
+45554,
+45574,
+45574,
+45590,
+45614,
+45614,
+45614,
+45618,
+45638,
+45653,
+45671,
+45687,
+45687,
+45687,
+45709,
+45739,
+45746,
+45746,
+45752,
+45763,
+45781,
+45803,
+45803,
+45821,
+45821,
+45843,
+45867,
+45867,
+45867,
+45885,
+45885,
+45885,
+45912,
+45912,
+45917,
+45934,
+45944,
+45944,
+45953,
+45996,
+46009,
+46016,
+46031,
+46051,
+46051,
+46070,
+46086,
+46086,
+46096,
+46109,
+46115,
+46115,
+46115,
+46115,
+46115,
+46119,
+46119,
+46119,
+46127,
+46140,
+46150,
+46159,
+46169,
+46190,
+46190,
+46194,
+46203,
+46211,
+46226,
+46226,
+46226,
+46240,
+46279,
+46290,
+46302,
+46324,
+46331,
+46350,
+46368,
+46390,
+46390,
+46434,
+46434,
+46457,
+46473,
+46484,
+46484,
+46484,
+46484,
+46534,
+46534,
+46540,
+46553,
+46596,
+46596,
+46596,
+46596,
+46625,
+46625,
+46661,
+46661,
+46661,
+46669,
+46704,
+46704,
+46721,
+46731,
+46731,
+46731,
+46731,
+46731,
+46799,
+46805,
+46834,
+46845,
+46845,
+46858,
+46868,
+46885,
+46924,
+46946,
+46946,
+46965,
+46981,
+46981,
+46992,
+46992,
+46992,
+46992,
+46992,
+47006,
+47006,
+47015,
+47015,
+47019,
+47019,
+47031,
+47031,
+47031,
+47058,
+47058,
+47078,
+47078,
+47106,
+47142,
+47142,
+47142,
+47142,
+47142,
+47184,
+47208,
+47247,
+47254,
+47269,
+47279,
+47286,
+47298,
+47298,
+47298,
+47298,
+47322,
+47336,
+47350,
+47367,
+47367,
+47388,
+47406,
+47445,
+47472,
+47472,
+47484,
+47522,
+47530,
+47537,
+47547,
+47547,
+47547,
+47582,
+47582,
+47592,
+47608,
+47627,
+47642,
+47642,
+47642,
+47649,
+47649,
+47649,
+47694,
+47714,
+47733,
+47747,
+47761,
+47779,
+47779,
+47790,
+47798,
+47798,
+47798,
+47809,
+47809,
+47809,
+47814,
+47814,
+47822,
+47839,
+47864,
+47882,
+47889,
+47924,
+47935,
+47935,
+47946,
+47946,
+47963,
+47963,
+47967,
+47967,
+47967,
+47989,
+47989,
+48024,
+48024,
+48024,
+48024,
+48035,
+48047,
+48053,
+48065,
+48065,
+48094,
+48113,
+48118,
+48118,
+48118,
+48118,
+48137,
+48173,
+48196,
+48196,
+48196,
+48217,
+48226,
+48244,
+48251,
+48280,
+48290,
+48290,
+48305,
+48337,
+48358,
+48369,
+48378,
+48378,
+48393,
+48398,
+48398,
+48403,
+48424,
+48431,
+48431,
+48431,
+48431,
+48431,
+48437,
+48437,
+48455,
+48461,
+48470,
+48470,
+48470,
+48486,
+48496,
+48514,
+48514,
+48528,
+48556,
+48611,
+48615,
+48624,
+48656,
+48656,
+48667,
+48667,
+48667,
+48684,
+48697,
+48732,
+48760,
+48773,
+48796,
+48812,
+48836,
+48836,
+48870,
+48892,
+48899,
+48899,
+48899,
+48927,
+48943,
+48943,
+48948,
+48948,
+48953,
+48969,
+48982,
+49001,
+49015,
+49033,
+49033,
+49048,
+49054,
+49070,
+49070,
+49106,
+49117,
+49134,
+49148,
+49148,
+49148,
+49154,
+49164,
+49164,
+49199,
+49199,
+49199,
+49230,
+49230,
+49230,
+49245,
+49255,
+49272,
+49282,
+49282,
+49316,
+49328,
+49328,
+49342,
+49355,
+49423,
+49450,
+49450,
+49476,
+49476,
+49476,
+49476,
+49476,
+49502,
+49502,
+49514,
+49514,
+49514,
+49519,
+49525,
+49549,
+49559,
+49559,
+49606,
+49615,
+49630,
+49642,
+49648,
+49648,
+49689,
+49689,
+49700,
+49707,
+49720,
+49727,
+49727,
+49744,
+49744,
+49744,
+49757,
+49775,
+49789,
+49789,
+49803,
+49823,
+49831,
+49831,
+49831,
+49831,
+49831,
+49855,
+49866,
+49866,
+49875,
+49888,
+49888,
+49896,
+49896,
+49896,
+49896,
+49896,
+49896,
+49917,
+49917,
+49922,
+49942,
+49942,
+49956,
+49962,
+49962,
+49988,
+50007,
+50007,
+50040,
+50040,
+50040,
+50071,
+50071,
+50071,
+50071,
+50071,
+50071,
+50079,
+50115,
+50145,
+50168,
+50168,
+50168,
+50188,
+50204,
+50204,
+50204,
+50204,
+50211,
+50211,
+50231,
+50237,
+50247,
+50247,
+50283,
+50283,
+50289,
+50289,
+50311,
+50328,
+50344,
+50344,
+50355,
+50366,
+50366,
+50372,
+50399,
+50399,
+50399,
+50405,
+50405,
+50405,
+50440,
+50440,
+50461,
+50461,
+50461,
+50486,
+50486,
+50486,
+50493,
+50511,
+50526,
+50554,
+50554,
+50554,
+50554,
+50554,
+50554,
+50554,
+50581,
+50581,
+50606,
+50635,
+50635,
+50641,
+50677,
+50700,
+50700,
+50721,
+50731,
+50731,
+50731,
+50731,
+50761,
+50769,
+50769,
+50791,
+50807,
+50845,
+50845,
+50845,
+50857,
+50876,
+50876,
+50887,
+50887,
+50912,
+50912,
+50912,
+50932,
+50969,
+50969,
+51000,
+51010,
+51010,
+51015,
+51015,
+51015,
+51015,
+51032,
+51032,
+51032,
+51065,
+51080,
+51116,
+51116,
+51116,
+51132,
+51132,
+51158,
+51164,
+51171,
+51171,
+51171,
+51190,
+51190,
+51201,
+51226,
+51226,
+51241,
+51254,
+51254,
+51273,
+51279,
+51279,
+51288,
+51307,
+51307,
+51312,
+51312,
+51326,
+51333,
+51355,
+51378,
+51425,
+51448,
+51460,
+51474,
+51479,
+51499,
+51528,
+51528,
+51528,
+51541,
+51541,
+51548,
+51596,
+51616,
+51616,
+51623,
+51651,
+51651,
+51658,
+51658,
+51677,
+51677,
+51695,
+51702,
+51718,
+51733,
+51733,
+51769,
+51791,
+51798,
+51816,
+51839,
+51855,
+51884,
+51888,
+51895,
+51908,
+51936,
+51949,
+51956,
+51975,
+51982,
+51992,
+51992,
+51992,
+51992,
+51992,
+52016,
+52016,
+52049,
+52063,
+52070,
+52070,
+52082,
+52099,
+52118,
+52144,
+52158,
+52167,
+52183,
+52183,
+52216,
+52216,
+52238,
+52283,
+52290,
+52303,
+52312,
+52337,
+52354,
+52370,
+52384,
+52427,
+52427,
+52448,
+52458,
+52458,
+52511,
+52518,
+52518,
+52533,
+52549,
+52557,
+52568,
+52615,
+52656,
+52719,
+52719,
+52735,
+52748,
+52773,
+52785,
+52785,
+52790,
+52790,
+52805,
+52805,
+52814,
+52838,
+52867,
+52867,
+52873,
+52931,
+52931,
+52968,
+52976,
+52976,
+52976,
+52983,
+52983,
+53001,
+53024,
+53024,
+53024,
+53038,
+53074,
+53084,
+53091,
+53114,
+53114,
+53136,
+53143,
+53173,
+53196,
+53196,
+53213,
+53225,
+53263,
+53281,
+53281,
+53281,
+53309,
+53330,
+53330,
+53348,
+53348,
+53355,
+53368,
+53368,
+53385,
+53410,
+53417,
+53424,
+53424,
+53439,
+53439,
+53439,
+53462,
+53462,
+53462,
+53462,
+53462,
+53462,
+53480,
+53497,
+53534,
+53556,
+53583,
+53583,
+53602,
+53602,
+53624,
+53628,
+53648,
+53659,
+53663,
+53663,
+53682,
+53689,
+53704,
+53716,
+53727,
+53762,
+53769,
+53769,
+53778,
+53778,
+53785,
+53824,
+53878,
+53889,
+53918,
+53918,
+53918,
+53953,
+53975,
+53975,
+53992,
+54020,
+54042,
+54049,
+54056,
+54078,
+54085,
+54085,
+54113,
+54124,
+54131,
+54138,
+54144,
+54184,
+54211,
+54211,
+54217,
+54224,
+54231,
+54270,
+54277,
+54316,
+54349,
+54349,
+54365,
+54372,
+54393,
+54416,
+54416,
+54464,
+54470,
+54470,
+54484,
+54491,
+54491,
+54501,
+54501,
+54530,
+54530,
+54537,
+54555,
+54568,
+54603,
+54603,
+54624,
+54658,
+54662,
+54675,
+54685,
+54691,
+54696,
+54696,
+54711,
+54711,
+54711,
+54751,
+54778,
+54782,
+54789,
+54796,
+54810,
+54823,
+54823,
+54823,
+54861,
+54868,
+54875,
+54882,
+54882,
+54902,
+54908,
+54946,
+54953,
+54953,
+54953,
+54953,
+54978,
+54978,
+54989,
+55015,
+55015,
+55015,
+55015,
+55029,
+55037,
+55037,
+55093,
+55106,
+55129,
+55129,
+55129,
+55149,
+55172,
+55172,
+55211,
+55220,
+55227,
+55249,
+55263,
+55295,
+55314,
+55321,
+55335,
+55361,
+55361,
+55382,
+55398,
+55405,
+55441,
+55469,
+55484,
+55484,
+55500,
+55500,
+55515,
+55522,
+55532,
+55532,
+55551,
+55558,
+55583,
+55590,
+55590,
+55611,
+55618,
+55649,
+55656,
+55720,
+55740,
+55777,
+55777,
+55802,
+55802,
+55827,
+55873,
+55889,
+55889,
+55889,
+55896,
+55896,
+55896,
+55915,
+55925,
+55925,
+55934,
+55972,
+55979,
+55989,
+55996,
+55996,
+55996,
+56024,
+56039,
+56078,
+56096,
+56111,
+56146,
+56192,
+56202,
+56222,
+56236,
+56277,
+56291,
+56335,
+56376,
+56376,
+56402,
+56402,
+56417,
+56425,
+56435,
+56468,
+56476,
+56488,
+56499,
+56506,
+56506,
+56531,
+56538,
+56561,
+56561,
+56561,
+56561,
+56561,
+56561,
+56561,
+56561,
+56569,
+56569,
+56577,
+56585,
+56594,
+56594,
+56594,
+56617,
+56625,
+56650,
+56660,
+56673,
+56716,
+56740,
+56745,
+56757,
+56769,
+56769,
+56769,
+56797,
+56822,
+56838,
+56838,
+56858,
+56858,
+56867,
+56879,
+56879,
+56911,
+56955,
+56976,
+57002,
+57027,
+57034,
+57054,
+57064,
+57064,
+57064,
+57078,
+57085,
+57085,
+57114,
+57114,
+57121,
+57121,
+57121,
+57121,
+57129,
+57155,
+57155,
+57193,
+57220,
+57224,
+57244,
+57244,
+57272,
+57287,
+57305,
+57348,
+57348,
+57355,
+57366,
+57412,
+57420,
+57455,
+57455,
+57455,
+57455,
+57466,
+57477,
+57477,
+57477,
+57497,
+57508,
+57523,
+57539,
+57566,
+57582,
+57612,
+57616,
+57616,
+57634,
+57634,
+57662,
+57686,
+57686,
+57698,
+57708,
+57745,
+57759,
+57798,
+57798,
+57827,
+57840,
+57840,
+57840,
+57850,
+57876,
+57876,
+57876,
+57918,
+57927,
+57927,
+57940,
+57986,
+57994,
+58009,
+58029,
+58029,
+58045,
+58045,
+58071,
+58071,
+58071,
+58093,
+58114,
+58114,
+58114,
+58150,
+58150,
+58174,
+58174,
+58207,
+58217,
+58225,
+58241,
+58258,
+58281,
+58292,
+58304,
+58319,
+58329,
+58351,
+58407,
+58417,
+58439,
+58439,
+58439,
+58475,
+58483,
+58504,
+58513,
+58523,
+58523,
+58527,
+58558,
+58602,
+58602,
+58625,
+58625,
+58649,
+58692,
+58721,
+58721,
+58721,
+58729,
+58739,
+58739,
+58758,
+58771,
+58802,
+58802,
+58802,
+58819,
+58841,
+58854,
+58872,
+58889,
+58910,
+58921,
+58921,
+58921,
+58921,
+58957,
+58957,
+58965,
+58971,
+58971,
+58979,
+58979,
+58979,
+59003,
+59003,
+59022,
+59032,
+59032,
+59032,
+59057,
+59068,
+59068,
+59068,
+59068,
+59068,
+59068,
+59068,
+59076,
+59080,
+59103,
+59120,
+59120,
+59120,
+59120,
+59126,
+59135,
+59151,
+59158,
+59158,
+59184,
+59216,
+59244,
+59259,
+59265,
+59277,
+59284,
+59306,
+59338,
+59338,
+59363,
+59363,
+59363,
+59377,
+59386,
+59386,
+59386,
+59386,
+59411,
+59433,
+59453,
+59480,
+59489,
+59489,
+59495,
+59513,
+59526,
+59548,
+59548,
+59556,
+59566,
+59566,
+59566,
+59583,
+59594,
+59622,
+59643,
+59643,
+59643,
+59648,
+59648,
+59700,
+59740,
+59740,
+59758,
+59769,
+59774,
+59774,
+59774,
+59774,
+59787,
+59822,
+59837,
+59837,
+59845,
+59850,
+59863,
+59863,
+59863,
+59869,
+59869,
+59928,
+59936,
+59953,
+59966,
+59981,
+59981,
+59997,
+60012,
+60049,
+60049,
+60108,
+60123,
+60123,
+60130,
+60164,
+60171,
+60171,
+60171,
+60171,
+60171,
+60171,
+60176,
+60199,
+60217,
+60229,
+60240,
+60240,
+60240,
+60240,
+60248,
+60262,
+60262,
+60284,
+60309,
+60324,
+60329,
+60412,
+60421,
+60421,
+60436,
+60436,
+60457,
+60481,
+60481,
+60481,
+60517,
+60525,
+60525,
+60541,
+60567,
+60575,
+60613,
+60613,
+60642,
+60663,
+60691,
+60727,
+60727,
+60744,
+60759,
+60778,
+60794,
+60809,
+60824,
+60824,
+60834,
+60834,
+60853,
+60878,
+60878,
+60878,
+60878,
+60907,
+60907,
+60907,
+60907,
+60937,
+60948,
+60990,
+60990,
+61014,
+61041,
+61041,
+61049,
+61049,
+61049,
+61062,
+61062,
+61062,
+61078,
+61078,
+61078,
+61092,
+61098,
+61132,
+61150,
+61150,
+61150,
+61150,
+61156,
+61170,
+61178,
+61187,
+61187,
+61187,
+61187,
+61194,
+61217,
+61234,
+61257,
+61257,
+61257,
+61285,
+61285,
+61292,
+61309,
+61333,
+61371,
+61371,
+61386,
+61393,
+61426,
+61450,
+61450,
+61450,
+61466,
+61466,
+61466,
+61481,
+61481,
+61481,
+61481,
+61481,
+61481,
+61500,
+61538,
+61538,
+61538,
+61584,
+61592,
+61624,
+61651,
+61651,
+61651,
+61685,
+61696,
+61711,
+61711,
+61711,
+61711,
+61761,
+61767,
+61783,
+61817,
+61842,
+61842,
+61842,
+61856,
+61856,
+61896,
+61896,
+61896,
+61959,
+61959,
+61959,
+61968,
+61992,
+62025,
+62025,
+62025,
+62040,
+62072,
+62072,
+62072,
+62072,
+62072,
+62078,
+62078,
+62099,
+62123,
+62131,
+62171,
+62171,
+62171,
+62171,
+62171,
+62171,
+62180,
+62233,
+62233,
+62253,
+62253,
+62284,
+62303,
+62318,
+62318,
+62331,
+62338,
+62378,
+62378,
+62378,
+62378,
+62390,
+62395,
+62395,
+62395,
+62395,
+62395,
+62402,
+62402,
+62423,
+62430,
+62447,
+62454,
+62454,
+62486,
+62486,
+62486,
+62509,
+62522,
+62522,
+62522,
+62522,
+62522,
+62547,
+62547,
+62575,
+62597,
+62644,
+62669,
+62686,
+62692,
+62700,
+62736,
+62782,
+62782,
+62812,
+62812,
+62830,
+62834,
+62834,
+62847,
+62866,
+62878,
+62897,
+62912,
+62928,
+62928,
+62928,
+62928,
+62945,
+62952,
+62987,
+62987,
+63023,
+63023,
+63044,
+63044,
+63044,
+63054,
+63065,
+63081,
+63081,
+63081,
+63095,
+63126,
+63154,
+63154,
+63171,
+63171,
+63185,
+63185,
+63185,
+63231,
+63231,
+63252,
+63252,
+63261,
+63261,
+63261,
+63261,
+63269,
+63269,
+63297,
+63297,
+63321,
+63342,
+63342,
+63377,
+63388,
+63401,
+63414,
+63432,
+63432,
+63432,
+63439,
+63439,
+63444,
+63487,
+63497,
+63516,
+63516,
+63545,
+63567,
+63574,
+63585,
+63599,
+63626,
+63626,
+63650,
+63650,
+63709,
+63709,
+63736,
+63757,
+63787,
+63806,
+63821,
+63838,
+63861,
+63868,
+63875,
+63875,
+63891,
+63940,
+63940,
+63940,
+63959,
+63973,
+63973,
+64013,
+64020,
+64020,
+64049,
+64081,
+64099,
+64099,
+64118,
+64118,
+64143,
+64143,
+64155,
+64155,
+64155,
+64155,
+64173,
+64173,
+64193,
+64214,
+64227,
+64227,
+64234,
+64252,
+64262,
+64297,
+64332,
+64349,
+64356,
+64363,
+64370,
+64380,
+64387,
+64394,
+64412,
+64419,
+64436,
+64447,
+64472,
+64472,
+64501,
+64515,
+64515,
+64515,
+64529,
+64547,
+64556,
+64563,
+64573,
+64580,
+64580,
+64580,
+64659,
+64666,
+64688,
+64688,
+64688,
+64695,
+64709,
+64736,
+64736,
+64736,
+64751,
+64751,
+64758,
+64789,
+64799,
+64799,
+64826,
+64849,
+64856,
+64876,
+64899,
+64910,
+64916,
+64923,
+64947,
+64957,
+64993,
+65010,
+65055,
+65055,
+65066,
+65083,
+65101,
+65105,
+65125,
+65129,
+65167,
+65181,
+65188,
+65188,
+65198,
+65229,
+65264,
+65271,
+65306,
+65333,
+65340,
+65340,
+65395,
+65395,
+65395,
+65411,
+65420,
+65437,
+65448,
+65455,
+65462,
+65479,
+65489,
+65489,
+65489,
+65514,
+65514,
+65514,
+65514,
+65532,
+65532,
+65537,
+65556,
+65567,
+65574,
+65609,
+65623,
+65645,
+65659,
+65659,
+65659,
+65659,
+65687,
+65694,
+65713,
+65720,
+65720,
+65727,
+65727,
+65734,
+65741,
+65748,
+65766,
+65800,
+65800,
+65800,
+65826,
+65826,
+65847,
+65854,
+65854,
+65878,
+65895,
+65916,
+65954,
+65973,
+66014,
+66037,
+66037,
+66037,
+66050,
+66070,
+66084,
+66084,
+66084,
+66091,
+66098,
+66122,
+66129,
+66129,
+66182,
+66189,
+66196,
+66214,
+66221,
+66221,
+66221,
+66249,
+66249,
+66249,
+66270,
+66286,
+66286,
+66286,
+66312,
+66312,
+66352,
+66397,
+66397,
+66403,
+66432,
+66432,
+66439,
+66449,
+66471,
+66493,
+66502,
+66520,
+66530,
+66585,
+66585,
+66595,
+66612,
+66647,
+66654,
+66680,
+66699,
+66724,
+66750,
+66750,
+66777,
+66804,
+66811,
+66839,
+66873,
+66914,
+66914,
+66937,
+66960,
+66979,
+67006,
+67024,
+67031,
+67038,
+67038,
+67045,
+67066,
+67109,
+67116,
+67123,
+67139,
+67160,
+67206,
+67225,
+67225,
+67225,
+67270,
+67297,
+67329,
+67357,
+67371,
+67385,
+67421,
+67455,
+67479,
+67479,
+67495,
+67504,
+67504,
+67527,
+67536,
+67543,
+67553,
+67576,
+67576,
+67576,
+67576,
+67576,
+67576,
+67614,
+67614,
+67621,
+67645,
+67645,
+67645,
+67662,
+67698,
+67698,
+67703,
+67707,
+67742,
+67808,
+67808,
+67815,
+67856,
+67863,
+67880,
+67899,
+67905,
+67912,
+67928,
+67948,
+67960,
+67975,
+67982,
+67996,
+68025,
+68025,
+68045,
+68078,
+68085,
+68085,
+68095,
+68104,
+68116,
+68147,
+68153,
+68170,
+68170,
+68183,
+68183,
+68206,
+68206,
+68206,
+68224,
+68235,
+68241,
+68248,
+68265,
+68286,
+68286,
+68303,
+68315,
+68339,
+68346,
+68353,
+68360,
+68387,
+68418,
+68437,
+68451,
+68463,
+68463,
+68463,
+68475,
+68482,
+68482,
+68509,
+68524,
+68524,
+68534,
+68541,
+68562,
+68574,
+68579,
+68586,
+68596,
+68603,
+68610,
+68641,
+68653,
+68671,
+68678,
+68699,
+68706,
+68724,
+68749,
+68762,
+68779,
+68786,
+68791,
+68791,
+68832,
+68876,
+68876,
+68904,
+68933,
+68964,
+68964,
+68964,
+68964,
+68964,
+68964,
+68964,
+68991,
+68991,
+69046,
+69063,
+69074,
+69074,
+69115,
+69167,
+69183,
+69192,
+69192,
+69209,
+69209,
+69209,
+69209,
+69243,
+69275,
+69275,
+69282,
+69282,
+69302,
+69318,
+69318,
+69318,
+69332,
+69345,
+69368,
+69380,
+69416,
+69453,
+69453,
+69459,
+69482,
+69489,
+69525,
+69525,
+69525,
+69542,
+69542,
+69542,
+69553,
+69560,
+69588,
+69588,
+69588,
+69588,
+69611,
+69634,
+69634,
+69634,
+69645,
+69645,
+69645,
+69677,
+69683,
+69693,
+69700,
+69723,
+69734,
+69744,
+69751,
+69751,
+69773,
+69773,
+69773,
+69773,
+69786,
+69819,
+69819,
+69819,
+69837,
+69848,
+69858,
+69858,
+69877,
+69877,
+69877,
+69877,
+69897,
+69897,
+69897,
+69905,
+69911,
+69911,
+69915,
+69941,
+69941,
+69964,
+69964,
+69964,
+69971,
+69971,
+69987,
+70000,
+70000,
+70000,
+70000,
+70011,
+70011,
+70018,
+70018,
+70028,
+70028,
+70028,
+70028,
+70065,
+70072,
+70086,
+70086,
+70086,
+70086,
+70110,
+70110,
+70110,
+70122,
+70145,
+70160,
+70160,
+70172,
+70193,
+70201,
+70201,
+70241,
+70247,
+70289,
+70289,
+70289,
+70311,
+70311,
+70311,
+70327,
+70334,
+70334,
+70352,
+70366,
+70366,
+70366,
+70366,
+70366,
+70366,
+70366,
+70366,
+70380,
+70380,
+70408,
+70418,
+70434,
+70438,
+70438,
+70438,
+70464,
+70481,
+70496,
+70496,
+70510,
+70510,
+70510,
+70510,
+70530,
+70530,
+70551,
+70551,
+70589,
+70604,
+70617,
+70634,
+70634,
+70634,
+70634,
+70634,
+70645,
+70645,
+70645,
+70662,
+70669,
+70716,
+70738,
+70738,
+70738,
+70738,
+70738,
+70748,
+70748,
+70772,
+70799,
+70813,
+70855,
+70886,
+70895,
+70911,
+70937,
+70937,
+70955,
+70955,
+70965,
+70975,
+70975,
+70986,
+71004,
+71004,
+71031,
+71031,
+71053,
+71068,
+71086,
+71086,
+71086,
+71101,
+71117,
+71117,
+71117,
+71151,
+71165,
+71199,
+71199,
+71199,
+71199,
+71199,
+71199,
+71219,
+71232,
+71255,
+71255,
+71255,
+71255,
+71255,
+71255,
+71255,
+71255,
+71283,
+71307,
+71307,
+71314,
+71332,
+71343,
+71347,
+71384,
+71411,
+71428,
+71428,
+71445,
+71450,
+71450,
+71450,
+71462,
+71462,
+71462,
+71462,
+71462,
+71477,
+71488,
+71488,
+71488,
+71488,
+71488,
+71488,
+71501,
+71530,
+71530,
+71567,
+71586,
+71586,
+71586,
+71603,
+71632,
+71632,
+71632,
+71632,
+71663,
+71672,
+71672,
+71682,
+71707,
+71707,
+71707,
+71714,
+71714,
+71719,
+71727,
+71727,
+71727,
+71727,
+71734,
+71734,
+71734,
+71762,
+71770,
+71770,
+71781,
+71801,
+71812,
+71821,
+71854,
+71871,
+71871,
+71879,
+71896,
+71910,
+71922,
+71959,
+71966,
+71984,
+71990,
+72040,
+72053,
+72087,
+72115,
+72143,
+72169,
+72169,
+72169,
+72179,
+72195,
+72195,
+72195,
+72195,
+72195,
+72195,
+72212,
+72212,
+72212,
+72212,
+72212,
+72222,
+72233,
+72233,
+72233,
+72242,
+72270,
+72277,
+72293,
+72319,
+72360,
+72373,
+72392,
+72409,
+72419,
+72419,
+72440,
+72479,
+72479,
+72489,
+72504,
+72513,
+72530,
+72530,
+72530,
+72530,
+72551,
+72559,
+72559,
+72559,
+72591,
+72615,
+72665,
+72665,
+72672,
+72699,
+72699,
+72709,
+72709,
+72709,
+72709,
+72709,
+72709,
+72753,
+72753,
+72773,
+72780,
+72780,
+72780,
+72805,
+72817,
+72817,
+72830,
+72830,
+72840,
+72866,
+72879,
+72879,
+72888,
+72895,
+72895,
+72895,
+72910,
+72921,
+72921,
+72928,
+72958,
+72986,
+72997,
+73009,
+73024,
+73024,
+73024,
+73024,
+73024,
+73052,
+73062,
+73087,
+73097,
+73097,
+73107,
+73107,
+73122,
+73140,
+73150,
+73159,
+73166,
+73166,
+73166,
+73176,
+73204,
+73234,
+73258,
+73258,
+73258,
+73258,
+73258,
+73258,
+73268,
+73296,
+73319,
+73319,
+73319,
+73319,
+73319,
+73319,
+73319,
+73347,
+73356,
+73365,
+73393,
+73403,
+73403,
+73428,
+73451,
+73451,
+73451,
+73461,
+73471,
+73505,
+73520,
+73520,
+73537,
+73537,
+73550,
+73596,
+73629,
+73629,
+73629,
+73629,
+73641,
+73641,
+73658,
+73658,
+73665,
+73665,
+73665,
+73665,
+73677,
+73690,
+73710,
+73727,
+73764,
+73778,
+73791,
+73811,
+73831,
+73868,
+73876,
+73876,
+73876,
+73876,
+73887,
+73907,
+73928,
+73928,
+73928,
+73928,
+73954,
+73961,
+73961,
+73961,
+73988,
+73992,
+74006,
+74049,
+74049,
+74079,
+74079,
+74098,
+74098,
+74098,
+74098,
+74140,
+74140,
+74140,
+74140,
+74192,
+74216,
+74232,
+74232,
+74260,
+74281,
+74281,
+74287,
+74310,
+74310,
+74326,
+74326,
+74326,
+74326,
+74326,
+74351,
+74370,
+74382,
+74408,
+74408,
+74408,
+74408,
+74450,
+74450,
+74450,
+74450,
+74466,
+74495,
+74534,
+74544,
+74560,
+74576,
+74576,
+74588,
+74588,
+74588,
+74606,
+74626,
+74626,
+74647,
+74691,
+74706,
+74724,
+74729,
+74737,
+74744,
+74750,
+74779,
+74833,
+74833,
+74851,
+74851,
+74851,
+74851,
+74851,
+74851,
+74871,
+74909,
+74932,
+74940,
+74971,
+74971,
+74990,
+74990,
+75008,
+75008,
+75021,
+75036,
+75054,
+75060,
+75060,
+75060,
+75060,
+75060,
+75079,
+75079,
+75079,
+75085,
+75085,
+75119,
+75124,
+75133,
+75133,
+75133,
+75139,
+75153,
+75162,
+75175,
+75175,
+75182,
+75182,
+75188,
+75212,
+75229,
+75229,
+75254,
+75260,
+75260,
+75260,
+75271,
+75271,
+75291,
+75291,
+75291,
+75291,
+75304,
+75304,
+75334,
+75351,
+75364,
+75364,
+75374,
+75374,
+75386,
+75386,
+75413,
+75447,
+75454,
+75472,
+75483,
+75483,
+75483,
+75488,
+75488,
+75488,
+75501,
+75539,
+75539,
+75571,
+75571,
+75599,
+75599,
+75637,
+75656,
+75656,
+75656,
+75656,
+75656,
+75676,
+75692,
+75710,
+75732,
+75766,
+75788,
+75799,
+75799,
+75818,
+75848,
+75860,
+75886,
+75902,
+75902,
+75912,
+75912,
+75919,
+75919,
+75919,
+75941,
+75941,
+75941,
+75976,
+75993,
+75993,
+76007,
+76022,
+76022,
+76022,
+76051,
+76077,
+76103,
+76103,
+76125,
+76136,
+76136,
+76146,
+76146,
+76167,
+76174,
+76174,
+76174,
+76181,
+76181,
+76200,
+76209,
+76237,
+76237,
+76254,
+76285,
+76300,
+76300,
+76318,
+76354,
+76363,
+76376,
+76403,
+76403,
+76403,
+76403,
+76403,
+76403,
+76421,
+76421,
+76421,
+76421,
+76459,
+76459,
+76466,
+76476,
+76484,
+76484,
+76484,
+76484,
+76484,
+76484,
+76484,
+76500,
+76500,
+76513,
+76521,
+76563,
+76570,
+76580,
+76587,
+76587,
+76613,
+76628,
+76628,
+76628,
+76628,
+76639,
+76655,
+76655,
+76655,
+76669,
+76696,
+76696,
+76696,
+76702,
+76717,
+76717,
+76717,
+76728,
+76728,
+76728,
+76768,
+76768,
+76768,
+76768,
+76768,
+76773,
+76793,
+76793,
+76813,
+76841,
+76841,
+76885,
+76913,
+76913,
+76920,
+76920,
+76920,
+76938,
+76938,
+76952,
+76952,
+76982,
+76989,
+76989,
+76989,
+76998,
+77032,
+77049,
+77049,
+77068,
+77085,
+77093,
+77093,
+77102,
+77102,
+77115,
+77135,
+77161,
+77161,
+77173,
+77189,
+77202,
+77202,
+77202,
+77202,
+77202,
+77215,
+77215,
+77215,
+77226,
+77247,
+77270,
+77270,
+77270,
+77270,
+77292,
+77316,
+77316,
+77316,
+77326,
+77375,
+77375,
+77375,
+77375,
+77375,
+77408,
+77431,
+77442,
+77442,
+77449,
+77467,
+77516,
+77528,
+77555,
+77574,
+77574,
+77588,
+77588,
+77603,
+77603,
+77603,
+77624,
+77624,
+77643,
+77643,
+77651,
+77662,
+77662,
+77662,
+77677,
+77677,
+77684,
+77765,
+77783,
+77819,
+77838,
+77838,
+77838,
+77851,
+77851,
+77863,
+77863,
+77863,
+77875,
+77899,
+77899,
+77915,
+77915,
+77915,
+77946,
+77946,
+77946,
+77946,
+77946,
+77956,
+77956,
+77978,
+77978,
+77978,
+77994,
+77994,
+77994,
+78010,
+78023,
+78054,
+78076,
+78096,
+78096,
+78096,
+78096,
+78128,
+78128,
+78128,
+78160,
+78182,
+78195,
+78195,
+78223,
+78223,
+78223,
+78223,
+78223,
+78233,
+78267,
+78279,
+78279,
+78279,
+78279,
+78279,
+78319,
+78350,
+78350,
+78363,
+78363,
+78373,
+78373,
+78373,
+78408,
+78443,
+78456,
+78474,
+78494,
+78494,
+78507,
+78525,
+78541,
+78541,
+78586,
+78598,
+78610,
+78626,
+78632,
+78632,
+78656,
+78698,
+78725,
+78760,
+78760,
+78798,
+78822,
+78847,
+78847,
+78847,
+78865,
+78917,
+78934,
+78934,
+78934,
+78934,
+78962,
+78981,
+78981,
+78981,
+78981,
+78988,
+79001,
+79001,
+79001,
+79009,
+79009,
+79009,
+79009,
+79033,
+79033,
+79055,
+79067,
+79067,
+79067,
+79084,
+79099,
+79099,
+79112,
+79112,
+79112,
+79123,
+79123,
+79123,
+79123,
+79123,
+79144,
+79152,
+79152,
+79165,
+79165,
+79180,
+79186,
+79196,
+79196,
+79196,
+79221,
+79235,
+79235,
+79249,
+79264,
+79274,
+79290,
+79300,
+79346,
+79346,
+79346,
+79346,
+79346,
+79367,
+79383,
+79390,
+79390,
+79447,
+79447,
+79470,
+79470,
+79493,
+79493,
+79493,
+79516,
+79548,
+79548,
+79579,
+79589,
+79603,
+79603,
+79603,
+79609,
+79609,
+79609,
+79609,
+79609,
+79609,
+79616,
+79626,
+79626,
+79636,
+79643,
+79688,
+79703,
+79720,
+79739,
+79746,
+79763,
+79778,
+79791,
+79791,
+79805,
+79805,
+79818,
+79818,
+79824,
+79836,
+79856,
+79877,
+79883,
+79900,
+79900,
+79900,
+79918,
+79934,
+79944,
+79982,
+79982,
+80001,
+80014,
+80014,
+80022,
+80022,
+80034,
+80047,
+80047,
+80047,
+80057,
+80064,
+80064,
+80086,
+80115,
+80115,
+80123,
+80123,
+80149,
+80170,
+80182,
+80182,
+80200,
+80226,
+80270,
+80310,
+80344,
+80344,
+80344,
+80344,
+80344,
+80344,
+80359,
+80359,
+80369,
+80369,
+80391,
+80409,
+80409,
+80439,
+80439,
+80439,
+80458,
+80458,
+80469,
+80469,
+80520,
+80520,
+80520,
+80520,
+80520,
+80520,
+80543,
+80593,
+80603,
+80603,
+80603,
+80620,
+80634,
+80669,
+80675,
+80675,
+80675,
+80675,
+80685,
+80704,
+80731,
+80731,
+80741,
+80760,
+80760,
+80760,
+80760,
+80778,
+80778,
+80778,
+80806,
+80826,
+80826,
+80826,
+80826,
+80826,
+80852,
+80852,
+80864,
+80872,
+80878,
+80878,
+80887,
+80887,
+80899,
+80938,
+80955,
+80955,
+80962,
+80979,
+80979,
+80992,
+80999,
+81022,
+81022,
+81022,
+81054,
+81104,
+81163,
+81163,
+81170,
+81170,
+81202,
+81202,
+81249,
+81249,
+81256,
+81256,
+81262,
+81301,
+81307,
+81345,
+81345,
+81345,
+81345,
+81345,
+81367,
+81367,
+81392,
+81392,
+81412,
+81452,
+81462,
+81468,
+81468,
+81477,
+81491,
+81527,
+81547,
+81582,
+81599,
+81599,
+81618,
+81641,
+81646,
+81646,
+81652,
+81658,
+81680,
+81688,
+81724,
+81760,
+81776,
+81783,
+81798,
+81798,
+81798,
+81804,
+81810,
+81810,
+81810,
+81810,
+81810,
+81816,
+81816,
+81816,
+81816,
+81816,
+81816,
+81841,
+81874,
+81880,
+81886,
+81886,
+81908,
+81908,
+81920,
+81933,
+81933,
+81940,
+81940,
+81940,
+81954,
+81972,
+81972,
+82038,
+82053,
+82068,
+82080,
+82080,
+82102,
+82120,
+82129,
+82129,
+82171,
+82191,
+82191,
+82211,
+82211,
+82244,
+82267,
+82267,
+82279,
+82290,
+82290,
+82290,
+82290,
+82318,
+82323,
+82323,
+82350,
+82367,
+82385,
+82395,
+82425,
+82425,
+82471,
+82471,
+82494,
+82494,
+82513,
+82519,
+82539,
+82539,
+82551,
+82551,
+82557,
+82557,
+82569,
+82577,
+82596,
+82596,
+82596,
+82596,
+82602,
+82610,
+82638,
+82655,
+82655,
+82666,
+82676,
+82683,
+82683,
+82683,
+82688,
+82713,
+82719,
+82740,
+82746,
+82752,
+82764,
+82770,
+82795,
+82801,
+82807,
+82813,
+82822,
+82873,
+82881,
+82894,
+82894,
+82900,
+82906,
+82936,
+82936,
+82969,
+82969,
+82997,
+82997,
+83039,
+83085,
+83092,
+83107,
+83129,
+83134,
+83152,
+83152,
+83152,
+83158,
+83174,
+83174,
+83174,
+83174,
+83182,
+83199,
+83199,
+83209,
+83209,
+83209,
+83209,
+83209,
+83253,
+83259,
+83275,
+83284,
+83299,
+83328,
+83328,
+83328,
+83334,
+83334,
+83334,
+83334,
+83339,
+83383,
+83383,
+83400,
+83434,
+83440,
+83456,
+83512,
+83527,
+83533,
+83533,
+83533,
+83540,
+83540,
+83546,
+83563,
+83574,
+83586,
+83593,
+83653,
+83653,
+83653,
+83653,
+83659,
+83679,
+83685,
+83702,
+83734,
+83740,
+83740,
+83774,
+83774,
+83781,
+83837,
+83837,
+83852,
+83852,
+83852,
+83867,
+83867,
+83867,
+83867,
+83867,
+83895,
+83901,
+83901,
+83919,
+83925,
+83925,
+83934,
+83944,
+83944,
+83944,
+83951,
+83969,
+83990,
+83990,
+84000,
+84000,
+84013,
+84013,
+84029,
+84049,
+84049,
+84080,
+84085,
+84085,
+84085,
+84111,
+84128,
+84145,
+84164,
+84176,
+84206,
+84206,
+84244,
+84244,
+84255,
+84276,
+84297,
+84297,
+84297,
+84297,
+84297,
+84310,
+84326,
+84332,
+84348,
+84395,
+84434,
+84459,
+84459,
+84459,
+84459,
+84472,
+84494,
+84494,
+84494,
+84501,
+84521,
+84521,
+84538,
+84538,
+84585,
+84585,
+84610,
+84615,
+84615,
+84615,
+84658,
+84658,
+84668,
+84691,
+84712,
+84726,
+84726,
+84733,
+84733,
+84739,
+84751,
+84751,
+84751,
+84757,
+84772,
+84802,
+84809,
+84835,
+84841,
+84862,
+84883,
+84883,
+84889,
+84918,
+84918,
+84931,
+84942,
+84942,
+84984,
+84993,
+85023,
+85029,
+85073,
+85113,
+85120,
+85137,
+85187,
+85187,
+85187,
+85225,
+85231,
+85248,
+85261,
+85261,
+85282,
+85313,
+85340,
+85369,
+85385,
+85395,
+85412,
+85419,
+85442,
+85471,
+85501,
+85560,
+85576,
+85611,
+85611,
+85611,
+85618,
+85618,
+85618,
+85625,
+85632,
+85686,
+85704,
+85704,
+85711,
+85738,
+85745,
+85795,
+85795,
+85826,
+85833,
+85840,
+85845,
+85845,
+85860,
+85867,
+85874,
+85881,
+85881,
+85881,
+85892,
+85910,
+85960,
+85980,
+86001,
+86001,
+86057,
+86057,
+86064,
+86064,
+86071,
+86071,
+86096,
+86123,
+86123,
+86139,
+86146,
+86146,
+86159,
+86159,
+86159,
+86177,
+86195,
+86202,
+86230,
+86230,
+86250,
+86273,
+86282,
+86289,
+86303,
+86303,
+86303,
+86327,
+86337,
+86355,
+86355,
+86355,
+86362,
+86369,
+86402,
+86402,
+86444,
+86451,
+86451,
+86458,
+86480,
+86480,
+86508,
+86508,
+86530,
+86530,
+86530,
+86551,
+86561,
+86594,
+86614,
+86614,
+86636,
+86651,
+86658,
+86665,
+86678,
+86702,
+86702,
+86709,
+86709,
+86739,
+86759,
+86775,
+86787,
+86855,
+86891,
+86891,
+86904,
+86904,
+86927,
+86935,
+86950,
+86950,
+86950,
+86978,
+86983,
+86983,
+86999,
+86999,
+87008,
+87022,
+87029,
+87039,
+87060,
+87060,
+87076,
+87076,
+87089,
+87116,
+87123,
+87130,
+87130,
+87130,
+87150,
+87157,
+87173,
+87199,
+87217,
+87234,
+87257,
+87257,
+87266,
+87279,
+87289,
+87289,
+87289,
+87289,
+87315,
+87322,
+87332,
+87332,
+87342,
+87342,
+87363,
+87381,
+87450,
+87450,
+87464,
+87511,
+87518,
+87535,
+87557,
+87564,
+87575,
+87589,
+87596,
+87613,
+87620,
+87620,
+87641,
+87648,
+87655,
+87662,
+87669,
+87690,
+87708,
+87708,
+87718,
+87725,
+87725,
+87734,
+87741,
+87748,
+87792,
+87792,
+87799,
+87813,
+87834,
+87834,
+87847,
+87847,
+87854,
+87871,
+87878,
+87893,
+87900,
+87942,
+87971,
+88003,
+88017,
+88045,
+88052,
+88059,
+88073,
+88101,
+88125,
+88132,
+88132,
+88132,
+88132,
+88132,
+88143,
+88143,
+88151,
+88158,
+88175,
+88175,
+88195,
+88212,
+88219,
+88219,
+88237,
+88244,
+88266,
+88266,
+88273,
+88273,
+88296,
+88296,
+88318,
+88318,
+88318,
+88324,
+88344,
+88368,
+88368,
+88375,
+88400,
+88400,
+88407,
+88443,
+88443,
+88466,
+88497,
+88497,
+88504,
+88511,
+88584,
+88591,
+88609,
+88629,
+88629,
+88629,
+88643,
+88660,
+88666,
+88691,
+88691,
+88691,
+88691,
+88691,
+88691,
+88691,
+88704,
+88704,
+88713,
+88726,
+88726,
+88774,
+88789,
+88837,
+88837,
+88837,
+88846,
+88868,
+88881,
+88881,
+88888,
+88937,
+88961,
+88987,
+89030,
+89043,
+89101,
+89150,
+89150,
+89187,
+89203,
+89210,
+89224,
+89260,
+89267,
+89267,
+89267,
+89274,
+89288,
+89295,
+89311,
+89318,
+89330,
+89351,
+89358,
+89388,
+89388,
+89398,
+89405,
+89412,
+89432,
+89474,
+89481,
+89508,
+89523,
+89552,
+89563,
+89584,
+89612,
+89612,
+89629,
+89636,
+89662,
+89681,
+89687,
+89702,
+89711,
+89727,
+89742,
+89754,
+89773,
+89783,
+89849,
+89856,
+89856,
+89863,
+89877,
+89900,
+89907,
+89907,
+89907,
+89921,
+89921,
+89938,
+89938,
+89961,
+89980,
+90000,
+90021,
+90070,
+90070,
+90086,
+90086,
+90146,
+90178,
+90178,
+90187,
+90209,
+90209,
+90209,
+90215,
+90240,
+90247,
+90256,
+90256,
+90290,
+90290,
+90298,
+90298,
+90305,
+90329,
+90329,
+90353,
+90388,
+90403,
+90409,
+90409,
+90409,
+90416,
+90416,
+90416,
+90436,
+90436,
+90436,
+90461,
+90470,
+90475,
+90475,
+90499,
+90540,
+90540,
+90583,
+90590,
+90608,
+90623,
+90623,
+90643,
+90643,
+90651,
+90718,
+90725,
+90731,
+90731,
+90757,
+90780,
+90780,
+90806,
+90829,
+90845,
+90855,
+90891,
+90891,
+90906,
+90926,
+90960,
+90975,
+90975,
+90994,
+91017,
+91017,
+91024,
+91024,
+91024,
+91034,
+91034,
+91034,
+91052,
+91052,
+91067,
+91103,
+91135,
+91172,
+91188,
+91188,
+91202,
+91221,
+91245,
+91245,
+91245,
+91245,
+91245,
+91245,
+91245,
+91245,
+91245,
+91258,
+91258,
+91276,
+91293,
+91293,
+91328,
+91349,
+91363,
+91372,
+91372,
+91393,
+91393,
+91393,
+91393,
+91393,
+91393,
+91393,
+91412,
+91445,
+91445,
+91463,
+91479,
+91497,
+91512,
+91543,
+91549,
+91549,
+91572,
+91572,
+91589,
+91613,
+91629,
+91655,
+91687,
+91703,
+91703,
+91723,
+91741,
+91741,
+91741,
+91767,
+91778,
+91778,
+91778,
+91791,
+91797,
+91797,
+91806,
+91806,
+91820,
+91836,
+91855,
+91855,
+91855,
+91855,
+91862,
+91900,
+91906,
+91948,
+91948,
+91948,
+91956,
+91956,
+91956,
+91966,
+91989,
+91989,
+92007,
+92007,
+92043,
+92049,
+92066,
+92082,
+92088,
+92088,
+92106,
+92106,
+92106,
+92106,
+92121,
+92121,
+92121,
+92121,
+92132,
+92132,
+92141,
+92160,
+92160,
+92160,
+92160,
+92167,
+92183,
+92192,
+92207,
+92227,
+92242,
+92254,
+92254,
+92284,
+92297,
+92318,
+92318,
+92337,
+92346,
+92386,
+92386,
+92386,
+92386,
+92411,
+92439,
+92454,
+92486,
+92486,
+92512,
+92512,
+92529,
+92529,
+92529,
+92534,
+92534,
+92573,
+92601,
+92621,
+92628,
+92648,
+92657,
+92657,
+92657,
+92657,
+92663,
+92675,
+92700,
+92722,
+92736,
+92742,
+92742,
+92762,
+92762,
+92783,
+92783,
+92878,
+92891,
+92891,
+92901,
+92907,
+92922,
+92937,
+92943,
+92979,
+92990,
+93025,
+93043,
+93043,
+93043,
+93043,
+93043,
+93065,
+93078,
+93105,
+93129,
+93140,
+93140,
+93151,
+93170,
+93170,
+93181,
+93181,
+93181,
+93188,
+93198,
+93198,
+93198,
+93231,
+93231,
+93249,
+93258,
+93272,
+93272,
+93295,
+93302,
+93307,
+93307,
+93323,
+93323,
+93333,
+93333,
+93360,
+93369,
+93404,
+93413,
+93430,
+93430,
+93430,
+93447,
+93467,
+93467,
+93521,
+93528,
+93546,
+93546,
+93571,
+93602,
+93628,
+93639,
+93658,
+93689,
+93703,
+93722,
+93729,
+93729,
+93736,
+93794,
+93812,
+93819,
+93819,
+93819,
+93819,
+93844,
+93851,
+93874,
+93874,
+93888,
+93895,
+93922,
+93922,
+93922,
+93930,
+93930,
+93930,
+93937,
+93937,
+93944,
+93966,
+93966,
+93966,
+93966,
+93966,
+93997,
+94011,
+94018,
+94025,
+94043,
+94043,
+94050,
+94067,
+94074,
+94074,
+94081,
+94081,
+94081,
+94088,
+94114,
+94125,
+94125,
+94125,
+94125,
+94162,
+94174,
+94174,
+94206,
+94224,
+94240,
+94283,
+94283,
+94283,
+94283,
+94290,
+94302,
+94302,
+94302,
+94308,
+94308,
+94344,
+94354,
+94369,
+94374,
+94374,
+94441,
+94482,
+94482,
+94508,
+94526,
+94526,
+94532,
+94539,
+94555,
+94562,
+94577,
+94584,
+94584,
+94598,
+94598,
+94620,
+94638,
+94666,
+94672,
+94672,
+94718,
+94718,
+94725,
+94742,
+94742,
+94749,
+94749,
+94771,
+94771,
+94771,
+94780,
+94805,
+94815,
+94815,
+94820,
+94820,
+94841,
+94841,
+94851,
+94851,
+94851,
+94871,
+94902,
+94902,
+94924,
+94935,
+94942,
+94949,
+94966,
+94966,
+94966,
+94973,
+94973,
+94973,
+94987,
+94987,
+94987,
+95007,
+95037,
+95037,
+95037,
+95037,
+95044,
+95044,
+95044,
+95061,
+95084,
+95084,
+95104,
+95126,
+95126,
+95165,
+95187,
+95194,
+95200,
+95216,
+95223,
+95230,
+95237,
+95237,
+95237,
+95260,
+95273,
+95324,
+95331,
+95338,
+95353,
+95377,
+95388,
+95388,
+95388,
+95403,
+95403,
+95410,
+95417,
+95417,
+95434,
+95476,
+95483,
+95493,
+95500,
+95505,
+95512,
+95519,
+95519,
+95554,
+95568,
+95568,
+95592,
+95592,
+95645,
+95668,
+95668,
+95701,
+95727,
+95768,
+95795,
+95829,
+95844,
+95853,
+95862,
+95862,
+95875,
+95882,
+95882,
+95907,
+95907,
+95907,
+95925,
+95925,
+95925,
+95925,
+95925,
+95951,
+95967,
+95967,
+96018,
+96047,
+96069,
+96087,
+96107,
+96107,
+96107,
+96107,
+96114,
+96142,
+96164,
+96205,
+96205,
+96205,
+96212,
+96236,
+96236,
+96243,
+96243,
+96250,
+96286,
+96293,
+96332,
+96339,
+96353,
+96359,
+96375,
+96389,
+96414,
+96436,
+96446,
+96446,
+96454,
+96466,
+96471,
+96499,
+96554,
+96564,
+96586,
+96603,
+96614,
+96614,
+96629,
+96629,
+96640,
+96662,
+96680,
+96680,
+96700,
+96722,
+96742,
+96742,
+96749,
+96756,
+96802,
+96824,
+96831,
+96840,
+96847,
+96874,
+96874,
+96886,
+96893,
+96900,
+96900,
+96907,
+96914,
+96924,
+96931,
+96944,
+96996,
+97024,
+97024,
+97045,
+97062,
+97062,
+97069,
+97096,
+97096,
+97096,
+97134,
+97134,
+97141,
+97141,
+97148,
+97155,
+97155,
+97162,
+97186,
+97205,
+97240,
+97240,
+97240,
+97240,
+97246,
+97251,
+97251,
+97267,
+97267,
+97309,
+97325,
+97341,
+97363,
+97363,
+97377,
+97392,
+97392,
+97392,
+97433,
+97443,
+97443,
+97457,
+97457,
+97479,
+97479,
+97488,
+97500,
+97516,
+97527,
+97527,
+97534,
+97534,
+97534,
+97534,
+97534,
+97534,
+97548,
+97548,
+97548,
+97548,
+97548,
+97583,
+97583,
+97583,
+97604,
+97604,
+97604,
+97604,
+97618,
+97633,
+97633,
+97642,
+97662,
+97662,
+97662,
+97662,
+97662,
+97662,
+97662,
+97662,
+97668,
+97668,
+97702,
+97702,
+97702,
+97719,
+97729,
+97729,
+97729,
+97729,
+97729,
+97729,
+97736,
+97736,
+97768,
+97775,
+97790,
+97790,
+97814,
+97824,
+97849,
+97849,
+97849,
+97849,
+97849,
+97849,
+97878,
+97878,
+97962,
+97974,
+97974,
+97974,
+98020,
+98031,
+98031,
+98031,
+98031,
+98044,
+98059,
+98059,
+98059,
+98059,
+98059,
+98077,
+98087,
+98097,
+98104,
+98104,
+98104,
+98120,
+98126,
+98169,
+98169,
+98190,
+98190,
+98206,
+98206,
+98230,
+98241,
+98241,
+98248,
+98280,
+98280,
+98297,
+98297,
+98312,
+98327,
+98342,
+98380,
+98380,
+98389,
+98408,
+98408,
+98408,
+98432,
+98446,
+98461,
+98520,
+98520,
+98533,
+98553,
+98575,
+98575,
+98575,
+98594,
+98594,
+98625,
+98636,
+98636,
+98636,
+98653,
+98672,
+98672,
+98685,
+98685,
+98691,
+98699,
+98699,
+98707,
+98737,
+98748,
+98748,
+98766,
+98799,
+98799,
+98799,
+98799,
+98799,
+98799,
+98817,
+98817,
+98817,
+98847,
+98847,
+98859,
+98894,
+98894,
+98894,
+98929,
+98947,
+98947,
+98979,
+98988,
+99005,
+99005,
+99037,
+99037,
+99037,
+99037,
+99037,
+99037,
+99062,
+99067,
+99077,
+99097,
+99097,
+99110,
+99110,
+99158,
+99209,
+99224,
+99224,
+99224,
+99224,
+99247,
+99247,
+99271,
+99271,
+99276,
+99281,
+99299,
+99322,
+99322,
+99330,
+99340,
+99356,
+99367,
+99377,
+99388,
+99388,
+99388,
+99388,
+99388,
+99388,
+99388,
+99437,
+99470,
+99503,
+99516,
+99549,
+99549,
+99555,
+99555,
+99555,
+99555,
+99570,
+99570,
+99577,
+99577,
+99597,
+99597,
+99597,
+99627,
+99658,
+99663,
+99663,
+99675,
+99719,
+99719,
+99719,
+99719,
+99737,
+99744,
+99744,
+99776,
+99791,
+99812,
+99837,
+99850,
+99871,
+99871,
+99871,
+99879,
+99889,
+99889,
+99899,
+99899,
+99899,
+99904,
+99925,
+99925,
+99947,
+99960,
+99960,
+99973,
+99973,
+100005,
+100005,
+100026,
+100026,
+100031,
+100062,
+100079,
+100079,
+100084,
+100100,
+100148,
+100148,
+100199,
+100199,
+100207,
+100235,
+100262,
+100296,
+100296,
+100322,
+100328,
+100328,
+100328,
+100351,
+100361,
+100361,
+100367,
+100367,
+100367,
+100377,
+100377,
+100421,
+100421,
+100435,
+100435,
+100481,
+100481,
+100481,
+100489,
+100489,
+100502,
+100509,
+100525,
+100540,
+100540,
+100560,
+100560,
+100611,
+100620,
+100640,
+100653,
+100653,
+100653,
+100685,
+100685,
+100698,
+100712,
+100721,
+100726,
+100726,
+100726,
+100741,
+100741,
+100751,
+100782,
+100792,
+100801,
+100808,
+100813,
+100850,
+100850,
+100863,
+100873,
+100892,
+100892,
+100892,
+100892,
+100892,
+100909,
+100925,
+100936,
+100955,
+100969,
+100978,
+100978,
+100978,
+101008,
+101036,
+101036,
+101071,
+101071,
+101102,
+101127,
+101151,
+101151,
+101158,
+101170,
+101189,
+101205,
+101205,
+101205,
+101234,
+101248,
+101248,
+101248,
+101248,
+101248,
+101275,
+101275,
+101287,
+101314,
+101314,
+101356,
+101366,
+101366,
+101366,
+101374,
+101382,
+101389,
+101408,
+101408,
+101426,
+101426,
+101443,
+101443,
+101459,
+101459,
+101459,
+101459,
+101476,
+101476,
+101504,
+101504,
+101504,
+101529,
+101567,
+101591,
+101638,
+101638,
+101645,
+101673,
+101711,
+101739,
+101787,
+101787,
+101787,
+101797,
+101814,
+101834,
+101834,
+101834,
+101899,
+101907,
+101914,
+101914,
+101914,
+101936,
+101948,
+101948,
+101948,
+101987,
+101987,
+101987,
+101997,
+102027,
+102027,
+102034,
+102034,
+102042,
+102053,
+102068,
+102086,
+102091,
+102099,
+102099,
+102125,
+102138,
+102151,
+102151,
+102151,
+102160,
+102199,
+102199,
+102199,
+102199,
+102216,
+102216,
+102233,
+102255,
+102268,
+102286,
+102302,
+102323,
+102332,
+102339,
+102351,
+102351,
+102351,
+102356,
+102395,
+102395,
+102430,
+102447,
+102447,
+102447,
+102457,
+102457,
+102457,
+102493,
+102493,
+102493,
+102493,
+102502,
+102536,
+102543,
+102543,
+102543,
+102543,
+102566,
+102596,
+102596,
+102625,
+102654,
+102660,
+102678,
+102678,
+102678,
+102678,
+102701,
+102701,
+102701,
+102717,
+102717,
+102723,
+102734,
+102734,
+102750,
+102766,
+102766,
+102766,
+102801,
+102807,
+102807,
+102833,
+102849,
+102849,
+102868,
+102868,
+102881,
+102887,
+102904,
+102924,
+102924,
+102980,
+102980,
+103013,
+103073,
+103073,
+103079,
+103079,
+103085,
+103115,
+103115,
+103115,
+103128,
+103128,
+103128,
+103143,
+103206,
+103231,
+103241,
+103263,
+103263,
+103271,
+103271,
+103309,
+103350,
+103350,
+103379,
+103398,
+103406,
+103425,
+103425,
+103459,
+103468,
+103491,
+103491,
+103491,
+103508,
+103525,
+103525,
+103536,
+103536,
+103536,
+103550,
+103550,
+103573,
+103578,
+103578,
+103578,
+103591,
+103601,
+103612,
+103612,
+103630,
+103630,
+103630,
+103630,
+103659,
+103659,
+103666,
+103684,
+103696,
+103696,
+103719,
+103763,
+103778,
+103778,
+103778,
+103778,
+103834,
+103834,
+103841,
+103868,
+103868
+};
+
+static const char *tldData[] = {
+"sakurai.nara.jp\0"
+"filegear.me\0"
+"maibara.shiga.jp\0"
+"consultant.aero\0mykolaiv.ua\0visa\0"
+"usarts.museum\0servebeer.com\0"
+"eniwa.hokkaido.jp\0abb\0"
+"abc\0s3.dualstack.eu-west-3.amazonaws.com\0"
+"ichinomiya.aichi.jp\0lawyer\0za.bz\0"
+"beardu.no\0fl\xc3\xa5.no\0"
+"nishi.fukuoka.jp\0"
+"sanagochi.tokushima.jp\0"
+"genova.it\0"
+"pescara.it\0"
+"naustdal.no\0co.place\0"
+"aurland.no\0vipsinaapp.com\0"
+"samsclub\0"
+"from-ms.com\0from-nc.com\0i234.me\0"
+"moto\0origins\0"
+"1337.pictures\0"
+"iyo.ehime.jp\0"
+"ddnsking.com\0"
+"*.cns.joyent.com\0"
+"veterinaire.fr\0"
+"circus.museum\0aco\0"
+"monza-brianza.it\0koganei.tokyo.jp\0"
+"taranto.it\0chitose.hokkaido.jp\0hara.nagano.jp\0"
+"yao.osaka.jp\0"
+"*.bd\0"
+"act.au\0meland.no\0\xec\x82\xbc\xec\x84\xb1\0\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91\0"
+"educator.aero\0"
+"yahiko.niigata.jp\0"
+"viva\0"
+"kawagoe.mie.jp\0"
+"ads\0"
+"veneto.it\0"
+"aeg\0"
+"static.observableusercontent.com\0"
+"\xe3\x82\xb3\xe3\x83\xa0\0"
+"grp.lk\0austin.museum\0karasjohka.no\0sc.ug\0barsy.online\0"
+"hachioji.tokyo.jp\0xerox\0"
+"luster.no\0tinn.no\0vivo\0"
+"sc.tz\0"
+"*.ck\0m\xc3\xa1latvuopmi.no\0cisco\0app.os.fedoraproject.org\0"
+"myjino.ru\0"
+"community\0"
+"sc.us\0"
+"\xe0\xb8\x84\xe0\xb8\xad\xe0\xb8\xa1\0"
+"weather\0"
+"science\0"
+"fukuroi.shizuoka.jp\0afl\0"
+"suedtirol.it\0"
+"blogsite.org\0"
+"kuromatsunai.hokkaido.jp\0of.fashion\0"
+"mo.cn\0zentsuji.kagawa.jp\0usa.oita.jp\0"
+"frana.no\0\xd5\xb0\xd5\xa1\xd5\xb5\0"
+"mormon\0"
+"sch.zm\0office\0"
+"krodsherad.no\0snillfjord.no\0"
+"kamishihoro.hokkaido.jp\0oji.nara.jp\0"
+"asso.re\0"
+"kaita.hiroshima.jp\0"
+"akita.akita.jp\0"
+"mt.eu.org\0loginto.me\0"
+"*.er\0"
+"m\xc3\xa5s\xc3\xb8y.no\0"
+"trentin-s\xc3\xbc""dtirol.it\0flickr\0"
+"o.bg\0eigersund.no\0"
+"research.aero\0b.se\0fhsk.se\0"
+"hachirogata.akita.jp\0keisen.fukuoka.jp\0marriott\0reit\0"
+"*.fk\0cc.or.us\0dyndns-office.com\0"
+"saskatchewan.museum\0uzhgorod.ua\0investments\0"
+"kanegasaki.iwate.jp\0"
+"aig\0trycloudflare.com\0"
+"bugatti\0cupcake.is\0"
+"ngrok.io\0"
+"int.eu.org\0securitytactics.com\0"
+"arte.bo\0"
+"ogi.saga.jp\0"
+"s\xc3\xa1lat.no\0"
+"ginowan.okinawa.jp\0citadel\0"
+"usercontent.jp\0"
+"hob\xc3\xb8l.no\0hermes\0"
+"kitaura.miyazaki.jp\0"
+"to.gov.br\0"
+"lucca.it\0shintoku.hokkaido.jp\0"
+"pccw\0"
+"\xeb\x8b\xb7\xec\xbb\xb4\0now-dns.net\0"
+"ga.us\0"
+"am.br\0sp.it\0"
+"raholt.no\0"
+"is-an-entertainer.com\0"
+"asso.nc\0natura\0"
+"monzaedellabrianza.it\0"
+"from-in.com\0"
+"ci.it\0"
+"shitara.aichi.jp\0saigawa.fukuoka.jp\0"
+"fastly-terrarium.com\0"
+"hashima.gifu.jp\0maniwa.okayama.jp\0"
+"*.on-k3s.io\0"
+"george\0"
+"ninohe.iwate.jp\0"
+"sejny.pl\0"
+"walter\0"
+"oslo.no\0bygland.no\0"
+"*.jm\0badajoz.museum\0lanxess\0"
+"cleverapps.io\0"
+"gift\0"
+"zone\0"
+"roma.it\0"
+"mo.it\0"
+"barsy.bg\0dnsupdate.info\0"
+"*.kh\0"
+"toyosato.shiga.jp\0rent\0"
+"nyny.museum\0is-a-musician.com\0"
+"ntr.br\0aso.kumamoto.jp\0kouhoku.saga.jp\0"
+"preservation.museum\0"
+"akashi.hyogo.jp\0"
+"barsy.ca\0"
+"fastpanel.direct\0"
+"utazas.hu\0"
+"helsinki\0"
+"is-a-chef.net\0"
+"myphotos.cc\0barsy.de\0"
+"kizu.kyoto.jp\0anz\0"
+"aol\0"
+"ostrowiec.pl\0"
+"*.mm\0"
+"rishirifuji.hokkaido.jp\0utazu.kagawa.jp\0"
+"omi.niigata.jp\0khplay.nl\0"
+"\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0"
+"aarp\0"
+"quebec.museum\0"
+"cloudycluster.net\0"
+"s\xc3\xa1l\xc3\xa1t.no\0\xe7\xb5\x84\xe7\xb9\x94.\xe9\xa6\x99\xe6\xb8\xaf\0"
+"market\0"
+"ltd.cy\0"
+"ueno.gunma.jp\0app\0"
+"gallery.museum\0yachts\0"
+"*.np\0"
+"asso.km\0"
+"dyn-o-saur.com\0"
+"oguchi.aichi.jp\0"
+"barsy.eu\0"
+"cc.gu.us\0website\0"
+"otaki.nagano.jp\0"
+"karacol.su\0"
+"ontario.museum\0"
+"hanamaki.iwate.jp\0"
+"\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x90\xe0\xb8\x9a\xe0\xb8\xb2\xe0\xb8\xa5.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0bar\0"
+"commune.am\0bbc\0north-kazakhstan.su\0"
+"my.eu.org\0oya.to\0"
+"finnoy.no\0"
+"surgery\0"
+"asso.mc\0*.pg\0"
+"morotsuka.miyazaki.jp\0uzs.gov.pl\0"
+"aoki.nagano.jp\0rest\0"
+"pila.pl\0"
+"sunndal.no\0"
+"ok.us\0"
+"kimino.wakayama.jp\0art\0bbt\0"
+"dev-myqnapcloud.com\0"
+"fortal.br\0miyashiro.saitama.jp\0"
+"bcg\0"
+"forex\0"
+"zappos\0"
+"mantova.it\0yasaka.nagano.jp\0"
+"bcn\0"
+"ltd.gi\0unj\xc3\xa1rga.no\0"
+"lc.it\0iwata.shizuoka.jp\0"
+"\xc3\xa1lt\xc3\xa1.no\0melhus.no\0vagsoy.no\0"
+"discount\0"
+"taira.toyama.jp\0"
+"dedyn.io\0"
+"omaezaki.shizuoka.jp\0"
+"latrobe\0"
+"navigation.aero\0web.bo\0vgs.no\0homeunix.org\0"
+"adult.ht\0ogata.akita.jp\0"
+"ltd.hk\0"
+"barsy.in\0"
+"barsy.io\0"
+"bytom.pl\0"
+"*.elb.amazonaws.com\0"
+"7.bg\0monticello.museum\0vefsn.no\0"
+"perspecta.cloud\0"
+"web.co\0verdal.no\0"
+"vi.it\0tsuiki.fukuoka.jp\0"
+"sango.nara.jp\0"
+"author.aero\0"
+"dyndns-free.com\0"
+"ichikawa.hyogo.jp\0nakanoto.ishikawa.jp\0"
+"monza-e-della-brianza.it\0bet\0"
+"tm.cy\0"
+"knx-server.net\0"
+"web.do\0"
+"desa.id\0ma.leg.br\0"
+"shinjo.nara.jp\0"
+"sandcats.io\0"
+"olbia-tempio.it\0hamatama.saga.jp\0"
+"higashiyodogawa.osaka.jp\0"
+"\xe5\x81\xa5\xe5\xba\xb7\0"
+"nl.ca\0app.banzaicloud.io\0"
+"plaza.museum\0divttasvuotna.no\0za.com\0"
+"gmail\0"
+"homesecuritymac.com\0"
+"furniture.museum\0tiaa\0daplie.me\0shacknet.nu\0"
+"minamata.kumamoto.jp\0yokoze.saitama.jp\0"
+"camera\0"
+"passenger-association.aero\0axa\0property\0"
+"wakayama.jp\0\xe5\x9f\xbc\xe7\x8e\x89.jp\0"
+"\xc3\xa1k\xc5\x8boluokta.no\0aws\0"
+"oseto.nagasaki.jp\0"
+"vaksdal.no\0nl.eu.org\0"
+"*.ocs.customer-oci.com\0"
+"k12.oh.us\0"
+"rebun.hokkaido.jp\0"
+"volda.no\0"
+"tm.fr\0gov.nc.tr\0"
+"ltd.lk\0shopitsite.com\0"
+"temp-dns.com\0"
+"\xe5\xba\x83\xe5\xb3\xb6.jp\0bid\0"
+"lib.ri.us\0schule\0"
+"cruise\0"
+"!city.kawasaki.jp\0"
+"cyber.museum\0o.se\0mo.us\0troitsk.su\0"
+"forli-cesena.it\0"
+"skedsmokorset.no\0"
+"web.gu\0able\0bio\0"
+"yabu.hyogo.jp\0tanabe.kyoto.jp\0"
+"drud.io\0members.linode.com\0"
+"hk.cn\0"
+"sa.au\0"
+"gsm.pl\0"
+"homeoffice.gov.uk\0"
+"biz\0\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\0"
+"ascolipiceno.it\0"
+"michigan.museum\0ltd.ng\0"
+"web.id\0"
+"bifuka.hokkaido.jp\0"
+"tm.hu\0"
+"nara.nara.jp\0"
+"citic\0"
+"val-daosta.it\0"
+"lyngdal.no\0sor-varanger.no\0trana.no\0tynset.no\0""001www.com\0"
+"tamamura.gunma.jp\0"
+"*.dweb.link\0"
+"toride.ibaraki.jp\0nagawa.nagano.jp\0"
+"*.ye\0"
+"kawaminami.miyazaki.jp\0"
+"name\0us-west-2.elasticbeanstalk.com\0"
+"mincom.tn\0"
+"myasustor.com\0*.ocp.customer-oci.com\0"
+"yazu.tottori.jp\0"
+"endofinternet.org\0"
+"sa.cr\0cesena-forli.it\0nakagawa.hokkaido.jp\0hannan.osaka.jp\0"
+"reggio-emilia.it\0poker\0"
+"k12.sc.us\0"
+"bolivia.bo\0"
+"bj.cn\0higashi.okinawa.jp\0hyatt\0"
+"glug.org.uk\0"
+"eu.org\0"
+"is-not-certified.com\0"
+"hashbang.sh\0"
+"museet.museum\0chase\0"
+"tours\0"
+"degree\0"
+"tm.km\0eng.pro\0"
+"ota.gunma.jp\0in.net\0"
+"kyuragi.saga.jp\0"
+"style\0"
+"sakata.yamagata.jp\0"
+"nationalheritage.museum\0bms\0"
+"joetsu.niigata.jp\0"
+"web.lk\0ng.eu.org\0"
+"nakama.fukuoka.jp\0"
+"bmw\0"
+"altoadige.it\0"
+"zakopane.pl\0"
+"ks.ua\0"
+"tm.mc\0k12.md.us\0"
+"broadway\0"
+"kamisunagawa.hokkaido.jp\0"
+"tm.mg\0"
+"\xd9\x85\xd9\x88\xd8\xb1\xd9\x8a\xd8\xaa\xd8\xa7\xd9\x86\xd9\x8a\xd8\xa7\0"
+"hyllestad.no\0"
+"ibigawa.gifu.jp\0misato.miyagi.jp\0"
+"kids.museum\0resindevice.io\0"
+"semine.miyagi.jp\0pinb.gov.pl\0"
+"stjordalshalsen.no\0bom\0is-a-blogger.com\0"
+"snasa.no\0ks.us\0boo\0"
+"yuu.yamaguchi.jp\0web.nf\0"
+"\xc3\xa5""fjord.no\0"
+"web.ni\0africa\0"
+"bot\0vistaprint\0"
+"reklam.hu\0"
+"df.gov.br\0church\0"
+"hanggliding.aero\0"
+"koga.fukuoka.jp\0nanbu.tottori.jp\0box\0"
+"nakano.nagano.jp\0"
+"tm.no\0"
+"nogi.tochigi.jp\0"
+"ox.rs\0"
+"obanazawa.yamagata.jp\0"
+"contemporaryart.museum\0"
+"chikuma.nagano.jp\0cab\0"
+"diskussionsbereich.de\0"
+"brindisi.it\0"
+"\xe5\x80\x8b\xe4\xba\xba.hk\0"
+"bharti\0forsale\0ltd.ua\0"
+"\xe5\xa4\xa7\xe9\x98\xaa.jp\0toba.mie.jp\0virgin\0"
+"vi.us\0"
+"fantasyleague.cc\0"
+"cal\0"
+"tecnologia.bo\0drammen.no\0cam\0"
+"avocat.fr\0"
+"natural.bo\0ltd.uk\0cba\0"
+"udono.mie.jp\0car\0"
+"cat\0imdb\0"
+"web.pk\0"
+"sa.it\0ojiya.niigata.jp\0"
+"tm.pl\0mazowsze.pl\0republican\0"
+"vaga.no\0"
+"cbn\0"
+"firmdale\0forum\0"
+"oki.fukuoka.jp\0"
+"nl.no\0"
+"\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0limited\0"
+"cbs\0ferrari\0hs.zone\0"
+"itoigawa.niigata.jp\0"
+"friulivegiulia.it\0"
+"from-mn.com\0"
+"oita.oita.jp\0"
+"firewall-gateway.de\0"
+"futsu.nagasaki.jp\0"
+"v\xc3\xa5g\xc3\xa5.no\0"
+"unjarga.no\0"
+"nt.edu.au\0"
+"sumoto.kumamoto.jp\0chino.nagano.jp\0"
+"pagespeedmobilizer.com\0"
+"feste-ip.net\0"
+"press.aero\0"
+"meldal.no\0"
+"tm.ro\0"
+"grainger\0"
+"cc.ca.us\0"
+"\xe9\x9d\x99\xe5\xb2\xa1.jp\0"
+"firewall-gateway.com\0"
+"cesena-forl\xc3\xac.it\0"
+"tm.se\0"
+"ceb\0"
+"suzu.ishikawa.jp\0shizuoka.shizuoka.jp\0yoshida.shizuoka.jp\0"
+"sport.hu\0"
+"showa.gunma.jp\0tomakomai.hokkaido.jp\0rybnik.pl\0myeffect.net\0"
+"flakstad.no\0"
+"akaiwa.okayama.jp\0wajiki.tokushima.jp\0"
+"malatvuopmi.no\0ceo\0navy\0s3.ap-northeast-2.amazonaws.com\0"
+"\xd0\xb1\xd0\xb3\0cfa\0"
+"minamioguni.kumamoto.jp\0"
+"vega.no\0"
+"web.tj\0cfd\0"
+"kunstunddesign.museum\0"
+"pistoia.it\0vv.it\0"
+"pueblo.bo\0"
+"buy\0drud.us\0"
+"messina.it\0"
+"public.museum\0r\xc3\xb8ros.no\0"
+"web.tr\0"
+"satte.saitama.jp\0"
+"minami.fukuoka.jp\0teshikaga.hokkaido.jp\0"
+"careers\0"
+"namsos.no\0ringebu.no\0"
+"goto.nagasaki.jp\0pulawy.pl\0"
+"cv.ua\0arkhangelsk.su\0"
+"deals\0definima.io\0"
+"shika.ishikawa.jp\0gushikami.okinawa.jp\0oguni.yamagata.jp\0"
+"web.ve\0tips\0"
+"cn-north-1.eb.amazonaws.com.cn\0"
+"sande.vestfold.no\0"
+"communication.museum\0"
+"boleslawiec.pl\0"
+"decorativearts.museum\0"
+"cern\0""2ix.at\0"
+"pu.it\0"
+"trust.museum\0s3-us-west-2.amazonaws.com\0"
+"clinic\0"
+"biz.bb\0"
+"gs.va.no\0is-slick.com\0"
+"qsl.br\0biz.at\0"
+"honbetsu.hokkaido.jp\0zachpomor.pl\0"
+"biz.az\0"
+"katsuragi.nara.jp\0"
+"flora.no\0"
+"2ix.ch\0"
+"aero.tt\0"
+"bilbao.museum\0levanger.no\0"
+"naruto.tokushima.jp\0bzh\0"
+"parti.se\0gratis\0"
+"2ix.de\0"
+"kushima.miyazaki.jp\0t3l3p0rt.net\0"
+"stateofdelaware.museum\0lib.as.us\0"
+"tananger.no\0"
+"aero.mv\0"
+"boxfuse.io\0"
+"palermo.it\0"
+"meraker.no\0"
+"biz.cy\0"
+"creditcard\0"
+"web.za\0\xe9\xa6\x99\xe6\xa0\xbc\xe9\x87\x8c\xe6\x8b\x89\0biz.dk\0co.technology\0"
+"\xd0\xb5\xd1\x8e\0"
+"air.museum\0krager\xc3\xb8.no\0skedsmo.no\0tm.za\0"
+"ichiba.tokushima.jp\0"
+"immo\0"
+"baths.museum\0virtuel.museum\0"
+"andria-trani-barletta.it\0shiroishi.miyagi.jp\0arita.saga.jp\0"
+"from-oh.com\0"
+"tokke.no\0"
+"sn.cn\0\xe5\xaf\x8c\xe5\xb1\xb1.jp\0"
+"is-found.org\0"
+"valled-aosta.it\0fbxos.fr\0"
+"pasadena.museum\0is-an-actor.com\0"
+"mielec.pl\0"
+"biz.et\0"
+"tawaramoto.nara.jp\0starostwo.gov.pl\0"
+"fjell.no\0"
+"kimitsu.chiba.jp\0fashion\0"
+"biz.fj\0"
+"comunica\xc3\xa7\xc3\xb5""es.museum\0"
+"lomza.pl\0"
+"*.alces.network\0ap-northeast-3.elasticbeanstalk.com\0webspace.rocks\0"
+"komono.mie.jp\0hiraya.nagano.jp\0"
+"k12.ca.us\0"
+"kv\xc3\xa6nangen.no\0"
+"donetsk.ua\0cc.va.us\0"
+"frankfurt.museum\0"
+"kotohira.kagawa.jp\0"
+"openair.museum\0"
+"biz.gl\0"
+"adac\0togliatti.su\0"
+"schoenbrunn.museum\0tree.museum\0"
+"friuliveneziagiulia.it\0kurotaki.nara.jp\0beep.pl\0"
+"az.us\0university\0"
+"dontexist.net\0"
+"software.aero\0dattoweb.com\0now-dns.org\0"
+"edunet.tn\0"
+"filegear-gb.me\0"
+"sakuragawa.ibaraki.jp\0"
+"in-addr.arpa\0com\0"
+"eti.br\0"
+"chiba.jp\0tanagura.fukushima.jp\0"
+"cpa\0juegos\0"
+"pagefrontapp.com\0hk.org\0"
+"biz.id\0"
+"rj.gov.br\0yamada.toyama.jp\0"
+"m.bg\0"
+"\xc3\xb8ystre-slidre.no\0"
+"naval.museum\0"
+"hofu.yamaguchi.jp\0dad\0"
+"viking.museum\0\xd0\xbe\xd0\xb1\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0"
+"sarufutsu.hokkaido.jp\0buzz\0"
+"hirata.fukushima.jp\0czeladz.pl\0"
+"stj\xc3\xb8rdalshalsen.no\0askoy.no\0cbg.ru\0"
+"is-a-bookkeeper.com\0"
+"leg.br\0"
+"\xc3\xb8ksnes.no\0loans\0"
+"ito.shizuoka.jp\0"
+"khmelnitskiy.ua\0"
+"ikeda.hokkaido.jp\0"
+"r\xc3\xa5holt.no\0tvedestrand.no\0"
+"hidaka.wakayama.jp\0"
+"biz.ki\0day\0fujitsu\0"
+"mg.leg.br\0"
+"handa.aichi.jp\0"
+"fishing\0from-ri.com\0"
+"ibaraki.ibaraki.jp\0intl.tn\0"
+"tydal.no\0s3.dualstack.ap-southeast-1.amazonaws.com\0barsyonline.co.uk\0"
+"\xe4\xb8\xaa\xe4\xba\xba.hk\0dr\xc3\xb8""bak.no\0"
+"crs\0csc\0obninsk.su\0"
+"tachikawa.tokyo.jp\0\xe0\xb8\x98\xe0\xb8\xb8\xe0\xb8\xa3\xe0\xb8\x81\xe0\xb8\xb4\xe0\xb8\x88.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
+"lorenskog.no\0"
+"hayakawa.yamanashi.jp\0"
+"luxembourg.museum\0holtalen.no\0\xd9\x83\xd8\xa7\xd8\xab\xd9\x88\xd9\x84\xd9\x8a\xd9\x83\0"
+"fukaya.saitama.jp\0"
+"missoula.museum\0vardo.no\0kpmg\0"
+"trentino-suedtirol.it\0siteleaf.net\0"
+"police.uk\0"
+"ribeirao.br\0"
+"biz.ls\0"
+"nakatsugawa.gifu.jp\0"
+"dsmynas.com\0"
+"izumo.shimane.jp\0"
+"kl\xc3\xa6""bu.no\0"
+"\xe0\xb2\xad\xe0\xb2\xbe\xe0\xb2\xb0\xe0\xb2\xa4\0"
+"takata.fukuoka.jp\0"
+"\xe0\xac\xad\xe0\xac\xbe\xe0\xac\xb0\xe0\xac\xa4\0"
+"macys\0"
+"info\0kvinnherad.no\0barsy.mobi\0"
+"\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa6\xa4\0"
+"dds\0"
+"biz.mv\0"
+"biz.mw\0"
+"santoandre.br\0"
+"biz.ni\0vagan.no\0jdevcloud.com\0"
+"asahikawa.hokkaido.jp\0"
+"giehtavuoatna.no\0"
+"southcarolina.museum\0"
+"trentinoaadige.it\0dealer\0"
+"minami.tokushima.jp\0"
+"k12.ks.us\0bargains\0"
+"biz.nr\0\xd1\x80\xd1\x84\0"
+"ddnsgeek.com\0"
+"dev\0"
+"dagestan.ru\0"
+"tobishima.aichi.jp\0"
+"fuso.aichi.jp\0"
+"sinaapp.com\0"
+"kurashiki.okayama.jp\0"
+"groundhandling.aero\0bo.nordland.no\0"
+"cloudaccess.host\0"
+"beauxarts.museum\0sandnessjoen.no\0cc.mt.us\0cc.nd.us\0"
+"oyamazaki.kyoto.jp\0szczecin.pl\0"
+"dagestan.su\0"
+"kawai.nara.jp\0okutama.tokyo.jp\0"
+"mandal.no\0"
+"no-ip.biz\0"
+"tingvoll.no\0biz.pk\0k12.va.us\0"
+"kikonai.hokkaido.jp\0biz.pl\0"
+"nature.museum\0myqnapcloud.com\0"
+"casacam.net\0"
+"fuel.aero\0"
+"kasamatsu.gifu.jp\0fujimi.saitama.jp\0biz.pr\0\xe5\xb9\xbf\xe4\xb8\x9c\0"
+"fortworth.museum\0"
+"hitachi\0cloud.goog\0hzc.io\0"
+"motosu.gifu.jp\0"
+"sauherad.no\0"
+"wassamu.hokkaido.jp\0dhl\0"
+"lab.ms\0"
+"muroto.kochi.jp\0"
+"metlife\0"
+"shimabara.nagasaki.jp\0"
+"loginline.site\0"
+"shimamoto.osaka.jp\0"
+"\xe5\x95\x86\xe5\x9f\x8e\0"
+"hirado.nagasaki.jp\0"
+"eisenbahn.museum\0bplaced.de\0qualifioapp.com\0"
+"maison\0"
+"kamoenai.hokkaido.jp\0miyoshi.tokushima.jp\0crown\0weber\0"
+"lom.it\0"
+"diy\0"
+"golffan.us\0"
+"ws.na\0"
+"h\xc3\xb8ylandet.no\0ny.us\0\xe5\x9c\xa8\xe7\xba\xbf\0"
+"biz.ss\0cc.ri.us\0"
+"biz.tj\0"
+"guam.gu\0"
+"ustka.pl\0quest\0"
+"cc.ar.us\0"
+"plc.co.im\0civilization.museum\0biz.ua\0"
+"biz.tr\0"
+"on-aptible.com\0"
+"biz.tt\0barsy.support\0"
+"b\xc3\xa1id\xc3\xa1r.no\0s3-website.eu-west-2.amazonaws.com\0"
+"tamayu.shimane.jp\0"
+"is-by.us\0"
+"yamato.fukushima.jp\0"
+"tas.gov.au\0"
+"shiraoka.saitama.jp\0"
+"movie\0"
+"omotego.fukushima.jp\0\xe5\xa8\xb1\xe4\xb9\x90\0"
+"5.bg\0bible\0"
+"kui.hiroshima.jp\0"
+"issmarterthanyou.com\0"
+"romsa.no\0"
+"chikuho.fukuoka.jp\0"
+"sa.gov.au\0"
+"nagahama.shiga.jp\0"
+"click\0"
+"otaki.saitama.jp\0biz.vn\0"
+"tsukui.kanagawa.jp\0"
+"flesberg.no\0nesseby.no\0"
+"notogawa.shiga.jp\0"
+"usr.cloud.muni.cz\0"
+"yamaga.kumamoto.jp\0wakuya.miyagi.jp\0"
+"national.museum\0kongsvinger.no\0merseine.nu\0"
+"dnp\0cistron.nl\0"
+"accesscam.org\0"
+"otsuki.kochi.jp\0"
+"lom.no\0komforb.se\0"
+"kitakami.iwate.jp\0"
+"dog\0"
+"r\xc3\xb8yrvik.no\0lib.ga.us\0"
+"aikawa.kanagawa.jp\0"
+"kamo.niigata.jp\0"
+"waw.pl\0"
+"goldpoint\0"
+"dot\0"
+"gs.tr.no\0"
+"trentino-s-tirol.it\0"
+"agents.aero\0k12.nv.us\0"
+"rr.gov.br\0"
+"my-vigor.de\0"
+"hisamitsu\0"
+"yahaba.iwate.jp\0"
+"la-spezia.it\0oristano.it\0"
+"s3.amazonaws.com\0"
+"slz.br\0"
+"z.bg\0brasil.museum\0"
+"sasayama.hyogo.jp\0"
+"m.se\0"
+"fukuchi.fukuoka.jp\0uchinomi.kagawa.jp\0"
+"oshima.yamaguchi.jp\0immobilien\0"
+"biz.zm\0"
+"skien.no\0"
+"rich\0"
+"hi.cn\0anpachi.gifu.jp\0ketrzyn.pl\0eat\0"
+"berlin.museum\0jolster.no\0"
+"dyroy.no\0"
+"rs.gov.br\0sc.gov.br\0tajiri.osaka.jp\0arai.shizuoka.jp\0\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\0"
+"flor\xc3\xb8.no\0"
+"norddal.no\0"
+"ternopil.ua\0"
+"castres.museum\0symantec\0barsy.info\0"
+"loppa.no\0cherkasy.ua\0"
+"oto.fukuoka.jp\0hotmail\0"
+"neustar\0scrapper-site.net\0"
+"qc.com\0"
+"furudono.fukushima.jp\0"
+"eco\0"
+"stargard.pl\0"
+"etne.no\0"
+"crotone.it\0reggio-calabria.it\0epson\0"
+"smart\0"
+"sorreisa.no\0"
+"cng.br\0ashikaga.tochigi.jp\0land\0"
+"ct.it\0manno.kagawa.jp\0"
+"defense.tn\0"
+"prato.it\0"
+"juedisches.museum\0lib.ut.us\0is-a-teacher.com\0"
+"kasugai.aichi.jp\0onion\0"
+"edu\0"
+"valle-d-aosta.it\0dtv\0"
+"wallonie.museum\0"
+"gwangju.kr\0"
+"artsandcrafts.museum\0vossevangen.no\0"
+"chintai\0photos\0"
+"rokunohe.aomori.jp\0shimogo.fukushima.jp\0"
+"cloudcontrolapp.com\0"
+"touch.museum\0"
+"time.museum\0"
+"tokuyama.yamaguchi.jp\0"
+"ak.us\0"
+"ln.cn\0"
+"ba.gov.br\0azumino.nagano.jp\0koza.wakayama.jp\0"
+"egyptian.museum\0"
+"hachinohe.aomori.jp\0final\0"
+"katsushika.tokyo.jp\0"
+"jogasz.hu\0gs.sf.no\0"
+"konan.aichi.jp\0"
+"kimobetsu.hokkaido.jp\0jelenia-gora.pl\0"
+"\xc3\xa5seral.no\0"
+"dvr\0"
+"dali.museum\0"
+"wpdevcloud.com\0"
+"health\0"
+"hiranai.aomori.jp\0"
+"sula.no\0la.us\0"
+"fm.br\0"
+"chat\0"
+"nesodden.no\0"
+"toyama.toyama.jp\0"
+"lexus\0is-uberleet.com\0"
+"botany.museum\0fastvps-server.com\0"
+"rn.gov.br\0gmbh\0"
+"bjarkoy.no\0skjervoy.no\0"
+"belau.pw\0"
+"nagano.nagano.jp\0serveblog.net\0"
+"busan.kr\0"
+"hapmir.no\0from-vt.com\0"
+"qc.ca\0"
+"trentino.it\0"
+"scjohnson\0"
+"ro.im\0"
+"balsfjord.no\0nes.akershus.no\0github.io\0"
+"kanra.gunma.jp\0"
+"lavagis.no\0"
+"missile.museum\0"
+"ro.it\0"
+"ro.gov.br\0miura.kanagawa.jp\0osaki.miyagi.jp\0"
+"copenhagen.museum\0"
+"does-it.net\0"
+"karasjok.no\0"
+"mimata.miyazaki.jp\0"
+"numata.gunma.jp\0"
+"j\xc3\xb8lster.no\0"
+"masoy.no\0"
+"global.prod.fastly.net\0*.ex.ortsinfo.at\0"
+"baidar.no\0sortland.no\0azure\0"
+"kred\0"
+"farm.museum\0"
+"cheap\0"
+"watches\0"
+"ogasawara.tokyo.jp\0"
+"nctu.me\0"
+"midori.gunma.jp\0"
+"tr.eu.org\0*.r.appspot.com\0"
+"from-sd.com\0"
+"samukawa.kanagawa.jp\0iwafune.tochigi.jp\0"
+"lug.org.uk\0"
+"himi.toyama.jp\0"
+"unicom\0"
+"nozawaonsen.nagano.jp\0"
+"snaase.no\0"
+"kamisu.ibaraki.jp\0\xe5\x98\x89\xe9\x87\x8c\0"
+"sand\xc3\xb8y.no\0"
+"fujioka.gunma.jp\0"
+"takko.aomori.jp\0"
+"north.museum\0"
+"ikusaka.nagano.jp\0yoshinogari.saga.jp\0"
+"*.dev.adobeaemcloud.com\0"
+"higashi.fukushima.jp\0"
+"lardal.no\0s3.dualstack.eu-central-1.amazonaws.com\0"
+"belem.br\0"
+"servegame.com\0"
+"uni5.net\0"
+"noda.chiba.jp\0"
+"lib.ms.us\0lib.nc.us\0"
+"countryestate.museum\0navuotna.no\0diamonds\0"
+"vt.it\0"
+"klabu.no\0r\xc3\xb8""d\xc3\xb8y.no\0cc.me.us\0"
+"am.gov.br\0"
+"edeka\0"
+"ong.br\0"
+"og.ao\0tula.su\0arvo.network\0"
+"aquila.it\0\xe5\x8f\xb0\xe6\xb9\xbe\0"
+"m\xc3\xa1tta-v\xc3\xa1rjjat.no\0"
+"\xd8\xa7\xd8\xaa\xd8\xb5\xd8\xa7\xd9\x84\xd8\xa7\xd8\xaa\0"
+"whoswho\0"
+"fm.it\0"
+"gos.pk\0africa.com\0"
+"makinohara.shizuoka.jp\0"
+"verbania.it\0"
+"futtsu.chiba.jp\0aid.pl\0"
+"sor-fron.no\0"
+"aostavalley.it\0earth\0"
+"amot.no\0"
+"sukagawa.fukushima.jp\0tone.ibaraki.jp\0kami.miyagi.jp\0"
+"london\0"
+"aero\0flatanger.no\0ct.us\0softbank\0"
+"ravenna.it\0"
+"oksnes.no\0"
+"trentino-s\xc3\xbc""dtirol.it\0nango.fukushima.jp\0"
+"manchester.museum\0"
+"eid.no\0"
+"dell-ogliastra.it\0"
+"statefarm\0"
+"utwente.io\0"
+"2038.io\0"
+"psc.br\0fan\0custom.metacentrum.cz\0"
+"plumbing\0"
+"orsta.no\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd9\x87\0"
+"maizuru.kyoto.jp\0"
+"z.se\0nj.us\0"
+"funabashi.chiba.jp\0asago.hyogo.jp\0"
+"shoo.okayama.jp\0higashine.yamagata.jp\0turen.tn\0"
+"scrapping.cc\0"
+"notaires.km\0"
+"oguni.kumamoto.jp\0"
+"kawaba.gunma.jp\0higashikagawa.kagawa.jp\0kuokgroup\0"
+"hagebostad.no\0"
+"kitaaiki.nagano.jp\0"
+"raisa.no\0"
+"miki.hyogo.jp\0mitsue.nara.jp\0higashiomi.shiga.jp\0"
+"dontexist.org\0"
+"cloud.metacentrum.cz\0"
+"journalist.aero\0aknoluokta.no\0dating\0"
+"\xe6\xbe\xb3\xe9\x96\x80\0"
+"exhibition.museum\0fm.no\0"
+"harima.hyogo.jp\0"
+"leirvik.no\0"
+"sayama.saitama.jp\0gda.pl\0"
+"esq\0"
+"aizuwakamatsu.fukushima.jp\0ise.mie.jp\0schmidt\0"
+"sor-aurdal.no\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0"
+"federation.aero\0"
+"ap.gov.br\0miyazu.kyoto.jp\0"
+"hi.us\0"
+"wodzislaw.pl\0\xd8\xa7\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\0"
+"vallee-aoste.it\0"
+"fusa.no\0"
+"yoshimi.saitama.jp\0"
+"sdn.gov.pl\0"
+"siellak.no\0hamburg\0"
+"cnt.br\0"
+"nagai.yamagata.jp\0"
+"lerdal.no\0"
+"furukawa.miyagi.jp\0"
+"hakata.fukuoka.jp\0abbott\0"
+"pimienta.org\0"
+"\xe8\xb0\xb7\xe6\xad\x8c\0"
+"sciencesnaturelles.museum\0lib.wi.us\0"
+"esan.hokkaido.jp\0ap.gov.pl\0"
+"trysil.no\0airbus\0dattorelay.com\0"
+"eus\0"
+"tarumizu.kagoshima.jp\0"
+"sherbrooke.museum\0"
+"fastlylb.net\0"
+"b\xc3\xa1hccavuotna.no\0"
+"se.gov.br\0kumenan.okayama.jp\0mielno.pl\0ddns.net\0"
+"aca.pro\0"
+"r\xc3\xa1hkker\xc3\xa1vju.no\0"
+"andria-barletta-trani.it\0yasugi.shimane.jp\0"
+"og.it\0annaka.gunma.jp\0"
+"services.aero\0transport.museum\0training\0\xeb\x8b\xb7\xeb\x84\xb7\0"
+"alessandria.it\0fuji.shizuoka.jp\0"
+"stockholm\0"
+"store.nf\0"
+"k12.nm.us\0east-kazakhstan.su\0"
+"yamatsuri.fukushima.jp\0"
+"alstahaug.no\0"
+"landrover\0"
+"tires\0"
+"isernia.it\0kadena.okinawa.jp\0pup.gov.pl\0"
+"mus.br\0"
+"midatlantic.museum\0"
+"sciencecenters.museum\0"
+"yashio.saitama.jp\0playstation\0"
+"k.bg\0"
+"nakagawa.tokushima.jp\0"
+"chippubetsu.hokkaido.jp\0"
+"s3.ap-south-1.amazonaws.com\0"
+"rehab\0"
+"locus\0"
+"\xc3\xb8yer.no\0"
+"sos.pl\0"
+"from-ne.com\0"
+"shibukawa.gunma.jp\0"
+"jerusalem.museum\0"
+"gs.mr.no\0gjovik.no\0"
+"kiwa.mie.jp\0"
+"healthcare\0"
+"bsb.br\0miyada.nagano.jp\0wroc.pl\0"
+"\xe6\xbe\xb3\xe9\x97\xa8\0"
+"vt.us\0"
+"fit\0"
+"s3.dualstack.eu-west-1.amazonaws.com\0"
+"vevelstad.no\0"
+"caa.aero\0"
+"matsuda.kanagawa.jp\0"
+"medical.museum\0sa-east-1.elasticbeanstalk.com\0dnshome.de\0"
+"tanohata.iwate.jp\0"
+"latino\0"
+"yabuki.fukushima.jp\0museum.tt\0"
+"dnsupdater.de\0"
+"shikaoi.hokkaido.jp\0"
+"musica.ar\0chikusei.ibaraki.jp\0"
+"ngo.lk\0"
+"maryland.museum\0"
+"taketa.oita.jp\0"
+"trentin-suedtirol.it\0kahoku.ishikawa.jp\0hayashima.okayama.jp\0"
+"ce.it\0gotsu.shimane.jp\0nakano.tokyo.jp\0"
+"shingu.fukuoka.jp\0"
+"musica.bo\0"
+"lighting\0"
+"yamamoto.miyagi.jp\0sa.gov.pl\0"
+"iveco\0from-wv.com\0"
+"azurewebsites.net\0"
+"hdfcbank\0"
+"ide.kyoto.jp\0"
+"civilisation.museum\0ngo.ng\0pgfog.com\0"
+"takarazuka.hyogo.jp\0kita.osaka.jp\0"
+"leksvik.no\0"
+"inf.br\0"
+"fly\0"
+"nsupdate.info\0"
+"oizumi.gunma.jp\0"
+"2000.hu\0vik.no\0k12.ky.us\0"
+"historyofscience.museum\0"
+"kuriyama.hokkaido.jp\0higashimatsuyama.saitama.jp\0"
+"chocolate.museum\0uk.eu.org\0"
+"saijo.ehime.jp\0fujiyoshida.yamanashi.jp\0"
+"delivery\0"
+"miyoshi.saitama.jp\0"
+"gliding.aero\0koebenhavn.museum\0orland.no\0"
+"mashiki.kumamoto.jp\0"
+"inf.cu\0balena-devices.com\0test-iserv.de\0"
+"archaeological.museum\0"
+"buzen.fukuoka.jp\0saka.hiroshima.jp\0android\0"
+"ngo.ph\0"
+"ulm.museum\0mydobiss.com\0"
+"store.ve\0"
+"chikujo.fukuoka.jp\0miyake.nara.jp\0"
+"corsica\0"
+"s3.cn-north-1.amazonaws.com.cn\0"
+"tozsde.hu\0school.na\0holmestrand.no\0foo\0s3-website.us-east-2.amazonaws.com\0"
+"farmstead.museum\0jewelry\0"
+"vanylven.no\0"
+"museumvereniging.museum\0phoenix.museum\0bu.no\0"
+"nagasu.kumamoto.jp\0fox\0"
+"tx.us\0noip.us\0"
+"lviv.ua\0"
+"target\0"
+"g\xc3\xa1\xc5\x8bgaviika.no\0"
+"isahaya.nagasaki.jp\0"
+"fresenius\0reliance\0"
+"berlevag.no\0bjerkreim.no\0"
+"bolzano-altoadige.it\0"
+"froya.no\0"
+"inami.toyama.jp\0canon\0"
+"school.nz\0tirol\0"
+"tokai.aichi.jp\0"
+"frog.museum\0porsgrunn.no\0"
+"gal\0"
+"fitness\0is-a-linux-user.org\0"
+"\xe9\xab\x98\xe7\x9f\xa5.jp\0"
+"homeunix.com\0"
+"wroclaw.pl\0gap\0"
+"res.in\0fukagawa.hokkaido.jp\0"
+"certification.aero\0jorpeland.no\0game-host.org\0"
+"forl\xc3\xac-cesena.it\0okegawa.saitama.jp\0"
+"gay\0"
+"akishima.tokyo.jp\0frl\0"
+"muncie.museum\0evenassi.no\0vestby.no\0wellbeingzone.eu\0"
+"vix.br\0"
+"br.com\0"
+"zj.cn\0rnrt.tn\0"
+"isehara.kanagawa.jp\0takaharu.miyazaki.jp\0"
+"vote\0"
+"pilot.aero\0presidio.museum\0"
+"ashibetsu.hokkaido.jp\0kawakami.nara.jp\0"
+"\xc3\xa5krehamn.no\0"
+"jetzt\0"
+"ferrero\0"
+"tabuse.yamaguchi.jp\0"
+"wakayama.wakayama.jp\0"
+"voto\0"
+"museum.mv\0"
+"museum.mw\0store.ro\0meteorapp.com\0"
+"m\xc3\xa5lselv.no\0if.ua\0"
+"tainai.niigata.jp\0"
+"hanno.saitama.jp\0"
+"dreamhosters.com\0"
+"museum.no\0institute\0"
+"minamiboso.chiba.jp\0"
+"stokke.no\0"
+"gdn\0"
+"quebec\0"
+"gea\0"
+"ftr\0"
+"3.bg\0"
+"gotemba.shizuoka.jp\0warmia.pl\0"
+"heritage.museum\0"
+"ve.it\0store.st\0"
+"museum.om\0"
+"moroyama.saitama.jp\0kaneyama.yamagata.jp\0cloudns.biz\0"
+"s3.eu-west-2.amazonaws.com\0"
+"mat.br\0!city.sendai.jp\0"
+"fujimino.saitama.jp\0"
+"nordre-land.no\0"
+"adm.br\0fun\0"
+"en.it\0"
+"gb.com\0dyndns-work.com\0"
+"sande.m\xc3\xb8re-og-romsdal.no\0\xd0\xb1\xd0\xb5\xd0\xbb\0virtualserver.io\0"
+"news\0"
+"horokanai.hokkaido.jp\0"
+"shoes\0"
+"aridagawa.wakayama.jp\0"
+"praxi\0dh.bytemark.co.uk\0"
+"ybo.review\0"
+"\xc3\xb8rland.no\0"
+"panasonic\0gotdns.org\0"
+"noda.iwate.jp\0next\0"
+"ot.it\0pd.it\0"
+"trentino-sued-tirol.it\0iizuka.fukuoka.jp\0"
+"\xe5\x85\xab\xe5\x8d\xa6\0"
+"inf.mk\0moscow\0"
+"hekinan.aichi.jp\0yonabaru.okinawa.jp\0"
+"chernovtsy.ua\0mk.ua\0from-ia.com\0is-very-evil.org\0ilovecollege.info\0dyn53.io\0"
+"frosta.no\0"
+"kirovograd.ua\0"
+"oga.akita.jp\0\xe0\xb4\xad\xe0\xb4\xbe\xe0\xb4\xb0\xe0\xb4\xa4\xe0\xb4\x82\0\xe4\xba\x9a\xe9\xa9\xac\xe9\x80\x8a\0"
+"ngo.za\0"
+"uonuma.niigata.jp\0"
+"ac\0"
+"ad\0"
+"ae\0\xe7\xb5\x84\xe7\xbb\x87.hk\0drayddns.com\0"
+"af\0"
+"ag\0kvanangen.no\0"
+"ai\0x.bg\0"
+"k.se\0"
+"al\0nagasaki.jp\0"
+"am\0"
+"futurehosting.at\0"
+"ao\0namsskogan.no\0fyi\0"
+"obama.nagasaki.jp\0saiki.oita.jp\0"
+"emergency.aero\0aq\0ba\0"
+"ar\0bb\0"
+"as\0"
+"at\0higashiagatsuma.gunma.jp\0"
+"au\0be\0iraq.museum\0"
+"bf\0"
+"aw\0bg\0"
+"ax\0bh\0is.it\0"
+"bi\0"
+"az\0bj\0"
+"intelligence.museum\0citi\0online\0"
+"bm\0"
+"bn\0valleaosta.it\0tottori.tottori.jp\0"
+"bo\0santacruz.museum\0"
+"kaisei.kanagawa.jp\0itoman.okinawa.jp\0swatch\0"
+"ca\0pics\0diskstation.me\0"
+"br\0"
+"bs\0cc\0"
+"bt\0cd\0"
+"bv\0cf\0"
+"bw\0cg\0"
+"ch\0"
+"by\0ci\0stjordal.no\0"
+"bz\0matera.it\0"
+"lillehammer.no\0lund.no\0city\0"
+"cl\0"
+"cm\0"
+"cn\0"
+"co\0"
+"noip.me\0diskstation.eu\0"
+"cr\0sicilia.it\0balsan-s\xc3\xbc""dtirol.it\0"
+"bozen-s\xc3\xbc""dtirol.it\0"
+"cu\0de\0"
+"cv\0restaurant\0"
+"cw\0"
+"cx\0\xe7\xa7\x8b\xe7\x94\xb0.jp\0"
+"cy\0london.museum\0"
+"cz\0dj\0sic.it\0"
+"dk\0afamilycompany\0gle\0"
+"trd.br\0"
+"dm\0capitalone\0"
+"cr.it\0shiriuchi.hokkaido.jp\0nyc.mn\0yandexcloud.net\0"
+"do\0burghof.museum\0balestrand.no\0lancia\0de.com\0servesarcasm.com\0"
+"remotewd.com\0"
+"chikuhoku.nagano.jp\0"
+"ec\0dallas.museum\0"
+"ee\0"
+"prd.fr\0"
+"eg\0\xe5\x8f\xb0\xe7\x81\xa3\0"
+"bizen.okayama.jp\0servebbs.net\0"
+"lutsk.ua\0"
+"dz\0"
+"imageandsound.museum\0jessheim.no\0"
+"cloudera.site\0"
+"karlsoy.no\0barrell-of-knowledge.info\0"
+"email\0"
+"es\0fuoisku.no\0"
+"et\0kuzumaki.iwate.jp\0odawara.kanagawa.jp\0"
+"eu\0gmo\0"
+"notaires.fr\0"
+"fi\0coldwar.museum\0storj.farm\0"
+"fj\0ohda.shimane.jp\0"
+"fm\0mining.museum\0"
+"gmx\0"
+"fo\0"
+"ga\0"
+"fr\0gb\0"
+"gd\0"
+"ge\0"
+"gf\0bpl.biz\0"
+"gg\0bokn.no\0wmflabs.org\0"
+"gh\0"
+"gi\0"
+"v\xc3\xa5ler.hedmark.no\0"
+"gl\0barlettatraniandria.it\0hokuryu.hokkaido.jp\0"
+"gm\0inf.ua\0"
+"gn\0pesaro-urbino.it\0nishihara.kumamoto.jp\0"
+"gp\0aomori.aomori.jp\0"
+"gq\0"
+"gr\0"
+"gs\0"
+"gt\0"
+"skydiving.aero\0gu\0goo\0"
+"gop\0"
+"gw\0santabarbara.museum\0"
+"gy\0fribourg.museum\0herokuapp.com\0"
+"got\0"
+"hk\0"
+"gov\0"
+"hm\0"
+"hn\0"
+"dinosaur.museum\0egersund.no\0osaka\0rackmaze.com\0"
+"hr\0"
+"ht\0id\0"
+"hu\0ie\0"
+"umi.fukuoka.jp\0joyo.kyoto.jp\0"
+"orkdal.no\0"
+"minano.saitama.jp\0"
+"newyork.museum\0radio\0"
+"il\0"
+"im\0"
+"in\0"
+"io\0"
+"iq\0prd.km\0"
+"ir\0fujisato.akita.jp\0sukumo.kochi.jp\0gyeongnam.kr\0"
+"is\0"
+"it\0"
+"je\0mx.na\0servehttp.com\0"
+"rm.it\0\xe5\x85\xac\xe5\x8f\xb8\0"
+"pointto.us\0"
+"gold\0leczna.pl\0"
+"americanantiques.museum\0booking\0spacekit.io\0"
+"golf\0"
+"orkanger.no\0"
+"jo\0"
+"jp\0akiruno.tokyo.jp\0"
+"marker.no\0"
+"name.hr\0"
+"sn\xc3\xa5""ase.no\0prvcy.page\0"
+"av.it\0"
+"ke\0bananarepublic\0hbo\0"
+"inashiki.ibaraki.jp\0kainan.tokushima.jp\0"
+"kg\0adobeaemcloud.com\0"
+"video.hu\0ki\0hobol.no\0lolipop.io\0"
+"store.bb\0"
+"logistics.aero\0prd.mg\0"
+"km\0dnsdojo.org\0"
+"kn\0"
+"kp\0"
+"la\0supply\0*.landing.myjino.ru\0"
+"kr\0lb\0"
+"lc\0cc.sd.us\0"
+"name.et\0kiyama.saga.jp\0"
+"kw\0"
+"trentino-stirol.it\0"
+"ky\0li\0illustration.museum\0java\0"
+"name.fj\0kz\0"
+"lk\0"
+"tv.bb\0hitachiota.ibaraki.jp\0ntdll.top\0"
+"gouv.fr\0kumejima.okinawa.jp\0agakhan\0"
+"mihama.chiba.jp\0ritto.shiga.jp\0hicam.net\0"
+"ma\0"
+"okaya.nagano.jp\0lr\0"
+"ls\0mc\0"
+"lt\0md\0"
+"lu\0me\0ping\0"
+"lv\0"
+"mg\0own.pm\0"
+"mh\0\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa7\xb0\xe0\xa6\xa4\0"
+"tv.bo\0ly\0pink\0"
+"mk\0"
+"tv.br\0yakumo.shimane.jp\0ml\0"
+"goog\0"
+"mn\0a.prod.fastly.net\0"
+"mo\0nokia\0"
+"ashiya.fukuoka.jp\0mp\0barefoot\0"
+"mq\0na\0gs.aa.no\0"
+"mr\0"
+"plc.ly\0ms\0nc\0lib.ne.us\0s3-ap-northeast-1.amazonaws.com\0store.dk\0"
+"yoshioka.gunma.jp\0mt\0"
+"mu\0ne\0\xc3\xa5mot.no\0"
+"mv\0nf\0"
+"philadelphiaarea.museum\0mw\0ng\0lima-city.de\0"
+"vr.it\0mx\0"
+"name.cy\0my\0ni\0*.vps.myjino.ru\0"
+"kawanishi.nara.jp\0mz\0"
+"nl\0"
+"freemasonry.museum\0*.spectrum.myjino.ru\0"
+"no\0"
+"gouv.ht\0prochowice.pl\0pa.leg.br\0"
+"per.la\0"
+"toyohashi.aichi.jp\0nr\0"
+"isleofman.museum\0valley.museum\0\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0"
+"beskidy.pl\0"
+"nu\0"
+"otoyo.kochi.jp\0"
+"name.eg\0grimstad.no\0"
+"fujiidera.osaka.jp\0"
+"app.render.com\0"
+"nz\0etisalat\0"
+"cr.ua\0apartments\0"
+"\xe5\x85\xac\xe7\x9b\x8a\0"
+"om\0\xe6\x95\x99\xe8\x82\xb2.\xe9\xa6\x99\xe6\xb8\xaf\0"
+"hosting\0"
+"nu.ca\0pa\0"
+"esashi.hokkaido.jp\0"
+"tcm.museum\0cc.wi.us\0s3-ca-central-1.amazonaws.com\0"
+"pe\0dyn.home-webserver.de\0"
+"gouv.bj\0jeonnam.kr\0pf\0lima-city.at\0"
+"liguria.it\0takamatsu.kagawa.jp\0ph\0ostroleka.pl\0"
+"silk.museum\0tennis\0"
+"name.az\0"
+"pk\0"
+"pl\0"
+"pm\0s3.dualstack.us-east-2.amazonaws.com\0"
+"semboku.akita.jp\0pn\0democrat\0istanbul\0mattel\0"
+"*.transurl.be\0"
+"\xe5\xb2\xa9\xe6\x89\x8b.jp\0pb.leg.br\0"
+"qa\0"
+"wakkanai.hokkaido.jp\0pr\0"
+"ps\0"
+"abeno.osaka.jp\0wuoz.gov.pl\0pt\0"
+"gouv.ci\0"
+"per.nf\0"
+"pw\0works\0mydatto.com\0hobby-site.org\0"
+"taiki.hokkaido.jp\0world\0"
+"py\0"
+"kariwa.niigata.jp\0lima-city.ch\0"
+"id.au\0yk.ca\0"
+"griw.gov.pl\0"
+"austrheim.no\0marketing\0"
+"hokuto.yamanashi.jp\0"
+"re\0"
+"emilia-romagna.it\0"
+"x.se\0nh.us\0"
+"musashino.tokyo.jp\0"
+"rentals\0"
+"cymru.museum\0"
+"capetown\0hiv\0"
+"\xd9\x85\xd9\x88\xd9\x82\xd8\xb9\0"
+"nakaniikawa.toyama.jp\0"
+"ro\0"
+"sa\0"
+"sb\0"
+"iris.arpa\0rs\0sc\0"
+"sd\0"
+"ru\0se\0reise\0"
+"carrara-massa.it\0kamagaya.chiba.jp\0rifu.miyagi.jp\0ookuwa.nagano.jp\0"
+"americana.museum\0rw\0sg\0hockey\0"
+"wegrow.pl\0sh\0"
+"si\0"
+"sj\0for-the.biz\0"
+"otago.museum\0gs.ol.no\0sk\0"
+"kashiwara.osaka.jp\0sl\0"
+"sm\0"
+"sn\0"
+"so\0fed.us\0s3.eu-central-1.amazonaws.com\0"
+"amsw.nl\0"
+"sr\0"
+"ss\0tc\0"
+"st\0td\0"
+"su\0ebiz.tw\0"
+"arao.kumamoto.jp\0sv\0tf\0"
+"tv.im\0tg\0"
+"abashiri.hokkaido.jp\0sx\0th\0"
+"skole.museum\0sy\0lib.la.us\0"
+"sz\0tj\0hkt\0"
+"surgeonshall.museum\0tk\0"
+"tl\0""64-b.it\0"
+"tm\0"
+"siena.it\0tv.it\0fujikawa.yamanashi.jp\0tn\0"
+"to\0*.transurl.eu\0"
+"ens.tn\0"
+"ua\0paris.eu.org\0"
+"tr\0"
+"audnedaln.no\0*.on-rio.io\0"
+"tt\0"
+"saitama.saitama.jp\0tv\0"
+"tw\0ug\0"
+"\xe7\xbb\x84\xe7\xbb\x87.hk\0synology-diskstation.de\0"
+"tz\0"
+"uk\0wang\0"
+"labour.museum\0"
+"caltanissetta.it\0"
+"claims\0"
+"va\0krasnodar.su\0"
+"reggioemilia.it\0olsztyn.pl\0av.tr\0"
+"hasvik.no\0us\0vc\0"
+"seaport.museum\0plc.uk\0ve\0"
+"morioka.iwate.jp\0locker\0*.bzz.dapps.earth\0"
+"per.sg\0vg\0\xe5\xa4\xa7\xe6\x8b\xbf\0"
+"uy\0vi\0lego\0u2-local.xnbay.com\0"
+"laz.it\0uz\0"
+"ce.gov.br\0lazio.it\0moriguchi.osaka.jp\0tarnobrzeg.pl\0"
+"hanamigawa.chiba.jp\0pruszkow.pl\0vn\0"
+"hyundai\0"
+"stuff-4-sale.us\0"
+"\xe6\x94\xbf\xe5\xba\x9c.hk\0planetarium.museum\0"
+"nu.it\0"
+"vu\0googlecode.com\0"
+"tsushima.nagasaki.jp\0wf\0"
+"b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0"
+"schaeffler\0"
+"skierva.no\0"
+"gob.ar\0hikari.yamaguchi.jp\0"
+"priv.hu\0"
+"nakadomari.aomori.jp\0"
+"kakuda.miyagi.jp\0"
+"ws\0cooking\0from-ma.com\0"
+"nanmoku.gunma.jp\0"
+"broadcast.museum\0ulvik.no\0netlify.com\0"
+"servegame.org\0myiphost.com\0"
+"hot\0swiftcover\0"
+"i.bg\0gob.bo\0tv.na\0"
+"ecn.br\0sosnowiec.pl\0"
+"how\0"
+"us.org\0"
+"tokamachi.niigata.jp\0"
+"k12.wy.us\0"
+"gob.cl\0id.ir\0"
+"suwa.nagano.jp\0"
+"ogawara.miyagi.jp\0"
+"zhytomyr.ua\0"
+"trentinosuedtirol.it\0"
+"from-il.com\0"
+"allfinanz\0"
+"yt\0"
+"gildesk\xc3\xa5l.no\0"
+"walmart\0"
+"hopto.me\0hopto.org\0"
+"miyawaka.fukuoka.jp\0"
+"gob.do\0"
+"kurume.fukuoka.jp\0koya.wakayama.jp\0"
+"zm\0withyoutube.com\0"
+"honai.ehime.jp\0hokuto.hokkaido.jp\0"
+"gob.ec\0"
+"otsuchi.iwate.jp\0"
+"ibm\0*.otap.co\0"
+"arakawa.saitama.jp\0"
+"television.museum\0christmas\0"
+"sondre-land.no\0zw\0"
+"\xe5\xb1\xb1\xe6\xa2\xa8.jp\0"
+"aosta-valley.it\0\xd8\xb9\xd8\xb1\xd8\xa8\0"
+"ice\0"
+"cosenza.it\0"
+"gob.es\0istmein.de\0"
+"bs.it\0chikushino.fukuoka.jp\0yasu.shiga.jp\0"
+"home.dyndns.org\0"
+"red.sv\0"
+"vic.edu.au\0sevastopol.ua\0"
+"rimini.it\0\xe9\x95\xb7\xe5\xb4\x8e.jp\0"
+"council.aero\0"
+"incheon.kr\0"
+"sue.fukuoka.jp\0"
+"icu\0"
+"id.lv\0"
+"ushistory.museum\0odesa.ua\0"
+"nasu.tochigi.jp\0name.vn\0priv.at\0"
+"id.ly\0"
+"firm.ht\0"
+"barsy.club\0"
+"izena.okinawa.jp\0tosu.saga.jp\0naklo.pl\0*.transurl.nl\0"
+"oregontrail.museum\0"
+"ujiie.tochigi.jp\0"
+"linz.museum\0likescandy.com\0*.triton.zone\0"
+"mi.it\0"
+"delaware.museum\0politie\0"
+"ind.br\0firm.in\0nowruz\0"
+"tv.sd\0"
+"airtraffic.aero\0aigo\0"
+"gob.gt\0saarland\0"
+"inagi.tokyo.jp\0"
+"is-a-celticsfan.org\0"
+"nagato.yamaguchi.jp\0oum.gov.pl\0"
+"beats\0"
+"bill.museum\0cn.com\0from-or.com\0"
+"gob.hn\0name.tj\0"
+"dovre.no\0"
+"lib.nv.us\0guitars\0"
+"kamikawa.hokkaido.jp\0pi.leg.br\0"
+"chiyoda.tokyo.jp\0name.tr\0"
+"samnanger.no\0ifm\0"
+"name.tt\0"
+"zapto.org\0"
+"fedorainfracloud.org\0"
+"kiryu.gunma.jp\0ochi.kochi.jp\0"
+"\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89\0"
+"pb.ao\0"
+"tv.tr\0"
+"firm.co\0cc.na\0u2.xnbay.com\0"
+"ogaki.gifu.jp\0nishiawakura.okayama.jp\0"
+"or.at\0verisign\0"
+"redstone\0"
+"tv.tz\0"
+"or.bi\0potager.org\0"
+"iron.museum\0"
+"bergamo.it\0nishihara.okinawa.jp\0"
+"guernsey.museum\0firm.dk\0freeboxos.com\0"
+"kiyosato.hokkaido.jp\0fujisawa.kanagawa.jp\0"
+"wzmiuw.gov.pl\0"
+"california.museum\0from-al.com\0"
+"kagoshima.jp\0"
+"cc.wv.us\0"
+"forum.hu\0settlement.museum\0dontexist.com\0"
+"sex.hu\0georgia.museum\0"
+"kamakura.kanagawa.jp\0rmit\0"
+"or.ci\0fylkesbibl.no\0from-sc.com\0"
+"saotome.st\0"
+"annefrank.museum\0"
+"gouv.sn\0"
+"hirokawa.fukuoka.jp\0"
+"aejrie.no\0"
+"or.cr\0"
+"\xd2\x9b\xd0\xb0\xd0\xb7\0"
+"agematsu.nagano.jp\0"
+"emerck\0"
+"ag.it\0\xe5\xae\xae\xe5\xb4\x8e.jp\0upow.gov.pl\0"
+"ee.eu.org\0"
+"belluno.it\0isa.kagoshima.jp\0"
+"vuelos\0"
+"toyonaka.osaka.jp\0higashichichibu.saitama.jp\0"
+"riobranco.br\0okawa.kochi.jp\0"
+"ind.gt\0"
+"lib.sc.us\0bukhara.su\0"
+"karatsu.saga.jp\0"
+"name.qa\0"
+"name.pr\0"
+"culturalcenter.museum\0"
+"familyds.net\0"
+"joso.ibaraki.jp\0"
+"oirm.gov.pl\0"
+"uslivinghistory.museum\0jondal.no\0"
+"imamat\0"
+"name.na\0lifestyle\0dyn.ddnss.de\0tashkent.su\0"
+"toyotomi.hokkaido.jp\0"
+"gob.mx\0"
+"gob.ni\0b\xc3\xa5tsfjord.no\0school.za\0dyndns-mail.com\0dyndns-remote.com\0"
+"kawaguchi.saitama.jp\0name.mv\0"
+"name.ng\0cuisinella\0"
+"ind.in\0ogliastra.it\0"
+"name.my\0mymailer.com.tw\0"
+"nagasaki.nagasaki.jp\0kumagaya.saitama.jp\0kudamatsu.yamaguchi.jp\0"
+"i.ng\0"
+"yasuoka.nagano.jp\0"
+"eu-west-1.elasticbeanstalk.com\0"
+"shiga.jp\0ouchi.saga.jp\0"
+"railway.museum\0"
+"gamvik.no\0viajes\0"
+"automotive.museum\0"
+"1.bg\0"
+"id.us\0"
+"valle-aosta.it\0vc.it\0hu.net\0"
+"gob.pa\0"
+"courses\0"
+"gob.pe\0"
+"boomla.net\0"
+"dyndns-wiki.com\0"
+"soccer\0"
+"health.museum\0"
+"gob.pk\0"
+"cricket\0"
+"inc\0"
+"takahama.aichi.jp\0i.ph\0"
+"childrens.museum\0coupons\0ing\0cc.ua\0"
+"tonaki.okinawa.jp\0"
+"k12.ct.us\0"
+"or.id\0town\0pe.leg.br\0"
+"ind.kw\0ink\0"
+"nf.ca\0virtual-user.de\0"
+"localhost.daplie.me\0"
+"inazawa.aichi.jp\0"
+"geology.museum\0"
+"int\0fukui.jp\0dnsdojo.net\0"
+"name.mk\0sn\xc3\xa5sa.no\0cloud66.zone\0"
+"campidanomedio.it\0"
+"s3.dualstack.sa-east-1.amazonaws.com\0"
+"mi.th\0"
+"american.museum\0taipei\0"
+"or.it\0kumano.hiroshima.jp\0chigasaki.kanagawa.jp\0"
+"sydney\0"
+"furubira.hokkaido.jp\0urawa.saitama.jp\0"
+"ako.hyogo.jp\0"
+"hair\0"
+"kanna.gunma.jp\0sex.pl\0"
+"or.jp\0"
+"itau\0"
+"dabur\0"
+"name.jo\0bod\xc3\xb8.no\0"
+"or.ke\0kvinesdal.no\0"
+"otaki.chiba.jp\0"
+"is-gone.com\0"
+"transporte.bo\0toys\0"
+"v.bg\0england.museum\0us.na\0nes.buskerud.no\0"
+"ohtawara.tochigi.jp\0"
+"gouv.km\0epilepsy.museum\0i.se\0mi.us\0"
+"servebbs.org\0"
+"ushuaia.museum\0mer\xc3\xa5ker.no\0rovno.ua\0"
+"or.kr\0"
+"indiana.museum\0"
+"gob.sv\0"
+"firm.ve\0"
+"he.cn\0taki.mie.jp\0now.sh\0"
+"ono.fukushima.jp\0"
+"vestv\xc3\xa5g\xc3\xb8y.no\0nico\0"
+"go.gov.br\0mombetsu.hokkaido.jp\0"
+"repair\0sandvikcoromant\0"
+"komatsushima.tokushima.jp\0"
+"s3.dualstack.ap-south-1.amazonaws.com\0spdns.org\0"
+"nakatane.kagoshima.jp\0gouv.ml\0jcb\0"
+"select\0"
+"barum.no\0"
+"or.na\0"
+"bushey.museum\0is-a-llama.com\0"
+"or.mu\0honefoss.no\0gob.ve\0pictures\0cyon.link\0"
+"sasebo.nagasaki.jp\0"
+"tosa.kochi.jp\0asahi.nagano.jp\0"
+"aircraft.aero\0"
+"jcp\0"
+"ist\0"
+"sorum.no\0ooguy.com\0"
+"nagano.jp\0"
+"sciencecenter.museum\0"
+"mar.it\0"
+"nombre.bo\0no-ip.info\0"
+"gs.hl.no\0s3-eu-west-2.amazonaws.com\0"
+"satsumasendai.kagoshima.jp\0"
+"genoa.it\0yawata.kyoto.jp\0kiwi.nz\0azure-mobile.net\0"
+"e4.cz\0"
+"press.museum\0nissedal.no\0cc.tn.us\0"
+"itv\0"
+"ishinomaki.miyagi.jp\0"
+"chonan.chiba.jp\0coach\0"
+"aukra.no\0college\0vladimir.su\0"
+"gonohe.aomori.jp\0"
+"ro.eu.org\0"
+"hidaka.hokkaido.jp\0bando.ibaraki.jp\0"
+"freight.aero\0"
+"firm.ro\0km.ua\0"
+"vacations\0"
+"cards\0contractors\0"
+"daito.osaka.jp\0"
+"or.pw\0"
+"priv.pl\0"
+"tsumagoi.gunma.jp\0higashiyama.kyoto.jp\0ind.tn\0*.compute.amazonaws.com.cn\0rackmaze.net\0"
+"review\0"
+"historisch.museum\0naturalhistorymuseum.museum\0dep.no\0"
+"dyndns.info\0"
+"matsubara.osaka.jp\0"
+"shirataka.yamagata.jp\0"
+"cc.nm.us\0"
+"radom.pl\0"
+"piedmont.it\0"
+"rhcloud.com\0"
+"songdalen.no\0"
+"salem.museum\0k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0k12.vt.us\0"
+"fi.cr\0pr.leg.br\0"
+"pubtls.org\0"
+"estate\0vladimir.ru\0"
+"play\0"
+"priv.no\0s3-website-us-east-1.amazonaws.com\0"
+"pordenone.it\0kurate.fukuoka.jp\0kunisaki.oita.jp\0"
+"\xc3\xa5l.no\0"
+"miyagi.jp\0lgbt\0"
+"lyngen.no\0americanexpress\0"
+"nike\0"
+"kitahata.saga.jp\0firm.nf\0or.th\0"
+"jio\0firm.ng\0"
+"student.aero\0media.hu\0meeres.museum\0rsc.cdn77.org\0"
+"padua.it\0"
+"si.eu.org\0"
+"muko.kyoto.jp\0izumozaki.niigata.jp\0"
+"s3.dualstack.eu-west-2.amazonaws.com\0is-a-soxfan.org\0"
+"tomigusuku.okinawa.jp\0"
+"nakamura.kochi.jp\0"
+"riodejaneiro.museum\0"
+"at.it\0"
+"theater.museum\0or.ug\0"
+"campania.it\0fukuchiyama.kyoto.jp\0club\0"
+"medicina.bo\0wales.museum\0"
+"iwanai.hokkaido.jp\0minamidaito.okinawa.jp\0or.tz\0"
+"dynalias.net\0"
+"naturalsciences.museum\0"
+"toga.toyama.jp\0"
+"k12.al.us\0"
+"tec.ve\0services\0\xe3\x82\xb0\xe3\x83\xbc\xe3\x82\xb0\xe3\x83\xab\0"
+"priv.me\0or.us\0forgot.her.name\0"
+"mitaka.tokyo.jp\0"
+"genkai.saga.jp\0"
+"kalmykia.su\0"
+"aland.fi\0deloitte\0cn.eu.org\0"
+"haus\0"
+"louvre.museum\0pvt.k12.ma.us\0"
+"konskowola.pl\0"
+"education.tas.edu.au\0"
+"ranzan.saitama.jp\0jll\0"
+"kraanghke.no\0"
+"nowaruda.pl\0"
+"telebit.app\0"
+"otobe.hokkaido.jp\0"
+"catholic\0flynnhub.com\0"
+"katsuura.chiba.jp\0higashiizumo.shimane.jp\0"
+"insure\0"
+"trainer.aero\0flekkefjord.no\0yahoo\0"
+"jmp\0"
+"sa.edu.au\0cc.ma.us\0"
+"cymru\0sk.eu.org\0"
+"erimo.hokkaido.jp\0"
+"agrar.hu\0dnsalias.com\0"
+"cloudns.asia\0"
+"jnj\0"
+"fi.it\0"
+"kalmykia.ru\0"
+"kuwana.mie.jp\0"
+"workisboring.com\0"
+"trentinostirol.it\0"
+"ns.ca\0tolga.no\0"
+"storfjord.no\0"
+"vibo-valentia.it\0niihama.ehime.jp\0"
+"architecture.museum\0recht.pro\0"
+"parliament.nz\0"
+"washingtondc.museum\0"
+"square7.de\0"
+"uw.gov.pl\0warszawa.pl\0"
+"ragusa.it\0lukow.pl\0jot\0"
+"po.it\0daejeon.kr\0"
+"sykkylven.no\0"
+"joy\0"
+"lajolla.museum\0"
+"anamizu.ishikawa.jp\0namerikawa.toyama.jp\0"
+"neat-url.com\0"
+"abo.pa\0"
+"pro.az\0"
+"mckinsey\0"
+"komvux.se\0"
+"media.pl\0"
+"lur\xc3\xb8y.no\0"
+"pro.br\0minoh.osaka.jp\0mizuho.tokyo.jp\0noho.st\0"
+"ooshika.nagano.jp\0"
+"trentinoa-adige.it\0\xe1\x83\x92\xe1\x83\x94\0"
+"florist\0"
+"gjerstad.no\0hammerfest.no\0abogado\0cy.eu.org\0"
+"ru.eu.org\0se.eu.org\0"
+"santamaria.br\0yoshikawa.saitama.jp\0"
+"omaha.museum\0"
+"stavanger.no\0"
+"akdn\0observer\0"
+"bykle.no\0"
+"tahara.aichi.jp\0vapor.cloud\0"
+"press\0ae.org\0"
+"dscloud.biz\0"
+"seranishi.hiroshima.jp\0shimoji.okinawa.jp\0"
+"pro.cy\0"
+"square7.ch\0"
+"aremark.no\0karaganda.su\0barsy.co.uk\0"
+"tome.miyagi.jp\0"
+"amusement.aero\0pro.ec\0v.ua\0"
+"bd.se\0"
+"tt.im\0"
+"gs.jan-mayen.no\0lib.ks.us\0cz.eu.org\0"
+"hidaka.kochi.jp\0jeep\0"
+"gu.us\0appspot.com\0"
+"sh.cn\0ud.it\0"
+"shimane.jp\0"
+"higashiyoshino.nara.jp\0"
+"entertainment.aero\0"
+"lupin\0"
+"pro.fj\0"
+"ddnslive.com\0"
+"edu.krd\0"
+"off.ai\0"
+"dk.eu.org\0pokrovsk.su\0"
+"gaular.no\0netbank\0"
+"sowa.ibaraki.jp\0"
+"\xe5\x95\x86\xe5\xba\x97\0iki.fi\0"
+"kfh\0"
+"carraramassa.it\0"
+"assabu.hokkaido.jp\0"
+"*.compute.amazonaws.com\0"
+"daegu.kr\0cloudapp.net\0"
+"weibo\0"
+"k12.ma.us\0"
+"georgia.su\0"
+"etc.br\0"
+"os.hedmark.no\0"
+"pro.ht\0"
+"b\xc3\xa1jddar.no\0\xe5\x80\x8b\xe4\xba\xba.\xe9\xa6\x99\xe6\xb8\xaf\0"
+"*.s5y.io\0"
+"fuettertdasnetz.de\0dscloud.me\0"
+"slg.br\0"
+"g.bg\0"
+"towada.aomori.jp\0"
+"nogata.fukuoka.jp\0sklep.pl\0"
+"jewelry.museum\0*.compute.estate\0"
+"faith\0"
+"graphics\0"
+"gniezno.pl\0homedepot\0"
+"n\xc3\xa6r\xc3\xb8y.no\0kia\0"
+"portland.museum\0troandin.no\0kurgan.su\0"
+"garden.museum\0gjemnes.no\0grong.no\0""4lima.de\0"
+"nishitosa.kochi.jp\0"
+"moonscale.net\0"
+"eidskog.no\0"
+"trani-andria-barletta.it\0voorloper.cloud\0"
+"pvt.ge\0bonn.museum\0kim\0"
+"webhop.biz\0"
+"forsand.no\0"
+"browsersafetymark.io\0de.eu.org\0"
+"\xd9\xbe\xd8\xa7\xd9\x83\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0"
+"takahama.fukui.jp\0malopolska.pl\0"
+"hachijo.tokyo.jp\0"
+"charity\0"
+"sannan.hyogo.jp\0elblag.pl\0"
+"force.museum\0audio\0"
+"\xe7\xae\x87\xe4\xba\xba.hk\0"
+"matsumae.hokkaido.jp\0"
+"shimonoseki.yamaguchi.jp\0"
+"windows\0"
+"author\0"
+"itano.tokushima.jp\0gangwon.kr\0""4lima.at\0"
+"is-a-conservative.com\0"
+"ca.it\0"
+"lincoln.museum\0"
+"ninomiya.kanagawa.jp\0"
+"ciscofreak.com\0"
+"kuroiso.tochigi.jp\0lowicz.pl\0"
+"minamiise.mie.jp\0"
+"insurance.aero\0mus.mi.us\0"
+"dnsup.net\0"
+"kunstsammlung.museum\0rennes\xc3\xb8y.no\0"
+"gru.br\0"
+"ishikawa.jp\0\xe6\xb2\x96\xe7\xb8\x84.jp\0mitou.yamaguchi.jp\0"
+"online.museum\0pro.na\0"
+"tsukiyono.gunma.jp\0fujishiro.ibaraki.jp\0""4lima.ch\0"
+"science-fiction.museum\0plus\0"
+"ass.km\0"
+"pro.mv\0*.ex.futurecms.at\0"
+"katashina.gunma.jp\0"
+"otsuka\0"
+"cloudcontrolled.com\0"
+"inzai.chiba.jp\0"
+"koge.tottori.jp\0"
+"serveminecraft.net\0"
+"is-a-therapist.com\0"
+"konsulat.gov.pl\0"
+"pharmaciens.km\0"
+"hokkaido.jp\0"
+"even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0pro.om\0"
+"anquan\0"
+"lib.oh.us\0room\0sells-for-u.com\0"
+"caxias.br\0seiyo.ehime.jp\0toyotsu.fukuoka.jp\0"
+"xihuan\0"
+"\xe6\x95\x8e\xe8\x82\xb2.hk\0tranby.no\0pramerica\0"
+"industria.bo\0andasuolo.no\0cc.mn.us\0"
+"fbx-os.fr\0"
+"onna.okinawa.jp\0kosai.shizuoka.jp\0"
+"familyds.org\0"
+"arts.museum\0eastafrica.museum\0\xe9\x9b\xbb\xe8\xa8\x8a\xe7\x9b\x88\xe7\xa7\x91\0"
+"chesapeakebay.museum\0ca.na\0nittedal.no\0"
+"embaixada.st\0cloud\0garden\0"
+"microsoft\0"
+"lucerne.museum\0"
+"omura.nagasaki.jp\0chuo.yamanashi.jp\0pro.pr\0"
+"chiyoda.gunma.jp\0"
+"aseral.no\0"
+"noshiro.akita.jp\0kakinoki.shimane.jp\0"
+"olecko.pl\0"
+"ddnss.de\0"
+"bari.it\0"
+"spydeberg.no\0"
+"arezzo.it\0kpn\0"
+"aarborte.no\0"
+"emr.it\0"
+"tychy.pl\0"
+"jeju.kr\0"
+"santafe.museum\0valle.no\0"
+"forl\xc3\xac""cesena.it\0oyodo.nara.jp\0"
+"fukushima.hokkaido.jp\0shimizu.hokkaido.jp\0"
+"undersea.museum\0"
+"saku.nagano.jp\0blogspot.vn\0"
+"bus.museum\0"
+"s\xc3\xb8ndre-land.no\0"
+"tateyama.chiba.jp\0\xd1\x81\xd0\xb0\xd0\xb9\xd1\x82\0memset.net\0"
+"ca.eu.org\0"
+"shimonita.gunma.jp\0"
+"net.eu.org\0"
+"krd\0lat\0"
+"myactivedirectory.com\0"
+"law\0"
+"hitachinaka.ibaraki.jp\0atami.shizuoka.jp\0"
+"delmenhorst.museum\0"
+"urayasu.chiba.jp\0kakegawa.shizuoka.jp\0"
+"from-co.net\0"
+"tsuwano.shimane.jp\0"
+"itako.ibaraki.jp\0"
+"\xe5\xbe\xb3\xe5\xb3\xb6.jp\0"
+"alfaromeo\0"
+"trentinoaltoadige.it\0sakawa.kochi.jp\0"
+"starnberg.museum\0"
+"yamaguchi.jp\0"
+"r\xc3\xa5""de.no\0cc.al.us\0b-data.io\0myddns.rocks\0serveirc.com\0"
+"is-very-good.org\0"
+"pro.tt\0"
+"com.ac\0"
+"rotorcraft.aero\0"
+"com.af\0shingu.hyogo.jp\0"
+"com.ag\0"
+"um.gov.pl\0"
+"com.ai\0texas.museum\0"
+"vibovalentia.it\0isesaki.gunma.jp\0"
+"staging.onred.one\0homesecuritypc.com\0"
+"com.al\0vall\xc3\xa9""eaoste.it\0"
+"com.am\0"
+"tagawa.fukuoka.jp\0anan.nagano.jp\0"
+"com.ba\0bremanger.no\0"
+"com.ar\0com.bb\0urbino-pesaro.it\0"
+"lib.md.us\0"
+"com.au\0rennesoy.no\0"
+"torino.it\0"
+"com.aw\0"
+"com.bh\0va.it\0"
+"com.bi\0savannahga.museum\0fage\0lds\0blogspot.re\0"
+"com.az\0kashihara.nara.jp\0"
+"pro.vn\0"
+"com.bm\0"
+"com.bn\0"
+"com.bo\0"
+"aomori.jp\0"
+"hoylandet.no\0"
+"com.br\0"
+"com.bs\0sandoy.no\0s3-ap-northeast-2.amazonaws.com\0blogspot.ro\0"
+"com.bt\0dazaifu.fukuoka.jp\0"
+"revista.bo\0"
+"kinokawa.wakayama.jp\0"
+"blogspot.rs\0"
+"sagamihara.kanagawa.jp\0"
+"com.by\0com.ci\0athleta\0from-mo.com\0blogspot.ru\0blogspot.se\0"
+"com.bz\0ichinomiya.chiba.jp\0settsu.osaka.jp\0"
+"blogspot.sg\0"
+"com.cm\0blogspot.si\0"
+"com.cn\0"
+"com.co\0blogspot.sk\0"
+"creditunion\0olayangroup\0"
+"blogspot.sn\0"
+"com.cu\0com.de\0"
+"hakodate.hokkaido.jp\0nishimera.miyazaki.jp\0"
+"com.cw\0"
+"blogspot.td\0"
+"com.cy\0afjord.no\0tromso.no\0"
+"hirono.fukushima.jp\0ebina.kanagawa.jp\0cnpy.gdn\0"
+"macapa.br\0"
+"com.dm\0ca.us\0"
+"com.do\0"
+"fail\0"
+"com.ec\0jamison.museum\0"
+"com.ee\0"
+"juniper\0"
+"com.eg\0comsec\0cd.eu.org\0cust.prod.thingdust.io\0"
+"tsuno.kochi.jp\0ohira.miyagi.jp\0us.gov.pl\0"
+"com.dz\0friulive-giulia.it\0"
+"blogspot.tw\0blogspot.ug\0"
+"alesund.no\0"
+"yokosuka.kanagawa.jp\0"
+"from-wi.com\0"
+"medio-campidano.it\0"
+"com.es\0"
+"com.et\0furano.hokkaido.jp\0jeonbuk.kr\0"
+"t.bg\0"
+"weir\0blogspot.mr\0"
+"g.se\0"
+"xj.cn\0"
+"com.fj\0oiso.kanagawa.jp\0"
+"inuyama.aichi.jp\0blogspot.mx\0"
+"l\xc3\xa4ns.museum\0blogspot.my\0"
+"yamagata.nagano.jp\0"
+"cruises\0"
+"blogspot.nl\0"
+"e12.ve\0"
+"com.fr\0iijima.nagano.jp\0"
+"va.no\0abbvie\0homelinux.com\0blogspot.no\0"
+"gs.cn\0"
+"com.ge\0home-webserver.de\0"
+"uppo.gov.pl\0"
+"sogne.no\0"
+"com.gh\0"
+"com.gi\0bestbuy\0"
+"amami.kagoshima.jp\0"
+"discovery.museum\0"
+"com.gl\0"
+"k12.gu.us\0"
+"com.gn\0"
+"com.gp\0ms.leg.br\0"
+"conference.aero\0"
+"com.gr\0"
+"com.gt\0"
+"com.gu\0"
+"lidl\0"
+"magazine.aero\0davvenj\xc3\xa1rga.no\0"
+"daisen.akita.jp\0"
+"com.gy\0ally\0blogspot.pe\0"
+"art.br\0uryu.hokkaido.jp\0kikugawa.shizuoka.jp\0nanyo.yamagata.jp\0solar\0"
+"com.hk\0"
+"tozawa.yamagata.jp\0firewall-gateway.net\0"
+"dnsfor.me\0"
+"com.hn\0massa-carrara.it\0te.it\0"
+"user.srcf.net\0"
+"com.hr\0"
+"com.ht\0"
+"blogspot.qa\0"
+"plants.museum\0"
+"tohnosho.chiba.jp\0blogspot.pt\0"
+"hdfc\0llc\0"
+"cn.it\0career\0"
+"com.im\0asnes.no\0"
+"narashino.chiba.jp\0"
+"com.io\0life\0"
+"togo.aichi.jp\0numazu.shizuoka.jp\0mt.leg.br\0"
+"com.iq\0eastcoast.museum\0sebastopol.ua\0cloud66.ws\0"
+"matsuura.nagasaki.jp\0"
+"parliament.cy\0com.is\0apple\0"
+"minato.osaka.jp\0"
+"echizen.fukui.jp\0shichikashuku.miyagi.jp\0llp\0"
+"art.do\0fans\0is-a-bulls-fan.com\0blogspot.is\0"
+"blogspot.it\0"
+"zama.kanagawa.jp\0"
+"acct.pro\0smile\0"
+"stada\0"
+"com.jo\0ryukyu\0"
+"ureshino.mie.jp\0"
+"wa.gov.au\0"
+"art.dz\0mihara.kochi.jp\0"
+"barcelona.museum\0"
+"mt.it\0northwesternmutual\0blogspot.jp\0za.net\0"
+"cc.de.us\0"
+"sanjo.niigata.jp\0"
+"com.kg\0atlanta.museum\0"
+"kamigori.hyogo.jp\0"
+"com.ki\0"
+"fie.ee\0com.km\0blogsyte.com\0"
+"kosuge.yamanashi.jp\0com.kp\0"
+"com.la\0s3-ap-south-1.amazonaws.com\0"
+"com.lb\0"
+"com.lc\0"
+"bjark\xc3\xb8y.no\0"
+"blogspot.kr\0"
+"com.kw\0australia.museum\0skanland.no\0apps.fbsbx.com\0"
+"com.ky\0v\xc3\xa1rgg\xc3\xa1t.no\0"
+"com.kz\0"
+"com.lk\0malvik.no\0dynalias.org\0"
+"blogspot.li\0"
+"in-vpn.org\0"
+"osakikamijima.hiroshima.jp\0iiyama.nagano.jp\0com.lr\0lol\0"
+"com.lv\0ic.gov.pl\0"
+"com.mg\0"
+"blogspot.lt\0blogspot.md\0"
+"\xe7\xb6\xb2\xe7\xbb\x9c.hk\0com.ly\0blogspot.lu\0*.sys.qcx.io\0"
+"com.mk\0"
+"aizumisato.fukushima.jp\0com.ml\0"
+"tomika.gifu.jp\0"
+"com.mo\0blogspot.mk\0"
+"fujieda.shizuoka.jp\0"
+"com.na\0farm\0"
+"kouzushima.tokyo.jp\0\xd9\xbe\xd8\xa7\xda\xa9\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0lpl\0"
+"com.ms\0"
+"com.mt\0"
+"com.mu\0"
+"ono.hyogo.jp\0com.mv\0com.nf\0"
+"com.mw\0com.ng\0va.us\0"
+"com.mx\0"
+"com.my\0com.ni\0"
+"art.ht\0kamo.kyoto.jp\0kitayama.wakayama.jp\0"
+"l-o-g-i-n.de\0blogspot.fi\0"
+"izumiotsu.osaka.jp\0funagata.yamagata.jp\0"
+"like\0beta.bounty-full.com\0"
+"drive\0"
+"rikuzentakata.iwate.jp\0com.nr\0"
+"blog.bo\0webhosting.be\0"
+"ri.it\0man\0"
+"blog.br\0namie.fukushima.jp\0map\0blogspot.fr\0"
+"forde.no\0mba\0"
+"fast\0"
+"nanae.hokkaido.jp\0tsurugi.ishikawa.jp\0dental\0"
+"association.museum\0inderoy.no\0lenvik.no\0"
+"com.om\0dyn-berlin.de\0"
+"ac.leg.br\0"
+"co.network\0"
+"ar.it\0"
+"com.pa\0washtenaw.mi.us\0"
+"allstate\0gifts\0"
+"com.pe\0"
+"brescia.it\0com.pf\0blogspot.gr\0"
+"com.ph\0"
+"children.museum\0aramco\0"
+"tondabayashi.osaka.jp\0"
+"gj\xc3\xb8vik.no\0com.pk\0mypi.co\0"
+"aogaki.hyogo.jp\0com.pl\0"
+"ballooning.aero\0works.aero\0is-a-cpa.com\0"
+"!city.kobe.jp\0"
+"lind\xc3\xa5s.no\0blogspot.hk\0"
+"halsa.no\0com.qa\0photography\0abkhazia.su\0"
+"com.pr\0"
+"gs.oslo.no\0br\xc3\xb8nn\xc3\xb8y.no\0com.ps\0myshopblocks.com\0"
+"com.pt\0"
+"columbia.museum\0"
+"blogspot.hr\0"
+"tuxfamily.org\0"
+"kasukabe.saitama.jp\0amex\0"
+"com.py\0limo\0blogspot.hu\0blogspot.ie\0"
+"jl.cn\0ltd\0"
+"dattolocal.com\0"
+"kunohe.iwate.jp\0"
+"hikone.shiga.jp\0urown.cloud\0"
+"vald-aosta.it\0"
+"blogspot.in\0"
+"devices.resinstaging.io\0"
+"tenkawa.nara.jp\0"
+"com.re\0link\0safe\0blogspot.ba\0"
+"trentin-sud-tirol.it\0hinode.tokyo.jp\0"
+"sokndal.no\0from-ak.com\0couchpotatofries.org\0"
+"asahi.toyama.jp\0"
+"blogspot.be\0"
+"moka.tochigi.jp\0med\0"
+"associates\0blogspot.bg\0"
+"hamburg.museum\0"
+"fukuoka.jp\0kawazu.shizuoka.jp\0cool\0blogspot.bj\0"
+"com.ro\0dyndns1.de\0"
+"skierv\xc3\xa1.no\0com.sa\0"
+"coop\0com.sb\0"
+"gran.no\0com.sc\0"
+"com.sd\0men\0thruhere.net\0"
+"aetna\0com.se\0com.ru\0blogspot.ca\0"
+"com.sg\0clinique\0"
+"com.sh\0"
+"lancashire.museum\0"
+"tagajo.miyagi.jp\0sakaki.nagano.jp\0blogspot.cf\0"
+"air-traffic-control.aero\0te.ua\0"
+"adv.br\0com.sl\0blogspot.ch\0"
+"k12.tn.us\0trading\0"
+"udi.br\0com.sn\0"
+"com.so\0"
+"fg.it\0setagaya.tokyo.jp\0blogspot.cl\0"
+"hemsedal.no\0servebbs.com\0"
+"kommunalforbund.se\0com.ss\0"
+"ayagawa.kagawa.jp\0com.st\0"
+"nodebalancer.linode.com\0"
+"com.sv\0for.men\0"
+"cn.ua\0"
+"akita.jp\0kasuga.fukuoka.jp\0"
+"com.sy\0is-a-landscaper.com\0blogspot.de\0"
+"com.tj\0blogspot.cv\0"
+"mydatto.net\0"
+"muenchen.museum\0com.tm\0"
+"com.tn\0blogspot.cz\0"
+"com.to\0blogspot.dk\0"
+"eidfjord.no\0com.ua\0"
+"com.tr\0"
+"mino.gifu.jp\0ibara.okayama.jp\0izu.shizuoka.jp\0com.tt\0"
+"newjersey.museum\0tuva.su\0"
+"\xd8\xa7\xd8\xb1\xd8\xa7\xd9\x85\xd9\x83\xd9\x88\0"
+"mjondalen.no\0laakesvuemie.no\0com.tw\0com.ug\0"
+"ogawa.nagano.jp\0travelchannel\0"
+"h\xc3\xb8nefoss.no\0"
+"dyndns-home.com\0"
+"codes\0"
+"palmsprings.museum\0oppdal.no\0"
+"design\0"
+"monzabrianza.it\0"
+"rost.no\0com.vc\0\xe6\x94\xbf\xe5\x8a\xa1\0"
+"art.pl\0"
+"com.ve\0from-nj.com\0"
+"omigawa.chiba.jp\0"
+"hokksund.no\0"
+"sorocaba.br\0"
+"timekeeping.museum\0com.uy\0com.vi\0"
+"com.uz\0"
+"place\0"
+"hiratsuka.kanagawa.jp\0com.vn\0"
+"*.webhare.dev\0"
+"galsa.no\0"
+"mil\0"
+"zoological.museum\0sund.no\0t.se\0mt.us\0nd.us\0"
+"ora.gunma.jp\0"
+"com.vu\0"
+"ogano.saitama.jp\0piw.gov.pl\0"
+"bulsan-sudtirol.it\0koga.ibaraki.jp\0"
+"histoire.museum\0vikna.no\0githubusercontent.com\0"
+"mit\0"
+"nrw.museum\0"
+"es.gov.br\0"
+"gyokuto.kumamoto.jp\0"
+"kitamoto.saitama.jp\0"
+"bolt.hu\0western.museum\0"
+"com.ws\0"
+"skoczow.pl\0"
+"sale\0"
+"tochigi.jp\0"
+"davvenjarga.no\0"
+"k12.id.us\0"
+"from-ct.com\0codespot.com\0official.academy\0"
+"niigata.jp\0sakura.chiba.jp\0"
+"tsubame.niigata.jp\0"
+"stcgroup\0"
+"art.sn\0"
+"\xe5\x98\x89\xe9\x87\x8c\xe5\xa4\xa7\xe9\x85\x92\xe5\xba\x97\0glitch.me\0"
+"miyoshi.aichi.jp\0mlb\0"
+"\xc3\xb8stre-toten.no\0q-a.eu.org\0blogspot.ae\0"
+"tr.it\0"
+"ichikawa.chiba.jp\0"
+"erni\0"
+"live\0"
+"blogspot.al\0"
+"blogspot.am\0"
+"hinohara.tokyo.jp\0"
+"\xe6\x9b\xb8\xe7\xb1\x8d\0"
+"misato.saitama.jp\0bosch\0"
+"helsinki.museum\0bnpparibas\0"
+"malselv.no\0mma\0yolasite.com\0"
+"mls\0"
+"londrina.br\0"
+"guge\0"
+"com.zm\0ap-northeast-2.elasticbeanstalk.com\0"
+"folldal.no\0"
+"ri.us\0\xe9\xa3\x9f\xe5\x93\x81\0"
+"bahccavuotna.no\0"
+"abruzzo.it\0kumatori.osaka.jp\0grajewo.pl\0"
+"goip.de\0"
+"buyshouses.net\0"
+"\xe4\xb8\x89\xe9\x87\x8d.jp\0"
+"airguard.museum\0varoy.no\0"
+"yoita.niigata.jp\0"
+"ar.us\0"
+"*.cryptonomic.net\0"
+"aquarium.museum\0"
+"saito.miyazaki.jp\0"
+"meinforum.net\0"
+"stream\0s3-website-us-west-2.amazonaws.com\0"
+"pohl\0"
+"hurum.no\0moe\0"
+"takaishi.osaka.jp\0"
+"arboretum.museum\0"
+"kozagawa.wakayama.jp\0"
+"hawaii.museum\0moi\0"
+"mup.gov.pl\0"
+"mayfirst.info\0"
+"mom\0"
+"hitachi.ibaraki.jp\0"
+"sandvik\0"
+"e.bg\0ostre-toten.no\0ch.eu.org\0ybo.science\0"
+"homelinux.net\0"
+"cc.oh.us\0"
+"mov\0for-more.biz\0"
+"catanzaro.it\0cieszyn.pl\0"
+"mytis.ru\0"
+"vn.ua\0"
+"guardian\0"
+"ac.ae\0"
+"tr.no\0"
+"gd.cn\0"
+"knightpoint.systems\0"
+"nab\0"
+"lunner.no\0"
+"urasoe.okinawa.jp\0isla.pr\0"
+"kayabe.hokkaido.jp\0sarl\0"
+"tarui.gifu.jp\0"
+"ac.at\0emp.br\0"
+"ac.be\0"
+"adv.mz\0"
+"nba\0"
+"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xd8\xa9\0productions\0"
+"eu-4.evennode.com\0synology-ds.de\0"
+"imabari.ehime.jp\0iwi.nz\0"
+"cherkassy.ua\0"
+"kashiwa.chiba.jp\0"
+"idv.hk\0mango\0"
+"bounty-full.com\0"
+"\xe7\xa6\x8f\xe5\xb3\xb6.jp\0"
+"s\xc3\xb8r-odal.no\0"
+"\xe9\x95\xb7\xe9\x87\x8e.jp\0kuchinotsu.nagasaki.jp\0help\0"
+"ac.ci\0condos\0extraspace\0"
+"avianca\0"
+"trentinos-tirol.it\0msd\0"
+"motorcycle.museum\0"
+"ac.cn\0bo.it\0shirakawa.fukushima.jp\0"
+"bradesco\0"
+"makurazaki.kagoshima.jp\0"
+"moareke.no\0mypep.link\0"
+"ac.cr\0"
+"shishikui.tokushima.jp\0\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe\0"
+"mihama.aichi.jp\0prof.pr\0"
+"ac.cy\0vantaa.museum\0stufftoread.com\0"
+"air-surveillance.aero\0elverum.no\0"
+"misaki.okayama.jp\0"
+"nakanojo.gunma.jp\0al.leg.br\0"
+"patria.bo\0"
+"sakai.fukui.jp\0"
+"mtn\0"
+"save\0"
+"lu.it\0me.it\0tendo.yamagata.jp\0"
+"chiropractic.museum\0"
+"mtr\0"
+"nec\0"
+"andriatranibarletta.it\0\xd8\xa8\xda\xbe\xd8\xa7\xd8\xb1\xd8\xaa\0"
+"linkyard.cloud\0"
+"qbuser.com\0"
+"yachiyo.ibaraki.jp\0"
+"me.ke\0"
+"ac.fj\0ogawa.saitama.jp\0"
+"uk0.bigv.io\0"
+"net\0univ.sn\0co.financial\0"
+"oldnavy\0eu-3.evennode.com\0"
+"new\0"
+"tatsuno.hyogo.jp\0"
+"rahkkeravju.no\0is-a-socialist.com\0"
+"nfl\0"
+"kiho.mie.jp\0showa.yamanashi.jp\0"
+"vodka\0geekgalaxy.com\0"
+"k12.vi.us\0"
+"sf.no\0n\xc3\xa1vuotna.no\0"
+"ac.gn\0fudai.iwate.jp\0"
+"saxo\0servep2p.com\0"
+"hasama.oita.jp\0nishikata.tochigi.jp\0"
+"naturhistorisches.museum\0"
+"futuremailing.at\0"
+"k12.fl.us\0ngo\0"
+"tatebayashi.gunma.jp\0"
+"at.eu.org\0"
+"on.ca\0assisi.museum\0"
+"kokubunji.tokyo.jp\0"
+"here\0"
+"cookingchannel\0website.yandexcloud.net\0"
+"hatogaya.saitama.jp\0"
+"berg.no\0nhk\0"
+"ac.id\0"
+"noheji.aomori.jp\0"
+"bearalv\xc3\xa1hki.no\0for.mom\0"
+"pz.it\0"
+"tube\0"
+"misato.akita.jp\0global.ssl.fastly.net\0"
+"karate.museum\0uklugs.org\0"
+"ac.il\0mol.it\0"
+"ac.im\0pittsburgh.museum\0guru\0"
+"ac.in\0porn\0"
+"gs.vf.no\0"
+"k12.or.us\0"
+"ac.ir\0"
+"bir.ru\0"
+"za.org\0"
+"damnserver.com\0"
+"eu-2.evennode.com\0"
+"homesense\0"
+"vercelli.it\0ac.jp\0"
+"educational.museum\0alstom\0"
+"mikasa.hokkaido.jp\0sado.niigata.jp\0"
+"dyn-vpn.de\0"
+"andriabarlettatrani.it\0post\0router.management\0"
+"ac.ke\0hamar.no\0"
+"otama.fukushima.jp\0minamiashigara.kanagawa.jp\0"
+"oita.jp\0"
+"kitahiroshima.hokkaido.jp\0"
+"horology.museum\0"
+"is-a-nascarfan.com\0"
+"ac.kr\0a.run.app\0"
+"matsumoto.kagoshima.jp\0"
+"brand.se\0prime\0"
+"virtueeldomein.nl\0"
+"duckdns.org\0"
+"ac.lk\0"
+"tc.br\0"
+"ac.ma\0shouji\0"
+"onjuku.chiba.jp\0"
+"ac.ls\0\xe7\xb6\xb2\xe8\xb7\xaf.tw\0"
+"pomorskie.pl\0"
+"ac.me\0kr\xc3\xa5""anghke.no\0"
+"shimotsuma.ibaraki.jp\0"
+"tokushima.jp\0shikabe.hokkaido.jp\0"
+"pixolino.com\0"
+"livorno.it\0kira.aichi.jp\0onagawa.miyagi.jp\0"
+"masaki.ehime.jp\0"
+"camdvr.org\0"
+"kembuchi.hokkaido.jp\0"
+"ringsaker.no\0rv.ua\0is-a-hard-worker.com\0"
+"appchizi.com\0"
+"kitagawa.kochi.jp\0"
+"ac.mu\0birthplace.museum\0"
+"a.ssl.fastly.net\0"
+"graz.museum\0ac.mw\0"
+"miho.ibaraki.jp\0"
+"group.aero\0ac.ni\0bostik\0insurance\0"
+"ac.mz\0"
+"hiraizumi.iwate.jp\0"
+"environmentalconservation.museum\0eu-1.evennode.com\0myftp.org\0"
+"naroy.no\0www.ro\0ftpaccess.cc\0"
+"nb.ca\0"
+"fuefuki.yamanashi.jp\0"
+"bergbau.museum\0francaise.museum\0me.so\0delta\0tiffany\0"
+"mywire.org\0"
+"geometre-expert.fr\0sells-it.net\0"
+"ac.nz\0"
+"ravendb.me\0"
+"kamitsue.oita.jp\0"
+"arakawa.tokyo.jp\0"
+"idv.tw\0"
+"hellas.museum\0ac.pa\0"
+"kyiv.ua\0"
+"\xe8\x8c\xa8\xe5\x9f\x8e.jp\0soni.nara.jp\0"
+"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xdb\x83\0"
+"*.sapporo.jp\0"
+"k12.mn.us\0family\0myhome-server.de\0"
+"sera.hiroshima.jp\0"
+"me.tz\0"
+"lierne.no\0me.uk\0lundbeck\0now\0"
+"fukumitsu.toyama.jp\0download\0"
+"3utilities.com\0"
+"ac.pr\0"
+"!www.ck\0"
+"r.bg\0"
+"tobe.ehime.jp\0"
+"e.se\0me.us\0"
+"sites.static.land\0"
+"d.gv.vc\0"
+"motegi.tochigi.jp\0"
+"\xd8\xb4\xd8\xa8\xd9\x83\xd8\xa9\0"
+"qld.au\0villas\0"
+"journalism.museum\0"
+"chizu.tottori.jp\0ravendb.run\0"
+"ha.cn\0im.it\0"
+"\xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\0"
+"hiroo.hokkaido.jp\0"
+"lel.br\0"
+"nra\0"
+"kodaira.tokyo.jp\0"
+"higashi.fukuoka.jp\0kawara.fukuoka.jp\0hikawa.shimane.jp\0"
+"basel.museum\0"
+"\xe7\x8f\xa0\xe5\xae\x9d\0"
+"yakumo.hokkaido.jp\0"
+"inder\xc3\xb8y.no\0obi\0"
+"otofuke.hokkaido.jp\0frontdoor\0"
+"heroy.more-og-romsdal.no\0ac.rs\0onrender.com\0"
+"haboro.hokkaido.jp\0"
+"enebakk.no\0ac.se\0ac.ru\0"
+"ac.rw\0"
+"asakuchi.okayama.jp\0calvinklein\0"
+"ss.it\0yamashina.kyoto.jp\0"
+"nrw\0uy.com\0"
+"in-vpn.net\0"
+"azerbaijan.su\0"
+"soo.kagoshima.jp\0"
+"ddr.museum\0"
+"vda.it\0kyoto.jp\0fuchu.toyama.jp\0ac.th\0"
+"cl.it\0hatsukaichi.hiroshima.jp\0ac.sz\0ac.tj\0"
+"shingu.wakayama.jp\0boston\0"
+"time.no\0"
+"co.events\0"
+"sano.tochigi.jp\0"
+"inatsuki.fukuoka.jp\0"
+"ac.ug\0"
+"ac.tz\0"
+"ac.uk\0"
+"sassari.it\0ntt\0theater\0"
+"crew.aero\0ullensvang.no\0"
+"wazuka.kyoto.jp\0"
+"yamanakako.yamanashi.jp\0"
+"cc.dc.us\0"
+"lubartow.pl\0"
+"brunel.museum\0"
+"jgora.pl\0"
+"york.museum\0"
+"friulivenezia-giulia.it\0"
+"\xc3\xa5rdal.no\0lelux.site\0"
+"cci.fr\0chungbuk.kr\0ac.vn\0off\0"
+"tadaoka.osaka.jp\0"
+"rochester.museum\0"
+"\xd8\xa7\xd8\xa8\xd9\x88\xd8\xb8\xd8\xa8\xd9\x8a\0"
+"vanguard\0"
+"budejju.no\0"
+"wiih.gov.pl\0privatizehealthinsurance.net\0"
+"erotica.hu\0"
+"clubmed\0"
+"*.awdev.ca\0"
+"yugawa.fukushima.jp\0nagaoka.niigata.jp\0"
+"yamanouchi.nagano.jp\0"
+"lakas.hu\0"
+"minakami.gunma.jp\0yoka.hyogo.jp\0gov.scot\0"
+"nfshost.com\0"
+"koshigaya.saitama.jp\0"
+"ina.ibaraki.jp\0"
+"is-an-anarchist.com\0"
+"ciencia.bo\0traeumtgerade.de\0"
+"riik.ee\0maritimo.museum\0""1kapp.com\0"
+"spreadbetting\0"
+"sanda.hyogo.jp\0ikeda.nagano.jp\0"
+"franziskaner.museum\0"
+"crd.co\0"
+"nagareyama.chiba.jp\0"
+"shimoda.shizuoka.jp\0"
+"s3-website-sa-east-1.amazonaws.com\0"
+"kasuya.fukuoka.jp\0"
+"nyc\0s3.dualstack.ap-northeast-1.amazonaws.com\0"
+"biella.it\0kosei.shiga.jp\0"
+"groks-this.info\0"
+"social\0"
+"ac.za\0"
+"riopreto.br\0rg.it\0"
+"data\0"
+"kawamata.fukushima.jp\0"
+"date\0au.eu.org\0be.eu.org\0"
+"*.hosting.myjino.ru\0"
+"treviso.it\0"
+"anthro.museum\0ac.zm\0"
+"mr.no\0"
+"ap.it\0parma.it\0"
+"chuo.chiba.jp\0"
+"is-an-accountant.com\0"
+"sannohe.aomori.jp\0"
+"ac.zw\0"
+"trentinosud-tirol.it\0"
+"\xe9\xa4\x90\xe5\x8e\x85\0"
+"yoro.gifu.jp\0worse-than.tv\0"
+"sardegna.it\0\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86\0"
+"mitsubishi\0is-certified.com\0"
+"oe.yamagata.jp\0"
+"lib.ca.us\0"
+"aju.br\0shinkamigoto.nagasaki.jp\0"
+"ar.com\0"
+"veg\xc3\xa5rshei.no\0homelinux.org\0"
+"whaling.museum\0"
+"minamiaiki.nagano.jp\0"
+"handson.museum\0ha.no\0"
+"soma.fukushima.jp\0"
+"kasuga.hyogo.jp\0ryuoh.shiga.jp\0\xe0\xa8\xad\xe0\xa8\xbe\xe0\xa8\xb0\xe0\xa8\xa4\0"
+"civilwar.museum\0"
+"susono.shizuoka.jp\0"
+"naie.hokkaido.jp\0"
+"tachiarai.fukuoka.jp\0tokushima.tokushima.jp\0"
+"birkenes.no\0"
+"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86\0"
+"k\xc3\xa5""fjord.no\0"
+"gunma.jp\0saroma.hokkaido.jp\0"
+"bg.eu.org\0"
+"one\0x443.pw\0"
+"ong\0"
+"fe.it\0"
+"gok.pk\0"
+"mifune.kumamoto.jp\0aguni.okinawa.jp\0ostrowwlkp.pl\0"
+"laspezia.it\0onl\0scor\0"
+"ringerike.no\0"
+"scot\0"
+"blogdns.org\0"
+"yaotsu.gifu.jp\0"
+"mortgage\0"
+"cam.it\0actor\0"
+"fhs.no\0ooo\0"
+"tempioolbia.it\0"
+"trader.aero\0cc.fl.us\0dyn-ip24.de\0"
+"act.edu.au\0larvik.no\0"
+"k12.ny.us\0"
+"now-dns.top\0"
+"vic.au\0"
+"vpnplus.to\0"
+"iz.hr\0durban\0"
+"nationwide\0"
+"\xe7\xbb\x84\xe7\xbb\x87\xe6\x9c\xba\xe6\x9e\x84\0"
+"nic.in\0"
+"r.se\0"
+"halden.no\0cc.pr.us\0"
+"iveland.no\0tr\xc3\xb8gstad.no\0"
+"trafficplex.cloud\0"
+"sci.eg\0tec.mi.us\0"
+"org\0"
+"hn.cn\0"
+"pay\0"
+"dynserv.org\0"
+"\xe6\x96\xb0\xe6\xbd\x9f.jp\0fujinomiya.shizuoka.jp\0"
+"yatsuka.shimane.jp\0"
+"gs.of.no\0"
+"the.br\0"
+"minamiawaji.hyogo.jp\0comcast\0"
+"network\0soundcast.me\0"
+"*.sendai.jp\0"
+"chuo.osaka.jp\0"
+"mallorca.museum\0"
+"nanbu.yamanashi.jp\0"
+"nikon\0map.fastly.net\0"
+"money.museum\0hr.eu.org\0"
+"sd.cn\0tp.it\0"
+"stjohn.museum\0"
+"yatsushiro.kumamoto.jp\0ouda.nara.jp\0"
+"rogers\0"
+"wien\0"
+"seto.aichi.jp\0"
+"gujo.gifu.jp\0mitoyo.kagawa.jp\0nishikawa.yamagata.jp\0malbork.pl\0ott\0"
+"torsken.no\0"
+"torahime.shiga.jp\0"
+"engine.aero\0lib.va.us\0xfinity\0"
+"yokoshibahikari.chiba.jp\0"
+"tcp4.me\0"
+"rsvp\0"
+"clothing\0"
+"dst.mi.us\0"
+"chijiwa.nagasaki.jp\0"
+"iki.nagasaki.jp\0"
+"airforce\0operaunite.com\0"
+"pet\0"
+"is-with-theband.com\0"
+"cesenaforli.it\0"
+"entomology.museum\0"
+"no.it\0ovh\0trust\0"
+"naturalhistory.museum\0"
+"potenza.it\0hosting-cluster.nl\0"
+"\xe9\xa6\x99\xe6\xb8\xaf\0"
+"kv.ua\0"
+"basketball\0"
+"k12.me.us\0staples\0"
+"kushimoto.wakayama.jp\0"
+"tsuruta.aomori.jp\0"
+"karasuyama.tochigi.jp\0"
+"database.museum\0for.one\0"
+"static-access.net\0"
+"politica.bo\0\xc3\xb8vre-eiker.no\0"
+"c.bg\0"
+"flog.br\0*.nom.br\0"
+"in-brb.de\0"
+"cc.nv.us\0"
+"bulsan-s\xc3\xbc""dtirol.it\0phd\0eating-organic.net\0"
+"leikanger.no\0"
+"med.br\0"
+"withgoogle.com\0"
+"okuizumo.shimane.jp\0"
+"chikugo.fukuoka.jp\0"
+"dyndns.ddnss.de\0"
+"cyon.site\0"
+"ama.aichi.jp\0"
+"bingo\0"
+"pid\0"
+"theatre\0"
+"\xe9\xb9\xbf\xe5\x85\x90\xe5\xb3\xb6.jp\0"
+"ruovat.no\0"
+"\xd0\xb4\xd0\xb5\xd1\x82\xd0\xb8\0"
+"vads\xc3\xb8.no\0"
+"omihachiman.shiga.jp\0"
+"pin\0"
+"ip6.arpa\0"
+"vlog.br\0"
+"bo.telemark.no\0"
+"suzuka.mie.jp\0"
+"computer.museum\0russia.museum\0supplies\0"
+"lezajsk.pl\0"
+"med.ec\0wiki\0"
+"qh.cn\0sakae.nagano.jp\0"
+"med.ee\0"
+"mihama.wakayama.jp\0"
+"dyndns-server.com\0"
+"tel.tr\0senseering.net\0"
+"latina.it\0kuju.oita.jp\0tokashiki.okinawa.jp\0"
+"yasuda.kochi.jp\0datsun\0"
+"wildlife.museum\0"
+"trieste.it\0"
+"\xe6\xbb\x8b\xe8\xb3\x80.jp\0sakae.chiba.jp\0kikuchi.kumamoto.jp\0hgtv\0"
+"irish\0"
+"isa-geek.org\0"
+"nasushiobara.tochigi.jp\0mikawa.yamagata.jp\0"
+"kamaishi.iwate.jp\0vlaanderen\0"
+"kozaki.chiba.jp\0setouchi.okayama.jp\0"
+"qa2.com\0"
+"curitiba.br\0fukushima.fukushima.jp\0"
+"\xe7\xbd\x91\xe7\xbb\x9c.cn\0nic.tj\0"
+"grozny.su\0"
+"mizunami.gifu.jp\0kamikitayama.nara.jp\0nagatoro.saitama.jp\0*.stg.dev\0"
+"black\0"
+"mc.it\0rzeszow.pl\0workers.dev\0"
+"l\xc3\xa1hppi.no\0"
+"stadt.museum\0"
+"szkola.pl\0"
+"skiptvet.no\0wine\0"
+"kobayashi.miyazaki.jp\0tonami.toyama.jp\0"
+"pharmacy.museum\0lease\0"
+"nhs.uk\0accountants\0"
+"wakasa.fukui.jp\0"
+"vicenza.it\0"
+"brumunddal.no\0"
+"gs.ah.no\0"
+"pnc\0"
+"no-ip.co.uk\0"
+"ma.gov.br\0med.ht\0\xe7\xbe\xa4\xe9\xa6\xac.jp\0"
+"hakusan.ishikawa.jp\0"
+"minamimaki.nagano.jp\0\xe9\x9b\x86\xe5\x9b\xa2\0"
+"usdecorativearts.museum\0from-va.com\0"
+"shinshinotsu.hokkaido.jp\0fujimi.nagano.jp\0"
+"wiki.bo\0nebraska.museum\0"
+"fr.it\0shunan.yamaguchi.jp\0serveftp.net\0"
+"lib.ee\0"
+"wiki.br\0credit\0"
+"grozny.ru\0"
+"\xd0\xba\xd0\xbe\xd0\xbc\0"
+"doomdns.org\0"
+"brandywinevalley.museum\0"
+"kita.tokyo.jp\0"
+"mj\xc3\xb8ndalen.no\0"
+"shirako.chiba.jp\0"
+"sunagawa.hokkaido.jp\0"
+"championship.aero\0"
+"rikubetsu.hokkaido.jp\0hanyu.saitama.jp\0"
+"mesaverde.museum\0amsterdam\0"
+"v-info.info\0"
+"rieti.it\0joboji.iwate.jp\0\xe5\xa4\xa7\xe4\xbc\x97\xe6\xb1\xbd\xe8\xbd\xa6\0"
+"aure.no\0"
+"direct\0"
+"bievat.no\0"
+"okayama.jp\0kawasaki.miyagi.jp\0seat\0"
+"varese.it\0"
+"b\xc3\xb8.telemark.no\0"
+"hirosaki.aomori.jp\0"
+"\xe7\xbd\x91\xe7\xbb\x9c.hk\0baby\0"
+"bas.it\0"
+"s3.dualstack.ca-central-1.amazonaws.com\0c.la\0"
+"trentinsuedtirol.it\0"
+"lewismiller.museum\0"
+"anjo.aichi.jp\0"
+"nic.za\0living\0"
+"shinjo.okayama.jp\0"
+"boehringer\0"
+"compare\0"
+"kaszuby.pl\0"
+"dclk\0"
+"game.tw\0"
+"vall\xc3\xa9""edaoste.it\0"
+"country\0is-a-patsfan.org\0"
+"mizusawa.iwate.jp\0"
+"med.ly\0"
+"nikko.tochigi.jp\0linkyard-cloud.ch\0"
+"pro\0mobile\0"
+"arendal.no\0"
+"r\xc3\xa1isa.no\0ru.com\0"
+"pru\0"
+"trentin-sued-tirol.it\0"
+"yoichi.hokkaido.jp\0uto.kumamoto.jp\0"
+"podhale.pl\0"
+"ecologia.bo\0"
+"green\0"
+"\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0"
+"portal.museum\0schweiz.museum\0"
+"okuma.fukushima.jp\0"
+"seek\0"
+"travelersinsurance\0"
+"9guacu.br\0soja.okayama.jp\0sp.leg.br\0"
+"scientist.aero\0wanggou\0"
+"rankoshi.hokkaido.jp\0"
+"ventures\0"
+"tadotsu.kagawa.jp\0"
+"med.om\0"
+"mitsuke.niigata.jp\0kg.kr\0pub\0"
+"termez.su\0"
+"med.pa\0frogans\0"
+"umaji.kochi.jp\0unnan.shimane.jp\0"
+"farmequipment.museum\0"
+"tottori.jp\0"
+"rissa.no\0"
+"readthedocs.io\0"
+"prod\0"
+"prof\0"
+"gjerdrum.no\0barclays\0"
+"med.pl\0"
+"aa.no\0"
+"sd.us\0redumbrella\0"
+"mp.br\0"
+"cc.ut.us\0"
+"sayama.osaka.jp\0"
+"b\xc3\xa6rum.no\0"
+"obira.hokkaido.jp\0"
+"loginline.dev\0"
+"verran.no\0organic\0\xe6\xb7\xa1\xe9\xa9\xac\xe9\x94\xa1\0"
+"inagawa.hyogo.jp\0matsushima.miyagi.jp\0at-band-camp.net\0"
+"pwc\0"
+"zagan.pl\0"
+"haugesund.no\0company\0technology\0"
+"biev\xc3\xa1t.no\0"
+"tokai.ibaraki.jp\0"
+"mayfirst.org\0"
+"siracusa.it\0yaizu.shizuoka.jp\0ruhr\0"
+"rivne.ua\0k12.mt.us\0security\0"
+"taku.saga.jp\0"
+"rennebu.no\0from-dc.com\0"
+"choshi.chiba.jp\0"
+"il.eu.org\0nh-serv.co.uk\0"
+"coloradoplateau.museum\0kommune.no\0"
+"matsubushi.saitama.jp\0"
+"med.sa\0"
+"shibecha.hokkaido.jp\0med.sd\0"
+"firebaseapp.com\0"
+"p.bg\0"
+"c.se\0"
+"bato.tochigi.jp\0"
+"isa-geek.com\0"
+"okoppe.hokkaido.jp\0"
+"servepics.com\0"
+"tsunan.niigata.jp\0"
+"sabae.fukui.jp\0"
+"go.ci\0"
+"kosaka.akita.jp\0"
+"kanmaki.nara.jp\0kamikawa.saitama.jp\0"
+"webhop.org\0"
+"kijo.miyazaki.jp\0"
+"aktyubinsk.su\0"
+"go.cr\0"
+"ris\xc3\xb8r.no\0"
+"leangaviika.no\0hu.eu.org\0ie.eu.org\0"
+"higashiyamato.tokyo.jp\0netflix\0"
+"luroy.no\0wi.us\0"
+"powiat.pl\0"
+"dynamic-dns.info\0"
+"fujixerox\0"
+"tatsuno.nagano.jp\0ikaruga.nara.jp\0"
+"from-fl.com\0"
+"pors\xc3\xa1\xc5\x8bgu.no\0"
+"shima.mie.jp\0"
+"s3-external-1.amazonaws.com\0s3-website.ap-northeast-2.amazonaws.com\0"
+"realestate.pl\0kmpsp.gov.pl\0"
+"ta.it\0sko.gov.pl\0sopot.pl\0"
+"*.compute-1.amazonaws.com\0"
+"town.museum\0"
+"band\0"
+"ol.no\0"
+"bz.it\0bibai.hokkaido.jp\0"
+"directory\0"
+"asmatart.museum\0humanities.museum\0kongsberg.no\0"
+"other.nf\0"
+"cog.mi.us\0bank\0"
+"florence.it\0"
+"space\0"
+"livinghistory.museum\0k12.ar.us\0lib.tn.us\0"
+"nsw.edu.au\0"
+"gb.net\0"
+"space.museum\0"
+"berlin\0"
+"kaga.ishikawa.jp\0"
+"dscloud.mobi\0"
+"tomobe.ibaraki.jp\0"
+"\xe6\x94\xbf\xe5\xba\x9c.\xe9\xa6\x99\xe6\xb8\xaf\0"
+"celtic.museum\0"
+"kamisato.saitama.jp\0"
+"bentley\0"
+"chihayaakasaka.osaka.jp\0"
+"gjesdal.no\0"
+"gs.rl.no\0"
+"ando.nara.jp\0"
+"dentist\0"
+"ancona.it\0accountant\0"
+"arab\0"
+"contemporary.museum\0"
+"aeroclub.aero\0"
+"go.id\0"
+"jinsekikogen.hiroshima.jp\0"
+"bnr.la\0from-pr.com\0"
+"skj\xc3\xa5k.no\0singles\0quicksytes.com\0"
+"higashinaruse.akita.jp\0zuerich\0"
+"muni.il\0"
+"british.museum\0kvitsoy.no\0voagat.no\0"
+"go.it\0inawashiro.fukushima.jp\0"
+"direct.quickconnect.to\0"
+"huissier-justice.fr\0"
+"backplaneapp.io\0"
+"\xe4\xbd\x9b\xe5\xb1\xb1\0"
+"indianmarket.museum\0"
+"go.jp\0"
+"algard.no\0"
+"webredirect.org\0outsystemscloud.com\0"
+"go.ke\0"
+"moscow.museum\0flowers\0"
+"doctor\0lublin.pl\0"
+"corvette.museum\0"
+"draydns.de\0"
+"volkswagen\0"
+"re.it\0"
+"her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0"
+"go.kr\0"
+"pubol.museum\0cust.dev.thingdust.io\0"
+"systems\0versicherung\0"
+"an.it\0yachimata.chiba.jp\0"
+"tattoo\0"
+"kujukuri.chiba.jp\0"
+"alabama.museum\0"
+"ashiya.hyogo.jp\0blogdns.net\0"
+"tas.edu.au\0finearts.museum\0"
+"sande.more-og-romsdal.no\0"
+"pomorze.pl\0principe.st\0tatar\0"
+"re.kr\0"
+"s3-fips-us-gov-west-1.amazonaws.com\0"
+"kasumigaura.ibaraki.jp\0"
+"miyazaki.miyazaki.jp\0"
+"byen.site\0"
+"schlesisches.museum\0gr.eu.org\0"
+"capital\0"
+"tamakawa.fukushima.jp\0"
+"maritime.museum\0"
+"uenohara.yamanashi.jp\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xa4\0"
+"is-leet.com\0"
+"nakagawa.nagano.jp\0"
+"opoczno.pl\0"
+"miasta.pl\0blogspot.co.at\0"
+"family.museum\0dubai\0"
+"kunitomi.miyazaki.jp\0cloudaccess.net\0"
+"nagaokakyo.kyoto.jp\0global\0red\0"
+"lib.nm.us\0"
+"8.bg\0"
+"stuff-4-sale.org\0"
+"perso.ht\0haibara.shizuoka.jp\0ren\0"
+"vladikavkaz.ru\0"
+"misawa.aomori.jp\0ashoro.hokkaido.jp\0"
+"qvc\0from-me.org\0"
+"luzern.museum\0cechire.com\0"
+"fc.it\0"
+"uk.com\0"
+"atsugi.kanagawa.jp\0"
+"wsa.gov.pl\0"
+"berkeley.museum\0fedje.no\0"
+"vladikavkaz.su\0"
+"bydgoszcz.pl\0"
+"shinonsen.hyogo.jp\0"
+"go.pw\0"
+"cc.wa.us\0"
+"hioki.kagoshima.jp\0"
+"deal\0"
+"campobasso.it\0"
+"gov.ac\0"
+"fukushima.jp\0hotel.tz\0"
+"gov.ae\0is-a-player.com\0"
+"gov.af\0tamano.okayama.jp\0tokorozawa.saitama.jp\0"
+"\xe0\xb0\xad\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\xa4\xe0\xb1\x8d\0ras.ru\0"
+"nm.cn\0pi.it\0"
+"go.dyndns.org\0"
+"loan\0"
+"sexy\0virtualuser.de\0"
+"gov.al\0es.kr\0\xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xa0\xe0\xa4\xa8\0"
+"khakassia.su\0"
+"gov.ba\0"
+"gov.ar\0gov.bb\0kaminoyama.yamagata.jp\0\xd8\xb3\xd9\x88\xd8\xaf\xd8\xa7\xd9\x86\0"
+"gov.as\0jan-mayen.no\0"
+"gov.au\0"
+"gov.bf\0carbonia-iglesias.it\0"
+"gov.bh\0"
+"gov.az\0r.cdn77.net\0"
+"\xe5\xb7\xa5\xe8\xa1\x8c\0nhlfan.net\0"
+"gov.bm\0"
+"gov.bn\0lecco.it\0"
+"norfolk.museum\0"
+"aurskog-holand.no\0holt\xc3\xa5len.no\0p.se\0"
+"gov.br\0iwate.iwate.jp\0"
+"gov.bs\0"
+"gov.bt\0gov.cd\0ril\0"
+"\xd9\x82\xd8\xb7\xd8\xb1\0dyndns-blog.com\0"
+"otari.nagano.jp\0"
+"andebu.no\0commbank\0rio\0oy.lc\0"
+"rip\0"
+"gov.by\0"
+"gov.bz\0nadex\0"
+"show.aero\0capebreton.museum\0"
+"gov.cl\0go.th\0"
+"gov.cm\0"
+"gov.cn\0hl.cn\0go.tj\0"
+"gov.co\0"
+"mg.gov.br\0"
+"gov.cu\0gs.nt.no\0leka.no\0"
+"zoology.museum\0naturbruksgymn.se\0"
+"gov.cx\0\xd0\xbc\xd0\xba\xd0\xb4\0"
+"gov.cy\0"
+"go.ug\0wv.us\0"
+"karumai.iwate.jp\0"
+"gov.dm\0konyvelo.hu\0"
+"namegata.ibaraki.jp\0go.tz\0"
+"gov.do\0pri.ee\0"
+"tgory.pl\0"
+"pantheonsite.io\0"
+"arts.co\0gov.ec\0lib.ky.us\0temasek\0"
+"gov.ee\0carrier.museum\0"
+"kitami.hokkaido.jp\0dyndns.biz\0blogspot.co.id\0"
+"gov.eg\0"
+"tn.it\0tjmaxx\0"
+"showtime\0"
+"gov.dz\0takaoka.toyama.jp\0"
+"army\0from-ks.com\0"
+"yamazoe.nara.jp\0"
+"square.museum\0"
+"campinagrande.br\0en-root.fr\0blogspot.co.il\0"
+"hirogawa.wakayama.jp\0"
+"kaluga.su\0"
+"fuossko.no\0altervista.org\0s3-sa-east-1.amazonaws.com\0"
+"gov.et\0"
+"konan.shiga.jp\0"
+"ann-arbor.mi.us\0"
+"nara.jp\0"
+"sogndal.no\0"
+"gov.fj\0tokoname.aichi.jp\0from-la.net\0sytes.net\0"
+"detroit.museum\0and\xc3\xb8y.no\0loten.no\0fin.ci\0"
+"trentino-sud-tirol.it\0nakamichi.yamanashi.jp\0*.in.futurecms.at\0"
+"oshima.tokyo.jp\0"
+"in-berlin.de\0"
+"matsukawa.nagano.jp\0loft\0"
+"blackfriday\0"
+"arpa\0"
+"gov.ge\0ismaili\0"
+"press.cy\0"
+"gov.gh\0wanouchi.gifu.jp\0"
+"wa.edu.au\0gov.gi\0cody.museum\0"
+"ninja\0"
+"\xe6\x84\x9b\xe5\xaa\x9b.jp\0sanuki.kagawa.jp\0iheya.okinawa.jp\0swiebodzin.pl\0"
+"fst.br\0gov.gn\0przeworsk.pl\0myftp.biz\0"
+"toshiba\0"
+"gov.gr\0"
+"date.fukushima.jp\0"
+"fin.ec\0gov.gu\0hotel.lk\0"
+"oshu.iwate.jp\0"
+"gov.gy\0vaapste.no\0us-4.evennode.com\0"
+"zapto.xyz\0"
+"gov.hk\0"
+"kasai.hyogo.jp\0jobs.tt\0"
+"jpmorgan\0isa-geek.net\0"
+"sec.ps\0"
+"nonoichi.ishikawa.jp\0\xd8\xb9\xd9\x85\xd8\xa7\xd9\x86\0"
+"os.hordaland.no\0\xd0\xbc\xd0\xbe\xd0\xbd\0"
+"lib.or.us\0\xe6\x96\xb0\xe9\x97\xbb\0"
+"ipifony.net\0"
+"a.bg\0gov.ie\0history.museum\0spy.museum\0"
+"motoyama.kochi.jp\0"
+"hattfjelldal.no\0motorcycles\0"
+"shizukuishi.iwate.jp\0"
+"gov.il\0bolzano.it\0"
+"gov.in\0"
+"uz.ua\0hughes\0"
+"gov.iq\0k12.wa.us\0"
+"gov.ir\0iwanuma.miyagi.jp\0"
+"gov.is\0"
+"gov.it\0"
+"chofu.tokyo.jp\0"
+"tank.museum\0h\xc3\xa1pmir.no\0"
+"gov.jo\0kharkiv.ua\0"
+"!city.sapporo.jp\0"
+"bmoattachments.org\0*.platformsh.site\0"
+"kawanehon.shizuoka.jp\0"
+"asda\0alpha-myqnapcloud.com\0"
+"\xc3\xa5s.no\0eidsberg.no\0"
+"gov.kg\0skodje.no\0arte\0"
+"sap\0"
+"gov.ki\0s\xc3\xb8rreisa.no\0"
+"caserta.it\0"
+"sas\0"
+"gov.km\0co.business\0"
+"gov.kn\0"
+"village.museum\0"
+"gov.kp\0dell\0"
+"gov.la\0sbi\0"
+"nakai.kanagawa.jp\0gov.lb\0to.leg.br\0"
+"gov.lc\0"
+"partners\0"
+"gov.kw\0"
+"kamikoani.akita.jp\0funahashi.toyama.jp\0"
+"accident-prevention.aero\0gov.ky\0sca\0us-3.evennode.com\0"
+"gov.kz\0scb\0"
+"gov.lk\0historical.museum\0sbs\0"
+"mutsuzawa.chiba.jp\0mibu.tochigi.jp\0"
+"hotel.hu\0serveftp.org\0"
+"gov.ma\0\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\x9f\0"
+"kitakata.miyazaki.jp\0gov.lr\0"
+"gov.ls\0hemnes.no\0bbva\0"
+"gov.lt\0"
+"gov.me\0"
+"gov.lv\0\xd8\xa7\xd9\x84\xd8\xb9\xd9\x84\xd9\x8a\xd8\xa7\xd9\x86\0"
+"gov.mg\0"
+"gov.ly\0attorney\0protonet.io\0"
+"gorizia.it\0"
+"gov.mk\0"
+"gov.ml\0"
+"omega\0"
+"sennan.osaka.jp\0oyama.tochigi.jp\0gov.mn\0"
+"gov.mo\0s\xc3\xb8mna.no\0lib.ct.us\0"
+"today\0"
+"gov.mr\0"
+"gov.ms\0"
+"biratori.hokkaido.jp\0kasama.ibaraki.jp\0"
+"gov.mu\0"
+"viterbo.it\0gov.mv\0wielun.pl\0selfip.net\0"
+"gov.mw\0gov.ng\0is-a-candidate.org\0"
+"gov.my\0roros.no\0"
+"gov.mz\0"
+"ed.ao\0society.museum\0"
+"shinanomachi.nagano.jp\0"
+"\xe7\xb6\xb2\xe7\xb5\xa1.cn\0fujikawaguchiko.yamanashi.jp\0demon.nl\0"
+"hl.no\0"
+"pyatigorsk.ru\0"
+"gov.nr\0"
+"\xe5\x85\xac\xe5\x8f\xb8.cn\0"
+"yuzawa.niigata.jp\0reisen\0run\0"
+"poa.br\0"
+"lib.mn.us\0arts.ve\0"
+"\xe5\x92\x8c\xe6\xad\x8c\xe5\xb1\xb1.jp\0"
+"beeldengeluid.museum\0habmer.no\0ses\0"
+"suisse.museum\0gov.om\0"
+"shimamaki.hokkaido.jp\0wios.gov.pl\0"
+"sew\0"
+"cuneo.it\0sex\0"
+"\xe5\x85\xac\xe5\x8f\xb8.hk\0"
+"tmall\0"
+"asia\0"
+"ed.ci\0sveio.no\0"
+"cesenaforl\xc3\xac.it\0niiza.saitama.jp\0gov.ph\0"
+"abudhabi\0us-2.evennode.com\0"
+"sfr\0"
+"gov.pk\0"
+"gov.pl\0"
+"royken.no\0rwe\0"
+"ed.cr\0gov.pn\0"
+"gov.qa\0ivano-frankivsk.ua\0bloxcms.com\0"
+"gov.pr\0"
+"gov.ps\0"
+"gov.pt\0"
+"hanawa.fukushima.jp\0"
+"tn.us\0"
+"takasago.hyogo.jp\0mishima.shizuoka.jp\0"
+"gov.py\0"
+"odessa.ua\0blogspot.co.uk\0"
+"karm\xc3\xb8y.no\0"
+"honjo.saitama.jp\0perso.sn\0"
+"shop.ht\0pv.it\0"
+"shop.hu\0"
+"bellevue.museum\0s3-website-ap-northeast-1.amazonaws.com\0"
+"asahi.mie.jp\0"
+"watch-and-clock.museum\0"
+"tokigawa.saitama.jp\0"
+"solund.no\0desi\0mycd.eu\0"
+"info.gu\0us-east-1.elasticbeanstalk.com\0"
+"perso.tn\0"
+"gov.sa\0"
+"ariake.saga.jp\0gov.sb\0"
+"gov.rs\0gov.sc\0"
+"como.it\0takagi.nagano.jp\0gov.sd\0"
+"gov.ru\0forumz.info\0"
+"search\0"
+"gov.rw\0gov.sg\0"
+"ohkura.yamagata.jp\0gov.sh\0"
+"kiyokawa.kanagawa.jp\0"
+"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0wales\0"
+"gov.sl\0"
+"movimiento.bo\0scotland.museum\0nm.us\0"
+"info.ht\0yawatahama.ehime.jp\0"
+"info.hu\0gov.so\0"
+"mansions.museum\0"
+"arts.ro\0gov.ss\0"
+"gov.st\0"
+"presse.km\0"
+"environment.museum\0"
+"gov.sx\0"
+"gov.sy\0us-1.evennode.com\0"
+"gov.tj\0"
+"bieszczady.pl\0gov.tl\0"
+"gov.tm\0"
+"info.et\0valle-daosta.it\0gov.tn\0"
+"gov.to\0"
+"higashihiroshima.hiroshima.jp\0daigo.ibaraki.jp\0iizuna.nagano.jp\0"
+"stryn.no\0gov.ua\0ski\0"
+"takatori.nara.jp\0hita.oita.jp\0gov.tr\0"
+"info.fj\0kagawa.jp\0gov.tt\0"
+"minamiyamashiro.kyoto.jp\0"
+"gov.tw\0shriram\0eu-west-2.elasticbeanstalk.com\0"
+"yoshino.nara.jp\0"
+"gov.uk\0"
+"shiojiri.nagano.jp\0"
+"suldal.no\0"
+"love\0sky\0"
+"tsugaru.aomori.jp\0mihara.hiroshima.jp\0"
+"gov.vc\0"
+"presse.ml\0"
+"gov.ve\0"
+"osakasayama.osaka.jp\0broker\0"
+"servequake.com\0"
+"iglesias-carbonia.it\0zushi.kanagawa.jp\0"
+"sb.ua\0homeftp.org\0"
+"valledaosta.it\0"
+"agro.bo\0erotika.hu\0donostia.museum\0"
+"taishin.fukushima.jp\0kep.tr\0gov.vn\0webhop.net\0"
+"casino.hu\0"
+"iitate.fukushima.jp\0"
+"ullensaker.no\0"
+"meguro.tokyo.jp\0b.ssl.fastly.net\0info.cx\0"
+"crafts.museum\0"
+"barletta-trani-andria.it\0hongo.hiroshima.jp\0"
+"judygarland.museum\0os\xc3\xb8yro.no\0onyourside\0"
+"deporte.bo\0blogspot.co.ke\0"
+"lib.vt.us\0yoga\0"
+"arts.nf\0"
+"us.eu.org\0"
+"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0ed.jp\0kwpsp.gov.pl\0"
+"info.ec\0"
+"myfritz.net\0"
+"edugit.org\0"
+"fin.tn\0"
+"trani-barletta-andria.it\0"
+"gov.ws\0"
+"kawachinagano.osaka.jp\0"
+"info.bb\0"
+"info.at\0"
+"info.au\0"
+"frontier\0"
+"britishcolumbia.museum\0"
+"info.az\0"
+"stat.no\0br\xc3\xb8nn\xc3\xb8ysund.no\0"
+"palmas.br\0"
+"leirfjord.no\0"
+"friulivgiulia.it\0higashisumiyoshi.osaka.jp\0"
+"info.bo\0kopervik.no\0spa\0"
+"fiat\0"
+"kvits\xc3\xb8y.no\0"
+"blockbuster\0"
+"vestre-toten.no\0ashgabad.su\0"
+"nakatombetsu.hokkaido.jp\0"
+"n.bg\0gov.za\0soy\0"
+"a.se\0press.se\0ma.us\0"
+"cc.pa.us\0"
+"campinas.br\0"
+"okinoshima.shimane.jp\0lancaster\0"
+"info.co\0gateway.museum\0shaw\0lima-city.rocks\0"
+"uwajima.ehime.jp\0tab\0"
+"windmill.museum\0lib.al.us\0"
+"otaru.hokkaido.jp\0\xe6\x89\x8b\xe8\xa1\xa8\0"
+"gov.zm\0"
+"mizumaki.fukuoka.jp\0"
+"drobak.no\0"
+"loginline.app\0"
+"\xe8\x87\xba\xe7\x81\xa3\0"
+"production.aero\0leadpages.co\0"
+"gov.zw\0"
+"rade.no\0"
+"debian.net\0blogspot.co.nz\0"
+"greta.fr\0oarai.ibaraki.jp\0umig.gov.pl\0"
+"medizinhistorisches.museum\0"
+"tax\0"
+"is-a-republican.com\0"
+"americanart.museum\0holdings\0"
+"ostroda.pl\0srl\0"
+"batsfjord.no\0fido\0"
+"kamifurano.hokkaido.jp\0ichinoseki.iwate.jp\0"
+"hs.run\0"
+"stranda.no\0"
+"saobernardo.br\0so.it\0kochi.kochi.jp\0gdansk.pl\0"
+"szex.hu\0"
+"chirurgiens-dentistes-en-france.fr\0"
+"homeip.net\0"
+"pub.sa\0tci\0"
+"akkeshi.hokkaido.jp\0"
+"can.museum\0"
+"ch.it\0targi.pl\0"
+"sweetpepper.org\0"
+"ericsson\0office-on-the.net\0"
+"rugby\0fr.eu.org\0"
+"suginami.tokyo.jp\0swidnica.pl\0"
+"stc\0"
+"is-very-sweet.org\0"
+"h\xc3\xb8yanger.no\0nedre-eiker.no\0"
+"bmd.br\0omiya.saitama.jp\0"
+"gets-it.net\0"
+"ed.pw\0tdk\0"
+"ryugasaki.ibaraki.jp\0obuse.nagano.jp\0"
+"ovre-eiker.no\0"
+"nahari.kochi.jp\0\xe0\xb9\x80\xe0\xb8\x99\xe0\xb9\x87\xe0\xb8\x95.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
+"\xe0\xb8\xad\xe0\xb8\x87\xe0\xb8\x84\xe0\xb9\x8c\xe0\xb8\x81\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
+"gildeskal.no\0"
+"ponpes.id\0"
+"sm\xc3\xb8la.no\0blogspot.com.cy\0"
+"mn.it\0mitake.gifu.jp\0mysecuritycamera.net\0"
+"cc.co.us\0"
+"ballangen.no\0"
+"shakotan.hokkaido.jp\0nishinomiya.hyogo.jp\0tel\0"
+"tickets\0"
+"awaji.hyogo.jp\0"
+"philadelphia.museum\0"
+"blogspot.com.ee\0"
+"lanbib.se\0blogspot.com.eg\0"
+"samegawa.fukushima.jp\0"
+"press.ma\0tonsberg.no\0"
+"trentino-aadige.it\0muika.niigata.jp\0"
+"friuli-veneziagiulia.it\0"
+"onojo.fukuoka.jp\0blogspot.com.ar\0"
+"dd-dns.de\0"
+"brother\0"
+"blogspot.com.au\0"
+"ham-radio-op.net\0"
+"masfjorden.no\0cc.ne.us\0"
+"catania.it\0"
+"nikolaev.ua\0"
+"uozu.toyama.jp\0"
+"fr\xc3\xa6na.no\0"
+"narusawa.yamanashi.jp\0"
+"spjelkavik.no\0selje.no\0est-mon-blogueur.com\0from-hi.com\0"
+"of.london\0"
+"matta-varjjat.no\0shia\0"
+"aibetsu.hokkaido.jp\0blogspot.com.br\0"
+"to.work\0"
+"zlg.br\0koto.shiga.jp\0"
+"balat.no\0"
+"is.gov.pl\0"
+"thd\0"
+"dyndns-web.com\0blogspot.com.by\0"
+"yoshida.saitama.jp\0minami-alps.yamanashi.jp\0"
+"frosinone.it\0df.leg.br\0"
+"!city.nagoya.jp\0realtor\0"
+"s3-us-west-1.amazonaws.com\0blogspot.com.co\0"
+"tono.iwate.jp\0redirectme.net\0"
+"genting\0"
+"marche.it\0"
+"nishiwaki.hyogo.jp\0"
+"austevoll.no\0"
+"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0yokkaichi.mie.jp\0"
+"education.museum\0"
+"rc.it\0in-the-band.net\0"
+"gorge.museum\0"
+"misasa.tottori.jp\0"
+"s\xc3\xb8r-varanger.no\0"
+"mishima.fukushima.jp\0"
+"svelvik.no\0"
+"assn.lk\0juif.museum\0k12.pa.us\0glade\0"
+"kaas.gg\0"
+"al.it\0"
+"channel\0"
+"floro.no\0myfirewall.org\0"
+"niepce.museum\0film\0"
+"\xe4\xbd\x90\xe8\xb3\x80.jp\0"
+"games.hu\0blogspot.com.es\0"
+"floripa.br\0"
+"info.ve\0"
+"tjx\0"
+"webcam\0azimuth.network\0"
+"flynnhosting.net\0"
+"kr.it\0"
+"cc.as.us\0"
+"info.vn\0shop.th\0"
+"\xd9\x83\xd9\x88\xd9\x85\0"
+"urn.arpa\0community-pro.de\0"
+"fujisawa.iwate.jp\0hino.tokyo.jp\0"
+"newport.museum\0overhalla.no\0"
+"ami.ibaraki.jp\0"
+"promo\0"
+"katowice.pl\0"
+"joburg\0"
+"takanezawa.tochigi.jp\0"
+"amsterdam.museum\0blogspot.co.za\0"
+"uvic.museum\0sarpsborg.no\0"
+"tamaki.mie.jp\0"
+"ipiranga\0"
+"6.bg\0essex.museum\0\xe5\x95\x86\xe6\xa0\x87\0"
+"fukuyama.hiroshima.jp\0"
+"gulen.no\0nflfan.org\0"
+"turystyka.pl\0on-the-web.tv\0"
+"cc.ky.us\0"
+"dance\0"
+"!city.yokohama.jp\0"
+"charter.aero\0"
+"utsunomiya.tochigi.jp\0"
+"info.tn\0"
+"k12.tx.us\0"
+"opole.pl\0info.tr\0"
+"edu.eu.org\0"
+"togakushi.nagano.jp\0info.tt\0"
+"gentapps.com\0shop.ro\0"
+"shop\0"
+"ozu.ehime.jp\0nirasaki.yamanashi.jp\0info.tz\0memorial\0"
+"city.hu\0k12.co.us\0lib.wy.us\0from-tx.com\0"
+"al.no\0homedns.org\0"
+"prudential\0"
+"show\0"
+"h\xc3\xa4kkinen.fi\0"
+"date.hokkaido.jp\0u.channelsdvr.net\0"
+"science.museum\0"
+"bauhaus\0"
+"maif\0"
+"r\xc3\xa6lingen.no\0"
+"pg.it\0"
+"jab.br\0saikai.nagasaki.jp\0shioya.tochigi.jp\0legnica.pl\0top\0"
+"info.ro\0"
+"iwama.ibaraki.jp\0"
+"fire\0ddns.me\0"
+"shop.pl\0\xe6\x8b\x9b\xe8\x81\x98\0"
+"info.sd\0exposed\0"
+"sibenik.museum\0"
+"iwakura.aichi.jp\0ishigaki.okinawa.jp\0"
+"toyone.aichi.jp\0minamitane.kagoshima.jp\0kunitachi.tokyo.jp\0"
+"tselinograd.su\0"
+"secure\0"
+"komoro.nagano.jp\0yaese.okinawa.jp\0"
+"\xd0\xbe\xd1\x80\xd0\xb3\0"
+"jobs\0"
+"kisarazu.chiba.jp\0fish\0"
+"n.se\0mn.us\0\xe4\xb8\xad\xe4\xbf\xa1\0"
+"wskr.gov.pl\0"
+"nalchik.ru\0"
+"info.pk\0"
+"info.pl\0nowtv\0"
+"hashimoto.wakayama.jp\0"
+"is-a-personaltrainer.com\0"
+"aisai.aichi.jp\0"
+"audi\0"
+"gz.cn\0friuli-venezia-giulia.it\0kameyama.mie.jp\0chungnam.kr\0starachowice.pl\0info.pr\0"
+"for.sale\0"
+"betainabox.com\0"
+"presse.ci\0nalchik.su\0"
+"iwate.jp\0ayabe.kyoto.jp\0"
+"ap-southeast-2.elasticbeanstalk.com\0"
+"pisz.pl\0"
+"blogspot.com.mt\0"
+"\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0misconfused.org\0"
+"agro.pl\0"
+"info.na\0ubs\0blogspot.com.ng\0my-wan.de\0"
+"svalbard.no\0valer.ostfold.no\0"
+"minowa.nagano.jp\0trv\0"
+"halloffame.museum\0v\xc3\xa5gan.no\0"
+"trentinosudtirol.it\0info.mv\0info.nf\0"
+"ohira.tochigi.jp\0"
+"info.ni\0voting\0"
+"aioi.hyogo.jp\0beer\0"
+"\xc4\x8d\xc3\xa1hcesuolo.no\0"
+"tamba.hyogo.jp\0"
+"reviews\0toyota\0"
+"\xc3\xb8rsta.no\0"
+"aurskog-h\xc3\xb8land.no\0"
+"kaizuka.osaka.jp\0info.nr\0"
+"rovigo.it\0nemuro.hokkaido.jp\0"
+"hiroshima.jp\0nagiso.nagano.jp\0"
+"gotdns.com\0"
+"piacenza.it\0rishiri.hokkaido.jp\0ng.school\0"
+"minamisanriku.miyagi.jp\0"
+"from-wy.com\0basicserver.io\0"
+"info.la\0"
+"ino.kochi.jp\0"
+"indigena.bo\0tui\0"
+"nabari.mie.jp\0"
+"baidu\0"
+"verm\xc3\xb6gensberater\0blogspot.com.tr\0"
+"foundation.museum\0"
+"al.us\0"
+"\xe6\x89\x8b\xe6\x9c\xba\0\xe7\xbd\x91\xe5\x9d\x80\0"
+"info.ls\0"
+"ehime.jp\0"
+"gen.in\0"
+"southwest.museum\0kr.ua\0"
+"ogimi.okinawa.jp\0"
+"house.museum\0k12.mi.us\0"
+"kanoya.kagoshima.jp\0schwarz\0"
+"nom.ad\0"
+"tvs\0we.bs\0nom.ae\0"
+"nyuzen.toyama.jp\0nom.af\0"
+"nom.ag\0s3-us-gov-west-1.amazonaws.com\0"
+"express\0nom.ai\0"
+"vision\0"
+"finland.museum\0thingdustdata.com\0"
+"goshiki.hyogo.jp\0nom.al\0"
+"bomlo.no\0\xd9\x85\xd8\xb5\xd8\xb1\0"
+"honjo.akita.jp\0"
+"shibata.niigata.jp\0"
+"info.ke\0hole.no\0kerrylogistics\0lefrak\0"
+"pharmacien.fr\0morimachi.shizuoka.jp\0rj.leg.br\0"
+"info.ki\0"
+"barueri.br\0yamakita.kanagawa.jp\0"
+"l\xc3\xb8""dingen.no\0dyndns-ip.com\0"
+"katsuragi.wakayama.jp\0homeftp.net\0"
+"selfip.org\0"
+"oharu.aichi.jp\0"
+"mihama.fukui.jp\0tomiya.miyagi.jp\0omachi.nagano.jp\0"
+"video\0"
+"narita.chiba.jp\0"
+"civilaviation.aero\0academy.museum\0"
+"bozen-sudtirol.it\0nom.cl\0"
+"nom.co\0agency\0"
+"divtasvuodna.no\0chrome\0glass\0ufcfan.org\0"
+"onomichi.hiroshima.jp\0tobetsu.hokkaido.jp\0shimodate.ibaraki.jp\0"
+"cc.ia.us\0"
+"hida.gifu.jp\0kartuzy.pl\0"
+"costume.museum\0plantation.museum\0"
+"shiso.hyogo.jp\0"
+"s3-ap-southeast-2.amazonaws.com\0"
+"bi.it\0"
+"yamagata.yamagata.jp\0"
+"jewishart.museum\0gen.ng\0"
+"lincoln\0"
+"oracle\0silk\0certmgr.org\0blogspot.com.uy\0"
+"smola.no\0"
+"shimokitayama.nara.jp\0adachi.tokyo.jp\0\xda\x80\xd8\xa7\xd8\xb1\xd8\xaa\0legal\0"
+"mashike.hokkaido.jp\0"
+"grosseto.it\0katsuyama.fukui.jp\0"
+"broker.aero\0nom.es\0"
+"odate.akita.jp\0"
+"for-some.biz\0"
+"reg.dk\0"
+"hakuba.nagano.jp\0toda.saitama.jp\0gen.nz\0"
+"js.cn\0lo.it\0"
+"sina\0"
+"nom.fr\0"
+"international\0nom.gd\0"
+"nom.ge\0"
+"suifu.ibaraki.jp\0"
+"sakura\0"
+"dynamisches-dns.de\0freeddns.org\0"
+"kiyosu.aichi.jp\0nom.gl\0"
+"vinnytsia.ua\0"
+"sjc.br\0motobu.okinawa.jp\0"
+"kanazawa.ishikawa.jp\0nom.gt\0"
+"foodnetwork\0mc.eu.org\0"
+"shiiba.miyazaki.jp\0blackbaudcdn.net\0ptplus.fit\0"
+"paderborn.museum\0osen.no\0"
+"ukiha.fukuoka.jp\0"
+"gripe\0"
+"16-b.it\0"
+"qld.gov.au\0barrel-of-knowledge.info\0"
+"higashishirakawa.gifu.jp\0kadogawa.miyazaki.jp\0"
+"aizubange.fukushima.jp\0nom.hn\0"
+"ayase.kanagawa.jp\0"
+"uno\0"
+"bible.museum\0"
+"ujitawara.kyoto.jp\0"
+"from-ky.com\0"
+"tsukuba.ibaraki.jp\0"
+"bristol.museum\0"
+"taishi.osaka.jp\0"
+"murata.miyagi.jp\0"
+"nom.im\0"
+"yuza.yamagata.jp\0center\0uol\0\xe6\x85\x88\xe5\x96\x84\0"
+"balsan-sudtirol.it\0isshiki.aichi.jp\0"
+"kudoyama.wakayama.jp\0"
+"lt.eu.org\0"
+"sondrio.it\0"
+"memorial.museum\0"
+"kicks-ass.net\0"
+"de.us\0tunes\0is-a-anarchist.com\0"
+"nx.cn\0pt.it\0midori.chiba.jp\0"
+"tsuruga.fukui.jp\0"
+"chuo.tokyo.jp\0"
+"cranbrook.museum\0kvam.no\0selbu.no\0from-id.com\0"
+"deatnu.no\0ups\0nom.ke\0"
+"frogn.no\0"
+"and.mom\0"
+"nom.km\0mysecuritycamera.org\0"
+"kviteseid.no\0tran\xc3\xb8y.no\0"
+"terni.it\0gen.tr\0best\0"
+"asahi.chiba.jp\0kibichuo.okayama.jp\0"
+"osteroy.no\0"
+"consulado.st\0"
+"uhren.museum\0"
+"yn.cn\0shizuoka.jp\0"
+"nom.li\0"
+"auto\0"
+"higashikawa.hokkaido.jp\0okayama.okayama.jp\0"
+"lib.ar.us\0"
+"kainan.wakayama.jp\0"
+"def.br\0trentino-altoadige.it\0"
+"site\0linkitools.space\0"
+"foz.br\0"
+"\xd9\x87\xd9\x85\xd8\xb1\xd8\xa7\xd9\x87\0"
+"cdn77-ssl.net\0"
+"baseball.museum\0gloppen.no\0"
+"nom.mg\0ambulance.museum\0"
+"historicalsociety.museum\0mansion.museum\0strand.no\0infiniti\0"
+"club.aero\0k12.ia.us\0nom.mk\0"
+"shikokuchuo.ehime.jp\0"
+"s3-eu-central-1.amazonaws.com\0"
+"mukawa.hokkaido.jp\0"
+"wafflecell.com\0"
+"watari.miyagi.jp\0"
+"sydney.museum\0esurance\0"
+"mie.jp\0"
+"nom.nc\0"
+"is-a-lawyer.com\0"
+"massacarrara.it\0miyama.mie.jp\0shiogama.miyagi.jp\0"
+"nom.ni\0dvrcam.info\0"
+"*.dapps.earth\0"
+"nachikatsuura.wakayama.jp\0*.telebit.xyz\0"
+"alipay\0"
+"cooperativa.bo\0mangyshlak.su\0"
+"kumamoto.kumamoto.jp\0suwalki.pl\0"
+"sellsyourhome.org\0"
+"evje-og-hornnes.no\0"
+"h\xc3\xa1mm\xc3\xa1rfeasta.no\0nom.nu\0"
+"enterprises\0"
+"is-a-designer.com\0"
+"stpetersburg.museum\0"
+"kumano.mie.jp\0ath.cx\0"
+"\xd9\x85\xd9\x84\xd9\x8a\xd8\xb3\xd9\x8a\xd8\xa7\0"
+"nom.pa\0"
+"kure.hiroshima.jp\0"
+"es.eu.org\0"
+"matsuyama.ehime.jp\0minami.kyoto.jp\0"
+"net.ac\0nom.pe\0is-into-cartoons.com\0"
+"wloclawek.pl\0vet\0"
+"net.ae\0"
+"net.af\0"
+"net.ag\0"
+"*.lcl.dev\0"
+"net.ai\0"
+"nom.pl\0"
+"fauske.no\0sola.no\0"
+"net.al\0"
+"net.am\0nesset.no\0"
+"on.fashion\0"
+"technology.museum\0nom.qa\0"
+"net.ba\0davvesiida.no\0club.tw\0"
+"net.ar\0net.bb\0"
+"net.au\0nom.pw\0"
+"anan.tokushima.jp\0"
+"gs.st.no\0"
+"net.bh\0"
+"k12.nh.us\0"
+"net.az\0"
+"net.bm\0asker.no\0b\xc3\xa1hcavuotna.no\0grue.no\0lilly\0is-a-painter.com\0freedesktop.org\0"
+"net.bn\0"
+"net.bo\0info.zm\0\xe7\xbd\x91\xe7\xab\x99\0"
+"net.br\0"
+"net.bs\0nom.re\0"
+"net.bt\0trentinsud-tirol.it\0"
+"l.bg\0myvnc.com\0"
+"net.ci\0"
+"net.bz\0rr.leg.br\0mymediapc.net\0"
+"marine.ru\0"
+"net.cm\0nom.ro\0serveftp.com\0"
+"net.cn\0yokote.akita.jp\0"
+"net.co\0"
+"carboniaiglesias.it\0"
+"v\xc3\xa6r\xc3\xb8y.no\0zara\0nom.rs\0"
+"twmail.net\0"
+"dr.na\0"
+"\xe4\xb8\x96\xe7\x95\x8c\0"
+"net.cu\0oystre-slidre.no\0"
+"padova.it\0"
+"net.cw\0vig\0builtwithdark.com\0nom.si\0"
+"machida.tokyo.jp\0"
+"net.cy\0s3-website.eu-central-1.amazonaws.com\0"
+"\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa7\0"
+"natori.miyagi.jp\0"
+"net.dm\0\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa9\0"
+"vin\0"
+"net.do\0app.lmpm.com\0"
+"vip\0"
+"archaeology.museum\0salat.no\0passagens\0"
+"eng.br\0nom.st\0"
+"net.ec\0"
+"osoyro.no\0"
+"nishi.osaka.jp\0oyabe.toyama.jp\0"
+"net.eg\0research.museum\0lugs.org.uk\0"
+"nom.tj\0"
+"s3-website-eu-west-1.amazonaws.com\0"
+"net.dz\0rs.leg.br\0sc.leg.br\0"
+"nom.tm\0"
+"cultural.museum\0historisches.museum\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa5\x8d\0"
+"kokonoe.oita.jp\0"
+"cc.in.us\0"
+"oirase.aomori.jp\0"
+"adygeya.su\0"
+"net.et\0"
+"nom.ug\0"
+"emiliaromagna.it\0"
+"tr\xc3\xa6na.no\0"
+"net.fj\0takasaki.gunma.jp\0"
+"hirakata.osaka.jp\0",
+
+"diet\0"
+"mordovia.su\0nom.vc\0"
+"tourism.tn\0"
+"taobao\0"
+"bihoro.hokkaido.jp\0instantcloud.cn\0"
+"net.ge\0nom.vg\0"
+"kamitonda.wakayama.jp\0"
+"net.gg\0nom.uy\0"
+"williamsburg.museum\0flights\0"
+"net.gl\0"
+"chattanooga.museum\0"
+"net.gn\0"
+"net.gp\0"
+"net.gr\0"
+"fet.no\0"
+"net.gt\0"
+"net.gu\0uber.space\0"
+"shisui.chiba.jp\0moriya.ibaraki.jp\0"
+"net.gy\0corporation.museum\0"
+"net.hk\0is-a-geek.com\0"
+"odo.br\0"
+"net.hn\0nisshin.aichi.jp\0"
+"msk.ru\0xnbay.com\0"
+"takazaki.miyazaki.jp\0"
+"from-de.com\0is-a-financialadvisor.com\0"
+"tomari.hokkaido.jp\0"
+"localhistory.museum\0mk.eu.org\0adygeya.ru\0"
+"net.ht\0net.id\0tokyo.jp\0"
+"apps.lair.io\0"
+"pa.gov.br\0ba.leg.br\0"
+"g\xc3\xa1ivuotna.no\0"
+"net.il\0"
+"net.im\0"
+"vet.br\0net.in\0novara.it\0"
+"msk.su\0"
+"net.iq\0muenster.museum\0cc.ms.us\0cc.nc.us\0mordovia.ru\0"
+"net.ir\0"
+"net.is\0"
+"neyagawa.osaka.jp\0"
+"net.je\0"
+"mediocampidano.it\0venice.it\0"
+"rauma.no\0mydrobo.com\0"
+"kadoma.osaka.jp\0"
+"net.jo\0nordkapp.no\0nom.za\0"
+"s3-website-ap-southeast-1.amazonaws.com\0"
+"!city.kitakyushu.jp\0kofu.yamanashi.jp\0makeup\0"
+"dr.tr\0"
+"app.os.stg.fedoraproject.org\0"
+"net.kg\0"
+"pb.gov.br\0"
+"pe.ca\0net.ki\0rygge.no\0"
+"rn.leg.br\0wedeploy.sh\0"
+"cc.wy.us\0"
+"asahi.yamagata.jp\0"
+"gen.mi.us\0"
+"ibaraki.jp\0ogose.saitama.jp\0nichinan.tottori.jp\0net.kn\0"
+"\xe6\x84\x9b\xe7\x9f\xa5.jp\0"
+"net.la\0lib.id.us\0"
+"pol.dz\0shichinohe.aomori.jp\0net.lb\0"
+"net.lc\0"
+"trento.it\0miasa.nagano.jp\0"
+"jprs\0mein-iserv.de\0"
+"ra.it\0takatsuki.osaka.jp\0"
+"net.kw\0volkenkunde.museum\0"
+"net.ky\0work\0readmyblog.org\0"
+"uchihara.ibaraki.jp\0net.kz\0"
+"net.lk\0"
+"\xe7\x86\x8a\xe6\x9c\xac.jp\0unazuki.toyama.jp\0"
+"it.ao\0cahcesuolo.no\0lifeinsurance\0"
+"higashikagura.hokkaido.jp\0ama.shimane.jp\0"
+"vao.it\0togane.chiba.jp\0"
+"net.ma\0amfam\0fi.eu.org\0"
+"miyazaki.jp\0net.lr\0"
+"net.ls\0lu.eu.org\0me.eu.org\0"
+"takayama.gunma.jp\0"
+"net.me\0"
+"net.lv\0"
+"amazon\0"
+"net.ly\0alaska.museum\0"
+"tohma.hokkaido.jp\0seika.kyoto.jp\0ro.leg.br\0"
+"net.mk\0"
+"net.ml\0"
+"volvo\0lpages.co\0"
+"takikawa.hokkaido.jp\0"
+"net.mo\0grandrapids.museum\0sweden.museum\0oh.us\0"
+"kinko.kagoshima.jp\0"
+"net.ms\0\xd8\xa8\xd8\xa7\xd8\xb2\xd8\xa7\xd8\xb1\0spdns.eu\0myforum.community\0"
+"aizumi.tokushima.jp\0net.mt\0"
+"net.mu\0labor.museum\0moskenes.no\0"
+"net.mv\0net.nf\0dynathome.net\0"
+"net.mw\0net.ng\0"
+"taa.it\0net.mx\0"
+"utah.museum\0net.my\0net.ni\0vard\xc3\xb8.no\0"
+"bologna.it\0uki.kumamoto.jp\0net.mz\0"
+"hol.no\0vestre-slidre.no\0"
+"diskstation.org\0"
+"anani.br\0"
+"\xe5\xa4\xa7\xe5\x88\x86.jp\0zgorzelec.pl\0"
+"catering\0"
+"net.nr\0"
+"lv.eu.org\0"
+"stalowa-wola.pl\0expert\0"
+"nanporo.hokkaido.jp\0net.nz\0wif.gov.pl\0"
+"pol.ht\0"
+"net.om\0travelers\0\xd1\x80\xd1\x83\xd1\x81\0"
+"nakagyo.kyoto.jp\0"
+"net.pa\0lib.ma.us\0realty\0chimkent.su\0"
+"4.bg\0"
+"wed\0"
+"plurinacional.bo\0froland.no\0net.pe\0"
+"tj.cn\0trentins\xc3\xbc""d-tirol.it\0niimi.okayama.jp\0kaminokawa.tochigi.jp\0"
+"net.ph\0"
+"harvestcelebration.museum\0judaica.museum\0"
+"airtel\0"
+"rad\xc3\xb8y.no\0net.pk\0"
+"net.pl\0static.land\0"
+"sm.ua\0"
+"net.pn\0"
+"gotpantheon.com\0"
+"trentins\xc3\xbc""dtirol.it\0"
+"net.qa\0cyou\0"
+"net.pr\0""32-b.it\0"
+"net.ps\0"
+"net.pt\0jp.net\0"
+"baltimore.museum\0ralingen.no\0"
+"indianapolis.museum\0"
+"*.elb.amazonaws.com.cn\0am.leg.br\0"
+"net.py\0"
+"k12.de.us\0"
+"repl.run\0"
+"kirkenes.no\0"
+"yurihonjo.akita.jp\0rzgw.gov.pl\0"
+"lotte\0"
+"savona.it\0rocher\0"
+"yufu.oita.jp\0"
+"slask.pl\0cloudeity.net\0"
+"marylhurst.museum\0"
+"laquila.it\0"
+"lotto\0"
+"hiphop\0"
+"association.aero\0"
+"pe.it\0wada.nagano.jp\0"
+"noto.ishikawa.jp\0"
+"s\xc3\xb8rfold.no\0"
+"tourism.pl\0flir\0monster\0"
+"net.sa\0"
+"net.sb\0"
+"net.sc\0"
+"toyoura.hokkaido.jp\0net.sd\0"
+"k12.ok.us\0is-a-geek.org\0net.ru\0"
+"tmp.br\0winb.gov.pl\0"
+"net.rw\0net.sg\0"
+"net.sh\0skin\0"
+"from-md.com\0"
+"net.sl\0"
+"hasami.nagasaki.jp\0support\0"
+"aaa.pro\0net.so\0"
+"lindas.no\0"
+"bhz.br\0"
+"y.bg\0net.ss\0spdns.de\0"
+"net.st\0dish\0"
+"l.se\0"
+"pfizer\0"
+"marshalls\0"
+"net.th\0"
+"net.sy\0"
+"iwaizumi.iwate.jp\0pe.kr\0net.tj\0"
+"*.stolos.io\0"
+"sakado.saitama.jp\0"
+"net.tm\0"
+"naples.it\0net.tn\0win\0"
+"net.to\0"
+"tonosho.kagawa.jp\0"
+"vf.no\0net.ua\0\xd0\xbe\xd0\xb4.\xd1\x81\xd1\x80\xd0\xb1\0"
+"gx.cn\0net.tr\0"
+"paragliding.aero\0"
+"net.tt\0"
+"ltda\0"
+"ing.pa\0net.tw\0simple-url.com\0wedeploy.me\0"
+"trentinoalto-adige.it\0shiranuka.hokkaido.jp\0"
+"maebashi.gunma.jp\0gdynia.pl\0"
+"langevag.no\0net.uk\0k12.il.us\0"
+"sodegaura.chiba.jp\0psse.gov.pl\0"
+"\xe7\xbd\x91\xe7\xb5\xa1.hk\0net.vc\0dynns.com\0"
+"hjelmeland.no\0net.ve\0ca-central-1.elasticbeanstalk.com\0"
+"ibaraki.osaka.jp\0"
+"ivanovo.su\0"
+"community.museum\0f\xc3\xb8rde.no\0net.uy\0net.vi\0"
+"napoli.it\0matsudo.chiba.jp\0namikata.ehime.jp\0net.uz\0"
+"krokstadelva.no\0"
+"engineer\0"
+"net.vn\0\xe3\x82\xb9\xe3\x83\x88\xe3\x82\xa2\0"
+"kusu.oita.jp\0takahata.yamagata.jp\0"
+"historichouses.museum\0kr.eu.org\0"
+"net.vu\0"
+"steam.museum\0h\xc3\xa5.no\0"
+"cs.it\0ap.leg.br\0"
+"kicks-ass.org\0"
+"dnsalias.net\0"
+"monmouth.museum\0voyage\0"
+"yamagata.jp\0"
+"ap-northeast-1.elasticbeanstalk.com\0"
+"hakone.kanagawa.jp\0kumiyama.kyoto.jp\0"
+"my.id\0"
+"government.aero\0net.ws\0"
+"int.ar\0"
+"sandnessj\xc3\xb8""en.no\0wme\0dyn.cosidns.de\0"
+"yachiyo.chiba.jp\0"
+"telebit.io\0"
+"int.az\0"
+"lib.fl.us\0is-a-rockstar.com\0"
+"int.bo\0barsyonline.com\0"
+"elk.pl\0development.run\0"
+"varggat.no\0"
+"pi.gov.br\0shinichi.hiroshima.jp\0"
+"linde\0"
+"se.leg.br\0"
+"int.ci\0"
+"nishiaizu.fukushima.jp\0"
+"b\xc3\xa1l\xc3\xa1t.no\0"
+"online.th\0"
+"co.com\0"
+"int.co\0net.za\0mine.nu\0"
+"shell.museum\0"
+"shimada.shizuoka.jp\0freeboxos.fr\0"
+"vm.bytemark.co.uk\0"
+"mmafan.biz\0"
+"tysvar.no\0"
+"\xd0\xb0\xd0\xba.\xd1\x81\xd1\x80\xd0\xb1\0net.zm\0"
+"arna.no\0rightathome\0"
+"asti.it\0"
+"0e.vc\0"
+"wow\0"
+"nishinoomote.kagoshima.jp\0"
+"chiryu.aichi.jp\0pol.tr\0"
+"\xd1\x81\xd1\x80\xd0\xb1\0"
+"microlight.aero\0"
+"ohi.fukui.jp\0"
+"selfip.biz\0"
+"chanel\0"
+"\xe4\xba\xac\xe9\x83\xbd.jp\0"
+"minamiuonuma.niigata.jp\0definima.net\0"
+"circle\0"
+"gamo.shiga.jp\0"
+"rn.it\0shikatsu.aichi.jp\0"
+"oster\xc3\xb8y.no\0"
+"miyakonojo.miyazaki.jp\0"
+"textile.museum\0"
+"getmyip.com\0"
+"tsuruoka.yamagata.jp\0"
+"winners\0"
+"risor.no\0us-east-2.elasticbeanstalk.com\0"
+"bg.it\0"
+"s3.dualstack.ap-southeast-2.amazonaws.com\0"
+"nakagusuku.okinawa.jp\0"
+"freiburg.museum\0"
+"abr.it\0"
+"sugito.saitama.jp\0"
+"theworkpc.com\0"
+"taifun-dns.de\0"
+"montreal.museum\0sumy.ua\0wtc\0"
+"ybo.faith\0"
+"hareid.no\0rocks\0"
+"wtf\0"
+"yosemite.museum\0\xe5\x95\x86\xe6\xa5\xad.tw\0"
+"uruma.okinawa.jp\0"
+"h\xc3\xa6gebostad.no\0"
+"vaporcloud.io\0"
+"newhampshire.museum\0"
+"war.museum\0bloomberg\0"
+"int.is\0eu-west-3.elasticbeanstalk.com\0"
+"alwaysdata.net\0"
+"amber.museum\0"
+"gobo.wakayama.jp\0"
+"troms\xc3\xb8.no\0"
+"map.fastlylb.net\0"
+"mod.gi\0"
+"tw.cn\0vs.it\0takayama.nagano.jp\0hino.tottori.jp\0"
+"chernigov.ua\0cc.md.us\0"
+"pe.gov.br\0"
+"noboribetsu.hokkaido.jp\0"
+"artgallery.museum\0sochi.su\0"
+"wolterskluwer\0"
+"encyclopedic.museum\0pilots.museum\0of.work\0"
+"kamikawa.hyogo.jp\0kinghost.net\0"
+"lenug.su\0"
+"milan.it\0mutual\0"
+"isteingeek.de\0wedeploy.io\0"
+"int.la\0sk\xc3\xa1nit.no\0"
+"richardli\0"
+"barsy.net\0"
+"eurovision\0"
+"ravendb.community\0"
+"salud.bo\0art.museum\0energy\0"
+"int.lk\0bahcavuotna.no\0"
+"fuchu.tokyo.jp\0"
+"dnipropetrovsk.ua\0"
+"obama.fukui.jp\0"
+"of.by\0lib.gu.us\0"
+"nishiarita.saga.jp\0for-better.biz\0"
+"dc.us\0lasalle\0"
+"pr.it\0higashimatsushima.miyagi.jp\0"
+"chikuzen.fukuoka.jp\0"
+"in-butter.de\0"
+"tranibarlettaandria.it\0"
+"yanaizu.fukushima.jp\0int.mv\0"
+"int.mw\0stage.nodeart.io\0"
+"int.ni\0"
+"ebino.miyazaki.jp\0"
+"askvoll.no\0"
+"xin\0"
+"stockholm.museum\0mosj\xc3\xb8""en.no\0shiksha\0"
+"\xe7\x9f\xb3\xe5\xb7\x9d.jp\0okazaki.aichi.jp\0"
+"manx.museum\0y.se\0"
+"homegoods\0\xd7\xa7\xd7\x95\xd7\x9d\0"
+"host\0"
+"from-ga.com\0"
+"val-d-aosta.it\0"
+"farsund.no\0"
+"is-saved.org\0"
+"maringa.br\0yamada.fukuoka.jp\0"
+"omi.nagano.jp\0nerima.tokyo.jp\0olayan\0"
+"is-an-engineer.com\0"
+"glogow.pl\0report\0"
+"sk.ca\0durham.museum\0donna.no\0"
+"flanders.museum\0florida.museum\0"
+"goodyear\0"
+"pa.gov.pl\0"
+"customer.speedpartner.de\0"
+"int.pt\0"
+"meet\0"
+"alta.no\0"
+"aip.ee\0"
+"itami.hyogo.jp\0ota.tokyo.jp\0"
+"jur.pro\0"
+"grondar.za\0"
+"yokaichiba.chiba.jp\0"
+"twmail.org\0"
+"kochi.jp\0"
+"union.aero\0vinnica.ua\0armenia.su\0"
+"eiheiji.fukui.jp\0"
+"caravan\0"
+"sel.no\0firestone\0"
+"kuji.iwate.jp\0"
+"from-ca.com\0"
+"toya.hokkaido.jp\0kagamino.okayama.jp\0"
+"url.tw\0"
+"shiroishi.saga.jp\0"
+"rodeo\0"
+"biei.hokkaido.jp\0takasu.hokkaido.jp\0koryo.nara.jp\0"
+"journal.aero\0"
+"kasahara.gifu.jp\0tomioka.gunma.jp\0"
+"avocat.pro\0paroch.k12.ma.us\0"
+"abu.yamaguchi.jp\0klodzko.pl\0"
+"kiev.ua\0int.ru\0selfip.com\0"
+"mazury.pl\0"
+"stalbans.museum\0"
+"astronomy.museum\0"
+"health.nz\0"
+"l\xc3\xa6rdal.no\0"
+"konin.pl\0"
+"leitungsen.de\0myravendb.com\0"
+"int.tj\0"
+"columbus.museum\0"
+"nomi.ishikawa.jp\0seoul.kr\0"
+"computerhistory.museum\0stord.no\0cleaning\0"
+"lplfinancial\0"
+"here-for-more.info\0"
+"myoko.niigata.jp\0"
+"lima.zone\0"
+"j.bg\0settlers.museum\0"
+"eco.br\0minamifurano.hokkaido.jp\0int.tt\0"
+"pr.gov.br\0"
+"miniserver.com\0"
+"baseball\0"
+"minnesota.museum\0"
+"nesna.no\0progressive\0"
+"banamex\0"
+"westfalen.museum\0is-a-nurse.com\0"
+"chosei.chiba.jp\0orx.biz\0"
+"scienceandindustry.museum\0us-east-1.amazonaws.com\0"
+"int.ve\0"
+"salvador.br\0ikeda.fukui.jp\0"
+"\xe9\xb3\xa5\xe5\x8f\x96.jp\0"
+"toyokawa.aichi.jp\0kotoura.tottori.jp\0int.vn\0"
+"futaba.fukushima.jp\0"
+"eu.com\0"
+"sayo.hyogo.jp\0bielawa.pl\0"
+"v\xc3\xa5gs\xc3\xb8y.no\0"
+"t\xc3\xb8nsberg.no\0"
+"gitlab.io\0"
+"inabe.mie.jp\0co.education\0"
+"fam.pk\0fl.us\0"
+"cc.il.us\0"
+"jdf.br\0"
+"pacific.museum\0"
+"perugia.it\0"
+"abc.br\0"
+"n\xc3\xa5\xc3\xa5mesjevuemie.no\0k12.ri.us\0"
+"kanuma.tochigi.jp\0poznan.pl\0"
+"of.no\0meme\0"
+"ah.cn\0bt.it\0"
+"frei.no\0spb.ru\0"
+"ferrara.it\0kusatsu.shiga.jp\0"
+"barsy.pro\0"
+"management\0is-a-geek.net\0"
+"melbourne\0"
+"horten.no\0"
+"pr.us\0\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0"
+"ozora.hokkaido.jp\0"
+"accenture\0"
+"radio.br\0"
+"spb.su\0"
+"slupsk.pl\0"
+"bruxelles.museum\0kafjord.no\0"
+"himeshima.oita.jp\0limanowa.pl\0"
+"kragero.no\0stj\xc3\xb8rdal.no\0"
+"sirdal.no\0"
+"friuliv-giulia.it\0\xe9\xa6\x99\xe5\xb7\x9d.jp\0"
+"menu\0is-an-actress.com\0"
+"kota.aichi.jp\0mihama.mie.jp\0"
+"andoy.no\0"
+"zgora.pl\0"
+"living.museum\0gwiddle.co.uk\0"
+"barsy.pub\0"
+"shinyoshitomi.fukuoka.jp\0"
+"fredrikstad.no\0markets\0"
+"health.vn\0"
+"l\xc3\xb8ten.no\0"
+"kamogawa.chiba.jp\0shinto.gunma.jp\0"
+"freebox-os.com\0"
+"is-very-nice.org\0"
+"gaivuotna.no\0"
+"mochizuki.nagano.jp\0shinjo.yamagata.jp\0\xe8\x81\x94\xe9\x80\x9a\0"
+"film.hu\0skanit.no\0*.moonscale.io\0"
+"from-ar.com\0"
+"bindal.no\0giving\0"
+"coffee\0"
+"from-wa.com\0"
+"yamanashi.jp\0"
+"catering.aero\0dp.ua\0"
+"johana.toyama.jp\0"
+"s3.dualstack.us-east-1.amazonaws.com\0"
+"toon.ehime.jp\0"
+"nannestad.no\0"
+"takahagi.ibaraki.jp\0"
+"stavern.no\0business\0"
+"tochio.niigata.jp\0barclaycard\0\xe6\x94\xbf\xe5\xba\x9c\0"
+"bodo.no\0"
+"bryansk.su\0"
+"shimizu.shizuoka.jp\0"
+"cadaques.museum\0bike\0"
+"cust.testing.thingdust.io\0"
+"ggf.br\0"
+"natuurwetenschappen.museum\0"
+"xxx\0"
+"l\xc3\xb8renskog.no\0"
+"takehara.hiroshima.jp\0horonobe.hokkaido.jp\0"
+"cremona.it\0nishiazai.shiga.jp\0"
+"haebaru.okinawa.jp\0"
+"yatomi.aichi.jp\0shibata.miyagi.jp\0hangout\0"
+"pesarourbino.it\0kushiro.hokkaido.jp\0toyono.osaka.jp\0"
+"shopping\0land-4-sale.us\0"
+"kiyose.tokyo.jp\0"
+"tsurugashima.saitama.jp\0xyz\0"
+"is-a-libertarian.com\0"
+"nv.us\0"
+"kashiwazaki.niigata.jp\0"
+"yame.fukuoka.jp\0"
+"aver\xc3\xb8y.no\0namdalseid.no\0"
+"koshu.yamanashi.jp\0"
+"is-lost.org\0"
+"toyama.jp\0haga.tochigi.jp\0"
+"karpacz.pl\0\xd1\x83\xd0\xba\xd1\x80\0storage.yandexcloud.net\0"
+"kaho.fukuoka.jp\0"
+"vic.gov.au\0gratangen.no\0bing\0"
+"shintomi.miyazaki.jp\0unzen.nagasaki.jp\0"
+"k12.in.us\0"
+"himeji.hyogo.jp\0"
+"sandiego.museum\0"
+"salangen.no\0"
+"hasuda.saitama.jp\0"
+"artanddesign.museum\0"
+"elasticbeanstalk.com\0"
+"kumamoto.jp\0sakai.osaka.jp\0kurobe.toyama.jp\0"
+"bronnoysund.no\0"
+"hagi.yamaguchi.jp\0"
+"2.bg\0"
+"contact\0"
+"tienda\0"
+"sx.cn\0"
+"fundacio.museum\0tjeldsund.no\0"
+"tako.chiba.jp\0tsukumi.oita.jp\0usuki.oita.jp\0fhapp.xyz\0"
+"tsuno.miyazaki.jp\0"
+"yotsukaido.chiba.jp\0"
+"hembygdsforbund.museum\0s\xc3\xb8r-aurdal.no\0"
+"cq.cn\0akagi.shimane.jp\0"
+"krym.ua\0"
+"otoineppu.hokkaido.jp\0czest.pl\0"
+"komagane.nagano.jp\0"
+"shikama.miyagi.jp\0"
+"\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0"
+"k12.dc.us\0luxe\0"
+"kanonji.kagawa.jp\0"
+"ah.no\0"
+"fuchu.hiroshima.jp\0"
+"kyoto\0"
+"hoteles\0tatamotors\0point2this.com\0"
+"xbox\0"
+"fidelity\0"
+"pc.it\0"
+"my-gateway.de\0"
+"dynu.net\0"
+"s\xc3\xb8r-fron.no\0"
+"physio\0"
+"gv.ao\0"
+"po.gov.pl\0freebox-os.fr\0"
+"botanical.museum\0"
+"mosjoen.no\0you\0nohost.me\0"
+"gv.at\0"
+"logoip.com\0"
+"\xe7\xb6\xb2\xe7\xb5\xa1.\xe9\xa6\x99\xe6\xb8\xaf\0miami\0"
+"dnsalias.org\0"
+"w.bg\0vennesla.no\0scholarships\0"
+"ofunato.iwate.jp\0"
+"bashkiria.ru\0"
+"karmoy.no\0"
+"design.aero\0"
+"marburg.museum\0selfip.info\0"
+"hazu.aichi.jp\0itayanagi.aomori.jp\0"
+"ng.ink\0"
+"ginoza.okinawa.jp\0"
+"seljord.no\0"
+"sncf\0"
+"bashkiria.su\0"
+"tsuyama.okayama.jp\0okinawa.okinawa.jp\0"
+"toei.aichi.jp\0ichinohe.iwate.jp\0"
+"hiji.oita.jp\0cancerresearch\0"
+"trentinsued-tirol.it\0kamioka.akita.jp\0"
+"boston.museum\0kddi\0"
+"bungotakada.oita.jp\0"
+"kristiansand.no\0"
+"reggiocalabria.it\0"
+"barcelona\0asso.eu.org\0"
+"nagara.chiba.jp\0hidaka.saitama.jp\0"
+"building.museum\0amica\0"
+"dnsking.ch\0"
+"kitaakita.akita.jp\0"
+"arteducation.museum\0barsy.org\0"
+"of.football\0"
+"medecin.km\0zaporizhzhe.ua\0"
+"kihoku.ehime.jp\0"
+"bedzin.pl\0"
+"pmn.it\0"
+"soc.lk\0filegear-au.me\0"
+"ogori.fukuoka.jp\0naka.hiroshima.jp\0"
+"usculture.museum\0"
+"\xd1\x83\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0"
+"cloudfront.net\0"
+"gs.hm.no\0fr\xc3\xb8ya.no\0tysnes.no\0"
+"pvh.br\0kounosu.saitama.jp\0"
+"lib.vi.us\0is-a-techie.com\0"
+"virginia.museum\0homes\0"
+"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0"
+"maceio.br\0"
+"yukuhashi.fukuoka.jp\0"
+"hk.com\0"
+"intuit\0"
+"nakijin.okinawa.jp\0"
+"woodside\0"
+"kamiamakusa.kumamoto.jp\0yun\0"
+"omuta.fukuoka.jp\0"
+"wa.au\0user.party.eus\0in-dsl.de\0"
+"pc.pl\0turek.pl\0"
+"katagami.akita.jp\0"
+"klepp.no\0realestate\0is-a-doctor.com\0"
+"ilawa.pl\0"
+"trondheim.no\0"
+"shiki.saitama.jp\0ce.leg.br\0"
+"tagami.niigata.jp\0"
+"nishiokoppe.hokkaido.jp\0hizen.saga.jp\0"
+"ppg.br\0"
+"bergen.no\0"
+"from.hr\0"
+"figueres.museum\0"
+"nordreisa.no\0"
+"digital\0"
+"pizza\0s3-website.ap-south-1.amazonaws.com\0"
+"\xe7\xbd\x91\xe7\xbb\x9c\0"
+"jp.eu.org\0"
+"cri.br\0"
+"fj.cn\0ishikawa.okinawa.jp\0"
+"artdeco.museum\0"
+"agdenes.no\0"
+"pp.az\0avoues.fr\0"
+"cinema.museum\0"
+"verona.it\0kameoka.kyoto.jp\0"
+"ut.us\0"
+"asuke.aichi.jp\0"
+"r\xc3\xb8yken.no\0"
+"namegawa.saitama.jp\0minobu.yamanashi.jp\0"
+"zero\0"
+"miyako.iwate.jp\0zip\0"
+"pavia.it\0venezia.it\0"
+"conf.au\0\xe7\x82\xb9\xe7\x9c\x8b\0*.advisor.ws\0"
+"county.museum\0forgot.his.name\0keymachine.de\0"
+"hadano.kanagawa.jp\0olawa.pl\0"
+"rec.br\0"
+"steiermark.museum\0"
+"oxford.museum\0"
+"oceanographic.museum\0yombo.me\0"
+"madrid\0"
+"no-ip.ca\0"
+"lapy.pl\0\xe0\xb8\xa8\xe0\xb8\xb6\xe0\xb8\x81\xe0\xb8\xa9\xe0\xb8\xb2.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
+"rec.co\0k12.ak.us\0"
+"writesthisblog.com\0"
+"kusatsu.gunma.jp\0"
+"okinawa\0"
+"cc.sc.us\0"
+"my-router.de\0"
+"chichibu.saitama.jp\0"
+"control.aero\0oppeg\xc3\xa5rd.no\0"
+"trogstad.no\0"
+"onga.fukuoka.jp\0"
+"lindesnes.no\0"
+"aki.kochi.jp\0"
+"karelia.su\0"
+"kakamigahara.gifu.jp\0"
+"botanicalgarden.museum\0"
+"christiansburg.museum\0"
+"food\0freetls.fastly.net\0"
+"statebank\0"
+"ena.gifu.jp\0achi.nagano.jp\0minamiizu.shizuoka.jp\0"
+"lib.mt.us\0lib.nd.us\0svn-repos.de\0"
+"iida.nagano.jp\0govt.nz\0"
+"harstad.no\0"
+"its.me\0"
+"isen.kagoshima.jp\0"
+"railroad.museum\0her\xc3\xb8y.nordland.no\0onthewifi.com\0"
+"gyeonggi.kr\0"
+"is-a-green.com\0webhop.info\0"
+"trentinsudtirol.it\0"
+"ina.nagano.jp\0"
+"heguri.nara.jp\0"
+"baghdad.museum\0rl.no\0"
+"nt.au\0gop.pk\0lipsy\0"
+"grocery\0"
+"salerno.it\0"
+"stor-elvdal.no\0"
+"studio\0"
+"monzaebrianza.it\0*.nagoya.jp\0hitachiomiya.ibaraki.jp\0yono.saitama.jp\0podzone.net\0"
+"hitra.no\0nodum.co\0"
+"kitadaito.okinawa.jp\0ikeda.osaka.jp\0"
+"trading.aero\0nt.ca\0"
+"construction\0"
+"square7.net\0"
+"coal.museum\0"
+"mw.gov.pl\0zarow.pl\0ford\0"
+"imizu.toyama.jp\0"
+"nativeamerican.museum\0cc.ga.us\0"
+"ownip.net\0"
+"tsukigata.hokkaido.jp\0"
+"nesoddtangen.no\0"
+"urbinopesaro.it\0"
+"vestvagoy.no\0"
+"morena.br\0miyoshi.hiroshima.jp\0"
+"express.aero\0nodum.io\0"
+"iwatsuki.saitama.jp\0"
+"kunigami.okinawa.jp\0ugim.gov.pl\0"
+"gs.svalbard.no\0eidsvoll.no\0w.se\0"
+"xz.cn\0geisei.kochi.jp\0"
+"langev\xc3\xa5g.no\0"
+"herad.no\0sells-for-less.com\0"
+"ms.gov.br\0"
+"aerodrome.aero\0loginline.services\0"
+"szczytno.pl\0"
+"sciencehistory.museum\0fyresdal.no\0honda\0"
+"togitsu.nagasaki.jp\0pgafan.net\0"
+"gyeongbuk.kr\0"
+"foggia.it\0"
+"us-gov-west-1.elasticbeanstalk.com\0"
+"happou.akita.jp\0*.on-rancher.cloud\0"
+"randaberg.no\0"
+"seirou.niigata.jp\0"
+"elburg.museum\0tushu\0"
+"nord-fron.no\0"
+"hirara.okinawa.jp\0"
+"usgarden.museum\0"
+"gangaviika.no\0us-west-1.elasticbeanstalk.com\0"
+"nerdpol.ovh\0"
+"blogdns.com\0"
+"nagi.okayama.jp\0"
+"gv.vc\0"
+"cloud.fedoraproject.org\0"
+"mt.gov.br\0dellogliastra.it\0kin.okinawa.jp\0"
+"s3-eu-west-1.amazonaws.com\0"
+"basilicata.it\0kunneppu.hokkaido.jp\0"
+"godo.gifu.jp\0sakura.tochigi.jp\0cri.nz\0"
+"feedback\0vana\0giize.com\0"
+"\xe0\xaa\xad\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xaa\xa4\0williamhill\0"
+"cologne\0twmail.cc\0"
+"kanzaki.saga.jp\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\0\xe0\xb8\x97\xe0\xb8\xab\xe0\xb8\xb2\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
+"jefferson.museum\0"
+"badaddja.no\0doesntexist.com\0"
+"ichikai.tochigi.jp\0"
+"rec.nf\0"
+"chernihiv.ua\0"
+"enna.it\0"
+"tuscany.it\0s\xc3\xbc""dtirol.it\0"
+"kitakata.fukushima.jp\0"
+"narviika.no\0"
+"sener\0barsy.shop\0"
+"trolley.museum\0"
+"shiftedit.io\0"
+"medecin.fr\0"
+"watchandclock.museum\0"
+"run.app\0"
+"fvg.it\0watch\0"
+"shiwa.iwate.jp\0"
+"paris\0"
+"dynv6.net\0"
+"tj\xc3\xb8me.no\0sohu\0jambyl.su\0"
+"zao.miyagi.jp\0"
+"babia-gora.pl\0"
+"h.bg\0hsbc\0icbc\0"
+"half.host\0"
+"consulting.aero\0"
+"wnext.app\0"
+"childrensgarden.museum\0school.museum\0cc.ok.us\0"
+"takanabe.miyazaki.jp\0"
+"is-a-knight.org\0"
+"agr.br\0"
+"yugawara.kanagawa.jp\0tarama.okinawa.jp\0shinjuku.tokyo.jp\0"
+"sakaiminato.tottori.jp\0"
+"higashiizu.shizuoka.jp\0"
+"pp.se\0pp.ru\0mlbfan.org\0"
+"sakegawa.yamagata.jp\0vpndns.net\0"
+"nosegawa.nara.jp\0se.net\0ru.net\0"
+"k12.ga.us\0"
+"ikeda.gifu.jp\0"
+"wa.us\0"
+"rec.ro\0"
+"ac.gov.br\0"
+"go.leg.br\0"
+"fla.no\0"
+"naoshima.kagawa.jp\0arida.wakayama.jp\0nome.pt\0"
+"ambulance.aero\0"
+"si.it\0tsu.mie.jp\0"
+"\xe3\x83\x95\xe3\x82\xa1\xe3\x83\x83\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0"
+"kaufen\0"
+"teaches-yoga.com\0"
+"hs.kr\0merckmsd\0"
+"edgestack.me\0"
+"conf.se\0pp.ua\0"
+"steinkjer.no\0"
+"nt.no\0"
+"br.it\0cb.it\0"
+"mill.museum\0domains\0"
+"etajima.hiroshima.jp\0"
+"store\0"
+"yashiro.hyogo.jp\0"
+"tysfjord.no\0tokyo\0"
+"aya.miyazaki.jp\0"
+"k12.az.us\0"
+"trentin-sudtirol.it\0pippu.hokkaido.jp\0"
+"ryokami.saitama.jp\0"
+"neues.museum\0"
+"amli.no\0"
+"satx.museum\0"
+"ine.kyoto.jp\0"
+"lib.co.us\0"
+"abarth\0"
+"iwamizawa.hokkaido.jp\0"
+"e164.arpa\0\xe5\x85\xac\xe5\x8f\xb8.\xe9\xa6\x99\xe6\xb8\xaf\0song\0"
+"moss.no\0"
+"equipment.aero\0qld.edu.au\0"
+"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0de.cool\0"
+"notodden.no\0"
+"resistance.museum\0"
+"sar.it\0kawagoe.saitama.jp\0"
+"soundandvision.museum\0rec.ve\0filegear-ie.me\0"
+"numata.hokkaido.jp\0shijonawate.osaka.jp\0"
+"catholic.edu.au\0naamesjevuemie.no\0"
+"sony\0is.eu.org\0"
+"ybo.party\0"
+"akrehamn.no\0lib.ny.us\0"
+"sardinia.it\0koeln\0"
+"tsuchiura.ibaraki.jp\0\xd8\xa8\xd8\xa7\xd8\xb1\xd8\xaa\0"
+"cc.mo.us\0solutions\0"
+"midsund.no\0"
+"ap-south-1.elasticbeanstalk.com\0dyndns-at-home.com\0"
+"rindal.no\0nt.ro\0sa.com\0"
+"kawakami.nagano.jp\0kitagata.saga.jp\0otsu.shiga.jp\0"
+"dynvpn.de\0"
+"nankoku.kochi.jp\0"
+"nsn.us\0c66.me\0"
+"takahashi.okayama.jp\0koto.tokyo.jp\0"
+"dn.ua\0"
+"it.eu.org\0"
+"yusui.kagoshima.jp\0"
+"maintenance.aero\0narvik.no\0"
+"mel\xc3\xb8y.no\0"
+"koori.fukushima.jp\0"
+"hyuga.miyazaki.jp\0"
+"tksat.bo\0drangedal.no\0autos\0"
+"akabira.hokkaido.jp\0"
+"\xd8\xa8\xd9\x8a\xd8\xaa\xd9\x83\0is-a-liberal.com\0"
+"surnadal.no\0"
+"mail.pl\0"
+"od.ua\0"
+"agric.za\0"
+"from-nm.com\0"
+"niikappu.hokkaido.jp\0taiji.wakayama.jp\0"
+"newmexico.museum\0"
+"plo.ps\0"
+"iide.yamagata.jp\0"
+"saga.saga.jp\0"
+"racing\0"
+"kagoshima.kagoshima.jp\0"
+"s3-ap-southeast-1.amazonaws.com\0"
+"fussa.tokyo.jp\0cn-northwest-1.eb.amazonaws.com.cn\0"
+"schools.nsw.edu.au\0parts\0eu-central-1.elasticbeanstalk.com\0"
+"inc.hk\0"
+"museum\0git-repos.de\0brasilia.me\0"
+"tysv\xc3\xa6r.no\0party\0verm\xc3\xb6gensberatung\0barsy.site\0"
+"\xe4\xb8\xad\xe5\x9b\xbd\0"
+"co.ae\0"
+"minamiminowa.nagano.jp\0wake.okayama.jp\0"
+"co.ag\0"
+"kuroishi.aomori.jp\0*.sensiosite.cloud\0"
+"co.am\0hvaler.no\0gives\0"
+"co.ao\0dyndns-at-work.com\0"
+"state.museum\0\xe4\xb8\xad\xe5\x9c\x8b\0"
+"co.bb\0rep.kp\0group\0*.kunden.ortsinfo.at\0"
+"in.eu.org\0"
+"co.at\0"
+"feira.br\0"
+"herokussl.com\0"
+"lig.it\0lodi.it\0shobara.hiroshima.jp\0"
+"co.bi\0hasura-app.io\0"
+"katori.chiba.jp\0user.aseinet.ne.jp\0"
+"cambridge.museum\0"
+"skjak.no\0lib.me.us\0"
+"matsusaka.mie.jp\0co.bn\0"
+"0.bg\0"
+"co.ca\0"
+"vb.it\0"
+"nord-odal.no\0cc.ks.us\0"
+"conf.lv\0"
+"*.sch.uk\0software\0is-into-games.com\0"
+"yamanashi.yamanashi.jp\0bialystok.pl\0"
+"co.bw\0idrett.no\0"
+"est.pr\0"
+"co.ci\0rodoy.no\0"
+"co.cl\0"
+"co.cm\0"
+"co.cr\0"
+"srv.br\0yusuhara.kochi.jp\0"
+"suli.hu\0stange.no\0loseyourip.com\0"
+"co.cz\0"
+"co.dk\0"
+"clock.museum\0cc.vi.us\0"
+"dsmynas.org\0"
+"broke-it.net\0"
+"gallup\0"
+"xen.prgmr.com\0"
+"yawara.ibaraki.jp\0"
+"pa.it\0tosashimizu.kochi.jp\0izunokuni.shizuoka.jp\0edogawa.tokyo.jp\0"
+"project.museum\0"
+"kiso.nagano.jp\0"
+"\xc3\xa5lesund.no\0"
+"\xd7\x99\xd7\xa8\xd7\x95\xd7\xa9\xd7\x9c\xd7\x99\xd7\x9d.museum\0"
+"vallee-d-aoste.it\0"
+"gs.tm.no\0"
+"fortmissoula.museum\0k12.mo.us\0from-tn.com\0"
+"cim.br\0lombardia.it\0"
+"oshino.yamanashi.jp\0"
+"chita.aichi.jp\0tomisato.chiba.jp\0"
+"j\xc3\xb8rpeland.no\0modum.no\0"
+"bern.museum\0"
+"niteroi.br\0"
+"chuo.fukuoka.jp\0uda.nara.jp\0"
+"u.bg\0"
+"h.se\0stackhero-network.com\0"
+"fukudomi.saga.jp\0"
+"usantiques.museum\0"
+"teramo.it\0"
+"media.museum\0is-a-caterer.com\0"
+"co.gg\0gub.uy\0barsycenter.com\0eu.meteorapp.com\0"
+"vang.no\0collegefan.org\0"
+"kvafjord.no\0nov.ru\0"
+"co.gl\0"
+"madrid.museum\0gucci\0"
+"docs\0sanofi\0"
+"gallo\0"
+"lans.museum\0"
+"web.app\0"
+"gs.nl.no\0crimea.ua\0"
+"co.gy\0"
+"coop.ht\0"
+"slattum.no\0tranoy.no\0nov.su\0"
+"vall\xc3\xa9""e-aoste.it\0"
+"swidnik.pl\0"
+"fitjar.no\0"
+"\xe5\xbe\xae\xe5\x8d\x9a\0"
+"game\0"
+"co.id\0tenei.fukushima.jp\0"
+"co.hu\0"
+"yonezawa.yamagata.jp\0"
+"bc.ca\0"
+"sv.it\0"
+"podzone.org\0"
+"sharp\0"
+"vlaanderen.museum\0\xe7\xbd\x91\xe5\xba\x97\0"
+"co.il\0"
+"co.im\0"
+"co.in\0"
+"bardu.no\0"
+"chambagri.fr\0\xe5\xae\xae\xe5\x9f\x8e.jp\0yanagawa.fukuoka.jp\0yamaxun\0"
+"ivgu.no\0"
+"g12.br\0co.ir\0"
+"co.it\0"
+"co.je\0"
+"al.gov.br\0yamagata.ibaraki.jp\0"
+"coop.br\0london.cloudapps.digital\0"
+"shimosuwa.nagano.jp\0auction\0"
+"kakogawa.hyogo.jp\0ome.tokyo.jp\0mragowo.pl\0"
+"c.cdn77.org\0*.customer-oci.com\0api.stdlib.com\0"
+"uk.net\0"
+"net-freaks.com\0"
+"co.jp\0toyota.aichi.jp\0"
+"blog\0"
+"misato.shimane.jp\0"
+"co.ke\0"
+"soka.saitama.jp\0"
+"free.hr\0"
+"\xe8\xb4\xad\xe7\x89\xa9\0yodobashi\0"
+"s\xc3\xb8rum.no\0"
+"izumizaki.fukushima.jp\0co.kr\0better-than.tv\0"
+"co.lc\0"
+"kariya.aichi.jp\0"
+"tjome.no\0"
+"ainan.ehime.jp\0"
+"dyndns-pics.com\0for-our.info\0"
+"ne.jp\0"
+"spot\0"
+"parachuting.aero\0ne.ke\0\xe7\xb5\x84\xe7\xb9\x94.tw\0consulting\0"
+"co.ma\0usa.museum\0"
+"kagami.kochi.jp\0mugi.tokushima.jp\0"
+"co.ls\0"
+"minato.tokyo.jp\0"
+"co.me\0assassination.museum\0paleo.museum\0hammarfeasta.no\0"
+"*.futurecms.at\0"
+"co.mg\0"
+"caseih\0"
+"ne.kr\0"
+"bci.dnstrace.pro\0"
+"psp.gov.pl\0"
+"bahn.museum\0"
+"kosher\0"
+"botanicgarden.museum\0co.na\0k12.wi.us\0is-a-cubicle-slave.com\0"
+"co.mu\0"
+"embetsu.hokkaido.jp\0"
+"co.mw\0"
+"kitagata.gifu.jp\0"
+"flight.aero\0co.ni\0hb.cldmail.ru\0"
+"co.mz\0"
+"ichikawamisato.yamanashi.jp\0co.nl\0"
+"teo.br\0"
+"sanfrancisco.museum\0tele.amune.org\0co.no\0groks-the.info\0"
+"bearalvahki.no\0"
+"kawaue.gifu.jp\0"
+"k12.ec\0endoftheinternet.org\0"
+"co.nz\0"
+"ichihara.chiba.jp\0"
+"co.om\0"
+"uri.arpa\0"
+"financial\0"
+"luxury\0"
+"oketo.hokkaido.jp\0"
+"modalen.no\0orskog.no\0"
+"k12.pr.us\0"
+"kv\xc3\xa6""fjord.no\0"
+"tunk.org\0nym.by\0"
+"monash\0co.pl\0nym.bz\0"
+"kashima.saga.jp\0co.pn\0discover\0"
+"blue\0"
+"kitashiobara.fukushima.jp\0"
+"glas.museum\0free\0"
+"yaita.tochigi.jp\0"
+"leasing.aero\0games\0"
+"contagem.br\0"
+"co.pw\0pa.us\0azurecontainer.io\0"
+"museumcenter.museum\0opencraft.hosting\0"
+"properties\0"
+"uchinada.ishikawa.jp\0"
+"law.pro\0homelink.one\0"
+"aparecida.br\0"
+"workshop.museum\0"
+"li.it\0"
+"cc.az.us\0nym.ec\0"
+"nanao.ishikawa.jp\0gorlice.pl\0community-pro.net\0"
+"\xc3\xa5snes.no\0pharmacy\0shangrila\0\xe3\x82\xbb\xe3\x83\xbc\xe3\x83\xab\0"
+"valleedaoste.it\0lubin.pl\0"
+"seki.gifu.jp\0"
+"stuttgart.museum\0mini\0"
+"tra.kp\0"
+"estate.museum\0ne.pw\0"
+"romskog.no\0co.rs\0"
+"geelvinck.museum\0lacaixa\0alpha.bounty-full.com\0"
+"mo-i-rana.no\0co.rw\0vegas\0"
+"mint\0"
+"dgca.aero\0kristiansund.no\0dielddanuorri.no\0"
+"kozow.com\0"
+"\xe6\x9d\xb1\xe4\xba\xac.jp\0walbrzych.pl\0"
+"panama.museum\0alsace\0"
+"alto-adige.it\0"
+"k12.il\0"
+"co.st\0"
+"kvalsund.no\0"
+"co.th\0"
+"clinton.museum\0"
+"shirakawa.gifu.jp\0co.sz\0co.tj\0"
+"gon.pk\0"
+"\xe5\xb1\xb1\xe5\x8f\xa3.jp\0shiroi.chiba.jp\0"
+"co.tm\0"
+"kawatana.nagasaki.jp\0"
+"mysecuritycamera.com\0"
+"co.ua\0"
+"kazo.saitama.jp\0blogsite.xyz\0"
+"co.tt\0nym.gr\0"
+"industries\0"
+"colonialwilliamsburg.museum\0co.ug\0leclerc\0"
+"turin.it\0"
+"s3.ca-central-1.amazonaws.com\0"
+"co.tz\0"
+"interactive.museum\0co.uk\0nym.gy\0dray-dns.de\0"
+"trentinos\xc3\xbc""dtirol.it\0yomitan.okinawa.jp\0"
+"nym.hk\0"
+"shibuya.tokyo.jp\0"
+"lib.hi.us\0s3-website-ap-southeast-2.amazonaws.com\0"
+"sekigahara.gifu.jp\0omitama.ibaraki.jp\0"
+"co.us\0"
+"pn.it\0kwp.gov.pl\0"
+"org.ac\0co.ve\0"
+"org.ae\0safety\0nym.ie\0"
+"org.af\0kumakogen.ehime.jp\0gbiz\0"
+"org.ag\0palace.museum\0co.vi\0"
+"minamiechizen.fukui.jp\0co.uz\0"
+"org.ai\0yalta.ua\0"
+"\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
+"valer.hedmark.no\0"
+"org.al\0"
+"org.am\0salzburg.museum\0"
+"trentino-a-adige.it\0aoste.it\0"
+"stathelle.no\0g\xc3\xa1ls\xc3\xa1.no\0ne.ug\0"
+"sumoto.hyogo.jp\0yamatokoriyama.nara.jp\0otsuki.yamanashi.jp\0"
+"org.ba\0builders\0"
+"org.ar\0org.bb\0tajimi.gifu.jp\0ne.tz\0"
+"org.au\0"
+"org.bh\0"
+"org.bi\0"
+"org.az\0kami.kochi.jp\0aga.niigata.jp\0itabashi.tokyo.jp\0"
+"u.se\0ne.us\0nagoya\0"
+"org.bm\0"
+"org.bn\0tsubata.ishikawa.jp\0"
+"org.bo\0"
+"friuli-v-giulia.it\0olbiatempio.it\0tempio-olbia.it\0"
+"org.br\0kisofukushima.nagano.jp\0"
+"org.bs\0"
+"org.bt\0"
+"\xce\xb5\xce\xbb\0"
+"org.bw\0philips\0"
+"fot.br\0"
+"org.ci\0"
+"org.bz\0"
+"stordal.no\0"
+"org.cn\0okinawa.jp\0"
+"empresa.bo\0org.co\0bale.museum\0ski.no\0med.pro\0\xce\xb5\xcf\x85\0"
+"sasaguri.fukuoka.jp\0"
+"nym.la\0mo-siemens.io\0"
+"eun.eg\0sologne.museum\0ieee\0ollo\0talk\0from-nh.com\0nym.lc\0"
+"org.cu\0"
+"org.cw\0"
+"org.cy\0ibestad.no\0nym.li\0"
+"imakane.hokkaido.jp\0nym.kz\0"
+"taishi.hyogo.jp\0"
+"org.dm\0"
+"org.do\0co.za\0"
+"ts.it\0witd.gov.pl\0"
+"ekloges.cy\0org.ec\0"
+"nym.lt\0"
+"org.ee\0fhv.se\0nym.lu\0nym.me\0"
+"org.eg\0loginline.io\0"
+"recife.br\0soc.srcf.net\0"
+"haram.no\0"
+"org.dz\0"
+"coop.rw\0co.zm\0"
+"yura.wakayama.jp\0nym.mn\0"
+"muosat.no\0"
+"masuda.shimane.jp\0"
+"org.es\0"
+"org.et\0"
+"co.zw\0s3.eu-west-3.amazonaws.com\0"
+"anthropology.museum\0coastaldefence.museum\0"
+"nym.mx\0"
+"org.fj\0"
+"cloudns.pro\0mypets.ws\0"
+"modern.museum\0n\xc3\xb8tter\xc3\xb8y.no\0"
+"landes.museum\0repl.co\0"
+"nichinan.miyazaki.jp\0"
+"onred.one\0"
+"*.yokohama.jp\0aogashima.tokyo.jp\0"
+"org.ge\0dni.us\0trade\0"
+"org.gg\0radoy.no\0as.us\0"
+"org.gh\0coop.tt\0"
+"org.gi\0"
+"nym.nz\0"
+"marnardal.no\0"
+"org.gl\0ascoli-piceno.it\0"
+"org.gn\0"
+"org.gp\0traniandriabarletta.it\0"
+"bamble.no\0k12.nj.us\0"
+"org.gr\0hospital\0"
+"academia.bo\0"
+"org.gt\0gojome.akita.jp\0marumori.miyagi.jp\0nishikatsura.yamanashi.jp\0"
+"org.gu\0ingatlan.hu\0no-ip.org\0nym.pe\0"
+"blogspot.com\0"
+"org.gy\0evenes.no\0fh.se\0"
+"coop.mv\0"
+"org.hk\0coop.mw\0"
+"org.hn\0nishiizu.shizuoka.jp\0"
+"f.bg\0"
+"ky.us\0pt.eu.org\0"
+"cc.ny.us\0"
+"org.ht\0nym.pt\0"
+"org.hu\0"
+"iserv.dev\0"
+"townnews-staging.com\0"
+"\xd0\xb8\xd0\xba\xd0\xbe\xd0\xbc.museum\0"
+"xs4all.space\0"
+"org.il\0nakagawa.fukuoka.jp\0"
+"org.im\0"
+"org.in\0"
+"org.iq\0youth.museum\0"
+"org.ir\0"
+"org.is\0sauda.no\0"
+"not.br\0niigata.niigata.jp\0"
+"org.je\0finn\xc3\xb8y.no\0"
+"modena.it\0k12.tr\0"
+"alvdal.no\0\xc3\xb8ygarden.no\0"
+"res.aero\0"
+"gehirn.ne.jp\0"
+"mosvik.no\0"
+"org.jo\0zhitomir.ua\0nym.ro\0"
+"kinder\0"
+"\xe7\xb5\x84\xe7\xb9\x94.hk\0"
+"lib.in.us\0"
+"\xc3\xa5mli.no\0eaton.mi.us\0"
+"yakage.okayama.jp\0"
+"mil.ac\0org.kg\0jfk.museum\0posts-and-telecommunications.museum\0finance\0"
+"mil.ae\0org.ki\0"
+"hisayama.fukuoka.jp\0sekikawa.niigata.jp\0nissan\0"
+"nym.sk\0"
+"soeda.fukuoka.jp\0"
+"org.km\0coop.py\0k12.vi\0"
+"org.kn\0"
+"bronnoy.no\0"
+"mil.al\0org.kp\0"
+"org.la\0"
+"manaus.br\0org.lb\0"
+"org.lc\0"
+"mil.ba\0nissay\0nym.su\0"
+"mil.ar\0"
+"org.kw\0"
+"nym.sx\0"
+"org.ky\0"
+"taka.hyogo.jp\0org.kz\0"
+"org.lk\0muos\xc3\xa1t.no\0"
+"lib.tx.us\0"
+"mil.az\0"
+"monza.it\0"
+"org.ma\0"
+"org.lr\0"
+"mil.bo\0org.ls\0larsson.museum\0virtual.museum\0"
+"org.me\0"
+"mil.br\0org.lv\0"
+"org.mg\0alt.za\0nym.tw\0"
+"org.ly\0zt.ua\0"
+"org.mk\0"
+"\xe9\x9d\x92\xe6\xa3\xae.jp\0org.ml\0"
+"mil.by\0"
+"port.fr\0org.mn\0"
+"org.mo\0"
+"mil.cl\0watarai.mie.jp\0*.magentosite.cloud\0"
+"coop.km\0org.na\0iamallama.com\0"
+"mil.cn\0hamatonbetsu.hokkaido.jp\0"
+"mil.co\0org.ms\0"
+"kitagawa.miyazaki.jp\0org.mt\0"
+"org.mu\0"
+"org.mv\0"
+"org.mw\0org.ng\0"
+"takamori.kumamoto.jp\0org.mx\0"
+"org.my\0org.ni\0loabat.no\0"
+"org.mz\0"
+"vestnes.no\0"
+"bar.pro\0"
+"org.nr\0"
+"mil.do\0lib.ok.us\0"
+"lillesand.no\0\xe4\xbf\xa1\xe6\x81\xaf\0"
+"shingo.aomori.jp\0"
+"mil.ec\0"
+"losangeles.museum\0"
+"org.nz\0"
+"mil.eg\0rockart.museum\0"
+"org.om\0"
+"servecounterstrike.com\0"
+"org.pa\0k12.ut.us\0taxi\0"
+"ge.it\0"
+"org.pe\0ddnsfree.com\0"
+"yorii.saitama.jp\0org.pf\0"
+"org.ph\0"
+"and.museum\0center.museum\0"
+"org.pk\0"
+"seiro.niigata.jp\0org.pl\0augustow.pl\0"
+"mil.fj\0osaka.jp\0org.pn\0"
+"notteroy.no\0saltdal.no\0farmers\0"
+"org.qa\0"
+"org.pr\0"
+"brussel.museum\0org.ps\0\xd8\xa7\xd9\x84\xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1\0kindle\0from-mi.com\0is-an-artist.com\0"
+"org.pt\0"
+"cartoonart.museum\0"
+"friuli-ve-giulia.it\0"
+"mil.ge\0org.py\0"
+"ogawa.ibaraki.jp\0"
+"ubank\0"
+"mil.gh\0tsushima.aichi.jp\0"
+"airport.aero\0"
+"grane.no\0"
+"meiwa.mie.jp\0"
+"mil.gt\0abira.hokkaido.jp\0higashikurume.tokyo.jp\0"
+"culture.museum\0"
+"kyonan.chiba.jp\0sakahogi.gifu.jp\0ueda.nagano.jp\0"
+"skaun.no\0"
+"joinville.br\0sanok.pl\0"
+"org.ro\0dy.fi\0"
+"org.sa\0"
+"mil.hn\0kani.gifu.jp\0shimotsuke.tochigi.jp\0org.sb\0"
+"org.rs\0org.sc\0lib.sd.us\0"
+"shinagawa.tokyo.jp\0org.sd\0"
+"ethnology.museum\0org.se\0lamborghini\0org.ru\0"
+"ad.jp\0bayern\0"
+"aerobatic.aero\0exchange.aero\0fineart.museum\0org.rw\0org.sg\0"
+"mil.id\0shimoichi.nara.jp\0nanjo.okinawa.jp\0org.sh\0"
+"koka.shiga.jp\0wiw.gov.pl\0dsmynas.net\0"
+"mozilla-iot.org\0"
+"org.sl\0"
+"mein-vigor.de\0"
+"pug.it\0shimokawa.hokkaido.jp\0org.sn\0"
+"org.so\0"
+"mil.in\0"
+"hof.no\0org.ss\0"
+"org.st\0"
+"mil.iq\0cc.ak.us\0"
+"org.sv\0"
+"mo\xc3\xa5reke.no\0"
+"saitama.jp\0mypsx.net\0"
+"org.sy\0"
+"usui.fukuoka.jp\0org.sz\0org.tj\0"
+"\xe9\xa3\x9e\xe5\x88\xa9\xe6\xb5\xa6\0"
+"org.tm\0"
+"org.tn\0"
+"music.museum\0org.to\0"
+"taxi.br\0toho.fukuoka.jp\0inami.wakayama.jp\0"
+"org.ua\0"
+"cagliari.it\0org.tr\0kitchen\0"
+"mil.jo\0recipes\0"
+"kaneyama.fukushima.jp\0org.tt\0"
+"loab\xc3\xa1t.no\0"
+"takinoue.hokkaido.jp\0"
+"indian.museum\0org.tw\0org.ug\0"
+"guovdageaidnu.no\0"
+"ato.br\0"
+"mil.kg\0org.uk\0doomdns.com\0"
+"takashima.shiga.jp\0"
+"ia.us\0"
+"valleeaoste.it\0"
+"cc.la.us\0"
+"*.statics.cloud\0"
+"mil.km\0komatsu\0"
+"piemonte.it\0"
+"org.vc\0cloudns.org\0"
+"\xe7\xa6\x8f\xe4\xba\x95.jp\0"
+"democracia.bo\0uscountryestate.museum\0org.ve\0health-carereform.com\0"
+"mil.kr\0"
+"ven.it\0"
+"org.uy\0org.vi\0"
+"komaki.aichi.jp\0org.uz\0"
+"law.za\0"
+"mil.kz\0org.vn\0"
+"kamimine.saga.jp\0"
+"tamatsukuri.ibaraki.jp\0"
+"ardal.no\0lib.wa.us\0"
+"oishida.yamagata.jp\0"
+"engineer.aero\0org.vu\0"
+"minokamo.gifu.jp\0matsumoto.nagano.jp\0from-az.net\0"
+"kazuno.akita.jp\0"
+"kanie.aichi.jp\0shinshiro.aichi.jp\0kashima.ibaraki.jp\0mil.lv\0"
+"modelling.aero\0mil.mg\0beiarn.no\0"
+"carrd.co\0"
+"tabayama.yamanashi.jp\0"
+"tools\0"
+"musashimurayama.tokyo.jp\0"
+"org.ws\0"
+"nuoro.it\0"
+"kurogi.fukuoka.jp\0ozu.kumamoto.jp\0"
+"auspost\0"
+"mil.mv\0"
+"ski.museum\0mil.ng\0lv.ua\0"
+"mil.my\0mil.ni\0k12.ne.us\0"
+"\xe5\xb3\xb6\xe6\xa0\xb9.jp\0shonai.fukuoka.jp\0mil.mz\0"
+"filegear-jp.me\0"
+"salon\0"
+"mil.no\0"
+"kannami.shizuoka.jp\0"
+"farmers.museum\0fosnes.no\0"
+"lecce.it\0"
+"s.bg\0"
+"f.se\0*.quipelements.com\0"
+"amagasaki.hyogo.jp\0oi.kanagawa.jp\0mil.nz\0"
+"niyodogawa.kochi.jp\0mamurogawa.yamagata.jp\0"
+"org.za\0"
+"moriyama.shiga.jp\0"
+"station.museum\0"
+"caa.li\0ui.nabu.casa\0"
+"lier.no\0"
+"eu.int\0valdaosta.it\0matsuzaki.shizuoka.jp\0higashimurayama.tokyo.jp\0"
+"mil.pe\0"
+"hb.cn\0"
+"tanabe.wakayama.jp\0mil.ph\0"
+"b\xc3\xb8.nordland.no\0org.zm\0"
+"godaddy\0money\0balashov.su\0"
+"misaki.osaka.jp\0mil.pl\0"
+"khmelnytskyi.ua\0"
+"kalisz.pl\0"
+"ap-southeast-1.elasticbeanstalk.com\0"
+"mil.qa\0kids.us\0"
+"es.leg.br\0on-web.fr\0"
+"org.zw\0cityeats\0space-to-rent.com\0"
+"ina.saitama.jp\0"
+"nayoro.hokkaido.jp\0"
+"brussels.museum\0""4u.com\0"
+"mil.py\0"
+"\xe3\x81\xbf\xe3\x82\x93\xe3\x81\xaa\0"
+"midtre-gauldal.no\0"
+"read-books.org\0"
+"kamijima.ehime.jp\0flt.cloud.muni.cz\0"
+"s\xc3\xb8gne.no\0is-a-photographer.com\0"
+"friuli-vegiulia.it\0miyako.fukuoka.jp\0"
+"bofa\0dyndns.org\0"
+"\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x81\xd1\x80\xd0\xb1\0"
+"kahoku.yamagata.jp\0"
+"jpn.com\0knowsitall.info\0"
+"toki.gifu.jp\0"
+"trapani.it\0school\0"
+"k12.as.us\0mil.ru\0"
+"mil.rw\0from-ok.com\0ditchyourip.com\0"
+"ginan.gifu.jp\0mil.sh\0"
+"miners.museum\0"
+"iobb.net\0"
+"yamatotakada.nara.jp\0"
+"in.na\0sucks\0viking\0"
+"rome.it\0zamami.okinawa.jp\0mil.st\0"
+"ms.it\0from-ny.net\0"
+"cc.ct.us\0us.com\0"
+"jaworzno.pl\0build\0"
+"odda.no\0mil.sy\0"
+"kagamiishi.fukushima.jp\0mil.tj\0"
+"in.ni\0"
+"aviation.museum\0mil.tm\0"
+"mil.to\0k12.la.us\0"
+"daiwa.hiroshima.jp\0qpon\0"
+"\xe7\xbb\x84\xe7\xb9\x94.hk\0boats\0"
+"mil.tr\0cloudfunctions.net\0"
+"kunst.museum\0is-a-bruinsfan.org\0"
+"bunkyo.tokyo.jp\0"
+"hatoyama.saitama.jp\0"
+"bajddar.no\0mil.tw\0"
+"doshi.yamanashi.jp\0mil.tz\0"
+"poltava.ua\0"
+"ono.fukui.jp\0"
+"sling\0"
+"cc.nj.us\0"
+"mil.vc\0beauty\0"
+"ms.kr\0in.london\0"
+"mil.ve\0from-ut.com\0"
+"mil.uy\0"
+"naka.ibaraki.jp\0pioneer\0*.platform.sh\0"
+"st.no\0"
+"gr.it\0ushiku.ibaraki.jp\0warabi.saitama.jp\0"
+"gallery\0"
+"osasco.br\0"
+"*.oci.customer-oci.com\0"
+"git-pages.rit.edu\0"
+"lavangen.no\0engineering\0dnsdojo.com\0"
+"gr.jp\0"
+"hadsel.no\0col.ng\0"
+"geek.nz\0test.tj\0"
+"archi\0"
+"bridgestone\0skype\0"
+"denmark.museum\0"
+"sandnes.no\0"
+"cc.hi.us\0"
+"takatsuki.shiga.jp\0"
+"\xe6\x9c\xba\xe6\x9e\x84\0"
+"creation.museum\0"
+"realm.cz\0"
+"filegear-de.me\0"
+"balsan-suedtirol.it\0"
+"trustee.museum\0"
+"aq.it\0ba.it\0"
+"susaki.kochi.jp\0tama.tokyo.jp\0"
+"in.rs\0nis.za\0"
+"trentino-sudtirol.it\0"
+"izumisano.osaka.jp\0"
+"gs.fm.no\0"
+"iwaki.fukushima.jp\0nishigo.fukushima.jp\0"
+"kyowa.akita.jp\0no-ip.net\0"
+"nord-aurdal.no\0porsanger.no\0"
+"tomi.nagano.jp\0"
+"telekommunikation.museum\0mil.za\0"
+"topology.museum\0analytics\0"
+"bryne.no\0test.ru\0"
+"bond\0"
+"aeroport.fr\0fujikawa.shizuoka.jp\0in.th\0"
+"ssl.origin.cdn77-secure.org\0"
+"sobetsu.hokkaido.jp\0"
+"mil.zm\0"
+"imb.br\0poniatowa.pl\0"
+"r\xc3\xb8st.no\0"
+"in.ua\0"
+"boavista.br\0"
+"cust.disrec.thingdust.io\0"
+"koriyama.fukushima.jp\0"
+"gol.no\0mil.zw\0"
+"lg.jp\0"
+"futbol\0bounceme.net\0"
+"nakayama.yamagata.jp\0"
+"showa.fukushima.jp\0tsubetsu.hokkaido.jp\0kisosaki.mie.jp\0misugi.mie.jp\0taiwa.miyagi.jp\0computer\0"
+"academy\0book\0"
+"lib.nh.us\0"
+"intel\0"
+"dnsiskinky.com\0"
+"isumi.chiba.jp\0"
+"in.us\0"
+"shibetsu.hokkaido.jp\0taito.tokyo.jp\0"
+"cargo.aero\0"
+"kawai.iwate.jp\0tateshina.nagano.jp\0"
+"est-le-patron.com\0"
+"gose.nara.jp\0gmina.pl\0"
+"depot.museum\0"
+"aichi.jp\0choyo.kumamoto.jp\0"
+"from-mt.com\0from-nd.com\0"
+"foundation\0"
+"toscana.it\0"
+"v\xc3\xa5ler.\xc3\xb8stfold.no\0"
+"*.0emm.com\0"
+"travel\0"
+"aquarelle\0"
+"naganohara.gunma.jp\0dunlop\0ricoh\0"
+"matsue.shimane.jp\0"
+"cc.vt.us\0"
+"*.kawasaki.jp\0"
+"nikaho.akita.jp\0tsk.tr\0"
+"edu.ac\0"
+"raid\0"
+"edu.af\0jampa.br\0"
+"balsan.it\0"
+"toyoake.aichi.jp\0equipment\0"
+"brussels\0"
+"edu.al\0gokase.miyazaki.jp\0wlocl.pl\0"
+"giske.no\0"
+"suzaka.nagano.jp\0"
+"edu.ba\0ask\xc3\xb8y.no\0"
+"edu.ar\0edu.bb\0nc.tr\0"
+"uji.kyoto.jp\0agano.niigata.jp\0tateyama.toyama.jp\0star\0"
+"edu.au\0"
+"mima.tokushima.jp\0"
+"edu.bh\0hamada.shimane.jp\0"
+"edu.bi\0berlev\xc3\xa5g.no\0etnedal.no\0"
+"edu.az\0kasaoka.okayama.jp\0"
+"cloudns.eu\0"
+"misato.wakayama.jp\0"
+"edu.bm\0b\xc3\xb8mlo.no\0chernivtsi.ua\0"
+"edu.bn\0co.krd\0"
+"edu.bo\0kustanai.ru\0"
+"tos.it\0"
+"edu.br\0"
+"edu.bs\0heroy.nordland.no\0vadso.no\0s.se\0ms.us\0nc.us\0nid.io\0"
+"edu.bt\0firenze.it\0"
+"qcx.io\0"
+"edu.ci\0elvendrell.museum\0"
+"edu.bz\0"
+"emb.kw\0lib.az.us\0horse\0"
+"exeter.museum\0"
+"edu.cn\0"
+"edu.co\0mex.com\0kustanai.su\0"
+"rexroth\0"
+"edu.cu\0"
+"edu.cw\0"
+"koshimizu.hokkaido.jp\0"
+"edu.dm\0cincinnati.museum\0wy.us\0"
+"bialowieza.pl\0"
+"edu.do\0"
+"jus.br\0"
+"is-a-democrat.com\0"
+"edu.ec\0"
+"gosen.niigata.jp\0"
+"edu.ee\0"
+"edu.eg\0"
+"edu.dz\0"
+"averoy.no\0zaporizhzhia.ua\0"
+"krasnik.pl\0"
+"miyama.fukuoka.jp\0wajima.ishikawa.jp\0"
+"film.museum\0"
+"edu.es\0dynalias.com\0scrysec.com\0"
+"edu.et\0cloudns.in\0"
+"lea\xc5\x8bgaviika.no\0"
+"cz.it\0iruma.saitama.jp\0toyota.yamaguchi.jp\0"
+"bbs.tr\0"
+"bplaced.com\0"
+"shell\0"
+"bozen-suedtirol.it\0takayama.gifu.jp\0"
+"hurdal.no\0"
+"ikawa.akita.jp\0"
+"kiwi\0"
+"accident-investigation.aero\0edu.ge\0oceanographique.museum\0cc.tx.us\0"
+"jor.br\0mito.ibaraki.jp\0cloudapps.digital\0"
+"edu.gh\0yamato.kanagawa.jp\0"
+"edu.gi\0cloudns.cc\0"
+"md.ci\0"
+"edu.gl\0"
+"bjugn.no\0orange\0"
+"edu.gn\0"
+"hobby-site.com\0"
+"edu.gp\0"
+"edu.gr\0dupont\0"
+"edu.gt\0swinoujscie.pl\0"
+"edu.gu\0fetsund.no\0"
+"umbria.it\0sagae.yamagata.jp\0"
+"lg.ua\0"
+"edu.gy\0saintlouis.museum\0oygarden.no\0volyn.ua\0"
+"edu.hk\0"
+"esp.br\0molise.it\0"
+"edu.hn\0"
+"shirahama.wakayama.jp\0"
+"gs.bu.no\0"
+"edu.ht\0kyotango.kyoto.jp\0"
+"lib.pa.us\0"
+"d.bg\0"
+"gc.ca\0chicago.museum\0"
+"in-vpn.de\0"
+"edu.in\0polkowice.pl\0"
+"sciences.museum\0filegear-sg.me\0"
+"edu.iq\0discourse.team\0"
+"barreau.bj\0"
+"edu.is\0"
+"edu.it\0"
+"is-into-cars.com\0"
+"\xe4\xbc\x81\xe4\xb8\x9a\0"
+"vindafjord.no\0"
+"urakawa.hokkaido.jp\0"
+"edu.jo\0roma.museum\0\xc3\xb8rskog.no\0"
+"sld.do\0"
+"mobi.gp\0hyogo.jp\0"
+"edu.kg\0is-a-hunter.com\0"
+"edu.ki\0applinzi.com\0"
+"kawanishi.yamagata.jp\0"
+"kutchan.hokkaido.jp\0kawanishi.hyogo.jp\0"
+"edu.km\0giessen.museum\0"
+"edu.kn\0"
+"ab.ca\0"
+"natal.br\0edu.kp\0"
+"edu.la\0"
+"edu.lb\0"
+"edu.lc\0"
+"goiania.br\0macerata.it\0"
+"edu.kw\0pl.ua\0"
+"honjyo.akita.jp\0hashikami.aomori.jp\0\xd0\xba\xd0\xb0\xd1\x82\xd0\xbe\xd0\xbb\xd0\xb8\xd0\xba\0"
+"edu.ky\0"
+"edu.kz\0"
+"edu.lk\0rana.no\0"
+"bn.it\0kyowa.hokkaido.jp\0"
+"in-dsl.org\0"
+"kanan.osaka.jp\0"
+"edu.lr\0"
+"edu.ls\0"
+"edu.me\0fjaler.no\0"
+"nantan.kyoto.jp\0satosho.okayama.jp\0edu.lv\0"
+"edu.mg\0"
+"\xe5\x85\xb5\xe5\xba\xab.jp\0"
+"edu.ly\0"
+"fund\0"
+"edu.mk\0"
+"edu.ml\0"
+"kawanabe.kagoshima.jp\0edu.mn\0sport\0"
+"nsw.au\0edu.mo\0"
+"design.museum\0lib.dc.us\0"
+"edu.ms\0schokoladen.museum\0s3-eu-west-3.amazonaws.com\0"
+"mutsu.aomori.jp\0edu.mt\0"
+"jx.cn\0lt.it\0edu.mv\0mydissent.net\0"
+"safety.aero\0edu.mw\0edu.ng\0"
+"toyako.hokkaido.jp\0edu.mx\0kepno.pl\0adult\0"
+"edu.my\0edu.ni\0\xe5\xae\xb6\xe9\x9b\xbb\0ua.rs\0"
+"higashiosaka.osaka.jp\0edu.mz\0gent\0"
+"skygearapp.com\0"
+"fermo.it\0"
+"exnet.su\0"
+"hornindal.no\0"
+"umb.it\0"
+"edu.nr\0rnu.tn\0hasura.app\0"
+"workinggroup.aero\0"
+"kitanakagusuku.okinawa.jp\0"
+"loyalist.museum\0"
+"h\xc3\xa1""bmer.no\0edu.om\0from-nv.com\0saves-the-whales.com\0"
+"bandai.fukushima.jp\0kutno.pl\0"
+"folkebibl.no\0scapp.io\0"
+"habikino.osaka.jp\0"
+"edu.pa\0mytuleap.com\0"
+"edu.pe\0"
+"ishikari.hokkaido.jp\0edu.pf\0"
+"molde.no\0study\0\xe9\x80\x9a\xe8\xb2\xa9\0"
+"okawa.fukuoka.jp\0niki.hokkaido.jp\0edu.ph\0"
+"edu.pk\0"
+"sakai.ibaraki.jp\0edu.pl\0"
+"edu.pn\0"
+"bel.tr\0"
+"versailles.museum\0edu.qa\0vologda.su\0"
+"edu.pr\0"
+"casadelamoneda.museum\0rollag.no\0edu.ps\0"
+"edu.pt\0"
+"castle.museum\0"
+"lamer\0"
+"doesntexist.org\0"
+"freesite.host\0"
+"edu.py\0is-into-anime.com\0"
+"trentin-s\xc3\xbc""d-tirol.it\0"
+"pl.eu.org\0"
+"news.hu\0"
+"syncloud.it\0"
+"team\0"
+"mashiko.tochigi.jp\0clan.rip\0"
+"scienceandhistory.museum\0hjartdal.no\0lib.il.us\0samsung\0"
+"travel.pl\0"
+"wedding\0lebtimnetz.de\0"
+"matsuno.ehime.jp\0"
+"hamaroy.no\0"
+"americanfamily\0"
+"cloudns.us\0"
+"rel.ht\0sakyo.kyoto.jp\0"
+"collection.museum\0"
+"oppegard.no\0audible\0"
+"ishikawa.fukushima.jp\0"
+"ltd.co.im\0dyr\xc3\xb8y.no\0"
+"edu.sa\0"
+"edu.sb\0"
+"porsangu.no\0edu.rs\0edu.sc\0est-a-la-maison.com\0"
+"edu.sd\0schokokeks.net\0"
+"edu.ru\0"
+"sampa.br\0"
+"edu.sg\0"
+"forlicesena.it\0podlasie.pl\0"
+"psi.br\0tech\0"
+"no.com\0"
+"edu.sl\0"
+"edu.sn\0"
+"edu.so\0"
+"pony.club\0"
+"google\0"
+"cloudns.club\0"
+"university.museum\0edu.ss\0s3-us-east-2.amazonaws.com\0"
+"murayama.yamagata.jp\0edu.st\0"
+"toyo.kochi.jp\0edu.sv\0"
+"newspaper.museum\0"
+"edu.sy\0"
+"iglesiascarbonia.it\0edu.tj\0"
+"heimatunduhren.museum\0edu.tm\0maserati\0"
+"edu.to\0"
+"edu.ua\0"
+"edu.tr\0"
+"edu.tt\0"
+"canada.museum\0utsira.no\0"
+"vall\xc3\xa9""e-d-aoste.it\0"
+"rakkestad.no\0edu.tw\0cafe\0apigee.io\0"
+"phone\0"
+"open\0"
+"nishio.aichi.jp\0"
+"saogonca.br\0lucania.it\0kishiwada.osaka.jp\0"
+"lib.mi.us\0toray\0"
+"yokawa.hyogo.jp\0"
+"edu.vc\0bitballoon.com\0"
+"sld.pa\0edu.ve\0"
+"publ.pt\0tkmaxx\0"
+"salvadordali.museum\0edu.uy\0casino\0gr.com\0"
+"travel.tt\0"
+"sosa.chiba.jp\0"
+"izumi.osaka.jp\0edu.vn\0"
+"bozen.it\0"
+"murmansk.su\0"
+"katano.osaka.jp\0"
+"media.aero\0"
+"edu.vu\0"
+"is-a-guru.com\0"
+"shimane.shimane.jp\0discourse.group\0"
+"surrey.museum\0edu.ws\0"
+"torino.museum\0"
+"meiwa.gunma.jp\0"
+"\xd8\xb9\xd8\xb1\xd8\xa7\xd9\x82\0"
+"field.museum\0uwu.ai\0"
+"lt.ua\0"
+"bauern.museum\0k12.ms.us\0k12.nc.us\0"
+"toyooka.hyogo.jp\0"
+"al.eu.org\0"
+"kr.com\0"
+"profesional.bo\0lib.pr.us\0edu.za\0"
+"rel.pl\0"
+"q.bg\0logoip.de\0"
+"d.se\0md.us\0hepforge.org\0"
+"olkusz.pl\0"
+"kerryhotels\0\xe3\x82\xa2\xe3\x83\x9e\xe3\x82\xbe\xe3\x83\xb3\0"
+"moma.museum\0lib.ak.us\0edu.zm\0"
+"antiques.museum\0granvin.no\0s3.us-east-2.amazonaws.com\0game-server.cc\0service.gov.uk\0"
+"rawa-maz.pl\0"
+"my-firewall.org\0applicationcloud.io\0ybo.trade\0"
+"protection\0"
+"agrigento.it\0"
+"kr\xc3\xb8""dsherad.no\0"
+"call\0crafting.xyz\0"
+"enonic.io\0"
+"\xe5\xb2\x90\xe9\x98\x9c.jp\0"
+"hotels\0"
+"kuki.saitama.jp\0"
+"photo\0"
+"miharu.fukushima.jp\0pcloud.host\0gliwice.pl\0"
+"arq.br\0kita.kyoto.jp\0"
+"owani.aomori.jp\0"
+"sr.it\0yuasa.wakayama.jp\0"
+"sorfold.no\0"
+"n4t.co\0"
+"cuiaba.br\0trentinosued-tirol.it\0"
+"camp\0bplaced.net\0"
+"omachi.saga.jp\0"
+"*.uberspace.de\0"
+"ikata.ehime.jp\0"
+"communications.museum\0snoasa.no\0media\0"
+"hemne.no\0"
+"kazimierz-dolny.pl\0"
+"cloudns.pw\0familyds.com\0"
+"beppu.oita.jp\0"
+"birdart.museum\0"
+"higashitsuno.kochi.jp\0aisho.shiga.jp\0hamamatsu.shizuoka.jp\0"
+"dlugoleka.pl\0"
+"est-a-la-masion.com\0"
+"ikoma.nara.jp\0auto.pl\0"
+"customer.enonic.io\0"
+"a\xc3\xa9roport.ci\0embroidery.museum\0"
+"nextdirect\0"
+"karikatur.museum\0"
+"urausu.hokkaido.jp\0"
+"kppsp.gov.pl\0"
+"na.it\0"
+"alibaba\0"
+"ng.city\0"
+"\xe7\xa6\x8f\xe5\xb2\xa1.jp\0yonaguni.okinawa.jp\0"
+"gausdal.no\0"
+"kh.ua\0poivron.org\0"
+"atsuma.hokkaido.jp\0nose.osaka.jp\0"
+"seihi.nagasaki.jp\0"
+"steigen.no\0hu.com\0awsmppl.com\0"
+"hoyanger.no\0"
+"tur.ar\0calabria.it\0takino.hyogo.jp\0"
+"s3-website-us-west-1.amazonaws.com\0"
+"zp.gov.pl\0mobi.tt\0"
+"tsuru.yamanashi.jp\0\xd8\xa7\xd9\x84\xd9\x85\xd8\xba\xd8\xb1\xd8\xa8\0"
+"cc.nh.us\0"
+"yamagata.gifu.jp\0"
+"nieruchomosci.pl\0mobi.tz\0jaguar\0"
+"tur.br\0hakui.ishikawa.jp\0"
+"care\0"
+"krakow.pl\0"
+"oz.au\0oregon.museum\0"
+"\xd0\xbe\xd0\xbd\xd0\xbb\xd0\xb0\xd0\xb9\xd0\xbd\0"
+"nore-og-uvdal.no\0chtr.k12.ma.us\0internet-dns.de\0"
+"\xe5\x8c\x97\xe6\xb5\xb7\xe9\x81\x93.jp\0murakami.niigata.jp\0iwade.wakayama.jp\0"
+"googleapis.com\0"
+"casa\0isa-hockeynut.com\0"
+"\xe6\x95\x99\xe8\x82\xb2.hk\0cars\0yokohama\0"
+"case\0"
+"surf\0"
+"lpusercontent.com\0"
+"friuli-vgiulia.it\0cash\0"
+"gifu.jp\0"
+"lib.ia.us\0"
+"dev.static.land\0"
+"gleeze.com\0"
+"*.kobe.jp\0"
+"barsy.menu\0"
+"sicily.it\0oamishirasato.chiba.jp\0sumida.tokyo.jp\0"
+"gemological.museum\0\xc3\xa1laheadju.no\0"
+"benevento.it\0obihiro.hokkaido.jp\0"
+"servemp3.com\0"
+"\xe5\xb2\xa1\xe5\xb1\xb1.jp\0mobara.chiba.jp\0atm.pl\0"
+"ao.it\0"
+"dattolocal.net\0"
+"idf.il\0"
+"bulsan-suedtirol.it\0"
+"cheltenham.museum\0\xc3\xa5lg\xc3\xa5rd.no\0"
+"\xe5\xa5\x88\xe8\x89\xaf.jp\0asakawa.fukushima.jp\0"
+"ggee\0"
+"noticias.bo\0"
+"lombardy.it\0moseushi.hokkaido.jp\0wolomin.pl\0"
+"hikimi.shimane.jp\0"
+"events\0"
+"svizzera.museum\0is-very-bad.org\0"
+"nysa.pl\0pictet\0"
+"dolls.museum\0mobi.na\0"
+"le.it\0lixil\0\xd0\xbc\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0\0"
+"alaheadju.no\0"
+"shirosato.ibaraki.jp\0"
+"mobi.ng\0"
+"sp.gov.br\0"
+"lebork.pl\0"
+"teva\0"
+"kawakita.ishikawa.jp\0"
+"experts-comptables.fr\0"
+"glass.museum\0"
+"skjerv\xc3\xb8y.no\0"
+"storage\0fedorapeople.org\0js.org\0"
+"lib.nj.us\0syno-ds.de\0"
+"9.bg\0"
+"itakura.gunma.jp\0imari.saga.jp\0"
+"lebesby.no\0il.us\0"
+"page\0"
+"channelsdvr.net\0"
+"correios-e-telecomunica\xc3\xa7\xc3\xb5""es.museum\0kherson.ua\0"
+"sch.ae\0philately.museum\0yorkshire.museum\0furniture\0"
+"myds.me\0"
+"kouyama.kagoshima.jp\0nat.tn\0"
+"tana.no\0no.eu.org\0navoi.su\0"
+"yuki.ibaraki.jp\0agrinet.tn\0norton\0"
+"mitane.akita.jp\0m\xc4\x81ori.nz\0"
+"ikano\0"
+"tara.saga.jp\0gotdns.ch\0"
+"fairwinds\0"
+"ck.ua\0"
+"\xe5\x8d\x83\xe8\x91\x89.jp\0"
+"takamori.nagano.jp\0tenri.nara.jp\0in-dsl.net\0"
+"kobierzyce.pl\0"
+"ebetsu.hokkaido.jp\0muroran.hokkaido.jp\0\xe6\x97\xb6\xe5\xb0\x9a\0"
+"oyer.no\0"
+"airline.aero\0"
+"cal.it\0"
+"military.museum\0"
+"fukui.fukui.jp\0"
+"bulsan.it\0so.gov.pl\0"
+"kyotamba.kyoto.jp\0sakuho.nagano.jp\0nanto.toyama.jp\0"
+"boutique\0"
+"higashiura.aichi.jp\0"
+"cloudns.info\0"
+"udine.it\0asaminami.hiroshima.jp\0"
+"gifu.gifu.jp\0"
+"globo\0""12hp.de\0"
+"aosta.it\0"
+"mobi\0"
+"suita.osaka.jp\0"
+"milano.it\0"
+"mobi.ke\0naumburg.museum\0\xe6\xb8\xb8\xe6\x88\x8f\0"
+"puglia.it\0"
+"meloy.no\0"
+"bio.br\0"
+"duck\0"
+"shonai.yamagata.jp\0adobeaemcloud.net\0"
+"\xe7\xa5\x9e\xe5\xa5\x88\xe5\xb7\x9d.jp\0"
+"\xe5\xa4\xa9\xe4\xb8\xbb\xe6\x95\x99\0"
+"marugame.kagawa.jp\0"
+"dominic.ua\0nexus\0"
+"sumita.iwate.jp\0"
+"nyc.museum\0"
+"shimofusa.chiba.jp\0"
+"cipriani\0moda\0"
+"maori.nz\0"
+"mulhouse.museum\0cpa.pro\0guide\0"
+"owariasahi.aichi.jp\0""12hp.at\0"
+"fukusaki.hyogo.jp\0asahi.ibaraki.jp\0"
+"abiko.chiba.jp\0naha.okinawa.jp\0"
+"asn.au\0xenapponazure.com\0"
+"matsushige.tokushima.jp\0"
+"coupon\0"
+"from-pa.com\0"
+"otake.hiroshima.jp\0"
+"recreation.aero\0"
+"tochigi.tochigi.jp\0dyndns.tv\0"
+"is-a-chef.org\0"
+"kamiichi.toyama.jp\0""12hp.ch\0"
+"sc.cn\0to.it\0"
+"homebuilt.aero\0rendalen.no\0"
+"artcenter.museum\0convent.museum\0nz.eu.org\0"
+"chieti.it\0"
+"holiday\0"
+"asso.fr\0"
+"tas.au\0"
+"okagaki.fukuoka.jp\0"
+"gamagori.aichi.jp\0"
+"togura.nagano.jp\0"
+"uchiko.ehime.jp\0"
+"tsuga.tochigi.jp\0"
+"asso.gp\0kawajima.saitama.jp\0"
+"mb.ca\0enterprisecloud.nu\0"
+"karuizawa.nagano.jp\0wakasa.tottori.jp\0"
+"nationalfirearms.museum\0"
+"nakasatsunai.hokkaido.jp\0utashinai.hokkaido.jp\0"
+"sch.id\0"
+"jevnaker.no\0kerryproperties\0"
+"kamiizumi.saitama.jp\0kai.yamanashi.jp\0"
+"tromsa.no\0serveexchange.com\0"
+"izumi.kagoshima.jp\0nobeoka.miyazaki.jp\0football\0"
+"dyndns.ws\0"
+"\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xae\0\xe7\xa7\xbb\xe5\x8a\xa8\0"
+"wellbeingzone.co.uk\0"
+"asso.ht\0kunimi.fukushima.jp\0amakusa.kumamoto.jp\0bungoono.oita.jp\0"
+"youtube\0"
+"sch.ir\0"
+"axis.museum\0sigdal.no\0"
+"tado.mie.jp\0"
+"repbody.aero\0siljan.no\0cable-modem.org\0"
+"education\0"
+"r\xc3\xb8mskog.no\0unusualperson.com\0"
+"sch.jo\0"
+"roan.no\0"
+"imperia.it\0"
+"b.bg\0webhop.me\0"
+"endofinternet.net\0"
+"cbre\0"
+"asso.bj\0"
+"newholland\0weatherchannel\0"
+"paris.museum\0"
+"homeunix.net\0"
+"barsy.me\0"
+"b.br\0obu.aichi.jp\0yamanobe.yamagata.jp\0"
+"fnd.br\0\xe6\xa0\x83\xe6\x9c\xa8.jp\0"
+"oumu.hokkaido.jp\0"
+"asso.ci\0is-a-chef.com\0"
+"taiki.mie.jp\0"
+"servehalflife.com\0"
+"hichiso.gifu.jp\0"
+"lesja.no\0freeddns.us\0"
+"ulsan.kr\0"
+"sch.lk\0"
+"avellino.it\0"
+"pars\0"
+"campidano-medio.it\0munakata.fukuoka.jp\0"
+"moriyoshi.akita.jp\0kashiba.nara.jp\0"
+"publishproxy.com\0"
+"sr.gov.pl\0"
+"sch.ly\0house\0suzuki\0servehumour.com\0"
+"cc.id.us\0"
+"chirurgiens-dentistes.fr\0budapest\0"
+"cya.gg\0"
+"jewish.museum\0somna.no\0"
+"miyota.nagano.jp\0fedex\0yandex\0"
+"asso.dz\0iwakuni.yamaguchi.jp\0"
+"sch.ng\0royrvik.no\0dvrdns.org\0"
+"bl.it\0"
+"askim.no\0penza.su\0"
+"sc.ke\0is-a-student.com\0"
+"hamura.tokyo.jp\0"
+"total\0"
+"kharkov.ua\0"
+"lcube-server.de\0"
+"hirono.iwate.jp\0"
+"s3-website.eu-west-3.amazonaws.com\0"
+"sc.kr\0"
+"*.kitakyushu.jp\0\xe8\xaf\xba\xe5\x9f\xba\xe4\xba\x9a\0"
+"zp.ua\0lib.de.us\0"
+"agriculture.museum\0"
+"vegarshei.no\0"
+"mb.it\0"
+"lahppi.no\0isa.us\0"
+"kawahara.tottori.jp\0"
+"trentino-s\xc3\xbc""d-tirol.it\0nago.okinawa.jp\0asaka.saitama.jp\0"
+"komatsu.ishikawa.jp\0kolobrzeg.pl\0"
+"economia.bo\0d\xc3\xb8nna.no\0s3-website.ca-central-1.amazonaws.com\0"
+"sc.ls\0"
+"hm.no\0"
+"far.br\0yamada.iwate.jp\0rns.tn\0"
+"sch.qa\0swiss\0"
+"komae.tokyo.jp\0"
+"portlligat.museum\0boldlygoingnowhere.org\0ddnss.org\0synology.me\0"
+"yonago.tottori.jp\0asn.lv\0"
+"lib.mo.us\0"
+"trentinos\xc3\xbc""d-tirol.it\0"
+"saga.jp\0"
+"kanagawa.jp\0shiraoi.hokkaido.jp\0seven\0"
+"koeln.museum\0photography.museum\0cc.mi.us\0"
+"filatelia.museum\0lodingen.no\0"
+"yamato.kumamoto.jp\0"
+"voss.no\0"
+"kyotanabe.kyoto.jp\0"
+"rio.br\0pisa.it\0akune.kagoshima.jp\0"
+"exchange\0"
+"trentino-alto-adige.it\0"
+"sor-odal.no\0dvag\0"
+"ube.yamaguchi.jp\0"
+"bss.design\0"
+"sandefjord.no\0"
+"sch.sa\0ownprovider.com\0"
+"read\0"
+"sk\xc3\xa5nland.no\0"
+"ug.gov.pl\0"
+"lugansk.ua\0"
+"dnepropetrovsk.ua\0"
+"veterinaire.km\0kautokeino.no\0"
+"sch.so\0"
+"shari.hokkaido.jp\0"
+"engerdal.no\0"
+"omasvuotna.no\0barsy.uk\0"
+"taketomi.okinawa.jp\0nishinoshima.shimane.jp\0"
+"mad.museum\0aaa\0"
+"s3.dualstack.ap-northeast-2.amazonaws.com\0likes-pie.com\0"
+"\xed\x95\x9c\xea\xb5\xad\0"
+"\xe5\xb1\xb1\xe5\xbd\xa2.jp\0toshima.tokyo.jp\0"
+};
+
+static const quint16 tldChunkCount = 2;
+static const quint32 tldChunks[] = {65532, 103868};
+
+QT_END_NAMESPACE
+
+#endif // QURLTLD_P_H
diff --git a/src/corelib/io/qurltlds_p.h.INFO b/src/network/kernel/qurltlds_p.h.INFO
index 33ccd458bf..33ccd458bf 100644
--- a/src/corelib/io/qurltlds_p.h.INFO
+++ b/src/network/kernel/qurltlds_p.h.INFO
diff --git a/src/network/network.pro b/src/network/network.pro
index d8453e879c..7bd54fd12e 100644
--- a/src/network/network.pro
+++ b/src/network/network.pro
@@ -15,29 +15,15 @@ msvc:equals(QT_ARCH, i386): QMAKE_LFLAGS += /BASE:0x64000000
QMAKE_DOCS = $$PWD/doc/qtnetwork.qdocconf
include(access/access.pri)
-include(bearer/bearer.pri)
include(kernel/kernel.pri)
include(socket/socket.pri)
include(ssl/ssl.pri)
QMAKE_LIBS += $$QMAKE_LIBS_NETWORK
-qtConfig(bearermanagement) {
- ANDROID_BUNDLED_JAR_DEPENDENCIES = \
- jar/QtAndroidBearer.jar
- ANDROID_LIB_DEPENDENCIES = \
- plugins/bearer/libplugins_bearer_qandroidbearer.so
- MODULE_PLUGIN_TYPES = \
- bearer
- ANDROID_PERMISSIONS += \
- android.permission.ACCESS_NETWORK_STATE
-}
-
MODULE_WINRT_CAPABILITIES = \
internetClient \
internetClientServer \
privateNetworkClientServer
-MODULE_PLUGIN_TYPES = \
- bearer
load(qt_module)
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index fa85f48ad5..bbaaf5e609 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -475,10 +475,6 @@
#include "qabstractsocket_p.h"
#include "private/qhostinfo_p.h"
-#if QT_CONFIG(bearermanagement) // ### Qt6: Remove section
-#include "private/qnetworksession_p.h"
-#endif
-#include "private/qnetworkconfiguration_p.h" // ### Qt6: Remove include
#include <qabstracteventdispatcher.h>
#include <qhostaddress.h>
@@ -514,6 +510,8 @@
QT_BEGIN_NAMESPACE
+static const int DefaultConnectTimeout = 30000;
+
#if defined QABSTRACTSOCKET_DEBUG
QT_BEGIN_INCLUDE_NAMESPACE
#include <qstring.h>
@@ -657,10 +655,6 @@ bool QAbstractSocketPrivate::initSocketLayer(QAbstractSocket::NetworkLayerProtoc
QAbstractSocket::tr("Operation on socket is not supported"));
return false;
}
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //copy network session down to the socket engine (if it has been set)
- socketEngine->setProperty("_q_networksession", q->property("_q_networksession"));
-#endif
if (!socketEngine->initialize(q->socketType(), protocol)) {
#if defined (QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocketPrivate::initSocketLayer(%s, %s) failed (%s)",
@@ -1159,14 +1153,7 @@ void QAbstractSocketPrivate::_q_connectToNextAddress()
q, SLOT(_q_abortConnectionAttempt()),
Qt::DirectConnection);
}
- int connectTimeout = QNetworkConfigurationPrivate::DefaultTimeout;
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- QSharedPointer<QNetworkSession> networkSession = qvariant_cast< QSharedPointer<QNetworkSession> >(q->property("_q_networksession"));
- if (networkSession) {
- QNetworkConfiguration networkConfiguration = networkSession->configuration();
- connectTimeout = networkConfiguration.connectTimeout();
- }
-#endif
+ int connectTimeout = DefaultConnectTimeout;
connectTimer->start(connectTimeout);
}
@@ -1953,10 +1940,6 @@ bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState
d->setError(UnsupportedSocketOperationError, tr("Operation on socket is not supported"));
return false;
}
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //copy network session down to the socket engine (if it has been set)
- d->socketEngine->setProperty("_q_networksession", property("_q_networksession"));
-#endif
bool result = d->socketEngine->initialize(socketDescriptor, socketState);
if (!result) {
d->setError(d->socketEngine->error(), d->socketEngine->errorString());
@@ -2146,10 +2129,6 @@ bool QAbstractSocket::waitForConnected(int msecs)
QElapsedTimer stopWatch;
stopWatch.start();
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- QSharedPointer<QNetworkSession> networkSession = qvariant_cast< QSharedPointer<QNetworkSession> >(property("_q_networksession"));
-#endif
-
if (d->state == HostLookupState) {
#if defined (QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocket::waitForConnected(%i) doing host name lookup", msecs);
@@ -2168,13 +2147,7 @@ bool QAbstractSocket::waitForConnected(int msecs)
if (state() == UnconnectedState)
return false; // connect not im progress anymore!
- int connectTimeout = QNetworkConfigurationPrivate::DefaultTimeout;
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- if (networkSession) {
- QNetworkConfiguration networkConfiguration = networkSession->configuration();
- connectTimeout = networkConfiguration.connectTimeout();
- }
-#endif
+ int connectTimeout = DefaultConnectTimeout;
bool timedOut = true;
#if defined (QABSTRACTSOCKET_DEBUG)
int attempt = 1;
diff --git a/src/network/socket/qabstractsocketengine.cpp b/src/network/socket/qabstractsocketengine.cpp
index 54c7452c66..44139ff81d 100644
--- a/src/network/socket/qabstractsocketengine.cpp
+++ b/src/network/socket/qabstractsocketengine.cpp
@@ -274,3 +274,5 @@ int QAbstractSocketEngine::outboundStreamCount() const
}
QT_END_NAMESPACE
+
+#include "moc_qabstractsocketengine_p.cpp"
diff --git a/src/network/socket/qhttpsocketengine.cpp b/src/network/socket/qhttpsocketengine.cpp
index 9de9b284c1..a23e2d3071 100644
--- a/src/network/socket/qhttpsocketengine.cpp
+++ b/src/network/socket/qhttpsocketengine.cpp
@@ -72,9 +72,6 @@ bool QHttpSocketEngine::initialize(QAbstractSocket::SocketType type, QAbstractSo
setSocketType(type);
d->socket = new QTcpSocket(this);
d->reply = new QHttpNetworkReply(QUrl(), this);
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- d->socket->setProperty("_q_networkSession", property("_q_networkSession"));
-#endif
// Explicitly disable proxying on the proxy socket itself to avoid
// unwanted recursion.
@@ -866,3 +863,5 @@ QAbstractSocketEngine *QHttpSocketEngineHandler::createSocketEngine(qintptr, QOb
QT_END_NAMESPACE
#endif // !QT_NO_NETWORKPROXY
+
+#include "moc_qhttpsocketengine_p.cpp"
diff --git a/src/network/socket/qlocalserver_p.h b/src/network/socket/qlocalserver_p.h
index 92616e59ce..f331a3f10d 100644
--- a/src/network/socket/qlocalserver_p.h
+++ b/src/network/socket/qlocalserver_p.h
@@ -99,15 +99,18 @@ public:
QMap<quintptr, QTcpSocket*> socketMap;
#elif defined(Q_OS_WIN)
struct Listener {
- HANDLE handle;
+ Listener() = default;
+ HANDLE handle = nullptr;
OVERLAPPED overlapped;
- bool connected;
+ bool connected = false;
+ private:
+ Q_DISABLE_COPY(Listener)
};
void setError(const QString &function);
bool addListener();
- QList<Listener> listeners;
+ std::vector<std::unique_ptr<Listener>> listeners;
HANDLE eventHandle;
QWinEventNotifier *connectionEventNotifier;
#else
diff --git a/src/network/socket/qlocalserver_win.cpp b/src/network/socket/qlocalserver_win.cpp
index 2d71a7e730..6d92ebe93a 100644
--- a/src/network/socket/qlocalserver_win.cpp
+++ b/src/network/socket/qlocalserver_win.cpp
@@ -62,8 +62,8 @@ bool QLocalServerPrivate::addListener()
{
// The object must not change its address once the
// contained OVERLAPPED struct is passed to Windows.
- listeners << Listener();
- Listener &listener = listeners.last();
+ listeners.push_back(std::make_unique<Listener>());
+ auto &listener = listeners.back();
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
@@ -175,7 +175,7 @@ bool QLocalServerPrivate::addListener()
sa.lpSecurityDescriptor = pSD.data();
}
- listener.handle = CreateNamedPipe(
+ listener->handle = CreateNamedPipe(
reinterpret_cast<const wchar_t *>(fullServerName.utf16()), // pipe name
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, // read/write access
PIPE_TYPE_BYTE | // byte type pipe
@@ -187,32 +187,32 @@ bool QLocalServerPrivate::addListener()
3000, // client time-out
&sa);
- if (listener.handle == INVALID_HANDLE_VALUE) {
+ if (listener->handle == INVALID_HANDLE_VALUE) {
setError(QLatin1String("QLocalServerPrivate::addListener"));
- listeners.removeLast();
+ listeners.pop_back();
return false;
}
if (worldSID)
FreeSid(worldSID);
- memset(&listener.overlapped, 0, sizeof(listener.overlapped));
- listener.overlapped.hEvent = eventHandle;
+ memset(&listener->overlapped, 0, sizeof(OVERLAPPED));
+ listener->overlapped.hEvent = eventHandle;
// Beware! ConnectNamedPipe will reset the eventHandle to non-signaled.
// Callers of addListener must check all listeners for connections.
- if (!ConnectNamedPipe(listener.handle, &listener.overlapped)) {
+ if (!ConnectNamedPipe(listener->handle, &listener->overlapped)) {
switch (GetLastError()) {
case ERROR_IO_PENDING:
- listener.connected = false;
+ listener->connected = false;
break;
case ERROR_PIPE_CONNECTED:
- listener.connected = true;
+ listener->connected = true;
break;
default:
- CloseHandle(listener.handle);
+ CloseHandle(listener->handle);
setError(QLatin1String("QLocalServerPrivate::addListener"));
- listeners.removeLast();
+ listeners.pop_back();
return false;
}
} else {
@@ -284,12 +284,12 @@ void QLocalServerPrivate::_q_onNewConnection()
// Testing shows that there is indeed absolutely no guarantee which listener gets
// a client connection first, so there is no way around polling all of them.
- for (int i = 0; i < listeners.size(); ) {
- HANDLE handle = listeners[i].handle;
- if (listeners[i].connected
- || GetOverlappedResult(handle, &listeners[i].overlapped, &dummy, FALSE))
+ for (size_t i = 0; i < listeners.size(); ) {
+ HANDLE handle = listeners[i]->handle;
+ if (listeners[i]->connected
+ || GetOverlappedResult(handle, &listeners[i]->overlapped, &dummy, FALSE))
{
- listeners.removeAt(i);
+ listeners.erase(listeners.begin() + i);
addListener();
@@ -319,8 +319,8 @@ void QLocalServerPrivate::closeServer()
connectionEventNotifier->deleteLater();
connectionEventNotifier = 0;
CloseHandle(eventHandle);
- for (int i = 0; i < listeners.size(); ++i)
- CloseHandle(listeners[i].handle);
+ for (size_t i = 0; i < listeners.size(); ++i)
+ CloseHandle(listeners[i]->handle);
listeners.clear();
}
diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp
index 31628846dc..ad625b758e 100644
--- a/src/network/socket/qnativesocketengine.cpp
+++ b/src/network/socket/qnativesocketengine.cpp
@@ -1382,3 +1382,5 @@ void QNativeSocketEngine::setExceptionNotificationEnabled(bool enable)
}
QT_END_NAMESPACE
+
+#include "moc_qnativesocketengine_p.cpp"
diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp
index 4f866e4da0..b1b5621b2a 100644
--- a/src/network/socket/qsocks5socketengine.cpp
+++ b/src/network/socket/qsocks5socketengine.cpp
@@ -535,9 +535,6 @@ void QSocks5SocketEnginePrivate::initialize(Socks5Mode socks5Mode)
udpData = new QSocks5UdpAssociateData;
data = udpData;
udpData->udpSocket = new QUdpSocket(q);
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- udpData->udpSocket->setProperty("_q_networksession", q->property("_q_networksession"));
-#endif
udpData->udpSocket->setProxy(QNetworkProxy::NoProxy);
QObject::connect(udpData->udpSocket, SIGNAL(readyRead()),
q, SLOT(_q_udpSocketReadNotification()),
@@ -549,9 +546,6 @@ void QSocks5SocketEnginePrivate::initialize(Socks5Mode socks5Mode)
}
data->controlSocket = new QTcpSocket(q);
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- data->controlSocket->setProperty("_q_networksession", q->property("_q_networksession"));
-#endif
data->controlSocket->setProxy(QNetworkProxy::NoProxy);
QObject::connect(data->controlSocket, SIGNAL(connected()), q, SLOT(_q_controlSocketConnected()),
Qt::DirectConnection);
@@ -1927,3 +1921,5 @@ QAbstractSocketEngine *QSocks5SocketEngineHandler::createSocketEngine(qintptr so
}
QT_END_NAMESPACE
+
+#include "moc_qsocks5socketengine_p.cpp"
diff --git a/src/network/socket/qtcpserver.cpp b/src/network/socket/qtcpserver.cpp
index c23b143de3..a404350d98 100644
--- a/src/network/socket/qtcpserver.cpp
+++ b/src/network/socket/qtcpserver.cpp
@@ -314,10 +314,6 @@ bool QTcpServer::listen(const QHostAddress &address, quint16 port)
d->serverSocketErrorString = tr("Operation on socket is not supported");
return false;
}
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //copy network session down to the socket engine (if it has been set)
- d->socketEngine->setProperty("_q_networksession", property("_q_networksession"));
-#endif
if (!d->socketEngine->initialize(d->socketType, proto)) {
d->serverSocketError = d->socketEngine->error();
d->serverSocketErrorString = d->socketEngine->errorString();
@@ -436,10 +432,6 @@ bool QTcpServer::setSocketDescriptor(qintptr socketDescriptor)
d->serverSocketErrorString = tr("Operation on socket is not supported");
return false;
}
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //copy network session down to the socket engine (if it has been set)
- d->socketEngine->setProperty("_q_networksession", property("_q_networksession"));
-#endif
if (!d->socketEngine->initialize(socketDescriptor, QAbstractSocket::ListeningState)) {
d->serverSocketError = d->socketEngine->error();
d->serverSocketErrorString = d->socketEngine->errorString();
diff --git a/src/network/ssl/qocspresponse.cpp b/src/network/ssl/qocspresponse.cpp
index bf27bb768b..fbbf8d9708 100644
--- a/src/network/ssl/qocspresponse.cpp
+++ b/src/network/ssl/qocspresponse.cpp
@@ -232,20 +232,20 @@ Q_NETWORK_EXPORT bool operator==(const QOcspResponse &lhs, const QOcspResponse &
*/
/*!
- \fn uint qHash(const QOcspResponse &response, uint seed)
+ \fn size_t qHash(const QOcspResponse &response, size_t seed)
Returns the hash value for the \a response, using \a seed to seed the calculation.
\since 5.13
\relates QHash
*/
-uint qHash(const QOcspResponse &response, uint seed) noexcept
+size_t qHash(const QOcspResponse &response, size_t seed) noexcept
{
const QOcspResponsePrivate *d = response.d.data();
Q_ASSERT(d);
QtPrivate::QHashCombine hasher;
- uint hash = hasher(seed, int(d->certificateStatus));
+ size_t hash = hasher(seed, int(d->certificateStatus));
hash = hasher(hash, int(d->revocationReason));
if (!d->signerCert.isNull())
hash = hasher(hash, d->signerCert);
diff --git a/src/network/ssl/qocspresponse.h b/src/network/ssl/qocspresponse.h
index cf6be5a369..1fc3377d58 100644
--- a/src/network/ssl/qocspresponse.h
+++ b/src/network/ssl/qocspresponse.h
@@ -73,7 +73,7 @@ enum class QOcspRevocationReason
};
class QOcspResponse;
-Q_NETWORK_EXPORT uint qHash(const QOcspResponse &response, uint seed = 0) noexcept;
+Q_NETWORK_EXPORT size_t qHash(const QOcspResponse &response, size_t seed = 0) noexcept;
class QOcspResponsePrivate;
class Q_NETWORK_EXPORT QOcspResponse
@@ -100,7 +100,7 @@ private:
friend class QSslSocketBackendPrivate;
friend Q_NETWORK_EXPORT bool operator==(const QOcspResponse &lhs, const QOcspResponse &rhs);
- friend Q_NETWORK_EXPORT uint qHash(const QOcspResponse &response, uint seed) noexcept;
+ friend Q_NETWORK_EXPORT size_t qHash(const QOcspResponse &response, size_t seed) noexcept;
QSharedDataPointer<QOcspResponsePrivate> d;
};
diff --git a/src/network/ssl/qssl.cpp b/src/network/ssl/qssl.cpp
index beb03b646a..87b9a1b038 100644
--- a/src/network/ssl/qssl.cpp
+++ b/src/network/ssl/qssl.cpp
@@ -102,29 +102,16 @@ Q_LOGGING_CATEGORY(lcSsl, "qt.network.ssl");
\value IpAddressEntry An IP address entry; the entry contains an IP address
entry that the certificate is valid for, introduced in Qt 5.13.
- \note In Qt 4, this enum was called \c {AlternateNameEntryType}. That name
- is deprecated in Qt 5.
-
\sa QSslCertificate::subjectAlternativeNames()
*/
/*!
- \typedef QSsl::AlternateNameEntryType
- \obsolete
-
- Use QSsl::AlternativeNameEntryType instead.
-*/
-
-/*!
\enum QSsl::SslProtocol
Describes the protocol of the cipher.
- \value SslV3 SSLv3; not supported by QSslSocket.
- \value SslV2 SSLv2; not supported by QSslSocket.
\value TlsV1_0 TLSv1.0
\value TlsV1_0OrLater TLSv1.0 and later versions. This option is not available when using the WinRT backend due to platform limitations.
- \value TlsV1 Obsolete, means the same as TlsV1_0
\value TlsV1_1 TLSv1.1. When using the WinRT backend this option will also enable TLSv1.0.
\value TlsV1_1OrLater TLSv1.1 and later versions. This option is not available when using the WinRT backend due to platform limitations.
\value TlsV1_2 TLSv1.2. When using the WinRT backend this option will also enable TLSv1.0 and TLSv1.1.
@@ -137,7 +124,6 @@ Q_LOGGING_CATEGORY(lcSsl, "qt.network.ssl");
\value TlsV1_3OrLater TLSv1.3 and later versions. (Since Qt 5.12)
\value UnknownProtocol The cipher's protocol cannot be determined.
\value AnyProtocol Any supported protocol. This value is used by QSslSocket only.
- \value TlsV1SslV3 Same as TlsV1_0. This enumerator is deprecated, use TlsV1_0 instead.
\value SecureProtocols The default option, using protocols known to be secure.
*/
diff --git a/src/network/ssl/qssl.h b/src/network/ssl/qssl.h
index b28c2a87b9..d0b417f9ed 100644
--- a/src/network/ssl/qssl.h
+++ b/src/network/ssl/qssl.h
@@ -72,25 +72,11 @@ namespace QSsl {
IpAddressEntry
};
-#if QT_DEPRECATED_SINCE(5,0)
- typedef AlternativeNameEntryType AlternateNameEntryType;
-#endif
-
enum SslProtocol {
-#if QT_DEPRECATED_SINCE(5, 15)
- SslV3,
- SslV2,
-#endif
TlsV1_0 = 2,
-#if QT_DEPRECATED_SINCE(5,0)
- TlsV1 = TlsV1_0,
-#endif
TlsV1_1,
TlsV1_2,
AnyProtocol,
-#if QT_DEPRECATED_SINCE(5, 15)
- TlsV1SslV3,
-#endif
SecureProtocols = AnyProtocol + 2,
TlsV1_0OrLater,
diff --git a/src/network/ssl/qsslcertificate.cpp b/src/network/ssl/qsslcertificate.cpp
index 791dc7852f..7539c26ecb 100644
--- a/src/network/ssl/qsslcertificate.cpp
+++ b/src/network/ssl/qsslcertificate.cpp
@@ -373,15 +373,6 @@ QByteArray QSslCertificate::digest(QCryptographicHash::Algorithm algorithm) cons
\sa subjectInfo()
*/
-#if QT_DEPRECATED_SINCE(5,0)
-/*!
- \fn QMultiMap<QSsl::AlternateNameEntryType, QString> QSslCertificate::alternateSubjectNames() const
- \obsolete
-
- Use QSslCertificate::subjectAlternativeNames();
-*/
-#endif
-
/*!
\fn QMultiMap<QSsl::AlternativeNameEntryType, QString> QSslCertificate::subjectAlternativeNames() const
@@ -464,86 +455,6 @@ QByteArray QSslCertificate::digest(QCryptographicHash::Algorithm algorithm) cons
\since 5.0
*/
-#if QT_DEPRECATED_SINCE(5,15)
-/*!
- \obsolete
-
- Searches all files in the \a path for certificates encoded in the
- specified \a format and returns them in a list. \a path must be a file
- or a pattern matching one or more files, as specified by \a syntax.
-
- Example:
-
- \snippet code/src_network_ssl_qsslcertificate.cpp 0
-
- \sa fromData()
-*/
-QList<QSslCertificate> QSslCertificate::fromPath(const QString &path,
- QSsl::EncodingFormat format,
- QRegExp::PatternSyntax syntax)
-{
- // $, (,), *, +, ., ?, [, ,], ^, {, | and }.
-
- // make sure to use the same path separators on Windows and Unix like systems.
- QString sourcePath = QDir::fromNativeSeparators(path);
-
- // Find the path without the filename
- QString pathPrefix = sourcePath.left(sourcePath.lastIndexOf(QLatin1Char('/')));
-
- // Check if the path contains any special chars
- int pos = -1;
- if (syntax == QRegExp::Wildcard)
- pos = pathPrefix.indexOf(QRegExp(QLatin1String("[*?[]")));
- else if (syntax != QRegExp::FixedString)
- pos = sourcePath.indexOf(QRegExp(QLatin1String("[\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\}\\|]")));
- if (pos != -1) {
- // there was a special char in the path so cut of the part containing that char.
- pathPrefix = pathPrefix.left(pos);
- const int lastIndexOfSlash = pathPrefix.lastIndexOf(QLatin1Char('/'));
- if (lastIndexOfSlash != -1)
- pathPrefix = pathPrefix.left(lastIndexOfSlash);
- else
- pathPrefix.clear();
- } else {
- // Check if the path is a file.
- if (QFileInfo(sourcePath).isFile()) {
- QFile file(sourcePath);
- QIODevice::OpenMode openMode = QIODevice::ReadOnly;
- if (format == QSsl::Pem)
- openMode |= QIODevice::Text;
- if (file.open(openMode))
- return QSslCertificate::fromData(file.readAll(), format);
- return QList<QSslCertificate>();
- }
- }
-
- // Special case - if the prefix ends up being nothing, use "." instead.
- int startIndex = 0;
- if (pathPrefix.isEmpty()) {
- pathPrefix = QLatin1String(".");
- startIndex = 2;
- }
-
- // The path can be a file or directory.
- QList<QSslCertificate> certs;
- QRegExp pattern(sourcePath, Qt::CaseSensitive, syntax);
- QDirIterator it(pathPrefix, QDir::Files, QDirIterator::FollowSymlinks | QDirIterator::Subdirectories);
- while (it.hasNext()) {
- QString filePath = startIndex == 0 ? it.next() : it.next().mid(startIndex);
- if (!pattern.exactMatch(filePath))
- continue;
-
- QFile file(filePath);
- QIODevice::OpenMode openMode = QIODevice::ReadOnly;
- if (format == QSsl::Pem)
- openMode |= QIODevice::Text;
- if (file.open(openMode))
- certs += QSslCertificate::fromData(file.readAll(), format);
- }
- return certs;
-}
-#endif // QT_DEPRECATED_SINCE(5,15)
-
/*!
\since 5.15
@@ -616,7 +527,7 @@ QList<QSslCertificate> QSslCertificate::fromPath(const QString &path,
#if QT_CONFIG(regularexpression)
if (syntax == PatternSyntax::Wildcard)
- sourcePath = QRegularExpression::wildcardToRegularExpression(sourcePath);
+ sourcePath = QRegularExpression::wildcardToRegularExpression(sourcePath, QRegularExpression::UnanchoredWildcardConversion);
QRegularExpression pattern(QRegularExpression::anchoredPattern(sourcePath));
#endif
@@ -850,7 +761,7 @@ QString QSslCertificate::subjectDisplayName() const
}
/*!
- \fn uint qHash(const QSslCertificate &key, uint seed)
+ \fn size_t qHash(const QSslCertificate &key, size_t seed)
Returns the hash value for the \a key, using \a seed to seed the calculation.
\since 5.4
diff --git a/src/network/ssl/qsslcertificate.h b/src/network/ssl/qsslcertificate.h
index 147919fa3b..46119ae046 100644
--- a/src/network/ssl/qsslcertificate.h
+++ b/src/network/ssl/qsslcertificate.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtNetwork module of the Qt Toolkit.
@@ -50,7 +50,6 @@
#include <QtCore/qbytearray.h>
#include <QtCore/qcryptographichash.h>
#include <QtCore/qdatetime.h>
-#include <QtCore/qregexp.h>
#include <QtCore/qsharedpointer.h>
#include <QtCore/qmap.h>
#include <QtNetwork/qssl.h>
@@ -66,7 +65,7 @@ class QStringList;
class QSslCertificate;
// qHash is a friend, but we can't use default arguments for friends (§8.3.6.4)
-Q_NETWORK_EXPORT uint qHash(const QSslCertificate &key, uint seed = 0) noexcept;
+Q_NETWORK_EXPORT size_t qHash(const QSslCertificate &key, size_t seed = 0) noexcept;
class QSslCertificatePrivate;
class Q_NETWORK_EXPORT QSslCertificate
@@ -130,10 +129,6 @@ public:
QList<QByteArray> subjectInfoAttributes() const;
QList<QByteArray> issuerInfoAttributes() const;
-#if QT_DEPRECATED_SINCE(5,0)
- QT_DEPRECATED inline QMultiMap<QSsl::AlternateNameEntryType, QString>
- alternateSubjectNames() const { return subjectAlternativeNames(); }
-#endif
QMultiMap<QSsl::AlternativeNameEntryType, QString> subjectAlternativeNames() const;
QDateTime effectiveDate() const;
QDateTime expiryDate() const;
@@ -146,11 +141,6 @@ public:
QByteArray toDer() const;
QString toText() const;
-#if QT_DEPRECATED_SINCE(5,15)
- QT_DEPRECATED_X("Use the overload not using QRegExp")
- static QList<QSslCertificate> fromPath(const QString &path, QSsl::EncodingFormat format,
- QRegExp::PatternSyntax syntax);
-#endif
static QList<QSslCertificate> fromPath(const QString &path,
QSsl::EncodingFormat format = QSsl::Pem,
PatternSyntax syntax = PatternSyntax::FixedString);
@@ -180,7 +170,7 @@ private:
friend class QSslCertificatePrivate;
friend class QSslSocketBackendPrivate;
- friend Q_NETWORK_EXPORT uint qHash(const QSslCertificate &key, uint seed) noexcept;
+ friend Q_NETWORK_EXPORT size_t qHash(const QSslCertificate &key, size_t seed) noexcept;
};
Q_DECLARE_SHARED(QSslCertificate)
diff --git a/src/network/ssl/qsslcertificate_openssl.cpp b/src/network/ssl/qsslcertificate_openssl.cpp
index 6f1fb26add..2bb7c930f2 100644
--- a/src/network/ssl/qsslcertificate_openssl.cpp
+++ b/src/network/ssl/qsslcertificate_openssl.cpp
@@ -72,7 +72,7 @@ bool QSslCertificate::operator==(const QSslCertificate &other) const
return false;
}
-uint qHash(const QSslCertificate &key, uint seed) noexcept
+size_t qHash(const QSslCertificate &key, size_t seed) noexcept
{
if (X509 * const x509 = key.d->x509) {
const EVP_MD *sha1 = q_EVP_sha1();
diff --git a/src/network/ssl/qsslcertificate_qt.cpp b/src/network/ssl/qsslcertificate_qt.cpp
index 8b5035ad96..33deaf558f 100644
--- a/src/network/ssl/qsslcertificate_qt.cpp
+++ b/src/network/ssl/qsslcertificate_qt.cpp
@@ -64,7 +64,7 @@ bool QSslCertificate::operator==(const QSslCertificate &other) const
return d->derData == other.d->derData;
}
-uint qHash(const QSslCertificate &key, uint seed) noexcept
+size_t qHash(const QSslCertificate &key, size_t seed) noexcept
{
// DER is the native encoding here, so toDer() is just "return d->derData":
return qHash(key.toDer(), seed);
diff --git a/src/network/ssl/qsslconfiguration.cpp b/src/network/ssl/qsslconfiguration.cpp
index f5ce02807f..adff0a249f 100644
--- a/src/network/ssl/qsslconfiguration.cpp
+++ b/src/network/ssl/qsslconfiguration.cpp
@@ -54,7 +54,6 @@ const QSsl::SslOptions QSslConfigurationPrivate::defaultSslOptions = QSsl::SslOp
|QSsl::SslOptionDisableSessionPersistence;
const char QSslConfiguration::ALPNProtocolHTTP2[] = "h2";
-const char QSslConfiguration::NextProtocolSpdy3_0[] = "spdy/3";
const char QSslConfiguration::NextProtocolHttp1_1[] = "http/1.1";
/*!
@@ -134,12 +133,6 @@ const char QSslConfiguration::NextProtocolHttp1_1[] = "http/1.1";
*/
/*!
- \variable QSslConfiguration::NextProtocolSpdy3_0
- \brief The value used for negotiating SPDY 3.0 during the Next
- Protocol Negotiation.
-*/
-
-/*!
\variable QSslConfiguration::NextProtocolHttp1_1
\brief The value used for negotiating HTTP 1.1 during the Next
Protocol Negotiation.
@@ -229,7 +222,9 @@ bool QSslConfiguration::operator==(const QSslConfiguration &other) const
d->nextNegotiatedProtocol == other.d->nextNegotiatedProtocol &&
d->nextProtocolNegotiationStatus == other.d->nextProtocolNegotiationStatus &&
d->dtlsCookieEnabled == other.d->dtlsCookieEnabled &&
- d->ocspStaplingEnabled == other.d->ocspStaplingEnabled;
+ d->ocspStaplingEnabled == other.d->ocspStaplingEnabled &&
+ d->reportFromCallback == other.d->reportFromCallback &&
+ d->missingCertIsFatal == other.d->missingCertIsFatal;
}
/*!
@@ -274,7 +269,9 @@ bool QSslConfiguration::isNull() const
d->nextAllowedProtocols.isEmpty() &&
d->nextNegotiatedProtocol.isNull() &&
d->nextProtocolNegotiationStatus == QSslConfiguration::NextProtocolNegotiationNone &&
- d->ocspStaplingEnabled == false);
+ d->ocspStaplingEnabled == false &&
+ d->reportFromCallback == false &&
+ d->missingCertIsFatal == false);
}
/*!
@@ -1035,7 +1032,7 @@ QByteArray QSslConfiguration::nextNegotiatedProtocol() const
Whether or not the negotiation succeeded can be queried through
nextProtocolNegotiationStatus().
- \sa nextNegotiatedProtocol(), nextProtocolNegotiationStatus(), allowedNextProtocols(), QSslConfiguration::NextProtocolSpdy3_0, QSslConfiguration::NextProtocolHttp1_1
+ \sa nextNegotiatedProtocol(), nextProtocolNegotiationStatus(), allowedNextProtocols(), QSslConfiguration::NextProtocolHttp1_1
*/
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
void QSslConfiguration::setAllowedNextProtocols(const QList<QByteArray> &protocols)
@@ -1053,7 +1050,7 @@ void QSslConfiguration::setAllowedNextProtocols(QList<QByteArray> protocols)
server through the Next Protocol Negotiation (NPN) or Application-Layer
Protocol Negotiation (ALPN) TLS extension, as set by setAllowedNextProtocols().
- \sa nextNegotiatedProtocol(), nextProtocolNegotiationStatus(), setAllowedNextProtocols(), QSslConfiguration::NextProtocolSpdy3_0, QSslConfiguration::NextProtocolHttp1_1
+ \sa nextNegotiatedProtocol(), nextProtocolNegotiationStatus(), setAllowedNextProtocols(), QSslConfiguration::NextProtocolHttp1_1
*/
QList<QByteArray> QSslConfiguration::allowedNextProtocols() const
{
@@ -1199,6 +1196,91 @@ bool QSslConfiguration::ocspStaplingEnabled() const
return d->ocspStaplingEnabled;
}
+/*!
+ \since 6.0
+
+ Returns true if a verification callback will emit QSslSocket::handshakeInterruptedOnError()
+ early, before concluding the handshake.
+
+ \note This function always returns false for all backends but OpenSSL.
+
+ \sa setHandshakeMustInterruptOnError(), QSslSocket::handshakeInterruptedOnError(), QSslSocket::continueInterruptedHandshake()
+*/
+bool QSslConfiguration::handshakeMustInterruptOnError() const
+{
+ return d->reportFromCallback;
+}
+
+/*!
+ \since 6.0
+
+ If \a interrupt is true and the underlying backend supports this option,
+ errors found during certificate verification are reported immediately
+ by emitting QSslSocket::handshakeInterruptedOnError(). This allows
+ to stop the unfinished handshake and send a proper alert message to
+ a peer. No special action is required from the application in this case.
+ QSslSocket will close the connection after sending the alert message.
+ If the application after inspecting the error wants to continue the
+ handshake, it must call QSslSocket::continueInterruptedHandshake()
+ from its slot function. The signal-slot connection must be direct.
+
+ \note When interrupting handshake is enabled, errors that would otherwise
+ be reported by QSslSocket::peerVerifyError() are instead only reported by
+ QSslSocket::handshakeInterruptedOnError().
+ \note Even if the handshake was continued, these errors will be
+ reported when emitting QSslSocket::sslErrors() signal (and thus must
+ be ignored in the corresponding function slot).
+
+ \sa handshakeMustInterruptOnError(), QSslSocket::handshakeInterruptedOnError(), QSslSocket::continueInterruptedHandshake()
+*/
+void QSslConfiguration::setHandshakeMustInterruptOnError(bool interrupt)
+{
+#if QT_CONFIG(openssl)
+ d->reportFromCallback = interrupt;
+#else
+ Q_UNUSED(interrupt);
+ qCWarning(lcSsl, "This operation requires OpenSSL as TLS backend");
+#endif
+}
+
+/*!
+ \since 6.0
+
+ Returns true if errors with code QSslError::NoPeerCertificate
+ cannot be ignored.
+
+ \note Always returns false for all TLS backends but OpenSSL.
+
+ \sa QSslSocket::ignoreSslErrors(), setMissingCertificateIsFatal()
+*/
+bool QSslConfiguration::missingCertificateIsFatal() const
+{
+ return d->missingCertIsFatal;
+}
+
+/*!
+ \since 6.0
+
+ If \a cannotRecover is true, and verification mode in use is
+ QSslSocket::VerifyPeer or QSslSocket::AutoVerifyPeer (for a
+ client-side socket), the missing peer's certificate would be
+ treated as an unrecoverable error that cannot be ignored. A proper
+ alert message will be sent to the peer before closing the connection.
+
+ \note Only available if Qt was configured and built with OpenSSL backend.
+
+ \sa QSslSocket::ignoreSslErrors(), QSslSocket::PeerVerifyMode, missingCertificateIsFatal()
+*/
+void QSslConfiguration::setMissingCertificateIsFatal(bool cannotRecover)
+{
+#if QT_CONFIG(openssl)
+ d->missingCertIsFatal = cannotRecover;
+#else
+ Q_UNUSED(cannotRecover);
+ qCWarning(lcSsl, "Handling a missing certificate as a fatal error requires an OpenSSL backend");
+#endif // openssl
+}
+
/*! \internal
*/
bool QSslConfigurationPrivate::peerSessionWasShared(const QSslConfiguration &configuration) {
diff --git a/src/network/ssl/qsslconfiguration.h b/src/network/ssl/qsslconfiguration.h
index 1c181121f4..1ce01dbee9 100644
--- a/src/network/ssl/qsslconfiguration.h
+++ b/src/network/ssl/qsslconfiguration.h
@@ -66,7 +66,6 @@
QT_BEGIN_NAMESPACE
-template<typename T> class QList;
class QSslCertificate;
class QSslCipher;
class QSslKey;
@@ -174,6 +173,12 @@ public:
static void setDefaultDtlsConfiguration(const QSslConfiguration &configuration);
#endif // dtls
+ bool handshakeMustInterruptOnError() const;
+ void setHandshakeMustInterruptOnError(bool interrupt);
+
+ bool missingCertificateIsFatal() const;
+ void setMissingCertificateIsFatal(bool cannotRecover);
+
void setOcspStaplingEnabled(bool enable);
bool ocspStaplingEnabled() const;
@@ -194,7 +199,6 @@ public:
NextProtocolNegotiationStatus nextProtocolNegotiationStatus() const;
static const char ALPNProtocolHTTP2[];
- static const char NextProtocolSpdy3_0[];
static const char NextProtocolHttp1_1[];
private:
diff --git a/src/network/ssl/qsslconfiguration_p.h b/src/network/ssl/qsslconfiguration_p.h
index 83126bb9a0..6ee3490df6 100644
--- a/src/network/ssl/qsslconfiguration_p.h
+++ b/src/network/ssl/qsslconfiguration_p.h
@@ -149,6 +149,14 @@ public:
const bool ocspStaplingEnabled = false;
#endif
+#if QT_CONFIG(openssl)
+ bool reportFromCallback = false;
+ bool missingCertIsFatal = false;
+#else
+ const bool reportFromCallback = false;
+ const bool missingCertIsFatal = false;
+#endif // openssl
+
// in qsslsocket.cpp:
static QSslConfiguration defaultConfiguration();
static void setDefaultConfiguration(const QSslConfiguration &configuration);
diff --git a/src/network/ssl/qsslcontext_openssl.cpp b/src/network/ssl/qsslcontext_openssl.cpp
index 0aa8a4f438..78e37460c8 100644
--- a/src/network/ssl/qsslcontext_openssl.cpp
+++ b/src/network/ssl/qsslcontext_openssl.cpp
@@ -56,6 +56,7 @@ QT_BEGIN_NAMESPACE
// defined in qsslsocket_openssl.cpp:
extern int q_X509Callback(int ok, X509_STORE_CTX *ctx);
+extern "C" int q_X509CallbackDirect(int ok, X509_STORE_CTX *ctx);
extern QString getErrorsFromOpenSsl();
#if QT_CONFIG(dtls)
@@ -290,42 +291,31 @@ void QSslContext::initSslContext(QSslContext *sslContext, QSslSocket::SslMode mo
bool unsupportedProtocol = false;
bool isDtls = false;
init_context:
- if (sslContext->sslConfiguration.protocol() == QSsl::SslV2) {
- // SSL 2 is no longer supported, but chosen deliberately -> error
- sslContext->ctx = nullptr;
- unsupportedProtocol = true;
- } else if (sslContext->sslConfiguration.protocol() == QSsl::SslV3) {
- // SSL 3 is no longer supported, but chosen deliberately -> error
- sslContext->ctx = nullptr;
- unsupportedProtocol = true;
- } else {
- switch (sslContext->sslConfiguration.protocol()) {
- case QSsl::DtlsV1_0:
- case QSsl::DtlsV1_0OrLater:
- case QSsl::DtlsV1_2:
- case QSsl::DtlsV1_2OrLater:
+ switch (sslContext->sslConfiguration.protocol()) {
+ case QSsl::DtlsV1_0:
+ case QSsl::DtlsV1_0OrLater:
+ case QSsl::DtlsV1_2:
+ case QSsl::DtlsV1_2OrLater:
#if QT_CONFIG(dtls)
- isDtls = true;
- sslContext->ctx = q_SSL_CTX_new(client ? q_DTLS_client_method() : q_DTLS_server_method());
+ isDtls = true;
+ sslContext->ctx = q_SSL_CTX_new(client ? q_DTLS_client_method() : q_DTLS_server_method());
#else // dtls
- sslContext->ctx = nullptr;
- unsupportedProtocol = true;
- qCWarning(lcSsl, "DTLS protocol requested, but feature 'dtls' is disabled");
-
+ sslContext->ctx = nullptr;
+ unsupportedProtocol = true;
+ qCWarning(lcSsl, "DTLS protocol requested, but feature 'dtls' is disabled");
#endif // dtls
- break;
- case QSsl::TlsV1_3:
- case QSsl::TlsV1_3OrLater:
+ break;
+ case QSsl::TlsV1_3:
+ case QSsl::TlsV1_3OrLater:
#if !defined(TLS1_3_VERSION)
- qCWarning(lcSsl, "TLS 1.3 is not supported");
- sslContext->ctx = nullptr;
- unsupportedProtocol = true;
- break;
+ qCWarning(lcSsl, "TLS 1.3 is not supported");
+ sslContext->ctx = nullptr;
+ unsupportedProtocol = true;
+ break;
#endif // TLS1_3_VERSION
- default:
- // The ssl options will actually control the supported methods
- sslContext->ctx = q_SSL_CTX_new(client ? q_TLS_client_method() : q_TLS_server_method());
- }
+ default:
+ // The ssl options will actually control the supported methods
+ sslContext->ctx = q_SSL_CTX_new(client ? q_TLS_client_method() : q_TLS_server_method());
}
if (!sslContext->ctx) {
@@ -377,7 +367,6 @@ init_context:
#endif // TLS1_3_VERSION
break;
// Ranges:
- case QSsl::TlsV1SslV3:
case QSsl::AnyProtocol:
case QSsl::SecureProtocols:
case QSsl::TlsV1_0OrLater:
@@ -419,12 +408,6 @@ init_context:
Q_UNREACHABLE();
break;
#endif // TLS1_3_VERSION
- case QSsl::SslV2:
- case QSsl::SslV3:
- // These protocols are not supported, and we handle
- // them as an error (see the code above).
- Q_UNREACHABLE();
- break;
case QSsl::UnknownProtocol:
break;
}
@@ -594,11 +577,20 @@ init_context:
if (sslContext->sslConfiguration.peerVerifyMode() == QSslSocket::VerifyNone) {
q_SSL_CTX_set_verify(sslContext->ctx, SSL_VERIFY_NONE, nullptr);
} else {
- q_SSL_CTX_set_verify(sslContext->ctx, SSL_VERIFY_PEER,
-#if QT_CONFIG(dtls)
- isDtls ? dtlscallbacks::q_X509DtlsCallback :
-#endif // dtls
- q_X509Callback);
+ auto verificationCallback =
+ #if QT_CONFIG(dtls)
+ isDtls ? dtlscallbacks::q_X509DtlsCallback :
+ #endif // dtls
+ q_X509Callback;
+
+ if (!isDtls && configuration.handshakeMustInterruptOnError())
+ verificationCallback = q_X509CallbackDirect;
+
+ auto verificationMode = SSL_VERIFY_PEER;
+ if (!isDtls && sslContext->sslConfiguration.missingCertificateIsFatal())
+ verificationMode |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
+
+ q_SSL_CTX_set_verify(sslContext->ctx, verificationMode, verificationCallback);
}
#ifdef TLS1_3_VERSION
diff --git a/src/network/ssl/qssldiffiehellmanparameters.cpp b/src/network/ssl/qssldiffiehellmanparameters.cpp
index 7807afaa30..c8f3e564a5 100644
--- a/src/network/ssl/qssldiffiehellmanparameters.cpp
+++ b/src/network/ssl/qssldiffiehellmanparameters.cpp
@@ -316,7 +316,7 @@ QDebug operator<<(QDebug debug, const QSslDiffieHellmanParameters &dhparam)
Returns an hash value for \a dhparam, using \a seed to seed
the calculation.
*/
-uint qHash(const QSslDiffieHellmanParameters &dhparam, uint seed) noexcept
+size_t qHash(const QSslDiffieHellmanParameters &dhparam, size_t seed) noexcept
{
return qHash(dhparam.d->derData, seed);
}
diff --git a/src/network/ssl/qssldiffiehellmanparameters.h b/src/network/ssl/qssldiffiehellmanparameters.h
index f62a3b8f44..6a3cf01ddc 100644
--- a/src/network/ssl/qssldiffiehellmanparameters.h
+++ b/src/network/ssl/qssldiffiehellmanparameters.h
@@ -56,7 +56,7 @@ class QSslDiffieHellmanParametersPrivate;
class QSslDiffieHellmanParameters;
// qHash is a friend, but we can't use default arguments for friends (§8.3.6.4)
-Q_NETWORK_EXPORT uint qHash(const QSslDiffieHellmanParameters &dhparam, uint seed = 0) noexcept;
+Q_NETWORK_EXPORT size_t qHash(const QSslDiffieHellmanParameters &dhparam, size_t seed = 0) noexcept;
#ifndef QT_NO_DEBUG_STREAM
class QDebug;
@@ -106,7 +106,7 @@ private:
#ifndef QT_NO_DEBUG_STREAM
friend Q_NETWORK_EXPORT QDebug operator<<(QDebug debug, const QSslDiffieHellmanParameters &dhparam);
#endif
- friend Q_NETWORK_EXPORT uint qHash(const QSslDiffieHellmanParameters &dhparam, uint seed) noexcept;
+ friend Q_NETWORK_EXPORT size_t qHash(const QSslDiffieHellmanParameters &dhparam, size_t seed) noexcept;
};
Q_DECLARE_SHARED(QSslDiffieHellmanParameters)
diff --git a/src/network/ssl/qsslellipticcurve.cpp b/src/network/ssl/qsslellipticcurve.cpp
index 5608d32fa7..f7faa607bd 100644
--- a/src/network/ssl/qsslellipticcurve.cpp
+++ b/src/network/ssl/qsslellipticcurve.cpp
@@ -156,7 +156,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn uint qHash(QSslEllipticCurve curve, uint seed)
+ \fn size_t qHash(QSslEllipticCurve curve, size_t seed)
\since 5.5
\relates QHash
diff --git a/src/network/ssl/qsslellipticcurve.h b/src/network/ssl/qsslellipticcurve.h
index 28de3a03b4..c63552c680 100644
--- a/src/network/ssl/qsslellipticcurve.h
+++ b/src/network/ssl/qsslellipticcurve.h
@@ -52,7 +52,7 @@ QT_BEGIN_NAMESPACE
class QSslEllipticCurve;
// qHash is a friend, but we can't use default arguments for friends (§8.3.6.4)
-Q_DECL_CONSTEXPR uint qHash(QSslEllipticCurve curve, uint seed = 0) noexcept;
+Q_DECL_CONSTEXPR size_t qHash(QSslEllipticCurve curve, size_t seed = 0) noexcept;
class QSslEllipticCurve {
public:
@@ -78,7 +78,7 @@ private:
int id;
friend Q_DECL_CONSTEXPR bool operator==(QSslEllipticCurve lhs, QSslEllipticCurve rhs) noexcept;
- friend Q_DECL_CONSTEXPR uint qHash(QSslEllipticCurve curve, uint seed) noexcept;
+ friend Q_DECL_CONSTEXPR size_t qHash(QSslEllipticCurve curve, size_t seed) noexcept;
friend class QSslContext;
friend class QSslSocketPrivate;
@@ -87,7 +87,7 @@ private:
Q_DECLARE_TYPEINFO(QSslEllipticCurve, Q_PRIMITIVE_TYPE);
-Q_DECL_CONSTEXPR inline uint qHash(QSslEllipticCurve curve, uint seed) noexcept
+Q_DECL_CONSTEXPR inline size_t qHash(QSslEllipticCurve curve, size_t seed) noexcept
{ return qHash(curve.id, seed); }
Q_DECL_CONSTEXPR inline bool operator==(QSslEllipticCurve lhs, QSslEllipticCurve rhs) noexcept
diff --git a/src/network/ssl/qsslerror.cpp b/src/network/ssl/qsslerror.cpp
index cdc018a508..5e935adf09 100644
--- a/src/network/ssl/qsslerror.cpp
+++ b/src/network/ssl/qsslerror.cpp
@@ -362,7 +362,7 @@ QSslCertificate QSslError::certificate() const
\since 5.4
\relates QHash
*/
-uint qHash(const QSslError &key, uint seed) noexcept
+size_t qHash(const QSslError &key, size_t seed) noexcept
{
QtPrivate::QHashCombine hash;
seed = hash(seed, key.error());
diff --git a/src/network/ssl/qsslerror.h b/src/network/ssl/qsslerror.h
index 28eb1a9ea8..834684cd9d 100644
--- a/src/network/ssl/qsslerror.h
+++ b/src/network/ssl/qsslerror.h
@@ -124,7 +124,7 @@ private:
};
Q_DECLARE_SHARED(QSslError)
-Q_NETWORK_EXPORT uint qHash(const QSslError &key, uint seed = 0) noexcept;
+Q_NETWORK_EXPORT size_t qHash(const QSslError &key, size_t seed = 0) noexcept;
#ifndef QT_NO_DEBUG_STREAM
class QDebug;
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index f411732036..5313e97430 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -228,6 +228,74 @@
*/
/*!
+ \enum QAlertLevel
+ \brief Describes the level of an alert message
+ \relates QSslSocket
+ \since 6.0
+
+ \ingroup network
+ \ingroup ssl
+ \inmodule QtNetwork
+
+ This enum describes the level of an alert message that was sent
+ or received.
+
+ \value Warning Non-fatal alert message
+ \value Fatal Fatal alert message, the underlying backend will
+ handle such an alert properly and close the connection.
+ \value Unknown An alert of unknown level of severity.
+*/
+
+/*!
+ \enum QAlertType
+ \brief Enumerates possible codes that an alert message can have
+ \relates QSslSocket
+ \since 6.0
+
+ \ingroup network
+ \ingroup ssl
+ \inmodule QtNetwork
+
+ See \l{https://tools.ietf.org/html/rfc8446#page-85}{RFC 8446, section 6}
+ for the possible values and their meaning.
+
+ \value CloseNotify,
+ \value UnexpectedMessage
+ \value BadRecordMac
+ \value RecordOverflow
+ \value DecompressionFailure
+ \value HandshakeFailure
+ \value NoCertificate
+ \value BadCertificate
+ \value UnsupportedCertificate
+ \value CertificateRevoked
+ \value CertificateExpired
+ \value CertificateUnknown
+ \value IllegalParameter
+ \value UnknownCa
+ \value AccessDenied
+ \value DecodeError
+ \value DecryptError
+ \value ExportRestriction
+ \value ProtocolVersion
+ \value InsufficientSecurity
+ \value InternalError
+ \value InappropriateFallback
+ \value UserCancelled
+ \value NoRenegotiation
+ \value MissingExtension
+ \value UnsupportedExtension
+ \value CertificateUnobtainable
+ \value UnrecognizedName
+ \value BadCertificateStatusResponse
+ \value BadCertificateHashValue
+ \value UnknownPskIdentity
+ \value CertificateRequired
+ \value NoApplicationProtocol
+ \value UnknownAlertMessage
+*/
+
+/*!
\fn void QSslSocket::encrypted()
This signal is emitted when QSslSocket enters encrypted mode. After this
@@ -323,6 +391,49 @@
*/
/*!
+ \fn void QSslSocket::alertSent(QAlertLevel level, QAlertType type, const QString &description)
+
+ QSslSocket emits this signal if an alert message was sent to a peer. \a level
+ describes if it was a warning or a fatal error. \a type gives the code
+ of the alert message. When a textual description of the alert message is
+ available, it is supplied in \a description.
+
+ \note This signal is mostly informational and can be used for debugging
+ purposes, normally it does not require any actions from the application.
+ \note Not all backends support this functionality.
+
+ \sa alertReceived(), QAlertLevel, QAlertType
+*/
+
+/*!
+ \fn void QSslSocket::alertReceived(QAlertLevel level, QAlertType type, const QString &description)
+
+ QSslSocket emits this signal if an alert message was received from a peer.
+ \a level tells if the alert was fatal or it was a warning. \a type is the
+ code explaining why the alert was sent. When a textual description of
+ the alert message is available, it is supplied in \a description.
+
+ \note The signal is mostly for informational and debugging purposes and does not
+ require any handling in the application. If the alert was fatal, underlying
+ backend will handle it and close the connection.
+ \note Not all backends support this functionality.
+
+ \sa alertSent(), QAlertLevel, QAlertType
+*/
+
+/*!
+ \fn void QSslSocket::handshakeInterruptedOnError(const QSslError &error)
+
+ QSslSocket emits this signal if a certificate verification error was
+ found and if early error reporting was enabled in QSslConfiguration.
+ An application is expected to inspect the \a error and decide if
+ it wants to continue the handshake, or abort it and send an alert message
+ to the peer. The signal-slot connection must be direct.
+
+ \sa continueInterruptedHandshake(), sslErrors(), QSslConfiguration::setHandshakeMustInterruptOnError()
+*/
+
+/*!
\fn void QSslSocket::newSessionTicketReceived()
\since 5.15
@@ -993,7 +1104,10 @@ void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration)
#if QT_CONFIG(ocsp)
d->configuration.ocspStaplingEnabled = configuration.ocspStaplingEnabled();
#endif
-
+#if QT_CONFIG(openssl)
+ d->configuration.reportFromCallback = configuration.handshakeMustInterruptOnError();
+ d->configuration.missingCertIsFatal = configuration.missingCertificateIsFatal();
+#endif // openssl
// if the CA certificates were set explicitly (either via
// QSslConfiguration::setCaCertificates() or QSslSocket::setCaCertificates(),
// we cannot load the certificates on demand
@@ -1413,40 +1527,6 @@ QList<QSslCipher> QSslSocket::supportedCiphers()
/*!
\deprecated
- Use QSslConfiguration::addCaCertificates() instead.
-
- Searches all files in the \a path for certificates encoded in the
- specified \a format and adds them to this socket's CA certificate
- database. \a path must be a file or a pattern matching one or more
- files, as specified by \a syntax. Returns \c true if one or more
- certificates are added to the socket's CA certificate database;
- otherwise returns \c false.
-
- The CA certificate database is used by the socket during the
- handshake phase to validate the peer's certificate.
-
- For more precise control, use addCaCertificate().
-
- \sa addCaCertificate(), QSslCertificate::fromPath()
-*/
-bool QSslSocket::addCaCertificates(const QString &path, QSsl::EncodingFormat format,
- QRegExp::PatternSyntax syntax)
-{
- Q_D(QSslSocket);
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- QList<QSslCertificate> certs = QSslCertificate::fromPath(path, format, syntax);
-QT_WARNING_POP
- if (certs.isEmpty())
- return false;
-
- d->configuration.caCertificates += certs;
- return true;
-}
-
-/*!
- \deprecated
-
Use QSslConfiguration::addCaCertificate() instead.
Adds the \a certificate to this socket's CA certificate database.
@@ -1533,29 +1613,6 @@ QList<QSslCertificate> QSslSocket::caCertificates() const
/*!
\deprecated
- Use QSslConfiguration::addCaCertificates() on the default QSslConfiguration instead.
-
- Searches all files in the \a path for certificates with the
- specified \a encoding and adds them to the default CA certificate
- database. \a path can be an explicit file, or it can contain
- wildcards in the format specified by \a syntax. Returns \c true if
- any CA certificates are added to the default database.
-
- Each SSL socket's CA certificate database is initialized to the
- default CA certificate database.
-
- \sa QSslConfiguration::caCertificates(), QSslConfiguration::addCaCertificates(),
- QSslConfiguration::addCaCertificate()
-*/
-bool QSslSocket::addDefaultCaCertificates(const QString &path, QSsl::EncodingFormat encoding,
- QRegExp::PatternSyntax syntax)
-{
- return QSslSocketPrivate::addDefaultCaCertificates(path, encoding, syntax);
-}
-
-/*!
- \deprecated
-
Use QSslConfiguration::addCaCertificate() on the default QSslConfiguration instead.
Adds \a certificate to the default CA certificate database. Each
@@ -2083,6 +2140,23 @@ void QSslSocket::ignoreSslErrors(const QList<QSslError> &errors)
d->ignoreErrorsList = errors;
}
+
+/*!
+ \since 6.0
+
+ If an application wants to conclude a handshake even after receiving
+ handshakeInterruptedOnError() signal, it must call this function.
+ This call must be done from a slot function attached to the signal.
+ The signal-slot connection must be direct.
+
+ \sa handshakeInterruptedOnError(), QSslConfiguration::setHandshakeMustInterruptOnError()
+*/
+void QSslSocket::continueInterruptedHandshake()
+{
+ Q_D(QSslSocket);
+ d->handshakeInterrupted = false;
+}
+
/*!
\internal
*/
@@ -2257,13 +2331,24 @@ void QSslSocketPrivate::init()
*/
bool QSslSocketPrivate::verifyProtocolSupported(const char *where)
{
- if (configuration.protocol == QSsl::SslV2 || configuration.protocol == QSsl::SslV3) {
- qCWarning(lcSsl) << where << "Attempted to use an unsupported protocol.";
+ QLatin1String protocolName("DTLS");
+ switch (configuration.protocol) {
+ case QSsl::UnknownProtocol:
+ // UnknownProtocol, according to our docs, is for cipher whose protocol is unknown.
+ // Should not be used when configuring QSslSocket.
+ protocolName = QLatin1String("UnknownProtocol");
+ Q_FALLTHROUGH();
+ case QSsl::DtlsV1_0:
+ case QSsl::DtlsV1_2:
+ case QSsl::DtlsV1_0OrLater:
+ case QSsl::DtlsV1_2OrLater:
+ qCWarning(lcSsl) << where << "QSslConfiguration with unexpected protocol" << protocolName;
setErrorAndEmit(QAbstractSocket::SslInvalidUserDataError,
QSslSocket::tr("Attempted to use an unsupported protocol."));
return false;
+ default:
+ return true;
}
- return true;
}
/*!
@@ -2376,28 +2461,6 @@ void QSslSocketPrivate::setDefaultCaCertificates(const QList<QSslCertificate> &c
/*!
\internal
*/
-bool QSslSocketPrivate::addDefaultCaCertificates(const QString &path, QSsl::EncodingFormat format,
- QRegExp::PatternSyntax syntax)
-{
- QSslSocketPrivate::ensureInitialized();
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- QList<QSslCertificate> certs = QSslCertificate::fromPath(path, format, syntax);
-QT_WARNING_POP
- if (certs.isEmpty())
- return false;
-
- QMutexLocker locker(&globalData()->mutex);
- globalData()->config.detach();
- globalData()->config->caCertificates += certs;
- globalData()->dtlsConfig.detach();
- globalData()->dtlsConfig->caCertificates += certs;
- return true;
-}
-
-/*!
- \internal
-*/
void QSslSocketPrivate::addDefaultCaCertificate(const QSslCertificate &cert)
{
QSslSocketPrivate::ensureInitialized();
@@ -2477,6 +2540,10 @@ void QSslConfigurationPrivate::deepCopyDefaultConfiguration(QSslConfigurationPri
#if QT_CONFIG(ocsp)
ptr->ocspStaplingEnabled = global->ocspStaplingEnabled;
#endif
+#if QT_CONFIG(openssl)
+ ptr->reportFromCallback = global->reportFromCallback;
+ ptr->missingCertIsFatal = global->missingCertIsFatal;
+#endif
}
/*!
@@ -2519,10 +2586,6 @@ void QSslSocketPrivate::createPlainSocket(QIODevice::OpenMode openMode)
q->setPeerName(QString());
plainSocket = new QTcpSocket(q);
-#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
- //copy network session down to the plain socket (if it has been set)
- plainSocket->setProperty("_q_networksession", q->property("_q_networksession"));
-#endif
q->connect(plainSocket, SIGNAL(connected()),
q, SLOT(_q_connectedSlot()),
Qt::DirectConnection);
diff --git a/src/network/ssl/qsslsocket.h b/src/network/ssl/qsslsocket.h
index 298e7aa6c8..7fd2b1cb08 100644
--- a/src/network/ssl/qsslsocket.h
+++ b/src/network/ssl/qsslsocket.h
@@ -43,7 +43,6 @@
#include <QtNetwork/qtnetworkglobal.h>
#include <QtCore/qlist.h>
-#include <QtCore/qregexp.h>
#include <QtCore/qvector.h>
#ifndef QT_NO_SSL
# include <QtNetwork/qtcpsocket.h>
@@ -63,6 +62,49 @@ class QSslEllipticCurve;
class QSslPreSharedKeyAuthenticator;
class QOcspResponse;
+enum class QAlertLevel {
+ Warning,
+ Fatal,
+ Unknown
+};
+
+enum class QAlertType {
+ CloseNotify,
+ UnexpectedMessage = 10,
+ BadRecordMac = 20,
+ RecordOverflow = 22,
+ DecompressionFailure = 30, // reserved
+ HandshakeFailure = 40,
+ NoCertificate = 41, // reserved
+ BadCertificate = 42,
+ UnsupportedCertificate = 43,
+ CertificateRevoked = 44,
+ CertificateExpired = 45,
+ CertificateUnknown = 46,
+ IllegalParameter = 47,
+ UnknownCa = 48,
+ AccessDenied = 49,
+ DecodeError = 50,
+ DecryptError = 51,
+ ExportRestriction = 60, // reserved
+ ProtocolVersion = 70,
+ InsufficientSecurity = 71,
+ InternalError = 80,
+ InappropriateFallback = 86,
+ UserCancelled = 90,
+ NoRenegotiation = 100,
+ MissingExtension = 109,
+ UnsupportedExtension = 110,
+ CertificateUnobtainable = 111, // reserved
+ UnrecognizedName = 112,
+ BadCertificateStatusResponse = 113,
+ BadCertificateHashValue = 114, // reserved
+ UnknownPskIdentity = 115,
+ CertificateRequired = 116,
+ NoApplicationProtocol = 120,
+ UnknownAlertMessage = 255
+};
+
class QSslSocketPrivate;
class Q_NETWORK_EXPORT QSslSocket : public QTcpSocket
{
@@ -165,8 +207,6 @@ public:
// CA settings.
#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_X("Use QSslConfiguration::addCaCertificates()") bool addCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem,
- QRegExp::PatternSyntax syntax = QRegExp::FixedString);
QT_DEPRECATED_X("Use QSslConfiguration::addCaCertificate()") void addCaCertificate(const QSslCertificate &certificate);
QT_DEPRECATED_X("Use QSslConfiguration::addCaCertificates()") void addCaCertificates(const QList<QSslCertificate> &certificates);
#endif // QT_DEPRECATED_SINCE(5, 15)
@@ -175,8 +215,6 @@ public:
QT_DEPRECATED_X("Use QSslConfiguration::caCertificates()") QList<QSslCertificate> caCertificates() const;
#endif // QT_DEPRECATED_SINCE(5, 5)
#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED static bool addDefaultCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem,
- QRegExp::PatternSyntax syntax = QRegExp::FixedString);
QT_DEPRECATED static void addDefaultCaCertificate(const QSslCertificate &certificate);
QT_DEPRECATED static void addDefaultCaCertificates(const QList<QSslCertificate> &certificates);
#endif // QT_DEPRECATED_SINCE(5, 15)
@@ -204,6 +242,7 @@ public:
static QString sslLibraryBuildVersionString();
void ignoreSslErrors(const QList<QSslError> &errors);
+ void continueInterruptedHandshake();
public Q_SLOTS:
void startClientEncryption();
@@ -218,6 +257,9 @@ Q_SIGNALS:
void encryptedBytesWritten(qint64 totalBytes);
void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator);
void newSessionTicketReceived();
+ void alertSent(QAlertLevel level, QAlertType type, const QString &description);
+ void alertReceived(QAlertLevel level, QAlertType type, const QString &description);
+ void handshakeInterruptedOnError(const QSslError &error);
protected:
qint64 readData(char *data, qint64 maxlen) override;
diff --git a/src/network/ssl/qsslsocket_mac.cpp b/src/network/ssl/qsslsocket_mac.cpp
index 77e847e972..1ae32b0330 100644
--- a/src/network/ssl/qsslsocket_mac.cpp
+++ b/src/network/ssl/qsslsocket_mac.cpp
@@ -496,10 +496,6 @@ QSsl::SslProtocol QSslSocketBackendPrivate::sessionProtocol() const
}
switch (protocol) {
- case kSSLProtocol2:
- return QSsl::SslV2;
- case kSSLProtocol3:
- return QSsl::SslV3;
case kTLSProtocol1:
return QSsl::TlsV1_0;
case kTLSProtocol11:
@@ -657,23 +653,6 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSLCipherSuite(SSLCipherSui
QSslCipher ciph;
switch (cipher) {
// Sorted as in CipherSuite.h (and groupped by their RFC)
- case SSL_RSA_WITH_NULL_MD5:
- ciph.d->name = QLatin1String("NULL-MD5");
- ciph.d->protocol = QSsl::SslV3;
- break;
- case SSL_RSA_WITH_NULL_SHA:
- ciph.d->name = QLatin1String("NULL-SHA");
- ciph.d->protocol = QSsl::SslV3;
- break;
- case SSL_RSA_WITH_RC4_128_MD5:
- ciph.d->name = QLatin1String("RC4-MD5");
- ciph.d->protocol = QSsl::SslV3;
- break;
- case SSL_RSA_WITH_RC4_128_SHA:
- ciph.d->name = QLatin1String("RC4-SHA");
- ciph.d->protocol = QSsl::SslV3;
- break;
-
// TLS addenda using AES, per RFC 3268
case TLS_RSA_WITH_AES_128_CBC_SHA:
ciph.d->name = QLatin1String("AES128-SHA");
@@ -822,12 +801,8 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSLCipherSuite(SSLCipherSui
ciph.d->isNull = false;
// protocol
- if (ciph.d->protocol == QSsl::SslV3) {
- ciph.d->protocolString = QLatin1String("SSLv3");
- } else {
- ciph.d->protocol = QSsl::TlsV1_2;
- ciph.d->protocolString = QLatin1String("TLSv1.2");
- }
+ ciph.d->protocol = QSsl::TlsV1_2;
+ ciph.d->protocolString = QLatin1String("TLSv1.2");
const auto bits = ciph.d->name.splitRef(QLatin1Char('-'));
if (bits.size() >= 2) {
@@ -1106,22 +1081,6 @@ bool QSslSocketBackendPrivate::setSessionProtocol()
{
Q_ASSERT_X(context, Q_FUNC_INFO, "invalid SSL context (null)");
- // QSsl::SslV2 == kSSLProtocol2 is disabled in Secure Transport and
- // always fails with errSSLIllegalParam:
- // if (version < MINIMUM_STREAM_VERSION || version > MAXIMUM_STREAM_VERSION)
- // return errSSLIllegalParam;
- // where MINIMUM_STREAM_VERSION is SSL_Version_3_0, MAXIMUM_STREAM_VERSION is TLS_Version_1_2.
- if (configuration.protocol == QSsl::SslV2) {
- qCDebug(lcSsl) << "protocol QSsl::SslV2 is disabled";
- return false;
- }
-
- // SslV3 is unsupported.
- if (configuration.protocol == QSsl::SslV3) {
- qCDebug(lcSsl) << "protocol QSsl::SslV3 is disabled";
- return false;
- }
-
// SecureTransport has kTLSProtocol13 constant and also, kTLSProtocolMaxSupported.
// Calling SSLSetProtocolVersionMax/Min with any of these two constants results
// in errInvalidParam and a failure to set the protocol version. This means
@@ -1162,13 +1121,6 @@ bool QSslSocketBackendPrivate::setSessionProtocol()
qCDebug(lcSsl) << plainSocket << "requesting : any";
#endif
err = SSLSetProtocolVersionMin(context, kTLSProtocol1);
- } else if (configuration.protocol == QSsl::TlsV1SslV3) {
- #ifdef QSSLSOCKET_DEBUG
- qCDebug(lcSsl) << plainSocket << "requesting : SSLv3 - TLSv1.2";
- #endif
- err = SSLSetProtocolVersionMin(context, kTLSProtocol1);
- if (err == errSecSuccess)
- err = SSLSetProtocolVersionMax(context, kTLSProtocol1);
} else if (configuration.protocol == QSsl::SecureProtocols) {
#ifdef QSSLSOCKET_DEBUG
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1 - TLSv1.2";
@@ -1213,8 +1165,6 @@ bool QSslSocketBackendPrivate::verifySessionProtocol() const
bool protocolOk = false;
if (configuration.protocol == QSsl::AnyProtocol)
protocolOk = true;
- else if (configuration.protocol == QSsl::TlsV1SslV3)
- protocolOk = (sessionProtocol() == QSsl::TlsV1_0);
else if (configuration.protocol == QSsl::SecureProtocols)
protocolOk = (sessionProtocol() >= QSsl::TlsV1_0);
else if (configuration.protocol == QSsl::TlsV1_0OrLater)
diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index 859216d097..b6570e2bdd 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -98,6 +98,123 @@
QT_BEGIN_NAMESPACE
+namespace {
+
+QAlertLevel tlsAlertLevel(int value)
+{
+ if (const char *typeString = q_SSL_alert_type_string(value)) {
+ // Documented to return 'W' for warning, 'F' for fatal,
+ // 'U' for unknown.
+ switch (typeString[0]) {
+ case 'W':
+ return QAlertLevel::Warning;
+ case 'F':
+ return QAlertLevel::Fatal;
+ default:;
+ }
+ }
+
+ return QAlertLevel::Unknown;
+}
+
+QString tlsAlertDescription(int value)
+{
+ QString description = QLatin1String(q_SSL_alert_desc_string_long(value));
+ if (!description.size())
+ description = QLatin1String("no description provided");
+ return description;
+}
+
+QAlertType tlsAlertType(int value)
+{
+ // In case for some reason openssl gives us a value,
+ // which is not in our enum actually, we leave it to
+ // an application to handle (supposedly they have
+ // if or switch-statements).
+ return QAlertType(value & 0xff);
+}
+
+} // Unnamed namespace
+
+extern "C"
+{
+
+void qt_AlertInfoCallback(const SSL *connection, int from, int value)
+{
+ // Passed to SSL_set_info_callback()
+ // https://www.openssl.org/docs/man1.1.1/man3/SSL_set_info_callback.html
+
+ if (!connection) {
+#ifdef QSSLSOCKET_DEBUG
+ qCWarning(lcSsl, "Invalid 'connection' parameter (nullptr)");
+#endif // QSSLSOCKET_DEBUG
+ return;
+ }
+
+ const auto offset = QSslSocketBackendPrivate::s_indexForSSLExtraData
+ + QSslSocketBackendPrivate::socketOffsetInExData;
+ auto privateSocket =
+ static_cast<QSslSocketBackendPrivate *>(q_SSL_get_ex_data(connection, offset));
+ if (!privateSocket) {
+ // SSL_set_ex_data can fail:
+#ifdef QSSLSOCKET_DEBUG
+ qCWarning(lcSsl, "No external data (socket backend) found for parameter 'connection'");
+#endif // QSSLSOCKET_DEBUG
+ return;
+ }
+
+ if (!(from & SSL_CB_ALERT)) {
+ // We only want to know about alerts (at least for now).
+ return;
+ }
+
+ if (from & SSL_CB_WRITE)
+ privateSocket->alertMessageSent(value);
+ else
+ privateSocket->alertMessageReceived(value);
+}
+
+int q_X509CallbackDirect(int ok, X509_STORE_CTX *ctx)
+{
+ // Passed to SSL_CTX_set_verify()
+ // https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_verify.html
+ // Returns 0 to abort verification, 1 to continue.
+
+ // This is a new, experimental verification callback, reporting
+ // errors immediately and returning 0 or 1 depending on an application
+ // either ignoring or not ignoring verification errors as they come.
+ if (!ctx) {
+ qCWarning(lcSsl, "Invalid store context (nullptr)");
+ return 0;
+ }
+
+ if (!ok) {
+ // "Whenever a X509_STORE_CTX object is created for the verification of the
+ // peer's certificate during a handshake, a pointer to the SSL object is
+ // stored into the X509_STORE_CTX object to identify the connection affected.
+ // To retrieve this pointer the X509_STORE_CTX_get_ex_data() function can be
+ // used with the correct index."
+ SSL *ssl = static_cast<SSL *>(q_X509_STORE_CTX_get_ex_data(ctx, q_SSL_get_ex_data_X509_STORE_CTX_idx()));
+ if (!ssl) {
+ qCWarning(lcSsl, "No external data (SSL) found in X509 store object");
+ return 0;
+ }
+
+ const auto offset = QSslSocketBackendPrivate::s_indexForSSLExtraData
+ + QSslSocketBackendPrivate::socketOffsetInExData;
+ auto privateSocket = static_cast<QSslSocketBackendPrivate *>(q_SSL_get_ex_data(ssl, offset));
+ if (!privateSocket) {
+ qCWarning(lcSsl, "No external data (QSslSocketBackendPrivate) found in SSL object");
+ return 0;
+ }
+
+ return privateSocket->emitErrorFromCallback(ctx);
+ }
+ return 1;
+}
+
+} // extern "C"
+
Q_GLOBAL_STATIC(QRecursiveMutex, qt_opensslInitMutex)
bool QSslSocketPrivate::s_libraryLoaded = false;
@@ -266,11 +383,7 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSL_CIPHER(const SSL_CIPHER
QString protoString = descriptionList.at(1).toString();
ciph.d->protocolString = protoString;
ciph.d->protocol = QSsl::UnknownProtocol;
- if (protoString == QLatin1String("SSLv3"))
- ciph.d->protocol = QSsl::SslV3;
- else if (protoString == QLatin1String("SSLv2"))
- ciph.d->protocol = QSsl::SslV2;
- else if (protoString == QLatin1String("TLSv1"))
+ if (protoString == QLatin1String("TLSv1"))
ciph.d->protocol = QSsl::TlsV1_0;
else if (protoString == QLatin1String("TLSv1.1"))
ciph.d->protocol = QSsl::TlsV1_1;
@@ -425,12 +538,15 @@ int q_X509Callback(int ok, X509_STORE_CTX *ctx)
// Not found on store? Try SSL and its external data then. According to the OpenSSL's
// documentation:
//
- // "Whenever a X509_STORE_CTX object is created for the verification of the peers certificate
- // during a handshake, a pointer to the SSL object is stored into the X509_STORE_CTX object
- // to identify the connection affected. To retrieve this pointer the X509_STORE_CTX_get_ex_data()
- // function can be used with the correct index."
+ // "Whenever a X509_STORE_CTX object is created for the verification of the
+ // peer's certificate during a handshake, a pointer to the SSL object is
+ // stored into the X509_STORE_CTX object to identify the connection affected.
+ // To retrieve this pointer the X509_STORE_CTX_get_ex_data() function can be
+ // used with the correct index."
+ const auto offset = QSslSocketBackendPrivate::s_indexForSSLExtraData
+ + QSslSocketBackendPrivate::errorOffsetInExData;
if (SSL *ssl = static_cast<SSL *>(q_X509_STORE_CTX_get_ex_data(ctx, q_SSL_get_ex_data_X509_STORE_CTX_idx())))
- errors = ErrorListPtr(q_SSL_get_ex_data(ssl, QSslSocketBackendPrivate::s_indexForSSLExtraData + 1));
+ errors = ErrorListPtr(q_SSL_get_ex_data(ssl, offset));
}
if (!errors) {
@@ -476,20 +592,23 @@ void q_setDefaultDtlsCiphers(const QList<QSslCipher> &ciphers);
long QSslSocketBackendPrivate::setupOpenSslOptions(QSsl::SslProtocol protocol, QSsl::SslOptions sslOptions)
{
long options;
- if (protocol == QSsl::TlsV1SslV3)
- options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3;
- else if (protocol == QSsl::SecureProtocols)
- options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3;
- else if (protocol == QSsl::TlsV1_0OrLater)
- options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3;
- else if (protocol == QSsl::TlsV1_1OrLater)
- options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1;
- else if (protocol == QSsl::TlsV1_2OrLater)
- options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1;
- else if (protocol == QSsl::TlsV1_3OrLater)
- options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2;
- else
+ switch (protocol) {
+ case QSsl::SecureProtocols:
+ case QSsl::TlsV1_0OrLater:
+ options = SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
+ break;
+ case QSsl::TlsV1_1OrLater:
+ options = SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1;
+ break;
+ case QSsl::TlsV1_2OrLater:
+ options = SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1;
+ break;
+ case QSsl::TlsV1_3OrLater:
+ options = SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2;
+ break;
+ default:
options = SSL_OP_ALL;
+ }
// This option is disabled by default, so we need to be able to clear it
if (sslOptions & QSsl::SslOptionDisableEmptyFragments)
@@ -547,10 +666,7 @@ bool QSslSocketBackendPrivate::initSslContext()
return false;
}
- if (configuration.protocol != QSsl::SslV2 &&
- configuration.protocol != QSsl::SslV3 &&
- configuration.protocol != QSsl::UnknownProtocol &&
- mode == QSslSocket::SslClientMode) {
+ if (configuration.protocol != QSsl::UnknownProtocol && mode == QSslSocket::SslClientMode) {
// Set server hostname on TLS extension. RFC4366 section 3.1 requires it in ACE format.
QString tlsHostName = verificationPeerName.isEmpty() ? q->peerName() : verificationPeerName;
if (tlsHostName.isEmpty())
@@ -1223,18 +1339,32 @@ bool QSslSocketBackendPrivate::startHandshake()
if (inSetAndEmitError)
return false;
+ pendingFatalAlert = false;
+ errorsReportedFromCallback = false;
QVector<QSslErrorEntry> lastErrors;
- q_SSL_set_ex_data(ssl, s_indexForSSLExtraData + 1, &lastErrors);
+ q_SSL_set_ex_data(ssl, s_indexForSSLExtraData + errorOffsetInExData, &lastErrors);
+
+ // SSL_set_ex_data can fail, but see the callback's code - we handle this there.
+ q_SSL_set_ex_data(ssl, s_indexForSSLExtraData + socketOffsetInExData, this);
+ q_SSL_set_info_callback(ssl, qt_AlertInfoCallback);
+
int result = (mode == QSslSocket::SslClientMode) ? q_SSL_connect(ssl) : q_SSL_accept(ssl);
- q_SSL_set_ex_data(ssl, s_indexForSSLExtraData + 1, nullptr);
+ q_SSL_set_ex_data(ssl, s_indexForSSLExtraData + errorOffsetInExData, nullptr);
+ // Note, unlike errors as external data on SSL object, we do not unset
+ // a callback/ex-data if alert notifications are enabled: an alert can
+ // arrive after the handshake, for example, this happens when the server
+ // does not find a ClientCert or does not like it.
- if (!lastErrors.isEmpty())
+ if (!lastErrors.isEmpty() || errorsReportedFromCallback)
storePeerCertificates();
- for (const auto &currentError : qAsConst(lastErrors)) {
- emit q->peerVerifyError(_q_OpenSSL_to_QSslError(currentError.code,
- configuration.peerCertificateChain.value(currentError.depth)));
- if (q->state() != QAbstractSocket::ConnectedState)
- break;
+
+ if (!errorsReportedFromCallback) {
+ for (const auto &currentError : qAsConst(lastErrors)) {
+ emit q->peerVerifyError(_q_OpenSSL_to_QSslError(currentError.code,
+ configuration.peerCertificateChain.value(currentError.depth)));
+ if (q->state() != QAbstractSocket::ConnectedState)
+ break;
+ }
}
errorList << lastErrors;
@@ -1258,6 +1388,10 @@ bool QSslSocketBackendPrivate::startHandshake()
{
const ScopedBool bg(inSetAndEmitError, true);
setErrorAndEmit(QAbstractSocket::SslHandshakeFailedError, errorString);
+ if (pendingFatalAlert) {
+ trySendFatalAlert();
+ pendingFatalAlert = false;
+ }
}
q->abort();
}
@@ -1781,6 +1915,88 @@ bool QSslSocketBackendPrivate::checkOcspStatus()
#endif // ocsp
+void QSslSocketBackendPrivate::alertMessageSent(int value)
+{
+ Q_Q(QSslSocket);
+
+ const auto level = tlsAlertLevel(value);
+ if (level == QAlertLevel::Fatal && !connectionEncrypted) {
+ // Note, this logic is handshake-time only:
+ pendingFatalAlert = true;
+ }
+
+ emit q->alertSent(level, tlsAlertType(value), tlsAlertDescription(value));
+}
+
+void QSslSocketBackendPrivate::alertMessageReceived(int value)
+{
+ Q_Q(QSslSocket);
+
+ emit q->alertReceived(tlsAlertLevel(value), tlsAlertType(value), tlsAlertDescription(value));
+}
+
+int QSslSocketBackendPrivate::emitErrorFromCallback(X509_STORE_CTX *ctx)
+{
+ // Returns 0 to abort verification, 1 to continue despite error (as
+ // OpenSSL expects from the verification callback).
+ Q_Q(QSslSocket);
+
+ Q_ASSERT(ctx);
+
+ using ScopedBool = QScopedValueRollback<bool>;
+ // While we are not setting, we are emitting and in general -
+ // we want to prevent accidental recursive startHandshake()
+ // calls:
+ const ScopedBool bg(inSetAndEmitError, true);
+
+ X509 *x509 = q_X509_STORE_CTX_get_current_cert(ctx);
+ if (!x509) {
+ qCWarning(lcSsl, "Could not obtain the certificate (that failed to verify)");
+ return 0;
+ }
+ const QSslCertificate certificate = QSslCertificatePrivate::QSslCertificate_from_X509(x509);
+
+ const auto errorAndDepth = QSslErrorEntry::fromStoreContext(ctx);
+ const QSslError tlsError = _q_OpenSSL_to_QSslError(errorAndDepth.code, certificate);
+
+ errorsReportedFromCallback = true;
+ handshakeInterrupted = true;
+ emit q->handshakeInterruptedOnError(tlsError);
+
+ // Conveniently so, we also can access 'lastErrors' external data set
+ // in startHandshake, we store it for the case an application later
+ // wants to check errors (ignored or not):
+ const auto offset = QSslSocketBackendPrivate::s_indexForSSLExtraData
+ + QSslSocketBackendPrivate::errorOffsetInExData;
+ if (auto errorList = static_cast<QVector<QSslErrorEntry>*>(q_SSL_get_ex_data(ssl, offset)))
+ errorList->append(errorAndDepth);
+
+ // An application is expected to ignore this error (by calling ignoreSslErrors)
+ // in its directly connected slot:
+ return !handshakeInterrupted;
+}
+
+void QSslSocketBackendPrivate::trySendFatalAlert()
+{
+ Q_ASSERT(pendingFatalAlert);
+
+ pendingFatalAlert = false;
+ QVarLengthArray<char, 4096> data;
+ int pendingBytes = 0;
+ while (plainSocket->isValid() && (pendingBytes = q_BIO_pending(writeBio)) > 0
+ && plainSocket->openMode() != QIODevice::NotOpen) {
+ // Read encrypted data from the write BIO into a buffer.
+ data.resize(pendingBytes);
+ const int bioReadBytes = q_BIO_read(writeBio, data.data(), pendingBytes);
+
+ // Write encrypted data from the buffer to the socket.
+ qint64 actualWritten = plainSocket->write(data.constData(), bioReadBytes);
+ if (actualWritten < 0)
+ return;
+ plainSocket->flush();
+ }
+}
+
void QSslSocketBackendPrivate::disconnectFromHost()
{
if (ssl) {
@@ -1828,10 +2044,6 @@ QSsl::SslProtocol QSslSocketBackendPrivate::sessionProtocol() const
int ver = q_SSL_version(ssl);
switch (ver) {
- case 0x2:
- return QSsl::SslV2;
- case 0x300:
- return QSsl::SslV3;
case 0x301:
return QSsl::TlsV1_0;
case 0x302:
diff --git a/src/network/ssl/qsslsocket_openssl_p.h b/src/network/ssl/qsslsocket_openssl_p.h
index 47ccf06e71..6c1ffb7237 100644
--- a/src/network/ssl/qsslsocket_openssl_p.h
+++ b/src/network/ssl/qsslsocket_openssl_p.h
@@ -131,6 +131,10 @@ public:
SSL_SESSION *session;
QVector<QSslErrorEntry> errorList;
static int s_indexForSSLExtraData; // index used in SSL_get_ex_data to get the matching QSslSocketBackendPrivate
+ enum ExDataOffset {
+ errorOffsetInExData = 1,
+ socketOffsetInExData = 2
+ };
bool inSetAndEmitError = false;
@@ -158,6 +162,15 @@ public:
bool checkOcspStatus();
#endif
+ void alertMessageSent(int encoded);
+ void alertMessageReceived(int encoded);
+
+ int emitErrorFromCallback(X509_STORE_CTX *ctx);
+ void trySendFatalAlert();
+
+ bool pendingFatalAlert = false;
+ bool errorsReportedFromCallback = false;
+
// This decription will go to setErrorAndEmit(SslHandshakeError, ocspErrorDescription)
QString ocspErrorDescription;
// These will go to sslErrors()
diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp
index 627ae31651..777dc70565 100644
--- a/src/network/ssl/qsslsocket_openssl_symbols.cpp
+++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp
@@ -156,6 +156,10 @@ DEFINEFUNC(void, OPENSSL_sk_free, OPENSSL_STACK *a, a, return, DUMMYARG)
DEFINEFUNC2(void *, OPENSSL_sk_value, OPENSSL_STACK *a, a, int b, b, return nullptr, return)
DEFINEFUNC(int, SSL_session_reused, SSL *a, a, return 0, return)
DEFINEFUNC2(unsigned long, SSL_CTX_set_options, SSL_CTX *ctx, ctx, unsigned long op, op, return 0, return)
+using info_callback = void (*) (const SSL *ssl, int type, int val);
+DEFINEFUNC2(void, SSL_set_info_callback, SSL *ssl, ssl, info_callback cb, cb, return, return)
+DEFINEFUNC(const char *, SSL_alert_type_string, int value, value, return nullptr, return)
+DEFINEFUNC(const char *, SSL_alert_desc_string_long, int value, value, return nullptr, return)
#ifdef TLS1_3_VERSION
DEFINEFUNC2(int, SSL_CTX_set_ciphersuites, SSL_CTX *ctx, ctx, const char *str, str, return 0, return)
DEFINEFUNC2(void, SSL_set_psk_use_session_callback, SSL *ssl, ssl, q_SSL_psk_use_session_cb_func_t callback, callback, return, DUMMYARG)
@@ -842,7 +846,9 @@ bool q_resolveOpenSslSymbols()
RESOLVEFUNC(OPENSSL_sk_value)
RESOLVEFUNC(DH_get0_pqg)
RESOLVEFUNC(SSL_CTX_set_options)
-
+ RESOLVEFUNC(SSL_set_info_callback)
+ RESOLVEFUNC(SSL_alert_type_string)
+ RESOLVEFUNC(SSL_alert_desc_string_long)
#ifdef TLS1_3_VERSION
RESOLVEFUNC(SSL_CTX_set_ciphersuites)
RESOLVEFUNC(SSL_set_psk_use_session_callback)
diff --git a/src/network/ssl/qsslsocket_openssl_symbols_p.h b/src/network/ssl/qsslsocket_openssl_symbols_p.h
index e8f6b7e752..78b097fad6 100644
--- a/src/network/ssl/qsslsocket_openssl_symbols_p.h
+++ b/src/network/ssl/qsslsocket_openssl_symbols_p.h
@@ -736,6 +736,10 @@ int q_OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b);
void *q_CRYPTO_malloc(size_t num, const char *file, int line);
#define q_OPENSSL_malloc(num) q_CRYPTO_malloc(num, "", 0)
+void q_SSL_set_info_callback(SSL *ssl, void (*cb) (const SSL *ssl, int type, int val));
+const char *q_SSL_alert_type_string(int value);
+const char *q_SSL_alert_desc_string_long(int value);
+
QT_END_NAMESPACE
#endif
diff --git a/src/network/ssl/qsslsocket_p.h b/src/network/ssl/qsslsocket_p.h
index 87179c8083..25625a1313 100644
--- a/src/network/ssl/qsslsocket_p.h
+++ b/src/network/ssl/qsslsocket_p.h
@@ -140,8 +140,6 @@ public:
static QList<QSslCertificate> defaultCaCertificates();
static QList<QSslCertificate> systemCaCertificates();
static void setDefaultCaCertificates(const QList<QSslCertificate> &certs);
- static bool addDefaultCaCertificates(const QString &path, QSsl::EncodingFormat format,
- QRegExp::PatternSyntax syntax);
static void addDefaultCaCertificate(const QSslCertificate &cert);
static void addDefaultCaCertificates(const QList<QSslCertificate> &certs);
Q_AUTOTEST_EXPORT static bool isMatchingHostname(const QSslCertificate &cert,
@@ -209,6 +207,7 @@ protected:
bool flushTriggered;
bool systemOrSslErrorDetected = false;
QVector<QOcspResponse> ocspResponses;
+ bool handshakeInterrupted = false;
};
#if QT_CONFIG(securetransport) || QT_CONFIG(schannel)
diff --git a/src/network/ssl/qsslsocket_schannel.cpp b/src/network/ssl/qsslsocket_schannel.cpp
index e47fda17ab..c355abad73 100644
--- a/src/network/ssl/qsslsocket_schannel.cpp
+++ b/src/network/ssl/qsslsocket_schannel.cpp
@@ -226,12 +226,6 @@ DWORD toSchannelProtocol(QSsl::SslProtocol protocol)
protocols = SP_PROT_TLS1_0 | SP_PROT_TLS1_1 | SP_PROT_TLS1_2;
// @future Add TLS 1.3 when supported by Windows!
break;
- case QSsl::SslV2:
- case QSsl::SslV3:
- return DWORD(-1); // Not supported
- case QSsl::TlsV1SslV3:
- protocols = SP_PROT_TLS1_0;
- break;
case QSsl::TlsV1_0:
protocols = SP_PROT_TLS1_0;
break;
diff --git a/src/network/ssl/qsslsocket_winrt.cpp b/src/network/ssl/qsslsocket_winrt.cpp
index f3ca3dc257..5f5201fc82 100644
--- a/src/network/ssl/qsslsocket_winrt.cpp
+++ b/src/network/ssl/qsslsocket_winrt.cpp
@@ -230,13 +230,7 @@ void QSslSocketBackendPrivate::startClientEncryption()
QSsl::SslProtocol protocol = q->protocol();
switch (q->protocol()) {
- case QSsl::SslV2:
- case QSsl::SslV3:
- setErrorAndEmit(QAbstractSocket::SslInvalidUserDataError,
- QStringLiteral("unsupported protocol"));
- return;
case QSsl::AnyProtocol:
- case QSsl::TlsV1SslV3:
protectionLevel = SocketProtectionLevel_Tls10;
break;
case QSsl::TlsV1_0:
@@ -270,7 +264,7 @@ void QSslSocketBackendPrivate::startClientEncryption()
}
// Sync custom certificates
- const QSet<QSslCertificate> caCertificates = configuration.caCertificates.toSet();
+ const QSet<QSslCertificate> caCertificates(configuration.caCertificates.constBegin(), configuration.caCertificates.constEnd());
const QSet<QSslCertificate> newCertificates = caCertificates - previousCaCertificates;
const QSet<QSslCertificate> oldCertificates = previousCaCertificates - caCertificates;
g->syncCaCertificates(newCertificates, oldCertificates);
@@ -393,7 +387,7 @@ void QSslSocketBackendPrivate::continueHandshake()
hr = control2->get_IgnorableServerCertificateErrors(&ignoreList);
Q_ASSERT_SUCCEEDED(hr);
- QSet<QSslError> ignoreErrors = ignoreErrorsList.toSet();
+ QSet<QSslError> ignoreErrors(ignoreErrorsList.constBegin(), ignoreErrorsList.constEnd());
for (int i = ChainValidationResult_Untrusted; i < ChainValidationResult_OtherErrors + 1; ++i) {
// Populate the native ignore list - break to add, continue to skip
switch (i) {
@@ -596,7 +590,7 @@ HRESULT QSslSocketBackendPrivate::onSslUpgrade(IAsyncAction *action, AsyncStatus
}
}
- sslErrors = errors.toList();
+ sslErrors = QList<QSslError>(errors.constBegin(), errors.constEnd());
// Peer validation
if (!configuration.peerCertificate.isNull()) {
diff --git a/src/opengl/.prev_CMakeLists.txt b/src/opengl/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..569fe18fc4
--- /dev/null
+++ b/src/opengl/.prev_CMakeLists.txt
@@ -0,0 +1,90 @@
+# Generated from opengl.pro.
+
+#####################################################################
+## OpenGL Module:
+#####################################################################
+
+qt_add_module(OpenGL
+ SOURCES
+ qopengl2pexvertexarray.cpp qopengl2pexvertexarray_p.h
+ qopenglbuffer.cpp qopenglbuffer.h
+ qopenglcustomshaderstage.cpp qopenglcustomshaderstage_p.h
+ qopengldebug.cpp qopengldebug.h
+ qopenglengineshadermanager.cpp qopenglengineshadermanager_p.h
+ qopenglengineshadersource_p.h
+ qopenglframebufferobject.cpp qopenglframebufferobject.h qopenglframebufferobject_p.h
+ qopenglgradientcache.cpp qopenglgradientcache_p.h
+ qopenglpaintdevice.cpp qopenglpaintdevice.h qopenglpaintdevice_p.h
+ qopenglpaintengine.cpp qopenglpaintengine_p.h
+ qopenglpixeltransferoptions.cpp qopenglpixeltransferoptions.h
+ qopenglshadercache_p.h
+ qopenglshaderprogram.cpp qopenglshaderprogram.h
+ qopengltexture.cpp qopengltexture.h qopengltexture_p.h
+ qopengltextureblitter.cpp qopengltextureblitter.h
+ qopengltexturecache.cpp qopengltexturecache_p.h
+ qopengltextureglyphcache.cpp qopengltextureglyphcache_p.h
+ qopengltexturehelper.cpp qopengltexturehelper_p.h
+ qopengltextureuploader.cpp qopengltextureuploader_p.h
+ qopenglversionfunctions.cpp qopenglversionfunctions.h qopenglversionfunctions_p.h
+ qopenglversionfunctionsfactory.cpp qopenglversionfunctionsfactory.h
+ qopenglversionprofile.cpp qopenglversionprofile.h
+ qopenglvertexarrayobject.cpp qopenglvertexarrayobject.h
+ qopenglwindow.cpp qopenglwindow.h
+ qtopenglglobal.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::Gui
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+ Qt::GuiPrivate
+)
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(OpenGL CONDITION QT_FEATURE_opengles2
+ SOURCES
+ opengl/qopenglfunctions_es2.cpp opengl/qopenglfunctions_es2.h
+)
+
+qt_extend_target(OpenGL CONDITION NOT QT_FEATURE_opengles2
+ SOURCES
+ qopenglfunctions_1_0.cpp qopenglfunctions_1_0.h
+ qopenglfunctions_1_1.cpp qopenglfunctions_1_1.h
+ qopenglfunctions_1_2.cpp qopenglfunctions_1_2.h
+ qopenglfunctions_1_3.cpp qopenglfunctions_1_3.h
+ qopenglfunctions_1_4.cpp qopenglfunctions_1_4.h
+ qopenglfunctions_1_5.cpp qopenglfunctions_1_5.h
+ qopenglfunctions_2_0.cpp qopenglfunctions_2_0.h
+ qopenglfunctions_2_1.cpp qopenglfunctions_2_1.h
+ qopenglfunctions_3_0.cpp qopenglfunctions_3_0.h
+ qopenglfunctions_3_1.cpp qopenglfunctions_3_1.h
+ qopenglfunctions_3_2_compatibility.cpp qopenglfunctions_3_2_compatibility.h
+ qopenglfunctions_3_2_core.cpp qopenglfunctions_3_2_core.h
+ qopenglfunctions_3_3_compatibility.cpp qopenglfunctions_3_3_compatibility.h
+ qopenglfunctions_3_3_core.cpp qopenglfunctions_3_3_core.h
+ qopenglfunctions_4_0_compatibility.cpp qopenglfunctions_4_0_compatibility.h
+ qopenglfunctions_4_0_core.cpp qopenglfunctions_4_0_core.h
+ qopenglfunctions_4_1_compatibility.cpp qopenglfunctions_4_1_compatibility.h
+ qopenglfunctions_4_1_core.cpp qopenglfunctions_4_1_core.h
+ qopenglfunctions_4_2_compatibility.cpp qopenglfunctions_4_2_compatibility.h
+ qopenglfunctions_4_2_core.cpp qopenglfunctions_4_2_core.h
+ qopenglfunctions_4_3_compatibility.cpp qopenglfunctions_4_3_compatibility.h
+ qopenglfunctions_4_3_core.cpp qopenglfunctions_4_3_core.h
+ qopenglfunctions_4_4_compatibility.cpp qopenglfunctions_4_4_compatibility.h
+ qopenglfunctions_4_4_core.cpp qopenglfunctions_4_4_core.h
+ qopenglfunctions_4_5_compatibility.cpp qopenglfunctions_4_5_compatibility.h
+ qopenglfunctions_4_5_core.cpp qopenglfunctions_4_5_core.h
+ qopenglqueryhelper_p.h
+ qopengltimerquery.cpp qopengltimerquery.h
+)
+qt_add_docs(OpenGL
+ doc/qtopengl.qdocconf
+)
+
diff --git a/src/opengl/CMakeLists.txt b/src/opengl/CMakeLists.txt
new file mode 100644
index 0000000000..c0acee56e5
--- /dev/null
+++ b/src/opengl/CMakeLists.txt
@@ -0,0 +1,90 @@
+# Generated from opengl.pro.
+
+#####################################################################
+## OpenGL Module:
+#####################################################################
+
+qt_add_module(OpenGL
+ SOURCES
+ qopengl2pexvertexarray.cpp qopengl2pexvertexarray_p.h
+ qopenglbuffer.cpp qopenglbuffer.h
+ qopenglcustomshaderstage.cpp qopenglcustomshaderstage_p.h
+ qopengldebug.cpp qopengldebug.h
+ qopenglengineshadermanager.cpp qopenglengineshadermanager_p.h
+ qopenglengineshadersource_p.h
+ qopenglframebufferobject.cpp qopenglframebufferobject.h qopenglframebufferobject_p.h
+ qopenglgradientcache.cpp qopenglgradientcache_p.h
+ qopenglpaintdevice.cpp qopenglpaintdevice.h qopenglpaintdevice_p.h
+ qopenglpaintengine.cpp qopenglpaintengine_p.h
+ qopenglpixeltransferoptions.cpp qopenglpixeltransferoptions.h
+ qopenglshadercache_p.h
+ qopenglshaderprogram.cpp qopenglshaderprogram.h
+ qopengltexture.cpp qopengltexture.h qopengltexture_p.h
+ qopengltextureblitter.cpp qopengltextureblitter.h
+ qopengltexturecache.cpp qopengltexturecache_p.h
+ qopengltextureglyphcache.cpp qopengltextureglyphcache_p.h
+ qopengltexturehelper.cpp qopengltexturehelper_p.h
+ qopengltextureuploader.cpp qopengltextureuploader_p.h
+ qopenglversionfunctions.cpp qopenglversionfunctions.h qopenglversionfunctions_p.h
+ qopenglversionfunctionsfactory.cpp qopenglversionfunctionsfactory.h
+ qopenglversionprofile.cpp qopenglversionprofile.h
+ qopenglvertexarrayobject.cpp qopenglvertexarrayobject.h
+ qopenglwindow.cpp qopenglwindow.h
+ qtopenglglobal.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::Gui
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+ Qt::GuiPrivate
+)
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(OpenGL CONDITION QT_FEATURE_opengles2
+ SOURCES
+ qopenglfunctions_es2.cpp qopenglfunctions_es2.h
+)
+
+qt_extend_target(OpenGL CONDITION NOT QT_FEATURE_opengles2
+ SOURCES
+ qopenglfunctions_1_0.cpp qopenglfunctions_1_0.h
+ qopenglfunctions_1_1.cpp qopenglfunctions_1_1.h
+ qopenglfunctions_1_2.cpp qopenglfunctions_1_2.h
+ qopenglfunctions_1_3.cpp qopenglfunctions_1_3.h
+ qopenglfunctions_1_4.cpp qopenglfunctions_1_4.h
+ qopenglfunctions_1_5.cpp qopenglfunctions_1_5.h
+ qopenglfunctions_2_0.cpp qopenglfunctions_2_0.h
+ qopenglfunctions_2_1.cpp qopenglfunctions_2_1.h
+ qopenglfunctions_3_0.cpp qopenglfunctions_3_0.h
+ qopenglfunctions_3_1.cpp qopenglfunctions_3_1.h
+ qopenglfunctions_3_2_compatibility.cpp qopenglfunctions_3_2_compatibility.h
+ qopenglfunctions_3_2_core.cpp qopenglfunctions_3_2_core.h
+ qopenglfunctions_3_3_compatibility.cpp qopenglfunctions_3_3_compatibility.h
+ qopenglfunctions_3_3_core.cpp qopenglfunctions_3_3_core.h
+ qopenglfunctions_4_0_compatibility.cpp qopenglfunctions_4_0_compatibility.h
+ qopenglfunctions_4_0_core.cpp qopenglfunctions_4_0_core.h
+ qopenglfunctions_4_1_compatibility.cpp qopenglfunctions_4_1_compatibility.h
+ qopenglfunctions_4_1_core.cpp qopenglfunctions_4_1_core.h
+ qopenglfunctions_4_2_compatibility.cpp qopenglfunctions_4_2_compatibility.h
+ qopenglfunctions_4_2_core.cpp qopenglfunctions_4_2_core.h
+ qopenglfunctions_4_3_compatibility.cpp qopenglfunctions_4_3_compatibility.h
+ qopenglfunctions_4_3_core.cpp qopenglfunctions_4_3_core.h
+ qopenglfunctions_4_4_compatibility.cpp qopenglfunctions_4_4_compatibility.h
+ qopenglfunctions_4_4_core.cpp qopenglfunctions_4_4_core.h
+ qopenglfunctions_4_5_compatibility.cpp qopenglfunctions_4_5_compatibility.h
+ qopenglfunctions_4_5_core.cpp qopenglfunctions_4_5_core.h
+ qopenglqueryhelper_p.h
+ qopengltimerquery.cpp qopengltimerquery.h
+)
+qt_add_docs(OpenGL
+ doc/qtopengl.qdocconf
+)
+
diff --git a/src/opengl/doc/snippets/code/src_opengl_qgl.cpp b/src/opengl/doc/snippets/code/src_opengl_qgl.cpp
deleted file mode 100644
index a73ee2cdc5..0000000000
--- a/src/opengl/doc/snippets/code/src_opengl_qgl.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
-QGLFormat fmt;
-fmt.setAlpha(true);
-fmt.setStereo(true);
-QGLFormat::setDefaultFormat(fmt);
-//! [0]
-
-
-//! [1]
-QGLFormat fmt;
-fmt.setDoubleBuffer(false); // single buffer
-fmt.setDirectRendering(false); // software rendering
-MyGLWidget* myWidget = new MyGLWidget(fmt, ...);
-//! [1]
-
-
-//! [2]
-QGLFormat fmt;
-fmt.setOverlay(true);
-fmt.setStereo(true);
-MyGLWidget* myWidget = new MyGLWidget(fmt, ...);
-if (!myWidget->format().stereo()) {
- // ok, goggles off
- if (!myWidget->format().hasOverlay()) {
- qFatal("Cool hardware required");
- }
-}
-//! [2]
-
-
-//! [3]
-// The rendering in MyGLWidget depends on using
-// stencil buffer and alpha channel
-MyGLWidget::MyGLWidget(QWidget* parent)
- : QGLWidget(QGLFormat(QGL::StencilBuffer | QGL::AlphaChannel), parent)
-{
- if (!format().stencil())
- qWarning("Could not get stencil buffer; results will be suboptimal");
- if (!format().alpha())
- qWarning("Could not get alpha channel; results will be suboptimal");
- ...
-}
-//! [3]
-
-
-//! [4]
-QApplication a(argc, argv);
-QGLFormat f;
-f.setDoubleBuffer(false);
-QGLFormat::setDefaultFormat(f);
-//! [4]
-
-
-//! [5]
-QGLFormat f = QGLFormat::defaultOverlayFormat();
-f.setDoubleBuffer(true);
-QGLFormat::setDefaultOverlayFormat(f);
-//! [5]
-
-
-//! [6]
-// ...continued from above
-MyGLWidget* myWidget = new MyGLWidget(QGLFormat(QGL::HasOverlay), ...);
-if (myWidget->format().hasOverlay()) {
- // Yes, we got an overlay, let's check _its_ format:
- QGLContext* olContext = myWidget->overlayContext();
- if (olContext->format().doubleBuffer())
- ; // yes, we got a double buffered overlay
- else
- ; // no, only single buffered overlays are available
-}
-//! [6]
-
-
-//! [7]
-QGLContext *cx;
-// ...
-QGLFormat f;
-f.setStereo(true);
-cx->setFormat(f);
-if (!cx->create())
- exit(); // no OpenGL support, or cannot render on the specified paintdevice
-if (!cx->format().stereo())
- exit(); // could not create stereo context
-//! [7]
-
-
-//! [8]
-class MyGLDrawer : public QGLWidget
-{
- Q_OBJECT // must include this if you use Qt signals/slots
-
-public:
- MyGLDrawer(QWidget *parent)
- : QGLWidget(parent) {}
-
-protected:
-
- void initializeGL() override
- {
- // Set up the rendering context, define display lists etc.:
- ...
- glClearColor(0.0, 0.0, 0.0, 0.0);
- glEnable(GL_DEPTH_TEST);
- ...
- }
-
- void resizeGL(int w, int h) override
- {
- // setup viewport, projection etc.:
- glViewport(0, 0, (GLint)w, (GLint)h);
- ...
- glFrustum(...);
- ...
- }
-
- void paintGL() override
- {
- // draw the scene:
- ...
- glRotatef(...);
- glMaterialfv(...);
- glBegin(GL_QUADS);
- glVertex3f(...);
- glVertex3f(...);
- ...
- glEnd();
- ...
- }
-
-};
-//! [8]
diff --git a/src/opengl/doc/snippets/code/src_opengl_qglbuffer.cpp b/src/opengl/doc/snippets/code/src_opengl_qglbuffer.cpp
deleted file mode 100644
index 11ef88ab37..0000000000
--- a/src/opengl/doc/snippets/code/src_opengl_qglbuffer.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
- QGLBuffer buffer1(QGLBuffer::IndexBuffer);
- buffer1.create();
-
- QGLBuffer buffer2 = buffer1;
-//! [0]
-
-//! [1]
- QGLBuffer::release(QGLBuffer::VertexBuffer);
-//! [1]
diff --git a/src/opengl/doc/snippets/code/src_opengl_qglcolormap.cpp b/src/opengl/doc/snippets/code/src_opengl_qglcolormap.cpp
deleted file mode 100644
index 12a089944f..0000000000
--- a/src/opengl/doc/snippets/code/src_opengl_qglcolormap.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
-#include <QApplication>
-#include <QGLColormap>
-
-int main()
-{
- QApplication app(argc, argv);
-
- MySuperGLWidget widget; // a QGLWidget in color-index mode
- QGLColormap colormap;
-
- // This will fill the colormap with colors ranging from
- // black to white.
- for (int i = 0; i < colormap.size(); i++)
- colormap.setEntry(i, qRgb(i, i, i));
-
- widget.setColormap(colormap);
- widget.show();
- return app.exec();
-}
-//! [0]
diff --git a/src/opengl/doc/snippets/code/src_opengl_qglfunctions.cpp b/src/opengl/doc/snippets/code/src_opengl_qglfunctions.cpp
deleted file mode 100644
index c848ae7ede..0000000000
--- a/src/opengl/doc/snippets/code/src_opengl_qglfunctions.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
- class MyGLWidget : public QGLWidget, protected QGLFunctions
- {
- Q_OBJECT
- public:
- MyGLWidget(QWidget *parent = 0) : QGLWidget(parent) {}
-
- protected:
- void initializeGL();
- void paintGL();
- };
-
- void MyGLWidget::initializeGL()
- {
- initializeGLFunctions();
- }
-//! [0]
-
-//! [1]
- void MyGLWidget::paintGL()
- {
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, textureId);
- ...
- }
-//! [1]
-
-//! [2]
- QGLFunctions glFuncs(QGLContext::currentContext());
- glFuncs.glActiveTexture(GL_TEXTURE1);
-//! [2]
-
-//! [3]
- QGLFunctions funcs(QGLContext::currentContext());
- bool npot = funcs.hasOpenGLFeature(QGLFunctions::NPOTTextures);
-//! [3]
diff --git a/src/opengl/doc/snippets/code/src_opengl_qglpixelbuffer.cpp b/src/opengl/doc/snippets/code/src_opengl_qglpixelbuffer.cpp
deleted file mode 100644
index f6fbe6ddb4..0000000000
--- a/src/opengl/doc/snippets/code/src_opengl_qglpixelbuffer.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
-QGLPixelBuffer pbuffer(...);
-...
-pbuffer.makeCurrent();
-GLuint dynamicTexture = pbuffer.generateDynamicTexture();
-pbuffer.bindToDynamicTexture(dynamicTexture);
-...
-pbuffer.releaseFromDynamicTexture();
-//! [0]
-
-
-//! [1]
-QGLPixelBuffer pbuffer(...);
-...
-pbuffer.makeCurrent();
-GLuint dynamicTexture = pbuffer.generateDynamicTexture();
-...
-pbuffer.updateDynamicTexture(dynamicTexture);
-//! [1]
diff --git a/src/opengl/doc/snippets/code/src_opengl_qglshaderprogram.cpp b/src/opengl/doc/snippets/code/src_opengl_qglshaderprogram.cpp
deleted file mode 100644
index 04492499e8..0000000000
--- a/src/opengl/doc/snippets/code/src_opengl_qglshaderprogram.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
-QGLShader shader(QGLShader::Vertex);
-shader.compileSourceCode(code);
-
-QGLShaderProgram program(context);
-program.addShader(shader);
-program.link();
-
-program.bind();
-//! [0]
-
-//! [1]
-program.addShaderFromSourceCode(QGLShader::Vertex,
- "attribute highp vec4 vertex;\n"
- "uniform highp mat4 matrix;\n"
- "void main(void)\n"
- "{\n"
- " gl_Position = matrix * vertex;\n"
- "}");
-program.addShaderFromSourceCode(QGLShader::Fragment,
- "uniform mediump vec4 color;\n"
- "void main(void)\n"
- "{\n"
- " gl_FragColor = color;\n"
- "}");
-program.link();
-program.bind();
-
-int vertexLocation = program.attributeLocation("vertex");
-int matrixLocation = program.uniformLocation("matrix");
-int colorLocation = program.uniformLocation("color");
-//! [1]
-
-//! [2]
-static GLfloat const triangleVertices[] = {
- 60.0f, 10.0f, 0.0f,
- 110.0f, 110.0f, 0.0f,
- 10.0f, 110.0f, 0.0f
-};
-
-QColor color(0, 255, 0, 255);
-
-QMatrix4x4 pmvMatrix;
-pmvMatrix.ortho(rect());
-
-program.enableAttributeArray(vertexLocation);
-program.setAttributeArray(vertexLocation, triangleVertices, 3);
-program.setUniformValue(matrixLocation, pmvMatrix);
-program.setUniformValue(colorLocation, color);
-
-glDrawArrays(GL_TRIANGLES, 0, 3);
-
-program.disableAttributeArray(vertexLocation);
-//! [2]
diff --git a/src/opengl/doc/snippets/code/src_opengl_qgraphicsshadereffect.cpp b/src/opengl/doc/snippets/code/src_opengl_qgraphicsshadereffect.cpp
deleted file mode 100644
index 461e96e094..0000000000
--- a/src/opengl/doc/snippets/code/src_opengl_qgraphicsshadereffect.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//! [0]
- static char const colorizeShaderCode[] =
- "uniform lowp vec4 effectColor;\n"
- "lowp vec4 customShader(lowp sampler2D imageTexture, highp vec2 textureCoords) {\n"
- " vec4 src = texture2D(imageTexture, textureCoords);\n"
- " float gray = dot(src.rgb, vec3(0.212671, 0.715160, 0.072169));\n"
- " vec4 colorize = 1.0-((1.0-gray)*(1.0-effectColor));\n"
- " return vec4(colorize.rgb, src.a);\n"
- "}";
-//! [0]
-
-//! [1]
- class ColorizeEffect : public QGraphicsShaderEffect
- {
- Q_OBJECT
- public:
- ColorizeEffect(QObject *parent = 0)
- : QGraphicsShaderEffect(parent), color(Qt::black)
- {
- setPixelShaderFragment(colorizeShaderCode);
- }
-
- QColor effectColor() const { return color; }
- void setEffectColor(const QColor& c)
- {
- color = c;
- setUniformsDirty();
- }
-
- protected:
- void setUniforms(QGLShaderProgram *program)
- {
- program->setUniformValue("effectColor", color);
- }
-
- private:
- QColor color;
- };
-//! [1]
-
-//! [2]
- lowp vec4 customShader(lowp sampler2D imageTexture, highp vec2 textureCoords) {
- return texture2D(imageTexture, textureCoords);
- }
-//! [2]
diff --git a/src/opengl/doc/src/dontdocument.qdoc b/src/opengl/doc/src/dontdocument.qdoc
new file mode 100644
index 0000000000..72e997d933
--- /dev/null
+++ b/src/opengl/doc/src/dontdocument.qdoc
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \dontdocument (QOpenGLVersionStatus
+ QOpenGLVersionFunctionsBackend
+ QOpenGLVersionFunctionsStorage
+ QOpenGLFunctions_1_0_CoreBackend
+ QOpenGLFunctions_1_1_CoreBackend
+ QOpenGLFunctions_1_2_CoreBackend
+ QOpenGLFunctions_1_3_CoreBackend
+ QOpenGLFunctions_1_4_CoreBackend
+ QOpenGLFunctions_1_5_CoreBackend
+ QOpenGLFunctions_2_0_CoreBackend
+ QOpenGLFunctions_2_1_CoreBackend
+ QOpenGLFunctions_3_0_CoreBackend
+ QOpenGLFunctions_3_1_CoreBackend
+ QOpenGLFunctions_3_2_CoreBackend
+ QOpenGLFunctions_3_3_CoreBackend
+ QOpenGLFunctions_4_0_CoreBackend
+ QOpenGLFunctions_4_1_CoreBackend
+ QOpenGLFunctions_4_2_CoreBackend
+ QOpenGLFunctions_4_3_CoreBackend
+ QOpenGLFunctions_4_4_CoreBackend
+ QOpenGLFunctions_4_5_CoreBackend
+ QOpenGLFunctions_1_0_DeprecatedBackend
+ QOpenGLFunctions_1_1_DeprecatedBackend
+ QOpenGLFunctions_1_2_DeprecatedBackend
+ QOpenGLFunctions_1_3_DeprecatedBackend
+ QOpenGLFunctions_1_4_DeprecatedBackend
+ QOpenGLFunctions_2_0_DeprecatedBackend
+ QOpenGLFunctions_3_0_DeprecatedBackend
+ QOpenGLFunctions_3_3_DeprecatedBackend
+ QOpenGLFunctions_4_5_DeprecatedBackend)
+*/
diff --git a/src/opengl/doc/src/qtopengl-examples.qdoc b/src/opengl/doc/src/qtopengl-examples.qdoc
index de80c92883..8770d6247e 100644
--- a/src/opengl/doc/src/qtopengl-examples.qdoc
+++ b/src/opengl/doc/src/qtopengl-examples.qdoc
@@ -33,12 +33,11 @@
\image opengl-examples.png
- These examples describe how to use the \l {Qt OpenGL} module. For new code,
- please use the OpenGL classes in the \l {Qt GUI} module.
+ These examples describe how to use the \l {Qt OpenGL} module.
- Qt provides support for integration with OpenGL implementations on all
- platforms, giving developers the opportunity to display hardware accelerated
- 3D graphics alongside a more conventional user interface.
+ Qt provides support for integration with OpenGL implementations, giving
+ developers the opportunity to display hardware accelerated 3D graphics
+ alongside a more conventional user interface.
These examples demonstrate the basic techniques used to take advantage of
OpenGL in Qt applications.
diff --git a/src/opengl/doc/src/qtopengl-module.qdoc b/src/opengl/doc/src/qtopengl-module.qdoc
index 336d37c73f..24df4aec76 100644
--- a/src/opengl/doc/src/qtopengl-module.qdoc
+++ b/src/opengl/doc/src/qtopengl-module.qdoc
@@ -34,8 +34,7 @@
\brief The Qt OpenGL module offers classes that make it easy to
use OpenGL in Qt applications.
- \warning This module should not be used anymore for new code. Please
- use the corresponding OpenGL classes in \l{Qt GUI}.
+ \warning This module should not be used anymore for new code.
OpenGL is a standard API for rendering 3D graphics. OpenGL only
deals with 3D rendering and provides little or no support for GUI
@@ -48,9 +47,6 @@
the United States and other countries.
The Qt OpenGL module makes it easy to use OpenGL in Qt applications.
- It provides an OpenGL widget class that can be used just like any
- other Qt widget, except that it opens an OpenGL display buffer where
- you can use the OpenGL API to render the contents.
To include the definitions of the module's classes, use the
following directive:
@@ -63,11 +59,4 @@
\snippet code/doc_src_qtopengl.pro 1
\endif
-
- The Qt OpenGL module is implemented as a platform-independent Qt/C++
- wrapper around the platform-dependent GLX (version 1.3 or later),
- WGL, or AGL C APIs. Although the basic functionality provided is very
- similar to Mark Kilgard's GLUT library, applications using the Qt
- OpenGL module can take advantage of the whole Qt API for
- non-OpenGL-specific GUI functionality.
*/
diff --git a/src/opengl/gl2paintengineex/qgl2pexvertexarray.cpp b/src/opengl/gl2paintengineex/qgl2pexvertexarray.cpp
deleted file mode 100644
index 979ea19fee..0000000000
--- a/src/opengl/gl2paintengineex/qgl2pexvertexarray.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgl2pexvertexarray_p.h"
-
-#include <private/qbezier_p.h>
-
-QT_BEGIN_NAMESPACE
-
-void QGL2PEXVertexArray::clear()
-{
- vertexArray.reset();
- vertexArrayStops.reset();
- boundingRectDirty = true;
-}
-
-
-QGLRect QGL2PEXVertexArray::boundingRect() const
-{
- if (boundingRectDirty)
- return QGLRect(0.0, 0.0, 0.0, 0.0);
- else
- return QGLRect(minX, minY, maxX, maxY);
-}
-
-void QGL2PEXVertexArray::addClosingLine(int index)
-{
- QPointF point(vertexArray.at(index));
- if (point != QPointF(vertexArray.last()))
- vertexArray.add(point);
-}
-
-void QGL2PEXVertexArray::addCentroid(const QVectorPath &path, int subPathIndex)
-{
- const QPointF *const points = reinterpret_cast<const QPointF *>(path.points());
- const QPainterPath::ElementType *const elements = path.elements();
-
- QPointF sum = points[subPathIndex];
- int count = 1;
-
- for (int i = subPathIndex + 1; i < path.elementCount() && (!elements || elements[i] != QPainterPath::MoveToElement); ++i) {
- sum += points[i];
- ++count;
- }
-
- const QPointF centroid = sum / qreal(count);
- vertexArray.add(centroid);
-}
-
-void QGL2PEXVertexArray::addPath(const QVectorPath &path, GLfloat curveInverseScale, bool outline)
-{
- const QPointF* const points = reinterpret_cast<const QPointF*>(path.points());
- const QPainterPath::ElementType* const elements = path.elements();
-
- if (boundingRectDirty) {
- minX = maxX = points[0].x();
- minY = maxY = points[0].y();
- boundingRectDirty = false;
- }
-
- if (!outline && !path.isConvex())
- addCentroid(path, 0);
-
- int lastMoveTo = vertexArray.size();
- vertexArray.add(points[0]); // The first element is always a moveTo
-
- do {
- if (!elements) {
-// qDebug("QVectorPath has no elements");
- // If the path has a null elements pointer, the elements implicitly
- // start with a moveTo (already added) and continue with lineTos:
- for (int i=1; i<path.elementCount(); ++i)
- lineToArray(points[i].x(), points[i].y());
-
- break;
- }
-// qDebug("QVectorPath has element types");
-
- for (int i=1; i<path.elementCount(); ++i) {
- switch (elements[i]) {
- case QPainterPath::MoveToElement:
- if (!outline)
- addClosingLine(lastMoveTo);
-// qDebug("element[%d] is a MoveToElement", i);
- vertexArrayStops.add(vertexArray.size());
- if (!outline) {
- if (!path.isConvex()) addCentroid(path, i);
- lastMoveTo = vertexArray.size();
- }
- lineToArray(points[i].x(), points[i].y()); // Add the moveTo as a new vertex
- break;
- case QPainterPath::LineToElement:
-// qDebug("element[%d] is a LineToElement", i);
- lineToArray(points[i].x(), points[i].y());
- break;
- case QPainterPath::CurveToElement: {
- QBezier b = QBezier::fromPoints(*(((const QPointF *) points) + i - 1),
- points[i],
- points[i+1],
- points[i+2]);
- QRectF bounds = b.bounds();
- // threshold based on same algorithm as in qtriangulatingstroker.cpp
- int threshold = qMin<float>(64, qMax(bounds.width(), bounds.height()) * 3.14f / (curveInverseScale * 6));
- if (threshold < 3) threshold = 3;
- qreal one_over_threshold_minus_1 = qreal(1) / (threshold - 1);
- for (int t=0; t<threshold; ++t) {
- QPointF pt = b.pointAt(t * one_over_threshold_minus_1);
- lineToArray(pt.x(), pt.y());
- }
- i += 2;
- break; }
- default:
- break;
- }
- }
- } while (0);
-
- if (!outline)
- addClosingLine(lastMoveTo);
- vertexArrayStops.add(vertexArray.size());
-}
-
-void QGL2PEXVertexArray::lineToArray(const GLfloat x, const GLfloat y)
-{
- vertexArray.add(QGLPoint(x, y));
-
- if (x > maxX)
- maxX = x;
- else if (x < minX)
- minX = x;
- if (y > maxY)
- maxY = y;
- else if (y < minY)
- minY = y;
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h b/src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h
deleted file mode 100644
index 5c95268790..0000000000
--- a/src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QGL2PEXVERTEXARRAY_P_H
-#define QGL2PEXVERTEXARRAY_P_H
-
-#include <QRectF>
-
-#include <private/qdatabuffer_p.h>
-#include <private/qvectorpath_p.h>
-#include <private/qgl_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGLPoint
-{
-public:
- QGLPoint(GLfloat new_x, GLfloat new_y) :
- x(new_x), y(new_y) {};
-
- QGLPoint(const QPointF &p) :
- x(p.x()), y(p.y()) {};
-
- QGLPoint(const QPointF* p) :
- x(p->x()), y(p->y()) {};
-
- GLfloat x;
- GLfloat y;
-
- operator QPointF() {return QPointF(x,y);}
- operator QPointF() const {return QPointF(x,y);}
-};
-
-struct QGLRect
-{
- QGLRect(const QRectF &r)
- : left(r.left()), top(r.top()), right(r.right()), bottom(r.bottom()) {}
-
- QGLRect(GLfloat l, GLfloat t, GLfloat r, GLfloat b)
- : left(l), top(t), right(r), bottom(b) {}
-
- GLfloat left;
- GLfloat top;
- GLfloat right;
- GLfloat bottom;
-
- operator QRectF() const {return QRectF(left, top, right-left, bottom-top);}
-};
-
-class QGL2PEXVertexArray
-{
-public:
- QGL2PEXVertexArray() :
- vertexArray(0), vertexArrayStops(0),
- maxX(-2e10), maxY(-2e10), minX(2e10), minY(2e10),
- boundingRectDirty(true)
- { }
-
- inline void addRect(const QRectF &rect)
- {
- qreal top = rect.top();
- qreal left = rect.left();
- qreal bottom = rect.bottom();
- qreal right = rect.right();
-
- vertexArray << QGLPoint(left, top)
- << QGLPoint(right, top)
- << QGLPoint(right, bottom)
- << QGLPoint(right, bottom)
- << QGLPoint(left, bottom)
- << QGLPoint(left, top);
- }
-
- inline void addQuad(const QRectF &rect)
- {
- qreal top = rect.top();
- qreal left = rect.left();
- qreal bottom = rect.bottom();
- qreal right = rect.right();
-
- vertexArray << QGLPoint(left, top)
- << QGLPoint(right, top)
- << QGLPoint(left, bottom)
- << QGLPoint(right, bottom);
-
- }
-
- inline void addVertex(const GLfloat x, const GLfloat y)
- {
- vertexArray.add(QGLPoint(x, y));
- }
-
- void addPath(const QVectorPath &path, GLfloat curveInverseScale, bool outline = true);
- void clear();
-
- QGLPoint* data() {return vertexArray.data();}
- int *stops() const { return vertexArrayStops.data(); }
- int stopCount() const { return vertexArrayStops.size(); }
- QGLRect boundingRect() const;
-
- int vertexCount() const { return vertexArray.size(); }
-
- void lineToArray(const GLfloat x, const GLfloat y);
-
-private:
- QDataBuffer<QGLPoint> vertexArray;
- QDataBuffer<int> vertexArrayStops;
-
- GLfloat maxX;
- GLfloat maxY;
- GLfloat minX;
- GLfloat minY;
- bool boundingRectDirty;
- void addClosingLine(int index);
- void addCentroid(const QVectorPath &path, int subPathIndex);
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/opengl/gl2paintengineex/qglcustomshaderstage.cpp b/src/opengl/gl2paintengineex/qglcustomshaderstage.cpp
deleted file mode 100644
index 7d6d4595ba..0000000000
--- a/src/opengl/gl2paintengineex/qglcustomshaderstage.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qglcustomshaderstage_p.h"
-#include "qglengineshadermanager_p.h"
-#include "qpaintengineex_opengl2_p.h"
-#include <private/qpainter_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGLCustomShaderStagePrivate
-{
-public:
- QGLCustomShaderStagePrivate() :
- m_manager(0) {}
-
- QPointer<QGLEngineShaderManager> m_manager;
- QByteArray m_source;
-};
-
-
-
-
-QGLCustomShaderStage::QGLCustomShaderStage()
- : d_ptr(new QGLCustomShaderStagePrivate)
-{
-}
-
-QGLCustomShaderStage::~QGLCustomShaderStage()
-{
- Q_D(QGLCustomShaderStage);
- if (d->m_manager) {
- d->m_manager->removeCustomStage();
- d->m_manager->sharedShaders->cleanupCustomStage(this);
- }
- delete d_ptr;
-}
-
-void QGLCustomShaderStage::setUniformsDirty()
-{
- Q_D(QGLCustomShaderStage);
- if (d->m_manager)
- d->m_manager->setDirty(); // ### Probably a bit overkill!
-}
-
-bool QGLCustomShaderStage::setOnPainter(QPainter* p)
-{
- Q_D(QGLCustomShaderStage);
- if (p->paintEngine()->type() != QPaintEngine::OpenGL2) {
- qWarning("QGLCustomShaderStage::setOnPainter() - paint engine not OpenGL2");
- return false;
- }
- if (d->m_manager)
- qWarning("Custom shader is already set on a painter");
-
- QGL2PaintEngineEx *engine = static_cast<QGL2PaintEngineEx*>(p->paintEngine());
- d->m_manager = QGL2PaintEngineExPrivate::shaderManagerForEngine(engine);
- Q_ASSERT(d->m_manager);
-
- d->m_manager->setCustomStage(this);
- return true;
-}
-
-void QGLCustomShaderStage::removeFromPainter(QPainter* p)
-{
- Q_D(QGLCustomShaderStage);
- if (p->paintEngine()->type() != QPaintEngine::OpenGL2)
- return;
-
- QGL2PaintEngineEx *engine = static_cast<QGL2PaintEngineEx*>(p->paintEngine());
- d->m_manager = QGL2PaintEngineExPrivate::shaderManagerForEngine(engine);
- Q_ASSERT(d->m_manager);
-
- // Just set the stage to null, don't call removeCustomStage().
- // This should leave the program in a compiled/linked state
- // if the next custom shader stage is this one again.
- d->m_manager->setCustomStage(0);
- d->m_manager = 0;
-}
-
-QByteArray QGLCustomShaderStage::source() const
-{
- Q_D(const QGLCustomShaderStage);
- return d->m_source;
-}
-
-// Called by the shader manager if another custom shader is attached or
-// the manager is deleted
-void QGLCustomShaderStage::setInactive()
-{
- Q_D(QGLCustomShaderStage);
- d->m_manager = 0;
-}
-
-void QGLCustomShaderStage::setSource(const QByteArray& s)
-{
- Q_D(QGLCustomShaderStage);
- d->m_source = s;
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/gl2paintengineex/qglcustomshaderstage_p.h b/src/opengl/gl2paintengineex/qglcustomshaderstage_p.h
deleted file mode 100644
index 77421ebdd3..0000000000
--- a/src/opengl/gl2paintengineex/qglcustomshaderstage_p.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGL_CUSTOM_SHADER_STAGE_H
-#define QGL_CUSTOM_SHADER_STAGE_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QGLShaderProgram>
-
-QT_BEGIN_NAMESPACE
-
-
-class QGLCustomShaderStagePrivate;
-class Q_OPENGL_EXPORT QGLCustomShaderStage
-{
- Q_DECLARE_PRIVATE(QGLCustomShaderStage)
-public:
- QGLCustomShaderStage();
- virtual ~QGLCustomShaderStage();
- virtual void setUniforms(QGLShaderProgram*) {}
-
- void setUniformsDirty();
-
- bool setOnPainter(QPainter*);
- void removeFromPainter(QPainter*);
- QByteArray source() const;
-
- void setInactive();
-protected:
- void setSource(const QByteArray&);
-
-private:
- QGLCustomShaderStagePrivate* d_ptr;
-};
-
-
-QT_END_NAMESPACE
-
-
-#endif
diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
deleted file mode 100644
index 47e8531959..0000000000
--- a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
+++ /dev/null
@@ -1,875 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qglengineshadermanager_p.h"
-#include "qglengineshadersource_p.h"
-#include "qpaintengineex_opengl2_p.h"
-#include "qglshadercache_p.h"
-
-#include <QtGui/private/qopenglcontext_p.h>
-
-#if defined(QT_DEBUG)
-#include <QMetaEnum>
-#endif
-
-#include <algorithm>
-
-// #define QT_GL_SHARED_SHADER_DEBUG
-
-QT_BEGIN_NAMESPACE
-
-class QGLEngineSharedShadersResource : public QOpenGLSharedResource
-{
-public:
- QGLEngineSharedShadersResource(QOpenGLContext *ctx)
- : QOpenGLSharedResource(ctx->shareGroup())
- , m_shaders(new QGLEngineSharedShaders(QGLContext::fromOpenGLContext(ctx)))
- {
- }
-
- ~QGLEngineSharedShadersResource()
- {
- delete m_shaders;
- }
-
- void invalidateResource() override
- {
- delete m_shaders;
- m_shaders = 0;
- }
-
- void freeResource(QOpenGLContext *) override
- {
- }
-
- QGLEngineSharedShaders *shaders() const { return m_shaders; }
-
-private:
- QGLEngineSharedShaders *m_shaders;
-};
-
-class QGLShaderStorage
-{
-public:
- QGLEngineSharedShaders *shadersForThread(const QGLContext *context) {
- QOpenGLMultiGroupSharedResource *&shaders = m_storage.localData();
- if (!shaders)
- shaders = new QOpenGLMultiGroupSharedResource;
- QGLEngineSharedShadersResource *resource =
- shaders->value<QGLEngineSharedShadersResource>(context->contextHandle());
- return resource ? resource->shaders() : 0;
- }
-
-private:
- QThreadStorage<QOpenGLMultiGroupSharedResource *> m_storage;
-};
-
-Q_GLOBAL_STATIC(QGLShaderStorage, qt_shader_storage);
-
-QGLEngineSharedShaders *QGLEngineSharedShaders::shadersForContext(const QGLContext *context)
-{
- return qt_shader_storage()->shadersForThread(context);
-}
-
-const char* QGLEngineSharedShaders::qShaderSnippets[] = {
- 0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0
-};
-
-QGLEngineSharedShaders::QGLEngineSharedShaders(const QGLContext* context)
- : blitShaderProg(0)
- , simpleShaderProg(0)
-{
-
-/*
- Rather than having the shader source array statically initialised, it is initialised
- here instead. This is to allow new shader names to be inserted or existing names moved
- around without having to change the order of the glsl strings. It is hoped this will
- make future hard-to-find runtime bugs more obvious and generally give more solid code.
-*/
- static bool snippetsPopulated = false;
- if (!snippetsPopulated) {
-
- const char** code = qShaderSnippets; // shortcut
-
- code[MainVertexShader] = qglslMainVertexShader;
- code[MainWithTexCoordsVertexShader] = qglslMainWithTexCoordsVertexShader;
- code[MainWithTexCoordsAndOpacityVertexShader] = qglslMainWithTexCoordsAndOpacityVertexShader;
-
- code[UntransformedPositionVertexShader] = qglslUntransformedPositionVertexShader;
- code[PositionOnlyVertexShader] = qglslPositionOnlyVertexShader;
- code[ComplexGeometryPositionOnlyVertexShader] = qglslComplexGeometryPositionOnlyVertexShader;
- code[PositionWithPatternBrushVertexShader] = qglslPositionWithPatternBrushVertexShader;
- code[PositionWithLinearGradientBrushVertexShader] = qglslPositionWithLinearGradientBrushVertexShader;
- code[PositionWithConicalGradientBrushVertexShader] = qglslPositionWithConicalGradientBrushVertexShader;
- code[PositionWithRadialGradientBrushVertexShader] = qglslPositionWithRadialGradientBrushVertexShader;
- code[PositionWithTextureBrushVertexShader] = qglslPositionWithTextureBrushVertexShader;
- code[AffinePositionWithPatternBrushVertexShader] = qglslAffinePositionWithPatternBrushVertexShader;
- code[AffinePositionWithLinearGradientBrushVertexShader] = qglslAffinePositionWithLinearGradientBrushVertexShader;
- code[AffinePositionWithConicalGradientBrushVertexShader] = qglslAffinePositionWithConicalGradientBrushVertexShader;
- code[AffinePositionWithRadialGradientBrushVertexShader] = qglslAffinePositionWithRadialGradientBrushVertexShader;
- code[AffinePositionWithTextureBrushVertexShader] = qglslAffinePositionWithTextureBrushVertexShader;
-
- code[MainFragmentShader_CMO] = qglslMainFragmentShader_CMO;
- code[MainFragmentShader_CM] = qglslMainFragmentShader_CM;
- code[MainFragmentShader_MO] = qglslMainFragmentShader_MO;
- code[MainFragmentShader_M] = qglslMainFragmentShader_M;
- code[MainFragmentShader_CO] = qglslMainFragmentShader_CO;
- code[MainFragmentShader_C] = qglslMainFragmentShader_C;
- code[MainFragmentShader_O] = qglslMainFragmentShader_O;
- code[MainFragmentShader] = qglslMainFragmentShader;
- code[MainFragmentShader_ImageArrays] = qglslMainFragmentShader_ImageArrays;
-
- code[ImageSrcFragmentShader] = qglslImageSrcFragmentShader;
- code[ImageSrcWithPatternFragmentShader] = qglslImageSrcWithPatternFragmentShader;
- code[NonPremultipliedImageSrcFragmentShader] = qglslNonPremultipliedImageSrcFragmentShader;
- code[CustomImageSrcFragmentShader] = qglslCustomSrcFragmentShader; // Calls "customShader", which must be appended
- code[SolidBrushSrcFragmentShader] = qglslSolidBrushSrcFragmentShader;
- if (!context->contextHandle()->isOpenGLES())
- code[TextureBrushSrcFragmentShader] = qglslTextureBrushSrcFragmentShader_desktop;
- else
- code[TextureBrushSrcFragmentShader] = qglslTextureBrushSrcFragmentShader_ES;
- code[TextureBrushSrcWithPatternFragmentShader] = qglslTextureBrushSrcWithPatternFragmentShader;
- code[PatternBrushSrcFragmentShader] = qglslPatternBrushSrcFragmentShader;
- code[LinearGradientBrushSrcFragmentShader] = qglslLinearGradientBrushSrcFragmentShader;
- code[RadialGradientBrushSrcFragmentShader] = qglslRadialGradientBrushSrcFragmentShader;
- code[ConicalGradientBrushSrcFragmentShader] = qglslConicalGradientBrushSrcFragmentShader;
- code[ShockingPinkSrcFragmentShader] = qglslShockingPinkSrcFragmentShader;
-
- code[NoMaskFragmentShader] = "";
- code[MaskFragmentShader] = qglslMaskFragmentShader;
- code[RgbMaskFragmentShaderPass1] = qglslRgbMaskFragmentShaderPass1;
- code[RgbMaskFragmentShaderPass2] = qglslRgbMaskFragmentShaderPass2;
- code[RgbMaskWithGammaFragmentShader] = ""; //###
-
- code[NoCompositionModeFragmentShader] = "";
- code[MultiplyCompositionModeFragmentShader] = ""; //###
- code[ScreenCompositionModeFragmentShader] = ""; //###
- code[OverlayCompositionModeFragmentShader] = ""; //###
- code[DarkenCompositionModeFragmentShader] = ""; //###
- code[LightenCompositionModeFragmentShader] = ""; //###
- code[ColorDodgeCompositionModeFragmentShader] = ""; //###
- code[ColorBurnCompositionModeFragmentShader] = ""; //###
- code[HardLightCompositionModeFragmentShader] = ""; //###
- code[SoftLightCompositionModeFragmentShader] = ""; //###
- code[DifferenceCompositionModeFragmentShader] = ""; //###
- code[ExclusionCompositionModeFragmentShader] = ""; //###
-
-#if defined(QT_DEBUG)
- // Check that all the elements have been filled:
- for (int i = 0; i < TotalSnippetCount; ++i) {
- if (Q_UNLIKELY(!qShaderSnippets[i])) {
- qFatal("Shader snippet for %s (#%d) is missing!",
- snippetNameStr(SnippetName(i)).constData(), i);
- }
- }
-#endif
- snippetsPopulated = true;
- }
-
- QGLShader* fragShader;
- QGLShader* vertexShader;
- QByteArray vertexSource;
- QByteArray fragSource;
-
- // Compile up the simple shader:
- vertexSource.append(qShaderSnippets[MainVertexShader]);
- vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);
-
- fragSource.append(qShaderSnippets[MainFragmentShader]);
- fragSource.append(qShaderSnippets[ShockingPinkSrcFragmentShader]);
-
- simpleShaderProg = new QGLShaderProgram(context, 0);
-
- CachedShader simpleShaderCache(fragSource, vertexSource);
-
- bool inCache = simpleShaderCache.load(simpleShaderProg, context);
-
- if (!inCache) {
- vertexShader = new QGLShader(QGLShader::Vertex, context, 0);
- shaders.append(vertexShader);
- if (!vertexShader->compileSourceCode(vertexSource))
- qWarning("Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile");
-
- fragShader = new QGLShader(QGLShader::Fragment, context, 0);
- shaders.append(fragShader);
- if (!fragShader->compileSourceCode(fragSource))
- qWarning("Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile");
-
- simpleShaderProg->addShader(vertexShader);
- simpleShaderProg->addShader(fragShader);
-
- simpleShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
- }
-
- simpleShaderProg->link();
-
- if (Q_UNLIKELY(!simpleShaderProg->isLinked())) {
- qCritical("Errors linking simple shader: %s", qPrintable(simpleShaderProg->log()));
- } else {
- if (!inCache)
- simpleShaderCache.store(simpleShaderProg, context);
- }
-
- // Compile the blit shader:
- vertexSource.clear();
- vertexSource.append(qShaderSnippets[MainWithTexCoordsVertexShader]);
- vertexSource.append(qShaderSnippets[UntransformedPositionVertexShader]);
-
- fragSource.clear();
- fragSource.append(qShaderSnippets[MainFragmentShader]);
- fragSource.append(qShaderSnippets[ImageSrcFragmentShader]);
-
- blitShaderProg = new QGLShaderProgram(context, 0);
-
- CachedShader blitShaderCache(fragSource, vertexSource);
-
- inCache = blitShaderCache.load(blitShaderProg, context);
-
- if (!inCache) {
- vertexShader = new QGLShader(QGLShader::Vertex, context, 0);
- shaders.append(vertexShader);
- if (!vertexShader->compileSourceCode(vertexSource))
- qWarning("Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile");
-
- fragShader = new QGLShader(QGLShader::Fragment, context, 0);
- shaders.append(fragShader);
- if (!fragShader->compileSourceCode(fragSource))
- qWarning("Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile");
-
- blitShaderProg->addShader(vertexShader);
- blitShaderProg->addShader(fragShader);
-
- blitShaderProg->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
- blitShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- }
-
- blitShaderProg->link();
- if (Q_UNLIKELY(!blitShaderProg->isLinked())) {
- qCritical("Errors linking blit shader: %s", qPrintable(blitShaderProg->log()));
- } else {
- if (!inCache)
- blitShaderCache.store(blitShaderProg, context);
- }
-
-#ifdef QT_GL_SHARED_SHADER_DEBUG
- qDebug(" -> QGLEngineSharedShaders() %p for thread %p.", this, QThread::currentThread());
-#endif
-}
-
-QGLEngineSharedShaders::~QGLEngineSharedShaders()
-{
-#ifdef QT_GL_SHARED_SHADER_DEBUG
- qDebug(" -> ~QGLEngineSharedShaders() %p for thread %p.", this, QThread::currentThread());
-#endif
- qDeleteAll(shaders);
- shaders.clear();
-
- qDeleteAll(cachedPrograms);
- cachedPrograms.clear();
-
- if (blitShaderProg) {
- delete blitShaderProg;
- blitShaderProg = 0;
- }
-
- if (simpleShaderProg) {
- delete simpleShaderProg;
- simpleShaderProg = 0;
- }
-}
-
-#if defined (QT_DEBUG)
-QByteArray QGLEngineSharedShaders::snippetNameStr(SnippetName name)
-{
- QMetaEnum m = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("SnippetName"));
- return QByteArray(m.valueToKey(name));
-}
-#endif
-
-// The address returned here will only be valid until next time this function is called.
-// The program is return bound.
-QGLEngineShaderProg *QGLEngineSharedShaders::findProgramInCache(const QGLEngineShaderProg &prog)
-{
- for (int i = 0; i < cachedPrograms.size(); ++i) {
- QGLEngineShaderProg *cachedProg = cachedPrograms.at(i);
- if (*cachedProg == prog) {
- // Move the program to the top of the list as a poor-man's cache algo
- cachedPrograms.move(i, 0);
- cachedProg->program->bind();
- return cachedProg;
- }
- }
-
- QScopedPointer<QGLEngineShaderProg> newProg;
-
- do {
- QByteArray fragSource;
- // Insert the custom stage before the srcPixel shader to work around an ATI driver bug
- // where you cannot forward declare a function that takes a sampler as argument.
- if (prog.srcPixelFragShader == CustomImageSrcFragmentShader)
- fragSource.append(prog.customStageSource);
- fragSource.append(qShaderSnippets[prog.mainFragShader]);
- fragSource.append(qShaderSnippets[prog.srcPixelFragShader]);
- if (prog.compositionFragShader)
- fragSource.append(qShaderSnippets[prog.compositionFragShader]);
- if (prog.maskFragShader)
- fragSource.append(qShaderSnippets[prog.maskFragShader]);
-
- QByteArray vertexSource;
- vertexSource.append(qShaderSnippets[prog.mainVertexShader]);
- vertexSource.append(qShaderSnippets[prog.positionVertexShader]);
-
- QScopedPointer<QGLShaderProgram> shaderProgram(new QGLShaderProgram);
-
- CachedShader shaderCache(fragSource, vertexSource);
- bool inCache = shaderCache.load(shaderProgram.data(), QGLContext::currentContext());
-
- if (!inCache) {
-
- QScopedPointer<QGLShader> fragShader(new QGLShader(QGLShader::Fragment));
- QByteArray description;
-#if defined(QT_DEBUG)
- // Name the shader for easier debugging
- description.append("Fragment shader: main=");
- description.append(snippetNameStr(prog.mainFragShader));
- description.append(", srcPixel=");
- description.append(snippetNameStr(prog.srcPixelFragShader));
- if (prog.compositionFragShader) {
- description.append(", composition=");
- description.append(snippetNameStr(prog.compositionFragShader));
- }
- if (prog.maskFragShader) {
- description.append(", mask=");
- description.append(snippetNameStr(prog.maskFragShader));
- }
- fragShader->setObjectName(QString::fromLatin1(description));
-#endif
- if (!fragShader->compileSourceCode(fragSource)) {
- qWarning() << "Warning:" << description << "failed to compile!";
- break;
- }
-
- QScopedPointer<QGLShader> vertexShader(new QGLShader(QGLShader::Vertex));
-#if defined(QT_DEBUG)
- // Name the shader for easier debugging
- description.clear();
- description.append("Vertex shader: main=");
- description.append(snippetNameStr(prog.mainVertexShader));
- description.append(", position=");
- description.append(snippetNameStr(prog.positionVertexShader));
- vertexShader->setObjectName(QString::fromLatin1(description));
-#endif
- if (!vertexShader->compileSourceCode(vertexSource)) {
- qWarning() << "Warning:" << description << "failed to compile!";
- break;
- }
-
- shaders.append(vertexShader.data());
- shaders.append(fragShader.data());
- shaderProgram->addShader(vertexShader.take());
- shaderProgram->addShader(fragShader.take());
-
- // We have to bind the vertex attribute names before the program is linked:
- shaderProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- if (prog.useTextureCoords)
- shaderProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
- if (prog.useOpacityAttribute)
- shaderProgram->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR);
- if (prog.usePmvMatrixAttribute) {
- shaderProgram->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
- shaderProgram->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
- shaderProgram->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
- }
- }
-
- newProg.reset(new QGLEngineShaderProg(prog));
- newProg->program = shaderProgram.take();
-
- newProg->program->link();
- if (newProg->program->isLinked()) {
- if (!inCache)
- shaderCache.store(newProg->program, QGLContext::currentContext());
- } else {
- QString error;
- error = QLatin1String("Shader program failed to link,");
-#if defined(QT_DEBUG)
- QLatin1String br("\n");
- error += QLatin1String("\n Shaders Used:\n");
- for (int i = 0; i < newProg->program->shaders().count(); ++i) {
- QGLShader *shader = newProg->program->shaders().at(i);
- error += QLatin1String(" ") + shader->objectName() + QLatin1String(": \n")
- + QLatin1String(shader->sourceCode()) + br;
- }
-#endif
- error += QLatin1String(" Error Log:\n")
- + QLatin1String(" ") + newProg->program->log();
- qWarning() << error;
- break;
- }
-
- newProg->program->bind();
-
- if (newProg->maskFragShader != QGLEngineSharedShaders::NoMaskFragmentShader) {
- GLuint location = newProg->program->uniformLocation("maskTexture");
- newProg->program->setUniformValue(location, QT_MASK_TEXTURE_UNIT);
- }
-
- if (cachedPrograms.count() > 30) {
- // The cache is full, so delete the last 5 programs in the list.
- // These programs will be least used, as a program us bumped to
- // the top of the list when it's used.
- for (int i = 0; i < 5; ++i) {
- delete cachedPrograms.last();
- cachedPrograms.removeLast();
- }
- }
-
- cachedPrograms.insert(0, newProg.data());
- } while (false);
-
- return newProg.take();
-}
-
-void QGLEngineSharedShaders::cleanupCustomStage(QGLCustomShaderStage* stage)
-{
- auto hasStageAsCustomShaderSouce = [stage](QGLEngineShaderProg *cachedProg) -> bool {
- if (cachedProg->customStageSource == stage->source()) {
- delete cachedProg;
- return true;
- }
- return false;
- };
- cachedPrograms.erase(std::remove_if(cachedPrograms.begin(), cachedPrograms.end(),
- hasStageAsCustomShaderSouce),
- cachedPrograms.end());
-}
-
-
-QGLEngineShaderManager::QGLEngineShaderManager(QGLContext* context)
- : ctx(context),
- shaderProgNeedsChanging(true),
- complexGeometry(false),
- srcPixelType(Qt::NoBrush),
- opacityMode(NoOpacity),
- maskType(NoMask),
- compositionMode(QPainter::CompositionMode_SourceOver),
- customSrcStage(0),
- currentShaderProg(0)
-{
- sharedShaders = QGLEngineSharedShaders::shadersForContext(context);
-}
-
-QGLEngineShaderManager::~QGLEngineShaderManager()
-{
- //###
- removeCustomStage();
-}
-
-GLuint QGLEngineShaderManager::getUniformLocation(Uniform id)
-{
- if (!currentShaderProg)
- return 0;
-
- QVector<uint> &uniformLocations = currentShaderProg->uniformLocations;
- if (uniformLocations.isEmpty())
- uniformLocations.fill(GLuint(-1), NumUniforms);
-
- static const char *const uniformNames[] = {
- "imageTexture",
- "patternColor",
- "globalOpacity",
- "depth",
- "maskTexture",
- "fragmentColor",
- "linearData",
- "angle",
- "halfViewportSize",
- "fmp",
- "fmp2_m_radius2",
- "inverse_2_fmp2_m_radius2",
- "sqrfr",
- "bradius",
- "invertedTextureSize",
- "brushTransform",
- "brushTexture",
- "matrix",
- "translateZ"
- };
-
- if (uniformLocations.at(id) == GLuint(-1))
- uniformLocations[id] = currentShaderProg->program->uniformLocation(uniformNames[id]);
-
- return uniformLocations.at(id);
-}
-
-
-void QGLEngineShaderManager::optimiseForBrushTransform(QTransform::TransformationType transformType)
-{
- Q_UNUSED(transformType); // Currently ignored
-}
-
-void QGLEngineShaderManager::setDirty()
-{
- shaderProgNeedsChanging = true;
-}
-
-void QGLEngineShaderManager::setSrcPixelType(Qt::BrushStyle style)
-{
- Q_ASSERT(style != Qt::NoBrush);
- if (srcPixelType == PixelSrcType(style))
- return;
-
- srcPixelType = style;
- shaderProgNeedsChanging = true; //###
-}
-
-void QGLEngineShaderManager::setSrcPixelType(PixelSrcType type)
-{
- if (srcPixelType == type)
- return;
-
- srcPixelType = type;
- shaderProgNeedsChanging = true; //###
-}
-
-void QGLEngineShaderManager::setOpacityMode(OpacityMode mode)
-{
- if (opacityMode == mode)
- return;
-
- opacityMode = mode;
- shaderProgNeedsChanging = true; //###
-}
-
-void QGLEngineShaderManager::setMaskType(MaskType type)
-{
- if (maskType == type)
- return;
-
- maskType = type;
- shaderProgNeedsChanging = true; //###
-}
-
-void QGLEngineShaderManager::setCompositionMode(QPainter::CompositionMode mode)
-{
- if (compositionMode == mode)
- return;
-
- compositionMode = mode;
- shaderProgNeedsChanging = true; //###
-}
-
-void QGLEngineShaderManager::setCustomStage(QGLCustomShaderStage* stage)
-{
- if (customSrcStage)
- removeCustomStage();
- customSrcStage = stage;
- shaderProgNeedsChanging = true;
-}
-
-void QGLEngineShaderManager::removeCustomStage()
-{
- if (customSrcStage)
- customSrcStage->setInactive();
- customSrcStage = 0;
- shaderProgNeedsChanging = true;
-}
-
-QGLShaderProgram* QGLEngineShaderManager::currentProgram()
-{
- if (currentShaderProg)
- return currentShaderProg->program;
- else
- return sharedShaders->simpleProgram();
-}
-
-void QGLEngineShaderManager::useSimpleProgram()
-{
- sharedShaders->simpleProgram()->bind();
- QGLContextPrivate* ctx_d = ctx->d_func();
- ctx_d->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
- ctx_d->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, false);
- ctx_d->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false);
- shaderProgNeedsChanging = true;
-}
-
-void QGLEngineShaderManager::useBlitProgram()
-{
- sharedShaders->blitProgram()->bind();
- QGLContextPrivate* ctx_d = ctx->d_func();
- ctx_d->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
- ctx_d->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, true);
- ctx_d->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false);
- shaderProgNeedsChanging = true;
-}
-
-QGLShaderProgram* QGLEngineShaderManager::simpleProgram()
-{
- return sharedShaders->simpleProgram();
-}
-
-QGLShaderProgram* QGLEngineShaderManager::blitProgram()
-{
- return sharedShaders->blitProgram();
-}
-
-
-
-// Select & use the correct shader program using the current state.
-// Returns \c true if program needed changing.
-bool QGLEngineShaderManager::useCorrectShaderProg()
-{
- if (!shaderProgNeedsChanging)
- return false;
-
- bool useCustomSrc = customSrcStage != 0;
- if (useCustomSrc && srcPixelType != QGLEngineShaderManager::ImageSrc && srcPixelType != Qt::TexturePattern) {
- useCustomSrc = false;
- qWarning("QGLEngineShaderManager - Ignoring custom shader stage for non image src");
- }
-
- QGLEngineShaderProg requiredProgram;
-
- bool texCoords = false;
-
- // Choose vertex shader shader position function (which typically also sets
- // varyings) and the source pixel (srcPixel) fragment shader function:
- requiredProgram.positionVertexShader = QGLEngineSharedShaders::InvalidSnippetName;
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::InvalidSnippetName;
- bool isAffine = brushTransform.isAffine();
- if ( (srcPixelType >= Qt::Dense1Pattern) && (srcPixelType <= Qt::DiagCrossPattern) ) {
- if (isAffine)
- requiredProgram.positionVertexShader = QGLEngineSharedShaders::AffinePositionWithPatternBrushVertexShader;
- else
- requiredProgram.positionVertexShader = QGLEngineSharedShaders::PositionWithPatternBrushVertexShader;
-
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::PatternBrushSrcFragmentShader;
- }
- else switch (srcPixelType) {
- default:
- case Qt::NoBrush:
- qFatal("QGLEngineShaderManager::useCorrectShaderProg() - Qt::NoBrush style is set");
- break;
- case QGLEngineShaderManager::ImageSrc:
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::ImageSrcFragmentShader;
- requiredProgram.positionVertexShader = QGLEngineSharedShaders::PositionOnlyVertexShader;
- texCoords = true;
- break;
- case QGLEngineShaderManager::NonPremultipliedImageSrc:
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::NonPremultipliedImageSrcFragmentShader;
- requiredProgram.positionVertexShader = QGLEngineSharedShaders::PositionOnlyVertexShader;
- texCoords = true;
- break;
- case QGLEngineShaderManager::PatternSrc:
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::ImageSrcWithPatternFragmentShader;
- requiredProgram.positionVertexShader = QGLEngineSharedShaders::PositionOnlyVertexShader;
- texCoords = true;
- break;
- case QGLEngineShaderManager::TextureSrcWithPattern:
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::TextureBrushSrcWithPatternFragmentShader;
- requiredProgram.positionVertexShader = isAffine ? QGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
- : QGLEngineSharedShaders::PositionWithTextureBrushVertexShader;
- break;
- case Qt::SolidPattern:
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::SolidBrushSrcFragmentShader;
- requiredProgram.positionVertexShader = QGLEngineSharedShaders::PositionOnlyVertexShader;
- break;
- case Qt::LinearGradientPattern:
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::LinearGradientBrushSrcFragmentShader;
- requiredProgram.positionVertexShader = isAffine ? QGLEngineSharedShaders::AffinePositionWithLinearGradientBrushVertexShader
- : QGLEngineSharedShaders::PositionWithLinearGradientBrushVertexShader;
- break;
- case Qt::ConicalGradientPattern:
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::ConicalGradientBrushSrcFragmentShader;
- requiredProgram.positionVertexShader = isAffine ? QGLEngineSharedShaders::AffinePositionWithConicalGradientBrushVertexShader
- : QGLEngineSharedShaders::PositionWithConicalGradientBrushVertexShader;
- break;
- case Qt::RadialGradientPattern:
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::RadialGradientBrushSrcFragmentShader;
- requiredProgram.positionVertexShader = isAffine ? QGLEngineSharedShaders::AffinePositionWithRadialGradientBrushVertexShader
- : QGLEngineSharedShaders::PositionWithRadialGradientBrushVertexShader;
- break;
- case Qt::TexturePattern:
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::TextureBrushSrcFragmentShader;
- requiredProgram.positionVertexShader = isAffine ? QGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
- : QGLEngineSharedShaders::PositionWithTextureBrushVertexShader;
- break;
- };
-
- if (useCustomSrc) {
- requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::CustomImageSrcFragmentShader;
- requiredProgram.customStageSource = customSrcStage->source();
- }
-
- const bool hasCompose = compositionMode > QPainter::CompositionMode_Plus;
- const bool hasMask = maskType != QGLEngineShaderManager::NoMask;
-
- // Choose fragment shader main function:
- if (opacityMode == AttributeOpacity) {
- Q_ASSERT(!hasCompose && !hasMask);
- requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_ImageArrays;
- } else {
- bool useGlobalOpacity = (opacityMode == UniformOpacity);
- if (hasCompose && hasMask && useGlobalOpacity)
- requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_CMO;
- if (hasCompose && hasMask && !useGlobalOpacity)
- requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_CM;
- if (!hasCompose && hasMask && useGlobalOpacity)
- requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_MO;
- if (!hasCompose && hasMask && !useGlobalOpacity)
- requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_M;
- if (hasCompose && !hasMask && useGlobalOpacity)
- requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_CO;
- if (hasCompose && !hasMask && !useGlobalOpacity)
- requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_C;
- if (!hasCompose && !hasMask && useGlobalOpacity)
- requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_O;
- if (!hasCompose && !hasMask && !useGlobalOpacity)
- requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader;
- }
-
- if (hasMask) {
- if (maskType == PixelMask) {
- requiredProgram.maskFragShader = QGLEngineSharedShaders::MaskFragmentShader;
- texCoords = true;
- } else if (maskType == SubPixelMaskPass1) {
- requiredProgram.maskFragShader = QGLEngineSharedShaders::RgbMaskFragmentShaderPass1;
- texCoords = true;
- } else if (maskType == SubPixelMaskPass2) {
- requiredProgram.maskFragShader = QGLEngineSharedShaders::RgbMaskFragmentShaderPass2;
- texCoords = true;
- } else if (maskType == SubPixelWithGammaMask) {
- requiredProgram.maskFragShader = QGLEngineSharedShaders::RgbMaskWithGammaFragmentShader;
- texCoords = true;
- } else {
- qCritical("QGLEngineShaderManager::useCorrectShaderProg() - Unknown mask type");
- }
- } else {
- requiredProgram.maskFragShader = QGLEngineSharedShaders::NoMaskFragmentShader;
- }
-
- if (hasCompose) {
- switch (compositionMode) {
- case QPainter::CompositionMode_Multiply:
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::MultiplyCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Screen:
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::ScreenCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Overlay:
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::OverlayCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Darken:
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::DarkenCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Lighten:
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::LightenCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_ColorDodge:
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::ColorDodgeCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_ColorBurn:
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::ColorBurnCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_HardLight:
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::HardLightCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_SoftLight:
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::SoftLightCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Difference:
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::DifferenceCompositionModeFragmentShader;
- break;
- case QPainter::CompositionMode_Exclusion:
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::ExclusionCompositionModeFragmentShader;
- break;
- default:
- qWarning("QGLEngineShaderManager::useCorrectShaderProg() - Unsupported composition mode");
- }
- } else {
- requiredProgram.compositionFragShader = QGLEngineSharedShaders::NoCompositionModeFragmentShader;
- }
-
- // Choose vertex shader main function
- if (opacityMode == AttributeOpacity) {
- Q_ASSERT(texCoords);
- requiredProgram.mainVertexShader = QGLEngineSharedShaders::MainWithTexCoordsAndOpacityVertexShader;
- } else if (texCoords) {
- requiredProgram.mainVertexShader = QGLEngineSharedShaders::MainWithTexCoordsVertexShader;
- } else {
- requiredProgram.mainVertexShader = QGLEngineSharedShaders::MainVertexShader;
- }
- requiredProgram.useTextureCoords = texCoords;
- requiredProgram.useOpacityAttribute = (opacityMode == AttributeOpacity);
- if (complexGeometry && srcPixelType == Qt::SolidPattern) {
- requiredProgram.positionVertexShader = QGLEngineSharedShaders::ComplexGeometryPositionOnlyVertexShader;
- requiredProgram.usePmvMatrixAttribute = false;
- } else {
- requiredProgram.usePmvMatrixAttribute = true;
-
- // Force complexGeometry off, since we currently don't support that mode for
- // non-solid brushes
- complexGeometry = false;
- }
-
- // At this point, requiredProgram is fully populated so try to find the program in the cache
- currentShaderProg = sharedShaders->findProgramInCache(requiredProgram);
-
- if (currentShaderProg && useCustomSrc) {
- customSrcStage->setUniforms(currentShaderProg->program);
- }
-
- // Make sure all the vertex attribute arrays the program uses are enabled (and the ones it
- // doesn't use are disabled)
- QGLContextPrivate* ctx_d = ctx->d_func();
- ctx_d->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
- ctx_d->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, currentShaderProg && currentShaderProg->useTextureCoords);
- ctx_d->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, currentShaderProg && currentShaderProg->useOpacityAttribute);
-
- shaderProgNeedsChanging = false;
- return true;
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h
deleted file mode 100644
index d23b3ad550..0000000000
--- a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h
+++ /dev/null
@@ -1,508 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-/*
- VERTEX SHADERS
- ==============
-
- Vertex shaders are specified as multiple (partial) shaders. On desktop,
- this works fine. On ES, QGLShader & QGLShaderProgram will make partial
- shaders work by concatenating the source in each QGLShader and compiling
- it as a single shader. This is abstracted nicely by QGLShaderProgram and
- the GL2 engine doesn't need to worry about it.
-
- Generally, there's two vertex shader objects. The position shaders are
- the ones which set gl_Position. There's also two "main" vertex shaders,
- one which just calls the position shader and another which also passes
- through some texture coordinates from a vertex attribute array to a
- varying. These texture coordinates are used for mask position in text
- rendering and for the source coordinates in drawImage/drawPixmap. There's
- also a "Simple" vertex shader for rendering a solid colour (used to render
- into the stencil buffer where the actual colour value is discarded).
-
- The position shaders for brushes look scary. This is because many of the
- calculations which logically belong in the fragment shader have been moved
- into the vertex shader to improve performance. This is why the position
- calculation is in a separate shader. Not only does it calculate the
- position, but it also calculates some data to be passed to the fragment
- shader as a varying. It is optimal to move as much of the calculation as
- possible into the vertex shader as this is executed less often.
-
- The varyings passed to the fragment shaders are interpolated (which is
- cheap). Unfortunately, GL will apply perspective correction to the
- interpolation calusing errors. To get around this, the vertex shader must
- apply perspective correction itself and set the w-value of gl_Position to
- zero. That way, GL will be tricked into thinking it doesn't need to apply a
- perspective correction and use linear interpolation instead (which is what
- we want). Of course, if the brush transform is affeine, no perspective
- correction is needed and a simpler vertex shader can be used instead.
-
- So there are the following "main" vertex shaders:
- qglslMainVertexShader
- qglslMainWithTexCoordsVertexShader
-
- And the following position vertex shaders:
- qglslPositionOnlyVertexShader
- qglslPositionWithTextureBrushVertexShader
- qglslPositionWithPatternBrushVertexShader
- qglslPositionWithLinearGradientBrushVertexShader
- qglslPositionWithRadialGradientBrushVertexShader
- qglslPositionWithConicalGradientBrushVertexShader
- qglslAffinePositionWithTextureBrushVertexShader
- qglslAffinePositionWithPatternBrushVertexShader
- qglslAffinePositionWithLinearGradientBrushVertexShader
- qglslAffinePositionWithRadialGradientBrushVertexShader
- qglslAffinePositionWithConicalGradientBrushVertexShader
-
- Leading to 23 possible vertex shaders
-
-
- FRAGMENT SHADERS
- ================
-
- Fragment shaders are also specified as multiple (partial) shaders. The
- different fragment shaders represent the different stages in Qt's fragment
- pipeline. There are 1-3 stages in this pipeline: First stage is to get the
- fragment's colour value. The next stage is to get the fragment's mask value
- (coverage value for anti-aliasing) and the final stage is to blend the
- incoming fragment with the background (for composition modes not supported
- by GL).
-
- Of these, the first stage will always be present. If Qt doesn't need to
- apply anti-aliasing (because it's off or handled by multisampling) then
- the coverage value doesn't need to be applied. (Note: There are two types
- of mask, one for regular anti-aliasing and one for sub-pixel anti-
- aliasing.) If the composition mode is one which GL supports natively then
- the blending stage doesn't need to be applied.
-
- As eash stage can have multiple implementations, they are abstracted as
- GLSL function calls with the following signatures:
-
- Brushes & image drawing are implementations of "qcolorp vec4 srcPixel()":
- qglslImageSrcFragShader
- qglslImageSrcWithPatternFragShader
- qglslNonPremultipliedImageSrcFragShader
- qglslSolidBrushSrcFragShader
- qglslTextureBrushSrcFragShader
- qglslTextureBrushWithPatternFragShader
- qglslPatternBrushSrcFragShader
- qglslLinearGradientBrushSrcFragShader
- qglslRadialGradientBrushSrcFragShader
- qglslConicalGradientBrushSrcFragShader
- NOTE: It is assumed the colour returned by srcPixel() is pre-multiplied
-
- Masks are implementations of "qcolorp vec4 applyMask(qcolorp vec4 src)":
- qglslMaskFragmentShader
- qglslRgbMaskFragmentShaderPass1
- qglslRgbMaskFragmentShaderPass2
- qglslRgbMaskWithGammaFragmentShader
-
- Composition modes are "qcolorp vec4 compose(qcolorp vec4 src)":
- qglslColorBurnCompositionModeFragmentShader
- qglslColorDodgeCompositionModeFragmentShader
- qglslDarkenCompositionModeFragmentShader
- qglslDifferenceCompositionModeFragmentShader
- qglslExclusionCompositionModeFragmentShader
- qglslHardLightCompositionModeFragmentShader
- qglslLightenCompositionModeFragmentShader
- qglslMultiplyCompositionModeFragmentShader
- qglslOverlayCompositionModeFragmentShader
- qglslScreenCompositionModeFragmentShader
- qglslSoftLightCompositionModeFragmentShader
-
-
- Note: In the future, some GLSL compilers will support an extension allowing
- a new 'color' precision specifier. To support this, qcolorp is used for
- all color components so it can be defined to colorp or lowp depending upon
- the implementation.
-
- So there are differnt frament shader main functions, depending on the
- number & type of pipelines the fragment needs to go through.
-
- The choice of which main() fragment shader string to use depends on:
- - Use of global opacity
- - Brush style (some brushes apply opacity themselves)
- - Use & type of mask (TODO: Need to support high quality anti-aliasing & text)
- - Use of non-GL Composition mode
-
- Leading to the following fragment shader main functions:
- gl_FragColor = compose(applyMask(srcPixel()*globalOpacity));
- gl_FragColor = compose(applyMask(srcPixel()));
- gl_FragColor = applyMask(srcPixel()*globalOpacity);
- gl_FragColor = applyMask(srcPixel());
- gl_FragColor = compose(srcPixel()*globalOpacity);
- gl_FragColor = compose(srcPixel());
- gl_FragColor = srcPixel()*globalOpacity;
- gl_FragColor = srcPixel();
-
- Called:
- qglslMainFragmentShader_CMO
- qglslMainFragmentShader_CM
- qglslMainFragmentShader_MO
- qglslMainFragmentShader_M
- qglslMainFragmentShader_CO
- qglslMainFragmentShader_C
- qglslMainFragmentShader_O
- qglslMainFragmentShader
-
- Where:
- M = Mask
- C = Composition
- O = Global Opacity
-
-
- CUSTOM SHADER CODE
- ==================
-
- The use of custom shader code is supported by the engine for drawImage and
- drawPixmap calls. This is implemented via hooks in the fragment pipeline.
-
- The custom shader is passed to the engine as a partial fragment shader
- (QGLCustomShaderStage). The shader will implement a pre-defined method name
- which Qt's fragment pipeline will call:
-
- lowp vec4 customShader(lowp sampler2d imageTexture, highp vec2 textureCoords)
-
- The provided src and srcCoords parameters can be used to sample from the
- source image.
-
- Transformations, clipping, opacity, and composition modes set using QPainter
- will be respected when using the custom shader hook.
-*/
-
-#ifndef QGLENGINE_SHADER_MANAGER_H
-#define QGLENGINE_SHADER_MANAGER_H
-
-#include <QGLShader>
-#include <QGLShaderProgram>
-#include <QPainter>
-#include <private/qgl_p.h>
-#include <private/qglcustomshaderstage_p.h>
-
-QT_BEGIN_NAMESPACE
-
-
-
-/*
-struct QGLEngineCachedShaderProg
-{
- QGLEngineCachedShaderProg(QGLEngineShaderManager::ShaderName vertexMain,
- QGLEngineShaderManager::ShaderName vertexPosition,
- QGLEngineShaderManager::ShaderName fragMain,
- QGLEngineShaderManager::ShaderName pixelSrc,
- QGLEngineShaderManager::ShaderName mask,
- QGLEngineShaderManager::ShaderName composition);
-
- int cacheKey;
- QGLShaderProgram* program;
-}
-*/
-
-static const GLuint QT_VERTEX_COORDS_ATTR = 0;
-static const GLuint QT_TEXTURE_COORDS_ATTR = 1;
-static const GLuint QT_OPACITY_ATTR = 2;
-static const GLuint QT_PMV_MATRIX_1_ATTR = 3;
-static const GLuint QT_PMV_MATRIX_2_ATTR = 4;
-static const GLuint QT_PMV_MATRIX_3_ATTR = 5;
-
-class QGLEngineShaderProg;
-
-class Q_OPENGL_EXPORT QGLEngineSharedShaders
-{
- Q_GADGET
-public:
-
- enum SnippetName {
- MainVertexShader,
- MainWithTexCoordsVertexShader,
- MainWithTexCoordsAndOpacityVertexShader,
-
- // UntransformedPositionVertexShader must be first in the list:
- UntransformedPositionVertexShader,
- PositionOnlyVertexShader,
- ComplexGeometryPositionOnlyVertexShader,
- PositionWithPatternBrushVertexShader,
- PositionWithLinearGradientBrushVertexShader,
- PositionWithConicalGradientBrushVertexShader,
- PositionWithRadialGradientBrushVertexShader,
- PositionWithTextureBrushVertexShader,
- AffinePositionWithPatternBrushVertexShader,
- AffinePositionWithLinearGradientBrushVertexShader,
- AffinePositionWithConicalGradientBrushVertexShader,
- AffinePositionWithRadialGradientBrushVertexShader,
- AffinePositionWithTextureBrushVertexShader,
-
- // MainFragmentShader_CMO must be first in the list:
- MainFragmentShader_CMO,
- MainFragmentShader_CM,
- MainFragmentShader_MO,
- MainFragmentShader_M,
- MainFragmentShader_CO,
- MainFragmentShader_C,
- MainFragmentShader_O,
- MainFragmentShader,
- MainFragmentShader_ImageArrays,
-
- // ImageSrcFragmentShader must be first in the list::
- ImageSrcFragmentShader,
- ImageSrcWithPatternFragmentShader,
- NonPremultipliedImageSrcFragmentShader,
- CustomImageSrcFragmentShader,
- SolidBrushSrcFragmentShader,
- TextureBrushSrcFragmentShader,
- TextureBrushSrcWithPatternFragmentShader,
- PatternBrushSrcFragmentShader,
- LinearGradientBrushSrcFragmentShader,
- RadialGradientBrushSrcFragmentShader,
- ConicalGradientBrushSrcFragmentShader,
- ShockingPinkSrcFragmentShader,
-
- // NoMaskFragmentShader must be first in the list:
- NoMaskFragmentShader,
- MaskFragmentShader,
- RgbMaskFragmentShaderPass1,
- RgbMaskFragmentShaderPass2,
- RgbMaskWithGammaFragmentShader,
-
- // NoCompositionModeFragmentShader must be first in the list:
- NoCompositionModeFragmentShader,
- MultiplyCompositionModeFragmentShader,
- ScreenCompositionModeFragmentShader,
- OverlayCompositionModeFragmentShader,
- DarkenCompositionModeFragmentShader,
- LightenCompositionModeFragmentShader,
- ColorDodgeCompositionModeFragmentShader,
- ColorBurnCompositionModeFragmentShader,
- HardLightCompositionModeFragmentShader,
- SoftLightCompositionModeFragmentShader,
- DifferenceCompositionModeFragmentShader,
- ExclusionCompositionModeFragmentShader,
-
- TotalSnippetCount, InvalidSnippetName
- };
-#if defined (QT_DEBUG)
- Q_ENUMS(SnippetName)
- static QByteArray snippetNameStr(SnippetName snippetName);
-#endif
-
-/*
- // These allow the ShaderName enum to be used as a cache key
- const int mainVertexOffset = 0;
- const int positionVertexOffset = (1<<2) - PositionOnlyVertexShader;
- const int mainFragOffset = (1<<6) - MainFragmentShader_CMO;
- const int srcPixelOffset = (1<<10) - ImageSrcFragmentShader;
- const int maskOffset = (1<<14) - NoMaskShader;
- const int compositionOffset = (1 << 16) - MultiplyCompositionModeFragmentShader;
-*/
-
- QGLEngineSharedShaders(const QGLContext *context);
- ~QGLEngineSharedShaders();
-
- QGLShaderProgram *simpleProgram() { return simpleShaderProg; }
- QGLShaderProgram *blitProgram() { return blitShaderProg; }
- // Compile the program if it's not already in the cache, return the item in the cache.
- QGLEngineShaderProg *findProgramInCache(const QGLEngineShaderProg &prog);
- // Compile the custom shader if it's not already in the cache, return the item in the cache.
-
- static QGLEngineSharedShaders *shadersForContext(const QGLContext *context);
-
- // Ideally, this would be static and cleanup all programs in all contexts which
- // contain the custom code. Currently it is just a hint and we rely on deleted
- // custom shaders being cleaned up by being kicked out of the cache when it's
- // full.
- void cleanupCustomStage(QGLCustomShaderStage* stage);
-
-private:
- QGLShaderProgram *blitShaderProg;
- QGLShaderProgram *simpleShaderProg;
- QList<QGLEngineShaderProg*> cachedPrograms;
- QList<QGLShader *> shaders;
-
- static const char* qShaderSnippets[TotalSnippetCount];
-};
-
-
-class QGLEngineShaderProg
-{
-public:
- QGLEngineShaderProg() : program(nullptr) {}
-
- ~QGLEngineShaderProg() {
- if (program)
- delete program;
- }
-
- QGLEngineSharedShaders::SnippetName mainVertexShader;
- QGLEngineSharedShaders::SnippetName positionVertexShader;
- QGLEngineSharedShaders::SnippetName mainFragShader;
- QGLEngineSharedShaders::SnippetName srcPixelFragShader;
- QGLEngineSharedShaders::SnippetName maskFragShader;
- QGLEngineSharedShaders::SnippetName compositionFragShader;
-
- QByteArray customStageSource; //TODO: Decent cache key for custom stages
- QGLShaderProgram* program;
-
- QVector<uint> uniformLocations;
-
- bool useTextureCoords;
- bool useOpacityAttribute;
- bool usePmvMatrixAttribute;
-
- bool operator==(const QGLEngineShaderProg& other) const {
- // We don't care about the program
- return ( mainVertexShader == other.mainVertexShader &&
- positionVertexShader == other.positionVertexShader &&
- mainFragShader == other.mainFragShader &&
- srcPixelFragShader == other.srcPixelFragShader &&
- maskFragShader == other.maskFragShader &&
- compositionFragShader == other.compositionFragShader &&
- customStageSource == other.customStageSource
- );
- }
-};
-
-class Q_OPENGL_EXPORT QGLEngineShaderManager : public QObject
-{
- Q_OBJECT
-public:
- QGLEngineShaderManager(QGLContext* context);
- ~QGLEngineShaderManager();
-
- enum MaskType {NoMask, PixelMask, SubPixelMaskPass1, SubPixelMaskPass2, SubPixelWithGammaMask};
- enum PixelSrcType {
- ImageSrc = Qt::TexturePattern+1,
- NonPremultipliedImageSrc = Qt::TexturePattern+2,
- PatternSrc = Qt::TexturePattern+3,
- TextureSrcWithPattern = Qt::TexturePattern+4
- };
-
- enum Uniform {
- ImageTexture,
- PatternColor,
- GlobalOpacity,
- Depth,
- MaskTexture,
- FragmentColor,
- LinearData,
- Angle,
- HalfViewportSize,
- Fmp,
- Fmp2MRadius2,
- Inverse2Fmp2MRadius2,
- SqrFr,
- BRadius,
- InvertedTextureSize,
- BrushTransform,
- BrushTexture,
- Matrix,
- TranslateZ,
- NumUniforms
- };
-
- enum OpacityMode {
- NoOpacity,
- UniformOpacity,
- AttributeOpacity
- };
-
- // There are optimizations we can do, depending on the brush transform:
- // 1) May not have to apply perspective-correction
- // 2) Can use lower precision for matrix
- void optimiseForBrushTransform(QTransform::TransformationType transformType);
- void setSrcPixelType(Qt::BrushStyle);
- void setSrcPixelType(PixelSrcType); // For non-brush sources, like pixmaps & images
- void setOpacityMode(OpacityMode);
- void setMaskType(MaskType);
- void setCompositionMode(QPainter::CompositionMode);
- void setCustomStage(QGLCustomShaderStage* stage);
- void removeCustomStage();
-
- GLuint getUniformLocation(Uniform id);
-
- void setDirty(); // someone has manually changed the current shader program
- bool useCorrectShaderProg(); // returns true if the shader program needed to be changed
-
- void useSimpleProgram();
- void useBlitProgram();
- void setHasComplexGeometry(bool hasComplexGeometry)
- {
- complexGeometry = hasComplexGeometry;
- shaderProgNeedsChanging = true;
- }
- bool hasComplexGeometry() const
- {
- return complexGeometry;
- }
-
- QGLShaderProgram* currentProgram(); // Returns pointer to the shader the manager has chosen
- QGLShaderProgram* simpleProgram(); // Used to draw into e.g. stencil buffers
- QGLShaderProgram* blitProgram(); // Used to blit a texture into the framebuffer
-
- QGLEngineSharedShaders* sharedShaders;
-
-private:
- QGLContext* ctx;
- bool shaderProgNeedsChanging;
- bool complexGeometry;
-
- // Current state variables which influence the choice of shader:
- QTransform brushTransform;
- int srcPixelType;
- OpacityMode opacityMode;
- MaskType maskType;
- QPainter::CompositionMode compositionMode;
- QGLCustomShaderStage* customSrcStage;
-
- QGLEngineShaderProg* currentShaderProg;
-};
-
-QT_END_NAMESPACE
-
-#endif //QGLENGINE_SHADER_MANAGER_H
diff --git a/src/opengl/gl2paintengineex/qglengineshadersource_p.h b/src/opengl/gl2paintengineex/qglengineshadersource_p.h
deleted file mode 100644
index a667af9b96..0000000000
--- a/src/opengl/gl2paintengineex/qglengineshadersource_p.h
+++ /dev/null
@@ -1,523 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-
-#ifndef QGL_ENGINE_SHADER_SOURCE_H
-#define QGL_ENGINE_SHADER_SOURCE_H
-
-#include "qglengineshadermanager_p.h"
-
-QT_BEGIN_NAMESPACE
-
-
-
-static const char* const qglslMainVertexShader = "\n\
- void setPosition(); \n\
- void main(void) \n\
- { \n\
- setPosition(); \n\
- }\n";
-
-static const char* const qglslMainWithTexCoordsVertexShader = "\n\
- attribute highp vec2 textureCoordArray; \n\
- varying highp vec2 textureCoords; \n\
- void setPosition(); \n\
- void main(void) \n\
- { \n\
- setPosition(); \n\
- textureCoords = textureCoordArray; \n\
- }\n";
-
-static const char* const qglslMainWithTexCoordsAndOpacityVertexShader = "\n\
- attribute highp vec2 textureCoordArray; \n\
- attribute lowp float opacityArray; \n\
- varying highp vec2 textureCoords; \n\
- varying lowp float opacity; \n\
- void setPosition(); \n\
- void main(void) \n\
- { \n\
- setPosition(); \n\
- textureCoords = textureCoordArray; \n\
- opacity = opacityArray; \n\
- }\n";
-
-// NOTE: We let GL do the perspective correction so texture lookups in the fragment
-// shader are also perspective corrected.
-static const char* const qglslPositionOnlyVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray; \n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- void setPosition(void) \n\
- { \n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position = vec4(transformedPos.xy, 0.0, transformedPos.z); \n\
- }\n";
-
-static const char* const qglslComplexGeometryPositionOnlyVertexShader = "\n\
- uniform highp mat3 matrix; \n\
- uniform highp float translateZ; \n\
- attribute highp vec2 vertexCoordsArray; \n\
- void setPosition(void) \n\
- { \n\
- vec3 v = matrix * vec3(vertexCoordsArray, 1.0); \n\
- vec4 vz = mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, translateZ, 1) * vec4(v, 1.0); \n\
- gl_Position = vec4(vz.xyz, 1.0);\n\
- } \n";
-
-static const char* const qglslUntransformedPositionVertexShader = "\n\
- attribute highp vec4 vertexCoordsArray; \n\
- void setPosition(void) \n\
- { \n\
- gl_Position = vertexCoordsArray; \n\
- }\n";
-
-// Pattern Brush - This assumes the texture size is 8x8 and thus, the inverted size is 0.125
-static const char* const qglslPositionWithPatternBrushVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray; \n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- uniform mediump vec2 halfViewportSize; \n\
- uniform highp vec2 invertedTextureSize; \n\
- uniform highp mat3 brushTransform; \n\
- varying highp vec2 patternTexCoords; \n\
- void setPosition(void) \n\
- { \n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1.0); \n\
- mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- patternTexCoords.xy = (hTexCoords.xy * 0.125) * invertedHTexCoordsZ; \n\
- }\n";
-
-static const char* const qglslAffinePositionWithPatternBrushVertexShader
- = qglslPositionWithPatternBrushVertexShader;
-
-static const char* const qglslPatternBrushSrcFragmentShader = "\n\
- uniform sampler2D brushTexture; \n\
- uniform lowp vec4 patternColor; \n\
- varying highp vec2 patternTexCoords;\n\
- lowp vec4 srcPixel() \n\
- { \n\
- return patternColor * (1.0 - texture2D(brushTexture, patternTexCoords).r); \n\
- }\n";
-
-
-// Linear Gradient Brush
-static const char* const qglslPositionWithLinearGradientBrushVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray; \n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- uniform mediump vec2 halfViewportSize; \n\
- uniform highp vec3 linearData; \n\
- uniform highp mat3 brushTransform; \n\
- varying mediump float index; \n\
- void setPosition() \n\
- { \n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- index = (dot(linearData.xy, hTexCoords.xy) * linearData.z) * invertedHTexCoordsZ; \n\
- }\n";
-
-static const char* const qglslAffinePositionWithLinearGradientBrushVertexShader
- = qglslPositionWithLinearGradientBrushVertexShader;
-
-static const char* const qglslLinearGradientBrushSrcFragmentShader = "\n\
- uniform sampler2D brushTexture; \n\
- varying mediump float index; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- mediump vec2 val = vec2(index, 0.5); \n\
- return texture2D(brushTexture, val); \n\
- }\n";
-
-
-// Conical Gradient Brush
-static const char* const qglslPositionWithConicalGradientBrushVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray; \n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- uniform mediump vec2 halfViewportSize; \n\
- uniform highp mat3 brushTransform; \n\
- varying highp vec2 A; \n\
- void setPosition(void) \n\
- { \n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- A = hTexCoords.xy * invertedHTexCoordsZ; \n\
- }\n";
-
-static const char* const qglslAffinePositionWithConicalGradientBrushVertexShader
- = qglslPositionWithConicalGradientBrushVertexShader;
-
-static const char* const qglslConicalGradientBrushSrcFragmentShader = "\n\
- #define INVERSE_2PI 0.1591549430918953358 \n\
- uniform sampler2D brushTexture; \n\
- uniform mediump float angle; \n\
- varying highp vec2 A; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- highp float t; \n\
- if (abs(A.y) == abs(A.x)) \n\
- t = (atan(-A.y + 0.002, A.x) + angle) * INVERSE_2PI; \n\
- else \n\
- t = (atan(-A.y, A.x) + angle) * INVERSE_2PI; \n\
- return texture2D(brushTexture, vec2(t - floor(t), 0.5)); \n\
- }\n";
-
-
-// Radial Gradient Brush
-static const char* const qglslPositionWithRadialGradientBrushVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray;\n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- uniform mediump vec2 halfViewportSize; \n\
- uniform highp mat3 brushTransform; \n\
- uniform highp vec2 fmp; \n\
- uniform mediump vec3 bradius; \n\
- varying highp float b; \n\
- varying highp vec2 A; \n\
- void setPosition(void) \n\
- {\n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- A = hTexCoords.xy * invertedHTexCoordsZ; \n\
- b = bradius.x + 2.0 * dot(A, fmp); \n\
- }\n";
-
-static const char* const qglslAffinePositionWithRadialGradientBrushVertexShader
- = qglslPositionWithRadialGradientBrushVertexShader;
-
-static const char* const qglslRadialGradientBrushSrcFragmentShader = "\n\
- uniform sampler2D brushTexture; \n\
- uniform highp float fmp2_m_radius2; \n\
- uniform highp float inverse_2_fmp2_m_radius2; \n\
- uniform highp float sqrfr; \n\
- varying highp float b; \n\
- varying highp vec2 A; \n\
- uniform mediump vec3 bradius; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- highp float c = sqrfr-dot(A, A); \n\
- highp float det = b*b - 4.0*fmp2_m_radius2*c; \n\
- lowp vec4 result = vec4(0.0); \n\
- if (det >= 0.0) { \n\
- highp float detSqrt = sqrt(det); \n\
- highp float w = max((-b - detSqrt) * inverse_2_fmp2_m_radius2, (-b + detSqrt) * inverse_2_fmp2_m_radius2); \n\
- if (bradius.y + w * bradius.z >= 0.0) \n\
- result = texture2D(brushTexture, vec2(w, 0.5)); \n\
- } \n\
- return result; \n\
- }\n";
-
-
-// Texture Brush
-static const char* const qglslPositionWithTextureBrushVertexShader = "\n\
- attribute highp vec2 vertexCoordsArray; \n\
- attribute highp vec3 pmvMatrix1; \n\
- attribute highp vec3 pmvMatrix2; \n\
- attribute highp vec3 pmvMatrix3; \n\
- uniform mediump vec2 halfViewportSize; \n\
- uniform highp vec2 invertedTextureSize; \n\
- uniform highp mat3 brushTransform; \n\
- varying highp vec2 brushTextureCoords; \n\
- void setPosition(void) \n\
- { \n\
- highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
- vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
- gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
- mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
- mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
- mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
- gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
- brushTextureCoords.xy = (hTexCoords.xy * invertedTextureSize) * gl_Position.w; \n\
- }\n";
-
-static const char* const qglslAffinePositionWithTextureBrushVertexShader
- = qglslPositionWithTextureBrushVertexShader;
-
-// OpenGL ES does not support GL_REPEAT wrap modes for NPOT textures. So instead,
-// we emulate GL_REPEAT by only taking the fractional part of the texture coords.
-// TODO: Special case POT textures which don't need this emulation
-static const char* const qglslTextureBrushSrcFragmentShader_ES = "\n\
- varying highp vec2 brushTextureCoords; \n\
- uniform sampler2D brushTexture; \n\
- lowp vec4 srcPixel() { \n\
- return texture2D(brushTexture, fract(brushTextureCoords)); \n\
- }\n";
-
-static const char* const qglslTextureBrushSrcFragmentShader_desktop = "\n\
- varying highp vec2 brushTextureCoords; \n\
- uniform sampler2D brushTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return texture2D(brushTexture, brushTextureCoords); \n\
- }\n";
-
-static const char* const qglslTextureBrushSrcWithPatternFragmentShader = "\n\
- varying highp vec2 brushTextureCoords; \n\
- uniform lowp vec4 patternColor; \n\
- uniform sampler2D brushTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return patternColor * (1.0 - texture2D(brushTexture, brushTextureCoords).r); \n\
- }\n";
-
-// Solid Fill Brush
-static const char* const qglslSolidBrushSrcFragmentShader = "\n\
- uniform lowp vec4 fragmentColor; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return fragmentColor; \n\
- }\n";
-
-static const char* const qglslImageSrcFragmentShader = "\n\
- varying highp vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n"
- "return texture2D(imageTexture, textureCoords); \n"
- "}\n";
-
-static const char* const qglslCustomSrcFragmentShader = "\n\
- varying highp vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return customShader(imageTexture, textureCoords); \n\
- }\n";
-
-static const char* const qglslImageSrcWithPatternFragmentShader = "\n\
- varying highp vec2 textureCoords; \n\
- uniform lowp vec4 patternColor; \n\
- uniform sampler2D imageTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- return patternColor * (1.0 - texture2D(imageTexture, textureCoords).r); \n\
- }\n";
-
-static const char* const qglslNonPremultipliedImageSrcFragmentShader = "\n\
- varying highp vec2 textureCoords; \n\
- uniform sampler2D imageTexture; \n\
- lowp vec4 srcPixel() \n\
- { \n\
- lowp vec4 sample = texture2D(imageTexture, textureCoords); \n\
- sample.rgb = sample.rgb * sample.a; \n\
- return sample; \n\
- }\n";
-
-static const char* const qglslShockingPinkSrcFragmentShader = "\n\
- lowp vec4 srcPixel() \n\
- { \n\
- return vec4(0.98, 0.06, 0.75, 1.0); \n\
- }\n";
-
-static const char* const qglslMainFragmentShader_ImageArrays = "\n\
- varying lowp float opacity; \n\
- lowp vec4 srcPixel(); \n\
- void main() \n\
- { \n\
- gl_FragColor = srcPixel() * opacity; \n\
- }\n";
-
-static const char* const qglslMainFragmentShader_CMO = "\n\
- uniform lowp float globalOpacity; \n\
- lowp vec4 srcPixel(); \n\
- lowp vec4 applyMask(lowp vec4); \n\
- lowp vec4 compose(lowp vec4); \n\
- void main() \n\
- { \n\
- gl_FragColor = applyMask(compose(srcPixel()*globalOpacity))); \n\
- }\n";
-
-static const char* const qglslMainFragmentShader_CM = "\n\
- lowp vec4 srcPixel(); \n\
- lowp vec4 applyMask(lowp vec4); \n\
- lowp vec4 compose(lowp vec4); \n\
- void main() \n\
- { \n\
- gl_FragColor = applyMask(compose(srcPixel())); \n\
- }\n";
-
-static const char* const qglslMainFragmentShader_MO = "\n\
- uniform lowp float globalOpacity; \n\
- lowp vec4 srcPixel(); \n\
- lowp vec4 applyMask(lowp vec4); \n\
- void main() \n\
- { \n\
- gl_FragColor = applyMask(srcPixel()*globalOpacity); \n\
- }\n";
-
-static const char* const qglslMainFragmentShader_M = "\n\
- lowp vec4 srcPixel(); \n\
- lowp vec4 applyMask(lowp vec4); \n\
- void main() \n\
- { \n\
- gl_FragColor = applyMask(srcPixel()); \n\
- }\n";
-
-static const char* const qglslMainFragmentShader_CO = "\n\
- uniform lowp float globalOpacity; \n\
- lowp vec4 srcPixel(); \n\
- lowp vec4 compose(lowp vec4); \n\
- void main() \n\
- { \n\
- gl_FragColor = compose(srcPixel()*globalOpacity); \n\
- }\n";
-
-static const char* const qglslMainFragmentShader_C = "\n\
- lowp vec4 srcPixel(); \n\
- lowp vec4 compose(lowp vec4); \n\
- void main() \n\
- { \n\
- gl_FragColor = compose(srcPixel()); \n\
- }\n";
-
-static const char* const qglslMainFragmentShader_O = "\n\
- uniform lowp float globalOpacity; \n\
- lowp vec4 srcPixel(); \n\
- void main() \n\
- { \n\
- gl_FragColor = srcPixel()*globalOpacity; \n\
- }\n";
-
-static const char* const qglslMainFragmentShader = "\n\
- lowp vec4 srcPixel(); \n\
- void main() \n\
- { \n\
- gl_FragColor = srcPixel(); \n\
- }\n";
-
-static const char* const qglslMaskFragmentShader = "\n\
- varying highp vec2 textureCoords;\n\
- uniform sampler2D maskTexture;\n\
- lowp vec4 applyMask(lowp vec4 src) \n\
- {\n\
- lowp vec4 mask = texture2D(maskTexture, textureCoords); \n\
- return src * mask.a; \n\
- }\n";
-
-// For source over with subpixel antialiasing, the final color is calculated per component as follows
-// (.a is alpha component, .c is red, green or blue component):
-// alpha = src.a * mask.c * opacity
-// dest.c = dest.c * (1 - alpha) + src.c * alpha
-//
-// In the first pass, calculate: dest.c = dest.c * (1 - alpha) with blend funcs: zero, 1 - source color
-// In the second pass, calculate: dest.c = dest.c + src.c * alpha with blend funcs: one, one
-//
-// If source is a solid color (src is constant), only the first pass is needed, with blend funcs: constant, 1 - source color
-
-// For source composition with subpixel antialiasing, the final color is calculated per component as follows:
-// alpha = src.a * mask.c * opacity
-// dest.c = dest.c * (1 - mask.c) + src.c * alpha
-//
-
-static const char* const qglslRgbMaskFragmentShaderPass1 = "\n\
- varying highp vec2 textureCoords;\n\
- uniform sampler2D maskTexture;\n\
- lowp vec4 applyMask(lowp vec4 src) \n\
- { \n\
- lowp vec4 mask = texture2D(maskTexture, textureCoords); \n\
- return src.a * mask; \n\
- }\n";
-
-static const char* const qglslRgbMaskFragmentShaderPass2 = "\n\
- varying highp vec2 textureCoords;\n\
- uniform sampler2D maskTexture;\n\
- lowp vec4 applyMask(lowp vec4 src) \n\
- { \n\
- lowp vec4 mask = texture2D(maskTexture, textureCoords); \n\
- return src * mask; \n\
- }\n";
-
-/*
- Left to implement:
- RgbMaskFragmentShader,
- RgbMaskWithGammaFragmentShader,
-
- MultiplyCompositionModeFragmentShader,
- ScreenCompositionModeFragmentShader,
- OverlayCompositionModeFragmentShader,
- DarkenCompositionModeFragmentShader,
- LightenCompositionModeFragmentShader,
- ColorDodgeCompositionModeFragmentShader,
- ColorBurnCompositionModeFragmentShader,
- HardLightCompositionModeFragmentShader,
- SoftLightCompositionModeFragmentShader,
- DifferenceCompositionModeFragmentShader,
- ExclusionCompositionModeFragmentShader,
-*/
-
-QT_END_NAMESPACE
-
-#endif // GLGC_SHADER_SOURCE_H
diff --git a/src/opengl/gl2paintengineex/qglgradientcache.cpp b/src/opengl/gl2paintengineex/qglgradientcache.cpp
deleted file mode 100644
index fc5e236ca6..0000000000
--- a/src/opengl/gl2paintengineex/qglgradientcache.cpp
+++ /dev/null
@@ -1,225 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qglgradientcache_p.h"
-#include <private/qdrawhelper_p.h>
-#include <private/qgl_p.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qrandom.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGL2GradientCacheWrapper
-{
-public:
- QGL2GradientCache *cacheForContext(const QGLContext *context) {
- QMutexLocker lock(&m_mutex);
- return m_resource.value<QGL2GradientCache>(context->contextHandle());
- }
-
-private:
- QOpenGLMultiGroupSharedResource m_resource;
- QMutex m_mutex;
-};
-
-Q_GLOBAL_STATIC(QGL2GradientCacheWrapper, qt_gradient_caches)
-
-QGL2GradientCache::QGL2GradientCache(QOpenGLContext *ctx)
- : QOpenGLSharedResource(ctx->shareGroup())
-{
-}
-
-QGL2GradientCache::~QGL2GradientCache()
-{
- cache.clear();
-}
-
-QGL2GradientCache *QGL2GradientCache::cacheForContext(const QGLContext *context)
-{
- return qt_gradient_caches()->cacheForContext(context);
-}
-
-void QGL2GradientCache::invalidateResource()
-{
- QMutexLocker lock(&m_mutex);
- cache.clear();
-}
-
-void QGL2GradientCache::freeResource(QOpenGLContext *)
-{
- cleanCache();
-}
-
-void QGL2GradientCache::cleanCache()
-{
- QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
- QMutexLocker lock(&m_mutex);
- QGLGradientColorTableHash::const_iterator it = cache.constBegin();
- for (; it != cache.constEnd(); ++it) {
- const CacheInfo &cache_info = it.value();
- funcs->glDeleteTextures(1, &cache_info.texId);
- }
- cache.clear();
-}
-
-GLuint QGL2GradientCache::getBuffer(const QGradient &gradient, qreal opacity)
-{
- QMutexLocker lock(&m_mutex);
- quint64 hash_val = 0;
-
- const QGradientStops stops = gradient.stops();
- for (int i = 0; i < stops.size() && i <= 2; i++)
- hash_val += stops[i].second.rgba();
-
- QGLGradientColorTableHash::const_iterator it = cache.constFind(hash_val);
-
- if (it == cache.constEnd())
- return addCacheElement(hash_val, gradient, opacity);
- else {
- do {
- const CacheInfo &cache_info = it.value();
- if (cache_info.stops == stops && cache_info.opacity == opacity
- && cache_info.interpolationMode == gradient.interpolationMode())
- {
- return cache_info.texId;
- }
- ++it;
- } while (it != cache.constEnd() && it.key() == hash_val);
- // an exact match for these stops and opacity was not found, create new cache
- return addCacheElement(hash_val, gradient, opacity);
- }
-}
-
-
-GLuint QGL2GradientCache::addCacheElement(quint64 hash_val, const QGradient &gradient, qreal opacity)
-{
- QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
- if (cache.size() == maxCacheSize()) {
- int elem_to_remove = QRandomGenerator::global()->bounded(maxCacheSize());
- quint64 key = cache.keys()[elem_to_remove];
-
- // need to call glDeleteTextures on each removed cache entry:
- QGLGradientColorTableHash::const_iterator it = cache.constFind(key);
- do {
- funcs->glDeleteTextures(1, &it.value().texId);
- } while (++it != cache.constEnd() && it.key() == key);
- cache.remove(key); // may remove more than 1, but OK
- }
-
- CacheInfo cache_entry(gradient.stops(), opacity, gradient.interpolationMode());
- uint buffer[1024];
- generateGradientColorTable(gradient, buffer, paletteSize(), opacity);
- funcs->glGenTextures(1, &cache_entry.texId);
- funcs->glBindTexture(GL_TEXTURE_2D, cache_entry.texId);
- funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, paletteSize(), 1,
- 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
- return cache.insert(hash_val, cache_entry).value().texId;
-}
-
-
-// GL's expects pixels in RGBA (when using GL_RGBA), bin-endian (ABGR on x86).
-// Qt always stores in ARGB reguardless of the byte-order the mancine uses.
-static inline uint qtToGlColor(uint c)
-{
- uint o;
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
- o = (c & 0xff00ff00) // alpha & green already in the right place
- | ((c >> 16) & 0x000000ff) // red
- | ((c << 16) & 0x00ff0000); // blue
-#else //Q_BIG_ENDIAN
- o = (c << 8)
- | ((c >> 24) & 0x000000ff);
-#endif // Q_BYTE_ORDER
- return o;
-}
-
-//TODO: Let GL generate the texture using an FBO
-void QGL2GradientCache::generateGradientColorTable(const QGradient& gradient, uint *colorTable, int size, qreal opacity) const
-{
- int pos = 0;
- const QGradientStops s = gradient.stops();
- bool colorInterpolation = (gradient.interpolationMode() == QGradient::ColorInterpolation);
-
- uint alpha = qRound(opacity * 256);
- // Qt LIES! It returns ARGB (on little-endian AND on big-endian)
- uint current_color = ARGB_COMBINE_ALPHA(s[0].second.rgba(), alpha);
- qreal incr = 1.0 / qreal(size);
- qreal fpos = 1.5 * incr;
- colorTable[pos++] = qtToGlColor(qPremultiply(current_color));
-
- while (fpos <= s.first().first) {
- colorTable[pos] = colorTable[pos - 1];
- pos++;
- fpos += incr;
- }
-
- if (colorInterpolation)
- current_color = qPremultiply(current_color);
-
- const int sLast = s.size() - 1;
- for (int i = 0; i < sLast; ++i) {
- qreal delta = 1/(s[i+1].first - s[i].first);
- uint next_color = ARGB_COMBINE_ALPHA(s[i + 1].second.rgba(), alpha);
- if (colorInterpolation)
- next_color = qPremultiply(next_color);
-
- while (fpos < s[i+1].first && pos < size) {
- int dist = int(256 * ((fpos - s[i].first) * delta));
- int idist = 256 - dist;
- if (colorInterpolation)
- colorTable[pos] = qtToGlColor(INTERPOLATE_PIXEL_256(current_color, idist, next_color, dist));
- else
- colorTable[pos] = qtToGlColor(qPremultiply(INTERPOLATE_PIXEL_256(current_color, idist, next_color, dist)));
- ++pos;
- fpos += incr;
- }
- current_color = next_color;
- }
-
- Q_ASSERT(s.size() > 0);
-
- uint last_color = qtToGlColor(qPremultiply(ARGB_COMBINE_ALPHA(s[sLast].second.rgba(), alpha)));
- for (;pos < size; ++pos)
- colorTable[pos] = last_color;
-
- // Make sure the last color stop is represented at the end of the table
- colorTable[size-1] = last_color;
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/gl2paintengineex/qglgradientcache_p.h b/src/opengl/gl2paintengineex/qglgradientcache_p.h
deleted file mode 100644
index 3c9da982e9..0000000000
--- a/src/opengl/gl2paintengineex/qglgradientcache_p.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLGRADIENTCACHE_P_H
-#define QGLGRADIENTCACHE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QMultiHash>
-#include <QObject>
-#include <QtOpenGL/QtOpenGL>
-#include <private/qgl_p.h>
-#include <QtCore/qmutex.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGL2GradientCache : public QOpenGLSharedResource
-{
- struct CacheInfo
- {
- inline CacheInfo(QGradientStops s, qreal op, QGradient::InterpolationMode mode) :
- stops(s), opacity(op), interpolationMode(mode) {}
-
- GLuint texId;
- QGradientStops stops;
- qreal opacity;
- QGradient::InterpolationMode interpolationMode;
- };
-
- typedef QMultiHash<quint64, CacheInfo> QGLGradientColorTableHash;
-
-public:
- static QGL2GradientCache *cacheForContext(const QGLContext *context);
-
- QGL2GradientCache(QOpenGLContext *);
- ~QGL2GradientCache();
-
- GLuint getBuffer(const QGradient &gradient, qreal opacity);
- inline int paletteSize() const { return 1024; }
-
- void invalidateResource() override;
- void freeResource(QOpenGLContext *ctx) override;
-
-private:
- inline int maxCacheSize() const { return 60; }
- inline void generateGradientColorTable(const QGradient& gradient,
- uint *colorTable,
- int size, qreal opacity) const;
- GLuint addCacheElement(quint64 hash_val, const QGradient &gradient, qreal opacity);
- void cleanCache();
-
- QGLGradientColorTableHash cache;
- QMutex m_mutex;
-};
-
-QT_END_NAMESPACE
-
-#endif // QGLGRADIENTCACHE_P_H
diff --git a/src/opengl/gl2paintengineex/qglshadercache_p.h b/src/opengl/gl2paintengineex/qglshadercache_p.h
deleted file mode 100644
index 4204e3e256..0000000000
--- a/src/opengl/gl2paintengineex/qglshadercache_p.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QGLSHADERCACHE_P_H
-#define QGLSHADERCACHE_P_H
-
-#include <QtCore/qglobal.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QGLShaderProgram;
-class QGLContext;
-
-class CachedShader
-{
-public:
- inline CachedShader(const QByteArray &, const QByteArray &)
- {}
-
- inline bool isCached()
- {
- return false;
- }
-
- inline bool load(QGLShaderProgram *, const QGLContext *)
- {
- return false;
- }
-
- inline bool store(QGLShaderProgram *, const QGLContext *)
- {
- return false;
- }
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
deleted file mode 100644
index 2546f6dc13..0000000000
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
+++ /dev/null
@@ -1,2515 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*
- When the active program changes, we need to update it's uniforms.
- We could track state for each program and only update stale uniforms
- - Could lead to lots of overhead if there's a lot of programs
- We could update all the uniforms when the program changes
- - Could end up updating lots of uniforms which don't need updating
-
- Updating uniforms should be cheap, so the overhead of updating up-to-date
- uniforms should be minimal. It's also less complex.
-
- Things which _may_ cause a different program to be used:
- - Change in brush/pen style
- - Change in painter opacity
- - Change in composition mode
-
- Whenever we set a mode on the shader manager - it needs to tell us if it had
- to switch to a different program.
-
- The shader manager should only switch when we tell it to. E.g. if we set a new
- brush style and then switch to transparent painter, we only want it to compile
- and use the correct program when we really need it.
-*/
-
-// #define QT_OPENGL_CACHE_AS_VBOS
-
-#include "qglgradientcache_p.h"
-#include "qpaintengineex_opengl2_p.h"
-
-#include <string.h> //for memcpy
-#include <qmath.h>
-
-#include <private/qgl_p.h>
-#include <private/qpaintengineex_p.h>
-#include <QPaintEngine>
-#include <private/qpainter_p.h>
-#include <private/qfontengine_p.h>
-#include <private/qdatabuffer_p.h>
-#include <private/qstatictext_p.h>
-#include <QtGui/private/qtriangulator_p.h>
-
-#include "qglengineshadermanager_p.h"
-#include "qgl2pexvertexarray_p.h"
-#include "qtextureglyphcache_gl_p.h"
-
-#include <QDebug>
-
-#ifndef QT_OPENGL_ES_2
-# include <qopenglfunctions_1_1.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-
-
-Q_GUI_EXPORT QImage qt_imageForBrush(int brushStyle, bool invert);
-
-////////////////////////////////// Private Methods //////////////////////////////////////////
-
-QGL2PaintEngineExPrivate::~QGL2PaintEngineExPrivate()
-{
- delete shaderManager;
-
- while (pathCaches.size()) {
- QVectorPath::CacheEntry *e = *(pathCaches.constBegin());
- e->cleanup(e->engine, e->data);
- e->data = 0;
- e->engine = 0;
- }
-
- if (elementIndicesVBOId != 0) {
- glDeleteBuffers(1, &elementIndicesVBOId);
- elementIndicesVBOId = 0;
- }
-}
-
-void QGL2PaintEngineExPrivate::updateTextureFilter(GLenum target, GLenum wrapMode, bool smoothPixmapTransform, GLuint id)
-{
-// glActiveTexture(GL_TEXTURE0 + QT_BRUSH_TEXTURE_UNIT); //### Is it always this texture unit?
- if (id != GLuint(-1) && id == lastTextureUsed)
- return;
-
- lastTextureUsed = id;
-
- if (smoothPixmapTransform) {
- glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- } else {
- glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- }
- glTexParameteri(target, GL_TEXTURE_WRAP_S, wrapMode);
- glTexParameteri(target, GL_TEXTURE_WRAP_T, wrapMode);
-}
-
-
-inline QColor qt_premultiplyColor(QColor c, GLfloat opacity)
-{
- qreal alpha = c.alphaF() * opacity;
- c.setAlphaF(alpha);
- c.setRedF(c.redF() * alpha);
- c.setGreenF(c.greenF() * alpha);
- c.setBlueF(c.blueF() * alpha);
- return c;
-}
-
-
-void QGL2PaintEngineExPrivate::setBrush(const QBrush& brush)
-{
- if (qbrush_fast_equals(currentBrush, brush))
- return;
-
- const Qt::BrushStyle newStyle = qbrush_style(brush);
- Q_ASSERT(newStyle != Qt::NoBrush);
-
- currentBrush = brush;
- if (!currentBrushPixmap.isNull())
- currentBrushPixmap = QPixmap();
- brushUniformsDirty = true; // All brushes have at least one uniform
-
- if (newStyle > Qt::SolidPattern)
- brushTextureDirty = true;
-
- if (currentBrush.style() == Qt::TexturePattern
- && qHasPixmapTexture(brush) && brush.texture().isQBitmap())
- {
- shaderManager->setSrcPixelType(QGLEngineShaderManager::TextureSrcWithPattern);
- } else {
- shaderManager->setSrcPixelType(newStyle);
- }
- shaderManager->optimiseForBrushTransform(currentBrush.transform().type());
-}
-
-
-void QGL2PaintEngineExPrivate::useSimpleShader()
-{
- shaderManager->useSimpleProgram();
-
- if (matrixDirty)
- updateMatrix();
-}
-
-// ####TODO Properly #ifdef this class to use #define symbols actually defined
-// by OpenGL/ES includes
-#ifndef GL_MIRRORED_REPEAT_IBM
-#define GL_MIRRORED_REPEAT_IBM 0x8370
-#endif
-
-void QGL2PaintEngineExPrivate::updateBrushTexture()
-{
- Q_Q(QGL2PaintEngineEx);
-// qDebug("QGL2PaintEngineExPrivate::updateBrushTexture()");
- Qt::BrushStyle style = currentBrush.style();
-
- if ( (style >= Qt::Dense1Pattern) && (style <= Qt::DiagCrossPattern) ) {
- // Get the image data for the pattern
- QImage texImage = qt_imageForBrush(style, false);
-
- glActiveTexture(GL_TEXTURE0 + QT_BRUSH_TEXTURE_UNIT);
- ctx->d_func()->bindTexture(texImage, GL_TEXTURE_2D, GL_RGBA, QGLContext::InternalBindOption);
- updateTextureFilter(GL_TEXTURE_2D, GL_REPEAT, q->state()->renderHints & QPainter::SmoothPixmapTransform);
- }
- else if (style >= Qt::LinearGradientPattern && style <= Qt::ConicalGradientPattern) {
- // Gradiant brush: All the gradiants use the same texture
-
- const QGradient* g = currentBrush.gradient();
-
- // We apply global opacity in the fragment shaders, so we always pass 1.0
- // for opacity to the cache.
- GLuint texId = QGL2GradientCache::cacheForContext(ctx)->getBuffer(*g, 1.0);
-
- glActiveTexture(GL_TEXTURE0 + QT_BRUSH_TEXTURE_UNIT);
- glBindTexture(GL_TEXTURE_2D, texId);
-
- if (g->spread() == QGradient::RepeatSpread || g->type() == QGradient::ConicalGradient)
- updateTextureFilter(GL_TEXTURE_2D, GL_REPEAT, q->state()->renderHints & QPainter::SmoothPixmapTransform);
- else if (g->spread() == QGradient::ReflectSpread)
- updateTextureFilter(GL_TEXTURE_2D, GL_MIRRORED_REPEAT_IBM, q->state()->renderHints & QPainter::SmoothPixmapTransform);
- else
- updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE, q->state()->renderHints & QPainter::SmoothPixmapTransform);
- }
- else if (style == Qt::TexturePattern) {
- currentBrushPixmap = currentBrush.texture();
-
- int max_texture_size = ctx->d_func()->maxTextureSize();
- if (currentBrushPixmap.width() > max_texture_size || currentBrushPixmap.height() > max_texture_size)
- currentBrushPixmap = currentBrushPixmap.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
-
- GLuint wrapMode = GL_REPEAT;
- if (ctx->contextHandle()->isOpenGLES()) {
- // OpenGL ES does not support GL_REPEAT wrap modes for NPOT textures. So instead,
- // we emulate GL_REPEAT by only taking the fractional part of the texture coords
- // in the qopenglslTextureBrushSrcFragmentShader program.
- wrapMode = GL_CLAMP_TO_EDGE;
- }
-
- glActiveTexture(GL_TEXTURE0 + QT_BRUSH_TEXTURE_UNIT);
- QGLTexture *tex = ctx->d_func()->bindTexture(currentBrushPixmap, GL_TEXTURE_2D, GL_RGBA,
- QGLContext::InternalBindOption |
- QGLContext::CanFlipNativePixmapBindOption);
- updateTextureFilter(GL_TEXTURE_2D, wrapMode, q->state()->renderHints & QPainter::SmoothPixmapTransform);
- textureInvertedY = tex->options & QGLContext::InvertedYBindOption ? -1 : 1;
- }
- brushTextureDirty = false;
-}
-
-
-void QGL2PaintEngineExPrivate::updateBrushUniforms()
-{
-// qDebug("QGL2PaintEngineExPrivate::updateBrushUniforms()");
- Qt::BrushStyle style = currentBrush.style();
-
- if (style == Qt::NoBrush)
- return;
-
- QTransform brushQTransform = currentBrush.transform();
-
- if (style == Qt::SolidPattern) {
- QColor col = qt_premultiplyColor(currentBrush.color(), (GLfloat)q->state()->opacity);
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::FragmentColor), col);
- }
- else {
- // All other brushes have a transform and thus need the translation point:
- QPointF translationPoint;
-
- if (style <= Qt::DiagCrossPattern) {
- QColor col = qt_premultiplyColor(currentBrush.color(), (GLfloat)q->state()->opacity);
-
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::PatternColor), col);
-
- QVector2D halfViewportSize(width*0.5, height*0.5);
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::HalfViewportSize), halfViewportSize);
- }
- else if (style == Qt::LinearGradientPattern) {
- const QLinearGradient *g = static_cast<const QLinearGradient *>(currentBrush.gradient());
-
- QPointF realStart = g->start();
- QPointF realFinal = g->finalStop();
- translationPoint = realStart;
-
- QPointF l = realFinal - realStart;
-
- QVector3D linearData(
- l.x(),
- l.y(),
- 1.0f / (l.x() * l.x() + l.y() * l.y())
- );
-
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::LinearData), linearData);
-
- QVector2D halfViewportSize(width*0.5, height*0.5);
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::HalfViewportSize), halfViewportSize);
- }
- else if (style == Qt::ConicalGradientPattern) {
- const QConicalGradient *g = static_cast<const QConicalGradient *>(currentBrush.gradient());
- translationPoint = g->center();
-
- GLfloat angle = -qDegreesToRadians(g->angle());
-
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::Angle), angle);
-
- QVector2D halfViewportSize(width*0.5, height*0.5);
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::HalfViewportSize), halfViewportSize);
- }
- else if (style == Qt::RadialGradientPattern) {
- const QRadialGradient *g = static_cast<const QRadialGradient *>(currentBrush.gradient());
- QPointF realCenter = g->center();
- QPointF realFocal = g->focalPoint();
- qreal realRadius = g->centerRadius() - g->focalRadius();
- translationPoint = realFocal;
-
- QPointF fmp = realCenter - realFocal;
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::Fmp), fmp);
-
- GLfloat fmp2_m_radius2 = -fmp.x() * fmp.x() - fmp.y() * fmp.y() + realRadius*realRadius;
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::Fmp2MRadius2), fmp2_m_radius2);
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::Inverse2Fmp2MRadius2),
- GLfloat(1.0 / (2.0*fmp2_m_radius2)));
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::SqrFr),
- GLfloat(g->focalRadius() * g->focalRadius()));
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::BRadius),
- GLfloat(2 * (g->centerRadius() - g->focalRadius()) * g->focalRadius()),
- g->focalRadius(),
- g->centerRadius() - g->focalRadius());
-
- QVector2D halfViewportSize(width*0.5, height*0.5);
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::HalfViewportSize), halfViewportSize);
- }
- else if (style == Qt::TexturePattern) {
- const QPixmap& texPixmap = currentBrush.texture();
-
- if (qHasPixmapTexture(currentBrush) && currentBrush.texture().isQBitmap()) {
- QColor col = qt_premultiplyColor(currentBrush.color(), (GLfloat)q->state()->opacity);
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::PatternColor), col);
- }
-
- QSizeF invertedTextureSize(1.0 / texPixmap.width(), 1.0 / texPixmap.height());
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::InvertedTextureSize), invertedTextureSize);
-
- QVector2D halfViewportSize(width*0.5, height*0.5);
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::HalfViewportSize), halfViewportSize);
- }
- else
- qWarning("QGL2PaintEngineEx: Unimplemented fill style");
-
- const QPointF &brushOrigin = q->state()->brushOrigin;
- QTransform matrix = q->state()->matrix;
- matrix.translate(brushOrigin.x(), brushOrigin.y());
-
- QTransform translate(1, 0, 0, 1, -translationPoint.x(), -translationPoint.y());
- qreal m22 = -1;
- qreal dy = height;
- if (device->isFlipped()) {
- m22 = 1;
- dy = 0;
- }
- QTransform gl_to_qt(1, 0, 0, m22, 0, dy);
- QTransform inv_matrix;
- if (style == Qt::TexturePattern && textureInvertedY == -1)
- inv_matrix = gl_to_qt * (QTransform(1, 0, 0, -1, 0, currentBrush.texture().height()) * brushQTransform * matrix).inverted() * translate;
- else
- inv_matrix = gl_to_qt * (brushQTransform * matrix).inverted() * translate;
-
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::BrushTransform), inv_matrix);
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::BrushTexture), QT_BRUSH_TEXTURE_UNIT);
- }
- brushUniformsDirty = false;
-}
-
-
-// This assumes the shader manager has already setup the correct shader program
-void QGL2PaintEngineExPrivate::updateMatrix()
-{
-// qDebug("QGL2PaintEngineExPrivate::updateMatrix()");
-
- const QTransform& transform = q->state()->matrix;
-
- // The projection matrix converts from Qt's coordinate system to GL's coordinate system
- // * GL's viewport is 2x2, Qt's is width x height
- // * GL has +y -> -y going from bottom -> top, Qt is the other way round
- // * GL has [0,0] in the center, Qt has it in the top-left
- //
- // This results in the Projection matrix below, which is multiplied by the painter's
- // transformation matrix, as shown below:
- //
- // Projection Matrix Painter Transform
- // ------------------------------------------------ ------------------------
- // | 2.0 / width | 0.0 | -1.0 | | m11 | m21 | dx |
- // | 0.0 | -2.0 / height | 1.0 | * | m12 | m22 | dy |
- // | 0.0 | 0.0 | 1.0 | | m13 | m23 | m33 |
- // ------------------------------------------------ ------------------------
- //
- // NOTE: The resultant matrix is also transposed, as GL expects column-major matracies
-
- const GLfloat wfactor = 2.0f / width;
- GLfloat hfactor = -2.0f / height;
-
- GLfloat dx = transform.dx();
- GLfloat dy = transform.dy();
-
- if (device->isFlipped()) {
- hfactor *= -1;
- dy -= height;
- }
-
- // Non-integer translates can have strange effects for some rendering operations such as
- // anti-aliased text rendering. In such cases, we snap the translate to the pixel grid.
- if (snapToPixelGrid && transform.type() == QTransform::TxTranslate) {
- // 0.50 needs to rounded down to 0.0 for consistency with raster engine:
- dx = std::ceil(dx - 0.5f);
- dy = std::ceil(dy - 0.5f);
- }
- pmvMatrix[0][0] = (wfactor * transform.m11()) - transform.m13();
- pmvMatrix[1][0] = (wfactor * transform.m21()) - transform.m23();
- pmvMatrix[2][0] = (wfactor * dx) - transform.m33();
- pmvMatrix[0][1] = (hfactor * transform.m12()) + transform.m13();
- pmvMatrix[1][1] = (hfactor * transform.m22()) + transform.m23();
- pmvMatrix[2][1] = (hfactor * dy) + transform.m33();
- pmvMatrix[0][2] = transform.m13();
- pmvMatrix[1][2] = transform.m23();
- pmvMatrix[2][2] = transform.m33();
-
- // 1/10000 == 0.0001, so we have good enough res to cover curves
- // that span the entire widget...
- inverseScale = qMax(1 / qMax( qMax(qAbs(transform.m11()), qAbs(transform.m22())),
- qMax(qAbs(transform.m12()), qAbs(transform.m21())) ),
- qreal(0.0001));
-
- matrixDirty = false;
- matrixUniformDirty = true;
-
- // Set the PMV matrix attribute. As we use an attributes rather than uniforms, we only
- // need to do this once for every matrix change and persists across all shader programs.
- glVertexAttrib3fv(QT_PMV_MATRIX_1_ATTR, pmvMatrix[0]);
- glVertexAttrib3fv(QT_PMV_MATRIX_2_ATTR, pmvMatrix[1]);
- glVertexAttrib3fv(QT_PMV_MATRIX_3_ATTR, pmvMatrix[2]);
-
- dasher.setInvScale(inverseScale);
- stroker.setInvScale(inverseScale);
-}
-
-
-void QGL2PaintEngineExPrivate::updateCompositionMode()
-{
- // NOTE: The entire paint engine works on pre-multiplied data - which is why some of these
- // composition modes look odd.
-// qDebug() << "QGL2PaintEngineExPrivate::updateCompositionMode() - Setting GL composition mode for " << q->state()->composition_mode;
- switch(q->state()->composition_mode) {
- case QPainter::CompositionMode_SourceOver:
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_DestinationOver:
- glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE);
- break;
- case QPainter::CompositionMode_Clear:
- glBlendFunc(GL_ZERO, GL_ZERO);
- break;
- case QPainter::CompositionMode_Source:
- glBlendFunc(GL_ONE, GL_ZERO);
- break;
- case QPainter::CompositionMode_Destination:
- glBlendFunc(GL_ZERO, GL_ONE);
- break;
- case QPainter::CompositionMode_SourceIn:
- glBlendFunc(GL_DST_ALPHA, GL_ZERO);
- break;
- case QPainter::CompositionMode_DestinationIn:
- glBlendFunc(GL_ZERO, GL_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_SourceOut:
- glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ZERO);
- break;
- case QPainter::CompositionMode_DestinationOut:
- glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_SourceAtop:
- glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_DestinationAtop:
- glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_Xor:
- glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- break;
- case QPainter::CompositionMode_Plus:
- glBlendFunc(GL_ONE, GL_ONE);
- break;
- default:
- qWarning("Unsupported composition mode");
- break;
- }
-
- compositionModeDirty = false;
-}
-
-static inline void setCoords(GLfloat *coords, const QGLRect &rect)
-{
- coords[0] = rect.left;
- coords[1] = rect.top;
- coords[2] = rect.right;
- coords[3] = rect.top;
- coords[4] = rect.right;
- coords[5] = rect.bottom;
- coords[6] = rect.left;
- coords[7] = rect.bottom;
-}
-
-void QGL2PaintEngineExPrivate::drawTexture(const QGLRect& dest, const QGLRect& src, const QSize &textureSize, bool opaque, bool pattern)
-{
- // Setup for texture drawing
- currentBrush = noBrush;
- shaderManager->setSrcPixelType(pattern ? QGLEngineShaderManager::PatternSrc : QGLEngineShaderManager::ImageSrc);
-
- if (snapToPixelGrid) {
- snapToPixelGrid = false;
- matrixDirty = true;
- }
-
- if (prepareForDraw(opaque))
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::ImageTexture), QT_IMAGE_TEXTURE_UNIT);
-
- if (pattern) {
- QColor col = qt_premultiplyColor(q->state()->pen.color(), (GLfloat)q->state()->opacity);
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::PatternColor), col);
- }
-
- GLfloat dx = 1.0 / textureSize.width();
- GLfloat dy = 1.0 / textureSize.height();
-
- QGLRect srcTextureRect(src.left*dx, src.top*dy, src.right*dx, src.bottom*dy);
-
- setCoords(staticVertexCoordinateArray, dest);
- setCoords(staticTextureCoordinateArray, srcTextureRect);
-
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-}
-
-void QGL2PaintEngineEx::beginNativePainting()
-{
- Q_D(QGL2PaintEngineEx);
- ensureActive();
- d->transferMode(BrushDrawingMode);
-
- d->nativePaintingActive = true;
-
- d->glUseProgram(0);
-
- // Disable all the vertex attribute arrays:
- for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i)
- d->glDisableVertexAttribArray(i);
-
-#ifndef QT_OPENGL_ES_2
- if (!d->ctx->contextHandle()->isOpenGLES()) {
- const QGLContext *ctx = d->ctx;
- const QGLFormat &fmt = d->device->format();
- if (fmt.majorVersion() < 3 || (fmt.majorVersion() == 3 && fmt.minorVersion() < 1)
- || (fmt.majorVersion() == 3 && fmt.minorVersion() == 1 && ctx->contextHandle()->hasExtension(QByteArrayLiteral("GL_ARB_compatibility")))
- || fmt.profile() == QGLFormat::CompatibilityProfile)
- {
- // be nice to people who mix OpenGL 1.x code with QPainter commands
- // by setting modelview and projection matrices to mirror the GL 1
- // paint engine
- const QTransform& mtx = state()->matrix;
-
- float mv_matrix[4][4] =
- {
- { float(mtx.m11()), float(mtx.m12()), 0, float(mtx.m13()) },
- { float(mtx.m21()), float(mtx.m22()), 0, float(mtx.m23()) },
- { 0, 0, 1, 0 },
- { float(mtx.dx()), float(mtx.dy()), 0, float(mtx.m33()) }
- };
-
- const QSize sz = d->device->size();
-
- QOpenGLFunctions_1_1 *gl1funcs = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_1_1>();
- gl1funcs->initializeOpenGLFunctions();
-
- gl1funcs->glMatrixMode(GL_PROJECTION);
- gl1funcs->glLoadIdentity();
- gl1funcs->glOrtho(0, sz.width(), sz.height(), 0, -999999, 999999);
-
- gl1funcs->glMatrixMode(GL_MODELVIEW);
- gl1funcs->glLoadMatrixf(&mv_matrix[0][0]);
- }
- }
-#endif
-
- d->lastTextureUsed = GLuint(-1);
- d->dirtyStencilRegion = QRect(0, 0, d->width, d->height);
- d->resetGLState();
-
- d->shaderManager->setDirty();
-
- d->needsSync = true;
-}
-
-void QGL2PaintEngineExPrivate::resetGLState()
-{
- glDisable(GL_BLEND);
- glActiveTexture(GL_TEXTURE0);
- glDisable(GL_STENCIL_TEST);
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_SCISSOR_TEST);
- glDepthMask(true);
- glDepthFunc(GL_LESS);
- glClearDepthf(1);
- glStencilMask(0xff);
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- glStencilFunc(GL_ALWAYS, 0, 0xff);
- ctx->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, false);
- ctx->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, false);
- ctx->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false);
-#ifndef QT_OPENGL_ES_2
- if (!ctx->contextHandle()->isOpenGLES()) {
- // gl_Color, corresponding to vertex attribute 3, may have been changed
- float color[] = { 1.0f, 1.0f, 1.0f, 1.0f };
- glVertexAttrib4fv(3, color);
- }
-#endif
-}
-
-bool QGL2PaintEngineExPrivate::resetOpenGLContextActiveEngine()
-{
- QOpenGLContext *guiGlContext = ctx->contextHandle();
- QOpenGLContextPrivate *guiGlContextPrivate =
- guiGlContext ? QOpenGLContextPrivate::get(guiGlContext) : 0;
-
- if (guiGlContextPrivate && guiGlContextPrivate->active_engine) {
- ctx->d_func()->refreshCurrentFbo();
- guiGlContextPrivate->active_engine = 0;
- return true;
- }
-
- return false;
-}
-
-void QGL2PaintEngineEx::endNativePainting()
-{
- Q_D(QGL2PaintEngineEx);
- d->needsSync = true;
- d->nativePaintingActive = false;
-}
-
-void QGL2PaintEngineEx::invalidateState()
-{
- Q_D(QGL2PaintEngineEx);
- d->needsSync = true;
-}
-
-bool QGL2PaintEngineEx::isNativePaintingActive() const {
- Q_D(const QGL2PaintEngineEx);
- return d->nativePaintingActive;
-}
-
-bool QGL2PaintEngineEx::shouldDrawCachedGlyphs(QFontEngine *fontEngine, const QTransform &t) const
-{
- // The paint engine does not support projected cached glyph drawing
- if (t.type() == QTransform::TxProject)
- return false;
-
- // The font engine might not support filling the glyph cache
- // with the given transform applied, in which case we need to
- // fall back to the QPainterPath code-path.
- if (!fontEngine->supportsTransformation(t)) {
- // Except that drawing paths is slow, so for scales between
- // 0.5 and 2.0 we leave the glyph cache untransformed and deal
- // with the transform ourselves when painting, resulting in
- // drawing 1x cached glyphs with a smooth-scale.
- float det = t.determinant();
- if (det >= 0.25f && det <= 4.f) {
- // Assuming the baseclass still agrees
- return QPaintEngineEx::shouldDrawCachedGlyphs(fontEngine, t);
- }
-
- return false; // Fall back to path-drawing
- }
-
- return QPaintEngineEx::shouldDrawCachedGlyphs(fontEngine, t);
-}
-
-void QGL2PaintEngineExPrivate::transferMode(EngineMode newMode)
-{
- if (newMode == mode)
- return;
-
- if (mode == TextDrawingMode || mode == ImageDrawingMode || mode == ImageArrayDrawingMode) {
- lastTextureUsed = GLuint(-1);
- }
-
- if (newMode == TextDrawingMode) {
- shaderManager->setHasComplexGeometry(true);
- } else {
- shaderManager->setHasComplexGeometry(false);
- }
-
- if (newMode == ImageDrawingMode) {
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, staticVertexCoordinateArray);
- setVertexAttributePointer(QT_TEXTURE_COORDS_ATTR, staticTextureCoordinateArray);
- }
-
- if (newMode == ImageArrayDrawingMode) {
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, (GLfloat*)vertexCoordinateArray.data());
- setVertexAttributePointer(QT_TEXTURE_COORDS_ATTR, (GLfloat*)textureCoordinateArray.data());
- setVertexAttributePointer(QT_OPACITY_ATTR, (GLfloat*)opacityArray.data());
- }
-
- // This needs to change when we implement high-quality anti-aliasing...
- if (newMode != TextDrawingMode)
- shaderManager->setMaskType(QGLEngineShaderManager::NoMask);
-
- mode = newMode;
-}
-
-struct QGL2PEVectorPathCache
-{
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- GLuint vbo;
- GLuint ibo;
-#else
- float *vertices;
- void *indices;
-#endif
- int vertexCount;
- int indexCount;
- GLenum primitiveType;
- qreal iscale;
- QVertexIndexVector::Type indexType;
-};
-
-void QGL2PaintEngineExPrivate::cleanupVectorPath(QPaintEngineEx *engine, void *data)
-{
- QGL2PEVectorPathCache *c = (QGL2PEVectorPathCache *) data;
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- Q_ASSERT(engine->type() == QPaintEngine::OpenGL2);
- static_cast<QGL2PaintEngineEx *>(engine)->d_func()->unusedVBOSToClean << c->vbo;
- if (c->ibo)
- d->unusedIBOSToClean << c->ibo;
-#else
- Q_UNUSED(engine);
- free(c->vertices);
- free(c->indices);
-#endif
- delete c;
-}
-
-// Assumes everything is configured for the brush you want to use
-void QGL2PaintEngineExPrivate::fill(const QVectorPath& path)
-{
- transferMode(BrushDrawingMode);
-
- if (snapToPixelGrid) {
- snapToPixelGrid = false;
- matrixDirty = true;
- }
-
- // Might need to call updateMatrix to re-calculate inverseScale
- if (matrixDirty)
- updateMatrix();
-
- const QPointF* const points = reinterpret_cast<const QPointF*>(path.points());
-
- // Check to see if there's any hints
- if (path.shape() == QVectorPath::RectangleHint) {
- QGLRect rect(points[0].x(), points[0].y(), points[2].x(), points[2].y());
- prepareForDraw(currentBrush.isOpaque());
- composite(rect);
- } else if (path.isConvex()) {
-
- if (path.isCacheable()) {
- QVectorPath::CacheEntry *data = path.lookupCacheData(q);
- QGL2PEVectorPathCache *cache;
-
- bool updateCache = false;
-
- if (data) {
- cache = (QGL2PEVectorPathCache *) data->data;
- // Check if scale factor is exceeded for curved paths and generate curves if so...
- if (path.isCurved()) {
- qreal scaleFactor = cache->iscale / inverseScale;
- if (scaleFactor < 0.5 || scaleFactor > 2.0) {
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- glDeleteBuffers(1, &cache->vbo);
- cache->vbo = 0;
- Q_ASSERT(cache->ibo == 0);
-#else
- free(cache->vertices);
- Q_ASSERT(cache->indices == 0);
-#endif
- updateCache = true;
- }
- }
- } else {
- cache = new QGL2PEVectorPathCache;
- data = const_cast<QVectorPath &>(path).addCacheData(q, cache, cleanupVectorPath);
- updateCache = true;
- }
-
- // Flatten the path at the current scale factor and fill it into the cache struct.
- if (updateCache) {
- vertexCoordinateArray.clear();
- vertexCoordinateArray.addPath(path, inverseScale, false);
- int vertexCount = vertexCoordinateArray.vertexCount();
- int floatSizeInBytes = vertexCount * 2 * sizeof(float);
- cache->vertexCount = vertexCount;
- cache->indexCount = 0;
- cache->primitiveType = GL_TRIANGLE_FAN;
- cache->iscale = inverseScale;
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- glGenBuffers(1, &cache->vbo);
- glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
- glBufferData(GL_ARRAY_BUFFER, floatSizeInBytes, vertexCoordinateArray.data(), GL_STATIC_DRAW);
- cache->ibo = 0;
-#else
- cache->vertices = (float *) malloc(floatSizeInBytes);
- memcpy(cache->vertices, vertexCoordinateArray.data(), floatSizeInBytes);
- cache->indices = 0;
-#endif
- }
-
- prepareForDraw(currentBrush.isOpaque());
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, 0);
-#else
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, cache->vertices);
-#endif
- glDrawArrays(cache->primitiveType, 0, cache->vertexCount);
-
- } else {
- // printf(" - Marking path as cachable...\n");
- // Tag it for later so that if the same path is drawn twice, it is assumed to be static and thus cachable
- path.makeCacheable();
- vertexCoordinateArray.clear();
- vertexCoordinateArray.addPath(path, inverseScale, false);
- prepareForDraw(currentBrush.isOpaque());
- drawVertexArrays(vertexCoordinateArray, GL_TRIANGLE_FAN);
- }
-
- } else {
- bool useCache = path.isCacheable();
- if (useCache) {
- QRectF bbox = path.controlPointRect();
- // If the path doesn't fit within these limits, it is possible that the triangulation will fail.
- useCache &= (bbox.left() > -0x8000 * inverseScale)
- && (bbox.right() < 0x8000 * inverseScale)
- && (bbox.top() > -0x8000 * inverseScale)
- && (bbox.bottom() < 0x8000 * inverseScale);
- }
-
- if (useCache) {
- QVectorPath::CacheEntry *data = path.lookupCacheData(q);
- QGL2PEVectorPathCache *cache;
-
- bool updateCache = false;
-
- if (data) {
- cache = (QGL2PEVectorPathCache *) data->data;
- // Check if scale factor is exceeded for curved paths and generate curves if so...
- if (path.isCurved()) {
- qreal scaleFactor = cache->iscale / inverseScale;
- if (scaleFactor < 0.5 || scaleFactor > 2.0) {
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- glDeleteBuffers(1, &cache->vbo);
- glDeleteBuffers(1, &cache->ibo);
-#else
- free(cache->vertices);
- free(cache->indices);
-#endif
- updateCache = true;
- }
- }
- } else {
- cache = new QGL2PEVectorPathCache;
- data = const_cast<QVectorPath &>(path).addCacheData(q, cache, cleanupVectorPath);
- updateCache = true;
- }
-
- // Flatten the path at the current scale factor and fill it into the cache struct.
- if (updateCache) {
- QTriangleSet polys = qTriangulate(path, QTransform().scale(1 / inverseScale, 1 / inverseScale));
- cache->vertexCount = polys.vertices.size() / 2;
- cache->indexCount = polys.indices.size();
- cache->primitiveType = GL_TRIANGLES;
- cache->iscale = inverseScale;
- cache->indexType = polys.indices.type();
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- glGenBuffers(1, &cache->vbo);
- glGenBuffers(1, &cache->ibo);
- glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo);
-
- if (polys.indices.type() == QVertexIndexVector::UnsignedInt)
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint32) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW);
- else
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint16) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW);
-
- QVarLengthArray<float> vertices(polys.vertices.size());
- for (int i = 0; i < polys.vertices.size(); ++i)
- vertices[i] = float(inverseScale * polys.vertices.at(i));
- glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(), vertices.data(), GL_STATIC_DRAW);
-#else
- cache->vertices = (float *) malloc(sizeof(float) * polys.vertices.size());
- if (polys.indices.type() == QVertexIndexVector::UnsignedInt) {
- cache->indices = (quint32 *) malloc(sizeof(quint32) * polys.indices.size());
- memcpy(cache->indices, polys.indices.data(), sizeof(quint32) * polys.indices.size());
- } else {
- cache->indices = (quint16 *) malloc(sizeof(quint16) * polys.indices.size());
- memcpy(cache->indices, polys.indices.data(), sizeof(quint16) * polys.indices.size());
- }
- for (int i = 0; i < polys.vertices.size(); ++i)
- cache->vertices[i] = float(inverseScale * polys.vertices.at(i));
-#endif
- }
-
- prepareForDraw(currentBrush.isOpaque());
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo);
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, 0);
- if (cache->indexType == QVertexIndexVector::UnsignedInt)
- glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, 0);
- else
- glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, 0);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
-#else
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, cache->vertices);
- if (cache->indexType == QVertexIndexVector::UnsignedInt)
- glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, (qint32 *)cache->indices);
- else
- glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, (qint16 *)cache->indices);
-#endif
-
- } else {
- // printf(" - Marking path as cachable...\n");
- // Tag it for later so that if the same path is drawn twice, it is assumed to be static and thus cachable
- path.makeCacheable();
-
- if (!device->format().stencil()) {
- // If there is no stencil buffer, triangulate the path instead.
-
- QRectF bbox = path.controlPointRect();
- // If the path doesn't fit within these limits, it is possible that the triangulation will fail.
- bool withinLimits = (bbox.left() > -0x8000 * inverseScale)
- && (bbox.right() < 0x8000 * inverseScale)
- && (bbox.top() > -0x8000 * inverseScale)
- && (bbox.bottom() < 0x8000 * inverseScale);
- if (withinLimits) {
- QTriangleSet polys = qTriangulate(path, QTransform().scale(1 / inverseScale, 1 / inverseScale));
-
- QVarLengthArray<float> vertices(polys.vertices.size());
- for (int i = 0; i < polys.vertices.size(); ++i)
- vertices[i] = float(inverseScale * polys.vertices.at(i));
-
- prepareForDraw(currentBrush.isOpaque());
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, vertices.constData());
- if (polys.indices.type() == QVertexIndexVector::UnsignedInt)
- glDrawElements(GL_TRIANGLES, polys.indices.size(), GL_UNSIGNED_INT, polys.indices.data());
- else
- glDrawElements(GL_TRIANGLES, polys.indices.size(), GL_UNSIGNED_SHORT, polys.indices.data());
- } else {
- // We can't handle big, concave painter paths with OpenGL without stencil buffer.
- qWarning("Painter path exceeds +/-32767 pixels.");
- }
- return;
- }
-
- // The path is too complicated & needs the stencil technique
- vertexCoordinateArray.clear();
- vertexCoordinateArray.addPath(path, inverseScale, false);
-
- fillStencilWithVertexArray(vertexCoordinateArray, path.hasWindingFill());
-
- glStencilMask(0xff);
- glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
-
- if (q->state()->clipTestEnabled) {
- // Pass when high bit is set, replace stencil value with current clip
- glStencilFunc(GL_NOTEQUAL, q->state()->currentClip, GL_STENCIL_HIGH_BIT);
- } else if (path.hasWindingFill()) {
- // Pass when any bit is set, replace stencil value with 0
- glStencilFunc(GL_NOTEQUAL, 0, 0xff);
- } else {
- // Pass when high bit is set, replace stencil value with 0
- glStencilFunc(GL_NOTEQUAL, 0, GL_STENCIL_HIGH_BIT);
- }
- prepareForDraw(currentBrush.isOpaque());
-
- // Stencil the brush onto the dest buffer
- composite(vertexCoordinateArray.boundingRect());
- glStencilMask(0);
- updateClipScissorTest();
- }
- }
-}
-
-
-void QGL2PaintEngineExPrivate::fillStencilWithVertexArray(const float *data,
- int count,
- int *stops,
- int stopCount,
- const QGLRect &bounds,
- StencilFillMode mode)
-{
- Q_ASSERT(count || stops);
-
-// qDebug("QGL2PaintEngineExPrivate::fillStencilWithVertexArray()");
- glStencilMask(0xff); // Enable stencil writes
-
- if (dirtyStencilRegion.intersects(currentScissorBounds)) {
- const QRegion clearRegion = dirtyStencilRegion.intersected(currentScissorBounds);
- glClearStencil(0); // Clear to zero
- for (const QRect &rect : clearRegion) {
-#ifndef QT_GL_NO_SCISSOR_TEST
- setScissor(rect);
-#endif
- glClear(GL_STENCIL_BUFFER_BIT);
- }
-
- dirtyStencilRegion -= currentScissorBounds;
-
-#ifndef QT_GL_NO_SCISSOR_TEST
- updateClipScissorTest();
-#endif
- }
-
- glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // Disable color writes
- useSimpleShader();
- glEnable(GL_STENCIL_TEST); // For some reason, this has to happen _after_ the simple shader is use()'d
-
- if (mode == WindingFillMode) {
- Q_ASSERT(stops && !count);
- if (q->state()->clipTestEnabled) {
- // Flatten clip values higher than current clip, and set high bit to match current clip
- glStencilFunc(GL_LEQUAL, GL_STENCIL_HIGH_BIT | q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
- glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
- composite(bounds);
-
- glStencilFunc(GL_EQUAL, GL_STENCIL_HIGH_BIT, GL_STENCIL_HIGH_BIT);
- } else if (!stencilClean) {
- // Clear stencil buffer within bounding rect
- glStencilFunc(GL_ALWAYS, 0, 0xff);
- glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO);
- composite(bounds);
- }
-
- // Inc. for front-facing triangle
- glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_INCR_WRAP, GL_INCR_WRAP);
- // Dec. for back-facing "holes"
- glStencilOpSeparate(GL_BACK, GL_KEEP, GL_DECR_WRAP, GL_DECR_WRAP);
- glStencilMask(~GL_STENCIL_HIGH_BIT);
- drawVertexArrays(data, stops, stopCount, GL_TRIANGLE_FAN);
-
- if (q->state()->clipTestEnabled) {
- // Clear high bit of stencil outside of path
- glStencilFunc(GL_EQUAL, q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
- glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
- glStencilMask(GL_STENCIL_HIGH_BIT);
- composite(bounds);
- }
- } else if (mode == OddEvenFillMode) {
- glStencilMask(GL_STENCIL_HIGH_BIT);
- glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT); // Simply invert the stencil bit
- drawVertexArrays(data, stops, stopCount, GL_TRIANGLE_FAN);
-
- } else { // TriStripStrokeFillMode
- Q_ASSERT(count && !stops); // tristrips generated directly, so no vertexArray or stops
- glStencilMask(GL_STENCIL_HIGH_BIT);
-#if 0
- glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT); // Simply invert the stencil bit
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, data);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
-#else
-
- glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
- if (q->state()->clipTestEnabled) {
- glStencilFunc(GL_LEQUAL, q->state()->currentClip | GL_STENCIL_HIGH_BIT,
- ~GL_STENCIL_HIGH_BIT);
- } else {
- glStencilFunc(GL_ALWAYS, GL_STENCIL_HIGH_BIT, 0xff);
- }
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, data);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
-#endif
- }
-
- // Enable color writes & disable stencil writes
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-}
-
-/*
- If the maximum value in the stencil buffer is GL_STENCIL_HIGH_BIT - 1,
- restore the stencil buffer to a pristine state. The current clip region
- is set to 1, and the rest to 0.
-*/
-void QGL2PaintEngineExPrivate::resetClipIfNeeded()
-{
- if (maxClip != (GL_STENCIL_HIGH_BIT - 1))
- return;
-
- Q_Q(QGL2PaintEngineEx);
-
- useSimpleShader();
- glEnable(GL_STENCIL_TEST);
- glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
-
- QRectF bounds = q->state()->matrix.inverted().mapRect(QRectF(0, 0, width, height));
- QGLRect rect(bounds.left(), bounds.top(), bounds.right(), bounds.bottom());
-
- // Set high bit on clip region
- glStencilFunc(GL_LEQUAL, q->state()->currentClip, 0xff);
- glStencilOp(GL_KEEP, GL_INVERT, GL_INVERT);
- glStencilMask(GL_STENCIL_HIGH_BIT);
- composite(rect);
-
- // Reset clipping to 1 and everything else to zero
- glStencilFunc(GL_NOTEQUAL, 0x01, GL_STENCIL_HIGH_BIT);
- glStencilOp(GL_ZERO, GL_REPLACE, GL_REPLACE);
- glStencilMask(0xff);
- composite(rect);
-
- q->state()->currentClip = 1;
- q->state()->canRestoreClip = false;
-
- maxClip = 1;
-
- glStencilMask(0x0);
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-}
-
-bool QGL2PaintEngineExPrivate::prepareForCachedGlyphDraw(const QFontEngineGlyphCache &cache)
-{
- Q_Q(QGL2PaintEngineEx);
-
- Q_ASSERT(cache.transform().type() <= QTransform::TxScale);
-
- QTransform &transform = q->state()->matrix;
- transform.scale(1.0 / cache.transform().m11(), 1.0 / cache.transform().m22());
- bool ret = prepareForDraw(false);
- transform.scale(cache.transform().m11(), cache.transform().m22());
-
- return ret;
-}
-
-bool QGL2PaintEngineExPrivate::prepareForDraw(bool srcPixelsAreOpaque)
-{
- if (brushTextureDirty && mode != ImageDrawingMode && mode != ImageArrayDrawingMode)
- updateBrushTexture();
-
- if (compositionModeDirty)
- updateCompositionMode();
-
- if (matrixDirty)
- updateMatrix();
-
- const bool stateHasOpacity = q->state()->opacity < 0.99f;
- if (q->state()->composition_mode == QPainter::CompositionMode_Source
- || (q->state()->composition_mode == QPainter::CompositionMode_SourceOver
- && srcPixelsAreOpaque && !stateHasOpacity))
- {
- glDisable(GL_BLEND);
- } else {
- glEnable(GL_BLEND);
- }
-
- QGLEngineShaderManager::OpacityMode opacityMode;
- if (mode == ImageArrayDrawingMode) {
- opacityMode = QGLEngineShaderManager::AttributeOpacity;
- } else {
- opacityMode = stateHasOpacity ? QGLEngineShaderManager::UniformOpacity
- : QGLEngineShaderManager::NoOpacity;
- if (stateHasOpacity && (mode != ImageDrawingMode)) {
- // Using a brush
- bool brushIsPattern = (currentBrush.style() >= Qt::Dense1Pattern) &&
- (currentBrush.style() <= Qt::DiagCrossPattern);
-
- if ((currentBrush.style() == Qt::SolidPattern) || brushIsPattern)
- opacityMode = QGLEngineShaderManager::NoOpacity; // Global opacity handled by srcPixel shader
- }
- }
- shaderManager->setOpacityMode(opacityMode);
-
- bool changed = shaderManager->useCorrectShaderProg();
- // If the shader program needs changing, we change it and mark all uniforms as dirty
- if (changed) {
- // The shader program has changed so mark all uniforms as dirty:
- brushUniformsDirty = true;
- opacityUniformDirty = true;
- matrixUniformDirty = true;
- translateZUniformDirty = true;
- }
-
- if (brushUniformsDirty && mode != ImageDrawingMode && mode != ImageArrayDrawingMode)
- updateBrushUniforms();
-
- if (opacityMode == QGLEngineShaderManager::UniformOpacity && opacityUniformDirty) {
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::GlobalOpacity), (GLfloat)q->state()->opacity);
- opacityUniformDirty = false;
- }
-
- if (matrixUniformDirty && shaderManager->hasComplexGeometry()) {
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::Matrix),
- pmvMatrix);
- matrixUniformDirty = false;
- }
-
- if (translateZUniformDirty && shaderManager->hasComplexGeometry()) {
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::TranslateZ),
- translateZ);
- translateZUniformDirty = false;
- }
-
- return changed;
-}
-
-void QGL2PaintEngineExPrivate::composite(const QGLRect& boundingRect)
-{
- setCoords(staticVertexCoordinateArray, boundingRect);
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, staticVertexCoordinateArray);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-}
-
-// Draws the vertex array as a set of <vertexArrayStops.size()> triangle fans.
-void QGL2PaintEngineExPrivate::drawVertexArrays(const float *data, int *stops, int stopCount,
- GLenum primitive)
-{
- // Now setup the pointer to the vertex array:
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, data);
-
- int previousStop = 0;
- for (int i=0; i<stopCount; ++i) {
- int stop = stops[i];
-/*
- qDebug("Drawing triangle fan for vertecies %d -> %d:", previousStop, stop-1);
- for (int i=previousStop; i<stop; ++i)
- qDebug(" %02d: [%.2f, %.2f]", i, vertexArray.data()[i].x, vertexArray.data()[i].y);
-*/
- glDrawArrays(primitive, previousStop, stop - previousStop);
- previousStop = stop;
- }
-}
-
-/////////////////////////////////// Public Methods //////////////////////////////////////////
-
-QGL2PaintEngineEx::QGL2PaintEngineEx()
- : QPaintEngineEx(*(new QGL2PaintEngineExPrivate(this)))
-{
-}
-
-QGL2PaintEngineEx::~QGL2PaintEngineEx()
-{
-}
-
-void QGL2PaintEngineEx::fill(const QVectorPath &path, const QBrush &brush)
-{
- Q_D(QGL2PaintEngineEx);
-
- if (qbrush_style(brush) == Qt::NoBrush)
- return;
- ensureActive();
- d->setBrush(brush);
- d->fill(path);
-}
-
-Q_GUI_EXPORT bool qt_scaleForTransform(const QTransform &transform, qreal *scale); // qtransform.cpp
-
-
-void QGL2PaintEngineEx::stroke(const QVectorPath &path, const QPen &pen)
-{
- Q_D(QGL2PaintEngineEx);
-
- const QBrush &penBrush = qpen_brush(pen);
- if (qpen_style(pen) == Qt::NoPen || qbrush_style(penBrush) == Qt::NoBrush)
- return;
-
- QGL2PaintEngineState *s = state();
- if (qt_pen_is_cosmetic(pen, s->renderHints) && !qt_scaleForTransform(s->transform(), 0)) {
- // QTriangulatingStroker class is not meant to support cosmetically sheared strokes.
- QPaintEngineEx::stroke(path, pen);
- return;
- }
-
- ensureActive();
- d->setBrush(penBrush);
- d->stroke(path, pen);
-}
-
-void QGL2PaintEngineExPrivate::stroke(const QVectorPath &path, const QPen &pen)
-{
- const QGL2PaintEngineState *s = q->state();
- if (snapToPixelGrid) {
- snapToPixelGrid = false;
- matrixDirty = true;
- }
-
- const Qt::PenStyle penStyle = qpen_style(pen);
- const QBrush &penBrush = qpen_brush(pen);
- const bool opaque = penBrush.isOpaque() && s->opacity > 0.99;
-
- transferMode(BrushDrawingMode);
-
- // updateMatrix() is responsible for setting the inverse scale on
- // the strokers, so we need to call it here and not wait for
- // prepareForDraw() down below.
- updateMatrix();
-
- QRectF clip = q->state()->matrix.inverted().mapRect(q->state()->clipEnabled
- ? q->state()->rectangleClip
- : QRectF(0, 0, width, height));
-
- if (penStyle == Qt::SolidLine) {
- stroker.process(path, pen, clip, s->renderHints);
-
- } else { // Some sort of dash
- dasher.process(path, pen, clip, s->renderHints);
-
- QVectorPath dashStroke(dasher.points(),
- dasher.elementCount(),
- dasher.elementTypes());
- stroker.process(dashStroke, pen, clip, s->renderHints);
- }
-
- if (!stroker.vertexCount())
- return;
-
- if (opaque) {
- prepareForDraw(opaque);
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, stroker.vertices());
- glDrawArrays(GL_TRIANGLE_STRIP, 0, stroker.vertexCount() / 2);
-
-// QBrush b(Qt::green);
-// d->setBrush(&b);
-// d->prepareForDraw(true);
-// glDrawArrays(GL_LINE_STRIP, 0, d->stroker.vertexCount() / 2);
-
- } else {
- qreal width = qpen_widthf(pen) / 2;
- if (width == 0)
- width = 0.5;
- qreal extra = pen.joinStyle() == Qt::MiterJoin
- ? qMax(pen.miterLimit() * width, width)
- : width;
-
- if (qt_pen_is_cosmetic(pen, s->renderHints))
- extra = extra * inverseScale;
-
- QRectF bounds = path.controlPointRect().adjusted(-extra, -extra, extra, extra);
-
- fillStencilWithVertexArray(stroker.vertices(), stroker.vertexCount() / 2,
- 0, 0, bounds, QGL2PaintEngineExPrivate::TriStripStrokeFillMode);
-
- glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
-
- // Pass when any bit is set, replace stencil value with 0
- glStencilFunc(GL_NOTEQUAL, 0, GL_STENCIL_HIGH_BIT);
- prepareForDraw(false);
-
- // Stencil the brush onto the dest buffer
- composite(bounds);
-
- glStencilMask(0);
-
- updateClipScissorTest();
- }
-}
-
-void QGL2PaintEngineEx::penChanged() { }
-void QGL2PaintEngineEx::brushChanged() { }
-void QGL2PaintEngineEx::brushOriginChanged() { }
-
-void QGL2PaintEngineEx::opacityChanged()
-{
-// qDebug("QGL2PaintEngineEx::opacityChanged()");
- Q_D(QGL2PaintEngineEx);
- state()->opacityChanged = true;
-
- Q_ASSERT(d->shaderManager);
- d->brushUniformsDirty = true;
- d->opacityUniformDirty = true;
-}
-
-void QGL2PaintEngineEx::compositionModeChanged()
-{
-// qDebug("QGL2PaintEngineEx::compositionModeChanged()");
- Q_D(QGL2PaintEngineEx);
- state()->compositionModeChanged = true;
- d->compositionModeDirty = true;
-}
-
-void QGL2PaintEngineEx::renderHintsChanged()
-{
- Q_D(QGL2PaintEngineEx);
- state()->renderHintsChanged = true;
-
-#if !defined(QT_OPENGL_ES_2)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- if (!d->ctx->contextHandle()->isOpenGLES()) {
- if ((state()->renderHints & QPainter::Antialiasing)
-#if QT_DEPRECATED_SINCE(5, 14)
- || (state()->renderHints & QPainter::HighQualityAntialiasing)
-#endif
- )
- d->glEnable(GL_MULTISAMPLE);
- else
- d->glDisable(GL_MULTISAMPLE);
- }
-QT_WARNING_POP
-#endif
-
- d->lastTextureUsed = GLuint(-1);
- d->brushTextureDirty = true;
-// qDebug("QGL2PaintEngineEx::renderHintsChanged() not implemented!");
-}
-
-void QGL2PaintEngineEx::transformChanged()
-{
- Q_D(QGL2PaintEngineEx);
- d->matrixDirty = true;
- state()->matrixChanged = true;
-}
-
-
-static const QRectF scaleRect(const QRectF &r, qreal sx, qreal sy)
-{
- return QRectF(r.x() * sx, r.y() * sy, r.width() * sx, r.height() * sy);
-}
-
-void QGL2PaintEngineEx::drawPixmap(const QRectF& dest, const QPixmap & pixmap, const QRectF & src)
-{
- Q_D(QGL2PaintEngineEx);
- QGLContext *ctx = d->ctx;
-
- int max_texture_size = ctx->d_func()->maxTextureSize();
- if (pixmap.width() > max_texture_size || pixmap.height() > max_texture_size) {
- QPixmap scaled = pixmap.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
-
- const qreal sx = scaled.width() / qreal(pixmap.width());
- const qreal sy = scaled.height() / qreal(pixmap.height());
-
- drawPixmap(dest, scaled, scaleRect(src, sx, sy));
- return;
- }
-
- ensureActive();
- d->transferMode(ImageDrawingMode);
-
- QGLContext::BindOptions bindOptions = QGLContext::InternalBindOption|QGLContext::CanFlipNativePixmapBindOption;
-#ifdef QGL_USE_TEXTURE_POOL
- bindOptions |= QGLContext::TemporarilyCachedBindOption;
-#endif
-
- d->glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
- QGLTexture *texture =
- ctx->d_func()->bindTexture(pixmap, GL_TEXTURE_2D, GL_RGBA, bindOptions);
-
- GLfloat top = texture->options & QGLContext::InvertedYBindOption ? (pixmap.height() - src.top()) : src.top();
- GLfloat bottom = texture->options & QGLContext::InvertedYBindOption ? (pixmap.height() - src.bottom()) : src.bottom();
- QGLRect srcRect(src.left(), top, src.right(), bottom);
-
- bool isBitmap = pixmap.isQBitmap();
- bool isOpaque = !isBitmap && !pixmap.hasAlpha();
-
- d->updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE,
- state()->renderHints & QPainter::SmoothPixmapTransform, texture->id);
- d->drawTexture(dest, srcRect, pixmap.size(), isOpaque, isBitmap);
-
- if (texture->options&QGLContext::TemporarilyCachedBindOption) {
- // pixmap was temporarily cached as a QImage texture by pooling system
- // and should be destroyed immediately
- QGLTextureCache::instance()->remove(ctx, texture->id);
- }
-}
-
-void QGL2PaintEngineEx::drawImage(const QRectF& dest, const QImage& image, const QRectF& src,
- Qt::ImageConversionFlags)
-{
- Q_D(QGL2PaintEngineEx);
- QGLContext *ctx = d->ctx;
-
- int max_texture_size = ctx->d_func()->maxTextureSize();
- if (image.width() > max_texture_size || image.height() > max_texture_size) {
- QImage scaled = image.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
-
- const qreal sx = scaled.width() / qreal(image.width());
- const qreal sy = scaled.height() / qreal(image.height());
-
- drawImage(dest, scaled, scaleRect(src, sx, sy));
- return;
- }
-
- ensureActive();
- d->transferMode(ImageDrawingMode);
-
- d->glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
-
- QGLContext::BindOptions bindOptions = QGLContext::InternalBindOption;
-#ifdef QGL_USE_TEXTURE_POOL
- bindOptions |= QGLContext::TemporarilyCachedBindOption;
-#endif
-
- QGLTexture *texture = ctx->d_func()->bindTexture(image, GL_TEXTURE_2D, GL_RGBA, bindOptions);
- GLuint id = texture->id;
-
- d->updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE,
- state()->renderHints & QPainter::SmoothPixmapTransform, id);
- d->drawTexture(dest, src, image.size(), !image.hasAlphaChannel());
-
- if (texture->options&QGLContext::TemporarilyCachedBindOption) {
- // image was temporarily cached by texture pooling system
- // and should be destroyed immediately
- QGLTextureCache::instance()->remove(ctx, texture->id);
- }
-}
-
-void QGL2PaintEngineEx::drawStaticTextItem(QStaticTextItem *textItem)
-{
- Q_D(QGL2PaintEngineEx);
-
- ensureActive();
-
- QPainterState *s = state();
-
- // don't try to cache huge fonts or vastly transformed fonts
- QFontEngine *fontEngine = textItem->fontEngine();
- if (shouldDrawCachedGlyphs(fontEngine, s->matrix)) {
-
- QFontEngine::GlyphFormat glyphFormat = fontEngine->glyphFormat != QFontEngine::Format_None
- ? fontEngine->glyphFormat : d->glyphCacheFormat;
-
- if (glyphFormat == QFontEngine::Format_A32) {
- if (!QGLFramebufferObject::hasOpenGLFramebufferObjects()
- || d->device->alphaRequested() || s->matrix.type() > QTransform::TxTranslate
- || (s->composition_mode != QPainter::CompositionMode_Source
- && s->composition_mode != QPainter::CompositionMode_SourceOver))
- {
- glyphFormat = QFontEngine::Format_A8;
- }
- }
-
- d->drawCachedGlyphs(glyphFormat, textItem);
- } else {
- QPaintEngineEx::drawStaticTextItem(textItem);
- }
-}
-
-bool QGL2PaintEngineEx::drawTexture(const QRectF &dest, GLuint textureId, const QSize &size, const QRectF &src)
-{
- Q_D(QGL2PaintEngineEx);
- if (!d->shaderManager)
- return false;
-
- ensureActive();
- d->transferMode(ImageDrawingMode);
-
- d->glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
- d->glBindTexture(GL_TEXTURE_2D, textureId);
-
- QGLRect srcRect(src.left(), src.bottom(), src.right(), src.top());
-
- d->updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE,
- state()->renderHints & QPainter::SmoothPixmapTransform, textureId);
- d->drawTexture(dest, srcRect, size, false);
- return true;
-}
-
-void QGL2PaintEngineEx::drawTextItem(const QPointF &p, const QTextItem &textItem)
-{
- Q_D(QGL2PaintEngineEx);
-
- ensureActive();
- QGL2PaintEngineState *s = state();
-
- const QTextItemInt &ti = static_cast<const QTextItemInt &>(textItem);
-
- QTransform::TransformationType txtype = s->matrix.type();
-
- QFontEngine::GlyphFormat glyphFormat = ti.fontEngine->glyphFormat != QFontEngine::Format_None
- ? ti.fontEngine->glyphFormat : d->glyphCacheFormat;
-
- if (glyphFormat == QFontEngine::Format_A32) {
- if (!QGLFramebufferObject::hasOpenGLFramebufferObjects()
- || d->device->alphaRequested() || txtype > QTransform::TxTranslate
- || (state()->composition_mode != QPainter::CompositionMode_Source
- && state()->composition_mode != QPainter::CompositionMode_SourceOver))
- {
- glyphFormat = QFontEngine::Format_A8;
- }
- }
-
- if (shouldDrawCachedGlyphs(ti.fontEngine, s->matrix)) {
- QVarLengthArray<QFixedPoint> positions;
- QVarLengthArray<glyph_t> glyphs;
- QTransform matrix = QTransform::fromTranslate(p.x(), p.y());
- ti.fontEngine->getGlyphPositions(ti.glyphs, matrix, ti.flags, glyphs, positions);
-
- {
- QStaticTextItem staticTextItem;
- staticTextItem.setFontEngine(ti.fontEngine);
- staticTextItem.glyphs = glyphs.data();
- staticTextItem.numGlyphs = glyphs.size();
- staticTextItem.glyphPositions = positions.data();
-
- d->drawCachedGlyphs(glyphFormat, &staticTextItem);
- }
- return;
- }
-
- QPaintEngineEx::drawTextItem(p, ti);
-}
-
-namespace {
-
- class QOpenGLStaticTextUserData: public QStaticTextUserData
- {
- public:
- QOpenGLStaticTextUserData()
- : QStaticTextUserData(OpenGLUserData), cacheSize(0, 0), cacheSerialNumber(0)
- {
- }
-
- ~QOpenGLStaticTextUserData()
- {
- }
-
- QSize cacheSize;
- QGL2PEXVertexArray vertexCoordinateArray;
- QGL2PEXVertexArray textureCoordinateArray;
- QFontEngine::GlyphFormat glyphFormat;
- int cacheSerialNumber;
- };
-
-}
-
-
-// #define QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO
-
-void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngine::GlyphFormat glyphFormat,
- QStaticTextItem *staticTextItem)
-{
- Q_Q(QGL2PaintEngineEx);
-
- QGL2PaintEngineState *s = q->state();
-
- void *cacheKey = const_cast<QGLContext *>(QGLContextPrivate::contextGroup(ctx)->context());
- bool recreateVertexArrays = false;
-
- QTransform glyphCacheTransform;
- QFontEngine *fe = staticTextItem->fontEngine();
- if (fe->supportsTransformation(s->matrix)) {
- // The font-engine supports rendering glyphs with the current transform, so we
- // build a glyph-cache with the scale pre-applied, so that the cache contains
- // glyphs with the appropriate resolution in the case of retina displays.
- glyphCacheTransform = s->matrix.type() < QTransform::TxRotate ?
- QTransform::fromScale(qAbs(s->matrix.m11()), qAbs(s->matrix.m22())) :
- QTransform::fromScale(
- QVector2D(s->matrix.m11(), s->matrix.m12()).length(),
- QVector2D(s->matrix.m21(), s->matrix.m22()).length());
- }
-
- QGLTextureGlyphCache *cache =
- (QGLTextureGlyphCache *) fe->glyphCache(cacheKey, glyphFormat, glyphCacheTransform);
- if (!cache || cache->glyphFormat() != glyphFormat || cache->contextGroup() == 0) {
- cache = new QGLTextureGlyphCache(glyphFormat, glyphCacheTransform);
- fe->setGlyphCache(cacheKey, cache);
- recreateVertexArrays = true;
- }
-
- if (staticTextItem->userDataNeedsUpdate) {
- recreateVertexArrays = true;
- } else if (staticTextItem->userData() == 0) {
- recreateVertexArrays = true;
- } else if (staticTextItem->userData()->type != QStaticTextUserData::OpenGLUserData) {
- recreateVertexArrays = true;
- } else {
- QOpenGLStaticTextUserData *userData = static_cast<QOpenGLStaticTextUserData *>(staticTextItem->userData());
- if (userData->glyphFormat != glyphFormat) {
- recreateVertexArrays = true;
- } else if (userData->cacheSerialNumber != cache->serialNumber()) {
- recreateVertexArrays = true;
- }
- }
-
- // We only need to update the cache with new glyphs if we are actually going to recreate the vertex arrays.
- // If the cache size has changed, we do need to regenerate the vertices, but we don't need to repopulate the
- // cache so this text is performed before we test if the cache size has changed.
- if (recreateVertexArrays) {
- cache->setPaintEnginePrivate(this);
- if (!cache->populate(fe, staticTextItem->numGlyphs,
- staticTextItem->glyphs, staticTextItem->glyphPositions)) {
- // No space for glyphs in cache. We need to reset it and try again.
- cache->clear();
- cache->populate(fe, staticTextItem->numGlyphs,
- staticTextItem->glyphs, staticTextItem->glyphPositions);
- }
- cache->fillInPendingGlyphs();
- }
-
- if (cache->width() == 0 || cache->height() == 0)
- return;
-
- transferMode(TextDrawingMode);
-
- int margin = fe->glyphMargin(glyphFormat);
-
- GLfloat dx = 1.0 / cache->width();
- GLfloat dy = 1.0 / cache->height();
-
- // Use global arrays by default
- QGL2PEXVertexArray *vertexCoordinates = &vertexCoordinateArray;
- QGL2PEXVertexArray *textureCoordinates = &textureCoordinateArray;
-
- if (staticTextItem->useBackendOptimizations) {
- QOpenGLStaticTextUserData *userData = 0;
-
- if (staticTextItem->userData() == 0
- || staticTextItem->userData()->type != QStaticTextUserData::OpenGLUserData) {
-
- userData = new QOpenGLStaticTextUserData();
- staticTextItem->setUserData(userData);
-
- } else {
- userData = static_cast<QOpenGLStaticTextUserData*>(staticTextItem->userData());
- }
-
- userData->glyphFormat = glyphFormat;
- userData->cacheSerialNumber = cache->serialNumber();
-
- // Use cache if backend optimizations is turned on
- vertexCoordinates = &userData->vertexCoordinateArray;
- textureCoordinates = &userData->textureCoordinateArray;
-
- QSize size(cache->width(), cache->height());
- if (userData->cacheSize != size) {
- recreateVertexArrays = true;
- userData->cacheSize = size;
- }
- }
-
- if (recreateVertexArrays) {
- vertexCoordinates->clear();
- textureCoordinates->clear();
-
- bool supportsSubPixelPositions = fe->supportsSubPixelPositions();
- for (int i=0; i<staticTextItem->numGlyphs; ++i) {
- QFixed subPixelPosition;
- if (supportsSubPixelPositions)
- subPixelPosition = fe->subPixelPositionForX(staticTextItem->glyphPositions[i].x);
-
- QTextureGlyphCache::GlyphAndSubPixelPosition glyph(staticTextItem->glyphs[i], subPixelPosition);
-
- const QTextureGlyphCache::Coord &c = cache->coords[glyph];
- if (c.isNull())
- continue;
-
- int x = qFloor(staticTextItem->glyphPositions[i].x.toReal() * cache->transform().m11()) + c.baseLineX - margin;
- int y = qRound(staticTextItem->glyphPositions[i].y.toReal() * cache->transform().m22()) - c.baseLineY - margin;
-
- vertexCoordinates->addQuad(QRectF(x, y, c.w, c.h));
- textureCoordinates->addQuad(QRectF(c.x*dx, c.y*dy, c.w * dx, c.h * dy));
- }
-
- staticTextItem->userDataNeedsUpdate = false;
- }
-
- int numGlyphs = vertexCoordinates->vertexCount() / 4;
- if (numGlyphs == 0)
- return;
-
- if (elementIndices.size() < numGlyphs*6) {
- Q_ASSERT(elementIndices.size() % 6 == 0);
- int j = elementIndices.size() / 6 * 4;
- while (j < numGlyphs*4) {
- elementIndices.append(j + 0);
- elementIndices.append(j + 0);
- elementIndices.append(j + 1);
- elementIndices.append(j + 2);
- elementIndices.append(j + 3);
- elementIndices.append(j + 3);
-
- j += 4;
- }
-
-#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
- if (elementIndicesVBOId == 0)
- glGenBuffers(1, &elementIndicesVBOId);
-
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementIndicesVBOId);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementIndices.size() * sizeof(GLushort),
- elementIndices.constData(), GL_STATIC_DRAW);
-#endif
- } else {
-#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementIndicesVBOId);
-#endif
- }
-
- setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, (GLfloat*)vertexCoordinates->data());
- setVertexAttributePointer(QT_TEXTURE_COORDS_ATTR, (GLfloat*)textureCoordinates->data());
-
- if (!snapToPixelGrid) {
- snapToPixelGrid = true;
- matrixDirty = true;
- }
-
- QBrush pensBrush = q->state()->pen.brush();
- setBrush(pensBrush);
-
- if (glyphFormat == QFontEngine::Format_A32) {
-
- // Subpixel antialiasing without gamma correction
-
- QPainter::CompositionMode compMode = q->state()->composition_mode;
- Q_ASSERT(compMode == QPainter::CompositionMode_Source
- || compMode == QPainter::CompositionMode_SourceOver);
-
- shaderManager->setMaskType(QGLEngineShaderManager::SubPixelMaskPass1);
-
- if (pensBrush.style() == Qt::SolidPattern) {
- // Solid patterns can get away with only one pass.
- QColor c = pensBrush.color();
- qreal oldOpacity = q->state()->opacity;
- if (compMode == QPainter::CompositionMode_Source) {
- c = qt_premultiplyColor(c, q->state()->opacity);
- q->state()->opacity = 1;
- opacityUniformDirty = true;
- }
-
- compositionModeDirty = false; // I can handle this myself, thank you very much
- prepareForCachedGlyphDraw(*cache);
-
- // prepareForCachedGlyphDraw() have set the opacity on the current shader, so the opacity state can now be reset.
- if (compMode == QPainter::CompositionMode_Source) {
- q->state()->opacity = oldOpacity;
- opacityUniformDirty = true;
- }
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_SRC_COLOR);
- glBlendColor(c.redF(), c.greenF(), c.blueF(), c.alphaF());
- } else {
- // Other brush styles need two passes.
-
- qreal oldOpacity = q->state()->opacity;
- if (compMode == QPainter::CompositionMode_Source) {
- q->state()->opacity = 1;
- opacityUniformDirty = true;
- pensBrush = Qt::white;
- setBrush(pensBrush);
- }
-
- compositionModeDirty = false; // I can handle this myself, thank you very much
- prepareForCachedGlyphDraw(*cache);
- glEnable(GL_BLEND);
- glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
-
- glActiveTexture(GL_TEXTURE0 + QT_MASK_TEXTURE_UNIT);
- glBindTexture(GL_TEXTURE_2D, cache->texture());
- updateTextureFilter(GL_TEXTURE_2D, GL_REPEAT, false);
-
-#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
- glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, 0);
-#else
- glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, elementIndices.data());
-#endif
-
- shaderManager->setMaskType(QGLEngineShaderManager::SubPixelMaskPass2);
-
- if (compMode == QPainter::CompositionMode_Source) {
- q->state()->opacity = oldOpacity;
- opacityUniformDirty = true;
- pensBrush = q->state()->pen.brush();
- setBrush(pensBrush);
- }
-
- compositionModeDirty = false;
- prepareForCachedGlyphDraw(*cache);
- glEnable(GL_BLEND);
- glBlendFunc(GL_ONE, GL_ONE);
- }
- compositionModeDirty = true;
- } else {
- // Grayscale/mono glyphs
-
- shaderManager->setMaskType(QGLEngineShaderManager::PixelMask);
- prepareForCachedGlyphDraw(*cache);
- }
-
- QGLTextureGlyphCache::FilterMode filterMode = (s->matrix.type() > QTransform::TxTranslate)?QGLTextureGlyphCache::Linear:QGLTextureGlyphCache::Nearest;
- if (lastMaskTextureUsed != cache->texture() || cache->filterMode() != filterMode) {
-
- glActiveTexture(GL_TEXTURE0 + QT_MASK_TEXTURE_UNIT);
- if (lastMaskTextureUsed != cache->texture()) {
- glBindTexture(GL_TEXTURE_2D, cache->texture());
- lastMaskTextureUsed = cache->texture();
- }
-
- if (cache->filterMode() != filterMode) {
- if (filterMode == QGLTextureGlyphCache::Linear) {
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- } else {
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- }
- cache->setFilterMode(filterMode);
- }
- }
-
-#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
- glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, 0);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-#else
- glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, elementIndices.data());
-#endif
-}
-
-void QGL2PaintEngineEx::drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap,
- QPainter::PixmapFragmentHints hints)
-{
- Q_D(QGL2PaintEngineEx);
- // Use fallback for extended composition modes.
- if (state()->composition_mode > QPainter::CompositionMode_Plus) {
- QPaintEngineEx::drawPixmapFragments(fragments, fragmentCount, pixmap, hints);
- return;
- }
-
- ensureActive();
- int max_texture_size = d->ctx->d_func()->maxTextureSize();
- if (pixmap.width() > max_texture_size || pixmap.height() > max_texture_size) {
- QPixmap scaled = pixmap.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
- d->drawPixmapFragments(fragments, fragmentCount, scaled, hints);
- } else {
- d->drawPixmapFragments(fragments, fragmentCount, pixmap, hints);
- }
-}
-
-
-void QGL2PaintEngineExPrivate::drawPixmapFragments(const QPainter::PixmapFragment *fragments,
- int fragmentCount, const QPixmap &pixmap,
- QPainter::PixmapFragmentHints hints)
-{
- GLfloat dx = 1.0f / pixmap.size().width();
- GLfloat dy = 1.0f / pixmap.size().height();
-
- vertexCoordinateArray.clear();
- textureCoordinateArray.clear();
- opacityArray.reset();
-
- if (snapToPixelGrid) {
- snapToPixelGrid = false;
- matrixDirty = true;
- }
-
- bool allOpaque = true;
-
- for (int i = 0; i < fragmentCount; ++i) {
- qreal s = 0;
- qreal c = 1;
- if (fragments[i].rotation != 0) {
- s = qFastSin(qDegreesToRadians(fragments[i].rotation));
- c = qFastCos(qDegreesToRadians(fragments[i].rotation));
- }
-
- qreal right = 0.5 * fragments[i].scaleX * fragments[i].width;
- qreal bottom = 0.5 * fragments[i].scaleY * fragments[i].height;
- QGLPoint bottomRight(right * c - bottom * s, right * s + bottom * c);
- QGLPoint bottomLeft(-right * c - bottom * s, -right * s + bottom * c);
-
- vertexCoordinateArray.addVertex(bottomRight.x + fragments[i].x, bottomRight.y + fragments[i].y);
- vertexCoordinateArray.addVertex(-bottomLeft.x + fragments[i].x, -bottomLeft.y + fragments[i].y);
- vertexCoordinateArray.addVertex(-bottomRight.x + fragments[i].x, -bottomRight.y + fragments[i].y);
- vertexCoordinateArray.addVertex(-bottomRight.x + fragments[i].x, -bottomRight.y + fragments[i].y);
- vertexCoordinateArray.addVertex(bottomLeft.x + fragments[i].x, bottomLeft.y + fragments[i].y);
- vertexCoordinateArray.addVertex(bottomRight.x + fragments[i].x, bottomRight.y + fragments[i].y);
-
- QGLRect src(fragments[i].sourceLeft * dx, fragments[i].sourceTop * dy,
- (fragments[i].sourceLeft + fragments[i].width) * dx,
- (fragments[i].sourceTop + fragments[i].height) * dy);
-
- textureCoordinateArray.addVertex(src.right, src.bottom);
- textureCoordinateArray.addVertex(src.right, src.top);
- textureCoordinateArray.addVertex(src.left, src.top);
- textureCoordinateArray.addVertex(src.left, src.top);
- textureCoordinateArray.addVertex(src.left, src.bottom);
- textureCoordinateArray.addVertex(src.right, src.bottom);
-
- qreal opacity = fragments[i].opacity * q->state()->opacity;
- opacityArray << opacity << opacity << opacity << opacity << opacity << opacity;
- allOpaque &= (opacity >= 0.99f);
- }
-
- glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
- QGLTexture *texture = ctx->d_func()->bindTexture(pixmap, GL_TEXTURE_2D, GL_RGBA,
- QGLContext::InternalBindOption
- | QGLContext::CanFlipNativePixmapBindOption);
-
- if (texture->options & QGLContext::InvertedYBindOption) {
- // Flip texture y-coordinate.
- QGLPoint *data = textureCoordinateArray.data();
- for (int i = 0; i < 6 * fragmentCount; ++i)
- data[i].y = 1 - data[i].y;
- }
-
- transferMode(ImageArrayDrawingMode);
-
- bool isBitmap = pixmap.isQBitmap();
- bool isOpaque = !isBitmap && (!pixmap.hasAlpha() || (hints & QPainter::OpaqueHint)) && allOpaque;
-
- updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE,
- q->state()->renderHints & QPainter::SmoothPixmapTransform, texture->id);
-
- // Setup for texture drawing
- currentBrush = noBrush;
- shaderManager->setSrcPixelType(isBitmap ? QGLEngineShaderManager::PatternSrc
- : QGLEngineShaderManager::ImageSrc);
- if (prepareForDraw(isOpaque))
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::ImageTexture), QT_IMAGE_TEXTURE_UNIT);
-
- if (isBitmap) {
- QColor col = qt_premultiplyColor(q->state()->pen.color(), (GLfloat)q->state()->opacity);
- shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::PatternColor), col);
- }
-
- glDrawArrays(GL_TRIANGLES, 0, 6 * fragmentCount);
-}
-
-bool QGL2PaintEngineEx::begin(QPaintDevice *pdev)
-{
- Q_D(QGL2PaintEngineEx);
-
-// qDebug("QGL2PaintEngineEx::begin()");
- if (pdev->devType() == QInternal::OpenGL)
- d->device = static_cast<QGLPaintDevice*>(pdev);
- else
- d->device = QGLPaintDevice::getDevice(pdev);
-
- if (!d->device)
- return false;
-
- d->ctx = d->device->context();
- d->ctx->d_ptr->active_engine = this;
-
- d->resetOpenGLContextActiveEngine();
-
- const QSize sz = d->device->size();
- d->width = sz.width();
- d->height = sz.height();
- d->mode = BrushDrawingMode;
- d->brushTextureDirty = true;
- d->brushUniformsDirty = true;
- d->matrixUniformDirty = true;
- d->matrixDirty = true;
- d->compositionModeDirty = true;
- d->opacityUniformDirty = true;
- d->translateZUniformDirty = true;
- d->needsSync = true;
- d->useSystemClip = !systemClip().isEmpty();
- d->currentBrush = QBrush();
-
- d->dirtyStencilRegion = QRect(0, 0, d->width, d->height);
- d->stencilClean = true;
-
- // Calling begin paint should make the correct context current. So, any
- // code which calls into GL or otherwise needs a current context *must*
- // go after beginPaint:
- d->device->beginPaint();
-
- d->initializeOpenGLFunctions();
-
- d->shaderManager = new QGLEngineShaderManager(d->ctx);
-
- d->glDisable(GL_STENCIL_TEST);
- d->glDisable(GL_DEPTH_TEST);
- d->glDisable(GL_SCISSOR_TEST);
-
-#if !defined(QT_OPENGL_ES_2)
- if (!d->ctx->contextHandle()->isOpenGLES())
- d->glDisable(GL_MULTISAMPLE);
-#endif
-
- d->glyphCacheFormat = QFontEngine::Format_A8;
-
-#if !defined(QT_OPENGL_ES_2)
- if (!d->ctx->contextHandle()->isOpenGLES()) {
- d->glyphCacheFormat = QFontEngine::Format_A32;
- d->multisamplingAlwaysEnabled = false;
- } else {
- d->multisamplingAlwaysEnabled = d->device->format().sampleBuffers();
- }
-#else
- // OpenGL ES can't switch MSAA off, so if the gl paint device is
- // multisampled, it's always multisampled.
- d->multisamplingAlwaysEnabled = d->device->format().sampleBuffers();
-#endif
-
- return true;
-}
-
-bool QGL2PaintEngineEx::end()
-{
- Q_D(QGL2PaintEngineEx);
-
- QGLContext *ctx = d->ctx;
- d->glUseProgram(0);
- d->transferMode(BrushDrawingMode);
- d->device->endPaint();
-
- ctx->d_ptr->active_engine = 0;
- ctx->makeCurrent();
- d->resetOpenGLContextActiveEngine();
- d->resetGLState();
-
- delete d->shaderManager;
- d->shaderManager = 0;
- d->currentBrush = QBrush();
-
-#ifdef QT_OPENGL_CACHE_AS_VBOS
- if (!d->unusedVBOSToClean.isEmpty()) {
- d->glDeleteBuffers(d->unusedVBOSToClean.size(), d->unusedVBOSToClean.constData());
- d->unusedVBOSToClean.clear();
- }
- if (!d->unusedIBOSToClean.isEmpty()) {
- d->glDeleteBuffers(d->unusedIBOSToClean.size(), d->unusedIBOSToClean.constData());
- d->unusedIBOSToClean.clear();
- }
-#endif
-
- return false;
-}
-
-void QGL2PaintEngineEx::ensureActive()
-{
- Q_D(QGL2PaintEngineEx);
- QGLContext *ctx = d->ctx;
-
- if (isActive() && (ctx->d_ptr->active_engine != this || d->resetOpenGLContextActiveEngine())) {
- ctx->d_ptr->active_engine = this;
- d->needsSync = true;
- }
-
- d->device->ensureActiveTarget();
-
- if (d->needsSync) {
- d->transferMode(BrushDrawingMode);
- d->glViewport(0, 0, d->width, d->height);
- d->needsSync = false;
- d->lastMaskTextureUsed = 0;
- d->shaderManager->setDirty();
- d->ctx->d_func()->syncGlState();
- for (int i = 0; i < 3; ++i)
- d->vertexAttribPointers[i] = (GLfloat*)-1; // Assume the pointers are clobbered
- setState(state());
- }
-}
-
-void QGL2PaintEngineExPrivate::updateClipScissorTest()
-{
- Q_Q(QGL2PaintEngineEx);
- if (q->state()->clipTestEnabled) {
- glEnable(GL_STENCIL_TEST);
- glStencilFunc(GL_LEQUAL, q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
- } else {
- glDisable(GL_STENCIL_TEST);
- glStencilFunc(GL_ALWAYS, 0, 0xff);
- }
-
-#ifdef QT_GL_NO_SCISSOR_TEST
- currentScissorBounds = QRect(0, 0, width, height);
-#else
- QRect bounds = q->state()->rectangleClip;
- if (!q->state()->clipEnabled) {
- if (useSystemClip)
- bounds = systemClip.boundingRect();
- else
- bounds = QRect(0, 0, width, height);
- } else {
- if (useSystemClip)
- bounds = bounds.intersected(systemClip.boundingRect());
- else
- bounds = bounds.intersected(QRect(0, 0, width, height));
- }
-
- currentScissorBounds = bounds;
-
- if (bounds == QRect(0, 0, width, height)) {
- glDisable(GL_SCISSOR_TEST);
- } else {
- glEnable(GL_SCISSOR_TEST);
- setScissor(bounds);
- }
-#endif
-}
-
-void QGL2PaintEngineExPrivate::setScissor(const QRect &rect)
-{
- const int left = rect.left();
- const int width = rect.width();
- int bottom = height - (rect.top() + rect.height());
- if (device->isFlipped()) {
- bottom = rect.top();
- }
- const int height = rect.height();
-
- glScissor(left, bottom, width, height);
-}
-
-void QGL2PaintEngineEx::clipEnabledChanged()
-{
- Q_D(QGL2PaintEngineEx);
-
- state()->clipChanged = true;
-
- if (painter()->hasClipping())
- d->regenerateClip();
- else
- d->systemStateChanged();
-}
-
-void QGL2PaintEngineExPrivate::clearClip(uint value)
-{
- dirtyStencilRegion -= currentScissorBounds;
-
- glStencilMask(0xff);
- glClearStencil(value);
- glClear(GL_STENCIL_BUFFER_BIT);
- glStencilMask(0x0);
-
- q->state()->needsClipBufferClear = false;
-}
-
-void QGL2PaintEngineExPrivate::writeClip(const QVectorPath &path, uint value)
-{
- transferMode(BrushDrawingMode);
-
- if (snapToPixelGrid) {
- snapToPixelGrid = false;
- matrixDirty = true;
- }
-
- if (matrixDirty)
- updateMatrix();
-
- stencilClean = false;
-
- const bool singlePass = !path.hasWindingFill()
- && (((q->state()->currentClip == maxClip - 1) && q->state()->clipTestEnabled)
- || q->state()->needsClipBufferClear);
- const uint referenceClipValue = q->state()->needsClipBufferClear ? 1 : q->state()->currentClip;
-
- if (q->state()->needsClipBufferClear)
- clearClip(1);
-
- if (path.isEmpty()) {
- glEnable(GL_STENCIL_TEST);
- glStencilFunc(GL_LEQUAL, value, ~GL_STENCIL_HIGH_BIT);
- return;
- }
-
- if (q->state()->clipTestEnabled)
- glStencilFunc(GL_LEQUAL, q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
- else
- glStencilFunc(GL_ALWAYS, 0, 0xff);
-
- vertexCoordinateArray.clear();
- vertexCoordinateArray.addPath(path, inverseScale, false);
-
- if (!singlePass)
- fillStencilWithVertexArray(vertexCoordinateArray, path.hasWindingFill());
-
- glColorMask(false, false, false, false);
- glEnable(GL_STENCIL_TEST);
- useSimpleShader();
-
- if (singlePass) {
- // Under these conditions we can set the new stencil value in a single
- // pass, by using the current value and the "new value" as the toggles
-
- glStencilFunc(GL_LEQUAL, referenceClipValue, ~GL_STENCIL_HIGH_BIT);
- glStencilOp(GL_KEEP, GL_INVERT, GL_INVERT);
- glStencilMask(value ^ referenceClipValue);
-
- drawVertexArrays(vertexCoordinateArray, GL_TRIANGLE_FAN);
- } else {
- glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
- glStencilMask(0xff);
-
- if (!q->state()->clipTestEnabled && path.hasWindingFill()) {
- // Pass when any clip bit is set, set high bit
- glStencilFunc(GL_NOTEQUAL, GL_STENCIL_HIGH_BIT, ~GL_STENCIL_HIGH_BIT);
- composite(vertexCoordinateArray.boundingRect());
- }
-
- // Pass when high bit is set, replace stencil value with new clip value
- glStencilFunc(GL_NOTEQUAL, value, GL_STENCIL_HIGH_BIT);
-
- composite(vertexCoordinateArray.boundingRect());
- }
-
- glStencilFunc(GL_LEQUAL, value, ~GL_STENCIL_HIGH_BIT);
- glStencilMask(0);
-
- glColorMask(true, true, true, true);
-}
-
-void QGL2PaintEngineEx::clip(const QVectorPath &path, Qt::ClipOperation op)
-{
-// qDebug("QGL2PaintEngineEx::clip()");
- Q_D(QGL2PaintEngineEx);
-
- state()->clipChanged = true;
-
- ensureActive();
-
- if (op == Qt::ReplaceClip) {
- op = Qt::IntersectClip;
- if (d->hasClipOperations()) {
- d->systemStateChanged();
- state()->canRestoreClip = false;
- }
- }
-
-#ifndef QT_GL_NO_SCISSOR_TEST
- if (!path.isEmpty() && op == Qt::IntersectClip && (path.shape() == QVectorPath::RectangleHint)) {
- const QPointF* const points = reinterpret_cast<const QPointF*>(path.points());
- QRectF rect(points[0], points[2]);
-
- if (state()->matrix.type() <= QTransform::TxScale
- || (state()->matrix.type() == QTransform::TxRotate
- && qFuzzyIsNull(state()->matrix.m11())
- && qFuzzyIsNull(state()->matrix.m22())))
- {
- state()->rectangleClip = state()->rectangleClip.intersected(state()->matrix.mapRect(rect).toRect());
- d->updateClipScissorTest();
- return;
- }
- }
-#endif
-
- const QRect pathRect = state()->matrix.mapRect(path.controlPointRect()).toAlignedRect();
-
- switch (op) {
- case Qt::NoClip:
- if (d->useSystemClip) {
- state()->clipTestEnabled = true;
- state()->currentClip = 1;
- } else {
- state()->clipTestEnabled = false;
- }
- state()->rectangleClip = QRect(0, 0, d->width, d->height);
- state()->canRestoreClip = false;
- d->updateClipScissorTest();
- break;
- case Qt::IntersectClip:
- state()->rectangleClip = state()->rectangleClip.intersected(pathRect);
- d->updateClipScissorTest();
- d->resetClipIfNeeded();
- ++d->maxClip;
- d->writeClip(path, d->maxClip);
- state()->currentClip = d->maxClip;
- state()->clipTestEnabled = true;
- break;
- default:
- break;
- }
-}
-
-void QGL2PaintEngineExPrivate::regenerateClip()
-{
- systemStateChanged();
- replayClipOperations();
-}
-
-void QGL2PaintEngineExPrivate::systemStateChanged()
-{
- Q_Q(QGL2PaintEngineEx);
-
- q->state()->clipChanged = true;
-
- if (systemClip.isEmpty()) {
- useSystemClip = false;
- } else {
- if (q->paintDevice()->devType() == QInternal::Widget && currentClipDevice) {
- QWidgetPrivate *widgetPrivate = qt_widget_private(static_cast<QWidget *>(currentClipDevice)->window());
- useSystemClip = widgetPrivate->extra && widgetPrivate->extra->inRenderWithPainter;
- } else {
- useSystemClip = true;
- }
- }
-
- q->state()->clipTestEnabled = false;
- q->state()->needsClipBufferClear = true;
-
- q->state()->currentClip = 1;
- maxClip = 1;
-
- q->state()->rectangleClip = useSystemClip ? systemClip.boundingRect() : QRect(0, 0, width, height);
- updateClipScissorTest();
-
- if (systemClip.rectCount() == 1) {
- if (systemClip.boundingRect() == QRect(0, 0, width, height))
- useSystemClip = false;
-#ifndef QT_GL_NO_SCISSOR_TEST
- // scissoring takes care of the system clip
- return;
-#endif
- }
-
- if (useSystemClip) {
- clearClip(0);
-
- QPainterPath path;
- path.addRegion(systemClip);
-
- q->state()->currentClip = 0;
- writeClip(qtVectorPathForPath(q->state()->matrix.inverted().map(path)), 1);
- q->state()->currentClip = 1;
- q->state()->clipTestEnabled = true;
- }
-}
-
-void QGL2PaintEngineEx::setTranslateZ(GLfloat z)
-{
- Q_D(QGL2PaintEngineEx);
- if (d->translateZ != z) {
- d->translateZ = z;
- d->translateZUniformDirty = true;
- }
-}
-
-void QGL2PaintEngineEx::setState(QPainterState *new_state)
-{
- // qDebug("QGL2PaintEngineEx::setState()");
-
- Q_D(QGL2PaintEngineEx);
-
- QGL2PaintEngineState *s = static_cast<QGL2PaintEngineState *>(new_state);
- QGL2PaintEngineState *old_state = state();
-
- QPaintEngineEx::setState(s);
-
- if (s->isNew) {
- // Newly created state object. The call to setState()
- // will either be followed by a call to begin(), or we are
- // setting the state as part of a save().
- s->isNew = false;
- return;
- }
-
- // Setting the state as part of a restore().
-
- if (old_state == s || old_state->renderHintsChanged)
- renderHintsChanged();
-
- if (old_state == s || old_state->matrixChanged)
- d->matrixDirty = true;
-
- if (old_state == s || old_state->compositionModeChanged)
- d->compositionModeDirty = true;
-
- if (old_state == s || old_state->opacityChanged)
- d->opacityUniformDirty = true;
-
- if (old_state == s || old_state->clipChanged) {
- if (old_state && old_state != s && old_state->canRestoreClip) {
- d->updateClipScissorTest();
- d->glDepthFunc(GL_LEQUAL);
- } else {
- d->regenerateClip();
- }
- }
-}
-
-QPainterState *QGL2PaintEngineEx::createState(QPainterState *orig) const
-{
- if (orig)
- const_cast<QGL2PaintEngineEx *>(this)->ensureActive();
-
- QGL2PaintEngineState *s;
- if (!orig)
- s = new QGL2PaintEngineState();
- else
- s = new QGL2PaintEngineState(*static_cast<QGL2PaintEngineState *>(orig));
-
- s->matrixChanged = false;
- s->compositionModeChanged = false;
- s->opacityChanged = false;
- s->renderHintsChanged = false;
- s->clipChanged = false;
-
- return s;
-}
-
-QGL2PaintEngineState::QGL2PaintEngineState(QGL2PaintEngineState &other)
- : QPainterState(other)
-{
- isNew = true;
- needsClipBufferClear = other.needsClipBufferClear;
- clipTestEnabled = other.clipTestEnabled;
- currentClip = other.currentClip;
- canRestoreClip = other.canRestoreClip;
- rectangleClip = other.rectangleClip;
-}
-
-QGL2PaintEngineState::QGL2PaintEngineState()
-{
- isNew = true;
- needsClipBufferClear = true;
- clipTestEnabled = false;
- canRestoreClip = true;
-}
-
-QGL2PaintEngineState::~QGL2PaintEngineState()
-{
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
deleted file mode 100644
index 762aac2f65..0000000000
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
+++ /dev/null
@@ -1,334 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QPAINTENGINEEX_OPENGL2_P_H
-#define QPAINTENGINEEX_OPENGL2_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QDebug>
-
-#include <private/qpaintengineex_p.h>
-#include <private/qglengineshadermanager_p.h>
-#include <private/qgl2pexvertexarray_p.h>
-#include <private/qglpaintdevice_p.h>
-#include <private/qfontengine_p.h>
-#include <private/qdatabuffer_p.h>
-#include <private/qtriangulatingstroker_p.h>
-#include <private/qopenglextensions_p.h>
-
-enum EngineMode {
- ImageDrawingMode,
- TextDrawingMode,
- BrushDrawingMode,
- ImageArrayDrawingMode
-};
-
-QT_BEGIN_NAMESPACE
-
-#define GL_STENCIL_HIGH_BIT GLuint(0x80)
-#define QT_BRUSH_TEXTURE_UNIT GLuint(0)
-#define QT_IMAGE_TEXTURE_UNIT GLuint(0) //Can be the same as brush texture unit
-#define QT_MASK_TEXTURE_UNIT GLuint(1)
-#define QT_BACKGROUND_TEXTURE_UNIT GLuint(2)
-
-class QGL2PaintEngineExPrivate;
-
-
-class QGL2PaintEngineState : public QPainterState
-{
-public:
- QGL2PaintEngineState(QGL2PaintEngineState &other);
- QGL2PaintEngineState();
- ~QGL2PaintEngineState();
-
- uint isNew : 1;
- uint needsClipBufferClear : 1;
- uint clipTestEnabled : 1;
- uint canRestoreClip : 1;
- uint matrixChanged : 1;
- uint compositionModeChanged : 1;
- uint opacityChanged : 1;
- uint renderHintsChanged : 1;
- uint clipChanged : 1;
- uint currentClip : 8;
-
- QRect rectangleClip;
-};
-
-class Q_OPENGL_EXPORT QGL2PaintEngineEx : public QPaintEngineEx
-{
- Q_DECLARE_PRIVATE(QGL2PaintEngineEx)
-public:
- QGL2PaintEngineEx();
- ~QGL2PaintEngineEx();
-
- bool begin(QPaintDevice *device) override;
- void ensureActive();
- bool end() override;
-
- virtual void clipEnabledChanged() override;
- virtual void penChanged() override;
- virtual void brushChanged() override;
- virtual void brushOriginChanged() override;
- virtual void opacityChanged() override;
- virtual void compositionModeChanged() override;
- virtual void renderHintsChanged() override;
- virtual void transformChanged() override;
-
- virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) override;
- virtual void drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap,
- QPainter::PixmapFragmentHints hints) override;
- virtual void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
- Qt::ImageConversionFlags flags = Qt::AutoColor) override;
- virtual void drawTextItem(const QPointF &p, const QTextItem &textItem) override;
- virtual void fill(const QVectorPath &path, const QBrush &brush) override;
- virtual void stroke(const QVectorPath &path, const QPen &pen) override;
- virtual void clip(const QVectorPath &path, Qt::ClipOperation op) override;
-
- virtual void drawStaticTextItem(QStaticTextItem *textItem) override;
-
- bool drawTexture(const QRectF &r, GLuint textureId, const QSize &size, const QRectF &sr);
-
- Type type() const override { return OpenGL2; }
-
- virtual void setState(QPainterState *s) override;
- virtual QPainterState *createState(QPainterState *orig) const override;
- inline QGL2PaintEngineState *state() {
- return static_cast<QGL2PaintEngineState *>(QPaintEngineEx::state());
- }
- inline const QGL2PaintEngineState *state() const {
- return static_cast<const QGL2PaintEngineState *>(QPaintEngineEx::state());
- }
-
- void beginNativePainting() override;
- void endNativePainting() override;
-
- void invalidateState();
-
- void setRenderTextActive(bool);
-
- bool isNativePaintingActive() const;
- bool requiresPretransformedGlyphPositions(QFontEngine *, const QTransform &) const override { return false; }
- bool shouldDrawCachedGlyphs(QFontEngine *, const QTransform &) const override;
-
- void setTranslateZ(GLfloat z);
-
-private:
- Q_DISABLE_COPY_MOVE(QGL2PaintEngineEx)
-};
-
-class QGL2PaintEngineExPrivate : public QPaintEngineExPrivate, protected QOpenGLExtensions
-{
- Q_DECLARE_PUBLIC(QGL2PaintEngineEx)
-public:
- enum StencilFillMode {
- OddEvenFillMode,
- WindingFillMode,
- TriStripStrokeFillMode
- };
-
- QGL2PaintEngineExPrivate(QGL2PaintEngineEx *q_ptr) :
- q(q_ptr),
- shaderManager(nullptr),
- width(0), height(0),
- ctx(nullptr),
- useSystemClip(true),
- elementIndicesVBOId(0),
- opacityArray(0),
- snapToPixelGrid(false),
- nativePaintingActive(false),
- inverseScale(1),
- lastMaskTextureUsed(0),
- translateZ(0)
- { }
-
- ~QGL2PaintEngineExPrivate();
-
- void updateBrushTexture();
- void updateBrushUniforms();
- void updateMatrix();
- void updateCompositionMode();
- void updateTextureFilter(GLenum target, GLenum wrapMode, bool smoothPixmapTransform, GLuint id = GLuint(-1));
-
- void resetGLState();
- bool resetOpenGLContextActiveEngine();
-
- // fill, stroke, drawTexture, drawPixmaps & drawCachedGlyphs are the main rendering entry-points,
- // however writeClip can also be thought of as en entry point as it does similar things.
- void fill(const QVectorPath &path);
- void stroke(const QVectorPath &path, const QPen &pen);
- void drawTexture(const QGLRect& dest, const QGLRect& src, const QSize &textureSize, bool opaque, bool pattern = false);
- void drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap,
- QPainter::PixmapFragmentHints hints);
- void drawCachedGlyphs(QFontEngine::GlyphFormat glyphFormat, QStaticTextItem *staticTextItem);
-
- // Calls glVertexAttributePointer if the pointer has changed
- inline void setVertexAttributePointer(unsigned int arrayIndex, const GLfloat *pointer);
-
- // draws whatever is in the vertex array:
- void drawVertexArrays(const float *data, int *stops, int stopCount, GLenum primitive);
- void drawVertexArrays(QGL2PEXVertexArray &vertexArray, GLenum primitive) {
- drawVertexArrays((const float *) vertexArray.data(), vertexArray.stops(), vertexArray.stopCount(), primitive);
- }
-
- // Composites the bounding rect onto dest buffer:
- void composite(const QGLRect& boundingRect);
-
- // Calls drawVertexArrays to render into stencil buffer:
- void fillStencilWithVertexArray(const float *data, int count, int *stops, int stopCount, const QGLRect &bounds, StencilFillMode mode);
- void fillStencilWithVertexArray(QGL2PEXVertexArray& vertexArray, bool useWindingFill) {
- fillStencilWithVertexArray((const float *) vertexArray.data(), 0, vertexArray.stops(), vertexArray.stopCount(),
- vertexArray.boundingRect(),
- useWindingFill ? WindingFillMode : OddEvenFillMode);
- }
-
- void setBrush(const QBrush& brush);
- void transferMode(EngineMode newMode);
- bool prepareForDraw(bool srcPixelsAreOpaque); // returns true if the program has changed
- bool prepareForCachedGlyphDraw(const QFontEngineGlyphCache &cache);
- inline void useSimpleShader();
- inline GLuint location(const QGLEngineShaderManager::Uniform uniform) {
- return shaderManager->getUniformLocation(uniform);
- }
-
- void clearClip(uint value);
- void writeClip(const QVectorPath &path, uint value);
- void resetClipIfNeeded();
-
- void updateClipScissorTest();
- void setScissor(const QRect &rect);
- void regenerateClip();
- void systemStateChanged() override;
-
-
- static QGLEngineShaderManager* shaderManagerForEngine(QGL2PaintEngineEx *engine) { return engine->d_func()->shaderManager; }
- static QGL2PaintEngineExPrivate *getData(QGL2PaintEngineEx *engine) { return engine->d_func(); }
- static void cleanupVectorPath(QPaintEngineEx *engine, void *data);
-
-
- QGL2PaintEngineEx* q;
- QGLEngineShaderManager* shaderManager;
- QGLPaintDevice* device;
- int width, height;
- QGLContext *ctx;
- EngineMode mode;
- QFontEngine::GlyphFormat glyphCacheFormat;
-
- // Dirty flags
- bool matrixDirty; // Implies matrix uniforms are also dirty
- bool compositionModeDirty;
- bool brushTextureDirty;
- bool brushUniformsDirty;
- bool opacityUniformDirty;
- bool matrixUniformDirty;
- bool translateZUniformDirty;
-
- bool stencilClean; // Has the stencil not been used for clipping so far?
- bool useSystemClip;
- QRegion dirtyStencilRegion;
- QRect currentScissorBounds;
- uint maxClip;
-
- QBrush currentBrush; // May not be the state's brush!
- const QBrush noBrush;
-
- QPixmap currentBrushPixmap;
-
- QGL2PEXVertexArray vertexCoordinateArray;
- QGL2PEXVertexArray textureCoordinateArray;
- QVector<GLushort> elementIndices;
- GLuint elementIndicesVBOId;
- QDataBuffer<GLfloat> opacityArray;
- GLfloat staticVertexCoordinateArray[8];
- GLfloat staticTextureCoordinateArray[8];
-
- bool snapToPixelGrid;
- bool nativePaintingActive;
- GLfloat pmvMatrix[3][3];
- GLfloat inverseScale;
-
- GLuint lastTextureUsed;
- GLuint lastMaskTextureUsed;
-
- bool needsSync;
- bool multisamplingAlwaysEnabled;
-
- GLfloat depthRange[2];
-
- float textureInvertedY;
-
- QTriangulatingStroker stroker;
- QDashedStrokeProcessor dasher;
-
- QSet<QVectorPath::CacheEntry *> pathCaches;
- QVector<GLuint> unusedVBOSToClean;
- QVector<GLuint> unusedIBOSToClean;
-
- const GLfloat *vertexAttribPointers[3];
-
- GLfloat translateZ;
-};
-
-
-void QGL2PaintEngineExPrivate::setVertexAttributePointer(unsigned int arrayIndex, const GLfloat *pointer)
-{
- Q_ASSERT(arrayIndex < 3);
- if (pointer == vertexAttribPointers[arrayIndex])
- return;
-
- vertexAttribPointers[arrayIndex] = pointer;
- if (arrayIndex == QT_OPACITY_ATTR)
- glVertexAttribPointer(arrayIndex, 1, GL_FLOAT, GL_FALSE, 0, pointer);
- else
- glVertexAttribPointer(arrayIndex, 2, GL_FLOAT, GL_FALSE, 0, pointer);
-}
-
-QT_END_NAMESPACE
-
-#endif // QPAINTENGINEEX_OPENGL2_P_H
diff --git a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp b/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp
deleted file mode 100644
index d5ce4efd1a..0000000000
--- a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp
+++ /dev/null
@@ -1,414 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qtextureglyphcache_gl_p.h"
-#include "qpaintengineex_opengl2_p.h"
-#include "qglfunctions.h"
-#include "private/qglengineshadersource_p.h"
-
-QT_BEGIN_NAMESPACE
-
-
-static int next_qgltextureglyphcache_serial_number()
-{
- static QBasicAtomicInt serial = Q_BASIC_ATOMIC_INITIALIZER(0);
- return 1 + serial.fetchAndAddRelaxed(1);
-}
-
-QGLTextureGlyphCache::QGLTextureGlyphCache(QFontEngine::GlyphFormat format, const QTransform &matrix)
- : QImageTextureGlyphCache(format, matrix)
- , m_textureResource(0)
- , pex(0)
- , m_blitProgram(0)
- , m_filterMode(Nearest)
- , m_serialNumber(next_qgltextureglyphcache_serial_number())
-{
-#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
- qDebug(" -> QGLTextureGlyphCache() %p for context %p.", this, QOpenGLContext::currentContext());
-#endif
- m_vertexCoordinateArray[0] = -1.0f;
- m_vertexCoordinateArray[1] = -1.0f;
- m_vertexCoordinateArray[2] = 1.0f;
- m_vertexCoordinateArray[3] = -1.0f;
- m_vertexCoordinateArray[4] = 1.0f;
- m_vertexCoordinateArray[5] = 1.0f;
- m_vertexCoordinateArray[6] = -1.0f;
- m_vertexCoordinateArray[7] = 1.0f;
-
- m_textureCoordinateArray[0] = 0.0f;
- m_textureCoordinateArray[1] = 0.0f;
- m_textureCoordinateArray[2] = 1.0f;
- m_textureCoordinateArray[3] = 0.0f;
- m_textureCoordinateArray[4] = 1.0f;
- m_textureCoordinateArray[5] = 1.0f;
- m_textureCoordinateArray[6] = 0.0f;
- m_textureCoordinateArray[7] = 1.0f;
-}
-
-QGLTextureGlyphCache::~QGLTextureGlyphCache()
-{
-#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
- qDebug(" -> ~QGLTextureGlyphCache() %p.", this);
-#endif
- delete m_blitProgram;
- if (m_textureResource)
- m_textureResource->free();
-}
-
-void QGLTextureGlyphCache::createTextureData(int width, int height)
-{
- QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
- if (ctx == 0) {
- qWarning("QGLTextureGlyphCache::createTextureData: Called with no context");
- return;
- }
- QOpenGLFunctions *funcs = ctx->contextHandle()->functions();
-
- // create in QImageTextureGlyphCache baseclass is meant to be called
- // only to create the initial image and does not preserve the content,
- // so we don't call when this function is called from resize.
- if ((!QGLFramebufferObject::hasOpenGLFramebufferObjects() || ctx->d_ptr->workaround_brokenFBOReadBack) && image().isNull())
- QImageTextureGlyphCache::createTextureData(width, height);
-
- // Make the lower glyph texture size 16 x 16.
- if (width < 16)
- width = 16;
- if (height < 16)
- height = 16;
-
- if (m_textureResource && !m_textureResource->m_texture) {
- delete m_textureResource;
- m_textureResource = 0;
- }
-
- if (!m_textureResource)
- m_textureResource = new QGLGlyphTexture(ctx);
-
- funcs->glGenTextures(1, &m_textureResource->m_texture);
- funcs->glBindTexture(GL_TEXTURE_2D, m_textureResource->m_texture);
-
- m_textureResource->m_width = width;
- m_textureResource->m_height = height;
-
- if (m_format == QFontEngine::Format_A32) {
- QVarLengthArray<uchar> data(width * height * 4);
- for (int i = 0; i < data.size(); ++i)
- data[i] = 0;
- funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);
- } else {
- QVarLengthArray<uchar> data(width * height);
- for (int i = 0; i < data.size(); ++i)
- data[i] = 0;
- funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &data[0]);
- }
-
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- m_filterMode = Nearest;
-}
-
-void QGLTextureGlyphCache::resizeTextureData(int width, int height)
-{
- QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
- if (ctx == 0) {
- qWarning("QGLTextureGlyphCache::resizeTextureData: Called with no context");
- return;
- }
- QOpenGLFunctions *funcs = ctx->contextHandle()->functions();
-
- int oldWidth = m_textureResource->m_width;
- int oldHeight = m_textureResource->m_height;
-
- // Make the lower glyph texture size 16 x 16.
- if (width < 16)
- width = 16;
- if (height < 16)
- height = 16;
-
- GLuint oldTexture = m_textureResource->m_texture;
- createTextureData(width, height);
-
- if (!QGLFramebufferObject::hasOpenGLFramebufferObjects() || ctx->d_ptr->workaround_brokenFBOReadBack) {
- QImageTextureGlyphCache::resizeTextureData(width, height);
- Q_ASSERT(image().depth() == 8);
- funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, oldHeight, GL_ALPHA, GL_UNSIGNED_BYTE, image().constBits());
- funcs->glDeleteTextures(1, &oldTexture);
- return;
- }
-
- // ### the QTextureGlyphCache API needs to be reworked to allow
- // ### resizeTextureData to fail
-
- ctx->d_ptr->refreshCurrentFbo();
-
- funcs->glBindFramebuffer(GL_FRAMEBUFFER, m_textureResource->m_fbo);
-
- GLuint tmp_texture;
- funcs->glGenTextures(1, &tmp_texture);
- funcs->glBindTexture(GL_TEXTURE_2D, tmp_texture);
- funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, oldWidth, oldHeight, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- m_filterMode = Nearest;
- funcs->glBindTexture(GL_TEXTURE_2D, 0);
- funcs->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D, tmp_texture, 0);
-
- funcs->glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
- funcs->glBindTexture(GL_TEXTURE_2D, oldTexture);
-
- if (pex != 0)
- pex->transferMode(BrushDrawingMode);
-
- funcs->glDisable(GL_STENCIL_TEST);
- funcs->glDisable(GL_DEPTH_TEST);
- funcs->glDisable(GL_SCISSOR_TEST);
- funcs->glDisable(GL_BLEND);
-
- funcs->glViewport(0, 0, oldWidth, oldHeight);
-
- QGLShaderProgram *blitProgram = 0;
- if (pex == 0) {
- if (m_blitProgram == 0) {
- m_blitProgram = new QGLShaderProgram(ctx);
-
- {
- QString source;
- source.append(QLatin1String(qglslMainWithTexCoordsVertexShader));
- source.append(QLatin1String(qglslUntransformedPositionVertexShader));
-
- QGLShader *vertexShader = new QGLShader(QGLShader::Vertex, m_blitProgram);
- vertexShader->compileSourceCode(source);
-
- m_blitProgram->addShader(vertexShader);
- }
-
- {
- QString source;
- source.append(QLatin1String(qglslMainFragmentShader));
- source.append(QLatin1String(qglslImageSrcFragmentShader));
-
- QGLShader *fragmentShader = new QGLShader(QGLShader::Fragment, m_blitProgram);
- fragmentShader->compileSourceCode(source);
-
- m_blitProgram->addShader(fragmentShader);
- }
-
- m_blitProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- m_blitProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
-
- m_blitProgram->link();
- }
-
- funcs->glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, m_vertexCoordinateArray);
- funcs->glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, m_textureCoordinateArray);
-
- m_blitProgram->bind();
- m_blitProgram->enableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
- m_blitProgram->enableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
- m_blitProgram->disableAttributeArray(int(QT_OPACITY_ATTR));
-
- blitProgram = m_blitProgram;
-
- } else {
- pex->setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, m_vertexCoordinateArray);
- pex->setVertexAttributePointer(QT_TEXTURE_COORDS_ATTR, m_textureCoordinateArray);
-
- pex->shaderManager->useBlitProgram();
- blitProgram = pex->shaderManager->blitProgram();
- }
-
- blitProgram->setUniformValue("imageTexture", QT_IMAGE_TEXTURE_UNIT);
-
- funcs->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
- funcs->glBindTexture(GL_TEXTURE_2D, m_textureResource->m_texture);
-
- funcs->glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, oldWidth, oldHeight);
-
- funcs->glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_RENDERBUFFER, 0);
- funcs->glDeleteTextures(1, &tmp_texture);
- funcs->glDeleteTextures(1, &oldTexture);
-
- funcs->glBindFramebuffer(GL_FRAMEBUFFER, ctx->d_ptr->current_fbo);
-
- if (pex != 0) {
- funcs->glViewport(0, 0, pex->width, pex->height);
- pex->updateClipScissorTest();
- }
-}
-
-void QGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed subPixelPosition)
-{
- QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
- if (ctx == 0) {
- qWarning("QGLTextureGlyphCache::fillTexture: Called with no context");
- return;
- }
- QOpenGLFunctions *funcs = ctx->contextHandle()->functions();
-
- if (!QGLFramebufferObject::hasOpenGLFramebufferObjects() || ctx->d_ptr->workaround_brokenFBOReadBack) {
- QImageTextureGlyphCache::fillTexture(c, glyph, subPixelPosition);
-
- funcs->glBindTexture(GL_TEXTURE_2D, m_textureResource->m_texture);
- const QImage &texture = image();
- const uchar *bits = texture.constBits();
- bits += c.y * texture.bytesPerLine() + c.x;
- for (int i=0; i<c.h; ++i) {
- funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y + i, c.w, 1, GL_ALPHA, GL_UNSIGNED_BYTE, bits);
- bits += texture.bytesPerLine();
- }
- return;
- }
-
- QImage mask = textureMapForGlyph(glyph, subPixelPosition);
- const int maskWidth = mask.width();
- const int maskHeight = mask.height();
-
- if (mask.format() == QImage::Format_Mono) {
- mask = mask.convertToFormat(QImage::Format_Indexed8);
- for (int y = 0; y < maskHeight; ++y) {
- uchar *src = (uchar *) mask.scanLine(y);
- for (int x = 0; x < maskWidth; ++x)
- src[x] = -src[x]; // convert 0 and 1 into 0 and 255
- }
- } else if (mask.depth() == 32) {
- // Make the alpha component equal to the average of the RGB values.
- // This is needed when drawing sub-pixel antialiased text on translucent targets.
- for (int y = 0; y < maskHeight; ++y) {
- quint32 *src = (quint32 *) mask.scanLine(y);
- for (int x = 0; x < maskWidth; ++x) {
- int r = qRed(src[x]);
- int g = qGreen(src[x]);
- int b = qBlue(src[x]);
- int avg;
- if (mask.format() == QImage::Format_RGB32)
- avg = (r + g + b + 1) / 3; // "+1" for rounding.
- else // Format_ARGB_Premultiplied
- avg = qAlpha(src[x]);
- if (ctx->contextHandle()->isOpenGLES()) {
- // swizzle the bits to accommodate for the GL_RGBA upload.
- src[x] = (avg << 24) | (r << 0) | (g << 8) | (b << 16);
- } else {
- src[x] = (src[x] & 0x00ffffff) | (avg << 24);
- }
- }
- }
- }
-
- funcs->glBindTexture(GL_TEXTURE_2D, m_textureResource->m_texture);
- if (mask.depth() == 32) {
- GLenum format = GL_RGBA;
-#if !defined(QT_OPENGL_ES_2)
- if (!ctx->contextHandle()->isOpenGLES())
- format = GL_BGRA;
-#endif
- funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, format, GL_UNSIGNED_BYTE, mask.bits());
- } else {
- // glTexSubImage2D() might cause some garbage to appear in the texture if the mask width is
- // not a multiple of four bytes. The bug appeared on a computer with 32-bit Windows Vista
- // and nVidia GeForce 8500GT. GL_UNPACK_ALIGNMENT is set to four bytes, 'mask' has a
- // multiple of four bytes per line, and most of the glyph shows up correctly in the
- // texture, which makes me think that this is a driver bug.
- // One workaround is to make sure the mask width is a multiple of four bytes, for instance
- // by converting it to a format with four bytes per pixel. Another is to copy one line at a
- // time.
-
- if (!ctx->d_ptr->workaround_brokenAlphaTexSubImage_init) {
- // don't know which driver versions exhibit this bug, so be conservative for now
- const QByteArray vendorString(reinterpret_cast<const char*>(funcs->glGetString(GL_VENDOR)));
- ctx->d_ptr->workaround_brokenAlphaTexSubImage = vendorString.indexOf("NVIDIA") >= 0;
- ctx->d_ptr->workaround_brokenAlphaTexSubImage_init = true;
- }
-
- if (ctx->d_ptr->workaround_brokenAlphaTexSubImage) {
- for (int i = 0; i < maskHeight; ++i)
- funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y + i, maskWidth, 1, GL_ALPHA, GL_UNSIGNED_BYTE, mask.scanLine(i));
- } else {
- funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_ALPHA, GL_UNSIGNED_BYTE, mask.bits());
- }
- }
-}
-
-int QGLTextureGlyphCache::glyphPadding() const
-{
- return 1;
-}
-
-int QGLTextureGlyphCache::maxTextureWidth() const
-{
- QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
- if (ctx == 0)
- return QImageTextureGlyphCache::maxTextureWidth();
- else
- return ctx->d_ptr->maxTextureSize();
-}
-
-int QGLTextureGlyphCache::maxTextureHeight() const
-{
- QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
- if (ctx == 0)
- return QImageTextureGlyphCache::maxTextureHeight();
-
- if (ctx->d_ptr->workaround_brokenTexSubImage)
- return qMin(1024, ctx->d_ptr->maxTextureSize());
- else
- return ctx->d_ptr->maxTextureSize();
-}
-
-void QGLTextureGlyphCache::clear()
-{
- m_textureResource->free();
- m_textureResource = 0;
-
- m_w = 0;
- m_h = 0;
- m_cx = 0;
- m_cy = 0;
- m_currentRowHeight = 0;
- coords.clear();
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h b/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h
deleted file mode 100644
index 7c12ce8998..0000000000
--- a/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QTEXTUREGLYPHCACHE_GL_P_H
-#define QTEXTUREGLYPHCACHE_GL_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <private/qtextureglyphcache_p.h>
-#include <private/qgl_p.h>
-#include <qglshaderprogram.h>
-#include <qglframebufferobject.h>
-#include <qopenglfunctions.h>
-
-// #define QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
-
-QT_BEGIN_NAMESPACE
-
-class QGL2PaintEngineExPrivate;
-
-struct QGLGlyphTexture : public QOpenGLSharedResource
-{
- QGLGlyphTexture(const QGLContext *ctx)
- : QOpenGLSharedResource(ctx->contextHandle()->shareGroup())
- , m_fbo(0)
- , m_width(0)
- , m_height(0)
- {
- if (ctx && QGLFramebufferObject::hasOpenGLFramebufferObjects() && !ctx->d_ptr->workaround_brokenFBOReadBack)
- ctx->contextHandle()->functions()->glGenFramebuffers(1, &m_fbo);
-
-#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
- qDebug(" -> QGLGlyphTexture() %p for context %p.", this, ctx);
-#endif
- }
-
- void freeResource(QOpenGLContext *context) override
- {
- const QGLContext *ctx = QGLContext::fromOpenGLContext(context);
-#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
- qDebug("~QGLGlyphTexture() %p for context %p.", this, ctx);
-#else
- Q_UNUSED(ctx);
-#endif
- if (ctx && m_fbo)
- ctx->contextHandle()->functions()->glDeleteFramebuffers(1, &m_fbo);
- if (m_width || m_height)
- ctx->contextHandle()->functions()->glDeleteTextures(1, &m_texture);
- }
-
- void invalidateResource() override
- {
- m_texture = 0;
- m_fbo = 0;
- m_width = 0;
- m_height = 0;
- }
-
- GLuint m_texture;
- GLuint m_fbo;
- int m_width;
- int m_height;
-};
-
-class Q_OPENGL_EXPORT QGLTextureGlyphCache : public QImageTextureGlyphCache
-{
-public:
- QGLTextureGlyphCache(QFontEngine::GlyphFormat format, const QTransform &matrix);
- ~QGLTextureGlyphCache();
-
- virtual void createTextureData(int width, int height) override;
- virtual void resizeTextureData(int width, int height) override;
- virtual void fillTexture(const Coord &c, glyph_t glyph, QFixed subPixelPosition) override;
- virtual int glyphPadding() const override;
- virtual int maxTextureWidth() const override;
- virtual int maxTextureHeight() const override;
-
- inline GLuint texture() const {
- QGLTextureGlyphCache *that = const_cast<QGLTextureGlyphCache *>(this);
- QGLGlyphTexture *glyphTexture = that->m_textureResource;
- return glyphTexture ? glyphTexture->m_texture : 0;
- }
-
- inline int width() const {
- QGLTextureGlyphCache *that = const_cast<QGLTextureGlyphCache *>(this);
- QGLGlyphTexture *glyphTexture = that->m_textureResource;
- return glyphTexture ? glyphTexture->m_width : 0;
- }
- inline int height() const {
- QGLTextureGlyphCache *that = const_cast<QGLTextureGlyphCache *>(this);
- QGLGlyphTexture *glyphTexture = that->m_textureResource;
- return glyphTexture ? glyphTexture->m_height : 0;
- }
-
- inline void setPaintEnginePrivate(QGL2PaintEngineExPrivate *p) { pex = p; }
-
- inline const QOpenGLContextGroup *contextGroup() const { return m_textureResource ? m_textureResource->group() : nullptr; }
-
- inline int serialNumber() const { return m_serialNumber; }
-
- enum FilterMode {
- Nearest,
- Linear
- };
- FilterMode filterMode() const { return m_filterMode; }
- void setFilterMode(FilterMode m) { m_filterMode = m; }
-
- void clear();
-
-private:
- QGLGlyphTexture *m_textureResource;
-
- QGL2PaintEngineExPrivate *pex;
- QGLShaderProgram *m_blitProgram;
- FilterMode m_filterMode;
-
- GLfloat m_vertexCoordinateArray[8];
- GLfloat m_textureCoordinateArray[8];
-
- int m_serialNumber;
-};
-
-QT_END_NAMESPACE
-
-#endif
-
diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro
index 8b2349ff2f..777bca40ec 100644
--- a/src/opengl/opengl.pro
+++ b/src/opengl/opengl.pro
@@ -1,57 +1,132 @@
TARGET = QtOpenGL
-QT = core-private gui-private widgets-private
+QT = core-private gui-private
DEFINES += QT_NO_USING_NAMESPACE QT_NO_FOREACH
-msvc:equals(QT_ARCH, i386): QMAKE_LFLAGS += /BASE:0x63000000
-solaris-cc*:QMAKE_CXXFLAGS_RELEASE -= -O2
-
QMAKE_DOCS = $$PWD/doc/qtopengl.qdocconf
qtConfig(opengl): CONFIG += opengl
qtConfig(opengles2): CONFIG += opengles2
-HEADERS += qgl.h \
- qgl_p.h \
- qglcolormap.h \
- qglfunctions.h \
- qglpixelbuffer.h \
- qglpixelbuffer_p.h \
- qglframebufferobject.h \
- qglframebufferobject_p.h \
- qglpaintdevice_p.h \
- qglbuffer.h \
- qtopenglglobal.h
-
-SOURCES += qgl.cpp \
- qglcolormap.cpp \
- qglfunctions.cpp \
- qglpixelbuffer.cpp \
- qglframebufferobject.cpp \
- qglpaintdevice.cpp \
- qglbuffer.cpp \
-
-HEADERS += qglshaderprogram.h \
- gl2paintengineex/qglgradientcache_p.h \
- gl2paintengineex/qglengineshadermanager_p.h \
- gl2paintengineex/qgl2pexvertexarray_p.h \
- gl2paintengineex/qpaintengineex_opengl2_p.h \
- gl2paintengineex/qglengineshadersource_p.h \
- gl2paintengineex/qglcustomshaderstage_p.h \
- gl2paintengineex/qtextureglyphcache_gl_p.h \
- gl2paintengineex/qglshadercache_p.h
-
-SOURCES += qglshaderprogram.cpp \
- gl2paintengineex/qglgradientcache.cpp \
- gl2paintengineex/qglengineshadermanager.cpp \
- gl2paintengineex/qgl2pexvertexarray.cpp \
- gl2paintengineex/qpaintengineex_opengl2.cpp \
- gl2paintengineex/qglcustomshaderstage.cpp \
- gl2paintengineex/qtextureglyphcache_gl.cpp
-
-qtConfig(graphicseffect) {
- HEADERS += qgraphicsshadereffect_p.h
- SOURCES += qgraphicsshadereffect.cpp
+HEADERS += \
+ qopengl2pexvertexarray_p.h \
+ qopenglbuffer.h \
+ qopenglcustomshaderstage_p.h \
+ qopengldebug.h \
+ qopenglengineshadermanager_p.h \
+ qopenglengineshadersource_p.h \
+ qopenglframebufferobject.h \
+ qopenglframebufferobject_p.h \
+ qopenglgradientcache_p.h \
+ qopenglpaintdevice.h \
+ qopenglpaintdevice_p.h \
+ qopenglpaintengine_p.h \
+ qopenglpixeltransferoptions.h \
+ qopenglshadercache_p.h \
+ qopenglshaderprogram.h \
+ qopengltexture.h \
+ qopengltexture_p.h \
+ qopengltexturehelper_p.h \
+ qopengltextureblitter.h \
+ qopengltexturecache_p.h \
+ qopengltextureglyphcache_p.h \
+ qopengltextureuploader_p.h \
+ qopenglversionfunctions.h \
+ qopenglversionfunctions_p.h \
+ qopenglversionfunctionsfactory.h \
+ qopenglversionprofile.h \
+ qopenglvertexarrayobject.h \
+ qopenglwindow.h \
+ qtopenglglobal.h
+
+SOURCES += \
+ qopengl2pexvertexarray.cpp \
+ qopenglbuffer.cpp \
+ qopenglcustomshaderstage.cpp \
+ qopenglengineshadermanager.cpp \
+ qopenglframebufferobject.cpp \
+ qopenglgradientcache.cpp \
+ qopenglpaintdevice.cpp \
+ qopenglpaintengine.cpp \
+ qopenglpixeltransferoptions.cpp \
+ qopenglshaderprogram.cpp \
+ qopengltexture.cpp \
+ qopengltexturehelper.cpp \
+ qopengltextureblitter.cpp \
+ qopengltexturecache.cpp \
+ qopengltextureglyphcache.cpp \
+ qopengltextureuploader.cpp \
+ qopenglversionfunctions.cpp \
+ qopenglversionfunctionsfactory.cpp \
+ qopenglversionprofile.cpp \
+ qopenglvertexarrayobject.cpp \
+ qopenglwindow.cpp \
+ qopengldebug.cpp
+
+!qtConfig(opengles2) {
+ HEADERS += \
+ qopenglfunctions_1_0.h \
+ qopenglfunctions_1_1.h \
+ qopenglfunctions_1_2.h \
+ qopenglfunctions_1_3.h \
+ qopenglfunctions_1_4.h \
+ qopenglfunctions_1_5.h \
+ qopenglfunctions_2_0.h \
+ qopenglfunctions_2_1.h \
+ qopenglfunctions_3_0.h \
+ qopenglfunctions_3_1.h \
+ qopenglfunctions_3_2_core.h \
+ qopenglfunctions_3_3_core.h \
+ qopenglfunctions_4_0_core.h \
+ qopenglfunctions_4_1_core.h \
+ qopenglfunctions_4_2_core.h \
+ qopenglfunctions_4_3_core.h \
+ qopenglfunctions_4_4_core.h \
+ qopenglfunctions_4_5_core.h \
+ qopenglfunctions_3_2_compatibility.h \
+ qopenglfunctions_3_3_compatibility.h \
+ qopenglfunctions_4_0_compatibility.h \
+ qopenglfunctions_4_1_compatibility.h \
+ qopenglfunctions_4_2_compatibility.h \
+ qopenglfunctions_4_3_compatibility.h \
+ qopenglfunctions_4_4_compatibility.h \
+ qopenglfunctions_4_5_compatibility.h \
+ qopenglqueryhelper_p.h \
+ qopengltimerquery.h
+
+ SOURCES += \
+ qopenglfunctions_1_0.cpp \
+ qopenglfunctions_1_1.cpp \
+ qopenglfunctions_1_2.cpp \
+ qopenglfunctions_1_3.cpp \
+ qopenglfunctions_1_4.cpp \
+ qopenglfunctions_1_5.cpp \
+ qopenglfunctions_2_0.cpp \
+ qopenglfunctions_2_1.cpp \
+ qopenglfunctions_3_0.cpp \
+ qopenglfunctions_3_1.cpp \
+ qopenglfunctions_3_2_core.cpp \
+ qopenglfunctions_3_3_core.cpp \
+ qopenglfunctions_4_0_core.cpp \
+ qopenglfunctions_4_1_core.cpp \
+ qopenglfunctions_4_2_core.cpp \
+ qopenglfunctions_4_3_core.cpp \
+ qopenglfunctions_4_4_core.cpp \
+ qopenglfunctions_4_5_core.cpp \
+ qopenglfunctions_3_2_compatibility.cpp \
+ qopenglfunctions_3_3_compatibility.cpp \
+ qopenglfunctions_4_0_compatibility.cpp \
+ qopenglfunctions_4_1_compatibility.cpp \
+ qopenglfunctions_4_2_compatibility.cpp \
+ qopenglfunctions_4_3_compatibility.cpp \
+ qopenglfunctions_4_4_compatibility.cpp \
+ qopenglfunctions_4_5_compatibility.cpp \
+ qopengltimerquery.cpp
+}
+
+qtConfig(opengles2) {
+ HEADERS += qopenglfunctions_es2.h
+ SOURCES += qopenglfunctions_es2.cpp
}
load(qt_module)
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
deleted file mode 100644
index 4108b70094..0000000000
--- a/src/opengl/qgl.cpp
+++ /dev/null
@@ -1,5558 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qapplication.h"
-#include "qplatformdefs.h"
-#include "qgl.h"
-#include <qdebug.h>
-#include <qglfunctions.h>
-
-#include <qdatetime.h>
-
-#include <stdlib.h> // malloc
-
-#include "qpixmap.h"
-#include "qimage.h"
-#include "qgl_p.h"
-
-#include "gl2paintengineex/qpaintengineex_opengl2_p.h"
-
-#include <qpa/qplatformopenglcontext.h>
-
-#include <qglpixelbuffer.h>
-#include <qglframebufferobject.h>
-#include <private/qopenglextensions_p.h>
-
-#include <private/qimage_p.h>
-#include <qpa/qplatformpixmap.h>
-#include <private/qglpixelbuffer_p.h>
-#include <private/qimagepixmapcleanuphooks_p.h>
-#include "qcolormap.h"
-#include "qfile.h"
-#include <qmutex.h>
-
-#include "qsurfaceformat.h"
-#include <private/qapplication_p.h>
-#include <qpa/qplatformopenglcontext.h>
-#include <qpa/qplatformwindow.h>
-
-#ifndef QT_OPENGL_ES_2
-#include <qopenglfunctions_1_1.h>
-#endif
-
-// #define QT_GL_CONTEXT_RESOURCE_DEBUG
-
-QT_BEGIN_NAMESPACE
-
-class QGLDefaultExtensions
-{
-public:
- QGLDefaultExtensions()
- {
- QGLTemporaryContext tempContext;
- Q_ASSERT(QOpenGLContext::currentContext());
- QOpenGLExtensions *ext = qgl_extensions();
- Q_ASSERT(ext);
- extensions = ext->openGLExtensions();
- features = ext->openGLFeatures();
- }
-
- QOpenGLFunctions::OpenGLFeatures features;
- QOpenGLExtensions::OpenGLExtensions extensions;
-};
-
-Q_GLOBAL_STATIC(QGLDefaultExtensions, qtDefaultExtensions)
-
-bool qgl_hasFeature(QOpenGLFunctions::OpenGLFeature feature)
-{
- if (QOpenGLContext::currentContext())
- return QOpenGLContext::currentContext()->functions()->hasOpenGLFeature(feature);
- return qtDefaultExtensions()->features & feature;
-}
-
-bool qgl_hasExtension(QOpenGLExtensions::OpenGLExtension extension)
-{
- if (QOpenGLContext::currentContext())
- return qgl_extensions()->hasOpenGLExtension(extension);
- return qtDefaultExtensions()->extensions & extension;
-}
-
-QOpenGLExtensions::OpenGLExtensions extensions;
-
-/*
- Returns the GL extensions for the current QOpenGLContext. If there is no
- current QOpenGLContext, a default context will be created and the extensions
- for that context will be returned instead.
-*/
-QOpenGLExtensions* qgl_extensions()
-{
- if (QOpenGLContext *context = QOpenGLContext::currentContext())
- return static_cast<QOpenGLExtensions *>(context->functions());
-
- Q_ASSERT(false);
- return 0;
-}
-
-QOpenGLFunctions *qgl_functions()
-{
- return qgl_extensions(); // QOpenGLExtensions is just a subclass of QOpenGLFunctions
-}
-
-#ifndef QT_OPENGL_ES_2
-QOpenGLFunctions_1_1 *qgl1_functions()
-{
- QOpenGLFunctions_1_1 *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_1_1>();
- f->initializeOpenGLFunctions();
- return f;
-}
-#endif
-
-struct QGLThreadContext {
- ~QGLThreadContext() {
- if (context)
- context->doneCurrent();
- }
- QGLContext *context;
-};
-
-Q_GLOBAL_STATIC(QGLFormat, qgl_default_format)
-
-class QGLDefaultOverlayFormat: public QGLFormat
-{
-public:
- inline QGLDefaultOverlayFormat()
- {
- setOption(QGL::FormatOption(0xffffU << 16)); // turn off all options
- setOption(QGL::DirectRendering);
- setPlane(1);
- }
-};
-Q_GLOBAL_STATIC(QGLDefaultOverlayFormat, defaultOverlayFormatInstance)
-
-Q_GLOBAL_STATIC(QGLSignalProxy, theSignalProxy)
-QGLSignalProxy *QGLSignalProxy::instance()
-{
- QGLSignalProxy *proxy = theSignalProxy();
- if (proxy && qApp && proxy->thread() != qApp->thread()) {
- if (proxy->thread() == QThread::currentThread())
- proxy->moveToThread(qApp->thread());
- }
- return proxy;
-}
-
-
-/*!
- \namespace QGL
- \inmodule QtOpenGL
-
- \brief The QGL namespace specifies miscellaneous identifiers used
- in the Qt OpenGL module.
-*/
-
-/*!
- \enum QGL::FormatOption
-
- This enum specifies the format options that can be used to configure an OpenGL
- context. These are set using QGLFormat::setOption().
-
- \value DoubleBuffer Specifies the use of double buffering.
- \value DepthBuffer Enables the use of a depth buffer.
- \value Rgba Specifies that the context should use RGBA as its pixel format.
- \value AlphaChannel Enables the use of an alpha channel.
- \value AccumBuffer Enables the use of an accumulation buffer.
- \value StencilBuffer Enables the use of a stencil buffer.
- \value StereoBuffers Enables the use of a stereo buffers for use with visualization hardware.
- \value DirectRendering Specifies that the context is used for direct rendering to a display.
- \value HasOverlay Enables the use of an overlay.
- \value SampleBuffers Enables the use of sample buffers.
- \value DeprecatedFunctions Enables the use of deprecated functionality for OpenGL 3.x
- contexts. A context with deprecated functionality enabled is
- called a full context in the OpenGL specification.
- \value SingleBuffer Specifies the use of a single buffer, as opposed to double buffers.
- \value NoDepthBuffer Disables the use of a depth buffer.
- \value ColorIndex Specifies that the context should use a color index as its pixel format.
- \value NoAlphaChannel Disables the use of an alpha channel.
- \value NoAccumBuffer Disables the use of an accumulation buffer.
- \value NoStencilBuffer Disables the use of a stencil buffer.
- \value NoStereoBuffers Disables the use of stereo buffers.
- \value IndirectRendering Specifies that the context is used for indirect rendering to a buffer.
- \value NoOverlay Disables the use of an overlay.
- \value NoSampleBuffers Disables the use of sample buffers.
- \value NoDeprecatedFunctions Disables the use of deprecated functionality for OpenGL 3.x
- contexts. A context with deprecated functionality disabled is
- called a forward compatible context in the OpenGL specification.
-*/
-
-/*****************************************************************************
- QGLFormat implementation
- *****************************************************************************/
-
-
-/*!
- \class QGLFormat
- \inmodule QtOpenGL
- \obsolete
-
- \brief The QGLFormat class specifies the display format of an OpenGL
- rendering context.
-
- A display format has several characteristics:
- \list
- \li \l{setDoubleBuffer()}{Double or single buffering.}
- \li \l{setDepth()}{Depth buffer.}
- \li \l{setRgba()}{RGBA or color index mode.}
- \li \l{setAlpha()}{Alpha channel.}
- \li \l{setAccum()}{Accumulation buffer.}
- \li \l{setStencil()}{Stencil buffer.}
- \li \l{setStereo()}{Stereo buffers.}
- \li \l{setDirectRendering()}{Direct rendering.}
- \li \l{setOverlay()}{Presence of an overlay.}
- \li \l{setPlane()}{Plane of an overlay.}
- \li \l{setSampleBuffers()}{Multisample buffers.}
- \endlist
-
- You can also specify preferred bit depths for the color buffer,
- depth buffer, alpha buffer, accumulation buffer and the stencil
- buffer with the functions: setRedBufferSize(), setGreenBufferSize(),
- setBlueBufferSize(), setDepthBufferSize(), setAlphaBufferSize(),
- setAccumBufferSize() and setStencilBufferSize().
-
- Note that even if you specify that you prefer a 32 bit depth
- buffer (e.g. with setDepthBufferSize(32)), the format that is
- chosen may not have a 32 bit depth buffer, even if there is a
- format available with a 32 bit depth buffer. The main reason for
- this is how the system dependant picking algorithms work on the
- different platforms, and some format options may have higher
- precedence than others.
-
- You create and tell a QGLFormat object what rendering options you
- want from an OpenGL rendering context.
-
- OpenGL drivers or accelerated hardware may or may not support
- advanced features such as alpha channel or stereographic viewing.
- If you request some features that the driver/hardware does not
- provide when you create a QGLWidget, you will get a rendering
- context with the nearest subset of features.
-
- There are different ways to define the display characteristics of
- a rendering context. One is to create a QGLFormat and make it the
- default for the entire application:
- \snippet code/src_opengl_qgl.cpp 0
-
- Or you can specify the desired format when creating an object of
- your QGLWidget subclass:
- \snippet code/src_opengl_qgl.cpp 1
-
- After the widget has been created, you can find out which of the
- requested features the system was able to provide:
- \snippet code/src_opengl_qgl.cpp 2
-
- \legalese
- OpenGL is a trademark of Silicon Graphics, Inc. in the
- United States and other countries.
- \endlegalese
-
- \sa QGLContext, QGLWidget
-*/
-
-#ifndef QT_OPENGL_ES
-
-static inline void transform_point(GLdouble out[4], const GLdouble m[16], const GLdouble in[4])
-{
-#define M(row,col) m[col*4+row]
- out[0] =
- M(0, 0) * in[0] + M(0, 1) * in[1] + M(0, 2) * in[2] + M(0, 3) * in[3];
- out[1] =
- M(1, 0) * in[0] + M(1, 1) * in[1] + M(1, 2) * in[2] + M(1, 3) * in[3];
- out[2] =
- M(2, 0) * in[0] + M(2, 1) * in[1] + M(2, 2) * in[2] + M(2, 3) * in[3];
- out[3] =
- M(3, 0) * in[0] + M(3, 1) * in[1] + M(3, 2) * in[2] + M(3, 3) * in[3];
-#undef M
-}
-
-static inline GLint qgluProject(GLdouble objx, GLdouble objy, GLdouble objz,
- const GLdouble model[16], const GLdouble proj[16],
- const GLint viewport[4],
- GLdouble * winx, GLdouble * winy, GLdouble * winz)
-{
- GLdouble in[4], out[4];
-
- in[0] = objx;
- in[1] = objy;
- in[2] = objz;
- in[3] = 1.0;
- transform_point(out, model, in);
- transform_point(in, proj, out);
-
- if (in[3] == 0.0)
- return GL_FALSE;
-
- in[0] /= in[3];
- in[1] /= in[3];
- in[2] /= in[3];
-
- *winx = viewport[0] + (1 + in[0]) * viewport[2] / 2;
- *winy = viewport[1] + (1 + in[1]) * viewport[3] / 2;
-
- *winz = (1 + in[2]) / 2;
- return GL_TRUE;
-}
-
-#endif // !QT_OPENGL_ES
-
-/*!
- Constructs a QGLFormat object with the following default settings:
- \list
- \li \l{setDoubleBuffer()}{Double buffer:} Enabled.
- \li \l{setDepth()}{Depth buffer:} Enabled.
- \li \l{setRgba()}{RGBA:} Enabled (i.e., color index disabled).
- \li \l{setAlpha()}{Alpha channel:} Disabled.
- \li \l{setAccum()}{Accumulator buffer:} Disabled.
- \li \l{setStencil()}{Stencil buffer:} Enabled.
- \li \l{setStereo()}{Stereo:} Disabled.
- \li \l{setDirectRendering()}{Direct rendering:} Enabled.
- \li \l{setOverlay()}{Overlay:} Disabled.
- \li \l{setPlane()}{Plane:} 0 (i.e., normal plane).
- \li \l{setSampleBuffers()}{Multisample buffers:} Disabled.
- \endlist
-*/
-
-QGLFormat::QGLFormat()
-{
- d = new QGLFormatPrivate;
-}
-
-
-/*!
- Creates a QGLFormat object that is a copy of the current
- defaultFormat().
-
- If \a options is not 0, the default format is modified by the
- specified format options. The \a options parameter should be
- QGL::FormatOption values OR'ed together.
-
- This constructor makes it easy to specify a certain desired format
- in classes derived from QGLWidget, for example:
- \snippet code/src_opengl_qgl.cpp 3
-
- Note that there are QGL::FormatOption values to turn format settings
- both on and off, e.g. QGL::DepthBuffer and QGL::NoDepthBuffer,
- QGL::DirectRendering and QGL::IndirectRendering, etc.
-
- The \a plane parameter defaults to 0 and is the plane which this
- format should be associated with. Not all OpenGL implementations
- supports overlay/underlay rendering planes.
-
- \sa defaultFormat(), setOption(), setPlane()
-*/
-
-QGLFormat::QGLFormat(QGL::FormatOptions options, int plane)
-{
- d = new QGLFormatPrivate;
- QGL::FormatOptions newOpts = options;
- d->opts = defaultFormat().d->opts;
- d->opts |= (newOpts & 0xffff);
- d->opts &= ~(newOpts >> 16);
- d->pln = plane;
-}
-
-/*!
- \internal
-*/
-void QGLFormat::detach()
-{
- if (d->ref.loadRelaxed() != 1) {
- QGLFormatPrivate *newd = new QGLFormatPrivate(d);
- if (!d->ref.deref())
- delete d;
- d = newd;
- }
-}
-
-/*!
- Constructs a copy of \a other.
-*/
-
-QGLFormat::QGLFormat(const QGLFormat &other)
-{
- d = other.d;
- d->ref.ref();
-}
-
-/*!
- Assigns \a other to this object.
-*/
-
-QGLFormat &QGLFormat::operator=(const QGLFormat &other)
-{
- if (d != other.d) {
- other.d->ref.ref();
- if (!d->ref.deref())
- delete d;
- d = other.d;
- }
- return *this;
-}
-
-/*!
- Destroys the QGLFormat.
-*/
-QGLFormat::~QGLFormat()
-{
- if (!d->ref.deref())
- delete d;
-}
-
-/*!
- Returns an OpenGL format for the window format specified by \a format.
-*/
-QGLFormat QGLFormat::fromSurfaceFormat(const QSurfaceFormat &format)
-{
- QGLFormat retFormat;
- if (format.alphaBufferSize() >= 0)
- retFormat.setAlphaBufferSize(format.alphaBufferSize());
- if (format.blueBufferSize() >= 0)
- retFormat.setBlueBufferSize(format.blueBufferSize());
- if (format.greenBufferSize() >= 0)
- retFormat.setGreenBufferSize(format.greenBufferSize());
- if (format.redBufferSize() >= 0)
- retFormat.setRedBufferSize(format.redBufferSize());
- if (format.depthBufferSize() >= 0)
- retFormat.setDepthBufferSize(format.depthBufferSize());
- if (format.samples() > 1) {
- retFormat.setSampleBuffers(true);
- retFormat.setSamples(format.samples());
- }
- if (format.stencilBufferSize() > 0) {
- retFormat.setStencil(true);
- retFormat.setStencilBufferSize(format.stencilBufferSize());
- }
- retFormat.setSwapInterval(format.swapInterval());
- retFormat.setDoubleBuffer(format.swapBehavior() != QSurfaceFormat::SingleBuffer);
- retFormat.setStereo(format.stereo());
- retFormat.setVersion(format.majorVersion(), format.minorVersion());
- retFormat.setProfile(static_cast<QGLFormat::OpenGLContextProfile>(format.profile()));
- return retFormat;
-}
-
-/*!
- Returns a window format for the OpenGL format specified by \a format.
-*/
-QSurfaceFormat QGLFormat::toSurfaceFormat(const QGLFormat &format)
-{
- QSurfaceFormat retFormat;
- if (format.alpha())
- retFormat.setAlphaBufferSize(format.alphaBufferSize() == -1 ? 1 : format.alphaBufferSize());
- if (format.blueBufferSize() >= 0)
- retFormat.setBlueBufferSize(format.blueBufferSize());
- if (format.greenBufferSize() >= 0)
- retFormat.setGreenBufferSize(format.greenBufferSize());
- if (format.redBufferSize() >= 0)
- retFormat.setRedBufferSize(format.redBufferSize());
- if (format.depth())
- retFormat.setDepthBufferSize(format.depthBufferSize() == -1 ? 1 : format.depthBufferSize());
- retFormat.setSwapBehavior(format.doubleBuffer() ? QSurfaceFormat::DoubleBuffer : QSurfaceFormat::SingleBuffer);
- if (format.sampleBuffers())
- retFormat.setSamples(format.samples() == -1 ? 4 : format.samples());
- if (format.stencil())
- retFormat.setStencilBufferSize(format.stencilBufferSize() == -1 ? 1 : format.stencilBufferSize());
- retFormat.setSwapInterval(format.swapInterval());
- retFormat.setStereo(format.stereo());
- retFormat.setMajorVersion(format.majorVersion());
- retFormat.setMinorVersion(format.minorVersion());
- retFormat.setProfile(static_cast<QSurfaceFormat::OpenGLContextProfile>(format.profile()));
- // QGLFormat has no way to set DeprecatedFunctions, that is, to tell that forward
- // compatibility should not be requested. Some drivers fail to ignore the fwdcompat
- // bit with compatibility profiles so make sure it is not set.
- if (format.profile() == QGLFormat::CompatibilityProfile)
- retFormat.setOption(QSurfaceFormat::DeprecatedFunctions);
- return retFormat;
-}
-
-void QGLContextPrivate::setupSharing() {
- Q_Q(QGLContext);
- QOpenGLContext *sharedContext = guiGlContext->shareContext();
- if (sharedContext) {
- QGLContext *actualSharedContext = QGLContext::fromOpenGLContext(sharedContext);
- sharing = true;
- QGLContextGroup::addShare(q, actualSharedContext);
- }
-}
-
-void QGLContextPrivate::refreshCurrentFbo()
-{
- QOpenGLContextPrivate *guiGlContextPrivate =
- guiGlContext ? QOpenGLContextPrivate::get(guiGlContext) : 0;
-
- // if QOpenGLFramebufferObjects have been used in the mean-time, we've lost our cached value
- if (guiGlContextPrivate && guiGlContextPrivate->qgl_current_fbo_invalid) {
- GLint current;
- QOpenGLFunctions *funcs = qgl_functions();
- funcs->glGetIntegerv(GL_FRAMEBUFFER_BINDING, &current);
-
- current_fbo = current;
-
- guiGlContextPrivate->qgl_current_fbo_invalid = false;
- }
-}
-
-void QGLContextPrivate::setCurrentFbo(GLuint fbo)
-{
- current_fbo = fbo;
-
- QOpenGLContextPrivate *guiGlContextPrivate =
- guiGlContext ? QOpenGLContextPrivate::get(guiGlContext) : 0;
-
- if (guiGlContextPrivate)
- guiGlContextPrivate->qgl_current_fbo_invalid = false;
-}
-
-
-/*!
- \fn bool QGLFormat::doubleBuffer() const
-
- Returns \c true if double buffering is enabled; otherwise returns
- false. Double buffering is enabled by default.
-
- \sa setDoubleBuffer()
-*/
-
-/*!
- If \a enable is true sets double buffering; otherwise sets single
- buffering.
-
- Double buffering is enabled by default.
-
- Double buffering is a technique where graphics are rendered on an
- off-screen buffer and not directly to the screen. When the drawing
- has been completed, the program calls a swapBuffers() function to
- exchange the screen contents with the buffer. The result is
- flicker-free drawing and often better performance.
-
- Note that single buffered contexts are currently not supported
- with EGL.
-
- \sa doubleBuffer(), QGLContext::swapBuffers(),
- QGLWidget::swapBuffers()
-*/
-
-void QGLFormat::setDoubleBuffer(bool enable)
-{
- setOption(enable ? QGL::DoubleBuffer : QGL::SingleBuffer);
-}
-
-
-/*!
- \fn bool QGLFormat::depth() const
-
- Returns \c true if the depth buffer is enabled; otherwise returns
- false. The depth buffer is enabled by default.
-
- \sa setDepth(), setDepthBufferSize()
-*/
-
-/*!
- If \a enable is true enables the depth buffer; otherwise disables
- the depth buffer.
-
- The depth buffer is enabled by default.
-
- The purpose of a depth buffer (or Z-buffering) is to remove hidden
- surfaces. Pixels are assigned Z values based on the distance to
- the viewer. A pixel with a high Z value is closer to the viewer
- than a pixel with a low Z value. This information is used to
- decide whether to draw a pixel or not.
-
- \sa depth(), setDepthBufferSize()
-*/
-
-void QGLFormat::setDepth(bool enable)
-{
- setOption(enable ? QGL::DepthBuffer : QGL::NoDepthBuffer);
-}
-
-
-/*!
- \fn bool QGLFormat::rgba() const
-
- Returns \c true if RGBA color mode is set. Returns \c false if color
- index mode is set. The default color mode is RGBA.
-
- \sa setRgba()
-*/
-
-/*!
- If \a enable is true sets RGBA mode. If \a enable is false sets
- color index mode.
-
- The default color mode is RGBA.
-
- RGBA is the preferred mode for most OpenGL applications. In RGBA
- color mode you specify colors as red + green + blue + alpha
- quadruplets.
-
- In color index mode you specify an index into a color lookup
- table.
-
- \sa rgba()
-*/
-
-void QGLFormat::setRgba(bool enable)
-{
- setOption(enable ? QGL::Rgba : QGL::ColorIndex);
-}
-
-
-/*!
- \fn bool QGLFormat::alpha() const
-
- Returns \c true if the alpha buffer in the framebuffer is enabled;
- otherwise returns \c false. The alpha buffer is disabled by default.
-
- \sa setAlpha(), setAlphaBufferSize()
-*/
-
-/*!
- If \a enable is true enables the alpha buffer; otherwise disables
- the alpha buffer.
-
- The alpha buffer is disabled by default.
-
- The alpha buffer is typically used for implementing transparency
- or translucency. The A in RGBA specifies the transparency of a
- pixel.
-
- \sa alpha(), setAlphaBufferSize()
-*/
-
-void QGLFormat::setAlpha(bool enable)
-{
- setOption(enable ? QGL::AlphaChannel : QGL::NoAlphaChannel);
-}
-
-
-/*!
- \fn bool QGLFormat::accum() const
-
- Returns \c true if the accumulation buffer is enabled; otherwise
- returns \c false. The accumulation buffer is disabled by default.
-
- \sa setAccum(), setAccumBufferSize()
-*/
-
-/*!
- If \a enable is true enables the accumulation buffer; otherwise
- disables the accumulation buffer.
-
- The accumulation buffer is disabled by default.
-
- The accumulation buffer is used to create blur effects and
- multiple exposures.
-
- \sa accum(), setAccumBufferSize()
-*/
-
-void QGLFormat::setAccum(bool enable)
-{
- setOption(enable ? QGL::AccumBuffer : QGL::NoAccumBuffer);
-}
-
-
-/*!
- \fn bool QGLFormat::stencil() const
-
- Returns \c true if the stencil buffer is enabled; otherwise returns
- false. The stencil buffer is enabled by default.
-
- \sa setStencil(), setStencilBufferSize()
-*/
-
-/*!
- If \a enable is true enables the stencil buffer; otherwise
- disables the stencil buffer.
-
- The stencil buffer is enabled by default.
-
- The stencil buffer masks certain parts of the drawing area so that
- masked parts are not drawn on.
-
- \sa stencil(), setStencilBufferSize()
-*/
-
-void QGLFormat::setStencil(bool enable)
-{
- setOption(enable ? QGL::StencilBuffer: QGL::NoStencilBuffer);
-}
-
-
-/*!
- \fn bool QGLFormat::stereo() const
-
- Returns \c true if stereo buffering is enabled; otherwise returns
- false. Stereo buffering is disabled by default.
-
- \sa setStereo()
-*/
-
-/*!
- If \a enable is true enables stereo buffering; otherwise disables
- stereo buffering.
-
- Stereo buffering is disabled by default.
-
- Stereo buffering provides extra color buffers to generate left-eye
- and right-eye images.
-
- \sa stereo()
-*/
-
-void QGLFormat::setStereo(bool enable)
-{
- setOption(enable ? QGL::StereoBuffers : QGL::NoStereoBuffers);
-}
-
-
-/*!
- \fn bool QGLFormat::directRendering() const
-
- Returns \c true if direct rendering is enabled; otherwise returns
- false.
-
- Direct rendering is enabled by default.
-
- \sa setDirectRendering()
-*/
-
-/*!
- If \a enable is true enables direct rendering; otherwise disables
- direct rendering.
-
- Direct rendering is enabled by default.
-
- Enabling this option will make OpenGL bypass the underlying window
- system and render directly from hardware to the screen, if this is
- supported by the system.
-
- \sa directRendering()
-*/
-
-void QGLFormat::setDirectRendering(bool enable)
-{
- setOption(enable ? QGL::DirectRendering : QGL::IndirectRendering);
-}
-
-/*!
- \fn bool QGLFormat::sampleBuffers() const
-
- Returns \c true if multisample buffer support is enabled; otherwise
- returns \c false.
-
- The multisample buffer is disabled by default.
-
- \sa setSampleBuffers()
-*/
-
-/*!
- If \a enable is true, a GL context with multisample buffer support
- is picked; otherwise ignored.
-
- \sa sampleBuffers(), setSamples(), samples()
-*/
-void QGLFormat::setSampleBuffers(bool enable)
-{
- setOption(enable ? QGL::SampleBuffers : QGL::NoSampleBuffers);
-}
-
-/*!
- Returns the number of samples per pixel when multisampling is
- enabled. By default, the highest number of samples that is
- available is used.
-
- \sa setSampleBuffers(), sampleBuffers(), setSamples()
-*/
-int QGLFormat::samples() const
-{
- return d->numSamples;
-}
-
-/*!
- Set the preferred number of samples per pixel when multisampling
- is enabled to \a numSamples. By default, the highest number of
- samples available is used.
-
- \sa setSampleBuffers(), sampleBuffers(), samples()
-*/
-void QGLFormat::setSamples(int numSamples)
-{
- detach();
- if (numSamples < 0) {
- qWarning("QGLFormat::setSamples: Cannot have negative number of samples per pixel %d", numSamples);
- return;
- }
- d->numSamples = numSamples;
- setSampleBuffers(numSamples > 0);
-}
-
-/*!
- \since 4.2
-
- Set the preferred swap interval. This can be used to sync the GL
- drawing into a system window to the vertical refresh of the screen.
- Setting an \a interval value of 0 will turn the vertical refresh syncing
- off, any value higher than 0 will turn the vertical syncing on.
-
- Under Windows and under X11, where the \c{WGL_EXT_swap_control}
- and \c{GLX_SGI_video_sync} extensions are used, the \a interval
- parameter can be used to set the minimum number of video frames
- that are displayed before a buffer swap will occur. In effect,
- setting the \a interval to 10, means there will be 10 vertical
- retraces between every buffer swap.
-
- Under Windows the \c{WGL_EXT_swap_control} extension has to be present,
- and under X11 the \c{GLX_SGI_video_sync} extension has to be present.
-*/
-void QGLFormat::setSwapInterval(int interval)
-{
- detach();
- d->swapInterval = interval;
-}
-
-/*!
- \since 4.2
-
- Returns the currently set swap interval. -1 is returned if setting
- the swap interval isn't supported in the system GL implementation.
-*/
-int QGLFormat::swapInterval() const
-{
- return d->swapInterval;
-}
-
-/*!
- \fn bool QGLFormat::hasOverlay() const
-
- Returns \c true if overlay plane is enabled; otherwise returns \c false.
-
- Overlay is disabled by default.
-
- \sa setOverlay()
-*/
-
-/*!
- If \a enable is true enables an overlay plane; otherwise disables
- the overlay plane.
-
- Enabling the overlay plane will cause QGLWidget to create an
- additional context in an overlay plane. See the QGLWidget
- documentation for further information.
-
- \sa hasOverlay()
-*/
-
-void QGLFormat::setOverlay(bool enable)
-{
- setOption(enable ? QGL::HasOverlay : QGL::NoOverlay);
-}
-
-/*!
- Returns the plane of this format. The default for normal formats
- is 0, which means the normal plane. The default for overlay
- formats is 1, which is the first overlay plane.
-
- \sa setPlane(), defaultOverlayFormat()
-*/
-int QGLFormat::plane() const
-{
- return d->pln;
-}
-
-/*!
- Sets the requested plane to \a plane. 0 is the normal plane, 1 is
- the first overlay plane, 2 is the second overlay plane, etc.; -1,
- -2, etc. are underlay planes.
-
- Note that in contrast to other format specifications, the plane
- specifications will be matched exactly. This means that if you
- specify a plane that the underlying OpenGL system cannot provide,
- an \l{QGLWidget::isValid()}{invalid} QGLWidget will be
- created.
-
- \sa plane()
-*/
-void QGLFormat::setPlane(int plane)
-{
- detach();
- d->pln = plane;
-}
-
-/*!
- Sets the format option to \a opt.
-
- \sa testOption()
-*/
-
-void QGLFormat::setOption(QGL::FormatOptions opt)
-{
- detach();
- if (opt & 0xffff)
- d->opts |= opt;
- else
- d->opts &= ~(opt >> 16);
-}
-
-
-
-/*!
- Returns \c true if format option \a opt is set; otherwise returns \c false.
-
- \sa setOption()
-*/
-
-bool QGLFormat::testOption(QGL::FormatOptions opt) const
-{
- if (opt & 0xffff)
- return (d->opts & opt) != 0;
- else
- return (d->opts & (opt >> 16)) == 0;
-}
-
-/*!
- Set the minimum depth buffer size to \a size.
-
- \sa depthBufferSize(), setDepth(), depth()
-*/
-void QGLFormat::setDepthBufferSize(int size)
-{
- detach();
- if (size < 0) {
- qWarning("QGLFormat::setDepthBufferSize: Cannot set negative depth buffer size %d", size);
- return;
- }
- d->depthSize = size;
- setDepth(size > 0);
-}
-
-/*!
- Returns the depth buffer size.
-
- \sa depth(), setDepth(), setDepthBufferSize()
-*/
-int QGLFormat::depthBufferSize() const
-{
- return d->depthSize;
-}
-
-/*!
- \since 4.2
-
- Set the preferred red buffer size to \a size.
-
- \sa setGreenBufferSize(), setBlueBufferSize(), setAlphaBufferSize()
-*/
-void QGLFormat::setRedBufferSize(int size)
-{
- detach();
- if (size < 0) {
- qWarning("QGLFormat::setRedBufferSize: Cannot set negative red buffer size %d", size);
- return;
- }
- d->redSize = size;
-}
-
-/*!
- \since 4.2
-
- Returns the red buffer size.
-
- \sa setRedBufferSize()
-*/
-int QGLFormat::redBufferSize() const
-{
- return d->redSize;
-}
-
-/*!
- \since 4.2
-
- Set the preferred green buffer size to \a size.
-
- \sa setRedBufferSize(), setBlueBufferSize(), setAlphaBufferSize()
-*/
-void QGLFormat::setGreenBufferSize(int size)
-{
- detach();
- if (size < 0) {
- qWarning("QGLFormat::setGreenBufferSize: Cannot set negative green buffer size %d", size);
- return;
- }
- d->greenSize = size;
-}
-
-/*!
- \since 4.2
-
- Returns the green buffer size.
-
- \sa setGreenBufferSize()
-*/
-int QGLFormat::greenBufferSize() const
-{
- return d->greenSize;
-}
-
-/*!
- \since 4.2
-
- Set the preferred blue buffer size to \a size.
-
- \sa setRedBufferSize(), setGreenBufferSize(), setAlphaBufferSize()
-*/
-void QGLFormat::setBlueBufferSize(int size)
-{
- detach();
- if (size < 0) {
- qWarning("QGLFormat::setBlueBufferSize: Cannot set negative blue buffer size %d", size);
- return;
- }
- d->blueSize = size;
-}
-
-/*!
- \since 4.2
-
- Returns the blue buffer size.
-
- \sa setBlueBufferSize()
-*/
-int QGLFormat::blueBufferSize() const
-{
- return d->blueSize;
-}
-
-/*!
- Set the preferred alpha buffer size to \a size.
- This function implicitly enables the alpha channel.
-
- \sa setRedBufferSize(), setGreenBufferSize(), alphaBufferSize()
-*/
-void QGLFormat::setAlphaBufferSize(int size)
-{
- detach();
- if (size < 0) {
- qWarning("QGLFormat::setAlphaBufferSize: Cannot set negative alpha buffer size %d", size);
- return;
- }
- d->alphaSize = size;
- setAlpha(size > 0);
-}
-
-/*!
- Returns the alpha buffer size.
-
- \sa alpha(), setAlpha(), setAlphaBufferSize()
-*/
-int QGLFormat::alphaBufferSize() const
-{
- return d->alphaSize;
-}
-
-/*!
- Set the preferred accumulation buffer size, where \a size is the
- bit depth for each RGBA component.
-
- \sa accum(), setAccum(), accumBufferSize()
-*/
-void QGLFormat::setAccumBufferSize(int size)
-{
- detach();
- if (size < 0) {
- qWarning("QGLFormat::setAccumBufferSize: Cannot set negative accumulate buffer size %d", size);
- return;
- }
- d->accumSize = size;
- setAccum(size > 0);
-}
-
-/*!
- Returns the accumulation buffer size.
-
- \sa setAccumBufferSize(), accum(), setAccum()
-*/
-int QGLFormat::accumBufferSize() const
-{
- return d->accumSize;
-}
-
-/*!
- Set the preferred stencil buffer size to \a size.
-
- \sa stencilBufferSize(), setStencil(), stencil()
-*/
-void QGLFormat::setStencilBufferSize(int size)
-{
- detach();
- if (size < 0) {
- qWarning("QGLFormat::setStencilBufferSize: Cannot set negative stencil buffer size %d", size);
- return;
- }
- d->stencilSize = size;
- setStencil(size > 0);
-}
-
-/*!
- Returns the stencil buffer size.
-
- \sa stencil(), setStencil(), setStencilBufferSize()
-*/
-int QGLFormat::stencilBufferSize() const
-{
- return d->stencilSize;
-}
-
-/*!
- \since 4.7
-
- Set the OpenGL version to the \a major and \a minor numbers. If a
- context compatible with the requested OpenGL version cannot be
- created, a context compatible with version 1.x is created instead.
-
- \sa majorVersion(), minorVersion()
-*/
-void QGLFormat::setVersion(int major, int minor)
-{
- if (major < 1 || minor < 0) {
- qWarning("QGLFormat::setVersion: Cannot set zero or negative version number %d.%d", major, minor);
- return;
- }
- detach();
- d->majorVersion = major;
- d->minorVersion = minor;
-}
-
-/*!
- \since 4.7
-
- Returns the OpenGL major version.
-
- \sa setVersion(), minorVersion()
-*/
-int QGLFormat::majorVersion() const
-{
- return d->majorVersion;
-}
-
-/*!
- \since 4.7
-
- Returns the OpenGL minor version.
-
- \sa setVersion(), majorVersion()
-*/
-int QGLFormat::minorVersion() const
-{
- return d->minorVersion;
-}
-
-/*!
- \enum QGLFormat::OpenGLContextProfile
- \since 4.7
-
- This enum describes the OpenGL context profiles that can be
- specified for contexts implementing OpenGL version 3.2 or
- higher. These profiles are different from OpenGL ES profiles.
-
- \value NoProfile OpenGL version is lower than 3.2.
- \value CoreProfile Functionality deprecated in OpenGL version 3.0 is not available.
- \value CompatibilityProfile Functionality from earlier OpenGL versions is available.
-*/
-
-/*!
- \since 4.7
-
- Set the OpenGL context profile to \a profile. The \a profile is
- ignored if the requested OpenGL version is less than 3.2.
-
- \sa profile()
-*/
-void QGLFormat::setProfile(OpenGLContextProfile profile)
-{
- detach();
- d->profile = profile;
-}
-
-/*!
- \since 4.7
-
- Returns the OpenGL context profile.
-
- \sa setProfile()
-*/
-QGLFormat::OpenGLContextProfile QGLFormat::profile() const
-{
- return d->profile;
-}
-
-
-/*!
- \fn bool QGLFormat::hasOpenGL()
-
- Returns \c true if the window system has any OpenGL support;
- otherwise returns \c false.
-
- \warning This function must not be called until the QApplication
- object has been created.
-*/
-bool QGLFormat::hasOpenGL()
-{
- return QApplicationPrivate::platformIntegration()
- ->hasCapability(QPlatformIntegration::OpenGL);
-}
-
-/*!
- \fn bool QGLFormat::hasOpenGLOverlays()
-
- Returns \c true if the window system supports OpenGL overlays;
- otherwise returns \c false.
-
- \warning This function must not be called until the QApplication
- object has been created.
-*/
-bool QGLFormat::hasOpenGLOverlays()
-{
- return false;
-}
-
-QGLFormat::OpenGLVersionFlags Q_AUTOTEST_EXPORT qOpenGLVersionFlagsFromString(const QString &versionString)
-{
- QGLFormat::OpenGLVersionFlags versionFlags = QGLFormat::OpenGL_Version_None;
-
- if (versionString.startsWith(QLatin1String("OpenGL ES"))) {
- const auto parts = versionString.splitRef(QLatin1Char(' '));
- if (parts.size() >= 3) {
- if (parts[2].startsWith(QLatin1String("1."))) {
- if (parts[1].endsWith(QLatin1String("-CM"))) {
- versionFlags |= QGLFormat::OpenGL_ES_Common_Version_1_0 |
- QGLFormat::OpenGL_ES_CommonLite_Version_1_0;
- if (parts[2].startsWith(QLatin1String("1.1")))
- versionFlags |= QGLFormat::OpenGL_ES_Common_Version_1_1 |
- QGLFormat::OpenGL_ES_CommonLite_Version_1_1;
- } else {
- // Not -CM, must be CL, CommonLite
- versionFlags |= QGLFormat::OpenGL_ES_CommonLite_Version_1_0;
- if (parts[2].startsWith(QLatin1String("1.1")))
- versionFlags |= QGLFormat::OpenGL_ES_CommonLite_Version_1_1;
- }
- } else {
- // OpenGL ES version 2.0 or higher
- versionFlags |= QGLFormat::OpenGL_ES_Version_2_0;
- }
- } else {
- // if < 3 parts to the name, it is an unrecognised OpenGL ES
- qWarning("Unrecognised OpenGL ES version");
- }
- } else {
- // not ES, regular OpenGL, the version numbers are first in the string
- if (versionString.startsWith(QLatin1String("1."))) {
- switch (versionString[2].toLatin1()) {
- case '5':
- versionFlags |= QGLFormat::OpenGL_Version_1_5;
- Q_FALLTHROUGH();
- case '4':
- versionFlags |= QGLFormat::OpenGL_Version_1_4;
- Q_FALLTHROUGH();
- case '3':
- versionFlags |= QGLFormat::OpenGL_Version_1_3;
- Q_FALLTHROUGH();
- case '2':
- versionFlags |= QGLFormat::OpenGL_Version_1_2;
- Q_FALLTHROUGH();
- case '1':
- versionFlags |= QGLFormat::OpenGL_Version_1_1;
- Q_FALLTHROUGH();
- default:
- break;
- }
- } else if (versionString.startsWith(QLatin1String("2."))) {
- versionFlags |= QGLFormat::OpenGL_Version_1_1 |
- QGLFormat::OpenGL_Version_1_2 |
- QGLFormat::OpenGL_Version_1_3 |
- QGLFormat::OpenGL_Version_1_4 |
- QGLFormat::OpenGL_Version_1_5 |
- QGLFormat::OpenGL_Version_2_0;
- if (versionString[2].toLatin1() == '1')
- versionFlags |= QGLFormat::OpenGL_Version_2_1;
- } else if (versionString.startsWith(QLatin1String("3."))) {
- versionFlags |= QGLFormat::OpenGL_Version_1_1 |
- QGLFormat::OpenGL_Version_1_2 |
- QGLFormat::OpenGL_Version_1_3 |
- QGLFormat::OpenGL_Version_1_4 |
- QGLFormat::OpenGL_Version_1_5 |
- QGLFormat::OpenGL_Version_2_0 |
- QGLFormat::OpenGL_Version_2_1 |
- QGLFormat::OpenGL_Version_3_0;
- switch (versionString[2].toLatin1()) {
- case '3':
- versionFlags |= QGLFormat::OpenGL_Version_3_3;
- Q_FALLTHROUGH();
- case '2':
- versionFlags |= QGLFormat::OpenGL_Version_3_2;
- Q_FALLTHROUGH();
- case '1':
- versionFlags |= QGLFormat::OpenGL_Version_3_1;
- Q_FALLTHROUGH();
- case '0':
- break;
- default:
- versionFlags |= QGLFormat::OpenGL_Version_3_1 |
- QGLFormat::OpenGL_Version_3_2 |
- QGLFormat::OpenGL_Version_3_3;
- break;
- }
- } else if (versionString.startsWith(QLatin1String("4."))) {
- versionFlags |= QGLFormat::OpenGL_Version_1_1 |
- QGLFormat::OpenGL_Version_1_2 |
- QGLFormat::OpenGL_Version_1_3 |
- QGLFormat::OpenGL_Version_1_4 |
- QGLFormat::OpenGL_Version_1_5 |
- QGLFormat::OpenGL_Version_2_0 |
- QGLFormat::OpenGL_Version_2_1 |
- QGLFormat::OpenGL_Version_3_0 |
- QGLFormat::OpenGL_Version_3_1 |
- QGLFormat::OpenGL_Version_3_2 |
- QGLFormat::OpenGL_Version_3_3 |
- QGLFormat::OpenGL_Version_4_0;
- switch (versionString[2].toLatin1()) {
- case '3':
- versionFlags |= QGLFormat::OpenGL_Version_4_3;
- Q_FALLTHROUGH();
- case '2':
- versionFlags |= QGLFormat::OpenGL_Version_4_2;
- Q_FALLTHROUGH();
- case '1':
- versionFlags |= QGLFormat::OpenGL_Version_4_1;
- Q_FALLTHROUGH();
- case '0':
- break;
- default:
- versionFlags |= QGLFormat::OpenGL_Version_4_1 |
- QGLFormat::OpenGL_Version_4_2 |
- QGLFormat::OpenGL_Version_4_3;
- break;
- }
- } else {
- versionFlags |= QGLFormat::OpenGL_Version_1_1 |
- QGLFormat::OpenGL_Version_1_2 |
- QGLFormat::OpenGL_Version_1_3 |
- QGLFormat::OpenGL_Version_1_4 |
- QGLFormat::OpenGL_Version_1_5 |
- QGLFormat::OpenGL_Version_2_0 |
- QGLFormat::OpenGL_Version_2_1 |
- QGLFormat::OpenGL_Version_3_0 |
- QGLFormat::OpenGL_Version_3_1 |
- QGLFormat::OpenGL_Version_3_2 |
- QGLFormat::OpenGL_Version_3_3 |
- QGLFormat::OpenGL_Version_4_0 |
- QGLFormat::OpenGL_Version_4_1 |
- QGLFormat::OpenGL_Version_4_2 |
- QGLFormat::OpenGL_Version_4_3;
- }
- }
- return versionFlags;
-}
-
-/*!
- \enum QGLFormat::OpenGLVersionFlag
- \since 4.2
-
- This enum describes the various OpenGL versions that are
- recognized by Qt. Use the QGLFormat::openGLVersionFlags() function
- to identify which versions that are supported at runtime.
-
- \value OpenGL_Version_None If no OpenGL is present or if no OpenGL context is current.
-
- \value OpenGL_Version_1_1 OpenGL version 1.1 or higher is present.
-
- \value OpenGL_Version_1_2 OpenGL version 1.2 or higher is present.
-
- \value OpenGL_Version_1_3 OpenGL version 1.3 or higher is present.
-
- \value OpenGL_Version_1_4 OpenGL version 1.4 or higher is present.
-
- \value OpenGL_Version_1_5 OpenGL version 1.5 or higher is present.
-
- \value OpenGL_Version_2_0 OpenGL version 2.0 or higher is present.
- Note that version 2.0 supports all the functionality of version 1.5.
-
- \value OpenGL_Version_2_1 OpenGL version 2.1 or higher is present.
-
- \value OpenGL_Version_3_0 OpenGL version 3.0 or higher is present.
-
- \value OpenGL_Version_3_1 OpenGL version 3.1 or higher is present.
- Note that OpenGL version 3.1 or higher does not necessarily support all the features of
- version 3.0 and lower.
-
- \value OpenGL_Version_3_2 OpenGL version 3.2 or higher is present.
-
- \value OpenGL_Version_3_3 OpenGL version 3.3 or higher is present.
-
- \value OpenGL_Version_4_0 OpenGL version 4.0 or higher is present.
-
- \value OpenGL_Version_4_1 OpenGL version 4.1 or higher is present.
-
- \value OpenGL_Version_4_2 OpenGL version 4.2 or higher is present.
-
- \value OpenGL_Version_4_3 OpenGL version 4.3 or higher is present.
-
- \value OpenGL_ES_CommonLite_Version_1_0 OpenGL ES version 1.0 Common Lite or higher is present.
-
- \value OpenGL_ES_Common_Version_1_0 OpenGL ES version 1.0 Common or higher is present.
- The Common profile supports all the features of Common Lite.
-
- \value OpenGL_ES_CommonLite_Version_1_1 OpenGL ES version 1.1 Common Lite or higher is present.
-
- \value OpenGL_ES_Common_Version_1_1 OpenGL ES version 1.1 Common or higher is present.
- The Common profile supports all the features of Common Lite.
-
- \value OpenGL_ES_Version_2_0 OpenGL ES version 2.0 or higher is present.
- Note that OpenGL ES version 2.0 does not support all the features of OpenGL ES 1.x.
- So if OpenGL_ES_Version_2_0 is returned, none of the ES 1.x flags are returned.
-
- See also \l{http://www.opengl.org} for more information about the different
- revisions of OpenGL.
-
- \sa openGLVersionFlags()
-*/
-
-/*!
- \since 4.2
-
- Identifies, at runtime, which OpenGL versions that are supported
- by the current platform.
-
- Note that if OpenGL version 1.5 is supported, its predecessors
- (i.e., version 1.4 and lower) are also supported. To identify the
- support of a particular feature, like multi texturing, test for
- the version in which the feature was first introduced (i.e.,
- version 1.3 in the case of multi texturing) to adapt to the largest
- possible group of runtime platforms.
-
- This function needs a valid current OpenGL context to work;
- otherwise it will return OpenGL_Version_None.
-
- \sa hasOpenGL(), hasOpenGLOverlays()
-*/
-QGLFormat::OpenGLVersionFlags QGLFormat::openGLVersionFlags()
-{
- static bool cachedDefault = false;
- static OpenGLVersionFlags defaultVersionFlags = OpenGL_Version_None;
- QGLContext *currentCtx = const_cast<QGLContext *>(QGLContext::currentContext());
- QGLTemporaryContext *tmpContext = 0;
-
- if (currentCtx && currentCtx->d_func()->version_flags_cached)
- return currentCtx->d_func()->version_flags;
-
- if (!currentCtx) {
- if (cachedDefault) {
- return defaultVersionFlags;
- } else {
- if (!hasOpenGL())
- return defaultVersionFlags;
- tmpContext = new QGLTemporaryContext;
- cachedDefault = true;
- }
- }
-
- QString versionString(QLatin1String(reinterpret_cast<const char*>(qgl_functions()->glGetString(GL_VERSION))));
- OpenGLVersionFlags versionFlags = qOpenGLVersionFlagsFromString(versionString);
- if (currentCtx) {
- currentCtx->d_func()->version_flags_cached = true;
- currentCtx->d_func()->version_flags = versionFlags;
- }
- if (tmpContext) {
- defaultVersionFlags = versionFlags;
- delete tmpContext;
- }
-
- return versionFlags;
-}
-
-
-/*!
- Returns the default QGLFormat for the application. All QGLWidget
- objects that are created use this format unless another format is
- specified, e.g. when they are constructed.
-
- If no special default format has been set using
- setDefaultFormat(), the default format is the same as that created
- with QGLFormat().
-
- \sa setDefaultFormat()
-*/
-
-QGLFormat QGLFormat::defaultFormat()
-{
- return *qgl_default_format();
-}
-
-/*!
- Sets a new default QGLFormat for the application to \a f. For
- example, to set single buffering as the default instead of double
- buffering, your main() might contain code like this:
- \snippet code/src_opengl_qgl.cpp 4
-
- \sa defaultFormat()
-*/
-
-void QGLFormat::setDefaultFormat(const QGLFormat &f)
-{
- *qgl_default_format() = f;
-}
-
-
-/*!
- Returns the default QGLFormat for overlay contexts.
-
- The default overlay format is:
- \list
- \li \l{setDoubleBuffer()}{Double buffer:} Disabled.
- \li \l{setDepth()}{Depth buffer:} Disabled.
- \li \l{setRgba()}{RGBA:} Disabled (i.e., color index enabled).
- \li \l{setAlpha()}{Alpha channel:} Disabled.
- \li \l{setAccum()}{Accumulator buffer:} Disabled.
- \li \l{setStencil()}{Stencil buffer:} Disabled.
- \li \l{setStereo()}{Stereo:} Disabled.
- \li \l{setDirectRendering()}{Direct rendering:} Enabled.
- \li \l{setOverlay()}{Overlay:} Disabled.
- \li \l{setSampleBuffers()}{Multisample buffers:} Disabled.
- \li \l{setPlane()}{Plane:} 1 (i.e., first overlay plane).
- \endlist
-
- \sa setDefaultFormat()
-*/
-
-QGLFormat QGLFormat::defaultOverlayFormat()
-{
- return *defaultOverlayFormatInstance();
-}
-
-/*!
- Sets a new default QGLFormat for overlay contexts to \a f. This
- format is used whenever a QGLWidget is created with a format that
- hasOverlay() enabled.
-
- For example, to get a double buffered overlay context (if
- available), use code like this:
-
- \snippet code/src_opengl_qgl.cpp 5
-
- As usual, you can find out after widget creation whether the
- underlying OpenGL system was able to provide the requested
- specification:
-
- \snippet code/src_opengl_qgl.cpp 6
-
- \sa defaultOverlayFormat()
-*/
-
-void QGLFormat::setDefaultOverlayFormat(const QGLFormat &f)
-{
- QGLFormat *defaultFormat = defaultOverlayFormatInstance();
- *defaultFormat = f;
- // Make sure the user doesn't request that the overlays themselves
- // have overlays, since it is unlikely that the system supports
- // infinitely many planes...
- defaultFormat->setOverlay(false);
-}
-
-
-/*!
- Returns \c true if all the options of the two QGLFormat objects
- \a a and \a b are equal; otherwise returns \c false.
-
- \relates QGLFormat
-*/
-
-bool operator==(const QGLFormat& a, const QGLFormat& b)
-{
- return (a.d == b.d) || ((int) a.d->opts == (int) b.d->opts
- && a.d->pln == b.d->pln
- && a.d->alphaSize == b.d->alphaSize
- && a.d->accumSize == b.d->accumSize
- && a.d->stencilSize == b.d->stencilSize
- && a.d->depthSize == b.d->depthSize
- && a.d->redSize == b.d->redSize
- && a.d->greenSize == b.d->greenSize
- && a.d->blueSize == b.d->blueSize
- && a.d->numSamples == b.d->numSamples
- && a.d->swapInterval == b.d->swapInterval
- && a.d->majorVersion == b.d->majorVersion
- && a.d->minorVersion == b.d->minorVersion
- && a.d->profile == b.d->profile);
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug dbg, const QGLFormat &f)
-{
- const QGLFormatPrivate * const d = f.d;
-
- QDebugStateSaver saver(dbg);
- dbg.nospace() << "QGLFormat("
- << "options " << d->opts
- << ", plane " << d->pln
- << ", depthBufferSize " << d->depthSize
- << ", accumBufferSize " << d->accumSize
- << ", stencilBufferSize " << d->stencilSize
- << ", redBufferSize " << d->redSize
- << ", greenBufferSize " << d->greenSize
- << ", blueBufferSize " << d->blueSize
- << ", alphaBufferSize " << d->alphaSize
- << ", samples " << d->numSamples
- << ", swapInterval " << d->swapInterval
- << ", majorVersion " << d->majorVersion
- << ", minorVersion " << d->minorVersion
- << ", profile " << d->profile
- << ')';
-
- return dbg;
-}
-#endif
-
-
-/*!
- Returns \c false if all the options of the two QGLFormat objects
- \a a and \a b are equal; otherwise returns \c true.
-
- \relates QGLFormat
-*/
-
-bool operator!=(const QGLFormat& a, const QGLFormat& b)
-{
- return !(a == b);
-}
-
-struct QGLContextGroupList {
- void append(QGLContextGroup *group) {
- QMutexLocker locker(&m_mutex);
- m_list.append(group);
- }
-
- void remove(QGLContextGroup *group) {
- QMutexLocker locker(&m_mutex);
- m_list.removeOne(group);
- }
-
- QList<QGLContextGroup *> m_list;
- QRecursiveMutex m_mutex;
-};
-
-Q_GLOBAL_STATIC(QGLContextGroupList, qt_context_groups)
-
-/*****************************************************************************
- QGLContext implementation
- *****************************************************************************/
-
-QGLContextGroup::QGLContextGroup(const QGLContext *context)
- : m_context(context), m_refs(1)
-{
- qt_context_groups()->append(this);
-}
-
-QGLContextGroup::~QGLContextGroup()
-{
- qt_context_groups()->remove(this);
-}
-
-const QGLContext *qt_gl_transfer_context(const QGLContext *ctx)
-{
- if (!ctx)
- return 0;
- QList<const QGLContext *> shares
- (QGLContextPrivate::contextGroup(ctx)->shares());
- if (shares.size() >= 2)
- return (ctx == shares.at(0)) ? shares.at(1) : shares.at(0);
- else
- return 0;
-}
-
-QGLContextPrivate::QGLContextPrivate(QGLContext *context)
- : internal_context(false)
- , q_ptr(context)
- , texture_destroyer(0)
- , functions(0)
-{
- group = new QGLContextGroup(context);
-
- texture_destroyer = new QGLTextureDestroyer;
-}
-
-QGLContextPrivate::~QGLContextPrivate()
-{
- delete functions;
-
- if (!group->m_refs.deref()) {
- Q_ASSERT(group->context() == q_ptr);
- delete group;
- }
-
- delete texture_destroyer;
-}
-
-void QGLContextPrivate::init(QPaintDevice *dev, const QGLFormat &format)
-{
- Q_Q(QGLContext);
- glFormat = reqFormat = format;
- valid = false;
- q->setDevice(dev);
-
- guiGlContext = 0;
- ownContext = false;
- fbo = 0;
- crWin = false;
- initDone = false;
- sharing = false;
- max_texture_size = -1;
- version_flags_cached = false;
- version_flags = QGLFormat::OpenGL_Version_None;
- current_fbo = 0;
- default_fbo = 0;
- active_engine = 0;
- workaround_needsFullClearOnEveryFrame = false;
- workaround_brokenFBOReadBack = false;
- workaround_brokenTexSubImage = false;
- workaroundsCached = false;
-
- workaround_brokenTextureFromPixmap = false;
- workaround_brokenTextureFromPixmap_init = false;
-
- workaround_brokenAlphaTexSubImage = false;
- workaround_brokenAlphaTexSubImage_init = false;
-
- for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i)
- vertexAttributeArraysEnabledState[i] = false;
-}
-
-QGLContext* QGLContext::currentCtx = 0;
-
-/*
- QGLTemporaryContext implementation
-*/
-class QGLTemporaryContextPrivate
-{
-public:
- QWindow *window;
- QOpenGLContext *context;
-
- QGLContext *oldContext;
-};
-
-QGLTemporaryContext::QGLTemporaryContext(bool, QWidget *)
- : d(new QGLTemporaryContextPrivate)
-{
- d->oldContext = const_cast<QGLContext *>(QGLContext::currentContext());
-
- d->window = new QWindow;
- d->window->setSurfaceType(QWindow::OpenGLSurface);
- d->window->setGeometry(QRect(0, 0, 3, 3));
- d->window->create();
-
- d->context = new QOpenGLContext;
-#if !defined(QT_OPENGL_ES)
- if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) {
- // On desktop, request latest released version
- QSurfaceFormat format;
-#if defined(Q_OS_MAC)
- // OS X is limited to OpenGL 3.2 Core Profile at present
- // so set that here. If we use compatibility profile it
- // only reports 2.x contexts.
- format.setMajorVersion(3);
- format.setMinorVersion(2);
- format.setProfile(QSurfaceFormat::CoreProfile);
-#else
- format.setMajorVersion(4);
- format.setMinorVersion(3);
-#endif
- d->context->setFormat(format);
- }
-#endif // QT_OPENGL_ES
- d->context->create();
- d->context->makeCurrent(d->window);
-}
-
-QGLTemporaryContext::~QGLTemporaryContext()
-{
- if (d->oldContext)
- d->oldContext->makeCurrent();
-
- delete d->context;
- delete d->window;
-}
-
-/*
- Read back the contents of the currently bound framebuffer, used in
- QGLWidget::grabFrameBuffer(), QGLPixelbuffer::toImage() and
- QGLFramebufferObject::toImage()
-*/
-
-static void convertFromGLImage(QImage &img, int w, int h, bool alpha_format, bool include_alpha)
-{
- Q_ASSERT(!img.isNull());
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- // OpenGL gives RGBA; Qt wants ARGB
- uint *p = (uint*)img.bits();
- uint *end = p + w*h;
- if (alpha_format && include_alpha) {
- while (p < end) {
- uint a = *p << 24;
- *p = (*p >> 8) | a;
- p++;
- }
- } else {
- // This is an old legacy fix for PowerPC based Macs, which
- // we shouldn't remove
- while (p < end) {
- *p = 0xff000000 | (*p>>8);
- ++p;
- }
- }
- } else {
- // OpenGL gives ABGR (i.e. RGBA backwards); Qt wants ARGB
- for (int y = 0; y < h; y++) {
- uint *q = (uint*)img.scanLine(y);
- for (int x=0; x < w; ++x) {
- const uint pixel = *q;
- if (alpha_format && include_alpha) {
- *q = ((pixel << 16) & 0xff0000) | ((pixel >> 16) & 0xff)
- | (pixel & 0xff00ff00);
- } else {
- *q = 0xff000000 | ((pixel << 16) & 0xff0000)
- | ((pixel >> 16) & 0xff) | (pixel & 0x00ff00);
- }
-
- q++;
- }
- }
-
- }
- img = img.mirrored();
-}
-
-QImage qt_gl_read_frame_buffer(const QSize &size, bool alpha_format, bool include_alpha)
-{
- QImage img(size, (alpha_format && include_alpha) ? QImage::Format_ARGB32_Premultiplied
- : QImage::Format_RGB32);
- if (img.isNull())
- return QImage();
- int w = size.width();
- int h = size.height();
- qgl_functions()->glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, img.bits());
- convertFromGLImage(img, w, h, alpha_format, include_alpha);
- return img;
-}
-
-QImage qt_gl_read_texture(const QSize &size, bool alpha_format, bool include_alpha)
-{
- QImage img(size, alpha_format ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32);
- if (img.isNull())
- return QImage();
- int w = size.width();
- int h = size.height();
-#ifndef QT_OPENGL_ES
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
-
- qgl1_functions()->glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, img.bits());
- }
-#endif // QT_OPENGL_ES
- convertFromGLImage(img, w, h, alpha_format, include_alpha);
- return img;
-}
-
-Q_GLOBAL_STATIC(QGLTextureCache, qt_gl_texture_cache)
-
-QGLTextureCache::QGLTextureCache()
- : m_cache(64*1024) // cache ~64 MB worth of textures - this is not accurate though
-{
- QImagePixmapCleanupHooks::instance()->addPlatformPixmapModificationHook(cleanupTexturesForPixampData);
- QImagePixmapCleanupHooks::instance()->addPlatformPixmapDestructionHook(cleanupBeforePixmapDestruction);
- QImagePixmapCleanupHooks::instance()->addImageHook(cleanupTexturesForCacheKey);
-}
-
-QGLTextureCache::~QGLTextureCache()
-{
- QImagePixmapCleanupHooks::instance()->removePlatformPixmapModificationHook(cleanupTexturesForPixampData);
- QImagePixmapCleanupHooks::instance()->removePlatformPixmapDestructionHook(cleanupBeforePixmapDestruction);
- QImagePixmapCleanupHooks::instance()->removeImageHook(cleanupTexturesForCacheKey);
-}
-
-void QGLTextureCache::insert(QGLContext* ctx, qint64 key, QGLTexture* texture, int cost)
-{
- QWriteLocker locker(&m_lock);
- const QGLTextureCacheKey cacheKey = {key, QGLContextPrivate::contextGroup(ctx)};
- const bool inserted = m_cache.insert(cacheKey, texture, cost);
- Q_UNUSED(inserted) Q_ASSERT(inserted);
-}
-
-void QGLTextureCache::remove(qint64 key)
-{
- QWriteLocker locker(&m_lock);
- QMutexLocker groupLocker(&qt_context_groups()->m_mutex);
- QList<QGLContextGroup *>::const_iterator it = qt_context_groups()->m_list.constBegin();
- while (it != qt_context_groups()->m_list.constEnd()) {
- const QGLTextureCacheKey cacheKey = {key, *it};
- m_cache.remove(cacheKey);
- ++it;
- }
-}
-
-bool QGLTextureCache::remove(QGLContext* ctx, GLuint textureId)
-{
- QWriteLocker locker(&m_lock);
- QList<QGLTextureCacheKey> keys = m_cache.keys();
- for (int i = 0; i < keys.size(); ++i) {
- QGLTexture *tex = m_cache.object(keys.at(i));
- if (tex->id == textureId && tex->context == ctx) {
- tex->options |= QGLContext::MemoryManagedBindOption; // forces a glDeleteTextures() call
- m_cache.remove(keys.at(i));
- return true;
- }
- }
- return false;
-}
-
-void QGLTextureCache::removeContextTextures(QGLContext* ctx)
-{
- QWriteLocker locker(&m_lock);
- QList<QGLTextureCacheKey> keys = m_cache.keys();
- for (int i = 0; i < keys.size(); ++i) {
- const QGLTextureCacheKey &key = keys.at(i);
- if (m_cache.object(key)->context == ctx)
- m_cache.remove(key);
- }
-}
-
-/*
- a hook that removes textures from the cache when a pixmap/image
- is deref'ed
-*/
-void QGLTextureCache::cleanupTexturesForCacheKey(qint64 cacheKey)
-{
- qt_gl_texture_cache()->remove(cacheKey);
-}
-
-
-void QGLTextureCache::cleanupTexturesForPixampData(QPlatformPixmap* pmd)
-{
- cleanupTexturesForCacheKey(pmd->cacheKey());
-}
-
-void QGLTextureCache::cleanupBeforePixmapDestruction(QPlatformPixmap* pmd)
-{
- // Remove any bound textures first:
- cleanupTexturesForPixampData(pmd);
-}
-
-QGLTextureCache *QGLTextureCache::instance()
-{
- return qt_gl_texture_cache();
-}
-
-// DDS format structure
-struct DDSFormat {
- quint32 dwSize;
- quint32 dwFlags;
- quint32 dwHeight;
- quint32 dwWidth;
- quint32 dwLinearSize;
- quint32 dummy1;
- quint32 dwMipMapCount;
- quint32 dummy2[11];
- struct {
- quint32 dummy3[2];
- quint32 dwFourCC;
- quint32 dummy4[5];
- } ddsPixelFormat;
-};
-
-// compressed texture pixel formats
-#define FOURCC_DXT1 0x31545844
-#define FOURCC_DXT2 0x32545844
-#define FOURCC_DXT3 0x33545844
-#define FOURCC_DXT4 0x34545844
-#define FOURCC_DXT5 0x35545844
-
-// ####TODO Properly #ifdef this class to use #define symbols actually defined
-// by system GL includes
-#ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT
-#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
-#endif
-
-#ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
-#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
-#endif
-
-#ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
-#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
-#endif
-
-#ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
-#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
-#endif
-
-#ifndef GL_GENERATE_MIPMAP_SGIS
-#define GL_GENERATE_MIPMAP_SGIS 0x8191
-#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192
-#endif
-
-/*!
- \class QGLContext
- \inmodule QtOpenGL
- \obsolete
-
- \brief The QGLContext class encapsulates an OpenGL rendering context.
-
- An OpenGL rendering context is a complete set of OpenGL state
- variables. The rendering context's \l {QGL::FormatOption} {format}
- is set in the constructor, but it can also be set later with
- setFormat(). The format options that are actually set are returned
- by format(); the options you asked for are returned by
- requestedFormat(). Note that after a QGLContext object has been
- constructed, the actual OpenGL context must be created by
- explicitly calling the \l{create()}
- function. The makeCurrent() function makes this context the
- current rendering context. You can make \e no context current
- using doneCurrent(). The reset() function will reset the context
- and make it invalid.
-
- You can examine properties of the context with, e.g. isValid(),
- isSharing(), initialized(), windowCreated() and
- overlayTransparentColor().
-
- If you're using double buffering you can swap the screen contents
- with the off-screen buffer using swapBuffers().
-
- Please note that QGLContext is not thread safe.
-*/
-
-/*!
- \enum QGLContext::BindOption
- \since 4.6
-
- A set of options to decide how to bind a texture using bindTexture().
-
- \value NoBindOption Don't do anything, pass the texture straight
- through.
-
- \value InvertedYBindOption Specifies that the texture should be flipped
- over the X axis so that the texture coordinate 0,0 corresponds to
- the top left corner. Inverting the texture implies a deep copy
- prior to upload.
-
- \value MipmapBindOption Specifies that bindTexture() should try
- to generate mipmaps. If the GL implementation supports the \c
- GL_SGIS_generate_mipmap extension, mipmaps will be automatically
- generated for the texture. Mipmap generation is only supported for
- the \c GL_TEXTURE_2D target.
-
- \value PremultipliedAlphaBindOption Specifies that the image should be
- uploaded with premultiplied alpha and does a conversion accordingly.
-
- \value LinearFilteringBindOption Specifies that the texture filtering
- should be set to GL_LINEAR. Default is GL_NEAREST. If mipmap is
- also enabled, filtering will be set to GL_LINEAR_MIPMAP_LINEAR.
-
- \value DefaultBindOption In Qt 4.5 and earlier, bindTexture()
- would mirror the image and automatically generate mipmaps. This
- option helps preserve this default behavior.
-
- \omitvalue CanFlipNativePixmapBindOption \omit Used by x11 from pixmap to choose
- whether or not it can bind the pixmap upside down or not. \endomit
-
- \omitvalue MemoryManagedBindOption \omit Used by paint engines to
- indicate that the pixmap should be memory managed along side with
- the pixmap/image that it stems from, e.g. installing destruction
- hooks in them. \endomit
-
- \omitvalue TemporarilyCachedBindOption \omit Used by paint engines on some
- platforms to indicate that the pixmap or image texture is possibly
- cached only temporarily and must be destroyed immediately after the use. \endomit
-
- \omitvalue InternalBindOption
-*/
-
-/*!
- \obsolete
-
- Constructs an OpenGL context for the given paint \a device, which
- can be a widget or a pixmap. The \a format specifies several
- display options for the context.
-
- If the underlying OpenGL/Window system cannot satisfy all the
- features requested in \a format, the nearest subset of features
- will be used. After creation, the format() method will return the
- actual format obtained.
-
- Note that after a QGLContext object has been constructed, \l
- create() must be called explicitly to create the actual OpenGL
- context. The context will be \l {isValid()}{invalid} if it was not
- possible to obtain a GL context at all.
-*/
-
-QGLContext::QGLContext(const QGLFormat &format, QPaintDevice *device)
- : d_ptr(new QGLContextPrivate(this))
-{
- Q_D(QGLContext);
- d->init(device, format);
-}
-
-/*!
- Constructs an OpenGL context with the given \a format which
- specifies several display options for the context.
-
- If the underlying OpenGL/Window system cannot satisfy all the
- features requested in \a format, the nearest subset of features
- will be used. After creation, the format() method will return the
- actual format obtained.
-
- Note that after a QGLContext object has been constructed, \l
- create() must be called explicitly to create the actual OpenGL
- context. The context will be \l {isValid()}{invalid} if it was not
- possible to obtain a GL context at all.
-
- \sa format(), isValid()
-*/
-QGLContext::QGLContext(const QGLFormat &format)
- : d_ptr(new QGLContextPrivate(this))
-{
- Q_D(QGLContext);
- d->init(0, format);
-}
-
-static void qDeleteQGLContext(void *handle)
-{
- QGLContext *context = static_cast<QGLContext *>(handle);
- delete context;
-}
-
-QGLContext::QGLContext(QOpenGLContext *context)
- : d_ptr(new QGLContextPrivate(this))
-{
- Q_D(QGLContext);
- d->init(0, QGLFormat::fromSurfaceFormat(context->format()));
- d->guiGlContext = context;
- d->guiGlContext->setQGLContextHandle(this, qDeleteQGLContext);
- d->ownContext = false;
- d->valid = context->isValid();
- d->setupSharing();
-}
-
-/*!
- Returns the OpenGL context handle.
-*/
-QOpenGLContext *QGLContext::contextHandle() const
-{
- Q_D(const QGLContext);
- return d->guiGlContext;
-}
-
-/*!
- Returns an OpenGL context for the window context specified by the \a context
- parameter.
-*/
-QGLContext *QGLContext::fromOpenGLContext(QOpenGLContext *context)
-{
- if (!context)
- return 0;
- if (context->qGLContextHandle()) {
- return reinterpret_cast<QGLContext *>(context->qGLContextHandle());
- }
- QGLContext *glContext = new QGLContext(context);
- //Don't call create on context. This can cause the platformFormat to be set on the widget, which
- //will cause the platformWindow to be recreated.
- return glContext;
-}
-
-/*!
- Destroys the OpenGL context and frees its resources.
-*/
-
-QGLContext::~QGLContext()
-{
- // remove any textures cached in this context
- QGLTextureCache::instance()->removeContextTextures(this);
-
- // clean up resources specific to this context
- d_ptr->cleanup();
-
- QGLSignalProxy::instance()->emitAboutToDestroyContext(this);
- reset();
-}
-
-void QGLContextPrivate::cleanup()
-{
-}
-
-#define ctx q_ptr
-void QGLContextPrivate::setVertexAttribArrayEnabled(int arrayIndex, bool enabled)
-{
- Q_Q(QGLContext);
- Q_ASSERT(arrayIndex < QT_GL_VERTEX_ARRAY_TRACKED_COUNT);
-#ifdef glEnableVertexAttribArray
- Q_ASSERT(glEnableVertexAttribArray);
-#endif
-
- if (vertexAttributeArraysEnabledState[arrayIndex] && !enabled)
- q->functions()->glDisableVertexAttribArray(arrayIndex);
-
- if (!vertexAttributeArraysEnabledState[arrayIndex] && enabled)
- q->functions()->glEnableVertexAttribArray(arrayIndex);
-
- vertexAttributeArraysEnabledState[arrayIndex] = enabled;
-}
-
-void QGLContextPrivate::syncGlState()
-{
- Q_Q(QGLContext);
-#ifdef glEnableVertexAttribArray
- Q_ASSERT(glEnableVertexAttribArray);
-#endif
- for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i) {
- if (vertexAttributeArraysEnabledState[i])
- q->functions()->glEnableVertexAttribArray(i);
- else
- q->functions()->glDisableVertexAttribArray(i);
- }
-
-}
-#undef ctx
-
-void QGLContextPrivate::swapRegion(const QRegion &)
-{
- Q_Q(QGLContext);
- q->swapBuffers();
-}
-
-/*!
- \overload
-
- Reads the compressed texture file \a fileName and generates a 2D GL
- texture from it.
-
- This function can load DirectDrawSurface (DDS) textures in the
- DXT1, DXT3 and DXT5 DDS formats if the \c GL_ARB_texture_compression
- and \c GL_EXT_texture_compression_s3tc extensions are supported.
-
- Since 4.6.1, textures in the ETC1 format can be loaded if the
- \c GL_OES_compressed_ETC1_RGB8_texture extension is supported
- and the ETC1 texture has been encapsulated in the PVR container format.
- Also, textures in the PVRTC2 and PVRTC4 formats can be loaded
- if the \c GL_IMG_texture_compression_pvrtc extension is supported.
-
- \sa deleteTexture()
-*/
-
-GLuint QGLContext::bindTexture(const QString &fileName)
-{
- QGLTexture texture(this);
- QSize size = texture.bindCompressedTexture(fileName);
- if (!size.isValid())
- return 0;
- return texture.id;
-}
-
-static inline QRgb qt_gl_convertToGLFormatHelper(QRgb src_pixel, GLenum texture_format)
-{
- if (texture_format == GL_BGRA) {
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return ((src_pixel << 24) & 0xff000000)
- | ((src_pixel >> 24) & 0x000000ff)
- | ((src_pixel << 8) & 0x00ff0000)
- | ((src_pixel >> 8) & 0x0000ff00);
- } else {
- return src_pixel;
- }
- } else { // GL_RGBA
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (src_pixel << 8) | ((src_pixel >> 24) & 0xff);
- } else {
- return ((src_pixel << 16) & 0xff0000)
- | ((src_pixel >> 16) & 0xff)
- | (src_pixel & 0xff00ff00);
- }
- }
-}
-
-static void convertToGLFormatHelper(QImage &dst, const QImage &img, GLenum texture_format)
-{
- Q_ASSERT(dst.depth() == 32);
- Q_ASSERT(img.depth() == 32);
-
- if (dst.size() != img.size()) {
- int target_width = dst.width();
- int target_height = dst.height();
- qreal sx = target_width / qreal(img.width());
- qreal sy = target_height / qreal(img.height());
-
- quint32 *dest = (quint32 *) dst.scanLine(0); // NB! avoid detach here
- const uchar *srcPixels = img.constScanLine(img.height() - 1);
- int sbpl = img.bytesPerLine();
- int dbpl = dst.bytesPerLine();
-
- int ix = int(0x00010000 / sx);
- int iy = int(0x00010000 / sy);
-
- quint32 basex = int(0.5 * ix);
- quint32 srcy = int(0.5 * iy);
-
- // scale, swizzle and mirror in one loop
- while (target_height--) {
- const uint *src = (const quint32 *) (srcPixels - (srcy >> 16) * sbpl);
- int srcx = basex;
- for (int x=0; x<target_width; ++x) {
- dest[x] = qt_gl_convertToGLFormatHelper(src[srcx >> 16], texture_format);
- srcx += ix;
- }
- dest = (quint32 *)(((uchar *) dest) + dbpl);
- srcy += iy;
- }
- } else {
- const int width = img.width();
- const int height = img.height();
- const uint *p = (const uint*) img.scanLine(img.height() - 1);
- uint *q = (uint*) dst.scanLine(0);
-
- if (texture_format == GL_BGRA) {
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- // mirror + swizzle
- for (int i=0; i < height; ++i) {
- const uint *end = p + width;
- while (p < end) {
- *q = ((*p << 24) & 0xff000000)
- | ((*p >> 24) & 0x000000ff)
- | ((*p << 8) & 0x00ff0000)
- | ((*p >> 8) & 0x0000ff00);
- p++;
- q++;
- }
- p -= 2 * width;
- }
- } else {
- const uint bytesPerLine = img.bytesPerLine();
- for (int i=0; i < height; ++i) {
- memcpy(q, p, bytesPerLine);
- q += width;
- p -= width;
- }
- }
- } else {
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- for (int i=0; i < height; ++i) {
- const uint *end = p + width;
- while (p < end) {
- *q = (*p << 8) | ((*p >> 24) & 0xff);
- p++;
- q++;
- }
- p -= 2 * width;
- }
- } else {
- for (int i=0; i < height; ++i) {
- const uint *end = p + width;
- while (p < end) {
- *q = ((*p << 16) & 0xff0000) | ((*p >> 16) & 0xff) | (*p & 0xff00ff00);
- p++;
- q++;
- }
- p -= 2 * width;
- }
- }
- }
- }
-}
-
-/*! \internal */
-QGLTexture *QGLContextPrivate::bindTexture(const QImage &image, GLenum target, GLint format,
- QGLContext::BindOptions options)
-{
- Q_Q(QGLContext);
-
- const qint64 key = image.cacheKey();
- QGLTexture *texture = textureCacheLookup(key, target);
- if (texture) {
- if (image.paintingActive()) {
- // A QPainter is active on the image - take the safe route and replace the texture.
- q->deleteTexture(texture->id);
- texture = 0;
- } else {
- qgl_functions()->glBindTexture(target, texture->id);
- return texture;
- }
- }
-
- if (!texture)
- texture = bindTexture(image, target, format, key, options);
- // NOTE: bindTexture(const QImage&, GLenum, GLint, const qint64, bool) should never return null
- Q_ASSERT(texture);
-
- // Enable the cleanup hooks for this image so that the texture cache entry is removed when the
- // image gets deleted:
- QImagePixmapCleanupHooks::enableCleanupHooks(image);
-
- return texture;
-}
-
-// #define QGL_BIND_TEXTURE_DEBUG
-
-// ####TODO Properly #ifdef this file to use #define symbols actually defined
-// by OpenGL/ES includes
-#ifndef GL_UNSIGNED_INT_8_8_8_8_REV
-#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
-#endif
-
-// map from Qt's ARGB endianness-dependent format to GL's big-endian RGBA layout
-static inline void qgl_byteSwapImage(QImage &img, GLenum pixel_type)
-{
- const int width = img.width();
- const int height = img.height();
-
- if (pixel_type == GL_UNSIGNED_INT_8_8_8_8_REV
- || (pixel_type == GL_UNSIGNED_BYTE && QSysInfo::ByteOrder == QSysInfo::LittleEndian))
- {
- for (int i = 0; i < height; ++i) {
- uint *p = (uint *) img.scanLine(i);
- for (int x = 0; x < width; ++x)
- p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00);
- }
- } else {
- for (int i = 0; i < height; ++i) {
- uint *p = (uint *) img.scanLine(i);
- for (int x = 0; x < width; ++x)
- p[x] = (p[x] << 8) | ((p[x] >> 24) & 0xff);
- }
- }
-}
-
-QGLTexture* QGLContextPrivate::bindTexture(const QImage &image, GLenum target, GLint internalFormat,
- const qint64 key, QGLContext::BindOptions options)
-{
- Q_Q(QGLContext);
- QOpenGLFunctions *funcs = qgl_functions();
-
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf("QGLContextPrivate::bindTexture(), imageSize=(%d,%d), internalFormat =0x%x, options=%x, key=%llx\n",
- image.width(), image.height(), internalFormat, int(options), key);
- QTime time;
- time.start();
-#endif
-
-#ifndef QT_NO_DEBUG
- // Reset the gl error stack...git
- while (funcs->glGetError() != GL_NO_ERROR) ;
-#endif
-
- // Scale the pixmap if needed. GL textures needs to have the
- // dimensions 2^n+2(border) x 2^m+2(border), unless we're using GL
- // 2.0 or use the GL_TEXTURE_RECTANGLE texture target
- int tx_w = qNextPowerOfTwo(image.width() - 1);
- int tx_h = qNextPowerOfTwo(image.height() - 1);
-
- QImage img = image;
-
- if (!qgl_extensions()->hasOpenGLFeature(QOpenGLFunctions::NPOTTextures)
- && !(QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_ES_Version_2_0)
- && (target == GL_TEXTURE_2D && (tx_w != image.width() || tx_h != image.height())))
- {
- img = img.scaled(tx_w, tx_h);
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf(" - upscaled to %dx%d (%d ms)\n", tx_w, tx_h, time.elapsed());
-
-#endif
- }
-
- GLuint filtering = options & QGLContext::LinearFilteringBindOption ? GL_LINEAR : GL_NEAREST;
-
- GLuint tx_id;
- funcs->glGenTextures(1, &tx_id);
- funcs->glBindTexture(target, tx_id);
- funcs->glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filtering);
-
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- bool genMipmap = !ctx->isOpenGLES();
- if (glFormat.directRendering()
- && (qgl_extensions()->hasOpenGLExtension(QOpenGLExtensions::GenerateMipmap))
- && target == GL_TEXTURE_2D
- && (options & QGLContext::MipmapBindOption))
- {
-#if !defined(QT_OPENGL_ES_2)
- if (genMipmap) {
- funcs->glHint(GL_GENERATE_MIPMAP_HINT_SGIS, GL_NICEST);
- funcs->glTexParameteri(target, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
- } else {
- funcs->glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
- genMipmap = true;
- }
-#else
- funcs->glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
- genMipmap = true;
-#endif
- funcs->glTexParameteri(target, GL_TEXTURE_MIN_FILTER, options & QGLContext::LinearFilteringBindOption
- ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST);
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf(" - generating mipmaps (%d ms)\n", time.elapsed());
-#endif
- } else {
- funcs->glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filtering);
- }
-
- QImage::Format target_format = img.format();
- bool premul = options & QGLContext::PremultipliedAlphaBindOption;
- bool needsbyteswap = true;
- GLenum externalFormat;
- GLuint pixel_type;
- if (target_format == QImage::Format_RGBA8888
- || target_format == QImage::Format_RGBA8888_Premultiplied
- || target_format == QImage::Format_RGBX8888) {
- externalFormat = GL_RGBA;
- pixel_type = GL_UNSIGNED_BYTE;
- needsbyteswap = false;
- } else if (qgl_extensions()->hasOpenGLExtension(QOpenGLExtensions::BGRATextureFormat)) {
- externalFormat = GL_BGRA;
- needsbyteswap = false;
- if (QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_1_2)
- pixel_type = GL_UNSIGNED_INT_8_8_8_8_REV;
- else
- pixel_type = GL_UNSIGNED_BYTE;
- } else {
- externalFormat = GL_RGBA;
- pixel_type = GL_UNSIGNED_BYTE;
- }
-
- switch (target_format) {
- case QImage::Format_ARGB32:
- if (premul) {
- img = img.convertToFormat(target_format = QImage::Format_ARGB32_Premultiplied);
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf(" - converted ARGB32 -> ARGB32_Premultiplied (%d ms) \n", time.elapsed());
-#endif
- }
- break;
- case QImage::Format_ARGB32_Premultiplied:
- if (!premul) {
- img = img.convertToFormat(target_format = QImage::Format_ARGB32);
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf(" - converted ARGB32_Premultiplied -> ARGB32 (%d ms)\n", time.elapsed());
-#endif
- }
- break;
- case QImage::Format_RGBA8888:
- if (premul) {
- img = img.convertToFormat(target_format = QImage::Format_RGBA8888_Premultiplied);
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf(" - converted RGBA8888 -> RGBA8888_Premultiplied (%d ms) \n", time.elapsed());
-#endif
- }
- break;
- case QImage::Format_RGBA8888_Premultiplied:
- if (!premul) {
- img = img.convertToFormat(target_format = QImage::Format_RGBA8888);
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf(" - converted RGBA8888_Premultiplied -> RGBA8888 (%d ms) \n", time.elapsed());
-#endif
- }
- break;
- case QImage::Format_RGB16:
- pixel_type = GL_UNSIGNED_SHORT_5_6_5;
- externalFormat = GL_RGB;
- internalFormat = GL_RGB;
- needsbyteswap = false;
- break;
- case QImage::Format_RGB32:
- case QImage::Format_RGBX8888:
- break;
- default:
- // Ideally more formats would be converted directly to an RGBA8888 format,
- // but we are only guaranteed to have a fast conversion to an ARGB format.
- if (img.hasAlphaChannel()) {
- img = img.convertToFormat(premul
- ? QImage::Format_ARGB32_Premultiplied
- : QImage::Format_ARGB32);
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf(" - converted to 32-bit alpha format (%d ms)\n", time.elapsed());
-#endif
- } else {
- img = img.convertToFormat(QImage::Format_RGB32);
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf(" - converted to 32-bit (%d ms)\n", time.elapsed());
-#endif
- }
- }
-
- if (options & QGLContext::InvertedYBindOption) {
- if (img.isDetached()) {
- int ipl = img.bytesPerLine() / 4;
- int h = img.height();
- for (int y=0; y<h/2; ++y) {
- int *a = (int *) img.scanLine(y);
- int *b = (int *) img.scanLine(h - y - 1);
- for (int x=0; x<ipl; ++x)
- qSwap(a[x], b[x]);
- }
- } else {
- // Create a new image and copy across. If we use the
- // above in-place code then a full copy of the image is
- // made before the lines are swapped, which processes the
- // data twice. This version should only do it once.
- img = img.mirrored();
- }
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf(" - flipped bits over y (%d ms)\n", time.elapsed());
-#endif
- }
-
- if (needsbyteswap) {
- // The only case where we end up with a depth different from
- // 32 in the switch above is for the RGB16 case, where we do
- // not need a byteswap.
- Q_ASSERT(img.depth() == 32);
- qgl_byteSwapImage(img, pixel_type);
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf(" - did byte swapping (%d ms)\n", time.elapsed());
-#endif
- }
- if (ctx->isOpenGLES()) {
- // OpenGL/ES requires that the internal and external formats be
- // identical.
- internalFormat = externalFormat;
- }
-#ifdef QGL_BIND_TEXTURE_DEBUG
- printf(" - uploading, image.format=%d, externalFormat=0x%x, internalFormat=0x%x, pixel_type=0x%x\n",
- img.format(), externalFormat, internalFormat, pixel_type);
-#endif
-
- const QImage &constRef = img; // to avoid detach in bits()...
- funcs->glTexImage2D(target, 0, internalFormat, img.width(), img.height(), 0, externalFormat,
- pixel_type, constRef.bits());
- if (genMipmap && ctx->isOpenGLES())
- q->functions()->glGenerateMipmap(target);
-#ifndef QT_NO_DEBUG
- GLenum error = funcs->glGetError();
- if (error != GL_NO_ERROR) {
- qWarning(" - texture upload failed, error code 0x%x, enum: %d (%x)\n", error, target, target);
- }
-#endif
-
-#ifdef QGL_BIND_TEXTURE_DEBUG
- static int totalUploadTime = 0;
- totalUploadTime += time.elapsed();
- printf(" - upload done in %d ms, (accumulated: %d ms)\n", time.elapsed(), totalUploadTime);
-#endif
-
-
- // this assumes the size of a texture is always smaller than the max cache size
- int cost = img.width()*img.height()*4/1024;
- QGLTexture *texture = new QGLTexture(q, tx_id, target, options);
- QGLTextureCache::instance()->insert(q, key, texture, cost);
-
- return texture;
-}
-
-QGLTexture *QGLContextPrivate::textureCacheLookup(const qint64 key, GLenum target)
-{
- Q_Q(QGLContext);
- QGLTexture *texture = QGLTextureCache::instance()->getTexture(q, key);
- if (texture && texture->target == target
- && (texture->context == q || QGLContext::areSharing(q, texture->context)))
- {
- return texture;
- }
- return 0;
-}
-
-/*! \internal */
-QGLTexture *QGLContextPrivate::bindTexture(const QPixmap &pixmap, GLenum target, GLint format, QGLContext::BindOptions options)
-{
- Q_Q(QGLContext);
- QPlatformPixmap *pd = pixmap.handle();
- Q_UNUSED(pd);
-
- const qint64 key = pixmap.cacheKey();
- QGLTexture *texture = textureCacheLookup(key, target);
- if (texture) {
- if (pixmap.paintingActive()) {
- // A QPainter is active on the pixmap - take the safe route and replace the texture.
- q->deleteTexture(texture->id);
- texture = 0;
- } else {
- qgl_functions()->glBindTexture(target, texture->id);
- return texture;
- }
- }
-
- if (!texture) {
- QImage image;
- QPaintEngine* paintEngine = pixmap.paintEngine();
- if (!paintEngine || paintEngine->type() != QPaintEngine::Raster)
- image = pixmap.toImage();
- else {
- // QRasterPixmapData::toImage() will deep-copy the backing QImage if there's an active QPainter on it.
- // For performance reasons, we don't want that here, so we temporarily redirect the paint engine.
- QPaintDevice* currentPaintDevice = paintEngine->paintDevice();
- paintEngine->setPaintDevice(0);
- image = pixmap.toImage();
- paintEngine->setPaintDevice(currentPaintDevice);
- }
-
- // If the system depth is 16 and the pixmap doesn't have an alpha channel
- // then we convert it to RGB16 in the hope that it gets uploaded as a 16
- // bit texture which is much faster to access than a 32-bit one.
- if (pixmap.depth() == 16 && !image.hasAlphaChannel() )
- image = image.convertToFormat(QImage::Format_RGB16);
- texture = bindTexture(image, target, format, key, options);
- }
- // NOTE: bindTexture(const QImage&, GLenum, GLint, const qint64, bool) should never return null
- Q_ASSERT(texture);
-
- if (texture->id > 0)
- QImagePixmapCleanupHooks::enableCleanupHooks(pixmap);
-
- return texture;
-}
-
-/*! \internal */
-int QGLContextPrivate::maxTextureSize()
-{
- if (max_texture_size != -1)
- return max_texture_size;
-
- QOpenGLFunctions *funcs = qgl_functions();
- funcs->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size);
-
-#ifndef QT_OPENGL_ES
- Q_Q(QGLContext);
- if (!q->contextHandle()->isOpenGLES()) {
- GLenum proxy = GL_PROXY_TEXTURE_2D;
-
- GLint size;
- GLint next = 64;
- funcs->glTexImage2D(proxy, 0, GL_RGBA, next, next, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
- QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions();
- gl1funcs->glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &size);
- if (size == 0) {
- return max_texture_size;
- }
- do {
- size = next;
- next = size * 2;
-
- if (next > max_texture_size)
- break;
- funcs->glTexImage2D(proxy, 0, GL_RGBA, next, next, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
- gl1funcs->glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &next);
- } while (next > size);
-
- max_texture_size = size;
- }
-#endif
-
- return max_texture_size;
-}
-
-/*!
- Returns a QGLFunctions object that is initialized for this context.
- */
-QGLFunctions *QGLContext::functions() const
-{
- QGLContextPrivate *d = const_cast<QGLContextPrivate *>(d_func());
- if (!d->functions) {
- d->functions = new QGLFunctions(this);
- d->functions->initializeGLFunctions(this);
- }
- return d->functions;
-}
-
-/*!
- Generates and binds a 2D GL texture to the current context, based
- on \a image. The generated texture id is returned and can be used in
- later \c glBindTexture() calls.
-
- \overload
-*/
-GLuint QGLContext::bindTexture(const QImage &image, GLenum target, GLint format)
-{
- if (image.isNull())
- return 0;
-
- Q_D(QGLContext);
- QGLTexture *texture = d->bindTexture(image, target, format, DefaultBindOption);
- return texture->id;
-}
-
-/*!
- \since 4.6
-
- Generates and binds a 2D GL texture to the current context, based
- on \a image. The generated texture id is returned and can be used
- in later \c glBindTexture() calls.
-
- The \a target parameter specifies the texture target. The default
- target is \c GL_TEXTURE_2D.
-
- The \a format parameter sets the internal format for the
- texture. The default format is \c GL_RGBA.
-
- The binding \a options are a set of options used to decide how to
- bind the texture to the context.
-
- The texture that is generated is cached, so multiple calls to
- bindTexture() with the same QImage will return the same texture
- id.
-
- Note that we assume default values for the glPixelStore() and
- glPixelTransfer() parameters.
-
- \sa deleteTexture()
-*/
-GLuint QGLContext::bindTexture(const QImage &image, GLenum target, GLint format, BindOptions options)
-{
- if (image.isNull())
- return 0;
-
- Q_D(QGLContext);
- QGLTexture *texture = d->bindTexture(image, target, format, options);
- return texture->id;
-}
-
-/*! \overload
-
- Generates and binds a 2D GL texture based on \a pixmap.
-*/
-GLuint QGLContext::bindTexture(const QPixmap &pixmap, GLenum target, GLint format)
-{
- if (pixmap.isNull())
- return 0;
-
- Q_D(QGLContext);
- QGLTexture *texture = d->bindTexture(pixmap, target, format, DefaultBindOption);
- return texture->id;
-}
-
-/*!
- \overload
- \since 4.6
-
- Generates and binds a 2D GL texture to the current context, based
- on \a pixmap.
-*/
-GLuint QGLContext::bindTexture(const QPixmap &pixmap, GLenum target, GLint format, BindOptions options)
-{
- if (pixmap.isNull())
- return 0;
-
- Q_D(QGLContext);
- QGLTexture *texture = d->bindTexture(pixmap, target, format, options);
- return texture->id;
-}
-
-/*!
- Removes the texture identified by \a id from the texture cache,
- and calls glDeleteTextures() to delete the texture from the
- context.
-
- \sa bindTexture()
-*/
-void QGLContext::deleteTexture(GLuint id)
-{
- if (QGLTextureCache::instance()->remove(this, id))
- return;
- qgl_functions()->glDeleteTextures(1, &id);
-}
-
-void qt_add_rect_to_array(const QRectF &r, GLfloat *array)
-{
- qreal left = r.left();
- qreal right = r.right();
- qreal top = r.top();
- qreal bottom = r.bottom();
-
- array[0] = left;
- array[1] = top;
- array[2] = right;
- array[3] = top;
- array[4] = right;
- array[5] = bottom;
- array[6] = left;
- array[7] = bottom;
-}
-
-void qt_add_texcoords_to_array(qreal x1, qreal y1, qreal x2, qreal y2, GLfloat *array)
-{
- array[0] = x1;
- array[1] = y1;
- array[2] = x2;
- array[3] = y1;
- array[4] = x2;
- array[5] = y2;
- array[6] = x1;
- array[7] = y2;
-}
-
-#if !defined(QT_OPENGL_ES_2)
-
-static void qDrawTextureRect(const QRectF &target, GLint textureWidth, GLint textureHeight, GLenum textureTarget)
-{
- QOpenGLFunctions *funcs = qgl_functions();
- GLfloat tx = 1.0f;
- GLfloat ty = 1.0f;
-
-#ifdef QT_OPENGL_ES
- Q_UNUSED(textureWidth);
- Q_UNUSED(textureHeight);
- Q_UNUSED(textureTarget);
-#else
- if (textureTarget != GL_TEXTURE_2D && !QOpenGLContext::currentContext()->isOpenGLES()) {
- if (textureWidth == -1 || textureHeight == -1) {
- QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions();
- gl1funcs->glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_WIDTH, &textureWidth);
- gl1funcs->glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_HEIGHT, &textureHeight);
- }
-
- tx = GLfloat(textureWidth);
- ty = GLfloat(textureHeight);
- }
-#endif
-
- GLfloat texCoordArray[4*2] = {
- 0, ty, tx, ty, tx, 0, 0, 0
- };
-
- GLfloat vertexArray[4*2];
- qt_add_rect_to_array(target, vertexArray);
-
- QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions();
- gl1funcs->glVertexPointer(2, GL_FLOAT, 0, vertexArray);
- gl1funcs->glTexCoordPointer(2, GL_FLOAT, 0, texCoordArray);
-
- gl1funcs->glEnableClientState(GL_VERTEX_ARRAY);
- gl1funcs->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- funcs->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
- gl1funcs->glDisableClientState(GL_VERTEX_ARRAY);
- gl1funcs->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-}
-
-#endif // !QT_OPENGL_ES_2
-
-/*!
- \since 4.4
-
- This function supports the following use cases:
-
- \list
- \li On OpenGL and OpenGL ES 1.x it draws the given texture, \a textureId,
- to the given target rectangle, \a target, in OpenGL model space. The
- \a textureTarget should be a 2D texture target.
- \li On OpenGL and OpenGL ES 2.x, if a painter is active, not inside a
- beginNativePainting / endNativePainting block, and uses the
- engine with type QPaintEngine::OpenGL2, the function will draw the given
- texture, \a textureId, to the given target rectangle, \a target,
- respecting the current painter state. This will let you draw a texture
- with the clip, transform, render hints, and composition mode set by the
- painter. Note that the texture target needs to be GL_TEXTURE_2D for this
- use case, and that this is the only supported use case under OpenGL ES 2.x.
- \endlist
-
-*/
-void QGLContext::drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget)
-{
-#if !defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2)
- if (d_ptr->active_engine &&
- d_ptr->active_engine->type() == QPaintEngine::OpenGL2) {
- QGL2PaintEngineEx *eng = static_cast<QGL2PaintEngineEx*>(d_ptr->active_engine);
- if (!eng->isNativePaintingActive()) {
- QRectF src(0, 0, target.width(), target.height());
- QSize size(target.width(), target.height());
- if (eng->drawTexture(target, textureId, size, src))
- return;
- }
- }
-#endif
-
-#ifndef QT_OPENGL_ES_2
- QOpenGLFunctions *funcs = qgl_functions();
- if (!contextHandle()->isOpenGLES()) {
-#ifdef QT_OPENGL_ES
- if (textureTarget != GL_TEXTURE_2D) {
- qWarning("QGLContext::drawTexture(): texture target must be GL_TEXTURE_2D on OpenGL ES");
- return;
- }
-#else
- const bool wasEnabled = funcs->glIsEnabled(GL_TEXTURE_2D);
- GLint oldTexture;
- funcs->glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTexture);
-#endif
-
- funcs->glEnable(textureTarget);
- funcs->glBindTexture(textureTarget, textureId);
-
- qDrawTextureRect(target, -1, -1, textureTarget);
-
-#ifdef QT_OPENGL_ES
- funcs->glDisable(textureTarget);
-#else
- if (!wasEnabled)
- funcs->glDisable(textureTarget);
- funcs->glBindTexture(textureTarget, oldTexture);
-#endif
- return;
- }
-#else
- Q_UNUSED(target);
- Q_UNUSED(textureId);
- Q_UNUSED(textureTarget);
-#endif
- qWarning("drawTexture() with OpenGL ES 2.0 requires an active OpenGL2 paint engine");
-}
-
-/*!
- \since 4.4
-
- This function supports the following use cases:
-
- \list
- \li By default it draws the given texture, \a textureId,
- at the given \a point in OpenGL model space. The
- \a textureTarget should be a 2D texture target.
- \li If a painter is active, not inside a
- beginNativePainting / endNativePainting block, and uses the
- engine with type QPaintEngine::OpenGL2, the function will draw the given
- texture, \a textureId, at the given \a point,
- respecting the current painter state. This will let you draw a texture
- with the clip, transform, render hints, and composition mode set by the
- painter. Note that the texture target needs to be GL_TEXTURE_2D for this
- use case.
- \endlist
-
- \note This function is not supported under any version of OpenGL ES.
-*/
-void QGLContext::drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget)
-{
-#ifdef QT_OPENGL_ES
- Q_UNUSED(point);
- Q_UNUSED(textureId);
- Q_UNUSED(textureTarget);
-#else
- if (!contextHandle()->isOpenGLES()) {
- QOpenGLFunctions *funcs = qgl_functions();
- const bool wasEnabled = funcs->glIsEnabled(GL_TEXTURE_2D);
- GLint oldTexture;
- funcs->glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTexture);
-
- funcs->glEnable(textureTarget);
- funcs->glBindTexture(textureTarget, textureId);
-
- GLint textureWidth;
- GLint textureHeight;
-
- QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions();
- gl1funcs->glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_WIDTH, &textureWidth);
- gl1funcs->glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_HEIGHT, &textureHeight);
-
- if (d_ptr->active_engine &&
- d_ptr->active_engine->type() == QPaintEngine::OpenGL2) {
- QGL2PaintEngineEx *eng = static_cast<QGL2PaintEngineEx*>(d_ptr->active_engine);
- if (!eng->isNativePaintingActive()) {
- QRectF dest(point, QSizeF(textureWidth, textureHeight));
- QRectF src(0, 0, textureWidth, textureHeight);
- QSize size(textureWidth, textureHeight);
- if (eng->drawTexture(dest, textureId, size, src))
- return;
- }
- }
-
- qDrawTextureRect(QRectF(point, QSizeF(textureWidth, textureHeight)), textureWidth, textureHeight, textureTarget);
-
- if (!wasEnabled)
- funcs->glDisable(textureTarget);
- funcs->glBindTexture(textureTarget, oldTexture);
- return;
- }
-#endif
- qWarning("drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget) not supported with OpenGL ES, use rect version instead");
-}
-
-/*!
- This function sets the limit for the texture cache to \a size,
- expressed in kilobytes.
-
- By default, the cache limit is approximately 64 MB.
-
- \sa textureCacheLimit()
-*/
-void QGLContext::setTextureCacheLimit(int size)
-{
- QGLTextureCache::instance()->setMaxCost(size);
-}
-
-/*!
- Returns the current texture cache limit in kilobytes.
-
- \sa setTextureCacheLimit()
-*/
-int QGLContext::textureCacheLimit()
-{
- return QGLTextureCache::instance()->maxCost();
-}
-
-
-/*!
- \fn QGLFormat QGLContext::format() const
-
- Returns the frame buffer format that was obtained (this may be a
- subset of what was requested).
-
- \sa requestedFormat()
-*/
-
-/*!
- \fn QGLFormat QGLContext::requestedFormat() const
-
- Returns the frame buffer format that was originally requested in
- the constructor or setFormat().
-
- \sa format()
-*/
-
-/*!
- Sets a \a format for this context. The context is \l{reset()}{reset}.
-
- Call create() to create a new GL context that tries to match the
- new format.
-
- \snippet code/src_opengl_qgl.cpp 7
-
- \sa format(), reset(), create()
-*/
-
-void QGLContext::setFormat(const QGLFormat &format)
-{
- Q_D(QGLContext);
- reset();
- d->glFormat = d->reqFormat = format;
-}
-
-/*!
- \internal
-*/
-void QGLContext::setDevice(QPaintDevice *pDev)
-{
- Q_D(QGLContext);
- // Do not touch the valid flag here. The context is either a new one and
- // valid is not yet set or it is adapted from a valid QOpenGLContext in which
- // case it must remain valid.
- d->paintDevice = pDev;
- if (d->paintDevice && (d->paintDevice->devType() != QInternal::Widget
- && d->paintDevice->devType() != QInternal::Pixmap
- && d->paintDevice->devType() != QInternal::Pbuffer)) {
- qWarning("QGLContext: Unsupported paint device type");
- }
-}
-
-/*!
- \fn bool QGLContext::isValid() const
-
- Returns \c true if a GL rendering context has been successfully
- created; otherwise returns \c false.
-*/
-
-/*!
- \fn void QGLContext::setValid(bool valid)
- \internal
-
- Forces the GL rendering context to be valid.
-*/
-
-/*!
- \fn bool QGLContext::isSharing() const
-
- Returns \c true if this context is sharing its GL context with
- another QGLContext, otherwise false is returned. Note that context
- sharing might not be supported between contexts with different
- formats.
-*/
-
-/*!
- Returns \c true if \a context1 and \a context2 are sharing their
- GL resources such as textures, shader programs, etc;
- otherwise returns \c false.
-
- \since 4.6
-*/
-bool QGLContext::areSharing(const QGLContext *context1, const QGLContext *context2)
-{
- if (!context1 || !context2)
- return false;
- return context1->d_ptr->group == context2->d_ptr->group;
-}
-
-/*!
- \fn bool QGLContext::deviceIsPixmap() const
-
- Returns \c true if the paint device of this context is a pixmap;
- otherwise returns \c false.
-
- Since Qt 5 the paint device is never actually a pixmap. renderPixmap() is
- however still simulated using framebuffer objects and readbacks, and this
- function will return \c true in this case.
-*/
-
-/*!
- \fn bool QGLContext::windowCreated() const
-
- Returns \c true if a window has been created for this context;
- otherwise returns \c false.
-
- \sa setWindowCreated()
-*/
-
-/*!
- \fn void QGLContext::setWindowCreated(bool on)
-
- If \a on is true the context has had a window created for it. If
- \a on is false no window has been created for the context.
-
- \sa windowCreated()
-*/
-
-/*!
- \fn uint QGLContext::colorIndex(const QColor& c) const
-
- \internal
-
- Returns a colormap index for the color c, in ColorIndex mode. Used
- by qglColor() and qglClearColor().
-*/
-uint QGLContext::colorIndex(const QColor&) const
-{
- return 0;
-}
-
-/*!
- \fn bool QGLContext::initialized() const
-
- Returns \c true if this context has been initialized, i.e. if
- QGLWidget::initializeGL() has been performed on it; otherwise
- returns \c false.
-
- \sa setInitialized()
-*/
-
-/*!
- \fn void QGLContext::setInitialized(bool on)
-
- If \a on is true the context has been initialized, i.e.
- QGLContext::setInitialized() has been called on it. If \a on is
- false the context has not been initialized.
-
- \sa initialized()
-*/
-
-/*!
- \fn const QGLContext* QGLContext::currentContext()
-
- Returns the current context, i.e. the context to which any OpenGL
- commands will currently be directed. Returns 0 if no context is
- current.
-
- \sa makeCurrent()
-*/
-
-/*!
- \fn QColor QGLContext::overlayTransparentColor() const
-
- If this context is a valid context in an overlay plane, returns
- the plane's transparent color. Otherwise returns an \l{QColor::isValid()}{invalid} color.
-
- The returned color's \l{QColormap::pixel()}{pixel} value is
- the index of the transparent color in the colormap of the overlay
- plane. (Naturally, the color's RGB values are meaningless.)
-
- The returned QColor object will generally work as expected only
- when passed as the argument to QGLWidget::qglColor() or
- QGLWidget::qglClearColor(). Under certain circumstances it can
- also be used to draw transparent graphics with a QPainter.
-*/
-QColor QGLContext::overlayTransparentColor() const
-{
- return QColor(); // Invalid color
-}
-
-/*!
- Creates the GL context. Returns \c true if it was successful in
- creating a valid GL rendering context on the paint device
- specified in the constructor; otherwise returns \c false (i.e. the
- context is invalid).
-
- If the OpenGL implementation on your system does not support the requested
- version of OpenGL context, then QGLContext will try to create the closest
- matching version. The actual created context properties can be queried
- using the QGLFormat returned by the format() function. For example, if
- you request a context that supports OpenGL 4.3 Core profile but the driver
- and/or hardware only supports version 3.2 Core profile contexts then you will
- get a 3.2 Core profile context.
-
- After successful creation, format() returns the set of features of
- the created GL rendering context.
-
- If \a shareContext points to a valid QGLContext, this method will
- try to establish OpenGL display list and texture object sharing
- between this context and the \a shareContext. Note that this may
- fail if the two contexts have different \l {format()} {formats}.
- Use isSharing() to see if sharing is in effect.
-
- \warning Implementation note: initialization of C++ class
- members usually takes place in the class constructor. QGLContext
- is an exception because it must be simple to customize. The
- virtual functions chooseContext() (and chooseVisual() for X11) can
- be reimplemented in a subclass to select a particular context. The
- problem is that virtual functions are not properly called during
- construction (even though this is correct C++) because C++
- constructs class hierarchies from the bottom up. For this reason
- we need a create() function.
-
- \sa chooseContext(), format(), isValid()
-*/
-
-bool QGLContext::create(const QGLContext* shareContext)
-{
- Q_D(QGLContext);
- if (!d->paintDevice && !d->guiGlContext)
- return false;
-
- reset();
- d->valid = chooseContext(shareContext);
- if (d->valid && d->paintDevice && d->paintDevice->devType() == QInternal::Widget) {
- QWidgetPrivate *wd = qt_widget_private(static_cast<QWidget *>(d->paintDevice));
- wd->usesDoubleBufferedGLContext = d->glFormat.doubleBuffer();
- }
- return d->valid;
-}
-
-bool QGLContext::isValid() const
-{
- Q_D(const QGLContext);
- return d->valid;
-}
-
-void QGLContext::setValid(bool valid)
-{
- Q_D(QGLContext);
- d->valid = valid;
-}
-
-bool QGLContext::isSharing() const
-{
- Q_D(const QGLContext);
- return d->group->isSharing();
-}
-
-QGLFormat QGLContext::format() const
-{
- Q_D(const QGLContext);
- return d->glFormat;
-}
-
-QGLFormat QGLContext::requestedFormat() const
-{
- Q_D(const QGLContext);
- return d->reqFormat;
-}
-
- QPaintDevice* QGLContext::device() const
-{
- Q_D(const QGLContext);
- return d->paintDevice;
-}
-
-bool QGLContext::deviceIsPixmap() const
-{
- Q_D(const QGLContext);
- return !d->readback_target_size.isEmpty();
-}
-
-
-bool QGLContext::windowCreated() const
-{
- Q_D(const QGLContext);
- return d->crWin;
-}
-
-
-void QGLContext::setWindowCreated(bool on)
-{
- Q_D(QGLContext);
- d->crWin = on;
-}
-
-bool QGLContext::initialized() const
-{
- Q_D(const QGLContext);
- return d->initDone;
-}
-
-void QGLContext::setInitialized(bool on)
-{
- Q_D(QGLContext);
- d->initDone = on;
-}
-
-const QGLContext* QGLContext::currentContext()
-{
- if (const QOpenGLContext *threadContext = QOpenGLContext::currentContext()) {
- return QGLContext::fromOpenGLContext(const_cast<QOpenGLContext *>(threadContext));
- }
- return 0;
-}
-
-void QGLContextPrivate::setCurrentContext(QGLContext *context)
-{
- Q_UNUSED(context);
-}
-
-/*!
- Moves the QGLContext to the given \a thread.
-
- Enables calling swapBuffers() and makeCurrent() on the context in
- the given thread.
-*/
-void QGLContext::moveToThread(QThread *thread)
-{
- Q_D(QGLContext);
- if (d->guiGlContext)
- d->guiGlContext->moveToThread(thread);
-}
-
-/*!
- \fn bool QGLContext::chooseContext(const QGLContext* shareContext = 0)
-
- This semi-internal function is called by create(). It creates a
- system-dependent OpenGL handle that matches the format() of \a
- shareContext as closely as possible, returning true if successful
- or false if a suitable handle could not be found.
-
- On Windows, it calls the virtual function choosePixelFormat(),
- which finds a matching pixel format identifier. On X11, it calls
- the virtual function chooseVisual() which finds an appropriate X
- visual. On other platforms it may work differently.
-*/
-bool QGLContext::chooseContext(const QGLContext* shareContext)
-{
- Q_D(QGLContext);
- if(!d->paintDevice || d->paintDevice->devType() != QInternal::Widget) {
- // Unlike in Qt 4, the only possible target is a widget backed by an OpenGL-based
- // QWindow. Pixmaps in particular are not supported anymore as paint devices since
- // starting from Qt 5 QPixmap is raster-backed on almost all platforms.
- d->valid = false;
- }else {
- QWidget *widget = static_cast<QWidget *>(d->paintDevice);
- QGLFormat glformat = format();
- QSurfaceFormat winFormat = QGLFormat::toSurfaceFormat(glformat);
- if (widget->testAttribute(Qt::WA_TranslucentBackground))
- winFormat.setAlphaBufferSize(qMax(winFormat.alphaBufferSize(), 8));
-
- QWindow *window = widget->windowHandle();
- if (!window->handle()
- || window->surfaceType() != QWindow::OpenGLSurface
- || window->requestedFormat() != winFormat)
- {
- window->setSurfaceType(QWindow::OpenGLSurface);
- window->setFormat(winFormat);
- window->destroy();
- window->create();
- }
-
- if (d->ownContext)
- delete d->guiGlContext;
- d->ownContext = true;
- QOpenGLContext *shareGlContext = shareContext ? shareContext->d_func()->guiGlContext : 0;
- d->guiGlContext = new QOpenGLContext;
- d->guiGlContext->setFormat(winFormat);
- d->guiGlContext->setShareContext(shareGlContext);
- d->valid = d->guiGlContext->create();
-
- if (d->valid)
- d->guiGlContext->setQGLContextHandle(this, 0);
-
- d->glFormat = QGLFormat::fromSurfaceFormat(d->guiGlContext->format());
- d->setupSharing();
- }
-
-
- return d->valid;
-}
-
-/*!
- \fn void QGLContext::reset()
-
- Resets the context and makes it invalid.
-
- \sa create(), isValid()
-*/
-void QGLContext::reset()
-{
- Q_D(QGLContext);
- if (!d->valid)
- return;
- d->cleanup();
-
- d->crWin = false;
- d->sharing = false;
- d->valid = false;
- d->transpColor = QColor();
- d->initDone = false;
- QGLContextGroup::removeShare(this);
- if (d->guiGlContext) {
- if (QOpenGLContext::currentContext() == d->guiGlContext)
- doneCurrent();
- if (d->ownContext) {
- if (d->guiGlContext->thread() == QThread::currentThread())
- delete d->guiGlContext;
- else
- d->guiGlContext->deleteLater();
- } else
- d->guiGlContext->setQGLContextHandle(0,0);
- d->guiGlContext = 0;
- }
- d->ownContext = false;
-}
-
-/*!
- \fn void QGLContext::makeCurrent()
-
- Makes this context the current OpenGL rendering context. All GL
- functions you call operate on this context until another context
- is made current.
-
- In some very rare cases the underlying call may fail. If this
- occurs an error message is output to stderr.
-
- If you call this from a thread other than the main UI thread,
- make sure you've first pushed the context to the relevant thread
- from the UI thread using moveToThread().
-*/
-void QGLContext::makeCurrent()
-{
- Q_D(QGLContext);
- if (!d->paintDevice || d->paintDevice->devType() != QInternal::Widget)
- return;
-
- QWidget *widget = static_cast<QWidget *>(d->paintDevice);
- if (!widget->windowHandle())
- return;
-
- if (d->guiGlContext->makeCurrent(widget->windowHandle())) {
- if (!d->workaroundsCached) {
- d->workaroundsCached = true;
- const char *renderer = reinterpret_cast<const char *>(d->guiGlContext->functions()->glGetString(GL_RENDERER));
- if (renderer && strstr(renderer, "Mali")) {
- d->workaround_brokenFBOReadBack = true;
- }
- }
- }
-}
-
-/*!
- \fn void QGLContext::swapBuffers() const
-
- Call this to finish a frame of OpenGL rendering, and make sure to
- call makeCurrent() again before issuing any further OpenGL commands,
- for example as part of a new frame.
-*/
-void QGLContext::swapBuffers() const
-{
- Q_D(const QGLContext);
- if (!d->paintDevice || d->paintDevice->devType() != QInternal::Widget)
- return;
-
- QWidget *widget = static_cast<QWidget *>(d->paintDevice);
- if (!widget->windowHandle())
- return;
-
- d->guiGlContext->swapBuffers(widget->windowHandle());
-}
-
-/*!
- \fn void QGLContext::doneCurrent()
-
- Makes no GL context the current context. Normally, you do not need
- to call this function; QGLContext calls it as necessary.
-*/
-void QGLContext::doneCurrent()
-{
- Q_D(QGLContext);
- d->guiGlContext->doneCurrent();
-}
-
-/*!
- \fn QPaintDevice* QGLContext::device() const
-
- Returns the paint device set for this context.
-
- \sa QGLContext::QGLContext()
-*/
-
-/*****************************************************************************
- QGLWidget implementation
- *****************************************************************************/
-
-
-/*!
- \class QGLWidget
- \inmodule QtOpenGL
- \obsolete
-
- \brief The QGLWidget class is a widget for rendering OpenGL graphics.
-
- QGLWidget provides functionality for displaying OpenGL graphics
- integrated into a Qt application. It is very simple to use. You
- inherit from it and use the subclass like any other QWidget,
- except that you have the choice between using QPainter and
- standard OpenGL rendering commands.
-
- \note This class is part of the legacy \l {Qt OpenGL} module and,
- like the other \c QGL classes, should be avoided in the new
- applications. Instead, starting from Qt 5.4, prefer using
- QOpenGLWidget and the \c QOpenGL classes.
-
- QGLWidget provides three convenient virtual functions that you can
- reimplement in your subclass to perform the typical OpenGL tasks:
-
- \list
- \li paintGL() - Renders the OpenGL scene. Gets called whenever the widget
- needs to be updated.
- \li resizeGL() - Sets up the OpenGL viewport, projection, etc. Gets
- called whenever the widget has been resized (and also when it
- is shown for the first time because all newly created widgets get a
- resize event automatically).
- \li initializeGL() - Sets up the OpenGL rendering context, defines display
- lists, etc. Gets called once before the first time resizeGL() or
- paintGL() is called.
- \endlist
-
- Here is a rough outline of how a QGLWidget subclass might look:
-
- \snippet code/src_opengl_qgl.cpp 8
-
- If you need to trigger a repaint from places other than paintGL()
- (a typical example is when using \l{QTimer}{timers} to
- animate scenes), you should call the widget's updateGL() function.
-
- Your widget's OpenGL rendering context is made current when
- paintGL(), resizeGL(), or initializeGL() is called. If you need to
- call the standard OpenGL API functions from other places (e.g. in
- your widget's constructor or in your own paint functions), you
- must call makeCurrent() first.
-
- QGLWidget provides functions for requesting a new display
- \l{QGLFormat}{format} and you can also create widgets with
- customized rendering \l{QGLContext}{contexts}.
-
- You can also share OpenGL display lists between QGLWidget objects (see
- the documentation of the QGLWidget constructors for details).
-
- Note that under Windows, the QGLContext belonging to a QGLWidget
- has to be recreated when the QGLWidget is reparented. This is
- necessary due to limitations on the Windows platform. This will
- most likely cause problems for users that have subclassed and
- installed their own QGLContext on a QGLWidget. It is possible to
- work around this issue by putting the QGLWidget inside a dummy
- widget and then reparenting the dummy widget, instead of the
- QGLWidget. This will side-step the issue altogether, and is what
- we recommend for users that need this kind of functionality.
-
- On \macos, when Qt is built with Cocoa support, a QGLWidget
- can't have any sibling widgets placed ontop of itself. This is due
- to limitations in the Cocoa API and is not supported by Apple.
-
- \section1 Overlays
-
- The QGLWidget creates a GL overlay context in addition to the
- normal context if overlays are supported by the underlying system.
-
- If you want to use overlays, you specify it in the
- \l{QGLFormat}{format}. (Note: Overlay must be requested in the format
- passed to the QGLWidget constructor.) Your GL widget should also
- implement some or all of these virtual methods:
-
- \list
- \li paintOverlayGL()
- \li resizeOverlayGL()
- \li initializeOverlayGL()
- \endlist
-
- These methods work in the same way as the normal paintGL() etc.
- functions, except that they will be called when the overlay
- context is made current. You can explicitly make the overlay
- context current by using makeOverlayCurrent(), and you can access
- the overlay context directly (e.g. to ask for its transparent
- color) by calling overlayContext().
-
- On X servers in which the default visual is in an overlay plane,
- non-GL Qt windows can also be used for overlays.
-
- \section1 Painting Techniques
-
- As described above, subclass QGLWidget to render pure 3D content in the
- following way:
-
- \list
- \li Reimplement the QGLWidget::initializeGL() and QGLWidget::resizeGL() to
- set up the OpenGL state and provide a perspective transformation.
- \li Reimplement QGLWidget::paintGL() to paint the 3D scene, calling only
- OpenGL functions to draw on the widget.
- \endlist
-
- It is also possible to draw 2D graphics onto a QGLWidget subclass, it is necessary
- to reimplement QGLWidget::paintEvent() and do the following:
-
- \list
- \li Construct a QPainter object.
- \li Initialize it for use on the widget with the QPainter::begin() function.
- \li Draw primitives using QPainter's member functions.
- \li Call QPainter::end() to finish painting.
- \endlist
-
- \section1 Threading
-
- As of Qt version 4.8, support for doing threaded GL rendering has
- been improved. There are three scenarios that we currently support:
- \list
- \li 1. Buffer swapping in a thread.
-
- Swapping buffers in a double buffered context may be a
- synchronous, locking call that may be a costly operation in some
- GL implementations. Especially so on embedded devices. It's not
- optimal to have the CPU idling while the GPU is doing a buffer
- swap. In those cases it is possible to do the rendering in the
- main thread and do the actual buffer swap in a separate
- thread. This can be done with the following steps:
-
- 1. Call doneCurrent() in the main thread when the rendering is
- finished.
-
- 2. Call QGLContext::moveToThread(swapThread) to transfer ownership
- of the context to the swapping thread.
-
- 3. Notify the swapping thread that it can grab the context.
-
- 4. Make the rendering context current in the swapping thread with
- makeCurrent() and then call swapBuffers().
-
- 5. Call doneCurrent() in the swapping thread.
-
- 6. Call QGLContext::moveToThread(qApp->thread()) and notify the
- main thread that swapping is done.
-
- Doing this will free up the main thread so that it can continue
- with, for example, handling UI events or network requests. Even if
- there is a context swap involved, it may be preferable compared to
- having the main thread wait while the GPU finishes the swap
- operation. Note that this is highly implementation dependent.
-
- \li 2. Texture uploading in a thread.
-
- Doing texture uploads in a thread may be very useful for
- applications handling large amounts of images that needs to be
- displayed, like for instance a photo gallery application. This is
- supported in Qt through the existing bindTexture() API. A simple
- way of doing this is to create two sharing QGLWidgets. One is made
- current in the main GUI thread, while the other is made current in
- the texture upload thread. The widget in the uploading thread is
- never shown, it is only used for sharing textures with the main
- thread. For each texture that is bound via bindTexture(), notify
- the main thread so that it can start using the texture.
-
- \li 3. Using QPainter to draw into a QGLWidget in a thread.
-
- In Qt 4.8, it is possible to draw into a QGLWidget using a
- QPainter in a separate thread. Note that this is also possible for
- QGLPixelBuffers and QGLFramebufferObjects. Since this is only
- supported in the GL 2 paint engine, OpenGL 2.0 or OpenGL ES 2.0 is
- required.
-
- QGLWidgets can only be created in the main GUI thread. This means
- a call to doneCurrent() is necessary to release the GL context
- from the main thread, before the widget can be drawn into by
- another thread. You then need to call QGLContext::moveToThread()
- to transfer ownership of the context to the thread in which you
- want to make it current.
- Also, the main GUI thread will dispatch resize and
- paint events to a QGLWidget when the widget is resized, or parts
- of it becomes exposed or needs redrawing. It is therefore
- necessary to handle those events because the default
- implementations inside QGLWidget will try to make the QGLWidget's
- context current, which again will interfere with any threads
- rendering into the widget. Reimplement QGLWidget::paintEvent() and
- QGLWidget::resizeEvent() to notify the rendering thread that a
- resize or update is necessary, and be careful not to call the base
- class implementation. If you are rendering an animation, it might
- not be necessary to handle the paint event at all since the
- rendering thread is doing regular updates. Then it would be enough
- to reimplement QGLWidget::paintEvent() to do nothing.
-
- \endlist
-
- As a general rule when doing threaded rendering: be aware that
- binding and releasing contexts in different threads have to be
- synchronized by the user. A GL rendering context can only be
- current in one thread at any time. If you try to open a QPainter
- on a QGLWidget and the widget's rendering context is current in
- another thread, it will fail.
-
- In addition to this, rendering using raw GL calls in a separate
- thread is supported.
-
- \e{OpenGL is a trademark of Silicon Graphics, Inc. in the United States and other
- countries.}
-
- \sa QOpenGLWidget, QGLPixelBuffer
-*/
-
-/*!
- Constructs an OpenGL widget with a \a parent widget.
-
- The \l{QGLFormat::defaultFormat()}{default format} is
- used. The widget will be \l{isValid()}{invalid} if the
- system has no \l{QGLFormat::hasOpenGL()}{OpenGL support}.
-
- The \a parent and widget flag, \a f, arguments are passed
- to the QWidget constructor.
-
- If \a shareWidget is a valid QGLWidget, this widget will share
- OpenGL display lists and texture objects with \a shareWidget. But
- if \a shareWidget and this widget have different \l {format()}
- {formats}, sharing might not be possible. You can check whether
- sharing is in effect by calling isSharing().
-
- The initialization of OpenGL rendering state, etc. should be done
- by overriding the initializeGL() function, rather than in the
- constructor of your QGLWidget subclass.
-
- \sa QGLFormat::defaultFormat(), {Textures Example}
-*/
-
-QGLWidget::QGLWidget(QWidget *parent, const QGLWidget* shareWidget, Qt::WindowFlags f)
- : QWidget(*(new QGLWidgetPrivate), parent, f)
-{
- Q_D(QGLWidget);
- d->init(new QGLContext(QGLFormat::defaultFormat(), this), shareWidget);
-}
-
-/*!
- \internal
- */
-QGLWidget::QGLWidget(QGLWidgetPrivate &dd, const QGLFormat &format, QWidget *parent, const QGLWidget *shareWidget, Qt::WindowFlags f)
- : QWidget(dd, parent, f)
-{
- Q_D(QGLWidget);
- d->init(new QGLContext(format, this), shareWidget);
-
-}
-
-
-/*!
- Constructs an OpenGL widget with parent \a parent.
-
- The \a format argument specifies the desired
- \l{QGLFormat}{rendering options}.
- If the underlying OpenGL/Window system
- cannot satisfy all the features requested in \a format, the
- nearest subset of features will be used. After creation, the
- format() method will return the actual format obtained.
-
- The widget will be \l{isValid()}{invalid} if the system
- has no \l{QGLFormat::hasOpenGL()}{OpenGL support}.
-
- The \a parent and widget flag, \a f, arguments are passed
- to the QWidget constructor.
-
- If \a shareWidget is a valid QGLWidget, this widget will share
- OpenGL display lists and texture objects with \a shareWidget. But
- if \a shareWidget and this widget have different \l {format()}
- {formats}, sharing might not be possible. You can check whether
- sharing is in effect by calling isSharing().
-
- The initialization of OpenGL rendering state, etc. should be done
- by overriding the initializeGL() function, rather than in the
- constructor of your QGLWidget subclass.
-
- \sa QGLFormat::defaultFormat(), isValid()
-*/
-
-QGLWidget::QGLWidget(const QGLFormat &format, QWidget *parent, const QGLWidget* shareWidget,
- Qt::WindowFlags f)
- : QWidget(*(new QGLWidgetPrivate), parent, f)
-{
- Q_D(QGLWidget);
- d->init(new QGLContext(format, this), shareWidget);
-}
-
-/*!
- Constructs an OpenGL widget with parent \a parent.
-
- The \a context argument is a pointer to the QGLContext that
- you wish to be bound to this widget. This allows you to pass in
- your own QGLContext sub-classes.
-
- The widget will be \l{isValid()}{invalid} if the system
- has no \l{QGLFormat::hasOpenGL()}{OpenGL support}.
-
- The \a parent and widget flag, \a f, arguments are passed
- to the QWidget constructor.
-
- If \a shareWidget is a valid QGLWidget, this widget will share
- OpenGL display lists and texture objects with \a shareWidget. But
- if \a shareWidget and this widget have different \l {format()}
- {formats}, sharing might not be possible. You can check whether
- sharing is in effect by calling isSharing().
-
- The initialization of OpenGL rendering state, etc. should be done
- by overriding the initializeGL() function, rather than in the
- constructor of your QGLWidget subclass.
-
- \sa QGLFormat::defaultFormat(), isValid()
-*/
-QGLWidget::QGLWidget(QGLContext *context, QWidget *parent, const QGLWidget *shareWidget,
- Qt::WindowFlags f)
- : QWidget(*(new QGLWidgetPrivate), parent, f)
-{
- Q_D(QGLWidget);
- d->init(context, shareWidget);
-}
-
-/*!
- Destroys the widget.
-*/
-
-QGLWidget::~QGLWidget()
-{
- Q_D(QGLWidget);
- delete d->glcx;
- d->glcx = 0;
- d->cleanupColormaps();
-}
-
-/*!
- \fn QGLFormat QGLWidget::format() const
-
- Returns the format of the contained GL rendering context.
-*/
-
-/*!
- \fn bool QGLWidget::doubleBuffer() const
-
- Returns \c true if the contained GL rendering context has double
- buffering; otherwise returns \c false.
-
- \sa QGLFormat::doubleBuffer()
-*/
-
-/*!
- \fn void QGLWidget::setAutoBufferSwap(bool on)
-
- If \a on is true automatic GL buffer swapping is switched on;
- otherwise it is switched off.
-
- If \a on is true and the widget is using a double-buffered format,
- the background and foreground GL buffers will automatically be
- swapped after each paintGL() call.
-
- The buffer auto-swapping is on by default.
-
- \sa autoBufferSwap(), doubleBuffer(), swapBuffers()
-*/
-
-/*!
- \fn bool QGLWidget::autoBufferSwap() const
-
- Returns \c true if the widget is doing automatic GL buffer swapping;
- otherwise returns \c false.
-
- \sa setAutoBufferSwap()
-*/
-
-/*!
- \fn QFunctionPointer QGLContext::getProcAddress(const QString &proc) const
-
- Returns a function pointer to the GL extension function passed in
- \a proc. \nullptr is returned if a pointer to the function could not be
- obtained.
-*/
-QFunctionPointer QGLContext::getProcAddress(const QString &procName) const
-{
- Q_D(const QGLContext);
- return d->guiGlContext->getProcAddress(procName.toLatin1());
-}
-
-/*!
- \fn bool QGLWidget::isValid() const
-
- Returns \c true if the widget has a valid GL rendering context;
- otherwise returns \c false. A widget will be invalid if the system
- has no \l{QGLFormat::hasOpenGL()}{OpenGL support}.
-*/
-
-bool QGLWidget::isValid() const
-{
- Q_D(const QGLWidget);
- return d->glcx && d->glcx->isValid();
-}
-
-/*!
- \fn bool QGLWidget::isSharing() const
-
- Returns \c true if this widget's GL context is shared with another GL
- context, otherwise false is returned. Context sharing might not be
- possible if the widgets use different formats.
-
- \sa format()
-*/
-
-bool QGLWidget::isSharing() const
-{
- Q_D(const QGLWidget);
- return d->glcx->isSharing();
-}
-
-/*!
- \fn void QGLWidget::makeCurrent()
-
- Makes this widget the current widget for OpenGL operations, i.e.
- makes the widget's rendering context the current OpenGL rendering
- context.
-*/
-
-void QGLWidget::makeCurrent()
-{
- Q_D(QGLWidget);
- d->makeCurrent();
-}
-
-bool QGLWidgetPrivate::makeCurrent()
-{
- glcx->makeCurrent();
- return QGLContext::currentContext() == glcx;
-}
-
-/*!
- \fn void QGLWidget::doneCurrent()
-
- Makes no GL context the current context. Normally, you do not need
- to call this function; QGLContext calls it as necessary. However,
- it may be useful in multithreaded environments.
-*/
-
-void QGLWidget::doneCurrent()
-{
- Q_D(QGLWidget);
- d->glcx->doneCurrent();
-}
-
-/*!
- \fn void QGLWidget::swapBuffers()
-
- Swaps the screen contents with an off-screen buffer. This only
- works if the widget's format specifies double buffer mode.
-
- Normally, there is no need to explicitly call this function
- because it is done automatically after each widget repaint, i.e.
- each time after paintGL() has been executed.
-
- \sa doubleBuffer(), setAutoBufferSwap(), QGLFormat::setDoubleBuffer()
-*/
-
-void QGLWidget::swapBuffers()
-{
- Q_D(QGLWidget);
- d->glcx->swapBuffers();
-}
-
-
-/*!
- \fn const QGLContext* QGLWidget::overlayContext() const
-
- Returns the overlay context of this widget, or \nullptr if this
- widget has no overlay.
-
- \sa context()
-*/
-const QGLContext* QGLWidget::overlayContext() const
-{
- return nullptr;
-}
-
-/*!
- \fn void QGLWidget::makeOverlayCurrent()
-
- Makes the overlay context of this widget current. Use this if you
- need to issue OpenGL commands to the overlay context outside of
- initializeOverlayGL(), resizeOverlayGL(), and paintOverlayGL().
-
- Does nothing if this widget has no overlay.
-
- \sa makeCurrent()
-*/
-void QGLWidget::makeOverlayCurrent()
-{
-}
-
-/*!
- \obsolete
-
- Sets a new format for this widget.
-
- If the underlying OpenGL/Window system cannot satisfy all the
- features requested in \a format, the nearest subset of features will
- be used. After creation, the format() method will return the actual
- rendering context format obtained.
-
- The widget will be assigned a new QGLContext, and the initializeGL()
- function will be executed for this new context before the first
- resizeGL() or paintGL().
-
- This method will try to keep display list and texture object sharing
- in effect with other QGLWidget objects, but changing the format might make
- sharing impossible. Use isSharing() to see if sharing is still in
- effect.
-
- \sa format(), isSharing(), isValid()
-*/
-
-void QGLWidget::setFormat(const QGLFormat &format)
-{
- setContext(new QGLContext(format,this));
-}
-
-
-
-
-/*!
- \fn QGLContext *QGLWidget::context() const
-
- Returns the context of this widget.
-
- It is possible that the context is not valid (see isValid()), for
- example, if the underlying hardware does not support the format
- attributes that were requested.
-*/
-
-/*!
- \fn void QGLWidget::setContext(QGLContext *context,
- const QGLContext* shareContext,
- bool deleteOldContext)
- \obsolete
-
- Sets a new context for this widget. The QGLContext \a context must
- be created using \e new. QGLWidget will delete \a context when
- another context is set or when the widget is destroyed.
-
- If \a context is invalid, QGLContext::create() is performed on
- it. The initializeGL() function will then be executed for the new
- context before the first resizeGL() or paintGL().
-
- If \a context is invalid, this method will try to keep display list
- and texture object sharing in effect, or (if \a shareContext points
- to a valid context) start display list and texture object sharing
- with that context, but sharing might be impossible if the two
- contexts have different \l {format()} {formats}. Use isSharing() to
- see whether sharing is in effect.
-
- If \a deleteOldContext is true (the default), the existing context
- will be deleted. You may use false here if you have kept a pointer
- to the old context (as returned by context()), and want to restore
- that context later.
-
- \note This function is obsolete and should no longer be used. If you were
- using it to recreate the context for a QGLWidget, you should instead create a
- new QGLWidget or use the QOpenGLContext API in conjunction with QWindow.
- There is currently no officially supported way to substitute QGLWidget's
- context with your own implementation of QGLContext.
-
- \sa context(), isSharing()
-*/
-void QGLWidget::setContext(QGLContext *context,
- const QGLContext* shareContext,
- bool deleteOldContext)
-{
- Q_D(QGLWidget);
- if (context == 0) {
- qWarning("QGLWidget::setContext: Cannot set null context");
- return;
- }
-
- if (context->device() == 0) // a context may refere to more than 1 window.
- context->setDevice(this); //but its better to point to 1 of them than none of them.
-
- QGLContext* oldcx = d->glcx;
- d->glcx = context;
-
- if (!d->glcx->isValid())
- d->glcx->create(shareContext ? shareContext : oldcx);
-
- if (deleteOldContext)
- delete oldcx;
-}
-
-/*!
- \fn void QGLWidget::updateGL()
-
- Updates the widget by calling glDraw().
-*/
-
-void QGLWidget::updateGL()
-{
- Q_D(QGLWidget);
- const bool targetIsOffscreen = !d->glcx->d_ptr->readback_target_size.isEmpty();
- if (updatesEnabled() && (testAttribute(Qt::WA_Mapped) || targetIsOffscreen))
- glDraw();
-}
-
-
-/*!
- \fn void QGLWidget::updateOverlayGL()
-
- Updates the widget's overlay (if any). Will cause the virtual
- function paintOverlayGL() to be executed.
-
- The widget's rendering context will become the current context and
- initializeGL() will be called if it hasn't already been called.
-*/
-void QGLWidget::updateOverlayGL()
-{
-}
-
-/*!
- This virtual function is called once before the first call to
- paintGL() or resizeGL(), and then once whenever the widget has
- been assigned a new QGLContext. Reimplement it in a subclass.
-
- This function should set up any required OpenGL context rendering
- flags, defining display lists, etc.
-
- There is no need to call makeCurrent() because this has already
- been done when this function is called.
-*/
-
-void QGLWidget::initializeGL()
-{
-}
-
-
-/*!
- This virtual function is called whenever the widget needs to be
- painted. Reimplement it in a subclass.
-
- There is no need to call makeCurrent() because this has already
- been done when this function is called.
-*/
-
-void QGLWidget::paintGL()
-{
- qgl_functions()->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-}
-
-
-/*!
- \fn void QGLWidget::resizeGL(int width , int height)
-
- This virtual function is called whenever the widget has been
- resized. The new size is passed in \a width and \a height.
- Reimplement it in a subclass.
-
- There is no need to call makeCurrent() because this has already
- been done when this function is called.
-*/
-
-void QGLWidget::resizeGL(int, int)
-{
-}
-
-
-
-/*!
- This virtual function is used in the same manner as initializeGL()
- except that it operates on the widget's overlay context instead of
- the widget's main context. This means that initializeOverlayGL()
- is called once before the first call to paintOverlayGL() or
- resizeOverlayGL(). Reimplement it in a subclass.
-
- This function should set up any required OpenGL context rendering
- flags, defining display lists, etc. for the overlay context.
-
- There is no need to call makeOverlayCurrent() because this has
- already been done when this function is called.
-*/
-
-void QGLWidget::initializeOverlayGL()
-{
-}
-
-
-/*!
- This virtual function is used in the same manner as paintGL()
- except that it operates on the widget's overlay context instead of
- the widget's main context. This means that paintOverlayGL() is
- called whenever the widget's overlay needs to be painted.
- Reimplement it in a subclass.
-
- There is no need to call makeOverlayCurrent() because this has
- already been done when this function is called.
-*/
-
-void QGLWidget::paintOverlayGL()
-{
-}
-
-
-/*!
- \fn void QGLWidget::resizeOverlayGL(int width , int height)
-
- This virtual function is used in the same manner as paintGL()
- except that it operates on the widget's overlay context instead of
- the widget's main context. This means that resizeOverlayGL() is
- called whenever the widget has been resized. The new size is
- passed in \a width and \a height. Reimplement it in a subclass.
-
- There is no need to call makeOverlayCurrent() because this has
- already been done when this function is called.
-*/
-
-void QGLWidget::resizeOverlayGL(int, int)
-{
-}
-
-/*!\reimp
-*/
-bool QGLWidget::event(QEvent *e)
-{
- Q_D(QGLWidget);
-
- // A re-parent will destroy the window and re-create it. We should not reset the context while it happens.
- if (e->type() == QEvent::ParentAboutToChange)
- d->parent_changing = true;
-
- if (e->type() == QEvent::ParentChange)
- d->parent_changing = false;
-
- return QWidget::event(e);
-}
-
-/*!
- \fn void QGLWidget::paintEvent(QPaintEvent *event)
-
- Handles paint events passed in the \a event parameter. Will cause
- the virtual paintGL() function to be called.
-
- The widget's rendering context will become the current context and
- initializeGL() will be called if it hasn't already been called.
-*/
-
-void QGLWidget::paintEvent(QPaintEvent *)
-{
- if (updatesEnabled()) {
- glDraw();
- updateOverlayGL();
- }
-}
-
-
-/*!
- \fn void QGLWidget::resizeEvent(QResizeEvent *event)
-
- Handles resize events that are passed in the \a event parameter.
- Calls the virtual function resizeGL().
-*/
-void QGLWidget::resizeEvent(QResizeEvent *e)
-{
- Q_D(QGLWidget);
-
- QWidget::resizeEvent(e);
- if (!isValid())
- return;
- if (!d->makeCurrent())
- return;
- if (!d->glcx->initialized())
- glInit();
- const qreal scaleFactor = (window() && window()->windowHandle()) ?
- window()->windowHandle()->devicePixelRatio() : 1.0;
-
- resizeGL(width() * scaleFactor, height() * scaleFactor);
-}
-
-/*!
- Renders the current scene on a pixmap and returns the pixmap.
-
- You can use this method on both visible and invisible QGLWidget objects.
-
- Internally the function renders into a framebuffer object and performs pixel
- readback. This has a performance penalty, meaning that this function is not
- suitable to be called at a high frequency.
-
- After creating and binding the framebuffer object, the function will call
- initializeGL(), resizeGL(), and paintGL(). On the next normal update
- initializeGL() and resizeGL() will be triggered again since the size of the
- destination pixmap and the QGLWidget's size may differ.
-
- The size of the pixmap will be \a w pixels wide and \a h pixels high unless
- one of these parameters is 0 (the default), in which case the pixmap will
- have the same size as the widget.
-
- Care must be taken when using framebuffer objects in paintGL() in
- combination with this function. To switch back to the default framebuffer,
- use QGLFramebufferObject::bindDefault(). Binding FBO 0 is wrong since
- renderPixmap() uses a custom framebuffer instead of the one provided by the
- windowing system.
-
- \a useContext is ignored. Historically this parameter enabled the usage of
- the existing GL context. This is not supported anymore since additional
- contexts are never created.
-
- Overlays are not rendered onto the pixmap.
-
- If the GL rendering context and the desktop have different bit
- depths, the result will most likely look surprising.
-
- Note that the creation of display lists, modifications of the view
- frustum etc. should be done from within initializeGL(). If this is
- not done, the temporary QGLContext will not be initialized
- properly, and the rendered pixmap may be incomplete/corrupted.
-*/
-
-QPixmap QGLWidget::renderPixmap(int w, int h, bool useContext)
-{
- Q_UNUSED(useContext);
- Q_D(QGLWidget);
-
- QSize sz = size();
- if ((w > 0) && (h > 0))
- sz = QSize(w, h);
-
- QPixmap pm;
- if (d->glcx->isValid()) {
- d->glcx->makeCurrent();
- QGLFramebufferObject fbo(sz, QGLFramebufferObject::CombinedDepthStencil);
- fbo.bind();
- d->glcx->setInitialized(false);
- uint prevDefaultFbo = d->glcx->d_ptr->default_fbo;
- d->glcx->d_ptr->default_fbo = fbo.handle();
- d->glcx->d_ptr->readback_target_size = sz;
- updateGL();
- fbo.release();
- pm = QPixmap::fromImage(fbo.toImage());
- d->glcx->d_ptr->default_fbo = prevDefaultFbo;
- d->glcx->setInitialized(false);
- d->glcx->d_ptr->readback_target_size = QSize();
- }
-
- return pm;
-}
-
-/*!
- Returns an image of the frame buffer. If \a withAlpha is true the
- alpha channel is included.
-
- Depending on your hardware, you can explicitly select which color
- buffer to grab with a glReadBuffer() call before calling this
- function.
-
- On QNX the back buffer is not preserved when swapBuffers() is called. The back buffer
- where this function reads from, might thus not contain the same content as the front buffer.
- In order to retrieve what is currently visible on the screen, swapBuffers()
- has to be executed prior to this function call.
-*/
-QImage QGLWidget::grabFrameBuffer(bool withAlpha)
-{
- makeCurrent();
- QImage res;
- qreal pixelRatio = devicePixelRatioF();
- int w = pixelRatio * width();
- int h = pixelRatio * height();
- if (format().rgba())
- res = qt_gl_read_frame_buffer(QSize(w, h), format().alpha(), withAlpha);
- res.setDevicePixelRatio(pixelRatio);
- return res;
-}
-
-
-
-/*!
- Initializes OpenGL for this widget's context. Calls the virtual
- function initializeGL().
-*/
-
-void QGLWidget::glInit()
-{
- Q_D(QGLWidget);
- if (!isValid())
- return;
- if (!d->makeCurrent())
- return;
- initializeGL();
- d->glcx->setInitialized(true);
-}
-
-
-/*!
- Executes the virtual function paintGL().
-
- The widget's rendering context will become the current context and
- initializeGL() will be called if it hasn't already been called.
-*/
-
-void QGLWidget::glDraw()
-{
- Q_D(QGLWidget);
- if (!isValid())
- return;
- if (!d->makeCurrent())
- return;
-#ifndef QT_OPENGL_ES
- if (d->glcx->deviceIsPixmap() && !d->glcx->contextHandle()->isOpenGLES())
- qgl1_functions()->glDrawBuffer(GL_FRONT);
-#endif
- QSize readback_target_size = d->glcx->d_ptr->readback_target_size;
- if (!d->glcx->initialized()) {
- glInit();
- const qreal scaleFactor = (window() && window()->windowHandle()) ?
- window()->windowHandle()->devicePixelRatio() : 1.0;
- int w, h;
- if (readback_target_size.isEmpty()) {
- w = d->glcx->device()->width() * scaleFactor;
- h = d->glcx->device()->height() * scaleFactor;
- } else {
- w = readback_target_size.width();
- h = readback_target_size.height();
- }
- resizeGL(w, h); // New context needs this "resize"
- }
- paintGL();
- if (doubleBuffer() && readback_target_size.isEmpty()) {
- if (d->autoSwap)
- swapBuffers();
- } else {
- qgl_functions()->glFlush();
- }
-}
-
-/*!
- Convenience function for specifying a drawing color to OpenGL.
- Calls glColor4 (in RGBA mode) or glIndex (in color-index mode)
- with the color \a c. Applies to this widgets GL context.
-
- \note This function is not supported on OpenGL/ES 2.0 systems.
-
- \sa qglClearColor(), QGLContext::currentContext(), QColor
-*/
-
-void QGLWidget::qglColor(const QColor& c) const
-{
-#if !defined(QT_OPENGL_ES_2)
-#ifdef QT_OPENGL_ES
- qgl_functions()->glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF());
-#else
- Q_D(const QGLWidget);
- const QGLContext *ctx = QGLContext::currentContext();
- if (ctx && !ctx->contextHandle()->isOpenGLES()) {
- if (ctx->format().rgba())
- qgl1_functions()->glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF());
- else if (!d->cmap.isEmpty()) { // QGLColormap in use?
- int i = d->cmap.find(c.rgb());
- if (i < 0)
- i = d->cmap.findNearest(c.rgb());
- qgl1_functions()->glIndexi(i);
- } else
- qgl1_functions()->glIndexi(ctx->colorIndex(c));
- }
-#endif //QT_OPENGL_ES
-#else
- Q_UNUSED(c);
-#endif //QT_OPENGL_ES_2
-}
-
-/*!
- Convenience function for specifying the clearing color to OpenGL.
- Calls glClearColor (in RGBA mode) or glClearIndex (in color-index
- mode) with the color \a c. Applies to this widgets GL context.
-
- \sa qglColor(), QGLContext::currentContext(), QColor
-*/
-
-void QGLWidget::qglClearColor(const QColor& c) const
-{
-#ifdef QT_OPENGL_ES
- qgl_functions()->glClearColor(c.redF(), c.greenF(), c.blueF(), c.alphaF());
-#else
- Q_D(const QGLWidget);
- const QGLContext *ctx = QGLContext::currentContext();
- if (ctx && !ctx->contextHandle()->isOpenGLES()) {
- if (ctx->format().rgba())
- qgl_functions()->glClearColor(c.redF(), c.greenF(), c.blueF(), c.alphaF());
- else if (!d->cmap.isEmpty()) { // QGLColormap in use?
- int i = d->cmap.find(c.rgb());
- if (i < 0)
- i = d->cmap.findNearest(c.rgb());
- qgl1_functions()->glClearIndex(i);
- } else {
- qgl1_functions()->glClearIndex(ctx->colorIndex(c));
- }
- } else {
- qgl_functions()->glClearColor(c.redF(), c.greenF(), c.blueF(), c.alphaF());
- }
-#endif
-}
-
-
-/*!
- Converts the image \a img into the unnamed format expected by
- OpenGL functions such as glTexImage2D(). The returned image is not
- usable as a QImage, but QImage::width(), QImage::height() and
- QImage::bits() may be used with OpenGL. The GL format used is
- \c GL_RGBA.
-
- \omit ###
-
- \l opengl/texture example
- The following few lines are from the texture example. Most of the
- code is irrelevant, so we just quote the relevant bits:
-
- \quotefromfile opengl/texture/gltexobj.cpp
- \skipto tex1
- \printline tex1
- \printline gllogo.bmp
-
- We create \e tex1 (and another variable) for OpenGL, and load a real
- image into \e buf.
-
- \skipto convertToGLFormat
- \printline convertToGLFormat
-
- A few lines later, we convert \e buf into OpenGL format and store it
- in \e tex1.
-
- \skipto glTexImage2D
- \printline glTexImage2D
- \printline tex1.bits
-
- Note the dimension restrictions for texture images as described in
- the glTexImage2D() documentation. The width must be 2^m + 2*border
- and the height 2^n + 2*border where m and n are integers and
- border is either 0 or 1.
-
- Another function in the same example uses \e tex1 with OpenGL.
-
- \endomit
-*/
-
-QImage QGLWidget::convertToGLFormat(const QImage& img)
-{
- QImage res(img.size(), QImage::Format_ARGB32);
- convertToGLFormatHelper(res, img.convertToFormat(QImage::Format_ARGB32), GL_RGBA);
- return res;
-}
-
-
-/*!
- \fn QGLColormap & QGLWidget::colormap() const
-
- Returns the colormap for this widget.
-
- Usually it is only top-level widgets that can have different
- colormaps installed. Asking for the colormap of a child widget
- will return the colormap for the child's top-level widget.
-
- If no colormap has been set for this widget, the QGLColormap
- returned will be empty.
-
- \sa setColormap(), QGLColormap::isEmpty()
-*/
-const QGLColormap & QGLWidget::colormap() const
-{
- Q_D(const QGLWidget);
- return d->cmap;
-}
-
-/*!
- \fn void QGLWidget::setColormap(const QGLColormap & cmap)
-
- Set the colormap for this widget to \a cmap. Usually it is only
- top-level widgets that can have colormaps installed.
-
- \sa colormap()
-*/
-void QGLWidget::setColormap(const QGLColormap & c)
-{
- Q_UNUSED(c);
-}
-
-#ifndef QT_OPENGL_ES
-
-static void qt_save_gl_state()
-{
- QOpenGLFunctions *funcs = qgl_functions();
- QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions();
-
- gl1funcs->glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
- gl1funcs->glPushAttrib(GL_ALL_ATTRIB_BITS);
- gl1funcs->glMatrixMode(GL_TEXTURE);
- gl1funcs->glPushMatrix();
- gl1funcs->glLoadIdentity();
- gl1funcs->glMatrixMode(GL_PROJECTION);
- gl1funcs->glPushMatrix();
- gl1funcs->glMatrixMode(GL_MODELVIEW);
- gl1funcs->glPushMatrix();
-
- gl1funcs->glShadeModel(GL_FLAT);
- funcs->glDisable(GL_CULL_FACE);
- funcs->glDisable(GL_LIGHTING);
- funcs->glDisable(GL_STENCIL_TEST);
- funcs->glDisable(GL_DEPTH_TEST);
- funcs->glEnable(GL_BLEND);
- funcs->glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
-}
-
-static void qt_restore_gl_state()
-{
- QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions();
-
- gl1funcs->glMatrixMode(GL_TEXTURE);
- gl1funcs->glPopMatrix();
- gl1funcs->glMatrixMode(GL_PROJECTION);
- gl1funcs->glPopMatrix();
- gl1funcs->glMatrixMode(GL_MODELVIEW);
- gl1funcs->glPopMatrix();
- gl1funcs->glPopAttrib();
- gl1funcs->glPopClientAttrib();
-}
-
-static void qt_gl_draw_text(QPainter *p, int x, int y, const QString &str,
- const QFont &font)
-{
- GLfloat color[4];
- qgl_functions()->glGetFloatv(GL_CURRENT_COLOR, &color[0]);
-
- QColor col;
- col.setRgbF(color[0], color[1], color[2],color[3]);
- QPen old_pen = p->pen();
- QFont old_font = p->font();
-
- p->setPen(col);
- p->setFont(font);
- p->drawText(x, y, str);
-
- p->setPen(old_pen);
- p->setFont(old_font);
-}
-
-#endif // !QT_OPENGL_ES
-
-/*!
- Renders the string \a str into the GL context of this widget.
-
- \a x and \a y are specified in window coordinates, with the origin
- in the upper left-hand corner of the window. If \a font is not
- specified, the currently set application font will be used to
- render the string. To change the color of the rendered text you can
- use the glColor() call (or the qglColor() convenience function),
- just before the renderText() call.
-
- \note This function clears the stencil buffer.
-
- \note This function is not supported on OpenGL/ES systems.
-
- \note This function temporarily disables depth-testing when the
- text is drawn.
-
- \note This function can only be used inside a
- QPainter::beginNativePainting()/QPainter::endNativePainting() block
- if a painter is active on the QGLWidget.
-*/
-
-void QGLWidget::renderText(int x, int y, const QString &str, const QFont &font)
-{
-#ifndef QT_OPENGL_ES
- Q_D(QGLWidget);
- if (!d->glcx->contextHandle()->isOpenGLES()) {
- Q_D(QGLWidget);
- if (str.isEmpty() || !isValid())
- return;
-
- QOpenGLFunctions *funcs = qgl_functions();
- GLint view[4];
- bool use_scissor_testing = funcs->glIsEnabled(GL_SCISSOR_TEST);
- if (!use_scissor_testing)
- funcs->glGetIntegerv(GL_VIEWPORT, &view[0]);
- int width = d->glcx->device()->width();
- int height = d->glcx->device()->height();
- bool auto_swap = autoBufferSwap();
-
- QPaintEngine *engine = paintEngine();
-
- qt_save_gl_state();
-
- QPainter *p;
- bool reuse_painter = false;
- if (engine->isActive()) {
- reuse_painter = true;
- p = engine->painter();
-
- funcs->glDisable(GL_DEPTH_TEST);
- funcs->glViewport(0, 0, width, height);
- } else {
- setAutoBufferSwap(false);
- // disable glClear() as a result of QPainter::begin()
- d->disable_clear_on_painter_begin = true;
- p = new QPainter(this);
- }
-
- QRect viewport(view[0], view[1], view[2], view[3]);
- if (!use_scissor_testing && viewport != rect()) {
- // if the user hasn't set a scissor box, we set one that
- // covers the current viewport
- funcs->glScissor(view[0], view[1], view[2], view[3]);
- funcs->glEnable(GL_SCISSOR_TEST);
- } else if (use_scissor_testing) {
- // use the scissor box set by the user
- funcs->glEnable(GL_SCISSOR_TEST);
- }
-
- qt_gl_draw_text(p, x, y, str, font);
-
- if (!reuse_painter) {
- p->end();
- delete p;
- setAutoBufferSwap(auto_swap);
- d->disable_clear_on_painter_begin = false;
- }
-
- qt_restore_gl_state();
-
- return;
- }
-#else // QT_OPENGL_ES
- Q_UNUSED(x);
- Q_UNUSED(y);
- Q_UNUSED(str);
- Q_UNUSED(font);
-#endif
- qWarning("QGLWidget::renderText is not supported under OpenGL/ES");
-}
-
-/*! \overload
-
- \a x, \a y and \a z are specified in scene or object coordinates
- relative to the currently set projection and model matrices. This
- can be useful if you want to annotate models with text labels and
- have the labels move with the model as it is rotated etc.
-
- \note This function is not supported on OpenGL/ES systems.
-
- \note If depth testing is enabled before this function is called,
- then the drawn text will be depth-tested against the models that
- have already been drawn in the scene. Use \c{glDisable(GL_DEPTH_TEST)}
- before calling this function to annotate the models without
- depth-testing the text.
-
- \note This function can only be used inside a
- QPainter::beginNativePainting()/QPainter::endNativePainting() block
- if a painter is active on the QGLWidget.
-*/
-void QGLWidget::renderText(double x, double y, double z, const QString &str, const QFont &font)
-{
-#ifndef QT_OPENGL_ES
- Q_D(QGLWidget);
- if (!d->glcx->contextHandle()->isOpenGLES()) {
- Q_D(QGLWidget);
- if (str.isEmpty() || !isValid())
- return;
-
- QOpenGLFunctions *funcs = qgl_functions();
- bool auto_swap = autoBufferSwap();
-
- int width = d->glcx->device()->width();
- int height = d->glcx->device()->height();
- GLdouble model[4 * 4], proj[4 * 4];
- GLint view[4];
- QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions();
- gl1funcs->glGetDoublev(GL_MODELVIEW_MATRIX, &model[0]);
- gl1funcs->glGetDoublev(GL_PROJECTION_MATRIX, &proj[0]);
- funcs->glGetIntegerv(GL_VIEWPORT, &view[0]);
- GLdouble win_x = 0, win_y = 0, win_z = 0;
- qgluProject(x, y, z, &model[0], &proj[0], &view[0],
- &win_x, &win_y, &win_z);
- const int dpr = d->glcx->device()->devicePixelRatioF();
- win_x /= dpr;
- win_y /= dpr;
- win_y = height - win_y; // y is inverted
-
- QPaintEngine *engine = paintEngine();
-
- QPainter *p;
- bool reuse_painter = false;
- bool use_depth_testing = funcs->glIsEnabled(GL_DEPTH_TEST);
- bool use_scissor_testing = funcs->glIsEnabled(GL_SCISSOR_TEST);
-
- qt_save_gl_state();
-
- if (engine->isActive()) {
- reuse_painter = true;
- p = engine->painter();
- } else {
- setAutoBufferSwap(false);
- // disable glClear() as a result of QPainter::begin()
- d->disable_clear_on_painter_begin = true;
- p = new QPainter(this);
- }
-
- QRect viewport(view[0], view[1], view[2], view[3]);
- if (!use_scissor_testing && viewport != rect()) {
- funcs->glScissor(view[0], view[1], view[2], view[3]);
- funcs->glEnable(GL_SCISSOR_TEST);
- } else if (use_scissor_testing) {
- funcs->glEnable(GL_SCISSOR_TEST);
- }
- funcs->glViewport(0, 0, width * dpr, height * dpr);
- gl1funcs->glAlphaFunc(GL_GREATER, 0.0);
- funcs->glEnable(GL_ALPHA_TEST);
- if (use_depth_testing)
- funcs->glEnable(GL_DEPTH_TEST);
-
- // The only option in Qt 5 is the shader-based OpenGL 2 paint engine.
- // Setting fixed pipeline transformations is futile. Instead, pass the
- // extra values directly and let the engine figure the matrices out.
- static_cast<QGL2PaintEngineEx *>(p->paintEngine())->setTranslateZ(-2 * win_z);
-
- qt_gl_draw_text(p, qRound(win_x), qRound(win_y), str, font);
-
- static_cast<QGL2PaintEngineEx *>(p->paintEngine())->setTranslateZ(0);
-
- if (!reuse_painter) {
- p->end();
- delete p;
- setAutoBufferSwap(auto_swap);
- d->disable_clear_on_painter_begin = false;
- }
-
- qt_restore_gl_state();
-
- return;
- }
-#else // QT_OPENGL_ES
- Q_UNUSED(x);
- Q_UNUSED(y);
- Q_UNUSED(z);
- Q_UNUSED(str);
- Q_UNUSED(font);
-#endif
- qWarning("QGLWidget::renderText is not supported under OpenGL/ES");
-}
-
-QGLFormat QGLWidget::format() const
-{
- Q_D(const QGLWidget);
- return d->glcx->format();
-}
-
-QGLContext *QGLWidget::context() const
-{
- Q_D(const QGLWidget);
- return d->glcx;
-}
-
-bool QGLWidget::doubleBuffer() const
-{
- Q_D(const QGLWidget);
- return d->glcx->d_ptr->glFormat.testOption(QGL::DoubleBuffer);
-}
-
-void QGLWidget::setAutoBufferSwap(bool on)
-{
- Q_D(QGLWidget);
- d->autoSwap = on;
-}
-
-bool QGLWidget::autoBufferSwap() const
-{
- Q_D(const QGLWidget);
- return d->autoSwap;
-}
-
-/*!
- Calls QGLContext:::bindTexture(\a image, \a target, \a format) on the currently
- set context.
-
- \sa deleteTexture()
-*/
-GLuint QGLWidget::bindTexture(const QImage &image, GLenum target, GLint format)
-{
- if (image.isNull())
- return 0;
-
- Q_D(QGLWidget);
- return d->glcx->bindTexture(image, target, format, QGLContext::DefaultBindOption);
-}
-
-/*!
- \overload
- \since 4.6
-
- The binding \a options are a set of options used to decide how to
- bind the texture to the context.
- */
-GLuint QGLWidget::bindTexture(const QImage &image, GLenum target, GLint format, QGLContext::BindOptions options)
-{
- if (image.isNull())
- return 0;
-
- Q_D(QGLWidget);
- return d->glcx->bindTexture(image, target, format, options);
-}
-
-
-/*!
- Calls QGLContext:::bindTexture(\a pixmap, \a target, \a format) on the currently
- set context.
-
- \sa deleteTexture()
-*/
-GLuint QGLWidget::bindTexture(const QPixmap &pixmap, GLenum target, GLint format)
-{
- if (pixmap.isNull())
- return 0;
-
- Q_D(QGLWidget);
- return d->glcx->bindTexture(pixmap, target, format, QGLContext::DefaultBindOption);
-}
-
-/*!
- \overload
- \since 4.6
-
- Generates and binds a 2D GL texture to the current context, based
- on \a pixmap. The generated texture id is returned and can be used in
-
- The binding \a options are a set of options used to decide how to
- bind the texture to the context.
- */
-GLuint QGLWidget::bindTexture(const QPixmap &pixmap, GLenum target, GLint format,
- QGLContext::BindOptions options)
-{
- Q_D(QGLWidget);
- return d->glcx->bindTexture(pixmap, target, format, options);
-}
-
-/*! \overload
-
- Calls QGLContext::bindTexture(\a fileName) on the currently set context.
-
- \sa deleteTexture()
-*/
-GLuint QGLWidget::bindTexture(const QString &fileName)
-{
- Q_D(QGLWidget);
- return d->glcx->bindTexture(fileName);
-}
-
-/*!
- Calls QGLContext::deleteTexture(\a id) on the currently set
- context.
-
- \sa bindTexture()
-*/
-void QGLWidget::deleteTexture(GLuint id)
-{
- Q_D(QGLWidget);
- d->glcx->deleteTexture(id);
-}
-
-/*!
- \since 4.4
-
- Calls the corresponding QGLContext::drawTexture() with
- \a target, \a textureId, and \a textureTarget for this
- widget's context.
-*/
-void QGLWidget::drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget)
-{
- Q_D(QGLWidget);
- d->glcx->drawTexture(target, textureId, textureTarget);
-}
-
-/*!
- \since 4.4
-
- Calls the corresponding QGLContext::drawTexture() with
- \a point, \a textureId, and \a textureTarget for this
- widget's context.
-*/
-void QGLWidget::drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget)
-{
- Q_D(QGLWidget);
- d->glcx->drawTexture(point, textureId, textureTarget);
-}
-
-Q_GLOBAL_STATIC(QGLEngineThreadStorage<QGL2PaintEngineEx>, qt_gl_2_engine)
-
-Q_OPENGL_EXPORT QPaintEngine* qt_qgl_paint_engine()
-{
- return qt_gl_2_engine()->engine();
-}
-
-/*!
- \internal
-
- Returns the GL widget's paint engine.
-*/
-QPaintEngine *QGLWidget::paintEngine() const
-{
- return qt_qgl_paint_engine();
-}
-
-void QGLWidgetPrivate::init(QGLContext *context, const QGLWidget *shareWidget)
-{
- Q_Q(QGLWidget);
- q->setAttribute(Qt::WA_PaintOnScreen);
- q->setAttribute(Qt::WA_NoSystemBackground);
- q->setAutoFillBackground(true); // for compatibility
-
- mustHaveWindowHandle = 1;
- q->setAttribute(Qt::WA_NativeWindow);
- q->setWindowFlag(Qt::MSWindowsOwnDC);
-
- initContext(context, shareWidget);
-}
-
-/*
- This is the shared initialization for all platforms. Called from QGLWidgetPrivate::init()
-*/
-void QGLWidgetPrivate::initContext(QGLContext *context, const QGLWidget* shareWidget)
-{
- Q_Q(QGLWidget);
-
- glDevice.setWidget(q);
-
- glcx = 0;
- autoSwap = true;
-
- if (context && !context->device())
- context->setDevice(q);
- q->setContext(context, shareWidget ? shareWidget->context() : 0);
-
- if (!glcx)
- glcx = new QGLContext(QGLFormat::defaultFormat(), q);
-}
-
-bool QGLWidgetPrivate::renderCxPm(QPixmap*)
-{
- return false;
-}
-
-/*! \internal
- Free up any allocated colormaps. This fn is only called for
- top-level widgets.
-*/
-void QGLWidgetPrivate::cleanupColormaps()
-{
-}
-
-void QGLContextGroup::addShare(const QGLContext *context, const QGLContext *share) {
- Q_ASSERT(context && share);
- if (context->d_ptr->group == share->d_ptr->group)
- return;
-
- // Make sure 'context' is not already shared with another group of contexts.
- Q_ASSERT(context->d_ptr->group->m_refs.loadRelaxed() == 1);
-
- // Free 'context' group resources and make it use the same resources as 'share'.
- QGLContextGroup *group = share->d_ptr->group;
- delete context->d_ptr->group;
- context->d_ptr->group = group;
- group->m_refs.ref();
-
- // Maintain a list of all the contexts in each group of sharing contexts.
- // The list is empty if the "share" context wasn't sharing already.
- if (group->m_shares.isEmpty())
- group->m_shares.append(share);
- group->m_shares.append(context);
-}
-
-void QGLContextGroup::removeShare(const QGLContext *context) {
- // Remove the context from the group.
- QGLContextGroup *group = context->d_ptr->group;
- if (group->m_shares.isEmpty())
- return;
- group->m_shares.removeAll(context);
-
- // Update context group representative.
- Q_ASSERT(group->m_shares.size() != 0);
- if (group->m_context == context)
- group->m_context = group->m_shares.at(0);
-
- // If there is only one context left, then make the list empty.
- if (group->m_shares.size() == 1)
- group->m_shares.clear();
-}
-
-QSize QGLTexture::bindCompressedTexture
- (const QString& fileName, const char *format)
-{
- QFile file(fileName);
- if (!file.open(QIODevice::ReadOnly))
- return QSize();
- QByteArray contents = file.readAll();
- file.close();
- return bindCompressedTexture
- (contents.constData(), contents.size(), format);
-}
-
-// PVR header format for container files that store textures compressed
-// with the ETC1, PVRTC2, and PVRTC4 encodings. Format information from the
-// PowerVR SDK at http://www.imgtec.com/powervr/insider/powervr-sdk.asp
-// "PVRTexTool Reference Manual, version 1.11f".
-struct PvrHeader
-{
- quint32 headerSize;
- quint32 height;
- quint32 width;
- quint32 mipMapCount;
- quint32 flags;
- quint32 dataSize;
- quint32 bitsPerPixel;
- quint32 redMask;
- quint32 greenMask;
- quint32 blueMask;
- quint32 alphaMask;
- quint32 magic;
- quint32 surfaceCount;
-};
-
-#define PVR_MAGIC 0x21525650 // "PVR!" in little-endian
-
-#define PVR_FORMAT_MASK 0x000000FF
-#define PVR_FORMAT_PVRTC2 0x00000018
-#define PVR_FORMAT_PVRTC4 0x00000019
-#define PVR_FORMAT_ETC1 0x00000036
-
-#define PVR_HAS_MIPMAPS 0x00000100
-#define PVR_TWIDDLED 0x00000200
-#define PVR_NORMAL_MAP 0x00000400
-#define PVR_BORDER_ADDED 0x00000800
-#define PVR_CUBE_MAP 0x00001000
-#define PVR_FALSE_COLOR_MIPMAPS 0x00002000
-#define PVR_VOLUME_TEXTURE 0x00004000
-#define PVR_ALPHA_IN_TEXTURE 0x00008000
-#define PVR_VERTICAL_FLIP 0x00010000
-
-#ifndef GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
-#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00
-#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01
-#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02
-#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03
-#endif
-
-#ifndef GL_ETC1_RGB8_OES
-#define GL_ETC1_RGB8_OES 0x8D64
-#endif
-
-bool QGLTexture::canBindCompressedTexture
- (const char *buf, int len, const char *format, bool *hasAlpha)
-{
- if (QSysInfo::ByteOrder != QSysInfo::LittleEndian) {
- // Compressed texture loading only supported on little-endian
- // systems such as x86 and ARM at the moment.
- return false;
- }
- if (!format) {
- // Auto-detect the format from the header.
- if (len >= 4 && !qstrncmp(buf, "DDS ", 4)) {
- *hasAlpha = true;
- return true;
- } else if (len >= 52 && !qstrncmp(buf + 44, "PVR!", 4)) {
- const PvrHeader *pvrHeader =
- reinterpret_cast<const PvrHeader *>(buf);
- *hasAlpha = (pvrHeader->alphaMask != 0);
- return true;
- }
- } else {
- // Validate the format against the header.
- if (!qstricmp(format, "DDS")) {
- if (len >= 4 && !qstrncmp(buf, "DDS ", 4)) {
- *hasAlpha = true;
- return true;
- }
- } else if (!qstricmp(format, "PVR") || !qstricmp(format, "ETC1")) {
- if (len >= 52 && !qstrncmp(buf + 44, "PVR!", 4)) {
- const PvrHeader *pvrHeader =
- reinterpret_cast<const PvrHeader *>(buf);
- *hasAlpha = (pvrHeader->alphaMask != 0);
- return true;
- }
- }
- }
- return false;
-}
-
-#define ctx QGLContext::currentContext()
-
-QSize QGLTexture::bindCompressedTexture
- (const char *buf, int len, const char *format)
-{
- if (QSysInfo::ByteOrder != QSysInfo::LittleEndian) {
- // Compressed texture loading only supported on little-endian
- // systems such as x86 and ARM at the moment.
- return QSize();
- }
- if (!format) {
- // Auto-detect the format from the header.
- if (len >= 4 && !qstrncmp(buf, "DDS ", 4))
- return bindCompressedTextureDDS(buf, len);
- else if (len >= 52 && !qstrncmp(buf + 44, "PVR!", 4))
- return bindCompressedTexturePVR(buf, len);
- } else {
- // Validate the format against the header.
- if (!qstricmp(format, "DDS")) {
- if (len >= 4 && !qstrncmp(buf, "DDS ", 4))
- return bindCompressedTextureDDS(buf, len);
- } else if (!qstricmp(format, "PVR") || !qstricmp(format, "ETC1")) {
- if (len >= 52 && !qstrncmp(buf + 44, "PVR!", 4))
- return bindCompressedTexturePVR(buf, len);
- }
- }
- return QSize();
-}
-
-QSize QGLTexture::bindCompressedTextureDDS(const char *buf, int len)
-{
- // We only support 2D texture loading at present.
- if (target != GL_TEXTURE_2D)
- return QSize();
-
- // Bail out if the necessary extension is not present.
- if (!qgl_extensions()->hasOpenGLExtension(QOpenGLExtensions::DDSTextureCompression)) {
- qWarning("QGLContext::bindTexture(): DDS texture compression is not supported.");
- return QSize();
- }
-
- const DDSFormat *ddsHeader = reinterpret_cast<const DDSFormat *>(buf + 4);
- if (!ddsHeader->dwLinearSize) {
- qWarning("QGLContext::bindTexture(): DDS image size is not valid.");
- return QSize();
- }
-
- int blockSize = 16;
- GLenum format;
-
- switch(ddsHeader->ddsPixelFormat.dwFourCC) {
- case FOURCC_DXT1:
- format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
- blockSize = 8;
- break;
- case FOURCC_DXT3:
- format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
- break;
- case FOURCC_DXT5:
- format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
- break;
- default:
- qWarning("QGLContext::bindTexture(): DDS image format not supported.");
- return QSize();
- }
-
- const GLubyte *pixels =
- reinterpret_cast<const GLubyte *>(buf + ddsHeader->dwSize + 4);
-
- QOpenGLFunctions *funcs = qgl_functions();
- funcs->glGenTextures(1, &id);
- funcs->glBindTexture(GL_TEXTURE_2D, id);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- int size;
- int offset = 0;
- int available = len - int(ddsHeader->dwSize + 4);
- int w = ddsHeader->dwWidth;
- int h = ddsHeader->dwHeight;
-
- // load mip-maps
- for(int i = 0; i < (int) ddsHeader->dwMipMapCount; ++i) {
- if (w == 0) w = 1;
- if (h == 0) h = 1;
-
- size = ((w+3)/4) * ((h+3)/4) * blockSize;
- if (size > available)
- break;
- qgl_extensions()->glCompressedTexImage2D(GL_TEXTURE_2D, i, format, w, h, 0,
- size, pixels + offset);
- offset += size;
- available -= size;
-
- // half size for each mip-map level
- w = w/2;
- h = h/2;
- }
-
- // DDS images are not inverted.
- options &= ~QGLContext::InvertedYBindOption;
-
- return QSize(ddsHeader->dwWidth, ddsHeader->dwHeight);
-}
-
-QSize QGLTexture::bindCompressedTexturePVR(const char *buf, int len)
-{
- // We only support 2D texture loading at present. Cube maps later.
- if (target != GL_TEXTURE_2D)
- return QSize();
-
- // Determine which texture format we will be loading.
- const PvrHeader *pvrHeader = reinterpret_cast<const PvrHeader *>(buf);
- GLenum textureFormat;
- quint32 minWidth, minHeight;
- switch (pvrHeader->flags & PVR_FORMAT_MASK) {
- case PVR_FORMAT_PVRTC2:
- if (pvrHeader->alphaMask)
- textureFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
- else
- textureFormat = GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
- minWidth = 16;
- minHeight = 8;
- break;
-
- case PVR_FORMAT_PVRTC4:
- if (pvrHeader->alphaMask)
- textureFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
- else
- textureFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
- minWidth = 8;
- minHeight = 8;
- break;
-
- case PVR_FORMAT_ETC1:
- textureFormat = GL_ETC1_RGB8_OES;
- minWidth = 4;
- minHeight = 4;
- break;
-
- default:
- qWarning("QGLContext::bindTexture(): PVR image format 0x%x not supported.", int(pvrHeader->flags & PVR_FORMAT_MASK));
- return QSize();
- }
-
- // Bail out if the necessary extension is not present.
- if (textureFormat == GL_ETC1_RGB8_OES) {
- if (!qgl_extensions()->hasOpenGLExtension(QOpenGLExtensions::ETC1TextureCompression)) {
- qWarning("QGLContext::bindTexture(): ETC1 texture compression is not supported.");
- return QSize();
- }
- } else {
- if (!qgl_extensions()->hasOpenGLExtension(QOpenGLExtensions::PVRTCTextureCompression)) {
- qWarning("QGLContext::bindTexture(): PVRTC texture compression is not supported.");
- return QSize();
- }
- }
-
- // Boundary check on the buffer size.
- quint32 bufferSize = pvrHeader->headerSize + pvrHeader->dataSize;
- if (bufferSize > quint32(len)) {
- qWarning("QGLContext::bindTexture(): PVR image size is not valid.");
- return QSize();
- }
-
- // Create the texture.
- QOpenGLFunctions *funcs = qgl_functions();
- funcs->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- funcs->glGenTextures(1, &id);
- funcs->glBindTexture(GL_TEXTURE_2D, id);
- if (pvrHeader->mipMapCount) {
- if ((options & QGLContext::LinearFilteringBindOption) != 0) {
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- } else {
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
- }
- } else if ((options & QGLContext::LinearFilteringBindOption) != 0) {
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- } else {
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- }
-
- // Load the compressed mipmap levels.
- const GLubyte *buffer =
- reinterpret_cast<const GLubyte *>(buf + pvrHeader->headerSize);
- bufferSize = pvrHeader->dataSize;
- quint32 level = 0;
- quint32 width = pvrHeader->width;
- quint32 height = pvrHeader->height;
- while (bufferSize > 0 && level <= pvrHeader->mipMapCount) {
- quint32 size =
- (qMax(width, minWidth) * qMax(height, minHeight) *
- pvrHeader->bitsPerPixel) / 8;
- if (size > bufferSize)
- break;
- qgl_extensions()->glCompressedTexImage2D(GL_TEXTURE_2D, GLint(level), textureFormat,
- GLsizei(width), GLsizei(height), 0,
- GLsizei(size), buffer);
- width /= 2;
- height /= 2;
- buffer += size;
- ++level;
- }
-
- // Restore the default pixel alignment for later texture uploads.
- funcs->glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
-
- // Set the invert flag for the texture. The "vertical flip"
- // flag in PVR is the opposite sense to our sense of inversion.
- options.setFlag(QGLContext::InvertedYBindOption, !(pvrHeader->flags & PVR_VERTICAL_FLIP));
-
- return QSize(pvrHeader->width, pvrHeader->height);
-}
-
-#undef ctx
-
-QT_END_NAMESPACE
diff --git a/src/opengl/qgl.h b/src/opengl/qgl.h
deleted file mode 100644
index f5accbeb3c..0000000000
--- a/src/opengl/qgl.h
+++ /dev/null
@@ -1,524 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGL_H
-#define QGL_H
-
-#ifndef QT_NO_OPENGL
-
-#include <QtGui/qopengl.h>
-#include <QtWidgets/qwidget.h>
-#include <QtGui/qpaintengine.h>
-#include <QtOpenGL/qglcolormap.h>
-#include <QtCore/qmap.h>
-#include <QtCore/qscopedpointer.h>
-
-#include <QtGui/QSurfaceFormat>
-
-QT_BEGIN_NAMESPACE
-
-
-
-
-class QPixmap;
-class QGLWidgetPrivate;
-class QGLContextPrivate;
-
-// Namespace class:
-namespace QGL
-{
- enum FormatOption {
- DoubleBuffer = 0x0001,
- DepthBuffer = 0x0002,
- Rgba = 0x0004,
- AlphaChannel = 0x0008,
- AccumBuffer = 0x0010,
- StencilBuffer = 0x0020,
- StereoBuffers = 0x0040,
- DirectRendering = 0x0080,
- HasOverlay = 0x0100,
- SampleBuffers = 0x0200,
- DeprecatedFunctions = 0x0400,
- SingleBuffer = DoubleBuffer << 16,
- NoDepthBuffer = DepthBuffer << 16,
- ColorIndex = Rgba << 16,
- NoAlphaChannel = AlphaChannel << 16,
- NoAccumBuffer = AccumBuffer << 16,
- NoStencilBuffer = StencilBuffer << 16,
- NoStereoBuffers = StereoBuffers << 16,
- IndirectRendering = DirectRendering << 16,
- NoOverlay = HasOverlay << 16,
- NoSampleBuffers = SampleBuffers << 16,
- NoDeprecatedFunctions = DeprecatedFunctions << 16
- };
- Q_DECLARE_FLAGS(FormatOptions, FormatOption)
-}
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QGL::FormatOptions)
-
-class QGLFormatPrivate;
-
-class Q_OPENGL_EXPORT QGLFormat
-{
-public:
- QGLFormat();
- QGLFormat(QGL::FormatOptions options, int plane = 0);
- QGLFormat(const QGLFormat &other);
- QGLFormat &operator=(const QGLFormat &other);
- ~QGLFormat();
-
- void setDepthBufferSize(int size);
- int depthBufferSize() const;
-
- void setAccumBufferSize(int size);
- int accumBufferSize() const;
-
- void setRedBufferSize(int size);
- int redBufferSize() const;
-
- void setGreenBufferSize(int size);
- int greenBufferSize() const;
-
- void setBlueBufferSize(int size);
- int blueBufferSize() const;
-
- void setAlphaBufferSize(int size);
- int alphaBufferSize() const;
-
- void setStencilBufferSize(int size);
- int stencilBufferSize() const;
-
- void setSampleBuffers(bool enable);
- bool sampleBuffers() const;
-
- void setSamples(int numSamples);
- int samples() const;
-
- void setSwapInterval(int interval);
- int swapInterval() const;
-
- bool doubleBuffer() const;
- void setDoubleBuffer(bool enable);
- bool depth() const;
- void setDepth(bool enable);
- bool rgba() const;
- void setRgba(bool enable);
- bool alpha() const;
- void setAlpha(bool enable);
- bool accum() const;
- void setAccum(bool enable);
- bool stencil() const;
- void setStencil(bool enable);
- bool stereo() const;
- void setStereo(bool enable);
- bool directRendering() const;
- void setDirectRendering(bool enable);
- bool hasOverlay() const;
- void setOverlay(bool enable);
-
- int plane() const;
- void setPlane(int plane);
-
- void setOption(QGL::FormatOptions opt);
- bool testOption(QGL::FormatOptions opt) const;
-
- static QGLFormat defaultFormat();
- static void setDefaultFormat(const QGLFormat& f);
-
- static QGLFormat defaultOverlayFormat();
- static void setDefaultOverlayFormat(const QGLFormat& f);
-
- static bool hasOpenGL();
- static bool hasOpenGLOverlays();
-
- void setVersion(int major, int minor);
- int majorVersion() const;
- int minorVersion() const;
-
- enum OpenGLContextProfile {
- NoProfile,
- CoreProfile,
- CompatibilityProfile
- };
-
- void setProfile(OpenGLContextProfile profile);
- OpenGLContextProfile profile() const;
-
- enum OpenGLVersionFlag {
- OpenGL_Version_None = 0x00000000,
- OpenGL_Version_1_1 = 0x00000001,
- OpenGL_Version_1_2 = 0x00000002,
- OpenGL_Version_1_3 = 0x00000004,
- OpenGL_Version_1_4 = 0x00000008,
- OpenGL_Version_1_5 = 0x00000010,
- OpenGL_Version_2_0 = 0x00000020,
- OpenGL_Version_2_1 = 0x00000040,
- OpenGL_ES_Common_Version_1_0 = 0x00000080,
- OpenGL_ES_CommonLite_Version_1_0 = 0x00000100,
- OpenGL_ES_Common_Version_1_1 = 0x00000200,
- OpenGL_ES_CommonLite_Version_1_1 = 0x00000400,
- OpenGL_ES_Version_2_0 = 0x00000800,
- OpenGL_Version_3_0 = 0x00001000,
- OpenGL_Version_3_1 = 0x00002000,
- OpenGL_Version_3_2 = 0x00004000,
- OpenGL_Version_3_3 = 0x00008000,
- OpenGL_Version_4_0 = 0x00010000,
- OpenGL_Version_4_1 = 0x00020000,
- OpenGL_Version_4_2 = 0x00040000,
- OpenGL_Version_4_3 = 0x00080000
- };
- Q_DECLARE_FLAGS(OpenGLVersionFlags, OpenGLVersionFlag)
-
- static OpenGLVersionFlags openGLVersionFlags();
-
- static QGLFormat fromSurfaceFormat(const QSurfaceFormat &format);
- static QSurfaceFormat toSurfaceFormat(const QGLFormat &format);
-private:
- QGLFormatPrivate *d;
-
- void detach();
-
- friend Q_OPENGL_EXPORT bool operator==(const QGLFormat&, const QGLFormat&);
- friend Q_OPENGL_EXPORT bool operator!=(const QGLFormat&, const QGLFormat&);
-#ifndef QT_NO_DEBUG_STREAM
- friend Q_OPENGL_EXPORT QDebug operator<<(QDebug, const QGLFormat &);
-#endif
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QGLFormat::OpenGLVersionFlags)
-
-Q_OPENGL_EXPORT bool operator==(const QGLFormat&, const QGLFormat&);
-Q_OPENGL_EXPORT bool operator!=(const QGLFormat&, const QGLFormat&);
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_OPENGL_EXPORT QDebug operator<<(QDebug, const QGLFormat &);
-#endif
-
-class QGLFunctions;
-
-class Q_OPENGL_EXPORT QGLContext
-{
- Q_DECLARE_PRIVATE(QGLContext)
-public:
- QGLContext(const QGLFormat& format, QPaintDevice* device);
- QGLContext(const QGLFormat& format);
- virtual ~QGLContext();
-
- virtual bool create(const QGLContext* shareContext = nullptr);
- bool isValid() const;
- bool isSharing() const;
- void reset();
-
- static bool areSharing(const QGLContext *context1, const QGLContext *context2);
-
- QGLFormat format() const;
- QGLFormat requestedFormat() const;
- void setFormat(const QGLFormat& format);
-
- void moveToThread(QThread *thread);
-
- virtual void makeCurrent();
- virtual void doneCurrent();
-
- virtual void swapBuffers() const;
-
- QGLFunctions *functions() const;
-
- enum BindOption {
- NoBindOption = 0x0000,
- InvertedYBindOption = 0x0001,
- MipmapBindOption = 0x0002,
- PremultipliedAlphaBindOption = 0x0004,
- LinearFilteringBindOption = 0x0008,
-
- MemoryManagedBindOption = 0x0010, // internal flag
- CanFlipNativePixmapBindOption = 0x0020, // internal flag
- TemporarilyCachedBindOption = 0x0040, // internal flag
-
- DefaultBindOption = LinearFilteringBindOption
- | InvertedYBindOption
- | MipmapBindOption,
- InternalBindOption = MemoryManagedBindOption
- | PremultipliedAlphaBindOption
- };
- Q_DECLARE_FLAGS(BindOptions, BindOption)
-
- GLuint bindTexture(const QImage &image, GLenum target, GLint format,
- BindOptions options);
- GLuint bindTexture(const QPixmap &pixmap, GLenum target, GLint format,
- BindOptions options);
-
- GLuint bindTexture(const QImage &image, GLenum target = GL_TEXTURE_2D,
- GLint format = GL_RGBA);
- GLuint bindTexture(const QPixmap &pixmap, GLenum target = GL_TEXTURE_2D,
- GLint format = GL_RGBA);
- GLuint bindTexture(const QString &fileName);
-
- void deleteTexture(GLuint tx_id);
-
- void drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
- void drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
-
- static void setTextureCacheLimit(int size);
- static int textureCacheLimit();
-
- QFunctionPointer getProcAddress(const QString &proc) const;
- QPaintDevice* device() const;
- QColor overlayTransparentColor() const;
-
- static const QGLContext* currentContext();
-
- static QGLContext *fromOpenGLContext(QOpenGLContext *platformContext);
- QOpenGLContext *contextHandle() const;
-
-protected:
- virtual bool chooseContext(const QGLContext* shareContext = nullptr);
-
- bool deviceIsPixmap() const;
- bool windowCreated() const;
- void setWindowCreated(bool on);
- bool initialized() const;
- void setInitialized(bool on);
-
- uint colorIndex(const QColor& c) const;
- void setValid(bool valid);
- void setDevice(QPaintDevice *pDev);
-
-protected:
- static QGLContext* currentCtx;
-
-private:
- QGLContext(QOpenGLContext *windowContext);
-
- QScopedPointer<QGLContextPrivate> d_ptr;
-
- friend class QGLPixelBuffer;
- friend class QGLPixelBufferPrivate;
- friend class QGLWidget;
- friend class QGLWidgetPrivate;
- friend class QGLGlyphCache;
- friend class QGL2PaintEngineEx;
- friend class QGL2PaintEngineExPrivate;
- friend class QGLEngineShaderManager;
- friend class QGLTextureGlyphCache;
- friend struct QGLGlyphTexture;
- friend class QGLContextGroup;
- friend class QGLPixmapBlurFilter;
- friend class QGLTexture;
- friend QGLFormat::OpenGLVersionFlags QGLFormat::openGLVersionFlags();
- friend class QGLFramebufferObject;
- friend class QGLFramebufferObjectPrivate;
- friend class QGLFBOGLPaintDevice;
- friend class QGLPaintDevice;
- friend class QGLWidgetGLPaintDevice;
- friend class QX11GLSharedContexts;
- friend class QGLContextResourceBase;
- friend class QSGDistanceFieldGlyphCache;
-private:
- Q_DISABLE_COPY(QGLContext)
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QGLContext::BindOptions)
-
-class Q_OPENGL_EXPORT QGLWidget : public QWidget
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QGLWidget)
-public:
- explicit QGLWidget(QWidget* parent=nullptr,
- const QGLWidget* shareWidget = nullptr, Qt::WindowFlags f=Qt::WindowFlags());
- explicit QGLWidget(QGLContext *context, QWidget* parent=nullptr,
- const QGLWidget* shareWidget = nullptr, Qt::WindowFlags f=Qt::WindowFlags());
- explicit QGLWidget(const QGLFormat& format, QWidget* parent=nullptr,
- const QGLWidget* shareWidget = nullptr, Qt::WindowFlags f=Qt::WindowFlags());
- ~QGLWidget();
-
- void qglColor(const QColor& c) const;
- void qglClearColor(const QColor& c) const;
-
- bool isValid() const;
- bool isSharing() const;
-
- void makeCurrent();
- void doneCurrent();
-
- bool doubleBuffer() const;
- void swapBuffers();
-
- QGLFormat format() const;
- void setFormat(const QGLFormat& format);
-
- QGLContext* context() const;
- void setContext(QGLContext* context, const QGLContext* shareContext = nullptr,
- bool deleteOldContext = true);
-
- QPixmap renderPixmap(int w = 0, int h = 0, bool useContext = false);
- QImage grabFrameBuffer(bool withAlpha = false);
-
- void makeOverlayCurrent();
- const QGLContext* overlayContext() const;
-
- static QImage convertToGLFormat(const QImage& img);
-
- const QGLColormap & colormap() const;
- void setColormap(const QGLColormap & map);
-
- void renderText(int x, int y, const QString & str,
- const QFont & fnt = QFont());
- void renderText(double x, double y, double z, const QString & str,
- const QFont & fnt = QFont());
- QPaintEngine *paintEngine() const override;
-
- GLuint bindTexture(const QImage &image, GLenum target, GLint format,
- QGLContext::BindOptions options);
- GLuint bindTexture(const QPixmap &pixmap, GLenum target, GLint format,
- QGLContext::BindOptions options);
-
- GLuint bindTexture(const QImage &image, GLenum target = GL_TEXTURE_2D,
- GLint format = GL_RGBA);
- GLuint bindTexture(const QPixmap &pixmap, GLenum target = GL_TEXTURE_2D,
- GLint format = GL_RGBA);
-
- GLuint bindTexture(const QString &fileName);
-
- void deleteTexture(GLuint tx_id);
-
- void drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
- void drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
-
-public Q_SLOTS:
- virtual void updateGL();
- virtual void updateOverlayGL();
-
-protected:
- bool event(QEvent *) override;
- virtual void initializeGL();
- virtual void resizeGL(int w, int h);
- virtual void paintGL();
-
- virtual void initializeOverlayGL();
- virtual void resizeOverlayGL(int w, int h);
- virtual void paintOverlayGL();
-
- void setAutoBufferSwap(bool on);
- bool autoBufferSwap() const;
-
- void paintEvent(QPaintEvent*) override;
- void resizeEvent(QResizeEvent*) override;
-
- virtual void glInit();
- virtual void glDraw();
-
- QGLWidget(QGLWidgetPrivate &dd,
- const QGLFormat &format = QGLFormat(),
- QWidget *parent = nullptr,
- const QGLWidget* shareWidget = nullptr,
- Qt::WindowFlags f = Qt::WindowFlags());
-private:
- Q_DISABLE_COPY(QGLWidget)
-
- friend class QGLDrawable;
- friend class QGLPixelBuffer;
- friend class QGLPixelBufferPrivate;
- friend class QGLContext;
- friend class QGLContextPrivate;
- friend class QGLOverlayWidget;
- friend class QGLPaintDevice;
- friend class QGLWidgetGLPaintDevice;
-};
-
-
-//
-// QGLFormat inline functions
-//
-
-inline bool QGLFormat::doubleBuffer() const
-{
- return testOption(QGL::DoubleBuffer);
-}
-
-inline bool QGLFormat::depth() const
-{
- return testOption(QGL::DepthBuffer);
-}
-
-inline bool QGLFormat::rgba() const
-{
- return testOption(QGL::Rgba);
-}
-
-inline bool QGLFormat::alpha() const
-{
- return testOption(QGL::AlphaChannel);
-}
-
-inline bool QGLFormat::accum() const
-{
- return testOption(QGL::AccumBuffer);
-}
-
-inline bool QGLFormat::stencil() const
-{
- return testOption(QGL::StencilBuffer);
-}
-
-inline bool QGLFormat::stereo() const
-{
- return testOption(QGL::StereoBuffers);
-}
-
-inline bool QGLFormat::directRendering() const
-{
- return testOption(QGL::DirectRendering);
-}
-
-inline bool QGLFormat::hasOverlay() const
-{
- return testOption(QGL::HasOverlay);
-}
-
-inline bool QGLFormat::sampleBuffers() const
-{
- return testOption(QGL::SampleBuffers);
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-#endif // QGL_H
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
deleted file mode 100644
index 4e52c0f5e9..0000000000
--- a/src/opengl/qgl_p.h
+++ /dev/null
@@ -1,556 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGL_P_H
-#define QGL_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of the QGLWidget class. This header file may change from
-// version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "QtOpenGL/qgl.h"
-#include "QtOpenGL/qglcolormap.h"
-#include "QtCore/qmap.h"
-#include "QtCore/qthread.h"
-#include "QtCore/qthreadstorage.h"
-#include "QtCore/qhashfunctions.h"
-#include "QtCore/qatomic.h"
-#include "QtWidgets/private/qwidget_p.h"
-#include "QtGui/private/qopenglcontext_p.h"
-#include "QtGui/private/qopenglextensions_p.h"
-#include "qcache.h"
-#include "qglpaintdevice_p.h"
-
-#include <QtGui/QOpenGLContext>
-
-QT_BEGIN_NAMESPACE
-
-class QGLContext;
-class QGLOverlayWidget;
-class QPixmap;
-class QOpenGLExtensions;
-
-class QGLFormatPrivate
-{
-public:
- QGLFormatPrivate()
- : ref(1)
- {
- opts = QGL::DoubleBuffer | QGL::DepthBuffer | QGL::Rgba | QGL::DirectRendering
- | QGL::StencilBuffer | QGL::DeprecatedFunctions;
- pln = 0;
- depthSize = accumSize = stencilSize = redSize = greenSize = blueSize = alphaSize = -1;
- numSamples = -1;
- swapInterval = -1;
- majorVersion = 2;
- minorVersion = 0;
- profile = QGLFormat::NoProfile;
- }
- QGLFormatPrivate(const QGLFormatPrivate *other)
- : ref(1),
- opts(other->opts),
- pln(other->pln),
- depthSize(other->depthSize),
- accumSize(other->accumSize),
- stencilSize(other->stencilSize),
- redSize(other->redSize),
- greenSize(other->greenSize),
- blueSize(other->blueSize),
- alphaSize(other->alphaSize),
- numSamples(other->numSamples),
- swapInterval(other->swapInterval),
- majorVersion(other->majorVersion),
- minorVersion(other->minorVersion),
- profile(other->profile)
- {
- }
- QAtomicInt ref;
- QGL::FormatOptions opts;
- int pln;
- int depthSize;
- int accumSize;
- int stencilSize;
- int redSize;
- int greenSize;
- int blueSize;
- int alphaSize;
- int numSamples;
- int swapInterval;
- int majorVersion;
- int minorVersion;
- QGLFormat::OpenGLContextProfile profile;
-};
-
-class Q_OPENGL_EXPORT QGLWidgetPrivate : public QWidgetPrivate
-{
- Q_DECLARE_PUBLIC(QGLWidget)
-public:
- QGLWidgetPrivate() : QWidgetPrivate()
- , disable_clear_on_painter_begin(false)
- , parent_changing(false)
- {
- }
-
- ~QGLWidgetPrivate() {}
-
- void init(QGLContext *context, const QGLWidget* shareWidget);
- void initContext(QGLContext *context, const QGLWidget* shareWidget);
- bool renderCxPm(QPixmap *pixmap);
- void cleanupColormaps();
- void aboutToDestroy() override {
- if (glcx && !parent_changing)
- glcx->reset();
- }
-
- bool makeCurrent();
-
- QGLContext *glcx;
- QGLWidgetGLPaintDevice glDevice;
- bool autoSwap;
-
- QGLColormap cmap;
-
- bool disable_clear_on_painter_begin;
- bool parent_changing;
-};
-
-// QGLContextPrivate has the responsibility of creating context groups.
-// QGLContextPrivate maintains the reference counter and destroys
-// context groups when needed.
-class QGLContextGroup
-{
-public:
- ~QGLContextGroup();
-
- const QGLContext *context() const {return m_context;}
- bool isSharing() const { return m_shares.size() >= 2; }
- QList<const QGLContext *> shares() const { return m_shares; }
-
- static void addShare(const QGLContext *context, const QGLContext *share);
- static void removeShare(const QGLContext *context);
-
-private:
- QGLContextGroup(const QGLContext *context);
-
- const QGLContext *m_context; // context group's representative
- QList<const QGLContext *> m_shares;
- QAtomicInt m_refs;
-
- friend class QGLContext;
- friend class QGLContextPrivate;
- friend class QGLContextGroupResourceBase;
-};
-
-// Get the context that resources for "ctx" will transfer to once
-// "ctx" is destroyed. Returns null if nothing is sharing with ctx.
-const QGLContext *qt_gl_transfer_context(const QGLContext *);
-
-/*
- QGLTemporaryContext - the main objective of this class is to have a way of
- creating a GL context and making it current, without going via QGLWidget
- and friends. At certain points during GL initialization we need a current
- context in order decide what GL features are available, and to resolve GL
- extensions. Having a light-weight way of creating such a context saves
- initial application startup time, and it doesn't wind up creating recursive
- conflicts.
- The class currently uses a private d pointer to hide the platform specific
- types. This could possibly been done inline with #ifdef'ery, but it causes
- major headaches on e.g. X11 due to namespace pollution.
-*/
-class QGLTemporaryContextPrivate;
-class QGLTemporaryContext {
-public:
- explicit QGLTemporaryContext(bool directRendering = true, QWidget *parent = nullptr);
- ~QGLTemporaryContext();
-
-private:
- QScopedPointer<QGLTemporaryContextPrivate> d;
-};
-
-class QGLTexture;
-class QGLTextureDestroyer;
-
-// This probably needs to grow to GL_MAX_VERTEX_ATTRIBS, but 3 is ok for now as that's
-// all the GL2 engine uses:
-#define QT_GL_VERTEX_ARRAY_TRACKED_COUNT 3
-
-class QGLContextResourceBase;
-
-class QGLContextPrivate
-{
- Q_DECLARE_PUBLIC(QGLContext)
-public:
- explicit QGLContextPrivate(QGLContext *context);
- ~QGLContextPrivate();
- QGLTexture *bindTexture(const QImage &image, GLenum target, GLint format,
- QGLContext::BindOptions options);
- QGLTexture *bindTexture(const QImage &image, GLenum target, GLint format, const qint64 key,
- QGLContext::BindOptions options);
- QGLTexture *bindTexture(const QPixmap &pixmap, GLenum target, GLint format,
- QGLContext::BindOptions options);
- QGLTexture *textureCacheLookup(const qint64 key, GLenum target);
- void init(QPaintDevice *dev, const QGLFormat &format);
- int maxTextureSize();
-
- void cleanup();
-
- void setVertexAttribArrayEnabled(int arrayIndex, bool enabled = true);
- void syncGlState(); // Makes sure the GL context's state is what we think it is
- void swapRegion(const QRegion &region);
-
- QOpenGLContext *guiGlContext;
- // true if QGLContext owns the QOpenGLContext (for who deletes who)
- bool ownContext;
-
- void setupSharing();
- void refreshCurrentFbo();
- void setCurrentFbo(GLuint fbo);
-
- QGLFormat glFormat;
- QGLFormat reqFormat;
- GLuint fbo;
-
- uint valid : 1;
- uint sharing : 1;
- uint initDone : 1;
- uint crWin : 1;
- uint internal_context : 1;
- uint version_flags_cached : 1;
-
- // workarounds for driver/hw bugs on different platforms
- uint workaround_needsFullClearOnEveryFrame : 1;
- uint workaround_brokenFBOReadBack : 1;
- uint workaround_brokenTexSubImage : 1;
- uint workaroundsCached : 1;
-
- uint workaround_brokenTextureFromPixmap : 1;
- uint workaround_brokenTextureFromPixmap_init : 1;
-
- uint workaround_brokenAlphaTexSubImage : 1;
- uint workaround_brokenAlphaTexSubImage_init : 1;
-
- QPaintDevice *paintDevice;
- QSize readback_target_size;
- QColor transpColor;
- QGLContext *q_ptr;
- QGLFormat::OpenGLVersionFlags version_flags;
-
- QGLContextGroup *group;
- GLint max_texture_size;
-
- GLuint current_fbo;
- GLuint default_fbo;
- QPaintEngine *active_engine;
- QGLTextureDestroyer *texture_destroyer;
-
- QGLFunctions *functions;
-
- bool vertexAttributeArraysEnabledState[QT_GL_VERTEX_ARRAY_TRACKED_COUNT];
-
- static inline QGLContextGroup *contextGroup(const QGLContext *ctx) { return ctx->d_ptr->group; }
-
- static void setCurrentContext(QGLContext *context);
-};
-
-// Temporarily make a context current if not already current or
-// shared with the current contex. The previous context is made
-// current when the object goes out of scope.
-class Q_OPENGL_EXPORT QGLShareContextScope
-{
-public:
- QGLShareContextScope(const QGLContext *ctx)
- : m_oldContext(nullptr)
- {
- QGLContext *currentContext = const_cast<QGLContext *>(QGLContext::currentContext());
- if (currentContext != ctx && !QGLContext::areSharing(ctx, currentContext)) {
- m_oldContext = currentContext;
- m_ctx = const_cast<QGLContext *>(ctx);
- m_ctx->makeCurrent();
- } else {
- m_ctx = currentContext;
- }
- }
-
- operator QGLContext *()
- {
- return m_ctx;
- }
-
- QGLContext *operator->()
- {
- return m_ctx;
- }
-
- ~QGLShareContextScope()
- {
- if (m_oldContext)
- m_oldContext->makeCurrent();
- }
-
-private:
- QGLContext *m_oldContext;
- QGLContext *m_ctx;
-};
-
-QT_END_NAMESPACE
-Q_DECLARE_METATYPE(GLuint)
-QT_BEGIN_NAMESPACE
-
-class Q_OPENGL_EXPORT QGLTextureDestroyer
-{
-public:
- void emitFreeTexture(QGLContext *context, QPlatformPixmap *, GLuint id) {
- if (context->contextHandle())
- (new QOpenGLSharedResourceGuard(context->contextHandle(), id, freeTextureFunc))->free();
- }
-
-private:
- static void freeTextureFunc(QOpenGLFunctions *, GLuint id) {
- QOpenGLContext::currentContext()->functions()->glDeleteTextures(1, &id);
- }
-};
-
-class Q_OPENGL_EXPORT QGLSignalProxy : public QObject
-{
- Q_OBJECT
-public:
- void emitAboutToDestroyContext(const QGLContext *context) {
- emit aboutToDestroyContext(context);
- }
- static QGLSignalProxy *instance();
-Q_SIGNALS:
- void aboutToDestroyContext(const QGLContext *context);
-};
-
-class QGLTexture {
-public:
- explicit QGLTexture(QGLContext *ctx = nullptr, GLuint tx_id = 0, GLenum tx_target = GL_TEXTURE_2D,
- QGLContext::BindOptions opt = QGLContext::DefaultBindOption)
- : context(ctx),
- id(tx_id),
- target(tx_target),
- options(opt)
- {}
-
- ~QGLTexture() {
- if (options & QGLContext::MemoryManagedBindOption) {
- Q_ASSERT(context);
- QPlatformPixmap *boundPixmap = nullptr;
- context->d_ptr->texture_destroyer->emitFreeTexture(context, boundPixmap, id);
- }
- }
-
- QGLContext *context;
- GLuint id;
- GLenum target;
-
- QGLContext::BindOptions options;
-
- bool canBindCompressedTexture
- (const char *buf, int len, const char *format, bool *hasAlpha);
- QSize bindCompressedTexture
- (const QString& fileName, const char *format = nullptr);
- QSize bindCompressedTexture
- (const char *buf, int len, const char *format = nullptr);
- QSize bindCompressedTextureDDS(const char *buf, int len);
- QSize bindCompressedTexturePVR(const char *buf, int len);
-};
-
-struct QGLTextureCacheKey {
- qint64 key;
- QGLContextGroup *group;
-};
-
-inline bool operator==(const QGLTextureCacheKey &a, const QGLTextureCacheKey &b)
-{
- return a.key == b.key && a.group == b.group;
-}
-
-inline uint qHash(const QGLTextureCacheKey &key)
-{
- return qHash(key.key) ^ qHash(key.group);
-}
-
-
-class Q_AUTOTEST_EXPORT QGLTextureCache {
-public:
- QGLTextureCache();
- ~QGLTextureCache();
-
- void insert(QGLContext *ctx, qint64 key, QGLTexture *texture, int cost);
- void remove(qint64 key);
- inline int size();
- inline void setMaxCost(int newMax);
- inline int maxCost();
- inline QGLTexture* getTexture(QGLContext *ctx, qint64 key);
-
- bool remove(QGLContext *ctx, GLuint textureId);
- void removeContextTextures(QGLContext *ctx);
- static QGLTextureCache *instance();
- static void cleanupTexturesForCacheKey(qint64 cacheKey);
- static void cleanupTexturesForPixampData(QPlatformPixmap* pixmap);
- static void cleanupBeforePixmapDestruction(QPlatformPixmap* pixmap);
-
-private:
- QCache<QGLTextureCacheKey, QGLTexture> m_cache;
- QReadWriteLock m_lock;
-};
-
-int QGLTextureCache::size() {
- QReadLocker locker(&m_lock);
- return m_cache.size();
-}
-
-void QGLTextureCache::setMaxCost(int newMax)
-{
- QWriteLocker locker(&m_lock);
- m_cache.setMaxCost(newMax);
-}
-
-int QGLTextureCache::maxCost()
-{
- QReadLocker locker(&m_lock);
- return m_cache.maxCost();
-}
-
-QGLTexture* QGLTextureCache::getTexture(QGLContext *ctx, qint64 key)
-{
- // Can't be a QReadLocker since QCache::object() modifies the cache (reprioritizes the object)
- QWriteLocker locker(&m_lock);
- const QGLTextureCacheKey cacheKey = {key, QGLContextPrivate::contextGroup(ctx)};
- return m_cache.object(cacheKey);
-}
-
-Q_OPENGL_EXPORT extern QPaintEngine* qt_qgl_paint_engine();
-
-QOpenGLExtensions* qgl_extensions();
-bool qgl_hasFeature(QOpenGLFunctions::OpenGLFeature feature);
-bool qgl_hasExtension(QOpenGLExtensions::OpenGLExtension extension);
-
-// Put a guard around a GL object identifier and its context.
-// When the context goes away, a shared context will be used
-// in its place. If there are no more shared contexts, then
-// the identifier is returned as zero - it is assumed that the
-// context destruction cleaned up the identifier in this case.
-class QGLSharedResourceGuardBase : public QOpenGLSharedResource
-{
-public:
- QGLSharedResourceGuardBase(QGLContext *context, GLuint id)
- : QOpenGLSharedResource(context->contextHandle()->shareGroup())
- , m_id(id)
- {
- }
-
- GLuint id() const
- {
- return m_id;
- }
-
-protected:
- void invalidateResource() override
- {
- m_id = 0;
- }
-
- void freeResource(QOpenGLContext *context) override
- {
- if (m_id) {
- freeResource(QGLContext::fromOpenGLContext(context), m_id);
- }
- }
-
- virtual void freeResource(QGLContext *ctx, GLuint id) = 0;
-
-private:
- GLuint m_id;
-};
-
-template <typename Func>
-class QGLSharedResourceGuard : public QGLSharedResourceGuardBase
-{
-public:
- QGLSharedResourceGuard(QGLContext *context, GLuint id, Func func)
- : QGLSharedResourceGuardBase(context, id)
- , m_func(func)
- {
- }
-
-protected:
- void freeResource(QGLContext *ctx, GLuint id) override
- {
- m_func(ctx, id);
- }
-
-private:
- Func m_func;
-};
-
-template <typename Func>
-QGLSharedResourceGuardBase *createSharedResourceGuard(QGLContext *context, GLuint id, Func cleanupFunc)
-{
- return new QGLSharedResourceGuard<Func>(context, id, cleanupFunc);
-}
-
-// this is a class that wraps a QThreadStorage object for storing
-// thread local instances of the GL 1 and GL 2 paint engines
-
-template <class T>
-class QGLEngineThreadStorage
-{
-public:
- QPaintEngine *engine() {
- QPaintEngine *&localEngine = storage.localData();
- if (!localEngine)
- localEngine = new T;
- return localEngine;
- }
-
-private:
- QThreadStorage<QPaintEngine *> storage;
-};
-QT_END_NAMESPACE
-
-#endif // QGL_P_H
diff --git a/src/opengl/qglbuffer.cpp b/src/opengl/qglbuffer.cpp
deleted file mode 100644
index bb9c2affbd..0000000000
--- a/src/opengl/qglbuffer.cpp
+++ /dev/null
@@ -1,568 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtOpenGL/qgl.h>
-#include <QtOpenGL/private/qgl_p.h>
-#include <private/qopenglextensions_p.h>
-#include <QtCore/qatomic.h>
-#include "qglbuffer.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QGLBuffer
- \inmodule QtOpenGL
- \brief The QGLBuffer class provides functions for creating and managing GL buffer objects.
- \since 4.7
- \obsolete
- \ingroup painting-3D
-
- Buffer objects are created in the GL server so that the
- client application can avoid uploading vertices, indices,
- texture image data, etc every time they are needed.
-
- QGLBuffer objects can be copied around as a reference to the
- underlying GL buffer object:
-
- \snippet code/src_opengl_qglbuffer.cpp 0
-
- QGLBuffer performs a shallow copy when objects are copied in this
- manner, but does not implement copy-on-write semantics. The original
- object will be affected whenever the copy is modified.
-
- \note This class has been deprecated in favor of QOpenGLBuffer.
-*/
-
-/*!
- \enum QGLBuffer::Type
- This enum defines the type of GL buffer object to create with QGLBuffer.
-
- \value VertexBuffer Vertex buffer object for use when specifying
- vertex arrays.
- \value IndexBuffer Index buffer object for use with \c{glDrawElements()}.
- \value PixelPackBuffer Pixel pack buffer object for reading pixel
- data from the GL server (for example, with \c{glReadPixels()}).
- Not supported under OpenGL/ES.
- \value PixelUnpackBuffer Pixel unpack buffer object for writing pixel
- data to the GL server (for example, with \c{glTexImage2D()}).
- Not supported under OpenGL/ES.
-*/
-
-/*!
- \enum QGLBuffer::UsagePattern
- This enum defines the usage pattern of a QGLBuffer object.
-
- \value StreamDraw The data will be set once and used a few times
- for drawing operations. Under OpenGL/ES 1.1 this is identical
- to StaticDraw.
- \value StreamRead The data will be set once and used a few times
- for reading data back from the GL server. Not supported
- under OpenGL/ES.
- \value StreamCopy The data will be set once and used a few times
- for reading data back from the GL server for use in further
- drawing operations. Not supported under OpenGL/ES.
- \value StaticDraw The data will be set once and used many times
- for drawing operations.
- \value StaticRead The data will be set once and used many times
- for reading data back from the GL server. Not supported
- under OpenGL/ES.
- \value StaticCopy The data will be set once and used many times
- for reading data back from the GL server for use in further
- drawing operations. Not supported under OpenGL/ES.
- \value DynamicDraw The data will be modified repeatedly and used
- many times for drawing operations.
- \value DynamicRead The data will be modified repeatedly and used
- many times for reading data back from the GL server.
- Not supported under OpenGL/ES.
- \value DynamicCopy The data will be modified repeatedly and used
- many times for reading data back from the GL server for
- use in further drawing operations. Not supported under OpenGL/ES.
-*/
-
-/*!
- \enum QGLBuffer::Access
- This enum defines the access mode for QGLBuffer::map().
-
- \value ReadOnly The buffer will be mapped for reading only.
- \value WriteOnly The buffer will be mapped for writing only.
- \value ReadWrite The buffer will be mapped for reading and writing.
-*/
-
-class QGLBufferPrivate
-{
-public:
- QGLBufferPrivate(QGLBuffer::Type t)
- : ref(1),
- type(t),
- guard(0),
- usagePattern(QGLBuffer::StaticDraw),
- actualUsagePattern(QGLBuffer::StaticDraw),
- funcs(0)
- {
- }
-
- QAtomicInt ref;
- QGLBuffer::Type type;
- QGLSharedResourceGuardBase *guard;
- QGLBuffer::UsagePattern usagePattern;
- QGLBuffer::UsagePattern actualUsagePattern;
- QOpenGLExtensions *funcs;
-};
-
-/*!
- Constructs a new buffer object of type QGLBuffer::VertexBuffer.
-
- Note: this constructor just creates the QGLBuffer instance. The actual
- buffer object in the GL server is not created until create() is called.
-
- \sa create()
-*/
-QGLBuffer::QGLBuffer()
- : d_ptr(new QGLBufferPrivate(QGLBuffer::VertexBuffer))
-{
-}
-
-/*!
- Constructs a new buffer object of \a type.
-
- Note: this constructor just creates the QGLBuffer instance. The actual
- buffer object in the GL server is not created until create() is called.
-
- \sa create()
-*/
-QGLBuffer::QGLBuffer(QGLBuffer::Type type)
- : d_ptr(new QGLBufferPrivate(type))
-{
-}
-
-/*!
- Constructs a shallow copy of \a other.
-
- Note: QGLBuffer does not implement copy-on-write semantics,
- so \a other will be affected whenever the copy is modified.
-*/
-QGLBuffer::QGLBuffer(const QGLBuffer &other)
- : d_ptr(other.d_ptr)
-{
- d_ptr->ref.ref();
-}
-
-#define ctx QGLContext::currentContext();
-
-/*!
- Destroys this buffer object, including the storage being
- used in the GL server.
-*/
-QGLBuffer::~QGLBuffer()
-{
- if (!d_ptr->ref.deref()) {
- destroy();
- delete d_ptr;
- }
-}
-
-/*!
- Assigns a shallow copy of \a other to this object.
-
- Note: QGLBuffer does not implement copy-on-write semantics,
- so \a other will be affected whenever the copy is modified.
-*/
-QGLBuffer &QGLBuffer::operator=(const QGLBuffer &other)
-{
- if (d_ptr != other.d_ptr) {
- other.d_ptr->ref.ref();
- if (!d_ptr->ref.deref()) {
- destroy();
- delete d_ptr;
- }
- d_ptr = other.d_ptr;
- }
- return *this;
-}
-
-/*!
- Returns the type of buffer represented by this object.
-*/
-QGLBuffer::Type QGLBuffer::type() const
-{
- Q_D(const QGLBuffer);
- return d->type;
-}
-
-/*!
- Returns the usage pattern for this buffer object.
- The default value is StaticDraw.
-
- \sa setUsagePattern()
-*/
-QGLBuffer::UsagePattern QGLBuffer::usagePattern() const
-{
- Q_D(const QGLBuffer);
- return d->usagePattern;
-}
-
-/*!
- Sets the usage pattern for this buffer object to \a value.
- This function must be called before allocate() or write().
-
- \sa usagePattern(), allocate(), write()
-*/
-void QGLBuffer::setUsagePattern(QGLBuffer::UsagePattern value)
-{
- Q_D(QGLBuffer);
- d->usagePattern = d->actualUsagePattern = value;
-}
-
-#undef ctx
-
-namespace {
- void freeBufferFunc(QGLContext *ctx, GLuint id)
- {
- Q_ASSERT(ctx);
- ctx->contextHandle()->functions()->glDeleteBuffers(1, &id);
- }
-}
-
-/*!
- Creates the buffer object in the GL server. Returns \c true if
- the object was created; false otherwise.
-
- This function must be called with a current QGLContext.
- The buffer will be bound to and can only be used in
- that context (or any other context that is shared with it).
-
- This function will return false if the GL implementation
- does not support buffers, or there is no current QGLContext.
-
- \sa isCreated(), allocate(), write(), destroy()
-*/
-bool QGLBuffer::create()
-{
- Q_D(QGLBuffer);
- if (d->guard && d->guard->id())
- return true;
- QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
- if (ctx) {
- delete d->funcs;
- d->funcs = new QOpenGLExtensions(ctx->contextHandle());
- if (!d->funcs->hasOpenGLFeature(QOpenGLFunctions::Buffers))
- return false;
-
- GLuint bufferId = 0;
- d->funcs->glGenBuffers(1, &bufferId);
- if (bufferId) {
- if (d->guard)
- d->guard->free();
-
- d->guard = createSharedResourceGuard(ctx, bufferId, freeBufferFunc);
- return true;
- }
- }
- return false;
-}
-
-#define ctx QGLContext::currentContext()
-
-/*!
- Returns \c true if this buffer has been created; false otherwise.
-
- \sa create(), destroy()
-*/
-bool QGLBuffer::isCreated() const
-{
- Q_D(const QGLBuffer);
- return d->guard && d->guard->id();
-}
-
-/*!
- Destroys this buffer object, including the storage being
- used in the GL server. All references to the buffer will
- become invalid.
-*/
-void QGLBuffer::destroy()
-{
- Q_D(QGLBuffer);
- if (d->guard) {
- d->guard->free();
- d->guard = 0;
- }
-}
-
-/*!
- Reads the \a count bytes in this buffer starting at \a offset
- into \a data. Returns \c true on success; false if reading from
- the buffer is not supported. Buffer reading is not supported
- under OpenGL/ES.
-
- It is assumed that this buffer has been bound to the current context.
-
- \sa write(), bind()
-*/
-bool QGLBuffer::read(int offset, void *data, int count)
-{
-#if !defined(QT_OPENGL_ES)
- Q_D(QGLBuffer);
- if (!d->funcs->hasOpenGLFeature(QOpenGLFunctions::Buffers) || !d->guard->id() || !d->funcs->d()->GetBufferSubData)
- return false;
- while (d->funcs->glGetError() != GL_NO_ERROR) ; // Clear error state.
- d->funcs->glGetBufferSubData(d->type, offset, count, data);
- return d->funcs->glGetError() == GL_NO_ERROR;
-#else
- Q_UNUSED(offset);
- Q_UNUSED(data);
- Q_UNUSED(count);
- return false;
-#endif
-}
-
-/*!
- Replaces the \a count bytes of this buffer starting at \a offset
- with the contents of \a data. Any other bytes in the buffer
- will be left unmodified.
-
- It is assumed that create() has been called on this buffer and that
- it has been bound to the current context.
-
- \sa create(), read(), allocate()
-*/
-void QGLBuffer::write(int offset, const void *data, int count)
-{
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QGLBuffer::allocate(): buffer not created");
-#endif
- Q_D(QGLBuffer);
- if (d->guard && d->guard->id())
- d->funcs->glBufferSubData(d->type, offset, count, data);
-}
-
-/*!
- Allocates \a count bytes of space to the buffer, initialized to
- the contents of \a data. Any previous contents will be removed.
-
- It is assumed that create() has been called on this buffer and that
- it has been bound to the current context.
-
- \sa create(), read(), write()
-*/
-void QGLBuffer::allocate(const void *data, int count)
-{
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QGLBuffer::allocate(): buffer not created");
-#endif
- Q_D(QGLBuffer);
- if (d->guard && d->guard->id())
- d->funcs->glBufferData(d->type, count, data, d->actualUsagePattern);
-}
-
-/*!
- \fn void QGLBuffer::allocate(int count)
- \overload
-
- Allocates \a count bytes of space to the buffer. Any previous
- contents will be removed.
-
- It is assumed that create() has been called on this buffer and that
- it has been bound to the current context.
-
- \sa create(), write()
-*/
-
-/*!
- Binds the buffer associated with this object to the current
- GL context. Returns \c false if binding was not possible, usually because
- type() is not supported on this GL implementation.
-
- The buffer must be bound to the same QGLContext current when create()
- was called, or to another QGLContext that is sharing with it.
- Otherwise, false will be returned from this function.
-
- \sa release(), create()
-*/
-bool QGLBuffer::bind()
-{
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QGLBuffer::bind(): buffer not created");
-#endif
- Q_D(const QGLBuffer);
- GLuint bufferId = d->guard ? d->guard->id() : 0;
- if (bufferId) {
- if (d->guard->group() != QOpenGLContextGroup::currentContextGroup()) {
-#ifndef QT_NO_DEBUG
- qWarning("QGLBuffer::bind: buffer is not valid in the current context");
-#endif
- return false;
- }
- d->funcs->glBindBuffer(d->type, bufferId);
- return true;
- } else {
- return false;
- }
-}
-
-/*!
- Releases the buffer associated with this object from the
- current GL context.
-
- This function must be called with the same QGLContext current
- as when bind() was called on the buffer.
-
- \sa bind()
-*/
-void QGLBuffer::release()
-{
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QGLBuffer::release(): buffer not created");
-#endif
- Q_D(const QGLBuffer);
- if (d->guard && d->guard->id())
- d->funcs->glBindBuffer(d->type, 0);
-}
-
-#undef ctx
-
-/*!
- Releases the buffer associated with \a type in the current
- QGLContext.
-
- This function is a direct call to \c{glBindBuffer(type, 0)}
- for use when the caller does not know which QGLBuffer has
- been bound to the context but wants to make sure that it
- is released.
-
- \snippet code/src_opengl_qglbuffer.cpp 1
-*/
-void QGLBuffer::release(QGLBuffer::Type type)
-{
- if (QOpenGLContext *ctx = QOpenGLContext::currentContext())
- ctx->functions()->glBindBuffer(GLenum(type), 0);
-}
-
-#define ctx QGLContext::currentContext()
-
-/*!
- Returns the GL identifier associated with this buffer; zero if
- the buffer has not been created.
-
- \sa isCreated()
-*/
-GLuint QGLBuffer::bufferId() const
-{
- Q_D(const QGLBuffer);
- return d->guard ? d->guard->id() : 0;
-}
-
-#ifndef GL_BUFFER_SIZE
-#define GL_BUFFER_SIZE 0x8764
-#endif
-
-/*!
- Returns the size of the data in this buffer, for reading operations.
- Returns -1 if fetching the buffer size is not supported, or the
- buffer has not been created.
-
- It is assumed that this buffer has been bound to the current context.
-
- \sa isCreated(), bind()
-*/
-int QGLBuffer::size() const
-{
- Q_D(const QGLBuffer);
- if (!d->guard || !d->guard->id())
- return -1;
- GLint value = -1;
- d->funcs->glGetBufferParameteriv(d->type, GL_BUFFER_SIZE, &value);
- return value;
-}
-
-/*!
- Maps the contents of this buffer into the application's memory
- space and returns a pointer to it. Returns null if memory
- mapping is not possible. The \a access parameter indicates the
- type of access to be performed.
-
- It is assumed that create() has been called on this buffer and that
- it has been bound to the current context.
-
- This function is only supported under OpenGL/ES if the
- \c{GL_OES_mapbuffer} extension is present.
-
- \sa unmap(), create(), bind()
-*/
-void *QGLBuffer::map(QGLBuffer::Access access)
-{
- Q_D(QGLBuffer);
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QGLBuffer::map(): buffer not created");
-#endif
- if (!d->guard || !d->guard->id())
- return 0;
- return d->funcs->glMapBuffer(d->type, access);
-}
-
-/*!
- Unmaps the buffer after it was mapped into the application's
- memory space with a previous call to map(). Returns \c true if
- the unmap succeeded; false otherwise.
-
- It is assumed that this buffer has been bound to the current context,
- and that it was previously mapped with map().
-
- This function is only supported under OpenGL/ES if the
- \c{GL_OES_mapbuffer} extension is present.
-
- \sa map()
-*/
-bool QGLBuffer::unmap()
-{
- Q_D(QGLBuffer);
-#ifndef QT_NO_DEBUG
- if (!isCreated())
- qWarning("QGLBuffer::unmap(): buffer not created");
-#endif
- if (!d->guard || !d->guard->id())
- return false;
- return d->funcs->glUnmapBuffer(d->type) == GL_TRUE;
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/qglbuffer.h b/src/opengl/qglbuffer.h
deleted file mode 100644
index daf5227c66..0000000000
--- a/src/opengl/qglbuffer.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLBUFFER_H
-#define QGLBUFFER_H
-
-#include <QtCore/qscopedpointer.h>
-#include <QtOpenGL/qgl.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QGLBufferPrivate;
-
-class Q_OPENGL_EXPORT QGLBuffer
-{
-public:
- enum Type
- {
- VertexBuffer = 0x8892, // GL_ARRAY_BUFFER
- IndexBuffer = 0x8893, // GL_ELEMENT_ARRAY_BUFFER
- PixelPackBuffer = 0x88EB, // GL_PIXEL_PACK_BUFFER
- PixelUnpackBuffer = 0x88EC // GL_PIXEL_UNPACK_BUFFER
- };
-
- QGLBuffer();
- explicit QGLBuffer(QGLBuffer::Type type);
- QGLBuffer(const QGLBuffer &other);
- ~QGLBuffer();
-
- QGLBuffer &operator=(const QGLBuffer &other);
-
- enum UsagePattern
- {
- StreamDraw = 0x88E0, // GL_STREAM_DRAW
- StreamRead = 0x88E1, // GL_STREAM_READ
- StreamCopy = 0x88E2, // GL_STREAM_COPY
- StaticDraw = 0x88E4, // GL_STATIC_DRAW
- StaticRead = 0x88E5, // GL_STATIC_READ
- StaticCopy = 0x88E6, // GL_STATIC_COPY
- DynamicDraw = 0x88E8, // GL_DYNAMIC_DRAW
- DynamicRead = 0x88E9, // GL_DYNAMIC_READ
- DynamicCopy = 0x88EA // GL_DYNAMIC_COPY
- };
-
- enum Access
- {
- ReadOnly = 0x88B8, // GL_READ_ONLY
- WriteOnly = 0x88B9, // GL_WRITE_ONLY
- ReadWrite = 0x88BA // GL_READ_WRITE
- };
-
- QGLBuffer::Type type() const;
-
- QGLBuffer::UsagePattern usagePattern() const;
- void setUsagePattern(QGLBuffer::UsagePattern value);
-
- bool create();
- bool isCreated() const;
-
- void destroy();
-
- bool bind();
- void release();
-
- static void release(QGLBuffer::Type type);
-
- GLuint bufferId() const;
-
- int size() const;
-
- bool read(int offset, void *data, int count);
- void write(int offset, const void *data, int count);
-
- void allocate(const void *data, int count);
- inline void allocate(int count) { allocate(nullptr, count); }
-
- void *map(QGLBuffer::Access access);
- bool unmap();
-
-private:
- QGLBufferPrivate *d_ptr;
-
- Q_DECLARE_PRIVATE(QGLBuffer)
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/opengl/qglcolormap.cpp b/src/opengl/qglcolormap.cpp
deleted file mode 100644
index f314a9715d..0000000000
--- a/src/opengl/qglcolormap.cpp
+++ /dev/null
@@ -1,296 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \class QGLColormap
- \brief The QGLColormap class is used for installing custom colormaps into
- a QGLWidget.
-
- \obsolete
- \inmodule QtOpenGL
- \ingroup painting-3D
- \ingroup shared
-
- QGLColormap provides a platform independent way of specifying and
- installing indexed colormaps for a QGLWidget. QGLColormap is
- especially useful when using the OpenGL color-index mode.
-
- Under X11 you must use an X server that supports either a \c
- PseudoColor or \c DirectColor visual class. If your X server
- currently only provides a \c GrayScale, \c TrueColor, \c
- StaticColor or \c StaticGray visual, you will not be able to
- allocate colorcells for writing. If this is the case, try setting
- your X server to 8 bit mode. It should then provide you with at
- least a \c PseudoColor visual. Note that you may experience
- colormap flashing if your X server is running in 8 bit mode.
-
- The size() of the colormap is always set to 256
- colors. Note that under Windows you can also install colormaps
- in child widgets.
-
- This class uses \l{implicit sharing} as a memory and speed
- optimization.
-
- Example of use:
- \snippet code/src_opengl_qglcolormap.cpp 0
-
- \sa QGLWidget::setColormap(), QGLWidget::colormap()
-*/
-
-/*!
- \fn Qt::HANDLE QGLColormap::handle()
-
- \internal
-
- Returns the handle for this color map.
-*/
-
-/*!
- \fn void QGLColormap::setHandle(Qt::HANDLE handle)
-
- \internal
-
- Sets the handle for this color map to \a handle.
-*/
-
-#include "qglcolormap.h"
-
-QT_BEGIN_NAMESPACE
-
-QGLColormap::QGLColormapData QGLColormap::shared_null = { Q_BASIC_ATOMIC_INITIALIZER(1), 0, 0 };
-
-/*!
- Construct a QGLColormap.
-*/
-QGLColormap::QGLColormap()
- : d(&shared_null)
-{
- d->ref.ref();
-}
-
-
-/*!
- Construct a shallow copy of \a map.
-*/
-QGLColormap::QGLColormap(const QGLColormap &map)
- : d(map.d)
-{
- d->ref.ref();
-}
-
-/*!
- Dereferences the QGLColormap and deletes it if this was the last
- reference to it.
-*/
-QGLColormap::~QGLColormap()
-{
- if (!d->ref.deref())
- cleanup(d);
-}
-
-void QGLColormap::cleanup(QGLColormap::QGLColormapData *x)
-{
- delete x->cells;
- x->cells = 0;
- delete x;
-}
-
-/*!
- Assign a shallow copy of \a map to this QGLColormap.
-*/
-QGLColormap & QGLColormap::operator=(const QGLColormap &map)
-{
- map.d->ref.ref();
- if (!d->ref.deref())
- cleanup(d);
- d = map.d;
- return *this;
-}
-
-/*!
- \fn void QGLColormap::detach()
- \internal
-
- Detaches this QGLColormap from the shared block.
-*/
-
-void QGLColormap::detach_helper()
-{
- QGLColormapData *x = new QGLColormapData;
- x->ref.storeRelaxed(1);
- x->cmapHandle = 0;
- x->cells = 0;
- if (d->cells) {
- x->cells = new QVector<QRgb>(256);
- *x->cells = *d->cells;
- }
- if (!d->ref.deref())
- cleanup(d);
- d = x;
-}
-
-/*!
- Set cell at index \a idx in the colormap to color \a color.
-*/
-void QGLColormap::setEntry(int idx, QRgb color)
-{
- detach();
- if (!d->cells)
- d->cells = new QVector<QRgb>(256);
- d->cells->replace(idx, color);
-}
-
-/*!
- Set an array of cells in this colormap. \a count is the number of
- colors that should be set, \a colors is the array of colors, and
- \a base is the starting index. The first element in \a colors
- is set at \a base in the colormap.
-*/
-void QGLColormap::setEntries(int count, const QRgb *colors, int base)
-{
- detach();
- if (!d->cells)
- d->cells = new QVector<QRgb>(256);
-
- Q_ASSERT_X(colors && base >= 0 && (base + count) <= d->cells->size(), "QGLColormap::setEntries",
- "preconditions not met");
- for (int i = 0; i < count; ++i)
- setEntry(base + i, colors[i]);
-}
-
-/*!
- Returns the QRgb value in the colorcell with index \a idx.
-*/
-QRgb QGLColormap::entryRgb(int idx) const
-{
- if (d == &shared_null || !d->cells)
- return 0;
- else
- return d->cells->at(idx);
-}
-
-/*!
- \overload
-
- Set the cell with index \a idx in the colormap to color \a color.
-*/
-void QGLColormap::setEntry(int idx, const QColor &color)
-{
- setEntry(idx, color.rgb());
-}
-
-/*!
- Returns the QRgb value in the colorcell with index \a idx.
-*/
-QColor QGLColormap::entryColor(int idx) const
-{
- if (d == &shared_null || !d->cells)
- return QColor();
- else
- return QColor(d->cells->at(idx));
-}
-
-/*!
- Returns \c true if the colormap is empty or it is not in use
- by a QGLWidget; otherwise returns \c false.
-
- A colormap with no color values set is considered to be empty.
- For historical reasons, a colormap that has color values set
- but which is not in use by a QGLWidget is also considered empty.
-
- Compare size() with zero to determine if the colormap is empty
- regardless of whether it is in use by a QGLWidget or not.
-
- \sa size()
-*/
-bool QGLColormap::isEmpty() const
-{
- return d == &shared_null || d->cells == 0 || d->cells->size() == 0 || d->cmapHandle == 0;
-}
-
-
-/*!
- Returns the number of colorcells in the colormap.
-*/
-int QGLColormap::size() const
-{
- return d->cells ? d->cells->size() : 0;
-}
-
-/*!
- Returns the index of the color \a color. If \a color is not in the
- map, -1 is returned.
-*/
-int QGLColormap::find(QRgb color) const
-{
- if (d->cells)
- return d->cells->indexOf(color);
- return -1;
-}
-
-/*!
- Returns the index of the color that is the closest match to color
- \a color.
-*/
-int QGLColormap::findNearest(QRgb color) const
-{
- int idx = find(color);
- if (idx >= 0)
- return idx;
- int mapSize = size();
- int mindist = 200000;
- int r = qRed(color);
- int g = qGreen(color);
- int b = qBlue(color);
- int rx, gx, bx, dist;
- for (int i = 0; i < mapSize; ++i) {
- QRgb ci = d->cells->at(i);
- rx = r - qRed(ci);
- gx = g - qGreen(ci);
- bx = b - qBlue(ci);
- dist = rx * rx + gx * gx + bx * bx; // calculate distance
- if (dist < mindist) { // minimal?
- mindist = dist;
- idx = i;
- }
- }
- return idx;
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/qglcolormap.h b/src/opengl/qglcolormap.h
deleted file mode 100644
index b59b56e040..0000000000
--- a/src/opengl/qglcolormap.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLCOLORMAP_H
-#define QGLCOLORMAP_H
-
-#include <QtGui/qcolor.h>
-#include <QtCore/qvector.h>
-#include <QtOpenGL/qtopenglglobal.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class Q_OPENGL_EXPORT QGLColormap
-{
-public:
- QGLColormap();
- QGLColormap(const QGLColormap &);
- ~QGLColormap();
-
- QGLColormap &operator=(const QGLColormap &);
-
- bool isEmpty() const;
- int size() const;
- void detach();
-
- void setEntries(int count, const QRgb * colors, int base = 0);
- void setEntry(int idx, QRgb color);
- void setEntry(int idx, const QColor & color);
- QRgb entryRgb(int idx) const;
- QColor entryColor(int idx) const;
- int find(QRgb color) const;
- int findNearest(QRgb color) const;
-
-protected:
- Qt::HANDLE handle() { return d ? d->cmapHandle : nullptr; }
- void setHandle(Qt::HANDLE ahandle) { d->cmapHandle = ahandle; }
-
-private:
- struct QGLColormapData {
- QBasicAtomicInt ref;
- QVector<QRgb> *cells;
- Qt::HANDLE cmapHandle;
- };
-
- QGLColormapData *d;
- static struct QGLColormapData shared_null;
- static void cleanup(QGLColormapData *x);
- void detach_helper();
-
- friend class QGLWidget;
- friend class QGLWidgetPrivate;
-};
-
-inline void QGLColormap::detach()
-{
- if (d->ref.loadRelaxed() != 1)
- detach_helper();
-}
-
-QT_END_NAMESPACE
-
-#endif // QGLCOLORMAP_H
diff --git a/src/opengl/qglframebufferobject.cpp b/src/opengl/qglframebufferobject.cpp
deleted file mode 100644
index 362b3ef189..0000000000
--- a/src/opengl/qglframebufferobject.cpp
+++ /dev/null
@@ -1,1466 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qglframebufferobject.h"
-#include "qglframebufferobject_p.h"
-
-#include <qdebug.h>
-#include <private/qgl_p.h>
-#include <private/qfont_p.h>
-#include "gl2paintengineex/qpaintengineex_opengl2_p.h"
-
-#include <qimage.h>
-#include <qwindow.h>
-
-QT_BEGIN_NAMESPACE
-
-extern QImage qt_gl_read_frame_buffer(const QSize&, bool, bool);
-
-#define QGL_FUNC_CONTEXT const QGLContext *ctx = QGLContext::currentContext();
-#define QGL_FUNCP_CONTEXT const QGLContext *ctx = QGLContext::currentContext();
-
-#ifndef QT_NO_DEBUG
-#define QT_RESET_GLERROR() \
-{ \
- while (QOpenGLContext::currentContext()->functions()->glGetError() != GL_NO_ERROR) {} \
-}
-#define QT_CHECK_GLERROR() \
-{ \
- GLenum err = QOpenGLContext::currentContext()->functions()->glGetError(); \
- if (err != GL_NO_ERROR) { \
- qDebug("[%s line %d] GL Error: %d", \
- __FILE__, __LINE__, (int)err); \
- } \
-}
-#else
-#define QT_RESET_GLERROR() {}
-#define QT_CHECK_GLERROR() {}
-#endif
-
-// ####TODO Properly #ifdef this class to use #define symbols actually defined
-// by OpenGL/ES includes
-#ifndef GL_MAX_SAMPLES
-#define GL_MAX_SAMPLES 0x8D57
-#endif
-
-#ifndef GL_RENDERBUFFER_SAMPLES
-#define GL_RENDERBUFFER_SAMPLES 0x8CAB
-#endif
-
-#ifndef GL_DEPTH24_STENCIL8
-#define GL_DEPTH24_STENCIL8 0x88F0
-#endif
-
-#ifndef GL_DEPTH_COMPONENT24
-#define GL_DEPTH_COMPONENT24 0x81A6
-#endif
-
-#ifndef GL_DEPTH_COMPONENT24_OES
-#define GL_DEPTH_COMPONENT24_OES 0x81A6
-#endif
-
-#ifndef GL_READ_FRAMEBUFFER
-#define GL_READ_FRAMEBUFFER 0x8CA8
-#endif
-
-#ifndef GL_DRAW_FRAMEBUFFER
-#define GL_DRAW_FRAMEBUFFER 0x8CA9
-#endif
-
-#ifndef GL_DEPTH_STENCIL_ATTACHMENT
-#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
-#endif
-
-#ifndef GL_DEPTH_STENCIL
-#define GL_DEPTH_STENCIL 0x84F9
-#endif
-
-/*!
- \class QGLFramebufferObjectFormat
- \inmodule QtOpenGL
- \brief The QGLFramebufferObjectFormat class specifies the format of an OpenGL
- framebuffer object.
-
- \since 4.6
- \obsolete
-
- \ingroup painting-3D
-
- A framebuffer object has several characteristics:
- \list
- \li \l{setSamples()}{Number of samples per pixels.}
- \li \l{setAttachment()}{Depth and/or stencil attachments.}
- \li \l{setTextureTarget()}{Texture target.}
- \li \l{setInternalTextureFormat()}{Internal texture format.}
- \endlist
-
- Note that the desired attachments or number of samples per pixels might not
- be supported by the hardware driver. Call QGLFramebufferObject::format()
- after creating a QGLFramebufferObject to find the exact format that was
- used to create the frame buffer object.
-
- \note This class has been deprecated in favor of QOpenGLFramebufferObjectFormat.
-
- \sa QGLFramebufferObject
-*/
-
-/*!
- \internal
-*/
-void QGLFramebufferObjectFormat::detach()
-{
- if (d->ref.loadRelaxed() != 1) {
- QGLFramebufferObjectFormatPrivate *newd
- = new QGLFramebufferObjectFormatPrivate(d);
- if (!d->ref.deref())
- delete d;
- d = newd;
- }
-}
-
-/*!
- Creates a QGLFramebufferObjectFormat object for specifying
- the format of an OpenGL framebuffer object.
-
- By default the format specifies a non-multisample framebuffer object with no
- attachments, texture target \c GL_TEXTURE_2D, and internal format \c GL_RGBA8.
- On OpenGL/ES systems, the default internal format is \c GL_RGBA.
-
- \sa samples(), attachment(), internalTextureFormat()
-*/
-
-QGLFramebufferObjectFormat::QGLFramebufferObjectFormat()
-{
- d = new QGLFramebufferObjectFormatPrivate;
-}
-
-/*!
- Constructs a copy of \a other.
-*/
-
-QGLFramebufferObjectFormat::QGLFramebufferObjectFormat(const QGLFramebufferObjectFormat &other)
-{
- d = other.d;
- d->ref.ref();
-}
-
-/*!
- Assigns \a other to this object.
-*/
-
-QGLFramebufferObjectFormat &QGLFramebufferObjectFormat::operator=(const QGLFramebufferObjectFormat &other)
-{
- if (d != other.d) {
- other.d->ref.ref();
- if (!d->ref.deref())
- delete d;
- d = other.d;
- }
- return *this;
-}
-
-/*!
- Destroys the QGLFramebufferObjectFormat.
-*/
-QGLFramebufferObjectFormat::~QGLFramebufferObjectFormat()
-{
- if (!d->ref.deref())
- delete d;
-}
-
-/*!
- Sets the number of samples per pixel for a multisample framebuffer object
- to \a samples. The default sample count of 0 represents a regular
- non-multisample framebuffer object.
-
- If the desired amount of samples per pixel is not supported by the hardware
- then the maximum number of samples per pixel will be used. Note that
- multisample framebuffer objects cannot be bound as textures. Also, the
- \c{GL_EXT_framebuffer_multisample} extension is required to create a
- framebuffer with more than one sample per pixel.
-
- \sa samples()
-*/
-void QGLFramebufferObjectFormat::setSamples(int samples)
-{
- detach();
- d->samples = samples;
-}
-
-/*!
- Returns the number of samples per pixel if a framebuffer object
- is a multisample framebuffer object. Otherwise, returns 0.
- The default value is 0.
-
- \sa setSamples()
-*/
-int QGLFramebufferObjectFormat::samples() const
-{
- return d->samples;
-}
-
-/*!
- \since 4.8
-
- Enables mipmapping if \a enabled is true; otherwise disables it.
-
- Mipmapping is disabled by default.
-
- If mipmapping is enabled, additional memory will be allocated for
- the mipmap levels. The mipmap levels can be updated by binding the
- texture and calling glGenerateMipmap(). Mipmapping cannot be enabled
- for multisampled framebuffer objects.
-
- \sa mipmap(), QGLFramebufferObject::texture()
-*/
-void QGLFramebufferObjectFormat::setMipmap(bool enabled)
-{
- detach();
- d->mipmap = enabled;
-}
-
-/*!
- \since 4.8
-
- Returns \c true if mipmapping is enabled.
-
- \sa setMipmap()
-*/
-bool QGLFramebufferObjectFormat::mipmap() const
-{
- return d->mipmap;
-}
-
-/*!
- Sets the attachment configuration of a framebuffer object to \a attachment.
-
- \sa attachment()
-*/
-void QGLFramebufferObjectFormat::setAttachment(QGLFramebufferObject::Attachment attachment)
-{
- detach();
- d->attachment = attachment;
-}
-
-/*!
- Returns the configuration of the depth and stencil buffers attached to
- a framebuffer object. The default is QGLFramebufferObject::NoAttachment.
-
- \sa setAttachment()
-*/
-QGLFramebufferObject::Attachment QGLFramebufferObjectFormat::attachment() const
-{
- return d->attachment;
-}
-
-/*!
- Sets the texture target of the texture attached to a framebuffer object to
- \a target. Ignored for multisample framebuffer objects.
-
- \sa textureTarget(), samples()
-*/
-void QGLFramebufferObjectFormat::setTextureTarget(GLenum target)
-{
- detach();
- d->target = target;
-}
-
-/*!
- Returns the texture target of the texture attached to a framebuffer object.
- Ignored for multisample framebuffer objects. The default is
- \c GL_TEXTURE_2D.
-
- \sa setTextureTarget(), samples()
-*/
-GLenum QGLFramebufferObjectFormat::textureTarget() const
-{
- return d->target;
-}
-
-/*!
- Sets the internal format of a framebuffer object's texture or
- multisample framebuffer object's color buffer to
- \a internalTextureFormat.
-
- \sa internalTextureFormat()
-*/
-void QGLFramebufferObjectFormat::setInternalTextureFormat(GLenum internalTextureFormat)
-{
- detach();
- d->internal_format = internalTextureFormat;
-}
-
-/*!
- Returns the internal format of a framebuffer object's texture or
- multisample framebuffer object's color buffer. The default is
- \c GL_RGBA8 on desktop OpenGL systems, and \c GL_RGBA on
- OpenGL/ES systems.
-
- \sa setInternalTextureFormat()
-*/
-GLenum QGLFramebufferObjectFormat::internalTextureFormat() const
-{
- return d->internal_format;
-}
-
-/*!
- Returns \c true if all the options of this framebuffer object format
- are the same as \a other; otherwise returns \c false.
-*/
-bool QGLFramebufferObjectFormat::operator==(const QGLFramebufferObjectFormat& other) const
-{
- if (d == other.d)
- return true;
- else
- return d->equals(other.d);
-}
-
-/*!
- Returns \c false if all the options of this framebuffer object format
- are the same as \a other; otherwise returns \c true.
-*/
-bool QGLFramebufferObjectFormat::operator!=(const QGLFramebufferObjectFormat& other) const
-{
- return !(*this == other);
-}
-
-void QGLFBOGLPaintDevice::setFBO(QGLFramebufferObject* f,
- QGLFramebufferObject::Attachment attachment)
-{
- fbo = f;
- m_thisFBO = fbo->d_func()->fbo(); // This shouldn't be needed
-
- // The context that the fbo was created in may not have depth
- // and stencil buffers, but the fbo itself might.
- fboFormat = QGLContext::currentContext()->format();
- if (attachment == QGLFramebufferObject::CombinedDepthStencil) {
- fboFormat.setDepth(true);
- fboFormat.setStencil(true);
- } else if (attachment == QGLFramebufferObject::Depth) {
- fboFormat.setDepth(true);
- fboFormat.setStencil(false);
- } else {
- fboFormat.setDepth(false);
- fboFormat.setStencil(false);
- }
-
- GLenum format = f->format().internalTextureFormat();
- reqAlpha = (format != GL_RGB
-#ifdef GL_RGB5
- && format != GL_RGB5
-#endif
-#ifdef GL_RGB8
- && format != GL_RGB8
-#endif
- );
-}
-
-QGLContext *QGLFBOGLPaintDevice::context() const
-{
- return const_cast<QGLContext *>(QGLContext::currentContext());
-}
-
-bool QGLFramebufferObjectPrivate::checkFramebufferStatus() const
-{
- QGL_FUNCP_CONTEXT;
- if (!ctx)
- return false; // Context no longer exists.
- GLenum status = ctx->contextHandle()->functions()->glCheckFramebufferStatus(GL_FRAMEBUFFER);
- switch(status) {
- case GL_NO_ERROR:
- case GL_FRAMEBUFFER_COMPLETE:
- return true;
- case GL_FRAMEBUFFER_UNSUPPORTED:
- qDebug("QGLFramebufferObject: Unsupported framebuffer format.");
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
- qDebug("QGLFramebufferObject: Framebuffer incomplete attachment.");
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
- qDebug("QGLFramebufferObject: Framebuffer incomplete, missing attachment.");
- break;
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT
- case GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT:
- qDebug("QGLFramebufferObject: Framebuffer incomplete, duplicate attachment.");
- break;
-#endif
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS
- case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
- qDebug("QGLFramebufferObject: Framebuffer incomplete, attached images must have same dimensions.");
- break;
-#endif
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_FORMATS
- case GL_FRAMEBUFFER_INCOMPLETE_FORMATS:
- qDebug("QGLFramebufferObject: Framebuffer incomplete, attached images must have same format.");
- break;
-#endif
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER
- case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
- qDebug("QGLFramebufferObject: Framebuffer incomplete, missing draw buffer.");
- break;
-#endif
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER
- case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
- qDebug("QGLFramebufferObject: Framebuffer incomplete, missing read buffer.");
- break;
-#endif
-#ifdef GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
- case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
- qDebug("QGLFramebufferObject: Framebuffer incomplete, attachments must have same number of samples per pixel.");
- break;
-#endif
- default:
- qDebug() <<"QGLFramebufferObject: An undefined error has occurred: "<< status;
- break;
- }
- return false;
-}
-
-namespace
-{
- void freeFramebufferFunc(QGLContext *ctx, GLuint id)
- {
- Q_ASSERT(ctx);
- ctx->contextHandle()->functions()->glDeleteFramebuffers(1, &id);
- }
-
- void freeRenderbufferFunc(QGLContext *ctx, GLuint id)
- {
- Q_ASSERT(ctx);
- ctx->contextHandle()->functions()->glDeleteRenderbuffers(1, &id);
- }
-
- void freeTextureFunc(QGLContext *ctx, GLuint id)
- {
- Q_UNUSED(ctx);
- ctx->contextHandle()->functions()->glDeleteTextures(1, &id);
- }
-}
-
-void QGLFramebufferObjectPrivate::init(QGLFramebufferObject *q, const QSize &sz,
- QGLFramebufferObject::Attachment attachment,
- GLenum texture_target, GLenum internal_format,
- GLint samples, bool mipmap)
-{
- QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
-
- funcs.initializeOpenGLFunctions();
-
- if (!funcs.hasOpenGLFeature(QOpenGLFunctions::Framebuffers))
- return;
-
- ctx->d_ptr->refreshCurrentFbo();
-
- size = sz;
- target = texture_target;
- // texture dimensions
-
- QT_RESET_GLERROR(); // reset error state
- GLuint fbo = 0;
- funcs.glGenFramebuffers(1, &fbo);
- funcs.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
-
- GLuint texture = 0;
- GLuint color_buffer = 0;
- GLuint depth_buffer = 0;
- GLuint stencil_buffer = 0;
-
- QT_CHECK_GLERROR();
- // init texture
- if (samples == 0) {
- funcs.glGenTextures(1, &texture);
- funcs.glBindTexture(target, texture);
- funcs.glTexImage2D(target, 0, internal_format, size.width(), size.height(), 0,
- GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- if (mipmap) {
- int width = size.width();
- int height = size.height();
- int level = 0;
- while (width > 1 || height > 1) {
- width = qMax(1, width >> 1);
- height = qMax(1, height >> 1);
- ++level;
- funcs.glTexImage2D(target, level, internal_format, width, height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- }
- }
- funcs.glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- funcs.glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- funcs.glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- funcs.glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- funcs.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- target, texture, 0);
-
- QT_CHECK_GLERROR();
- valid = checkFramebufferStatus();
- funcs.glBindTexture(target, 0);
-
- color_buffer = 0;
- } else {
- mipmap = false;
- GLint maxSamples;
- funcs.glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
-
- samples = qBound(0, int(samples), int(maxSamples));
-
- funcs.glGenRenderbuffers(1, &color_buffer);
- funcs.glBindRenderbuffer(GL_RENDERBUFFER, color_buffer);
- if (funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample) && samples > 0) {
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- internal_format, size.width(), size.height());
- } else {
- samples = 0;
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, internal_format,
- size.width(), size.height());
- }
-
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_RENDERBUFFER, color_buffer);
-
- QT_CHECK_GLERROR();
- valid = checkFramebufferStatus();
-
- if (valid)
- funcs.glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &samples);
- }
-
- // In practice, a combined depth-stencil buffer is supported by all desktop platforms, while a
- // separate stencil buffer is not. On embedded devices however, a combined depth-stencil buffer
- // might not be supported while separate buffers are, according to QTBUG-12861.
-
- if (attachment == QGLFramebufferObject::CombinedDepthStencil
- && funcs.hasOpenGLExtension(QOpenGLExtensions::PackedDepthStencil)) {
- // depth and stencil buffer needs another extension
- funcs.glGenRenderbuffers(1, &depth_buffer);
- funcs.glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
- Q_ASSERT(funcs.glIsRenderbuffer(depth_buffer));
-#ifndef Q_OS_WASM
- if (samples != 0 && funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample))
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH24_STENCIL8, size.width(), size.height());
- else
- funcs.glRenderbufferStorage(GL_RENDERBUFFER,
- GL_DEPTH24_STENCIL8, size.width(), size.height());
-
- stencil_buffer = depth_buffer;
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
- GL_RENDERBUFFER, depth_buffer);
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, stencil_buffer);
-#else
- // webgl does not allow separate depth and stencil attachments
- if (samples != 0) {
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH_STENCIL, size.width(), size.height());
- } else {
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL,
- size.width(), size.height());
- }
- stencil_buffer = depth_buffer;
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, depth_buffer);
-#endif
-
- valid = checkFramebufferStatus();
- if (!valid) {
- funcs.glDeleteRenderbuffers(1, &depth_buffer);
- stencil_buffer = depth_buffer = 0;
- }
- }
-
- if (depth_buffer == 0 && (attachment == QGLFramebufferObject::CombinedDepthStencil
- || (attachment == QGLFramebufferObject::Depth)))
- {
- funcs.glGenRenderbuffers(1, &depth_buffer);
- funcs.glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
- Q_ASSERT(funcs.glIsRenderbuffer(depth_buffer));
- if (samples != 0 && funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample)) {
-#ifdef QT_OPENGL_ES
- if (funcs.hasOpenGLExtension(QOpenGLExtensions::Depth24)) {
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH_COMPONENT24_OES, size.width(), size.height());
- } else {
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH_COMPONENT16, size.width(), size.height());
- }
-#else
- if (ctx->contextHandle()->isOpenGLES()) {
- if (funcs.hasOpenGLExtension(QOpenGLExtensions::Depth24))
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH_COMPONENT24, size.width(), size.height());
- else
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH_COMPONENT16, size.width(), size.height());
- } else {
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
- GL_DEPTH_COMPONENT, size.width(), size.height());
- }
-#endif
- } else {
-#ifdef QT_OPENGL_ES
- if (funcs.hasOpenGLExtension(QOpenGLExtensions::Depth24)) {
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES,
- size.width(), size.height());
- } else {
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
- size.width(), size.height());
- }
-#else
- if (ctx->contextHandle()->isOpenGLES()) {
- if (funcs.hasOpenGLExtension(QOpenGLExtensions::Depth24)) {
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24,
- size.width(), size.height());
- } else {
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
- size.width(), size.height());
- }
- } else {
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, size.width(), size.height());
- }
-#endif
- }
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
- GL_RENDERBUFFER, depth_buffer);
- valid = checkFramebufferStatus();
- if (!valid) {
- funcs.glDeleteRenderbuffers(1, &depth_buffer);
- depth_buffer = 0;
- }
- }
-
- if (stencil_buffer == 0 && (attachment == QGLFramebufferObject::CombinedDepthStencil)) {
- funcs.glGenRenderbuffers(1, &stencil_buffer);
- funcs.glBindRenderbuffer(GL_RENDERBUFFER, stencil_buffer);
- Q_ASSERT(funcs.glIsRenderbuffer(stencil_buffer));
-
-#ifdef QT_OPENGL_ES
- GLenum storage = GL_STENCIL_INDEX8;
-#else
- GLenum storage = ctx->contextHandle()->isOpenGLES() ? GL_STENCIL_INDEX8 : GL_STENCIL_INDEX;
-#endif
-
- if (samples != 0 && funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample))
- funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, storage, size.width(), size.height());
- else
- funcs.glRenderbufferStorage(GL_RENDERBUFFER, storage, size.width(), size.height());
-
- funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, stencil_buffer);
- valid = checkFramebufferStatus();
- if (!valid) {
- funcs.glDeleteRenderbuffers(1, &stencil_buffer);
- stencil_buffer = 0;
- }
- }
-
- // The FBO might have become valid after removing the depth or stencil buffer.
- valid = checkFramebufferStatus();
-
- if (depth_buffer && stencil_buffer) {
- fbo_attachment = QGLFramebufferObject::CombinedDepthStencil;
- } else if (depth_buffer) {
- fbo_attachment = QGLFramebufferObject::Depth;
- } else {
- fbo_attachment = QGLFramebufferObject::NoAttachment;
- }
-
- funcs.glBindFramebuffer(GL_FRAMEBUFFER, ctx->d_ptr->current_fbo);
- if (valid) {
- fbo_guard = createSharedResourceGuard(ctx, fbo, freeFramebufferFunc);
- if (color_buffer)
- color_buffer_guard = createSharedResourceGuard(ctx, color_buffer, freeRenderbufferFunc);
- else
- texture_guard = createSharedResourceGuard(ctx, texture, freeTextureFunc);
- if (depth_buffer)
- depth_buffer_guard = createSharedResourceGuard(ctx, depth_buffer, freeRenderbufferFunc);
- if (stencil_buffer) {
- if (stencil_buffer == depth_buffer)
- stencil_buffer_guard = depth_buffer_guard;
- else
- stencil_buffer_guard = createSharedResourceGuard(ctx, stencil_buffer, freeRenderbufferFunc);
- }
- } else {
- if (color_buffer)
- funcs.glDeleteRenderbuffers(1, &color_buffer);
- else
- funcs.glDeleteTextures(1, &texture);
- if (depth_buffer)
- funcs.glDeleteRenderbuffers(1, &depth_buffer);
- if (stencil_buffer && depth_buffer != stencil_buffer)
- funcs.glDeleteRenderbuffers(1, &stencil_buffer);
- funcs.glDeleteFramebuffers(1, &fbo);
- }
- QT_CHECK_GLERROR();
-
- format.setTextureTarget(target);
- format.setSamples(int(samples));
- format.setAttachment(fbo_attachment);
- format.setInternalTextureFormat(internal_format);
- format.setMipmap(mipmap);
-
- glDevice.setFBO(q, attachment);
-}
-
-/*!
- \class QGLFramebufferObject
- \inmodule QtOpenGL
- \brief The QGLFramebufferObject class encapsulates an OpenGL framebuffer object.
- \since 4.2
-
- \obsolete
-
- \ingroup painting-3D
-
- The QGLFramebufferObject class encapsulates an OpenGL framebuffer
- object, defined by the \c{GL_EXT_framebuffer_object} extension. In
- addition it provides a rendering surface that can be painted on
- with a QPainter, rendered to using native GL calls, or both. This
- surface can be bound and used as a regular texture in your own GL
- drawing code. By default, the QGLFramebufferObject class
- generates a 2D GL texture (using the \c{GL_TEXTURE_2D} target),
- which is used as the internal rendering target.
-
- \b{It is important to have a current GL context when creating a
- QGLFramebufferObject, otherwise initialization will fail.}
-
- OpenGL framebuffer objects and pbuffers (see
- \l{QGLPixelBuffer}{QGLPixelBuffer}) can both be used to render to
- offscreen surfaces, but there are a number of advantages with
- using framebuffer objects instead of pbuffers:
-
- \list 1
- \li A framebuffer object does not require a separate rendering
- context, so no context switching will occur when switching
- rendering targets. There is an overhead involved in switching
- targets, but in general it is cheaper than a context switch to a
- pbuffer.
-
- \li Rendering to dynamic textures (i.e. render-to-texture
- functionality) works on all platforms. No need to do explicit copy
- calls from a render buffer into a texture, as was necessary on
- systems that did not support the \c{render_texture} extension.
-
- \li It is possible to attach several rendering buffers (or texture
- objects) to the same framebuffer object, and render to all of them
- without doing a context switch.
-
- \li The OpenGL framebuffer extension is a pure GL extension with no
- system dependant WGL, CGL, or GLX parts. This makes using
- framebuffer objects more portable.
- \endlist
-
- When using a QPainter to paint to a QGLFramebufferObject you should take
- care that the QGLFramebufferObject is created with the CombinedDepthStencil
- attachment for QPainter to be able to render correctly.
- Note that you need to create a QGLFramebufferObject with more than one
- sample per pixel for primitives to be antialiased when drawing using a
- QPainter. To create a multisample framebuffer object you should use one of
- the constructors that take a QGLFramebufferObjectFormat parameter, and set
- the QGLFramebufferObjectFormat::samples() property to a non-zero value.
-
- When painting to a QGLFramebufferObject using QPainter, the state of
- the current GL context will be altered by the paint engine to reflect
- its needs. Applications should not rely upon the GL state being reset
- to its original conditions, particularly the current shader program,
- GL viewport, texture units, and drawing modes.
-
- For multisample framebuffer objects a color render buffer is created,
- otherwise a texture with the specified texture target is created.
- The color render buffer or texture will have the specified internal
- format, and will be bound to the \c GL_COLOR_ATTACHMENT0
- attachment in the framebuffer object.
-
- If you want to use a framebuffer object with multisampling enabled
- as a texture, you first need to copy from it to a regular framebuffer
- object using QGLContext::blitFramebuffer().
-
- \section1 Threading
-
- As of Qt 4.8, it's possible to draw into a QGLFramebufferObject
- using a QPainter in a separate thread. Note that OpenGL 2.0 or
- OpenGL ES 2.0 is required for this to work.
-
- \note This class has been deprecated in favor of QOpenGLFramebufferObject.
-*/
-
-
-/*!
- \enum QGLFramebufferObject::Attachment
- \since 4.3
-
- This enum type is used to configure the depth and stencil buffers
- attached to the framebuffer object when it is created.
-
- \value NoAttachment No attachment is added to the framebuffer object. Note that the
- OpenGL depth and stencil tests won't work when rendering to a
- framebuffer object without any depth or stencil buffers.
- This is the default value.
-
- \value CombinedDepthStencil If the \c GL_EXT_packed_depth_stencil extension is present,
- a combined depth and stencil buffer is attached.
- If the extension is not present, only a depth buffer is attached.
-
- \value Depth A depth buffer is attached to the framebuffer object.
-
- \sa attachment()
-*/
-
-
-/*! \fn QGLFramebufferObject::QGLFramebufferObject(const QSize &size, GLenum target)
-
- Constructs an OpenGL framebuffer object and binds a 2D GL texture
- to the buffer of the size \a size. The texture is bound to the
- \c GL_COLOR_ATTACHMENT0 target in the framebuffer object.
-
- The \a target parameter is used to specify the GL texture
- target. The default target is \c GL_TEXTURE_2D. Keep in mind that
- \c GL_TEXTURE_2D textures must have a power of 2 width and height
- (e.g. 256x512), unless you are using OpenGL 2.0 or higher.
-
- By default, no depth and stencil buffers are attached. This behavior
- can be toggled using one of the overloaded constructors.
-
- The default internal texture format is \c GL_RGBA8 for desktop
- OpenGL, and \c GL_RGBA for OpenGL/ES.
-
- It is important that you have a current GL context set when
- creating the QGLFramebufferObject, otherwise the initialization
- will fail.
-
- \sa size(), texture(), attachment()
-*/
-
-QGLFramebufferObject::QGLFramebufferObject(const QSize &size, GLenum target)
- : d_ptr(new QGLFramebufferObjectPrivate)
-{
- Q_D(QGLFramebufferObject);
- d->init(this, size, NoAttachment, target,
-#ifndef QT_OPENGL_ES_2
- QOpenGLContext::currentContext()->isOpenGLES() ? GL_RGBA : GL_RGBA8
-#else
- GL_RGBA
-#endif
- );
-}
-
-/*! \overload
-
- Constructs an OpenGL framebuffer object and binds a 2D GL texture
- to the buffer of the given \a width and \a height.
-
- \sa size(), texture()
-*/
-QGLFramebufferObject::QGLFramebufferObject(int width, int height, GLenum target)
- : d_ptr(new QGLFramebufferObjectPrivate)
-{
- Q_D(QGLFramebufferObject);
- d->init(this, QSize(width, height), NoAttachment, target,
-#ifndef QT_OPENGL_ES_2
- QOpenGLContext::currentContext()->isOpenGLES() ? GL_RGBA : GL_RGBA8
-#else
- GL_RGBA
-#endif
- );
-}
-
-/*! \overload
-
- Constructs an OpenGL framebuffer object of the given \a size based on the
- supplied \a format.
-*/
-
-QGLFramebufferObject::QGLFramebufferObject(const QSize &size, const QGLFramebufferObjectFormat &format)
- : d_ptr(new QGLFramebufferObjectPrivate)
-{
- Q_D(QGLFramebufferObject);
- d->init(this, size, format.attachment(), format.textureTarget(), format.internalTextureFormat(),
- format.samples(), format.mipmap());
-}
-
-/*! \overload
-
- Constructs an OpenGL framebuffer object of the given \a width and \a height
- based on the supplied \a format.
-*/
-
-QGLFramebufferObject::QGLFramebufferObject(int width, int height, const QGLFramebufferObjectFormat &format)
- : d_ptr(new QGLFramebufferObjectPrivate)
-{
- Q_D(QGLFramebufferObject);
- d->init(this, QSize(width, height), format.attachment(), format.textureTarget(),
- format.internalTextureFormat(), format.samples(), format.mipmap());
-}
-
-/*! \overload
-
- Constructs an OpenGL framebuffer object and binds a texture to the
- buffer of the given \a width and \a height.
-
- The \a attachment parameter describes the depth/stencil buffer
- configuration, \a target the texture target and \a internal_format
- the internal texture format. The default texture target is \c
- GL_TEXTURE_2D, while the default internal format is \c GL_RGBA8
- for desktop OpenGL and \c GL_RGBA for OpenGL/ES.
-
- \sa size(), texture(), attachment()
-*/
-QGLFramebufferObject::QGLFramebufferObject(int width, int height, Attachment attachment,
- GLenum target, GLenum internal_format)
- : d_ptr(new QGLFramebufferObjectPrivate)
-{
- Q_D(QGLFramebufferObject);
- if (!internal_format)
-#ifdef QT_OPENGL_ES_2
- internal_format = GL_RGBA;
-#else
- internal_format = QOpenGLContext::currentContext()->isOpenGLES() ? GL_RGBA : GL_RGBA8;
-#endif
- d->init(this, QSize(width, height), attachment, target, internal_format);
-}
-
-/*! \overload
-
- Constructs an OpenGL framebuffer object and binds a texture to the
- buffer of the given \a size.
-
- The \a attachment parameter describes the depth/stencil buffer
- configuration, \a target the texture target and \a internal_format
- the internal texture format. The default texture target is \c
- GL_TEXTURE_2D, while the default internal format is \c GL_RGBA8
- for desktop OpenGL and \c GL_RGBA for OpenGL/ES.
-
- \sa size(), texture(), attachment()
-*/
-QGLFramebufferObject::QGLFramebufferObject(const QSize &size, Attachment attachment,
- GLenum target, GLenum internal_format)
- : d_ptr(new QGLFramebufferObjectPrivate)
-{
- Q_D(QGLFramebufferObject);
- if (!internal_format)
-#ifdef QT_OPENGL_ES_2
- internal_format = GL_RGBA;
-#else
- internal_format = QOpenGLContext::currentContext()->isOpenGLES() ? GL_RGBA : GL_RGBA8;
-#endif
- d->init(this, size, attachment, target, internal_format);
-}
-
-/*!
- \fn QGLFramebufferObject::~QGLFramebufferObject()
-
- Destroys the framebuffer object and frees any allocated resources.
-*/
-QGLFramebufferObject::~QGLFramebufferObject()
-{
- Q_D(QGLFramebufferObject);
-
- delete d->engine;
-
- if (d->texture_guard)
- d->texture_guard->free();
- if (d->color_buffer_guard)
- d->color_buffer_guard->free();
- if (d->depth_buffer_guard)
- d->depth_buffer_guard->free();
- if (d->stencil_buffer_guard && d->stencil_buffer_guard != d->depth_buffer_guard)
- d->stencil_buffer_guard->free();
- if (d->fbo_guard)
- d->fbo_guard->free();
-}
-
-/*!
- \fn bool QGLFramebufferObject::isValid() const
-
- Returns \c true if the framebuffer object is valid.
-
- The framebuffer can become invalid if the initialization process
- fails, the user attaches an invalid buffer to the framebuffer
- object, or a non-power of two width/height is specified as the
- texture size if the texture target is \c{GL_TEXTURE_2D}.
- The non-power of two limitation does not apply if the OpenGL version
- is 2.0 or higher, or if the GL_ARB_texture_non_power_of_two extension
- is present.
-
- The framebuffer can also become invalid if the QGLContext that
- the framebuffer was created within is destroyed and there are
- no other shared contexts that can take over ownership of the
- framebuffer.
-*/
-bool QGLFramebufferObject::isValid() const
-{
- Q_D(const QGLFramebufferObject);
- return d->valid && d->fbo_guard && d->fbo_guard->id();
-}
-
-/*!
- \fn bool QGLFramebufferObject::bind()
-
- Switches rendering from the default, windowing system provided
- framebuffer to this framebuffer object.
- Returns \c true upon success, false otherwise.
-
- \sa release()
-*/
-bool QGLFramebufferObject::bind()
-{
- if (!isValid())
- return false;
- Q_D(QGLFramebufferObject);
- QGL_FUNC_CONTEXT;
- if (!ctx)
- return false; // Context no longer exists.
- const QGLContext *current = QGLContext::currentContext();
-#ifdef QT_DEBUG
- if (!current ||
- QGLContextPrivate::contextGroup(current) != QGLContextPrivate::contextGroup(ctx))
- {
- qWarning("QGLFramebufferObject::bind() called from incompatible context");
- }
-#endif
- d->funcs.glBindFramebuffer(GL_FRAMEBUFFER, d->fbo());
- d->valid = d->checkFramebufferStatus();
- if (d->valid && current)
- current->d_ptr->setCurrentFbo(d->fbo());
- return d->valid;
-}
-
-/*!
- \fn bool QGLFramebufferObject::release()
-
- Switches rendering back to the default, windowing system provided
- framebuffer.
- Returns \c true upon success, false otherwise.
-
- \sa bind()
-*/
-bool QGLFramebufferObject::release()
-{
- if (!isValid())
- return false;
- Q_D(QGLFramebufferObject);
- QGL_FUNC_CONTEXT;
- if (!ctx)
- return false; // Context no longer exists.
-
- const QGLContext *current = QGLContext::currentContext();
-
-#ifdef QT_DEBUG
- if (!current ||
- QGLContextPrivate::contextGroup(current) != QGLContextPrivate::contextGroup(ctx))
- {
- qWarning("QGLFramebufferObject::release() called from incompatible context");
- }
-#endif
-
- if (current) {
- current->d_ptr->setCurrentFbo(current->d_ptr->default_fbo);
- d->funcs.glBindFramebuffer(GL_FRAMEBUFFER, current->d_ptr->default_fbo);
- }
-
- return true;
-}
-
-/*!
- \fn GLuint QGLFramebufferObject::texture() const
-
- Returns the texture id for the texture attached as the default
- rendering target in this framebuffer object. This texture id can
- be bound as a normal texture in your own GL code.
-
- If a multisample framebuffer object is used then the value returned
- from this function will be invalid.
-*/
-GLuint QGLFramebufferObject::texture() const
-{
- Q_D(const QGLFramebufferObject);
- return d->texture_guard ? d->texture_guard->id() : 0;
-}
-
-/*!
- \fn QSize QGLFramebufferObject::size() const
-
- Returns the size of the texture attached to this framebuffer
- object.
-*/
-QSize QGLFramebufferObject::size() const
-{
- Q_D(const QGLFramebufferObject);
- return d->size;
-}
-
-/*!
- Returns the format of this framebuffer object.
-*/
-QGLFramebufferObjectFormat QGLFramebufferObject::format() const
-{
- Q_D(const QGLFramebufferObject);
- return d->format;
-}
-
-/*!
- \fn QImage QGLFramebufferObject::toImage() const
-
- Returns the contents of this framebuffer object as a QImage.
-
- The returned image has a format of premultiplied ARGB32 or RGB32. The latter is used
- only when internalTextureFormat() is set to \c GL_RGB.
-
- If the rendering in the framebuffer was not done with premultiplied alpha in mind,
- create a wrapper QImage with a non-premultiplied format. This is necessary before
- performing operations like QImage::save() because otherwise the image data would get
- unpremultiplied, even though it was not premultiplied in the first place. To create
- such a wrapper without performing a copy of the pixel data, do the following:
-
- \code
- QImage fboImage(fbo.toImage());
- QImage image(fboImage.constBits(), fboImage.width(), fboImage.height(), QImage::Format_ARGB32);
- \endcode
-
- On QNX the back buffer is not preserved when a buffer swap occures. So this function
- might return old content.
-*/
-QImage QGLFramebufferObject::toImage() const
-{
- Q_D(const QGLFramebufferObject);
- if (!d->valid)
- return QImage();
-
- // qt_gl_read_frame_buffer doesn't work on a multisample FBO
- if (format().samples() != 0) {
- QGLFramebufferObject temp(size(), QGLFramebufferObjectFormat());
-
- QRect rect(QPoint(0, 0), size());
- blitFramebuffer(&temp, rect, const_cast<QGLFramebufferObject *>(this), rect);
-
- return temp.toImage();
- }
-
- bool wasBound = isBound();
- if (!wasBound)
- const_cast<QGLFramebufferObject *>(this)->bind();
- QImage image = qt_gl_read_frame_buffer(d->size, format().internalTextureFormat() != GL_RGB, true);
- if (!wasBound)
- const_cast<QGLFramebufferObject *>(this)->release();
-
- return image;
-}
-
-Q_GLOBAL_STATIC(QGLEngineThreadStorage<QGL2PaintEngineEx>, qt_buffer_2_engine)
-
-/*! \reimp */
-QPaintEngine *QGLFramebufferObject::paintEngine() const
-{
- Q_D(const QGLFramebufferObject);
- if (d->engine)
- return d->engine;
-
- QPaintEngine *engine = qt_buffer_2_engine()->engine();
- if (engine->isActive() && engine->paintDevice() != this) {
- d->engine = new QGL2PaintEngineEx;
- return d->engine;
- }
- return engine;
-}
-
-/*!
- \fn bool QGLFramebufferObject::bindDefault()
-
- Switches rendering back to the default, windowing system provided
- framebuffer.
- Returns \c true upon success, false otherwise.
-
- \sa bind(), release()
-*/
-bool QGLFramebufferObject::bindDefault()
-{
- QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
-
- if (ctx) {
- QOpenGLFunctions functions(ctx->contextHandle());
- if (!functions.hasOpenGLFeature(QOpenGLFunctions::Framebuffers))
- return false;
-
- ctx->d_ptr->setCurrentFbo(ctx->d_ptr->default_fbo);
- functions.glBindFramebuffer(GL_FRAMEBUFFER, ctx->d_ptr->default_fbo);
-#ifdef QT_DEBUG
- } else {
- qWarning("QGLFramebufferObject::bindDefault() called without current context.");
-#endif
- }
-
- return ctx != 0;
-}
-
-/*!
- \fn bool QGLFramebufferObject::hasOpenGLFramebufferObjects()
-
- Returns \c true if the OpenGL \c{GL_EXT_framebuffer_object} extension
- is present on this system; otherwise returns \c false.
-*/
-bool QGLFramebufferObject::hasOpenGLFramebufferObjects()
-{
- return qgl_hasFeature(QOpenGLFunctions::Framebuffers);
-}
-
-/*!
- \since 4.4
-
- Draws the given texture, \a textureId, to the given target rectangle,
- \a target, in OpenGL model space. The \a textureTarget should be a 2D
- texture target.
-
- The framebuffer object should be bound when calling this function.
-
- Equivalent to the corresponding QGLContext::drawTexture().
-*/
-void QGLFramebufferObject::drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget)
-{
- const_cast<QGLContext *>(QGLContext::currentContext())->drawTexture(target, textureId, textureTarget);
-}
-
-/*!
- \since 4.4
-
- Draws the given texture, \a textureId, at the given \a point in OpenGL
- model space. The \a textureTarget should be a 2D texture target.
-
- The framebuffer object should be bound when calling this function.
-
- Equivalent to the corresponding QGLContext::drawTexture().
-*/
-void QGLFramebufferObject::drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget)
-{
- const_cast<QGLContext *>(QGLContext::currentContext())->drawTexture(point, textureId, textureTarget);
-}
-
-/*! \reimp */
-int QGLFramebufferObject::metric(PaintDeviceMetric metric) const
-{
- Q_D(const QGLFramebufferObject);
-
- float dpmx = qt_defaultDpiX()*100./2.54;
- float dpmy = qt_defaultDpiY()*100./2.54;
- int w = d->size.width();
- int h = d->size.height();
- switch (metric) {
- case PdmWidth:
- return w;
-
- case PdmHeight:
- return h;
-
- case PdmWidthMM:
- return qRound(w * 1000 / dpmx);
-
- case PdmHeightMM:
- return qRound(h * 1000 / dpmy);
-
- case PdmNumColors:
- return 0;
-
- case PdmDepth:
- return 32;//d->depth;
-
- case PdmDpiX:
- return qRound(dpmx * 0.0254);
-
- case PdmDpiY:
- return qRound(dpmy * 0.0254);
-
- case PdmPhysicalDpiX:
- return qRound(dpmx * 0.0254);
-
- case PdmPhysicalDpiY:
- return qRound(dpmy * 0.0254);
-
- case QPaintDevice::PdmDevicePixelRatio:
- return 1;
-
- case QPaintDevice::PdmDevicePixelRatioScaled:
- return 1 * QPaintDevice::devicePixelRatioFScale();
-
- default:
- qWarning("QGLFramebufferObject::metric(), Unhandled metric type: %d.\n", metric);
- break;
- }
- return 0;
-}
-
-/*!
- \fn GLuint QGLFramebufferObject::handle() const
-
- Returns the GL framebuffer object handle for this framebuffer
- object (returned by the \c{glGenFrameBuffersEXT()} function). This
- handle can be used to attach new images or buffers to the
- framebuffer. The user is responsible for cleaning up and
- destroying these objects.
-*/
-GLuint QGLFramebufferObject::handle() const
-{
- Q_D(const QGLFramebufferObject);
- return d->fbo();
-}
-
-/*! \fn int QGLFramebufferObject::devType() const
- \internal
-*/
-
-
-/*!
- Returns the status of the depth and stencil buffers attached to
- this framebuffer object.
-*/
-
-QGLFramebufferObject::Attachment QGLFramebufferObject::attachment() const
-{
- Q_D(const QGLFramebufferObject);
- if (d->valid)
- return d->fbo_attachment;
- return NoAttachment;
-}
-
-/*!
- \since 4.5
-
- Returns \c true if the framebuffer object is currently bound to a context,
- otherwise false is returned.
-*/
-
-bool QGLFramebufferObject::isBound() const
-{
- Q_D(const QGLFramebufferObject);
- const QGLContext *current = QGLContext::currentContext();
- if (current) {
- current->d_ptr->refreshCurrentFbo();
- return current->d_ptr->current_fbo == d->fbo();
- }
-
- return false;
-}
-
-/*!
- \fn bool QGLFramebufferObject::hasOpenGLFramebufferBlit()
-
- \since 4.6
-
- Returns \c true if the OpenGL \c{GL_EXT_framebuffer_blit} extension
- is present on this system; otherwise returns \c false.
-
- \sa blitFramebuffer()
-*/
-bool QGLFramebufferObject::hasOpenGLFramebufferBlit()
-{
- return QOpenGLExtensions(QOpenGLContext::currentContext()).hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit);
-}
-
-/*!
- \since 4.6
-
- Blits from the \a sourceRect rectangle in the \a source framebuffer
- object to the \a targetRect rectangle in the \a target framebuffer object.
-
- If \a source or \a target is \nullptr, the default framebuffer will be used
- instead of a framebuffer object as source or target respectively.
-
- The \a buffers parameter should be a mask consisting of any combination of
- \c GL_COLOR_BUFFER_BIT, \c GL_DEPTH_BUFFER_BIT, and
- \c GL_STENCIL_BUFFER_BIT. Any buffer type that is not present both
- in the source and target buffers is ignored.
-
- The \a sourceRect and \a targetRect rectangles may have different sizes;
- in this case \a buffers should not contain \c GL_DEPTH_BUFFER_BIT or
- \c GL_STENCIL_BUFFER_BIT. The \a filter parameter should be set to
- \c GL_LINEAR or \c GL_NEAREST, and specifies whether linear or nearest
- interpolation should be used when scaling is performed.
-
- If \a source equals \a target a copy is performed within the same buffer.
- Results are undefined if the source and target rectangles overlap and
- have different sizes. The sizes must also be the same if any of the
- framebuffer objects are multisample framebuffers.
-
- Note that the scissor test will restrict the blit area if enabled.
-
- This function will have no effect unless hasOpenGLFramebufferBlit() returns
- true.
-
- \sa hasOpenGLFramebufferBlit()
-*/
-void QGLFramebufferObject::blitFramebuffer(QGLFramebufferObject *target, const QRect &targetRect,
- QGLFramebufferObject *source, const QRect &sourceRect,
- GLbitfield buffers,
- GLenum filter)
-{
- const QGLContext *ctx = QGLContext::currentContext();
- if (!ctx || !ctx->contextHandle())
- return;
-
- QOpenGLExtensions functions(ctx->contextHandle());
- if (!functions.hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit))
- return;
-
- QSurface *surface = ctx->contextHandle()->surface();
-
- const int height = static_cast<QWindow *>(surface)->height();
-
- const int sh = source ? source->height() : height;
- const int th = target ? target->height() : height;
-
- const int sx0 = sourceRect.left();
- const int sx1 = sourceRect.left() + sourceRect.width();
- const int sy0 = sh - (sourceRect.top() + sourceRect.height());
- const int sy1 = sh - sourceRect.top();
-
- const int tx0 = targetRect.left();
- const int tx1 = targetRect.left() + targetRect.width();
- const int ty0 = th - (targetRect.top() + targetRect.height());
- const int ty1 = th - targetRect.top();
-
- ctx->d_ptr->refreshCurrentFbo();
-
- functions.glBindFramebuffer(GL_READ_FRAMEBUFFER, source ? source->handle() : 0);
- functions.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, target ? target->handle() : 0);
-
- functions.glBlitFramebuffer(sx0, sy0, sx1, sy1,
- tx0, ty0, tx1, ty1,
- buffers, filter);
-
- functions.glBindFramebuffer(GL_FRAMEBUFFER, ctx->d_ptr->current_fbo);
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/qglframebufferobject.h b/src/opengl/qglframebufferobject.h
deleted file mode 100644
index c88063cbb5..0000000000
--- a/src/opengl/qglframebufferobject.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLFRAMEBUFFEROBJECT_H
-#define QGLFRAMEBUFFEROBJECT_H
-
-#include <QtOpenGL/qgl.h>
-#include <QtGui/qpaintdevice.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QGLFramebufferObjectPrivate;
-class QGLFramebufferObjectFormat;
-
-class Q_OPENGL_EXPORT QGLFramebufferObject : public QPaintDevice
-{
- Q_DECLARE_PRIVATE(QGLFramebufferObject)
-public:
- enum Attachment {
- NoAttachment,
- CombinedDepthStencil,
- Depth
- };
-
- QGLFramebufferObject(const QSize &size, GLenum target = GL_TEXTURE_2D);
- QGLFramebufferObject(int width, int height, GLenum target = GL_TEXTURE_2D);
-
- QGLFramebufferObject(const QSize &size, Attachment attachment,
- GLenum target = GL_TEXTURE_2D, GLenum internal_format = 0);
- QGLFramebufferObject(int width, int height, Attachment attachment,
- GLenum target = GL_TEXTURE_2D, GLenum internal_format = 0);
-
- QGLFramebufferObject(const QSize &size, const QGLFramebufferObjectFormat &format);
- QGLFramebufferObject(int width, int height, const QGLFramebufferObjectFormat &format);
-
- virtual ~QGLFramebufferObject();
-
- QGLFramebufferObjectFormat format() const;
-
- bool isValid() const;
- bool isBound() const;
- bool bind();
- bool release();
-
- GLuint texture() const;
- QSize size() const;
- QImage toImage() const;
- Attachment attachment() const;
-
- QPaintEngine *paintEngine() const override;
- GLuint handle() const;
-
- static bool bindDefault();
-
- static bool hasOpenGLFramebufferObjects();
-
- void drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
- void drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
-
- static bool hasOpenGLFramebufferBlit();
- static void blitFramebuffer(QGLFramebufferObject *target, const QRect &targetRect,
- QGLFramebufferObject *source, const QRect &sourceRect,
- GLbitfield buffers = GL_COLOR_BUFFER_BIT,
- GLenum filter = GL_NEAREST);
-
-protected:
- int metric(PaintDeviceMetric metric) const override;
- int devType() const override { return QInternal::FramebufferObject; }
-
-private:
- Q_DISABLE_COPY(QGLFramebufferObject)
- QScopedPointer<QGLFramebufferObjectPrivate> d_ptr;
- friend class QGLPaintDevice;
- friend class QGLFBOGLPaintDevice;
-};
-
-class QGLFramebufferObjectFormatPrivate;
-class Q_OPENGL_EXPORT QGLFramebufferObjectFormat
-{
-public:
- QGLFramebufferObjectFormat();
- QGLFramebufferObjectFormat(const QGLFramebufferObjectFormat &other);
- QGLFramebufferObjectFormat &operator=(const QGLFramebufferObjectFormat &other);
- ~QGLFramebufferObjectFormat();
-
- void setSamples(int samples);
- int samples() const;
-
- void setMipmap(bool enabled);
- bool mipmap() const;
-
- void setAttachment(QGLFramebufferObject::Attachment attachment);
- QGLFramebufferObject::Attachment attachment() const;
-
- void setTextureTarget(GLenum target);
- GLenum textureTarget() const;
-
- void setInternalTextureFormat(GLenum internalTextureFormat);
- GLenum internalTextureFormat() const;
-
- bool operator==(const QGLFramebufferObjectFormat& other) const;
- bool operator!=(const QGLFramebufferObjectFormat& other) const;
-
-private:
- QGLFramebufferObjectFormatPrivate *d;
-
- void detach();
-};
-
-QT_END_NAMESPACE
-
-#endif // QGLFRAMEBUFFEROBJECT_H
diff --git a/src/opengl/qglframebufferobject_p.h b/src/opengl/qglframebufferobject_p.h
deleted file mode 100644
index 9d536527c3..0000000000
--- a/src/opengl/qglframebufferobject_p.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLFRAMEBUFFEROBJECT_P_H
-#define QGLFRAMEBUFFEROBJECT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <qglframebufferobject.h>
-#include <private/qglpaintdevice_p.h>
-#include <private/qgl_p.h>
-#include <private/qopenglextensions_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGLFramebufferObjectFormatPrivate
-{
-public:
- QGLFramebufferObjectFormatPrivate()
- : ref(1),
- samples(0),
- attachment(QGLFramebufferObject::NoAttachment),
- target(GL_TEXTURE_2D),
- mipmap(false)
- {
-#ifndef QT_OPENGL_ES_2
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- const bool isES = ctx ? ctx->isOpenGLES() : QOpenGLContext::openGLModuleType() != QOpenGLContext::LibGL;
- internal_format = isES ? GL_RGBA : GL_RGBA8;
-#else
- internal_format = GL_RGBA;
-#endif
- }
- QGLFramebufferObjectFormatPrivate
- (const QGLFramebufferObjectFormatPrivate *other)
- : ref(1),
- samples(other->samples),
- attachment(other->attachment),
- target(other->target),
- internal_format(other->internal_format),
- mipmap(other->mipmap)
- {
- }
- bool equals(const QGLFramebufferObjectFormatPrivate *other)
- {
- return samples == other->samples &&
- attachment == other->attachment &&
- target == other->target &&
- internal_format == other->internal_format &&
- mipmap == other->mipmap;
- }
-
- QAtomicInt ref;
- int samples;
- QGLFramebufferObject::Attachment attachment;
- GLenum target;
- GLenum internal_format;
- uint mipmap : 1;
-};
-
-class QGLFBOGLPaintDevice : public QGLPaintDevice
-{
-public:
- virtual QPaintEngine* paintEngine() const override {return fbo->paintEngine();}
- virtual QSize size() const override {return fbo->size();}
- virtual QGLContext* context() const override;
- virtual QGLFormat format() const override {return fboFormat;}
- virtual bool alphaRequested() const override { return reqAlpha; }
-
- void setFBO(QGLFramebufferObject* f,
- QGLFramebufferObject::Attachment attachment);
-
-private:
- QGLFramebufferObject* fbo;
- QGLFormat fboFormat;
- bool reqAlpha;
-};
-
-class QGLFramebufferObjectPrivate
-{
-public:
- QGLFramebufferObjectPrivate() : fbo_guard(nullptr), texture_guard(nullptr), depth_buffer_guard(nullptr)
- , stencil_buffer_guard(nullptr), color_buffer_guard(nullptr)
- , valid(false), engine(nullptr) {}
- ~QGLFramebufferObjectPrivate() {}
-
- void init(QGLFramebufferObject *q, const QSize& sz,
- QGLFramebufferObject::Attachment attachment,
- GLenum internal_format, GLenum texture_target,
- GLint samples = 0, bool mipmap = false);
- bool checkFramebufferStatus() const;
- QGLSharedResourceGuardBase *fbo_guard;
- QGLSharedResourceGuardBase *texture_guard;
- QGLSharedResourceGuardBase *depth_buffer_guard;
- QGLSharedResourceGuardBase *stencil_buffer_guard;
- QGLSharedResourceGuardBase *color_buffer_guard;
- GLenum target;
- QSize size;
- QGLFramebufferObjectFormat format;
- uint valid : 1;
- QGLFramebufferObject::Attachment fbo_attachment;
- mutable QPaintEngine *engine;
- QGLFBOGLPaintDevice glDevice;
- QOpenGLExtensions funcs;
-
- inline GLuint fbo() const { return fbo_guard ? fbo_guard->id() : 0; }
-};
-
-
-QT_END_NAMESPACE
-
-#endif // QGLFRAMEBUFFEROBJECT_P_H
diff --git a/src/opengl/qglfunctions.cpp b/src/opengl/qglfunctions.cpp
deleted file mode 100644
index b20311bec4..0000000000
--- a/src/opengl/qglfunctions.cpp
+++ /dev/null
@@ -1,1330 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qglfunctions.h"
-#include "qgl_p.h"
-#include "QtGui/private/qopenglcontext_p.h"
-#include <private/qopengl_p.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QGLFunctions
- \inmodule QtOpenGL
- \brief The QGLFunctions class provides cross-platform access to the OpenGL ES 2.0 API.
- \since 4.8
- \obsolete
- \ingroup painting-3D
-
- OpenGL ES 2.0 defines a subset of the OpenGL specification that is
- common across many desktop and embedded OpenGL implementations.
- However, it can be difficult to use the functions from that subset
- because they need to be resolved manually on desktop systems.
-
- QGLFunctions provides a guaranteed API that is available on all
- OpenGL systems and takes care of function resolution on systems
- that need it. The recommended way to use QGLFunctions is by
- direct inheritance:
-
- \snippet code/src_opengl_qglfunctions.cpp 0
-
- The \c{paintGL()} function can then use any of the OpenGL ES 2.0
- functions without explicit resolution, such as glActiveTexture()
- in the following example:
-
- \snippet code/src_opengl_qglfunctions.cpp 1
-
- QGLFunctions can also be used directly for ad-hoc invocation
- of OpenGL ES 2.0 functions on all platforms:
-
- \snippet code/src_opengl_qglfunctions.cpp 2
-
- QGLFunctions provides wrappers for all OpenGL ES 2.0 functions,
- except those like \c{glDrawArrays()}, \c{glViewport()}, and
- \c{glBindTexture()} that don't have portability issues.
-
- Including the header for QGLFunctions will also define all of
- the OpenGL ES 2.0 macro constants that are not already defined by
- the system's OpenGL headers, such as \c{GL_TEXTURE1} above.
-
- The hasOpenGLFeature() and openGLFeatures() functions can be used
- to determine if the OpenGL implementation has a major OpenGL ES 2.0
- feature. For example, the following checks if non power of two
- textures are available:
-
- \snippet code/src_opengl_qglfunctions.cpp 3
-
- \note This class has been deprecated in favor of QOpenGLFunctions.
-*/
-
-/*!
- \enum QGLFunctions::OpenGLFeature
- This enum defines OpenGL ES 2.0 features that may be optional
- on other platforms.
-
- \value Multitexture glActiveTexture() function is available.
- \value Shaders Shader functions are available.
- \value Buffers Vertex and index buffer functions are available.
- \value Framebuffers Framebuffer object functions are available.
- \value BlendColor glBlendColor() is available.
- \value BlendEquation glBlendEquation() is available.
- \value BlendEquationSeparate glBlendEquationSeparate() is available.
- \value BlendFuncSeparate glBlendFuncSeparate() is available.
- \value BlendSubtract Blend subtract mode is available.
- \value CompressedTextures Compressed texture functions are available.
- \value Multisample glSampleCoverage() function is available.
- \value StencilSeparate Separate stencil functions are available.
- \value NPOTTextures Non power of two textures are available.
-*/
-
-// Hidden private fields for additional extension data.
-struct QGLFunctionsPrivateEx : public QGLFunctionsPrivate, public QOpenGLSharedResource
-{
- QGLFunctionsPrivateEx(QOpenGLContext *context)
- : QGLFunctionsPrivate(QGLContext::fromOpenGLContext(context))
- , QOpenGLSharedResource(context->shareGroup())
- , m_features(-1)
- {
- funcs = new QOpenGLFunctions(context);
- funcs->initializeOpenGLFunctions();
- }
-
- ~QGLFunctionsPrivateEx()
- {
- delete funcs;
- }
-
- void invalidateResource() override
- {
- m_features = -1;
- }
-
- void freeResource(QOpenGLContext *) override
- {
- // no gl resources to free
- }
-
- int m_features;
-};
-
-Q_GLOBAL_STATIC(QOpenGLMultiGroupSharedResource, qt_gl_functions_resource)
-
-static QGLFunctionsPrivateEx *qt_gl_functions(const QGLContext *context = 0)
-{
- if (!context)
- context = QGLContext::currentContext();
- Q_ASSERT(context);
- QGLFunctionsPrivateEx *funcs =
- reinterpret_cast<QGLFunctionsPrivateEx *>
- (qt_gl_functions_resource()->value<QGLFunctionsPrivateEx>(context->contextHandle()));
- return funcs;
-}
-
-/*!
- Constructs a default function resolver. The resolver cannot
- be used until initializeGLFunctions() is called to specify
- the context.
-
- \sa initializeGLFunctions()
-*/
-QGLFunctions::QGLFunctions()
- : d_ptr(0)
-{
-}
-
-/*!
- Constructs a function resolver for \a context. If \a context
- is \nullptr, then the resolver will be created for the current
- QGLContext.
-
- An object constructed in this way can only be used with \a context
- and other contexts that share with it. Use initializeGLFunctions()
- to change the object's context association.
-
- \sa initializeGLFunctions()
-*/
-QGLFunctions::QGLFunctions(const QGLContext *context)
- : d_ptr(qt_gl_functions(context))
-{
-}
-
-/*!
- \fn QGLFunctions::~QGLFunctions()
-
- Destroys this function resolver.
-*/
-
-static int qt_gl_resolve_features()
-{
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- if (ctx->isOpenGLES()) {
- // OpenGL ES 2
- int features = QGLFunctions::Multitexture |
- QGLFunctions::Shaders |
- QGLFunctions::Buffers |
- QGLFunctions::Framebuffers |
- QGLFunctions::BlendColor |
- QGLFunctions::BlendEquation |
- QGLFunctions::BlendEquationSeparate |
- QGLFunctions::BlendFuncSeparate |
- QGLFunctions::BlendSubtract |
- QGLFunctions::CompressedTextures |
- QGLFunctions::Multisample |
- QGLFunctions::StencilSeparate;
- QOpenGLExtensionMatcher extensions;
- if (extensions.match("GL_OES_texture_npot"))
- features |= QGLFunctions::NPOTTextures;
- if (extensions.match("GL_IMG_texture_npot"))
- features |= QGLFunctions::NPOTTextures;
- return features;
- } else {
- // OpenGL
- int features = 0;
- QGLFormat::OpenGLVersionFlags versions = QGLFormat::openGLVersionFlags();
- QOpenGLExtensionMatcher extensions;
-
- // Recognize features by extension name.
- if (extensions.match("GL_ARB_multitexture"))
- features |= QGLFunctions::Multitexture;
- if (extensions.match("GL_ARB_shader_objects"))
- features |= QGLFunctions::Shaders;
- if (extensions.match("GL_EXT_framebuffer_object") ||
- extensions.match("GL_ARB_framebuffer_object"))
- features |= QGLFunctions::Framebuffers;
- if (extensions.match("GL_EXT_blend_color"))
- features |= QGLFunctions::BlendColor;
- if (extensions.match("GL_EXT_blend_equation_separate"))
- features |= QGLFunctions::BlendEquationSeparate;
- if (extensions.match("GL_EXT_blend_func_separate"))
- features |= QGLFunctions::BlendFuncSeparate;
- if (extensions.match("GL_EXT_blend_subtract"))
- features |= QGLFunctions::BlendSubtract;
- if (extensions.match("GL_ARB_texture_compression"))
- features |= QGLFunctions::CompressedTextures;
- if (extensions.match("GL_ARB_multisample"))
- features |= QGLFunctions::Multisample;
- if (extensions.match("GL_ARB_texture_non_power_of_two"))
- features |= QGLFunctions::NPOTTextures;
-
- // Recognize features by minimum OpenGL version.
- if (versions & QGLFormat::OpenGL_Version_1_2) {
- features |= QGLFunctions::BlendColor |
- QGLFunctions::BlendEquation;
- }
- if (versions & QGLFormat::OpenGL_Version_1_3) {
- features |= QGLFunctions::Multitexture |
- QGLFunctions::CompressedTextures |
- QGLFunctions::Multisample;
- }
- if (versions & QGLFormat::OpenGL_Version_1_4)
- features |= QGLFunctions::BlendFuncSeparate;
- if (versions & QGLFormat::OpenGL_Version_1_5)
- features |= QGLFunctions::Buffers;
- if (versions & QGLFormat::OpenGL_Version_2_0) {
- features |= QGLFunctions::Shaders |
- QGLFunctions::StencilSeparate |
- QGLFunctions::BlendEquationSeparate |
- QGLFunctions::NPOTTextures;
- }
- return features;
- }
-}
-
-/*!
- Returns the set of features that are present on this system's
- OpenGL implementation.
-
- It is assumed that the QGLContext associated with this function
- resolver is current.
-
- \sa hasOpenGLFeature()
-*/
-QGLFunctions::OpenGLFeatures QGLFunctions::openGLFeatures() const
-{
- QGLFunctionsPrivateEx *d = static_cast<QGLFunctionsPrivateEx *>(d_ptr);
- if (!d)
- return { };
- if (d->m_features == -1)
- d->m_features = qt_gl_resolve_features();
- return QGLFunctions::OpenGLFeatures(d->m_features);
-}
-
-/*!
- Returns \c true if \a feature is present on this system's OpenGL
- implementation; false otherwise.
-
- It is assumed that the QGLContext associated with this function
- resolver is current.
-
- \sa openGLFeatures()
-*/
-bool QGLFunctions::hasOpenGLFeature(QGLFunctions::OpenGLFeature feature) const
-{
- QGLFunctionsPrivateEx *d = static_cast<QGLFunctionsPrivateEx *>(d_ptr);
- if (!d)
- return false;
- if (d->m_features == -1)
- d->m_features = qt_gl_resolve_features();
- return (d->m_features & int(feature)) != 0;
-}
-
-/*!
- Initializes GL function resolution for \a context. If \a context
- is \nullptr, then the current QGLContext will be used.
-
- After calling this function, the QGLFunctions object can only be
- used with \a context and other contexts that share with it.
- Call initializeGLFunctions() again to change the object's context
- association.
-*/
-void QGLFunctions::initializeGLFunctions(const QGLContext *context)
-{
- d_ptr = qt_gl_functions(context);
-}
-
-/*!
- \fn void QGLFunctions::glActiveTexture(GLenum texture)
-
- Convenience function that calls glActiveTexture(\a texture).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glActiveTexture.xml}{glActiveTexture()}.
-*/
-
-/*!
- \fn void QGLFunctions::glAttachShader(GLuint program, GLuint shader)
-
- Convenience function that calls glAttachShader(\a program, \a shader).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glAttachShader.xml}{glAttachShader()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glBindAttribLocation(GLuint program, GLuint index, const char* name)
-
- Convenience function that calls glBindAttribLocation(\a program, \a index, \a name).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glBindAttribLocation.xml}{glBindAttribLocation()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glBindBuffer(GLenum target, GLuint buffer)
-
- Convenience function that calls glBindBuffer(\a target, \a buffer).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glBindBuffer.xml}{glBindBuffer()}.
-*/
-
-/*!
- \fn void QGLFunctions::glBindFramebuffer(GLenum target, GLuint framebuffer)
-
- Convenience function that calls glBindFramebuffer(\a target, \a framebuffer).
-
- Note that Qt will translate a \a framebuffer argument of 0 to the currently
- bound QOpenGLContext's defaultFramebufferObject().
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glBindFramebuffer.xml}{glBindFramebuffer()}.
-*/
-
-/*!
- \fn void QGLFunctions::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-
- Convenience function that calls glBindRenderbuffer(\a target, \a renderbuffer).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glBindRenderbuffer.xml}{glBindRenderbuffer()}.
-*/
-
-/*!
- \fn void QGLFunctions::glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
-
- Convenience function that calls glBlendColor(\a red, \a green, \a blue, \a alpha).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glBlendColor.xml}{glBlendColor()}.
-*/
-
-/*!
- \fn void QGLFunctions::glBlendEquation(GLenum mode)
-
- Convenience function that calls glBlendEquation(\a mode).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glBlendEquation.xml}{glBlendEquation()}.
-*/
-
-/*!
- \fn void QGLFunctions::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-
- Convenience function that calls glBlendEquationSeparate(\a modeRGB, \a modeAlpha).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glBlendEquationSeparate.xml}{glBlendEquationSeparate()}.
-*/
-
-/*!
- \fn void QGLFunctions::glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-
- Convenience function that calls glBlendFuncSeparate(\a srcRGB, \a dstRGB, \a srcAlpha, \a dstAlpha).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glBlendFuncSeparate.xml}{glBlendFuncSeparate()}.
-*/
-
-/*!
- \fn void QGLFunctions::glBufferData(GLenum target, qopengl_GLsizeiptr size, const void* data, GLenum usage)
-
- Convenience function that calls glBufferData(\a target, \a size, \a data, \a usage).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glBufferData.xml}{glBufferData()}.
-*/
-
-/*!
- \fn void QGLFunctions::glBufferSubData(GLenum target, qopengl_GLintptr offset, qopengl_GLsizeiptr size, const void* data)
-
- Convenience function that calls glBufferSubData(\a target, \a offset, \a size, \a data).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glBufferSubData.xml}{glBufferSubData()}.
-*/
-
-/*!
- \fn GLenum QGLFunctions::glCheckFramebufferStatus(GLenum target)
-
- Convenience function that calls glCheckFramebufferStatus(\a target).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glCheckFramebufferStatus.xml}{glCheckFramebufferStatus()}.
-*/
-
-/*!
- \fn void QGLFunctions::glClearDepthf(GLclampf depth)
-
- Convenience function that calls glClearDepth(\a depth) on
- desktop OpenGL systems and glClearDepthf(\a depth) on
- embedded OpenGL ES systems.
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glClearDepthf.xml}{glClearDepthf()}.
-*/
-
-/*!
- \fn void QGLFunctions::glCompileShader(GLuint shader)
-
- Convenience function that calls glCompileShader(\a shader).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glCompileShader.xml}{glCompileShader()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
-
- Convenience function that calls glCompressedTexImage2D(\a target, \a level, \a internalformat, \a width, \a height, \a border, \a imageSize, \a data).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glCompressedTexImage2D.xml}{glCompressedTexImage2D()}.
-*/
-
-/*!
- \fn void QGLFunctions::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
-
- Convenience function that calls glCompressedTexSubImage2D(\a target, \a level, \a xoffset, \a yoffset, \a width, \a height, \a format, \a imageSize, \a data).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glCompressedTexSubImage2D.xml}{glCompressedTexSubImage2D()}.
-*/
-
-/*!
- \fn GLuint QGLFunctions::glCreateProgram()
-
- Convenience function that calls glCreateProgram().
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glCreateProgram.xml}{glCreateProgram()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn GLuint QGLFunctions::glCreateShader(GLenum type)
-
- Convenience function that calls glCreateShader(\a type).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glCreateShader.xml}{glCreateShader()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glDeleteBuffers(GLsizei n, const GLuint* buffers)
-
- Convenience function that calls glDeleteBuffers(\a n, \a buffers).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glDeleteBuffers.xml}{glDeleteBuffers()}.
-*/
-
-/*!
- \fn void QGLFunctions::glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
-
- Convenience function that calls glDeleteFramebuffers(\a n, \a framebuffers).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glDeleteFramebuffers.xml}{glDeleteFramebuffers()}.
-*/
-
-/*!
- \fn void QGLFunctions::glDeleteProgram(GLuint program)
-
- Convenience function that calls glDeleteProgram(\a program).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glDeleteProgram.xml}{glDeleteProgram()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
-
- Convenience function that calls glDeleteRenderbuffers(\a n, \a renderbuffers).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glDeleteRenderbuffers.xml}{glDeleteRenderbuffers()}.
-*/
-
-/*!
- \fn void QGLFunctions::glDeleteShader(GLuint shader)
-
- Convenience function that calls glDeleteShader(\a shader).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glDeleteShader.xml}{glDeleteShader()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glDepthRangef(GLclampf zNear, GLclampf zFar)
-
- Convenience function that calls glDepthRange(\a zNear, \a zFar) on
- desktop OpenGL systems and glDepthRangef(\a zNear, \a zFar) on
- embedded OpenGL ES systems.
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glDepthRangef.xml}{glDepthRangef()}.
-*/
-
-/*!
- \fn void QGLFunctions::glDetachShader(GLuint program, GLuint shader)
-
- Convenience function that calls glDetachShader(\a program, \a shader).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glDetachShader.xml}{glDetachShader()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glDisableVertexAttribArray(GLuint index)
-
- Convenience function that calls glDisableVertexAttribArray(\a index).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glDisableVertexAttribArray.xml}{glDisableVertexAttribArray()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glEnableVertexAttribArray(GLuint index)
-
- Convenience function that calls glEnableVertexAttribArray(\a index).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glEnableVertexAttribArray.xml}{glEnableVertexAttribArray()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-
- Convenience function that calls glFramebufferRenderbuffer(\a target, \a attachment, \a renderbuffertarget, \a renderbuffer).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glFramebufferRenderbuffer.xml}{glFramebufferRenderbuffer()}.
-*/
-
-/*!
- \fn void QGLFunctions::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-
- Convenience function that calls glFramebufferTexture2D(\a target, \a attachment, \a textarget, \a texture, \a level).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glFramebufferTexture2D.xml}{glFramebufferTexture2D()}.
-*/
-
-/*!
- \fn void QGLFunctions::glGenBuffers(GLsizei n, GLuint* buffers)
-
- Convenience function that calls glGenBuffers(\a n, \a buffers).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGenBuffers.xml}{glGenBuffers()}.
-*/
-
-/*!
- \fn void QGLFunctions::glGenerateMipmap(GLenum target)
-
- Convenience function that calls glGenerateMipmap(\a target).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGenerateMipmap.xml}{glGenerateMipmap()}.
-*/
-
-/*!
- \fn void QGLFunctions::glGenFramebuffers(GLsizei n, GLuint* framebuffers)
-
- Convenience function that calls glGenFramebuffers(\a n, \a framebuffers).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGenFramebuffers.xml}{glGenFramebuffers()}.
-*/
-
-/*!
- \fn void QGLFunctions::glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
-
- Convenience function that calls glGenRenderbuffers(\a n, \a renderbuffers).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGenRenderbuffers.xml}{glGenRenderbuffers()}.
-*/
-
-/*!
- \fn void QGLFunctions::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
-
- Convenience function that calls glGetActiveAttrib(\a program, \a index, \a bufsize, \a length, \a size, \a type, \a name).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetActiveAttrib.xml}{glGetActiveAttrib()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
-
- Convenience function that calls glGetActiveUniform(\a program, \a index, \a bufsize, \a length, \a size, \a type, \a name).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetActiveUniform.xml}{glGetActiveUniform()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
-
- Convenience function that calls glGetAttachedShaders(\a program, \a maxcount, \a count, \a shaders).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetAttachedShaders.xml}{glGetAttachedShaders()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn int QGLFunctions::glGetAttribLocation(GLuint program, const char* name)
-
- Convenience function that calls glGetAttribLocation(\a program, \a name).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetAttribLocation.xml}{glGetAttribLocation()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
-
- Convenience function that calls glGetBufferParameteriv(\a target, \a pname, \a params).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetBufferParameteriv.xml}{glGetBufferParameteriv()}.
-*/
-
-/*!
- \fn void QGLFunctions::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
-
- Convenience function that calls glGetFramebufferAttachmentParameteriv(\a target, \a attachment, \a pname, \a params).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetFramebufferAttachmentParameteriv.xml}{glGetFramebufferAttachmentParameteriv()}.
-*/
-
-/*!
- \fn void QGLFunctions::glGetProgramiv(GLuint program, GLenum pname, GLint* params)
-
- Convenience function that calls glGetProgramiv(\a program, \a pname, \a params).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetProgramiv.xml}{glGetProgramiv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
-
- Convenience function that calls glGetProgramInfoLog(\a program, \a bufsize, \a length, \a infolog).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetProgramInfoLog.xml}{glGetProgramInfoLog()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
-
- Convenience function that calls glGetRenderbufferParameteriv(\a target, \a pname, \a params).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetRenderbufferParameteriv.xml}{glGetRenderbufferParameteriv()}.
-*/
-
-/*!
- \fn void QGLFunctions::glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
-
- Convenience function that calls glGetShaderiv(\a shader, \a pname, \a params).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetShaderiv.xml}{glGetShaderiv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
-
- Convenience function that calls glGetShaderInfoLog(\a shader, \a bufsize, \a length, \a infolog).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetShaderInfoLog.xml}{glGetShaderInfoLog()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
-
- Convenience function that calls glGetShaderPrecisionFormat(\a shadertype, \a precisiontype, \a range, \a precision).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetShaderPrecisionFormat.xml}{glGetShaderPrecisionFormat()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
-
- Convenience function that calls glGetShaderSource(\a shader, \a bufsize, \a length, \a source).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetShaderSource.xml}{glGetShaderSource()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetUniformfv(GLuint program, GLint location, GLfloat* params)
-
- Convenience function that calls glGetUniformfv(\a program, \a location, \a params).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetUniformfv.xml}{glGetUniformfv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetUniformiv(GLuint program, GLint location, GLint* params)
-
- Convenience function that calls glGetUniformiv(\a program, \a location, \a params).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetUniformiv.xml}{glGetUniformiv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn int QGLFunctions::glGetUniformLocation(GLuint program, const char* name)
-
- Convenience function that calls glGetUniformLocation(\a program, \a name).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetUniformLocation.xml}{glGetUniformLocation()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
-
- Convenience function that calls glGetVertexAttribfv(\a index, \a pname, \a params).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetVertexAttribfv.xml}{glGetVertexAttribfv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
-
- Convenience function that calls glGetVertexAttribiv(\a index, \a pname, \a params).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetVertexAttribiv.xml}{glGetVertexAttribiv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
-
- Convenience function that calls glGetVertexAttribPointerv(\a index, \a pname, \a pointer).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glGetVertexAttribPointerv.xml}{glGetVertexAttribPointerv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn GLboolean QGLFunctions::glIsBuffer(GLuint buffer)
-
- Convenience function that calls glIsBuffer(\a buffer).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glIsBuffer.xml}{glIsBuffer()}.
-*/
-
-/*!
- \fn GLboolean QGLFunctions::glIsFramebuffer(GLuint framebuffer)
-
- Convenience function that calls glIsFramebuffer(\a framebuffer).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glIsFramebuffer.xml}{glIsFramebuffer()}.
-*/
-
-/*!
- \fn GLboolean QGLFunctions::glIsProgram(GLuint program)
-
- Convenience function that calls glIsProgram(\a program).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glIsProgram.xml}{glIsProgram()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn GLboolean QGLFunctions::glIsRenderbuffer(GLuint renderbuffer)
-
- Convenience function that calls glIsRenderbuffer(\a renderbuffer).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glIsRenderbuffer.xml}{glIsRenderbuffer()}.
-*/
-
-/*!
- \fn GLboolean QGLFunctions::glIsShader(GLuint shader)
-
- Convenience function that calls glIsShader(\a shader).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glIsShader.xml}{glIsShader()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glLinkProgram(GLuint program)
-
- Convenience function that calls glLinkProgram(\a program).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glLinkProgram.xml}{glLinkProgram()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glReleaseShaderCompiler()
-
- Convenience function that calls glReleaseShaderCompiler().
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glReleaseShaderCompiler.xml}{glReleaseShaderCompiler()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-
- Convenience function that calls glRenderbufferStorage(\a target, \a internalformat, \a width, \a height).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glRenderbufferStorage.xml}{glRenderbufferStorage()}.
-*/
-
-/*!
- \fn void QGLFunctions::glSampleCoverage(GLclampf value, GLboolean invert)
-
- Convenience function that calls glSampleCoverage(\a value, \a invert).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glSampleCoverage.xml}{glSampleCoverage()}.
-*/
-
-/*!
- \fn void QGLFunctions::glShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLint length)
-
- Convenience function that calls glShaderBinary(\a n, \a shaders, \a binaryformat, \a binary, \a length).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glShaderBinary.xml}{glShaderBinary()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
-
- Convenience function that calls glShaderSource(\a shader, \a count, \a string, \a length).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glShaderSource.xml}{glShaderSource()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-
- Convenience function that calls glStencilFuncSeparate(\a face, \a func, \a ref, \a mask).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glStencilFuncSeparate.xml}{glStencilFuncSeparate()}.
-*/
-
-/*!
- \fn void QGLFunctions::glStencilMaskSeparate(GLenum face, GLuint mask)
-
- Convenience function that calls glStencilMaskSeparate(\a face, \a mask).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glStencilMaskSeparate.xml}{glStencilMaskSeparate()}.
-*/
-
-/*!
- \fn void QGLFunctions::glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
-
- Convenience function that calls glStencilOpSeparate(\a face, \a fail, \a zfail, \a zpass).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glStencilOpSeparate.xml}{glStencilOpSeparate()}.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform1f(GLint location, GLfloat x)
-
- Convenience function that calls glUniform1f(\a location, \a x).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform1f.xml}{glUniform1f()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
-
- Convenience function that calls glUniform1fv(\a location, \a count, \a v).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform1fv.xml}{glUniform1fv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform1i(GLint location, GLint x)
-
- Convenience function that calls glUniform1i(\a location, \a x).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform1i.xml}{glUniform1i()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform1iv(GLint location, GLsizei count, const GLint* v)
-
- Convenience function that calls glUniform1iv(\a location, \a count, \a v).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform1iv.xml}{glUniform1iv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform2f(GLint location, GLfloat x, GLfloat y)
-
- Convenience function that calls glUniform2f(\a location, \a x, \a y).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform2f.xml}{glUniform2f()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
-
- Convenience function that calls glUniform2fv(\a location, \a count, \a v).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform2fv.xml}{glUniform2fv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform2i(GLint location, GLint x, GLint y)
-
- Convenience function that calls glUniform2i(\a location, \a x, \a y).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform2i.xml}{glUniform2i()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform2iv(GLint location, GLsizei count, const GLint* v)
-
- Convenience function that calls glUniform2iv(\a location, \a count, \a v).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform2iv.xml}{glUniform2iv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
-
- Convenience function that calls glUniform3f(\a location, \a x, \a y, \a z).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform3f.xml}{glUniform3f()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
-
- Convenience function that calls glUniform3fv(\a location, \a count, \a v).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform3fv.xml}{glUniform3fv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform3i(GLint location, GLint x, GLint y, GLint z)
-
- Convenience function that calls glUniform3i(\a location, \a x, \a y, \a z).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform3i.xml}{glUniform3i()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform3iv(GLint location, GLsizei count, const GLint* v)
-
- Convenience function that calls glUniform3iv(\a location, \a count, \a v).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform3iv.xml}{glUniform3iv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-
- Convenience function that calls glUniform4f(\a location, \a x, \a y, \a z, \a w).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform4f.xml}{glUniform4f()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
-
- Convenience function that calls glUniform4fv(\a location, \a count, \a v).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform4fv.xml}{glUniform4fv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
-
- Convenience function that calls glUniform4i(\a location, \a x, \a y, \a z, \a w).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform4i.xml}{glUniform4i()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniform4iv(GLint location, GLsizei count, const GLint* v)
-
- Convenience function that calls glUniform4iv(\a location, \a count, \a v).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform4iv.xml}{glUniform4iv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-
- Convenience function that calls glUniformMatrix2fv(\a location, \a count, \a transpose, \a value).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniformMatrix2fv.xml}{glUniformMatrix2fv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-
- Convenience function that calls glUniformMatrix3fv(\a location, \a count, \a transpose, \a value).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniformMatrix3fv.xml}{glUniformMatrix3fv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-
- Convenience function that calls glUniformMatrix4fv(\a location, \a count, \a transpose, \a value).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUniformMatrix4fv.xml}{glUniformMatrix4fv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glUseProgram(GLuint program)
-
- Convenience function that calls glUseProgram(\a program).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glUseProgram.xml}{glUseProgram()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glValidateProgram(GLuint program)
-
- Convenience function that calls glValidateProgram(\a program).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glValidateProgram.xml}{glValidateProgram()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glVertexAttrib1f(GLuint indx, GLfloat x)
-
- Convenience function that calls glVertexAttrib1f(\a indx, \a x).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib1f.xml}{glVertexAttrib1f()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glVertexAttrib1fv(GLuint indx, const GLfloat* values)
-
- Convenience function that calls glVertexAttrib1fv(\a indx, \a values).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib1fv.xml}{glVertexAttrib1fv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
-
- Convenience function that calls glVertexAttrib2f(\a indx, \a x, \a y).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib2f.xml}{glVertexAttrib2f()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glVertexAttrib2fv(GLuint indx, const GLfloat* values)
-
- Convenience function that calls glVertexAttrib2fv(\a indx, \a values).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib2fv.xml}{glVertexAttrib2fv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
-
- Convenience function that calls glVertexAttrib3f(\a indx, \a x, \a y, \a z).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib3f.xml}{glVertexAttrib3f()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glVertexAttrib3fv(GLuint indx, const GLfloat* values)
-
- Convenience function that calls glVertexAttrib3fv(\a indx, \a values).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib3fv.xml}{glVertexAttrib3fv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-
- Convenience function that calls glVertexAttrib4f(\a indx, \a x, \a y, \a z, \a w).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib4f.xml}{glVertexAttrib4f()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glVertexAttrib4fv(GLuint indx, const GLfloat* values)
-
- Convenience function that calls glVertexAttrib4fv(\a indx, \a values).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib4fv.xml}{glVertexAttrib4fv()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-/*!
- \fn void QGLFunctions::glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
-
- Convenience function that calls glVertexAttribPointer(\a indx, \a size, \a type, \a normalized, \a stride, \a ptr).
-
- For more information, see the OpenGL ES 2.0 documentation for
- \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttribPointer.xml}{glVertexAttribPointer()}.
-
- This convenience function will do nothing on OpenGL ES 1.x systems.
-*/
-
-QGLFunctionsPrivate::QGLFunctionsPrivate(const QGLContext *)
- : funcs(0)
-{
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/qglfunctions.h b/src/opengl/qglfunctions.h
deleted file mode 100644
index d8c5249a1a..0000000000
--- a/src/opengl/qglfunctions.h
+++ /dev/null
@@ -1,1688 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLFUNCTIONS_H
-#define QGLFUNCTIONS_H
-
-#include <QtOpenGL/qgl.h>
-#include <QtGui/qopenglcontext.h>
-#include <QtGui/qopenglfunctions.h>
-
-QT_BEGIN_NAMESPACE
-
-struct QGLFunctionsPrivate;
-
-class Q_OPENGL_EXPORT QGLFunctions
-{
-public:
- QGLFunctions();
- explicit QGLFunctions(const QGLContext *context);
- ~QGLFunctions() {}
-
- enum OpenGLFeature
- {
- Multitexture = 0x0001,
- Shaders = 0x0002,
- Buffers = 0x0004,
- Framebuffers = 0x0008,
- BlendColor = 0x0010,
- BlendEquation = 0x0020,
- BlendEquationSeparate = 0x0040,
- BlendFuncSeparate = 0x0080,
- BlendSubtract = 0x0100,
- CompressedTextures = 0x0200,
- Multisample = 0x0400,
- StencilSeparate = 0x0800,
- NPOTTextures = 0x1000
- };
- Q_DECLARE_FLAGS(OpenGLFeatures, OpenGLFeature)
-
- QGLFunctions::OpenGLFeatures openGLFeatures() const;
- bool hasOpenGLFeature(QGLFunctions::OpenGLFeature feature) const;
-
- void initializeGLFunctions(const QGLContext *context = nullptr);
-
- void glActiveTexture(GLenum texture);
- void glAttachShader(GLuint program, GLuint shader);
- void glBindAttribLocation(GLuint program, GLuint index, const char* name);
- void glBindBuffer(GLenum target, GLuint buffer);
- void glBindFramebuffer(GLenum target, GLuint framebuffer);
- void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- void glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
- void glBlendEquation(GLenum mode);
- void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
- void glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void glBufferData(GLenum target, qopengl_GLsizeiptr size, const void* data, GLenum usage);
- void glBufferSubData(GLenum target, qopengl_GLintptr offset, qopengl_GLsizeiptr size, const void* data);
- GLenum glCheckFramebufferStatus(GLenum target);
- void glClearDepthf(GLclampf depth);
- void glCompileShader(GLuint shader);
- void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
- void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
- GLuint glCreateProgram();
- GLuint glCreateShader(GLenum type);
- void glDeleteBuffers(GLsizei n, const GLuint* buffers);
- void glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers);
- void glDeleteProgram(GLuint program);
- void glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers);
- void glDeleteShader(GLuint shader);
- void glDepthRangef(GLclampf zNear, GLclampf zFar);
- void glDetachShader(GLuint program, GLuint shader);
- void glDisableVertexAttribArray(GLuint index);
- void glEnableVertexAttribArray(GLuint index);
- void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void glGenBuffers(GLsizei n, GLuint* buffers);
- void glGenerateMipmap(GLenum target);
- void glGenFramebuffers(GLsizei n, GLuint* framebuffers);
- void glGenRenderbuffers(GLsizei n, GLuint* renderbuffers);
- void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
- void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
- void glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
- int glGetAttribLocation(GLuint program, const char* name);
- void glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params);
- void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params);
- void glGetProgramiv(GLuint program, GLenum pname, GLint* params);
- void glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
- void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params);
- void glGetShaderiv(GLuint shader, GLenum pname, GLint* params);
- void glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
- void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
- void glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
- void glGetUniformfv(GLuint program, GLint location, GLfloat* params);
- void glGetUniformiv(GLuint program, GLint location, GLint* params);
- int glGetUniformLocation(GLuint program, const char* name);
- void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);
- void glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params);
- void glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer);
- GLboolean glIsBuffer(GLuint buffer);
- GLboolean glIsFramebuffer(GLuint framebuffer);
- GLboolean glIsProgram(GLuint program);
- GLboolean glIsRenderbuffer(GLuint renderbuffer);
- GLboolean glIsShader(GLuint shader);
- void glLinkProgram(GLuint program);
- void glReleaseShaderCompiler();
- void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void glSampleCoverage(GLclampf value, GLboolean invert);
- void glShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLint length);
- void glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length);
- void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void glStencilMaskSeparate(GLenum face, GLuint mask);
- void glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
- void glUniform1f(GLint location, GLfloat x);
- void glUniform1fv(GLint location, GLsizei count, const GLfloat* v);
- void glUniform1i(GLint location, GLint x);
- void glUniform1iv(GLint location, GLsizei count, const GLint* v);
- void glUniform2f(GLint location, GLfloat x, GLfloat y);
- void glUniform2fv(GLint location, GLsizei count, const GLfloat* v);
- void glUniform2i(GLint location, GLint x, GLint y);
- void glUniform2iv(GLint location, GLsizei count, const GLint* v);
- void glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z);
- void glUniform3fv(GLint location, GLsizei count, const GLfloat* v);
- void glUniform3i(GLint location, GLint x, GLint y, GLint z);
- void glUniform3iv(GLint location, GLsizei count, const GLint* v);
- void glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glUniform4fv(GLint location, GLsizei count, const GLfloat* v);
- void glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w);
- void glUniform4iv(GLint location, GLsizei count, const GLint* v);
- void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
- void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
- void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
- void glUseProgram(GLuint program);
- void glValidateProgram(GLuint program);
- void glVertexAttrib1f(GLuint indx, GLfloat x);
- void glVertexAttrib1fv(GLuint indx, const GLfloat* values);
- void glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
- void glVertexAttrib2fv(GLuint indx, const GLfloat* values);
- void glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
- void glVertexAttrib3fv(GLuint indx, const GLfloat* values);
- void glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void glVertexAttrib4fv(GLuint indx, const GLfloat* values);
- void glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
-
-private:
- QGLFunctionsPrivate *d_ptr;
- static bool isInitialized(const QGLFunctionsPrivate *d) { return d != nullptr; }
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QGLFunctions::OpenGLFeatures)
-
-struct QGLFunctionsPrivate
-{
- QGLFunctionsPrivate(const QGLContext *context = nullptr);
- QOpenGLFunctions *funcs;
-};
-
-inline void QGLFunctions::glActiveTexture(GLenum texture)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glActiveTexture(texture);
-}
-
-inline void QGLFunctions::glAttachShader(GLuint program, GLuint shader)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glAttachShader(program, shader);
-}
-
-inline void QGLFunctions::glBindAttribLocation(GLuint program, GLuint index, const char* name)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glBindAttribLocation(program, index, name);
-}
-
-inline void QGLFunctions::glBindBuffer(GLenum target, GLuint buffer)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glBindBuffer(target, buffer);
-}
-
-inline void QGLFunctions::glBindFramebuffer(GLenum target, GLuint framebuffer)
-{
- if (framebuffer == 0)
- framebuffer = QOpenGLContext::currentContext()->defaultFramebufferObject();
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glBindFramebuffer(target, framebuffer);
-}
-
-inline void QGLFunctions::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glBindRenderbuffer(target, renderbuffer);
-}
-
-inline void QGLFunctions::glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glBlendColor(red, green, blue, alpha);
-}
-
-inline void QGLFunctions::glBlendEquation(GLenum mode)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glBlendEquation(mode);
-}
-
-inline void QGLFunctions::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glBlendEquationSeparate(modeRGB, modeAlpha);
-}
-
-inline void QGLFunctions::glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-inline void QGLFunctions::glBufferData(GLenum target, qopengl_GLsizeiptr size, const void* data, GLenum usage)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glBufferData(target, size, data, usage);
-}
-
-inline void QGLFunctions::glBufferSubData(GLenum target, qopengl_GLintptr offset, qopengl_GLsizeiptr size, const void* data)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glBufferSubData(target, offset, size, data);
-}
-
-inline GLenum QGLFunctions::glCheckFramebufferStatus(GLenum target)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glCheckFramebufferStatus(target);
-}
-
-inline void QGLFunctions::glClearDepthf(GLclampf depth)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glClearDepthf(depth);
-}
-
-inline void QGLFunctions::glCompileShader(GLuint shader)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glCompileShader(shader);
-}
-
-inline void QGLFunctions::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-inline void QGLFunctions::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-inline GLuint QGLFunctions::glCreateProgram()
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glCreateProgram();
-}
-
-inline GLuint QGLFunctions::glCreateShader(GLenum type)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glCreateShader(type);
-}
-
-inline void QGLFunctions::glDeleteBuffers(GLsizei n, const GLuint* buffers)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glDeleteBuffers(n, buffers);
-}
-
-inline void QGLFunctions::glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glDeleteFramebuffers(n, framebuffers);
-}
-
-inline void QGLFunctions::glDeleteProgram(GLuint program)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glDeleteProgram(program);
-}
-
-inline void QGLFunctions::glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glDeleteRenderbuffers(n, renderbuffers);
-}
-
-inline void QGLFunctions::glDeleteShader(GLuint shader)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glDeleteShader(shader);
-}
-
-inline void QGLFunctions::glDepthRangef(GLclampf zNear, GLclampf zFar)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glDepthRangef(zNear, zFar);
-}
-
-inline void QGLFunctions::glDetachShader(GLuint program, GLuint shader)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glDetachShader(program, shader);
-}
-
-inline void QGLFunctions::glDisableVertexAttribArray(GLuint index)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glDisableVertexAttribArray(index);
-}
-
-inline void QGLFunctions::glEnableVertexAttribArray(GLuint index)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glEnableVertexAttribArray(index);
-}
-
-inline void QGLFunctions::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-}
-
-inline void QGLFunctions::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glFramebufferTexture2D(target, attachment, textarget, texture, level);
-}
-
-inline void QGLFunctions::glGenBuffers(GLsizei n, GLuint* buffers)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGenBuffers(n, buffers);
-}
-
-inline void QGLFunctions::glGenerateMipmap(GLenum target)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGenerateMipmap(target);
-}
-
-inline void QGLFunctions::glGenFramebuffers(GLsizei n, GLuint* framebuffers)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGenFramebuffers(n, framebuffers);
-}
-
-inline void QGLFunctions::glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGenRenderbuffers(n, renderbuffers);
-}
-
-inline void QGLFunctions::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetActiveAttrib(program, index, bufsize, length, size, type, name);
-}
-
-inline void QGLFunctions::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetActiveUniform(program, index, bufsize, length, size, type, name);
-}
-
-inline void QGLFunctions::glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetAttachedShaders(program, maxcount, count, shaders);
-}
-
-inline int QGLFunctions::glGetAttribLocation(GLuint program, const char* name)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glGetAttribLocation(program, name);
-}
-
-inline void QGLFunctions::glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetBufferParameteriv(target, pname, params);
-}
-
-inline void QGLFunctions::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-}
-
-inline void QGLFunctions::glGetProgramiv(GLuint program, GLenum pname, GLint* params)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetProgramiv(program, pname, params);
-}
-
-inline void QGLFunctions::glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetProgramInfoLog(program, bufsize, length, infolog);
-}
-
-inline void QGLFunctions::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetRenderbufferParameteriv(target, pname, params);
-}
-
-inline void QGLFunctions::glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetShaderiv(shader, pname, params);
-}
-
-inline void QGLFunctions::glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetShaderInfoLog(shader, bufsize, length, infolog);
-}
-
-inline void QGLFunctions::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-}
-
-inline void QGLFunctions::glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetShaderSource(shader, bufsize, length, source);
-}
-
-inline void QGLFunctions::glGetUniformfv(GLuint program, GLint location, GLfloat* params)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetUniformfv(program, location, params);
-}
-
-inline void QGLFunctions::glGetUniformiv(GLuint program, GLint location, GLint* params)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetUniformiv(program, location, params);
-}
-
-inline int QGLFunctions::glGetUniformLocation(GLuint program, const char* name)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glGetUniformLocation(program, name);
-}
-
-inline void QGLFunctions::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetVertexAttribfv(index, pname, params);
-}
-
-inline void QGLFunctions::glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetVertexAttribiv(index, pname, params);
-}
-
-inline void QGLFunctions::glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glGetVertexAttribPointerv(index, pname, pointer);
-}
-
-inline GLboolean QGLFunctions::glIsBuffer(GLuint buffer)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glIsBuffer(buffer);
-}
-
-inline GLboolean QGLFunctions::glIsFramebuffer(GLuint framebuffer)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glIsFramebuffer(framebuffer);
-}
-
-inline GLboolean QGLFunctions::glIsProgram(GLuint program)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glIsProgram(program);
-}
-
-inline GLboolean QGLFunctions::glIsRenderbuffer(GLuint renderbuffer)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glIsRenderbuffer(renderbuffer);
-}
-
-inline GLboolean QGLFunctions::glIsShader(GLuint shader)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- return d_ptr->funcs->glIsShader(shader);
-}
-
-inline void QGLFunctions::glLinkProgram(GLuint program)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glLinkProgram(program);
-}
-
-inline void QGLFunctions::glReleaseShaderCompiler()
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glReleaseShaderCompiler();
-}
-
-inline void QGLFunctions::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glRenderbufferStorage(target, internalformat, width, height);
-}
-
-inline void QGLFunctions::glSampleCoverage(GLclampf value, GLboolean invert)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glSampleCoverage(value, invert);
-}
-
-inline void QGLFunctions::glShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLint length)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glShaderBinary(n, shaders, binaryformat, binary, length);
-}
-
-inline void QGLFunctions::glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glShaderSource(shader, count, string, length);
-}
-
-inline void QGLFunctions::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glStencilFuncSeparate(face, func, ref, mask);
-}
-
-inline void QGLFunctions::glStencilMaskSeparate(GLenum face, GLuint mask)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glStencilMaskSeparate(face, mask);
-}
-
-inline void QGLFunctions::glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glStencilOpSeparate(face, fail, zfail, zpass);
-}
-
-inline void QGLFunctions::glUniform1f(GLint location, GLfloat x)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform1f(location, x);
-}
-
-inline void QGLFunctions::glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform1fv(location, count, v);
-}
-
-inline void QGLFunctions::glUniform1i(GLint location, GLint x)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform1i(location, x);
-}
-
-inline void QGLFunctions::glUniform1iv(GLint location, GLsizei count, const GLint* v)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform1iv(location, count, v);
-}
-
-inline void QGLFunctions::glUniform2f(GLint location, GLfloat x, GLfloat y)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform2f(location, x, y);
-}
-
-inline void QGLFunctions::glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform2fv(location, count, v);
-}
-
-inline void QGLFunctions::glUniform2i(GLint location, GLint x, GLint y)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform2i(location, x, y);
-}
-
-inline void QGLFunctions::glUniform2iv(GLint location, GLsizei count, const GLint* v)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform2iv(location, count, v);
-}
-
-inline void QGLFunctions::glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform3f(location, x, y, z);
-}
-
-inline void QGLFunctions::glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform3fv(location, count, v);
-}
-
-inline void QGLFunctions::glUniform3i(GLint location, GLint x, GLint y, GLint z)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform3i(location, x, y, z);
-}
-
-inline void QGLFunctions::glUniform3iv(GLint location, GLsizei count, const GLint* v)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform3iv(location, count, v);
-}
-
-inline void QGLFunctions::glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform4f(location, x, y, z, w);
-}
-
-inline void QGLFunctions::glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform4fv(location, count, v);
-}
-
-inline void QGLFunctions::glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform4i(location, x, y, z, w);
-}
-
-inline void QGLFunctions::glUniform4iv(GLint location, GLsizei count, const GLint* v)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniform4iv(location, count, v);
-}
-
-inline void QGLFunctions::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniformMatrix2fv(location, count, transpose, value);
-}
-
-inline void QGLFunctions::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniformMatrix3fv(location, count, transpose, value);
-}
-
-inline void QGLFunctions::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUniformMatrix4fv(location, count, transpose, value);
-}
-
-inline void QGLFunctions::glUseProgram(GLuint program)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glUseProgram(program);
-}
-
-inline void QGLFunctions::glValidateProgram(GLuint program)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glValidateProgram(program);
-}
-
-inline void QGLFunctions::glVertexAttrib1f(GLuint indx, GLfloat x)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glVertexAttrib1f(indx, x);
-}
-
-inline void QGLFunctions::glVertexAttrib1fv(GLuint indx, const GLfloat* values)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glVertexAttrib1fv(indx, values);
-}
-
-inline void QGLFunctions::glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glVertexAttrib2f(indx, x, y);
-}
-
-inline void QGLFunctions::glVertexAttrib2fv(GLuint indx, const GLfloat* values)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glVertexAttrib2fv(indx, values);
-}
-
-inline void QGLFunctions::glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glVertexAttrib3f(indx, x, y, z);
-}
-
-inline void QGLFunctions::glVertexAttrib3fv(GLuint indx, const GLfloat* values)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glVertexAttrib3fv(indx, values);
-}
-
-inline void QGLFunctions::glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glVertexAttrib4f(indx, x, y, z, w);
-}
-
-inline void QGLFunctions::glVertexAttrib4fv(GLuint indx, const GLfloat* values)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glVertexAttrib4fv(indx, values);
-}
-
-inline void QGLFunctions::glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
-{
- Q_ASSERT(QGLFunctions::isInitialized(d_ptr));
- d_ptr->funcs->glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
-}
-
-#ifndef GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
-#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
-#endif
-#ifndef GL_ACTIVE_ATTRIBUTES
-#define GL_ACTIVE_ATTRIBUTES 0x8B89
-#endif
-#ifndef GL_ACTIVE_TEXTURE
-#define GL_ACTIVE_TEXTURE 0x84E0
-#endif
-#ifndef GL_ACTIVE_UNIFORM_MAX_LENGTH
-#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
-#endif
-#ifndef GL_ACTIVE_UNIFORMS
-#define GL_ACTIVE_UNIFORMS 0x8B86
-#endif
-#ifndef GL_ALIASED_LINE_WIDTH_RANGE
-#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
-#endif
-#ifndef GL_ALIASED_POINT_SIZE_RANGE
-#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
-#endif
-#ifndef GL_ALPHA
-#define GL_ALPHA 0x1906
-#endif
-#ifndef GL_ALPHA_BITS
-#define GL_ALPHA_BITS 0x0D55
-#endif
-#ifndef GL_ALWAYS
-#define GL_ALWAYS 0x0207
-#endif
-#ifndef GL_ARRAY_BUFFER
-#define GL_ARRAY_BUFFER 0x8892
-#endif
-#ifndef GL_ARRAY_BUFFER_BINDING
-#define GL_ARRAY_BUFFER_BINDING 0x8894
-#endif
-#ifndef GL_ATTACHED_SHADERS
-#define GL_ATTACHED_SHADERS 0x8B85
-#endif
-#ifndef GL_BACK
-#define GL_BACK 0x0405
-#endif
-#ifndef GL_BLEND
-#define GL_BLEND 0x0BE2
-#endif
-#ifndef GL_BLEND_COLOR
-#define GL_BLEND_COLOR 0x8005
-#endif
-#ifndef GL_BLEND_DST_ALPHA
-#define GL_BLEND_DST_ALPHA 0x80CA
-#endif
-#ifndef GL_BLEND_DST_RGB
-#define GL_BLEND_DST_RGB 0x80C8
-#endif
-#ifndef GL_BLEND_EQUATION
-#define GL_BLEND_EQUATION 0x8009
-#endif
-#ifndef GL_BLEND_EQUATION_ALPHA
-#define GL_BLEND_EQUATION_ALPHA 0x883D
-#endif
-#ifndef GL_BLEND_EQUATION_RGB
-#define GL_BLEND_EQUATION_RGB 0x8009
-#endif
-#ifndef GL_BLEND_SRC_ALPHA
-#define GL_BLEND_SRC_ALPHA 0x80CB
-#endif
-#ifndef GL_BLEND_SRC_RGB
-#define GL_BLEND_SRC_RGB 0x80C9
-#endif
-#ifndef GL_BLUE_BITS
-#define GL_BLUE_BITS 0x0D54
-#endif
-#ifndef GL_BOOL
-#define GL_BOOL 0x8B56
-#endif
-#ifndef GL_BOOL_VEC2
-#define GL_BOOL_VEC2 0x8B57
-#endif
-#ifndef GL_BOOL_VEC3
-#define GL_BOOL_VEC3 0x8B58
-#endif
-#ifndef GL_BOOL_VEC4
-#define GL_BOOL_VEC4 0x8B59
-#endif
-#ifndef GL_BUFFER_SIZE
-#define GL_BUFFER_SIZE 0x8764
-#endif
-#ifndef GL_BUFFER_USAGE
-#define GL_BUFFER_USAGE 0x8765
-#endif
-#ifndef GL_BYTE
-#define GL_BYTE 0x1400
-#endif
-#ifndef GL_CCW
-#define GL_CCW 0x0901
-#endif
-#ifndef GL_CLAMP_TO_EDGE
-#define GL_CLAMP_TO_EDGE 0x812F
-#endif
-#ifndef GL_COLOR_ATTACHMENT0
-#define GL_COLOR_ATTACHMENT0 0x8CE0
-#endif
-#ifndef GL_COLOR_BUFFER_BIT
-#define GL_COLOR_BUFFER_BIT 0x00004000
-#endif
-#ifndef GL_COLOR_CLEAR_VALUE
-#define GL_COLOR_CLEAR_VALUE 0x0C22
-#endif
-#ifndef GL_COLOR_WRITEMASK
-#define GL_COLOR_WRITEMASK 0x0C23
-#endif
-#ifndef GL_COMPILE_STATUS
-#define GL_COMPILE_STATUS 0x8B81
-#endif
-#ifndef GL_COMPRESSED_TEXTURE_FORMATS
-#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
-#endif
-#ifndef GL_CONSTANT_ALPHA
-#define GL_CONSTANT_ALPHA 0x8003
-#endif
-#ifndef GL_CONSTANT_COLOR
-#define GL_CONSTANT_COLOR 0x8001
-#endif
-#ifndef GL_CULL_FACE
-#define GL_CULL_FACE 0x0B44
-#endif
-#ifndef GL_CULL_FACE_MODE
-#define GL_CULL_FACE_MODE 0x0B45
-#endif
-#ifndef GL_CURRENT_PROGRAM
-#define GL_CURRENT_PROGRAM 0x8B8D
-#endif
-#ifndef GL_CURRENT_VERTEX_ATTRIB
-#define GL_CURRENT_VERTEX_ATTRIB 0x8626
-#endif
-#ifndef GL_CW
-#define GL_CW 0x0900
-#endif
-#ifndef GL_DECR
-#define GL_DECR 0x1E03
-#endif
-#ifndef GL_DECR_WRAP
-#define GL_DECR_WRAP 0x8508
-#endif
-#ifndef GL_DELETE_STATUS
-#define GL_DELETE_STATUS 0x8B80
-#endif
-#ifndef GL_DEPTH_ATTACHMENT
-#define GL_DEPTH_ATTACHMENT 0x8D00
-#endif
-#ifndef GL_DEPTH_BITS
-#define GL_DEPTH_BITS 0x0D56
-#endif
-#ifndef GL_DEPTH_BUFFER_BIT
-#define GL_DEPTH_BUFFER_BIT 0x00000100
-#endif
-#ifndef GL_DEPTH_CLEAR_VALUE
-#define GL_DEPTH_CLEAR_VALUE 0x0B73
-#endif
-#ifndef GL_DEPTH_COMPONENT
-#define GL_DEPTH_COMPONENT 0x1902
-#endif
-#ifndef GL_DEPTH_COMPONENT16
-#define GL_DEPTH_COMPONENT16 0x81A5
-#endif
-#ifndef GL_DEPTH_FUNC
-#define GL_DEPTH_FUNC 0x0B74
-#endif
-#ifndef GL_DEPTH_RANGE
-#define GL_DEPTH_RANGE 0x0B70
-#endif
-#ifndef GL_DEPTH_TEST
-#define GL_DEPTH_TEST 0x0B71
-#endif
-#ifndef GL_DEPTH_WRITEMASK
-#define GL_DEPTH_WRITEMASK 0x0B72
-#endif
-#ifndef GL_DITHER
-#define GL_DITHER 0x0BD0
-#endif
-#ifndef GL_DONT_CARE
-#define GL_DONT_CARE 0x1100
-#endif
-#ifndef GL_DST_ALPHA
-#define GL_DST_ALPHA 0x0304
-#endif
-#ifndef GL_DST_COLOR
-#define GL_DST_COLOR 0x0306
-#endif
-#ifndef GL_DYNAMIC_DRAW
-#define GL_DYNAMIC_DRAW 0x88E8
-#endif
-#ifndef GL_ELEMENT_ARRAY_BUFFER
-#define GL_ELEMENT_ARRAY_BUFFER 0x8893
-#endif
-#ifndef GL_ELEMENT_ARRAY_BUFFER_BINDING
-#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
-#endif
-#ifndef GL_EQUAL
-#define GL_EQUAL 0x0202
-#endif
-#ifndef GL_EXTENSIONS
-#define GL_EXTENSIONS 0x1F03
-#endif
-#ifndef GL_FALSE
-#define GL_FALSE 0
-#endif
-#ifndef GL_FASTEST
-#define GL_FASTEST 0x1101
-#endif
-#ifndef GL_FIXED
-#define GL_FIXED 0x140C
-#endif
-#ifndef GL_FLOAT
-#define GL_FLOAT 0x1406
-#endif
-#ifndef GL_FLOAT_MAT2
-#define GL_FLOAT_MAT2 0x8B5A
-#endif
-#ifndef GL_FLOAT_MAT3
-#define GL_FLOAT_MAT3 0x8B5B
-#endif
-#ifndef GL_FLOAT_MAT4
-#define GL_FLOAT_MAT4 0x8B5C
-#endif
-#ifndef GL_FLOAT_VEC2
-#define GL_FLOAT_VEC2 0x8B50
-#endif
-#ifndef GL_FLOAT_VEC3
-#define GL_FLOAT_VEC3 0x8B51
-#endif
-#ifndef GL_FLOAT_VEC4
-#define GL_FLOAT_VEC4 0x8B52
-#endif
-#ifndef GL_FRAGMENT_SHADER
-#define GL_FRAGMENT_SHADER 0x8B30
-#endif
-#ifndef GL_FRAMEBUFFER
-#define GL_FRAMEBUFFER 0x8D40
-#endif
-#ifndef GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
-#endif
-#ifndef GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
-#endif
-#ifndef GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
-#endif
-#ifndef GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
-#endif
-#ifndef GL_FRAMEBUFFER_BINDING
-#define GL_FRAMEBUFFER_BINDING 0x8CA6
-#endif
-#ifndef GL_FRAMEBUFFER_COMPLETE
-#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
-#endif
-#ifndef GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
-#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
-#endif
-#ifndef GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS
-#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
-#endif
-#ifndef GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
-#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
-#endif
-#ifndef GL_FRAMEBUFFER_UNSUPPORTED
-#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
-#endif
-#ifndef GL_FRONT
-#define GL_FRONT 0x0404
-#endif
-#ifndef GL_FRONT_AND_BACK
-#define GL_FRONT_AND_BACK 0x0408
-#endif
-#ifndef GL_FRONT_FACE
-#define GL_FRONT_FACE 0x0B46
-#endif
-#ifndef GL_FUNC_ADD
-#define GL_FUNC_ADD 0x8006
-#endif
-#ifndef GL_FUNC_REVERSE_SUBTRACT
-#define GL_FUNC_REVERSE_SUBTRACT 0x800B
-#endif
-#ifndef GL_FUNC_SUBTRACT
-#define GL_FUNC_SUBTRACT 0x800A
-#endif
-#ifndef GL_GENERATE_MIPMAP_HINT
-#define GL_GENERATE_MIPMAP_HINT 0x8192
-#endif
-#ifndef GL_GEQUAL
-#define GL_GEQUAL 0x0206
-#endif
-#ifndef GL_GREATER
-#define GL_GREATER 0x0204
-#endif
-#ifndef GL_GREEN_BITS
-#define GL_GREEN_BITS 0x0D53
-#endif
-#ifndef GL_HIGH_FLOAT
-#define GL_HIGH_FLOAT 0x8DF2
-#endif
-#ifndef GL_HIGH_INT
-#define GL_HIGH_INT 0x8DF5
-#endif
-#ifndef GL_IMPLEMENTATION_COLOR_READ_FORMAT
-#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
-#endif
-#ifndef GL_IMPLEMENTATION_COLOR_READ_TYPE
-#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
-#endif
-#ifndef GL_INCR
-#define GL_INCR 0x1E02
-#endif
-#ifndef GL_INCR_WRAP
-#define GL_INCR_WRAP 0x8507
-#endif
-#ifndef GL_INFO_LOG_LENGTH
-#define GL_INFO_LOG_LENGTH 0x8B84
-#endif
-#ifndef GL_INT
-#define GL_INT 0x1404
-#endif
-#ifndef GL_INT_VEC2
-#define GL_INT_VEC2 0x8B53
-#endif
-#ifndef GL_INT_VEC3
-#define GL_INT_VEC3 0x8B54
-#endif
-#ifndef GL_INT_VEC4
-#define GL_INT_VEC4 0x8B55
-#endif
-#ifndef GL_INVALID_ENUM
-#define GL_INVALID_ENUM 0x0500
-#endif
-#ifndef GL_INVALID_FRAMEBUFFER_OPERATION
-#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
-#endif
-#ifndef GL_INVALID_OPERATION
-#define GL_INVALID_OPERATION 0x0502
-#endif
-#ifndef GL_INVALID_VALUE
-#define GL_INVALID_VALUE 0x0501
-#endif
-#ifndef GL_INVERT
-#define GL_INVERT 0x150A
-#endif
-#ifndef GL_KEEP
-#define GL_KEEP 0x1E00
-#endif
-#ifndef GL_LEQUAL
-#define GL_LEQUAL 0x0203
-#endif
-#ifndef GL_LESS
-#define GL_LESS 0x0201
-#endif
-#ifndef GL_LINEAR
-#define GL_LINEAR 0x2601
-#endif
-#ifndef GL_LINEAR_MIPMAP_LINEAR
-#define GL_LINEAR_MIPMAP_LINEAR 0x2703
-#endif
-#ifndef GL_LINEAR_MIPMAP_NEAREST
-#define GL_LINEAR_MIPMAP_NEAREST 0x2701
-#endif
-#ifndef GL_LINE_LOOP
-#define GL_LINE_LOOP 0x0002
-#endif
-#ifndef GL_LINES
-#define GL_LINES 0x0001
-#endif
-#ifndef GL_LINE_STRIP
-#define GL_LINE_STRIP 0x0003
-#endif
-#ifndef GL_LINE_WIDTH
-#define GL_LINE_WIDTH 0x0B21
-#endif
-#ifndef GL_LINK_STATUS
-#define GL_LINK_STATUS 0x8B82
-#endif
-#ifndef GL_LOW_FLOAT
-#define GL_LOW_FLOAT 0x8DF0
-#endif
-#ifndef GL_LOW_INT
-#define GL_LOW_INT 0x8DF3
-#endif
-#ifndef GL_LUMINANCE
-#define GL_LUMINANCE 0x1909
-#endif
-#ifndef GL_LUMINANCE_ALPHA
-#define GL_LUMINANCE_ALPHA 0x190A
-#endif
-#ifndef GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
-#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
-#endif
-#ifndef GL_MAX_CUBE_MAP_TEXTURE_SIZE
-#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
-#endif
-#ifndef GL_MAX_FRAGMENT_UNIFORM_VECTORS
-#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
-#endif
-#ifndef GL_MAX_RENDERBUFFER_SIZE
-#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
-#endif
-#ifndef GL_MAX_TEXTURE_IMAGE_UNITS
-#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
-#endif
-#ifndef GL_MAX_TEXTURE_SIZE
-#define GL_MAX_TEXTURE_SIZE 0x0D33
-#endif
-#ifndef GL_MAX_VARYING_VECTORS
-#define GL_MAX_VARYING_VECTORS 0x8DFC
-#endif
-#ifndef GL_MAX_VERTEX_ATTRIBS
-#define GL_MAX_VERTEX_ATTRIBS 0x8869
-#endif
-#ifndef GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS
-#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
-#endif
-#ifndef GL_MAX_VERTEX_UNIFORM_VECTORS
-#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
-#endif
-#ifndef GL_MAX_VIEWPORT_DIMS
-#define GL_MAX_VIEWPORT_DIMS 0x0D3A
-#endif
-#ifndef GL_MEDIUM_FLOAT
-#define GL_MEDIUM_FLOAT 0x8DF1
-#endif
-#ifndef GL_MEDIUM_INT
-#define GL_MEDIUM_INT 0x8DF4
-#endif
-#ifndef GL_MIRRORED_REPEAT
-#define GL_MIRRORED_REPEAT 0x8370
-#endif
-#ifndef GL_NEAREST
-#define GL_NEAREST 0x2600
-#endif
-#ifndef GL_NEAREST_MIPMAP_LINEAR
-#define GL_NEAREST_MIPMAP_LINEAR 0x2702
-#endif
-#ifndef GL_NEAREST_MIPMAP_NEAREST
-#define GL_NEAREST_MIPMAP_NEAREST 0x2700
-#endif
-#ifndef GL_NEVER
-#define GL_NEVER 0x0200
-#endif
-#ifndef GL_NICEST
-#define GL_NICEST 0x1102
-#endif
-#ifndef GL_NO_ERROR
-#define GL_NO_ERROR 0
-#endif
-#ifndef GL_NONE
-#define GL_NONE 0
-#endif
-#ifndef GL_NOTEQUAL
-#define GL_NOTEQUAL 0x0205
-#endif
-#ifndef GL_NUM_COMPRESSED_TEXTURE_FORMATS
-#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
-#endif
-#ifndef GL_NUM_SHADER_BINARY_FORMATS
-#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
-#endif
-#ifndef GL_ONE
-#define GL_ONE 1
-#endif
-#ifndef GL_ONE_MINUS_CONSTANT_ALPHA
-#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
-#endif
-#ifndef GL_ONE_MINUS_CONSTANT_COLOR
-#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
-#endif
-#ifndef GL_ONE_MINUS_DST_ALPHA
-#define GL_ONE_MINUS_DST_ALPHA 0x0305
-#endif
-#ifndef GL_ONE_MINUS_DST_COLOR
-#define GL_ONE_MINUS_DST_COLOR 0x0307
-#endif
-#ifndef GL_ONE_MINUS_SRC_ALPHA
-#define GL_ONE_MINUS_SRC_ALPHA 0x0303
-#endif
-#ifndef GL_ONE_MINUS_SRC_COLOR
-#define GL_ONE_MINUS_SRC_COLOR 0x0301
-#endif
-#ifndef GL_OUT_OF_MEMORY
-#define GL_OUT_OF_MEMORY 0x0505
-#endif
-#ifndef GL_PACK_ALIGNMENT
-#define GL_PACK_ALIGNMENT 0x0D05
-#endif
-#ifndef GL_POINTS
-#define GL_POINTS 0x0000
-#endif
-#ifndef GL_POLYGON_OFFSET_FACTOR
-#define GL_POLYGON_OFFSET_FACTOR 0x8038
-#endif
-#ifndef GL_POLYGON_OFFSET_FILL
-#define GL_POLYGON_OFFSET_FILL 0x8037
-#endif
-#ifndef GL_POLYGON_OFFSET_UNITS
-#define GL_POLYGON_OFFSET_UNITS 0x2A00
-#endif
-#ifndef GL_RED_BITS
-#define GL_RED_BITS 0x0D52
-#endif
-#ifndef GL_RENDERBUFFER
-#define GL_RENDERBUFFER 0x8D41
-#endif
-#ifndef GL_RENDERBUFFER_ALPHA_SIZE
-#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
-#endif
-#ifndef GL_RENDERBUFFER_BINDING
-#define GL_RENDERBUFFER_BINDING 0x8CA7
-#endif
-#ifndef GL_RENDERBUFFER_BLUE_SIZE
-#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
-#endif
-#ifndef GL_RENDERBUFFER_DEPTH_SIZE
-#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
-#endif
-#ifndef GL_RENDERBUFFER_GREEN_SIZE
-#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
-#endif
-#ifndef GL_RENDERBUFFER_HEIGHT
-#define GL_RENDERBUFFER_HEIGHT 0x8D43
-#endif
-#ifndef GL_RENDERBUFFER_INTERNAL_FORMAT
-#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
-#endif
-#ifndef GL_RENDERBUFFER_RED_SIZE
-#define GL_RENDERBUFFER_RED_SIZE 0x8D50
-#endif
-#ifndef GL_RENDERBUFFER_STENCIL_SIZE
-#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
-#endif
-#ifndef GL_RENDERBUFFER_WIDTH
-#define GL_RENDERBUFFER_WIDTH 0x8D42
-#endif
-#ifndef GL_RENDERER
-#define GL_RENDERER 0x1F01
-#endif
-#ifndef GL_REPEAT
-#define GL_REPEAT 0x2901
-#endif
-#ifndef GL_REPLACE
-#define GL_REPLACE 0x1E01
-#endif
-#ifndef GL_RGB
-#define GL_RGB 0x1907
-#endif
-#ifndef GL_RGB565
-#define GL_RGB565 0x8D62
-#endif
-#ifndef GL_RGB5_A1
-#define GL_RGB5_A1 0x8057
-#endif
-#ifndef GL_RGBA
-#define GL_RGBA 0x1908
-#endif
-#ifndef GL_RGBA4
-#define GL_RGBA4 0x8056
-#endif
-#ifndef GL_BGRA
-#define GL_BGRA 0x80E1
-#endif
-#ifndef GL_SAMPLE_ALPHA_TO_COVERAGE
-#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
-#endif
-#ifndef GL_SAMPLE_BUFFERS
-#define GL_SAMPLE_BUFFERS 0x80A8
-#endif
-#ifndef GL_SAMPLE_COVERAGE
-#define GL_SAMPLE_COVERAGE 0x80A0
-#endif
-#ifndef GL_SAMPLE_COVERAGE_INVERT
-#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
-#endif
-#ifndef GL_SAMPLE_COVERAGE_VALUE
-#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
-#endif
-#ifndef GL_SAMPLER_2D
-#define GL_SAMPLER_2D 0x8B5E
-#endif
-#ifndef GL_SAMPLER_CUBE
-#define GL_SAMPLER_CUBE 0x8B60
-#endif
-#ifndef GL_SAMPLES
-#define GL_SAMPLES 0x80A9
-#endif
-#ifndef GL_SCISSOR_BOX
-#define GL_SCISSOR_BOX 0x0C10
-#endif
-#ifndef GL_SCISSOR_TEST
-#define GL_SCISSOR_TEST 0x0C11
-#endif
-#ifndef GL_SHADER_BINARY_FORMATS
-#define GL_SHADER_BINARY_FORMATS 0x8DF8
-#endif
-#ifndef GL_SHADER_COMPILER
-#define GL_SHADER_COMPILER 0x8DFA
-#endif
-#ifndef GL_SHADER_SOURCE_LENGTH
-#define GL_SHADER_SOURCE_LENGTH 0x8B88
-#endif
-#ifndef GL_SHADER_TYPE
-#define GL_SHADER_TYPE 0x8B4F
-#endif
-#ifndef GL_SHADING_LANGUAGE_VERSION
-#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
-#endif
-#ifndef GL_SHORT
-#define GL_SHORT 0x1402
-#endif
-#ifndef GL_SRC_ALPHA
-#define GL_SRC_ALPHA 0x0302
-#endif
-#ifndef GL_SRC_ALPHA_SATURATE
-#define GL_SRC_ALPHA_SATURATE 0x0308
-#endif
-#ifndef GL_SRC_COLOR
-#define GL_SRC_COLOR 0x0300
-#endif
-#ifndef GL_STATIC_DRAW
-#define GL_STATIC_DRAW 0x88E4
-#endif
-#ifndef GL_STENCIL_ATTACHMENT
-#define GL_STENCIL_ATTACHMENT 0x8D20
-#endif
-#ifndef GL_STENCIL_BACK_FAIL
-#define GL_STENCIL_BACK_FAIL 0x8801
-#endif
-#ifndef GL_STENCIL_BACK_FUNC
-#define GL_STENCIL_BACK_FUNC 0x8800
-#endif
-#ifndef GL_STENCIL_BACK_PASS_DEPTH_FAIL
-#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
-#endif
-#ifndef GL_STENCIL_BACK_PASS_DEPTH_PASS
-#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
-#endif
-#ifndef GL_STENCIL_BACK_REF
-#define GL_STENCIL_BACK_REF 0x8CA3
-#endif
-#ifndef GL_STENCIL_BACK_VALUE_MASK
-#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
-#endif
-#ifndef GL_STENCIL_BACK_WRITEMASK
-#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
-#endif
-#ifndef GL_STENCIL_BITS
-#define GL_STENCIL_BITS 0x0D57
-#endif
-#ifndef GL_STENCIL_BUFFER_BIT
-#define GL_STENCIL_BUFFER_BIT 0x00000400
-#endif
-#ifndef GL_STENCIL_CLEAR_VALUE
-#define GL_STENCIL_CLEAR_VALUE 0x0B91
-#endif
-#ifndef GL_STENCIL_FAIL
-#define GL_STENCIL_FAIL 0x0B94
-#endif
-#ifndef GL_STENCIL_FUNC
-#define GL_STENCIL_FUNC 0x0B92
-#endif
-#ifndef GL_STENCIL_INDEX
-#define GL_STENCIL_INDEX 0x1901
-#endif
-#ifndef GL_STENCIL_INDEX8
-#define GL_STENCIL_INDEX8 0x8D48
-#endif
-#ifndef GL_STENCIL_PASS_DEPTH_FAIL
-#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
-#endif
-#ifndef GL_STENCIL_PASS_DEPTH_PASS
-#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
-#endif
-#ifndef GL_STENCIL_REF
-#define GL_STENCIL_REF 0x0B97
-#endif
-#ifndef GL_STENCIL_TEST
-#define GL_STENCIL_TEST 0x0B90
-#endif
-#ifndef GL_STENCIL_VALUE_MASK
-#define GL_STENCIL_VALUE_MASK 0x0B93
-#endif
-#ifndef GL_STENCIL_WRITEMASK
-#define GL_STENCIL_WRITEMASK 0x0B98
-#endif
-#ifndef GL_STREAM_DRAW
-#define GL_STREAM_DRAW 0x88E0
-#endif
-#ifndef GL_SUBPIXEL_BITS
-#define GL_SUBPIXEL_BITS 0x0D50
-#endif
-#ifndef GL_TEXTURE0
-#define GL_TEXTURE0 0x84C0
-#endif
-#ifndef GL_TEXTURE
-#define GL_TEXTURE 0x1702
-#endif
-#ifndef GL_TEXTURE10
-#define GL_TEXTURE10 0x84CA
-#endif
-#ifndef GL_TEXTURE1
-#define GL_TEXTURE1 0x84C1
-#endif
-#ifndef GL_TEXTURE11
-#define GL_TEXTURE11 0x84CB
-#endif
-#ifndef GL_TEXTURE12
-#define GL_TEXTURE12 0x84CC
-#endif
-#ifndef GL_TEXTURE13
-#define GL_TEXTURE13 0x84CD
-#endif
-#ifndef GL_TEXTURE14
-#define GL_TEXTURE14 0x84CE
-#endif
-#ifndef GL_TEXTURE15
-#define GL_TEXTURE15 0x84CF
-#endif
-#ifndef GL_TEXTURE16
-#define GL_TEXTURE16 0x84D0
-#endif
-#ifndef GL_TEXTURE17
-#define GL_TEXTURE17 0x84D1
-#endif
-#ifndef GL_TEXTURE18
-#define GL_TEXTURE18 0x84D2
-#endif
-#ifndef GL_TEXTURE19
-#define GL_TEXTURE19 0x84D3
-#endif
-#ifndef GL_TEXTURE20
-#define GL_TEXTURE20 0x84D4
-#endif
-#ifndef GL_TEXTURE2
-#define GL_TEXTURE2 0x84C2
-#endif
-#ifndef GL_TEXTURE21
-#define GL_TEXTURE21 0x84D5
-#endif
-#ifndef GL_TEXTURE22
-#define GL_TEXTURE22 0x84D6
-#endif
-#ifndef GL_TEXTURE23
-#define GL_TEXTURE23 0x84D7
-#endif
-#ifndef GL_TEXTURE24
-#define GL_TEXTURE24 0x84D8
-#endif
-#ifndef GL_TEXTURE25
-#define GL_TEXTURE25 0x84D9
-#endif
-#ifndef GL_TEXTURE26
-#define GL_TEXTURE26 0x84DA
-#endif
-#ifndef GL_TEXTURE27
-#define GL_TEXTURE27 0x84DB
-#endif
-#ifndef GL_TEXTURE28
-#define GL_TEXTURE28 0x84DC
-#endif
-#ifndef GL_TEXTURE29
-#define GL_TEXTURE29 0x84DD
-#endif
-#ifndef GL_TEXTURE_2D
-#define GL_TEXTURE_2D 0x0DE1
-#endif
-#ifndef GL_TEXTURE30
-#define GL_TEXTURE30 0x84DE
-#endif
-#ifndef GL_TEXTURE3
-#define GL_TEXTURE3 0x84C3
-#endif
-#ifndef GL_TEXTURE31
-#define GL_TEXTURE31 0x84DF
-#endif
-#ifndef GL_TEXTURE4
-#define GL_TEXTURE4 0x84C4
-#endif
-#ifndef GL_TEXTURE5
-#define GL_TEXTURE5 0x84C5
-#endif
-#ifndef GL_TEXTURE6
-#define GL_TEXTURE6 0x84C6
-#endif
-#ifndef GL_TEXTURE7
-#define GL_TEXTURE7 0x84C7
-#endif
-#ifndef GL_TEXTURE8
-#define GL_TEXTURE8 0x84C8
-#endif
-#ifndef GL_TEXTURE9
-#define GL_TEXTURE9 0x84C9
-#endif
-#ifndef GL_TEXTURE_BINDING_2D
-#define GL_TEXTURE_BINDING_2D 0x8069
-#endif
-#ifndef GL_TEXTURE_BINDING_CUBE_MAP
-#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
-#endif
-#ifndef GL_TEXTURE_CUBE_MAP
-#define GL_TEXTURE_CUBE_MAP 0x8513
-#endif
-#ifndef GL_TEXTURE_CUBE_MAP_NEGATIVE_X
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
-#endif
-#ifndef GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
-#endif
-#ifndef GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
-#endif
-#ifndef GL_TEXTURE_CUBE_MAP_POSITIVE_X
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
-#endif
-#ifndef GL_TEXTURE_CUBE_MAP_POSITIVE_Y
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
-#endif
-#ifndef GL_TEXTURE_CUBE_MAP_POSITIVE_Z
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
-#endif
-#ifndef GL_TEXTURE_MAG_FILTER
-#define GL_TEXTURE_MAG_FILTER 0x2800
-#endif
-#ifndef GL_TEXTURE_MIN_FILTER
-#define GL_TEXTURE_MIN_FILTER 0x2801
-#endif
-#ifndef GL_TEXTURE_WRAP_S
-#define GL_TEXTURE_WRAP_S 0x2802
-#endif
-#ifndef GL_TEXTURE_WRAP_T
-#define GL_TEXTURE_WRAP_T 0x2803
-#endif
-#ifndef GL_TRIANGLE_FAN
-#define GL_TRIANGLE_FAN 0x0006
-#endif
-#ifndef GL_TRIANGLES
-#define GL_TRIANGLES 0x0004
-#endif
-#ifndef GL_TRIANGLE_STRIP
-#define GL_TRIANGLE_STRIP 0x0005
-#endif
-#ifndef GL_TRUE
-#define GL_TRUE 1
-#endif
-#ifndef GL_UNPACK_ALIGNMENT
-#define GL_UNPACK_ALIGNMENT 0x0CF5
-#endif
-#ifndef GL_UNSIGNED_BYTE
-#define GL_UNSIGNED_BYTE 0x1401
-#endif
-#ifndef GL_UNSIGNED_INT
-#define GL_UNSIGNED_INT 0x1405
-#endif
-#ifndef GL_UNSIGNED_SHORT
-#define GL_UNSIGNED_SHORT 0x1403
-#endif
-#ifndef GL_UNSIGNED_SHORT_4_4_4_4
-#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
-#endif
-#ifndef GL_UNSIGNED_SHORT_5_5_5_1
-#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
-#endif
-#ifndef GL_UNSIGNED_SHORT_5_6_5
-#define GL_UNSIGNED_SHORT_5_6_5 0x8363
-#endif
-#ifndef GL_VALIDATE_STATUS
-#define GL_VALIDATE_STATUS 0x8B83
-#endif
-#ifndef GL_VENDOR
-#define GL_VENDOR 0x1F00
-#endif
-#ifndef GL_VERSION
-#define GL_VERSION 0x1F02
-#endif
-#ifndef GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
-#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
-#endif
-#ifndef GL_VERTEX_ATTRIB_ARRAY_ENABLED
-#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
-#endif
-#ifndef GL_VERTEX_ATTRIB_ARRAY_NORMALIZED
-#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
-#endif
-#ifndef GL_VERTEX_ATTRIB_ARRAY_POINTER
-#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
-#endif
-#ifndef GL_VERTEX_ATTRIB_ARRAY_SIZE
-#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
-#endif
-#ifndef GL_VERTEX_ATTRIB_ARRAY_STRIDE
-#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
-#endif
-#ifndef GL_VERTEX_ATTRIB_ARRAY_TYPE
-#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
-#endif
-#ifndef GL_VERTEX_SHADER
-#define GL_VERTEX_SHADER 0x8B31
-#endif
-#ifndef GL_VIEWPORT
-#define GL_VIEWPORT 0x0BA2
-#endif
-#ifndef GL_ZERO
-#define GL_ZERO 0
-#endif
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/opengl/qglpaintdevice.cpp b/src/opengl/qglpaintdevice.cpp
deleted file mode 100644
index c5151f66bb..0000000000
--- a/src/opengl/qglpaintdevice.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <private/qglpaintdevice_p.h>
-#include <private/qgl_p.h>
-#include <private/qglpixelbuffer_p.h>
-#include <private/qglframebufferobject_p.h>
-#include <qopenglfunctions.h>
-#include <qwindow.h>
-
-QT_BEGIN_NAMESPACE
-
-QGLPaintDevice::QGLPaintDevice()
- : m_thisFBO(0)
-{
-}
-
-QGLPaintDevice::~QGLPaintDevice()
-{
-}
-
-int QGLPaintDevice::metric(QPaintDevice::PaintDeviceMetric metric) const
-{
- switch(metric) {
- case PdmWidth:
- return size().width();
- case PdmHeight:
- return size().height();
- case PdmDepth: {
- const QGLFormat f = format();
- return f.redBufferSize() + f.greenBufferSize() + f.blueBufferSize() + f.alphaBufferSize();
- }
- case PdmDevicePixelRatio:
- return 1;
- case PdmDevicePixelRatioScaled:
- return 1 * QPaintDevice::devicePixelRatioFScale();
- default:
- qWarning("QGLPaintDevice::metric() - metric %d not known", metric);
- return 0;
- }
-}
-
-void QGLPaintDevice::beginPaint()
-{
- // Make sure our context is the current one:
- QGLContext *ctx = context();
- ctx->makeCurrent();
-
- ctx->d_func()->refreshCurrentFbo();
-
- // Record the currently bound FBO so we can restore it again
- // in endPaint() and bind this device's FBO
- //
- // Note: m_thisFBO could be zero if the paint device is not
- // backed by an FBO (e.g. window back buffer). But there could
- // be a previous FBO bound to the context which we need to
- // explicitly unbind. Otherwise the painting will go into
- // the previous FBO instead of to the window.
- m_previousFBO = ctx->d_func()->current_fbo;
-
- if (m_previousFBO != m_thisFBO) {
- ctx->d_func()->setCurrentFbo(m_thisFBO);
- ctx->contextHandle()->functions()->glBindFramebuffer(GL_FRAMEBUFFER, m_thisFBO);
- }
-
- // Set the default fbo for the context to m_thisFBO so that
- // if some raw GL code between beginNativePainting() and
- // endNativePainting() calls QGLFramebufferObject::release(),
- // painting will revert to the window surface's fbo.
- ctx->d_ptr->default_fbo = m_thisFBO;
-}
-
-void QGLPaintDevice::ensureActiveTarget()
-{
- QGLContext* ctx = context();
- if (ctx != QGLContext::currentContext())
- ctx->makeCurrent();
-
- ctx->d_func()->refreshCurrentFbo();
-
- if (ctx->d_ptr->current_fbo != m_thisFBO) {
- ctx->d_func()->setCurrentFbo(m_thisFBO);
- ctx->contextHandle()->functions()->glBindFramebuffer(GL_FRAMEBUFFER, m_thisFBO);
- }
-
- ctx->d_ptr->default_fbo = m_thisFBO;
-}
-
-void QGLPaintDevice::endPaint()
-{
- // Make sure the FBO bound at beginPaint is re-bound again here:
- QGLContext *ctx = context();
- ctx->makeCurrent();
-
- ctx->d_func()->refreshCurrentFbo();
-
- if (m_previousFBO != ctx->d_func()->current_fbo) {
- ctx->d_func()->setCurrentFbo(m_previousFBO);
- ctx->contextHandle()->functions()->glBindFramebuffer(GL_FRAMEBUFFER, m_previousFBO);
- }
-
- ctx->d_ptr->default_fbo = 0;
-}
-
-QGLFormat QGLPaintDevice::format() const
-{
- return context()->format();
-}
-
-bool QGLPaintDevice::alphaRequested() const
-{
- return context()->d_func()->reqFormat.alpha();
-}
-
-bool QGLPaintDevice::isFlipped() const
-{
- return false;
-}
-
-////////////////// QGLWidgetGLPaintDevice //////////////////
-
-QGLWidgetGLPaintDevice::QGLWidgetGLPaintDevice()
-{
-}
-
-QPaintEngine* QGLWidgetGLPaintDevice::paintEngine() const
-{
- return glWidget->paintEngine();
-}
-
-void QGLWidgetGLPaintDevice::setWidget(QGLWidget* w)
-{
- glWidget = w;
-}
-
-void QGLWidgetGLPaintDevice::beginPaint()
-{
- QGLPaintDevice::beginPaint();
- QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
- if (!glWidget->d_func()->disable_clear_on_painter_begin && glWidget->autoFillBackground()) {
- if (glWidget->testAttribute(Qt::WA_TranslucentBackground))
- funcs->glClearColor(0.0, 0.0, 0.0, 0.0);
- else {
- const QColor &c = glWidget->palette().brush(glWidget->backgroundRole()).color();
- float alpha = c.alphaF();
- funcs->glClearColor(c.redF() * alpha, c.greenF() * alpha, c.blueF() * alpha, alpha);
- }
- if (context()->d_func()->workaround_needsFullClearOnEveryFrame)
- funcs->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- else
- funcs->glClear(GL_COLOR_BUFFER_BIT);
- }
-}
-
-void QGLWidgetGLPaintDevice::endPaint()
-{
- if (glWidget->autoBufferSwap())
- glWidget->swapBuffers();
- QGLPaintDevice::endPaint();
-}
-
-
-QSize QGLWidgetGLPaintDevice::size() const
-{
- return glWidget->size() * (glWidget->windowHandle() ?
- glWidget->windowHandle()->devicePixelRatio() : qApp->devicePixelRatio());
-}
-
-QGLContext* QGLWidgetGLPaintDevice::context() const
-{
- return const_cast<QGLContext*>(glWidget->context());
-}
-
-// returns the QGLPaintDevice for the given QPaintDevice
-QGLPaintDevice* QGLPaintDevice::getDevice(QPaintDevice* pd)
-{
- QGLPaintDevice* glpd = 0;
-
- switch(pd->devType()) {
- case QInternal::Widget:
- // Should not be called on a non-gl widget:
- Q_ASSERT(qobject_cast<QGLWidget*>(static_cast<QWidget*>(pd)));
- glpd = &(static_cast<QGLWidget*>(pd)->d_func()->glDevice);
- break;
- case QInternal::Pbuffer:
- glpd = &(static_cast<QGLPixelBuffer*>(pd)->d_func()->glDevice);
- break;
- case QInternal::FramebufferObject:
- glpd = &(static_cast<QGLFramebufferObject*>(pd)->d_func()->glDevice);
- break;
- case QInternal::Pixmap: {
- qWarning("Pixmap type not supported for GL rendering");
- break;
- }
- default:
- qWarning("QGLPaintDevice::getDevice() - Unknown device type %d", pd->devType());
- break;
- }
-
- return glpd;
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/qglpaintdevice_p.h b/src/opengl/qglpaintdevice_p.h
deleted file mode 100644
index bfecdabd53..0000000000
--- a/src/opengl/qglpaintdevice_p.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLPAINTDEVICE_P_H
-#define QGLPAINTDEVICE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of the Qt OpenGL module. This header file may change from
-// version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-
-#include <qpaintdevice.h>
-#include <QtOpenGL/qgl.h>
-
-
-QT_BEGIN_NAMESPACE
-
-class Q_OPENGL_EXPORT QGLPaintDevice : public QPaintDevice
-{
-public:
- QGLPaintDevice();
- virtual ~QGLPaintDevice();
-
- int devType() const override {return QInternal::OpenGL;}
-
- virtual void beginPaint();
- virtual void ensureActiveTarget();
- virtual void endPaint();
-
- virtual QGLContext* context() const = 0;
- virtual QGLFormat format() const;
- virtual QSize size() const = 0;
- virtual bool alphaRequested() const;
- virtual bool isFlipped() const;
-
- // returns the QGLPaintDevice for the given QPaintDevice
- static QGLPaintDevice* getDevice(QPaintDevice*);
-
-protected:
- int metric(QPaintDevice::PaintDeviceMetric metric) const override;
- GLuint m_previousFBO;
- GLuint m_thisFBO;
-};
-
-
-// Wraps a QGLWidget
-class QGLWidget;
-class Q_OPENGL_EXPORT QGLWidgetGLPaintDevice : public QGLPaintDevice
-{
-public:
- QGLWidgetGLPaintDevice();
-
- virtual QPaintEngine* paintEngine() const override;
-
- // QGLWidgets need to do swapBufers in endPaint:
- virtual void beginPaint() override;
- virtual void endPaint() override;
- virtual QSize size() const override;
- virtual QGLContext* context() const override;
-
- void setWidget(QGLWidget*);
-
-private:
- friend class QGLWidget;
- QGLWidget *glWidget;
-};
-
-QT_END_NAMESPACE
-
-#endif // QGLPAINTDEVICE_P_H
diff --git a/src/opengl/qglpixelbuffer.cpp b/src/opengl/qglpixelbuffer.cpp
deleted file mode 100644
index e2f434ac3c..0000000000
--- a/src/opengl/qglpixelbuffer.cpp
+++ /dev/null
@@ -1,654 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \class QGLPixelBuffer
- \inmodule QtOpenGL
- \brief The QGLPixelBuffer class encapsulates an OpenGL pbuffer.
- \since 4.1
- \obsolete
-
- \ingroup painting-3D
-
- Rendering into a pbuffer is normally done using full hardware
- acceleration. This can be significantly faster than rendering
- into a QPixmap.
-
- There are three approaches to using this class:
-
- \list 1
- \li \b{We can draw into the pbuffer and convert it to a QImage
- using toImage().} This is normally much faster than calling
- QGLWidget::renderPixmap().
-
- \li \b{We can draw into the pbuffer and copy the contents into
- an OpenGL texture using updateDynamicTexture().} This allows
- us to create dynamic textures and works on all systems
- with pbuffer support.
-
- \li \b{On systems that support it, we can bind the pbuffer to
- an OpenGL texture.} The texture is then updated automatically
- when the pbuffer contents change, eliminating the need for
- additional copy operations. This is supported only on Windows
- and \macos systems that provide the \c render_texture
- extension. Note that under Windows, a multi-sampled pbuffer
- can't be used in conjunction with the \c render_texture
- extension. If a multi-sampled pbuffer is requested under
- Windows, the \c render_texture extension is turned off for that
- pbuffer.
-
-
- \endlist
-
- \note This class has been deprecated, use QOpenGLFramebufferObject
- for offscreen rendering.
-
- \section1 Threading
-
- As of Qt 4.8, it's possible to render into a QGLPixelBuffer using
- a QPainter in a separate thread. Note that OpenGL 2.0 or OpenGL ES
- 2.0 is required for this to work.
-
- Pbuffers are provided by the OpenGL \c pbuffer extension; call
- hasOpenGLPbuffer() to find out if the system provides pbuffers.
-*/
-
-#include <private/qopenglextensions_p.h>
-
-#include <QtCore/qglobal.h>
-#include <QtGui/qopenglframebufferobject.h>
-
-#include "gl2paintengineex/qpaintengineex_opengl2_p.h"
-
-#include <qglframebufferobject.h>
-#include <qglpixelbuffer.h>
-#include <private/qglpixelbuffer_p.h>
-#include <private/qfont_p.h>
-#include <qimage.h>
-
-QT_BEGIN_NAMESPACE
-
-extern QImage qt_gl_read_frame_buffer(const QSize&, bool, bool);
-
-
-QGLContext* QGLPBufferGLPaintDevice::context() const
-{
- return pbuf->d_func()->qctx;
-}
-
-void QGLPBufferGLPaintDevice::beginPaint()
-{
- pbuf->makeCurrent();
- QGLPaintDevice::beginPaint();
-}
-
-void QGLPBufferGLPaintDevice::endPaint()
-{
- QOpenGLContext::currentContext()->functions()->glFlush();
- QGLPaintDevice::endPaint();
-}
-
-void QGLPBufferGLPaintDevice::setFbo(GLuint fbo)
-{
- m_thisFBO = fbo;
-}
-
-void QGLPBufferGLPaintDevice::setPBuffer(QGLPixelBuffer* pb)
-{
- pbuf = pb;
-}
-
-void QGLPixelBufferPrivate::common_init(const QSize &size, const QGLFormat &format, QGLWidget *shareWidget)
-{
- Q_Q(QGLPixelBuffer);
- if(init(size, format, shareWidget)) {
- req_size = size;
- req_format = format;
- req_shareWidget = shareWidget;
- invalid = false;
- glDevice.setPBuffer(q);
- }
-}
-
-/*!
- Constructs an OpenGL pbuffer of the given \a size. If no \a
- format is specified, the \l{QGLFormat::defaultFormat()}{default
- format} is used. If the \a shareWidget parameter points to a
- valid QGLWidget, the pbuffer will share its context with \a
- shareWidget.
-
- If you intend to bind this pbuffer as a dynamic texture, the width
- and height components of \c size must be powers of two (e.g., 512
- x 128).
-
- \sa size(), format()
-*/
-QGLPixelBuffer::QGLPixelBuffer(const QSize &size, const QGLFormat &format, QGLWidget *shareWidget)
- : d_ptr(new QGLPixelBufferPrivate(this))
-{
- Q_D(QGLPixelBuffer);
- d->common_init(size, format, shareWidget);
-}
-
-
-/*! \overload
-
- Constructs an OpenGL pbuffer with the \a width and \a height. If
- no \a format is specified, the
- \l{QGLFormat::defaultFormat()}{default format} is used. If the \a
- shareWidget parameter points to a valid QGLWidget, the pbuffer
- will share its context with \a shareWidget.
-
- If you intend to bind this pbuffer as a dynamic texture, the width
- and height components of \c size must be powers of two (e.g., 512
- x 128).
-
- \sa size(), format()
-*/
-QGLPixelBuffer::QGLPixelBuffer(int width, int height, const QGLFormat &format, QGLWidget *shareWidget)
- : d_ptr(new QGLPixelBufferPrivate(this))
-{
- Q_D(QGLPixelBuffer);
- d->common_init(QSize(width, height), format, shareWidget);
-}
-
-
-/*! \fn QGLPixelBuffer::~QGLPixelBuffer()
-
- Destroys the pbuffer and frees any allocated resources.
-*/
-QGLPixelBuffer::~QGLPixelBuffer()
-{
- Q_D(QGLPixelBuffer);
-
- // defined in qpaintengine_opengl.cpp
- QGLContext *current = const_cast<QGLContext *>(QGLContext::currentContext());
- if (current != d->qctx)
- makeCurrent();
- d->cleanup();
- if (current && current != d->qctx)
- current->makeCurrent();
-}
-
-/*! \fn bool QGLPixelBuffer::makeCurrent()
-
- Makes this pbuffer the current OpenGL rendering context. Returns
- true on success; otherwise returns \c false.
-
- \sa QGLContext::makeCurrent(), doneCurrent()
-*/
-
-bool QGLPixelBuffer::makeCurrent()
-{
- Q_D(QGLPixelBuffer);
- if (d->invalid)
- return false;
- d->qctx->makeCurrent();
- if (!d->fbo) {
- QOpenGLFramebufferObjectFormat format;
- if (d->req_format.stencil())
- format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
- else if (d->req_format.depth())
- format.setAttachment(QOpenGLFramebufferObject::Depth);
- if (d->req_format.sampleBuffers())
- format.setSamples(d->req_format.samples());
- d->fbo = new QOpenGLFramebufferObject(d->req_size, format);
- d->fbo->bind();
- d->glDevice.setFbo(d->fbo->handle());
- QOpenGLContext::currentContext()->functions()->glViewport(0, 0, d->req_size.width(), d->req_size.height());
- }
- return true;
-}
-
-/*! \fn bool QGLPixelBuffer::doneCurrent()
-
- Makes no context the current OpenGL context. Returns \c true on
- success; otherwise returns \c false.
-*/
-
-bool QGLPixelBuffer::doneCurrent()
-{
- Q_D(QGLPixelBuffer);
- if (d->invalid)
- return false;
- d->qctx->doneCurrent();
- return true;
-}
-
-/*!
- Returns the context of this pixelbuffer.
-*/
-QGLContext *QGLPixelBuffer::context() const
-{
- Q_D(const QGLPixelBuffer);
- return d->qctx;
-}
-
-/*!
- \fn GLuint QGLPixelBuffer::generateDynamicTexture() const
-
- Generates and binds a 2D GL texture that is the same size as the
- pbuffer, and returns the texture's ID. This can be used in
- conjunction with bindToDynamicTexture() and
- updateDynamicTexture().
-
- \sa size()
-*/
-
-/*! \fn bool QGLPixelBuffer::bindToDynamicTexture(GLuint texture_id)
-
- Binds the texture specified by \a texture_id to this pbuffer.
- Returns \c true on success; otherwise returns \c false.
-
- The texture must be of the same size and format as the pbuffer.
-
- To unbind the texture, call releaseFromDynamicTexture(). While
- the texture is bound, it is updated automatically when the
- pbuffer contents change, eliminating the need for additional copy
- operations.
-
- Example:
-
- \snippet code/src_opengl_qglpixelbuffer.cpp 0
-
- \warning This function uses the \c {render_texture} extension,
- which is currently not supported under X11. An alternative that
- works on all systems (including X11) is to manually copy the
- pbuffer contents to a texture using updateDynamicTexture().
-
- \warning For the bindToDynamicTexture() call to succeed on the
- \macos, the pbuffer needs a shared context, i.e. the
- QGLPixelBuffer must be created with a share widget.
-
- \sa generateDynamicTexture(), releaseFromDynamicTexture()
-*/
-
-/*! \fn void QGLPixelBuffer::releaseFromDynamicTexture()
-
- Releases the pbuffer from any previously bound texture.
-
- \sa bindToDynamicTexture()
-*/
-
-/*! \fn bool QGLPixelBuffer::hasOpenGLPbuffers()
-
- Returns \c true if the OpenGL \c pbuffer extension is present on
- this system; otherwise returns \c false.
-*/
-
-/*!
- Copies the pbuffer contents into the texture specified with \a
- texture_id.
-
- The texture must be of the same size and format as the pbuffer.
-
- Example:
-
- \snippet code/src_opengl_qglpixelbuffer.cpp 1
-
- An alternative on Windows and \macos systems that support the
- \c render_texture extension is to use bindToDynamicTexture() to
- get dynamic updates of the texture.
-
- \sa generateDynamicTexture(), bindToDynamicTexture()
-*/
-void QGLPixelBuffer::updateDynamicTexture(GLuint texture_id) const
-{
- Q_D(const QGLPixelBuffer);
- if (d->invalid || !d->fbo)
- return;
-
- const QGLContext *ctx = QGLContext::currentContext();
- if (!ctx)
- return;
-
-#undef glBindFramebuffer
-
-#ifndef GL_READ_FRAMEBUFFER
-#define GL_READ_FRAMEBUFFER 0x8CA8
-#endif
-
-#ifndef GL_DRAW_FRAMEBUFFER
-#define GL_DRAW_FRAMEBUFFER 0x8CA9
-#endif
-
- QOpenGLExtensions extensions(ctx->contextHandle());
-
- ctx->d_ptr->refreshCurrentFbo();
-
- if (d->blit_fbo) {
- QOpenGLFramebufferObject::blitFramebuffer(d->blit_fbo, d->fbo);
- extensions.glBindFramebuffer(GL_READ_FRAMEBUFFER, d->blit_fbo->handle());
- }
-
- extensions.glBindTexture(GL_TEXTURE_2D, texture_id);
-#ifndef QT_OPENGL_ES
- GLenum format = ctx->contextHandle()->isOpenGLES() ? GL_RGBA : GL_RGBA8;
- extensions.glCopyTexImage2D(GL_TEXTURE_2D, 0, format, 0, 0, d->req_size.width(), d->req_size.height(), 0);
-#else
- extensions.glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, d->req_size.width(), d->req_size.height(), 0);
-#endif
-
- if (d->blit_fbo)
- extensions.glBindFramebuffer(GL_READ_FRAMEBUFFER, ctx->d_func()->current_fbo);
-}
-
-/*!
- Returns the size of the pbuffer.
-*/
-QSize QGLPixelBuffer::size() const
-{
- Q_D(const QGLPixelBuffer);
- return d->req_size;
-}
-
-/*!
- Returns the contents of the pbuffer as a QImage.
-*/
-QImage QGLPixelBuffer::toImage() const
-{
- Q_D(const QGLPixelBuffer);
- if (d->invalid)
- return QImage();
-
- const_cast<QGLPixelBuffer *>(this)->makeCurrent();
- if (d->fbo)
- d->fbo->bind();
- return qt_gl_read_frame_buffer(d->req_size, d->format.alpha(), true);
-}
-
-/*!
- Returns the native pbuffer handle.
-*/
-Qt::HANDLE QGLPixelBuffer::handle() const
-{
- Q_D(const QGLPixelBuffer);
- if (d->invalid)
- return 0;
- return (Qt::HANDLE) d->pbuf;
-}
-
-/*!
- Returns \c true if this pbuffer is valid; otherwise returns \c false.
-*/
-bool QGLPixelBuffer::isValid() const
-{
- Q_D(const QGLPixelBuffer);
- return !d->invalid;
-}
-
-Q_GLOBAL_STATIC(QGLEngineThreadStorage<QGL2PaintEngineEx>, qt_buffer_2_engine)
-
-/*! \reimp */
-QPaintEngine *QGLPixelBuffer::paintEngine() const
-{
- return qt_buffer_2_engine()->engine();
-}
-
-/*! \reimp */
-int QGLPixelBuffer::metric(PaintDeviceMetric metric) const
-{
- Q_D(const QGLPixelBuffer);
-
- float dpmx = qt_defaultDpiX()*100./2.54;
- float dpmy = qt_defaultDpiY()*100./2.54;
- int w = d->req_size.width();
- int h = d->req_size.height();
- switch (metric) {
- case PdmWidth:
- return w;
-
- case PdmHeight:
- return h;
-
- case PdmWidthMM:
- return qRound(w * 1000 / dpmx);
-
- case PdmHeightMM:
- return qRound(h * 1000 / dpmy);
-
- case PdmNumColors:
- return 0;
-
- case PdmDepth:
- return 32;//d->depth;
-
- case PdmDpiX:
- return qRound(dpmx * 0.0254);
-
- case PdmDpiY:
- return qRound(dpmy * 0.0254);
-
- case PdmPhysicalDpiX:
- return qRound(dpmx * 0.0254);
-
- case PdmPhysicalDpiY:
- return qRound(dpmy * 0.0254);
-
- case QPaintDevice::PdmDevicePixelRatio:
- return 1;
-
- case QPaintDevice::PdmDevicePixelRatioScaled:
- return QPaintDevice::devicePixelRatioFScale();
-
- default:
- qWarning("QGLPixelBuffer::metric(), Unhandled metric type: %d\n", metric);
- break;
- }
- return 0;
-}
-
-/*!
- Generates and binds a 2D GL texture to the current context, based
- on \a image. The generated texture id is returned and can be used
- in later glBindTexture() calls.
-
- The \a target parameter specifies the texture target.
-
- Equivalent to calling QGLContext::bindTexture().
-
- \sa deleteTexture()
-*/
-GLuint QGLPixelBuffer::bindTexture(const QImage &image, GLenum target)
-{
- Q_D(QGLPixelBuffer);
-#ifndef QT_OPENGL_ES
- GLenum format = QOpenGLContext::currentContext()->isOpenGLES() ? GL_RGBA : GL_RGBA8;
- return d->qctx->bindTexture(image, target, GLint(format));
-#else
- return d->qctx->bindTexture(image, target, GL_RGBA);
-#endif
-}
-
-/*! \overload
-
- Generates and binds a 2D GL texture based on \a pixmap.
-
- Equivalent to calling QGLContext::bindTexture().
-
- \sa deleteTexture()
-*/
-GLuint QGLPixelBuffer::bindTexture(const QPixmap &pixmap, GLenum target)
-{
- Q_D(QGLPixelBuffer);
-#ifndef QT_OPENGL_ES
- GLenum format = QOpenGLContext::currentContext()->isOpenGLES() ? GL_RGBA : GL_RGBA8;
- return d->qctx->bindTexture(pixmap, target, GLint(format));
-#else
- return d->qctx->bindTexture(pixmap, target, GL_RGBA);
-#endif
-}
-
-/*! \overload
-
- Reads the DirectDrawSurface (DDS) compressed file \a fileName and
- generates a 2D GL texture from it.
-
- Equivalent to calling QGLContext::bindTexture().
-
- \sa deleteTexture()
-*/
-GLuint QGLPixelBuffer::bindTexture(const QString &fileName)
-{
- Q_D(QGLPixelBuffer);
- return d->qctx->bindTexture(fileName);
-}
-
-/*!
- Removes the texture identified by \a texture_id from the texture cache.
-
- Equivalent to calling QGLContext::deleteTexture().
- */
-void QGLPixelBuffer::deleteTexture(GLuint texture_id)
-{
- Q_D(QGLPixelBuffer);
- d->qctx->deleteTexture(texture_id);
-}
-
-/*!
- \since 4.4
-
- Draws the given texture, \a textureId, to the given target rectangle,
- \a target, in OpenGL model space. The \a textureTarget should be a 2D
- texture target.
-
- Equivalent to the corresponding QGLContext::drawTexture().
-*/
-void QGLPixelBuffer::drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget)
-{
- Q_D(QGLPixelBuffer);
- d->qctx->drawTexture(target, textureId, textureTarget);
-}
-
-/*!
- \since 4.4
-
- Draws the given texture, \a textureId, at the given \a point in OpenGL model
- space. The textureTarget parameter should be a 2D texture target.
-
- Equivalent to the corresponding QGLContext::drawTexture().
-*/
-void QGLPixelBuffer::drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget)
-{
- Q_D(QGLPixelBuffer);
- d->qctx->drawTexture(point, textureId, textureTarget);
-}
-
-/*!
- Returns the format of the pbuffer. The format may be different
- from the one that was requested.
-*/
-QGLFormat QGLPixelBuffer::format() const
-{
- Q_D(const QGLPixelBuffer);
- return d->format;
-}
-
-/*! \fn int QGLPixelBuffer::devType() const
- \internal
-*/
-
-bool QGLPixelBufferPrivate::init(const QSize &, const QGLFormat &f, QGLWidget *shareWidget)
-{
- widget = new QGLWidget(f, 0, shareWidget);
- widget->resize(1, 1);
- qctx = const_cast<QGLContext *>(widget->context());
- return widget->isValid();
-}
-
-bool QGLPixelBufferPrivate::cleanup()
-{
- delete fbo;
- fbo = 0;
- delete blit_fbo;
- blit_fbo = 0;
- delete widget;
- widget = 0;
- return true;
-}
-
-bool QGLPixelBuffer::bindToDynamicTexture(GLuint texture_id)
-{
- Q_UNUSED(texture_id);
- return false;
-}
-
-void QGLPixelBuffer::releaseFromDynamicTexture()
-{
-}
-
-GLuint QGLPixelBuffer::generateDynamicTexture() const
-{
- Q_D(const QGLPixelBuffer);
- if (!d->fbo)
- return 0;
-
- if (d->fbo->format().samples() > 0
- && QOpenGLExtensions(QOpenGLContext::currentContext())
- .hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit))
- {
- if (!d->blit_fbo)
- const_cast<QOpenGLFramebufferObject *&>(d->blit_fbo) = new QOpenGLFramebufferObject(d->req_size);
- } else {
- return d->fbo->texture();
- }
-
- GLuint texture;
- QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
-
- funcs->glGenTextures(1, &texture);
- funcs->glBindTexture(GL_TEXTURE_2D, texture);
-
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, d->req_size.width(), d->req_size.height(), 0,
- GL_RGBA, GL_UNSIGNED_BYTE, 0);
-
- return texture;
-}
-
-bool QGLPixelBuffer::hasOpenGLPbuffers()
-{
- return QGLFramebufferObject::hasOpenGLFramebufferObjects();
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/qglpixelbuffer.h b/src/opengl/qglpixelbuffer.h
deleted file mode 100644
index f5d7929c35..0000000000
--- a/src/opengl/qglpixelbuffer.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLPIXELBUFFER_H
-#define QGLPIXELBUFFER_H
-
-#include <QtOpenGL/qgl.h>
-#include <QtGui/qpaintdevice.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QGLPixelBufferPrivate;
-
-class Q_OPENGL_EXPORT QGLPixelBuffer : public QPaintDevice
-{
- Q_DECLARE_PRIVATE(QGLPixelBuffer)
-public:
- QGLPixelBuffer(const QSize &size, const QGLFormat &format = QGLFormat::defaultFormat(),
- QGLWidget *shareWidget = nullptr);
- QGLPixelBuffer(int width, int height, const QGLFormat &format = QGLFormat::defaultFormat(),
- QGLWidget *shareWidget = nullptr);
- virtual ~QGLPixelBuffer();
-
- bool isValid() const;
- bool makeCurrent();
- bool doneCurrent();
-
- QGLContext *context() const;
-
- GLuint generateDynamicTexture() const;
- bool bindToDynamicTexture(GLuint texture);
- void releaseFromDynamicTexture();
- void updateDynamicTexture(GLuint texture_id) const;
-
- GLuint bindTexture(const QImage &image, GLenum target = GL_TEXTURE_2D);
- GLuint bindTexture(const QPixmap &pixmap, GLenum target = GL_TEXTURE_2D);
- GLuint bindTexture(const QString &fileName);
- void deleteTexture(GLuint texture_id);
-
- void drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
- void drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
-
- QSize size() const;
- Qt::HANDLE handle() const;
- QImage toImage() const;
-
- QPaintEngine *paintEngine() const override;
- QGLFormat format() const;
-
- static bool hasOpenGLPbuffers();
-
-protected:
- int metric(PaintDeviceMetric metric) const override;
- int devType() const override { return QInternal::Pbuffer; }
-
-private:
- Q_DISABLE_COPY(QGLPixelBuffer)
- QScopedPointer<QGLPixelBufferPrivate> d_ptr;
- friend class QGLDrawable;
- friend class QGLPaintDevice;
- friend class QGLPBufferGLPaintDevice;
- friend class QGLContextPrivate;
-};
-
-QT_END_NAMESPACE
-
-#endif // QGLPIXELBUFFER_H
diff --git a/src/opengl/qglpixelbuffer_p.h b/src/opengl/qglpixelbuffer_p.h
deleted file mode 100644
index 2729ade2b6..0000000000
--- a/src/opengl/qglpixelbuffer_p.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLPIXELBUFFER_P_H
-#define QGLPIXELBUFFER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "QtOpenGL/qglpixelbuffer.h"
-#include <private/qgl_p.h>
-#include <private/qglpaintdevice_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QEglContext;
-class QOpenGLFramebufferObject;
-
-class QGLPBufferGLPaintDevice : public QGLPaintDevice
-{
-public:
- QPaintEngine* paintEngine() const override {return pbuf->paintEngine();}
- QSize size() const override {return pbuf->size();}
- QGLContext* context() const override;
- void beginPaint() override;
- void endPaint() override;
- void setPBuffer(QGLPixelBuffer* pb);
- void setFbo(GLuint fbo);
-private:
- QGLPixelBuffer* pbuf;
-};
-
-class QGLPixelBufferPrivate {
- Q_DECLARE_PUBLIC(QGLPixelBuffer)
-public:
- QGLPixelBufferPrivate(QGLPixelBuffer *q) : q_ptr(q), invalid(true), qctx(nullptr), widget(nullptr), fbo(nullptr), blit_fbo(nullptr), pbuf(nullptr), ctx(nullptr)
- {
- }
- bool init(const QSize &size, const QGLFormat &f, QGLWidget *shareWidget);
- void common_init(const QSize &size, const QGLFormat &f, QGLWidget *shareWidget);
- bool cleanup();
-
- QGLPixelBuffer *q_ptr;
- bool invalid;
- QGLContext *qctx;
- QGLPBufferGLPaintDevice glDevice;
- QGLWidget *widget;
- QOpenGLFramebufferObject *fbo;
- QOpenGLFramebufferObject *blit_fbo;
- QGLFormat format;
-
- QGLFormat req_format;
- QPointer<QGLWidget> req_shareWidget;
- QSize req_size;
-
- //stubs
- void *pbuf;
- void *ctx;
-};
-
-QT_END_NAMESPACE
-
-#endif // QGLPIXELBUFFER_P_H
diff --git a/src/opengl/qglshaderprogram.cpp b/src/opengl/qglshaderprogram.cpp
deleted file mode 100644
index 35f60318be..0000000000
--- a/src/opengl/qglshaderprogram.cpp
+++ /dev/null
@@ -1,3237 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qglshaderprogram.h"
-#include <private/qopenglextensions_p.h>
-#include "qgl_p.h"
-#include <QtCore/private/qobject_p.h>
-#include <QtCore/qdebug.h>
-#include <QtCore/qfile.h>
-#include <QtCore/qvarlengtharray.h>
-#include <QtCore/qvector.h>
-#include <QDebug>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QGLShaderProgram
- \inmodule QtOpenGL
- \brief The QGLShaderProgram class allows OpenGL shader programs to be linked and used.
- \since 4.6
- \obsolete
- \ingroup painting-3D
-
- \section1 Introduction
-
- This class supports shader programs written in the OpenGL Shading
- Language (GLSL) and in the OpenGL/ES Shading Language (GLSL/ES).
-
- QGLShader and QGLShaderProgram shelter the programmer from the details of
- compiling and linking vertex and fragment shaders.
-
- The following example creates a vertex shader program using the
- supplied source \c{code}. Once compiled and linked, the shader
- program is activated in the current QGLContext by calling
- QGLShaderProgram::bind():
-
- \snippet code/src_opengl_qglshaderprogram.cpp 0
-
- \section1 Writing Portable Shaders
-
- Shader programs can be difficult to reuse across OpenGL implementations
- because of varying levels of support for standard vertex attributes and
- uniform variables. In particular, GLSL/ES lacks all of the
- standard variables that are present on desktop OpenGL systems:
- \c{gl_Vertex}, \c{gl_Normal}, \c{gl_Color}, and so on. Desktop OpenGL
- lacks the variable qualifiers \c{highp}, \c{mediump}, and \c{lowp}.
-
- The QGLShaderProgram class makes the process of writing portable shaders
- easier by prefixing all shader programs with the following lines on
- desktop OpenGL:
-
- \code
- #define highp
- #define mediump
- #define lowp
- \endcode
-
- This makes it possible to run most GLSL/ES shader programs
- on desktop systems. The programmer should restrict themselves
- to just features that are present in GLSL/ES, and avoid
- standard variable names that only work on the desktop.
-
- \section1 Simple Shader Example
-
- \snippet code/src_opengl_qglshaderprogram.cpp 1
-
- With the above shader program active, we can draw a green triangle
- as follows:
-
- \snippet code/src_opengl_qglshaderprogram.cpp 2
-
- \section1 Binary Shaders and Programs
-
- Binary shaders may be specified using \c{glShaderBinary()} on
- the return value from QGLShader::shaderId(). The QGLShader instance
- containing the binary can then be added to the shader program with
- addShader() and linked in the usual fashion with link().
-
- Binary programs may be specified using \c{glProgramBinaryOES()}
- on the return value from programId(). Then the application should
- call link(), which will notice that the program has already been
- specified and linked, allowing other operations to be performed
- on the shader program.
-
- \note This class has been deprecated in favor of QOpenGLShaderProgram.
-
- \sa QGLShader
-*/
-
-/*!
- \class QGLShader
- \inmodule QtOpenGL
- \brief The QGLShader class allows OpenGL shaders to be compiled.
- \since 4.6
- \obsolete
- \ingroup painting-3D
-
- This class supports shaders written in the OpenGL Shading Language (GLSL)
- and in the OpenGL/ES Shading Language (GLSL/ES).
-
- QGLShader and QGLShaderProgram shelter the programmer from the details of
- compiling and linking vertex and fragment shaders.
-
- \note This class has been deprecated in favor of QOpenGLShader.
-
- \sa QGLShaderProgram
-*/
-
-/*!
- \enum QGLShader::ShaderTypeBit
- This enum specifies the type of QGLShader that is being created.
-
- \value Vertex Vertex shader written in the OpenGL Shading Language (GLSL).
- \value Fragment Fragment shader written in the OpenGL Shading Language (GLSL).
- \value Geometry Geometry shaders written in the OpenGL Shading
- Language (GLSL), based on the GL_EXT_geometry_shader4 extension.
-*/
-
-#ifndef GL_FRAGMENT_SHADER
-#define GL_FRAGMENT_SHADER 0x8B30
-#endif
-#ifndef GL_VERTEX_SHADER
-#define GL_VERTEX_SHADER 0x8B31
-#endif
-#ifndef GL_COMPILE_STATUS
-#define GL_COMPILE_STATUS 0x8B81
-#endif
-#ifndef GL_LINK_STATUS
-#define GL_LINK_STATUS 0x8B82
-#endif
-#ifndef GL_INFO_LOG_LENGTH
-#define GL_INFO_LOG_LENGTH 0x8B84
-#endif
-#ifndef GL_ACTIVE_UNIFORMS
-#define GL_ACTIVE_UNIFORMS 0x8B86
-#endif
-#ifndef GL_ACTIVE_UNIFORM_MAX_LENGTH
-#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
-#endif
-#ifndef GL_ACTIVE_ATTRIBUTES
-#define GL_ACTIVE_ATTRIBUTES 0x8B89
-#endif
-#ifndef GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
-#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
-#endif
-#ifndef GL_CURRENT_VERTEX_ATTRIB
-#define GL_CURRENT_VERTEX_ATTRIB 0x8626
-#endif
-#ifndef GL_SHADER_SOURCE_LENGTH
-#define GL_SHADER_SOURCE_LENGTH 0x8B88
-#endif
-#ifndef GL_SHADER_BINARY_FORMATS
-#define GL_SHADER_BINARY_FORMATS 0x8DF8
-#endif
-#ifndef GL_NUM_SHADER_BINARY_FORMATS
-#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
-#endif
-
-class QGLShaderPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QGLShader)
-public:
- QGLShaderPrivate(const QGLContext *ctx, QGLShader::ShaderType type)
- : shaderGuard(0)
- , shaderType(type)
- , compiled(false)
- , glfuncs(new QOpenGLFunctions(ctx->contextHandle()))
- {
- }
- ~QGLShaderPrivate();
-
- QGLSharedResourceGuardBase *shaderGuard;
- QGLShader::ShaderType shaderType;
- bool compiled;
- QString log;
-
- QOpenGLFunctions *glfuncs;
-
- bool create();
- bool compile(QGLShader *q);
- void deleteShader();
-};
-
-namespace {
- void freeShaderFunc(QGLContext *ctx, GLuint id)
- {
- Q_ASSERT(ctx);
- ctx->contextHandle()->functions()->glDeleteShader(id);
- }
-}
-
-#define ctx QGLContext::currentContext()
-
-QGLShaderPrivate::~QGLShaderPrivate()
-{
- delete glfuncs;
- if (shaderGuard)
- shaderGuard->free();
-}
-
-bool QGLShaderPrivate::create()
-{
- QGLContext *context = const_cast<QGLContext *>(QGLContext::currentContext());
- if (!context)
- return false;
-
- if (glfuncs->hasOpenGLFeature(QOpenGLFunctions::Shaders)) {
- GLuint shader;
- if (shaderType == QGLShader::Vertex)
- shader = glfuncs->glCreateShader(GL_VERTEX_SHADER);
-#if !defined(QT_OPENGL_ES_2)
- else if (shaderType == QGLShader::Geometry
- && !context->contextHandle()->isOpenGLES())
- shader = glfuncs->glCreateShader(GL_GEOMETRY_SHADER_EXT);
-#endif
- else
- shader = glfuncs->glCreateShader(GL_FRAGMENT_SHADER);
- if (!shader) {
- qWarning("Could not create shader of type %d.", int(shaderType));
- return false;
- }
- shaderGuard = createSharedResourceGuard(context, shader, freeShaderFunc);
- return true;
- } else {
- return false;
- }
-}
-
-bool QGLShaderPrivate::compile(QGLShader *q)
-{
- GLuint shader = shaderGuard ? shaderGuard->id() : 0;
- if (!shader)
- return false;
- glfuncs->glCompileShader(shader);
- GLint value = 0;
- glfuncs->glGetShaderiv(shader, GL_COMPILE_STATUS, &value);
- compiled = (value != 0);
- value = 0;
- glfuncs->glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &value);
- if (!compiled && value > 1) {
- char *logbuf = new char [value];
- GLint len;
- glfuncs->glGetShaderInfoLog(shader, value, &len, logbuf);
- log = QString::fromLatin1(logbuf);
- QString name = q->objectName();
-
- const char *types[] = {
- "Fragment",
- "Vertex",
- "Geometry",
- ""
- };
-
- const char *type = types[3];
- if (shaderType == QGLShader::Fragment)
- type = types[0];
- else if (shaderType == QGLShader::Vertex)
- type = types[1];
- else if (shaderType == QGLShader::Geometry)
- type = types[2];
-
- if (name.isEmpty())
- qWarning("QGLShader::compile(%s): %s", type, qPrintable(log));
- else
- qWarning("QGLShader::compile(%s)[%s]: %s", type, qPrintable(name), qPrintable(log));
-
- delete [] logbuf;
- }
- return compiled;
-}
-
-void QGLShaderPrivate::deleteShader()
-{
- if (shaderGuard) {
- shaderGuard->free();
- shaderGuard = 0;
- }
-}
-
-/*!
- Constructs a new QGLShader object of the specified \a type
- and attaches it to \a parent. If shader programs are not supported,
- QGLShaderProgram::hasOpenGLShaderPrograms() will return false.
-
- This constructor is normally followed by a call to compileSourceCode()
- or compileSourceFile().
-
- The shader will be associated with the current QGLContext.
-
- \sa compileSourceCode(), compileSourceFile()
-*/
-QGLShader::QGLShader(QGLShader::ShaderType type, QObject *parent)
- : QObject(*new QGLShaderPrivate(QGLContext::currentContext(), type), parent)
-{
- Q_D(QGLShader);
- d->create();
-}
-
-/*!
- Constructs a new QGLShader object of the specified \a type
- and attaches it to \a parent. If shader programs are not supported,
- then QGLShaderProgram::hasOpenGLShaderPrograms() will return false.
-
- This constructor is normally followed by a call to compileSourceCode()
- or compileSourceFile().
-
- The shader will be associated with \a context.
-
- \sa compileSourceCode(), compileSourceFile()
-*/
-QGLShader::QGLShader(QGLShader::ShaderType type, const QGLContext *context, QObject *parent)
- : QObject(*new QGLShaderPrivate(context ? context : QGLContext::currentContext(), type), parent)
-{
- Q_D(QGLShader);
-#ifndef QT_NO_DEBUG
- if (context && !QGLContext::areSharing(context, QGLContext::currentContext())) {
- qWarning("QGLShader::QGLShader: \'context\' must be the current context or sharing with it.");
- return;
- }
-#endif
- d->create();
-}
-
-/*!
- Deletes this shader. If the shader has been attached to a
- QGLShaderProgram object, then the actual shader will stay around
- until the QGLShaderProgram is destroyed.
-*/
-QGLShader::~QGLShader()
-{
-}
-
-/*!
- Returns the type of this shader.
-*/
-QGLShader::ShaderType QGLShader::shaderType() const
-{
- Q_D(const QGLShader);
- return d->shaderType;
-}
-
-// The precision qualifiers are useful on OpenGL/ES systems,
-// but usually not present on desktop systems. Define the
-// keywords to empty strings on desktop systems.
-#if !defined(QT_OPENGL_ES) || defined(QT_OPENGL_FORCE_SHADER_DEFINES)
-#define QGL_DEFINE_QUALIFIERS 1
-static const char qualifierDefines[] =
- "#define lowp\n"
- "#define mediump\n"
- "#define highp\n";
-
-#else
-
-// The "highp" qualifier doesn't exist in fragment shaders
-// on all ES platforms. When it doesn't exist, use "mediump".
-#define QGL_REDEFINE_HIGHP 1
-static const char redefineHighp[] =
- "#ifndef GL_FRAGMENT_PRECISION_HIGH\n"
- "#define highp mediump\n"
- "#endif\n";
-#endif
-
-/*!
- Sets the \a source code for this shader and compiles it.
- Returns \c true if the source was successfully compiled, false otherwise.
-
- \sa compileSourceFile()
-*/
-bool QGLShader::compileSourceCode(const char *source)
-{
- Q_D(QGLShader);
- if (d->shaderGuard && d->shaderGuard->id()) {
- QVarLengthArray<const char *, 4> src;
- QVarLengthArray<GLint, 4> srclen;
- int headerLen = 0;
- while (source && source[headerLen] == '#') {
- // Skip #version and #extension directives at the start of
- // the shader code. We need to insert the qualifierDefines
- // and redefineHighp just after them.
- if (qstrncmp(source + headerLen, "#version", 8) != 0 &&
- qstrncmp(source + headerLen, "#extension", 10) != 0) {
- break;
- }
- while (source[headerLen] != '\0' && source[headerLen] != '\n')
- ++headerLen;
- if (source[headerLen] == '\n')
- ++headerLen;
- }
- if (headerLen > 0) {
- src.append(source);
- srclen.append(GLint(headerLen));
- }
-#ifdef QGL_DEFINE_QUALIFIERS
- if (!QOpenGLContext::currentContext()->isOpenGLES()) {
- src.append(qualifierDefines);
- srclen.append(GLint(sizeof(qualifierDefines) - 1));
- }
-#endif
-#ifdef QGL_REDEFINE_HIGHP
- if (d->shaderType == Fragment
- && QOpenGLContext::currentContext()->isOpenGLES()) {
- src.append(redefineHighp);
- srclen.append(GLint(sizeof(redefineHighp) - 1));
- }
-#endif
- src.append(source + headerLen);
- srclen.append(GLint(qstrlen(source + headerLen)));
- d->glfuncs->glShaderSource(d->shaderGuard->id(), src.size(), src.data(), srclen.data());
- return d->compile(this);
- } else {
- return false;
- }
-}
-
-/*!
- \overload
-
- Sets the \a source code for this shader and compiles it.
- Returns \c true if the source was successfully compiled, false otherwise.
-
- \sa compileSourceFile()
-*/
-bool QGLShader::compileSourceCode(const QByteArray& source)
-{
- return compileSourceCode(source.constData());
-}
-
-/*!
- \overload
-
- Sets the \a source code for this shader and compiles it.
- Returns \c true if the source was successfully compiled, false otherwise.
-
- \sa compileSourceFile()
-*/
-bool QGLShader::compileSourceCode(const QString& source)
-{
- return compileSourceCode(source.toLatin1().constData());
-}
-
-/*!
- Sets the source code for this shader to the contents of \a fileName
- and compiles it. Returns \c true if the file could be opened and the
- source compiled, false otherwise.
-
- \sa compileSourceCode()
-*/
-bool QGLShader::compileSourceFile(const QString& fileName)
-{
- QFile file(fileName);
- if (!file.open(QFile::ReadOnly)) {
- qWarning() << "QGLShader: Unable to open file" << fileName;
- return false;
- }
-
- QByteArray contents = file.readAll();
- return compileSourceCode(contents.constData());
-}
-
-/*!
- Returns the source code for this shader.
-
- \sa compileSourceCode()
-*/
-QByteArray QGLShader::sourceCode() const
-{
- Q_D(const QGLShader);
- GLuint shader = d->shaderGuard ? d->shaderGuard->id() : 0;
- if (!shader)
- return QByteArray();
- GLint size = 0;
- d->glfuncs->glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &size);
- if (size <= 0)
- return QByteArray();
- GLint len = 0;
- char *source = new char [size];
- d->glfuncs->glGetShaderSource(shader, size, &len, source);
- QByteArray src(source);
- delete [] source;
- return src;
-}
-
-/*!
- Returns \c true if this shader has been compiled; false otherwise.
-
- \sa compileSourceCode(), compileSourceFile()
-*/
-bool QGLShader::isCompiled() const
-{
- Q_D(const QGLShader);
- return d->compiled;
-}
-
-/*!
- Returns the errors and warnings that occurred during the last compile.
-
- \sa compileSourceCode(), compileSourceFile()
-*/
-QString QGLShader::log() const
-{
- Q_D(const QGLShader);
- return d->log;
-}
-
-/*!
- Returns the OpenGL identifier associated with this shader.
-
- \sa QGLShaderProgram::programId()
-*/
-GLuint QGLShader::shaderId() const
-{
- Q_D(const QGLShader);
- return d->shaderGuard ? d->shaderGuard->id() : 0;
-}
-
-#undef ctx
-
-class ShaderProgramOpenGLFunctions : public QOpenGLFunctions
-{
-public:
- ShaderProgramOpenGLFunctions()
- : QOpenGLFunctions()
- , glProgramParameteri(0)
- {
- }
-
- typedef void (QOPENGLF_APIENTRYP type_glProgramParameteri)(GLuint program, GLenum pname, GLint value);
-
- void initializeGeometryShaderFunctions()
- {
- QOpenGLContext *context = QOpenGLContext::currentContext();
- if (!context->isOpenGLES()) {
- glProgramParameteri = (type_glProgramParameteri)
- context->getProcAddress("glProgramParameteri");
-
- if (!glProgramParameteri) {
- glProgramParameteri = (type_glProgramParameteri)
- context->getProcAddress("glProgramParameteriEXT");
- }
- }
- }
-
- type_glProgramParameteri glProgramParameteri;
-};
-
-class QGLShaderProgramPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QGLShaderProgram)
-public:
- QGLShaderProgramPrivate(const QGLContext *)
- : programGuard(0)
- , linked(false)
- , inited(false)
- , removingShaders(false)
- , geometryVertexCount(64)
- , geometryInputType(0)
- , geometryOutputType(0)
- , glfuncs(new ShaderProgramOpenGLFunctions)
- {
- }
- ~QGLShaderProgramPrivate();
-
- QGLSharedResourceGuardBase *programGuard;
- bool linked;
- bool inited;
- bool removingShaders;
-
- int geometryVertexCount;
- GLenum geometryInputType;
- GLenum geometryOutputType;
-
- QString log;
- QList<QGLShader *> shaders;
- QList<QGLShader *> anonShaders;
-
- ShaderProgramOpenGLFunctions *glfuncs;
-
- bool hasShader(QGLShader::ShaderType type) const;
-};
-
-namespace {
- void freeProgramFunc(QGLContext *ctx, GLuint id)
- {
- Q_ASSERT(ctx);
- ctx->contextHandle()->functions()->glDeleteProgram(id);
- }
-}
-
-
-QGLShaderProgramPrivate::~QGLShaderProgramPrivate()
-{
- delete glfuncs;
- if (programGuard)
- programGuard->free();
-}
-
-bool QGLShaderProgramPrivate::hasShader(QGLShader::ShaderType type) const
-{
- for (QGLShader *shader : shaders) {
- if (shader->shaderType() == type)
- return true;
- }
- return false;
-}
-
-#define ctx QGLContext::currentContext()
-
-/*!
- Constructs a new shader program and attaches it to \a parent.
- The program will be invalid until addShader() is called.
-
- The shader program will be associated with the current QGLContext.
-
- \sa addShader()
-*/
-QGLShaderProgram::QGLShaderProgram(QObject *parent)
- : QObject(*new QGLShaderProgramPrivate(QGLContext::currentContext()), parent)
-{
-}
-
-/*!
- Constructs a new shader program and attaches it to \a parent.
- The program will be invalid until addShader() is called.
-
- The shader program will be associated with \a context.
-
- \sa addShader()
-*/
-QGLShaderProgram::QGLShaderProgram(const QGLContext *context, QObject *parent)
- : QObject(*new QGLShaderProgramPrivate(context), parent)
-{
-}
-
-/*!
- Deletes this shader program.
-*/
-QGLShaderProgram::~QGLShaderProgram()
-{
-}
-
-bool QGLShaderProgram::init()
-{
- Q_D(QGLShaderProgram);
- if ((d->programGuard && d->programGuard->id()) || d->inited)
- return true;
- d->inited = true;
- QGLContext *context = const_cast<QGLContext *>(QGLContext::currentContext());
- if (!context)
- return false;
- d->glfuncs->initializeOpenGLFunctions();
- d->glfuncs->initializeGeometryShaderFunctions();
- if (d->glfuncs->hasOpenGLFeature(QOpenGLFunctions::Shaders)) {
- GLuint program = d->glfuncs->glCreateProgram();
- if (!program) {
- qWarning("QGLShaderProgram: could not create shader program");
- return false;
- }
- if (d->programGuard)
- delete d->programGuard;
- d->programGuard = createSharedResourceGuard(context, program, freeProgramFunc);
- return true;
- } else {
- qWarning("QGLShaderProgram: shader programs are not supported");
- return false;
- }
-}
-
-/*!
- Adds a compiled \a shader to this shader program. Returns \c true
- if the shader could be added, or false otherwise.
-
- Ownership of the \a shader object remains with the caller.
- It will not be deleted when this QGLShaderProgram instance
- is deleted. This allows the caller to add the same shader
- to multiple shader programs.
-
- \sa addShaderFromSourceCode(), addShaderFromSourceFile()
- \sa removeShader(), link(), removeAllShaders()
-*/
-bool QGLShaderProgram::addShader(QGLShader *shader)
-{
- Q_D(QGLShaderProgram);
- if (!init())
- return false;
- if (d->shaders.contains(shader))
- return true; // Already added to this shader program.
- if (d->programGuard && d->programGuard->id() && shader) {
- if (!shader->d_func()->shaderGuard || !shader->d_func()->shaderGuard->id())
- return false;
- if (d->programGuard->group() != shader->d_func()->shaderGuard->group()) {
- qWarning("QGLShaderProgram::addShader: Program and shader are not associated with same context.");
- return false;
- }
- d->glfuncs->glAttachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
- d->linked = false; // Program needs to be relinked.
- d->shaders.append(shader);
- connect(shader, SIGNAL(destroyed()), this, SLOT(shaderDestroyed()));
- return true;
- } else {
- return false;
- }
-}
-
-/*!
- Compiles \a source as a shader of the specified \a type and
- adds it to this shader program. Returns \c true if compilation
- was successful, false otherwise. The compilation errors
- and warnings will be made available via log().
-
- This function is intended to be a short-cut for quickly
- adding vertex and fragment shaders to a shader program without
- creating an instance of QGLShader first.
-
- \sa addShader(), addShaderFromSourceFile()
- \sa removeShader(), link(), log(), removeAllShaders()
-*/
-bool QGLShaderProgram::addShaderFromSourceCode(QGLShader::ShaderType type, const char *source)
-{
- Q_D(QGLShaderProgram);
- if (!init())
- return false;
- QGLShader *shader = new QGLShader(type, this);
- if (!shader->compileSourceCode(source)) {
- d->log = shader->log();
- delete shader;
- return false;
- }
- d->anonShaders.append(shader);
- return addShader(shader);
-}
-
-/*!
- \overload
-
- Compiles \a source as a shader of the specified \a type and
- adds it to this shader program. Returns \c true if compilation
- was successful, false otherwise. The compilation errors
- and warnings will be made available via log().
-
- This function is intended to be a short-cut for quickly
- adding vertex and fragment shaders to a shader program without
- creating an instance of QGLShader first.
-
- \sa addShader(), addShaderFromSourceFile()
- \sa removeShader(), link(), log(), removeAllShaders()
-*/
-bool QGLShaderProgram::addShaderFromSourceCode(QGLShader::ShaderType type, const QByteArray& source)
-{
- return addShaderFromSourceCode(type, source.constData());
-}
-
-/*!
- \overload
-
- Compiles \a source as a shader of the specified \a type and
- adds it to this shader program. Returns \c true if compilation
- was successful, false otherwise. The compilation errors
- and warnings will be made available via log().
-
- This function is intended to be a short-cut for quickly
- adding vertex and fragment shaders to a shader program without
- creating an instance of QGLShader first.
-
- \sa addShader(), addShaderFromSourceFile()
- \sa removeShader(), link(), log(), removeAllShaders()
-*/
-bool QGLShaderProgram::addShaderFromSourceCode(QGLShader::ShaderType type, const QString& source)
-{
- return addShaderFromSourceCode(type, source.toLatin1().constData());
-}
-
-/*!
- Compiles the contents of \a fileName as a shader of the specified
- \a type and adds it to this shader program. Returns \c true if
- compilation was successful, false otherwise. The compilation errors
- and warnings will be made available via log().
-
- This function is intended to be a short-cut for quickly
- adding vertex and fragment shaders to a shader program without
- creating an instance of QGLShader first.
-
- \sa addShader(), addShaderFromSourceCode()
-*/
-bool QGLShaderProgram::addShaderFromSourceFile
- (QGLShader::ShaderType type, const QString& fileName)
-{
- Q_D(QGLShaderProgram);
- if (!init())
- return false;
- QGLShader *shader = new QGLShader(type, this);
- if (!shader->compileSourceFile(fileName)) {
- d->log = shader->log();
- delete shader;
- return false;
- }
- d->anonShaders.append(shader);
- return addShader(shader);
-}
-
-/*!
- Removes \a shader from this shader program. The object is not deleted.
-
- The shader program must be valid in the current QGLContext.
-
- \sa addShader(), link(), removeAllShaders()
-*/
-void QGLShaderProgram::removeShader(QGLShader *shader)
-{
- Q_D(QGLShaderProgram);
- if (d->programGuard && d->programGuard->id()
- && shader && shader->d_func()->shaderGuard)
- {
- d->glfuncs->glDetachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
- }
- d->linked = false; // Program needs to be relinked.
- if (shader) {
- d->shaders.removeAll(shader);
- d->anonShaders.removeAll(shader);
- disconnect(shader, SIGNAL(destroyed()), this, SLOT(shaderDestroyed()));
- }
-}
-
-/*!
- Returns a list of all shaders that have been added to this shader
- program using addShader().
-
- \sa addShader(), removeShader()
-*/
-QList<QGLShader *> QGLShaderProgram::shaders() const
-{
- Q_D(const QGLShaderProgram);
- return d->shaders;
-}
-
-/*!
- Removes all of the shaders that were added to this program previously.
- The QGLShader objects for the shaders will not be deleted if they
- were constructed externally. QGLShader objects that are constructed
- internally by QGLShaderProgram will be deleted.
-
- \sa addShader(), removeShader()
-*/
-void QGLShaderProgram::removeAllShaders()
-{
- Q_D(QGLShaderProgram);
- d->removingShaders = true;
- if (d->programGuard) {
- if (const auto programGuardId = d->programGuard->id()) {
- for (QGLShader *shader : qAsConst(d->shaders)) {
- if (shader && shader->d_func()->shaderGuard)
- d->glfuncs->glDetachShader(programGuardId, shader->d_func()->shaderGuard->id());
- }
- }
- }
- // Delete shader objects that were created anonymously.
- qDeleteAll(d->anonShaders);
- d->shaders.clear();
- d->anonShaders.clear();
- d->linked = false; // Program needs to be relinked.
- d->removingShaders = false;
-}
-
-/*!
- Links together the shaders that were added to this program with
- addShader(). Returns \c true if the link was successful or
- false otherwise. If the link failed, the error messages can
- be retrieved with log().
-
- Subclasses can override this function to initialize attributes
- and uniform variables for use in specific shader programs.
-
- If the shader program was already linked, calling this
- function again will force it to be re-linked.
-
- \sa addShader(), log()
-*/
-bool QGLShaderProgram::link()
-{
- Q_D(QGLShaderProgram);
- GLuint program = d->programGuard ? d->programGuard->id() : 0;
- if (!program)
- return false;
-
- GLint value;
- if (d->shaders.isEmpty()) {
- // If there are no explicit shaders, then it is possible that the
- // application added a program binary with glProgramBinaryOES(),
- // or otherwise populated the shaders itself. Check to see if the
- // program is already linked and bail out if so.
- value = 0;
- d->glfuncs->glGetProgramiv(program, GL_LINK_STATUS, &value);
- d->linked = (value != 0);
- if (d->linked)
- return true;
- }
-
-#if !defined(QT_OPENGL_ES_2)
- // Set up the geometry shader parameters
- if (!QOpenGLContext::currentContext()->isOpenGLES()
- && d->glfuncs->glProgramParameteri) {
- for (QGLShader *shader : qAsConst(d->shaders)) {
- if (shader->shaderType() & QGLShader::Geometry) {
- d->glfuncs->glProgramParameteri(program, GL_GEOMETRY_INPUT_TYPE_EXT,
- d->geometryInputType);
- d->glfuncs->glProgramParameteri(program, GL_GEOMETRY_OUTPUT_TYPE_EXT,
- d->geometryOutputType);
- d->glfuncs->glProgramParameteri(program, GL_GEOMETRY_VERTICES_OUT_EXT,
- d->geometryVertexCount);
- break;
- }
- }
- }
-#endif
-
- d->glfuncs->glLinkProgram(program);
- value = 0;
- d->glfuncs->glGetProgramiv(program, GL_LINK_STATUS, &value);
- d->linked = (value != 0);
- value = 0;
- d->glfuncs->glGetProgramiv(program, GL_INFO_LOG_LENGTH, &value);
- d->log = QString();
- if (value > 1) {
- char *logbuf = new char [value];
- GLint len;
- d->glfuncs->glGetProgramInfoLog(program, value, &len, logbuf);
- d->log = QString::fromLatin1(logbuf);
- QString name = objectName();
- if (!d->linked) {
- if (name.isEmpty())
- qWarning() << "QGLShader::link:" << d->log;
- else
- qWarning() << "QGLShader::link[" << name << "]:" << d->log;
- }
- delete [] logbuf;
- }
- return d->linked;
-}
-
-/*!
- Returns \c true if this shader program has been linked; false otherwise.
-
- \sa link()
-*/
-bool QGLShaderProgram::isLinked() const
-{
- Q_D(const QGLShaderProgram);
- return d->linked;
-}
-
-/*!
- Returns the errors and warnings that occurred during the last link()
- or addShader() with explicitly specified source code.
-
- \sa link()
-*/
-QString QGLShaderProgram::log() const
-{
- Q_D(const QGLShaderProgram);
- return d->log;
-}
-
-/*!
- Binds this shader program to the active QGLContext and makes
- it the current shader program. Any previously bound shader program
- is released. This is equivalent to calling \c{glUseProgram()} on
- programId(). Returns \c true if the program was successfully bound;
- false otherwise. If the shader program has not yet been linked,
- or it needs to be re-linked, this function will call link().
-
- \sa link(), release()
-*/
-bool QGLShaderProgram::bind()
-{
- Q_D(QGLShaderProgram);
- GLuint program = d->programGuard ? d->programGuard->id() : 0;
- if (!program)
- return false;
- if (!d->linked && !link())
- return false;
-#ifndef QT_NO_DEBUG
- if (d->programGuard->group() != QOpenGLContextGroup::currentContextGroup()) {
- qWarning("QGLShaderProgram::bind: program is not valid in the current context.");
- return false;
- }
-#endif
- d->glfuncs->glUseProgram(program);
- return true;
-}
-
-#undef ctx
-#define ctx QGLContext::currentContext()
-
-/*!
- Releases the active shader program from the current QGLContext.
- This is equivalent to calling \c{glUseProgram(0)}.
-
- \sa bind()
-*/
-void QGLShaderProgram::release()
-{
- Q_D(QGLShaderProgram);
-#ifndef QT_NO_DEBUG
- if (d->programGuard && d->programGuard->group() != QOpenGLContextGroup::currentContextGroup())
- qWarning("QGLShaderProgram::release: program is not valid in the current context.");
-#endif
- d->glfuncs->glUseProgram(0);
-}
-
-/*!
- Returns the OpenGL identifier associated with this shader program.
-
- \sa QGLShader::shaderId()
-*/
-GLuint QGLShaderProgram::programId() const
-{
- Q_D(const QGLShaderProgram);
- GLuint id = d->programGuard ? d->programGuard->id() : 0;
- if (id)
- return id;
-
- // Create the identifier if we don't have one yet. This is for
- // applications that want to create the attached shader configuration
- // themselves, particularly those using program binaries.
- if (!const_cast<QGLShaderProgram *>(this)->init())
- return 0;
- return d->programGuard ? d->programGuard->id() : 0;
-}
-
-/*!
- Binds the attribute \a name to the specified \a location. This
- function can be called before or after the program has been linked.
- Any attributes that have not been explicitly bound when the program
- is linked will be assigned locations automatically.
-
- When this function is called after the program has been linked,
- the program will need to be relinked for the change to take effect.
-
- \sa attributeLocation()
-*/
-void QGLShaderProgram::bindAttributeLocation(const char *name, int location)
-{
- Q_D(QGLShaderProgram);
- if (!init() || !d->programGuard || !d->programGuard->id())
- return;
- d->glfuncs->glBindAttribLocation(d->programGuard->id(), location, name);
- d->linked = false; // Program needs to be relinked.
-}
-
-/*!
- \overload
-
- Binds the attribute \a name to the specified \a location. This
- function can be called before or after the program has been linked.
- Any attributes that have not been explicitly bound when the program
- is linked will be assigned locations automatically.
-
- When this function is called after the program has been linked,
- the program will need to be relinked for the change to take effect.
-
- \sa attributeLocation()
-*/
-void QGLShaderProgram::bindAttributeLocation(const QByteArray& name, int location)
-{
- bindAttributeLocation(name.constData(), location);
-}
-
-/*!
- \overload
-
- Binds the attribute \a name to the specified \a location. This
- function can be called before or after the program has been linked.
- Any attributes that have not been explicitly bound when the program
- is linked will be assigned locations automatically.
-
- When this function is called after the program has been linked,
- the program will need to be relinked for the change to take effect.
-
- \sa attributeLocation()
-*/
-void QGLShaderProgram::bindAttributeLocation(const QString& name, int location)
-{
- bindAttributeLocation(name.toLatin1().constData(), location);
-}
-
-/*!
- Returns the location of the attribute \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- attribute for this shader program.
-
- \sa uniformLocation(), bindAttributeLocation()
-*/
-int QGLShaderProgram::attributeLocation(const char *name) const
-{
- Q_D(const QGLShaderProgram);
- if (d->linked && d->programGuard && d->programGuard->id()) {
- return d->glfuncs->glGetAttribLocation(d->programGuard->id(), name);
- } else {
- qWarning() << "QGLShaderProgram::attributeLocation(" << name
- << "): shader program is not linked";
- return -1;
- }
-}
-
-/*!
- \overload
-
- Returns the location of the attribute \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- attribute for this shader program.
-
- \sa uniformLocation(), bindAttributeLocation()
-*/
-int QGLShaderProgram::attributeLocation(const QByteArray& name) const
-{
- return attributeLocation(name.constData());
-}
-
-/*!
- \overload
-
- Returns the location of the attribute \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- attribute for this shader program.
-
- \sa uniformLocation(), bindAttributeLocation()
-*/
-int QGLShaderProgram::attributeLocation(const QString& name) const
-{
- return attributeLocation(name.toLatin1().constData());
-}
-
-/*!
- Sets the attribute at \a location in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(int location, GLfloat value)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glVertexAttrib1fv(location, &value);
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(const char *name, GLfloat value)
-{
- setAttributeValue(attributeLocation(name), value);
-}
-
-/*!
- Sets the attribute at \a location in the current context to
- the 2D vector (\a x, \a y).
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(int location, GLfloat x, GLfloat y)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[2] = {x, y};
- d->glfuncs->glVertexAttrib2fv(location, values);
- }
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to
- the 2D vector (\a x, \a y).
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(const char *name, GLfloat x, GLfloat y)
-{
- setAttributeValue(attributeLocation(name), x, y);
-}
-
-/*!
- Sets the attribute at \a location in the current context to
- the 3D vector (\a x, \a y, \a z).
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue
- (int location, GLfloat x, GLfloat y, GLfloat z)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[3] = {x, y, z};
- d->glfuncs->glVertexAttrib3fv(location, values);
- }
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to
- the 3D vector (\a x, \a y, \a z).
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue
- (const char *name, GLfloat x, GLfloat y, GLfloat z)
-{
- setAttributeValue(attributeLocation(name), x, y, z);
-}
-
-/*!
- Sets the attribute at \a location in the current context to
- the 4D vector (\a x, \a y, \a z, \a w).
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue
- (int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {x, y, z, w};
- d->glfuncs->glVertexAttrib4fv(location, values);
- }
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to
- the 4D vector (\a x, \a y, \a z, \a w).
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue
- (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- setAttributeValue(attributeLocation(name), x, y, z, w);
-}
-
-/*!
- Sets the attribute at \a location in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(int location, const QVector2D& value)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glVertexAttrib2fv(location, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(const char *name, const QVector2D& value)
-{
- setAttributeValue(attributeLocation(name), value);
-}
-
-/*!
- Sets the attribute at \a location in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(int location, const QVector3D& value)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glVertexAttrib3fv(location, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(const char *name, const QVector3D& value)
-{
- setAttributeValue(attributeLocation(name), value);
-}
-
-/*!
- Sets the attribute at \a location in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(int location, const QVector4D& value)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glVertexAttrib4fv(location, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(const char *name, const QVector4D& value)
-{
- setAttributeValue(attributeLocation(name), value);
-}
-
-/*!
- Sets the attribute at \a location in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(int location, const QColor& value)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(value.redF()), GLfloat(value.greenF()),
- GLfloat(value.blueF()), GLfloat(value.alphaF())};
- d->glfuncs->glVertexAttrib4fv(location, values);
- }
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to \a value.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue(const char *name, const QColor& value)
-{
- setAttributeValue(attributeLocation(name), value);
-}
-
-/*!
- Sets the attribute at \a location in the current context to the
- contents of \a values, which contains \a columns elements, each
- consisting of \a rows elements. The \a rows value should be
- 1, 2, 3, or 4. This function is typically used to set matrix
- values and column vectors.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue
- (int location, const GLfloat *values, int columns, int rows)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (rows < 1 || rows > 4) {
- qWarning() << "QGLShaderProgram::setAttributeValue: rows" << rows << "not supported";
- return;
- }
- if (location != -1) {
- while (columns-- > 0) {
- if (rows == 1)
- d->glfuncs->glVertexAttrib1fv(location, values);
- else if (rows == 2)
- d->glfuncs->glVertexAttrib2fv(location, values);
- else if (rows == 3)
- d->glfuncs->glVertexAttrib3fv(location, values);
- else
- d->glfuncs->glVertexAttrib4fv(location, values);
- values += rows;
- ++location;
- }
- }
-}
-
-/*!
- \overload
-
- Sets the attribute called \a name in the current context to the
- contents of \a values, which contains \a columns elements, each
- consisting of \a rows elements. The \a rows value should be
- 1, 2, 3, or 4. This function is typically used to set matrix
- values and column vectors.
-
- \sa setUniformValue()
-*/
-void QGLShaderProgram::setAttributeValue
- (const char *name, const GLfloat *values, int columns, int rows)
-{
- setAttributeValue(attributeLocation(name), values, columns, rows);
-}
-
-/*!
- Sets an array of vertex \a values on the attribute at \a location
- in this shader program. The \a tupleSize indicates the number of
- components per vertex (1, 2, 3, or 4), and the \a stride indicates
- the number of bytes between vertices. A default \a stride value
- of zero indicates that the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QGLShaderProgram::setAttributeArray
- (int location, const GLfloat *values, int tupleSize, int stride)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, tupleSize, GL_FLOAT, GL_FALSE,
- stride, values);
- }
-}
-
-/*!
- Sets an array of 2D vertex \a values on the attribute at \a location
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QGLShaderProgram::setAttributeArray
- (int location, const QVector2D *values, int stride)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE,
- stride, values);
- }
-}
-
-/*!
- Sets an array of 3D vertex \a values on the attribute at \a location
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QGLShaderProgram::setAttributeArray
- (int location, const QVector3D *values, int stride)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, 3, GL_FLOAT, GL_FALSE,
- stride, values);
- }
-}
-
-/*!
- Sets an array of 4D vertex \a values on the attribute at \a location
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QGLShaderProgram::setAttributeArray
- (int location, const QVector4D *values, int stride)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, 4, GL_FLOAT, GL_FALSE,
- stride, values);
- }
-}
-
-/*!
- Sets an array of vertex \a values on the attribute at \a location
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The \a type indicates the type of elements in the \a values array,
- usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a tupleSize
- indicates the number of components per vertex: 1, 2, 3, or 4.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- The setAttributeBuffer() function can be used to set the attribute
- array to an offset within a vertex buffer.
-
- \note Normalization will be enabled. If this is not desired, call
- glVertexAttribPointer directly through QGLFunctions.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray(), setAttributeBuffer()
- \since 4.7
-*/
-void QGLShaderProgram::setAttributeArray
- (int location, GLenum type, const void *values, int tupleSize, int stride)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, tupleSize, type, GL_TRUE,
- stride, values);
- }
-}
-
-/*!
- \overload
-
- Sets an array of vertex \a values on the attribute called \a name
- in this shader program. The \a tupleSize indicates the number of
- components per vertex (1, 2, 3, or 4), and the \a stride indicates
- the number of bytes between vertices. A default \a stride value
- of zero indicates that the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on \a name. Otherwise the value specified with setAttributeValue()
- for \a name will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QGLShaderProgram::setAttributeArray
- (const char *name, const GLfloat *values, int tupleSize, int stride)
-{
- setAttributeArray(attributeLocation(name), values, tupleSize, stride);
-}
-
-/*!
- \overload
-
- Sets an array of 2D vertex \a values on the attribute called \a name
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on \a name. Otherwise the value specified with setAttributeValue()
- for \a name will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QGLShaderProgram::setAttributeArray
- (const char *name, const QVector2D *values, int stride)
-{
- setAttributeArray(attributeLocation(name), values, stride);
-}
-
-/*!
- \overload
-
- Sets an array of 3D vertex \a values on the attribute called \a name
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on \a name. Otherwise the value specified with setAttributeValue()
- for \a name will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QGLShaderProgram::setAttributeArray
- (const char *name, const QVector3D *values, int stride)
-{
- setAttributeArray(attributeLocation(name), values, stride);
-}
-
-/*!
- \overload
-
- Sets an array of 4D vertex \a values on the attribute called \a name
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The array will become active when enableAttributeArray() is called
- on \a name. Otherwise the value specified with setAttributeValue()
- for \a name will be used.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray()
-*/
-void QGLShaderProgram::setAttributeArray
- (const char *name, const QVector4D *values, int stride)
-{
- setAttributeArray(attributeLocation(name), values, stride);
-}
-
-/*!
- \overload
-
- Sets an array of vertex \a values on the attribute called \a name
- in this shader program. The \a stride indicates the number of bytes
- between vertices. A default \a stride value of zero indicates that
- the vertices are densely packed in \a values.
-
- The \a type indicates the type of elements in the \a values array,
- usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a tupleSize
- indicates the number of components per vertex: 1, 2, 3, or 4.
-
- The array will become active when enableAttributeArray() is called
- on the \a name. Otherwise the value specified with
- setAttributeValue() for \a name will be used.
-
- The setAttributeBuffer() function can be used to set the attribute
- array to an offset within a vertex buffer.
-
- \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
- \sa disableAttributeArray(), setAttributeBuffer()
- \since 4.7
-*/
-void QGLShaderProgram::setAttributeArray
- (const char *name, GLenum type, const void *values, int tupleSize, int stride)
-{
- setAttributeArray(attributeLocation(name), type, values, tupleSize, stride);
-}
-
-/*!
- Sets an array of vertex values on the attribute at \a location in
- this shader program, starting at a specific \a offset in the
- currently bound vertex buffer. The \a stride indicates the number
- of bytes between vertices. A default \a stride value of zero
- indicates that the vertices are densely packed in the value array.
-
- The \a type indicates the type of elements in the vertex value
- array, usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a
- tupleSize indicates the number of components per vertex: 1, 2, 3,
- or 4.
-
- The array will become active when enableAttributeArray() is called
- on the \a location. Otherwise the value specified with
- setAttributeValue() for \a location will be used.
-
- \note Normalization will be enabled. If this is not desired, call
- glVertexAttribPointer directly though QGLFunctions.
-
- \sa setAttributeArray()
- \since 4.7
-*/
-void QGLShaderProgram::setAttributeBuffer
- (int location, GLenum type, int offset, int tupleSize, int stride)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- d->glfuncs->glVertexAttribPointer(location, tupleSize, type, GL_TRUE, stride,
- reinterpret_cast<const void *>(qintptr(offset)));
- }
-}
-
-/*!
- \overload
-
- Sets an array of vertex values on the attribute called \a name
- in this shader program, starting at a specific \a offset in the
- currently bound vertex buffer. The \a stride indicates the number
- of bytes between vertices. A default \a stride value of zero
- indicates that the vertices are densely packed in the value array.
-
- The \a type indicates the type of elements in the vertex value
- array, usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a
- tupleSize indicates the number of components per vertex: 1, 2, 3,
- or 4.
-
- The array will become active when enableAttributeArray() is called
- on the \a name. Otherwise the value specified with
- setAttributeValue() for \a name will be used.
-
- \sa setAttributeArray()
- \since 4.7
-*/
-void QGLShaderProgram::setAttributeBuffer
- (const char *name, GLenum type, int offset, int tupleSize, int stride)
-{
- setAttributeBuffer(attributeLocation(name), type, offset, tupleSize, stride);
-}
-
-/*!
- Enables the vertex array at \a location in this shader program
- so that the value set by setAttributeArray() on \a location
- will be used by the shader program.
-
- \sa disableAttributeArray(), setAttributeArray(), setAttributeValue()
- \sa setUniformValue()
-*/
-void QGLShaderProgram::enableAttributeArray(int location)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glEnableVertexAttribArray(location);
-}
-
-/*!
- \overload
-
- Enables the vertex array called \a name in this shader program
- so that the value set by setAttributeArray() on \a name
- will be used by the shader program.
-
- \sa disableAttributeArray(), setAttributeArray(), setAttributeValue()
- \sa setUniformValue()
-*/
-void QGLShaderProgram::enableAttributeArray(const char *name)
-{
- enableAttributeArray(attributeLocation(name));
-}
-
-/*!
- Disables the vertex array at \a location in this shader program
- that was enabled by a previous call to enableAttributeArray().
-
- \sa enableAttributeArray(), setAttributeArray(), setAttributeValue()
- \sa setUniformValue()
-*/
-void QGLShaderProgram::disableAttributeArray(int location)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glDisableVertexAttribArray(location);
-}
-
-/*!
- \overload
-
- Disables the vertex array called \a name in this shader program
- that was enabled by a previous call to enableAttributeArray().
-
- \sa enableAttributeArray(), setAttributeArray(), setAttributeValue()
- \sa setUniformValue()
-*/
-void QGLShaderProgram::disableAttributeArray(const char *name)
-{
- disableAttributeArray(attributeLocation(name));
-}
-
-/*!
- Returns the location of the uniform variable \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- uniform variable for this shader program.
-
- \sa attributeLocation()
-*/
-int QGLShaderProgram::uniformLocation(const char *name) const
-{
- Q_D(const QGLShaderProgram);
- Q_UNUSED(d);
- if (d->linked && d->programGuard && d->programGuard->id()) {
- return d->glfuncs->glGetUniformLocation(d->programGuard->id(), name);
- } else {
- qWarning() << "QGLShaderProgram::uniformLocation(" << name
- << "): shader program is not linked";
- return -1;
- }
-}
-
-/*!
- \overload
-
- Returns the location of the uniform variable \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- uniform variable for this shader program.
-
- \sa attributeLocation()
-*/
-int QGLShaderProgram::uniformLocation(const QByteArray& name) const
-{
- return uniformLocation(name.constData());
-}
-
-/*!
- \overload
-
- Returns the location of the uniform variable \a name within this shader
- program's parameter list. Returns -1 if \a name is not a valid
- uniform variable for this shader program.
-
- \sa attributeLocation()
-*/
-int QGLShaderProgram::uniformLocation(const QString& name) const
-{
- return uniformLocation(name.toLatin1().constData());
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, GLfloat value)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform1fv(location, 1, &value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, GLfloat value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, GLint value)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform1i(location, value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, GLint value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
- This function should be used when setting sampler values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, GLuint value)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform1i(location, value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value. This function should be used when setting sampler values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, GLuint value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the 2D vector (\a x, \a y).
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, GLfloat x, GLfloat y)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[2] = {x, y};
- d->glfuncs->glUniform2fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context to
- the 2D vector (\a x, \a y).
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, GLfloat x, GLfloat y)
-{
- setUniformValue(uniformLocation(name), x, y);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the 3D vector (\a x, \a y, \a z).
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue
- (int location, GLfloat x, GLfloat y, GLfloat z)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[3] = {x, y, z};
- d->glfuncs->glUniform3fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context to
- the 3D vector (\a x, \a y, \a z).
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue
- (const char *name, GLfloat x, GLfloat y, GLfloat z)
-{
- setUniformValue(uniformLocation(name), x, y, z);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the 4D vector (\a x, \a y, \a z, \a w).
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue
- (int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {x, y, z, w};
- d->glfuncs->glUniform4fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context to
- the 4D vector (\a x, \a y, \a z, \a w).
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue
- (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- setUniformValue(uniformLocation(name), x, y, z, w);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QVector2D& value)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform2fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QVector2D& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QVector3D& value)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform3fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QVector3D& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QVector4D& value)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform4fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QVector4D& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the red, green, blue, and alpha components of \a color.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QColor& color)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(color.redF()), GLfloat(color.greenF()),
- GLfloat(color.blueF()), GLfloat(color.alphaF())};
- d->glfuncs->glUniform4fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context to
- the red, green, blue, and alpha components of \a color.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QColor& color)
-{
- setUniformValue(uniformLocation(name), color);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the x and y coordinates of \a point.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QPoint& point)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(point.x()), GLfloat(point.y())};
- d->glfuncs->glUniform2fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable associated with \a name in the current
- context to the x and y coordinates of \a point.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QPoint& point)
-{
- setUniformValue(uniformLocation(name), point);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the x and y coordinates of \a point.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QPointF& point)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(point.x()), GLfloat(point.y())};
- d->glfuncs->glUniform2fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable associated with \a name in the current
- context to the x and y coordinates of \a point.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QPointF& point)
-{
- setUniformValue(uniformLocation(name), point);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the width and height of the given \a size.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QSize& size)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(size.width()), GLfloat(size.height())};
- d->glfuncs->glUniform2fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable associated with \a name in the current
- context to the width and height of the given \a size.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QSize& size)
-{
- setUniformValue(uniformLocation(name), size);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to
- the width and height of the given \a size.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QSizeF& size)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1) {
- GLfloat values[4] = {GLfloat(size.width()), GLfloat(size.height())};
- d->glfuncs->glUniform2fv(location, 1, values);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable associated with \a name in the current
- context to the width and height of the given \a size.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QSizeF& size)
-{
- setUniformValue(uniformLocation(name), size);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 2x2 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QMatrix2x2& value)
-{
- Q_D(QGLShaderProgram);
- d->glfuncs->glUniformMatrix2fv(location, 1, GL_FALSE, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 2x2 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QMatrix2x2& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 2x3 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QMatrix2x3& value)
-{
- Q_D(QGLShaderProgram);
- d->glfuncs->glUniform3fv(location, 2, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 2x3 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QMatrix2x3& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 2x4 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QMatrix2x4& value)
-{
- Q_D(QGLShaderProgram);
- d->glfuncs->glUniform4fv(location, 2, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 2x4 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QMatrix2x4& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 3x2 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QMatrix3x2& value)
-{
- Q_D(QGLShaderProgram);
- d->glfuncs->glUniform2fv(location, 3, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 3x2 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QMatrix3x2& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 3x3 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QMatrix3x3& value)
-{
- Q_D(QGLShaderProgram);
- d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 3x3 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QMatrix3x3& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 3x4 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QMatrix3x4& value)
-{
- Q_D(QGLShaderProgram);
- d->glfuncs->glUniform4fv(location, 3, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 3x4 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QMatrix3x4& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 4x2 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QMatrix4x2& value)
-{
- Q_D(QGLShaderProgram);
- d->glfuncs->glUniform2fv(location, 4, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 4x2 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QMatrix4x2& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 4x3 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QMatrix4x3& value)
-{
- Q_D(QGLShaderProgram);
- d->glfuncs->glUniform3fv(location, 4, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 4x3 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QMatrix4x3& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context
- to a 4x4 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const QMatrix4x4& value)
-{
- Q_D(QGLShaderProgram);
- d->glfuncs->glUniformMatrix4fv(location, 1, GL_FALSE, value.constData());
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 4x4 matrix \a value.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const QMatrix4x4& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable at \a location in the current context
- to a 2x2 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
- \since 4.7
-*/
-void QGLShaderProgram::setUniformValue(int location, const GLfloat value[2][2])
-{
- Q_D(QGLShaderProgram);
- if (location != -1)
- d->glfuncs->glUniformMatrix2fv(location, 1, GL_FALSE, value[0]);
-}
-
-/*!
- \overload
-
- Sets the uniform variable at \a location in the current context
- to a 3x3 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
- \since 4.7
-*/
-void QGLShaderProgram::setUniformValue(int location, const GLfloat value[3][3])
-{
- Q_D(QGLShaderProgram);
- if (location != -1)
- d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, value[0]);
-}
-
-/*!
- \overload
-
- Sets the uniform variable at \a location in the current context
- to a 4x4 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(int location, const GLfloat value[4][4])
-{
- Q_D(QGLShaderProgram);
- if (location != -1)
- d->glfuncs->glUniformMatrix4fv(location, 1, GL_FALSE, value[0]);
-}
-
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 2x2 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
- \since 4.7
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const GLfloat value[2][2])
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 3x3 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
- \since 4.7
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const GLfloat value[3][3])
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context
- to a 4x4 matrix \a value. The matrix elements must be specified
- in column-major order.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValue(const char *name, const GLfloat value[4][4])
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable at \a location in the current context to a
- 3x3 transformation matrix \a value that is specified as a QTransform value.
-
- To set a QTransform value as a 4x4 matrix in a shader, use
- \c{setUniformValue(location, QMatrix4x4(value))}.
-*/
-void QGLShaderProgram::setUniformValue(int location, const QTransform& value)
-{
- Q_D(QGLShaderProgram);
- if (location != -1) {
- GLfloat mat[3][3] = {
- {GLfloat(value.m11()), GLfloat(value.m12()), GLfloat(value.m13())},
- {GLfloat(value.m21()), GLfloat(value.m22()), GLfloat(value.m23())},
- {GLfloat(value.m31()), GLfloat(value.m32()), GLfloat(value.m33())}
- };
- d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, mat[0]);
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable called \a name in the current context to a
- 3x3 transformation matrix \a value that is specified as a QTransform value.
-
- To set a QTransform value as a 4x4 matrix in a shader, use
- \c{setUniformValue(name, QMatrix4x4(value))}.
-*/
-void QGLShaderProgram::setUniformValue
- (const char *name, const QTransform& value)
-{
- setUniformValue(uniformLocation(name), value);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const GLint *values, int count)
-{
- Q_D(QGLShaderProgram);
- if (location != -1)
- d->glfuncs->glUniform1iv(location, count, values);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray
- (const char *name, const GLint *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count elements of \a values. This overload
- should be used when setting an array of sampler values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const GLuint *values, int count)
-{
- Q_D(QGLShaderProgram);
- if (location != -1)
- d->glfuncs->glUniform1iv(location, count, reinterpret_cast<const GLint *>(values));
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count elements of \a values. This overload
- should be used when setting an array of sampler values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray
- (const char *name, const GLuint *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count elements of \a values. Each element
- has \a tupleSize components. The \a tupleSize must be 1, 2, 3, or 4.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const GLfloat *values, int count, int tupleSize)
-{
- Q_D(QGLShaderProgram);
- if (location != -1) {
- if (tupleSize == 1)
- d->glfuncs->glUniform1fv(location, count, values);
- else if (tupleSize == 2)
- d->glfuncs->glUniform2fv(location, count, values);
- else if (tupleSize == 3)
- d->glfuncs->glUniform3fv(location, count, values);
- else if (tupleSize == 4)
- d->glfuncs->glUniform4fv(location, count, values);
- else
- qWarning() << "QGLShaderProgram::setUniformValue: size" << tupleSize << "not supported";
- }
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count elements of \a values. Each element
- has \a tupleSize components. The \a tupleSize must be 1, 2, 3, or 4.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray
- (const char *name, const GLfloat *values, int count, int tupleSize)
-{
- setUniformValueArray(uniformLocation(name), values, count, tupleSize);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 2D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QVector2D *values, int count)
-{
- Q_D(QGLShaderProgram);
- if (location != -1)
- d->glfuncs->glUniform2fv(location, count, reinterpret_cast<const GLfloat *>(values));
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 2D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QVector2D *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 3D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QVector3D *values, int count)
-{
- Q_D(QGLShaderProgram);
- if (location != -1)
- d->glfuncs->glUniform3fv(location, count, reinterpret_cast<const GLfloat *>(values));
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 3D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QVector3D *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 4D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QVector4D *values, int count)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- if (location != -1)
- d->glfuncs->glUniform4fv(location, count, reinterpret_cast<const GLfloat *>(values));
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 4D vector elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QVector4D *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-// We have to repack matrix arrays from qreal to GLfloat.
-#define setUniformMatrixArray(func,location,values,count,type,cols,rows) \
- if (location == -1 || count <= 0) \
- return; \
- if (sizeof(type) == sizeof(GLfloat) * cols * rows) { \
- func(location, count, GL_FALSE, \
- reinterpret_cast<const GLfloat *>(values[0].constData())); \
- } else { \
- QVarLengthArray<GLfloat> temp(cols * rows * count); \
- for (int index = 0; index < count; ++index) { \
- for (int index2 = 0; index2 < (cols * rows); ++index2) { \
- temp.data()[cols * rows * index + index2] = \
- values[index].constData()[index2]; \
- } \
- } \
- func(location, count, GL_FALSE, temp.constData()); \
- }
-#define setUniformGenericMatrixArray(colfunc,location,values,count,type,cols,rows) \
- if (location == -1 || count <= 0) \
- return; \
- if (sizeof(type) == sizeof(GLfloat) * cols * rows) { \
- const GLfloat *data = reinterpret_cast<const GLfloat *> \
- (values[0].constData()); \
- colfunc(location, count * cols, data); \
- } else { \
- QVarLengthArray<GLfloat> temp(cols * rows * count); \
- for (int index = 0; index < count; ++index) { \
- for (int index2 = 0; index2 < (cols * rows); ++index2) { \
- temp.data()[cols * rows * index + index2] = \
- values[index].constData()[index2]; \
- } \
- } \
- colfunc(location, count * cols, temp.constData()); \
- }
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 2x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QMatrix2x2 *values, int count)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- setUniformMatrixArray
- (d->glfuncs->glUniformMatrix2fv, location, values, count, QMatrix2x2, 2, 2);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 2x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x2 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 2x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QMatrix2x3 *values, int count)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform3fv, location, values, count,
- QMatrix2x3, 2, 3);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 2x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x3 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 2x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QMatrix2x4 *values, int count)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform4fv, location, values, count,
- QMatrix2x4, 2, 4);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 2x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x4 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 3x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QMatrix3x2 *values, int count)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform2fv, location, values, count,
- QMatrix3x2, 3, 2);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 3x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x2 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 3x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QMatrix3x3 *values, int count)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- setUniformMatrixArray
- (d->glfuncs->glUniformMatrix3fv, location, values, count, QMatrix3x3, 3, 3);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 3x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x3 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 3x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QMatrix3x4 *values, int count)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform4fv, location, values, count,
- QMatrix3x4, 3, 4);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 3x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x4 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 4x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QMatrix4x2 *values, int count)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform2fv, location, values, count,
- QMatrix4x2, 4, 2);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 4x2 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4x2 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 4x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QMatrix4x3 *values, int count)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- setUniformGenericMatrixArray
- (d->glfuncs->glUniform3fv, location, values, count,
- QMatrix4x3, 4, 3);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 4x3 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4x3 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-/*!
- Sets the uniform variable array at \a location in the current
- context to the \a count 4x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(int location, const QMatrix4x4 *values, int count)
-{
- Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- setUniformMatrixArray
- (d->glfuncs->glUniformMatrix4fv, location, values, count, QMatrix4x4, 4, 4);
-}
-
-/*!
- \overload
-
- Sets the uniform variable array called \a name in the current
- context to the \a count 4x4 matrix elements of \a values.
-
- \sa setAttributeValue()
-*/
-void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4x4 *values, int count)
-{
- setUniformValueArray(uniformLocation(name), values, count);
-}
-
-#undef ctx
-
-/*!
- Returns the hardware limit for how many vertices a geometry shader
- can output.
-
- \since 4.7
-
- \sa setGeometryOutputVertexCount()
-*/
-int QGLShaderProgram::maxGeometryOutputVertices() const
-{
- GLint n = 0;
-#if !defined(QT_OPENGL_ES_2)
- Q_D(const QGLShaderProgram);
- if (!QOpenGLContext::currentContext()->isOpenGLES())
- d->glfuncs->glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT, &n);
-#endif
- return n;
-}
-
-/*!
- Sets the maximum number of vertices the current geometry shader
- program will produce, if active, to \a count.
-
- \since 4.7
-
- This parameter takes effect the next time the program is linked.
-*/
-void QGLShaderProgram::setGeometryOutputVertexCount(int count)
-{
-#ifndef QT_NO_DEBUG
- int max = maxGeometryOutputVertices();
- if (count > max) {
- qWarning("QGLShaderProgram::setGeometryOutputVertexCount: count: %d higher than maximum: %d",
- count, max);
- }
-#endif
- d_func()->geometryVertexCount = count;
-}
-
-
-/*!
- Returns the maximum number of vertices the current geometry shader
- program will produce, if active.
-
- \since 4.7
-
- This parameter takes effect the ntext time the program is linked.
-*/
-int QGLShaderProgram::geometryOutputVertexCount() const
-{
- return d_func()->geometryVertexCount;
-}
-
-
-/*!
- Sets the input type from \a inputType.
-
- This parameter takes effect the next time the program is linked.
-*/
-void QGLShaderProgram::setGeometryInputType(GLenum inputType)
-{
- d_func()->geometryInputType = inputType;
-}
-
-
-/*!
- Returns the geometry shader input type, if active.
-
- This parameter takes effect the next time the program is linked.
-
- \since 4.7
- */
-
-GLenum QGLShaderProgram::geometryInputType() const
-{
- return d_func()->geometryInputType;
-}
-
-
-/*!
- Sets the output type from the geometry shader, if active, to
- \a outputType.
-
- This parameter takes effect the next time the program is linked.
-
- \since 4.7
-*/
-void QGLShaderProgram::setGeometryOutputType(GLenum outputType)
-{
- d_func()->geometryOutputType = outputType;
-}
-
-
-/*!
- Returns the geometry shader output type, if active.
-
- This parameter takes effect the next time the program is linked.
-
- \since 4.7
- */
-GLenum QGLShaderProgram::geometryOutputType() const
-{
- return d_func()->geometryOutputType;
-}
-
-
-/*!
- Returns \c true if shader programs written in the OpenGL Shading
- Language (GLSL) are supported on this system; false otherwise.
-
- The \a context is used to resolve the GLSL extensions.
- If \a context is \nullptr, then QGLContext::currentContext() is
- used.
-*/
-bool QGLShaderProgram::hasOpenGLShaderPrograms(const QGLContext *context)
-{
-#if !defined(QT_OPENGL_ES_2)
- if (!context)
- context = QGLContext::currentContext();
- if (!context)
- return false;
-
- QOpenGLFunctions functions(context->contextHandle());
- return functions.hasOpenGLFeature(QOpenGLFunctions::Shaders);
-#else
- Q_UNUSED(context);
- return true;
-#endif
-}
-
-/*!
- \internal
-*/
-void QGLShaderProgram::shaderDestroyed()
-{
- Q_D(QGLShaderProgram);
- QGLShader *shader = qobject_cast<QGLShader *>(sender());
- if (shader && !d->removingShaders)
- removeShader(shader);
-}
-
-
-#undef ctx
-#undef context
-
-/*!
- Returns \c true if shader programs of type \a type are supported on
- this system; false otherwise.
-
- The \a context is used to resolve the GLSL extensions.
- If \a context is \nullptr, then QGLContext::currentContext() is
- used.
-
- \since 4.7
-*/
-bool QGLShader::hasOpenGLShaders(ShaderType type, const QGLContext *context)
-{
- if (!context)
- context = QGLContext::currentContext();
- if (!context)
- return false;
-
- if ((type & ~(Geometry | Vertex | Fragment)) || type == 0)
- return false;
-
- QOpenGLFunctions functions(context->contextHandle());
- bool resolved = functions.hasOpenGLFeature(QOpenGLFunctions::Shaders);
- if (!resolved)
- return false;
-
- if ((type & Geometry) && !QByteArray((const char *) functions.glGetString(GL_EXTENSIONS)).contains("GL_EXT_geometry_shader4"))
- return false;
-
- return true;
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/qglshaderprogram.h b/src/opengl/qglshaderprogram.h
deleted file mode 100644
index 3ce88197d2..0000000000
--- a/src/opengl/qglshaderprogram.h
+++ /dev/null
@@ -1,303 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGLSHADERPROGRAM_H
-#define QGLSHADERPROGRAM_H
-
-#include <QtOpenGL/qgl.h>
-#include <QtGui/qvector2d.h>
-#include <QtGui/qvector3d.h>
-#include <QtGui/qvector4d.h>
-#include <QtGui/qmatrix4x4.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QGLShaderProgram;
-class QGLShaderPrivate;
-
-class Q_OPENGL_EXPORT QGLShader : public QObject
-{
- Q_OBJECT
-public:
- enum ShaderTypeBit
- {
- Vertex = 0x0001,
- Fragment = 0x0002,
- Geometry = 0x0004
- };
- Q_DECLARE_FLAGS(ShaderType, ShaderTypeBit)
-
- explicit QGLShader(QGLShader::ShaderType type, QObject *parent = nullptr);
- QGLShader(QGLShader::ShaderType type, const QGLContext *context, QObject *parent = nullptr);
- virtual ~QGLShader();
-
- QGLShader::ShaderType shaderType() const;
-
- bool compileSourceCode(const char *source);
- bool compileSourceCode(const QByteArray& source);
- bool compileSourceCode(const QString& source);
- bool compileSourceFile(const QString& fileName);
-
- QByteArray sourceCode() const;
-
- bool isCompiled() const;
- QString log() const;
-
- GLuint shaderId() const;
-
- static bool hasOpenGLShaders(ShaderType type, const QGLContext *context = nullptr);
-
-private:
- friend class QGLShaderProgram;
-
- Q_DISABLE_COPY(QGLShader)
- Q_DECLARE_PRIVATE(QGLShader)
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QGLShader::ShaderType)
-
-
-class QGLShaderProgramPrivate;
-
-class Q_OPENGL_EXPORT QGLShaderProgram : public QObject
-{
- Q_OBJECT
-public:
- explicit QGLShaderProgram(QObject *parent = nullptr);
- explicit QGLShaderProgram(const QGLContext *context, QObject *parent = nullptr);
- virtual ~QGLShaderProgram();
-
- bool addShader(QGLShader *shader);
- void removeShader(QGLShader *shader);
- QList<QGLShader *> shaders() const;
-
- bool addShaderFromSourceCode(QGLShader::ShaderType type, const char *source);
- bool addShaderFromSourceCode(QGLShader::ShaderType type, const QByteArray& source);
- bool addShaderFromSourceCode(QGLShader::ShaderType type, const QString& source);
- bool addShaderFromSourceFile(QGLShader::ShaderType type, const QString& fileName);
-
- void removeAllShaders();
-
- virtual bool link();
- bool isLinked() const;
- QString log() const;
-
- bool bind();
- void release();
-
- GLuint programId() const;
-
- int maxGeometryOutputVertices() const;
-
- void setGeometryOutputVertexCount(int count);
- int geometryOutputVertexCount() const;
-
- void setGeometryInputType(GLenum inputType);
- GLenum geometryInputType() const;
-
- void setGeometryOutputType(GLenum outputType);
- GLenum geometryOutputType() const;
-
- void bindAttributeLocation(const char *name, int location);
- void bindAttributeLocation(const QByteArray& name, int location);
- void bindAttributeLocation(const QString& name, int location);
-
- int attributeLocation(const char *name) const;
- int attributeLocation(const QByteArray& name) const;
- int attributeLocation(const QString& name) const;
-
- void setAttributeValue(int location, GLfloat value);
- void setAttributeValue(int location, GLfloat x, GLfloat y);
- void setAttributeValue(int location, GLfloat x, GLfloat y, GLfloat z);
- void setAttributeValue(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void setAttributeValue(int location, const QVector2D& value);
- void setAttributeValue(int location, const QVector3D& value);
- void setAttributeValue(int location, const QVector4D& value);
- void setAttributeValue(int location, const QColor& value);
- void setAttributeValue(int location, const GLfloat *values, int columns, int rows);
-
- void setAttributeValue(const char *name, GLfloat value);
- void setAttributeValue(const char *name, GLfloat x, GLfloat y);
- void setAttributeValue(const char *name, GLfloat x, GLfloat y, GLfloat z);
- void setAttributeValue(const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void setAttributeValue(const char *name, const QVector2D& value);
- void setAttributeValue(const char *name, const QVector3D& value);
- void setAttributeValue(const char *name, const QVector4D& value);
- void setAttributeValue(const char *name, const QColor& value);
- void setAttributeValue(const char *name, const GLfloat *values, int columns, int rows);
-
- void setAttributeArray
- (int location, const GLfloat *values, int tupleSize, int stride = 0);
- void setAttributeArray
- (int location, const QVector2D *values, int stride = 0);
- void setAttributeArray
- (int location, const QVector3D *values, int stride = 0);
- void setAttributeArray
- (int location, const QVector4D *values, int stride = 0);
- void setAttributeArray
- (int location, GLenum type, const void *values, int tupleSize, int stride = 0);
- void setAttributeArray
- (const char *name, const GLfloat *values, int tupleSize, int stride = 0);
- void setAttributeArray
- (const char *name, const QVector2D *values, int stride = 0);
- void setAttributeArray
- (const char *name, const QVector3D *values, int stride = 0);
- void setAttributeArray
- (const char *name, const QVector4D *values, int stride = 0);
- void setAttributeArray
- (const char *name, GLenum type, const void *values, int tupleSize, int stride = 0);
-
- void setAttributeBuffer
- (int location, GLenum type, int offset, int tupleSize, int stride = 0);
- void setAttributeBuffer
- (const char *name, GLenum type, int offset, int tupleSize, int stride = 0);
-
- void enableAttributeArray(int location);
- void enableAttributeArray(const char *name);
- void disableAttributeArray(int location);
- void disableAttributeArray(const char *name);
-
- int uniformLocation(const char *name) const;
- int uniformLocation(const QByteArray& name) const;
- int uniformLocation(const QString& name) const;
-
- void setUniformValue(int location, GLfloat value);
- void setUniformValue(int location, GLint value);
- void setUniformValue(int location, GLuint value);
- void setUniformValue(int location, GLfloat x, GLfloat y);
- void setUniformValue(int location, GLfloat x, GLfloat y, GLfloat z);
- void setUniformValue(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void setUniformValue(int location, const QVector2D& value);
- void setUniformValue(int location, const QVector3D& value);
- void setUniformValue(int location, const QVector4D& value);
- void setUniformValue(int location, const QColor& color);
- void setUniformValue(int location, const QPoint& point);
- void setUniformValue(int location, const QPointF& point);
- void setUniformValue(int location, const QSize& size);
- void setUniformValue(int location, const QSizeF& size);
- void setUniformValue(int location, const QMatrix2x2& value);
- void setUniformValue(int location, const QMatrix2x3& value);
- void setUniformValue(int location, const QMatrix2x4& value);
- void setUniformValue(int location, const QMatrix3x2& value);
- void setUniformValue(int location, const QMatrix3x3& value);
- void setUniformValue(int location, const QMatrix3x4& value);
- void setUniformValue(int location, const QMatrix4x2& value);
- void setUniformValue(int location, const QMatrix4x3& value);
- void setUniformValue(int location, const QMatrix4x4& value);
- void setUniformValue(int location, const GLfloat value[2][2]);
- void setUniformValue(int location, const GLfloat value[3][3]);
- void setUniformValue(int location, const GLfloat value[4][4]);
- void setUniformValue(int location, const QTransform& value);
-
- void setUniformValue(const char *name, GLfloat value);
- void setUniformValue(const char *name, GLint value);
- void setUniformValue(const char *name, GLuint value);
- void setUniformValue(const char *name, GLfloat x, GLfloat y);
- void setUniformValue(const char *name, GLfloat x, GLfloat y, GLfloat z);
- void setUniformValue(const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void setUniformValue(const char *name, const QVector2D& value);
- void setUniformValue(const char *name, const QVector3D& value);
- void setUniformValue(const char *name, const QVector4D& value);
- void setUniformValue(const char *name, const QColor& color);
- void setUniformValue(const char *name, const QPoint& point);
- void setUniformValue(const char *name, const QPointF& point);
- void setUniformValue(const char *name, const QSize& size);
- void setUniformValue(const char *name, const QSizeF& size);
- void setUniformValue(const char *name, const QMatrix2x2& value);
- void setUniformValue(const char *name, const QMatrix2x3& value);
- void setUniformValue(const char *name, const QMatrix2x4& value);
- void setUniformValue(const char *name, const QMatrix3x2& value);
- void setUniformValue(const char *name, const QMatrix3x3& value);
- void setUniformValue(const char *name, const QMatrix3x4& value);
- void setUniformValue(const char *name, const QMatrix4x2& value);
- void setUniformValue(const char *name, const QMatrix4x3& value);
- void setUniformValue(const char *name, const QMatrix4x4& value);
- void setUniformValue(const char *name, const GLfloat value[2][2]);
- void setUniformValue(const char *name, const GLfloat value[3][3]);
- void setUniformValue(const char *name, const GLfloat value[4][4]);
- void setUniformValue(const char *name, const QTransform& value);
-
- void setUniformValueArray(int location, const GLfloat *values, int count, int tupleSize);
- void setUniformValueArray(int location, const GLint *values, int count);
- void setUniformValueArray(int location, const GLuint *values, int count);
- void setUniformValueArray(int location, const QVector2D *values, int count);
- void setUniformValueArray(int location, const QVector3D *values, int count);
- void setUniformValueArray(int location, const QVector4D *values, int count);
- void setUniformValueArray(int location, const QMatrix2x2 *values, int count);
- void setUniformValueArray(int location, const QMatrix2x3 *values, int count);
- void setUniformValueArray(int location, const QMatrix2x4 *values, int count);
- void setUniformValueArray(int location, const QMatrix3x2 *values, int count);
- void setUniformValueArray(int location, const QMatrix3x3 *values, int count);
- void setUniformValueArray(int location, const QMatrix3x4 *values, int count);
- void setUniformValueArray(int location, const QMatrix4x2 *values, int count);
- void setUniformValueArray(int location, const QMatrix4x3 *values, int count);
- void setUniformValueArray(int location, const QMatrix4x4 *values, int count);
-
- void setUniformValueArray(const char *name, const GLfloat *values, int count, int tupleSize);
- void setUniformValueArray(const char *name, const GLint *values, int count);
- void setUniformValueArray(const char *name, const GLuint *values, int count);
- void setUniformValueArray(const char *name, const QVector2D *values, int count);
- void setUniformValueArray(const char *name, const QVector3D *values, int count);
- void setUniformValueArray(const char *name, const QVector4D *values, int count);
- void setUniformValueArray(const char *name, const QMatrix2x2 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix2x3 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix2x4 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix3x2 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix3x3 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix3x4 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix4x2 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix4x3 *values, int count);
- void setUniformValueArray(const char *name, const QMatrix4x4 *values, int count);
-
- static bool hasOpenGLShaderPrograms(const QGLContext *context = nullptr);
-
-private Q_SLOTS:
- void shaderDestroyed();
-
-private:
- Q_DISABLE_COPY(QGLShaderProgram)
- Q_DECLARE_PRIVATE(QGLShaderProgram)
-
- bool init();
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/opengl/qgraphicsshadereffect.cpp b/src/opengl/qgraphicsshadereffect.cpp
deleted file mode 100644
index 97b83a6b3d..0000000000
--- a/src/opengl/qgraphicsshadereffect.cpp
+++ /dev/null
@@ -1,272 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgraphicsshadereffect_p.h"
-
-#include "qglshaderprogram.h"
-#include "gl2paintengineex/qglcustomshaderstage_p.h"
-#define QGL_HAVE_CUSTOM_SHADERS 1
-#include <QtGui/qpainter.h>
-#include <QtWidgets/qgraphicsitem.h>
-#include <private/qgraphicseffect_p.h>
-
-QT_BEGIN_NAMESPACE
-
-/*#
- \class QGraphicsShaderEffect
- \inmodule QtOpenGL
- \brief The QGraphicsShaderEffect class is the base class for creating
- custom GLSL shader effects in a QGraphicsScene.
- \since 4.6
- \ingroup multimedia
- \ingroup graphicsview-api
-
- The specific effect is defined by a fragment of GLSL source code
- supplied to setPixelShaderFragment(). This source code must define a
- function with the signature
- \c{lowp vec4 customShader(lowp sampler2D imageTexture, highp vec2 textureCoords)}
- that returns the source pixel value
- to use in the paint engine's shader program. The shader fragment
- is linked with the regular shader code used by the GL2 paint engine
- to construct a complete QGLShaderProgram.
-
- The following example shader converts the incoming pixmap to
- grayscale and then applies a colorize operation using the
- \c effectColor value:
-
- \snippet code/src_opengl_qgraphicsshadereffect.cpp 0
-
- To use this shader code, it is necessary to define a subclass
- of QGraphicsShaderEffect as follows:
-
- \snippet code/src_opengl_qgraphicsshadereffect.cpp 1
-
- The setUniforms() function is called when the effect is about
- to be used for drawing to give the subclass the opportunity to
- set effect-specific uniform variables.
-
- QGraphicsShaderEffect is only supported when the GL2 paint engine
- is in use. When any other paint engine is in use (GL1, raster, etc),
- the drawItem() method will draw its item argument directly with
- no effect applied.
-
- \sa QGraphicsEffect
-*/
-
-static const char qglslDefaultImageFragmentShader[] = "\
- lowp vec4 customShader(lowp sampler2D imageTexture, highp vec2 textureCoords) { \
- return texture2D(imageTexture, textureCoords); \
- }\n";
-
-#ifdef QGL_HAVE_CUSTOM_SHADERS
-
-class QGLCustomShaderEffectStage : public QGLCustomShaderStage
-{
-public:
- QGLCustomShaderEffectStage
- (QGraphicsShaderEffect *e, const QByteArray& source)
- : QGLCustomShaderStage(),
- effect(e)
- {
- setSource(source);
- }
-
- void setUniforms(QGLShaderProgram *program) override;
-
- QGraphicsShaderEffect *effect;
-};
-
-void QGLCustomShaderEffectStage::setUniforms(QGLShaderProgram *program)
-{
- effect->setUniforms(program);
-}
-
-#endif
-
-class QGraphicsShaderEffectPrivate : public QGraphicsEffectPrivate
-{
- Q_DECLARE_PUBLIC(QGraphicsShaderEffect)
-public:
- QGraphicsShaderEffectPrivate()
- : pixelShaderFragment(qglslDefaultImageFragmentShader)
-#ifdef QGL_HAVE_CUSTOM_SHADERS
- , customShaderStage(0)
-#endif
- {
- }
-
- QByteArray pixelShaderFragment;
-#ifdef QGL_HAVE_CUSTOM_SHADERS
- QGLCustomShaderEffectStage *customShaderStage;
-#endif
-};
-
-/*#
- Constructs a shader effect and attaches it to \a parent.
-*/
-QGraphicsShaderEffect::QGraphicsShaderEffect(QObject *parent)
- : QGraphicsEffect(*new QGraphicsShaderEffectPrivate(), parent)
-{
-}
-
-/*#
- Destroys this shader effect.
-*/
-QGraphicsShaderEffect::~QGraphicsShaderEffect()
-{
-#ifdef QGL_HAVE_CUSTOM_SHADERS
- Q_D(QGraphicsShaderEffect);
- delete d->customShaderStage;
-#endif
-}
-
-/*#
- Returns the source code for the pixel shader fragment for
- this shader effect. The default is a shader that copies
- its incoming pixmap directly to the output with no effect
- applied.
-
- \sa setPixelShaderFragment()
-*/
-QByteArray QGraphicsShaderEffect::pixelShaderFragment() const
-{
- Q_D(const QGraphicsShaderEffect);
- return d->pixelShaderFragment;
-}
-
-/*#
- Sets the source code for the pixel shader fragment for
- this shader effect to \a code.
-
- The \a code must define a GLSL function with the signature
- \c{lowp vec4 customShader(lowp sampler2D imageTexture, highp vec2 textureCoords)}
- that returns the source pixel value to use in the paint engine's
- shader program. The following is the default pixel shader fragment,
- which draws a pixmap with no effect applied:
-
- \snippet code/src_opengl_qgraphicsshadereffect.cpp 2
-
- \sa pixelShaderFragment(), setUniforms()
-*/
-void QGraphicsShaderEffect::setPixelShaderFragment(const QByteArray& code)
-{
- Q_D(QGraphicsShaderEffect);
- if (d->pixelShaderFragment != code) {
- d->pixelShaderFragment = code;
-#ifdef QGL_HAVE_CUSTOM_SHADERS
- delete d->customShaderStage;
- d->customShaderStage = 0;
-#endif
- }
-}
-
-/*#
- \reimp
-*/
-void QGraphicsShaderEffect::draw(QPainter *painter)
-{
- Q_D(QGraphicsShaderEffect);
-
-#ifdef QGL_HAVE_CUSTOM_SHADERS
- // Set the custom shader on the paint engine. The setOnPainter()
- // call may fail if the paint engine is not GL2. In that case,
- // we fall through to drawing the pixmap normally.
- if (!d->customShaderStage) {
- d->customShaderStage = new QGLCustomShaderEffectStage
- (this, d->pixelShaderFragment);
- }
- bool usingShader = d->customShaderStage->setOnPainter(painter);
-
- QPoint offset;
- if (sourceIsPixmap()) {
- // No point in drawing in device coordinates (pixmap will be scaled anyways).
- const QPixmap pixmap = sourcePixmap(Qt::LogicalCoordinates, &offset);
- painter->drawPixmap(offset, pixmap);
- } else {
- // Draw pixmap in device coordinates to avoid pixmap scaling.
- const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset);
- QTransform restoreTransform = painter->worldTransform();
- painter->setWorldTransform(QTransform());
- painter->drawPixmap(offset, pixmap);
- painter->setWorldTransform(restoreTransform);
- }
-
- // Remove the custom shader to return to normal painting operations.
- if (usingShader)
- d->customShaderStage->removeFromPainter(painter);
-#else
- drawSource(painter);
-#endif
-}
-
-/*#
- Sets the custom uniform variables on this shader effect to
- be dirty. The setUniforms() function will be called the next
- time the shader program corresponding to this effect is used.
-
- This function is typically called by subclasses when an
- effect-specific parameter is changed by the application.
-
- \sa setUniforms()
-*/
-void QGraphicsShaderEffect::setUniformsDirty()
-{
-#ifdef QGL_HAVE_CUSTOM_SHADERS
- Q_D(QGraphicsShaderEffect);
- if (d->customShaderStage)
- d->customShaderStage->setUniformsDirty();
-#endif
-}
-
-/*#
- Sets custom uniform variables on the current GL context when
- \a program is about to be used by the paint engine.
-
- This function should be overridden if the shader set with
- setPixelShaderFragment() has additional parameters beyond
- those that the paint engine normally sets itself.
-
- \sa setUniformsDirty()
-*/
-void QGraphicsShaderEffect::setUniforms(QGLShaderProgram *program)
-{
- Q_UNUSED(program);
-}
-
-QT_END_NAMESPACE
diff --git a/src/opengl/qgraphicsshadereffect_p.h b/src/opengl/qgraphicsshadereffect_p.h
deleted file mode 100644
index 218caa2936..0000000000
--- a/src/opengl/qgraphicsshadereffect_p.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGRAPHICSSHADEREFFECT_P_H
-#define QGRAPHICSSHADEREFFECT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtWidgets/qgraphicseffect.h>
-
-#include <QtOpenGL/qtopenglglobal.h>
-
-QT_REQUIRE_CONFIG(graphicseffect);
-
-QT_BEGIN_NAMESPACE
-
-class QGLShaderProgram;
-class QGLCustomShaderEffectStage;
-class QGraphicsShaderEffectPrivate;
-
-class Q_OPENGL_EXPORT QGraphicsShaderEffect : public QGraphicsEffect
-{
- Q_OBJECT
-public:
- QGraphicsShaderEffect(QObject *parent = nullptr);
- virtual ~QGraphicsShaderEffect();
-
- QByteArray pixelShaderFragment() const;
- void setPixelShaderFragment(const QByteArray& code);
-
-protected:
- void draw(QPainter *painter) override;
- void setUniformsDirty();
- virtual void setUniforms(QGLShaderProgram *program);
-
-private:
- Q_DECLARE_PRIVATE(QGraphicsShaderEffect)
- Q_DISABLE_COPY_MOVE(QGraphicsShaderEffect)
-
- friend class QGLCustomShaderEffectStage;
-};
-
-QT_END_NAMESPACE
-
-#endif // QGRAPHICSSHADEREFFECT_P_H
diff --git a/src/opengl/qopengl2pexvertexarray.cpp b/src/opengl/qopengl2pexvertexarray.cpp
new file mode 100644
index 0000000000..df0fb764c9
--- /dev/null
+++ b/src/opengl/qopengl2pexvertexarray.cpp
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopengl2pexvertexarray_p.h"
+
+#include <private/qbezier_p.h>
+
+QT_BEGIN_NAMESPACE
+
+void QOpenGL2PEXVertexArray::clear()
+{
+ vertexArray.reset();
+ vertexArrayStops.reset();
+ boundingRectDirty = true;
+}
+
+
+QOpenGLRect QOpenGL2PEXVertexArray::boundingRect() const
+{
+ if (boundingRectDirty)
+ return QOpenGLRect(0.0, 0.0, 0.0, 0.0);
+ else
+ return QOpenGLRect(minX, minY, maxX, maxY);
+}
+
+void QOpenGL2PEXVertexArray::addClosingLine(int index)
+{
+ QPointF point(vertexArray.at(index));
+ if (point != QPointF(vertexArray.last()))
+ vertexArray.add(point);
+}
+
+void QOpenGL2PEXVertexArray::addCentroid(const QVectorPath &path, int subPathIndex)
+{
+ const QPointF *const points = reinterpret_cast<const QPointF *>(path.points());
+ const QPainterPath::ElementType *const elements = path.elements();
+
+ QPointF sum = points[subPathIndex];
+ int count = 1;
+
+ for (int i = subPathIndex + 1; i < path.elementCount() && (!elements || elements[i] != QPainterPath::MoveToElement); ++i) {
+ sum += points[i];
+ ++count;
+ }
+
+ const QPointF centroid = sum / qreal(count);
+ vertexArray.add(centroid);
+}
+
+void QOpenGL2PEXVertexArray::addPath(const QVectorPath &path, GLfloat curveInverseScale, bool outline)
+{
+ const QPointF* const points = reinterpret_cast<const QPointF*>(path.points());
+ const QPainterPath::ElementType* const elements = path.elements();
+
+ if (boundingRectDirty) {
+ minX = maxX = points[0].x();
+ minY = maxY = points[0].y();
+ boundingRectDirty = false;
+ }
+
+ if (!outline && !path.isConvex())
+ addCentroid(path, 0);
+
+ int lastMoveTo = vertexArray.size();
+ vertexArray.add(points[0]); // The first element is always a moveTo
+
+ do {
+ if (!elements) {
+// qDebug("QVectorPath has no elements");
+ // If the path has a null elements pointer, the elements implicitly
+ // start with a moveTo (already added) and continue with lineTos:
+ for (int i=1; i<path.elementCount(); ++i)
+ lineToArray(points[i].x(), points[i].y());
+
+ break;
+ }
+// qDebug("QVectorPath has element types");
+
+ for (int i=1; i<path.elementCount(); ++i) {
+ switch (elements[i]) {
+ case QPainterPath::MoveToElement:
+ if (!outline)
+ addClosingLine(lastMoveTo);
+// qDebug("element[%d] is a MoveToElement", i);
+ vertexArrayStops.add(vertexArray.size());
+ if (!outline) {
+ if (!path.isConvex()) addCentroid(path, i);
+ lastMoveTo = vertexArray.size();
+ }
+ lineToArray(points[i].x(), points[i].y()); // Add the moveTo as a new vertex
+ break;
+ case QPainterPath::LineToElement:
+// qDebug("element[%d] is a LineToElement", i);
+ lineToArray(points[i].x(), points[i].y());
+ break;
+ case QPainterPath::CurveToElement: {
+ QBezier b = QBezier::fromPoints(*(((const QPointF *) points) + i - 1),
+ points[i],
+ points[i+1],
+ points[i+2]);
+ QRectF bounds = b.bounds();
+ // threshold based on same algorithm as in qtriangulatingstroker.cpp
+ int threshold = qMin<float>(64, qMax(bounds.width(), bounds.height()) * 3.14f / (curveInverseScale * 6));
+ if (threshold < 3) threshold = 3;
+ qreal one_over_threshold_minus_1 = qreal(1) / (threshold - 1);
+ for (int t=0; t<threshold; ++t) {
+ QPointF pt = b.pointAt(t * one_over_threshold_minus_1);
+ lineToArray(pt.x(), pt.y());
+ }
+ i += 2;
+ break; }
+ default:
+ break;
+ }
+ }
+ } while (0);
+
+ if (!outline)
+ addClosingLine(lastMoveTo);
+ vertexArrayStops.add(vertexArray.size());
+}
+
+void QOpenGL2PEXVertexArray::lineToArray(const GLfloat x, const GLfloat y)
+{
+ vertexArray.add(QOpenGLPoint(x, y));
+
+ if (x > maxX)
+ maxX = x;
+ else if (x < minX)
+ minX = x;
+ if (y > maxY)
+ maxY = y;
+ else if (y < minY)
+ minY = y;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopengl2pexvertexarray_p.h b/src/opengl/qopengl2pexvertexarray_p.h
new file mode 100644
index 0000000000..3ef26e908d
--- /dev/null
+++ b/src/opengl/qopengl2pexvertexarray_p.h
@@ -0,0 +1,167 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QOPENGL2PEXVERTEXARRAY_P_H
+#define QOPENGL2PEXVERTEXARRAY_P_H
+
+#include <QRectF>
+
+#include <private/qdatabuffer_p.h>
+#include <private/qvectorpath_p.h>
+#include <private/qopenglcontext_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLPoint
+{
+public:
+ QOpenGLPoint(GLfloat new_x, GLfloat new_y) :
+ x(new_x), y(new_y) {};
+
+ QOpenGLPoint(const QPointF &p) :
+ x(p.x()), y(p.y()) {};
+
+ QOpenGLPoint(const QPointF* p) :
+ x(p->x()), y(p->y()) {};
+
+ GLfloat x;
+ GLfloat y;
+
+ operator QPointF() {return QPointF(x,y);}
+ operator QPointF() const {return QPointF(x,y);}
+};
+
+struct QOpenGLRect
+{
+ QOpenGLRect(const QRectF &r)
+ : left(r.left()), top(r.top()), right(r.right()), bottom(r.bottom()) {}
+
+ QOpenGLRect(GLfloat l, GLfloat t, GLfloat r, GLfloat b)
+ : left(l), top(t), right(r), bottom(b) {}
+
+ GLfloat left;
+ GLfloat top;
+ GLfloat right;
+ GLfloat bottom;
+
+ operator QRectF() const {return QRectF(left, top, right-left, bottom-top);}
+};
+
+class QOpenGL2PEXVertexArray
+{
+public:
+ QOpenGL2PEXVertexArray() :
+ vertexArray(0), vertexArrayStops(0),
+ maxX(-2e10), maxY(-2e10), minX(2e10), minY(2e10),
+ boundingRectDirty(true)
+ { }
+
+ inline void addRect(const QRectF &rect)
+ {
+ qreal top = rect.top();
+ qreal left = rect.left();
+ qreal bottom = rect.bottom();
+ qreal right = rect.right();
+
+ vertexArray << QOpenGLPoint(left, top)
+ << QOpenGLPoint(right, top)
+ << QOpenGLPoint(right, bottom)
+ << QOpenGLPoint(right, bottom)
+ << QOpenGLPoint(left, bottom)
+ << QOpenGLPoint(left, top);
+ }
+
+ inline void addQuad(const QRectF &rect)
+ {
+ qreal top = rect.top();
+ qreal left = rect.left();
+ qreal bottom = rect.bottom();
+ qreal right = rect.right();
+
+ vertexArray << QOpenGLPoint(left, top)
+ << QOpenGLPoint(right, top)
+ << QOpenGLPoint(left, bottom)
+ << QOpenGLPoint(right, bottom);
+
+ }
+
+ inline void addVertex(const GLfloat x, const GLfloat y)
+ {
+ vertexArray.add(QOpenGLPoint(x, y));
+ }
+
+ void addPath(const QVectorPath &path, GLfloat curveInverseScale, bool outline = true);
+ void clear();
+
+ QOpenGLPoint* data() {return vertexArray.data();}
+ int *stops() const { return vertexArrayStops.data(); }
+ int stopCount() const { return vertexArrayStops.size(); }
+ QOpenGLRect boundingRect() const;
+
+ int vertexCount() const { return vertexArray.size(); }
+
+ void lineToArray(const GLfloat x, const GLfloat y);
+
+private:
+ QDataBuffer<QOpenGLPoint> vertexArray;
+ QDataBuffer<int> vertexArrayStops;
+
+ GLfloat maxX;
+ GLfloat maxY;
+ GLfloat minX;
+ GLfloat minY;
+ bool boundingRectDirty;
+ void addClosingLine(int index);
+ void addCentroid(const QVectorPath &path, int subPathIndex);
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/opengl/qopenglbuffer.cpp b/src/opengl/qopenglbuffer.cpp
new file mode 100644
index 0000000000..8a880662b1
--- /dev/null
+++ b/src/opengl/qopenglbuffer.cpp
@@ -0,0 +1,618 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui/qopengl.h>
+#include <QtGui/private/qopenglcontext_p.h>
+#include <QtCore/qatomic.h>
+#include "qopenglbuffer.h"
+#include <private/qopenglextensions_p.h>
+
+#ifndef GL_CONTEXT_LOST
+#define GL_CONTEXT_LOST 0x0507
+#endif
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLBuffer
+ \brief The QOpenGLBuffer class provides functions for creating and managing OpenGL buffer objects.
+ \since 5.0
+ \ingroup painting-3D
+ \inmodule QtOpenGL
+
+ Buffer objects are created in the OpenGL server so that the
+ client application can avoid uploading vertices, indices,
+ texture image data, etc every time they are needed.
+
+ QOpenGLBuffer objects can be copied around as a reference to the
+ underlying OpenGL buffer object:
+
+ \snippet code/src_gui_opengl_qopenglbuffer.cpp 0
+
+ QOpenGLBuffer performs a shallow copy when objects are copied in this
+ manner, but does not implement copy-on-write semantics. The original
+ object will be affected whenever the copy is modified.
+*/
+
+/*!
+ \enum QOpenGLBuffer::Type
+ This enum defines the type of OpenGL buffer object to create with QOpenGLBuffer.
+
+ \value VertexBuffer Vertex buffer object for use when specifying
+ vertex arrays.
+ \value IndexBuffer Index buffer object for use with \c{glDrawElements()}.
+ \value PixelPackBuffer Pixel pack buffer object for reading pixel
+ data from the OpenGL server (for example, with \c{glReadPixels()}).
+ Not supported under OpenGL/ES.
+ \value PixelUnpackBuffer Pixel unpack buffer object for writing pixel
+ data to the OpenGL server (for example, with \c{glTexImage2D()}).
+ Not supported under OpenGL/ES.
+*/
+
+/*!
+ \enum QOpenGLBuffer::UsagePattern
+ This enum defines the usage pattern of a QOpenGLBuffer object.
+
+ \value StreamDraw The data will be set once and used a few times
+ for drawing operations. Under OpenGL/ES 1.1 this is identical
+ to StaticDraw.
+ \value StreamRead The data will be set once and used a few times
+ for reading data back from the OpenGL server. Not supported
+ under OpenGL/ES.
+ \value StreamCopy The data will be set once and used a few times
+ for reading data back from the OpenGL server for use in further
+ drawing operations. Not supported under OpenGL/ES.
+ \value StaticDraw The data will be set once and used many times
+ for drawing operations.
+ \value StaticRead The data will be set once and used many times
+ for reading data back from the OpenGL server. Not supported
+ under OpenGL/ES.
+ \value StaticCopy The data will be set once and used many times
+ for reading data back from the OpenGL server for use in further
+ drawing operations. Not supported under OpenGL/ES.
+ \value DynamicDraw The data will be modified repeatedly and used
+ many times for drawing operations.
+ \value DynamicRead The data will be modified repeatedly and used
+ many times for reading data back from the OpenGL server.
+ Not supported under OpenGL/ES.
+ \value DynamicCopy The data will be modified repeatedly and used
+ many times for reading data back from the OpenGL server for
+ use in further drawing operations. Not supported under OpenGL/ES.
+*/
+
+/*!
+ \enum QOpenGLBuffer::Access
+ This enum defines the access mode for QOpenGLBuffer::map().
+
+ \value ReadOnly The buffer will be mapped for reading only.
+ \value WriteOnly The buffer will be mapped for writing only.
+ \value ReadWrite The buffer will be mapped for reading and writing.
+*/
+
+/*!
+ \enum QOpenGLBuffer::RangeAccessFlag
+ This enum defines the access mode bits for QOpenGLBuffer::mapRange().
+
+ \value RangeRead The buffer will be mapped for reading.
+ \value RangeWrite The buffer will be mapped for writing.
+ \value RangeInvalidate Discard the previous contents of the specified range.
+ \value RangeInvalidateBuffer Discard the previous contents of the entire buffer.
+ \value RangeFlushExplicit Indicates that modifications are to be flushed explicitly via \c glFlushMappedBufferRange.
+ \value RangeUnsynchronized Indicates that pending operations should not be synchronized before returning from mapRange().
+*/
+
+class QOpenGLBufferPrivate
+{
+public:
+ QOpenGLBufferPrivate(QOpenGLBuffer::Type t)
+ : ref(1),
+ type(t),
+ guard(nullptr),
+ usagePattern(QOpenGLBuffer::StaticDraw),
+ actualUsagePattern(QOpenGLBuffer::StaticDraw),
+ funcs(nullptr)
+ {
+ }
+
+ QAtomicInt ref;
+ QOpenGLBuffer::Type type;
+ QOpenGLSharedResourceGuard *guard;
+ QOpenGLBuffer::UsagePattern usagePattern;
+ QOpenGLBuffer::UsagePattern actualUsagePattern;
+ QOpenGLExtensions *funcs;
+};
+
+/*!
+ Constructs a new buffer object of type QOpenGLBuffer::VertexBuffer.
+
+ Note: this constructor just creates the QOpenGLBuffer instance. The actual
+ buffer object in the OpenGL server is not created until create() is called.
+
+ \sa create()
+*/
+QOpenGLBuffer::QOpenGLBuffer()
+ : d_ptr(new QOpenGLBufferPrivate(QOpenGLBuffer::VertexBuffer))
+{
+}
+
+/*!
+ Constructs a new buffer object of \a type.
+
+ Note: this constructor just creates the QOpenGLBuffer instance. The actual
+ buffer object in the OpenGL server is not created until create() is called.
+
+ \sa create()
+*/
+QOpenGLBuffer::QOpenGLBuffer(QOpenGLBuffer::Type type)
+ : d_ptr(new QOpenGLBufferPrivate(type))
+{
+}
+
+/*!
+ Constructs a shallow copy of \a other.
+
+ Note: QOpenGLBuffer does not implement copy-on-write semantics,
+ so \a other will be affected whenever the copy is modified.
+*/
+QOpenGLBuffer::QOpenGLBuffer(const QOpenGLBuffer &other)
+ : d_ptr(other.d_ptr)
+{
+ d_ptr->ref.ref();
+}
+
+/*!
+ Destroys this buffer object, including the storage being
+ used in the OpenGL server.
+*/
+QOpenGLBuffer::~QOpenGLBuffer()
+{
+ if (!d_ptr->ref.deref()) {
+ destroy();
+ delete d_ptr;
+ }
+}
+
+/*!
+ Assigns a shallow copy of \a other to this object.
+
+ Note: QOpenGLBuffer does not implement copy-on-write semantics,
+ so \a other will be affected whenever the copy is modified.
+*/
+QOpenGLBuffer &QOpenGLBuffer::operator=(const QOpenGLBuffer &other)
+{
+ if (d_ptr != other.d_ptr) {
+ other.d_ptr->ref.ref();
+ if (!d_ptr->ref.deref()) {
+ destroy();
+ delete d_ptr;
+ }
+ d_ptr = other.d_ptr;
+ }
+ return *this;
+}
+
+/*!
+ Returns the type of buffer represented by this object.
+*/
+QOpenGLBuffer::Type QOpenGLBuffer::type() const
+{
+ Q_D(const QOpenGLBuffer);
+ return d->type;
+}
+
+/*!
+ Returns the usage pattern for this buffer object.
+ The default value is StaticDraw.
+
+ \sa setUsagePattern()
+*/
+QOpenGLBuffer::UsagePattern QOpenGLBuffer::usagePattern() const
+{
+ Q_D(const QOpenGLBuffer);
+ return d->usagePattern;
+}
+
+/*!
+ Sets the usage pattern for this buffer object to \a value.
+ This function must be called before allocate() or write().
+
+ \sa usagePattern(), allocate(), write()
+*/
+void QOpenGLBuffer::setUsagePattern(QOpenGLBuffer::UsagePattern value)
+{
+ Q_D(QOpenGLBuffer);
+ d->usagePattern = d->actualUsagePattern = value;
+}
+
+namespace {
+ void freeBufferFunc(QOpenGLFunctions *funcs, GLuint id)
+ {
+ funcs->glDeleteBuffers(1, &id);
+ }
+}
+
+/*!
+ Creates the buffer object in the OpenGL server. Returns \c true if
+ the object was created; false otherwise.
+
+ This function must be called with a current QOpenGLContext.
+ The buffer will be bound to and can only be used in
+ that context (or any other context that is shared with it).
+
+ This function will return false if the OpenGL implementation
+ does not support buffers, or there is no current QOpenGLContext.
+
+ \sa isCreated(), allocate(), write(), destroy()
+*/
+bool QOpenGLBuffer::create()
+{
+ Q_D(QOpenGLBuffer);
+ if (d->guard && d->guard->id())
+ return true;
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (ctx) {
+ delete d->funcs;
+ d->funcs = new QOpenGLExtensions(ctx);
+ GLuint bufferId = 0;
+ d->funcs->glGenBuffers(1, &bufferId);
+ if (bufferId) {
+ if (d->guard)
+ d->guard->free();
+
+ d->guard = new QOpenGLSharedResourceGuard(ctx, bufferId, freeBufferFunc);
+ return true;
+ }
+ }
+ return false;
+}
+
+/*!
+ Returns \c true if this buffer has been created; false otherwise.
+
+ \sa create(), destroy()
+*/
+bool QOpenGLBuffer::isCreated() const
+{
+ Q_D(const QOpenGLBuffer);
+ return d->guard && d->guard->id();
+}
+
+/*!
+ Destroys this buffer object, including the storage being
+ used in the OpenGL server. All references to the buffer will
+ become invalid.
+*/
+void QOpenGLBuffer::destroy()
+{
+ Q_D(QOpenGLBuffer);
+ if (d->guard) {
+ d->guard->free();
+ d->guard = nullptr;
+ }
+ delete d->funcs;
+ d->funcs = nullptr;
+}
+
+/*!
+ Reads the \a count bytes in this buffer starting at \a offset
+ into \a data. Returns \c true on success; false if reading from
+ the buffer is not supported. Buffer reading is not supported
+ under OpenGL/ES.
+
+ It is assumed that this buffer has been bound to the current context.
+
+ \sa write(), bind()
+*/
+bool QOpenGLBuffer::read(int offset, void *data, int count)
+{
+#if !QT_CONFIG(opengles2)
+ Q_D(QOpenGLBuffer);
+ if (!d->funcs->hasOpenGLFeature(QOpenGLFunctions::Buffers) || !d->guard->id())
+ return false;
+
+ while (true) { // Clear error state.
+ GLenum error = d->funcs->glGetError();
+ if (error == GL_NO_ERROR)
+ break;
+ if (error == GL_CONTEXT_LOST)
+ return false;
+ };
+ d->funcs->glGetBufferSubData(d->type, offset, count, data);
+ return d->funcs->glGetError() == GL_NO_ERROR;
+#else
+ Q_UNUSED(offset);
+ Q_UNUSED(data);
+ Q_UNUSED(count);
+ return false;
+#endif
+}
+
+/*!
+ Replaces the \a count bytes of this buffer starting at \a offset
+ with the contents of \a data. Any other bytes in the buffer
+ will be left unmodified.
+
+ It is assumed that create() has been called on this buffer and that
+ it has been bound to the current context.
+
+ \sa create(), read(), allocate()
+*/
+void QOpenGLBuffer::write(int offset, const void *data, int count)
+{
+#ifndef QT_NO_DEBUG
+ if (!isCreated())
+ qWarning("QOpenGLBuffer::write(): buffer not created");
+#endif
+ Q_D(QOpenGLBuffer);
+ if (d->guard && d->guard->id())
+ d->funcs->glBufferSubData(d->type, offset, count, data);
+}
+
+/*!
+ Allocates \a count bytes of space to the buffer, initialized to
+ the contents of \a data. Any previous contents will be removed.
+
+ It is assumed that create() has been called on this buffer and that
+ it has been bound to the current context.
+
+ \sa create(), read(), write()
+*/
+void QOpenGLBuffer::allocate(const void *data, int count)
+{
+#ifndef QT_NO_DEBUG
+ if (!isCreated())
+ qWarning("QOpenGLBuffer::allocate(): buffer not created");
+#endif
+ Q_D(QOpenGLBuffer);
+ if (d->guard && d->guard->id())
+ d->funcs->glBufferData(d->type, count, data, d->actualUsagePattern);
+}
+
+/*!
+ \fn void QOpenGLBuffer::allocate(int count)
+ \overload
+
+ Allocates \a count bytes of space to the buffer. Any previous
+ contents will be removed.
+
+ It is assumed that create() has been called on this buffer and that
+ it has been bound to the current context.
+
+ \sa create(), write()
+*/
+
+/*!
+ Binds the buffer associated with this object to the current
+ OpenGL context. Returns \c false if binding was not possible, usually because
+ type() is not supported on this OpenGL implementation.
+
+ The buffer must be bound to the same QOpenGLContext current when create()
+ was called, or to another QOpenGLContext that is sharing with it.
+ Otherwise, false will be returned from this function.
+
+ \sa release(), create()
+*/
+bool QOpenGLBuffer::bind()
+{
+#ifndef QT_NO_DEBUG
+ if (!isCreated())
+ qWarning("QOpenGLBuffer::bind(): buffer not created");
+#endif
+ Q_D(const QOpenGLBuffer);
+ GLuint bufferId = d->guard ? d->guard->id() : 0;
+ if (bufferId) {
+ if (d->guard->group() != QOpenGLContextGroup::currentContextGroup()) {
+#ifndef QT_NO_DEBUG
+ qWarning("QOpenGLBuffer::bind: buffer is not valid in the current context");
+#endif
+ return false;
+ }
+ d->funcs->glBindBuffer(d->type, bufferId);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/*!
+ Releases the buffer associated with this object from the
+ current OpenGL context.
+
+ This function must be called with the same QOpenGLContext current
+ as when bind() was called on the buffer.
+
+ \sa bind()
+*/
+void QOpenGLBuffer::release()
+{
+#ifndef QT_NO_DEBUG
+ if (!isCreated())
+ qWarning("QOpenGLBuffer::release(): buffer not created");
+#endif
+ Q_D(const QOpenGLBuffer);
+ if (d->guard && d->guard->id())
+ d->funcs->glBindBuffer(d->type, 0);
+}
+
+/*!
+ Releases the buffer associated with \a type in the current
+ QOpenGLContext.
+
+ This function is a direct call to \c{glBindBuffer(type, 0)}
+ for use when the caller does not know which QOpenGLBuffer has
+ been bound to the context but wants to make sure that it
+ is released.
+
+ \snippet code/src_gui_opengl_qopenglbuffer.cpp 1
+*/
+void QOpenGLBuffer::release(QOpenGLBuffer::Type type)
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (ctx)
+ ctx->functions()->glBindBuffer(GLenum(type), 0);
+}
+
+/*!
+ Returns the OpenGL identifier associated with this buffer; zero if
+ the buffer has not been created.
+
+ \sa isCreated()
+*/
+GLuint QOpenGLBuffer::bufferId() const
+{
+ Q_D(const QOpenGLBuffer);
+ return d->guard ? d->guard->id() : 0;
+}
+
+/*!
+ Returns the size of the data in this buffer, for reading operations.
+ Returns -1 if fetching the buffer size is not supported, or the
+ buffer has not been created.
+
+ It is assumed that this buffer has been bound to the current context.
+
+ \sa isCreated(), bind()
+*/
+int QOpenGLBuffer::size() const
+{
+ Q_D(const QOpenGLBuffer);
+ if (!d->guard || !d->guard->id())
+ return -1;
+ GLint value = -1;
+ d->funcs->glGetBufferParameteriv(d->type, GL_BUFFER_SIZE, &value);
+ return value;
+}
+
+/*!
+ Maps the contents of this buffer into the application's memory
+ space and returns a pointer to it. Returns null if memory
+ mapping is not possible. The \a access parameter indicates the
+ type of access to be performed.
+
+ It is assumed that create() has been called on this buffer and that
+ it has been bound to the current context.
+
+ \note This function is only supported under OpenGL ES 2.0 or
+ earlier if the \c GL_OES_mapbuffer extension is present.
+
+ \note On OpenGL ES 3.0 and newer, or, in case if desktop OpenGL,
+ if \c GL_ARB_map_buffer_range is supported, this function uses
+ \c glMapBufferRange instead of \c glMapBuffer.
+
+ \sa unmap(), create(), bind(), mapRange()
+*/
+void *QOpenGLBuffer::map(QOpenGLBuffer::Access access)
+{
+ Q_D(QOpenGLBuffer);
+#ifndef QT_NO_DEBUG
+ if (!isCreated())
+ qWarning("QOpenGLBuffer::map(): buffer not created");
+#endif
+ if (!d->guard || !d->guard->id())
+ return nullptr;
+ if (d->funcs->hasOpenGLExtension(QOpenGLExtensions::MapBufferRange)) {
+ QOpenGLBuffer::RangeAccessFlags rangeAccess;
+ switch (access) {
+ case QOpenGLBuffer::ReadOnly:
+ rangeAccess = QOpenGLBuffer::RangeRead;
+ break;
+ case QOpenGLBuffer::WriteOnly:
+ rangeAccess = QOpenGLBuffer::RangeWrite;
+ break;
+ case QOpenGLBuffer::ReadWrite:
+ rangeAccess = QOpenGLBuffer::RangeRead | QOpenGLBuffer::RangeWrite;
+ break;
+ }
+ return d->funcs->glMapBufferRange(d->type, 0, size(), rangeAccess);
+ } else {
+ return d->funcs->glMapBuffer(d->type, access);
+ }
+}
+
+/*!
+ Maps the range specified by \a offset and \a count of the contents
+ of this buffer into the application's memory space and returns a
+ pointer to it. Returns null if memory mapping is not possible.
+ The \a access parameter specifies a combination of access flags.
+
+ It is assumed that create() has been called on this buffer and that
+ it has been bound to the current context.
+
+ \note This function is not available on OpenGL ES 2.0 and earlier.
+
+ \sa unmap(), create(), bind()
+ */
+void *QOpenGLBuffer::mapRange(int offset, int count, QOpenGLBuffer::RangeAccessFlags access)
+{
+ Q_D(QOpenGLBuffer);
+#ifndef QT_NO_DEBUG
+ if (!isCreated())
+ qWarning("QOpenGLBuffer::mapRange(): buffer not created");
+#endif
+ if (!d->guard || !d->guard->id())
+ return nullptr;
+ return d->funcs->glMapBufferRange(d->type, offset, count, access);
+}
+
+/*!
+ Unmaps the buffer after it was mapped into the application's
+ memory space with a previous call to map(). Returns \c true if
+ the unmap succeeded; false otherwise.
+
+ It is assumed that this buffer has been bound to the current context,
+ and that it was previously mapped with map().
+
+ \note This function is only supported under OpenGL ES 2.0 and
+ earlier if the \c{GL_OES_mapbuffer} extension is present.
+
+ \sa map()
+*/
+bool QOpenGLBuffer::unmap()
+{
+ Q_D(QOpenGLBuffer);
+#ifndef QT_NO_DEBUG
+ if (!isCreated())
+ qWarning("QOpenGLBuffer::unmap(): buffer not created");
+#endif
+ if (!d->guard || !d->guard->id())
+ return false;
+ return d->funcs->glUnmapBuffer(d->type) == GL_TRUE;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglbuffer.h b/src/opengl/qopenglbuffer.h
new file mode 100644
index 0000000000..8a099a0320
--- /dev/null
+++ b/src/opengl/qopenglbuffer.h
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLBUFFER_H
+#define QOPENGLBUFFER_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#ifndef QT_NO_OPENGL
+
+#include <QtCore/qscopedpointer.h>
+#include <QtGui/qopengl.h>
+
+QT_BEGIN_NAMESPACE
+
+
+class QOpenGLBufferPrivate;
+
+class Q_OPENGL_EXPORT QOpenGLBuffer
+{
+public:
+ enum Type
+ {
+ VertexBuffer = 0x8892, // GL_ARRAY_BUFFER
+ IndexBuffer = 0x8893, // GL_ELEMENT_ARRAY_BUFFER
+ PixelPackBuffer = 0x88EB, // GL_PIXEL_PACK_BUFFER
+ PixelUnpackBuffer = 0x88EC // GL_PIXEL_UNPACK_BUFFER
+ };
+
+ QOpenGLBuffer();
+ explicit QOpenGLBuffer(QOpenGLBuffer::Type type);
+ QOpenGLBuffer(const QOpenGLBuffer &other);
+ ~QOpenGLBuffer();
+
+ QOpenGLBuffer &operator=(const QOpenGLBuffer &other);
+
+ enum UsagePattern
+ {
+ StreamDraw = 0x88E0, // GL_STREAM_DRAW
+ StreamRead = 0x88E1, // GL_STREAM_READ
+ StreamCopy = 0x88E2, // GL_STREAM_COPY
+ StaticDraw = 0x88E4, // GL_STATIC_DRAW
+ StaticRead = 0x88E5, // GL_STATIC_READ
+ StaticCopy = 0x88E6, // GL_STATIC_COPY
+ DynamicDraw = 0x88E8, // GL_DYNAMIC_DRAW
+ DynamicRead = 0x88E9, // GL_DYNAMIC_READ
+ DynamicCopy = 0x88EA // GL_DYNAMIC_COPY
+ };
+
+ enum Access
+ {
+ ReadOnly = 0x88B8, // GL_READ_ONLY
+ WriteOnly = 0x88B9, // GL_WRITE_ONLY
+ ReadWrite = 0x88BA // GL_READ_WRITE
+ };
+
+ enum RangeAccessFlag
+ {
+ RangeRead = 0x0001, // GL_MAP_READ_BIT
+ RangeWrite = 0x0002, // GL_MAP_WRITE_BIT
+ RangeInvalidate = 0x0004, // GL_MAP_INVALIDATE_RANGE_BIT
+ RangeInvalidateBuffer = 0x0008, // GL_MAP_INVALIDATE_BUFFER_BIT
+ RangeFlushExplicit = 0x0010, // GL_MAP_FLUSH_EXPLICIT_BIT
+ RangeUnsynchronized = 0x0020 // GL_MAP_UNSYNCHRONIZED_BIT
+ };
+ Q_DECLARE_FLAGS(RangeAccessFlags, RangeAccessFlag)
+
+ QOpenGLBuffer::Type type() const;
+
+ QOpenGLBuffer::UsagePattern usagePattern() const;
+ void setUsagePattern(QOpenGLBuffer::UsagePattern value);
+
+ bool create();
+ bool isCreated() const;
+
+ void destroy();
+
+ bool bind();
+ void release();
+
+ static void release(QOpenGLBuffer::Type type);
+
+ GLuint bufferId() const;
+
+ int size() const;
+
+ bool read(int offset, void *data, int count);
+ void write(int offset, const void *data, int count);
+
+ void allocate(const void *data, int count);
+ inline void allocate(int count) { allocate(nullptr, count); }
+
+ void *map(QOpenGLBuffer::Access access);
+ void *mapRange(int offset, int count, QOpenGLBuffer::RangeAccessFlags access);
+ bool unmap();
+
+private:
+ QOpenGLBufferPrivate *d_ptr;
+
+ Q_DECLARE_PRIVATE(QOpenGLBuffer)
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLBuffer::RangeAccessFlags)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL
+
+#endif
diff --git a/src/opengl/qopenglcustomshaderstage.cpp b/src/opengl/qopenglcustomshaderstage.cpp
new file mode 100644
index 0000000000..7a32b2fbc0
--- /dev/null
+++ b/src/opengl/qopenglcustomshaderstage.cpp
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglcustomshaderstage_p.h"
+#include "qopenglengineshadermanager_p.h"
+#include "qopenglpaintengine_p.h"
+#include <private/qpainter_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLCustomShaderStagePrivate
+{
+public:
+ QOpenGLCustomShaderStagePrivate() :
+ m_manager(nullptr) {}
+
+ QPointer<QOpenGLEngineShaderManager> m_manager;
+ QByteArray m_source;
+};
+
+
+
+
+QOpenGLCustomShaderStage::QOpenGLCustomShaderStage()
+ : d_ptr(new QOpenGLCustomShaderStagePrivate)
+{
+}
+
+QOpenGLCustomShaderStage::~QOpenGLCustomShaderStage()
+{
+ Q_D(QOpenGLCustomShaderStage);
+ if (d->m_manager) {
+ d->m_manager->removeCustomStage();
+ d->m_manager->sharedShaders->cleanupCustomStage(this);
+ }
+ delete d_ptr;
+}
+
+void QOpenGLCustomShaderStage::setUniformsDirty()
+{
+ Q_D(QOpenGLCustomShaderStage);
+ if (d->m_manager)
+ d->m_manager->setDirty(); // ### Probably a bit overkill!
+}
+
+bool QOpenGLCustomShaderStage::setOnPainter(QPainter* p)
+{
+ Q_D(QOpenGLCustomShaderStage);
+ if (p->paintEngine()->type() != QPaintEngine::OpenGL2) {
+ qWarning("QOpenGLCustomShaderStage::setOnPainter() - paint engine not OpenGL2");
+ return false;
+ }
+ if (d->m_manager)
+ qWarning("Custom shader is already set on a painter");
+
+ QOpenGL2PaintEngineEx *engine = static_cast<QOpenGL2PaintEngineEx*>(p->paintEngine());
+ d->m_manager = QOpenGL2PaintEngineExPrivate::shaderManagerForEngine(engine);
+ Q_ASSERT(d->m_manager);
+
+ d->m_manager->setCustomStage(this);
+ return true;
+}
+
+void QOpenGLCustomShaderStage::removeFromPainter(QPainter* p)
+{
+ Q_D(QOpenGLCustomShaderStage);
+ if (p->paintEngine()->type() != QPaintEngine::OpenGL2)
+ return;
+
+ QOpenGL2PaintEngineEx *engine = static_cast<QOpenGL2PaintEngineEx*>(p->paintEngine());
+ d->m_manager = QOpenGL2PaintEngineExPrivate::shaderManagerForEngine(engine);
+ Q_ASSERT(d->m_manager);
+
+ // Just set the stage to null, don't call removeCustomStage().
+ // This should leave the program in a compiled/linked state
+ // if the next custom shader stage is this one again.
+ d->m_manager->setCustomStage(nullptr);
+ d->m_manager = nullptr;
+}
+
+QByteArray QOpenGLCustomShaderStage::source() const
+{
+ Q_D(const QOpenGLCustomShaderStage);
+ return d->m_source;
+}
+
+// Called by the shader manager if another custom shader is attached or
+// the manager is deleted
+void QOpenGLCustomShaderStage::setInactive()
+{
+ Q_D(QOpenGLCustomShaderStage);
+ d->m_manager = nullptr;
+}
+
+void QOpenGLCustomShaderStage::setSource(const QByteArray& s)
+{
+ Q_D(QOpenGLCustomShaderStage);
+ d->m_source = s;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglcustomshaderstage_p.h b/src/opengl/qopenglcustomshaderstage_p.h
new file mode 100644
index 0000000000..255c115e3c
--- /dev/null
+++ b/src/opengl/qopenglcustomshaderstage_p.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGL_CUSTOM_SHADER_STAGE_H
+#define QOPENGL_CUSTOM_SHADER_STAGE_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtOpenGL/qtopenglglobal.h>
+#include <QOpenGLShaderProgram>
+
+QT_BEGIN_NAMESPACE
+
+
+class QPainter;
+class QOpenGLCustomShaderStagePrivate;
+class Q_OPENGL_EXPORT QOpenGLCustomShaderStage
+{
+ Q_DECLARE_PRIVATE(QOpenGLCustomShaderStage)
+public:
+ QOpenGLCustomShaderStage();
+ virtual ~QOpenGLCustomShaderStage();
+ virtual void setUniforms(QOpenGLShaderProgram*) {}
+
+ void setUniformsDirty();
+
+ bool setOnPainter(QPainter*);
+ void removeFromPainter(QPainter*);
+ QByteArray source() const;
+
+ void setInactive();
+protected:
+ void setSource(const QByteArray&);
+
+private:
+ QOpenGLCustomShaderStagePrivate* d_ptr;
+
+ Q_DISABLE_COPY_MOVE(QOpenGLCustomShaderStage)
+};
+
+
+QT_END_NAMESPACE
+
+
+#endif
diff --git a/src/opengl/qopengldebug.cpp b/src/opengl/qopengldebug.cpp
new file mode 100644
index 0000000000..a69f6069dc
--- /dev/null
+++ b/src/opengl/qopengldebug.cpp
@@ -0,0 +1,1826 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/private/qobject_p.h>
+#include <QtCore/qglobal.h>
+#include <QtCore/qvarlengtharray.h>
+#include <QtGui/qopengl.h>
+#include <QtGui/qopenglfunctions.h>
+#include <QtGui/qoffscreensurface.h>
+
+#include "qopengldebug.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLDebugMessage
+ \brief The QOpenGLDebugMessage class wraps an OpenGL debug message.
+ \inmodule QtOpenGL
+ \reentrant
+ \since 5.1
+ \ingroup shared
+ \ingroup painting-3D
+
+ Debug messages are usually created by the OpenGL server and then read by
+ OpenGL clients (either from the OpenGL internal debug log, or logged in real-time).
+ A debug message has a textual representation, a vendor-specific numeric id,
+ a source, a type and a severity.
+
+ It's also possible for applications or third-party libraries and toolkits
+ to create and insert messages in the debug log. In order to do so, you can use
+ the createApplicationMessage() or the createThirdPartyMessage() static functions.
+
+ \sa QOpenGLDebugLogger
+*/
+
+/*!
+ \class QOpenGLDebugLogger
+ \brief The QOpenGLDebugLogger enables logging of OpenGL debugging messages.
+ \inmodule QtOpenGL
+ \since 5.1
+ \ingroup painting-3D
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ OpenGL programming can be very error prone. Most of the time, a single
+ failing call to OpenGL can cause an entire portion of an application to
+ stop working, with nothing being drawn on the screen.
+
+ The only way to be sure that no errors are being returned from the OpenGL
+ implementation is checking with \c{glGetError} after each and every API
+ call. Moreover, OpenGL errors stack up, therefore glGetError should always
+ be used in a loop like this:
+
+ \snippet code/src_gui_opengl_qopengldebug.cpp 0
+
+ If you try to clear the error stack, make sure not just keep going until
+ GL_NO_ERROR is returned but also break on GL_CONTEXT_LOST as that error
+ value will keep repeating.
+
+ There are also many other information we are interested in (as application
+ developers), for instance performance issues, or warnings about using
+ deprecated APIs. Those kind of messages are not reported through the
+ ordinary OpenGL error reporting mechanisms.
+
+ QOpenGLDebugLogger aims at addressing these issues by providing access to
+ the \e{OpenGL debug log}. If your OpenGL implementation supports it (by
+ exposing the \c{GL_KHR_debug} extension), messages from the OpenGL server
+ will be either logged in an internal OpenGL log, or passed in "real-time"
+ to listeners as they're generated from OpenGL.
+
+ QOpenGLDebugLogger supports both these modes of operation. Refer to the
+ following sections to find out the differences between them.
+
+ \section1 Creating an OpenGL Debug Context
+
+ For efficiency reasons, OpenGL implementations are allowed not to create
+ any debug output at all, unless the OpenGL context is a debug context. In order
+ to create a debug context from Qt, you must set the QSurfaceFormat::DebugContext
+ format option on the QSurfaceFormat used to create the QOpenGLContext object:
+
+ \snippet code/src_gui_opengl_qopengldebug.cpp 1
+
+ Note that requesting a 3.2 OpenGL Core Profile is just for the example's
+ purposes; this class is not tied to any specific OpenGL or OpenGL ES
+ version, as it relies on the availability of the \c{GL_KHR_debug} extension
+ (see below).
+
+ \section1 Creating and Initializing a QOpenGLDebugLogger
+
+ QOpenGLDebugLogger is a simple QObject-derived class. Just like all QObject
+ subclasses, you create an instance (and optionally specify a parent
+ object), and like the other OpenGL functions in Qt you \e{must} initialize
+ it before usage by calling initialize() whilst there is a current OpenGL context:
+
+ \snippet code/src_gui_opengl_qopengldebug.cpp 2
+
+ Note that the \c{GL_KHR_debug} extension \e{must} be available in the context
+ in order to access the messages logged by OpenGL. You can check the
+ presence of this extension by calling:
+
+ \snippet code/src_gui_opengl_qopengldebug.cpp 3
+
+ where \c{ctx} is a valid QOpenGLContext. If the extension is not available,
+ initialize() will return false.
+
+ \section1 Reading the Internal OpenGL Debug Log
+
+ OpenGL implementations keep an internal log of debug messages. Messages
+ stored in this log can be retrieved by using the loggedMessages() function:
+
+ \snippet code/src_gui_opengl_qopengldebug.cpp 4
+
+ The internal log has a limited size; when it fills up, older messages will
+ get discarded to make room for the new incoming messages. When you call
+ loggedMessages(), the internal log will be emptied as well.
+
+ If you want to be sure not to lose any debug message, you must use real-time
+ logging instead of calling this function. However, debug messages might
+ still be generated in the timespan between context creation and activation
+ of real-time logging (or, in general, when the real-time logging is disabled).
+
+ \section1 Real-time logging of messages
+
+ It is also possible to receive a stream of debug messages from the OpenGL
+ server \e{as they are generated} by the implementation. In order to do so,
+ you need to connect a suitable slot to the messageLogged() signal, and
+ start logging by calling startLogging():
+
+ \snippet code/src_gui_opengl_qopengldebug.cpp 5
+
+ Similarly, logging can be disabled at any time by calling the stopLogging()
+ function.
+
+ Real-time logging can be either asynchronous or synchronous, depending on
+ the parameter passed to startLogging(). When logging in asynchronous mode
+ (the default, as it has a very small overhead), the OpenGL implementation
+ can generate messages at any time, and/or in an order which is different from the
+ order of the OpenGL commands which caused those messages to be logged.
+ The messages could also be generated from a thread that it's different from
+ the thread the context is currently bound to. This is because OpenGL
+ implementations are usually highly threaded and asynchronous, and therefore
+ no warranties are made about the relative order and the timings of the
+ debug messages.
+
+ On the other hand, logging in synchronous mode has a high overhead, but
+ the OpenGL implementation guarantees that all the messages caused by a
+ certain command are received in order, before the command returns,
+ and from the same thread the OpenGL context is bound to.
+
+ This means that when logging in synchronous mode you will be able to run
+ your OpenGL application in a debugger, put a breakpoint on a slot connected
+ to the messageLogged() signal, and see in the backtrace the exact call
+ that caused the logged message. This can be extremely useful to debug
+ an OpenGL problem. Note that if OpenGL rendering is happening in another
+ thread, you must force the signal/slot connection type to Qt::DirectConnection
+ in order to be able to see the actual backtrace.
+
+ Refer to the LoggingMode enum documentation for more information about
+ logging modes.
+
+ \note When real-time logging is enabled, debug messages will \e{not} be
+ inserted in the internal OpenGL debug log any more; messages already
+ present in the internal log will not be deleted, nor they will be emitted
+ through the messageLogged() signal. Since some messages might be generated
+ before real-time logging is started (and therefore be kept in the internal
+ OpenGL log), it is important to always check if it contains any message
+ after calling startLogging().
+
+ \section1 Inserting Messages in the Debug Log
+
+ It is possible for applications and libraries to insert custom messages in
+ the debug log, for instance for marking a group of related OpenGL commands
+ and therefore being then able to identify eventual messages coming from them.
+
+ In order to do so, you can create a QOpenGLDebugMessage object by calling
+ \l{QOpenGLDebugMessage::}{createApplicationMessage()} or
+ \l{QOpenGLDebugMessage::}{createThirdPartyMessage()}, and then inserting it
+ into the log by calling logMessage():
+
+ \snippet code/src_gui_opengl_qopengldebug.cpp 6
+
+ Note that OpenGL implementations have a vendor-specific limit to the length
+ of the messages that can be inserted in the debug log. You can retrieve
+ this length by calling the maximumMessageLength() method; messages longer
+ than the limit will automatically get truncated.
+
+ \section1 Controlling the Debug Output
+
+ QOpenGLDebugMessage is also able to apply filters to the debug messages, and
+ therefore limit the amount of messages logged. You can enable or disable
+ logging of messages by calling enableMessages() and disableMessages()
+ respectively. By default, all messages are logged.
+
+ It is possible to enable or disable messages by selecting them by:
+
+ \list
+ \li source, type and severity (and including all ids in the selection);
+ \li id, source and type (and including all severities in the selection).
+ \endlist
+
+ Note that the "enabled" status for a given message is a property of the
+ (id, source, type, severity) tuple; the message attributes \e{do not} form
+ a hierarchy of any kind. You should be careful about the order of the calls
+ to enableMessages() and disableMessages(), as it will change which
+ messages will are enabled / disabled.
+
+ It's not possible to filter by the message text itself; applications
+ have to do that on their own (in slots connected to the messageLogged()
+ signal, or after fetching the messages in the internal debug log
+ through loggedMessages()).
+
+ In order to simplify the management of the enabled / disabled statuses,
+ QOpenGLDebugMessage also supports the concept of \c{debug groups}. A debug
+ group contains the group of enabled / disabled configurations of debug
+ messages. Moreover, debug groups are organized in a stack: it is possible
+ to push and pop groups by calling pushGroup() and popGroup() respectively.
+ (When an OpenGL context is created, there is already a group in the stack).
+
+ The enableMessages() and disableMessages() functions will modify the
+ configuration in the current debug group, that is, the one at the top of
+ the debug groups stack.
+
+ When a new group is pushed onto the debug groups stack, it will inherit
+ the configuration of the group that was previously on the top of the stack.
+ Vice versa, popping a debug group will restore the configuration of
+ the debug group that becomes the new top.
+
+ Pushing (respectively popping) debug groups will also automatically generate
+ a debug message of type QOpenGLDebugMessage::GroupPushType (respectively
+ \l{QOpenGLDebugMessage::}{GroupPopType}).
+
+ \sa QOpenGLDebugMessage
+*/
+
+/*!
+ \enum QOpenGLDebugMessage::Source
+
+ The Source enum defines the source of the debug message.
+
+ \value InvalidSource
+ The source of the message is invalid; this is the source of a
+ default-constructed QOpenGLDebugMessage object.
+
+ \value APISource
+ The message was generated in response to OpenGL API calls.
+
+ \value WindowSystemSource
+ The message was generated by the window system.
+
+ \value ShaderCompilerSource
+ The message was generated by the shader compiler.
+
+ \value ThirdPartySource
+ The message was generated by a third party, for instance an OpenGL
+ framework a or debugging toolkit.
+
+ \value ApplicationSource
+ The message was generated by the application itself.
+
+ \value OtherSource
+ The message was generated by a source not included in this
+ enumeration.
+
+ \omitvalue LastSource
+
+ \value AnySource
+ This value corresponds to a mask of all possible message sources.
+*/
+
+/*!
+ \enum QOpenGLDebugMessage::Type
+
+ The Type enum defines the type of the debug message.
+
+ \value InvalidType
+ The type of the message is invalid; this is the type of a
+ default-constructed QOpenGLDebugMessage object.
+
+ \value ErrorType
+ The message represents an error.
+
+ \value DeprecatedBehaviorType
+ The message represents an usage of deprecated behavior.
+
+ \value UndefinedBehaviorType
+ The message represents an usage of undefined behavior.
+
+ \value PortabilityType
+ The message represents an usage of vendor-specific behavior,
+ that might pose portability concerns.
+
+ \value PerformanceType
+ The message represents a performance issue.
+
+ \value OtherType
+ The message represents a type not included in this
+ enumeration.
+
+ \value MarkerType
+ The message represents a marker in the debug log.
+
+ \value GroupPushType
+ The message represents a debug group push operation.
+
+ \value GroupPopType
+ The message represents a debug group pop operation.
+
+ \omitvalue LastType
+
+ \value AnyType
+ This value corresponds to a mask of all possible message types.
+*/
+
+/*!
+ \enum QOpenGLDebugMessage::Severity
+
+ The Severity enum defines the severity of the debug message.
+
+ \value InvalidSeverity
+ The severity of the message is invalid; this is the severity of a
+ default-constructed QOpenGLDebugMessage object.
+
+ \value HighSeverity
+ The message has a high severity.
+
+ \value MediumSeverity
+ The message has a medium severity.
+
+ \value LowSeverity
+ The message has a low severity.
+
+ \value NotificationSeverity
+ The message is a notification.
+
+ \omitvalue LastSeverity
+
+ \value AnySeverity
+ This value corresponds to a mask of all possible message severities.
+*/
+
+/*!
+ \property QOpenGLDebugLogger::loggingMode
+
+ \brief the logging mode passed to startLogging().
+
+ Note that logging must have been started or the value of this property
+ will be meaningless.
+
+ \sa startLogging(), isLogging()
+*/
+/*!
+ \enum QOpenGLDebugLogger::LoggingMode
+
+ The LoggingMode enum defines the logging mode of the logger object.
+
+ \value AsynchronousLogging
+ Messages from the OpenGL server are logged asynchronously. This means
+ that messages can be logged some time after the corresponding OpenGL
+ actions that caused them, and even be received in an out-of-order
+ fashion, depending on the OpenGL implementation. This mode has a very low
+ performance penalty, as OpenGL implementations are heavily threaded
+ and asynchronous by nature.
+
+ \value SynchronousLogging
+ Messages from the OpenGL server are logged synchronously and
+ sequentially. This has a severe performance hit, as OpenGL
+ implementations are very asynchronous by nature; but it's very useful
+ to debug OpenGL problems, as OpenGL guarantees that the messages
+ generated by a OpenGL command will be logged before the corresponding
+ command execution has returned. Therefore, you can install a breakpoint
+ on the messageLogged() signal and see in the backtrace which OpenGL
+ command caused it; the only caveat is that if you are using OpenGL from
+ multiple threads you may need to force direct connection when
+ connecting to the messageLogged() signal.
+*/
+
+// When using OpenGL ES 2.0, all the necessary GL_KHR_debug constants are
+// provided in qopengles2ext.h. Unfortunately, newer versions of that file
+// suffix everything with _KHR which causes extra headache when the goal is
+// to have a single piece of code that builds in all our target
+// environments. Therefore, try to detect this and use our custom defines
+// instead, which we anyway need for OS X.
+
+#if defined(GL_KHR_debug) && defined(GL_DEBUG_SOURCE_API_KHR)
+#define USE_MANUAL_DEFS
+#endif
+
+// Under OSX (at least up to 10.8) we cannot include our copy of glext.h,
+// but we use the system-wide one, which unfortunately lacks all the needed
+// defines/typedefs. In order to make the code compile, we just add here
+// the GL_KHR_debug defines.
+
+#ifndef GL_KHR_debug
+#define GL_KHR_debug 1
+#define USE_MANUAL_DEFS
+#endif
+
+#ifdef USE_MANUAL_DEFS
+
+#ifndef GL_DEBUG_OUTPUT_SYNCHRONOUS
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
+#endif
+#ifndef GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
+#endif
+#ifndef GL_DEBUG_CALLBACK_FUNCTION
+#define GL_DEBUG_CALLBACK_FUNCTION 0x8244
+#endif
+#ifndef GL_DEBUG_CALLBACK_USER_PARAM
+#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
+#endif
+#ifndef GL_DEBUG_SOURCE_API
+#define GL_DEBUG_SOURCE_API 0x8246
+#endif
+#ifndef GL_DEBUG_SOURCE_WINDOW_SYSTEM
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
+#endif
+#ifndef GL_DEBUG_SOURCE_SHADER_COMPILER
+#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
+#endif
+#ifndef GL_DEBUG_SOURCE_THIRD_PARTY
+#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
+#endif
+#ifndef GL_DEBUG_SOURCE_APPLICATION
+#define GL_DEBUG_SOURCE_APPLICATION 0x824A
+#endif
+#ifndef GL_DEBUG_SOURCE_OTHER
+#define GL_DEBUG_SOURCE_OTHER 0x824B
+#endif
+#ifndef GL_DEBUG_TYPE_ERROR
+#define GL_DEBUG_TYPE_ERROR 0x824C
+#endif
+#ifndef GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
+#endif
+#ifndef GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
+#endif
+#ifndef GL_DEBUG_TYPE_PORTABILITY
+#define GL_DEBUG_TYPE_PORTABILITY 0x824F
+#endif
+#ifndef GL_DEBUG_TYPE_PERFORMANCE
+#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
+#endif
+#ifndef GL_DEBUG_TYPE_OTHER
+#define GL_DEBUG_TYPE_OTHER 0x8251
+#endif
+#ifndef GL_DEBUG_TYPE_MARKER
+#define GL_DEBUG_TYPE_MARKER 0x8268
+#endif
+#ifndef GL_DEBUG_TYPE_PUSH_GROUP
+#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
+#endif
+#ifndef GL_DEBUG_TYPE_POP_GROUP
+#define GL_DEBUG_TYPE_POP_GROUP 0x826A
+#endif
+#ifndef GL_DEBUG_SEVERITY_NOTIFICATION
+#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
+#endif
+#ifndef GL_MAX_DEBUG_GROUP_STACK_DEPTH
+#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
+#endif
+#ifndef GL_DEBUG_GROUP_STACK_DEPTH
+#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
+#endif
+#ifndef GL_BUFFER
+#define GL_BUFFER 0x82E0
+#endif
+#ifndef GL_SHADER
+#define GL_SHADER 0x82E1
+#endif
+#ifndef GL_PROGRAM
+#define GL_PROGRAM 0x82E2
+#endif
+#ifndef GL_QUERY
+#define GL_QUERY 0x82E3
+#endif
+#ifndef GL_PROGRAM_PIPELINE
+#define GL_PROGRAM_PIPELINE 0x82E4
+#endif
+#ifndef GL_SAMPLER
+#define GL_SAMPLER 0x82E6
+#endif
+#ifndef GL_DISPLAY_LIST
+#define GL_DISPLAY_LIST 0x82E7
+#endif
+#ifndef GL_MAX_LABEL_LENGTH
+#define GL_MAX_LABEL_LENGTH 0x82E8
+#endif
+#ifndef GL_MAX_DEBUG_MESSAGE_LENGTH
+#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
+#endif
+#ifndef GL_MAX_DEBUG_LOGGED_MESSAGES
+#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
+#endif
+#ifndef GL_DEBUG_LOGGED_MESSAGES
+#define GL_DEBUG_LOGGED_MESSAGES 0x9145
+#endif
+#ifndef GL_DEBUG_SEVERITY_HIGH
+#define GL_DEBUG_SEVERITY_HIGH 0x9146
+#endif
+#ifndef GL_DEBUG_SEVERITY_MEDIUM
+#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
+#endif
+#ifndef GL_DEBUG_SEVERITY_LOW
+#define GL_DEBUG_SEVERITY_LOW 0x9148
+#endif
+#ifndef GL_DEBUG_OUTPUT
+#define GL_DEBUG_OUTPUT 0x92E0
+#endif
+#ifndef GL_CONTEXT_FLAG_DEBUG_BIT
+#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
+#endif
+#ifndef GL_STACK_OVERFLOW
+#define GL_STACK_OVERFLOW 0x0503
+#endif
+#ifndef GL_STACK_UNDERFLOW
+#define GL_STACK_UNDERFLOW 0x0504
+#endif
+
+typedef void (QOPENGLF_APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const GLvoid *userParam);
+
+#endif /* USE_MANUAL_DEFS */
+
+
+/*!
+ \internal
+*/
+static QOpenGLDebugMessage::Source qt_messageSourceFromGL(GLenum source)
+{
+ switch (source) {
+ case GL_DEBUG_SOURCE_API:
+ return QOpenGLDebugMessage::APISource;
+ case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
+ return QOpenGLDebugMessage::WindowSystemSource;
+ case GL_DEBUG_SOURCE_SHADER_COMPILER:
+ return QOpenGLDebugMessage::ShaderCompilerSource;
+ case GL_DEBUG_SOURCE_THIRD_PARTY:
+ return QOpenGLDebugMessage::ThirdPartySource;
+ case GL_DEBUG_SOURCE_APPLICATION:
+ return QOpenGLDebugMessage::ApplicationSource;
+ case GL_DEBUG_SOURCE_OTHER:
+ return QOpenGLDebugMessage::OtherSource;
+ }
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message source from GL");
+ return QOpenGLDebugMessage::OtherSource;
+}
+
+/*!
+ \internal
+*/
+static GLenum qt_messageSourceToGL(QOpenGLDebugMessage::Source source)
+{
+ switch (source) {
+ case QOpenGLDebugMessage::InvalidSource:
+ break;
+ case QOpenGLDebugMessage::APISource:
+ return GL_DEBUG_SOURCE_API;
+ case QOpenGLDebugMessage::WindowSystemSource:
+ return GL_DEBUG_SOURCE_WINDOW_SYSTEM;
+ case QOpenGLDebugMessage::ShaderCompilerSource:
+ return GL_DEBUG_SOURCE_SHADER_COMPILER;
+ case QOpenGLDebugMessage::ThirdPartySource:
+ return GL_DEBUG_SOURCE_THIRD_PARTY;
+ case QOpenGLDebugMessage::ApplicationSource:
+ return GL_DEBUG_SOURCE_APPLICATION;
+ case QOpenGLDebugMessage::OtherSource:
+ return GL_DEBUG_SOURCE_OTHER;
+ case QOpenGLDebugMessage::AnySource:
+ break;
+ }
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid message source");
+ return GL_DEBUG_SOURCE_OTHER;
+}
+
+/*!
+ \internal
+*/
+static QString qt_messageSourceToString(QOpenGLDebugMessage::Source source)
+{
+ switch (source) {
+ case QOpenGLDebugMessage::InvalidSource:
+ return QStringLiteral("InvalidSource");
+ case QOpenGLDebugMessage::APISource:
+ return QStringLiteral("APISource");
+ case QOpenGLDebugMessage::WindowSystemSource:
+ return QStringLiteral("WindowSystemSource");
+ case QOpenGLDebugMessage::ShaderCompilerSource:
+ return QStringLiteral("ShaderCompilerSource");
+ case QOpenGLDebugMessage::ThirdPartySource:
+ return QStringLiteral("ThirdPartySource");
+ case QOpenGLDebugMessage::ApplicationSource:
+ return QStringLiteral("ApplicationSource");
+ case QOpenGLDebugMessage::OtherSource:
+ return QStringLiteral("OtherSource");
+ case QOpenGLDebugMessage::AnySource:
+ return QStringLiteral("AnySource");
+ }
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message source");
+ return QString();
+}
+
+/*!
+ \internal
+*/
+static QOpenGLDebugMessage::Type qt_messageTypeFromGL(GLenum type)
+{
+ switch (type) {
+ case GL_DEBUG_TYPE_ERROR:
+ return QOpenGLDebugMessage::ErrorType;
+ case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
+ return QOpenGLDebugMessage::DeprecatedBehaviorType;
+ case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
+ return QOpenGLDebugMessage::UndefinedBehaviorType;
+ case GL_DEBUG_TYPE_PORTABILITY:
+ return QOpenGLDebugMessage::PortabilityType;
+ case GL_DEBUG_TYPE_PERFORMANCE:
+ return QOpenGLDebugMessage::PerformanceType;
+ case GL_DEBUG_TYPE_OTHER:
+ return QOpenGLDebugMessage::OtherType;
+ case GL_DEBUG_TYPE_MARKER:
+ return QOpenGLDebugMessage::MarkerType;
+ case GL_DEBUG_TYPE_PUSH_GROUP:
+ return QOpenGLDebugMessage::GroupPushType;
+ case GL_DEBUG_TYPE_POP_GROUP:
+ return QOpenGLDebugMessage::GroupPopType;
+ }
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message type from GL");
+ return QOpenGLDebugMessage::OtherType;
+}
+
+/*!
+ \internal
+*/
+static GLenum qt_messageTypeToGL(QOpenGLDebugMessage::Type type)
+{
+ switch (type) {
+ case QOpenGLDebugMessage::InvalidType:
+ break;
+ case QOpenGLDebugMessage::ErrorType:
+ return GL_DEBUG_TYPE_ERROR;
+ case QOpenGLDebugMessage::DeprecatedBehaviorType:
+ return GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR;
+ case QOpenGLDebugMessage::UndefinedBehaviorType:
+ return GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR;
+ case QOpenGLDebugMessage::PortabilityType:
+ return GL_DEBUG_TYPE_PORTABILITY;
+ case QOpenGLDebugMessage::PerformanceType:
+ return GL_DEBUG_TYPE_PERFORMANCE;
+ case QOpenGLDebugMessage::OtherType:
+ return GL_DEBUG_TYPE_OTHER;
+ case QOpenGLDebugMessage::MarkerType:
+ return GL_DEBUG_TYPE_MARKER;
+ case QOpenGLDebugMessage::GroupPushType:
+ return GL_DEBUG_TYPE_PUSH_GROUP;
+ case QOpenGLDebugMessage::GroupPopType:
+ return GL_DEBUG_TYPE_POP_GROUP;
+ case QOpenGLDebugMessage::AnyType:
+ break;
+ }
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid message type");
+ return GL_DEBUG_TYPE_OTHER;
+}
+
+/*!
+ \internal
+*/
+static QString qt_messageTypeToString(QOpenGLDebugMessage::Type type)
+{
+ switch (type) {
+ case QOpenGLDebugMessage::InvalidType:
+ return QStringLiteral("InvalidType");
+ case QOpenGLDebugMessage::ErrorType:
+ return QStringLiteral("ErrorType");
+ case QOpenGLDebugMessage::DeprecatedBehaviorType:
+ return QStringLiteral("DeprecatedBehaviorType");
+ case QOpenGLDebugMessage::UndefinedBehaviorType:
+ return QStringLiteral("UndefinedBehaviorType");
+ case QOpenGLDebugMessage::PortabilityType:
+ return QStringLiteral("PortabilityType");
+ case QOpenGLDebugMessage::PerformanceType:
+ return QStringLiteral("PerformanceType");
+ case QOpenGLDebugMessage::OtherType:
+ return QStringLiteral("OtherType");
+ case QOpenGLDebugMessage::MarkerType:
+ return QStringLiteral("MarkerType");
+ case QOpenGLDebugMessage::GroupPushType:
+ return QStringLiteral("GroupPushType");
+ case QOpenGLDebugMessage::GroupPopType:
+ return QStringLiteral("GroupPopType");
+ case QOpenGLDebugMessage::AnyType:
+ return QStringLiteral("AnyType");
+ }
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message type");
+ return QString();
+}
+
+/*!
+ \internal
+*/
+static QOpenGLDebugMessage::Severity qt_messageSeverityFromGL(GLenum severity)
+{
+ switch (severity) {
+ case GL_DEBUG_SEVERITY_HIGH:
+ return QOpenGLDebugMessage::HighSeverity;
+ case GL_DEBUG_SEVERITY_MEDIUM:
+ return QOpenGLDebugMessage::MediumSeverity;
+ case GL_DEBUG_SEVERITY_LOW:
+ return QOpenGLDebugMessage::LowSeverity;
+ case GL_DEBUG_SEVERITY_NOTIFICATION:
+ return QOpenGLDebugMessage::NotificationSeverity;
+ }
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message severity from GL");
+ return QOpenGLDebugMessage::NotificationSeverity;
+}
+
+/*!
+ \internal
+*/
+static GLenum qt_messageSeverityToGL(QOpenGLDebugMessage::Severity severity)
+{
+ switch (severity) {
+ case QOpenGLDebugMessage::InvalidSeverity:
+ break;
+ case QOpenGLDebugMessage::HighSeverity:
+ return GL_DEBUG_SEVERITY_HIGH;
+ case QOpenGLDebugMessage::MediumSeverity:
+ return GL_DEBUG_SEVERITY_MEDIUM;
+ case QOpenGLDebugMessage::LowSeverity:
+ return GL_DEBUG_SEVERITY_LOW;
+ case QOpenGLDebugMessage::NotificationSeverity:
+ return GL_DEBUG_SEVERITY_NOTIFICATION;
+ case QOpenGLDebugMessage::AnySeverity:
+ break;
+ }
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid message severity");
+ return GL_DEBUG_SEVERITY_NOTIFICATION;
+}
+
+/*!
+ \internal
+*/
+static QString qt_messageSeverityToString(QOpenGLDebugMessage::Severity severity)
+{
+ switch (severity) {
+ case QOpenGLDebugMessage::InvalidSeverity:
+ return QStringLiteral("InvalidSeverity");
+ case QOpenGLDebugMessage::HighSeverity:
+ return QStringLiteral("HighSeverity");
+ case QOpenGLDebugMessage::MediumSeverity:
+ return QStringLiteral("MediumSeverity");
+ case QOpenGLDebugMessage::LowSeverity:
+ return QStringLiteral("LowSeverity");
+ case QOpenGLDebugMessage::NotificationSeverity:
+ return QStringLiteral("NotificationSeverity");
+ case QOpenGLDebugMessage::AnySeverity:
+ return QStringLiteral("AnySeverity");
+ }
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown message severity");
+ return QString();
+}
+
+class QOpenGLDebugMessagePrivate : public QSharedData
+{
+public:
+ QOpenGLDebugMessagePrivate();
+
+ QString message;
+ GLuint id;
+ QOpenGLDebugMessage::Source source;
+ QOpenGLDebugMessage::Type type;
+ QOpenGLDebugMessage::Severity severity;
+};
+
+/*!
+ \internal
+*/
+QOpenGLDebugMessagePrivate::QOpenGLDebugMessagePrivate()
+ : message(),
+ id(0),
+ source(QOpenGLDebugMessage::InvalidSource),
+ type(QOpenGLDebugMessage::InvalidType),
+ severity(QOpenGLDebugMessage::InvalidSeverity)
+{
+}
+
+
+/*!
+ Constructs a debug message with an empty message string, id set to 0,
+ source set to InvalidSource, type set to InvalidType, and severity set to
+ InvalidSeverity.
+
+ \note This constructor should not be used to create a debug message;
+ instead, use the createApplicationMessage() or the createThirdPartyMessage()
+ static functions.
+
+ \sa createApplicationMessage(), createThirdPartyMessage()
+*/
+QOpenGLDebugMessage::QOpenGLDebugMessage()
+ : d(new QOpenGLDebugMessagePrivate)
+{
+}
+
+/*!
+ Constructs a debug message as a copy of \a debugMessage.
+
+ \sa operator=()
+*/
+QOpenGLDebugMessage::QOpenGLDebugMessage(const QOpenGLDebugMessage &debugMessage)
+ : d(debugMessage.d)
+{
+}
+
+/*!
+ Destroys this debug message.
+*/
+QOpenGLDebugMessage::~QOpenGLDebugMessage()
+{
+}
+
+/*!
+ Assigns the message \a debugMessage to this object, and returns a reference
+ to the copy.
+*/
+QOpenGLDebugMessage &QOpenGLDebugMessage::operator=(const QOpenGLDebugMessage &debugMessage)
+{
+ d = debugMessage.d;
+ return *this;
+}
+
+/*!
+ \fn QOpenGLDebugMessage &QOpenGLDebugMessage::operator=(QOpenGLDebugMessage &&debugMessage)
+
+ Move-assigns \a debugMessage to this object.
+*/
+
+/*!
+ \fn void QOpenGLDebugMessage::swap(QOpenGLDebugMessage &debugMessage)
+
+ Swaps the message \a debugMessage with this message. This operation is very
+ fast and never fails.
+*/
+
+/*!
+ Returns the source of the debug message.
+*/
+QOpenGLDebugMessage::Source QOpenGLDebugMessage::source() const
+{
+ return d->source;
+}
+
+/*!
+ Returns the type of the debug message.
+*/
+QOpenGLDebugMessage::Type QOpenGLDebugMessage::type() const
+{
+ return d->type;
+}
+
+/*!
+ Returns the severity of the debug message.
+*/
+QOpenGLDebugMessage::Severity QOpenGLDebugMessage::severity() const
+{
+ return d->severity;
+}
+
+/*!
+ Returns the id of the debug message. Ids are generally vendor-specific.
+*/
+GLuint QOpenGLDebugMessage::id() const
+{
+ return d->id;
+}
+
+/*!
+ Returns the textual message contained by this debug message.
+*/
+QString QOpenGLDebugMessage::message() const
+{
+ return d->message;
+}
+
+/*!
+ Constructs and returns a debug message with \a text as its text, \a id
+ as id, \a severity as severity, and \a type as type. The message source
+ will be set to ApplicationSource.
+
+ \sa QOpenGLDebugLogger::logMessage(), createThirdPartyMessage()
+*/
+QOpenGLDebugMessage QOpenGLDebugMessage::createApplicationMessage(const QString &text,
+ GLuint id,
+ QOpenGLDebugMessage::Severity severity,
+ QOpenGLDebugMessage::Type type)
+{
+ QOpenGLDebugMessage m;
+ m.d->message = text;
+ m.d->id = id;
+ m.d->severity = severity;
+ m.d->type = type;
+ m.d->source = ApplicationSource;
+ return m;
+}
+
+/*!
+ Constructs and returns a debug message with \a text as its text, \a id
+ as id, \a severity as severity, and \a type as type. The message source
+ will be set to ThirdPartySource.
+
+ \sa QOpenGLDebugLogger::logMessage(), createApplicationMessage()
+*/
+QOpenGLDebugMessage QOpenGLDebugMessage::createThirdPartyMessage(const QString &text,
+ GLuint id,
+ QOpenGLDebugMessage::Severity severity,
+ QOpenGLDebugMessage::Type type)
+{
+ QOpenGLDebugMessage m;
+ m.d->message = text;
+ m.d->id = id;
+ m.d->severity = severity;
+ m.d->type = type;
+ m.d->source = ThirdPartySource;
+ return m;
+}
+
+/*!
+ Returns \c true if this debug message is equal to \a debugMessage, or false
+ otherwise. Two debugging messages are equal if they have the same textual
+ message, the same id, the same source, the same type and the same severity.
+
+ \sa operator!=()
+*/
+bool QOpenGLDebugMessage::operator==(const QOpenGLDebugMessage &debugMessage) const
+{
+ return (d == debugMessage.d)
+ || (d->id == debugMessage.d->id
+ && d->source == debugMessage.d->source
+ && d->type == debugMessage.d->type
+ && d->severity == debugMessage.d->severity
+ && d->message == debugMessage.d->message);
+}
+
+/*!
+ \fn bool QOpenGLDebugMessage::operator!=(const QOpenGLDebugMessage &debugMessage) const
+
+ Returns \c true if this message is different from \a debugMessage, or false
+ otherwise.
+
+ \sa operator==()
+*/
+
+#ifndef QT_NO_DEBUG_STREAM
+/*!
+ \relates QOpenGLDebugMessage
+
+ Writes the source \a source into the debug object \a debug for debugging
+ purposes.
+*/
+QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Source source)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "QOpenGLDebugMessage::Source("
+ << qt_messageSourceToString(source)
+ << ')';
+ return debug;
+}
+
+/*!
+ \relates QOpenGLDebugMessage
+
+ Writes the type \a type into the debug object \a debug for debugging
+ purposes.
+*/
+QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Type type)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "QOpenGLDebugMessage::Type("
+ << qt_messageTypeToString(type)
+ << ')';
+ return debug;
+}
+
+/*!
+ \relates QOpenGLDebugMessage
+
+ Writes the severity \a severity into the debug object \a debug for debugging
+ purposes.
+*/
+QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Severity severity)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "QOpenGLDebugMessage::Severity("
+ << qt_messageSeverityToString(severity)
+ << ')';
+ return debug;
+}
+
+/*!
+ \relates QOpenGLDebugMessage
+
+ Writes the message \a message into the debug object \a debug for debugging
+ purposes.
+*/
+QDebug operator<<(QDebug debug, const QOpenGLDebugMessage &message)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "QOpenGLDebugMessage("
+ << qt_messageSourceToString(message.source()) << ", "
+ << message.id() << ", "
+ << message.message() << ", "
+ << qt_messageSeverityToString(message.severity()) << ", "
+ << qt_messageTypeToString(message.type()) << ')';
+ return debug;
+
+}
+#endif // QT_NO_DEBUG_STREAM
+
+typedef void (QOPENGLF_APIENTRYP qt_glDebugMessageControl_t)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+typedef void (QOPENGLF_APIENTRYP qt_glDebugMessageInsert_t)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+typedef void (QOPENGLF_APIENTRYP qt_glDebugMessageCallback_t)(GLDEBUGPROC callback, const void *userParam);
+typedef GLuint (QOPENGLF_APIENTRYP qt_glGetDebugMessageLog_t)(GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+typedef void (QOPENGLF_APIENTRYP qt_glPushDebugGroup_t)(GLenum source, GLuint id, GLsizei length, const GLchar *message);
+typedef void (QOPENGLF_APIENTRYP qt_glPopDebugGroup_t)();
+typedef void (QOPENGLF_APIENTRYP qt_glGetPointerv_t)(GLenum pname, GLvoid **params);
+
+class QOpenGLDebugLoggerPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QOpenGLDebugLogger)
+public:
+ QOpenGLDebugLoggerPrivate();
+
+ void handleMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *rawMessage);
+ void controlDebugMessages(QOpenGLDebugMessage::Sources sources,
+ QOpenGLDebugMessage::Types types,
+ QOpenGLDebugMessage::Severities severities,
+ const QVector<GLuint> &ids,
+ const QByteArray &callerName,
+ bool enable);
+ void _q_contextAboutToBeDestroyed();
+
+ qt_glDebugMessageControl_t glDebugMessageControl;
+ qt_glDebugMessageInsert_t glDebugMessageInsert;
+ qt_glDebugMessageCallback_t glDebugMessageCallback;
+ qt_glGetDebugMessageLog_t glGetDebugMessageLog;
+ qt_glPushDebugGroup_t glPushDebugGroup;
+ qt_glPopDebugGroup_t glPopDebugGroup;
+ qt_glGetPointerv_t glGetPointerv;
+
+ GLDEBUGPROC oldDebugCallbackFunction;
+ void *oldDebugCallbackParameter;
+ QOpenGLContext *context;
+ GLint maxMessageLength;
+ QOpenGLDebugLogger::LoggingMode loggingMode;
+ bool initialized : 1;
+ bool isLogging : 1;
+ bool debugWasEnabled : 1;
+ bool syncDebugWasEnabled : 1;
+};
+
+/*!
+ \internal
+*/
+QOpenGLDebugLoggerPrivate::QOpenGLDebugLoggerPrivate()
+ : glDebugMessageControl(nullptr),
+ glDebugMessageInsert(nullptr),
+ glDebugMessageCallback(nullptr),
+ glGetDebugMessageLog(nullptr),
+ glPushDebugGroup(nullptr),
+ glPopDebugGroup(nullptr),
+ oldDebugCallbackFunction(nullptr),
+ context(nullptr),
+ maxMessageLength(0),
+ loggingMode(QOpenGLDebugLogger::AsynchronousLogging),
+ initialized(false),
+ isLogging(false),
+ debugWasEnabled(false),
+ syncDebugWasEnabled(false)
+{
+}
+
+/*!
+ \internal
+*/
+void QOpenGLDebugLoggerPrivate::handleMessage(GLenum source,
+ GLenum type,
+ GLuint id,
+ GLenum severity,
+ GLsizei length,
+ const GLchar *rawMessage)
+{
+ if (oldDebugCallbackFunction)
+ oldDebugCallbackFunction(source, type, id, severity, length, rawMessage, oldDebugCallbackParameter);
+
+ QOpenGLDebugMessage message;
+
+ QOpenGLDebugMessagePrivate *messagePrivate = message.d.data();
+ messagePrivate->source = qt_messageSourceFromGL(source);
+ messagePrivate->type = qt_messageTypeFromGL(type);
+ messagePrivate->id = id;
+ messagePrivate->severity = qt_messageSeverityFromGL(severity);
+ // not passing the length to fromUtf8, as some bugged OpenGL drivers
+ // do not handle the length correctly. Just rely on the message to be NUL terminated.
+ messagePrivate->message = QString::fromUtf8(rawMessage);
+
+ Q_Q(QOpenGLDebugLogger);
+ emit q->messageLogged(message);
+}
+
+/*!
+ \internal
+*/
+void QOpenGLDebugLoggerPrivate::controlDebugMessages(QOpenGLDebugMessage::Sources sources,
+ QOpenGLDebugMessage::Types types,
+ QOpenGLDebugMessage::Severities severities,
+ const QVector<GLuint> &ids,
+ const QByteArray &callerName,
+ bool enable)
+{
+ if (!initialized) {
+ qWarning("QOpenGLDebugLogger::%s(): object must be initialized before enabling/disabling messages", callerName.constData());
+ return;
+ }
+ if (sources == QOpenGLDebugMessage::InvalidSource) {
+ qWarning("QOpenGLDebugLogger::%s(): invalid source specified", callerName.constData());
+ return;
+ }
+ if (types == QOpenGLDebugMessage::InvalidType) {
+ qWarning("QOpenGLDebugLogger::%s(): invalid type specified", callerName.constData());
+ return;
+ }
+ if (severities == QOpenGLDebugMessage::InvalidSeverity) {
+ qWarning("QOpenGLDebugLogger::%s(): invalid severity specified", callerName.constData());
+ return;
+ }
+
+ QVarLengthArray<GLenum, 8> glSources;
+ QVarLengthArray<GLenum, 8> glTypes;
+ QVarLengthArray<GLenum, 8> glSeverities;
+
+ if (ids.count() > 0) {
+ Q_ASSERT(severities == QOpenGLDebugMessage::AnySeverity);
+
+ // The GL_KHR_debug extension says:
+ //
+ // - If <count> is greater than zero, then <ids> is an array of <count>
+ // message IDs for the specified combination of <source> and <type>. In
+ // this case, if <source> or <type> is DONT_CARE, or <severity> is not
+ // DONT_CARE, the error INVALID_OPERATION is generated. If <count> is
+ // zero, the value if <ids> is ignored.
+ //
+ // This means we can't convert AnySource or AnyType into DONT_CARE, but we have to roll
+ // them into individual sources/types.
+
+ if (sources == QOpenGLDebugMessage::AnySource) {
+ sources = QOpenGLDebugMessage::InvalidSource;
+ for (uint i = 1; i <= QOpenGLDebugMessage::LastSource; i = i << 1)
+ sources |= QOpenGLDebugMessage::Source(i);
+ }
+
+ if (types == QOpenGLDebugMessage::AnyType) {
+ types = QOpenGLDebugMessage::InvalidType;
+ for (uint i = 1; i <= QOpenGLDebugMessage::LastType; i = i << 1)
+ types |= QOpenGLDebugMessage::Type(i);
+ }
+ }
+
+#define CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS(type, source, target) \
+ if (source == QOpenGLDebugMessage::Any ## type) { \
+ target << GL_DONT_CARE; \
+ } else { \
+ for (uint i = 1; i <= QOpenGLDebugMessage::Last ## type; i = i << 1) \
+ if (source.testFlag(QOpenGLDebugMessage:: type (i))) \
+ target << qt_message ## type ## ToGL (QOpenGLDebugMessage:: type (i)); \
+ }
+
+ CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS(Source, sources, glSources)
+ CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS(Type, types, glTypes)
+ CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS(Severity, severities, glSeverities)
+#undef CONVERT_TO_GL_DEBUG_MESSAGE_CONTROL_PARAMETERS
+
+ const GLsizei idCount = ids.count();
+ // The GL_KHR_debug extension says that if idCount is 0, idPtr must be ignored.
+ // Unfortunately, some bugged drivers do NOT ignore it, so pass NULL in case.
+ const GLuint * const idPtr = idCount ? ids.constData() : nullptr;
+
+ for (GLenum source : glSources)
+ for (GLenum type : glTypes)
+ for (GLenum severity : glSeverities)
+ glDebugMessageControl(source, type, severity, idCount, idPtr, GLboolean(enable));
+}
+
+/*!
+ \internal
+*/
+void QOpenGLDebugLoggerPrivate::_q_contextAboutToBeDestroyed()
+{
+ Q_ASSERT(context);
+
+ // Re-make our context current somehow, otherwise stopLogging will fail.
+
+ // Save the current context and its surface in case we need to set them back
+ QOpenGLContext *currentContext = QOpenGLContext::currentContext();
+ QSurface *currentSurface = nullptr;
+
+ QScopedPointer<QOffscreenSurface> offscreenSurface;
+
+ if (context != currentContext) {
+ // Make our old context current on a temporary surface
+ if (currentContext)
+ currentSurface = currentContext->surface();
+
+ offscreenSurface.reset(new QOffscreenSurface);
+ offscreenSurface->setFormat(context->format());
+ offscreenSurface->create();
+ if (!context->makeCurrent(offscreenSurface.data()))
+ qWarning("QOpenGLDebugLoggerPrivate::_q_contextAboutToBeDestroyed(): could not make the owning GL context current for cleanup");
+ }
+
+ Q_Q(QOpenGLDebugLogger);
+ q->stopLogging();
+
+ if (offscreenSurface) {
+ // We did change the current context: set it back
+ if (currentContext)
+ currentContext->makeCurrent(currentSurface);
+ else
+ context->doneCurrent();
+ }
+
+ QObject::disconnect(context, SIGNAL(aboutToBeDestroyed()), q, SLOT(_q_contextAboutToBeDestroyed()));
+ context = nullptr;
+ initialized = false;
+}
+
+extern "C" {
+static void QOPENGLF_APIENTRY qt_opengl_debug_callback(GLenum source,
+ GLenum type,
+ GLuint id,
+ GLenum severity,
+ GLsizei length,
+ const GLchar *rawMessage,
+ const GLvoid *userParam)
+{
+ QOpenGLDebugLoggerPrivate *loggerPrivate = static_cast<QOpenGLDebugLoggerPrivate *>(const_cast<GLvoid *>(userParam));
+ loggerPrivate->handleMessage(source, type, id, severity, length, rawMessage);
+}
+}
+
+/*!
+ Constructs a new logger object with the given \a parent.
+
+ \note The object must be initialized before logging can happen.
+
+ \sa initialize()
+*/
+QOpenGLDebugLogger::QOpenGLDebugLogger(QObject *parent)
+ : QObject(*new QOpenGLDebugLoggerPrivate, parent)
+{
+ // QOpenGLDebugMessage is going to be mostly used as an argument
+ // of a cross thread connection, therefore let's ease the life for the users
+ // and register the type for them.
+ qRegisterMetaType<QOpenGLDebugMessage>();
+}
+
+/*!
+ Destroys the logger object.
+*/
+QOpenGLDebugLogger::~QOpenGLDebugLogger()
+{
+ stopLogging();
+}
+
+/*!
+ Initializes the object in the current OpenGL context. The context must
+ support the \c{GL_KHR_debug} extension for the initialization to succeed.
+ The object must be initialized before any logging can happen.
+
+ It is safe to call this function multiple times from the same context.
+
+ This function can also be used to change the context of a previously
+ initialized object; note that in this case the object must not be logging
+ when you call this function.
+
+ Returns \c true if the logger is successfully initialized; false otherwise.
+
+ \sa QOpenGLContext
+*/
+bool QOpenGLDebugLogger::initialize()
+{
+ QOpenGLContext *context = QOpenGLContext::currentContext();
+ if (!context) {
+ qWarning("QOpenGLDebugLogger::initialize(): no current OpenGL context found.");
+ return false;
+ }
+
+ Q_D(QOpenGLDebugLogger);
+ if (d->context == context) {
+ // context is non-NULL, d->context is non NULL only on successful initialization.
+ Q_ASSERT(d->initialized);
+ return true;
+ }
+
+ if (d->isLogging) {
+ qWarning("QOpenGLDebugLogger::initialize(): cannot initialize the object while logging. Please stop the logging first.");
+ return false;
+ }
+
+ if (d->context)
+ disconnect(d->context, SIGNAL(aboutToBeDestroyed()), this, SLOT(_q_contextAboutToBeDestroyed()));
+
+ d->initialized = false;
+ d->context = nullptr;
+
+ if (!context->hasExtension(QByteArrayLiteral("GL_KHR_debug")))
+ return false;
+
+ d->context = context;
+ connect(d->context, SIGNAL(aboutToBeDestroyed()), this, SLOT(_q_contextAboutToBeDestroyed()));
+
+#define GET_DEBUG_PROC_ADDRESS(procName) \
+ d->procName = reinterpret_cast< qt_ ## procName ## _t >( \
+ d->context->getProcAddress(d->context->isOpenGLES() ? (#procName "KHR") : (#procName)) \
+ );
+
+ GET_DEBUG_PROC_ADDRESS(glDebugMessageControl);
+ GET_DEBUG_PROC_ADDRESS(glDebugMessageInsert);
+ GET_DEBUG_PROC_ADDRESS(glDebugMessageCallback);
+ GET_DEBUG_PROC_ADDRESS(glGetDebugMessageLog);
+ GET_DEBUG_PROC_ADDRESS(glPushDebugGroup);
+ GET_DEBUG_PROC_ADDRESS(glPopDebugGroup);
+ GET_DEBUG_PROC_ADDRESS(glGetPointerv)
+
+#undef GET_DEBUG_PROC_ADDRESS
+
+ QOpenGLContext::currentContext()->functions()->glGetIntegerv(GL_MAX_DEBUG_MESSAGE_LENGTH, &d->maxMessageLength);
+
+#ifndef QT_NO_DEBUG
+ if (!d->context->format().testOption(QSurfaceFormat::DebugContext)) {
+ qWarning("QOpenGLDebugLogger::initialize(): the current context is not a debug context:\n"
+ " this means that the GL may not generate any debug output at all.\n"
+ " To avoid this warning, try creating the context with the\n"
+ " QSurfaceFormat::DebugContext surface format option.");
+ }
+#endif // QT_NO_DEBUG
+
+ d->initialized = true;
+ return true;
+}
+
+/*!
+ Returns \c true if this object is currently logging, false otherwise.
+
+ \sa startLogging()
+*/
+bool QOpenGLDebugLogger::isLogging() const
+{
+ Q_D(const QOpenGLDebugLogger);
+ return d->isLogging;
+}
+
+/*!
+ Starts logging messages coming from the OpenGL server. When a new message
+ is received, the signal messageLogged() is emitted, carrying the logged
+ message as argument.
+
+ \a loggingMode specifies whether the logging must be asynchronous (the default)
+ or synchronous.
+
+ QOpenGLDebugLogger will record the values of \c{GL_DEBUG_OUTPUT} and
+ \c{GL_DEBUG_OUTPUT_SYNCHRONOUS} when logging is started, and set them back
+ when logging is stopped. Moreover, any user-defined OpenGL debug callback
+ installed when this function is invoked will be restored when logging is
+ stopped; QOpenGLDebugLogger will ensure that the pre-existing callback will
+ still be invoked when logging.
+
+ \note It's not possible to change the logging mode without stopping and
+ starting logging again. This might change in a future version of Qt.
+
+ \note The object must be initialized before logging can happen.
+
+ \sa stopLogging(), initialize()
+*/
+void QOpenGLDebugLogger::startLogging(QOpenGLDebugLogger::LoggingMode loggingMode)
+{
+ Q_D(QOpenGLDebugLogger);
+ if (!d->initialized) {
+ qWarning("QOpenGLDebugLogger::startLogging(): object must be initialized before logging can start");
+ return;
+ }
+ if (d->isLogging) {
+ qWarning("QOpenGLDebugLogger::startLogging(): this object is already logging");
+ return;
+ }
+
+ d->isLogging = true;
+ d->loggingMode = loggingMode;
+
+ d->glGetPointerv(GL_DEBUG_CALLBACK_FUNCTION, reinterpret_cast<void **>(&d->oldDebugCallbackFunction));
+ d->glGetPointerv(GL_DEBUG_CALLBACK_USER_PARAM, &d->oldDebugCallbackParameter);
+
+ d->glDebugMessageCallback(&qt_opengl_debug_callback, d);
+
+ QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
+ d->debugWasEnabled = funcs->glIsEnabled(GL_DEBUG_OUTPUT);
+ d->syncDebugWasEnabled = funcs->glIsEnabled(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+
+ if (d->loggingMode == SynchronousLogging)
+ funcs->glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+ else
+ funcs->glDisable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+
+ funcs->glEnable(GL_DEBUG_OUTPUT);
+}
+
+/*!
+ Returns the logging mode of the object.
+
+ \sa startLogging()
+*/
+QOpenGLDebugLogger::LoggingMode QOpenGLDebugLogger::loggingMode() const
+{
+ Q_D(const QOpenGLDebugLogger);
+ return d->loggingMode;
+}
+
+/*!
+ Stops logging messages from the OpenGL server.
+
+ \sa startLogging()
+*/
+void QOpenGLDebugLogger::stopLogging()
+{
+ Q_D(QOpenGLDebugLogger);
+ if (!d->isLogging)
+ return;
+
+ QOpenGLContext *currentContext = QOpenGLContext::currentContext();
+ if (!currentContext || currentContext != d->context) {
+ qWarning("QOpenGLDebugLogger::stopLogging(): attempting to stop logging with the wrong OpenGL context current");
+ return;
+ }
+
+ d->isLogging = false;
+
+ d->glDebugMessageCallback(d->oldDebugCallbackFunction, d->oldDebugCallbackParameter);
+
+ QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
+ if (!d->debugWasEnabled)
+ funcs->glDisable(GL_DEBUG_OUTPUT);
+
+ if (d->syncDebugWasEnabled)
+ funcs->glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+ else
+ funcs->glDisable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+}
+
+/*!
+ Inserts the message \a debugMessage into the OpenGL debug log. This provides
+ a way for applications or libraries to insert custom messages that can
+ ease the debugging of OpenGL applications.
+
+ \note \a debugMessage must have QOpenGLDebugMessage::ApplicationSource or
+ QOpenGLDebugMessage::ThirdPartySource as its source, and a valid
+ type and severity, otherwise it will not be inserted into the log.
+
+ \note The object must be initialized before logging can happen.
+
+ \sa initialize()
+*/
+void QOpenGLDebugLogger::logMessage(const QOpenGLDebugMessage &debugMessage)
+{
+ Q_D(QOpenGLDebugLogger);
+ if (!d->initialized) {
+ qWarning("QOpenGLDebugLogger::logMessage(): object must be initialized before logging messages");
+ return;
+ }
+ if (debugMessage.source() != QOpenGLDebugMessage::ApplicationSource
+ && debugMessage.source() != QOpenGLDebugMessage::ThirdPartySource) {
+ qWarning("QOpenGLDebugLogger::logMessage(): using a message source different from ApplicationSource\n"
+ " or ThirdPartySource is not supported by GL_KHR_debug. The message will not be logged.");
+ return;
+ }
+ if (debugMessage.type() == QOpenGLDebugMessage::InvalidType
+ || debugMessage.type() == QOpenGLDebugMessage::AnyType
+ || debugMessage.severity() == QOpenGLDebugMessage::InvalidSeverity
+ || debugMessage.severity() == QOpenGLDebugMessage::AnySeverity) {
+ qWarning("QOpenGLDebugLogger::logMessage(): the message has a non-valid type and/or severity. The message will not be logged.");
+ return;
+ }
+
+ const GLenum source = qt_messageSourceToGL(debugMessage.source());
+ const GLenum type = qt_messageTypeToGL(debugMessage.type());
+ const GLenum severity = qt_messageSeverityToGL(debugMessage.severity());
+ QByteArray rawMessage = debugMessage.message().toUtf8();
+ rawMessage.append('\0');
+
+ if (rawMessage.length() > d->maxMessageLength) {
+ qWarning("QOpenGLDebugLogger::logMessage(): message too long, truncating it\n"
+ " (%d bytes long, but the GL accepts up to %d bytes)", rawMessage.length(), d->maxMessageLength);
+ rawMessage.resize(d->maxMessageLength - 1);
+ rawMessage.append('\0');
+ }
+
+ // Don't pass rawMessage.length(), as unfortunately bugged
+ // OpenGL drivers will eat the trailing NUL in the message. Just rely
+ // on the message being NUL terminated.
+ d->glDebugMessageInsert(source,
+ type,
+ debugMessage.id(),
+ severity,
+ -1,
+ rawMessage.constData());
+}
+
+/*!
+ Pushes a debug group with name \a name, id \a id, and source \a source onto
+ the debug groups stack. If the group is successfully pushed, OpenGL will
+ automatically log a message with message \a name, id \a id, source \a
+ source, type QOpenGLDebugMessage::GroupPushType and severity
+ QOpenGLDebugMessage::NotificationSeverity.
+
+ The newly pushed group will inherit the same filtering settings of the
+ group that was on the top of the stack; that is, the filtering will not be
+ changed by pushing a new group.
+
+ \note The \a source must either be QOpenGLDebugMessage::ApplicationSource or
+ QOpenGLDebugMessage::ThirdPartySource, otherwise the group will not be pushed.
+
+ \note The object must be initialized before managing debug groups.
+
+ \sa popGroup(), enableMessages(), disableMessages()
+*/
+void QOpenGLDebugLogger::pushGroup(const QString &name, GLuint id, QOpenGLDebugMessage::Source source)
+{
+ Q_D(QOpenGLDebugLogger);
+ if (!d->initialized) {
+ qWarning("QOpenGLDebugLogger::pushGroup(): object must be initialized before pushing a debug group");
+ return;
+ }
+ if (source != QOpenGLDebugMessage::ApplicationSource
+ && source != QOpenGLDebugMessage::ThirdPartySource) {
+ qWarning("QOpenGLDebugLogger::pushGroup(): using a source different from ApplicationSource\n"
+ " or ThirdPartySource is not supported by GL_KHR_debug. The group will not be pushed.");
+ return;
+ }
+
+ QByteArray rawName = name.toUtf8();
+ rawName.append('\0');
+ if (rawName.length() > d->maxMessageLength) {
+ qWarning("QOpenGLDebugLogger::pushGroup(): group name too long, truncating it\n"
+ " (%d bytes long, but the GL accepts up to %d bytes)", rawName.length(), d->maxMessageLength);
+ rawName.resize(d->maxMessageLength - 1);
+ rawName.append('\0');
+ }
+
+ // Don't pass rawMessage.length(), as unfortunately bugged
+ // OpenGL drivers will eat the trailing NUL in the name. Just rely
+ // on the name being NUL terminated.
+ d->glPushDebugGroup(qt_messageSourceToGL(source), id, -1, rawName.constData());
+}
+
+/*!
+ Pops the topmost debug group from the debug groups stack. If the group is
+ successfully popped, OpenGL will automatically log a message with message,
+ id and source matching those of the popped group, type
+ QOpenGLDebugMessage::GroupPopType and severity
+ QOpenGLDebugMessage::NotificationSeverity.
+
+ Popping a debug group will restore the message filtering settings of the
+ group that becomes the top of the debug groups stack.
+
+ \note The object must be initialized before managing debug groups.
+
+ \sa pushGroup()
+*/
+void QOpenGLDebugLogger::popGroup()
+{
+ Q_D(QOpenGLDebugLogger);
+ if (!d->initialized) {
+ qWarning("QOpenGLDebugLogger::pushGroup(): object must be initialized before popping a debug group");
+ return;
+ }
+
+ d->glPopDebugGroup();
+}
+
+/*!
+ Enables the logging of messages from the given \a sources, of the given \a
+ types and with the given \a severities and any message id.
+
+ The logging will be enabled in the current control group.
+
+ \sa disableMessages(), pushGroup(), popGroup()
+*/
+void QOpenGLDebugLogger::enableMessages(QOpenGLDebugMessage::Sources sources,
+ QOpenGLDebugMessage::Types types,
+ QOpenGLDebugMessage::Severities severities)
+{
+ Q_D(QOpenGLDebugLogger);
+ d->controlDebugMessages(sources,
+ types,
+ severities,
+ QVector<GLuint>(),
+ QByteArrayLiteral("enableMessages"),
+ true);
+}
+
+/*!
+ Enables the logging of messages with the given \a ids, from the given \a
+ sources and of the given \a types and any severity.
+
+ The logging will be enabled in the current control group.
+
+ \sa disableMessages(), pushGroup(), popGroup()
+*/
+void QOpenGLDebugLogger::enableMessages(const QVector<GLuint> &ids,
+ QOpenGLDebugMessage::Sources sources,
+ QOpenGLDebugMessage::Types types)
+{
+ Q_D(QOpenGLDebugLogger);
+ d->controlDebugMessages(sources,
+ types,
+ QOpenGLDebugMessage::AnySeverity,
+ ids,
+ QByteArrayLiteral("enableMessages"),
+ true);
+}
+
+/*!
+ Disables the logging of messages with the given \a sources, of the given \a
+ types and with the given \a severities and any message id.
+
+ The logging will be disabled in the current control group.
+
+ \sa enableMessages(), pushGroup(), popGroup()
+*/
+void QOpenGLDebugLogger::disableMessages(QOpenGLDebugMessage::Sources sources,
+ QOpenGLDebugMessage::Types types,
+ QOpenGLDebugMessage::Severities severities)
+{
+ Q_D(QOpenGLDebugLogger);
+ d->controlDebugMessages(sources,
+ types,
+ severities,
+ QVector<GLuint>(),
+ QByteArrayLiteral("disableMessages"),
+ false);
+}
+
+/*!
+ Disables the logging of messages with the given \a ids, from the given \a
+ sources and of the given \a types and any severity.
+
+ The logging will be disabled in the current control group.
+
+ \sa enableMessages(), pushGroup(), popGroup()
+*/
+void QOpenGLDebugLogger::disableMessages(const QVector<GLuint> &ids,
+ QOpenGLDebugMessage::Sources sources,
+ QOpenGLDebugMessage::Types types)
+{
+ Q_D(QOpenGLDebugLogger);
+ d->controlDebugMessages(sources,
+ types,
+ QOpenGLDebugMessage::AnySeverity,
+ ids,
+ QByteArrayLiteral("disableMessages"),
+ false);
+}
+
+/*!
+ Reads all the available messages in the OpenGL internal debug log and
+ returns them. Moreover, this function will clear the internal debug log,
+ so that subsequent invocations will not return messages that were
+ already returned.
+
+ \sa startLogging()
+*/
+QList<QOpenGLDebugMessage> QOpenGLDebugLogger::loggedMessages() const
+{
+ Q_D(const QOpenGLDebugLogger);
+ if (!d->initialized) {
+ qWarning("QOpenGLDebugLogger::loggedMessages(): object must be initialized before reading logged messages");
+ return QList<QOpenGLDebugMessage>();
+ }
+
+ static const GLuint maxMessageCount = 128;
+ GLuint messagesRead;
+ GLenum messageSources[maxMessageCount];
+ GLenum messageTypes[maxMessageCount];
+ GLuint messageIds[maxMessageCount];
+ GLenum messageSeverities[maxMessageCount];
+ GLsizei messageLengths[maxMessageCount];
+
+ QByteArray messagesBuffer;
+ messagesBuffer.resize(maxMessageCount * d->maxMessageLength);
+
+ QList<QOpenGLDebugMessage> messages;
+ do {
+ messagesRead = d->glGetDebugMessageLog(maxMessageCount,
+ GLsizei(messagesBuffer.size()),
+ messageSources,
+ messageTypes,
+ messageIds,
+ messageSeverities,
+ messageLengths,
+ messagesBuffer.data());
+
+ const char *messagesBufferPtr = messagesBuffer.constData();
+ for (GLuint i = 0; i < messagesRead; ++i) {
+ QOpenGLDebugMessage message;
+
+ QOpenGLDebugMessagePrivate *messagePrivate = message.d.data();
+ messagePrivate->source = qt_messageSourceFromGL(messageSources[i]);
+ messagePrivate->type = qt_messageTypeFromGL(messageTypes[i]);
+ messagePrivate->id = messageIds[i];
+ messagePrivate->severity = qt_messageSeverityFromGL(messageSeverities[i]);
+ messagePrivate->message = QString::fromUtf8(messagesBufferPtr, messageLengths[i] - 1);
+
+ messagesBufferPtr += messageLengths[i];
+ messages << message;
+ }
+ } while (messagesRead == maxMessageCount);
+
+ return messages;
+}
+
+/*!
+ \fn void QOpenGLDebugLogger::messageLogged(const QOpenGLDebugMessage &debugMessage)
+
+ This signal is emitted when a debug message (wrapped by the \a debugMessage
+ argument) is logged from the OpenGL server.
+
+ Depending on the OpenGL implementation, this signal can be emitted
+ from other threads than the one(s) the receiver(s) lives in, and even
+ different from the thread the QOpenGLContext in which this object has
+ been initialized lives in. Moreover, the signal could be emitted from
+ multiple threads at the same time. This is normally not a problem,
+ as Qt will utilize a queued connection for cross-thread signal emissions,
+ but if you force the connection type to Direct then you must be aware of
+ the potential races in the slots connected to this signal.
+
+ If logging have been started in SynchronousLogging mode, OpenGL guarantees
+ that this signal will be emitted from the same thread the QOpenGLContext
+ has been bound to, and no concurrent invocations will ever happen.
+
+ \note Logging must have been started, or this signal will not be emitted.
+
+ \sa startLogging()
+*/
+
+/*!
+ Returns the maximum supported length, in bytes, for the text of the messages
+ passed to logMessage(). This is also the maximum length of a debug group
+ name, as pushing or popping groups will automatically log a message with
+ the debug group name as the message text.
+
+ If a message text is too long, it will be automatically truncated by
+ QOpenGLDebugLogger.
+
+ \note Message texts are encoded in UTF-8 when they get passed to OpenGL, so
+ their size in bytes does not usually match the amount of UTF-16 code units,
+ as returned, for instance, by QString::length(). (It does if the message contains
+ 7-bit ASCII only data, which is typical for debug messages.)
+*/
+qint64 QOpenGLDebugLogger::maximumMessageLength() const
+{
+ Q_D(const QOpenGLDebugLogger);
+ if (!d->initialized) {
+ qWarning("QOpenGLDebugLogger::maximumMessageLength(): object must be initialized before reading the maximum message length");
+ return -1;
+ }
+ return d->maxMessageLength;
+}
+
+
+QT_END_NAMESPACE
+
+#include "moc_qopengldebug.cpp"
diff --git a/src/opengl/qopengldebug.h b/src/opengl/qopengldebug.h
new file mode 100644
index 0000000000..fef2782302
--- /dev/null
+++ b/src/opengl/qopengldebug.h
@@ -0,0 +1,221 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLDEBUG_H
+#define QOPENGLDEBUG_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#ifndef QT_NO_OPENGL
+
+#include <QtCore/qshareddata.h>
+#include <QtCore/qflags.h>
+#include <QtCore/qlist.h>
+#include <QtCore/qvector.h>
+#include <QtCore/qmetatype.h>
+#include <QtCore/qdebug.h>
+#include <QtGui/qopenglcontext.h>
+
+#if defined(Q_CLANG_QDOC)
+#undef GLuint
+typedef unsigned int GLuint;
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLDebugLogger;
+class QOpenGLDebugLoggerPrivate;
+class QOpenGLDebugMessagePrivate;
+
+class Q_OPENGL_EXPORT QOpenGLDebugMessage
+{
+public:
+ enum Source {
+ InvalidSource = 0x00000000,
+ APISource = 0x00000001,
+ WindowSystemSource = 0x00000002,
+ ShaderCompilerSource = 0x00000004,
+ ThirdPartySource = 0x00000008,
+ ApplicationSource = 0x00000010,
+ OtherSource = 0x00000020,
+ LastSource = OtherSource, // private API
+ AnySource = 0xffffffff
+ };
+ Q_DECLARE_FLAGS(Sources, Source)
+
+ enum Type {
+ InvalidType = 0x00000000,
+ ErrorType = 0x00000001,
+ DeprecatedBehaviorType = 0x00000002,
+ UndefinedBehaviorType = 0x00000004,
+ PortabilityType = 0x00000008,
+ PerformanceType = 0x00000010,
+ OtherType = 0x00000020,
+ MarkerType = 0x00000040,
+ GroupPushType = 0x00000080,
+ GroupPopType = 0x00000100,
+ LastType = GroupPopType, // private API
+ AnyType = 0xffffffff
+ };
+ Q_DECLARE_FLAGS(Types, Type)
+
+ enum Severity {
+ InvalidSeverity = 0x00000000,
+ HighSeverity = 0x00000001,
+ MediumSeverity = 0x00000002,
+ LowSeverity = 0x00000004,
+ NotificationSeverity = 0x00000008,
+ LastSeverity = NotificationSeverity, // private API
+ AnySeverity = 0xffffffff
+ };
+ Q_DECLARE_FLAGS(Severities, Severity)
+
+ QOpenGLDebugMessage();
+ QOpenGLDebugMessage(const QOpenGLDebugMessage &debugMessage);
+
+ QOpenGLDebugMessage &operator=(const QOpenGLDebugMessage &debugMessage);
+ QOpenGLDebugMessage &operator=(QOpenGLDebugMessage &&other) noexcept { swap(other); return *this; }
+ ~QOpenGLDebugMessage();
+
+ void swap(QOpenGLDebugMessage &other) noexcept { qSwap(d, other.d); }
+
+ Source source() const;
+ Type type() const;
+ Severity severity() const;
+ GLuint id() const;
+ QString message() const;
+
+ static QOpenGLDebugMessage createApplicationMessage(const QString &text,
+ GLuint id = 0,
+ Severity severity = NotificationSeverity,
+ Type type = OtherType);
+ static QOpenGLDebugMessage createThirdPartyMessage(const QString &text,
+ GLuint id = 0,
+ Severity severity = NotificationSeverity,
+ Type type = OtherType);
+
+ bool operator==(const QOpenGLDebugMessage &debugMessage) const;
+ inline bool operator!=(const QOpenGLDebugMessage &debugMessage) const { return !operator==(debugMessage); }
+
+private:
+ friend class QOpenGLDebugLogger;
+ friend class QOpenGLDebugLoggerPrivate;
+ QSharedDataPointer<QOpenGLDebugMessagePrivate> d;
+};
+
+Q_DECLARE_SHARED(QOpenGLDebugMessage)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLDebugMessage::Sources)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLDebugMessage::Types)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLDebugMessage::Severities)
+
+#ifndef QT_NO_DEBUG_STREAM
+Q_OPENGL_EXPORT QDebug operator<<(QDebug debug, const QOpenGLDebugMessage &message);
+Q_OPENGL_EXPORT QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Source source);
+Q_OPENGL_EXPORT QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Type type);
+Q_OPENGL_EXPORT QDebug operator<<(QDebug debug, QOpenGLDebugMessage::Severity severity);
+#endif
+
+class QOpenGLDebugLoggerPrivate;
+
+class Q_OPENGL_EXPORT QOpenGLDebugLogger : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(LoggingMode loggingMode READ loggingMode)
+
+public:
+ enum LoggingMode {
+ AsynchronousLogging,
+ SynchronousLogging
+ };
+ Q_ENUM(LoggingMode)
+
+ explicit QOpenGLDebugLogger(QObject *parent = nullptr);
+ ~QOpenGLDebugLogger();
+
+ bool initialize();
+
+ bool isLogging() const;
+ LoggingMode loggingMode() const;
+
+ qint64 maximumMessageLength() const;
+
+ void pushGroup(const QString &name,
+ GLuint id = 0,
+ QOpenGLDebugMessage::Source source = QOpenGLDebugMessage::ApplicationSource);
+ void popGroup();
+
+ void enableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
+ QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType,
+ QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity);
+
+ void enableMessages(const QVector<GLuint> &ids,
+ QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
+ QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType);
+
+ void disableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
+ QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType,
+ QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity);
+
+ void disableMessages(const QVector<GLuint> &ids,
+ QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource,
+ QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType);
+
+ QList<QOpenGLDebugMessage> loggedMessages() const;
+
+public Q_SLOTS:
+ void logMessage(const QOpenGLDebugMessage &debugMessage);
+ void startLogging(LoggingMode loggingMode = AsynchronousLogging);
+ void stopLogging();
+
+Q_SIGNALS:
+ void messageLogged(const QOpenGLDebugMessage &debugMessage);
+
+private:
+ Q_DISABLE_COPY(QOpenGLDebugLogger)
+ Q_DECLARE_PRIVATE(QOpenGLDebugLogger)
+ Q_PRIVATE_SLOT(d_func(), void _q_contextAboutToBeDestroyed())
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(QOpenGLDebugMessage)
+
+#endif // QT_NO_OPENGL
+
+#endif // QOPENGLDEBUG_H
diff --git a/src/opengl/qopenglengineshadermanager.cpp b/src/opengl/qopenglengineshadermanager.cpp
new file mode 100644
index 0000000000..09bd9ff096
--- /dev/null
+++ b/src/opengl/qopenglengineshadermanager.cpp
@@ -0,0 +1,898 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglengineshadermanager_p.h"
+#include "qopenglengineshadersource_p.h"
+#include "qopenglpaintengine_p.h"
+#include <private/qopenglshadercache_p.h>
+
+#include <QtGui/private/qopenglcontext_p.h>
+#include <QtCore/qthreadstorage.h>
+
+#include <algorithm>
+
+#if defined(QT_DEBUG)
+#include <QMetaEnum>
+#endif
+
+// #define QT_GL_SHARED_SHADER_DEBUG
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLEngineSharedShadersResource : public QOpenGLSharedResource
+{
+public:
+ QOpenGLEngineSharedShadersResource(QOpenGLContext *ctx)
+ : QOpenGLSharedResource(ctx->shareGroup())
+ , m_shaders(new QOpenGLEngineSharedShaders(ctx))
+ {
+ }
+
+ ~QOpenGLEngineSharedShadersResource()
+ {
+ delete m_shaders;
+ }
+
+ void invalidateResource() override
+ {
+ delete m_shaders;
+ m_shaders = nullptr;
+ }
+
+ void freeResource(QOpenGLContext *) override
+ {
+ }
+
+ QOpenGLEngineSharedShaders *shaders() const { return m_shaders; }
+
+private:
+ QOpenGLEngineSharedShaders *m_shaders;
+};
+
+class QOpenGLShaderStorage
+{
+public:
+ QOpenGLEngineSharedShaders *shadersForThread(QOpenGLContext *context) {
+ QOpenGLMultiGroupSharedResource *&shaders = m_storage.localData();
+ if (!shaders)
+ shaders = new QOpenGLMultiGroupSharedResource;
+ QOpenGLEngineSharedShadersResource *resource =
+ shaders->value<QOpenGLEngineSharedShadersResource>(context);
+ return resource ? resource->shaders() : nullptr;
+ }
+
+private:
+ QThreadStorage<QOpenGLMultiGroupSharedResource *> m_storage;
+};
+
+Q_GLOBAL_STATIC(QOpenGLShaderStorage, qt_shader_storage);
+
+QOpenGLEngineSharedShaders *QOpenGLEngineSharedShaders::shadersForContext(QOpenGLContext *context)
+{
+ return qt_shader_storage()->shadersForThread(context);
+}
+
+const char* QOpenGLEngineSharedShaders::qShaderSnippets[] = {
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0
+};
+
+QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context)
+ : blitShaderProg(nullptr)
+ , simpleShaderProg(nullptr)
+{
+
+/*
+ Rather than having the shader source array statically initialised, it is initialised
+ here instead. This is to allow new shader names to be inserted or existing names moved
+ around without having to change the order of the glsl strings. It is hoped this will
+ make future hard-to-find runtime bugs more obvious and generally give more solid code.
+*/
+
+ // Check if the user has requested an OpenGL 3.2 Core Profile or higher
+ // and if so use GLSL 1.50 core shaders instead of legacy ones.
+ const QSurfaceFormat &fmt = context->format();
+ const bool isCoreProfile = fmt.profile() == QSurfaceFormat::CoreProfile && fmt.version() >= qMakePair(3,2);
+
+ const char** code = qShaderSnippets; // shortcut
+
+ if (isCoreProfile) {
+ code[MainVertexShader] = qopenglslMainVertexShader_core;
+ code[MainWithTexCoordsVertexShader] = qopenglslMainWithTexCoordsVertexShader_core;
+ code[MainWithTexCoordsAndOpacityVertexShader] = qopenglslMainWithTexCoordsAndOpacityVertexShader_core;
+
+ code[UntransformedPositionVertexShader] = qopenglslUntransformedPositionVertexShader_core;
+ code[PositionOnlyVertexShader] = qopenglslPositionOnlyVertexShader_core;
+ code[ComplexGeometryPositionOnlyVertexShader] = qopenglslComplexGeometryPositionOnlyVertexShader_core;
+ code[PositionWithPatternBrushVertexShader] = qopenglslPositionWithPatternBrushVertexShader_core;
+ code[PositionWithLinearGradientBrushVertexShader] = qopenglslPositionWithLinearGradientBrushVertexShader_core;
+ code[PositionWithConicalGradientBrushVertexShader] = qopenglslPositionWithConicalGradientBrushVertexShader_core;
+ code[PositionWithRadialGradientBrushVertexShader] = qopenglslPositionWithRadialGradientBrushVertexShader_core;
+ code[PositionWithTextureBrushVertexShader] = qopenglslPositionWithTextureBrushVertexShader_core;
+ code[AffinePositionWithPatternBrushVertexShader] = qopenglslAffinePositionWithPatternBrushVertexShader_core;
+ code[AffinePositionWithLinearGradientBrushVertexShader] = qopenglslAffinePositionWithLinearGradientBrushVertexShader_core;
+ code[AffinePositionWithConicalGradientBrushVertexShader] = qopenglslAffinePositionWithConicalGradientBrushVertexShader_core;
+ code[AffinePositionWithRadialGradientBrushVertexShader] = qopenglslAffinePositionWithRadialGradientBrushVertexShader_core;
+ code[AffinePositionWithTextureBrushVertexShader] = qopenglslAffinePositionWithTextureBrushVertexShader_core;
+
+ code[MainFragmentShader_MO] = qopenglslMainFragmentShader_MO_core;
+ code[MainFragmentShader_M] = qopenglslMainFragmentShader_M_core;
+ code[MainFragmentShader_O] = qopenglslMainFragmentShader_O_core;
+ code[MainFragmentShader] = qopenglslMainFragmentShader_core;
+ code[MainFragmentShader_ImageArrays] = qopenglslMainFragmentShader_ImageArrays_core;
+
+ code[ImageSrcFragmentShader] = qopenglslImageSrcFragmentShader_core;
+ code[ImageSrcWithPatternFragmentShader] = qopenglslImageSrcWithPatternFragmentShader_core;
+ code[NonPremultipliedImageSrcFragmentShader] = qopenglslNonPremultipliedImageSrcFragmentShader_core;
+ code[GrayscaleImageSrcFragmentShader] = qopenglslGrayscaleImageSrcFragmentShader_core;
+ code[AlphaImageSrcFragmentShader] = qopenglslAlphaImageSrcFragmentShader_core;
+ code[CustomImageSrcFragmentShader] = qopenglslCustomSrcFragmentShader_core; // Calls "customShader", which must be appended
+ code[SolidBrushSrcFragmentShader] = qopenglslSolidBrushSrcFragmentShader_core;
+
+ code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_core;
+ code[TextureBrushSrcWithPatternFragmentShader] = qopenglslTextureBrushSrcWithPatternFragmentShader_core;
+ code[PatternBrushSrcFragmentShader] = qopenglslPatternBrushSrcFragmentShader_core;
+ code[LinearGradientBrushSrcFragmentShader] = qopenglslLinearGradientBrushSrcFragmentShader_core;
+ code[RadialGradientBrushSrcFragmentShader] = qopenglslRadialGradientBrushSrcFragmentShader_core;
+ code[ConicalGradientBrushSrcFragmentShader] = qopenglslConicalGradientBrushSrcFragmentShader_core;
+ code[ShockingPinkSrcFragmentShader] = qopenglslShockingPinkSrcFragmentShader_core;
+
+ code[NoMaskFragmentShader] = "";
+ code[MaskFragmentShader] = qopenglslMaskFragmentShader_core;
+ code[RgbMaskFragmentShaderPass1] = qopenglslRgbMaskFragmentShaderPass1_core;
+ code[RgbMaskFragmentShaderPass2] = qopenglslRgbMaskFragmentShaderPass2_core;
+ code[RgbMaskWithGammaFragmentShader] = ""; //###
+ } else {
+ code[MainVertexShader] = qopenglslMainVertexShader;
+ code[MainWithTexCoordsVertexShader] = qopenglslMainWithTexCoordsVertexShader;
+ code[MainWithTexCoordsAndOpacityVertexShader] = qopenglslMainWithTexCoordsAndOpacityVertexShader;
+
+ code[UntransformedPositionVertexShader] = qopenglslUntransformedPositionVertexShader;
+ code[PositionOnlyVertexShader] = qopenglslPositionOnlyVertexShader;
+ code[ComplexGeometryPositionOnlyVertexShader] = qopenglslComplexGeometryPositionOnlyVertexShader;
+ code[PositionWithPatternBrushVertexShader] = qopenglslPositionWithPatternBrushVertexShader;
+ code[PositionWithLinearGradientBrushVertexShader] = qopenglslPositionWithLinearGradientBrushVertexShader;
+ code[PositionWithConicalGradientBrushVertexShader] = qopenglslPositionWithConicalGradientBrushVertexShader;
+ code[PositionWithRadialGradientBrushVertexShader] = qopenglslPositionWithRadialGradientBrushVertexShader;
+ code[PositionWithTextureBrushVertexShader] = qopenglslPositionWithTextureBrushVertexShader;
+ code[AffinePositionWithPatternBrushVertexShader] = qopenglslAffinePositionWithPatternBrushVertexShader;
+ code[AffinePositionWithLinearGradientBrushVertexShader] = qopenglslAffinePositionWithLinearGradientBrushVertexShader;
+ code[AffinePositionWithConicalGradientBrushVertexShader] = qopenglslAffinePositionWithConicalGradientBrushVertexShader;
+ code[AffinePositionWithRadialGradientBrushVertexShader] = qopenglslAffinePositionWithRadialGradientBrushVertexShader;
+ code[AffinePositionWithTextureBrushVertexShader] = qopenglslAffinePositionWithTextureBrushVertexShader;
+
+ code[MainFragmentShader_MO] = qopenglslMainFragmentShader_MO;
+ code[MainFragmentShader_M] = qopenglslMainFragmentShader_M;
+ code[MainFragmentShader_O] = qopenglslMainFragmentShader_O;
+ code[MainFragmentShader] = qopenglslMainFragmentShader;
+ code[MainFragmentShader_ImageArrays] = qopenglslMainFragmentShader_ImageArrays;
+
+ code[ImageSrcFragmentShader] = qopenglslImageSrcFragmentShader;
+ code[ImageSrcWithPatternFragmentShader] = qopenglslImageSrcWithPatternFragmentShader;
+ code[NonPremultipliedImageSrcFragmentShader] = qopenglslNonPremultipliedImageSrcFragmentShader;
+ code[GrayscaleImageSrcFragmentShader] = qopenglslGrayscaleImageSrcFragmentShader;
+ code[AlphaImageSrcFragmentShader] = qopenglslAlphaImageSrcFragmentShader;
+ code[CustomImageSrcFragmentShader] = qopenglslCustomSrcFragmentShader; // Calls "customShader", which must be appended
+ code[SolidBrushSrcFragmentShader] = qopenglslSolidBrushSrcFragmentShader;
+ code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader;
+ code[TextureBrushSrcWithPatternFragmentShader] = qopenglslTextureBrushSrcWithPatternFragmentShader;
+ code[PatternBrushSrcFragmentShader] = qopenglslPatternBrushSrcFragmentShader;
+ code[LinearGradientBrushSrcFragmentShader] = qopenglslLinearGradientBrushSrcFragmentShader;
+ code[RadialGradientBrushSrcFragmentShader] = qopenglslRadialGradientBrushSrcFragmentShader;
+ code[ConicalGradientBrushSrcFragmentShader] = qopenglslConicalGradientBrushSrcFragmentShader;
+ code[ShockingPinkSrcFragmentShader] = qopenglslShockingPinkSrcFragmentShader;
+
+ code[NoMaskFragmentShader] = "";
+ code[MaskFragmentShader] = qopenglslMaskFragmentShader;
+ code[RgbMaskFragmentShaderPass1] = qopenglslRgbMaskFragmentShaderPass1;
+ code[RgbMaskFragmentShaderPass2] = qopenglslRgbMaskFragmentShaderPass2;
+ code[RgbMaskWithGammaFragmentShader] = ""; //###
+ }
+
+ // The composition shaders are just layout qualifiers and the same
+ // for all profiles that support them.
+ code[NoCompositionModeFragmentShader] = "";
+ code[MultiplyCompositionModeFragmentShader] = qopenglslMultiplyCompositionModeFragmentShader;
+ code[ScreenCompositionModeFragmentShader] = qopenglslScreenCompositionModeFragmentShader;
+ code[OverlayCompositionModeFragmentShader] = qopenglslOverlayCompositionModeFragmentShader;
+ code[DarkenCompositionModeFragmentShader] = qopenglslDarkenCompositionModeFragmentShader;
+ code[LightenCompositionModeFragmentShader] = qopenglslLightenCompositionModeFragmentShader;
+ code[ColorDodgeCompositionModeFragmentShader] = qopenglslColorDodgeCompositionModeFragmentShader;
+ code[ColorBurnCompositionModeFragmentShader] = qopenglslColorBurnCompositionModeFragmentShader;
+ code[HardLightCompositionModeFragmentShader] = qopenglslHardLightCompositionModeFragmentShader;
+ code[SoftLightCompositionModeFragmentShader] = qopenglslSoftLightCompositionModeFragmentShader;
+ code[DifferenceCompositionModeFragmentShader] = qopenglslDifferenceCompositionModeFragmentShader;
+ code[ExclusionCompositionModeFragmentShader] = qopenglslExclusionCompositionModeFragmentShader;
+
+#if defined(QT_DEBUG)
+ // Check that all the elements have been filled:
+ for (int i = 0; i < TotalSnippetCount; ++i) {
+ if (Q_UNLIKELY(!qShaderSnippets[i])) {
+ qFatal("Shader snippet for %s (#%d) is missing!",
+ snippetNameStr(SnippetName(i)).constData(), i);
+ }
+ }
+#endif
+
+ QByteArray vertexSource;
+ QByteArray fragSource;
+
+ // Compile up the simple shader:
+#ifdef Q_OS_WASM
+ vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);
+ vertexSource.append(qShaderSnippets[MainVertexShader]);
+#else
+ vertexSource.append(qShaderSnippets[MainVertexShader]);
+ vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);
+#endif
+ fragSource.append(qShaderSnippets[MainFragmentShader]);
+ fragSource.append(qShaderSnippets[ShockingPinkSrcFragmentShader]);
+
+ simpleShaderProg = new QOpenGLShaderProgram;
+
+ CachedShader simpleShaderCache(fragSource, vertexSource);
+
+ bool inCache = simpleShaderCache.load(simpleShaderProg, context);
+
+ if (!inCache) {
+ if (!simpleShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource))
+ qWarning("Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile");
+ if (!simpleShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource))
+ qWarning("Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile");
+
+ simpleShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+ simpleShaderProg->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
+ simpleShaderProg->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
+ simpleShaderProg->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
+ }
+
+ simpleShaderProg->link();
+
+ if (Q_UNLIKELY(!simpleShaderProg->isLinked())) {
+ qCritical("Errors linking simple shader: %s", qPrintable(simpleShaderProg->log()));
+ } else {
+ if (!inCache)
+ simpleShaderCache.store(simpleShaderProg, context);
+ }
+
+ // Compile the blit shader:
+ vertexSource.clear();
+ vertexSource.append(qShaderSnippets[MainWithTexCoordsVertexShader]);
+ vertexSource.append(qShaderSnippets[UntransformedPositionVertexShader]);
+
+ fragSource.clear();
+ fragSource.append(qShaderSnippets[MainFragmentShader]);
+ fragSource.append(qShaderSnippets[ImageSrcFragmentShader]);
+
+ blitShaderProg = new QOpenGLShaderProgram;
+
+ CachedShader blitShaderCache(fragSource, vertexSource);
+
+ inCache = blitShaderCache.load(blitShaderProg, context);
+
+ if (!inCache) {
+ if (!blitShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource))
+ qWarning("Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile");
+ if (!blitShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource))
+ qWarning("Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile");
+
+ blitShaderProg->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
+ blitShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+ }
+
+ blitShaderProg->link();
+ if (Q_UNLIKELY(!blitShaderProg->isLinked())) {
+ qCritical("Errors linking blit shader: %s", qPrintable(blitShaderProg->log()));
+ } else {
+ if (!inCache)
+ blitShaderCache.store(blitShaderProg, context);
+ }
+
+#ifdef QT_GL_SHARED_SHADER_DEBUG
+ qDebug(" -> QOpenGLEngineSharedShaders() %p for thread %p.", this, QThread::currentThread());
+#endif
+}
+
+QOpenGLEngineSharedShaders::~QOpenGLEngineSharedShaders()
+{
+#ifdef QT_GL_SHARED_SHADER_DEBUG
+ qDebug(" -> ~QOpenGLEngineSharedShaders() %p for thread %p.", this, QThread::currentThread());
+#endif
+ qDeleteAll(cachedPrograms);
+ cachedPrograms.clear();
+
+ if (blitShaderProg) {
+ delete blitShaderProg;
+ blitShaderProg = nullptr;
+ }
+
+ if (simpleShaderProg) {
+ delete simpleShaderProg;
+ simpleShaderProg = nullptr;
+ }
+}
+
+#if defined (QT_DEBUG)
+QByteArray QOpenGLEngineSharedShaders::snippetNameStr(SnippetName name)
+{
+ QMetaEnum m = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("SnippetName"));
+ return QByteArray(m.valueToKey(name));
+}
+#endif
+
+// The address returned here will only be valid until next time this function is called.
+// The program is return bound.
+QOpenGLEngineShaderProg *QOpenGLEngineSharedShaders::findProgramInCache(const QOpenGLEngineShaderProg &prog)
+{
+ for (int i = 0; i < cachedPrograms.size(); ++i) {
+ QOpenGLEngineShaderProg *cachedProg = cachedPrograms[i];
+ if (*cachedProg == prog) {
+ // Move the program to the top of the list as a poor-man's cache algo
+ cachedPrograms.move(i, 0);
+ cachedProg->program->bind();
+ return cachedProg;
+ }
+ }
+
+ QScopedPointer<QOpenGLEngineShaderProg> newProg;
+
+ do {
+ QByteArray fragSource;
+ // Insert the custom stage before the srcPixel shader to work around an ATI driver bug
+ // where you cannot forward declare a function that takes a sampler as argument.
+ if (prog.srcPixelFragShader == CustomImageSrcFragmentShader)
+ fragSource.append(prog.customStageSource);
+ fragSource.append(qShaderSnippets[prog.mainFragShader]);
+ fragSource.append(qShaderSnippets[prog.srcPixelFragShader]);
+ if (prog.compositionFragShader)
+ fragSource.append(qShaderSnippets[prog.compositionFragShader]);
+ if (prog.maskFragShader)
+ fragSource.append(qShaderSnippets[prog.maskFragShader]);
+
+ QByteArray vertexSource;
+#ifdef Q_OS_WASM
+ vertexSource.append(qShaderSnippets[prog.positionVertexShader]);
+ vertexSource.append(qShaderSnippets[prog.mainVertexShader]);
+#else
+ vertexSource.append(qShaderSnippets[prog.mainVertexShader]);
+ vertexSource.append(qShaderSnippets[prog.positionVertexShader]);
+#endif
+ QScopedPointer<QOpenGLShaderProgram> shaderProgram(new QOpenGLShaderProgram);
+
+ CachedShader shaderCache(fragSource, vertexSource);
+ bool inCache = shaderCache.load(shaderProgram.data(), QOpenGLContext::currentContext());
+
+ if (!inCache) {
+ if (!shaderProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource)) {
+ QByteArray description;
+#if defined(QT_DEBUG)
+ description.append("Vertex shader: main=");
+ description.append(snippetNameStr(prog.mainVertexShader));
+ description.append(", position=");
+ description.append(snippetNameStr(prog.positionVertexShader));
+#endif
+ qWarning("Warning: \"%s\" failed to compile!", description.constData());
+ break;
+ }
+ if (!shaderProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource)) {
+ QByteArray description;
+#if defined(QT_DEBUG)
+ description.append("Fragment shader: main=");
+ description.append(snippetNameStr(prog.mainFragShader));
+ description.append(", srcPixel=");
+ description.append(snippetNameStr(prog.srcPixelFragShader));
+ if (prog.compositionFragShader) {
+ description.append(", composition=");
+ description.append(snippetNameStr(prog.compositionFragShader));
+ }
+ if (prog.maskFragShader) {
+ description.append(", mask=");
+ description.append(snippetNameStr(prog.maskFragShader));
+ }
+#endif
+ qWarning("Warning: \"%s\" failed to compile!", description.constData());
+ break;
+ }
+
+ // We have to bind the vertex attribute names before the program is linked:
+ shaderProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+ if (prog.useTextureCoords)
+ shaderProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
+ if (prog.useOpacityAttribute)
+ shaderProgram->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR);
+ if (prog.usePmvMatrixAttribute) {
+ shaderProgram->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
+ shaderProgram->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
+ shaderProgram->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
+ }
+ }
+
+ newProg.reset(new QOpenGLEngineShaderProg(prog));
+ newProg->program = shaderProgram.take();
+
+ newProg->program->link();
+ if (newProg->program->isLinked()) {
+ if (!inCache)
+ shaderCache.store(newProg->program, QOpenGLContext::currentContext());
+ } else {
+ QString error;
+ error = QLatin1String("Shader program failed to link")
+ + QLatin1String(" Error Log:\n")
+ + QLatin1String(" ") + newProg->program->log();
+ qWarning() << error;
+ break;
+ }
+
+ newProg->program->bind();
+
+ if (newProg->maskFragShader != QOpenGLEngineSharedShaders::NoMaskFragmentShader) {
+ GLuint location = newProg->program->uniformLocation("maskTexture");
+ newProg->program->setUniformValue(location, QT_MASK_TEXTURE_UNIT);
+ }
+
+ if (cachedPrograms.count() > 30) {
+ // The cache is full, so delete the last 5 programs in the list.
+ // These programs will be least used, as a program us bumped to
+ // the top of the list when it's used.
+ for (int i = 0; i < 5; ++i) {
+ delete cachedPrograms.last();
+ cachedPrograms.removeLast();
+ }
+ }
+
+ cachedPrograms.insert(0, newProg.data());
+ } while (false);
+
+ return newProg.take();
+}
+
+void QOpenGLEngineSharedShaders::cleanupCustomStage(QOpenGLCustomShaderStage* stage)
+{
+ auto hasStageAsCustomShaderSouce = [stage](QOpenGLEngineShaderProg *cachedProg) -> bool {
+ if (cachedProg->customStageSource == stage->source()) {
+ delete cachedProg;
+ return true;
+ }
+ return false;
+ };
+ cachedPrograms.erase(std::remove_if(cachedPrograms.begin(), cachedPrograms.end(),
+ hasStageAsCustomShaderSouce),
+ cachedPrograms.end());
+}
+
+
+QOpenGLEngineShaderManager::QOpenGLEngineShaderManager(QOpenGLContext* context)
+ : ctx(context),
+ shaderProgNeedsChanging(true),
+ complexGeometry(false),
+ srcPixelType(Qt::NoBrush),
+ opacityMode(NoOpacity),
+ maskType(NoMask),
+ compositionMode(QPainter::CompositionMode_SourceOver),
+ customSrcStage(nullptr),
+ currentShaderProg(nullptr)
+{
+ sharedShaders = QOpenGLEngineSharedShaders::shadersForContext(context);
+}
+
+QOpenGLEngineShaderManager::~QOpenGLEngineShaderManager()
+{
+ //###
+ removeCustomStage();
+}
+
+GLuint QOpenGLEngineShaderManager::getUniformLocation(Uniform id)
+{
+ if (!currentShaderProg)
+ return 0;
+
+ QVector<uint> &uniformLocations = currentShaderProg->uniformLocations;
+ if (uniformLocations.isEmpty())
+ uniformLocations.fill(GLuint(-1), NumUniforms);
+
+ const char uniformNames[][26] = {
+ "imageTexture",
+ "patternColor",
+ "globalOpacity",
+ "depth",
+ "maskTexture",
+ "fragmentColor",
+ "linearData",
+ "angle",
+ "halfViewportSize",
+ "fmp",
+ "fmp2_m_radius2",
+ "inverse_2_fmp2_m_radius2",
+ "sqrfr",
+ "bradius",
+ "invertedTextureSize",
+ "brushTransform",
+ "brushTexture",
+ "matrix"
+ };
+
+ if (uniformLocations.at(id) == GLuint(-1))
+ uniformLocations[id] = currentShaderProg->program->uniformLocation(uniformNames[id]);
+
+ return uniformLocations.at(id);
+}
+
+
+void QOpenGLEngineShaderManager::optimiseForBrushTransform(QTransform::TransformationType transformType)
+{
+ Q_UNUSED(transformType); // Currently ignored
+}
+
+void QOpenGLEngineShaderManager::setDirty()
+{
+ shaderProgNeedsChanging = true;
+}
+
+void QOpenGLEngineShaderManager::setSrcPixelType(Qt::BrushStyle style)
+{
+ Q_ASSERT(style != Qt::NoBrush);
+ if (srcPixelType == PixelSrcType(style))
+ return;
+
+ srcPixelType = style;
+ shaderProgNeedsChanging = true; //###
+}
+
+void QOpenGLEngineShaderManager::setSrcPixelType(PixelSrcType type)
+{
+ if (srcPixelType == type)
+ return;
+
+ srcPixelType = type;
+ shaderProgNeedsChanging = true; //###
+}
+
+void QOpenGLEngineShaderManager::setOpacityMode(OpacityMode mode)
+{
+ if (opacityMode == mode)
+ return;
+
+ opacityMode = mode;
+ shaderProgNeedsChanging = true; //###
+}
+
+void QOpenGLEngineShaderManager::setMaskType(MaskType type)
+{
+ if (maskType == type)
+ return;
+
+ maskType = type;
+ shaderProgNeedsChanging = true; //###
+}
+
+void QOpenGLEngineShaderManager::setCompositionMode(QPainter::CompositionMode mode)
+{
+ if (compositionMode == mode)
+ return;
+
+ bool wasAdvanced = compositionMode > QPainter::CompositionMode_Plus;
+ bool isAdvanced = mode > QPainter::CompositionMode_Plus;
+
+ compositionMode = mode;
+ shaderProgNeedsChanging = shaderProgNeedsChanging || wasAdvanced || isAdvanced;
+}
+
+void QOpenGLEngineShaderManager::setCustomStage(QOpenGLCustomShaderStage* stage)
+{
+ if (customSrcStage)
+ removeCustomStage();
+ customSrcStage = stage;
+ shaderProgNeedsChanging = true;
+}
+
+void QOpenGLEngineShaderManager::removeCustomStage()
+{
+ if (customSrcStage)
+ customSrcStage->setInactive();
+ customSrcStage = nullptr;
+ shaderProgNeedsChanging = true;
+}
+
+QOpenGLShaderProgram* QOpenGLEngineShaderManager::currentProgram()
+{
+ if (currentShaderProg)
+ return currentShaderProg->program;
+ else
+ return sharedShaders->simpleProgram();
+}
+
+void QOpenGLEngineShaderManager::useSimpleProgram()
+{
+ sharedShaders->simpleProgram()->bind();
+ QOpenGLContextPrivate* ctx_d = ctx->d_func();
+ Q_UNUSED(ctx_d);
+
+ QOpenGL2PaintEngineEx *active_engine = static_cast<QOpenGL2PaintEngineEx *>(ctx_d->active_engine);
+
+ active_engine->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
+ active_engine->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, false);
+ active_engine->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false);
+
+ shaderProgNeedsChanging = true;
+}
+
+void QOpenGLEngineShaderManager::useBlitProgram()
+{
+ sharedShaders->blitProgram()->bind();
+ QOpenGLContextPrivate* ctx_d = ctx->d_func();
+ QOpenGL2PaintEngineEx *active_engine = static_cast<QOpenGL2PaintEngineEx *>(ctx_d->active_engine);
+ active_engine->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
+ active_engine->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, true);
+ active_engine->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false);
+ shaderProgNeedsChanging = true;
+}
+
+QOpenGLShaderProgram* QOpenGLEngineShaderManager::simpleProgram()
+{
+ return sharedShaders->simpleProgram();
+}
+
+QOpenGLShaderProgram* QOpenGLEngineShaderManager::blitProgram()
+{
+ return sharedShaders->blitProgram();
+}
+
+
+
+// Select & use the correct shader program using the current state.
+// Returns \c true if program needed changing.
+bool QOpenGLEngineShaderManager::useCorrectShaderProg()
+{
+ if (!shaderProgNeedsChanging)
+ return false;
+
+ bool useCustomSrc = customSrcStage != nullptr;
+ if (useCustomSrc && srcPixelType != QOpenGLEngineShaderManager::ImageSrc && srcPixelType != Qt::TexturePattern) {
+ useCustomSrc = false;
+ qWarning("QOpenGLEngineShaderManager - Ignoring custom shader stage for non image src");
+ }
+
+ QOpenGLEngineShaderProg requiredProgram;
+
+ bool texCoords = false;
+
+ // Choose vertex shader shader position function (which typically also sets
+ // varyings) and the source pixel (srcPixel) fragment shader function:
+ requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::InvalidSnippetName;
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::InvalidSnippetName;
+ bool isAffine = brushTransform.isAffine();
+ if ( (srcPixelType >= Qt::Dense1Pattern) && (srcPixelType <= Qt::DiagCrossPattern) ) {
+ if (isAffine)
+ requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::AffinePositionWithPatternBrushVertexShader;
+ else
+ requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionWithPatternBrushVertexShader;
+
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::PatternBrushSrcFragmentShader;
+ }
+ else switch (srcPixelType) {
+ default:
+ case Qt::NoBrush:
+ qFatal("QOpenGLEngineShaderManager::useCorrectShaderProg() - Qt::NoBrush style is set");
+ break;
+ case QOpenGLEngineShaderManager::ImageSrc:
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ImageSrcFragmentShader;
+ requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
+ texCoords = true;
+ break;
+ case QOpenGLEngineShaderManager::NonPremultipliedImageSrc:
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::NonPremultipliedImageSrcFragmentShader;
+ requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
+ texCoords = true;
+ break;
+ case QOpenGLEngineShaderManager::GrayscaleImageSrc:
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::GrayscaleImageSrcFragmentShader;
+ requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
+ texCoords = true;
+ break;
+ case QOpenGLEngineShaderManager::AlphaImageSrc:
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::AlphaImageSrcFragmentShader;
+ requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
+ texCoords = true;
+ break;
+ case QOpenGLEngineShaderManager::PatternSrc:
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ImageSrcWithPatternFragmentShader;
+ requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
+ texCoords = true;
+ break;
+ case QOpenGLEngineShaderManager::TextureSrcWithPattern:
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::TextureBrushSrcWithPatternFragmentShader;
+ requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
+ : QOpenGLEngineSharedShaders::PositionWithTextureBrushVertexShader;
+ break;
+ case Qt::SolidPattern:
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::SolidBrushSrcFragmentShader;
+ requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
+ break;
+ case Qt::LinearGradientPattern:
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::LinearGradientBrushSrcFragmentShader;
+ requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithLinearGradientBrushVertexShader
+ : QOpenGLEngineSharedShaders::PositionWithLinearGradientBrushVertexShader;
+ break;
+ case Qt::ConicalGradientPattern:
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ConicalGradientBrushSrcFragmentShader;
+ requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithConicalGradientBrushVertexShader
+ : QOpenGLEngineSharedShaders::PositionWithConicalGradientBrushVertexShader;
+ break;
+ case Qt::RadialGradientPattern:
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::RadialGradientBrushSrcFragmentShader;
+ requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithRadialGradientBrushVertexShader
+ : QOpenGLEngineSharedShaders::PositionWithRadialGradientBrushVertexShader;
+ break;
+ case Qt::TexturePattern:
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::TextureBrushSrcFragmentShader;
+ requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
+ : QOpenGLEngineSharedShaders::PositionWithTextureBrushVertexShader;
+ break;
+ };
+
+ if (useCustomSrc) {
+ requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::CustomImageSrcFragmentShader;
+ requiredProgram.customStageSource = customSrcStage->source();
+ }
+
+ const bool hasCompose = compositionMode > QPainter::CompositionMode_Plus;
+ const bool hasMask = maskType != QOpenGLEngineShaderManager::NoMask;
+
+ // Choose fragment shader main function:
+ if (opacityMode == AttributeOpacity) {
+ Q_ASSERT(!hasCompose && !hasMask);
+ requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_ImageArrays;
+ } else {
+ bool useGlobalOpacity = (opacityMode == UniformOpacity);
+ if (hasMask && useGlobalOpacity)
+ requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_MO;
+ if (hasMask && !useGlobalOpacity)
+ requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_M;
+ if (!hasMask && useGlobalOpacity)
+ requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_O;
+ if (!hasMask && !useGlobalOpacity)
+ requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader;
+ }
+
+ if (hasMask) {
+ if (maskType == PixelMask) {
+ requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::MaskFragmentShader;
+ texCoords = true;
+ } else if (maskType == SubPixelMaskPass1) {
+ requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskFragmentShaderPass1;
+ texCoords = true;
+ } else if (maskType == SubPixelMaskPass2) {
+ requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskFragmentShaderPass2;
+ texCoords = true;
+ } else if (maskType == SubPixelWithGammaMask) {
+ requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskWithGammaFragmentShader;
+ texCoords = true;
+ } else {
+ qCritical("QOpenGLEngineShaderManager::useCorrectShaderProg() - Unknown mask type");
+ }
+ } else {
+ requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::NoMaskFragmentShader;
+ }
+
+ if (hasCompose) {
+ switch (compositionMode) {
+ case QPainter::CompositionMode_Multiply:
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::MultiplyCompositionModeFragmentShader;
+ break;
+ case QPainter::CompositionMode_Screen:
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ScreenCompositionModeFragmentShader;
+ break;
+ case QPainter::CompositionMode_Overlay:
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::OverlayCompositionModeFragmentShader;
+ break;
+ case QPainter::CompositionMode_Darken:
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::DarkenCompositionModeFragmentShader;
+ break;
+ case QPainter::CompositionMode_Lighten:
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::LightenCompositionModeFragmentShader;
+ break;
+ case QPainter::CompositionMode_ColorDodge:
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ColorDodgeCompositionModeFragmentShader;
+ break;
+ case QPainter::CompositionMode_ColorBurn:
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ColorBurnCompositionModeFragmentShader;
+ break;
+ case QPainter::CompositionMode_HardLight:
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::HardLightCompositionModeFragmentShader;
+ break;
+ case QPainter::CompositionMode_SoftLight:
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::SoftLightCompositionModeFragmentShader;
+ break;
+ case QPainter::CompositionMode_Difference:
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::DifferenceCompositionModeFragmentShader;
+ break;
+ case QPainter::CompositionMode_Exclusion:
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ExclusionCompositionModeFragmentShader;
+ break;
+ default:
+ qWarning("QOpenGLEngineShaderManager::useCorrectShaderProg() - Unsupported composition mode");
+ }
+ } else {
+ requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::NoCompositionModeFragmentShader;
+ }
+
+ // Choose vertex shader main function
+ if (opacityMode == AttributeOpacity) {
+ Q_ASSERT(texCoords);
+ requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainWithTexCoordsAndOpacityVertexShader;
+ } else if (texCoords) {
+ requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainWithTexCoordsVertexShader;
+ } else {
+ requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainVertexShader;
+ }
+ requiredProgram.useTextureCoords = texCoords;
+ requiredProgram.useOpacityAttribute = (opacityMode == AttributeOpacity);
+ if (complexGeometry && srcPixelType == Qt::SolidPattern) {
+ requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::ComplexGeometryPositionOnlyVertexShader;
+ requiredProgram.usePmvMatrixAttribute = false;
+ } else {
+ requiredProgram.usePmvMatrixAttribute = true;
+
+ // Force complexGeometry off, since we currently don't support that mode for
+ // non-solid brushes
+ complexGeometry = false;
+ }
+
+ // At this point, requiredProgram is fully populated so try to find the program in the cache
+ currentShaderProg = sharedShaders->findProgramInCache(requiredProgram);
+
+ if (currentShaderProg && useCustomSrc) {
+ customSrcStage->setUniforms(currentShaderProg->program);
+ }
+
+ // Make sure all the vertex attribute arrays the program uses are enabled (and the ones it
+ // doesn't use are disabled)
+ QOpenGLContextPrivate* ctx_d = ctx->d_func();
+ QOpenGL2PaintEngineEx *active_engine = static_cast<QOpenGL2PaintEngineEx *>(ctx_d->active_engine);
+ active_engine->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
+ active_engine->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, currentShaderProg && currentShaderProg->useTextureCoords);
+ active_engine->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, currentShaderProg && currentShaderProg->useOpacityAttribute);
+
+ shaderProgNeedsChanging = false;
+ return true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglengineshadermanager_p.h b/src/opengl/qopenglengineshadermanager_p.h
new file mode 100644
index 0000000000..71e6214278
--- /dev/null
+++ b/src/opengl/qopenglengineshadermanager_p.h
@@ -0,0 +1,506 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+/*
+ VERTEX SHADERS
+ ==============
+
+ Vertex shaders are specified as multiple (partial) shaders. On desktop,
+ this works fine. On ES, QOpenGLShader & QOpenGLShaderProgram will make partial
+ shaders work by concatenating the source in each QOpenGLShader and compiling
+ it as a single shader. This is abstracted nicely by QOpenGLShaderProgram and
+ the GL2 engine doesn't need to worry about it.
+
+ Generally, there's two vertex shader objects. The position shaders are
+ the ones which set gl_Position. There's also two "main" vertex shaders,
+ one which just calls the position shader and another which also passes
+ through some texture coordinates from a vertex attribute array to a
+ varying. These texture coordinates are used for mask position in text
+ rendering and for the source coordinates in drawImage/drawPixmap. There's
+ also a "Simple" vertex shader for rendering a solid colour (used to render
+ into the stencil buffer where the actual colour value is discarded).
+
+ The position shaders for brushes look scary. This is because many of the
+ calculations which logically belong in the fragment shader have been moved
+ into the vertex shader to improve performance. This is why the position
+ calculation is in a separate shader. Not only does it calculate the
+ position, but it also calculates some data to be passed to the fragment
+ shader as a varying. It is optimal to move as much of the calculation as
+ possible into the vertex shader as this is executed less often.
+
+ The varyings passed to the fragment shaders are interpolated (which is
+ cheap). Unfortunately, GL will apply perspective correction to the
+ interpolation calusing errors. To get around this, the vertex shader must
+ apply perspective correction itself and set the w-value of gl_Position to
+ zero. That way, GL will be tricked into thinking it doesn't need to apply a
+ perspective correction and use linear interpolation instead (which is what
+ we want). Of course, if the brush transform is affeine, no perspective
+ correction is needed and a simpler vertex shader can be used instead.
+
+ So there are the following "main" vertex shaders:
+ qopenglslMainVertexShader
+ qopenglslMainWithTexCoordsVertexShader
+
+ And the following position vertex shaders:
+ qopenglslPositionOnlyVertexShader
+ qopenglslPositionWithTextureBrushVertexShader
+ qopenglslPositionWithPatternBrushVertexShader
+ qopenglslPositionWithLinearGradientBrushVertexShader
+ qopenglslPositionWithRadialGradientBrushVertexShader
+ qopenglslPositionWithConicalGradientBrushVertexShader
+ qopenglslAffinePositionWithTextureBrushVertexShader
+ qopenglslAffinePositionWithPatternBrushVertexShader
+ qopenglslAffinePositionWithLinearGradientBrushVertexShader
+ qopenglslAffinePositionWithRadialGradientBrushVertexShader
+ qopenglslAffinePositionWithConicalGradientBrushVertexShader
+
+ Leading to 23 possible vertex shaders
+
+
+ FRAGMENT SHADERS
+ ================
+
+ Fragment shaders are also specified as multiple (partial) shaders. The
+ different fragment shaders represent the different stages in Qt's fragment
+ pipeline. There are 1-3 stages in this pipeline: First stage is to get the
+ fragment's colour value. The next stage is to get the fragment's mask value
+ (coverage value for anti-aliasing) and the final stage is to blend the
+ incoming fragment with the background (for composition modes not supported
+ by GL).
+
+ Of these, the first stage will always be present. If Qt doesn't need to
+ apply anti-aliasing (because it's off or handled by multisampling) then
+ the coverage value doesn't need to be applied. (Note: There are two types
+ of mask, one for regular anti-aliasing and one for sub-pixel anti-
+ aliasing.) If the composition mode is one which GL supports natively then
+ the blending stage doesn't need to be applied.
+
+ As eash stage can have multiple implementations, they are abstracted as
+ GLSL function calls with the following signatures:
+
+ Brushes & image drawing are implementations of "qcolorp vec4 srcPixel()":
+ qopenglslImageSrcFragShader
+ qopenglslImageSrcWithPatternFragShader
+ qopenglslNonPremultipliedImageSrcFragShader
+ qopenglslSolidBrushSrcFragShader
+ qopenglslTextureBrushSrcFragShader
+ qopenglslTextureBrushWithPatternFragShader
+ qopenglslPatternBrushSrcFragShader
+ qopenglslLinearGradientBrushSrcFragShader
+ qopenglslRadialGradientBrushSrcFragShader
+ qopenglslConicalGradientBrushSrcFragShader
+ NOTE: It is assumed the colour returned by srcPixel() is pre-multiplied
+
+ Masks are implementations of "qcolorp vec4 applyMask(qcolorp vec4 src)":
+ qopenglslMaskFragmentShader
+ qopenglslRgbMaskFragmentShaderPass1
+ qopenglslRgbMaskFragmentShaderPass2
+ qopenglslRgbMaskWithGammaFragmentShader
+
+ Composition modes are "qcolorp vec4 compose(qcolorp vec4 src)":
+ qopenglslColorBurnCompositionModeFragmentShader
+ qopenglslColorDodgeCompositionModeFragmentShader
+ qopenglslDarkenCompositionModeFragmentShader
+ qopenglslDifferenceCompositionModeFragmentShader
+ qopenglslExclusionCompositionModeFragmentShader
+ qopenglslHardLightCompositionModeFragmentShader
+ qopenglslLightenCompositionModeFragmentShader
+ qopenglslMultiplyCompositionModeFragmentShader
+ qopenglslOverlayCompositionModeFragmentShader
+ qopenglslScreenCompositionModeFragmentShader
+ qopenglslSoftLightCompositionModeFragmentShader
+
+
+ Note: In the future, some GLSL compilers will support an extension allowing
+ a new 'color' precision specifier. To support this, qcolorp is used for
+ all color components so it can be defined to colorp or lowp depending upon
+ the implementation.
+
+ So there are differnt frament shader main functions, depending on the
+ number & type of pipelines the fragment needs to go through.
+
+ The choice of which main() fragment shader string to use depends on:
+ - Use of global opacity
+ - Brush style (some brushes apply opacity themselves)
+ - Use & type of mask (TODO: Need to support high quality anti-aliasing & text)
+ - Use of non-GL Composition mode
+
+ Leading to the following fragment shader main functions:
+ gl_FragColor = compose(applyMask(srcPixel()*globalOpacity));
+ gl_FragColor = compose(applyMask(srcPixel()));
+ gl_FragColor = applyMask(srcPixel()*globalOpacity);
+ gl_FragColor = applyMask(srcPixel());
+ gl_FragColor = compose(srcPixel()*globalOpacity);
+ gl_FragColor = compose(srcPixel());
+ gl_FragColor = srcPixel()*globalOpacity;
+ gl_FragColor = srcPixel();
+
+ Called:
+ qopenglslMainFragmentShader_CMO
+ qopenglslMainFragmentShader_CM
+ qopenglslMainFragmentShader_MO
+ qopenglslMainFragmentShader_M
+ qopenglslMainFragmentShader_CO
+ qopenglslMainFragmentShader_C
+ qopenglslMainFragmentShader_O
+ qopenglslMainFragmentShader
+
+ Where:
+ M = Mask
+ C = Composition
+ O = Global Opacity
+
+
+ CUSTOM SHADER CODE
+ ==================
+
+ The use of custom shader code is supported by the engine for drawImage and
+ drawPixmap calls. This is implemented via hooks in the fragment pipeline.
+
+ The custom shader is passed to the engine as a partial fragment shader
+ (QOpenGLCustomShaderStage). The shader will implement a pre-defined method name
+ which Qt's fragment pipeline will call:
+
+ lowp vec4 customShader(lowp sampler2d imageTexture, highp vec2 textureCoords)
+
+ The provided src and srcCoords parameters can be used to sample from the
+ source image.
+
+ Transformations, clipping, opacity, and composition modes set using QPainter
+ will be respected when using the custom shader hook.
+*/
+
+#ifndef QOPENGLENGINE_SHADER_MANAGER_H
+#define QOPENGLENGINE_SHADER_MANAGER_H
+
+#include <QOpenGLShader>
+#include <QOpenGLShaderProgram>
+#include <QPainter>
+#include <private/qopenglcontext_p.h>
+#include <private/qopenglcustomshaderstage_p.h>
+
+QT_BEGIN_NAMESPACE
+
+
+
+/*
+struct QOpenGLEngineCachedShaderProg
+{
+ QOpenGLEngineCachedShaderProg(QOpenGLEngineShaderManager::ShaderName vertexMain,
+ QOpenGLEngineShaderManager::ShaderName vertexPosition,
+ QOpenGLEngineShaderManager::ShaderName fragMain,
+ QOpenGLEngineShaderManager::ShaderName pixelSrc,
+ QOpenGLEngineShaderManager::ShaderName mask,
+ QOpenGLEngineShaderManager::ShaderName composition);
+
+ int cacheKey;
+ QOpenGLShaderProgram* program;
+}
+*/
+
+static const GLuint QT_VERTEX_COORDS_ATTR = 0;
+static const GLuint QT_TEXTURE_COORDS_ATTR = 1;
+static const GLuint QT_OPACITY_ATTR = 2;
+static const GLuint QT_PMV_MATRIX_1_ATTR = 3;
+static const GLuint QT_PMV_MATRIX_2_ATTR = 4;
+static const GLuint QT_PMV_MATRIX_3_ATTR = 5;
+
+class QOpenGLEngineShaderProg;
+
+class Q_OPENGL_EXPORT QOpenGLEngineSharedShaders
+{
+ Q_GADGET
+public:
+
+ enum SnippetName {
+ MainVertexShader,
+ MainWithTexCoordsVertexShader,
+ MainWithTexCoordsAndOpacityVertexShader,
+
+ // UntransformedPositionVertexShader must be first in the list:
+ UntransformedPositionVertexShader,
+ PositionOnlyVertexShader,
+ ComplexGeometryPositionOnlyVertexShader,
+ PositionWithPatternBrushVertexShader,
+ PositionWithLinearGradientBrushVertexShader,
+ PositionWithConicalGradientBrushVertexShader,
+ PositionWithRadialGradientBrushVertexShader,
+ PositionWithTextureBrushVertexShader,
+ AffinePositionWithPatternBrushVertexShader,
+ AffinePositionWithLinearGradientBrushVertexShader,
+ AffinePositionWithConicalGradientBrushVertexShader,
+ AffinePositionWithRadialGradientBrushVertexShader,
+ AffinePositionWithTextureBrushVertexShader,
+
+ // MainFragmentShader_CMO must be first in the list:
+ MainFragmentShader_MO,
+ MainFragmentShader_M,
+ MainFragmentShader_O,
+ MainFragmentShader,
+ MainFragmentShader_ImageArrays,
+
+ // ImageSrcFragmentShader must be first in the list::
+ ImageSrcFragmentShader,
+ ImageSrcWithPatternFragmentShader,
+ NonPremultipliedImageSrcFragmentShader,
+ GrayscaleImageSrcFragmentShader,
+ AlphaImageSrcFragmentShader,
+ CustomImageSrcFragmentShader,
+ SolidBrushSrcFragmentShader,
+ TextureBrushSrcFragmentShader,
+ TextureBrushSrcWithPatternFragmentShader,
+ PatternBrushSrcFragmentShader,
+ LinearGradientBrushSrcFragmentShader,
+ RadialGradientBrushSrcFragmentShader,
+ ConicalGradientBrushSrcFragmentShader,
+ ShockingPinkSrcFragmentShader,
+
+ // NoMaskFragmentShader must be first in the list:
+ NoMaskFragmentShader,
+ MaskFragmentShader,
+ RgbMaskFragmentShaderPass1,
+ RgbMaskFragmentShaderPass2,
+ RgbMaskWithGammaFragmentShader,
+
+ // NoCompositionModeFragmentShader must be first in the list:
+ NoCompositionModeFragmentShader,
+ MultiplyCompositionModeFragmentShader,
+ ScreenCompositionModeFragmentShader,
+ OverlayCompositionModeFragmentShader,
+ DarkenCompositionModeFragmentShader,
+ LightenCompositionModeFragmentShader,
+ ColorDodgeCompositionModeFragmentShader,
+ ColorBurnCompositionModeFragmentShader,
+ HardLightCompositionModeFragmentShader,
+ SoftLightCompositionModeFragmentShader,
+ DifferenceCompositionModeFragmentShader,
+ ExclusionCompositionModeFragmentShader,
+
+ TotalSnippetCount, InvalidSnippetName
+ };
+#if defined (QT_DEBUG)
+ Q_ENUM(SnippetName)
+ static QByteArray snippetNameStr(SnippetName snippetName);
+#endif
+
+/*
+ // These allow the ShaderName enum to be used as a cache key
+ const int mainVertexOffset = 0;
+ const int positionVertexOffset = (1<<2) - PositionOnlyVertexShader;
+ const int mainFragOffset = (1<<6) - MainFragmentShader_CMO;
+ const int srcPixelOffset = (1<<10) - ImageSrcFragmentShader;
+ const int maskOffset = (1<<14) - NoMaskShader;
+ const int compositionOffset = (1 << 16) - MultiplyCompositionModeFragmentShader;
+*/
+
+ QOpenGLEngineSharedShaders(QOpenGLContext *context);
+ ~QOpenGLEngineSharedShaders();
+
+ QOpenGLShaderProgram *simpleProgram() { return simpleShaderProg; }
+ QOpenGLShaderProgram *blitProgram() { return blitShaderProg; }
+ // Compile the program if it's not already in the cache, return the item in the cache.
+ QOpenGLEngineShaderProg *findProgramInCache(const QOpenGLEngineShaderProg &prog);
+ // Compile the custom shader if it's not already in the cache, return the item in the cache.
+
+ static QOpenGLEngineSharedShaders *shadersForContext(QOpenGLContext *context);
+
+ // Ideally, this would be static and cleanup all programs in all contexts which
+ // contain the custom code. Currently it is just a hint and we rely on deleted
+ // custom shaders being cleaned up by being kicked out of the cache when it's
+ // full.
+ void cleanupCustomStage(QOpenGLCustomShaderStage* stage);
+
+private:
+ QOpenGLShaderProgram *blitShaderProg;
+ QOpenGLShaderProgram *simpleShaderProg;
+ QList<QOpenGLEngineShaderProg*> cachedPrograms;
+
+ static const char* qShaderSnippets[TotalSnippetCount];
+};
+
+
+class QOpenGLEngineShaderProg
+{
+public:
+ QOpenGLEngineShaderProg() : program(nullptr) {}
+
+ ~QOpenGLEngineShaderProg() {
+ if (program)
+ delete program;
+ }
+
+ QOpenGLEngineSharedShaders::SnippetName mainVertexShader;
+ QOpenGLEngineSharedShaders::SnippetName positionVertexShader;
+ QOpenGLEngineSharedShaders::SnippetName mainFragShader;
+ QOpenGLEngineSharedShaders::SnippetName srcPixelFragShader;
+ QOpenGLEngineSharedShaders::SnippetName maskFragShader;
+ QOpenGLEngineSharedShaders::SnippetName compositionFragShader;
+
+ QByteArray customStageSource; //TODO: Decent cache key for custom stages
+ QOpenGLShaderProgram* program;
+
+ QVector<uint> uniformLocations;
+
+ bool useTextureCoords;
+ bool useOpacityAttribute;
+ bool usePmvMatrixAttribute;
+
+ bool operator==(const QOpenGLEngineShaderProg& other) const {
+ // We don't care about the program
+ return ( mainVertexShader == other.mainVertexShader &&
+ positionVertexShader == other.positionVertexShader &&
+ mainFragShader == other.mainFragShader &&
+ srcPixelFragShader == other.srcPixelFragShader &&
+ maskFragShader == other.maskFragShader &&
+ compositionFragShader == other.compositionFragShader &&
+ customStageSource == other.customStageSource
+ );
+ }
+};
+
+class Q_OPENGL_EXPORT QOpenGLEngineShaderManager : public QObject
+{
+ Q_OBJECT
+public:
+ QOpenGLEngineShaderManager(QOpenGLContext* context);
+ ~QOpenGLEngineShaderManager();
+
+ enum MaskType {NoMask, PixelMask, SubPixelMaskPass1, SubPixelMaskPass2, SubPixelWithGammaMask};
+ enum PixelSrcType {
+ ImageSrc = Qt::TexturePattern+1,
+ NonPremultipliedImageSrc = Qt::TexturePattern+2,
+ PatternSrc = Qt::TexturePattern+3,
+ TextureSrcWithPattern = Qt::TexturePattern+4,
+ GrayscaleImageSrc = Qt::TexturePattern+5,
+ AlphaImageSrc = Qt::TexturePattern+6,
+ };
+
+ enum Uniform {
+ ImageTexture,
+ PatternColor,
+ GlobalOpacity,
+ Depth,
+ MaskTexture,
+ FragmentColor,
+ LinearData,
+ Angle,
+ HalfViewportSize,
+ Fmp,
+ Fmp2MRadius2,
+ Inverse2Fmp2MRadius2,
+ SqrFr,
+ BRadius,
+ InvertedTextureSize,
+ BrushTransform,
+ BrushTexture,
+ Matrix,
+ NumUniforms
+ };
+
+ enum OpacityMode {
+ NoOpacity,
+ UniformOpacity,
+ AttributeOpacity
+ };
+
+ // There are optimizations we can do, depending on the brush transform:
+ // 1) May not have to apply perspective-correction
+ // 2) Can use lower precision for matrix
+ void optimiseForBrushTransform(QTransform::TransformationType transformType);
+ void setSrcPixelType(Qt::BrushStyle);
+ void setSrcPixelType(PixelSrcType); // For non-brush sources, like pixmaps & images
+ void setOpacityMode(OpacityMode);
+ void setMaskType(MaskType);
+ void setCompositionMode(QPainter::CompositionMode);
+ void setCustomStage(QOpenGLCustomShaderStage* stage);
+ void removeCustomStage();
+
+ GLuint getUniformLocation(Uniform id);
+
+ void setDirty(); // someone has manually changed the current shader program
+ bool useCorrectShaderProg(); // returns true if the shader program needed to be changed
+
+ void useSimpleProgram();
+ void useBlitProgram();
+ void setHasComplexGeometry(bool hasComplexGeometry)
+ {
+ complexGeometry = hasComplexGeometry;
+ shaderProgNeedsChanging = true;
+ }
+ bool hasComplexGeometry() const
+ {
+ return complexGeometry;
+ }
+
+ QOpenGLShaderProgram* currentProgram(); // Returns pointer to the shader the manager has chosen
+ QOpenGLShaderProgram* simpleProgram(); // Used to draw into e.g. stencil buffers
+ QOpenGLShaderProgram* blitProgram(); // Used to blit a texture into the framebuffer
+
+ QOpenGLEngineSharedShaders* sharedShaders;
+
+private:
+ QOpenGLContext* ctx;
+ bool shaderProgNeedsChanging;
+ bool complexGeometry;
+
+ // Current state variables which influence the choice of shader:
+ QTransform brushTransform;
+ int srcPixelType;
+ OpacityMode opacityMode;
+ MaskType maskType;
+ QPainter::CompositionMode compositionMode;
+ QOpenGLCustomShaderStage* customSrcStage;
+
+ QOpenGLEngineShaderProg* currentShaderProg;
+};
+
+QT_END_NAMESPACE
+
+#endif //QOPENGLENGINE_SHADER_MANAGER_H
diff --git a/src/opengl/qopenglengineshadersource_p.h b/src/opengl/qopenglengineshadersource_p.h
new file mode 100644
index 0000000000..49d17c8d79
--- /dev/null
+++ b/src/opengl/qopenglengineshadersource_p.h
@@ -0,0 +1,969 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+
+#ifndef QOPENGL_ENGINE_SHADER_SOURCE_H
+#define QOPENGL_ENGINE_SHADER_SOURCE_H
+
+#include "qopenglengineshadermanager_p.h"
+
+QT_BEGIN_NAMESPACE
+
+
+static const char* const qopenglslMainVertexShader = "\n\
+ void setPosition(); \n\
+ void main(void) \n\
+ { \n\
+ setPosition(); \n\
+ }\n";
+
+static const char* const qopenglslMainWithTexCoordsVertexShader = "\n\
+ attribute highp vec2 textureCoordArray; \n\
+ varying highp vec2 textureCoords; \n\
+ void setPosition(); \n\
+ void main(void) \n\
+ { \n\
+ setPosition(); \n\
+ textureCoords = textureCoordArray; \n\
+ }\n";
+
+static const char* const qopenglslMainWithTexCoordsAndOpacityVertexShader = "\n\
+ attribute highp vec2 textureCoordArray; \n\
+ attribute lowp float opacityArray; \n\
+ varying highp vec2 textureCoords; \n\
+ varying lowp float opacity; \n\
+ void setPosition(); \n\
+ void main(void) \n\
+ { \n\
+ setPosition(); \n\
+ textureCoords = textureCoordArray; \n\
+ opacity = opacityArray; \n\
+ }\n";
+
+// NOTE: We let GL do the perspective correction so texture lookups in the fragment
+// shader are also perspective corrected.
+static const char* const qopenglslPositionOnlyVertexShader = "\n\
+ attribute highp vec2 vertexCoordsArray; \n\
+ attribute highp vec3 pmvMatrix1; \n\
+ attribute highp vec3 pmvMatrix2; \n\
+ attribute highp vec3 pmvMatrix3; \n\
+ void setPosition(void) \n\
+ { \n\
+ highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position = vec4(transformedPos.xy, 0.0, transformedPos.z); \n\
+ }\n";
+
+static const char* const qopenglslComplexGeometryPositionOnlyVertexShader = "\n\
+ uniform highp mat3 matrix; \n\
+ attribute highp vec2 vertexCoordsArray; \n\
+ void setPosition(void) \n\
+ { \n\
+ gl_Position = vec4(matrix * vec3(vertexCoordsArray, 1), 1);\n\
+ } \n";
+
+static const char* const qopenglslUntransformedPositionVertexShader = "\n\
+ attribute highp vec4 vertexCoordsArray; \n\
+ void setPosition(void) \n\
+ { \n\
+ gl_Position = vertexCoordsArray; \n\
+ }\n";
+
+// Pattern Brush - This assumes the texture size is 8x8 and thus, the inverted size is 0.125
+static const char* const qopenglslPositionWithPatternBrushVertexShader = "\n\
+ attribute highp vec2 vertexCoordsArray; \n\
+ attribute highp vec3 pmvMatrix1; \n\
+ attribute highp vec3 pmvMatrix2; \n\
+ attribute highp vec3 pmvMatrix3; \n\
+ uniform mediump vec2 halfViewportSize; \n\
+ uniform highp vec2 invertedTextureSize; \n\
+ uniform highp mat3 brushTransform; \n\
+ varying highp vec2 patternTexCoords; \n\
+ void setPosition(void) \n\
+ { \n\
+ highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
+ mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
+ mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1.0); \n\
+ mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
+ gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
+ patternTexCoords.xy = (hTexCoords.xy * 0.125) * invertedHTexCoordsZ; \n\
+ }\n";
+
+static const char* const qopenglslAffinePositionWithPatternBrushVertexShader
+ = qopenglslPositionWithPatternBrushVertexShader;
+
+static const char* const qopenglslPatternBrushSrcFragmentShader = "\n\
+ uniform sampler2D brushTexture; \n\
+ uniform lowp vec4 patternColor; \n\
+ varying highp vec2 patternTexCoords;\n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ return patternColor * (1.0 - texture2D(brushTexture, patternTexCoords).r); \n\
+ }\n";
+
+
+// Linear Gradient Brush
+static const char* const qopenglslPositionWithLinearGradientBrushVertexShader = "\n\
+ attribute highp vec2 vertexCoordsArray; \n\
+ attribute highp vec3 pmvMatrix1; \n\
+ attribute highp vec3 pmvMatrix2; \n\
+ attribute highp vec3 pmvMatrix3; \n\
+ uniform mediump vec2 halfViewportSize; \n\
+ uniform highp vec3 linearData; \n\
+ uniform highp mat3 brushTransform; \n\
+ varying mediump float index; \n\
+ void setPosition() \n\
+ { \n\
+ highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
+ mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
+ mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
+ mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
+ gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
+ index = (dot(linearData.xy, hTexCoords.xy) * linearData.z) * invertedHTexCoordsZ; \n\
+ }\n";
+
+static const char* const qopenglslAffinePositionWithLinearGradientBrushVertexShader
+ = qopenglslPositionWithLinearGradientBrushVertexShader;
+
+static const char* const qopenglslLinearGradientBrushSrcFragmentShader = "\n\
+ uniform sampler2D brushTexture; \n\
+ varying mediump float index; \n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ mediump vec2 val = vec2(index, 0.5); \n\
+ return texture2D(brushTexture, val); \n\
+ }\n";
+
+
+// Conical Gradient Brush
+static const char* const qopenglslPositionWithConicalGradientBrushVertexShader = "\n\
+ attribute highp vec2 vertexCoordsArray; \n\
+ attribute highp vec3 pmvMatrix1; \n\
+ attribute highp vec3 pmvMatrix2; \n\
+ attribute highp vec3 pmvMatrix3; \n\
+ uniform mediump vec2 halfViewportSize; \n\
+ uniform highp mat3 brushTransform; \n\
+ varying highp vec2 A; \n\
+ void setPosition(void) \n\
+ { \n\
+ highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
+ mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
+ mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
+ mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
+ gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
+ A = hTexCoords.xy * invertedHTexCoordsZ; \n\
+ }\n";
+
+static const char* const qopenglslAffinePositionWithConicalGradientBrushVertexShader
+ = qopenglslPositionWithConicalGradientBrushVertexShader;
+
+static const char* const qopenglslConicalGradientBrushSrcFragmentShader = "\n\
+ #define INVERSE_2PI 0.1591549430918953358 \n\
+ uniform sampler2D brushTexture; \n\
+ uniform mediump float angle; \n\
+ varying highp vec2 A; \n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ highp float t; \n\
+ if (abs(A.y) == abs(A.x)) \n\
+ t = (atan(-A.y + 0.002, A.x) + angle) * INVERSE_2PI; \n\
+ else \n\
+ t = (atan(-A.y, A.x) + angle) * INVERSE_2PI; \n\
+ return texture2D(brushTexture, vec2(t - floor(t), 0.5)); \n\
+ }\n";
+
+
+// Radial Gradient Brush
+static const char* const qopenglslPositionWithRadialGradientBrushVertexShader = "\n\
+ attribute highp vec2 vertexCoordsArray;\n\
+ attribute highp vec3 pmvMatrix1; \n\
+ attribute highp vec3 pmvMatrix2; \n\
+ attribute highp vec3 pmvMatrix3; \n\
+ uniform mediump vec2 halfViewportSize; \n\
+ uniform highp mat3 brushTransform; \n\
+ uniform highp vec2 fmp; \n\
+ uniform mediump vec3 bradius; \n\
+ varying highp float b; \n\
+ varying highp vec2 A; \n\
+ void setPosition(void) \n\
+ {\n\
+ highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
+ mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
+ mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
+ mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
+ gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
+ A = hTexCoords.xy * invertedHTexCoordsZ; \n\
+ b = bradius.x + 2.0 * dot(A, fmp); \n\
+ }\n";
+
+static const char* const qopenglslAffinePositionWithRadialGradientBrushVertexShader
+ = qopenglslPositionWithRadialGradientBrushVertexShader;
+
+static const char* const qopenglslRadialGradientBrushSrcFragmentShader = "\n\
+ uniform sampler2D brushTexture; \n\
+ uniform highp float fmp2_m_radius2; \n\
+ uniform highp float inverse_2_fmp2_m_radius2; \n\
+ uniform highp float sqrfr; \n\
+ varying highp float b; \n\
+ varying highp vec2 A; \n\
+ uniform mediump vec3 bradius; \n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ highp float c = sqrfr-dot(A, A); \n\
+ highp float det = b*b - 4.0*fmp2_m_radius2*c; \n\
+ lowp vec4 result = vec4(0.0); \n\
+ if (det >= 0.0) { \n\
+ highp float detSqrt = sqrt(det); \n\
+ highp float w = max((-b - detSqrt) * inverse_2_fmp2_m_radius2, (-b + detSqrt) * inverse_2_fmp2_m_radius2); \n\
+ if (bradius.y + w * bradius.z >= 0.0) \n\
+ result = texture2D(brushTexture, vec2(w, 0.5)); \n\
+ } \n\
+ return result; \n\
+ }\n";
+
+
+// Texture Brush
+static const char* const qopenglslPositionWithTextureBrushVertexShader = "\n\
+ attribute highp vec2 vertexCoordsArray; \n\
+ attribute highp vec3 pmvMatrix1; \n\
+ attribute highp vec3 pmvMatrix2; \n\
+ attribute highp vec3 pmvMatrix3; \n\
+ uniform mediump vec2 halfViewportSize; \n\
+ uniform highp vec2 invertedTextureSize; \n\
+ uniform highp mat3 brushTransform; \n\
+ varying highp vec2 brushTextureCoords; \n\
+ void setPosition(void) \n\
+ { \n\
+ highp mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
+ mediump vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
+ mediump vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
+ mediump float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
+ gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
+ brushTextureCoords.xy = (hTexCoords.xy * invertedTextureSize) * gl_Position.w; \n\
+ }\n";
+
+static const char* const qopenglslAffinePositionWithTextureBrushVertexShader
+ = qopenglslPositionWithTextureBrushVertexShader;
+
+static const char* const qopenglslTextureBrushSrcFragmentShader = "\n\
+ varying highp vec2 brushTextureCoords; \n\
+ uniform sampler2D brushTexture; \n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ return texture2D(brushTexture, brushTextureCoords); \n\
+ }\n";
+
+static const char* const qopenglslTextureBrushSrcWithPatternFragmentShader = "\n\
+ varying highp vec2 brushTextureCoords; \n\
+ uniform lowp vec4 patternColor; \n\
+ uniform sampler2D brushTexture; \n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ return patternColor * (1.0 - texture2D(brushTexture, brushTextureCoords).r); \n\
+ }\n";
+
+// Solid Fill Brush
+static const char* const qopenglslSolidBrushSrcFragmentShader = "\n\
+ uniform lowp vec4 fragmentColor; \n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ return fragmentColor; \n\
+ }\n";
+
+static const char* const qopenglslImageSrcFragmentShader = "\n\
+ varying highp vec2 textureCoords; \n\
+ uniform sampler2D imageTexture; \n\
+ lowp vec4 srcPixel() \n\
+ { \n"
+ "return texture2D(imageTexture, textureCoords); \n"
+ "}\n";
+
+static const char* const qopenglslCustomSrcFragmentShader = "\n\
+ varying highp vec2 textureCoords; \n\
+ uniform sampler2D imageTexture; \n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ return customShader(imageTexture, textureCoords); \n\
+ }\n";
+
+static const char* const qopenglslImageSrcWithPatternFragmentShader = "\n\
+ varying highp vec2 textureCoords; \n\
+ uniform lowp vec4 patternColor; \n\
+ uniform sampler2D imageTexture; \n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ return patternColor * (1.0 - texture2D(imageTexture, textureCoords).r); \n\
+ }\n";
+
+static const char* const qopenglslNonPremultipliedImageSrcFragmentShader = "\n\
+ varying highp vec2 textureCoords; \n\
+ uniform sampler2D imageTexture; \n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ lowp vec4 sample = texture2D(imageTexture, textureCoords); \n\
+ sample.rgb = sample.rgb * sample.a; \n\
+ return sample; \n\
+ }\n";
+
+static const char* const qopenglslGrayscaleImageSrcFragmentShader = "\n\
+ varying highp vec2 textureCoords; \n\
+ uniform sampler2D imageTexture; \n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ return texture2D(imageTexture, textureCoords).rrra; \n\
+ }\n";
+
+static const char* const qopenglslAlphaImageSrcFragmentShader = "\n\
+ varying highp vec2 textureCoords; \n\
+ uniform sampler2D imageTexture; \n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ return vec4(0, 0, 0, texture2D(imageTexture, textureCoords).r); \n\
+ }\n";
+
+static const char* const qopenglslShockingPinkSrcFragmentShader = "\n\
+ lowp vec4 srcPixel() \n\
+ { \n\
+ return vec4(0.98, 0.06, 0.75, 1.0); \n\
+ }\n";
+
+static const char* const qopenglslMainFragmentShader_ImageArrays = "\n\
+ varying lowp float opacity; \n\
+ lowp vec4 srcPixel(); \n\
+ void main() \n\
+ { \n\
+ gl_FragColor = srcPixel() * opacity; \n\
+ }\n";
+
+static const char* const qopenglslMainFragmentShader_MO = "\n\
+ uniform lowp float globalOpacity; \n\
+ lowp vec4 srcPixel(); \n\
+ lowp vec4 applyMask(lowp vec4); \n\
+ void main() \n\
+ { \n\
+ gl_FragColor = applyMask(srcPixel()*globalOpacity); \n\
+ }\n";
+
+static const char* const qopenglslMainFragmentShader_M = "\n\
+ lowp vec4 srcPixel(); \n\
+ lowp vec4 applyMask(lowp vec4); \n\
+ void main() \n\
+ { \n\
+ gl_FragColor = applyMask(srcPixel()); \n\
+ }\n";
+
+static const char* const qopenglslMainFragmentShader_O = "\n\
+ uniform lowp float globalOpacity; \n\
+ lowp vec4 srcPixel(); \n\
+ void main() \n\
+ { \n\
+ gl_FragColor = srcPixel()*globalOpacity; \n\
+ }\n";
+
+static const char* const qopenglslMainFragmentShader = "\n\
+ lowp vec4 srcPixel(); \n\
+ void main() \n\
+ { \n\
+ gl_FragColor = srcPixel(); \n\
+ }\n";
+
+static const char* const qopenglslMaskFragmentShader = "\n\
+ varying highp vec2 textureCoords;\n\
+ uniform sampler2D maskTexture;\n\
+ lowp vec4 applyMask(lowp vec4 src) \n\
+ {\n\
+ lowp vec4 mask = texture2D(maskTexture, textureCoords); \n\
+ return src * mask.a; \n\
+ }\n";
+
+// For source over with subpixel antialiasing, the final color is calculated per component as follows
+// (.a is alpha component, .c is red, green or blue component):
+// alpha = src.a * mask.c * opacity
+// dest.c = dest.c * (1 - alpha) + src.c * alpha
+//
+// In the first pass, calculate: dest.c = dest.c * (1 - alpha) with blend funcs: zero, 1 - source color
+// In the second pass, calculate: dest.c = dest.c + src.c * alpha with blend funcs: one, one
+//
+// If source is a solid color (src is constant), only the first pass is needed, with blend funcs: constant, 1 - source color
+
+// For source composition with subpixel antialiasing, the final color is calculated per component as follows:
+// alpha = src.a * mask.c * opacity
+// dest.c = dest.c * (1 - mask.c) + src.c * alpha
+//
+
+static const char* const qopenglslRgbMaskFragmentShaderPass1 = "\n\
+ varying highp vec2 textureCoords;\n\
+ uniform sampler2D maskTexture;\n\
+ lowp vec4 applyMask(lowp vec4 src) \n\
+ { \n\
+ lowp vec4 mask = texture2D(maskTexture, textureCoords); \n\
+ return src.a * mask; \n\
+ }\n";
+
+static const char* const qopenglslRgbMaskFragmentShaderPass2 = "\n\
+ varying highp vec2 textureCoords;\n\
+ uniform sampler2D maskTexture;\n\
+ lowp vec4 applyMask(lowp vec4 src) \n\
+ { \n\
+ lowp vec4 mask = texture2D(maskTexture, textureCoords); \n\
+ return src * mask; \n\
+ }\n";
+
+static const char* const qopenglslMultiplyCompositionModeFragmentShader = "\n\
+ #ifdef GL_KHR_blend_equation_advanced\n\
+ layout(blend_support_multiply) out;\n\
+ #endif\n";
+
+static const char* const qopenglslScreenCompositionModeFragmentShader = "\n\
+ #ifdef GL_KHR_blend_equation_advanced\n\
+ layout(blend_support_screen) out;\n\
+ #endif\n";
+
+static const char* const qopenglslOverlayCompositionModeFragmentShader = "\n\
+ #ifdef GL_KHR_blend_equation_advanced\n\
+ layout(blend_support_overlay) out;\n\
+ #endif\n";
+
+static const char* const qopenglslDarkenCompositionModeFragmentShader = "\n\
+ #ifdef GL_KHR_blend_equation_advanced\n\
+ layout(blend_support_darken) out;\n\
+ #endif\n";
+
+static const char* const qopenglslLightenCompositionModeFragmentShader = "\n\
+ #ifdef GL_KHR_blend_equation_advanced\n\
+ layout(blend_support_lighten) out;\n\
+ #endif\n";
+
+static const char* const qopenglslColorDodgeCompositionModeFragmentShader = "\n\
+ #ifdef GL_KHR_blend_equation_advanced\n\
+ layout(blend_support_colordodge) out;\n\
+ #endif\n";
+
+static const char* const qopenglslColorBurnCompositionModeFragmentShader = "\n\
+ #ifdef GL_KHR_blend_equation_advanced\n\
+ layout(blend_support_colorburn) out;\n\
+ #endif\n";
+
+static const char* const qopenglslHardLightCompositionModeFragmentShader = "\n\
+ #ifdef GL_KHR_blend_equation_advanced\n\
+ layout(blend_support_hardlight) out;\n\
+ #endif\n";
+
+static const char* const qopenglslSoftLightCompositionModeFragmentShader = "\n\
+ #ifdef GL_KHR_blend_equation_advanced\n\
+ layout(blend_support_softlight) out;\n\
+ #endif\n";
+
+static const char* const qopenglslDifferenceCompositionModeFragmentShader = "\n\
+ #ifdef GL_KHR_blend_equation_advanced\n\
+ layout(blend_support_difference) out;\n\
+ #endif\n";
+
+static const char* const qopenglslExclusionCompositionModeFragmentShader = "\n\
+ #ifdef GL_KHR_blend_equation_advanced\n\
+ layout(blend_support_exclusion) out;\n\
+ #endif\n";
+
+/*
+ Left to implement:
+ RgbMaskFragmentShader,
+ RgbMaskWithGammaFragmentShader,
+*/
+
+/*
+ OpenGL 3.2+ Core Profile shaders
+ The following shader snippets are copies of the snippets above
+ but use the modern GLSL 1.5 keywords. New shaders should make
+ a snippet for both profiles and add them appropriately in the
+ shader manager.
+*/
+static const char* const qopenglslMainVertexShader_core =
+ "#version 150 core\n\
+ void setPosition(); \n\
+ void main(void) \n\
+ { \n\
+ setPosition(); \n\
+ }\n";
+
+static const char* const qopenglslMainWithTexCoordsVertexShader_core =
+ "#version 150 core\n\
+ in vec2 textureCoordArray; \n\
+ out vec2 textureCoords; \n\
+ void setPosition(); \n\
+ void main(void) \n\
+ { \n\
+ setPosition(); \n\
+ textureCoords = textureCoordArray; \n\
+ }\n";
+
+static const char* const qopenglslMainWithTexCoordsAndOpacityVertexShader_core =
+ "#version 150 core\n\
+ in vec2 textureCoordArray; \n\
+ in float opacityArray; \n\
+ out vec2 textureCoords; \n\
+ out float opacity; \n\
+ void setPosition(); \n\
+ void main(void) \n\
+ { \n\
+ setPosition(); \n\
+ textureCoords = textureCoordArray; \n\
+ opacity = opacityArray; \n\
+ }\n";
+
+// NOTE: We let GL do the perspective correction so texture lookups in the fragment
+// shader are also perspective corrected.
+static const char* const qopenglslPositionOnlyVertexShader_core = "\n\
+ in vec2 vertexCoordsArray; \n\
+ in vec3 pmvMatrix1; \n\
+ in vec3 pmvMatrix2; \n\
+ in vec3 pmvMatrix3; \n\
+ void setPosition(void) \n\
+ { \n\
+ mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position = vec4(transformedPos.xy, 0.0, transformedPos.z); \n\
+ }\n";
+
+static const char* const qopenglslComplexGeometryPositionOnlyVertexShader_core = "\n\
+ in vec2 vertexCoordsArray; \n\
+ uniform mat3 matrix; \n\
+ void setPosition(void) \n\
+ { \n\
+ gl_Position = vec4(matrix * vec3(vertexCoordsArray, 1), 1);\n\
+ } \n";
+
+static const char* const qopenglslUntransformedPositionVertexShader_core = "\n\
+ in vec4 vertexCoordsArray; \n\
+ void setPosition(void) \n\
+ { \n\
+ gl_Position = vertexCoordsArray; \n\
+ }\n";
+
+// Pattern Brush - This assumes the texture size is 8x8 and thus, the inverted size is 0.125
+static const char* const qopenglslPositionWithPatternBrushVertexShader_core = "\n\
+ in vec2 vertexCoordsArray; \n\
+ in vec3 pmvMatrix1; \n\
+ in vec3 pmvMatrix2; \n\
+ in vec3 pmvMatrix3; \n\
+ out vec2 patternTexCoords; \n\
+ uniform vec2 halfViewportSize; \n\
+ uniform vec2 invertedTextureSize; \n\
+ uniform mat3 brushTransform; \n\
+ void setPosition(void) \n\
+ { \n\
+ mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
+ vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
+ vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1.0); \n\
+ float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
+ gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
+ patternTexCoords.xy = (hTexCoords.xy * 0.125) * invertedHTexCoordsZ; \n\
+ }\n";
+
+static const char* const qopenglslAffinePositionWithPatternBrushVertexShader_core
+ = qopenglslPositionWithPatternBrushVertexShader_core;
+
+static const char* const qopenglslPatternBrushSrcFragmentShader_core = "\n\
+ in vec2 patternTexCoords;\n\
+ uniform sampler2D brushTexture; \n\
+ uniform vec4 patternColor; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ return patternColor * (1.0 - texture(brushTexture, patternTexCoords).r); \n\
+ }\n";
+
+
+// Linear Gradient Brush
+static const char* const qopenglslPositionWithLinearGradientBrushVertexShader_core = "\n\
+ in vec2 vertexCoordsArray; \n\
+ in vec3 pmvMatrix1; \n\
+ in vec3 pmvMatrix2; \n\
+ in vec3 pmvMatrix3; \n\
+ out float index; \n\
+ uniform vec2 halfViewportSize; \n\
+ uniform vec3 linearData; \n\
+ uniform mat3 brushTransform; \n\
+ void setPosition() \n\
+ { \n\
+ mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
+ vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
+ vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
+ float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
+ gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
+ index = (dot(linearData.xy, hTexCoords.xy) * linearData.z) * invertedHTexCoordsZ; \n\
+ }\n";
+
+static const char* const qopenglslAffinePositionWithLinearGradientBrushVertexShader_core
+ = qopenglslPositionWithLinearGradientBrushVertexShader_core;
+
+static const char* const qopenglslLinearGradientBrushSrcFragmentShader_core = "\n\
+ uniform sampler2D brushTexture; \n\
+ in float index; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ vec2 val = vec2(index, 0.5); \n\
+ return texture(brushTexture, val); \n\
+ }\n";
+
+
+// Conical Gradient Brush
+static const char* const qopenglslPositionWithConicalGradientBrushVertexShader_core = "\n\
+ in vec2 vertexCoordsArray; \n\
+ in vec3 pmvMatrix1; \n\
+ in vec3 pmvMatrix2; \n\
+ in vec3 pmvMatrix3; \n\
+ out vec2 A; \n\
+ uniform vec2 halfViewportSize; \n\
+ uniform mat3 brushTransform; \n\
+ void setPosition(void) \n\
+ { \n\
+ mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
+ vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
+ vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
+ float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
+ gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
+ A = hTexCoords.xy * invertedHTexCoordsZ; \n\
+ }\n";
+
+static const char* const qopenglslAffinePositionWithConicalGradientBrushVertexShader_core
+ = qopenglslPositionWithConicalGradientBrushVertexShader_core;
+
+static const char* const qopenglslConicalGradientBrushSrcFragmentShader_core = "\n\
+ #define INVERSE_2PI 0.1591549430918953358 \n\
+ in vec2 A; \n\
+ uniform sampler2D brushTexture; \n\
+ uniform float angle; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ float t; \n\
+ if (abs(A.y) == abs(A.x)) \n\
+ t = (atan(-A.y + 0.002, A.x) + angle) * INVERSE_2PI; \n\
+ else \n\
+ t = (atan(-A.y, A.x) + angle) * INVERSE_2PI; \n\
+ return texture(brushTexture, vec2(t - floor(t), 0.5)); \n\
+ }\n";
+
+
+// Radial Gradient Brush
+static const char* const qopenglslPositionWithRadialGradientBrushVertexShader_core = "\n\
+ in vec2 vertexCoordsArray;\n\
+ in vec3 pmvMatrix1; \n\
+ in vec3 pmvMatrix2; \n\
+ in vec3 pmvMatrix3; \n\
+ out float b; \n\
+ out vec2 A; \n\
+ uniform vec2 halfViewportSize; \n\
+ uniform mat3 brushTransform; \n\
+ uniform vec2 fmp; \n\
+ uniform vec3 bradius; \n\
+ void setPosition(void) \n\
+ {\n\
+ mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
+ vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
+ vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
+ float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
+ gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
+ A = hTexCoords.xy * invertedHTexCoordsZ; \n\
+ b = bradius.x + 2.0 * dot(A, fmp); \n\
+ }\n";
+
+static const char* const qopenglslAffinePositionWithRadialGradientBrushVertexShader_core
+ = qopenglslPositionWithRadialGradientBrushVertexShader_core;
+
+static const char* const qopenglslRadialGradientBrushSrcFragmentShader_core = "\n\
+ in float b; \n\
+ in vec2 A; \n\
+ uniform sampler2D brushTexture; \n\
+ uniform float fmp2_m_radius2; \n\
+ uniform float inverse_2_fmp2_m_radius2; \n\
+ uniform float sqrfr; \n\
+ uniform vec3 bradius; \n\
+ \n\
+ vec4 srcPixel() \n\
+ { \n\
+ float c = sqrfr-dot(A, A); \n\
+ float det = b*b - 4.0*fmp2_m_radius2*c; \n\
+ vec4 result = vec4(0.0); \n\
+ if (det >= 0.0) { \n\
+ float detSqrt = sqrt(det); \n\
+ float w = max((-b - detSqrt) * inverse_2_fmp2_m_radius2, (-b + detSqrt) * inverse_2_fmp2_m_radius2); \n\
+ if (bradius.y + w * bradius.z >= 0.0) \n\
+ result = texture(brushTexture, vec2(w, 0.5)); \n\
+ } \n\
+ return result; \n\
+ }\n";
+
+
+// Texture Brush
+static const char* const qopenglslPositionWithTextureBrushVertexShader_core = "\n\
+ in vec2 vertexCoordsArray; \n\
+ in vec3 pmvMatrix1; \n\
+ in vec3 pmvMatrix2; \n\
+ in vec3 pmvMatrix3; \n\
+ out vec2 brushTextureCoords; \n\
+ uniform vec2 halfViewportSize; \n\
+ uniform vec2 invertedTextureSize; \n\
+ uniform mat3 brushTransform; \n\
+ \n\
+ void setPosition(void) \n\
+ { \n\
+ mat3 pmvMatrix = mat3(pmvMatrix1, pmvMatrix2, pmvMatrix3); \n\
+ vec3 transformedPos = pmvMatrix * vec3(vertexCoordsArray.xy, 1.0); \n\
+ gl_Position.xy = transformedPos.xy / transformedPos.z; \n\
+ vec2 viewportCoords = (gl_Position.xy + 1.0) * halfViewportSize; \n\
+ vec3 hTexCoords = brushTransform * vec3(viewportCoords, 1); \n\
+ float invertedHTexCoordsZ = 1.0 / hTexCoords.z; \n\
+ gl_Position = vec4(gl_Position.xy * invertedHTexCoordsZ, 0.0, invertedHTexCoordsZ); \n\
+ brushTextureCoords.xy = (hTexCoords.xy * invertedTextureSize) * gl_Position.w; \n\
+ }\n";
+
+static const char* const qopenglslAffinePositionWithTextureBrushVertexShader_core
+ = qopenglslPositionWithTextureBrushVertexShader_core;
+
+static const char* const qopenglslTextureBrushSrcFragmentShader_core = "\n\
+ in vec2 brushTextureCoords; \n\
+ uniform sampler2D brushTexture; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ return texture(brushTexture, brushTextureCoords); \n\
+ }\n";
+
+static const char* const qopenglslTextureBrushSrcWithPatternFragmentShader_core = "\n\
+ in vec2 brushTextureCoords; \n\
+ uniform vec4 patternColor; \n\
+ uniform sampler2D brushTexture; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ return patternColor * (1.0 - texture(brushTexture, brushTextureCoords).r); \n\
+ }\n";
+
+// Solid Fill Brush
+static const char* const qopenglslSolidBrushSrcFragmentShader_core = "\n\
+ uniform vec4 fragmentColor; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ return fragmentColor; \n\
+ }\n";
+
+static const char* const qopenglslImageSrcFragmentShader_core = "\n\
+ in vec2 textureCoords; \n\
+ uniform sampler2D imageTexture; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ return texture(imageTexture, textureCoords); \n\
+ }\n";
+
+static const char* const qopenglslCustomSrcFragmentShader_core = "\n\
+ in vec2 textureCoords; \n\
+ uniform sampler2D imageTexture; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ return customShader(imageTexture, textureCoords); \n\
+ }\n";
+
+static const char* const qopenglslImageSrcWithPatternFragmentShader_core = "\n\
+ in vec2 textureCoords; \n\
+ uniform vec4 patternColor; \n\
+ uniform sampler2D imageTexture; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ return patternColor * (1.0 - texture(imageTexture, textureCoords).r); \n\
+ }\n";
+
+static const char* const qopenglslNonPremultipliedImageSrcFragmentShader_core = "\n\
+ in vec2 textureCoords; \n\
+ uniform sampler2D imageTexture; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ vec4 sample = texture(imageTexture, textureCoords); \n\
+ sample.rgb = sample.rgb * sample.a; \n\
+ return sample; \n\
+ }\n";
+
+static const char* const qopenglslGrayscaleImageSrcFragmentShader_core = "\n\
+ in vec2 textureCoords; \n\
+ uniform sampler2D imageTexture; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ return texture(imageTexture, textureCoords).rrra; \n\
+ }\n";
+
+static const char* const qopenglslAlphaImageSrcFragmentShader_core = "\n\
+ in vec2 textureCoords; \n\
+ uniform sampler2D imageTexture; \n\
+ vec4 srcPixel() \n\
+ { \n\
+ return vec4(0, 0, 0, texture(imageTexture, textureCoords).r); \n\
+ }\n";
+
+static const char* const qopenglslShockingPinkSrcFragmentShader_core = "\n\
+ vec4 srcPixel() \n\
+ { \n\
+ return vec4(0.98, 0.06, 0.75, 1.0); \n\
+ }\n";
+
+static const char* const qopenglslMainFragmentShader_ImageArrays_core =
+ "#version 150 core\n\
+ in float opacity; \n\
+ out vec4 fragColor; \n\
+ vec4 srcPixel(); \n\
+ void main() \n\
+ { \n\
+ fragColor = srcPixel() * opacity; \n\
+ }\n";
+
+static const char* const qopenglslMainFragmentShader_MO_core =
+ "#version 150 core\n\
+ out vec4 fragColor; \n\
+ uniform float globalOpacity; \n\
+ vec4 srcPixel(); \n\
+ vec4 applyMask(vec4); \n\
+ void main() \n\
+ { \n\
+ fragColor = applyMask(srcPixel()*globalOpacity); \n\
+ }\n";
+
+static const char* const qopenglslMainFragmentShader_M_core =
+ "#version 150 core\n\
+ out vec4 fragColor; \n\
+ vec4 srcPixel(); \n\
+ vec4 applyMask(vec4); \n\
+ void main() \n\
+ { \n\
+ fragColor = applyMask(srcPixel()); \n\
+ }\n";
+
+static const char* const qopenglslMainFragmentShader_O_core =
+ "#version 150 core\n\
+ out vec4 fragColor; \n\
+ uniform float globalOpacity; \n\
+ vec4 srcPixel(); \n\
+ void main() \n\
+ { \n\
+ fragColor = srcPixel()*globalOpacity; \n\
+ }\n";
+
+static const char* const qopenglslMainFragmentShader_core =
+ "#version 150 core\n\
+ out vec4 fragColor; \n\
+ vec4 srcPixel(); \n\
+ void main() \n\
+ { \n\
+ fragColor = srcPixel(); \n\
+ }\n";
+
+static const char* const qopenglslMaskFragmentShader_core = "\n\
+ in vec2 textureCoords;\n\
+ uniform sampler2D maskTexture;\n\
+ vec4 applyMask(vec4 src) \n\
+ {\n\
+ vec4 mask = texture(maskTexture, textureCoords); \n\
+ return src * mask.r; \n\
+ }\n";
+
+// For source over with subpixel antialiasing, the final color is calculated per component as follows
+// (.a is alpha component, .c is red, green or blue component):
+// alpha = src.a * mask.c * opacity
+// dest.c = dest.c * (1 - alpha) + src.c * alpha
+//
+// In the first pass, calculate: dest.c = dest.c * (1 - alpha) with blend funcs: zero, 1 - source color
+// In the second pass, calculate: dest.c = dest.c + src.c * alpha with blend funcs: one, one
+//
+// If source is a solid color (src is constant), only the first pass is needed, with blend funcs: constant, 1 - source color
+
+// For source composition with subpixel antialiasing, the final color is calculated per component as follows:
+// alpha = src.a * mask.c * opacity
+// dest.c = dest.c * (1 - mask.c) + src.c * alpha
+//
+
+static const char* const qopenglslRgbMaskFragmentShaderPass1_core = "\n\
+ in vec2 textureCoords;\n\
+ uniform sampler2D maskTexture;\n\
+ vec4 applyMask(vec4 src) \n\
+ { \n\
+ vec4 mask = texture(maskTexture, textureCoords); \n\
+ return src.a * mask; \n\
+ }\n";
+
+static const char* const qopenglslRgbMaskFragmentShaderPass2_core = "\n\
+ in vec2 textureCoords;\n\
+ uniform sampler2D maskTexture;\n\
+ vec4 applyMask(vec4 src) \n\
+ { \n\
+ vec4 mask = texture(maskTexture, textureCoords); \n\
+ return src * mask; \n\
+ }\n";
+
+/*
+ Left to implement:
+ RgbMaskFragmentShader_core,
+ RgbMaskWithGammaFragmentShader_core,
+*/
+
+QT_END_NAMESPACE
+
+#endif // GLGC_SHADER_SOURCE_H
diff --git a/src/opengl/qopenglframebufferobject.cpp b/src/opengl/qopenglframebufferobject.cpp
new file mode 100644
index 0000000000..ba18647387
--- /dev/null
+++ b/src/opengl/qopenglframebufferobject.cpp
@@ -0,0 +1,1857 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglframebufferobject.h"
+#include "qopenglframebufferobject_p.h"
+
+#include <qdebug.h>
+#include <private/qopengl_p.h>
+#include <private/qopenglcontext_p.h>
+#include <private/qopenglextensions_p.h>
+#include <private/qfont_p.h>
+
+#include <qwindow.h>
+#include <qimage.h>
+#include <QtCore/qbytearray.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_DEBUG
+#define QT_RESET_GLERROR() \
+{ \
+ while (true) {\
+ GLenum error = QOpenGLContext::currentContext()->functions()->glGetError(); \
+ if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST) \
+ break; \
+ } \
+}
+#define QT_CHECK_GLERROR() \
+{ \
+ GLenum err = QOpenGLContext::currentContext()->functions()->glGetError(); \
+ if (err != GL_NO_ERROR && err != GL_CONTEXT_LOST) { \
+ qDebug("[%s line %d] OpenGL Error: %d", \
+ __FILE__, __LINE__, (int)err); \
+ } \
+}
+#else
+#define QT_RESET_GLERROR() {}
+#define QT_CHECK_GLERROR() {}
+#endif
+
+#ifndef GL_MAX_SAMPLES
+#define GL_MAX_SAMPLES 0x8D57
+#endif
+
+#ifndef GL_RENDERBUFFER_SAMPLES
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#endif
+
+#ifndef GL_DEPTH24_STENCIL8
+#define GL_DEPTH24_STENCIL8 0x88F0
+#endif
+
+#ifndef GL_DEPTH_COMPONENT24
+#define GL_DEPTH_COMPONENT24 0x81A6
+#endif
+
+#ifndef GL_DEPTH_COMPONENT24_OES
+#define GL_DEPTH_COMPONENT24_OES 0x81A6
+#endif
+
+#ifndef GL_READ_FRAMEBUFFER
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#endif
+
+#ifndef GL_DRAW_FRAMEBUFFER
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#endif
+
+#ifndef GL_RGB8
+#define GL_RGB8 0x8051
+#endif
+
+#ifndef GL_RGB10
+#define GL_RGB10 0x8052
+#endif
+
+#ifndef GL_RGB16
+#define GL_RGB16 0x8054
+#endif
+
+#ifndef GL_RGBA8
+#define GL_RGBA8 0x8058
+#endif
+
+#ifndef GL_RGB10_A2
+#define GL_RGB10_A2 0x8059
+#endif
+
+#ifndef GL_RGBA16
+#define GL_RGBA16 0x805B
+#endif
+
+#ifndef GL_BGRA
+#define GL_BGRA 0x80E1
+#endif
+
+#ifndef GL_UNSIGNED_INT_8_8_8_8_REV
+#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
+#endif
+
+#ifndef GL_UNSIGNED_INT_2_10_10_10_REV
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#endif
+
+#ifndef GL_CONTEXT_LOST
+#define GL_CONTEXT_LOST 0x0507
+#endif
+
+#ifndef GL_DEPTH_STENCIL_ATTACHMENT
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#endif
+
+#ifndef GL_DEPTH_STENCIL
+#define GL_DEPTH_STENCIL 0x84F9
+#endif
+
+
+
+/*!
+ \class QOpenGLFramebufferObjectFormat
+ \brief The QOpenGLFramebufferObjectFormat class specifies the format of an OpenGL
+ framebuffer object.
+ \inmodule QtOpenGL
+
+ \since 5.0
+
+ \ingroup painting-3D
+
+ A framebuffer object has several characteristics:
+ \list
+ \li \l{setSamples()}{Number of samples per pixels.}
+ \li \l{setAttachment()}{Depth and/or stencil attachments.}
+ \li \l{setTextureTarget()}{Texture target.}
+ \li \l{setInternalTextureFormat()}{Internal texture format.}
+ \endlist
+
+ Note that the desired attachments or number of samples per pixels might not
+ be supported by the hardware driver. Call QOpenGLFramebufferObject::format()
+ after creating a QOpenGLFramebufferObject to find the exact format that was
+ used to create the frame buffer object.
+
+ \sa QOpenGLFramebufferObject
+*/
+
+/*!
+ \internal
+*/
+void QOpenGLFramebufferObjectFormat::detach()
+{
+ if (d->ref.loadRelaxed() != 1) {
+ QOpenGLFramebufferObjectFormatPrivate *newd
+ = new QOpenGLFramebufferObjectFormatPrivate(d);
+ if (!d->ref.deref())
+ delete d;
+ d = newd;
+ }
+}
+
+/*!
+ Creates a QOpenGLFramebufferObjectFormat object for specifying
+ the format of an OpenGL framebuffer object.
+
+ By default the format specifies a non-multisample framebuffer object with no
+ depth/stencil attachments, texture target \c GL_TEXTURE_2D, and internal format \c GL_RGBA8.
+ On OpenGL/ES systems, the default internal format is \c GL_RGBA.
+
+ \sa samples(), attachment(), internalTextureFormat()
+*/
+
+QOpenGLFramebufferObjectFormat::QOpenGLFramebufferObjectFormat()
+{
+ d = new QOpenGLFramebufferObjectFormatPrivate;
+}
+
+/*!
+ Constructs a copy of \a other.
+*/
+
+QOpenGLFramebufferObjectFormat::QOpenGLFramebufferObjectFormat(const QOpenGLFramebufferObjectFormat &other)
+{
+ d = other.d;
+ d->ref.ref();
+}
+
+/*!
+ Assigns \a other to this object.
+*/
+
+QOpenGLFramebufferObjectFormat &QOpenGLFramebufferObjectFormat::operator=(const QOpenGLFramebufferObjectFormat &other)
+{
+ if (d != other.d) {
+ other.d->ref.ref();
+ if (!d->ref.deref())
+ delete d;
+ d = other.d;
+ }
+ return *this;
+}
+
+/*!
+ Destroys the QOpenGLFramebufferObjectFormat.
+*/
+QOpenGLFramebufferObjectFormat::~QOpenGLFramebufferObjectFormat()
+{
+ if (!d->ref.deref())
+ delete d;
+}
+
+/*!
+ Sets the number of samples per pixel for a multisample framebuffer object
+ to \a samples. The default sample count of 0 represents a regular
+ non-multisample framebuffer object.
+
+ If the desired amount of samples per pixel is not supported by the hardware
+ then the maximum number of samples per pixel will be used. Note that
+ multisample framebuffer objects cannot be bound as textures. Also, the
+ \c{GL_EXT_framebuffer_multisample} extension is required to create a
+ framebuffer with more than one sample per pixel.
+
+ \sa samples()
+*/
+void QOpenGLFramebufferObjectFormat::setSamples(int samples)
+{
+ detach();
+ d->samples = samples;
+}
+
+/*!
+ Returns the number of samples per pixel if a framebuffer object
+ is a multisample framebuffer object. Otherwise, returns 0.
+ The default value is 0.
+
+ \sa setSamples()
+*/
+int QOpenGLFramebufferObjectFormat::samples() const
+{
+ return d->samples;
+}
+
+/*!
+ Enables mipmapping if \a enabled is true; otherwise disables it.
+
+ Mipmapping is disabled by default.
+
+ If mipmapping is enabled, additional memory will be allocated for
+ the mipmap levels. The mipmap levels can be updated by binding the
+ texture and calling glGenerateMipmap(). Mipmapping cannot be enabled
+ for multisampled framebuffer objects.
+
+ \sa mipmap(), QOpenGLFramebufferObject::texture()
+*/
+void QOpenGLFramebufferObjectFormat::setMipmap(bool enabled)
+{
+ detach();
+ d->mipmap = enabled;
+}
+
+/*!
+ Returns \c true if mipmapping is enabled.
+
+ \sa setMipmap()
+*/
+bool QOpenGLFramebufferObjectFormat::mipmap() const
+{
+ return d->mipmap;
+}
+
+/*!
+ Sets the attachment configuration of a framebuffer object to \a attachment.
+
+ \sa attachment()
+*/
+void QOpenGLFramebufferObjectFormat::setAttachment(QOpenGLFramebufferObject::Attachment attachment)
+{
+ detach();
+ d->attachment = attachment;
+}
+
+/*!
+ Returns the configuration of the depth and stencil buffers attached to
+ a framebuffer object. The default is QOpenGLFramebufferObject::NoAttachment.
+
+ \sa setAttachment()
+*/
+QOpenGLFramebufferObject::Attachment QOpenGLFramebufferObjectFormat::attachment() const
+{
+ return d->attachment;
+}
+
+/*!
+ Sets the texture target of the texture attached to a framebuffer object to
+ \a target. Ignored for multisample framebuffer objects.
+
+ \sa textureTarget(), samples()
+*/
+void QOpenGLFramebufferObjectFormat::setTextureTarget(GLenum target)
+{
+ detach();
+ d->target = target;
+}
+
+/*!
+ Returns the texture target of the texture attached to a framebuffer object.
+ Ignored for multisample framebuffer objects. The default is
+ \c GL_TEXTURE_2D.
+
+ \sa setTextureTarget(), samples()
+*/
+GLenum QOpenGLFramebufferObjectFormat::textureTarget() const
+{
+ return d->target;
+}
+
+/*!
+ Sets the internal format of a framebuffer object's texture or
+ multisample framebuffer object's color buffer to
+ \a internalTextureFormat.
+
+ \sa internalTextureFormat()
+*/
+void QOpenGLFramebufferObjectFormat::setInternalTextureFormat(GLenum internalTextureFormat)
+{
+ detach();
+ d->internal_format = internalTextureFormat;
+}
+
+/*!
+ Returns the internal format of a framebuffer object's texture or
+ multisample framebuffer object's color buffer. The default is
+ \c GL_RGBA8 on desktop OpenGL systems, and \c GL_RGBA on
+ OpenGL/ES systems.
+
+ \sa setInternalTextureFormat()
+*/
+GLenum QOpenGLFramebufferObjectFormat::internalTextureFormat() const
+{
+ return d->internal_format;
+}
+
+/*!
+ Returns \c true if all the options of this framebuffer object format
+ are the same as \a other; otherwise returns \c false.
+*/
+bool QOpenGLFramebufferObjectFormat::operator==(const QOpenGLFramebufferObjectFormat& other) const
+{
+ if (d == other.d)
+ return true;
+ else
+ return d->equals(other.d);
+}
+
+/*!
+ Returns \c false if all the options of this framebuffer object format
+ are the same as \a other; otherwise returns \c true.
+*/
+bool QOpenGLFramebufferObjectFormat::operator!=(const QOpenGLFramebufferObjectFormat& other) const
+{
+ return !(*this == other);
+}
+
+bool QOpenGLFramebufferObjectPrivate::checkFramebufferStatus(QOpenGLContext *ctx) const
+{
+ if (!ctx)
+ return false; // Context no longer exists.
+ GLenum status = ctx->functions()->glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ switch(status) {
+ case GL_NO_ERROR:
+ case GL_FRAMEBUFFER_COMPLETE:
+ return true;
+ case GL_FRAMEBUFFER_UNSUPPORTED:
+ qDebug("QOpenGLFramebufferObject: Unsupported framebuffer format.");
+ break;
+ case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
+ qDebug("QOpenGLFramebufferObject: Framebuffer incomplete attachment.");
+ break;
+ case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
+ qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, missing attachment.");
+ break;
+#ifdef GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT
+ case GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT:
+ qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, duplicate attachment.");
+ break;
+#endif
+#ifdef GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS
+ case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
+ qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, attached images must have same dimensions.");
+ break;
+#endif
+#ifdef GL_FRAMEBUFFER_INCOMPLETE_FORMATS
+ case GL_FRAMEBUFFER_INCOMPLETE_FORMATS:
+ qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, attached images must have same format.");
+ break;
+#endif
+#ifdef GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER
+ case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
+ qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, missing draw buffer.");
+ break;
+#endif
+#ifdef GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER
+ case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
+ qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, missing read buffer.");
+ break;
+#endif
+#ifdef GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
+ case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
+ qDebug("QOpenGLFramebufferObject: Framebuffer incomplete, attachments must have same number of samples per pixel.");
+ break;
+#endif
+ default:
+ qDebug() <<"QOpenGLFramebufferObject: An undefined error has occurred: "<< status;
+ break;
+ }
+ return false;
+}
+
+namespace
+{
+ void freeFramebufferFunc(QOpenGLFunctions *funcs, GLuint id)
+ {
+ funcs->glDeleteFramebuffers(1, &id);
+ }
+
+ void freeRenderbufferFunc(QOpenGLFunctions *funcs, GLuint id)
+ {
+ funcs->glDeleteRenderbuffers(1, &id);
+ }
+
+ void freeTextureFunc(QOpenGLFunctions *funcs, GLuint id)
+ {
+ funcs->glDeleteTextures(1, &id);
+ }
+}
+
+void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSize &size,
+ QOpenGLFramebufferObject::Attachment attachment,
+ GLenum texture_target, GLenum internal_format,
+ GLint samples, bool mipmap)
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+
+ funcs.initializeOpenGLFunctions();
+
+ if (!funcs.hasOpenGLFeature(QOpenGLFunctions::Framebuffers))
+ return;
+
+ // Fall back to using a normal non-msaa FBO if we don't have support for MSAA
+ if (!funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample)
+ || !funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit)) {
+ samples = 0;
+ } else if (!ctx->isOpenGLES() || ctx->format().majorVersion() >= 3) {
+ GLint maxSamples;
+ funcs.glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
+ samples = qBound(0, int(samples), int(maxSamples));
+ }
+
+ colorAttachments.append(ColorAttachment(size, internal_format));
+
+ dsSize = size;
+
+ samples = qMax(0, samples);
+ requestedSamples = samples;
+
+ target = texture_target;
+
+ QT_RESET_GLERROR(); // reset error state
+ GLuint fbo = 0;
+
+ funcs.glGenFramebuffers(1, &fbo);
+ funcs.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+
+ QOpenGLContextPrivate::get(ctx)->qgl_current_fbo_invalid = true;
+
+ QT_CHECK_GLERROR();
+
+ format.setTextureTarget(target);
+ format.setInternalTextureFormat(internal_format);
+ format.setMipmap(mipmap);
+
+ if (samples == 0)
+ initTexture(0);
+ else
+ initColorBuffer(0, &samples);
+
+ format.setSamples(int(samples));
+
+ initDepthStencilAttachments(ctx, attachment);
+
+ if (valid)
+ fbo_guard = new QOpenGLSharedResourceGuard(ctx, fbo, freeFramebufferFunc);
+ else
+ funcs.glDeleteFramebuffers(1, &fbo);
+
+ QT_CHECK_GLERROR();
+}
+
+void QOpenGLFramebufferObjectPrivate::initTexture(int idx)
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ GLuint texture = 0;
+
+ funcs.glGenTextures(1, &texture);
+ funcs.glBindTexture(target, texture);
+
+ funcs.glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ funcs.glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ funcs.glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ funcs.glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ ColorAttachment &color(colorAttachments[idx]);
+
+ GLuint pixelType = GL_UNSIGNED_BYTE;
+ if (color.internalFormat == GL_RGB10_A2 || color.internalFormat == GL_RGB10)
+ pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
+ else if (color.internalFormat == GL_RGB16 || color.internalFormat == GL_RGBA16)
+ pixelType = GL_UNSIGNED_SHORT;
+
+ funcs.glTexImage2D(target, 0, color.internalFormat, color.size.width(), color.size.height(), 0,
+ GL_RGBA, pixelType, nullptr);
+ if (format.mipmap()) {
+ int width = color.size.width();
+ int height = color.size.height();
+ int level = 0;
+ while (width > 1 || height > 1) {
+ width = qMax(1, width >> 1);
+ height = qMax(1, height >> 1);
+ ++level;
+ funcs.glTexImage2D(target, level, color.internalFormat, width, height, 0,
+ GL_RGBA, pixelType, nullptr);
+ }
+ }
+ funcs.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + idx,
+ target, texture, 0);
+
+ QT_CHECK_GLERROR();
+ funcs.glBindTexture(target, 0);
+ valid = checkFramebufferStatus(ctx);
+ if (valid) {
+ color.guard = new QOpenGLSharedResourceGuard(ctx, texture, freeTextureFunc);
+ } else {
+ funcs.glDeleteTextures(1, &texture);
+ }
+}
+
+void QOpenGLFramebufferObjectPrivate::initColorBuffer(int idx, GLint *samples)
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ GLuint color_buffer = 0;
+
+ ColorAttachment &color(colorAttachments[idx]);
+
+ GLenum storageFormat = color.internalFormat;
+ // ES requires a sized format. The older desktop extension does not. Correct the format on ES.
+ if (ctx->isOpenGLES()) {
+ if (color.internalFormat == GL_RGBA) {
+ if (funcs.hasOpenGLExtension(QOpenGLExtensions::Sized8Formats))
+ storageFormat = GL_RGBA8;
+ else
+ storageFormat = GL_RGBA4;
+ } else if (color.internalFormat == GL_RGB10) {
+ // GL_RGB10 is not allowed in ES for glRenderbufferStorage.
+ storageFormat = GL_RGB10_A2;
+ }
+ }
+
+ funcs.glGenRenderbuffers(1, &color_buffer);
+ funcs.glBindRenderbuffer(GL_RENDERBUFFER, color_buffer);
+ funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, *samples, storageFormat, color.size.width(), color.size.height());
+ funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + idx,
+ GL_RENDERBUFFER, color_buffer);
+
+ QT_CHECK_GLERROR();
+ valid = checkFramebufferStatus(ctx);
+ if (valid) {
+ // Query the actual number of samples. This can be greater than the requested
+ // value since the typically supported values are 0, 4, 8, ..., and the
+ // requests are mapped to the next supported value.
+ funcs.glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, samples);
+ color.guard = new QOpenGLSharedResourceGuard(ctx, color_buffer, freeRenderbufferFunc);
+ } else {
+ funcs.glDeleteRenderbuffers(1, &color_buffer);
+ }
+}
+
+void QOpenGLFramebufferObjectPrivate::initDepthStencilAttachments(QOpenGLContext *ctx,
+ QOpenGLFramebufferObject::Attachment attachment)
+{
+ // Use the same sample count for all attachments. format.samples() already contains
+ // the actual number of samples for the color attachment and is not suitable. Use
+ // requestedSamples instead.
+ const int samples = requestedSamples;
+
+ // free existing attachments
+ if (depth_buffer_guard) {
+#ifdef Q_OS_WASM
+ funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
+#else
+ funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
+#endif
+ depth_buffer_guard->free();
+ }
+ if (stencil_buffer_guard) {
+ funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
+ if (stencil_buffer_guard != depth_buffer_guard)
+ stencil_buffer_guard->free();
+ }
+
+ depth_buffer_guard = nullptr;
+ stencil_buffer_guard = nullptr;
+
+ GLuint depth_buffer = 0;
+ GLuint stencil_buffer = 0;
+
+ // In practice, a combined depth-stencil buffer is supported by all desktop platforms, while a
+ // separate stencil buffer is not. On embedded devices however, a combined depth-stencil buffer
+ // might not be supported while separate buffers are, according to QTBUG-12861.
+#ifdef Q_OS_WASM
+ // WebGL doesn't allow separately attach buffers to
+ // STENCIL_ATTACHMENT and DEPTH_ATTACHMENT
+ // QTBUG-69913
+ if (attachment == QOpenGLFramebufferObject::CombinedDepthStencil) {
+ funcs.glGenRenderbuffers(1, &depth_buffer);
+ funcs.glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
+ Q_ASSERT(funcs.glIsRenderbuffer(depth_buffer));
+
+ if (samples != 0 ) {
+ funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
+ GL_DEPTH24_STENCIL8, dsSize.width(), dsSize.height());
+ } else {
+ funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL,
+ dsSize.width(), dsSize.height());
+ }
+
+ funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
+ GL_RENDERBUFFER, depth_buffer);
+
+ valid = checkFramebufferStatus(ctx);
+ if (!valid) {
+ funcs.glDeleteRenderbuffers(1, &depth_buffer);
+ depth_buffer = 0;
+ }
+ }
+#else
+ if (attachment == QOpenGLFramebufferObject::CombinedDepthStencil
+ && funcs.hasOpenGLExtension(QOpenGLExtensions::PackedDepthStencil))
+ {
+ // depth and stencil buffer needs another extension
+ funcs.glGenRenderbuffers(1, &depth_buffer);
+ funcs.glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
+ Q_ASSERT(funcs.glIsRenderbuffer(depth_buffer));
+ if (samples != 0 && funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample))
+ funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
+ GL_DEPTH24_STENCIL8, dsSize.width(), dsSize.height());
+ else
+ funcs.glRenderbufferStorage(GL_RENDERBUFFER,
+ GL_DEPTH24_STENCIL8, dsSize.width(), dsSize.height());
+
+ stencil_buffer = depth_buffer;
+ funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+ GL_RENDERBUFFER, depth_buffer);
+ funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
+ GL_RENDERBUFFER, stencil_buffer);
+
+ valid = checkFramebufferStatus(ctx);
+ if (!valid) {
+ funcs.glDeleteRenderbuffers(1, &depth_buffer);
+ stencil_buffer = depth_buffer = 0;
+ }
+ }
+
+ if (depth_buffer == 0 && (attachment == QOpenGLFramebufferObject::CombinedDepthStencil
+ || (attachment == QOpenGLFramebufferObject::Depth)))
+ {
+ funcs.glGenRenderbuffers(1, &depth_buffer);
+ funcs.glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
+ Q_ASSERT(funcs.glIsRenderbuffer(depth_buffer));
+ if (samples != 0 && funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample)) {
+ if (ctx->isOpenGLES()) {
+ if (funcs.hasOpenGLExtension(QOpenGLExtensions::Depth24))
+ funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
+ GL_DEPTH_COMPONENT24, dsSize.width(), dsSize.height());
+ else
+ funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
+ GL_DEPTH_COMPONENT16, dsSize.width(), dsSize.height());
+ } else {
+ funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
+ GL_DEPTH_COMPONENT, dsSize.width(), dsSize.height());
+ }
+ } else {
+ if (ctx->isOpenGLES()) {
+ if (funcs.hasOpenGLExtension(QOpenGLExtensions::Depth24)) {
+ funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24,
+ dsSize.width(), dsSize.height());
+ } else {
+ funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
+ dsSize.width(), dsSize.height());
+ }
+ } else {
+ funcs.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, dsSize.width(), dsSize.height());
+ }
+ }
+ funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+ GL_RENDERBUFFER, depth_buffer);
+ valid = checkFramebufferStatus(ctx);
+ if (!valid) {
+ funcs.glDeleteRenderbuffers(1, &depth_buffer);
+ depth_buffer = 0;
+ }
+ }
+
+ if (stencil_buffer == 0 && (attachment == QOpenGLFramebufferObject::CombinedDepthStencil)) {
+ funcs.glGenRenderbuffers(1, &stencil_buffer);
+ funcs.glBindRenderbuffer(GL_RENDERBUFFER, stencil_buffer);
+ Q_ASSERT(funcs.glIsRenderbuffer(stencil_buffer));
+
+#if QT_CONFIG(opengles2)
+ GLenum storage = GL_STENCIL_INDEX8;
+#else
+ GLenum storage = ctx->isOpenGLES() ? GL_STENCIL_INDEX8 : GL_STENCIL_INDEX;
+#endif
+
+ if (samples != 0 && funcs.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample))
+ funcs.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, storage, dsSize.width(), dsSize.height());
+ else
+ funcs.glRenderbufferStorage(GL_RENDERBUFFER, storage, dsSize.width(), dsSize.height());
+
+ funcs.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
+ GL_RENDERBUFFER, stencil_buffer);
+ valid = checkFramebufferStatus(ctx);
+ if (!valid) {
+ funcs.glDeleteRenderbuffers(1, &stencil_buffer);
+ stencil_buffer = 0;
+ }
+ }
+#endif //Q_OS_WASM
+
+ // The FBO might have become valid after removing the depth or stencil buffer.
+ valid = checkFramebufferStatus(ctx);
+
+#ifdef Q_OS_WASM
+ if (depth_buffer) {
+#else
+ if (depth_buffer && stencil_buffer) {
+#endif
+ fbo_attachment = QOpenGLFramebufferObject::CombinedDepthStencil;
+ } else if (depth_buffer) {
+ fbo_attachment = QOpenGLFramebufferObject::Depth;
+ } else {
+ fbo_attachment = QOpenGLFramebufferObject::NoAttachment;
+ }
+
+ if (valid) {
+ if (depth_buffer)
+ depth_buffer_guard = new QOpenGLSharedResourceGuard(ctx, depth_buffer, freeRenderbufferFunc);
+ if (stencil_buffer) {
+ if (stencil_buffer == depth_buffer)
+ stencil_buffer_guard = depth_buffer_guard;
+ else
+ stencil_buffer_guard = new QOpenGLSharedResourceGuard(ctx, stencil_buffer, freeRenderbufferFunc);
+ }
+ } else {
+ if (depth_buffer)
+ funcs.glDeleteRenderbuffers(1, &depth_buffer);
+ if (stencil_buffer && depth_buffer != stencil_buffer)
+ funcs.glDeleteRenderbuffers(1, &stencil_buffer);
+ }
+ QT_CHECK_GLERROR();
+
+ format.setAttachment(fbo_attachment);
+}
+
+/*!
+ \class QOpenGLFramebufferObject
+ \brief The QOpenGLFramebufferObject class encapsulates an OpenGL framebuffer object.
+ \since 5.0
+ \inmodule QtOpenGL
+
+ \ingroup painting-3D
+
+ The QOpenGLFramebufferObject class encapsulates an OpenGL framebuffer
+ object, defined by the \c{GL_EXT_framebuffer_object} extension. It provides
+ a rendering surface that can be painted on with a QPainter with the help of
+ QOpenGLPaintDevice, or rendered to using native OpenGL calls. This surface
+ can be bound and used as a regular texture in your own OpenGL drawing code.
+ By default, the QOpenGLFramebufferObject class generates a 2D OpenGL
+ texture (using the \c{GL_TEXTURE_2D} target), which is used as the internal
+ rendering target.
+
+ \b{It is important to have a current OpenGL context when creating a
+ QOpenGLFramebufferObject, otherwise initialization will fail.}
+
+ Create the QOpenGLFrameBufferObject instance with the CombinedDepthStencil
+ attachment if you want QPainter to render correctly. Note that you need to
+ create a QOpenGLFramebufferObject with more than one sample per pixel for
+ primitives to be antialiased when drawing using a QPainter. To create a
+ multisample framebuffer object you should use one of the constructors that
+ take a QOpenGLFramebufferObjectFormat parameter, and set the
+ QOpenGLFramebufferObjectFormat::samples() property to a non-zero value.
+
+ For multisample framebuffer objects a color render buffer is created,
+ otherwise a texture with the specified texture target is created.
+ The color render buffer or texture will have the specified internal
+ format, and will be bound to the \c GL_COLOR_ATTACHMENT0
+ attachment in the framebuffer object.
+
+ Multiple render targets are also supported, in case the OpenGL
+ implementation supports this. Here there will be multiple textures (or, in
+ case of multisampling, renderbuffers) present and each of them will get
+ attached to \c GL_COLOR_ATTACHMENT0, \c 1, \c 2, ...
+
+ If you want to use a framebuffer object with multisampling enabled
+ as a texture, you first need to copy from it to a regular framebuffer
+ object using QOpenGLContext::blitFramebuffer().
+
+ It is possible to draw into a QOpenGLFramebufferObject using QPainter and
+ QOpenGLPaintDevice in a separate thread.
+*/
+
+
+/*!
+ \enum QOpenGLFramebufferObject::Attachment
+
+ This enum type is used to configure the depth and stencil buffers
+ attached to the framebuffer object when it is created.
+
+ \value NoAttachment No attachment is added to the framebuffer object. Note that the
+ OpenGL depth and stencil tests won't work when rendering to a
+ framebuffer object without any depth or stencil buffers.
+ This is the default value.
+
+ \value CombinedDepthStencil If the \c GL_EXT_packed_depth_stencil extension is present,
+ a combined depth and stencil buffer is attached.
+ If the extension is not present, only a depth buffer is attached.
+
+ \value Depth A depth buffer is attached to the framebuffer object.
+
+ \sa attachment()
+*/
+
+static inline GLenum effectiveInternalFormat(GLenum internalFormat)
+{
+ if (!internalFormat)
+#if QT_CONFIG(opengles2)
+ internalFormat = GL_RGBA;
+#else
+ internalFormat = QOpenGLContext::currentContext()->isOpenGLES() ? GL_RGBA : GL_RGBA8;
+#endif
+ return internalFormat;
+}
+
+/*!
+
+ Constructs an OpenGL framebuffer object and binds a 2D OpenGL texture
+ to the buffer of the size \a size. The texture is bound to the
+ \c GL_COLOR_ATTACHMENT0 target in the framebuffer object.
+
+ The \a target parameter is used to specify the OpenGL texture
+ target. The default target is \c GL_TEXTURE_2D. Keep in mind that
+ \c GL_TEXTURE_2D textures must have a power of 2 width and height
+ (e.g. 256x512), unless you are using OpenGL 2.0 or higher.
+
+ By default, no depth and stencil buffers are attached. This behavior
+ can be toggled using one of the overloaded constructors.
+
+ The default internal texture format is \c GL_RGBA8 for desktop
+ OpenGL, and \c GL_RGBA for OpenGL/ES.
+
+ It is important that you have a current OpenGL context set when
+ creating the QOpenGLFramebufferObject, otherwise the initialization
+ will fail.
+
+ \sa size(), texture(), attachment()
+*/
+
+QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, GLenum target)
+ : d_ptr(new QOpenGLFramebufferObjectPrivate)
+{
+ Q_D(QOpenGLFramebufferObject);
+ d->init(this, size, NoAttachment, target, effectiveInternalFormat(0));
+}
+
+/*!
+
+ Constructs an OpenGL framebuffer object and binds a 2D OpenGL texture
+ to the buffer of the given \a width and \a height.
+
+ \sa size(), texture()
+*/
+QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, GLenum target)
+ : QOpenGLFramebufferObject(QSize(width, height), target)
+{
+}
+
+/*!
+
+ Constructs an OpenGL framebuffer object of the given \a size based on the
+ supplied \a format.
+*/
+
+QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, const QOpenGLFramebufferObjectFormat &format)
+ : d_ptr(new QOpenGLFramebufferObjectPrivate)
+{
+ Q_D(QOpenGLFramebufferObject);
+ d->init(this, size, format.attachment(), format.textureTarget(), format.internalTextureFormat(),
+ format.samples(), format.mipmap());
+}
+
+/*!
+
+ Constructs an OpenGL framebuffer object of the given \a width and \a height
+ based on the supplied \a format.
+*/
+
+QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, const QOpenGLFramebufferObjectFormat &format)
+ : QOpenGLFramebufferObject(QSize(width, height), format)
+{
+}
+
+/*!
+
+ Constructs an OpenGL framebuffer object and binds a texture to the
+ buffer of the given \a width and \a height.
+
+ The \a attachment parameter describes the depth/stencil buffer
+ configuration, \a target the texture target and \a internalFormat
+ the internal texture format. The default texture target is \c
+ GL_TEXTURE_2D, while the default internal format is \c GL_RGBA8
+ for desktop OpenGL and \c GL_RGBA for OpenGL/ES.
+
+ \sa size(), texture(), attachment()
+*/
+QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, Attachment attachment,
+ GLenum target, GLenum internalFormat)
+ : d_ptr(new QOpenGLFramebufferObjectPrivate)
+{
+ Q_D(QOpenGLFramebufferObject);
+ d->init(this, QSize(width, height), attachment, target, effectiveInternalFormat(internalFormat));
+}
+
+/*!
+
+ Constructs an OpenGL framebuffer object and binds a texture to the
+ buffer of the given \a size.
+
+ The \a attachment parameter describes the depth/stencil buffer
+ configuration, \a target the texture target and \a internalFormat
+ the internal texture format. The default texture target is \c
+ GL_TEXTURE_2D, while the default internal format is \c GL_RGBA8
+ for desktop OpenGL and \c GL_RGBA for OpenGL/ES.
+
+ \sa size(), texture(), attachment()
+*/
+QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, Attachment attachment,
+ GLenum target, GLenum internalFormat)
+ : d_ptr(new QOpenGLFramebufferObjectPrivate)
+{
+ Q_D(QOpenGLFramebufferObject);
+ d->init(this, size, attachment, target, effectiveInternalFormat(internalFormat));
+}
+
+/*!
+
+ Destroys the framebuffer object and frees any allocated resources.
+*/
+QOpenGLFramebufferObject::~QOpenGLFramebufferObject()
+{
+ Q_D(QOpenGLFramebufferObject);
+ if (isBound())
+ release();
+
+ for (const auto &color : qAsConst(d->colorAttachments)) {
+ if (color.guard)
+ color.guard->free();
+ }
+ d->colorAttachments.clear();
+
+ if (d->depth_buffer_guard)
+ d->depth_buffer_guard->free();
+ if (d->stencil_buffer_guard && d->stencil_buffer_guard != d->depth_buffer_guard)
+ d->stencil_buffer_guard->free();
+ if (d->fbo_guard)
+ d->fbo_guard->free();
+
+ QOpenGLContextPrivate *contextPrv = QOpenGLContextPrivate::get(QOpenGLContext::currentContext());
+ if (contextPrv && contextPrv->qgl_current_fbo == this) {
+ contextPrv->qgl_current_fbo_invalid = true;
+ contextPrv->qgl_current_fbo = nullptr;
+ }
+}
+
+/*!
+ Creates and attaches an additional texture or renderbuffer of \a size width
+ and height.
+
+ There is always an attachment at GL_COLOR_ATTACHMENT0. Call this function
+ to set up additional attachments at GL_COLOR_ATTACHMENT1,
+ GL_COLOR_ATTACHMENT2, ...
+
+ When \a internalFormat is not \c 0, it specifies the internal format of the
+ texture or renderbuffer. Otherwise a default of GL_RGBA or GL_RGBA8 is
+ used.
+
+ \note This is only functional when multiple render targets are supported by
+ the OpenGL implementation. When that is not the case, the function will not
+ add any additional color attachments. Call
+ QOpenGLFunctions::hasOpenGLFeature() with
+ QOpenGLFunctions::MultipleRenderTargets at runtime to check if MRT is
+ supported.
+
+ \note The internal format of the color attachments may differ but there may
+ be limitations on the supported combinations, depending on the drivers.
+
+ \note The size of the color attachments may differ but rendering is limited
+ to the area that fits all the attachments, according to the OpenGL
+ specification. Some drivers may not be fully conformant in this respect,
+ however.
+
+ \since 5.6
+ */
+void QOpenGLFramebufferObject::addColorAttachment(const QSize &size, GLenum internalFormat)
+{
+ Q_D(QOpenGLFramebufferObject);
+
+ if (!QOpenGLContext::currentContext()->functions()->hasOpenGLFeature(QOpenGLFunctions::MultipleRenderTargets)) {
+ qWarning("Multiple render targets not supported, ignoring extra color attachment request");
+ return;
+ }
+
+ QOpenGLFramebufferObjectPrivate::ColorAttachment color(size, effectiveInternalFormat(internalFormat));
+ d->colorAttachments.append(color);
+ const int idx = d->colorAttachments.count() - 1;
+
+ if (d->requestedSamples == 0) {
+ d->initTexture(idx);
+ } else {
+ GLint samples = d->requestedSamples;
+ d->initColorBuffer(idx, &samples);
+ }
+}
+
+/*! \overload
+
+ Creates and attaches an additional texture or renderbuffer of size \a width and \a height.
+
+ When \a internalFormat is not \c 0, it specifies the internal format of the texture or
+ renderbuffer. Otherwise a default of GL_RGBA or GL_RGBA8 is used.
+
+ \since 5.6
+ */
+void QOpenGLFramebufferObject::addColorAttachment(int width, int height, GLenum internalFormat)
+{
+ addColorAttachment(QSize(width, height), internalFormat);
+}
+
+/*!
+ \fn bool QOpenGLFramebufferObject::isValid() const
+
+ Returns \c true if the framebuffer object is valid.
+
+ The framebuffer can become invalid if the initialization process
+ fails, the user attaches an invalid buffer to the framebuffer
+ object, or a non-power of two width/height is specified as the
+ texture size if the texture target is \c{GL_TEXTURE_2D}.
+ The non-power of two limitation does not apply if the OpenGL version
+ is 2.0 or higher, or if the GL_ARB_texture_non_power_of_two extension
+ is present.
+
+ The framebuffer can also become invalid if the QOpenGLContext that
+ the framebuffer was created within is destroyed and there are
+ no other shared contexts that can take over ownership of the
+ framebuffer.
+*/
+bool QOpenGLFramebufferObject::isValid() const
+{
+ Q_D(const QOpenGLFramebufferObject);
+ return d->valid && d->fbo_guard && d->fbo_guard->id();
+}
+
+/*!
+ \fn bool QOpenGLFramebufferObject::bind()
+
+ Switches rendering from the default, windowing system provided
+ framebuffer to this framebuffer object.
+ Returns \c true upon success, false otherwise.
+
+ \note If takeTexture() was called, a new texture is created and associated
+ with the framebuffer object. This is potentially expensive and changes the
+ context state (the currently bound texture).
+
+ \sa release()
+*/
+bool QOpenGLFramebufferObject::bind()
+{
+ if (!isValid())
+ return false;
+ Q_D(QOpenGLFramebufferObject);
+ QOpenGLContext *current = QOpenGLContext::currentContext();
+ if (!current)
+ return false;
+#ifdef QT_DEBUG
+ if (current->shareGroup() != d->fbo_guard->group())
+ qWarning("QOpenGLFramebufferObject::bind() called from incompatible context");
+#endif
+
+ d->funcs.glBindFramebuffer(GL_FRAMEBUFFER, d->fbo());
+
+ QOpenGLContextPrivate::get(current)->qgl_current_fbo_invalid = true;
+ QOpenGLContextPrivate::get(current)->qgl_current_fbo = this;
+
+ if (d->format.samples() == 0) {
+ // Create new textures to replace the ones stolen via takeTexture().
+ for (int i = 0; i < d->colorAttachments.count(); ++i) {
+ if (!d->colorAttachments.at(i).guard)
+ d->initTexture(i);
+ }
+ }
+
+ return d->valid;
+}
+
+/*!
+ \fn bool QOpenGLFramebufferObject::release()
+
+ Switches rendering back to the default, windowing system provided
+ framebuffer.
+ Returns \c true upon success, false otherwise.
+
+ \sa bind()
+*/
+bool QOpenGLFramebufferObject::release()
+{
+ if (!isValid())
+ return false;
+
+ QOpenGLContext *current = QOpenGLContext::currentContext();
+ if (!current)
+ return false;
+
+ Q_D(QOpenGLFramebufferObject);
+#ifdef QT_DEBUG
+ if (current->shareGroup() != d->fbo_guard->group())
+ qWarning("QOpenGLFramebufferObject::release() called from incompatible context");
+#endif
+
+ if (current) {
+ d->funcs.glBindFramebuffer(GL_FRAMEBUFFER, current->defaultFramebufferObject());
+
+ QOpenGLContextPrivate *contextPrv = QOpenGLContextPrivate::get(current);
+ contextPrv->qgl_current_fbo_invalid = true;
+ contextPrv->qgl_current_fbo = nullptr;
+ }
+
+ return true;
+}
+
+/*!
+ \fn GLuint QOpenGLFramebufferObject::texture() const
+
+ Returns the texture id for the texture attached as the default
+ rendering target in this framebuffer object. This texture id can
+ be bound as a normal texture in your own OpenGL code.
+
+ If a multisample framebuffer object is used then the value returned
+ from this function will be invalid.
+
+ When multiple textures are attached, the return value is the ID of
+ the first one.
+
+ \sa takeTexture(), textures()
+*/
+GLuint QOpenGLFramebufferObject::texture() const
+{
+ Q_D(const QOpenGLFramebufferObject);
+ return d->colorAttachments[0].guard ? d->colorAttachments[0].guard->id() : 0;
+}
+
+/*!
+ Returns the texture id for all attached textures.
+
+ If a multisample framebuffer object is used, then an empty vector is returned.
+
+ \since 5.6
+
+ \sa takeTexture(), texture()
+*/
+QVector<GLuint> QOpenGLFramebufferObject::textures() const
+{
+ Q_D(const QOpenGLFramebufferObject);
+ QVector<GLuint> ids;
+ if (d->format.samples() != 0)
+ return ids;
+ ids.reserve(d->colorAttachments.count());
+ for (const auto &color : d->colorAttachments)
+ ids.append(color.guard ? color.guard->id() : 0);
+ return ids;
+}
+
+/*!
+ \fn GLuint QOpenGLFramebufferObject::takeTexture()
+
+ Returns the texture id for the texture attached to this framebuffer
+ object. The ownership of the texture is transferred to the caller.
+
+ If the framebuffer object is currently bound, an implicit release()
+ will be done. During the next call to bind() a new texture will be
+ created.
+
+ If a multisample framebuffer object is used, then there is no
+ texture and the return value from this function will be invalid.
+ Similarly, incomplete framebuffer objects will also return 0.
+
+ \since 5.3
+
+ \sa texture(), bind(), release()
+ */
+GLuint QOpenGLFramebufferObject::takeTexture()
+{
+ return takeTexture(0);
+}
+
+/*! \overload
+
+ Returns the texture id for the texture attached to the color attachment of
+ index \a colorAttachmentIndex of this framebuffer object. The ownership of
+ the texture is transferred to the caller.
+
+ When \a colorAttachmentIndex is \c 0, the behavior is identical to the
+ parameter-less variant of this function.
+
+ If the framebuffer object is currently bound, an implicit release()
+ will be done. During the next call to bind() a new texture will be
+ created.
+
+ If a multisample framebuffer object is used, then there is no
+ texture and the return value from this function will be invalid.
+ Similarly, incomplete framebuffer objects will also return 0.
+
+ \since 5.6
+ */
+GLuint QOpenGLFramebufferObject::takeTexture(int colorAttachmentIndex)
+{
+ Q_D(QOpenGLFramebufferObject);
+ GLuint id = 0;
+ if (isValid() && d->format.samples() == 0 && d->colorAttachments.count() > colorAttachmentIndex) {
+ QOpenGLContext *current = QOpenGLContext::currentContext();
+ if (current && current->shareGroup() == d->fbo_guard->group() && isBound())
+ release();
+ auto &guard = d->colorAttachments[colorAttachmentIndex].guard;
+ id = guard ? guard->id() : 0;
+ // Do not call free() on texture_guard, just null it out.
+ // This way the texture will not be deleted when the guard is destroyed.
+ guard = nullptr;
+ }
+ return id;
+}
+
+/*!
+ \return the size of the color and depth/stencil attachments attached to
+ this framebuffer object.
+*/
+QSize QOpenGLFramebufferObject::size() const
+{
+ Q_D(const QOpenGLFramebufferObject);
+ return d->dsSize;
+}
+
+/*!
+ \return the sizes of all color attachments attached to this framebuffer
+ object.
+
+ \since 5.6
+*/
+QVector<QSize> QOpenGLFramebufferObject::sizes() const
+{
+ Q_D(const QOpenGLFramebufferObject);
+ QVector<QSize> sz;
+ sz.reserve(d->colorAttachments.size());
+ for (const auto &color : d->colorAttachments)
+ sz.append(color.size);
+ return sz;
+}
+
+/*!
+ \fn int QOpenGLFramebufferObject::width() const
+
+ Returns the width of the framebuffer object attachments.
+*/
+
+/*!
+ \fn int QOpenGLFramebufferObject::height() const
+
+ Returns the height of the framebuffer object attachments.
+*/
+
+/*!
+ Returns the format of this framebuffer object.
+*/
+QOpenGLFramebufferObjectFormat QOpenGLFramebufferObject::format() const
+{
+ Q_D(const QOpenGLFramebufferObject);
+ return d->format;
+}
+
+static inline QImage qt_gl_read_framebuffer_rgba8(const QSize &size, bool include_alpha, QOpenGLContext *context)
+{
+ QOpenGLFunctions *funcs = context->functions();
+ const int w = size.width();
+ const int h = size.height();
+ bool isOpenGL12orBetter = !context->isOpenGLES() && (context->format().majorVersion() >= 2 || context->format().minorVersion() >= 2);
+ if (isOpenGL12orBetter) {
+ QImage img(size, include_alpha ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32);
+ funcs->glReadPixels(0, 0, w, h, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, img.bits());
+ return img;
+ }
+
+ // For OpenGL ES stick with the byte ordered format / RGBA readback format
+ // since that is the only spec mandated way. (also, skip the
+ // GL_IMPLEMENTATION_COLOR_READ_FORMAT mess since there is nothing saying a
+ // BGRA capable impl would return BGRA from there)
+
+ QImage rgbaImage(size, include_alpha ? QImage::Format_RGBA8888_Premultiplied : QImage::Format_RGBX8888);
+ funcs->glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, rgbaImage.bits());
+ return rgbaImage;
+}
+
+static inline QImage qt_gl_read_framebuffer_rgb10a2(const QSize &size, bool include_alpha, QOpenGLContext *context)
+{
+ // We assume OpenGL 1.2+ or ES 3.0+ here.
+ QImage img(size, include_alpha ? QImage::Format_A2BGR30_Premultiplied : QImage::Format_BGR30);
+ context->functions()->glReadPixels(0, 0, size.width(), size.height(), GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, img.bits());
+ return img;
+}
+
+static inline QImage qt_gl_read_framebuffer_rgba16(const QSize &size, bool include_alpha, QOpenGLContext *context)
+{
+ // We assume OpenGL 1.2+ or ES 3.0+ here.
+ QImage img(size, include_alpha ? QImage::Format_RGBA64_Premultiplied : QImage::Format_RGBX64);
+ context->functions()->glReadPixels(0, 0, size.width(), size.height(), GL_RGBA, GL_UNSIGNED_SHORT, img.bits());
+ return img;
+}
+
+static QImage qt_gl_read_framebuffer(const QSize &size, GLenum internal_format, bool include_alpha, bool flip)
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ QOpenGLFunctions *funcs = ctx->functions();
+ while (true) {
+ GLenum error = funcs->glGetError();
+ if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST)
+ break;
+ }
+ switch (internal_format) {
+ case GL_RGB:
+ case GL_RGB8:
+ return qt_gl_read_framebuffer_rgba8(size, false, ctx).mirrored(false, flip);
+ case GL_RGB10:
+ return qt_gl_read_framebuffer_rgb10a2(size, false, ctx).mirrored(false, flip);
+ case GL_RGB10_A2:
+ return qt_gl_read_framebuffer_rgb10a2(size, include_alpha, ctx).mirrored(false, flip);
+ case GL_RGB16:
+ return qt_gl_read_framebuffer_rgba16(size, false, ctx).mirrored(false, flip);
+ case GL_RGBA16:
+ return qt_gl_read_framebuffer_rgba16(size, include_alpha, ctx).mirrored(false, flip);
+ case GL_RGBA:
+ case GL_RGBA8:
+ default:
+ return qt_gl_read_framebuffer_rgba8(size, include_alpha, ctx).mirrored(false, flip);
+ }
+
+ Q_UNREACHABLE();
+ return QImage();
+}
+
+Q_OPENGL_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha)
+{
+ return qt_gl_read_framebuffer(size, alpha_format ? GL_RGBA : GL_RGB, include_alpha, true);
+}
+
+/*!
+ \fn QImage QOpenGLFramebufferObject::toImage(bool flipped) const
+
+ Returns the contents of this framebuffer object as a QImage.
+
+ If \a flipped is true the image is flipped from OpenGL coordinates to raster coordinates.
+ If used together with QOpenGLPaintDevice, \a flipped should be the opposite of the value
+ of QOpenGLPaintDevice::paintFlipped().
+
+ The returned image has a format of premultiplied ARGB32 or RGB32. The latter
+ is used only when internalTextureFormat() is set to \c GL_RGB. Since Qt 5.2
+ the function will fall back to premultiplied RGBA8888 or RGBx8888 when
+ reading to (A)RGB32 is not supported, and this includes OpenGL ES. Since Qt
+ 5.4 an A2BGR30 image is returned if the internal format is RGB10_A2, and since
+ Qt 5.12 a RGBA64 image is return if the internal format is RGBA16.
+
+ If the rendering in the framebuffer was not done with premultiplied alpha in mind,
+ create a wrapper QImage with a non-premultiplied format. This is necessary before
+ performing operations like QImage::save() because otherwise the image data would get
+ unpremultiplied, even though it was not premultiplied in the first place. To create
+ such a wrapper without performing a copy of the pixel data, do the following:
+
+ \code
+ QImage fboImage(fbo.toImage());
+ QImage image(fboImage.constBits(), fboImage.width(), fboImage.height(), QImage::Format_ARGB32);
+ \endcode
+
+ For multisampled framebuffer objects the samples are resolved using the
+ \c{GL_EXT_framebuffer_blit} extension. If the extension is not available, the contents
+ of the returned image is undefined.
+
+ For singlesampled framebuffers the contents is retrieved via \c glReadPixels. This is
+ a potentially expensive and inefficient operation. Therefore it is recommended that
+ this function is used as seldom as possible.
+
+ \sa QOpenGLPaintDevice::paintFlipped()
+*/
+
+QImage QOpenGLFramebufferObject::toImage(bool flipped) const
+{
+ return toImage(flipped, 0);
+}
+
+/*!
+ \fn QImage QOpenGLFramebufferObject::toImage() const
+ \overload
+
+ Returns the contents of this framebuffer object as a QImage. This method flips
+ the image from OpenGL coordinates to raster coordinates.
+*/
+// ### Qt 6: Remove this method and make it a default argument instead.
+QImage QOpenGLFramebufferObject::toImage() const
+{
+ return toImage(true, 0);
+}
+
+/*! \overload
+
+ Returns the contents of the color attachment of index \a
+ colorAttachmentIndex of this framebuffer object as a QImage. This method
+ flips the image from OpenGL coordinates to raster coordinates when \a
+ flipped is set to \c true.
+
+ \note This overload is only fully functional when multiple render targets are
+ supported by the OpenGL implementation. When that is not the case, only one
+ color attachment will be set up.
+
+ \since 5.6
+*/
+QImage QOpenGLFramebufferObject::toImage(bool flipped, int colorAttachmentIndex) const
+{
+ Q_D(const QOpenGLFramebufferObject);
+ if (!d->valid)
+ return QImage();
+
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (!ctx) {
+ qWarning("QOpenGLFramebufferObject::toImage() called without a current context");
+ return QImage();
+ }
+
+ if (d->colorAttachments.count() <= colorAttachmentIndex) {
+ qWarning("QOpenGLFramebufferObject::toImage() called for missing color attachment");
+ return QImage();
+ }
+
+ GLuint prevFbo = 0;
+ ctx->functions()->glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *) &prevFbo);
+
+ if (prevFbo != d->fbo())
+ const_cast<QOpenGLFramebufferObject *>(this)->bind();
+
+ QImage image;
+ QOpenGLExtraFunctions *extraFuncs = ctx->extraFunctions();
+ // qt_gl_read_framebuffer doesn't work on a multisample FBO
+ if (format().samples() != 0) {
+ QRect rect(QPoint(0, 0), size());
+ QOpenGLFramebufferObjectFormat fmt;
+ if (extraFuncs->hasOpenGLFeature(QOpenGLFunctions::MultipleRenderTargets)) {
+ fmt.setInternalTextureFormat(d->colorAttachments[colorAttachmentIndex].internalFormat);
+ QOpenGLFramebufferObject temp(d->colorAttachments[colorAttachmentIndex].size, fmt);
+ blitFramebuffer(&temp, rect, const_cast<QOpenGLFramebufferObject *>(this), rect,
+ GL_COLOR_BUFFER_BIT, GL_NEAREST,
+ colorAttachmentIndex, 0);
+ image = temp.toImage(flipped);
+ } else {
+ fmt.setInternalTextureFormat(d->colorAttachments[0].internalFormat);
+ QOpenGLFramebufferObject temp(size(), fmt);
+ blitFramebuffer(&temp, rect, const_cast<QOpenGLFramebufferObject *>(this), rect);
+ image = temp.toImage(flipped);
+ }
+ } else {
+ if (extraFuncs->hasOpenGLFeature(QOpenGLFunctions::MultipleRenderTargets)) {
+ extraFuncs->glReadBuffer(GL_COLOR_ATTACHMENT0 + colorAttachmentIndex);
+ image = qt_gl_read_framebuffer(d->colorAttachments[colorAttachmentIndex].size,
+ d->colorAttachments[colorAttachmentIndex].internalFormat,
+ true, flipped);
+ extraFuncs->glReadBuffer(GL_COLOR_ATTACHMENT0);
+ } else {
+ image = qt_gl_read_framebuffer(d->colorAttachments[0].size,
+ d->colorAttachments[0].internalFormat,
+ true, flipped);
+ }
+ }
+
+ if (prevFbo != d->fbo())
+ ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER, prevFbo);
+
+ return image;
+}
+
+/*!
+ \fn bool QOpenGLFramebufferObject::bindDefault()
+
+ Switches rendering back to the default, windowing system provided
+ framebuffer.
+ Returns \c true upon success, false otherwise.
+
+ \sa bind(), release()
+*/
+bool QOpenGLFramebufferObject::bindDefault()
+{
+ QOpenGLContext *ctx = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
+
+ if (ctx) {
+ ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER, ctx->defaultFramebufferObject());
+ QOpenGLContextPrivate::get(ctx)->qgl_current_fbo_invalid = true;
+ QOpenGLContextPrivate::get(ctx)->qgl_current_fbo = nullptr;
+ }
+#ifdef QT_DEBUG
+ else
+ qWarning("QOpenGLFramebufferObject::bindDefault() called without current context.");
+#endif
+
+ return ctx != nullptr;
+}
+
+/*!
+ \fn bool QOpenGLFramebufferObject::hasOpenGLFramebufferObjects()
+
+ Returns \c true if the OpenGL \c{GL_EXT_framebuffer_object} extension
+ is present on this system; otherwise returns \c false.
+*/
+bool QOpenGLFramebufferObject::hasOpenGLFramebufferObjects()
+{
+ return QOpenGLContext::currentContext()->functions()->hasOpenGLFeature(QOpenGLFunctions::Framebuffers);
+}
+
+/*!
+ \fn GLuint QOpenGLFramebufferObject::handle() const
+
+ Returns the OpenGL framebuffer object handle for this framebuffer
+ object (returned by the \c{glGenFrameBuffersEXT()} function). This
+ handle can be used to attach new images or buffers to the
+ framebuffer. The user is responsible for cleaning up and
+ destroying these objects.
+*/
+GLuint QOpenGLFramebufferObject::handle() const
+{
+ Q_D(const QOpenGLFramebufferObject);
+ return d->fbo();
+}
+
+/*!
+ Returns the status of the depth and stencil buffers attached to
+ this framebuffer object.
+*/
+
+QOpenGLFramebufferObject::Attachment QOpenGLFramebufferObject::attachment() const
+{
+ Q_D(const QOpenGLFramebufferObject);
+ if (d->valid)
+ return d->fbo_attachment;
+ return NoAttachment;
+}
+
+/*!
+ Sets the attachments of the framebuffer object to \a attachment.
+
+ This can be used to free or reattach the depth and stencil buffer
+ attachments as needed.
+
+ \note This function alters the current framebuffer binding.
+ */
+void QOpenGLFramebufferObject::setAttachment(QOpenGLFramebufferObject::Attachment attachment)
+{
+ Q_D(QOpenGLFramebufferObject);
+ if (attachment == d->fbo_attachment || !isValid())
+ return;
+ QOpenGLContext *current = QOpenGLContext::currentContext();
+ if (!current)
+ return;
+#ifdef QT_DEBUG
+ if (current->shareGroup() != d->fbo_guard->group())
+ qWarning("QOpenGLFramebufferObject::setAttachment() called from incompatible context");
+#endif
+ d->funcs.glBindFramebuffer(GL_FRAMEBUFFER, d->fbo());
+ QOpenGLContextPrivate::get(current)->qgl_current_fbo_invalid = true;
+ d->initDepthStencilAttachments(current, attachment);
+}
+
+/*!
+ Returns \c true if the framebuffer object is currently bound to the current context,
+ otherwise false is returned.
+*/
+bool QOpenGLFramebufferObject::isBound() const
+{
+ Q_D(const QOpenGLFramebufferObject);
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (!ctx)
+ return false;
+ GLint fbo = 0;
+ ctx->functions()->glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fbo);
+ return GLuint(fbo) == d->fbo();
+}
+
+/*!
+ \fn bool QOpenGLFramebufferObject::hasOpenGLFramebufferBlit()
+
+ Returns \c true if the OpenGL \c{GL_EXT_framebuffer_blit} extension
+ is present on this system; otherwise returns \c false.
+
+ \sa blitFramebuffer()
+*/
+bool QOpenGLFramebufferObject::hasOpenGLFramebufferBlit()
+{
+ return QOpenGLExtensions(QOpenGLContext::currentContext()).hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit);
+}
+
+
+/*!
+ \overload
+
+ Convenience overload to blit between two framebuffer objects.
+*/
+void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target,
+ QOpenGLFramebufferObject *source,
+ GLbitfield buffers, GLenum filter)
+{
+ if (!target && !source)
+ return;
+
+ QSize targetSize;
+ QSize sourceSize;
+
+ if (target)
+ targetSize = target->size();
+ if (source)
+ sourceSize = source->size();
+
+ if (targetSize.isEmpty())
+ targetSize = sourceSize;
+ else if (sourceSize.isEmpty())
+ sourceSize = targetSize;
+
+ blitFramebuffer(target, QRect(QPoint(0, 0), targetSize),
+ source, QRect(QPoint(0, 0), sourceSize),
+ buffers, filter);
+}
+
+/*! \overload
+ *
+ Convenience overload to blit between two framebuffer objects.
+*/
+void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
+ QOpenGLFramebufferObject *source, const QRect &sourceRect,
+ GLbitfield buffers,
+ GLenum filter)
+{
+ blitFramebuffer(target, targetRect, source, sourceRect, buffers, filter, 0, 0);
+}
+
+/*!
+ \enum QOpenGLFramebufferObject::FramebufferRestorePolicy
+ \since 5.7
+
+ This enum type is used to configure the behavior related to restoring
+ framebuffer bindings when calling blitFramebuffer().
+
+ \value DontRestoreFramebufferBinding Do not restore the previous framebuffer binding.
+ The caller is responsible for tracking and setting
+ the framebuffer binding as needed.
+
+ \value RestoreFramebufferBindingToDefault After the blit operation, bind the default
+ framebuffer.
+
+ \value RestoreFrameBufferBinding Restore the previously bound framebuffer. This is
+ potentially expensive because of the need to
+ query the currently bound framebuffer.
+
+ \sa blitFramebuffer()
+*/
+
+/*!
+ \since 5.7
+
+ Blits from the \a sourceRect rectangle in the \a source framebuffer
+ object to the \a targetRect rectangle in the \a target framebuffer object.
+
+ If \a source or \a target is 0, the default framebuffer will be used
+ instead of a framebuffer object as source or target respectively.
+
+ This function will have no effect unless hasOpenGLFramebufferBlit() returns
+ true.
+
+ The \a buffers parameter should be a mask consisting of any combination of
+ \c GL_COLOR_BUFFER_BIT, \c GL_DEPTH_BUFFER_BIT, and
+ \c GL_STENCIL_BUFFER_BIT. Any buffer type that is not present both
+ in the source and target buffers is ignored.
+
+ The \a sourceRect and \a targetRect rectangles may have different sizes;
+ in this case \a buffers should not contain \c GL_DEPTH_BUFFER_BIT or
+ \c GL_STENCIL_BUFFER_BIT. The \a filter parameter should be set to
+ \c GL_LINEAR or \c GL_NEAREST, and specifies whether linear or nearest
+ interpolation should be used when scaling is performed.
+
+ If \a source equals \a target a copy is performed within the same buffer.
+ Results are undefined if the source and target rectangles overlap and
+ have different sizes. The sizes must also be the same if any of the
+ framebuffer objects are multisample framebuffers.
+
+ \note The scissor test will restrict the blit area if enabled.
+
+ When multiple render targets are in use, \a readColorAttachmentIndex and \a
+ drawColorAttachmentIndex specify the index of the color attachments in the
+ source and destination framebuffers.
+
+ The \a restorePolicy determines if the framebuffer that was bound prior to
+ calling this function should be restored, or if the default framebuffer
+ should be bound before returning, of if the caller is responsible for
+ tracking and setting the bound framebuffer. Restoring the previous
+ framebuffer can be relatively expensive due to the call to \c{glGetIntegerv}
+ which on some OpenGL drivers may imply a pipeline stall.
+
+ \sa hasOpenGLFramebufferBlit()
+*/
+void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
+ QOpenGLFramebufferObject *source, const QRect &sourceRect,
+ GLbitfield buffers,
+ GLenum filter,
+ int readColorAttachmentIndex,
+ int drawColorAttachmentIndex,
+ QOpenGLFramebufferObject::FramebufferRestorePolicy restorePolicy)
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (!ctx)
+ return;
+
+ QOpenGLExtensions extensions(ctx);
+ if (!extensions.hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit))
+ return;
+
+ GLuint prevFbo = 0;
+ if (restorePolicy == RestoreFrameBufferBinding)
+ ctx->functions()->glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *) &prevFbo);
+
+ const int sx0 = sourceRect.left();
+ const int sx1 = sourceRect.left() + sourceRect.width();
+ const int sy0 = sourceRect.top();
+ const int sy1 = sourceRect.top() + sourceRect.height();
+
+ const int tx0 = targetRect.left();
+ const int tx1 = targetRect.left() + targetRect.width();
+ const int ty0 = targetRect.top();
+ const int ty1 = targetRect.top() + targetRect.height();
+
+ const GLuint defaultFboId = ctx->defaultFramebufferObject();
+
+ extensions.glBindFramebuffer(GL_READ_FRAMEBUFFER, source ? source->handle() : defaultFboId);
+ extensions.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, target ? target->handle() : defaultFboId);
+
+ const bool supportsMRT = extensions.hasOpenGLFeature(QOpenGLFunctions::MultipleRenderTargets);
+ if (supportsMRT) {
+ extensions.glReadBuffer(GL_COLOR_ATTACHMENT0 + readColorAttachmentIndex);
+ if (target) {
+ GLenum drawBuf = GL_COLOR_ATTACHMENT0 + drawColorAttachmentIndex;
+ extensions.glDrawBuffers(1, &drawBuf);
+ }
+ }
+
+ extensions.glBlitFramebuffer(sx0, sy0, sx1, sy1,
+ tx0, ty0, tx1, ty1,
+ buffers, filter);
+
+ if (supportsMRT)
+ extensions.glReadBuffer(GL_COLOR_ATTACHMENT0);
+
+ switch (restorePolicy) {
+ case RestoreFrameBufferBinding:
+ ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER, prevFbo); // sets both READ and DRAW
+ break;
+
+ case RestoreFramebufferBindingToDefault:
+ ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER, ctx->defaultFramebufferObject()); // sets both READ and DRAW
+ break;
+
+ case DontRestoreFramebufferBinding:
+ break;
+ }
+}
+
+/*!
+ \overload
+
+ Convenience overload to blit between two framebuffer objects and
+ to restore the previous framebuffer binding. Equivalent to calling
+ blitFramebuffer(target, targetRect, source, sourceRect, buffers, filter,
+ readColorAttachmentIndex, drawColorAttachmentIndex,
+ RestoreFrameBufferBinding).
+*/
+void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
+ QOpenGLFramebufferObject *source, const QRect &sourceRect,
+ GLbitfield buffers,
+ GLenum filter,
+ int readColorAttachmentIndex,
+ int drawColorAttachmentIndex)
+{
+ blitFramebuffer(target, targetRect, source, sourceRect,
+ buffers, filter,
+ readColorAttachmentIndex,
+ drawColorAttachmentIndex,
+ RestoreFrameBufferBinding);
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglframebufferobject.h b/src/opengl/qopenglframebufferobject.h
new file mode 100644
index 0000000000..da3347eaec
--- /dev/null
+++ b/src/opengl/qopenglframebufferobject.h
@@ -0,0 +1,196 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLFRAMEBUFFEROBJECT_H
+#define QOPENGLFRAMEBUFFEROBJECT_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#include <QtGui/qopengl.h>
+#include <QtGui/qpaintdevice.h>
+
+#include <QtCore/qscopedpointer.h>
+
+#if defined(Q_CLANG_QDOC)
+#undef GLuint
+typedef unsigned int GLuint;
+#undef GLenum
+typedef unsigned int GLenum;
+#undef GL_TEXTURE_2D
+#define GL_TEXTURE_2D 0x0DE1
+#undef GLbitfield
+typedef unsigned int GLbitfield;
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLFramebufferObjectPrivate;
+class QOpenGLFramebufferObjectFormat;
+
+class Q_OPENGL_EXPORT QOpenGLFramebufferObject
+{
+ Q_DECLARE_PRIVATE(QOpenGLFramebufferObject)
+public:
+ enum Attachment {
+ NoAttachment,
+ CombinedDepthStencil,
+ Depth
+ };
+
+ explicit QOpenGLFramebufferObject(const QSize &size, GLenum target = GL_TEXTURE_2D);
+ QOpenGLFramebufferObject(int width, int height, GLenum target = GL_TEXTURE_2D);
+
+ QOpenGLFramebufferObject(const QSize &size, Attachment attachment,
+ GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0);
+ QOpenGLFramebufferObject(int width, int height, Attachment attachment,
+ GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0);
+
+ QOpenGLFramebufferObject(const QSize &size, const QOpenGLFramebufferObjectFormat &format);
+ QOpenGLFramebufferObject(int width, int height, const QOpenGLFramebufferObjectFormat &format);
+
+ virtual ~QOpenGLFramebufferObject();
+
+ void addColorAttachment(const QSize &size, GLenum internalFormat = 0);
+ void addColorAttachment(int width, int height, GLenum internalFormat = 0);
+
+ QOpenGLFramebufferObjectFormat format() const;
+
+ bool isValid() const;
+ bool isBound() const;
+ bool bind();
+ bool release();
+
+ int width() const { return size().width(); }
+ int height() const { return size().height(); }
+
+ GLuint texture() const;
+ QVector<GLuint> textures() const;
+
+ GLuint takeTexture();
+ GLuint takeTexture(int colorAttachmentIndex);
+
+ QSize size() const;
+ QVector<QSize> sizes() const;
+
+ QImage toImage() const;
+ QImage toImage(bool flipped) const;
+ QImage toImage(bool flipped, int colorAttachmentIndex) const;
+
+ Attachment attachment() const;
+ void setAttachment(Attachment attachment);
+
+ GLuint handle() const;
+
+ static bool bindDefault();
+
+ static bool hasOpenGLFramebufferObjects();
+
+ static bool hasOpenGLFramebufferBlit();
+
+ enum FramebufferRestorePolicy {
+ DontRestoreFramebufferBinding,
+ RestoreFramebufferBindingToDefault,
+ RestoreFrameBufferBinding
+ };
+
+ static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
+ QOpenGLFramebufferObject *source, const QRect &sourceRect,
+ GLbitfield buffers,
+ GLenum filter,
+ int readColorAttachmentIndex,
+ int drawColorAttachmentIndex,
+ FramebufferRestorePolicy restorePolicy);
+ static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
+ QOpenGLFramebufferObject *source, const QRect &sourceRect,
+ GLbitfield buffers,
+ GLenum filter,
+ int readColorAttachmentIndex,
+ int drawColorAttachmentIndex);
+ static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect,
+ QOpenGLFramebufferObject *source, const QRect &sourceRect,
+ GLbitfield buffers = GL_COLOR_BUFFER_BIT,
+ GLenum filter = GL_NEAREST);
+ static void blitFramebuffer(QOpenGLFramebufferObject *target,
+ QOpenGLFramebufferObject *source,
+ GLbitfield buffers = GL_COLOR_BUFFER_BIT,
+ GLenum filter = GL_NEAREST);
+
+private:
+ Q_DISABLE_COPY(QOpenGLFramebufferObject)
+ QScopedPointer<QOpenGLFramebufferObjectPrivate> d_ptr;
+ friend class QOpenGLPaintDevice;
+ friend class QOpenGLFBOGLPaintDevice;
+};
+
+class QOpenGLFramebufferObjectFormatPrivate;
+class Q_OPENGL_EXPORT QOpenGLFramebufferObjectFormat
+{
+public:
+ QOpenGLFramebufferObjectFormat();
+ QOpenGLFramebufferObjectFormat(const QOpenGLFramebufferObjectFormat &other);
+ QOpenGLFramebufferObjectFormat &operator=(const QOpenGLFramebufferObjectFormat &other);
+ ~QOpenGLFramebufferObjectFormat();
+
+ void setSamples(int samples);
+ int samples() const;
+
+ void setMipmap(bool enabled);
+ bool mipmap() const;
+
+ void setAttachment(QOpenGLFramebufferObject::Attachment attachment);
+ QOpenGLFramebufferObject::Attachment attachment() const;
+
+ void setTextureTarget(GLenum target);
+ GLenum textureTarget() const;
+
+ void setInternalTextureFormat(GLenum internalTextureFormat);
+ GLenum internalTextureFormat() const;
+
+ bool operator==(const QOpenGLFramebufferObjectFormat& other) const;
+ bool operator!=(const QOpenGLFramebufferObjectFormat& other) const;
+
+private:
+ QOpenGLFramebufferObjectFormatPrivate *d;
+
+ void detach();
+};
+
+QT_END_NAMESPACE
+
+#endif // QOPENGLFRAMEBUFFEROBJECT_H
diff --git a/src/opengl/qopenglframebufferobject_p.h b/src/opengl/qopenglframebufferobject_p.h
new file mode 100644
index 0000000000..3721e2affa
--- /dev/null
+++ b/src/opengl/qopenglframebufferobject_p.h
@@ -0,0 +1,153 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLFRAMEBUFFEROBJECT_P_H
+#define QOPENGLFRAMEBUFFEROBJECT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qopenglframebufferobject.h>
+#include <private/qopenglcontext_p.h>
+#include <private/qopenglextensions_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLFramebufferObjectFormatPrivate
+{
+public:
+ QOpenGLFramebufferObjectFormatPrivate()
+ : ref(1),
+ samples(0),
+ attachment(QOpenGLFramebufferObject::NoAttachment),
+ target(GL_TEXTURE_2D),
+ mipmap(false)
+ {
+#if !QT_CONFIG(opengles2)
+ // There is nothing that says QOpenGLFramebufferObjectFormat needs a current
+ // context, so we need a fallback just to be safe, even though in pratice there
+ // will usually be a context current.
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ const bool isES = ctx ? ctx->isOpenGLES() : QOpenGLContext::openGLModuleType() != QOpenGLContext::LibGL;
+ internal_format = isES ? GL_RGBA : GL_RGBA8;
+#else
+ internal_format = GL_RGBA;
+#endif
+ }
+ QOpenGLFramebufferObjectFormatPrivate
+ (const QOpenGLFramebufferObjectFormatPrivate *other)
+ : ref(1),
+ samples(other->samples),
+ attachment(other->attachment),
+ target(other->target),
+ internal_format(other->internal_format),
+ mipmap(other->mipmap)
+ {
+ }
+ bool equals(const QOpenGLFramebufferObjectFormatPrivate *other)
+ {
+ return samples == other->samples &&
+ attachment == other->attachment &&
+ target == other->target &&
+ internal_format == other->internal_format &&
+ mipmap == other->mipmap;
+ }
+
+ QAtomicInt ref;
+ int samples;
+ QOpenGLFramebufferObject::Attachment attachment;
+ GLenum target;
+ GLenum internal_format;
+ uint mipmap : 1;
+};
+
+class QOpenGLFramebufferObjectPrivate
+{
+public:
+ QOpenGLFramebufferObjectPrivate() : fbo_guard(nullptr), depth_buffer_guard(nullptr)
+ , stencil_buffer_guard(nullptr)
+ , valid(false) {}
+ ~QOpenGLFramebufferObjectPrivate() {}
+
+ void init(QOpenGLFramebufferObject *q, const QSize &size,
+ QOpenGLFramebufferObject::Attachment attachment,
+ GLenum texture_target, GLenum internal_format,
+ GLint samples = 0, bool mipmap = false);
+ void initTexture(int idx);
+ void initColorBuffer(int idx, GLint *samples);
+ void initDepthStencilAttachments(QOpenGLContext *ctx, QOpenGLFramebufferObject::Attachment attachment);
+
+ bool checkFramebufferStatus(QOpenGLContext *ctx) const;
+ QOpenGLSharedResourceGuard *fbo_guard;
+ QOpenGLSharedResourceGuard *depth_buffer_guard;
+ QOpenGLSharedResourceGuard *stencil_buffer_guard;
+ GLenum target;
+ QSize dsSize;
+ QOpenGLFramebufferObjectFormat format;
+ int requestedSamples;
+ uint valid : 1;
+ QOpenGLFramebufferObject::Attachment fbo_attachment;
+ QOpenGLExtensions funcs;
+
+ struct ColorAttachment {
+ ColorAttachment() : internalFormat(0), guard(nullptr) { }
+ ColorAttachment(const QSize &size, GLenum internalFormat)
+ : size(size), internalFormat(internalFormat), guard(nullptr) { }
+ QSize size;
+ GLenum internalFormat;
+ QOpenGLSharedResourceGuard *guard;
+ };
+ QVector<ColorAttachment> colorAttachments;
+
+ inline GLuint fbo() const { return fbo_guard ? fbo_guard->id() : 0; }
+};
+
+Q_OPENGL_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha);
+
+QT_END_NAMESPACE
+
+#endif // QOPENGLFRAMEBUFFEROBJECT_P_H
diff --git a/src/opengl/qopenglfunctions_1_0.cpp b/src/opengl/qopenglfunctions_1_0.cpp
new file mode 100644
index 0000000000..f440764df8
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_0.cpp
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_1_0.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_1_0
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_1_0 class provides all functions for OpenGL 1.0 specification.
+
+ This class is a wrapper for functions from OpenGL 1.0 specification.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_1_0::QOpenGLFunctions_1_0()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_1_0::~QOpenGLFunctions_1_0()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_1_0::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_1_0::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_1_0::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(1, 0))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_1_0::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(1, 0);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_1_0.h b/src/opengl/qopenglfunctions_1_0.h
new file mode 100644
index 0000000000..4d0b325eb4
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_0.h
@@ -0,0 +1,1930 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_1_0_H
+#define QOPENGLVERSIONFUNCTIONS_1_0_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_1_0 : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_1_0();
+ ~QOpenGLFunctions_1_0();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_1_0::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_0::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_1_0::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_1_0::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_1_0::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_1_0::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_1_0::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_1_0::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_0::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_0::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_1_0::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_1_0::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_1_0::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_1_0::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_1_0::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_1_0::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_1_0::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_1_0::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_1_0::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_1_0::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_0::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_1_0::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_1_0::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_1_0::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_0::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_1_0::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_0::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_0::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_0::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_0::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_1_0::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_1_0::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_1_0::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_1_0::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_1_0::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_1_0::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_1_0::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_1_0::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_1_0::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_0::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_0::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_1_0::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_0::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_0::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_1_0::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_1_0::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_1_0::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_0::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_1_0::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_1_0::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_1_0::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_0::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_0::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_0::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_0::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_0::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_1_0::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_0::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_0::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_0::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_1_0::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_1_0::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_1_0::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_0::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_0::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_0::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_0::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_0::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_0::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_0::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_0::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_1_0::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_1_0::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_1_0::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_1_0::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_1_0::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_0::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_1_0::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_1_0::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_1_0::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_1_0::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_1_0::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_1_0::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_1_0::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_1_0::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_1_0::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_0::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_1_0::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_0::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_0::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_1_0::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_1_0::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_0::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_0::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_0::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_0::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_0::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_0::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_0::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_0::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_0::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_0::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_0::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_0::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_0::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_1_0::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_1_0::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_1_0::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_1_0::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_1_0::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_1_0::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_1_0::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_1_0::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_1_0::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_1_0::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_1_0::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_0::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_1_0::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_1_0::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_1_0::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_1_0::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_1_0::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_1_0::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_1_0::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_1_0::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_1_1.cpp b/src/opengl/qopenglfunctions_1_1.cpp
new file mode 100644
index 0000000000..7860123757
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_1.cpp
@@ -0,0 +1,154 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_1_1.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_1_1
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_1_1 class provides all functions for OpenGL 1.1 specification.
+
+ This class is a wrapper for functions from OpenGL 1.1 specification.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_1_1::QOpenGLFunctions_1_1()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_1_1::~QOpenGLFunctions_1_1()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_1_1::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_1_1::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_1_1::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(1, 1))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_1_1::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(1, 1);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_1_1.h b/src/opengl/qopenglfunctions_1_1.h
new file mode 100644
index 0000000000..b948b55fe6
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_1.h
@@ -0,0 +1,2120 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_1_1_H
+#define QOPENGLVERSIONFUNCTIONS_1_1_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_1_1 : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_1_1();
+ ~QOpenGLFunctions_1_1();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_1_1::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_1::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_1_1::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_1_1::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_1_1::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_1_1::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_1_1::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_1_1::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_1::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_1::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_1_1::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_1_1::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_1_1::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_1_1::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_1_1::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_1_1::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_1_1::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_1_1::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_1_1::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_1_1::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_1::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_1_1::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_1_1::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_1_1::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_1::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_1_1::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_1::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_1::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_1::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_1::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_1_1::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_1_1::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_1_1::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_1_1::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_1_1::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_1_1::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_1_1::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_1_1::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_1_1::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_1_1::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_1_1::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_1_1::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_1::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_1::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_1::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_1::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_1_1::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_1_1::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_1_1::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_1_1::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_1_1::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_1_1::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_1_1::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_1_1::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_1::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_1::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_1_1::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_1::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_1::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_1_1::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_1_1::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_1_1::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_1::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_1_1::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_1_1::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_1_1::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_1::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_1::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_1::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_1::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_1::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_1_1::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_1::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_1::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_1::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_1_1::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_1_1::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_1_1::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_1::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_1::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_1::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_1::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_1::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_1::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_1::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_1::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_1_1::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_1_1::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_1_1::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_1_1::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_1_1::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_1::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_1_1::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_1_1::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_1_1::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_1_1::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_1_1::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_1_1::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_1_1::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_1_1::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_1_1::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_1::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_1_1::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_1::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_1::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_1_1::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_1_1::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_1::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_1::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_1::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_1::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_1::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_1::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_1::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_1::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_1::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_1::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_1::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_1::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_1::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_1_1::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_1_1::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_1_1::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_1_1::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_1_1::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_1_1::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_1_1::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_1_1::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_1_1::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_1_1::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_1_1::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_1::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_1_1::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_1_1::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_1_1::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_1_1::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_1_1::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_1_1::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_1_1::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_1_1::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_1_1::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_1_1::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_1_1::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_1_1::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_1_1::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_1::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_1::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_1::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_1::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_1::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_1_1::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_1::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_1_1::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_1::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_1_2.cpp b/src/opengl/qopenglfunctions_1_2.cpp
new file mode 100644
index 0000000000..5993210674
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_2.cpp
@@ -0,0 +1,172 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_1_2.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_1_2
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_1_2 class provides all functions for OpenGL 1.2 specification.
+
+ This class is a wrapper for functions from OpenGL 1.2 specification.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_1_2::QOpenGLFunctions_1_2()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_1_2::~QOpenGLFunctions_1_2()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_1_2::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_1_2::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_1_2::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(1, 2))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_1_2::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(1, 2);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_1_2.h b/src/opengl/qopenglfunctions_1_2.h
new file mode 100644
index 0000000000..3b3886e934
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_2.h
@@ -0,0 +1,2359 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_1_2_H
+#define QOPENGLVERSIONFUNCTIONS_1_2_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_1_2 : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_1_2();
+ ~QOpenGLFunctions_1_2();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_1_2::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_2::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_1_2::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_1_2::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_1_2::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_1_2::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_1_2::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_1_2::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_2::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_2::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_1_2::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_1_2::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_1_2::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_1_2::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_1_2::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_1_2::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_1_2::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_1_2::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_1_2::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_1_2::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_2::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_1_2::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_1_2::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_1_2::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_2::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_1_2::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_2::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_2::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_2::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_2::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_1_2::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_1_2::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_1_2::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_1_2::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_1_2::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_1_2::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_1_2::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_1_2::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_1_2::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_1_2::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_1_2::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_1_2::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_2::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_2::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_2::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_2::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_1_2::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_1_2::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_1_2::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_1_2::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_1_2::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_2::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_2::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_2::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_1_2::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_1_2::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_1_2::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_1_2::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_1_2::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_1_2::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_2::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_2::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_1_2::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_2::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_2::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_1_2::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_1_2::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_1_2::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_2::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_1_2::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_1_2::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_1_2::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_2::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_2::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_2::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_2::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_2::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_1_2::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_2::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_2::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_2::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_1_2::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_1_2::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_1_2::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_2::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_2::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_2::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_2::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_2::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_2::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_2::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_2::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_1_2::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_1_2::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_1_2::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_1_2::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_1_2::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_2::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_1_2::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_1_2::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_1_2::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_1_2::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_1_2::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_1_2::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_1_2::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_1_2::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_1_2::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_2::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_1_2::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_2::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_1_2::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_1_2::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_2::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_2::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_2::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_2::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_2::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_2::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_2::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_2::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_2::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_2::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_2::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_2::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_2::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_1_2::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_1_2::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_1_2::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_1_2::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_1_2::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_1_2::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_1_2::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_1_2::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_1_2::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_1_2::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_1_2::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_2::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_1_2::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_1_2::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_1_2::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_1_2::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_1_2::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_1_2::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_1_2::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_1_2::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_1_2::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_1_2::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_1_2::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_1_2::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_1_2::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_2::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_2::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_2::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_2::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_2::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_1_2::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_2::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_1_2::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_2::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_1_2::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_1_2::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_1_2::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_1_2::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_1_2::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_1_2::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_1_2::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_1_2::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_1_2::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_2::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_2::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_2::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_2::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_2::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_2::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_1_2::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_1_2::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_2::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_2::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_1_3.cpp b/src/opengl/qopenglfunctions_1_3.cpp
new file mode 100644
index 0000000000..41ef4d4cf3
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_3.cpp
@@ -0,0 +1,190 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_1_3.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_1_3
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_1_3 class provides all functions for OpenGL 1.3 specification.
+
+ This class is a wrapper for functions from OpenGL 1.3 specification.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_1_3::QOpenGLFunctions_1_3()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_1_3::~QOpenGLFunctions_1_3()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_1_3::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_1_3::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_1_3::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(1, 3))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_1_3::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(1, 3);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_1_3.h b/src/opengl/qopenglfunctions_1_3.h
new file mode 100644
index 0000000000..1a004c0c16
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_3.h
@@ -0,0 +1,2644 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_1_3_H
+#define QOPENGLVERSIONFUNCTIONS_1_3_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_1_3 : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_1_3();
+ ~QOpenGLFunctions_1_3();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_1_3::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_3::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_1_3::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_1_3::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_1_3::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_1_3::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_1_3::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_1_3::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_3::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_3::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_1_3::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_1_3::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_1_3::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_1_3::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_1_3::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_1_3::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_1_3::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_1_3::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_1_3::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_1_3::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_3::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_1_3::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_1_3::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_1_3::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_3::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_1_3::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_3::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_3::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_3::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_3::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_1_3::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_1_3::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_1_3::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_1_3::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_1_3::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_1_3::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_1_3::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_1_3::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_1_3::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_1_3::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_1_3::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_1_3::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_3::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_3::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_3::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_3::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_1_3::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_1_3::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_1_3::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_1_3::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_1_3::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_3::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_3::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_3::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_1_3::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_1_3::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_1_3::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_1_3::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_3::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_3::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_3::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_3::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_3::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_3::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_1_3::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_1_3::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_1_3::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_1_3::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_1_3::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_3::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_3::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_1_3::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_3::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_3::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_1_3::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_1_3::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_1_3::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_3::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_1_3::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_1_3::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_1_3::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_3::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_3::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_3::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_3::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_3::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_1_3::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_3::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_3::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_3::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_1_3::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_1_3::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_1_3::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_3::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_3::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_3::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_3::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_3::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_3::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_3::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_3::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_1_3::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_1_3::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_1_3::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_1_3::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_1_3::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_3::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_1_3::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_1_3::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_1_3::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_1_3::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_1_3::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_1_3::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_1_3::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_1_3::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_1_3::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_3::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_1_3::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_3::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_1_3::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_1_3::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_3::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_3::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_3::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_3::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_3::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_3::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_3::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_3::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_3::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_3::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_3::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_3::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_3::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_1_3::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_1_3::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_1_3::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_1_3::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_1_3::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_1_3::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_1_3::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_1_3::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_1_3::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_1_3::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_1_3::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_3::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_1_3::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_1_3::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_1_3::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_1_3::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_1_3::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_1_3::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_1_3::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_1_3::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_1_3::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_1_3::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_1_3::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_1_3::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_1_3::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_3::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_3::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_3::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_3::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_3::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_1_3::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_3::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_1_3::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_3::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_1_3::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_1_3::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_1_3::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_1_3::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_1_3::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_1_3::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_1_3::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_1_3::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_1_3::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_3::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_3::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_3::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_3::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_3::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_3::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_1_3::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_1_3::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_3::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_3::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_1_3::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_3::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_3::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_3::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_3::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_1_3::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_1_4.cpp b/src/opengl/qopenglfunctions_1_4.cpp
new file mode 100644
index 0000000000..92a331d775
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_4.cpp
@@ -0,0 +1,208 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_1_4.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_1_4
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_1_4 class provides all functions for OpenGL 1.4 specification.
+
+ This class is a wrapper for functions from OpenGL 1.4 specification.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_1_4::QOpenGLFunctions_1_4()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_1_4::~QOpenGLFunctions_1_4()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_1_4::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_1_4::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_1_4::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(1, 4))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_1_4::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(1, 4);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_1_4.h b/src/opengl/qopenglfunctions_1_4.h
new file mode 100644
index 0000000000..af814bc047
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_4.h
@@ -0,0 +1,2924 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_1_4_H
+#define QOPENGLVERSIONFUNCTIONS_1_4_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_1_4 : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_1_4();
+ ~QOpenGLFunctions_1_4();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_1_4::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_4::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_1_4::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_1_4::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_1_4::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_1_4::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_1_4::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_1_4::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_4::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_4::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_1_4::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_1_4::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_1_4::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_1_4::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_1_4::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_1_4::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_1_4::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_1_4::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_1_4::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_1_4::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_4::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_1_4::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_1_4::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_1_4::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_4::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_1_4::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_4::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_4::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_4::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_4::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_1_4::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_1_4::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_1_4::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_1_4::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_1_4::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_1_4::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_1_4::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_1_4::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_1_4::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_1_4::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_1_4::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_1_4::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_4::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_4::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_4::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_4::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_1_4::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_1_4::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_1_4::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_1_4::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_1_4::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_4::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_4::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_4::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_1_4::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_1_4::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_1_4::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_1_4::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_4::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_4::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_4::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_4::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_4::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_4::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_1_4::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_1_4::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_1_4::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_1_4::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_1_4::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_1_4::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_1_4::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_4::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_4::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_1_4::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_4::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_4::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_1_4::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_1_4::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_1_4::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_4::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_1_4::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_1_4::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_1_4::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_4::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_4::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_4::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_4::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_4::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_1_4::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_4::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_4::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_4::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_1_4::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_1_4::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_1_4::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_4::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_4::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_4::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_4::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_4::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_4::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_4::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_4::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_1_4::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_1_4::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_1_4::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_1_4::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_1_4::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_4::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_1_4::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_1_4::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_1_4::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_1_4::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_1_4::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_1_4::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_1_4::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_1_4::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_1_4::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_4::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_1_4::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_4::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_1_4::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_1_4::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_4::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_4::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_4::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_4::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_4::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_4::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_4::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_4::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_4::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_4::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_4::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_4::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_1_4::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_1_4::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_1_4::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_1_4::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_1_4::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_1_4::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_1_4::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_1_4::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_1_4::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_1_4::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_1_4::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_1_4::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_1_4::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_1_4::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_1_4::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_1_4::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_1_4::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_1_4::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_1_4::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_1_4::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_1_4::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_1_4::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_1_4::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_4::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_4::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_4::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_4::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_4::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_1_4::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_4::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_1_4::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_4::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_1_4::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_1_4::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_1_4::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_1_4::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_1_4::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_1_4::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_1_4::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_1_4::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_1_4::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_4::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_4::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_4::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_4::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_4::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_4::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_1_4::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_1_4::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_4::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_4::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_1_4::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_4::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_4::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_4::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_4::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_1_4::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_1_4::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_1_4::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_4::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_4::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_1_4::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_1_4::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_1_4::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_1_5.cpp b/src/opengl/qopenglfunctions_1_5.cpp
new file mode 100644
index 0000000000..d304679409
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_5.cpp
@@ -0,0 +1,217 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_1_5.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_1_5
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_1_5 class provides all functions for OpenGL 1.5 specification.
+
+ This class is a wrapper for functions from OpenGL 1.5 specification.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_1_5::QOpenGLFunctions_1_5()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_1_5::~QOpenGLFunctions_1_5()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_1_5::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_1_5::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_1_5::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(1, 5))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_1_5::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(1, 5);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_1_5.h b/src/opengl/qopenglfunctions_1_5.h
new file mode 100644
index 0000000000..857c6d156b
--- /dev/null
+++ b/src/opengl/qopenglfunctions_1_5.h
@@ -0,0 +1,3047 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_1_5_H
+#define QOPENGLVERSIONFUNCTIONS_1_5_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_1_5 : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_1_5();
+ ~QOpenGLFunctions_1_5();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_1_5::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_5::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_1_5::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_1_5::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_1_5::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_1_5::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_1_5::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_1_5::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_5::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_5::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_1_5::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_1_5::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_1_5::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_1_5::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_1_5::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_1_5::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_1_5::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_1_5::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_1_5::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_1_5::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_5::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_1_5::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_1_5::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_1_5::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_5::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_1_5::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_1_5::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_5::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_5::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_5::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_1_5::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_1_5::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_1_5::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_1_5::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_1_5::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_1_5::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_1_5::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_1_5::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_1_5::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_1_5::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_1_5::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_1_5::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_5::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_5::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_5::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_5::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_1_5::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_1_5::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_1_5::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_1_5::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_1_5::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_5::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_5::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_5::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_1_5::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_1_5::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_1_5::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_1_5::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_5::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_5::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_5::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_5::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_5::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_1_5::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_1_5::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_1_5::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_1_5::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_1_5::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_1_5::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_1_5::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_1_5::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_1_5::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_1_5::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_1_5::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_1_5::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_1_5::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_1_5::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_1_5::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_1_5::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_1_5::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_1_5::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_1_5::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_1_5::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_1_5::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_1_5::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_1_5::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_5::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_5::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_1_5::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_5::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_5::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_1_5::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_1_5::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_1_5::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_5::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_1_5::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_1_5::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_1_5::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_5::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_5::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_1_5::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_5::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_1_5::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_1_5::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_5::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_5::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_1_5::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_1_5::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_1_5::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_1_5::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_5::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_1_5::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_5::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_1_5::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_5::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_1_5::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_5::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_1_5::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_1_5::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_1_5::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_1_5::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_1_5::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_1_5::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_5::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_1_5::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_1_5::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_1_5::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_1_5::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_1_5::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_1_5::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_1_5::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_1_5::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_1_5::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_1_5::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_1_5::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_1_5::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_1_5::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_1_5::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_5::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_5::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_5::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_5::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_5::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_5::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_1_5::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_5::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_5::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_5::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_5::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_1_5::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_1_5::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_1_5::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_1_5::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_1_5::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_1_5::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_1_5::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_1_5::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_1_5::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_1_5::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_1_5::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_1_5::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_1_5::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_1_5::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_1_5::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_1_5::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_1_5::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_1_5::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_1_5::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_1_5::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_1_5::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_1_5::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_1_5::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_1_5::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_5::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_5::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_5::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_5::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_5::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_1_5::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_5::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_1_5::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_5::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_1_5::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_1_5::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_1_5::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_1_5::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_1_5::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_1_5::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_1_5::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_1_5::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_1_5::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_5::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_1_5::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_5::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_5::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_1_5::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_5::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_1_5::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_1_5::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_1_5::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_1_5::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_1_5::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_5::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_5::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_1_5::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_1_5::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_1_5::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_1_5::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_1_5::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_1_5::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_1_5::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_1_5::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_1_5::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_1_5::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_2_0.cpp b/src/opengl/qopenglfunctions_2_0.cpp
new file mode 100644
index 0000000000..63bfe641f2
--- /dev/null
+++ b/src/opengl/qopenglfunctions_2_0.cpp
@@ -0,0 +1,227 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_2_0.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_2_0
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_2_0 class provides all functions for OpenGL 2.0 specification.
+
+ This class is a wrapper for functions from OpenGL 2.0 specification.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_2_0::QOpenGLFunctions_2_0()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+ , m_reserved_2_0_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_2_0::~QOpenGLFunctions_2_0()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_2_0::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_2_0::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_2_0::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(2, 0))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_2_0::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(2, 0);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_2_0.h b/src/opengl/qopenglfunctions_2_0.h
new file mode 100644
index 0000000000..abe4ade56a
--- /dev/null
+++ b/src/opengl/qopenglfunctions_2_0.h
@@ -0,0 +1,3615 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_2_0_H
+#define QOPENGLVERSIONFUNCTIONS_2_0_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_2_0 : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_2_0();
+ ~QOpenGLFunctions_2_0();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+ // OpenGL 2.0 deprecated functions
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+ void *m_reserved_2_0_Deprecated; // To maintain BC
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_2_0::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_2_0::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_2_0::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_2_0::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_2_0::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_2_0::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_2_0::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_2_0::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_0::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_2_0::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_2_0::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_2_0::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_2_0::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_2_0::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_2_0::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_2_0::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_2_0::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_2_0::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_2_0::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_2_0::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_0::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_2_0::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_2_0::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_2_0::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_0::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_2_0::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_2_0::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_0::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_0::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_2_0::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_2_0::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_2_0::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_2_0::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_2_0::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_2_0::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_2_0::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_2_0::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_2_0::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_2_0::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_2_0::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_2_0::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_2_0::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_0::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_0::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_2_0::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_2_0::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_2_0::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_2_0::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_2_0::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_2_0::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_2_0::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_2_0::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_0::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_0::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_2_0::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_2_0::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_2_0::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_2_0::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_0::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_0::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_0::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_0::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_0::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_0::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_2_0::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_2_0::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_2_0::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_2_0::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_2_0::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_2_0::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_2_0::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_2_0::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_2_0::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_2_0::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_2_0::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_2_0::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_2_0::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_2_0::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_2_0::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_2_0::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_2_0::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_2_0::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_2_0::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_0::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_2_0::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_2_0::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_2_0::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_2_0::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_2_0::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_2_0::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_2_0::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_2_0::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_2_0::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_2_0::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_2_0::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_2_0::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_2_0::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_2_0::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_2_0::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_2_0::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_2_0::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_2_0::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_2_0::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_2_0::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_2_0::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_2_0::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_2_0::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_2_0::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_2_0::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_2_0::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_2_0::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_2_0::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_2_0::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_2_0::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_2_0::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_2_0::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_2_0::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_2_0::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_2_0::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_2_0::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_2_0::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_2_0::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_2_0::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_2_0::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_2_0::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_2_0::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_2_0::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_2_0::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_2_0::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_2_0::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_2_0::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_2_0::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_2_0::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_2_0::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_2_0::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_2_0::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_2_0::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_2_0::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_2_0::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_0::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_2_0::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_2_0::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_2_0::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_2_0::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_2_0::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_2_0::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_2_0::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_2_0::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_2_0::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_2_0::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_2_0::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_2_0::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_2_0::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_2_0::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_2_0::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_2_0::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_2_0::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_2_0::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_2_0::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_2_0::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_0::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_2_0::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_2_0::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_2_0::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_2_0::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_2_0::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_2_0::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_2_0::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_2_0::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_2_0::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_2_0::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_2_0::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_2_0::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_2_0::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_2_0::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_2_0::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_2_0::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_2_0::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_2_0::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_2_0::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_2_0::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_2_0::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_2_0::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_2_0::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_2_0::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_2_0::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_2_0::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_2_0::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_2_0::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_2_0::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_2_0::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_2_0::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_2_0::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_2_0::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_2_0::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_2_0::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_2_0::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_2_0::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_2_0::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_2_0::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_2_0::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_2_0::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_2_0::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_2_0::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_2_0::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_2_0::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_2_0::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_2_0::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_2_0::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_0::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_0::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_0::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_0::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_0::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_2_0::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_0::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_2_0::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_0::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_2_0::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_2_0::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_2_0::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_2_0::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_2_0::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_2_0::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_2_0::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_2_0::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_2_0::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_2_0::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_2_0::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_2_0::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_2_0::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_2_0::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_2_0::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_2_0::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_2_0::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_2_0::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_0::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_2_0::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_2_0::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_2_0::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_2_0::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_2_0::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_2_0::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_2_0::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_2_0::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_0::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_0::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_2_0::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_2_0::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_2_0::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+// OpenGL 2.0 deprecated functions
+inline void QOpenGLFunctions_2_0::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_2_0::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_2_1.cpp b/src/opengl/qopenglfunctions_2_1.cpp
new file mode 100644
index 0000000000..1eb8d2a95c
--- /dev/null
+++ b/src/opengl/qopenglfunctions_2_1.cpp
@@ -0,0 +1,236 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_2_1.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_2_1
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_2_1 class provides all functions for OpenGL 2.1 specification.
+
+ This class is a wrapper for functions from OpenGL 2.1 specification.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_2_1::QOpenGLFunctions_2_1()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+ , m_reserved_2_0_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_2_1::~QOpenGLFunctions_2_1()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_2_1::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_2_1::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_2_1::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(2, 1))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_2_1::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(2, 1);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_2_1.h b/src/opengl/qopenglfunctions_2_1.h
new file mode 100644
index 0000000000..dc46d8a4b2
--- /dev/null
+++ b/src/opengl/qopenglfunctions_2_1.h
@@ -0,0 +1,3660 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_2_1_H
+#define QOPENGLVERSIONFUNCTIONS_2_1_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_2_1 : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_2_1();
+ ~QOpenGLFunctions_2_1();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+ // OpenGL 2.0 deprecated functions
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+
+ // OpenGL 2.1 deprecated functions
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+ void *m_reserved_2_0_Deprecated; // To maintain BC
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_2_1::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_2_1::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_2_1::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_2_1::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_2_1::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_2_1::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_2_1::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_2_1::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_1::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_2_1::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_2_1::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_2_1::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_2_1::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_2_1::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_2_1::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_2_1::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_2_1::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_2_1::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_2_1::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_2_1::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_1::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_2_1::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_2_1::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_2_1::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_1::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_2_1::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_2_1::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_1::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_1::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_2_1::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_2_1::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_2_1::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_2_1::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_2_1::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_2_1::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_2_1::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_2_1::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_2_1::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_2_1::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_2_1::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_2_1::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_2_1::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_1::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_1::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_2_1::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_2_1::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_2_1::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_2_1::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_2_1::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_2_1::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_2_1::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_2_1::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_1::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_1::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_2_1::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_2_1::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_2_1::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_2_1::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_1::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_1::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_1::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_1::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_1::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_2_1::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_2_1::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_2_1::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_2_1::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_2_1::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_2_1::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_2_1::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_2_1::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_2_1::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_2_1::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_2_1::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_2_1::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_2_1::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_2_1::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_2_1::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_2_1::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_2_1::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_2_1::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_2_1::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_2_1::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_1::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_2_1::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_2_1::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_2_1::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_2_1::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_2_1::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_2_1::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_2_1::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_2_1::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_2_1::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_2_1::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_2_1::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_2_1::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_2_1::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_2_1::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_2_1::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_2_1::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_2_1::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_2_1::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_2_1::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_2_1::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_2_1::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_2_1::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_2_1::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_2_1::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_2_1::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_2_1::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_2_1::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_2_1::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_2_1::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_2_1::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_2_1::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_2_1::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_2_1::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_2_1::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_2_1::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_2_1::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_2_1::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_2_1::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_2_1::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_2_1::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_2_1::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_2_1::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_2_1::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_2_1::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_2_1::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_2_1::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_2_1::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_2_1::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_2_1::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_2_1::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_2_1::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_2_1::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_2_1::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_2_1::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_2_1::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_2_1::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_2_1::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_2_1::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_2_1::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_2_1::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_2_1::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_2_1::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_2_1::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_2_1::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_2_1::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_2_1::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_2_1::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_2_1::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_2_1::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_2_1::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_2_1::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_2_1::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_2_1::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_2_1::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_2_1::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_2_1::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_1::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_2_1::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_2_1::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_2_1::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_2_1::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_2_1::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_2_1::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_2_1::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_2_1::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_2_1::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_2_1::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_2_1::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_2_1::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_2_1::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_2_1::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_2_1::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_2_1::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_2_1::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_2_1::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_2_1::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_2_1::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_2_1::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_2_1::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_2_1::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_2_1::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_2_1::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_2_1::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_2_1::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_2_1::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_2_1::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_2_1::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_2_1::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_2_1::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_2_1::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_2_1::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_2_1::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_2_1::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_2_1::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_2_1::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_2_1::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_2_1::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_2_1::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_2_1::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_2_1::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_2_1::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_2_1::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_2_1::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_2_1::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_2_1::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_1::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_1::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_1::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_1::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_1::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_2_1::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_1::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_2_1::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_1::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_2_1::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_2_1::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_2_1::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_2_1::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_2_1::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_2_1::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_2_1::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_2_1::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_2_1::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_2_1::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_2_1::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_2_1::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_2_1::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_2_1::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_2_1::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_2_1::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_2_1::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_2_1::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_2_1::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_2_1::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_2_1::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_2_1::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_2_1::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_2_1::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_2_1::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_2_1::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_2_1::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_2_1::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_2_1::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_2_1::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_2_1::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_2_1::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+// OpenGL 2.0 deprecated functions
+inline void QOpenGLFunctions_2_1::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_2_1::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+
+// OpenGL 2.1 deprecated functions
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_3_0.cpp b/src/opengl/qopenglfunctions_3_0.cpp
new file mode 100644
index 0000000000..9d933b50d5
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_0.cpp
@@ -0,0 +1,246 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_3_0.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_3_0
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_3_0 class provides all functions for OpenGL 3.0 specification.
+
+ This class is a wrapper for functions from OpenGL 3.0 specification.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_3_0::QOpenGLFunctions_3_0()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+ , m_reserved_2_0_Deprecated(nullptr)
+ , m_reserved_3_0_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_3_0::~QOpenGLFunctions_3_0()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_3_0::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_3_0::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_3_0::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(3, 0))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_3_0::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(3, 0);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_3_0.h b/src/opengl/qopenglfunctions_3_0.h
new file mode 100644
index 0000000000..cce2b32c81
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_0.h
@@ -0,0 +1,4174 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_3_0_H
+#define QOPENGLVERSIONFUNCTIONS_3_0_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_3_0 : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_3_0();
+ ~QOpenGLFunctions_3_0();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+ // OpenGL 2.0 deprecated functions
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+
+ // OpenGL 2.1 deprecated functions
+
+ // OpenGL 3.0 deprecated functions
+ void glVertexAttribI4usv(GLuint index, const GLushort *v);
+ void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttribI4sv(GLuint index, const GLshort *v);
+ void glVertexAttribI4bv(GLuint index, const GLbyte *v);
+ void glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI3uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI2uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI1uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI4iv(GLuint index, const GLint *v);
+ void glVertexAttribI3iv(GLuint index, const GLint *v);
+ void glVertexAttribI2iv(GLuint index, const GLint *v);
+ void glVertexAttribI1iv(GLuint index, const GLint *v);
+ void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ void glVertexAttribI1ui(GLuint index, GLuint x);
+ void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ void glVertexAttribI2i(GLuint index, GLint x, GLint y);
+ void glVertexAttribI1i(GLuint index, GLint x);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+ void *m_reserved_2_0_Deprecated; // To maintain BC
+ void *m_reserved_3_0_Deprecated; // To maintain BC
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_3_0::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_0::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_0::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_3_0::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_3_0::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_3_0::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_0::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_0::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_3_0::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_3_0::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_0::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_3_0::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_3_0::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_3_0::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_3_0::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_3_0::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_3_0::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_3_0::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_0::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_3_0::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_3_0::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_3_0::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_0::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_3_0::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_0::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_0::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_0::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_0::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_3_0::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_3_0::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_3_0::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_3_0::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_3_0::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_3_0::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_3_0::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_3_0::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_0::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_0::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_3_0::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_0::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_0::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_0::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_0::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_3_0::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_3_0::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_3_0::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_0::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_3_0::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_0::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_0::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_0::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_0::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_3_0::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_3_0::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_3_0::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_0::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_0::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_0::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_0::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_0::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_0::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_3_0::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_3_0::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_3_0::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_3_0::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_3_0::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_3_0::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_0::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_0::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_3_0::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_0::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_0::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_3_0::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_3_0::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_3_0::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_3_0::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_3_0::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_3_0::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_3_0::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_3_0::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_3_0::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_3_0::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_3_0::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_0::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_3_0::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_0::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_0::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_3_0::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_0::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_3_0::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_0::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_0::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_0::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_0::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_0::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_3_0::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_3_0::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_3_0::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_3_0::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_3_0::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_3_0::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_0::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_3_0::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_0::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_3_0::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_3_0::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_3_0::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_3_0::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_0::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_0::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_0::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_0::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_3_0::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_3_0::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_3_0::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_0::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_3_0::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_3_0::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_3_0::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_3_0::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_3_0::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_3_0::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_3_0::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_0::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_0::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_3_0::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_0::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_0::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_0::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_0::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_3_0::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_3_0::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_0::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_0::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_0::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_3_0::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_0::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_3_0::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_3_0::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_3_0::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_0::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_3_0::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_3_0::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_3_0::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_3_0::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_3_0::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_0::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_0::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_0::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_0::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_3_0::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_3_0::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_3_0::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_3_0::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_0::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_0::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_3_0::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_0::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_0::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_3_0::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_3_0::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_3_0::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_3_0::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_3_0::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_3_0::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_3_0::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_3_0::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_3_0::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_0::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_3_0::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_3_0::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_3_0::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_3_0::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_3_0::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_3_0::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_3_0::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_0::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_0::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_3_0::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_3_0::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_3_0::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_3_0::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_3_0::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_3_0::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_3_0::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_3_0::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_3_0::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_3_0::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_3_0::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_0::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_3_0::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_3_0::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_3_0::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_3_0::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_3_0::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_3_0::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_3_0::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_3_0::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_3_0::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_3_0::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_3_0::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_0::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_3_0::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_3_0::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_0::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_0::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_0::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_0::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_0::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_0::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_0::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_0::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_0::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_0::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_0::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_0::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_3_0::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_3_0::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_3_0::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_3_0::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_3_0::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_3_0::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_3_0::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_3_0::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_3_0::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_3_0::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_3_0::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_3_0::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_3_0::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_3_0::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_3_0::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_3_0::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_3_0::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_3_0::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_3_0::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_3_0::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_3_0::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_3_0::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_3_0::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_3_0::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_3_0::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_3_0::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_3_0::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_3_0::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_3_0::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_3_0::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_3_0::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_3_0::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_3_0::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_3_0::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_0::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_0::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_3_0::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_3_0::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_0::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_3_0::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_3_0::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_0::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_0::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_3_0::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_0::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_0::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_0::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_0::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_3_0::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_3_0::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_3_0::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_0::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_0::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_3_0::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_3_0::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_3_0::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+// OpenGL 2.0 deprecated functions
+inline void QOpenGLFunctions_3_0::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+
+// OpenGL 2.1 deprecated functions
+
+// OpenGL 3.0 deprecated functions
+inline void QOpenGLFunctions_3_0::glVertexAttribI4usv(GLuint index, const GLushort *v)
+{
+ d_3_0_Core->f.VertexAttribI4usv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI4sv(GLuint index, const GLshort *v)
+{
+ d_3_0_Core->f.VertexAttribI4sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4bv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI3uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI2uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI1uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI4iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI3iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI3iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI2iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI2iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI1iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI1iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+ d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+ d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+ d_3_0_Core->f.VertexAttribI2ui(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI1ui(GLuint index, GLuint x)
+{
+ d_3_0_Core->f.VertexAttribI1ui(index, x);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+ d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+ d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+ d_3_0_Core->f.VertexAttribI2i(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_0::glVertexAttribI1i(GLuint index, GLint x)
+{
+ d_3_0_Core->f.VertexAttribI1i(index, x);
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_3_1.cpp b/src/opengl/qopenglfunctions_3_1.cpp
new file mode 100644
index 0000000000..353ddf35ab
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_1.cpp
@@ -0,0 +1,205 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_3_1.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_3_1
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_3_1 class provides all functions for OpenGL 3.1 specification.
+
+ This class is a wrapper for functions from OpenGL 3.1 specification.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_3_1::QOpenGLFunctions_3_1()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+{
+}
+
+QOpenGLFunctions_3_1::~QOpenGLFunctions_3_1()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_3_1::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_3_1::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_3_1::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(3, 1))
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_3_1::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(3, 1);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_3_1.h b/src/opengl/qopenglfunctions_3_1.h
new file mode 100644
index 0000000000..cee5685a86
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_1.h
@@ -0,0 +1,1602 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_3_1_H
+#define QOPENGLVERSIONFUNCTIONS_3_1_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_3_1 : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_3_1();
+ ~QOpenGLFunctions_3_1();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_3_1::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_1::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_3_1::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_3_1::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_1::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_3_1::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_3_1::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_3_1::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_1::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_1::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_3_1::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_3_1::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_3_1::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_3_1::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_1::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_3_1::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_3_1::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_3_1::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_3_1::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_3_1::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_3_1::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_3_1::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_1::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_3_1::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_3_1::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_3_1::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_1::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_3_1::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_1::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_1::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_1::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_1::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_1::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_1::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_3_1::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_3_1::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_3_1::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_3_1::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_3_1::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_3_1::glIndexubv(const GLubyte *c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_1::glIndexub(GLubyte c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline GLboolean QOpenGLFunctions_3_1::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_3_1::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_1::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_1::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_3_1::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_1::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_1::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_1::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_1::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_3_1::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_3_1::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_3_1::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ Q_UNUSED(pname);
+ Q_UNUSED(params);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_1::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_1::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_3_1::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_1::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_1::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_1::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_1::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_3_1::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_3_1::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_3_1::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_1::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_1::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_1::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_1::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_1::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_1::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_3_1::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_3_1::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_3_1::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_1::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_3_1::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_3_1::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_3_1::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_3_1::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_3_1::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_3_1::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_1::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_1::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_3_1::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_3_1::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_1::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_1::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_3_1::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_3_1::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_3_1::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_3_1::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_3_1::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_3_1::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_1::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_3_1::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_3_1::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_3_1::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_3_1::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_3_1::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_3_1::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_3_1::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_3_1::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_3_1::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_1::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_3_1::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_1::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_1::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_3_1::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_1::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_3_1::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_1::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_1::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_1::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_1::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_1::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_3_1::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_3_1::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_3_1::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_3_1::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_3_1::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_3_1::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_1::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_3_1::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_1::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_3_1::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_3_1::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_3_1::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_3_1::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_1::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_1::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_1::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_1::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_3_1::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_3_1::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_3_1::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_1::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_3_1::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_3_1::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_3_1::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_3_1::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_3_1::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_3_1::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_3_1::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_1::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_1::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_1::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_3_1::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_1::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_1::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_1::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_1::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_1::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_3_1::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_3_1::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_1::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_1::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_1::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_1::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_3_1::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_1::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_3_1::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_1::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_3_1::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_3_1::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_3_1::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_1::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_3_1::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_3_1::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_3_1::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_3_1::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_3_1::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_3_1::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_1::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_1::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_1::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_1::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_3_1::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_3_1::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_3_1::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_3_1::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_3_1::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_3_1::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_3_1::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_3_1::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_3_1::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_3_1::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_3_1::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_3_1::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_3_2_compatibility.cpp b/src/opengl/qopenglfunctions_3_2_compatibility.cpp
new file mode 100644
index 0000000000..92c7b6e3ba
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_2_compatibility.cpp
@@ -0,0 +1,265 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_3_2_compatibility.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_3_2_Compatibility
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_3_2_Compatibility class provides all functions for OpenGL 3.2 compatibility profile.
+
+ This class is a wrapper for functions from OpenGL 3.2 compatibility profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_3_2_Compatibility::QOpenGLFunctions_3_2_Compatibility()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+ , m_reserved_2_0_Deprecated(nullptr)
+ , m_reserved_3_0_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_3_2_Compatibility::~QOpenGLFunctions_3_2_Compatibility()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_3_2_Compatibility::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_3_2_Compatibility::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_3_2_Compatibility::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(3, 2))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_3_2_Compatibility::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(3, 2);
+ v.setProfile(QSurfaceFormat::CompatibilityProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_3_2_compatibility.h b/src/opengl/qopenglfunctions_3_2_compatibility.h
new file mode 100644
index 0000000000..413b106b44
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_2_compatibility.h
@@ -0,0 +1,4378 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_3_2_COMPATIBILITY_H
+#define QOPENGLVERSIONFUNCTIONS_3_2_COMPATIBILITY_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_3_2_Compatibility : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_3_2_Compatibility();
+ ~QOpenGLFunctions_3_2_Compatibility();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+ // OpenGL 2.0 deprecated functions
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+
+ // OpenGL 2.1 deprecated functions
+
+ // OpenGL 3.0 deprecated functions
+ void glVertexAttribI4usv(GLuint index, const GLushort *v);
+ void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttribI4sv(GLuint index, const GLshort *v);
+ void glVertexAttribI4bv(GLuint index, const GLbyte *v);
+ void glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI3uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI2uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI1uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI4iv(GLuint index, const GLint *v);
+ void glVertexAttribI3iv(GLuint index, const GLint *v);
+ void glVertexAttribI2iv(GLuint index, const GLint *v);
+ void glVertexAttribI1iv(GLuint index, const GLint *v);
+ void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ void glVertexAttribI1ui(GLuint index, GLuint x);
+ void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ void glVertexAttribI2i(GLuint index, GLint x, GLint y);
+ void glVertexAttribI1i(GLuint index, GLint x);
+
+ // OpenGL 3.1 deprecated functions
+
+ // OpenGL 3.2 deprecated functions
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+ void *m_reserved_2_0_Deprecated; // To maintain BC
+ void *m_reserved_3_0_Deprecated; // To maintain BC
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_3_2_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_2_Compatibility::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_3_2_Compatibility::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_3_2_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_3_2_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_3_2_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_3_2_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_3_2_Compatibility::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_3_2_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_3_2_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_3_2_Compatibility::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_3_2_Compatibility::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_3_2_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_3_2_Compatibility::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_2_Compatibility::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_3_2_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_3_2_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_3_2_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_3_2_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_3_2_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_3_2_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_3_2_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_3_2_Compatibility::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_3_2_Compatibility::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_3_2_Compatibility::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_3_2_Compatibility::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_3_2_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+// OpenGL 2.0 deprecated functions
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+
+// OpenGL 2.1 deprecated functions
+
+// OpenGL 3.0 deprecated functions
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
+{
+ d_3_0_Core->f.VertexAttribI4usv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
+{
+ d_3_0_Core->f.VertexAttribI4sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4bv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI3uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI2uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI1uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI4iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI3iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI2iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI1iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+ d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+ d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+ d_3_0_Core->f.VertexAttribI2ui(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
+{
+ d_3_0_Core->f.VertexAttribI1ui(index, x);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+ d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+ d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+ d_3_0_Core->f.VertexAttribI2i(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_2_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
+{
+ d_3_0_Core->f.VertexAttribI1i(index, x);
+}
+
+
+// OpenGL 3.1 deprecated functions
+
+// OpenGL 3.2 deprecated functions
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_3_2_core.cpp b/src/opengl/qopenglfunctions_3_2_core.cpp
new file mode 100644
index 0000000000..5f7d32fb61
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_2_core.cpp
@@ -0,0 +1,215 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_3_2_core.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_3_2_Core
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_3_2_Core class provides all functions for OpenGL 3.2 core profile.
+
+ This class is a wrapper for functions from OpenGL 3.2 core profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_3_2_Core::QOpenGLFunctions_3_2_Core()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+{
+}
+
+QOpenGLFunctions_3_2_Core::~QOpenGLFunctions_3_2_Core()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_3_2_Core::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_3_2_Core::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_3_2_Core::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(3, 2))
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_3_2_Core::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(3, 2);
+ v.setProfile(QSurfaceFormat::CoreProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_3_2_core.h b/src/opengl/qopenglfunctions_3_2_core.h
new file mode 100644
index 0000000000..bcc07eeca1
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_2_core.h
@@ -0,0 +1,1721 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_3_2_CORE_H
+#define QOPENGLVERSIONFUNCTIONS_3_2_CORE_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_3_2_Core : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_3_2_Core();
+ ~QOpenGLFunctions_3_2_Core();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_3_2_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Core::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_2_Core::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_3_2_Core::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_3_2_Core::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_3_2_Core::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_3_2_Core::glIndexubv(const GLubyte *c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_2_Core::glIndexub(GLubyte c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Core::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ Q_UNUSED(pname);
+ Q_UNUSED(params);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_3_2_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_3_2_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_3_2_Core::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_3_2_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Core::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_3_2_Core::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Core::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Core::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_3_2_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Core::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Core::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_3_2_Core::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_3_2_Core::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_3_2_Core::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_3_2_Core::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_3_2_Core::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_3_2_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_3_2_Core::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_3_2_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_3_2_Core::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Core::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Core::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_2_Core::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_3_2_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_3_2_Core::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Core::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_3_2_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_3_2_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_3_2_Core::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_3_2_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_3_2_Core::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_3_2_Core::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_2_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_3_3_compatibility.cpp b/src/opengl/qopenglfunctions_3_3_compatibility.cpp
new file mode 100644
index 0000000000..9b9617c1e7
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_3_compatibility.cpp
@@ -0,0 +1,282 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_3_3_compatibility.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_3_3_Compatibility
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_3_3_Compatibility class provides all functions for OpenGL 3.3 compatibility profile.
+
+ This class is a wrapper for functions from OpenGL 3.3 compatibility profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_3_3_Compatibility::QOpenGLFunctions_3_3_Compatibility()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+ , m_reserved_2_0_Deprecated(nullptr)
+ , d_3_3_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_3_3_Compatibility::~QOpenGLFunctions_3_3_Compatibility()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+ if (d_3_3_Deprecated) {
+ d_3_3_Deprecated->refs.deref();
+ Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_3_3_Compatibility::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_3_3_Compatibility::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
+ d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_3_3_Compatibility::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(3, 3))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_3_3_Compatibility::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(3, 3);
+ v.setProfile(QSurfaceFormat::CompatibilityProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_3_3_compatibility.h b/src/opengl/qopenglfunctions_3_3_compatibility.h
new file mode 100644
index 0000000000..ee8884d6b0
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_3_compatibility.h
@@ -0,0 +1,4735 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_3_3_COMPATIBILITY_H
+#define QOPENGLVERSIONFUNCTIONS_3_3_COMPATIBILITY_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_3_3_Compatibility : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_3_3_Compatibility();
+ ~QOpenGLFunctions_3_3_Compatibility();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+ // OpenGL 2.0 deprecated functions
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+
+ // OpenGL 2.1 deprecated functions
+
+ // OpenGL 3.0 deprecated functions
+ void glVertexAttribI4usv(GLuint index, const GLushort *v);
+ void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttribI4sv(GLuint index, const GLshort *v);
+ void glVertexAttribI4bv(GLuint index, const GLbyte *v);
+ void glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI3uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI2uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI1uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI4iv(GLuint index, const GLint *v);
+ void glVertexAttribI3iv(GLuint index, const GLint *v);
+ void glVertexAttribI2iv(GLuint index, const GLint *v);
+ void glVertexAttribI1iv(GLuint index, const GLint *v);
+ void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ void glVertexAttribI1ui(GLuint index, GLuint x);
+ void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ void glVertexAttribI2i(GLuint index, GLint x, GLint y);
+ void glVertexAttribI1i(GLuint index, GLint x);
+
+ // OpenGL 3.1 deprecated functions
+
+ // OpenGL 3.2 deprecated functions
+
+ // OpenGL 3.3 deprecated functions
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+ void *m_reserved_2_0_Deprecated; // To maintain BC
+ QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_3_3_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_3_Compatibility::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_3_3_Compatibility::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_3_3_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_3_3_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_3_3_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_3_3_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_3_3_Compatibility::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_3_3_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_3_3_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_3_3_Compatibility::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_3_3_Compatibility::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_3_3_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_3_3_Compatibility::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_3_Compatibility::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_3_3_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_3_3_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_3_3_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_3_3_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_3_3_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_3_3_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP4uiv(type, color);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorP4ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP4ui(type, color);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.NormalP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.NormalP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP4uiv(type, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexP4ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP4ui(type, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP3uiv(type, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexP3ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP3ui(type, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP2uiv(type, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexP2ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP2ui(type, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_3_3_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_3_3_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_3_3_Compatibility::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_3_3_Compatibility::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_3_3_Compatibility::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_3_3_Compatibility::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_3_3_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+// OpenGL 2.0 deprecated functions
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+
+// OpenGL 2.1 deprecated functions
+
+// OpenGL 3.0 deprecated functions
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
+{
+ d_3_0_Core->f.VertexAttribI4usv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
+{
+ d_3_0_Core->f.VertexAttribI4sv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4bv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI3uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI2uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI1uiv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI4iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI3iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI2iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI1iv(index, v);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+ d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+ d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+ d_3_0_Core->f.VertexAttribI2ui(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
+{
+ d_3_0_Core->f.VertexAttribI1ui(index, x);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+ d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+ d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+ d_3_0_Core->f.VertexAttribI2i(index, x, y);
+}
+
+inline void QOpenGLFunctions_3_3_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
+{
+ d_3_0_Core->f.VertexAttribI1i(index, x);
+}
+
+
+// OpenGL 3.1 deprecated functions
+
+// OpenGL 3.2 deprecated functions
+
+// OpenGL 3.3 deprecated functions
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_3_3_core.cpp b/src/opengl/qopenglfunctions_3_3_core.cpp
new file mode 100644
index 0000000000..78a2e8b568
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_3_core.cpp
@@ -0,0 +1,224 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_3_3_core.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_3_3_Core
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_3_3_Core class provides all functions for OpenGL 3.3 core profile.
+
+ This class is a wrapper for functions from OpenGL 3.3 core profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_3_3_Core::QOpenGLFunctions_3_3_Core()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+{
+}
+
+QOpenGLFunctions_3_3_Core::~QOpenGLFunctions_3_3_Core()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_3_3_Core::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_3_3_Core::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_3_3_Core::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(3, 3))
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_3_3_Core::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(3, 3);
+ v.setProfile(QSurfaceFormat::CoreProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_3_3_core.h b/src/opengl/qopenglfunctions_3_3_core.h
new file mode 100644
index 0000000000..b38f9c54e5
--- /dev/null
+++ b/src/opengl/qopenglfunctions_3_3_core.h
@@ -0,0 +1,2142 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_3_3_CORE_H
+#define QOPENGLVERSIONFUNCTIONS_3_3_CORE_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_3_3_Core : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_3_3_Core();
+ ~QOpenGLFunctions_3_3_Core();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_3_3_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_3_Core::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_3_3_Core::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_3_3_Core::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_3_3_Core::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_3_3_Core::glIndexubv(const GLubyte *c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glIndexub(GLubyte c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ Q_UNUSED(pname);
+ Q_UNUSED(params);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_3_3_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_3_3_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_3_3_Core::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_3_3_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_3_3_Core::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_3_3_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_3_3_Core::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_3_3_Core::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_3_3_Core::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_3_3_Core::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_3_3_Core::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_3_3_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_3_3_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_3_3_Core::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_3_3_Core::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_3_3_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_3_3_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_3_3_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_3_3_Core::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_3_3_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_3_3_Core::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_3_3_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glColorP4ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glColorP3ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glNormalP3ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexP4ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexP3ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexP2ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_3_3_Core::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_3_3_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+inline void QOpenGLFunctions_3_3_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_0_compatibility.cpp b/src/opengl/qopenglfunctions_4_0_compatibility.cpp
new file mode 100644
index 0000000000..e94a0bf5ab
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_0_compatibility.cpp
@@ -0,0 +1,291 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_0_compatibility.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_0_Compatibility
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_4_0_Compatibility class provides all functions for OpenGL 4.0 compatibility profile.
+
+ This class is a wrapper for functions from OpenGL 4.0 compatibility profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_0_Compatibility::QOpenGLFunctions_4_0_Compatibility()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+ , m_reserved_2_0_Deprecated(nullptr)
+ , d_3_3_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_4_0_Compatibility::~QOpenGLFunctions_4_0_Compatibility()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+ if (d_3_3_Deprecated) {
+ d_3_3_Deprecated->refs.deref();
+ Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_0_Compatibility::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_0_Compatibility::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
+ d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_0_Compatibility::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 0))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_0_Compatibility::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 0);
+ v.setProfile(QSurfaceFormat::CompatibilityProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_0_compatibility.h b/src/opengl/qopenglfunctions_4_0_compatibility.h
new file mode 100644
index 0000000000..8b6027e0fc
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_0_compatibility.h
@@ -0,0 +1,5020 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_0_COMPATIBILITY_H
+#define QOPENGLVERSIONFUNCTIONS_4_0_COMPATIBILITY_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_0_Compatibility : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_0_Compatibility();
+ ~QOpenGLFunctions_4_0_Compatibility();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
+ void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+ // OpenGL 2.0 deprecated functions
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+
+ // OpenGL 2.1 deprecated functions
+
+ // OpenGL 3.0 deprecated functions
+ void glVertexAttribI4usv(GLuint index, const GLushort *v);
+ void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttribI4sv(GLuint index, const GLshort *v);
+ void glVertexAttribI4bv(GLuint index, const GLbyte *v);
+ void glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI3uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI2uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI1uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI4iv(GLuint index, const GLint *v);
+ void glVertexAttribI3iv(GLuint index, const GLint *v);
+ void glVertexAttribI2iv(GLuint index, const GLint *v);
+ void glVertexAttribI1iv(GLuint index, const GLint *v);
+ void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ void glVertexAttribI1ui(GLuint index, GLuint x);
+ void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ void glVertexAttribI2i(GLuint index, GLint x, GLint y);
+ void glVertexAttribI1i(GLuint index, GLint x);
+
+ // OpenGL 3.1 deprecated functions
+
+ // OpenGL 3.2 deprecated functions
+
+ // OpenGL 3.3 deprecated functions
+
+ // OpenGL 4.0 deprecated functions
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+ void *m_reserved_2_0_Deprecated; // To maintain BC
+ QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_0_Compatibility::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_4_0_Compatibility::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_4_0_Compatibility::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_0_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_0_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_0_Compatibility::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_0_Compatibility::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_4_0_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_0_Compatibility::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_0_Compatibility::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_0_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_0_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_0_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_0_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP4uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorP4ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP4ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.NormalP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.NormalP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP4uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexP4ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP4ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP3uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexP3ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP3ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP2uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexP2ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP2ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_0_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_0_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_0_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_0_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_4_0_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_4_0_Compatibility::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_4_0_Compatibility::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_4_0_Compatibility::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_4_0_Compatibility::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_4_0_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+// OpenGL 2.0 deprecated functions
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+
+// OpenGL 2.1 deprecated functions
+
+// OpenGL 3.0 deprecated functions
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
+{
+ d_3_0_Core->f.VertexAttribI4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
+{
+ d_3_0_Core->f.VertexAttribI4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI3uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI2uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI1uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI3iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI2iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI1iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+ d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+ d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+ d_3_0_Core->f.VertexAttribI2ui(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
+{
+ d_3_0_Core->f.VertexAttribI1ui(index, x);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+ d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+ d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+ d_3_0_Core->f.VertexAttribI2i(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
+{
+ d_3_0_Core->f.VertexAttribI1i(index, x);
+}
+
+
+// OpenGL 3.1 deprecated functions
+
+// OpenGL 3.2 deprecated functions
+
+// OpenGL 3.3 deprecated functions
+
+// OpenGL 4.0 deprecated functions
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_0_core.cpp b/src/opengl/qopenglfunctions_4_0_core.cpp
new file mode 100644
index 0000000000..a5fc44f31d
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_0_core.cpp
@@ -0,0 +1,233 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_0_core.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_0_Core
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_4_0_Core class provides all functions for OpenGL 4.0 core profile.
+
+ This class is a wrapper for functions from OpenGL 4.0 core profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_0_Core::QOpenGLFunctions_4_0_Core()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+{
+}
+
+QOpenGLFunctions_4_0_Core::~QOpenGLFunctions_4_0_Core()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_0_Core::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_0_Core::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_0_Core::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 0))
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_0_Core::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 0);
+ v.setProfile(QSurfaceFormat::CoreProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_0_core.h b/src/opengl/qopenglfunctions_4_0_core.h
new file mode 100644
index 0000000000..8553bada6e
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_0_core.h
@@ -0,0 +1,2423 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_0_CORE_H
+#define QOPENGLVERSIONFUNCTIONS_4_0_CORE_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_0_Core : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_0_Core();
+ ~QOpenGLFunctions_4_0_Core();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
+ void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_0_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_0_Core::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_4_0_Core::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_0_Core::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_0_Core::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_4_0_Core::glIndexubv(const GLubyte *c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glIndexub(GLubyte c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ Q_UNUSED(pname);
+ Q_UNUSED(params);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_0_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_0_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_0_Core::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_0_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_4_0_Core::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_0_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_0_Core::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_0_Core::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_0_Core::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_0_Core::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_0_Core::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_4_0_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_0_Core::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_0_Core::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_0_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_0_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_0_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_0_Core::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_0_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_0_Core::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_0_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glColorP4ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glColorP3ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glNormalP3ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexP4ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexP3ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexP2ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_0_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_0_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_0_Core::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_0_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_0_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_0_Core::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_1_compatibility.cpp b/src/opengl/qopenglfunctions_4_1_compatibility.cpp
new file mode 100644
index 0000000000..6198412ebc
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_1_compatibility.cpp
@@ -0,0 +1,300 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_1_compatibility.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_1_Compatibility
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_4_1_Compatibility class provides all functions for OpenGL 4.1 compatibility profile.
+
+ This class is a wrapper for functions from OpenGL 4.1 compatibility profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_1_Compatibility::QOpenGLFunctions_4_1_Compatibility()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+ , d_4_1_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+ , m_reserved_2_0_Deprecated(nullptr)
+ , d_3_3_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_4_1_Compatibility::~QOpenGLFunctions_4_1_Compatibility()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+ if (d_4_1_Core) {
+ d_4_1_Core->refs.deref();
+ Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+ if (d_3_3_Deprecated) {
+ d_3_3_Deprecated->refs.deref();
+ Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_1_Compatibility::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_1_Compatibility::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
+ d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
+ d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_1_Compatibility::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 1))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_1_Compatibility::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 1);
+ v.setProfile(QSurfaceFormat::CompatibilityProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_1_compatibility.h b/src/opengl/qopenglfunctions_4_1_compatibility.h
new file mode 100644
index 0000000000..72d122e1f2
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_1_compatibility.h
@@ -0,0 +1,5557 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_1_COMPATIBILITY_H
+#define QOPENGLVERSIONFUNCTIONS_4_1_COMPATIBILITY_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_1_Compatibility : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_1_Compatibility();
+ ~QOpenGLFunctions_4_1_Compatibility();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
+ void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+ // OpenGL 4.1 core functions
+ void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
+ void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
+ void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
+ void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
+ void glScissorIndexedv(GLuint index, const GLint *v);
+ void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+ void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
+ void glViewportIndexedfv(GLuint index, const GLfloat *v);
+ void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+ void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
+ void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
+ void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glVertexAttribL4dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL3dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL2dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL1dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttribL1d(GLuint index, GLdouble x);
+ void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glValidateProgramPipeline(GLuint pipeline);
+ void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+ void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+ void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
+ void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+ void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+ void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
+ void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform1i(GLuint program, GLint location, GLint v0);
+ void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ GLboolean glIsProgramPipeline(GLuint pipeline);
+ void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ void glBindProgramPipeline(GLuint pipeline);
+ GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
+ void glActiveShaderProgram(GLuint pipeline, GLuint program);
+ void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ void glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
+ void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
+ void glClearDepthf(GLfloat dd);
+ void glDepthRangef(GLfloat n, GLfloat f);
+ void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+ void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
+ void glReleaseShaderCompiler();
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+ // OpenGL 2.0 deprecated functions
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+
+ // OpenGL 2.1 deprecated functions
+
+ // OpenGL 3.0 deprecated functions
+ void glVertexAttribI4usv(GLuint index, const GLushort *v);
+ void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttribI4sv(GLuint index, const GLshort *v);
+ void glVertexAttribI4bv(GLuint index, const GLbyte *v);
+ void glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI3uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI2uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI1uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI4iv(GLuint index, const GLint *v);
+ void glVertexAttribI3iv(GLuint index, const GLint *v);
+ void glVertexAttribI2iv(GLuint index, const GLint *v);
+ void glVertexAttribI1iv(GLuint index, const GLint *v);
+ void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ void glVertexAttribI1ui(GLuint index, GLuint x);
+ void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ void glVertexAttribI2i(GLuint index, GLint x, GLint y);
+ void glVertexAttribI1i(GLuint index, GLint x);
+
+ // OpenGL 3.1 deprecated functions
+
+ // OpenGL 3.2 deprecated functions
+
+ // OpenGL 3.3 deprecated functions
+
+ // OpenGL 4.0 deprecated functions
+
+ // OpenGL 4.1 deprecated functions
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+ QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+ void *m_reserved_2_0_Deprecated; // To maintain BC
+ QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_1_Compatibility::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_4_1_Compatibility::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_4_1_Compatibility::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_1_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_1_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_1_Compatibility::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_1_Compatibility::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_4_1_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_1_Compatibility::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_1_Compatibility::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_1_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_1_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_1_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_1_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP4uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorP4ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP4ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.NormalP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.NormalP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP4uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexP4ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP4ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP3uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexP3ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP3ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP2uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexP2ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP2ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_1_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_1_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_1_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+// OpenGL 4.1 core functions
+inline void QOpenGLFunctions_4_1_Compatibility::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
+{
+ d_4_1_Core->f.GetDoublei_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
+{
+ d_4_1_Core->f.GetFloati_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
+{
+ d_4_1_Core->f.DepthRangeIndexed(index, n, f);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
+{
+ d_4_1_Core->f.DepthRangeArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glScissorIndexedv(GLuint index, const GLint *v)
+{
+ d_4_1_Core->f.ScissorIndexedv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
+{
+ d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
+{
+ d_4_1_Core->f.ScissorArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glViewportIndexedfv(GLuint index, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportIndexedfv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
+{
+ d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL4dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL3dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL2dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL1dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_4_1_Core->f.VertexAttribL2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribL1d(GLuint index, GLdouble x)
+{
+ d_4_1_Core->f.VertexAttribL1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glValidateProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.ValidateProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
+{
+ d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
+{
+ d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+ d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+{
+ d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+ d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+{
+ d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
+{
+ d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
+{
+ d_4_1_Core->f.ProgramUniform1d(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+{
+ d_4_1_Core->f.ProgramUniform1f(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramUniform1i(GLuint program, GLint location, GLint v0)
+{
+ d_4_1_Core->f.ProgramUniform1i(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
+{
+ d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsProgramPipeline(GLuint pipeline)
+{
+ return d_4_1_Core->f.IsProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_1_Core->f.GenProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
+{
+ d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBindProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.BindProgramPipeline(pipeline);
+}
+
+inline GLuint QOpenGLFunctions_4_1_Compatibility::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
+{
+ return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glActiveShaderProgram(GLuint pipeline, GLuint program)
+{
+ d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
+{
+ d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+ d_4_1_Core->f.ProgramParameteri(program, pname, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
+{
+ d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClearDepthf(GLfloat dd)
+{
+ d_4_1_Core->f.ClearDepthf(dd);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDepthRangef(GLfloat n, GLfloat f)
+{
+ d_4_1_Core->f.DepthRangef(n, f);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
+{
+ d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glReleaseShaderCompiler()
+{
+ d_4_1_Core->f.ReleaseShaderCompiler();
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_4_1_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_4_1_Compatibility::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_4_1_Compatibility::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_4_1_Compatibility::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_4_1_Compatibility::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_4_1_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+// OpenGL 2.0 deprecated functions
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+
+// OpenGL 2.1 deprecated functions
+
+// OpenGL 3.0 deprecated functions
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
+{
+ d_3_0_Core->f.VertexAttribI4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
+{
+ d_3_0_Core->f.VertexAttribI4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI3uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI2uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI1uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI3iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI2iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI1iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+ d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+ d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+ d_3_0_Core->f.VertexAttribI2ui(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
+{
+ d_3_0_Core->f.VertexAttribI1ui(index, x);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+ d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+ d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+ d_3_0_Core->f.VertexAttribI2i(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
+{
+ d_3_0_Core->f.VertexAttribI1i(index, x);
+}
+
+
+// OpenGL 3.1 deprecated functions
+
+// OpenGL 3.2 deprecated functions
+
+// OpenGL 3.3 deprecated functions
+
+// OpenGL 4.0 deprecated functions
+
+// OpenGL 4.1 deprecated functions
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_1_core.cpp b/src/opengl/qopenglfunctions_4_1_core.cpp
new file mode 100644
index 0000000000..81eedaa7bb
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_1_core.cpp
@@ -0,0 +1,242 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_1_core.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_1_Core
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_4_1_Core class provides all functions for OpenGL 4.1 core profile.
+
+ This class is a wrapper for functions from OpenGL 4.1 core profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_1_Core::QOpenGLFunctions_4_1_Core()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+ , d_4_1_Core(nullptr)
+{
+}
+
+QOpenGLFunctions_4_1_Core::~QOpenGLFunctions_4_1_Core()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+ if (d_4_1_Core) {
+ d_4_1_Core->refs.deref();
+ Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_1_Core::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_1_Core::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
+ d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_1_Core::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 1))
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_1_Core::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 1);
+ v.setProfile(QSurfaceFormat::CoreProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_1_core.h b/src/opengl/qopenglfunctions_4_1_core.h
new file mode 100644
index 0000000000..8c2f5bce3e
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_1_core.h
@@ -0,0 +1,2956 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_1_CORE_H
+#define QOPENGLVERSIONFUNCTIONS_4_1_CORE_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_1_Core : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_1_Core();
+ ~QOpenGLFunctions_4_1_Core();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
+ void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+ // OpenGL 4.1 core functions
+ void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
+ void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
+ void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
+ void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
+ void glScissorIndexedv(GLuint index, const GLint *v);
+ void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+ void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
+ void glViewportIndexedfv(GLuint index, const GLfloat *v);
+ void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+ void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
+ void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
+ void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glVertexAttribL4dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL3dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL2dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL1dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttribL1d(GLuint index, GLdouble x);
+ void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glValidateProgramPipeline(GLuint pipeline);
+ void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+ void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+ void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
+ void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+ void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+ void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
+ void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform1i(GLuint program, GLint location, GLint v0);
+ void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ GLboolean glIsProgramPipeline(GLuint pipeline);
+ void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ void glBindProgramPipeline(GLuint pipeline);
+ GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
+ void glActiveShaderProgram(GLuint pipeline, GLuint program);
+ void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ void glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
+ void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
+ void glClearDepthf(GLfloat dd);
+ void glDepthRangef(GLfloat n, GLfloat f);
+ void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+ void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
+ void glReleaseShaderCompiler();
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+ QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_1_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_1_Core::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_4_1_Core::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_1_Core::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_1_Core::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_4_1_Core::glIndexubv(const GLubyte *c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glIndexub(GLubyte c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ Q_UNUSED(pname);
+ Q_UNUSED(params);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_1_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_1_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_1_Core::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_1_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_4_1_Core::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_1_Core::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_1_Core::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_1_Core::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_1_Core::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_1_Core::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_4_1_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_1_Core::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_1_Core::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_1_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_1_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_1_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_1_Core::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_1_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_1_Core::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glColorP4ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glColorP3ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glNormalP3ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexP4ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexP3ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexP2ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_1_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_1_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_1_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_1_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+// OpenGL 4.1 core functions
+inline void QOpenGLFunctions_4_1_Core::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
+{
+ d_4_1_Core->f.GetDoublei_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
+{
+ d_4_1_Core->f.GetFloati_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
+{
+ d_4_1_Core->f.DepthRangeIndexed(index, n, f);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
+{
+ d_4_1_Core->f.DepthRangeArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glScissorIndexedv(GLuint index, const GLint *v)
+{
+ d_4_1_Core->f.ScissorIndexedv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
+{
+ d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
+{
+ d_4_1_Core->f.ScissorArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glViewportIndexedfv(GLuint index, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportIndexedfv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
+{
+ d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribL4dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribL3dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribL2dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribL1dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_4_1_Core->f.VertexAttribL2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glVertexAttribL1d(GLuint index, GLdouble x)
+{
+ d_4_1_Core->f.VertexAttribL1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glValidateProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.ValidateProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
+{
+ d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
+{
+ d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+ d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+{
+ d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+ d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+{
+ d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
+{
+ d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
+{
+ d_4_1_Core->f.ProgramUniform1d(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+{
+ d_4_1_Core->f.ProgramUniform1f(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramUniform1i(GLuint program, GLint location, GLint v0)
+{
+ d_4_1_Core->f.ProgramUniform1i(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
+{
+ d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_1_Core::glIsProgramPipeline(GLuint pipeline)
+{
+ return d_4_1_Core->f.IsProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_1_Core->f.GenProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
+{
+ d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glBindProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.BindProgramPipeline(pipeline);
+}
+
+inline GLuint QOpenGLFunctions_4_1_Core::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
+{
+ return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glActiveShaderProgram(GLuint pipeline, GLuint program)
+{
+ d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
+{
+ d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+ d_4_1_Core->f.ProgramParameteri(program, pname, value);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
+{
+ d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glClearDepthf(GLfloat dd)
+{
+ d_4_1_Core->f.ClearDepthf(dd);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glDepthRangef(GLfloat n, GLfloat f)
+{
+ d_4_1_Core->f.DepthRangef(n, f);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
+{
+ d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_1_Core::glReleaseShaderCompiler()
+{
+ d_4_1_Core->f.ReleaseShaderCompiler();
+}
+
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_2_compatibility.cpp b/src/opengl/qopenglfunctions_4_2_compatibility.cpp
new file mode 100644
index 0000000000..f04a30854b
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_2_compatibility.cpp
@@ -0,0 +1,309 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_2_compatibility.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_2_Compatibility
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_4_2_Compatibility class provides all functions for OpenGL 4.2 compatibility profile.
+
+ This class is a wrapper for functions from OpenGL 4.2 compatibility profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_2_Compatibility::QOpenGLFunctions_4_2_Compatibility()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+ , d_4_1_Core(nullptr)
+ , d_4_2_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+ , m_reserved_2_0_Deprecated(nullptr)
+ , d_3_3_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_4_2_Compatibility::~QOpenGLFunctions_4_2_Compatibility()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+ if (d_4_1_Core) {
+ d_4_1_Core->refs.deref();
+ Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
+ }
+ if (d_4_2_Core) {
+ d_4_2_Core->refs.deref();
+ Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+ if (d_3_3_Deprecated) {
+ d_3_3_Deprecated->refs.deref();
+ Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_2_Compatibility::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_2_Compatibility::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
+ d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
+ d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
+ d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_2_Compatibility::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 2))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_2_Compatibility::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 2);
+ v.setProfile(QSurfaceFormat::CompatibilityProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_2_compatibility.h b/src/opengl/qopenglfunctions_4_2_compatibility.h
new file mode 100644
index 0000000000..6fca54752d
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_2_compatibility.h
@@ -0,0 +1,5648 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_2_COMPATIBILITY_H
+#define QOPENGLVERSIONFUNCTIONS_4_2_COMPATIBILITY_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+// MemoryBarrier is a macro on some architectures on Windows
+#ifdef Q_OS_WIN
+#pragma push_macro("MemoryBarrier")
+#undef MemoryBarrier
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_2_Compatibility : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_2_Compatibility();
+ ~QOpenGLFunctions_4_2_Compatibility();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
+ void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+ // OpenGL 4.1 core functions
+ void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
+ void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
+ void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
+ void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
+ void glScissorIndexedv(GLuint index, const GLint *v);
+ void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+ void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
+ void glViewportIndexedfv(GLuint index, const GLfloat *v);
+ void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+ void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
+ void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
+ void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glVertexAttribL4dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL3dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL2dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL1dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttribL1d(GLuint index, GLdouble x);
+ void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glValidateProgramPipeline(GLuint pipeline);
+ void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+ void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+ void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
+ void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+ void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+ void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
+ void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform1i(GLuint program, GLint location, GLint v0);
+ void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ GLboolean glIsProgramPipeline(GLuint pipeline);
+ void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ void glBindProgramPipeline(GLuint pipeline);
+ GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
+ void glActiveShaderProgram(GLuint pipeline, GLuint program);
+ void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ void glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
+ void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
+ void glClearDepthf(GLfloat dd);
+ void glDepthRangef(GLfloat n, GLfloat f);
+ void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+ void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
+ void glReleaseShaderCompiler();
+
+ // OpenGL 4.2 core functions
+ void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+ void glMemoryBarrier(GLbitfield barriers);
+ void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+ void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+ void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+ void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+ void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
+ void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+ void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+ void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+ // OpenGL 2.0 deprecated functions
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+
+ // OpenGL 2.1 deprecated functions
+
+ // OpenGL 3.0 deprecated functions
+ void glVertexAttribI4usv(GLuint index, const GLushort *v);
+ void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttribI4sv(GLuint index, const GLshort *v);
+ void glVertexAttribI4bv(GLuint index, const GLbyte *v);
+ void glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI3uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI2uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI1uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI4iv(GLuint index, const GLint *v);
+ void glVertexAttribI3iv(GLuint index, const GLint *v);
+ void glVertexAttribI2iv(GLuint index, const GLint *v);
+ void glVertexAttribI1iv(GLuint index, const GLint *v);
+ void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ void glVertexAttribI1ui(GLuint index, GLuint x);
+ void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ void glVertexAttribI2i(GLuint index, GLint x, GLint y);
+ void glVertexAttribI1i(GLuint index, GLint x);
+
+ // OpenGL 3.1 deprecated functions
+
+ // OpenGL 3.2 deprecated functions
+
+ // OpenGL 3.3 deprecated functions
+
+ // OpenGL 4.0 deprecated functions
+
+ // OpenGL 4.1 deprecated functions
+
+ // OpenGL 4.2 deprecated functions
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+ QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
+ QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+ void *m_reserved_2_0_Deprecated; // To maintain BC
+ QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_2_Compatibility::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_4_2_Compatibility::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_4_2_Compatibility::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_2_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_2_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_2_Compatibility::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_2_Compatibility::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_4_2_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_2_Compatibility::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_2_Compatibility::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_2_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_2_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_2_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_2_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP4uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorP4ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP4ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.NormalP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.NormalP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP4uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexP4ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP4ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP3uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexP3ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP3ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP2uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexP2ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP2ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_2_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_2_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_2_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+// OpenGL 4.1 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
+{
+ d_4_1_Core->f.GetDoublei_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
+{
+ d_4_1_Core->f.GetFloati_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
+{
+ d_4_1_Core->f.DepthRangeIndexed(index, n, f);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
+{
+ d_4_1_Core->f.DepthRangeArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glScissorIndexedv(GLuint index, const GLint *v)
+{
+ d_4_1_Core->f.ScissorIndexedv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
+{
+ d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
+{
+ d_4_1_Core->f.ScissorArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glViewportIndexedfv(GLuint index, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportIndexedfv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
+{
+ d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL4dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL3dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL2dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL1dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_4_1_Core->f.VertexAttribL2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribL1d(GLuint index, GLdouble x)
+{
+ d_4_1_Core->f.VertexAttribL1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glValidateProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.ValidateProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
+{
+ d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
+{
+ d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+ d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+{
+ d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+ d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+{
+ d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
+{
+ d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
+{
+ d_4_1_Core->f.ProgramUniform1d(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+{
+ d_4_1_Core->f.ProgramUniform1f(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramUniform1i(GLuint program, GLint location, GLint v0)
+{
+ d_4_1_Core->f.ProgramUniform1i(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
+{
+ d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsProgramPipeline(GLuint pipeline)
+{
+ return d_4_1_Core->f.IsProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_1_Core->f.GenProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
+{
+ d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.BindProgramPipeline(pipeline);
+}
+
+inline GLuint QOpenGLFunctions_4_2_Compatibility::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
+{
+ return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glActiveShaderProgram(GLuint pipeline, GLuint program)
+{
+ d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
+{
+ d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+ d_4_1_Core->f.ProgramParameteri(program, pname, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
+{
+ d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClearDepthf(GLfloat dd)
+{
+ d_4_1_Core->f.ClearDepthf(dd);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDepthRangef(GLfloat n, GLfloat f)
+{
+ d_4_1_Core->f.DepthRangef(n, f);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
+{
+ d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glReleaseShaderCompiler()
+{
+ d_4_1_Core->f.ReleaseShaderCompiler();
+}
+
+
+// OpenGL 4.2 core functions
+inline void QOpenGLFunctions_4_2_Compatibility::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+ d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMemoryBarrier(GLbitfield barriers)
+{
+ d_4_2_Core->f.MemoryBarrier(barriers);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
+{
+ d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
+{
+ d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
+{
+ d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_4_2_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_4_2_Compatibility::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_4_2_Compatibility::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_4_2_Compatibility::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_4_2_Compatibility::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_4_2_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+// OpenGL 2.0 deprecated functions
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+
+// OpenGL 2.1 deprecated functions
+
+// OpenGL 3.0 deprecated functions
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
+{
+ d_3_0_Core->f.VertexAttribI4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
+{
+ d_3_0_Core->f.VertexAttribI4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI3uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI2uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI1uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI3iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI2iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI1iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+ d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+ d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+ d_3_0_Core->f.VertexAttribI2ui(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
+{
+ d_3_0_Core->f.VertexAttribI1ui(index, x);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+ d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+ d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+ d_3_0_Core->f.VertexAttribI2i(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
+{
+ d_3_0_Core->f.VertexAttribI1i(index, x);
+}
+
+
+// OpenGL 3.1 deprecated functions
+
+// OpenGL 3.2 deprecated functions
+
+// OpenGL 3.3 deprecated functions
+
+// OpenGL 4.0 deprecated functions
+
+// OpenGL 4.1 deprecated functions
+
+// OpenGL 4.2 deprecated functions
+
+
+QT_END_NAMESPACE
+
+#ifdef Q_OS_WIN
+#pragma pop_macro("MemoryBarrier")
+#endif
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_2_core.cpp b/src/opengl/qopenglfunctions_4_2_core.cpp
new file mode 100644
index 0000000000..15d7eba25a
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_2_core.cpp
@@ -0,0 +1,251 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_2_core.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_2_Core
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_4_2_Core class provides all functions for OpenGL 4.2 core profile.
+
+ This class is a wrapper for functions from OpenGL 4.2 core profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_2_Core::QOpenGLFunctions_4_2_Core()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+ , d_4_1_Core(nullptr)
+ , d_4_2_Core(nullptr)
+{
+}
+
+QOpenGLFunctions_4_2_Core::~QOpenGLFunctions_4_2_Core()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+ if (d_4_1_Core) {
+ d_4_1_Core->refs.deref();
+ Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
+ }
+ if (d_4_2_Core) {
+ d_4_2_Core->refs.deref();
+ Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_2_Core::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_2_Core::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
+ d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
+ d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_2_Core::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 2))
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_2_Core::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 2);
+ v.setProfile(QSurfaceFormat::CoreProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_2_core.h b/src/opengl/qopenglfunctions_4_2_core.h
new file mode 100644
index 0000000000..88e19fe1bc
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_2_core.h
@@ -0,0 +1,3043 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_2_CORE_H
+#define QOPENGLVERSIONFUNCTIONS_4_2_CORE_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+// MemoryBarrier is a macro on some architectures on Windows
+#ifdef Q_OS_WIN
+#pragma push_macro("MemoryBarrier")
+#undef MemoryBarrier
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_2_Core : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_2_Core();
+ ~QOpenGLFunctions_4_2_Core();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
+ void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+ // OpenGL 4.1 core functions
+ void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
+ void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
+ void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
+ void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
+ void glScissorIndexedv(GLuint index, const GLint *v);
+ void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+ void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
+ void glViewportIndexedfv(GLuint index, const GLfloat *v);
+ void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+ void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
+ void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
+ void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glVertexAttribL4dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL3dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL2dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL1dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttribL1d(GLuint index, GLdouble x);
+ void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glValidateProgramPipeline(GLuint pipeline);
+ void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+ void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+ void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
+ void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+ void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+ void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
+ void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform1i(GLuint program, GLint location, GLint v0);
+ void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ GLboolean glIsProgramPipeline(GLuint pipeline);
+ void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ void glBindProgramPipeline(GLuint pipeline);
+ GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
+ void glActiveShaderProgram(GLuint pipeline, GLuint program);
+ void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ void glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
+ void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
+ void glClearDepthf(GLfloat dd);
+ void glDepthRangef(GLfloat n, GLfloat f);
+ void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+ void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
+ void glReleaseShaderCompiler();
+
+ // OpenGL 4.2 core functions
+ void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+ void glMemoryBarrier(GLbitfield barriers);
+ void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+ void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+ void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+ void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+ void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
+ void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+ void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+ void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+ QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
+ QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_2_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_2_Core::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_4_2_Core::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_2_Core::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_2_Core::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_4_2_Core::glIndexubv(const GLubyte *c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glIndexub(GLubyte c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ Q_UNUSED(pname);
+ Q_UNUSED(params);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_2_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_2_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_2_Core::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_2_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_4_2_Core::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_2_Core::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_2_Core::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_2_Core::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_2_Core::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_2_Core::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_4_2_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_2_Core::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_2_Core::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_2_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_2_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_2_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_2_Core::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_2_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_2_Core::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glColorP4ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glColorP3ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glNormalP3ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexP4ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexP3ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexP2ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_2_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_2_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_2_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_2_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+// OpenGL 4.1 core functions
+inline void QOpenGLFunctions_4_2_Core::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
+{
+ d_4_1_Core->f.GetDoublei_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
+{
+ d_4_1_Core->f.GetFloati_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
+{
+ d_4_1_Core->f.DepthRangeIndexed(index, n, f);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
+{
+ d_4_1_Core->f.DepthRangeArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glScissorIndexedv(GLuint index, const GLint *v)
+{
+ d_4_1_Core->f.ScissorIndexedv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
+{
+ d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
+{
+ d_4_1_Core->f.ScissorArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glViewportIndexedfv(GLuint index, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportIndexedfv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
+{
+ d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribL4dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribL3dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribL2dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribL1dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_4_1_Core->f.VertexAttribL2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glVertexAttribL1d(GLuint index, GLdouble x)
+{
+ d_4_1_Core->f.VertexAttribL1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glValidateProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.ValidateProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
+{
+ d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
+{
+ d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+ d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+{
+ d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+ d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+{
+ d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
+{
+ d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
+{
+ d_4_1_Core->f.ProgramUniform1d(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+{
+ d_4_1_Core->f.ProgramUniform1f(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramUniform1i(GLuint program, GLint location, GLint v0)
+{
+ d_4_1_Core->f.ProgramUniform1i(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
+{
+ d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_2_Core::glIsProgramPipeline(GLuint pipeline)
+{
+ return d_4_1_Core->f.IsProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_1_Core->f.GenProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
+{
+ d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.BindProgramPipeline(pipeline);
+}
+
+inline GLuint QOpenGLFunctions_4_2_Core::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
+{
+ return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glActiveShaderProgram(GLuint pipeline, GLuint program)
+{
+ d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
+{
+ d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+ d_4_1_Core->f.ProgramParameteri(program, pname, value);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
+{
+ d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glClearDepthf(GLfloat dd)
+{
+ d_4_1_Core->f.ClearDepthf(dd);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDepthRangef(GLfloat n, GLfloat f)
+{
+ d_4_1_Core->f.DepthRangef(n, f);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
+{
+ d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glReleaseShaderCompiler()
+{
+ d_4_1_Core->f.ReleaseShaderCompiler();
+}
+
+
+// OpenGL 4.2 core functions
+inline void QOpenGLFunctions_4_2_Core::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+ d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glMemoryBarrier(GLbitfield barriers)
+{
+ d_4_2_Core->f.MemoryBarrier(barriers);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
+{
+ d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
+{
+ d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
+{
+ d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_2_Core::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
+}
+
+
+
+QT_END_NAMESPACE
+
+#ifdef Q_OS_WIN
+#pragma pop_macro("MemoryBarrier")
+#endif
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_3_compatibility.cpp b/src/opengl/qopenglfunctions_4_3_compatibility.cpp
new file mode 100644
index 0000000000..d17a4adb10
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_3_compatibility.cpp
@@ -0,0 +1,318 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_3_compatibility.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_3_Compatibility
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_4_3_Compatibility class provides all functions for OpenGL 4.3 compatibility profile.
+
+ This class is a wrapper for functions from OpenGL 4.3 compatibility profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_3_Compatibility::QOpenGLFunctions_4_3_Compatibility()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+ , d_4_1_Core(nullptr)
+ , d_4_2_Core(nullptr)
+ , d_4_3_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+ , m_reserved_2_0_Deprecated(nullptr)
+ , d_3_3_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_4_3_Compatibility::~QOpenGLFunctions_4_3_Compatibility()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+ if (d_4_1_Core) {
+ d_4_1_Core->refs.deref();
+ Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
+ }
+ if (d_4_2_Core) {
+ d_4_2_Core->refs.deref();
+ Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
+ }
+ if (d_4_3_Core) {
+ d_4_3_Core->refs.deref();
+ Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+ if (d_3_3_Deprecated) {
+ d_3_3_Deprecated->refs.deref();
+ Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_3_Compatibility::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_3_Compatibility::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
+ d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
+ d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
+ d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
+ d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_3_Compatibility::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 3))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_3_Compatibility::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 3);
+ v.setProfile(QSurfaceFormat::CompatibilityProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_3_compatibility.h b/src/opengl/qopenglfunctions_4_3_compatibility.h
new file mode 100644
index 0000000000..bff937d86a
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_3_compatibility.h
@@ -0,0 +1,5855 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_3_COMPATIBILITY_H
+#define QOPENGLVERSIONFUNCTIONS_4_3_COMPATIBILITY_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+// MemoryBarrier is a macro on some architectures on Windows
+#ifdef Q_OS_WIN
+#pragma push_macro("MemoryBarrier")
+#undef MemoryBarrier
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_3_Compatibility : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_3_Compatibility();
+ ~QOpenGLFunctions_4_3_Compatibility();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
+ void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+ // OpenGL 4.1 core functions
+ void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
+ void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
+ void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
+ void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
+ void glScissorIndexedv(GLuint index, const GLint *v);
+ void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+ void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
+ void glViewportIndexedfv(GLuint index, const GLfloat *v);
+ void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+ void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
+ void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
+ void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glVertexAttribL4dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL3dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL2dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL1dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttribL1d(GLuint index, GLdouble x);
+ void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glValidateProgramPipeline(GLuint pipeline);
+ void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+ void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+ void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
+ void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+ void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+ void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
+ void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform1i(GLuint program, GLint location, GLint v0);
+ void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ GLboolean glIsProgramPipeline(GLuint pipeline);
+ void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ void glBindProgramPipeline(GLuint pipeline);
+ GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
+ void glActiveShaderProgram(GLuint pipeline, GLuint program);
+ void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ void glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
+ void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
+ void glClearDepthf(GLfloat dd);
+ void glDepthRangef(GLfloat n, GLfloat f);
+ void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+ void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
+ void glReleaseShaderCompiler();
+
+ // OpenGL 4.2 core functions
+ void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+ void glMemoryBarrier(GLbitfield barriers);
+ void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+ void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+ void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+ void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+ void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
+ void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+ void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+ void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+
+ // OpenGL 4.3 core functions
+ void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
+ GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+ void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+ GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+ void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+ void glInvalidateBufferData(GLuint buffer);
+ void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
+ void glInvalidateTexImage(GLuint texture, GLint level);
+ void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
+ void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
+ void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
+ void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
+ void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
+ void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+ void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+ void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+ void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+ void glDispatchComputeIndirect(GLintptr indirect);
+ void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+ void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
+ void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const GLvoid *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
+ void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glResetMinmax(GLenum target);
+ void glResetHistogram(GLenum target);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+ // OpenGL 2.0 deprecated functions
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+
+ // OpenGL 2.1 deprecated functions
+
+ // OpenGL 3.0 deprecated functions
+ void glVertexAttribI4usv(GLuint index, const GLushort *v);
+ void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttribI4sv(GLuint index, const GLshort *v);
+ void glVertexAttribI4bv(GLuint index, const GLbyte *v);
+ void glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI3uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI2uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI1uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI4iv(GLuint index, const GLint *v);
+ void glVertexAttribI3iv(GLuint index, const GLint *v);
+ void glVertexAttribI2iv(GLuint index, const GLint *v);
+ void glVertexAttribI1iv(GLuint index, const GLint *v);
+ void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ void glVertexAttribI1ui(GLuint index, GLuint x);
+ void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ void glVertexAttribI2i(GLuint index, GLint x, GLint y);
+ void glVertexAttribI1i(GLuint index, GLint x);
+
+ // OpenGL 3.1 deprecated functions
+
+ // OpenGL 3.2 deprecated functions
+
+ // OpenGL 3.3 deprecated functions
+
+ // OpenGL 4.0 deprecated functions
+
+ // OpenGL 4.1 deprecated functions
+
+ // OpenGL 4.2 deprecated functions
+
+ // OpenGL 4.3 deprecated functions
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+ QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
+ QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
+ QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+ void *m_reserved_2_0_Deprecated; // To maintain BC
+ QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_3_Compatibility::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_4_3_Compatibility::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_4_3_Compatibility::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_3_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_3_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Compatibility::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Compatibility::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_4_3_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_3_Compatibility::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_3_Compatibility::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_3_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_3_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_3_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP4uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorP4ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP4ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.NormalP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.NormalP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP4uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexP4ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP4ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP3uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexP3ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP3ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP2uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexP2ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP2ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_3_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_3_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+// OpenGL 4.1 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
+{
+ d_4_1_Core->f.GetDoublei_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
+{
+ d_4_1_Core->f.GetFloati_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
+{
+ d_4_1_Core->f.DepthRangeIndexed(index, n, f);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
+{
+ d_4_1_Core->f.DepthRangeArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glScissorIndexedv(GLuint index, const GLint *v)
+{
+ d_4_1_Core->f.ScissorIndexedv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
+{
+ d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
+{
+ d_4_1_Core->f.ScissorArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glViewportIndexedfv(GLuint index, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportIndexedfv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
+{
+ d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL4dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL3dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL2dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL1dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_4_1_Core->f.VertexAttribL2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribL1d(GLuint index, GLdouble x)
+{
+ d_4_1_Core->f.VertexAttribL1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glValidateProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.ValidateProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
+{
+ d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
+{
+ d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+ d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+{
+ d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+ d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+{
+ d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
+{
+ d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
+{
+ d_4_1_Core->f.ProgramUniform1d(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+{
+ d_4_1_Core->f.ProgramUniform1f(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramUniform1i(GLuint program, GLint location, GLint v0)
+{
+ d_4_1_Core->f.ProgramUniform1i(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
+{
+ d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsProgramPipeline(GLuint pipeline)
+{
+ return d_4_1_Core->f.IsProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_1_Core->f.GenProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
+{
+ d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.BindProgramPipeline(pipeline);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Compatibility::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
+{
+ return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glActiveShaderProgram(GLuint pipeline, GLuint program)
+{
+ d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
+{
+ d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+ d_4_1_Core->f.ProgramParameteri(program, pname, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
+{
+ d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearDepthf(GLfloat dd)
+{
+ d_4_1_Core->f.ClearDepthf(dd);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDepthRangef(GLfloat n, GLfloat f)
+{
+ d_4_1_Core->f.DepthRangef(n, f);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
+{
+ d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glReleaseShaderCompiler()
+{
+ d_4_1_Core->f.ReleaseShaderCompiler();
+}
+
+
+// OpenGL 4.2 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+ d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMemoryBarrier(GLbitfield barriers)
+{
+ d_4_2_Core->f.MemoryBarrier(barriers);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
+{
+ d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
+{
+ d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
+{
+ d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
+}
+
+
+// OpenGL 4.3 core functions
+inline void QOpenGLFunctions_4_3_Compatibility::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
+{
+ d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
+}
+
+inline GLint QOpenGLFunctions_4_3_Compatibility::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
+}
+
+inline GLint QOpenGLFunctions_4_3_Compatibility::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
+{
+ d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
+{
+ d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Compatibility::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+ d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateBufferData(GLuint buffer)
+{
+ d_4_3_Core->f.InvalidateBufferData(buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
+{
+ d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateTexImage(GLuint texture, GLint level)
+{
+ d_4_3_Core->f.InvalidateTexImage(texture, level);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
+{
+ d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_4_3_Core->f.FramebufferParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
+{
+ d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
+{
+ d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
+{
+ d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
+{
+ d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
+{
+ d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDispatchComputeIndirect(GLintptr indirect)
+{
+ d_4_3_Core->f.DispatchComputeIndirect(indirect);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
+{
+ d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_4_3_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_4_3_Compatibility::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Compatibility::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_4_3_Compatibility::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_4_3_Compatibility::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_4_3_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+// OpenGL 2.0 deprecated functions
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+
+// OpenGL 2.1 deprecated functions
+
+// OpenGL 3.0 deprecated functions
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
+{
+ d_3_0_Core->f.VertexAttribI4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
+{
+ d_3_0_Core->f.VertexAttribI4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI3uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI2uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI1uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI3iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI2iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI1iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+ d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+ d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+ d_3_0_Core->f.VertexAttribI2ui(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
+{
+ d_3_0_Core->f.VertexAttribI1ui(index, x);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+ d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+ d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+ d_3_0_Core->f.VertexAttribI2i(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
+{
+ d_3_0_Core->f.VertexAttribI1i(index, x);
+}
+
+
+// OpenGL 3.1 deprecated functions
+
+// OpenGL 3.2 deprecated functions
+
+// OpenGL 3.3 deprecated functions
+
+// OpenGL 4.0 deprecated functions
+
+// OpenGL 4.1 deprecated functions
+
+// OpenGL 4.2 deprecated functions
+
+// OpenGL 4.3 deprecated functions
+
+
+QT_END_NAMESPACE
+
+#ifdef Q_OS_WIN
+#pragma pop_macro("MemoryBarrier")
+#endif
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_3_core.cpp b/src/opengl/qopenglfunctions_4_3_core.cpp
new file mode 100644
index 0000000000..72c09db076
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_3_core.cpp
@@ -0,0 +1,260 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_3_core.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_3_Core
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_4_3_Core class provides all functions for OpenGL 4.3 core profile.
+
+ This class is a wrapper for functions from OpenGL 4.3 core profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_3_Core::QOpenGLFunctions_4_3_Core()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+ , d_4_1_Core(nullptr)
+ , d_4_2_Core(nullptr)
+ , d_4_3_Core(nullptr)
+{
+}
+
+QOpenGLFunctions_4_3_Core::~QOpenGLFunctions_4_3_Core()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+ if (d_4_1_Core) {
+ d_4_1_Core->refs.deref();
+ Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
+ }
+ if (d_4_2_Core) {
+ d_4_2_Core->refs.deref();
+ Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
+ }
+ if (d_4_3_Core) {
+ d_4_3_Core->refs.deref();
+ Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_3_Core::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_3_Core::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
+ d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
+ d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
+ d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_3_Core::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 3))
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_3_Core::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 3);
+ v.setProfile(QSurfaceFormat::CoreProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_3_core.h b/src/opengl/qopenglfunctions_4_3_core.h
new file mode 100644
index 0000000000..31903bdcf4
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_3_core.h
@@ -0,0 +1,3247 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_3_CORE_H
+#define QOPENGLVERSIONFUNCTIONS_4_3_CORE_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+// MemoryBarrier is a macro on some architectures on Windows
+#ifdef Q_OS_WIN
+#pragma push_macro("MemoryBarrier")
+#undef MemoryBarrier
+#endif
+
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_3_Core : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_3_Core();
+ ~QOpenGLFunctions_4_3_Core();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *params);
+ void glGetFloatv(GLenum pname, GLfloat *params);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *params);
+ void glGetBooleanv(GLenum pname, GLboolean *params);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+ void glReadBuffer(GLenum mode);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum mode);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glGetPointerv(GLenum pname, GLvoid* *params);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+ void glBlendEquation(GLenum mode);
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ GLvoid* glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ GLvoid* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint index, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *params);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect);
+ void glDrawArraysIndirect(GLenum mode, const GLvoid *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+ // OpenGL 4.1 core functions
+ void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
+ void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
+ void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
+ void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
+ void glScissorIndexedv(GLuint index, const GLint *v);
+ void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+ void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
+ void glViewportIndexedfv(GLuint index, const GLfloat *v);
+ void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+ void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
+ void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
+ void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ void glVertexAttribL4dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL3dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL2dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL1dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttribL1d(GLuint index, GLdouble x);
+ void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glValidateProgramPipeline(GLuint pipeline);
+ void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+ void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+ void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
+ void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+ void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+ void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
+ void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform1i(GLuint program, GLint location, GLint v0);
+ void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ GLboolean glIsProgramPipeline(GLuint pipeline);
+ void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ void glBindProgramPipeline(GLuint pipeline);
+ GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
+ void glActiveShaderProgram(GLuint pipeline, GLuint program);
+ void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ void glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ void glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
+ void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
+ void glClearDepthf(GLfloat dd);
+ void glDepthRangef(GLfloat n, GLfloat f);
+ void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+ void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
+ void glReleaseShaderCompiler();
+
+ // OpenGL 4.2 core functions
+ void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+ void glMemoryBarrier(GLbitfield barriers);
+ void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+ void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+ void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+ void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+ void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
+ void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+ void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+ void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+
+ // OpenGL 4.3 core functions
+ void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
+ GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+ void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+ GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+ void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+ void glInvalidateBufferData(GLuint buffer);
+ void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
+ void glInvalidateTexImage(GLuint texture, GLint level);
+ void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
+ void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
+ void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
+ void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
+ void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
+ void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+ void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+ void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+ void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+ void glDispatchComputeIndirect(GLintptr indirect);
+ void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+ void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
+ void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+ QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
+ QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
+ QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_3_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_3_Core::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetIntegerv(GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetFloatv(GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetFloatv(pname, params);
+}
+
+inline GLenum QOpenGLFunctions_4_3_Core::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetDoublev(GLenum pname, GLdouble *params)
+{
+ d_1_0_Core->f.GetDoublev(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetBooleanv(GLenum pname, GLboolean *params)
+{
+ d_1_0_Core->f.GetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glReadBuffer(GLenum mode)
+{
+ d_1_0_Core->f.ReadBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_3_Core::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_3_Core::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawBuffer(GLenum mode)
+{
+ d_1_0_Core->f.DrawBuffer(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline void QOpenGLFunctions_4_3_Core::glIndexubv(const GLubyte *c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glIndexub(GLubyte c)
+{
+ Q_UNUSED(c);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetPointerv(GLenum pname, GLvoid* *params)
+{
+ Q_UNUSED(pname);
+ Q_UNUSED(params);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_3_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_3_Core::glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_3_Core::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_3_Core::glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline GLvoid* QOpenGLFunctions_4_3_Core::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_3_Core::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_3_Core::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, obj);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Core::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Core::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline GLvoid* QOpenGLFunctions_4_3_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_3_Core::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_3_Core::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_3_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_3_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_3_Core::glSampleMaski(GLuint index, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(index, mask);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetInteger64v(GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetInteger64v(pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_3_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_3_Core::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glColorP4ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glColorP3ui(GLenum type, GLuint color)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(color);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glNormalP3ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ Q_UNUSED(texture);
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(coords);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexP4ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexP3ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexP2ui(GLenum type, GLuint value)
+{
+ Q_UNUSED(type);
+ Q_UNUSED(value);
+ QOPENGL_DEPRECATEDFUNCTION;
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_3_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_3_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_3_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawArraysIndirect(GLenum mode, const GLvoid *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+// OpenGL 4.1 core functions
+inline void QOpenGLFunctions_4_3_Core::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
+{
+ d_4_1_Core->f.GetDoublei_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
+{
+ d_4_1_Core->f.GetFloati_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
+{
+ d_4_1_Core->f.DepthRangeIndexed(index, n, f);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
+{
+ d_4_1_Core->f.DepthRangeArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glScissorIndexedv(GLuint index, const GLint *v)
+{
+ d_4_1_Core->f.ScissorIndexedv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
+{
+ d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
+{
+ d_4_1_Core->f.ScissorArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glViewportIndexedfv(GLuint index, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportIndexedfv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
+{
+ d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+ d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribL4dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribL3dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribL2dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribL1dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_4_1_Core->f.VertexAttribL2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribL1d(GLuint index, GLdouble x)
+{
+ d_4_1_Core->f.VertexAttribL1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glValidateProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.ValidateProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
+{
+ d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
+{
+ d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+ d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+{
+ d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+ d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+{
+ d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
+{
+ d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
+{
+ d_4_1_Core->f.ProgramUniform1d(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+{
+ d_4_1_Core->f.ProgramUniform1f(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramUniform1i(GLuint program, GLint location, GLint v0)
+{
+ d_4_1_Core->f.ProgramUniform1i(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
+{
+ d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_3_Core::glIsProgramPipeline(GLuint pipeline)
+{
+ return d_4_1_Core->f.IsProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_1_Core->f.GenProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
+{
+ d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.BindProgramPipeline(pipeline);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Core::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
+{
+ return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glActiveShaderProgram(GLuint pipeline, GLuint program)
+{
+ d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
+{
+ d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+ d_4_1_Core->f.ProgramParameteri(program, pname, value);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
+{
+ d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClearDepthf(GLfloat dd)
+{
+ d_4_1_Core->f.ClearDepthf(dd);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDepthRangef(GLfloat n, GLfloat f)
+{
+ d_4_1_Core->f.DepthRangef(n, f);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
+{
+ d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)
+{
+ d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glReleaseShaderCompiler()
+{
+ d_4_1_Core->f.ReleaseShaderCompiler();
+}
+
+
+// OpenGL 4.2 core functions
+inline void QOpenGLFunctions_4_3_Core::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+ d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMemoryBarrier(GLbitfield barriers)
+{
+ d_4_2_Core->f.MemoryBarrier(barriers);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
+{
+ d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
+{
+ d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
+{
+ d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
+}
+
+
+// OpenGL 4.3 core functions
+inline void QOpenGLFunctions_4_3_Core::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
+{
+ d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
+}
+
+inline GLint QOpenGLFunctions_4_3_Core::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
+}
+
+inline GLint QOpenGLFunctions_4_3_Core::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
+{
+ d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
+{
+ d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
+}
+
+inline GLuint QOpenGLFunctions_4_3_Core::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+ d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glInvalidateBufferData(GLuint buffer)
+{
+ d_4_3_Core->f.InvalidateBufferData(buffer);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
+{
+ d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glInvalidateTexImage(GLuint texture, GLint level)
+{
+ d_4_3_Core->f.InvalidateTexImage(texture, level);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
+{
+ d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_4_3_Core->f.FramebufferParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
+{
+ d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
+{
+ d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
+{
+ d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
+{
+ d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
+{
+ d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDispatchComputeIndirect(GLintptr indirect)
+{
+ d_4_3_Core->f.DispatchComputeIndirect(indirect);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
+{
+ d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_3_Core::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
+}
+
+
+
+QT_END_NAMESPACE
+
+#ifdef Q_OS_WIN
+#pragma pop_macro("MemoryBarrier")
+#endif
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_4_compatibility.cpp b/src/opengl/qopenglfunctions_4_4_compatibility.cpp
new file mode 100644
index 0000000000..38348869db
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_4_compatibility.cpp
@@ -0,0 +1,326 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_4_compatibility.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_4_Compatibility
+ \inmodule QtOpenGL
+ \since 5.5
+ \wrapper
+ \brief The QOpenGLFunctions_4_4_Compatibility class provides all functions for OpenGL 4.4 compatibility profile.
+
+ This class is a wrapper for functions from OpenGL 4.4 compatibility profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_4_Compatibility::QOpenGLFunctions_4_4_Compatibility()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+ , d_4_1_Core(nullptr)
+ , d_4_2_Core(nullptr)
+ , d_4_3_Core(nullptr)
+ , d_4_4_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+ , d_3_3_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_4_4_Compatibility::~QOpenGLFunctions_4_4_Compatibility()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+ if (d_4_1_Core) {
+ d_4_1_Core->refs.deref();
+ Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
+ }
+ if (d_4_2_Core) {
+ d_4_2_Core->refs.deref();
+ Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
+ }
+ if (d_4_3_Core) {
+ d_4_3_Core->refs.deref();
+ Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_4_Core) {
+ d_4_4_Core->refs.deref();
+ Q_ASSERT(d_4_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+ if (d_3_3_Deprecated) {
+ d_3_3_Deprecated->refs.deref();
+ Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_4_Compatibility::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_4_Compatibility::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
+ d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
+ d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
+ d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_4_CoreBackend::versionStatus());
+ d_4_4_Core = static_cast<QOpenGLFunctions_4_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
+ d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_4_Compatibility::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 4))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_4_Compatibility::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 4);
+ v.setProfile(QSurfaceFormat::CompatibilityProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_4_compatibility.h b/src/opengl/qopenglfunctions_4_4_compatibility.h
new file mode 100644
index 0000000000..af23197dfa
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_4_compatibility.h
@@ -0,0 +1,5977 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_4_COMPATIBILITY_H
+#define QOPENGLVERSIONFUNCTIONS_4_4_COMPATIBILITY_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+// MemoryBarrier is a macro on some architectures on Windows
+#ifdef Q_OS_WIN
+#pragma push_macro("MemoryBarrier")
+#undef MemoryBarrier
+#endif
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_4_Compatibility : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_4_Compatibility();
+ ~QOpenGLFunctions_4_4_Compatibility();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *data);
+ void glGetFloatv(GLenum pname, GLfloat *data);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *data);
+ void glGetBooleanv(GLenum pname, GLboolean *data);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+ void glReadBuffer(GLenum src);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum buf);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glBlendEquation(GLenum mode);
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, void *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, void * *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ void * glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ void * glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glVertexAttribI4usv(GLuint index, const GLushort *v);
+ void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttribI4sv(GLuint index, const GLshort *v);
+ void glVertexAttribI4bv(GLuint index, const GLbyte *v);
+ void glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI3uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI2uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI1uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI4iv(GLuint index, const GLint *v);
+ void glVertexAttribI3iv(GLuint index, const GLint *v);
+ void glVertexAttribI2iv(GLuint index, const GLint *v);
+ void glVertexAttribI1iv(GLuint index, const GLint *v);
+ void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ void glVertexAttribI1ui(GLuint index, GLuint x);
+ void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ void glVertexAttribI2i(GLuint index, GLint x, GLint y);
+ void glVertexAttribI1i(GLuint index, GLint x);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices);
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint maskNumber, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *data);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
+ void glDrawArraysIndirect(GLenum mode, const void *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+ // OpenGL 4.1 core functions
+ void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
+ void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
+ void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
+ void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
+ void glScissorIndexedv(GLuint index, const GLint *v);
+ void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+ void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
+ void glViewportIndexedfv(GLuint index, const GLfloat *v);
+ void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+ void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
+ void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
+ void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glVertexAttribL4dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL3dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL2dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL1dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttribL1d(GLuint index, GLdouble x);
+ void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glValidateProgramPipeline(GLuint pipeline);
+ void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+ void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+ void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
+ void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+ void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+ void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
+ void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform1i(GLuint program, GLint location, GLint v0);
+ void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ GLboolean glIsProgramPipeline(GLuint pipeline);
+ void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ void glBindProgramPipeline(GLuint pipeline);
+ GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
+ void glActiveShaderProgram(GLuint pipeline, GLuint program);
+ void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ void glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ void glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+ void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+ void glClearDepthf(GLfloat dd);
+ void glDepthRangef(GLfloat n, GLfloat f);
+ void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+ void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+ void glReleaseShaderCompiler();
+
+ // OpenGL 4.2 core functions
+ void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+ void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
+ void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+ void glMemoryBarrier(GLbitfield barriers);
+ void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+ void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+ void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+ void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+ void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+ void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+
+ // OpenGL 4.3 core functions
+ void glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+ void glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
+ void glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+ void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+ void glPopDebugGroup();
+ void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message);
+ GLuint glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+ void glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
+ void glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+ void glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+ void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
+ void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
+ void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+ void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+ void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+ void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
+ GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+ void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+ GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+ void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+ void glInvalidateBufferData(GLuint buffer);
+ void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
+ void glInvalidateTexImage(GLuint texture, GLint level);
+ void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
+ void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
+ void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
+ void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+ void glDispatchComputeIndirect(GLintptr indirect);
+ void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+ void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
+ void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
+
+ // OpenGL 4.4 core functions
+ void glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
+ void glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures);
+ void glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers);
+ void glBindTextures(GLuint first, GLsizei count, const GLuint *textures);
+ void glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);
+ void glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers);
+ void glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+ void glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
+ void glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const void *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const void *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const void *pointer);
+ void glGetPointerv(GLenum pname, void * *params);
+ void glIndexPointer(GLenum type, GLsizei stride, const void *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const void *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, void *table);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, void *image);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glResetHistogram(GLenum target);
+ void glResetMinmax(GLenum target);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const void *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+ // OpenGL 2.0 deprecated functions
+
+ // OpenGL 2.1 deprecated functions
+
+ // OpenGL 3.0 deprecated functions
+
+ // OpenGL 3.1 deprecated functions
+
+ // OpenGL 3.2 deprecated functions
+
+ // OpenGL 3.3 deprecated functions
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+
+ // OpenGL 4.0 deprecated functions
+
+ // OpenGL 4.1 deprecated functions
+
+ // OpenGL 4.2 deprecated functions
+
+ // OpenGL 4.3 deprecated functions
+
+ // OpenGL 4.4 deprecated functions
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+ QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
+ QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
+ QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
+ QOpenGLFunctions_4_4_CoreBackend* d_4_4_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+ QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_4_Compatibility::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetIntegerv(GLenum pname, GLint *data)
+{
+ d_1_0_Core->f.GetIntegerv(pname, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetFloatv(GLenum pname, GLfloat *data)
+{
+ d_1_0_Core->f.GetFloatv(pname, data);
+}
+
+inline GLenum QOpenGLFunctions_4_4_Compatibility::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetDoublev(GLenum pname, GLdouble *data)
+{
+ d_1_0_Core->f.GetDoublev(pname, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetBooleanv(GLenum pname, GLboolean *data)
+{
+ d_1_0_Core->f.GetBooleanv(pname, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glReadBuffer(GLenum src)
+{
+ d_1_0_Core->f.ReadBuffer(src);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawBuffer(GLenum buf)
+{
+ d_1_0_Core->f.DrawBuffer(buf);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, void *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, void * *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline void * QOpenGLFunctions_4_4_Compatibility::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_4_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_4_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, shaders);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Compatibility::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Compatibility::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline void * QOpenGLFunctions_4_4_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_4_Compatibility::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_4_Compatibility::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_4_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
+{
+ d_3_0_Core->f.VertexAttribI4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
+{
+ d_3_0_Core->f.VertexAttribI4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI3uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI2uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI1uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI3iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI2iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI1iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+ d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+ d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+ d_3_0_Core->f.VertexAttribI2ui(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
+{
+ d_3_0_Core->f.VertexAttribI1ui(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+ d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+ d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+ d_3_0_Core->f.VertexAttribI2i(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
+{
+ d_3_0_Core->f.VertexAttribI1i(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glSampleMaski(GLuint maskNumber, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(maskNumber, mask);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetInteger64v(GLenum pname, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64v(pname, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_4_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_4_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_4_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_4_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawArraysIndirect(GLenum mode, const void *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+// OpenGL 4.1 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
+{
+ d_4_1_Core->f.GetDoublei_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
+{
+ d_4_1_Core->f.GetFloati_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
+{
+ d_4_1_Core->f.DepthRangeIndexed(index, n, f);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
+{
+ d_4_1_Core->f.DepthRangeArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glScissorIndexedv(GLuint index, const GLint *v)
+{
+ d_4_1_Core->f.ScissorIndexedv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
+{
+ d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
+{
+ d_4_1_Core->f.ScissorArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glViewportIndexedfv(GLuint index, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportIndexedfv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
+{
+ d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL4dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL3dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL2dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL1dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_4_1_Core->f.VertexAttribL2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribL1d(GLuint index, GLdouble x)
+{
+ d_4_1_Core->f.VertexAttribL1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glValidateProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.ValidateProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
+{
+ d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
+{
+ d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+ d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+{
+ d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+ d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+{
+ d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
+{
+ d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
+{
+ d_4_1_Core->f.ProgramUniform1d(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+{
+ d_4_1_Core->f.ProgramUniform1f(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramUniform1i(GLuint program, GLint location, GLint v0)
+{
+ d_4_1_Core->f.ProgramUniform1i(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
+{
+ d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsProgramPipeline(GLuint pipeline)
+{
+ return d_4_1_Core->f.IsProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_1_Core->f.GenProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
+{
+ d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.BindProgramPipeline(pipeline);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Compatibility::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
+{
+ return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glActiveShaderProgram(GLuint pipeline, GLuint program)
+{
+ d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
+{
+ d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+ d_4_1_Core->f.ProgramParameteri(program, pname, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
+{
+ d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
+{
+ d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearDepthf(GLfloat dd)
+{
+ d_4_1_Core->f.ClearDepthf(dd);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDepthRangef(GLfloat n, GLfloat f)
+{
+ d_4_1_Core->f.DepthRangef(n, f);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
+{
+ d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length)
+{
+ d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glReleaseShaderCompiler()
+{
+ d_4_1_Core->f.ReleaseShaderCompiler();
+}
+
+
+// OpenGL 4.2 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+ d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMemoryBarrier(GLbitfield barriers)
+{
+ d_4_2_Core->f.MemoryBarrier(barriers);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
+{
+ d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
+{
+ d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
+{
+ d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
+}
+
+
+// OpenGL 4.3 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+ d_4_3_Core->f.GetObjectPtrLabel(ptr, bufSize, length, label);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
+{
+ d_4_3_Core->f.ObjectPtrLabel(ptr, length, label);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+ d_4_3_Core->f.GetObjectLabel(identifier, name, bufSize, length, label);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
+{
+ d_4_3_Core->f.ObjectLabel(identifier, name, length, label);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPopDebugGroup()
+{
+ d_4_3_Core->f.PopDebugGroup();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
+{
+ d_4_3_Core->f.PushDebugGroup(source, id, length, message);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Compatibility::glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)
+{
+ return d_4_3_Core->f.GetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
+{
+ d_4_3_Core->f.DebugMessageCallback(callback, userParam);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)
+{
+ d_4_3_Core->f.DebugMessageInsert(source, type, id, severity, length, buf);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)
+{
+ d_4_3_Core->f.DebugMessageControl(source, type, severity, count, ids, enabled);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
+{
+ d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
+{
+ d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
+{
+ d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
+{
+ d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
+{
+ d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
+}
+
+inline GLint QOpenGLFunctions_4_4_Compatibility::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
+}
+
+inline GLint QOpenGLFunctions_4_4_Compatibility::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
+{
+ d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
+{
+ d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Compatibility::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+ d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateBufferData(GLuint buffer)
+{
+ d_4_3_Core->f.InvalidateBufferData(buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
+{
+ d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateTexImage(GLuint texture, GLint level)
+{
+ d_4_3_Core->f.InvalidateTexImage(texture, level);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
+{
+ d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_4_3_Core->f.FramebufferParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
+{
+ d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDispatchComputeIndirect(GLintptr indirect)
+{
+ d_4_3_Core->f.DispatchComputeIndirect(indirect);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
+{
+ d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
+}
+
+
+// OpenGL 4.4 core functions
+inline void QOpenGLFunctions_4_4_Compatibility::glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
+{
+ d_4_4_Core->f.BindVertexBuffers(first, count, buffers, offsets, strides);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
+{
+ d_4_4_Core->f.BindImageTextures(first, count, textures);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
+{
+ d_4_4_Core->f.BindSamplers(first, count, samplers);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindTextures(GLuint first, GLsizei count, const GLuint *textures)
+{
+ d_4_4_Core->f.BindTextures(first, count, textures);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes)
+{
+ d_4_4_Core->f.BindBuffersRange(target, first, count, buffers, offsets, sizes);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers)
+{
+ d_4_4_Core->f.BindBuffersBase(target, first, count, buffers);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
+{
+ d_4_4_Core->f.ClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
+{
+ d_4_4_Core->f.ClearTexImage(texture, level, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
+{
+ d_4_4_Core->f.BufferStorage(target, size, data, flags);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_4_4_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_4_4_Compatibility::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Compatibility::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCallLists(GLsizei n, GLenum type, const void *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_4_4_Compatibility::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetPointerv(GLenum pname, void * *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glEdgeFlagPointer(GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_4_4_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, void *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, void *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, void *row, void *column, void *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_4_4_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+// OpenGL 2.0 deprecated functions
+
+// OpenGL 2.1 deprecated functions
+
+// OpenGL 3.0 deprecated functions
+
+// OpenGL 3.1 deprecated functions
+
+// OpenGL 3.2 deprecated functions
+
+// OpenGL 3.3 deprecated functions
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP4uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColorP4ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP4ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.NormalP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.NormalP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP4uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexP4ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP4ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP3uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexP3ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP3ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP2uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_4_Compatibility::glVertexP2ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP2ui(type, value);
+}
+
+
+// OpenGL 4.0 deprecated functions
+
+// OpenGL 4.1 deprecated functions
+
+// OpenGL 4.2 deprecated functions
+
+// OpenGL 4.3 deprecated functions
+
+// OpenGL 4.4 deprecated functions
+
+
+QT_END_NAMESPACE
+
+#ifdef Q_OS_WIN
+#pragma pop_macro("MemoryBarrier")
+#endif
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_4_core.cpp b/src/opengl/qopenglfunctions_4_4_core.cpp
new file mode 100644
index 0000000000..e0a78e1527
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_4_core.cpp
@@ -0,0 +1,269 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_4_core.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_4_Core
+ \inmodule QtOpenGL
+ \since 5.5
+ \wrapper
+ \brief The QOpenGLFunctions_4_4_Core class provides all functions for OpenGL 4.4 core profile.
+
+ This class is a wrapper for functions from OpenGL 4.4 core profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_4_Core::QOpenGLFunctions_4_4_Core()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+ , d_4_1_Core(nullptr)
+ , d_4_2_Core(nullptr)
+ , d_4_3_Core(nullptr)
+ , d_4_4_Core(nullptr)
+{
+}
+
+QOpenGLFunctions_4_4_Core::~QOpenGLFunctions_4_4_Core()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+ if (d_4_1_Core) {
+ d_4_1_Core->refs.deref();
+ Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
+ }
+ if (d_4_2_Core) {
+ d_4_2_Core->refs.deref();
+ Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
+ }
+ if (d_4_3_Core) {
+ d_4_3_Core->refs.deref();
+ Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_4_Core) {
+ d_4_4_Core->refs.deref();
+ Q_ASSERT(d_4_4_Core->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_4_Core::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_4_Core::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
+ d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
+ d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
+ d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_4_CoreBackend::versionStatus());
+ d_4_4_Core = static_cast<QOpenGLFunctions_4_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_4_Core::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 4))
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_4_Core::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 4);
+ v.setProfile(QSurfaceFormat::CoreProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_4_core.h b/src/opengl/qopenglfunctions_4_4_core.h
new file mode 100644
index 0000000000..2b7cb71dfc
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_4_core.h
@@ -0,0 +1,3431 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_4_CORE_H
+#define QOPENGLVERSIONFUNCTIONS_4_4_CORE_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+// MemoryBarrier is a macro on some architectures on Windows
+#ifdef Q_OS_WIN
+#pragma push_macro("MemoryBarrier")
+#undef MemoryBarrier
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_4_Core : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_4_Core();
+ ~QOpenGLFunctions_4_4_Core();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *data);
+ void glGetFloatv(GLenum pname, GLfloat *data);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *data);
+ void glGetBooleanv(GLenum pname, GLboolean *data);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+ void glReadBuffer(GLenum src);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum buf);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glBlendEquation(GLenum mode);
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, void *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, void * *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ void * glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ void * glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glVertexAttribI4usv(GLuint index, const GLushort *v);
+ void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttribI4sv(GLuint index, const GLshort *v);
+ void glVertexAttribI4bv(GLuint index, const GLbyte *v);
+ void glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI3uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI2uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI1uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI4iv(GLuint index, const GLint *v);
+ void glVertexAttribI3iv(GLuint index, const GLint *v);
+ void glVertexAttribI2iv(GLuint index, const GLint *v);
+ void glVertexAttribI1iv(GLuint index, const GLint *v);
+ void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ void glVertexAttribI1ui(GLuint index, GLuint x);
+ void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ void glVertexAttribI2i(GLuint index, GLint x, GLint y);
+ void glVertexAttribI1i(GLuint index, GLint x);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices);
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint maskNumber, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *data);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
+ void glDrawArraysIndirect(GLenum mode, const void *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+ // OpenGL 4.1 core functions
+ void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
+ void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
+ void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
+ void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
+ void glScissorIndexedv(GLuint index, const GLint *v);
+ void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+ void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
+ void glViewportIndexedfv(GLuint index, const GLfloat *v);
+ void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+ void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
+ void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
+ void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glVertexAttribL4dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL3dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL2dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL1dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttribL1d(GLuint index, GLdouble x);
+ void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glValidateProgramPipeline(GLuint pipeline);
+ void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+ void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+ void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
+ void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+ void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+ void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
+ void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform1i(GLuint program, GLint location, GLint v0);
+ void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ GLboolean glIsProgramPipeline(GLuint pipeline);
+ void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ void glBindProgramPipeline(GLuint pipeline);
+ GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
+ void glActiveShaderProgram(GLuint pipeline, GLuint program);
+ void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ void glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ void glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+ void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+ void glClearDepthf(GLfloat dd);
+ void glDepthRangef(GLfloat n, GLfloat f);
+ void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+ void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+ void glReleaseShaderCompiler();
+
+ // OpenGL 4.2 core functions
+ void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+ void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
+ void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+ void glMemoryBarrier(GLbitfield barriers);
+ void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+ void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+ void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+ void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+ void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+ void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+
+ // OpenGL 4.3 core functions
+ void glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+ void glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
+ void glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+ void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+ void glPopDebugGroup();
+ void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message);
+ GLuint glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+ void glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
+ void glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+ void glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+ void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
+ void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
+ void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+ void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+ void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+ void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
+ GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+ void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+ GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+ void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+ void glInvalidateBufferData(GLuint buffer);
+ void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
+ void glInvalidateTexImage(GLuint texture, GLint level);
+ void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
+ void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
+ void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
+ void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+ void glDispatchComputeIndirect(GLintptr indirect);
+ void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+ void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
+ void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
+
+ // OpenGL 4.4 core functions
+ void glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
+ void glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures);
+ void glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers);
+ void glBindTextures(GLuint first, GLsizei count, const GLuint *textures);
+ void glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);
+ void glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers);
+ void glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+ void glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
+ void glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+ QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
+ QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
+ QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
+ QOpenGLFunctions_4_4_CoreBackend* d_4_4_Core;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_4_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_4_Core::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetIntegerv(GLenum pname, GLint *data)
+{
+ d_1_0_Core->f.GetIntegerv(pname, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetFloatv(GLenum pname, GLfloat *data)
+{
+ d_1_0_Core->f.GetFloatv(pname, data);
+}
+
+inline GLenum QOpenGLFunctions_4_4_Core::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetDoublev(GLenum pname, GLdouble *data)
+{
+ d_1_0_Core->f.GetDoublev(pname, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetBooleanv(GLenum pname, GLboolean *data)
+{
+ d_1_0_Core->f.GetBooleanv(pname, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glReadBuffer(GLenum src)
+{
+ d_1_0_Core->f.ReadBuffer(src);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_4_Core::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_4_Core::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawBuffer(GLenum buf)
+{
+ d_1_0_Core->f.DrawBuffer(buf);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_4_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_4_Core::glGetCompressedTexImage(GLenum target, GLint level, void *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_4_Core::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_4_Core::glGetBufferPointerv(GLenum target, GLenum pname, void * *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline void * QOpenGLFunctions_4_4_Core::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_4_Core::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_4_Core::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, shaders);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Core::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Core::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline void * QOpenGLFunctions_4_4_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_4_Core::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_4_Core::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_4_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4usv(GLuint index, const GLushort *v)
+{
+ d_3_0_Core->f.VertexAttribI4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4sv(GLuint index, const GLshort *v)
+{
+ d_3_0_Core->f.VertexAttribI4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI3uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI2uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI1uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI3iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI3iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI2iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI2iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI1iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI1iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+ d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+ d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+ d_3_0_Core->f.VertexAttribI2ui(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI1ui(GLuint index, GLuint x)
+{
+ d_3_0_Core->f.VertexAttribI1ui(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+ d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+ d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+ d_3_0_Core->f.VertexAttribI2i(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribI1i(GLuint index, GLint x)
+{
+ d_3_0_Core->f.VertexAttribI1i(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_4_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_4_Core::glSampleMaski(GLuint maskNumber, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(maskNumber, mask);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetInteger64v(GLenum pname, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64v(pname, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_4_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_4_Core::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_4_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_4_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_4_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawArraysIndirect(GLenum mode, const void *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+// OpenGL 4.1 core functions
+inline void QOpenGLFunctions_4_4_Core::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
+{
+ d_4_1_Core->f.GetDoublei_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
+{
+ d_4_1_Core->f.GetFloati_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
+{
+ d_4_1_Core->f.DepthRangeIndexed(index, n, f);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
+{
+ d_4_1_Core->f.DepthRangeArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glScissorIndexedv(GLuint index, const GLint *v)
+{
+ d_4_1_Core->f.ScissorIndexedv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
+{
+ d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
+{
+ d_4_1_Core->f.ScissorArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glViewportIndexedfv(GLuint index, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportIndexedfv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
+{
+ d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribL4dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribL3dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribL2dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribL1dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_4_1_Core->f.VertexAttribL2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribL1d(GLuint index, GLdouble x)
+{
+ d_4_1_Core->f.VertexAttribL1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glValidateProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.ValidateProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
+{
+ d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
+{
+ d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+ d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+{
+ d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+ d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+{
+ d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
+{
+ d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
+{
+ d_4_1_Core->f.ProgramUniform1d(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+{
+ d_4_1_Core->f.ProgramUniform1f(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramUniform1i(GLuint program, GLint location, GLint v0)
+{
+ d_4_1_Core->f.ProgramUniform1i(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
+{
+ d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_4_Core::glIsProgramPipeline(GLuint pipeline)
+{
+ return d_4_1_Core->f.IsProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_1_Core->f.GenProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
+{
+ d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.BindProgramPipeline(pipeline);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Core::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
+{
+ return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glActiveShaderProgram(GLuint pipeline, GLuint program)
+{
+ d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
+{
+ d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+ d_4_1_Core->f.ProgramParameteri(program, pname, value);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
+{
+ d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
+{
+ d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearDepthf(GLfloat dd)
+{
+ d_4_1_Core->f.ClearDepthf(dd);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDepthRangef(GLfloat n, GLfloat f)
+{
+ d_4_1_Core->f.DepthRangef(n, f);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
+{
+ d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length)
+{
+ d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glReleaseShaderCompiler()
+{
+ d_4_1_Core->f.ReleaseShaderCompiler();
+}
+
+
+// OpenGL 4.2 core functions
+inline void QOpenGLFunctions_4_4_Core::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+ d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glMemoryBarrier(GLbitfield barriers)
+{
+ d_4_2_Core->f.MemoryBarrier(barriers);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
+{
+ d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
+{
+ d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
+{
+ d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
+}
+
+
+// OpenGL 4.3 core functions
+inline void QOpenGLFunctions_4_4_Core::glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+ d_4_3_Core->f.GetObjectPtrLabel(ptr, bufSize, length, label);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
+{
+ d_4_3_Core->f.ObjectPtrLabel(ptr, length, label);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+ d_4_3_Core->f.GetObjectLabel(identifier, name, bufSize, length, label);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
+{
+ d_4_3_Core->f.ObjectLabel(identifier, name, length, label);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPopDebugGroup()
+{
+ d_4_3_Core->f.PopDebugGroup();
+}
+
+inline void QOpenGLFunctions_4_4_Core::glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
+{
+ d_4_3_Core->f.PushDebugGroup(source, id, length, message);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Core::glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)
+{
+ return d_4_3_Core->f.GetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
+{
+ d_4_3_Core->f.DebugMessageCallback(callback, userParam);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)
+{
+ d_4_3_Core->f.DebugMessageInsert(source, type, id, severity, length, buf);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)
+{
+ d_4_3_Core->f.DebugMessageControl(source, type, severity, count, ids, enabled);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
+{
+ d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
+{
+ d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
+{
+ d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
+{
+ d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
+{
+ d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
+}
+
+inline GLint QOpenGLFunctions_4_4_Core::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
+}
+
+inline GLint QOpenGLFunctions_4_4_Core::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
+{
+ d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
+{
+ d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
+}
+
+inline GLuint QOpenGLFunctions_4_4_Core::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+ d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glInvalidateBufferData(GLuint buffer)
+{
+ d_4_3_Core->f.InvalidateBufferData(buffer);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
+{
+ d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glInvalidateTexImage(GLuint texture, GLint level)
+{
+ d_4_3_Core->f.InvalidateTexImage(texture, level);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
+{
+ d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_4_3_Core->f.FramebufferParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
+{
+ d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDispatchComputeIndirect(GLintptr indirect)
+{
+ d_4_3_Core->f.DispatchComputeIndirect(indirect);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
+{
+ d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
+}
+
+
+// OpenGL 4.4 core functions
+inline void QOpenGLFunctions_4_4_Core::glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
+{
+ d_4_4_Core->f.BindVertexBuffers(first, count, buffers, offsets, strides);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
+{
+ d_4_4_Core->f.BindImageTextures(first, count, textures);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
+{
+ d_4_4_Core->f.BindSamplers(first, count, samplers);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindTextures(GLuint first, GLsizei count, const GLuint *textures)
+{
+ d_4_4_Core->f.BindTextures(first, count, textures);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes)
+{
+ d_4_4_Core->f.BindBuffersRange(target, first, count, buffers, offsets, sizes);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers)
+{
+ d_4_4_Core->f.BindBuffersBase(target, first, count, buffers);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
+{
+ d_4_4_Core->f.ClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
+{
+ d_4_4_Core->f.ClearTexImage(texture, level, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_4_Core::glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
+{
+ d_4_4_Core->f.BufferStorage(target, size, data, flags);
+}
+
+
+
+QT_END_NAMESPACE
+
+#ifdef Q_OS_WIN
+#pragma pop_macro("MemoryBarrier")
+#endif
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_5_compatibility.cpp b/src/opengl/qopenglfunctions_4_5_compatibility.cpp
new file mode 100644
index 0000000000..253b305452
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_5_compatibility.cpp
@@ -0,0 +1,344 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_5_compatibility.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_5_Compatibility
+ \inmodule QtOpenGL
+ \since 5.5
+ \wrapper
+ \brief The QOpenGLFunctions_4_5_Compatibility class provides all functions for OpenGL 4.5 compatibility profile.
+
+ This class is a wrapper for functions from OpenGL 4.5 compatibility profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_5_Compatibility::QOpenGLFunctions_4_5_Compatibility()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+ , d_4_1_Core(nullptr)
+ , d_4_2_Core(nullptr)
+ , d_4_3_Core(nullptr)
+ , d_4_4_Core(nullptr)
+ , d_4_5_Core(nullptr)
+ , d_1_0_Deprecated(nullptr)
+ , d_1_1_Deprecated(nullptr)
+ , d_1_2_Deprecated(nullptr)
+ , d_1_3_Deprecated(nullptr)
+ , d_1_4_Deprecated(nullptr)
+ , d_3_3_Deprecated(nullptr)
+ , d_4_5_Deprecated(nullptr)
+{
+}
+
+QOpenGLFunctions_4_5_Compatibility::~QOpenGLFunctions_4_5_Compatibility()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+ if (d_4_1_Core) {
+ d_4_1_Core->refs.deref();
+ Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
+ }
+ if (d_4_2_Core) {
+ d_4_2_Core->refs.deref();
+ Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
+ }
+ if (d_4_3_Core) {
+ d_4_3_Core->refs.deref();
+ Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_4_Core) {
+ d_4_4_Core->refs.deref();
+ Q_ASSERT(d_4_4_Core->refs.loadRelaxed());
+ }
+ if (d_4_5_Core) {
+ d_4_5_Core->refs.deref();
+ Q_ASSERT(d_4_5_Core->refs.loadRelaxed());
+ }
+ if (d_1_0_Deprecated) {
+ d_1_0_Deprecated->refs.deref();
+ Q_ASSERT(d_1_0_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_1_Deprecated) {
+ d_1_1_Deprecated->refs.deref();
+ Q_ASSERT(d_1_1_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_2_Deprecated) {
+ d_1_2_Deprecated->refs.deref();
+ Q_ASSERT(d_1_2_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_3_Deprecated) {
+ d_1_3_Deprecated->refs.deref();
+ Q_ASSERT(d_1_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_1_4_Deprecated) {
+ d_1_4_Deprecated->refs.deref();
+ Q_ASSERT(d_1_4_Deprecated->refs.loadRelaxed());
+ }
+ if (d_3_3_Deprecated) {
+ d_3_3_Deprecated->refs.deref();
+ Q_ASSERT(d_3_3_Deprecated->refs.loadRelaxed());
+ }
+ if (d_4_5_Deprecated) {
+ d_4_5_Deprecated->refs.deref();
+ Q_ASSERT(d_4_5_Deprecated->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_5_Compatibility::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_5_Compatibility::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
+ d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
+ d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
+ d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_4_CoreBackend::versionStatus());
+ d_4_4_Core = static_cast<QOpenGLFunctions_4_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_5_CoreBackend::versionStatus());
+ d_4_5_Core = static_cast<QOpenGLFunctions_4_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_DeprecatedBackend::versionStatus());
+ d_1_0_Deprecated = static_cast<QOpenGLFunctions_1_0_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_DeprecatedBackend::versionStatus());
+ d_1_1_Deprecated = static_cast<QOpenGLFunctions_1_1_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_DeprecatedBackend::versionStatus());
+ d_1_2_Deprecated = static_cast<QOpenGLFunctions_1_2_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_DeprecatedBackend::versionStatus());
+ d_1_3_Deprecated = static_cast<QOpenGLFunctions_1_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_DeprecatedBackend::versionStatus());
+ d_1_4_Deprecated = static_cast<QOpenGLFunctions_1_4_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_DeprecatedBackend::versionStatus());
+ d_3_3_Deprecated = static_cast<QOpenGLFunctions_3_3_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_5_DeprecatedBackend::versionStatus());
+ d_4_5_Deprecated = static_cast<QOpenGLFunctions_4_5_DeprecatedBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_5_Compatibility::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 5))
+ return false;
+
+ if (f.profile() == QSurfaceFormat::CoreProfile)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_5_Compatibility::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 5);
+ v.setProfile(QSurfaceFormat::CompatibilityProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_5_compatibility.h b/src/opengl/qopenglfunctions_4_5_compatibility.h
new file mode 100644
index 0000000000..620ee6862e
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_5_compatibility.h
@@ -0,0 +1,6695 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_5_COMPATIBILITY_H
+#define QOPENGLVERSIONFUNCTIONS_4_5_COMPATIBILITY_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+// MemoryBarrier is a macro on some architectures on Windows
+#ifdef Q_OS_WIN
+#pragma push_macro("MemoryBarrier")
+#undef MemoryBarrier
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_5_Compatibility : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_5_Compatibility();
+ ~QOpenGLFunctions_4_5_Compatibility();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *data);
+ void glGetFloatv(GLenum pname, GLfloat *data);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *data);
+ void glGetBooleanv(GLenum pname, GLboolean *data);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+ void glReadBuffer(GLenum src);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum buf);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glBlendEquation(GLenum mode);
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, void *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, void * *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ void * glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ void * glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glVertexAttribI4usv(GLuint index, const GLushort *v);
+ void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttribI4sv(GLuint index, const GLshort *v);
+ void glVertexAttribI4bv(GLuint index, const GLbyte *v);
+ void glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI3uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI2uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI1uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI4iv(GLuint index, const GLint *v);
+ void glVertexAttribI3iv(GLuint index, const GLint *v);
+ void glVertexAttribI2iv(GLuint index, const GLint *v);
+ void glVertexAttribI1iv(GLuint index, const GLint *v);
+ void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ void glVertexAttribI1ui(GLuint index, GLuint x);
+ void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ void glVertexAttribI2i(GLuint index, GLint x, GLint y);
+ void glVertexAttribI1i(GLuint index, GLint x);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices);
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint maskNumber, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *data);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
+ void glDrawArraysIndirect(GLenum mode, const void *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+ // OpenGL 4.1 core functions
+ void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
+ void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
+ void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
+ void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
+ void glScissorIndexedv(GLuint index, const GLint *v);
+ void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+ void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
+ void glViewportIndexedfv(GLuint index, const GLfloat *v);
+ void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+ void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
+ void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
+ void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glVertexAttribL4dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL3dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL2dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL1dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttribL1d(GLuint index, GLdouble x);
+ void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glValidateProgramPipeline(GLuint pipeline);
+ void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+ void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+ void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
+ void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+ void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+ void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
+ void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform1i(GLuint program, GLint location, GLint v0);
+ void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ GLboolean glIsProgramPipeline(GLuint pipeline);
+ void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ void glBindProgramPipeline(GLuint pipeline);
+ GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
+ void glActiveShaderProgram(GLuint pipeline, GLuint program);
+ void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ void glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ void glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+ void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+ void glClearDepthf(GLfloat dd);
+ void glDepthRangef(GLfloat n, GLfloat f);
+ void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+ void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+ void glReleaseShaderCompiler();
+
+ // OpenGL 4.2 core functions
+ void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+ void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
+ void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+ void glMemoryBarrier(GLbitfield barriers);
+ void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+ void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+ void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+ void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+ void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+ void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+
+ // OpenGL 4.3 core functions
+ void glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+ void glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
+ void glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+ void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+ void glPopDebugGroup();
+ void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message);
+ GLuint glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+ void glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
+ void glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+ void glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+ void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
+ void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
+ void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+ void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+ void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+ void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
+ GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+ void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+ GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+ void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+ void glInvalidateBufferData(GLuint buffer);
+ void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
+ void glInvalidateTexImage(GLuint texture, GLint level);
+ void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
+ void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
+ void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
+ void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+ void glDispatchComputeIndirect(GLintptr indirect);
+ void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+ void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
+ void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
+
+ // OpenGL 4.4 core functions
+ void glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
+ void glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures);
+ void glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers);
+ void glBindTextures(GLuint first, GLsizei count, const GLuint *textures);
+ void glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);
+ void glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers);
+ void glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+ void glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
+ void glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
+
+ // OpenGL 4.5 core functions
+ void glTextureBarrier();
+ void glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+ void glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+ void glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params);
+ void glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+ void glGetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params);
+ void glGetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+ void glGetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels);
+ GLenum glGetGraphicsResetStatus();
+ void glGetCompressedTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels);
+ void glGetTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+ void glMemoryBarrierByRegion(GLbitfield barriers);
+ void glCreateQueries(GLenum target, GLsizei n, GLuint *ids);
+ void glCreateProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glCreateSamplers(GLsizei n, GLuint *samplers);
+ void glGetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64 *param);
+ void glGetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint *param);
+ void glGetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param);
+ void glVertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor);
+ void glVertexArrayAttribLFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexArrayAttribIFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexArrayAttribFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+ void glVertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex);
+ void glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
+ void glVertexArrayVertexBuffer(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+ void glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer);
+ void glEnableVertexArrayAttrib(GLuint vaobj, GLuint index);
+ void glDisableVertexArrayAttrib(GLuint vaobj, GLuint index);
+ void glCreateVertexArrays(GLsizei n, GLuint *arrays);
+ void glGetTextureParameteriv(GLuint texture, GLenum pname, GLint *params);
+ void glGetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params);
+ void glGetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params);
+ void glGetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params);
+ void glGetTextureLevelParameteriv(GLuint texture, GLint level, GLenum pname, GLint *params);
+ void glGetTextureLevelParameterfv(GLuint texture, GLint level, GLenum pname, GLfloat *params);
+ void glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, void *pixels);
+ void glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+ void glBindTextureUnit(GLuint unit, GLuint texture);
+ void glGenerateTextureMipmap(GLuint texture);
+ void glTextureParameteriv(GLuint texture, GLenum pname, const GLint *param);
+ void glTextureParameterIuiv(GLuint texture, GLenum pname, const GLuint *params);
+ void glTextureParameterIiv(GLuint texture, GLenum pname, const GLint *params);
+ void glTextureParameteri(GLuint texture, GLenum pname, GLint param);
+ void glTextureParameterfv(GLuint texture, GLenum pname, const GLfloat *param);
+ void glTextureParameterf(GLuint texture, GLenum pname, GLfloat param);
+ void glCopyTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+ void glTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+ void glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+ void glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
+ void glTextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glTextureStorage3D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ void glTextureStorage2D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ void glTextureStorage1D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);
+ void glTextureBufferRange(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size);
+ void glTextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer);
+ void glCreateTextures(GLenum target, GLsizei n, GLuint *textures);
+ void glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params);
+ void glNamedRenderbufferStorageMultisample(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glNamedRenderbufferStorage(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);
+ void glCreateRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params);
+ void glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param);
+ GLenum glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target);
+ void glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil);
+ void glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glInvalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments);
+ void glNamedFramebufferReadBuffer(GLuint framebuffer, GLenum src);
+ void glNamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum *bufs);
+ void glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf);
+ void glNamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);
+ void glNamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param);
+ void glNamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glCreateFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, void *data);
+ void glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void * *params);
+ void glGetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64 *params);
+ void glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params);
+ void glFlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length);
+ GLboolean glUnmapNamedBuffer(GLuint buffer);
+ void * glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access);
+ void * glMapNamedBuffer(GLuint buffer, GLenum access);
+ void glClearNamedBufferSubData(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data);
+ void glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);
+ void glCopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size);
+ void glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, const void *data);
+ void glNamedBufferData(GLuint buffer, GLsizei size, const void *data, GLenum usage);
+ void glNamedBufferStorage(GLuint buffer, GLsizei size, const void *data, GLbitfield flags);
+ void glCreateBuffers(GLsizei n, GLuint *buffers);
+ void glGetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param);
+ void glGetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param);
+ void glGetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param);
+ void glTransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size);
+ void glTransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer);
+ void glCreateTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glClipControl(GLenum origin, GLenum depth);
+
+ // OpenGL 1.0 deprecated functions
+ void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ void glTranslated(GLdouble x, GLdouble y, GLdouble z);
+ void glScalef(GLfloat x, GLfloat y, GLfloat z);
+ void glScaled(GLdouble x, GLdouble y, GLdouble z);
+ void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+ void glPushMatrix();
+ void glPopMatrix();
+ void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ void glMultMatrixd(const GLdouble *m);
+ void glMultMatrixf(const GLfloat *m);
+ void glMatrixMode(GLenum mode);
+ void glLoadMatrixd(const GLdouble *m);
+ void glLoadMatrixf(const GLfloat *m);
+ void glLoadIdentity();
+ void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+ GLboolean glIsList(GLuint list);
+ void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params);
+ void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params);
+ void glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params);
+ void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetPolygonStipple(GLubyte *mask);
+ void glGetPixelMapusv(GLenum map, GLushort *values);
+ void glGetPixelMapuiv(GLenum map, GLuint *values);
+ void glGetPixelMapfv(GLenum map, GLfloat *values);
+ void glGetMaterialiv(GLenum face, GLenum pname, GLint *params);
+ void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ void glGetMapiv(GLenum target, GLenum query, GLint *v);
+ void glGetMapfv(GLenum target, GLenum query, GLfloat *v);
+ void glGetMapdv(GLenum target, GLenum query, GLdouble *v);
+ void glGetLightiv(GLenum light, GLenum pname, GLint *params);
+ void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ void glGetClipPlane(GLenum plane, GLdouble *equation);
+ void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+ void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+ void glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values);
+ void glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values);
+ void glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values);
+ void glPixelTransferi(GLenum pname, GLint param);
+ void glPixelTransferf(GLenum pname, GLfloat param);
+ void glPixelZoom(GLfloat xfactor, GLfloat yfactor);
+ void glAlphaFunc(GLenum func, GLfloat ref);
+ void glEvalPoint2(GLint i, GLint j);
+ void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+ void glEvalPoint1(GLint i);
+ void glEvalMesh1(GLenum mode, GLint i1, GLint i2);
+ void glEvalCoord2fv(const GLfloat *u);
+ void glEvalCoord2f(GLfloat u, GLfloat v);
+ void glEvalCoord2dv(const GLdouble *u);
+ void glEvalCoord2d(GLdouble u, GLdouble v);
+ void glEvalCoord1fv(const GLfloat *u);
+ void glEvalCoord1f(GLfloat u);
+ void glEvalCoord1dv(const GLdouble *u);
+ void glEvalCoord1d(GLdouble u);
+ void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+ void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+ void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2);
+ void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2);
+ void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+ void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+ void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+ void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+ void glPushAttrib(GLbitfield mask);
+ void glPopAttrib();
+ void glAccum(GLenum op, GLfloat value);
+ void glIndexMask(GLuint mask);
+ void glClearIndex(GLfloat c);
+ void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glPushName(GLuint name);
+ void glPopName();
+ void glPassThrough(GLfloat token);
+ void glLoadName(GLuint name);
+ void glInitNames();
+ GLint glRenderMode(GLenum mode);
+ void glSelectBuffer(GLsizei size, GLuint *buffer);
+ void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer);
+ void glTexGeniv(GLenum coord, GLenum pname, const GLint *params);
+ void glTexGeni(GLenum coord, GLenum pname, GLint param);
+ void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params);
+ void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
+ void glTexGendv(GLenum coord, GLenum pname, const GLdouble *params);
+ void glTexGend(GLenum coord, GLenum pname, GLdouble param);
+ void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ void glTexEnvi(GLenum target, GLenum pname, GLint param);
+ void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ void glShadeModel(GLenum mode);
+ void glPolygonStipple(const GLubyte *mask);
+ void glMaterialiv(GLenum face, GLenum pname, const GLint *params);
+ void glMateriali(GLenum face, GLenum pname, GLint param);
+ void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ void glLineStipple(GLint factor, GLushort pattern);
+ void glLightModeliv(GLenum pname, const GLint *params);
+ void glLightModeli(GLenum pname, GLint param);
+ void glLightModelfv(GLenum pname, const GLfloat *params);
+ void glLightModelf(GLenum pname, GLfloat param);
+ void glLightiv(GLenum light, GLenum pname, const GLint *params);
+ void glLighti(GLenum light, GLenum pname, GLint param);
+ void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ void glLightf(GLenum light, GLenum pname, GLfloat param);
+ void glFogiv(GLenum pname, const GLint *params);
+ void glFogi(GLenum pname, GLint param);
+ void glFogfv(GLenum pname, const GLfloat *params);
+ void glFogf(GLenum pname, GLfloat param);
+ void glColorMaterial(GLenum face, GLenum mode);
+ void glClipPlane(GLenum plane, const GLdouble *equation);
+ void glVertex4sv(const GLshort *v);
+ void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertex4iv(const GLint *v);
+ void glVertex4i(GLint x, GLint y, GLint z, GLint w);
+ void glVertex4fv(const GLfloat *v);
+ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertex4dv(const GLdouble *v);
+ void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertex3sv(const GLshort *v);
+ void glVertex3s(GLshort x, GLshort y, GLshort z);
+ void glVertex3iv(const GLint *v);
+ void glVertex3i(GLint x, GLint y, GLint z);
+ void glVertex3fv(const GLfloat *v);
+ void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
+ void glVertex3dv(const GLdouble *v);
+ void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
+ void glVertex2sv(const GLshort *v);
+ void glVertex2s(GLshort x, GLshort y);
+ void glVertex2iv(const GLint *v);
+ void glVertex2i(GLint x, GLint y);
+ void glVertex2fv(const GLfloat *v);
+ void glVertex2f(GLfloat x, GLfloat y);
+ void glVertex2dv(const GLdouble *v);
+ void glVertex2d(GLdouble x, GLdouble y);
+ void glTexCoord4sv(const GLshort *v);
+ void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q);
+ void glTexCoord4iv(const GLint *v);
+ void glTexCoord4i(GLint s, GLint t, GLint r, GLint q);
+ void glTexCoord4fv(const GLfloat *v);
+ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glTexCoord4dv(const GLdouble *v);
+ void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glTexCoord3sv(const GLshort *v);
+ void glTexCoord3s(GLshort s, GLshort t, GLshort r);
+ void glTexCoord3iv(const GLint *v);
+ void glTexCoord3i(GLint s, GLint t, GLint r);
+ void glTexCoord3fv(const GLfloat *v);
+ void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
+ void glTexCoord3dv(const GLdouble *v);
+ void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r);
+ void glTexCoord2sv(const GLshort *v);
+ void glTexCoord2s(GLshort s, GLshort t);
+ void glTexCoord2iv(const GLint *v);
+ void glTexCoord2i(GLint s, GLint t);
+ void glTexCoord2fv(const GLfloat *v);
+ void glTexCoord2f(GLfloat s, GLfloat t);
+ void glTexCoord2dv(const GLdouble *v);
+ void glTexCoord2d(GLdouble s, GLdouble t);
+ void glTexCoord1sv(const GLshort *v);
+ void glTexCoord1s(GLshort s);
+ void glTexCoord1iv(const GLint *v);
+ void glTexCoord1i(GLint s);
+ void glTexCoord1fv(const GLfloat *v);
+ void glTexCoord1f(GLfloat s);
+ void glTexCoord1dv(const GLdouble *v);
+ void glTexCoord1d(GLdouble s);
+ void glRectsv(const GLshort *v1, const GLshort *v2);
+ void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+ void glRectiv(const GLint *v1, const GLint *v2);
+ void glRecti(GLint x1, GLint y1, GLint x2, GLint y2);
+ void glRectfv(const GLfloat *v1, const GLfloat *v2);
+ void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+ void glRectdv(const GLdouble *v1, const GLdouble *v2);
+ void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+ void glRasterPos4sv(const GLshort *v);
+ void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
+ void glRasterPos4iv(const GLint *v);
+ void glRasterPos4i(GLint x, GLint y, GLint z, GLint w);
+ void glRasterPos4fv(const GLfloat *v);
+ void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glRasterPos4dv(const GLdouble *v);
+ void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glRasterPos3sv(const GLshort *v);
+ void glRasterPos3s(GLshort x, GLshort y, GLshort z);
+ void glRasterPos3iv(const GLint *v);
+ void glRasterPos3i(GLint x, GLint y, GLint z);
+ void glRasterPos3fv(const GLfloat *v);
+ void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glRasterPos3dv(const GLdouble *v);
+ void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glRasterPos2sv(const GLshort *v);
+ void glRasterPos2s(GLshort x, GLshort y);
+ void glRasterPos2iv(const GLint *v);
+ void glRasterPos2i(GLint x, GLint y);
+ void glRasterPos2fv(const GLfloat *v);
+ void glRasterPos2f(GLfloat x, GLfloat y);
+ void glRasterPos2dv(const GLdouble *v);
+ void glRasterPos2d(GLdouble x, GLdouble y);
+ void glNormal3sv(const GLshort *v);
+ void glNormal3s(GLshort nx, GLshort ny, GLshort nz);
+ void glNormal3iv(const GLint *v);
+ void glNormal3i(GLint nx, GLint ny, GLint nz);
+ void glNormal3fv(const GLfloat *v);
+ void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ void glNormal3dv(const GLdouble *v);
+ void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz);
+ void glNormal3bv(const GLbyte *v);
+ void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz);
+ void glIndexsv(const GLshort *c);
+ void glIndexs(GLshort c);
+ void glIndexiv(const GLint *c);
+ void glIndexi(GLint c);
+ void glIndexfv(const GLfloat *c);
+ void glIndexf(GLfloat c);
+ void glIndexdv(const GLdouble *c);
+ void glIndexd(GLdouble c);
+ void glEnd();
+ void glEdgeFlagv(const GLboolean *flag);
+ void glEdgeFlag(GLboolean flag);
+ void glColor4usv(const GLushort *v);
+ void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+ void glColor4uiv(const GLuint *v);
+ void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+ void glColor4ubv(const GLubyte *v);
+ void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ void glColor4sv(const GLshort *v);
+ void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+ void glColor4iv(const GLint *v);
+ void glColor4i(GLint red, GLint green, GLint blue, GLint alpha);
+ void glColor4fv(const GLfloat *v);
+ void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glColor4dv(const GLdouble *v);
+ void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+ void glColor4bv(const GLbyte *v);
+ void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+ void glColor3usv(const GLushort *v);
+ void glColor3us(GLushort red, GLushort green, GLushort blue);
+ void glColor3uiv(const GLuint *v);
+ void glColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glColor3ubv(const GLubyte *v);
+ void glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glColor3sv(const GLshort *v);
+ void glColor3s(GLshort red, GLshort green, GLshort blue);
+ void glColor3iv(const GLint *v);
+ void glColor3i(GLint red, GLint green, GLint blue);
+ void glColor3fv(const GLfloat *v);
+ void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glColor3dv(const GLdouble *v);
+ void glColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glColor3bv(const GLbyte *v);
+ void glColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+ void glBegin(GLenum mode);
+ void glListBase(GLuint base);
+ GLuint glGenLists(GLsizei range);
+ void glDeleteLists(GLuint list, GLsizei range);
+ void glCallLists(GLsizei n, GLenum type, const void *lists);
+ void glCallList(GLuint list);
+ void glEndList();
+ void glNewList(GLuint list, GLenum mode);
+
+ // OpenGL 1.1 deprecated functions
+ void glPushClientAttrib(GLbitfield mask);
+ void glPopClientAttrib();
+ void glIndexubv(const GLubyte *c);
+ void glIndexub(GLubyte c);
+ void glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities);
+ GLboolean glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences);
+ void glVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glNormalPointer(GLenum type, GLsizei stride, const void *pointer);
+ void glInterleavedArrays(GLenum format, GLsizei stride, const void *pointer);
+ void glGetPointerv(GLenum pname, void * *params);
+ void glIndexPointer(GLenum type, GLsizei stride, const void *pointer);
+ void glEnableClientState(GLenum array);
+ void glEdgeFlagPointer(GLsizei stride, const void *pointer);
+ void glDisableClientState(GLenum array);
+ void glColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glArrayElement(GLint i);
+
+ // OpenGL 1.2 deprecated functions
+ void glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);
+ void glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glGetColorTable(GLenum target, GLenum format, GLenum type, void *table);
+ void glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);
+ void glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+ void glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);
+ void glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);
+ void glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
+ void glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glConvolutionParameteri(GLenum target, GLenum pname, GLint params);
+ void glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+ void glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, void *image);
+ void glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetSeparableFilter(GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);
+ void glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);
+ void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+ void glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+ void glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+ void glMinmax(GLenum target, GLenum internalformat, GLboolean sink);
+ void glResetHistogram(GLenum target);
+ void glResetMinmax(GLenum target);
+
+ // OpenGL 1.3 deprecated functions
+ void glMultTransposeMatrixd(const GLdouble *m);
+ void glMultTransposeMatrixf(const GLfloat *m);
+ void glLoadTransposeMatrixd(const GLdouble *m);
+ void glLoadTransposeMatrixf(const GLfloat *m);
+ void glMultiTexCoord4sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+ void glMultiTexCoord4iv(GLenum target, const GLint *v);
+ void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q);
+ void glMultiTexCoord4fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ void glMultiTexCoord4dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+ void glMultiTexCoord3sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r);
+ void glMultiTexCoord3iv(GLenum target, const GLint *v);
+ void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r);
+ void glMultiTexCoord3fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+ void glMultiTexCoord3dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+ void glMultiTexCoord2sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t);
+ void glMultiTexCoord2iv(GLenum target, const GLint *v);
+ void glMultiTexCoord2i(GLenum target, GLint s, GLint t);
+ void glMultiTexCoord2fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t);
+ void glMultiTexCoord2dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t);
+ void glMultiTexCoord1sv(GLenum target, const GLshort *v);
+ void glMultiTexCoord1s(GLenum target, GLshort s);
+ void glMultiTexCoord1iv(GLenum target, const GLint *v);
+ void glMultiTexCoord1i(GLenum target, GLint s);
+ void glMultiTexCoord1fv(GLenum target, const GLfloat *v);
+ void glMultiTexCoord1f(GLenum target, GLfloat s);
+ void glMultiTexCoord1dv(GLenum target, const GLdouble *v);
+ void glMultiTexCoord1d(GLenum target, GLdouble s);
+ void glClientActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 deprecated functions
+ void glWindowPos3sv(const GLshort *v);
+ void glWindowPos3s(GLshort x, GLshort y, GLshort z);
+ void glWindowPos3iv(const GLint *v);
+ void glWindowPos3i(GLint x, GLint y, GLint z);
+ void glWindowPos3fv(const GLfloat *v);
+ void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z);
+ void glWindowPos3dv(const GLdouble *v);
+ void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z);
+ void glWindowPos2sv(const GLshort *v);
+ void glWindowPos2s(GLshort x, GLshort y);
+ void glWindowPos2iv(const GLint *v);
+ void glWindowPos2i(GLint x, GLint y);
+ void glWindowPos2fv(const GLfloat *v);
+ void glWindowPos2f(GLfloat x, GLfloat y);
+ void glWindowPos2dv(const GLdouble *v);
+ void glWindowPos2d(GLdouble x, GLdouble y);
+ void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glSecondaryColor3usv(const GLushort *v);
+ void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue);
+ void glSecondaryColor3uiv(const GLuint *v);
+ void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue);
+ void glSecondaryColor3ubv(const GLubyte *v);
+ void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue);
+ void glSecondaryColor3sv(const GLshort *v);
+ void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue);
+ void glSecondaryColor3iv(const GLint *v);
+ void glSecondaryColor3i(GLint red, GLint green, GLint blue);
+ void glSecondaryColor3fv(const GLfloat *v);
+ void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue);
+ void glSecondaryColor3dv(const GLdouble *v);
+ void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue);
+ void glSecondaryColor3bv(const GLbyte *v);
+ void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue);
+ void glFogCoordPointer(GLenum type, GLsizei stride, const void *pointer);
+ void glFogCoorddv(const GLdouble *coord);
+ void glFogCoordd(GLdouble coord);
+ void glFogCoordfv(const GLfloat *coord);
+ void glFogCoordf(GLfloat coord);
+
+ // OpenGL 1.5 deprecated functions
+
+ // OpenGL 2.0 deprecated functions
+
+ // OpenGL 2.1 deprecated functions
+
+ // OpenGL 3.0 deprecated functions
+
+ // OpenGL 3.1 deprecated functions
+
+ // OpenGL 3.2 deprecated functions
+
+ // OpenGL 3.3 deprecated functions
+ void glSecondaryColorP3uiv(GLenum type, const GLuint *color);
+ void glSecondaryColorP3ui(GLenum type, GLuint color);
+ void glColorP4uiv(GLenum type, const GLuint *color);
+ void glColorP4ui(GLenum type, GLuint color);
+ void glColorP3uiv(GLenum type, const GLuint *color);
+ void glColorP3ui(GLenum type, GLuint color);
+ void glNormalP3uiv(GLenum type, const GLuint *coords);
+ void glNormalP3ui(GLenum type, GLuint coords);
+ void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords);
+ void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords);
+ void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords);
+ void glTexCoordP4uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP4ui(GLenum type, GLuint coords);
+ void glTexCoordP3uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP3ui(GLenum type, GLuint coords);
+ void glTexCoordP2uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP2ui(GLenum type, GLuint coords);
+ void glTexCoordP1uiv(GLenum type, const GLuint *coords);
+ void glTexCoordP1ui(GLenum type, GLuint coords);
+ void glVertexP4uiv(GLenum type, const GLuint *value);
+ void glVertexP4ui(GLenum type, GLuint value);
+ void glVertexP3uiv(GLenum type, const GLuint *value);
+ void glVertexP3ui(GLenum type, GLuint value);
+ void glVertexP2uiv(GLenum type, const GLuint *value);
+ void glVertexP2ui(GLenum type, GLuint value);
+
+ // OpenGL 4.0 deprecated functions
+
+ // OpenGL 4.1 deprecated functions
+
+ // OpenGL 4.2 deprecated functions
+
+ // OpenGL 4.3 deprecated functions
+
+ // OpenGL 4.4 deprecated functions
+
+ // OpenGL 4.5 deprecated functions
+ void glGetnMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
+ void glGetnHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
+ void glGetnSeparableFilter(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span);
+ void glGetnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image);
+ void glGetnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);
+ void glGetnPolygonStipple(GLsizei bufSize, GLubyte *pattern);
+ void glGetnPixelMapusv(GLenum map, GLsizei bufSize, GLushort *values);
+ void glGetnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint *values);
+ void glGetnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat *values);
+ void glGetnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint *v);
+ void glGetnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);
+ void glGetnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+ QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
+ QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
+ QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
+ QOpenGLFunctions_4_4_CoreBackend* d_4_4_Core;
+ QOpenGLFunctions_4_5_CoreBackend* d_4_5_Core;
+ QOpenGLFunctions_1_0_DeprecatedBackend* d_1_0_Deprecated;
+ QOpenGLFunctions_1_1_DeprecatedBackend* d_1_1_Deprecated;
+ QOpenGLFunctions_1_2_DeprecatedBackend* d_1_2_Deprecated;
+ QOpenGLFunctions_1_3_DeprecatedBackend* d_1_3_Deprecated;
+ QOpenGLFunctions_1_4_DeprecatedBackend* d_1_4_Deprecated;
+ QOpenGLFunctions_3_3_DeprecatedBackend* d_3_3_Deprecated;
+ QOpenGLFunctions_4_5_DeprecatedBackend* d_4_5_Deprecated;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_5_Compatibility::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetIntegerv(GLenum pname, GLint *data)
+{
+ d_1_0_Core->f.GetIntegerv(pname, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetFloatv(GLenum pname, GLfloat *data)
+{
+ d_1_0_Core->f.GetFloatv(pname, data);
+}
+
+inline GLenum QOpenGLFunctions_4_5_Compatibility::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetDoublev(GLenum pname, GLdouble *data)
+{
+ d_1_0_Core->f.GetDoublev(pname, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetBooleanv(GLenum pname, GLboolean *data)
+{
+ d_1_0_Core->f.GetBooleanv(pname, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glReadBuffer(GLenum src)
+{
+ d_1_0_Core->f.ReadBuffer(src);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawBuffer(GLenum buf)
+{
+ d_1_0_Core->f.DrawBuffer(buf);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glGetCompressedTexImage(GLenum target, GLint level, void *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glGetBufferPointerv(GLenum target, GLenum pname, void * *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline void * QOpenGLFunctions_4_5_Compatibility::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_5_Compatibility::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_5_Compatibility::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, shaders);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Compatibility::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Compatibility::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline void * QOpenGLFunctions_4_5_Compatibility::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_5_Compatibility::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_5_Compatibility::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_5_Compatibility::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4usv(GLuint index, const GLushort *v)
+{
+ d_3_0_Core->f.VertexAttribI4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4sv(GLuint index, const GLshort *v)
+{
+ d_3_0_Core->f.VertexAttribI4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI3uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI2uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI1uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI3iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI3iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI2iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI2iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI1iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI1iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+ d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+ d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+ d_3_0_Core->f.VertexAttribI2ui(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI1ui(GLuint index, GLuint x)
+{
+ d_3_0_Core->f.VertexAttribI1ui(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+ d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+ d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+ d_3_0_Core->f.VertexAttribI2i(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribI1i(GLuint index, GLint x)
+{
+ d_3_0_Core->f.VertexAttribI1i(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Compatibility::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glSampleMaski(GLuint maskNumber, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(maskNumber, mask);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetInteger64v(GLenum pname, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64v(pname, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_5_Compatibility::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_5_Compatibility::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_5_Compatibility::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Compatibility::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_5_Compatibility::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawArraysIndirect(GLenum mode, const void *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+// OpenGL 4.1 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
+{
+ d_4_1_Core->f.GetDoublei_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
+{
+ d_4_1_Core->f.GetFloati_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
+{
+ d_4_1_Core->f.DepthRangeIndexed(index, n, f);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
+{
+ d_4_1_Core->f.DepthRangeArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glScissorIndexedv(GLuint index, const GLint *v)
+{
+ d_4_1_Core->f.ScissorIndexedv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
+{
+ d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
+{
+ d_4_1_Core->f.ScissorArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glViewportIndexedfv(GLuint index, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportIndexedfv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
+{
+ d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL4dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL3dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL2dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL1dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_4_1_Core->f.VertexAttribL2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribL1d(GLuint index, GLdouble x)
+{
+ d_4_1_Core->f.VertexAttribL1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glValidateProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.ValidateProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
+{
+ d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
+{
+ d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+ d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+{
+ d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+ d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+{
+ d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
+{
+ d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
+{
+ d_4_1_Core->f.ProgramUniform1d(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+{
+ d_4_1_Core->f.ProgramUniform1f(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramUniform1i(GLuint program, GLint location, GLint v0)
+{
+ d_4_1_Core->f.ProgramUniform1i(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
+{
+ d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsProgramPipeline(GLuint pipeline)
+{
+ return d_4_1_Core->f.IsProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_1_Core->f.GenProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
+{
+ d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.BindProgramPipeline(pipeline);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Compatibility::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
+{
+ return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glActiveShaderProgram(GLuint pipeline, GLuint program)
+{
+ d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
+{
+ d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+ d_4_1_Core->f.ProgramParameteri(program, pname, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
+{
+ d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
+{
+ d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearDepthf(GLfloat dd)
+{
+ d_4_1_Core->f.ClearDepthf(dd);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDepthRangef(GLfloat n, GLfloat f)
+{
+ d_4_1_Core->f.DepthRangef(n, f);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
+{
+ d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length)
+{
+ d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glReleaseShaderCompiler()
+{
+ d_4_1_Core->f.ReleaseShaderCompiler();
+}
+
+
+// OpenGL 4.2 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+ d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMemoryBarrier(GLbitfield barriers)
+{
+ d_4_2_Core->f.MemoryBarrier(barriers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
+{
+ d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
+{
+ d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
+{
+ d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
+}
+
+
+// OpenGL 4.3 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+ d_4_3_Core->f.GetObjectPtrLabel(ptr, bufSize, length, label);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
+{
+ d_4_3_Core->f.ObjectPtrLabel(ptr, length, label);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+ d_4_3_Core->f.GetObjectLabel(identifier, name, bufSize, length, label);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
+{
+ d_4_3_Core->f.ObjectLabel(identifier, name, length, label);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPopDebugGroup()
+{
+ d_4_3_Core->f.PopDebugGroup();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
+{
+ d_4_3_Core->f.PushDebugGroup(source, id, length, message);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Compatibility::glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)
+{
+ return d_4_3_Core->f.GetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
+{
+ d_4_3_Core->f.DebugMessageCallback(callback, userParam);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)
+{
+ d_4_3_Core->f.DebugMessageInsert(source, type, id, severity, length, buf);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)
+{
+ d_4_3_Core->f.DebugMessageControl(source, type, severity, count, ids, enabled);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
+{
+ d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
+{
+ d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
+{
+ d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
+{
+ d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
+{
+ d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
+}
+
+inline GLint QOpenGLFunctions_4_5_Compatibility::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
+}
+
+inline GLint QOpenGLFunctions_4_5_Compatibility::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
+{
+ d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
+{
+ d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Compatibility::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+ d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateBufferData(GLuint buffer)
+{
+ d_4_3_Core->f.InvalidateBufferData(buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
+{
+ d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateTexImage(GLuint texture, GLint level)
+{
+ d_4_3_Core->f.InvalidateTexImage(texture, level);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
+{
+ d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_4_3_Core->f.FramebufferParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
+{
+ d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDispatchComputeIndirect(GLintptr indirect)
+{
+ d_4_3_Core->f.DispatchComputeIndirect(indirect);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
+{
+ d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
+}
+
+
+// OpenGL 4.4 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
+{
+ d_4_4_Core->f.BindVertexBuffers(first, count, buffers, offsets, strides);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
+{
+ d_4_4_Core->f.BindImageTextures(first, count, textures);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
+{
+ d_4_4_Core->f.BindSamplers(first, count, samplers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindTextures(GLuint first, GLsizei count, const GLuint *textures)
+{
+ d_4_4_Core->f.BindTextures(first, count, textures);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes)
+{
+ d_4_4_Core->f.BindBuffersRange(target, first, count, buffers, offsets, sizes);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers)
+{
+ d_4_4_Core->f.BindBuffersBase(target, first, count, buffers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
+{
+ d_4_4_Core->f.ClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
+{
+ d_4_4_Core->f.ClearTexImage(texture, level, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
+{
+ d_4_4_Core->f.BufferStorage(target, size, data, flags);
+}
+
+
+// OpenGL 4.5 core functions
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureBarrier()
+{
+ d_4_5_Core->f.TextureBarrier();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data)
+{
+ d_4_5_Core->f.ReadnPixels(x, y, width, height, format, type, bufSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params)
+{
+ d_4_5_Core->f.GetnUniformuiv(program, location, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
+{
+ d_4_5_Core->f.GetnUniformiv(program, location, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
+{
+ d_4_5_Core->f.GetnUniformfv(program, location, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params)
+{
+ d_4_5_Core->f.GetnUniformdv(program, location, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetnTexImage(target, level, format, type, bufSize, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetnCompressedTexImage(target, lod, bufSize, pixels);
+}
+
+inline GLenum QOpenGLFunctions_4_5_Compatibility::glGetGraphicsResetStatus()
+{
+ return d_4_5_Core->f.GetGraphicsResetStatus();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetCompressedTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMemoryBarrierByRegion(GLbitfield barriers)
+{
+ d_4_5_Core->f.MemoryBarrierByRegion(barriers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCreateQueries(GLenum target, GLsizei n, GLuint *ids)
+{
+ d_4_5_Core->f.CreateQueries(target, n, ids);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCreateProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_5_Core->f.CreateProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCreateSamplers(GLsizei n, GLuint *samplers)
+{
+ d_4_5_Core->f.CreateSamplers(n, samplers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64 *param)
+{
+ d_4_5_Core->f.GetVertexArrayIndexed64iv(vaobj, index, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint *param)
+{
+ d_4_5_Core->f.GetVertexArrayIndexediv(vaobj, index, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param)
+{
+ d_4_5_Core->f.GetVertexArrayiv(vaobj, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor)
+{
+ d_4_5_Core->f.VertexArrayBindingDivisor(vaobj, bindingindex, divisor);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayAttribLFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_5_Core->f.VertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayAttribIFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_5_Core->f.VertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayAttribFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
+{
+ d_4_5_Core->f.VertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex)
+{
+ d_4_5_Core->f.VertexArrayAttribBinding(vaobj, attribindex, bindingindex);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
+{
+ d_4_5_Core->f.VertexArrayVertexBuffers(vaobj, first, count, buffers, offsets, strides);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayVertexBuffer(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
+{
+ d_4_5_Core->f.VertexArrayVertexBuffer(vaobj, bindingindex, buffer, offset, stride);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer)
+{
+ d_4_5_Core->f.VertexArrayElementBuffer(vaobj, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEnableVertexArrayAttrib(GLuint vaobj, GLuint index)
+{
+ d_4_5_Core->f.EnableVertexArrayAttrib(vaobj, index);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDisableVertexArrayAttrib(GLuint vaobj, GLuint index)
+{
+ d_4_5_Core->f.DisableVertexArrayAttrib(vaobj, index);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCreateVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_4_5_Core->f.CreateVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureParameteriv(GLuint texture, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetTextureParameteriv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params)
+{
+ d_4_5_Core->f.GetTextureParameterIuiv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetTextureParameterIiv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params)
+{
+ d_4_5_Core->f.GetTextureParameterfv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureLevelParameteriv(GLuint texture, GLint level, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetTextureLevelParameteriv(texture, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureLevelParameterfv(GLuint texture, GLint level, GLenum pname, GLfloat *params)
+{
+ d_4_5_Core->f.GetTextureLevelParameterfv(texture, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetCompressedTextureImage(texture, level, bufSize, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetTextureImage(texture, level, format, type, bufSize, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBindTextureUnit(GLuint unit, GLuint texture)
+{
+ d_4_5_Core->f.BindTextureUnit(unit, texture);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGenerateTextureMipmap(GLuint texture)
+{
+ d_4_5_Core->f.GenerateTextureMipmap(texture);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameteriv(GLuint texture, GLenum pname, const GLint *param)
+{
+ d_4_5_Core->f.TextureParameteriv(texture, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameterIuiv(GLuint texture, GLenum pname, const GLuint *params)
+{
+ d_4_5_Core->f.TextureParameterIuiv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameterIiv(GLuint texture, GLenum pname, const GLint *params)
+{
+ d_4_5_Core->f.TextureParameterIiv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameteri(GLuint texture, GLenum pname, GLint param)
+{
+ d_4_5_Core->f.TextureParameteri(texture, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameterfv(GLuint texture, GLenum pname, const GLfloat *param)
+{
+ d_4_5_Core->f.TextureParameterfv(texture, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureParameterf(GLuint texture, GLenum pname, GLfloat param)
+{
+ d_4_5_Core->f.TextureParameterf(texture, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.CopyTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.CopyTextureSubImage2D(texture, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_4_5_Core->f.CopyTextureSubImage1D(texture, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_4_5_Core->f.CompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_4_5_Core->f.CompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_4_5_Core->f.CompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
+{
+ d_4_5_Core->f.TextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
+{
+ d_4_5_Core->f.TextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
+{
+ d_4_5_Core->f.TextureSubImage1D(texture, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_4_5_Core->f.TextureStorage3DMultisample(texture, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_4_5_Core->f.TextureStorage2DMultisample(texture, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureStorage3D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_5_Core->f.TextureStorage3D(texture, levels, internalformat, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureStorage2D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.TextureStorage2D(texture, levels, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureStorage1D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+ d_4_5_Core->f.TextureStorage1D(texture, levels, internalformat, width);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureBufferRange(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size)
+{
+ d_4_5_Core->f.TextureBufferRange(texture, internalformat, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer)
+{
+ d_4_5_Core->f.TextureBuffer(texture, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCreateTextures(GLenum target, GLsizei n, GLuint *textures)
+{
+ d_4_5_Core->f.CreateTextures(target, n, textures);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetNamedRenderbufferParameteriv(renderbuffer, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedRenderbufferStorageMultisample(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.NamedRenderbufferStorageMultisample(renderbuffer, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedRenderbufferStorage(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.NamedRenderbufferStorage(renderbuffer, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCreateRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_4_5_Core->f.CreateRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param)
+{
+ d_4_5_Core->f.GetNamedFramebufferParameteriv(framebuffer, pname, param);
+}
+
+inline GLenum QOpenGLFunctions_4_5_Compatibility::glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target)
+{
+ return d_4_5_Core->f.CheckNamedFramebufferStatus(framebuffer, target);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_4_5_Core->f.BlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil)
+{
+ d_4_5_Core->f.ClearNamedFramebufferfi(framebuffer, buffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_4_5_Core->f.ClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_4_5_Core->f.ClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_4_5_Core->f.ClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.InvalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments)
+{
+ d_4_5_Core->f.InvalidateNamedFramebufferData(framebuffer, numAttachments, attachments);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferReadBuffer(GLuint framebuffer, GLenum src)
+{
+ d_4_5_Core->f.NamedFramebufferReadBuffer(framebuffer, src);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum *bufs)
+{
+ d_4_5_Core->f.NamedFramebufferDrawBuffers(framebuffer, n, bufs);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf)
+{
+ d_4_5_Core->f.NamedFramebufferDrawBuffer(framebuffer, buf);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_4_5_Core->f.NamedFramebufferTextureLayer(framebuffer, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)
+{
+ d_4_5_Core->f.NamedFramebufferTexture(framebuffer, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param)
+{
+ d_4_5_Core->f.NamedFramebufferParameteri(framebuffer, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_4_5_Core->f.NamedFramebufferRenderbuffer(framebuffer, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCreateFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_4_5_Core->f.CreateFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, void *data)
+{
+ d_4_5_Core->f.GetNamedBufferSubData(buffer, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void * *params)
+{
+ d_4_5_Core->f.GetNamedBufferPointerv(buffer, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64 *params)
+{
+ d_4_5_Core->f.GetNamedBufferParameteri64v(buffer, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetNamedBufferParameteriv(buffer, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length)
+{
+ d_4_5_Core->f.FlushMappedNamedBufferRange(buffer, offset, length);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glUnmapNamedBuffer(GLuint buffer)
+{
+ return d_4_5_Core->f.UnmapNamedBuffer(buffer);
+}
+
+inline void * QOpenGLFunctions_4_5_Compatibility::glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access)
+{
+ return d_4_5_Core->f.MapNamedBufferRange(buffer, offset, length, access);
+}
+
+inline void * QOpenGLFunctions_4_5_Compatibility::glMapNamedBuffer(GLuint buffer, GLenum access)
+{
+ return d_4_5_Core->f.MapNamedBuffer(buffer, access);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedBufferSubData(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data)
+{
+ d_4_5_Core->f.ClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data)
+{
+ d_4_5_Core->f.ClearNamedBufferData(buffer, internalformat, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size)
+{
+ d_4_5_Core->f.CopyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, const void *data)
+{
+ d_4_5_Core->f.NamedBufferSubData(buffer, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedBufferData(GLuint buffer, GLsizei size, const void *data, GLenum usage)
+{
+ d_4_5_Core->f.NamedBufferData(buffer, size, data, usage);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNamedBufferStorage(GLuint buffer, GLsizei size, const void *data, GLbitfield flags)
+{
+ d_4_5_Core->f.NamedBufferStorage(buffer, size, data, flags);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCreateBuffers(GLsizei n, GLuint *buffers)
+{
+ d_4_5_Core->f.CreateBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param)
+{
+ d_4_5_Core->f.GetTransformFeedbacki64_v(xfb, pname, index, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param)
+{
+ d_4_5_Core->f.GetTransformFeedbacki_v(xfb, pname, index, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param)
+{
+ d_4_5_Core->f.GetTransformFeedbackiv(xfb, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size)
+{
+ d_4_5_Core->f.TransformFeedbackBufferRange(xfb, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer)
+{
+ d_4_5_Core->f.TransformFeedbackBufferBase(xfb, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCreateTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_5_Core->f.CreateTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClipControl(GLenum origin, GLenum depth)
+{
+ d_4_5_Core->f.ClipControl(origin, depth);
+}
+
+
+// OpenGL 1.0 deprecated functions
+inline void QOpenGLFunctions_4_5_Compatibility::glTranslatef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Translatef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTranslated(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Translated(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glScalef(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Scalef(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glScaled(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Scaled(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Rotatef(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Rotated(angle, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPushMatrix()
+{
+ d_1_0_Deprecated->f.PushMatrix();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPopMatrix()
+{
+ d_1_0_Deprecated->f.PopMatrix();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Ortho(left, right, bottom, top, zNear, zFar);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.MultMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.MultMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMatrixMode(GLenum mode)
+{
+ d_1_0_Deprecated->f.MatrixMode(mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLoadMatrixd(const GLdouble *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLoadMatrixf(const GLfloat *m)
+{
+ d_1_0_Deprecated->f.LoadMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLoadIdentity()
+{
+ d_1_0_Deprecated->f.LoadIdentity();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
+{
+ d_1_0_Deprecated->f.Frustum(left, right, bottom, top, zNear, zFar);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glIsList(GLuint list)
+{
+ return d_1_0_Deprecated->f.IsList(list);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexGeniv(GLenum coord, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params)
+{
+ d_1_0_Deprecated->f.GetTexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexEnviv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetTexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetTexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetPolygonStipple(GLubyte *mask)
+{
+ d_1_0_Deprecated->f.GetPolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetPixelMapusv(GLenum map, GLushort *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapusv(map, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetPixelMapuiv(GLenum map, GLuint *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapuiv(map, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetPixelMapfv(GLenum map, GLfloat *values)
+{
+ d_1_0_Deprecated->f.GetPixelMapfv(map, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetMaterialiv(GLenum face, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetMaterialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetMaterialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetMapiv(GLenum target, GLenum query, GLint *v)
+{
+ d_1_0_Deprecated->f.GetMapiv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetMapfv(GLenum target, GLenum query, GLfloat *v)
+{
+ d_1_0_Deprecated->f.GetMapfv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetMapdv(GLenum target, GLenum query, GLdouble *v)
+{
+ d_1_0_Deprecated->f.GetMapdv(target, query, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetLightiv(GLenum light, GLenum pname, GLint *params)
+{
+ d_1_0_Deprecated->f.GetLightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
+{
+ d_1_0_Deprecated->f.GetLightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetClipPlane(GLenum plane, GLdouble *equation)
+{
+ d_1_0_Deprecated->f.GetClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_0_Deprecated->f.DrawPixels(width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
+{
+ d_1_0_Deprecated->f.CopyPixels(x, y, width, height, type);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values)
+{
+ d_1_0_Deprecated->f.PixelMapusv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values)
+{
+ d_1_0_Deprecated->f.PixelMapuiv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values)
+{
+ d_1_0_Deprecated->f.PixelMapfv(map, mapsize, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPixelTransferi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.PixelTransferi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPixelTransferf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.PixelTransferf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPixelZoom(GLfloat xfactor, GLfloat yfactor)
+{
+ d_1_0_Deprecated->f.PixelZoom(xfactor, yfactor);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glAlphaFunc(GLenum func, GLfloat ref)
+{
+ d_1_0_Deprecated->f.AlphaFunc(func, ref);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalPoint2(GLint i, GLint j)
+{
+ d_1_0_Deprecated->f.EvalPoint2(i, j);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
+{
+ d_1_0_Deprecated->f.EvalMesh2(mode, i1, i2, j1, j2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalPoint1(GLint i)
+{
+ d_1_0_Deprecated->f.EvalPoint1(i);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalMesh1(GLenum mode, GLint i1, GLint i2)
+{
+ d_1_0_Deprecated->f.EvalMesh1(mode, i1, i2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord2fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2fv(u);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord2f(GLfloat u, GLfloat v)
+{
+ d_1_0_Deprecated->f.EvalCoord2f(u, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord2dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord2dv(u);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord2d(GLdouble u, GLdouble v)
+{
+ d_1_0_Deprecated->f.EvalCoord2d(u, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord1fv(const GLfloat *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1fv(u);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord1f(GLfloat u)
+{
+ d_1_0_Deprecated->f.EvalCoord1f(u);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord1dv(const GLdouble *u)
+{
+ d_1_0_Deprecated->f.EvalCoord1dv(u);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEvalCoord1d(GLdouble u)
+{
+ d_1_0_Deprecated->f.EvalCoord1d(u);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
+{
+ d_1_0_Deprecated->f.MapGrid2f(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
+{
+ d_1_0_Deprecated->f.MapGrid2d(un, u1, u2, vn, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMapGrid1f(GLint un, GLfloat u1, GLfloat u2)
+{
+ d_1_0_Deprecated->f.MapGrid1f(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMapGrid1d(GLint un, GLdouble u1, GLdouble u2)
+{
+ d_1_0_Deprecated->f.MapGrid1d(un, u1, u2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)
+{
+ d_1_0_Deprecated->f.Map1f(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)
+{
+ d_1_0_Deprecated->f.Map1d(target, u1, u2, stride, order, points);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPushAttrib(GLbitfield mask)
+{
+ d_1_0_Deprecated->f.PushAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPopAttrib()
+{
+ d_1_0_Deprecated->f.PopAttrib();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glAccum(GLenum op, GLfloat value)
+{
+ d_1_0_Deprecated->f.Accum(op, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexMask(GLuint mask)
+{
+ d_1_0_Deprecated->f.IndexMask(mask);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearIndex(GLfloat c)
+{
+ d_1_0_Deprecated->f.ClearIndex(c);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.ClearAccum(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPushName(GLuint name)
+{
+ d_1_0_Deprecated->f.PushName(name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPopName()
+{
+ d_1_0_Deprecated->f.PopName();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPassThrough(GLfloat token)
+{
+ d_1_0_Deprecated->f.PassThrough(token);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLoadName(GLuint name)
+{
+ d_1_0_Deprecated->f.LoadName(name);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glInitNames()
+{
+ d_1_0_Deprecated->f.InitNames();
+}
+
+inline GLint QOpenGLFunctions_4_5_Compatibility::glRenderMode(GLenum mode)
+{
+ return d_1_0_Deprecated->f.RenderMode(mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSelectBuffer(GLsizei size, GLuint *buffer)
+{
+ d_1_0_Deprecated->f.SelectBuffer(size, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer)
+{
+ d_1_0_Deprecated->f.FeedbackBuffer(size, type, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexGeniv(GLenum coord, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexGeniv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexGeni(GLenum coord, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexGeni(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexGenfv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexGenf(GLenum coord, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexGenf(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexGendv(GLenum coord, GLenum pname, const GLdouble *params)
+{
+ d_1_0_Deprecated->f.TexGendv(coord, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexGend(GLenum coord, GLenum pname, GLdouble param)
+{
+ d_1_0_Deprecated->f.TexGend(coord, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexEnviv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.TexEnviv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexEnvi(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.TexEnvi(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.TexEnvfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexEnvf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.TexEnvf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glShadeModel(GLenum mode)
+{
+ d_1_0_Deprecated->f.ShadeModel(mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPolygonStipple(const GLubyte *mask)
+{
+ d_1_0_Deprecated->f.PolygonStipple(mask);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMaterialiv(GLenum face, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Materialiv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMateriali(GLenum face, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Materiali(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Materialfv(face, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Materialf(face, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLineStipple(GLint factor, GLushort pattern)
+{
+ d_1_0_Deprecated->f.LineStipple(factor, pattern);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLightModeliv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.LightModeliv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLightModeli(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.LightModeli(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLightModelfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.LightModelfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLightModelf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.LightModelf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLightiv(GLenum light, GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Lightiv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLighti(GLenum light, GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Lighti(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLightfv(GLenum light, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Lightfv(light, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLightf(GLenum light, GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Lightf(light, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFogiv(GLenum pname, const GLint *params)
+{
+ d_1_0_Deprecated->f.Fogiv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFogi(GLenum pname, GLint param)
+{
+ d_1_0_Deprecated->f.Fogi(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFogfv(GLenum pname, const GLfloat *params)
+{
+ d_1_0_Deprecated->f.Fogfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFogf(GLenum pname, GLfloat param)
+{
+ d_1_0_Deprecated->f.Fogf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColorMaterial(GLenum face, GLenum mode)
+{
+ d_1_0_Deprecated->f.ColorMaterial(face, mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClipPlane(GLenum plane, const GLdouble *equation)
+{
+ d_1_0_Deprecated->f.ClipPlane(plane, equation);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex4sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.Vertex4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex4iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.Vertex4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex4fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.Vertex4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex4dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.Vertex4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex3sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.Vertex3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex3iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.Vertex3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex3fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.Vertex3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex3dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.Vertex3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Vertex2sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.Vertex2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Vertex2iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.Vertex2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Vertex2fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.Vertex2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Vertex2dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertex2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.Vertex2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord4sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_0_Deprecated->f.TexCoord4s(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord4iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4i(GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_0_Deprecated->f.TexCoord4i(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord4fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_0_Deprecated->f.TexCoord4f(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord4dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_0_Deprecated->f.TexCoord4d(s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord3sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3s(GLshort s, GLshort t, GLshort r)
+{
+ d_1_0_Deprecated->f.TexCoord3s(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord3iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3i(GLint s, GLint t, GLint r)
+{
+ d_1_0_Deprecated->f.TexCoord3i(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord3fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3f(GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_0_Deprecated->f.TexCoord3f(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord3dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord3d(GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_0_Deprecated->f.TexCoord3d(s, t, r);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord2sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2s(GLshort s, GLshort t)
+{
+ d_1_0_Deprecated->f.TexCoord2s(s, t);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord2iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2i(GLint s, GLint t)
+{
+ d_1_0_Deprecated->f.TexCoord2i(s, t);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord2fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2f(GLfloat s, GLfloat t)
+{
+ d_1_0_Deprecated->f.TexCoord2f(s, t);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord2dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord2d(GLdouble s, GLdouble t)
+{
+ d_1_0_Deprecated->f.TexCoord2d(s, t);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.TexCoord1sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1s(GLshort s)
+{
+ d_1_0_Deprecated->f.TexCoord1s(s);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.TexCoord1iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1i(GLint s)
+{
+ d_1_0_Deprecated->f.TexCoord1i(s);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.TexCoord1fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1f(GLfloat s)
+{
+ d_1_0_Deprecated->f.TexCoord1f(s);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.TexCoord1dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoord1d(GLdouble s)
+{
+ d_1_0_Deprecated->f.TexCoord1d(s);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRectsv(const GLshort *v1, const GLshort *v2)
+{
+ d_1_0_Deprecated->f.Rectsv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
+{
+ d_1_0_Deprecated->f.Rects(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRectiv(const GLint *v1, const GLint *v2)
+{
+ d_1_0_Deprecated->f.Rectiv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRecti(GLint x1, GLint y1, GLint x2, GLint y2)
+{
+ d_1_0_Deprecated->f.Recti(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRectfv(const GLfloat *v1, const GLfloat *v2)
+{
+ d_1_0_Deprecated->f.Rectfv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
+{
+ d_1_0_Deprecated->f.Rectf(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRectdv(const GLdouble *v1, const GLdouble *v2)
+{
+ d_1_0_Deprecated->f.Rectdv(v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
+{
+ d_1_0_Deprecated->f.Rectd(x1, y1, x2, y2);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos4sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_1_0_Deprecated->f.RasterPos4s(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos4iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4i(GLint x, GLint y, GLint z, GLint w)
+{
+ d_1_0_Deprecated->f.RasterPos4i(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos4fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_1_0_Deprecated->f.RasterPos4f(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos4dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_1_0_Deprecated->f.RasterPos4d(x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_0_Deprecated->f.RasterPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_0_Deprecated->f.RasterPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_0_Deprecated->f.RasterPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_0_Deprecated->f.RasterPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.RasterPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2s(GLshort x, GLshort y)
+{
+ d_1_0_Deprecated->f.RasterPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.RasterPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2i(GLint x, GLint y)
+{
+ d_1_0_Deprecated->f.RasterPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.RasterPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2f(GLfloat x, GLfloat y)
+{
+ d_1_0_Deprecated->f.RasterPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.RasterPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glRasterPos2d(GLdouble x, GLdouble y)
+{
+ d_1_0_Deprecated->f.RasterPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormal3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Normal3sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormal3s(GLshort nx, GLshort ny, GLshort nz)
+{
+ d_1_0_Deprecated->f.Normal3s(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormal3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Normal3iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormal3i(GLint nx, GLint ny, GLint nz)
+{
+ d_1_0_Deprecated->f.Normal3i(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormal3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Normal3fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ d_1_0_Deprecated->f.Normal3f(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormal3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Normal3dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
+{
+ d_1_0_Deprecated->f.Normal3d(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormal3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Normal3bv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz)
+{
+ d_1_0_Deprecated->f.Normal3b(nx, ny, nz);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexsv(const GLshort *c)
+{
+ d_1_0_Deprecated->f.Indexsv(c);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexs(GLshort c)
+{
+ d_1_0_Deprecated->f.Indexs(c);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexiv(const GLint *c)
+{
+ d_1_0_Deprecated->f.Indexiv(c);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexi(GLint c)
+{
+ d_1_0_Deprecated->f.Indexi(c);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexfv(const GLfloat *c)
+{
+ d_1_0_Deprecated->f.Indexfv(c);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexf(GLfloat c)
+{
+ d_1_0_Deprecated->f.Indexf(c);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexdv(const GLdouble *c)
+{
+ d_1_0_Deprecated->f.Indexdv(c);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexd(GLdouble c)
+{
+ d_1_0_Deprecated->f.Indexd(c);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEnd()
+{
+ d_1_0_Deprecated->f.End();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEdgeFlagv(const GLboolean *flag)
+{
+ d_1_0_Deprecated->f.EdgeFlagv(flag);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEdgeFlag(GLboolean flag)
+{
+ d_1_0_Deprecated->f.EdgeFlag(flag);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color4usv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha)
+{
+ d_1_0_Deprecated->f.Color4us(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color4uiv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
+{
+ d_1_0_Deprecated->f.Color4ui(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color4ubv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+ d_1_0_Deprecated->f.Color4ub(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color4sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha)
+{
+ d_1_0_Deprecated->f.Color4s(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color4iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4i(GLint red, GLint green, GLint blue, GLint alpha)
+{
+ d_1_0_Deprecated->f.Color4i(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color4fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Deprecated->f.Color4f(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color4dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
+{
+ d_1_0_Deprecated->f.Color4d(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color4bv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
+{
+ d_1_0_Deprecated->f.Color4b(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3usv(const GLushort *v)
+{
+ d_1_0_Deprecated->f.Color3usv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_0_Deprecated->f.Color3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3uiv(const GLuint *v)
+{
+ d_1_0_Deprecated->f.Color3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_0_Deprecated->f.Color3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3ubv(const GLubyte *v)
+{
+ d_1_0_Deprecated->f.Color3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_0_Deprecated->f.Color3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3sv(const GLshort *v)
+{
+ d_1_0_Deprecated->f.Color3sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_0_Deprecated->f.Color3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3iv(const GLint *v)
+{
+ d_1_0_Deprecated->f.Color3iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_0_Deprecated->f.Color3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3fv(const GLfloat *v)
+{
+ d_1_0_Deprecated->f.Color3fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_0_Deprecated->f.Color3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3dv(const GLdouble *v)
+{
+ d_1_0_Deprecated->f.Color3dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_0_Deprecated->f.Color3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3bv(const GLbyte *v)
+{
+ d_1_0_Deprecated->f.Color3bv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_0_Deprecated->f.Color3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)
+{
+ d_1_0_Deprecated->f.Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glBegin(GLenum mode)
+{
+ d_1_0_Deprecated->f.Begin(mode);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glListBase(GLuint base)
+{
+ d_1_0_Deprecated->f.ListBase(base);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Compatibility::glGenLists(GLsizei range)
+{
+ return d_1_0_Deprecated->f.GenLists(range);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDeleteLists(GLuint list, GLsizei range)
+{
+ d_1_0_Deprecated->f.DeleteLists(list, range);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCallLists(GLsizei n, GLenum type, const void *lists)
+{
+ d_1_0_Deprecated->f.CallLists(n, type, lists);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCallList(GLuint list)
+{
+ d_1_0_Deprecated->f.CallList(list);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEndList()
+{
+ d_1_0_Deprecated->f.EndList();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNewList(GLuint list, GLenum mode)
+{
+ d_1_0_Deprecated->f.NewList(list, mode);
+}
+
+
+// OpenGL 1.1 deprecated functions
+inline void QOpenGLFunctions_4_5_Compatibility::glPushClientAttrib(GLbitfield mask)
+{
+ d_1_1_Deprecated->f.PushClientAttrib(mask);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPopClientAttrib()
+{
+ d_1_1_Deprecated->f.PopClientAttrib();
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexubv(const GLubyte *c)
+{
+ d_1_1_Deprecated->f.Indexubv(c);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexub(GLubyte c)
+{
+ d_1_1_Deprecated->f.Indexub(c);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLfloat *priorities)
+{
+ d_1_1_Deprecated->f.PrioritizeTextures(n, textures, priorities);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Compatibility::glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences)
+{
+ return d_1_1_Deprecated->f.AreTexturesResident(n, textures, residences);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.VertexPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.TexCoordPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormalPointer(GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.NormalPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glInterleavedArrays(GLenum format, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.InterleavedArrays(format, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetPointerv(GLenum pname, void * *params)
+{
+ d_1_1_Deprecated->f.GetPointerv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glIndexPointer(GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.IndexPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEnableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.EnableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glEdgeFlagPointer(GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.EdgeFlagPointer(stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glDisableClientState(GLenum array)
+{
+ d_1_1_Deprecated->f.DisableClientState(array);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_1_Deprecated->f.ColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glArrayElement(GLint i)
+{
+ d_1_1_Deprecated->f.ArrayElement(i);
+}
+
+
+// OpenGL 1.2 deprecated functions
+inline void QOpenGLFunctions_4_5_Compatibility::glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table)
+{
+ d_1_2_Deprecated->f.ColorTable(target, internalformat, width, format, type, table);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorTable(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetColorTable(GLenum target, GLenum format, GLenum type, void *table)
+{
+ d_1_2_Deprecated->f.GetColorTable(target, format, type, table);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetColorTableParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetColorTableParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data)
+{
+ d_1_2_Deprecated->f.ColorSubTable(target, start, count, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyColorSubTable(target, start, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter1D(target, internalformat, width, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image)
+{
+ d_1_2_Deprecated->f.ConvolutionFilter2D(target, internalformat, width, height, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterf(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionParameteri(GLenum target, GLenum pname, GLint params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteri(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_2_Deprecated->f.ConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter1D(target, internalformat, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Deprecated->f.CopyConvolutionFilter2D(target, internalformat, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, void *image)
+{
+ d_1_2_Deprecated->f.GetConvolutionFilter(target, format, type, image);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetConvolutionParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetSeparableFilter(GLenum target, GLenum format, GLenum type, void *row, void *column, void *span)
+{
+ d_1_2_Deprecated->f.GetSeparableFilter(target, format, type, row, column, span);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column)
+{
+ d_1_2_Deprecated->f.SeparableFilter2D(target, internalformat, width, height, format, type, row, column);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values)
+{
+ d_1_2_Deprecated->f.GetHistogram(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetHistogramParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, void *values)
+{
+ d_1_2_Deprecated->f.GetMinmax(target, reset, format, type, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_2_Deprecated->f.GetMinmaxParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Histogram(target, width, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMinmax(GLenum target, GLenum internalformat, GLboolean sink)
+{
+ d_1_2_Deprecated->f.Minmax(target, internalformat, sink);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glResetHistogram(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetHistogram(target);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glResetMinmax(GLenum target)
+{
+ d_1_2_Deprecated->f.ResetMinmax(target);
+}
+
+
+// OpenGL 1.3 deprecated functions
+inline void QOpenGLFunctions_4_5_Compatibility::glMultTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.MultTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLoadTransposeMatrixd(const GLdouble *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixd(m);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glLoadTransposeMatrixf(const GLfloat *m)
+{
+ d_1_3_Deprecated->f.LoadTransposeMatrixf(m);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4s(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4i(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4f(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
+{
+ d_1_3_Deprecated->f.MultiTexCoord4d(target, s, t, r, q);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3s(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3i(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3f(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)
+{
+ d_1_3_Deprecated->f.MultiTexCoord3d(target, s, t, r);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2s(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2i(GLenum target, GLint s, GLint t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2i(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2f(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)
+{
+ d_1_3_Deprecated->f.MultiTexCoord2d(target, s, t);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1sv(GLenum target, const GLshort *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1sv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1s(GLenum target, GLshort s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1s(target, s);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1iv(GLenum target, const GLint *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1iv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1i(GLenum target, GLint s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1i(target, s);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1fv(GLenum target, const GLfloat *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1fv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1f(GLenum target, GLfloat s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1f(target, s);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1dv(GLenum target, const GLdouble *v)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1dv(target, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoord1d(GLenum target, GLdouble s)
+{
+ d_1_3_Deprecated->f.MultiTexCoord1d(target, s);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glClientActiveTexture(GLenum texture)
+{
+ d_1_3_Deprecated->f.ClientActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 deprecated functions
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos3sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3s(GLshort x, GLshort y, GLshort z)
+{
+ d_1_4_Deprecated->f.WindowPos3s(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos3iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3i(GLint x, GLint y, GLint z)
+{
+ d_1_4_Deprecated->f.WindowPos3i(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos3fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)
+{
+ d_1_4_Deprecated->f.WindowPos3f(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos3dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)
+{
+ d_1_4_Deprecated->f.WindowPos3d(x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.WindowPos2sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2s(GLshort x, GLshort y)
+{
+ d_1_4_Deprecated->f.WindowPos2s(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.WindowPos2iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2i(GLint x, GLint y)
+{
+ d_1_4_Deprecated->f.WindowPos2i(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.WindowPos2fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2f(GLfloat x, GLfloat y)
+{
+ d_1_4_Deprecated->f.WindowPos2f(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.WindowPos2dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glWindowPos2d(GLdouble x, GLdouble y)
+{
+ d_1_4_Deprecated->f.WindowPos2d(x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_4_Deprecated->f.SecondaryColorPointer(size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3usv(const GLushort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3usv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3us(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3uiv(const GLuint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3uiv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ui(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3ubv(const GLubyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ubv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3ub(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3sv(const GLshort *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3sv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3s(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3iv(const GLint *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3iv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3i(GLint red, GLint green, GLint blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3i(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3fv(const GLfloat *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3fv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3f(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3dv(const GLdouble *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3dv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3d(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3bv(const GLbyte *v)
+{
+ d_1_4_Deprecated->f.SecondaryColor3bv(v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)
+{
+ d_1_4_Deprecated->f.SecondaryColor3b(red, green, blue);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFogCoordPointer(GLenum type, GLsizei stride, const void *pointer)
+{
+ d_1_4_Deprecated->f.FogCoordPointer(type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFogCoorddv(const GLdouble *coord)
+{
+ d_1_4_Deprecated->f.FogCoorddv(coord);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFogCoordd(GLdouble coord)
+{
+ d_1_4_Deprecated->f.FogCoordd(coord);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFogCoordfv(const GLfloat *coord)
+{
+ d_1_4_Deprecated->f.FogCoordfv(coord);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glFogCoordf(GLfloat coord)
+{
+ d_1_4_Deprecated->f.FogCoordf(coord);
+}
+
+
+// OpenGL 1.5 deprecated functions
+
+// OpenGL 2.0 deprecated functions
+
+// OpenGL 2.1 deprecated functions
+
+// OpenGL 3.0 deprecated functions
+
+// OpenGL 3.1 deprecated functions
+
+// OpenGL 3.2 deprecated functions
+
+// OpenGL 3.3 deprecated functions
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glSecondaryColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.SecondaryColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColorP4uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP4uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColorP4ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP4ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColorP3uiv(GLenum type, const GLuint *color)
+{
+ d_3_3_Deprecated->f.ColorP3uiv(type, color);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glColorP3ui(GLenum type, GLuint color)
+{
+ d_3_3_Deprecated->f.ColorP3ui(type, color);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormalP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.NormalP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glNormalP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.NormalP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP4ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP3ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP2ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1uiv(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.MultiTexCoordP1ui(texture, type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP4uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP4ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP4ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP3uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP3ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP3ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP2uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP2ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP2ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP1uiv(GLenum type, const GLuint *coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1uiv(type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glTexCoordP1ui(GLenum type, GLuint coords)
+{
+ d_3_3_Deprecated->f.TexCoordP1ui(type, coords);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexP4uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP4uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexP4ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP4ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexP3uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP3uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexP3ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP3ui(type, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexP2uiv(GLenum type, const GLuint *value)
+{
+ d_3_3_Deprecated->f.VertexP2uiv(type, value);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glVertexP2ui(GLenum type, GLuint value)
+{
+ d_3_3_Deprecated->f.VertexP2ui(type, value);
+}
+
+
+// OpenGL 4.0 deprecated functions
+
+// OpenGL 4.1 deprecated functions
+
+// OpenGL 4.2 deprecated functions
+
+// OpenGL 4.3 deprecated functions
+
+// OpenGL 4.4 deprecated functions
+
+// OpenGL 4.5 deprecated functions
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values)
+{
+ d_4_5_Deprecated->f.GetnMinmax(target, reset, format, type, bufSize, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values)
+{
+ d_4_5_Deprecated->f.GetnHistogram(target, reset, format, type, bufSize, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnSeparableFilter(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span)
+{
+ d_4_5_Deprecated->f.GetnSeparableFilter(target, format, type, rowBufSize, row, columnBufSize, column, span);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image)
+{
+ d_4_5_Deprecated->f.GetnConvolutionFilter(target, format, type, bufSize, image);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table)
+{
+ d_4_5_Deprecated->f.GetnColorTable(target, format, type, bufSize, table);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnPolygonStipple(GLsizei bufSize, GLubyte *pattern)
+{
+ d_4_5_Deprecated->f.GetnPolygonStipple(bufSize, pattern);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnPixelMapusv(GLenum map, GLsizei bufSize, GLushort *values)
+{
+ d_4_5_Deprecated->f.GetnPixelMapusv(map, bufSize, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint *values)
+{
+ d_4_5_Deprecated->f.GetnPixelMapuiv(map, bufSize, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat *values)
+{
+ d_4_5_Deprecated->f.GetnPixelMapfv(map, bufSize, values);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint *v)
+{
+ d_4_5_Deprecated->f.GetnMapiv(target, query, bufSize, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v)
+{
+ d_4_5_Deprecated->f.GetnMapfv(target, query, bufSize, v);
+}
+
+inline void QOpenGLFunctions_4_5_Compatibility::glGetnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v)
+{
+ d_4_5_Deprecated->f.GetnMapdv(target, query, bufSize, v);
+}
+
+
+
+QT_END_NAMESPACE
+
+#ifdef Q_OS_WIN
+#pragma pop_macro("MemoryBarrier")
+#endif
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_4_5_core.cpp b/src/opengl/qopenglfunctions_4_5_core.cpp
new file mode 100644
index 0000000000..b680629e91
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_5_core.cpp
@@ -0,0 +1,278 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglfunctions_4_5_core.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_4_5_Core
+ \inmodule QtOpenGL
+ \since 5.5
+ \wrapper
+ \brief The QOpenGLFunctions_4_5_Core class provides all functions for OpenGL 4.5 core profile.
+
+ This class is a wrapper for functions from OpenGL 4.5 core profile.
+ See reference pages on \l {http://www.opengl.org/sdk/docs/}{opengl.org}
+ for function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_4_5_Core::QOpenGLFunctions_4_5_Core()
+ : QAbstractOpenGLFunctions()
+ , d_1_0_Core(nullptr)
+ , d_1_1_Core(nullptr)
+ , d_1_2_Core(nullptr)
+ , d_1_3_Core(nullptr)
+ , d_1_4_Core(nullptr)
+ , d_1_5_Core(nullptr)
+ , d_2_0_Core(nullptr)
+ , d_2_1_Core(nullptr)
+ , d_3_0_Core(nullptr)
+ , d_3_1_Core(nullptr)
+ , d_3_2_Core(nullptr)
+ , d_3_3_Core(nullptr)
+ , d_4_0_Core(nullptr)
+ , d_4_1_Core(nullptr)
+ , d_4_2_Core(nullptr)
+ , d_4_3_Core(nullptr)
+ , d_4_4_Core(nullptr)
+ , d_4_5_Core(nullptr)
+{
+}
+
+QOpenGLFunctions_4_5_Core::~QOpenGLFunctions_4_5_Core()
+{
+ if (d_1_0_Core) {
+ d_1_0_Core->refs.deref();
+ Q_ASSERT(d_1_0_Core->refs.loadRelaxed());
+ }
+ if (d_1_1_Core) {
+ d_1_1_Core->refs.deref();
+ Q_ASSERT(d_1_1_Core->refs.loadRelaxed());
+ }
+ if (d_1_2_Core) {
+ d_1_2_Core->refs.deref();
+ Q_ASSERT(d_1_2_Core->refs.loadRelaxed());
+ }
+ if (d_1_3_Core) {
+ d_1_3_Core->refs.deref();
+ Q_ASSERT(d_1_3_Core->refs.loadRelaxed());
+ }
+ if (d_1_4_Core) {
+ d_1_4_Core->refs.deref();
+ Q_ASSERT(d_1_4_Core->refs.loadRelaxed());
+ }
+ if (d_1_5_Core) {
+ d_1_5_Core->refs.deref();
+ Q_ASSERT(d_1_5_Core->refs.loadRelaxed());
+ }
+ if (d_2_0_Core) {
+ d_2_0_Core->refs.deref();
+ Q_ASSERT(d_2_0_Core->refs.loadRelaxed());
+ }
+ if (d_2_1_Core) {
+ d_2_1_Core->refs.deref();
+ Q_ASSERT(d_2_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_0_Core) {
+ d_3_0_Core->refs.deref();
+ Q_ASSERT(d_3_0_Core->refs.loadRelaxed());
+ }
+ if (d_3_1_Core) {
+ d_3_1_Core->refs.deref();
+ Q_ASSERT(d_3_1_Core->refs.loadRelaxed());
+ }
+ if (d_3_2_Core) {
+ d_3_2_Core->refs.deref();
+ Q_ASSERT(d_3_2_Core->refs.loadRelaxed());
+ }
+ if (d_3_3_Core) {
+ d_3_3_Core->refs.deref();
+ Q_ASSERT(d_3_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_0_Core) {
+ d_4_0_Core->refs.deref();
+ Q_ASSERT(d_4_0_Core->refs.loadRelaxed());
+ }
+ if (d_4_1_Core) {
+ d_4_1_Core->refs.deref();
+ Q_ASSERT(d_4_1_Core->refs.loadRelaxed());
+ }
+ if (d_4_2_Core) {
+ d_4_2_Core->refs.deref();
+ Q_ASSERT(d_4_2_Core->refs.loadRelaxed());
+ }
+ if (d_4_3_Core) {
+ d_4_3_Core->refs.deref();
+ Q_ASSERT(d_4_3_Core->refs.loadRelaxed());
+ }
+ if (d_4_4_Core) {
+ d_4_4_Core->refs.deref();
+ Q_ASSERT(d_4_4_Core->refs.loadRelaxed());
+ }
+ if (d_4_5_Core) {
+ d_4_5_Core->refs.deref();
+ Q_ASSERT(d_4_5_Core->refs.loadRelaxed());
+ }
+}
+
+bool QOpenGLFunctions_4_5_Core::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is capable of resolving all needed functions
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_4_5_Core::isContextCompatible(context))
+ {
+ // Associate with private implementation, creating if necessary
+ // Function pointers in the backends are resolved at creation time
+ QOpenGLVersionFunctionsBackend* d = nullptr;
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_0_CoreBackend::versionStatus());
+ d_1_0_Core = static_cast<QOpenGLFunctions_1_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_1_CoreBackend::versionStatus());
+ d_1_1_Core = static_cast<QOpenGLFunctions_1_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_2_CoreBackend::versionStatus());
+ d_1_2_Core = static_cast<QOpenGLFunctions_1_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_3_CoreBackend::versionStatus());
+ d_1_3_Core = static_cast<QOpenGLFunctions_1_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_4_CoreBackend::versionStatus());
+ d_1_4_Core = static_cast<QOpenGLFunctions_1_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_1_5_CoreBackend::versionStatus());
+ d_1_5_Core = static_cast<QOpenGLFunctions_1_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_0_CoreBackend::versionStatus());
+ d_2_0_Core = static_cast<QOpenGLFunctions_2_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_2_1_CoreBackend::versionStatus());
+ d_2_1_Core = static_cast<QOpenGLFunctions_2_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_0_CoreBackend::versionStatus());
+ d_3_0_Core = static_cast<QOpenGLFunctions_3_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_1_CoreBackend::versionStatus());
+ d_3_1_Core = static_cast<QOpenGLFunctions_3_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_2_CoreBackend::versionStatus());
+ d_3_2_Core = static_cast<QOpenGLFunctions_3_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_3_3_CoreBackend::versionStatus());
+ d_3_3_Core = static_cast<QOpenGLFunctions_3_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_0_CoreBackend::versionStatus());
+ d_4_0_Core = static_cast<QOpenGLFunctions_4_0_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_1_CoreBackend::versionStatus());
+ d_4_1_Core = static_cast<QOpenGLFunctions_4_1_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_2_CoreBackend::versionStatus());
+ d_4_2_Core = static_cast<QOpenGLFunctions_4_2_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_3_CoreBackend::versionStatus());
+ d_4_3_Core = static_cast<QOpenGLFunctions_4_3_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_4_CoreBackend::versionStatus());
+ d_4_4_Core = static_cast<QOpenGLFunctions_4_4_CoreBackend*>(d);
+ d->refs.ref();
+
+ d = QAbstractOpenGLFunctionsPrivate::functionsBackend(context, QOpenGLFunctions_4_5_CoreBackend::versionStatus());
+ d_4_5_Core = static_cast<QOpenGLFunctions_4_5_CoreBackend*>(d);
+ d->refs.ref();
+
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_4_5_Core::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(4, 5))
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_4_5_Core::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ v.setVersion(4, 5);
+ v.setProfile(QSurfaceFormat::CoreProfile);
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_4_5_core.h b/src/opengl/qopenglfunctions_4_5_core.h
new file mode 100644
index 0000000000..fe0c0f1917
--- /dev/null
+++ b/src/opengl/qopenglfunctions_4_5_core.h
@@ -0,0 +1,4073 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_4_5_CORE_H
+#define QOPENGLVERSIONFUNCTIONS_4_5_CORE_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+// MemoryBarrier is a macro on some architectures on Windows
+#ifdef Q_OS_WIN
+#pragma push_macro("MemoryBarrier")
+#undef MemoryBarrier
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_4_5_Core : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_4_5_Core();
+ ~QOpenGLFunctions_4_5_Core();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL 1.0 core functions
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glDepthRange(GLdouble nearVal, GLdouble farVal);
+ GLboolean glIsEnabled(GLenum cap);
+ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+ void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
+ const GLubyte * glGetString(GLenum name);
+ void glGetIntegerv(GLenum pname, GLint *data);
+ void glGetFloatv(GLenum pname, GLfloat *data);
+ GLenum glGetError();
+ void glGetDoublev(GLenum pname, GLdouble *data);
+ void glGetBooleanv(GLenum pname, GLboolean *data);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+ void glReadBuffer(GLenum src);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPixelStoref(GLenum pname, GLfloat param);
+ void glDepthFunc(GLenum func);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glLogicOp(GLenum opcode);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glFlush();
+ void glFinish();
+ void glEnable(GLenum cap);
+ void glDisable(GLenum cap);
+ void glDepthMask(GLboolean flag);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glStencilMask(GLuint mask);
+ void glClearDepth(GLdouble depth);
+ void glClearStencil(GLint s);
+ void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glClear(GLbitfield mask);
+ void glDrawBuffer(GLenum buf);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glPolygonMode(GLenum face, GLenum mode);
+ void glPointSize(GLfloat size);
+ void glLineWidth(GLfloat width);
+ void glHint(GLenum target, GLenum mode);
+ void glFrontFace(GLenum mode);
+ void glCullFace(GLenum mode);
+
+ // OpenGL 1.1 core functions
+ GLboolean glIsTexture(GLuint texture);
+ void glGenTextures(GLsizei n, GLuint *textures);
+ void glDeleteTextures(GLsizei n, const GLuint *textures);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+ void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ // OpenGL 1.2 core functions
+ void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ void glBlendEquation(GLenum mode);
+ void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+ void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+ void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+
+ // OpenGL 1.3 core functions
+ void glGetCompressedTexImage(GLenum target, GLint level, void *img);
+ void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+ void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+ void glSampleCoverage(GLfloat value, GLboolean invert);
+ void glActiveTexture(GLenum texture);
+
+ // OpenGL 1.4 core functions
+ void glPointParameteriv(GLenum pname, const GLint *params);
+ void glPointParameteri(GLenum pname, GLint param);
+ void glPointParameterfv(GLenum pname, const GLfloat *params);
+ void glPointParameterf(GLenum pname, GLfloat param);
+ void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount);
+ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+ void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+ // OpenGL 1.5 core functions
+ void glGetBufferPointerv(GLenum target, GLenum pname, void * *params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ GLboolean glUnmapBuffer(GLenum target);
+ void * glMapBuffer(GLenum target, GLenum access);
+ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+ void glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+ GLboolean glIsBuffer(GLuint buffer);
+ void glGenBuffers(GLsizei n, GLuint *buffers);
+ void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+ void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+ void glGetQueryiv(GLenum target, GLenum pname, GLint *params);
+ void glEndQuery(GLenum target);
+ void glBeginQuery(GLenum target, GLuint id);
+ GLboolean glIsQuery(GLuint id);
+ void glDeleteQueries(GLsizei n, const GLuint *ids);
+ void glGenQueries(GLsizei n, GLuint *ids);
+
+ // OpenGL 2.0 core functions
+ void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+ void glVertexAttrib4usv(GLuint index, const GLushort *v);
+ void glVertexAttrib4uiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4sv(GLuint index, const GLshort *v);
+ void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+ void glVertexAttrib4iv(GLuint index, const GLint *v);
+ void glVertexAttrib4fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttrib4bv(GLuint index, const GLbyte *v);
+ void glVertexAttrib4Nusv(GLuint index, const GLushort *v);
+ void glVertexAttrib4Nuiv(GLuint index, const GLuint *v);
+ void glVertexAttrib4Nubv(GLuint index, const GLubyte *v);
+ void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+ void glVertexAttrib4Nsv(GLuint index, const GLshort *v);
+ void glVertexAttrib4Niv(GLuint index, const GLint *v);
+ void glVertexAttrib4Nbv(GLuint index, const GLbyte *v);
+ void glVertexAttrib3sv(GLuint index, const GLshort *v);
+ void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);
+ void glVertexAttrib3fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttrib2sv(GLuint index, const GLshort *v);
+ void glVertexAttrib2s(GLuint index, GLshort x, GLshort y);
+ void glVertexAttrib2fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
+ void glVertexAttrib2dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttrib1sv(GLuint index, const GLshort *v);
+ void glVertexAttrib1s(GLuint index, GLshort x);
+ void glVertexAttrib1fv(GLuint index, const GLfloat *v);
+ void glVertexAttrib1f(GLuint index, GLfloat x);
+ void glVertexAttrib1dv(GLuint index, const GLdouble *v);
+ void glVertexAttrib1d(GLuint index, GLdouble x);
+ void glValidateProgram(GLuint program);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ void glUniform2i(GLint location, GLint v0, GLint v1);
+ void glUniform1i(GLint location, GLint v0);
+ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ void glUniform1f(GLint location, GLfloat v0);
+ void glUseProgram(GLuint program);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+ void glLinkProgram(GLuint program);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsProgram(GLuint program);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
+ void glGetUniformiv(GLuint program, GLint location, GLint *params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat *params);
+ GLint glGetUniformLocation(GLuint program, const GLchar *name);
+ void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ GLint glGetAttribLocation(GLuint program, const GLchar *name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ void glEnableVertexAttribArray(GLuint index);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDeleteShader(GLuint shader);
+ void glDeleteProgram(GLuint program);
+ GLuint glCreateShader(GLenum type);
+ GLuint glCreateProgram();
+ void glCompileShader(GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+ void glDrawBuffers(GLsizei n, const GLenum *bufs);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+
+ // OpenGL 2.1 core functions
+ void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+ // OpenGL 3.0 core functions
+ GLboolean glIsVertexArray(GLuint array);
+ void glGenVertexArrays(GLsizei n, GLuint *arrays);
+ void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ void glBindVertexArray(GLuint array);
+ void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ void * glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glGenerateMipmap(GLenum target);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ const GLubyte * glGetStringi(GLenum name, GLuint index);
+ void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+ void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
+ void glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
+ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
+ void glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
+ void glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ void glUniform1ui(GLint location, GLuint v0);
+ GLint glGetFragDataLocation(GLuint program, const GLchar *name);
+ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name);
+ void glGetUniformuiv(GLuint program, GLint location, GLuint *params);
+ void glVertexAttribI4usv(GLuint index, const GLushort *v);
+ void glVertexAttribI4ubv(GLuint index, const GLubyte *v);
+ void glVertexAttribI4sv(GLuint index, const GLshort *v);
+ void glVertexAttribI4bv(GLuint index, const GLbyte *v);
+ void glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI3uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI2uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI1uiv(GLuint index, const GLuint *v);
+ void glVertexAttribI4iv(GLuint index, const GLint *v);
+ void glVertexAttribI3iv(GLuint index, const GLint *v);
+ void glVertexAttribI2iv(GLuint index, const GLint *v);
+ void glVertexAttribI1iv(GLuint index, const GLint *v);
+ void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+ void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z);
+ void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y);
+ void glVertexAttribI1ui(GLuint index, GLuint x);
+ void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
+ void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z);
+ void glVertexAttribI2i(GLuint index, GLint x, GLint y);
+ void glVertexAttribI1i(GLuint index, GLint x);
+ void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glEndConditionalRender();
+ void glBeginConditionalRender(GLuint id, GLenum mode);
+ void glClampColor(GLenum target, GLenum clamp);
+ void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+ void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glEndTransformFeedback();
+ void glBeginTransformFeedback(GLenum primitiveMode);
+ GLboolean glIsEnabledi(GLenum target, GLuint index);
+ void glDisablei(GLenum target, GLuint index);
+ void glEnablei(GLenum target, GLuint index);
+ void glGetIntegeri_v(GLenum target, GLuint index, GLint *data);
+ void glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
+ void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+ // OpenGL 3.1 core functions
+ void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ GLuint glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+ void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices);
+ void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+ void glPrimitiveRestartIndex(GLuint index);
+ void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
+ void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+ void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+
+ // OpenGL 3.2 core functions
+ void glSampleMaski(GLuint maskNumber, GLbitfield mask);
+ void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
+ void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
+ void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
+ void glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
+ void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ void glGetInteger64v(GLenum pname, GLint64 *data);
+ void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
+ void glDeleteSync(GLsync sync);
+ GLboolean glIsSync(GLsync sync);
+ GLsync glFenceSync(GLenum condition, GLbitfield flags);
+ void glProvokingVertex(GLenum mode);
+ void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex);
+ void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+ void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+ void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+
+ // OpenGL 3.3 core functions
+ void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+ void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+ void glVertexAttribDivisor(GLuint index, GLuint divisor);
+ void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
+ void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+ void glQueryCounter(GLuint id, GLenum target);
+ void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
+ void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
+ void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
+ void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
+ void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
+ void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
+ void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
+ void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ void glBindSampler(GLuint unit, GLuint sampler);
+ GLboolean glIsSampler(GLuint sampler);
+ void glDeleteSamplers(GLsizei count, const GLuint *samplers);
+ void glGenSamplers(GLsizei count, GLuint *samplers);
+ GLint glGetFragDataIndex(GLuint program, const GLchar *name);
+ void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+
+ // OpenGL 4.0 core functions
+ void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params);
+ void glEndQueryIndexed(GLenum target, GLuint index);
+ void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id);
+ void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
+ void glDrawTransformFeedback(GLenum mode, GLuint id);
+ void glResumeTransformFeedback();
+ void glPauseTransformFeedback();
+ GLboolean glIsTransformFeedback(GLuint id);
+ void glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ void glBindTransformFeedback(GLenum target, GLuint id);
+ void glPatchParameterfv(GLenum pname, const GLfloat *values);
+ void glPatchParameteri(GLenum pname, GLint value);
+ void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+ void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params);
+ void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices);
+ void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+ void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+ GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name);
+ GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name);
+ void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
+ void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
+ void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
+ void glUniform2d(GLint location, GLdouble x, GLdouble y);
+ void glUniform1d(GLint location, GLdouble x);
+ void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
+ void glDrawArraysIndirect(GLenum mode, const void *indirect);
+ void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBlendFunci(GLuint buf, GLenum src, GLenum dst);
+ void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+ void glBlendEquationi(GLuint buf, GLenum mode);
+ void glMinSampleShading(GLfloat value);
+
+ // OpenGL 4.1 core functions
+ void glGetDoublei_v(GLenum target, GLuint index, GLdouble *data);
+ void glGetFloati_v(GLenum target, GLuint index, GLfloat *data);
+ void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f);
+ void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v);
+ void glScissorIndexedv(GLuint index, const GLint *v);
+ void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+ void glScissorArrayv(GLuint first, GLsizei count, const GLint *v);
+ void glViewportIndexedfv(GLuint index, const GLfloat *v);
+ void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+ void glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v);
+ void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
+ void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+ void glVertexAttribL4dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL3dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL2dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL1dv(GLuint index, const GLdouble *v);
+ void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+ void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+ void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y);
+ void glVertexAttribL1d(GLuint index, GLdouble x);
+ void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ void glValidateProgramPipeline(GLuint pipeline);
+ void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+ void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+ void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+ void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
+ void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+ void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+ void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ void glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value);
+ void glProgramUniform1d(GLuint program, GLint location, GLdouble v0);
+ void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ void glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ void glProgramUniform1i(GLuint program, GLint location, GLint v0);
+ void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ GLboolean glIsProgramPipeline(GLuint pipeline);
+ void glGenProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ void glBindProgramPipeline(GLuint pipeline);
+ GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
+ void glActiveShaderProgram(GLuint pipeline, GLuint program);
+ void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ void glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ void glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+ void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+ void glClearDepthf(GLfloat dd);
+ void glDepthRangef(GLfloat n, GLfloat f);
+ void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+ void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+ void glReleaseShaderCompiler();
+
+ // OpenGL 4.2 core functions
+ void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+ void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount);
+ void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+ void glMemoryBarrier(GLbitfield barriers);
+ void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+ void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+ void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+ void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+ void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+ void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+
+ // OpenGL 4.3 core functions
+ void glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+ void glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
+ void glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+ void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+ void glPopDebugGroup();
+ void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message);
+ GLuint glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+ void glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
+ void glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+ void glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+ void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
+ void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
+ void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+ void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+ void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+ void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
+ GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+ void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+ GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+ void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+ void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+ void glInvalidateBufferData(GLuint buffer);
+ void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length);
+ void glInvalidateTexImage(GLuint texture, GLint level);
+ void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
+ void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
+ void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ void glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
+ void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+ void glDispatchComputeIndirect(GLintptr indirect);
+ void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+ void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
+ void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
+
+ // OpenGL 4.4 core functions
+ void glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
+ void glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures);
+ void glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers);
+ void glBindTextures(GLuint first, GLsizei count, const GLuint *textures);
+ void glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);
+ void glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers);
+ void glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+ void glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
+ void glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
+
+ // OpenGL 4.5 core functions
+ void glTextureBarrier();
+ void glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+ void glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+ void glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params);
+ void glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+ void glGetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params);
+ void glGetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+ void glGetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels);
+ GLenum glGetGraphicsResetStatus();
+ void glGetCompressedTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels);
+ void glGetTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+ void glMemoryBarrierByRegion(GLbitfield barriers);
+ void glCreateQueries(GLenum target, GLsizei n, GLuint *ids);
+ void glCreateProgramPipelines(GLsizei n, GLuint *pipelines);
+ void glCreateSamplers(GLsizei n, GLuint *samplers);
+ void glGetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64 *param);
+ void glGetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint *param);
+ void glGetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param);
+ void glVertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor);
+ void glVertexArrayAttribLFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexArrayAttribIFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ void glVertexArrayAttribFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+ void glVertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex);
+ void glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
+ void glVertexArrayVertexBuffer(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+ void glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer);
+ void glEnableVertexArrayAttrib(GLuint vaobj, GLuint index);
+ void glDisableVertexArrayAttrib(GLuint vaobj, GLuint index);
+ void glCreateVertexArrays(GLsizei n, GLuint *arrays);
+ void glGetTextureParameteriv(GLuint texture, GLenum pname, GLint *params);
+ void glGetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params);
+ void glGetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params);
+ void glGetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params);
+ void glGetTextureLevelParameteriv(GLuint texture, GLint level, GLenum pname, GLint *params);
+ void glGetTextureLevelParameterfv(GLuint texture, GLint level, GLenum pname, GLfloat *params);
+ void glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, void *pixels);
+ void glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+ void glBindTextureUnit(GLuint unit, GLuint texture);
+ void glGenerateTextureMipmap(GLuint texture);
+ void glTextureParameteriv(GLuint texture, GLenum pname, const GLint *param);
+ void glTextureParameterIuiv(GLuint texture, GLenum pname, const GLuint *params);
+ void glTextureParameterIiv(GLuint texture, GLenum pname, const GLint *params);
+ void glTextureParameteri(GLuint texture, GLenum pname, GLint param);
+ void glTextureParameterfv(GLuint texture, GLenum pname, const GLfloat *param);
+ void glTextureParameterf(GLuint texture, GLenum pname, GLfloat param);
+ void glCopyTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glCopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+ void glCompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+ void glCompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+ void glTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+ void glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+ void glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
+ void glTextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+ void glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+ void glTextureStorage3D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ void glTextureStorage2D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ void glTextureStorage1D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);
+ void glTextureBufferRange(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size);
+ void glTextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer);
+ void glCreateTextures(GLenum target, GLsizei n, GLuint *textures);
+ void glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params);
+ void glNamedRenderbufferStorageMultisample(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ void glNamedRenderbufferStorage(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);
+ void glCreateRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ void glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params);
+ void glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param);
+ GLenum glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target);
+ void glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ void glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil);
+ void glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value);
+ void glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value);
+ void glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value);
+ void glInvalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+ void glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments);
+ void glNamedFramebufferReadBuffer(GLuint framebuffer, GLenum src);
+ void glNamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum *bufs);
+ void glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf);
+ void glNamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ void glNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);
+ void glNamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param);
+ void glNamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glCreateFramebuffers(GLsizei n, GLuint *framebuffers);
+ void glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, void *data);
+ void glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void * *params);
+ void glGetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64 *params);
+ void glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params);
+ void glFlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length);
+ GLboolean glUnmapNamedBuffer(GLuint buffer);
+ void * glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access);
+ void * glMapNamedBuffer(GLuint buffer, GLenum access);
+ void glClearNamedBufferSubData(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data);
+ void glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);
+ void glCopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size);
+ void glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, const void *data);
+ void glNamedBufferData(GLuint buffer, GLsizei size, const void *data, GLenum usage);
+ void glNamedBufferStorage(GLuint buffer, GLsizei size, const void *data, GLbitfield flags);
+ void glCreateBuffers(GLsizei n, GLuint *buffers);
+ void glGetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param);
+ void glGetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param);
+ void glGetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param);
+ void glTransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size);
+ void glTransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer);
+ void glCreateTransformFeedbacks(GLsizei n, GLuint *ids);
+ void glClipControl(GLenum origin, GLenum depth);
+
+private:
+ friend class QOpenGLVersionFunctionsFactory;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ QOpenGLFunctions_1_0_CoreBackend* d_1_0_Core;
+ QOpenGLFunctions_1_1_CoreBackend* d_1_1_Core;
+ QOpenGLFunctions_1_2_CoreBackend* d_1_2_Core;
+ QOpenGLFunctions_1_3_CoreBackend* d_1_3_Core;
+ QOpenGLFunctions_1_4_CoreBackend* d_1_4_Core;
+ QOpenGLFunctions_1_5_CoreBackend* d_1_5_Core;
+ QOpenGLFunctions_2_0_CoreBackend* d_2_0_Core;
+ QOpenGLFunctions_2_1_CoreBackend* d_2_1_Core;
+ QOpenGLFunctions_3_0_CoreBackend* d_3_0_Core;
+ QOpenGLFunctions_3_1_CoreBackend* d_3_1_Core;
+ QOpenGLFunctions_3_2_CoreBackend* d_3_2_Core;
+ QOpenGLFunctions_3_3_CoreBackend* d_3_3_Core;
+ QOpenGLFunctions_4_0_CoreBackend* d_4_0_Core;
+ QOpenGLFunctions_4_1_CoreBackend* d_4_1_Core;
+ QOpenGLFunctions_4_2_CoreBackend* d_4_2_Core;
+ QOpenGLFunctions_4_3_CoreBackend* d_4_3_Core;
+ QOpenGLFunctions_4_4_CoreBackend* d_4_4_Core;
+ QOpenGLFunctions_4_5_CoreBackend* d_4_5_Core;
+};
+
+// OpenGL 1.0 core functions
+inline void QOpenGLFunctions_4_5_Core::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Viewport(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDepthRange(GLdouble nearVal, GLdouble farVal)
+{
+ d_1_0_Core->f.DepthRange(nearVal, farVal);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsEnabled(GLenum cap)
+{
+ return d_1_0_Core->f.IsEnabled(cap);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexLevelParameteriv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexLevelParameterfv(target, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_0_Core->f.GetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
+{
+ d_1_0_Core->f.GetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)
+{
+ d_1_0_Core->f.GetTexImage(target, level, format, type, pixels);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_5_Core::glGetString(GLenum name)
+{
+ return d_1_0_Core->f.GetString(name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetIntegerv(GLenum pname, GLint *data)
+{
+ d_1_0_Core->f.GetIntegerv(pname, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetFloatv(GLenum pname, GLfloat *data)
+{
+ d_1_0_Core->f.GetFloatv(pname, data);
+}
+
+inline GLenum QOpenGLFunctions_4_5_Core::glGetError()
+{
+ return d_1_0_Core->f.GetError();
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetDoublev(GLenum pname, GLdouble *data)
+{
+ d_1_0_Core->f.GetDoublev(pname, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetBooleanv(GLenum pname, GLboolean *data)
+{
+ d_1_0_Core->f.GetBooleanv(pname, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
+{
+ d_1_0_Core->f.ReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glReadBuffer(GLenum src)
+{
+ d_1_0_Core->f.ReadBuffer(src);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPixelStorei(GLenum pname, GLint param)
+{
+ d_1_0_Core->f.PixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPixelStoref(GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.PixelStoref(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDepthFunc(GLenum func)
+{
+ d_1_0_Core->f.DepthFunc(func);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ d_1_0_Core->f.StencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ d_1_0_Core->f.StencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glLogicOp(GLenum opcode)
+{
+ d_1_0_Core->f.LogicOp(opcode);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ d_1_0_Core->f.BlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFlush()
+{
+ d_1_0_Core->f.Flush();
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFinish()
+{
+ d_1_0_Core->f.Finish();
+}
+
+inline void QOpenGLFunctions_4_5_Core::glEnable(GLenum cap)
+{
+ d_1_0_Core->f.Enable(cap);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDisable(GLenum cap)
+{
+ d_1_0_Core->f.Disable(cap);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDepthMask(GLboolean flag)
+{
+ d_1_0_Core->f.DepthMask(flag);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ d_1_0_Core->f.ColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glStencilMask(GLuint mask)
+{
+ d_1_0_Core->f.StencilMask(mask);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearDepth(GLdouble depth)
+{
+ d_1_0_Core->f.ClearDepth(depth);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearStencil(GLint s)
+{
+ d_1_0_Core->f.ClearStencil(s);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_0_Core->f.ClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClear(GLbitfield mask)
+{
+ d_1_0_Core->f.Clear(mask);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawBuffer(GLenum buf)
+{
+ d_1_0_Core->f.DrawBuffer(buf);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_0_Core->f.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_0_Core->f.TexImage1D(target, level, internalformat, width, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_1_0_Core->f.TexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_1_0_Core->f.TexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
+{
+ d_1_0_Core->f.TexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ d_1_0_Core->f.TexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_0_Core->f.Scissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPolygonMode(GLenum face, GLenum mode)
+{
+ d_1_0_Core->f.PolygonMode(face, mode);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPointSize(GLfloat size)
+{
+ d_1_0_Core->f.PointSize(size);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glLineWidth(GLfloat width)
+{
+ d_1_0_Core->f.LineWidth(width);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glHint(GLenum target, GLenum mode)
+{
+ d_1_0_Core->f.Hint(target, mode);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFrontFace(GLenum mode)
+{
+ d_1_0_Core->f.FrontFace(mode);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCullFace(GLenum mode)
+{
+ d_1_0_Core->f.CullFace(mode);
+}
+
+
+// OpenGL 1.1 core functions
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsTexture(GLuint texture)
+{
+ return d_1_1_Core->f.IsTexture(texture);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGenTextures(GLsizei n, GLuint *textures)
+{
+ d_1_1_Core->f.GenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteTextures(GLsizei n, const GLuint *textures)
+{
+ d_1_1_Core->f.DeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindTexture(GLenum target, GLuint texture)
+{
+ d_1_1_Core->f.BindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_1_Core->f.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_1_Core->f.TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_1_Core->f.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_1_1_Core->f.CopyTexSubImage1D(target, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
+{
+ d_1_1_Core->f.CopyTexImage1D(target, level, internalformat, x, y, width, border);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ d_1_1_Core->f.PolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
+{
+ d_1_1_Core->f.DrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ d_1_1_Core->f.DrawArrays(mode, first, count);
+}
+
+
+// OpenGL 1.2 core functions
+inline void QOpenGLFunctions_4_5_Core::glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+ d_1_2_Core->f.BlendColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBlendEquation(GLenum mode)
+{
+ d_1_2_Core->f.BlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_1_2_Core->f.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_2_Core->f.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+ d_1_2_Core->f.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices)
+{
+ d_1_2_Core->f.DrawRangeElements(mode, start, end, count, type, indices);
+}
+
+
+// OpenGL 1.3 core functions
+inline void QOpenGLFunctions_4_5_Core::glGetCompressedTexImage(GLenum target, GLint level, void *img)
+{
+ d_1_3_Core->f.GetCompressedTexImage(target, level, img);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
+{
+ d_1_3_Core->f.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glSampleCoverage(GLfloat value, GLboolean invert)
+{
+ d_1_3_Core->f.SampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glActiveTexture(GLenum texture)
+{
+ d_1_3_Core->f.ActiveTexture(texture);
+}
+
+
+// OpenGL 1.4 core functions
+inline void QOpenGLFunctions_4_5_Core::glPointParameteriv(GLenum pname, const GLint *params)
+{
+ d_1_4_Core->f.PointParameteriv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPointParameteri(GLenum pname, GLint param)
+{
+ d_1_4_Core->f.PointParameteri(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPointParameterfv(GLenum pname, const GLfloat *params)
+{
+ d_1_4_Core->f.PointParameterfv(pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPointParameterf(GLenum pname, GLfloat param)
+{
+ d_1_4_Core->f.PointParameterf(pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawElements(mode, count, type, indices, drawcount);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)
+{
+ d_1_4_Core->f.MultiDrawArrays(mode, first, count, drawcount);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
+{
+ d_1_4_Core->f.BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
+}
+
+
+// OpenGL 1.5 core functions
+inline void QOpenGLFunctions_4_5_Core::glGetBufferPointerv(GLenum target, GLenum pname, void * *params)
+{
+ d_1_5_Core->f.GetBufferPointerv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetBufferParameteriv(target, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glUnmapBuffer(GLenum target)
+{
+ return d_1_5_Core->f.UnmapBuffer(target);
+}
+
+inline void * QOpenGLFunctions_4_5_Core::glMapBuffer(GLenum target, GLenum access)
+{
+ return d_1_5_Core->f.MapBuffer(target, access);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data)
+{
+ d_1_5_Core->f.GetBufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
+{
+ d_1_5_Core->f.BufferSubData(target, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
+{
+ d_1_5_Core->f.BufferData(target, size, data, usage);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsBuffer(GLuint buffer)
+{
+ return d_1_5_Core->f.IsBuffer(buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGenBuffers(GLsizei n, GLuint *buffers)
+{
+ d_1_5_Core->f.GenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+ d_1_5_Core->f.DeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindBuffer(GLenum target, GLuint buffer)
+{
+ d_1_5_Core->f.BindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+ d_1_5_Core->f.GetQueryObjectuiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryObjectiv(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_1_5_Core->f.GetQueryiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glEndQuery(GLenum target)
+{
+ d_1_5_Core->f.EndQuery(target);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBeginQuery(GLenum target, GLuint id)
+{
+ d_1_5_Core->f.BeginQuery(target, id);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsQuery(GLuint id)
+{
+ return d_1_5_Core->f.IsQuery(id);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+ d_1_5_Core->f.DeleteQueries(n, ids);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGenQueries(GLsizei n, GLuint *ids)
+{
+ d_1_5_Core->f.GenQueries(n, ids);
+}
+
+
+// OpenGL 2.0 core functions
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)
+{
+ d_2_0_Core->f.VertexAttribPointer(index, size, type, normalized, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4usv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4uiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4ubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
+{
+ d_2_0_Core->f.VertexAttrib4s(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4iv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib4fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ d_2_0_Core->f.VertexAttrib4f(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_2_0_Core->f.VertexAttrib4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4bv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nusv(GLuint index, const GLushort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nusv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nuiv(GLuint index, const GLuint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nuiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nubv(GLuint index, const GLubyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
+{
+ d_2_0_Core->f.VertexAttrib4Nub(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nsv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nsv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Niv(GLuint index, const GLint *v)
+{
+ d_2_0_Core->f.VertexAttrib4Niv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib4Nbv(GLuint index, const GLbyte *v)
+{
+ d_2_0_Core->f.VertexAttrib4Nbv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib3sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)
+{
+ d_2_0_Core->f.VertexAttrib3s(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib3fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
+{
+ d_2_0_Core->f.VertexAttrib3f(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_2_0_Core->f.VertexAttrib3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib2sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2s(GLuint index, GLshort x, GLshort y)
+{
+ d_2_0_Core->f.VertexAttrib2s(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib2fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
+{
+ d_2_0_Core->f.VertexAttrib2f(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_2_0_Core->f.VertexAttrib2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1sv(GLuint index, const GLshort *v)
+{
+ d_2_0_Core->f.VertexAttrib1sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1s(GLuint index, GLshort x)
+{
+ d_2_0_Core->f.VertexAttrib1s(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1fv(GLuint index, const GLfloat *v)
+{
+ d_2_0_Core->f.VertexAttrib1fv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1f(GLuint index, GLfloat x)
+{
+ d_2_0_Core->f.VertexAttrib1f(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1dv(GLuint index, const GLdouble *v)
+{
+ d_2_0_Core->f.VertexAttrib1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttrib1d(GLuint index, GLdouble x)
+{
+ d_2_0_Core->f.VertexAttrib1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glValidateProgram(GLuint program)
+{
+ d_2_0_Core->f.ValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_0_Core->f.UniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform4iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform4iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform3iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform3iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform2iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform2iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform1iv(GLint location, GLsizei count, const GLint *value)
+{
+ d_2_0_Core->f.Uniform1iv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform4fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform4fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform3fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform3fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform2fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform2fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform1fv(GLint location, GLsizei count, const GLfloat *value)
+{
+ d_2_0_Core->f.Uniform1fv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_2_0_Core->f.Uniform4i(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_2_0_Core->f.Uniform3i(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform2i(GLint location, GLint v0, GLint v1)
+{
+ d_2_0_Core->f.Uniform2i(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform1i(GLint location, GLint v0)
+{
+ d_2_0_Core->f.Uniform1i(location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_2_0_Core->f.Uniform4f(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_2_0_Core->f.Uniform3f(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform2f(GLint location, GLfloat v0, GLfloat v1)
+{
+ d_2_0_Core->f.Uniform2f(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform1f(GLint location, GLfloat v0)
+{
+ d_2_0_Core->f.Uniform1f(location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUseProgram(GLuint program)
+{
+ d_2_0_Core->f.UseProgram(program);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
+{
+ d_2_0_Core->f.ShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glLinkProgram(GLuint program)
+{
+ d_2_0_Core->f.LinkProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsShader(GLuint shader)
+{
+ return d_2_0_Core->f.IsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsProgram(GLuint program)
+{
+ return d_2_0_Core->f.IsProgram(program);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribPointerv(GLuint index, GLenum pname, void * *pointer)
+{
+ d_2_0_Core->f.GetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
+{
+ d_2_0_Core->f.GetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_2_0_Core->f.GetVertexAttribdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetUniformiv(GLuint program, GLint location, GLint *params)
+{
+ d_2_0_Core->f.GetUniformiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetUniformfv(GLuint program, GLint location, GLfloat *params)
+{
+ d_2_0_Core->f.GetUniformfv(program, location, params);
+}
+
+inline GLint QOpenGLFunctions_4_5_Core::glGetUniformLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+{
+ d_2_0_Core->f.GetShaderSource(shader, bufSize, length, source);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetShaderInfoLog(shader, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_2_0_Core->f.GetProgramInfoLog(program, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetProgramiv(GLuint program, GLenum pname, GLint *params)
+{
+ d_2_0_Core->f.GetProgramiv(program, pname, params);
+}
+
+inline GLint QOpenGLFunctions_4_5_Core::glGetAttribLocation(GLuint program, const GLchar *name)
+{
+ return d_2_0_Core->f.GetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
+{
+ d_2_0_Core->f.GetAttachedShaders(program, maxCount, count, shaders);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveUniform(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+{
+ d_2_0_Core->f.GetActiveAttrib(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glEnableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.EnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDisableVertexAttribArray(GLuint index)
+{
+ d_2_0_Core->f.DisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDetachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.DetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteShader(GLuint shader)
+{
+ d_2_0_Core->f.DeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteProgram(GLuint program)
+{
+ d_2_0_Core->f.DeleteProgram(program);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Core::glCreateShader(GLenum type)
+{
+ return d_2_0_Core->f.CreateShader(type);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Core::glCreateProgram()
+{
+ return d_2_0_Core->f.CreateProgram();
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCompileShader(GLuint shader)
+{
+ d_2_0_Core->f.CompileShader(shader);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)
+{
+ d_2_0_Core->f.BindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glAttachShader(GLuint program, GLuint shader)
+{
+ d_2_0_Core->f.AttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ d_2_0_Core->f.StencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ d_2_0_Core->f.StencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
+{
+ d_2_0_Core->f.StencilOpSeparate(face, sfail, dpfail, dppass);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+ d_2_0_Core->f.DrawBuffers(n, bufs);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ d_2_0_Core->f.BlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+
+// OpenGL 2.1 core functions
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_2_1_Core->f.UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+
+// OpenGL 3.0 core functions
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsVertexArray(GLuint array)
+{
+ return d_3_0_Core->f.IsVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGenVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_3_0_Core->f.GenVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
+{
+ d_3_0_Core->f.DeleteVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindVertexArray(GLuint array)
+{
+ d_3_0_Core->f.BindVertexArray(array);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+{
+ d_3_0_Core->f.FlushMappedBufferRange(target, offset, length);
+}
+
+inline void * QOpenGLFunctions_4_5_Core::glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+ return d_3_0_Core->f.MapBufferRange(target, offset, length, access);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_3_0_Core->f.FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_3_0_Core->f.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGenerateMipmap(GLenum target)
+{
+ d_3_0_Core->f.GenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_3_0_Core->f.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+ d_3_0_Core->f.FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ d_3_0_Core->f.FramebufferTexture1D(target, attachment, textarget, texture, level);
+}
+
+inline GLenum QOpenGLFunctions_4_5_Core::glCheckFramebufferStatus(GLenum target)
+{
+ return d_3_0_Core->f.CheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_3_0_Core->f.GenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ d_3_0_Core->f.DeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ d_3_0_Core->f.BindFramebuffer(target, framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsFramebuffer(GLuint framebuffer)
+{
+ return d_3_0_Core->f.IsFramebuffer(framebuffer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_3_0_Core->f.RenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_3_0_Core->f.GenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ d_3_0_Core->f.DeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ d_3_0_Core->f.BindRenderbuffer(target, renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return d_3_0_Core->f.IsRenderbuffer(renderbuffer);
+}
+
+inline const GLubyte * QOpenGLFunctions_4_5_Core::glGetStringi(GLenum name, GLuint index)
+{
+ return d_3_0_Core->f.GetStringi(name, index);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+ d_3_0_Core->f.ClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_3_0_Core->f.ClearBufferfv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_3_0_Core->f.ClearBufferuiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_3_0_Core->f.ClearBufferiv(buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetTexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetTexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
+{
+ d_3_0_Core->f.TexParameterIuiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexParameterIiv(GLenum target, GLenum pname, const GLint *params)
+{
+ d_3_0_Core->f.TexParameterIiv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform4uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform3uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform2uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+ d_3_0_Core->f.Uniform1uiv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_3_0_Core->f.Uniform4ui(location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_3_0_Core->f.Uniform3ui(location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+ d_3_0_Core->f.Uniform2ui(location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform1ui(GLint location, GLuint v0)
+{
+ d_3_0_Core->f.Uniform1ui(location, v0);
+}
+
+inline GLint QOpenGLFunctions_4_5_Core::glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+ return d_3_0_Core->f.GetFragDataLocation(program, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)
+{
+ d_3_0_Core->f.BindFragDataLocation(program, color, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+ d_3_0_Core->f.GetUniformuiv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4usv(GLuint index, const GLushort *v)
+{
+ d_3_0_Core->f.VertexAttribI4usv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4ubv(GLuint index, const GLubyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4ubv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4sv(GLuint index, const GLshort *v)
+{
+ d_3_0_Core->f.VertexAttribI4sv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4bv(GLuint index, const GLbyte *v)
+{
+ d_3_0_Core->f.VertexAttribI4bv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI4uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI3uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI3uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI2uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI2uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI1uiv(GLuint index, const GLuint *v)
+{
+ d_3_0_Core->f.VertexAttribI1uiv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI4iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI3iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI3iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI2iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI2iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI1iv(GLuint index, const GLint *v)
+{
+ d_3_0_Core->f.VertexAttribI1iv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+ d_3_0_Core->f.VertexAttribI4ui(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
+{
+ d_3_0_Core->f.VertexAttribI3ui(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)
+{
+ d_3_0_Core->f.VertexAttribI2ui(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI1ui(GLuint index, GLuint x)
+{
+ d_3_0_Core->f.VertexAttribI1ui(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+ d_3_0_Core->f.VertexAttribI4i(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+{
+ d_3_0_Core->f.VertexAttribI3i(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI2i(GLuint index, GLint x, GLint y)
+{
+ d_3_0_Core->f.VertexAttribI2i(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribI1i(GLuint index, GLint x)
+{
+ d_3_0_Core->f.VertexAttribI1i(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIuiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+ d_3_0_Core->f.GetVertexAttribIiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_3_0_Core->f.VertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glEndConditionalRender()
+{
+ d_3_0_Core->f.EndConditionalRender();
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBeginConditionalRender(GLuint id, GLenum mode)
+{
+ d_3_0_Core->f.BeginConditionalRender(id, mode);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClampColor(GLenum target, GLenum clamp)
+{
+ d_3_0_Core->f.ClampColor(target, clamp);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+ d_3_0_Core->f.GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const *varyings, GLenum bufferMode)
+{
+ d_3_0_Core->f.TransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ d_3_0_Core->f.BindBufferBase(target, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_3_0_Core->f.BindBufferRange(target, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glEndTransformFeedback()
+{
+ d_3_0_Core->f.EndTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBeginTransformFeedback(GLenum primitiveMode)
+{
+ d_3_0_Core->f.BeginTransformFeedback(primitiveMode);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsEnabledi(GLenum target, GLuint index)
+{
+ return d_3_0_Core->f.IsEnabledi(target, index);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDisablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Disablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glEnablei(GLenum target, GLuint index)
+{
+ d_3_0_Core->f.Enablei(target, index);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
+{
+ d_3_0_Core->f.GetIntegeri_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+ d_3_0_Core->f.GetBooleani_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+ d_3_0_Core->f.ColorMaski(index, r, g, b, a);
+}
+
+
+// OpenGL 3.1 core functions
+inline void QOpenGLFunctions_4_5_Core::glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+ d_3_1_Core->f.UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+ d_3_1_Core->f.GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Core::glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+ return d_3_1_Core->f.GetUniformBlockIndex(program, uniformBlockName);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)
+{
+ d_3_1_Core->f.GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+ d_3_1_Core->f.GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames, GLuint *uniformIndices)
+{
+ d_3_1_Core->f.GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+ d_3_1_Core->f.CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPrimitiveRestartIndex(GLuint index)
+{
+ d_3_1_Core->f.PrimitiveRestartIndex(index);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer)
+{
+ d_3_1_Core->f.TexBuffer(target, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+ d_3_1_Core->f.DrawArraysInstanced(mode, first, count, instancecount);
+}
+
+
+// OpenGL 3.2 core functions
+inline void QOpenGLFunctions_4_5_Core::glSampleMaski(GLuint maskNumber, GLbitfield mask)
+{
+ d_3_2_Core->f.SampleMaski(maskNumber, mask);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
+{
+ d_3_2_Core->f.GetMultisamplefv(pname, index, val);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_3_2_Core->f.TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
+{
+ d_3_2_Core->f.FramebufferTexture(target, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
+{
+ d_3_2_Core->f.GetBufferParameteri64v(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64i_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+ d_3_2_Core->f.GetSynciv(sync, pname, bufSize, length, values);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetInteger64v(GLenum pname, GLint64 *data)
+{
+ d_3_2_Core->f.GetInteger64v(pname, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ d_3_2_Core->f.WaitSync(sync, flags, timeout);
+}
+
+inline GLenum QOpenGLFunctions_4_5_Core::glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+ return d_3_2_Core->f.ClientWaitSync(sync, flags, timeout);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteSync(GLsync sync)
+{
+ d_3_2_Core->f.DeleteSync(sync);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsSync(GLsync sync)
+{
+ return d_3_2_Core->f.IsSync(sync);
+}
+
+inline GLsync QOpenGLFunctions_4_5_Core::glFenceSync(GLenum condition, GLbitfield flags)
+{
+ return d_3_2_Core->f.FenceSync(condition, flags);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProvokingVertex(GLenum mode)
+{
+ d_3_2_Core->f.ProvokingVertex(mode);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei drawcount, const GLint *basevertex)
+{
+ d_3_2_Core->f.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
+{
+ d_3_2_Core->f.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
+}
+
+
+// OpenGL 3.3 core functions
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP4uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP4ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP3uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP3ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP2uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP2ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint *value)
+{
+ d_3_3_Core->f.VertexAttribP1uiv(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value)
+{
+ d_3_3_Core->f.VertexAttribP1ui(index, type, normalized, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ d_3_3_Core->f.VertexAttribDivisor(index, divisor);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjectui64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+ d_3_3_Core->f.GetQueryObjecti64v(id, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glQueryCounter(GLuint id, GLenum target)
+{
+ d_3_3_Core->f.QueryCounter(id, target);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIuiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+ d_3_3_Core->f.GetSamplerParameterfv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameterIiv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+ d_3_3_Core->f.GetSamplerParameteriv(sampler, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
+{
+ d_3_3_Core->f.SamplerParameterIuiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameterIiv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+ d_3_3_Core->f.SamplerParameterfv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+ d_3_3_Core->f.SamplerParameterf(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+ d_3_3_Core->f.SamplerParameteriv(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+ d_3_3_Core->f.SamplerParameteri(sampler, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindSampler(GLuint unit, GLuint sampler)
+{
+ d_3_3_Core->f.BindSampler(unit, sampler);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsSampler(GLuint sampler)
+{
+ return d_3_3_Core->f.IsSampler(sampler);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+ d_3_3_Core->f.DeleteSamplers(count, samplers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGenSamplers(GLsizei count, GLuint *samplers)
+{
+ d_3_3_Core->f.GenSamplers(count, samplers);
+}
+
+inline GLint QOpenGLFunctions_4_5_Core::glGetFragDataIndex(GLuint program, const GLchar *name)
+{
+ return d_3_3_Core->f.GetFragDataIndex(program, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)
+{
+ d_3_3_Core->f.BindFragDataLocationIndexed(program, colorNumber, index, name);
+}
+
+
+// OpenGL 4.0 core functions
+inline void QOpenGLFunctions_4_5_Core::glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params)
+{
+ d_4_0_Core->f.GetQueryIndexediv(target, index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glEndQueryIndexed(GLenum target, GLuint index)
+{
+ d_4_0_Core->f.EndQueryIndexed(target, index);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBeginQueryIndexed(GLenum target, GLuint index, GLuint id)
+{
+ d_4_0_Core->f.BeginQueryIndexed(target, index, id);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream)
+{
+ d_4_0_Core->f.DrawTransformFeedbackStream(mode, id, stream);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawTransformFeedback(GLenum mode, GLuint id)
+{
+ d_4_0_Core->f.DrawTransformFeedback(mode, id);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glResumeTransformFeedback()
+{
+ d_4_0_Core->f.ResumeTransformFeedback();
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPauseTransformFeedback()
+{
+ d_4_0_Core->f.PauseTransformFeedback();
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsTransformFeedback(GLuint id)
+{
+ return d_4_0_Core->f.IsTransformFeedback(id);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_0_Core->f.GenTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+ d_4_0_Core->f.DeleteTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindTransformFeedback(GLenum target, GLuint id)
+{
+ d_4_0_Core->f.BindTransformFeedback(target, id);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPatchParameterfv(GLenum pname, const GLfloat *values)
+{
+ d_4_0_Core->f.PatchParameterfv(pname, values);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPatchParameteri(GLenum pname, GLint value)
+{
+ d_4_0_Core->f.PatchParameteri(pname, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetProgramStageiv(program, shadertype, pname, values);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint *params)
+{
+ d_4_0_Core->f.GetUniformSubroutineuiv(shadertype, location, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)
+{
+ d_4_0_Core->f.UniformSubroutinesuiv(shadertype, count, indices);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)
+{
+ d_4_0_Core->f.GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Core::glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineIndex(program, shadertype, name);
+}
+
+inline GLint QOpenGLFunctions_4_5_Core::glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar *name)
+{
+ return d_4_0_Core->f.GetSubroutineUniformLocation(program, shadertype, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetUniformdv(GLuint program, GLint location, GLdouble *params)
+{
+ d_4_0_Core->f.GetUniformdv(program, location, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3x2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2x3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix4dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix3dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_0_Core->f.UniformMatrix2dv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform4dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform4dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform3dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform3dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform2dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform2dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform1dv(GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_0_Core->f.Uniform1dv(location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_0_Core->f.Uniform4d(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_0_Core->f.Uniform3d(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform2d(GLint location, GLdouble x, GLdouble y)
+{
+ d_4_0_Core->f.Uniform2d(location, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUniform1d(GLint location, GLdouble x)
+{
+ d_4_0_Core->f.Uniform1d(location, x);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+{
+ d_4_0_Core->f.DrawElementsIndirect(mode, type, indirect);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawArraysIndirect(GLenum mode, const void *indirect)
+{
+ d_4_0_Core->f.DrawArraysIndirect(mode, indirect);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ d_4_0_Core->f.BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBlendFunci(GLuint buf, GLenum src, GLenum dst)
+{
+ d_4_0_Core->f.BlendFunci(buf, src, dst);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
+{
+ d_4_0_Core->f.BlendEquationSeparatei(buf, modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBlendEquationi(GLuint buf, GLenum mode)
+{
+ d_4_0_Core->f.BlendEquationi(buf, mode);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glMinSampleShading(GLfloat value)
+{
+ d_4_0_Core->f.MinSampleShading(value);
+}
+
+
+// OpenGL 4.1 core functions
+inline void QOpenGLFunctions_4_5_Core::glGetDoublei_v(GLenum target, GLuint index, GLdouble *data)
+{
+ d_4_1_Core->f.GetDoublei_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetFloati_v(GLenum target, GLuint index, GLfloat *data)
+{
+ d_4_1_Core->f.GetFloati_v(target, index, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f)
+{
+ d_4_1_Core->f.DepthRangeIndexed(index, n, f);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)
+{
+ d_4_1_Core->f.DepthRangeArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glScissorIndexedv(GLuint index, const GLint *v)
+{
+ d_4_1_Core->f.ScissorIndexedv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)
+{
+ d_4_1_Core->f.ScissorIndexed(index, left, bottom, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glScissorArrayv(GLuint first, GLsizei count, const GLint *v)
+{
+ d_4_1_Core->f.ScissorArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glViewportIndexedfv(GLuint index, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportIndexedfv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)
+{
+ d_4_1_Core->f.ViewportIndexedf(index, x, y, w, h);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
+{
+ d_4_1_Core->f.ViewportArrayv(first, count, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
+{
+ d_4_1_Core->f.GetVertexAttribLdv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
+{
+ d_4_1_Core->f.VertexAttribLPointer(index, size, type, stride, pointer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribL4dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL4dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribL3dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL3dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribL2dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL2dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribL1dv(GLuint index, const GLdouble *v)
+{
+ d_4_1_Core->f.VertexAttribL1dv(index, v);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+ d_4_1_Core->f.VertexAttribL4d(index, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
+{
+ d_4_1_Core->f.VertexAttribL3d(index, x, y, z);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
+{
+ d_4_1_Core->f.VertexAttribL2d(index, x, y);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribL1d(GLuint index, GLdouble x)
+{
+ d_4_1_Core->f.VertexAttribL1d(index, x);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+{
+ d_4_1_Core->f.GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glValidateProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.ValidateProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3x2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2x3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2dv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix4fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix3fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniformMatrix2fv(program, location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform4uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+ d_4_1_Core->f.ProgramUniform4ui(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform4dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)
+{
+ d_4_1_Core->f.ProgramUniform4d(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform4fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+ d_4_1_Core->f.ProgramUniform4f(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform4iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+ d_4_1_Core->f.ProgramUniform4i(program, location, v0, v1, v2, v3);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform3uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+ d_4_1_Core->f.ProgramUniform3ui(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform3dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
+{
+ d_4_1_Core->f.ProgramUniform3d(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform3fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+ d_4_1_Core->f.ProgramUniform3f(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform3iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+ d_4_1_Core->f.ProgramUniform3i(program, location, v0, v1, v2);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform2uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+ d_4_1_Core->f.ProgramUniform2ui(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform2dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
+{
+ d_4_1_Core->f.ProgramUniform2d(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform2fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+ d_4_1_Core->f.ProgramUniform2f(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform2iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
+{
+ d_4_1_Core->f.ProgramUniform2i(program, location, v0, v1);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+ d_4_1_Core->f.ProgramUniform1uiv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform1ui(GLuint program, GLint location, GLuint v0)
+{
+ d_4_1_Core->f.ProgramUniform1ui(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble *value)
+{
+ d_4_1_Core->f.ProgramUniform1dv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform1d(GLuint program, GLint location, GLdouble v0)
+{
+ d_4_1_Core->f.ProgramUniform1d(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+ d_4_1_Core->f.ProgramUniform1fv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+{
+ d_4_1_Core->f.ProgramUniform1f(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+ d_4_1_Core->f.ProgramUniform1iv(program, location, count, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramUniform1i(GLuint program, GLint location, GLint v0)
+{
+ d_4_1_Core->f.ProgramUniform1i(program, location, v0);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
+{
+ d_4_1_Core->f.GetProgramPipelineiv(pipeline, pname, params);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glIsProgramPipeline(GLuint pipeline)
+{
+ return d_4_1_Core->f.IsProgramPipeline(pipeline);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGenProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_1_Core->f.GenProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
+{
+ d_4_1_Core->f.DeleteProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindProgramPipeline(GLuint pipeline)
+{
+ d_4_1_Core->f.BindProgramPipeline(pipeline);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Core::glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
+{
+ return d_4_1_Core->f.CreateShaderProgramv(type, count, strings);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glActiveShaderProgram(GLuint pipeline, GLuint program)
+{
+ d_4_1_Core->f.ActiveShaderProgram(pipeline, program);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
+{
+ d_4_1_Core->f.UseProgramStages(pipeline, stages, program);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+ d_4_1_Core->f.ProgramParameteri(program, pname, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
+{
+ d_4_1_Core->f.ProgramBinary(program, binaryFormat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
+{
+ d_4_1_Core->f.GetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearDepthf(GLfloat dd)
+{
+ d_4_1_Core->f.ClearDepthf(dd);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDepthRangef(GLfloat n, GLfloat f)
+{
+ d_4_1_Core->f.DepthRangef(n, f);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
+{
+ d_4_1_Core->f.GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length)
+{
+ d_4_1_Core->f.ShaderBinary(count, shaders, binaryformat, binary, length);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glReleaseShaderCompiler()
+{
+ d_4_1_Core->f.ReleaseShaderCompiler();
+}
+
+
+// OpenGL 4.2 core functions
+inline void QOpenGLFunctions_4_5_Core::glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount)
+{
+ d_4_2_Core->f.DrawTransformFeedbackInstanced(mode, id, instancecount);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_2_Core->f.TexStorage3D(target, levels, internalformat, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+ d_4_2_Core->f.TexStorage1D(target, levels, internalformat, width);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glMemoryBarrier(GLbitfield barriers)
+{
+ d_4_2_Core->f.MemoryBarrier(barriers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
+{
+ d_4_2_Core->f.BindImageTexture(unit, texture, level, layered, layer, access, format);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)
+{
+ d_4_2_Core->f.GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
+{
+ d_4_2_Core->f.GetInternalformativ(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)
+{
+ d_4_2_Core->f.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
+}
+
+
+// OpenGL 4.3 core functions
+inline void QOpenGLFunctions_4_5_Core::glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+ d_4_3_Core->f.GetObjectPtrLabel(ptr, bufSize, length, label);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
+{
+ d_4_3_Core->f.ObjectPtrLabel(ptr, length, label);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+ d_4_3_Core->f.GetObjectLabel(identifier, name, bufSize, length, label);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
+{
+ d_4_3_Core->f.ObjectLabel(identifier, name, length, label);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPopDebugGroup()
+{
+ d_4_3_Core->f.PopDebugGroup();
+}
+
+inline void QOpenGLFunctions_4_5_Core::glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
+{
+ d_4_3_Core->f.PushDebugGroup(source, id, length, message);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Core::glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)
+{
+ return d_4_3_Core->f.GetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
+{
+ d_4_3_Core->f.DebugMessageCallback(callback, userParam);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)
+{
+ d_4_3_Core->f.DebugMessageInsert(source, type, id, severity, length, buf);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)
+{
+ d_4_3_Core->f.DebugMessageControl(source, type, severity, count, ids, enabled);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
+{
+ d_4_3_Core->f.VertexBindingDivisor(bindingindex, divisor);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)
+{
+ d_4_3_Core->f.VertexAttribBinding(attribindex, bindingindex);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribLFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribIFormat(attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
+{
+ d_4_3_Core->f.VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
+{
+ d_4_3_Core->f.BindVertexBuffer(bindingindex, buffer, offset, stride);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)
+{
+ d_4_3_Core->f.TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_4_3_Core->f.TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+ d_4_3_Core->f.TexBufferRange(target, internalformat, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)
+{
+ d_4_3_Core->f.ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
+}
+
+inline GLint QOpenGLFunctions_4_5_Core::glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocationIndex(program, programInterface, name);
+}
+
+inline GLint QOpenGLFunctions_4_5_Core::glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceLocation(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
+{
+ d_4_3_Core->f.GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
+{
+ d_4_3_Core->f.GetProgramResourceName(program, programInterface, index, bufSize, length, name);
+}
+
+inline GLuint QOpenGLFunctions_4_5_Core::glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
+{
+ return d_4_3_Core->f.GetProgramResourceIndex(program, programInterface, name);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetProgramInterfaceiv(program, programInterface, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
+{
+ d_4_3_Core->f.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_3_Core->f.InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+ d_4_3_Core->f.InvalidateFramebuffer(target, numAttachments, attachments);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glInvalidateBufferData(GLuint buffer)
+{
+ d_4_3_Core->f.InvalidateBufferData(buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
+{
+ d_4_3_Core->f.InvalidateBufferSubData(buffer, offset, length);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glInvalidateTexImage(GLuint texture, GLint level)
+{
+ d_4_3_Core->f.InvalidateTexImage(texture, level);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_3_Core->f.InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)
+{
+ d_4_3_Core->f.GetInternalformati64v(target, internalformat, pname, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ d_4_3_Core->f.GetFramebufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFramebufferParameteri(GLenum target, GLenum pname, GLint param)
+{
+ d_4_3_Core->f.FramebufferParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
+{
+ d_4_3_Core->f.CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDispatchComputeIndirect(GLintptr indirect)
+{
+ d_4_3_Core->f.DispatchComputeIndirect(indirect);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
+{
+ d_4_3_Core->f.DispatchCompute(num_groups_x, num_groups_y, num_groups_z);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferSubData(target, internalformat, offset, size, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)
+{
+ d_4_3_Core->f.ClearBufferData(target, internalformat, format, type, data);
+}
+
+
+// OpenGL 4.4 core functions
+inline void QOpenGLFunctions_4_5_Core::glBindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
+{
+ d_4_4_Core->f.BindVertexBuffers(first, count, buffers, offsets, strides);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
+{
+ d_4_4_Core->f.BindImageTextures(first, count, textures);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
+{
+ d_4_4_Core->f.BindSamplers(first, count, samplers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindTextures(GLuint first, GLsizei count, const GLuint *textures)
+{
+ d_4_4_Core->f.BindTextures(first, count, textures);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes)
+{
+ d_4_4_Core->f.BindBuffersRange(target, first, count, buffers, offsets, sizes);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint *buffers)
+{
+ d_4_4_Core->f.BindBuffersBase(target, first, count, buffers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
+{
+ d_4_4_Core->f.ClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void *data)
+{
+ d_4_4_Core->f.ClearTexImage(texture, level, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)
+{
+ d_4_4_Core->f.BufferStorage(target, size, data, flags);
+}
+
+
+// OpenGL 4.5 core functions
+inline void QOpenGLFunctions_4_5_Core::glTextureBarrier()
+{
+ d_4_5_Core->f.TextureBarrier();
+}
+
+inline void QOpenGLFunctions_4_5_Core::glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data)
+{
+ d_4_5_Core->f.ReadnPixels(x, y, width, height, format, type, bufSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params)
+{
+ d_4_5_Core->f.GetnUniformuiv(program, location, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
+{
+ d_4_5_Core->f.GetnUniformiv(program, location, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
+{
+ d_4_5_Core->f.GetnUniformfv(program, location, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble *params)
+{
+ d_4_5_Core->f.GetnUniformdv(program, location, bufSize, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetnTexImage(target, level, format, type, bufSize, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetnCompressedTexImage(target, lod, bufSize, pixels);
+}
+
+inline GLenum QOpenGLFunctions_4_5_Core::glGetGraphicsResetStatus()
+{
+ return d_4_5_Core->f.GetGraphicsResetStatus();
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetCompressedTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glMemoryBarrierByRegion(GLbitfield barriers)
+{
+ d_4_5_Core->f.MemoryBarrierByRegion(barriers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCreateQueries(GLenum target, GLsizei n, GLuint *ids)
+{
+ d_4_5_Core->f.CreateQueries(target, n, ids);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCreateProgramPipelines(GLsizei n, GLuint *pipelines)
+{
+ d_4_5_Core->f.CreateProgramPipelines(n, pipelines);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCreateSamplers(GLsizei n, GLuint *samplers)
+{
+ d_4_5_Core->f.CreateSamplers(n, samplers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64 *param)
+{
+ d_4_5_Core->f.GetVertexArrayIndexed64iv(vaobj, index, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint *param)
+{
+ d_4_5_Core->f.GetVertexArrayIndexediv(vaobj, index, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetVertexArrayiv(GLuint vaobj, GLenum pname, GLint *param)
+{
+ d_4_5_Core->f.GetVertexArrayiv(vaobj, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor)
+{
+ d_4_5_Core->f.VertexArrayBindingDivisor(vaobj, bindingindex, divisor);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexArrayAttribLFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_5_Core->f.VertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexArrayAttribIFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+ d_4_5_Core->f.VertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexArrayAttribFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
+{
+ d_4_5_Core->f.VertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex)
+{
+ d_4_5_Core->f.VertexArrayAttribBinding(vaobj, attribindex, bindingindex);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)
+{
+ d_4_5_Core->f.VertexArrayVertexBuffers(vaobj, first, count, buffers, offsets, strides);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexArrayVertexBuffer(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
+{
+ d_4_5_Core->f.VertexArrayVertexBuffer(vaobj, bindingindex, buffer, offset, stride);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer)
+{
+ d_4_5_Core->f.VertexArrayElementBuffer(vaobj, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glEnableVertexArrayAttrib(GLuint vaobj, GLuint index)
+{
+ d_4_5_Core->f.EnableVertexArrayAttrib(vaobj, index);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glDisableVertexArrayAttrib(GLuint vaobj, GLuint index)
+{
+ d_4_5_Core->f.DisableVertexArrayAttrib(vaobj, index);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCreateVertexArrays(GLsizei n, GLuint *arrays)
+{
+ d_4_5_Core->f.CreateVertexArrays(n, arrays);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTextureParameteriv(GLuint texture, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetTextureParameteriv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params)
+{
+ d_4_5_Core->f.GetTextureParameterIuiv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetTextureParameterIiv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params)
+{
+ d_4_5_Core->f.GetTextureParameterfv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTextureLevelParameteriv(GLuint texture, GLint level, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetTextureLevelParameteriv(texture, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTextureLevelParameterfv(GLuint texture, GLint level, GLenum pname, GLfloat *params)
+{
+ d_4_5_Core->f.GetTextureLevelParameterfv(texture, level, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetCompressedTextureImage(texture, level, bufSize, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
+{
+ d_4_5_Core->f.GetTextureImage(texture, level, format, type, bufSize, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBindTextureUnit(GLuint unit, GLuint texture)
+{
+ d_4_5_Core->f.BindTextureUnit(unit, texture);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGenerateTextureMipmap(GLuint texture)
+{
+ d_4_5_Core->f.GenerateTextureMipmap(texture);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureParameteriv(GLuint texture, GLenum pname, const GLint *param)
+{
+ d_4_5_Core->f.TextureParameteriv(texture, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureParameterIuiv(GLuint texture, GLenum pname, const GLuint *params)
+{
+ d_4_5_Core->f.TextureParameterIuiv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureParameterIiv(GLuint texture, GLenum pname, const GLint *params)
+{
+ d_4_5_Core->f.TextureParameterIiv(texture, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureParameteri(GLuint texture, GLenum pname, GLint param)
+{
+ d_4_5_Core->f.TextureParameteri(texture, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureParameterfv(GLuint texture, GLenum pname, const GLfloat *param)
+{
+ d_4_5_Core->f.TextureParameterfv(texture, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureParameterf(GLuint texture, GLenum pname, GLfloat param)
+{
+ d_4_5_Core->f.TextureParameterf(texture, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCopyTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.CopyTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCopyTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.CopyTextureSubImage2D(texture, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
+{
+ d_4_5_Core->f.CopyTextureSubImage1D(texture, level, xoffset, x, y, width);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_4_5_Core->f.CompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_4_5_Core->f.CompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)
+{
+ d_4_5_Core->f.CompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
+{
+ d_4_5_Core->f.TextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
+{
+ d_4_5_Core->f.TextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)
+{
+ d_4_5_Core->f.TextureSubImage1D(texture, level, xoffset, width, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
+{
+ d_4_5_Core->f.TextureStorage3DMultisample(texture, samples, internalformat, width, height, depth, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
+{
+ d_4_5_Core->f.TextureStorage2DMultisample(texture, samples, internalformat, width, height, fixedsamplelocations);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureStorage3D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ d_4_5_Core->f.TextureStorage3D(texture, levels, internalformat, width, height, depth);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureStorage2D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.TextureStorage2D(texture, levels, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureStorage1D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+ d_4_5_Core->f.TextureStorage1D(texture, levels, internalformat, width);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureBufferRange(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size)
+{
+ d_4_5_Core->f.TextureBufferRange(texture, internalformat, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer)
+{
+ d_4_5_Core->f.TextureBuffer(texture, internalformat, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCreateTextures(GLenum target, GLsizei n, GLuint *textures)
+{
+ d_4_5_Core->f.CreateTextures(target, n, textures);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetNamedRenderbufferParameteriv(renderbuffer, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedRenderbufferStorageMultisample(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.NamedRenderbufferStorageMultisample(renderbuffer, samples, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedRenderbufferStorage(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.NamedRenderbufferStorage(renderbuffer, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCreateRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ d_4_5_Core->f.CreateRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param)
+{
+ d_4_5_Core->f.GetNamedFramebufferParameteriv(framebuffer, pname, param);
+}
+
+inline GLenum QOpenGLFunctions_4_5_Core::glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target)
+{
+ return d_4_5_Core->f.CheckNamedFramebufferStatus(framebuffer, target);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+ d_4_5_Core->f.BlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil)
+{
+ d_4_5_Core->f.ClearNamedFramebufferfi(framebuffer, buffer, depth, stencil);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+ d_4_5_Core->f.ClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+ d_4_5_Core->f.ClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+ d_4_5_Core->f.ClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glInvalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ d_4_5_Core->f.InvalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, x, y, width, height);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments)
+{
+ d_4_5_Core->f.InvalidateNamedFramebufferData(framebuffer, numAttachments, attachments);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferReadBuffer(GLuint framebuffer, GLenum src)
+{
+ d_4_5_Core->f.NamedFramebufferReadBuffer(framebuffer, src);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum *bufs)
+{
+ d_4_5_Core->f.NamedFramebufferDrawBuffers(framebuffer, n, bufs);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf)
+{
+ d_4_5_Core->f.NamedFramebufferDrawBuffer(framebuffer, buf);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+ d_4_5_Core->f.NamedFramebufferTextureLayer(framebuffer, attachment, texture, level, layer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)
+{
+ d_4_5_Core->f.NamedFramebufferTexture(framebuffer, attachment, texture, level);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param)
+{
+ d_4_5_Core->f.NamedFramebufferParameteri(framebuffer, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ d_4_5_Core->f.NamedFramebufferRenderbuffer(framebuffer, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCreateFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ d_4_5_Core->f.CreateFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, void *data)
+{
+ d_4_5_Core->f.GetNamedBufferSubData(buffer, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void * *params)
+{
+ d_4_5_Core->f.GetNamedBufferPointerv(buffer, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64 *params)
+{
+ d_4_5_Core->f.GetNamedBufferParameteri64v(buffer, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params)
+{
+ d_4_5_Core->f.GetNamedBufferParameteriv(buffer, pname, params);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glFlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length)
+{
+ d_4_5_Core->f.FlushMappedNamedBufferRange(buffer, offset, length);
+}
+
+inline GLboolean QOpenGLFunctions_4_5_Core::glUnmapNamedBuffer(GLuint buffer)
+{
+ return d_4_5_Core->f.UnmapNamedBuffer(buffer);
+}
+
+inline void * QOpenGLFunctions_4_5_Core::glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access)
+{
+ return d_4_5_Core->f.MapNamedBufferRange(buffer, offset, length, access);
+}
+
+inline void * QOpenGLFunctions_4_5_Core::glMapNamedBuffer(GLuint buffer, GLenum access)
+{
+ return d_4_5_Core->f.MapNamedBuffer(buffer, access);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearNamedBufferSubData(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data)
+{
+ d_4_5_Core->f.ClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data)
+{
+ d_4_5_Core->f.ClearNamedBufferData(buffer, internalformat, format, type, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size)
+{
+ d_4_5_Core->f.CopyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, const void *data)
+{
+ d_4_5_Core->f.NamedBufferSubData(buffer, offset, size, data);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedBufferData(GLuint buffer, GLsizei size, const void *data, GLenum usage)
+{
+ d_4_5_Core->f.NamedBufferData(buffer, size, data, usage);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glNamedBufferStorage(GLuint buffer, GLsizei size, const void *data, GLbitfield flags)
+{
+ d_4_5_Core->f.NamedBufferStorage(buffer, size, data, flags);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCreateBuffers(GLsizei n, GLuint *buffers)
+{
+ d_4_5_Core->f.CreateBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64 *param)
+{
+ d_4_5_Core->f.GetTransformFeedbacki64_v(xfb, pname, index, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint *param)
+{
+ d_4_5_Core->f.GetTransformFeedbacki_v(xfb, pname, index, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glGetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param)
+{
+ d_4_5_Core->f.GetTransformFeedbackiv(xfb, pname, param);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size)
+{
+ d_4_5_Core->f.TransformFeedbackBufferRange(xfb, index, buffer, offset, size);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glTransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer)
+{
+ d_4_5_Core->f.TransformFeedbackBufferBase(xfb, index, buffer);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glCreateTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+ d_4_5_Core->f.CreateTransformFeedbacks(n, ids);
+}
+
+inline void QOpenGLFunctions_4_5_Core::glClipControl(GLenum origin, GLenum depth)
+{
+ d_4_5_Core->f.ClipControl(origin, depth);
+}
+
+
+
+QT_END_NAMESPACE
+
+#ifdef Q_OS_WIN
+#pragma pop_macro("MemoryBarrier")
+#endif
+
+
+#endif // QT_NO_OPENGL && !QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglfunctions_es2.cpp b/src/opengl/qopenglfunctions_es2.cpp
new file mode 100644
index 0000000000..39d86e647f
--- /dev/null
+++ b/src/opengl/qopenglfunctions_es2.cpp
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglfunctions_es2.h"
+#include "qopenglcontext.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLFunctions_ES2
+ \inmodule QtOpenGL
+ \since 5.1
+ \wrapper
+ \brief The QOpenGLFunctions_ES2 class provides all functions for OpenGL ES 2.
+
+ This class is a wrapper for OpenGL ES 2 functions. See reference pages on
+ \l {http://www.khronos.org/opengles/sdk/docs/man/}{khronos.org} for
+ function documentation.
+
+ \sa QAbstractOpenGLFunctions
+*/
+
+QOpenGLFunctions_ES2::QOpenGLFunctions_ES2()
+ : QAbstractOpenGLFunctions()
+ , d_es2(0)
+{
+}
+
+QOpenGLFunctions_ES2::~QOpenGLFunctions_ES2()
+{
+}
+
+bool QOpenGLFunctions_ES2::initializeOpenGLFunctions()
+{
+ if ( isInitialized() )
+ return true;
+
+ QOpenGLContext* context = QOpenGLContext::currentContext();
+
+ // If owned by a context object make sure it is current.
+ // Also check that current context is compatible
+ if (((owningContext() && owningContext() == context) || !owningContext())
+ && QOpenGLFunctions_ES2::isContextCompatible(context))
+ {
+ // Nothing to do, just flag that we are initialized
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions();
+ }
+ return isInitialized();
+}
+
+bool QOpenGLFunctions_ES2::isContextCompatible(QOpenGLContext *context)
+{
+ Q_ASSERT(context);
+ QSurfaceFormat f = context->format();
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < qMakePair(2, 0))
+ return false;
+ if (f.renderableType() != QSurfaceFormat::OpenGLES)
+ return false;
+
+ return true;
+}
+
+QOpenGLVersionProfile QOpenGLFunctions_ES2::versionProfile()
+{
+ QOpenGLVersionProfile v;
+ return v;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglfunctions_es2.h b/src/opengl/qopenglfunctions_es2.h
new file mode 100644
index 0000000000..e9837bae29
--- /dev/null
+++ b/src/opengl/qopenglfunctions_es2.h
@@ -0,0 +1,932 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_ES2_H
+#define QOPENGLVERSIONFUNCTIONS_ES2_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if QT_CONFIG(opengles2) || defined(Q_QDOC)
+
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtOpenGL/QOpenGLVersionFunctions>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLFunctions_ES2Private;
+
+class Q_OPENGL_EXPORT QOpenGLFunctions_ES2 : public QAbstractOpenGLFunctions
+{
+public:
+ QOpenGLFunctions_ES2();
+ ~QOpenGLFunctions_ES2();
+
+ bool initializeOpenGLFunctions() override;
+
+ // OpenGL ES2 core functions
+ void glActiveTexture(GLenum texture);
+ void glAttachShader(GLuint program, GLuint shader);
+ void glBindAttribLocation(GLuint program, GLuint index, const GLchar* name);
+ void glBindBuffer(GLenum target, GLuint buffer);
+ void glBindFramebuffer(GLenum target, GLuint framebuffer);
+ void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ void glBindTexture(GLenum target, GLuint texture);
+ void glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+ void glBlendEquation(GLenum mode);
+ void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+ void glBlendFunc(GLenum sfactor, GLenum dfactor);
+ void glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ void glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
+ void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
+ GLenum glCheckFramebufferStatus(GLenum target);
+ void glClear(GLbitfield mask);
+ void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+ void glClearDepthf(GLclampf depth);
+ void glClearStencil(GLint s);
+ void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void glCompileShader(GLuint shader);
+ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data);
+ void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data);
+ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ GLuint glCreateProgram(void);
+ GLuint glCreateShader(GLenum type);
+ void glCullFace(GLenum mode);
+ void glDeleteBuffers(GLsizei n, const GLuint* buffers);
+ void glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers);
+ void glDeleteProgram(GLuint program);
+ void glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers);
+ void glDeleteShader(GLuint shader);
+ void glDeleteTextures(GLsizei n, const GLuint* textures);
+ void glDepthFunc(GLenum func);
+ void glDepthMask(GLboolean flag);
+ void glDepthRangef(GLclampf zNear, GLclampf zFar);
+ void glDetachShader(GLuint program, GLuint shader);
+ void glDisable(GLenum cap);
+ void glDisableVertexAttribArray(GLuint index);
+ void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+ void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
+ void glEnable(GLenum cap);
+ void glEnableVertexAttribArray(GLuint index);
+ void glFinish(void);
+ void glFlush(void);
+ void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void glFrontFace(GLenum mode);
+ void glGenBuffers(GLsizei n, GLuint* buffers);
+ void glGenerateMipmap(GLenum target);
+ void glGenFramebuffers(GLsizei n, GLuint* framebuffers);
+ void glGenRenderbuffers(GLsizei n, GLuint* renderbuffers);
+ void glGenTextures(GLsizei n, GLuint* textures);
+ void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
+ void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
+ void glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
+ int glGetAttribLocation(GLuint program, const GLchar* name);
+ void glGetBooleanv(GLenum pname, GLboolean* params);
+ void glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params);
+ GLenum glGetError(void);
+ void glGetFloatv(GLenum pname, GLfloat* params);
+ void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params);
+ void glGetIntegerv(GLenum pname, GLint* params);
+ void glGetProgramiv(GLuint program, GLenum pname, GLint* params);
+ void glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
+ void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params);
+ void glGetShaderiv(GLuint shader, GLenum pname, GLint* params);
+ void glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
+ void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+ void glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
+ const GLubyte* glGetString(GLenum name);
+ void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params);
+ void glGetTexParameteriv(GLenum target, GLenum pname, GLint* params);
+ void glGetUniformfv(GLuint program, GLint location, GLfloat* params);
+ void glGetUniformiv(GLuint program, GLint location, GLint* params);
+ int glGetUniformLocation(GLuint program, const GLchar* name);
+ void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);
+ void glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params);
+ void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer);
+ void glHint(GLenum target, GLenum mode);
+ GLboolean glIsBuffer(GLuint buffer);
+ GLboolean glIsEnabled(GLenum cap);
+ GLboolean glIsFramebuffer(GLuint framebuffer);
+ GLboolean glIsProgram(GLuint program);
+ GLboolean glIsRenderbuffer(GLuint renderbuffer);
+ GLboolean glIsShader(GLuint shader);
+ GLboolean glIsTexture(GLuint texture);
+ void glLineWidth(GLfloat width);
+ void glLinkProgram(GLuint program);
+ void glPixelStorei(GLenum pname, GLint param);
+ void glPolygonOffset(GLfloat factor, GLfloat units);
+ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
+ void glReleaseShaderCompiler(void);
+ void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void glSampleCoverage(GLclampf value, GLboolean invert);
+ void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ void glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length);
+ void glShaderSource(GLuint shader, GLsizei count, const GLchar* *string, const GLint* length);
+ void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ void glStencilMask(GLuint mask);
+ void glStencilMaskSeparate(GLenum face, GLuint mask);
+ void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ void glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
+ void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ void glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params);
+ void glTexParameteri(GLenum target, GLenum pname, GLint param);
+ void glTexParameteriv(GLenum target, GLenum pname, const GLint* params);
+ void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels);
+ void glUniform1f(GLint location, GLfloat x);
+ void glUniform1fv(GLint location, GLsizei count, const GLfloat* v);
+ void glUniform1i(GLint location, GLint x);
+ void glUniform1iv(GLint location, GLsizei count, const GLint* v);
+ void glUniform2f(GLint location, GLfloat x, GLfloat y);
+ void glUniform2fv(GLint location, GLsizei count, const GLfloat* v);
+ void glUniform2i(GLint location, GLint x, GLint y);
+ void glUniform2iv(GLint location, GLsizei count, const GLint* v);
+ void glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z);
+ void glUniform3fv(GLint location, GLsizei count, const GLfloat* v);
+ void glUniform3i(GLint location, GLint x, GLint y, GLint z);
+ void glUniform3iv(GLint location, GLsizei count, const GLint* v);
+ void glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glUniform4fv(GLint location, GLsizei count, const GLfloat* v);
+ void glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w);
+ void glUniform4iv(GLint location, GLsizei count, const GLint* v);
+ void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+ void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+ void glUseProgram(GLuint program);
+ void glValidateProgram(GLuint program);
+ void glVertexAttrib1f(GLuint indx, GLfloat x);
+ void glVertexAttrib1fv(GLuint indx, const GLfloat* values);
+ void glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
+ void glVertexAttrib2fv(GLuint indx, const GLfloat* values);
+ void glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+ void glVertexAttrib3fv(GLuint indx, const GLfloat* values);
+ void glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void glVertexAttrib4fv(GLuint indx, const GLfloat* values);
+ void glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr);
+ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+
+private:
+ friend class QOpenGLContext;
+
+ static bool isContextCompatible(QOpenGLContext *context);
+ static QOpenGLVersionProfile versionProfile();
+
+ // For future expansion - not used
+ QOpenGLFunctions_ES2Private* d_es2;
+};
+
+// OpenGL ES2 core functions
+inline void QOpenGLFunctions_ES2::glActiveTexture(GLenum texture)
+{
+ ::glActiveTexture(texture);
+}
+
+inline void QOpenGLFunctions_ES2::glAttachShader(GLuint program, GLuint shader)
+{
+ ::glAttachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_ES2::glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
+{
+ ::glBindAttribLocation(program, index, name);
+}
+
+inline void QOpenGLFunctions_ES2::glBindBuffer(GLenum target, GLuint buffer)
+{
+ ::glBindBuffer(target, buffer);
+}
+
+inline void QOpenGLFunctions_ES2::glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ ::glBindFramebuffer(target, framebuffer);
+}
+
+inline void QOpenGLFunctions_ES2::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ ::glBindRenderbuffer(target, renderbuffer);
+}
+
+inline void QOpenGLFunctions_ES2::glBindTexture(GLenum target, GLuint texture)
+{
+ ::glBindTexture(target, texture);
+}
+
+inline void QOpenGLFunctions_ES2::glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+{
+ ::glBlendColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_ES2::glBlendEquation(GLenum mode)
+{
+ ::glBlendEquation(mode);
+}
+
+inline void QOpenGLFunctions_ES2::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+ ::glBlendEquationSeparate(modeRGB, modeAlpha);
+}
+
+inline void QOpenGLFunctions_ES2::glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+ ::glBlendFunc(sfactor, dfactor);
+}
+
+inline void QOpenGLFunctions_ES2::glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+ ::glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+
+inline void QOpenGLFunctions_ES2::glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
+{
+ ::glBufferData(target, size, data, usage);
+}
+
+inline void QOpenGLFunctions_ES2::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
+{
+ ::glBufferSubData(target, offset, size, data);
+}
+
+inline GLenum QOpenGLFunctions_ES2::glCheckFramebufferStatus(GLenum target)
+{
+ return ::glCheckFramebufferStatus(target);
+}
+
+inline void QOpenGLFunctions_ES2::glClear(GLbitfield mask)
+{
+ ::glClear(mask);
+}
+
+inline void QOpenGLFunctions_ES2::glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+{
+ ::glClearColor(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_ES2::glClearDepthf(GLclampf depth)
+{
+ ::glClearDepthf(depth);
+}
+
+inline void QOpenGLFunctions_ES2::glClearStencil(GLint s)
+{
+ ::glClearStencil(s);
+}
+
+inline void QOpenGLFunctions_ES2::glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+ ::glColorMask(red, green, blue, alpha);
+}
+
+inline void QOpenGLFunctions_ES2::glCompileShader(GLuint shader)
+{
+ ::glCompileShader(shader);
+}
+
+inline void QOpenGLFunctions_ES2::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data)
+{
+ ::glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+}
+
+inline void QOpenGLFunctions_ES2::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data)
+{
+ ::glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+
+inline void QOpenGLFunctions_ES2::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+ ::glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+}
+
+inline void QOpenGLFunctions_ES2::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ ::glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+}
+
+inline GLuint QOpenGLFunctions_ES2::glCreateProgram(void)
+{
+ return ::glCreateProgram();
+}
+
+inline GLuint QOpenGLFunctions_ES2::glCreateShader(GLenum type)
+{
+ return ::glCreateShader(type);
+}
+
+inline void QOpenGLFunctions_ES2::glCullFace(GLenum mode)
+{
+ ::glCullFace(mode);
+}
+
+inline void QOpenGLFunctions_ES2::glDeleteBuffers(GLsizei n, const GLuint* buffers)
+{
+ ::glDeleteBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_ES2::glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
+{
+ ::glDeleteFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_ES2::glDeleteProgram(GLuint program)
+{
+ ::glDeleteProgram(program);
+}
+
+inline void QOpenGLFunctions_ES2::glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
+{
+ ::glDeleteRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_ES2::glDeleteShader(GLuint shader)
+{
+ ::glDeleteShader(shader);
+}
+
+inline void QOpenGLFunctions_ES2::glDeleteTextures(GLsizei n, const GLuint* textures)
+{
+ ::glDeleteTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_ES2::glDepthFunc(GLenum func)
+{
+ ::glDepthFunc(func);
+}
+
+inline void QOpenGLFunctions_ES2::glDepthMask(GLboolean flag)
+{
+ ::glDepthMask(flag);
+}
+
+inline void QOpenGLFunctions_ES2::glDepthRangef(GLclampf zNear, GLclampf zFar)
+{
+ ::glDepthRangef(zNear, zFar);
+}
+
+inline void QOpenGLFunctions_ES2::glDetachShader(GLuint program, GLuint shader)
+{
+ ::glDetachShader(program, shader);
+}
+
+inline void QOpenGLFunctions_ES2::glDisable(GLenum cap)
+{
+ ::glDisable(cap);
+}
+
+inline void QOpenGLFunctions_ES2::glDisableVertexAttribArray(GLuint index)
+{
+ ::glDisableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_ES2::glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+ ::glDrawArrays(mode, first, count);
+}
+
+inline void QOpenGLFunctions_ES2::glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
+{
+ ::glDrawElements(mode, count, type, indices);
+}
+
+inline void QOpenGLFunctions_ES2::glEnable(GLenum cap)
+{
+ ::glEnable(cap);
+}
+
+inline void QOpenGLFunctions_ES2::glEnableVertexAttribArray(GLuint index)
+{
+ ::glEnableVertexAttribArray(index);
+}
+
+inline void QOpenGLFunctions_ES2::glFinish(void)
+{
+ ::glFinish();
+}
+
+inline void QOpenGLFunctions_ES2::glFlush(void)
+{
+ ::glFlush();
+}
+
+inline void QOpenGLFunctions_ES2::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ ::glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+}
+
+inline void QOpenGLFunctions_ES2::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ ::glFramebufferTexture2D(target, attachment, textarget, texture, level);
+}
+
+inline void QOpenGLFunctions_ES2::glFrontFace(GLenum mode)
+{
+ ::glFrontFace(mode);
+}
+
+inline void QOpenGLFunctions_ES2::glGenBuffers(GLsizei n, GLuint* buffers)
+{
+ ::glGenBuffers(n, buffers);
+}
+
+inline void QOpenGLFunctions_ES2::glGenerateMipmap(GLenum target)
+{
+ ::glGenerateMipmap(target);
+}
+
+inline void QOpenGLFunctions_ES2::glGenFramebuffers(GLsizei n, GLuint* framebuffers)
+{
+ ::glGenFramebuffers(n, framebuffers);
+}
+
+inline void QOpenGLFunctions_ES2::glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
+{
+ ::glGenRenderbuffers(n, renderbuffers);
+}
+
+inline void QOpenGLFunctions_ES2::glGenTextures(GLsizei n, GLuint* textures)
+{
+ ::glGenTextures(n, textures);
+}
+
+inline void QOpenGLFunctions_ES2::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
+{
+ ::glGetActiveAttrib(program, index, bufsize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_ES2::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
+{
+ ::glGetActiveUniform(program, index, bufsize, length, size, type, name);
+}
+
+inline void QOpenGLFunctions_ES2::glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
+{
+ ::glGetAttachedShaders(program, maxcount, count, shaders);
+}
+
+inline int QOpenGLFunctions_ES2::glGetAttribLocation(GLuint program, const GLchar* name)
+{
+ return ::glGetAttribLocation(program, name);
+}
+
+inline void QOpenGLFunctions_ES2::glGetBooleanv(GLenum pname, GLboolean* params)
+{
+ ::glGetBooleanv(pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
+{
+ ::glGetBufferParameteriv(target, pname, params);
+}
+
+inline GLenum QOpenGLFunctions_ES2::glGetError(void)
+{
+ return ::glGetError();
+}
+
+inline void QOpenGLFunctions_ES2::glGetFloatv(GLenum pname, GLfloat* params)
+{
+ ::glGetFloatv(pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
+{
+ ::glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetIntegerv(GLenum pname, GLint* params)
+{
+ ::glGetIntegerv(pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetProgramiv(GLuint program, GLenum pname, GLint* params)
+{
+ ::glGetProgramiv(program, pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
+{
+ ::glGetProgramInfoLog(program, bufsize, length, infolog);
+}
+
+inline void QOpenGLFunctions_ES2::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
+{
+ ::glGetRenderbufferParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
+{
+ ::glGetShaderiv(shader, pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
+{
+ ::glGetShaderInfoLog(shader, bufsize, length, infolog);
+}
+
+inline void QOpenGLFunctions_ES2::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
+{
+ ::glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
+inline void QOpenGLFunctions_ES2::glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
+{
+ ::glGetShaderSource(shader, bufsize, length, source);
+}
+
+inline const GLubyte* QOpenGLFunctions_ES2::glGetString(GLenum name)
+{
+ return ::glGetString(name);
+}
+
+inline void QOpenGLFunctions_ES2::glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
+{
+ ::glGetTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
+{
+ ::glGetTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetUniformfv(GLuint program, GLint location, GLfloat* params)
+{
+ ::glGetUniformfv(program, location, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetUniformiv(GLuint program, GLint location, GLint* params)
+{
+ ::glGetUniformiv(program, location, params);
+}
+
+inline int QOpenGLFunctions_ES2::glGetUniformLocation(GLuint program, const GLchar* name)
+{
+ return ::glGetUniformLocation(program, name);
+}
+
+inline void QOpenGLFunctions_ES2::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
+{
+ ::glGetVertexAttribfv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
+{
+ ::glGetVertexAttribiv(index, pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
+{
+ ::glGetVertexAttribPointerv(index, pname, pointer);
+}
+
+inline void QOpenGLFunctions_ES2::glHint(GLenum target, GLenum mode)
+{
+ ::glHint(target, mode);
+}
+
+inline GLboolean QOpenGLFunctions_ES2::glIsBuffer(GLuint buffer)
+{
+ return ::glIsBuffer(buffer);
+}
+
+inline GLboolean QOpenGLFunctions_ES2::glIsEnabled(GLenum cap)
+{
+ return ::glIsEnabled(cap);
+}
+
+inline GLboolean QOpenGLFunctions_ES2::glIsFramebuffer(GLuint framebuffer)
+{
+ return ::glIsFramebuffer(framebuffer);
+}
+
+inline GLboolean QOpenGLFunctions_ES2::glIsProgram(GLuint program)
+{
+ return ::glIsProgram(program);
+}
+
+inline GLboolean QOpenGLFunctions_ES2::glIsRenderbuffer(GLuint renderbuffer)
+{
+ return ::glIsRenderbuffer(renderbuffer);
+}
+
+inline GLboolean QOpenGLFunctions_ES2::glIsShader(GLuint shader)
+{
+ return ::glIsShader(shader);
+}
+
+inline GLboolean QOpenGLFunctions_ES2::glIsTexture(GLuint texture)
+{
+ return ::glIsTexture(texture);
+}
+
+inline void QOpenGLFunctions_ES2::glLineWidth(GLfloat width)
+{
+ ::glLineWidth(width);
+}
+
+inline void QOpenGLFunctions_ES2::glLinkProgram(GLuint program)
+{
+ ::glLinkProgram(program);
+}
+
+inline void QOpenGLFunctions_ES2::glPixelStorei(GLenum pname, GLint param)
+{
+ ::glPixelStorei(pname, param);
+}
+
+inline void QOpenGLFunctions_ES2::glPolygonOffset(GLfloat factor, GLfloat units)
+{
+ ::glPolygonOffset(factor, units);
+}
+
+inline void QOpenGLFunctions_ES2::glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
+{
+ ::glReadPixels(x, y, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_ES2::glReleaseShaderCompiler(void)
+{
+ ::glReleaseShaderCompiler();
+}
+
+inline void QOpenGLFunctions_ES2::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ ::glRenderbufferStorage(target, internalformat, width, height);
+}
+
+inline void QOpenGLFunctions_ES2::glSampleCoverage(GLclampf value, GLboolean invert)
+{
+ ::glSampleCoverage(value, invert);
+}
+
+inline void QOpenGLFunctions_ES2::glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ ::glScissor(x, y, width, height);
+}
+
+inline void QOpenGLFunctions_ES2::glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
+{
+ ::glShaderBinary(n, shaders, binaryformat, binary, length);
+}
+
+inline void QOpenGLFunctions_ES2::glShaderSource(GLuint shader, GLsizei count, const GLchar* *string, const GLint* length)
+{
+ ::glShaderSource(shader, count, string, length);
+}
+
+inline void QOpenGLFunctions_ES2::glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+ ::glStencilFunc(func, ref, mask);
+}
+
+inline void QOpenGLFunctions_ES2::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+ ::glStencilFuncSeparate(face, func, ref, mask);
+}
+
+inline void QOpenGLFunctions_ES2::glStencilMask(GLuint mask)
+{
+ ::glStencilMask(mask);
+}
+
+inline void QOpenGLFunctions_ES2::glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+ ::glStencilMaskSeparate(face, mask);
+}
+
+inline void QOpenGLFunctions_ES2::glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+ ::glStencilOp(fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_ES2::glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
+{
+ ::glStencilOpSeparate(face, fail, zfail, zpass);
+}
+
+inline void QOpenGLFunctions_ES2::glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
+{
+ ::glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_ES2::glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+ ::glTexParameterf(target, pname, param);
+}
+
+inline void QOpenGLFunctions_ES2::glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
+{
+ ::glTexParameterfv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+ ::glTexParameteri(target, pname, param);
+}
+
+inline void QOpenGLFunctions_ES2::glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
+{
+ ::glTexParameteriv(target, pname, params);
+}
+
+inline void QOpenGLFunctions_ES2::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels)
+{
+ ::glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform1f(GLint location, GLfloat x)
+{
+ ::glUniform1f(location, x);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
+{
+ ::glUniform1fv(location, count, v);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform1i(GLint location, GLint x)
+{
+ ::glUniform1i(location, x);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform1iv(GLint location, GLsizei count, const GLint* v)
+{
+ ::glUniform1iv(location, count, v);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform2f(GLint location, GLfloat x, GLfloat y)
+{
+ ::glUniform2f(location, x, y);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
+{
+ ::glUniform2fv(location, count, v);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform2i(GLint location, GLint x, GLint y)
+{
+ ::glUniform2i(location, x, y);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform2iv(GLint location, GLsizei count, const GLint* v)
+{
+ ::glUniform2iv(location, count, v);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
+{
+ ::glUniform3f(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
+{
+ ::glUniform3fv(location, count, v);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform3i(GLint location, GLint x, GLint y, GLint z)
+{
+ ::glUniform3i(location, x, y, z);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform3iv(GLint location, GLsizei count, const GLint* v)
+{
+ ::glUniform3iv(location, count, v);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ ::glUniform4f(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
+{
+ ::glUniform4fv(location, count, v);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
+{
+ ::glUniform4i(location, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_ES2::glUniform4iv(GLint location, GLsizei count, const GLint* v)
+{
+ ::glUniform4iv(location, count, v);
+}
+
+inline void QOpenGLFunctions_ES2::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+{
+ ::glUniformMatrix2fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_ES2::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+{
+ ::glUniformMatrix3fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_ES2::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+{
+ ::glUniformMatrix4fv(location, count, transpose, value);
+}
+
+inline void QOpenGLFunctions_ES2::glUseProgram(GLuint program)
+{
+ ::glUseProgram(program);
+}
+
+inline void QOpenGLFunctions_ES2::glValidateProgram(GLuint program)
+{
+ ::glValidateProgram(program);
+}
+
+inline void QOpenGLFunctions_ES2::glVertexAttrib1f(GLuint indx, GLfloat x)
+{
+ ::glVertexAttrib1f(indx, x);
+}
+
+inline void QOpenGLFunctions_ES2::glVertexAttrib1fv(GLuint indx, const GLfloat* values)
+{
+ ::glVertexAttrib1fv(indx, values);
+}
+
+inline void QOpenGLFunctions_ES2::glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
+{
+ ::glVertexAttrib2f(indx, x, y);
+}
+
+inline void QOpenGLFunctions_ES2::glVertexAttrib2fv(GLuint indx, const GLfloat* values)
+{
+ ::glVertexAttrib2fv(indx, values);
+}
+
+inline void QOpenGLFunctions_ES2::glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
+{
+ ::glVertexAttrib3f(indx, x, y, z);
+}
+
+inline void QOpenGLFunctions_ES2::glVertexAttrib3fv(GLuint indx, const GLfloat* values)
+{
+ ::glVertexAttrib3fv(indx, values);
+}
+
+inline void QOpenGLFunctions_ES2::glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ ::glVertexAttrib4f(indx, x, y, z, w);
+}
+
+inline void QOpenGLFunctions_ES2::glVertexAttrib4fv(GLuint indx, const GLfloat* values)
+{
+ ::glVertexAttrib4fv(indx, values);
+}
+
+inline void QOpenGLFunctions_ES2::glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
+{
+ ::glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
+}
+
+inline void QOpenGLFunctions_ES2::glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ ::glViewport(x, y, width, height);
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_CONFIG(opengles2)
+
+#endif
diff --git a/src/opengl/qopenglgradientcache.cpp b/src/opengl/qopenglgradientcache.cpp
new file mode 100644
index 0000000000..7a932a19bb
--- /dev/null
+++ b/src/opengl/qopenglgradientcache.cpp
@@ -0,0 +1,276 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglgradientcache_p.h"
+#include <private/qdrawhelper_p.h>
+#include <private/qopenglcontext_p.h>
+#include <private/qrgba64_p.h>
+#include <QtCore/qmutex.h>
+#include <QtCore/qrandom.h>
+#include "qopenglfunctions.h"
+#include <private/qopenglextensions_p.h>
+
+#ifndef GL_RGBA16
+#define GL_RGBA16 0x805B
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGL2GradientCacheWrapper
+{
+public:
+ QOpenGL2GradientCache *cacheForContext(QOpenGLContext *context) {
+ QMutexLocker lock(&m_mutex);
+ return m_resource.value<QOpenGL2GradientCache>(context);
+ }
+
+private:
+ QOpenGLMultiGroupSharedResource m_resource;
+ QMutex m_mutex;
+};
+
+Q_GLOBAL_STATIC(QOpenGL2GradientCacheWrapper, qt_gradient_caches)
+
+QOpenGL2GradientCache::QOpenGL2GradientCache(QOpenGLContext *ctx)
+ : QOpenGLSharedResource(ctx->shareGroup())
+{
+}
+
+QOpenGL2GradientCache::~QOpenGL2GradientCache()
+{
+ cache.clear();
+}
+
+QOpenGL2GradientCache *QOpenGL2GradientCache::cacheForContext(QOpenGLContext *context)
+{
+ return qt_gradient_caches()->cacheForContext(context);
+}
+
+void QOpenGL2GradientCache::invalidateResource()
+{
+ QMutexLocker lock(&m_mutex);
+ cache.clear();
+}
+
+void QOpenGL2GradientCache::freeResource(QOpenGLContext *)
+{
+ cleanCache();
+}
+
+void QOpenGL2GradientCache::cleanCache()
+{
+ QMutexLocker lock(&m_mutex);
+ QOpenGLGradientColorTableHash::const_iterator it = cache.constBegin();
+ QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
+ for (; it != cache.constEnd(); ++it) {
+ const CacheInfo &cache_info = it.value();
+ funcs->glDeleteTextures(1, &cache_info.texId);
+ }
+ cache.clear();
+}
+
+GLuint QOpenGL2GradientCache::getBuffer(const QGradient &gradient, qreal opacity)
+{
+ quint64 hash_val = 0;
+
+ const QGradientStops stops = gradient.stops();
+ for (int i = 0; i < stops.size() && i <= 2; i++)
+ hash_val += stops[i].second.rgba();
+
+ const QMutexLocker lock(&m_mutex);
+ QOpenGLGradientColorTableHash::const_iterator it = cache.constFind(hash_val);
+
+ if (it == cache.constEnd())
+ return addCacheElement(hash_val, gradient, opacity);
+ else {
+ do {
+ const CacheInfo &cache_info = it.value();
+ if (cache_info.stops == stops && cache_info.opacity == opacity
+ && cache_info.interpolationMode == gradient.interpolationMode())
+ {
+ return cache_info.texId;
+ }
+ ++it;
+ } while (it != cache.constEnd() && it.key() == hash_val);
+ // an exact match for these stops and opacity was not found, create new cache
+ return addCacheElement(hash_val, gradient, opacity);
+ }
+}
+
+
+GLuint QOpenGL2GradientCache::addCacheElement(quint64 hash_val, const QGradient &gradient, qreal opacity)
+{
+ QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
+ if (cache.size() == maxCacheSize()) {
+ int elem_to_remove = QRandomGenerator::global()->bounded(maxCacheSize());
+ quint64 key = cache.keys()[elem_to_remove];
+
+ // need to call glDeleteTextures on each removed cache entry:
+ QOpenGLGradientColorTableHash::const_iterator it = cache.constFind(key);
+ do {
+ funcs->glDeleteTextures(1, &it.value().texId);
+ } while (++it != cache.constEnd() && it.key() == key);
+ cache.remove(key); // may remove more than 1, but OK
+ }
+
+ CacheInfo cache_entry(gradient.stops(), opacity, gradient.interpolationMode());
+ funcs->glGenTextures(1, &cache_entry.texId);
+ funcs->glBindTexture(GL_TEXTURE_2D, cache_entry.texId);
+ if (static_cast<QOpenGLExtensions *>(funcs)->hasOpenGLExtension(QOpenGLExtensions::Sized16Formats)) {
+ QRgba64 buffer[1024];
+ generateGradientColorTable(gradient, buffer, paletteSize(), opacity);
+ funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, paletteSize(), 1,
+ 0, GL_RGBA, GL_UNSIGNED_SHORT, buffer);
+ } else {
+ uint buffer[1024];
+ generateGradientColorTable(gradient, buffer, paletteSize(), opacity);
+ funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, paletteSize(), 1,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
+ }
+ return cache.insert(hash_val, cache_entry).value().texId;
+}
+
+
+//TODO: Let GL generate the texture using an FBO
+void QOpenGL2GradientCache::generateGradientColorTable(const QGradient& gradient, QRgba64 *colorTable, int size, qreal opacity) const
+{
+ int pos = 0;
+ const QGradientStops s = gradient.stops();
+
+ bool colorInterpolation = (gradient.interpolationMode() == QGradient::ColorInterpolation);
+
+ uint alpha = qRound(opacity * 256);
+ QRgba64 current_color = combineAlpha256(s[0].second.rgba64(), alpha);
+ qreal incr = 1.0 / qreal(size);
+ qreal fpos = 1.5 * incr;
+ colorTable[pos++] = qPremultiply(current_color);
+
+ while (fpos <= s.first().first) {
+ colorTable[pos] = colorTable[pos - 1];
+ pos++;
+ fpos += incr;
+ }
+
+ if (colorInterpolation)
+ current_color = qPremultiply(current_color);
+
+ const int sLast = s.size() - 1;
+ for (int i = 0; i < sLast; ++i) {
+ qreal delta = 1/(s[i+1].first - s[i].first);
+ QRgba64 next_color = combineAlpha256(s[i + 1].second.rgba64(), alpha);
+ if (colorInterpolation)
+ next_color = qPremultiply(next_color);
+
+ while (fpos < s[i+1].first && pos < size) {
+ int dist = int(256 * ((fpos - s[i].first) * delta));
+ int idist = 256 - dist;
+ if (colorInterpolation)
+ colorTable[pos] = interpolate256(current_color, idist, next_color, dist);
+ else
+ colorTable[pos] = qPremultiply(interpolate256(current_color, idist, next_color, dist));
+ ++pos;
+ fpos += incr;
+ }
+ current_color = next_color;
+ }
+
+ Q_ASSERT(s.size() > 0);
+
+ QRgba64 last_color = qPremultiply(combineAlpha256(s[sLast].second.rgba64(), alpha));
+ for (;pos < size; ++pos)
+ colorTable[pos] = last_color;
+
+ // Make sure the last color stop is represented at the end of the table
+ colorTable[size-1] = last_color;
+}
+
+void QOpenGL2GradientCache::generateGradientColorTable(const QGradient& gradient, uint *colorTable, int size, qreal opacity) const
+{
+ int pos = 0;
+ const QGradientStops s = gradient.stops();
+
+ bool colorInterpolation = (gradient.interpolationMode() == QGradient::ColorInterpolation);
+
+ uint alpha = qRound(opacity * 256);
+ // Qt LIES! It returns ARGB (on little-endian AND on big-endian)
+ uint current_color = ARGB_COMBINE_ALPHA(s[0].second.rgba(), alpha);
+ qreal incr = 1.0 / qreal(size);
+ qreal fpos = 1.5 * incr;
+ colorTable[pos++] = ARGB2RGBA(qPremultiply(current_color));
+
+ while (fpos <= s.first().first) {
+ colorTable[pos] = colorTable[pos - 1];
+ pos++;
+ fpos += incr;
+ }
+
+ if (colorInterpolation)
+ current_color = qPremultiply(current_color);
+
+ const int sLast = s.size() - 1;
+ for (int i = 0; i < sLast; ++i) {
+ qreal delta = 1/(s[i+1].first - s[i].first);
+ uint next_color = ARGB_COMBINE_ALPHA(s[i + 1].second.rgba(), alpha);
+ if (colorInterpolation)
+ next_color = qPremultiply(next_color);
+
+ while (fpos < s[i+1].first && pos < size) {
+ int dist = int(256 * ((fpos - s[i].first) * delta));
+ int idist = 256 - dist;
+ if (colorInterpolation)
+ colorTable[pos] = ARGB2RGBA(INTERPOLATE_PIXEL_256(current_color, idist, next_color, dist));
+ else
+ colorTable[pos] = ARGB2RGBA(qPremultiply(INTERPOLATE_PIXEL_256(current_color, idist, next_color, dist)));
+ ++pos;
+ fpos += incr;
+ }
+ current_color = next_color;
+ }
+
+ Q_ASSERT(s.size() > 0);
+
+ uint last_color = ARGB2RGBA(qPremultiply(ARGB_COMBINE_ALPHA(s[sLast].second.rgba(), alpha)));
+ for (;pos < size; ++pos)
+ colorTable[pos] = last_color;
+
+ // Make sure the last color stop is represented at the end of the table
+ colorTable[size-1] = last_color;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglgradientcache_p.h b/src/opengl/qopenglgradientcache_p.h
new file mode 100644
index 0000000000..da070ae233
--- /dev/null
+++ b/src/opengl/qopenglgradientcache_p.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLGRADIENTCACHE_P_H
+#define QOPENGLGRADIENTCACHE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QMultiHash>
+#include <QObject>
+#include <private/qopenglcontext_p.h>
+#include <QtCore/qmutex.h>
+#include <QGradient>
+#include <qrgba64.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGL2GradientCache : public QOpenGLSharedResource
+{
+ struct CacheInfo
+ {
+ inline CacheInfo(QGradientStops s, qreal op, QGradient::InterpolationMode mode) :
+ stops(std::move(s)), opacity(op), interpolationMode(mode) {}
+
+ GLuint texId;
+ QGradientStops stops;
+ qreal opacity;
+ QGradient::InterpolationMode interpolationMode;
+ };
+
+ typedef QMultiHash<quint64, CacheInfo> QOpenGLGradientColorTableHash;
+
+public:
+ static QOpenGL2GradientCache *cacheForContext(QOpenGLContext *context);
+
+ QOpenGL2GradientCache(QOpenGLContext *);
+ ~QOpenGL2GradientCache();
+
+ GLuint getBuffer(const QGradient &gradient, qreal opacity);
+ inline int paletteSize() const { return 1024; }
+
+ void invalidateResource() override;
+ void freeResource(QOpenGLContext *ctx) override;
+
+private:
+ inline int maxCacheSize() const { return 60; }
+ inline void generateGradientColorTable(const QGradient& gradient,
+ QRgba64 *colorTable,
+ int size, qreal opacity) const;
+ inline void generateGradientColorTable(const QGradient& gradient,
+ uint *colorTable,
+ int size, qreal opacity) const;
+ GLuint addCacheElement(quint64 hash_val, const QGradient &gradient, qreal opacity);
+ void cleanCache();
+
+ QOpenGLGradientColorTableHash cache;
+ QMutex m_mutex;
+};
+
+QT_END_NAMESPACE
+
+#endif // QOPENGLGRADIENTCACHE_P_H
diff --git a/src/opengl/qopenglpaintdevice.cpp b/src/opengl/qopenglpaintdevice.cpp
new file mode 100644
index 0000000000..811425cf69
--- /dev/null
+++ b/src/opengl/qopenglpaintdevice.cpp
@@ -0,0 +1,372 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qopenglpaintdevice.h>
+#include <qpaintengine.h>
+#include <qthreadstorage.h>
+
+#include <private/qopenglpaintdevice_p.h>
+#include <private/qobject_p.h>
+#include <private/qopenglcontext_p.h>
+#include <private/qopenglframebufferobject_p.h>
+#include <private/qopenglpaintengine_p.h>
+
+// for qt_defaultDpiX/Y
+#include <private/qfont_p.h>
+
+#include <qopenglfunctions.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLPaintDevice
+ \brief The QOpenGLPaintDevice class enables painting to an OpenGL context using QPainter.
+ \since 5.0
+ \inmodule QtOpenGL
+
+ \ingroup painting-3D
+
+ The QOpenGLPaintDevice uses the \b current QOpenGL context to render
+ QPainter draw commands. The context is captured upon construction. It
+ requires support for OpenGL (ES) 2.0 or higher.
+
+ \section1 Performance
+
+ The QOpenGLPaintDevice is almost always hardware accelerated and
+ has the potential of being much faster than software
+ rasterization. However, it is more sensitive to state changes, and
+ therefore requires the drawing commands to be carefully ordered to
+ achieve optimal performance.
+
+ \section1 Antialiasing and Quality
+
+ Antialiasing in the OpenGL paint engine is done using
+ multisampling. Most hardware require significantly more memory to
+ do multisampling and the resulting quality is not on par with the
+ quality of the software paint engine. The OpenGL paint engine's
+ strength lies in its performance, not its visual rendering
+ quality.
+
+ \section1 State Changes
+
+ When painting to a QOpenGLPaintDevice using QPainter, the state of
+ the current OpenGL context will be altered by the paint engine to
+ reflect its needs. Applications should not rely upon the OpenGL
+ state being reset to its original conditions, particularly the
+ current shader program, OpenGL viewport, texture units, and
+ drawing modes.
+
+ \section1 Mixing QPainter and OpenGL
+
+ When intermixing QPainter and OpenGL, it is important to notify
+ QPainter that the OpenGL state may have been cluttered so it can
+ restore its internal state. This is achieved by calling \l
+ QPainter::beginNativePainting() before starting the OpenGL
+ rendering and calling \l QPainter::endNativePainting() after
+ finishing.
+
+ \sa {OpenGL Window Example}
+
+*/
+
+/*!
+ Constructs a QOpenGLPaintDevice.
+
+ The QOpenGLPaintDevice is only valid for the current context.
+
+ \sa QOpenGLContext::currentContext()
+*/
+QOpenGLPaintDevice::QOpenGLPaintDevice()
+ : d_ptr(new QOpenGLPaintDevicePrivate(QSize()))
+{
+}
+
+/*!
+ Constructs a QOpenGLPaintDevice with the given \a size.
+
+ The QOpenGLPaintDevice is only valid for the current context.
+
+ \sa QOpenGLContext::currentContext()
+*/
+QOpenGLPaintDevice::QOpenGLPaintDevice(const QSize &size)
+ : d_ptr(new QOpenGLPaintDevicePrivate(size))
+{
+}
+
+/*!
+ Constructs a QOpenGLPaintDevice with the given \a width and \a height.
+
+ The QOpenGLPaintDevice is only valid for the current context.
+
+ \sa QOpenGLContext::currentContext()
+*/
+QOpenGLPaintDevice::QOpenGLPaintDevice(int width, int height)
+ : QOpenGLPaintDevice(QSize(width, height))
+{
+}
+
+/*!
+ \internal
+ */
+QOpenGLPaintDevice::QOpenGLPaintDevice(QOpenGLPaintDevicePrivate &dd)
+ : d_ptr(&dd)
+{
+}
+
+/*!
+ Destroys the QOpenGLPaintDevice.
+*/
+
+QOpenGLPaintDevice::~QOpenGLPaintDevice()
+{
+ delete d_ptr->engine;
+}
+
+/*!
+ \fn int QOpenGLPaintDevice::devType() const
+ \internal
+ \reimp
+*/
+
+QOpenGLPaintDevicePrivate::QOpenGLPaintDevicePrivate(const QSize &sz)
+ : size(sz)
+ , ctx(QOpenGLContext::currentContext())
+ , dpmx(qt_defaultDpiX() * 100. / 2.54)
+ , dpmy(qt_defaultDpiY() * 100. / 2.54)
+ , devicePixelRatio(1.0)
+ , flipped(false)
+ , engine(nullptr)
+{
+}
+
+QOpenGLPaintDevicePrivate::~QOpenGLPaintDevicePrivate()
+{
+}
+
+class QOpenGLEngineThreadStorage
+{
+public:
+ QPaintEngine *engine() {
+ QPaintEngine *&localEngine = storage.localData();
+ if (!localEngine)
+ localEngine = new QOpenGL2PaintEngineEx;
+ return localEngine;
+ }
+
+private:
+ QThreadStorage<QPaintEngine *> storage;
+};
+
+Q_GLOBAL_STATIC(QOpenGLEngineThreadStorage, qt_opengl_engine)
+
+/*!
+ \reimp
+*/
+
+QPaintEngine *QOpenGLPaintDevice::paintEngine() const
+{
+ if (d_ptr->engine)
+ return d_ptr->engine;
+
+ QPaintEngine *engine = qt_opengl_engine()->engine();
+ if (engine->isActive() && engine->paintDevice() != this) {
+ d_ptr->engine = new QOpenGL2PaintEngineEx;
+ return d_ptr->engine;
+ }
+
+ return engine;
+}
+
+/*!
+ Returns the OpenGL context associated with the paint device.
+*/
+
+QOpenGLContext *QOpenGLPaintDevice::context() const
+{
+ return d_ptr->ctx;
+}
+
+/*!
+ Returns the pixel size of the paint device.
+
+ \sa setSize()
+*/
+
+QSize QOpenGLPaintDevice::size() const
+{
+ return d_ptr->size;
+}
+
+/*!
+ Sets the pixel size of the paint device to \a size.
+
+ \sa size()
+*/
+
+void QOpenGLPaintDevice::setSize(const QSize &size)
+{
+ d_ptr->size = size;
+}
+
+/*!
+ Sets the device pixel ratio for the paint device to \a devicePixelRatio.
+*/
+void QOpenGLPaintDevice::setDevicePixelRatio(qreal devicePixelRatio)
+{
+ d_ptr->devicePixelRatio = devicePixelRatio;
+}
+
+/*!
+ \reimp
+*/
+
+int QOpenGLPaintDevice::metric(QPaintDevice::PaintDeviceMetric metric) const
+{
+ switch (metric) {
+ case PdmWidth:
+ return d_ptr->size.width();
+ case PdmHeight:
+ return d_ptr->size.height();
+ case PdmDepth:
+ return 32;
+ case PdmWidthMM:
+ return qRound(d_ptr->size.width() * 1000 / d_ptr->dpmx);
+ case PdmHeightMM:
+ return qRound(d_ptr->size.height() * 1000 / d_ptr->dpmy);
+ case PdmNumColors:
+ return 0;
+ case PdmDpiX:
+ return qRound(d_ptr->dpmx * 0.0254);
+ case PdmDpiY:
+ return qRound(d_ptr->dpmy * 0.0254);
+ case PdmPhysicalDpiX:
+ return qRound(d_ptr->dpmx * 0.0254);
+ case PdmPhysicalDpiY:
+ return qRound(d_ptr->dpmy * 0.0254);
+ case PdmDevicePixelRatio:
+ return d_ptr->devicePixelRatio;
+ case PdmDevicePixelRatioScaled:
+ return d_ptr->devicePixelRatio * QPaintDevice::devicePixelRatioFScale();
+
+ default:
+ qWarning("QOpenGLPaintDevice::metric() - metric %d not known", metric);
+ return 0;
+ }
+}
+
+/*!
+ Returns the number of pixels per meter horizontally.
+
+ \sa setDotsPerMeterX()
+*/
+
+qreal QOpenGLPaintDevice::dotsPerMeterX() const
+{
+ return d_ptr->dpmx;
+}
+
+/*!
+ Returns the number of pixels per meter vertically.
+
+ \sa setDotsPerMeterY()
+*/
+
+qreal QOpenGLPaintDevice::dotsPerMeterY() const
+{
+ return d_ptr->dpmy;
+}
+
+/*!
+ Sets the number of pixels per meter horizontally to \a dpmx.
+
+ \sa dotsPerMeterX()
+*/
+
+void QOpenGLPaintDevice::setDotsPerMeterX(qreal dpmx)
+{
+ d_ptr->dpmx = dpmx;
+}
+
+/*!
+ Sets the number of pixels per meter vertically to \a dpmy.
+
+ \sa dotsPerMeterY()
+*/
+
+void QOpenGLPaintDevice::setDotsPerMeterY(qreal dpmy)
+{
+ d_ptr->dpmx = dpmy;
+}
+
+/*!
+ Sets whether painting should be flipped around the Y-axis or not to \a flipped.
+
+ \sa paintFlipped()
+*/
+void QOpenGLPaintDevice::setPaintFlipped(bool flipped)
+{
+ d_ptr->flipped = flipped;
+}
+
+/*!
+ Returns \c true if painting is flipped around the Y-axis.
+
+ \sa setPaintFlipped()
+*/
+
+bool QOpenGLPaintDevice::paintFlipped() const
+{
+ return d_ptr->flipped;
+}
+
+/*!
+ This virtual method is provided as a callback to allow re-binding a target
+ frame buffer object or context when different QOpenGLPaintDevice instances
+ are issuing draw calls alternately.
+
+ \l{QPainter::beginNativePainting()}{beginNativePainting()} will also trigger
+ this method.
+
+ The default implementation does nothing.
+*/
+void QOpenGLPaintDevice::ensureActiveTarget()
+{
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglpaintdevice.h b/src/opengl/qopenglpaintdevice.h
new file mode 100644
index 0000000000..f4e1ce4a2e
--- /dev/null
+++ b/src/opengl/qopenglpaintdevice.h
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLPAINTDEVICE_H
+#define QOPENGLPAINTDEVICE_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#ifndef QT_NO_OPENGL
+
+#include <QtGui/qpaintdevice.h>
+#include <QtGui/qopengl.h>
+#include <QtGui/qopenglcontext.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLPaintDevicePrivate;
+
+class Q_OPENGL_EXPORT QOpenGLPaintDevice : public QPaintDevice
+{
+ Q_DECLARE_PRIVATE(QOpenGLPaintDevice)
+public:
+ QOpenGLPaintDevice();
+ explicit QOpenGLPaintDevice(const QSize &size);
+ QOpenGLPaintDevice(int width, int height);
+ ~QOpenGLPaintDevice();
+
+ int devType() const override { return QInternal::OpenGL; }
+ QPaintEngine *paintEngine() const override;
+
+ QOpenGLContext *context() const;
+ QSize size() const;
+ void setSize(const QSize &size);
+ void setDevicePixelRatio(qreal devicePixelRatio);
+
+ qreal dotsPerMeterX() const;
+ qreal dotsPerMeterY() const;
+
+ void setDotsPerMeterX(qreal);
+ void setDotsPerMeterY(qreal);
+
+ void setPaintFlipped(bool flipped);
+ bool paintFlipped() const;
+
+ virtual void ensureActiveTarget();
+
+protected:
+ QOpenGLPaintDevice(QOpenGLPaintDevicePrivate &dd);
+ int metric(QPaintDevice::PaintDeviceMetric metric) const override;
+
+ Q_DISABLE_COPY(QOpenGLPaintDevice)
+ QScopedPointer<QOpenGLPaintDevicePrivate> d_ptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL
+
+#endif // QOPENGLPAINTDEVICE_H
diff --git a/src/opengl/qopenglpaintdevice_p.h b/src/opengl/qopenglpaintdevice_p.h
new file mode 100644
index 0000000000..f4f02e7b57
--- /dev/null
+++ b/src/opengl/qopenglpaintdevice_p.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGL_PAINTDEVICE_P_H
+#define QOPENGL_PAINTDEVICE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the Qt OpenGL classes. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qopenglpaintdevice.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLContext;
+class QPaintEngine;
+
+class Q_OPENGL_EXPORT QOpenGLPaintDevicePrivate
+{
+public:
+ QOpenGLPaintDevicePrivate(const QSize &size);
+ virtual ~QOpenGLPaintDevicePrivate();
+
+ static QOpenGLPaintDevicePrivate *get(QOpenGLPaintDevice *dev) { return dev->d_func(); }
+
+ virtual void beginPaint() { }
+ virtual void endPaint() { }
+
+public:
+ QSize size;
+ QOpenGLContext *ctx;
+
+ qreal dpmx;
+ qreal dpmy;
+ qreal devicePixelRatio;
+
+ bool flipped;
+
+ QPaintEngine *engine;
+};
+
+QT_END_NAMESPACE
+
+#endif // QOPENGL_PAINTDEVICE_P_H
diff --git a/src/opengl/qopenglpaintengine.cpp b/src/opengl/qopenglpaintengine.cpp
new file mode 100644
index 0000000000..66974aff79
--- /dev/null
+++ b/src/opengl/qopenglpaintengine.cpp
@@ -0,0 +1,2702 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*
+ When the active program changes, we need to update it's uniforms.
+ We could track state for each program and only update stale uniforms
+ - Could lead to lots of overhead if there's a lot of programs
+ We could update all the uniforms when the program changes
+ - Could end up updating lots of uniforms which don't need updating
+
+ Updating uniforms should be cheap, so the overhead of updating up-to-date
+ uniforms should be minimal. It's also less complex.
+
+ Things which _may_ cause a different program to be used:
+ - Change in brush/pen style
+ - Change in painter opacity
+ - Change in composition mode
+
+ Whenever we set a mode on the shader manager - it needs to tell us if it had
+ to switch to a different program.
+
+ The shader manager should only switch when we tell it to. E.g. if we set a new
+ brush style and then switch to transparent painter, we only want it to compile
+ and use the correct program when we really need it.
+*/
+
+// #define QT_OPENGL_CACHE_AS_VBOS
+
+#include <private/qopenglgradientcache_p.h>
+#include <private/qopengltexturecache_p.h>
+#include "qopenglpaintengine_p.h"
+#include "qopenglpaintdevice_p.h"
+
+#include <string.h> //for memcpy
+#include <qmath.h>
+
+#include <private/qopengl_p.h>
+#include <private/qopenglcontext_p.h>
+#include <private/qopenglextensions_p.h>
+#include <private/qpaintengineex_p.h>
+#include <QPaintEngine>
+#include <private/qpainter_p.h>
+#include <private/qfontengine_p.h>
+#include <private/qdatabuffer_p.h>
+#include <private/qstatictext_p.h>
+#include <private/qtriangulator_p.h>
+
+#include <private/qopenglengineshadermanager_p.h>
+#include <private/qopengl2pexvertexarray_p.h>
+#include <private/qopengltextureglyphcache_p.h>
+
+#include <QDebug>
+
+#ifndef GL_KHR_blend_equation_advanced
+#define GL_KHR_blend_equation_advanced 1
+#define GL_MULTIPLY_KHR 0x9294
+#define GL_SCREEN_KHR 0x9295
+#define GL_OVERLAY_KHR 0x9296
+#define GL_DARKEN_KHR 0x9297
+#define GL_LIGHTEN_KHR 0x9298
+#define GL_COLORDODGE_KHR 0x9299
+#define GL_COLORBURN_KHR 0x929A
+#define GL_HARDLIGHT_KHR 0x929B
+#define GL_SOFTLIGHT_KHR 0x929C
+#define GL_DIFFERENCE_KHR 0x929E
+#define GL_EXCLUSION_KHR 0x92A0
+#endif /* GL_KHR_blend_equation_advanced */
+
+#ifndef GL_KHR_blend_equation_advanced_coherent
+#define GL_KHR_blend_equation_advanced_coherent 1
+#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285
+#endif /* GL_KHR_blend_equation_advanced_coherent */
+
+QT_BEGIN_NAMESPACE
+
+
+Q_OPENGL_EXPORT QImage qt_imageForBrush(int brushStyle, bool invert);
+
+////////////////////////////////// Private Methods //////////////////////////////////////////
+
+QOpenGL2PaintEngineExPrivate::~QOpenGL2PaintEngineExPrivate()
+{
+ delete shaderManager;
+
+ vertexBuffer.destroy();
+ texCoordBuffer.destroy();
+ opacityBuffer.destroy();
+ indexBuffer.destroy();
+ vao.destroy();
+
+ if (elementIndicesVBOId != 0) {
+ funcs.glDeleteBuffers(1, &elementIndicesVBOId);
+ elementIndicesVBOId = 0;
+ }
+}
+
+inline QColor qt_premultiplyColor(QColor c, GLfloat opacity)
+{
+ qreal alpha = c.alphaF() * opacity;
+ c.setAlphaF(alpha);
+ c.setRedF(c.redF() * alpha);
+ c.setGreenF(c.greenF() * alpha);
+ c.setBlueF(c.blueF() * alpha);
+ return c;
+}
+
+
+void QOpenGL2PaintEngineExPrivate::setBrush(const QBrush& brush)
+{
+ if (qbrush_fast_equals(currentBrush, brush))
+ return;
+
+ const Qt::BrushStyle newStyle = qbrush_style(brush);
+ Q_ASSERT(newStyle != Qt::NoBrush);
+
+ currentBrush = brush;
+ if (!currentBrushImage.isNull())
+ currentBrushImage = QImage();
+ brushUniformsDirty = true; // All brushes have at least one uniform
+
+ if (newStyle > Qt::SolidPattern)
+ brushTextureDirty = true;
+
+ if (currentBrush.style() == Qt::TexturePattern
+ && qHasPixmapTexture(brush) && brush.texture().isQBitmap())
+ {
+ shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::TextureSrcWithPattern);
+ } else {
+ shaderManager->setSrcPixelType(newStyle);
+ }
+ shaderManager->optimiseForBrushTransform(currentBrush.transform().type());
+}
+
+
+void QOpenGL2PaintEngineExPrivate::useSimpleShader()
+{
+ shaderManager->useSimpleProgram();
+
+ if (matrixDirty)
+ updateMatrix();
+}
+
+/*
+ Single entry-point for activating, binding, and setting properties.
+
+ Allows keeping track of (caching) the latest texture unit and bound
+ texture in a central place, so that we can skip re-binding unless
+ needed.
+
+ \note Any code or Qt API that internally activates or binds will
+ not affect the cache used by this function, which means they will
+ lead to inconsisent state. QPainter::beginNativePainting() takes
+ care of resetting the cache, so for user–code this is fine, but
+ internally in the paint engine care must be taken to not call
+ functions that may activate or bind under our feet.
+*/
+template<typename T>
+void QOpenGL2PaintEngineExPrivate::updateTexture(GLenum textureUnit, const T &texture, GLenum wrapMode, GLenum filterMode, TextureUpdateMode updateMode)
+{
+ static const GLenum target = GL_TEXTURE_2D;
+
+ activateTextureUnit(textureUnit);
+
+ GLuint textureId = bindTexture(texture);
+
+ if (updateMode == UpdateIfNeeded && textureId == lastTextureUsed)
+ return;
+
+ lastTextureUsed = textureId;
+
+ funcs.glTexParameteri(target, GL_TEXTURE_WRAP_S, wrapMode);
+ funcs.glTexParameteri(target, GL_TEXTURE_WRAP_T, wrapMode);
+
+ funcs.glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filterMode);
+ funcs.glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filterMode);
+}
+
+void QOpenGL2PaintEngineExPrivate::activateTextureUnit(GLenum textureUnit)
+{
+ if (textureUnit != lastTextureUnitUsed) {
+ funcs.glActiveTexture(GL_TEXTURE0 + textureUnit);
+ lastTextureUnitUsed = textureUnit;
+
+ // We simplify things by keeping a single cached value of the last
+ // texture that was bound, instead of one per texture unit. This
+ // means that switching texture units could potentially mean we
+ // need a re-bind and corresponding parameter updates.
+ lastTextureUsed = GLuint(-1);
+ }
+}
+
+template<>
+GLuint QOpenGL2PaintEngineExPrivate::bindTexture(const GLuint &textureId)
+{
+ if (textureId != lastTextureUsed)
+ funcs.glBindTexture(GL_TEXTURE_2D, textureId);
+
+ return textureId;
+}
+
+template<>
+GLuint QOpenGL2PaintEngineExPrivate::bindTexture(const QImage &image)
+{
+ return QOpenGLTextureCache::cacheForContext(ctx)->bindTexture(ctx, image);
+}
+
+template<>
+GLuint QOpenGL2PaintEngineExPrivate::bindTexture(const QPixmap &pixmap)
+{
+ return QOpenGLTextureCache::cacheForContext(ctx)->bindTexture(ctx, pixmap);
+}
+
+template<>
+GLuint QOpenGL2PaintEngineExPrivate::bindTexture(const QGradient &gradient)
+{
+ // We apply global opacity in the fragment shaders, so we always pass 1.0
+ // for opacity to the cache.
+ GLuint textureId = QOpenGL2GradientCache::cacheForContext(ctx)->getBuffer(gradient, 1.0);
+
+ // QOpenGL2GradientCache::getBuffer() may bind and generate a new texture if it
+ // hasn't been cached yet, but will otherwise return an unbound texture id. To
+ // be sure that the texture is bound, we unfortunately have to bind again,
+ // which results in the initial generation of the texture doing two binds.
+ return bindTexture(textureId);
+}
+
+struct ImageWithBindOptions
+{
+ const QImage &image;
+ QOpenGLTextureUploader::BindOptions options;
+};
+
+template<>
+GLuint QOpenGL2PaintEngineExPrivate::bindTexture(const ImageWithBindOptions &imageWithOptions)
+{
+ return QOpenGLTextureCache::cacheForContext(ctx)->bindTexture(ctx, imageWithOptions.image, imageWithOptions.options);
+}
+
+inline static bool isPowerOfTwo(int x)
+{
+ // Assumption: x >= 1
+ return x == (x & -x);
+}
+
+void QOpenGL2PaintEngineExPrivate::updateBrushTexture()
+{
+ Q_Q(QOpenGL2PaintEngineEx);
+// qDebug("QOpenGL2PaintEngineExPrivate::updateBrushTexture()");
+ Qt::BrushStyle style = currentBrush.style();
+
+ bool smoothPixmapTransform = q->state()->renderHints & QPainter::SmoothPixmapTransform;
+ GLenum filterMode = smoothPixmapTransform ? GL_LINEAR : GL_NEAREST;
+
+ if ( (style >= Qt::Dense1Pattern) && (style <= Qt::DiagCrossPattern) ) {
+ // Get the image data for the pattern
+ QImage textureImage = qt_imageForBrush(style, false);
+
+ updateTexture(QT_BRUSH_TEXTURE_UNIT, textureImage, GL_REPEAT, filterMode, ForceUpdate);
+ }
+ else if (style >= Qt::LinearGradientPattern && style <= Qt::ConicalGradientPattern) {
+ // Gradiant brush: All the gradiants use the same texture
+
+ const QGradient *gradient = currentBrush.gradient();
+
+ GLenum wrapMode = GL_CLAMP_TO_EDGE;
+ if (gradient->spread() == QGradient::RepeatSpread || gradient->type() == QGradient::ConicalGradient)
+ wrapMode = GL_REPEAT;
+ else if (gradient->spread() == QGradient::ReflectSpread)
+ wrapMode = GL_MIRRORED_REPEAT;
+
+ updateTexture(QT_BRUSH_TEXTURE_UNIT, *gradient, wrapMode, filterMode, ForceUpdate);
+ }
+ else if (style == Qt::TexturePattern) {
+ currentBrushImage = currentBrush.textureImage();
+
+ int max_texture_size = ctx->d_func()->maxTextureSize();
+ QSize newSize = currentBrushImage.size();
+ newSize = newSize.boundedTo(QSize(max_texture_size, max_texture_size));
+ if (!QOpenGLContext::currentContext()->functions()->hasOpenGLFeature(QOpenGLFunctions::NPOTTextureRepeat)) {
+ if (!isPowerOfTwo(newSize.width()) || !isPowerOfTwo(newSize.height())) {
+ newSize.setHeight(qNextPowerOfTwo(newSize.height() - 1));
+ newSize.setWidth(qNextPowerOfTwo(newSize.width() - 1));
+ }
+ }
+ if (currentBrushImage.size() != newSize)
+ currentBrushImage = currentBrushImage.scaled(newSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+
+ GLuint wrapMode = GL_REPEAT;
+
+ updateTexture(QT_BRUSH_TEXTURE_UNIT, currentBrushImage, wrapMode, filterMode, ForceUpdate);
+ }
+ brushTextureDirty = false;
+}
+
+
+void QOpenGL2PaintEngineExPrivate::updateBrushUniforms()
+{
+// qDebug("QOpenGL2PaintEngineExPrivate::updateBrushUniforms()");
+ Qt::BrushStyle style = currentBrush.style();
+
+ if (style == Qt::NoBrush)
+ return;
+
+ QTransform brushQTransform = currentBrush.transform();
+
+ if (style == Qt::SolidPattern) {
+ QColor col = qt_premultiplyColor(currentBrush.color(), (GLfloat)q->state()->opacity);
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::FragmentColor), col);
+ }
+ else {
+ // All other brushes have a transform and thus need the translation point:
+ QPointF translationPoint;
+
+ if (style <= Qt::DiagCrossPattern) {
+ QColor col = qt_premultiplyColor(currentBrush.color(), (GLfloat)q->state()->opacity);
+
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::PatternColor), col);
+
+ QVector2D halfViewportSize(width*0.5, height*0.5);
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::HalfViewportSize), halfViewportSize);
+ }
+ else if (style == Qt::LinearGradientPattern) {
+ const QLinearGradient *g = static_cast<const QLinearGradient *>(currentBrush.gradient());
+
+ QPointF realStart = g->start();
+ QPointF realFinal = g->finalStop();
+ translationPoint = realStart;
+
+ QPointF l = realFinal - realStart;
+
+ QVector3D linearData(
+ l.x(),
+ l.y(),
+ 1.0f / (l.x() * l.x() + l.y() * l.y())
+ );
+
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::LinearData), linearData);
+
+ QVector2D halfViewportSize(width*0.5, height*0.5);
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::HalfViewportSize), halfViewportSize);
+ }
+ else if (style == Qt::ConicalGradientPattern) {
+ const QConicalGradient *g = static_cast<const QConicalGradient *>(currentBrush.gradient());
+ translationPoint = g->center();
+
+ GLfloat angle = -qDegreesToRadians(g->angle());
+
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::Angle), angle);
+
+ QVector2D halfViewportSize(width*0.5, height*0.5);
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::HalfViewportSize), halfViewportSize);
+ }
+ else if (style == Qt::RadialGradientPattern) {
+ const QRadialGradient *g = static_cast<const QRadialGradient *>(currentBrush.gradient());
+ QPointF realCenter = g->center();
+ QPointF realFocal = g->focalPoint();
+ qreal realRadius = g->centerRadius() - g->focalRadius();
+ translationPoint = realFocal;
+
+ QPointF fmp = realCenter - realFocal;
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::Fmp), fmp);
+
+ GLfloat fmp2_m_radius2 = -fmp.x() * fmp.x() - fmp.y() * fmp.y() + realRadius*realRadius;
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::Fmp2MRadius2), fmp2_m_radius2);
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::Inverse2Fmp2MRadius2),
+ GLfloat(1.0 / (2.0*fmp2_m_radius2)));
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::SqrFr),
+ GLfloat(g->focalRadius() * g->focalRadius()));
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::BRadius),
+ GLfloat(2 * (g->centerRadius() - g->focalRadius()) * g->focalRadius()),
+ g->focalRadius(),
+ g->centerRadius() - g->focalRadius());
+
+ QVector2D halfViewportSize(width*0.5, height*0.5);
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::HalfViewportSize), halfViewportSize);
+ }
+ else if (style == Qt::TexturePattern) {
+ const QPixmap& texPixmap = currentBrush.texture();
+
+ if (qHasPixmapTexture(currentBrush) && currentBrush.texture().isQBitmap()) {
+ QColor col = qt_premultiplyColor(currentBrush.color(), (GLfloat)q->state()->opacity);
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::PatternColor), col);
+ }
+
+ QSizeF invertedTextureSize(1.0 / texPixmap.width(), 1.0 / texPixmap.height());
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::InvertedTextureSize), invertedTextureSize);
+
+ QVector2D halfViewportSize(width*0.5, height*0.5);
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::HalfViewportSize), halfViewportSize);
+ }
+ else
+ qWarning("QOpenGL2PaintEngineEx: Unimplemented fill style");
+
+ const QPointF &brushOrigin = q->state()->brushOrigin;
+ QTransform matrix = q->state()->matrix;
+ matrix.translate(brushOrigin.x(), brushOrigin.y());
+
+ QTransform translate(1, 0, 0, 1, -translationPoint.x(), -translationPoint.y());
+ qreal m22 = -1;
+ qreal dy = height;
+ if (device->paintFlipped()) {
+ m22 = 1;
+ dy = 0;
+ }
+ QTransform gl_to_qt(1, 0, 0, m22, 0, dy);
+ QTransform inv_matrix = gl_to_qt * (brushQTransform * matrix).inverted() * translate;
+
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::BrushTransform), inv_matrix);
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::BrushTexture), QT_BRUSH_TEXTURE_UNIT);
+ }
+ brushUniformsDirty = false;
+}
+
+
+// This assumes the shader manager has already setup the correct shader program
+void QOpenGL2PaintEngineExPrivate::updateMatrix()
+{
+// qDebug("QOpenGL2PaintEngineExPrivate::updateMatrix()");
+
+ const QTransform& transform = q->state()->matrix;
+
+ // The projection matrix converts from Qt's coordinate system to GL's coordinate system
+ // * GL's viewport is 2x2, Qt's is width x height
+ // * GL has +y -> -y going from bottom -> top, Qt is the other way round
+ // * GL has [0,0] in the center, Qt has it in the top-left
+ //
+ // This results in the Projection matrix below, which is multiplied by the painter's
+ // transformation matrix, as shown below:
+ //
+ // Projection Matrix Painter Transform
+ // ------------------------------------------------ ------------------------
+ // | 2.0 / width | 0.0 | -1.0 | | m11 | m21 | dx |
+ // | 0.0 | -2.0 / height | 1.0 | * | m12 | m22 | dy |
+ // | 0.0 | 0.0 | 1.0 | | m13 | m23 | m33 |
+ // ------------------------------------------------ ------------------------
+ //
+ // NOTE: The resultant matrix is also transposed, as GL expects column-major matracies
+
+ const GLfloat wfactor = 2.0f / width;
+ GLfloat hfactor = -2.0f / height;
+
+ GLfloat dx = transform.dx();
+ GLfloat dy = transform.dy();
+
+ if (device->paintFlipped()) {
+ hfactor *= -1;
+ dy -= height;
+ }
+
+ // Non-integer translates can have strange effects for some rendering operations such as
+ // anti-aliased text rendering. In such cases, we snap the translate to the pixel grid.
+ if (snapToPixelGrid && transform.type() == QTransform::TxTranslate) {
+ // 0.50 needs to rounded down to 0.0 for consistency with raster engine:
+ dx = std::ceil(dx - 0.5f);
+ dy = std::ceil(dy - 0.5f);
+ }
+ pmvMatrix[0][0] = (wfactor * transform.m11()) - transform.m13();
+ pmvMatrix[1][0] = (wfactor * transform.m21()) - transform.m23();
+ pmvMatrix[2][0] = (wfactor * dx) - transform.m33();
+ pmvMatrix[0][1] = (hfactor * transform.m12()) + transform.m13();
+ pmvMatrix[1][1] = (hfactor * transform.m22()) + transform.m23();
+ pmvMatrix[2][1] = (hfactor * dy) + transform.m33();
+ pmvMatrix[0][2] = transform.m13();
+ pmvMatrix[1][2] = transform.m23();
+ pmvMatrix[2][2] = transform.m33();
+
+ // 1/10000 == 0.0001, so we have good enough res to cover curves
+ // that span the entire widget...
+ inverseScale = qMax(1 / qMax( qMax(qAbs(transform.m11()), qAbs(transform.m22())),
+ qMax(qAbs(transform.m12()), qAbs(transform.m21())) ),
+ qreal(0.0001));
+
+ matrixDirty = false;
+ matrixUniformDirty = true;
+
+ // Set the PMV matrix attribute. As we use an attributes rather than uniforms, we only
+ // need to do this once for every matrix change and persists across all shader programs.
+ funcs.glVertexAttrib3fv(QT_PMV_MATRIX_1_ATTR, pmvMatrix[0]);
+ funcs.glVertexAttrib3fv(QT_PMV_MATRIX_2_ATTR, pmvMatrix[1]);
+ funcs.glVertexAttrib3fv(QT_PMV_MATRIX_3_ATTR, pmvMatrix[2]);
+
+ dasher.setInvScale(inverseScale);
+ stroker.setInvScale(inverseScale);
+}
+
+
+void QOpenGL2PaintEngineExPrivate::updateCompositionMode()
+{
+ // NOTE: The entire paint engine works on pre-multiplied data - which is why some of these
+ // composition modes look odd.
+// qDebug() << "QOpenGL2PaintEngineExPrivate::updateCompositionMode() - Setting GL composition mode for " << q->state()->composition_mode;
+ if (ctx->functions()->hasOpenGLFeature(QOpenGLFunctions::BlendEquationAdvanced)) {
+ if (q->state()->composition_mode <= QPainter::CompositionMode_Plus) {
+ funcs.glDisable(GL_BLEND_ADVANCED_COHERENT_KHR);
+ funcs.glBlendEquation(GL_FUNC_ADD);
+ } else {
+ funcs.glEnable(GL_BLEND_ADVANCED_COHERENT_KHR);
+ }
+ shaderManager->setCompositionMode(q->state()->composition_mode);
+ } else {
+ if (q->state()->composition_mode > QPainter::CompositionMode_Plus) {
+ qWarning("Unsupported composition mode");
+ compositionModeDirty = false;
+ return;
+ }
+ }
+ switch(q->state()->composition_mode) {
+ case QPainter::CompositionMode_SourceOver:
+ funcs.glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ break;
+ case QPainter::CompositionMode_DestinationOver:
+ funcs.glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE);
+ break;
+ case QPainter::CompositionMode_Clear:
+ funcs.glBlendFunc(GL_ZERO, GL_ZERO);
+ break;
+ case QPainter::CompositionMode_Source:
+ funcs.glBlendFunc(GL_ONE, GL_ZERO);
+ break;
+ case QPainter::CompositionMode_Destination:
+ funcs.glBlendFunc(GL_ZERO, GL_ONE);
+ break;
+ case QPainter::CompositionMode_SourceIn:
+ funcs.glBlendFunc(GL_DST_ALPHA, GL_ZERO);
+ break;
+ case QPainter::CompositionMode_DestinationIn:
+ funcs.glBlendFunc(GL_ZERO, GL_SRC_ALPHA);
+ break;
+ case QPainter::CompositionMode_SourceOut:
+ funcs.glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ZERO);
+ break;
+ case QPainter::CompositionMode_DestinationOut:
+ funcs.glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
+ break;
+ case QPainter::CompositionMode_SourceAtop:
+ funcs.glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ break;
+ case QPainter::CompositionMode_DestinationAtop:
+ funcs.glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA);
+ break;
+ case QPainter::CompositionMode_Xor:
+ funcs.glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ break;
+ case QPainter::CompositionMode_Plus:
+ funcs.glBlendFunc(GL_ONE, GL_ONE);
+ break;
+ case QPainter::CompositionMode_Multiply:
+ funcs.glBlendEquation(GL_MULTIPLY_KHR);
+ break;
+ case QPainter::CompositionMode_Screen:
+ funcs.glBlendEquation(GL_SCREEN_KHR);
+ break;
+ case QPainter::CompositionMode_Overlay:
+ funcs.glBlendEquation(GL_OVERLAY_KHR);
+ break;
+ case QPainter::CompositionMode_Darken:
+ funcs.glBlendEquation(GL_DARKEN_KHR);
+ break;
+ case QPainter::CompositionMode_Lighten:
+ funcs.glBlendEquation(GL_LIGHTEN_KHR);
+ break;
+ case QPainter::CompositionMode_ColorDodge:
+ funcs.glBlendEquation(GL_COLORDODGE_KHR);
+ break;
+ case QPainter::CompositionMode_ColorBurn:
+ funcs.glBlendEquation(GL_COLORBURN_KHR);
+ break;
+ case QPainter::CompositionMode_HardLight:
+ funcs.glBlendEquation(GL_HARDLIGHT_KHR);
+ break;
+ case QPainter::CompositionMode_SoftLight:
+ funcs.glBlendEquation(GL_SOFTLIGHT_KHR);
+ break;
+ case QPainter::CompositionMode_Difference:
+ funcs.glBlendEquation(GL_DIFFERENCE_KHR);
+ break;
+ case QPainter::CompositionMode_Exclusion:
+ funcs.glBlendEquation(GL_EXCLUSION_KHR);
+ break;
+ default:
+ qWarning("Unsupported composition mode");
+ break;
+ }
+
+ compositionModeDirty = false;
+}
+
+static inline void setCoords(GLfloat *coords, const QOpenGLRect &rect)
+{
+ coords[0] = rect.left;
+ coords[1] = rect.top;
+ coords[2] = rect.right;
+ coords[3] = rect.top;
+ coords[4] = rect.right;
+ coords[5] = rect.bottom;
+ coords[6] = rect.left;
+ coords[7] = rect.bottom;
+}
+
+void QOpenGL2PaintEngineExPrivate::drawTexture(const QOpenGLRect& dest, const QOpenGLRect& src, const QSize &textureSize, bool opaque, bool pattern)
+{
+ // Setup for texture drawing
+ currentBrush = noBrush;
+
+ if (snapToPixelGrid) {
+ snapToPixelGrid = false;
+ matrixDirty = true;
+ }
+
+ if (prepareForDraw(opaque))
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::ImageTexture), QT_IMAGE_TEXTURE_UNIT);
+
+ if (pattern) {
+ QColor col = qt_premultiplyColor(q->state()->pen.color(), (GLfloat)q->state()->opacity);
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::PatternColor), col);
+ }
+
+ GLfloat dx = 1.0 / textureSize.width();
+ GLfloat dy = 1.0 / textureSize.height();
+
+ QOpenGLRect srcTextureRect(src.left*dx, src.top*dy, src.right*dx, src.bottom*dy);
+
+ setCoords(staticVertexCoordinateArray, dest);
+ setCoords(staticTextureCoordinateArray, srcTextureRect);
+
+ setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
+ setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, true);
+
+ uploadData(QT_VERTEX_COORDS_ATTR, staticVertexCoordinateArray, 8);
+ uploadData(QT_TEXTURE_COORDS_ATTR, staticTextureCoordinateArray, 8);
+
+ funcs.glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+}
+
+void QOpenGL2PaintEngineEx::beginNativePainting()
+{
+ Q_D(QOpenGL2PaintEngineEx);
+ ensureActive();
+ d->transferMode(BrushDrawingMode);
+
+ d->nativePaintingActive = true;
+
+ d->funcs.glUseProgram(0);
+
+ // Disable all the vertex attribute arrays:
+ for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i)
+ d->funcs.glDisableVertexAttribArray(i);
+
+#if !QT_CONFIG(opengles2) && !defined(QT_OPENGL_DYNAMIC)
+ Q_ASSERT(QOpenGLContext::currentContext());
+ const QOpenGLContext *ctx = d->ctx;
+ const QSurfaceFormat &fmt = d->device->context()->format();
+ if (fmt.majorVersion() < 3 || (fmt.majorVersion() == 3 && fmt.minorVersion() < 1)
+ || (fmt.majorVersion() == 3 && fmt.minorVersion() == 1 && ctx->hasExtension(QByteArrayLiteral("GL_ARB_compatibility")))
+ || fmt.profile() == QSurfaceFormat::CompatibilityProfile)
+ {
+ // be nice to people who mix OpenGL 1.x code with QPainter commands
+ // by setting modelview and projection matrices to mirror the GL 1
+ // paint engine
+ const QTransform& mtx = state()->matrix;
+
+ float mv_matrix[4][4] =
+ {
+ { float(mtx.m11()), float(mtx.m12()), 0, float(mtx.m13()) },
+ { float(mtx.m21()), float(mtx.m22()), 0, float(mtx.m23()) },
+ { 0, 0, 1, 0 },
+ { float(mtx.dx()), float(mtx.dy()), 0, float(mtx.m33()) }
+ };
+
+ const QSize sz = d->device->size();
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(0, sz.width(), sz.height(), 0, -999999, 999999);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadMatrixf(&mv_matrix[0][0]);
+ }
+#endif // !QT_CONFIG(opengles2)
+
+ d->resetGLState();
+
+ // We don't know what texture units and textures the native painting
+ // will activate and bind, so we can't assume anything when we return
+ // from the native painting.
+ d->lastTextureUnitUsed = QT_UNKNOWN_TEXTURE_UNIT;
+ d->lastTextureUsed = GLuint(-1);
+
+ d->dirtyStencilRegion = QRect(0, 0, d->width, d->height);
+
+ d->shaderManager->setDirty();
+
+ d->needsSync = true;
+}
+
+void QOpenGL2PaintEngineExPrivate::resetGLState()
+{
+ activateTextureUnit(QT_DEFAULT_TEXTURE_UNIT);
+
+ funcs.glDisable(GL_BLEND);
+ funcs.glDisable(GL_STENCIL_TEST);
+ funcs.glDisable(GL_DEPTH_TEST);
+ funcs.glDisable(GL_SCISSOR_TEST);
+ funcs.glDepthMask(true);
+ funcs.glDepthFunc(GL_LESS);
+ funcs.glClearDepthf(1);
+ funcs.glStencilMask(0xff);
+ funcs.glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ funcs.glStencilFunc(GL_ALWAYS, 0, 0xff);
+ setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, false);
+ setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, false);
+ setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false);
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ // gl_Color, corresponding to vertex attribute 3, may have been changed
+ float color[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ funcs.glVertexAttrib4fv(3, color);
+ }
+ if (vao.isCreated()) {
+ vao.release();
+ funcs.glBindBuffer(GL_ARRAY_BUFFER, 0);
+ funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ }
+}
+
+void QOpenGL2PaintEngineEx::endNativePainting()
+{
+ Q_D(QOpenGL2PaintEngineEx);
+ d->needsSync = true;
+ d->nativePaintingActive = false;
+}
+
+void QOpenGL2PaintEngineEx::invalidateState()
+{
+ Q_D(QOpenGL2PaintEngineEx);
+ d->needsSync = true;
+}
+
+bool QOpenGL2PaintEngineEx::isNativePaintingActive() const {
+ Q_D(const QOpenGL2PaintEngineEx);
+ return d->nativePaintingActive;
+}
+
+void QOpenGL2PaintEngineExPrivate::transferMode(EngineMode newMode)
+{
+ if (newMode == mode)
+ return;
+
+ if (newMode == TextDrawingMode) {
+ shaderManager->setHasComplexGeometry(true);
+ } else {
+ shaderManager->setHasComplexGeometry(false);
+ }
+
+ if (newMode == ImageDrawingMode) {
+ uploadData(QT_VERTEX_COORDS_ATTR, staticVertexCoordinateArray, 8);
+ uploadData(QT_TEXTURE_COORDS_ATTR, staticTextureCoordinateArray, 8);
+ }
+
+ if (newMode == ImageArrayDrawingMode || newMode == ImageOpacityArrayDrawingMode) {
+ uploadData(QT_VERTEX_COORDS_ATTR, (GLfloat*)vertexCoordinateArray.data(), vertexCoordinateArray.vertexCount() * 2);
+ uploadData(QT_TEXTURE_COORDS_ATTR, (GLfloat*)textureCoordinateArray.data(), textureCoordinateArray.vertexCount() * 2);
+
+ if (newMode == ImageOpacityArrayDrawingMode)
+ uploadData(QT_OPACITY_ATTR, (GLfloat*)opacityArray.data(), opacityArray.size());
+ }
+
+ // This needs to change when we implement high-quality anti-aliasing...
+ if (newMode != TextDrawingMode)
+ shaderManager->setMaskType(QOpenGLEngineShaderManager::NoMask);
+
+ mode = newMode;
+}
+
+struct QOpenGL2PEVectorPathCache
+{
+#ifdef QT_OPENGL_CACHE_AS_VBOS
+ GLuint vbo;
+ GLuint ibo;
+#else
+ float *vertices;
+ void *indices;
+#endif
+ int vertexCount;
+ int indexCount;
+ GLenum primitiveType;
+ qreal iscale;
+ QVertexIndexVector::Type indexType;
+};
+
+void QOpenGL2PaintEngineExPrivate::cleanupVectorPath(QPaintEngineEx *engine, void *data)
+{
+ QOpenGL2PEVectorPathCache *c = (QOpenGL2PEVectorPathCache *) data;
+#ifdef QT_OPENGL_CACHE_AS_VBOS
+ Q_ASSERT(engine->type() == QPaintEngine::OpenGL2);
+ static_cast<QOpenGL2PaintEngineEx *>(engine)->d_func()->unusedVBOSToClean << c->vbo;
+ if (c->ibo)
+ d->unusedIBOSToClean << c->ibo;
+#else
+ Q_UNUSED(engine);
+ free(c->vertices);
+ free(c->indices);
+#endif
+ delete c;
+}
+
+// Assumes everything is configured for the brush you want to use
+void QOpenGL2PaintEngineExPrivate::fill(const QVectorPath& path)
+{
+ transferMode(BrushDrawingMode);
+
+ if (snapToPixelGrid) {
+ snapToPixelGrid = false;
+ matrixDirty = true;
+ }
+
+ // Might need to call updateMatrix to re-calculate inverseScale
+ if (matrixDirty)
+ updateMatrix();
+
+ const bool supportsElementIndexUint = funcs.hasOpenGLExtension(QOpenGLExtensions::ElementIndexUint);
+
+ const QPointF* const points = reinterpret_cast<const QPointF*>(path.points());
+
+ // Check to see if there's any hints
+ if (path.shape() == QVectorPath::RectangleHint) {
+ QOpenGLRect rect(points[0].x(), points[0].y(), points[2].x(), points[2].y());
+ prepareForDraw(currentBrush.isOpaque());
+ composite(rect);
+ } else if (path.isConvex()) {
+
+ if (path.isCacheable()) {
+ QVectorPath::CacheEntry *data = path.lookupCacheData(q);
+ QOpenGL2PEVectorPathCache *cache;
+
+ bool updateCache = false;
+
+ if (data) {
+ cache = (QOpenGL2PEVectorPathCache *) data->data;
+ // Check if scale factor is exceeded and regenerate if so...
+ qreal scaleFactor = cache->iscale / inverseScale;
+ if (scaleFactor < 0.5 || scaleFactor > 2.0) {
+#ifdef QT_OPENGL_CACHE_AS_VBOS
+ glDeleteBuffers(1, &cache->vbo);
+ cache->vbo = 0;
+ Q_ASSERT(cache->ibo == 0);
+#else
+ free(cache->vertices);
+ Q_ASSERT(cache->indices == nullptr);
+#endif
+ updateCache = true;
+ }
+ } else {
+ cache = new QOpenGL2PEVectorPathCache;
+ data = const_cast<QVectorPath &>(path).addCacheData(q, cache, cleanupVectorPath);
+ updateCache = true;
+ }
+
+ // Flatten the path at the current scale factor and fill it into the cache struct.
+ if (updateCache) {
+ vertexCoordinateArray.clear();
+ vertexCoordinateArray.addPath(path, inverseScale, false);
+ int vertexCount = vertexCoordinateArray.vertexCount();
+ int floatSizeInBytes = vertexCount * 2 * sizeof(float);
+ cache->vertexCount = vertexCount;
+ cache->indexCount = 0;
+ cache->primitiveType = GL_TRIANGLE_FAN;
+ cache->iscale = inverseScale;
+#ifdef QT_OPENGL_CACHE_AS_VBOS
+ funcs.glGenBuffers(1, &cache->vbo);
+ funcs.glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
+ funcs.glBufferData(GL_ARRAY_BUFFER, floatSizeInBytes, vertexCoordinateArray.data(), GL_STATIC_DRAW);
+ cache->ibo = 0;
+#else
+ cache->vertices = (float *) malloc(floatSizeInBytes);
+ memcpy(cache->vertices, vertexCoordinateArray.data(), floatSizeInBytes);
+ cache->indices = nullptr;
+#endif
+ }
+
+ prepareForDraw(currentBrush.isOpaque());
+#ifdef QT_OPENGL_CACHE_AS_VBOS
+ funcs.glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
+ uploadData(QT_VERTEX_COORD_ATTR, 0, cache->vertexCount);
+ setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, 0);
+#else
+ uploadData(QT_VERTEX_COORDS_ATTR, cache->vertices, cache->vertexCount * 2);
+#endif
+ funcs.glDrawArrays(cache->primitiveType, 0, cache->vertexCount);
+
+ } else {
+ // printf(" - Marking path as cachable...\n");
+ // Tag it for later so that if the same path is drawn twice, it is assumed to be static and thus cachable
+ path.makeCacheable();
+ vertexCoordinateArray.clear();
+ vertexCoordinateArray.addPath(path, inverseScale, false);
+ prepareForDraw(currentBrush.isOpaque());
+ drawVertexArrays(vertexCoordinateArray, GL_TRIANGLE_FAN);
+ }
+
+ } else {
+ bool useCache = path.isCacheable();
+ if (useCache) {
+ QRectF bbox = path.controlPointRect();
+ // If the path doesn't fit within these limits, it is possible that the triangulation will fail.
+ useCache &= (bbox.left() > -0x8000 * inverseScale)
+ && (bbox.right() < 0x8000 * inverseScale)
+ && (bbox.top() > -0x8000 * inverseScale)
+ && (bbox.bottom() < 0x8000 * inverseScale);
+ }
+
+ if (useCache) {
+ QVectorPath::CacheEntry *data = path.lookupCacheData(q);
+ QOpenGL2PEVectorPathCache *cache;
+
+ bool updateCache = false;
+
+ if (data) {
+ cache = (QOpenGL2PEVectorPathCache *) data->data;
+ // Check if scale factor is exceeded and regenerate if so...
+ qreal scaleFactor = cache->iscale / inverseScale;
+ if (scaleFactor < 0.5 || scaleFactor > 2.0) {
+#ifdef QT_OPENGL_CACHE_AS_VBOS
+ glDeleteBuffers(1, &cache->vbo);
+ glDeleteBuffers(1, &cache->ibo);
+#else
+ free(cache->vertices);
+ free(cache->indices);
+#endif
+ updateCache = true;
+ }
+ } else {
+ cache = new QOpenGL2PEVectorPathCache;
+ data = const_cast<QVectorPath &>(path).addCacheData(q, cache, cleanupVectorPath);
+ updateCache = true;
+ }
+
+ // Flatten the path at the current scale factor and fill it into the cache struct.
+ if (updateCache) {
+ QTriangleSet polys = qTriangulate(path, QTransform().scale(1 / inverseScale, 1 / inverseScale), 1, supportsElementIndexUint);
+ cache->vertexCount = polys.vertices.size() / 2;
+ cache->indexCount = polys.indices.size();
+ cache->primitiveType = GL_TRIANGLES;
+ cache->iscale = inverseScale;
+ cache->indexType = polys.indices.type();
+#ifdef QT_OPENGL_CACHE_AS_VBOS
+ funcs.glGenBuffers(1, &cache->vbo);
+ funcs.glGenBuffers(1, &cache->ibo);
+ funcs.glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
+ funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo);
+
+ if (polys.indices.type() == QVertexIndexVector::UnsignedInt)
+ funcs.glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint32) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW);
+ else
+ funcs.glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint16) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW);
+
+ QVarLengthArray<float> vertices(polys.vertices.size());
+ for (int i = 0; i < polys.vertices.size(); ++i)
+ vertices[i] = float(inverseScale * polys.vertices.at(i));
+ funcs.glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(), vertices.data(), GL_STATIC_DRAW);
+#else
+ cache->vertices = (float *) malloc(sizeof(float) * polys.vertices.size());
+ if (polys.indices.type() == QVertexIndexVector::UnsignedInt) {
+ cache->indices = (quint32 *) malloc(sizeof(quint32) * polys.indices.size());
+ memcpy(cache->indices, polys.indices.data(), sizeof(quint32) * polys.indices.size());
+ } else {
+ cache->indices = (quint16 *) malloc(sizeof(quint16) * polys.indices.size());
+ memcpy(cache->indices, polys.indices.data(), sizeof(quint16) * polys.indices.size());
+ }
+ for (int i = 0; i < polys.vertices.size(); ++i)
+ cache->vertices[i] = float(inverseScale * polys.vertices.at(i));
+#endif
+ }
+
+ prepareForDraw(currentBrush.isOpaque());
+#ifdef QT_OPENGL_CACHE_AS_VBOS
+ funcs.glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
+ funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo);
+ uploadData(QT_VERTEX_COORDS_ATTR, 0, cache->vertexCount);
+ setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, 0);
+ if (cache->indexType == QVertexIndexVector::UnsignedInt)
+ funcs.glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, 0);
+ else
+ funcs.glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, 0);
+ funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ funcs.glBindBuffer(GL_ARRAY_BUFFER, 0);
+#else
+ uploadData(QT_VERTEX_COORDS_ATTR, cache->vertices, cache->vertexCount * 2);
+ const GLenum indexValueType = cache->indexType == QVertexIndexVector::UnsignedInt ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
+ const bool useIndexVbo = uploadIndexData(cache->indices, indexValueType, cache->indexCount);
+ funcs.glDrawElements(cache->primitiveType, cache->indexCount, indexValueType, useIndexVbo ? nullptr : cache->indices);
+#endif
+
+ } else {
+ // printf(" - Marking path as cachable...\n");
+ // Tag it for later so that if the same path is drawn twice, it is assumed to be static and thus cachable
+ path.makeCacheable();
+
+ if (device->context()->format().stencilBufferSize() <= 0) {
+ // If there is no stencil buffer, triangulate the path instead.
+
+ QRectF bbox = path.controlPointRect();
+ // If the path doesn't fit within these limits, it is possible that the triangulation will fail.
+ bool withinLimits = (bbox.left() > -0x8000 * inverseScale)
+ && (bbox.right() < 0x8000 * inverseScale)
+ && (bbox.top() > -0x8000 * inverseScale)
+ && (bbox.bottom() < 0x8000 * inverseScale);
+ if (withinLimits) {
+ QTriangleSet polys = qTriangulate(path, QTransform().scale(1 / inverseScale, 1 / inverseScale), 1, supportsElementIndexUint);
+
+ QVarLengthArray<float> vertices(polys.vertices.size());
+ for (int i = 0; i < polys.vertices.size(); ++i)
+ vertices[i] = float(inverseScale * polys.vertices.at(i));
+
+ prepareForDraw(currentBrush.isOpaque());
+ uploadData(QT_VERTEX_COORDS_ATTR, vertices.constData(), vertices.size());
+ const GLenum indexValueType = funcs.hasOpenGLExtension(QOpenGLExtensions::ElementIndexUint) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
+ const bool useIndexVbo = uploadIndexData(polys.indices.data(), indexValueType, polys.indices.size());
+ funcs.glDrawElements(GL_TRIANGLES, polys.indices.size(), indexValueType, useIndexVbo ? nullptr : polys.indices.data());
+ } else {
+ // We can't handle big, concave painter paths with OpenGL without stencil buffer.
+ qWarning("Painter path exceeds +/-32767 pixels.");
+ }
+ return;
+ }
+
+ // The path is too complicated & needs the stencil technique
+ vertexCoordinateArray.clear();
+ vertexCoordinateArray.addPath(path, inverseScale, false);
+
+ fillStencilWithVertexArray(vertexCoordinateArray, path.hasWindingFill());
+
+ funcs.glStencilMask(0xff);
+ funcs.glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
+
+ if (q->state()->clipTestEnabled) {
+ // Pass when high bit is set, replace stencil value with current clip
+ funcs.glStencilFunc(GL_NOTEQUAL, q->state()->currentClip, GL_STENCIL_HIGH_BIT);
+ } else if (path.hasWindingFill()) {
+ // Pass when any bit is set, replace stencil value with 0
+ funcs.glStencilFunc(GL_NOTEQUAL, 0, 0xff);
+ } else {
+ // Pass when high bit is set, replace stencil value with 0
+ funcs.glStencilFunc(GL_NOTEQUAL, 0, GL_STENCIL_HIGH_BIT);
+ }
+ prepareForDraw(currentBrush.isOpaque());
+
+ // Stencil the brush onto the dest buffer
+ composite(vertexCoordinateArray.boundingRect());
+ funcs.glStencilMask(0);
+ updateClipScissorTest();
+ }
+ }
+}
+
+
+void QOpenGL2PaintEngineExPrivate::fillStencilWithVertexArray(const float *data,
+ int count,
+ int *stops,
+ int stopCount,
+ const QOpenGLRect &bounds,
+ StencilFillMode mode)
+{
+ Q_ASSERT(count || stops);
+
+// qDebug("QOpenGL2PaintEngineExPrivate::fillStencilWithVertexArray()");
+ funcs.glStencilMask(0xff); // Enable stencil writes
+
+ if (dirtyStencilRegion.intersects(currentScissorBounds)) {
+ const QRegion clearRegion = dirtyStencilRegion.intersected(currentScissorBounds);
+ funcs.glClearStencil(0); // Clear to zero
+ for (const QRect &rect : clearRegion) {
+#ifndef QT_GL_NO_SCISSOR_TEST
+ setScissor(rect);
+#endif
+ funcs.glClear(GL_STENCIL_BUFFER_BIT);
+ }
+
+ dirtyStencilRegion -= currentScissorBounds;
+
+#ifndef QT_GL_NO_SCISSOR_TEST
+ updateClipScissorTest();
+#endif
+ }
+
+ funcs.glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // Disable color writes
+ useSimpleShader();
+ funcs.glEnable(GL_STENCIL_TEST); // For some reason, this has to happen _after_ the simple shader is use()'d
+
+ if (mode == WindingFillMode) {
+ Q_ASSERT(stops && !count);
+ if (q->state()->clipTestEnabled) {
+ // Flatten clip values higher than current clip, and set high bit to match current clip
+ funcs.glStencilFunc(GL_LEQUAL, GL_STENCIL_HIGH_BIT | q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
+ funcs.glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
+ composite(bounds);
+
+ funcs.glStencilFunc(GL_EQUAL, GL_STENCIL_HIGH_BIT, GL_STENCIL_HIGH_BIT);
+ } else if (!stencilClean) {
+ // Clear stencil buffer within bounding rect
+ funcs.glStencilFunc(GL_ALWAYS, 0, 0xff);
+ funcs.glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO);
+ composite(bounds);
+ }
+
+ // Inc. for front-facing triangle
+ funcs.glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_INCR_WRAP, GL_INCR_WRAP);
+ // Dec. for back-facing "holes"
+ funcs.glStencilOpSeparate(GL_BACK, GL_KEEP, GL_DECR_WRAP, GL_DECR_WRAP);
+ funcs.glStencilMask(~GL_STENCIL_HIGH_BIT);
+ drawVertexArrays(data, stops, stopCount, GL_TRIANGLE_FAN);
+
+ if (q->state()->clipTestEnabled) {
+ // Clear high bit of stencil outside of path
+ funcs.glStencilFunc(GL_EQUAL, q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
+ funcs.glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
+ funcs.glStencilMask(GL_STENCIL_HIGH_BIT);
+ composite(bounds);
+ }
+ } else if (mode == OddEvenFillMode) {
+ funcs.glStencilMask(GL_STENCIL_HIGH_BIT);
+ funcs.glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT); // Simply invert the stencil bit
+ drawVertexArrays(data, stops, stopCount, GL_TRIANGLE_FAN);
+
+ } else { // TriStripStrokeFillMode
+ Q_ASSERT(count && !stops); // tristrips generated directly, so no vertexArray or stops
+ funcs.glStencilMask(GL_STENCIL_HIGH_BIT);
+#if 0
+ funcs.glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT); // Simply invert the stencil bit
+ setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, data);
+ funcs.glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
+#else
+
+ funcs.glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+ if (q->state()->clipTestEnabled) {
+ funcs.glStencilFunc(GL_LEQUAL, q->state()->currentClip | GL_STENCIL_HIGH_BIT,
+ ~GL_STENCIL_HIGH_BIT);
+ } else {
+ funcs.glStencilFunc(GL_ALWAYS, GL_STENCIL_HIGH_BIT, 0xff);
+ }
+
+ uploadData(QT_VERTEX_COORDS_ATTR, data, count * 2);
+ funcs.glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
+#endif
+ }
+
+ // Enable color writes & disable stencil writes
+ funcs.glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+}
+
+/*
+ If the maximum value in the stencil buffer is GL_STENCIL_HIGH_BIT - 1,
+ restore the stencil buffer to a pristine state. The current clip region
+ is set to 1, and the rest to 0.
+*/
+void QOpenGL2PaintEngineExPrivate::resetClipIfNeeded()
+{
+ if (maxClip != (GL_STENCIL_HIGH_BIT - 1))
+ return;
+
+ Q_Q(QOpenGL2PaintEngineEx);
+
+ useSimpleShader();
+ funcs.glEnable(GL_STENCIL_TEST);
+ funcs.glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+
+ QRectF bounds = q->state()->matrix.inverted().mapRect(QRectF(0, 0, width, height));
+ QOpenGLRect rect(bounds.left(), bounds.top(), bounds.right(), bounds.bottom());
+
+ // Set high bit on clip region
+ funcs.glStencilFunc(GL_LEQUAL, q->state()->currentClip, 0xff);
+ funcs.glStencilOp(GL_KEEP, GL_INVERT, GL_INVERT);
+ funcs.glStencilMask(GL_STENCIL_HIGH_BIT);
+ composite(rect);
+
+ // Reset clipping to 1 and everything else to zero
+ funcs.glStencilFunc(GL_NOTEQUAL, 0x01, GL_STENCIL_HIGH_BIT);
+ funcs.glStencilOp(GL_ZERO, GL_REPLACE, GL_REPLACE);
+ funcs.glStencilMask(0xff);
+ composite(rect);
+
+ q->state()->currentClip = 1;
+ q->state()->canRestoreClip = false;
+
+ maxClip = 1;
+
+ funcs.glStencilMask(0x0);
+ funcs.glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+}
+
+bool QOpenGL2PaintEngineExPrivate::prepareForCachedGlyphDraw(const QFontEngineGlyphCache &cache)
+{
+ Q_Q(QOpenGL2PaintEngineEx);
+
+ Q_ASSERT(cache.transform().type() <= QTransform::TxScale);
+
+ QTransform &transform = q->state()->matrix;
+ transform.scale(1.0 / cache.transform().m11(), 1.0 / cache.transform().m22());
+ bool ret = prepareForDraw(false);
+ transform.scale(cache.transform().m11(), cache.transform().m22());
+
+ return ret;
+}
+
+bool QOpenGL2PaintEngineExPrivate::prepareForDraw(bool srcPixelsAreOpaque)
+{
+ if (brushTextureDirty && (mode == TextDrawingMode || mode == BrushDrawingMode))
+ updateBrushTexture();
+
+ if (compositionModeDirty)
+ updateCompositionMode();
+
+ if (matrixDirty)
+ updateMatrix();
+
+ const bool stateHasOpacity = q->state()->opacity < 0.99f;
+ if (q->state()->composition_mode == QPainter::CompositionMode_Source
+ || (q->state()->composition_mode == QPainter::CompositionMode_SourceOver
+ && srcPixelsAreOpaque && !stateHasOpacity))
+ {
+ funcs.glDisable(GL_BLEND);
+ } else {
+ funcs.glEnable(GL_BLEND);
+ }
+
+ QOpenGLEngineShaderManager::OpacityMode opacityMode;
+ if (mode == ImageOpacityArrayDrawingMode) {
+ opacityMode = QOpenGLEngineShaderManager::AttributeOpacity;
+ } else {
+ opacityMode = stateHasOpacity ? QOpenGLEngineShaderManager::UniformOpacity
+ : QOpenGLEngineShaderManager::NoOpacity;
+ if (stateHasOpacity && (mode != ImageDrawingMode && mode != ImageArrayDrawingMode)) {
+ // Using a brush
+ bool brushIsPattern = (currentBrush.style() >= Qt::Dense1Pattern) &&
+ (currentBrush.style() <= Qt::DiagCrossPattern);
+
+ if ((currentBrush.style() == Qt::SolidPattern) || brushIsPattern)
+ opacityMode = QOpenGLEngineShaderManager::NoOpacity; // Global opacity handled by srcPixel shader
+ }
+ }
+ shaderManager->setOpacityMode(opacityMode);
+
+ bool changed = shaderManager->useCorrectShaderProg();
+ // If the shader program needs changing, we change it and mark all uniforms as dirty
+ if (changed) {
+ // The shader program has changed so mark all uniforms as dirty:
+ brushUniformsDirty = true;
+ opacityUniformDirty = true;
+ matrixUniformDirty = true;
+ }
+
+ if (brushUniformsDirty && (mode == TextDrawingMode || mode == BrushDrawingMode))
+ updateBrushUniforms();
+
+ if (opacityMode == QOpenGLEngineShaderManager::UniformOpacity && opacityUniformDirty) {
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::GlobalOpacity), (GLfloat)q->state()->opacity);
+ opacityUniformDirty = false;
+ }
+
+ if (matrixUniformDirty && shaderManager->hasComplexGeometry()) {
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::Matrix),
+ pmvMatrix);
+ matrixUniformDirty = false;
+ }
+
+ return changed;
+}
+
+void QOpenGL2PaintEngineExPrivate::composite(const QOpenGLRect& boundingRect)
+{
+ setCoords(staticVertexCoordinateArray, boundingRect);
+
+ uploadData(QT_VERTEX_COORDS_ATTR, staticVertexCoordinateArray, 8);
+ funcs.glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+}
+
+// Draws the vertex array as a set of <vertexArrayStops.size()> triangle fans.
+void QOpenGL2PaintEngineExPrivate::drawVertexArrays(const float *data, int *stops, int stopCount,
+ GLenum primitive)
+{
+ // Now setup the pointer to the vertex array:
+ uploadData(QT_VERTEX_COORDS_ATTR, data, stops[stopCount-1] * 2);
+
+ int previousStop = 0;
+ for (int i=0; i<stopCount; ++i) {
+ int stop = stops[i];
+
+ funcs.glDrawArrays(primitive, previousStop, stop - previousStop);
+ previousStop = stop;
+ }
+}
+
+/////////////////////////////////// Public Methods //////////////////////////////////////////
+
+QOpenGL2PaintEngineEx::QOpenGL2PaintEngineEx()
+ : QPaintEngineEx(*(new QOpenGL2PaintEngineExPrivate(this)))
+{
+ gccaps &= ~QPaintEngine::RasterOpModes;
+}
+
+QOpenGL2PaintEngineEx::~QOpenGL2PaintEngineEx()
+{
+}
+
+void QOpenGL2PaintEngineEx::fill(const QVectorPath &path, const QBrush &brush)
+{
+ Q_D(QOpenGL2PaintEngineEx);
+
+ if (qbrush_style(brush) == Qt::NoBrush)
+ return;
+ ensureActive();
+ d->setBrush(brush);
+ d->fill(path);
+}
+
+Q_GUI_EXPORT extern bool qt_scaleForTransform(const QTransform &transform, qreal *scale); // qtransform.cpp
+
+
+void QOpenGL2PaintEngineEx::stroke(const QVectorPath &path, const QPen &pen)
+{
+ Q_D(QOpenGL2PaintEngineEx);
+
+ const QBrush &penBrush = qpen_brush(pen);
+ if (qpen_style(pen) == Qt::NoPen || qbrush_style(penBrush) == Qt::NoBrush)
+ return;
+
+ QOpenGL2PaintEngineState *s = state();
+ if (qt_pen_is_cosmetic(pen, state()->renderHints) && !qt_scaleForTransform(s->transform(), nullptr)) {
+ // QTriangulatingStroker class is not meant to support cosmetically sheared strokes.
+ QPaintEngineEx::stroke(path, pen);
+ return;
+ }
+
+ ensureActive();
+ d->setBrush(penBrush);
+ d->stroke(path, pen);
+}
+
+void QOpenGL2PaintEngineExPrivate::stroke(const QVectorPath &path, const QPen &pen)
+{
+ const QOpenGL2PaintEngineState *s = q->state();
+ if (snapToPixelGrid) {
+ snapToPixelGrid = false;
+ matrixDirty = true;
+ }
+
+ const Qt::PenStyle penStyle = qpen_style(pen);
+ const QBrush &penBrush = qpen_brush(pen);
+ const bool opaque = penBrush.isOpaque() && s->opacity > 0.99;
+
+ transferMode(BrushDrawingMode);
+
+ // updateMatrix() is responsible for setting the inverse scale on
+ // the strokers, so we need to call it here and not wait for
+ // prepareForDraw() down below.
+ updateMatrix();
+
+ QRectF clip = q->state()->matrix.inverted().mapRect(q->state()->clipEnabled
+ ? q->state()->rectangleClip
+ : QRectF(0, 0, width, height));
+
+ if (penStyle == Qt::SolidLine) {
+ stroker.process(path, pen, clip, s->renderHints);
+
+ } else { // Some sort of dash
+ dasher.process(path, pen, clip, s->renderHints);
+
+ QVectorPath dashStroke(dasher.points(),
+ dasher.elementCount(),
+ dasher.elementTypes());
+ stroker.process(dashStroke, pen, clip, s->renderHints);
+ }
+
+ if (!stroker.vertexCount())
+ return;
+
+ if (opaque) {
+ prepareForDraw(opaque);
+
+ uploadData(QT_VERTEX_COORDS_ATTR, stroker.vertices(), stroker.vertexCount());
+ funcs.glDrawArrays(GL_TRIANGLE_STRIP, 0, stroker.vertexCount() / 2);
+ } else {
+ qreal width = qpen_widthf(pen) / 2;
+ if (width == 0)
+ width = 0.5;
+ qreal extra = pen.joinStyle() == Qt::MiterJoin
+ ? qMax(pen.miterLimit() * width, width)
+ : width;
+
+ if (qt_pen_is_cosmetic(pen, q->state()->renderHints))
+ extra = extra * inverseScale;
+
+ QRectF bounds = path.controlPointRect().adjusted(-extra, -extra, extra, extra);
+
+ fillStencilWithVertexArray(stroker.vertices(), stroker.vertexCount() / 2,
+ nullptr, 0, bounds, QOpenGL2PaintEngineExPrivate::TriStripStrokeFillMode);
+
+ funcs.glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
+
+ // Pass when any bit is set, replace stencil value with 0
+ funcs.glStencilFunc(GL_NOTEQUAL, 0, GL_STENCIL_HIGH_BIT);
+ prepareForDraw(false);
+
+ // Stencil the brush onto the dest buffer
+ composite(bounds);
+
+ funcs.glStencilMask(0);
+
+ updateClipScissorTest();
+ }
+}
+
+void QOpenGL2PaintEngineEx::penChanged() { }
+void QOpenGL2PaintEngineEx::brushChanged() { }
+void QOpenGL2PaintEngineEx::brushOriginChanged() { }
+
+void QOpenGL2PaintEngineEx::opacityChanged()
+{
+// qDebug("QOpenGL2PaintEngineEx::opacityChanged()");
+ Q_D(QOpenGL2PaintEngineEx);
+ state()->opacityChanged = true;
+
+ Q_ASSERT(d->shaderManager);
+ d->brushUniformsDirty = true;
+ d->opacityUniformDirty = true;
+}
+
+void QOpenGL2PaintEngineEx::compositionModeChanged()
+{
+// qDebug("QOpenGL2PaintEngineEx::compositionModeChanged()");
+ Q_D(QOpenGL2PaintEngineEx);
+ state()->compositionModeChanged = true;
+ d->compositionModeDirty = true;
+}
+
+void QOpenGL2PaintEngineEx::renderHintsChanged()
+{
+ state()->renderHintsChanged = true;
+
+#if !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ Q_D(QOpenGL2PaintEngineEx);
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+ if ((state()->renderHints & QPainter::Antialiasing)
+#if QT_DEPRECATED_SINCE(5, 14)
+ || (state()->renderHints & QPainter::HighQualityAntialiasing)
+#endif
+ )
+ d->funcs.glEnable(GL_MULTISAMPLE);
+ else
+ d->funcs.glDisable(GL_MULTISAMPLE);
+QT_WARNING_POP
+ }
+#endif // !QT_CONFIG(opengles2)
+
+ Q_D(QOpenGL2PaintEngineEx);
+
+ // This is a somewhat sneaky way of conceptually making the next call to
+ // updateTexture() use FoceUpdate for the TextureUpdateMode. We need this
+ // as new render hints may require updating the filter mode.
+ d->lastTextureUsed = GLuint(-1);
+
+ d->brushTextureDirty = true;
+// qDebug("QOpenGL2PaintEngineEx::renderHintsChanged() not implemented!");
+}
+
+void QOpenGL2PaintEngineEx::transformChanged()
+{
+ Q_D(QOpenGL2PaintEngineEx);
+ d->matrixDirty = true;
+ state()->matrixChanged = true;
+}
+
+
+static const QRectF scaleRect(const QRectF &r, qreal sx, qreal sy)
+{
+ return QRectF(r.x() * sx, r.y() * sy, r.width() * sx, r.height() * sy);
+}
+
+void QOpenGL2PaintEngineEx::drawPixmap(const QRectF& dest, const QPixmap & pixmap, const QRectF & src)
+{
+ Q_D(QOpenGL2PaintEngineEx);
+ QOpenGLContext *ctx = d->ctx;
+
+ // Draw pixmaps that are really images as images since drawImage has
+ // better handling of non-default image formats.
+ if (pixmap.paintEngine()->type() == QPaintEngine::Raster && !pixmap.isQBitmap())
+ return drawImage(dest, pixmap.toImage(), src);
+
+ int max_texture_size = ctx->d_func()->maxTextureSize();
+ if (pixmap.width() > max_texture_size || pixmap.height() > max_texture_size) {
+ QPixmap scaled = pixmap.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
+
+ const qreal sx = scaled.width() / qreal(pixmap.width());
+ const qreal sy = scaled.height() / qreal(pixmap.height());
+
+ drawPixmap(dest, scaled, scaleRect(src, sx, sy));
+ return;
+ }
+
+ ensureActive();
+ d->transferMode(ImageDrawingMode);
+
+ GLenum filterMode = state()->renderHints & QPainter::SmoothPixmapTransform ? GL_LINEAR : GL_NEAREST;
+ d->updateTexture(QT_IMAGE_TEXTURE_UNIT, pixmap, GL_CLAMP_TO_EDGE, filterMode);
+
+ bool isBitmap = pixmap.isQBitmap();
+ bool isOpaque = !isBitmap && !pixmap.hasAlpha();
+
+ d->shaderManager->setSrcPixelType(isBitmap ? QOpenGLEngineShaderManager::PatternSrc : QOpenGLEngineShaderManager::ImageSrc);
+
+ QOpenGLRect srcRect(src.left(), src.top(), src.right(), src.bottom());
+ d->drawTexture(dest, srcRect, pixmap.size(), isOpaque, isBitmap);
+}
+
+void QOpenGL2PaintEngineEx::drawImage(const QRectF& dest, const QImage& image, const QRectF& src,
+ Qt::ImageConversionFlags)
+{
+ Q_D(QOpenGL2PaintEngineEx);
+ QOpenGLContext *ctx = d->ctx;
+
+ int max_texture_size = ctx->d_func()->maxTextureSize();
+ if (image.width() > max_texture_size || image.height() > max_texture_size) {
+ QImage scaled = image.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
+
+ const qreal sx = scaled.width() / qreal(image.width());
+ const qreal sy = scaled.height() / qreal(image.height());
+
+ drawImage(dest, scaled, scaleRect(src, sx, sy));
+ return;
+ }
+
+ ensureActive();
+ d->transferMode(ImageDrawingMode);
+
+ QOpenGLTextureUploader::BindOptions bindOption = QOpenGLTextureUploader::PremultipliedAlphaBindOption;
+ // Use specialized bind for formats we have specialized shaders for.
+ switch (image.format()) {
+ case QImage::Format_RGBA8888:
+ case QImage::Format_ARGB32:
+ case QImage::Format_RGBA64:
+ d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::NonPremultipliedImageSrc);
+ bindOption = { };
+ break;
+ case QImage::Format_Alpha8:
+ if (ctx->functions()->hasOpenGLFeature(QOpenGLFunctions::TextureRGFormats)) {
+ d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::AlphaImageSrc);
+ bindOption = QOpenGLTextureUploader::UseRedForAlphaAndLuminanceBindOption;
+ } else
+ d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
+ break;
+ case QImage::Format_Grayscale8:
+ case QImage::Format_Grayscale16:
+ if (ctx->functions()->hasOpenGLFeature(QOpenGLFunctions::TextureRGFormats)) {
+ d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::GrayscaleImageSrc);
+ bindOption = QOpenGLTextureUploader::UseRedForAlphaAndLuminanceBindOption;
+ } else
+ d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
+ break;
+ default:
+ d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
+ break;
+ }
+
+ ImageWithBindOptions imageWithOptions = { image, bindOption };
+ GLenum filterMode = state()->renderHints & QPainter::SmoothPixmapTransform ? GL_LINEAR : GL_NEAREST;
+ d->updateTexture(QT_IMAGE_TEXTURE_UNIT, imageWithOptions, GL_CLAMP_TO_EDGE, filterMode);
+
+ d->drawTexture(dest, src, image.size(), !image.hasAlphaChannel());
+}
+
+void QOpenGL2PaintEngineEx::drawStaticTextItem(QStaticTextItem *textItem)
+{
+ Q_D(QOpenGL2PaintEngineEx);
+
+ ensureActive();
+
+ QPainterState *s = state();
+
+ QFontEngine *fontEngine = textItem->fontEngine();
+ if (shouldDrawCachedGlyphs(fontEngine, s->matrix)) {
+ QFontEngine::GlyphFormat glyphFormat = fontEngine->glyphFormat != QFontEngine::Format_None
+ ? fontEngine->glyphFormat : d->glyphCacheFormat;
+ if (glyphFormat == QFontEngine::Format_A32) {
+ if (d->device->context()->format().alphaBufferSize() > 0 || s->matrix.type() > QTransform::TxTranslate
+ || (s->composition_mode != QPainter::CompositionMode_Source
+ && s->composition_mode != QPainter::CompositionMode_SourceOver))
+ {
+ glyphFormat = QFontEngine::Format_A8;
+ }
+ }
+
+ d->drawCachedGlyphs(glyphFormat, textItem);
+ } else {
+ QPaintEngineEx::drawStaticTextItem(textItem);
+ }
+}
+
+bool QOpenGL2PaintEngineEx::drawTexture(const QRectF &dest, GLuint textureId, const QSize &size, const QRectF &src)
+{
+ Q_D(QOpenGL2PaintEngineEx);
+ if (!d->shaderManager)
+ return false;
+
+ ensureActive();
+ d->transferMode(ImageDrawingMode);
+
+ GLenum filterMode = state()->renderHints & QPainter::SmoothPixmapTransform ? GL_LINEAR : GL_NEAREST;
+ d->updateTexture(QT_IMAGE_TEXTURE_UNIT, textureId, GL_CLAMP_TO_EDGE, filterMode);
+
+ d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
+
+ QOpenGLRect srcRect(src.left(), src.bottom(), src.right(), src.top());
+ d->drawTexture(dest, srcRect, size, false);
+
+ return true;
+}
+
+void QOpenGL2PaintEngineEx::drawTextItem(const QPointF &p, const QTextItem &textItem)
+{
+ Q_D(QOpenGL2PaintEngineEx);
+
+ ensureActive();
+ QOpenGL2PaintEngineState *s = state();
+
+ const QTextItemInt &ti = static_cast<const QTextItemInt &>(textItem);
+
+ QTransform::TransformationType txtype = s->matrix.type();
+
+ QFontEngine::GlyphFormat glyphFormat = ti.fontEngine->glyphFormat != QFontEngine::Format_None
+ ? ti.fontEngine->glyphFormat : d->glyphCacheFormat;
+
+ if (glyphFormat == QFontEngine::Format_A32) {
+ if (d->device->context()->format().alphaBufferSize() > 0 || txtype > QTransform::TxTranslate
+ || (state()->composition_mode != QPainter::CompositionMode_Source
+ && state()->composition_mode != QPainter::CompositionMode_SourceOver))
+ {
+ glyphFormat = QFontEngine::Format_A8;
+ }
+ }
+
+ if (shouldDrawCachedGlyphs(ti.fontEngine, s->matrix)) {
+ QVarLengthArray<QFixedPoint> positions;
+ QVarLengthArray<glyph_t> glyphs;
+ QTransform matrix = QTransform::fromTranslate(p.x(), p.y());
+ ti.fontEngine->getGlyphPositions(ti.glyphs, matrix, ti.flags, glyphs, positions);
+
+ {
+ QStaticTextItem staticTextItem;
+ staticTextItem.setFontEngine(ti.fontEngine);
+ staticTextItem.glyphs = glyphs.data();
+ staticTextItem.numGlyphs = glyphs.size();
+ staticTextItem.glyphPositions = positions.data();
+
+ d->drawCachedGlyphs(glyphFormat, &staticTextItem);
+ }
+ return;
+ }
+
+ QPaintEngineEx::drawTextItem(p, ti);
+}
+
+namespace {
+
+ class QOpenGLStaticTextUserData: public QStaticTextUserData
+ {
+ public:
+ QOpenGLStaticTextUserData()
+ : QStaticTextUserData(OpenGLUserData), cacheSize(0, 0), cacheSerialNumber(0)
+ {
+ }
+
+ ~QOpenGLStaticTextUserData()
+ {
+ }
+
+ QSize cacheSize;
+ QOpenGL2PEXVertexArray vertexCoordinateArray;
+ QOpenGL2PEXVertexArray textureCoordinateArray;
+ QFontEngine::GlyphFormat glyphFormat;
+ int cacheSerialNumber;
+ };
+
+}
+
+
+// #define QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO
+
+bool QOpenGL2PaintEngineEx::shouldDrawCachedGlyphs(QFontEngine *fontEngine, const QTransform &t) const
+{
+ // The paint engine does not support projected cached glyph drawing
+ if (t.type() == QTransform::TxProject)
+ return false;
+
+ // The font engine might not support filling the glyph cache
+ // with the given transform applied, in which case we need to
+ // fall back to the QPainterPath code-path.
+ if (!fontEngine->supportsTransformation(t)) {
+ // Except that drawing paths is slow, so for scales between
+ // 0.5 and 2.0 we leave the glyph cache untransformed and deal
+ // with the transform ourselves when painting, resulting in
+ // drawing 1x cached glyphs with a smooth-scale.
+ float det = t.determinant();
+ if (det >= 0.25f && det <= 4.f) {
+ // Assuming the baseclass still agrees
+ return QPaintEngineEx::shouldDrawCachedGlyphs(fontEngine, t);
+ }
+
+ return false; // Fall back to path-drawing
+ }
+
+ return QPaintEngineEx::shouldDrawCachedGlyphs(fontEngine, t);
+}
+
+void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngine::GlyphFormat glyphFormat,
+ QStaticTextItem *staticTextItem)
+{
+ Q_Q(QOpenGL2PaintEngineEx);
+
+ QOpenGL2PaintEngineState *s = q->state();
+
+ void *cacheKey = ctx; // use context, not the shareGroup() -> the GL glyph cache uses FBOs which may not be shareable
+ bool recreateVertexArrays = false;
+
+ QTransform glyphCacheTransform;
+ QFontEngine *fe = staticTextItem->fontEngine();
+ if (fe->supportsTransformation(s->matrix)) {
+ // The font-engine supports rendering glyphs with the current transform, so we
+ // build a glyph-cache with the scale pre-applied, so that the cache contains
+ // glyphs with the appropriate resolution in the case of retina displays.
+ glyphCacheTransform = s->matrix.type() < QTransform::TxRotate ?
+ QTransform::fromScale(qAbs(s->matrix.m11()), qAbs(s->matrix.m22())) :
+ QTransform::fromScale(
+ QVector2D(s->matrix.m11(), s->matrix.m12()).length(),
+ QVector2D(s->matrix.m21(), s->matrix.m22()).length());
+ }
+
+ QOpenGLTextureGlyphCache *cache =
+ (QOpenGLTextureGlyphCache *) fe->glyphCache(cacheKey, glyphFormat, glyphCacheTransform);
+ if (!cache || cache->glyphFormat() != glyphFormat || cache->contextGroup() == nullptr) {
+ cache = new QOpenGLTextureGlyphCache(glyphFormat, glyphCacheTransform);
+ fe->setGlyphCache(cacheKey, cache);
+ recreateVertexArrays = true;
+ }
+
+ if (staticTextItem->userDataNeedsUpdate) {
+ recreateVertexArrays = true;
+ } else if (staticTextItem->userData() == nullptr) {
+ recreateVertexArrays = true;
+ } else if (staticTextItem->userData()->type != QStaticTextUserData::OpenGLUserData) {
+ recreateVertexArrays = true;
+ } else {
+ QOpenGLStaticTextUserData *userData = static_cast<QOpenGLStaticTextUserData *>(staticTextItem->userData());
+ if (userData->glyphFormat != glyphFormat) {
+ recreateVertexArrays = true;
+ } else if (userData->cacheSerialNumber != cache->serialNumber()) {
+ recreateVertexArrays = true;
+ }
+ }
+
+ // We only need to update the cache with new glyphs if we are actually going to recreate the vertex arrays.
+ // If the cache size has changed, we do need to regenerate the vertices, but we don't need to repopulate the
+ // cache so this text is performed before we test if the cache size has changed.
+ if (recreateVertexArrays) {
+ cache->setPaintEnginePrivate(this);
+ if (!cache->populate(fe, staticTextItem->numGlyphs,
+ staticTextItem->glyphs, staticTextItem->glyphPositions)) {
+ // No space for glyphs in cache. We need to reset it and try again.
+ cache->clear();
+ cache->populate(fe, staticTextItem->numGlyphs,
+ staticTextItem->glyphs, staticTextItem->glyphPositions);
+ }
+
+ if (cache->hasPendingGlyphs()) {
+ // Filling in the glyphs binds and sets parameters, so we need to
+ // ensure that the glyph cache doesn't mess with whatever unit
+ // is currently active. Note that the glyph cache internally
+ // uses the image texture unit for blitting to the cache, while
+ // we switch between image and mask units when drawing.
+ static const GLenum glypchCacheTextureUnit = QT_IMAGE_TEXTURE_UNIT;
+ activateTextureUnit(glypchCacheTextureUnit);
+
+ cache->fillInPendingGlyphs();
+
+ // We assume the cache can be trusted on which texture was bound
+ lastTextureUsed = cache->texture();
+
+ // But since the brush and image texture units are possibly shared
+ // we may have to re-bind brush textures after filling in the cache.
+ brushTextureDirty = (QT_BRUSH_TEXTURE_UNIT == glypchCacheTextureUnit);
+ }
+ cache->setPaintEnginePrivate(nullptr);
+ }
+
+ if (cache->width() == 0 || cache->height() == 0)
+ return;
+
+ if (glyphFormat == QFontEngine::Format_ARGB)
+ transferMode(ImageArrayDrawingMode);
+ else
+ transferMode(TextDrawingMode);
+
+ int margin = fe->glyphMargin(glyphFormat);
+
+ GLfloat dx = 1.0 / cache->width();
+ GLfloat dy = 1.0 / cache->height();
+
+ // Use global arrays by default
+ QOpenGL2PEXVertexArray *vertexCoordinates = &vertexCoordinateArray;
+ QOpenGL2PEXVertexArray *textureCoordinates = &textureCoordinateArray;
+
+ if (staticTextItem->useBackendOptimizations) {
+ QOpenGLStaticTextUserData *userData = nullptr;
+
+ if (staticTextItem->userData() == nullptr
+ || staticTextItem->userData()->type != QStaticTextUserData::OpenGLUserData) {
+
+ userData = new QOpenGLStaticTextUserData();
+ staticTextItem->setUserData(userData);
+
+ } else {
+ userData = static_cast<QOpenGLStaticTextUserData*>(staticTextItem->userData());
+ }
+
+ userData->glyphFormat = glyphFormat;
+ userData->cacheSerialNumber = cache->serialNumber();
+
+ // Use cache if backend optimizations is turned on
+ vertexCoordinates = &userData->vertexCoordinateArray;
+ textureCoordinates = &userData->textureCoordinateArray;
+
+ QSize size(cache->width(), cache->height());
+ if (userData->cacheSize != size) {
+ recreateVertexArrays = true;
+ userData->cacheSize = size;
+ }
+ }
+
+ if (recreateVertexArrays) {
+ vertexCoordinates->clear();
+ textureCoordinates->clear();
+
+ bool supportsSubPixelPositions = fe->supportsSubPixelPositions();
+ for (int i=0; i<staticTextItem->numGlyphs; ++i) {
+ QFixed subPixelPosition;
+ if (supportsSubPixelPositions)
+ subPixelPosition = fe->subPixelPositionForX(staticTextItem->glyphPositions[i].x);
+
+ QTextureGlyphCache::GlyphAndSubPixelPosition glyph(staticTextItem->glyphs[i], subPixelPosition);
+
+ const QTextureGlyphCache::Coord &c = cache->coords[glyph];
+ if (c.isNull())
+ continue;
+
+ int x = qFloor(staticTextItem->glyphPositions[i].x.toReal() * cache->transform().m11()) + c.baseLineX - margin;
+ int y = qRound(staticTextItem->glyphPositions[i].y.toReal() * cache->transform().m22()) - c.baseLineY - margin;
+
+ vertexCoordinates->addQuad(QRectF(x, y, c.w, c.h));
+ textureCoordinates->addQuad(QRectF(c.x*dx, c.y*dy, c.w * dx, c.h * dy));
+ }
+
+ staticTextItem->userDataNeedsUpdate = false;
+ }
+
+ int numGlyphs = vertexCoordinates->vertexCount() / 4;
+ if (numGlyphs == 0)
+ return;
+
+ if (elementIndices.size() < numGlyphs*6) {
+ Q_ASSERT(elementIndices.size() % 6 == 0);
+ int j = elementIndices.size() / 6 * 4;
+ while (j < numGlyphs*4) {
+ elementIndices.append(j + 0);
+ elementIndices.append(j + 0);
+ elementIndices.append(j + 1);
+ elementIndices.append(j + 2);
+ elementIndices.append(j + 3);
+ elementIndices.append(j + 3);
+
+ j += 4;
+ }
+
+#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
+ if (elementIndicesVBOId == 0)
+ funcs.glGenBuffers(1, &elementIndicesVBOId);
+
+ funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementIndicesVBOId);
+ funcs.glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementIndices.size() * sizeof(GLushort),
+ elementIndices.constData(), GL_STATIC_DRAW);
+#endif
+ } else {
+#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
+ funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementIndicesVBOId);
+#endif
+ }
+
+ if (glyphFormat != QFontEngine::Format_ARGB || recreateVertexArrays) {
+ uploadData(QT_VERTEX_COORDS_ATTR, (GLfloat*)vertexCoordinates->data(), vertexCoordinates->vertexCount() * 2);
+ uploadData(QT_TEXTURE_COORDS_ATTR, (GLfloat*)textureCoordinates->data(), textureCoordinates->vertexCount() * 2);
+ }
+
+ if (!snapToPixelGrid) {
+ snapToPixelGrid = true;
+ matrixDirty = true;
+ }
+
+ QBrush pensBrush = q->state()->pen.brush();
+ setBrush(pensBrush);
+
+ if (glyphFormat == QFontEngine::Format_A32) {
+
+ // Subpixel antialiasing without gamma correction
+
+ QPainter::CompositionMode compMode = q->state()->composition_mode;
+ Q_ASSERT(compMode == QPainter::CompositionMode_Source
+ || compMode == QPainter::CompositionMode_SourceOver);
+
+ shaderManager->setMaskType(QOpenGLEngineShaderManager::SubPixelMaskPass1);
+
+ if (pensBrush.style() == Qt::SolidPattern) {
+ // Solid patterns can get away with only one pass.
+ QColor c = pensBrush.color();
+ qreal oldOpacity = q->state()->opacity;
+ if (compMode == QPainter::CompositionMode_Source) {
+ c = qt_premultiplyColor(c, q->state()->opacity);
+ q->state()->opacity = 1;
+ opacityUniformDirty = true;
+ }
+
+ compositionModeDirty = false; // I can handle this myself, thank you very much
+ prepareForCachedGlyphDraw(*cache);
+
+ // prepareForCachedGlyphDraw() have set the opacity on the current shader, so the opacity state can now be reset.
+ if (compMode == QPainter::CompositionMode_Source) {
+ q->state()->opacity = oldOpacity;
+ opacityUniformDirty = true;
+ }
+
+ funcs.glEnable(GL_BLEND);
+ funcs.glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_SRC_COLOR);
+ funcs.glBlendColor(c.redF(), c.greenF(), c.blueF(), c.alphaF());
+ } else {
+ // Other brush styles need two passes.
+
+ qreal oldOpacity = q->state()->opacity;
+ if (compMode == QPainter::CompositionMode_Source) {
+ q->state()->opacity = 1;
+ opacityUniformDirty = true;
+ pensBrush = Qt::white;
+ setBrush(pensBrush);
+ }
+
+ compositionModeDirty = false; // I can handle this myself, thank you very much
+ prepareForCachedGlyphDraw(*cache);
+ funcs.glEnable(GL_BLEND);
+ funcs.glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
+
+ updateTexture(QT_MASK_TEXTURE_UNIT, cache->texture(), GL_REPEAT, GL_NEAREST, ForceUpdate);
+
+#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
+ funcs.glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, 0);
+#else
+ const bool useIndexVbo = uploadIndexData(elementIndices.data(), GL_UNSIGNED_SHORT, 6 * numGlyphs);
+ funcs.glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, useIndexVbo ? nullptr : elementIndices.data());
+#endif
+
+ shaderManager->setMaskType(QOpenGLEngineShaderManager::SubPixelMaskPass2);
+
+ if (compMode == QPainter::CompositionMode_Source) {
+ q->state()->opacity = oldOpacity;
+ opacityUniformDirty = true;
+ pensBrush = q->state()->pen.brush();
+ setBrush(pensBrush);
+ }
+
+ compositionModeDirty = false;
+ prepareForCachedGlyphDraw(*cache);
+ funcs.glEnable(GL_BLEND);
+ funcs.glBlendFunc(GL_ONE, GL_ONE);
+ }
+ compositionModeDirty = true;
+ } else if (glyphFormat == QFontEngine::Format_ARGB) {
+ currentBrush = noBrush;
+ shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
+ if (prepareForCachedGlyphDraw(*cache))
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::ImageTexture), QT_IMAGE_TEXTURE_UNIT);
+ } else {
+ // Grayscale/mono glyphs
+
+ shaderManager->setMaskType(QOpenGLEngineShaderManager::PixelMask);
+ prepareForCachedGlyphDraw(*cache);
+ }
+
+ GLenum textureUnit = QT_MASK_TEXTURE_UNIT;
+ if (glyphFormat == QFontEngine::Format_ARGB)
+ textureUnit = QT_IMAGE_TEXTURE_UNIT;
+
+ QOpenGLTextureGlyphCache::FilterMode filterMode = (s->matrix.type() > QTransform::TxTranslate) ?
+ QOpenGLTextureGlyphCache::Linear : QOpenGLTextureGlyphCache::Nearest;
+
+ GLenum glFilterMode = filterMode == QOpenGLTextureGlyphCache::Linear ? GL_LINEAR : GL_NEAREST;
+
+ TextureUpdateMode updateMode = UpdateIfNeeded;
+ if (cache->filterMode() != filterMode) {
+ updateMode = ForceUpdate;
+ cache->setFilterMode(filterMode);
+ }
+
+ updateTexture(textureUnit, cache->texture(), GL_REPEAT, glFilterMode, updateMode);
+
+#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
+ funcs.glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, 0);
+ funcs.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+#else
+ const bool useIndexVbo = uploadIndexData(elementIndices.data(), GL_UNSIGNED_SHORT, 6 * numGlyphs);
+ funcs.glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, useIndexVbo ? nullptr : elementIndices.data());
+#endif
+}
+
+void QOpenGL2PaintEngineEx::drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap,
+ QPainter::PixmapFragmentHints hints)
+{
+ Q_D(QOpenGL2PaintEngineEx);
+ // Use fallback for extended composition modes.
+ if (state()->composition_mode > QPainter::CompositionMode_Plus) {
+ QPaintEngineEx::drawPixmapFragments(fragments, fragmentCount, pixmap, hints);
+ return;
+ }
+
+ ensureActive();
+ int max_texture_size = d->ctx->d_func()->maxTextureSize();
+ if (pixmap.width() > max_texture_size || pixmap.height() > max_texture_size) {
+ QPixmap scaled = pixmap.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
+ d->drawPixmapFragments(fragments, fragmentCount, scaled, hints);
+ } else {
+ d->drawPixmapFragments(fragments, fragmentCount, pixmap, hints);
+ }
+}
+
+
+void QOpenGL2PaintEngineExPrivate::drawPixmapFragments(const QPainter::PixmapFragment *fragments,
+ int fragmentCount, const QPixmap &pixmap,
+ QPainter::PixmapFragmentHints hints)
+{
+ GLfloat dx = 1.0f / pixmap.size().width();
+ GLfloat dy = 1.0f / pixmap.size().height();
+
+ vertexCoordinateArray.clear();
+ textureCoordinateArray.clear();
+ opacityArray.reset();
+
+ if (snapToPixelGrid) {
+ snapToPixelGrid = false;
+ matrixDirty = true;
+ }
+
+ bool allOpaque = true;
+
+ for (int i = 0; i < fragmentCount; ++i) {
+ qreal s = 0;
+ qreal c = 1;
+ if (fragments[i].rotation != 0) {
+ s = qFastSin(qDegreesToRadians(fragments[i].rotation));
+ c = qFastCos(qDegreesToRadians(fragments[i].rotation));
+ }
+
+ qreal right = 0.5 * fragments[i].scaleX * fragments[i].width;
+ qreal bottom = 0.5 * fragments[i].scaleY * fragments[i].height;
+ QOpenGLPoint bottomRight(right * c - bottom * s, right * s + bottom * c);
+ QOpenGLPoint bottomLeft(-right * c - bottom * s, -right * s + bottom * c);
+
+ vertexCoordinateArray.addVertex(bottomRight.x + fragments[i].x, bottomRight.y + fragments[i].y);
+ vertexCoordinateArray.addVertex(-bottomLeft.x + fragments[i].x, -bottomLeft.y + fragments[i].y);
+ vertexCoordinateArray.addVertex(-bottomRight.x + fragments[i].x, -bottomRight.y + fragments[i].y);
+ vertexCoordinateArray.addVertex(-bottomRight.x + fragments[i].x, -bottomRight.y + fragments[i].y);
+ vertexCoordinateArray.addVertex(bottomLeft.x + fragments[i].x, bottomLeft.y + fragments[i].y);
+ vertexCoordinateArray.addVertex(bottomRight.x + fragments[i].x, bottomRight.y + fragments[i].y);
+
+ QOpenGLRect src(fragments[i].sourceLeft * dx, fragments[i].sourceTop * dy,
+ (fragments[i].sourceLeft + fragments[i].width) * dx,
+ (fragments[i].sourceTop + fragments[i].height) * dy);
+
+ textureCoordinateArray.addVertex(src.right, src.bottom);
+ textureCoordinateArray.addVertex(src.right, src.top);
+ textureCoordinateArray.addVertex(src.left, src.top);
+ textureCoordinateArray.addVertex(src.left, src.top);
+ textureCoordinateArray.addVertex(src.left, src.bottom);
+ textureCoordinateArray.addVertex(src.right, src.bottom);
+
+ qreal opacity = fragments[i].opacity * q->state()->opacity;
+ opacityArray << opacity << opacity << opacity << opacity << opacity << opacity;
+ allOpaque &= (opacity >= 0.99f);
+ }
+
+ transferMode(ImageOpacityArrayDrawingMode);
+
+ GLenum filterMode = q->state()->renderHints & QPainter::SmoothPixmapTransform ? GL_LINEAR : GL_NEAREST;
+ updateTexture(QT_IMAGE_TEXTURE_UNIT, pixmap, GL_CLAMP_TO_EDGE, filterMode);
+
+ bool isBitmap = pixmap.isQBitmap();
+ bool isOpaque = !isBitmap && (!pixmap.hasAlpha() || (hints & QPainter::OpaqueHint)) && allOpaque;
+
+ // Setup for texture drawing
+ currentBrush = noBrush;
+ shaderManager->setSrcPixelType(isBitmap ? QOpenGLEngineShaderManager::PatternSrc
+ : QOpenGLEngineShaderManager::ImageSrc);
+ if (prepareForDraw(isOpaque))
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::ImageTexture), QT_IMAGE_TEXTURE_UNIT);
+
+ if (isBitmap) {
+ QColor col = qt_premultiplyColor(q->state()->pen.color(), (GLfloat)q->state()->opacity);
+ shaderManager->currentProgram()->setUniformValue(location(QOpenGLEngineShaderManager::PatternColor), col);
+ }
+
+ funcs.glDrawArrays(GL_TRIANGLES, 0, 6 * fragmentCount);
+}
+
+bool QOpenGL2PaintEngineEx::begin(QPaintDevice *pdev)
+{
+ Q_D(QOpenGL2PaintEngineEx);
+
+ Q_ASSERT(pdev->devType() == QInternal::OpenGL);
+ d->device = static_cast<QOpenGLPaintDevice*>(pdev);
+
+ if (!d->device)
+ return false;
+
+ d->device->ensureActiveTarget();
+
+ if (d->device->context() != QOpenGLContext::currentContext() || !d->device->context()) {
+ qWarning("QPainter::begin(): QOpenGLPaintDevice's context needs to be current");
+ return false;
+ }
+
+ if (d->ctx != QOpenGLContext::currentContext()
+ || (d->ctx && QOpenGLContext::currentContext() && d->ctx->format() != QOpenGLContext::currentContext()->format())) {
+ d->vertexBuffer.destroy();
+ d->texCoordBuffer.destroy();
+ d->opacityBuffer.destroy();
+ d->indexBuffer.destroy();
+ d->vao.destroy();
+ }
+
+ d->ctx = QOpenGLContext::currentContext();
+ d->ctx->d_func()->active_engine = this;
+
+ QOpenGLPaintDevicePrivate::get(d->device)->beginPaint();
+
+ d->funcs.initializeOpenGLFunctions();
+
+ // Generate a new Vertex Array Object if we don't have one already. We can
+ // only hit the VAO-based path when using a core profile context. This is
+ // because while non-core contexts can support VAOs via extensions, legacy
+ // components like the QtOpenGL module do not know about VAOs. There are
+ // still tests for QGL-QOpenGL paint engine interoperability, so keep the
+ // status quo for now, and avoid introducing a VAO in non-core contexts.
+ const bool needsVAO = d->ctx->format().profile() == QSurfaceFormat::CoreProfile
+ && d->ctx->format().version() >= qMakePair(3, 2);
+ if (needsVAO && !d->vao.isCreated()) {
+ bool created = d->vao.create();
+
+ // If we managed to create it then we have a profile that supports VAOs
+ if (created) {
+ d->vao.bind();
+
+ // Generate a new Vertex Buffer Object if we don't have one already
+ if (!d->vertexBuffer.isCreated()) {
+ d->vertexBuffer.create();
+ // Set its usage to StreamDraw, we will use this buffer only a few times before refilling it
+ d->vertexBuffer.setUsagePattern(QOpenGLBuffer::StreamDraw);
+ }
+ if (!d->texCoordBuffer.isCreated()) {
+ d->texCoordBuffer.create();
+ d->texCoordBuffer.setUsagePattern(QOpenGLBuffer::StreamDraw);
+ }
+ if (!d->opacityBuffer.isCreated()) {
+ d->opacityBuffer.create();
+ d->opacityBuffer.setUsagePattern(QOpenGLBuffer::StreamDraw);
+ }
+ if (!d->indexBuffer.isCreated()) {
+ d->indexBuffer.create();
+ d->indexBuffer.setUsagePattern(QOpenGLBuffer::StreamDraw);
+ }
+ }
+ }
+
+ for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i)
+ d->vertexAttributeArraysEnabledState[i] = false;
+
+ const QSize sz = d->device->size();
+ d->width = sz.width();
+ d->height = sz.height();
+ d->mode = BrushDrawingMode;
+ d->brushTextureDirty = true;
+ d->brushUniformsDirty = true;
+ d->matrixUniformDirty = true;
+ d->matrixDirty = true;
+ d->compositionModeDirty = true;
+ d->opacityUniformDirty = true;
+ d->needsSync = true;
+ d->useSystemClip = !systemClip().isEmpty();
+ d->currentBrush = QBrush();
+
+ d->dirtyStencilRegion = QRect(0, 0, d->width, d->height);
+ d->stencilClean = true;
+
+ d->shaderManager = new QOpenGLEngineShaderManager(d->ctx);
+
+ d->funcs.glDisable(GL_STENCIL_TEST);
+ d->funcs.glDisable(GL_DEPTH_TEST);
+ d->funcs.glDisable(GL_SCISSOR_TEST);
+
+ d->glyphCacheFormat = QFontEngine::Format_A8;
+
+#if !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ d->funcs.glDisable(GL_MULTISAMPLE);
+ d->glyphCacheFormat = QFontEngine::Format_A32;
+ d->multisamplingAlwaysEnabled = false;
+ } else
+#endif // !QT_CONFIG(opengles2)
+ {
+ // OpenGL ES can't switch MSAA off, so if the gl paint device is
+ // multisampled, it's always multisampled.
+ d->multisamplingAlwaysEnabled = d->device->context()->format().samples() > 1;
+ }
+
+ return true;
+}
+
+bool QOpenGL2PaintEngineEx::end()
+{
+ Q_D(QOpenGL2PaintEngineEx);
+
+ QOpenGLPaintDevicePrivate::get(d->device)->endPaint();
+
+ QOpenGLContext *ctx = d->ctx;
+ d->funcs.glUseProgram(0);
+ d->transferMode(BrushDrawingMode);
+
+ ctx->d_func()->active_engine = nullptr;
+
+ d->resetGLState();
+
+ delete d->shaderManager;
+ d->shaderManager = nullptr;
+ d->currentBrush = QBrush();
+
+#ifdef QT_OPENGL_CACHE_AS_VBOS
+ if (!d->unusedVBOSToClean.isEmpty()) {
+ glDeleteBuffers(d->unusedVBOSToClean.size(), d->unusedVBOSToClean.constData());
+ d->unusedVBOSToClean.clear();
+ }
+ if (!d->unusedIBOSToClean.isEmpty()) {
+ glDeleteBuffers(d->unusedIBOSToClean.size(), d->unusedIBOSToClean.constData());
+ d->unusedIBOSToClean.clear();
+ }
+#endif
+
+ return false;
+}
+
+void QOpenGL2PaintEngineEx::ensureActive()
+{
+ Q_D(QOpenGL2PaintEngineEx);
+ QOpenGLContext *ctx = d->ctx;
+
+ if (d->vao.isCreated())
+ d->vao.bind();
+
+ if (isActive() && ctx->d_func()->active_engine != this) {
+ ctx->d_func()->active_engine = this;
+ d->needsSync = true;
+ }
+
+ if (d->needsSync) {
+ d->device->ensureActiveTarget();
+
+ d->transferMode(BrushDrawingMode);
+ d->funcs.glViewport(0, 0, d->width, d->height);
+ d->needsSync = false;
+ d->shaderManager->setDirty();
+ d->syncGlState();
+ for (int i = 0; i < 3; ++i)
+ d->vertexAttribPointers[i] = (GLfloat*)-1; // Assume the pointers are clobbered
+ setState(state());
+ }
+}
+
+void QOpenGL2PaintEngineExPrivate::updateClipScissorTest()
+{
+ Q_Q(QOpenGL2PaintEngineEx);
+ if (q->state()->clipTestEnabled) {
+ funcs.glEnable(GL_STENCIL_TEST);
+ funcs.glStencilFunc(GL_LEQUAL, q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
+ } else {
+ funcs.glDisable(GL_STENCIL_TEST);
+ funcs.glStencilFunc(GL_ALWAYS, 0, 0xff);
+ }
+
+#ifdef QT_GL_NO_SCISSOR_TEST
+ currentScissorBounds = QRect(0, 0, width, height);
+#else
+ QRect bounds = q->state()->rectangleClip;
+ if (!q->state()->clipEnabled) {
+ if (useSystemClip)
+ bounds = systemClip.boundingRect();
+ else
+ bounds = QRect(0, 0, width, height);
+ } else {
+ if (useSystemClip)
+ bounds = bounds.intersected(systemClip.boundingRect());
+ else
+ bounds = bounds.intersected(QRect(0, 0, width, height));
+ }
+
+ currentScissorBounds = bounds;
+
+ if (bounds == QRect(0, 0, width, height)) {
+ funcs.glDisable(GL_SCISSOR_TEST);
+ } else {
+ funcs.glEnable(GL_SCISSOR_TEST);
+ setScissor(bounds);
+ }
+#endif
+}
+
+void QOpenGL2PaintEngineExPrivate::setScissor(const QRect &rect)
+{
+ const int left = rect.left();
+ const int width = rect.width();
+ int bottom = height - (rect.top() + rect.height());
+ if (device->paintFlipped()) {
+ bottom = rect.top();
+ }
+ const int height = rect.height();
+
+ funcs.glScissor(left, bottom, width, height);
+}
+
+void QOpenGL2PaintEngineEx::clipEnabledChanged()
+{
+ Q_D(QOpenGL2PaintEngineEx);
+
+ state()->clipChanged = true;
+
+ if (painter()->hasClipping())
+ d->regenerateClip();
+ else
+ d->systemStateChanged();
+}
+
+void QOpenGL2PaintEngineExPrivate::clearClip(uint value)
+{
+ dirtyStencilRegion -= currentScissorBounds;
+
+ funcs.glStencilMask(0xff);
+ funcs.glClearStencil(value);
+ funcs.glClear(GL_STENCIL_BUFFER_BIT);
+ funcs.glStencilMask(0x0);
+
+ q->state()->needsClipBufferClear = false;
+}
+
+void QOpenGL2PaintEngineExPrivate::writeClip(const QVectorPath &path, uint value)
+{
+ transferMode(BrushDrawingMode);
+
+ if (snapToPixelGrid) {
+ snapToPixelGrid = false;
+ matrixDirty = true;
+ }
+
+ if (matrixDirty)
+ updateMatrix();
+
+ stencilClean = false;
+
+ const bool singlePass = !path.hasWindingFill()
+ && (((q->state()->currentClip == maxClip - 1) && q->state()->clipTestEnabled)
+ || q->state()->needsClipBufferClear);
+ const uint referenceClipValue = q->state()->needsClipBufferClear ? 1 : q->state()->currentClip;
+
+ if (q->state()->needsClipBufferClear)
+ clearClip(1);
+
+ if (path.isEmpty()) {
+ funcs.glEnable(GL_STENCIL_TEST);
+ funcs.glStencilFunc(GL_LEQUAL, value, ~GL_STENCIL_HIGH_BIT);
+ return;
+ }
+
+ if (q->state()->clipTestEnabled)
+ funcs.glStencilFunc(GL_LEQUAL, q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
+ else
+ funcs.glStencilFunc(GL_ALWAYS, 0, 0xff);
+
+ vertexCoordinateArray.clear();
+ vertexCoordinateArray.addPath(path, inverseScale, false);
+
+ if (!singlePass)
+ fillStencilWithVertexArray(vertexCoordinateArray, path.hasWindingFill());
+
+ funcs.glColorMask(false, false, false, false);
+ funcs.glEnable(GL_STENCIL_TEST);
+ useSimpleShader();
+
+ if (singlePass) {
+ // Under these conditions we can set the new stencil value in a single
+ // pass, by using the current value and the "new value" as the toggles
+
+ funcs.glStencilFunc(GL_LEQUAL, referenceClipValue, ~GL_STENCIL_HIGH_BIT);
+ funcs.glStencilOp(GL_KEEP, GL_INVERT, GL_INVERT);
+ funcs.glStencilMask(value ^ referenceClipValue);
+
+ drawVertexArrays(vertexCoordinateArray, GL_TRIANGLE_FAN);
+ } else {
+ funcs.glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
+ funcs.glStencilMask(0xff);
+
+ if (!q->state()->clipTestEnabled && path.hasWindingFill()) {
+ // Pass when any clip bit is set, set high bit
+ funcs.glStencilFunc(GL_NOTEQUAL, GL_STENCIL_HIGH_BIT, ~GL_STENCIL_HIGH_BIT);
+ composite(vertexCoordinateArray.boundingRect());
+ }
+
+ // Pass when high bit is set, replace stencil value with new clip value
+ funcs.glStencilFunc(GL_NOTEQUAL, value, GL_STENCIL_HIGH_BIT);
+
+ composite(vertexCoordinateArray.boundingRect());
+ }
+
+ funcs.glStencilFunc(GL_LEQUAL, value, ~GL_STENCIL_HIGH_BIT);
+ funcs.glStencilMask(0);
+
+ funcs.glColorMask(true, true, true, true);
+}
+
+void QOpenGL2PaintEngineEx::clip(const QVectorPath &path, Qt::ClipOperation op)
+{
+// qDebug("QOpenGL2PaintEngineEx::clip()");
+ Q_D(QOpenGL2PaintEngineEx);
+
+ state()->clipChanged = true;
+
+ ensureActive();
+
+ if (op == Qt::ReplaceClip) {
+ op = Qt::IntersectClip;
+ if (d->hasClipOperations()) {
+ d->systemStateChanged();
+ state()->canRestoreClip = false;
+ }
+ }
+
+#ifndef QT_GL_NO_SCISSOR_TEST
+ if (!path.isEmpty() && op == Qt::IntersectClip && (path.shape() == QVectorPath::RectangleHint)) {
+ const QPointF* const points = reinterpret_cast<const QPointF*>(path.points());
+ QRectF rect(points[0], points[2]);
+
+ if (state()->matrix.type() <= QTransform::TxScale
+ || (state()->matrix.type() == QTransform::TxRotate
+ && qFuzzyIsNull(state()->matrix.m11())
+ && qFuzzyIsNull(state()->matrix.m22())))
+ {
+ state()->rectangleClip = state()->rectangleClip.intersected(state()->matrix.mapRect(rect).toRect());
+ d->updateClipScissorTest();
+ return;
+ }
+ }
+#endif
+
+ const QRect pathRect = state()->matrix.mapRect(path.controlPointRect()).toAlignedRect();
+
+ switch (op) {
+ case Qt::NoClip:
+ if (d->useSystemClip) {
+ state()->clipTestEnabled = true;
+ state()->currentClip = 1;
+ } else {
+ state()->clipTestEnabled = false;
+ }
+ state()->rectangleClip = QRect(0, 0, d->width, d->height);
+ state()->canRestoreClip = false;
+ d->updateClipScissorTest();
+ break;
+ case Qt::IntersectClip:
+ state()->rectangleClip = state()->rectangleClip.intersected(pathRect);
+ d->updateClipScissorTest();
+ d->resetClipIfNeeded();
+ ++d->maxClip;
+ d->writeClip(path, d->maxClip);
+ state()->currentClip = d->maxClip;
+ state()->clipTestEnabled = true;
+ break;
+ default:
+ break;
+ }
+}
+
+void QOpenGL2PaintEngineExPrivate::regenerateClip()
+{
+ systemStateChanged();
+ replayClipOperations();
+}
+
+void QOpenGL2PaintEngineExPrivate::systemStateChanged()
+{
+ Q_Q(QOpenGL2PaintEngineEx);
+
+ q->state()->clipChanged = true;
+
+ if (systemClip.isEmpty()) {
+ useSystemClip = false;
+ } else {
+ if (q->paintDevice()->devType() == QInternal::Widget && currentClipDevice) {
+ //QWidgetPrivate *widgetPrivate = qt_widget_private(static_cast<QWidget *>(currentClipDevice)->window());
+ //useSystemClip = widgetPrivate->extra && widgetPrivate->extra->inRenderWithPainter;
+ useSystemClip = true;
+ } else {
+ useSystemClip = true;
+ }
+ }
+
+ q->state()->clipTestEnabled = false;
+ q->state()->needsClipBufferClear = true;
+
+ q->state()->currentClip = 1;
+ maxClip = 1;
+
+ q->state()->rectangleClip = useSystemClip ? systemClip.boundingRect() : QRect(0, 0, width, height);
+ updateClipScissorTest();
+
+ if (systemClip.rectCount() == 1) {
+ if (systemClip.boundingRect() == QRect(0, 0, width, height))
+ useSystemClip = false;
+#ifndef QT_GL_NO_SCISSOR_TEST
+ // scissoring takes care of the system clip
+ return;
+#endif
+ }
+
+ if (useSystemClip) {
+ clearClip(0);
+
+ QPainterPath path;
+ path.addRegion(systemClip);
+
+ q->state()->currentClip = 0;
+ writeClip(qtVectorPathForPath(q->state()->matrix.inverted().map(path)), 1);
+ q->state()->currentClip = 1;
+ q->state()->clipTestEnabled = true;
+ }
+}
+
+void QOpenGL2PaintEngineEx::setState(QPainterState *new_state)
+{
+ // qDebug("QOpenGL2PaintEngineEx::setState()");
+
+ Q_D(QOpenGL2PaintEngineEx);
+
+ QOpenGL2PaintEngineState *s = static_cast<QOpenGL2PaintEngineState *>(new_state);
+ QOpenGL2PaintEngineState *old_state = state();
+
+ QPaintEngineEx::setState(s);
+
+ if (s->isNew) {
+ // Newly created state object. The call to setState()
+ // will either be followed by a call to begin(), or we are
+ // setting the state as part of a save().
+ s->isNew = false;
+ return;
+ }
+
+ // Setting the state as part of a restore().
+
+ if (old_state == s || old_state->renderHintsChanged)
+ renderHintsChanged();
+
+ if (old_state == s || old_state->matrixChanged)
+ d->matrixDirty = true;
+
+ if (old_state == s || old_state->compositionModeChanged)
+ d->compositionModeDirty = true;
+
+ if (old_state == s || old_state->opacityChanged)
+ d->opacityUniformDirty = true;
+
+ if (old_state == s || old_state->clipChanged) {
+ if (old_state && old_state != s && old_state->canRestoreClip) {
+ d->updateClipScissorTest();
+ d->funcs.glDepthFunc(GL_LEQUAL);
+ } else {
+ d->regenerateClip();
+ }
+ }
+}
+
+QPainterState *QOpenGL2PaintEngineEx::createState(QPainterState *orig) const
+{
+ if (orig)
+ const_cast<QOpenGL2PaintEngineEx *>(this)->ensureActive();
+
+ QOpenGL2PaintEngineState *s;
+ if (!orig)
+ s = new QOpenGL2PaintEngineState();
+ else
+ s = new QOpenGL2PaintEngineState(*static_cast<QOpenGL2PaintEngineState *>(orig));
+
+ s->matrixChanged = false;
+ s->compositionModeChanged = false;
+ s->opacityChanged = false;
+ s->renderHintsChanged = false;
+ s->clipChanged = false;
+
+ return s;
+}
+
+QOpenGL2PaintEngineState::QOpenGL2PaintEngineState(QOpenGL2PaintEngineState &other)
+ : QPainterState(other)
+{
+ isNew = true;
+ needsClipBufferClear = other.needsClipBufferClear;
+ clipTestEnabled = other.clipTestEnabled;
+ currentClip = other.currentClip;
+ canRestoreClip = other.canRestoreClip;
+ rectangleClip = other.rectangleClip;
+}
+
+QOpenGL2PaintEngineState::QOpenGL2PaintEngineState()
+{
+ isNew = true;
+ needsClipBufferClear = true;
+ clipTestEnabled = false;
+ canRestoreClip = true;
+}
+
+QOpenGL2PaintEngineState::~QOpenGL2PaintEngineState()
+{
+}
+
+void QOpenGL2PaintEngineExPrivate::setVertexAttribArrayEnabled(int arrayIndex, bool enabled)
+{
+ Q_ASSERT(arrayIndex < QT_GL_VERTEX_ARRAY_TRACKED_COUNT);
+
+ if (vertexAttributeArraysEnabledState[arrayIndex] && !enabled)
+ funcs.glDisableVertexAttribArray(arrayIndex);
+
+ if (!vertexAttributeArraysEnabledState[arrayIndex] && enabled)
+ funcs.glEnableVertexAttribArray(arrayIndex);
+
+ vertexAttributeArraysEnabledState[arrayIndex] = enabled;
+}
+
+void QOpenGL2PaintEngineExPrivate::syncGlState()
+{
+ for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i) {
+ if (vertexAttributeArraysEnabledState[i])
+ funcs.glEnableVertexAttribArray(i);
+ else
+ funcs.glDisableVertexAttribArray(i);
+ }
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglpaintengine_p.h b/src/opengl/qopenglpaintengine_p.h
new file mode 100644
index 0000000000..9dc92e3810
--- /dev/null
+++ b/src/opengl/qopenglpaintengine_p.h
@@ -0,0 +1,395 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLPAINTENGINE_P_H
+#define QOPENGLPAINTENGINE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QDebug>
+
+#include <qopenglpaintdevice.h>
+
+#include <private/qpaintengineex_p.h>
+#include <private/qopenglengineshadermanager_p.h>
+#include <private/qopengl2pexvertexarray_p.h>
+#include <private/qfontengine_p.h>
+#include <private/qdatabuffer_p.h>
+#include <private/qtriangulatingstroker_p.h>
+
+#include <private/qopenglextensions_p.h>
+
+#include <QOpenGLVertexArrayObject>
+#include <QOpenGLBuffer>
+
+enum EngineMode {
+ ImageDrawingMode,
+ TextDrawingMode,
+ BrushDrawingMode,
+ ImageArrayDrawingMode,
+ ImageOpacityArrayDrawingMode
+};
+
+QT_BEGIN_NAMESPACE
+
+#define GL_STENCIL_HIGH_BIT GLuint(0x80)
+#define QT_UNKNOWN_TEXTURE_UNIT GLuint(-1)
+#define QT_DEFAULT_TEXTURE_UNIT GLuint(0)
+#define QT_BRUSH_TEXTURE_UNIT GLuint(0)
+#define QT_IMAGE_TEXTURE_UNIT GLuint(0) //Can be the same as brush texture unit
+#define QT_MASK_TEXTURE_UNIT GLuint(1)
+#define QT_BACKGROUND_TEXTURE_UNIT GLuint(2)
+
+class QOpenGL2PaintEngineExPrivate;
+
+class QOpenGL2PaintEngineState : public QPainterState
+{
+public:
+ QOpenGL2PaintEngineState(QOpenGL2PaintEngineState &other);
+ QOpenGL2PaintEngineState();
+ ~QOpenGL2PaintEngineState();
+
+ uint isNew : 1;
+ uint needsClipBufferClear : 1;
+ uint clipTestEnabled : 1;
+ uint canRestoreClip : 1;
+ uint matrixChanged : 1;
+ uint compositionModeChanged : 1;
+ uint opacityChanged : 1;
+ uint renderHintsChanged : 1;
+ uint clipChanged : 1;
+ uint currentClip : 8;
+
+ QRect rectangleClip;
+};
+
+class Q_OPENGL_EXPORT QOpenGL2PaintEngineEx : public QPaintEngineEx
+{
+ Q_DECLARE_PRIVATE(QOpenGL2PaintEngineEx)
+public:
+ QOpenGL2PaintEngineEx();
+ ~QOpenGL2PaintEngineEx();
+
+ bool begin(QPaintDevice *device) override;
+ void ensureActive();
+ bool end() override;
+
+ virtual void clipEnabledChanged() override;
+ virtual void penChanged() override;
+ virtual void brushChanged() override;
+ virtual void brushOriginChanged() override;
+ virtual void opacityChanged() override;
+ virtual void compositionModeChanged() override;
+ virtual void renderHintsChanged() override;
+ virtual void transformChanged() override;
+
+ virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) override;
+ virtual void drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap,
+ QPainter::PixmapFragmentHints hints) override;
+ virtual void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
+ Qt::ImageConversionFlags flags = Qt::AutoColor) override;
+ virtual void drawTextItem(const QPointF &p, const QTextItem &textItem) override;
+ virtual void fill(const QVectorPath &path, const QBrush &brush) override;
+ virtual void stroke(const QVectorPath &path, const QPen &pen) override;
+ virtual void clip(const QVectorPath &path, Qt::ClipOperation op) override;
+
+ virtual void drawStaticTextItem(QStaticTextItem *textItem) override;
+
+ bool drawTexture(const QRectF &r, GLuint textureId, const QSize &size, const QRectF &sr);
+
+ Type type() const override { return OpenGL2; }
+
+ virtual void setState(QPainterState *s) override;
+ virtual QPainterState *createState(QPainterState *orig) const override;
+ inline QOpenGL2PaintEngineState *state() {
+ return static_cast<QOpenGL2PaintEngineState *>(QPaintEngineEx::state());
+ }
+ inline const QOpenGL2PaintEngineState *state() const {
+ return static_cast<const QOpenGL2PaintEngineState *>(QPaintEngineEx::state());
+ }
+
+ void beginNativePainting() override;
+ void endNativePainting() override;
+
+ void invalidateState();
+
+ void setRenderTextActive(bool);
+
+ bool isNativePaintingActive() const;
+ bool requiresPretransformedGlyphPositions(QFontEngine *, const QTransform &) const override { return false; }
+ bool shouldDrawCachedGlyphs(QFontEngine *, const QTransform &) const override;
+
+private:
+ Q_DISABLE_COPY_MOVE(QOpenGL2PaintEngineEx)
+
+ friend class QOpenGLEngineShaderManager;
+};
+
+// This probably needs to grow to GL_MAX_VERTEX_ATTRIBS, but 3 is ok for now as that's
+// all the GL2 engine uses:
+#define QT_GL_VERTEX_ARRAY_TRACKED_COUNT 3
+
+class QOpenGL2PaintEngineExPrivate : public QPaintEngineExPrivate
+{
+ Q_DECLARE_PUBLIC(QOpenGL2PaintEngineEx)
+public:
+ enum StencilFillMode {
+ OddEvenFillMode,
+ WindingFillMode,
+ TriStripStrokeFillMode
+ };
+
+ QOpenGL2PaintEngineExPrivate(QOpenGL2PaintEngineEx *q_ptr) :
+ q(q_ptr),
+ shaderManager(nullptr),
+ width(0), height(0),
+ ctx(nullptr),
+ useSystemClip(true),
+ elementIndicesVBOId(0),
+ opacityArray(0),
+ snapToPixelGrid(false),
+ nativePaintingActive(false),
+ inverseScale(1),
+ lastTextureUnitUsed(QT_UNKNOWN_TEXTURE_UNIT),
+ vertexBuffer(QOpenGLBuffer::VertexBuffer),
+ texCoordBuffer(QOpenGLBuffer::VertexBuffer),
+ opacityBuffer(QOpenGLBuffer::VertexBuffer),
+ indexBuffer(QOpenGLBuffer::IndexBuffer)
+ { }
+
+ ~QOpenGL2PaintEngineExPrivate();
+
+ void updateBrushTexture();
+ void updateBrushUniforms();
+ void updateMatrix();
+ void updateCompositionMode();
+
+ enum TextureUpdateMode { UpdateIfNeeded, ForceUpdate };
+ template<typename T>
+ void updateTexture(GLenum textureUnit, const T &texture, GLenum wrapMode, GLenum filterMode, TextureUpdateMode updateMode = UpdateIfNeeded);
+ template<typename T>
+ GLuint bindTexture(const T &texture);
+ void activateTextureUnit(GLenum textureUnit);
+
+ void resetGLState();
+
+ // fill, stroke, drawTexture, drawPixmaps & drawCachedGlyphs are the main rendering entry-points,
+ // however writeClip can also be thought of as en entry point as it does similar things.
+ void fill(const QVectorPath &path);
+ void stroke(const QVectorPath &path, const QPen &pen);
+ void drawTexture(const QOpenGLRect& dest, const QOpenGLRect& src, const QSize &textureSize, bool opaque, bool pattern = false);
+ void drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap,
+ QPainter::PixmapFragmentHints hints);
+ void drawCachedGlyphs(QFontEngine::GlyphFormat glyphFormat, QStaticTextItem *staticTextItem);
+
+ // Calls glVertexAttributePointer if the pointer has changed
+ inline void uploadData(unsigned int arrayIndex, const GLfloat *data, GLuint count);
+ inline bool uploadIndexData(const void *data, GLenum indexValueType, GLuint count);
+
+ // draws whatever is in the vertex array:
+ void drawVertexArrays(const float *data, int *stops, int stopCount, GLenum primitive);
+ void drawVertexArrays(QOpenGL2PEXVertexArray &vertexArray, GLenum primitive) {
+ drawVertexArrays((const float *) vertexArray.data(), vertexArray.stops(), vertexArray.stopCount(), primitive);
+ }
+
+ // Composites the bounding rect onto dest buffer:
+ void composite(const QOpenGLRect& boundingRect);
+
+ // Calls drawVertexArrays to render into stencil buffer:
+ void fillStencilWithVertexArray(const float *data, int count, int *stops, int stopCount, const QOpenGLRect &bounds, StencilFillMode mode);
+ void fillStencilWithVertexArray(QOpenGL2PEXVertexArray& vertexArray, bool useWindingFill) {
+ fillStencilWithVertexArray((const float *) vertexArray.data(), 0, vertexArray.stops(), vertexArray.stopCount(),
+ vertexArray.boundingRect(),
+ useWindingFill ? WindingFillMode : OddEvenFillMode);
+ }
+
+ void setBrush(const QBrush& brush);
+ void transferMode(EngineMode newMode);
+ bool prepareForDraw(bool srcPixelsAreOpaque); // returns true if the program has changed
+ bool prepareForCachedGlyphDraw(const QFontEngineGlyphCache &cache);
+ inline void useSimpleShader();
+ inline GLuint location(const QOpenGLEngineShaderManager::Uniform uniform) {
+ return shaderManager->getUniformLocation(uniform);
+ }
+
+ void clearClip(uint value);
+ void writeClip(const QVectorPath &path, uint value);
+ void resetClipIfNeeded();
+
+ void updateClipScissorTest();
+ void setScissor(const QRect &rect);
+ void regenerateClip();
+ void systemStateChanged() override;
+
+ void setVertexAttribArrayEnabled(int arrayIndex, bool enabled = true);
+ void syncGlState();
+
+ static QOpenGLEngineShaderManager* shaderManagerForEngine(QOpenGL2PaintEngineEx *engine) { return engine->d_func()->shaderManager; }
+ static QOpenGL2PaintEngineExPrivate *getData(QOpenGL2PaintEngineEx *engine) { return engine->d_func(); }
+ static void cleanupVectorPath(QPaintEngineEx *engine, void *data);
+
+ QOpenGLExtensions funcs;
+
+ QOpenGL2PaintEngineEx* q;
+ QOpenGLEngineShaderManager* shaderManager;
+ QOpenGLPaintDevice* device;
+ int width, height;
+ QOpenGLContext *ctx;
+ EngineMode mode;
+ QFontEngine::GlyphFormat glyphCacheFormat;
+
+ bool vertexAttributeArraysEnabledState[QT_GL_VERTEX_ARRAY_TRACKED_COUNT];
+
+ // Dirty flags
+ bool matrixDirty; // Implies matrix uniforms are also dirty
+ bool compositionModeDirty;
+ bool brushTextureDirty;
+ bool brushUniformsDirty;
+ bool opacityUniformDirty;
+ bool matrixUniformDirty;
+
+ bool stencilClean; // Has the stencil not been used for clipping so far?
+ bool useSystemClip;
+ QRegion dirtyStencilRegion;
+ QRect currentScissorBounds;
+ uint maxClip;
+
+ QBrush currentBrush; // May not be the state's brush!
+ const QBrush noBrush;
+
+ QImage currentBrushImage;
+
+ QOpenGL2PEXVertexArray vertexCoordinateArray;
+ QOpenGL2PEXVertexArray textureCoordinateArray;
+ QVector<GLushort> elementIndices;
+ GLuint elementIndicesVBOId;
+ QDataBuffer<GLfloat> opacityArray;
+ GLfloat staticVertexCoordinateArray[8];
+ GLfloat staticTextureCoordinateArray[8];
+
+ bool snapToPixelGrid;
+ bool nativePaintingActive;
+ GLfloat pmvMatrix[3][3];
+ GLfloat inverseScale;
+
+ GLenum lastTextureUnitUsed;
+ GLuint lastTextureUsed;
+
+ QOpenGLVertexArrayObject vao;
+ QOpenGLBuffer vertexBuffer;
+ QOpenGLBuffer texCoordBuffer;
+ QOpenGLBuffer opacityBuffer;
+ QOpenGLBuffer indexBuffer;
+
+ bool needsSync;
+ bool multisamplingAlwaysEnabled;
+
+ QTriangulatingStroker stroker;
+ QDashedStrokeProcessor dasher;
+
+ QVector<GLuint> unusedVBOSToClean;
+ QVector<GLuint> unusedIBOSToClean;
+
+ const GLfloat *vertexAttribPointers[3];
+};
+
+
+void QOpenGL2PaintEngineExPrivate::uploadData(unsigned int arrayIndex, const GLfloat *data, GLuint count)
+{
+ Q_ASSERT(arrayIndex < 3);
+
+ // If a vertex array object is created we have a profile that supports them
+ // and we will upload the data via a QOpenGLBuffer. Otherwise we will use
+ // the legacy way of uploading the data via glVertexAttribPointer.
+ if (vao.isCreated()) {
+ if (arrayIndex == QT_VERTEX_COORDS_ATTR) {
+ vertexBuffer.bind();
+ vertexBuffer.allocate(data, count * sizeof(float));
+ }
+ if (arrayIndex == QT_TEXTURE_COORDS_ATTR) {
+ texCoordBuffer.bind();
+ texCoordBuffer.allocate(data, count * sizeof(float));
+ }
+ if (arrayIndex == QT_OPACITY_ATTR) {
+ opacityBuffer.bind();
+ opacityBuffer.allocate(data, count * sizeof(float));
+ }
+ if (arrayIndex == QT_OPACITY_ATTR)
+ funcs.glVertexAttribPointer(arrayIndex, 1, GL_FLOAT, GL_FALSE, 0, nullptr);
+ else
+ funcs.glVertexAttribPointer(arrayIndex, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
+ } else {
+ // If we already uploaded the data we don't have to do it again
+ if (data == vertexAttribPointers[arrayIndex])
+ return;
+
+ // Store the data in cache and upload it to the graphics card.
+ vertexAttribPointers[arrayIndex] = data;
+ if (arrayIndex == QT_OPACITY_ATTR)
+ funcs.glVertexAttribPointer(arrayIndex, 1, GL_FLOAT, GL_FALSE, 0, data);
+ else
+ funcs.glVertexAttribPointer(arrayIndex, 2, GL_FLOAT, GL_FALSE, 0, data);
+ }
+}
+
+bool QOpenGL2PaintEngineExPrivate::uploadIndexData(const void *data, GLenum indexValueType, GLuint count)
+{
+ // Follow the uploadData() logic: VBOs are used only when VAO support is available.
+ // Otherwise the legacy client-side pointer path is used.
+ if (vao.isCreated()) {
+ Q_ASSERT(indexValueType == GL_UNSIGNED_SHORT || indexValueType == GL_UNSIGNED_INT);
+ indexBuffer.bind();
+ indexBuffer.allocate(data, count * (indexValueType == GL_UNSIGNED_SHORT ? sizeof(quint16) : sizeof(quint32)));
+ return true;
+ }
+ return false;
+}
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/opengl/qopenglpixeltransferoptions.cpp b/src/opengl/qopenglpixeltransferoptions.cpp
new file mode 100644
index 0000000000..aa1af3b092
--- /dev/null
+++ b/src/opengl/qopenglpixeltransferoptions.cpp
@@ -0,0 +1,263 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglpixeltransferoptions.h"
+#include <QSharedData>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ * \class QOpenGLPixelTransferOptions
+ *
+ * \brief The QOpenGLPixelTransferOptions class describes the pixel storage
+ * modes that affect the unpacking of pixels during texture upload.
+ */
+
+/*!
+ * \fn QOpenGLPixelTransferOptions & QOpenGLPixelTransferOptions::operator=(QOpenGLPixelTransferOptions &&other)
+ * \internal
+ */
+
+/*!
+ * \fn void QOpenGLPixelTransferOptions::swap(QOpenGLPixelTransferOptions &other)
+ * \internal
+ */
+
+class QOpenGLPixelTransferOptionsData : public QSharedData
+{
+public:
+ QOpenGLPixelTransferOptionsData()
+ : alignment(4)
+ , skipImages(0)
+ , skipRows(0)
+ , skipPixels(0)
+ , imageHeight(0)
+ , rowLength(0)
+ , lsbFirst(false)
+ , swapBytes(false)
+ {}
+
+ int alignment;
+ int skipImages;
+ int skipRows;
+ int skipPixels;
+ int imageHeight;
+ int rowLength;
+ bool lsbFirst;
+ bool swapBytes;
+};
+
+/*!
+ * Constructs a new QOpenGLPixelTransferOptions instance with the default settings.
+ */
+QOpenGLPixelTransferOptions::QOpenGLPixelTransferOptions()
+ : data(new QOpenGLPixelTransferOptionsData)
+{
+}
+
+/*!
+ * \internal
+ */
+QOpenGLPixelTransferOptions::QOpenGLPixelTransferOptions(const QOpenGLPixelTransferOptions &rhs)
+ : data(rhs.data)
+{
+}
+
+/*!
+ * \internal
+ */
+QOpenGLPixelTransferOptions &QOpenGLPixelTransferOptions::operator=(const QOpenGLPixelTransferOptions &rhs)
+{
+ if (this != &rhs)
+ data.operator=(rhs.data);
+ return *this;
+}
+
+/*!
+ * Destructor.
+ */
+QOpenGLPixelTransferOptions::~QOpenGLPixelTransferOptions()
+{
+}
+
+/*!
+ * Sets the \a alignment requirements for each pixel row. Corresponds to \c GL_UNPACK_ALIGNMENT.
+ * The default value is 4, as specified by OpenGL.
+ */
+void QOpenGLPixelTransferOptions::setAlignment(int alignment)
+{
+ data->alignment = alignment;
+}
+
+/*!
+ * \return the current alignment requirement for each pixel row.
+ */
+int QOpenGLPixelTransferOptions::alignment() const
+{
+ return data->alignment;
+}
+
+/*!
+ * Sets the number of images that are skipped to \a skipImages.
+ * Corresponds to \c GL_UNPACK_SKIP_IMAGES. Equivalent to incrementing the pointer
+ * passed to QOpenGLTexture::setData(). The default value is 0.
+ */
+void QOpenGLPixelTransferOptions::setSkipImages(int skipImages)
+{
+ data->skipImages = skipImages;
+}
+
+/*!
+ * \return the number of images that are skipped.
+ */
+int QOpenGLPixelTransferOptions::skipImages() const
+{
+ return data->skipImages;
+}
+
+/*!
+ * Sets the number of rows that are skipped to \a skipRows.
+ * Corresponds to \c GL_UNPACK_SKIP_ROWS. Equivalent to incrementing the pointer
+ * passed to QOpenGLTexture::setData(). The default value is 0.
+ */
+void QOpenGLPixelTransferOptions::setSkipRows(int skipRows)
+{
+ data->skipRows = skipRows;
+}
+
+/*!
+ * \return the number of rows that are skipped.
+ */
+int QOpenGLPixelTransferOptions::skipRows() const
+{
+ return data->skipRows;
+}
+
+/*!
+ * Sets the number of pixels that are skipped to \a skipPixels.
+ * Corresponds to \c GL_UNPACK_SKIP_PIXELS. Equivalent to incrementing the pointer
+ * passed to QOpenGLTexture::setData(). The default value is 0.
+ */
+void QOpenGLPixelTransferOptions::setSkipPixels(int skipPixels)
+{
+ data->skipPixels = skipPixels;
+}
+
+/*!
+ * \return the number of pixels that are skipped.
+ */
+int QOpenGLPixelTransferOptions::skipPixels() const
+{
+ return data->skipPixels;
+}
+
+/*!
+ * Sets the image height for 3D textures to \a imageHeight.
+ * Corresponds to \c GL_UNPACK_IMAGE_HEIGHT.
+ * The default value is 0.
+ */
+void QOpenGLPixelTransferOptions::setImageHeight(int imageHeight)
+{
+ data->imageHeight = imageHeight;
+}
+
+/*!
+ * \return the currently set image height.
+ */
+int QOpenGLPixelTransferOptions::imageHeight() const
+{
+ return data->imageHeight;
+}
+
+/*!
+ * Sets the number of pixels in a row to \a rowLength.
+ * Corresponds to \c GL_UNPACK_ROW_LENGTH.
+ * The default value is 0.
+ */
+void QOpenGLPixelTransferOptions::setRowLength(int rowLength)
+{
+ data->rowLength = rowLength;
+}
+
+/*!
+ * \return the currently set row length.
+ */
+int QOpenGLPixelTransferOptions::rowLength() const
+{
+ return data->rowLength;
+}
+
+/*!
+ * \a lsbFirst specifies if bits within a byte are ordered from least to most significat.
+ * The default value is \c false, meaning that the first bit in each byte is the
+ * most significant one. This is significant for bitmap data only.
+ * Corresponds to \c GL_UNPACK_LSB_FIRST.
+ */
+void QOpenGLPixelTransferOptions::setLeastSignificantByteFirst(bool lsbFirst)
+{
+ data->lsbFirst = lsbFirst;
+}
+
+/*!
+ * \return \c true if bits within a byte are ordered from least to most significant.
+ */
+bool QOpenGLPixelTransferOptions::isLeastSignificantBitFirst() const
+{
+ return data->lsbFirst;
+}
+
+/*!
+ * \a swapBytes specifies if the byte ordering for multibyte components is reversed.
+ * The default value is \c false.
+ * Corresponds to \c GL_UNPACK_SWAP_BYTES.
+ */
+void QOpenGLPixelTransferOptions::setSwapBytesEnabled(bool swapBytes)
+{
+ data->swapBytes = swapBytes;
+}
+
+/*!
+ * \return \c true if the byte ordering for multibyte components is reversed.
+ */
+bool QOpenGLPixelTransferOptions::isSwapBytesEnabled() const
+{
+ return data->swapBytes;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglpixeltransferoptions.h b/src/opengl/qopenglpixeltransferoptions.h
new file mode 100644
index 0000000000..252c2a2f1e
--- /dev/null
+++ b/src/opengl/qopenglpixeltransferoptions.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLPIXELUPLOADOPTIONS_H
+#define QOPENGLPIXELUPLOADOPTIONS_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL)
+
+#include <QtCore/QSharedDataPointer>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLPixelTransferOptionsData;
+
+class Q_OPENGL_EXPORT QOpenGLPixelTransferOptions
+{
+public:
+ QOpenGLPixelTransferOptions();
+ QOpenGLPixelTransferOptions(const QOpenGLPixelTransferOptions &);
+ QOpenGLPixelTransferOptions &operator=(QOpenGLPixelTransferOptions &&other) noexcept
+ { swap(other); return *this; }
+ QOpenGLPixelTransferOptions &operator=(const QOpenGLPixelTransferOptions &);
+ ~QOpenGLPixelTransferOptions();
+
+ void swap(QOpenGLPixelTransferOptions &other) noexcept
+ { data.swap(other.data); }
+
+ void setAlignment(int alignment);
+ int alignment() const;
+
+ void setSkipImages(int skipImages);
+ int skipImages() const;
+
+ void setSkipRows(int skipRows);
+ int skipRows() const;
+
+ void setSkipPixels(int skipPixels);
+ int skipPixels() const;
+
+ void setImageHeight(int imageHeight);
+ int imageHeight() const;
+
+ void setRowLength(int rowLength);
+ int rowLength() const;
+
+ void setLeastSignificantByteFirst(bool lsbFirst);
+ bool isLeastSignificantBitFirst() const;
+
+ void setSwapBytesEnabled(bool swapBytes);
+ bool isSwapBytesEnabled() const;
+
+private:
+ QSharedDataPointer<QOpenGLPixelTransferOptionsData> data;
+};
+
+Q_DECLARE_SHARED(QOpenGLPixelTransferOptions)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL
+
+#endif // QOPENGLPIXELUPLOADOPTIONS_H
diff --git a/src/opengl/qopenglqueryhelper_p.h b/src/opengl/qopenglqueryhelper_p.h
new file mode 100644
index 0000000000..40fe4cd89d
--- /dev/null
+++ b/src/opengl/qopenglqueryhelper_p.h
@@ -0,0 +1,186 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLQUERYHELPER_P_H
+#define QOPENGLQUERYHELPER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/private/qtguiglobal_p.h>
+
+#if !QT_CONFIG(opengles2)
+
+#include <QtGui/QOpenGLContext>
+
+QT_BEGIN_NAMESPACE
+
+// Helper class used by QOpenGLTimerQuery and later will be used by
+// QOpenGLOcclusionQuery
+class QOpenGLQueryHelper
+{
+public:
+ QOpenGLQueryHelper(QOpenGLContext *context)
+ : GetQueryObjectuiv(nullptr),
+ GetQueryObjectiv(nullptr),
+ GetQueryiv(nullptr),
+ EndQuery(nullptr),
+ BeginQuery(nullptr),
+ IsQuery(nullptr),
+ DeleteQueries(nullptr),
+ GenQueries(nullptr),
+ GetInteger64v(nullptr),
+ GetQueryObjectui64v(nullptr),
+ GetQueryObjecti64v(nullptr),
+ QueryCounter(nullptr)
+ {
+ Q_ASSERT(context);
+
+ // Core in OpenGL >=1.5
+ GetQueryObjectuiv = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLuint *)>(context->getProcAddress("glGetQueryObjectuiv"));
+ GetQueryObjectiv = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint *)>(context->getProcAddress("glGetQueryObjectiv"));
+ GetQueryiv = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLenum , GLint *)>(context->getProcAddress("glGetQueryiv"));
+ EndQuery = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glEndQuery"));
+ BeginQuery = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLuint )>(context->getProcAddress("glBeginQuery"));
+ IsQuery = reinterpret_cast<GLboolean (QOPENGLF_APIENTRYP)(GLuint )>(context->getProcAddress("glIsQuery"));
+ DeleteQueries = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , const GLuint *)>(context->getProcAddress("glDeleteQueries"));
+ GenQueries = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , GLuint *)>(context->getProcAddress("glGenQueries"));
+
+ // Core in OpenGL >=3.2
+ GetInteger64v = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint64 *)>(context->getProcAddress("glGetInteger64v"));
+
+ // Core in OpenGL >=3.3 / ARB_timer_query
+ GetQueryObjectui64v = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLuint64 *)>(context->getProcAddress("glGetQueryObjectui64v"));
+ GetQueryObjecti64v = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint64 *)>(context->getProcAddress("glGetQueryObjecti64v"));
+ QueryCounter = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum )>(context->getProcAddress("glQueryCounter"));
+ }
+
+ inline void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+ {
+ GetQueryObjectuiv(id, pname, params);
+ }
+
+ inline void glGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+ {
+ GetQueryObjectiv(id, pname, params);
+ }
+
+ inline void glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+ {
+ GetQueryiv(target, pname, params);
+ }
+
+ inline void glEndQuery(GLenum target)
+ {
+ EndQuery(target);
+ }
+
+ inline void glBeginQuery(GLenum target, GLuint id)
+ {
+ BeginQuery(target, id);
+ }
+
+ inline GLboolean glIsQuery(GLuint id)
+ {
+ return IsQuery(id);
+ }
+
+ inline void glDeleteQueries(GLsizei n, const GLuint *ids)
+ {
+ DeleteQueries(n, ids);
+ }
+
+ inline void glGenQueries(GLsizei n, GLuint *ids)
+ {
+ GenQueries(n, ids);
+ }
+
+ inline void glGetInteger64v(GLenum pname, GLint64 *params)
+ {
+ GetInteger64v(pname, params);
+ }
+
+ inline void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+ {
+ GetQueryObjectui64v(id, pname, params);
+ }
+
+ inline void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+ {
+ GetQueryObjecti64v(id, pname, params);
+ }
+
+ inline void glQueryCounter(GLuint id, GLenum target)
+ {
+ QueryCounter(id, target);
+ }
+
+private:
+ // Core in OpenGL >=1.5
+ void (QOPENGLF_APIENTRYP GetQueryObjectuiv)(GLuint id, GLenum pname, GLuint *params);
+ void (QOPENGLF_APIENTRYP GetQueryObjectiv)(GLuint id, GLenum pname, GLint *params);
+ void (QOPENGLF_APIENTRYP GetQueryiv)(GLenum target, GLenum pname, GLint *params);
+ void (QOPENGLF_APIENTRYP EndQuery)(GLenum target);
+ void (QOPENGLF_APIENTRYP BeginQuery)(GLenum target, GLuint id);
+ GLboolean (QOPENGLF_APIENTRYP IsQuery)(GLuint id);
+ void (QOPENGLF_APIENTRYP DeleteQueries)(GLsizei n, const GLuint *ids);
+ void (QOPENGLF_APIENTRYP GenQueries)(GLsizei n, GLuint *ids);
+
+ // Core in OpenGL >=3.2
+ void (QOPENGLF_APIENTRYP GetInteger64v)(GLenum pname, GLint64 *params);
+
+ // Core in OpenGL >=3.3 and provided by ARB_timer_query
+ void (QOPENGLF_APIENTRYP GetQueryObjectui64v)(GLuint id, GLenum pname, GLuint64 *params);
+ void (QOPENGLF_APIENTRYP GetQueryObjecti64v)(GLuint id, GLenum pname, GLint64 *params);
+ void (QOPENGLF_APIENTRYP QueryCounter)(GLuint id, GLenum target);
+};
+
+QT_END_NAMESPACE
+
+#endif
+
+#endif // QOPENGLQUERYHELPER_P_H
diff --git a/src/opengl/qopenglshadercache_p.h b/src/opengl/qopenglshadercache_p.h
new file mode 100644
index 0000000000..88efa34216
--- /dev/null
+++ b/src/opengl/qopenglshadercache_p.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QOPENGLSHADERCACHE_P_H
+#define QOPENGLSHADERCACHE_P_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+QT_BEGIN_NAMESPACE
+
+
+class QOpenGLShaderProgram;
+class QOpenGLContext;
+
+class CachedShader
+{
+public:
+ inline CachedShader(const QByteArray &, const QByteArray &)
+ {}
+
+ inline bool isCached()
+ {
+ return false;
+ }
+
+ inline bool load(QOpenGLShaderProgram *, QOpenGLContext *)
+ {
+ return false;
+ }
+
+ inline bool store(QOpenGLShaderProgram *, QOpenGLContext *)
+ {
+ return false;
+ }
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/opengl/qopenglshaderprogram.cpp b/src/opengl/qopenglshaderprogram.cpp
new file mode 100644
index 0000000000..968163fd4d
--- /dev/null
+++ b/src/opengl/qopenglshaderprogram.cpp
@@ -0,0 +1,3811 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglshaderprogram.h"
+#include "qopenglextrafunctions.h"
+#include "private/qopenglcontext_p.h"
+#include <QtOpenGL/QOpenGLVersionFunctionsFactory>
+#include <QtCore/private/qobject_p.h>
+#include <QtCore/qdebug.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qvarlengtharray.h>
+#include <QtCore/qvector.h>
+#include <QtCore/qloggingcategory.h>
+#include <QtGui/private/qopenglprogrambinarycache_p.h>
+#include <QtGui/qtransform.h>
+#include <QtGui/QColor>
+#include <QtGui/QSurfaceFormat>
+
+#if !QT_CONFIG(opengles2)
+#include <QtOpenGL/qopenglfunctions_4_0_core.h>
+#endif
+
+#include <algorithm>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLShaderProgram
+ \brief The QOpenGLShaderProgram class allows OpenGL shader programs to be linked and used.
+ \since 5.0
+ \ingroup painting-3D
+ \inmodule QtOpenGL
+
+ \section1 Introduction
+
+ This class supports shader programs written in the OpenGL Shading
+ Language (GLSL) and in the OpenGL/ES Shading Language (GLSL/ES).
+
+ QOpenGLShader and QOpenGLShaderProgram shelter the programmer from the details of
+ compiling and linking vertex and fragment shaders.
+
+ The following example creates a vertex shader program using the
+ supplied source \c{code}. Once compiled and linked, the shader
+ program is activated in the current QOpenGLContext by calling
+ QOpenGLShaderProgram::bind():
+
+ \snippet code/src_gui_qopenglshaderprogram.cpp 0
+
+ \section1 Writing Portable Shaders
+
+ Shader programs can be difficult to reuse across OpenGL implementations
+ because of varying levels of support for standard vertex attributes and
+ uniform variables. In particular, GLSL/ES lacks all of the
+ standard variables that are present on desktop OpenGL systems:
+ \c{gl_Vertex}, \c{gl_Normal}, \c{gl_Color}, and so on. Desktop OpenGL
+ lacks the variable qualifiers \c{highp}, \c{mediump}, and \c{lowp}.
+
+ The QOpenGLShaderProgram class makes the process of writing portable shaders
+ easier by prefixing all shader programs with the following lines on
+ desktop OpenGL:
+
+ \code
+ #define highp
+ #define mediump
+ #define lowp
+ \endcode
+
+ This makes it possible to run most GLSL/ES shader programs
+ on desktop systems. The programmer should restrict themselves
+ to just features that are present in GLSL/ES, and avoid
+ standard variable names that only work on the desktop.
+
+ \section1 Simple Shader Example
+
+ \snippet code/src_gui_qopenglshaderprogram.cpp 1
+
+ With the above shader program active, we can draw a green triangle
+ as follows:
+
+ \snippet code/src_gui_qopenglshaderprogram.cpp 2
+
+ \section1 Binary Shaders and Programs
+
+ Binary shaders may be specified using \c{glShaderBinary()} on
+ the return value from QOpenGLShader::shaderId(). The QOpenGLShader instance
+ containing the binary can then be added to the shader program with
+ addShader() and linked in the usual fashion with link().
+
+ Binary programs may be specified using \c{glProgramBinaryOES()}
+ on the return value from programId(). Then the application should
+ call link(), which will notice that the program has already been
+ specified and linked, allowing other operations to be performed
+ on the shader program. The shader program's id can be explicitly
+ created using the create() function.
+
+ \section2 Caching Program Binaries
+
+ As of Qt 5.9, support for caching program binaries on disk is built in. To
+ enable this, switch to using addCacheableShaderFromSourceCode() and
+ addCacheableShaderFromSourceFile(). With an OpenGL ES 3.x context or support
+ for \c{GL_ARB_get_program_binary}, this will transparently cache program
+ binaries under QStandardPaths::GenericCacheLocation or
+ QStandardPaths::CacheLocation. When support is not available, calling the
+ cacheable function variants is equivalent to the normal ones.
+
+ \note Some drivers do not have any binary formats available, even though
+ they advertise the extension or offer OpenGL ES 3.0. In this case program
+ binary support will be disabled.
+
+ \sa QOpenGLShader
+*/
+
+/*!
+ \class QOpenGLShader
+ \brief The QOpenGLShader class allows OpenGL shaders to be compiled.
+ \since 5.0
+ \ingroup painting-3D
+ \inmodule QtOpenGL
+
+ This class supports shaders written in the OpenGL Shading Language (GLSL)
+ and in the OpenGL/ES Shading Language (GLSL/ES).
+
+ QOpenGLShader and QOpenGLShaderProgram shelter the programmer from the details of
+ compiling and linking vertex and fragment shaders.
+
+ \sa QOpenGLShaderProgram
+*/
+
+/*!
+ \enum QOpenGLShader::ShaderTypeBit
+ This enum specifies the type of QOpenGLShader that is being created.
+
+ \value Vertex Vertex shader written in the OpenGL Shading Language (GLSL).
+ \value Fragment Fragment shader written in the OpenGL Shading Language (GLSL).
+ \value Geometry Geometry shaders written in the OpenGL Shading Language (GLSL)
+ (requires OpenGL >= 3.2 or OpenGL ES >= 3.2).
+ \value TessellationControl Tessellation control shaders written in the OpenGL
+ shading language (GLSL) (requires OpenGL >= 4.0 or OpenGL ES >= 3.2).
+ \value TessellationEvaluation Tessellation evaluation shaders written in the OpenGL
+ shading language (GLSL) (requires OpenGL >= 4.0 or OpenGL ES >= 3.2).
+ \value Compute Compute shaders written in the OpenGL shading language (GLSL)
+ (requires OpenGL >= 4.3 or OpenGL ES >= 3.1).
+*/
+
+// For GLES 3.1/3.2
+#ifndef GL_GEOMETRY_SHADER
+#define GL_GEOMETRY_SHADER 0x8DD9
+#endif
+#ifndef GL_TESS_CONTROL_SHADER
+#define GL_TESS_CONTROL_SHADER 0x8E88
+#endif
+#ifndef GL_TESS_EVALUATION_SHADER
+#define GL_TESS_EVALUATION_SHADER 0x8E87
+#endif
+#ifndef GL_COMPUTE_SHADER
+#define GL_COMPUTE_SHADER 0x91B9
+#endif
+#ifndef GL_MAX_GEOMETRY_OUTPUT_VERTICES
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0
+#endif
+#ifndef GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
+#endif
+#ifndef GL_PATCH_VERTICES
+#define GL_PATCH_VERTICES 0x8E72
+#endif
+#ifndef GL_PATCH_DEFAULT_OUTER_LEVEL
+#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74
+#endif
+#ifndef GL_PATCH_DEFAULT_INNER_LEVEL
+#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73
+#endif
+
+#if !QT_CONFIG(opengles2)
+static inline bool isFormatGLES(const QSurfaceFormat &f)
+{
+ return (f.renderableType() == QSurfaceFormat::OpenGLES);
+}
+#endif
+
+static inline bool supportsGeometry(const QSurfaceFormat &f)
+{
+ return f.version() >= qMakePair(3, 2);
+}
+
+static inline bool supportsCompute(const QSurfaceFormat &f)
+{
+#if !QT_CONFIG(opengles2)
+ if (!isFormatGLES(f))
+ return f.version() >= qMakePair(4, 3);
+ else
+ return f.version() >= qMakePair(3, 1);
+#else
+ return f.version() >= qMakePair(3, 1);
+#endif
+}
+
+static inline bool supportsTessellation(const QSurfaceFormat &f)
+{
+#if !QT_CONFIG(opengles2)
+ if (!isFormatGLES(f))
+ return f.version() >= qMakePair(4, 0);
+ else
+ return f.version() >= qMakePair(3, 2);
+#else
+ return f.version() >= qMakePair(3, 2);
+#endif
+}
+
+class QOpenGLShaderPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QOpenGLShader)
+public:
+ QOpenGLShaderPrivate(QOpenGLContext *ctx, QOpenGLShader::ShaderType type)
+ : shaderGuard(nullptr)
+ , shaderType(type)
+ , compiled(false)
+ , glfuncs(new QOpenGLExtraFunctions(ctx))
+ , supportsGeometryShaders(false)
+ , supportsTessellationShaders(false)
+ , supportsComputeShaders(false)
+ {
+ if (shaderType & QOpenGLShader::Geometry)
+ supportsGeometryShaders = supportsGeometry(ctx->format());
+ else if (shaderType & (QOpenGLShader::TessellationControl | QOpenGLShader::TessellationEvaluation))
+ supportsTessellationShaders = supportsTessellation(ctx->format());
+ else if (shaderType & QOpenGLShader::Compute)
+ supportsComputeShaders = supportsCompute(ctx->format());
+ }
+ ~QOpenGLShaderPrivate();
+
+ QOpenGLSharedResourceGuard *shaderGuard;
+ QOpenGLShader::ShaderType shaderType;
+ bool compiled;
+ QString log;
+
+ QOpenGLExtraFunctions *glfuncs;
+
+ // Support for geometry shaders
+ bool supportsGeometryShaders;
+ // Support for tessellation shaders
+ bool supportsTessellationShaders;
+ // Support for compute shaders
+ bool supportsComputeShaders;
+
+
+ bool create();
+ bool compile(QOpenGLShader *q);
+ void deleteShader();
+};
+
+namespace {
+ void freeShaderFunc(QOpenGLFunctions *funcs, GLuint id)
+ {
+ funcs->glDeleteShader(id);
+ }
+}
+
+QOpenGLShaderPrivate::~QOpenGLShaderPrivate()
+{
+ delete glfuncs;
+ if (shaderGuard)
+ shaderGuard->free();
+}
+
+bool QOpenGLShaderPrivate::create()
+{
+ QOpenGLContext *context = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
+ if (!context)
+ return false;
+ GLuint shader = 0;
+ if (shaderType == QOpenGLShader::Vertex) {
+ shader = glfuncs->glCreateShader(GL_VERTEX_SHADER);
+ } else if (shaderType == QOpenGLShader::Geometry && supportsGeometryShaders) {
+ shader = glfuncs->glCreateShader(GL_GEOMETRY_SHADER);
+ } else if (shaderType == QOpenGLShader::TessellationControl && supportsTessellationShaders) {
+ shader = glfuncs->glCreateShader(GL_TESS_CONTROL_SHADER);
+ } else if (shaderType == QOpenGLShader::TessellationEvaluation && supportsTessellationShaders) {
+ shader = glfuncs->glCreateShader(GL_TESS_EVALUATION_SHADER);
+ } else if (shaderType == QOpenGLShader::Compute && supportsComputeShaders) {
+ shader = glfuncs->glCreateShader(GL_COMPUTE_SHADER);
+ } else if (shaderType == QOpenGLShader::Fragment) {
+ shader = glfuncs->glCreateShader(GL_FRAGMENT_SHADER);
+ }
+ if (!shader) {
+ qWarning("QOpenGLShader: could not create shader");
+ return false;
+ }
+ shaderGuard = new QOpenGLSharedResourceGuard(context, shader, freeShaderFunc);
+ return true;
+}
+
+bool QOpenGLShaderPrivate::compile(QOpenGLShader *q)
+{
+ GLuint shader = shaderGuard ? shaderGuard->id() : 0;
+ if (!shader)
+ return false;
+
+ // Try to compile shader
+ glfuncs->glCompileShader(shader);
+ GLint value = 0;
+
+ // Get compilation status
+ glfuncs->glGetShaderiv(shader, GL_COMPILE_STATUS, &value);
+ compiled = (value != 0);
+
+ if (!compiled) {
+ // Compilation failed, try to provide some information about the failure
+ QString name = q->objectName();
+
+ const char *types[] = {
+ "Fragment",
+ "Vertex",
+ "Geometry",
+ "Tessellation Control",
+ "Tessellation Evaluation",
+ "Compute",
+ ""
+ };
+
+ const char *type = types[6];
+ switch (shaderType) {
+ case QOpenGLShader::Fragment:
+ type = types[0]; break;
+ case QOpenGLShader::Vertex:
+ type = types[1]; break;
+ case QOpenGLShader::Geometry:
+ type = types[2]; break;
+ case QOpenGLShader::TessellationControl:
+ type = types[3]; break;
+ case QOpenGLShader::TessellationEvaluation:
+ type = types[4]; break;
+ case QOpenGLShader::Compute:
+ type = types[5]; break;
+ }
+
+ // Get info and source code lengths
+ GLint infoLogLength = 0;
+ GLint sourceCodeLength = 0;
+ char *logBuffer = nullptr;
+ char *sourceCodeBuffer = nullptr;
+
+ // Get the compilation info log
+ glfuncs->glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
+
+ if (infoLogLength > 1) {
+ GLint temp;
+ logBuffer = new char [infoLogLength];
+ glfuncs->glGetShaderInfoLog(shader, infoLogLength, &temp, logBuffer);
+ }
+
+ // Get the source code
+ glfuncs->glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &sourceCodeLength);
+
+ if (sourceCodeLength > 1) {
+ GLint temp;
+ sourceCodeBuffer = new char [sourceCodeLength];
+ glfuncs->glGetShaderSource(shader, sourceCodeLength, &temp, sourceCodeBuffer);
+ }
+
+ if (logBuffer)
+ log = QString::fromLatin1(logBuffer);
+ else
+ log = QLatin1String("failed");
+
+ if (name.isEmpty())
+ qWarning("QOpenGLShader::compile(%s): %s", type, qPrintable(log));
+ else
+ qWarning("QOpenGLShader::compile(%s)[%s]: %s", type, qPrintable(name), qPrintable(log));
+
+ // Dump the source code if we got it
+ if (sourceCodeBuffer) {
+ qWarning("*** Problematic %s shader source code ***\n"
+ "%ls\n"
+ "***",
+ type, qUtf16Printable(QString::fromLatin1(sourceCodeBuffer)));
+ }
+
+ // Cleanup
+ delete [] logBuffer;
+ delete [] sourceCodeBuffer;
+ }
+
+ return compiled;
+}
+
+void QOpenGLShaderPrivate::deleteShader()
+{
+ if (shaderGuard) {
+ shaderGuard->free();
+ shaderGuard = nullptr;
+ }
+}
+
+/*!
+ Constructs a new QOpenGLShader object of the specified \a type
+ and attaches it to \a parent. If shader programs are not supported,
+ QOpenGLShaderProgram::hasOpenGLShaderPrograms() will return false.
+
+ This constructor is normally followed by a call to compileSourceCode()
+ or compileSourceFile().
+
+ The shader will be associated with the current QOpenGLContext.
+
+ \sa compileSourceCode(), compileSourceFile()
+*/
+QOpenGLShader::QOpenGLShader(QOpenGLShader::ShaderType type, QObject *parent)
+ : QObject(*new QOpenGLShaderPrivate(QOpenGLContext::currentContext(), type), parent)
+{
+ Q_D(QOpenGLShader);
+ d->create();
+}
+
+/*!
+ Deletes this shader. If the shader has been attached to a
+ QOpenGLShaderProgram object, then the actual shader will stay around
+ until the QOpenGLShaderProgram is destroyed.
+*/
+QOpenGLShader::~QOpenGLShader()
+{
+}
+
+/*!
+ Returns the type of this shader.
+*/
+QOpenGLShader::ShaderType QOpenGLShader::shaderType() const
+{
+ Q_D(const QOpenGLShader);
+ return d->shaderType;
+}
+
+static const char qualifierDefines[] =
+ "#define lowp\n"
+ "#define mediump\n"
+ "#define highp\n";
+
+#if QT_CONFIG(opengles2) && !defined(QT_OPENGL_FORCE_SHADER_DEFINES)
+// The "highp" qualifier doesn't exist in fragment shaders
+// on all ES platforms. When it doesn't exist, use "mediump".
+#define QOpenGL_REDEFINE_HIGHP 1
+static const char redefineHighp[] =
+ "#ifndef GL_FRAGMENT_PRECISION_HIGH\n"
+ "#define highp mediump\n"
+ "#endif\n";
+#endif
+
+// Boiler-plate header to have the layout attributes available we need later
+static const char blendEquationAdvancedHeader[] =
+ "#ifdef GL_KHR_blend_equation_advanced\n"
+ "#extension GL_ARB_fragment_coord_conventions : enable\n"
+ "#extension GL_KHR_blend_equation_advanced : enable\n"
+ "#endif\n";
+
+struct QVersionDirectivePosition
+{
+ Q_DECL_CONSTEXPR QVersionDirectivePosition(int position = 0, int line = -1)
+ : position(position)
+ , line(line)
+ {
+ }
+
+ Q_DECL_CONSTEXPR bool hasPosition() const
+ {
+ return position > 0;
+ }
+
+ const int position;
+ const int line;
+};
+
+static QVersionDirectivePosition findVersionDirectivePosition(const char *source)
+{
+ Q_ASSERT(source);
+
+ // According to the GLSL spec the #version directive must not be
+ // preceded by anything but whitespace and comments.
+ // In order to not get confused by #version directives within a
+ // multiline comment, we need to do some minimal comment parsing
+ // while searching for the directive.
+ enum {
+ Normal,
+ StartOfLine,
+ PreprocessorDirective,
+ CommentStarting,
+ MultiLineComment,
+ SingleLineComment,
+ CommentEnding
+ } state = StartOfLine;
+
+ const char *c = source;
+ while (*c) {
+ switch (state) {
+ case PreprocessorDirective:
+ if (*c == ' ' || *c == '\t')
+ break;
+ if (!strncmp(c, "version", strlen("version"))) {
+ // Found version directive
+ c += strlen("version");
+ while (*c && *c != '\n')
+ ++c;
+ int splitPosition = c - source + 1;
+ int linePosition = int(std::count(source, c, '\n')) + 1;
+ return QVersionDirectivePosition(splitPosition, linePosition);
+ } else if (*c == '/')
+ state = CommentStarting;
+ else if (*c == '\n')
+ state = StartOfLine;
+ else
+ state = Normal;
+ break;
+ case StartOfLine:
+ if (*c == ' ' || *c == '\t')
+ break;
+ else if (*c == '#') {
+ state = PreprocessorDirective;
+ break;
+ }
+ state = Normal;
+ Q_FALLTHROUGH();
+ case Normal:
+ if (*c == '/')
+ state = CommentStarting;
+ else if (*c == '\n')
+ state = StartOfLine;
+ break;
+ case CommentStarting:
+ if (*c == '*')
+ state = MultiLineComment;
+ else if (*c == '/')
+ state = SingleLineComment;
+ else
+ state = Normal;
+ break;
+ case MultiLineComment:
+ if (*c == '*')
+ state = CommentEnding;
+ break;
+ case SingleLineComment:
+ if (*c == '\n')
+ state = Normal;
+ break;
+ case CommentEnding:
+ if (*c == '/')
+ state = Normal;
+ else if (*c != QLatin1Char('*'))
+ state = MultiLineComment;
+ break;
+ }
+ ++c;
+ }
+
+ return QVersionDirectivePosition(0, 1);
+}
+
+/*!
+ Sets the \a source code for this shader and compiles it.
+ Returns \c true if the source was successfully compiled, false otherwise.
+
+ \sa compileSourceFile()
+*/
+bool QOpenGLShader::compileSourceCode(const char *source)
+{
+ Q_D(QOpenGLShader);
+ // This method breaks the shader code into two parts:
+ // 1. Up to and including an optional #version directive.
+ // 2. The rest.
+ // If a #version directive exists, qualifierDefines and redefineHighp
+ // are inserted after. Otherwise they are inserted right at the start.
+ // In both cases a #line directive is appended in order to compensate
+ // for line number changes in case of compiler errors.
+
+ if (d->shaderGuard && d->shaderGuard->id() && source) {
+ const QVersionDirectivePosition versionDirectivePosition = findVersionDirectivePosition(source);
+
+ QVarLengthArray<const char *, 5> sourceChunks;
+ QVarLengthArray<GLint, 5> sourceChunkLengths;
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+
+ if (versionDirectivePosition.hasPosition()) {
+ // Append source up to and including the #version directive
+ sourceChunks.append(source);
+ sourceChunkLengths.append(GLint(versionDirectivePosition.position));
+ } else {
+ // QTBUG-55733: Intel on Windows with Compatibility profile requires a #version always
+ if (ctx->format().profile() == QSurfaceFormat::CompatibilityProfile) {
+ const char *vendor = reinterpret_cast<const char *>(ctx->functions()->glGetString(GL_VENDOR));
+ if (vendor && !strcmp(vendor, "Intel")) {
+ static const char version110[] = "#version 110\n";
+ sourceChunks.append(version110);
+ sourceChunkLengths.append(GLint(sizeof(version110)) - 1);
+ }
+ }
+ }
+ if (d->shaderType == Fragment) {
+ sourceChunks.append(blendEquationAdvancedHeader);
+ sourceChunkLengths.append(GLint(sizeof(blendEquationAdvancedHeader) - 1));
+ }
+
+ // The precision qualifiers are useful on OpenGL/ES systems,
+ // but usually not present on desktop systems.
+ const QSurfaceFormat currentSurfaceFormat = ctx->format();
+ QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(QOpenGLContext::currentContext());
+ if (currentSurfaceFormat.renderableType() == QSurfaceFormat::OpenGL
+ || ctx_d->workaround_missingPrecisionQualifiers
+#ifdef QT_OPENGL_FORCE_SHADER_DEFINES
+ || true
+#endif
+ ) {
+ sourceChunks.append(qualifierDefines);
+ sourceChunkLengths.append(GLint(sizeof(qualifierDefines) - 1));
+ }
+
+#ifdef QOpenGL_REDEFINE_HIGHP
+ if (d->shaderType == Fragment && !ctx_d->workaround_missingPrecisionQualifiers
+ && QOpenGLContext::currentContext()->isOpenGLES()) {
+ sourceChunks.append(redefineHighp);
+ sourceChunkLengths.append(GLint(sizeof(redefineHighp) - 1));
+ }
+#endif
+
+ QByteArray lineDirective;
+ // #line is rejected by some drivers:
+ // "2.1 Mesa 8.1-devel (git-48a3d4e)" or "MESA 2.1 Mesa 8.1-devel"
+ const char *version = reinterpret_cast<const char *>(ctx->functions()->glGetString(GL_VERSION));
+ if (!version || !strstr(version, "2.1 Mesa 8")) {
+ // Append #line directive in order to compensate for text insertion
+ lineDirective = QStringLiteral("#line %1\n").arg(versionDirectivePosition.line).toUtf8();
+ sourceChunks.append(lineDirective.constData());
+ sourceChunkLengths.append(GLint(lineDirective.length()));
+ }
+
+ // Append rest of shader code
+ sourceChunks.append(source + versionDirectivePosition.position);
+ sourceChunkLengths.append(GLint(qstrlen(source + versionDirectivePosition.position)));
+
+ d->glfuncs->glShaderSource(d->shaderGuard->id(), sourceChunks.size(), sourceChunks.data(), sourceChunkLengths.data());
+ return d->compile(this);
+ } else {
+ return false;
+ }
+}
+
+/*!
+ \overload
+
+ Sets the \a source code for this shader and compiles it.
+ Returns \c true if the source was successfully compiled, false otherwise.
+
+ \sa compileSourceFile()
+*/
+bool QOpenGLShader::compileSourceCode(const QByteArray& source)
+{
+ return compileSourceCode(source.constData());
+}
+
+/*!
+ \overload
+
+ Sets the \a source code for this shader and compiles it.
+ Returns \c true if the source was successfully compiled, false otherwise.
+
+ \sa compileSourceFile()
+*/
+bool QOpenGLShader::compileSourceCode(const QString& source)
+{
+ return compileSourceCode(source.toLatin1().constData());
+}
+
+/*!
+ Sets the source code for this shader to the contents of \a fileName
+ and compiles it. Returns \c true if the file could be opened and the
+ source compiled, false otherwise.
+
+ \sa compileSourceCode()
+*/
+bool QOpenGLShader::compileSourceFile(const QString& fileName)
+{
+ QFile file(fileName);
+ if (!file.open(QFile::ReadOnly)) {
+ qWarning() << "QOpenGLShader: Unable to open file" << fileName;
+ return false;
+ }
+
+ QByteArray contents = file.readAll();
+ return compileSourceCode(contents.constData());
+}
+
+/*!
+ Returns the source code for this shader.
+
+ \sa compileSourceCode()
+*/
+QByteArray QOpenGLShader::sourceCode() const
+{
+ Q_D(const QOpenGLShader);
+ GLuint shader = d->shaderGuard ? d->shaderGuard->id() : 0;
+ if (!shader)
+ return QByteArray();
+ GLint size = 0;
+ d->glfuncs->glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &size);
+ if (size <= 0)
+ return QByteArray();
+ GLint len = 0;
+ char *source = new char [size];
+ d->glfuncs->glGetShaderSource(shader, size, &len, source);
+ QByteArray src(source);
+ delete [] source;
+ return src;
+}
+
+/*!
+ Returns \c true if this shader has been compiled; false otherwise.
+
+ \sa compileSourceCode(), compileSourceFile()
+*/
+bool QOpenGLShader::isCompiled() const
+{
+ Q_D(const QOpenGLShader);
+ return d->compiled;
+}
+
+/*!
+ Returns the errors and warnings that occurred during the last compile.
+
+ \sa compileSourceCode(), compileSourceFile()
+*/
+QString QOpenGLShader::log() const
+{
+ Q_D(const QOpenGLShader);
+ return d->log;
+}
+
+/*!
+ Returns the OpenGL identifier associated with this shader.
+
+ \sa QOpenGLShaderProgram::programId()
+*/
+GLuint QOpenGLShader::shaderId() const
+{
+ Q_D(const QOpenGLShader);
+ return d->shaderGuard ? d->shaderGuard->id() : 0;
+}
+
+class QOpenGLShaderProgramPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QOpenGLShaderProgram)
+public:
+ QOpenGLShaderProgramPrivate()
+ : programGuard(nullptr)
+ , linked(false)
+ , inited(false)
+ , removingShaders(false)
+ , glfuncs(new QOpenGLExtraFunctions)
+#if !QT_CONFIG(opengles2)
+ , tessellationFuncs(nullptr)
+#endif
+ , linkBinaryRecursion(false)
+ {
+ }
+ ~QOpenGLShaderProgramPrivate();
+
+ QOpenGLSharedResourceGuard *programGuard;
+ bool linked;
+ bool inited;
+ bool removingShaders;
+
+ QString log;
+ QList<QOpenGLShader *> shaders;
+ QList<QOpenGLShader *> anonShaders;
+
+ QOpenGLExtraFunctions *glfuncs;
+#if !QT_CONFIG(opengles2)
+ // for tessellation features not in GLES 3.2
+ QOpenGLFunctions_4_0_Core *tessellationFuncs;
+#endif
+
+ bool hasShader(QOpenGLShader::ShaderType type) const;
+
+ QOpenGLProgramBinaryCache::ProgramDesc binaryProgram;
+ bool isCacheDisabled() const;
+ bool compileCacheable();
+ bool linkBinary();
+
+ bool linkBinaryRecursion;
+};
+
+namespace {
+ void freeProgramFunc(QOpenGLFunctions *funcs, GLuint id)
+ {
+ funcs->glDeleteProgram(id);
+ }
+}
+
+
+QOpenGLShaderProgramPrivate::~QOpenGLShaderProgramPrivate()
+{
+ delete glfuncs;
+ if (programGuard)
+ programGuard->free();
+}
+
+bool QOpenGLShaderProgramPrivate::hasShader(QOpenGLShader::ShaderType type) const
+{
+ for (QOpenGLShader *shader : shaders) {
+ if (shader->shaderType() == type)
+ return true;
+ }
+ return false;
+}
+
+/*!
+ Constructs a new shader program and attaches it to \a parent.
+ The program will be invalid until addShader() is called.
+
+ The shader program will be associated with the current QOpenGLContext.
+
+ \sa addShader()
+*/
+QOpenGLShaderProgram::QOpenGLShaderProgram(QObject *parent)
+ : QObject(*new QOpenGLShaderProgramPrivate, parent)
+{
+}
+
+/*!
+ Deletes this shader program.
+*/
+QOpenGLShaderProgram::~QOpenGLShaderProgram()
+{
+}
+
+/*!
+ Requests the shader program's id to be created immediately. Returns \c true
+ if successful; \c false otherwise.
+
+ This function is primarily useful when combining QOpenGLShaderProgram
+ with other OpenGL functions that operate directly on the shader
+ program id, like \c {GL_OES_get_program_binary}.
+
+ When the shader program is used normally, the shader program's id will
+ be created on demand.
+
+ \sa programId()
+
+ \since 5.3
+ */
+bool QOpenGLShaderProgram::create()
+{
+ return init();
+}
+
+bool QOpenGLShaderProgram::init()
+{
+ Q_D(QOpenGLShaderProgram);
+ if ((d->programGuard && d->programGuard->id()) || d->inited)
+ return true;
+ d->inited = true;
+ QOpenGLContext *context = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
+ if (!context)
+ return false;
+ d->glfuncs->initializeOpenGLFunctions();
+
+#if !QT_CONFIG(opengles2)
+ if (!context->isOpenGLES() && context->format().version() >= qMakePair(4, 0)) {
+ d->tessellationFuncs = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_4_0_Core>(context);
+ d->tessellationFuncs->initializeOpenGLFunctions();
+ }
+#endif
+
+ GLuint program = d->glfuncs->glCreateProgram();
+ if (!program) {
+ qWarning("QOpenGLShaderProgram: could not create shader program");
+ return false;
+ }
+ if (d->programGuard)
+ delete d->programGuard;
+ d->programGuard = new QOpenGLSharedResourceGuard(context, program, freeProgramFunc);
+ return true;
+}
+
+/*!
+ Adds a compiled \a shader to this shader program. Returns \c true
+ if the shader could be added, or false otherwise.
+
+ Ownership of the \a shader object remains with the caller.
+ It will not be deleted when this QOpenGLShaderProgram instance
+ is deleted. This allows the caller to add the same shader
+ to multiple shader programs.
+
+ \sa addShaderFromSourceCode(), addShaderFromSourceFile()
+ \sa removeShader(), link(), removeAllShaders()
+*/
+bool QOpenGLShaderProgram::addShader(QOpenGLShader *shader)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (!init())
+ return false;
+ if (d->shaders.contains(shader))
+ return true; // Already added to this shader program.
+ if (d->programGuard && d->programGuard->id() && shader) {
+ if (!shader->d_func()->shaderGuard || !shader->d_func()->shaderGuard->id())
+ return false;
+ if (d->programGuard->group() != shader->d_func()->shaderGuard->group()) {
+ qWarning("QOpenGLShaderProgram::addShader: Program and shader are not associated with same context.");
+ return false;
+ }
+ d->glfuncs->glAttachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
+ d->linked = false; // Program needs to be relinked.
+ d->shaders.append(shader);
+ connect(shader, SIGNAL(destroyed()), this, SLOT(shaderDestroyed()));
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/*!
+ Compiles \a source as a shader of the specified \a type and
+ adds it to this shader program. Returns \c true if compilation
+ was successful, false otherwise. The compilation errors
+ and warnings will be made available via log().
+
+ This function is intended to be a short-cut for quickly
+ adding vertex and fragment shaders to a shader program without
+ creating an instance of QOpenGLShader first.
+
+ \sa addShader(), addShaderFromSourceFile()
+ \sa removeShader(), link(), log(), removeAllShaders()
+*/
+bool QOpenGLShaderProgram::addShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (!init())
+ return false;
+ QOpenGLShader *shader = new QOpenGLShader(type, this);
+ if (!shader->compileSourceCode(source)) {
+ d->log = shader->log();
+ delete shader;
+ return false;
+ }
+ d->anonShaders.append(shader);
+ return addShader(shader);
+}
+
+/*!
+ \overload
+
+ Compiles \a source as a shader of the specified \a type and
+ adds it to this shader program. Returns \c true if compilation
+ was successful, false otherwise. The compilation errors
+ and warnings will be made available via log().
+
+ This function is intended to be a short-cut for quickly
+ adding vertex and fragment shaders to a shader program without
+ creating an instance of QOpenGLShader first.
+
+ \sa addShader(), addShaderFromSourceFile()
+ \sa removeShader(), link(), log(), removeAllShaders()
+*/
+bool QOpenGLShaderProgram::addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray& source)
+{
+ return addShaderFromSourceCode(type, source.constData());
+}
+
+/*!
+ \overload
+
+ Compiles \a source as a shader of the specified \a type and
+ adds it to this shader program. Returns \c true if compilation
+ was successful, false otherwise. The compilation errors
+ and warnings will be made available via log().
+
+ This function is intended to be a short-cut for quickly
+ adding vertex and fragment shaders to a shader program without
+ creating an instance of QOpenGLShader first.
+
+ \sa addShader(), addShaderFromSourceFile()
+ \sa removeShader(), link(), log(), removeAllShaders()
+*/
+bool QOpenGLShaderProgram::addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString& source)
+{
+ return addShaderFromSourceCode(type, source.toLatin1().constData());
+}
+
+/*!
+ Compiles the contents of \a fileName as a shader of the specified
+ \a type and adds it to this shader program. Returns \c true if
+ compilation was successful, false otherwise. The compilation errors
+ and warnings will be made available via log().
+
+ This function is intended to be a short-cut for quickly
+ adding vertex and fragment shaders to a shader program without
+ creating an instance of QOpenGLShader first.
+
+ \sa addShader(), addShaderFromSourceCode()
+*/
+bool QOpenGLShaderProgram::addShaderFromSourceFile
+ (QOpenGLShader::ShaderType type, const QString& fileName)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (!init())
+ return false;
+ QOpenGLShader *shader = new QOpenGLShader(type, this);
+ if (!shader->compileSourceFile(fileName)) {
+ d->log = shader->log();
+ delete shader;
+ return false;
+ }
+ d->anonShaders.append(shader);
+ return addShader(shader);
+}
+
+/*!
+ Registers the shader of the specified \a type and \a source to this
+ program. Unlike addShaderFromSourceCode(), this function does not perform
+ compilation. Compilation is deferred to link(), and may not happen at all,
+ because link() may potentially use a program binary from Qt's shader disk
+ cache. This will typically lead to a significant increase in performance.
+
+ \return true if the shader has been registered or, in the non-cached case,
+ compiled successfully; false if there was an error. The compilation error
+ messages can be retrieved via log().
+
+ When the disk cache is disabled, via Qt::AA_DisableShaderDiskCache for
+ example, or the OpenGL context has no support for context binaries, calling
+ this function is equivalent to addShaderFromSourceCode().
+
+ \since 5.9
+ \sa addShaderFromSourceCode(), addCacheableShaderFromSourceFile()
+ */
+bool QOpenGLShaderProgram::addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (!init())
+ return false;
+ if (d->isCacheDisabled())
+ return addShaderFromSourceCode(type, source);
+
+ return addCacheableShaderFromSourceCode(type, QByteArray(source));
+}
+
+static inline QShader::Stage qt_shaderTypeToStage(QOpenGLShader::ShaderType type)
+{
+ switch (type) {
+ case QOpenGLShader::Vertex:
+ return QShader::VertexStage;
+ case QOpenGLShader::Fragment:
+ return QShader::FragmentStage;
+ case QOpenGLShader::Geometry:
+ return QShader::GeometryStage;
+ case QOpenGLShader::TessellationControl:
+ return QShader::TessellationControlStage;
+ case QOpenGLShader::TessellationEvaluation:
+ return QShader::TessellationEvaluationStage;
+ case QOpenGLShader::Compute:
+ return QShader::ComputeStage;
+ }
+ return QShader::VertexStage;
+}
+
+static inline QOpenGLShader::ShaderType qt_shaderStageToType(QShader::Stage stage)
+{
+ switch (stage) {
+ case QShader::VertexStage:
+ return QOpenGLShader::Vertex;
+ case QShader::TessellationControlStage:
+ return QOpenGLShader::TessellationControl;
+ case QShader::TessellationEvaluationStage:
+ return QOpenGLShader::TessellationEvaluation;
+ case QShader::GeometryStage:
+ return QOpenGLShader::Geometry;
+ case QShader::FragmentStage:
+ return QOpenGLShader::Fragment;
+ case QShader::ComputeStage:
+ return QOpenGLShader::Compute;
+ }
+ return QOpenGLShader::Vertex;
+}
+
+/*!
+ \overload
+
+ Registers the shader of the specified \a type and \a source to this
+ program. Unlike addShaderFromSourceCode(), this function does not perform
+ compilation. Compilation is deferred to link(), and may not happen at all,
+ because link() may potentially use a program binary from Qt's shader disk
+ cache. This will typically lead to a significant increase in performance.
+
+ \return true if the shader has been registered or, in the non-cached case,
+ compiled successfully; false if there was an error. The compilation error
+ messages can be retrieved via log().
+
+ When the disk cache is disabled, via Qt::AA_DisableShaderDiskCache for
+ example, or the OpenGL context has no support for context binaries, calling
+ this function is equivalent to addShaderFromSourceCode().
+
+ \since 5.9
+ \sa addShaderFromSourceCode(), addCacheableShaderFromSourceFile()
+ */
+bool QOpenGLShaderProgram::addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray &source)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (!init())
+ return false;
+ if (d->isCacheDisabled())
+ return addShaderFromSourceCode(type, source);
+
+ d->binaryProgram.shaders.append(QOpenGLProgramBinaryCache::ShaderDesc(qt_shaderTypeToStage(type), source));
+ return true;
+}
+
+/*!
+ \overload
+
+ Registers the shader of the specified \a type and \a source to this
+ program. Unlike addShaderFromSourceCode(), this function does not perform
+ compilation. Compilation is deferred to link(), and may not happen at all,
+ because link() may potentially use a program binary from Qt's shader disk
+ cache. This will typically lead to a significant increase in performance.
+
+ When the disk cache is disabled, via Qt::AA_DisableShaderDiskCache for
+ example, or the OpenGL context has no support for context binaries, calling
+ this function is equivalent to addShaderFromSourceCode().
+
+ \since 5.9
+ \sa addShaderFromSourceCode(), addCacheableShaderFromSourceFile()
+ */
+bool QOpenGLShaderProgram::addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString &source)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (!init())
+ return false;
+ if (d->isCacheDisabled())
+ return addShaderFromSourceCode(type, source);
+
+ return addCacheableShaderFromSourceCode(type, source.toUtf8().constData());
+}
+
+/*!
+ Registers the shader of the specified \a type and \a fileName to this
+ program. Unlike addShaderFromSourceFile(), this function does not perform
+ compilation. Compilation is deferred to link(), and may not happen at all,
+ because link() may potentially use a program binary from Qt's shader disk
+ cache. This will typically lead to a significant increase in performance.
+
+ \return true if the file has been read successfully, false if the file could
+ not be opened or the normal, non-cached compilation of the shader has
+ failed. The compilation error messages can be retrieved via log().
+
+ When the disk cache is disabled, via Qt::AA_DisableShaderDiskCache for
+ example, or the OpenGL context has no support for context binaries, calling
+ this function is equivalent to addShaderFromSourceFile().
+
+ \since 5.9
+ \sa addShaderFromSourceFile(), addCacheableShaderFromSourceCode()
+ */
+bool QOpenGLShaderProgram::addCacheableShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString &fileName)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (!init())
+ return false;
+ if (d->isCacheDisabled())
+ return addShaderFromSourceFile(type, fileName);
+
+ QOpenGLProgramBinaryCache::ShaderDesc shader(qt_shaderTypeToStage(type));
+ // NB! It could be tempting to defer reading the file contents and just
+ // hash the filename as the cache key, perhaps combined with last-modified
+ // timestamp checks. However, this would raise a number of issues (no
+ // timestamps for files in the resource system; preference for global, not
+ // per-application cache items (where filenames may clash); resource-based
+ // shaders from libraries like Qt Quick; etc.), so just avoid it.
+ QFile f(fileName);
+ if (f.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ shader.source = f.readAll();
+ f.close();
+ } else {
+ qWarning("QOpenGLShaderProgram: Unable to open file %s", qPrintable(fileName));
+ return false;
+ }
+ d->binaryProgram.shaders.append(shader);
+ return true;
+}
+
+/*!
+ Removes \a shader from this shader program. The object is not deleted.
+
+ The shader program must be valid in the current QOpenGLContext.
+
+ \sa addShader(), link(), removeAllShaders()
+*/
+void QOpenGLShaderProgram::removeShader(QOpenGLShader *shader)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (d->programGuard && d->programGuard->id()
+ && shader && shader->d_func()->shaderGuard)
+ {
+ d->glfuncs->glDetachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
+ }
+ d->linked = false; // Program needs to be relinked.
+ if (shader) {
+ d->shaders.removeAll(shader);
+ d->anonShaders.removeAll(shader);
+ disconnect(shader, SIGNAL(destroyed()), this, SLOT(shaderDestroyed()));
+ }
+}
+
+/*!
+ Returns a list of all shaders that have been added to this shader
+ program using addShader().
+
+ \sa addShader(), removeShader()
+*/
+QList<QOpenGLShader *> QOpenGLShaderProgram::shaders() const
+{
+ Q_D(const QOpenGLShaderProgram);
+ return d->shaders;
+}
+
+/*!
+ Removes all of the shaders that were added to this program previously.
+ The QOpenGLShader objects for the shaders will not be deleted if they
+ were constructed externally. QOpenGLShader objects that are constructed
+ internally by QOpenGLShaderProgram will be deleted.
+
+ \sa addShader(), removeShader()
+*/
+void QOpenGLShaderProgram::removeAllShaders()
+{
+ Q_D(QOpenGLShaderProgram);
+ d->removingShaders = true;
+ for (QOpenGLShader *shader : qAsConst(d->shaders)) {
+ if (d->programGuard && d->programGuard->id()
+ && shader && shader->d_func()->shaderGuard)
+ {
+ d->glfuncs->glDetachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
+ }
+ }
+ // Delete shader objects that were created anonymously.
+ qDeleteAll(d->anonShaders);
+ d->shaders.clear();
+ d->anonShaders.clear();
+ d->binaryProgram = QOpenGLProgramBinaryCache::ProgramDesc();
+ d->linked = false; // Program needs to be relinked.
+ d->removingShaders = false;
+}
+
+/*!
+ Links together the shaders that were added to this program with
+ addShader(). Returns \c true if the link was successful or
+ false otherwise. If the link failed, the error messages can
+ be retrieved with log().
+
+ Subclasses can override this function to initialize attributes
+ and uniform variables for use in specific shader programs.
+
+ If the shader program was already linked, calling this
+ function again will force it to be re-linked.
+
+ When shaders were added to this program via
+ addCacheableShaderFromSourceCode() or addCacheableShaderFromSourceFile(),
+ program binaries are supported, and a cached binary is available on disk,
+ actual compilation and linking are skipped. Instead, link() will initialize
+ the program with the binary blob via glProgramBinary(). If there is no
+ cached version of the program or it was generated with a different driver
+ version, the shaders will be compiled from source and the program will get
+ linked normally. This allows seamless upgrading of the graphics drivers,
+ without having to worry about potentially incompatible binary formats.
+
+ \sa addShader(), log()
+*/
+bool QOpenGLShaderProgram::link()
+{
+ Q_D(QOpenGLShaderProgram);
+ GLuint program = d->programGuard ? d->programGuard->id() : 0;
+ if (!program)
+ return false;
+
+ if (!d->linkBinaryRecursion && d->shaders.isEmpty() && !d->binaryProgram.shaders.isEmpty())
+ return d->linkBinary();
+
+ GLint value;
+ if (d->shaders.isEmpty()) {
+ // If there are no explicit shaders, then it is possible that the
+ // application added a program binary with glProgramBinaryOES(), or
+ // otherwise populated the shaders itself. This is also the case when
+ // we are recursively called back from linkBinary() after a successful
+ // glProgramBinary(). Check to see if the program is already linked and
+ // bail out if so.
+ value = 0;
+ d->glfuncs->glGetProgramiv(program, GL_LINK_STATUS, &value);
+ d->linked = (value != 0);
+ if (d->linked)
+ return true;
+ }
+
+ d->glfuncs->glLinkProgram(program);
+ value = 0;
+ d->glfuncs->glGetProgramiv(program, GL_LINK_STATUS, &value);
+ d->linked = (value != 0);
+ value = 0;
+ d->glfuncs->glGetProgramiv(program, GL_INFO_LOG_LENGTH, &value);
+ d->log = QString();
+ if (value > 1) {
+ char *logbuf = new char [value];
+ GLint len;
+ d->glfuncs->glGetProgramInfoLog(program, value, &len, logbuf);
+ d->log = QString::fromLatin1(logbuf);
+ if (!d->linked && !d->linkBinaryRecursion) {
+ QString name = objectName();
+ if (name.isEmpty())
+ qWarning("QOpenGLShader::link: %ls", qUtf16Printable(d->log));
+ else
+ qWarning("QOpenGLShader::link[%ls]: %ls", qUtf16Printable(name), qUtf16Printable(d->log));
+ }
+ delete [] logbuf;
+ }
+ return d->linked;
+}
+
+/*!
+ Returns \c true if this shader program has been linked; false otherwise.
+
+ \sa link()
+*/
+bool QOpenGLShaderProgram::isLinked() const
+{
+ Q_D(const QOpenGLShaderProgram);
+ return d->linked;
+}
+
+/*!
+ Returns the errors and warnings that occurred during the last link()
+ or addShader() with explicitly specified source code.
+
+ \sa link()
+*/
+QString QOpenGLShaderProgram::log() const
+{
+ Q_D(const QOpenGLShaderProgram);
+ return d->log;
+}
+
+/*!
+ Binds this shader program to the active QOpenGLContext and makes
+ it the current shader program. Any previously bound shader program
+ is released. This is equivalent to calling \c{glUseProgram()} on
+ programId(). Returns \c true if the program was successfully bound;
+ false otherwise. If the shader program has not yet been linked,
+ or it needs to be re-linked, this function will call link().
+
+ \sa link(), release()
+*/
+bool QOpenGLShaderProgram::bind()
+{
+ Q_D(QOpenGLShaderProgram);
+ GLuint program = d->programGuard ? d->programGuard->id() : 0;
+ if (!program)
+ return false;
+ if (!d->linked && !link())
+ return false;
+#ifndef QT_NO_DEBUG
+ if (d->programGuard->group() != QOpenGLContextGroup::currentContextGroup()) {
+ qWarning("QOpenGLShaderProgram::bind: program is not valid in the current context.");
+ return false;
+ }
+#endif
+ d->glfuncs->glUseProgram(program);
+ return true;
+}
+
+/*!
+ Releases the active shader program from the current QOpenGLContext.
+ This is equivalent to calling \c{glUseProgram(0)}.
+
+ \sa bind()
+*/
+void QOpenGLShaderProgram::release()
+{
+ Q_D(QOpenGLShaderProgram);
+#ifndef QT_NO_DEBUG
+ if (d->programGuard && d->programGuard->group() != QOpenGLContextGroup::currentContextGroup())
+ qWarning("QOpenGLShaderProgram::release: program is not valid in the current context.");
+#endif
+ d->glfuncs->glUseProgram(0);
+}
+
+/*!
+ Returns the OpenGL identifier associated with this shader program.
+
+ \sa QOpenGLShader::shaderId()
+*/
+GLuint QOpenGLShaderProgram::programId() const
+{
+ Q_D(const QOpenGLShaderProgram);
+ GLuint id = d->programGuard ? d->programGuard->id() : 0;
+ if (id)
+ return id;
+
+ // Create the identifier if we don't have one yet. This is for
+ // applications that want to create the attached shader configuration
+ // themselves, particularly those using program binaries.
+ if (!const_cast<QOpenGLShaderProgram *>(this)->init())
+ return 0;
+ return d->programGuard ? d->programGuard->id() : 0;
+}
+
+/*!
+ Binds the attribute \a name to the specified \a location. This
+ function can be called before or after the program has been linked.
+ Any attributes that have not been explicitly bound when the program
+ is linked will be assigned locations automatically.
+
+ When this function is called after the program has been linked,
+ the program will need to be relinked for the change to take effect.
+
+ \sa attributeLocation()
+*/
+void QOpenGLShaderProgram::bindAttributeLocation(const char *name, int location)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (!init() || !d->programGuard || !d->programGuard->id())
+ return;
+ d->glfuncs->glBindAttribLocation(d->programGuard->id(), location, name);
+ d->linked = false; // Program needs to be relinked.
+}
+
+/*!
+ \overload
+
+ Binds the attribute \a name to the specified \a location. This
+ function can be called before or after the program has been linked.
+ Any attributes that have not been explicitly bound when the program
+ is linked will be assigned locations automatically.
+
+ When this function is called after the program has been linked,
+ the program will need to be relinked for the change to take effect.
+
+ \sa attributeLocation()
+*/
+void QOpenGLShaderProgram::bindAttributeLocation(const QByteArray& name, int location)
+{
+ bindAttributeLocation(name.constData(), location);
+}
+
+/*!
+ \overload
+
+ Binds the attribute \a name to the specified \a location. This
+ function can be called before or after the program has been linked.
+ Any attributes that have not been explicitly bound when the program
+ is linked will be assigned locations automatically.
+
+ When this function is called after the program has been linked,
+ the program will need to be relinked for the change to take effect.
+
+ \sa attributeLocation()
+*/
+void QOpenGLShaderProgram::bindAttributeLocation(const QString& name, int location)
+{
+ bindAttributeLocation(name.toLatin1().constData(), location);
+}
+
+/*!
+ Returns the location of the attribute \a name within this shader
+ program's parameter list. Returns -1 if \a name is not a valid
+ attribute for this shader program.
+
+ \sa uniformLocation(), bindAttributeLocation()
+*/
+int QOpenGLShaderProgram::attributeLocation(const char *name) const
+{
+ Q_D(const QOpenGLShaderProgram);
+ if (d->linked && d->programGuard && d->programGuard->id()) {
+ return d->glfuncs->glGetAttribLocation(d->programGuard->id(), name);
+ } else {
+ qWarning("QOpenGLShaderProgram::attributeLocation(%s): shader program is not linked", name);
+ return -1;
+ }
+}
+
+/*!
+ \overload
+
+ Returns the location of the attribute \a name within this shader
+ program's parameter list. Returns -1 if \a name is not a valid
+ attribute for this shader program.
+
+ \sa uniformLocation(), bindAttributeLocation()
+*/
+int QOpenGLShaderProgram::attributeLocation(const QByteArray& name) const
+{
+ return attributeLocation(name.constData());
+}
+
+/*!
+ \overload
+
+ Returns the location of the attribute \a name within this shader
+ program's parameter list. Returns -1 if \a name is not a valid
+ attribute for this shader program.
+
+ \sa uniformLocation(), bindAttributeLocation()
+*/
+int QOpenGLShaderProgram::attributeLocation(const QString& name) const
+{
+ return attributeLocation(name.toLatin1().constData());
+}
+
+/*!
+ Sets the attribute at \a location in the current context to \a value.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(int location, GLfloat value)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (location != -1)
+ d->glfuncs->glVertexAttrib1fv(location, &value);
+}
+
+/*!
+ \overload
+
+ Sets the attribute called \a name in the current context to \a value.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(const char *name, GLfloat value)
+{
+ setAttributeValue(attributeLocation(name), value);
+}
+
+/*!
+ Sets the attribute at \a location in the current context to
+ the 2D vector (\a x, \a y).
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(int location, GLfloat x, GLfloat y)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (location != -1) {
+ GLfloat values[2] = {x, y};
+ d->glfuncs->glVertexAttrib2fv(location, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the attribute called \a name in the current context to
+ the 2D vector (\a x, \a y).
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(const char *name, GLfloat x, GLfloat y)
+{
+ setAttributeValue(attributeLocation(name), x, y);
+}
+
+/*!
+ Sets the attribute at \a location in the current context to
+ the 3D vector (\a x, \a y, \a z).
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue
+ (int location, GLfloat x, GLfloat y, GLfloat z)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ GLfloat values[3] = {x, y, z};
+ d->glfuncs->glVertexAttrib3fv(location, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the attribute called \a name in the current context to
+ the 3D vector (\a x, \a y, \a z).
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue
+ (const char *name, GLfloat x, GLfloat y, GLfloat z)
+{
+ setAttributeValue(attributeLocation(name), x, y, z);
+}
+
+/*!
+ Sets the attribute at \a location in the current context to
+ the 4D vector (\a x, \a y, \a z, \a w).
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue
+ (int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (location != -1) {
+ GLfloat values[4] = {x, y, z, w};
+ d->glfuncs->glVertexAttrib4fv(location, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the attribute called \a name in the current context to
+ the 4D vector (\a x, \a y, \a z, \a w).
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue
+ (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ setAttributeValue(attributeLocation(name), x, y, z, w);
+}
+
+/*!
+ Sets the attribute at \a location in the current context to \a value.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(int location, const QVector2D& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ if (location != -1)
+ d->glfuncs->glVertexAttrib2fv(location, reinterpret_cast<const GLfloat *>(&value));
+}
+
+/*!
+ \overload
+
+ Sets the attribute called \a name in the current context to \a value.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(const char *name, const QVector2D& value)
+{
+ setAttributeValue(attributeLocation(name), value);
+}
+
+/*!
+ Sets the attribute at \a location in the current context to \a value.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(int location, const QVector3D& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glVertexAttrib3fv(location, reinterpret_cast<const GLfloat *>(&value));
+}
+
+/*!
+ \overload
+
+ Sets the attribute called \a name in the current context to \a value.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(const char *name, const QVector3D& value)
+{
+ setAttributeValue(attributeLocation(name), value);
+}
+
+/*!
+ Sets the attribute at \a location in the current context to \a value.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(int location, const QVector4D& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glVertexAttrib4fv(location, reinterpret_cast<const GLfloat *>(&value));
+}
+
+/*!
+ \overload
+
+ Sets the attribute called \a name in the current context to \a value.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(const char *name, const QVector4D& value)
+{
+ setAttributeValue(attributeLocation(name), value);
+}
+
+/*!
+ Sets the attribute at \a location in the current context to \a value.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(int location, const QColor& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ GLfloat values[4] = {GLfloat(value.redF()), GLfloat(value.greenF()),
+ GLfloat(value.blueF()), GLfloat(value.alphaF())};
+ d->glfuncs->glVertexAttrib4fv(location, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the attribute called \a name in the current context to \a value.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue(const char *name, const QColor& value)
+{
+ setAttributeValue(attributeLocation(name), value);
+}
+
+/*!
+ Sets the attribute at \a location in the current context to the
+ contents of \a values, which contains \a columns elements, each
+ consisting of \a rows elements. The \a rows value should be
+ 1, 2, 3, or 4. This function is typically used to set matrix
+ values and column vectors.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue
+ (int location, const GLfloat *values, int columns, int rows)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (rows < 1 || rows > 4) {
+ qWarning("QOpenGLShaderProgram::setAttributeValue: rows %d not supported", rows);
+ return;
+ }
+ if (location != -1) {
+ while (columns-- > 0) {
+ if (rows == 1)
+ d->glfuncs->glVertexAttrib1fv(location, values);
+ else if (rows == 2)
+ d->glfuncs->glVertexAttrib2fv(location, values);
+ else if (rows == 3)
+ d->glfuncs->glVertexAttrib3fv(location, values);
+ else
+ d->glfuncs->glVertexAttrib4fv(location, values);
+ values += rows;
+ ++location;
+ }
+ }
+}
+
+/*!
+ \overload
+
+ Sets the attribute called \a name in the current context to the
+ contents of \a values, which contains \a columns elements, each
+ consisting of \a rows elements. The \a rows value should be
+ 1, 2, 3, or 4. This function is typically used to set matrix
+ values and column vectors.
+
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::setAttributeValue
+ (const char *name, const GLfloat *values, int columns, int rows)
+{
+ setAttributeValue(attributeLocation(name), values, columns, rows);
+}
+
+/*!
+ Sets an array of vertex \a values on the attribute at \a location
+ in this shader program. The \a tupleSize indicates the number of
+ components per vertex (1, 2, 3, or 4), and the \a stride indicates
+ the number of bytes between vertices. A default \a stride value
+ of zero indicates that the vertices are densely packed in \a values.
+
+ The array will become active when enableAttributeArray() is called
+ on the \a location. Otherwise the value specified with
+ setAttributeValue() for \a location will be used.
+
+ \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
+ \sa disableAttributeArray()
+*/
+void QOpenGLShaderProgram::setAttributeArray
+ (int location, const GLfloat *values, int tupleSize, int stride)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ d->glfuncs->glVertexAttribPointer(location, tupleSize, GL_FLOAT, GL_FALSE,
+ stride, values);
+ }
+}
+
+/*!
+ Sets an array of 2D vertex \a values on the attribute at \a location
+ in this shader program. The \a stride indicates the number of bytes
+ between vertices. A default \a stride value of zero indicates that
+ the vertices are densely packed in \a values.
+
+ The array will become active when enableAttributeArray() is called
+ on the \a location. Otherwise the value specified with
+ setAttributeValue() for \a location will be used.
+
+ \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
+ \sa disableAttributeArray()
+*/
+void QOpenGLShaderProgram::setAttributeArray
+ (int location, const QVector2D *values, int stride)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ d->glfuncs->glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE,
+ stride, values);
+ }
+}
+
+/*!
+ Sets an array of 3D vertex \a values on the attribute at \a location
+ in this shader program. The \a stride indicates the number of bytes
+ between vertices. A default \a stride value of zero indicates that
+ the vertices are densely packed in \a values.
+
+ The array will become active when enableAttributeArray() is called
+ on the \a location. Otherwise the value specified with
+ setAttributeValue() for \a location will be used.
+
+ \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
+ \sa disableAttributeArray()
+*/
+void QOpenGLShaderProgram::setAttributeArray
+ (int location, const QVector3D *values, int stride)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ d->glfuncs->glVertexAttribPointer(location, 3, GL_FLOAT, GL_FALSE,
+ stride, values);
+ }
+}
+
+/*!
+ Sets an array of 4D vertex \a values on the attribute at \a location
+ in this shader program. The \a stride indicates the number of bytes
+ between vertices. A default \a stride value of zero indicates that
+ the vertices are densely packed in \a values.
+
+ The array will become active when enableAttributeArray() is called
+ on the \a location. Otherwise the value specified with
+ setAttributeValue() for \a location will be used.
+
+ \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
+ \sa disableAttributeArray()
+*/
+void QOpenGLShaderProgram::setAttributeArray
+ (int location, const QVector4D *values, int stride)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ d->glfuncs->glVertexAttribPointer(location, 4, GL_FLOAT, GL_FALSE,
+ stride, values);
+ }
+}
+
+/*!
+ Sets an array of vertex \a values on the attribute at \a location
+ in this shader program. The \a stride indicates the number of bytes
+ between vertices. A default \a stride value of zero indicates that
+ the vertices are densely packed in \a values.
+
+ The \a type indicates the type of elements in the \a values array,
+ usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a tupleSize
+ indicates the number of components per vertex: 1, 2, 3, or 4.
+
+ The array will become active when enableAttributeArray() is called
+ on the \a location. Otherwise the value specified with
+ setAttributeValue() for \a location will be used.
+
+ The setAttributeBuffer() function can be used to set the attribute
+ array to an offset within a vertex buffer.
+
+ \note Normalization will be enabled. If this is not desired, call
+ glVertexAttribPointer directly through QOpenGLFunctions.
+
+ \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
+ \sa disableAttributeArray(), setAttributeBuffer()
+*/
+void QOpenGLShaderProgram::setAttributeArray
+ (int location, GLenum type, const void *values, int tupleSize, int stride)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ d->glfuncs->glVertexAttribPointer(location, tupleSize, type, GL_TRUE,
+ stride, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets an array of vertex \a values on the attribute called \a name
+ in this shader program. The \a tupleSize indicates the number of
+ components per vertex (1, 2, 3, or 4), and the \a stride indicates
+ the number of bytes between vertices. A default \a stride value
+ of zero indicates that the vertices are densely packed in \a values.
+
+ The array will become active when enableAttributeArray() is called
+ on \a name. Otherwise the value specified with setAttributeValue()
+ for \a name will be used.
+
+ \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
+ \sa disableAttributeArray()
+*/
+void QOpenGLShaderProgram::setAttributeArray
+ (const char *name, const GLfloat *values, int tupleSize, int stride)
+{
+ setAttributeArray(attributeLocation(name), values, tupleSize, stride);
+}
+
+/*!
+ \overload
+
+ Sets an array of 2D vertex \a values on the attribute called \a name
+ in this shader program. The \a stride indicates the number of bytes
+ between vertices. A default \a stride value of zero indicates that
+ the vertices are densely packed in \a values.
+
+ The array will become active when enableAttributeArray() is called
+ on \a name. Otherwise the value specified with setAttributeValue()
+ for \a name will be used.
+
+ \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
+ \sa disableAttributeArray()
+*/
+void QOpenGLShaderProgram::setAttributeArray
+ (const char *name, const QVector2D *values, int stride)
+{
+ setAttributeArray(attributeLocation(name), values, stride);
+}
+
+/*!
+ \overload
+
+ Sets an array of 3D vertex \a values on the attribute called \a name
+ in this shader program. The \a stride indicates the number of bytes
+ between vertices. A default \a stride value of zero indicates that
+ the vertices are densely packed in \a values.
+
+ The array will become active when enableAttributeArray() is called
+ on \a name. Otherwise the value specified with setAttributeValue()
+ for \a name will be used.
+
+ \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
+ \sa disableAttributeArray()
+*/
+void QOpenGLShaderProgram::setAttributeArray
+ (const char *name, const QVector3D *values, int stride)
+{
+ setAttributeArray(attributeLocation(name), values, stride);
+}
+
+/*!
+ \overload
+
+ Sets an array of 4D vertex \a values on the attribute called \a name
+ in this shader program. The \a stride indicates the number of bytes
+ between vertices. A default \a stride value of zero indicates that
+ the vertices are densely packed in \a values.
+
+ The array will become active when enableAttributeArray() is called
+ on \a name. Otherwise the value specified with setAttributeValue()
+ for \a name will be used.
+
+ \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
+ \sa disableAttributeArray()
+*/
+void QOpenGLShaderProgram::setAttributeArray
+ (const char *name, const QVector4D *values, int stride)
+{
+ setAttributeArray(attributeLocation(name), values, stride);
+}
+
+/*!
+ \overload
+
+ Sets an array of vertex \a values on the attribute called \a name
+ in this shader program. The \a stride indicates the number of bytes
+ between vertices. A default \a stride value of zero indicates that
+ the vertices are densely packed in \a values.
+
+ The \a type indicates the type of elements in the \a values array,
+ usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a tupleSize
+ indicates the number of components per vertex: 1, 2, 3, or 4.
+
+ The array will become active when enableAttributeArray() is called
+ on the \a name. Otherwise the value specified with
+ setAttributeValue() for \a name will be used.
+
+ The setAttributeBuffer() function can be used to set the attribute
+ array to an offset within a vertex buffer.
+
+ \sa setAttributeValue(), setUniformValue(), enableAttributeArray()
+ \sa disableAttributeArray(), setAttributeBuffer()
+*/
+void QOpenGLShaderProgram::setAttributeArray
+ (const char *name, GLenum type, const void *values, int tupleSize, int stride)
+{
+ setAttributeArray(attributeLocation(name), type, values, tupleSize, stride);
+}
+
+/*!
+ Sets an array of vertex values on the attribute at \a location in
+ this shader program, starting at a specific \a offset in the
+ currently bound vertex buffer. The \a stride indicates the number
+ of bytes between vertices. A default \a stride value of zero
+ indicates that the vertices are densely packed in the value array.
+
+ The \a type indicates the type of elements in the vertex value
+ array, usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a
+ tupleSize indicates the number of components per vertex: 1, 2, 3,
+ or 4.
+
+ The array will become active when enableAttributeArray() is called
+ on the \a location. Otherwise the value specified with
+ setAttributeValue() for \a location will be used.
+
+ \note Normalization will be enabled. If this is not desired, call
+ glVertexAttribPointer directly through QOpenGLFunctions.
+
+ \sa setAttributeArray()
+*/
+void QOpenGLShaderProgram::setAttributeBuffer
+ (int location, GLenum type, int offset, int tupleSize, int stride)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ d->glfuncs->glVertexAttribPointer(location, tupleSize, type, GL_TRUE, stride,
+ reinterpret_cast<const void *>(qintptr(offset)));
+ }
+}
+
+/*!
+ \overload
+
+ Sets an array of vertex values on the attribute called \a name
+ in this shader program, starting at a specific \a offset in the
+ currently bound vertex buffer. The \a stride indicates the number
+ of bytes between vertices. A default \a stride value of zero
+ indicates that the vertices are densely packed in the value array.
+
+ The \a type indicates the type of elements in the vertex value
+ array, usually \c{GL_FLOAT}, \c{GL_UNSIGNED_BYTE}, etc. The \a
+ tupleSize indicates the number of components per vertex: 1, 2, 3,
+ or 4.
+
+ The array will become active when enableAttributeArray() is called
+ on the \a name. Otherwise the value specified with
+ setAttributeValue() for \a name will be used.
+
+ \sa setAttributeArray()
+*/
+void QOpenGLShaderProgram::setAttributeBuffer
+ (const char *name, GLenum type, int offset, int tupleSize, int stride)
+{
+ setAttributeBuffer(attributeLocation(name), type, offset, tupleSize, stride);
+}
+
+/*!
+ Enables the vertex array at \a location in this shader program
+ so that the value set by setAttributeArray() on \a location
+ will be used by the shader program.
+
+ \sa disableAttributeArray(), setAttributeArray(), setAttributeValue()
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::enableAttributeArray(int location)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glEnableVertexAttribArray(location);
+}
+
+/*!
+ \overload
+
+ Enables the vertex array called \a name in this shader program
+ so that the value set by setAttributeArray() on \a name
+ will be used by the shader program.
+
+ \sa disableAttributeArray(), setAttributeArray(), setAttributeValue()
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::enableAttributeArray(const char *name)
+{
+ enableAttributeArray(attributeLocation(name));
+}
+
+/*!
+ Disables the vertex array at \a location in this shader program
+ that was enabled by a previous call to enableAttributeArray().
+
+ \sa enableAttributeArray(), setAttributeArray(), setAttributeValue()
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::disableAttributeArray(int location)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glDisableVertexAttribArray(location);
+}
+
+/*!
+ \overload
+
+ Disables the vertex array called \a name in this shader program
+ that was enabled by a previous call to enableAttributeArray().
+
+ \sa enableAttributeArray(), setAttributeArray(), setAttributeValue()
+ \sa setUniformValue()
+*/
+void QOpenGLShaderProgram::disableAttributeArray(const char *name)
+{
+ disableAttributeArray(attributeLocation(name));
+}
+
+/*!
+ Returns the location of the uniform variable \a name within this shader
+ program's parameter list. Returns -1 if \a name is not a valid
+ uniform variable for this shader program.
+
+ \sa attributeLocation()
+*/
+int QOpenGLShaderProgram::uniformLocation(const char *name) const
+{
+ Q_D(const QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (d->linked && d->programGuard && d->programGuard->id()) {
+ return d->glfuncs->glGetUniformLocation(d->programGuard->id(), name);
+ } else {
+ qWarning("QOpenGLShaderProgram::uniformLocation(%s): shader program is not linked", name);
+ return -1;
+ }
+}
+
+/*!
+ \overload
+
+ Returns the location of the uniform variable \a name within this shader
+ program's parameter list. Returns -1 if \a name is not a valid
+ uniform variable for this shader program.
+
+ \sa attributeLocation()
+*/
+int QOpenGLShaderProgram::uniformLocation(const QByteArray& name) const
+{
+ return uniformLocation(name.constData());
+}
+
+/*!
+ \overload
+
+ Returns the location of the uniform variable \a name within this shader
+ program's parameter list. Returns -1 if \a name is not a valid
+ uniform variable for this shader program.
+
+ \sa attributeLocation()
+*/
+int QOpenGLShaderProgram::uniformLocation(const QString& name) const
+{
+ return uniformLocation(name.toLatin1().constData());
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, GLfloat value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniform1fv(location, 1, &value);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, GLfloat value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, GLint value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniform1i(location, value);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, GLint value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to \a value.
+ This function should be used when setting sampler values.
+
+ \note This function is not aware of unsigned int support in modern OpenGL
+ versions and therefore treats \a value as a GLint and calls glUniform1i.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, GLuint value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniform1i(location, value);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to \a value. This function should be used when setting sampler values.
+
+ \note This function is not aware of unsigned int support in modern OpenGL
+ versions and therefore treats \a value as a GLint and calls glUniform1i.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, GLuint value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to
+ the 2D vector (\a x, \a y).
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, GLfloat x, GLfloat y)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ GLfloat values[2] = {x, y};
+ d->glfuncs->glUniform2fv(location, 1, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context to
+ the 2D vector (\a x, \a y).
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, GLfloat x, GLfloat y)
+{
+ setUniformValue(uniformLocation(name), x, y);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to
+ the 3D vector (\a x, \a y, \a z).
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue
+ (int location, GLfloat x, GLfloat y, GLfloat z)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ GLfloat values[3] = {x, y, z};
+ d->glfuncs->glUniform3fv(location, 1, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context to
+ the 3D vector (\a x, \a y, \a z).
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue
+ (const char *name, GLfloat x, GLfloat y, GLfloat z)
+{
+ setUniformValue(uniformLocation(name), x, y, z);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to
+ the 4D vector (\a x, \a y, \a z, \a w).
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue
+ (int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ GLfloat values[4] = {x, y, z, w};
+ d->glfuncs->glUniform4fv(location, 1, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context to
+ the 4D vector (\a x, \a y, \a z, \a w).
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue
+ (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ setUniformValue(uniformLocation(name), x, y, z, w);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QVector2D& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniform2fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QVector2D& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QVector3D& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniform3fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QVector3D& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QVector4D& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniform4fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QVector4D& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to
+ the red, green, blue, and alpha components of \a color.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QColor& color)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ GLfloat values[4] = {GLfloat(color.redF()), GLfloat(color.greenF()),
+ GLfloat(color.blueF()), GLfloat(color.alphaF())};
+ d->glfuncs->glUniform4fv(location, 1, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context to
+ the red, green, blue, and alpha components of \a color.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QColor& color)
+{
+ setUniformValue(uniformLocation(name), color);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to
+ the x and y coordinates of \a point.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QPoint& point)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ GLfloat values[4] = {GLfloat(point.x()), GLfloat(point.y())};
+ d->glfuncs->glUniform2fv(location, 1, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable associated with \a name in the current
+ context to the x and y coordinates of \a point.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QPoint& point)
+{
+ setUniformValue(uniformLocation(name), point);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to
+ the x and y coordinates of \a point.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QPointF& point)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ GLfloat values[4] = {GLfloat(point.x()), GLfloat(point.y())};
+ d->glfuncs->glUniform2fv(location, 1, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable associated with \a name in the current
+ context to the x and y coordinates of \a point.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QPointF& point)
+{
+ setUniformValue(uniformLocation(name), point);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to
+ the width and height of the given \a size.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QSize& size)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ GLfloat values[4] = {GLfloat(size.width()), GLfloat(size.height())};
+ d->glfuncs->glUniform2fv(location, 1, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable associated with \a name in the current
+ context to the width and height of the given \a size.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QSize& size)
+{
+ setUniformValue(uniformLocation(name), size);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to
+ the width and height of the given \a size.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QSizeF& size)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ GLfloat values[4] = {GLfloat(size.width()), GLfloat(size.height())};
+ d->glfuncs->glUniform2fv(location, 1, values);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable associated with \a name in the current
+ context to the width and height of the given \a size.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QSizeF& size)
+{
+ setUniformValue(uniformLocation(name), size);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context
+ to a 2x2 matrix \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix2x2& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ d->glfuncs->glUniformMatrix2fv(location, 1, GL_FALSE, value.constData());
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 2x2 matrix \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix2x2& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context
+ to a 2x3 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat2x3, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec3.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix2x3& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ d->glfuncs->glUniform3fv(location, 2, value.constData());
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 2x3 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat2x3, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec3.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix2x3& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context
+ to a 2x4 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat2x4, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec4.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix2x4& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ d->glfuncs->glUniform4fv(location, 2, value.constData());
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 2x4 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat2x4, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec4.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix2x4& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context
+ to a 3x2 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat3x2, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec2.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix3x2& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ d->glfuncs->glUniform2fv(location, 3, value.constData());
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 3x2 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat3x2, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec2.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix3x2& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context
+ to a 3x3 matrix \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix3x3& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, value.constData());
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 3x3 matrix \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix3x3& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context
+ to a 3x4 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat3x4, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec4.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix3x4& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ d->glfuncs->glUniform4fv(location, 3, value.constData());
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 3x4 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat3x4, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec4.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix3x4& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context
+ to a 4x2 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat4x2, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec2.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix4x2& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ d->glfuncs->glUniform2fv(location, 4, value.constData());
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 4x2 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat4x2, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec2.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix4x2& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context
+ to a 4x3 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat4x3, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec3.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix4x3& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ d->glfuncs->glUniform3fv(location, 4, value.constData());
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 4x3 matrix \a value.
+
+ \note This function is not aware of non square matrix support,
+ that is, GLSL types like mat4x3, that is present in modern OpenGL
+ versions. Instead, it treats the uniform as an array of vec3.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix4x3& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context
+ to a 4x4 matrix \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QMatrix4x4& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ d->glfuncs->glUniformMatrix4fv(location, 1, GL_FALSE, value.constData());
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 4x4 matrix \a value.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const QMatrix4x4& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable at \a location in the current context
+ to a 2x2 matrix \a value. The matrix elements must be specified
+ in column-major order.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const GLfloat value[2][2])
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniformMatrix2fv(location, 1, GL_FALSE, value[0]);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable at \a location in the current context
+ to a 3x3 matrix \a value. The matrix elements must be specified
+ in column-major order.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const GLfloat value[3][3])
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, value[0]);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable at \a location in the current context
+ to a 4x4 matrix \a value. The matrix elements must be specified
+ in column-major order.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const GLfloat value[4][4])
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniformMatrix4fv(location, 1, GL_FALSE, value[0]);
+}
+
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 2x2 matrix \a value. The matrix elements must be specified
+ in column-major order.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const GLfloat value[2][2])
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 3x3 matrix \a value. The matrix elements must be specified
+ in column-major order.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const GLfloat value[3][3])
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context
+ to a 4x4 matrix \a value. The matrix elements must be specified
+ in column-major order.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValue(const char *name, const GLfloat value[4][4])
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable at \a location in the current context to a
+ 3x3 transformation matrix \a value that is specified as a QTransform value.
+
+ To set a QTransform value as a 4x4 matrix in a shader, use
+ \c{setUniformValue(location, QMatrix4x4(value))}.
+*/
+void QOpenGLShaderProgram::setUniformValue(int location, const QTransform& value)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ GLfloat mat[3][3] = {
+ {GLfloat(value.m11()), GLfloat(value.m12()), GLfloat(value.m13())},
+ {GLfloat(value.m21()), GLfloat(value.m22()), GLfloat(value.m23())},
+ {GLfloat(value.m31()), GLfloat(value.m32()), GLfloat(value.m33())}
+ };
+ d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, mat[0]);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable called \a name in the current context to a
+ 3x3 transformation matrix \a value that is specified as a QTransform value.
+
+ To set a QTransform value as a 4x4 matrix in a shader, use
+ \c{setUniformValue(name, QMatrix4x4(value))}.
+*/
+void QOpenGLShaderProgram::setUniformValue
+ (const char *name, const QTransform& value)
+{
+ setUniformValue(uniformLocation(name), value);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const GLint *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniform1iv(location, count, values);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray
+ (const char *name, const GLint *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count elements of \a values. This overload
+ should be used when setting an array of sampler values.
+
+ \note This function is not aware of unsigned int support in modern OpenGL
+ versions and therefore treats \a values as a GLint and calls glUniform1iv.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const GLuint *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniform1iv(location, count, reinterpret_cast<const GLint *>(values));
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count elements of \a values. This overload
+ should be used when setting an array of sampler values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray
+ (const char *name, const GLuint *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count elements of \a values. Each element
+ has \a tupleSize components. The \a tupleSize must be 1, 2, 3, or 4.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const GLfloat *values, int count, int tupleSize)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1) {
+ if (tupleSize == 1)
+ d->glfuncs->glUniform1fv(location, count, values);
+ else if (tupleSize == 2)
+ d->glfuncs->glUniform2fv(location, count, values);
+ else if (tupleSize == 3)
+ d->glfuncs->glUniform3fv(location, count, values);
+ else if (tupleSize == 4)
+ d->glfuncs->glUniform4fv(location, count, values);
+ else
+ qWarning("QOpenGLShaderProgram::setUniformValue: size %d not supported", tupleSize);
+ }
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count elements of \a values. Each element
+ has \a tupleSize components. The \a tupleSize must be 1, 2, 3, or 4.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray
+ (const char *name, const GLfloat *values, int count, int tupleSize)
+{
+ setUniformValueArray(uniformLocation(name), values, count, tupleSize);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 2D vector elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QVector2D *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniform2fv(location, count, reinterpret_cast<const GLfloat *>(values));
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 2D vector elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QVector2D *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 3D vector elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QVector3D *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniform3fv(location, count, reinterpret_cast<const GLfloat *>(values));
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 3D vector elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QVector3D *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 4D vector elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QVector4D *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ if (location != -1)
+ d->glfuncs->glUniform4fv(location, count, reinterpret_cast<const GLfloat *>(values));
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 4D vector elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QVector4D *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+// We have to repack matrix arrays from qreal to GLfloat.
+#define setUniformMatrixArray(func,location,values,count,type,cols,rows) \
+ if (location == -1 || count <= 0) \
+ return; \
+ if (sizeof(type) == sizeof(GLfloat) * cols * rows) { \
+ func(location, count, GL_FALSE, \
+ reinterpret_cast<const GLfloat *>(values[0].constData())); \
+ } else { \
+ QVarLengthArray<GLfloat> temp(cols * rows * count); \
+ for (int index = 0; index < count; ++index) { \
+ for (int index2 = 0; index2 < (cols * rows); ++index2) { \
+ temp.data()[cols * rows * index + index2] = \
+ values[index].constData()[index2]; \
+ } \
+ } \
+ func(location, count, GL_FALSE, temp.constData()); \
+ }
+#define setUniformGenericMatrixArray(colfunc,location,values,count,type,cols,rows) \
+ if (location == -1 || count <= 0) \
+ return; \
+ if (sizeof(type) == sizeof(GLfloat) * cols * rows) { \
+ const GLfloat *data = reinterpret_cast<const GLfloat *> \
+ (values[0].constData()); \
+ colfunc(location, count * cols, data); \
+ } else { \
+ QVarLengthArray<GLfloat> temp(cols * rows * count); \
+ for (int index = 0; index < count; ++index) { \
+ for (int index2 = 0; index2 < (cols * rows); ++index2) { \
+ temp.data()[cols * rows * index + index2] = \
+ values[index].constData()[index2]; \
+ } \
+ } \
+ colfunc(location, count * cols, temp.constData()); \
+ }
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 2x2 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix2x2 *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ setUniformMatrixArray
+ (d->glfuncs->glUniformMatrix2fv, location, values, count, QMatrix2x2, 2, 2);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 2x2 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x2 *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 2x3 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix2x3 *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ setUniformGenericMatrixArray
+ (d->glfuncs->glUniform3fv, location, values, count,
+ QMatrix2x3, 2, 3);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 2x3 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x3 *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 2x4 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix2x4 *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ setUniformGenericMatrixArray
+ (d->glfuncs->glUniform4fv, location, values, count,
+ QMatrix2x4, 2, 4);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 2x4 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x4 *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 3x2 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix3x2 *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ setUniformGenericMatrixArray
+ (d->glfuncs->glUniform2fv, location, values, count,
+ QMatrix3x2, 3, 2);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 3x2 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x2 *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 3x3 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix3x3 *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ setUniformMatrixArray
+ (d->glfuncs->glUniformMatrix3fv, location, values, count, QMatrix3x3, 3, 3);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 3x3 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x3 *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 3x4 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix3x4 *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ setUniformGenericMatrixArray
+ (d->glfuncs->glUniform4fv, location, values, count,
+ QMatrix3x4, 3, 4);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 3x4 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x4 *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 4x2 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix4x2 *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ setUniformGenericMatrixArray
+ (d->glfuncs->glUniform2fv, location, values, count,
+ QMatrix4x2, 4, 2);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 4x2 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4x2 *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 4x3 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix4x3 *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ setUniformGenericMatrixArray
+ (d->glfuncs->glUniform3fv, location, values, count,
+ QMatrix4x3, 4, 3);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 4x3 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4x3 *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Sets the uniform variable array at \a location in the current
+ context to the \a count 4x4 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(int location, const QMatrix4x4 *values, int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ Q_UNUSED(d);
+ setUniformMatrixArray
+ (d->glfuncs->glUniformMatrix4fv, location, values, count, QMatrix4x4, 4, 4);
+}
+
+/*!
+ \overload
+
+ Sets the uniform variable array called \a name in the current
+ context to the \a count 4x4 matrix elements of \a values.
+
+ \sa setAttributeValue()
+*/
+void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4x4 *values, int count)
+{
+ setUniformValueArray(uniformLocation(name), values, count);
+}
+
+/*!
+ Returns the hardware limit for how many vertices a geometry shader
+ can output.
+*/
+int QOpenGLShaderProgram::maxGeometryOutputVertices() const
+{
+ GLint n = 0;
+ Q_D(const QOpenGLShaderProgram);
+ d->glfuncs->glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &n);
+ return n;
+}
+
+/*!
+ Use this function to specify to OpenGL the number of vertices in
+ a patch to \a count. A patch is a custom OpenGL primitive whose interpretation
+ is entirely defined by the tessellation shader stages. Therefore, calling
+ this function only makes sense when using a QOpenGLShaderProgram
+ containing tessellation stage shaders. When using OpenGL tessellation,
+ the only primitive that can be rendered with \c{glDraw*()} functions is
+ \c{GL_PATCHES}.
+
+ This is equivalent to calling glPatchParameteri(GL_PATCH_VERTICES, count).
+
+ \note This modifies global OpenGL state and is not specific to this
+ QOpenGLShaderProgram instance. You should call this in your render
+ function when needed, as QOpenGLShaderProgram will not apply this for
+ you. This is purely a convenience function.
+
+ \sa patchVertexCount()
+*/
+void QOpenGLShaderProgram::setPatchVertexCount(int count)
+{
+ Q_D(QOpenGLShaderProgram);
+ d->glfuncs->glPatchParameteri(GL_PATCH_VERTICES, count);
+}
+
+/*!
+ Returns the number of vertices per-patch to be used when rendering.
+
+ \note This returns the global OpenGL state value. It is not specific to
+ this QOpenGLShaderProgram instance.
+
+ \sa setPatchVertexCount()
+*/
+int QOpenGLShaderProgram::patchVertexCount() const
+{
+ int patchVertices = 0;
+ Q_D(const QOpenGLShaderProgram);
+ d->glfuncs->glGetIntegerv(GL_PATCH_VERTICES, &patchVertices);
+ return patchVertices;
+}
+
+/*!
+ Sets the default outer tessellation levels to be used by the tessellation
+ primitive generator in the event that the tessellation control shader
+ does not output them to \a levels. For more details on OpenGL and Tessellation
+ shaders see \l{OpenGL Tessellation Shaders}.
+
+ The \a levels argument should be a QVector consisting of 4 floats. Not all
+ of the values make sense for all tessellation modes. If you specify a vector with
+ fewer than 4 elements, the remaining elements will be given a default value of 1.
+
+ \note This modifies global OpenGL state and is not specific to this
+ QOpenGLShaderProgram instance. You should call this in your render
+ function when needed, as QOpenGLShaderProgram will not apply this for
+ you. This is purely a convenience function.
+
+ \note This function is only available with OpenGL >= 4.0 and is not supported
+ with OpenGL ES 3.2.
+
+ \sa defaultOuterTessellationLevels(), setDefaultInnerTessellationLevels()
+*/
+void QOpenGLShaderProgram::setDefaultOuterTessellationLevels(const QVector<float> &levels)
+{
+#if !QT_CONFIG(opengles2)
+ Q_D(QOpenGLShaderProgram);
+ if (d->tessellationFuncs) {
+ QVector<float> tessLevels = levels;
+
+ // Ensure we have the required 4 outer tessellation levels
+ // Use default of 1 for missing entries (same as spec)
+ const int argCount = 4;
+ if (tessLevels.size() < argCount) {
+ tessLevels.reserve(argCount);
+ for (int i = tessLevels.size(); i < argCount; ++i)
+ tessLevels.append(1.0f);
+ }
+ d->tessellationFuncs->glPatchParameterfv(GL_PATCH_DEFAULT_OUTER_LEVEL, tessLevels.data());
+ }
+#else
+ Q_UNUSED(levels);
+#endif
+}
+
+/*!
+ Returns the default outer tessellation levels to be used by the tessellation
+ primitive generator in the event that the tessellation control shader
+ does not output them. For more details on OpenGL and Tessellation shaders see
+ \l{OpenGL Tessellation Shaders}.
+
+ Returns a QVector of floats describing the outer tessellation levels. The vector
+ will always have four elements but not all of them make sense for every mode
+ of tessellation.
+
+ \note This returns the global OpenGL state value. It is not specific to
+ this QOpenGLShaderProgram instance.
+
+ \note This function is only supported with OpenGL >= 4.0 and will not
+ return valid results with OpenGL ES 3.2.
+
+ \sa setDefaultOuterTessellationLevels(), defaultInnerTessellationLevels()
+*/
+QVector<float> QOpenGLShaderProgram::defaultOuterTessellationLevels() const
+{
+#if !QT_CONFIG(opengles2)
+ QVector<float> tessLevels(4, 1.0f);
+ Q_D(const QOpenGLShaderProgram);
+ if (d->tessellationFuncs)
+ d->tessellationFuncs->glGetFloatv(GL_PATCH_DEFAULT_OUTER_LEVEL, tessLevels.data());
+ return tessLevels;
+#else
+ return QVector<float>();
+#endif
+}
+
+/*!
+ Sets the default outer tessellation levels to be used by the tessellation
+ primitive generator in the event that the tessellation control shader
+ does not output them to \a levels. For more details on OpenGL and Tessellation shaders see
+ \l{OpenGL Tessellation Shaders}.
+
+ The \a levels argument should be a QVector consisting of 2 floats. Not all
+ of the values make sense for all tessellation modes. If you specify a vector with
+ fewer than 2 elements, the remaining elements will be given a default value of 1.
+
+ \note This modifies global OpenGL state and is not specific to this
+ QOpenGLShaderProgram instance. You should call this in your render
+ function when needed, as QOpenGLShaderProgram will not apply this for
+ you. This is purely a convenience function.
+
+ \note This function is only available with OpenGL >= 4.0 and is not supported
+ with OpenGL ES 3.2.
+
+ \sa defaultInnerTessellationLevels(), setDefaultOuterTessellationLevels()
+*/
+void QOpenGLShaderProgram::setDefaultInnerTessellationLevels(const QVector<float> &levels)
+{
+#if !QT_CONFIG(opengles2)
+ Q_D(QOpenGLShaderProgram);
+ if (d->tessellationFuncs) {
+ QVector<float> tessLevels = levels;
+
+ // Ensure we have the required 2 inner tessellation levels
+ // Use default of 1 for missing entries (same as spec)
+ const int argCount = 2;
+ if (tessLevels.size() < argCount) {
+ tessLevels.reserve(argCount);
+ for (int i = tessLevels.size(); i < argCount; ++i)
+ tessLevels.append(1.0f);
+ }
+ d->tessellationFuncs->glPatchParameterfv(GL_PATCH_DEFAULT_INNER_LEVEL, tessLevels.data());
+ }
+#else
+ Q_UNUSED(levels);
+#endif
+}
+
+/*!
+ Returns the default inner tessellation levels to be used by the tessellation
+ primitive generator in the event that the tessellation control shader
+ does not output them. For more details on OpenGL and Tessellation shaders see
+ \l{OpenGL Tessellation Shaders}.
+
+ Returns a QVector of floats describing the inner tessellation levels. The vector
+ will always have two elements but not all of them make sense for every mode
+ of tessellation.
+
+ \note This returns the global OpenGL state value. It is not specific to
+ this QOpenGLShaderProgram instance.
+
+ \note This function is only supported with OpenGL >= 4.0 and will not
+ return valid results with OpenGL ES 3.2.
+
+ \sa setDefaultInnerTessellationLevels(), defaultOuterTessellationLevels()
+*/
+QVector<float> QOpenGLShaderProgram::defaultInnerTessellationLevels() const
+{
+#if !QT_CONFIG(opengles2)
+ QVector<float> tessLevels(2, 1.0f);
+ Q_D(const QOpenGLShaderProgram);
+ if (d->tessellationFuncs)
+ d->tessellationFuncs->glGetFloatv(GL_PATCH_DEFAULT_INNER_LEVEL, tessLevels.data());
+ return tessLevels;
+#else
+ return QVector<float>();
+#endif
+}
+
+
+/*!
+ Returns \c true if shader programs written in the OpenGL Shading
+ Language (GLSL) are supported on this system; false otherwise.
+
+ The \a context is used to resolve the GLSL extensions.
+ If \a context is \nullptr, then QOpenGLContext::currentContext()
+ is used.
+*/
+bool QOpenGLShaderProgram::hasOpenGLShaderPrograms(QOpenGLContext *context)
+{
+ if (!context)
+ context = QOpenGLContext::currentContext();
+ if (!context)
+ return false;
+ return QOpenGLFunctions(context).hasOpenGLFeature(QOpenGLFunctions::Shaders);
+}
+
+/*!
+ \internal
+*/
+void QOpenGLShaderProgram::shaderDestroyed()
+{
+ Q_D(QOpenGLShaderProgram);
+ QOpenGLShader *shader = qobject_cast<QOpenGLShader *>(sender());
+ if (shader && !d->removingShaders)
+ removeShader(shader);
+}
+
+/*!
+ Returns \c true if shader programs of type \a type are supported on
+ this system; false otherwise.
+
+ The \a context is used to resolve the GLSL extensions.
+ If \a context is \nullptr, then QOpenGLContext::currentContext()
+ is used.
+*/
+bool QOpenGLShader::hasOpenGLShaders(ShaderType type, QOpenGLContext *context)
+{
+ if (!context)
+ context = QOpenGLContext::currentContext();
+ if (!context)
+ return false;
+
+ if ((type & ~(Geometry | Vertex | Fragment | TessellationControl | TessellationEvaluation | Compute)) || type == 0)
+ return false;
+
+ if (type & QOpenGLShader::Geometry)
+ return supportsGeometry(context->format());
+ else if (type & (QOpenGLShader::TessellationControl | QOpenGLShader::TessellationEvaluation))
+ return supportsTessellation(context->format());
+ else if (type & QOpenGLShader::Compute)
+ return supportsCompute(context->format());
+
+ // Unconditional support of vertex and fragment shaders implicitly assumes
+ // a minimum OpenGL version of 2.0
+ return true;
+}
+
+bool QOpenGLShaderProgramPrivate::isCacheDisabled() const
+{
+ static QOpenGLProgramBinarySupportCheckWrapper binSupportCheck;
+ return !binSupportCheck.get(QOpenGLContext::currentContext())->isSupported();
+}
+
+bool QOpenGLShaderProgramPrivate::compileCacheable()
+{
+ Q_Q(QOpenGLShaderProgram);
+ for (const QOpenGLProgramBinaryCache::ShaderDesc &shader : qAsConst(binaryProgram.shaders)) {
+ QScopedPointer<QOpenGLShader> s(new QOpenGLShader(qt_shaderStageToType(shader.stage), q));
+ if (!s->compileSourceCode(shader.source)) {
+ log = s->log();
+ return false;
+ }
+ anonShaders.append(s.take());
+ if (!q->addShader(anonShaders.last()))
+ return false;
+ }
+ return true;
+}
+
+bool QOpenGLShaderProgramPrivate::linkBinary()
+{
+ static QOpenGLProgramBinaryCache binCache;
+
+ Q_Q(QOpenGLShaderProgram);
+
+ const QByteArray cacheKey = binaryProgram.cacheKey();
+ if (lcOpenGLProgramDiskCache().isEnabled(QtDebugMsg))
+ qCDebug(lcOpenGLProgramDiskCache, "program with %d shaders, cache key %s",
+ binaryProgram.shaders.count(), cacheKey.constData());
+
+ bool needsCompile = true;
+ if (binCache.load(cacheKey, q->programId())) {
+ qCDebug(lcOpenGLProgramDiskCache, "Program binary received from cache");
+ needsCompile = false;
+ }
+
+ bool needsSave = false;
+ if (needsCompile) {
+ qCDebug(lcOpenGLProgramDiskCache, "Program binary not in cache, compiling");
+ if (compileCacheable())
+ needsSave = true;
+ else
+ return false;
+ }
+
+ linkBinaryRecursion = true;
+ bool ok = q->link();
+ linkBinaryRecursion = false;
+ if (ok && needsSave)
+ binCache.save(cacheKey, q->programId());
+
+ return ok;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglshaderprogram.h b/src/opengl/qopenglshaderprogram.h
new file mode 100644
index 0000000000..87da4fc072
--- /dev/null
+++ b/src/opengl/qopenglshaderprogram.h
@@ -0,0 +1,314 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLSHADERPROGRAM_H
+#define QOPENGLSHADERPROGRAM_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#include <QtGui/qopengl.h>
+#include <QtGui/qvector2d.h>
+#include <QtGui/qvector3d.h>
+#include <QtGui/qvector4d.h>
+#include <QtGui/qmatrix4x4.h>
+
+QT_BEGIN_NAMESPACE
+
+
+class QOpenGLContext;
+class QOpenGLShaderProgram;
+class QOpenGLShaderPrivate;
+
+class Q_OPENGL_EXPORT QOpenGLShader : public QObject
+{
+ Q_OBJECT
+public:
+ enum ShaderTypeBit
+ {
+ Vertex = 0x0001,
+ Fragment = 0x0002,
+ Geometry = 0x0004,
+ TessellationControl = 0x0008,
+ TessellationEvaluation = 0x0010,
+ Compute = 0x0020
+ };
+ Q_DECLARE_FLAGS(ShaderType, ShaderTypeBit)
+
+ explicit QOpenGLShader(QOpenGLShader::ShaderType type, QObject *parent = nullptr);
+ ~QOpenGLShader();
+
+ QOpenGLShader::ShaderType shaderType() const;
+
+ bool compileSourceCode(const char *source);
+ bool compileSourceCode(const QByteArray& source);
+ bool compileSourceCode(const QString& source);
+ bool compileSourceFile(const QString& fileName);
+
+ QByteArray sourceCode() const;
+
+ bool isCompiled() const;
+ QString log() const;
+
+ GLuint shaderId() const;
+
+ static bool hasOpenGLShaders(ShaderType type, QOpenGLContext *context = nullptr);
+
+private:
+ friend class QOpenGLShaderProgram;
+
+ Q_DISABLE_COPY(QOpenGLShader)
+ Q_DECLARE_PRIVATE(QOpenGLShader)
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLShader::ShaderType)
+
+
+class QOpenGLShaderProgramPrivate;
+
+class Q_OPENGL_EXPORT QOpenGLShaderProgram : public QObject
+{
+ Q_OBJECT
+public:
+ explicit QOpenGLShaderProgram(QObject *parent = nullptr);
+ ~QOpenGLShaderProgram();
+
+ bool addShader(QOpenGLShader *shader);
+ void removeShader(QOpenGLShader *shader);
+ QList<QOpenGLShader *> shaders() const;
+
+ bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source);
+ bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray& source);
+ bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString& source);
+ bool addShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString& fileName);
+
+ bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source);
+ bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray &source);
+ bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString &source);
+ bool addCacheableShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString &fileName);
+
+ void removeAllShaders();
+
+ virtual bool link();
+ bool isLinked() const;
+ QString log() const;
+
+ bool bind();
+ void release();
+
+ bool create();
+
+ GLuint programId() const;
+
+ int maxGeometryOutputVertices() const;
+
+ void setPatchVertexCount(int count);
+ int patchVertexCount() const;
+
+ void setDefaultOuterTessellationLevels(const QVector<float> &levels);
+ QVector<float> defaultOuterTessellationLevels() const;
+
+ void setDefaultInnerTessellationLevels(const QVector<float> &levels);
+ QVector<float> defaultInnerTessellationLevels() const;
+
+ void bindAttributeLocation(const char *name, int location);
+ void bindAttributeLocation(const QByteArray& name, int location);
+ void bindAttributeLocation(const QString& name, int location);
+
+ int attributeLocation(const char *name) const;
+ int attributeLocation(const QByteArray& name) const;
+ int attributeLocation(const QString& name) const;
+
+ void setAttributeValue(int location, GLfloat value);
+ void setAttributeValue(int location, GLfloat x, GLfloat y);
+ void setAttributeValue(int location, GLfloat x, GLfloat y, GLfloat z);
+ void setAttributeValue(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void setAttributeValue(int location, const QVector2D& value);
+ void setAttributeValue(int location, const QVector3D& value);
+ void setAttributeValue(int location, const QVector4D& value);
+ void setAttributeValue(int location, const QColor& value);
+ void setAttributeValue(int location, const GLfloat *values, int columns, int rows);
+
+ void setAttributeValue(const char *name, GLfloat value);
+ void setAttributeValue(const char *name, GLfloat x, GLfloat y);
+ void setAttributeValue(const char *name, GLfloat x, GLfloat y, GLfloat z);
+ void setAttributeValue(const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void setAttributeValue(const char *name, const QVector2D& value);
+ void setAttributeValue(const char *name, const QVector3D& value);
+ void setAttributeValue(const char *name, const QVector4D& value);
+ void setAttributeValue(const char *name, const QColor& value);
+ void setAttributeValue(const char *name, const GLfloat *values, int columns, int rows);
+
+ void setAttributeArray
+ (int location, const GLfloat *values, int tupleSize, int stride = 0);
+ void setAttributeArray
+ (int location, const QVector2D *values, int stride = 0);
+ void setAttributeArray
+ (int location, const QVector3D *values, int stride = 0);
+ void setAttributeArray
+ (int location, const QVector4D *values, int stride = 0);
+ void setAttributeArray
+ (int location, GLenum type, const void *values, int tupleSize, int stride = 0);
+ void setAttributeArray
+ (const char *name, const GLfloat *values, int tupleSize, int stride = 0);
+ void setAttributeArray
+ (const char *name, const QVector2D *values, int stride = 0);
+ void setAttributeArray
+ (const char *name, const QVector3D *values, int stride = 0);
+ void setAttributeArray
+ (const char *name, const QVector4D *values, int stride = 0);
+ void setAttributeArray
+ (const char *name, GLenum type, const void *values, int tupleSize, int stride = 0);
+
+ void setAttributeBuffer
+ (int location, GLenum type, int offset, int tupleSize, int stride = 0);
+ void setAttributeBuffer
+ (const char *name, GLenum type, int offset, int tupleSize, int stride = 0);
+
+ void enableAttributeArray(int location);
+ void enableAttributeArray(const char *name);
+ void disableAttributeArray(int location);
+ void disableAttributeArray(const char *name);
+
+ int uniformLocation(const char *name) const;
+ int uniformLocation(const QByteArray& name) const;
+ int uniformLocation(const QString& name) const;
+
+ void setUniformValue(int location, GLfloat value);
+ void setUniformValue(int location, GLint value);
+ void setUniformValue(int location, GLuint value);
+ void setUniformValue(int location, GLfloat x, GLfloat y);
+ void setUniformValue(int location, GLfloat x, GLfloat y, GLfloat z);
+ void setUniformValue(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void setUniformValue(int location, const QVector2D& value);
+ void setUniformValue(int location, const QVector3D& value);
+ void setUniformValue(int location, const QVector4D& value);
+ void setUniformValue(int location, const QColor& color);
+ void setUniformValue(int location, const QPoint& point);
+ void setUniformValue(int location, const QPointF& point);
+ void setUniformValue(int location, const QSize& size);
+ void setUniformValue(int location, const QSizeF& size);
+ void setUniformValue(int location, const QMatrix2x2& value);
+ void setUniformValue(int location, const QMatrix2x3& value);
+ void setUniformValue(int location, const QMatrix2x4& value);
+ void setUniformValue(int location, const QMatrix3x2& value);
+ void setUniformValue(int location, const QMatrix3x3& value);
+ void setUniformValue(int location, const QMatrix3x4& value);
+ void setUniformValue(int location, const QMatrix4x2& value);
+ void setUniformValue(int location, const QMatrix4x3& value);
+ void setUniformValue(int location, const QMatrix4x4& value);
+ void setUniformValue(int location, const GLfloat value[2][2]);
+ void setUniformValue(int location, const GLfloat value[3][3]);
+ void setUniformValue(int location, const GLfloat value[4][4]);
+ void setUniformValue(int location, const QTransform& value);
+
+ void setUniformValue(const char *name, GLfloat value);
+ void setUniformValue(const char *name, GLint value);
+ void setUniformValue(const char *name, GLuint value);
+ void setUniformValue(const char *name, GLfloat x, GLfloat y);
+ void setUniformValue(const char *name, GLfloat x, GLfloat y, GLfloat z);
+ void setUniformValue(const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ void setUniformValue(const char *name, const QVector2D& value);
+ void setUniformValue(const char *name, const QVector3D& value);
+ void setUniformValue(const char *name, const QVector4D& value);
+ void setUniformValue(const char *name, const QColor& color);
+ void setUniformValue(const char *name, const QPoint& point);
+ void setUniformValue(const char *name, const QPointF& point);
+ void setUniformValue(const char *name, const QSize& size);
+ void setUniformValue(const char *name, const QSizeF& size);
+ void setUniformValue(const char *name, const QMatrix2x2& value);
+ void setUniformValue(const char *name, const QMatrix2x3& value);
+ void setUniformValue(const char *name, const QMatrix2x4& value);
+ void setUniformValue(const char *name, const QMatrix3x2& value);
+ void setUniformValue(const char *name, const QMatrix3x3& value);
+ void setUniformValue(const char *name, const QMatrix3x4& value);
+ void setUniformValue(const char *name, const QMatrix4x2& value);
+ void setUniformValue(const char *name, const QMatrix4x3& value);
+ void setUniformValue(const char *name, const QMatrix4x4& value);
+ void setUniformValue(const char *name, const GLfloat value[2][2]);
+ void setUniformValue(const char *name, const GLfloat value[3][3]);
+ void setUniformValue(const char *name, const GLfloat value[4][4]);
+ void setUniformValue(const char *name, const QTransform& value);
+
+ void setUniformValueArray(int location, const GLfloat *values, int count, int tupleSize);
+ void setUniformValueArray(int location, const GLint *values, int count);
+ void setUniformValueArray(int location, const GLuint *values, int count);
+ void setUniformValueArray(int location, const QVector2D *values, int count);
+ void setUniformValueArray(int location, const QVector3D *values, int count);
+ void setUniformValueArray(int location, const QVector4D *values, int count);
+ void setUniformValueArray(int location, const QMatrix2x2 *values, int count);
+ void setUniformValueArray(int location, const QMatrix2x3 *values, int count);
+ void setUniformValueArray(int location, const QMatrix2x4 *values, int count);
+ void setUniformValueArray(int location, const QMatrix3x2 *values, int count);
+ void setUniformValueArray(int location, const QMatrix3x3 *values, int count);
+ void setUniformValueArray(int location, const QMatrix3x4 *values, int count);
+ void setUniformValueArray(int location, const QMatrix4x2 *values, int count);
+ void setUniformValueArray(int location, const QMatrix4x3 *values, int count);
+ void setUniformValueArray(int location, const QMatrix4x4 *values, int count);
+
+ void setUniformValueArray(const char *name, const GLfloat *values, int count, int tupleSize);
+ void setUniformValueArray(const char *name, const GLint *values, int count);
+ void setUniformValueArray(const char *name, const GLuint *values, int count);
+ void setUniformValueArray(const char *name, const QVector2D *values, int count);
+ void setUniformValueArray(const char *name, const QVector3D *values, int count);
+ void setUniformValueArray(const char *name, const QVector4D *values, int count);
+ void setUniformValueArray(const char *name, const QMatrix2x2 *values, int count);
+ void setUniformValueArray(const char *name, const QMatrix2x3 *values, int count);
+ void setUniformValueArray(const char *name, const QMatrix2x4 *values, int count);
+ void setUniformValueArray(const char *name, const QMatrix3x2 *values, int count);
+ void setUniformValueArray(const char *name, const QMatrix3x3 *values, int count);
+ void setUniformValueArray(const char *name, const QMatrix3x4 *values, int count);
+ void setUniformValueArray(const char *name, const QMatrix4x2 *values, int count);
+ void setUniformValueArray(const char *name, const QMatrix4x3 *values, int count);
+ void setUniformValueArray(const char *name, const QMatrix4x4 *values, int count);
+
+ static bool hasOpenGLShaderPrograms(QOpenGLContext *context = nullptr);
+
+private Q_SLOTS:
+ void shaderDestroyed();
+
+private:
+ Q_DISABLE_COPY(QOpenGLShaderProgram)
+ Q_DECLARE_PRIVATE(QOpenGLShaderProgram)
+
+ bool init();
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/opengl/qopengltexture.cpp b/src/opengl/qopengltexture.cpp
new file mode 100644
index 0000000000..a306e2eab8
--- /dev/null
+++ b/src/opengl/qopengltexture.cpp
@@ -0,0 +1,4989 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopengltexture.h"
+#include "qopengltexture_p.h"
+#include "qopengltexturehelper_p.h"
+#include "qopenglfunctions.h"
+#include <QtGui/qcolor.h>
+#include <QtGui/qopenglcontext.h>
+#include <QtCore/qdebug.h>
+#include <private/qobject_p.h>
+#include <private/qopenglcontext_p.h>
+
+QT_BEGIN_NAMESPACE
+
+//this is to work around GL_TEXTURE_WRAP_R_OES which also has 0x8072 as value
+#if !defined(GL_TEXTURE_WRAP_R)
+ #define GL_TEXTURE_WRAP_R 0x8072
+#endif
+
+QOpenGLTexturePrivate::QOpenGLTexturePrivate(QOpenGLTexture::Target textureTarget,
+ QOpenGLTexture *qq)
+ : q_ptr(qq),
+ context(nullptr),
+ target(textureTarget),
+ textureId(0),
+ format(QOpenGLTexture::NoFormat),
+ formatClass(QOpenGLTexture::NoFormatClass),
+ requestedMipLevels(1),
+ mipLevels(-1),
+ layers(1),
+ faces(1),
+ samples(0),
+ fixedSamplePositions(true),
+ baseLevel(0),
+ maxLevel(1000),
+ depthStencilMode(QOpenGLTexture::DepthMode),
+ comparisonFunction(QOpenGLTexture::CompareLessEqual),
+ comparisonMode(QOpenGLTexture::CompareNone),
+ minFilter(QOpenGLTexture::Nearest),
+ magFilter(QOpenGLTexture::Nearest),
+ maxAnisotropy(1.0f),
+ minLevelOfDetail(-1000.0f),
+ maxLevelOfDetail(1000.0f),
+ levelOfDetailBias(0.0f),
+ textureView(false),
+ autoGenerateMipMaps(true),
+ storageAllocated(false),
+ texFuncs(nullptr),
+ functions(nullptr)
+{
+ dimensions[0] = dimensions[1] = dimensions[2] = 1;
+
+ switch (target) {
+ case QOpenGLTexture::Target1D:
+ bindingTarget = QOpenGLTexture::BindingTarget1D;
+ break;
+ case QOpenGLTexture::Target1DArray:
+ bindingTarget = QOpenGLTexture::BindingTarget1DArray;
+ break;
+ case QOpenGLTexture::Target2D:
+ bindingTarget = QOpenGLTexture::BindingTarget2D;
+ break;
+ case QOpenGLTexture::Target2DArray:
+ bindingTarget = QOpenGLTexture::BindingTarget2DArray;
+ break;
+ case QOpenGLTexture::Target3D:
+ bindingTarget = QOpenGLTexture::BindingTarget3D;
+ break;
+ case QOpenGLTexture::TargetCubeMap:
+ bindingTarget = QOpenGLTexture::BindingTargetCubeMap;
+ faces = 6;
+ break;
+ case QOpenGLTexture::TargetCubeMapArray:
+ bindingTarget = QOpenGLTexture::BindingTargetCubeMapArray;
+ faces = 6;
+ break;
+ case QOpenGLTexture::Target2DMultisample:
+ bindingTarget = QOpenGLTexture::BindingTarget2DMultisample;
+ break;
+ case QOpenGLTexture::Target2DMultisampleArray:
+ bindingTarget = QOpenGLTexture::BindingTarget2DMultisampleArray;
+ break;
+ case QOpenGLTexture::TargetRectangle:
+ bindingTarget = QOpenGLTexture::BindingTargetRectangle;
+ break;
+ case QOpenGLTexture::TargetBuffer:
+ bindingTarget = QOpenGLTexture::BindingTargetBuffer;
+ break;
+ }
+
+ swizzleMask[0] = QOpenGLTexture::RedValue;
+ swizzleMask[1] = QOpenGLTexture::GreenValue;
+ swizzleMask[2] = QOpenGLTexture::BlueValue;
+ swizzleMask[3] = QOpenGLTexture::AlphaValue;
+
+ wrapModes[0] = wrapModes[1] = wrapModes[2] = target == QOpenGLTexture::TargetRectangle
+ ? QOpenGLTexture::ClampToEdge : QOpenGLTexture::Repeat;
+}
+
+QOpenGLTexturePrivate::~QOpenGLTexturePrivate()
+{
+ destroy();
+}
+
+void QOpenGLTexturePrivate::initializeOpenGLFunctions()
+{
+ // If we already have a functions object, there is nothing to do
+ if (texFuncs)
+ return;
+
+ // See if the context already has a suitable resource we can use.
+ // If not create a functions object and add it to the context in case
+ // others wish to use it too
+ texFuncs = context->textureFunctions();
+ if (!texFuncs) {
+ texFuncs = new QOpenGLTextureHelper(context);
+ auto *funcs = texFuncs; // lets us capture by pointer value below
+ context->setTextureFunctions(funcs, [funcs] { delete funcs; });
+ }
+}
+
+bool QOpenGLTexturePrivate::create()
+{
+ if (textureId != 0)
+ return true;
+
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (!ctx) {
+ qWarning("Requires a valid current OpenGL context.\n"
+ "Texture has not been created");
+ return false;
+ }
+ context = ctx;
+ functions = ctx->functions();
+
+ // Resolve any functions we will need based upon context version and create the texture
+ initializeOpenGLFunctions();
+
+ // What features do we have?
+ QOpenGLTexture::Feature feature = QOpenGLTexture::ImmutableStorage;
+ while (feature != QOpenGLTexture::MaxFeatureFlag) {
+ if (QOpenGLTexture::hasFeature(feature))
+ features |= feature;
+ feature = static_cast<QOpenGLTexture::Feature>(feature << 1);
+ }
+
+ functions->glGenTextures(1, &textureId);
+ return textureId != 0;
+}
+
+void QOpenGLTexturePrivate::destroy()
+{
+ if (!textureId) {
+ // not created or already destroyed
+ return;
+ }
+ QOpenGLContext *currentContext = QOpenGLContext::currentContext();
+ if (!currentContext) {
+ qWarning("QOpenGLTexturePrivate::destroy() called without a current context.\n"
+ "Texture has not been destroyed");
+ return;
+ }
+ if (!QOpenGLContext::areSharing(currentContext, context)) {
+
+ qWarning("QOpenGLTexturePrivate::destroy() called but texture context %p"
+ " is not shared with current context %p.\n"
+ "Texture has not been destroyed",
+ static_cast<const void *>(context),
+ static_cast<const void *>(currentContext));
+ return;
+ }
+
+ functions->glDeleteTextures(1, &textureId);
+
+ context = nullptr;
+ functions = nullptr;
+ textureId = 0;
+ format = QOpenGLTexture::NoFormat;
+ formatClass = QOpenGLTexture::NoFormatClass;
+ requestedMipLevels = 1;
+ mipLevels = -1;
+ layers = 1;
+ faces = 1;
+ samples = 0;
+ fixedSamplePositions = true,
+ baseLevel = 0;
+ maxLevel = 1000;
+ depthStencilMode = QOpenGLTexture::DepthMode;
+ minFilter = QOpenGLTexture::Nearest;
+ magFilter = QOpenGLTexture::Nearest;
+ maxAnisotropy = 1.0f;
+ minLevelOfDetail = -1000.0f;
+ maxLevelOfDetail = 1000.0f;
+ levelOfDetailBias = 0.0f;
+ textureView = false;
+ autoGenerateMipMaps = true;
+ storageAllocated = false;
+ texFuncs = nullptr;
+
+ swizzleMask[0] = QOpenGLTexture::RedValue;
+ swizzleMask[1] = QOpenGLTexture::GreenValue;
+ swizzleMask[2] = QOpenGLTexture::BlueValue;
+ swizzleMask[3] = QOpenGLTexture::AlphaValue;
+
+ wrapModes[0] = wrapModes[1] = wrapModes[2] = target == QOpenGLTexture::TargetRectangle
+ ? QOpenGLTexture::ClampToEdge : QOpenGLTexture::Repeat;
+}
+
+void QOpenGLTexturePrivate::bind()
+{
+ functions->glBindTexture(target, textureId);
+}
+
+void QOpenGLTexturePrivate::bind(uint unit, QOpenGLTexture::TextureUnitReset reset)
+{
+ GLint oldTextureUnit = 0;
+ if (reset == QOpenGLTexture::ResetTextureUnit)
+ functions->glGetIntegerv(GL_ACTIVE_TEXTURE, &oldTextureUnit);
+
+ texFuncs->glActiveTexture(GL_TEXTURE0 + unit);
+ functions->glBindTexture(target, textureId);
+
+ if (reset == QOpenGLTexture::ResetTextureUnit)
+ texFuncs->glActiveTexture(GL_TEXTURE0 + oldTextureUnit);
+}
+
+void QOpenGLTexturePrivate::release()
+{
+ functions->glBindTexture(target, 0);
+}
+
+void QOpenGLTexturePrivate::release(uint unit, QOpenGLTexture::TextureUnitReset reset)
+{
+ GLint oldTextureUnit = 0;
+ if (reset == QOpenGLTexture::ResetTextureUnit)
+ functions->glGetIntegerv(GL_ACTIVE_TEXTURE, &oldTextureUnit);
+
+ texFuncs->glActiveTexture(GL_TEXTURE0 + unit);
+ functions->glBindTexture(target, 0);
+
+ if (reset == QOpenGLTexture::ResetTextureUnit)
+ texFuncs->glActiveTexture(GL_TEXTURE0 + oldTextureUnit);
+}
+
+bool QOpenGLTexturePrivate::isBound() const
+{
+ GLint boundTextureId = 0;
+ functions->glGetIntegerv(bindingTarget, &boundTextureId);
+ return (static_cast<GLuint>(boundTextureId) == textureId);
+}
+
+bool QOpenGLTexturePrivate::isBound(uint unit) const
+{
+ GLint oldTextureUnit = 0;
+ functions->glGetIntegerv(GL_ACTIVE_TEXTURE, &oldTextureUnit);
+
+ GLint boundTextureId = 0;
+ texFuncs->glActiveTexture(GL_TEXTURE0 + unit);
+ functions->glGetIntegerv(bindingTarget, &boundTextureId);
+ bool result = (static_cast<GLuint>(boundTextureId) == textureId);
+
+ texFuncs->glActiveTexture(GL_TEXTURE0 + oldTextureUnit);
+ return result;
+}
+
+int QOpenGLTexturePrivate::evaluateMipLevels() const
+{
+ switch (target) {
+ case QOpenGLTexture::Target1D:
+ case QOpenGLTexture::Target1DArray:
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::Target2DArray:
+ case QOpenGLTexture::Target3D:
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetCubeMapArray:
+ return qMin(maximumMipLevelCount(), qMax(1, requestedMipLevels));
+
+ case QOpenGLTexture::TargetRectangle:
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ case QOpenGLTexture::TargetBuffer:
+ default:
+ return 1;
+ }
+}
+
+static bool isSizedTextureFormat(QOpenGLTexture::TextureFormat internalFormat)
+{
+ switch (internalFormat) {
+ case QOpenGLTexture::NoFormat:
+ return false;
+
+ case QOpenGLTexture::R8_UNorm:
+ case QOpenGLTexture::RG8_UNorm:
+ case QOpenGLTexture::RGB8_UNorm:
+ case QOpenGLTexture::RGBA8_UNorm:
+ case QOpenGLTexture::R16_UNorm:
+ case QOpenGLTexture::RG16_UNorm:
+ case QOpenGLTexture::RGB16_UNorm:
+ case QOpenGLTexture::RGBA16_UNorm:
+ case QOpenGLTexture::R8_SNorm:
+ case QOpenGLTexture::RG8_SNorm:
+ case QOpenGLTexture::RGB8_SNorm:
+ case QOpenGLTexture::RGBA8_SNorm:
+ case QOpenGLTexture::R16_SNorm:
+ case QOpenGLTexture::RG16_SNorm:
+ case QOpenGLTexture::RGB16_SNorm:
+ case QOpenGLTexture::RGBA16_SNorm:
+ case QOpenGLTexture::R8U:
+ case QOpenGLTexture::RG8U:
+ case QOpenGLTexture::RGB8U:
+ case QOpenGLTexture::RGBA8U:
+ case QOpenGLTexture::R16U:
+ case QOpenGLTexture::RG16U:
+ case QOpenGLTexture::RGB16U:
+ case QOpenGLTexture::RGBA16U:
+ case QOpenGLTexture::R32U:
+ case QOpenGLTexture::RG32U:
+ case QOpenGLTexture::RGB32U:
+ case QOpenGLTexture::RGBA32U:
+ case QOpenGLTexture::R8I:
+ case QOpenGLTexture::RG8I:
+ case QOpenGLTexture::RGB8I:
+ case QOpenGLTexture::RGBA8I:
+ case QOpenGLTexture::R16I:
+ case QOpenGLTexture::RG16I:
+ case QOpenGLTexture::RGB16I:
+ case QOpenGLTexture::RGBA16I:
+ case QOpenGLTexture::R32I:
+ case QOpenGLTexture::RG32I:
+ case QOpenGLTexture::RGB32I:
+ case QOpenGLTexture::RGBA32I:
+ case QOpenGLTexture::R16F:
+ case QOpenGLTexture::RG16F:
+ case QOpenGLTexture::RGB16F:
+ case QOpenGLTexture::RGBA16F:
+ case QOpenGLTexture::R32F:
+ case QOpenGLTexture::RG32F:
+ case QOpenGLTexture::RGB32F:
+ case QOpenGLTexture::RGBA32F:
+ case QOpenGLTexture::RGB9E5:
+ case QOpenGLTexture::RG11B10F:
+ case QOpenGLTexture::RG3B2:
+ case QOpenGLTexture::R5G6B5:
+ case QOpenGLTexture::RGB5A1:
+ case QOpenGLTexture::RGBA4:
+ case QOpenGLTexture::RGB10A2:
+
+ case QOpenGLTexture::D16:
+ case QOpenGLTexture::D24:
+ case QOpenGLTexture::D32:
+ case QOpenGLTexture::D32F:
+
+ case QOpenGLTexture::D24S8:
+ case QOpenGLTexture::D32FS8X24:
+
+ case QOpenGLTexture::S8:
+
+ case QOpenGLTexture::RGB_DXT1:
+ case QOpenGLTexture::RGBA_DXT1:
+ case QOpenGLTexture::RGBA_DXT3:
+ case QOpenGLTexture::RGBA_DXT5:
+ case QOpenGLTexture::R_ATI1N_UNorm:
+ case QOpenGLTexture::R_ATI1N_SNorm:
+ case QOpenGLTexture::RG_ATI2N_UNorm:
+ case QOpenGLTexture::RG_ATI2N_SNorm:
+ case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
+ case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
+ case QOpenGLTexture::RGB_BP_UNorm:
+ case QOpenGLTexture::SRGB8:
+ case QOpenGLTexture::SRGB8_Alpha8:
+ case QOpenGLTexture::SRGB_DXT1:
+ case QOpenGLTexture::SRGB_Alpha_DXT1:
+ case QOpenGLTexture::SRGB_Alpha_DXT3:
+ case QOpenGLTexture::SRGB_Alpha_DXT5:
+ case QOpenGLTexture::SRGB_BP_UNorm:
+ case QOpenGLTexture::R11_EAC_UNorm:
+ case QOpenGLTexture::R11_EAC_SNorm:
+ case QOpenGLTexture::RG11_EAC_UNorm:
+ case QOpenGLTexture::RG11_EAC_SNorm:
+ case QOpenGLTexture::RGB8_ETC2:
+ case QOpenGLTexture::SRGB8_ETC2:
+ case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
+ case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
+ case QOpenGLTexture::RGBA8_ETC2_EAC:
+ case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
+ case QOpenGLTexture::RGBA_ASTC_4x4:
+ case QOpenGLTexture::RGBA_ASTC_5x4:
+ case QOpenGLTexture::RGBA_ASTC_5x5:
+ case QOpenGLTexture::RGBA_ASTC_6x5:
+ case QOpenGLTexture::RGBA_ASTC_6x6:
+ case QOpenGLTexture::RGBA_ASTC_8x5:
+ case QOpenGLTexture::RGBA_ASTC_8x6:
+ case QOpenGLTexture::RGBA_ASTC_8x8:
+ case QOpenGLTexture::RGBA_ASTC_10x5:
+ case QOpenGLTexture::RGBA_ASTC_10x6:
+ case QOpenGLTexture::RGBA_ASTC_10x8:
+ case QOpenGLTexture::RGBA_ASTC_10x10:
+ case QOpenGLTexture::RGBA_ASTC_12x10:
+ case QOpenGLTexture::RGBA_ASTC_12x12:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
+ return true;
+
+ case QOpenGLTexture::RGB8_ETC1:
+ return false;
+
+ case QOpenGLTexture::DepthFormat:
+ case QOpenGLTexture::AlphaFormat:
+
+ case QOpenGLTexture::RGBFormat:
+ case QOpenGLTexture::RGBAFormat:
+
+ case QOpenGLTexture::LuminanceFormat:
+
+ case QOpenGLTexture::LuminanceAlphaFormat:
+ return false;
+ }
+
+ Q_UNREACHABLE();
+ return false;
+}
+
+static bool isTextureTargetMultisample(QOpenGLTexture::Target target)
+{
+ switch (target) {
+ case QOpenGLTexture::Target1D:
+ case QOpenGLTexture::Target1DArray:
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::Target2DArray:
+ case QOpenGLTexture::Target3D:
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetCubeMapArray:
+ return false;
+
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ return true;
+
+ case QOpenGLTexture::TargetRectangle:
+ case QOpenGLTexture::TargetBuffer:
+ return false;
+ }
+
+ Q_UNREACHABLE();
+ return false;
+}
+
+bool QOpenGLTexturePrivate::isUsingImmutableStorage() const
+{
+ // Use immutable storage whenever possible, falling back to mutable
+ // Note that if multisample textures are not supported at all, we'll still fail into
+ // the mutable storage allocation
+ return isSizedTextureFormat(format)
+ && (isTextureTargetMultisample(target)
+ ? features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)
+ : features.testFlag(QOpenGLTexture::ImmutableStorage));
+}
+
+void QOpenGLTexturePrivate::allocateStorage(QOpenGLTexture::PixelFormat pixelFormat, QOpenGLTexture::PixelType pixelType)
+{
+ // Resolve the actual number of mipmap levels we can use
+ mipLevels = evaluateMipLevels();
+
+ if (isUsingImmutableStorage())
+ allocateImmutableStorage();
+ else
+ allocateMutableStorage(pixelFormat, pixelType);
+}
+
+static QOpenGLTexture::PixelFormat pixelFormatCompatibleWithInternalFormat(QOpenGLTexture::TextureFormat internalFormat)
+{
+ switch (internalFormat) {
+ case QOpenGLTexture::NoFormat:
+ return QOpenGLTexture::NoSourceFormat;
+
+ case QOpenGLTexture::R8_UNorm:
+ return QOpenGLTexture::Red;
+
+ case QOpenGLTexture::RG8_UNorm:
+ return QOpenGLTexture::RG;
+
+ case QOpenGLTexture::RGB8_UNorm:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::RGBA8_UNorm:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::R16_UNorm:
+ return QOpenGLTexture::Red;
+
+ case QOpenGLTexture::RG16_UNorm:
+ return QOpenGLTexture::RG;
+
+ case QOpenGLTexture::RGB16_UNorm:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::RGBA16_UNorm:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::R8_SNorm:
+ return QOpenGLTexture::Red;
+
+ case QOpenGLTexture::RG8_SNorm:
+ return QOpenGLTexture::RG;
+
+ case QOpenGLTexture::RGB8_SNorm:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::RGBA8_SNorm:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::R16_SNorm:
+ return QOpenGLTexture::Red;
+
+ case QOpenGLTexture::RG16_SNorm:
+ return QOpenGLTexture::RG;
+
+ case QOpenGLTexture::RGB16_SNorm:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::RGBA16_SNorm:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::R8U:
+ return QOpenGLTexture::Red_Integer;
+
+ case QOpenGLTexture::RG8U:
+ return QOpenGLTexture::RG_Integer;
+
+ case QOpenGLTexture::RGB8U:
+ return QOpenGLTexture::RGB_Integer;
+
+ case QOpenGLTexture::RGBA8U:
+ return QOpenGLTexture::RGBA_Integer;
+
+ case QOpenGLTexture::R16U:
+ return QOpenGLTexture::Red_Integer;
+
+ case QOpenGLTexture::RG16U:
+ return QOpenGLTexture::RG_Integer;
+
+ case QOpenGLTexture::RGB16U:
+ return QOpenGLTexture::RGB_Integer;
+
+ case QOpenGLTexture::RGBA16U:
+ return QOpenGLTexture::RGBA_Integer;
+
+ case QOpenGLTexture::R32U:
+ return QOpenGLTexture::Red_Integer;
+
+ case QOpenGLTexture::RG32U:
+ return QOpenGLTexture::RG_Integer;
+
+ case QOpenGLTexture::RGB32U:
+ return QOpenGLTexture::RGB_Integer;
+
+ case QOpenGLTexture::RGBA32U:
+ return QOpenGLTexture::RGBA_Integer;
+
+ case QOpenGLTexture::R8I:
+ return QOpenGLTexture::Red_Integer;
+
+ case QOpenGLTexture::RG8I:
+ return QOpenGLTexture::RG_Integer;
+
+ case QOpenGLTexture::RGB8I:
+ return QOpenGLTexture::RGB_Integer;
+
+ case QOpenGLTexture::RGBA8I:
+ return QOpenGLTexture::RGBA_Integer;
+
+ case QOpenGLTexture::R16I:
+ return QOpenGLTexture::Red_Integer;
+
+ case QOpenGLTexture::RG16I:
+ return QOpenGLTexture::RG_Integer;
+
+ case QOpenGLTexture::RGB16I:
+ return QOpenGLTexture::RGB_Integer;
+
+ case QOpenGLTexture::RGBA16I:
+ return QOpenGLTexture::RGBA_Integer;
+
+ case QOpenGLTexture::R32I:
+ return QOpenGLTexture::Red_Integer;
+
+ case QOpenGLTexture::RG32I:
+ return QOpenGLTexture::RG_Integer;
+
+ case QOpenGLTexture::RGB32I:
+ return QOpenGLTexture::RGB_Integer;
+
+ case QOpenGLTexture::RGBA32I:
+ return QOpenGLTexture::RGBA_Integer;
+
+ case QOpenGLTexture::R16F:
+ return QOpenGLTexture::Red;
+
+ case QOpenGLTexture::RG16F:
+ return QOpenGLTexture::RG;
+
+ case QOpenGLTexture::RGB16F:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::RGBA16F:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::R32F:
+ return QOpenGLTexture::Red;
+
+ case QOpenGLTexture::RG32F:
+ return QOpenGLTexture::RG;
+
+ case QOpenGLTexture::RGB32F:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::RGBA32F:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::RGB9E5:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::RG11B10F:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::RG3B2:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::R5G6B5:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::RGB5A1:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::RGBA4:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::RGB10A2:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::D16:
+ case QOpenGLTexture::D24:
+ case QOpenGLTexture::D32:
+ case QOpenGLTexture::D32F:
+ return QOpenGLTexture::Depth;
+
+ case QOpenGLTexture::D24S8:
+ case QOpenGLTexture::D32FS8X24:
+ return QOpenGLTexture::DepthStencil;
+
+ case QOpenGLTexture::S8:
+ return QOpenGLTexture::Stencil;
+
+ case QOpenGLTexture::RGB_DXT1:
+ case QOpenGLTexture::RGBA_DXT1:
+ case QOpenGLTexture::RGBA_DXT3:
+ case QOpenGLTexture::RGBA_DXT5:
+ case QOpenGLTexture::R_ATI1N_UNorm:
+ case QOpenGLTexture::R_ATI1N_SNorm:
+ case QOpenGLTexture::RG_ATI2N_UNorm:
+ case QOpenGLTexture::RG_ATI2N_SNorm:
+ case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
+ case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
+ case QOpenGLTexture::RGB_BP_UNorm:
+ case QOpenGLTexture::SRGB8:
+ case QOpenGLTexture::SRGB8_Alpha8:
+ case QOpenGLTexture::SRGB_DXT1:
+ case QOpenGLTexture::SRGB_Alpha_DXT1:
+ case QOpenGLTexture::SRGB_Alpha_DXT3:
+ case QOpenGLTexture::SRGB_Alpha_DXT5:
+ case QOpenGLTexture::SRGB_BP_UNorm:
+ case QOpenGLTexture::RGB8_ETC1:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::R11_EAC_UNorm:
+ case QOpenGLTexture::R11_EAC_SNorm:
+ return QOpenGLTexture::Red;
+
+ case QOpenGLTexture::RG11_EAC_UNorm:
+ case QOpenGLTexture::RG11_EAC_SNorm:
+ return QOpenGLTexture::RG;
+
+ case QOpenGLTexture::RGB8_ETC2:
+ case QOpenGLTexture::SRGB8_ETC2:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
+ case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::RGBA8_ETC2_EAC:
+ case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::RGBA_ASTC_4x4:
+ case QOpenGLTexture::RGBA_ASTC_5x4:
+ case QOpenGLTexture::RGBA_ASTC_5x5:
+ case QOpenGLTexture::RGBA_ASTC_6x5:
+ case QOpenGLTexture::RGBA_ASTC_6x6:
+ case QOpenGLTexture::RGBA_ASTC_8x5:
+ case QOpenGLTexture::RGBA_ASTC_8x6:
+ case QOpenGLTexture::RGBA_ASTC_8x8:
+ case QOpenGLTexture::RGBA_ASTC_10x5:
+ case QOpenGLTexture::RGBA_ASTC_10x6:
+ case QOpenGLTexture::RGBA_ASTC_10x8:
+ case QOpenGLTexture::RGBA_ASTC_10x10:
+ case QOpenGLTexture::RGBA_ASTC_12x10:
+ case QOpenGLTexture::RGBA_ASTC_12x12:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::DepthFormat:
+ return QOpenGLTexture::Depth;
+
+ case QOpenGLTexture::AlphaFormat:
+ return QOpenGLTexture::Alpha;
+
+ case QOpenGLTexture::RGBFormat:
+ return QOpenGLTexture::RGB;
+
+ case QOpenGLTexture::RGBAFormat:
+ return QOpenGLTexture::RGBA;
+
+ case QOpenGLTexture::LuminanceFormat:
+ return QOpenGLTexture::Luminance;
+
+ case QOpenGLTexture::LuminanceAlphaFormat:
+ return QOpenGLTexture::LuminanceAlpha;
+ }
+
+ Q_UNREACHABLE();
+ return QOpenGLTexture::NoSourceFormat;
+}
+
+static QOpenGLTexture::PixelType pixelTypeCompatibleWithInternalFormat(QOpenGLTexture::TextureFormat internalFormat)
+{
+ switch (internalFormat) {
+ case QOpenGLTexture::NoFormat:
+ return QOpenGLTexture::NoPixelType;
+
+ case QOpenGLTexture::R8_UNorm:
+ case QOpenGLTexture::RG8_UNorm:
+ case QOpenGLTexture::RGB8_UNorm:
+ case QOpenGLTexture::RGBA8_UNorm:
+ case QOpenGLTexture::R16_UNorm:
+ case QOpenGLTexture::RG16_UNorm:
+ case QOpenGLTexture::RGB16_UNorm:
+ case QOpenGLTexture::RGBA16_UNorm:
+ return QOpenGLTexture::UInt8;
+
+ case QOpenGLTexture::R8_SNorm:
+ case QOpenGLTexture::RG8_SNorm:
+ case QOpenGLTexture::RGB8_SNorm:
+ case QOpenGLTexture::RGBA8_SNorm:
+ case QOpenGLTexture::R16_SNorm:
+ case QOpenGLTexture::RG16_SNorm:
+ case QOpenGLTexture::RGB16_SNorm:
+ case QOpenGLTexture::RGBA16_SNorm:
+ return QOpenGLTexture::Int8;
+
+ case QOpenGLTexture::R8U:
+ case QOpenGLTexture::RG8U:
+ case QOpenGLTexture::RGB8U:
+ case QOpenGLTexture::RGBA8U:
+ case QOpenGLTexture::R16U:
+ case QOpenGLTexture::RG16U:
+ case QOpenGLTexture::RGB16U:
+ case QOpenGLTexture::RGBA16U:
+ case QOpenGLTexture::R32U:
+ case QOpenGLTexture::RG32U:
+ case QOpenGLTexture::RGB32U:
+ case QOpenGLTexture::RGBA32U:
+ return QOpenGLTexture::UInt8;
+
+ case QOpenGLTexture::R8I:
+ case QOpenGLTexture::RG8I:
+ case QOpenGLTexture::RGB8I:
+ case QOpenGLTexture::RGBA8I:
+ case QOpenGLTexture::R16I:
+ case QOpenGLTexture::RG16I:
+ case QOpenGLTexture::RGB16I:
+ case QOpenGLTexture::RGBA16I:
+ case QOpenGLTexture::R32I:
+ case QOpenGLTexture::RG32I:
+ case QOpenGLTexture::RGB32I:
+ case QOpenGLTexture::RGBA32I:
+ return QOpenGLTexture::Int8;
+
+ case QOpenGLTexture::R16F:
+ case QOpenGLTexture::RG16F:
+ case QOpenGLTexture::RGB16F:
+ case QOpenGLTexture::RGBA16F:
+ return QOpenGLTexture::Float16;
+
+ case QOpenGLTexture::R32F:
+ case QOpenGLTexture::RG32F:
+ case QOpenGLTexture::RGB32F:
+ case QOpenGLTexture::RGBA32F:
+ return QOpenGLTexture::Float32;
+
+ case QOpenGLTexture::RGB9E5:
+ return QOpenGLTexture::UInt16_RGB5A1_Rev;
+
+ case QOpenGLTexture::RG11B10F:
+ return QOpenGLTexture::UInt32_RG11B10F;
+
+ case QOpenGLTexture::RG3B2:
+ return QOpenGLTexture::UInt8_RG3B2;
+
+ case QOpenGLTexture::R5G6B5:
+ return QOpenGLTexture::UInt16_R5G6B5;
+
+ case QOpenGLTexture::RGB5A1:
+ return QOpenGLTexture::UInt16_RGB5A1;
+
+ case QOpenGLTexture::RGBA4:
+ return QOpenGLTexture::UInt16_RGBA4;
+
+ case QOpenGLTexture::RGB10A2:
+ return QOpenGLTexture::UInt32_RGB10A2;
+
+ case QOpenGLTexture::D16:
+ return QOpenGLTexture::UInt16;
+
+ case QOpenGLTexture::D24:
+ case QOpenGLTexture::D32:
+ return QOpenGLTexture::UInt32;
+
+ case QOpenGLTexture::D32F:
+ return QOpenGLTexture::Float32;
+
+ case QOpenGLTexture::D24S8:
+ return QOpenGLTexture::UInt32_D24S8;
+
+ case QOpenGLTexture::D32FS8X24:
+ return QOpenGLTexture::Float32_D32_UInt32_S8_X24;
+
+ case QOpenGLTexture::S8:
+ return QOpenGLTexture::UInt8;
+
+ case QOpenGLTexture::RGB_DXT1:
+ case QOpenGLTexture::RGBA_DXT1:
+ case QOpenGLTexture::RGBA_DXT3:
+ case QOpenGLTexture::RGBA_DXT5:
+ case QOpenGLTexture::R_ATI1N_UNorm:
+ case QOpenGLTexture::R_ATI1N_SNorm:
+ case QOpenGLTexture::RG_ATI2N_UNorm:
+ case QOpenGLTexture::RG_ATI2N_SNorm:
+ case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
+ case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
+ case QOpenGLTexture::RGB_BP_UNorm:
+ case QOpenGLTexture::SRGB8:
+ case QOpenGLTexture::SRGB8_Alpha8:
+ case QOpenGLTexture::SRGB_DXT1:
+ case QOpenGLTexture::SRGB_Alpha_DXT1:
+ case QOpenGLTexture::SRGB_Alpha_DXT3:
+ case QOpenGLTexture::SRGB_Alpha_DXT5:
+ case QOpenGLTexture::SRGB_BP_UNorm:
+ case QOpenGLTexture::R11_EAC_UNorm:
+ case QOpenGLTexture::R11_EAC_SNorm:
+ case QOpenGLTexture::RG11_EAC_UNorm:
+ case QOpenGLTexture::RG11_EAC_SNorm:
+ case QOpenGLTexture::RGB8_ETC2:
+ case QOpenGLTexture::SRGB8_ETC2:
+ case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
+ case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
+ case QOpenGLTexture::RGBA8_ETC2_EAC:
+ case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
+ case QOpenGLTexture::RGB8_ETC1:
+ case QOpenGLTexture::RGBA_ASTC_4x4:
+ case QOpenGLTexture::RGBA_ASTC_5x4:
+ case QOpenGLTexture::RGBA_ASTC_5x5:
+ case QOpenGLTexture::RGBA_ASTC_6x5:
+ case QOpenGLTexture::RGBA_ASTC_6x6:
+ case QOpenGLTexture::RGBA_ASTC_8x5:
+ case QOpenGLTexture::RGBA_ASTC_8x6:
+ case QOpenGLTexture::RGBA_ASTC_8x8:
+ case QOpenGLTexture::RGBA_ASTC_10x5:
+ case QOpenGLTexture::RGBA_ASTC_10x6:
+ case QOpenGLTexture::RGBA_ASTC_10x8:
+ case QOpenGLTexture::RGBA_ASTC_10x10:
+ case QOpenGLTexture::RGBA_ASTC_12x10:
+ case QOpenGLTexture::RGBA_ASTC_12x12:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
+ return QOpenGLTexture::UInt8;
+
+ case QOpenGLTexture::DepthFormat:
+ return QOpenGLTexture::UInt32;
+
+ case QOpenGLTexture::AlphaFormat:
+ case QOpenGLTexture::RGBFormat:
+ case QOpenGLTexture::RGBAFormat:
+ case QOpenGLTexture::LuminanceFormat:
+ case QOpenGLTexture::LuminanceAlphaFormat:
+ return QOpenGLTexture::UInt8;
+ }
+
+ Q_UNREACHABLE();
+ return QOpenGLTexture::NoPixelType;
+}
+
+static bool isCompressedFormat(QOpenGLTexture::TextureFormat internalFormat)
+{
+ switch (internalFormat) {
+ case QOpenGLTexture::NoFormat:
+
+ case QOpenGLTexture::R8_UNorm:
+ case QOpenGLTexture::RG8_UNorm:
+ case QOpenGLTexture::RGB8_UNorm:
+ case QOpenGLTexture::RGBA8_UNorm:
+ case QOpenGLTexture::R16_UNorm:
+ case QOpenGLTexture::RG16_UNorm:
+ case QOpenGLTexture::RGB16_UNorm:
+ case QOpenGLTexture::RGBA16_UNorm:
+ case QOpenGLTexture::R8_SNorm:
+ case QOpenGLTexture::RG8_SNorm:
+ case QOpenGLTexture::RGB8_SNorm:
+ case QOpenGLTexture::RGBA8_SNorm:
+ case QOpenGLTexture::R16_SNorm:
+ case QOpenGLTexture::RG16_SNorm:
+ case QOpenGLTexture::RGB16_SNorm:
+ case QOpenGLTexture::RGBA16_SNorm:
+ case QOpenGLTexture::R8U:
+ case QOpenGLTexture::RG8U:
+ case QOpenGLTexture::RGB8U:
+ case QOpenGLTexture::RGBA8U:
+ case QOpenGLTexture::R16U:
+ case QOpenGLTexture::RG16U:
+ case QOpenGLTexture::RGB16U:
+ case QOpenGLTexture::RGBA16U:
+ case QOpenGLTexture::R32U:
+ case QOpenGLTexture::RG32U:
+ case QOpenGLTexture::RGB32U:
+ case QOpenGLTexture::RGBA32U:
+ case QOpenGLTexture::R8I:
+ case QOpenGLTexture::RG8I:
+ case QOpenGLTexture::RGB8I:
+ case QOpenGLTexture::RGBA8I:
+ case QOpenGLTexture::R16I:
+ case QOpenGLTexture::RG16I:
+ case QOpenGLTexture::RGB16I:
+ case QOpenGLTexture::RGBA16I:
+ case QOpenGLTexture::R32I:
+ case QOpenGLTexture::RG32I:
+ case QOpenGLTexture::RGB32I:
+ case QOpenGLTexture::RGBA32I:
+ case QOpenGLTexture::R16F:
+ case QOpenGLTexture::RG16F:
+ case QOpenGLTexture::RGB16F:
+ case QOpenGLTexture::RGBA16F:
+ case QOpenGLTexture::R32F:
+ case QOpenGLTexture::RG32F:
+ case QOpenGLTexture::RGB32F:
+ case QOpenGLTexture::RGBA32F:
+ case QOpenGLTexture::RGB9E5:
+ case QOpenGLTexture::RG11B10F:
+ case QOpenGLTexture::RG3B2:
+ case QOpenGLTexture::R5G6B5:
+ case QOpenGLTexture::RGB5A1:
+ case QOpenGLTexture::RGBA4:
+ case QOpenGLTexture::RGB10A2:
+
+ case QOpenGLTexture::D16:
+ case QOpenGLTexture::D24:
+ case QOpenGLTexture::D32:
+ case QOpenGLTexture::D32F:
+
+ case QOpenGLTexture::D24S8:
+ case QOpenGLTexture::D32FS8X24:
+
+ case QOpenGLTexture::S8:
+ return false;
+
+ case QOpenGLTexture::RGB_DXT1:
+ case QOpenGLTexture::RGBA_DXT1:
+ case QOpenGLTexture::RGBA_DXT3:
+ case QOpenGLTexture::RGBA_DXT5:
+ case QOpenGLTexture::R_ATI1N_UNorm:
+ case QOpenGLTexture::R_ATI1N_SNorm:
+ case QOpenGLTexture::RG_ATI2N_UNorm:
+ case QOpenGLTexture::RG_ATI2N_SNorm:
+ case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
+ case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
+ case QOpenGLTexture::RGB_BP_UNorm:
+ case QOpenGLTexture::SRGB8:
+ case QOpenGLTexture::SRGB8_Alpha8:
+ case QOpenGLTexture::SRGB_DXT1:
+ case QOpenGLTexture::SRGB_Alpha_DXT1:
+ case QOpenGLTexture::SRGB_Alpha_DXT3:
+ case QOpenGLTexture::SRGB_Alpha_DXT5:
+ case QOpenGLTexture::SRGB_BP_UNorm:
+ case QOpenGLTexture::R11_EAC_UNorm:
+ case QOpenGLTexture::R11_EAC_SNorm:
+ case QOpenGLTexture::RG11_EAC_UNorm:
+ case QOpenGLTexture::RG11_EAC_SNorm:
+ case QOpenGLTexture::RGB8_ETC2:
+ case QOpenGLTexture::SRGB8_ETC2:
+ case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
+ case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
+ case QOpenGLTexture::RGBA8_ETC2_EAC:
+ case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
+ case QOpenGLTexture::RGB8_ETC1:
+ case QOpenGLTexture::RGBA_ASTC_4x4:
+ case QOpenGLTexture::RGBA_ASTC_5x4:
+ case QOpenGLTexture::RGBA_ASTC_5x5:
+ case QOpenGLTexture::RGBA_ASTC_6x5:
+ case QOpenGLTexture::RGBA_ASTC_6x6:
+ case QOpenGLTexture::RGBA_ASTC_8x5:
+ case QOpenGLTexture::RGBA_ASTC_8x6:
+ case QOpenGLTexture::RGBA_ASTC_8x8:
+ case QOpenGLTexture::RGBA_ASTC_10x5:
+ case QOpenGLTexture::RGBA_ASTC_10x6:
+ case QOpenGLTexture::RGBA_ASTC_10x8:
+ case QOpenGLTexture::RGBA_ASTC_10x10:
+ case QOpenGLTexture::RGBA_ASTC_12x10:
+ case QOpenGLTexture::RGBA_ASTC_12x12:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
+ return true;
+
+ case QOpenGLTexture::DepthFormat:
+ case QOpenGLTexture::AlphaFormat:
+ case QOpenGLTexture::RGBFormat:
+ case QOpenGLTexture::RGBAFormat:
+ case QOpenGLTexture::LuminanceFormat:
+ case QOpenGLTexture::LuminanceAlphaFormat:
+ return false;
+ }
+
+ Q_UNREACHABLE();
+ return false;
+}
+
+void QOpenGLTexturePrivate::allocateMutableStorage(QOpenGLTexture::PixelFormat pixelFormat, QOpenGLTexture::PixelType pixelType)
+{
+ // There is no way to allocate mutable storage for compressed textures in in
+ // versions older than OpenGL 3.1 and OpenGL ES 3.0, because the older specs
+ // do not mandate accepting null data pointers for glCompressedTexImage*D,
+ // unlike glTexImage*D (which in turn does not accept compressed formats).
+ if (isCompressedFormat(format)) {
+ storageAllocated = true;
+ return;
+ }
+
+ switch (target) {
+ case QOpenGLTexture::TargetBuffer:
+ // Buffer textures get their storage from an external OpenGL buffer
+ qWarning("Buffer textures do not allocate storage");
+ return;
+
+ case QOpenGLTexture::Target1D:
+ if (features.testFlag(QOpenGLTexture::Texture1D)) {
+ for (int level = 0; level < mipLevels; ++level)
+ texFuncs->glTextureImage1D(textureId, target, bindingTarget, level, format,
+ mipLevelSize(level, dimensions[0]),
+ 0,
+ pixelFormat, pixelType, nullptr);
+ } else {
+ qWarning("1D textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::Target1DArray:
+ if (features.testFlag(QOpenGLTexture::Texture1D)
+ && features.testFlag(QOpenGLTexture::TextureArrays)) {
+ for (int level = 0; level < mipLevels; ++level)
+ texFuncs->glTextureImage2D(textureId, target, bindingTarget, level, format,
+ mipLevelSize(level, dimensions[0]),
+ layers,
+ 0,
+ pixelFormat, pixelType, nullptr);
+ } else {
+ qWarning("1D array textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::TargetRectangle:
+ for (int level = 0; level < mipLevels; ++level)
+ texFuncs->glTextureImage2D(textureId, target, bindingTarget, level, format,
+ mipLevelSize(level, dimensions[0]),
+ mipLevelSize(level, dimensions[1]),
+ 0,
+ pixelFormat, pixelType, nullptr);
+ break;
+
+ case QOpenGLTexture::TargetCubeMap: {
+ // Cubemaps are the odd one out. We have to allocate storage for each
+ // face and miplevel using the special cubemap face targets rather than
+ // GL_TARGET_CUBEMAP.
+ const QOpenGLTexture::CubeMapFace faceTargets[] = {
+ QOpenGLTexture::CubeMapPositiveX, QOpenGLTexture::CubeMapNegativeX,
+ QOpenGLTexture::CubeMapPositiveY, QOpenGLTexture::CubeMapNegativeY,
+ QOpenGLTexture::CubeMapPositiveZ, QOpenGLTexture::CubeMapNegativeZ
+ };
+
+ for (int faceTarget = 0; faceTarget < 6; ++faceTarget) {
+ for (int level = 0; level < mipLevels; ++level) {
+ texFuncs->glTextureImage2D(textureId, faceTargets[faceTarget], bindingTarget,
+ level, format,
+ mipLevelSize(level, dimensions[0]),
+ mipLevelSize(level, dimensions[1]),
+ 0,
+ pixelFormat, pixelType, nullptr);
+ }
+ }
+ break;
+ }
+
+ case QOpenGLTexture::Target2DArray:
+ if (features.testFlag(QOpenGLTexture::TextureArrays)) {
+ for (int level = 0; level < mipLevels; ++level)
+ texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
+ mipLevelSize(level, dimensions[0]),
+ mipLevelSize(level, dimensions[1]),
+ layers,
+ 0,
+ pixelFormat, pixelType, nullptr);
+ } else {
+ qWarning("Array textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::TargetCubeMapArray:
+ // Cubemap arrays must specify number of layer-faces (6 * layers) as depth parameter
+ if (features.testFlag(QOpenGLTexture::TextureCubeMapArrays)) {
+ for (int level = 0; level < mipLevels; ++level)
+ texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
+ mipLevelSize(level, dimensions[0]),
+ mipLevelSize(level, dimensions[1]),
+ 6 * layers,
+ 0,
+ pixelFormat, pixelType, nullptr);
+ } else {
+ qWarning("Cubemap Array textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::Target3D:
+ if (features.testFlag(QOpenGLTexture::Texture3D)) {
+ for (int level = 0; level < mipLevels; ++level)
+ texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
+ mipLevelSize(level, dimensions[0]),
+ mipLevelSize(level, dimensions[1]),
+ mipLevelSize(level, dimensions[2]),
+ 0,
+ pixelFormat, pixelType, nullptr);
+ } else {
+ qWarning("3D textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::Target2DMultisample:
+ if (features.testFlag(QOpenGLTexture::TextureMultisample)) {
+ texFuncs->glTextureImage2DMultisample(textureId, target, bindingTarget, samples, format,
+ dimensions[0], dimensions[1],
+ fixedSamplePositions);
+ } else {
+ qWarning("Multisample textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::Target2DMultisampleArray:
+ if (features.testFlag(QOpenGLTexture::TextureMultisample)
+ && features.testFlag(QOpenGLTexture::TextureArrays)) {
+ texFuncs->glTextureImage3DMultisample(textureId, target, bindingTarget, samples, format,
+ dimensions[0], dimensions[1], layers,
+ fixedSamplePositions);
+ } else {
+ qWarning("Multisample array textures are not supported");
+ return;
+ }
+ break;
+ }
+
+ storageAllocated = true;
+}
+
+void QOpenGLTexturePrivate::allocateImmutableStorage()
+{
+ switch (target) {
+ case QOpenGLTexture::TargetBuffer:
+ // Buffer textures get their storage from an external OpenGL buffer
+ qWarning("Buffer textures do not allocate storage");
+ return;
+
+ case QOpenGLTexture::Target1D:
+ if (features.testFlag(QOpenGLTexture::Texture1D)) {
+ texFuncs->glTextureStorage1D(textureId, target, bindingTarget, mipLevels, format,
+ dimensions[0]);
+ } else {
+ qWarning("1D textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::Target1DArray:
+ if (features.testFlag(QOpenGLTexture::Texture1D)
+ && features.testFlag(QOpenGLTexture::TextureArrays)) {
+ texFuncs->glTextureStorage2D(textureId, target, bindingTarget, mipLevels, format,
+ dimensions[0], layers);
+ } else {
+ qWarning("1D array textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetRectangle:
+ texFuncs->glTextureStorage2D(textureId, target, bindingTarget, mipLevels, format,
+ dimensions[0], dimensions[1]);
+ break;
+
+ case QOpenGLTexture::Target2DArray:
+ if (features.testFlag(QOpenGLTexture::TextureArrays)) {
+ texFuncs->glTextureStorage3D(textureId, target, bindingTarget, mipLevels, format,
+ dimensions[0], dimensions[1], layers);
+ } else {
+ qWarning("Array textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::TargetCubeMapArray:
+ // Cubemap arrays must specify number of layer-faces (6 * layers) as depth parameter
+ if (features.testFlag(QOpenGLTexture::TextureCubeMapArrays)) {
+ texFuncs->glTextureStorage3D(textureId, target, bindingTarget, mipLevels, format,
+ dimensions[0], dimensions[1], 6 * layers);
+ } else {
+ qWarning("Cubemap Array textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::Target3D:
+ if (features.testFlag(QOpenGLTexture::Texture3D)) {
+ texFuncs->glTextureStorage3D(textureId, target, bindingTarget, mipLevels, format,
+ dimensions[0], dimensions[1], dimensions[2]);
+ } else {
+ qWarning("3D textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::Target2DMultisample:
+ if (features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)) {
+ texFuncs->glTextureStorage2DMultisample(textureId, target, bindingTarget, samples, format,
+ dimensions[0], dimensions[1],
+ fixedSamplePositions);
+ } else {
+ qWarning("Multisample textures are not supported");
+ return;
+ }
+ break;
+
+ case QOpenGLTexture::Target2DMultisampleArray:
+ if (features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)
+ && features.testFlag(QOpenGLTexture::TextureArrays)) {
+ texFuncs->glTextureStorage3DMultisample(textureId, target, bindingTarget, samples, format,
+ dimensions[0], dimensions[1], layers,
+ fixedSamplePositions);
+ } else {
+ qWarning("Multisample array textures are not supported");
+ return;
+ }
+ break;
+ }
+
+ storageAllocated = true;
+}
+
+void QOpenGLTexturePrivate::setData(int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
+ QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ switch (target) {
+ case QOpenGLTexture::Target1D:
+ Q_UNUSED(layer);
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(layerCount);
+ texFuncs->glTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
+ 0, mipLevelSize( mipLevel, dimensions[0] ),
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::Target1DArray:
+ Q_UNUSED(cubeFace);
+ texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
+ 0, layer,
+ mipLevelSize(mipLevel, dimensions[0]),
+ layerCount,
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::Target2D:
+ Q_UNUSED(layer);
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(layerCount);
+ texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
+ 0, 0,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::Target2DArray:
+ Q_UNUSED(cubeFace);
+ texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
+ 0, 0, layer,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ layerCount,
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::Target3D:
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(layerCount);
+ texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
+ 0, 0, layer,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ mipLevelSize(mipLevel, dimensions[2]),
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::TargetCubeMap:
+ Q_UNUSED(layer);
+ Q_UNUSED(layerCount);
+ texFuncs->glTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
+ 0, 0,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::TargetCubeMapArray: {
+ int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
+ int layerFace = 6 * layer + faceIndex;
+ texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
+ 0, 0, layerFace,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ layerCount,
+ sourceFormat, sourceType, data, options);
+ break;
+ }
+
+ case QOpenGLTexture::TargetRectangle:
+ Q_UNUSED(mipLevel);
+ Q_UNUSED(layer);
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(layerCount);
+ texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, 0,
+ 0, 0,
+ dimensions[0],
+ dimensions[1],
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ case QOpenGLTexture::TargetBuffer:
+ // We don't upload pixel data for these targets
+ qWarning("QOpenGLTexture::setData(): Texture target does not support pixel data upload");
+ break;
+ }
+
+ // If requested perform automatic mip map generation
+ if (mipLevel == 0 && autoGenerateMipMaps && mipLevels > 1) {
+ Q_Q(QOpenGLTexture);
+ q->generateMipMaps();
+ }
+}
+
+void QOpenGLTexturePrivate::setData(int xOffset, int yOffset, int zOffset, int width, int height, int depth,
+ int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
+ QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ switch (target) {
+ case QOpenGLTexture::Target1D:
+ Q_UNUSED(layer);
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(layerCount);
+ Q_UNUSED(yOffset);
+ Q_UNUSED(zOffset);
+ Q_UNUSED(height);
+ Q_UNUSED(depth);
+ texFuncs->glTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
+ xOffset, width,
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::Target1DArray:
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(yOffset);
+ Q_UNUSED(zOffset);
+ Q_UNUSED(height);
+ Q_UNUSED(depth);
+ texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
+ xOffset, layer,
+ width,
+ layerCount,
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::Target2D:
+ Q_UNUSED(layer);
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(layerCount);
+ Q_UNUSED(zOffset);
+ Q_UNUSED(depth);
+ texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
+ xOffset, yOffset,
+ width, height,
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::Target2DArray:
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(zOffset);
+ Q_UNUSED(depth);
+ texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
+ xOffset, yOffset, layer,
+ width, height, layerCount,
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::Target3D:
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(layerCount);
+ texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
+ xOffset, yOffset, zOffset,
+ width, height, depth,
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::TargetCubeMap:
+ Q_UNUSED(layer);
+ Q_UNUSED(layerCount);
+ Q_UNUSED(zOffset);
+ Q_UNUSED(depth);
+ texFuncs->glTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
+ xOffset, yOffset,
+ width, height,
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::TargetCubeMapArray: {
+ Q_UNUSED(zOffset);
+ Q_UNUSED(depth);
+ int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
+ int layerFace = 6 * layer + faceIndex;
+ texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
+ xOffset, yOffset, layerFace,
+ width, height,
+ layerCount,
+ sourceFormat, sourceType, data, options);
+ break;
+ }
+
+ case QOpenGLTexture::TargetRectangle:
+ Q_UNUSED(mipLevel);
+ Q_UNUSED(layer);
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(layerCount);
+ Q_UNUSED(zOffset);
+ Q_UNUSED(depth);
+ texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, 0,
+ xOffset, yOffset,
+ width, height,
+ sourceFormat, sourceType, data, options);
+ break;
+
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ case QOpenGLTexture::TargetBuffer:
+ // We don't upload pixel data for these targets
+ qWarning("QOpenGLTexture::setData(): Texture target does not support pixel data upload");
+ break;
+ }
+
+ // If requested perform automatic mip map generation
+ if (mipLevel == 0 && autoGenerateMipMaps && mipLevels > 1) {
+ Q_Q(QOpenGLTexture);
+ q->generateMipMaps();
+ }
+}
+
+
+void QOpenGLTexturePrivate::setCompressedData(int mipLevel, int layer, int layerCount,
+ QOpenGLTexture::CubeMapFace cubeFace,
+ int dataSize, const void *data,
+ const QOpenGLPixelTransferOptions * const options)
+{
+ if (!isCompressedFormat(format)) {
+ qWarning("Cannot set compressed data for non-compressed format 0x%x", format);
+ return;
+ }
+
+ const bool needsFullSpec = !isUsingImmutableStorage(); // was allocateStorage() a no-op?
+
+ switch (target) {
+ case QOpenGLTexture::Target1D:
+ Q_UNUSED(layer);
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(layerCount);
+ if (needsFullSpec) {
+ texFuncs->glCompressedTextureImage1D(textureId, target, bindingTarget, mipLevel,
+ format,
+ mipLevelSize(mipLevel, dimensions[0]),
+ 0, dataSize, data, options);
+ } else {
+ texFuncs->glCompressedTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
+ 0, mipLevelSize( mipLevel, dimensions[0] ),
+ format, dataSize, data, options);
+ }
+ break;
+
+ case QOpenGLTexture::Target1DArray:
+ Q_UNUSED(cubeFace);
+ if (!needsFullSpec) {
+ texFuncs->glCompressedTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
+ 0, layer,
+ mipLevelSize(mipLevel, dimensions[0]),
+ layerCount,
+ format, dataSize, data, options);
+ }
+ break;
+
+ case QOpenGLTexture::Target2D:
+ Q_UNUSED(layer);
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(layerCount);
+ if (needsFullSpec) {
+ texFuncs->glCompressedTextureImage2D(textureId, target, bindingTarget, mipLevel,
+ format,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ 0, dataSize, data, options);
+ } else {
+ texFuncs->glCompressedTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
+ 0, 0,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ format, dataSize, data, options);
+ }
+ break;
+
+ case QOpenGLTexture::Target2DArray:
+ Q_UNUSED(cubeFace);
+ if (!needsFullSpec) {
+ texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
+ 0, 0, layer,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ layerCount,
+ format, dataSize, data, options);
+ }
+ break;
+
+ case QOpenGLTexture::Target3D:
+ Q_UNUSED(cubeFace);
+ Q_UNUSED(layerCount);
+ if (needsFullSpec) {
+ texFuncs->glCompressedTextureImage3D(textureId, target, bindingTarget, mipLevel,
+ format,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ mipLevelSize(mipLevel, dimensions[2]),
+ 0, dataSize, data, options);
+ } else {
+ texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
+ 0, 0, layer,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ mipLevelSize(mipLevel, dimensions[2]),
+ format, dataSize, data, options);
+ }
+ break;
+
+ case QOpenGLTexture::TargetCubeMap:
+ Q_UNUSED(layer);
+ Q_UNUSED(layerCount);
+ if (needsFullSpec) {
+ texFuncs->glCompressedTextureImage2D(textureId, cubeFace, bindingTarget, mipLevel,
+ format,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ 0, dataSize, data, options);
+ } else {
+ texFuncs->glCompressedTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
+ 0, 0,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ format, dataSize, data, options);
+ }
+ break;
+
+ case QOpenGLTexture::TargetCubeMapArray: {
+ int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
+ int layerFace = 6 * layer + faceIndex;
+ if (!needsFullSpec) {
+ texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
+ 0, 0, layerFace,
+ mipLevelSize(mipLevel, dimensions[0]),
+ mipLevelSize(mipLevel, dimensions[1]),
+ layerCount,
+ format, dataSize, data, options);
+ }
+ break;
+ }
+
+ case QOpenGLTexture::TargetRectangle:
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ case QOpenGLTexture::TargetBuffer:
+ // We don't upload pixel data for these targets
+ qWarning("QOpenGLTexture::setCompressedData(): Texture target does not support pixel data upload");
+ break;
+ }
+
+ // If requested perform automatic mip map generation
+ if (mipLevel == 0 && autoGenerateMipMaps && mipLevels > 1) {
+ Q_Q(QOpenGLTexture);
+ q->generateMipMaps();
+ }
+}
+
+void QOpenGLTexturePrivate::setWrapMode(QOpenGLTexture::WrapMode mode)
+{
+ switch (target) {
+ case QOpenGLTexture::Target1D:
+ case QOpenGLTexture::Target1DArray:
+ case QOpenGLTexture::TargetBuffer:
+ wrapModes[0] = mode;
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
+ break;
+
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::Target2DArray:
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetCubeMapArray:
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ case QOpenGLTexture::TargetRectangle:
+ wrapModes[0] = wrapModes[1] = mode;
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
+ break;
+
+ case QOpenGLTexture::Target3D:
+ wrapModes[0] = wrapModes[1] = wrapModes[2] = mode;
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_R, mode);
+ break;
+ }
+}
+
+void QOpenGLTexturePrivate::setWrapMode(QOpenGLTexture::CoordinateDirection direction, QOpenGLTexture::WrapMode mode)
+{
+ switch (target) {
+ case QOpenGLTexture::Target1D:
+ case QOpenGLTexture::Target1DArray:
+ case QOpenGLTexture::TargetBuffer:
+ switch (direction) {
+ case QOpenGLTexture::DirectionS:
+ wrapModes[0] = mode;
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
+ break;
+
+ case QOpenGLTexture::DirectionT:
+ case QOpenGLTexture::DirectionR:
+ qWarning("QOpenGLTexture::setWrapMode() direction not valid for this texture target");
+ break;
+ }
+ break;
+
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::Target2DArray:
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetCubeMapArray:
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ case QOpenGLTexture::TargetRectangle:
+ switch (direction) {
+ case QOpenGLTexture::DirectionS:
+ wrapModes[0] = mode;
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
+ break;
+
+ case QOpenGLTexture::DirectionT:
+ wrapModes[1] = mode;
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
+ break;
+
+ case QOpenGLTexture::DirectionR:
+ qWarning("QOpenGLTexture::setWrapMode() direction not valid for this texture target");
+ break;
+ }
+ break;
+
+ case QOpenGLTexture::Target3D:
+ switch (direction) {
+ case QOpenGLTexture::DirectionS:
+ wrapModes[0] = mode;
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
+ break;
+
+ case QOpenGLTexture::DirectionT:
+ wrapModes[1] = mode;
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
+ break;
+
+ case QOpenGLTexture::DirectionR:
+ wrapModes[2] = mode;
+ texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
+ break;
+ }
+ break;
+ }
+}
+
+QOpenGLTexture::WrapMode QOpenGLTexturePrivate::wrapMode(QOpenGLTexture::CoordinateDirection direction) const
+{
+ switch (target) {
+ case QOpenGLTexture::Target1D:
+ case QOpenGLTexture::Target1DArray:
+ case QOpenGLTexture::TargetBuffer:
+ switch (direction) {
+ case QOpenGLTexture::DirectionS:
+ return wrapModes[0];
+
+ case QOpenGLTexture::DirectionT:
+ case QOpenGLTexture::DirectionR:
+ qWarning("QOpenGLTexture::wrapMode() direction not valid for this texture target");
+ return QOpenGLTexture::Repeat;
+ }
+ break;
+
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::Target2DArray:
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetCubeMapArray:
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ case QOpenGLTexture::TargetRectangle:
+ switch (direction) {
+ case QOpenGLTexture::DirectionS:
+ return wrapModes[0];
+
+ case QOpenGLTexture::DirectionT:
+ return wrapModes[1];
+
+ case QOpenGLTexture::DirectionR:
+ qWarning("QOpenGLTexture::wrapMode() direction not valid for this texture target");
+ return QOpenGLTexture::Repeat;
+ }
+ break;
+
+ case QOpenGLTexture::Target3D:
+ switch (direction) {
+ case QOpenGLTexture::DirectionS:
+ return wrapModes[0];
+
+ case QOpenGLTexture::DirectionT:
+ return wrapModes[1];
+
+ case QOpenGLTexture::DirectionR:
+ return wrapModes[2];
+ }
+ break;
+ }
+ // Should never get here
+ Q_ASSERT(false);
+ return QOpenGLTexture::Repeat;
+}
+
+QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target viewTarget,
+ QOpenGLTexture::TextureFormat viewFormat,
+ int minimumMipmapLevel, int maximumMipmapLevel,
+ int minimumLayer, int maximumLayer) const
+{
+ // Do sanity checks - see http://www.opengl.org/wiki/GLAPI/glTextureView
+
+ // Check the targets are compatible
+ bool viewTargetCompatible = false;
+ switch (target) {
+ case QOpenGLTexture::Target1D:
+ case QOpenGLTexture::Target1DArray:
+ viewTargetCompatible = (viewTarget == QOpenGLTexture::Target1D
+ || viewTarget == QOpenGLTexture::Target1DArray);
+ break;
+
+
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::Target2DArray:
+ viewTargetCompatible = (viewTarget == QOpenGLTexture::Target2D
+ || viewTarget == QOpenGLTexture::Target2DArray);
+ break;
+
+ case QOpenGLTexture::Target3D:
+ viewTargetCompatible = (viewTarget == QOpenGLTexture::Target3D);
+ break;
+
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetCubeMapArray:
+ viewTargetCompatible = (viewTarget == QOpenGLTexture::TargetCubeMap
+ || viewTarget == QOpenGLTexture::Target2D
+ || viewTarget == QOpenGLTexture::Target2DArray
+ || viewTarget == QOpenGLTexture::TargetCubeMapArray);
+ break;
+
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ viewTargetCompatible = (viewTarget == QOpenGLTexture::Target2DMultisample
+ || viewTarget == QOpenGLTexture::Target2DMultisampleArray);
+ break;
+
+ case QOpenGLTexture::TargetRectangle:
+ viewTargetCompatible = (viewTarget == QOpenGLTexture::TargetRectangle);
+ break;
+
+ case QOpenGLTexture::TargetBuffer:
+ // Cannot be used with texture views
+ break;
+ }
+
+ if (!viewTargetCompatible) {
+ qWarning("QOpenGLTexture::createTextureView(): Incompatible source and view targets");
+ return nullptr;
+ }
+
+ // Check the formats are compatible
+ bool viewFormatCompatible = false;
+ switch (formatClass) {
+ case QOpenGLTexture::NoFormatClass:
+ break;
+
+ case QOpenGLTexture::FormatClass_128Bit:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA32F
+ || viewFormat == QOpenGLTexture::RGBA32U
+ || viewFormat == QOpenGLTexture::RGBA32I);
+ break;
+
+ case QOpenGLTexture::FormatClass_96Bit:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB32F
+ || viewFormat == QOpenGLTexture::RGB32U
+ || viewFormat == QOpenGLTexture::RGB32I);
+ break;
+
+ case QOpenGLTexture::FormatClass_64Bit:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA16F
+ || viewFormat == QOpenGLTexture::RG32F
+ || viewFormat == QOpenGLTexture::RGBA16U
+ || viewFormat == QOpenGLTexture::RG32U
+ || viewFormat == QOpenGLTexture::RGBA16I
+ || viewFormat == QOpenGLTexture::RG32I
+ || viewFormat == QOpenGLTexture::RGBA16_UNorm
+ || viewFormat == QOpenGLTexture::RGBA16_SNorm);
+ break;
+
+ case QOpenGLTexture::FormatClass_48Bit:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB16_UNorm
+ || viewFormat == QOpenGLTexture::RGB16_SNorm
+ || viewFormat == QOpenGLTexture::RGB16F
+ || viewFormat == QOpenGLTexture::RGB16U
+ || viewFormat == QOpenGLTexture::RGB16I);
+ break;
+
+ case QOpenGLTexture::FormatClass_32Bit:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RG16F
+ || viewFormat == QOpenGLTexture::RG11B10F
+ || viewFormat == QOpenGLTexture::R32F
+ || viewFormat == QOpenGLTexture::RGB10A2
+ || viewFormat == QOpenGLTexture::RGBA8U
+ || viewFormat == QOpenGLTexture::RG16U
+ || viewFormat == QOpenGLTexture::R32U
+ || viewFormat == QOpenGLTexture::RGBA8I
+ || viewFormat == QOpenGLTexture::RG16I
+ || viewFormat == QOpenGLTexture::R32I
+ || viewFormat == QOpenGLTexture::RGBA8_UNorm
+ || viewFormat == QOpenGLTexture::RG16_UNorm
+ || viewFormat == QOpenGLTexture::RGBA8_SNorm
+ || viewFormat == QOpenGLTexture::RG16_SNorm
+ || viewFormat == QOpenGLTexture::SRGB8_Alpha8
+ || viewFormat == QOpenGLTexture::RGB9E5);
+ break;
+
+ case QOpenGLTexture::FormatClass_24Bit:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB8_UNorm
+ || viewFormat == QOpenGLTexture::RGB8_SNorm
+ || viewFormat == QOpenGLTexture::SRGB8
+ || viewFormat == QOpenGLTexture::RGB8U
+ || viewFormat == QOpenGLTexture::RGB8I);
+ break;
+
+ case QOpenGLTexture::FormatClass_16Bit:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::R16F
+ || viewFormat == QOpenGLTexture::RG8U
+ || viewFormat == QOpenGLTexture::R16U
+ || viewFormat == QOpenGLTexture::RG8I
+ || viewFormat == QOpenGLTexture::R16I
+ || viewFormat == QOpenGLTexture::RG8_UNorm
+ || viewFormat == QOpenGLTexture::R16_UNorm
+ || viewFormat == QOpenGLTexture::RG8_SNorm
+ || viewFormat == QOpenGLTexture::R16_SNorm);
+ break;
+
+ case QOpenGLTexture::FormatClass_8Bit:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::R8U
+ || viewFormat == QOpenGLTexture::R8I
+ || viewFormat == QOpenGLTexture::R8_UNorm
+ || viewFormat == QOpenGLTexture::R8_SNorm);
+ break;
+
+ case QOpenGLTexture::FormatClass_RGTC1_R:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::R_ATI1N_UNorm
+ || viewFormat == QOpenGLTexture::R_ATI1N_SNorm);
+ break;
+
+ case QOpenGLTexture::FormatClass_RGTC2_RG:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RG_ATI2N_UNorm
+ || viewFormat == QOpenGLTexture::RG_ATI2N_SNorm);
+ break;
+
+ case QOpenGLTexture::FormatClass_BPTC_Unorm:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_BP_UNorm
+ || viewFormat == QOpenGLTexture::SRGB_BP_UNorm);
+ break;
+
+ case QOpenGLTexture::FormatClass_BPTC_Float:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT
+ || viewFormat == QOpenGLTexture::RGB_BP_SIGNED_FLOAT);
+ break;
+
+ case QOpenGLTexture::FormatClass_S3TC_DXT1_RGB:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_DXT1
+ || viewFormat == QOpenGLTexture::SRGB_DXT1);
+ break;
+
+ case QOpenGLTexture::FormatClass_S3TC_DXT1_RGBA:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT1
+ || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT1);
+ break;
+
+ case QOpenGLTexture::FormatClass_S3TC_DXT3_RGBA:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT3
+ || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT3);
+ break;
+
+ case QOpenGLTexture::FormatClass_S3TC_DXT5_RGBA:
+ viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT5
+ || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT5);
+ break;
+
+ case QOpenGLTexture::FormatClass_Unique:
+ viewFormatCompatible = (viewFormat == format);
+ break;
+ }
+
+ if (!viewFormatCompatible) {
+ qWarning("QOpenGLTexture::createTextureView(): Incompatible source and view formats");
+ return nullptr;
+ }
+
+
+ // Create a view
+ QOpenGLTexture *view = new QOpenGLTexture(viewTarget);
+ view->setFormat(viewFormat);
+ view->create();
+ view->d_ptr->textureView = true;
+ texFuncs->glTextureView(view->textureId(), viewTarget, textureId, viewFormat,
+ minimumMipmapLevel, maximumMipmapLevel - minimumMipmapLevel + 1,
+ minimumLayer, maximumLayer - minimumLayer + 1);
+ return view;
+}
+
+
+/*!
+ \class QOpenGLTexture
+ \inmodule QtGui
+ \since 5.2
+ \wrapper
+ \brief The QOpenGLTexture class encapsulates an OpenGL texture object.
+
+ QOpenGLTexture makes it easy to work with OpenGL textures and the myriad features
+ and targets that they offer depending upon the capabilities of your OpenGL implementation.
+
+ The typical usage pattern for QOpenGLTexture is
+ \list
+ \li Instantiate the object specifying the texture target type
+ \li Set properties that affect the storage requirements e.g. storage format, dimensions
+ \li Allocate the server-side storage
+ \li Optionally upload pixel data
+ \li Optionally set any additional properties e.g. filtering and border options
+ \li Render with texture or render to texture
+ \endlist
+
+ In the common case of simply using a QImage as the source of texture pixel data
+ most of the above steps are performed automatically.
+
+ \code
+ // Prepare texture
+ QOpenGLTexture *texture = new QOpenGLTexture(QImage(fileName).mirrored());
+ texture->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
+ texture->setMagnificationFilter(QOpenGLTexture::Linear);
+ ...
+ // Render with texture
+ texture->bind();
+ glDrawArrays(...);
+ \endcode
+
+ Note that the QImage is mirrored vertically to account for the fact that
+ OpenGL and QImage use opposite directions for the y axis. Another option
+ would be to transform your texture coordinates.
+*/
+
+/*!
+ \enum QOpenGLTexture::Filter
+ This enum defines the filtering parameters for a QOpenGLTexture object.
+ \value Nearest Equivalent to GL_NEAREST
+ \value Linear Equivalent to GL_LINEAR
+ \value NearestMipMapNearest Equivalent to GL_NEAREST_MIPMAP_NEAREST
+ \value NearestMipMapLinear Equivalent to GL_NEAREST_MIPMAP_LINEAR
+ \value LinearMipMapNearest Equivalent to GL_LINEAR_MIPMAP_NEAREST
+ \value LinearMipMapLinear Equivalent to GL_LINEAR_MIPMAP_LINEAR
+*/
+
+/*!
+ \enum QOpenGLTexture::Target
+ This enum defines the texture target of a QOpenGLTexture object.
+ For more information on creating array textures, see \l{Array Texture}.
+
+ \value Target1D A 1-dimensional texture.
+ Equivalent to GL_TEXTURE_1D.
+ \value Target1DArray An array of 1-dimensional textures.
+ Equivalent to GL_TEXTURE_1D_ARRAY
+ \value Target2D A 2-dimensional texture.
+ Equivalent to GL_TEXTURE_2D
+ \value Target2DArray An array of 2-dimensional textures.
+ Equivalent to GL_TEXTURE_2D_ARRAY
+ \value Target3D A 3-dimensional texture.
+ Equivalent to GL_TEXTURE_3D
+ \value TargetCubeMap A cubemap texture.
+ Equivalent to GL_TEXTURE_CUBE_MAP
+ \value TargetCubeMapArray An array of cubemap textures.
+ Equivalent to GL_TEXTURE_CUBE_MAP_ARRAY
+ \value Target2DMultisample A 2-dimensional texture with multisample support.
+ Equivalent to GL_TEXTURE_2D_MULTISAMPLE
+ \value Target2DMultisampleArray An array of 2-dimensional textures with multisample support.
+ Equivalent to GL_TEXTURE_2D_MULTISAMPLE_ARRAY
+ \value TargetRectangle A rectangular 2-dimensional texture.
+ Equivalent to GL_TEXTURE_RECTANGLE
+ \value TargetBuffer A texture with data from an OpenGL buffer object.
+ Equivalent to GL_TEXTURE_BUFFER
+*/
+
+/*!
+ \enum QOpenGLTexture::BindingTarget
+ This enum defines the possible binding targets of texture units.
+
+ \value BindingTarget1D Equivalent to GL_TEXTURE_BINDING_1D
+ \value BindingTarget1DArray Equivalent to GL_TEXTURE_BINDING_1D_ARRAY
+ \value BindingTarget2D Equivalent to GL_TEXTURE_BINDING_2D
+ \value BindingTarget2DArray Equivalent to GL_TEXTURE_BINDING_2D_ARRAY
+ \value BindingTarget3D Equivalent to GL_TEXTURE_BINDING_3D
+ \value BindingTargetCubeMap Equivalent to GL_TEXTURE_BINDING_CUBE_MAP
+ \value BindingTargetCubeMapArray Equivalent to GL_TEXTURE_BINDING_CUBE_MAP_ARRAY
+ \value BindingTarget2DMultisample Equivalent to GL_TEXTURE_BINDING_2D_MULTISAMPLE
+ \value BindingTarget2DMultisampleArray Equivalent to GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY
+ \value BindingTargetRectangle Equivalent to GL_TEXTURE_BINDING_RECTANGLE
+ \value BindingTargetBuffer Equivalent to GL_TEXTURE_BINDING_BUFFER
+*/
+
+/*!
+ \enum QOpenGLTexture::MipMapGeneration
+ This enum defines the options to control mipmap generation.
+
+ \value GenerateMipMaps Mipmaps should be generated
+ \value DontGenerateMipMaps Mipmaps should not be generated
+*/
+
+/*!
+ \enum QOpenGLTexture::TextureUnitReset
+ This enum defines options ot control texture unit activation.
+
+ \value ResetTextureUnit The previous active texture unit will be reset
+ \value DontResetTextureUnit The previous active texture unit will not be rest
+*/
+
+/*!
+ \enum QOpenGLTexture::TextureFormat
+ This enum defines the possible texture formats. Depending upon your OpenGL
+ implementation only a subset of these may be supported.
+
+ \value NoFormat Equivalent to GL_NONE
+
+ \value R8_UNorm Equivalent to GL_R8
+ \value RG8_UNorm Equivalent to GL_RG8
+ \value RGB8_UNorm Equivalent to GL_RGB8
+ \value RGBA8_UNorm Equivalent to GL_RGBA8
+
+ \value R16_UNorm Equivalent to GL_R16
+ \value RG16_UNorm Equivalent to GL_RG16
+ \value RGB16_UNorm Equivalent to GL_RGB16
+ \value RGBA16_UNorm Equivalent to GL_RGBA16
+
+ \value R8_SNorm Equivalent to GL_R8_SNORM
+ \value RG8_SNorm Equivalent to GL_RG8_SNORM
+ \value RGB8_SNorm Equivalent to GL_RGB8_SNORM
+ \value RGBA8_SNorm Equivalent to GL_RGBA8_SNORM
+
+ \value R16_SNorm Equivalent to GL_R16_SNORM
+ \value RG16_SNorm Equivalent to GL_RG16_SNORM
+ \value RGB16_SNorm Equivalent to GL_RGB16_SNORM
+ \value RGBA16_SNorm Equivalent to GL_RGBA16_SNORM
+
+ \value R8U Equivalent to GL_R8UI
+ \value RG8U Equivalent to GL_RG8UI
+ \value RGB8U Equivalent to GL_RGB8UI
+ \value RGBA8U Equivalent to GL_RGBA8UI
+
+ \value R16U Equivalent to GL_R16UI
+ \value RG16U Equivalent to GL_RG16UI
+ \value RGB16U Equivalent to GL_RGB16UI
+ \value RGBA16U Equivalent to GL_RGBA16UI
+
+ \value R32U Equivalent to GL_R32UI
+ \value RG32U Equivalent to GL_RG32UI
+ \value RGB32U Equivalent to GL_RGB32UI
+ \value RGBA32U Equivalent to GL_RGBA32UI
+
+ \value R8I Equivalent to GL_R8I
+ \value RG8I Equivalent to GL_RG8I
+ \value RGB8I Equivalent to GL_RGB8I
+ \value RGBA8I Equivalent to GL_RGBA8I
+
+ \value R16I Equivalent to GL_R16I
+ \value RG16I Equivalent to GL_RG16I
+ \value RGB16I Equivalent to GL_RGB16I
+ \value RGBA16I Equivalent to GL_RGBA16I
+
+ \value R32I Equivalent to GL_R32I
+ \value RG32I Equivalent to GL_RG32I
+ \value RGB32I Equivalent to GL_RGB32I
+ \value RGBA32I Equivalent to GL_RGBA32I
+
+ \value R16F Equivalent to GL_R16F
+ \value RG16F Equivalent to GL_RG16F
+ \value RGB16F Equivalent to GL_RGB16F
+ \value RGBA16F Equivalent to GL_RGBA16F
+
+ \value R32F Equivalent to GL_R32F
+ \value RG32F Equivalent to GL_RG32F
+ \value RGB32F Equivalent to GL_RGB32F
+ \value RGBA32F Equivalent to GL_RGBA32F
+
+ \value RGB9E5 Equivalent to GL_RGB9_E5
+ \value RG11B10F Equivalent to GL_R11F_G11F_B10F
+ \value RG3B2 Equivalent to GL_R3_G3_B2
+ \value R5G6B5 Equivalent to GL_RGB565
+ \value RGB5A1 Equivalent to GL_RGB5_A1
+ \value RGBA4 Equivalent to GL_RGBA4
+ \value RGB10A2 Equivalent to GL_RGB10_A2UI
+
+ \value D16 Equivalent to GL_DEPTH_COMPONENT16
+ \value D24 Equivalent to GL_DEPTH_COMPONENT24
+ \value D24S8 Equivalent to GL_DEPTH24_STENCIL8
+ \value D32 Equivalent to GL_DEPTH_COMPONENT32
+ \value D32F Equivalent to GL_DEPTH_COMPONENT32F
+ \value D32FS8X24 Equivalent to GL_DEPTH32F_STENCIL8
+ \value S8 Equivalent to GL_STENCIL_INDEX8. Introduced in Qt 5.4
+
+ \value RGB_DXT1 Equivalent to GL_COMPRESSED_RGB_S3TC_DXT1_EXT
+ \value RGBA_DXT1 Equivalent to GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
+ \value RGBA_DXT3 Equivalent to GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
+ \value RGBA_DXT5 Equivalent to GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
+ \value R_ATI1N_UNorm Equivalent to GL_COMPRESSED_RED_RGTC1
+ \value R_ATI1N_SNorm Equivalent to GL_COMPRESSED_SIGNED_RED_RGTC1
+ \value RG_ATI2N_UNorm Equivalent to GL_COMPRESSED_RG_RGTC2
+ \value RG_ATI2N_SNorm Equivalent to GL_COMPRESSED_SIGNED_RG_RGTC2
+ \value RGB_BP_UNSIGNED_FLOAT Equivalent to GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
+ \value RGB_BP_SIGNED_FLOAT Equivalent to GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
+ \value RGB_BP_UNorm Equivalent to GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
+ \value R11_EAC_UNorm Equivalent to GL_COMPRESSED_R11_EAC
+ \value R11_EAC_SNorm Equivalent to GL_COMPRESSED_SIGNED_R11_EAC
+ \value RG11_EAC_UNorm Equivalent to GL_COMPRESSED_RG11_EAC
+ \value RG11_EAC_SNorm Equivalent to GL_COMPRESSED_SIGNED_RG11_EAC
+ \value RGB8_ETC2 Equivalent to GL_COMPRESSED_RGB8_ETC2
+ \value SRGB8_ETC2 Equivalent to GL_COMPRESSED_SRGB8_ETC2
+ \value RGB8_PunchThrough_Alpha1_ETC2 Equivalent to GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
+ \value SRGB8_PunchThrough_Alpha1_ETC2 Equivalent to GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
+ \value RGBA8_ETC2_EAC Equivalent to GL_COMPRESSED_RGBA8_ETC2_EAC
+ \value SRGB8_Alpha8_ETC2_EAC Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
+ \value RGB8_ETC1 Equivalent to GL_ETC1_RGB8_OES
+ \value RGBA_ASTC_4x4 Equivalent to GL_COMPRESSED_RGBA_ASTC_4x4_KHR
+ \value RGBA_ASTC_5x4 Equivalent to GL_COMPRESSED_RGBA_ASTC_5x4_KHR
+ \value RGBA_ASTC_5x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_5x5_KHR
+ \value RGBA_ASTC_6x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_6x5_KHR
+ \value RGBA_ASTC_6x6 Equivalent to GL_COMPRESSED_RGBA_ASTC_6x6_KHR
+ \value RGBA_ASTC_8x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_8x5_KHR
+ \value RGBA_ASTC_8x6 Equivalent to GL_COMPRESSED_RGBA_ASTC_8x6_KHR
+ \value RGBA_ASTC_8x8 Equivalent to GL_COMPRESSED_RGBA_ASTC_8x8_KHR
+ \value RGBA_ASTC_10x5 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x5_KHR
+ \value RGBA_ASTC_10x6 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x6_KHR
+ \value RGBA_ASTC_10x8 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x8_KHR
+ \value RGBA_ASTC_10x10 Equivalent to GL_COMPRESSED_RGBA_ASTC_10x10_KHR
+ \value RGBA_ASTC_12x10 Equivalent to GL_COMPRESSED_RGBA_ASTC_12x10_KHR
+ \value RGBA_ASTC_12x12 Equivalent to GL_COMPRESSED_RGBA_ASTC_12x12_KHR
+ \value SRGB8_Alpha8_ASTC_4x4 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR
+ \value SRGB8_Alpha8_ASTC_5x4 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR
+ \value SRGB8_Alpha8_ASTC_5x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR
+ \value SRGB8_Alpha8_ASTC_6x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR
+ \value SRGB8_Alpha8_ASTC_6x6 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR
+ \value SRGB8_Alpha8_ASTC_8x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR
+ \value SRGB8_Alpha8_ASTC_8x6 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR
+ \value SRGB8_Alpha8_ASTC_8x8 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR
+ \value SRGB8_Alpha8_ASTC_10x5 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR
+ \value SRGB8_Alpha8_ASTC_10x6 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR
+ \value SRGB8_Alpha8_ASTC_10x8 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR
+ \value SRGB8_Alpha8_ASTC_10x10 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR
+ \value SRGB8_Alpha8_ASTC_12x10 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR
+ \value SRGB8_Alpha8_ASTC_12x12 Equivalent to GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR
+
+ \value SRGB8 Equivalent to GL_SRGB8
+ \value SRGB8_Alpha8 Equivalent to GL_SRGB8_ALPHA8
+ \value SRGB_DXT1 Equivalent to GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
+ \value SRGB_Alpha_DXT1 Equivalent to GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
+ \value SRGB_Alpha_DXT3 Equivalent to GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
+ \value SRGB_Alpha_DXT5 Equivalent to GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
+ \value SRGB_BP_UNorm Equivalent to GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
+
+ \value DepthFormat Equivalent to GL_DEPTH_COMPONENT (only OpenGL ES 3 or ES 2 with OES_depth_texture)
+ \value AlphaFormat Equivalent to GL_ALPHA (OpenGL ES 2 only)
+ \value RGBFormat Equivalent to GL_RGB (OpenGL ES 2 only)
+ \value RGBAFormat Equivalent to GL_RGBA (OpenGL ES 2 only)
+ \value LuminanceFormat Equivalent to GL_LUMINANCE (OpenGL ES 2 only)
+ \value LuminanceAlphaFormat Equivalent to GL_LUMINANCE_ALPHA (OpenGL ES 2 only)
+*/
+
+/*!
+ \enum QOpenGLTexture::CubeMapFace
+ This enum defines the possible CubeMap faces.
+
+ \value CubeMapPositiveX Equivalent to GL_TEXTURE_CUBE_MAP_POSITIVE_X
+ \value CubeMapNegativeX Equivalent to GL_TEXTURE_CUBE_MAP_NEGATIVE_X
+ \value CubeMapPositiveY Equivalent to GL_TEXTURE_CUBE_MAP_POSITIVE_Y
+ \value CubeMapNegativeY Equivalent to GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
+ \value CubeMapPositiveZ Equivalent to GL_TEXTURE_CUBE_MAP_POSITIVE_Z
+ \value CubeMapNegativeZ Equivalent to GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+*/
+
+/*!
+ \enum QOpenGLTexture::PixelFormat
+ This enum defines the possible client-side pixel formats for a pixel
+ transfer operation.
+
+ \value NoSourceFormat Equivalent to GL_NONE
+ \value Red Equivalent to GL_RED
+ \value RG Equivalent to GL_RG
+ \value RGB Equivalent to GL_RGB
+ \value BGR Equivalent to GL_BGR
+ \value RGBA Equivalent to GL_RGBA
+ \value BGRA Equivalent to GL_BGRA
+ \value Red_Integer Equivalent to GL_RED_INTEGER
+ \value RG_Integer Equivalent to GL_RG_INTEGER
+ \value RGB_Integer Equivalent to GL_RGB_INTEGER
+ \value BGR_Integer Equivalent to GL_BGR_INTEGER
+ \value RGBA_Integer Equivalent to GL_RGBA_INTEGER
+ \value BGRA_Integer Equivalent to GL_BGRA_INTEGER
+ \value Stencil Equivalent to GL_STENCIL_INDEX. Introduced in Qt 5.4
+ \value Depth Equivalent to GL_DEPTH_COMPONENT
+ \value DepthStencil Equivalent to GL_DEPTH_STENCIL
+ \value Alpha Equivalent to GL_ALPHA (OpenGL ES 2 only)
+ \value Luminance Equivalent to GL_LUMINANCE (OpenGL ES 2 only)
+ \value LuminanceAlpha Equivalent to GL_LUMINANCE_ALPHA (OpenGL ES 2 only)
+
+*/
+
+/*!
+ \enum QOpenGLTexture::PixelType
+ This enum defines the possible pixel data types for a pixel transfer operation
+
+ \value NoPixelType Equivalent to GL_NONE
+ \value Int8 Equivalent to GL_BYTE
+ \value UInt8 Equivalent to GL_UNSIGNED_BYTE
+ \value Int16 Equivalent to GL_SHORT
+ \value UInt16 Equivalent to GL_UNSIGNED_SHORT
+ \value Int32 Equivalent to GL_INT
+ \value UInt32 Equivalent to GL_UNSIGNED_INT
+ \value Float16 Equivalent to GL_HALF_FLOAT
+ \value Float16OES Equivalent to GL_HALF_FLOAT_OES
+ \value Float32 Equivalent to GL_FLOAT
+ \value UInt32_RGB9_E5 Equivalent to GL_UNSIGNED_INT_5_9_9_9_REV
+ \value UInt32_RG11B10F Equivalent to GL_UNSIGNED_INT_10F_11F_11F_REV
+ \value UInt8_RG3B2 Equivalent to GL_UNSIGNED_BYTE_3_3_2
+ \value UInt8_RG3B2_Rev Equivalent to GL_UNSIGNED_BYTE_2_3_3_REV
+ \value UInt16_RGB5A1 Equivalent to GL_UNSIGNED_SHORT_5_5_5_1
+ \value UInt16_RGB5A1_Rev Equivalent to GL_UNSIGNED_SHORT_1_5_5_5_REV
+ \value UInt16_R5G6B5 Equivalent to GL_UNSIGNED_SHORT_5_6_5
+ \value UInt16_R5G6B5_Rev Equivalent to GL_UNSIGNED_SHORT_5_6_5_REV
+ \value UInt16_RGBA4 Equivalent to GL_UNSIGNED_SHORT_4_4_4_4
+ \value UInt16_RGBA4_Rev Equivalent to GL_UNSIGNED_SHORT_4_4_4_4_REV
+ \value UInt32_RGBA8 Equivalent to GL_UNSIGNED_INT_8_8_8_8
+ \value UInt32_RGBA8_Rev Equivalent to GL_UNSIGNED_INT_8_8_8_8_REV
+ \value UInt32_RGB10A2 Equivalent to GL_UNSIGNED_INT_10_10_10_2
+ \value UInt32_RGB10A2_Rev Equivalent to GL_UNSIGNED_INT_2_10_10_10_REV
+ \value UInt32_D24S8 Equivalent to GL_UNSIGNED_INT_24_8. Introduced in Qt 5.4
+ \value Float32_D32_UInt32_S8_X24 Equivalent to GL_FLOAT_32_UNSIGNED_INT_24_8_REV. Introduced in Qt 5.4
+*/
+
+/*!
+ \enum QOpenGLTexture::Feature
+ This enum defines the OpenGL texture-related features that can be tested for.
+
+ \value ImmutableStorage Support for immutable texture storage
+ \value ImmutableMultisampleStorage Support for immutable texture storage with
+ multisample targets
+ \value TextureRectangle Support for the GL_TEXTURE_RECTANGLE target
+ \value TextureArrays Support for texture targets with array layers
+ \value Texture3D Support for the 3 dimensional texture target
+ \value TextureMultisample Support for texture targets that have multisample capabilities
+ \value TextureBuffer Support for textures that use OpenGL buffer objects
+ as their data source
+ \value TextureCubeMapArrays Support for cubemap array texture target
+ \value Swizzle Support for texture component swizzle masks
+ \value StencilTexturing Support for stencil texturing (i.e. looking up depth or stencil
+ components of a combined depth/stencil format texture in GLSL shaders).
+ \value AnisotropicFiltering Support for anisotropic texture filtering
+ \value NPOTTextures Basic support for non-power-of-two textures
+ \value NPOTTextureRepeat Full support for non-power-of-two textures including texture
+ repeat modes
+ \value Texture1D Support for the 1 dimensional texture target
+ \value TextureComparisonOperators Support for texture comparison operators
+ \value TextureMipMapLevel Support for setting the base and maximum mipmap levels
+*/
+
+/*!
+ \enum QOpenGLTexture::SwizzleComponent
+ This enum defines the texture color components that can be assigned a swizzle mask.
+
+ \value SwizzleRed The red component. Equivalent to GL_TEXTURE_SWIZZLE_R
+ \value SwizzleGreen The green component. Equivalent to GL_TEXTURE_SWIZZLE_G
+ \value SwizzleBlue The blue component. Equivalent to GL_TEXTURE_SWIZZLE_B
+ \value SwizzleAlpha The alpha component. Equivalent to GL_TEXTURE_SWIZZLE_A
+*/
+
+/*!
+ \enum QOpenGLTexture::SwizzleValue
+ This enum defines the possible mask values for texture swizzling.
+
+ \value RedValue Maps the component to the red channel. Equivalent to GL_RED
+ \value GreenValue Maps the component to the green channel. Equivalent to GL_GREEN
+ \value BlueValue Maps the component to the blue channel. Equivalent to GL_BLUE
+ \value AlphaValue Maps the component to the alpha channel. Equivalent to GL_ALPHA
+ \value ZeroValue Maps the component to a fixed value of 0. Equivalent to GL_ZERO
+ \value OneValue Maps the component to a fixed value of 1. Equivalent to GL_ONE
+*/
+
+/*!
+ \enum QOpenGLTexture::WrapMode
+ This enum defines the possible texture coordinate wrapping modes.
+
+ \value Repeat Texture coordinate is repeated. Equivalent to GL_REPEAT
+ \value MirroredRepeat Texture coordinate is reflected about 0 and 1. Equivalent to GL_MIRRORED_REPEAT
+ \value ClampToEdge Clamps the texture coordinates to [0,1]. Equivalent to GL_CLAMP_TO_EDGE
+ \value ClampToBorder As for ClampToEdge but also blends samples at 0 and 1 with a
+ fixed border color. Equivalent to GL_CLAMP_TO_BORDER
+*/
+
+/*!
+ \enum QOpenGLTexture::CoordinateDirection
+ This enum defines the possible texture coordinate directions
+
+ \value DirectionS The horizontal direction. Equivalent to GL_TEXTURE_WRAP_S
+ \value DirectionT The vertical direction. Equivalent to GL_TEXTURE_WRAP_T
+ \value DirectionR The depth direction. Equivalent to GL_TEXTURE_WRAP_R
+*/
+
+/*!
+ Creates a QOpenGLTexture object that can later be bound to \a target.
+
+ This does not create the underlying OpenGL texture object. Therefore,
+ construction using this constructor does not require a valid current
+ OpenGL context.
+*/
+QOpenGLTexture::QOpenGLTexture(Target target)
+ : d_ptr(new QOpenGLTexturePrivate(target, this))
+{
+}
+
+/*!
+ Creates a QOpenGLTexture object that can later be bound to the 2D texture
+ target and contains the pixel data contained in \a image. If you wish
+ to have a chain of mipmaps generated then set \a genMipMaps to \c true (this
+ is the default).
+
+ This does create the underlying OpenGL texture object. Therefore,
+ construction using this constructor does require a valid current
+ OpenGL context.
+*/
+QOpenGLTexture::QOpenGLTexture(const QImage& image, MipMapGeneration genMipMaps)
+ : QOpenGLTexture(QOpenGLTexture::Target2D)
+{
+ setData(image, genMipMaps);
+}
+
+QOpenGLTexture::~QOpenGLTexture()
+{
+}
+
+/*!
+ Returns the binding target of this texture.
+
+ \since 5.4
+*/
+QOpenGLTexture::Target QOpenGLTexture::target() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->target;
+}
+
+/*!
+ Creates the underlying OpenGL texture object. This requires a current valid
+ OpenGL context. If the texture object already exists, this function does
+ nothing.
+
+ Once the texture object is created you can obtain the object
+ name from the textureId() function. This may be useful if you wish to make
+ some raw OpenGL calls related to this texture.
+
+ Normally it should not be necessary to call this function directly as all
+ functions that set properties of the texture object implicitly call create()
+ on your behalf.
+
+ Returns \c true if the creation succeeded, otherwise returns \c false.
+
+ \sa destroy(), isCreated(), textureId()
+*/
+bool QOpenGLTexture::create()
+{
+ Q_D(QOpenGLTexture);
+ return d->create();
+}
+
+/*!
+ Destroys the underlying OpenGL texture object. This requires a current valid
+ OpenGL context.
+
+ \sa create(), isCreated(), textureId()
+*/
+void QOpenGLTexture::destroy()
+{
+ Q_D(QOpenGLTexture);
+ return d->destroy();
+}
+
+/*!
+ Returns \c true if the underlying OpenGL texture object has been created.
+
+ \sa create(), destroy(), textureId()
+*/
+bool QOpenGLTexture::isCreated() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->textureId != 0;
+}
+
+/*!
+ Returns the name of the underlying OpenGL texture object or 0 if it has
+ not yet been created.
+
+ \sa create(), destroy(), isCreated()
+*/
+GLuint QOpenGLTexture::textureId() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->textureId;
+}
+
+/*!
+ Binds this texture to the currently active texture unit ready for
+ rendering. Note that you do not need to bind QOpenGLTexture objects
+ in order to modify them as the implementation makes use of the
+ EXT_direct_state_access extension where available and simulates it
+ where it is not.
+
+ \sa release()
+*/
+void QOpenGLTexture::bind()
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->bind();
+}
+
+/*!
+ Binds this texture to texture unit \a unit ready for
+ rendering. Note that you do not need to bind QOpenGLTexture objects
+ in order to modify them as the implementation makes use of the
+ EXT_direct_state_access extension where available and simulates it
+ where it is not.
+
+ If parameter \a reset is \c true then this function will restore
+ the active unit to the texture unit that was active upon entry.
+
+ \sa release()
+*/
+void QOpenGLTexture::bind(uint unit, TextureUnitReset reset)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->bind(unit, reset);
+}
+
+/*!
+ Unbinds this texture from the currently active texture unit.
+
+ \sa bind()
+*/
+void QOpenGLTexture::release()
+{
+ Q_D(QOpenGLTexture);
+ d->release();
+}
+
+/*!
+ Unbinds this texture from texture unit \a unit.
+
+ If parameter \a reset is \c true then this function
+ will restore the active unit to the texture unit that was active
+ upon entry.
+*/
+void QOpenGLTexture::release(uint unit, TextureUnitReset reset)
+{
+ Q_D(QOpenGLTexture);
+ d->release(unit, reset);
+}
+
+/*!
+ Returns \c true if this texture is bound to the corresponding target
+ of the currently active texture unit.
+
+ \sa bind(), release()
+*/
+bool QOpenGLTexture::isBound() const
+{
+ Q_D(const QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ return d->isBound();
+}
+
+/*!
+ Returns \c true if this texture is bound to the corresponding target
+ of texture unit \a unit.
+
+ \sa bind(), release()
+*/
+bool QOpenGLTexture::isBound(uint unit)
+{
+ Q_D(const QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ return d->isBound(unit);
+}
+
+/*!
+ Returns the textureId of the texture that is bound to the \a target
+ of the currently active texture unit.
+*/
+GLuint QOpenGLTexture::boundTextureId(BindingTarget target)
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (!ctx) {
+ qWarning("QOpenGLTexture::boundTextureId() requires a valid current context");
+ return 0;
+ }
+
+ GLint textureId = 0;
+ ctx->functions()->glGetIntegerv(target, &textureId);
+ return static_cast<GLuint>(textureId);
+}
+
+/*!
+ Returns the textureId of the texture that is bound to the \a target
+ of the texture unit \a unit.
+*/
+GLuint QOpenGLTexture::boundTextureId(uint unit, BindingTarget target)
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (!ctx) {
+ qWarning("QOpenGLTexture::boundTextureId() requires a valid current context");
+ return 0;
+ }
+
+ QOpenGLFunctions *funcs = ctx->functions();
+ funcs->initializeOpenGLFunctions();
+
+ GLint oldTextureUnit = 0;
+ funcs->glGetIntegerv(GL_ACTIVE_TEXTURE, &oldTextureUnit);
+
+ funcs->glActiveTexture(unit);
+ GLint textureId = 0;
+ funcs->glGetIntegerv(target, &textureId);
+ funcs->glActiveTexture(oldTextureUnit);
+
+ return static_cast<GLuint>(textureId);
+}
+
+/*!
+ Sets the format of this texture object to \a format. This function
+ must be called before texture storage is allocated.
+
+ Note that all formats may not be supported. The exact set of supported
+ formats is dependent upon your OpenGL implementation and version.
+
+ \sa format(), allocateStorage()
+*/
+void QOpenGLTexture::setFormat(TextureFormat format)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ if (isStorageAllocated()) {
+ qWarning("QOpenGLTexture::setFormat(): Cannot change format once storage has been allocated");
+ return;
+ }
+
+ d->format = format;
+
+ switch (format) {
+ case NoFormat:
+ d->formatClass = NoFormatClass;
+ break;
+
+ case RGBA32F:
+ case RGBA32U:
+ case RGBA32I:
+ d->formatClass = FormatClass_128Bit;
+ break;
+
+ case RGB32F:
+ case RGB32U:
+ case RGB32I:
+ d->formatClass = FormatClass_96Bit;
+ break;
+
+ case RGBA16F:
+ case RG32F:
+ case RGBA16U:
+ case RG32U:
+ case RGBA16I:
+ case RG32I:
+ case RGBA16_UNorm:
+ case RGBA16_SNorm:
+ d->formatClass = FormatClass_64Bit;
+ break;
+
+ case RGB16_UNorm:
+ case RGB16_SNorm:
+ case RGB16F:
+ case RGB16U:
+ case RGB16I:
+ d->formatClass = FormatClass_48Bit;
+ break;
+
+ case RG16F:
+ case RG11B10F:
+ case R32F:
+ case RGB10A2:
+ case RGBA8U:
+ case RG16U:
+ case R32U:
+ case RGBA8I:
+ case RG16I:
+ case R32I:
+ case RGBA8_UNorm:
+ case RG16_UNorm:
+ case RGBA8_SNorm:
+ case RG16_SNorm:
+ case SRGB8_Alpha8:
+ case RGB9E5:
+ d->formatClass = FormatClass_32Bit;
+ break;
+
+ case RGB8_UNorm:
+ case RGB8_SNorm:
+ case SRGB8:
+ case RGB8U:
+ case RGB8I:
+ d->formatClass = FormatClass_24Bit;
+ break;
+
+ case R16F:
+ case RG8U:
+ case R16U:
+ case RG8I:
+ case R16I:
+ case RG8_UNorm:
+ case R16_UNorm:
+ case RG8_SNorm:
+ case R16_SNorm:
+ d->formatClass = FormatClass_16Bit;
+ break;
+
+ case R8U:
+ case R8I:
+ case R8_UNorm:
+ case R8_SNorm:
+ d->formatClass = FormatClass_8Bit;
+ break;
+
+ case R_ATI1N_UNorm:
+ case R_ATI1N_SNorm:
+ d->formatClass = FormatClass_RGTC1_R;
+ break;
+
+ case RG_ATI2N_UNorm:
+ case RG_ATI2N_SNorm:
+ d->formatClass = FormatClass_RGTC2_RG;
+ break;
+
+ case RGB_BP_UNorm:
+ case SRGB_BP_UNorm:
+ d->formatClass = FormatClass_BPTC_Unorm;
+ break;
+
+ case RGB_BP_UNSIGNED_FLOAT:
+ case RGB_BP_SIGNED_FLOAT:
+ d->formatClass = FormatClass_BPTC_Float;
+ break;
+
+ case RGB_DXT1:
+ case SRGB_DXT1:
+ d->formatClass = FormatClass_S3TC_DXT1_RGB;
+ break;
+
+ case RGBA_DXT1:
+ case SRGB_Alpha_DXT1:
+ d->formatClass = FormatClass_S3TC_DXT1_RGBA;
+ break;
+
+ case RGBA_DXT3:
+ case SRGB_Alpha_DXT3:
+ d->formatClass = FormatClass_S3TC_DXT3_RGBA;
+ break;
+
+ case RGBA_DXT5:
+ case SRGB_Alpha_DXT5:
+ d->formatClass = FormatClass_S3TC_DXT5_RGBA;
+ break;
+
+ case QOpenGLTexture::R11_EAC_UNorm:
+ case QOpenGLTexture::R11_EAC_SNorm:
+ case QOpenGLTexture::RG11_EAC_UNorm:
+ case QOpenGLTexture::RG11_EAC_SNorm:
+ case QOpenGLTexture::RGB8_ETC2:
+ case QOpenGLTexture::SRGB8_ETC2:
+ case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
+ case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
+ case QOpenGLTexture::RGBA8_ETC2_EAC:
+ case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
+ case QOpenGLTexture::RGB8_ETC1:
+ case RG3B2:
+ case R5G6B5:
+ case RGB5A1:
+ case RGBA4:
+ case D16:
+ case D24:
+ case D24S8:
+ case D32:
+ case D32F:
+ case D32FS8X24:
+ case S8:
+ case DepthFormat:
+ case AlphaFormat:
+ case RGBFormat:
+ case RGBAFormat:
+ case LuminanceFormat:
+ case LuminanceAlphaFormat:
+ case QOpenGLTexture::RGBA_ASTC_4x4:
+ case QOpenGLTexture::RGBA_ASTC_5x4:
+ case QOpenGLTexture::RGBA_ASTC_5x5:
+ case QOpenGLTexture::RGBA_ASTC_6x5:
+ case QOpenGLTexture::RGBA_ASTC_6x6:
+ case QOpenGLTexture::RGBA_ASTC_8x5:
+ case QOpenGLTexture::RGBA_ASTC_8x6:
+ case QOpenGLTexture::RGBA_ASTC_8x8:
+ case QOpenGLTexture::RGBA_ASTC_10x5:
+ case QOpenGLTexture::RGBA_ASTC_10x6:
+ case QOpenGLTexture::RGBA_ASTC_10x8:
+ case QOpenGLTexture::RGBA_ASTC_10x10:
+ case QOpenGLTexture::RGBA_ASTC_12x10:
+ case QOpenGLTexture::RGBA_ASTC_12x12:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
+ case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
+ d->formatClass = FormatClass_Unique;
+ break;
+ }
+}
+
+/*!
+ Returns the format of this texture object.
+
+ \sa setFormat()
+*/
+QOpenGLTexture::TextureFormat QOpenGLTexture::format() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->format;
+}
+
+static bool isNpot(int width, int height = 1, int depth = 1)
+{
+ return width & (width-1) || height & (height-1) || depth & (depth-1);
+}
+
+/*!
+ Sets the dimensions of this texture object to \a width,
+ \a height, and \a depth. The default for each dimension is 1.
+ The maximum allowable texture size is dependent upon your OpenGL
+ implementation. Allocating storage for a texture less than the
+ maximum size can still fail if your system is low on resources.
+
+ If a non-power-of-two \a width, \a height or \a depth is provided and your
+ OpenGL implementation doesn't have support for repeating non-power-of-two
+ textures, then the wrap mode is automatically set to ClampToEdge.
+
+ \sa width(), height(), depth()
+*/
+void QOpenGLTexture::setSize(int width, int height, int depth)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ if (isStorageAllocated()) {
+ qWarning("Cannot resize a texture that already has storage allocated.\n"
+ "To do so, destroy() the texture and then create() and setSize()");
+ return;
+ }
+
+ if (isNpot(width, height, depth) && !hasFeature(Feature::NPOTTextureRepeat) && d->target != Target::TargetRectangle)
+ d->setWrapMode(WrapMode::ClampToEdge);
+
+ switch (d->target) {
+ case QOpenGLTexture::Target1D:
+ case QOpenGLTexture::Target1DArray:
+ case QOpenGLTexture::TargetBuffer:
+ d->dimensions[0] = width;
+ Q_UNUSED(height);
+ Q_UNUSED(depth);
+ break;
+
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::Target2DArray:
+ case QOpenGLTexture::TargetRectangle:
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ d->dimensions[0] = width;
+ d->dimensions[1] = height;
+ Q_UNUSED(depth);
+ break;
+
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetCubeMapArray:
+ if (width != height)
+ qWarning("QAbstractOpenGLTexture::setSize(): Cube map textures must be square");
+ d->dimensions[0] = d->dimensions[1] = width;
+ Q_UNUSED(depth);
+ break;
+
+ case QOpenGLTexture::Target3D:
+ d->dimensions[0] = width;
+ d->dimensions[1] = height;
+ d->dimensions[2] = depth;
+ break;
+ }
+}
+
+/*!
+ Returns the width of a 1D, 2D or 3D texture.
+
+ \sa height(), depth(), setSize()
+*/
+int QOpenGLTexture::width() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->dimensions[0];
+}
+
+/*!
+ Returns the height of a 2D or 3D texture.
+
+ \sa width(), depth(), setSize()
+*/
+int QOpenGLTexture::height() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->dimensions[1];
+}
+
+/*!
+ Returns the depth of a 3D texture.
+
+ \sa width(), height(), setSize()
+*/
+int QOpenGLTexture::depth() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->dimensions[2];
+}
+
+/*!
+ For texture targets that support mipmaps, this function
+ sets the requested number of mipmap \a levels to allocate storage
+ for. This function should be called before storage is allocated
+ for the texture.
+
+ If the texture target does not support mipmaps this function
+ has no effect.
+
+ \sa mipLevels(), maximumMipLevels(), isStorageAllocated()
+*/
+void QOpenGLTexture::setMipLevels(int levels)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ if (isStorageAllocated()) {
+ qWarning("Cannot set mip levels on a texture that already has storage allocated.\n"
+ "To do so, destroy() the texture and then create() and setMipLevels()");
+ return;
+ }
+
+ switch (d->target) {
+ case QOpenGLTexture::Target1D:
+ case QOpenGLTexture::Target1DArray:
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::Target2DArray:
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetCubeMapArray:
+ case QOpenGLTexture::Target3D:
+ d->requestedMipLevels = levels;
+ break;
+
+ case QOpenGLTexture::TargetBuffer:
+ case QOpenGLTexture::TargetRectangle:
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ qWarning("QAbstractOpenGLTexture::setMipLevels(): This texture target does not support mipmaps");
+ break;
+ }
+}
+
+/*!
+ Returns the number of mipmap levels for this texture. If storage
+ has not yet been allocated for this texture it returns the
+ requested number of mipmap levels.
+
+ \sa setMipLevels(), maximumMipLevels(), isStorageAllocated()
+*/
+int QOpenGLTexture::mipLevels() const
+{
+ Q_D(const QOpenGLTexture);
+ return isStorageAllocated() ? d->mipLevels : d->requestedMipLevels;
+}
+
+/*!
+ Returns the maximum number of mipmap levels that this texture
+ can have given the current dimensions.
+
+ \sa setMipLevels(), mipLevels(), setSize()
+*/
+int QOpenGLTexture::maximumMipLevels() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->maximumMipLevelCount();
+}
+
+/*!
+ Sets the number of array \a layers to allocate storage for. This
+ function should be called before storage is allocated for the texture.
+
+ For targets that do not support array layers this function has
+ no effect.
+
+ \sa layers(), isStorageAllocated()
+*/
+void QOpenGLTexture::setLayers(int layers)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ if (isStorageAllocated()) {
+ qWarning("Cannot set layers on a texture that already has storage allocated.\n"
+ "To do so, destroy() the texture and then create() and setLayers()");
+ return;
+ }
+
+ switch (d->target) {
+ case QOpenGLTexture::Target1DArray:
+ case QOpenGLTexture::Target2DArray:
+ case QOpenGLTexture::TargetCubeMapArray:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ d->layers = layers;
+ break;
+
+ case QOpenGLTexture::Target1D:
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::Target3D:
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetBuffer:
+ case QOpenGLTexture::TargetRectangle:
+ case QOpenGLTexture::Target2DMultisample:
+ qWarning("Texture target does not support array layers");
+ break;
+ }
+}
+
+/*!
+ Returns the number of array layers for this texture. If
+ storage has not yet been allocated for this texture then
+ this function returns the requested number of array layers.
+
+ For texture targets that do not support array layers this
+ will return 1.
+
+ \sa setLayers(), isStorageAllocated()
+*/
+int QOpenGLTexture::layers() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->layers;
+}
+
+/*!
+ Returns the number of faces for this texture. For cubemap
+ and cubemap array type targets this will be 6.
+
+ For non-cubemap type targets this will return 1.
+*/
+int QOpenGLTexture::faces() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->faces;
+}
+
+/*!
+ Sets the number of \a samples to allocate storage for when rendering to
+ a multisample capable texture target. This function should
+ be called before storage is allocated for the texture.
+
+ For targets that do not support multisampling this function has
+ no effect.
+
+ \sa samples(), isStorageAllocated()
+*/
+void QOpenGLTexture::setSamples(int samples)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ if (isStorageAllocated()) {
+ qWarning("Cannot set sample count on a texture that already has storage allocated.\n"
+ "To do so, destroy() the texture and then create() and setSamples()");
+ return;
+ }
+
+ switch (d->target) {
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ d->samples = samples;
+ break;
+
+ case QOpenGLTexture::Target1D:
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::Target3D:
+ case QOpenGLTexture::Target1DArray:
+ case QOpenGLTexture::Target2DArray:
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetCubeMapArray:
+ case QOpenGLTexture::TargetBuffer:
+ case QOpenGLTexture::TargetRectangle:
+
+ qWarning("Texture target does not support multisampling");
+ break;
+ }
+}
+
+/*!
+ Returns the number of multisample sample points for this texture.
+ If storage has not yet been allocated for this texture then
+ this function returns the requested number of samples.
+
+ For texture targets that do not support multisampling this
+ will return 0.
+
+ \sa setSamples(), isStorageAllocated()
+*/
+int QOpenGLTexture::samples() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->samples;
+}
+
+/*!
+ Sets whether the sample positions and number of samples used with
+ a multisample capable texture target to \a fixed. If set to \c true
+ the sample positions and number of samples used are the same for
+ all texels in the image and will not depend upon the image size or
+ internal format. This function should be called before storage is allocated
+ for the texture.
+
+ For targets that do not support multisampling this function has
+ no effect.
+
+ The default value is \c true.
+
+ \sa isFixedSamplePositions(), isStorageAllocated()
+*/
+void QOpenGLTexture::setFixedSamplePositions(bool fixed)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ if (isStorageAllocated()) {
+ qWarning("Cannot set sample positions on a texture that already has storage allocated.\n"
+ "To do so, destroy() the texture and then create() and setFixedSamplePositions()");
+ return;
+ }
+
+ switch (d->target) {
+ case QOpenGLTexture::Target2DMultisample:
+ case QOpenGLTexture::Target2DMultisampleArray:
+ d->fixedSamplePositions = fixed;
+ break;
+
+ case QOpenGLTexture::Target1D:
+ case QOpenGLTexture::Target2D:
+ case QOpenGLTexture::Target3D:
+ case QOpenGLTexture::Target1DArray:
+ case QOpenGLTexture::Target2DArray:
+ case QOpenGLTexture::TargetCubeMap:
+ case QOpenGLTexture::TargetCubeMapArray:
+ case QOpenGLTexture::TargetBuffer:
+ case QOpenGLTexture::TargetRectangle:
+
+ qWarning("Texture target does not support multisampling");
+ break;
+ }
+}
+
+/*!
+ Returns whether this texture uses a fixed pattern of multisample
+ samples. If storage has not yet been allocated for this texture then
+ this function returns the requested fixed sample position setting.
+
+ For texture targets that do not support multisampling this
+ will return \c true.
+
+ \sa setFixedSamplePositions(), isStorageAllocated()
+*/
+bool QOpenGLTexture::isFixedSamplePositions() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->fixedSamplePositions;
+}
+
+/*!
+ Allocates server-side storage for this texture object taking
+ into account, the format, dimensions, mipmap levels, array
+ layers and cubemap faces.
+
+ Once storage has been allocated it is no longer possible to change
+ these properties.
+
+ If supported QOpenGLTexture makes use of immutable texture
+ storage.
+
+ Once storage has been allocated for the texture then pixel data
+ can be uploaded via one of the setData() overloads.
+
+ \note If immutable texture storage is not available,
+ then a default pixel format and pixel type will be used to
+ create the mutable storage. You can use the other
+ allocateStorage() overload to specify exactly the pixel format
+ and the pixel type to use when allocating mutable storage;
+ this is particulary useful under certain OpenGL ES implementations
+ (notably, OpenGL ES 2), where the pixel format and the pixel type
+ used at allocation time must perfectly match the format
+ and the type passed to any subsequent setData() call.
+
+ \sa isStorageAllocated(), setData()
+*/
+void QOpenGLTexture::allocateStorage()
+{
+ Q_D(QOpenGLTexture);
+ if (d->create()) {
+ const QOpenGLTexture::PixelFormat pixelFormat = pixelFormatCompatibleWithInternalFormat(d->format);
+ const QOpenGLTexture::PixelType pixelType = pixelTypeCompatibleWithInternalFormat(d->format);
+ d->allocateStorage(pixelFormat, pixelType);
+ }
+}
+
+/*!
+ \since 5.5
+
+ Allocates server-side storage for this texture object taking
+ into account, the format, dimensions, mipmap levels, array
+ layers and cubemap faces.
+
+ Once storage has been allocated it is no longer possible to change
+ these properties.
+
+ If supported QOpenGLTexture makes use of immutable texture
+ storage. However, if immutable texture storage is not available,
+ then the specified \a pixelFormat and \a pixelType will be used
+ to allocate mutable storage; note that in certain OpenGL implementations
+ (notably, OpenGL ES 2) they must perfectly match the format
+ and the type passed to any subsequent setData() call.
+
+ Once storage has been allocated for the texture then pixel data
+ can be uploaded via one of the setData() overloads.
+
+ \sa isStorageAllocated(), setData()
+*/
+void QOpenGLTexture::allocateStorage(QOpenGLTexture::PixelFormat pixelFormat, QOpenGLTexture::PixelType pixelType)
+{
+ Q_D(QOpenGLTexture);
+ if (d->create())
+ d->allocateStorage(pixelFormat, pixelType);
+}
+
+/*!
+ Returns \c true if server-side storage for this texture as been
+ allocated.
+
+ The texture format, dimensions, mipmap levels and array layers
+ cannot be altered once storage ihas been allocated.
+
+ \sa allocateStorage(), setSize(), setMipLevels(), setLayers(), setFormat()
+*/
+bool QOpenGLTexture::isStorageAllocated() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->storageAllocated;
+}
+
+/*!
+ Attempts to create a texture view onto this texture. A texture
+ view is somewhat analogous to a view in SQL in that it presents
+ a restricted or reinterpreted view of the original data. Texture
+ views do not allocate any more server-side storage, insted relying
+ on the storage buffer of the source texture.
+
+ Texture views are only available when using immutable storage. For
+ more information on texture views see
+ http://www.opengl.org/wiki/Texture_Storage#Texture_views.
+
+ The \a target argument specifies the target to use for the view.
+ Only some targets can be used depending upon the target of the original
+ target. For e.g. a view onto a Target1DArray texture can specify
+ either Target1DArray or Target1D but for the latter the number of
+ array layers specified with \a minimumLayer and \a maximumLayer must
+ be exactly 1.
+
+ Simpliar constraints apply for the \a viewFormat. See the above link
+ and the specification for more details.
+
+ The \a minimumMipmapLevel, \a maximumMipmapLevel, \a minimumLayer,
+ and \a maximumLayer arguments serve to restrict the parts of the
+ texture accessible by the texture view.
+
+ If creation of the texture view fails this function will return
+ 0. If the function succeeds it will return a pointer to a new
+ QOpenGLTexture object that will return \c true from its isTextureView()
+ function.
+
+ \sa isTextureView()
+*/
+QOpenGLTexture *QOpenGLTexture::createTextureView(Target target,
+ TextureFormat viewFormat,
+ int minimumMipmapLevel, int maximumMipmapLevel,
+ int minimumLayer, int maximumLayer) const
+{
+ Q_D(const QOpenGLTexture);
+ if (!isStorageAllocated()) {
+ qWarning("Cannot set create a texture view of a texture that does not have storage allocated.");
+ return nullptr;
+ }
+ Q_ASSERT(maximumMipmapLevel >= minimumMipmapLevel);
+ Q_ASSERT(maximumLayer >= minimumLayer);
+ return d->createTextureView(target, viewFormat,
+ minimumMipmapLevel, maximumMipmapLevel,
+ minimumLayer, maximumLayer);
+}
+
+/*!
+ Returns \c true if this texture object is actually a view onto another
+ texture object.
+
+ \sa createTextureView()
+*/
+bool QOpenGLTexture::isTextureView() const
+{
+ Q_D(const QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ return d->textureView;
+}
+
+/*!
+ Uploads pixel \a data for this texture object \a mipLevel, array \a layer, and \a cubeFace.
+ Storage must have been allocated before uploading pixel data. Some overloads of setData()
+ will set appropriate dimensions, mipmap levels, and array layers and then allocate storage
+ for you if they have enough information to do so. This will be noted in the function
+ documentation.
+
+ The structure of the pixel data pointed to by \a data is specified by \a sourceFormat
+ and \a sourceType. The pixel data upload can optionally be controlled by \a options.
+
+ If using a compressed format() then you should use setCompressedData() instead of this
+ function.
+
+ \since 5.3
+ \sa setCompressedData()
+*/
+void QOpenGLTexture::setData(int mipLevel, int layer, CubeMapFace cubeFace,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ if (!isStorageAllocated()) {
+ qWarning("Cannot set data on a texture that does not have storage allocated.\n"
+ "To do so call allocateStorage() before this function");
+ return;
+ }
+ d->setData(mipLevel, layer, 1, cubeFace, sourceFormat, sourceType, data, options);
+}
+
+/*!
+ \since 5.9
+ \overload
+
+ Parameter \a layerCount is the number of layers in a texture array
+ that are being uploaded/populated by this call.
+*/
+void QOpenGLTexture::setData(int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace, QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType, const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ if (!isStorageAllocated()) {
+ qWarning("Cannot set data on a texture that does not have storage allocated.\n"
+ "To do so call allocateStorage() before this function");
+ return;
+ }
+ d->setData(mipLevel, layer, layerCount, cubeFace, sourceFormat, sourceType, data, options);
+}
+
+/*!
+ \since 5.3
+ \overload
+*/
+void QOpenGLTexture::setData(int mipLevel, int layer,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setData(mipLevel, layer, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
+}
+
+/*!
+ \since 5.3
+ \overload
+*/
+void QOpenGLTexture::setData(int mipLevel,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setData(mipLevel, 0, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
+}
+
+/*!
+ \since 5.3
+ \overload
+*/
+void QOpenGLTexture::setData(PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setData(0, 0, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
+}
+
+/*!
+ \since 5.14
+ \overload
+
+ This overload is to be used to update a part of the texture. Parameters \a
+ xOffset, \a yOffset, \a zOffset specify the texel offsets within the
+ texture. Parameters \a width, \a height and \a depth specify the dimensions
+ of the sub image.
+
+ The structure of the pixel data pointed to by \a data is specified by \a
+ sourceFormat and \a sourceType. The pixel data upload can optionally be
+ controlled by \a options.
+*/
+void QOpenGLTexture::setData(int xOffset, int yOffset, int zOffset,
+ int width, int height, int depth,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setData(xOffset, yOffset, zOffset,
+ width, height, depth,
+ 0, 0, 1,
+ QOpenGLTexture::CubeMapPositiveX, sourceFormat,
+ sourceType, data, options);
+}
+
+/*!
+ \since 5.14
+ \overload
+
+ This overload is to be used to update a part of the texture. Parameters \a
+ xOffset, \a yOffset, \a zOffset specify the texel offsets within the
+ texture. Parameters \a width, \a height and \a depth specify the dimensions
+ of the sub image. The mip map level the sub image we want to
+ update is specified with \a mipLevel.
+
+ The structure of the pixel data pointed to by \a data is specified by \a
+ sourceFormat and \a sourceType. The pixel data upload can optionally be
+ controlled by \a options.
+*/
+void QOpenGLTexture::setData(int xOffset, int yOffset, int zOffset,
+ int width, int height, int depth,
+ int mipLevel,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setData(xOffset, yOffset, zOffset,
+ width, height, depth,
+ mipLevel, 0, 1,
+ QOpenGLTexture::CubeMapPositiveX, sourceFormat,
+ sourceType, data, options);
+}
+
+/*!
+ \since 5.14
+ \overload
+
+ This overload is to be used to update a part of the texture. Parameters \a
+ xOffset, \a yOffset, \a zOffset specify the texel offsets within the
+ texture. Parameters \a width, \a height and \a depth specify the dimensions
+ of the sub image. The mip map level and layerof the sub image we want to
+ update are specified with \a mipLevel and \a layer.
+
+ The structure of the pixel data pointed to by \a data is specified by \a
+ sourceFormat and \a sourceType. The pixel data upload can optionally be
+ controlled by \a options.
+*/
+void QOpenGLTexture::setData(int xOffset, int yOffset, int zOffset,
+ int width, int height, int depth,
+ int mipLevel, int layer,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setData(xOffset, yOffset, zOffset,
+ width, height, depth,
+ mipLevel, layer, 1,
+ QOpenGLTexture::CubeMapPositiveX, sourceFormat,
+ sourceType, data, options);
+}
+
+/*!
+ \since 5.14
+ \overload
+
+ This overload is to be used to update a part of the texture. Parameters \a
+ xOffset, \a yOffset, \a zOffset specify the texel offsets within the
+ texture. Parameters \a width, \a height and \a depth specify the dimensions
+ of the sub image.The mip map level, layer and cube map face of the sub
+ image we want to update are specified with \a mipLevel, \a layer and \a
+ face.
+
+ The structure of the pixel data pointed to by \a data is specified by \a
+ sourceFormat and \a sourceType. The pixel data upload can optionally be
+ controlled by \a options.
+*/
+void QOpenGLTexture::setData(int xOffset, int yOffset, int zOffset,
+ int width, int height, int depth,
+ int mipLevel, int layer,
+ CubeMapFace face,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setData(xOffset, yOffset, zOffset,
+ width, height, depth,
+ mipLevel, layer, 1,
+ face, sourceFormat,
+ sourceType, data, options);
+}
+
+/*!
+ \since 5.14
+ \overload
+
+ This overload is to be used to update a part of the texture. Parameters \a
+ xOffset, \a yOffset, \a zOffset specify the texel offsets within the
+ texture. Parameters \a width, \a height and \a depth specify the dimensions
+ of the sub image.The mip map level, starting layer, cube map face and
+ number of layers of the sub image we want to update are specified with \a
+ mipLevel, \a layer, \a face and \a layerCount.
+
+ The structure of the pixel data pointed to by \a data is specified by \a
+ sourceFormat and \a sourceType. The pixel data upload can optionally be
+ controlled by \a options.
+*/
+void QOpenGLTexture::setData(int xOffset, int yOffset, int zOffset,
+ int width, int height, int depth,
+ int mipLevel, int layer,
+ CubeMapFace face, int layerCount,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setData(xOffset, yOffset, zOffset,
+ width, height, depth,
+ mipLevel, layer, layerCount,
+ face, sourceFormat,
+ sourceType, data, options);
+}
+
+#if QT_DEPRECATED_SINCE(5, 3)
+/*!
+ \obsolete
+ \overload
+
+ \sa setCompressedData()
+*/
+void QOpenGLTexture::setData(int mipLevel, int layer, CubeMapFace cubeFace,
+ PixelFormat sourceFormat, PixelType sourceType,
+ void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ if (!isStorageAllocated()) {
+ qWarning("Cannot set data on a texture that does not have storage allocated.\n"
+ "To do so call allocateStorage() before this function");
+ return;
+ }
+ d->setData(mipLevel, layer, 1, cubeFace, sourceFormat, sourceType, data, options);
+}
+
+/*!
+ \obsolete
+ \overload
+*/
+void QOpenGLTexture::setData(int mipLevel, int layer,
+ PixelFormat sourceFormat, PixelType sourceType,
+ void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setData(mipLevel, layer, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
+}
+
+/*!
+ \obsolete
+ \overload
+*/
+void QOpenGLTexture::setData(int mipLevel,
+ PixelFormat sourceFormat, PixelType sourceType,
+ void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setData(mipLevel, 0, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
+}
+
+/*!
+ \obsolete
+ \overload
+*/
+void QOpenGLTexture::setData(PixelFormat sourceFormat, PixelType sourceType,
+ void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setData(0, 0, 1, QOpenGLTexture::CubeMapPositiveX, sourceFormat, sourceType, data, options);
+}
+#endif
+
+/*!
+ This overload of setData() will allocate storage for you.
+ The pixel data is contained in \a image. Mipmaps are generated by default.
+ Set \a genMipMaps to \l DontGenerateMipMaps to turn off mipmap generation.
+
+ \overload
+*/
+void QOpenGLTexture::setData(const QImage& image, MipMapGeneration genMipMaps)
+{
+ QOpenGLContext *context = QOpenGLContext::currentContext();
+ if (!context) {
+ qWarning("QOpenGLTexture::setData() requires a valid current context");
+ return;
+ }
+
+ if (image.isNull()) {
+ qWarning("QOpenGLTexture::setData() tried to set a null image");
+ return;
+ }
+
+ if (context->isOpenGLES() && context->format().majorVersion() < 3)
+ setFormat(QOpenGLTexture::RGBAFormat);
+ else
+ setFormat(QOpenGLTexture::RGBA8_UNorm);
+
+ setSize(image.width(), image.height());
+ setMipLevels(genMipMaps == GenerateMipMaps ? maximumMipLevels() : 1);
+ allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::UInt8);
+
+ // Upload pixel data and generate mipmaps
+ QImage glImage = image.convertToFormat(QImage::Format_RGBA8888);
+ QOpenGLPixelTransferOptions uploadOptions;
+ uploadOptions.setAlignment(1);
+ setData(0, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, glImage.constBits(), &uploadOptions);
+}
+
+/*!
+ Uploads compressed pixel \a data to \a mipLevel, array \a layer, and \a cubeFace.
+ The pixel transfer can optionally be controlled with \a options. The \a dataSize
+ argument should specify the size of the data pointed to by \a data.
+
+ If not using a compressed format() then you should use setData() instead of this
+ function.
+
+ \since 5.3
+*/
+void QOpenGLTexture::setCompressedData(int mipLevel, int layer, CubeMapFace cubeFace,
+ int dataSize, const void *data,
+ const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ if (!isStorageAllocated()) {
+ qWarning("Cannot set data on a texture that does not have storage allocated.\n"
+ "To do so call allocateStorage() before this function");
+ return;
+ }
+ d->setCompressedData(mipLevel, layer, 1, cubeFace, dataSize, data, options);
+}
+
+/*!
+ \since 5.9
+ \overload
+
+ Parameter \a layerCount is the number of layers in a texture array
+ that are being uploaded/populated by this call.
+*/
+void QOpenGLTexture::setCompressedData(int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace, int dataSize, const void *data, const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ if (!isStorageAllocated()) {
+ qWarning("Cannot set data on a texture that does not have storage allocated.\n"
+ "To do so call allocateStorage() before this function");
+ return;
+ }
+ d->setCompressedData(mipLevel, layer, layerCount, cubeFace, dataSize, data, options);
+}
+
+/*!
+ \overload
+*/
+void QOpenGLTexture::setCompressedData(int mipLevel, int layer, int dataSize, const void *data,
+ const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setCompressedData(mipLevel, layer, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
+}
+
+/*!
+ \overload
+*/
+void QOpenGLTexture::setCompressedData(int mipLevel, int dataSize, const void *data,
+ const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setCompressedData(mipLevel, 0, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
+}
+
+/*!
+ \overload
+*/
+void QOpenGLTexture::setCompressedData(int dataSize, const void *data,
+ const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setCompressedData(0, 0, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
+}
+
+#if QT_DEPRECATED_SINCE(5, 3)
+/*!
+ \obsolete
+ \overload
+*/
+void QOpenGLTexture::setCompressedData(int mipLevel, int layer, CubeMapFace cubeFace,
+ int dataSize, void *data,
+ const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ if (!isStorageAllocated()) {
+ qWarning("Cannot set data on a texture that does not have storage allocated.\n"
+ "To do so call allocateStorage() before this function");
+ return;
+ }
+ d->setCompressedData(mipLevel, layer, 1, cubeFace, dataSize, data, options);
+}
+
+/*!
+ \obsolete
+ \overload
+*/
+void QOpenGLTexture::setCompressedData(int mipLevel, int layer, int dataSize, void *data,
+ const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setCompressedData(mipLevel, layer, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
+}
+
+/*!
+ \obsolete
+ \overload
+*/
+void QOpenGLTexture::setCompressedData(int mipLevel, int dataSize, void *data,
+ const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setCompressedData(mipLevel, 0, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
+}
+
+/*!
+ \obsolete
+ \overload
+*/
+void QOpenGLTexture::setCompressedData(int dataSize, void *data,
+ const QOpenGLPixelTransferOptions * const options)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->textureId);
+ d->setCompressedData(0, 0, 1, QOpenGLTexture::CubeMapPositiveX, dataSize, data, options);
+}
+#endif
+
+/*!
+ Returns \c true if your OpenGL implementation and version supports the texture
+ feature \a feature.
+*/
+bool QOpenGLTexture::hasFeature(Feature feature)
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (!ctx) {
+ qWarning("QOpenGLTexture::hasFeature() requires a valid current context");
+ return false;
+ }
+
+ QSurfaceFormat f = ctx->format();
+
+ bool supported = false;
+
+#if !QT_CONFIG(opengles2)
+ if (!ctx->isOpenGLES()) {
+ switch (feature) {
+ case ImmutableMultisampleStorage:
+ supported = f.version() >= qMakePair(4, 3)
+ || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_storage_multisample"));
+ break;
+
+ case TextureBuffer:
+ supported = f.version() >= qMakePair(3, 0)
+ || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_buffer_object"));
+ break;
+
+ case StencilTexturing:
+ supported = f.version() >= qMakePair(4, 3)
+ || ctx->hasExtension(QByteArrayLiteral("GL_ARB_stencil_texturing"));
+ break;
+
+ case ImmutableStorage:
+ supported = f.version() >= qMakePair(4, 2)
+ || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_storage"))
+ || ctx->hasExtension(QByteArrayLiteral("GL_EXT_texture_storage"));
+ break;
+
+ case TextureCubeMapArrays:
+ supported = f.version() >= qMakePair(4, 0)
+ || ctx->hasExtension(QByteArrayLiteral("ARB_texture_cube_map_array"));
+ break;
+
+ case Swizzle:
+ supported = f.version() >= qMakePair(3, 3)
+ || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_swizzle"));
+ break;
+
+ case TextureMultisample:
+ supported = f.version() >= qMakePair(3, 2)
+ || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_multisample"));
+ break;
+
+ case TextureArrays:
+ supported = f.version() >= qMakePair(3, 0)
+ || ctx->hasExtension(QByteArrayLiteral("GL_EXT_texture_array"));
+ break;
+
+ case TextureRectangle:
+ supported = f.version() >= qMakePair(2, 1)
+ || ctx->hasExtension(QByteArrayLiteral("ARB_texture_rectangle"));
+ break;
+
+ case Texture3D:
+ supported = f.version() >= qMakePair(1, 3);
+ break;
+
+ case AnisotropicFiltering:
+ supported = ctx->hasExtension(QByteArrayLiteral("GL_EXT_texture_filter_anisotropic"));
+ break;
+
+ case NPOTTextures:
+ case NPOTTextureRepeat:
+ supported = ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_non_power_of_two"));
+ break;
+
+ case Texture1D:
+ supported = f.version() >= qMakePair(1, 1);
+ break;
+
+ case TextureComparisonOperators:
+ // GL 1.4 and GL_ARB_shadow alone support only LEQUAL and GEQUAL;
+ // since we're talking about history anyhow avoid to be extra pedantic
+ // in the feature set, and simply claim supported if we have the full set of operators
+ // (which has been added into 1.5 / GL_EXT_shadow_funcs).
+ supported = f.version() >= qMakePair(1, 5)
+ || (ctx->hasExtension(QByteArrayLiteral("GL_ARB_shadow"))
+ && ctx->hasExtension(QByteArrayLiteral("GL_EXT_shadow_funcs")));
+ break;
+
+ case TextureMipMapLevel:
+ supported = f.version() >= qMakePair(1, 2);
+ break;
+
+ case MaxFeatureFlag:
+ break;
+ }
+ }
+
+ if (ctx->isOpenGLES())
+#endif
+ {
+ const char *renderer = reinterpret_cast<const char *>(ctx->functions()->glGetString(GL_RENDERER));
+ switch (feature) {
+ case ImmutableStorage:
+ supported = (f.version() >= qMakePair(3, 0) || ctx->hasExtension(QByteArrayLiteral("GL_EXT_texture_storage")))
+ && !(renderer && strstr(renderer, "Mali")); // do not use on Mali: QTBUG-45106
+ break;
+
+ case ImmutableMultisampleStorage:
+ supported = f.version() >= qMakePair(3, 1);
+ break;
+
+ case TextureRectangle:
+ break;
+
+ case TextureArrays:
+ supported = f.version() >= qMakePair(3, 0);
+ break;
+
+ case Texture3D:
+ supported = f.version() >= qMakePair(3, 0)
+ || ctx->hasExtension(QByteArrayLiteral("GL_OES_texture_3D"));
+ break;
+
+ case TextureMultisample:
+ supported = f.version() >= qMakePair(3, 1);
+ break;
+
+ case TextureBuffer:
+ break;
+
+ case TextureCubeMapArrays:
+ break;
+
+ case Swizzle:
+ supported = f.version() >= qMakePair(3, 0);
+ break;
+
+ case StencilTexturing:
+ break;
+
+ case AnisotropicFiltering:
+ supported = ctx->hasExtension(QByteArrayLiteral("GL_EXT_texture_filter_anisotropic"));
+ break;
+
+ case NPOTTextures:
+ case NPOTTextureRepeat:
+ supported = f.version() >= qMakePair(3,0)
+ || ctx->hasExtension(QByteArrayLiteral("GL_OES_texture_npot"))
+ || ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_non_power_of_two"));
+ break;
+
+ case Texture1D:
+ break;
+
+ case TextureComparisonOperators:
+ supported = f.version() >= qMakePair(3, 0)
+ || ctx->hasExtension(QByteArrayLiteral("GL_EXT_shadow_samplers"));
+ break;
+
+ case TextureMipMapLevel:
+ supported = f.version() >= qMakePair(3, 0);
+ break;
+
+ case MaxFeatureFlag:
+ break;
+ }
+ }
+
+ return supported;
+}
+
+/*!
+ Sets the base mipmap level used for all texture lookups with this texture to \a baseLevel.
+
+ \note This function has no effect on Qt built for OpenGL ES 2.
+ \sa mipBaseLevel(), setMipMaxLevel(), setMipLevelRange()
+*/
+void QOpenGLTexture::setMipBaseLevel(int baseLevel)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ if (!d->features.testFlag(TextureMipMapLevel)) {
+ qWarning("QOpenGLTexture::setMipBaseLevel: requires OpenGL >= 1.2 or OpenGL ES >= 3.0");
+ return;
+ }
+ Q_ASSERT(d->textureId);
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(baseLevel <= d->maxLevel);
+ d->baseLevel = baseLevel;
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_BASE_LEVEL, baseLevel);
+}
+
+/*!
+ Returns the mipmap base level used for all texture lookups with this texture.
+ The default is 0.
+
+ \sa setMipBaseLevel(), mipMaxLevel(), mipLevelRange()
+*/
+int QOpenGLTexture::mipBaseLevel() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->baseLevel;
+}
+
+/*!
+ Sets the maximum mipmap level used for all texture lookups with this texture to \a maxLevel.
+
+ \note This function has no effect on Qt built for OpenGL ES 2.
+ \sa mipMaxLevel(), setMipBaseLevel(), setMipLevelRange()
+*/
+void QOpenGLTexture::setMipMaxLevel(int maxLevel)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ if (!d->features.testFlag(TextureMipMapLevel)) {
+ qWarning("QOpenGLTexture::setMipMaxLevel: requires OpenGL >= 1.2 or OpenGL ES >= 3.0");
+ return;
+ }
+ Q_ASSERT(d->textureId);
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->baseLevel <= maxLevel);
+ d->maxLevel = maxLevel;
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAX_LEVEL, maxLevel);
+}
+
+/*!
+ Returns the mipmap maximum level used for all texture lookups with this texture.
+
+ \sa setMipMaxLevel(), mipBaseLevel(), mipLevelRange()
+*/
+int QOpenGLTexture::mipMaxLevel() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->maxLevel;
+}
+
+/*!
+ Sets the range of mipmap levels that can be used for texture lookups with this texture
+ to range from \a baseLevel to \a maxLevel.
+
+ \note This function has no effect on Qt built for OpenGL ES 2.
+ \sa setMipBaseLevel(), setMipMaxLevel(), mipLevelRange()
+*/
+void QOpenGLTexture::setMipLevelRange(int baseLevel, int maxLevel)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ if (!d->features.testFlag(TextureMipMapLevel)) {
+ qWarning("QOpenGLTexture::setMipLevelRange: requires OpenGL >= 1.2 or OpenGL ES >= 3.0");
+ return;
+ }
+ Q_ASSERT(d->textureId);
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(baseLevel <= maxLevel);
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_BASE_LEVEL, baseLevel);
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAX_LEVEL, maxLevel);
+}
+
+/*!
+ Returns the range of mipmap levels that can be used for texture lookups with this texture.
+
+ \sa mipBaseLevel(), mipMaxLevel()
+*/
+QPair<int, int> QOpenGLTexture::mipLevelRange() const
+{
+ Q_D(const QOpenGLTexture);
+ return qMakePair(d->baseLevel, d->maxLevel);
+}
+
+/*!
+ If \a enabled is \c true, enables automatic mipmap generation for this texture object
+ to occur whenever the level 0 mipmap data is set via setData().
+
+ The automatic mipmap generation is enabled by default.
+
+ \note Mipmap generation is not supported for compressed textures with OpenGL ES 2.0.
+
+ \sa isAutoMipMapGenerationEnabled(), generateMipMaps()
+*/
+void QOpenGLTexture::setAutoMipMapGenerationEnabled(bool enabled)
+{
+ Q_D(QOpenGLTexture);
+ d->autoGenerateMipMaps = enabled;
+}
+
+/*!
+ Returns whether auto mipmap generation is enabled for this texture object.
+
+ \sa setAutoMipMapGenerationEnabled(), generateMipMaps()
+*/
+bool QOpenGLTexture::isAutoMipMapGenerationEnabled() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->autoGenerateMipMaps;
+}
+
+/*!
+ Generates mipmaps for this texture object from mipmap level 0. If you are
+ using a texture target and filtering option that requires mipmaps and you
+ have disabled automatic mipmap generation then you need to call this function
+ or the overload to create the mipmap chain.
+
+ \note Mipmap generation is not supported for compressed textures with OpenGL ES.
+
+ \sa setAutoMipMapGenerationEnabled(), setMipLevels(), mipLevels()
+*/
+void QOpenGLTexture::generateMipMaps()
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ if (isCompressedFormat(d->format)) {
+ if (QOpenGLContext *ctx = QOpenGLContext::currentContext())
+ if (ctx->isOpenGLES())
+ return;
+ }
+ d->texFuncs->glGenerateTextureMipmap(d->textureId, d->target, d->bindingTarget);
+}
+
+/*!
+ Generates mipmaps for this texture object from mipmap level \a baseLevel. If you are
+ using a texture target and filtering option that requires mipmaps and you
+ have disabled automatic mipmap generation then you need to call this function
+ or the overload to create the mipmap chain.
+
+ The generation of mipmaps to above \a baseLevel is achieved by setting the mipmap
+ base level to \a baseLevel and then generating the mipmap chain. If \a resetBaseLevel
+ is \c true, then the baseLevel of the texture will be reset to its previous value.
+
+ \sa setAutoMipMapGenerationEnabled(), setMipLevels(), mipLevels()
+*/
+void QOpenGLTexture::generateMipMaps(int baseLevel, bool resetBaseLevel)
+{
+ Q_D(QOpenGLTexture);
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ if (isCompressedFormat(d->format)) {
+ if (QOpenGLContext *ctx = QOpenGLContext::currentContext())
+ if (ctx->isOpenGLES())
+ return;
+ }
+ int oldBaseLevel;
+ if (resetBaseLevel)
+ oldBaseLevel = mipBaseLevel();
+ setMipBaseLevel(baseLevel);
+ d->texFuncs->glGenerateTextureMipmap(d->textureId, d->target, d->bindingTarget);
+ if (resetBaseLevel)
+ setMipBaseLevel(oldBaseLevel);
+}
+
+/*!
+ GLSL shaders are able to reorder the components of the vec4 returned by texture
+ functions. It is also desirable to be able to control this reordering from CPU
+ side code. This is made possible by swizzle masks since OpenGL 3.3.
+
+ Each component of the texture can be mapped to one of the SwizzleValue options.
+
+ This function maps \a component to the output \a value.
+
+ \note This function has no effect on Mac and Qt built for OpenGL ES 2.
+ \sa swizzleMask()
+*/
+void QOpenGLTexture::setSwizzleMask(SwizzleComponent component, SwizzleValue value)
+{
+#if !defined(Q_OS_MAC) && !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ if (!d->features.testFlag(Swizzle)) {
+ qWarning("QOpenGLTexture::setSwizzleMask() requires OpenGL >= 3.3");
+ return;
+ }
+ d->swizzleMask[component - SwizzleRed] = value;
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, component, value);
+ return;
+ }
+#else
+ Q_UNUSED(component);
+ Q_UNUSED(value);
+#endif
+ qWarning("QOpenGLTexture: Texture swizzling is not supported");
+}
+
+/*!
+ Parameters \a {r}, \a {g}, \a {b}, and \a {a} are values used for setting
+ the colors red, green, blue, and the alpha value.
+ \overload
+*/
+void QOpenGLTexture::setSwizzleMask(SwizzleValue r, SwizzleValue g,
+ SwizzleValue b, SwizzleValue a)
+{
+#if !defined(Q_OS_MAC) && !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ if (!d->features.testFlag(Swizzle)) {
+ qWarning("QOpenGLTexture::setSwizzleMask() requires OpenGL >= 3.3");
+ return;
+ }
+ GLint swizzleMask[] = {GLint(r), GLint(g), GLint(b), GLint(a)};
+ d->swizzleMask[0] = r;
+ d->swizzleMask[1] = g;
+ d->swizzleMask[2] = b;
+ d->swizzleMask[3] = a;
+ d->texFuncs->glTextureParameteriv(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
+ return;
+ }
+#else
+ Q_UNUSED(r);
+ Q_UNUSED(g);
+ Q_UNUSED(b);
+ Q_UNUSED(a);
+#endif
+ qWarning("QOpenGLTexture: Texture swizzling is not supported");
+}
+
+/*!
+ Returns the swizzle mask for texture \a component.
+*/
+QOpenGLTexture::SwizzleValue QOpenGLTexture::swizzleMask(SwizzleComponent component) const
+{
+ Q_D(const QOpenGLTexture);
+ return d->swizzleMask[component - SwizzleRed];
+}
+
+/*!
+ \enum QOpenGLTexture::DepthStencilMode
+ \since 5.4
+ This enum specifies which component of a depth/stencil texture is
+ accessed when the texture is sampled.
+
+ \value DepthMode Equivalent to GL_DEPTH_COMPONENT.
+ \value StencilMode Equivalent to GL_STENCIL_INDEX.
+*/
+
+/*!
+ If using a texture that has a combined depth/stencil format this function sets
+ which component of the texture is accessed to \a mode.
+
+ When the parameter is set to DepthMode, then accessing it from the
+ shader will access the depth component as a single float, as normal. But when
+ the parameter is set to StencilMode, the shader will access the stencil component.
+
+ \note This function has no effect on Mac and Qt built for OpenGL ES 2.
+ \since 5.4
+ \sa depthStencilMode()
+*/
+void QOpenGLTexture::setDepthStencilMode(QOpenGLTexture::DepthStencilMode mode)
+{
+#if !defined(Q_OS_MAC) && !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ if (!d->features.testFlag(StencilTexturing)) {
+ qWarning("QOpenGLTexture::setDepthStencilMode() requires OpenGL >= 4.3 or GL_ARB_stencil_texturing");
+ return;
+ }
+ d->depthStencilMode = mode;
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_DEPTH_STENCIL_TEXTURE_MODE, mode);
+ return;
+ }
+#else
+ Q_UNUSED(mode);
+#endif
+ qWarning("QOpenGLTexture: DepthStencil Mode is not supported");
+}
+
+/*!
+ Returns the depth stencil mode for textures using a combined depth/stencil format.
+
+ \since 5.4
+ \sa setDepthStencilMode()
+*/
+QOpenGLTexture::DepthStencilMode QOpenGLTexture::depthStencilMode() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->depthStencilMode;
+}
+
+/*!
+ \enum QOpenGLTexture::ComparisonFunction
+ \since 5.5
+ This enum specifies which comparison operator is used when texture comparison
+ is enabled on this texture.
+
+ \value CompareLessEqual Equivalent to GL_LEQUAL.
+ \value CompareGreaterEqual Equivalent to GL_GEQUAL.
+ \value CompareLess Equivalent to GL_LESS.
+ \value CompareGreater Equivalent to GL_GREATER.
+ \value CompareEqual Equivalent to GL_EQUAL.
+ \value CommpareNotEqual Equivalent to GL_NOTEQUAL.
+ \value CompareAlways Equivalent to GL_ALWAYS.
+ \value CompareNever Equivalent to GL_NEVER.
+
+*/
+
+/*!
+ \since 5.5
+
+ Sets the texture comparison function on this texture to \a function. The texture
+ comparison function is used by shadow samplers when sampling a depth texture.
+
+ \sa comparisonFunction()
+*/
+void QOpenGLTexture::setComparisonFunction(QOpenGLTexture::ComparisonFunction function)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ if (!d->features.testFlag(TextureComparisonOperators)) {
+ qWarning("QOpenGLTexture::setComparisonFunction: requires OpenGL >= 1.5 or OpenGL ES >= 3.0");
+ return;
+ }
+ d->comparisonFunction = function;
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_COMPARE_FUNC, function);
+}
+
+/*!
+ \since 5.5
+
+ Returns the texture comparison operator set on this texture. By default, a
+ texture has a CompareLessEqual comparison function.
+
+ \sa setComparisonFunction()
+*/
+QOpenGLTexture::ComparisonFunction QOpenGLTexture::comparisonFunction() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->comparisonFunction;
+}
+
+/*!
+ \enum QOpenGLTexture::ComparisonMode
+ \since 5.5
+ This enum specifies which comparison mode is used when sampling this texture.
+
+ \value CompareRefToTexture Equivalent to GL_COMPARE_REF_TO_TEXTURE.
+ \value CompareNone Equivalent to GL_NONE.
+*/
+
+/*!
+ \since 5.5
+
+ Sets the texture comparison mode on this texture to \a mode. The texture
+ comparison mode is used by shadow samplers when sampling a depth texture.
+
+ \sa comparisonMode()
+*/
+void QOpenGLTexture::setComparisonMode(QOpenGLTexture::ComparisonMode mode)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ if (!d->features.testFlag(TextureComparisonOperators)) {
+ qWarning("QOpenGLTexture::setComparisonMode: requires OpenGL >= 1.5 or OpenGL ES >= 3.0");
+ return;
+ }
+ d->comparisonMode = mode;
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_COMPARE_MODE, mode);
+}
+
+/*!
+ \since 5.5
+
+ Returns the texture comparison mode set on this texture. By default, a
+ texture has a CompareNone comparison mode (i.e. comparisons are disabled).
+
+ \sa setComparisonMode()
+*/
+QOpenGLTexture::ComparisonMode QOpenGLTexture::comparisonMode() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->comparisonMode;
+}
+
+/*!
+ Sets the filter used for minification to \a filter.
+
+ \sa minificationFilter(), setMagnificationFilter(), setMinMagFilters()
+*/
+void QOpenGLTexture::setMinificationFilter(QOpenGLTexture::Filter filter)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ d->minFilter = filter;
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MIN_FILTER, filter);
+}
+
+/*!
+ Returns the minification filter.
+
+ \sa setMinificationFilter()
+*/
+QOpenGLTexture::Filter QOpenGLTexture::minificationFilter() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->minFilter;
+}
+
+/*!
+ Sets the magnification filter to \a filter.
+
+ \sa magnificationFilter(), setMinificationFilter(), setMinMagFilters()
+*/
+void QOpenGLTexture::setMagnificationFilter(QOpenGLTexture::Filter filter)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ d->magFilter = filter;
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAG_FILTER, filter);
+}
+
+/*!
+ Returns the magnification filter.
+
+ \sa setMagnificationFilter()
+*/
+QOpenGLTexture::Filter QOpenGLTexture::magnificationFilter() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->magFilter;
+}
+
+/*!
+ Sets the minification filter to \a minificationFilter and the magnification filter
+ to \a magnificationFilter.
+
+ \sa minMagFilters(), setMinificationFilter(), setMagnificationFilter()
+*/
+void QOpenGLTexture::setMinMagFilters(QOpenGLTexture::Filter minificationFilter,
+ QOpenGLTexture::Filter magnificationFilter)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ d->minFilter = minificationFilter;
+ d->magFilter = magnificationFilter;
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MIN_FILTER, minificationFilter);
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAG_FILTER, magnificationFilter);
+}
+
+/*!
+ Returns the current minification and magnification filters.
+
+ \sa setMinMagFilters()
+*/
+QPair<QOpenGLTexture::Filter, QOpenGLTexture::Filter> QOpenGLTexture::minMagFilters() const
+{
+ Q_D(const QOpenGLTexture);
+ return QPair<QOpenGLTexture::Filter, QOpenGLTexture::Filter>(d->minFilter, d->magFilter);
+}
+
+/*!
+ If your OpenGL implementation supports the GL_EXT_texture_filter_anisotropic extension
+ this function sets the maximum anisotropy level to \a anisotropy.
+
+ \sa maximumAnisotropy()
+*/
+void QOpenGLTexture::setMaximumAnisotropy(float anisotropy)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ if (!d->features.testFlag(AnisotropicFiltering)) {
+ qWarning("QOpenGLTexture::setMaximumAnisotropy() requires GL_EXT_texture_filter_anisotropic");
+ return;
+ }
+ d->maxAnisotropy = anisotropy;
+ d->texFuncs->glTextureParameteri(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisotropy);
+}
+
+/*!
+ Returns the maximum level of anisotropy to be accounted for when performing texture lookups.
+ This requires the GL_EXT_texture_filter_anisotropic extension.
+
+ \sa setMaximumAnisotropy()
+*/
+float QOpenGLTexture::maximumAnisotropy() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->maxAnisotropy;
+}
+
+/*!
+ Sets the wrap (or repeat mode) for all texture dimentions to \a mode.
+
+ \sa wrapMode()
+*/
+void QOpenGLTexture::setWrapMode(QOpenGLTexture::WrapMode mode)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ d->setWrapMode(mode);
+}
+
+/*!
+ Holds the texture dimension \a direction.
+ \overload
+*/
+void QOpenGLTexture::setWrapMode(QOpenGLTexture::CoordinateDirection direction, QOpenGLTexture::WrapMode mode)
+{
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ d->setWrapMode(direction, mode);
+}
+
+/*!
+ Returns the wrap mode for the texture dimension \a direction.
+
+ \sa setWrapMode()
+*/
+QOpenGLTexture::WrapMode QOpenGLTexture::wrapMode(QOpenGLTexture::CoordinateDirection direction) const
+{
+ Q_D(const QOpenGLTexture);
+ return d->wrapMode(direction);
+}
+
+/*!
+ Sets the border color of the texture to \a color.
+
+ \note This function has no effect on Mac and Qt built for OpenGL ES 2.
+ \sa borderColor()
+*/
+void QOpenGLTexture::setBorderColor(const QColor &color)
+{
+ setBorderColor(static_cast<float>(color.redF()), static_cast<float>(color.greenF()),
+ static_cast<float>(color.blueF()), static_cast<float>(color.alphaF()));
+}
+
+/*!
+ Sets the color red to \a {r}, green to \a {g}, blue to \a {b}, and \a {a} to the
+ alpha value.
+ \overload
+*/
+void QOpenGLTexture::setBorderColor(float r, float g, float b, float a)
+{
+#if !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ float values[4];
+ values[0] = r;
+ values[1] = g;
+ values[2] = b;
+ values[3] = a;
+ d->borderColor.clear();
+ for (int i = 0; i < 4; ++i)
+ d->borderColor.append(QVariant(values[i]));
+ d->texFuncs->glTextureParameterfv(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_BORDER_COLOR, values);
+ return;
+ }
+#else
+ Q_UNUSED(r);
+ Q_UNUSED(g);
+ Q_UNUSED(b);
+ Q_UNUSED(a);
+#endif
+ qWarning("QOpenGLTexture: Border color is not supported");
+}
+
+/*!
+ Sets the color red to \a {r}, green to \a {g}, blue to \a {b}, and the alpha
+ value to \a {a}.
+ \overload
+*/
+void QOpenGLTexture::setBorderColor(int r, int g, int b, int a)
+{
+#if !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ int values[4];
+ values[0] = r;
+ values[1] = g;
+ values[2] = b;
+ values[3] = a;
+ d->borderColor.clear();
+ for (int i = 0; i < 4; ++i)
+ d->borderColor.append(QVariant(values[i]));
+ d->texFuncs->glTextureParameteriv(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_BORDER_COLOR, values);
+ return;
+ }
+#else
+ Q_UNUSED(r);
+ Q_UNUSED(g);
+ Q_UNUSED(b);
+ Q_UNUSED(a);
+#endif
+ qWarning("QOpenGLTexture: Border color is not supported");
+
+ // TODO Handle case of using glTextureParameterIiv() based on format
+}
+
+/*!
+ Sets the color red to \a {r}, green to \a {g}, blue to \a {b}, and the alpha
+ value to \a {a}.
+ \overload
+*/
+void QOpenGLTexture::setBorderColor(uint r, uint g, uint b, uint a)
+{
+#if !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ int values[4];
+ values[0] = int(r);
+ values[1] = int(g);
+ values[2] = int(b);
+ values[3] = int(a);
+ d->borderColor.clear();
+ for (int i = 0; i < 4; ++i)
+ d->borderColor.append(QVariant(values[i]));
+ d->texFuncs->glTextureParameteriv(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_BORDER_COLOR, values);
+ return;
+ }
+#else
+ Q_UNUSED(r);
+ Q_UNUSED(g);
+ Q_UNUSED(b);
+ Q_UNUSED(a);
+#endif
+ qWarning("QOpenGLTexture: Border color is not supported");
+
+ // TODO Handle case of using glTextureParameterIuiv() based on format
+}
+
+/*!
+ Returns the borderColor of this texture.
+
+ \sa setBorderColor()
+*/
+QColor QOpenGLTexture::borderColor() const
+{
+ Q_D(const QOpenGLTexture);
+ QColor c(0.0f, 0.0f, 0.0f, 0.0f);
+ if (!d->borderColor.isEmpty()) {
+ c.setRedF(d->borderColor.at(0).toFloat());
+ c.setGreenF(d->borderColor.at(1).toFloat());
+ c.setBlueF(d->borderColor.at(2).toFloat());
+ c.setAlphaF(d->borderColor.at(3).toFloat());
+ }
+ return c;
+}
+
+/*!
+ Writes the texture border color into the first four elements
+ of the array pointed to by \a border.
+
+ \sa setBorderColor()
+*/
+void QOpenGLTexture::borderColor(float *border) const
+{
+ Q_D(const QOpenGLTexture);
+ Q_ASSERT(border);
+ if (d->borderColor.isEmpty()) {
+ for (int i = 0; i < 4; ++i)
+ border[i] = 0.0f;
+ } else {
+ for (int i = 0; i < 4; ++i)
+ border[i] = d->borderColor.at(i).toFloat();
+ }
+}
+
+/*!
+ Writes the texture border color into the first four elements
+ of the array pointed to by \a border.
+
+ \overload
+*/
+void QOpenGLTexture::borderColor(int *border) const
+{
+ Q_D(const QOpenGLTexture);
+ Q_ASSERT(border);
+ if (d->borderColor.isEmpty()) {
+ for (int i = 0; i < 4; ++i)
+ border[i] = 0;
+ } else {
+ for (int i = 0; i < 4; ++i)
+ border[i] = d->borderColor.at(i).toInt();
+ }
+}
+
+/*!
+ Writes the texture border color into the first four elements
+ of the array pointed to by \a border.
+
+ \overload
+*/
+void QOpenGLTexture::borderColor(unsigned int *border) const
+{
+ Q_D(const QOpenGLTexture);
+ Q_ASSERT(border);
+ if (d->borderColor.isEmpty()) {
+ for (int i = 0; i < 4; ++i)
+ border[i] = 0;
+ } else {
+ for (int i = 0; i < 4; ++i)
+ border[i] = d->borderColor.at(i).toUInt();
+ }
+}
+
+/*!
+ Sets the minimum level of detail to \a value. This limits the selection of highest
+ resolution mipmap (lowest mipmap level). The default value is -1000.
+
+ \note This function has no effect on Qt built for OpenGL ES 2.
+ \sa minimumLevelOfDetail(), setMaximumLevelOfDetail(), setLevelOfDetailRange()
+*/
+void QOpenGLTexture::setMinimumLevelOfDetail(float value)
+{
+#if !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ Q_ASSERT(value < d->maxLevelOfDetail);
+ d->minLevelOfDetail = value;
+ d->texFuncs->glTextureParameterf(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MIN_LOD, value);
+ return;
+ }
+#else
+ Q_UNUSED(value);
+#endif
+ qWarning("QOpenGLTexture: Detail level is not supported");
+}
+
+/*!
+ Returns the minimum level of detail parameter.
+
+ \sa setMinimumLevelOfDetail(), maximumLevelOfDetail(), levelOfDetailRange()
+*/
+float QOpenGLTexture::minimumLevelOfDetail() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->minLevelOfDetail;
+}
+
+/*!
+ Sets the maximum level of detail to \a value. This limits the selection of lowest
+ resolution mipmap (highest mipmap level). The default value is 1000.
+
+ \note This function has no effect on Qt built for OpenGL ES 2.
+ \sa maximumLevelOfDetail(), setMinimumLevelOfDetail(), setLevelOfDetailRange()
+*/
+void QOpenGLTexture::setMaximumLevelOfDetail(float value)
+{
+#if !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ Q_ASSERT(value > d->minLevelOfDetail);
+ d->maxLevelOfDetail = value;
+ d->texFuncs->glTextureParameterf(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAX_LOD, value);
+ return;
+ }
+#else
+ Q_UNUSED(value);
+#endif
+ qWarning("QOpenGLTexture: Detail level is not supported");
+}
+
+/*!
+ Returns the maximum level of detail parameter.
+
+ \sa setMaximumLevelOfDetail(), minimumLevelOfDetail(), levelOfDetailRange()
+*/
+float QOpenGLTexture::maximumLevelOfDetail() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->maxLevelOfDetail;
+}
+
+/*!
+ Sets the minimum level of detail parameters to \a min and the maximum level
+ to \a max.
+ \note This function has no effect on Qt built for OpenGL ES 2.
+ \sa levelOfDetailRange(), setMinimumLevelOfDetail(), setMaximumLevelOfDetail()
+*/
+void QOpenGLTexture::setLevelOfDetailRange(float min, float max)
+{
+#if !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ Q_ASSERT(min < max);
+ d->minLevelOfDetail = min;
+ d->maxLevelOfDetail = max;
+ d->texFuncs->glTextureParameterf(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MIN_LOD, min);
+ d->texFuncs->glTextureParameterf(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_MAX_LOD, max);
+ return;
+ }
+#else
+ Q_UNUSED(min);
+ Q_UNUSED(max);
+#endif
+ qWarning("QOpenGLTexture: Detail level is not supported");
+}
+
+/*!
+ Returns the minimum and maximum level of detail parameters.
+
+ \sa setLevelOfDetailRange(), minimumLevelOfDetail(), maximumLevelOfDetail()
+*/
+QPair<float, float> QOpenGLTexture::levelOfDetailRange() const
+{
+ Q_D(const QOpenGLTexture);
+ return qMakePair(d->minLevelOfDetail, d->maxLevelOfDetail);
+}
+
+/*!
+ Sets the level of detail bias to \a bias.
+ Level of detail bias affects the point at which mipmapping levels change.
+ Increasing values for level of detail bias makes the overall images blurrier
+ or smoother. Decreasing values make the overall images sharper.
+
+ \note This function has no effect on Qt built for OpenGL ES 2.
+ \sa levelofDetailBias()
+*/
+void QOpenGLTexture::setLevelofDetailBias(float bias)
+{
+#if !QT_CONFIG(opengles2)
+ if (!QOpenGLContext::currentContext()->isOpenGLES()) {
+ Q_D(QOpenGLTexture);
+ d->create();
+ Q_ASSERT(d->texFuncs);
+ Q_ASSERT(d->textureId);
+ d->levelOfDetailBias = bias;
+ d->texFuncs->glTextureParameterf(d->textureId, d->target, d->bindingTarget, GL_TEXTURE_LOD_BIAS, bias);
+ return;
+ }
+#else
+ Q_UNUSED(bias);
+#endif
+ qWarning("QOpenGLTexture: Detail level is not supported");
+}
+
+/*!
+ Returns the level of detail bias parameter.
+
+ \sa setLevelofDetailBias()
+*/
+float QOpenGLTexture::levelofDetailBias() const
+{
+ Q_D(const QOpenGLTexture);
+ return d->levelOfDetailBias;
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug debug, const QOpenGLTexture *t)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace();
+ debug << "QOpenGLTexture(";
+ if (t) {
+ const QOpenGLTexturePrivate *d = t->d_ptr.data();
+ debug << d->target << ", bindingTarget=" << d->bindingTarget
+ << ", size=[" << d->dimensions[0]
+ << ", " << d->dimensions[1];
+ if (d->target == QOpenGLTexture::Target3D)
+ debug << ", " << d->dimensions[2];
+ debug << "], format=" << d->format << ", formatClass=" << d->formatClass;
+ if (t->isCreated())
+ debug << ", textureId=" << d->textureId;
+ if (t->isBound())
+ debug << ", [bound]";
+ if (t->isTextureView())
+ debug << ", [view]";
+ if (d->fixedSamplePositions)
+ debug << ", [fixedSamplePositions]";
+ debug << ", mipLevels=" << d->requestedMipLevels << ", layers=" << d->layers
+ << ", faces=" << d->faces << ", samples=" << d->samples
+ << ", depthStencilMode=" << d->depthStencilMode << ", comparisonFunction="
+ << d->comparisonFunction << ", comparisonMode=" << d->comparisonMode
+ << ", features=" << d->features << ", minificationFilter=" << d->minFilter
+ << ", magnificationFilter=" << d->magFilter << ", wrapMode=" << d->wrapModes[0];
+ } else {
+ debug << '0';
+ }
+ debug << ')';
+ return debug;
+}
+#endif // QT_NO_DEBUG_STREAM
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopengltexture.h b/src/opengl/qopengltexture.h
new file mode 100644
index 0000000000..8eba2724df
--- /dev/null
+++ b/src/opengl/qopengltexture.h
@@ -0,0 +1,663 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLABSTRACTTEXTURE_H
+#define QOPENGLABSTRACTTEXTURE_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#ifndef QT_NO_OPENGL
+
+#include <QtGui/qopengl.h>
+#include <QtGui/qimage.h>
+#include <QtCore/QScopedPointer>
+
+QT_BEGIN_NAMESPACE
+
+class QDebug;
+class QOpenGLTexturePrivate;
+class QOpenGLPixelTransferOptions;
+
+class Q_OPENGL_EXPORT QOpenGLTexture
+{
+ Q_GADGET
+public:
+ enum Target {
+ Target1D = 0x0DE0, // GL_TEXTURE_1D
+ Target1DArray = 0x8C18, // GL_TEXTURE_1D_ARRAY
+ Target2D = 0x0DE1, // GL_TEXTURE_2D
+ Target2DArray = 0x8C1A, // GL_TEXTURE_2D_ARRAY
+ Target3D = 0x806F, // GL_TEXTURE_3D
+ TargetCubeMap = 0x8513, // GL_TEXTURE_CUBE_MAP
+ TargetCubeMapArray = 0x9009, // GL_TEXTURE_CUBE_MAP_ARRAY
+ Target2DMultisample = 0x9100, // GL_TEXTURE_2D_MULTISAMPLE
+ Target2DMultisampleArray = 0x9102, // GL_TEXTURE_2D_MULTISAMPLE_ARRAY
+ TargetRectangle = 0x84F5, // GL_TEXTURE_RECTANGLE
+ TargetBuffer = 0x8C2A // GL_TEXTURE_BUFFER
+ };
+ Q_ENUM(Target)
+
+ enum BindingTarget {
+ BindingTarget1D = 0x8068, // GL_TEXTURE_BINDING_1D
+ BindingTarget1DArray = 0x8C1C, // GL_TEXTURE_BINDING_1D_ARRAY
+ BindingTarget2D = 0x8069, // GL_TEXTURE_BINDING_2D
+ BindingTarget2DArray = 0x8C1D, // GL_TEXTURE_BINDING_2D_ARRAY
+ BindingTarget3D = 0x806A, // GL_TEXTURE_BINDING_3D
+ BindingTargetCubeMap = 0x8514, // GL_TEXTURE_BINDING_CUBE_MAP
+ BindingTargetCubeMapArray = 0x900A, // GL_TEXTURE_BINDING_CUBE_MAP_ARRAY
+ BindingTarget2DMultisample = 0x9104, // GL_TEXTURE_BINDING_2D_MULTISAMPLE
+ BindingTarget2DMultisampleArray = 0x9105, // GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY
+ BindingTargetRectangle = 0x84F6, // GL_TEXTURE_BINDING_RECTANGLE
+ BindingTargetBuffer = 0x8C2C // GL_TEXTURE_BINDING_BUFFER
+ };
+ Q_ENUM(BindingTarget)
+
+ enum MipMapGeneration {
+ GenerateMipMaps,
+ DontGenerateMipMaps
+ };
+ Q_ENUM(MipMapGeneration)
+
+ enum TextureUnitReset {
+ ResetTextureUnit,
+ DontResetTextureUnit
+ };
+ Q_ENUM(TextureUnitReset)
+
+ enum TextureFormat {
+ NoFormat = 0, // GL_NONE
+
+ // Unsigned normalized formats
+ R8_UNorm = 0x8229, // GL_R8
+ RG8_UNorm = 0x822B, // GL_RG8
+ RGB8_UNorm = 0x8051, // GL_RGB8
+ RGBA8_UNorm = 0x8058, // GL_RGBA8
+
+ R16_UNorm = 0x822A, // GL_R16
+ RG16_UNorm = 0x822C, // GL_RG16
+ RGB16_UNorm = 0x8054, // GL_RGB16
+ RGBA16_UNorm = 0x805B, // GL_RGBA16
+
+ // Signed normalized formats
+ R8_SNorm = 0x8F94, // GL_R8_SNORM
+ RG8_SNorm = 0x8F95, // GL_RG8_SNORM
+ RGB8_SNorm = 0x8F96, // GL_RGB8_SNORM
+ RGBA8_SNorm = 0x8F97, // GL_RGBA8_SNORM
+
+ R16_SNorm = 0x8F98, // GL_R16_SNORM
+ RG16_SNorm = 0x8F99, // GL_RG16_SNORM
+ RGB16_SNorm = 0x8F9A, // GL_RGB16_SNORM
+ RGBA16_SNorm = 0x8F9B, // GL_RGBA16_SNORM
+
+ // Unsigned integer formats
+ R8U = 0x8232, // GL_R8UI
+ RG8U = 0x8238, // GL_RG8UI
+ RGB8U = 0x8D7D, // GL_RGB8UI
+ RGBA8U = 0x8D7C, // GL_RGBA8UI
+
+ R16U = 0x8234, // GL_R16UI
+ RG16U = 0x823A, // GL_RG16UI
+ RGB16U = 0x8D77, // GL_RGB16UI
+ RGBA16U = 0x8D76, // GL_RGBA16UI
+
+ R32U = 0x8236, // GL_R32UI
+ RG32U = 0x823C, // GL_RG32UI
+ RGB32U = 0x8D71, // GL_RGB32UI
+ RGBA32U = 0x8D70, // GL_RGBA32UI
+
+ // Signed integer formats
+ R8I = 0x8231, // GL_R8I
+ RG8I = 0x8237, // GL_RG8I
+ RGB8I = 0x8D8F, // GL_RGB8I
+ RGBA8I = 0x8D8E, // GL_RGBA8I
+
+ R16I = 0x8233, // GL_R16I
+ RG16I = 0x8239, // GL_RG16I
+ RGB16I = 0x8D89, // GL_RGB16I
+ RGBA16I = 0x8D88, // GL_RGBA16I
+
+ R32I = 0x8235, // GL_R32I
+ RG32I = 0x823B, // GL_RG32I
+ RGB32I = 0x8D83, // GL_RGB32I
+ RGBA32I = 0x8D82, // GL_RGBA32I
+
+ // Floating point formats
+ R16F = 0x822D, // GL_R16F
+ RG16F = 0x822F, // GL_RG16F
+ RGB16F = 0x881B, // GL_RGB16F
+ RGBA16F = 0x881A, // GL_RGBA16F
+
+ R32F = 0x822E, // GL_R32F
+ RG32F = 0x8230, // GL_RG32F
+ RGB32F = 0x8815, // GL_RGB32F
+ RGBA32F = 0x8814, // GL_RGBA32F
+
+ // Packed formats
+ RGB9E5 = 0x8C3D, // GL_RGB9_E5
+ RG11B10F = 0x8C3A, // GL_R11F_G11F_B10F
+ RG3B2 = 0x2A10, // GL_R3_G3_B2
+ R5G6B5 = 0x8D62, // GL_RGB565
+ RGB5A1 = 0x8057, // GL_RGB5_A1
+ RGBA4 = 0x8056, // GL_RGBA4
+ RGB10A2 = 0x906F, // GL_RGB10_A2UI
+
+ // Depth formats
+ D16 = 0x81A5, // GL_DEPTH_COMPONENT16
+ D24 = 0x81A6, // GL_DEPTH_COMPONENT24
+ D24S8 = 0x88F0, // GL_DEPTH24_STENCIL8
+ D32 = 0x81A7, // GL_DEPTH_COMPONENT32
+ D32F = 0x8CAC, // GL_DEPTH_COMPONENT32F
+ D32FS8X24 = 0x8CAD, // GL_DEPTH32F_STENCIL8
+ S8 = 0x8D48, // GL_STENCIL_INDEX8
+
+ // Compressed formats
+ RGB_DXT1 = 0x83F0, // GL_COMPRESSED_RGB_S3TC_DXT1_EXT
+ RGBA_DXT1 = 0x83F1, // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
+ RGBA_DXT3 = 0x83F2, // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
+ RGBA_DXT5 = 0x83F3, // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
+ R_ATI1N_UNorm = 0x8DBB, // GL_COMPRESSED_RED_RGTC1
+ R_ATI1N_SNorm = 0x8DBC, // GL_COMPRESSED_SIGNED_RED_RGTC1
+ RG_ATI2N_UNorm = 0x8DBD, // GL_COMPRESSED_RG_RGTC2
+ RG_ATI2N_SNorm = 0x8DBE, // GL_COMPRESSED_SIGNED_RG_RGTC2
+ RGB_BP_UNSIGNED_FLOAT = 0x8E8F, // GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
+ RGB_BP_SIGNED_FLOAT = 0x8E8E, // GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
+ RGB_BP_UNorm = 0x8E8C, // GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
+ R11_EAC_UNorm = 0x9270, // GL_COMPRESSED_R11_EAC
+ R11_EAC_SNorm = 0x9271, // GL_COMPRESSED_SIGNED_R11_EAC
+ RG11_EAC_UNorm = 0x9272, // GL_COMPRESSED_RG11_EAC
+ RG11_EAC_SNorm = 0x9273, // GL_COMPRESSED_SIGNED_RG11_EAC
+ RGB8_ETC2 = 0x9274, // GL_COMPRESSED_RGB8_ETC2
+ SRGB8_ETC2 = 0x9275, // GL_COMPRESSED_SRGB8_ETC2
+ RGB8_PunchThrough_Alpha1_ETC2 = 0x9276, // GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
+ SRGB8_PunchThrough_Alpha1_ETC2 = 0x9277, // GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
+ RGBA8_ETC2_EAC = 0x9278, // GL_COMPRESSED_RGBA8_ETC2_EAC
+ SRGB8_Alpha8_ETC2_EAC = 0x9279, // GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
+ RGB8_ETC1 = 0x8D64, // GL_ETC1_RGB8_OES
+ RGBA_ASTC_4x4 = 0x93B0, // GL_COMPRESSED_RGBA_ASTC_4x4_KHR
+ RGBA_ASTC_5x4 = 0x93B1, // GL_COMPRESSED_RGBA_ASTC_5x4_KHR
+ RGBA_ASTC_5x5 = 0x93B2, // GL_COMPRESSED_RGBA_ASTC_5x5_KHR
+ RGBA_ASTC_6x5 = 0x93B3, // GL_COMPRESSED_RGBA_ASTC_6x5_KHR
+ RGBA_ASTC_6x6 = 0x93B4, // GL_COMPRESSED_RGBA_ASTC_6x6_KHR
+ RGBA_ASTC_8x5 = 0x93B5, // GL_COMPRESSED_RGBA_ASTC_8x5_KHR
+ RGBA_ASTC_8x6 = 0x93B6, // GL_COMPRESSED_RGBA_ASTC_8x6_KHR
+ RGBA_ASTC_8x8 = 0x93B7, // GL_COMPRESSED_RGBA_ASTC_8x8_KHR
+ RGBA_ASTC_10x5 = 0x93B8, // GL_COMPRESSED_RGBA_ASTC_10x5_KHR
+ RGBA_ASTC_10x6 = 0x93B9, // GL_COMPRESSED_RGBA_ASTC_10x6_KHR
+ RGBA_ASTC_10x8 = 0x93BA, // GL_COMPRESSED_RGBA_ASTC_10x8_KHR
+ RGBA_ASTC_10x10 = 0x93BB, // GL_COMPRESSED_RGBA_ASTC_10x10_KHR
+ RGBA_ASTC_12x10 = 0x93BC, // GL_COMPRESSED_RGBA_ASTC_12x10_KHR
+ RGBA_ASTC_12x12 = 0x93BD, // GL_COMPRESSED_RGBA_ASTC_12x12_KHR
+ SRGB8_Alpha8_ASTC_4x4 = 0x93D0, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR
+ SRGB8_Alpha8_ASTC_5x4 = 0x93D1, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR
+ SRGB8_Alpha8_ASTC_5x5 = 0x93D2, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR
+ SRGB8_Alpha8_ASTC_6x5 = 0x93D3, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR
+ SRGB8_Alpha8_ASTC_6x6 = 0x93D4, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR
+ SRGB8_Alpha8_ASTC_8x5 = 0x93D5, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR
+ SRGB8_Alpha8_ASTC_8x6 = 0x93D6, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR
+ SRGB8_Alpha8_ASTC_8x8 = 0x93D7, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR
+ SRGB8_Alpha8_ASTC_10x5 = 0x93D8, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR
+ SRGB8_Alpha8_ASTC_10x6 = 0x93D9, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR
+ SRGB8_Alpha8_ASTC_10x8 = 0x93DA, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR
+ SRGB8_Alpha8_ASTC_10x10 = 0x93DB, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR
+ SRGB8_Alpha8_ASTC_12x10 = 0x93DC, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR
+ SRGB8_Alpha8_ASTC_12x12 = 0x93DD, // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR
+
+ // sRGB formats
+ SRGB8 = 0x8C41, // GL_SRGB8
+ SRGB8_Alpha8 = 0x8C43, // GL_SRGB8_ALPHA8
+ SRGB_DXT1 = 0x8C4C, // GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
+ SRGB_Alpha_DXT1 = 0x8C4D, // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
+ SRGB_Alpha_DXT3 = 0x8C4E, // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
+ SRGB_Alpha_DXT5 = 0x8C4F, // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
+ SRGB_BP_UNorm = 0x8E8D, // GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
+
+ // ES 2 formats
+ DepthFormat = 0x1902, // GL_DEPTH_COMPONENT
+ AlphaFormat = 0x1906, // GL_ALPHA
+ RGBFormat = 0x1907, // GL_RGB
+ RGBAFormat = 0x1908, // GL_RGBA
+ LuminanceFormat = 0x1909, // GL_LUMINANCE
+ LuminanceAlphaFormat = 0x190A
+
+ };
+ Q_ENUM(TextureFormat)
+
+ // This is not used externally yet but is reserved to allow checking of
+ // compatibility between texture formats
+#ifndef Q_QDOC
+ enum TextureFormatClass {
+ NoFormatClass,
+ FormatClass_128Bit,
+ FormatClass_96Bit,
+ FormatClass_64Bit,
+ FormatClass_48Bit,
+ FormatClass_32Bit,
+ FormatClass_24Bit,
+ FormatClass_16Bit,
+ FormatClass_8Bit,
+ FormatClass_RGTC1_R,
+ FormatClass_RGTC2_RG,
+ FormatClass_BPTC_Unorm,
+ FormatClass_BPTC_Float,
+ FormatClass_S3TC_DXT1_RGB,
+ FormatClass_S3TC_DXT1_RGBA,
+ FormatClass_S3TC_DXT3_RGBA,
+ FormatClass_S3TC_DXT5_RGBA,
+ FormatClass_Unique
+ };
+#endif
+
+ enum CubeMapFace {
+ CubeMapPositiveX = 0x8515, // GL_TEXTURE_CUBE_MAP_POSITIVE_X
+ CubeMapNegativeX = 0x8516, // GL_TEXTURE_CUBE_MAP_NEGATIVE_X
+ CubeMapPositiveY = 0x8517, // GL_TEXTURE_CUBE_MAP_POSITIVE_Y
+ CubeMapNegativeY = 0x8518, // GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
+ CubeMapPositiveZ = 0x8519, // GL_TEXTURE_CUBE_MAP_POSITIVE_Z
+ CubeMapNegativeZ = 0x851A // GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+ };
+ Q_ENUM(CubeMapFace)
+
+ enum PixelFormat {
+ NoSourceFormat = 0, // GL_NONE
+ Red = 0x1903, // GL_RED
+ RG = 0x8227, // GL_RG
+ RGB = 0x1907, // GL_RGB
+ BGR = 0x80E0, // GL_BGR
+ RGBA = 0x1908, // GL_RGBA
+ BGRA = 0x80E1, // GL_BGRA
+ Red_Integer = 0x8D94, // GL_RED_INTEGER
+ RG_Integer = 0x8228, // GL_RG_INTEGER
+ RGB_Integer = 0x8D98, // GL_RGB_INTEGER
+ BGR_Integer = 0x8D9A, // GL_BGR_INTEGER
+ RGBA_Integer = 0x8D99, // GL_RGBA_INTEGER
+ BGRA_Integer = 0x8D9B, // GL_BGRA_INTEGER
+ Stencil = 0x1901, // GL_STENCIL_INDEX
+ Depth = 0x1902, // GL_DEPTH_COMPONENT
+ DepthStencil = 0x84F9, // GL_DEPTH_STENCIL
+ Alpha = 0x1906, // GL_ALPHA
+ Luminance = 0x1909, // GL_LUMINANCE
+ LuminanceAlpha = 0x190A // GL_LUMINANCE_ALPHA
+ };
+ Q_ENUM(PixelFormat)
+
+ enum PixelType {
+ NoPixelType = 0, // GL_NONE
+ Int8 = 0x1400, // GL_BYTE
+ UInt8 = 0x1401, // GL_UNSIGNED_BYTE
+ Int16 = 0x1402, // GL_SHORT
+ UInt16 = 0x1403, // GL_UNSIGNED_SHORT
+ Int32 = 0x1404, // GL_INT
+ UInt32 = 0x1405, // GL_UNSIGNED_INT
+ Float16 = 0x140B, // GL_HALF_FLOAT
+ Float16OES = 0x8D61, // GL_HALF_FLOAT_OES
+ Float32 = 0x1406, // GL_FLOAT
+ UInt32_RGB9_E5 = 0x8C3E, // GL_UNSIGNED_INT_5_9_9_9_REV
+ UInt32_RG11B10F = 0x8C3B, // GL_UNSIGNED_INT_10F_11F_11F_REV
+ UInt8_RG3B2 = 0x8032, // GL_UNSIGNED_BYTE_3_3_2
+ UInt8_RG3B2_Rev = 0x8362, // GL_UNSIGNED_BYTE_2_3_3_REV
+ UInt16_RGB5A1 = 0x8034, // GL_UNSIGNED_SHORT_5_5_5_1
+ UInt16_RGB5A1_Rev = 0x8366, // GL_UNSIGNED_SHORT_1_5_5_5_REV
+ UInt16_R5G6B5 = 0x8363, // GL_UNSIGNED_SHORT_5_6_5
+ UInt16_R5G6B5_Rev = 0x8364, // GL_UNSIGNED_SHORT_5_6_5_REV
+ UInt16_RGBA4 = 0x8033, // GL_UNSIGNED_SHORT_4_4_4_4
+ UInt16_RGBA4_Rev = 0x8365, // GL_UNSIGNED_SHORT_4_4_4_4_REV
+ UInt32_RGBA8 = 0x8035, // GL_UNSIGNED_INT_8_8_8_8
+ UInt32_RGBA8_Rev = 0x8367, // GL_UNSIGNED_INT_8_8_8_8_REV
+ UInt32_RGB10A2 = 0x8036, // GL_UNSIGNED_INT_10_10_10_2
+ UInt32_RGB10A2_Rev = 0x8368, // GL_UNSIGNED_INT_2_10_10_10_REV
+ UInt32_D24S8 = 0x84FA, // GL_UNSIGNED_INT_24_8
+ Float32_D32_UInt32_S8_X24 = 0x8DAD // GL_FLOAT_32_UNSIGNED_INT_24_8_REV
+ };
+ Q_ENUM(PixelType)
+
+ enum SwizzleComponent {
+ SwizzleRed = 0x8E42, // GL_TEXTURE_SWIZZLE_R
+ SwizzleGreen = 0x8E43, // GL_TEXTURE_SWIZZLE_G
+ SwizzleBlue = 0x8E44, // GL_TEXTURE_SWIZZLE_B
+ SwizzleAlpha = 0x8E45 // GL_TEXTURE_SWIZZLE_A
+ };
+ Q_ENUM(SwizzleComponent)
+
+ enum SwizzleValue {
+ RedValue = 0x1903, // GL_RED
+ GreenValue = 0x1904, // GL_GREEN
+ BlueValue = 0x1905, // GL_BLUE
+ AlphaValue = 0x1906, // GL_ALPHA
+ ZeroValue = 0, // GL_ZERO
+ OneValue = 1 // GL_ONE
+ };
+ Q_ENUM(SwizzleValue)
+
+ enum WrapMode {
+ Repeat = 0x2901, // GL_REPEAT
+ MirroredRepeat = 0x8370, // GL_MIRRORED_REPEAT
+ ClampToEdge = 0x812F, // GL_CLAMP_TO_EDGE
+ ClampToBorder = 0x812D // GL_CLAMP_TO_BORDER
+ };
+ Q_ENUM(WrapMode)
+
+ enum CoordinateDirection {
+ DirectionS = 0x2802, // GL_TEXTURE_WRAP_S
+ DirectionT = 0x2803, // GL_TEXTURE_WRAP_T
+ DirectionR = 0x8072 // GL_TEXTURE_WRAP_R
+ };
+ Q_ENUM(CoordinateDirection)
+
+ // Features
+ enum Feature {
+ ImmutableStorage = 0x00000001,
+ ImmutableMultisampleStorage = 0x00000002,
+ TextureRectangle = 0x00000004,
+ TextureArrays = 0x00000008,
+ Texture3D = 0x00000010,
+ TextureMultisample = 0x00000020,
+ TextureBuffer = 0x00000040,
+ TextureCubeMapArrays = 0x00000080,
+ Swizzle = 0x00000100,
+ StencilTexturing = 0x00000200,
+ AnisotropicFiltering = 0x00000400,
+ NPOTTextures = 0x00000800,
+ NPOTTextureRepeat = 0x00001000,
+ Texture1D = 0x00002000,
+ TextureComparisonOperators = 0x00004000,
+ TextureMipMapLevel = 0x00008000,
+#ifndef Q_QDOC
+ MaxFeatureFlag = 0x00010000
+#endif
+ };
+ Q_DECLARE_FLAGS(Features, Feature)
+ Q_ENUM(Feature)
+
+ explicit QOpenGLTexture(Target target);
+ explicit QOpenGLTexture(const QImage& image, MipMapGeneration genMipMaps = GenerateMipMaps);
+ ~QOpenGLTexture();
+
+ Target target() const;
+
+ // Creation and destruction
+ bool create();
+ void destroy();
+ bool isCreated() const;
+ GLuint textureId() const;
+
+ // Binding and releasing
+ void bind();
+ void bind(uint unit, TextureUnitReset reset = DontResetTextureUnit);
+ void release();
+ void release(uint unit, TextureUnitReset reset = DontResetTextureUnit);
+
+ bool isBound() const;
+ bool isBound(uint unit);
+ static GLuint boundTextureId(BindingTarget target);
+ static GLuint boundTextureId(uint unit, BindingTarget target);
+
+ // Storage allocation
+ void setFormat(TextureFormat format);
+ TextureFormat format() const;
+ void setSize(int width, int height = 1, int depth = 1);
+ int width() const;
+ int height() const;
+ int depth() const;
+ void setMipLevels(int levels);
+ int mipLevels() const;
+ int maximumMipLevels() const;
+ void setLayers(int layers);
+ int layers() const;
+ int faces() const;
+ void setSamples(int samples);
+ int samples() const;
+ void setFixedSamplePositions(bool fixed);
+ bool isFixedSamplePositions() const;
+ void allocateStorage();
+ void allocateStorage(PixelFormat pixelFormat, PixelType pixelType);
+ bool isStorageAllocated() const;
+
+ QOpenGLTexture *createTextureView(Target target,
+ TextureFormat viewFormat,
+ int minimumMipmapLevel, int maximumMipmapLevel,
+ int minimumLayer, int maximumLayer) const;
+ bool isTextureView() const;
+
+ // Pixel transfer
+ // ### Qt 6: remove the non-const void * overloads
+#if QT_DEPRECATED_SINCE(5, 3)
+ QT_DEPRECATED void setData(int mipLevel, int layer, CubeMapFace cubeFace,
+ PixelFormat sourceFormat, PixelType sourceType,
+ void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+ QT_DEPRECATED void setData(int mipLevel, int layer,
+ PixelFormat sourceFormat, PixelType sourceType,
+ void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+ QT_DEPRECATED void setData(int mipLevel,
+ PixelFormat sourceFormat, PixelType sourceType,
+ void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+ QT_DEPRECATED void setData(PixelFormat sourceFormat, PixelType sourceType,
+ void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+#endif // QT_DEPRECATED_SINCE(5, 3)
+
+ void setData(int mipLevel, int layer, CubeMapFace cubeFace,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setData(int mipLevel, int layer, int layerCount, CubeMapFace cubeFace,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setData(int mipLevel, int layer,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setData(int mipLevel,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setData(PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+
+ void setData(int xOffset, int yOffset, int zOffset,
+ int width, int height, int depth,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setData(int xOffset, int yOffset, int zOffset,
+ int width, int height, int depth, int mipLevel,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setData(int xOffset, int yOffset, int zOffset,
+ int width, int height, int depth,
+ int mipLevel, int layer,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setData(int xOffset, int yOffset, int zOffset,
+ int width, int height, int depth,
+ int mipLevel, int layer,
+ CubeMapFace cubeFace,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setData(int xOffset, int yOffset, int zOffset,
+ int width, int height, int depth,
+ int mipLevel, int layer,
+ CubeMapFace cubeFace, int layerCount,
+ PixelFormat sourceFormat, PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
+
+ // Compressed data upload
+ // ### Qt 6: remove the non-const void * overloads
+#if QT_DEPRECATED_SINCE(5, 3)
+ QT_DEPRECATED void setCompressedData(int mipLevel, int layer, CubeMapFace cubeFace,
+ int dataSize, void *data,
+ const QOpenGLPixelTransferOptions * const options = nullptr);
+ QT_DEPRECATED void setCompressedData(int mipLevel, int layer,
+ int dataSize, void *data,
+ const QOpenGLPixelTransferOptions * const options = nullptr);
+ QT_DEPRECATED void setCompressedData(int mipLevel, int dataSize, void *data,
+ const QOpenGLPixelTransferOptions * const options = nullptr);
+ QT_DEPRECATED void setCompressedData(int dataSize, void *data,
+ const QOpenGLPixelTransferOptions * const options = nullptr);
+#endif // QT_DEPRECATED_SINCE(5, 3)
+
+ void setCompressedData(int mipLevel, int layer, CubeMapFace cubeFace,
+ int dataSize, const void *data,
+ const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setCompressedData(int mipLevel, int layer, int layerCount, CubeMapFace cubeFace,
+ int dataSize, const void *data,
+ const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setCompressedData(int mipLevel, int layer,
+ int dataSize, const void *data,
+ const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setCompressedData(int mipLevel, int dataSize, const void *data,
+ const QOpenGLPixelTransferOptions * const options = nullptr);
+ void setCompressedData(int dataSize, const void *data,
+ const QOpenGLPixelTransferOptions * const options = nullptr);
+
+ // Helpful overloads for setData
+ void setData(const QImage& image, MipMapGeneration genMipMaps = GenerateMipMaps);
+
+ static bool hasFeature(Feature feature);
+
+ // Texture Parameters
+ void setMipBaseLevel(int baseLevel);
+ int mipBaseLevel() const;
+ void setMipMaxLevel(int maxLevel);
+ int mipMaxLevel() const;
+ void setMipLevelRange(int baseLevel, int maxLevel);
+ QPair<int, int> mipLevelRange() const;
+
+ void setAutoMipMapGenerationEnabled(bool enabled);
+ bool isAutoMipMapGenerationEnabled() const;
+
+ void generateMipMaps();
+ void generateMipMaps(int baseLevel, bool resetBaseLevel = true);
+
+ void setSwizzleMask(SwizzleComponent component, SwizzleValue value);
+ void setSwizzleMask(SwizzleValue r, SwizzleValue g,
+ SwizzleValue b, SwizzleValue a);
+ SwizzleValue swizzleMask(SwizzleComponent component) const;
+
+ enum DepthStencilMode {
+ DepthMode = 0x1902, // GL_DEPTH_COMPONENT
+ StencilMode = 0x1901 // GL_STENCIL_INDEX
+ };
+ Q_ENUM(DepthStencilMode)
+
+ void setDepthStencilMode(DepthStencilMode mode);
+ DepthStencilMode depthStencilMode() const;
+
+ enum ComparisonFunction {
+ CompareLessEqual = 0x0203, // GL_LEQUAL
+ CompareGreaterEqual = 0x0206, // GL_GEQUAL
+ CompareLess = 0x0201, // GL_LESS
+ CompareGreater = 0x0204, // GL_GREATER
+ CompareEqual = 0x0202, // GL_EQUAL
+ CommpareNotEqual = 0x0205, // GL_NOTEQUAL
+ CompareAlways = 0x0207, // GL_ALWAYS
+ CompareNever = 0x0200 // GL_NEVER
+ };
+ Q_ENUM(ComparisonFunction)
+
+ void setComparisonFunction(ComparisonFunction function);
+ ComparisonFunction comparisonFunction() const;
+
+ enum ComparisonMode {
+ CompareRefToTexture = 0x884E, // GL_COMPARE_REF_TO_TEXTURE
+ CompareNone = 0x0000 // GL_NONE
+ };
+
+ void setComparisonMode(ComparisonMode mode);
+ ComparisonMode comparisonMode() const;
+
+ // Sampling Parameters
+ enum Filter {
+ Nearest = 0x2600, // GL_NEAREST
+ Linear = 0x2601, // GL_LINEAR
+ NearestMipMapNearest = 0x2700, // GL_NEAREST_MIPMAP_NEAREST
+ NearestMipMapLinear = 0x2702, // GL_NEAREST_MIPMAP_LINEAR
+ LinearMipMapNearest = 0x2701, // GL_LINEAR_MIPMAP_NEAREST
+ LinearMipMapLinear = 0x2703 // GL_LINEAR_MIPMAP_LINEAR
+ };
+ Q_ENUM(Filter)
+
+ void setMinificationFilter(Filter filter);
+ Filter minificationFilter() const;
+ void setMagnificationFilter(Filter filter);
+ Filter magnificationFilter() const;
+ void setMinMagFilters(Filter minificationFilter,
+ Filter magnificationFilter);
+ QPair<Filter, Filter> minMagFilters() const;
+ void setMaximumAnisotropy(float anisotropy);
+ float maximumAnisotropy() const;
+
+ void setWrapMode(WrapMode mode);
+ void setWrapMode(CoordinateDirection direction, WrapMode mode);
+ WrapMode wrapMode(CoordinateDirection direction) const;
+
+ void setBorderColor(const QColor &color);
+ void setBorderColor(float r, float g, float b, float a);
+ void setBorderColor(int r, int g, int b, int a);
+ void setBorderColor(uint r, uint g, uint b, uint a);
+
+ QColor borderColor() const;
+ void borderColor(float *border) const;
+ void borderColor(int *border) const;
+ void borderColor(unsigned int *border) const;
+
+ void setMinimumLevelOfDetail(float value);
+ float minimumLevelOfDetail() const;
+ void setMaximumLevelOfDetail(float value);
+ float maximumLevelOfDetail() const;
+ void setLevelOfDetailRange(float min, float max);
+ QPair<float, float> levelOfDetailRange() const;
+ void setLevelofDetailBias(float bias);
+ float levelofDetailBias() const;
+
+#ifndef QT_NO_DEBUG_STREAM
+ friend Q_OPENGL_EXPORT QDebug operator<<(QDebug dbg, const QOpenGLTexture *t);
+#endif
+
+private:
+ Q_DISABLE_COPY(QOpenGLTexture)
+ Q_DECLARE_PRIVATE(QOpenGLTexture)
+ QScopedPointer<QOpenGLTexturePrivate> d_ptr;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLTexture::Features)
+
+#ifndef QT_NO_DEBUG_STREAM
+Q_OPENGL_EXPORT QDebug operator<<(QDebug debug, const QOpenGLTexture *t);
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL
+
+#endif // QOPENGLABSTRACTTEXTURE_H
diff --git a/src/opengl/qopengltexture_p.h b/src/opengl/qopengltexture_p.h
new file mode 100644
index 0000000000..1dc0801644
--- /dev/null
+++ b/src/opengl/qopengltexture_p.h
@@ -0,0 +1,184 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QABSTRACTOPENGLTEXTURE_P_H
+#define QABSTRACTOPENGLTEXTURE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QT_NO_OPENGL
+
+#include <QtOpenGL/qtopenglglobal.h>
+#include "private/qobject_p.h"
+#include "qopengltexture.h"
+#include "qopengl.h"
+
+#include <cmath>
+
+namespace {
+inline double qLog2(const double x)
+{
+ return std::log(x) / std::log(2.0);
+}
+}
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLContext;
+class QOpenGLTextureHelper;
+class QOpenGLFunctions;
+
+class QOpenGLTexturePrivate
+{
+public:
+ QOpenGLTexturePrivate(QOpenGLTexture::Target textureTarget,
+ QOpenGLTexture *qq);
+ ~QOpenGLTexturePrivate();
+
+ Q_DECLARE_PUBLIC(QOpenGLTexture)
+
+ void resetFuncs(QOpenGLTextureHelper *funcs);
+ void initializeOpenGLFunctions();
+
+ bool create();
+ void destroy();
+
+ void bind();
+ void bind(uint unit, QOpenGLTexture::TextureUnitReset reset = QOpenGLTexture::DontResetTextureUnit);
+ void release();
+ void release(uint unit, QOpenGLTexture::TextureUnitReset reset = QOpenGLTexture::DontResetTextureUnit);
+ bool isBound() const;
+ bool isBound(uint unit) const;
+
+ void allocateStorage(QOpenGLTexture::PixelFormat pixelFormat, QOpenGLTexture::PixelType pixelType);
+ void allocateMutableStorage(QOpenGLTexture::PixelFormat pixelFormat, QOpenGLTexture::PixelType pixelType);
+ void allocateImmutableStorage();
+ void setData(int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
+ QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options);
+ void setData(int xOffset, int yOffset, int zOffset, int width, int height, int depth,
+ int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
+ QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
+ const void *data, const QOpenGLPixelTransferOptions * const options);
+ void setCompressedData(int mipLevel, int layer, int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
+ int dataSize, const void *data,
+ const QOpenGLPixelTransferOptions * const options);
+
+
+ void setWrapMode(QOpenGLTexture::WrapMode mode);
+ void setWrapMode(QOpenGLTexture::CoordinateDirection direction, QOpenGLTexture::WrapMode mode);
+ QOpenGLTexture::WrapMode wrapMode(QOpenGLTexture::CoordinateDirection direction) const;
+
+ QOpenGLTexture *createTextureView(QOpenGLTexture::Target target, QOpenGLTexture::TextureFormat viewFormat,
+ int minimumMipmapLevel, int maximumMipmapLevel,
+ int minimumLayer, int maximumLayer) const;
+
+ int evaluateMipLevels() const;
+
+ inline int maximumMipLevelCount() const
+ {
+ return 1 + std::floor(qLog2(qMax(dimensions[0], qMax(dimensions[1], dimensions[2]))));
+ }
+
+ static inline int mipLevelSize(int mipLevel, int baseLevelSize)
+ {
+ return std::floor(double(qMax(1, baseLevelSize >> mipLevel)));
+ }
+
+ bool isUsingImmutableStorage() const;
+
+ QOpenGLTexture *q_ptr;
+ QOpenGLContext *context;
+ QOpenGLTexture::Target target;
+ QOpenGLTexture::BindingTarget bindingTarget;
+ GLuint textureId;
+ QOpenGLTexture::TextureFormat format;
+ QOpenGLTexture::TextureFormatClass formatClass;
+ int dimensions[3];
+ int requestedMipLevels;
+ int mipLevels;
+ int layers;
+ int faces;
+
+ int samples;
+ bool fixedSamplePositions;
+
+ int baseLevel;
+ int maxLevel;
+
+ QOpenGLTexture::SwizzleValue swizzleMask[4];
+ QOpenGLTexture::DepthStencilMode depthStencilMode;
+ QOpenGLTexture::ComparisonFunction comparisonFunction;
+ QOpenGLTexture::ComparisonMode comparisonMode;
+
+ QOpenGLTexture::Filter minFilter;
+ QOpenGLTexture::Filter magFilter;
+ float maxAnisotropy;
+ QOpenGLTexture::WrapMode wrapModes[3];
+ QVariantList borderColor;
+ float minLevelOfDetail;
+ float maxLevelOfDetail;
+ float levelOfDetailBias;
+
+ bool textureView;
+ bool autoGenerateMipMaps;
+ bool storageAllocated;
+
+ QOpenGLTextureHelper *texFuncs;
+ QOpenGLFunctions *functions;
+
+ QOpenGLTexture::Features features;
+};
+
+QT_END_NAMESPACE
+
+#undef Q_CALL_MEMBER_FUNCTION
+
+#endif // QT_NO_OPENGL
+
+#endif // QABSTRACTOPENGLTEXTURE_P_H
diff --git a/src/opengl/qopengltextureblitter.cpp b/src/opengl/qopengltextureblitter.cpp
new file mode 100644
index 0000000000..b350e8e0e3
--- /dev/null
+++ b/src/opengl/qopengltextureblitter.cpp
@@ -0,0 +1,682 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopengltextureblitter.h"
+
+#include <QtOpenGL/QOpenGLShaderProgram>
+#include <QtOpenGL/QOpenGLVertexArrayObject>
+#include <QtOpenGL/QOpenGLBuffer>
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QOpenGLFunctions>
+
+#ifndef GL_TEXTURE_EXTERNAL_OES
+#define GL_TEXTURE_EXTERNAL_OES 0x8D65
+#endif
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLTextureBlitter
+ \brief The QOpenGLTextureBlitter class provides a convenient way to draw textured quads via OpenGL.
+ \since 5.8
+ \ingroup painting-3D
+ \inmodule QtOpenGL
+
+ Drawing textured quads, in order to get the contents of a texture
+ onto the screen, is a common operation when developing 2D user
+ interfaces. QOpenGLTextureBlitter provides a convenience class to
+ avoid repeating vertex data, shader sources, buffer and program
+ management and matrix calculations.
+
+ For example, a QOpenGLWidget subclass can do the following to draw
+ the contents rendered into a framebuffer at the pixel position \c{(x, y)}:
+
+ \code
+ void OpenGLWidget::initializeGL()
+ {
+ m_blitter.create();
+ m_fbo = new QOpenGLFramebufferObject(size);
+ }
+
+ void OpenGLWidget::paintGL()
+ {
+ m_fbo->bind();
+ // update offscreen content
+ m_fbo->release();
+
+ m_blitter.bind();
+ const QRect targetRect(QPoint(x, y), m_fbo->size());
+ const QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(targetRect, QRect(QPoint(0, 0), m_fbo->size()));
+ m_blitter.blit(m_fbo->texture(), target, QOpenGLTextureBlitter::OriginBottomLeft);
+ m_blitter.release();
+ }
+ \endcode
+
+ The blitter implements GLSL shaders both for GLSL 1.00 (suitable
+ for OpenGL (ES) 2.x and compatibility profiles of newer OpenGL
+ versions) and version 150 (suitable for core profile contexts with
+ OpenGL 3.2 and newer).
+ */
+
+static const char vertex_shader150[] =
+ "#version 150 core\n"
+ "in vec3 vertexCoord;"
+ "in vec2 textureCoord;"
+ "out vec2 uv;"
+ "uniform mat4 vertexTransform;"
+ "uniform mat3 textureTransform;"
+ "void main() {"
+ " uv = (textureTransform * vec3(textureCoord,1.0)).xy;"
+ " gl_Position = vertexTransform * vec4(vertexCoord,1.0);"
+ "}";
+
+static const char fragment_shader150[] =
+ "#version 150 core\n"
+ "in vec2 uv;"
+ "out vec4 fragcolor;"
+ "uniform sampler2D textureSampler;"
+ "uniform bool swizzle;"
+ "uniform float opacity;"
+ "void main() {"
+ " vec4 tmpFragColor = texture(textureSampler, uv);"
+ " tmpFragColor.a *= opacity;"
+ " fragcolor = swizzle ? tmpFragColor.bgra : tmpFragColor;"
+ "}";
+
+static const char vertex_shader[] =
+ "attribute highp vec3 vertexCoord;"
+ "attribute highp vec2 textureCoord;"
+ "varying highp vec2 uv;"
+ "uniform highp mat4 vertexTransform;"
+ "uniform highp mat3 textureTransform;"
+ "void main() {"
+ " uv = (textureTransform * vec3(textureCoord,1.0)).xy;"
+ " gl_Position = vertexTransform * vec4(vertexCoord,1.0);"
+ "}";
+
+static const char fragment_shader[] =
+ "varying highp vec2 uv;"
+ "uniform sampler2D textureSampler;"
+ "uniform bool swizzle;"
+ "uniform highp float opacity;"
+ "void main() {"
+ " highp vec4 tmpFragColor = texture2D(textureSampler,uv);"
+ " tmpFragColor.a *= opacity;"
+ " gl_FragColor = swizzle ? tmpFragColor.bgra : tmpFragColor;"
+ "}";
+
+static const char fragment_shader_external_oes[] =
+ "#extension GL_OES_EGL_image_external : require\n"
+ "varying highp vec2 uv;"
+ "uniform samplerExternalOES textureSampler;\n"
+ "uniform bool swizzle;"
+ "uniform highp float opacity;"
+ "void main() {"
+ " highp vec4 tmpFragColor = texture2D(textureSampler, uv);"
+ " tmpFragColor.a *= opacity;"
+ " gl_FragColor = swizzle ? tmpFragColor.bgra : tmpFragColor;"
+ "}";
+
+static const GLfloat vertex_buffer_data[] = {
+ -1,-1, 0,
+ -1, 1, 0,
+ 1,-1, 0,
+ -1, 1, 0,
+ 1,-1, 0,
+ 1, 1, 0
+};
+
+static const GLfloat texture_buffer_data[] = {
+ 0, 0,
+ 0, 1,
+ 1, 0,
+ 0, 1,
+ 1, 0,
+ 1, 1
+};
+
+class TextureBinder
+{
+public:
+ TextureBinder(GLenum target, GLuint textureId) : m_target(target)
+ {
+ QOpenGLContext::currentContext()->functions()->glBindTexture(m_target, textureId);
+ }
+ ~TextureBinder()
+ {
+ QOpenGLContext::currentContext()->functions()->glBindTexture(m_target, 0);
+ }
+
+private:
+ GLenum m_target;
+};
+
+class QOpenGLTextureBlitterPrivate
+{
+public:
+ enum TextureMatrixUniform {
+ User,
+ Identity,
+ IdentityFlipped
+ };
+
+ enum ProgramIndex {
+ TEXTURE_2D,
+ TEXTURE_EXTERNAL_OES
+ };
+
+ QOpenGLTextureBlitterPrivate() :
+ swizzle(false),
+ opacity(1.0f),
+ vao(new QOpenGLVertexArrayObject),
+ currentTarget(TEXTURE_2D)
+ { }
+
+ bool buildProgram(ProgramIndex idx, const char *vs, const char *fs);
+
+ void blit(GLuint texture, const QMatrix4x4 &vertexTransform, const QMatrix3x3 &textureTransform);
+ void blit(GLuint texture, const QMatrix4x4 &vertexTransform, QOpenGLTextureBlitter::Origin origin);
+
+ void prepareProgram(const QMatrix4x4 &vertexTransform);
+
+ QOpenGLBuffer vertexBuffer;
+ QOpenGLBuffer textureBuffer;
+ struct Program {
+ Program() :
+ vertexCoordAttribPos(0),
+ vertexTransformUniformPos(0),
+ textureCoordAttribPos(0),
+ textureTransformUniformPos(0),
+ swizzleUniformPos(0),
+ opacityUniformPos(0),
+ swizzle(false),
+ opacity(0.0f),
+ textureMatrixUniformState(User)
+ { }
+ QScopedPointer<QOpenGLShaderProgram> glProgram;
+ GLuint vertexCoordAttribPos;
+ GLuint vertexTransformUniformPos;
+ GLuint textureCoordAttribPos;
+ GLuint textureTransformUniformPos;
+ GLuint swizzleUniformPos;
+ GLuint opacityUniformPos;
+ bool swizzle;
+ float opacity;
+ TextureMatrixUniform textureMatrixUniformState;
+ } programs[2];
+ bool swizzle;
+ float opacity;
+ QScopedPointer<QOpenGLVertexArrayObject> vao;
+ GLenum currentTarget;
+};
+
+static inline QOpenGLTextureBlitterPrivate::ProgramIndex targetToProgramIndex(GLenum target)
+{
+ switch (target) {
+ case GL_TEXTURE_2D:
+ return QOpenGLTextureBlitterPrivate::TEXTURE_2D;
+ case GL_TEXTURE_EXTERNAL_OES:
+ return QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES;
+ default:
+ qWarning("Unsupported texture target 0x%x", target);
+ return QOpenGLTextureBlitterPrivate::TEXTURE_2D;
+ }
+}
+
+void QOpenGLTextureBlitterPrivate::prepareProgram(const QMatrix4x4 &vertexTransform)
+{
+ Program *program = &programs[targetToProgramIndex(currentTarget)];
+
+ vertexBuffer.bind();
+ program->glProgram->setAttributeBuffer(program->vertexCoordAttribPos, GL_FLOAT, 0, 3, 0);
+ program->glProgram->enableAttributeArray(program->vertexCoordAttribPos);
+ vertexBuffer.release();
+
+ program->glProgram->setUniformValue(program->vertexTransformUniformPos, vertexTransform);
+
+ textureBuffer.bind();
+ program->glProgram->setAttributeBuffer(program->textureCoordAttribPos, GL_FLOAT, 0, 2, 0);
+ program->glProgram->enableAttributeArray(program->textureCoordAttribPos);
+ textureBuffer.release();
+
+ if (swizzle != program->swizzle) {
+ program->glProgram->setUniformValue(program->swizzleUniformPos, swizzle);
+ program->swizzle = swizzle;
+ }
+
+ if (opacity != program->opacity) {
+ program->glProgram->setUniformValue(program->opacityUniformPos, opacity);
+ program->opacity = opacity;
+ }
+}
+
+void QOpenGLTextureBlitterPrivate::blit(GLuint texture,
+ const QMatrix4x4 &vertexTransform,
+ const QMatrix3x3 &textureTransform)
+{
+ TextureBinder binder(currentTarget, texture);
+ prepareProgram(vertexTransform);
+
+ Program *program = &programs[targetToProgramIndex(currentTarget)];
+ program->glProgram->setUniformValue(program->textureTransformUniformPos, textureTransform);
+ program->textureMatrixUniformState = User;
+
+ QOpenGLContext::currentContext()->functions()->glDrawArrays(GL_TRIANGLES, 0, 6);
+}
+
+void QOpenGLTextureBlitterPrivate::blit(GLuint texture,
+ const QMatrix4x4 &vertexTransform,
+ QOpenGLTextureBlitter::Origin origin)
+{
+ TextureBinder binder(currentTarget, texture);
+ prepareProgram(vertexTransform);
+
+ Program *program = &programs[targetToProgramIndex(currentTarget)];
+ if (origin == QOpenGLTextureBlitter::OriginTopLeft) {
+ if (program->textureMatrixUniformState != IdentityFlipped) {
+ QMatrix3x3 flipped;
+ flipped(1,1) = -1;
+ flipped(1,2) = 1;
+ program->glProgram->setUniformValue(program->textureTransformUniformPos, flipped);
+ program->textureMatrixUniformState = IdentityFlipped;
+ }
+ } else if (program->textureMatrixUniformState != Identity) {
+ program->glProgram->setUniformValue(program->textureTransformUniformPos, QMatrix3x3());
+ program->textureMatrixUniformState = Identity;
+ }
+
+ QOpenGLContext::currentContext()->functions()->glDrawArrays(GL_TRIANGLES, 0, 6);
+}
+
+bool QOpenGLTextureBlitterPrivate::buildProgram(ProgramIndex idx, const char *vs, const char *fs)
+{
+ Program *p = &programs[idx];
+
+ p->glProgram.reset(new QOpenGLShaderProgram);
+
+ p->glProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vs);
+ p->glProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fs);
+ p->glProgram->link();
+ if (!p->glProgram->isLinked()) {
+ qWarning() << "Could not link shader program:\n" << p->glProgram->log();
+ return false;
+ }
+
+ p->glProgram->bind();
+
+ p->vertexCoordAttribPos = p->glProgram->attributeLocation("vertexCoord");
+ p->vertexTransformUniformPos = p->glProgram->uniformLocation("vertexTransform");
+ p->textureCoordAttribPos = p->glProgram->attributeLocation("textureCoord");
+ p->textureTransformUniformPos = p->glProgram->uniformLocation("textureTransform");
+ p->swizzleUniformPos = p->glProgram->uniformLocation("swizzle");
+ p->opacityUniformPos = p->glProgram->uniformLocation("opacity");
+
+ p->glProgram->setUniformValue(p->swizzleUniformPos, false);
+
+ // minmize state left set after a create()
+ p->glProgram->release();
+
+ return true;
+}
+
+/*!
+ Constructs a new QOpenGLTextureBlitter instance.
+
+ \note no graphics resources are initialized in the
+ constructor. This makes it safe to place plain
+ QOpenGLTextureBlitter members into classes because the actual
+ initialization that depends on the OpenGL context happens only in
+ create().
+ */
+QOpenGLTextureBlitter::QOpenGLTextureBlitter()
+ : d_ptr(new QOpenGLTextureBlitterPrivate)
+{
+}
+
+/*!
+ Destructs the instance.
+
+ \note When the OpenGL context - or a context sharing resources
+ with it - that was current when calling create() is not current,
+ graphics resources will not be released. Therefore, it is
+ recommended to call destroy() manually instead of relying on the
+ destructor to perform OpenGL resource cleanup.
+ */
+QOpenGLTextureBlitter::~QOpenGLTextureBlitter()
+{
+ destroy();
+}
+
+/*!
+ Initializes the graphics resources used by the blitter.
+
+ \return \c true if successful, \c false if there was a
+ failure. Failures can occur when there is no OpenGL context
+ current on the current thread, or when shader compilation fails
+ for some reason.
+
+ \sa isCreated(), destroy()
+ */
+bool QOpenGLTextureBlitter::create()
+{
+ QOpenGLContext *currentContext = QOpenGLContext::currentContext();
+ if (!currentContext)
+ return false;
+
+ Q_D(QOpenGLTextureBlitter);
+
+ if (d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram)
+ return true;
+
+ QSurfaceFormat format = currentContext->format();
+ if (format.profile() == QSurfaceFormat::CoreProfile && format.version() >= qMakePair(3,2)) {
+ if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_2D, vertex_shader150, fragment_shader150))
+ return false;
+ } else {
+ if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_2D, vertex_shader, fragment_shader))
+ return false;
+ if (supportsExternalOESTarget())
+ if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES, vertex_shader, fragment_shader_external_oes))
+ return false;
+ }
+
+ // Create and bind the VAO, if supported.
+ QOpenGLVertexArrayObject::Binder vaoBinder(d->vao.data());
+
+ d->vertexBuffer.create();
+ d->vertexBuffer.bind();
+ d->vertexBuffer.allocate(vertex_buffer_data, sizeof(vertex_buffer_data));
+ d->vertexBuffer.release();
+
+ d->textureBuffer.create();
+ d->textureBuffer.bind();
+ d->textureBuffer.allocate(texture_buffer_data, sizeof(texture_buffer_data));
+ d->textureBuffer.release();
+
+ return true;
+}
+
+/*!
+ \return \c true if create() was called and succeeded. \c false otherwise.
+
+ \sa create(), destroy()
+ */
+bool QOpenGLTextureBlitter::isCreated() const
+{
+ Q_D(const QOpenGLTextureBlitter);
+ return d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram;
+}
+
+/*!
+ Frees all graphics resources held by the blitter. Assumes that
+ the OpenGL context, or another context sharing resources with it,
+ that was current on the thread when invoking create() is current.
+
+ The function has no effect when the blitter is not in created state.
+
+ \sa create()
+ */
+void QOpenGLTextureBlitter::destroy()
+{
+ if (!isCreated())
+ return;
+ Q_D(QOpenGLTextureBlitter);
+ d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram.reset();
+ d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES].glProgram.reset();
+ d->vertexBuffer.destroy();
+ d->textureBuffer.destroy();
+ d->vao.reset();
+}
+
+/*!
+ \return \c true when bind() accepts \c GL_TEXTURE_EXTERNAL_OES as
+ its target argument.
+
+ \sa bind(), blit()
+ */
+bool QOpenGLTextureBlitter::supportsExternalOESTarget() const
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ return ctx && ctx->isOpenGLES() && ctx->hasExtension("GL_OES_EGL_image_external");
+}
+
+/*!
+ Binds the graphics resources used by the blitter. This must be
+ called before calling blit(). Code modifying the OpenGL state
+ should be avoided between the call to bind() and blit() because
+ otherwise conflicts may arise.
+
+ \a target is the texture target for the source texture and must be
+ either \c GL_TEXTURE_2D or \c GL_OES_EGL_image_external.
+
+ \sa release(), blit()
+ */
+void QOpenGLTextureBlitter::bind(GLenum target)
+{
+ Q_D(QOpenGLTextureBlitter);
+
+ if (d->vao->isCreated())
+ d->vao->bind();
+
+ d->currentTarget = target;
+ QOpenGLTextureBlitterPrivate::Program *p = &d->programs[targetToProgramIndex(target)];
+ p->glProgram->bind();
+
+ d->vertexBuffer.bind();
+ p->glProgram->setAttributeBuffer(p->vertexCoordAttribPos, GL_FLOAT, 0, 3, 0);
+ p->glProgram->enableAttributeArray(p->vertexCoordAttribPos);
+ d->vertexBuffer.release();
+
+ d->textureBuffer.bind();
+ p->glProgram->setAttributeBuffer(p->textureCoordAttribPos, GL_FLOAT, 0, 2, 0);
+ p->glProgram->enableAttributeArray(p->textureCoordAttribPos);
+ d->textureBuffer.release();
+}
+
+/*!
+ Unbinds the graphics resources used by the blitter.
+
+ \sa bind()
+ */
+void QOpenGLTextureBlitter::release()
+{
+ Q_D(QOpenGLTextureBlitter);
+ d->programs[targetToProgramIndex(d->currentTarget)].glProgram->release();
+ if (d->vao->isCreated())
+ d->vao->release();
+}
+
+/*!
+ Sets whether swizzling is enabled for the red and blue color channels to
+ \a swizzle. An BGRA to RGBA conversion (occurring in the shader on
+ the GPU, instead of a slow CPU-side transformation) can be useful
+ when the source texture contains data from a QImage with a format
+ like QImage::Format_ARGB32 which maps to BGRA on little endian
+ systems.
+
+ By default the red-blue swizzle is disabled since this is what a
+ texture attached to an framebuffer object or a texture based on a
+ byte ordered QImage format (like QImage::Format_RGBA8888) needs.
+ */
+void QOpenGLTextureBlitter::setRedBlueSwizzle(bool swizzle)
+{
+ Q_D(QOpenGLTextureBlitter);
+ d->swizzle = swizzle;
+}
+
+/*!
+ Changes the opacity to \a opacity. The default opacity is 1.0.
+
+ \note the blitter does not alter the blend state. It is up to the
+ caller of blit() to ensure the correct blend settings are active.
+
+ */
+void QOpenGLTextureBlitter::setOpacity(float opacity)
+{
+ Q_D(QOpenGLTextureBlitter);
+ d->opacity = opacity;
+}
+
+/*!
+ \enum QOpenGLTextureBlitter::Origin
+
+ \value OriginBottomLeft Indicates that the data in the texture
+ follows the OpenGL convention of coordinate systems, meaning Y is
+ running from bottom to top.
+
+ \value OriginTopLeft Indicates that the data in the texture has Y
+ running from top to bottom, which is typical with regular,
+ unflipped image data.
+
+ \sa blit()
+ */
+
+/*!
+ Performs the blit with the source texture \a texture.
+
+ \a targetTransform specifies the transformation applied. This is
+ usually generated by the targetTransform() helper function.
+
+ \a sourceOrigin specifies if the image data needs flipping. When
+ \a texture corresponds to a texture attached to an FBO pass
+ OriginBottomLeft. On the other hand, when \a texture is based on
+ unflipped image data, pass OriginTopLeft. This is more efficient
+ than using QImage::mirrored().
+
+ \sa targetTransform(), Origin, bind()
+ */
+void QOpenGLTextureBlitter::blit(GLuint texture,
+ const QMatrix4x4 &targetTransform,
+ Origin sourceOrigin)
+{
+ Q_D(QOpenGLTextureBlitter);
+ d->blit(texture,targetTransform, sourceOrigin);
+}
+
+/*!
+ Performs the blit with the source texture \a texture.
+
+ \a targetTransform specifies the transformation applied. This is
+ usually generated by the targetTransform() helper function.
+
+ \a sourceTransform specifies the transformation applied to the
+ source. This allows using only a sub-rect of the source
+ texture. This is usually generated by the sourceTransform() helper
+ function.
+
+ \sa sourceTransform(), targetTransform(), Origin, bind()
+ */
+void QOpenGLTextureBlitter::blit(GLuint texture,
+ const QMatrix4x4 &targetTransform,
+ const QMatrix3x3 &sourceTransform)
+{
+ Q_D(QOpenGLTextureBlitter);
+ d->blit(texture, targetTransform, sourceTransform);
+}
+
+/*!
+ Calculates a target transform suitable for blit().
+
+ \a target is the target rectangle in pixels. \a viewport describes
+ the source dimensions and will in most cases be set to (0, 0,
+ image width, image height).
+
+ For unscaled output the size of \a target and \a viewport should
+ match.
+
+ \sa blit()
+ */
+QMatrix4x4 QOpenGLTextureBlitter::targetTransform(const QRectF &target,
+ const QRect &viewport)
+{
+ qreal x_scale = target.width() / viewport.width();
+ qreal y_scale = target.height() / viewport.height();
+
+ const QPointF relative_to_viewport = target.topLeft() - viewport.topLeft();
+ qreal x_translate = x_scale - 1 + ((relative_to_viewport.x() / viewport.width()) * 2);
+ qreal y_translate = -y_scale + 1 - ((relative_to_viewport.y() / viewport.height()) * 2);
+
+ QMatrix4x4 matrix;
+ matrix(0,3) = x_translate;
+ matrix(1,3) = y_translate;
+
+ matrix(0,0) = x_scale;
+ matrix(1,1) = y_scale;
+
+ return matrix;
+}
+
+/*!
+ Calculates a 3x3 matrix suitable as the input to blit(). This is
+ used when only a part of the texture is to be used in the blit.
+
+ \a subTexture is the desired source rectangle in pixels, \a
+ textureSize is the full width and height of the texture data. \a
+ origin specifies the orientation of the image data when it comes
+ to the Y axis.
+
+ \sa blit(), Origin
+ */
+QMatrix3x3 QOpenGLTextureBlitter::sourceTransform(const QRectF &subTexture,
+ const QSize &textureSize,
+ Origin origin)
+{
+ qreal x_scale = subTexture.width() / textureSize.width();
+ qreal y_scale = subTexture.height() / textureSize.height();
+
+ const QPointF topLeft = subTexture.topLeft();
+ qreal x_translate = topLeft.x() / textureSize.width();
+ qreal y_translate = topLeft.y() / textureSize.height();
+
+ if (origin == OriginTopLeft) {
+ y_scale = -y_scale;
+ y_translate = 1 - y_translate;
+ }
+
+ QMatrix3x3 matrix;
+ matrix(0,2) = x_translate;
+ matrix(1,2) = y_translate;
+
+ matrix(0,0) = x_scale;
+ matrix(1,1) = y_scale;
+
+ return matrix;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopengltextureblitter.h b/src/opengl/qopengltextureblitter.h
new file mode 100644
index 0000000000..1818576085
--- /dev/null
+++ b/src/opengl/qopengltextureblitter.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLTEXTUREBLITTER_H
+#define QOPENGLTEXTUREBLITTER_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#include <QtGui/qopengl.h>
+#include <QtGui/QMatrix3x3>
+#include <QtGui/QMatrix4x4>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLTextureBlitterPrivate;
+
+class Q_OPENGL_EXPORT QOpenGLTextureBlitter
+{
+public:
+ QOpenGLTextureBlitter();
+ ~QOpenGLTextureBlitter();
+
+ enum Origin {
+ OriginBottomLeft,
+ OriginTopLeft
+ };
+
+ bool create();
+ bool isCreated() const;
+ void destroy();
+
+ bool supportsExternalOESTarget() const;
+
+ void bind(GLenum target = GL_TEXTURE_2D);
+ void release();
+
+ void setRedBlueSwizzle(bool swizzle);
+ void setOpacity(float opacity);
+
+ void blit(GLuint texture, const QMatrix4x4 &targetTransform, Origin sourceOrigin);
+ void blit(GLuint texture, const QMatrix4x4 &targetTransform, const QMatrix3x3 &sourceTransform);
+
+ static QMatrix4x4 targetTransform(const QRectF &target, const QRect &viewport);
+ static QMatrix3x3 sourceTransform(const QRectF &subTexture, const QSize &textureSize, Origin origin);
+
+private:
+ Q_DISABLE_COPY(QOpenGLTextureBlitter)
+ Q_DECLARE_PRIVATE(QOpenGLTextureBlitter)
+ QScopedPointer<QOpenGLTextureBlitterPrivate> d_ptr;
+};
+
+QT_END_NAMESPACE
+
+#endif //QOPENGLTEXTUREBLITTER_H
diff --git a/src/opengl/qopengltexturecache.cpp b/src/opengl/qopengltexturecache.cpp
new file mode 100644
index 0000000000..5256c429e0
--- /dev/null
+++ b/src/opengl/qopengltexturecache.cpp
@@ -0,0 +1,198 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopengltexturecache_p.h"
+#include <private/qopengltextureuploader_p.h>
+#include <qmath.h>
+#include <qopenglfunctions.h>
+#include <private/qimagepixmapcleanuphooks_p.h>
+#include <qpa/qplatformpixmap.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLTextureCacheWrapper
+{
+public:
+ QOpenGLTextureCacheWrapper()
+ {
+ QImagePixmapCleanupHooks::instance()->addPlatformPixmapModificationHook(cleanupTexturesForPixmapData);
+ QImagePixmapCleanupHooks::instance()->addPlatformPixmapDestructionHook(cleanupTexturesForPixmapData);
+ QImagePixmapCleanupHooks::instance()->addImageHook(cleanupTexturesForCacheKey);
+ }
+
+ ~QOpenGLTextureCacheWrapper()
+ {
+ QImagePixmapCleanupHooks::instance()->removePlatformPixmapModificationHook(cleanupTexturesForPixmapData);
+ QImagePixmapCleanupHooks::instance()->removePlatformPixmapDestructionHook(cleanupTexturesForPixmapData);
+ QImagePixmapCleanupHooks::instance()->removeImageHook(cleanupTexturesForCacheKey);
+ }
+
+ QOpenGLTextureCache *cacheForContext(QOpenGLContext *context) {
+ QMutexLocker lock(&m_mutex);
+ return m_resource.value<QOpenGLTextureCache>(context);
+ }
+
+ static void cleanupTexturesForCacheKey(qint64 key);
+ static void cleanupTexturesForPixmapData(QPlatformPixmap *pmd);
+
+private:
+ QOpenGLMultiGroupSharedResource m_resource;
+ QMutex m_mutex;
+};
+
+Q_GLOBAL_STATIC(QOpenGLTextureCacheWrapper, qt_texture_caches)
+
+QOpenGLTextureCache *QOpenGLTextureCache::cacheForContext(QOpenGLContext *context)
+{
+ return qt_texture_caches()->cacheForContext(context);
+}
+
+void QOpenGLTextureCacheWrapper::cleanupTexturesForCacheKey(qint64 key)
+{
+ QList<QOpenGLSharedResource *> resources = qt_texture_caches()->m_resource.resources();
+ for (QList<QOpenGLSharedResource *>::iterator it = resources.begin(); it != resources.end(); ++it)
+ static_cast<QOpenGLTextureCache *>(*it)->invalidate(key);
+}
+
+void QOpenGLTextureCacheWrapper::cleanupTexturesForPixmapData(QPlatformPixmap *pmd)
+{
+ cleanupTexturesForCacheKey(pmd->cacheKey());
+}
+
+QOpenGLTextureCache::QOpenGLTextureCache(QOpenGLContext *ctx)
+ : QOpenGLSharedResource(ctx->shareGroup())
+ , m_cache(256 * 1024) // 256 MB cache
+{
+}
+
+QOpenGLTextureCache::~QOpenGLTextureCache()
+{
+}
+
+GLuint QOpenGLTextureCache::bindTexture(QOpenGLContext *context, const QPixmap &pixmap, QOpenGLTextureUploader::BindOptions options)
+{
+ if (pixmap.isNull())
+ return 0;
+ QMutexLocker locker(&m_mutex);
+ qint64 key = pixmap.cacheKey();
+
+ // A QPainter is active on the image - take the safe route and replace the texture.
+ if (!pixmap.paintingActive()) {
+ QOpenGLCachedTexture *entry = m_cache.object(key);
+ if (entry && entry->options() == options) {
+ context->functions()->glBindTexture(GL_TEXTURE_2D, entry->id());
+ return entry->id();
+ }
+ }
+
+ GLuint id = bindTexture(context, key, pixmap.toImage(), options);
+ if (id > 0)
+ QImagePixmapCleanupHooks::enableCleanupHooks(pixmap);
+
+ return id;
+}
+
+GLuint QOpenGLTextureCache::bindTexture(QOpenGLContext *context, const QImage &image, QOpenGLTextureUploader::BindOptions options)
+{
+ if (image.isNull())
+ return 0;
+ QMutexLocker locker(&m_mutex);
+ qint64 key = image.cacheKey();
+
+ // A QPainter is active on the image - take the safe route and replace the texture.
+ if (!image.paintingActive()) {
+ QOpenGLCachedTexture *entry = m_cache.object(key);
+ if (entry && entry->options() == options) {
+ context->functions()->glBindTexture(GL_TEXTURE_2D, entry->id());
+ return entry->id();
+ }
+ }
+
+ QImage img = image;
+ if (!context->functions()->hasOpenGLFeature(QOpenGLFunctions::NPOTTextures))
+ options |= QOpenGLTextureUploader::PowerOfTwoBindOption;
+
+ GLuint id = bindTexture(context, key, img, options);
+ if (id > 0)
+ QImagePixmapCleanupHooks::enableCleanupHooks(image);
+
+ return id;
+}
+
+GLuint QOpenGLTextureCache::bindTexture(QOpenGLContext *context, qint64 key, const QImage &image, QOpenGLTextureUploader::BindOptions options)
+{
+ GLuint id;
+ QOpenGLFunctions *funcs = context->functions();
+ funcs->glGenTextures(1, &id);
+ funcs->glBindTexture(GL_TEXTURE_2D, id);
+
+ int cost = QOpenGLTextureUploader::textureImage(GL_TEXTURE_2D, image, options);
+
+ m_cache.insert(key, new QOpenGLCachedTexture(id, options, context), cost / 1024);
+
+ return id;
+}
+
+void QOpenGLTextureCache::invalidate(qint64 key)
+{
+ QMutexLocker locker(&m_mutex);
+ m_cache.remove(key);
+}
+
+void QOpenGLTextureCache::invalidateResource()
+{
+ m_cache.clear();
+}
+
+void QOpenGLTextureCache::freeResource(QOpenGLContext *)
+{
+ Q_ASSERT(false); // the texture cache lives until the context group disappears
+}
+
+static void freeTexture(QOpenGLFunctions *funcs, GLuint id)
+{
+ funcs->glDeleteTextures(1, &id);
+}
+
+QOpenGLCachedTexture::QOpenGLCachedTexture(GLuint id, QOpenGLTextureUploader::BindOptions options, QOpenGLContext *context) : m_options(options)
+{
+ m_resource = new QOpenGLSharedResourceGuard(context, id, freeTexture);
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopengltexturecache_p.h b/src/opengl/qopengltexturecache_p.h
new file mode 100644
index 0000000000..14e03ebea1
--- /dev/null
+++ b/src/opengl/qopengltexturecache_p.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QOPENGLTEXTURECACHE_P_H
+#define QOPENGLTEXTURECACHE_P_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+#include <QHash>
+#include <QObject>
+#include <QCache>
+#include <private/qopenglcontext_p.h>
+#include <private/qopengltextureuploader_p.h>
+#include <QtCore/qmutex.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLCachedTexture;
+
+class Q_OPENGL_EXPORT QOpenGLTextureCache : public QOpenGLSharedResource
+{
+public:
+ static QOpenGLTextureCache *cacheForContext(QOpenGLContext *context);
+
+ QOpenGLTextureCache(QOpenGLContext *);
+ ~QOpenGLTextureCache();
+
+ GLuint bindTexture(QOpenGLContext *context, const QPixmap &pixmap,
+ QOpenGLTextureUploader::BindOptions options = QOpenGLTextureUploader::PremultipliedAlphaBindOption);
+ GLuint bindTexture(QOpenGLContext *context, const QImage &image,
+ QOpenGLTextureUploader::BindOptions options = QOpenGLTextureUploader::PremultipliedAlphaBindOption);
+
+ void invalidate(qint64 key);
+
+ void invalidateResource() override;
+ void freeResource(QOpenGLContext *ctx) override;
+
+private:
+ GLuint bindTexture(QOpenGLContext *context, qint64 key, const QImage &image, QOpenGLTextureUploader::BindOptions options);
+
+ QMutex m_mutex;
+ QCache<quint64, QOpenGLCachedTexture> m_cache;
+};
+
+class QOpenGLCachedTexture
+{
+public:
+ QOpenGLCachedTexture(GLuint id, QOpenGLTextureUploader::BindOptions options, QOpenGLContext *context);
+ ~QOpenGLCachedTexture() { m_resource->free(); }
+
+ GLuint id() const { return m_resource->id(); }
+ QOpenGLTextureUploader::BindOptions options() const { return m_options; }
+
+private:
+ QOpenGLSharedResourceGuard *m_resource;
+ QOpenGLTextureUploader::BindOptions m_options;
+};
+
+QT_END_NAMESPACE
+
+#endif
+
diff --git a/src/opengl/qopengltextureglyphcache.cpp b/src/opengl/qopengltextureglyphcache.cpp
new file mode 100644
index 0000000000..a38d4328cc
--- /dev/null
+++ b/src/opengl/qopengltextureglyphcache.cpp
@@ -0,0 +1,485 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopengltextureglyphcache_p.h"
+#include <private/qopenglpaintengine_p.h>
+#include "private/qopenglengineshadersource_p.h"
+#include <private/qopenglextensions_p.h>
+#include <qrgb.h>
+#include <private/qdrawhelper_p.h>
+
+QT_BEGIN_NAMESPACE
+
+
+static int next_qopengltextureglyphcache_serial_number()
+{
+ static QBasicAtomicInt serial = Q_BASIC_ATOMIC_INITIALIZER(0);
+ return 1 + serial.fetchAndAddRelaxed(1);
+}
+
+QOpenGLTextureGlyphCache::QOpenGLTextureGlyphCache(QFontEngine::GlyphFormat format, const QTransform &matrix, const QColor &color)
+ : QImageTextureGlyphCache(format, matrix, color)
+ , m_textureResource(nullptr)
+ , pex(nullptr)
+ , m_blitProgram(nullptr)
+ , m_filterMode(Nearest)
+ , m_serialNumber(next_qopengltextureglyphcache_serial_number())
+ , m_buffer(QOpenGLBuffer::VertexBuffer)
+{
+#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
+ qDebug(" -> QOpenGLTextureGlyphCache() %p for context %p.", this, QOpenGLContext::currentContext());
+#endif
+ m_vertexCoordinateArray[0] = -1.0f;
+ m_vertexCoordinateArray[1] = -1.0f;
+ m_vertexCoordinateArray[2] = 1.0f;
+ m_vertexCoordinateArray[3] = -1.0f;
+ m_vertexCoordinateArray[4] = 1.0f;
+ m_vertexCoordinateArray[5] = 1.0f;
+ m_vertexCoordinateArray[6] = -1.0f;
+ m_vertexCoordinateArray[7] = 1.0f;
+
+ m_textureCoordinateArray[0] = 0.0f;
+ m_textureCoordinateArray[1] = 0.0f;
+ m_textureCoordinateArray[2] = 1.0f;
+ m_textureCoordinateArray[3] = 0.0f;
+ m_textureCoordinateArray[4] = 1.0f;
+ m_textureCoordinateArray[5] = 1.0f;
+ m_textureCoordinateArray[6] = 0.0f;
+ m_textureCoordinateArray[7] = 1.0f;
+}
+
+QOpenGLTextureGlyphCache::~QOpenGLTextureGlyphCache()
+{
+#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
+ qDebug(" -> ~QOpenGLTextureGlyphCache() %p.", this);
+#endif
+ clear();
+}
+
+#if !QT_CONFIG(opengles2)
+static inline bool isCoreProfile()
+{
+ return QOpenGLContext::currentContext()->format().profile() == QSurfaceFormat::CoreProfile;
+}
+#endif
+
+void QOpenGLTextureGlyphCache::createTextureData(int width, int height)
+{
+ QOpenGLContext *ctx = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
+ if (ctx == nullptr) {
+ qWarning("QOpenGLTextureGlyphCache::createTextureData: Called with no context");
+ return;
+ }
+
+ // create in QImageTextureGlyphCache baseclass is meant to be called
+ // only to create the initial image and does not preserve the content,
+ // so we don't call when this function is called from resize.
+ if (ctx->d_func()->workaround_brokenFBOReadBack && image().isNull())
+ QImageTextureGlyphCache::createTextureData(width, height);
+
+ // Make the lower glyph texture size 16 x 16.
+ if (width < 16)
+ width = 16;
+ if (height < 16)
+ height = 16;
+
+ if (m_textureResource && !m_textureResource->m_texture) {
+ delete m_textureResource;
+ m_textureResource = nullptr;
+ }
+
+ if (!m_textureResource)
+ m_textureResource = new QOpenGLGlyphTexture(ctx);
+
+ QOpenGLFunctions *funcs = ctx->functions();
+ funcs->glGenTextures(1, &m_textureResource->m_texture);
+ funcs->glBindTexture(GL_TEXTURE_2D, m_textureResource->m_texture);
+
+ m_textureResource->m_width = width;
+ m_textureResource->m_height = height;
+
+ if (m_format == QFontEngine::Format_A32 || m_format == QFontEngine::Format_ARGB) {
+ QVarLengthArray<uchar> data(width * height * 4);
+ for (int i = 0; i < data.size(); ++i)
+ data[i] = 0;
+ funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);
+ } else {
+ QVarLengthArray<uchar> data(width * height);
+ for (int i = 0; i < data.size(); ++i)
+ data[i] = 0;
+#if !QT_CONFIG(opengles2)
+ const GLint internalFormat = isCoreProfile() ? GL_R8 : GL_ALPHA;
+ const GLenum format = isCoreProfile() ? GL_RED : GL_ALPHA;
+#else
+ const GLint internalFormat = GL_ALPHA;
+ const GLenum format = GL_ALPHA;
+#endif
+ funcs->glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, GL_UNSIGNED_BYTE, &data[0]);
+ }
+
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ m_filterMode = Nearest;
+
+ if (!m_buffer.isCreated()) {
+ m_buffer.create();
+ m_buffer.bind();
+ static GLfloat buf[sizeof(m_vertexCoordinateArray) + sizeof(m_textureCoordinateArray)];
+ memcpy(buf, m_vertexCoordinateArray, sizeof(m_vertexCoordinateArray));
+ memcpy(buf + (sizeof(m_vertexCoordinateArray) / sizeof(GLfloat)),
+ m_textureCoordinateArray,
+ sizeof(m_textureCoordinateArray));
+ m_buffer.allocate(buf, sizeof(buf));
+ m_buffer.release();
+ }
+
+ if (!m_vao.isCreated())
+ m_vao.create();
+}
+
+void QOpenGLTextureGlyphCache::setupVertexAttribs()
+{
+ m_buffer.bind();
+ m_blitProgram->setAttributeBuffer(int(QT_VERTEX_COORDS_ATTR), GL_FLOAT, 0, 2);
+ m_blitProgram->setAttributeBuffer(int(QT_TEXTURE_COORDS_ATTR), GL_FLOAT, sizeof(m_vertexCoordinateArray), 2);
+ m_blitProgram->enableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
+ m_blitProgram->enableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
+ m_buffer.release();
+}
+
+static void load_glyph_image_to_texture(QOpenGLContext *ctx,
+ QImage &img,
+ GLuint texture,
+ int tx, int ty)
+{
+ QOpenGLFunctions *funcs = ctx->functions();
+
+ const int imgWidth = img.width();
+ const int imgHeight = img.height();
+
+ if (img.format() == QImage::Format_Mono) {
+ img = img.convertToFormat(QImage::Format_Grayscale8);
+ } else if (img.depth() == 32) {
+ if (img.format() == QImage::Format_RGB32
+ // We need to make the alpha component equal to the average of the RGB values.
+ // This is needed when drawing sub-pixel antialiased text on translucent targets.
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ || img.format() == QImage::Format_ARGB32_Premultiplied
+#else
+ || (img.format() == QImage::Format_ARGB32_Premultiplied
+ && ctx->isOpenGLES())
+#endif
+ ) {
+ for (int y = 0; y < imgHeight; ++y) {
+ QRgb *src = (QRgb *) img.scanLine(y);
+ for (int x = 0; x < imgWidth; ++x) {
+ int r = qRed(src[x]);
+ int g = qGreen(src[x]);
+ int b = qBlue(src[x]);
+ int avg;
+ if (img.format() == QImage::Format_RGB32)
+ avg = (r + g + b + 1) / 3; // "+1" for rounding.
+ else // Format_ARGB_Premultiplied
+ avg = qAlpha(src[x]);
+
+ src[x] = qRgba(r, g, b, avg);
+ // swizzle the bits to accommodate for the GL_RGBA upload.
+#if Q_BYTE_ORDER != Q_BIG_ENDIAN
+ if (ctx->isOpenGLES())
+#endif
+ src[x] = ARGB2RGBA(src[x]);
+ }
+ }
+ }
+ }
+
+ funcs->glBindTexture(GL_TEXTURE_2D, texture);
+ if (img.depth() == 32) {
+#if QT_CONFIG(opengles2)
+ GLenum fmt = GL_RGBA;
+#else
+ GLenum fmt = ctx->isOpenGLES() ? GL_RGBA : GL_BGRA;
+#endif // QT_CONFIG(opengles2)
+
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ fmt = GL_RGBA;
+#endif
+ funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, tx, ty, imgWidth, imgHeight, fmt, GL_UNSIGNED_BYTE, img.constBits());
+ } else {
+ // The scanlines in image are 32-bit aligned, even for mono or 8-bit formats. This
+ // is good because it matches the default of 4 bytes for GL_UNPACK_ALIGNMENT.
+#if !QT_CONFIG(opengles2)
+ const GLenum format = isCoreProfile() ? GL_RED : GL_ALPHA;
+#else
+ const GLenum format = GL_ALPHA;
+#endif
+ funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, tx, ty, imgWidth, imgHeight, format, GL_UNSIGNED_BYTE, img.constBits());
+ }
+}
+
+static void load_glyph_image_region_to_texture(QOpenGLContext *ctx,
+ const QImage &srcImg,
+ int x, int y,
+ int w, int h,
+ GLuint texture,
+ int tx, int ty)
+{
+ Q_ASSERT(x + w <= srcImg.width() && y + h <= srcImg.height());
+
+ QImage img;
+ if (x != 0 || y != 0 || w != srcImg.width() || h != srcImg.height())
+ img = srcImg.copy(x, y, w, h);
+ else
+ img = srcImg;
+
+ load_glyph_image_to_texture(ctx, img, texture, tx, ty);
+}
+
+void QOpenGLTextureGlyphCache::resizeTextureData(int width, int height)
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (ctx == nullptr) {
+ qWarning("QOpenGLTextureGlyphCache::resizeTextureData: Called with no context");
+ return;
+ }
+
+ QOpenGLFunctions *funcs = ctx->functions();
+ GLint oldFbo;
+ funcs->glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFbo);
+
+ int oldWidth = m_textureResource->m_width;
+ int oldHeight = m_textureResource->m_height;
+
+ // Make the lower glyph texture size 16 x 16.
+ if (width < 16)
+ width = 16;
+ if (height < 16)
+ height = 16;
+
+ GLuint oldTexture = m_textureResource->m_texture;
+ createTextureData(width, height);
+
+ if (ctx->d_func()->workaround_brokenFBOReadBack) {
+ QImageTextureGlyphCache::resizeTextureData(width, height);
+ load_glyph_image_region_to_texture(ctx, image(), 0, 0, qMin(oldWidth, width), qMin(oldHeight, height),
+ m_textureResource->m_texture, 0, 0);
+ return;
+ }
+
+ // ### the QTextureGlyphCache API needs to be reworked to allow
+ // ### resizeTextureData to fail
+
+ funcs->glBindFramebuffer(GL_FRAMEBUFFER, m_textureResource->m_fbo);
+
+ GLuint tmp_texture;
+ funcs->glGenTextures(1, &tmp_texture);
+ funcs->glBindTexture(GL_TEXTURE_2D, tmp_texture);
+ funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, oldWidth, oldHeight, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ m_filterMode = Nearest;
+ funcs->glBindTexture(GL_TEXTURE_2D, 0);
+ funcs->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ GL_TEXTURE_2D, tmp_texture, 0);
+
+ funcs->glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
+ funcs->glBindTexture(GL_TEXTURE_2D, oldTexture);
+
+ if (pex != nullptr)
+ pex->transferMode(BrushDrawingMode);
+
+ funcs->glDisable(GL_STENCIL_TEST);
+ funcs->glDisable(GL_DEPTH_TEST);
+ funcs->glDisable(GL_SCISSOR_TEST);
+ funcs->glDisable(GL_BLEND);
+
+ funcs->glViewport(0, 0, oldWidth, oldHeight);
+
+ QOpenGLShaderProgram *blitProgram = nullptr;
+ if (pex == nullptr) {
+ if (m_blitProgram == nullptr) {
+ m_blitProgram = new QOpenGLShaderProgram;
+ const bool isCoreProfile = ctx->format().profile() == QSurfaceFormat::CoreProfile;
+
+ {
+ QString source;
+#ifdef Q_OS_WASM
+ source.append(QLatin1String(isCoreProfile ? qopenglslUntransformedPositionVertexShader_core : qopenglslUntransformedPositionVertexShader));
+ source.append(QLatin1String(isCoreProfile ? qopenglslMainWithTexCoordsVertexShader_core : qopenglslMainWithTexCoordsVertexShader));
+#else
+ source.append(QLatin1String(isCoreProfile ? qopenglslMainWithTexCoordsVertexShader_core : qopenglslMainWithTexCoordsVertexShader));
+ source.append(QLatin1String(isCoreProfile ? qopenglslUntransformedPositionVertexShader_core : qopenglslUntransformedPositionVertexShader));
+#endif
+ m_blitProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, source);
+ }
+
+ {
+ QString source;
+#ifdef Q_OS_WASM
+ source.append(QLatin1String(isCoreProfile ? qopenglslImageSrcFragmentShader_core : qopenglslImageSrcFragmentShader));
+ source.append(QLatin1String(isCoreProfile ? qopenglslMainFragmentShader_core : qopenglslMainFragmentShader));
+#else
+ source.append(QLatin1String(isCoreProfile ? qopenglslMainFragmentShader_core : qopenglslMainFragmentShader));
+ source.append(QLatin1String(isCoreProfile ? qopenglslImageSrcFragmentShader_core : qopenglslImageSrcFragmentShader));
+#endif
+ m_blitProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, source);
+ }
+
+ m_blitProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+ m_blitProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
+
+ m_blitProgram->link();
+
+ if (m_vao.isCreated()) {
+ m_vao.bind();
+ setupVertexAttribs();
+ }
+ }
+
+ if (m_vao.isCreated())
+ m_vao.bind();
+ else
+ setupVertexAttribs();
+
+ m_blitProgram->bind();
+ blitProgram = m_blitProgram;
+
+ } else {
+ pex->uploadData(QT_VERTEX_COORDS_ATTR, m_vertexCoordinateArray, 8);
+ pex->uploadData(QT_TEXTURE_COORDS_ATTR, m_textureCoordinateArray, 8);
+
+ pex->shaderManager->useBlitProgram();
+ blitProgram = pex->shaderManager->blitProgram();
+ }
+
+ blitProgram->setUniformValue("imageTexture", QT_IMAGE_TEXTURE_UNIT);
+
+ funcs->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+ funcs->glBindTexture(GL_TEXTURE_2D, m_textureResource->m_texture);
+
+ funcs->glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, oldWidth, oldHeight);
+
+ funcs->glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ GL_RENDERBUFFER, 0);
+ funcs->glDeleteTextures(1, &tmp_texture);
+ funcs->glDeleteTextures(1, &oldTexture);
+
+ funcs->glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)oldFbo);
+
+ if (pex != nullptr) {
+ funcs->glViewport(0, 0, pex->width, pex->height);
+ pex->updateClipScissorTest();
+ } else {
+ if (m_vao.isCreated()) {
+ m_vao.release();
+ } else {
+ m_blitProgram->disableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
+ m_blitProgram->disableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
+ }
+ }
+}
+
+void QOpenGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed subPixelPosition)
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (ctx == nullptr) {
+ qWarning("QOpenGLTextureGlyphCache::fillTexture: Called with no context");
+ return;
+ }
+
+ if (ctx->d_func()->workaround_brokenFBOReadBack) {
+ QImageTextureGlyphCache::fillTexture(c, glyph, subPixelPosition);
+ load_glyph_image_region_to_texture(ctx, image(), c.x, c.y, c.w, c.h, m_textureResource->m_texture, c.x, c.y);
+ return;
+ }
+
+ QImage mask = textureMapForGlyph(glyph, subPixelPosition);
+ load_glyph_image_to_texture(ctx, mask, m_textureResource->m_texture, c.x, c.y);
+}
+
+int QOpenGLTextureGlyphCache::glyphPadding() const
+{
+ return 1;
+}
+
+int QOpenGLTextureGlyphCache::maxTextureWidth() const
+{
+ QOpenGLContext *ctx = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
+ if (ctx == nullptr)
+ return QImageTextureGlyphCache::maxTextureWidth();
+ else
+ return ctx->d_func()->maxTextureSize();
+}
+
+int QOpenGLTextureGlyphCache::maxTextureHeight() const
+{
+ QOpenGLContext *ctx = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
+ if (ctx == nullptr)
+ return QImageTextureGlyphCache::maxTextureHeight();
+
+ if (ctx->d_func()->workaround_brokenTexSubImage)
+ return qMin(1024, ctx->d_func()->maxTextureSize());
+ else
+ return ctx->d_func()->maxTextureSize();
+}
+
+void QOpenGLTextureGlyphCache::clear()
+{
+ if (m_textureResource)
+ m_textureResource->free();
+ m_textureResource = nullptr;
+
+ delete m_blitProgram;
+ m_blitProgram = nullptr;
+
+ m_w = 0;
+ m_h = 0;
+ m_cx = 0;
+ m_cy = 0;
+ m_currentRowHeight = 0;
+ coords.clear();
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopengltextureglyphcache_p.h b/src/opengl/qopengltextureglyphcache_p.h
new file mode 100644
index 0000000000..15ecd6209b
--- /dev/null
+++ b/src/opengl/qopengltextureglyphcache_p.h
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLTEXTUREGLYPHCACHE_P_H
+#define QOPENGLTEXTUREGLYPHCACHE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtOpenGL/qtopenglglobal.h>
+#include <private/qtextureglyphcache_p.h>
+#include <private/qopenglcontext_p.h>
+#include <qopenglshaderprogram.h>
+#include <qopenglfunctions.h>
+#include <qopenglbuffer.h>
+#include <qopenglvertexarrayobject.h>
+
+// #define QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGL2PaintEngineExPrivate;
+
+class QOpenGLGlyphTexture : public QOpenGLSharedResource
+{
+public:
+ explicit QOpenGLGlyphTexture(QOpenGLContext *ctx)
+ : QOpenGLSharedResource(ctx->shareGroup())
+ , m_width(0)
+ , m_height(0)
+ {
+ if (!ctx->d_func()->workaround_brokenFBOReadBack)
+ QOpenGLFunctions(ctx).glGenFramebuffers(1, &m_fbo);
+
+#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
+ qDebug(" -> QOpenGLGlyphTexture() %p for context %p.", this, ctx);
+#endif
+ }
+
+ void freeResource(QOpenGLContext *context) override
+ {
+ QOpenGLContext *ctx = context;
+#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
+ qDebug("~QOpenGLGlyphTexture() %p for context %p.", this, ctx);
+#endif
+ if (!ctx->d_func()->workaround_brokenFBOReadBack)
+ ctx->functions()->glDeleteFramebuffers(1, &m_fbo);
+ if (m_width || m_height)
+ ctx->functions()->glDeleteTextures(1, &m_texture);
+ }
+
+ void invalidateResource() override
+ {
+ m_texture = 0;
+ m_fbo = 0;
+ m_width = 0;
+ m_height = 0;
+ }
+
+ GLuint m_texture;
+ GLuint m_fbo;
+ int m_width;
+ int m_height;
+};
+
+class Q_OPENGL_EXPORT QOpenGLTextureGlyphCache : public QImageTextureGlyphCache
+{
+public:
+ QOpenGLTextureGlyphCache(QFontEngine::GlyphFormat glyphFormat, const QTransform &matrix, const QColor &color = QColor());
+ ~QOpenGLTextureGlyphCache();
+
+ virtual void createTextureData(int width, int height) override;
+ virtual void resizeTextureData(int width, int height) override;
+ virtual void fillTexture(const Coord &c, glyph_t glyph, QFixed subPixelPosition) override;
+ virtual int glyphPadding() const override;
+ virtual int maxTextureWidth() const override;
+ virtual int maxTextureHeight() const override;
+
+ inline GLuint texture() const {
+ QOpenGLTextureGlyphCache *that = const_cast<QOpenGLTextureGlyphCache *>(this);
+ QOpenGLGlyphTexture *glyphTexture = that->m_textureResource;
+ return glyphTexture ? glyphTexture->m_texture : 0;
+ }
+
+ inline int width() const {
+ QOpenGLTextureGlyphCache *that = const_cast<QOpenGLTextureGlyphCache *>(this);
+ QOpenGLGlyphTexture *glyphTexture = that->m_textureResource;
+ return glyphTexture ? glyphTexture->m_width : 0;
+ }
+ inline int height() const {
+ QOpenGLTextureGlyphCache *that = const_cast<QOpenGLTextureGlyphCache *>(this);
+ QOpenGLGlyphTexture *glyphTexture = that->m_textureResource;
+ return glyphTexture ? glyphTexture->m_height : 0;
+ }
+
+ inline void setPaintEnginePrivate(QOpenGL2PaintEngineExPrivate *p) { pex = p; }
+
+ inline const QOpenGLContextGroup *contextGroup() const { return m_textureResource ? m_textureResource->group() : nullptr; }
+
+ inline int serialNumber() const { return m_serialNumber; }
+
+ enum FilterMode {
+ Nearest,
+ Linear
+ };
+ FilterMode filterMode() const { return m_filterMode; }
+ void setFilterMode(FilterMode m) { m_filterMode = m; }
+
+ void clear();
+
+ QOpenGL2PaintEngineExPrivate *paintEnginePrivate() const
+ {
+ return pex;
+ }
+
+private:
+ void setupVertexAttribs();
+
+ QOpenGLGlyphTexture *m_textureResource;
+
+ QOpenGL2PaintEngineExPrivate *pex;
+ QOpenGLShaderProgram *m_blitProgram;
+ FilterMode m_filterMode;
+
+ GLfloat m_vertexCoordinateArray[8];
+ GLfloat m_textureCoordinateArray[8];
+
+ int m_serialNumber;
+
+ QOpenGLBuffer m_buffer;
+ QOpenGLVertexArrayObject m_vao;
+};
+
+QT_END_NAMESPACE
+
+#endif // QOPENGLTEXTUREGLYPHCACHE_P_H
+
diff --git a/src/opengl/qopengltexturehelper.cpp b/src/opengl/qopengltexturehelper.cpp
new file mode 100644
index 0000000000..9aab0bcc79
--- /dev/null
+++ b/src/opengl/qopengltexturehelper.cpp
@@ -0,0 +1,589 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopengltexturehelper_p.h"
+
+#include <QOpenGLContext>
+#include <private/qopenglextensions_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QOpenGLTextureHelper::QOpenGLTextureHelper(QOpenGLContext *context)
+{
+ functions = context->functions();
+ // Resolve EXT_direct_state_access entry points if present.
+
+ // However, disable it on some systems where DSA is known to be unreliable.
+ bool allowDSA = true;
+ const char *renderer = reinterpret_cast<const char *>(context->functions()->glGetString(GL_RENDERER));
+ // QTBUG-40653, QTBUG-44988
+ if (renderer && strstr(renderer, "AMD Radeon HD"))
+ allowDSA = false;
+
+ if (allowDSA && !context->isOpenGLES()
+ && context->hasExtension(QByteArrayLiteral("GL_EXT_direct_state_access"))) {
+ TextureParameteriEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , GLint )>(context->getProcAddress("glTextureParameteriEXT"));
+ TextureParameterivEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , const GLint *)>(context->getProcAddress("glTextureParameterivEXT"));
+ TextureParameterfEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , GLfloat )>(context->getProcAddress("glTextureParameterfEXT"));
+ TextureParameterfvEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , const GLfloat *)>(context->getProcAddress("glTextureParameterfvEXT"));
+ GenerateTextureMipmapEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum )>(context->getProcAddress("glGenerateTextureMipmapEXT"));
+ TextureStorage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei )>(context->getProcAddress("glTextureStorage3DEXT"));
+ TextureStorage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei )>(context->getProcAddress("glTextureStorage2DEXT"));
+ TextureStorage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei )>(context->getProcAddress("glTextureStorage1DEXT"));
+ TextureStorage3DMultisampleEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureStorage3DMultisampleEXT"));
+ TextureStorage2DMultisampleEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureStorage2DMultisampleEXT"));
+ TextureImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage3DEXT"));
+ TextureImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage2DEXT"));
+ TextureImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage1DEXT"));
+ TextureSubImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage3DEXT"));
+ TextureSubImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage2DEXT"));
+ TextureSubImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage1DEXT"));
+ CompressedTextureSubImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage1DEXT"));
+ CompressedTextureSubImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage2DEXT"));
+ CompressedTextureSubImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage3DEXT"));
+ CompressedTextureImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage1DEXT"));
+ CompressedTextureImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage2DEXT"));
+ CompressedTextureImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage3DEXT"));
+
+ // Use the real DSA functions
+ TextureParameteri = &QOpenGLTextureHelper::dsa_TextureParameteri;
+ TextureParameteriv = &QOpenGLTextureHelper::dsa_TextureParameteriv;
+ TextureParameterf = &QOpenGLTextureHelper::dsa_TextureParameterf;
+ TextureParameterfv = &QOpenGLTextureHelper::dsa_TextureParameterfv;
+ GenerateTextureMipmap = &QOpenGLTextureHelper::dsa_GenerateTextureMipmap;
+ TextureStorage3D = &QOpenGLTextureHelper::dsa_TextureStorage3D;
+ TextureStorage2D = &QOpenGLTextureHelper::dsa_TextureStorage2D;
+ TextureStorage1D = &QOpenGLTextureHelper::dsa_TextureStorage1D;
+ TextureStorage3DMultisample = &QOpenGLTextureHelper::dsa_TextureStorage3DMultisample;
+ TextureStorage2DMultisample = &QOpenGLTextureHelper::dsa_TextureStorage2DMultisample;
+ TextureImage3D = &QOpenGLTextureHelper::dsa_TextureImage3D;
+ TextureImage2D = &QOpenGLTextureHelper::dsa_TextureImage2D;
+ TextureImage1D = &QOpenGLTextureHelper::dsa_TextureImage1D;
+ TextureSubImage3D = &QOpenGLTextureHelper::dsa_TextureSubImage3D;
+ TextureSubImage2D = &QOpenGLTextureHelper::dsa_TextureSubImage2D;
+ TextureSubImage1D = &QOpenGLTextureHelper::dsa_TextureSubImage1D;
+ CompressedTextureSubImage1D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage1D;
+ CompressedTextureSubImage2D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage2D;
+ CompressedTextureSubImage3D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage3D;
+ CompressedTextureImage1D = &QOpenGLTextureHelper::dsa_CompressedTextureImage1D;
+ CompressedTextureImage2D = &QOpenGLTextureHelper::dsa_CompressedTextureImage2D;
+ CompressedTextureImage3D = &QOpenGLTextureHelper::dsa_CompressedTextureImage3D;
+ } else {
+ // Use our own DSA emulation
+ TextureParameteri = &QOpenGLTextureHelper::qt_TextureParameteri;
+ TextureParameteriv = &QOpenGLTextureHelper::qt_TextureParameteriv;
+ TextureParameterf = &QOpenGLTextureHelper::qt_TextureParameterf;
+ TextureParameterfv = &QOpenGLTextureHelper::qt_TextureParameterfv;
+ GenerateTextureMipmap = &QOpenGLTextureHelper::qt_GenerateTextureMipmap;
+ TextureStorage3D = &QOpenGLTextureHelper::qt_TextureStorage3D;
+ TextureStorage2D = &QOpenGLTextureHelper::qt_TextureStorage2D;
+ TextureStorage1D = &QOpenGLTextureHelper::qt_TextureStorage1D;
+ TextureStorage3DMultisample = &QOpenGLTextureHelper::qt_TextureStorage3DMultisample;
+ TextureStorage2DMultisample = &QOpenGLTextureHelper::qt_TextureStorage2DMultisample;
+ TextureImage3D = &QOpenGLTextureHelper::qt_TextureImage3D;
+ TextureImage2D = &QOpenGLTextureHelper::qt_TextureImage2D;
+ TextureImage1D = &QOpenGLTextureHelper::qt_TextureImage1D;
+ TextureSubImage3D = &QOpenGLTextureHelper::qt_TextureSubImage3D;
+ TextureSubImage2D = &QOpenGLTextureHelper::qt_TextureSubImage2D;
+ TextureSubImage1D = &QOpenGLTextureHelper::qt_TextureSubImage1D;
+ CompressedTextureSubImage1D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage1D;
+ CompressedTextureSubImage2D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage2D;
+ CompressedTextureSubImage3D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage3D;
+ CompressedTextureImage1D = &QOpenGLTextureHelper::qt_CompressedTextureImage1D;
+ CompressedTextureImage2D = &QOpenGLTextureHelper::qt_CompressedTextureImage2D;
+ CompressedTextureImage3D = &QOpenGLTextureHelper::qt_CompressedTextureImage3D;
+ }
+
+ // Some DSA functions are part of NV_texture_multisample instead
+ if (!context->isOpenGLES()
+ && context->hasExtension(QByteArrayLiteral("GL_NV_texture_multisample"))) {
+ TextureImage3DMultisampleNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLint , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureImage3DMultisampleNV"));
+ TextureImage2DMultisampleNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLint , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureImage2DMultisampleNV"));
+
+ TextureImage3DMultisample = &QOpenGLTextureHelper::dsa_TextureImage3DMultisample;
+ TextureImage2DMultisample = &QOpenGLTextureHelper::dsa_TextureImage2DMultisample;
+ } else {
+ TextureImage3DMultisample = &QOpenGLTextureHelper::qt_TextureImage3DMultisample;
+ TextureImage2DMultisample = &QOpenGLTextureHelper::qt_TextureImage2DMultisample;
+ }
+
+#if QT_CONFIG(opengles2)
+ // Here we are targeting OpenGL ES 2.0+ only. This is likely using EGL, where,
+ // similarly to WGL, non-extension functions (i.e. any function that is part of the
+ // GLES spec) *may* not be queried via eglGetProcAddress.
+
+ // OpenGL 1.0
+ TexImage1D = 0;
+
+ // OpenGL 1.1
+ TexSubImage1D = 0;
+
+ // OpenGL 1.3
+ GetCompressedTexImage = 0;
+ CompressedTexSubImage1D = 0;
+ CompressedTexSubImage2D = ::glCompressedTexSubImage2D;
+ CompressedTexImage1D = 0;
+ CompressedTexImage2D = ::glCompressedTexImage2D;
+ ActiveTexture = ::glActiveTexture;
+
+ // OpenGL 3.0
+ GenerateMipmap = ::glGenerateMipmap;
+
+ // OpenGL 3.2
+ TexImage3DMultisample = 0;
+ TexImage2DMultisample = 0;
+
+ // OpenGL 4.2
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (ctx->format().majorVersion() >= 3) {
+ // OpenGL ES 3.0+ has immutable storage for 2D and 3D at least.
+ QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
+ TexStorage3D = extra->f.TexStorage3D;
+ TexStorage2D = extra->f.TexStorage2D;
+ } else {
+ TexStorage3D = 0;
+ TexStorage2D = 0;
+ }
+ TexStorage1D = 0;
+
+ // OpenGL 4.3
+ TexStorage3DMultisample = 0;
+ TexStorage2DMultisample = 0;
+ TexBufferRange = 0;
+ TextureView = 0;
+
+ // OpenGL ES 3.1+ has TexStorage2DMultisample
+ if (ctx->format().version() >= qMakePair(3, 1)) {
+ QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
+ TexStorage2DMultisample = extra->f.TexStorage2DMultisample;
+ }
+
+#endif
+
+ if (context->isOpenGLES() && context->hasExtension(QByteArrayLiteral("GL_OES_texture_3D"))) {
+ TexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid*)>(context->getProcAddress("glTexImage3DOES"));
+ TexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid*)>(context->getProcAddress("glTexSubImage3DOES"));
+ CompressedTexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid*)>(context->getProcAddress("glCompressedTexImage3DOES"));
+ CompressedTexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid*)>(context->getProcAddress("glCompressedTexSubImage3DOES"));
+ } else {
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (ctx->isOpenGLES() && ctx->format().majorVersion() >= 3) {
+ // OpenGL ES 3.0+ has glTexImage3D.
+ QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
+ TexImage3D = extra->f.TexImage3D;
+ TexSubImage3D = extra->f.TexSubImage3D;
+ CompressedTexImage3D = extra->f.CompressedTexImage3D;
+ CompressedTexSubImage3D = extra->f.CompressedTexSubImage3D;
+ } else {
+ // OpenGL 1.2
+ TexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexImage3D"));
+ TexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexSubImage3D"));
+
+ // OpenGL 1.3
+ CompressedTexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage3D"));
+ CompressedTexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage3D"));
+ }
+ }
+
+#if !QT_CONFIG(opengles2)
+ // OpenGL 1.0 and 1.1
+ TexImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexImage1D"));
+ TexSubImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexSubImage1D"));\
+
+ // OpenGL 1.3
+ GetCompressedTexImage = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLvoid *)>(context->getProcAddress("glGetCompressedTexImage"));
+ CompressedTexSubImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage1D"));
+ CompressedTexSubImage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage2D"));
+ CompressedTexImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage1D"));
+ CompressedTexImage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage2D"));
+ ActiveTexture = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glActiveTexture"));
+
+ // OpenGL 3.0
+ GenerateMipmap = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glGenerateMipmap"));
+
+ // OpenGL 3.2
+ TexImage3DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLint , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexImage3DMultisample"));
+ TexImage2DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLint , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexImage2DMultisample"));
+
+ // OpenGL 4.2
+ TexStorage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei )>(context->getProcAddress("glTexStorage3D"));
+ TexStorage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei )>(context->getProcAddress("glTexStorage2D"));
+ TexStorage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei )>(context->getProcAddress("glTexStorage1D"));
+
+ // OpenGL 4.3
+ TexStorage3DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexStorage3DMultisample"));
+ TexStorage2DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexStorage2DMultisample"));
+ TexBufferRange = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLenum , GLuint , GLintptr , GLsizeiptr )>(context->getProcAddress("glTexBufferRange"));
+ TextureView = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLuint , GLenum , GLuint , GLuint , GLuint , GLuint )>(context->getProcAddress("glTextureView"));
+#endif
+}
+
+void QOpenGLTextureHelper::dsa_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param)
+{
+ Q_UNUSED(bindingTarget);
+ TextureParameteriEXT(texture, target, pname, param);
+}
+
+void QOpenGLTextureHelper::dsa_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params)
+{
+ Q_UNUSED(bindingTarget);
+ TextureParameterivEXT(texture, target, pname, params);
+}
+
+void QOpenGLTextureHelper::dsa_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param)
+{
+ Q_UNUSED(bindingTarget);
+ TextureParameterfEXT(texture, target, pname, param);
+}
+
+void QOpenGLTextureHelper::dsa_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params)
+{
+ Q_UNUSED(bindingTarget);
+ TextureParameterfvEXT(texture, target, pname, params);
+}
+
+void QOpenGLTextureHelper::dsa_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget)
+{
+ Q_UNUSED(bindingTarget);
+ GenerateTextureMipmapEXT(texture, target);
+}
+
+void QOpenGLTextureHelper::dsa_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ Q_UNUSED(bindingTarget);
+ TextureStorage3DEXT(texture, target, levels, internalFormat, width, height, depth);
+}
+
+void QOpenGLTextureHelper::dsa_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)
+{
+ Q_UNUSED(bindingTarget);
+ TextureStorage2DEXT(texture, target, levels, internalFormat, width, height);
+}
+
+void QOpenGLTextureHelper::dsa_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width)
+{
+ Q_UNUSED(bindingTarget);
+ TextureStorage1DEXT(texture, target, levels, internalFormat, width);
+}
+
+void QOpenGLTextureHelper::dsa_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
+{
+ Q_UNUSED(bindingTarget);
+ TextureStorage3DMultisampleEXT(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations);
+}
+
+void QOpenGLTextureHelper::dsa_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
+{
+ Q_UNUSED(bindingTarget);
+ TextureStorage2DMultisampleEXT(texture, target, samples, internalFormat, width, height, fixedSampleLocations);
+}
+
+void QOpenGLTextureHelper::dsa_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ Q_UNUSED(bindingTarget);
+ TextureImage3DEXT(texture, target, level, internalFormat, width, height, depth, border, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::dsa_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ Q_UNUSED(bindingTarget);
+ TextureImage2DEXT(texture, target, level, internalFormat, width, height, border, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::dsa_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ Q_UNUSED(bindingTarget);
+ TextureImage1DEXT(texture, target, level, internalFormat, width, border, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::dsa_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ Q_UNUSED(bindingTarget);
+ TextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::dsa_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ Q_UNUSED(bindingTarget);
+ TextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::dsa_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ Q_UNUSED(bindingTarget);
+ TextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::dsa_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
+{
+ Q_UNUSED(bindingTarget);
+ TextureImage3DMultisampleNV(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations);
+}
+
+void QOpenGLTextureHelper::dsa_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
+{
+ Q_UNUSED(bindingTarget);
+ TextureImage2DMultisampleNV(texture, target, samples, internalFormat, width, height, fixedSampleLocations);
+}
+
+void QOpenGLTextureHelper::dsa_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits)
+{
+ Q_UNUSED(bindingTarget);
+ CompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits);
+}
+
+void QOpenGLTextureHelper::dsa_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits)
+{
+ Q_UNUSED(bindingTarget);
+ CompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits);
+}
+
+void QOpenGLTextureHelper::dsa_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits)
+{
+ Q_UNUSED(bindingTarget);
+ CompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
+}
+
+void QOpenGLTextureHelper::dsa_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits)
+{
+ Q_UNUSED(bindingTarget);
+ CompressedTextureImage1DEXT(texture, target, level, internalFormat, width, border, imageSize, bits);
+}
+
+void QOpenGLTextureHelper::dsa_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits)
+{
+ Q_UNUSED(bindingTarget);
+ CompressedTextureImage2DEXT(texture, target, level, internalFormat, width, height, border, imageSize, bits);
+}
+
+void QOpenGLTextureHelper::dsa_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits)
+{
+ Q_UNUSED(bindingTarget);
+ CompressedTextureImage3DEXT(texture, target, level, internalFormat, width, height, depth, border, imageSize, bits);
+}
+
+namespace {
+
+class TextureBinder
+{
+public:
+ TextureBinder(QOpenGLFunctions *functions, GLuint texture, GLenum target, GLenum bindingTarget)
+ : m_functions(functions)
+ {
+ // For cubemaps we can't use the standard DSA emulation as it is illegal to
+ // try to bind a texture to one of the cubemap face targets. So we force the
+ // target and binding target to the cubemap values in this case.
+ switch (target) {
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
+ bindingTarget = GL_TEXTURE_BINDING_CUBE_MAP;
+ m_target = GL_TEXTURE_CUBE_MAP;
+ break;
+
+ default:
+ m_target = target;
+ break;
+ }
+
+ m_functions->glGetIntegerv(bindingTarget, &m_oldTexture);
+ m_functions->glBindTexture(m_target, texture);
+ }
+
+ ~TextureBinder()
+ {
+ m_functions->glBindTexture(m_target, m_oldTexture);
+ }
+
+private:
+ QOpenGLFunctions *m_functions;
+ GLenum m_target;
+ GLint m_oldTexture;
+};
+
+} // namespace
+
+void QOpenGLTextureHelper::qt_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ functions->glTexParameteri(target, pname, param);
+}
+
+void QOpenGLTextureHelper::qt_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ functions->glTexParameteriv(target, pname, params);
+}
+
+void QOpenGLTextureHelper::qt_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ functions->glTexParameterf(target, pname, param);
+}
+
+void QOpenGLTextureHelper::qt_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ functions->glTexParameterfv(target, pname, params);
+}
+
+void QOpenGLTextureHelper::qt_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ functions->glGenerateMipmap(target);
+}
+
+void QOpenGLTextureHelper::qt_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glTexStorage3D(target, levels, internalFormat, width, height, depth);
+}
+
+void QOpenGLTextureHelper::qt_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glTexStorage2D(target, levels, internalFormat, width, height);
+}
+
+void QOpenGLTextureHelper::qt_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glTexStorage1D(target, levels, internalFormat, width);
+}
+
+void QOpenGLTextureHelper::qt_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glTexStorage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
+}
+
+void QOpenGLTextureHelper::qt_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glTexStorage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
+}
+
+void QOpenGLTextureHelper::qt_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::qt_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ functions->glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::qt_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glTexImage1D(target, level, internalFormat, width, border, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::qt_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::qt_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ functions->glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::qt_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glTexSubImage1D(target, level, xoffset, width, format, type, pixels);
+}
+
+void QOpenGLTextureHelper::qt_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glTexImage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
+}
+
+void QOpenGLTextureHelper::qt_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glTexImage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
+}
+
+void QOpenGLTextureHelper::qt_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, bits);
+}
+
+void QOpenGLTextureHelper::qt_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, bits);
+}
+
+void QOpenGLTextureHelper::qt_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
+}
+
+void QOpenGLTextureHelper::qt_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glCompressedTexImage1D(target, level, internalFormat, width, border, imageSize, bits);
+}
+
+void QOpenGLTextureHelper::qt_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glCompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, bits);
+}
+
+void QOpenGLTextureHelper::qt_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits)
+{
+ TextureBinder binder(functions, texture, target, bindingTarget);
+ glCompressedTexImage3D(target, level, internalFormat, width, height, depth, border, imageSize, bits);
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopengltexturehelper_p.h b/src/opengl/qopengltexturehelper_p.h
new file mode 100644
index 0000000000..d3c17c33a4
--- /dev/null
+++ b/src/opengl/qopengltexturehelper_p.h
@@ -0,0 +1,797 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLTEXTUREHELPER_P_H
+#define QOPENGLTEXTUREHELPER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#ifndef QT_NO_OPENGL
+
+#include "qopengl.h"
+#include "qopenglpixeltransferoptions.h"
+#include "qopengltexture.h"
+#include "qopenglfunctions.h"
+
+QT_BEGIN_NAMESPACE
+
+// Constants for OpenGL and OpenGL ES 3.0+ which are not available with OpenGL ES 2.0.
+#ifndef GL_TEXTURE_BASE_LEVEL
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#endif
+#ifndef GL_TEXTURE_MAX_LEVEL
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#endif
+#ifndef GL_TEXTURE_COMPARE_MODE
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#endif
+#ifndef GL_TEXTURE_COMPARE_FUNC
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#endif
+
+// use GL_APICALL only on Android + __clang__
+#if !defined(Q_OS_ANDROID) || !defined(__clang__)
+# undef GL_APICALL
+# define GL_APICALL
+#elif !defined(GL_APICALL)
+# define GL_APICALL
+#endif
+
+class QOpenGLContext;
+
+class QOpenGLTextureHelper
+{
+public:
+ QOpenGLTextureHelper(QOpenGLContext *context);
+
+ // DSA-like API. Will either use real DSA or our emulation
+ inline void glTextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param)
+ {
+ (this->*TextureParameteri)(texture, target, bindingTarget, pname, param);
+ }
+
+ inline void glTextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params)
+ {
+ (this->*TextureParameteriv)(texture, target, bindingTarget, pname, params);
+ }
+
+ inline void glTextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param)
+ {
+ (this->*TextureParameterf)(texture, target, bindingTarget, pname, param);
+ }
+
+ inline void glTextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params)
+ {
+ (this->*TextureParameterfv)(texture, target, bindingTarget, pname, params);
+ }
+
+ inline void glGenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget)
+ {
+ (this->*GenerateTextureMipmap)(texture, target, bindingTarget);
+ }
+
+ inline void glTextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth)
+ {
+ (this->*TextureStorage3D)(texture, target, bindingTarget, levels, internalFormat, width, height, depth);
+ }
+
+ inline void glTextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
+ GLsizei width, GLsizei height)
+ {
+ (this->*TextureStorage2D)(texture, target, bindingTarget, levels, internalFormat, width, height);
+ }
+
+ inline void glTextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
+ GLsizei width)
+ {
+ (this->*TextureStorage1D)(texture, target, bindingTarget, levels, internalFormat, width);
+ }
+
+ inline void glTextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
+ {
+ (this->*TextureStorage3DMultisample)(texture, target, bindingTarget, samples, internalFormat, width, height, depth, fixedSampleLocations);
+ }
+
+ inline void glTextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
+ {
+ (this->*TextureStorage2DMultisample)(texture, target, bindingTarget, samples, internalFormat, width, height, fixedSampleLocations);
+ }
+
+ inline void glTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+ {
+ (this->*TextureImage3D)(texture, target, bindingTarget, level, internalFormat, width, height, depth, border, format, type, pixels);
+ }
+
+ inline void glTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+ {
+ (this->*TextureImage2D)(texture, target, bindingTarget, level, internalFormat, width, height, border, format, type, pixels);
+ }
+
+ inline void glTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+ {
+ (this->*TextureImage1D)(texture, target, bindingTarget, level, internalFormat, width, border, format, type, pixels);
+ }
+
+ inline void glTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
+ const GLvoid *pixels, const QOpenGLPixelTransferOptions * const options = nullptr)
+ {
+ if (options) {
+ QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
+ setPixelUploadOptions(*options);
+ (this->*TextureSubImage3D)(texture, target, bindingTarget, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+ setPixelUploadOptions(oldOptions);
+ } else {
+ (this->*TextureSubImage3D)(texture, target, bindingTarget, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+ }
+ }
+
+ inline void glTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset,
+ GLsizei width, GLsizei height, GLenum format, GLenum type,
+ const GLvoid *pixels, const QOpenGLPixelTransferOptions * const options = nullptr)
+ {
+ if (options) {
+ QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
+ setPixelUploadOptions(*options);
+ (this->*TextureSubImage2D)(texture, target, bindingTarget, level, xoffset, yoffset, width, height, format, type, pixels);
+ setPixelUploadOptions(oldOptions);
+ } else {
+ (this->*TextureSubImage2D)(texture, target, bindingTarget, level, xoffset, yoffset, width, height, format, type, pixels);
+ }
+ }
+
+ inline void glTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset,
+ GLsizei width, GLenum format, GLenum type,
+ const GLvoid *pixels, const QOpenGLPixelTransferOptions * const options = nullptr)
+ {
+ if (options) {
+ QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
+ setPixelUploadOptions(*options);
+ (this->*TextureSubImage1D)(texture, target, bindingTarget, level, xoffset, width, format, type, pixels);
+ setPixelUploadOptions(oldOptions);
+ } else {
+ (this->*TextureSubImage1D)(texture, target, bindingTarget, level, xoffset, width, format, type, pixels);
+ }
+ }
+
+ inline void glTextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
+ {
+ (this->*TextureImage3DMultisample)(texture, target, bindingTarget, samples, internalFormat, width, height, depth, fixedSampleLocations);
+ }
+
+ inline void glTextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat,
+ GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
+ {
+ (this->*TextureImage2DMultisample)(texture, target, bindingTarget, samples, internalFormat, width, height, fixedSampleLocations);
+ }
+
+ inline void glCompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLsizei width,
+ GLenum format, GLsizei imageSize, const GLvoid *bits,
+ const QOpenGLPixelTransferOptions * const options = nullptr)
+ {
+ if (options) {
+ QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
+ setPixelUploadOptions(*options);
+ (this->*CompressedTextureSubImage1D)(texture, target, bindingTarget, level, xoffset, width, format, imageSize, bits);
+ setPixelUploadOptions(oldOptions);
+ } else {
+ (this->*CompressedTextureSubImage1D)(texture, target, bindingTarget, level, xoffset, width, format, imageSize, bits);
+ }
+ }
+
+ inline void glCompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLint yoffset,
+ GLsizei width, GLsizei height,
+ GLenum format, GLsizei imageSize, const GLvoid *bits,
+ const QOpenGLPixelTransferOptions * const options = nullptr)
+ {
+ if (options) {
+ QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
+ setPixelUploadOptions(*options);
+ (this->*CompressedTextureSubImage2D)(texture, target, bindingTarget, level, xoffset, yoffset, width, height, format, imageSize, bits);
+ setPixelUploadOptions(oldOptions);
+ } else {
+ (this->*CompressedTextureSubImage2D)(texture, target, bindingTarget, level, xoffset, yoffset, width, height, format, imageSize, bits);
+ }
+ }
+
+ inline void glCompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLsizei depth,
+ GLenum format, GLsizei imageSize, const GLvoid *bits,
+ const QOpenGLPixelTransferOptions * const options = nullptr)
+ {
+ if (options) {
+ QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
+ setPixelUploadOptions(*options);
+ (this->*CompressedTextureSubImage3D)(texture, target, bindingTarget, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
+ setPixelUploadOptions(oldOptions);
+ } else {
+ (this->*CompressedTextureSubImage3D)(texture, target, bindingTarget, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
+ }
+ }
+
+ inline void glCompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLenum internalFormat, GLsizei width,
+ GLint border, GLsizei imageSize, const GLvoid *bits,
+ const QOpenGLPixelTransferOptions * const options = nullptr)
+ {
+ if (options) {
+ QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
+ setPixelUploadOptions(*options);
+ (this->*CompressedTextureImage1D)(texture, target, bindingTarget, level, internalFormat, width, border, imageSize, bits);
+ setPixelUploadOptions(oldOptions);
+ } else {
+ (this->*CompressedTextureImage1D)(texture, target, bindingTarget, level, internalFormat, width, border, imageSize, bits);
+ }
+ }
+
+ inline void glCompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLenum internalFormat, GLsizei width, GLsizei height,
+ GLint border, GLsizei imageSize, const GLvoid *bits,
+ const QOpenGLPixelTransferOptions * const options = nullptr)
+
+ {
+ if (options) {
+ QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
+ setPixelUploadOptions(*options);
+ (this->*CompressedTextureImage2D)(texture, target, bindingTarget, level, internalFormat, width, height, border, imageSize, bits);
+ setPixelUploadOptions(oldOptions);
+ } else {
+ (this->*CompressedTextureImage2D)(texture, target, bindingTarget, level, internalFormat, width, height, border, imageSize, bits);
+ }
+ }
+
+ inline void glCompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
+ GLint border, GLsizei imageSize, const GLvoid *bits,
+ const QOpenGLPixelTransferOptions * const options = nullptr)
+ {
+ if (options) {
+ QOpenGLPixelTransferOptions oldOptions = savePixelUploadOptions();
+ setPixelUploadOptions(*options);
+ (this->*CompressedTextureImage3D)(texture, target, bindingTarget, level, internalFormat, width, height, depth, border, imageSize, bits);
+ setPixelUploadOptions(oldOptions);
+ } else {
+ (this->*CompressedTextureImage3D)(texture, target, bindingTarget, level, internalFormat, width, height, depth, border, imageSize, bits);
+ }
+ }
+
+private:
+ // DSA wrapper (so we can use pointer to member function as switch)
+ void dsa_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param);
+
+ void dsa_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params);
+
+ void dsa_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param);
+
+ void dsa_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params);
+
+ void dsa_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget);
+
+ void dsa_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth);
+
+ void dsa_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
+ GLsizei width, GLsizei height);
+
+ void dsa_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat,
+ GLsizei width);
+
+ void dsa_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+
+ void dsa_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+
+ void dsa_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+
+ void dsa_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+
+ void dsa_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+
+ void dsa_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+
+ void dsa_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset,
+ GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+
+ void dsa_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset,
+ GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+
+ void dsa_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+
+ void dsa_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat,
+ GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+
+ void dsa_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLsizei width,
+ GLenum format, GLsizei imageSize, const GLvoid *bits);
+
+ void dsa_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLint yoffset,
+ GLsizei width, GLsizei height,
+ GLenum format, GLsizei imageSize, const GLvoid *bits);
+
+ void dsa_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLsizei depth,
+ GLenum format, GLsizei imageSize, const GLvoid *bits);
+
+ void dsa_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLenum internalFormat, GLsizei width,
+ GLint border, GLsizei imageSize, const GLvoid *bits);
+
+ void dsa_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLenum internalFormat, GLsizei width, GLsizei height,
+ GLint border, GLsizei imageSize, const GLvoid *bits);
+
+ void dsa_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
+ GLint border, GLsizei imageSize, const GLvoid *bits);
+
+ // DSA emulation API
+ void qt_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param);
+
+ void qt_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params);
+
+ void qt_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param);
+
+ void qt_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params);
+
+ void qt_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget);
+
+ void qt_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels,
+ GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth);
+
+ void qt_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels,
+ GLenum internalFormat, GLsizei width, GLsizei height);
+
+ void qt_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels,
+ GLenum internalFormat, GLsizei width);
+
+ void qt_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples,
+ GLenum internalFormat, GLsizei width, GLsizei height,
+ GLsizei depth, GLboolean fixedSampleLocations);
+
+ void qt_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples,
+ GLenum internalFormat, GLsizei width, GLsizei height,
+ GLboolean fixedSampleLocations);
+
+ void qt_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth,
+ GLint border, GLenum format, GLenum type,
+ const GLvoid *pixels);
+
+ void qt_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLsizei height,
+ GLint border, GLenum format, GLenum type,
+ const GLvoid *pixels);
+
+ void qt_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLint border, GLenum format, GLenum type,
+ const GLvoid *pixels);
+
+ void qt_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLsizei depth,
+ GLenum format, GLenum type, const GLvoid *pixels);
+
+ void qt_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLint yoffset,
+ GLsizei width, GLsizei height,
+ GLenum format, GLenum type, const GLvoid *pixels);
+
+ void qt_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLsizei width,
+ GLenum format, GLenum type, const GLvoid *pixels);
+
+ void qt_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples,
+ GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth,
+ GLboolean fixedSampleLocations);
+
+ void qt_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples,
+ GLint internalFormat, GLsizei width, GLsizei height,
+ GLboolean fixedSampleLocations);
+
+ void qt_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLsizei width, GLenum format,
+ GLsizei imageSize, const GLvoid *bits);
+
+ void qt_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLint yoffset,
+ GLsizei width, GLsizei height,
+ GLenum format, GLsizei imageSize, const GLvoid *bits);
+
+ void qt_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLsizei depth,
+ GLenum format, GLsizei imageSize, const GLvoid *bits);
+
+ void qt_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLint border,
+ GLsizei imageSize, const GLvoid *bits);
+
+ void qt_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLint border,
+ GLsizei imageSize, const GLvoid *bits);
+
+ void qt_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth, GLint border,
+ GLsizei imageSize, const GLvoid *bits);
+
+public:
+ // Raw OpenGL functions, resolved and used by our DSA-like static functions if no EXT_direct_state_access is available
+
+ // OpenGL 1.0
+ inline void glTexImage1D(GLenum target, GLint level, GLint internalFormat,
+ GLsizei width, GLint border,
+ GLenum format, GLenum type, const GLvoid *pixels)
+ {
+ TexImage1D(target, level, internalFormat, width, border, format, type, pixels);
+ }
+
+ // OpenGL 1.1
+ inline void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width,
+ GLenum format, GLenum type, const GLvoid *pixels)
+ {
+ TexSubImage1D(target, level, xoffset, width, format, type, pixels);
+ }
+
+ // OpenGL 1.2
+ inline void glTexImage3D(GLenum target, GLint level, GLint internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth, GLint border,
+ GLenum format, GLenum type, const GLvoid *pixels)
+ {
+ TexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels);
+ }
+
+ inline void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+ {
+ TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+ }
+
+ // OpenGL 1.3
+ inline void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *img)
+ {
+ GetCompressedTexImage(target, level, img);
+ }
+
+ inline void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width,
+ GLenum format, GLsizei imageSize, const GLvoid *data)
+ {
+ CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
+ }
+
+ inline void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+ GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+ {
+ CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+ }
+
+ inline void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+ {
+ CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+ }
+
+ inline void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalFormat, GLsizei width,
+ GLint border, GLsizei imageSize, const GLvoid *data)
+ {
+ CompressedTexImage1D(target, level, internalFormat, width, border, imageSize, data);
+ }
+
+ inline void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height,
+ GLint border, GLsizei imageSize, const GLvoid *data)
+ {
+ CompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, data);
+ }
+
+ inline void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth,
+ GLint border, GLsizei imageSize, const GLvoid *data)
+ {
+ CompressedTexImage3D(target, level, internalFormat, width, height, depth, border, imageSize, data);
+ }
+
+ inline void glActiveTexture(GLenum texture)
+ {
+ ActiveTexture(texture);
+ }
+
+ // OpenGL 3.0
+ inline void glGenerateMipmap(GLenum target)
+ {
+ GenerateMipmap(target);
+ }
+
+ // OpenGL 3.2
+ inline void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth,
+ GLboolean fixedSampleLocations)
+ {
+ TexImage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
+ }
+
+ inline void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalFormat,
+ GLsizei width, GLsizei height,
+ GLboolean fixedSampleLocations)
+ {
+ TexImage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
+ }
+
+ // OpenGL 4.2
+ inline void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)
+ {
+ TexStorage3D(target, levels, internalFormat, width, height, depth);
+ }
+
+ inline void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)
+ {
+ TexStorage2D(target, levels, internalFormat, width, height);
+ }
+
+ inline void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width)
+ {
+ TexStorage1D(target, levels, internalFormat, width);
+ }
+
+ // OpenGL 4.3
+ inline void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
+ {
+ TexStorage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
+ }
+
+ inline void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
+ {
+ TexStorage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
+ }
+
+ inline void glTexBufferRange(GLenum target, GLenum internalFormat, GLuint buffer,
+ GLintptr offset, GLsizeiptr size)
+ {
+ TexBufferRange(target, internalFormat, buffer, offset, size);
+ }
+
+ inline void glTextureView(GLuint texture, GLenum target, GLuint origTexture, GLenum internalFormat,
+ GLuint minLevel, GLuint numLevels, GLuint minLayer, GLuint numLayers)
+ {
+ TextureView(texture, target, origTexture, internalFormat, minLevel, numLevels, minLayer, numLayers);
+ }
+
+ // Helper functions
+ inline QOpenGLPixelTransferOptions savePixelUploadOptions()
+ {
+ QOpenGLPixelTransferOptions options;
+ int val = 0;
+ functions->glGetIntegerv(GL_UNPACK_ALIGNMENT, &val);
+ options.setAlignment(val);
+#if !QT_CONFIG(opengles2)
+ functions->glGetIntegerv(GL_UNPACK_SKIP_IMAGES, &val);
+ options.setSkipImages(val);
+ functions->glGetIntegerv(GL_UNPACK_SKIP_ROWS, &val);
+ options.setSkipRows(val);
+ functions->glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &val);
+ options.setSkipPixels(val);
+ functions->glGetIntegerv(GL_UNPACK_IMAGE_HEIGHT, &val);
+ options.setImageHeight(val);
+ functions->glGetIntegerv(GL_UNPACK_ROW_LENGTH, &val);
+ options.setRowLength(val);
+ GLboolean b = GL_FALSE;
+ functions->glGetBooleanv(GL_UNPACK_LSB_FIRST, &b);
+ options.setLeastSignificantByteFirst(b);
+ functions->glGetBooleanv(GL_UNPACK_SWAP_BYTES, &b);
+ options.setSwapBytesEnabled(b);
+#endif
+ return options;
+ }
+
+ inline void setPixelUploadOptions(const QOpenGLPixelTransferOptions &options)
+ {
+ functions->glPixelStorei(GL_UNPACK_ALIGNMENT, options.alignment());
+#if !QT_CONFIG(opengles2)
+ functions->glPixelStorei(GL_UNPACK_SKIP_IMAGES, options.skipImages());
+ functions->glPixelStorei(GL_UNPACK_SKIP_ROWS, options.skipRows());
+ functions->glPixelStorei(GL_UNPACK_SKIP_PIXELS, options.skipPixels());
+ functions->glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, options.imageHeight());
+ functions->glPixelStorei(GL_UNPACK_ROW_LENGTH, options.rowLength());
+ functions->glPixelStorei(GL_UNPACK_LSB_FIRST, options.isLeastSignificantBitFirst());
+ functions->glPixelStorei(GL_UNPACK_SWAP_BYTES, options.isSwapBytesEnabled());
+#endif
+ }
+
+ QOpenGLFunctions *functions;
+private:
+ // Typedefs and pointers to member functions used to switch between EXT_direct_state_access and our own emulated DSA.
+ // The argument match the corresponding GL function, but there's an extra "GLenum bindingTarget" which gets used with
+ // the DSA emulation -- it contains the right GL_BINDING_TEXTURE_X to use.
+ typedef void (QOpenGLTextureHelper::*TextureParameteriMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param);
+ typedef void (QOpenGLTextureHelper::*TextureParameterivMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params);
+ typedef void (QOpenGLTextureHelper::*TextureParameterfMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param);
+ typedef void (QOpenGLTextureHelper::*TextureParameterfvMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params);
+ typedef void (QOpenGLTextureHelper::*GenerateTextureMipmapMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget);
+ typedef void (QOpenGLTextureHelper::*TextureStorage3DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth);
+ typedef void (QOpenGLTextureHelper::*TextureStorage2DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height);
+ typedef void (QOpenGLTextureHelper::*TextureStorage1DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width);
+ typedef void (QOpenGLTextureHelper::*TextureStorage3DMultisampleMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+ typedef void (QOpenGLTextureHelper::*TextureStorage2DMultisampleMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+ typedef void (QOpenGLTextureHelper::*TextureImage3DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ typedef void (QOpenGLTextureHelper::*TextureImage2DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ typedef void (QOpenGLTextureHelper::*TextureImage1DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ typedef void (QOpenGLTextureHelper::*TextureSubImage3DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ typedef void (QOpenGLTextureHelper::*TextureSubImage2DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ typedef void (QOpenGLTextureHelper::*TextureSubImage1DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ typedef void (QOpenGLTextureHelper::*TextureImage3DMultisampleMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+ typedef void (QOpenGLTextureHelper::*TextureImage2DMultisampleMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+ typedef void (QOpenGLTextureHelper::*CompressedTextureSubImage1DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits);
+ typedef void (QOpenGLTextureHelper::*CompressedTextureSubImage2DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits);
+ typedef void (QOpenGLTextureHelper::*CompressedTextureSubImage3DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits);
+ typedef void (QOpenGLTextureHelper::*CompressedTextureImage1DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits);
+ typedef void (QOpenGLTextureHelper::*CompressedTextureImage2DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits);
+ typedef void (QOpenGLTextureHelper::*CompressedTextureImage3DMemberFunc)(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits);
+
+
+ TextureParameteriMemberFunc TextureParameteri;
+ TextureParameterivMemberFunc TextureParameteriv;
+ TextureParameterfMemberFunc TextureParameterf;
+ TextureParameterfvMemberFunc TextureParameterfv;
+ GenerateTextureMipmapMemberFunc GenerateTextureMipmap;
+ TextureStorage3DMemberFunc TextureStorage3D;
+ TextureStorage2DMemberFunc TextureStorage2D;
+ TextureStorage1DMemberFunc TextureStorage1D;
+ TextureStorage3DMultisampleMemberFunc TextureStorage3DMultisample;
+ TextureStorage2DMultisampleMemberFunc TextureStorage2DMultisample;
+ TextureImage3DMemberFunc TextureImage3D;
+ TextureImage2DMemberFunc TextureImage2D;
+ TextureImage1DMemberFunc TextureImage1D;
+ TextureSubImage3DMemberFunc TextureSubImage3D;
+ TextureSubImage2DMemberFunc TextureSubImage2D;
+ TextureSubImage1DMemberFunc TextureSubImage1D;
+ TextureImage3DMultisampleMemberFunc TextureImage3DMultisample;
+ TextureImage2DMultisampleMemberFunc TextureImage2DMultisample;
+ CompressedTextureSubImage1DMemberFunc CompressedTextureSubImage1D;
+ CompressedTextureSubImage2DMemberFunc CompressedTextureSubImage2D;
+ CompressedTextureSubImage3DMemberFunc CompressedTextureSubImage3D;
+ CompressedTextureImage1DMemberFunc CompressedTextureImage1D;
+ CompressedTextureImage2DMemberFunc CompressedTextureImage2D;
+ CompressedTextureImage3DMemberFunc CompressedTextureImage3D;
+
+ // Raw function pointers for core and DSA functions
+
+ // EXT_direct_state_access used when DSA is available
+ void (QOPENGLF_APIENTRYP TextureParameteriEXT)(GLuint texture, GLenum target, GLenum pname, GLint param);
+ void (QOPENGLF_APIENTRYP TextureParameterivEXT)(GLuint texture, GLenum target, GLenum pname, const GLint *params);
+ void (QOPENGLF_APIENTRYP TextureParameterfEXT)(GLuint texture, GLenum target, GLenum pname, GLfloat param);
+ void (QOPENGLF_APIENTRYP TextureParameterfvEXT)(GLuint texture, GLenum target, GLenum pname, const GLfloat *params);
+ void (QOPENGLF_APIENTRYP GenerateTextureMipmapEXT)(GLuint texture, GLenum target);
+ void (QOPENGLF_APIENTRYP TextureStorage3DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth);
+ void (QOPENGLF_APIENTRYP TextureStorage2DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height);
+ void (QOPENGLF_APIENTRYP TextureStorage1DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width);
+ void (QOPENGLF_APIENTRYP TextureStorage3DMultisampleEXT)(GLuint texture, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+ void (QOPENGLF_APIENTRYP TextureStorage2DMultisampleEXT)(GLuint texture, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+ void (QOPENGLF_APIENTRYP TextureImage3DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void (QOPENGLF_APIENTRYP TextureImage2DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void (QOPENGLF_APIENTRYP TextureImage1DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void (QOPENGLF_APIENTRYP TextureSubImage3DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+ void (QOPENGLF_APIENTRYP TextureSubImage2DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+ void (QOPENGLF_APIENTRYP TextureSubImage1DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+ void (QOPENGLF_APIENTRYP CompressedTextureSubImage1DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits);
+ void (QOPENGLF_APIENTRYP CompressedTextureSubImage2DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits);
+ void (QOPENGLF_APIENTRYP CompressedTextureSubImage3DEXT)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits);
+ void (QOPENGLF_APIENTRYP CompressedTextureImage1DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits);
+ void (QOPENGLF_APIENTRYP CompressedTextureImage2DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits);
+ void (QOPENGLF_APIENTRYP CompressedTextureImage3DEXT)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits);
+
+
+ // Plus some missing ones that are in the NV_texture_multisample extension instead
+ void (QOPENGLF_APIENTRYP TextureImage3DMultisampleNV)(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+ void (QOPENGLF_APIENTRYP TextureImage2DMultisampleNV)(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+
+ // OpenGL 1.0
+ void (QOPENGLF_APIENTRYP TexImage1D)(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+
+ // OpenGL 1.1
+ void (QOPENGLF_APIENTRYP TexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+
+ // OpenGL 1.2
+ void (QOPENGLF_APIENTRYP TexImage3D)(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ void (QOPENGLF_APIENTRYP TexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+
+ // OpenGL 1.3
+ void (QOPENGLF_APIENTRYP GetCompressedTexImage)(GLenum target, GLint level, GLvoid *img);
+ void (QOPENGLF_APIENTRYP CompressedTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+ GL_APICALL void (QOPENGLF_APIENTRYP CompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void (QOPENGLF_APIENTRYP CompressedTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+ void (QOPENGLF_APIENTRYP CompressedTexImage1D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+ GL_APICALL void (QOPENGLF_APIENTRYP CompressedTexImage2D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+ void (QOPENGLF_APIENTRYP CompressedTexImage3D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+ GL_APICALL void (QOPENGLF_APIENTRYP ActiveTexture)(GLenum texture);
+
+ // OpenGL 3.0
+ GL_APICALL void (QOPENGLF_APIENTRYP GenerateMipmap)(GLenum target);
+
+ // OpenGL 3.2
+ void (QOPENGLF_APIENTRYP TexImage3DMultisample)(GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+ void (QOPENGLF_APIENTRYP TexImage2DMultisample)(GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+
+ // OpenGL 4.2
+ void (QOPENGLF_APIENTRYP TexStorage3D)(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth);
+ void (QOPENGLF_APIENTRYP TexStorage2D)(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height);
+ void (QOPENGLF_APIENTRYP TexStorage1D)(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width);
+
+ // OpenGL 4.3
+ void (QOPENGLF_APIENTRYP TexStorage3DMultisample)(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+ void (QOPENGLF_APIENTRYP TexStorage2DMultisample)(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+ void (QOPENGLF_APIENTRYP TexBufferRange)(GLenum target, GLenum internalFormat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ void (QOPENGLF_APIENTRYP TextureView)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+};
+
+QT_END_NAMESPACE
+
+#undef Q_CALL_MEMBER_FUNCTION
+
+#endif // QT_NO_OPENGL
+
+#endif // QOPENGLTEXTUREHELPER_P_H
diff --git a/src/opengl/qopengltextureuploader.cpp b/src/opengl/qopengltextureuploader.cpp
new file mode 100644
index 0000000000..469ddc56c1
--- /dev/null
+++ b/src/opengl/qopengltextureuploader.cpp
@@ -0,0 +1,381 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopengltextureuploader_p.h"
+
+#include <qimage.h>
+#include <qmath.h>
+#include <qopenglfunctions.h>
+#include <private/qopenglcontext_p.h>
+#include <private/qopenglextensions_p.h>
+
+#ifndef GL_RED
+#define GL_RED 0x1903
+#endif
+
+#ifndef GL_GREEN
+#define GL_GREEN 0x1904
+#endif
+
+#ifndef GL_BLUE
+#define GL_BLUE 0x1905
+#endif
+
+#ifndef GL_RGB10_A2
+#define GL_RGB10_A2 0x8059
+#endif
+
+#ifndef GL_RGBA16
+#define GL_RGBA16 0x805B
+#endif
+
+#ifndef GL_BGR
+#define GL_BGR 0x80E0
+#endif
+
+#ifndef GL_BGRA
+#define GL_BGRA 0x80E1
+#endif
+
+#ifndef GL_UNSIGNED_INT_8_8_8_8_REV
+#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
+#endif
+
+#ifndef GL_UNSIGNED_INT_2_10_10_10_REV
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#endif
+
+#ifndef GL_TEXTURE_SWIZZLE_R
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#endif
+
+#ifndef GL_TEXTURE_SWIZZLE_G
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#endif
+
+#ifndef GL_TEXTURE_SWIZZLE_B
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#endif
+
+#ifndef GL_TEXTURE_SWIZZLE_A
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#endif
+
+#ifndef GL_SRGB
+#define GL_SRGB 0x8C40
+#endif
+#ifndef GL_SRGB_ALPHA
+#define GL_SRGB_ALPHA 0x8C42
+#endif
+
+QT_BEGIN_NAMESPACE
+
+qsizetype QOpenGLTextureUploader::textureImage(GLenum target, const QImage &image, QOpenGLTextureUploader::BindOptions options, QSize maxSize)
+{
+ QOpenGLContext *context = QOpenGLContext::currentContext();
+ QOpenGLExtensions *funcs = static_cast<QOpenGLExtensions*>(context->functions());
+
+ QImage tx;
+ GLenum externalFormat;
+ GLenum internalFormat;
+ GLuint pixelType;
+ QImage::Format targetFormat = QImage::Format_Invalid;
+ const bool isOpenGL12orBetter = !context->isOpenGLES() && (context->format().majorVersion() >= 2 || context->format().minorVersion() >= 2);
+ const bool isOpenGLES3orBetter = context->isOpenGLES() && context->format().majorVersion() >= 3;
+ const bool sRgbBinding = (options & SRgbBindOption);
+ Q_ASSERT(isOpenGL12orBetter || context->isOpenGLES());
+ Q_ASSERT((options & (SRgbBindOption | UseRedForAlphaAndLuminanceBindOption)) != (SRgbBindOption | UseRedForAlphaAndLuminanceBindOption));
+
+ switch (image.format()) {
+ case QImage::Format_RGB32:
+ case QImage::Format_ARGB32:
+ case QImage::Format_ARGB32_Premultiplied:
+ if (isOpenGL12orBetter) {
+ externalFormat = GL_BGRA;
+ internalFormat = GL_RGBA;
+ pixelType = GL_UNSIGNED_INT_8_8_8_8_REV;
+#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ // Without GL_UNSIGNED_INT_8_8_8_8_REV, BGRA only matches ARGB on little endian:
+ } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::BGRATextureFormat) && !sRgbBinding) {
+ // The GL_EXT_texture_format_BGRA8888 extension requires the internal format to match the external.
+ externalFormat = internalFormat = GL_BGRA;
+ pixelType = GL_UNSIGNED_BYTE;
+ } else if (context->isOpenGLES() && context->hasExtension(QByteArrayLiteral("GL_APPLE_texture_format_BGRA8888"))) {
+ // Is only allowed as an external format like OpenGL.
+ externalFormat = GL_BGRA;
+ internalFormat = GL_RGBA;
+ pixelType = GL_UNSIGNED_BYTE;
+#endif
+ } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
+#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_BLUE);
+ funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_RED);
+#else
+ funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_GREEN);
+ funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, GL_BLUE);
+ funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_ALPHA);
+ funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, GL_RED);
+#endif
+ externalFormat = internalFormat = GL_RGBA;
+ pixelType = GL_UNSIGNED_BYTE;
+ } else {
+ // No support for direct ARGB32 upload.
+ break;
+ }
+ targetFormat = image.format();
+ break;
+ case QImage::Format_BGR30:
+ case QImage::Format_A2BGR30_Premultiplied:
+ if (sRgbBinding) {
+ // Always needs conversion
+ break;
+ } else if (isOpenGL12orBetter || isOpenGLES3orBetter) {
+ pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
+ externalFormat = GL_RGBA;
+ internalFormat = GL_RGB10_A2;
+ targetFormat = image.format();
+ }
+ break;
+ case QImage::Format_RGB30:
+ case QImage::Format_A2RGB30_Premultiplied:
+ if (sRgbBinding) {
+ // Always needs conversion
+ break;
+ } else if (isOpenGL12orBetter) {
+ pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
+ externalFormat = GL_BGRA;
+ internalFormat = GL_RGB10_A2;
+ targetFormat = image.format();
+ } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
+ funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_RED);
+ funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_BLUE);
+ pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
+ externalFormat = GL_RGBA;
+ internalFormat = GL_RGB10_A2;
+ targetFormat = image.format();
+ }
+ break;
+ case QImage::Format_RGB444:
+ case QImage::Format_RGB555:
+ case QImage::Format_RGB16:
+ if (isOpenGL12orBetter || context->isOpenGLES()) {
+ externalFormat = internalFormat = GL_RGB;
+ pixelType = GL_UNSIGNED_SHORT_5_6_5;
+ targetFormat = QImage::Format_RGB16;
+ }
+ break;
+ case QImage::Format_RGB666:
+ case QImage::Format_RGB888:
+ externalFormat = internalFormat = GL_RGB;
+ pixelType = GL_UNSIGNED_BYTE;
+ targetFormat = QImage::Format_RGB888;
+ break;
+ case QImage::Format_BGR888:
+ if (isOpenGL12orBetter) {
+ externalFormat = GL_BGR;
+ internalFormat = GL_RGB;
+ pixelType = GL_UNSIGNED_BYTE;
+ targetFormat = QImage::Format_BGR888;
+ } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
+ funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_RED);
+ funcs->glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_BLUE);
+ externalFormat = internalFormat = GL_RGB;
+ pixelType = GL_UNSIGNED_BYTE;
+ targetFormat = QImage::Format_BGR888;
+ }
+ break;
+ case QImage::Format_RGBX8888:
+ case QImage::Format_RGBA8888:
+ case QImage::Format_RGBA8888_Premultiplied:
+ externalFormat = internalFormat = GL_RGBA;
+ pixelType = GL_UNSIGNED_BYTE;
+ targetFormat = image.format();
+ break;
+ case QImage::Format_RGBX64:
+ case QImage::Format_RGBA64:
+ case QImage::Format_RGBA64_Premultiplied:
+ externalFormat = internalFormat = GL_RGBA;
+ if (isOpenGL12orBetter || (context->isOpenGLES() && context->format().majorVersion() >= 3))
+ internalFormat = GL_RGBA16;
+ pixelType = GL_UNSIGNED_SHORT;
+ targetFormat = image.format();
+ break;
+ case QImage::Format_Indexed8:
+ if (sRgbBinding) {
+ // Always needs conversion
+ break;
+ } else if (options & UseRedForAlphaAndLuminanceBindOption) {
+ externalFormat = internalFormat = GL_RED;
+ pixelType = GL_UNSIGNED_BYTE;
+ targetFormat = image.format();
+ }
+ break;
+ case QImage::Format_Alpha8:
+ if (sRgbBinding) {
+ // Always needs conversion
+ break;
+ } else if (options & UseRedForAlphaAndLuminanceBindOption) {
+ externalFormat = internalFormat = GL_RED;
+ pixelType = GL_UNSIGNED_BYTE;
+ targetFormat = image.format();
+ } else if (context->isOpenGLES() || context->format().profile() != QSurfaceFormat::CoreProfile) {
+ externalFormat = internalFormat = GL_ALPHA;
+ pixelType = GL_UNSIGNED_BYTE;
+ targetFormat = image.format();
+ } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ALPHA);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_ZERO);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_ZERO);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ZERO);
+ externalFormat = internalFormat = GL_RED;
+ pixelType = GL_UNSIGNED_BYTE;
+ targetFormat = image.format();
+ }
+ break;
+ case QImage::Format_Grayscale8:
+ if (sRgbBinding) {
+ // Always needs conversion
+ break;
+ } else if (options & UseRedForAlphaAndLuminanceBindOption) {
+ externalFormat = internalFormat = GL_RED;
+ pixelType = GL_UNSIGNED_BYTE;
+ targetFormat = image.format();
+ } else if (context->isOpenGLES() || context->format().profile() != QSurfaceFormat::CoreProfile) {
+ externalFormat = internalFormat = GL_LUMINANCE;
+ pixelType = GL_UNSIGNED_BYTE;
+ targetFormat = image.format();
+ } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ONE);
+ externalFormat = internalFormat = GL_RED;
+ pixelType = GL_UNSIGNED_BYTE;
+ targetFormat = image.format();
+ }
+ break;
+ case QImage::Format_Grayscale16:
+ if (sRgbBinding) {
+ // Always needs conversion
+ break;
+ } else if (options & UseRedForAlphaAndLuminanceBindOption) {
+ externalFormat = internalFormat = GL_RED;
+ pixelType = GL_UNSIGNED_SHORT;
+ targetFormat = image.format();
+ } else if (context->isOpenGLES() || context->format().profile() != QSurfaceFormat::CoreProfile) {
+ externalFormat = internalFormat = GL_LUMINANCE;
+ pixelType = GL_UNSIGNED_SHORT;
+ targetFormat = image.format();
+ } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ONE);
+ externalFormat = internalFormat = GL_RED;
+ pixelType = GL_UNSIGNED_SHORT;
+ targetFormat = image.format();
+ }
+ break;
+ default:
+ break;
+ }
+
+ // If no direct upload was detected above, convert to RGBA8888 and upload that
+ if (targetFormat == QImage::Format_Invalid) {
+ externalFormat = internalFormat = GL_RGBA;
+ pixelType = GL_UNSIGNED_BYTE;
+ if (!image.hasAlphaChannel())
+ targetFormat = QImage::Format_RGBX8888;
+ else
+ targetFormat = QImage::Format_RGBA8888;
+ }
+
+ if (options & PremultipliedAlphaBindOption) {
+ if (targetFormat == QImage::Format_ARGB32)
+ targetFormat = QImage::Format_ARGB32_Premultiplied;
+ else if (targetFormat == QImage::Format_RGBA8888)
+ targetFormat = QImage::Format_RGBA8888_Premultiplied;
+ else if (targetFormat == QImage::Format_RGBA64)
+ targetFormat = QImage::Format_RGBA64_Premultiplied;
+ } else {
+ if (targetFormat == QImage::Format_ARGB32_Premultiplied)
+ targetFormat = QImage::Format_ARGB32;
+ else if (targetFormat == QImage::Format_RGBA8888_Premultiplied)
+ targetFormat = QImage::Format_RGBA8888;
+ else if (targetFormat == QImage::Format_RGBA64_Premultiplied)
+ targetFormat = QImage::Format_RGBA64;
+ }
+
+ if (sRgbBinding) {
+ Q_ASSERT(internalFormat == GL_RGBA || internalFormat == GL_RGB);
+ if (image.hasAlphaChannel())
+ internalFormat = GL_SRGB_ALPHA;
+ else
+ internalFormat = GL_SRGB;
+ }
+
+ if (image.format() != targetFormat)
+ tx = image.convertToFormat(targetFormat);
+ else
+ tx = image;
+
+ QSize newSize = tx.size();
+ if (!maxSize.isEmpty())
+ newSize = newSize.boundedTo(maxSize);
+ if (options & PowerOfTwoBindOption) {
+ newSize.setWidth(qNextPowerOfTwo(newSize.width() - 1));
+ newSize.setHeight(qNextPowerOfTwo(newSize.height() - 1));
+ }
+
+ if (newSize != tx.size())
+ tx = tx.scaled(newSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+
+ // Handle cases where the QImage is actually a sub image of its image data:
+ qsizetype naturalBpl = ((qsizetype(tx.width()) * tx.depth() + 31) >> 5) << 2;
+ if (tx.bytesPerLine() != naturalBpl)
+ tx = tx.copy(tx.rect());
+
+ funcs->glTexImage2D(target, 0, internalFormat, tx.width(), tx.height(), 0, externalFormat, pixelType, tx.constBits());
+
+ qsizetype cost = qint64(tx.width()) * tx.height() * tx.depth() / 8;
+
+ return cost;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopengltextureuploader_p.h b/src/opengl/qopengltextureuploader_p.h
new file mode 100644
index 0000000000..cea6d97658
--- /dev/null
+++ b/src/opengl/qopengltextureuploader_p.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QOPENGLTEXTUREUPLOADER_P_H
+#define QOPENGLTEXTUREUPLOADER_P_H
+
+#include <QtCore/qsize.h>
+#include <QtOpenGL/qtopenglglobal.h>
+#include <QtGui/private/qopenglcontext_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QImage;
+
+class Q_OPENGL_EXPORT QOpenGLTextureUploader
+{
+public:
+ enum BindOption {
+ NoBindOption = 0x0000,
+ PremultipliedAlphaBindOption = 0x0001,
+ UseRedForAlphaAndLuminanceBindOption = 0x0002,
+ SRgbBindOption = 0x0004,
+ PowerOfTwoBindOption = 0x0008
+ };
+ Q_DECLARE_FLAGS(BindOptions, BindOption)
+ Q_FLAGS(BindOptions)
+
+ static qsizetype textureImage(GLenum target, const QImage &image, BindOptions options, QSize maxSize = QSize());
+
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLTextureUploader::BindOptions)
+
+QT_END_NAMESPACE
+
+#endif
+
diff --git a/src/opengl/qopengltimerquery.cpp b/src/opengl/qopengltimerquery.cpp
new file mode 100644
index 0000000000..44955d48fc
--- /dev/null
+++ b/src/opengl/qopengltimerquery.cpp
@@ -0,0 +1,880 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopengltimerquery.h"
+
+#include "qopenglqueryhelper_p.h"
+#include <QtCore/private/qobject_p.h>
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QOpenGLFunctions>
+
+QT_BEGIN_NAMESPACE
+
+// Helper class used as fallback if OpenGL <3.3 is being used with EXT_timer_query
+class QExtTimerQueryHelper
+{
+public:
+ QExtTimerQueryHelper(QOpenGLContext *context)
+ {
+ Q_ASSERT(context);
+ GetQueryObjectui64vEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLuint64EXT *)>(context->getProcAddress("glGetQueryObjectui64vEXT"));
+ GetQueryObjecti64vEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint64EXT *)>(context->getProcAddress("glGetQueryObjecti64vEXT"));
+ }
+
+ inline void glGetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64EXT *params)
+ {
+ GetQueryObjectui64vEXT(id, pname, params);
+ }
+
+ inline void glGetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64EXT *params)
+ {
+ GetQueryObjecti64vEXT(id, pname, params);
+ }
+
+private:
+ void (QOPENGLF_APIENTRYP GetQueryObjectui64vEXT)(GLuint id, GLenum pname, GLuint64EXT *params);
+ void (QOPENGLF_APIENTRYP GetQueryObjecti64vEXT)(GLuint id, GLenum pname, GLint64EXT *params);
+};
+
+class QOpenGLTimerQueryPrivate : public QObjectPrivate
+{
+public:
+ QOpenGLTimerQueryPrivate()
+ : QObjectPrivate(),
+ context(nullptr),
+ ext(nullptr),
+ timeInterval(0),
+ timer(0)
+ {
+ }
+
+ ~QOpenGLTimerQueryPrivate()
+ {
+ delete core;
+ delete ext;
+ }
+
+ bool create();
+ void destroy();
+ void begin();
+ void end();
+ GLuint64 waitForTimeStamp() const;
+ void recordTimestamp();
+ bool isResultAvailable() const;
+ GLuint64 result() const;
+
+ // There are several cases we must handle:
+ // OpenGL >=3.3 includes timer queries as a core feature
+ // ARB_timer_query has same functionality as above. Requires OpenGL 3.2
+ // EXT_timer_query offers limited support. Can be used with OpenGL >=1.5
+ //
+ // Note that some implementations (OS X) provide OpenGL 3.2 but do not expose the
+ // ARB_timer_query extension. In such situations we must also be able to handle
+ // using the EXT_timer_query extension with any version of OpenGL.
+ //
+ // OpenGL 1.5 or above contains the generic query API and OpenGL 3.3 and
+ // ARB_timer_query provide the 64-bit query API. These are wrapped by
+ // QOpenGLQueryHelper. All we need to handle in addition is the EXT_timer_query
+ // case and to take care not to call the Core/ARB functions when we only
+ // have EXT_timer_query available.
+ QOpenGLContext *context;
+ QOpenGLQueryHelper *core;
+ QExtTimerQueryHelper *ext;
+ mutable GLuint64 timeInterval;
+ GLuint timer;
+};
+
+bool QOpenGLTimerQueryPrivate::create()
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+
+ if (timer && context == ctx)
+ return true;
+
+ context = ctx;
+ if (!context) {
+ qWarning("A current OpenGL context is required to create timer query objects");
+ return false;
+ }
+
+ if (context->isOpenGLES()) {
+ qWarning("QOpenGLTimerQuery: Not supported on OpenGL ES");
+ return false;
+ }
+
+ // Resolve the functions provided by OpenGL 1.5 and OpenGL 3.3 or ARB_timer_query
+ core = new QOpenGLQueryHelper(context);
+
+ // Check to see if we also need to resolve the functions for EXT_timer_query
+ QSurfaceFormat f = context->format();
+ if (f.version() <= qMakePair<int, int>(3, 2)
+ && !context->hasExtension(QByteArrayLiteral("GL_ARB_timer_query"))
+ && context->hasExtension(QByteArrayLiteral("GL_EXT_timer_query"))) {
+ ext = new QExtTimerQueryHelper(context);
+ } else if (f.version() <= qMakePair<int, int>(3, 2)
+ && !context->hasExtension(QByteArrayLiteral("GL_ARB_timer_query"))
+ && !context->hasExtension(QByteArrayLiteral("GL_EXT_timer_query"))) {
+ qWarning("QOpenGLTimerQuery requires one of:\n"
+ " OpenGL 3.3 or newer,\n"
+ " OpenGL 3.2 and the ARB_timer_query extension\n"
+ " or the EXT_timer query extension");
+ return false;
+ }
+
+ core->glGenQueries(1, &timer);
+ return (timer != 0);
+}
+
+void QOpenGLTimerQueryPrivate::destroy()
+{
+ if (!timer)
+ return;
+
+ core->glDeleteQueries(1, &timer);
+ timer = 0;
+ context = nullptr;
+}
+
+// GL_TIME_ELAPSED_EXT is not defined on OS X 10.6
+#if !defined(GL_TIME_ELAPSED_EXT)
+#define GL_TIME_ELAPSED_EXT 0x88BF
+#endif
+
+// GL_TIME_ELAPSED is not defined on OS X 10.7 or 10.8 yet
+#if !defined(GL_TIME_ELAPSED)
+#define GL_TIME_ELAPSED GL_TIME_ELAPSED_EXT
+#endif
+
+void QOpenGLTimerQueryPrivate::begin()
+{
+ core->glBeginQuery(GL_TIME_ELAPSED, timer);
+}
+
+void QOpenGLTimerQueryPrivate::end()
+{
+ core->glEndQuery(GL_TIME_ELAPSED);
+}
+
+void QOpenGLTimerQueryPrivate::recordTimestamp()
+{
+ // Don't call glQueryCounter if we only have EXT_timer_query
+#if defined(GL_TIMESTAMP)
+ if (!ext)
+ core->glQueryCounter(timer, GL_TIMESTAMP);
+ else
+ qWarning("QOpenGLTimerQuery::recordTimestamp() requires OpenGL 3.3 or GL_ARB_timer_query");
+#else
+ qWarning("QOpenGLTimerQuery::recordTimestamp() requires OpenGL 3.3 or GL_ARB_timer_query");
+#endif
+}
+
+GLuint64 QOpenGLTimerQueryPrivate::waitForTimeStamp() const
+{
+ GLint64 tmp = 0;
+#if defined(GL_TIMESTAMP)
+ if (!ext)
+ core->glGetInteger64v(GL_TIMESTAMP, &tmp);
+ else
+ qWarning("QOpenGLTimerQuery::waitForTimestamp() requires OpenGL 3.3 or GL_ARB_timer_query");
+#else
+ qWarning("QOpenGLTimerQuery::waitForTimestamp() requires OpenGL 3.3 or GL_ARB_timer_query");
+#endif
+ GLuint64 timestamp(tmp);
+ return timestamp;
+}
+
+bool QOpenGLTimerQueryPrivate::isResultAvailable() const
+{
+ GLuint available = GL_FALSE;
+ core->glGetQueryObjectuiv(timer, GL_QUERY_RESULT_AVAILABLE, &available);
+ return available;
+}
+
+GLuint64 QOpenGLTimerQueryPrivate::result() const
+{
+ if (!ext)
+ core->glGetQueryObjectui64v(timer, GL_QUERY_RESULT, &timeInterval);
+ else
+ ext->glGetQueryObjectui64vEXT(timer, GL_QUERY_RESULT, &timeInterval);
+ return timeInterval;
+}
+
+/*!
+ \class QOpenGLTimerQuery
+ \brief The QOpenGLTimerQuery class wraps an OpenGL timer query object.
+ \inmodule QtOpenGL
+ \since 5.1
+ \ingroup painting-3D
+
+ OpenGL timer query objects are OpenGL managed resources to measure the
+ execution times of sequences of OpenGL commands on the GPU.
+
+ OpenGL offers various levels of support for timer queries, depending on
+ the version of OpenGL you have and the presence of the ARB_timer_query or
+ EXT_timer_query extensions. The support can be summarized as:
+
+ \list
+ \li OpenGL >=3.3 offers full support for all timer query functionality.
+ \li OpenGL 3.2 with the ARB_timer_query extension offers full support
+ for all timer query functionality.
+ \li OpenGL <=3.2 with the EXT_timer_query extension offers limited support
+ in that the timestamp of the GPU cannot be queried. Places where this
+ impacts functions provided by Qt classes will be highlighted in the
+ function documentation.
+ \li OpenGL ES 2 (and OpenGL ES 3) do not provide any support for OpenGL
+ timer queries.
+ \endlist
+
+ OpenGL represents time with a granularity of 1 nanosecond (1e-9 seconds). As a
+ consequence of this, 32-bit integers would only give a total possible duration
+ of approximately 4 seconds, which would not be difficult to exceed in poorly
+ performing or lengthy operations. OpenGL therefore uses 64 bit integer types
+ to represent times. A GLuint64 variable has enough width to contain a duration
+ of hundreds of years, which is plenty for real-time rendering needs.
+
+ As with the other Qt OpenGL classes, QOpenGLTimerQuery has a create()
+ function to create the underlying OpenGL object. This is to allow the developer to
+ ensure that there is a valid current OpenGL context at the time.
+
+ Once created, timer queries can be issued in one of several ways. The simplest
+ method is to delimit a block of commands with calls to begin() and end(). This
+ instructs OpenGL to measure the time taken from completing all commands issued
+ prior to begin() until the completion of all commands issued prior to end().
+
+ At the end of a frame we can retrieve the results by calling waitForResult().
+ As this function's name implies, it blocks CPU execution until OpenGL notifies
+ that the timer query result is available. To avoid blocking, you can check
+ if the query result is available by calling isResultAvailable(). Note that
+ modern GPUs are deeply pipelined and query results may not become available for
+ between 1-5 frames after they were issued.
+
+ Note that OpenGL does not permit nesting or interleaving of multiple timer queries
+ using begin() and end(). Using multiple timer queries and recordTimestamp() avoids
+ this limitation. When using recordTimestamp() the result can be obtained at
+ some later time using isResultAvailable() and waitForResult(). Qt provides the
+ convenience class QOpenGLTimeMonitor that helps with using multiple query objects.
+
+ \sa QOpenGLTimeMonitor
+*/
+
+/*!
+ Creates a QOpenGLTimerQuery instance with the given \a parent. You must call create()
+ with a valid OpenGL context before using.
+*/
+QOpenGLTimerQuery::QOpenGLTimerQuery(QObject *parent)
+ : QObject(*new QOpenGLTimerQueryPrivate, parent)
+{
+}
+
+/*!
+ Destroys the QOpenGLTimerQuery and the underlying OpenGL resource.
+*/
+QOpenGLTimerQuery::~QOpenGLTimerQuery()
+{
+ QOpenGLContext* ctx = QOpenGLContext::currentContext();
+
+ Q_D(QOpenGLTimerQuery);
+ QOpenGLContext *oldContext = nullptr;
+ if (d->context != ctx) {
+ oldContext = ctx;
+ if (d->context->makeCurrent(oldContext->surface())) {
+ ctx = d->context;
+ } else {
+ qWarning("QOpenGLTimerQuery::~QOpenGLTimerQuery() failed to make query objects's context current");
+ ctx = nullptr;
+ }
+ }
+
+ if (ctx)
+ destroy();
+
+ if (oldContext) {
+ if (!oldContext->makeCurrent(oldContext->surface()))
+ qWarning("QOpenGLTimerQuery::~QOpenGLTimerQuery() failed to restore current context");
+ }
+}
+
+/*!
+ Creates the underlying OpenGL timer query object. There must be a valid OpenGL context
+ that supports query objects current for this function to succeed.
+
+ Returns \c true if the OpenGL timer query object was successfully created.
+*/
+bool QOpenGLTimerQuery::create()
+{
+ Q_D(QOpenGLTimerQuery);
+ return d->create();
+}
+
+/*!
+ Destroys the underlying OpenGL timer query object. The context that was current when
+ create() was called must be current when calling this function.
+*/
+void QOpenGLTimerQuery::destroy()
+{
+ Q_D(QOpenGLTimerQuery);
+ d->destroy();
+}
+
+/*!
+ Returns \c true if the underlying OpenGL query object has been created. If this
+ returns \c true and the associated OpenGL context is current, then you are able to issue
+ queries with this object.
+*/
+bool QOpenGLTimerQuery::isCreated() const
+{
+ Q_D(const QOpenGLTimerQuery);
+ return (d->timer != 0);
+}
+
+/*!
+ Returns the id of the underlying OpenGL query object.
+*/
+GLuint QOpenGLTimerQuery::objectId() const
+{
+ Q_D(const QOpenGLTimerQuery);
+ return d->timer;
+}
+
+/*!
+ Marks the start point in the OpenGL command queue for a sequence of commands to
+ be timed by this query object.
+
+ This is useful for simple use-cases. Usually it is better to use recordTimestamp().
+
+ \sa end(), isResultAvailable(), waitForResult(), recordTimestamp()
+*/
+void QOpenGLTimerQuery::begin()
+{
+ Q_D(QOpenGLTimerQuery);
+ d->begin();
+}
+
+/*!
+ Marks the end point in the OpenGL command queue for a sequence of commands to
+ be timed by this query object.
+
+ This is useful for simple use-cases. Usually it is better to use recordTimestamp().
+
+ \sa begin(), isResultAvailable(), waitForResult(), recordTimestamp()
+*/
+void QOpenGLTimerQuery::end()
+{
+ Q_D(QOpenGLTimerQuery);
+ d->end();
+}
+
+/*!
+ Places a marker in the OpenGL command queue for the GPU to record the timestamp
+ when this marker is reached by the GPU. This function is non-blocking and the
+ result will become available at some later time.
+
+ The availability of the result can be checked with isResultAvailable(). The result
+ can be fetched with waitForResult() which will block if the result is not yet
+ available.
+
+ \sa waitForResult(), isResultAvailable(), begin(), end()
+*/
+void QOpenGLTimerQuery::recordTimestamp()
+{
+ Q_D(QOpenGLTimerQuery);
+ return d->recordTimestamp();
+}
+
+/*!
+ Returns the current timestamp of the GPU when all previously issued OpenGL
+ commands have been received but not necessarily executed by the GPU.
+
+ This function blocks until the result is returned.
+
+ \sa recordTimestamp()
+*/
+GLuint64 QOpenGLTimerQuery::waitForTimestamp() const
+{
+ Q_D(const QOpenGLTimerQuery);
+ return d->waitForTimeStamp();
+}
+
+/*!
+ Returns \c true if the OpenGL timer query result is available.
+
+ This function is non-blocking and ideally should be used to check for the
+ availability of the query result before calling waitForResult().
+
+ \sa waitForResult()
+*/
+bool QOpenGLTimerQuery::isResultAvailable() const
+{
+ Q_D(const QOpenGLTimerQuery);
+ return d->isResultAvailable();
+}
+
+/*!
+ Returns the result of the OpenGL timer query.
+
+ This function will block until the result is made available by OpenGL. It is
+ recommended to call isResultAvailable() to ensure that the result is available
+ to avoid unnecessary blocking and stalling.
+
+ \sa isResultAvailable()
+*/
+GLuint64 QOpenGLTimerQuery::waitForResult() const
+{
+ Q_D(const QOpenGLTimerQuery);
+ return d->result();
+}
+
+
+class QOpenGLTimeMonitorPrivate : public QObjectPrivate
+{
+public:
+ QOpenGLTimeMonitorPrivate()
+ : QObjectPrivate(),
+ timers(),
+ timeSamples(),
+ context(nullptr),
+ core(nullptr),
+ ext(nullptr),
+ requestedSampleCount(2),
+ currentSample(-1),
+ timerQueryActive(false)
+ {
+ }
+
+ ~QOpenGLTimeMonitorPrivate()
+ {
+ delete core;
+ delete ext;
+ }
+
+ bool create();
+ void destroy();
+ void recordSample();
+ bool isResultAvailable() const;
+ QVector<GLuint64> samples() const;
+ QVector<GLuint64> intervals() const;
+ void reset();
+
+ QVector<GLuint> timers;
+ mutable QVector<GLuint64> timeSamples;
+
+ QOpenGLContext *context;
+ QOpenGLQueryHelper *core;
+ QExtTimerQueryHelper *ext;
+
+ int requestedSampleCount;
+ int currentSample;
+ mutable bool timerQueryActive;
+};
+
+bool QOpenGLTimeMonitorPrivate::create()
+{
+ if (!timers.isEmpty() && timers.at(0) != 0 && timers.size() == requestedSampleCount)
+ return true;
+
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (context && context != ctx) {
+ qWarning("QTimeMonitor: Attempting to use different OpenGL context to recreate timers.\n"
+ "Please call destroy() first or use the same context to previously create");
+ return false;
+ }
+
+ context = ctx;
+ if (!context) {
+ qWarning("A current OpenGL context is required to create timer query objects");
+ return false;
+ }
+
+ // Resize the vectors that hold the timers and the recorded samples
+ timers.resize(requestedSampleCount);
+ timeSamples.resize(requestedSampleCount);
+
+ // Resolve the functions provided by OpenGL 1.5 and OpenGL 3.3 or ARB_timer_query
+ core = new QOpenGLQueryHelper(context);
+
+ // Check to see if we also need to resolve the functions for EXT_timer_query
+ QSurfaceFormat f = context->format();
+ if (f.version() <= qMakePair<int, int>(3, 2)
+ && !context->hasExtension(QByteArrayLiteral("GL_ARB_timer_query"))
+ && context->hasExtension(QByteArrayLiteral("GL_EXT_timer_query"))) {
+ ext = new QExtTimerQueryHelper(context);
+ } else if (f.version() <= qMakePair<int, int>(3, 2)
+ && !context->hasExtension(QByteArrayLiteral("GL_ARB_timer_query"))
+ && !context->hasExtension(QByteArrayLiteral("GL_EXT_timer_query"))) {
+ qWarning("QOpenGLTimeMonitor requires one of:\n"
+ " OpenGL 3.3 or newer,\n"
+ " OpenGL 3.2 and the ARB_timer_query extension\n"
+ " or the EXT_timer query extension");
+ return false;
+ }
+
+ core->glGenQueries(requestedSampleCount, timers.data());
+ return (timers.at(0) != 0);
+}
+
+void QOpenGLTimeMonitorPrivate::destroy()
+{
+ if (timers.isEmpty() || timers.at(0) == 0)
+ return;
+
+ core->glDeleteQueries(timers.size(), timers.data());
+ timers.clear();
+ delete core;
+ core = nullptr;
+ delete ext;
+ ext = nullptr;
+ context = nullptr;
+}
+
+void QOpenGLTimeMonitorPrivate::recordSample()
+{
+ // Use glQueryCounter() and GL_TIMESTAMP where available.
+ // Otherwise, simulate it with glBeginQuery()/glEndQuery()
+ if (!ext) {
+#if defined(GL_TIMESTAMP)
+ core->glQueryCounter(timers.at(++currentSample), GL_TIMESTAMP);
+#endif
+ } else {
+ if (currentSample == -1) {
+ core->glBeginQuery(GL_TIME_ELAPSED_EXT, timers.at(++currentSample));
+ timerQueryActive = true;
+ } else if (currentSample < timers.size() - 1) {
+ core->glEndQuery(GL_TIME_ELAPSED_EXT);
+ core->glBeginQuery(GL_TIME_ELAPSED_EXT, timers.at(++currentSample));
+ } else {
+ if (timerQueryActive) {
+ core->glEndQuery(GL_TIME_ELAPSED_EXT);
+ timerQueryActive = false;
+ }
+ }
+ }
+}
+
+bool QOpenGLTimeMonitorPrivate::isResultAvailable() const
+{
+ // The OpenGL spec says that if a query result is ready then the results of all queries
+ // of the same type issued before it must also be ready. Therefore we only need to check
+ // the availability of the result for the last issued query
+ GLuint available = GL_FALSE;
+ core->glGetQueryObjectuiv(timers.at(currentSample), GL_QUERY_RESULT_AVAILABLE, &available);
+ return available;
+}
+
+QVector<GLuint64> QOpenGLTimeMonitorPrivate::samples() const
+{
+ // For the Core and ARB options just ask for the timestamp for each timer query.
+ // For the EXT implementation we cannot obtain timestamps so we defer any result
+ // collection to the intervals() function
+ if (!ext) {
+ for (int i = 0; i <= currentSample; ++i)
+ core->glGetQueryObjectui64v(timers.at(i), GL_QUERY_RESULT, &timeSamples[i]);
+ } else {
+ qWarning("QOpenGLTimeMonitor::samples() requires OpenGL >=3.3\n"
+ "or OpenGL 3.2 and GL_ARB_timer_query");
+ }
+ return timeSamples;
+}
+
+QVector<GLuint64> QOpenGLTimeMonitorPrivate::intervals() const
+{
+ QVector<GLuint64> intervals(timers.size() - 1);
+ if (!ext) {
+ // Obtain the timestamp samples and calculate the interval durations
+ const QVector<GLuint64> timeStamps = samples();
+ for (int i = 0; i < intervals.size(); ++i)
+ intervals[i] = timeStamps[i+1] - timeStamps[i];
+ } else {
+ // Stop the last timer if needed
+ if (timerQueryActive) {
+ core->glEndQuery(GL_TIME_ELAPSED_EXT);
+ timerQueryActive = false;
+ }
+
+ // Obtain the results from all timers apart from the redundant last one. In this
+ // case the results actually are the intervals not timestamps
+ for (int i = 0; i < currentSample; ++i)
+ ext->glGetQueryObjectui64vEXT(timers.at(i), GL_QUERY_RESULT, &intervals[i]);
+ }
+
+ return intervals;
+}
+
+void QOpenGLTimeMonitorPrivate::reset()
+{
+ currentSample = -1;
+ timeSamples.fill(0);
+}
+
+
+/*!
+ \class QOpenGLTimeMonitor
+ \brief The QOpenGLTimeMonitor class wraps a sequence of OpenGL timer query objects.
+ \inmodule QtOpenGL
+ \since 5.1
+ \ingroup painting-3D
+
+ The QOpenGLTimeMonitor class is a convenience wrapper around a collection of OpenGL
+ timer query objects used to measure intervals of time on the GPU to the level of
+ granularity required by your rendering application.
+
+ The OpenGL timer queries objects are queried in sequence to record the GPU
+ timestamps at positions of interest in your rendering code. Once the results for
+ all issues timer queries become available, the results can be fetched and
+ QOpenGLTimerMonitor will calculate the recorded time intervals for you.
+
+ The typical use case of this class is to either profile your application's rendering
+ algorithms or to adjust those algorithms in real-time for dynamic performance/quality
+ balancing.
+
+ Prior to using QOpenGLTimeMonitor in your rendering function you should set the
+ required number of sample points that you wish to record by calling setSamples(). Note
+ that measuring N sample points will produce N-1 time intervals. Once you have set the
+ number of sample points, call the create() function with a valid current OpenGL context
+ to create the necessary query timer objects. These steps are usually performed just
+ once in an initialization function.
+
+ Use the recordSample() function to delimit blocks of code containing OpenGL commands
+ that you wish to time. You can check availability of the resulting time
+ samples and time intervals with isResultAvailable(). The calculated time intervals and
+ the raw timestamp samples can be retrieved with the blocking waitForIntervals() and
+ waitForSamples() functions respectively.
+
+ After retrieving the results and before starting a new round of taking samples
+ (for example, in the next frame) be sure to call the reset() function which will clear
+ the cached results and reset the timer index back to the first timer object.
+
+ \sa QOpenGLTimerQuery
+*/
+
+/*!
+ Creates a QOpenGLTimeMonitor instance with the given \a parent. You must call create()
+ with a valid OpenGL context before using.
+
+ \sa setSampleCount(), create()
+*/
+QOpenGLTimeMonitor::QOpenGLTimeMonitor(QObject *parent)
+ : QObject(*new QOpenGLTimeMonitorPrivate, parent)
+{
+}
+
+/*!
+ Destroys the QOpenGLTimeMonitor and any underlying OpenGL resources.
+*/
+QOpenGLTimeMonitor::~QOpenGLTimeMonitor()
+{
+ QOpenGLContext* ctx = QOpenGLContext::currentContext();
+
+ Q_D(QOpenGLTimeMonitor);
+ QOpenGLContext *oldContext = nullptr;
+ if (d->context != ctx) {
+ oldContext = ctx;
+ if (d->context->makeCurrent(oldContext->surface())) {
+ ctx = d->context;
+ } else {
+ qWarning("QOpenGLTimeMonitor::~QOpenGLTimeMonitor() failed to make time monitor's context current");
+ ctx = nullptr;
+ }
+ }
+
+ if (ctx)
+ destroy();
+
+ if (oldContext) {
+ if (!oldContext->makeCurrent(oldContext->surface()))
+ qWarning("QOpenGLTimeMonitor::~QOpenGLTimeMonitor() failed to restore current context");
+ }
+}
+
+/*!
+ Sets the number of sample points to \a sampleCount. After setting the number
+ of samples with this function, you must call create() to instantiate the underlying
+ OpenGL timer query objects.
+
+ The new \a sampleCount must be at least 2.
+
+ \sa sampleCount(), create(), recordSample()
+*/
+void QOpenGLTimeMonitor::setSampleCount(int sampleCount)
+{
+ // We need at least 2 samples to get an interval
+ if (sampleCount < 2)
+ return;
+ Q_D(QOpenGLTimeMonitor);
+ d->requestedSampleCount = sampleCount;
+}
+
+/*!
+ Returns the number of sample points that have been requested with
+ setSampleCount(). If create was successfully called following setSampleCount(),
+ then the value returned will be the actual number of sample points
+ that can be used.
+
+ The default value for sample count is 2, leading to the measurement of a
+ single interval.
+
+ \sa setSampleCount()
+*/
+int QOpenGLTimeMonitor::sampleCount() const
+{
+ Q_D(const QOpenGLTimeMonitor);
+ return d->requestedSampleCount;
+}
+
+/*!
+ Instantiate sampleCount() OpenGL timer query objects that will be used
+ to track the amount of time taken to execute OpenGL commands between
+ successive calls to recordSample().
+
+ Returns \c true if the OpenGL timer query objects could be created.
+
+ \sa destroy(), setSampleCount(), recordSample()
+*/
+bool QOpenGLTimeMonitor::create()
+{
+ Q_D(QOpenGLTimeMonitor);
+ return d->create();
+}
+
+/*!
+ Destroys any OpenGL timer query objects used within this instance.
+
+ \sa create()
+*/
+void QOpenGLTimeMonitor::destroy()
+{
+ Q_D(QOpenGLTimeMonitor);
+ d->destroy();
+}
+
+/*!
+ Returns \c true if the underlying OpenGL query objects have been created. If this
+ returns \c true and the associated OpenGL context is current, then you are able to record
+ time samples with this object.
+*/
+bool QOpenGLTimeMonitor::isCreated() const
+{
+ Q_D(const QOpenGLTimeMonitor);
+ return (!d->timers.isEmpty() && d->timers.at(0) != 0);
+}
+
+/*!
+ Returns a QVector containing the object Ids of the OpenGL timer query objects.
+*/
+QVector<GLuint> QOpenGLTimeMonitor::objectIds() const
+{
+ Q_D(const QOpenGLTimeMonitor);
+ return d->timers;
+}
+
+/*!
+ Issues an OpenGL timer query at this point in the OpenGL command queue. Calling this
+ function in a sequence in your application's rendering function, will build up
+ details of the GPU time taken to execute the OpenGL commands between successive
+ calls to this function.
+
+ \sa setSampleCount(), isResultAvailable(), waitForSamples(), waitForIntervals()
+*/
+int QOpenGLTimeMonitor::recordSample()
+{
+ Q_D(QOpenGLTimeMonitor);
+ d->recordSample();
+ return d->currentSample;
+}
+
+/*!
+ Returns \c true if the OpenGL timer query results are available.
+
+ \sa waitForSamples(), waitForIntervals()
+*/
+bool QOpenGLTimeMonitor::isResultAvailable() const
+{
+ Q_D(const QOpenGLTimeMonitor);
+ return d->isResultAvailable();
+}
+
+/*!
+ Returns a QVector containing the GPU timestamps taken with recordSample().
+
+ This function will block until OpenGL indicates the results are available. It
+ is recommended to check the availability of the result prior to calling this
+ function with isResultAvailable().
+
+ \note This function only works on systems that have OpenGL >=3.3 or the
+ ARB_timer_query extension. See QOpenGLTimerQuery for more details.
+
+ \sa waitForIntervals(), isResultAvailable()
+*/
+QVector<GLuint64> QOpenGLTimeMonitor::waitForSamples() const
+{
+ Q_D(const QOpenGLTimeMonitor);
+ return d->samples();
+}
+
+/*!
+ Returns a QVector containing the time intervals delimited by the calls to
+ recordSample(). The resulting vector will contain one fewer element as
+ this represents the intervening intervals rather than the actual timestamp
+ samples.
+
+ This function will block until OpenGL indicates the results are available. It
+ is recommended to check the availability of the result prior to calling this
+ function with isResultAvailable().
+
+ \sa waitForSamples(), isResultAvailable()
+*/
+QVector<GLuint64> QOpenGLTimeMonitor::waitForIntervals() const
+{
+ Q_D(const QOpenGLTimeMonitor);
+ return d->intervals();
+}
+
+/*!
+ Resets the time monitor ready for use in another frame of rendering. Call
+ this once you have obtained the previous results and before calling
+ recordSample() for the first time on the next frame.
+
+ \sa recordSample()
+*/
+void QOpenGLTimeMonitor::reset()
+{
+ Q_D(QOpenGLTimeMonitor);
+ d->reset();
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopengltimerquery.h b/src/opengl/qopengltimerquery.h
new file mode 100644
index 0000000000..fa0e5b3203
--- /dev/null
+++ b/src/opengl/qopengltimerquery.h
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLTIMERQUERY_H
+#define QOPENGLTIMERQUERY_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
+
+#include <QtCore/QObject>
+#include <QtGui/qopengl.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLTimerQueryPrivate;
+
+class Q_OPENGL_EXPORT QOpenGLTimerQuery : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit QOpenGLTimerQuery(QObject *parent = nullptr);
+ ~QOpenGLTimerQuery();
+
+ bool create();
+ void destroy();
+ bool isCreated() const;
+ GLuint objectId() const;
+
+ void begin();
+ void end();
+ GLuint64 waitForTimestamp() const;
+ void recordTimestamp();
+ bool isResultAvailable() const;
+ GLuint64 waitForResult() const;
+
+private:
+ Q_DECLARE_PRIVATE(QOpenGLTimerQuery)
+ Q_DISABLE_COPY(QOpenGLTimerQuery)
+};
+
+
+class QOpenGLTimeMonitorPrivate;
+
+class Q_OPENGL_EXPORT QOpenGLTimeMonitor : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit QOpenGLTimeMonitor(QObject *parent = nullptr);
+ ~QOpenGLTimeMonitor();
+
+ void setSampleCount(int sampleCount);
+ int sampleCount() const;
+
+ bool create();
+ void destroy();
+ bool isCreated() const;
+ QVector<GLuint> objectIds() const;
+
+ int recordSample();
+
+ bool isResultAvailable() const;
+
+ QVector<GLuint64> waitForSamples() const;
+ QVector<GLuint64> waitForIntervals() const;
+
+ void reset();
+
+private:
+ Q_DECLARE_PRIVATE(QOpenGLTimeMonitor)
+ Q_DISABLE_COPY(QOpenGLTimeMonitor)
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL
+
+#endif // QOPENGLTIMERQUERY_H
diff --git a/src/opengl/qopenglversionfunctions.cpp b/src/opengl/qopenglversionfunctions.cpp
new file mode 100644
index 0000000000..64d9d11218
--- /dev/null
+++ b/src/opengl/qopenglversionfunctions.cpp
@@ -0,0 +1,374 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglversionfunctions.h"
+#include "qopenglversionfunctions_p.h"
+#include "qopenglcontext.h"
+#include "qdebug.h"
+
+QT_BEGIN_NAMESPACE
+
+QOpenGLContextVersionData::~QOpenGLContextVersionData()
+{
+ for (auto *f : qAsConst(externalFunctions)) {
+ auto *fp = QAbstractOpenGLFunctionsPrivate::get(f);
+ fp->owningContext = nullptr;
+ fp->initialized = false;
+ }
+ externalFunctions.clear();
+ qDeleteAll(functions);
+ functions.clear();
+}
+
+QOpenGLContextVersionData *QOpenGLContextVersionData::forContext(QOpenGLContext *context)
+{
+ QOpenGLContextPrivate *context_d = QOpenGLContextPrivate::get(context);
+ if (context_d->versionFunctions == nullptr)
+ context_d->versionFunctions = new QOpenGLContextVersionData;
+
+ return static_cast<QOpenGLContextVersionData *>(context_d->versionFunctions);
+}
+
+#define QT_OPENGL_COUNT_FUNCTIONS(ret, name, args) +1
+#define QT_OPENGL_FUNCTION_NAMES(ret, name, args) \
+ "gl"#name"\0"
+#define QT_OPENGL_IMPLEMENT(CLASS, FUNCTIONS) \
+void CLASS::init() \
+{ \
+ const char *names = FUNCTIONS(QT_OPENGL_FUNCTION_NAMES); \
+ const char *name = names; \
+ for (int i = 0; i < FUNCTIONS(QT_OPENGL_COUNT_FUNCTIONS); ++i) { \
+ functions[i] = context->getProcAddress(name); \
+ name += strlen(name) + 1; \
+ } \
+}
+
+QOpenGLVersionFunctionsStorage::QOpenGLVersionFunctionsStorage()
+ : backends(nullptr)
+{
+}
+
+QOpenGLVersionFunctionsStorage::~QOpenGLVersionFunctionsStorage()
+{
+#if !QT_CONFIG(opengles2)
+ if (backends) {
+
+ int i = 0;
+
+#define DELETE_BACKEND(X) \
+ if (backends[i] && !--backends[i]->refs) \
+ delete static_cast<QOpenGLFunctions_##X##Backend*>(backends[i]); \
+ ++i;
+
+ QT_OPENGL_VERSIONS(DELETE_BACKEND)
+#undef DELETE_BACKEND
+ delete[] backends;
+ }
+#endif
+}
+
+QOpenGLVersionFunctionsBackend *QOpenGLVersionFunctionsStorage::backend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v)
+{
+#if QT_CONFIG(opengles2)
+ Q_UNUSED(context);
+ Q_UNUSED(v);
+ return 0;
+#else
+ if (!backends) {
+ backends = new QOpenGLVersionFunctionsBackend *[QOpenGLVersionFunctionsBackend::OpenGLVersionBackendCount];
+ memset(backends, 0, sizeof(QOpenGLVersionFunctionsBackend *)*QOpenGLVersionFunctionsBackend::OpenGLVersionBackendCount);
+ }
+ if (backends[v])
+ return backends[v];
+
+ switch(v) {
+#define VERSION_ENUM(X) QOpenGLVersionFunctionsBackend::OpenGL_##X
+#define CREATE_BACKEND(X) \
+ case VERSION_ENUM(X): \
+ backends[VERSION_ENUM(X)] = new QOpenGLFunctions_##X##Backend(context); \
+ break;
+ QT_OPENGL_VERSIONS(CREATE_BACKEND)
+ case QOpenGLVersionFunctionsBackend::OpenGLVersionBackendCount:
+ Q_UNREACHABLE();
+ }
+ // the storage keeps one ref
+ ++backends[v]->refs;
+ return backends[v];
+#endif
+}
+
+QOpenGLVersionFunctionsBackend *QAbstractOpenGLFunctionsPrivate::functionsBackend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v)
+{
+ Q_ASSERT(context);
+ return QOpenGLContextVersionData::forContext(context)->functionsStorage.backend(context, v);
+}
+
+void QAbstractOpenGLFunctionsPrivate::insertExternalFunctions(QOpenGLContext *context, QAbstractOpenGLFunctions *f)
+{
+ Q_ASSERT(context);
+ QOpenGLContextVersionData::forContext(context)->externalFunctions.insert(f);
+}
+
+void QAbstractOpenGLFunctionsPrivate::removeExternalFunctions(QOpenGLContext *context, QAbstractOpenGLFunctions *f)
+{
+ Q_ASSERT(context);
+ QOpenGLContextVersionData::forContext(context)->externalFunctions.remove(f);
+}
+
+/*!
+ \class QAbstractOpenGLFunctions
+ \inmodule QtOpenGL
+ \since 5.1
+ \brief The QAbstractOpenGLFunctions class is the base class of a family of
+ classes that expose all functions for each OpenGL version and
+ profile.
+
+ OpenGL implementations on different platforms are able to link to a variable
+ number of OpenGL functions depending upon the OpenGL ABI on that platform.
+ For example, on Microsoft Windows only functions up to those in OpenGL 1.1
+ can be linked to at build time. All other functions must be resolved at
+ runtime. The traditional solution to this has been to use either
+ QOpenGLContext::getProcAddress() or QOpenGLFunctions. The former is tedious
+ and error prone and means dealing directly with function pointers. The
+ latter only exposes those functions common to OpenGL ES 2 and desktop
+ OpenGL. There is however much new OpenGL functionality that is useful when
+ writing real world OpenGL applications.
+
+ Qt now provides a family of classes which all inherit from
+ QAbstractOpenGLFunctions which expose every core OpenGL function by way of a
+ corresponding member function. There is a class for every valid combination
+ of OpenGL version and profile. Each class follows the naming convention:
+ \badcode
+ QOpenGLFunctions_<MAJOR VERSION>_<MINOR VERSION>[_PROFILE]
+ \endcode
+
+ For OpenGL versions 1.0 through to 3.0 there are no profiles, leading to the
+ classes:
+
+ \list
+ \li QOpenGLFunctions_1_0
+ \li QOpenGLFunctions_1_1
+ \li QOpenGLFunctions_1_2
+ \li QOpenGLFunctions_1_3
+ \li QOpenGLFunctions_1_4
+ \li QOpenGLFunctions_1_5
+ \li QOpenGLFunctions_2_0
+ \li QOpenGLFunctions_2_1
+ \li QOpenGLFunctions_3_0
+ \endlist
+
+ where each class inherits from QAbstractOpenGLFunctions.
+
+ OpenGL version 3.1 removed many deprecated functions leading to a much
+ simpler and generic API.
+
+ With OpenGL 3.2 the concept of profiles was introduced. Two profiles are
+ currently defined for OpenGL: Core and Compatibility.
+
+ The Core profile does not include any of the functions that were removed
+ in OpenGL 3.1. The Compatibility profile contains all functions in the
+ Core profile of the same version plus all of the functions that were
+ removed in OpenGL 3.1. In this way the Compatibility profile classes allow
+ use of newer OpenGL functionality but also allows you to keep using your
+ legacy OpenGL code. For new OpenGL code the Core profile should be
+ preferred.
+
+ Please note that some vendors, notably Apple, do not implement the
+ Compatibility profile. Therefore if you wish to target new OpenGL features
+ on \macos then you should ensure that you request a Core profile context via
+ QSurfaceFormat::setProfile().
+
+ Qt provides classes for all version and Core and Compatibility profile
+ combinations. The classes for OpenGL versions 3.1 through to 4.3 are:
+
+ \list
+ \li QOpenGLFunctions_3_1
+ \li QOpenGLFunctions_3_2_Core
+ \li QOpenGLFunctions_3_2_Compatibility
+ \li QOpenGLFunctions_3_3_Core
+ \li QOpenGLFunctions_3_3_Compatibility
+ \li QOpenGLFunctions_4_0_Core
+ \li QOpenGLFunctions_4_0_Compatibility
+ \li QOpenGLFunctions_4_1_Core
+ \li QOpenGLFunctions_4_1_Compatibility
+ \li QOpenGLFunctions_4_2_Core
+ \li QOpenGLFunctions_4_2_Compatibility
+ \li QOpenGLFunctions_4_3_Core
+ \li QOpenGLFunctions_4_3_Compatibility
+ \endlist
+
+ where each class inherits from QAbstractOpenGLFunctions.
+
+ A pointer to an object of the class corresponding to the version and
+ profile of OpenGL in use can be obtained from
+ QOpenGLContext::versionFunctions(). If obtained in this way, note that
+ the QOpenGLContext retains ownership of the object. This is so that only
+ one instance need be created.
+
+ Before calling any of the exposed OpenGL functions you must ensure that the
+ object has resolved the function pointers to the OpenGL functions. This
+ only needs to be done once per instance with initializeOpenGLFunctions().
+ Once initialized, the object can be used to call any OpenGL function for
+ the corresponding version and profile. Note that initializeOpenGLFunctions()
+ can fail in some circumstances so check the return value. Situations in
+ which initialization can fail are if you have a functions object for a version
+ or profile that contains functions that are not part of the context being
+ used to resolve the function pointers.
+
+ If you exclusively use function objects then you will get compile time
+ errors if you attempt to use a function not included in that version and
+ profile. This is obviously a lot easier to debug than undefined behavior
+ at run time.
+
+ \sa QOpenGLContext::versionFunctions()
+*/
+/*!
+ Constructs a QAbstractOpenGLFunctions object.
+*/
+QAbstractOpenGLFunctions::QAbstractOpenGLFunctions()
+ : d_ptr(new QAbstractOpenGLFunctionsPrivate)
+{
+}
+
+/*!
+ Destroys a QAbstractOpenGLFunctions object.
+*/
+QAbstractOpenGLFunctions::~QAbstractOpenGLFunctions()
+{
+ Q_D(QAbstractOpenGLFunctions);
+ if (d->owningContext)
+ d->removeExternalFunctions(d->owningContext, this);
+ delete d_ptr;
+}
+
+/*! \internal
+ */
+bool QAbstractOpenGLFunctions::initializeOpenGLFunctions()
+{
+ Q_D(QAbstractOpenGLFunctions);
+ d->initialized = true;
+
+ // For a subclass whose instance is not created via
+ // QOpenGLContext::versionFunctions() owningContext is not set. Set it now
+ // and register such instances to the context as external ones. These are
+ // not owned by the context but still need certain cleanup when the context
+ // is destroyed.
+ if (!d->owningContext) {
+ d->owningContext = QOpenGLContext::currentContext();
+ if (d->owningContext)
+ d->insertExternalFunctions(d->owningContext, this);
+ }
+
+ return true;
+}
+
+/*! \internal
+ */
+bool QAbstractOpenGLFunctions::isInitialized() const
+{
+ Q_D(const QAbstractOpenGLFunctions);
+ return d->initialized;
+}
+
+/*! \internal
+ */
+void QAbstractOpenGLFunctions::setOwningContext(const QOpenGLContext *context)
+{
+ Q_D(QAbstractOpenGLFunctions);
+ d->owningContext = const_cast<QOpenGLContext*>(context);
+}
+
+/*! \internal
+ */
+QOpenGLContext *QAbstractOpenGLFunctions::owningContext() const
+{
+ Q_D(const QAbstractOpenGLFunctions);
+ return d->owningContext;
+}
+
+#if !QT_CONFIG(opengles2)
+
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_0_CoreBackend, QT_OPENGL_1_0_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_1_CoreBackend, QT_OPENGL_1_1_FUNCTIONS)
+
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_2_CoreBackend, QT_OPENGL_1_2_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_3_CoreBackend, QT_OPENGL_1_3_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_4_CoreBackend, QT_OPENGL_1_4_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_5_CoreBackend, QT_OPENGL_1_5_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_2_0_CoreBackend, QT_OPENGL_2_0_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_2_1_CoreBackend, QT_OPENGL_2_1_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_0_CoreBackend, QT_OPENGL_3_0_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_1_CoreBackend, QT_OPENGL_3_1_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_2_CoreBackend, QT_OPENGL_3_2_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_3_CoreBackend, QT_OPENGL_3_3_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_0_CoreBackend, QT_OPENGL_4_0_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_1_CoreBackend, QT_OPENGL_4_1_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_2_CoreBackend, QT_OPENGL_4_2_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_3_CoreBackend, QT_OPENGL_4_3_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_4_CoreBackend, QT_OPENGL_4_4_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_5_CoreBackend, QT_OPENGL_4_5_FUNCTIONS)
+
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_0_DeprecatedBackend, QT_OPENGL_1_0_DEPRECATED_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_1_DeprecatedBackend, QT_OPENGL_1_1_DEPRECATED_FUNCTIONS)
+
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_2_DeprecatedBackend, QT_OPENGL_1_2_DEPRECATED_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_3_DeprecatedBackend, QT_OPENGL_1_3_DEPRECATED_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_1_4_DeprecatedBackend, QT_OPENGL_1_4_DEPRECATED_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_2_0_DeprecatedBackend, QT_OPENGL_2_0_DEPRECATED_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_0_DeprecatedBackend, QT_OPENGL_3_0_DEPRECATED_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_3_3_DeprecatedBackend, QT_OPENGL_3_3_DEPRECATED_FUNCTIONS)
+QT_OPENGL_IMPLEMENT(QOpenGLFunctions_4_5_DeprecatedBackend, QT_OPENGL_4_5_DEPRECATED_FUNCTIONS)
+
+#else
+
+// No backends for OpenGL ES 2
+
+#endif // !QT_CONFIG(opengles2)
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglversionfunctions.h b/src/opengl/qopenglversionfunctions.h
new file mode 100644
index 0000000000..a28a3c5d14
--- /dev/null
+++ b/src/opengl/qopenglversionfunctions.h
@@ -0,0 +1,1912 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_H
+#define QOPENGLVERSIONFUNCTIONS_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#ifndef QT_NO_OPENGL
+
+#if QT_DEPRECATED_SINCE(5, 6)
+#include <QtCore/qhash.h>
+#endif
+#include <QtCore/qhashfunctions.h>
+#include <QtCore/qpair.h>
+#include <QtGui/qopengl.h>
+
+// MemoryBarrier is a macro on some architectures on Windows
+#ifdef Q_OS_WIN
+#pragma push_macro("MemoryBarrier")
+#undef MemoryBarrier
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLContext;
+
+#if 0
+// silence syncqt warnings
+#pragma qt_class(QOpenGLVersionFunctions)
+#pragma qt_sync_stop_processing
+#endif
+
+#define QOPENGL_DEPRECATEDFUNCTION \
+ qFatal("This function was erroneously included in previous versions of Qt and is here only for binary compatibility. " \
+ "If you need to use this function, please use a legacy OpenGL version or a Compatibility profile.")
+
+struct QOpenGLVersionStatus
+{
+ enum OpenGLStatus {
+ CoreStatus,
+ DeprecatedStatus,
+ InvalidStatus
+ };
+
+ Q_DECL_CONSTEXPR QOpenGLVersionStatus()
+ : version(0, 0),
+ status(InvalidStatus)
+ {}
+
+ Q_DECL_CONSTEXPR QOpenGLVersionStatus(int majorVersion, int minorVersion, QOpenGLVersionStatus::OpenGLStatus functionStatus)
+ : version(majorVersion, minorVersion),
+ status(functionStatus)
+ {}
+
+ QPair<int, int> version;
+ OpenGLStatus status;
+};
+
+inline size_t qHash(const QOpenGLVersionStatus &v, size_t seed = 0) noexcept
+{
+ return qHash(static_cast<int>(v.status * 1000)
+ + v.version.first * 100 + v.version.second * 10, seed);
+}
+
+Q_DECL_CONSTEXPR inline bool operator==(const QOpenGLVersionStatus &lhs, const QOpenGLVersionStatus &rhs)
+{
+ return lhs.status == rhs.status && lhs.version == rhs.version;
+}
+
+Q_DECL_CONSTEXPR inline bool operator!=(const QOpenGLVersionStatus &lhs, const QOpenGLVersionStatus &rhs)
+{
+ return !operator==(lhs, rhs);
+}
+
+#define QT_OPENGL_DECLARE_FUNCTIONS(ret, name, args) \
+ ret (QOPENGLF_APIENTRYP name)args;
+#define QT_OPENGL_COUNT_FUNCTIONS(ret, name, args) +1
+
+#define QT_OPENGL_DECLARE(FUNCTIONS) \
+public: \
+ struct Functions { \
+ FUNCTIONS(QT_OPENGL_DECLARE_FUNCTIONS) \
+ }; \
+ union { \
+ QFunctionPointer functions[FUNCTIONS(QT_OPENGL_COUNT_FUNCTIONS)]; \
+ Functions f; \
+ }; \
+private: \
+ void init()
+
+class QOpenGLVersionFunctionsBackend
+{
+public:
+#define QT_OPENGL_VERSIONS(F) \
+ F(1_0_Core) \
+ F(1_1_Core) \
+ F(1_2_Core) \
+ F(1_3_Core) \
+ F(1_4_Core) \
+ F(1_5_Core) \
+ F(2_0_Core) \
+ F(2_1_Core) \
+ F(3_0_Core) \
+ F(3_1_Core) \
+ F(3_2_Core) \
+ F(3_3_Core) \
+ F(4_0_Core) \
+ F(4_1_Core) \
+ F(4_2_Core) \
+ F(4_3_Core) \
+ F(4_4_Core) \
+ F(4_5_Core) \
+ F(1_0_Deprecated) \
+ F(1_1_Deprecated) \
+ F(1_2_Deprecated) \
+ F(1_3_Deprecated) \
+ F(1_4_Deprecated) \
+ F(2_0_Deprecated) \
+ F(3_0_Deprecated) \
+ F(3_3_Deprecated) \
+ F(4_5_Deprecated) \
+
+#define VERSION_ENUM(X) OpenGL_##X,
+ enum Version {
+ QT_OPENGL_VERSIONS(VERSION_ENUM)
+ OpenGLVersionBackendCount
+ };
+#undef VERSION_ENUM
+
+ QOpenGLVersionFunctionsBackend(QOpenGLContext *ctx)
+ : context(ctx)
+ {}
+
+ QOpenGLContext *context;
+ QAtomicInt refs;
+};
+
+class QOpenGLVersionFunctionsStorage
+{
+public:
+ QOpenGLVersionFunctionsStorage();
+ ~QOpenGLVersionFunctionsStorage();
+
+ QOpenGLVersionFunctionsBackend *backend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v);
+
+ QOpenGLVersionFunctionsBackend **backends;
+};
+
+class QAbstractOpenGLFunctions;
+
+class QAbstractOpenGLFunctionsPrivate
+{
+public:
+ QAbstractOpenGLFunctionsPrivate()
+ : owningContext(nullptr),
+ initialized(false)
+ {}
+
+ static QOpenGLVersionFunctionsBackend *functionsBackend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v);
+ static void insertExternalFunctions(QOpenGLContext *context, QAbstractOpenGLFunctions *f);
+ static void removeExternalFunctions(QOpenGLContext *context, QAbstractOpenGLFunctions *f);
+
+ static QAbstractOpenGLFunctionsPrivate *get(QAbstractOpenGLFunctions *q);
+
+ QOpenGLContext *owningContext;
+ bool initialized;
+};
+
+class Q_OPENGL_EXPORT QAbstractOpenGLFunctions
+{
+public:
+ virtual ~QAbstractOpenGLFunctions();
+
+ virtual bool initializeOpenGLFunctions();
+
+ Q_DISABLE_COPY(QAbstractOpenGLFunctions)
+ Q_DECLARE_PRIVATE(QAbstractOpenGLFunctions)
+
+protected:
+ QAbstractOpenGLFunctions();
+ QAbstractOpenGLFunctionsPrivate *d_ptr;
+
+ bool isInitialized() const;
+
+ void setOwningContext(const QOpenGLContext *context);
+ QOpenGLContext *owningContext() const;
+
+ friend class QOpenGLVersionFunctionsFactory;
+};
+
+inline QAbstractOpenGLFunctionsPrivate *QAbstractOpenGLFunctionsPrivate::get(QAbstractOpenGLFunctions *q)
+{
+ return q->d_func();
+}
+
+#if !QT_CONFIG(opengles2)
+
+class QOpenGLFunctions_1_0_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_1_0_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_1_0_Core; }
+
+ // OpenGL 1.0 core functions
+#define QT_OPENGL_1_0_FUNCTIONS(F) \
+ F(void, Viewport, (GLint x, GLint y, GLsizei width, GLsizei height)) \
+ F(void, DepthRange, (GLdouble nearVal, GLdouble farVal)) \
+ F(GLboolean, IsEnabled, (GLenum cap)) \
+ F(void, GetTexLevelParameteriv, (GLenum target, GLint level, GLenum pname, GLint *params)) \
+ F(void, GetTexLevelParameterfv, (GLenum target, GLint level, GLenum pname, GLfloat *params)) \
+ F(void, GetTexParameteriv, (GLenum target, GLenum pname, GLint *params)) \
+ F(void, GetTexParameterfv, (GLenum target, GLenum pname, GLfloat *params)) \
+ F(void, GetTexImage, (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)) \
+ F(const GLubyte *, GetString, (GLenum name)) \
+ F(void, GetIntegerv, (GLenum pname, GLint *data)) \
+ F(void, GetFloatv, (GLenum pname, GLfloat *data)) \
+ F(GLenum, GetError, ()) \
+ F(void, GetDoublev, (GLenum pname, GLdouble *data)) \
+ F(void, GetBooleanv, (GLenum pname, GLboolean *data)) \
+ F(void, ReadPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)) \
+ F(void, ReadBuffer, (GLenum src)) \
+ F(void, PixelStorei, (GLenum pname, GLint param)) \
+ F(void, PixelStoref, (GLenum pname, GLfloat param)) \
+ F(void, DepthFunc, (GLenum func)) \
+ F(void, StencilOp, (GLenum fail, GLenum zfail, GLenum zpass)) \
+ F(void, StencilFunc, (GLenum func, GLint ref, GLuint mask)) \
+ F(void, LogicOp, (GLenum opcode)) \
+ F(void, BlendFunc, (GLenum sfactor, GLenum dfactor)) \
+ F(void, Flush, ()) \
+ F(void, Finish, ()) \
+ F(void, Enable, (GLenum cap)) \
+ F(void, Disable, (GLenum cap)) \
+ F(void, DepthMask, (GLboolean flag)) \
+ F(void, ColorMask, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)) \
+ F(void, StencilMask, (GLuint mask)) \
+ F(void, ClearDepth, (GLdouble depth)) \
+ F(void, ClearStencil, (GLint s)) \
+ F(void, ClearColor, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) \
+ F(void, Clear, (GLbitfield mask)) \
+ F(void, DrawBuffer, (GLenum buf)) \
+ F(void, TexImage2D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) \
+ F(void, TexImage1D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) \
+ F(void, TexParameteriv, (GLenum target, GLenum pname, const GLint *params)) \
+ F(void, TexParameteri, (GLenum target, GLenum pname, GLint param)) \
+ F(void, TexParameterfv, (GLenum target, GLenum pname, const GLfloat *params)) \
+ F(void, TexParameterf, (GLenum target, GLenum pname, GLfloat param)) \
+ F(void, Scissor, (GLint x, GLint y, GLsizei width, GLsizei height)) \
+ F(void, PolygonMode, (GLenum face, GLenum mode)) \
+ F(void, PointSize, (GLfloat size)) \
+ F(void, LineWidth, (GLfloat width)) \
+ F(void, Hint, (GLenum target, GLenum mode)) \
+ F(void, FrontFace, (GLenum mode)) \
+ F(void, CullFace, (GLenum mode)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_1_0_FUNCTIONS);
+};
+
+class QOpenGLFunctions_1_1_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_1_1_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_1_1_Core; }
+
+ // OpenGL 1.1 core functions
+#define QT_OPENGL_1_1_FUNCTIONS(F) \
+ F(void, Indexubv, (const GLubyte *c)) \
+ F(void, Indexub, (GLubyte c)) \
+ F(GLboolean, IsTexture, (GLuint texture)) \
+ F(void, GenTextures, (GLsizei n, GLuint *textures)) \
+ F(void, DeleteTextures, (GLsizei n, const GLuint *textures)) \
+ F(void, BindTexture, (GLenum target, GLuint texture)) \
+ F(void, TexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)) \
+ F(void, TexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)) \
+ F(void, CopyTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)) \
+ F(void, CopyTexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)) \
+ F(void, CopyTexImage2D, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)) \
+ F(void, CopyTexImage1D, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)) \
+ F(void, PolygonOffset, (GLfloat factor, GLfloat units)) \
+ F(void, GetPointerv, (GLenum pname, GLvoid* *params)) \
+ F(void, DrawElements, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)) \
+ F(void, DrawArrays, (GLenum mode, GLint first, GLsizei count)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_1_1_FUNCTIONS);
+};
+
+class QOpenGLFunctions_1_2_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_1_2_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_1_2_Core; }
+
+ // OpenGL 1.2 core functions
+#define QT_OPENGL_1_2_FUNCTIONS(F) \
+ F(void, CopyTexSubImage3D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)) \
+ F(void, TexSubImage3D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)) \
+ F(void, TexImage3D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) \
+ F(void, DrawRangeElements, (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)) \
+ F(void, BlendEquation, (GLenum mode)) \
+ F(void, BlendColor, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_1_2_FUNCTIONS);
+};
+
+class QOpenGLFunctions_1_3_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_1_3_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_1_3_Core; }
+
+ // OpenGL 1.3 core functions
+#define QT_OPENGL_1_3_FUNCTIONS(F) \
+ F(void, GetCompressedTexImage, (GLenum target, GLint level, GLvoid *img)) \
+ F(void, CompressedTexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)) \
+ F(void, CompressedTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)) \
+ F(void, CompressedTexSubImage3D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)) \
+ F(void, CompressedTexImage1D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)) \
+ F(void, CompressedTexImage2D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)) \
+ F(void, CompressedTexImage3D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)) \
+ F(void, SampleCoverage, (GLfloat value, GLboolean invert)) \
+ F(void, ActiveTexture, (GLenum texture)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_1_3_FUNCTIONS);
+};
+
+class QOpenGLFunctions_1_4_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_1_4_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_1_4_Core; }
+
+ // OpenGL 1.4 core functions
+#define QT_OPENGL_1_4_FUNCTIONS(F) \
+ F(void, PointParameteriv, (GLenum pname, const GLint *params)) \
+ F(void, PointParameteri, (GLenum pname, GLint param)) \
+ F(void, PointParameterfv, (GLenum pname, const GLfloat *params)) \
+ F(void, PointParameterf, (GLenum pname, GLfloat param)) \
+ F(void, MultiDrawElements, (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount)) \
+ F(void, MultiDrawArrays, (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount)) \
+ F(void, BlendFuncSeparate, (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_1_4_FUNCTIONS);
+};
+
+class QOpenGLFunctions_1_5_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_1_5_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_1_5_Core; }
+
+ // OpenGL 1.5 core functions
+#define QT_OPENGL_1_5_FUNCTIONS(F) \
+ F(void, GetBufferPointerv, (GLenum target, GLenum pname, GLvoid* *params)) \
+ F(void, GetBufferParameteriv, (GLenum target, GLenum pname, GLint *params)) \
+ F(GLboolean, UnmapBuffer, (GLenum target)) \
+ F(GLvoid*, MapBuffer, (GLenum target, GLenum access)) \
+ F(void, GetBufferSubData, (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)) \
+ F(void, BufferSubData, (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)) \
+ F(void, BufferData, (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)) \
+ F(GLboolean, IsBuffer, (GLuint buffer)) \
+ F(void, GenBuffers, (GLsizei n, GLuint *buffers)) \
+ F(void, DeleteBuffers, (GLsizei n, const GLuint *buffers)) \
+ F(void, BindBuffer, (GLenum target, GLuint buffer)) \
+ F(void, GetQueryObjectuiv, (GLuint id, GLenum pname, GLuint *params)) \
+ F(void, GetQueryObjectiv, (GLuint id, GLenum pname, GLint *params)) \
+ F(void, GetQueryiv, (GLenum target, GLenum pname, GLint *params)) \
+ F(void, EndQuery, (GLenum target)) \
+ F(void, BeginQuery, (GLenum target, GLuint id)) \
+ F(GLboolean, IsQuery, (GLuint id)) \
+ F(void, DeleteQueries, (GLsizei n, const GLuint *ids)) \
+ F(void, GenQueries, (GLsizei n, GLuint *ids)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_1_5_FUNCTIONS);
+};
+
+class QOpenGLFunctions_2_0_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_2_0_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_2_0_Core; }
+
+ // OpenGL 2.0 core functions
+#define QT_OPENGL_2_0_FUNCTIONS(F) \
+ F(void, VertexAttribPointer, (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)) \
+ F(void, ValidateProgram, (GLuint program)) \
+ F(void, UniformMatrix4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, UniformMatrix3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, UniformMatrix2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, Uniform4iv, (GLint location, GLsizei count, const GLint *value)) \
+ F(void, Uniform3iv, (GLint location, GLsizei count, const GLint *value)) \
+ F(void, Uniform2iv, (GLint location, GLsizei count, const GLint *value)) \
+ F(void, Uniform1iv, (GLint location, GLsizei count, const GLint *value)) \
+ F(void, Uniform4fv, (GLint location, GLsizei count, const GLfloat *value)) \
+ F(void, Uniform3fv, (GLint location, GLsizei count, const GLfloat *value)) \
+ F(void, Uniform2fv, (GLint location, GLsizei count, const GLfloat *value)) \
+ F(void, Uniform1fv, (GLint location, GLsizei count, const GLfloat *value)) \
+ F(void, Uniform4i, (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)) \
+ F(void, Uniform3i, (GLint location, GLint v0, GLint v1, GLint v2)) \
+ F(void, Uniform2i, (GLint location, GLint v0, GLint v1)) \
+ F(void, Uniform1i, (GLint location, GLint v0)) \
+ F(void, Uniform4f, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)) \
+ F(void, Uniform3f, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)) \
+ F(void, Uniform2f, (GLint location, GLfloat v0, GLfloat v1)) \
+ F(void, Uniform1f, (GLint location, GLfloat v0)) \
+ F(void, UseProgram, (GLuint program)) \
+ F(void, ShaderSource, (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length)) \
+ F(void, LinkProgram, (GLuint program)) \
+ F(GLboolean, IsShader, (GLuint shader)) \
+ F(GLboolean, IsProgram, (GLuint program)) \
+ F(void, GetVertexAttribPointerv, (GLuint index, GLenum pname, GLvoid* *pointer)) \
+ F(void, GetVertexAttribiv, (GLuint index, GLenum pname, GLint *params)) \
+ F(void, GetVertexAttribfv, (GLuint index, GLenum pname, GLfloat *params)) \
+ F(void, GetVertexAttribdv, (GLuint index, GLenum pname, GLdouble *params)) \
+ F(void, GetUniformiv, (GLuint program, GLint location, GLint *params)) \
+ F(void, GetUniformfv, (GLuint program, GLint location, GLfloat *params)) \
+ F(GLint, GetUniformLocation, (GLuint program, const GLchar *name)) \
+ F(void, GetShaderSource, (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)) \
+ F(void, GetShaderInfoLog, (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)) \
+ F(void, GetShaderiv, (GLuint shader, GLenum pname, GLint *params)) \
+ F(void, GetProgramInfoLog, (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)) \
+ F(void, GetProgramiv, (GLuint program, GLenum pname, GLint *params)) \
+ F(GLint, GetAttribLocation, (GLuint program, const GLchar *name)) \
+ F(void, GetAttachedShaders, (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)) \
+ F(void, GetActiveUniform, (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)) \
+ F(void, GetActiveAttrib, (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)) \
+ F(void, EnableVertexAttribArray, (GLuint index)) \
+ F(void, DisableVertexAttribArray, (GLuint index)) \
+ F(void, DetachShader, (GLuint program, GLuint shader)) \
+ F(void, DeleteShader, (GLuint shader)) \
+ F(void, DeleteProgram, (GLuint program)) \
+ F(GLuint, CreateShader, (GLenum type)) \
+ F(GLuint, CreateProgram, ()) \
+ F(void, CompileShader, (GLuint shader)) \
+ F(void, BindAttribLocation, (GLuint program, GLuint index, const GLchar *name)) \
+ F(void, AttachShader, (GLuint program, GLuint shader)) \
+ F(void, StencilMaskSeparate, (GLenum face, GLuint mask)) \
+ F(void, StencilFuncSeparate, (GLenum face, GLenum func, GLint ref, GLuint mask)) \
+ F(void, StencilOpSeparate, (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)) \
+ F(void, DrawBuffers, (GLsizei n, const GLenum *bufs)) \
+ F(void, BlendEquationSeparate, (GLenum modeRGB, GLenum modeAlpha)) \
+ F(void, VertexAttrib4usv, (GLuint index, const GLushort *v)) \
+ F(void, VertexAttrib4uiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttrib4ubv, (GLuint index, const GLubyte *v)) \
+ F(void, VertexAttrib4sv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttrib4s, (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)) \
+ F(void, VertexAttrib4iv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttrib4fv, (GLuint index, const GLfloat *v)) \
+ F(void, VertexAttrib4f, (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)) \
+ F(void, VertexAttrib4dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttrib4d, (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
+ F(void, VertexAttrib4bv, (GLuint index, const GLbyte *v)) \
+ F(void, VertexAttrib4Nusv, (GLuint index, const GLushort *v)) \
+ F(void, VertexAttrib4Nuiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttrib4Nubv, (GLuint index, const GLubyte *v)) \
+ F(void, VertexAttrib4Nub, (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)) \
+ F(void, VertexAttrib4Nsv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttrib4Niv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttrib4Nbv, (GLuint index, const GLbyte *v)) \
+ F(void, VertexAttrib3sv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttrib3s, (GLuint index, GLshort x, GLshort y, GLshort z)) \
+ F(void, VertexAttrib3fv, (GLuint index, const GLfloat *v)) \
+ F(void, VertexAttrib3f, (GLuint index, GLfloat x, GLfloat y, GLfloat z)) \
+ F(void, VertexAttrib3dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttrib3d, (GLuint index, GLdouble x, GLdouble y, GLdouble z)) \
+ F(void, VertexAttrib2sv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttrib2s, (GLuint index, GLshort x, GLshort y)) \
+ F(void, VertexAttrib2fv, (GLuint index, const GLfloat *v)) \
+ F(void, VertexAttrib2f, (GLuint index, GLfloat x, GLfloat y)) \
+ F(void, VertexAttrib2dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttrib2d, (GLuint index, GLdouble x, GLdouble y)) \
+ F(void, VertexAttrib1sv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttrib1s, (GLuint index, GLshort x)) \
+ F(void, VertexAttrib1fv, (GLuint index, const GLfloat *v)) \
+ F(void, VertexAttrib1f, (GLuint index, GLfloat x)) \
+ F(void, VertexAttrib1dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttrib1d, (GLuint index, GLdouble x)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_2_0_FUNCTIONS);
+};
+
+class QOpenGLFunctions_2_1_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_2_1_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_2_1_Core; }
+
+ // OpenGL 2.1 core functions
+#define QT_OPENGL_2_1_FUNCTIONS(F) \
+ F(void, UniformMatrix4x3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, UniformMatrix3x4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, UniformMatrix4x2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, UniformMatrix2x4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, UniformMatrix3x2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, UniformMatrix2x3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_2_1_FUNCTIONS);
+};
+
+class QOpenGLFunctions_3_0_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_3_0_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_3_0_Core; }
+
+ // OpenGL 3.0 core functions
+#define QT_OPENGL_3_0_FUNCTIONS(F) \
+ F(GLboolean, IsVertexArray, (GLuint array)) \
+ F(void, GenVertexArrays, (GLsizei n, GLuint *arrays)) \
+ F(void, DeleteVertexArrays, (GLsizei n, const GLuint *arrays)) \
+ F(void, BindVertexArray, (GLuint array)) \
+ F(void, FlushMappedBufferRange, (GLenum target, GLintptr offset, GLsizeiptr length)) \
+ F(GLvoid *, MapBufferRange, (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)) \
+ F(void, FramebufferTextureLayer, (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)) \
+ F(void, RenderbufferStorageMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)) \
+ F(void, BlitFramebuffer, (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)) \
+ F(void, GenerateMipmap, (GLenum target)) \
+ F(void, GetFramebufferAttachmentParameteriv, (GLenum target, GLenum attachment, GLenum pname, GLint *params)) \
+ F(void, FramebufferRenderbuffer, (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)) \
+ F(void, FramebufferTexture3D, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)) \
+ F(void, FramebufferTexture2D, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)) \
+ F(void, FramebufferTexture1D, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)) \
+ F(GLenum, CheckFramebufferStatus, (GLenum target)) \
+ F(void, GenFramebuffers, (GLsizei n, GLuint *framebuffers)) \
+ F(void, DeleteFramebuffers, (GLsizei n, const GLuint *framebuffers)) \
+ F(void, BindFramebuffer, (GLenum target, GLuint framebuffer)) \
+ F(GLboolean, IsFramebuffer, (GLuint framebuffer)) \
+ F(void, GetRenderbufferParameteriv, (GLenum target, GLenum pname, GLint *params)) \
+ F(void, RenderbufferStorage, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height)) \
+ F(void, GenRenderbuffers, (GLsizei n, GLuint *renderbuffers)) \
+ F(void, DeleteRenderbuffers, (GLsizei n, const GLuint *renderbuffers)) \
+ F(void, BindRenderbuffer, (GLenum target, GLuint renderbuffer)) \
+ F(GLboolean, IsRenderbuffer, (GLuint renderbuffer)) \
+ F(const GLubyte *, GetStringi, (GLenum name, GLuint index)) \
+ F(void, ClearBufferfi, (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)) \
+ F(void, ClearBufferfv, (GLenum buffer, GLint drawbuffer, const GLfloat *value)) \
+ F(void, ClearBufferuiv, (GLenum buffer, GLint drawbuffer, const GLuint *value)) \
+ F(void, ClearBufferiv, (GLenum buffer, GLint drawbuffer, const GLint *value)) \
+ F(void, GetTexParameterIuiv, (GLenum target, GLenum pname, GLuint *params)) \
+ F(void, GetTexParameterIiv, (GLenum target, GLenum pname, GLint *params)) \
+ F(void, TexParameterIuiv, (GLenum target, GLenum pname, const GLuint *params)) \
+ F(void, TexParameterIiv, (GLenum target, GLenum pname, const GLint *params)) \
+ F(void, Uniform4uiv, (GLint location, GLsizei count, const GLuint *value)) \
+ F(void, Uniform3uiv, (GLint location, GLsizei count, const GLuint *value)) \
+ F(void, Uniform2uiv, (GLint location, GLsizei count, const GLuint *value)) \
+ F(void, Uniform1uiv, (GLint location, GLsizei count, const GLuint *value)) \
+ F(void, Uniform4ui, (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)) \
+ F(void, Uniform3ui, (GLint location, GLuint v0, GLuint v1, GLuint v2)) \
+ F(void, Uniform2ui, (GLint location, GLuint v0, GLuint v1)) \
+ F(void, Uniform1ui, (GLint location, GLuint v0)) \
+ F(GLint, GetFragDataLocation, (GLuint program, const GLchar *name)) \
+ F(void, BindFragDataLocation, (GLuint program, GLuint color, const GLchar *name)) \
+ F(void, GetUniformuiv, (GLuint program, GLint location, GLuint *params)) \
+ F(void, GetVertexAttribIuiv, (GLuint index, GLenum pname, GLuint *params)) \
+ F(void, GetVertexAttribIiv, (GLuint index, GLenum pname, GLint *params)) \
+ F(void, VertexAttribIPointer, (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
+ F(void, EndConditionalRender, ()) \
+ F(void, BeginConditionalRender, (GLuint id, GLenum mode)) \
+ F(void, ClampColor, (GLenum target, GLenum clamp)) \
+ F(void, GetTransformFeedbackVarying, (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)) \
+ F(void, TransformFeedbackVaryings, (GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode)) \
+ F(void, BindBufferBase, (GLenum target, GLuint index, GLuint buffer)) \
+ F(void, BindBufferRange, (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)) \
+ F(void, EndTransformFeedback, ()) \
+ F(void, BeginTransformFeedback, (GLenum primitiveMode)) \
+ F(GLboolean, IsEnabledi, (GLenum target, GLuint index)) \
+ F(void, Disablei, (GLenum target, GLuint index)) \
+ F(void, Enablei, (GLenum target, GLuint index)) \
+ F(void, GetIntegeri_v,(GLenum target, GLuint index, GLint *data)) \
+ F(void, GetBooleani_v,(GLenum target, GLuint index, GLboolean *data)) \
+ F(void, ColorMaski, (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)) \
+ F(void, VertexAttribI4usv, (GLuint index, const GLushort *v)) \
+ F(void, VertexAttribI4ubv, (GLuint index, const GLubyte *v)) \
+ F(void, VertexAttribI4sv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttribI4bv, (GLuint index, const GLbyte *v)) \
+ F(void, VertexAttribI4uiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttribI3uiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttribI2uiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttribI1uiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttribI4iv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttribI3iv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttribI2iv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttribI1iv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttribI4ui, (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)) \
+ F(void, VertexAttribI3ui, (GLuint index, GLuint x, GLuint y, GLuint z)) \
+ F(void, VertexAttribI2ui, (GLuint index, GLuint x, GLuint y)) \
+ F(void, VertexAttribI1ui, (GLuint index, GLuint x)) \
+ F(void, VertexAttribI4i, (GLuint index, GLint x, GLint y, GLint z, GLint w)) \
+ F(void, VertexAttribI3i, (GLuint index, GLint x, GLint y, GLint z)) \
+ F(void, VertexAttribI2i, (GLuint index, GLint x, GLint y)) \
+ F(void, VertexAttribI1i, (GLuint index, GLint x)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_3_0_FUNCTIONS);
+};
+
+class QOpenGLFunctions_3_1_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_3_1_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_3_1_Core; }
+
+ // OpenGL 3.1 core functions
+#define QT_OPENGL_3_1_FUNCTIONS(F) \
+ F(void, CopyBufferSubData, (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)) \
+ F(void, UniformBlockBinding, (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)) \
+ F(void, GetActiveUniformBlockName, (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)) \
+ F(void, GetActiveUniformBlockiv, (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)) \
+ F(GLuint, GetUniformBlockIndex, (GLuint program, const GLchar *uniformBlockName)) \
+ F(void, GetActiveUniformName, (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName)) \
+ F(void, GetActiveUniformsiv, (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)) \
+ F(void, GetUniformIndices, (GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices)) \
+ F(void, PrimitiveRestartIndex, (GLuint index)) \
+ F(void, TexBuffer, (GLenum target, GLenum internalformat, GLuint buffer)) \
+ F(void, DrawElementsInstanced, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)) \
+ F(void, DrawArraysInstanced, (GLenum mode, GLint first, GLsizei count, GLsizei instancecount)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_3_1_FUNCTIONS);
+};
+
+class QOpenGLFunctions_3_2_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_3_2_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_3_2_Core; }
+
+ // OpenGL 3.2 core functions
+#define QT_OPENGL_3_2_FUNCTIONS(F) \
+ F(void, SampleMaski, (GLuint maskNumber, GLbitfield mask)) \
+ F(void, GetMultisamplefv, (GLenum pname, GLuint index, GLfloat *val)) \
+ F(void, TexImage3DMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)) \
+ F(void, TexImage2DMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)) \
+ F(void, GetSynciv, (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)) \
+ F(void, GetInteger64v, (GLenum pname, GLint64 *data)) \
+ F(void, WaitSync, (GLsync sync, GLbitfield flags, GLuint64 timeout)) \
+ F(GLenum, ClientWaitSync, (GLsync sync, GLbitfield flags, GLuint64 timeout)) \
+ F(void, DeleteSync, (GLsync sync)) \
+ F(GLboolean, IsSync, (GLsync sync)) \
+ F(GLsync, FenceSync, (GLenum condition, GLbitfield flags)) \
+ F(void, ProvokingVertex, (GLenum mode)) \
+ F(void, MultiDrawElementsBaseVertex, (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex)) \
+ F(void, DrawElementsInstancedBaseVertex, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex)) \
+ F(void, DrawRangeElementsBaseVertex, (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)) \
+ F(void, DrawElementsBaseVertex, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex)) \
+ F(void, FramebufferTexture, (GLenum target, GLenum attachment, GLuint texture, GLint level)) \
+ F(void, GetBufferParameteri64v, (GLenum target, GLenum pname, GLint64 *params)) \
+ F(void, GetInteger64i_v,(GLenum target, GLuint index, GLint64 *data))
+
+ QT_OPENGL_DECLARE(QT_OPENGL_3_2_FUNCTIONS);
+};
+
+class QOpenGLFunctions_3_3_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_3_3_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_3_3_Core; }
+
+ // OpenGL 3.3 core functions
+#define QT_OPENGL_3_3_FUNCTIONS(F) \
+ F(void, VertexAttribP4uiv, (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)) \
+ F(void, VertexAttribP4ui, (GLuint index, GLenum type, GLboolean normalized, GLuint value)) \
+ F(void, VertexAttribP3uiv, (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)) \
+ F(void, VertexAttribP3ui, (GLuint index, GLenum type, GLboolean normalized, GLuint value)) \
+ F(void, VertexAttribP2uiv, (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)) \
+ F(void, VertexAttribP2ui, (GLuint index, GLenum type, GLboolean normalized, GLuint value)) \
+ F(void, VertexAttribP1uiv, (GLuint index, GLenum type, GLboolean normalized, const GLuint *value)) \
+ F(void, VertexAttribP1ui, (GLuint index, GLenum type, GLboolean normalized, GLuint value)) \
+ F(void, SecondaryColorP3uiv, (GLenum type, const GLuint *color)) \
+ F(void, SecondaryColorP3ui, (GLenum type, GLuint color)) \
+ F(void, ColorP4uiv, (GLenum type, const GLuint *color)) \
+ F(void, ColorP4ui, (GLenum type, GLuint color)) \
+ F(void, ColorP3uiv, (GLenum type, const GLuint *color)) \
+ F(void, ColorP3ui, (GLenum type, GLuint color)) \
+ F(void, NormalP3uiv, (GLenum type, const GLuint *coords)) \
+ F(void, NormalP3ui, (GLenum type, GLuint coords)) \
+ F(void, MultiTexCoordP4uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
+ F(void, MultiTexCoordP4ui, (GLenum texture, GLenum type, GLuint coords)) \
+ F(void, MultiTexCoordP3uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
+ F(void, MultiTexCoordP3ui, (GLenum texture, GLenum type, GLuint coords)) \
+ F(void, MultiTexCoordP2uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
+ F(void, MultiTexCoordP2ui, (GLenum texture, GLenum type, GLuint coords)) \
+ F(void, MultiTexCoordP1uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
+ F(void, MultiTexCoordP1ui, (GLenum texture, GLenum type, GLuint coords)) \
+ F(void, TexCoordP4uiv, (GLenum type, const GLuint *coords)) \
+ F(void, TexCoordP4ui, (GLenum type, GLuint coords)) \
+ F(void, TexCoordP3uiv, (GLenum type, const GLuint *coords)) \
+ F(void, TexCoordP3ui, (GLenum type, GLuint coords)) \
+ F(void, TexCoordP2uiv, (GLenum type, const GLuint *coords)) \
+ F(void, TexCoordP2ui, (GLenum type, GLuint coords)) \
+ F(void, TexCoordP1uiv, (GLenum type, const GLuint *coords)) \
+ F(void, TexCoordP1ui, (GLenum type, GLuint coords)) \
+ F(void, VertexP4uiv, (GLenum type, const GLuint *value)) \
+ F(void, VertexP4ui, (GLenum type, GLuint value)) \
+ F(void, VertexP3uiv, (GLenum type, const GLuint *value)) \
+ F(void, VertexP3ui, (GLenum type, GLuint value)) \
+ F(void, VertexP2uiv, (GLenum type, const GLuint *value)) \
+ F(void, VertexP2ui, (GLenum type, GLuint value)) \
+ F(void, GetQueryObjectui64v, (GLuint id, GLenum pname, GLuint64 *params)) \
+ F(void, GetQueryObjecti64v, (GLuint id, GLenum pname, GLint64 *params)) \
+ F(void, QueryCounter, (GLuint id, GLenum target)) \
+ F(void, GetSamplerParameterIuiv, (GLuint sampler, GLenum pname, GLuint *params)) \
+ F(void, GetSamplerParameterfv, (GLuint sampler, GLenum pname, GLfloat *params)) \
+ F(void, GetSamplerParameterIiv, (GLuint sampler, GLenum pname, GLint *params)) \
+ F(void, GetSamplerParameteriv, (GLuint sampler, GLenum pname, GLint *params)) \
+ F(void, SamplerParameterIuiv, (GLuint sampler, GLenum pname, const GLuint *param)) \
+ F(void, SamplerParameterIiv, (GLuint sampler, GLenum pname, const GLint *param)) \
+ F(void, SamplerParameterfv, (GLuint sampler, GLenum pname, const GLfloat *param)) \
+ F(void, SamplerParameterf, (GLuint sampler, GLenum pname, GLfloat param)) \
+ F(void, SamplerParameteriv, (GLuint sampler, GLenum pname, const GLint *param)) \
+ F(void, SamplerParameteri, (GLuint sampler, GLenum pname, GLint param)) \
+ F(void, BindSampler, (GLuint unit, GLuint sampler)) \
+ F(GLboolean, IsSampler, (GLuint sampler)) \
+ F(void, DeleteSamplers, (GLsizei count, const GLuint *samplers)) \
+ F(void, GenSamplers, (GLsizei count, GLuint *samplers)) \
+ F(GLint, GetFragDataIndex, (GLuint program, const GLchar *name)) \
+ F(void, BindFragDataLocationIndexed, (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name)) \
+ F(void, VertexAttribDivisor, (GLuint index, GLuint divisor)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_3_3_FUNCTIONS);
+};
+
+class QOpenGLFunctions_4_0_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_4_0_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_4_0_Core; }
+
+ // OpenGL 4.0 core functions
+#define QT_OPENGL_4_0_FUNCTIONS(F) \
+ F(void, GetQueryIndexediv, (GLenum target, GLuint index, GLenum pname, GLint *params)) \
+ F(void, EndQueryIndexed, (GLenum target, GLuint index)) \
+ F(void, BeginQueryIndexed, (GLenum target, GLuint index, GLuint id)) \
+ F(void, DrawTransformFeedbackStream, (GLenum mode, GLuint id, GLuint stream)) \
+ F(void, DrawTransformFeedback, (GLenum mode, GLuint id)) \
+ F(void, ResumeTransformFeedback, ()) \
+ F(void, PauseTransformFeedback, ()) \
+ F(GLboolean, IsTransformFeedback, (GLuint id)) \
+ F(void, GenTransformFeedbacks, (GLsizei n, GLuint *ids)) \
+ F(void, DeleteTransformFeedbacks, (GLsizei n, const GLuint *ids)) \
+ F(void, BindTransformFeedback, (GLenum target, GLuint id)) \
+ F(void, PatchParameterfv, (GLenum pname, const GLfloat *values)) \
+ F(void, PatchParameteri, (GLenum pname, GLint value)) \
+ F(void, GetProgramStageiv, (GLuint program, GLenum shadertype, GLenum pname, GLint *values)) \
+ F(void, GetUniformSubroutineuiv, (GLenum shadertype, GLint location, GLuint *params)) \
+ F(void, UniformSubroutinesuiv, (GLenum shadertype, GLsizei count, const GLuint *indices)) \
+ F(void, GetActiveSubroutineName, (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)) \
+ F(void, GetActiveSubroutineUniformName, (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name)) \
+ F(void, GetActiveSubroutineUniformiv, (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values)) \
+ F(GLuint, GetSubroutineIndex, (GLuint program, GLenum shadertype, const GLchar *name)) \
+ F(GLint, GetSubroutineUniformLocation, (GLuint program, GLenum shadertype, const GLchar *name)) \
+ F(void, GetUniformdv, (GLuint program, GLint location, GLdouble *params)) \
+ F(void, UniformMatrix4x3dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, UniformMatrix4x2dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, UniformMatrix3x4dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, UniformMatrix3x2dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, UniformMatrix2x4dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, UniformMatrix2x3dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, UniformMatrix4dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, UniformMatrix3dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, UniformMatrix2dv, (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, Uniform4dv, (GLint location, GLsizei count, const GLdouble *value)) \
+ F(void, Uniform3dv, (GLint location, GLsizei count, const GLdouble *value)) \
+ F(void, Uniform2dv, (GLint location, GLsizei count, const GLdouble *value)) \
+ F(void, Uniform1dv, (GLint location, GLsizei count, const GLdouble *value)) \
+ F(void, Uniform4d, (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
+ F(void, Uniform3d, (GLint location, GLdouble x, GLdouble y, GLdouble z)) \
+ F(void, Uniform2d, (GLint location, GLdouble x, GLdouble y)) \
+ F(void, Uniform1d, (GLint location, GLdouble x)) \
+ F(void, DrawElementsIndirect, (GLenum mode, GLenum type, const GLvoid *indirect)) \
+ F(void, DrawArraysIndirect, (GLenum mode, const GLvoid *indirect)) \
+ F(void, BlendFuncSeparatei, (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)) \
+ F(void, BlendFunci, (GLuint buf, GLenum src, GLenum dst)) \
+ F(void, BlendEquationSeparatei, (GLuint buf, GLenum modeRGB, GLenum modeAlpha)) \
+ F(void, BlendEquationi, (GLuint buf, GLenum mode)) \
+ F(void, MinSampleShading, (GLfloat value)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_4_0_FUNCTIONS);
+};
+
+class QOpenGLFunctions_4_1_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_4_1_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_4_1_Core; }
+
+ // OpenGL 4.1 core functions
+#define QT_OPENGL_4_1_FUNCTIONS(F) \
+ F(void, GetDoublei_v, (GLenum target, GLuint index, GLdouble *data)) \
+ F(void, GetFloati_v,(GLenum target, GLuint index, GLfloat *data)) \
+ F(void, DepthRangeIndexed, (GLuint index, GLdouble n, GLdouble f)) \
+ F(void, DepthRangeArrayv, (GLuint first, GLsizei count, const GLdouble *v)) \
+ F(void, ScissorIndexedv, (GLuint index, const GLint *v)) \
+ F(void, ScissorIndexed, (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height)) \
+ F(void, ScissorArrayv, (GLuint first, GLsizei count, const GLint *v)) \
+ F(void, ViewportIndexedfv, (GLuint index, const GLfloat *v)) \
+ F(void, ViewportIndexedf, (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)) \
+ F(void, ViewportArrayv, (GLuint first, GLsizei count, const GLfloat *v)) \
+ F(void, GetVertexAttribLdv, (GLuint index, GLenum pname, GLdouble *params)) \
+ F(void, VertexAttribLPointer, (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
+ F(void, VertexAttribL4dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttribL3dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttribL2dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttribL1dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttribL4d, (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
+ F(void, VertexAttribL3d, (GLuint index, GLdouble x, GLdouble y, GLdouble z)) \
+ F(void, VertexAttribL2d, (GLuint index, GLdouble x, GLdouble y)) \
+ F(void, VertexAttribL1d, (GLuint index, GLdouble x)) \
+ F(void, GetProgramPipelineInfoLog, (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)) \
+ F(void, ValidateProgramPipeline, (GLuint pipeline)) \
+ F(void, ProgramUniformMatrix4x3dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, ProgramUniformMatrix3x4dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, ProgramUniformMatrix4x2dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, ProgramUniformMatrix2x4dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, ProgramUniformMatrix3x2dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, ProgramUniformMatrix2x3dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, ProgramUniformMatrix4x3fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, ProgramUniformMatrix3x4fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, ProgramUniformMatrix4x2fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, ProgramUniformMatrix2x4fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, ProgramUniformMatrix3x2fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, ProgramUniformMatrix2x3fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, ProgramUniformMatrix4dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, ProgramUniformMatrix3dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, ProgramUniformMatrix2dv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value)) \
+ F(void, ProgramUniformMatrix4fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, ProgramUniformMatrix3fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, ProgramUniformMatrix2fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) \
+ F(void, ProgramUniform4uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value)) \
+ F(void, ProgramUniform4ui, (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)) \
+ F(void, ProgramUniform4dv, (GLuint program, GLint location, GLsizei count, const GLdouble *value)) \
+ F(void, ProgramUniform4d, (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3)) \
+ F(void, ProgramUniform4fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value)) \
+ F(void, ProgramUniform4f, (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)) \
+ F(void, ProgramUniform4iv, (GLuint program, GLint location, GLsizei count, const GLint *value)) \
+ F(void, ProgramUniform4i, (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)) \
+ F(void, ProgramUniform3uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value)) \
+ F(void, ProgramUniform3ui, (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)) \
+ F(void, ProgramUniform3dv, (GLuint program, GLint location, GLsizei count, const GLdouble *value)) \
+ F(void, ProgramUniform3d, (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2)) \
+ F(void, ProgramUniform3fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value)) \
+ F(void, ProgramUniform3f, (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)) \
+ F(void, ProgramUniform3iv, (GLuint program, GLint location, GLsizei count, const GLint *value)) \
+ F(void, ProgramUniform3i, (GLuint program, GLint location, GLint v0, GLint v1, GLint v2)) \
+ F(void, ProgramUniform2uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value)) \
+ F(void, ProgramUniform2ui, (GLuint program, GLint location, GLuint v0, GLuint v1)) \
+ F(void, ProgramUniform2dv, (GLuint program, GLint location, GLsizei count, const GLdouble *value)) \
+ F(void, ProgramUniform2d, (GLuint program, GLint location, GLdouble v0, GLdouble v1)) \
+ F(void, ProgramUniform2fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value)) \
+ F(void, ProgramUniform2f, (GLuint program, GLint location, GLfloat v0, GLfloat v1)) \
+ F(void, ProgramUniform2iv, (GLuint program, GLint location, GLsizei count, const GLint *value)) \
+ F(void, ProgramUniform2i, (GLuint program, GLint location, GLint v0, GLint v1)) \
+ F(void, ProgramUniform1uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value)) \
+ F(void, ProgramUniform1ui, (GLuint program, GLint location, GLuint v0)) \
+ F(void, ProgramUniform1dv, (GLuint program, GLint location, GLsizei count, const GLdouble *value)) \
+ F(void, ProgramUniform1d, (GLuint program, GLint location, GLdouble v0)) \
+ F(void, ProgramUniform1fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value)) \
+ F(void, ProgramUniform1f, (GLuint program, GLint location, GLfloat v0)) \
+ F(void, ProgramUniform1iv, (GLuint program, GLint location, GLsizei count, const GLint *value)) \
+ F(void, ProgramUniform1i, (GLuint program, GLint location, GLint v0)) \
+ F(void, GetProgramPipelineiv, (GLuint pipeline, GLenum pname, GLint *params)) \
+ F(GLboolean, IsProgramPipeline, (GLuint pipeline)) \
+ F(void, GenProgramPipelines, (GLsizei n, GLuint *pipelines)) \
+ F(void, DeleteProgramPipelines, (GLsizei n, const GLuint *pipelines)) \
+ F(void, BindProgramPipeline, (GLuint pipeline)) \
+ F(GLuint, CreateShaderProgramv, (GLenum type, GLsizei count, const GLchar* const *strings)) \
+ F(void, ActiveShaderProgram, (GLuint pipeline, GLuint program)) \
+ F(void, UseProgramStages, (GLuint pipeline, GLbitfield stages, GLuint program)) \
+ F(void, ProgramParameteri, (GLuint program, GLenum pname, GLint value)) \
+ F(void, ProgramBinary, (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)) \
+ F(void, GetProgramBinary, (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)) \
+ F(void, ClearDepthf, (GLfloat dd)) \
+ F(void, DepthRangef, (GLfloat n, GLfloat f)) \
+ F(void, GetShaderPrecisionFormat, (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)) \
+ F(void, ShaderBinary, (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)) \
+ F(void, ReleaseShaderCompiler, ()) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_4_1_FUNCTIONS);
+};
+
+class QOpenGLFunctions_4_2_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_4_2_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_4_2_Core; }
+
+ // OpenGL 4.2 core functions
+#define QT_OPENGL_4_2_FUNCTIONS(F) \
+ F(void, TexStorage3D, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)) \
+ F(void, TexStorage2D, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)) \
+ F(void, TexStorage1D, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)) \
+ F(void, MemoryBarrier, (GLbitfield barriers)) \
+ F(void, BindImageTexture, (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)) \
+ F(void, GetActiveAtomicCounterBufferiv, (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params)) \
+ F(void, GetInternalformativ, (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)) \
+ F(void, DrawTransformFeedbackStreamInstanced, (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount)) \
+ F(void, DrawTransformFeedbackInstanced, (GLenum mode, GLuint id, GLsizei instancecount)) \
+ F(void, DrawElementsInstancedBaseVertexBaseInstance, (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance)) \
+ F(void, DrawElementsInstancedBaseInstance, (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)) \
+ F(void, DrawArraysInstancedBaseInstance, (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_4_2_FUNCTIONS);
+};
+
+class QOpenGLFunctions_4_3_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_4_3_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_4_3_Core; }
+
+ // OpenGL 4.3 core functions
+#define QT_OPENGL_4_3_FUNCTIONS(F) \
+ F(void, TexStorage3DMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)) \
+ F(void, TexStorage2DMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)) \
+ F(void, TexBufferRange, (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)) \
+ F(void, ShaderStorageBlockBinding, (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)) \
+ F(GLint, GetProgramResourceLocationIndex, (GLuint program, GLenum programInterface, const GLchar *name)) \
+ F(GLint, GetProgramResourceLocation, (GLuint program, GLenum programInterface, const GLchar *name)) \
+ F(void, GetProgramResourceiv, (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)) \
+ F(void, GetProgramResourceName, (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)) \
+ F(GLuint, GetProgramResourceIndex, (GLuint program, GLenum programInterface, const GLchar *name)) \
+ F(void, GetProgramInterfaceiv, (GLuint program, GLenum programInterface, GLenum pname, GLint *params)) \
+ F(void, MultiDrawElementsIndirect, (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)) \
+ F(void, MultiDrawArraysIndirect, (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)) \
+ F(void, InvalidateSubFramebuffer, (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)) \
+ F(void, InvalidateFramebuffer, (GLenum target, GLsizei numAttachments, const GLenum *attachments)) \
+ F(void, InvalidateBufferData, (GLuint buffer)) \
+ F(void, InvalidateBufferSubData, (GLuint buffer, GLintptr offset, GLsizeiptr length)) \
+ F(void, InvalidateTexImage, (GLuint texture, GLint level)) \
+ F(void, InvalidateTexSubImage, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)) \
+ F(void, GetInternalformati64v, (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params)) \
+ F(void, GetFramebufferParameteriv, (GLenum target, GLenum pname, GLint *params)) \
+ F(void, FramebufferParameteri, (GLenum target, GLenum pname, GLint param)) \
+ F(void, VertexBindingDivisor, (GLuint bindingindex, GLuint divisor)) \
+ F(void, VertexAttribBinding, (GLuint attribindex, GLuint bindingindex)) \
+ F(void, VertexAttribLFormat, (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)) \
+ F(void, VertexAttribIFormat, (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)) \
+ F(void, VertexAttribFormat, (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)) \
+ F(void, BindVertexBuffer, (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)) \
+ F(void, TextureView, (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers)) \
+ F(void, CopyImageSubData, (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)) \
+ F(void, DispatchComputeIndirect, (GLintptr indirect)) \
+ F(void, DispatchCompute, (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)) \
+ F(void, ClearBufferSubData, (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)) \
+ F(void, ClearBufferData, (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)) \
+ F(void, GetObjectPtrLabel, (const GLvoid *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)) \
+ F(void, ObjectPtrLabel, (const GLvoid *ptr, GLsizei length, const GLchar *label)) \
+ F(void, GetObjectLabel, (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)) \
+ F(void, ObjectLabel, (GLenum identifier, GLuint name, GLsizei length, const GLchar *label)) \
+ F(void, PopDebugGroup, ()) \
+ F(void, PushDebugGroup, (GLenum source, GLuint id, GLsizei length, const GLchar *message)) \
+ F(GLuint, GetDebugMessageLog, (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)) \
+ F(void, DebugMessageCallback, (GLDEBUGPROC callback, const GLvoid *userParam)) \
+ F(void, DebugMessageInsert, (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)) \
+ F(void, DebugMessageControl, (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_4_3_FUNCTIONS);
+};
+
+class QOpenGLFunctions_4_4_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_4_4_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_4_4_Core; }
+
+ // OpenGL 4.4 core functions
+#define QT_OPENGL_4_4_FUNCTIONS(F) \
+ F(void, BindVertexBuffers, (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)) \
+ F(void, BindImageTextures, (GLuint first, GLsizei count, const GLuint *textures)) \
+ F(void, BindSamplers, (GLuint first, GLsizei count, const GLuint *samplers)) \
+ F(void, BindTextures, (GLuint first, GLsizei count, const GLuint *textures)) \
+ F(void, BindBuffersRange, (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes)) \
+ F(void, BindBuffersBase, (GLenum target, GLuint first, GLsizei count, const GLuint *buffers)) \
+ F(void, ClearTexSubImage, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)) \
+ F(void, ClearTexImage, (GLuint texture, GLint level, GLenum format, GLenum type, const void *data)) \
+ F(void, BufferStorage, (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_4_4_FUNCTIONS);
+};
+
+class QOpenGLFunctions_4_5_CoreBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_4_5_CoreBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_4_5_Core; }
+
+ // OpenGL 4.5 core functions
+#define QT_OPENGL_4_5_FUNCTIONS(F) \
+ F(void, TextureBarrier, ()) \
+ F(void, ReadnPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data)) \
+ F(void, GetnUniformuiv, (GLuint program, GLint location, GLsizei bufSize, GLuint *params)) \
+ F(void, GetnUniformiv, (GLuint program, GLint location, GLsizei bufSize, GLint *params)) \
+ F(void, GetnUniformfv, (GLuint program, GLint location, GLsizei bufSize, GLfloat *params)) \
+ F(void, GetnUniformdv, (GLuint program, GLint location, GLsizei bufSize, GLdouble *params)) \
+ F(void, GetnTexImage, (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)) \
+ F(void, GetnCompressedTexImage, (GLenum target, GLint lod, GLsizei bufSize, void *pixels)) \
+ F(GLenum, GetGraphicsResetStatus, ()) \
+ F(void, GetCompressedTextureSubImage, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels)) \
+ F(void, GetTextureSubImage, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels)) \
+ F(void, MemoryBarrierByRegion, (GLbitfield barriers)) \
+ F(void, CreateQueries, (GLenum target, GLsizei n, GLuint *ids)) \
+ F(void, CreateProgramPipelines, (GLsizei n, GLuint *pipelines)) \
+ F(void, CreateSamplers, (GLsizei n, GLuint *samplers)) \
+ F(void, GetVertexArrayIndexed64iv, (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param)) \
+ F(void, GetVertexArrayIndexediv, (GLuint vaobj, GLuint index, GLenum pname, GLint *param)) \
+ F(void, GetVertexArrayiv, (GLuint vaobj, GLenum pname, GLint *param)) \
+ F(void, VertexArrayBindingDivisor, (GLuint vaobj, GLuint bindingindex, GLuint divisor)) \
+ F(void, VertexArrayAttribLFormat, (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)) \
+ F(void, VertexArrayAttribIFormat, (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)) \
+ F(void, VertexArrayAttribFormat, (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)) \
+ F(void, VertexArrayAttribBinding, (GLuint vaobj, GLuint attribindex, GLuint bindingindex)) \
+ F(void, VertexArrayVertexBuffers, (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides)) \
+ F(void, VertexArrayVertexBuffer, (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)) \
+ F(void, VertexArrayElementBuffer, (GLuint vaobj, GLuint buffer)) \
+ F(void, EnableVertexArrayAttrib, (GLuint vaobj, GLuint index)) \
+ F(void, DisableVertexArrayAttrib, (GLuint vaobj, GLuint index)) \
+ F(void, CreateVertexArrays, (GLsizei n, GLuint *arrays)) \
+ F(void, GetTextureParameteriv, (GLuint texture, GLenum pname, GLint *params)) \
+ F(void, GetTextureParameterIuiv, (GLuint texture, GLenum pname, GLuint *params)) \
+ F(void, GetTextureParameterIiv, (GLuint texture, GLenum pname, GLint *params)) \
+ F(void, GetTextureParameterfv, (GLuint texture, GLenum pname, GLfloat *params)) \
+ F(void, GetTextureLevelParameteriv, (GLuint texture, GLint level, GLenum pname, GLint *params)) \
+ F(void, GetTextureLevelParameterfv, (GLuint texture, GLint level, GLenum pname, GLfloat *params)) \
+ F(void, GetCompressedTextureImage, (GLuint texture, GLint level, GLsizei bufSize, void *pixels)) \
+ F(void, GetTextureImage, (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)) \
+ F(void, BindTextureUnit, (GLuint unit, GLuint texture)) \
+ F(void, GenerateTextureMipmap, (GLuint texture)) \
+ F(void, TextureParameteriv, (GLuint texture, GLenum pname, const GLint *param)) \
+ F(void, TextureParameterIuiv, (GLuint texture, GLenum pname, const GLuint *params)) \
+ F(void, TextureParameterIiv, (GLuint texture, GLenum pname, const GLint *params)) \
+ F(void, TextureParameteri, (GLuint texture, GLenum pname, GLint param)) \
+ F(void, TextureParameterfv, (GLuint texture, GLenum pname, const GLfloat *param)) \
+ F(void, TextureParameterf, (GLuint texture, GLenum pname, GLfloat param)) \
+ F(void, CopyTextureSubImage3D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)) \
+ F(void, CopyTextureSubImage2D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)) \
+ F(void, CopyTextureSubImage1D, (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)) \
+ F(void, CompressedTextureSubImage3D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)) \
+ F(void, CompressedTextureSubImage2D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)) \
+ F(void, CompressedTextureSubImage1D, (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data)) \
+ F(void, TextureSubImage3D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)) \
+ F(void, TextureSubImage2D, (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)) \
+ F(void, TextureSubImage1D, (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)) \
+ F(void, TextureStorage3DMultisample, (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)) \
+ F(void, TextureStorage2DMultisample, (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)) \
+ F(void, TextureStorage3D, (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)) \
+ F(void, TextureStorage2D, (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)) \
+ F(void, TextureStorage1D, (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width)) \
+ F(void, TextureBufferRange, (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size)) \
+ F(void, TextureBuffer, (GLuint texture, GLenum internalformat, GLuint buffer)) \
+ F(void, CreateTextures, (GLenum target, GLsizei n, GLuint *textures)) \
+ F(void, GetNamedRenderbufferParameteriv, (GLuint renderbuffer, GLenum pname, GLint *params)) \
+ F(void, NamedRenderbufferStorageMultisample, (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)) \
+ F(void, NamedRenderbufferStorage, (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height)) \
+ F(void, CreateRenderbuffers, (GLsizei n, GLuint *renderbuffers)) \
+ F(void, GetNamedFramebufferAttachmentParameteriv, (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params)) \
+ F(void, GetNamedFramebufferParameteriv, (GLuint framebuffer, GLenum pname, GLint *param)) \
+ F(GLenum, CheckNamedFramebufferStatus, (GLuint framebuffer, GLenum target)) \
+ F(void, BlitNamedFramebuffer, (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)) \
+ F(void, ClearNamedFramebufferfi, (GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil)) \
+ F(void, ClearNamedFramebufferfv, (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value)) \
+ F(void, ClearNamedFramebufferuiv, (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value)) \
+ F(void, ClearNamedFramebufferiv, (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value)) \
+ F(void, InvalidateNamedFramebufferSubData, (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)) \
+ F(void, InvalidateNamedFramebufferData, (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments)) \
+ F(void, NamedFramebufferReadBuffer, (GLuint framebuffer, GLenum src)) \
+ F(void, NamedFramebufferDrawBuffers, (GLuint framebuffer, GLsizei n, const GLenum *bufs)) \
+ F(void, NamedFramebufferDrawBuffer, (GLuint framebuffer, GLenum buf)) \
+ F(void, NamedFramebufferTextureLayer, (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)) \
+ F(void, NamedFramebufferTexture, (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)) \
+ F(void, NamedFramebufferParameteri, (GLuint framebuffer, GLenum pname, GLint param)) \
+ F(void, NamedFramebufferRenderbuffer, (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)) \
+ F(void, CreateFramebuffers, (GLsizei n, GLuint *framebuffers)) \
+ F(void, GetNamedBufferSubData, (GLuint buffer, GLintptr offset, GLsizei size, void *data)) \
+ F(void, GetNamedBufferPointerv, (GLuint buffer, GLenum pname, GLvoid* *params)) \
+ F(void, GetNamedBufferParameteri64v, (GLuint buffer, GLenum pname, GLint64 *params)) \
+ F(void, GetNamedBufferParameteriv, (GLuint buffer, GLenum pname, GLint *params)) \
+ F(void, FlushMappedNamedBufferRange, (GLuint buffer, GLintptr offset, GLsizei length)) \
+ F(GLboolean, UnmapNamedBuffer, (GLuint buffer)) \
+ F(GLvoid *, MapNamedBufferRange, (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access)) \
+ F(GLvoid *, MapNamedBuffer, (GLuint buffer, GLenum access)) \
+ F(void, ClearNamedBufferSubData, (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data)) \
+ F(void, ClearNamedBufferData, (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data)) \
+ F(void, CopyNamedBufferSubData, (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size)) \
+ F(void, NamedBufferSubData, (GLuint buffer, GLintptr offset, GLsizei size, const void *data)) \
+ F(void, NamedBufferData, (GLuint buffer, GLsizei size, const void *data, GLenum usage)) \
+ F(void, NamedBufferStorage, (GLuint buffer, GLsizei size, const void *data, GLbitfield flags)) \
+ F(void, CreateBuffers, (GLsizei n, GLuint *buffers)) \
+ F(void, GetTransformFeedbacki64_v,(GLuint xfb, GLenum pname, GLuint index, GLint64 *param)) \
+ F(void, GetTransformFeedbacki_v,(GLuint xfb, GLenum pname, GLuint index, GLint *param)) \
+ F(void, GetTransformFeedbackiv, (GLuint xfb, GLenum pname, GLint *param)) \
+ F(void, TransformFeedbackBufferRange, (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size)) \
+ F(void, TransformFeedbackBufferBase, (GLuint xfb, GLuint index, GLuint buffer)) \
+ F(void, CreateTransformFeedbacks, (GLsizei n, GLuint *ids)) \
+ F(void, ClipControl, (GLenum origin, GLenum depth)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_4_5_FUNCTIONS);
+};
+
+class QOpenGLFunctions_1_0_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_1_0_DeprecatedBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_1_0_Deprecated; }
+
+ // OpenGL 1.0 deprecated functions
+#define QT_OPENGL_1_0_DEPRECATED_FUNCTIONS(F) \
+ F(void, Translatef, (GLfloat x, GLfloat y, GLfloat z)) \
+ F(void, Translated, (GLdouble x, GLdouble y, GLdouble z)) \
+ F(void, Scalef, (GLfloat x, GLfloat y, GLfloat z)) \
+ F(void, Scaled, (GLdouble x, GLdouble y, GLdouble z)) \
+ F(void, Rotatef, (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)) \
+ F(void, Rotated, (GLdouble angle, GLdouble x, GLdouble y, GLdouble z)) \
+ F(void, PushMatrix, ()) \
+ F(void, PopMatrix, ()) \
+ F(void, Ortho, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)) \
+ F(void, MultMatrixd, (const GLdouble *m)) \
+ F(void, MultMatrixf, (const GLfloat *m)) \
+ F(void, MatrixMode, (GLenum mode)) \
+ F(void, LoadMatrixd, (const GLdouble *m)) \
+ F(void, LoadMatrixf, (const GLfloat *m)) \
+ F(void, LoadIdentity, ()) \
+ F(void, Frustum, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)) \
+ F(GLboolean, IsList, (GLuint list)) \
+ F(void, GetTexGeniv, (GLenum coord, GLenum pname, GLint *params)) \
+ F(void, GetTexGenfv, (GLenum coord, GLenum pname, GLfloat *params)) \
+ F(void, GetTexGendv, (GLenum coord, GLenum pname, GLdouble *params)) \
+ F(void, GetTexEnviv, (GLenum target, GLenum pname, GLint *params)) \
+ F(void, GetTexEnvfv, (GLenum target, GLenum pname, GLfloat *params)) \
+ F(void, GetPolygonStipple, (GLubyte *mask)) \
+ F(void, GetPixelMapusv, (GLenum map, GLushort *values)) \
+ F(void, GetPixelMapuiv, (GLenum map, GLuint *values)) \
+ F(void, GetPixelMapfv, (GLenum map, GLfloat *values)) \
+ F(void, GetMaterialiv, (GLenum face, GLenum pname, GLint *params)) \
+ F(void, GetMaterialfv, (GLenum face, GLenum pname, GLfloat *params)) \
+ F(void, GetMapiv, (GLenum target, GLenum query, GLint *v)) \
+ F(void, GetMapfv, (GLenum target, GLenum query, GLfloat *v)) \
+ F(void, GetMapdv, (GLenum target, GLenum query, GLdouble *v)) \
+ F(void, GetLightiv, (GLenum light, GLenum pname, GLint *params)) \
+ F(void, GetLightfv, (GLenum light, GLenum pname, GLfloat *params)) \
+ F(void, GetClipPlane, (GLenum plane, GLdouble *equation)) \
+ F(void, DrawPixels, (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)) \
+ F(void, CopyPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)) \
+ F(void, PixelMapusv, (GLenum map, GLsizei mapsize, const GLushort *values)) \
+ F(void, PixelMapuiv, (GLenum map, GLsizei mapsize, const GLuint *values)) \
+ F(void, PixelMapfv, (GLenum map, GLsizei mapsize, const GLfloat *values)) \
+ F(void, PixelTransferi, (GLenum pname, GLint param)) \
+ F(void, PixelTransferf, (GLenum pname, GLfloat param)) \
+ F(void, PixelZoom, (GLfloat xfactor, GLfloat yfactor)) \
+ F(void, AlphaFunc, (GLenum func, GLfloat ref)) \
+ F(void, EvalPoint2, (GLint i, GLint j)) \
+ F(void, EvalMesh2, (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)) \
+ F(void, EvalPoint1, (GLint i)) \
+ F(void, EvalMesh1, (GLenum mode, GLint i1, GLint i2)) \
+ F(void, EvalCoord2fv, (const GLfloat *u)) \
+ F(void, EvalCoord2f, (GLfloat u, GLfloat v)) \
+ F(void, EvalCoord2dv, (const GLdouble *u)) \
+ F(void, EvalCoord2d, (GLdouble u, GLdouble v)) \
+ F(void, EvalCoord1fv, (const GLfloat *u)) \
+ F(void, EvalCoord1f, (GLfloat u)) \
+ F(void, EvalCoord1dv, (const GLdouble *u)) \
+ F(void, EvalCoord1d, (GLdouble u)) \
+ F(void, MapGrid2f, (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)) \
+ F(void, MapGrid2d, (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)) \
+ F(void, MapGrid1f, (GLint un, GLfloat u1, GLfloat u2)) \
+ F(void, MapGrid1d, (GLint un, GLdouble u1, GLdouble u2)) \
+ F(void, Map2f, (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)) \
+ F(void, Map2d, (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)) \
+ F(void, Map1f, (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)) \
+ F(void, Map1d, (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)) \
+ F(void, PushAttrib, (GLbitfield mask)) \
+ F(void, PopAttrib, ()) \
+ F(void, Accum, (GLenum op, GLfloat value)) \
+ F(void, IndexMask, (GLuint mask)) \
+ F(void, ClearIndex, (GLfloat c)) \
+ F(void, ClearAccum, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) \
+ F(void, PushName, (GLuint name)) \
+ F(void, PopName, ()) \
+ F(void, PassThrough, (GLfloat token)) \
+ F(void, LoadName, (GLuint name)) \
+ F(void, InitNames, ()) \
+ F(GLint, RenderMode, (GLenum mode)) \
+ F(void, SelectBuffer, (GLsizei size, GLuint *buffer)) \
+ F(void, FeedbackBuffer, (GLsizei size, GLenum type, GLfloat *buffer)) \
+ F(void, TexGeniv, (GLenum coord, GLenum pname, const GLint *params)) \
+ F(void, TexGeni, (GLenum coord, GLenum pname, GLint param)) \
+ F(void, TexGenfv, (GLenum coord, GLenum pname, const GLfloat *params)) \
+ F(void, TexGenf, (GLenum coord, GLenum pname, GLfloat param)) \
+ F(void, TexGendv, (GLenum coord, GLenum pname, const GLdouble *params)) \
+ F(void, TexGend, (GLenum coord, GLenum pname, GLdouble param)) \
+ F(void, TexEnviv, (GLenum target, GLenum pname, const GLint *params)) \
+ F(void, TexEnvi, (GLenum target, GLenum pname, GLint param)) \
+ F(void, TexEnvfv, (GLenum target, GLenum pname, const GLfloat *params)) \
+ F(void, TexEnvf, (GLenum target, GLenum pname, GLfloat param)) \
+ F(void, ShadeModel, (GLenum mode)) \
+ F(void, PolygonStipple, (const GLubyte *mask)) \
+ F(void, Materialiv, (GLenum face, GLenum pname, const GLint *params)) \
+ F(void, Materiali, (GLenum face, GLenum pname, GLint param)) \
+ F(void, Materialfv, (GLenum face, GLenum pname, const GLfloat *params)) \
+ F(void, Materialf, (GLenum face, GLenum pname, GLfloat param)) \
+ F(void, LineStipple, (GLint factor, GLushort pattern)) \
+ F(void, LightModeliv, (GLenum pname, const GLint *params)) \
+ F(void, LightModeli, (GLenum pname, GLint param)) \
+ F(void, LightModelfv, (GLenum pname, const GLfloat *params)) \
+ F(void, LightModelf, (GLenum pname, GLfloat param)) \
+ F(void, Lightiv, (GLenum light, GLenum pname, const GLint *params)) \
+ F(void, Lighti, (GLenum light, GLenum pname, GLint param)) \
+ F(void, Lightfv, (GLenum light, GLenum pname, const GLfloat *params)) \
+ F(void, Lightf, (GLenum light, GLenum pname, GLfloat param)) \
+ F(void, Fogiv, (GLenum pname, const GLint *params)) \
+ F(void, Fogi, (GLenum pname, GLint param)) \
+ F(void, Fogfv, (GLenum pname, const GLfloat *params)) \
+ F(void, Fogf, (GLenum pname, GLfloat param)) \
+ F(void, ColorMaterial, (GLenum face, GLenum mode)) \
+ F(void, ClipPlane, (GLenum plane, const GLdouble *equation)) \
+ F(void, Vertex4sv, (const GLshort *v)) \
+ F(void, Vertex4s, (GLshort x, GLshort y, GLshort z, GLshort w)) \
+ F(void, Vertex4iv, (const GLint *v)) \
+ F(void, Vertex4i, (GLint x, GLint y, GLint z, GLint w)) \
+ F(void, Vertex4fv, (const GLfloat *v)) \
+ F(void, Vertex4f, (GLfloat x, GLfloat y, GLfloat z, GLfloat w)) \
+ F(void, Vertex4dv, (const GLdouble *v)) \
+ F(void, Vertex4d, (GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
+ F(void, Vertex3sv, (const GLshort *v)) \
+ F(void, Vertex3s, (GLshort x, GLshort y, GLshort z)) \
+ F(void, Vertex3iv, (const GLint *v)) \
+ F(void, Vertex3i, (GLint x, GLint y, GLint z)) \
+ F(void, Vertex3fv, (const GLfloat *v)) \
+ F(void, Vertex3f, (GLfloat x, GLfloat y, GLfloat z)) \
+ F(void, Vertex3dv, (const GLdouble *v)) \
+ F(void, Vertex3d, (GLdouble x, GLdouble y, GLdouble z)) \
+ F(void, Vertex2sv, (const GLshort *v)) \
+ F(void, Vertex2s, (GLshort x, GLshort y)) \
+ F(void, Vertex2iv, (const GLint *v)) \
+ F(void, Vertex2i, (GLint x, GLint y)) \
+ F(void, Vertex2fv, (const GLfloat *v)) \
+ F(void, Vertex2f, (GLfloat x, GLfloat y)) \
+ F(void, Vertex2dv, (const GLdouble *v)) \
+ F(void, Vertex2d, (GLdouble x, GLdouble y)) \
+ F(void, TexCoord4sv, (const GLshort *v)) \
+ F(void, TexCoord4s, (GLshort s, GLshort t, GLshort r, GLshort q)) \
+ F(void, TexCoord4iv, (const GLint *v)) \
+ F(void, TexCoord4i, (GLint s, GLint t, GLint r, GLint q)) \
+ F(void, TexCoord4fv, (const GLfloat *v)) \
+ F(void, TexCoord4f, (GLfloat s, GLfloat t, GLfloat r, GLfloat q)) \
+ F(void, TexCoord4dv, (const GLdouble *v)) \
+ F(void, TexCoord4d, (GLdouble s, GLdouble t, GLdouble r, GLdouble q)) \
+ F(void, TexCoord3sv, (const GLshort *v)) \
+ F(void, TexCoord3s, (GLshort s, GLshort t, GLshort r)) \
+ F(void, TexCoord3iv, (const GLint *v)) \
+ F(void, TexCoord3i, (GLint s, GLint t, GLint r)) \
+ F(void, TexCoord3fv, (const GLfloat *v)) \
+ F(void, TexCoord3f, (GLfloat s, GLfloat t, GLfloat r)) \
+ F(void, TexCoord3dv, (const GLdouble *v)) \
+ F(void, TexCoord3d, (GLdouble s, GLdouble t, GLdouble r)) \
+ F(void, TexCoord2sv, (const GLshort *v)) \
+ F(void, TexCoord2s, (GLshort s, GLshort t)) \
+ F(void, TexCoord2iv, (const GLint *v)) \
+ F(void, TexCoord2i, (GLint s, GLint t)) \
+ F(void, TexCoord2fv, (const GLfloat *v)) \
+ F(void, TexCoord2f, (GLfloat s, GLfloat t)) \
+ F(void, TexCoord2dv, (const GLdouble *v)) \
+ F(void, TexCoord2d, (GLdouble s, GLdouble t)) \
+ F(void, TexCoord1sv, (const GLshort *v)) \
+ F(void, TexCoord1s, (GLshort s)) \
+ F(void, TexCoord1iv, (const GLint *v)) \
+ F(void, TexCoord1i, (GLint s)) \
+ F(void, TexCoord1fv, (const GLfloat *v)) \
+ F(void, TexCoord1f, (GLfloat s)) \
+ F(void, TexCoord1dv, (const GLdouble *v)) \
+ F(void, TexCoord1d, (GLdouble s)) \
+ F(void, Rectsv, (const GLshort *v1, const GLshort *v2)) \
+ F(void, Rects, (GLshort x1, GLshort y1, GLshort x2, GLshort y2)) \
+ F(void, Rectiv, (const GLint *v1, const GLint *v2)) \
+ F(void, Recti, (GLint x1, GLint y1, GLint x2, GLint y2)) \
+ F(void, Rectfv, (const GLfloat *v1, const GLfloat *v2)) \
+ F(void, Rectf, (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)) \
+ F(void, Rectdv, (const GLdouble *v1, const GLdouble *v2)) \
+ F(void, Rectd, (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)) \
+ F(void, RasterPos4sv, (const GLshort *v)) \
+ F(void, RasterPos4s, (GLshort x, GLshort y, GLshort z, GLshort w)) \
+ F(void, RasterPos4iv, (const GLint *v)) \
+ F(void, RasterPos4i, (GLint x, GLint y, GLint z, GLint w)) \
+ F(void, RasterPos4fv, (const GLfloat *v)) \
+ F(void, RasterPos4f, (GLfloat x, GLfloat y, GLfloat z, GLfloat w)) \
+ F(void, RasterPos4dv, (const GLdouble *v)) \
+ F(void, RasterPos4d, (GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
+ F(void, RasterPos3sv, (const GLshort *v)) \
+ F(void, RasterPos3s, (GLshort x, GLshort y, GLshort z)) \
+ F(void, RasterPos3iv, (const GLint *v)) \
+ F(void, RasterPos3i, (GLint x, GLint y, GLint z)) \
+ F(void, RasterPos3fv, (const GLfloat *v)) \
+ F(void, RasterPos3f, (GLfloat x, GLfloat y, GLfloat z)) \
+ F(void, RasterPos3dv, (const GLdouble *v)) \
+ F(void, RasterPos3d, (GLdouble x, GLdouble y, GLdouble z)) \
+ F(void, RasterPos2sv, (const GLshort *v)) \
+ F(void, RasterPos2s, (GLshort x, GLshort y)) \
+ F(void, RasterPos2iv, (const GLint *v)) \
+ F(void, RasterPos2i, (GLint x, GLint y)) \
+ F(void, RasterPos2fv, (const GLfloat *v)) \
+ F(void, RasterPos2f, (GLfloat x, GLfloat y)) \
+ F(void, RasterPos2dv, (const GLdouble *v)) \
+ F(void, RasterPos2d, (GLdouble x, GLdouble y)) \
+ F(void, Normal3sv, (const GLshort *v)) \
+ F(void, Normal3s, (GLshort nx, GLshort ny, GLshort nz)) \
+ F(void, Normal3iv, (const GLint *v)) \
+ F(void, Normal3i, (GLint nx, GLint ny, GLint nz)) \
+ F(void, Normal3fv, (const GLfloat *v)) \
+ F(void, Normal3f, (GLfloat nx, GLfloat ny, GLfloat nz)) \
+ F(void, Normal3dv, (const GLdouble *v)) \
+ F(void, Normal3d, (GLdouble nx, GLdouble ny, GLdouble nz)) \
+ F(void, Normal3bv, (const GLbyte *v)) \
+ F(void, Normal3b, (GLbyte nx, GLbyte ny, GLbyte nz)) \
+ F(void, Indexsv, (const GLshort *c)) \
+ F(void, Indexs, (GLshort c)) \
+ F(void, Indexiv, (const GLint *c)) \
+ F(void, Indexi, (GLint c)) \
+ F(void, Indexfv, (const GLfloat *c)) \
+ F(void, Indexf, (GLfloat c)) \
+ F(void, Indexdv, (const GLdouble *c)) \
+ F(void, Indexd, (GLdouble c)) \
+ F(void, End, ()) \
+ F(void, EdgeFlagv, (const GLboolean *flag)) \
+ F(void, EdgeFlag, (GLboolean flag)) \
+ F(void, Color4usv, (const GLushort *v)) \
+ F(void, Color4us, (GLushort red, GLushort green, GLushort blue, GLushort alpha)) \
+ F(void, Color4uiv, (const GLuint *v)) \
+ F(void, Color4ui, (GLuint red, GLuint green, GLuint blue, GLuint alpha)) \
+ F(void, Color4ubv, (const GLubyte *v)) \
+ F(void, Color4ub, (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)) \
+ F(void, Color4sv, (const GLshort *v)) \
+ F(void, Color4s, (GLshort red, GLshort green, GLshort blue, GLshort alpha)) \
+ F(void, Color4iv, (const GLint *v)) \
+ F(void, Color4i, (GLint red, GLint green, GLint blue, GLint alpha)) \
+ F(void, Color4fv, (const GLfloat *v)) \
+ F(void, Color4f, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) \
+ F(void, Color4dv, (const GLdouble *v)) \
+ F(void, Color4d, (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)) \
+ F(void, Color4bv, (const GLbyte *v)) \
+ F(void, Color4b, (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)) \
+ F(void, Color3usv, (const GLushort *v)) \
+ F(void, Color3us, (GLushort red, GLushort green, GLushort blue)) \
+ F(void, Color3uiv, (const GLuint *v)) \
+ F(void, Color3ui, (GLuint red, GLuint green, GLuint blue)) \
+ F(void, Color3ubv, (const GLubyte *v)) \
+ F(void, Color3ub, (GLubyte red, GLubyte green, GLubyte blue)) \
+ F(void, Color3sv, (const GLshort *v)) \
+ F(void, Color3s, (GLshort red, GLshort green, GLshort blue)) \
+ F(void, Color3iv, (const GLint *v)) \
+ F(void, Color3i, (GLint red, GLint green, GLint blue)) \
+ F(void, Color3fv, (const GLfloat *v)) \
+ F(void, Color3f, (GLfloat red, GLfloat green, GLfloat blue)) \
+ F(void, Color3dv, (const GLdouble *v)) \
+ F(void, Color3d, (GLdouble red, GLdouble green, GLdouble blue)) \
+ F(void, Color3bv, (const GLbyte *v)) \
+ F(void, Color3b, (GLbyte red, GLbyte green, GLbyte blue)) \
+ F(void, Bitmap, (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)) \
+ F(void, Begin, (GLenum mode)) \
+ F(void, ListBase, (GLuint base)) \
+ F(GLuint, GenLists, (GLsizei range)) \
+ F(void, DeleteLists, (GLuint list, GLsizei range)) \
+ F(void, CallLists, (GLsizei n, GLenum type, const GLvoid *lists)) \
+ F(void, CallList, (GLuint list)) \
+ F(void, EndList, ()) \
+ F(void, NewList, (GLuint list, GLenum mode)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_1_0_DEPRECATED_FUNCTIONS);
+};
+
+class QOpenGLFunctions_1_1_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_1_1_DeprecatedBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_1_1_Deprecated; }
+
+ // OpenGL 1.1 deprecated functions
+#define QT_OPENGL_1_1_DEPRECATED_FUNCTIONS(F) \
+ F(void, PushClientAttrib, (GLbitfield mask)) \
+ F(void, PopClientAttrib, ()) \
+ F(void, PrioritizeTextures, (GLsizei n, const GLuint *textures, const GLfloat *priorities)) \
+ F(GLboolean, AreTexturesResident, (GLsizei n, const GLuint *textures, GLboolean *residences)) \
+ F(void, VertexPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
+ F(void, TexCoordPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
+ F(void, NormalPointer, (GLenum type, GLsizei stride, const GLvoid *pointer)) \
+ F(void, InterleavedArrays, (GLenum format, GLsizei stride, const GLvoid *pointer)) \
+ F(void, IndexPointer, (GLenum type, GLsizei stride, const GLvoid *pointer)) \
+ F(void, EnableClientState, (GLenum array)) \
+ F(void, EdgeFlagPointer, (GLsizei stride, const GLvoid *pointer)) \
+ F(void, DisableClientState, (GLenum array)) \
+ F(void, ColorPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
+ F(void, ArrayElement, (GLint i)) \
+ F(void, Indexubv, (const GLubyte *c)) \
+ F(void, Indexub, (GLubyte c)) \
+ F(void, GetPointerv, (GLenum pname, GLvoid* *params)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_1_1_DEPRECATED_FUNCTIONS);
+};
+
+class QOpenGLFunctions_1_2_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_1_2_DeprecatedBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_1_2_Deprecated; }
+
+ // OpenGL 1.2 deprecated functions
+#define QT_OPENGL_1_2_DEPRECATED_FUNCTIONS(F) \
+ F(void, ColorTableParameterfv, (GLenum target, GLenum pname, const GLfloat *params)) \
+ F(void, ColorTableParameteriv, (GLenum target, GLenum pname, const GLint *params)) \
+ F(void, CopyColorTable, (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)) \
+ F(void, GetColorTable, (GLenum target, GLenum format, GLenum type, GLvoid *table)) \
+ F(void, GetColorTableParameterfv, (GLenum target, GLenum pname, GLfloat *params)) \
+ F(void, GetColorTableParameteriv, (GLenum target, GLenum pname, GLint *params)) \
+ F(void, ColorSubTable, (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)) \
+ F(void, CopyColorSubTable, (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)) \
+ F(void, ConvolutionFilter1D, (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)) \
+ F(void, ConvolutionFilter2D, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)) \
+ F(void, ConvolutionParameterf, (GLenum target, GLenum pname, GLfloat params)) \
+ F(void, ConvolutionParameterfv, (GLenum target, GLenum pname, const GLfloat *params)) \
+ F(void, ConvolutionParameteri, (GLenum target, GLenum pname, GLint params)) \
+ F(void, ConvolutionParameteriv, (GLenum target, GLenum pname, const GLint *params)) \
+ F(void, CopyConvolutionFilter1D, (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)) \
+ F(void, CopyConvolutionFilter2D, (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)) \
+ F(void, GetConvolutionFilter, (GLenum target, GLenum format, GLenum type, GLvoid *image)) \
+ F(void, GetConvolutionParameterfv, (GLenum target, GLenum pname, GLfloat *params)) \
+ F(void, GetConvolutionParameteriv, (GLenum target, GLenum pname, GLint *params)) \
+ F(void, GetSeparableFilter, (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)) \
+ F(void, SeparableFilter2D, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)) \
+ F(void, GetHistogram, (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)) \
+ F(void, GetHistogramParameterfv, (GLenum target, GLenum pname, GLfloat *params)) \
+ F(void, GetHistogramParameteriv, (GLenum target, GLenum pname, GLint *params)) \
+ F(void, GetMinmax, (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)) \
+ F(void, GetMinmaxParameterfv, (GLenum target, GLenum pname, GLfloat *params)) \
+ F(void, GetMinmaxParameteriv, (GLenum target, GLenum pname, GLint *params)) \
+ F(void, Histogram, (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)) \
+ F(void, Minmax, (GLenum target, GLenum internalformat, GLboolean sink)) \
+ F(void, ResetHistogram, (GLenum target)) \
+ F(void, ResetMinmax, (GLenum target)) \
+ F(void, ColorTable, (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_1_2_DEPRECATED_FUNCTIONS);
+};
+
+class QOpenGLFunctions_1_3_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_1_3_DeprecatedBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_1_3_Deprecated; }
+
+ // OpenGL 1.3 deprecated functions
+#define QT_OPENGL_1_3_DEPRECATED_FUNCTIONS(F) \
+ F(void, MultTransposeMatrixd, (const GLdouble *m)) \
+ F(void, MultTransposeMatrixf, (const GLfloat *m)) \
+ F(void, LoadTransposeMatrixd, (const GLdouble *m)) \
+ F(void, LoadTransposeMatrixf, (const GLfloat *m)) \
+ F(void, MultiTexCoord4sv, (GLenum target, const GLshort *v)) \
+ F(void, MultiTexCoord4s, (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)) \
+ F(void, MultiTexCoord4iv, (GLenum target, const GLint *v)) \
+ F(void, MultiTexCoord4i, (GLenum target, GLint s, GLint t, GLint r, GLint q)) \
+ F(void, MultiTexCoord4fv, (GLenum target, const GLfloat *v)) \
+ F(void, MultiTexCoord4f, (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)) \
+ F(void, MultiTexCoord4dv, (GLenum target, const GLdouble *v)) \
+ F(void, MultiTexCoord4d, (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)) \
+ F(void, MultiTexCoord3sv, (GLenum target, const GLshort *v)) \
+ F(void, MultiTexCoord3s, (GLenum target, GLshort s, GLshort t, GLshort r)) \
+ F(void, MultiTexCoord3iv, (GLenum target, const GLint *v)) \
+ F(void, MultiTexCoord3i, (GLenum target, GLint s, GLint t, GLint r)) \
+ F(void, MultiTexCoord3fv, (GLenum target, const GLfloat *v)) \
+ F(void, MultiTexCoord3f, (GLenum target, GLfloat s, GLfloat t, GLfloat r)) \
+ F(void, MultiTexCoord3dv, (GLenum target, const GLdouble *v)) \
+ F(void, MultiTexCoord3d, (GLenum target, GLdouble s, GLdouble t, GLdouble r)) \
+ F(void, MultiTexCoord2sv, (GLenum target, const GLshort *v)) \
+ F(void, MultiTexCoord2s, (GLenum target, GLshort s, GLshort t)) \
+ F(void, MultiTexCoord2iv, (GLenum target, const GLint *v)) \
+ F(void, MultiTexCoord2i, (GLenum target, GLint s, GLint t)) \
+ F(void, MultiTexCoord2fv, (GLenum target, const GLfloat *v)) \
+ F(void, MultiTexCoord2f, (GLenum target, GLfloat s, GLfloat t)) \
+ F(void, MultiTexCoord2dv, (GLenum target, const GLdouble *v)) \
+ F(void, MultiTexCoord2d, (GLenum target, GLdouble s, GLdouble t)) \
+ F(void, MultiTexCoord1sv, (GLenum target, const GLshort *v)) \
+ F(void, MultiTexCoord1s, (GLenum target, GLshort s)) \
+ F(void, MultiTexCoord1iv, (GLenum target, const GLint *v)) \
+ F(void, MultiTexCoord1i, (GLenum target, GLint s)) \
+ F(void, MultiTexCoord1fv, (GLenum target, const GLfloat *v)) \
+ F(void, MultiTexCoord1f, (GLenum target, GLfloat s)) \
+ F(void, MultiTexCoord1dv, (GLenum target, const GLdouble *v)) \
+ F(void, MultiTexCoord1d, (GLenum target, GLdouble s)) \
+ F(void, ClientActiveTexture, (GLenum texture)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_1_3_DEPRECATED_FUNCTIONS);
+};
+
+class QOpenGLFunctions_1_4_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_1_4_DeprecatedBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_1_4_Deprecated; }
+
+ // OpenGL 1.4 deprecated functions
+#define QT_OPENGL_1_4_DEPRECATED_FUNCTIONS(F) \
+ F(void, WindowPos3sv, (const GLshort *v)) \
+ F(void, WindowPos3s, (GLshort x, GLshort y, GLshort z)) \
+ F(void, WindowPos3iv, (const GLint *v)) \
+ F(void, WindowPos3i, (GLint x, GLint y, GLint z)) \
+ F(void, WindowPos3fv, (const GLfloat *v)) \
+ F(void, WindowPos3f, (GLfloat x, GLfloat y, GLfloat z)) \
+ F(void, WindowPos3dv, (const GLdouble *v)) \
+ F(void, WindowPos3d, (GLdouble x, GLdouble y, GLdouble z)) \
+ F(void, WindowPos2sv, (const GLshort *v)) \
+ F(void, WindowPos2s, (GLshort x, GLshort y)) \
+ F(void, WindowPos2iv, (const GLint *v)) \
+ F(void, WindowPos2i, (GLint x, GLint y)) \
+ F(void, WindowPos2fv, (const GLfloat *v)) \
+ F(void, WindowPos2f, (GLfloat x, GLfloat y)) \
+ F(void, WindowPos2dv, (const GLdouble *v)) \
+ F(void, WindowPos2d, (GLdouble x, GLdouble y)) \
+ F(void, SecondaryColorPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) \
+ F(void, SecondaryColor3usv, (const GLushort *v)) \
+ F(void, SecondaryColor3us, (GLushort red, GLushort green, GLushort blue)) \
+ F(void, SecondaryColor3uiv, (const GLuint *v)) \
+ F(void, SecondaryColor3ui, (GLuint red, GLuint green, GLuint blue)) \
+ F(void, SecondaryColor3ubv, (const GLubyte *v)) \
+ F(void, SecondaryColor3ub, (GLubyte red, GLubyte green, GLubyte blue)) \
+ F(void, SecondaryColor3sv, (const GLshort *v)) \
+ F(void, SecondaryColor3s, (GLshort red, GLshort green, GLshort blue)) \
+ F(void, SecondaryColor3iv, (const GLint *v)) \
+ F(void, SecondaryColor3i, (GLint red, GLint green, GLint blue)) \
+ F(void, SecondaryColor3fv, (const GLfloat *v)) \
+ F(void, SecondaryColor3f, (GLfloat red, GLfloat green, GLfloat blue)) \
+ F(void, SecondaryColor3dv, (const GLdouble *v)) \
+ F(void, SecondaryColor3d, (GLdouble red, GLdouble green, GLdouble blue)) \
+ F(void, SecondaryColor3bv, (const GLbyte *v)) \
+ F(void, SecondaryColor3b, (GLbyte red, GLbyte green, GLbyte blue)) \
+ F(void, FogCoordPointer, (GLenum type, GLsizei stride, const GLvoid *pointer)) \
+ F(void, FogCoorddv, (const GLdouble *coord)) \
+ F(void, FogCoordd, (GLdouble coord)) \
+ F(void, FogCoordfv, (const GLfloat *coord)) \
+ F(void, FogCoordf, (GLfloat coord)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_1_4_DEPRECATED_FUNCTIONS);
+};
+
+class QOpenGLFunctions_2_0_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_2_0_DeprecatedBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_2_0_Deprecated; }
+
+ // OpenGL 2.0 deprecated functions
+#define QT_OPENGL_2_0_DEPRECATED_FUNCTIONS(F) \
+ F(void, VertexAttrib4usv, (GLuint index, const GLushort *v)) \
+ F(void, VertexAttrib4uiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttrib4ubv, (GLuint index, const GLubyte *v)) \
+ F(void, VertexAttrib4sv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttrib4s, (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)) \
+ F(void, VertexAttrib4iv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttrib4fv, (GLuint index, const GLfloat *v)) \
+ F(void, VertexAttrib4f, (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)) \
+ F(void, VertexAttrib4dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttrib4d, (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)) \
+ F(void, VertexAttrib4bv, (GLuint index, const GLbyte *v)) \
+ F(void, VertexAttrib4Nusv, (GLuint index, const GLushort *v)) \
+ F(void, VertexAttrib4Nuiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttrib4Nubv, (GLuint index, const GLubyte *v)) \
+ F(void, VertexAttrib4Nub, (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)) \
+ F(void, VertexAttrib4Nsv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttrib4Niv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttrib4Nbv, (GLuint index, const GLbyte *v)) \
+ F(void, VertexAttrib3sv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttrib3s, (GLuint index, GLshort x, GLshort y, GLshort z)) \
+ F(void, VertexAttrib3fv, (GLuint index, const GLfloat *v)) \
+ F(void, VertexAttrib3f, (GLuint index, GLfloat x, GLfloat y, GLfloat z)) \
+ F(void, VertexAttrib3dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttrib3d, (GLuint index, GLdouble x, GLdouble y, GLdouble z)) \
+ F(void, VertexAttrib2sv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttrib2s, (GLuint index, GLshort x, GLshort y)) \
+ F(void, VertexAttrib2fv, (GLuint index, const GLfloat *v)) \
+ F(void, VertexAttrib2f, (GLuint index, GLfloat x, GLfloat y)) \
+ F(void, VertexAttrib2dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttrib2d, (GLuint index, GLdouble x, GLdouble y)) \
+ F(void, VertexAttrib1sv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttrib1s, (GLuint index, GLshort x)) \
+ F(void, VertexAttrib1fv, (GLuint index, const GLfloat *v)) \
+ F(void, VertexAttrib1f, (GLuint index, GLfloat x)) \
+ F(void, VertexAttrib1dv, (GLuint index, const GLdouble *v)) \
+ F(void, VertexAttrib1d, (GLuint index, GLdouble x)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_2_0_DEPRECATED_FUNCTIONS);
+};
+
+class QOpenGLFunctions_3_0_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_3_0_DeprecatedBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_3_0_Deprecated; }
+
+ // OpenGL 3.0 deprecated functions
+#define QT_OPENGL_3_0_DEPRECATED_FUNCTIONS(F) \
+ F(void, VertexAttribI4usv, (GLuint index, const GLushort *v)) \
+ F(void, VertexAttribI4ubv, (GLuint index, const GLubyte *v)) \
+ F(void, VertexAttribI4sv, (GLuint index, const GLshort *v)) \
+ F(void, VertexAttribI4bv, (GLuint index, const GLbyte *v)) \
+ F(void, VertexAttribI4uiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttribI3uiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttribI2uiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttribI1uiv, (GLuint index, const GLuint *v)) \
+ F(void, VertexAttribI4iv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttribI3iv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttribI2iv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttribI1iv, (GLuint index, const GLint *v)) \
+ F(void, VertexAttribI4ui, (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)) \
+ F(void, VertexAttribI3ui, (GLuint index, GLuint x, GLuint y, GLuint z)) \
+ F(void, VertexAttribI2ui, (GLuint index, GLuint x, GLuint y)) \
+ F(void, VertexAttribI1ui, (GLuint index, GLuint x)) \
+ F(void, VertexAttribI4i, (GLuint index, GLint x, GLint y, GLint z, GLint w)) \
+ F(void, VertexAttribI3i, (GLuint index, GLint x, GLint y, GLint z)) \
+ F(void, VertexAttribI2i, (GLuint index, GLint x, GLint y)) \
+ F(void, VertexAttribI1i, (GLuint index, GLint x)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_3_0_DEPRECATED_FUNCTIONS);
+};
+
+class QOpenGLFunctions_3_3_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_3_3_DeprecatedBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_3_3_Deprecated; }
+
+ // OpenGL 3.3 deprecated functions
+#define QT_OPENGL_3_3_DEPRECATED_FUNCTIONS(F) \
+ F(void, SecondaryColorP3uiv, (GLenum type, const GLuint *color)) \
+ F(void, SecondaryColorP3ui, (GLenum type, GLuint color)) \
+ F(void, ColorP4uiv, (GLenum type, const GLuint *color)) \
+ F(void, ColorP4ui, (GLenum type, GLuint color)) \
+ F(void, ColorP3uiv, (GLenum type, const GLuint *color)) \
+ F(void, ColorP3ui, (GLenum type, GLuint color)) \
+ F(void, NormalP3uiv, (GLenum type, const GLuint *coords)) \
+ F(void, NormalP3ui, (GLenum type, GLuint coords)) \
+ F(void, MultiTexCoordP4uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
+ F(void, MultiTexCoordP4ui, (GLenum texture, GLenum type, GLuint coords)) \
+ F(void, MultiTexCoordP3uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
+ F(void, MultiTexCoordP3ui, (GLenum texture, GLenum type, GLuint coords)) \
+ F(void, MultiTexCoordP2uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
+ F(void, MultiTexCoordP2ui, (GLenum texture, GLenum type, GLuint coords)) \
+ F(void, MultiTexCoordP1uiv, (GLenum texture, GLenum type, const GLuint *coords)) \
+ F(void, MultiTexCoordP1ui, (GLenum texture, GLenum type, GLuint coords)) \
+ F(void, TexCoordP4uiv, (GLenum type, const GLuint *coords)) \
+ F(void, TexCoordP4ui, (GLenum type, GLuint coords)) \
+ F(void, TexCoordP3uiv, (GLenum type, const GLuint *coords)) \
+ F(void, TexCoordP3ui, (GLenum type, GLuint coords)) \
+ F(void, TexCoordP2uiv, (GLenum type, const GLuint *coords)) \
+ F(void, TexCoordP2ui, (GLenum type, GLuint coords)) \
+ F(void, TexCoordP1uiv, (GLenum type, const GLuint *coords)) \
+ F(void, TexCoordP1ui, (GLenum type, GLuint coords)) \
+ F(void, VertexP4uiv, (GLenum type, const GLuint *value)) \
+ F(void, VertexP4ui, (GLenum type, GLuint value)) \
+ F(void, VertexP3uiv, (GLenum type, const GLuint *value)) \
+ F(void, VertexP3ui, (GLenum type, GLuint value)) \
+ F(void, VertexP2uiv, (GLenum type, const GLuint *value)) \
+ F(void, VertexP2ui, (GLenum type, GLuint value)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_3_3_DEPRECATED_FUNCTIONS);
+};
+
+class QOpenGLFunctions_4_5_DeprecatedBackend : public QOpenGLVersionFunctionsBackend
+{
+public:
+ QOpenGLFunctions_4_5_DeprecatedBackend(QOpenGLContext *c)
+ : QOpenGLVersionFunctionsBackend(c)
+ {
+ init();
+ }
+
+ Q_DECL_CONSTEXPR static Version versionStatus()
+ { return OpenGL_4_5_Deprecated; }
+
+ // OpenGL 4.5 deprecated functions
+#define QT_OPENGL_4_5_DEPRECATED_FUNCTIONS(F) \
+ F(void, GetnMinmax, (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values)) \
+ F(void, GetnHistogram, (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values)) \
+ F(void, GetnSeparableFilter, (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span)) \
+ F(void, GetnConvolutionFilter, (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image)) \
+ F(void, GetnColorTable, (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table)) \
+ F(void, GetnPolygonStipple, (GLsizei bufSize, GLubyte *pattern)) \
+ F(void, GetnPixelMapusv, (GLenum map, GLsizei bufSize, GLushort *values)) \
+ F(void, GetnPixelMapuiv, (GLenum map, GLsizei bufSize, GLuint *values)) \
+ F(void, GetnPixelMapfv, (GLenum map, GLsizei bufSize, GLfloat *values)) \
+ F(void, GetnMapiv, (GLenum target, GLenum query, GLsizei bufSize, GLint *v)) \
+ F(void, GetnMapfv, (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v)) \
+ F(void, GetnMapdv, (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v)) \
+
+ QT_OPENGL_DECLARE(QT_OPENGL_4_5_DEPRECATED_FUNCTIONS);
+};
+
+#else
+
+// No need for backend classes with function pointers with ES2.
+// All function addresses are independent of context and display.
+
+#endif // !QT_CONFIG(opengles2)
+
+#undef QT_OPENGL_DECLARE_FUNCTIONS
+#undef QT_OPENGL_COUNT_FUNCTIONS
+#undef QT_OPENGL_DECLARE
+
+
+QT_END_NAMESPACE
+
+#ifdef Q_OS_WIN
+#pragma pop_macro("MemoryBarrier")
+#endif
+
+#endif // QT_NO_OPENGL
+
+#endif
diff --git a/src/opengl/qopenglversionfunctions_p.h b/src/opengl/qopenglversionfunctions_p.h
new file mode 100644
index 0000000000..cad4374e27
--- /dev/null
+++ b/src/opengl/qopenglversionfunctions_p.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2012 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONS_P_H
+#define QOPENGLVERSIONFUNCTIONS_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qopenglversionfunctions.h"
+
+#include <QtGui/private/qopenglcontext_p.h>
+
+#include <QtOpenGL/qtopenglglobal.h>
+#include <QtOpenGL/QOpenGLVersionProfile>
+#include <QtCore/QSet>
+
+QT_BEGIN_NAMESPACE
+
+class QAbstractOpenGLFunctions;
+
+class QOpenGLContextVersionData : public QOpenGLContextVersionFunctionHelper
+{
+public:
+ QHash<QOpenGLVersionProfile, QAbstractOpenGLFunctions *> functions;
+ QOpenGLVersionFunctionsStorage functionsStorage;
+ QSet<QAbstractOpenGLFunctions *> externalFunctions;
+ ~QOpenGLContextVersionData() override;
+ static QOpenGLContextVersionData *forContext(QOpenGLContext *context);
+};
+
+QT_END_NAMESPACE
+
+#endif // QOPENGLVERSIONFUNCTIONS_P_H
diff --git a/src/opengl/qopenglversionfunctionsfactory.cpp b/src/opengl/qopenglversionfunctionsfactory.cpp
new file mode 100644
index 0000000000..d377c64961
--- /dev/null
+++ b/src/opengl/qopenglversionfunctionsfactory.cpp
@@ -0,0 +1,280 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#include "qopenglversionfunctionsfactory.h"
+#include "qopenglversionfunctions_p.h"
+
+#if !QT_CONFIG(opengles2)
+#include "qopenglfunctions_4_5_core.h"
+#include "qopenglfunctions_4_5_compatibility.h"
+#include "qopenglfunctions_4_4_core.h"
+#include "qopenglfunctions_4_4_compatibility.h"
+#include "qopenglfunctions_4_3_core.h"
+#include "qopenglfunctions_4_3_compatibility.h"
+#include "qopenglfunctions_4_2_core.h"
+#include "qopenglfunctions_4_2_compatibility.h"
+#include "qopenglfunctions_4_1_core.h"
+#include "qopenglfunctions_4_1_compatibility.h"
+#include "qopenglfunctions_4_0_core.h"
+#include "qopenglfunctions_4_0_compatibility.h"
+#include "qopenglfunctions_3_3_core.h"
+#include "qopenglfunctions_3_3_compatibility.h"
+#include "qopenglfunctions_3_2_core.h"
+#include "qopenglfunctions_3_2_compatibility.h"
+#include "qopenglfunctions_3_1.h"
+#include "qopenglfunctions_3_0.h"
+#include "qopenglfunctions_2_1.h"
+#include "qopenglfunctions_2_0.h"
+#include "qopenglfunctions_1_5.h"
+#include "qopenglfunctions_1_4.h"
+#include "qopenglfunctions_1_3.h"
+#include "qopenglfunctions_1_2.h"
+#include "qopenglfunctions_1_1.h"
+#include "qopenglfunctions_1_0.h"
+#else
+#include "qopenglfunctions_es2.h"
+#endif
+
+QT_BEGIN_NAMESPACE
+
+static QAbstractOpenGLFunctions *createFunctions(const QOpenGLVersionProfile &versionProfile)
+{
+#if !QT_CONFIG(opengles2)
+ const int major = versionProfile.version().first;
+ const int minor = versionProfile.version().second;
+
+ if (versionProfile.hasProfiles()) {
+ switch (versionProfile.profile()) {
+ case QSurfaceFormat::CoreProfile:
+ if (major == 4 && minor == 5)
+ return new QOpenGLFunctions_4_5_Core;
+ else if (major == 4 && minor == 4)
+ return new QOpenGLFunctions_4_4_Core;
+ else if (major == 4 && minor == 3)
+ return new QOpenGLFunctions_4_3_Core;
+ else if (major == 4 && minor == 2)
+ return new QOpenGLFunctions_4_2_Core;
+ else if (major == 4 && minor == 1)
+ return new QOpenGLFunctions_4_1_Core;
+ else if (major == 4 && minor == 0)
+ return new QOpenGLFunctions_4_0_Core;
+ else if (major == 3 && minor == 3)
+ return new QOpenGLFunctions_3_3_Core;
+ else if (major == 3 && minor == 2)
+ return new QOpenGLFunctions_3_2_Core;
+ break;
+
+ case QSurfaceFormat::CompatibilityProfile:
+ if (major == 4 && minor == 5)
+ return new QOpenGLFunctions_4_5_Compatibility;
+ else if (major == 4 && minor == 4)
+ return new QOpenGLFunctions_4_4_Compatibility;
+ else if (major == 4 && minor == 3)
+ return new QOpenGLFunctions_4_3_Compatibility;
+ else if (major == 4 && minor == 2)
+ return new QOpenGLFunctions_4_2_Compatibility;
+ else if (major == 4 && minor == 1)
+ return new QOpenGLFunctions_4_1_Compatibility;
+ else if (major == 4 && minor == 0)
+ return new QOpenGLFunctions_4_0_Compatibility;
+ else if (major == 3 && minor == 3)
+ return new QOpenGLFunctions_3_3_Compatibility;
+ else if (major == 3 && minor == 2)
+ return new QOpenGLFunctions_3_2_Compatibility;
+ break;
+
+ case QSurfaceFormat::NoProfile:
+ default:
+ break;
+ };
+ } else {
+ if (major == 3 && minor == 1)
+ return new QOpenGLFunctions_3_1;
+ else if (major == 3 && minor == 0)
+ return new QOpenGLFunctions_3_0;
+ else if (major == 2 && minor == 1)
+ return new QOpenGLFunctions_2_1;
+ else if (major == 2 && minor == 0)
+ return new QOpenGLFunctions_2_0;
+ else if (major == 1 && minor == 5)
+ return new QOpenGLFunctions_1_5;
+ else if (major == 1 && minor == 4)
+ return new QOpenGLFunctions_1_4;
+ else if (major == 1 && minor == 3)
+ return new QOpenGLFunctions_1_3;
+ else if (major == 1 && minor == 2)
+ return new QOpenGLFunctions_1_2;
+ else if (major == 1 && minor == 1)
+ return new QOpenGLFunctions_1_1;
+ else if (major == 1 && minor == 0)
+ return new QOpenGLFunctions_1_0;
+ }
+ return nullptr;
+#else
+ Q_UNUSED(versionProfile);
+ return new QOpenGLFunctions_ES2;
+#endif
+}
+
+/*!
+ \fn static T *QOpenGLVersionFunctionsFactory::get(QOpenGLContext *context)
+
+ \overload get()
+
+ Returns a pointer to an object that provides access to all functions for
+ the version and profile of this context. There is no need to call
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions() as long as the \a context
+ is current. It is also possible to call this function when the \a context is not
+ current, but in that case it is the caller's responsibility to ensure proper
+ initialization by calling QAbstractOpenGLFunctions::initializeOpenGLFunctions()
+ afterwards.
+
+ Usually one would use the template version of this function to automatically
+ have the result cast to the correct type.
+
+ \code
+ auto funcs = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_3_3_Core>(context);
+ if (!funcs) {
+ qFatal("Could not obtain required OpenGL context version");
+ }
+ \endcode
+
+ It is possible to request a functions object for a different version and profile
+ than that for which the context was created. To do this either use the template
+ version of this function specifying the desired functions object type as the
+ template parameter or by passing in a QOpenGLVersionProfile object as an argument
+ to the non-template function.
+
+ Note that requests for function objects of other versions or profiles can fail and
+ in doing so will return \nullptr. Situations in which creation of the functions
+ object can fail are if the request cannot be satisfied due to asking for functions
+ that are not in the version or profile of this context. For example:
+
+ \list
+ \li Requesting a 3.3 core profile functions object would succeed.
+ \li Requesting a 3.3 compatibility profile functions object would fail. We would fail
+ to resolve the deprecated functions.
+ \li Requesting a 4.3 core profile functions object would fail. We would fail to resolve
+ the new core functions introduced in versions 4.0-4.3.
+ \li Requesting a 3.1 functions object would succeed. There is nothing in 3.1 that is not
+ also in 3.3 core.
+ \endlist
+
+ Note that if creating a functions object via this method that the QOpenGLContext
+ retains ownership of the object. This is to allow the object to be cached and shared.
+*/
+
+/*!
+ Returns a pointer to an object that provides access to all functions for the
+ \a versionProfile of the \a context. There is no need to call
+ QAbstractOpenGLFunctions::initializeOpenGLFunctions() as long as the \a context
+ is current. It is also possible to call this function when the \a context is not
+ current, but in that case it is the caller's responsibility to ensure proper
+ initialization by calling QAbstractOpenGLFunctions::initializeOpenGLFunctions()
+ afterwards.
+
+ Usually one would use the template version of this function to automatically
+ have the result cast to the correct type.
+*/
+QAbstractOpenGLFunctions *QOpenGLVersionFunctionsFactory::get(const QOpenGLVersionProfile &versionProfile, QOpenGLContext *context)
+{
+ if (!context)
+ context = QOpenGLContext::currentContext();
+
+ if (!context) {
+ qWarning("versionFunctions: No OpenGL context");
+ return nullptr;
+ }
+
+#if !QT_CONFIG(opengles2)
+ if (context->isOpenGLES()) {
+ qWarning("versionFunctions: Not supported on OpenGL ES");
+ return nullptr;
+ }
+#endif // !QT_CONFIG(opengles2)
+
+ const QSurfaceFormat f = context->format();
+
+ // Ensure we have a valid version and profile. Default to context's if none specified
+ QOpenGLVersionProfile vp = versionProfile;
+ if (!vp.isValid())
+ vp = QOpenGLVersionProfile(f);
+
+ // Check that context is compatible with requested version
+ const QPair<int, int> v = qMakePair(f.majorVersion(), f.minorVersion());
+ if (v < vp.version())
+ return nullptr;
+
+ // If this context only offers core profile functions then we can't create
+ // function objects for legacy or compatibility profile requests
+ if (((vp.hasProfiles() && vp.profile() != QSurfaceFormat::CoreProfile) || vp.isLegacyVersion())
+ && f.profile() == QSurfaceFormat::CoreProfile)
+ return nullptr;
+
+ // Create object if suitable one not cached
+ QAbstractOpenGLFunctions* funcs = nullptr;
+ // TODO: replace with something else
+ auto *data = QOpenGLContextVersionData::forContext(context);
+ auto it = data->functions.constFind(vp);
+ if (it == data->functions.constEnd()) {
+ funcs = createFunctions(vp);
+ if (funcs) {
+ funcs->setOwningContext(context);
+ data->functions.insert(vp, funcs);
+ }
+ } else {
+ funcs = it.value();
+ }
+
+ if (funcs && QOpenGLContext::currentContext() == context)
+ funcs->initializeOpenGLFunctions();
+
+ return funcs;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglversionfunctionsfactory.h b/src/opengl/qopenglversionfunctionsfactory.h
new file mode 100644
index 0000000000..0445c2e03d
--- /dev/null
+++ b/src/opengl/qopenglversionfunctionsfactory.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**
+** This file was generated by glgen version 0.1
+** Command line was: glgen
+**
+** glgen is Copyright (C) 2012 Klaralvdalens Datakonsult AB (KDAB)
+**
+** This is an auto-generated file.
+** Do not edit! All changes made to it will be lost.
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONFUNCTIONFACTORY_H
+#define QOPENGLVERSIONFUNCTIONFACTORY_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+#include <QtOpenGL/qopenglversionprofile.h>
+
+QT_BEGIN_NAMESPACE
+
+class QAbstractOpenGLFunctions;
+class QOpenGLContext;
+
+class Q_OPENGL_EXPORT QOpenGLVersionFunctionsFactory
+{
+public:
+ static QAbstractOpenGLFunctions *get(const QOpenGLVersionProfile &versionProfile = QOpenGLVersionProfile(), QOpenGLContext *context = nullptr);
+ template<class TYPE>
+ static TYPE *get(QOpenGLContext *context = nullptr)
+ {
+ QOpenGLVersionProfile v = TYPE::versionProfile();
+ return static_cast<TYPE*>(get(v, context));
+ }
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/opengl/qopenglversionprofile.cpp b/src/opengl/qopenglversionprofile.cpp
new file mode 100644
index 0000000000..afda77857e
--- /dev/null
+++ b/src/opengl/qopenglversionprofile.cpp
@@ -0,0 +1,214 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglversionprofile.h"
+
+#include <QtCore/QDebug>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLVersionProfilePrivate
+{
+public:
+ QOpenGLVersionProfilePrivate()
+ : majorVersion(0),
+ minorVersion(0),
+ profile(QSurfaceFormat::NoProfile)
+ {}
+
+ int majorVersion;
+ int minorVersion;
+ QSurfaceFormat::OpenGLContextProfile profile;
+};
+
+/*!
+ \class QOpenGLVersionProfile
+ \inmodule QtOpenGL
+ \since 5.1
+ \brief The QOpenGLVersionProfile class represents the version and if applicable
+ the profile of an OpenGL context.
+
+ An object of this class can be passed to QOpenGLContext::versionFunctions() to
+ request a functions object for a specific version and profile of OpenGL.
+
+ It also contains some helper functions to check if a version supports profiles
+ or is a legacy version.
+*/
+
+/*!
+ Creates a default invalid QOpenGLVersionProfile object.
+*/
+QOpenGLVersionProfile::QOpenGLVersionProfile()
+ : d(new QOpenGLVersionProfilePrivate)
+{
+}
+
+/*!
+ Creates a QOpenGLVersionProfile object initialised with the version and profile
+ from \a format.
+*/
+QOpenGLVersionProfile::QOpenGLVersionProfile(const QSurfaceFormat &format)
+ : d(new QOpenGLVersionProfilePrivate)
+{
+ d->majorVersion = format.majorVersion();
+ d->minorVersion = format.minorVersion();
+ d->profile = format.profile();
+}
+
+/*!
+ Constructs a copy of \a other.
+*/
+QOpenGLVersionProfile::QOpenGLVersionProfile(const QOpenGLVersionProfile &other)
+ : d(new QOpenGLVersionProfilePrivate)
+{
+ *d = *(other.d);
+}
+
+/*!
+ Destroys the QOpenGLVersionProfile object.
+*/
+QOpenGLVersionProfile::~QOpenGLVersionProfile()
+{
+ delete d;
+}
+
+/*!
+ Assigns the version and profile of \a rhs to this QOpenGLVersionProfile object.
+*/
+QOpenGLVersionProfile &QOpenGLVersionProfile::operator=(const QOpenGLVersionProfile &rhs)
+{
+ if (this == &rhs)
+ return *this;
+ *d = *(rhs.d);
+ return *this;
+}
+
+/*!
+ Returns a QPair<int,int> where the components represent the major and minor OpenGL
+ version numbers respectively.
+
+ \sa setVersion()
+*/
+QPair<int, int> QOpenGLVersionProfile::version() const
+{
+ return qMakePair( d->majorVersion, d->minorVersion);
+}
+
+/*!
+ Sets the major and minor version numbers to \a majorVersion and \a minorVersion respectively.
+
+ \sa version()
+*/
+void QOpenGLVersionProfile::setVersion(int majorVersion, int minorVersion)
+{
+ d->majorVersion = majorVersion;
+ d->minorVersion = minorVersion;
+}
+
+/*!
+ Returns the OpenGL profile. Only makes sense if profiles are supported by this version.
+
+ \sa setProfile()
+*/
+QSurfaceFormat::OpenGLContextProfile QOpenGLVersionProfile::profile() const
+{
+ return d->profile;
+}
+
+/*!
+ Sets the OpenGL profile \a profile. Only makes sense if profiles are supported by
+ this version.
+
+ \sa profile()
+*/
+void QOpenGLVersionProfile::setProfile(QSurfaceFormat::OpenGLContextProfile profile)
+{
+ d->profile = profile;
+}
+
+/*!
+ Returns \c true if profiles are supported by the OpenGL version returned by version(). Only
+ OpenGL versions >= 3.2 support profiles.
+
+ \sa profile(), version()
+*/
+bool QOpenGLVersionProfile::hasProfiles() const
+{
+ return ( d->majorVersion > 3
+ || (d->majorVersion == 3 && d->minorVersion > 1));
+}
+
+/*!
+ Returns \c true is the OpenGL version returned by version() contains deprecated functions
+ and does not support profiles i.e. if the OpenGL version is <= 3.1.
+*/
+bool QOpenGLVersionProfile::isLegacyVersion() const
+{
+ return (d->majorVersion < 3 || (d->majorVersion == 3 && d->minorVersion == 0));
+}
+
+/*!
+ Returns \c true if the version number is valid. Note that for a default constructed
+ QOpenGLVersionProfile object this function will return \c false.
+
+ \sa setVersion(), version()
+*/
+bool QOpenGLVersionProfile::isValid() const
+{
+ return d->majorVersion > 0 && d->minorVersion >= 0;
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug debug, const QOpenGLVersionProfile &vp)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace();
+ debug << "QOpenGLVersionProfile(";
+ if (vp.isValid()) {
+ debug << vp.version().first << '.' << vp.version().second
+ << ", profile=" << vp.profile();
+ } else {
+ debug << "invalid";
+ }
+ debug << ')';
+ return debug;
+}
+
+#endif // QT_NO_DEBUG_STREAM
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglversionprofile.h b/src/opengl/qopenglversionprofile.h
new file mode 100644
index 0000000000..fdc531692a
--- /dev/null
+++ b/src/opengl/qopenglversionprofile.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERSIONPROFILE_H
+#define QOPENGLVERSIONPROFILE_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#include <QtGui/QSurfaceFormat>
+
+#include <QtCore/QPair>
+#if QT_DEPRECATED_SINCE(5, 6)
+#include <QtCore/qhash.h>
+#endif
+#include <QtCore/qhashfunctions.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLVersionProfilePrivate;
+class QDebug;
+
+class Q_OPENGL_EXPORT QOpenGLVersionProfile
+{
+public:
+ QOpenGLVersionProfile();
+ explicit QOpenGLVersionProfile(const QSurfaceFormat &format);
+ QOpenGLVersionProfile(const QOpenGLVersionProfile &other);
+ ~QOpenGLVersionProfile();
+
+ QOpenGLVersionProfile &operator=(const QOpenGLVersionProfile &rhs);
+
+ QPair<int, int> version() const;
+ void setVersion(int majorVersion, int minorVersion);
+
+ QSurfaceFormat::OpenGLContextProfile profile() const;
+ void setProfile(QSurfaceFormat::OpenGLContextProfile profile);
+
+ bool hasProfiles() const;
+ bool isLegacyVersion() const;
+ bool isValid() const;
+
+private:
+ QOpenGLVersionProfilePrivate* d;
+};
+
+inline size_t qHash(const QOpenGLVersionProfile &v, size_t seed = 0)
+{
+ return qHash(static_cast<int>(v.profile() * 1000)
+ + v.version().first * 100 + v.version().second * 10, seed);
+}
+
+inline bool operator==(const QOpenGLVersionProfile &lhs, const QOpenGLVersionProfile &rhs)
+{
+ if (lhs.profile() != rhs.profile())
+ return false;
+ return lhs.version() == rhs.version();
+}
+
+inline bool operator!=(const QOpenGLVersionProfile &lhs, const QOpenGLVersionProfile &rhs)
+{
+ return !operator==(lhs, rhs);
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+Q_OPENGL_EXPORT QDebug operator<<(QDebug debug, const QOpenGLVersionProfile &vp);
+#endif // !QT_NO_DEBUG_STREAM
+
+QT_END_NAMESPACE
+
+#endif // QOPENGLVERSIONPROFILE_H
diff --git a/src/opengl/qopenglvertexarrayobject.cpp b/src/opengl/qopenglvertexarrayobject.cpp
new file mode 100644
index 0000000000..7f28a0bc61
--- /dev/null
+++ b/src/opengl/qopenglvertexarrayobject.cpp
@@ -0,0 +1,536 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sean Harmer <sean.harmer@kdab.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglvertexarrayobject.h"
+
+#include <QtCore/private/qobject_p.h>
+#include <QtCore/qthread.h>
+#include <QtGui/qopenglcontext.h>
+#include <QtGui/qoffscreensurface.h>
+#include <QtGui/qguiapplication.h>
+
+#include <QtOpenGL/QOpenGLVersionFunctionsFactory>
+#include <QtOpenGL/qopenglfunctions_3_0.h>
+#include <QtOpenGL/qopenglfunctions_3_2_core.h>
+
+#include <private/qopenglextensions_p.h>
+#include <private/qopenglvertexarrayobject_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLFunctions_3_0;
+class QOpenGLFunctions_3_2_Core;
+
+void qtInitializeVertexArrayObjectHelper(QOpenGLVertexArrayObjectHelper *helper, QOpenGLContext *context)
+{
+ Q_ASSERT(helper);
+ Q_ASSERT(context);
+
+ bool tryARB = true;
+
+ if (context->isOpenGLES()) {
+ if (context->format().majorVersion() >= 3) {
+ QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
+ helper->GenVertexArrays = extra->f.GenVertexArrays;
+ helper->DeleteVertexArrays = extra->f.DeleteVertexArrays;
+ helper->BindVertexArray = extra->f.BindVertexArray;
+ helper->IsVertexArray = extra->f.IsVertexArray;
+ tryARB = false;
+ } else if (context->hasExtension(QByteArrayLiteral("GL_OES_vertex_array_object"))) {
+ helper->GenVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_GenVertexArrays_t>(context->getProcAddress("glGenVertexArraysOES"));
+ helper->DeleteVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_DeleteVertexArrays_t>(context->getProcAddress("glDeleteVertexArraysOES"));
+ helper->BindVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_BindVertexArray_t>(context->getProcAddress("glBindVertexArrayOES"));
+ helper->IsVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_IsVertexArray_t>(context->getProcAddress("glIsVertexArrayOES"));
+ tryARB = false;
+ }
+ } else if (context->hasExtension(QByteArrayLiteral("GL_APPLE_vertex_array_object")) &&
+ !context->hasExtension(QByteArrayLiteral("GL_ARB_vertex_array_object"))) {
+ helper->GenVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_GenVertexArrays_t>(context->getProcAddress("glGenVertexArraysAPPLE"));
+ helper->DeleteVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_DeleteVertexArrays_t>(context->getProcAddress("glDeleteVertexArraysAPPLE"));
+ helper->BindVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_BindVertexArray_t>(context->getProcAddress("glBindVertexArrayAPPLE"));
+ helper->IsVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_IsVertexArray_t>(context->getProcAddress("glIsVertexArrayAPPLE"));
+ tryARB = false;
+ }
+
+ if (tryARB && context->hasExtension(QByteArrayLiteral("GL_ARB_vertex_array_object"))) {
+ helper->GenVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_GenVertexArrays_t>(context->getProcAddress("glGenVertexArrays"));
+ helper->DeleteVertexArrays = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_DeleteVertexArrays_t>(context->getProcAddress("glDeleteVertexArrays"));
+ helper->BindVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_BindVertexArray_t>(context->getProcAddress("glBindVertexArray"));
+ helper->IsVertexArray = reinterpret_cast<QOpenGLVertexArrayObjectHelper::qt_IsVertexArray_t>(context->getProcAddress("glIsVertexArray"));
+ }
+}
+
+class QOpenGLVertexArrayObjectPrivate : public QObjectPrivate
+{
+public:
+ QOpenGLVertexArrayObjectPrivate()
+ : vao(0)
+ , vaoFuncsType(NotSupported)
+ , context(nullptr)
+ , guiThread(nullptr)
+ {
+ }
+
+ ~QOpenGLVertexArrayObjectPrivate()
+ {
+ if (vaoFuncsType == ARB || vaoFuncsType == APPLE || vaoFuncsType == OES)
+ delete vaoFuncs.helper;
+ }
+
+ bool create();
+ void destroy();
+ void bind();
+ void release();
+ void _q_contextAboutToBeDestroyed();
+
+ Q_DECLARE_PUBLIC(QOpenGLVertexArrayObject)
+
+ GLuint vao;
+
+ union {
+ QOpenGLFunctions_3_0 *core_3_0;
+ QOpenGLFunctions_3_2_Core *core_3_2;
+ QOpenGLVertexArrayObjectHelper *helper;
+ } vaoFuncs;
+ enum {
+ NotSupported,
+ Core_3_0,
+ Core_3_2,
+ ARB,
+ APPLE,
+ OES
+ } vaoFuncsType;
+
+ QOpenGLContext *context;
+ QThread *guiThread;
+};
+
+bool QOpenGLVertexArrayObjectPrivate::create()
+{
+ if (vao) {
+ qWarning("QOpenGLVertexArrayObject::create() VAO is already created");
+ return false;
+ }
+
+ Q_Q(QOpenGLVertexArrayObject);
+
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (!ctx) {
+ qWarning("QOpenGLVertexArrayObject::create() requires a valid current OpenGL context");
+ return false;
+ }
+
+ //Fail early, if context is the same as ctx, it means we have tried to initialize for this context and failed
+ if (ctx == context)
+ return false;
+
+ context = ctx;
+ QObject::connect(context, SIGNAL(aboutToBeDestroyed()), q, SLOT(_q_contextAboutToBeDestroyed()));
+
+ guiThread = qGuiApp->thread();
+
+ if (ctx->isOpenGLES()) {
+ if (ctx->format().majorVersion() >= 3 || ctx->hasExtension(QByteArrayLiteral("GL_OES_vertex_array_object"))) {
+ vaoFuncs.helper = new QOpenGLVertexArrayObjectHelper(ctx);
+ vaoFuncsType = OES;
+ vaoFuncs.helper->glGenVertexArrays(1, &vao);
+ }
+ } else {
+ vaoFuncs.core_3_0 = nullptr;
+ vaoFuncsType = NotSupported;
+ QSurfaceFormat format = ctx->format();
+#if !QT_CONFIG(opengles2)
+ if (format.version() >= qMakePair<int, int>(3,2)) {
+ vaoFuncs.core_3_2 = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_3_2_Core>(ctx);
+ vaoFuncsType = Core_3_2;
+ vaoFuncs.core_3_2->glGenVertexArrays(1, &vao);
+ } else if (format.majorVersion() >= 3) {
+ vaoFuncs.core_3_0 = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_3_0>(ctx);
+ vaoFuncsType = Core_3_0;
+ vaoFuncs.core_3_0->glGenVertexArrays(1, &vao);
+ } else
+#endif
+ if (ctx->hasExtension(QByteArrayLiteral("GL_ARB_vertex_array_object"))) {
+ vaoFuncs.helper = new QOpenGLVertexArrayObjectHelper(ctx);
+ vaoFuncsType = ARB;
+ vaoFuncs.helper->glGenVertexArrays(1, &vao);
+ } else if (ctx->hasExtension(QByteArrayLiteral("GL_APPLE_vertex_array_object"))) {
+ vaoFuncs.helper = new QOpenGLVertexArrayObjectHelper(ctx);
+ vaoFuncsType = APPLE;
+ vaoFuncs.helper->glGenVertexArrays(1, &vao);
+ }
+ }
+
+ return (vao != 0);
+}
+
+void QOpenGLVertexArrayObjectPrivate::destroy()
+{
+ Q_Q(QOpenGLVertexArrayObject);
+
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ QOpenGLContext *oldContext = nullptr;
+ QSurface *oldContextSurface = nullptr;
+ QScopedPointer<QOffscreenSurface> offscreenSurface;
+ if (context && context != ctx) {
+ oldContext = ctx;
+ oldContextSurface = ctx ? ctx->surface() : nullptr;
+ // Before going through the effort of creating an offscreen surface
+ // check that we are on the GUI thread because otherwise many platforms
+ // will not able to create that offscreen surface.
+ if (QThread::currentThread() != guiThread) {
+ ctx = nullptr;
+ } else {
+ // Cannot just make the current surface current again with another context.
+ // The format may be incompatible and some platforms (iOS) may impose
+ // restrictions on using a window with different contexts. Create an
+ // offscreen surface (a pbuffer or a hidden window) instead to be safe.
+ offscreenSurface.reset(new QOffscreenSurface);
+ offscreenSurface->setFormat(context->format());
+ offscreenSurface->create();
+ if (context->makeCurrent(offscreenSurface.data())) {
+ ctx = context;
+ } else {
+ qWarning("QOpenGLVertexArrayObject::destroy() failed to make VAO's context current");
+ ctx = nullptr;
+ }
+ }
+ }
+
+ if (context) {
+ QObject::disconnect(context, SIGNAL(aboutToBeDestroyed()), q, SLOT(_q_contextAboutToBeDestroyed()));
+ context = nullptr;
+ }
+
+ if (vao && ctx) {
+ switch (vaoFuncsType) {
+#if !QT_CONFIG(opengles2)
+ case Core_3_2:
+ vaoFuncs.core_3_2->glDeleteVertexArrays(1, &vao);
+ break;
+ case Core_3_0:
+ vaoFuncs.core_3_0->glDeleteVertexArrays(1, &vao);
+ break;
+#endif
+ case ARB:
+ case APPLE:
+ case OES:
+ vaoFuncs.helper->glDeleteVertexArrays(1, &vao);
+ break;
+ default:
+ break;
+ }
+
+ vao = 0;
+ }
+
+ if (oldContext && oldContextSurface) {
+ if (!oldContext->makeCurrent(oldContextSurface))
+ qWarning("QOpenGLVertexArrayObject::destroy() failed to restore current context");
+ }
+}
+
+/*!
+ \internal
+*/
+void QOpenGLVertexArrayObjectPrivate::_q_contextAboutToBeDestroyed()
+{
+ destroy();
+}
+
+void QOpenGLVertexArrayObjectPrivate::bind()
+{
+ switch (vaoFuncsType) {
+#if !QT_CONFIG(opengles2)
+ case Core_3_2:
+ vaoFuncs.core_3_2->glBindVertexArray(vao);
+ break;
+ case Core_3_0:
+ vaoFuncs.core_3_0->glBindVertexArray(vao);
+ break;
+#endif
+ case ARB:
+ case APPLE:
+ case OES:
+ vaoFuncs.helper->glBindVertexArray(vao);
+ break;
+ default:
+ break;
+ }
+}
+
+void QOpenGLVertexArrayObjectPrivate::release()
+{
+ switch (vaoFuncsType) {
+#if !QT_CONFIG(opengles2)
+ case Core_3_2:
+ vaoFuncs.core_3_2->glBindVertexArray(0);
+ break;
+ case Core_3_0:
+ vaoFuncs.core_3_0->glBindVertexArray(0);
+ break;
+#endif
+ case ARB:
+ case APPLE:
+ case OES:
+ vaoFuncs.helper->glBindVertexArray(0);
+ break;
+ default:
+ break;
+ }
+}
+
+
+/*!
+ \class QOpenGLVertexArrayObject
+ \brief The QOpenGLVertexArrayObject class wraps an OpenGL Vertex Array Object.
+ \inmodule QtOpenGL
+ \since 5.1
+ \ingroup painting-3D
+
+ A Vertex Array Object (VAO) is an OpenGL container object that encapsulates
+ the state needed to specify per-vertex attribute data to the OpenGL pipeline.
+ To put it another way, a VAO remembers the states of buffer objects (see
+ QOpenGLBuffer) and their associated state (e.g. vertex attribute divisors).
+ This allows a very easy and efficient method of switching between OpenGL buffer
+ states for rendering different "objects" in a scene. The QOpenGLVertexArrayObject
+ class is a thin wrapper around an OpenGL VAO.
+
+ For the desktop, VAOs are supported as a core feature in OpenGL 3.0 or newer and by the
+ GL_ARB_vertex_array_object for older versions. On OpenGL ES 2, VAOs are provided by
+ the optional GL_OES_vertex_array_object extension. You can check the version of
+ OpenGL with QOpenGLContext::surfaceFormat() and check for the presence of extensions
+ with QOpenGLContext::hasExtension().
+
+ As with the other Qt OpenGL classes, QOpenGLVertexArrayObject has a create()
+ function to create the underlying OpenGL object. This is to allow the developer to
+ ensure that there is a valid current OpenGL context at the time.
+
+ Once you have successfully created a VAO the typical usage pattern is:
+
+ \list
+ \li In scene initialization function, for each visual object:
+ \list
+ \li Bind the VAO
+ \li Set vertex data state for this visual object (vertices, normals, texture coordinates etc.)
+ \li Unbind (release()) the VAO
+ \endlist
+ \li In render function, for each visual object:
+ \list
+ \li Bind the VAO (and shader program if needed)
+ \li Call a glDraw*() function
+ \li Unbind (release()) the VAO
+ \endlist
+ \endlist
+
+ The act of binding the VAO in the render function has the effect of restoring
+ all of the vertex data state setup in the initialization phase. In this way we can
+ set a great deal of state when setting up a VAO and efficiently switch between
+ state sets of objects to be rendered. Using VAOs also allows the OpenGL driver
+ to amortise the validation checks of the vertex data.
+
+ \note Vertex Array Objects, like all other OpenGL container objects, are specific
+ to the context for which they were created and cannot be shared amongst a
+ context group.
+
+ \sa QOpenGLVertexArrayObject::Binder, QOpenGLBuffer
+*/
+
+/*!
+ Creates a QOpenGLVertexArrayObject with the given \a parent. You must call create()
+ with a valid OpenGL context before using.
+*/
+QOpenGLVertexArrayObject::QOpenGLVertexArrayObject(QObject* parent)
+ : QObject(*new QOpenGLVertexArrayObjectPrivate, parent)
+{
+}
+
+/*!
+ \internal
+*/
+QOpenGLVertexArrayObject::QOpenGLVertexArrayObject(QOpenGLVertexArrayObjectPrivate &dd)
+ : QObject(dd)
+{
+}
+
+/*!
+ Destroys the QOpenGLVertexArrayObject and the underlying OpenGL resource.
+*/
+QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject()
+{
+ destroy();
+}
+
+/*!
+ Creates the underlying OpenGL vertex array object. There must be a valid OpenGL context
+ that supports vertex array objects current for this function to succeed.
+
+ Returns \c true if the OpenGL vertex array object was successfully created.
+
+ When the return value is \c false, vertex array object support is not available. This
+ is not an error: on systems with OpenGL 2.x or OpenGL ES 2.0 vertex array objects may
+ not be supported. The application is free to continue execution in this case, but it
+ then has to be prepared to operate in a VAO-less manner too. This means that instead
+ of merely calling bind(), the value of isCreated() must be checked and the vertex
+ arrays has to be initialized in the traditional way when there is no vertex array
+ object present.
+
+ \sa isCreated()
+*/
+bool QOpenGLVertexArrayObject::create()
+{
+ Q_D(QOpenGLVertexArrayObject);
+ return d->create();
+}
+
+/*!
+ Destroys the underlying OpenGL vertex array object. There must be a valid OpenGL context
+ that supports vertex array objects current for this function to succeed.
+*/
+void QOpenGLVertexArrayObject::destroy()
+{
+ Q_D(QOpenGLVertexArrayObject);
+ d->destroy();
+}
+
+/*!
+ Returns \c true is the underlying OpenGL vertex array object has been created. If this
+ returns \c true and the associated OpenGL context is current, then you are able to bind()
+ this object.
+*/
+bool QOpenGLVertexArrayObject::isCreated() const
+{
+ Q_D(const QOpenGLVertexArrayObject);
+ return (d->vao != 0);
+}
+
+/*!
+ Returns the id of the underlying OpenGL vertex array object.
+*/
+GLuint QOpenGLVertexArrayObject::objectId() const
+{
+ Q_D(const QOpenGLVertexArrayObject);
+ return d->vao;
+}
+
+/*!
+ Binds this vertex array object to the OpenGL binding point. From this point on
+ and until release() is called or another vertex array object is bound, any
+ modifications made to vertex data state are stored inside this vertex array object.
+
+ If another vertex array object is then bound you can later restore the set of
+ state associated with this object by calling bind() on this object once again.
+ This allows efficient changes between vertex data states in rendering functions.
+*/
+void QOpenGLVertexArrayObject::bind()
+{
+ Q_D(QOpenGLVertexArrayObject);
+ d->bind();
+}
+
+/*!
+ Unbinds this vertex array object by binding the default vertex array object (id = 0).
+*/
+void QOpenGLVertexArrayObject::release()
+{
+ Q_D(QOpenGLVertexArrayObject);
+ d->release();
+}
+
+
+/*!
+ \class QOpenGLVertexArrayObject::Binder
+ \brief The QOpenGLVertexArrayObject::Binder class is a convenience class to help
+ with the binding and releasing of OpenGL Vertex Array Objects.
+ \inmodule QtOpenGL
+ \reentrant
+ \since 5.1
+ \ingroup painting-3D
+
+ QOpenGLVertexArrayObject::Binder is a simple convenience class that can be used
+ to assist with the binding and releasing of QOpenGLVertexArrayObject instances.
+ This class is to QOpenGLVertexArrayObject as QMutexLocker is to QMutex.
+
+ This class implements the RAII principle which helps to ensure behavior in
+ complex code or in the presence of exceptions.
+
+ The constructor of this class accepts a QOpenGLVertexArrayObject (VAO) as an
+ argument and attempts to bind the VAO, calling QOpenGLVertexArrayObject::create()
+ if necessary. The destructor of this class calls QOpenGLVertexArrayObject::release()
+ which unbinds the VAO.
+
+ If needed the VAO can be temporarily unbound with the release() function and bound
+ once more with rebind().
+
+ \sa QOpenGLVertexArrayObject
+*/
+
+/*!
+ \fn QOpenGLVertexArrayObject::Binder::Binder(QOpenGLVertexArrayObject *v)
+
+ Creates a QOpenGLVertexArrayObject::Binder object and binds \a v by calling
+ QOpenGLVertexArrayObject::bind(). If necessary it first calls
+ QOpenGLVertexArrayObject::create().
+*/
+
+/*!
+ \fn QOpenGLVertexArrayObject::Binder::~Binder()
+
+ Destroys the QOpenGLVertexArrayObject::Binder and releases the associated vertex array object.
+*/
+
+/*!
+ \fn QOpenGLVertexArrayObject::Binder::release()
+
+ Can be used to temporarily release the associated vertex array object.
+
+ \sa rebind()
+*/
+
+/*!
+ \fn QOpenGLVertexArrayObject::Binder::rebind()
+
+ Can be used to rebind the associated vertex array object.
+
+ \sa release()
+*/
+
+QT_END_NAMESPACE
+
+#include "moc_qopenglvertexarrayobject.cpp"
diff --git a/src/opengl/qopenglvertexarrayobject.h b/src/opengl/qopenglvertexarrayobject.h
new file mode 100644
index 0000000000..0675c844e9
--- /dev/null
+++ b/src/opengl/qopenglvertexarrayobject.h
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sean Harmer <sean.harmer@kdab.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERTEXARRAYOBJECT_H
+#define QOPENGLVERTEXARRAYOBJECT_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#ifndef QT_NO_OPENGL
+
+#include <QtCore/QObject>
+#include <QtGui/qopengl.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLVertexArrayObjectPrivate;
+
+class Q_OPENGL_EXPORT QOpenGLVertexArrayObject : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit QOpenGLVertexArrayObject(QObject* parent = nullptr);
+ ~QOpenGLVertexArrayObject();
+
+ bool create();
+ void destroy();
+ bool isCreated() const;
+ GLuint objectId() const;
+ void bind();
+ void release();
+
+ class Q_OPENGL_EXPORT Binder
+ {
+ public:
+ inline Binder(QOpenGLVertexArrayObject *v)
+ : vao(v)
+ {
+ Q_ASSERT(v);
+ if (vao->isCreated() || vao->create())
+ vao->bind();
+ }
+
+ inline ~Binder()
+ {
+ release();
+ }
+
+ inline void release()
+ {
+ vao->release();
+ }
+
+ inline void rebind()
+ {
+ vao->bind();
+ }
+
+ private:
+ Q_DISABLE_COPY(Binder)
+ QOpenGLVertexArrayObject *vao;
+ };
+
+private:
+ Q_DISABLE_COPY(QOpenGLVertexArrayObject)
+ Q_DECLARE_PRIVATE(QOpenGLVertexArrayObject)
+ Q_PRIVATE_SLOT(d_func(), void _q_contextAboutToBeDestroyed())
+ QOpenGLVertexArrayObject(QOpenGLVertexArrayObjectPrivate &dd);
+};
+
+QT_END_NAMESPACE
+
+#endif
+
+#endif // QOPENGLVERTEXARRAYOBJECT_H
diff --git a/src/opengl/qopenglvertexarrayobject_p.h b/src/opengl/qopenglvertexarrayobject_p.h
new file mode 100644
index 0000000000..0d0fca4d81
--- /dev/null
+++ b/src/opengl/qopenglvertexarrayobject_p.h
@@ -0,0 +1,121 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sean Harmer <sean.harmer@kdab.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLVERTEXARRAYOBJECT_P_H
+#define QOPENGLVERTEXARRAYOBJECT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the Qt OpenGL classes. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#include <QtGui/qopengl.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLVertexArrayObjectHelper;
+class QOpenGLContext;
+
+void Q_OPENGL_EXPORT qtInitializeVertexArrayObjectHelper(QOpenGLVertexArrayObjectHelper *helper, QOpenGLContext *context);
+
+class QOpenGLVertexArrayObjectHelper
+{
+ Q_DISABLE_COPY(QOpenGLVertexArrayObjectHelper)
+
+public:
+ explicit inline QOpenGLVertexArrayObjectHelper(QOpenGLContext *context)
+ : GenVertexArrays(nullptr)
+ , DeleteVertexArrays(nullptr)
+ , BindVertexArray(nullptr)
+ , IsVertexArray(nullptr)
+ {
+ qtInitializeVertexArrayObjectHelper(this, context);
+ }
+
+ inline bool isValid() const
+ {
+ return GenVertexArrays && DeleteVertexArrays && BindVertexArray && IsVertexArray;
+ }
+
+ inline void glGenVertexArrays(GLsizei n, GLuint *arrays) const
+ {
+ GenVertexArrays(n, arrays);
+ }
+
+ inline void glDeleteVertexArrays(GLsizei n, const GLuint *arrays) const
+ {
+ DeleteVertexArrays(n, arrays);
+ }
+
+ inline void glBindVertexArray(GLuint array) const
+ {
+ BindVertexArray(array);
+ }
+
+ inline GLboolean glIsVertexArray(GLuint array) const
+ {
+ return IsVertexArray(array);
+ }
+
+private:
+ friend void Q_OPENGL_EXPORT qtInitializeVertexArrayObjectHelper(QOpenGLVertexArrayObjectHelper *helper, QOpenGLContext *context);
+
+ // Function signatures are equivalent between desktop core, ARB, APPLE, ES 3 and ES 2 extensions
+ typedef void (QOPENGLF_APIENTRYP qt_GenVertexArrays_t)(GLsizei n, GLuint *arrays);
+ typedef void (QOPENGLF_APIENTRYP qt_DeleteVertexArrays_t)(GLsizei n, const GLuint *arrays);
+ typedef void (QOPENGLF_APIENTRYP qt_BindVertexArray_t)(GLuint array);
+ typedef GLboolean (QOPENGLF_APIENTRYP qt_IsVertexArray_t)(GLuint array);
+
+ qt_GenVertexArrays_t GenVertexArrays;
+ qt_DeleteVertexArrays_t DeleteVertexArrays;
+ qt_BindVertexArray_t BindVertexArray;
+ qt_IsVertexArray_t IsVertexArray;
+};
+
+QT_END_NAMESPACE
+
+#endif // QOPENGLVERTEXARRAYOBJECT_P_H
diff --git a/src/opengl/qopenglwindow.cpp b/src/opengl/qopenglwindow.cpp
new file mode 100644
index 0000000000..d000dced94
--- /dev/null
+++ b/src/opengl/qopenglwindow.cpp
@@ -0,0 +1,698 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglwindow.h"
+#include <QtGui/QOpenGLFunctions>
+#include <QtGui/private/qpaintdevicewindow_p.h>
+#include <QtGui/private/qopenglextensions_p.h>
+#include <QtGui/private/qopenglcontext_p.h>
+#include <QtGui/QMatrix4x4>
+#include <QtGui/QOffscreenSurface>
+
+#include <QtOpenGL/private/qopenglframebufferobject_p.h>
+#include <QtOpenGL/QOpenGLFramebufferObject>
+#include <QtOpenGL/QOpenGLTextureBlitter>
+#include <QtOpenGL/QOpenGLPaintDevice>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLWindow
+ \inmodule QtOpenGL
+ \since 5.4
+ \brief The QOpenGLWindow class is a convenience subclass of QWindow to perform OpenGL painting.
+
+ QOpenGLWindow is an enhanced QWindow that allows easily creating windows that
+ perform OpenGL rendering using an API that is compatible with QOpenGLWidget
+ Unlike QOpenGLWidget, QOpenGLWindow has no dependency on the widgets module
+ and offers better performance.
+
+ A typical application will subclass QOpenGLWindow and reimplement the following
+ virtual functions:
+
+ \list
+
+ \li initializeGL() to perform OpenGL resource initialization
+
+ \li resizeGL() to set up the transformation matrices and other window size dependent resources
+
+ \li paintGL() to issue OpenGL commands or draw using QPainter
+
+ \endlist
+
+ To schedule a repaint, call the update() function. Note that this will not
+ immediately result in a call to paintGL(). Calling update() multiple times in
+ a row will not change the behavior in any way.
+
+ This is a slot so it can be connected to a \l QTimer::timeout() signal to
+ perform animation. Note however that in the modern OpenGL world it is a much
+ better choice to rely on synchronization to the vertical refresh rate of the
+ display. See \l{QSurfaceFormat::setSwapInterval()}{setSwapInterval()} on a
+ description of the swap interval. With a swap interval of \c 1, which is the
+ case on most systems by default, the
+ \l{QOpenGLContext::swapBuffers()}{swapBuffers()} call, that is executed
+ internally by QOpenGLWindow after each repaint, will block and wait for
+ vsync. This means that whenever the swap is done, an update can be scheduled
+ again by calling update(), without relying on timers.
+
+ To request a specific configuration for the context, use setFormat()
+ like for any other QWindow. This allows, among others, requesting a
+ given OpenGL version and profile, or enabling depth and stencil
+ buffers.
+
+ Unlike QWindow, QOpenGLWindow allows opening a painter on itself and perform
+ QPainter-based drawing.
+
+ QOpenGLWindow supports multiple update behaviors. The default,
+ \c NoPartialUpdate is equivalent to a regular, OpenGL-based QWindow. In
+ contrast, \c PartialUpdateBlit and \c PartialUpdateBlend are
+ more in line with QOpenGLWidget's way of working, where there is always an
+ extra, dedicated framebuffer object present. These modes allow, by
+ sacrificing some performance, redrawing only a smaller area on each paint and
+ having the rest of the content preserved from of the previous frame. This is
+ useful for applications than render incrementally using QPainter, because
+ this way they do not have to redraw the entire window content on each
+ paintGL() call.
+
+ Similarly to QOpenGLWidget, QOpenGLWindow supports the Qt::AA_ShareOpenGLContexts
+ attribute. When enabled, the OpenGL contexts of all QOpenGLWindow instances will share
+ with each other. This allows accessing each other's shareable OpenGL resources.
+
+ For more information on graphics in Qt, see \l {Graphics}.
+ */
+
+/*!
+ \enum QOpenGLWindow::UpdateBehavior
+
+ This enum describes the update strategy of the QOpenGLWindow.
+
+ \value NoPartialUpdate Indicates that the entire window surface will
+ redrawn on each update and so no additional framebuffers are needed.
+ This is the setting used in most cases and is equivalent to how drawing
+ directly via QWindow would function.
+
+ \value PartialUpdateBlit Indicates that the drawing performed in paintGL()
+ does not cover the entire window. In this case an extra framebuffer object
+ is created under the hood, and rendering performed in paintGL() will target
+ this framebuffer. This framebuffer is then blitted onto the window surface's
+ default framebuffer after each paint. This allows having QPainter-based drawing
+ code in paintGL() which only repaints a smaller area at a time, because, unlike
+ NoPartialUpdate, the previous content is preserved.
+
+ \value PartialUpdateBlend Similar to PartialUpdateBlit, but instead of using
+ framebuffer blits, the contents of the extra framebuffer is rendered by
+ drawing a textured quad with blending enabled. This, unlike PartialUpdateBlit,
+ allows alpha blended content and works even when the glBlitFramebuffer is
+ not available. Performance-wise this setting is likely to be somewhat slower
+ than PartialUpdateBlit.
+ */
+
+/*!
+ \fn void QOpenGLWindow::frameSwapped()
+
+ This signal is emitted after the potentially blocking
+ \l{QOpenGLContext::swapBuffers()}{buffer swap} has been done. Applications
+ that wish to continuously repaint synchronized to the vertical refresh,
+ should issue an update() upon this signal. This allows for a much smoother
+ experience compared to the traditional usage of timers.
+*/
+
+// GLES2 builds won't have these constants with the suffixless names
+#ifndef GL_READ_FRAMEBUFFER
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#endif
+#ifndef GL_DRAW_FRAMEBUFFER
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#endif
+
+class QOpenGLWindowPaintDevice : public QOpenGLPaintDevice
+{
+public:
+ QOpenGLWindowPaintDevice(QOpenGLWindow *window) : m_window(window) { }
+ void ensureActiveTarget() override;
+
+ QOpenGLWindow *m_window;
+};
+
+class QOpenGLWindowPrivate : public QPaintDeviceWindowPrivate
+{
+ Q_DECLARE_PUBLIC(QOpenGLWindow)
+public:
+ QOpenGLWindowPrivate(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior)
+ : updateBehavior(updateBehavior)
+ , hasFboBlit(false)
+ , shareContext(shareContext)
+ {
+ if (!shareContext)
+ this->shareContext = qt_gl_global_share_context();
+ }
+
+ ~QOpenGLWindowPrivate();
+
+ static QOpenGLWindowPrivate *get(QOpenGLWindow *w) { return w->d_func(); }
+
+ void bindFBO();
+ void initialize();
+
+ void beginPaint(const QRegion &region) override;
+ void endPaint() override;
+ void flush(const QRegion &region) override;
+
+ QOpenGLWindow::UpdateBehavior updateBehavior;
+ bool hasFboBlit;
+ QScopedPointer<QOpenGLContext> context;
+ QOpenGLContext *shareContext;
+ QScopedPointer<QOpenGLFramebufferObject> fbo;
+ QScopedPointer<QOpenGLWindowPaintDevice> paintDevice;
+ QOpenGLTextureBlitter blitter;
+ QColor backgroundColor;
+ QScopedPointer<QOffscreenSurface> offscreenSurface;
+};
+
+QOpenGLWindowPrivate::~QOpenGLWindowPrivate()
+{
+ Q_Q(QOpenGLWindow);
+ if (q->isValid()) {
+ q->makeCurrent(); // this works even when the platformwindow is destroyed
+ paintDevice.reset(nullptr);
+ fbo.reset(nullptr);
+ blitter.destroy();
+ q->doneCurrent();
+ }
+}
+
+void QOpenGLWindowPrivate::initialize()
+{
+ Q_Q(QOpenGLWindow);
+
+ if (context)
+ return;
+
+ if (!q->handle())
+ qWarning("Attempted to initialize QOpenGLWindow without a platform window");
+
+ context.reset(new QOpenGLContext);
+ context->setShareContext(shareContext);
+ context->setFormat(q->requestedFormat());
+ if (!context->create())
+ qWarning("QOpenGLWindow::beginPaint: Failed to create context");
+ if (!context->makeCurrent(q))
+ qWarning("QOpenGLWindow::beginPaint: Failed to make context current");
+
+ paintDevice.reset(new QOpenGLWindowPaintDevice(q));
+ if (updateBehavior == QOpenGLWindow::PartialUpdateBlit)
+ hasFboBlit = QOpenGLFramebufferObject::hasOpenGLFramebufferBlit();
+
+ q->initializeGL();
+}
+
+void QOpenGLWindowPrivate::beginPaint(const QRegion &region)
+{
+ Q_UNUSED(region);
+ Q_Q(QOpenGLWindow);
+
+ initialize();
+ context->makeCurrent(q);
+
+ const int deviceWidth = q->width() * q->devicePixelRatio();
+ const int deviceHeight = q->height() * q->devicePixelRatio();
+ const QSize deviceSize(deviceWidth, deviceHeight);
+ if (updateBehavior > QOpenGLWindow::NoPartialUpdate) {
+ if (!fbo || fbo->size() != deviceSize) {
+ QOpenGLFramebufferObjectFormat fboFormat;
+ fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
+ const int samples = q->requestedFormat().samples();
+ if (samples > 0) {
+ if (updateBehavior != QOpenGLWindow::PartialUpdateBlend)
+ fboFormat.setSamples(samples);
+ else
+ qWarning("QOpenGLWindow: PartialUpdateBlend does not support multisampling");
+ }
+ fbo.reset(new QOpenGLFramebufferObject(deviceSize, fboFormat));
+ markWindowAsDirty();
+ }
+ } else {
+ markWindowAsDirty();
+ }
+
+ paintDevice->setSize(QSize(deviceWidth, deviceHeight));
+ paintDevice->setDevicePixelRatio(q->devicePixelRatio());
+ context->functions()->glViewport(0, 0, deviceWidth, deviceHeight);
+
+ context->functions()->glBindFramebuffer(GL_FRAMEBUFFER, context->defaultFramebufferObject());
+
+ q->paintUnderGL();
+
+ if (updateBehavior > QOpenGLWindow::NoPartialUpdate)
+ fbo->bind();
+}
+
+void QOpenGLWindowPrivate::endPaint()
+{
+ Q_Q(QOpenGLWindow);
+
+ if (updateBehavior > QOpenGLWindow::NoPartialUpdate)
+ fbo->release();
+
+ context->functions()->glBindFramebuffer(GL_FRAMEBUFFER, context->defaultFramebufferObject());
+
+ if (updateBehavior == QOpenGLWindow::PartialUpdateBlit && hasFboBlit) {
+ const int deviceWidth = q->width() * q->devicePixelRatio();
+ const int deviceHeight = q->height() * q->devicePixelRatio();
+ QOpenGLExtensions extensions(context.data());
+ extensions.glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo->handle());
+ extensions.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, context->defaultFramebufferObject());
+ extensions.glBlitFramebuffer(0, 0, deviceWidth, deviceHeight,
+ 0, 0, deviceWidth, deviceHeight,
+ GL_COLOR_BUFFER_BIT, GL_NEAREST);
+ } else if (updateBehavior > QOpenGLWindow::NoPartialUpdate) {
+ if (updateBehavior == QOpenGLWindow::PartialUpdateBlend) {
+ context->functions()->glEnable(GL_BLEND);
+ context->functions()->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ if (!blitter.isCreated())
+ blitter.create();
+
+ QRect windowRect(QPoint(0, 0), fbo->size());
+ QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(windowRect, windowRect);
+ blitter.bind();
+ blitter.blit(fbo->texture(), target, QOpenGLTextureBlitter::OriginBottomLeft);
+ blitter.release();
+
+ if (updateBehavior == QOpenGLWindow::PartialUpdateBlend)
+ context->functions()->glDisable(GL_BLEND);
+ }
+
+ q->paintOverGL();
+}
+
+void QOpenGLWindowPrivate::bindFBO()
+{
+ if (updateBehavior > QOpenGLWindow::NoPartialUpdate)
+ fbo->bind();
+ else
+ QOpenGLFramebufferObject::bindDefault();
+}
+
+void QOpenGLWindowPrivate::flush(const QRegion &region)
+{
+ Q_UNUSED(region);
+ Q_Q(QOpenGLWindow);
+ context->swapBuffers(q);
+ emit q->frameSwapped();
+}
+
+void QOpenGLWindowPaintDevice::ensureActiveTarget()
+{
+ QOpenGLWindowPrivate::get(m_window)->bindFBO();
+}
+
+/*!
+ Constructs a new QOpenGLWindow with the given \a parent and \a updateBehavior.
+
+ \sa QOpenGLWindow::UpdateBehavior
+ */
+QOpenGLWindow::QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior, QWindow *parent)
+ : QPaintDeviceWindow(*(new QOpenGLWindowPrivate(nullptr, updateBehavior)), parent)
+{
+ setSurfaceType(QSurface::OpenGLSurface);
+}
+
+/*!
+ Constructs a new QOpenGLWindow with the given \a parent and \a updateBehavior. The QOpenGLWindow's context will share with \a shareContext.
+
+ \sa QOpenGLWindow::UpdateBehavior shareContext
+*/
+QOpenGLWindow::QOpenGLWindow(QOpenGLContext *shareContext, UpdateBehavior updateBehavior, QWindow *parent)
+ : QPaintDeviceWindow(*(new QOpenGLWindowPrivate(shareContext, updateBehavior)), parent)
+{
+ setSurfaceType(QSurface::OpenGLSurface);
+}
+
+/*!
+ Destroys the QOpenGLWindow instance, freeing its resources.
+
+ The OpenGLWindow's context is made current in the destructor, allowing for
+ safe destruction of any child object that may need to release OpenGL
+ resources belonging to the context provided by this window.
+
+ \warning if you have objects wrapping OpenGL resources (such as
+ QOpenGLBuffer, QOpenGLShaderProgram, etc.) as members of a QOpenGLWindow
+ subclass, you may need to add a call to makeCurrent() in that subclass'
+ destructor as well. Due to the rules of C++ object destruction, those objects
+ will be destroyed \e{before} calling this function (but after that the
+ destructor of the subclass has run), therefore making the OpenGL context
+ current in this function happens too late for their safe disposal.
+
+ \sa makeCurrent
+
+ \since 5.5
+*/
+QOpenGLWindow::~QOpenGLWindow()
+{
+ makeCurrent();
+}
+
+/*!
+ \return the update behavior for this QOpenGLWindow.
+*/
+QOpenGLWindow::UpdateBehavior QOpenGLWindow::updateBehavior() const
+{
+ Q_D(const QOpenGLWindow);
+ return d->updateBehavior;
+}
+
+/*!
+ \return \c true if the window's OpenGL resources, like the context, have
+ been successfully initialized. Note that the return value is always \c false
+ until the window becomes exposed (shown).
+*/
+bool QOpenGLWindow::isValid() const
+{
+ Q_D(const QOpenGLWindow);
+ return d->context && d->context->isValid();
+}
+
+/*!
+ Prepares for rendering OpenGL content for this window by making the
+ corresponding context current and binding the framebuffer object, if there is
+ one, in that context context.
+
+ It is not necessary to call this function in most cases, because it is called
+ automatically before invoking paintGL(). It is provided nonetheless to support
+ advanced, multi-threaded scenarios where a thread different than the GUI or main
+ thread may want to update the surface or framebuffer contents. See QOpenGLContext
+ for more information on threading related issues.
+
+ This function is suitable for calling also when the underlying platform window
+ is already destroyed. This means that it is safe to call this function from
+ a QOpenGLWindow subclass' destructor. If there is no native window anymore,
+ an offscreen surface is used instead. This ensures that OpenGL resource
+ cleanup operations in the destructor will always work, as long as
+ this function is called first.
+
+ \sa QOpenGLContext, context(), paintGL(), doneCurrent()
+ */
+void QOpenGLWindow::makeCurrent()
+{
+ Q_D(QOpenGLWindow);
+
+ if (!isValid())
+ return;
+
+ // The platform window may be destroyed at this stage and therefore
+ // makeCurrent() may not safely be called with 'this'.
+ if (handle()) {
+ d->context->makeCurrent(this);
+ } else {
+ if (!d->offscreenSurface) {
+ d->offscreenSurface.reset(new QOffscreenSurface(screen()));
+ d->offscreenSurface->setFormat(d->context->format());
+ d->offscreenSurface->create();
+ }
+ d->context->makeCurrent(d->offscreenSurface.data());
+ }
+
+ d->bindFBO();
+}
+
+/*!
+ Releases the context.
+
+ It is not necessary to call this function in most cases, since the widget
+ will make sure the context is bound and released properly when invoking
+ paintGL().
+
+ \sa makeCurrent()
+ */
+void QOpenGLWindow::doneCurrent()
+{
+ Q_D(QOpenGLWindow);
+
+ if (!isValid())
+ return;
+
+ d->context->doneCurrent();
+}
+
+/*!
+ \return The QOpenGLContext used by this window or \c 0 if not yet initialized.
+ */
+QOpenGLContext *QOpenGLWindow::context() const
+{
+ Q_D(const QOpenGLWindow);
+ return d->context.data();
+}
+
+/*!
+ \return The QOpenGLContext requested to be shared with this window's QOpenGLContext.
+*/
+QOpenGLContext *QOpenGLWindow::shareContext() const
+{
+ Q_D(const QOpenGLWindow);
+ return d->shareContext;
+}
+
+/*!
+ The framebuffer object handle used by this window.
+
+ When the update behavior is set to \c NoPartialUpdate, there is no separate
+ framebuffer object. In this case the returned value is the ID of the
+ default framebuffer.
+
+ Otherwise the value of the ID of the framebuffer object or \c 0 if not
+ yet initialized.
+ */
+GLuint QOpenGLWindow::defaultFramebufferObject() const
+{
+ Q_D(const QOpenGLWindow);
+ if (d->updateBehavior > NoPartialUpdate && d->fbo)
+ return d->fbo->handle();
+ else if (QOpenGLContext *ctx = QOpenGLContext::currentContext())
+ return ctx->defaultFramebufferObject();
+ else
+ return 0;
+}
+
+/*!
+ Returns a copy of the framebuffer.
+
+ \note This is a potentially expensive operation because it relies on
+ glReadPixels() to read back the pixels. This may be slow and can stall the
+ GPU pipeline.
+
+ \note When used together with update behavior \c NoPartialUpdate, the returned
+ image may not contain the desired content when called after the front and back
+ buffers have been swapped (unless preserved swap is enabled in the underlying
+ windowing system interface). In this mode the function reads from the back
+ buffer and the contents of that may not match the content on the screen (the
+ front buffer). In this case the only place where this function can safely be
+ used is paintGL() or paintOverGL().
+ */
+QImage QOpenGLWindow::grabFramebuffer()
+{
+ if (!isValid())
+ return QImage();
+
+ makeCurrent();
+
+ const bool hasAlpha = format().hasAlpha();
+ QImage img = qt_gl_read_framebuffer(size() * devicePixelRatio(), hasAlpha, hasAlpha);
+ img.setDevicePixelRatio(devicePixelRatio());
+ return img;
+}
+
+/*!
+ This virtual function is called once before the first call to paintGL() or
+ resizeGL(). Reimplement it in a subclass.
+
+ This function should set up any required OpenGL resources and state.
+
+ There is no need to call makeCurrent() because this has already been done
+ when this function is called. Note however that the framebuffer, in case
+ partial update mode is used, is not yet available at this stage, so avoid
+ issuing draw calls from here. Defer such calls to paintGL() instead.
+
+ \sa paintGL(), resizeGL()
+ */
+void QOpenGLWindow::initializeGL()
+{
+}
+
+/*!
+ This virtual function is called whenever the widget has been resized.
+ Reimplement it in a subclass. The new size is passed in \a w and \a h.
+
+ \note This is merely a convenience function in order to provide an API that is
+ compatible with QOpenGLWidget. Unlike with QOpenGLWidget, derived classes are
+ free to choose to override resizeEvent() instead of this function.
+
+ \note Avoid issuing OpenGL commands from this function as there may not be a
+ context current when it is invoked. If it cannot be avoided, call makeCurrent().
+
+ \note Scheduling updates from here is not necessary. The windowing systems
+ will send expose events that trigger an update automatically.
+
+ \sa initializeGL(), paintGL()
+ */
+void QOpenGLWindow::resizeGL(int w, int h)
+{
+ Q_UNUSED(w);
+ Q_UNUSED(h);
+}
+
+/*!
+ This virtual function is called whenever the window contents needs to be
+ painted. Reimplement it in a subclass.
+
+ There is no need to call makeCurrent() because this has already
+ been done when this function is called.
+
+ Before invoking this function, the context and the framebuffer, if there is
+ one, are bound, and the viewport is set up by a call to glViewport(). No
+ other state is set and no clearing or drawing is performed by the framework.
+
+ \note When using a partial update behavior, like \c PartialUpdateBlend, the
+ output of the previous paintGL() call is preserved and, after the additional
+ drawing perfomed in the current invocation of the function, the content is
+ blitted or blended over the content drawn directly to the window in
+ paintUnderGL().
+
+ \sa initializeGL(), resizeGL(), paintUnderGL(), paintOverGL(), UpdateBehavior
+ */
+void QOpenGLWindow::paintGL()
+{
+}
+
+/*!
+ The virtual function is called before each invocation of paintGL().
+
+ When the update mode is set to \c NoPartialUpdate, there is no difference
+ between this function and paintGL(), performing rendering in either of them
+ leads to the same result.
+
+ The difference becomes significant when using \c PartialUpdateBlend, where an
+ extra framebuffer object is used. There, paintGL() targets this additional
+ framebuffer object, which preserves its contents, while paintUnderGL() and
+ paintOverGL() target the default framebuffer, i.e. directly the window
+ surface, the contents of which is lost after each displayed frame.
+
+ \note Avoid relying on this function when the update behavior is
+ \c PartialUpdateBlit. This mode involves blitting the extra framebuffer used by
+ paintGL() onto the default framebuffer after each invocation of paintGL(),
+ thus overwriting all drawing generated in this function.
+
+ \sa paintGL(), paintOverGL(), UpdateBehavior
+ */
+void QOpenGLWindow::paintUnderGL()
+{
+}
+
+/*!
+ This virtual function is called after each invocation of paintGL().
+
+ When the update mode is set to NoPartialUpdate, there is no difference
+ between this function and paintGL(), performing rendering in either of them
+ leads to the same result.
+
+ Like paintUnderGL(), rendering in this function targets the default
+ framebuffer of the window, regardless of the update behavior. It gets called
+ after paintGL() has returned and the blit (PartialUpdateBlit) or quad drawing
+ (PartialUpdateBlend) has been done.
+
+ \sa paintGL(), paintUnderGL(), UpdateBehavior
+ */
+void QOpenGLWindow::paintOverGL()
+{
+}
+
+/*!
+ Paint \a event handler. Calls paintGL().
+
+ \sa paintGL()
+ */
+void QOpenGLWindow::paintEvent(QPaintEvent *event)
+{
+ Q_UNUSED(event);
+ paintGL();
+}
+
+/*!
+ Resize \a event handler. Calls resizeGL().
+
+ \sa resizeGL()
+ */
+void QOpenGLWindow::resizeEvent(QResizeEvent *event)
+{
+ Q_UNUSED(event);
+ Q_D(QOpenGLWindow);
+ d->initialize();
+ resizeGL(width(), height());
+}
+
+/*!
+ \internal
+ */
+int QOpenGLWindow::metric(PaintDeviceMetric metric) const
+{
+ Q_D(const QOpenGLWindow);
+
+ switch (metric) {
+ case PdmDepth:
+ if (d->paintDevice)
+ return d->paintDevice->depth();
+ break;
+ default:
+ break;
+ }
+ return QPaintDeviceWindow::metric(metric);
+}
+
+/*!
+ \internal
+ */
+QPaintDevice *QOpenGLWindow::redirected(QPoint *) const
+{
+ Q_D(const QOpenGLWindow);
+ if (QOpenGLContext::currentContext() == d->context.data())
+ return d->paintDevice.data();
+ return nullptr;
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qopenglwindow.h b/src/opengl/qopenglwindow.h
new file mode 100644
index 0000000000..926e4fabfd
--- /dev/null
+++ b/src/opengl/qopenglwindow.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLWINDOW_H
+#define QOPENGLWINDOW_H
+
+#include <QtOpenGL/qtopenglglobal.h>
+
+#ifndef QT_NO_OPENGL
+
+#include <QtGui/QPaintDeviceWindow>
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QImage>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLWindowPrivate;
+
+class Q_OPENGL_EXPORT QOpenGLWindow : public QPaintDeviceWindow
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QOpenGLWindow)
+
+public:
+ enum UpdateBehavior {
+ NoPartialUpdate,
+ PartialUpdateBlit,
+ PartialUpdateBlend
+ };
+
+ explicit QOpenGLWindow(UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr);
+ explicit QOpenGLWindow(QOpenGLContext *shareContext, UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr);
+ ~QOpenGLWindow();
+
+ UpdateBehavior updateBehavior() const;
+ bool isValid() const;
+
+ void makeCurrent();
+ void doneCurrent();
+
+ QOpenGLContext *context() const;
+ QOpenGLContext *shareContext() const;
+
+ GLuint defaultFramebufferObject() const;
+
+ QImage grabFramebuffer();
+
+Q_SIGNALS:
+ void frameSwapped();
+
+protected:
+ virtual void initializeGL();
+ virtual void resizeGL(int w, int h);
+ virtual void paintGL();
+ virtual void paintUnderGL();
+ virtual void paintOverGL();
+
+ void paintEvent(QPaintEvent *event) override;
+ void resizeEvent(QResizeEvent *event) override;
+ int metric(PaintDeviceMetric metric) const override;
+ QPaintDevice *redirected(QPoint *) const override;
+
+private:
+ Q_DISABLE_COPY(QOpenGLWindow)
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL
+
+#endif
diff --git a/src/opengl/qtopenglglobal.h b/src/opengl/qtopenglglobal.h
index 0e821f87b8..861fb16d59 100644
--- a/src/opengl/qtopenglglobal.h
+++ b/src/opengl/qtopenglglobal.h
@@ -41,6 +41,7 @@
#define QTOPENGLGLOBAL_H
#include <QtCore/qglobal.h>
+#include <QtGui/qtguiglobal.h>
QT_BEGIN_NAMESPACE
diff --git a/src/openglextensions/CMakeLists.txt b/src/openglextensions/CMakeLists.txt
new file mode 100644
index 0000000000..d2fc027398
--- /dev/null
+++ b/src/openglextensions/CMakeLists.txt
@@ -0,0 +1,20 @@
+# Generated from openglextensions.pro.
+
+#####################################################################
+## OpenGLExtensions Module:
+#####################################################################
+
+qt_add_module(OpenGLExtensions
+ STATIC
+ SOURCES
+ qopenglextensions.cpp qopenglextensions.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::Gui
+)
+
+## Scopes:
+#####################################################################
diff --git a/src/openglextensions/qopenglextensions.cpp b/src/openglextensions/qopenglextensions.cpp
index 1660181e97..fadde172f5 100644
--- a/src/openglextensions/qopenglextensions.cpp
+++ b/src/openglextensions/qopenglextensions.cpp
@@ -87,7 +87,7 @@ bool QAbstractOpenGLExtension::isInitialized() const
return d->initialized;
}
-#if !defined(QT_OPENGL_ES_2)
+#if !QT_CONFIG(opengles2)
QOpenGLExtension_3DFX_tbuffer::QOpenGLExtension_3DFX_tbuffer()
: QAbstractOpenGLExtension(*(new QOpenGLExtension_3DFX_tbufferPrivate))
diff --git a/src/openglextensions/qopenglextensions.h b/src/openglextensions/qopenglextensions.h
index eb473f3699..6ae96f5563 100644
--- a/src/openglextensions/qopenglextensions.h
+++ b/src/openglextensions/qopenglextensions.h
@@ -107,7 +107,7 @@ protected:
QAbstractOpenGLExtensionPrivate *d_ptr;
};
-#if !defined(QT_OPENGL_ES_2)
+#if !QT_CONFIG(opengles2)
class QOpenGLExtension_3DFX_tbufferPrivate : public QAbstractOpenGLExtensionPrivate
{
diff --git a/src/openglwidgets/CMakeLists.txt b/src/openglwidgets/CMakeLists.txt
new file mode 100644
index 0000000000..d58944e596
--- /dev/null
+++ b/src/openglwidgets/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Generated from openglwidgets.pro.
+
+#####################################################################
+## OpenGLWidgets Module:
+#####################################################################
+
+qt_add_module(OpenGLWidgets
+ SOURCES
+ qopenglwidget.cpp qopenglwidget.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ LIBRARIES
+ Qt::OpenGLPrivate
+ Qt::WidgetsPrivate
+ PUBLIC_LIBRARIES
+ Qt::OpenGL
+ Qt::Widgets
+)
diff --git a/src/openglwidgets/openglwidgets.pro b/src/openglwidgets/openglwidgets.pro
new file mode 100644
index 0000000000..a058b77ea7
--- /dev/null
+++ b/src/openglwidgets/openglwidgets.pro
@@ -0,0 +1,13 @@
+TARGET = QtOpenGLWidgets
+QT = opengl widgets
+QT_PRIVATE += opengl-private widgets-private
+
+DEFINES += QT_NO_USING_NAMESPACE QT_NO_FOREACH
+
+HEADERS += \
+ qopenglwidget.h
+
+SOURCES += \
+ qopenglwidget.cpp
+
+load(qt_module)
diff --git a/src/openglwidgets/qopenglwidget.cpp b/src/openglwidgets/qopenglwidget.cpp
new file mode 100644
index 0000000000..1fefa09203
--- /dev/null
+++ b/src/openglwidgets/qopenglwidget.cpp
@@ -0,0 +1,1416 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGLWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenglwidget.h"
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QOffscreenSurface>
+#include <QtGui/QOpenGLFunctions>
+#include <QtGui/QWindow>
+#include <QtGui/QGuiApplication>
+#include <QtGui/QScreen>
+#include <QtGui/qpa/qplatformwindow.h>
+#include <QtGui/qpa/qplatformintegration.h>
+#include <QtOpenGL/QOpenGLFramebufferObject>
+#include <QtOpenGL/QOpenGLPaintDevice>
+
+#include <QtGui/private/qguiapplication_p.h>
+#include <QtGui/private/qopenglextensions_p.h>
+#include <QtGui/private/qfont_p.h>
+#include <QtGui/private/qopenglcontext_p.h>
+#include <QtOpenGL/private/qopenglframebufferobject_p.h>
+#include <QtOpenGL/private/qopenglpaintdevice_p.h>
+
+#include <QtWidgets/private/qwidget_p.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QOpenGLWidget
+ \inmodule QtOpenGLWidgets
+ \since 5.4
+
+ \brief The QOpenGLWidget class is a widget for rendering OpenGL graphics.
+
+ QOpenGLWidget provides functionality for displaying OpenGL graphics
+ integrated into a Qt application. It is very simple to use: Make
+ your class inherit from it and use the subclass like any other
+ QWidget, except that you have the choice between using QPainter and
+ standard OpenGL rendering commands.
+
+ QOpenGLWidget provides three convenient virtual functions that you
+ can reimplement in your subclass to perform the typical OpenGL
+ tasks:
+
+ \list
+ \li paintGL() - Renders the OpenGL scene. Gets called whenever the widget
+ needs to be updated.
+ \li resizeGL() - Sets up the OpenGL viewport, projection, etc. Gets
+ called whenever the widget has been resized (and also when it
+ is shown for the first time because all newly created widgets get a
+ resize event automatically).
+ \li initializeGL() - Sets up the OpenGL resources and state. Gets called
+ once before the first time resizeGL() or paintGL() is called.
+ \endlist
+
+ If you need to trigger a repaint from places other than paintGL() (a
+ typical example is when using \l{QTimer}{timers} to animate scenes),
+ you should call the widget's update() function to schedule an update.
+
+ Your widget's OpenGL rendering context is made current when
+ paintGL(), resizeGL(), or initializeGL() is called. If you need to
+ call the standard OpenGL API functions from other places (e.g. in
+ your widget's constructor or in your own paint functions), you
+ must call makeCurrent() first.
+
+ All rendering happens into an OpenGL framebuffer
+ object. makeCurrent() ensure that it is bound in the context. Keep
+ this in mind when creating and binding additional framebuffer
+ objects in the rendering code in paintGL(). Never re-bind the
+ framebuffer with ID 0. Instead, call defaultFramebufferObject() to
+ get the ID that should be bound.
+
+ QOpenGLWidget allows using different OpenGL versions and profiles
+ when the platform supports it. Just set the requested format via
+ setFormat(). Keep in mind however that having multiple QOpenGLWidget
+ instances in the same window requires that they all use the same
+ format, or at least formats that do not make the contexts
+ non-sharable. To overcome this issue, prefer using
+ QSurfaceFormat::setDefaultFormat() instead of setFormat().
+
+ \note Calling QSurfaceFormat::setDefaultFormat() before constructing
+ the QApplication instance is mandatory on some platforms (for example,
+ \macos) when an OpenGL core profile context is requested. This is to
+ ensure that resource sharing between contexts stays functional as all
+ internal contexts are created using the correct version and profile.
+
+ \section1 Painting Techniques
+
+ As described above, subclass QOpenGLWidget to render pure 3D content in the
+ following way:
+
+ \list
+
+ \li Reimplement the initializeGL() and resizeGL() functions to
+ set up the OpenGL state and provide a perspective transformation.
+
+ \li Reimplement paintGL() to paint the 3D scene, calling only
+ OpenGL functions.
+
+ \endlist
+
+ It is also possible to draw 2D graphics onto a QOpenGLWidget subclass using QPainter:
+
+ \list
+
+ \li In paintGL(), instead of issuing OpenGL commands, construct a QPainter
+ object for use on the widget.
+
+ \li Draw primitives using QPainter's member functions.
+
+ \li Direct OpenGL commands can still be issued. However, you must make sure
+ these are enclosed by a call to the painter's beginNativePainting() and
+ endNativePainting().
+
+ \endlist
+
+ When performing drawing using QPainter only, it is also possible to perform
+ the painting like it is done for ordinary widgets: by reimplementing paintEvent().
+
+ \list
+
+ \li Reimplement the paintEvent() function.
+
+ \li Construct a QPainter object targeting the widget. Either pass the widget to the
+ constructor or the QPainter::begin() function.
+
+ \li Draw primitives using QPainter's member functions.
+
+ \li Painting finishes then the QPainter instance is destroyed. Alternatively,
+ call QPainter::end() explicitly.
+
+ \endlist
+
+ \section1 OpenGL Function Calls, Headers and QOpenGLFunctions
+
+ When making OpenGL function calls, it is strongly recommended to avoid calling
+ the functions directly. Instead, prefer using QOpenGLFunctions (when making
+ portable applications) or the versioned variants (for example,
+ QOpenGLFunctions_3_2_Core and similar, when targeting modern, desktop-only
+ OpenGL). This way the application will work correctly in all Qt build
+ configurations, including the ones that perform dynamic OpenGL implementation
+ loading which means applications are not directly linking to an GL
+ implementation and thus direct function calls are not feasible.
+
+ In paintGL() the current context is always accessible by caling
+ QOpenGLContext::currentContext(). From this context an already initialized,
+ ready-to-be-used QOpenGLFunctions instance is retrievable by calling
+ QOpenGLContext::functions(). An alternative to prefixing every GL call is to
+ inherit from QOpenGLFunctions and call
+ QOpenGLFunctions::initializeOpenGLFunctions() in initializeGL().
+
+ As for the OpenGL headers, note that in most cases there will be no need to
+ directly include any headers like GL.h. The OpenGL-related Qt headers will
+ include qopengl.h which will in turn include an appropriate header for the
+ system. This might be an OpenGL ES 3.x or 2.0 header, the highest version that
+ is available, or a system-provided gl.h. In addition, a copy of the extension
+ headers (called glext.h on some systems) is provided as part of Qt both for
+ OpenGL and OpenGL ES. These will get included automatically on platforms where
+ feasible. This means that constants and function pointer typedefs from ARB,
+ EXT, OES extensions are automatically available.
+
+ \section1 Code Examples
+
+ To get started, the simplest QOpenGLWidget subclass could like like the following:
+
+ \snippet code/doc_gui_widgets_qopenglwidget.cpp 0
+
+ Alternatively, the prefixing of each and every OpenGL call can be avoided by deriving
+ from QOpenGLFunctions instead:
+
+ \snippet code/doc_gui_widgets_qopenglwidget.cpp 1
+
+ To get a context compatible with a given OpenGL version or profile, or to
+ request depth and stencil buffers, call setFormat():
+
+ \snippet code/doc_gui_widgets_qopenglwidget.cpp 2
+
+ With OpenGL 3.0+ contexts, when portability is not important, the versioned
+ QOpenGLFunctions variants give easy access to all the modern OpenGL functions
+ available in a given version:
+
+ \snippet code/doc_gui_widgets_qopenglwidget.cpp 3
+
+ As described above, it is simpler and more robust to set the requested format
+ globally so that it applies to all windows and contexts during the lifetime of
+ the application. Below is an example of this:
+
+ \snippet code/doc_gui_widgets_qopenglwidget.cpp 6
+
+ \section1 Multisampling
+
+ To enable multisampling, set the number of requested samples on the
+ QSurfaceFormat that is passed to setFormat(). On systems that do not support
+ it the request may get ignored.
+
+ Multisampling support requires support for multisampled renderbuffers and
+ framebuffer blits. On OpenGL ES 2.0 implementations it is likely that these
+ will not be present. This means that multisampling will not be available. With
+ modern OpenGL versions and OpenGL ES 3.0 and up this is usually not a problem
+ anymore.
+
+ \section1 Threading
+
+ Performing offscreen rendering on worker threads, for example to generate
+ textures that are then used in the GUI/main thread in paintGL(), are supported
+ by exposing the widget's QOpenGLContext so that additional contexts sharing
+ with it can be created on each thread.
+
+ Drawing directly to the QOpenGLWidget's framebuffer outside the GUI/main
+ thread is possible by reimplementing paintEvent() to do nothing. The context's
+ thread affinity has to be changed via QObject::moveToThread(). After that,
+ makeCurrent() and doneCurrent() are usable on the worker thread. Be careful to
+ move the context back to the GUI/main thread afterwards.
+
+ Triggering a buffer swap just for the QOpenGLWidget is not possible since there
+ is no real, onscreen native surface for it. It is up to the widget stack to
+ manage composition and buffer swaps on the gui thread. When a thread is done
+ updating the framebuffer, call update() \b{on the GUI/main thread} to
+ schedule composition.
+
+ Extra care has to be taken to avoid using the framebuffer when the GUI/main
+ thread is performing compositing. The signals aboutToCompose() and
+ frameSwapped() will be emitted when the composition is starting and
+ ending. They are emitted on the GUI/main thread. This means that by using a
+ direct connection aboutToCompose() can block the GUI/main thread until the
+ worker thread has finished its rendering. After that, the worker thread must
+ perform no further rendering until the frameSwapped() signal is emitted. If
+ this is not acceptable, the worker thread has to implement a double buffering
+ mechanism. This involves drawing using an alternative render target, that is
+ fully controlled by the thread, e.g. an additional framebuffer object, and
+ blitting to the QOpenGLWidget's framebuffer at a suitable time.
+
+ \section1 Context Sharing
+
+ When multiple QOpenGLWidgets are added as children to the same top-level
+ widget, their contexts will share with each other. This does not apply for
+ QOpenGLWidget instances that belong to different windows.
+
+ This means that all QOpenGLWidgets in the same window can access each other's
+ sharable resources, like textures, and there is no need for an extra "global
+ share" context.
+
+ To set up sharing between QOpenGLWidget instances belonging to different
+ windows, set the Qt::AA_ShareOpenGLContexts application attribute before
+ instantiating QApplication. This will trigger sharing between all
+ QOpenGLWidget instances without any further steps.
+
+ Creating extra QOpenGLContext instances that share resources like textures
+ with the QOpenGLWidget's context is also possible. Simply pass the pointer
+ returned from context() to QOpenGLContext::setShareContext() before calling
+ QOpenGLContext::create(). The resulting context can also be used on a
+ different thread, allowing threaded generation of textures and asynchronous
+ texture uploads.
+
+ Note that QOpenGLWidget expects a standard conformant implementation of
+ resource sharing when it comes to the underlying graphics drivers. For
+ example, some drivers, in particular for mobile and embedded hardware, have
+ issues with setting up sharing between an existing context and others that are
+ created later. Some other drivers may behave in unexpected ways when trying to
+ utilize shared resources between different threads.
+
+ \section1 Resource Initialization and Cleanup
+
+ The QOpenGLWidget's associated OpenGL context is guaranteed to be current
+ whenever initializeGL() and paintGL() are invoked. Do not attempt to create
+ OpenGL resources before initializeGL() is called. For example, attempting to
+ compile shaders, initialize vertex buffer objects or upload texture data will
+ fail when done in a subclass's constructor. These operations must be deferred
+ to initializeGL(). Some of Qt's OpenGL helper classes, like QOpenGLBuffer or
+ QOpenGLVertexArrayObject, have a matching deferred behavior: they can be
+ instantiated without a context, but all initialization is deferred until a
+ create(), or similar, call. This means that they can be used as normal
+ (non-pointer) member variables in a QOpenGLWidget subclass, but the create()
+ or similar function can only be called from initializeGL(). Be aware however
+ that not all classes are designed like this. When in doubt, make the member
+ variable a pointer and create and destroy the instance dynamically in
+ initializeGL() and the destructor, respectively.
+
+ Releasing the resources also needs the context to be current. Therefore
+ destructors that perform such cleanup are expected to call makeCurrent()
+ before moving on to destroy any OpenGL resources or wrappers. Avoid deferred
+ deletion via \l{QObject::deleteLater()}{deleteLater()} or the parenting
+ mechanism of QObject. There is no guarantee the correct context will be
+ current at the time the instance in question is really destroyed.
+
+ A typical subclass will therefore often look like the following when it comes
+ to resource initialization and destruction:
+
+ \snippet code/doc_gui_widgets_qopenglwidget.cpp 4
+
+ This is naturally not the only possible solution. One alternative is to use
+ the \l{QOpenGLContext::aboutToBeDestroyed()}{aboutToBeDestroyed()} signal of
+ QOpenGLContext. By connecting a slot, using direct connection, to this signal,
+ it is possible to perform cleanup whenever the underlying native context
+ handle, or the entire QOpenGLContext instance, is going to be released. The
+ following snippet is in principle equivalent to the previous one:
+
+ \snippet code/doc_gui_widgets_qopenglwidget.cpp 5
+
+ \note For widgets that change their associated top-level window multiple times
+ during their lifetime, a combined approach is essential. Whenever the widget
+ or a parent of it gets reparented so that the top-level window becomes
+ different, the widget's associated context is destroyed and a new one is
+ created. This is then followed by a call to initializeGL() where all OpenGL
+ resources must get reinitialized. Due to this the only option to perform
+ proper cleanup is to connect to the context's aboutToBeDestroyed()
+ signal. Note that the context in question may not be the current one when the
+ signal gets emitted. Therefore it is good practice to call makeCurrent() in
+ the connected slot. Additionally, the same cleanup steps must be performed
+ from the derived class' destructor, since the slot connected to the signal
+ will not get invoked when the widget is being destroyed.
+
+ \note When Qt::AA_ShareOpenGLContexts is set, the widget's context never
+ changes, not even when reparenting because the widget's associated texture is
+ guaranteed to be accessible also from the new top-level's context.
+
+ Proper cleanup is especially important due to context sharing. Even though
+ each QOpenGLWidget's associated context is destroyed together with the
+ QOpenGLWidget, the sharable resources in that context, like textures, will
+ stay valid until the top-level window, in which the QOpenGLWidget lived, is
+ destroyed. Additionally, settings like Qt::AA_ShareOpenGLContexts and some Qt
+ modules may trigger an even wider scope for sharing contexts, potentially
+ leading to keeping the resources in question alive for the entire lifetime of
+ the application. Therefore the safest and most robust is always to perform
+ explicit cleanup for all resources and resource wrappers used in the
+ QOpenGLWidget.
+
+ \section1 Limitations
+
+ Putting other widgets underneath and making the QOpenGLWidget transparent will
+ not lead to the expected results: The widgets underneath will not be
+ visible. This is because in practice the QOpenGLWidget is drawn before all
+ other regular, non-OpenGL widgets, and so see-through type of solutions are
+ not feasible. Other type of layouts, like having widgets on top of the
+ QOpenGLWidget, will function as expected.
+
+ When absolutely necessary, this limitation can be overcome by setting the
+ Qt::WA_AlwaysStackOnTop attribute on the QOpenGLWidget. Be aware however that
+ this breaks stacking order, for example it will not be possible to have other
+ widgets on top of the QOpenGLWidget, so it should only be used in situations
+ where a semi-transparent QOpenGLWidget with other widgets visible underneath
+ is required.
+
+ Note that this does not apply when there are no other widgets underneath and
+ the intention is to have a semi-transparent window. In that case the
+ traditional approach of setting Qt::WA_TranslucentBackground
+ on the top-level window is sufficient. Note that if the transparent areas are
+ only desired in the QOpenGLWidget, then Qt::WA_NoSystemBackground will need
+ to be turned back to \c false after enabling Qt::WA_TranslucentBackground.
+ Additionally, requesting an alpha channel for the QOpenGLWidget's context via
+ setFormat() may be necessary too, depending on the system.
+
+ QOpenGLWidget supports multiple update behaviors, just like QOpenGLWindow. In
+ preserved mode the rendered content from the previous paintGL() call is
+ available in the next one, allowing incremental rendering. In non-preserved
+ mode the content is lost and paintGL() implementations are expected to redraw
+ everything in the view.
+
+ Before Qt 5.5 the default behavior of QOpenGLWidget was to preserve the
+ rendered contents between paintGL() calls. Since Qt 5.5 the default behavior
+ is non-preserved because this provides better performance and the majority of
+ applications have no need for the previous content. This also resembles the
+ semantics of an OpenGL-based QWindow and matches the default behavior of
+ QOpenGLWindow in that the color and ancillary buffers are invalidated for
+ each frame. To restore the preserved behavior, call setUpdateBehavior() with
+ \c PartialUpdate.
+
+ \section1 Alternatives
+
+ Adding a QOpenGLWidget into a window turns on OpenGL-based
+ compositing for the entire window. In some special cases this may
+ not be ideal, and the old QGLWidget-style behavior with a separate,
+ native child window is desired. Desktop applications that understand
+ the limitations of this approach (for example when it comes to
+ overlaps, transparency, scroll views and MDI areas), can use
+ QOpenGLWindow with QWidget::createWindowContainer(). This is a
+ modern alternative to QGLWidget and is faster than QOpenGLWidget due
+ to the lack of the additional composition step. It is strongly
+ recommended to limit the usage of this approach to cases where there
+ is no other choice. Note that this option is not suitable for most
+ embedded and mobile platforms, and it is known to have issues on
+ certain desktop platforms (e.g. \macos) too. The stable,
+ cross-platform solution is always QOpenGLWidget.
+
+ \e{OpenGL is a trademark of Silicon Graphics, Inc. in the United States and other
+ countries.}
+
+ \sa QOpenGLFunctions, QOpenGLWindow, Qt::AA_ShareOpenGLContexts, UpdateBehavior
+*/
+
+/*!
+ \fn void QOpenGLWidget::aboutToCompose()
+
+ This signal is emitted when the widget's top-level window is about to begin
+ composing the textures of its QOpenGLWidget children and the other widgets.
+*/
+
+/*!
+ \fn void QOpenGLWidget::frameSwapped()
+
+ This signal is emitted after the widget's top-level window has finished
+ composition and returned from its potentially blocking
+ QOpenGLContext::swapBuffers() call.
+*/
+
+/*!
+ \fn void QOpenGLWidget::aboutToResize()
+
+ This signal is emitted when the widget's size is changed and therefore the
+ framebuffer object is going to be recreated.
+*/
+
+/*!
+ \fn void QOpenGLWidget::resized()
+
+ This signal is emitted right after the framebuffer object has been recreated
+ due to resizing the widget.
+*/
+
+/*!
+ \enum QOpenGLWidget::UpdateBehavior
+ \since 5.5
+
+ This enum describes the update semantics of QOpenGLWidget.
+
+ \value NoPartialUpdate QOpenGLWidget will discard the
+ contents of the color buffer and the ancillary buffers after the
+ QOpenGLWidget is rendered to screen. This is the same behavior that can be
+ expected by calling QOpenGLContext::swapBuffers with a default opengl
+ enabled QWindow as the argument. NoPartialUpdate can have some performance
+ benefits on certain hardware architectures common in the mobile and
+ embedded space when a framebuffer object is used as the rendering target.
+ The framebuffer object is invalidated between frames with
+ glDiscardFramebufferEXT if supported or a glClear. Please see the
+ documentation of EXT_discard_framebuffer for more information:
+ https://www.khronos.org/registry/gles/extensions/EXT/EXT_discard_framebuffer.txt
+
+ \value PartialUpdate The framebuffer objects color buffer and ancillary
+ buffers are not invalidated between frames.
+
+ \sa updateBehavior(), setUpdateBehavior()
+*/
+
+class QOpenGLWidgetPaintDevicePrivate : public QOpenGLPaintDevicePrivate
+{
+public:
+ QOpenGLWidgetPaintDevicePrivate(QOpenGLWidget *widget)
+ : QOpenGLPaintDevicePrivate(QSize()),
+ w(widget) { }
+
+ void beginPaint() override;
+ void endPaint() override;
+
+ QOpenGLWidget *w;
+};
+
+class QOpenGLWidgetPaintDevice : public QOpenGLPaintDevice
+{
+public:
+ QOpenGLWidgetPaintDevice(QOpenGLWidget *widget)
+ : QOpenGLPaintDevice(*new QOpenGLWidgetPaintDevicePrivate(widget)) { }
+ void ensureActiveTarget() override;
+};
+
+class QOpenGLWidgetPrivate : public QWidgetPrivate
+{
+ Q_DECLARE_PUBLIC(QOpenGLWidget)
+public:
+ QOpenGLWidgetPrivate()
+ : context(nullptr),
+ fbo(nullptr),
+ resolvedFbo(nullptr),
+ surface(nullptr),
+ initialized(false),
+ fakeHidden(false),
+ inBackingStorePaint(false),
+ hasBeenComposed(false),
+ flushPending(false),
+ paintDevice(nullptr),
+ updateBehavior(QOpenGLWidget::NoPartialUpdate),
+ requestedSamples(0),
+ inPaintGL(false),
+ textureFormat(0)
+ {
+ requestedFormat = QSurfaceFormat::defaultFormat();
+ }
+
+ void reset();
+ void recreateFbo();
+
+ GLuint textureId() const override;
+ QPlatformTextureList::Flags textureListFlags() override;
+
+ void initialize();
+ void invokeUserPaint();
+ void render();
+
+ void invalidateFbo();
+
+ QImage grabFramebuffer() override;
+ void beginBackingStorePainting() override { inBackingStorePaint = true; }
+ void endBackingStorePainting() override { inBackingStorePaint = false; }
+ void beginCompose() override;
+ void endCompose() override;
+ void initializeViewportFramebuffer() override;
+ void resizeViewportFramebuffer() override;
+ void resolveSamples() override;
+
+ QOpenGLContext *context;
+ QOpenGLFramebufferObject *fbo;
+ QOpenGLFramebufferObject *resolvedFbo;
+ QOffscreenSurface *surface;
+ bool initialized;
+ bool fakeHidden;
+ bool inBackingStorePaint;
+ bool hasBeenComposed;
+ bool flushPending;
+ QOpenGLPaintDevice *paintDevice;
+ QSurfaceFormat requestedFormat;
+ QOpenGLWidget::UpdateBehavior updateBehavior;
+ int requestedSamples;
+ bool inPaintGL;
+ GLenum textureFormat;
+};
+
+void QOpenGLWidgetPaintDevicePrivate::beginPaint()
+{
+ // NB! autoFillBackground is and must be false by default. Otherwise we would clear on
+ // every QPainter begin() which is not desirable. This is only for legacy use cases,
+ // like using QOpenGLWidget as the viewport of a graphics view, that expect clearing
+ // with the palette's background color.
+ if (w->autoFillBackground()) {
+ QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
+ if (w->format().hasAlpha()) {
+ f->glClearColor(0, 0, 0, 0);
+ } else {
+ QColor c = w->palette().brush(w->backgroundRole()).color();
+ float alpha = c.alphaF();
+ f->glClearColor(c.redF() * alpha, c.greenF() * alpha, c.blueF() * alpha, alpha);
+ }
+ f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+ }
+}
+
+void QOpenGLWidgetPaintDevicePrivate::endPaint()
+{
+ QOpenGLWidgetPrivate *wd = static_cast<QOpenGLWidgetPrivate *>(QWidgetPrivate::get(w));
+ if (!wd->initialized)
+ return;
+
+ if (!wd->inPaintGL)
+ QOpenGLContextPrivate::get(wd->context)->defaultFboRedirect = 0;
+}
+
+void QOpenGLWidgetPaintDevice::ensureActiveTarget()
+{
+ QOpenGLWidgetPaintDevicePrivate *d = static_cast<QOpenGLWidgetPaintDevicePrivate *>(d_ptr.data());
+ QOpenGLWidgetPrivate *wd = static_cast<QOpenGLWidgetPrivate *>(QWidgetPrivate::get(d->w));
+ if (!wd->initialized)
+ return;
+
+ if (QOpenGLContext::currentContext() != wd->context)
+ d->w->makeCurrent();
+ else
+ wd->fbo->bind();
+
+ if (!wd->inPaintGL)
+ QOpenGLContextPrivate::get(wd->context)->defaultFboRedirect = wd->fbo->handle();
+
+ // When used as a viewport, drawing is done via opening a QPainter on the widget
+ // without going through paintEvent(). We will have to make sure a glFlush() is done
+ // before the texture is accessed also in this case.
+ wd->flushPending = true;
+}
+
+GLuint QOpenGLWidgetPrivate::textureId() const
+{
+ return resolvedFbo ? resolvedFbo->texture() : (fbo ? fbo->texture() : 0);
+}
+
+#ifndef GL_SRGB
+#define GL_SRGB 0x8C40
+#endif
+#ifndef GL_SRGB8
+#define GL_SRGB8 0x8C41
+#endif
+#ifndef GL_SRGB_ALPHA
+#define GL_SRGB_ALPHA 0x8C42
+#endif
+#ifndef GL_SRGB8_ALPHA8
+#define GL_SRGB8_ALPHA8 0x8C43
+#endif
+
+QPlatformTextureList::Flags QOpenGLWidgetPrivate::textureListFlags()
+{
+ QPlatformTextureList::Flags flags = QWidgetPrivate::textureListFlags();
+ switch (textureFormat) {
+ case GL_SRGB:
+ case GL_SRGB8:
+ case GL_SRGB_ALPHA:
+ case GL_SRGB8_ALPHA8:
+ flags |= QPlatformTextureList::TextureIsSrgb;
+ break;
+ default:
+ break;
+ }
+ return flags;
+}
+
+void QOpenGLWidgetPrivate::reset()
+{
+ Q_Q(QOpenGLWidget);
+
+ // Destroy the OpenGL resources first. These need the context to be current.
+ if (initialized)
+ q->makeCurrent();
+
+ delete paintDevice;
+ paintDevice = nullptr;
+ delete fbo;
+ fbo = nullptr;
+ delete resolvedFbo;
+ resolvedFbo = nullptr;
+
+ if (initialized)
+ q->doneCurrent();
+
+ // Delete the context first, then the surface. Slots connected to
+ // the context's aboutToBeDestroyed() may still call makeCurrent()
+ // to perform some cleanup.
+ delete context;
+ context = nullptr;
+ delete surface;
+ surface = nullptr;
+ initialized = fakeHidden = inBackingStorePaint = false;
+}
+
+void QOpenGLWidgetPrivate::recreateFbo()
+{
+ Q_Q(QOpenGLWidget);
+
+ emit q->aboutToResize();
+
+ context->makeCurrent(surface);
+
+ delete fbo;
+ fbo = nullptr;
+ delete resolvedFbo;
+ resolvedFbo = nullptr;
+
+ int samples = requestedSamples;
+ QOpenGLExtensions *extfuncs = static_cast<QOpenGLExtensions *>(context->functions());
+ if (!extfuncs->hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample))
+ samples = 0;
+
+ QOpenGLFramebufferObjectFormat format;
+ format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
+ format.setSamples(samples);
+ if (textureFormat)
+ format.setInternalTextureFormat(textureFormat);
+
+ const QSize deviceSize = q->size() * q->devicePixelRatioF();
+ fbo = new QOpenGLFramebufferObject(deviceSize, format);
+ if (samples > 0)
+ resolvedFbo = new QOpenGLFramebufferObject(deviceSize);
+
+ textureFormat = fbo->format().internalTextureFormat();
+
+ fbo->bind();
+ context->functions()->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+ flushPending = true; // Make sure the FBO is initialized before use
+
+ paintDevice->setSize(deviceSize);
+ paintDevice->setDevicePixelRatio(q->devicePixelRatioF());
+
+ emit q->resized();
+}
+
+void QOpenGLWidgetPrivate::beginCompose()
+{
+ Q_Q(QOpenGLWidget);
+ if (flushPending) {
+ flushPending = false;
+ q->makeCurrent();
+ static_cast<QOpenGLExtensions *>(context->functions())->flushShared();
+ }
+ hasBeenComposed = true;
+ emit q->aboutToCompose();
+}
+
+void QOpenGLWidgetPrivate::endCompose()
+{
+ Q_Q(QOpenGLWidget);
+ emit q->frameSwapped();
+}
+
+void QOpenGLWidgetPrivate::initialize()
+{
+ Q_Q(QOpenGLWidget);
+ if (initialized)
+ return;
+
+ // If no global shared context get our toplevel's context with which we
+ // will share in order to make the texture usable by the underlying window's backingstore.
+ QWidget *tlw = q->window();
+ QOpenGLContext *shareContext = qt_gl_global_share_context();
+ if (!shareContext)
+ shareContext = get(tlw)->shareContext();
+ // If shareContext is null, showing content on-screen will not work.
+ // However, offscreen rendering and grabFramebuffer() will stay fully functional.
+
+ // Do not include the sample count. Requesting a multisampled context is not necessary
+ // since we render into an FBO, never to an actual surface. What's more, attempting to
+ // create a pbuffer with a multisampled config crashes certain implementations. Just
+ // avoid the entire hassle, the result is the same.
+ requestedSamples = requestedFormat.samples();
+ requestedFormat.setSamples(0);
+
+ QScopedPointer<QOpenGLContext> ctx(new QOpenGLContext);
+ ctx->setFormat(requestedFormat);
+ if (shareContext) {
+ ctx->setShareContext(shareContext);
+ ctx->setScreen(shareContext->screen());
+ }
+ if (Q_UNLIKELY(!ctx->create())) {
+ qWarning("QOpenGLWidget: Failed to create context");
+ return;
+ }
+
+ // Propagate settings that make sense only for the tlw. Note that this only
+ // makes sense for properties that get picked up even after the native
+ // window is created.
+ if (tlw->windowHandle()) {
+ QSurfaceFormat tlwFormat = tlw->windowHandle()->format();
+ if (requestedFormat.swapInterval() != tlwFormat.swapInterval()) {
+ // Most platforms will pick up the changed swap interval on the next
+ // makeCurrent or swapBuffers.
+ tlwFormat.setSwapInterval(requestedFormat.swapInterval());
+ tlw->windowHandle()->setFormat(tlwFormat);
+ }
+ if (requestedFormat.swapBehavior() != tlwFormat.swapBehavior()) {
+ tlwFormat.setSwapBehavior(requestedFormat.swapBehavior());
+ tlw->windowHandle()->setFormat(tlwFormat);
+ }
+ }
+
+ // The top-level window's surface is not good enough since it causes way too
+ // much trouble with regards to the QSurfaceFormat for example. So just like
+ // in QQuickWidget, use a dedicated QOffscreenSurface.
+ surface = new QOffscreenSurface;
+ surface->setFormat(ctx->format());
+ surface->setScreen(ctx->screen());
+ surface->create();
+
+ if (Q_UNLIKELY(!ctx->makeCurrent(surface))) {
+ qWarning("QOpenGLWidget: Failed to make context current");
+ return;
+ }
+
+ paintDevice = new QOpenGLWidgetPaintDevice(q);
+ paintDevice->setSize(q->size() * q->devicePixelRatioF());
+ paintDevice->setDevicePixelRatio(q->devicePixelRatioF());
+
+ context = ctx.take();
+ initialized = true;
+
+ q->initializeGL();
+}
+
+void QOpenGLWidgetPrivate::resolveSamples()
+{
+ Q_Q(QOpenGLWidget);
+ if (resolvedFbo) {
+ q->makeCurrent();
+ QRect rect(QPoint(0, 0), fbo->size());
+ QOpenGLFramebufferObject::blitFramebuffer(resolvedFbo, rect, fbo, rect);
+ flushPending = true;
+ }
+}
+
+void QOpenGLWidgetPrivate::invokeUserPaint()
+{
+ Q_Q(QOpenGLWidget);
+
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ Q_ASSERT(ctx && fbo);
+
+ QOpenGLFunctions *f = ctx->functions();
+ QOpenGLContextPrivate::get(ctx)->defaultFboRedirect = fbo->handle();
+
+ f->glViewport(0, 0, q->width() * q->devicePixelRatioF(), q->height() * q->devicePixelRatioF());
+ inPaintGL = true;
+ q->paintGL();
+ inPaintGL = false;
+ flushPending = true;
+
+ QOpenGLContextPrivate::get(ctx)->defaultFboRedirect = 0;
+}
+
+void QOpenGLWidgetPrivate::render()
+{
+ Q_Q(QOpenGLWidget);
+
+ if (fakeHidden || !initialized)
+ return;
+
+ q->makeCurrent();
+
+ if (updateBehavior == QOpenGLWidget::NoPartialUpdate && hasBeenComposed) {
+ invalidateFbo();
+ hasBeenComposed = false;
+ }
+
+ invokeUserPaint();
+}
+
+void QOpenGLWidgetPrivate::invalidateFbo()
+{
+ QOpenGLExtensions *f = static_cast<QOpenGLExtensions *>(QOpenGLContext::currentContext()->functions());
+ if (f->hasOpenGLExtension(QOpenGLExtensions::DiscardFramebuffer)) {
+ const int gl_color_attachment0 = 0x8CE0; // GL_COLOR_ATTACHMENT0
+ const int gl_depth_attachment = 0x8D00; // GL_DEPTH_ATTACHMENT
+ const int gl_stencil_attachment = 0x8D20; // GL_STENCIL_ATTACHMENT
+#ifdef Q_OS_WASM
+ // webgl does not allow separate depth and stencil attachments
+ // QTBUG-69913
+ const int gl_depth_stencil_attachment = 0x821A; // GL_DEPTH_STENCIL_ATTACHMENT
+
+ const GLenum attachments[] = {
+ gl_color_attachment0, gl_depth_attachment, gl_stencil_attachment, gl_depth_stencil_attachment
+ };
+#else
+ const GLenum attachments[] = {
+ gl_color_attachment0, gl_depth_attachment, gl_stencil_attachment
+ };
+#endif
+ f->glDiscardFramebufferEXT(GL_FRAMEBUFFER, sizeof attachments / sizeof *attachments, attachments);
+ } else {
+ f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+ }
+}
+
+QImage QOpenGLWidgetPrivate::grabFramebuffer()
+{
+ Q_Q(QOpenGLWidget);
+
+ initialize();
+ if (!initialized)
+ return QImage();
+
+ if (!fbo) // could be completely offscreen, without ever getting a resize event
+ recreateFbo();
+
+ if (!inPaintGL)
+ render();
+
+ if (resolvedFbo) {
+ resolveSamples();
+ resolvedFbo->bind();
+ } else {
+ q->makeCurrent();
+ }
+
+ const bool hasAlpha = q->format().hasAlpha();
+ QImage res = qt_gl_read_framebuffer(q->size() * q->devicePixelRatioF(), hasAlpha, hasAlpha);
+ res.setDevicePixelRatio(q->devicePixelRatioF());
+
+ // While we give no guarantees of what is going to be left bound, prefer the
+ // multisample fbo instead of the resolved one. Clients may continue to
+ // render straight after calling this function.
+ if (resolvedFbo)
+ q->makeCurrent();
+
+ return res;
+}
+
+void QOpenGLWidgetPrivate::initializeViewportFramebuffer()
+{
+ Q_Q(QOpenGLWidget);
+ // Legacy behavior for compatibility with QGLWidget when used as a graphics view
+ // viewport: enable clearing on each painter begin.
+ q->setAutoFillBackground(true);
+}
+
+void QOpenGLWidgetPrivate::resizeViewportFramebuffer()
+{
+ Q_Q(QOpenGLWidget);
+ if (!initialized)
+ return;
+
+ if (!fbo || q->size() * q->devicePixelRatioF() != fbo->size()) {
+ recreateFbo();
+ q->update();
+ }
+}
+
+/*!
+ Constructs a widget which is a child of \a parent, with widget flags set to \a f.
+ */
+QOpenGLWidget::QOpenGLWidget(QWidget *parent, Qt::WindowFlags f)
+ : QWidget(*(new QOpenGLWidgetPrivate), parent, f)
+{
+ Q_D(QOpenGLWidget);
+ if (Q_UNLIKELY(!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::RasterGLSurface)))
+ qWarning("QOpenGLWidget is not supported on this platform.");
+ else
+ d->setRenderToTexture();
+}
+
+/*!
+ Destroys the QOpenGLWidget instance, freeing its resources.
+
+ The QOpenGLWidget's context is made current in the destructor, allowing for
+ safe destruction of any child object that may need to release OpenGL
+ resources belonging to the context provided by this widget.
+
+ \warning if you have objects wrapping OpenGL resources (such as
+ QOpenGLBuffer, QOpenGLShaderProgram, etc.) as members of a OpenGLWidget
+ subclass, you may need to add a call to makeCurrent() in that subclass'
+ destructor as well. Due to the rules of C++ object destruction, those objects
+ will be destroyed \e{before} calling this function (but after that the
+ destructor of the subclass has run), therefore making the OpenGL context
+ current in this function happens too late for their safe disposal.
+
+ \sa makeCurrent
+*/
+QOpenGLWidget::~QOpenGLWidget()
+{
+ Q_D(QOpenGLWidget);
+ d->reset();
+}
+
+/*!
+ Sets this widget's update behavior to \a updateBehavior.
+ \since 5.5
+*/
+void QOpenGLWidget::setUpdateBehavior(UpdateBehavior updateBehavior)
+{
+ Q_D(QOpenGLWidget);
+ d->updateBehavior = updateBehavior;
+}
+
+/*!
+ \return the update behavior of the widget.
+ \since 5.5
+*/
+QOpenGLWidget::UpdateBehavior QOpenGLWidget::updateBehavior() const
+{
+ Q_D(const QOpenGLWidget);
+ return d->updateBehavior;
+}
+
+/*!
+ Sets the requested surface \a format.
+
+ When the format is not explicitly set via this function, the format returned by
+ QSurfaceFormat::defaultFormat() will be used. This means that when having multiple
+ OpenGL widgets, individual calls to this function can be replaced by one single call to
+ QSurfaceFormat::setDefaultFormat() before creating the first widget.
+
+ \note Requesting an alpha buffer via this function will not lead to the
+ desired results when the intention is to make other widgets beneath visible.
+ Instead, use Qt::WA_AlwaysStackOnTop to enable semi-transparent QOpenGLWidget
+ instances with other widgets visible underneath. Keep in mind however that
+ this breaks the stacking order, so it will no longer be possible to have
+ other widgets on top of the QOpenGLWidget.
+
+ \sa format(), Qt::WA_AlwaysStackOnTop, QSurfaceFormat::setDefaultFormat()
+ */
+void QOpenGLWidget::setFormat(const QSurfaceFormat &format)
+{
+ Q_D(QOpenGLWidget);
+ if (Q_UNLIKELY(d->initialized)) {
+ qWarning("QOpenGLWidget: Already initialized, setting the format has no effect");
+ return;
+ }
+
+ d->requestedFormat = format;
+}
+
+/*!
+ Returns the context and surface format used by this widget and its toplevel
+ window.
+
+ After the widget and its toplevel have both been created, resized and shown,
+ this function will return the actual format of the context. This may differ
+ from the requested format if the request could not be fulfilled by the
+ platform. It is also possible to get larger color buffer sizes than
+ requested.
+
+ When the widget's window and the related OpenGL resources are not yet
+ initialized, the return value is the format that has been set via
+ setFormat().
+
+ \sa setFormat(), context()
+ */
+QSurfaceFormat QOpenGLWidget::format() const
+{
+ Q_D(const QOpenGLWidget);
+ return d->initialized ? d->context->format() : d->requestedFormat;
+}
+
+/*!
+ Sets a custom internal texture format of \a texFormat.
+
+ When working with sRGB framebuffers, it will be necessary to specify a
+ format like \c{GL_SRGB8_ALPHA8}. This can be achieved by calling this
+ function.
+
+ \note This function has no effect if called after the widget has already
+ been shown and thus it performed initialization.
+
+ \note This function will typically have to be used in combination with a
+ QSurfaceFormat::setDefaultFormat() call that sets the color space to
+ QSurfaceFormat::sRGBColorSpace.
+
+ \since 5.10
+ */
+void QOpenGLWidget::setTextureFormat(GLenum texFormat)
+{
+ Q_D(QOpenGLWidget);
+ if (Q_UNLIKELY(d->initialized)) {
+ qWarning("QOpenGLWidget: Already initialized, setting the internal texture format has no effect");
+ return;
+ }
+
+ d->textureFormat = texFormat;
+}
+
+/*!
+ \return the active internal texture format if the widget has already
+ initialized, the requested format if one was set but the widget has not yet
+ been made visible, or \nullptr if setTextureFormat() was not called and the
+ widget has not yet been made visible.
+
+ \since 5.10
+ */
+GLenum QOpenGLWidget::textureFormat() const
+{
+ Q_D(const QOpenGLWidget);
+ return d->textureFormat;
+}
+
+/*!
+ \return \e true if the widget and OpenGL resources, like the context, have
+ been successfully initialized. Note that the return value is always false
+ until the widget is shown.
+*/
+bool QOpenGLWidget::isValid() const
+{
+ Q_D(const QOpenGLWidget);
+ return d->initialized && d->context->isValid();
+}
+
+/*!
+ Prepares for rendering OpenGL content for this widget by making the
+ corresponding context current and binding the framebuffer object in that
+ context.
+
+ It is not necessary to call this function in most cases, because it
+ is called automatically before invoking paintGL().
+
+ \sa context(), paintGL(), doneCurrent()
+ */
+void QOpenGLWidget::makeCurrent()
+{
+ Q_D(QOpenGLWidget);
+ if (!d->initialized)
+ return;
+
+ d->context->makeCurrent(d->surface);
+
+ if (d->fbo) // there may not be one if we are in reset()
+ d->fbo->bind();
+}
+
+/*!
+ Releases the context.
+
+ It is not necessary to call this function in most cases, since the
+ widget will make sure the context is bound and released properly
+ when invoking paintGL().
+ */
+void QOpenGLWidget::doneCurrent()
+{
+ Q_D(QOpenGLWidget);
+ if (!d->initialized)
+ return;
+
+ d->context->doneCurrent();
+}
+
+/*!
+ \return The QOpenGLContext used by this widget or \c 0 if not yet initialized.
+
+ \note The context and the framebuffer object used by the widget changes when
+ reparenting the widget via setParent().
+
+ \sa QOpenGLContext::setShareContext(), defaultFramebufferObject()
+ */
+QOpenGLContext *QOpenGLWidget::context() const
+{
+ Q_D(const QOpenGLWidget);
+ return d->context;
+}
+
+/*!
+ \return The framebuffer object handle or \c 0 if not yet initialized.
+
+ \note The framebuffer object belongs to the context returned by context()
+ and may not be accessible from other contexts.
+
+ \note The context and the framebuffer object used by the widget changes when
+ reparenting the widget via setParent(). In addition, the framebuffer object
+ changes on each resize.
+
+ \sa context()
+ */
+GLuint QOpenGLWidget::defaultFramebufferObject() const
+{
+ Q_D(const QOpenGLWidget);
+ return d->fbo ? d->fbo->handle() : 0;
+}
+
+/*!
+ This virtual function is called once before the first call to
+ paintGL() or resizeGL(). Reimplement it in a subclass.
+
+ This function should set up any required OpenGL resources and state.
+
+ There is no need to call makeCurrent() because this has already been
+ done when this function is called. Note however that the framebuffer
+ is not yet available at this stage, so avoid issuing draw calls from
+ here. Defer such calls to paintGL() instead.
+
+ \sa paintGL(), resizeGL()
+*/
+void QOpenGLWidget::initializeGL()
+{
+}
+
+/*!
+ This virtual function is called whenever the widget has been
+ resized. Reimplement it in a subclass. The new size is passed in
+ \a w and \a h.
+
+ There is no need to call makeCurrent() because this has already been
+ done when this function is called. Additionally, the framebuffer is
+ also bound.
+
+ \sa initializeGL(), paintGL()
+*/
+void QOpenGLWidget::resizeGL(int w, int h)
+{
+ Q_UNUSED(w);
+ Q_UNUSED(h);
+}
+
+/*!
+ This virtual function is called whenever the widget needs to be
+ painted. Reimplement it in a subclass.
+
+ There is no need to call makeCurrent() because this has already
+ been done when this function is called.
+
+ Before invoking this function, the context and the framebuffer are
+ bound, and the viewport is set up by a call to glViewport(). No
+ other state is set and no clearing or drawing is performed by the
+ framework.
+
+ \sa initializeGL(), resizeGL()
+*/
+void QOpenGLWidget::paintGL()
+{
+}
+
+/*!
+ Handles resize events that are passed in the \a e event parameter.
+ Calls the virtual function resizeGL().
+
+ \note Avoid overriding this function in derived classes. If that is not
+ feasible, make sure that QOpenGLWidget's implementation is invoked
+ too. Otherwise the underlying framebuffer object and related resources will
+ not get resized properly and will lead to incorrect rendering.
+*/
+void QOpenGLWidget::resizeEvent(QResizeEvent *e)
+{
+ Q_D(QOpenGLWidget);
+
+ if (e->size().isEmpty()) {
+ d->fakeHidden = true;
+ return;
+ }
+ d->fakeHidden = false;
+
+ d->initialize();
+ if (!d->initialized)
+ return;
+
+ d->recreateFbo();
+ resizeGL(width(), height());
+ d->sendPaintEvent(QRect(QPoint(0, 0), size()));
+}
+
+/*!
+ Handles paint events.
+
+ Calling QWidget::update() will lead to sending a paint event \a e,
+ and thus invoking this function. (NB this is asynchronous and will
+ happen at some point after returning from update()). This function
+ will then, after some preparation, call the virtual paintGL() to
+ update the contents of the QOpenGLWidget's framebuffer. The widget's
+ top-level window will then composite the framebuffer's texture with
+ the rest of the window.
+*/
+void QOpenGLWidget::paintEvent(QPaintEvent *e)
+{
+ Q_UNUSED(e);
+ Q_D(QOpenGLWidget);
+ if (!d->initialized)
+ return;
+
+ if (updatesEnabled())
+ d->render();
+}
+
+/*!
+ Renders and returns a 32-bit RGB image of the framebuffer.
+
+ \note This is a potentially expensive operation because it relies on glReadPixels()
+ to read back the pixels. This may be slow and can stall the GPU pipeline.
+*/
+QImage QOpenGLWidget::grabFramebuffer()
+{
+ Q_D(QOpenGLWidget);
+ return d->grabFramebuffer();
+}
+
+/*!
+ \internal
+*/
+int QOpenGLWidget::metric(QPaintDevice::PaintDeviceMetric metric) const
+{
+ Q_D(const QOpenGLWidget);
+ if (d->inBackingStorePaint)
+ return QWidget::metric(metric);
+
+ auto window = d->windowHandle(QWidgetPrivate::WindowHandleMode::TopLevel);
+ QScreen *screen = window ? window->screen() : QGuiApplication::primaryScreen();
+
+ const float dpmx = qt_defaultDpiX() * 100. / 2.54;
+ const float dpmy = qt_defaultDpiY() * 100. / 2.54;
+
+ switch (metric) {
+ case PdmWidth:
+ return width();
+ case PdmHeight:
+ return height();
+ case PdmDepth:
+ return 32;
+ case PdmWidthMM:
+ if (screen)
+ return width() * screen->physicalSize().width() / screen->geometry().width();
+ else
+ return width() * 1000 / dpmx;
+ case PdmHeightMM:
+ if (screen)
+ return height() * screen->physicalSize().height() / screen->geometry().height();
+ else
+ return height() * 1000 / dpmy;
+ case PdmNumColors:
+ return 0;
+ case PdmDpiX:
+ if (screen)
+ return qRound(screen->logicalDotsPerInchX());
+ else
+ return qRound(dpmx * 0.0254);
+ case PdmDpiY:
+ if (screen)
+ return qRound(screen->logicalDotsPerInchY());
+ else
+ return qRound(dpmy * 0.0254);
+ case PdmPhysicalDpiX:
+ if (screen)
+ return qRound(screen->physicalDotsPerInchX());
+ else
+ return qRound(dpmx * 0.0254);
+ case PdmPhysicalDpiY:
+ if (screen)
+ return qRound(screen->physicalDotsPerInchY());
+ else
+ return qRound(dpmy * 0.0254);
+ case PdmDevicePixelRatio:
+ if (window)
+ return int(window->devicePixelRatio());
+ else
+ return 1.0;
+ case PdmDevicePixelRatioScaled:
+ if (window)
+ return int(window->devicePixelRatio() * devicePixelRatioFScale());
+ else
+ return int(devicePixelRatioFScale());
+ default:
+ qWarning("QOpenGLWidget::metric(): unknown metric %d", metric);
+ return 0;
+ }
+}
+
+/*!
+ \internal
+*/
+QPaintDevice *QOpenGLWidget::redirected(QPoint *p) const
+{
+ Q_D(const QOpenGLWidget);
+ if (d->inBackingStorePaint)
+ return QWidget::redirected(p);
+
+ return d->paintDevice;
+}
+
+/*!
+ \internal
+*/
+QPaintEngine *QOpenGLWidget::paintEngine() const
+{
+ Q_D(const QOpenGLWidget);
+ // QWidget needs to "punch a hole" into the backingstore. This needs the
+ // normal paint engine and device, not the GL one. So in this mode, behave
+ // like a normal widget.
+ if (d->inBackingStorePaint)
+ return QWidget::paintEngine();
+
+ if (!d->initialized)
+ return nullptr;
+
+ return d->paintDevice->paintEngine();
+}
+
+/*!
+ \internal
+*/
+bool QOpenGLWidget::event(QEvent *e)
+{
+ Q_D(QOpenGLWidget);
+ switch (e->type()) {
+ case QEvent::WindowChangeInternal:
+ if (QCoreApplication::testAttribute(Qt::AA_ShareOpenGLContexts))
+ break;
+ if (d->initialized)
+ d->reset();
+ if (isHidden())
+ break;
+ Q_FALLTHROUGH();
+ case QEvent::Show: // reparenting may not lead to a resize so reinitalize on Show too
+ if (d->initialized && window()->windowHandle()
+ && d->context->shareContext() != QWidgetPrivate::get(window())->shareContext())
+ {
+ // Special case: did grabFramebuffer() for a hidden widget that then became visible.
+ // Recreate all resources since the context now needs to share with the TLW's.
+ if (!QCoreApplication::testAttribute(Qt::AA_ShareOpenGLContexts))
+ d->reset();
+ }
+ if (!d->initialized && !size().isEmpty() && window()->windowHandle()) {
+ d->initialize();
+ if (d->initialized)
+ d->recreateFbo();
+ }
+ break;
+ case QEvent::ScreenChangeInternal:
+ if (d->initialized && d->paintDevice->devicePixelRatioF() != devicePixelRatioF())
+ d->recreateFbo();
+ break;
+ default:
+ break;
+ }
+ return QWidget::event(e);
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qopenglwidget.cpp"
diff --git a/src/openglwidgets/qopenglwidget.h b/src/openglwidgets/qopenglwidget.h
new file mode 100644
index 0000000000..0f2884f827
--- /dev/null
+++ b/src/openglwidgets/qopenglwidget.h
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGLWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENGLWIDGET_H
+#define QOPENGLWIDGET_H
+
+#include <QtOpenGLWidgets/qtopenglwidgetsglobal.h>
+
+#include <QtWidgets/QWidget>
+#include <QtGui/QSurfaceFormat>
+#include <QtGui/qopengl.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLWidgetPrivate;
+
+class Q_OPENGLWIDGETS_EXPORT QOpenGLWidget : public QWidget
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QOpenGLWidget)
+
+public:
+ enum UpdateBehavior {
+ NoPartialUpdate,
+ PartialUpdate
+ };
+
+ explicit QOpenGLWidget(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
+ ~QOpenGLWidget();
+
+ void setUpdateBehavior(UpdateBehavior updateBehavior);
+ UpdateBehavior updateBehavior() const;
+
+ void setFormat(const QSurfaceFormat &format);
+ QSurfaceFormat format() const;
+
+ GLenum textureFormat() const;
+ void setTextureFormat(GLenum texFormat);
+
+ bool isValid() const;
+
+ void makeCurrent();
+ void doneCurrent();
+
+ QOpenGLContext *context() const;
+ GLuint defaultFramebufferObject() const;
+
+ QImage grabFramebuffer();
+
+Q_SIGNALS:
+ void aboutToCompose();
+ void frameSwapped();
+ void aboutToResize();
+ void resized();
+
+protected:
+ virtual void initializeGL();
+ virtual void resizeGL(int w, int h);
+ virtual void paintGL();
+
+ void paintEvent(QPaintEvent *e) override;
+ void resizeEvent(QResizeEvent *e) override;
+ bool event(QEvent *e) override;
+
+ int metric(QPaintDevice::PaintDeviceMetric metric) const override;
+ QPaintDevice *redirected(QPoint *p) const override;
+ QPaintEngine *paintEngine() const override;
+
+private:
+ Q_DISABLE_COPY(QOpenGLWidget)
+};
+
+QT_END_NAMESPACE
+
+#endif // QOPENGLWIDGET_H
diff --git a/src/openglwidgets/qtopenglwidgetsglobal.h b/src/openglwidgets/qtopenglwidgetsglobal.h
new file mode 100644
index 0000000000..41c73fafda
--- /dev/null
+++ b/src/openglwidgets/qtopenglwidgetsglobal.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtOpenGLWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTOPENGLWIDGETSGLOBAL_H
+#define QTOPENGLWIDGETSGLOBAL_H
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_STATIC
+# if defined(QT_BUILD_OPENGLWIDGETS_LIB)
+# define Q_OPENGLWIDGETS_EXPORT Q_DECL_EXPORT
+# else
+# define Q_OPENGLWIDGETS_EXPORT Q_DECL_IMPORT
+# endif
+#else
+# define Q_OPENGLWIDGETS_EXPORT
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QTOPENGLWIDGETSGLOBAL_H
diff --git a/src/platformheaders/.prev_CMakeLists.txt b/src/platformheaders/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..5456de5c80
--- /dev/null
+++ b/src/platformheaders/.prev_CMakeLists.txt
@@ -0,0 +1,2 @@
+# Generated from platformheaders.pro.
+
diff --git a/src/platformheaders/CMakeLists.txt b/src/platformheaders/CMakeLists.txt
new file mode 100644
index 0000000000..820bbb71a5
--- /dev/null
+++ b/src/platformheaders/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Generated from platformheaders.pro.
+
+# special case begin
+
+# FIXME Add the rest of the stuff? I don't think any other stuff is needed?
+
+qt_add_module(PlatformHeaders HEADER_MODULE)
+
+qt_add_docs(PlatformHeaders
+ doc/qtplatformheaders.qdocconf
+)
+
+# special case end
diff --git a/src/3rdparty/harfbuzz/ChangeLog b/src/platformheaders/fake.cpp
index e69de29bb2..e69de29bb2 100644
--- a/src/3rdparty/harfbuzz/ChangeLog
+++ b/src/platformheaders/fake.cpp
diff --git a/src/platformheaders/windowsfunctions/qwindowswindowfunctions.h b/src/platformheaders/windowsfunctions/qwindowswindowfunctions.h
index 032dcafa6e..722f640a13 100644
--- a/src/platformheaders/windowsfunctions/qwindowswindowfunctions.h
+++ b/src/platformheaders/windowsfunctions/qwindowswindowfunctions.h
@@ -108,6 +108,14 @@ public:
IsTabletModeType func = reinterpret_cast<IsTabletModeType>(QGuiApplication::platformFunction(isTabletModeIdentifier()));
return func && func();
}
+
+ typedef bool (*SetWinTabEnabled)(bool enabled);
+ static const QByteArray setWinTabEnabledIdentifier() { return QByteArrayLiteral("WindowsSetWinTabEnabled"); }
+ static bool setWinTabEnabled(bool enabled)
+ {
+ SetWinTabEnabled func = reinterpret_cast<SetWinTabEnabled>(QGuiApplication::platformFunction(setWinTabEnabledIdentifier()));
+ return func && func(enabled);
+ }
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QWindowsWindowFunctions::TouchWindowTouchTypes)
diff --git a/src/platformheaders/windowsfunctions/qwindowswindowfunctions.qdoc b/src/platformheaders/windowsfunctions/qwindowswindowfunctions.qdoc
index 31a8d40abe..e782c30ee6 100644
--- a/src/platformheaders/windowsfunctions/qwindowswindowfunctions.qdoc
+++ b/src/platformheaders/windowsfunctions/qwindowswindowfunctions.qdoc
@@ -210,3 +210,30 @@
\sa QWidget::showMaximized(), QWidget::saveGeometry(), QWidget::restoreGeometry()
\since 5.9
*/
+
+/*!
+ \typedef QWindowsWindowFunctions::SetWinTabEnabled
+ \since 6.0
+
+ This is the typedef for the function returned by QGuiApplication::platformFunction
+ when passed setWinTabEnabledIdentifier().
+*/
+
+/*!
+ \fn QByteArray QWindowsWindowFunctions::setWinTabEnabledIdentifier()
+ \since 6.0
+
+ This function returns the bytearray that can be used to query
+ QGuiApplication::platformFunction to retrieve the SetWinTabEnabled function.
+*/
+
+/*!
+ \fn bool QWindowsWindowFunctions::setWinTabEnabled(bool enabled)
+ \since 6.0
+
+ This is a convenience function that can be used directly instead of resolving
+ the function pointer.
+
+ \a enabled determines whether the WinTab API will be used for tablet input instead
+ of the native API. Returns true if the operation was successful.
+*/
diff --git a/src/platformsupport/.prev_CMakeLists.txt b/src/platformsupport/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..9d237c65ed
--- /dev/null
+++ b/src/platformsupport/.prev_CMakeLists.txt
@@ -0,0 +1,45 @@
+# Generated from platformsupport.pro.
+
+add_subdirectory(edid)
+add_subdirectory(eventdispatchers)
+add_subdirectory(devicediscovery)
+add_subdirectory(fbconvenience)
+add_subdirectory(themes)
+add_subdirectory(linuxofono)
+if(APPLE OR QT_FEATURE_freetype OR WIN32)
+ add_subdirectory(fontdatabases)
+endif()
+if(QT_FEATURE_evdev OR QT_FEATURE_integrityhid OR QT_FEATURE_libinput OR QT_FEATURE_tslib OR QT_FEATURE_xkbcommon)
+ add_subdirectory(input)
+endif()
+if(QT_FEATURE_xcb OR (UNIX AND NOT UIKIT))
+ add_subdirectory(services)
+endif()
+if(QT_FEATURE_opengl)
+ add_subdirectory(platformcompositor)
+endif()
+if(QT_FEATURE_egl)
+ add_subdirectory(eglconvenience)
+endif()
+if(QT_FEATURE_opengl AND QT_FEATURE_xlib AND NOT QT_FEATURE_opengles2)
+ add_subdirectory(glxconvenience)
+endif()
+if(QT_FEATURE_kms)
+ add_subdirectory(kmsconvenience)
+endif()
+if(QT_FEATURE_accessibility)
+ add_subdirectory(accessibility)
+endif()
+if(QT_FEATURE_accessibility AND QT_FEATURE_accessibility_atspi_bridge)
+ add_subdirectory(linuxaccessibility)
+endif()
+if(QT_FEATURE_accessibility AND WIN32 AND NOT WINRT)
+ add_subdirectory(windowsuiautomation)
+endif()
+if(APPLE)
+ add_subdirectory(clipboard)
+ add_subdirectory(graphics)
+endif()
+if(QT_FEATURE_vulkan)
+ add_subdirectory(vkconvenience)
+endif()
diff --git a/src/platformsupport/CMakeLists.txt b/src/platformsupport/CMakeLists.txt
new file mode 100644
index 0000000000..b0110b0db1
--- /dev/null
+++ b/src/platformsupport/CMakeLists.txt
@@ -0,0 +1,49 @@
+# Generated from platformsupport.pro.
+
+add_subdirectory(edid)
+add_subdirectory(eventdispatchers)
+add_subdirectory(devicediscovery)
+add_subdirectory(fbconvenience)
+add_subdirectory(themes)
+# special case begin
+if (QT_FEATURE_dbus)
+ add_subdirectory(linuxofono)
+endif()
+# special case end
+if(APPLE OR QT_FEATURE_freetype OR WIN32)
+ add_subdirectory(fontdatabases)
+endif()
+if(QT_FEATURE_evdev OR QT_FEATURE_integrityhid OR QT_FEATURE_libinput OR QT_FEATURE_tslib OR QT_FEATURE_xkbcommon)
+ add_subdirectory(input)
+endif()
+if(QT_FEATURE_xcb OR (UNIX AND NOT UIKIT))
+ add_subdirectory(services)
+endif()
+if(QT_FEATURE_opengl)
+ add_subdirectory(platformcompositor)
+endif()
+if(QT_FEATURE_egl)
+ add_subdirectory(eglconvenience)
+endif()
+if(QT_FEATURE_opengl AND QT_FEATURE_xlib AND NOT QT_FEATURE_opengles2)
+ add_subdirectory(glxconvenience)
+endif()
+if(QT_FEATURE_kms)
+ add_subdirectory(kmsconvenience)
+endif()
+if(QT_FEATURE_accessibility)
+ add_subdirectory(accessibility)
+endif()
+if(QT_FEATURE_accessibility AND QT_FEATURE_accessibility_atspi_bridge)
+ add_subdirectory(linuxaccessibility)
+endif()
+if(QT_FEATURE_accessibility AND WIN32 AND NOT WINRT)
+ add_subdirectory(windowsuiautomation)
+endif()
+if(APPLE)
+ add_subdirectory(clipboard)
+ add_subdirectory(graphics)
+endif()
+if(QT_FEATURE_vulkan)
+ add_subdirectory(vkconvenience)
+endif()
diff --git a/src/platformsupport/accessibility/CMakeLists.txt b/src/platformsupport/accessibility/CMakeLists.txt
new file mode 100644
index 0000000000..4757b123af
--- /dev/null
+++ b/src/platformsupport/accessibility/CMakeLists.txt
@@ -0,0 +1,20 @@
+# Generated from accessibility.pro.
+
+#####################################################################
+## AccessibilitySupport Module:
+#####################################################################
+
+qt_add_module(AccessibilitySupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qaccessiblebridgeutils.cpp qaccessiblebridgeutils_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:accessibility.pro:<TRUE>:
+# MODULE = "accessibility_support"
diff --git a/src/platformsupport/clipboard/CMakeLists.txt b/src/platformsupport/clipboard/CMakeLists.txt
new file mode 100644
index 0000000000..d5b6835a54
--- /dev/null
+++ b/src/platformsupport/clipboard/CMakeLists.txt
@@ -0,0 +1,29 @@
+# Generated from clipboard.pro.
+
+#####################################################################
+## ClipboardSupport Module:
+#####################################################################
+
+qt_add_module(ClipboardSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qmacmime.mm qmacmime_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ ${FWImageIO}
+ Qt::CorePrivate
+ Qt::Gui
+)
+
+#### Keys ignored in scope 1:.:.:clipboard.pro:<TRUE>:
+# MODULE = "clipboard_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(ClipboardSupport CONDITION MACOS
+ LIBRARIES
+ ${FWAppKit}
+)
diff --git a/src/platformsupport/devicediscovery/CMakeLists.txt b/src/platformsupport/devicediscovery/CMakeLists.txt
new file mode 100644
index 0000000000..8ecabb4a1b
--- /dev/null
+++ b/src/platformsupport/devicediscovery/CMakeLists.txt
@@ -0,0 +1,40 @@
+# Generated from devicediscovery.pro.
+
+#####################################################################
+## DeviceDiscoverySupport Module:
+#####################################################################
+
+qt_add_module(DeviceDiscoverySupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qdevicediscovery_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+)
+
+#### Keys ignored in scope 1:.:.:devicediscovery.pro:<TRUE>:
+# MODULE = "devicediscovery_support"
+# QT_FOR_CONFIG = "gui-private"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(DeviceDiscoverySupport CONDITION QT_FEATURE_libudev
+ SOURCES
+ qdevicediscovery_udev.cpp qdevicediscovery_udev_p.h
+ LIBRARIES
+ PkgConfig::Libudev
+)
+
+qt_extend_target(DeviceDiscoverySupport CONDITION QT_FEATURE_evdev AND NOT QT_FEATURE_libudev
+ SOURCES
+ qdevicediscovery_static.cpp qdevicediscovery_static_p.h
+)
+
+qt_extend_target(DeviceDiscoverySupport CONDITION NOT QT_FEATURE_evdev AND NOT QT_FEATURE_libudev
+ SOURCES
+ qdevicediscovery_dummy.cpp qdevicediscovery_dummy_p.h
+)
diff --git a/src/platformsupport/edid/CMakeLists.txt b/src/platformsupport/edid/CMakeLists.txt
new file mode 100644
index 0000000000..aaea30448e
--- /dev/null
+++ b/src/platformsupport/edid/CMakeLists.txt
@@ -0,0 +1,21 @@
+# Generated from edid.pro.
+
+#####################################################################
+## EdidSupport Module:
+#####################################################################
+
+qt_add_module(EdidSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qedidparser.cpp qedidparser_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:edid.pro:<TRUE>:
+# MODULE = "edid_support"
diff --git a/src/platformsupport/eglconvenience/.prev_CMakeLists.txt b/src/platformsupport/eglconvenience/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..c00cc30d62
--- /dev/null
+++ b/src/platformsupport/eglconvenience/.prev_CMakeLists.txt
@@ -0,0 +1,50 @@
+# Generated from eglconvenience.pro.
+
+#####################################################################
+## EglSupport Module:
+#####################################################################
+
+qt_add_module(EglSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qeglconvenience.cpp qeglconvenience_p.h
+ qeglstreamconvenience.cpp qeglstreamconvenience_p.h
+ qt_egl_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:eglconvenience.pro:<TRUE>:
+# MODULE = "egl_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(EglSupport CONDITION QT_FEATURE_opengl
+ SOURCES
+ qeglpbuffer.cpp qeglpbuffer_p.h
+ qeglplatformcontext.cpp qeglplatformcontext_p.h
+)
+
+qt_extend_target(EglSupport CONDITION QT_FEATURE_egl_x11
+ SOURCES
+ qxlibeglintegration.cpp qxlibeglintegration_p.h
+ LIBRARIES
+ X11::X11
+)
+
+qt_extend_target(EglSupport CONDITION NOT QT_FEATURE_egl_x11
+ DEFINES
+ QT_EGL_NO_X11
+)
+
+qt_extend_target(EglSupport CONDITION QT_FEATURE_dlopen
+ PUBLIC_LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
diff --git a/src/platformsupport/eglconvenience/CMakeLists.txt b/src/platformsupport/eglconvenience/CMakeLists.txt
new file mode 100644
index 0000000000..1858dc7e90
--- /dev/null
+++ b/src/platformsupport/eglconvenience/CMakeLists.txt
@@ -0,0 +1,53 @@
+# Generated from eglconvenience.pro.
+
+#####################################################################
+## EglSupport Module:
+#####################################################################
+
+qt_find_package(EGL) # special case
+
+qt_add_module(EglSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qeglconvenience.cpp qeglconvenience_p.h
+ qeglstreamconvenience.cpp qeglstreamconvenience_p.h
+ qt_egl_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ EGL::EGL # special case
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:eglconvenience.pro:<TRUE>:
+# MODULE = "egl_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(EglSupport CONDITION QT_FEATURE_opengl
+ SOURCES
+ qeglpbuffer.cpp qeglpbuffer_p.h
+ qeglplatformcontext.cpp qeglplatformcontext_p.h
+)
+
+qt_extend_target(EglSupport CONDITION QT_FEATURE_egl_x11
+ SOURCES
+ qxlibeglintegration.cpp qxlibeglintegration_p.h
+ LIBRARIES
+ X11::X11
+)
+
+qt_extend_target(EglSupport CONDITION NOT QT_FEATURE_egl_x11
+ DEFINES
+ QT_EGL_NO_X11
+)
+
+qt_extend_target(EglSupport CONDITION QT_FEATURE_dlopen
+ PUBLIC_LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
diff --git a/src/platformsupport/eglconvenience/qeglplatformcontext.cpp b/src/platformsupport/eglconvenience/qeglplatformcontext.cpp
index 63cf771f32..d38a850065 100644
--- a/src/platformsupport/eglconvenience/qeglplatformcontext.cpp
+++ b/src/platformsupport/eglconvenience/qeglplatformcontext.cpp
@@ -466,7 +466,7 @@ QFunctionPointer QEGLPlatformContext::getProcAddress(const char *procName)
const char *name;
QFunctionPointer func;
} standardFuncs[] = {
-#ifdef QT_OPENGL_ES_2
+#if QT_CONFIG(opengles2)
{ "glBindTexture", (QFunctionPointer) ::glBindTexture },
{ "glBlendFunc", (QFunctionPointer) ::glBlendFunc },
{ "glClear", (QFunctionPointer) ::glClear },
@@ -611,9 +611,9 @@ QFunctionPointer QEGLPlatformContext::getProcAddress(const char *procName)
{ "glClearDepthf", (QFunctionPointer) ::glClearDepthf },
{ "glDepthRangef", (QFunctionPointer) ::glDepthRangef },
-#endif // QT_OPENGL_ES_2
+#endif // QT_CONFIG(opengles2)
-#ifdef QT_OPENGL_ES_3
+#if QT_CONFIG(opengles3)
{ "glBeginQuery", (QFunctionPointer) ::glBeginQuery },
{ "glBeginTransformFeedback", (QFunctionPointer) ::glBeginTransformFeedback },
{ "glBindBufferBase", (QFunctionPointer) ::glBindBufferBase },
@@ -718,9 +718,9 @@ QFunctionPointer QEGLPlatformContext::getProcAddress(const char *procName)
{ "glVertexAttribI4uiv", (QFunctionPointer) ::glVertexAttribI4uiv },
{ "glVertexAttribIPointer", (QFunctionPointer) ::glVertexAttribIPointer },
{ "glWaitSync", (QFunctionPointer) ::glWaitSync },
-#endif // QT_OPENGL_ES_3
+#endif // QT_CONFIG(opengles3)
-#ifdef QT_OPENGL_ES_3_1
+#if QT_CONFIG(opengles31)
{ "glActiveShaderProgram", (QFunctionPointer) ::glActiveShaderProgram },
{ "glBindImageTexture", (QFunctionPointer) ::glBindImageTexture },
{ "glBindProgramPipeline", (QFunctionPointer) ::glBindProgramPipeline },
@@ -789,9 +789,9 @@ QFunctionPointer QEGLPlatformContext::getProcAddress(const char *procName)
{ "glVertexAttribFormat", (QFunctionPointer) ::glVertexAttribFormat },
{ "glVertexAttribIFormat", (QFunctionPointer) ::glVertexAttribIFormat },
{ "glVertexBindingDivisor", (QFunctionPointer) ::glVertexBindingDivisor },
-#endif // QT_OPENGL_ES_3_1
+#endif // QT_CONFIG(opengles31)
-#ifdef QT_OPENGL_ES_3_2
+#if QT_CONFIG(opengles32)
{ "glBlendBarrier", (QFunctionPointer) ::glBlendBarrier },
{ "glCopyImageSubData", (QFunctionPointer) ::glCopyImageSubData },
{ "glDebugMessageControl", (QFunctionPointer) ::glDebugMessageControl },
@@ -836,7 +836,7 @@ QFunctionPointer QEGLPlatformContext::getProcAddress(const char *procName)
{ "glTexBuffer", (QFunctionPointer) ::glTexBuffer },
{ "glTexBufferRange", (QFunctionPointer) ::glTexBufferRange },
{ "glTexStorage3DMultisample", (QFunctionPointer) ::glTexStorage3DMultisample },
-#endif // QT_OPENGL_ES_3_2
+#endif // QT_CONFIG(opengles32)
};
for (size_t i = 0; i < sizeof(standardFuncs) / sizeof(StdFunc); ++i) {
diff --git a/src/platformsupport/eventdispatchers/.prev_CMakeLists.txt b/src/platformsupport/eventdispatchers/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..2e25d6cfd6
--- /dev/null
+++ b/src/platformsupport/eventdispatchers/.prev_CMakeLists.txt
@@ -0,0 +1,42 @@
+# Generated from eventdispatchers.pro.
+
+#####################################################################
+## EventDispatcherSupport Module:
+#####################################################################
+
+qt_add_module(EventDispatcherSupport
+ STATIC
+ INTERNAL_MODULE
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:eventdispatchers.pro:<TRUE>:
+# MODULE = "eventdispatcher_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(EventDispatcherSupport CONDITION UNIX
+ SOURCES
+ qgenericunixeventdispatcher.cpp qgenericunixeventdispatcher_p.h
+ qunixeventdispatcher.cpp
+ qunixeventdispatcher_qpa_p.h
+)
+
+qt_extend_target(EventDispatcherSupport CONDITION WIN32
+ SOURCES
+ qwindowsguieventdispatcher.cpp qwindowsguieventdispatcher_p.h
+)
+
+qt_extend_target(EventDispatcherSupport CONDITION QT_FEATURE_glib
+ SOURCES
+ qeventdispatcher_glib.cpp qeventdispatcher_glib_p.h
+ LIBRARIES
+ GLIB2::GLIB2
+)
diff --git a/src/platformsupport/eventdispatchers/CMakeLists.txt b/src/platformsupport/eventdispatchers/CMakeLists.txt
new file mode 100644
index 0000000000..72b873423b
--- /dev/null
+++ b/src/platformsupport/eventdispatchers/CMakeLists.txt
@@ -0,0 +1,44 @@
+# Generated from eventdispatchers.pro.
+
+qt_find_package(GLIB2) # special case
+
+#####################################################################
+## EventDispatcherSupport Module:
+#####################################################################
+
+qt_add_module(EventDispatcherSupport
+ STATIC
+ INTERNAL_MODULE
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:eventdispatchers.pro:<TRUE>:
+# MODULE = "eventdispatcher_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(EventDispatcherSupport CONDITION UNIX
+ SOURCES
+ qgenericunixeventdispatcher.cpp qgenericunixeventdispatcher_p.h
+ qunixeventdispatcher.cpp
+ qunixeventdispatcher_qpa_p.h
+)
+
+qt_extend_target(EventDispatcherSupport CONDITION WIN32
+ SOURCES
+ qwindowsguieventdispatcher.cpp qwindowsguieventdispatcher_p.h
+)
+
+qt_extend_target(EventDispatcherSupport CONDITION QT_FEATURE_glib
+ SOURCES
+ qeventdispatcher_glib.cpp qeventdispatcher_glib_p.h
+ LIBRARIES
+ GLIB2::GLIB2
+)
diff --git a/src/platformsupport/fbconvenience/CMakeLists.txt b/src/platformsupport/fbconvenience/CMakeLists.txt
new file mode 100644
index 0000000000..804b2c15ec
--- /dev/null
+++ b/src/platformsupport/fbconvenience/CMakeLists.txt
@@ -0,0 +1,26 @@
+# Generated from fbconvenience.pro.
+
+#####################################################################
+## FbSupport Module:
+#####################################################################
+
+qt_add_module(FbSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qfbbackingstore.cpp qfbbackingstore_p.h
+ qfbcursor.cpp qfbcursor_p.h
+ qfbscreen.cpp qfbscreen_p.h
+ qfbvthandler.cpp qfbvthandler_p.h
+ qfbwindow.cpp qfbwindow_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:fbconvenience.pro:<TRUE>:
+# MODULE = "fb_support"
diff --git a/src/platformsupport/fontdatabases/.prev_CMakeLists.txt b/src/platformsupport/fontdatabases/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..b30b04824a
--- /dev/null
+++ b/src/platformsupport/fontdatabases/.prev_CMakeLists.txt
@@ -0,0 +1,136 @@
+# Generated from fontdatabases.pro.
+
+#####################################################################
+## FontDatabaseSupport Module:
+#####################################################################
+
+qt_add_module(FontDatabaseSupport
+ STATIC
+ INTERNAL_MODULE
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:fontdatabases.pro:<TRUE>:
+# MODULE = "fontdatabase_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(FontDatabaseSupport CONDITION APPLE
+ SOURCES
+ mac/qcoretextfontdatabase.mm mac/qcoretextfontdatabase_p.h
+ mac/qfontengine_coretext.mm mac/qfontengine_coretext_p.h
+ LIBRARIES
+ ${FWCoreFoundation}
+ ${FWCoreGraphics}
+ ${FWCoreText}
+ ${FWFoundation}
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION MACOS
+ LIBRARIES
+ ${FWAppKit}
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION APPLE AND NOT MACOS
+ LIBRARIES
+ ${FWUIKit}
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_freetype
+ SOURCES
+ freetype/qfontengine_ft.cpp freetype/qfontengine_ft_p.h
+ freetype/qfreetypefontdatabase.cpp freetype/qfreetypefontdatabase_p.h
+ LIBRARIES
+ WrapFreetype::WrapFreetype
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION UNIX
+ SOURCES
+ genericunix/qgenericunixfontdatabase_p.h
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_fontconfig
+ SOURCES
+ fontconfig/qfontconfigdatabase.cpp fontconfig/qfontconfigdatabase_p.h
+ fontconfig/qfontenginemultifontconfig.cpp fontconfig/qfontenginemultifontconfig_p.h
+ LIBRARIES
+ Fontconfig::Fontconfig
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION WIN32 AND NOT WINRT
+ SOURCES
+ windows/qwindowsfontdatabase.cpp windows/qwindowsfontdatabase_p.h
+ windows/qwindowsfontdatabasebase.cpp windows/qwindowsfontdatabasebase_p.h
+ windows/qwindowsfontengine.cpp windows/qwindowsfontengine_p.h
+ windows/qwindowsnativeimage.cpp windows/qwindowsnativeimage_p.h
+ LIBRARIES
+ advapi32
+ gdi32
+ ole32
+ user32
+ PUBLIC_LIBRARIES
+ Qt::GuiPrivate
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_freetype AND WIN32 AND NOT WINRT
+ SOURCES
+ windows/qwindowsfontdatabase_ft.cpp windows/qwindowsfontdatabase_ft_p.h
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_direct2d AND QT_FEATURE_directwrite AND WIN32 AND NOT WINRT
+ SOURCES
+ windows/qwindowsfontenginedirectwrite.cpp windows/qwindowsfontenginedirectwrite_p.h
+ LIBRARIES
+ d2d1
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_direct2d AND QT_FEATURE_directwrite AND QT_FEATURE_directwrite3 AND WIN32 AND NOT WINRT
+ SOURCES
+ windows/qwindowsdirectwritefontdatabase.cpp windows/qwindowsdirectwritefontdatabase_p.h
+ DEFINES
+ QT_USE_DIRECTWRITE2
+ QT_USE_DIRECTWRITE3
+ LIBRARIES
+ dwrite_3
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_direct2d AND QT_FEATURE_directwrite AND QT_FEATURE_directwrite2 AND WIN32 AND NOT QT_FEATURE_directwrite3 AND NOT WINRT
+ DEFINES
+ QT_USE_DIRECTWRITE2
+ LIBRARIES
+ dwrite_2
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_direct2d AND QT_FEATURE_directwrite AND WIN32 AND NOT QT_FEATURE_directwrite2 AND NOT QT_FEATURE_directwrite3 AND NOT WINRT
+ LIBRARIES
+ dwrite
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION WIN32 AND NOT WINRT AND (NOT QT_FEATURE_direct2d OR NOT QT_FEATURE_directwrite)
+ DEFINES
+ QT_NO_DIRECTWRITE
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION WIN32 AND mingw AND NOT WINRT
+ LIBRARIES
+ uuid
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION WINRT
+ SOURCES
+ winrt/qwinrtfontdatabase.cpp winrt/qwinrtfontdatabase_p.h
+ DEFINES
+ __WRL_NO_DEFAULT_LIB__
+ LIBRARIES
+ dwrite_1
+ ws2_32
+ PUBLIC_LIBRARIES
+ Qt::GuiPrivate
+)
diff --git a/src/platformsupport/fontdatabases/CMakeLists.txt b/src/platformsupport/fontdatabases/CMakeLists.txt
new file mode 100644
index 0000000000..46919116da
--- /dev/null
+++ b/src/platformsupport/fontdatabases/CMakeLists.txt
@@ -0,0 +1,139 @@
+# Generated from fontdatabases.pro.
+
+qt_find_package(WrapFreetype PROVIDED_TARGETS WrapFreetype::WrapFreetype) # special case
+qt_find_package(Fontconfig) # special case
+
+#####################################################################
+## FontDatabaseSupport Module:
+#####################################################################
+
+qt_add_module(FontDatabaseSupport
+ STATIC
+ INTERNAL_MODULE
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:fontdatabases.pro:<TRUE>:
+# MODULE = "fontdatabase_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(FontDatabaseSupport CONDITION APPLE
+ SOURCES
+ mac/qcoretextfontdatabase.mm mac/qcoretextfontdatabase_p.h
+ mac/qfontengine_coretext.mm mac/qfontengine_coretext_p.h
+ LIBRARIES
+ ${FWCoreFoundation}
+ ${FWCoreGraphics}
+ ${FWCoreText}
+ ${FWFoundation}
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION MACOS
+ LIBRARIES
+ ${FWAppKit}
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION APPLE AND NOT MACOS
+ LIBRARIES
+ ${FWUIKit}
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_freetype
+ SOURCES
+ freetype/qfontengine_ft.cpp freetype/qfontengine_ft_p.h
+ freetype/qfreetypefontdatabase.cpp freetype/qfreetypefontdatabase_p.h
+ LIBRARIES
+ WrapFreetype::WrapFreetype
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION UNIX
+ SOURCES
+ genericunix/qgenericunixfontdatabase_p.h
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_fontconfig
+ SOURCES
+ fontconfig/qfontconfigdatabase.cpp fontconfig/qfontconfigdatabase_p.h
+ fontconfig/qfontenginemultifontconfig.cpp fontconfig/qfontenginemultifontconfig_p.h
+ LIBRARIES
+ Fontconfig::Fontconfig
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION WIN32 AND NOT WINRT
+ SOURCES
+ windows/qwindowsfontdatabase.cpp windows/qwindowsfontdatabase_p.h
+ windows/qwindowsfontdatabasebase.cpp windows/qwindowsfontdatabasebase_p.h
+ windows/qwindowsfontengine.cpp windows/qwindowsfontengine_p.h
+ windows/qwindowsnativeimage.cpp windows/qwindowsnativeimage_p.h
+ LIBRARIES
+ advapi32
+ gdi32
+ ole32
+ user32
+ PUBLIC_LIBRARIES
+ Qt::GuiPrivate
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_freetype AND WIN32 AND NOT WINRT
+ SOURCES
+ windows/qwindowsfontdatabase_ft.cpp windows/qwindowsfontdatabase_ft_p.h
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_direct2d AND QT_FEATURE_directwrite AND WIN32 AND NOT WINRT
+ SOURCES
+ windows/qwindowsfontenginedirectwrite.cpp windows/qwindowsfontenginedirectwrite_p.h
+ LIBRARIES
+ d2d1
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_direct2d AND QT_FEATURE_directwrite AND QT_FEATURE_directwrite3 AND WIN32 AND NOT WINRT
+ SOURCES
+ windows/qwindowsdirectwritefontdatabase.cpp windows/qwindowsdirectwritefontdatabase_p.h
+ DEFINES
+ QT_USE_DIRECTWRITE2
+ QT_USE_DIRECTWRITE3
+ LIBRARIES
+ dwrite_3
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_direct2d AND QT_FEATURE_directwrite AND QT_FEATURE_directwrite2 AND WIN32 AND NOT QT_FEATURE_directwrite3 AND NOT WINRT
+ DEFINES
+ QT_USE_DIRECTWRITE2
+ LIBRARIES
+ dwrite_2
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION QT_FEATURE_direct2d AND QT_FEATURE_directwrite AND WIN32 AND NOT QT_FEATURE_directwrite2 AND NOT QT_FEATURE_directwrite3 AND NOT WINRT
+ LIBRARIES
+ dwrite
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION WIN32 AND NOT WINRT AND (NOT QT_FEATURE_direct2d OR NOT QT_FEATURE_directwrite)
+ DEFINES
+ QT_NO_DIRECTWRITE
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION WIN32 AND mingw AND NOT WINRT
+ LIBRARIES
+ uuid
+)
+
+qt_extend_target(FontDatabaseSupport CONDITION WINRT
+ SOURCES
+ winrt/qwinrtfontdatabase.cpp winrt/qwinrtfontdatabase_p.h
+ DEFINES
+ __WRL_NO_DEFAULT_LIB__
+ LIBRARIES
+ dwrite_1
+ ws2_32
+ PUBLIC_LIBRARIES
+ Qt::GuiPrivate
+)
diff --git a/src/3rdparty/harfbuzz/NEWS b/src/platformsupport/fontdatabases/fake.cpp
index e69de29bb2..e69de29bb2 100644
--- a/src/3rdparty/harfbuzz/NEWS
+++ b/src/platformsupport/fontdatabases/fake.cpp
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
index 0d4bc288ea..7cf91b996b 100644
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
@@ -396,7 +396,7 @@ static inline bool requiresOpenType(int writingSystem)
|| writingSystem == QFontDatabase::Khmer || writingSystem == QFontDatabase::Nko);
}
-static void populateFromPattern(FcPattern *pattern)
+static void populateFromPattern(FcPattern *pattern, QFontDatabasePrivate::ApplicationFont *applicationFont = nullptr)
{
QString familyName;
QString familyNameLang;
@@ -506,6 +506,18 @@ static void populateFromPattern(FcPattern *pattern)
// Note: stretch should really be an int but registerFont incorrectly uses an enum
QFont::Stretch stretch = QFont::Stretch(stretchFromFcWidth(width_value));
QString styleName = style_value ? QString::fromUtf8((const char *) style_value) : QString();
+
+ if (applicationFont != nullptr) {
+ QFontDatabasePrivate::ApplicationFont::Properties properties;
+ properties.familyName = familyName;
+ properties.styleName = styleName;
+ properties.weight = weight;
+ properties.style = style;
+ properties.stretch = stretch;
+
+ applicationFont->properties.append(properties);
+ }
+
QPlatformFontDatabase::registerFont(familyName,styleName,QLatin1String((const char *)foundry_value),weight,style,stretch,antialias,scalable,pixel_size,fixedPitch,writingSystems,fontFile);
// qDebug() << familyName << (const char *)foundry_value << weight << style << &writingSystems << scalable << true << pixel_size;
@@ -527,6 +539,16 @@ static void populateFromPattern(FcPattern *pattern)
altFamilyNameLang = familyNameLang;
if (familyNameLang == altFamilyNameLang && altStyleName != styleName) {
+ if (applicationFont != nullptr) {
+ QFontDatabasePrivate::ApplicationFont::Properties properties;
+ properties.familyName = altFamilyName;
+ properties.styleName = altStyleName;
+ properties.weight = weight;
+ properties.style = style;
+ properties.stretch = stretch;
+
+ applicationFont->properties.append(properties);
+ }
FontFile *altFontFile = new FontFile(*fontFile);
QPlatformFontDatabase::registerFont(altFamilyName, altStyleName, QLatin1String((const char *)foundry_value),weight,style,stretch,antialias,scalable,pixel_size,fixedPitch,writingSystems,altFontFile);
} else {
@@ -831,10 +853,13 @@ static FcPattern *queryFont(const FcChar8 *file, const QByteArray &data, int id,
#endif
}
-QStringList QFontconfigDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
+QStringList QFontconfigDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont)
{
QStringList families;
+ if (applicationFont != nullptr)
+ applicationFont->properties.clear();
+
FcFontSet *set = FcConfigGetFonts(nullptr, FcSetApplication);
if (!set) {
FcConfigAppFontAddFile(nullptr, (const FcChar8 *)":/non-existent");
@@ -859,7 +884,7 @@ QStringList QFontconfigDatabase::addApplicationFont(const QByteArray &fontData,
QString family = QString::fromUtf8(reinterpret_cast<const char *>(fam));
families << family;
}
- populateFromPattern(pattern);
+ populateFromPattern(pattern, applicationFont);
FcFontSetAdd(set, pattern);
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h
index a7257c2f98..78e2a4f988 100644
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h
@@ -67,7 +67,7 @@ public:
QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) override;
QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) override;
QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const override;
- QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName) override;
+ QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont = nullptr) override;
QString resolveFontFamilyAlias(const QString &family) const override;
QFont defaultFont() const override;
diff --git a/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp b/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
index 7e83bcad07..d38fa299f9 100644
--- a/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
+++ b/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
@@ -1358,50 +1358,65 @@ static inline FT_Matrix QTransformToFTMatrix(const QTransform &matrix)
return m;
}
-QFontEngineFT::QGlyphSet *QFontEngineFT::loadGlyphSet(const QTransform &matrix)
+QFontEngineFT::QGlyphSet *QFontEngineFT::TransformedGlyphSets::findSet(const QTransform &matrix, const QFontDef &fontDef)
{
- if (matrix.type() > QTransform::TxShear || !cacheEnabled)
- return nullptr;
-
- // FT_Set_Transform only supports scalable fonts
- if (!FT_IS_SCALABLE(freetype->face))
- return matrix.type() <= QTransform::TxTranslate ? &defaultGlyphSet : nullptr;
-
FT_Matrix m = QTransformToFTMatrix(matrix);
- QGlyphSet *gs = nullptr;
-
- for (int i = 0; i < transformedGlyphSets.count(); ++i) {
- const QGlyphSet &g = transformedGlyphSets.at(i);
- if (g.transformationMatrix.xx == m.xx
- && g.transformationMatrix.xy == m.xy
- && g.transformationMatrix.yx == m.yx
- && g.transformationMatrix.yy == m.yy) {
+ int i = 0;
+ for (; i < nSets; ++i) {
+ QGlyphSet *g = sets[i];
+ if (!g)
+ break;
+ if (g->transformationMatrix.xx == m.xx
+ && g->transformationMatrix.xy == m.xy
+ && g->transformationMatrix.yx == m.yx
+ && g->transformationMatrix.yy == m.yy) {
// found a match, move it to the front
- transformedGlyphSets.move(i, 0);
- gs = &transformedGlyphSets[0];
- break;
+ moveToFront(i);
+ return g;
}
}
- if (!gs) {
- // don't cache more than 10 transformations
- if (transformedGlyphSets.count() >= 10) {
- transformedGlyphSets.move(transformedGlyphSets.size() - 1, 0);
- } else {
- transformedGlyphSets.prepend(QGlyphSet());
- }
- gs = &transformedGlyphSets[0];
- gs->clear();
- gs->transformationMatrix = m;
- gs->outline_drawing = fontDef.pixelSize * fontDef.pixelSize * qAbs(matrix.determinant()) > QT_MAX_CACHED_GLYPH_SIZE * QT_MAX_CACHED_GLYPH_SIZE;
- }
+ // don't cache more than nSets transformations
+ if (i == nSets)
+ // reuse the last set
+ --i;
+ moveToFront(nSets - 1);
+ if (!sets[0])
+ sets[0] = new QGlyphSet;
+ QGlyphSet *gs = sets[0];
+ gs->clear();
+ gs->transformationMatrix = m;
+ gs->outline_drawing = fontDef.pixelSize * fontDef.pixelSize * qAbs(matrix.determinant()) > QT_MAX_CACHED_GLYPH_SIZE * QT_MAX_CACHED_GLYPH_SIZE;
Q_ASSERT(gs != nullptr);
return gs;
}
+void QFontEngineFT::TransformedGlyphSets::moveToFront(int i)
+{
+ QGlyphSet *g = sets[i];
+ while (i > 0) {
+ sets[i] = sets[i - 1];
+ --i;
+ }
+ sets[0] = g;
+}
+
+
+QFontEngineFT::QGlyphSet *QFontEngineFT::loadGlyphSet(const QTransform &matrix)
+{
+ if (matrix.type() > QTransform::TxShear || !cacheEnabled)
+ return 0;
+
+ // FT_Set_Transform only supports scalable fonts
+ if (!FT_IS_SCALABLE(freetype->face))
+ return matrix.type() <= QTransform::TxTranslate ? &defaultGlyphSet : nullptr;
+
+ return transformedGlyphSets.findSet(matrix, fontDef);
+}
+
void QFontEngineFT::getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics)
{
FT_Face face = lockFace(Unscaled);
diff --git a/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h b/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
index 2e3aef6979..0e719c7457 100644
--- a/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
+++ b/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
@@ -63,6 +63,8 @@
#include <qmutex.h>
+#include <string.h>
+
QT_BEGIN_NAMESPACE
class QFontEngineFTRawFont;
@@ -170,6 +172,7 @@ public:
inline bool isGlyphMissing(glyph_t index) const { return missing_glyphs.contains(index); }
inline void setGlyphMissing(glyph_t index) const { missing_glyphs.insert(index); }
private:
+ Q_DISABLE_COPY(QGlyphSet);
mutable QHash<GlyphAndSubPixelPosition, Glyph *> glyph_data; // maps from glyph index to glyph data
mutable QSet<glyph_t> missing_glyphs;
mutable Glyph *fast_glyph_data[256]; // for fast lookup of glyphs < 256
@@ -310,7 +313,18 @@ private:
GlyphFormat defaultFormat;
FT_Matrix matrix;
- QList<QGlyphSet> transformedGlyphSets;
+ struct TransformedGlyphSets {
+ enum { nSets = 10 };
+ QGlyphSet *sets[nSets];
+
+ QGlyphSet *findSet(const QTransform &matrix, const QFontDef &fontDef);
+ TransformedGlyphSets() { std::fill(&sets[0], &sets[nSets], nullptr); }
+ ~TransformedGlyphSets() { qDeleteAll(&sets[0], &sets[nSets]); }
+ private:
+ void moveToFront(int i);
+ Q_DISABLE_COPY(TransformedGlyphSets);
+ };
+ TransformedGlyphSets transformedGlyphSets;
mutable QGlyphSet defaultGlyphSet;
QFontEngine::FaceId face_id;
@@ -326,7 +340,10 @@ private:
QFixed scalableBitmapScaleFactor;
};
-inline uint qHash(const QFontEngineFT::GlyphAndSubPixelPosition &g)
+Q_DECLARE_TYPEINFO(QFontEngineFT::QGlyphSet, Q_MOVABLE_TYPE);
+
+
+inline size_t qHash(const QFontEngineFT::GlyphAndSubPixelPosition &g)
{
return (g.glyph << 8) | (g.subPixelPosition * 10).round().toInt();
}
diff --git a/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp b/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp
index 25c10fbd3c..1ec42ac36a 100644
--- a/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp
+++ b/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp
@@ -98,9 +98,9 @@ QFontEngine *QFreeTypeFontDatabase::fontEngine(const QByteArray &fontData, qreal
return QFontEngineFT::create(fontData, pixelSize, hintingPreference);
}
-QStringList QFreeTypeFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
+QStringList QFreeTypeFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont)
{
- return QFreeTypeFontDatabase::addTTFile(fontData, fileName.toLocal8Bit());
+ return QFreeTypeFontDatabase::addTTFile(fontData, fileName.toLocal8Bit(), applicationFont);
}
void QFreeTypeFontDatabase::releaseHandle(void *handle)
@@ -111,7 +111,7 @@ void QFreeTypeFontDatabase::releaseHandle(void *handle)
extern FT_Library qt_getFreetype();
-QStringList QFreeTypeFontDatabase::addTTFile(const QByteArray &fontData, const QByteArray &file)
+QStringList QFreeTypeFontDatabase::addTTFile(const QByteArray &fontData, const QByteArray &file, QFontDatabasePrivate::ApplicationFont *applicationFont)
{
FT_Library library = qt_getFreetype();
@@ -199,9 +199,20 @@ QStringList QFreeTypeFontDatabase::addTTFile(const QByteArray &fontData, const Q
fontFile->indexValue = index;
QFont::Stretch stretch = QFont::Unstretched;
+ QString styleName = QString::fromLatin1(face->style_name);
- registerFont(family,QString::fromLatin1(face->style_name),QString(),weight,style,stretch,true,true,0,fixedPitch,writingSystems,fontFile);
+ if (applicationFont != nullptr) {
+ QFontDatabasePrivate::ApplicationFont::Properties properties;
+ properties.familyName = family;
+ properties.styleName = styleName;
+ properties.weight = weight;
+ properties.stretch = stretch;
+ properties.style = style;
+ applicationFont->properties.append(properties);
+ }
+
+ registerFont(family, styleName, QString(), weight, style, stretch, true, true, 0, fixedPitch, writingSystems, fontFile);
families.append(family);
FT_Done_Face(face);
diff --git a/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase_p.h b/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase_p.h
index 0b2956b16e..75e799df3f 100644
--- a/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase_p.h
+++ b/src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase_p.h
@@ -69,10 +69,10 @@ public:
void populateFontDatabase() override;
QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) override;
QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) override;
- QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName) override;
+ QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont = nullptr) override;
void releaseHandle(void *handle) override;
- static QStringList addTTFile(const QByteArray &fontData, const QByteArray &file);
+ static QStringList addTTFile(const QByteArray &fontData, const QByteArray &file, QFontDatabasePrivate::ApplicationFont *applicationFont = nullptr);
};
QT_END_NAMESPACE
diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
index bf986aab77..664e532d7c 100644
--- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
+++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
@@ -268,17 +268,7 @@ static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd)
Q_UNREACHABLE();
Q_ASSERT(length >= 86);
}
- quint32 unicodeRange[4] = {
- qFromBigEndian<quint32>(os2Table.data() + 42),
- qFromBigEndian<quint32>(os2Table.data() + 46),
- qFromBigEndian<quint32>(os2Table.data() + 50),
- qFromBigEndian<quint32>(os2Table.data() + 54)
- };
- quint32 codePageRange[2] = {
- qFromBigEndian<quint32>(os2Table.data() + 78),
- qFromBigEndian<quint32>(os2Table.data() + 82)
- };
- fd->writingSystems = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange);
+ fd->writingSystems = QPlatformFontDatabase::writingSystemsFromOS2Table(reinterpret_cast<const char *>(os2Table.data()), length);
}
}
@@ -332,7 +322,7 @@ static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd)
}
}
-void QCoreTextFontDatabase::populateFromDescriptor(CTFontDescriptorRef font, const QString &familyName)
+void QCoreTextFontDatabase::populateFromDescriptor(CTFontDescriptorRef font, const QString &familyName, QFontDatabasePrivate::ApplicationFont *applicationFont)
{
FontDescription fd;
getFontDescription(font, &fd);
@@ -342,6 +332,17 @@ void QCoreTextFontDatabase::populateFromDescriptor(CTFontDescriptorRef font, con
// fonts if a font family does not have any fonts available on the system.
QString family = !familyName.isNull() ? familyName : static_cast<QString>(fd.familyName);
+ if (applicationFont != nullptr) {
+ QFontDatabasePrivate::ApplicationFont::Properties properties;
+ properties.familyName = family;
+ properties.styleName = fd.styleName;
+ properties.weight = fd.weight;
+ properties.stretch = fd.stretch;
+ properties.style = fd.style;
+
+ applicationFont->properties.append(properties);
+ }
+
CFRetain(font);
QPlatformFontDatabase::registerFont(family, fd.styleName, fd.foundryName, fd.weight, fd.style, fd.stretch,
true /* antialiased */, true /* scalable */, 0 /* pixelSize, ignored as font is scalable */,
@@ -580,7 +581,7 @@ QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFo
return fallbackList;
}
-QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
+QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont)
{
QCFType<CFArrayRef> fonts;
@@ -607,7 +608,7 @@ QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData
const int numFonts = CFArrayGetCount(fonts);
for (int i = 0; i < numFonts; ++i) {
CTFontDescriptorRef fontDescriptor = CTFontDescriptorRef(CFArrayGetValueAtIndex(fonts, i));
- populateFromDescriptor(fontDescriptor);
+ populateFromDescriptor(fontDescriptor, QString(), applicationFont);
QCFType<CFStringRef> familyName = CFStringRef(CTFontDescriptorCopyAttribute(fontDescriptor, kCTFontFamilyNameAttribute));
families.append(QString::fromCFString(familyName));
}
diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
index eebb3eb964..63419f75a9 100644
--- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
+++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
@@ -76,7 +76,7 @@ public:
void invalidate() override;
QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const override;
- QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName) override;
+ QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont = nullptr) override;
void releaseHandle(void *handle) override;
bool isPrivateFontFamily(const QString &family) const override;
QFont defaultFont() const override;
@@ -91,7 +91,7 @@ protected:
mutable QSet<CTFontDescriptorRef> m_systemFontDescriptors;
private:
- void populateFromDescriptor(CTFontDescriptorRef font, const QString &familyName = QString());
+ void populateFromDescriptor(CTFontDescriptorRef font, const QString &familyName = QString(), QFontDatabasePrivate::ApplicationFont *applicationFont = nullptr);
static CFArrayRef fallbacksForFamily(const QString &family);
mutable QString defaultFontName;
diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
index 115b13d60d..2437051274 100644
--- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
+++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
@@ -282,11 +282,6 @@ void QCoreTextFontEngine::init()
cache_cost = (CTFontGetAscent(ctfont) + CTFontGetDescent(ctfont)) * avgCharWidth.toInt() * 2000;
- // HACK hb_coretext requires both CTFont and CGFont but user_data is only void*
- Q_ASSERT((void *)(&ctfont + 1) == (void *)&cgFont);
- faceData.user_data = &ctfont;
- faceData.get_font_table = ct_getSfntTable;
-
kerningPairsLoaded = false;
}
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsdirectwritefontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsdirectwritefontdatabase.cpp
new file mode 100644
index 0000000000..d2fb909dea
--- /dev/null
+++ b/src/platformsupport/fontdatabases/windows/qwindowsdirectwritefontdatabase.cpp
@@ -0,0 +1,478 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwindowsdirectwritefontdatabase_p.h"
+#include "qwindowsfontenginedirectwrite_p.h"
+#include "qwindowsfontdatabase_p.h"
+
+#include <QtCore/qendian.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qstringbuilder.h>
+#include <QtCore/qvarlengtharray.h>
+
+#include <dwrite_3.h>
+#include <d2d1.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifdef QT_USE_DIRECTWRITE3
+
+// Defined in gui/text/qfontdatabase.cpp
+Q_GUI_EXPORT QFontDatabase::WritingSystem qt_writing_system_for_script(int script);
+
+QWindowsDirectWriteFontDatabase::QWindowsDirectWriteFontDatabase()
+{
+ qCDebug(lcQpaFonts) << "Creating DirectWrite database";
+}
+
+QWindowsDirectWriteFontDatabase::~QWindowsDirectWriteFontDatabase()
+{
+ for (auto it = m_populatedFonts.begin(); it != m_populatedFonts.end(); ++it)
+ it.value()->Release();
+}
+
+QString QWindowsDirectWriteFontDatabase::localeString(IDWriteLocalizedStrings *names,
+ wchar_t localeName[])
+{
+ uint index;
+ BOOL exists;
+ if (SUCCEEDED(names->FindLocaleName(localeName, &index, &exists)) && exists) {
+ uint length;
+ if (SUCCEEDED(names->GetStringLength(index, &length)) && length > 0) {
+ QVarLengthArray<wchar_t> buffer(int(length) + 1);
+ if (SUCCEEDED(names->GetString(index, buffer.data(), length + 1)))
+ return QString::fromWCharArray(buffer.data());
+ }
+ }
+
+ return QString();
+}
+
+static QFont::Stretch fromDirectWriteStretch(DWRITE_FONT_STRETCH stretch)
+{
+ switch (stretch) {
+ case DWRITE_FONT_STRETCH_ULTRA_CONDENSED: return QFont::UltraCondensed;
+ case DWRITE_FONT_STRETCH_EXTRA_CONDENSED: return QFont::ExtraCondensed;
+ case DWRITE_FONT_STRETCH_CONDENSED: return QFont::Condensed;
+ case DWRITE_FONT_STRETCH_SEMI_CONDENSED: return QFont::SemiCondensed;
+ case DWRITE_FONT_STRETCH_NORMAL: return QFont::Unstretched;
+ case DWRITE_FONT_STRETCH_SEMI_EXPANDED: return QFont::SemiExpanded;
+ case DWRITE_FONT_STRETCH_EXPANDED: return QFont::Expanded;
+ case DWRITE_FONT_STRETCH_EXTRA_EXPANDED: return QFont::ExtraExpanded;
+ case DWRITE_FONT_STRETCH_ULTRA_EXPANDED: return QFont::UltraExpanded;
+ default: return QFont::AnyStretch;
+ }
+}
+
+static QFont::Weight fromDirectWriteWeight(DWRITE_FONT_WEIGHT weight)
+{
+ return QPlatformFontDatabase::weightFromInteger(int(weight));
+}
+
+static DWRITE_FONT_STYLE toDirectWriteStyle(QFont::Style style)
+{
+ switch (style) {
+ case QFont::StyleNormal: return DWRITE_FONT_STYLE_NORMAL;
+ case QFont::StyleOblique: return DWRITE_FONT_STYLE_OBLIQUE;
+ case QFont::StyleItalic: return DWRITE_FONT_STYLE_ITALIC;
+ default: return DWRITE_FONT_STYLE_NORMAL;
+ }
+}
+
+static QFont::Style fromDirectWriteStyle(DWRITE_FONT_STYLE style)
+{
+ switch (style) {
+ case DWRITE_FONT_STYLE_NORMAL: return QFont::StyleNormal;
+ case DWRITE_FONT_STYLE_OBLIQUE: return QFont::StyleOblique;
+ case DWRITE_FONT_STYLE_ITALIC: return QFont::StyleItalic;
+ default: return QFont::StyleNormal;
+ }
+}
+
+void QWindowsDirectWriteFontDatabase::populateFamily(const QString &familyName)
+{
+ auto it = m_populatedFonts.find(familyName);
+ IDWriteFontFamily *fontFamily = it != m_populatedFonts.end() ? it.value() : nullptr;
+ if (fontFamily == nullptr) {
+ qCWarning(lcQpaFonts) << "Cannot find" << familyName << "in list of fonts";
+ return;
+ }
+
+ qCDebug(lcQpaFonts) << "Populate family:" << familyName;
+
+ wchar_t defaultLocale[LOCALE_NAME_MAX_LENGTH];
+ bool hasDefaultLocale = GetUserDefaultLocaleName(defaultLocale, LOCALE_NAME_MAX_LENGTH) != 0;
+ wchar_t englishLocale[] = L"en-us";
+
+ static const int SMOOTH_SCALABLE = 0xffff;
+ const QString foundryName; // No such concept.
+ const bool scalable = true;
+ const bool antialias = false;
+ const int size = SMOOTH_SCALABLE;
+
+ IDWriteFontList *matchingFonts;
+ if (SUCCEEDED(fontFamily->GetMatchingFonts(DWRITE_FONT_WEIGHT_REGULAR,
+ DWRITE_FONT_STRETCH_NORMAL,
+ DWRITE_FONT_STYLE_NORMAL,
+ &matchingFonts))) {
+ for (uint j = 0; j < matchingFonts->GetFontCount(); ++j) {
+ IDWriteFont *font;
+ if (SUCCEEDED(matchingFonts->GetFont(j, &font))) {
+ IDWriteFont1 *font1 = nullptr;
+ if (!SUCCEEDED(font->QueryInterface(__uuidof(IDWriteFont1),
+ reinterpret_cast<void **>(&font1)))) {
+ qCWarning(lcQpaFonts) << "COM object does not support IDWriteFont1";
+ continue;
+ }
+
+ QString defaultLocaleFamilyName;
+ QString englishLocaleFamilyName;
+
+ IDWriteFontFamily *fontFamily2;
+ if (SUCCEEDED(font1->GetFontFamily(&fontFamily2))) {
+ IDWriteLocalizedStrings *names;
+ if (SUCCEEDED(fontFamily2->GetFamilyNames(&names))) {
+ defaultLocaleFamilyName = hasDefaultLocale ? localeString(names, defaultLocale) : QString();
+ englishLocaleFamilyName = localeString(names, englishLocale);
+
+ names->Release();
+ }
+
+ fontFamily2->Release();
+ }
+
+ if (defaultLocaleFamilyName.isEmpty() && englishLocaleFamilyName.isEmpty())
+ englishLocaleFamilyName = familyName;
+
+ {
+ IDWriteLocalizedStrings *names;
+ if (SUCCEEDED(font1->GetFaceNames(&names))) {
+ QString defaultLocaleStyleName = hasDefaultLocale ? localeString(names, defaultLocale) : QString();
+ QString englishLocaleStyleName = localeString(names, englishLocale);
+
+ QFont::Stretch stretch = fromDirectWriteStretch(font1->GetStretch());
+ QFont::Style style = fromDirectWriteStyle(font1->GetStyle());
+ QFont::Weight weight = fromDirectWriteWeight(font1->GetWeight());
+ bool fixed = font1->IsMonospacedFont();
+
+ qCDebug(lcQpaFonts) << "Family" << familyName << "has english variant" << englishLocaleStyleName << ", in default locale:" << defaultLocaleStyleName << stretch << style << weight << fixed;
+
+ IDWriteFontFace *face = nullptr;
+ if (SUCCEEDED(font->CreateFontFace(&face))) {
+ QSupportedWritingSystems writingSystems;
+
+ const void *tableData = nullptr;
+ UINT32 tableSize;
+ void *tableContext = nullptr;
+ BOOL exists;
+ HRESULT hr = face->TryGetFontTable(qbswap<quint32>(MAKE_TAG('O','S','/','2')),
+ &tableData,
+ &tableSize,
+ &tableContext,
+ &exists);
+ if (SUCCEEDED(hr) && exists) {
+ writingSystems = QPlatformFontDatabase::writingSystemsFromOS2Table(reinterpret_cast<const char *>(tableData), tableSize);
+ } else { // Fall back to checking first character of each Unicode range in font (may include too many writing systems)
+ quint32 rangeCount;
+ hr = font1->GetUnicodeRanges(0, nullptr, &rangeCount);
+
+ if (rangeCount > 0) {
+ QVarLengthArray<DWRITE_UNICODE_RANGE, QChar::ScriptCount> ranges(rangeCount);
+
+ hr = font1->GetUnicodeRanges(rangeCount, ranges.data(), &rangeCount);
+ if (SUCCEEDED(hr)) {
+ for (uint i = 0; i < rangeCount; ++i) {
+ QChar::Script script = QChar::script(ranges.at(i).first);
+
+ QFontDatabase::WritingSystem writingSystem = qt_writing_system_for_script(script);
+
+ if (writingSystem > QFontDatabase::Any && writingSystem < QFontDatabase::WritingSystemsCount)
+ writingSystems.setSupported(writingSystem);
+ }
+ } else {
+ const QString errorString = qt_error_string(int(hr));
+ qCWarning(lcQpaFonts) << "Failed to get unicode ranges for font" << englishLocaleFamilyName << englishLocaleStyleName << ":" << errorString;
+ }
+ }
+ }
+
+ if (!englishLocaleStyleName.isEmpty() || defaultLocaleStyleName.isEmpty()) {
+ qCDebug(lcQpaFonts) << "Font" << englishLocaleFamilyName << englishLocaleStyleName << "supports writing systems:" << writingSystems;
+
+ QPlatformFontDatabase::registerFont(englishLocaleFamilyName, englishLocaleStyleName, QString(), weight, style, stretch, antialias, scalable, size, fixed, writingSystems, face);
+ face->AddRef();
+ }
+
+ if (!defaultLocaleFamilyName.isEmpty() && defaultLocaleFamilyName != englishLocaleFamilyName) {
+ QPlatformFontDatabase::registerFont(defaultLocaleFamilyName, defaultLocaleStyleName, QString(), weight, style, stretch, antialias, scalable, size, fixed, writingSystems, face);
+ face->AddRef();
+ }
+
+ face->Release();
+ }
+
+ names->Release();
+ }
+ }
+
+ font1->Release();
+ font->Release();
+ }
+ }
+
+ matchingFonts->Release();
+ }
+}
+
+QFontEngine *QWindowsDirectWriteFontDatabase::fontEngine(const QFontDef &fontDef, void *handle)
+{
+ IDWriteFontFace *face = reinterpret_cast<IDWriteFontFace *>(handle);
+ Q_ASSERT(face != nullptr);
+
+ QWindowsFontEngineDirectWrite *fontEngine = new QWindowsFontEngineDirectWrite(face, fontDef.pixelSize, data());
+ fontEngine->initFontInfo(fontDef, defaultVerticalDPI());
+
+ return fontEngine;
+}
+
+QStringList QWindowsDirectWriteFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
+{
+ QStringList result;
+ result.append(familyForStyleHint(styleHint));
+ result.append(extraTryFontsForFamily(family));
+ result.append(QPlatformFontDatabase::fallbacksForFamily(family, style, styleHint, script));
+
+ qCDebug(lcQpaFonts) << __FUNCTION__ << family << style << styleHint
+ << script << result;
+ return result;
+}
+
+QStringList QWindowsDirectWriteFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont)
+{
+ qCDebug(lcQpaFonts) << "Adding application font" << fileName;
+
+ QByteArray loadedData = fontData;
+ if (loadedData.isEmpty()) {
+ QFile file(fileName);
+ if (!file.open(QIODevice::ReadOnly)) {
+ qCWarning(lcQpaFonts) << "Cannot open" << fileName << "for reading.";
+ return QStringList();
+ }
+ loadedData = file.readAll();
+ }
+
+ IDWriteFontFace *face = createDirectWriteFace(loadedData);
+ if (face == nullptr) {
+ qCWarning(lcQpaFonts) << "Failed to create DirectWrite face from font data. Font may be unsupported.";
+ return QStringList();
+ }
+
+ wchar_t defaultLocale[LOCALE_NAME_MAX_LENGTH];
+ bool hasDefaultLocale = GetUserDefaultLocaleName(defaultLocale, LOCALE_NAME_MAX_LENGTH) != 0;
+ wchar_t englishLocale[] = L"en-us";
+
+ static const int SMOOTH_SCALABLE = 0xffff;
+ const QString foundryName; // No such concept.
+ const bool scalable = true;
+ const bool antialias = false;
+ const int size = SMOOTH_SCALABLE;
+
+ QSupportedWritingSystems writingSystems;
+ writingSystems.setSupported(QFontDatabase::Any);
+ writingSystems.setSupported(QFontDatabase::Latin);
+
+ QStringList ret;
+ IDWriteFontFace3 *face3 = nullptr;
+ if (SUCCEEDED(face->QueryInterface(__uuidof(IDWriteFontFace3),
+ reinterpret_cast<void **>(&face3)))) {
+ QString defaultLocaleFamilyName;
+ QString englishLocaleFamilyName;
+
+ IDWriteLocalizedStrings *names;
+ if (SUCCEEDED(face3->GetFamilyNames(&names))) {
+ defaultLocaleFamilyName = hasDefaultLocale ? localeString(names, defaultLocale) : QString();
+ englishLocaleFamilyName = localeString(names, englishLocale);
+
+ names->Release();
+ }
+
+ QString defaultLocaleStyleName;
+ QString englishLocaleStyleName;
+ if (SUCCEEDED(face3->GetFaceNames(&names))) {
+ defaultLocaleStyleName = hasDefaultLocale ? localeString(names, defaultLocale) : QString();
+ englishLocaleStyleName = localeString(names, englishLocale);
+
+ names->Release();
+ }
+
+ QFont::Stretch stretch = fromDirectWriteStretch(face3->GetStretch());
+ QFont::Style style = fromDirectWriteStyle(face3->GetStyle());
+ QFont::Weight weight = fromDirectWriteWeight(face3->GetWeight());
+ bool fixed = face3->IsMonospacedFont();
+
+ qCDebug(lcQpaFonts) << "\tFont names:" << englishLocaleFamilyName << ", " << defaultLocaleFamilyName
+ << ", style names:" << englishLocaleStyleName << ", " << defaultLocaleStyleName
+ << ", stretch:" << stretch
+ << ", style:" << style
+ << ", weight:" << weight
+ << ", fixed:" << fixed;
+
+ if (!englishLocaleFamilyName.isEmpty()) {
+ if (applicationFont != nullptr) {
+ QFontDatabasePrivate::ApplicationFont::Properties properties;
+ properties.style = style;
+ properties.weight = weight;
+ properties.familyName = englishLocaleFamilyName;
+ properties.styleName = englishLocaleStyleName;
+ applicationFont->properties.append(properties);
+ }
+
+ ret.append(englishLocaleFamilyName);
+ QPlatformFontDatabase::registerFont(englishLocaleFamilyName, englishLocaleStyleName, QString(), weight, style, stretch, antialias, scalable, size, fixed, writingSystems, face);
+ face->AddRef();
+ }
+
+ if (!defaultLocaleFamilyName.isEmpty() && defaultLocaleFamilyName != englishLocaleFamilyName) {
+ if (applicationFont != nullptr) {
+ QFontDatabasePrivate::ApplicationFont::Properties properties;
+ properties.style = style;
+ properties.weight = weight;
+ properties.familyName = englishLocaleFamilyName;
+ properties.styleName = englishLocaleStyleName;
+ applicationFont->properties.append(properties);
+ }
+
+ ret.append(defaultLocaleFamilyName);
+ QPlatformFontDatabase::registerFont(defaultLocaleFamilyName, defaultLocaleStyleName, QString(), weight, style, stretch, antialias, scalable, size, fixed, writingSystems, face);
+ face->AddRef();
+ }
+
+ face3->Release();
+ } else {
+ qCWarning(lcQpaFonts) << "Unable to query IDWriteFontFace3 interface from font face.";
+ }
+
+ face->Release();
+
+ return ret;
+}
+
+void QWindowsDirectWriteFontDatabase::releaseHandle(void *handle)
+{
+ IDWriteFontFace *face = reinterpret_cast<IDWriteFontFace *>(handle);
+ face->Release();
+}
+
+bool QWindowsDirectWriteFontDatabase::fontsAlwaysScalable() const
+{
+ return true;
+}
+
+bool QWindowsDirectWriteFontDatabase::isPrivateFontFamily(const QString &family) const
+{
+ Q_UNUSED(family);
+ return false;
+}
+
+void QWindowsDirectWriteFontDatabase::populateFontDatabase()
+{
+ wchar_t defaultLocale[LOCALE_NAME_MAX_LENGTH];
+ bool hasDefaultLocale = GetUserDefaultLocaleName(defaultLocale, LOCALE_NAME_MAX_LENGTH) != 0;
+ wchar_t englishLocale[] = L"en-us";
+
+ QString defaultFontName = defaultFont().family();
+ QString systemDefaultFontName = systemDefaultFont().family();
+
+ IDWriteFontCollection *fontCollection;
+ if (SUCCEEDED(data()->directWriteFactory->GetSystemFontCollection(&fontCollection))) {
+ for (uint i = 0; i < fontCollection->GetFontFamilyCount(); ++i) {
+ IDWriteFontFamily *fontFamily;
+ if (SUCCEEDED(fontCollection->GetFontFamily(i, &fontFamily))) {
+ QString defaultLocaleName;
+ QString englishLocaleName;
+
+ IDWriteLocalizedStrings *names;
+ if (SUCCEEDED(fontFamily->GetFamilyNames(&names))) {
+ if (hasDefaultLocale)
+ defaultLocaleName = localeString(names, defaultLocale);
+
+ englishLocaleName = localeString(names, englishLocale);
+ }
+
+ qCDebug(lcQpaFonts) << "Registering font, english name = " << englishLocaleName << ", name in current locale = " << defaultLocaleName;
+ if (!defaultLocaleName.isEmpty()) {
+ registerFontFamily(defaultLocaleName);
+ m_populatedFonts.insert(defaultLocaleName, fontFamily);
+ fontFamily->AddRef();
+
+ if (defaultLocaleName == defaultFontName && defaultFontName != systemDefaultFontName) {
+ qDebug(lcQpaFonts) << "Adding default font" << systemDefaultFontName << "as alternative to" << defaultLocaleName;
+
+ m_populatedFonts.insert(systemDefaultFontName, fontFamily);
+ fontFamily->AddRef();
+ }
+ }
+
+ if (!englishLocaleName.isEmpty() && englishLocaleName != defaultLocaleName) {
+ registerFontFamily(englishLocaleName);
+ m_populatedFonts.insert(englishLocaleName, fontFamily);
+ fontFamily->AddRef();
+
+ if (englishLocaleName == defaultFontName && defaultFontName != systemDefaultFontName) {
+ qDebug(lcQpaFonts) << "Adding default font" << systemDefaultFontName << "as alternative to" << englishLocaleName;
+
+ m_populatedFonts.insert(systemDefaultFontName, fontFamily);
+ fontFamily->AddRef();
+ }
+ }
+
+ fontFamily->Release();
+ }
+ }
+ }
+}
+
+QFont QWindowsDirectWriteFontDatabase::defaultFont() const
+{
+ return QFont(QStringLiteral("Segoe UI"));
+}
+
+#endif // QT_USE_DIRECTWRITE3
+
+QT_END_NAMESPACE
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsdirectwritefontdatabase_p.h b/src/platformsupport/fontdatabases/windows/qwindowsdirectwritefontdatabase_p.h
new file mode 100644
index 0000000000..f46c57e6a5
--- /dev/null
+++ b/src/platformsupport/fontdatabases/windows/qwindowsdirectwritefontdatabase_p.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWINDOWSDIRECTWRITEFONTDATABASE_P_H
+#define QWINDOWSDIRECTWRITEFONTDATABASE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qwindowsfontdatabasebase_p.h"
+
+#include <qpa/qplatformfontdatabase.h>
+#include <QtCore/qloggingcategory.h>
+
+struct IDWriteFactory;
+struct IDWriteFont;
+struct IDWriteFontFamily;
+struct IDWriteLocalizedStrings;
+
+QT_BEGIN_NAMESPACE
+
+#ifdef QT_USE_DIRECTWRITE3
+
+class QWindowsDirectWriteFontDatabase : public QWindowsFontDatabaseBase
+{
+ Q_DISABLE_COPY_MOVE(QWindowsDirectWriteFontDatabase)
+public:
+ QWindowsDirectWriteFontDatabase();
+ ~QWindowsDirectWriteFontDatabase() override;
+
+ void populateFontDatabase() override;
+ void populateFamily(const QString &familyName) override;
+ QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) override;
+ QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const override;
+ QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *font = nullptr) override;
+ void releaseHandle(void *handle) override;
+ QFont defaultFont() const override;
+
+ bool fontsAlwaysScalable() const override;
+ bool isPrivateFontFamily(const QString &family) const override;
+
+private:
+ static QString localeString(IDWriteLocalizedStrings *names, wchar_t localeName[]);
+
+ QHash<QString, IDWriteFontFamily *> m_populatedFonts;
+};
+
+#endif // QT_USE_DIRECTWRITE3
+
+QT_END_NAMESPACE
+
+#endif // QWINDOWSDIRECTWRITEFONTDATABASE_P_H
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp
index 178088db5d..0266f19cd3 100644
--- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp
+++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp
@@ -51,7 +51,6 @@
#include <QtCore/QDebug>
#include <QtCore/QFile>
#include <QtCore/QtEndian>
-#include <QtCore/QThreadStorage>
#include <QtCore/private/qsystemlibrary_p.h>
#include <QtCore/private/qwinregistry_p.h>
@@ -64,6 +63,7 @@
# include <dwrite.h>
# endif
# include <d2d1.h>
+# include "qwindowsdirectwritefontdatabase_p.h"
#endif
QT_BEGIN_NAMESPACE
@@ -75,40 +75,6 @@ Q_LOGGING_CATEGORY(lcQpaFonts, "qt.qpa.fonts")
typedef HRESULT (WINAPI *DWriteCreateFactoryType)(DWRITE_FACTORY_TYPE, const IID &, IUnknown **);
-static inline DWriteCreateFactoryType resolveDWriteCreateFactory()
-{
- QSystemLibrary library(QStringLiteral("dwrite"));
- QFunctionPointer result = library.resolve("DWriteCreateFactory");
- if (Q_UNLIKELY(!result)) {
- qWarning("Unable to load dwrite.dll");
- return nullptr;
- }
- return reinterpret_cast<DWriteCreateFactoryType>(result);
-}
-
-static void createDirectWriteFactory(IDWriteFactory **factory)
-{
- *factory = nullptr;
-
- static const DWriteCreateFactoryType dWriteCreateFactory = resolveDWriteCreateFactory();
- if (!dWriteCreateFactory)
- return;
-
- IUnknown *result = NULL;
-#if defined(QT_USE_DIRECTWRITE2)
- dWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory2), &result);
-#endif
-
- if (result == NULL) {
- if (FAILED(dWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), &result))) {
- qErrnoWarning("DWriteCreateFactory failed");
- return;
- }
- }
-
- *factory = static_cast<IDWriteFactory *>(result);
-}
-
static inline bool useDirectWrite(QFont::HintingPreference hintingPreference,
const QString &familyName = QString(),
bool isColorFont = false)
@@ -131,459 +97,6 @@ static inline bool useDirectWrite(QFont::HintingPreference hintingPreference,
}
#endif // !QT_NO_DIRECTWRITE
-// Helper classes for creating font engines directly from font data
-namespace {
-
-# pragma pack(1)
-
- // Common structure for all formats of the "name" table
- struct NameTable
- {
- quint16 format;
- quint16 count;
- quint16 stringOffset;
- };
-
- struct NameRecord
- {
- quint16 platformID;
- quint16 encodingID;
- quint16 languageID;
- quint16 nameID;
- quint16 length;
- quint16 offset;
- };
-
- struct OffsetSubTable
- {
- quint32 scalerType;
- quint16 numTables;
- quint16 searchRange;
- quint16 entrySelector;
- quint16 rangeShift;
- };
-
- struct TableDirectory
- {
- quint32 identifier;
- quint32 checkSum;
- quint32 offset;
- quint32 length;
- };
-
- struct OS2Table
- {
- quint16 version;
- qint16 avgCharWidth;
- quint16 weightClass;
- quint16 widthClass;
- quint16 type;
- qint16 subscriptXSize;
- qint16 subscriptYSize;
- qint16 subscriptXOffset;
- qint16 subscriptYOffset;
- qint16 superscriptXSize;
- qint16 superscriptYSize;
- qint16 superscriptXOffset;
- qint16 superscriptYOffset;
- qint16 strikeOutSize;
- qint16 strikeOutPosition;
- qint16 familyClass;
- quint8 panose[10];
- quint32 unicodeRanges[4];
- quint8 vendorID[4];
- quint16 selection;
- quint16 firstCharIndex;
- quint16 lastCharIndex;
- qint16 typoAscender;
- qint16 typoDescender;
- qint16 typoLineGap;
- quint16 winAscent;
- quint16 winDescent;
- quint32 codepageRanges[2];
- qint16 height;
- qint16 capHeight;
- quint16 defaultChar;
- quint16 breakChar;
- quint16 maxContext;
- };
-
-# pragma pack()
-
- class EmbeddedFont
- {
- public:
- EmbeddedFont(const QByteArray &fontData) : m_fontData(fontData) {}
-
- QString changeFamilyName(const QString &newFamilyName);
- QByteArray data() const { return m_fontData; }
- TableDirectory *tableDirectoryEntry(const QByteArray &tagName);
- QString familyName(TableDirectory *nameTableDirectory = 0);
-
- private:
- QByteArray m_fontData;
- };
-
- TableDirectory *EmbeddedFont::tableDirectoryEntry(const QByteArray &tagName)
- {
- Q_ASSERT(tagName.size() == 4);
- quint32 tagId = *(reinterpret_cast<const quint32 *>(tagName.constData()));
- const size_t fontDataSize = m_fontData.size();
- if (Q_UNLIKELY(fontDataSize < sizeof(OffsetSubTable)))
- return 0;
-
- OffsetSubTable *offsetSubTable = reinterpret_cast<OffsetSubTable *>(m_fontData.data());
- TableDirectory *tableDirectory = reinterpret_cast<TableDirectory *>(offsetSubTable + 1);
-
- const size_t tableCount = qFromBigEndian<quint16>(offsetSubTable->numTables);
- if (Q_UNLIKELY(fontDataSize < sizeof(OffsetSubTable) + sizeof(TableDirectory) * tableCount))
- return 0;
-
- TableDirectory *tableDirectoryEnd = tableDirectory + tableCount;
- for (TableDirectory *entry = tableDirectory; entry < tableDirectoryEnd; ++entry) {
- if (entry->identifier == tagId)
- return entry;
- }
-
- return 0;
- }
-
- QString EmbeddedFont::familyName(TableDirectory *nameTableDirectoryEntry)
- {
- QString name;
-
- if (nameTableDirectoryEntry == 0)
- nameTableDirectoryEntry = tableDirectoryEntry("name");
-
- if (nameTableDirectoryEntry != 0) {
- quint32 offset = qFromBigEndian<quint32>(nameTableDirectoryEntry->offset);
- if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + sizeof(NameTable)))
- return QString();
-
- NameTable *nameTable = reinterpret_cast<NameTable *>(m_fontData.data() + offset);
- NameRecord *nameRecord = reinterpret_cast<NameRecord *>(nameTable + 1);
-
- quint16 nameTableCount = qFromBigEndian<quint16>(nameTable->count);
- if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + sizeof(NameRecord) * nameTableCount))
- return QString();
-
- for (int i = 0; i < nameTableCount; ++i, ++nameRecord) {
- if (qFromBigEndian<quint16>(nameRecord->nameID) == 1
- && qFromBigEndian<quint16>(nameRecord->platformID) == 3 // Windows
- && qFromBigEndian<quint16>(nameRecord->languageID) == 0x0409) { // US English
- quint16 stringOffset = qFromBigEndian<quint16>(nameTable->stringOffset);
- quint16 nameOffset = qFromBigEndian<quint16>(nameRecord->offset);
- quint16 nameLength = qFromBigEndian<quint16>(nameRecord->length);
-
- if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + stringOffset + nameOffset + nameLength))
- return QString();
-
- const void *ptr = reinterpret_cast<const quint8 *>(nameTable)
- + stringOffset
- + nameOffset;
-
- const quint16 *s = reinterpret_cast<const quint16 *>(ptr);
- const quint16 *e = s + nameLength / sizeof(quint16);
- while (s != e)
- name += QChar( qFromBigEndian<quint16>(*s++));
- break;
- }
- }
- }
-
- return name;
- }
-
- QString EmbeddedFont::changeFamilyName(const QString &newFamilyName)
- {
- TableDirectory *nameTableDirectoryEntry = tableDirectoryEntry("name");
- if (nameTableDirectoryEntry == 0)
- return QString();
-
- QString oldFamilyName = familyName(nameTableDirectoryEntry);
-
- // Reserve size for name table header, five required name records and string
- const int requiredRecordCount = 5;
- quint16 nameIds[requiredRecordCount] = { 1, 2, 3, 4, 6 };
-
- int sizeOfHeader = sizeof(NameTable) + sizeof(NameRecord) * requiredRecordCount;
- int newFamilyNameSize = newFamilyName.size() * int(sizeof(quint16));
-
- const QString regularString = QString::fromLatin1("Regular");
- int regularStringSize = regularString.size() * int(sizeof(quint16));
-
- // Align table size of table to 32 bits (pad with 0)
- int fullSize = ((sizeOfHeader + newFamilyNameSize + regularStringSize) & ~3) + 4;
-
- QByteArray newNameTable(fullSize, char(0));
-
- {
- NameTable *nameTable = reinterpret_cast<NameTable *>(newNameTable.data());
- nameTable->count = qbswap<quint16>(requiredRecordCount);
- nameTable->stringOffset = qbswap<quint16>(sizeOfHeader);
-
- NameRecord *nameRecord = reinterpret_cast<NameRecord *>(nameTable + 1);
- for (int i = 0; i < requiredRecordCount; ++i, nameRecord++) {
- nameRecord->nameID = qbswap<quint16>(nameIds[i]);
- nameRecord->encodingID = qbswap<quint16>(1);
- nameRecord->languageID = qbswap<quint16>(0x0409);
- nameRecord->platformID = qbswap<quint16>(3);
- nameRecord->length = qbswap<quint16>(newFamilyNameSize);
-
- // Special case for sub-family
- if (nameIds[i] == 4) {
- nameRecord->offset = qbswap<quint16>(newFamilyNameSize);
- nameRecord->length = qbswap<quint16>(regularStringSize);
- }
- }
-
- // nameRecord now points to string data
- quint16 *stringStorage = reinterpret_cast<quint16 *>(nameRecord);
- const quint16 *sourceString = newFamilyName.utf16();
- for (int i = 0; i < newFamilyName.size(); ++i)
- stringStorage[i] = qbswap<quint16>(sourceString[i]);
- stringStorage += newFamilyName.size();
-
- sourceString = regularString.utf16();
- for (int i = 0; i < regularString.size(); ++i)
- stringStorage[i] = qbswap<quint16>(sourceString[i]);
- }
-
- quint32 *p = reinterpret_cast<quint32 *>(newNameTable.data());
- quint32 *tableEnd = reinterpret_cast<quint32 *>(newNameTable.data() + fullSize);
-
- quint32 checkSum = 0;
- while (p < tableEnd)
- checkSum += qFromBigEndian<quint32>(*(p++));
-
- nameTableDirectoryEntry->checkSum = qbswap<quint32>(checkSum);
- nameTableDirectoryEntry->offset = qbswap<quint32>(m_fontData.size());
- nameTableDirectoryEntry->length = qbswap<quint32>(fullSize);
-
- m_fontData.append(newNameTable);
-
- return oldFamilyName;
- }
-
-#if !defined(QT_NO_DIRECTWRITE)
-
- class DirectWriteFontFileStream: public IDWriteFontFileStream
- {
- Q_DISABLE_COPY(DirectWriteFontFileStream)
- public:
- DirectWriteFontFileStream(const QByteArray &fontData)
- : m_fontData(fontData)
- , m_referenceCount(0)
- {
- }
- virtual ~DirectWriteFontFileStream()
- {
- }
-
- HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **object);
- ULONG STDMETHODCALLTYPE AddRef();
- ULONG STDMETHODCALLTYPE Release();
-
- HRESULT STDMETHODCALLTYPE ReadFileFragment(const void **fragmentStart, UINT64 fileOffset,
- UINT64 fragmentSize, OUT void **fragmentContext);
- void STDMETHODCALLTYPE ReleaseFileFragment(void *fragmentContext);
- HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64 *fileSize);
- HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64 *lastWriteTime);
-
- private:
- QByteArray m_fontData;
- ULONG m_referenceCount;
- };
-
- HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::QueryInterface(REFIID iid, void **object)
- {
- if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {
- *object = this;
- AddRef();
- return S_OK;
- } else {
- *object = NULL;
- return E_NOINTERFACE;
- }
- }
-
- ULONG STDMETHODCALLTYPE DirectWriteFontFileStream::AddRef()
- {
- return InterlockedIncrement(&m_referenceCount);
- }
-
- ULONG STDMETHODCALLTYPE DirectWriteFontFileStream::Release()
- {
- ULONG newCount = InterlockedDecrement(&m_referenceCount);
- if (newCount == 0)
- delete this;
- return newCount;
- }
-
- HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::ReadFileFragment(
- const void **fragmentStart,
- UINT64 fileOffset,
- UINT64 fragmentSize,
- OUT void **fragmentContext)
- {
- *fragmentContext = NULL;
- if (fileOffset + fragmentSize <= quint64(m_fontData.size())) {
- *fragmentStart = m_fontData.data() + fileOffset;
- return S_OK;
- } else {
- *fragmentStart = NULL;
- return E_FAIL;
- }
- }
-
- void STDMETHODCALLTYPE DirectWriteFontFileStream::ReleaseFileFragment(void *)
- {
- }
-
- HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::GetFileSize(UINT64 *fileSize)
- {
- *fileSize = m_fontData.size();
- return S_OK;
- }
-
- HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::GetLastWriteTime(UINT64 *lastWriteTime)
- {
- *lastWriteTime = 0;
- return E_NOTIMPL;
- }
-
- class DirectWriteFontFileLoader: public IDWriteFontFileLoader
- {
- public:
- DirectWriteFontFileLoader() : m_referenceCount(0) {}
- virtual ~DirectWriteFontFileLoader()
- {
- }
-
- inline void addKey(const void *key, const QByteArray &fontData)
- {
- Q_ASSERT(!m_fontDatas.contains(key));
- m_fontDatas.insert(key, fontData);
- }
-
- inline void removeKey(const void *key)
- {
- m_fontDatas.remove(key);
- }
-
- HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **object);
- ULONG STDMETHODCALLTYPE AddRef();
- ULONG STDMETHODCALLTYPE Release();
-
- HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const *fontFileReferenceKey,
- UINT32 fontFileReferenceKeySize,
- OUT IDWriteFontFileStream **fontFileStream);
-
- private:
- ULONG m_referenceCount;
- QHash<const void *, QByteArray> m_fontDatas;
- };
-
- HRESULT STDMETHODCALLTYPE DirectWriteFontFileLoader::QueryInterface(const IID &iid,
- void **object)
- {
- if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) {
- *object = this;
- AddRef();
- return S_OK;
- } else {
- *object = NULL;
- return E_NOINTERFACE;
- }
- }
-
- ULONG STDMETHODCALLTYPE DirectWriteFontFileLoader::AddRef()
- {
- return InterlockedIncrement(&m_referenceCount);
- }
-
- ULONG STDMETHODCALLTYPE DirectWriteFontFileLoader::Release()
- {
- ULONG newCount = InterlockedDecrement(&m_referenceCount);
- if (newCount == 0)
- delete this;
- return newCount;
- }
-
- HRESULT STDMETHODCALLTYPE DirectWriteFontFileLoader::CreateStreamFromKey(
- void const *fontFileReferenceKey,
- UINT32 fontFileReferenceKeySize,
- IDWriteFontFileStream **fontFileStream)
- {
- Q_UNUSED(fontFileReferenceKeySize);
-
- if (fontFileReferenceKeySize != sizeof(const void *)) {
- qWarning("%s: Wrong key size", __FUNCTION__);
- return E_FAIL;
- }
-
- const void *key = *reinterpret_cast<void * const *>(fontFileReferenceKey);
- *fontFileStream = NULL;
- auto it = m_fontDatas.constFind(key);
- if (it == m_fontDatas.constEnd())
- return E_FAIL;
-
- QByteArray fontData = it.value();
- DirectWriteFontFileStream *stream = new DirectWriteFontFileStream(fontData);
- stream->AddRef();
- *fontFileStream = stream;
-
- return S_OK;
- }
-
- class CustomFontFileLoader
- {
- public:
- CustomFontFileLoader() : m_directWriteFontFileLoader(nullptr)
- {
- createDirectWriteFactory(&m_directWriteFactory);
-
- if (m_directWriteFactory) {
- m_directWriteFontFileLoader = new DirectWriteFontFileLoader();
- m_directWriteFactory->RegisterFontFileLoader(m_directWriteFontFileLoader);
- }
- }
-
- ~CustomFontFileLoader()
- {
- if (m_directWriteFactory != 0 && m_directWriteFontFileLoader != 0)
- m_directWriteFactory->UnregisterFontFileLoader(m_directWriteFontFileLoader);
-
- if (m_directWriteFactory != 0)
- m_directWriteFactory->Release();
- }
-
- void addKey(const void *key, const QByteArray &fontData)
- {
- if (m_directWriteFontFileLoader != 0)
- m_directWriteFontFileLoader->addKey(key, fontData);
- }
-
- void removeKey(const void *key)
- {
- if (m_directWriteFontFileLoader != 0)
- m_directWriteFontFileLoader->removeKey(key);
- }
-
- IDWriteFontFileLoader *loader() const
- {
- return m_directWriteFontFileLoader;
- }
-
- private:
- IDWriteFactory *m_directWriteFactory;
- DirectWriteFontFileLoader *m_directWriteFontFileLoader;
- };
-
-#endif
-
-} // Anonymous namespace
-
/*!
\struct QWindowsFontEngineData
\brief Static constant data shared by the font engines.
@@ -619,18 +132,6 @@ unsigned QWindowsFontDatabase::fontOptions()
return m_fontOptions;
}
-QWindowsFontEngineData::~QWindowsFontEngineData()
-{
- if (hdc)
- DeleteDC(hdc);
-#if !defined(QT_NO_DIRECTWRITE)
- if (directWriteGdiInterop)
- directWriteGdiInterop->Release();
- if (directWriteFactory)
- directWriteFactory->Release();
-#endif
-}
-
qreal QWindowsFontDatabase::fontSmoothingGamma()
{
int winSmooth;
@@ -644,26 +145,6 @@ qreal QWindowsFontDatabase::fontSmoothingGamma()
return result;
}
-#if !defined(QT_NO_DIRECTWRITE)
-static inline bool initDirectWrite(QWindowsFontEngineData *d)
-{
- if (!d->directWriteFactory) {
- createDirectWriteFactory(&d->directWriteFactory);
- if (!d->directWriteFactory)
- return false;
- }
- if (!d->directWriteGdiInterop) {
- const HRESULT hr = d->directWriteFactory->GetGdiInterop(&d->directWriteGdiInterop);
- if (FAILED(hr)) {
- qErrnoWarning("%s: GetGdiInterop failed", __FUNCTION__);
- return false;
- }
- }
- return true;
-}
-
-#endif // !defined(QT_NO_DIRECTWRITE)
-
/*!
\class QWindowsFontDatabase
\brief Font database for Windows
@@ -1237,20 +718,6 @@ void QWindowsFontDatabase::populateFontDatabase()
addDefaultEUDCFont();
}
-typedef QSharedPointer<QWindowsFontEngineData> QWindowsFontEngineDataPtr;
-
-typedef QThreadStorage<QWindowsFontEngineDataPtr> FontEngineThreadLocalData;
-
-Q_GLOBAL_STATIC(FontEngineThreadLocalData, fontEngineThreadLocalData)
-
-QSharedPointer<QWindowsFontEngineData> sharedFontData()
-{
- FontEngineThreadLocalData *data = fontEngineThreadLocalData();
- if (!data->hasLocalData())
- data->setLocalData(QSharedPointer<QWindowsFontEngineData>::create());
- return data->localData();
-}
-
QWindowsFontDatabase::QWindowsFontDatabase()
{
// Properties accessed by QWin32PrintEngine (Qt Print Support)
@@ -1260,9 +727,9 @@ QWindowsFontDatabase::QWindowsFontDatabase()
Q_UNUSED(logFontMetaTypeId)
if (lcQpaFonts().isDebugEnabled()) {
- const QWindowsFontEngineDataPtr data = sharedFontData();
+ QSharedPointer<QWindowsFontEngineData> d = data();
qCDebug(lcQpaFonts) << __FUNCTION__ << "Clear type: "
- << data->clearTypeEnabled << "gamma: " << data->fontSmoothingGamma;
+ << d->clearTypeEnabled << "gamma: " << d->fontSmoothingGamma;
}
}
@@ -1276,7 +743,7 @@ QFontEngine * QWindowsFontDatabase::fontEngine(const QFontDef &fontDef, void *ha
const QString faceName(static_cast<const QChar*>(handle));
QFontEngine *fe = QWindowsFontDatabase::createEngine(fontDef, faceName,
defaultVerticalDPI(),
- sharedFontData());
+ data());
qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDEF" << fontDef << fe << handle;
return fe;
}
@@ -1330,7 +797,7 @@ QT_WARNING_POP
fontEngine = QWindowsFontDatabase::createEngine(request, QString(),
defaultVerticalDPI(),
- sharedFontData());
+ data());
if (fontEngine) {
if (request.family != fontEngine->fontDef.family) {
@@ -1369,87 +836,17 @@ QT_WARNING_POP
RemoveFontMemResourceEx(fontHandle);
}
}
+
+ // Get style and weight info
+ if (fontEngine != nullptr)
+ font.updateFromOS2Table(fontEngine);
}
#if !defined(QT_NO_DIRECTWRITE)
else {
- CustomFontFileLoader fontFileLoader;
- fontFileLoader.addKey(this, fontData);
-
- QSharedPointer<QWindowsFontEngineData> fontEngineData = sharedFontData();
- if (!initDirectWrite(fontEngineData.data()))
- return 0;
-
- IDWriteFontFile *fontFile = 0;
- void *key = this;
-
- HRESULT hres = fontEngineData->directWriteFactory->CreateCustomFontFileReference(&key,
- sizeof(void *),
- fontFileLoader.loader(),
- &fontFile);
- if (FAILED(hres)) {
- qErrnoWarning(hres, "%s: CreateCustomFontFileReference failed", __FUNCTION__);
- return 0;
- }
-
- BOOL isSupportedFontType;
- DWRITE_FONT_FILE_TYPE fontFileType;
- DWRITE_FONT_FACE_TYPE fontFaceType;
- UINT32 numberOfFaces;
- fontFile->Analyze(&isSupportedFontType, &fontFileType, &fontFaceType, &numberOfFaces);
- if (!isSupportedFontType) {
- fontFile->Release();
- return 0;
- }
-
- IDWriteFontFace *directWriteFontFace = 0;
- hres = fontEngineData->directWriteFactory->CreateFontFace(fontFaceType,
- 1,
- &fontFile,
- 0,
- DWRITE_FONT_SIMULATIONS_NONE,
- &directWriteFontFace);
- if (FAILED(hres)) {
- qErrnoWarning(hres, "%s: CreateFontFace failed", __FUNCTION__);
- fontFile->Release();
- return 0;
- }
-
- fontFile->Release();
-
- fontEngine = new QWindowsFontEngineDirectWrite(directWriteFontFace,
- pixelSize,
- fontEngineData);
-
- // Get font family from font data
- fontEngine->fontDef.family = font.familyName();
- fontEngine->fontDef.hintingPreference = hintingPreference;
-
- directWriteFontFace->Release();
+ fontEngine = QWindowsFontDatabaseBase::fontEngine(fontData, pixelSize, hintingPreference);
}
#endif
- // Get style and weight info
- if (fontEngine != 0) {
- TableDirectory *os2TableEntry = font.tableDirectoryEntry("OS/2");
- if (os2TableEntry != 0) {
- const OS2Table *os2Table =
- reinterpret_cast<const OS2Table *>(fontData.constData()
- + qFromBigEndian<quint32>(os2TableEntry->offset));
-
- bool italic = qFromBigEndian<quint16>(os2Table->selection) & (1 << 0);
- bool oblique = qFromBigEndian<quint16>(os2Table->selection) & (1 << 9);
-
- if (italic)
- fontEngine->fontDef.style = QFont::StyleItalic;
- else if (oblique)
- fontEngine->fontDef.style = QFont::StyleOblique;
- else
- fontEngine->fontDef.style = QFont::StyleNormal;
-
- fontEngine->fontDef.weight = QPlatformFontDatabase::weightFromInteger(qFromBigEndian<quint16>(os2Table->weightClass));
- }
- }
-
qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDATA" << fontData << pixelSize << hintingPreference << fontEngine;
return fontEngine;
}
@@ -1550,7 +947,7 @@ static void getFamiliesAndSignatures(const QByteArray &fontData,
}
}
-QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
+QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont)
{
WinApplicationFont font;
font.fileName = fileName;
@@ -1593,6 +990,16 @@ QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData,
HFONT hfont = CreateFontIndirect(&lf);
HGDIOBJ oldobj = SelectObject(hdc, hfont);
+ if (applicationFont != nullptr) {
+ QFontDatabasePrivate::ApplicationFont::Properties properties;
+ properties.style = values.isItalic ? QFont::StyleItalic : QFont::StyleNormal;
+ properties.weight = QPlatformFontDatabase::weightFromInteger(values.weight);
+ properties.familyName = familyName;
+ properties.styleName = styleName;
+
+ applicationFont->properties.append(properties);
+ }
+
TEXTMETRIC textMetrics;
GetTextMetrics(hdc, &textMetrics);
@@ -1611,7 +1018,9 @@ QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData,
QByteArray data = f.readAll();
f.close();
- getFamiliesAndSignatures(data, &families, nullptr, nullptr);
+
+ getFamiliesAndSignatures(data, &families, nullptr, applicationFont != nullptr ? &fontValues : nullptr);
+
if (families.isEmpty())
return QStringList();
@@ -1624,6 +1033,20 @@ QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData,
for (int j = 0; j < families.count(); ++j) {
const QString familyName = families.at(j).name;
familyNames << familyName;
+
+ if (applicationFont != nullptr) {
+ const QString &styleName = families.at(j).style;
+ const QFontValues &values = fontValues.at(j);
+
+ QFontDatabasePrivate::ApplicationFont::Properties properties;
+ properties.style = values.isItalic ? QFont::StyleItalic : QFont::StyleNormal;
+ properties.weight = QPlatformFontDatabase::weightFromInteger(values.weight);
+ properties.familyName = familyName;
+ properties.styleName = styleName;
+
+ applicationFont->properties.append(properties);
+ }
+
populateFamily(familyName);
}
}
@@ -1681,234 +1104,12 @@ void QWindowsFontDatabase::refUniqueFont(const QString &uniqueFont)
m_uniqueFontData[uniqueFont].refCount.ref();
}
-// ### fixme Qt 6 (QTBUG-58610): See comment at QWindowsFontDatabase::systemDefaultFont()
-HFONT QWindowsFontDatabase::systemFont()
-{
- static const auto stock_sysfont =
- reinterpret_cast<HFONT>(GetStockObject(DEFAULT_GUI_FONT));
- return stock_sysfont;
-}
-
-// Creation functions
-
-static const char *other_tryFonts[] = {
- "Arial",
- "MS UI Gothic",
- "Gulim",
- "SimSun",
- "PMingLiU",
- "Arial Unicode MS",
- 0
-};
-
-static const char *jp_tryFonts [] = {
- "MS UI Gothic",
- "Arial",
- "Gulim",
- "SimSun",
- "PMingLiU",
- "Arial Unicode MS",
- 0
-};
-
-static const char *ch_CN_tryFonts [] = {
- "SimSun",
- "Arial",
- "PMingLiU",
- "Gulim",
- "MS UI Gothic",
- "Arial Unicode MS",
- 0
-};
-
-static const char *ch_TW_tryFonts [] = {
- "PMingLiU",
- "Arial",
- "SimSun",
- "Gulim",
- "MS UI Gothic",
- "Arial Unicode MS",
- 0
-};
-
-static const char *kr_tryFonts[] = {
- "Gulim",
- "Arial",
- "PMingLiU",
- "SimSun",
- "MS UI Gothic",
- "Arial Unicode MS",
- 0
-};
-
-static const char **tryFonts = 0;
-
-LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request, const QString &faceName)
-{
- LOGFONT lf;
- memset(&lf, 0, sizeof(LOGFONT));
-
- lf.lfHeight = -qRound(request.pixelSize);
- lf.lfWidth = 0;
- lf.lfEscapement = 0;
- lf.lfOrientation = 0;
- if (request.weight == 50)
- lf.lfWeight = FW_DONTCARE;
- else
- lf.lfWeight = (request.weight*900)/99;
- lf.lfItalic = request.style != QFont::StyleNormal;
- lf.lfCharSet = DEFAULT_CHARSET;
-
- int strat = OUT_DEFAULT_PRECIS;
- if (request.styleStrategy & QFont::PreferBitmap) {
- strat = OUT_RASTER_PRECIS;
- } else if (request.styleStrategy & QFont::PreferDevice) {
- strat = OUT_DEVICE_PRECIS;
- } else if (request.styleStrategy & QFont::PreferOutline) {
- strat = OUT_OUTLINE_PRECIS;
- } else if (request.styleStrategy & QFont::ForceOutline) {
- strat = OUT_TT_ONLY_PRECIS;
- }
-
- lf.lfOutPrecision = strat;
-
- int qual = DEFAULT_QUALITY;
-
- if (request.styleStrategy & QFont::PreferMatch)
- qual = DRAFT_QUALITY;
- else if (request.styleStrategy & QFont::PreferQuality)
- qual = PROOF_QUALITY;
-
- if (request.styleStrategy & QFont::PreferAntialias) {
- qual = (request.styleStrategy & QFont::NoSubpixelAntialias) == 0
- ? CLEARTYPE_QUALITY : ANTIALIASED_QUALITY;
- } else if (request.styleStrategy & QFont::NoAntialias) {
- qual = NONANTIALIASED_QUALITY;
- } else if ((request.styleStrategy & QFont::NoSubpixelAntialias) && sharedFontData()->clearTypeEnabled) {
- qual = ANTIALIASED_QUALITY;
- }
-
- lf.lfQuality = qual;
-
- lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
-
- int hint = FF_DONTCARE;
- switch (request.styleHint) {
- case QFont::Helvetica:
- hint = FF_SWISS;
- break;
- case QFont::Times:
- hint = FF_ROMAN;
- break;
- case QFont::Courier:
- hint = FF_MODERN;
- break;
- case QFont::OldEnglish:
- hint = FF_DECORATIVE;
- break;
- case QFont::System:
- hint = FF_MODERN;
- break;
- default:
- break;
- }
-
- lf.lfPitchAndFamily = DEFAULT_PITCH | hint;
-
- QString fam = faceName;
- if (fam.isEmpty())
- fam = request.families.size() > 0 ? request.families.at(0) : request.family;
- if (Q_UNLIKELY(fam.size() >= LF_FACESIZE)) {
- qCritical("%s: Family name '%s' is too long.", __FUNCTION__, qPrintable(fam));
- fam.truncate(LF_FACESIZE - 1);
- }
-
- if (fam.isEmpty())
- fam = QStringLiteral("MS Sans Serif");
-
- if (fam == QLatin1String("MS Sans Serif")
- && (request.style == QFont::StyleItalic || (-lf.lfHeight > 18 && -lf.lfHeight != 24))) {
- fam = QStringLiteral("Arial"); // MS Sans Serif has bearing problems in italic, and does not scale
- }
- if (fam == QLatin1String("Courier") && !(request.styleStrategy & QFont::PreferBitmap))
- fam = QStringLiteral("Courier New");
-
- memcpy(lf.lfFaceName, fam.utf16(), fam.size() * sizeof(wchar_t));
-
- return lf;
-}
-
-QStringList QWindowsFontDatabase::extraTryFontsForFamily(const QString &family)
-{
- QStringList result;
- QFontDatabase db;
- if (!db.writingSystems(family).contains(QFontDatabase::Symbol)) {
- if (!tryFonts) {
- LANGID lid = GetUserDefaultLangID();
- switch (lid&0xff) {
- case LANG_CHINESE: // Chinese
- if ( lid == 0x0804 || lid == 0x1004) // China mainland and Singapore
- tryFonts = ch_CN_tryFonts;
- else
- tryFonts = ch_TW_tryFonts; // Taiwan, Hong Kong and Macau
- break;
- case LANG_JAPANESE:
- tryFonts = jp_tryFonts;
- break;
- case LANG_KOREAN:
- tryFonts = kr_tryFonts;
- break;
- default:
- tryFonts = other_tryFonts;
- break;
- }
- }
- QFontDatabase db;
- const QStringList families = db.families();
- const char **tf = tryFonts;
- while (tf && *tf) {
- // QTBUG-31689, family might be an English alias for a localized font name.
- const QString family = QString::fromLatin1(*tf);
- if (families.contains(family) || db.hasFamily(family))
- result << family;
- ++tf;
- }
- }
- result.append(QStringLiteral("Segoe UI Emoji"));
- result.append(QStringLiteral("Segoe UI Symbol"));
- return result;
-}
-
-QString QWindowsFontDatabase::familyForStyleHint(QFont::StyleHint styleHint)
-{
- switch (styleHint) {
- case QFont::Times:
- return QStringLiteral("Times New Roman");
- case QFont::Courier:
- return QStringLiteral("Courier New");
- case QFont::Monospace:
- return QStringLiteral("Courier New");
- case QFont::Cursive:
- return QStringLiteral("Comic Sans MS");
- case QFont::Fantasy:
- return QStringLiteral("Impact");
- case QFont::Decorative:
- return QStringLiteral("Old English");
- case QFont::Helvetica:
- return QStringLiteral("Arial");
- case QFont::System:
- default:
- break;
- }
- return QStringLiteral("MS Shell Dlg 2");
-}
-
QStringList QWindowsFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
{
QStringList result;
- result.append(QWindowsFontDatabase::familyForStyleHint(styleHint));
+ result.append(familyForStyleHint(styleHint));
result.append(m_eudcFonts);
- result.append(QWindowsFontDatabase::extraTryFontsForFamily(family));
+ result.append(extraTryFontsForFamily(family));
result.append(QPlatformFontDatabase::fallbacksForFamily(family, style, styleHint, script));
qCDebug(lcQpaFonts) << __FUNCTION__ << family << style << styleHint
@@ -1945,7 +1146,7 @@ QFontEngine *QWindowsFontDatabase::createEngine(const QFontDef &request, const Q
}
#if !defined(QT_NO_DIRECTWRITE)
- if (initDirectWrite(data.data())) {
+ if (data->directWriteFactory != nullptr) {
const QString fam = QString::fromWCharArray(lf.lfFaceName);
const QString nameSubstitute = QWindowsFontEngineDirectWrite::fontNameSubstitute(fam);
if (nameSubstitute != fam) {
@@ -2021,62 +1222,6 @@ QFontEngine *QWindowsFontDatabase::createEngine(const QFontDef &request, const Q
return fe;
}
-QFont QWindowsFontDatabase::systemDefaultFont()
-{
-#if QT_VERSION >= 0x060000
- // Qt 6: Obtain default GUI font (typically "Segoe UI, 9pt", see QTBUG-58610)
- NONCLIENTMETRICS ncm;
- ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, lfMessageFont) + sizeof(LOGFONT);
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize , &ncm, 0);
- const QFont systemFont = QWindowsFontDatabase::LOGFONT_to_QFont(ncm.lfMessageFont);
-#else
- LOGFONT lf;
- GetObject(QWindowsFontDatabase::systemFont(), sizeof(lf), &lf);
- QFont systemFont = QWindowsFontDatabase::LOGFONT_to_QFont(lf);
- // "MS Shell Dlg 2" is the correct system font >= Win2k
- if (systemFont.family() == QLatin1String("MS Shell Dlg"))
- systemFont.setFamily(QStringLiteral("MS Shell Dlg 2"));
- // Qt 5 by (Qt 4) legacy uses GetStockObject(DEFAULT_GUI_FONT) to
- // obtain the default GUI font (typically "MS Shell Dlg 2, 8pt"). This has been
- // long deprecated; the message font of the NONCLIENTMETRICS structure obtained by
- // SystemParametersInfo(SPI_GETNONCLIENTMETRICS) should be used instead (see
- // QWindowsTheme::refreshFonts(), typically "Segoe UI, 9pt"), which is larger.
-#endif // Qt 5
- qCDebug(lcQpaFonts) << __FUNCTION__ << systemFont;
- return systemFont;
-}
-
-QFont QWindowsFontDatabase::LOGFONT_to_QFont(const LOGFONT& logFont, int verticalDPI_In)
-{
- if (verticalDPI_In <= 0)
- verticalDPI_In = defaultVerticalDPI();
- QFont qFont(QString::fromWCharArray(logFont.lfFaceName));
- qFont.setItalic(logFont.lfItalic);
- if (logFont.lfWeight != FW_DONTCARE)
- qFont.setWeight(QPlatformFontDatabase::weightFromInteger(logFont.lfWeight));
- const qreal logFontHeight = qAbs(logFont.lfHeight);
- qFont.setPointSizeF(logFontHeight * 72.0 / qreal(verticalDPI_In));
- qFont.setUnderline(logFont.lfUnderline);
- qFont.setOverline(false);
- qFont.setStrikeOut(logFont.lfStrikeOut);
- return qFont;
-}
-
-int QWindowsFontDatabase::defaultVerticalDPI()
-{
- static int vDPI = -1;
- if (vDPI == -1) {
- if (HDC defaultDC = GetDC(0)) {
- vDPI = GetDeviceCaps(defaultDC, LOGPIXELSY);
- ReleaseDC(0, defaultDC);
- } else {
- // FIXME: Resolve now or return 96 and keep unresolved?
- vDPI = 96;
- }
- }
- return vDPI;
-}
-
bool QWindowsFontDatabase::isPrivateFontFamily(const QString &family) const
{
return m_eudcFonts.contains(family) || QPlatformFontDatabase::isPrivateFontFamily(family);
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp
index 5c2742d295..39551c2e27 100644
--- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp
+++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp
@@ -50,8 +50,6 @@
#include <QtCore/QSettings>
#if QT_CONFIG(regularexpression)
#include <QtCore/QRegularExpression>
-#else
-#include <QtCore/QRegExp>
#endif
#include <QtGui/QGuiApplication>
#include <QtGui/QFontDatabase>
@@ -127,10 +125,8 @@ static FontKeys &fontKeys()
const QString trueType = QStringLiteral("(TrueType)");
#if QT_CONFIG(regularexpression)
const QRegularExpression sizeListMatch(QStringLiteral("\\s(\\d+,)+\\d+"));
-#else
- const QRegExp sizeListMatch(QLatin1String("\\s(\\d+,)+\\d+"));
-#endif
Q_ASSERT(sizeListMatch.isValid());
+#endif
const int size = allKeys.size();
result.reserve(result.size() + size);
for (int i = 0; i < size; ++i) {
@@ -139,7 +135,9 @@ static FontKeys &fontKeys()
fontKey.fileName = fontRegistry.value(registryFontKey).toString();
QString realKey = registryFontKey;
realKey.remove(trueType);
+#if QT_CONFIG(regularexpression)
realKey.remove(sizeListMatch);
+#endif
const auto fontNames = QStringRef(&realKey).trimmed().split(QLatin1Char('&'));
fontKey.fontNames.reserve(fontNames.size());
for (const QStringRef &fontName : fontNames)
@@ -422,8 +420,8 @@ QFontEngine *QWindowsFontDatabaseFT::fontEngine(const QByteArray &fontData, qrea
QStringList QWindowsFontDatabaseFT::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
{
QStringList result;
- result.append(QWindowsFontDatabase::familyForStyleHint(styleHint));
- result.append(QWindowsFontDatabase::extraTryFontsForFamily(family));
+ result.append(QWindowsFontDatabaseBase::familyForStyleHint(styleHint));
+ result.append(QWindowsFontDatabaseBase::extraTryFontsForFamily(family));
result.append(QFreeTypeFontDatabase::fallbacksForFamily(family, style, styleHint, script));
qCDebug(lcQpaFonts) << __FUNCTION__ << family << style << styleHint
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h
index f132e69d4d..38ddb178bd 100644
--- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h
+++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h
@@ -51,39 +51,16 @@
// We mean it.
//
+#include "qwindowsfontdatabasebase_p.h"
+
#include <qpa/qplatformfontdatabase.h>
#include <QtCore/QSharedPointer>
#include <QtCore/QLoggingCategory>
#include <QtCore/qt_windows.h>
-#if !defined(QT_NO_DIRECTWRITE)
- struct IDWriteFactory;
- struct IDWriteGdiInterop;
-#endif
-
QT_BEGIN_NAMESPACE
-Q_DECLARE_LOGGING_CATEGORY(lcQpaFonts)
-
-class QWindowsFontEngineData
-{
- Q_DISABLE_COPY_MOVE(QWindowsFontEngineData)
-public:
- QWindowsFontEngineData();
- ~QWindowsFontEngineData();
-
- uint pow_gamma[256];
-
- bool clearTypeEnabled = false;
- qreal fontSmoothingGamma;
- HDC hdc = 0;
-#if !defined(QT_NO_DIRECTWRITE)
- IDWriteFactory *directWriteFactory = nullptr;
- IDWriteGdiInterop *directWriteGdiInterop = nullptr;
-#endif
-};
-
-class QWindowsFontDatabase : public QPlatformFontDatabase
+class QWindowsFontDatabase : public QWindowsFontDatabaseBase
{
Q_DISABLE_COPY_MOVE(QWindowsFontDatabase)
public:
@@ -103,7 +80,7 @@ public:
QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) override;
QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) override;
QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const override;
- QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName) override;
+ QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont = nullptr) override;
void releaseHandle(void *handle) override;
QString fontDir() const override;
@@ -113,22 +90,11 @@ public:
void refUniqueFont(const QString &uniqueFont);
bool isPrivateFontFamily(const QString &family) const override;
- static QFont systemDefaultFont();
-
static QFontEngine *createEngine(const QFontDef &request, const QString &faceName,
int dpi,
const QSharedPointer<QWindowsFontEngineData> &data);
- static HFONT systemFont();
- static QFont LOGFONT_to_QFont(const LOGFONT& lf, int verticalDPI = 0);
-
static qreal fontSmoothingGamma();
- static LOGFONT fontDefToLOGFONT(const QFontDef &fontDef, const QString &faceName);
-
- static QStringList extraTryFontsForFamily(const QString &family);
- static QString familyForStyleHint(QFont::StyleHint styleHint);
-
- static int defaultVerticalDPI();
static void setFontOptions(unsigned options);
static unsigned fontOptions();
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase.cpp
new file mode 100644
index 0000000000..e6dee54d84
--- /dev/null
+++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase.cpp
@@ -0,0 +1,988 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwindowsfontdatabasebase_p.h"
+#include "qwindowsfontdatabase_p.h"
+
+#include <QtCore/private/qsystemlibrary_p.h>
+#include <QtCore/QThreadStorage>
+#include <QtCore/QtEndian>
+
+#if !defined(QT_NO_DIRECTWRITE)
+# if defined(QT_USE_DIRECTWRITE3)
+# include <dwrite_3.h>
+# elif defined(QT_USE_DIRECTWRITE2)
+# include <dwrite_2.h>
+# else
+# include <dwrite.h>
+# endif
+# include <d2d1.h>
+# include "qwindowsfontenginedirectwrite_p.h"
+#endif
+
+QT_BEGIN_NAMESPACE
+
+// Helper classes for creating font engines directly from font data
+namespace {
+
+# pragma pack(1)
+
+ // Common structure for all formats of the "name" table
+ struct NameTable
+ {
+ quint16 format;
+ quint16 count;
+ quint16 stringOffset;
+ };
+
+ struct NameRecord
+ {
+ quint16 platformID;
+ quint16 encodingID;
+ quint16 languageID;
+ quint16 nameID;
+ quint16 length;
+ quint16 offset;
+ };
+
+ struct OffsetSubTable
+ {
+ quint32 scalerType;
+ quint16 numTables;
+ quint16 searchRange;
+ quint16 entrySelector;
+ quint16 rangeShift;
+ };
+
+ struct TableDirectory : public QWindowsFontDatabaseBase::FontTable
+ {
+ quint32 identifier;
+ quint32 checkSum;
+ quint32 offset;
+ quint32 length;
+ };
+
+ struct OS2Table
+ {
+ quint16 version;
+ qint16 avgCharWidth;
+ quint16 weightClass;
+ quint16 widthClass;
+ quint16 type;
+ qint16 subscriptXSize;
+ qint16 subscriptYSize;
+ qint16 subscriptXOffset;
+ qint16 subscriptYOffset;
+ qint16 superscriptXSize;
+ qint16 superscriptYSize;
+ qint16 superscriptXOffset;
+ qint16 superscriptYOffset;
+ qint16 strikeOutSize;
+ qint16 strikeOutPosition;
+ qint16 familyClass;
+ quint8 panose[10];
+ quint32 unicodeRanges[4];
+ quint8 vendorID[4];
+ quint16 selection;
+ quint16 firstCharIndex;
+ quint16 lastCharIndex;
+ qint16 typoAscender;
+ qint16 typoDescender;
+ qint16 typoLineGap;
+ quint16 winAscent;
+ quint16 winDescent;
+ quint32 codepageRanges[2];
+ qint16 height;
+ qint16 capHeight;
+ quint16 defaultChar;
+ quint16 breakChar;
+ quint16 maxContext;
+ };
+
+# pragma pack()
+
+} // Anonymous namespace
+
+QWindowsFontDatabaseBase::FontTable *QWindowsFontDatabaseBase::EmbeddedFont::tableDirectoryEntry(const QByteArray &tagName)
+{
+ Q_ASSERT(tagName.size() == 4);
+ quint32 tagId = *(reinterpret_cast<const quint32 *>(tagName.constData()));
+ const size_t fontDataSize = m_fontData.size();
+ if (Q_UNLIKELY(fontDataSize < sizeof(OffsetSubTable)))
+ return nullptr;
+
+ OffsetSubTable *offsetSubTable = reinterpret_cast<OffsetSubTable *>(m_fontData.data());
+ TableDirectory *tableDirectory = reinterpret_cast<TableDirectory *>(offsetSubTable + 1);
+
+ const size_t tableCount = qFromBigEndian<quint16>(offsetSubTable->numTables);
+ if (Q_UNLIKELY(fontDataSize < sizeof(OffsetSubTable) + sizeof(TableDirectory) * tableCount))
+ return nullptr;
+
+ TableDirectory *tableDirectoryEnd = tableDirectory + tableCount;
+ for (TableDirectory *entry = tableDirectory; entry < tableDirectoryEnd; ++entry) {
+ if (entry->identifier == tagId)
+ return entry;
+ }
+
+ return nullptr;
+}
+
+QString QWindowsFontDatabaseBase::EmbeddedFont::familyName(QWindowsFontDatabaseBase::FontTable *directoryEntry)
+{
+ QString name;
+
+ TableDirectory *nameTableDirectoryEntry = static_cast<TableDirectory *>(directoryEntry);
+ if (nameTableDirectoryEntry == nullptr)
+ nameTableDirectoryEntry = static_cast<TableDirectory *>(tableDirectoryEntry("name"));
+
+ if (nameTableDirectoryEntry != nullptr) {
+ quint32 offset = qFromBigEndian<quint32>(nameTableDirectoryEntry->offset);
+ if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + sizeof(NameTable)))
+ return QString();
+
+ NameTable *nameTable = reinterpret_cast<NameTable *>(m_fontData.data() + offset);
+ NameRecord *nameRecord = reinterpret_cast<NameRecord *>(nameTable + 1);
+
+ quint16 nameTableCount = qFromBigEndian<quint16>(nameTable->count);
+ if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + sizeof(NameRecord) * nameTableCount))
+ return QString();
+
+ for (int i = 0; i < nameTableCount; ++i, ++nameRecord) {
+ if (qFromBigEndian<quint16>(nameRecord->nameID) == 1
+ && qFromBigEndian<quint16>(nameRecord->platformID) == 3 // Windows
+ && qFromBigEndian<quint16>(nameRecord->languageID) == 0x0409) { // US English
+ quint16 stringOffset = qFromBigEndian<quint16>(nameTable->stringOffset);
+ quint16 nameOffset = qFromBigEndian<quint16>(nameRecord->offset);
+ quint16 nameLength = qFromBigEndian<quint16>(nameRecord->length);
+
+ if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + stringOffset + nameOffset + nameLength))
+ return QString();
+
+ const void *ptr = reinterpret_cast<const quint8 *>(nameTable)
+ + stringOffset
+ + nameOffset;
+
+ const quint16 *s = reinterpret_cast<const quint16 *>(ptr);
+ const quint16 *e = s + nameLength / sizeof(quint16);
+ while (s != e)
+ name += QChar( qFromBigEndian<quint16>(*s++));
+ break;
+ }
+ }
+ }
+
+ return name;
+}
+
+void QWindowsFontDatabaseBase::EmbeddedFont::updateFromOS2Table(QFontEngine *fontEngine)
+{
+ TableDirectory *os2TableEntry = static_cast<TableDirectory *>(tableDirectoryEntry("OS/2"));
+ if (os2TableEntry != nullptr) {
+ const OS2Table *os2Table =
+ reinterpret_cast<const OS2Table *>(m_fontData.constData()
+ + qFromBigEndian<quint32>(os2TableEntry->offset));
+
+ bool italic = qFromBigEndian<quint16>(os2Table->selection) & (1 << 0);
+ bool oblique = qFromBigEndian<quint16>(os2Table->selection) & (1 << 9);
+
+ if (italic)
+ fontEngine->fontDef.style = QFont::StyleItalic;
+ else if (oblique)
+ fontEngine->fontDef.style = QFont::StyleOblique;
+ else
+ fontEngine->fontDef.style = QFont::StyleNormal;
+
+ fontEngine->fontDef.weight = QPlatformFontDatabase::weightFromInteger(qFromBigEndian<quint16>(os2Table->weightClass));
+ }
+}
+
+QString QWindowsFontDatabaseBase::EmbeddedFont::changeFamilyName(const QString &newFamilyName)
+{
+ TableDirectory *nameTableDirectoryEntry = static_cast<TableDirectory *>(tableDirectoryEntry("name"));
+ if (nameTableDirectoryEntry == nullptr)
+ return QString();
+
+ QString oldFamilyName = familyName(nameTableDirectoryEntry);
+
+ // Reserve size for name table header, five required name records and string
+ const int requiredRecordCount = 5;
+ quint16 nameIds[requiredRecordCount] = { 1, 2, 3, 4, 6 };
+
+ int sizeOfHeader = sizeof(NameTable) + sizeof(NameRecord) * requiredRecordCount;
+ int newFamilyNameSize = newFamilyName.size() * int(sizeof(quint16));
+
+ const QString regularString = QString::fromLatin1("Regular");
+ int regularStringSize = regularString.size() * int(sizeof(quint16));
+
+ // Align table size of table to 32 bits (pad with 0)
+ int fullSize = ((sizeOfHeader + newFamilyNameSize + regularStringSize) & ~3) + 4;
+
+ QByteArray newNameTable(fullSize, char(0));
+
+ {
+ NameTable *nameTable = reinterpret_cast<NameTable *>(newNameTable.data());
+ nameTable->count = qbswap<quint16>(requiredRecordCount);
+ nameTable->stringOffset = qbswap<quint16>(sizeOfHeader);
+
+ NameRecord *nameRecord = reinterpret_cast<NameRecord *>(nameTable + 1);
+ for (int i = 0; i < requiredRecordCount; ++i, nameRecord++) {
+ nameRecord->nameID = qbswap<quint16>(nameIds[i]);
+ nameRecord->encodingID = qbswap<quint16>(1);
+ nameRecord->languageID = qbswap<quint16>(0x0409);
+ nameRecord->platformID = qbswap<quint16>(3);
+ nameRecord->length = qbswap<quint16>(newFamilyNameSize);
+
+ // Special case for sub-family
+ if (nameIds[i] == 4) {
+ nameRecord->offset = qbswap<quint16>(newFamilyNameSize);
+ nameRecord->length = qbswap<quint16>(regularStringSize);
+ }
+ }
+
+ // nameRecord now points to string data
+ quint16 *stringStorage = reinterpret_cast<quint16 *>(nameRecord);
+ const quint16 *sourceString = newFamilyName.utf16();
+ for (int i = 0; i < newFamilyName.size(); ++i)
+ stringStorage[i] = qbswap<quint16>(sourceString[i]);
+ stringStorage += newFamilyName.size();
+
+ sourceString = regularString.utf16();
+ for (int i = 0; i < regularString.size(); ++i)
+ stringStorage[i] = qbswap<quint16>(sourceString[i]);
+ }
+
+ quint32 *p = reinterpret_cast<quint32 *>(newNameTable.data());
+ quint32 *tableEnd = reinterpret_cast<quint32 *>(newNameTable.data() + fullSize);
+
+ quint32 checkSum = 0;
+ while (p < tableEnd)
+ checkSum += qFromBigEndian<quint32>(*(p++));
+
+ nameTableDirectoryEntry->checkSum = qbswap<quint32>(checkSum);
+ nameTableDirectoryEntry->offset = qbswap<quint32>(m_fontData.size());
+ nameTableDirectoryEntry->length = qbswap<quint32>(fullSize);
+
+ m_fontData.append(newNameTable);
+
+ return oldFamilyName;
+}
+
+#if !defined(QT_NO_DIRECTWRITE)
+
+namespace {
+ class DirectWriteFontFileStream: public IDWriteFontFileStream
+ {
+ Q_DISABLE_COPY(DirectWriteFontFileStream)
+ public:
+ DirectWriteFontFileStream(const QByteArray &fontData)
+ : m_fontData(fontData)
+ , m_referenceCount(0)
+ {
+ }
+ virtual ~DirectWriteFontFileStream()
+ {
+ }
+
+ HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **object);
+ ULONG STDMETHODCALLTYPE AddRef();
+ ULONG STDMETHODCALLTYPE Release();
+
+ HRESULT STDMETHODCALLTYPE ReadFileFragment(const void **fragmentStart, UINT64 fileOffset,
+ UINT64 fragmentSize, OUT void **fragmentContext);
+ void STDMETHODCALLTYPE ReleaseFileFragment(void *fragmentContext);
+ HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64 *fileSize);
+ HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64 *lastWriteTime);
+
+ private:
+ QByteArray m_fontData;
+ ULONG m_referenceCount;
+ };
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::QueryInterface(REFIID iid, void **object)
+ {
+ if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {
+ *object = this;
+ AddRef();
+ return S_OK;
+ } else {
+ *object = NULL;
+ return E_NOINTERFACE;
+ }
+ }
+
+ ULONG STDMETHODCALLTYPE DirectWriteFontFileStream::AddRef()
+ {
+ return InterlockedIncrement(&m_referenceCount);
+ }
+
+ ULONG STDMETHODCALLTYPE DirectWriteFontFileStream::Release()
+ {
+ ULONG newCount = InterlockedDecrement(&m_referenceCount);
+ if (newCount == 0)
+ delete this;
+ return newCount;
+ }
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::ReadFileFragment(
+ const void **fragmentStart,
+ UINT64 fileOffset,
+ UINT64 fragmentSize,
+ OUT void **fragmentContext)
+ {
+ *fragmentContext = NULL;
+ if (fileOffset + fragmentSize <= quint64(m_fontData.size())) {
+ *fragmentStart = m_fontData.data() + fileOffset;
+ return S_OK;
+ } else {
+ *fragmentStart = NULL;
+ return E_FAIL;
+ }
+ }
+
+ void STDMETHODCALLTYPE DirectWriteFontFileStream::ReleaseFileFragment(void *)
+ {
+ }
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::GetFileSize(UINT64 *fileSize)
+ {
+ *fileSize = m_fontData.size();
+ return S_OK;
+ }
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::GetLastWriteTime(UINT64 *lastWriteTime)
+ {
+ *lastWriteTime = 0;
+ return E_NOTIMPL;
+ }
+
+ class DirectWriteFontFileLoader: public IDWriteFontFileLoader
+ {
+ public:
+ DirectWriteFontFileLoader() : m_referenceCount(0) {}
+ virtual ~DirectWriteFontFileLoader()
+ {
+ }
+
+ inline void addKey(const void *key, const QByteArray &fontData)
+ {
+ Q_ASSERT(!m_fontDatas.contains(key));
+ m_fontDatas.insert(key, fontData);
+ }
+
+ inline void removeKey(const void *key)
+ {
+ m_fontDatas.remove(key);
+ }
+
+ HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **object);
+ ULONG STDMETHODCALLTYPE AddRef();
+ ULONG STDMETHODCALLTYPE Release();
+
+ HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const *fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ OUT IDWriteFontFileStream **fontFileStream);
+
+ private:
+ ULONG m_referenceCount;
+ QHash<const void *, QByteArray> m_fontDatas;
+ };
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileLoader::QueryInterface(const IID &iid,
+ void **object)
+ {
+ if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) {
+ *object = this;
+ AddRef();
+ return S_OK;
+ } else {
+ *object = NULL;
+ return E_NOINTERFACE;
+ }
+ }
+
+ ULONG STDMETHODCALLTYPE DirectWriteFontFileLoader::AddRef()
+ {
+ return InterlockedIncrement(&m_referenceCount);
+ }
+
+ ULONG STDMETHODCALLTYPE DirectWriteFontFileLoader::Release()
+ {
+ ULONG newCount = InterlockedDecrement(&m_referenceCount);
+ if (newCount == 0)
+ delete this;
+ return newCount;
+ }
+
+ HRESULT STDMETHODCALLTYPE DirectWriteFontFileLoader::CreateStreamFromKey(
+ void const *fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ IDWriteFontFileStream **fontFileStream)
+ {
+ Q_UNUSED(fontFileReferenceKeySize);
+
+ if (fontFileReferenceKeySize != sizeof(const void *)) {
+ qWarning("%s: Wrong key size", __FUNCTION__);
+ return E_FAIL;
+ }
+
+ const void *key = *reinterpret_cast<void * const *>(fontFileReferenceKey);
+ *fontFileStream = NULL;
+ auto it = m_fontDatas.constFind(key);
+ if (it == m_fontDatas.constEnd())
+ return E_FAIL;
+
+ QByteArray fontData = it.value();
+ DirectWriteFontFileStream *stream = new DirectWriteFontFileStream(fontData);
+ stream->AddRef();
+ *fontFileStream = stream;
+
+ return S_OK;
+ }
+
+ class CustomFontFileLoader
+ {
+ public:
+ CustomFontFileLoader(IDWriteFactory *factory)
+ {
+ m_directWriteFactory = factory;
+
+ if (m_directWriteFactory) {
+ m_directWriteFactory->AddRef();
+
+ m_directWriteFontFileLoader = new DirectWriteFontFileLoader();
+ m_directWriteFactory->RegisterFontFileLoader(m_directWriteFontFileLoader);
+ }
+ }
+
+ ~CustomFontFileLoader()
+ {
+ if (m_directWriteFactory != nullptr && m_directWriteFontFileLoader != nullptr)
+ m_directWriteFactory->UnregisterFontFileLoader(m_directWriteFontFileLoader);
+
+ if (m_directWriteFactory != nullptr)
+ m_directWriteFactory->Release();
+ }
+
+ void addKey(const void *key, const QByteArray &fontData)
+ {
+ if (m_directWriteFontFileLoader != nullptr)
+ m_directWriteFontFileLoader->addKey(key, fontData);
+ }
+
+ void removeKey(const void *key)
+ {
+ if (m_directWriteFontFileLoader != nullptr)
+ m_directWriteFontFileLoader->removeKey(key);
+ }
+
+ IDWriteFontFileLoader *loader() const
+ {
+ return m_directWriteFontFileLoader;
+ }
+
+ private:
+ IDWriteFactory *m_directWriteFactory = nullptr;
+ DirectWriteFontFileLoader *m_directWriteFontFileLoader = nullptr;
+ };
+} // Anonymous namespace
+
+#endif // !defined(QT_NO_DIRECTWRITE)
+
+
+QWindowsFontEngineData::~QWindowsFontEngineData()
+{
+ if (hdc)
+ DeleteDC(hdc);
+
+#if !defined(QT_NO_DIRECTWRITE)
+ if (directWriteGdiInterop)
+ directWriteGdiInterop->Release();
+ if (directWriteFactory)
+ directWriteFactory->Release();
+#endif
+}
+
+QWindowsFontDatabaseBase::QWindowsFontDatabaseBase()
+{
+}
+
+QWindowsFontDatabaseBase::~QWindowsFontDatabaseBase()
+{
+}
+
+typedef QSharedPointer<QWindowsFontEngineData> QWindowsFontEngineDataPtr;
+typedef QThreadStorage<QWindowsFontEngineDataPtr> FontEngineThreadLocalData;
+Q_GLOBAL_STATIC(FontEngineThreadLocalData, fontEngineThreadLocalData)
+
+QSharedPointer<QWindowsFontEngineData> QWindowsFontDatabaseBase::data()
+{
+ FontEngineThreadLocalData *data = fontEngineThreadLocalData();
+ if (!data->hasLocalData())
+ data->setLocalData(QSharedPointer<QWindowsFontEngineData>::create());
+
+ if (!init(data->localData()))
+ qCWarning(lcQpaFonts) << "Cannot initialize common font database data";
+
+ return data->localData();
+}
+
+bool QWindowsFontDatabaseBase::init(QSharedPointer<QWindowsFontEngineData> d)
+{
+#if !defined(QT_NO_DIRECTWRITE)
+ if (!d->directWriteFactory) {
+ createDirectWriteFactory(&d->directWriteFactory);
+ if (!d->directWriteFactory)
+ return false;
+ }
+ if (!d->directWriteGdiInterop) {
+ const HRESULT hr = d->directWriteFactory->GetGdiInterop(&d->directWriteGdiInterop);
+ if (FAILED(hr)) {
+ qErrnoWarning("%s: GetGdiInterop failed", __FUNCTION__);
+ return false;
+ }
+ }
+#endif
+ return true;
+}
+
+#if !defined(QT_NO_DIRECTWRITE)
+// ### Qt 6: Link directly to dwrite instead
+typedef HRESULT (WINAPI *DWriteCreateFactoryType)(DWRITE_FACTORY_TYPE, const IID &, IUnknown **);
+static inline DWriteCreateFactoryType resolveDWriteCreateFactory()
+{
+ QSystemLibrary library(QStringLiteral("dwrite"));
+ QFunctionPointer result = library.resolve("DWriteCreateFactory");
+ if (Q_UNLIKELY(!result)) {
+ qWarning("Unable to load dwrite.dll");
+ return nullptr;
+ }
+ return reinterpret_cast<DWriteCreateFactoryType>(result);
+}
+
+void QWindowsFontDatabaseBase::createDirectWriteFactory(IDWriteFactory **factory)
+{
+ *factory = nullptr;
+
+ static const DWriteCreateFactoryType dWriteCreateFactory = resolveDWriteCreateFactory();
+ if (!dWriteCreateFactory)
+ return;
+
+ IUnknown *result = nullptr;
+# if defined(QT_USE_DIRECTWRITE3)
+ dWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory3), &result);
+# endif
+
+# if defined(QT_USE_DIRECTWRITE2)
+ if (result == nullptr)
+ dWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory2), &result);
+# endif
+
+ if (result == nullptr) {
+ if (FAILED(dWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), &result))) {
+ qErrnoWarning("DWriteCreateFactory failed");
+ return;
+ }
+ }
+
+ *factory = static_cast<IDWriteFactory *>(result);
+}
+#endif // !defined(QT_NO_DIRECTWRITE)
+
+int QWindowsFontDatabaseBase::defaultVerticalDPI()
+{
+ static int vDPI = -1;
+ if (vDPI == -1) {
+ if (HDC defaultDC = GetDC(0)) {
+ vDPI = GetDeviceCaps(defaultDC, LOGPIXELSY);
+ ReleaseDC(0, defaultDC);
+ } else {
+ // FIXME: Resolve now or return 96 and keep unresolved?
+ vDPI = 96;
+ }
+ }
+ return vDPI;
+}
+
+LOGFONT QWindowsFontDatabaseBase::fontDefToLOGFONT(const QFontDef &request, const QString &faceName)
+{
+ LOGFONT lf;
+ memset(&lf, 0, sizeof(LOGFONT));
+
+ lf.lfHeight = -qRound(request.pixelSize);
+ lf.lfWidth = 0;
+ lf.lfEscapement = 0;
+ lf.lfOrientation = 0;
+ if (request.weight == 50)
+ lf.lfWeight = FW_DONTCARE;
+ else
+ lf.lfWeight = (request.weight*900)/99;
+ lf.lfItalic = request.style != QFont::StyleNormal;
+ lf.lfCharSet = DEFAULT_CHARSET;
+
+ int strat = OUT_DEFAULT_PRECIS;
+ if (request.styleStrategy & QFont::PreferBitmap) {
+ strat = OUT_RASTER_PRECIS;
+ } else if (request.styleStrategy & QFont::PreferDevice) {
+ strat = OUT_DEVICE_PRECIS;
+ } else if (request.styleStrategy & QFont::PreferOutline) {
+ strat = OUT_OUTLINE_PRECIS;
+ } else if (request.styleStrategy & QFont::ForceOutline) {
+ strat = OUT_TT_ONLY_PRECIS;
+ }
+
+ lf.lfOutPrecision = strat;
+
+ int qual = DEFAULT_QUALITY;
+
+ if (request.styleStrategy & QFont::PreferMatch)
+ qual = DRAFT_QUALITY;
+ else if (request.styleStrategy & QFont::PreferQuality)
+ qual = PROOF_QUALITY;
+
+ if (request.styleStrategy & QFont::PreferAntialias) {
+ qual = (request.styleStrategy & QFont::NoSubpixelAntialias) == 0
+ ? CLEARTYPE_QUALITY : ANTIALIASED_QUALITY;
+ } else if (request.styleStrategy & QFont::NoAntialias) {
+ qual = NONANTIALIASED_QUALITY;
+ } else if ((request.styleStrategy & QFont::NoSubpixelAntialias) && data()->clearTypeEnabled) {
+ qual = ANTIALIASED_QUALITY;
+ }
+
+ lf.lfQuality = qual;
+
+ lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
+
+ int hint = FF_DONTCARE;
+ switch (request.styleHint) {
+ case QFont::Helvetica:
+ hint = FF_SWISS;
+ break;
+ case QFont::Times:
+ hint = FF_ROMAN;
+ break;
+ case QFont::Courier:
+ hint = FF_MODERN;
+ break;
+ case QFont::OldEnglish:
+ hint = FF_DECORATIVE;
+ break;
+ case QFont::System:
+ hint = FF_MODERN;
+ break;
+ default:
+ break;
+ }
+
+ lf.lfPitchAndFamily = DEFAULT_PITCH | hint;
+
+ QString fam = faceName;
+ if (fam.isEmpty())
+ fam = request.families.size() > 0 ? request.families.at(0) : request.family;
+ if (Q_UNLIKELY(fam.size() >= LF_FACESIZE)) {
+ qCritical("%s: Family name '%s' is too long.", __FUNCTION__, qPrintable(fam));
+ fam.truncate(LF_FACESIZE - 1);
+ }
+
+ if (fam.isEmpty())
+ fam = QStringLiteral("MS Sans Serif");
+
+ if (fam == QLatin1String("MS Sans Serif")
+ && (request.style == QFont::StyleItalic || (-lf.lfHeight > 18 && -lf.lfHeight != 24))) {
+ fam = QStringLiteral("Arial"); // MS Sans Serif has bearing problems in italic, and does not scale
+ }
+ if (fam == QLatin1String("Courier") && !(request.styleStrategy & QFont::PreferBitmap))
+ fam = QStringLiteral("Courier New");
+
+ memcpy(lf.lfFaceName, fam.utf16(), fam.size() * sizeof(wchar_t));
+
+ return lf;
+}
+
+QFont QWindowsFontDatabaseBase::LOGFONT_to_QFont(const LOGFONT& logFont, int verticalDPI_In)
+{
+ if (verticalDPI_In <= 0)
+ verticalDPI_In = defaultVerticalDPI();
+ QFont qFont(QString::fromWCharArray(logFont.lfFaceName));
+ qFont.setItalic(logFont.lfItalic);
+ if (logFont.lfWeight != FW_DONTCARE)
+ qFont.setWeight(QPlatformFontDatabase::weightFromInteger(logFont.lfWeight));
+ const qreal logFontHeight = qAbs(logFont.lfHeight);
+ qFont.setPointSizeF(logFontHeight * 72.0 / qreal(verticalDPI_In));
+ qFont.setUnderline(logFont.lfUnderline);
+ qFont.setOverline(false);
+ qFont.setStrikeOut(logFont.lfStrikeOut);
+ return qFont;
+}
+
+// ### fixme Qt 6 (QTBUG-58610): See comment at QWindowsFontDatabase::systemDefaultFont()
+HFONT QWindowsFontDatabaseBase::systemFont()
+{
+ static const auto stock_sysfont =
+ reinterpret_cast<HFONT>(GetStockObject(DEFAULT_GUI_FONT));
+ return stock_sysfont;
+}
+
+QFont QWindowsFontDatabaseBase::systemDefaultFont()
+{
+#if QT_VERSION >= 0x060000
+ // Qt 6: Obtain default GUI font (typically "Segoe UI, 9pt", see QTBUG-58610)
+ NONCLIENTMETRICS ncm;
+ ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, lfMessageFont) + sizeof(LOGFONT);
+ SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize , &ncm, 0);
+ const QFont systemFont = QWindowsFontDatabase::LOGFONT_to_QFont(ncm.lfMessageFont);
+#else
+ LOGFONT lf;
+ GetObject(systemFont(), sizeof(lf), &lf);
+ QFont systemFont = LOGFONT_to_QFont(lf);
+ // "MS Shell Dlg 2" is the correct system font >= Win2k
+ if (systemFont.family() == QLatin1String("MS Shell Dlg"))
+ systemFont.setFamily(QStringLiteral("MS Shell Dlg 2"));
+ // Qt 5 by (Qt 4) legacy uses GetStockObject(DEFAULT_GUI_FONT) to
+ // obtain the default GUI font (typically "MS Shell Dlg 2, 8pt"). This has been
+ // long deprecated; the message font of the NONCLIENTMETRICS structure obtained by
+ // SystemParametersInfo(SPI_GETNONCLIENTMETRICS) should be used instead (see
+ // QWindowsTheme::refreshFonts(), typically "Segoe UI, 9pt"), which is larger.
+#endif // Qt 5
+ qCDebug(lcQpaFonts) << __FUNCTION__ << systemFont;
+ return systemFont;
+}
+
+#if !defined(QT_NO_DIRECTWRITE)
+IDWriteFontFace *QWindowsFontDatabaseBase::createDirectWriteFace(const QByteArray &fontData) const
+{
+ QSharedPointer<QWindowsFontEngineData> fontEngineData = data();
+ if (fontEngineData->directWriteFactory == nullptr) {
+ qCWarning(lcQpaFonts) << "DirectWrite factory not created in QWindowsFontDatabaseBase::createDirectWriteFace()";
+ return nullptr;
+ }
+
+ CustomFontFileLoader fontFileLoader(fontEngineData->directWriteFactory);
+ fontFileLoader.addKey(this, fontData);
+
+ IDWriteFontFile *fontFile = nullptr;
+ const void *key = this;
+
+ HRESULT hres = fontEngineData->directWriteFactory->CreateCustomFontFileReference(&key,
+ sizeof(void *),
+ fontFileLoader.loader(),
+ &fontFile);
+ if (FAILED(hres)) {
+ qErrnoWarning(hres, "%s: CreateCustomFontFileReference failed", __FUNCTION__);
+ return nullptr;
+ }
+
+ BOOL isSupportedFontType;
+ DWRITE_FONT_FILE_TYPE fontFileType;
+ DWRITE_FONT_FACE_TYPE fontFaceType;
+ UINT32 numberOfFaces;
+ fontFile->Analyze(&isSupportedFontType, &fontFileType, &fontFaceType, &numberOfFaces);
+ if (!isSupportedFontType) {
+ fontFile->Release();
+ return nullptr;
+ }
+
+ // ### Currently no support for .ttc, but we could easily return a list here.
+ IDWriteFontFace *directWriteFontFace = nullptr;
+ hres = fontEngineData->directWriteFactory->CreateFontFace(fontFaceType,
+ 1,
+ &fontFile,
+ 0,
+ DWRITE_FONT_SIMULATIONS_NONE,
+ &directWriteFontFace);
+ if (FAILED(hres)) {
+ qErrnoWarning(hres, "%s: CreateFontFace failed", __FUNCTION__);
+ fontFile->Release();
+ return nullptr;
+ }
+
+ fontFile->Release();
+ return directWriteFontFace;
+}
+#endif // !defined(QT_NO_DIRECTWRITE)
+
+QFontEngine *QWindowsFontDatabaseBase::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference)
+{
+ QFontEngine *fontEngine = nullptr;
+
+#if !defined(QT_NO_DIRECTWRITE)
+ QSharedPointer<QWindowsFontEngineData> fontEngineData = data();
+ if (fontEngineData->directWriteFactory == nullptr)
+ return nullptr;
+
+ IDWriteFontFace *directWriteFontFace = createDirectWriteFace(fontData);
+ fontEngine = new QWindowsFontEngineDirectWrite(directWriteFontFace,
+ pixelSize,
+ fontEngineData);
+
+ // Get font family from font data
+ EmbeddedFont font(fontData);
+ font.updateFromOS2Table(fontEngine);
+ fontEngine->fontDef.family = font.familyName();
+ fontEngine->fontDef.hintingPreference = hintingPreference;
+
+ directWriteFontFace->Release();
+#else // !defined(QT_NO_DIRECTWRITE)
+ Q_UNUSED(fontData);
+ Q_UNUSED(pixelSize);
+ Q_UNUSED(hintingPreference);
+#endif
+
+ return fontEngine;
+}
+
+QString QWindowsFontDatabaseBase::familyForStyleHint(QFont::StyleHint styleHint)
+{
+ switch (styleHint) {
+ case QFont::Times:
+ return QStringLiteral("Times New Roman");
+ case QFont::Courier:
+ return QStringLiteral("Courier New");
+ case QFont::Monospace:
+ return QStringLiteral("Courier New");
+ case QFont::Cursive:
+ return QStringLiteral("Comic Sans MS");
+ case QFont::Fantasy:
+ return QStringLiteral("Impact");
+ case QFont::Decorative:
+ return QStringLiteral("Old English");
+ case QFont::Helvetica:
+ return QStringLiteral("Arial");
+ case QFont::System:
+ default:
+ break;
+ }
+ return QStringLiteral("MS Shell Dlg 2");
+}
+
+// Creation functions
+
+static const char *other_tryFonts[] = {
+ "Arial",
+ "MS UI Gothic",
+ "Gulim",
+ "SimSun",
+ "PMingLiU",
+ "Arial Unicode MS",
+ 0
+};
+
+static const char *jp_tryFonts [] = {
+ "MS UI Gothic",
+ "Arial",
+ "Gulim",
+ "SimSun",
+ "PMingLiU",
+ "Arial Unicode MS",
+ 0
+};
+
+static const char *ch_CN_tryFonts [] = {
+ "SimSun",
+ "Arial",
+ "PMingLiU",
+ "Gulim",
+ "MS UI Gothic",
+ "Arial Unicode MS",
+ 0
+};
+
+static const char *ch_TW_tryFonts [] = {
+ "PMingLiU",
+ "Arial",
+ "SimSun",
+ "Gulim",
+ "MS UI Gothic",
+ "Arial Unicode MS",
+ 0
+};
+
+static const char *kr_tryFonts[] = {
+ "Gulim",
+ "Arial",
+ "PMingLiU",
+ "SimSun",
+ "MS UI Gothic",
+ "Arial Unicode MS",
+ 0
+};
+
+static const char **tryFonts = nullptr;
+
+QStringList QWindowsFontDatabaseBase::extraTryFontsForFamily(const QString &family)
+{
+ QStringList result;
+ QFontDatabase db;
+ if (!db.writingSystems(family).contains(QFontDatabase::Symbol)) {
+ if (!tryFonts) {
+ LANGID lid = GetUserDefaultLangID();
+ switch (lid&0xff) {
+ case LANG_CHINESE: // Chinese
+ if ( lid == 0x0804 || lid == 0x1004) // China mainland and Singapore
+ tryFonts = ch_CN_tryFonts;
+ else
+ tryFonts = ch_TW_tryFonts; // Taiwan, Hong Kong and Macau
+ break;
+ case LANG_JAPANESE:
+ tryFonts = jp_tryFonts;
+ break;
+ case LANG_KOREAN:
+ tryFonts = kr_tryFonts;
+ break;
+ default:
+ tryFonts = other_tryFonts;
+ break;
+ }
+ }
+ QFontDatabase db;
+ const QStringList families = db.families();
+ const char **tf = tryFonts;
+ while (tf && *tf) {
+ // QTBUG-31689, family might be an English alias for a localized font name.
+ const QString family = QString::fromLatin1(*tf);
+ if (families.contains(family) || db.hasFamily(family))
+ result << family;
+ ++tf;
+ }
+ }
+ result.append(QStringLiteral("Segoe UI Emoji"));
+ result.append(QStringLiteral("Segoe UI Symbol"));
+ return result;
+}
+
+QT_END_NAMESPACE
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase_p.h b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase_p.h
new file mode 100644
index 0000000000..5b9db5dede
--- /dev/null
+++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabasebase_p.h
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWINDOWSFONTDATABASEBASE_P_H
+#define QWINDOWSFONTDATABASEBASE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qpa/qplatformfontdatabase.h>
+#include <QtCore/QSharedPointer>
+#include <QtCore/QLoggingCategory>
+#include <QtCore/qt_windows.h>
+
+#if !defined(QT_NO_DIRECTWRITE)
+ struct IDWriteFactory;
+ struct IDWriteGdiInterop;
+ struct IDWriteFontFace;
+#endif
+
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_LOGGING_CATEGORY(lcQpaFonts);
+
+class QWindowsFontEngineData
+{
+ Q_DISABLE_COPY_MOVE(QWindowsFontEngineData)
+public:
+ QWindowsFontEngineData();
+ ~QWindowsFontEngineData();
+
+ uint pow_gamma[256];
+
+ bool clearTypeEnabled = false;
+ qreal fontSmoothingGamma;
+ HDC hdc = 0;
+#if !defined(QT_NO_DIRECTWRITE)
+ IDWriteFactory *directWriteFactory = nullptr;
+ IDWriteGdiInterop *directWriteGdiInterop = nullptr;
+#endif
+};
+
+class QWindowsFontDatabaseBase : public QPlatformFontDatabase
+{
+public:
+ QWindowsFontDatabaseBase();
+ ~QWindowsFontDatabaseBase() override;
+
+ QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) override;
+
+ static int defaultVerticalDPI();
+ static QSharedPointer<QWindowsFontEngineData> data();
+#if !defined(QT_NO_DIRECTWRITE)
+ static void createDirectWriteFactory(IDWriteFactory **factory);
+#endif
+ static QFont systemDefaultFont();
+ static HFONT systemFont();
+ static LOGFONT fontDefToLOGFONT(const QFontDef &fontDef, const QString &faceName);
+ static QFont LOGFONT_to_QFont(const LOGFONT& lf, int verticalDPI = 0);
+
+ static QString familyForStyleHint(QFont::StyleHint styleHint);
+ static QStringList extraTryFontsForFamily(const QString &family);
+
+ class FontTable{};
+ class EmbeddedFont
+ {
+ public:
+ EmbeddedFont(const QByteArray &fontData) : m_fontData(fontData) {}
+
+ QString changeFamilyName(const QString &newFamilyName);
+ QByteArray data() const { return m_fontData; }
+ void updateFromOS2Table(QFontEngine *fontEngine);
+ FontTable *tableDirectoryEntry(const QByteArray &tagName);
+ QString familyName(FontTable *nameTableDirectory = nullptr);
+
+ private:
+ QByteArray m_fontData;
+ };
+
+protected:
+
+#if !defined(QT_NO_DIRECTWRITE)
+ IDWriteFontFace *createDirectWriteFace(const QByteArray &fontData) const;
+#endif
+
+private:
+ static bool init(QSharedPointer<QWindowsFontEngineData> data);
+};
+
+QT_END_NAMESPACE
+
+#endif // QWINDOWSFONTDATABASEBASE_P_H
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp
index a79d9a3aa7..04b6c6888d 100644
--- a/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp
+++ b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp
@@ -188,6 +188,18 @@ namespace {
}
+static DWRITE_MEASURING_MODE renderModeToMeasureMode(DWRITE_RENDERING_MODE renderMode)
+{
+ switch (renderMode) {
+ case DWRITE_RENDERING_MODE_GDI_CLASSIC:
+ return DWRITE_MEASURING_MODE_GDI_CLASSIC;
+ case DWRITE_RENDERING_MODE_GDI_NATURAL:
+ return DWRITE_MEASURING_MODE_GDI_NATURAL;
+ default:
+ return DWRITE_MEASURING_MODE_NATURAL;
+ }
+}
+
static DWRITE_RENDERING_MODE hintingPreferenceToRenderingMode(QFont::HintingPreference hintingPreference)
{
if (QHighDpiScaling::isActive() && hintingPreference == QFont::PreferDefaultHinting)
@@ -209,13 +221,10 @@ static DWRITE_RENDERING_MODE hintingPreferenceToRenderingMode(QFont::HintingPref
\internal
Font engine for subpixel positioned text on Windows Vista
- (with platform update) and Windows 7. If selected during
+ (with platform update) and later. If selected during
configuration, the engine will be selected only when the hinting
- preference of a font is set to None or Vertical hinting. The font
- database uses most of the same logic but creates a direct write
- font based on the LOGFONT rather than a GDI handle.
-
- Will probably be superseded by a common Free Type font engine in Qt 5.X.
+ preference of a font is set to None or Vertical hinting, or
+ when fontengine=directwrite is selected as platform option.
*/
QWindowsFontEngineDirectWrite::QWindowsFontEngineDirectWrite(IDWriteFontFace *directWriteFontFace,
@@ -480,9 +489,22 @@ void QWindowsFontEngineDirectWrite::recalcAdvances(QGlyphLayout *glyphs, QFontEn
glyphIndices[i] = UINT16(glyphs->glyphs[i]);
QVarLengthArray<DWRITE_GLYPH_METRICS> glyphMetrics(glyphIndices.size());
- HRESULT hr = m_directWriteFontFace->GetDesignGlyphMetrics(glyphIndices.data(),
- glyphIndices.size(),
- glyphMetrics.data());
+
+ HRESULT hr;
+ DWRITE_RENDERING_MODE renderMode = hintingPreferenceToRenderingMode(QFont::HintingPreference(fontDef.hintingPreference));
+ if (renderMode == DWRITE_RENDERING_MODE_GDI_CLASSIC || renderMode == DWRITE_RENDERING_MODE_GDI_NATURAL) {
+ hr = m_directWriteFontFace->GetGdiCompatibleGlyphMetrics(float(fontDef.pixelSize),
+ 1.0f,
+ NULL,
+ TRUE,
+ glyphIndices.data(),
+ glyphIndices.size(),
+ glyphMetrics.data());
+ } else {
+ hr = m_directWriteFontFace->GetDesignGlyphMetrics(glyphIndices.data(),
+ glyphIndices.size(),
+ glyphMetrics.data());
+ }
if (SUCCEEDED(hr)) {
qreal stretch = fontDef.stretch != QFont::AnyStretch ? fontDef.stretch / 100.0 : 1.0;
for (int i = 0; i < glyphs->numGlyphs; ++i)
@@ -715,6 +737,8 @@ QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t,
DWRITE_RENDERING_MODE renderMode =
hintingPreferenceToRenderingMode(QFont::HintingPreference(fontDef.hintingPreference));
+ DWRITE_MEASURING_MODE measureMode =
+ renderModeToMeasureMode(renderMode);
IDWriteGlyphRunAnalysis *glyphAnalysis = NULL;
HRESULT hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
@@ -722,7 +746,7 @@ QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t,
1.0f,
&transform,
renderMode,
- DWRITE_MEASURING_MODE_NATURAL,
+ measureMode,
margin, margin,
&glyphAnalysis
);
@@ -752,7 +776,7 @@ QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t,
0.0f,
&glyphRun,
NULL,
- DWRITE_MEASURING_MODE_NATURAL,
+ measureMode,
NULL,
0,
&enumerator);
@@ -783,7 +807,7 @@ QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t,
1.0f,
&transform,
renderMode,
- DWRITE_MEASURING_MODE_NATURAL,
+ measureMode,
0.0, 0.0,
&colorGlyphsAnalysis
);
@@ -1023,6 +1047,7 @@ glyph_metrics_t QWindowsFontEngineDirectWrite::alphaMapBoundingBox(glyph_t glyph
DWRITE_RENDERING_MODE renderMode =
hintingPreferenceToRenderingMode(QFont::HintingPreference(fontDef.hintingPreference));
+ DWRITE_MEASURING_MODE measureMode = renderModeToMeasureMode(renderMode);
const int margin = glyphMargin(QFontEngine::Format_A32);
IDWriteGlyphRunAnalysis *glyphAnalysis = NULL;
@@ -1031,7 +1056,7 @@ glyph_metrics_t QWindowsFontEngineDirectWrite::alphaMapBoundingBox(glyph_t glyph
1.0f,
&transform,
renderMode,
- DWRITE_MEASURING_MODE_NATURAL,
+ measureMode,
margin, margin,
&glyphAnalysis
);
diff --git a/src/platformsupport/fontdatabases/windows/windows.pri b/src/platformsupport/fontdatabases/windows/windows.pri
index 7ddfb2c281..fbe6d490f9 100644
--- a/src/platformsupport/fontdatabases/windows/windows.pri
+++ b/src/platformsupport/fontdatabases/windows/windows.pri
@@ -2,11 +2,13 @@ QT *= gui-private
SOURCES += \
$$PWD/qwindowsfontdatabase.cpp \
+ $$PWD/qwindowsfontdatabasebase.cpp \
$$PWD/qwindowsfontengine.cpp \
$$PWD/qwindowsnativeimage.cpp
HEADERS += \
$$PWD/qwindowsfontdatabase_p.h \
+ $$PWD/qwindowsfontdatabasebase_p.h \
$$PWD/qwindowsfontengine_p.h \
$$PWD/qwindowsnativeimage_p.h
@@ -16,7 +18,13 @@ qtConfig(freetype) {
}
qtConfig(directwrite):qtConfig(direct2d) {
- qtConfig(directwrite2) {
+ qtConfig(directwrite3) {
+ QMAKE_USE_PRIVATE += dwrite_3
+ DEFINES *= QT_USE_DIRECTWRITE3 QT_USE_DIRECTWRITE2
+
+ SOURCES += $$PWD/qwindowsdirectwritefontdatabase.cpp
+ HEADERS += $$PWD/qwindowsdirectwritefontdatabase_p.h
+ } else: qtConfig(directwrite2) {
QMAKE_USE_PRIVATE += dwrite_2
DEFINES *= QT_USE_DIRECTWRITE2
} else {
diff --git a/src/platformsupport/glxconvenience/.prev_CMakeLists.txt b/src/platformsupport/glxconvenience/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..d3d2c87910
--- /dev/null
+++ b/src/platformsupport/glxconvenience/.prev_CMakeLists.txt
@@ -0,0 +1,21 @@
+# Generated from glxconvenience.pro.
+
+#####################################################################
+## GlxSupport Module:
+#####################################################################
+
+qt_add_module(GlxSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qglxconvenience.cpp qglxconvenience_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ X11::X11
+)
+
+#### Keys ignored in scope 1:.:.:glxconvenience.pro:<TRUE>:
+# MODULE = "glx_support"
diff --git a/src/platformsupport/glxconvenience/CMakeLists.txt b/src/platformsupport/glxconvenience/CMakeLists.txt
new file mode 100644
index 0000000000..00d2e6c754
--- /dev/null
+++ b/src/platformsupport/glxconvenience/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Generated from glxconvenience.pro.
+
+qt_find_package(X11) # special case
+
+#####################################################################
+## GlxSupport Module:
+#####################################################################
+
+qt_add_module(GlxSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qglxconvenience.cpp qglxconvenience_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ X11::X11
+)
+
+#### Keys ignored in scope 1:.:.:glxconvenience.pro:<TRUE>:
+# MODULE = "glx_support"
diff --git a/src/platformsupport/graphics/CMakeLists.txt b/src/platformsupport/graphics/CMakeLists.txt
new file mode 100644
index 0000000000..e9f0245dbe
--- /dev/null
+++ b/src/platformsupport/graphics/CMakeLists.txt
@@ -0,0 +1,20 @@
+# Generated from graphics.pro.
+
+#####################################################################
+## GraphicsSupport Module:
+#####################################################################
+
+qt_add_module(GraphicsSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qrasterbackingstore.cpp qrasterbackingstore_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:graphics.pro:<TRUE>:
+# MODULE = "graphics_support"
diff --git a/src/platformsupport/input/.prev_CMakeLists.txt b/src/platformsupport/input/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..f8c05e9f97
--- /dev/null
+++ b/src/platformsupport/input/.prev_CMakeLists.txt
@@ -0,0 +1,102 @@
+# Generated from input.pro.
+
+#####################################################################
+## InputSupport Module:
+#####################################################################
+
+qt_add_module(InputSupport
+ STATIC
+ INTERNAL_MODULE
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::DeviceDiscoverySupportPrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 3:.:.:input-support.pro:<TRUE>:
+# MODULE = "input_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev
+ SOURCES
+ evdevkeyboard/qevdevkeyboard_defaultmap_p.h
+ evdevkeyboard/qevdevkeyboardhandler.cpp evdevkeyboard/qevdevkeyboardhandler_p.h
+ evdevkeyboard/qevdevkeyboardmanager.cpp evdevkeyboard/qevdevkeyboardmanager_p.h
+ evdevmouse/qevdevmousehandler.cpp evdevmouse/qevdevmousehandler_p.h
+ evdevmouse/qevdevmousemanager.cpp evdevmouse/qevdevmousemanager_p.h
+ evdevtouch/qevdevtouchhandler.cpp evdevtouch/qevdevtouchhandler_p.h
+ evdevtouch/qevdevtouchmanager.cpp evdevtouch/qevdevtouchmanager_p.h
+ INCLUDE_DIRECTORIES
+ evdevtouch/../shared
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev AND QT_FEATURE_tabletevent
+ SOURCES
+ evdevtablet/qevdevtablethandler.cpp evdevtablet/qevdevtablethandler_p.h
+ evdevtablet/qevdevtabletmanager.cpp evdevtablet/qevdevtabletmanager_p.h
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev AND QT_FEATURE_libudev AND QT_FEATURE_tabletevent
+ LIBRARIES
+ PkgConfig::Libudev
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev AND QT_FEATURE_libudev
+ LIBRARIES
+ PkgConfig::Libudev
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev AND QT_FEATURE_mtdev
+ LIBRARIES
+ PkgConfig::Mtdev
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_tslib
+ SOURCES
+ tslib/qtslib.cpp tslib/qtslib_p.h
+ PUBLIC_LIBRARIES
+ PkgConfig::Tslib
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_libinput
+ SOURCES
+ libinput/qlibinputhandler.cpp libinput/qlibinputhandler_p.h
+ libinput/qlibinputkeyboard.cpp libinput/qlibinputkeyboard_p.h
+ libinput/qlibinputpointer.cpp libinput/qlibinputpointer_p.h
+ libinput/qlibinputtouch.cpp libinput/qlibinputtouch_p.h
+ INCLUDE_DIRECTORIES
+ libinput/../shared
+ LIBRARIES
+ Libinput::Libinput
+ PkgConfig::Libudev
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_libinput AND QT_FEATURE_xkbcommon
+ LIBRARIES
+ XKB::XKB
+ PUBLIC_LIBRARIES
+ Qt::XkbCommonSupportPrivate
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev OR QT_FEATURE_libinput
+ SOURCES
+ shared/devicehandlerlist_p.h
+ shared/qevdevutil.cpp shared/qevdevutil_p.h
+ shared/qtouchoutputmapping.cpp shared/qtouchoutputmapping_p.h
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_integrityhid
+ SOURCES
+ integrityhid/qintegrityhidmanager.cpp integrityhid/qintegrityhidmanager.h
+ LIBRARIES
+ integrityhid
+)
+if(QT_FEATURE_xkbcommon)
+ add_subdirectory(xkbcommon)
+endif()
diff --git a/src/platformsupport/input/CMakeLists.txt b/src/platformsupport/input/CMakeLists.txt
new file mode 100644
index 0000000000..7ab93df062
--- /dev/null
+++ b/src/platformsupport/input/CMakeLists.txt
@@ -0,0 +1,107 @@
+# Generated from input.pro.
+
+qt_find_package(Libinput) # special case
+qt_find_package(XKB) # special case
+qt_find_package(Tslib) # special case
+qt_find_package(Mtdev) # special case
+
+#####################################################################
+## InputSupport Module:
+#####################################################################
+
+qt_add_module(InputSupport
+ STATIC
+ INTERNAL_MODULE
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::DeviceDiscoverySupportPrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 3:.:.:input-support.pro:<TRUE>:
+# MODULE = "input_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev
+ SOURCES
+ evdevkeyboard/qevdevkeyboard_defaultmap_p.h
+ evdevkeyboard/qevdevkeyboardhandler.cpp evdevkeyboard/qevdevkeyboardhandler_p.h
+ evdevkeyboard/qevdevkeyboardmanager.cpp evdevkeyboard/qevdevkeyboardmanager_p.h
+ evdevmouse/qevdevmousehandler.cpp evdevmouse/qevdevmousehandler_p.h
+ evdevmouse/qevdevmousemanager.cpp evdevmouse/qevdevmousemanager_p.h
+ evdevtouch/qevdevtouchhandler.cpp evdevtouch/qevdevtouchhandler_p.h
+ evdevtouch/qevdevtouchmanager.cpp evdevtouch/qevdevtouchmanager_p.h
+ INCLUDE_DIRECTORIES
+ evdevtouch/../shared
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev AND QT_FEATURE_tabletevent
+ SOURCES
+ evdevtablet/qevdevtablethandler.cpp evdevtablet/qevdevtablethandler_p.h
+ evdevtablet/qevdevtabletmanager.cpp evdevtablet/qevdevtabletmanager_p.h
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev AND QT_FEATURE_libudev AND QT_FEATURE_tabletevent
+ LIBRARIES
+ PkgConfig::Libudev
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev AND QT_FEATURE_libudev
+ LIBRARIES
+ PkgConfig::Libudev
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev AND QT_FEATURE_mtdev
+ LIBRARIES
+ PkgConfig::Mtdev
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_tslib
+ SOURCES
+ tslib/qtslib.cpp tslib/qtslib_p.h
+ PUBLIC_LIBRARIES
+ PkgConfig::Tslib
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_libinput
+ SOURCES
+ libinput/qlibinputhandler.cpp libinput/qlibinputhandler_p.h
+ libinput/qlibinputkeyboard.cpp libinput/qlibinputkeyboard_p.h
+ libinput/qlibinputpointer.cpp libinput/qlibinputpointer_p.h
+ libinput/qlibinputtouch.cpp libinput/qlibinputtouch_p.h
+ INCLUDE_DIRECTORIES
+ libinput/../shared
+ LIBRARIES
+ Libinput::Libinput
+ PkgConfig::Libudev
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_libinput AND QT_FEATURE_xkbcommon
+ LIBRARIES
+ XKB::XKB
+ PUBLIC_LIBRARIES
+ Qt::XkbCommonSupportPrivate
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_evdev OR QT_FEATURE_libinput
+ SOURCES
+ shared/devicehandlerlist_p.h
+ shared/qevdevutil.cpp shared/qevdevutil_p.h
+ shared/qtouchoutputmapping.cpp shared/qtouchoutputmapping_p.h
+)
+
+qt_extend_target(InputSupport CONDITION QT_FEATURE_integrityhid
+ SOURCES
+ integrityhid/qintegrityhidmanager.cpp integrityhid/qintegrityhidmanager.h
+ LIBRARIES
+ integrityhid
+)
+if(QT_FEATURE_xkbcommon)
+ add_subdirectory(xkbcommon)
+endif()
diff --git a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
index 78728ef4ce..13829c040e 100644
--- a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
+++ b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
@@ -580,9 +580,7 @@ void QEvdevTouchScreenData::processInputEvent(input_event *data)
Qt::TouchPointStates combinedStates;
bool hasPressure = false;
- for (auto i = m_contacts.begin(), end = m_contacts.end(); i != end; /*erasing*/) {
- auto it = i++;
-
+ for (auto it = m_contacts.begin(), end = m_contacts.end(); it != end; /*erasing*/) {
Contact &contact(it.value());
if (!contact.state)
@@ -605,7 +603,7 @@ void QEvdevTouchScreenData::processInputEvent(input_event *data)
// Avoid reporting a contact in released state more than once.
if (!m_typeB && contact.state == Qt::TouchPointReleased
&& !m_lastContacts.contains(key)) {
- m_contacts.erase(it);
+ it = m_contacts.erase(it);
continue;
}
@@ -613,6 +611,7 @@ void QEvdevTouchScreenData::processInputEvent(input_event *data)
hasPressure = true;
addTouchPoint(contact, &combinedStates);
+ ++it;
}
// Now look for contacts that have disappeared since the last sync.
@@ -633,22 +632,23 @@ void QEvdevTouchScreenData::processInputEvent(input_event *data)
}
// Remove contacts that have just been reported as released.
- for (auto i = m_contacts.begin(), end = m_contacts.end(); i != end; /*erasing*/) {
- auto it = i++;
-
+ for (auto it = m_contacts.begin(), end = m_contacts.end(); it != end; /*erasing*/) {
Contact &contact(it.value());
if (!contact.state)
continue;
if (contact.state == Qt::TouchPointReleased) {
- if (m_typeB)
+ if (m_typeB) {
contact.state = static_cast<Qt::TouchPointState>(0);
- else
- m_contacts.erase(it);
+ } else {
+ it = m_contacts.erase(it);
+ continue;
+ }
} else {
contact.state = Qt::TouchPointStationary;
}
+ ++it;
}
m_lastContacts = m_contacts;
diff --git a/src/platformsupport/input/libinput/qlibinputtouch.cpp b/src/platformsupport/input/libinput/qlibinputtouch.cpp
index 446218e4b3..f00df6b674 100644
--- a/src/platformsupport/input/libinput/qlibinputtouch.cpp
+++ b/src/platformsupport/input/libinput/qlibinputtouch.cpp
@@ -42,6 +42,7 @@
#include <libinput.h>
#include <QtGui/QGuiApplication>
#include <QtGui/QScreen>
+#include <QtGui/QTouchDevice>
#include <QtGui/private/qhighdpiscaling_p.h>
QT_BEGIN_NAMESPACE
diff --git a/src/platformsupport/input/xkbcommon/CMakeLists.txt b/src/platformsupport/input/xkbcommon/CMakeLists.txt
new file mode 100644
index 0000000000..86d132d912
--- /dev/null
+++ b/src/platformsupport/input/xkbcommon/CMakeLists.txt
@@ -0,0 +1,32 @@
+# Generated from xkbcommon.pro.
+
+#####################################################################
+## XkbCommonSupport Module:
+#####################################################################
+
+qt_add_module(XkbCommonSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qxkbcommon.cpp qxkbcommon_p.h
+ qxkbcommon_3rdparty.cpp
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ XKB::XKB
+ PRECOMPILED_HEADER
+ "../../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:xkbcommon.pro:<TRUE>:
+# MODULE = "xkbcommon_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(XkbCommonSupport CONDITION CLANG AND NOT ICC
+ COMPILE_OPTIONS
+ -ftemplate-depth=1024
+)
diff --git a/src/platformsupport/kmsconvenience/.prev_CMakeLists.txt b/src/platformsupport/kmsconvenience/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..5b0fd00566
--- /dev/null
+++ b/src/platformsupport/kmsconvenience/.prev_CMakeLists.txt
@@ -0,0 +1,21 @@
+# Generated from kmsconvenience.pro.
+
+#####################################################################
+## KmsSupport Module:
+#####################################################################
+
+qt_add_module(KmsSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qkmsdevice.cpp qkmsdevice_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Libdrm::Libdrm
+ Qt::CorePrivate
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:kmsconvenience.pro:<TRUE>:
+# MODULE = "kms_support"
diff --git a/src/platformsupport/kmsconvenience/CMakeLists.txt b/src/platformsupport/kmsconvenience/CMakeLists.txt
new file mode 100644
index 0000000000..8001ee27de
--- /dev/null
+++ b/src/platformsupport/kmsconvenience/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Generated from kmsconvenience.pro.
+
+qt_find_package(Libdrm) # special case
+
+#####################################################################
+## KmsSupport Module:
+#####################################################################
+
+qt_add_module(KmsSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qkmsdevice.cpp qkmsdevice_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Libdrm::Libdrm
+ Qt::CorePrivate
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:kmsconvenience.pro:<TRUE>:
+# MODULE = "kms_support"
diff --git a/src/platformsupport/linuxaccessibility/.prev_CMakeLists.txt b/src/platformsupport/linuxaccessibility/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..38d3d2831f
--- /dev/null
+++ b/src/platformsupport/linuxaccessibility/.prev_CMakeLists.txt
@@ -0,0 +1,41 @@
+# Generated from linuxaccessibility.pro.
+
+#####################################################################
+## LinuxAccessibilitySupport Module:
+#####################################################################
+
+qt_add_module(LinuxAccessibilitySupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ application.cpp application_p.h
+ atspiadaptor.cpp atspiadaptor_p.h
+ bridge.cpp bridge_p.h
+ cache.cpp cache_p.h
+ constant_mappings.cpp constant_mappings_p.h
+ dbusconnection.cpp dbusconnection_p.h
+ struct_marshallers.cpp struct_marshallers_p.h
+ DBUS_ADAPTOR_SOURCES
+ dbusxml/Cache.xml
+ dbusxml/DeviceEventController.xml
+ DBUS_ADAPTOR_FLAGS
+ "-i" "struct_marshallers_p.h"
+ DBUS_INTERFACE_SOURCES
+ dbusxml/Bus.xml
+ dbusxml/Socket.xml
+ DBUS_INTERFACE_FLAGS
+ "-i" "struct_marshallers_p.h"
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ PkgConfig::ATSPI2_nolink
+ Qt::AccessibilitySupportPrivate
+ Qt::CorePrivate
+ Qt::DBus
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:linuxaccessibility.pro:<TRUE>:
+# MODULE = "linuxaccessibility_support"
diff --git a/src/platformsupport/linuxaccessibility/CMakeLists.txt b/src/platformsupport/linuxaccessibility/CMakeLists.txt
new file mode 100644
index 0000000000..35bfdabf5f
--- /dev/null
+++ b/src/platformsupport/linuxaccessibility/CMakeLists.txt
@@ -0,0 +1,43 @@
+# Generated from linuxaccessibility.pro.
+
+qt_find_package(ATSPI2) # special case
+
+#####################################################################
+## LinuxAccessibilitySupport Module:
+#####################################################################
+
+qt_add_module(LinuxAccessibilitySupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ application.cpp application_p.h
+ atspiadaptor.cpp atspiadaptor_p.h
+ bridge.cpp bridge_p.h
+ cache.cpp cache_p.h
+ constant_mappings.cpp constant_mappings_p.h
+ dbusconnection.cpp dbusconnection_p.h
+ struct_marshallers.cpp struct_marshallers_p.h
+ DBUS_ADAPTOR_SOURCES
+ dbusxml/Cache.xml
+ dbusxml/DeviceEventController.xml
+ DBUS_ADAPTOR_FLAGS
+ "-i" "struct_marshallers_p.h"
+ DBUS_INTERFACE_SOURCES
+ dbusxml/Bus.xml
+ dbusxml/Socket.xml
+ DBUS_INTERFACE_FLAGS
+ "-i" "struct_marshallers_p.h"
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ PkgConfig::ATSPI2_nolink
+ Qt::AccessibilitySupportPrivate
+ Qt::CorePrivate
+ Qt::DBus
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:linuxaccessibility.pro:<TRUE>:
+# MODULE = "linuxaccessibility_support"
diff --git a/src/platformsupport/linuxaccessibility/constant_mappings_p.h b/src/platformsupport/linuxaccessibility/constant_mappings_p.h
index 4da818c8c1..1d4dd833e1 100644
--- a/src/platformsupport/linuxaccessibility/constant_mappings_p.h
+++ b/src/platformsupport/linuxaccessibility/constant_mappings_p.h
@@ -118,7 +118,7 @@ struct RoleNames {
QString localizedName() const {return m_localizedName;}
private:
- AtspiRole m_spiRole;
+ AtspiRole m_spiRole = ATSPI_ROLE_INVALID;
QString m_name;
QString m_localizedName;
};
diff --git a/src/platformsupport/linuxofono/CMakeLists.txt b/src/platformsupport/linuxofono/CMakeLists.txt
new file mode 100644
index 0000000000..ba8bc97dd6
--- /dev/null
+++ b/src/platformsupport/linuxofono/CMakeLists.txt
@@ -0,0 +1,20 @@
+# Generated from linuxofono.pro.
+
+#####################################################################
+## LinuxOfonoSupport Module:
+#####################################################################
+
+add_qt_module(LinuxOfonoSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qofonoservice_linux.cpp qofonoservice_linux_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::DBus
+)
+
+#### Keys ignored in scope 1:.:.:linuxofono.pro:<TRUE>:
+# MODULE = "linuxofono_support"
diff --git a/src/platformsupport/linuxofono/linuxofono.pro b/src/platformsupport/linuxofono/linuxofono.pro
new file mode 100644
index 0000000000..1bc5b10225
--- /dev/null
+++ b/src/platformsupport/linuxofono/linuxofono.pro
@@ -0,0 +1,15 @@
+TARGET = QtLinuxOfonoSupport
+MODULE = linuxofono_support
+
+QT = core dbus
+CONFIG += static internal_module
+
+DEFINES += QT_NO_CAST_FROM_ASCII
+
+HEADERS += \
+ qofonoservice_linux_p.h
+
+SOURCES += \
+ qofonoservice_linux.cpp
+
+load(qt_module)
diff --git a/src/platformsupport/linuxofono/qofonoservice_linux.cpp b/src/platformsupport/linuxofono/qofonoservice_linux.cpp
new file mode 100644
index 0000000000..792c703966
--- /dev/null
+++ b/src/platformsupport/linuxofono/qofonoservice_linux.cpp
@@ -0,0 +1,384 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QObject>
+#include <QList>
+#include <QtDBus/QtDBus>
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusError>
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusReply>
+#include <QtDBus/QDBusPendingCallWatcher>
+#include <QtDBus/QDBusObjectPath>
+#include <QtDBus/QDBusPendingCall>
+
+#include "qofonoservice_linux_p.h"
+
+#ifndef QT_NO_DBUS
+
+QDBusArgument &operator<<(QDBusArgument &argument, const ObjectPathProperties &item)
+{
+ argument.beginStructure();
+ argument << item.path << item.properties;
+ argument.endStructure();
+ return argument;
+}
+
+const QDBusArgument &operator>>(const QDBusArgument &argument, ObjectPathProperties &item)
+{
+ argument.beginStructure();
+ argument >> item.path >> item.properties;
+ argument.endStructure();
+ return argument;
+}
+
+QT_BEGIN_NAMESPACE
+
+QOfonoManagerInterface::QOfonoManagerInterface( QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ QLatin1String(OFONO_MANAGER_PATH),
+ OFONO_MANAGER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+ qDBusRegisterMetaType<ObjectPathProperties>();
+ qDBusRegisterMetaType<PathPropertiesList>();
+
+ QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
+ QLatin1String(OFONO_MANAGER_PATH),
+ QLatin1String(OFONO_MANAGER_INTERFACE),
+ QLatin1String("ModemAdded"),
+ this,SLOT(modemAdded(QDBusObjectPath,QVariantMap)));
+ QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
+ QLatin1String(OFONO_MANAGER_PATH),
+ QLatin1String(OFONO_MANAGER_INTERFACE),
+ QLatin1String("ModemRemoved"),
+ this,SLOT(modemRemoved(QDBusObjectPath)));
+}
+
+QOfonoManagerInterface::~QOfonoManagerInterface()
+{
+}
+
+QStringList QOfonoManagerInterface::getModems()
+{
+ if (modemList.isEmpty()) {
+ QDBusPendingReply<PathPropertiesList> reply = call(QDBus::Block, QLatin1String("GetModems"));
+ reply.waitForFinished();
+ if (!reply.isError()) {
+ const auto modems = reply.value();
+ for (const ObjectPathProperties &modem : modems)
+ modemList << modem.path.path();
+ }
+ }
+
+ return modemList;
+}
+
+QString QOfonoManagerInterface::currentModem()
+{
+ const QStringList modems = getModems();
+ for (const QString &modem : modems) {
+ QOfonoModemInterface device(modem);
+ if (device.isPowered() && device.isOnline()
+ && device.interfaces().contains(QLatin1String("org.ofono.NetworkRegistration")))
+ return modem;
+ }
+ return QString();
+}
+
+void QOfonoManagerInterface::modemAdded(const QDBusObjectPath &path, const QVariantMap &/*var*/)
+{
+ if (!modemList.contains(path.path())) {
+ modemList << path.path();
+ Q_EMIT modemChanged();
+ }
+}
+
+void QOfonoManagerInterface::modemRemoved(const QDBusObjectPath &path)
+{
+ if (modemList.contains(path.path())) {
+ modemList.removeOne(path.path());
+ Q_EMIT modemChanged();
+ }
+}
+
+
+QOfonoModemInterface::QOfonoModemInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_MODEM_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+ QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
+ path(),
+ QLatin1String(OFONO_MODEM_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SLOT(propertyChanged(QString,QDBusVariant)));
+}
+
+QOfonoModemInterface::~QOfonoModemInterface()
+{
+}
+
+void QOfonoModemInterface::propertyChanged(const QString &name,const QDBusVariant &value)
+{
+ propertiesMap[name] = value.variant();
+}
+
+bool QOfonoModemInterface::isPowered()
+{
+ QVariant var = getProperty(QStringLiteral("Powered"));
+ return qdbus_cast<bool>(var);
+}
+
+bool QOfonoModemInterface::isOnline()
+{
+ QVariant var = getProperty(QStringLiteral("Online"));
+ return qdbus_cast<bool>(var);
+}
+
+QStringList QOfonoModemInterface::interfaces()
+{
+ const QVariant var = getProperty(QStringLiteral("Interfaces"));
+ return var.toStringList();
+}
+
+QVariantMap QOfonoModemInterface::getProperties()
+{
+ if (propertiesMap.isEmpty()) {
+ QDBusPendingReply<QVariantMap> reply = call(QDBus::Block, QLatin1String("GetProperties"));
+ if (!reply.isError()) {
+ propertiesMap = reply.value();
+ }
+ }
+ return propertiesMap;
+}
+
+QVariant QOfonoModemInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property))
+ var = map.value(property);
+ return var;
+}
+
+
+QOfonoNetworkRegistrationInterface::QOfonoNetworkRegistrationInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_NETWORK_REGISTRATION_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoNetworkRegistrationInterface::~QOfonoNetworkRegistrationInterface()
+{
+}
+
+QString QOfonoNetworkRegistrationInterface::getTechnology()
+{
+ QVariant var = getProperty(QStringLiteral("Technology"));
+ return qdbus_cast<QString>(var);
+}
+
+QVariant QOfonoNetworkRegistrationInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property))
+ var = map.value(property);
+ return var;
+}
+
+QVariantMap QOfonoNetworkRegistrationInterface::getProperties()
+{
+ if (propertiesMap.isEmpty()) {
+ QDBusPendingReply<QVariantMap> reply = call(QDBus::Block, QLatin1String("GetProperties"));
+ reply.waitForFinished();
+ if (!reply.isError()) {
+ propertiesMap = reply.value();
+ }
+ }
+ return propertiesMap;
+}
+
+QOfonoDataConnectionManagerInterface::QOfonoDataConnectionManagerInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_DATA_CONNECTION_MANAGER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+ QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
+ path(),
+ QLatin1String(OFONO_MODEM_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SLOT(propertyChanged(QString,QDBusVariant)));
+}
+
+QOfonoDataConnectionManagerInterface::~QOfonoDataConnectionManagerInterface()
+{
+}
+
+QStringList QOfonoDataConnectionManagerInterface::contexts()
+{
+ if (contextList.isEmpty()) {
+ QDBusPendingReply<PathPropertiesList > reply = call(QLatin1String("GetContexts"));
+ reply.waitForFinished();
+ if (!reply.isError()) {
+ const auto contexts = reply.value();
+ for (const ObjectPathProperties &context : contexts)
+ contextList << context.path.path();
+ }
+ }
+ return contextList;
+}
+
+PathPropertiesList QOfonoDataConnectionManagerInterface::contextsWithProperties()
+{
+ if (contextListProperties.isEmpty()) {
+ QDBusPendingReply<PathPropertiesList > reply = call(QLatin1String("GetContexts"));
+ reply.waitForFinished();
+ if (!reply.isError()) {
+ contextListProperties = reply.value();
+ }
+ }
+ return contextListProperties;
+}
+
+bool QOfonoDataConnectionManagerInterface::roamingAllowed()
+{
+ QVariant var = getProperty(QStringLiteral("RoamingAllowed"));
+ return qdbus_cast<bool>(var);
+}
+
+QString QOfonoDataConnectionManagerInterface::bearer()
+{
+ QVariant var = getProperty(QStringLiteral("Bearer"));
+ return qdbus_cast<QString>(var);
+}
+
+QVariant QOfonoDataConnectionManagerInterface::getProperty(const QString &property)
+{
+ return getProperties().value(property);
+}
+
+QVariantMap &QOfonoDataConnectionManagerInterface::getProperties()
+{
+ if (propertiesMap.isEmpty()) {
+ QDBusPendingReply<QVariantMap> reply = call(QDBus::Block, QLatin1String("GetProperties"));
+ if (!reply.isError()) {
+ propertiesMap = reply.value();
+ }
+ }
+ return propertiesMap;
+}
+
+void QOfonoDataConnectionManagerInterface::propertyChanged(const QString &name, const QDBusVariant &value)
+{
+ propertiesMap[name] = value.variant();
+ if (name == QLatin1String("RoamingAllowed"))
+ Q_EMIT roamingAllowedChanged(value.variant().toBool());
+}
+
+
+QOfonoConnectionContextInterface::QOfonoConnectionContextInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_CONNECTION_CONTEXT_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+ QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
+ path(),
+ QLatin1String(OFONO_MODEM_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SLOT(propertyChanged(QString,QDBusVariant)));
+}
+
+QOfonoConnectionContextInterface::~QOfonoConnectionContextInterface()
+{
+}
+
+QVariantMap QOfonoConnectionContextInterface::getProperties()
+{
+ if (propertiesMap.isEmpty()) {
+ QDBusPendingReply<QVariantMap> reply = call(QDBus::Block, QLatin1String("GetProperties"));
+ if (!reply.isError()) {
+ propertiesMap = reply.value();
+ }
+ }
+ return propertiesMap;
+}
+
+void QOfonoConnectionContextInterface::propertyChanged(const QString &name, const QDBusVariant &value)
+{
+ propertiesMap[name] = value.variant();
+}
+
+QVariant QOfonoConnectionContextInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property))
+ var = map.value(property);
+ return var;
+}
+
+bool QOfonoConnectionContextInterface::active()
+{
+ QVariant var = getProperty(QStringLiteral("Active"));
+ return qdbus_cast<bool>(var);
+}
+
+QString QOfonoConnectionContextInterface::accessPointName()
+{
+ QVariant var = getProperty(QStringLiteral("AccessPointName"));
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoConnectionContextInterface::name()
+{
+ QVariant var = getProperty(QStringLiteral("Name"));
+ return qdbus_cast<QString>(var);
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/linux_common/qofonoservice_linux_p.h b/src/platformsupport/linuxofono/qofonoservice_linux_p.h
index 62df5d4fa7..62df5d4fa7 100644
--- a/src/plugins/bearer/linux_common/qofonoservice_linux_p.h
+++ b/src/platformsupport/linuxofono/qofonoservice_linux_p.h
diff --git a/src/platformsupport/platformcompositor/CMakeLists.txt b/src/platformsupport/platformcompositor/CMakeLists.txt
new file mode 100644
index 0000000000..1ddc9e719d
--- /dev/null
+++ b/src/platformsupport/platformcompositor/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Generated from platformcompositor.pro.
+
+#####################################################################
+## PlatformCompositorSupport Module:
+#####################################################################
+
+qt_add_module(PlatformCompositorSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qopenglcompositor.cpp qopenglcompositor_p.h
+ qopenglcompositorbackingstore.cpp qopenglcompositorbackingstore_p.h
+ qplatformbackingstoreopenglsupport.cpp qplatformbackingstoreopenglsupport.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ Qt::OpenGL
+)
+
+#### Keys ignored in scope 1:.:.:platformcompositor.pro:<TRUE>:
+# MODULE = "platformcompositor_support"
diff --git a/src/platformsupport/platformcompositor/platformcompositor.pro b/src/platformsupport/platformcompositor/platformcompositor.pro
index 81c31571d0..89386ab3ef 100644
--- a/src/platformsupport/platformcompositor/platformcompositor.pro
+++ b/src/platformsupport/platformcompositor/platformcompositor.pro
@@ -1,16 +1,18 @@
TARGET = QtPlatformCompositorSupport
MODULE = platformcompositor_support
-QT = core-private gui-private
+QT = core-private gui-private opengl
CONFIG += static internal_module
DEFINES += QT_NO_CAST_FROM_ASCII
SOURCES += \
+ qplatformbackingstoreopenglsupport.cpp \
qopenglcompositor.cpp \
qopenglcompositorbackingstore.cpp
HEADERS += \
+ qplatformbackingstoreopenglsupport.h \
qopenglcompositor_p.h \
qopenglcompositorbackingstore_p.h
diff --git a/src/platformsupport/platformcompositor/qopenglcompositor.cpp b/src/platformsupport/platformcompositor/qopenglcompositor.cpp
index 635bf0107f..abfaca3f9c 100644
--- a/src/platformsupport/platformcompositor/qopenglcompositor.cpp
+++ b/src/platformsupport/platformcompositor/qopenglcompositor.cpp
@@ -37,8 +37,8 @@
**
****************************************************************************/
+#include <QtOpenGL/QOpenGLFramebufferObject>
#include <QtGui/QOpenGLContext>
-#include <QtGui/QOpenGLFramebufferObject>
#include <QtGui/QWindow>
#include <qpa/qplatformbackingstore.h>
diff --git a/src/platformsupport/platformcompositor/qopenglcompositor_p.h b/src/platformsupport/platformcompositor/qopenglcompositor_p.h
index 41a3288240..c9414c82c6 100644
--- a/src/platformsupport/platformcompositor/qopenglcompositor_p.h
+++ b/src/platformsupport/platformcompositor/qopenglcompositor_p.h
@@ -52,7 +52,7 @@
//
#include <QtCore/QTimer>
-#include <QtGui/QOpenGLTextureBlitter>
+#include <QtOpenGL/QOpenGLTextureBlitter>
#include <QtGui/QMatrix4x4>
QT_BEGIN_NAMESPACE
diff --git a/src/platformsupport/platformcompositor/qplatformbackingstoreopenglsupport.cpp b/src/platformsupport/platformcompositor/qplatformbackingstoreopenglsupport.cpp
new file mode 100644
index 0000000000..511d85a400
--- /dev/null
+++ b/src/platformsupport/platformcompositor/qplatformbackingstoreopenglsupport.cpp
@@ -0,0 +1,455 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT_NO_OPENGL
+
+#include "qplatformbackingstoreopenglsupport.h"
+
+#include <QtGui/private/qwindow_p.h>
+
+#include <qpa/qplatformgraphicsbuffer.h>
+#include <qpa/qplatformgraphicsbufferhelper.h>
+
+#include <QtOpenGL/QOpenGLTextureBlitter>
+#include <QtGui/qopengl.h>
+#include <QtGui/QOpenGLFunctions>
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QOffscreenSurface>
+
+#ifndef GL_TEXTURE_BASE_LEVEL
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#endif
+#ifndef GL_TEXTURE_MAX_LEVEL
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#endif
+#ifndef GL_UNPACK_ROW_LENGTH
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#endif
+#ifndef GL_RGB10_A2
+#define GL_RGB10_A2 0x8059
+#endif
+#ifndef GL_UNSIGNED_INT_2_10_10_10_REV
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#endif
+
+#ifndef GL_FRAMEBUFFER_SRGB
+#define GL_FRAMEBUFFER_SRGB 0x8DB9
+#endif
+#ifndef GL_FRAMEBUFFER_SRGB_CAPABLE
+#define GL_FRAMEBUFFER_SRGB_CAPABLE 0x8DBA
+#endif
+
+QT_BEGIN_NAMESPACE
+
+static inline QRect deviceRect(const QRect &rect, QWindow *window)
+{
+ QRect deviceRect(rect.topLeft() * window->devicePixelRatio(),
+ rect.size() * window->devicePixelRatio());
+ return deviceRect;
+}
+
+static inline QPoint deviceOffset(const QPoint &pt, QWindow *window)
+{
+ return pt * window->devicePixelRatio();
+}
+
+static QRegion deviceRegion(const QRegion &region, QWindow *window, const QPoint &offset)
+{
+ if (offset.isNull() && window->devicePixelRatio() <= 1)
+ return region;
+
+ QVector<QRect> rects;
+ rects.reserve(region.rectCount());
+ for (const QRect &rect : region)
+ rects.append(deviceRect(rect.translated(offset), window));
+
+ QRegion deviceRegion;
+ deviceRegion.setRects(rects.constData(), rects.count());
+ return deviceRegion;
+}
+
+static inline QRect toBottomLeftRect(const QRect &topLeftRect, int windowHeight)
+{
+ return QRect(topLeftRect.x(), windowHeight - topLeftRect.bottomRight().y() - 1,
+ topLeftRect.width(), topLeftRect.height());
+}
+
+static void blitTextureForWidget(const QPlatformTextureList *textures, int idx, QWindow *window, const QRect &deviceWindowRect,
+ QOpenGLTextureBlitter *blitter, const QPoint &offset, bool canUseSrgb)
+{
+ const QRect clipRect = textures->clipRect(idx);
+ if (clipRect.isEmpty())
+ return;
+
+ QRect rectInWindow = textures->geometry(idx);
+ // relative to the TLW, not necessarily our window (if the flush is for a native child widget), have to adjust
+ rectInWindow.translate(-offset);
+
+ const QRect clippedRectInWindow = rectInWindow & clipRect.translated(rectInWindow.topLeft());
+ const QRect srcRect = toBottomLeftRect(clipRect, rectInWindow.height());
+
+ const QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(deviceRect(clippedRectInWindow, window),
+ deviceWindowRect);
+
+ const QMatrix3x3 source = QOpenGLTextureBlitter::sourceTransform(deviceRect(srcRect, window),
+ deviceRect(rectInWindow, window).size(),
+ QOpenGLTextureBlitter::OriginBottomLeft);
+
+ QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions();
+ const bool srgb = textures->flags(idx).testFlag(QPlatformTextureList::TextureIsSrgb);
+ if (srgb && canUseSrgb)
+ funcs->glEnable(GL_FRAMEBUFFER_SRGB);
+
+ blitter->blit(textures->textureId(idx), target, source);
+
+ if (srgb && canUseSrgb)
+ funcs->glDisable(GL_FRAMEBUFFER_SRGB);
+}
+
+QPlatformBackingStoreOpenGLSupport::~QPlatformBackingStoreOpenGLSupport() {
+ if (context) {
+ QOffscreenSurface offscreenSurface;
+ offscreenSurface.setFormat(context->format());
+ offscreenSurface.create();
+ context->makeCurrent(&offscreenSurface);
+ if (textureId)
+ context->functions()->glDeleteTextures(1, &textureId);
+ if (blitter)
+ blitter->destroy();
+ }
+ delete blitter;
+}
+
+void QPlatformBackingStoreOpenGLSupport::composeAndFlush(QWindow *window, const QRegion &region, const QPoint &offset, QPlatformTextureList *textures, bool translucentBackground)
+{
+ if (!qt_window_private(window)->receivedExpose)
+ return;
+
+ if (!context) {
+ context.reset(new QOpenGLContext);
+ context->setFormat(window->requestedFormat());
+ context->setScreen(window->screen());
+ context->setShareContext(qt_window_private(window)->shareContext());
+ if (!context->create()) {
+ qCWarning(lcQpaBackingStore, "composeAndFlush: QOpenGLContext creation failed");
+ return;
+ }
+ }
+
+ bool current = context->makeCurrent(window);
+
+ if (!current && context->isValid()) {
+ delete blitter;
+ blitter = nullptr;
+ textureId = 0;
+ current = context->create() && context->makeCurrent(window);
+ }
+
+ if (!current) {
+ qCWarning(lcQpaBackingStore, "composeAndFlush: makeCurrent() failed");
+ return;
+ }
+
+ qCDebug(lcQpaBackingStore) << "Composing and flushing" << region << "of" << window
+ << "at offset" << offset << "with" << textures->count() << "texture(s) in" << textures;
+
+ QWindowPrivate::get(window)->lastComposeTime.start();
+
+ QOpenGLFunctions *funcs = context->functions();
+ funcs->glViewport(0, 0, qRound(window->width() * window->devicePixelRatio()), qRound(window->height() * window->devicePixelRatio()));
+ funcs->glClearColor(0, 0, 0, translucentBackground ? 0 : 1);
+ funcs->glClear(GL_COLOR_BUFFER_BIT);
+
+ if (!blitter) {
+ blitter = new QOpenGLTextureBlitter;
+ blitter->create();
+ }
+
+ blitter->bind();
+
+ const QRect deviceWindowRect = deviceRect(QRect(QPoint(), window->size()), window);
+ const QPoint deviceWindowOffset = deviceOffset(offset, window);
+
+ bool canUseSrgb = false;
+ // If there are any sRGB textures in the list, check if the destination
+ // framebuffer is sRGB capable.
+ for (int i = 0; i < textures->count(); ++i) {
+ if (textures->flags(i).testFlag(QPlatformTextureList::TextureIsSrgb)) {
+ GLint cap = 0;
+ funcs->glGetIntegerv(GL_FRAMEBUFFER_SRGB_CAPABLE, &cap);
+ if (cap)
+ canUseSrgb = true;
+ break;
+ }
+ }
+
+ // Textures for renderToTexture widgets.
+ for (int i = 0; i < textures->count(); ++i) {
+ if (!textures->flags(i).testFlag(QPlatformTextureList::StacksOnTop))
+ blitTextureForWidget(textures, i, window, deviceWindowRect, blitter, offset, canUseSrgb);
+ }
+
+ // Backingstore texture with the normal widgets.
+ GLuint textureId = 0;
+ QOpenGLTextureBlitter::Origin origin = QOpenGLTextureBlitter::OriginTopLeft;
+ if (QPlatformGraphicsBuffer *graphicsBuffer = backingStore->graphicsBuffer()) {
+ if (graphicsBuffer->size() != textureSize) {
+ if (this->textureId)
+ funcs->glDeleteTextures(1, &this->textureId);
+ funcs->glGenTextures(1, &this->textureId);
+ funcs->glBindTexture(GL_TEXTURE_2D, this->textureId);
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (!ctx->isOpenGLES() || ctx->format().majorVersion() >= 3) {
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
+ }
+ funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ if (QPlatformGraphicsBufferHelper::lockAndBindToTexture(graphicsBuffer, &needsSwizzle, &premultiplied)) {
+ textureSize = graphicsBuffer->size();
+ } else {
+ textureSize = QSize(0,0);
+ }
+
+ graphicsBuffer->unlock();
+ } else if (!region.isEmpty()){
+ funcs->glBindTexture(GL_TEXTURE_2D, this->textureId);
+ QPlatformGraphicsBufferHelper::lockAndBindToTexture(graphicsBuffer, &needsSwizzle, &premultiplied);
+ graphicsBuffer->unlock();
+ }
+
+ if (graphicsBuffer->origin() == QPlatformGraphicsBuffer::OriginBottomLeft)
+ origin = QOpenGLTextureBlitter::OriginBottomLeft;
+ textureId = this->textureId;
+ } else {
+ QPlatformBackingStore::TextureFlags flags;
+ textureId = backingStore->toTexture(deviceRegion(region, window, offset), &textureSize, &flags);
+ needsSwizzle = (flags & QPlatformBackingStore::TextureSwizzle) != 0;
+ premultiplied = (flags & QPlatformBackingStore::TexturePremultiplied) != 0;
+ if (flags & QPlatformBackingStore::TextureFlip)
+ origin = QOpenGLTextureBlitter::OriginBottomLeft;
+ }
+
+ funcs->glEnable(GL_BLEND);
+ if (premultiplied)
+ funcs->glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
+ else
+ funcs->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
+
+ if (textureId) {
+ if (needsSwizzle)
+ blitter->setRedBlueSwizzle(true);
+ // The backingstore is for the entire tlw.
+ // In case of native children offset tells the position relative to the tlw.
+ const QRect srcRect = toBottomLeftRect(deviceWindowRect.translated(deviceWindowOffset), textureSize.height());
+ const QMatrix3x3 source = QOpenGLTextureBlitter::sourceTransform(srcRect,
+ textureSize,
+ origin);
+ blitter->blit(textureId, QMatrix4x4(), source);
+ if (needsSwizzle)
+ blitter->setRedBlueSwizzle(false);
+ }
+
+ // Textures for renderToTexture widgets that have WA_AlwaysStackOnTop set.
+ bool blendIsPremultiplied = premultiplied;
+ for (int i = 0; i < textures->count(); ++i) {
+ const QPlatformTextureList::Flags flags = textures->flags(i);
+ if (flags.testFlag(QPlatformTextureList::NeedsPremultipliedAlphaBlending)) {
+ if (!blendIsPremultiplied) {
+ funcs->glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
+ blendIsPremultiplied = true;
+ }
+ } else {
+ if (blendIsPremultiplied) {
+ funcs->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
+ blendIsPremultiplied = false;
+ }
+ }
+ if (flags.testFlag(QPlatformTextureList::StacksOnTop))
+ blitTextureForWidget(textures, i, window, deviceWindowRect, blitter, offset, canUseSrgb);
+ }
+
+ funcs->glDisable(GL_BLEND);
+ blitter->release();
+
+ context->swapBuffers(window);
+}
+
+GLuint QPlatformBackingStoreOpenGLSupport::toTexture(const QRegion &dirtyRegion, QSize *textureSize, QPlatformBackingStore::TextureFlags *flags) const
+{
+ Q_ASSERT(textureSize);
+ Q_ASSERT(flags);
+
+ QImage image = backingStore->toImage();
+ QSize imageSize = image.size();
+
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ GLenum internalFormat = GL_RGBA;
+ GLuint pixelType = GL_UNSIGNED_BYTE;
+
+ bool needsConversion = false;
+ *flags = { };
+ switch (image.format()) {
+ case QImage::Format_ARGB32_Premultiplied:
+ *flags |= QPlatformBackingStore::TexturePremultiplied;
+ Q_FALLTHROUGH();
+ case QImage::Format_RGB32:
+ case QImage::Format_ARGB32:
+ *flags |= QPlatformBackingStore::TextureSwizzle;
+ break;
+ case QImage::Format_RGBA8888_Premultiplied:
+ *flags |= QPlatformBackingStore::TexturePremultiplied;
+ Q_FALLTHROUGH();
+ case QImage::Format_RGBX8888:
+ case QImage::Format_RGBA8888:
+ break;
+ case QImage::Format_BGR30:
+ case QImage::Format_A2BGR30_Premultiplied:
+ if (!ctx->isOpenGLES() || ctx->format().majorVersion() >= 3) {
+ pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
+ internalFormat = GL_RGB10_A2;
+ *flags |= QPlatformBackingStore::TexturePremultiplied;
+ } else {
+ needsConversion = true;
+ }
+ break;
+ case QImage::Format_RGB30:
+ case QImage::Format_A2RGB30_Premultiplied:
+ if (!ctx->isOpenGLES() || ctx->format().majorVersion() >= 3) {
+ pixelType = GL_UNSIGNED_INT_2_10_10_10_REV;
+ internalFormat = GL_RGB10_A2;
+ *flags |= QPlatformBackingStore::TextureSwizzle | QPlatformBackingStore::TexturePremultiplied;
+ } else {
+ needsConversion = true;
+ }
+ break;
+ default:
+ needsConversion = true;
+ break;
+ }
+ if (imageSize.isEmpty()) {
+ *textureSize = imageSize;
+ return 0;
+ }
+
+ // Must rely on the input only, not d_ptr.
+ // With the default composeAndFlush() textureSize is &d_ptr->textureSize.
+ bool resized = *textureSize != imageSize;
+ if (dirtyRegion.isEmpty() && !resized)
+ return textureId;
+
+ *textureSize = imageSize;
+
+ if (needsConversion)
+ image = image.convertToFormat(QImage::Format_RGBA8888);
+
+ // The image provided by the backingstore may have a stride larger than width * 4, for
+ // instance on platforms that manually implement client-side decorations.
+ static const int bytesPerPixel = 4;
+ const qsizetype strideInPixels = image.bytesPerLine() / bytesPerPixel;
+ const bool hasUnpackRowLength = !ctx->isOpenGLES() || ctx->format().majorVersion() >= 3;
+
+ QOpenGLFunctions *funcs = ctx->functions();
+
+ if (hasUnpackRowLength) {
+ funcs->glPixelStorei(GL_UNPACK_ROW_LENGTH, strideInPixels);
+ } else if (strideInPixels != image.width()) {
+ // No UNPACK_ROW_LENGTH on ES 2.0 and yet we would need it. This case is typically
+ // hit with QtWayland which is rarely used in combination with a ES2.0-only GL
+ // implementation. Therefore, accept the performance hit and do a copy.
+ image = image.copy();
+ }
+
+ if (resized) {
+ if (textureId)
+ funcs->glDeleteTextures(1, &textureId);
+ funcs->glGenTextures(1, &textureId);
+ funcs->glBindTexture(GL_TEXTURE_2D, textureId);
+ if (!ctx->isOpenGLES() || ctx->format().majorVersion() >= 3) {
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
+ funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
+ }
+ funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ funcs->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ funcs->glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, imageSize.width(), imageSize.height(), 0, GL_RGBA, pixelType,
+ const_cast<uchar*>(image.constBits()));
+ } else {
+ funcs->glBindTexture(GL_TEXTURE_2D, textureId);
+ QRect imageRect = image.rect();
+ QRect rect = dirtyRegion.boundingRect() & imageRect;
+
+ if (hasUnpackRowLength) {
+ funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, rect.x(), rect.y(), rect.width(), rect.height(), GL_RGBA, pixelType,
+ image.constScanLine(rect.y()) + rect.x() * bytesPerPixel);
+ } else {
+ // if the rect is wide enough it's cheaper to just
+ // extend it instead of doing an image copy
+ if (rect.width() >= imageRect.width() / 2) {
+ rect.setX(0);
+ rect.setWidth(imageRect.width());
+ }
+
+ // if the sub-rect is full-width we can pass the image data directly to
+ // OpenGL instead of copying, since there's no gap between scanlines
+
+ if (rect.width() == imageRect.width()) {
+ funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, rect.y(), rect.width(), rect.height(), GL_RGBA, pixelType,
+ image.constScanLine(rect.y()));
+ } else {
+ funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, rect.x(), rect.y(), rect.width(), rect.height(), GL_RGBA, pixelType,
+ image.copy(rect).constBits());
+ }
+ }
+ }
+
+ if (hasUnpackRowLength)
+ funcs->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+
+ return textureId;
+}
+
+#endif // QT_NO_OPENGL
+
+QT_END_NAMESPACE
diff --git a/src/platformsupport/platformcompositor/qplatformbackingstoreopenglsupport.h b/src/platformsupport/platformcompositor/qplatformbackingstoreopenglsupport.h
new file mode 100644
index 0000000000..5523b18f76
--- /dev/null
+++ b/src/platformsupport/platformcompositor/qplatformbackingstoreopenglsupport.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLATFORMBACKINGSTOREOPENGLSUPPORT_H
+#define QPLATFORMBACKINGSTOREOPENGLSUPPORT_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is part of the QPA API and is not meant to be used
+// in applications. Usage of this API may make your code
+// source and binary incompatible with future versions of Qt.
+//
+
+#ifndef QT_NO_OPENGL
+
+#include <QtGui/qtguiglobal.h>
+#include <qpa/qplatformbackingstore.h>
+
+#include <QtGui/QOpenGLContext>
+
+QT_BEGIN_NAMESPACE
+
+class QOpenGLTextureBlitter;
+class QOpenGLBackingStore;
+
+class QPlatformBackingStoreOpenGLSupport : public QPlatformBackingStoreOpenGLSupportBase
+{
+public:
+ explicit QPlatformBackingStoreOpenGLSupport(QPlatformBackingStore *backingStore) : backingStore(backingStore) {}
+ ~QPlatformBackingStoreOpenGLSupport() override;
+ void composeAndFlush(QWindow *window, const QRegion &region, const QPoint &offset,
+ QPlatformTextureList *textures, bool translucentBackground) override;
+ GLuint toTexture(const QRegion &dirtyRegion, QSize *textureSize, QPlatformBackingStore::TextureFlags *flags) const override;
+
+private:
+ QPlatformBackingStore *backingStore = nullptr;
+ QScopedPointer<QOpenGLContext> context;
+ mutable GLuint textureId = 0;
+ mutable QSize textureSize;
+ mutable bool needsSwizzle = false;
+ mutable bool premultiplied = false;
+ QOpenGLTextureBlitter *blitter = nullptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_OPENGL
+
+#endif // QPLATFORMBACKINGSTOREOPENGLSUPPORT_H
diff --git a/src/platformsupport/platformsupport.pro b/src/platformsupport/platformsupport.pro
index 877665ff06..4b41b29c12 100644
--- a/src/platformsupport/platformsupport.pro
+++ b/src/platformsupport/platformsupport.pro
@@ -45,3 +45,7 @@ darwin {
qtConfig(vulkan): \
SUBDIRS += vkconvenience
+
+!android:linux*:qtHaveModule(dbus) \
+ SUBDIRS += linuxofono
+
diff --git a/src/platformsupport/services/CMakeLists.txt b/src/platformsupport/services/CMakeLists.txt
new file mode 100644
index 0000000000..602dd40305
--- /dev/null
+++ b/src/platformsupport/services/CMakeLists.txt
@@ -0,0 +1,30 @@
+# Generated from services.pro.
+
+#####################################################################
+## ServiceSupport Module:
+#####################################################################
+
+qt_add_module(ServiceSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ genericunix/qgenericunixservices.cpp genericunix/qgenericunixservices_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:services.pro:<TRUE>:
+# MODULE = "service_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(ServiceSupport CONDITION QT_FEATURE_dbus
+ PUBLIC_LIBRARIES
+ Qt::DBus
+)
diff --git a/src/platformsupport/themes/CMakeLists.txt b/src/platformsupport/themes/CMakeLists.txt
new file mode 100644
index 0000000000..3b1ad022b8
--- /dev/null
+++ b/src/platformsupport/themes/CMakeLists.txt
@@ -0,0 +1,54 @@
+# Generated from themes.pro.
+
+#####################################################################
+## ThemeSupport Module:
+#####################################################################
+
+qt_add_module(ThemeSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qabstractfileiconengine.cpp qabstractfileiconengine_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:themes.pro:<TRUE>:
+# MODULE = "theme_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(ThemeSupport CONDITION QT_FEATURE_xcb OR (UNIX AND NOT UIKIT)
+ SOURCES
+ genericunix/qgenericunixthemes.cpp genericunix/qgenericunixthemes_p.h
+)
+
+qt_extend_target(ThemeSupport CONDITION QT_FEATURE_dbus AND (QT_FEATURE_xcb OR UNIX) AND (QT_FEATURE_xcb OR NOT UIKIT)
+ SOURCES
+ genericunix/dbusmenu/qdbusmenuadaptor.cpp genericunix/dbusmenu/qdbusmenuadaptor_p.h
+ genericunix/dbusmenu/qdbusmenubar.cpp genericunix/dbusmenu/qdbusmenubar_p.h
+ genericunix/dbusmenu/qdbusmenuconnection.cpp genericunix/dbusmenu/qdbusmenuconnection_p.h
+ genericunix/dbusmenu/qdbusmenuregistrarproxy.cpp genericunix/dbusmenu/qdbusmenuregistrarproxy_p.h
+ genericunix/dbusmenu/qdbusmenutypes.cpp genericunix/dbusmenu/qdbusmenutypes_p.h
+ genericunix/dbusmenu/qdbusplatformmenu.cpp genericunix/dbusmenu/qdbusplatformmenu_p.h
+ INCLUDE_DIRECTORIES
+ genericunix/dbusmenu
+ LIBRARIES
+ Qt::DBus
+)
+
+qt_extend_target(ThemeSupport CONDITION QT_FEATURE_dbus AND QT_FEATURE_systemtrayicon AND (QT_FEATURE_xcb OR UNIX) AND (QT_FEATURE_xcb OR NOT UIKIT)
+ SOURCES
+ genericunix/dbustray/qdbustrayicon.cpp genericunix/dbustray/qdbustrayicon_p.h
+ genericunix/dbustray/qdbustraytypes.cpp genericunix/dbustray/qdbustraytypes_p.h
+ genericunix/dbustray/qstatusnotifieritemadaptor.cpp genericunix/dbustray/qstatusnotifieritemadaptor_p.h
+ genericunix/dbustray/qxdgnotificationproxy.cpp genericunix/dbustray/qxdgnotificationproxy_p.h
+ INCLUDE_DIRECTORIES
+ genericunix/dbustray
+ LIBRARIES
+ Qt::DBus
+)
diff --git a/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenutypes.cpp b/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenutypes.cpp
index ccf2180dc5..6fadea5d28 100644
--- a/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenutypes.cpp
+++ b/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenutypes.cpp
@@ -48,7 +48,9 @@
#include <QDebug>
#include <QtEndian>
#include <QBuffer>
-#include <private/qkeysequence_p.h>
+#if QT_CONFIG(shortcut)
+# include <private/qkeysequence_p.h>
+#endif
#include <qpa/qplatformmenu.h>
#include "qdbusplatformmenu_p.h"
diff --git a/src/platformsupport/themes/genericunix/dbusmenu/qdbusplatformmenu_p.h b/src/platformsupport/themes/genericunix/dbusmenu/qdbusplatformmenu_p.h
index 8a31f82fb0..aa0f303416 100644
--- a/src/platformsupport/themes/genericunix/dbusmenu/qdbusplatformmenu_p.h
+++ b/src/platformsupport/themes/genericunix/dbusmenu/qdbusplatformmenu_p.h
@@ -96,7 +96,7 @@ public:
void setChecked(bool isChecked) override;
bool hasExclusiveGroup() const { return m_hasExclusiveGroup; }
void setHasExclusiveGroup(bool hasExclusiveGroup) override;
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
QKeySequence shortcut() const { return m_shortcut; }
void setShortcut(const QKeySequence& shortcut) override;
#endif
@@ -123,7 +123,9 @@ private:
bool m_hasExclusiveGroup : 1;
short /*unused*/ : 6;
short m_dbusID : 16;
+#if QT_CONFIG(shortcut)
QKeySequence m_shortcut;
+#endif
};
class QDBusPlatformMenu : public QPlatformMenu
diff --git a/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h b/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h
index 7034a7edb4..edc115742c 100644
--- a/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h
+++ b/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h
@@ -83,6 +83,7 @@ class QDBusTrayIcon: public QPlatformSystemTrayIcon
Q_PROPERTY(QString attentionIconName READ attentionIconName NOTIFY attention)
Q_PROPERTY(QIcon attentionIcon READ attentionIcon NOTIFY attention)
Q_PROPERTY(QDBusPlatformMenu *menu READ menu NOTIFY menuChanged)
+ Q_MOC_INCLUDE("qdbusplatformmenu_p.h")
public:
QDBusTrayIcon();
diff --git a/src/platformsupport/vkconvenience/.prev_CMakeLists.txt b/src/platformsupport/vkconvenience/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..6f17cfa306
--- /dev/null
+++ b/src/platformsupport/vkconvenience/.prev_CMakeLists.txt
@@ -0,0 +1,31 @@
+# Generated from vkconvenience.pro.
+
+#####################################################################
+## VulkanSupport Module:
+#####################################################################
+
+qt_add_module(VulkanSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qbasicvulkanplatforminstance.cpp qbasicvulkanplatforminstance_p.h
+ qvkconvenience.cpp qvkconvenience_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:vkconvenience.pro:<TRUE>:
+# MODULE = "vulkan_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(VulkanSupport CONDITION QT_FEATURE_opengl
+ PUBLIC_LIBRARIES
+ Qt::OpenGL
+)
diff --git a/src/platformsupport/vkconvenience/CMakeLists.txt b/src/platformsupport/vkconvenience/CMakeLists.txt
new file mode 100644
index 0000000000..6ec2574375
--- /dev/null
+++ b/src/platformsupport/vkconvenience/CMakeLists.txt
@@ -0,0 +1,33 @@
+# Generated from vkconvenience.pro.
+
+qt_find_package(Vulkan) # special case
+
+#####################################################################
+## VulkanSupport Module:
+#####################################################################
+
+qt_add_module(VulkanSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qbasicvulkanplatforminstance.cpp qbasicvulkanplatforminstance_p.h
+ qvkconvenience.cpp qvkconvenience_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "../../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:vkconvenience.pro:<TRUE>:
+# MODULE = "vulkan_support"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(VulkanSupport CONDITION QT_FEATURE_opengl
+ PUBLIC_LIBRARIES
+ Qt::OpenGL
+)
diff --git a/src/platformsupport/vkconvenience/qvkconvenience.cpp b/src/platformsupport/vkconvenience/qvkconvenience.cpp
index acde1d1bda..59de335333 100644
--- a/src/platformsupport/vkconvenience/qvkconvenience.cpp
+++ b/src/platformsupport/vkconvenience/qvkconvenience.cpp
@@ -39,7 +39,9 @@
#include "qvkconvenience_p.h"
-#include <QOpenGLTexture>
+#if QT_CONFIG(opengl)
+#include <QtOpenGL/QOpenGLTexture>
+#endif
QT_BEGIN_NAMESPACE
diff --git a/src/platformsupport/vkconvenience/vkconvenience.pro b/src/platformsupport/vkconvenience/vkconvenience.pro
index ee540024cf..f3ada5768a 100644
--- a/src/platformsupport/vkconvenience/vkconvenience.pro
+++ b/src/platformsupport/vkconvenience/vkconvenience.pro
@@ -2,6 +2,8 @@ TARGET = QtVulkanSupport
MODULE = vulkan_support
QT = core-private gui-private
+qtConfig(opengl): QT += opengl
+
CONFIG += static internal_module
DEFINES += QT_NO_CAST_FROM_ASCII
diff --git a/src/platformsupport/windowsuiautomation/CMakeLists.txt b/src/platformsupport/windowsuiautomation/CMakeLists.txt
new file mode 100644
index 0000000000..c610b97fd6
--- /dev/null
+++ b/src/platformsupport/windowsuiautomation/CMakeLists.txt
@@ -0,0 +1,28 @@
+# Generated from windowsuiautomation.pro.
+
+#####################################################################
+## WindowsUIAutomationSupport Module:
+#####################################################################
+
+qt_add_module(WindowsUIAutomationSupport
+ STATIC
+ INTERNAL_MODULE
+ SOURCES
+ qwindowsuiawrapper.cpp qwindowsuiawrapper_p.h
+ uiaattributeids_p.h
+ uiaclientinterfaces_p.h
+ uiacontroltypeids_p.h
+ uiaerrorids_p.h
+ uiaeventids_p.h
+ uiageneralids_p.h
+ uiapatternids_p.h
+ uiapropertyids_p.h
+ uiaserverinterfaces_p.h
+ uiatypes_p.h
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:windowsuiautomation.pro:<TRUE>:
+# MODULE = "windowsuiautomation_support"
diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt
new file mode 100644
index 0000000000..8d6516b0b5
--- /dev/null
+++ b/src/plugins/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Generated from plugins.pro.
+
+if(TARGET Qt::Sql)
+ add_subdirectory(sqldrivers)
+endif()
+if(TARGET Qt::Gui)
+ add_subdirectory(platforms)
+ add_subdirectory(platforminputcontexts)
+ add_subdirectory(platformthemes)
+endif()
+if(QT_FEATURE_imageformatplugin AND TARGET Qt::Gui)
+ add_subdirectory(imageformats)
+endif()
+if(QT_FEATURE_library AND TARGET Qt::Gui AND NOT ANDROID)
+ add_subdirectory(generic)
+endif()
+if(TARGET Qt::Widgets)
+ add_subdirectory(styles)
+endif()
+if(TARGET Qt::PrintSupport AND NOT WINRT)
+ add_subdirectory(printsupport)
+endif()
diff --git a/src/plugins/bearer/android/android.pro b/src/plugins/bearer/android/android.pro
deleted file mode 100644
index 6a51abf5d7..0000000000
--- a/src/plugins/bearer/android/android.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-TEMPLATE = subdirs
-
-SUBDIRS += src \
- jar
diff --git a/src/plugins/bearer/android/jar/jar.pro b/src/plugins/bearer/android/jar/jar.pro
deleted file mode 100644
index 8277a8abc1..0000000000
--- a/src/plugins/bearer/android/jar/jar.pro
+++ /dev/null
@@ -1,15 +0,0 @@
-CONFIG += single_arch
-
-TARGET = QtAndroidBearer
-
-load(qt_build_paths)
-CONFIG += java
-DESTDIR = $$MODULE_BASE_OUTDIR/jar
-
-JAVACLASSPATH += $$PWD/src
-
-JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/bearer/QtNetworkReceiver.java
-
-# install
-target.path = $$[QT_INSTALL_PREFIX]/jar
-INSTALLS += target
diff --git a/src/plugins/bearer/android/jar/src/org/qtproject/qt5/android/bearer/QtNetworkReceiver.java b/src/plugins/bearer/android/jar/src/org/qtproject/qt5/android/bearer/QtNetworkReceiver.java
deleted file mode 100644
index 805c90548b..0000000000
--- a/src/plugins/bearer/android/jar/src/org/qtproject/qt5/android/bearer/QtNetworkReceiver.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-package org.qtproject.qt5.android.bearer;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.util.Log;
-import android.net.ConnectivityManager;
-
-public class QtNetworkReceiver
-{
- private static final String LOG_TAG = "QtNetworkReceiver";
- private static native void activeNetworkInfoChanged();
- private static BroadcastReceiverPrivate m_broadcastReceiver = null;
- private static final Object m_lock = new Object();
-
- private static class BroadcastReceiverPrivate extends BroadcastReceiver
- {
- @Override
- public void onReceive(Context context, Intent intent)
- {
- activeNetworkInfoChanged();
- }
- }
-
- private QtNetworkReceiver() {}
-
- public static void registerReceiver(final Context context)
- {
- synchronized (m_lock) {
- if (m_broadcastReceiver == null) {
- m_broadcastReceiver = new BroadcastReceiverPrivate();
- IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
- context.registerReceiver(m_broadcastReceiver, intentFilter);
- }
- }
- }
-
- public static void unregisterReceiver(final Context context)
- {
- synchronized (m_lock) {
- if (m_broadcastReceiver == null)
- return;
-
- context.unregisterReceiver(m_broadcastReceiver);
- }
- }
-
- public static ConnectivityManager getConnectivityManager(final Context context)
- {
- return (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
- }
-}
diff --git a/src/plugins/bearer/android/src/android.json b/src/plugins/bearer/android/src/android.json
deleted file mode 100644
index 6843bd3301..0000000000
--- a/src/plugins/bearer/android/src/android.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "android" ]
-}
diff --git a/src/plugins/bearer/android/src/main.cpp b/src/plugins/bearer/android/src/main.cpp
deleted file mode 100644
index f3a5074e5d..0000000000
--- a/src/plugins/bearer/android/src/main.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qandroidbearerengine.h"
-#include <QtNetwork/private/qbearerplugin_p.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-class QAndroidBearerEnginePlugin : public QBearerEnginePlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QBearerEngineFactoryInterface" FILE "android.json")
-
-public:
- QBearerEngine *create(const QString &key) const override
- {
- return (key == QLatin1String("android")) ? new QAndroidBearerEngine() : 0;
- }
-};
-
-QT_END_NAMESPACE
-
-#include "main.moc"
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/android/src/qandroidbearerengine.cpp b/src/plugins/bearer/android/src/qandroidbearerengine.cpp
deleted file mode 100644
index a43ed69570..0000000000
--- a/src/plugins/bearer/android/src/qandroidbearerengine.cpp
+++ /dev/null
@@ -1,391 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qandroidbearerengine.h"
-#include "../../qnetworksession_impl.h"
-#include "wrappers/androidconnectivitymanager.h"
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-static QString networkConfType(const AndroidNetworkInfo &networkInfo)
-{
- switch (networkInfo.getType()) {
- case AndroidNetworkInfo::Mobile:
- return QStringLiteral("Mobile");
- case AndroidNetworkInfo::Wifi:
- return QStringLiteral("WiFi");
- case AndroidNetworkInfo::Wimax:
- return QStringLiteral("WiMax");
- case AndroidNetworkInfo::Ethernet:
- return QStringLiteral("Ethernet");
- case AndroidNetworkInfo::Bluetooth:
- return QStringLiteral("Bluetooth");
- default:
- break;
- }
-
- return QString();
-}
-
-static inline bool isMobile(QNetworkConfiguration::BearerType type)
-{
- if (type == QNetworkConfiguration::BearerWLAN
- || type == QNetworkConfiguration::BearerWiMAX
- || type == QNetworkConfiguration::BearerBluetooth
- || type == QNetworkConfiguration::BearerEthernet
- || type == QNetworkConfiguration::BearerUnknown) {
- return false;
- }
-
- return true;
-}
-
-static QNetworkConfiguration::BearerType getBearerType(const AndroidNetworkInfo &networkInfo)
-{
- switch (networkInfo.getType()) {
- case AndroidNetworkInfo::Mobile:
- {
- switch (networkInfo.getSubtype()) {
- case AndroidNetworkInfo::Gprs:
- case AndroidNetworkInfo::Edge:
- case AndroidNetworkInfo::Iden: // 2G
- return QNetworkConfiguration::Bearer2G;
- case AndroidNetworkInfo::Umts: // BearerWCDMA (3 .5 .75 G)
- case AndroidNetworkInfo::Hsdpa: // 3G (?) UMTS
- case AndroidNetworkInfo::Hsupa: // 3G (?) UMTS
- return QNetworkConfiguration::BearerWCDMA;
- case AndroidNetworkInfo::Cdma: // CDMA ISA95[AB]
- case AndroidNetworkInfo::Cdma1xRTT: // BearerCDMA2000 (3G)
- case AndroidNetworkInfo::Ehrpd: // CDMA Bridge thing?!?
- return QNetworkConfiguration::BearerCDMA2000;
- case AndroidNetworkInfo::Evdo0: // BearerEVDO
- case AndroidNetworkInfo::EvdoA: // BearerEVDO
- case AndroidNetworkInfo::EvdoB: // BearerEVDO
- return QNetworkConfiguration::BearerEVDO;
- case AndroidNetworkInfo::Hspa:
- case AndroidNetworkInfo::Hspap: // HSPA+
- return QNetworkConfiguration::BearerHSPA;
- case AndroidNetworkInfo::Lte: // BearerLTE (4G)
- return QNetworkConfiguration::BearerLTE;
- default:
- break;
- }
- }
- case AndroidNetworkInfo::Wifi:
- return QNetworkConfiguration::BearerWLAN;
- case AndroidNetworkInfo::Wimax:
- return QNetworkConfiguration::BearerWiMAX;
- case AndroidNetworkInfo::Bluetooth:
- case AndroidNetworkInfo::MobileDun:
- return QNetworkConfiguration::BearerBluetooth;
- case AndroidNetworkInfo::Ethernet:
- return QNetworkConfiguration::BearerEthernet;
- case AndroidNetworkInfo::MobileMms:
- case AndroidNetworkInfo::MobileSupl:
- case AndroidNetworkInfo::MobileHipri:
- case AndroidNetworkInfo::Dummy:
- case AndroidNetworkInfo::UnknownType:
- break;
- }
-
- return QNetworkConfiguration::BearerUnknown;
-}
-
-QAndroidBearerEngine::QAndroidBearerEngine(QObject *parent)
- : QBearerEngineImpl(parent),
- m_connectivityManager(0)
-{
-}
-
-QAndroidBearerEngine::~QAndroidBearerEngine()
-{
-}
-
-QString QAndroidBearerEngine::getInterfaceFromId(const QString &id)
-{
- const QMutexLocker locker(&mutex);
- return m_configurationInterface.value(id);
-}
-
-bool QAndroidBearerEngine::hasIdentifier(const QString &id)
-{
- const QMutexLocker locker(&mutex);
- return m_configurationInterface.contains(id);
-}
-
-void QAndroidBearerEngine::connectToId(const QString &id)
-{
- Q_EMIT connectionError(id, OperationNotSupported);
-}
-
-void QAndroidBearerEngine::disconnectFromId(const QString &id)
-{
- Q_EMIT connectionError(id, OperationNotSupported);
-}
-
-QNetworkSession::State QAndroidBearerEngine::sessionStateForId(const QString &id)
-{
- const QMutexLocker locker(&mutex);
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- if ((!ptr || !ptr->isValid) || m_connectivityManager == 0)
- return QNetworkSession::Invalid;
-
- const QMutexLocker configLocker(&ptr->mutex);
- // Don't re-order...
- if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- return QNetworkSession::Connected;
- } else if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered) {
- return QNetworkSession::Disconnected;
- } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
- return QNetworkSession::NotAvailable;
- } else if ((ptr->state & QNetworkConfiguration::Undefined) == QNetworkConfiguration::Undefined) {
- return QNetworkSession::NotAvailable;
- }
-
- return QNetworkSession::Invalid;
-}
-
-QNetworkConfigurationManager::Capabilities QAndroidBearerEngine::capabilities() const
-{
-
- return AndroidTrafficStats::isTrafficStatsSupported()
- ? QNetworkConfigurationManager::ForcedRoaming
- | QNetworkConfigurationManager::DataStatistics
- : QNetworkConfigurationManager::ForcedRoaming;
-
-}
-
-QNetworkSessionPrivate *QAndroidBearerEngine::createSessionBackend()
-{
- return new QNetworkSessionPrivateImpl();
-}
-
-QNetworkConfigurationPrivatePointer QAndroidBearerEngine::defaultConfiguration()
-{
- return QNetworkConfigurationPrivatePointer();
-}
-
-bool QAndroidBearerEngine::requiresPolling() const
-{
- return false;
-}
-
-quint64 QAndroidBearerEngine::bytesWritten(const QString &id)
-{
- QMutexLocker lock(&mutex);
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
- if (!ptr || !ptr->isValid)
- return 0;
-
- return isMobile(ptr->bearerType)
- ? AndroidTrafficStats::getMobileTxBytes()
- : AndroidTrafficStats::getTotalTxBytes() - AndroidTrafficStats::getMobileTxBytes();
-}
-
-quint64 QAndroidBearerEngine::bytesReceived(const QString &id)
-{
- QMutexLocker lock(&mutex);
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
- if (!ptr || !ptr->isValid)
- return 0;
-
- return isMobile(ptr->bearerType)
- ? AndroidTrafficStats::getMobileRxBytes()
- : AndroidTrafficStats::getTotalRxBytes() - AndroidTrafficStats::getMobileRxBytes();
-}
-
-quint64 QAndroidBearerEngine::startTime(const QString &id)
-{
- Q_UNUSED(id);
- return Q_UINT64_C(0);
-}
-
-void QAndroidBearerEngine::initialize()
-{
- if (m_connectivityManager != 0)
- return;
-
- m_connectivityManager = AndroidConnectivityManager::getInstance();
- if (m_connectivityManager == 0)
- return;
-
- updateConfigurations();
-
- connect(m_connectivityManager, &AndroidConnectivityManager::activeNetworkChanged,
- this, &QAndroidBearerEngine::updateConfigurations);
-
-}
-
-void QAndroidBearerEngine::requestUpdate()
-{
- updateConfigurations();
-}
-
-void QAndroidBearerEngine::updateConfigurations()
-{
-#ifndef QT_NO_NETWORKINTERFACE
- if (m_connectivityManager == 0)
- return;
-
- {
- QMutexLocker locker(&mutex);
- QStringList oldKeys = accessPointConfigurations.keys();
-
- QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
- if (interfaces.isEmpty())
- interfaces = QNetworkInterface::allInterfaces();
-
- // Create a configuration for each of the main types (WiFi, Mobile, Bluetooth, WiMax, Ethernet)
- const auto netInfos = m_connectivityManager->getAllNetworkInfo();
- for (const AndroidNetworkInfo &netInfo : netInfos) {
-
- if (!netInfo.isValid())
- continue;
-
- const QString name = networkConfType(netInfo);
- if (name.isEmpty())
- continue;
-
- QNetworkConfiguration::BearerType bearerType = getBearerType(netInfo);
-
- QString interfaceName;
- QNetworkConfiguration::StateFlag state = QNetworkConfiguration::Defined;
- if (netInfo.isAvailable()) {
- if (netInfo.isConnected()) {
- // Attempt to map an interface to this configuration
- while (!interfaces.isEmpty()) {
- QNetworkInterface interface = interfaces.takeFirst();
- // ignore loopback interface
- if (!interface.isValid())
- continue;
-
- if (interface.flags() & QNetworkInterface::IsLoopBack)
- continue;
- // There is no way to get the interface from the NetworkInfo, so
- // look for an active interface...
- if (interface.flags() & QNetworkInterface::IsRunning
- && !interface.addressEntries().isEmpty()) {
- state = QNetworkConfiguration::Active;
- interfaceName = interface.name();
- break;
- }
- }
- }
- }
-
- const QString key = QString(QLatin1String("android:%1:%2")).arg(name).arg(interfaceName);
- const QString id = QString::number(qHash(key));
- m_configurationInterface[id] = interfaceName;
-
- oldKeys.removeAll(id);
- if (accessPointConfigurations.contains(id)) {
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
- bool changed = false;
- {
- const QMutexLocker confLocker(&ptr->mutex);
-
- if (!ptr->isValid) {
- ptr->isValid = true;
- changed = true;
- }
-
- // Don't reset the bearer type to 'Unknown'
- if (ptr->bearerType != QNetworkConfiguration::BearerUnknown
- && ptr->bearerType != bearerType) {
- ptr->bearerType = bearerType;
- changed = true;
- }
-
- if (ptr->name != name) {
- ptr->name = name;
- changed = true;
- }
-
- if (ptr->id != id) {
- ptr->id = id;
- changed = true;
- }
-
- if (ptr->state != state) {
- ptr->state = state;
- changed = true;
- }
- } // Unlock configuration
-
- if (changed) {
- locker.unlock();
- Q_EMIT configurationChanged(ptr);
- locker.relock();
- }
- } else {
- QNetworkConfigurationPrivatePointer ptr(new QNetworkConfigurationPrivate);
- ptr->name = name;
- ptr->isValid = true;
- ptr->id = id;
- ptr->state = state;
- ptr->type = QNetworkConfiguration::InternetAccessPoint;
- ptr->bearerType = bearerType;
- accessPointConfigurations.insert(id, ptr);
- locker.unlock();
- Q_EMIT configurationAdded(ptr);
- locker.relock();
- }
- }
-
- while (!oldKeys.isEmpty()) {
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(oldKeys.takeFirst());
- m_configurationInterface.remove(ptr->id);
- locker.unlock();
- Q_EMIT configurationRemoved(ptr);
- locker.relock();
- }
-
- } // Unlock engine
-
-#endif // QT_NO_NETWORKINTERFACE
-
- Q_EMIT updateCompleted();
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/android/src/qandroidbearerengine.h b/src/plugins/bearer/android/src/qandroidbearerengine.h
deleted file mode 100644
index 837b02232d..0000000000
--- a/src/plugins/bearer/android/src/qandroidbearerengine.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QANDROIDBEARERENGINE_H
-#define QANDROIDBEARERENGINE_H
-
-#include "../../qbearerengine_impl.h"
-
-#include <QAbstractEventDispatcher>
-#include <QAbstractNativeEventFilter>
-#include <QtCore/private/qjni_p.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkConfigurationPrivate;
-class QNetworkSessionPrivate;
-class AndroidConnectivityManager;
-
-class QAndroidBearerEngine : public QBearerEngineImpl
-{
- Q_OBJECT
-
-public:
- explicit QAndroidBearerEngine(QObject *parent = 0);
- ~QAndroidBearerEngine() override;
-
- QString getInterfaceFromId(const QString &id) override;
- bool hasIdentifier(const QString &id) override;
- void connectToId(const QString &id) override;
- void disconnectFromId(const QString &id) override;
- QNetworkSession::State sessionStateForId(const QString &id) override;
- QNetworkConfigurationManager::Capabilities capabilities() const override;
- QNetworkSessionPrivate *createSessionBackend() override;
- QNetworkConfigurationPrivatePointer defaultConfiguration() override;
- bool requiresPolling() const override;
- quint64 bytesWritten(const QString &id) override;
- quint64 bytesReceived(const QString &id) override;
- quint64 startTime(const QString &id) override;
-
- Q_INVOKABLE void initialize();
- Q_INVOKABLE void requestUpdate();
-
-private Q_SLOTS:
- void updateConfigurations();
-
-private:
- QJNIObjectPrivate m_networkReceiver;
- AndroidConnectivityManager *m_connectivityManager;
- QMap<QString, QString> m_configurationInterface;
-};
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
-
-#endif // QANDROIDBEARERENGINE_H
diff --git a/src/plugins/bearer/android/src/src.pro b/src/plugins/bearer/android/src/src.pro
deleted file mode 100644
index eb0738386c..0000000000
--- a/src/plugins/bearer/android/src/src.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-TARGET = qandroidbearer
-
-QT = core-private network-private
-
-HEADERS += qandroidbearerengine.h \
- ../../qnetworksession_impl.h \
- ../../qbearerengine_impl.h
-
-SOURCES += main.cpp \
- qandroidbearerengine.cpp \
- ../../qnetworksession_impl.cpp
-
-include(wrappers/wrappers.pri)
-
-PLUGIN_TYPE = bearer
-PLUGIN_CLASS_NAME = QAndroidBearerEnginePlugin
-load(qt_plugin)
diff --git a/src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.cpp b/src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.cpp
deleted file mode 100644
index 6787690246..0000000000
--- a/src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.cpp
+++ /dev/null
@@ -1,387 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "androidconnectivitymanager.h"
-#include <QtCore/private/qjni_p.h>
-#include <QtCore/private/qjnihelpers_p.h>
-
-QT_BEGIN_NAMESPACE
-
-static inline bool exceptionCheckAndClear(JNIEnv *env)
-{
- if (!env->ExceptionCheck())
- return false;
-
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif // QT_DEBUG
- env->ExceptionClear();
-
- return true;
-}
-
-struct AndroidConnectivityManagerInstance
-{
- AndroidConnectivityManagerInstance()
- : connManager(new AndroidConnectivityManager)
- { }
- ~AndroidConnectivityManagerInstance()
- {
- delete connManager;
- }
-
- AndroidConnectivityManager* connManager;
-};
-
-Q_GLOBAL_STATIC(AndroidConnectivityManagerInstance, androidConnManagerInstance)
-
-static const char networkReceiverClass[] = "org/qtproject/qt5/android/bearer/QtNetworkReceiver";
-static const char trafficStatsClass[] = "android/net/TrafficStats";
-
-/**
- * Returns the number of bytes transmitted over the mobile network since last device boot.
- */
-qint64 AndroidTrafficStats::getMobileTxBytes()
-{
- return QJNIObjectPrivate::callStaticMethod<jlong>(trafficStatsClass,
- "getMobileTxBytes",
- "()J");
-}
-
-/**
- * Returns the number of bytes received over the mobile network since last device boot.
- */
-qint64 AndroidTrafficStats::getMobileRxBytes()
-{
- return QJNIObjectPrivate::callStaticMethod<jlong>(trafficStatsClass,
- "getMobileRxBytes",
- "()J");
-}
-
-/**
- * Returns the total transmitted bytes since last device boot.
- */
-qint64 AndroidTrafficStats::getTotalTxBytes()
-{
- return QJNIObjectPrivate::callStaticMethod<jlong>(trafficStatsClass,
- "getTotalTxBytes",
- "()J");
-}
-
-/**
- * Returns the total received bytes since last device boot.
- */
-qint64 AndroidTrafficStats::getTotalRxBytes()
-{
- return QJNIObjectPrivate::callStaticMethod<jlong>(trafficStatsClass,
- "getTotalRxBytes",
- "()J");
-}
-
-bool AndroidTrafficStats::isTrafficStatsSupported()
-{
- // Before API level 18 DataStatistics might not be supported, so make sure that we get something
- // else then -1 from from getXXBytes().
- return (AndroidTrafficStats::getMobileRxBytes() != -1
- && AndroidTrafficStats::getTotalRxBytes() != -1);
-}
-
-static AndroidNetworkInfo::NetworkState stateForName(const QString &stateName)
-{
- if (stateName == QLatin1String("CONNECTED"))
- return AndroidNetworkInfo::Connected;
- else if (stateName == QLatin1String("CONNECTING"))
- return AndroidNetworkInfo::Connecting;
- else if (stateName == QLatin1String("DISCONNECTED"))
- return AndroidNetworkInfo::Disconnected;
- else if (stateName == QLatin1String("DISCONNECTING"))
- return AndroidNetworkInfo::Disconnecting;
- else if (stateName == QLatin1String("SUSPENDED"))
- return AndroidNetworkInfo::Suspended;
-
- return AndroidNetworkInfo::UnknownState;
-}
-
-AndroidNetworkInfo::NetworkState AndroidNetworkInfo::getDetailedState() const
-{
- QJNIObjectPrivate enumObject = m_networkInfo.callObjectMethod("getDetailedState",
- "()Landroid/net/NetworkInfo$DetailedState;");
- if (!enumObject.isValid())
- return UnknownState;
-
- QJNIObjectPrivate enumName = enumObject.callObjectMethod<jstring>("name");
- if (!enumName.isValid())
- return UnknownState;
-
- return stateForName(enumName.toString());
-}
-
-QString AndroidNetworkInfo::getExtraInfo() const
-{
- QJNIObjectPrivate extraInfo = m_networkInfo.callObjectMethod<jstring>("getExtraInfo");
- if (!extraInfo.isValid())
- return QString();
-
- return extraInfo.toString();
-}
-
-QString AndroidNetworkInfo::getReason() const
-{
- QJNIObjectPrivate reason = m_networkInfo.callObjectMethod<jstring>("getReason");
- if (!reason.isValid())
- return QString();
-
- return reason.toString();
-}
-
-AndroidNetworkInfo::NetworkState AndroidNetworkInfo::getState() const
-{
- QJNIObjectPrivate enumObject = m_networkInfo.callObjectMethod("getState",
- "()Landroid/net/NetworkInfo$State;");
- if (!enumObject.isValid())
- return UnknownState;
-
- QJNIObjectPrivate enumName = enumObject.callObjectMethod<jstring>("name");
- if (!enumName.isValid())
- return UnknownState;
-
- return stateForName(enumName.toString());
-}
-
-AndroidNetworkInfo::NetworkSubType AndroidNetworkInfo::getSubtype() const
-{
- return AndroidNetworkInfo::NetworkSubType(m_networkInfo.callMethod<jint>("getSubtype"));
-}
-
-QString AndroidNetworkInfo::getSubtypeName() const
-{
- QJNIObjectPrivate subtypeName = m_networkInfo.callObjectMethod<jstring>("getSubtypeName");
- if (!subtypeName.isValid())
- return QString();
-
- return subtypeName.toString();
-}
-
-AndroidNetworkInfo::NetworkType AndroidNetworkInfo::getType() const
-{
- return AndroidNetworkInfo::NetworkType(m_networkInfo.callMethod<jint>("getType"));
-}
-
-QString AndroidNetworkInfo::getTypeName() const
-{
- QJNIObjectPrivate typeName = m_networkInfo.callObjectMethod<jstring>("getTypeName");
- if (!typeName.isValid())
- return QString();
-
- return typeName.toString();
-}
-
-bool AndroidNetworkInfo::isAvailable() const
-{
- return m_networkInfo.callMethod<jboolean>("isAvailable");
-}
-
-bool AndroidNetworkInfo::isConnected() const
-{
- return m_networkInfo.callMethod<jboolean>("isConnected");
-}
-
-bool AndroidNetworkInfo::isConnectedOrConnecting() const
-{
- return m_networkInfo.callMethod<jboolean>("isConnectedOrConnecting");
-}
-
-bool AndroidNetworkInfo::isFailover() const
-{
- return m_networkInfo.callMethod<jboolean>("isFailover");
-}
-
-bool AndroidNetworkInfo::isRoaming() const
-{
- return m_networkInfo.callMethod<jboolean>("isRoaming");
-}
-
-bool AndroidNetworkInfo::isValid() const
-{
- return m_networkInfo.isValid();
-}
-
-AndroidConnectivityManager::AndroidConnectivityManager()
-{
- QJNIEnvironmentPrivate env;
- if (!registerNatives(env))
- return;
-
- m_connectivityManager = QJNIObjectPrivate::callStaticObjectMethod(networkReceiverClass,
- "getConnectivityManager",
- "(Landroid/content/Context;)Landroid/net/ConnectivityManager;",
- QtAndroidPrivate::context());
- if (!m_connectivityManager.isValid())
- return;
-
- QJNIObjectPrivate::callStaticMethod<void>(networkReceiverClass,
- "registerReceiver",
- "(Landroid/content/Context;)V",
- QtAndroidPrivate::context());
-}
-
-AndroidConnectivityManager *AndroidConnectivityManager::getInstance()
-{
- return androidConnManagerInstance->connManager->isValid()
- ? androidConnManagerInstance->connManager
- : 0;
-}
-
-AndroidConnectivityManager::~AndroidConnectivityManager()
-{
- QJNIObjectPrivate::callStaticMethod<void>(networkReceiverClass,
- "unregisterReceiver",
- "(Landroid/content/Context;)V",
- QtAndroidPrivate::context());
-}
-
-AndroidNetworkInfo AndroidConnectivityManager::getActiveNetworkInfo() const
-{
- QJNIObjectPrivate networkInfo = m_connectivityManager.callObjectMethod("getActiveNetworkInfo",
- "()Landroid/net/NetworkInfo;");
- return networkInfo;
-}
-
-QList<AndroidNetworkInfo> AndroidConnectivityManager::getAllNetworkInfo() const
-{
- QJNIEnvironmentPrivate env;
- QJNIObjectPrivate objArray = m_connectivityManager.callObjectMethod("getAllNetworkInfo",
- "()[Landroid/net/NetworkInfo;");
- QList<AndroidNetworkInfo> list;
- if (!objArray.isValid())
- return list;
-
- const jsize length = env->GetArrayLength(static_cast<jarray>(objArray.object()));
- if (exceptionCheckAndClear(env))
- return list;
-
- for (int i = 0; i != length; ++i) {
- jobject lref = env->GetObjectArrayElement(static_cast<jobjectArray>(objArray.object()), i);
- if (exceptionCheckAndClear(env))
- break;
-
- list << AndroidNetworkInfo(QJNIObjectPrivate::fromLocalRef(lref));
- }
-
- return list;
-}
-
-bool AndroidConnectivityManager::getBackgroundDataSetting() const
-{
- return m_connectivityManager.callMethod<jboolean>("getBackgroundDataSetting");
-}
-
-AndroidNetworkInfo AndroidConnectivityManager::getNetworkInfo(int networkType) const
-{
- QJNIObjectPrivate networkInfo = m_connectivityManager.callObjectMethod("getNetworkInfo",
- "(I)Landroid/net/NetworkInfo;",
- networkType);
- return networkInfo;
-}
-
-int AndroidConnectivityManager::getNetworkPreference() const
-{
- return m_connectivityManager.callMethod<jint>("getNetworkPreference");
-}
-
-bool AndroidConnectivityManager::isActiveNetworkMetered() const
-{
- return m_connectivityManager.callMethod<jboolean>("isActiveNetworkMetered");
-}
-
-bool AndroidConnectivityManager::isNetworkTypeValid(int networkType)
-{
- return QJNIObjectPrivate::callStaticMethod<jboolean>("android/net/ConnectivityManager",
- "isNetworkTypeValid",
- "(I)Z",
- networkType);
-}
-
-bool AndroidConnectivityManager::requestRouteToHost(int networkType, int hostAddress)
-{
- return m_connectivityManager.callMethod<jboolean>("requestRouteToHost", "(II)Z", networkType, hostAddress);
-}
-
-void AndroidConnectivityManager::setNetworkPreference(int preference)
-{
- m_connectivityManager.callMethod<void>("setNetworkPreference", "(I)V", preference);
-}
-
-int AndroidConnectivityManager::startUsingNetworkFeature(int networkType, const QString &feature)
-{
- QJNIObjectPrivate jfeature = QJNIObjectPrivate::fromString(feature);
- return m_connectivityManager.callMethod<jint>("startUsingNetworkFeature",
- "(ILjava/lang/String;)I",
- networkType,
- jfeature.object());
-}
-
-int AndroidConnectivityManager::stopUsingNetworkFeature(int networkType, const QString &feature)
-{
- QJNIObjectPrivate jfeature = QJNIObjectPrivate::fromString(feature);
- return m_connectivityManager.callMethod<jint>("stopUsingNetworkFeature",
- "(ILjava/lang/String;)I",
- networkType,
- jfeature.object());
-}
-
-static void activeNetworkInfoChanged()
-{
- Q_EMIT androidConnManagerInstance->connManager->activeNetworkChanged();
-}
-
-bool AndroidConnectivityManager::registerNatives(JNIEnv *env)
-{
- QJNIObjectPrivate networkReceiver(networkReceiverClass);
- if (!networkReceiver.isValid())
- return false;
-
- jclass clazz = env->GetObjectClass(networkReceiver.object());
- static JNINativeMethod method = {"activeNetworkInfoChanged", "()V", reinterpret_cast<void *>(activeNetworkInfoChanged)};
- const bool ret = (env->RegisterNatives(clazz, &method, 1) == JNI_OK);
- env->DeleteLocalRef(clazz);
- return ret;
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.h b/src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.h
deleted file mode 100644
index 7c410b0087..0000000000
--- a/src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef ANDROIDCONNECTIVITYMANAGER_H
-#define ANDROIDCONNECTIVITYMANAGER_H
-
-#include <QObject>
-#include <QtCore/private/qjni_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class AndroidTrafficStats
-{
-public:
- static qint64 getMobileTxBytes();
- static qint64 getMobileRxBytes();
- static qint64 getTotalTxBytes();
- static qint64 getTotalRxBytes();
- static bool isTrafficStatsSupported();
-};
-
-class AndroidNetworkInfo
-{
-public:
- // Needs to be in sync with the values from the android api.
- enum NetworkState {
- UnknownState,
- Authenticating,
- Blocked,
- CaptivePortalCheck,
- Connected,
- Connecting,
- Disconnected,
- Disconnecting,
- Failed,
- Idle,
- ObtainingIpAddr,
- Scanning,
- Suspended,
- VerifyingPoorLink
- };
-
- enum NetworkType {
- Mobile,
- Wifi,
- MobileMms,
- MobileSupl,
- MobileDun,
- MobileHipri,
- Wimax,
- Bluetooth,
- Dummy,
- Ethernet,
- UnknownType
- };
-
- enum NetworkSubType {
- UnknownSubType,
- Gprs,
- Edge,
- Umts,
- Cdma,
- Evdo0,
- EvdoA,
- Cdma1xRTT,
- Hsdpa,
- Hsupa,
- Hspa,
- Iden,
- EvdoB,
- Lte,
- Ehrpd,
- Hspap
- };
-
- inline AndroidNetworkInfo(const QJNIObjectPrivate &obj) : m_networkInfo(obj)
- { }
-
- NetworkState getDetailedState() const;
- QString getExtraInfo() const;
- QString getReason() const;
- NetworkState getState() const;
- NetworkSubType getSubtype() const;
- QString getSubtypeName() const;
- NetworkType getType() const;
- QString getTypeName() const;
- bool isAvailable() const;
- bool isConnected() const;
- bool isConnectedOrConnecting() const;
- bool isFailover() const;
- bool isRoaming() const;
- bool isValid() const;
-
-private:
- QJNIObjectPrivate m_networkInfo;
-};
-
-class AndroidConnectivityManager : public QObject
-{
- Q_OBJECT
-public:
- static AndroidConnectivityManager *getInstance();
- ~AndroidConnectivityManager();
-
- AndroidNetworkInfo getActiveNetworkInfo() const;
- QList<AndroidNetworkInfo> getAllNetworkInfo() const;
- bool getBackgroundDataSetting() const;
- AndroidNetworkInfo getNetworkInfo(int networkType) const;
- int getNetworkPreference() const;
- bool isActiveNetworkMetered() const;
- static bool isNetworkTypeValid(int networkType);
- bool requestRouteToHost(int networkType, int hostAddress);
- void setNetworkPreference(int preference);
- int startUsingNetworkFeature(int networkType, const QString &feature);
- int stopUsingNetworkFeature(int networkType, const QString &feature);
- inline bool isValid() const
- {
- return m_connectivityManager.isValid();
- }
-
- Q_SIGNAL void activeNetworkChanged();
-
-private:
- friend struct AndroidConnectivityManagerInstance;
- AndroidConnectivityManager();
- bool registerNatives(JNIEnv *env);
- QJNIObjectPrivate m_connectivityManager;
-};
-
-QT_END_NAMESPACE
-
-#endif // ANDROIDCONNECTIVITYMANAGER_H
diff --git a/src/plugins/bearer/android/src/wrappers/wrappers.pri b/src/plugins/bearer/android/src/wrappers/wrappers.pri
deleted file mode 100644
index 209b76e533..0000000000
--- a/src/plugins/bearer/android/src/wrappers/wrappers.pri
+++ /dev/null
@@ -1,6 +0,0 @@
-INCLUDEPATH += $$PWD
-
-HEADERS += \
- $$PWD/androidconnectivitymanager.h
-SOURCES += \
- $$PWD/androidconnectivitymanager.cpp
diff --git a/src/plugins/bearer/bearer.pro b/src/plugins/bearer/bearer.pro
deleted file mode 100644
index afdc613167..0000000000
--- a/src/plugins/bearer/bearer.pro
+++ /dev/null
@@ -1,11 +0,0 @@
-TEMPLATE = subdirs
-QT_FOR_CONFIG += network-private
-
-!android:linux*:qtHaveModule(dbus) {
- SUBDIRS += generic
- SUBDIRS += connman networkmanager
-}
-
-android:!android-embedded: SUBDIRS += android
-
-isEmpty(SUBDIRS):SUBDIRS = generic
diff --git a/src/plugins/bearer/connman/connman.json b/src/plugins/bearer/connman/connman.json
deleted file mode 100644
index 7a80b8c9be..0000000000
--- a/src/plugins/bearer/connman/connman.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "connman" ]
-}
diff --git a/src/plugins/bearer/connman/connman.pro b/src/plugins/bearer/connman/connman.pro
deleted file mode 100644
index 065ed11dad..0000000000
--- a/src/plugins/bearer/connman/connman.pro
+++ /dev/null
@@ -1,21 +0,0 @@
-TARGET = qconnmanbearer
-
-QT = core network-private dbus
-
-HEADERS += qconnmanservice_linux_p.h \
- ../linux_common/qofonoservice_linux_p.h \
- qconnmanengine.h \
- ../qnetworksession_impl.h \
- ../qbearerengine_impl.h
-
-SOURCES += main.cpp \
- qconnmanservice_linux.cpp \
- ../linux_common/qofonoservice_linux.cpp \
- qconnmanengine.cpp \
- ../qnetworksession_impl.cpp
-
-OTHER_FILES += connman.json
-
-PLUGIN_TYPE = bearer
-PLUGIN_CLASS_NAME = QConnmanEnginePlugin
-load(qt_plugin)
diff --git a/src/plugins/bearer/connman/main.cpp b/src/plugins/bearer/connman/main.cpp
deleted file mode 100644
index 03c8a7f6c5..0000000000
--- a/src/plugins/bearer/connman/main.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include "qconnmanengine.h"
-
-#include <QtNetwork/private/qbearerplugin_p.h>
-
-#include <QtCore/qdebug.h>
-
-#ifndef QT_NO_DBUS
-
-QT_BEGIN_NAMESPACE
-
-class QConnmanEnginePlugin : public QBearerEnginePlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QBearerEngineFactoryInterface" FILE "connman.json")
-
-public:
- QConnmanEnginePlugin();
- ~QConnmanEnginePlugin();
-
- QBearerEngine *create(const QString &key) const;
-};
-
-QConnmanEnginePlugin::QConnmanEnginePlugin()
-{
-}
-
-QConnmanEnginePlugin::~QConnmanEnginePlugin()
-{
-}
-
-QBearerEngine *QConnmanEnginePlugin::create(const QString &key) const
-{
- if (key == QLatin1String("connman")) {
- QConnmanEngine *engine = new QConnmanEngine;
- if (engine->connmanAvailable())
- return engine;
- else
- delete engine;
- }
- return 0;
-}
-
-QT_END_NAMESPACE
-
-#include "main.moc"
-
-#endif
diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp
deleted file mode 100644
index 8b2076bd18..0000000000
--- a/src/plugins/bearer/connman/qconnmanengine.cpp
+++ /dev/null
@@ -1,570 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qconnmanengine.h"
-#include "qconnmanservice_linux_p.h"
-#include "../qnetworksession_impl.h"
-
-#include <QtNetwork/private/qnetworkconfiguration_p.h>
-
-#include <QtNetwork/qnetworksession.h>
-
-#include <QtCore/qdebug.h>
-#include <QtCore/private/qlocking_p.h>
-
-#include <QtDBus/QtDBus>
-#include <QtDBus/QDBusConnection>
-#include <QtDBus/QDBusInterface>
-#include <QtDBus/QDBusMessage>
-#include <QtDBus/QDBusReply>
-#ifndef QT_NO_DBUS
-
-QT_BEGIN_NAMESPACE
-
-QConnmanEngine::QConnmanEngine(QObject *parent)
-: QBearerEngineImpl(parent),
- connmanManager(new QConnmanManagerInterface(this)),
- ofonoManager(new QOfonoManagerInterface(this)),
- ofonoNetwork(0),
- ofonoContextManager(0)
-{
- qDBusRegisterMetaType<ConnmanMap>();
- qDBusRegisterMetaType<ConnmanMapList>();
- qRegisterMetaType<ConnmanMapList>("ConnmanMapList");
-}
-
-QConnmanEngine::~QConnmanEngine()
-{
-}
-
-bool QConnmanEngine::connmanAvailable() const
-{
- const auto locker = qt_scoped_lock(mutex);
- return connmanManager->isValid();
-}
-
-void QConnmanEngine::initialize()
-{
- const auto locker = qt_scoped_lock(mutex);
- connect(ofonoManager,SIGNAL(modemChanged()),this,SLOT(changedModem()));
-
- ofonoNetwork = new QOfonoNetworkRegistrationInterface(ofonoManager->currentModem(),this);
- ofonoContextManager = new QOfonoDataConnectionManagerInterface(ofonoManager->currentModem(),this);
- connect(ofonoContextManager,SIGNAL(roamingAllowedChanged(bool)),this,SLOT(reEvaluateCellular()));
-
- connect(connmanManager,SIGNAL(servicesChanged(ConnmanMapList,QList<QDBusObjectPath>)),
- this, SLOT(updateServices(ConnmanMapList,QList<QDBusObjectPath>)));
-
- connect(connmanManager,SIGNAL(servicesReady(QStringList)),this,SLOT(servicesReady(QStringList)));
- connect(connmanManager,SIGNAL(scanFinished(bool)),this,SLOT(finishedScan(bool)));
-
- const auto servPaths = connmanManager->getServices();
- for (const QString &servPath : servPaths)
- addServiceConfiguration(servPath);
- Q_EMIT updateCompleted();
-}
-
-void QConnmanEngine::changedModem()
-{
- const auto locker = qt_scoped_lock(mutex);
- if (ofonoNetwork)
- delete ofonoNetwork;
-
- ofonoNetwork = new QOfonoNetworkRegistrationInterface(ofonoManager->currentModem(),this);
-
- if (ofonoContextManager)
- delete ofonoContextManager;
- ofonoContextManager = new QOfonoDataConnectionManagerInterface(ofonoManager->currentModem(),this);
-}
-
-void QConnmanEngine::servicesReady(const QStringList &list)
-{
- const auto locker = qt_scoped_lock(mutex);
- for (const QString &servPath : list)
- addServiceConfiguration(servPath);
-
- Q_EMIT updateCompleted();
-}
-
-QList<QNetworkConfigurationPrivate *> QConnmanEngine::getConfigurations()
-{
- const auto locker = qt_scoped_lock(mutex);
- QList<QNetworkConfigurationPrivate *> fetchedConfigurations;
- QNetworkConfigurationPrivate* cpPriv = 0;
- const int numFoundConfigurations = foundConfigurations.count();
- fetchedConfigurations.reserve(numFoundConfigurations);
-
- for (int i = 0; i < numFoundConfigurations; ++i) {
- QNetworkConfigurationPrivate *config = new QNetworkConfigurationPrivate;
- cpPriv = foundConfigurations.at(i);
-
- config->name = cpPriv->name;
- config->isValid = cpPriv->isValid;
- config->id = cpPriv->id;
- config->state = cpPriv->state;
- config->type = cpPriv->type;
- config->roamingSupported = cpPriv->roamingSupported;
- config->purpose = cpPriv->purpose;
- config->bearerType = cpPriv->bearerType;
-
- fetchedConfigurations.append(config);
- delete config;
- }
- return fetchedConfigurations;
-}
-
-QString QConnmanEngine::getInterfaceFromId(const QString &id)
-{
- const auto locker = qt_scoped_lock(mutex);
- return configInterfaces.value(id);
-}
-
-bool QConnmanEngine::hasIdentifier(const QString &id)
-{
- const auto locker = qt_scoped_lock(mutex);
- return accessPointConfigurations.contains(id);
-}
-
-void QConnmanEngine::connectToId(const QString &id)
-{
- const auto locker = qt_scoped_lock(mutex);
-
- QConnmanServiceInterface *serv = connmanServiceInterfaces.value(id);
-
- if (!serv || !serv->isValid()) {
- emit connectionError(id, QBearerEngineImpl::InterfaceLookupError);
- } else {
- if (serv->type() == QLatin1String("cellular")) {
- if (serv->roaming()) {
- if (!isRoamingAllowed(serv->path())) {
- emit connectionError(id, QBearerEngineImpl::OperationNotSupported);
- return;
- }
- }
- }
- if (serv->autoConnect())
- serv->connect();
- }
-}
-
-void QConnmanEngine::disconnectFromId(const QString &id)
-{
- const auto locker = qt_scoped_lock(mutex);
- QConnmanServiceInterface *serv = connmanServiceInterfaces.value(id);
-
- if (!serv || !serv->isValid()) {
- emit connectionError(id, DisconnectionError);
- } else {
- serv->disconnect();
- }
-}
-
-void QConnmanEngine::requestUpdate()
-{
- const auto locker = qt_scoped_lock(mutex);
- QTimer::singleShot(0, this, SLOT(doRequestUpdate()));
-}
-
-void QConnmanEngine::doRequestUpdate()
-{
- bool scanned = connmanManager->requestScan("wifi");
- if (!scanned)
- Q_EMIT updateCompleted();
-}
-
-void QConnmanEngine::finishedScan(bool error)
-{
- if (error)
- Q_EMIT updateCompleted();
-}
-
-void QConnmanEngine::updateServices(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed)
-{
- const auto locker = qt_scoped_lock(mutex);
-
- foreach (const QDBusObjectPath &objectPath, removed) {
- removeConfiguration(objectPath.path());
- }
-
- foreach (const ConnmanMap &connmanMap, changed) {
- const QString id = connmanMap.objectPath.path();
- if (accessPointConfigurations.contains(id)) {
- configurationChange(connmanServiceInterfaces.value(id));
- } else {
- addServiceConfiguration(connmanMap.objectPath.path());
- }
- }
- Q_EMIT updateCompleted();
-}
-
-QNetworkSession::State QConnmanEngine::sessionStateForId(const QString &id)
-{
- const auto locker = qt_scoped_lock(mutex);
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- if (!ptr || !ptr->isValid)
- return QNetworkSession::Invalid;
-
- QString service = id;
- QConnmanServiceInterface *serv = connmanServiceInterfaces.value(service);
- if (!serv)
- return QNetworkSession::Invalid;
-
- QString servState = serv->state();
-
- if (serv->favorite() && (servState == QLatin1String("idle") || servState == QLatin1String("failure"))) {
- return QNetworkSession::Disconnected;
- }
-
- if (servState == QLatin1String("association") || servState == QLatin1String("configuration")) {
- return QNetworkSession::Connecting;
- }
-
- if (servState == QLatin1String("online") || servState == QLatin1String("ready")) {
- return QNetworkSession::Connected;
- }
-
- if ((ptr->state & QNetworkConfiguration::Discovered) ==
- QNetworkConfiguration::Discovered) {
- return QNetworkSession::Disconnected;
- } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
- return QNetworkSession::NotAvailable;
- } else if ((ptr->state & QNetworkConfiguration::Undefined) ==
- QNetworkConfiguration::Undefined) {
- return QNetworkSession::NotAvailable;
- }
-
- return QNetworkSession::Invalid;
-}
-
-quint64 QConnmanEngine::bytesWritten(const QString &id)
-{//TODO use connman counter API
- const auto locker = qt_scoped_lock(mutex);
- quint64 result = 0;
- QString devFile = getInterfaceFromId(id);
- QFile tx("/sys/class/net/"+devFile+"/statistics/tx_bytes");
- if (tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QTextStream in(&tx);
- in >> result;
- tx.close();
- }
-
- return result;
-}
-
-quint64 QConnmanEngine::bytesReceived(const QString &id)
-{//TODO use connman counter API
- const auto locker = qt_scoped_lock(mutex);
- quint64 result = 0;
- QString devFile = getInterfaceFromId(id);
- QFile rx("/sys/class/net/"+devFile+"/statistics/rx_bytes");
- if (rx.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QTextStream in(&rx);
- in >> result;
- rx.close();
- }
- return result;
-}
-
-quint64 QConnmanEngine::startTime(const QString &/*id*/)
-{
- // TODO
- const auto locker = qt_scoped_lock(mutex);
- if (activeTime.isNull()) {
- return 0;
- }
- return activeTime.secsTo(QDateTime::currentDateTime());
-}
-
-QNetworkConfigurationManager::Capabilities QConnmanEngine::capabilities() const
-{
- return QNetworkConfigurationManager::ForcedRoaming |
- QNetworkConfigurationManager::DataStatistics |
- QNetworkConfigurationManager::CanStartAndStopInterfaces |
- QNetworkConfigurationManager::NetworkSessionRequired;
-}
-
-QNetworkSessionPrivate *QConnmanEngine::createSessionBackend()
-{
- return new QNetworkSessionPrivateImpl;
-}
-
-QNetworkConfigurationPrivatePointer QConnmanEngine::defaultConfiguration()
-{
- const auto locker = qt_scoped_lock(mutex);
- const auto servPaths = connmanManager->getServices();
- for (const QString &servPath : servPaths) {
- if (connmanServiceInterfaces.contains(servPath)) {
- if (accessPointConfigurations.contains(servPath))
- return accessPointConfigurations.value(servPath);
- }
- }
- return QNetworkConfigurationPrivatePointer();
-}
-
-void QConnmanEngine::serviceStateChanged(const QString &state)
-{
- QConnmanServiceInterface *service = qobject_cast<QConnmanServiceInterface *>(sender());
- configurationChange(service);
-
- if (state == QLatin1String("failure")) {
- emit connectionError(service->path(), ConnectError);
- }
-}
-
-void QConnmanEngine::configurationChange(QConnmanServiceInterface *serv)
-{
- if (!serv)
- return;
- auto locker = qt_unique_lock(mutex);
- QString id = serv->path();
-
- if (accessPointConfigurations.contains(id)) {
- bool changed = false;
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
- QString networkName = serv->name();
- QNetworkConfiguration::StateFlags curState = getStateForService(serv->path());
- ptr->mutex.lock();
-
- if (!ptr->isValid) {
- ptr->isValid = true;
- }
-
- if (ptr->name != networkName) {
- ptr->name = networkName;
- changed = true;
- }
-
- if (ptr->state != curState) {
- ptr->state = curState;
- changed = true;
- }
-
- ptr->mutex.unlock();
-
- if (changed) {
- locker.unlock();
- emit configurationChanged(ptr);
- locker.lock();
- }
- }
-
- locker.unlock();
- emit updateCompleted();
-}
-
-QNetworkConfiguration::StateFlags QConnmanEngine::getStateForService(const QString &service)
-{
- const auto locker = qt_scoped_lock(mutex);
- QConnmanServiceInterface *serv = connmanServiceInterfaces.value(service);
- if (!serv)
- return QNetworkConfiguration::Undefined;
-
- QString state = serv->state();
- QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
-
- if (serv->type() == QLatin1String("cellular")) {
-
- if (!serv->autoConnect()|| (serv->roaming()
- && !isRoamingAllowed(serv->path()))) {
- flag = (flag | QNetworkConfiguration::Defined);
- } else {
- flag = (flag | QNetworkConfiguration::Discovered);
- }
- } else {
- if (serv->favorite()) {
- if (serv->autoConnect()) {
- flag = (flag | QNetworkConfiguration::Discovered);
- }
- } else {
- flag = QNetworkConfiguration::Undefined;
- }
- }
- if (state == QLatin1String("online") || state == QLatin1String("ready")) {
- flag = (flag | QNetworkConfiguration::Active);
- }
-
- return flag;
-}
-
-QNetworkConfiguration::BearerType QConnmanEngine::typeToBearer(const QString &type)
-{
- if (type == QLatin1String("wifi"))
- return QNetworkConfiguration::BearerWLAN;
- if (type == QLatin1String("ethernet"))
- return QNetworkConfiguration::BearerEthernet;
- if (type == QLatin1String("bluetooth"))
- return QNetworkConfiguration::BearerBluetooth;
- if (type == QLatin1String("cellular")) {
- return ofonoTechToBearerType(type);
- }
- if (type == QLatin1String("wimax"))
- return QNetworkConfiguration::BearerWiMAX;
-
- return QNetworkConfiguration::BearerUnknown;
-}
-
-QNetworkConfiguration::BearerType QConnmanEngine::ofonoTechToBearerType(const QString &/*type*/)
-{
- if (ofonoNetwork) {
- QString currentTechnology = ofonoNetwork->getTechnology();
- if (currentTechnology == QLatin1String("gsm")) {
- return QNetworkConfiguration::Bearer2G;
- } else if (currentTechnology == QLatin1String("edge")) {
- return QNetworkConfiguration::BearerCDMA2000; //wrong, I know
- } else if (currentTechnology == QLatin1String("umts")) {
- return QNetworkConfiguration::BearerWCDMA;
- } else if (currentTechnology == QLatin1String("hspa")) {
- return QNetworkConfiguration::BearerHSPA;
- } else if (currentTechnology == QLatin1String("lte")) {
- return QNetworkConfiguration::BearerLTE;
- }
- }
- return QNetworkConfiguration::BearerUnknown;
-}
-
-bool QConnmanEngine::isRoamingAllowed(const QString &context)
-{
- const auto dcPaths = ofonoContextManager->contexts();
- for (const QString &dcPath : dcPaths) {
- if (dcPath.contains(context.section("_",-1))) {
- return ofonoContextManager->roamingAllowed();
- }
- }
- return false;
-}
-
-void QConnmanEngine::removeConfiguration(const QString &id)
-{
- auto locker = qt_unique_lock(mutex);
-
- if (accessPointConfigurations.contains(id)) {
-
- disconnect(connmanServiceInterfaces.value(id),SIGNAL(stateChanged(QString)),
- this,SLOT(serviceStateChanged(QString)));
- serviceNetworks.removeOne(id);
- QConnmanServiceInterface *service = connmanServiceInterfaces.take(id);
- delete service;
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(id);
- foundConfigurations.removeOne(ptr.data());
- locker.unlock();
- emit configurationRemoved(ptr);
- }
-}
-
-void QConnmanEngine::addServiceConfiguration(const QString &servicePath)
-{
- auto locker = qt_unique_lock(mutex);
- if (!connmanServiceInterfaces.contains(servicePath)) {
- QConnmanServiceInterface *serv = new QConnmanServiceInterface(servicePath, this);
- connmanServiceInterfaces.insert(serv->path(),serv);
- }
-
- if (!accessPointConfigurations.contains(servicePath)) {
-
- serviceNetworks.append(servicePath);
-
- connect(connmanServiceInterfaces.value(servicePath),SIGNAL(stateChanged(QString)),
- this,SLOT(serviceStateChanged(QString)));
-
- QNetworkConfigurationPrivate* cpPriv = new QNetworkConfigurationPrivate();
- QConnmanServiceInterface *service = connmanServiceInterfaces.value(servicePath);
-
- QString networkName = service->name();
-
- const QString connectionType = service->type();
- if (connectionType == QLatin1String("ethernet")) {
- cpPriv->bearerType = QNetworkConfiguration::BearerEthernet;
- } else if (connectionType == QLatin1String("wifi")) {
- cpPriv->bearerType = QNetworkConfiguration::BearerWLAN;
- } else if (connectionType == QLatin1String("cellular")) {
- cpPriv->bearerType = ofonoTechToBearerType(QLatin1String("cellular"));
- cpPriv->roamingSupported = service->roaming() && isRoamingAllowed(servicePath);
- } else if (connectionType == QLatin1String("wimax")) {
- cpPriv->bearerType = QNetworkConfiguration::BearerWiMAX;
- } else {
- cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
- }
-
- cpPriv->name = networkName;
- cpPriv->isValid = true;
- cpPriv->id = servicePath;
- cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
-
- if (service->security() == QLatin1String("none")) {
- cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
- } else {
- cpPriv->purpose = QNetworkConfiguration::PrivatePurpose;
- }
-
- cpPriv->state = getStateForService(servicePath);
-
- QNetworkConfigurationPrivatePointer ptr(cpPriv);
- accessPointConfigurations.insert(ptr->id, ptr);
- if (connectionType == QLatin1String("cellular")) {
- foundConfigurations.append(cpPriv);
- } else {
- foundConfigurations.prepend(cpPriv);
- }
- configInterfaces[cpPriv->id] = service->serviceInterface();
-
- locker.unlock();
- Q_EMIT configurationAdded(ptr);
- }
-}
-
-bool QConnmanEngine::requiresPolling() const
-{
- return false;
-}
-
-void QConnmanEngine::reEvaluateCellular()
-{
- const auto servicePaths = connmanManager->getServices();
- for (const QString &servicePath : servicePaths) {
- if (servicePath.contains("cellular") && accessPointConfigurations.contains(servicePath)) {
- configurationChange(connmanServiceInterfaces.value(servicePath));
- }
- }
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/connman/qconnmanengine.h b/src/plugins/bearer/connman/qconnmanengine.h
deleted file mode 100644
index ef80d38fa2..0000000000
--- a/src/plugins/bearer/connman/qconnmanengine.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QCONNMANENGINE_P_H
-#define QCONNMANENGINE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "../qbearerengine_impl.h"
-
-#include "qconnmanservice_linux_p.h"
-#include "../linux_common/qofonoservice_linux_p.h"
-
-#include <QMap>
-#include <QVariant>
-
-#ifndef QT_NO_DBUS
-
-QT_BEGIN_NAMESPACE
-
-class QConnmanEngine : public QBearerEngineImpl
-{
- Q_OBJECT
-
-public:
- QConnmanEngine(QObject *parent = nullptr);
- ~QConnmanEngine();
-
- bool connmanAvailable() const;
-
- virtual QString getInterfaceFromId(const QString &id);
- bool hasIdentifier(const QString &id);
-
- virtual void connectToId(const QString &id);
- virtual void disconnectFromId(const QString &id);
-
- Q_INVOKABLE void initialize();
- Q_INVOKABLE void requestUpdate();
-
- QNetworkSession::State sessionStateForId(const QString &id);
- QNetworkSessionPrivate *createSessionBackend();
-
- virtual quint64 bytesWritten(const QString &id);
- virtual quint64 bytesReceived(const QString &id);
- virtual quint64 startTime(const QString &id);
-
- virtual QNetworkConfigurationManager::Capabilities capabilities() const;
- virtual QNetworkConfigurationPrivatePointer defaultConfiguration();
-
- QList<QNetworkConfigurationPrivate *> getConfigurations();
-
-private Q_SLOTS:
-
- void doRequestUpdate();
- void updateServices(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed);
-
- void servicesReady(const QStringList &);
- void finishedScan(bool error);
- void changedModem();
- void serviceStateChanged(const QString &state);
- void configurationChange(QConnmanServiceInterface * service);
- void reEvaluateCellular();
-private:
- QConnmanManagerInterface *connmanManager;
-
- QOfonoManagerInterface *ofonoManager;
- QOfonoNetworkRegistrationInterface *ofonoNetwork;
- QOfonoDataConnectionManagerInterface *ofonoContextManager;
-
- QList<QNetworkConfigurationPrivate *> foundConfigurations;
-
- QString networkFromId(const QString &id);
-
- QNetworkConfiguration::StateFlags getStateForService(const QString &service);
- QNetworkConfiguration::BearerType typeToBearer(const QString &type);
-
- void removeConfiguration(const QString &servicePath);
- void addServiceConfiguration(const QString &servicePath);
- QDateTime activeTime;
-
-
- QMap<QString,QConnmanTechnologyInterface *> technologies; // techpath, tech interface
- QMap<QString,QString> configInterfaces; // id, interface name
- QList<QString> serviceNetworks; //servpath
-
- QNetworkConfiguration::BearerType ofonoTechToBearerType(const QString &type);
- bool isRoamingAllowed(const QString &context);
- QMap <QString,QConnmanServiceInterface *> connmanServiceInterfaces;
-
-protected:
- bool requiresPolling() const;
-};
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DBUS
-
-#endif
-
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
deleted file mode 100644
index 35d9c40680..0000000000
--- a/src/plugins/bearer/connman/qconnmanservice_linux.cpp
+++ /dev/null
@@ -1,516 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QObject>
-#include <QList>
-#include <QtDBus/QtDBus>
-#include <QtDBus/QDBusConnection>
-#include <QtDBus/QDBusError>
-#include <QtDBus/QDBusInterface>
-#include <QtDBus/QDBusMessage>
-#include <QtDBus/QDBusReply>
-#include <QtDBus/QDBusPendingCallWatcher>
-#include <QtDBus/QDBusObjectPath>
-#include <QtDBus/QDBusPendingCall>
-
-#include "qconnmanservice_linux_p.h"
-
-#ifndef QT_NO_DBUS
-
-QT_BEGIN_NAMESPACE
-
-QDBusArgument &operator<<(QDBusArgument &argument, const ConnmanMap &map)
-{
- argument.beginStructure();
- argument << map.objectPath << map.propertyMap;
- argument.endStructure();
- return argument;
-}
-
-const QDBusArgument &operator>>(const QDBusArgument &argument, ConnmanMap &map)
-{
- argument.beginStructure();
- argument >> map.objectPath >> map.propertyMap;
- argument.endStructure();
- return argument;
-}
-
-QConnmanManagerInterface::QConnmanManagerInterface( QObject *parent)
- : QDBusAbstractInterface(QLatin1String(CONNMAN_SERVICE),
- QLatin1String(CONNMAN_MANAGER_PATH),
- CONNMAN_MANAGER_INTERFACE,
- QDBusConnection::systemBus(), parent)
-{
- qDBusRegisterMetaType<ConnmanMap>();
- qDBusRegisterMetaType<ConnmanMapList>();
-
- QDBusPendingReply<QVariantMap> props_reply = asyncCall(QLatin1String("GetProperties"));
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(props_reply, this);
-
- QObject::connect(watcher,SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SLOT(propertiesReply(QDBusPendingCallWatcher*)));
-
- QDBusConnection::systemBus().connect(QLatin1String(CONNMAN_SERVICE),
- QLatin1String(CONNMAN_MANAGER_PATH),
- QLatin1String(CONNMAN_SERVICE_INTERFACE),
- QLatin1String("PropertyChanged"),
- this,SLOT(changedProperty(QString,QDBusVariant)));
-
-
- QDBusConnection::systemBus().connect(QLatin1String(CONNMAN_SERVICE),
- QLatin1String(CONNMAN_MANAGER_PATH),
- QLatin1String(CONNMAN_SERVICE_INTERFACE),
- QLatin1String("TechnologyAdded"),
- this,SLOT(technologyAdded(QDBusObjectPath,QVariantMap)));
-
- QDBusConnection::systemBus().connect(QLatin1String(CONNMAN_SERVICE),
- QLatin1String(CONNMAN_MANAGER_PATH),
- QLatin1String(CONNMAN_SERVICE_INTERFACE),
- QLatin1String("TechnologyRemoved"),
- this,SLOT(technologyRemoved(QDBusObjectPath)));
-
- QDBusPendingReply<ConnmanMapList> serv_reply = asyncCall(QLatin1String("GetServices"));
- QDBusPendingCallWatcher *watcher2 = new QDBusPendingCallWatcher(serv_reply, this);
-
- QObject::connect(watcher2,SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SLOT(servicesReply(QDBusPendingCallWatcher*)));
-
-}
-
-QConnmanManagerInterface::~QConnmanManagerInterface()
-{
-}
-
-void QConnmanManagerInterface::changedProperty(const QString &name, const QDBusVariant &value)
-{
- propertiesCacheMap[name] = value.variant();
-}
-
-void QConnmanManagerInterface::propertiesReply(QDBusPendingCallWatcher *call)
-{
- QDBusPendingReply<QVariantMap> props_reply = *call;
-
- if (props_reply.isError()) {
- qDebug() << props_reply.error().message();
- } else {
- propertiesCacheMap = props_reply.value();
- }
- call->deleteLater();
-}
-
-void QConnmanManagerInterface::servicesReply(QDBusPendingCallWatcher *call)
-{
- QDBusPendingReply<ConnmanMapList> serv_reply = *call;
-
- if (serv_reply.isError()) {
- qDebug() << serv_reply.error().message();
- } else {
- servicesList.clear(); //connman list changes order
- const ConnmanMapList connmanobjs = serv_reply.value();
- for (const ConnmanMap &connmanobj : connmanobjs)
- servicesList << connmanobj.objectPath.path();
- Q_EMIT servicesReady(servicesList);
- }
- call->deleteLater();
-}
-
-void QConnmanManagerInterface::connectNotify(const QMetaMethod &signal)
-{
- static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::propertyChanged);
- if (signal == propertyChangedSignal) {
- if (!connection().connect(QLatin1String(CONNMAN_SERVICE),
- QLatin1String(CONNMAN_MANAGER_PATH),
- QLatin1String(CONNMAN_MANAGER_INTERFACE),
- QLatin1String("PropertyChanged"),
- this,SIGNAL(propertyChanged(QString,QDBusVariant)))) {
- qWarning("PropertyChanged not connected");
- }
- }
-
- static const QMetaMethod servicesChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::servicesChanged);
- if (signal == servicesChangedSignal) {
- if (!connection().connect(QLatin1String(CONNMAN_SERVICE),
- QLatin1String(CONNMAN_MANAGER_PATH),
- QLatin1String(CONNMAN_MANAGER_INTERFACE),
- QLatin1String("ServicesChanged"),
- this,SLOT(onServicesChanged(ConnmanMapList,QList<QDBusObjectPath>)))) {
- qWarning("servicesChanged not connected");
- }
- }
-}
-
-void QConnmanManagerInterface::onServicesChanged(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed)
-{
- servicesList.clear(); //connman list changes order
- for (const ConnmanMap &connmanobj : changed) {
- const QString svcPath(connmanobj.objectPath.path());
- servicesList << svcPath;
- }
-
- Q_EMIT servicesChanged(changed, removed);
-}
-
-QVariant QConnmanManagerInterface::getProperty(const QString &property)
-{
- QVariant var;
- var = propertiesCacheMap.value(property);
- return var;
-}
-
-QVariantMap QConnmanManagerInterface::getProperties()
-{
- if (propertiesCacheMap.isEmpty()) {
- QDBusPendingReply<QVariantMap> reply = call(QLatin1String("GetProperties"));
- reply.waitForFinished();
- if (!reply.isError()) {
- propertiesCacheMap = reply.value();
- }
- }
- return propertiesCacheMap;
-}
-
-QString QConnmanManagerInterface::getState()
-{
- return getProperty(QStringLiteral("State")).toString();
-}
-
-bool QConnmanManagerInterface::getOfflineMode()
-{
- QVariant var = getProperty(QStringLiteral("OfflineMode"));
- return qdbus_cast<bool>(var);
-}
-
-QStringList QConnmanManagerInterface::getTechnologies()
-{
- if (technologiesMap.isEmpty()) {
- QDBusPendingReply<ConnmanMapList> reply = call(QLatin1String("GetTechnologies"));
- reply.waitForFinished();
- if (!reply.isError()) {
- const ConnmanMapList maps = reply.value();
- for (const ConnmanMap &map : maps) {
- if (!technologiesMap.contains(map.objectPath.path())) {
- technologyAdded(map.objectPath, map.propertyMap);
- }
- }
- }
- }
- return technologiesMap.keys();
-}
-
-QStringList QConnmanManagerInterface::getServices()
-{
- if (servicesList.isEmpty()) {
- QDBusPendingReply<ConnmanMapList> reply = call(QLatin1String("GetServices"));
- reply.waitForFinished();
- if (!reply.isError()) {
- const ConnmanMapList maps = reply.value();
- for (const ConnmanMap &map : maps)
- servicesList << map.objectPath.path();
- }
- }
- return servicesList;
-}
-
-bool QConnmanManagerInterface::requestScan(const QString &type)
-{
- bool scanned = false;
- if (technologiesMap.isEmpty())
- getTechnologies();
- Q_FOREACH (QConnmanTechnologyInterface *tech, technologiesMap) {
- if (tech->type() == type) {
- tech->scan();
- scanned = true;
- }
- }
- return scanned;
-}
-
-void QConnmanManagerInterface::technologyAdded(const QDBusObjectPath &path, const QVariantMap &)
-{
- if (!technologiesList.contains(path.path())) {
- technologiesList << path.path();
- QConnmanTechnologyInterface *tech;
- tech = new QConnmanTechnologyInterface(path.path(),this);
- technologiesMap.insert(path.path(),tech);
- connect(tech,SIGNAL(scanFinished(bool)),this,SIGNAL(scanFinished(bool)));
- }
-}
-
-void QConnmanManagerInterface::technologyRemoved(const QDBusObjectPath &path)
-{
- if (technologiesList.contains(path.path())) {
- technologiesList.removeOne(path.path());
- QConnmanTechnologyInterface * tech = technologiesMap.take(path.path());
- delete tech;
- }
-}
-
-QConnmanServiceInterface::QConnmanServiceInterface(const QString &dbusPathName,QObject *parent)
- : QDBusAbstractInterface(QLatin1String(CONNMAN_SERVICE),
- dbusPathName,
- CONNMAN_SERVICE_INTERFACE,
- QDBusConnection::systemBus(), parent)
-{
- QDBusPendingReply<QVariantMap> props_reply = asyncCall(QLatin1String("GetProperties"));
-
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(props_reply, this);
-
- QObject::connect(watcher,SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SLOT(propertiesReply(QDBusPendingCallWatcher*)));
-
- QDBusConnection::systemBus().connect(QLatin1String(CONNMAN_SERVICE),
- path(),
- QLatin1String(CONNMAN_SERVICE_INTERFACE),
- QLatin1String("PropertyChanged"),
- this,SLOT(changedProperty(QString,QDBusVariant)));
-}
-
-QConnmanServiceInterface::~QConnmanServiceInterface()
-{
-}
-
-QVariantMap QConnmanServiceInterface::getProperties()
-{
- if (propertiesCacheMap.isEmpty()) {
- QDBusPendingReply<QVariantMap> reply = call(QLatin1String("GetProperties"));
- reply.waitForFinished();
- if (!reply.isError()) {
- propertiesCacheMap = reply.value();
- Q_EMIT propertiesReady();
- }
- }
- return propertiesCacheMap;
-}
-
-void QConnmanServiceInterface::propertiesReply(QDBusPendingCallWatcher *call)
-{
- QDBusPendingReply<QVariantMap> props_reply = *call;
- if (props_reply.isError()) {
- qDebug() << props_reply.error().message();
- return;
- }
- propertiesCacheMap = props_reply.value();
- Q_EMIT propertiesReady();
-}
-
-void QConnmanServiceInterface::connectNotify(const QMetaMethod &signal)
-{
- static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanServiceInterface::propertyChanged);
- if (signal == propertyChangedSignal) {
- QDBusConnection::systemBus().connect(QLatin1String(CONNMAN_SERVICE),
- path(),
- QLatin1String(CONNMAN_SERVICE_INTERFACE),
- QLatin1String("PropertyChanged"),
- this,SIGNAL(propertyChanged(QString,QDBusVariant)));
- }
-}
-
-void QConnmanServiceInterface::changedProperty(const QString &name, const QDBusVariant &value)
-{
- propertiesCacheMap[name] = value.variant();
- if (name == QLatin1String("State"))
- Q_EMIT stateChanged(value.variant().toString());
-}
-
-QVariant QConnmanServiceInterface::getProperty(const QString &property)
-{
- QVariant var;
- QVariantMap map = getProperties();
- var = map.value(property);
- return var;
-}
-
-void QConnmanServiceInterface::connect()
-{
- asyncCall(QLatin1String("Connect"));
-}
-
-void QConnmanServiceInterface::disconnect()
-{
- asyncCall(QLatin1String("Disconnect"));
-}
-
-void QConnmanServiceInterface::remove()
-{
- asyncCall(QLatin1String("Remove"));
-}
-
-// properties
-QString QConnmanServiceInterface::state()
-{
- QVariant var = getProperty(QStringLiteral("State"));
- return qdbus_cast<QString>(var);
-}
-
-QString QConnmanServiceInterface::lastError()
-{
- QVariant var = getProperty(QStringLiteral("Error"));
- return qdbus_cast<QString>(var);
-}
-
-QString QConnmanServiceInterface::name()
-{
- QVariant var = getProperty(QStringLiteral("Name"));
- return qdbus_cast<QString>(var);
-}
-
-QString QConnmanServiceInterface::type()
-{
- QVariant var = getProperty(QStringLiteral("Type"));
- return qdbus_cast<QString>(var);
-}
-
-QString QConnmanServiceInterface::security()
-{
- QVariant var = getProperty(QStringLiteral("Security"));
- return qdbus_cast<QString>(var);
-}
-
-bool QConnmanServiceInterface::favorite()
-{
- QVariant var = getProperty(QStringLiteral("Favorite"));
- return qdbus_cast<bool>(var);
-}
-
-bool QConnmanServiceInterface::autoConnect()
-{
- QVariant var = getProperty(QStringLiteral("AutoConnect"));
- return qdbus_cast<bool>(var);
-}
-
-bool QConnmanServiceInterface::roaming()
-{
- QVariant var = getProperty(QStringLiteral("Roaming"));
- return qdbus_cast<bool>(var);
-}
-
-QVariantMap QConnmanServiceInterface::ethernet()
-{
- QVariant var = getProperty(QStringLiteral("Ethernet"));
- return qdbus_cast<QVariantMap >(var);
-}
-
-QString QConnmanServiceInterface::serviceInterface()
-{
- QVariantMap map = ethernet();
- return map.value(QStringLiteral("Interface")).toString();
-}
-
-bool QConnmanServiceInterface::isOfflineMode()
-{
- QVariant var = getProperty(QStringLiteral("OfflineMode"));
- return qdbus_cast<bool>(var);
-}
-
-QStringList QConnmanServiceInterface::services()
-{
- QVariant var = getProperty(QStringLiteral("Services"));
- return qdbus_cast<QStringList>(var);
-}
-
-//////////////////////////
-QConnmanTechnologyInterface::QConnmanTechnologyInterface(const QString &dbusPathName,QObject *parent)
- : QDBusAbstractInterface(QLatin1String(CONNMAN_SERVICE),
- dbusPathName,
- CONNMAN_TECHNOLOGY_INTERFACE,
- QDBusConnection::systemBus(), parent)
-{
-}
-
-QConnmanTechnologyInterface::~QConnmanTechnologyInterface()
-{
-}
-
-void QConnmanTechnologyInterface::connectNotify(const QMetaMethod &signal)
-{
- static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanTechnologyInterface::propertyChanged);
- if (signal == propertyChangedSignal) {
- QDBusConnection::systemBus().connect(QLatin1String(CONNMAN_SERVICE),
- path(),
- QLatin1String(CONNMAN_TECHNOLOGY_INTERFACE),
- QLatin1String("PropertyChanged"),
- this,SIGNAL(propertyChanged(QString,QDBusVariant)));
- }
-}
-
-QVariantMap QConnmanTechnologyInterface::properties()
-{
- if (propertiesMap.isEmpty()) {
- QDBusPendingReply<QVariantMap> reply = call(QLatin1String("GetProperties"));
- reply.waitForFinished();
- propertiesMap = reply.value();
- }
- return propertiesMap;
-}
-
-QVariant QConnmanTechnologyInterface::getProperty(const QString &property)
-{
- QVariant var;
- QVariantMap map = properties();
- var = map.value(property);
- return var;
-}
-
-QString QConnmanTechnologyInterface::type()
-{
- QVariant var = getProperty(QStringLiteral("Type"));
- return qdbus_cast<QString>(var);
-}
-
-void QConnmanTechnologyInterface::scan()
-{
- QDBusPendingReply<> reply = asyncCall(QLatin1String("Scan"));
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
- connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SLOT(scanReply(QDBusPendingCallWatcher*)));
-}
-
-void QConnmanTechnologyInterface::scanReply(QDBusPendingCallWatcher *call)
-{
- QDBusPendingReply<> props_reply = *call;
- if (props_reply.isError()) {
- qDebug() << props_reply.error().message();
- }
- Q_EMIT scanFinished(props_reply.isError());
- call->deleteLater();
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux_p.h b/src/plugins/bearer/connman/qconnmanservice_linux_p.h
deleted file mode 100644
index 790325f9a1..0000000000
--- a/src/plugins/bearer/connman/qconnmanservice_linux_p.h
+++ /dev/null
@@ -1,230 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QCONNMANSERVICE_H
-#define QCONNMANSERVICE_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtDBus/QtDBus>
-#include <QtDBus/QDBusConnection>
-#include <QtDBus/QDBusError>
-#include <QtDBus/QDBusInterface>
-#include <QtDBus/QDBusMessage>
-#include <QtDBus/QDBusReply>
-#include <QtDBus/QDBusArgument>
-
-#include <QtDBus/QDBusPendingCallWatcher>
-#include <QtDBus/QDBusObjectPath>
-#include <QtDBus/QDBusContext>
-#include <QMap>
-
-#ifndef QT_NO_DBUS
-
-#ifndef __CONNMAN_DBUS_H
-
-#define CONNMAN_SERVICE "net.connman"
-#define CONNMAN_PATH "/net/connman"
-#define CONNMAN_MANAGER_INTERFACE CONNMAN_SERVICE ".Manager"
-#define CONNMAN_MANAGER_PATH "/"
-#define CONNMAN_SERVICE_INTERFACE CONNMAN_SERVICE ".Service"
-#define CONNMAN_TECHNOLOGY_INTERFACE CONNMAN_SERVICE ".Technology"
-#endif
-
-QT_BEGIN_NAMESPACE
-
-struct ConnmanMap {
- QDBusObjectPath objectPath;
- QVariantMap propertyMap;
-};
-Q_DECLARE_TYPEINFO(ConnmanMap, Q_MOVABLE_TYPE); // QDBusObjectPath is movable, but cannot be
- // marked as such until Qt 6
-typedef QVector<ConnmanMap> ConnmanMapList;
-
-QT_END_NAMESPACE
-
-Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(ConnmanMap))
-Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(ConnmanMapList))
-
-QT_BEGIN_NAMESPACE
-
-QDBusArgument &operator<<(QDBusArgument &argument, const ConnmanMap &obj);
-const QDBusArgument &operator>>(const QDBusArgument &argument, ConnmanMap &obj);
-
-class QConnmanTechnologyInterface;
-class QConnmanServiceInterface;
-
-class QConnmanManagerInterface : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
-
- QConnmanManagerInterface( QObject *parent = nullptr);
- ~QConnmanManagerInterface();
-
- QDBusObjectPath path() const;
- QVariantMap getProperties();
-
- QString getState();
- bool getOfflineMode();
- QStringList getTechnologies();
- QStringList getServices();
- bool requestScan(const QString &type);
-
- QHash<QString, QConnmanTechnologyInterface *> technologiesMap;
-
-Q_SIGNALS:
- void propertyChanged(const QString &, const QDBusVariant &value);
- void stateChanged(const QString &);
- void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
- void servicesChanged(const ConnmanMapList&, const QList<QDBusObjectPath> &);
-
- void servicesReady(const QStringList &);
- void scanFinished(bool error);
-
-protected:
- void connectNotify(const QMetaMethod &signal);
- QVariant getProperty(const QString &);
-
-private:
- QVariantMap propertiesCacheMap;
- QStringList servicesList;
- QStringList technologiesList;
-
-private slots:
- void onServicesChanged(const ConnmanMapList&, const QList<QDBusObjectPath> &);
- void changedProperty(const QString &, const QDBusVariant &value);
-
- void propertiesReply(QDBusPendingCallWatcher *call);
- void servicesReply(QDBusPendingCallWatcher *call);
-
- void technologyAdded(const QDBusObjectPath &technology, const QVariantMap &properties);
- void technologyRemoved(const QDBusObjectPath &technology);
-
-};
-
-class QConnmanServiceInterface : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
-
- explicit QConnmanServiceInterface(const QString &dbusPathName,QObject *parent = nullptr);
- ~QConnmanServiceInterface();
-
- QVariantMap getProperties();
- // clearProperty
- void connect();
- void disconnect();
- void remove();
-
-// properties
- QString state();
- QString lastError();
- QString name();
- QString type();
- QString security();
- bool favorite();
- bool autoConnect();
- bool roaming();
- QVariantMap ethernet();
- QString serviceInterface();
-
- bool isOfflineMode();
- QStringList services();
-
-Q_SIGNALS:
- void propertyChanged(const QString &, const QDBusVariant &value);
- void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
- void propertiesReady();
- void stateChanged(const QString &state);
-
-protected:
- void connectNotify(const QMetaMethod &signal);
- QVariant getProperty(const QString &);
-private:
- QVariantMap propertiesCacheMap;
-private slots:
- void propertiesReply(QDBusPendingCallWatcher *call);
- void changedProperty(const QString &, const QDBusVariant &value);
-
-};
-
-class QConnmanTechnologyInterface : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
-
- explicit QConnmanTechnologyInterface(const QString &dbusPathName,QObject *parent = nullptr);
- ~QConnmanTechnologyInterface();
-
- QString type();
-
- void scan();
-Q_SIGNALS:
- void propertyChanged(const QString &, const QDBusVariant &value);
- void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
- void scanFinished(bool error);
-protected:
- void connectNotify(const QMetaMethod &signal);
- QVariant getProperty(const QString &);
-private:
- QVariantMap properties();
- QVariantMap propertiesMap;
-private Q_SLOTS:
- void scanReply(QDBusPendingCallWatcher *call);
-
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DBUS
-
-#endif //QCONNMANSERVICE_H
diff --git a/src/plugins/bearer/corewlan/corewlan.json b/src/plugins/bearer/corewlan/corewlan.json
deleted file mode 100644
index b43519ea90..0000000000
--- a/src/plugins/bearer/corewlan/corewlan.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "corewlan" ]
-}
diff --git a/src/plugins/bearer/corewlan/corewlan.pro b/src/plugins/bearer/corewlan/corewlan.pro
deleted file mode 100644
index 1dc09ebdd6..0000000000
--- a/src/plugins/bearer/corewlan/corewlan.pro
+++ /dev/null
@@ -1,23 +0,0 @@
-TARGET = qcorewlanbearer
-
-QT = core-private network-private
-LIBS += -framework Foundation -framework SystemConfiguration
-
-qtConfig(corewlan) {
- LIBS += -framework CoreWLAN -framework Security
-}
-
-HEADERS += qcorewlanengine.h \
- ../qnetworksession_impl.h \
- ../qbearerengine_impl.h
-
-SOURCES += main.cpp \
- ../qnetworksession_impl.cpp
-
-OBJECTIVE_SOURCES += qcorewlanengine.mm
-
-OTHER_FILES += corewlan.json
-
-PLUGIN_TYPE = bearer
-PLUGIN_CLASS_NAME = QCoreWlanEnginePlugin
-load(qt_plugin)
diff --git a/src/plugins/bearer/corewlan/main.cpp b/src/plugins/bearer/corewlan/main.cpp
deleted file mode 100644
index c6663d155c..0000000000
--- a/src/plugins/bearer/corewlan/main.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcorewlanengine.h"
-
-#include <QtNetwork/private/qbearerplugin_p.h>
-
-#include <QtCore/qdebug.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-class QCoreWlanEnginePlugin : public QBearerEnginePlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QBearerEngineFactoryInterface" FILE "corewlan.json")
-
-public:
- QCoreWlanEnginePlugin();
- ~QCoreWlanEnginePlugin();
-
- QBearerEngine *create(const QString &key) const;
-};
-
-QCoreWlanEnginePlugin::QCoreWlanEnginePlugin()
-{
-}
-
-QCoreWlanEnginePlugin::~QCoreWlanEnginePlugin()
-{
-}
-
-QBearerEngine *QCoreWlanEnginePlugin::create(const QString &key) const
-{
- if (key == QLatin1String("corewlan"))
- return new QCoreWlanEngine;
- else
- return 0;
-}
-
-QT_END_NAMESPACE
-
-#include "main.moc"
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.h b/src/plugins/bearer/corewlan/qcorewlanengine.h
deleted file mode 100644
index 6dddee66a4..0000000000
--- a/src/plugins/bearer/corewlan/qcorewlanengine.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QCOREWLANENGINE_H
-#define QCOREWLANENGINE_H
-
-#include "../qbearerengine_impl.h"
-
-#include <QMap>
-#include <QTimer>
-#include <SystemConfiguration/SystemConfiguration.h>
-#include <QThread>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkConfigurationPrivate;
-class QScanThread;
-
-class QCoreWlanEngine : public QBearerEngineImpl
-{
- friend class QScanThread;
- Q_OBJECT
-
-public:
- QCoreWlanEngine(QObject *parent = 0);
- ~QCoreWlanEngine();
-
- QString getInterfaceFromId(const QString &id);
- bool hasIdentifier(const QString &id);
-
- void connectToId(const QString &id);
- void disconnectFromId(const QString &id);
-
- Q_INVOKABLE void initialize();
- Q_INVOKABLE void requestUpdate();
-
- QNetworkSession::State sessionStateForId(const QString &id);
-
- quint64 bytesWritten(const QString &id);
- quint64 bytesReceived(const QString &id);
- quint64 startTime(const QString &id);
-
- QNetworkConfigurationManager::Capabilities capabilities() const;
-
- QNetworkSessionPrivate *createSessionBackend();
-
- QNetworkConfigurationPrivatePointer defaultConfiguration();
-
- bool requiresPolling() const;
-
-private Q_SLOTS:
- void doRequestUpdate();
- void networksChanged();
- void checkDisconnect();
-
-private:
- bool isWifiReady(const QString &dev);
- QList<QNetworkConfigurationPrivate *> foundConfigurations;
-
- SCDynamicStoreRef storeSession;
- CFRunLoopSourceRef runloopSource;
- bool hasWifi;
- bool scanning;
- QScanThread *scanThread;
-
- quint64 getBytes(const QString &interfaceName,bool b);
- QString disconnectedInterfaceString;
-
-protected:
- void startNetworkChangeLoop();
-
-};
-
-class QScanThread : public QThread
-{
- Q_OBJECT
-
-public:
- QScanThread(QObject *parent = 0);
- ~QScanThread();
-
- void quit();
- QList<QNetworkConfigurationPrivate *> getConfigurations();
- QString interfaceName;
- QMap<QString, QString> configurationInterface;
- void getUserConfigurations();
- QString getNetworkNameFromSsid(const QString &ssid) const;
- QString getSsidFromNetworkName(const QString &name) const;
- bool isKnownSsid(const QString &ssid) const;
- QMap<QString, QMap<QString,QString> > userProfiles;
-
-signals:
- void networksChanged();
-
-protected:
- void run();
-
-private:
- QList<QNetworkConfigurationPrivate *> fetchedConfigurations;
- mutable QMutex mutex;
- QStringList foundNetwork(const QString &id, const QString &ssid, const QNetworkConfiguration::StateFlags state, const QString &interfaceName, const QNetworkConfiguration::Purpose purpose);
-
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
-
-#endif
diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.mm b/src/plugins/bearer/corewlan/qcorewlanengine.mm
deleted file mode 100644
index 66f2ed017b..0000000000
--- a/src/plugins/bearer/corewlan/qcorewlanengine.mm
+++ /dev/null
@@ -1,862 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcorewlanengine.h"
-#include "../qnetworksession_impl.h"
-
-#include <QtNetwork/private/qnetworkconfiguration_p.h>
-
-#include <QtCore/qthread.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qstringlist.h>
-
-#include <QtCore/qdebug.h>
-
-#include <QDir>
-#ifndef QT_NO_BEARERMANAGEMENT
-
-extern "C" { // Otherwise it won't find CWKeychain* symbols at link time
-#import <CoreWLAN/CoreWLAN.h>
-}
-
-#include "private/qcore_mac_p.h"
-
-#include <net/if.h>
-#include <ifaddrs.h>
-
-@interface QT_MANGLE_NAMESPACE(QNSListener) : NSObject <CWEventDelegate>
-@property (assign) QCoreWlanEngine* engine;
-@end
-QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSListener);
-
-@implementation QNSListener {
- NSNotificationCenter *notificationCenter;
- CWWiFiClient *client;
- QCoreWlanEngine *engine;
- NSLock *locker;
-}
-
-- (instancetype)init
-{
- if ((self = [super init])) {
- [locker lock];
- QMacAutoReleasePool pool;
- notificationCenter = [NSNotificationCenter defaultCenter];
- client = [CWWiFiClient sharedWiFiClient];
- client.delegate = self;
- [client startMonitoringEventWithType:CWEventTypePowerDidChange error:nil];
- [locker unlock];
- }
- return self;
-}
-
-static QNSListener *listener = 0;
-
--(void)dealloc
-{
- client.delegate = nil;
- listener = nil;
- [super dealloc];
-}
-
--(void)setEngine:(QCoreWlanEngine *)coreEngine
-{
- [locker lock];
- if(!engine)
- engine = coreEngine;
- [locker unlock];
-}
-
--(QCoreWlanEngine *)engine
-{
- return engine;
-}
-
--(void)remove
-{
- [locker lock];
- [client stopMonitoringAllEventsAndReturnError:nil];
- [locker unlock];
-}
-
-- (void)powerStateDidChangeForWiFiInterfaceWithName:(NSString *)interfaceName
-{
- Q_UNUSED(interfaceName);
- engine->requestUpdate();
-}
-@end
-
-
-QT_BEGIN_NAMESPACE
-
-void networkChangeCallback(SCDynamicStoreRef/* store*/, CFArrayRef changedKeys, void *info)
-{
- for ( long i = 0; i < CFArrayGetCount(changedKeys); i++) {
-
- QString changed = QString::fromCFString((CFStringRef)CFArrayGetValueAtIndex(changedKeys, i));
- if( changed.contains("/Network/Global/IPv4")) {
- QCoreWlanEngine* wlanEngine = static_cast<QCoreWlanEngine*>(info);
- wlanEngine->requestUpdate();
- }
- }
- return;
-}
-
-
-QScanThread::QScanThread(QObject *parent)
- :QThread(parent)
-{
-}
-
-QScanThread::~QScanThread()
-{
-}
-
-void QScanThread::quit()
-{
- wait();
-}
-
-void QScanThread::run()
-{
- QMacAutoReleasePool pool;
- QStringList found;
- mutex.lock();
- CWInterface *currentInterface = [[CWWiFiClient sharedWiFiClient]
- interfaceWithName:interfaceName.toNSString()];
- mutex.unlock();
- const bool currentInterfaceServiceActive = currentInterface.serviceActive;
-
- if (currentInterface.powerOn) {
- NSError *err = nil;
-
- NSSet* apSet = [currentInterface scanForNetworksWithName:nil error:&err];
-
- if (!err) {
- for (CWNetwork *apNetwork in apSet) {
- const QString networkSsid = QString::fromNSString([apNetwork ssid]);
- const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
- found.append(id);
-
- QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
- bool known = isKnownSsid(networkSsid);
- if (currentInterfaceServiceActive) {
- if (networkSsid == QString::fromNSString([currentInterface ssid])) {
- state = QNetworkConfiguration::Active;
- }
- }
- if (state == QNetworkConfiguration::Undefined) {
- if(known) {
- state = QNetworkConfiguration::Discovered;
- } else {
- state = QNetworkConfiguration::Undefined;
- }
- }
- QNetworkConfiguration::Purpose purpose = QNetworkConfiguration::UnknownPurpose;
- if ([apNetwork supportsSecurity:kCWSecurityNone]) {
- purpose = QNetworkConfiguration::PublicPurpose;
- } else {
- purpose = QNetworkConfiguration::PrivatePurpose;
- }
-
- found.append(foundNetwork(id, networkSsid, state, interfaceName, purpose));
-
- }
- }
- }
- // add known configurations that are not around.
- for (auto i = userProfiles.cbegin(), end = userProfiles.cend(); i != end; ++i) {
-
- QString networkName = i.key();
- const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkName));
-
- if(!found.contains(id)) {
- QString networkSsid = getSsidFromNetworkName(networkName);
- const QString ssidId = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
- QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
- QString interfaceName;
- if (!i.value().isEmpty())
- interfaceName = i.value().last();
-
- if (currentInterfaceServiceActive) {
- if (networkSsid == QString::fromNSString([currentInterface ssid])) {
- state = QNetworkConfiguration::Active;
- }
- }
- if(state == QNetworkConfiguration::Undefined) {
- if( userProfiles.contains(networkName)
- && found.contains(ssidId)) {
- state = QNetworkConfiguration::Discovered;
- }
- }
-
- if(state == QNetworkConfiguration::Undefined) {
- state = QNetworkConfiguration::Defined;
- }
-
- found.append(foundNetwork(id, networkName, state, interfaceName, QNetworkConfiguration::UnknownPurpose));
- }
- }
- emit networksChanged();
-}
-
-QStringList QScanThread::foundNetwork(const QString &id, const QString &name, const QNetworkConfiguration::StateFlags state, const QString &interfaceName, const QNetworkConfiguration::Purpose purpose)
-{
- QStringList found;
- QMutexLocker locker(&mutex);
- QNetworkConfigurationPrivate *ptr = new QNetworkConfigurationPrivate;
-
- ptr->name = name;
- ptr->isValid = true;
- ptr->id = id;
- ptr->state = state;
- ptr->type = QNetworkConfiguration::InternetAccessPoint;
- ptr->bearerType = QNetworkConfiguration::BearerWLAN;
- ptr->purpose = purpose;
-
- fetchedConfigurations.append( ptr);
- configurationInterface.insert(ptr->id, interfaceName);
-
- locker.unlock();
- locker.relock();
- found.append(id);
- return found;
-}
-
-QList<QNetworkConfigurationPrivate *> QScanThread::getConfigurations()
-{
- QMutexLocker locker(&mutex);
- return qExchange(fetchedConfigurations, {});
-}
-
-void QScanThread::getUserConfigurations()
-{
- QMutexLocker locker(&mutex);
-
- QMacAutoReleasePool pool;
- userProfiles.clear();
-
- NSArray<NSString *> *wifiInterfaces = [CWWiFiClient interfaceNames];
- for (NSString *ifName in wifiInterfaces) {
-
- CWInterface *wifiInterface = [[CWWiFiClient sharedWiFiClient] interfaceWithName:ifName];
-
- NSString *nsInterfaceName = wifiInterface.ssid;
-// add user configured system networks
- SCDynamicStoreRef dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, (CFStringRef)@"Qt corewlan", nil, nil);
- NSDictionary * airportPlist = (NSDictionary *)SCDynamicStoreCopyValue(dynRef, (CFStringRef)[NSString stringWithFormat:@"Setup:/Network/Interface/%@/AirPort", nsInterfaceName]);
- CFRelease(dynRef);
- if(airportPlist != nil) {
- NSDictionary *prefNetDict = [airportPlist objectForKey:@"PreferredNetworks"];
-
- NSArray<NSString *> *thisSsidarray = [prefNetDict valueForKey:@"SSID_STR"];
- for (NSString *ssidkey in thisSsidarray) {
- QString thisSsid = QString::fromNSString(ssidkey);
- if(!userProfiles.contains(thisSsid)) {
- QMap <QString,QString> map;
- map.insert(thisSsid, QString::fromNSString(nsInterfaceName));
- userProfiles.insert(thisSsid, map);
- }
- }
- CFRelease(airportPlist);
- }
-
- // remembered networks
- CWConfiguration *userConfig = [wifiInterface configuration];
- NSOrderedSet *networkProfiles = [userConfig networkProfiles];
- NSEnumerator *enumerator = [networkProfiles objectEnumerator];
- CWNetworkProfile *wProfile;
- while ((wProfile = [enumerator nextObject])) {
- QString networkName = QString::fromNSString([wProfile ssid]);
-
- if (!userProfiles.contains(networkName)) {
- QMap<QString,QString> map;
- map.insert(networkName, QString::fromNSString(nsInterfaceName));
- userProfiles.insert(networkName, map);
- }
- }
-
- // 802.1X user profiles
- QString userProfilePath = QDir::homePath() + "/Library/Preferences/com.apple.eap.profiles.plist";
- NSDictionary* eapDict = [[[NSDictionary alloc] initWithContentsOfFile:userProfilePath.toNSString()] autorelease];
- if(eapDict != nil) {
- NSString *profileStr= @"Profiles";
- NSString *nameStr = @"UserDefinedName";
- NSString *networkSsidStr = @"Wireless Network";
- for (id profileKey in eapDict) {
- if ([profileStr isEqualToString:profileKey]) {
- NSDictionary *itemDict = [eapDict objectForKey:profileKey];
- for (id itemKey in itemDict) {
-
- NSInteger dictSize = [itemKey count];
- id objects[dictSize];
- id keys[dictSize];
-
- [itemKey getObjects:objects andKeys:keys];
- QString networkName;
- QString ssid;
- for (int i = 0; i < dictSize; i++) {
- if([nameStr isEqualToString:keys[i]]) {
- networkName = QString::fromNSString(objects[i]);
- }
- if ([networkSsidStr isEqualToString:keys[i]]) {
- ssid = QString::fromNSString(objects[i]);
- }
- if (!userProfiles.contains(networkName)
- && !ssid.isEmpty()) {
- QMap<QString,QString> map;
- map.insert(ssid, QString::fromNSString(nsInterfaceName));
- userProfiles.insert(networkName, map);
- }
- }
- }
- }
- }
- }
- }
-}
-
-QString QScanThread::getSsidFromNetworkName(const QString &name) const
-{
- QMutexLocker locker(&mutex);
-
- for (auto i = userProfiles.cbegin(), end = userProfiles.cend(); i != end; ++i) {
- for (auto ij = i.value().cbegin(), end = i.value().cend(); ij != end; ++ij) {
- const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") +i.key()));
- if(name == i.key() || name == networkNameHash) {
- return ij.key();
- }
- }
- }
- return QString();
-}
-
-QString QScanThread::getNetworkNameFromSsid(const QString &ssid) const
-{
- QMutexLocker locker(&mutex);
-
- for (auto i = userProfiles.cbegin(), end = userProfiles.cend(); i != end; ++i) {
- if (i.value().contains(ssid))
- return i.key();
- }
- return QString();
-}
-
-bool QScanThread::isKnownSsid(const QString &ssid) const
-{
- QMutexLocker locker(&mutex);
-
- for (auto i = userProfiles.cbegin(), end = userProfiles.cend(); i != end; ++i) {
- if (i.value().contains(ssid))
- return true;
- }
- return false;
-}
-
-
-QCoreWlanEngine::QCoreWlanEngine(QObject *parent)
-: QBearerEngineImpl(parent), scanThread(0)
-{
- scanThread = new QScanThread(this);
- connect(scanThread, SIGNAL(networksChanged()),
- this, SLOT(networksChanged()));
-}
-
-QCoreWlanEngine::~QCoreWlanEngine()
-{
- scanThread->wait();
-
- qDeleteAll(qExchange(foundConfigurations, {}));
- [listener remove];
- [listener release];
-}
-
-void QCoreWlanEngine::initialize()
-{
- QMutexLocker locker(&mutex);
- QMacAutoReleasePool pool;
-
- if ([[CWWiFiClient interfaceNames] count] > 0 && !listener) {
- listener = [QNSListener alloc] init];
- listener.engine = this;
- hasWifi = true;
- } else {
- hasWifi = false;
- }
- storeSession = NULL;
-
- startNetworkChangeLoop();
-}
-
-
-QString QCoreWlanEngine::getInterfaceFromId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- return scanThread->configurationInterface.value(id);
-}
-
-bool QCoreWlanEngine::hasIdentifier(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- return scanThread->configurationInterface.contains(id);
-}
-
-void QCoreWlanEngine::connectToId(const QString &id)
-{
- QMutexLocker locker(&mutex);
- QMacAutoReleasePool pool;
- QString interfaceString = getInterfaceFromId(id);
-
- CWInterface *wifiInterface =
- [[CWWiFiClient sharedWiFiClient] interfaceWithName:interfaceString.toNSString()];
-
- if (wifiInterface.powerOn) {
- NSError *err = nil;
- QString wantedSsid;
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- const QString idHash = QString::number(qHash(QLatin1String("corewlan:") + ptr->name));
- const QString idHash2 = QString::number(qHash(QLatin1String("corewlan:") + scanThread->getNetworkNameFromSsid(ptr->name)));
-
- QString wantedNetwork;
- for (auto i = scanThread->userProfiles.cbegin(), end = scanThread->userProfiles.cend(); i != end; ++i) {
- wantedNetwork = i.key();
- const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") + wantedNetwork));
- if (id == networkNameHash) {
- wantedSsid = scanThread->getSsidFromNetworkName(wantedNetwork);
- break;
- }
- }
-
- NSSet *scanSet = [wifiInterface scanForNetworksWithName:wantedSsid.toNSString() error:&err];
-
- if(!err) {
- for (CWNetwork *apNetwork in scanSet) {
- NSData *ssidData = [apNetwork ssidData];
- bool result = false;
-
- SecIdentityRef identity = 0;
- // Check first whether we require IEEE 802.1X authentication for the wanted SSID
- if (CWKeychainCopyWiFiEAPIdentity(kCWKeychainDomainSystem, ssidData, &identity) == errSecSuccess) {
- NSString *username = nil;
- NSString *password = nil;
- if (CWKeychainFindWiFiEAPUsernameAndPassword(kCWKeychainDomainSystem, ssidData, &username, &password) == errSecSuccess) {
- result = [wifiInterface associateToEnterpriseNetwork:apNetwork
- identity:identity username:(NSString *)username password:(NSString *)password
- error:&err];
- [username release];
- [password release];
- }
- CFRelease(identity);
- } else {
- NSString *password = nil;
- if (CWKeychainFindWiFiPassword(kCWKeychainDomainSystem, ssidData, &password) == errSecSuccess) {
- result = [wifiInterface associateToNetwork:apNetwork password:(NSString *)password error:&err];
- [password release];
- }
- }
-
- if (!err) {
- if (!result) {
- emit connectionError(id, ConnectError);
- } else {
- return;
- }
- } else {
- qDebug() <<"associate ERROR"<< QString::fromNSString([err localizedDescription ]);
- }
- } //end scan network
- } else {
- qDebug() <<"scan ERROR"<< QString::fromNSString([err localizedDescription ]);
- }
- emit connectionError(id, InterfaceLookupError);
- }
-
- locker.unlock();
- emit connectionError(id, InterfaceLookupError);
-}
-
-void QCoreWlanEngine::disconnectFromId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- QString interfaceString = getInterfaceFromId(id);
- if (interfaceString.isEmpty()) {
- locker.unlock();
- emit connectionError(id, DisconnectionError);
- return;
- }
- QMacAutoReleasePool pool;
-
- CWInterface *wifiInterface =
- [[CWWiFiClient sharedWiFiClient] interfaceWithName:interfaceString.toNSString()];
- disconnectedInterfaceString = interfaceString;
-
- [wifiInterface disassociate];
-
- QTimer::singleShot(1000, this,SLOT(checkDisconnect()));
-}
-
-void QCoreWlanEngine::checkDisconnect()
-{
- QMutexLocker locker(&mutex);
- if (!disconnectedInterfaceString.isEmpty()) {
- QMacAutoReleasePool pool;
-
- CWInterface *wifiInterface = [[CWWiFiClient sharedWiFiClient]
- interfaceWithName:disconnectedInterfaceString.toNSString()];
-
- const QString networkSsid = QString::fromNSString([wifiInterface ssid]);
- if (!networkSsid.isEmpty()) {
- const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
- locker.unlock();
- emit connectionError(id, DisconnectionError);
- locker.relock();
- }
- disconnectedInterfaceString.clear();
- }
-}
-
-void QCoreWlanEngine::requestUpdate()
-{
- scanThread->getUserConfigurations();
- doRequestUpdate();
-}
-
-void QCoreWlanEngine::doRequestUpdate()
-{
- QMutexLocker locker(&mutex);
-
- QMacAutoReleasePool pool;
-
- NSArray<NSString *> *wifiInterfaces = [CWWiFiClient interfaceNames];
- for (NSString *ifName in wifiInterfaces) {
- scanThread->interfaceName = QString::fromNSString(ifName);
- scanThread->start();
- }
- locker.unlock();
- if ([wifiInterfaces count] == 0)
- networksChanged();
-}
-
-bool QCoreWlanEngine::isWifiReady(const QString &wifiDeviceName)
-{
- QMutexLocker locker(&mutex);
- bool haswifi = false;
- if(hasWifi) {
- QMacAutoReleasePool pool;
- CWInterface *defaultInterface = [[CWWiFiClient sharedWiFiClient]
- interfaceWithName:wifiDeviceName.toNSString()];
- if (defaultInterface.powerOn) {
- haswifi = true;
- }
- }
- return haswifi;
-}
-
-
-QNetworkSession::State QCoreWlanEngine::sessionStateForId(const QString &id)
-{
- QMutexLocker locker(&mutex);
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- if (!ptr)
- return QNetworkSession::Invalid;
-
- if (!ptr->isValid) {
- return QNetworkSession::Invalid;
- } else if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- return QNetworkSession::Connected;
- } else if ((ptr->state & QNetworkConfiguration::Discovered) ==
- QNetworkConfiguration::Discovered) {
- return QNetworkSession::Disconnected;
- } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
- return QNetworkSession::NotAvailable;
- } else if ((ptr->state & QNetworkConfiguration::Undefined) ==
- QNetworkConfiguration::Undefined) {
- return QNetworkSession::NotAvailable;
- }
-
- return QNetworkSession::Invalid;
-}
-
-QNetworkConfigurationManager::Capabilities QCoreWlanEngine::capabilities() const
-{
- return QNetworkConfigurationManager::ForcedRoaming;
-}
-
-void QCoreWlanEngine::startNetworkChangeLoop()
-{
-
- SCDynamicStoreContext dynStoreContext = { 0, this/*(void *)storeSession*/, NULL, NULL, NULL };
- storeSession = SCDynamicStoreCreate(NULL,
- CFSTR("networkChangeCallback"),
- networkChangeCallback,
- &dynStoreContext);
- if (!storeSession ) {
- qWarning() << "could not open dynamic store: error:" << SCErrorString(SCError());
- return;
- }
-
- CFMutableArrayRef notificationKeys;
- notificationKeys = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
- CFMutableArrayRef patternsArray;
- patternsArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-
- CFStringRef storeKey;
- storeKey = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
- kSCDynamicStoreDomainState,
- kSCEntNetIPv4);
- CFArrayAppendValue(notificationKeys, storeKey);
- CFRelease(storeKey);
-
- storeKey = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
- kSCDynamicStoreDomainState,
- kSCCompAnyRegex,
- kSCEntNetIPv4);
- CFArrayAppendValue(patternsArray, storeKey);
- CFRelease(storeKey);
-
- if (!SCDynamicStoreSetNotificationKeys(storeSession , notificationKeys, patternsArray)) {
- qWarning() << "register notification error:"<< SCErrorString(SCError());
- CFRelease(storeSession );
- CFRelease(notificationKeys);
- CFRelease(patternsArray);
- return;
- }
- CFRelease(notificationKeys);
- CFRelease(patternsArray);
-
- runloopSource = SCDynamicStoreCreateRunLoopSource(NULL, storeSession , 0);
- if (!runloopSource) {
- qWarning() << "runloop source error:"<< SCErrorString(SCError());
- CFRelease(storeSession );
- return;
- }
-
- CFRunLoopAddSource(CFRunLoopGetCurrent(), runloopSource, kCFRunLoopDefaultMode);
- return;
-}
-
-QNetworkSessionPrivate *QCoreWlanEngine::createSessionBackend()
-{
- return new QNetworkSessionPrivateImpl;
-}
-
-QNetworkConfigurationPrivatePointer QCoreWlanEngine::defaultConfiguration()
-{
- return QNetworkConfigurationPrivatePointer();
-}
-
-bool QCoreWlanEngine::requiresPolling() const
-{
- return true;
-}
-
-void QCoreWlanEngine::networksChanged()
-{
- QMutexLocker locker(&mutex);
-
- QStringList previous = accessPointConfigurations.keys();
-
- QList<QNetworkConfigurationPrivate *> foundConfigurations = scanThread->getConfigurations();
- while (!foundConfigurations.isEmpty()) {
- QNetworkConfigurationPrivate *cpPriv = foundConfigurations.takeFirst();
-
- previous.removeAll(cpPriv->id);
-
- if (accessPointConfigurations.contains(cpPriv->id)) {
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(cpPriv->id);
-
- bool changed = false;
-
- ptr->mutex.lock();
-
- if (ptr->isValid != cpPriv->isValid) {
- ptr->isValid = cpPriv->isValid;
- changed = true;
- }
-
- if (ptr->name != cpPriv->name) {
- ptr->name = cpPriv->name;
- changed = true;
- }
-
- if (ptr->bearerType != cpPriv->bearerType) {
- ptr->bearerType = cpPriv->bearerType;
- changed = true;
- }
-
- if (ptr->state != cpPriv->state) {
- ptr->state = cpPriv->state;
- changed = true;
- }
-
- ptr->mutex.unlock();
-
- if (changed) {
- locker.unlock();
- emit configurationChanged(ptr);
- locker.relock();
- }
-
- delete cpPriv;
- } else {
- QNetworkConfigurationPrivatePointer ptr(cpPriv);
-
- accessPointConfigurations.insert(ptr->id, ptr);
-
- locker.unlock();
- emit configurationAdded(ptr);
- locker.relock();
- }
- }
-
- while (!previous.isEmpty()) {
- QNetworkConfigurationPrivatePointer ptr =
- accessPointConfigurations.take(previous.takeFirst());
-
- locker.unlock();
- emit configurationRemoved(ptr);
- locker.relock();
- }
-
- locker.unlock();
- emit updateCompleted();
-
-}
-
-quint64 QCoreWlanEngine::bytesWritten(const QString &id)
-{
- QMutexLocker locker(&mutex);
- const QString interfaceStr = getInterfaceFromId(id);
- return getBytes(interfaceStr,false);
-}
-
-quint64 QCoreWlanEngine::bytesReceived(const QString &id)
-{
- QMutexLocker locker(&mutex);
- const QString interfaceStr = getInterfaceFromId(id);
- return getBytes(interfaceStr,true);
-}
-
-quint64 QCoreWlanEngine::startTime(const QString &identifier)
-{
- QMutexLocker locker(&mutex);
- QMacAutoReleasePool pool;
- quint64 timestamp = 0;
-
- NSString *filePath = @"/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist";
- NSDictionary* plistDict = [[[NSDictionary alloc] initWithContentsOfFile:filePath] autorelease];
- if(plistDict == nil)
- return timestamp;
- NSString *input = @"KnownNetworks";
- NSString *timeStampStr = @"_timeStamp";
-
- NSString *ssidStr = @"SSID_STR";
-
- for (id key in plistDict) {
- if ([input isEqualToString:key]) {
-
- NSDictionary *knownNetworksDict = [plistDict objectForKey:key];
- if(knownNetworksDict == nil)
- return timestamp;
- for (id networkKey in knownNetworksDict) {
- bool isFound = false;
- NSDictionary *itemDict = [knownNetworksDict objectForKey:networkKey];
- if(itemDict == nil)
- return timestamp;
- NSInteger dictSize = [itemDict count];
- id objects[dictSize];
- id keys[dictSize];
-
- [itemDict getObjects:objects andKeys:keys];
- bool ok = false;
- for(int i = 0; i < dictSize; i++) {
- if([ssidStr isEqualToString:keys[i]]) {
- const QString ident = QString::number(qHash(QLatin1String("corewlan:") + QString::fromNSString(objects[i])));
- if(ident == identifier) {
- ok = true;
- }
- }
- if(ok && [timeStampStr isEqualToString:keys[i]]) {
- timestamp = (quint64)[objects[i] timeIntervalSince1970];
- isFound = true;
- break;
- }
- }
- if(isFound)
- break;
- }
- }
- }
- return timestamp;
-}
-
-quint64 QCoreWlanEngine::getBytes(const QString &interfaceName, bool b)
-{
- struct ifaddrs *ifAddressList, *ifAddress;
- struct if_data *if_data;
-
- quint64 bytes = 0;
- ifAddressList = nil;
- if(getifaddrs(&ifAddressList) == 0) {
- for(ifAddress = ifAddressList; ifAddress; ifAddress = ifAddress->ifa_next) {
- if(interfaceName == ifAddress->ifa_name) {
- if_data = (struct if_data*)ifAddress->ifa_data;
- if(b) {
- bytes = if_data->ifi_ibytes;
- break;
- } else {
- bytes = if_data->ifi_obytes;
- break;
- }
- }
- }
- freeifaddrs(ifAddressList);
- }
- return bytes;
-}
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/plugins/bearer/generic/generic.json b/src/plugins/bearer/generic/generic.json
deleted file mode 100644
index e9357f4c72..0000000000
--- a/src/plugins/bearer/generic/generic.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "generic" ]
-}
diff --git a/src/plugins/bearer/generic/generic.pro b/src/plugins/bearer/generic/generic.pro
deleted file mode 100644
index f30bdc4951..0000000000
--- a/src/plugins/bearer/generic/generic.pro
+++ /dev/null
@@ -1,19 +0,0 @@
-TARGET = qgenericbearer
-
-QT = core-private network-private
-
-HEADERS += qgenericengine.h \
- ../qnetworksession_impl.h \
- ../qbearerengine_impl.h \
- ../platformdefs_win.h
-SOURCES += qgenericengine.cpp \
- ../qnetworksession_impl.cpp \
- main.cpp
-
-OTHER_FILES += generic.json
-
-win32:!winrt:LIBS += -liphlpapi
-
-PLUGIN_TYPE = bearer
-PLUGIN_CLASS_NAME = QGenericEnginePlugin
-load(qt_plugin)
diff --git a/src/plugins/bearer/generic/main.cpp b/src/plugins/bearer/generic/main.cpp
deleted file mode 100644
index 82a9ce97f4..0000000000
--- a/src/plugins/bearer/generic/main.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgenericengine.h"
-
-#include <QtNetwork/private/qbearerplugin_p.h>
-
-#include <QtCore/qdebug.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGenericEnginePlugin : public QBearerEnginePlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QBearerEngineFactoryInterface" FILE "generic.json")
-
-public:
- QGenericEnginePlugin();
- ~QGenericEnginePlugin();
-
- QBearerEngine *create(const QString &key) const override;
-};
-
-QGenericEnginePlugin::QGenericEnginePlugin()
-{
-}
-
-QGenericEnginePlugin::~QGenericEnginePlugin()
-{
-}
-
-QBearerEngine *QGenericEnginePlugin::create(const QString &key) const
-{
- if (key == QLatin1String("generic"))
- return new QGenericEngine;
- else
- return 0;
-}
-
-QT_END_NAMESPACE
-
-#include "main.moc"
diff --git a/src/plugins/bearer/generic/qgenericengine.cpp b/src/plugins/bearer/generic/qgenericengine.cpp
deleted file mode 100644
index b1f28849a7..0000000000
--- a/src/plugins/bearer/generic/qgenericengine.cpp
+++ /dev/null
@@ -1,446 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-// see comment in ../platformdefs_win.h.
-#define WIN32_LEAN_AND_MEAN 1
-
-#include "qgenericengine.h"
-#include "../qnetworksession_impl.h"
-
-#include <QtNetwork/private/qnetworkconfiguration_p.h>
-
-#include <QtCore/qthread.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qstringlist.h>
-
-#include <QtCore/qdebug.h>
-#include <QtCore/private/qcoreapplication_p.h>
-
-#if defined(Q_OS_WIN32)
-// PMIB_TCPTABLE2 is only available since Vista
-#if _WIN32_WINNT < 0x0601
-# undef _WIN32_WINNT
-# define _WIN32_WINNT 0x0601
-#endif // _WIN32_WINNT < 0x0601
-#include "../platformdefs_win.h"
-#include <iphlpapi.h>
-#endif
-
-#ifdef Q_OS_WINRT
-#include <qfunctions_winrt.h>
-
-#include <wrl.h>
-#include <windows.foundation.h>
-#include <windows.foundation.collections.h>
-#include <windows.networking.connectivity.h>
-
-using namespace Microsoft::WRL;
-using namespace Microsoft::WRL::Wrappers;
-using namespace ABI::Windows::Foundation;
-using namespace ABI::Windows::Foundation::Collections;
-using namespace ABI::Windows::Networking;
-using namespace ABI::Windows::Networking::Connectivity;
-#endif // Q_OS_WINRT
-
-// needed as interface is used as parameter name in qGetInterfaceType
-#undef interface
-
-#ifdef Q_OS_LINUX
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <net/if.h>
-#include <net/if_arp.h>
-#include <unistd.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_NETWORKINTERFACE
-static QNetworkConfiguration::BearerType qGetInterfaceType(const QString &interface)
-{
-#if defined(Q_OS_WIN32)
- // QNetworkInterface::name returns a more friendly name on Windows. That name is not
- // accepted as an identifier for CreateFile so we have to obtain the Luid.
- std::wstring buf = interface.toStdWString();
- if (buf.size() == 0)
- return QNetworkConfiguration::BearerUnknown;
-
- NET_LUID luid;
- NETIO_STATUS status = ConvertInterfaceNameToLuidW(buf.c_str(), &luid);
- if (status != NO_ERROR)
- return QNetworkConfiguration::BearerUnknown;
-
- switch (luid.Info.IfType) {
- case IF_TYPE_ETHERNET_CSMACD:
- case IF_TYPE_ISO88025_TOKENRING:
- case IF_TYPE_PPP:
- case IF_TYPE_SOFTWARE_LOOPBACK:
- return QNetworkConfiguration::BearerEthernet;
- case IF_TYPE_IEEE80211:
- return QNetworkConfiguration::BearerWLAN;
- case IF_TYPE_ATM:
- case IF_TYPE_IEEE1394:
- case IF_TYPE_OTHER:
- case IF_TYPE_TUNNEL:
- return QNetworkConfiguration::BearerUnknown;
- default:
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "Interface Type" << luid.Info.IfType;
-#endif
- return QNetworkConfiguration::BearerUnknown;
- }
- return QNetworkConfiguration::BearerUnknown;
-
-#elif defined(Q_OS_LINUX)
- int sock = socket(AF_INET, SOCK_DGRAM, 0);
-
- ifreq request;
- strncpy(request.ifr_name, interface.toLocal8Bit().data(), sizeof(request.ifr_name) - 1);
- request.ifr_name[sizeof(request.ifr_name) - 1] = '\0';
- int result = ioctl(sock, SIOCGIFHWADDR, &request);
- close(sock);
-
- if (result >= 0 && request.ifr_hwaddr.sa_family == ARPHRD_ETHER)
- return QNetworkConfiguration::BearerEthernet;
-#elif defined(Q_OS_WINRT)
- ComPtr<INetworkInformationStatics> networkInfoStatics;
- HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_Connectivity_NetworkInformation).Get(), &networkInfoStatics);
- Q_ASSERT_SUCCEEDED(hr);
- ComPtr<IVectorView<ConnectionProfile *>> connectionProfiles;
- hr = networkInfoStatics->GetConnectionProfiles(&connectionProfiles);
- Q_ASSERT_SUCCEEDED(hr);
- if (!connectionProfiles)
- return QNetworkConfiguration::BearerUnknown;
-
- unsigned int size;
- hr = connectionProfiles->get_Size(&size);
- Q_ASSERT_SUCCEEDED(hr);
- for (unsigned int i = 0; i < size; ++i) {
- ComPtr<IConnectionProfile> profile;
- hr = connectionProfiles->GetAt(i, &profile);
- Q_ASSERT_SUCCEEDED(hr);
-
- ComPtr<INetworkAdapter> adapter;
- hr = profile->get_NetworkAdapter(&adapter);
- // Indicates that no internet connection is available/the device is in airplane mode
- if (hr == E_INVALIDARG)
- return QNetworkConfiguration::BearerUnknown;
- Q_ASSERT_SUCCEEDED(hr);
- GUID id;
- hr = adapter->get_NetworkAdapterId(&id);
- Q_ASSERT_SUCCEEDED(hr);
- OLECHAR adapterName[39]={0};
- int length = StringFromGUID2(id, adapterName, 39);
- // "length - 1" as we have to remove the null terminator from it in order to compare
- if (!length
- || QString::fromRawData(reinterpret_cast<const QChar *>(adapterName), length - 1) != interface)
- continue;
-
- ComPtr<IConnectionProfile2> profile2;
- hr = profile.As(&profile2);
- Q_ASSERT_SUCCEEDED(hr);
- boolean isWLan;
- hr = profile2->get_IsWlanConnectionProfile(&isWLan);
- Q_ASSERT_SUCCEEDED(hr);
- if (isWLan)
- return QNetworkConfiguration::BearerWLAN;
-
- boolean isWWan;
- hr = profile2->get_IsWwanConnectionProfile(&isWWan);
- Q_ASSERT_SUCCEEDED(hr);
- if (isWWan) {
- ComPtr<IWwanConnectionProfileDetails> details;
- hr = profile2->get_WwanConnectionProfileDetails(&details);
- Q_ASSERT_SUCCEEDED(hr);
- WwanDataClass dataClass;
- hr = details->GetCurrentDataClass(&dataClass);
- Q_ASSERT_SUCCEEDED(hr);
- switch (dataClass) {
- case WwanDataClass_Edge:
- case WwanDataClass_Gprs:
- return QNetworkConfiguration::Bearer2G;
- case WwanDataClass_Umts:
- return QNetworkConfiguration::BearerWCDMA;
- case WwanDataClass_LteAdvanced:
- return QNetworkConfiguration::BearerLTE;
- case WwanDataClass_Hsdpa:
- case WwanDataClass_Hsupa:
- return QNetworkConfiguration::BearerHSPA;
- case WwanDataClass_Cdma1xRtt:
- case WwanDataClass_Cdma3xRtt:
- case WwanDataClass_CdmaUmb:
- return QNetworkConfiguration::BearerCDMA2000;
- case WwanDataClass_Cdma1xEvdv:
- case WwanDataClass_Cdma1xEvdo:
- case WwanDataClass_Cdma1xEvdoRevA:
- case WwanDataClass_Cdma1xEvdoRevB:
- return QNetworkConfiguration::BearerEVDO;
- case WwanDataClass_Custom:
- case WwanDataClass_None:
- default:
- return QNetworkConfiguration::BearerUnknown;
- }
- }
- return QNetworkConfiguration::BearerEthernet;
- }
-#else
- Q_UNUSED(interface);
-#endif
-
- return QNetworkConfiguration::BearerUnknown;
-}
-#endif
-
-QGenericEngine::QGenericEngine(QObject *parent)
-: QBearerEngineImpl(parent)
-{
- //workaround for deadlock in __cxa_guard_acquire with webkit on macos x
- //initialise the Q_GLOBAL_STATIC in same thread as the AtomicallyInitializedStatic
- (void)QNetworkInterface::interfaceFromIndex(0);
-}
-
-QGenericEngine::~QGenericEngine()
-{
-}
-
-QString QGenericEngine::getInterfaceFromId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- return configurationInterface.value(id);
-}
-
-bool QGenericEngine::hasIdentifier(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- return configurationInterface.contains(id);
-}
-
-void QGenericEngine::connectToId(const QString &id)
-{
- emit connectionError(id, OperationNotSupported);
-}
-
-void QGenericEngine::disconnectFromId(const QString &id)
-{
- emit connectionError(id, OperationNotSupported);
-}
-
-void QGenericEngine::initialize()
-{
- doRequestUpdate();
-}
-
-void QGenericEngine::requestUpdate()
-{
- doRequestUpdate();
-}
-
-void QGenericEngine::doRequestUpdate()
-{
-#ifndef QT_NO_NETWORKINTERFACE
- QMutexLocker locker(&mutex);
-
- // Immediately after connecting with a wireless access point
- // QNetworkInterface::allInterfaces() will sometimes return an empty list. Calling it again a
- // second time results in a non-empty list. If we loose interfaces we will end up removing
- // network configurations which will break current sessions.
- QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
- if (interfaces.isEmpty())
- interfaces = QNetworkInterface::allInterfaces();
-
- QStringList previous = accessPointConfigurations.keys();
-
- // create configuration for each interface
- while (!interfaces.isEmpty()) {
- QNetworkInterface interface = interfaces.takeFirst();
-
- if (!interface.isValid())
- continue;
-
- // ignore loopback interface
- if (interface.flags() & QNetworkInterface::IsLoopBack)
- continue;
-
-#ifndef Q_OS_WIN
- // ignore WLAN interface handled in separate engine
- if (qGetInterfaceType(interface.name()) == QNetworkConfiguration::BearerWLAN)
- continue;
-#endif
-
- uint identifier;
- if (interface.index())
- identifier = qHash(QLatin1String("generic:") + QString::number(interface.index()));
- else
- identifier = qHash(QLatin1String("generic:") + interface.hardwareAddress());
-
- const QString id = QString::number(identifier);
-
- previous.removeAll(id);
-
- QString name = interface.humanReadableName();
- if (name.isEmpty())
- name = interface.name();
-
- QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Defined;
- if ((interface.flags() & QNetworkInterface::IsRunning) && !interface.addressEntries().isEmpty())
- state |= QNetworkConfiguration::Active;
-
- if (accessPointConfigurations.contains(id)) {
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- bool changed = false;
-
- ptr->mutex.lock();
-
- if (!ptr->isValid) {
- ptr->isValid = true;
- changed = true;
- }
-
- if (ptr->name != name) {
- ptr->name = name;
- changed = true;
- }
-
- if (ptr->id != id) {
- ptr->id = id;
- changed = true;
- }
-
- if (ptr->state != state) {
- ptr->state = state;
- changed = true;
- }
-
- ptr->mutex.unlock();
-
- if (changed) {
- locker.unlock();
- emit configurationChanged(ptr);
- locker.relock();
- }
- } else {
- QNetworkConfigurationPrivatePointer ptr(new QNetworkConfigurationPrivate);
-
- ptr->name = name;
- ptr->isValid = true;
- ptr->id = id;
- ptr->state = state;
- ptr->type = QNetworkConfiguration::InternetAccessPoint;
- ptr->bearerType = qGetInterfaceType(interface.name());
-
- accessPointConfigurations.insert(id, ptr);
- configurationInterface.insert(id, interface.name());
-
- locker.unlock();
- emit configurationAdded(ptr);
- locker.relock();
- }
- }
-
- while (!previous.isEmpty()) {
- QNetworkConfigurationPrivatePointer ptr =
- accessPointConfigurations.take(previous.takeFirst());
-
- configurationInterface.remove(ptr->id);
-
- locker.unlock();
- emit configurationRemoved(ptr);
- locker.relock();
- }
-
- locker.unlock();
-#endif
-
- emit updateCompleted();
-}
-
-QNetworkSession::State QGenericEngine::sessionStateForId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- if (!ptr)
- return QNetworkSession::Invalid;
-
- QMutexLocker configLocker(&ptr->mutex);
-
- if (!ptr->isValid) {
- return QNetworkSession::Invalid;
- } else if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- return QNetworkSession::Connected;
- } else if ((ptr->state & QNetworkConfiguration::Discovered) ==
- QNetworkConfiguration::Discovered) {
- return QNetworkSession::Disconnected;
- } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
- return QNetworkSession::NotAvailable;
- } else if ((ptr->state & QNetworkConfiguration::Undefined) ==
- QNetworkConfiguration::Undefined) {
- return QNetworkSession::NotAvailable;
- }
-
- return QNetworkSession::Invalid;
-}
-
-QNetworkConfigurationManager::Capabilities QGenericEngine::capabilities() const
-{
- return QNetworkConfigurationManager::ForcedRoaming;
-}
-
-QNetworkSessionPrivate *QGenericEngine::createSessionBackend()
-{
- return new QNetworkSessionPrivateImpl;
-}
-
-QNetworkConfigurationPrivatePointer QGenericEngine::defaultConfiguration()
-{
- return QNetworkConfigurationPrivatePointer();
-}
-
-
-bool QGenericEngine::requiresPolling() const
-{
- return true;
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/bearer/generic/qgenericengine.h b/src/plugins/bearer/generic/qgenericengine.h
deleted file mode 100644
index 79c71ca7a3..0000000000
--- a/src/plugins/bearer/generic/qgenericengine.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGENERICENGINE_H
-#define QGENERICENGINE_H
-
-#include "../qbearerengine_impl.h"
-
-#include <QMap>
-#include <QTimer>
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkConfigurationPrivate;
-class QNetworkSessionPrivate;
-
-class QGenericEngine : public QBearerEngineImpl
-{
- Q_OBJECT
-
-public:
- QGenericEngine(QObject *parent = nullptr);
- ~QGenericEngine();
-
- QString getInterfaceFromId(const QString &id) override;
- bool hasIdentifier(const QString &id) override;
-
- void connectToId(const QString &id) override;
- void disconnectFromId(const QString &id) override;
-
- Q_INVOKABLE void initialize();
- Q_INVOKABLE void requestUpdate();
-
- QNetworkSession::State sessionStateForId(const QString &id) override;
-
- QNetworkConfigurationManager::Capabilities capabilities() const override;
-
- QNetworkSessionPrivate *createSessionBackend() override;
-
- QNetworkConfigurationPrivatePointer defaultConfiguration() override;
-
- bool requiresPolling() const override;
-
-private Q_SLOTS:
- void doRequestUpdate();
-
-private:
- QMap<QString, QString> configurationInterface;
-};
-
-QT_END_NAMESPACE
-
-#endif
-
diff --git a/src/plugins/bearer/linux_common/qofonoservice_linux.cpp b/src/plugins/bearer/linux_common/qofonoservice_linux.cpp
deleted file mode 100644
index 05f9b3ca17..0000000000
--- a/src/plugins/bearer/linux_common/qofonoservice_linux.cpp
+++ /dev/null
@@ -1,384 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QObject>
-#include <QList>
-#include <QtDBus/QtDBus>
-#include <QtDBus/QDBusConnection>
-#include <QtDBus/QDBusError>
-#include <QtDBus/QDBusInterface>
-#include <QtDBus/QDBusMessage>
-#include <QtDBus/QDBusReply>
-#include <QtDBus/QDBusPendingCallWatcher>
-#include <QtDBus/QDBusObjectPath>
-#include <QtDBus/QDBusPendingCall>
-
-#include "qofonoservice_linux_p.h"
-
-#ifndef QT_NO_DBUS
-
-QDBusArgument &operator<<(QDBusArgument &argument, const ObjectPathProperties &item)
-{
- argument.beginStructure();
- argument << item.path << item.properties;
- argument.endStructure();
- return argument;
-}
-
-const QDBusArgument &operator>>(const QDBusArgument &argument, ObjectPathProperties &item)
-{
- argument.beginStructure();
- argument >> item.path >> item.properties;
- argument.endStructure();
- return argument;
-}
-
-QT_BEGIN_NAMESPACE
-
-QOfonoManagerInterface::QOfonoManagerInterface( QObject *parent)
- : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
- QLatin1String(OFONO_MANAGER_PATH),
- OFONO_MANAGER_INTERFACE,
- QDBusConnection::systemBus(), parent)
-{
- qDBusRegisterMetaType<ObjectPathProperties>();
- qDBusRegisterMetaType<PathPropertiesList>();
-
- QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
- QLatin1String(OFONO_MANAGER_PATH),
- QLatin1String(OFONO_MANAGER_INTERFACE),
- QLatin1String("ModemAdded"),
- this,SLOT(modemAdded(QDBusObjectPath,QVariantMap)));
- QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
- QLatin1String(OFONO_MANAGER_PATH),
- QLatin1String(OFONO_MANAGER_INTERFACE),
- QLatin1String("ModemRemoved"),
- this,SLOT(modemRemoved(QDBusObjectPath)));
-}
-
-QOfonoManagerInterface::~QOfonoManagerInterface()
-{
-}
-
-QStringList QOfonoManagerInterface::getModems()
-{
- if (modemList.isEmpty()) {
- QDBusPendingReply<PathPropertiesList> reply = call(QDBus::Block, QLatin1String("GetModems"));
- reply.waitForFinished();
- if (!reply.isError()) {
- const auto modems = reply.value();
- for (const ObjectPathProperties &modem : modems)
- modemList << modem.path.path();
- }
- }
-
- return modemList;
-}
-
-QString QOfonoManagerInterface::currentModem()
-{
- const QStringList modems = getModems();
- for (const QString &modem : modems) {
- QOfonoModemInterface device(modem);
- if (device.isPowered() && device.isOnline()
- && device.interfaces().contains(QLatin1String("org.ofono.NetworkRegistration")))
- return modem;
- }
- return QString();
-}
-
-void QOfonoManagerInterface::modemAdded(const QDBusObjectPath &path, const QVariantMap &/*var*/)
-{
- if (!modemList.contains(path.path())) {
- modemList << path.path();
- Q_EMIT modemChanged();
- }
-}
-
-void QOfonoManagerInterface::modemRemoved(const QDBusObjectPath &path)
-{
- if (modemList.contains(path.path())) {
- modemList.removeOne(path.path());
- Q_EMIT modemChanged();
- }
-}
-
-
-QOfonoModemInterface::QOfonoModemInterface(const QString &dbusPathName, QObject *parent)
- : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
- dbusPathName,
- OFONO_MODEM_INTERFACE,
- QDBusConnection::systemBus(), parent)
-{
- QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
- path(),
- OFONO_MODEM_INTERFACE,
- QLatin1String("PropertyChanged"),
- this,SLOT(propertyChanged(QString,QDBusVariant)));
-}
-
-QOfonoModemInterface::~QOfonoModemInterface()
-{
-}
-
-void QOfonoModemInterface::propertyChanged(const QString &name,const QDBusVariant &value)
-{
- propertiesMap[name] = value.variant();
-}
-
-bool QOfonoModemInterface::isPowered()
-{
- QVariant var = getProperty(QStringLiteral("Powered"));
- return qdbus_cast<bool>(var);
-}
-
-bool QOfonoModemInterface::isOnline()
-{
- QVariant var = getProperty(QStringLiteral("Online"));
- return qdbus_cast<bool>(var);
-}
-
-QStringList QOfonoModemInterface::interfaces()
-{
- const QVariant var = getProperty(QStringLiteral("Interfaces"));
- return var.toStringList();
-}
-
-QVariantMap QOfonoModemInterface::getProperties()
-{
- if (propertiesMap.isEmpty()) {
- QDBusPendingReply<QVariantMap> reply = call(QDBus::Block, QLatin1String("GetProperties"));
- if (!reply.isError()) {
- propertiesMap = reply.value();
- }
- }
- return propertiesMap;
-}
-
-QVariant QOfonoModemInterface::getProperty(const QString &property)
-{
- QVariant var;
- QVariantMap map = getProperties();
- if (map.contains(property))
- var = map.value(property);
- return var;
-}
-
-
-QOfonoNetworkRegistrationInterface::QOfonoNetworkRegistrationInterface(const QString &dbusPathName, QObject *parent)
- : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
- dbusPathName,
- OFONO_NETWORK_REGISTRATION_INTERFACE,
- QDBusConnection::systemBus(), parent)
-{
-}
-
-QOfonoNetworkRegistrationInterface::~QOfonoNetworkRegistrationInterface()
-{
-}
-
-QString QOfonoNetworkRegistrationInterface::getTechnology()
-{
- QVariant var = getProperty(QStringLiteral("Technology"));
- return qdbus_cast<QString>(var);
-}
-
-QVariant QOfonoNetworkRegistrationInterface::getProperty(const QString &property)
-{
- QVariant var;
- QVariantMap map = getProperties();
- if (map.contains(property))
- var = map.value(property);
- return var;
-}
-
-QVariantMap QOfonoNetworkRegistrationInterface::getProperties()
-{
- if (propertiesMap.isEmpty()) {
- QDBusPendingReply<QVariantMap> reply = call(QDBus::Block, QLatin1String("GetProperties"));
- reply.waitForFinished();
- if (!reply.isError()) {
- propertiesMap = reply.value();
- }
- }
- return propertiesMap;
-}
-
-QOfonoDataConnectionManagerInterface::QOfonoDataConnectionManagerInterface(const QString &dbusPathName, QObject *parent)
- : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
- dbusPathName,
- OFONO_DATA_CONNECTION_MANAGER_INTERFACE,
- QDBusConnection::systemBus(), parent)
-{
- QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
- path(),
- QLatin1String(OFONO_MODEM_INTERFACE),
- QLatin1String("PropertyChanged"),
- this,SLOT(propertyChanged(QString,QDBusVariant)));
-}
-
-QOfonoDataConnectionManagerInterface::~QOfonoDataConnectionManagerInterface()
-{
-}
-
-QStringList QOfonoDataConnectionManagerInterface::contexts()
-{
- if (contextList.isEmpty()) {
- QDBusPendingReply<PathPropertiesList > reply = call(QLatin1String("GetContexts"));
- reply.waitForFinished();
- if (!reply.isError()) {
- const auto contexts = reply.value();
- for (const ObjectPathProperties &context : contexts)
- contextList << context.path.path();
- }
- }
- return contextList;
-}
-
-PathPropertiesList QOfonoDataConnectionManagerInterface::contextsWithProperties()
-{
- if (contextListProperties.isEmpty()) {
- QDBusPendingReply<PathPropertiesList > reply = call(QLatin1String("GetContexts"));
- reply.waitForFinished();
- if (!reply.isError()) {
- contextListProperties = reply.value();
- }
- }
- return contextListProperties;
-}
-
-bool QOfonoDataConnectionManagerInterface::roamingAllowed()
-{
- QVariant var = getProperty(QStringLiteral("RoamingAllowed"));
- return qdbus_cast<bool>(var);
-}
-
-QString QOfonoDataConnectionManagerInterface::bearer()
-{
- QVariant var = getProperty(QStringLiteral("Bearer"));
- return qdbus_cast<QString>(var);
-}
-
-QVariant QOfonoDataConnectionManagerInterface::getProperty(const QString &property)
-{
- return getProperties().value(property);
-}
-
-QVariantMap &QOfonoDataConnectionManagerInterface::getProperties()
-{
- if (propertiesMap.isEmpty()) {
- QDBusPendingReply<QVariantMap> reply = call(QDBus::Block, QLatin1String("GetProperties"));
- if (!reply.isError()) {
- propertiesMap = reply.value();
- }
- }
- return propertiesMap;
-}
-
-void QOfonoDataConnectionManagerInterface::propertyChanged(const QString &name, const QDBusVariant &value)
-{
- propertiesMap[name] = value.variant();
- if (name == QLatin1String("RoamingAllowed"))
- Q_EMIT roamingAllowedChanged(value.variant().toBool());
-}
-
-
-QOfonoConnectionContextInterface::QOfonoConnectionContextInterface(const QString &dbusPathName, QObject *parent)
- : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
- dbusPathName,
- OFONO_CONNECTION_CONTEXT_INTERFACE,
- QDBusConnection::systemBus(), parent)
-{
- QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
- path(),
- QLatin1String(OFONO_MODEM_INTERFACE),
- QLatin1String("PropertyChanged"),
- this,SLOT(propertyChanged(QString,QDBusVariant)));
-}
-
-QOfonoConnectionContextInterface::~QOfonoConnectionContextInterface()
-{
-}
-
-QVariantMap QOfonoConnectionContextInterface::getProperties()
-{
- if (propertiesMap.isEmpty()) {
- QDBusPendingReply<QVariantMap> reply = call(QDBus::Block, QLatin1String("GetProperties"));
- if (!reply.isError()) {
- propertiesMap = reply.value();
- }
- }
- return propertiesMap;
-}
-
-void QOfonoConnectionContextInterface::propertyChanged(const QString &name, const QDBusVariant &value)
-{
- propertiesMap[name] = value.variant();
-}
-
-QVariant QOfonoConnectionContextInterface::getProperty(const QString &property)
-{
- QVariant var;
- QVariantMap map = getProperties();
- if (map.contains(property))
- var = map.value(property);
- return var;
-}
-
-bool QOfonoConnectionContextInterface::active()
-{
- QVariant var = getProperty(QStringLiteral("Active"));
- return qdbus_cast<bool>(var);
-}
-
-QString QOfonoConnectionContextInterface::accessPointName()
-{
- QVariant var = getProperty(QStringLiteral("AccessPointName"));
- return qdbus_cast<QString>(var);
-}
-
-QString QOfonoConnectionContextInterface::name()
-{
- QVariant var = getProperty(QStringLiteral("Name"));
- return qdbus_cast<QString>(var);
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/nativewifi/main.cpp b/src/plugins/bearer/nativewifi/main.cpp
deleted file mode 100644
index 826c0104e4..0000000000
--- a/src/plugins/bearer/nativewifi/main.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qnativewifiengine.h"
-#include "platformdefs.h"
-
-#include <QtCore/qmutex.h>
-#include <QtCore/qlibrary.h>
-
-#include <QtNetwork/private/qbearerplugin_p.h>
-
-#include <QtCore/qdebug.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-static bool resolveLibraryInternal()
-{
- QLibrary wlanapiLib(QLatin1String("wlanapi"));
- local_WlanOpenHandle = (WlanOpenHandleProto)
- wlanapiLib.resolve("WlanOpenHandle");
- local_WlanRegisterNotification = (WlanRegisterNotificationProto)
- wlanapiLib.resolve("WlanRegisterNotification");
- local_WlanEnumInterfaces = (WlanEnumInterfacesProto)
- wlanapiLib.resolve("WlanEnumInterfaces");
- local_WlanGetAvailableNetworkList = (WlanGetAvailableNetworkListProto)
- wlanapiLib.resolve("WlanGetAvailableNetworkList");
- local_WlanQueryInterface = (WlanQueryInterfaceProto)
- wlanapiLib.resolve("WlanQueryInterface");
- local_WlanConnect = (WlanConnectProto)
- wlanapiLib.resolve("WlanConnect");
- local_WlanDisconnect = (WlanDisconnectProto)
- wlanapiLib.resolve("WlanDisconnect");
- local_WlanScan = (WlanScanProto)
- wlanapiLib.resolve("WlanScan");
- local_WlanFreeMemory = (WlanFreeMemoryProto)
- wlanapiLib.resolve("WlanFreeMemory");
- local_WlanCloseHandle = (WlanCloseHandleProto)
- wlanapiLib.resolve("WlanCloseHandle");
- return true;
-}
-Q_GLOBAL_STATIC_WITH_ARGS(bool, resolveLibrary, (resolveLibraryInternal()))
-
-class QNativeWifiEnginePlugin : public QBearerEnginePlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QBearerEngineFactoryInterface" FILE "nativewifi.json")
-
-public:
- QNativeWifiEnginePlugin();
- ~QNativeWifiEnginePlugin();
-
- QBearerEngine *create(const QString &key) const;
-};
-
-QNativeWifiEnginePlugin::QNativeWifiEnginePlugin()
-{
-}
-
-QNativeWifiEnginePlugin::~QNativeWifiEnginePlugin()
-{
-}
-
-QBearerEngine *QNativeWifiEnginePlugin::create(const QString &key) const
-{
- if (key != QLatin1String("nativewifi"))
- return 0;
-
- resolveLibrary();
-
- // native wifi dll not available
- if (!local_WlanOpenHandle)
- return 0;
-
- QNativeWifiEngine *engine = new QNativeWifiEngine;
-
- // could not initialise subsystem
- if (engine && !engine->available()) {
- delete engine;
- return 0;
- }
-
- return engine;
-}
-
-QT_END_NAMESPACE
-
-#include "main.moc"
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/nativewifi/nativewifi.json b/src/plugins/bearer/nativewifi/nativewifi.json
deleted file mode 100644
index f3db199150..0000000000
--- a/src/plugins/bearer/nativewifi/nativewifi.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "nativewifi" ]
-}
diff --git a/src/plugins/bearer/nativewifi/nativewifi.pro b/src/plugins/bearer/nativewifi/nativewifi.pro
deleted file mode 100644
index da7f2da353..0000000000
--- a/src/plugins/bearer/nativewifi/nativewifi.pro
+++ /dev/null
@@ -1,18 +0,0 @@
-TARGET = qnativewifibearer
-
-QT = core-private network-private
-
-HEADERS += qnativewifiengine.h \
- platformdefs.h \
- ../qnetworksession_impl.h \
- ../qbearerengine_impl.h
-
-SOURCES += main.cpp \
- qnativewifiengine.cpp \
- ../qnetworksession_impl.cpp
-
-OTHER_FILES += nativewifi.json
-
-PLUGIN_TYPE = bearer
-PLUGIN_CLASS_NAME = QNativeWifiEnginePlugin
-load(qt_plugin)
diff --git a/src/plugins/bearer/nativewifi/platformdefs.h b/src/plugins/bearer/nativewifi/platformdefs.h
deleted file mode 100644
index b8ac40af15..0000000000
--- a/src/plugins/bearer/nativewifi/platformdefs.h
+++ /dev/null
@@ -1,327 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PLATFORMDEFS_H
-#define PLATFORMDEFS_H
-
-#include <wtypes.h>
-#undef interface
-
-//proper header is wlanapi.h, but that is not included in windows XP
-
-#define WLAN_MAX_NAME_LENGTH 256
-#define WLAN_MAX_PHY_TYPE_NUMBER 8
-#define WLAN_NOTIFICATION_SOURCE_ACM 0x00000008
-#define WLAN_NOTIFICATION_SOURCE_ALL 0x0000ffff
-#define WLAN_AVAILABLE_NETWORK_CONNECTED 1
-#define WLAN_AVAILABLE_NETWORK_HAS_PROFILE 2
-#define DOT11_SSID_MAX_LENGTH 32
-
-QT_BEGIN_NAMESPACE
-
-struct WLAN_NOTIFICATION_DATA {
- DWORD NotificationSource;
- DWORD NotificationCode;
- GUID InterfaceGuid;
- DWORD dwDataSize;
- PVOID pData;
-};
-
-enum WLAN_INTERFACE_STATE {
- wlan_interface_state_not_ready = 0,
- wlan_interface_state_connected,
- wlan_interface_state_ad_hoc_network_formed,
- wlan_interface_state_disconnecting,
- wlan_interface_state_disconnected,
- wlan_interface_state_associating,
- wlan_interface_state_discovering,
- wlan_interface_state_authenticating
-};
-
-struct WLAN_INTERFACE_INFO {
- GUID InterfaceGuid;
- WCHAR strInterfaceDescription[WLAN_MAX_NAME_LENGTH];
- WLAN_INTERFACE_STATE isState;
-};
-
-struct WLAN_INTERFACE_INFO_LIST {
- DWORD dwNumberOfItems;
- DWORD dwIndex;
- WLAN_INTERFACE_INFO InterfaceInfo[1];
-};
-
-struct DOT11_SSID {
- ULONG uSSIDLength;
- UCHAR ucSSID[DOT11_SSID_MAX_LENGTH];
-};
-
-struct NDIS_OBJECT_HEADER {
- UCHAR Type;
- UCHAR Revision;
- USHORT Size;
-};
-
-typedef UCHAR DOT11_MAC_ADDRESS[6];
-struct DOT11_BSSID_LIST {
- NDIS_OBJECT_HEADER Header;
- ULONG uNumberOfEntries;
- ULONG uTotalNumOfEntries;
- DOT11_MAC_ADDRESS BSSIDs[1];
-};
-
-enum DOT11_BSS_TYPE {
- dot11_BSS_type_infrastructure = 1,
- dot11_BSS_type_independent = 2,
- dot11_BSS_type_any = 3
-};
-
-enum DOT11_PHY_TYPE {
- dot11_phy_type_unknown = 0,
- dot11_phy_type_any = dot11_phy_type_unknown,
- dot11_phy_type_fhss = 1,
- dot11_phy_type_dsss = 2,
- dot11_phy_type_irbaseband = 3,
- dot11_phy_type_ofdm = 4,
- dot11_phy_type_hrdsss = 5,
- dot11_phy_type_erp = 6,
- dot11_phy_type_ht = 7,
- dot11_phy_type_IHV_start = 0x80000000,
- dot11_phy_type_IHV_end = 0xffffffff
-};
-
-enum DOT11_AUTH_ALGORITHM {
- DOT11_AUTH_ALGO_80211_OPEN = 1,
- DOT11_AUTH_ALGO_80211_SHARED_KEY = 2,
- DOT11_AUTH_ALGO_WPA = 3,
- DOT11_AUTH_ALGO_WPA_PSK = 4,
- DOT11_AUTH_ALGO_WPA_NONE = 5,
- DOT11_AUTH_ALGO_RSNA = 6,
- DOT11_AUTH_ALGO_RSNA_PSK = 7,
- DOT11_AUTH_ALGO_IHV_START = 0x80000000,
- DOT11_AUTH_ALGO_IHV_END = 0xffffffff
-};
-
-enum DOT11_CIPHER_ALGORITHM {
- DOT11_CIPHER_ALGO_NONE = 0x00,
- DOT11_CIPHER_ALGO_WEP40 = 0x01,
- DOT11_CIPHER_ALGO_TKIP = 0x02,
- DOT11_CIPHER_ALGO_CCMP = 0x04,
- DOT11_CIPHER_ALGO_WEP104 = 0x05,
- DOT11_CIPHER_ALGO_WPA_USE_GROUP = 0x100,
- DOT11_CIPHER_ALGO_RSN_USE_GROUP = 0x100,
- DOT11_CIPHER_ALGO_WEP = 0x101,
- DOT11_CIPHER_ALGO_IHV_START = 0x80000000,
- DOT11_CIPHER_ALGO_IHV_END = 0xffffffff
-};
-
-struct WLAN_AVAILABLE_NETWORK {
- WCHAR strProfileName[WLAN_MAX_NAME_LENGTH];
- DOT11_SSID dot11Ssid;
- DOT11_BSS_TYPE dot11BssType;
- ULONG uNumberOfBssids;
- BOOL bNetworkConnectable;
- DWORD wlanNotConnectableReason;
- ULONG uNumberOfPhyTypes;
- DOT11_PHY_TYPE dot11PhyTypes[WLAN_MAX_PHY_TYPE_NUMBER];
- BOOL bMorePhyTypes;
- ULONG wlanSignalQuality;
- BOOL bSecurityEnabled;
- DOT11_AUTH_ALGORITHM dot11DefaultAuthAlgorithm;
- DOT11_CIPHER_ALGORITHM dot11DefaultCipherAlgorithm;
- DWORD dwFlags;
- DWORD dwReserved;
-};
-
-struct WLAN_AVAILABLE_NETWORK_LIST {
- DWORD dwNumberOfItems;
- DWORD dwIndex;
- WLAN_AVAILABLE_NETWORK Network[1];
-};
-
-enum WLAN_INTF_OPCODE {
- wlan_intf_opcode_autoconf_start = 0x000000000,
- wlan_intf_opcode_autoconf_enabled,
- wlan_intf_opcode_background_scan_enabled,
- wlan_intf_opcode_media_streaming_mode,
- wlan_intf_opcode_radio_state,
- wlan_intf_opcode_bss_type,
- wlan_intf_opcode_interface_state,
- wlan_intf_opcode_current_connection,
- wlan_intf_opcode_channel_number,
- wlan_intf_opcode_supported_infrastructure_auth_cipher_pairs,
- wlan_intf_opcode_supported_adhoc_auth_cipher_pairs,
- wlan_intf_opcode_supported_country_or_region_string_list,
- wlan_intf_opcode_current_operation_mode,
- wlan_intf_opcode_supported_safe_mode,
- wlan_intf_opcode_certified_safe_mode,
- wlan_intf_opcode_autoconf_end = 0x0fffffff,
- wlan_intf_opcode_msm_start = 0x10000100,
- wlan_intf_opcode_statistics,
- wlan_intf_opcode_rssi,
- wlan_intf_opcode_msm_end = 0x1fffffff,
- wlan_intf_opcode_security_start = 0x20010000,
- wlan_intf_opcode_security_end = 0x2fffffff,
- wlan_intf_opcode_ihv_start = 0x30000000,
- wlan_intf_opcode_ihv_end = 0x3fffffff
-};
-
-enum WLAN_OPCODE_VALUE_TYPE {
- wlan_opcode_value_type_query_only = 0,
- wlan_opcode_value_type_set_by_group_policy,
- wlan_opcode_value_type_set_by_user,
- wlan_opcode_value_type_invalid
-};
-
-enum WLAN_CONNECTION_MODE {
- wlan_connection_mode_profile = 0,
- wlan_connection_mode_temporary_profile,
- wlan_connection_mode_discovery_secure,
- wlan_connection_mode_discovery_unsecure,
- wlan_connection_mode_auto,
- wlan_connection_mode_invalid
-};
-
-struct WLAN_CONNECTION_PARAMETERS {
- WLAN_CONNECTION_MODE wlanConnectionMode;
- LPCWSTR strProfile;
- DOT11_SSID *pDot11Ssid;
- DOT11_BSSID_LIST *pDesiredBssidList;
- DOT11_BSS_TYPE dot11BssType;
- DWORD dwFlags;
-};
-
-struct WLAN_RAW_DATA {
- DWORD dwDataSize;
- BYTE DataBlob[1];
-};
-
-enum WLAN_NOTIFICATION_ACM {
- wlan_notification_acm_start = 0,
- wlan_notification_acm_autoconf_enabled,
- wlan_notification_acm_autoconf_disabled,
- wlan_notification_acm_background_scan_enabled,
- wlan_notification_acm_background_scan_disabled,
- wlan_notification_acm_bss_type_change,
- wlan_notification_acm_power_setting_change,
- wlan_notification_acm_scan_complete,
- wlan_notification_acm_scan_fail,
- wlan_notification_acm_connection_start,
- wlan_notification_acm_connection_complete,
- wlan_notification_acm_connection_attempt_fail,
- wlan_notification_acm_filter_list_change,
- wlan_notification_acm_interface_arrival,
- wlan_notification_acm_interface_removal,
- wlan_notification_acm_profile_change,
- wlan_notification_acm_profile_name_change,
- wlan_notification_acm_profiles_exhausted,
- wlan_notification_acm_network_not_available,
- wlan_notification_acm_network_available,
- wlan_notification_acm_disconnecting,
- wlan_notification_acm_disconnected,
- wlan_notification_acm_adhoc_network_state_change,
- wlan_notification_acm_end
-};
-
-struct WLAN_ASSOCIATION_ATTRIBUTES {
- DOT11_SSID dot11Ssid;
- DOT11_BSS_TYPE dot11BssType;
- DOT11_MAC_ADDRESS dot11Bssid;
- DOT11_PHY_TYPE dot11PhyType;
- ULONG uDot11PhyIndex;
- ULONG wlanSignalQuality;
- ULONG ulRxRate;
- ULONG ulTxRate;
-};
-
-struct WLAN_SECURITY_ATTRIBUTES {
- BOOL bSecurityEnabled;
- BOOL bOneXEnabled;
- DOT11_AUTH_ALGORITHM dot11AuthAlgorithm;
- DOT11_CIPHER_ALGORITHM dot11CipherAlgorithm;
-};
-
-struct WLAN_CONNECTION_ATTRIBUTES {
- WLAN_INTERFACE_STATE isState;
- WLAN_CONNECTION_MODE wlanConnectionMode;
- WCHAR strProfileName[WLAN_MAX_NAME_LENGTH];
- WLAN_ASSOCIATION_ATTRIBUTES wlanAssociationAttributes;
- WLAN_SECURITY_ATTRIBUTES wlanSecurityAttributes;
-};
-
-typedef void (WINAPI *WLAN_NOTIFICATION_CALLBACK)(WLAN_NOTIFICATION_DATA *, PVOID);
-
-typedef DWORD (WINAPI *WlanOpenHandleProto)
- (DWORD dwClientVersion, PVOID pReserved, PDWORD pdwNegotiatedVersion, PHANDLE phClientHandle);
-typedef DWORD (WINAPI *WlanRegisterNotificationProto)
- (HANDLE hClientHandle, DWORD dwNotifSource, BOOL bIgnoreDuplicate,
- WLAN_NOTIFICATION_CALLBACK funcCallback, PVOID pCallbackContext,
- PVOID pReserved, PDWORD pdwPrevNotifSource);
-typedef DWORD (WINAPI *WlanEnumInterfacesProto)
- (HANDLE hClientHandle, PVOID pReserved, WLAN_INTERFACE_INFO_LIST **ppInterfaceList);
-typedef DWORD (WINAPI *WlanGetAvailableNetworkListProto)
- (HANDLE hClientHandle, const GUID* pInterfaceGuid, DWORD dwFlags, PVOID pReserved,
- WLAN_AVAILABLE_NETWORK_LIST **ppAvailableNetworkList);
-typedef DWORD (WINAPI *WlanQueryInterfaceProto)
- (HANDLE hClientHandle, const GUID *pInterfaceGuid, WLAN_INTF_OPCODE OpCode, PVOID pReserved,
- PDWORD pdwDataSize, PVOID *ppData, WLAN_OPCODE_VALUE_TYPE *pWlanOpcodeValueType);
-typedef DWORD (WINAPI *WlanConnectProto)
- (HANDLE hClientHandle, const GUID *pInterfaceGuid,
- const WLAN_CONNECTION_PARAMETERS *pConnectionParameters, PVOID pReserved);
-typedef DWORD (WINAPI *WlanDisconnectProto)
- (HANDLE hClientHandle, const GUID *pInterfaceGuid, PVOID pReserved);
-typedef DWORD (WINAPI *WlanScanProto)
- (HANDLE hClientHandle, const GUID *pInterfaceGuid, const DOT11_SSID *pDot11Ssid,
- const WLAN_RAW_DATA *pIeData, PVOID pReserved);
-typedef VOID (WINAPI *WlanFreeMemoryProto)(PVOID pMemory);
-typedef DWORD (WINAPI *WlanCloseHandleProto)(HANDLE hClientHandle, PVOID pReserved);
-
-extern WlanOpenHandleProto local_WlanOpenHandle;
-extern WlanRegisterNotificationProto local_WlanRegisterNotification;
-extern WlanEnumInterfacesProto local_WlanEnumInterfaces;
-extern WlanGetAvailableNetworkListProto local_WlanGetAvailableNetworkList;
-extern WlanQueryInterfaceProto local_WlanQueryInterface;
-extern WlanConnectProto local_WlanConnect;
-extern WlanDisconnectProto local_WlanDisconnect;
-extern WlanScanProto local_WlanScan;
-extern WlanFreeMemoryProto local_WlanFreeMemory;
-extern WlanCloseHandleProto local_WlanCloseHandle;
-
-QT_END_NAMESPACE
-
-#endif // PLATFORMDEFS_H
diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
deleted file mode 100644
index 777b4eea59..0000000000
--- a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
+++ /dev/null
@@ -1,622 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qnativewifiengine.h"
-#include "platformdefs.h"
-#include "../qnetworksession_impl.h"
-
-#include <QtNetwork/private/qnetworkconfiguration_p.h>
-
-#include <QtCore/qstringlist.h>
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qoperatingsystemversion.h>
-
-#include <QtCore/qdebug.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-WlanOpenHandleProto local_WlanOpenHandle = 0;
-WlanRegisterNotificationProto local_WlanRegisterNotification = 0;
-WlanEnumInterfacesProto local_WlanEnumInterfaces = 0;
-WlanGetAvailableNetworkListProto local_WlanGetAvailableNetworkList = 0;
-WlanQueryInterfaceProto local_WlanQueryInterface = 0;
-WlanConnectProto local_WlanConnect = 0;
-WlanDisconnectProto local_WlanDisconnect = 0;
-WlanScanProto local_WlanScan = 0;
-WlanFreeMemoryProto local_WlanFreeMemory = 0;
-WlanCloseHandleProto local_WlanCloseHandle = 0;
-
-void qNotificationCallback(WLAN_NOTIFICATION_DATA *data, QNativeWifiEngine *d)
-{
- Q_UNUSED(d);
-
- if (data->NotificationSource == WLAN_NOTIFICATION_SOURCE_ACM) {
- switch (data->NotificationCode) {
- case wlan_notification_acm_connection_complete:
- case wlan_notification_acm_disconnected:
- case wlan_notification_acm_scan_complete:
- case wlan_notification_acm_scan_fail:
- QMetaObject::invokeMethod(d, "scanComplete", Qt::QueuedConnection);
- break;
- default:
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "wlan acm notification" << (int)data->NotificationCode;
-#endif
- break;
- }
- } else {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "wlan notification source" << (int)data->NotificationSource << "code" << (int)data->NotificationCode;
-#endif
- }
-}
-
-QNativeWifiEngine::QNativeWifiEngine(QObject *parent)
-: QBearerEngineImpl(parent), handle(INVALID_HANDLE_VALUE)
-{
- connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(closeHandle()));
-}
-
-QNativeWifiEngine::~QNativeWifiEngine()
-{
- closeHandle();
-}
-
-void QNativeWifiEngine::scanComplete()
-{
- QMutexLocker locker(&mutex);
-
- if (!available()) {
- locker.unlock();
- emit updateCompleted();
- return;
- }
-
- // enumerate interfaces
- WLAN_INTERFACE_INFO_LIST *interfaceList;
- DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result);
-#endif
-
- locker.unlock();
- emit updateCompleted();
-
- return;
- }
-
- QStringList previous = accessPointConfigurations.keys();
-
- for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
- const WLAN_INTERFACE_INFO &interface = interfaceList->InterfaceInfo[i];
-
- WLAN_AVAILABLE_NETWORK_LIST *networkList;
- result = local_WlanGetAvailableNetworkList(handle, &interface.InterfaceGuid,
- 3, 0, &networkList);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: WlanGetAvailableNetworkList failed with error %ld\n",
- __FUNCTION__, result);
-#endif
- continue;
- }
-
- QStringList seenNetworks;
-
- for (unsigned int j = 0; j < networkList->dwNumberOfItems; ++j) {
- WLAN_AVAILABLE_NETWORK &network = networkList->Network[j];
-
- QString networkName;
-
- if (network.strProfileName[0] != 0) {
- networkName = QString::fromWCharArray(network.strProfileName);
- } else {
- networkName = QByteArray(reinterpret_cast<char *>(network.dot11Ssid.ucSSID),
- network.dot11Ssid.uSSIDLength);
- }
-
- const QString id = QString::number(qHash(QLatin1String("WLAN:") + networkName));
-
- previous.removeAll(id);
-
- QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
-
- if (!(network.dwFlags & WLAN_AVAILABLE_NETWORK_HAS_PROFILE))
- state = QNetworkConfiguration::Undefined;
-
- if (network.strProfileName[0] != 0) {
- if (network.bNetworkConnectable) {
- if (network.dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED)
- state = QNetworkConfiguration::Active;
- else
- state = QNetworkConfiguration::Discovered;
- } else {
- state = QNetworkConfiguration::Defined;
- }
- }
-
- if (seenNetworks.contains(networkName))
- continue;
- else
- seenNetworks.append(networkName);
-
- if (accessPointConfigurations.contains(id)) {
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- bool changed = false;
-
- ptr->mutex.lock();
-
- if (!ptr->isValid) {
- ptr->isValid = true;
- changed = true;
- }
-
- if (ptr->name != networkName) {
- ptr->name = networkName;
- changed = true;
- }
-
- if (ptr->state != state) {
- ptr->state = state;
- changed = true;
- }
-
- ptr->mutex.unlock();
-
- if (changed) {
- locker.unlock();
- emit configurationChanged(ptr);
- locker.relock();
- }
- } else {
- QNetworkConfigurationPrivatePointer ptr(new QNetworkConfigurationPrivate);
-
- ptr->name = networkName;
- ptr->isValid = true;
- ptr->id = id;
- ptr->state = state;
- ptr->type = QNetworkConfiguration::InternetAccessPoint;
- ptr->bearerType = QNetworkConfiguration::BearerWLAN;
-
- accessPointConfigurations.insert(id, ptr);
-
- locker.unlock();
- emit configurationAdded(ptr);
- locker.relock();
- }
- }
-
- local_WlanFreeMemory(networkList);
- }
-
- local_WlanFreeMemory(interfaceList);
-
- while (!previous.isEmpty()) {
- QNetworkConfigurationPrivatePointer ptr =
- accessPointConfigurations.take(previous.takeFirst());
-
- locker.unlock();
- emit configurationRemoved(ptr);
- locker.relock();
- }
-
- locker.unlock();
- emit updateCompleted();
-}
-
-QString QNativeWifiEngine::getInterfaceFromId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- if (!available())
- return QString();
-
- // enumerate interfaces
- WLAN_INTERFACE_INFO_LIST *interfaceList;
- DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result);
-#endif
- return QString();
- }
-
- for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
- const WLAN_INTERFACE_INFO &interface = interfaceList->InterfaceInfo[i];
-
- DWORD dataSize;
- WLAN_CONNECTION_ATTRIBUTES *connectionAttributes;
- result = local_WlanQueryInterface(handle, &interface.InterfaceGuid,
- wlan_intf_opcode_current_connection, 0, &dataSize,
- reinterpret_cast<PVOID *>(&connectionAttributes), 0);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- if (result != ERROR_INVALID_STATE)
- qDebug("%s: WlanQueryInterface failed with error %ld\n", __FUNCTION__, result);
-#endif
-
- continue;
- }
-
- if (qHash(QLatin1String("WLAN:") +
- QString::fromWCharArray(connectionAttributes->strProfileName)) == id.toUInt()) {
- QString guid("{%1-%2-%3-%4%5-%6%7%8%9%10%11}");
-
- guid = guid.arg(interface.InterfaceGuid.Data1, 8, 16, QChar('0'));
- guid = guid.arg(interface.InterfaceGuid.Data2, 4, 16, QChar('0'));
- guid = guid.arg(interface.InterfaceGuid.Data3, 4, 16, QChar('0'));
- for (int i = 0; i < 8; ++i)
- guid = guid.arg(interface.InterfaceGuid.Data4[i], 2, 16, QChar('0'));
-
- local_WlanFreeMemory(connectionAttributes);
- local_WlanFreeMemory(interfaceList);
-
- return guid.toUpper();
- }
-
- local_WlanFreeMemory(connectionAttributes);
- }
-
- local_WlanFreeMemory(interfaceList);
-
- return QString();
-}
-
-bool QNativeWifiEngine::hasIdentifier(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- if (!available())
- return false;
-
- // enumerate interfaces
- WLAN_INTERFACE_INFO_LIST *interfaceList;
- DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result);
-#endif
- return false;
- }
-
- for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
- const WLAN_INTERFACE_INFO &interface = interfaceList->InterfaceInfo[i];
-
- WLAN_AVAILABLE_NETWORK_LIST *networkList;
- result = local_WlanGetAvailableNetworkList(handle, &interface.InterfaceGuid,
- 3, 0, &networkList);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: WlanGetAvailableNetworkList failed with error %ld\n",
- __FUNCTION__, result);
-#endif
- continue;
- }
-
- for (unsigned int j = 0; j < networkList->dwNumberOfItems; ++j) {
- WLAN_AVAILABLE_NETWORK &network = networkList->Network[j];
-
- QString networkName;
-
- if (network.strProfileName[0] != 0) {
- networkName = QString::fromWCharArray(network.strProfileName);
- } else {
- networkName = QByteArray(reinterpret_cast<char *>(network.dot11Ssid.ucSSID),
- network.dot11Ssid.uSSIDLength);
- }
-
- if (qHash(QLatin1String("WLAN:") + networkName) == id.toUInt()) {
- local_WlanFreeMemory(networkList);
- local_WlanFreeMemory(interfaceList);
- return true;
- }
- }
-
- local_WlanFreeMemory(networkList);
- }
-
- local_WlanFreeMemory(interfaceList);
-
- return false;
-}
-
-void QNativeWifiEngine::connectToId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- if (!available()) {
- locker.unlock();
- emit connectionError(id, InterfaceLookupError);
- return;
- }
-
- WLAN_INTERFACE_INFO_LIST *interfaceList;
- DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result);
-#endif
- locker.unlock();
- emit connectionError(id, InterfaceLookupError);
- return;
- }
-
- QString profile;
-
- for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
- const WLAN_INTERFACE_INFO &interface = interfaceList->InterfaceInfo[i];
-
- WLAN_AVAILABLE_NETWORK_LIST *networkList;
- result = local_WlanGetAvailableNetworkList(handle, &interface.InterfaceGuid,
- 3, 0, &networkList);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: WlanGetAvailableNetworkList failed with error %ld\n",
- __FUNCTION__, result);
-#endif
- continue;
- }
-
- for (unsigned int j = 0; j < networkList->dwNumberOfItems; ++j) {
- WLAN_AVAILABLE_NETWORK &network = networkList->Network[j];
-
- profile = QString::fromWCharArray(network.strProfileName);
-
- if (qHash(QLatin1String("WLAN:") + profile) == id.toUInt())
- break;
- else
- profile.clear();
- }
-
- local_WlanFreeMemory(networkList);
-
- if (!profile.isEmpty()) {
- WLAN_CONNECTION_PARAMETERS parameters;
- parameters.wlanConnectionMode = wlan_connection_mode_profile;
- parameters.strProfile = reinterpret_cast<LPCWSTR>(profile.utf16());
- parameters.pDot11Ssid = 0;
- parameters.pDesiredBssidList = 0;
- parameters.dot11BssType = dot11_BSS_type_any;
- parameters.dwFlags = 0;
-
- DWORD result = local_WlanConnect(handle, &interface.InterfaceGuid, &parameters, 0);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: WlanConnect failed with error %ld\n", __FUNCTION__, result);
-#endif
- locker.unlock();
- emit connectionError(id, ConnectError);
- locker.relock();
- break;
- }
-
- break;
- }
- }
-
- local_WlanFreeMemory(interfaceList);
-
- if (profile.isEmpty()) {
- locker.unlock();
- emit connectionError(id, InterfaceLookupError);
- }
-}
-
-void QNativeWifiEngine::disconnectFromId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- if (!available()) {
- locker.unlock();
- emit connectionError(id, InterfaceLookupError);
- return;
- }
-
- QString interface = getInterfaceFromId(id);
-
- if (interface.isEmpty()) {
- locker.unlock();
- emit connectionError(id, InterfaceLookupError);
- return;
- }
-
- const QVector<QStringRef> split = interface.midRef(1, interface.length() - 2).split(QLatin1Char('-'));
-
- GUID guid;
- guid.Data1 = split.at(0).toUInt(0, 16);
- guid.Data2 = split.at(1).toUShort(0, 16);
- guid.Data3 = split.at(2).toUShort(0, 16);
- guid.Data4[0] = split.at(3).left(2).toUShort(0, 16);
- guid.Data4[1] = split.at(3).right(2).toUShort(0, 16);
- for (int i = 0; i < 6; ++i)
- guid.Data4[i + 2] = split.at(4).mid(i*2, 2).toUShort(0, 16);
-
- DWORD result = local_WlanDisconnect(handle, &guid, 0);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: WlanDisconnect failed with error %ld\n", __FUNCTION__, result);
-#endif
- locker.unlock();
- emit connectionError(id, DisconnectionError);
- return;
- }
-}
-
-void QNativeWifiEngine::initialize()
-{
- scanComplete();
-}
-
-void QNativeWifiEngine::requestUpdate()
-{
- QMutexLocker locker(&mutex);
-
- if (!available()) {
- locker.unlock();
- emit updateCompleted();
- return;
- }
-
- // enumerate interfaces
- WLAN_INTERFACE_INFO_LIST *interfaceList;
- DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result);
-#endif
-
- locker.unlock();
- emit updateCompleted();
-
- return;
- }
-
- bool requested = false;
- for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
- result = local_WlanScan(handle, &interfaceList->InterfaceInfo[i].InterfaceGuid, 0, 0, 0);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: WlanScan failed with error %ld\n", __FUNCTION__, result);
-#endif
- } else {
- requested = true;
- }
- }
-
- local_WlanFreeMemory(interfaceList);
-
- if (!requested) {
- locker.unlock();
- emit updateCompleted();
- }
-}
-
-QNetworkSession::State QNativeWifiEngine::sessionStateForId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- if (!ptr)
- return QNetworkSession::Invalid;
-
- if (!ptr->isValid) {
- return QNetworkSession::Invalid;
- } else if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- return QNetworkSession::Connected;
- } else if ((ptr->state & QNetworkConfiguration::Discovered) ==
- QNetworkConfiguration::Discovered) {
- return QNetworkSession::Disconnected;
- } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
- return QNetworkSession::NotAvailable;
- } else if ((ptr->state & QNetworkConfiguration::Undefined) ==
- QNetworkConfiguration::Undefined) {
- return QNetworkSession::NotAvailable;
- }
-
- return QNetworkSession::Invalid;
-}
-
-QNetworkConfigurationManager::Capabilities QNativeWifiEngine::capabilities() const
-{
- return QNetworkConfigurationManager::ForcedRoaming |
- QNetworkConfigurationManager::CanStartAndStopInterfaces;
-}
-
-QNetworkSessionPrivate *QNativeWifiEngine::createSessionBackend()
-{
- return new QNetworkSessionPrivateImpl;
-}
-
-QNetworkConfigurationPrivatePointer QNativeWifiEngine::defaultConfiguration()
-{
- return QNetworkConfigurationPrivatePointer();
-}
-
-bool QNativeWifiEngine::available()
-{
- if (handle != INVALID_HANDLE_VALUE)
- return true;
-
- DWORD clientVersion;
-
- DWORD result = local_WlanOpenHandle(1, 0, &clientVersion, &handle);
- if (result != ERROR_SUCCESS) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- if (result != ERROR_SERVICE_NOT_ACTIVE)
- qDebug("%s: WlanOpenHandle failed with error %ld\n", __FUNCTION__, result);
-#endif
-
- return false;
- }
-
- result = local_WlanRegisterNotification(handle, WLAN_NOTIFICATION_SOURCE_ALL, true,
- WLAN_NOTIFICATION_CALLBACK(qNotificationCallback),
- this, 0, 0);
-#ifdef BEARER_MANAGEMENT_DEBUG
- if (result != ERROR_SUCCESS)
- qDebug("%s: WlanRegisterNotification failed with error %ld\n", __FUNCTION__, result);
-#endif
-
- return handle != INVALID_HANDLE_VALUE;
-}
-
-void QNativeWifiEngine::closeHandle()
-{
- if (handle != INVALID_HANDLE_VALUE) {
- local_WlanCloseHandle(handle, 0);
- handle = INVALID_HANDLE_VALUE;
- }
-}
-
-bool QNativeWifiEngine::requiresPolling() const
-{
- // On Windows XP SP2 and SP3 only connection and disconnection notifications are available.
- // We need to poll for changes in available wireless networks.
- return QOperatingSystemVersion::current()
- <= QOperatingSystemVersion(QOperatingSystemVersion::Windows, 5, 2);
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.h b/src/plugins/bearer/nativewifi/qnativewifiengine.h
deleted file mode 100644
index ab8d949c9a..0000000000
--- a/src/plugins/bearer/nativewifi/qnativewifiengine.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNATIVEWIFIENGINE_P_H
-#define QNATIVEWIFIENGINE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "../qbearerengine_impl.h"
-
-#include <QtCore/qtimer.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkConfigurationPrivate;
-struct WLAN_NOTIFICATION_DATA;
-
-class QNativeWifiEngine : public QBearerEngineImpl
-{
- Q_OBJECT
-
-public:
- QNativeWifiEngine(QObject *parent = 0);
- ~QNativeWifiEngine();
-
- QString getInterfaceFromId(const QString &id);
- bool hasIdentifier(const QString &id);
-
- void connectToId(const QString &id);
- void disconnectFromId(const QString &id);
-
- Q_INVOKABLE void initialize();
- Q_INVOKABLE void requestUpdate();
-
- QNetworkSession::State sessionStateForId(const QString &id);
-
- QNetworkConfigurationManager::Capabilities capabilities() const;
-
- QNetworkSessionPrivate *createSessionBackend();
-
- QNetworkConfigurationPrivatePointer defaultConfiguration();
-
- bool available();
-
- bool requiresPolling() const;
-
-private Q_SLOTS:
- void scanComplete();
- void closeHandle();
-
-private:
- Qt::HANDLE handle;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
-
-#endif
diff --git a/src/plugins/bearer/networkmanager/main.cpp b/src/plugins/bearer/networkmanager/main.cpp
deleted file mode 100644
index 1773abe55b..0000000000
--- a/src/plugins/bearer/networkmanager/main.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qnetworkmanagerengine.h"
-
-#include <QtNetwork/private/qbearerplugin_p.h>
-
-#include <QtCore/qdebug.h>
-
-#ifndef QT_NO_DBUS
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkManagerEnginePlugin : public QBearerEnginePlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QBearerEngineFactoryInterface" FILE "networkmanager.json")
-
-public:
- QNetworkManagerEnginePlugin();
- ~QNetworkManagerEnginePlugin();
-
- QBearerEngine *create(const QString &key) const;
-};
-
-QNetworkManagerEnginePlugin::QNetworkManagerEnginePlugin()
-{
-}
-
-QNetworkManagerEnginePlugin::~QNetworkManagerEnginePlugin()
-{
-}
-
-QBearerEngine *QNetworkManagerEnginePlugin::create(const QString &key) const
-{
- if (key == QLatin1String("networkmanager")) {
- QNetworkManagerEngine *engine = new QNetworkManagerEngine;
- return engine;
- }
-
- return 0;
-}
-
-QT_END_NAMESPACE
-
-#include "main.moc"
-
-#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/networkmanager/networkmanager.json b/src/plugins/bearer/networkmanager/networkmanager.json
deleted file mode 100644
index 3d408d5c20..0000000000
--- a/src/plugins/bearer/networkmanager/networkmanager.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "networkmanager" ]
-}
diff --git a/src/plugins/bearer/networkmanager/networkmanager.pro b/src/plugins/bearer/networkmanager/networkmanager.pro
deleted file mode 100644
index e71c93f66f..0000000000
--- a/src/plugins/bearer/networkmanager/networkmanager.pro
+++ /dev/null
@@ -1,21 +0,0 @@
-TARGET = qnmbearer
-
-QT = core network-private dbus
-
-HEADERS += qnetworkmanagerservice.h \
- qnetworkmanagerengine.h \
- ../linux_common/qofonoservice_linux_p.h \
- ../qnetworksession_impl.h \
- ../qbearerengine_impl.h
-
-SOURCES += main.cpp \
- qnetworkmanagerservice.cpp \
- qnetworkmanagerengine.cpp \
- ../linux_common/qofonoservice_linux.cpp \
- ../qnetworksession_impl.cpp
-
-OTHER_FILES += networkmanager.json
-
-PLUGIN_TYPE = bearer
-PLUGIN_CLASS_NAME = QNetworkManagerEnginePlugin
-load(qt_plugin)
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
deleted file mode 100644
index 85a9f9b9e0..0000000000
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
+++ /dev/null
@@ -1,936 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qnetworkmanagerengine.h"
-#include "qnetworkmanagerservice.h"
-#include "../qnetworksession_impl.h"
-
-#include <QtNetwork/private/qnetworkconfiguration_p.h>
-
-#include <QtNetwork/qnetworksession.h>
-
-#include <QtCore/qdebug.h>
-
-#include <QtDBus>
-#include <QDBusConnection>
-#include <QDBusError>
-#include <QDBusInterface>
-#include <QDBusMessage>
-#include <QDBusReply>
-#include "../linux_common/qofonoservice_linux_p.h"
-
-#ifndef QT_NO_DBUS
-
-QT_BEGIN_NAMESPACE
-
-QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent)
-: QBearerEngineImpl(parent),
- managerInterface(NULL),
- systemSettings(NULL),
- ofonoManager(NULL),
- nmAvailable(false)
-{
- qDBusRegisterMetaType<QNmSettingsMap>();
-
- nmWatcher = new QDBusServiceWatcher(NM_DBUS_SERVICE,QDBusConnection::systemBus(),
- QDBusServiceWatcher::WatchForRegistration |
- QDBusServiceWatcher::WatchForUnregistration, this);
- connect(nmWatcher, SIGNAL(serviceRegistered(QString)),
- this, SLOT(nmRegistered(QString)));
- connect(nmWatcher, SIGNAL(serviceUnregistered(QString)),
- this, SLOT(nmUnRegistered(QString)));
-
- ofonoWatcher = new QDBusServiceWatcher("org.ofono",QDBusConnection::systemBus(),
- QDBusServiceWatcher::WatchForRegistration |
- QDBusServiceWatcher::WatchForUnregistration, this);
- connect(ofonoWatcher, SIGNAL(serviceRegistered(QString)),
- this, SLOT(ofonoRegistered(QString)));
- connect(ofonoWatcher, SIGNAL(serviceUnregistered(QString)),
- this, SLOT(ofonoUnRegistered(QString)));
-
- QDBusConnectionInterface *interface = QDBusConnection::systemBus().interface();
-
- if (!interface) return;
-
- if (interface->isServiceRegistered("org.ofono"))
- QMetaObject::invokeMethod(this, "ofonoRegistered", Qt::QueuedConnection);
-
- if (interface->isServiceRegistered(NM_DBUS_SERVICE))
- QMetaObject::invokeMethod(this, "nmRegistered", Qt::QueuedConnection);
-}
-
-QNetworkManagerEngine::~QNetworkManagerEngine()
-{
- qDeleteAll(connections);
- connections.clear();
- qDeleteAll(accessPoints);
- accessPoints.clear();
- qDeleteAll(wirelessDevices);
- wirelessDevices.clear();
- qDeleteAll(activeConnectionsList);
- activeConnectionsList.clear();
- qDeleteAll(interfaceDevices);
- interfaceDevices.clear();
-
- connectionInterfaces.clear();
-
- qDeleteAll(ofonoContextManagers);
- ofonoContextManagers.clear();
-
- qDeleteAll(wiredDevices);
- wiredDevices.clear();
-}
-
-void QNetworkManagerEngine::initialize()
-{
- if (nmAvailable)
- setupConfigurations();
-}
-
-void QNetworkManagerEngine::setupConfigurations()
-{
- QMutexLocker locker(&mutex);
- // Get active connections.
- const auto acPaths = managerInterface->activeConnections();
- for (const QDBusObjectPath &acPath : acPaths) {
-
- if (activeConnectionsList.contains(acPath.path()))
- continue;
-
- QNetworkManagerConnectionActive *activeConnection =
- new QNetworkManagerConnectionActive(acPath.path(),this);
- activeConnectionsList.insert(acPath.path(), activeConnection);
- connect(activeConnection, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
- this, SLOT(activeConnectionPropertiesChanged(QMap<QString,QVariant>)));
-
- QStringList devices = activeConnection->devices();
- if (!devices.isEmpty()) {
- QNetworkManagerInterfaceDevice device(devices.at(0),this);
- connectionInterfaces.insert(activeConnection->connection().path(),device.networkInterface());
- }
- }
-
- // Get connections.
- const auto settingsPaths = systemSettings->listConnections();
- for (const QDBusObjectPath &settingsPath : settingsPaths) {
- locker.unlock();
- if (!hasIdentifier(settingsPath.path()))
- newConnection(settingsPath, systemSettings); //add system connection configs
- locker.relock();
- }
-
- Q_EMIT updateCompleted();
-}
-
-bool QNetworkManagerEngine::networkManagerAvailable() const
-{
- return nmAvailable;
-}
-
-QString QNetworkManagerEngine::getInterfaceFromId(const QString &settingsPath)
-{
- return connectionInterfaces.value(settingsPath);
-}
-
-bool QNetworkManagerEngine::hasIdentifier(const QString &id)
-{
- QMutexLocker locker(&mutex);
- return accessPointConfigurations.contains(id);
-}
-
-void QNetworkManagerEngine::connectToId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- QNetworkManagerSettingsConnection *connection = connectionFromId(id);
-
- if (!connection)
- return;
-
- NMDeviceType connectionType = connection->getType();
-
- QString dbusDevicePath;
- const QString settingsPath = connection->path();
- QString specificPath = configuredAccessPoints.key(settingsPath);
-
- if (isConnectionActive(settingsPath))
- return;
-
- for (auto i = interfaceDevices.cbegin(), end = interfaceDevices.cend(); i != end; ++i) {
- const auto type = i.value()->deviceType();
- if (type == DEVICE_TYPE_ETHERNET || type == DEVICE_TYPE_WIFI || type == DEVICE_TYPE_MODEM) {
- if (type == connectionType) {
- dbusDevicePath = i.key();
- break;
- }
- }
- }
-
- if (specificPath.isEmpty())
- specificPath = "/";
-
- managerInterface->activateConnection(QDBusObjectPath(settingsPath),
- QDBusObjectPath(dbusDevicePath), QDBusObjectPath(specificPath));
-}
-
-void QNetworkManagerEngine::disconnectFromId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- QNetworkManagerSettingsConnection *connection = connectionFromId(id);
-
- if (!connection)
- return;
-
- QNmSettingsMap map = connection->getSettings();
- bool connectionAutoconnect = map.value("connection").value("autoconnect",true).toBool(); //if not present is true !!
- if (connectionAutoconnect) { //autoconnect connections will simply be reconnected by nm
- emit connectionError(id, QBearerEngineImpl::OperationNotSupported);
- return;
- }
-
- for (auto i = activeConnectionsList.cbegin(), end = activeConnectionsList.cend(); i != end; ++i) {
- if (id == i.value()->connection().path() && accessPointConfigurations.contains(id)) {
- managerInterface->deactivateConnection(QDBusObjectPath(i.key()));
- break;
- }
- }
-}
-
-void QNetworkManagerEngine::requestUpdate()
-{
- if (managerInterface && managerInterface->wirelessEnabled()) {
- for (auto *wirelessDevice : qAsConst(wirelessDevices))
- wirelessDevice->requestScan();
- }
- QMetaObject::invokeMethod(this, "updateCompleted", Qt::QueuedConnection);
-}
-
-void QNetworkManagerEngine::interfacePropertiesChanged(const QMap<QString, QVariant> &properties)
-{
- QMutexLocker locker(&mutex);
-
- for (auto i = properties.cbegin(), end = properties.cend(); i != end; ++i) {
- if (i.key() == QLatin1String("ActiveConnections")) {
- // Active connections changed, update configurations.
-
- const auto activeConnections = qdbus_cast<QList<QDBusObjectPath> >(qvariant_cast<QDBusArgument>(i.value()));
-
- QStringList identifiers = accessPointConfigurations.keys();
- QStringList priorActiveConnections = activeConnectionsList.keys();
-
- for (const QDBusObjectPath &acPath : activeConnections) {
- priorActiveConnections.removeOne(acPath.path());
- QNetworkManagerConnectionActive *activeConnection =
- activeConnectionsList.value(acPath.path());
-
- if (!activeConnection) {
- activeConnection = new QNetworkManagerConnectionActive(acPath.path(),this);
- activeConnectionsList.insert(acPath.path(), activeConnection);
-
- connect(activeConnection, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
- this, SLOT(activeConnectionPropertiesChanged(QMap<QString,QVariant>)));
- }
-
- const QString id = activeConnection->connection().path();
-
- identifiers.removeOne(id);
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
- if (ptr) {
- ptr->mutex.lock();
- if (activeConnection->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED &&
- (ptr->state & QNetworkConfiguration::Active) != QNetworkConfiguration::Active) {
-
- ptr->state |= QNetworkConfiguration::Active;
-
- if (activeConnectionsList.value(id) && activeConnectionsList.value(id)->defaultRoute()
- && managerInterface->state() < QNetworkManagerInterface::NM_STATE_CONNECTED_GLOBAL) {
- ptr->purpose = QNetworkConfiguration::PrivatePurpose;
- }
- ptr->mutex.unlock();
-
- locker.unlock();
- emit configurationChanged(ptr);
- locker.relock();
- } else {
- ptr->mutex.unlock();
- }
- }
- }
-
- while (!priorActiveConnections.isEmpty())
- delete activeConnectionsList.take(priorActiveConnections.takeFirst());
-
- while (!identifiers.isEmpty()) {
- QNetworkConfigurationPrivatePointer ptr =
- accessPointConfigurations.value(identifiers.takeFirst());
-
- ptr->mutex.lock();
- if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
- ptr->state = (flag | QNetworkConfiguration::Discovered);
- ptr->mutex.unlock();
-
- locker.unlock();
- emit configurationChanged(ptr);
- locker.relock();
- } else {
- ptr->mutex.unlock();
- }
- }
- }
- }
-}
-
-void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QMap<QString, QVariant> &properties)
-{
- QMutexLocker locker(&mutex);
-
- Q_UNUSED(properties)
-
- QNetworkManagerConnectionActive *activeConnection = qobject_cast<QNetworkManagerConnectionActive *>(sender());
-
- if (!activeConnection)
- return;
-
- const QString id = activeConnection->connection().path();
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
- if (ptr) {
- if (properties.contains(QStringLiteral("State"))) {
- ptr->mutex.lock();
- if (properties.value("State").toUInt() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
- QStringList devices = activeConnection->devices();
- if (!devices.isEmpty()) {
- QNetworkManagerInterfaceDevice device(devices.at(0),this);
- connectionInterfaces.insert(id,device.networkInterface());
- }
-
- ptr->state |= QNetworkConfiguration::Active;
- ptr->mutex.unlock();
-
- locker.unlock();
- emit configurationChanged(ptr);
- locker.relock();
- } else {
- connectionInterfaces.remove(id);
- ptr->mutex.unlock();
- }
- }
- }
-}
-
-void QNetworkManagerEngine::deviceConnectionsChanged(const QStringList &connectionsList)
-{
- QMutexLocker locker(&mutex);
- for (int i = 0; i < connections.count(); ++i) {
- if (connectionsList.contains(connections.at(i)->path()))
- continue;
-
- const QString settingsPath = connections.at(i)->path();
-
- QNetworkConfigurationPrivatePointer ptr =
- accessPointConfigurations.value(settingsPath);
- ptr->mutex.lock();
- QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
- ptr->state = (flag | QNetworkConfiguration::Discovered);
- ptr->mutex.unlock();
-
- locker.unlock();
- emit configurationChanged(ptr);
- locker.relock();
- Q_EMIT updateCompleted();
- }
-}
-
-void QNetworkManagerEngine::wiredCarrierChanged(bool carrier)
-{
- QNetworkManagerInterfaceDeviceWired *deviceWired = qobject_cast<QNetworkManagerInterfaceDeviceWired *>(sender());
- if (!deviceWired)
- return;
- QMutexLocker locker(&mutex);
- const auto settingsPaths = systemSettings->listConnections();
- for (const QDBusObjectPath &settingsPath : settingsPaths) {
- for (int i = 0; i < connections.count(); ++i) {
- QNetworkManagerSettingsConnection *connection = connections.at(i);
- if (connection->getType() == DEVICE_TYPE_ETHERNET
- && settingsPath.path() == connection->path()) {
- QNetworkConfigurationPrivatePointer ptr =
- accessPointConfigurations.value(settingsPath.path());
-
- if (ptr) {
- ptr->mutex.lock();
- if (carrier)
- ptr->state |= QNetworkConfiguration::Discovered;
- else
- ptr->state = QNetworkConfiguration::Defined;
- ptr->mutex.unlock();
- locker.unlock();
- emit configurationChanged(ptr);
- return;
- }
- }
- }
- }
-}
-
-void QNetworkManagerEngine::newConnection(const QDBusObjectPath &path,
- QNetworkManagerSettings *settings)
-{
- QMutexLocker locker(&mutex);
- if (!settings)
- settings = qobject_cast<QNetworkManagerSettings *>(sender());
-
- if (!settings) {
- return;
- }
-
- QNetworkManagerSettingsConnection *connection =
- new QNetworkManagerSettingsConnection(settings->service(),
- path.path(),this);
- const QString settingsPath = connection->path();
- if (accessPointConfigurations.contains(settingsPath)) {
- return;
- }
-
- connections.append(connection);
-
- connect(connection,SIGNAL(removed(QString)),this,SLOT(removeConnection(QString)));
- connect(connection,SIGNAL(updated()),this,SLOT(updateConnection()));
- connection->setConnections();
-
- NMDeviceType deviceType = connection->getType();
-
- if (deviceType == DEVICE_TYPE_WIFI) {
- QString apPath;
- for (int i = 0; i < accessPoints.count(); ++i) {
- if (connection->getSsid() == accessPoints.at(i)->ssid()) {
- // remove the corresponding accesspoint from configurations
- apPath = accessPoints.at(i)->path();
- QNetworkConfigurationPrivatePointer ptr
- = accessPointConfigurations.take(apPath);
- if (ptr) {
- locker.unlock();
- emit configurationRemoved(ptr);
- locker.relock();
- }
- }
- }
- if (!configuredAccessPoints.contains(settingsPath))
- configuredAccessPoints.insert(apPath,settingsPath);
- }
-
- QNetworkConfigurationPrivate *cpPriv =
- parseConnection(settingsPath, connection->getSettings());
-
- // Check if connection is active.
- if (isConnectionActive(settingsPath))
- cpPriv->state |= QNetworkConfiguration::Active;
-
- if (deviceType == DEVICE_TYPE_ETHERNET) {
- for (auto interfaceDevice : qAsConst(interfaceDevices)) {
- if (interfaceDevice->deviceType() == deviceType) {
- auto *wiredDevice = wiredDevices.value(interfaceDevice->path());
- if (wiredDevice && wiredDevice->carrier()) {
- cpPriv->state |= QNetworkConfiguration::Discovered;
- }
- }
- }
- }
-
- QNetworkConfigurationPrivatePointer ptr(cpPriv);
- accessPointConfigurations.insert(ptr->id, ptr);
- locker.unlock();
- emit configurationAdded(ptr);
-}
-
-bool QNetworkManagerEngine::isConnectionActive(const QString &settingsPath) const
-{
- for (QNetworkManagerConnectionActive *activeConnection : activeConnectionsList) {
- if (activeConnection->connection().path() == settingsPath) {
- const auto state = activeConnection->state();
- if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATING
- || state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
- return true;
- } else {
- break;
- }
- }
- }
-
- QNetworkManagerSettingsConnection *settingsConnection = connectionFromId(settingsPath);
- if (settingsConnection && settingsConnection->getType() == DEVICE_TYPE_MODEM) {
- return isActiveContext(settingsConnection->path());
- }
-
- return false;
-}
-
-void QNetworkManagerEngine::removeConnection(const QString &path)
-{
- QMutexLocker locker(&mutex);
-
- QNetworkManagerSettingsConnection *connection =
- qobject_cast<QNetworkManagerSettingsConnection *>(sender());
-
- if (!connection)
- return;
-
- connection->deleteLater();
- connections.removeAll(connection);
-
- const QString id = path;
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(id);
-
- if (ptr) {
- locker.unlock();
- emit configurationRemoved(ptr);
- locker.relock();
- }
-
- // add base AP back into configurations
-
- // removed along with all AP props code...
-}
-
-void QNetworkManagerEngine::updateConnection()
-{
- QMutexLocker locker(&mutex);
-
- QNetworkManagerSettingsConnection *connection =
- qobject_cast<QNetworkManagerSettingsConnection *>(sender());
- if (!connection)
- return;
- const QString settingsPath = connection->path();
-
- QNetworkConfigurationPrivate *cpPriv = parseConnection(settingsPath, connection->getSettings());
-
- // Check if connection is active.
- const auto acPaths = managerInterface->activeConnections();
- for (const QDBusObjectPath &acPath : acPaths) {
- QNetworkManagerConnectionActive activeConnection(acPath.path());
-
- if (activeConnection.connection().path() == settingsPath &&
- activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
- cpPriv->state |= QNetworkConfiguration::Active;
- break;
- }
- }
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(cpPriv->id);
-
- ptr->mutex.lock();
-
- ptr->isValid = cpPriv->isValid;
- ptr->name = cpPriv->name;
- ptr->id = cpPriv->id;
- ptr->state = cpPriv->state;
-
- ptr->mutex.unlock();
-
- locker.unlock();
- emit configurationChanged(ptr);
- locker.relock();
- delete cpPriv;
-}
-
-void QNetworkManagerEngine::activationFinished(QDBusPendingCallWatcher *watcher)
-{
- QMutexLocker locker(&mutex);
- QDBusPendingReply<QDBusObjectPath> reply(*watcher);
- watcher->deleteLater();
-
- if (!reply.isError()) {
- QDBusObjectPath result = reply.value();
-
- QNetworkManagerConnectionActive activeConnection(result.path());
-
- const QString id = activeConnection.connection().path();
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
- if (ptr) {
- ptr->mutex.lock();
- if (activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED &&
- ptr->state != QNetworkConfiguration::Active) {
- ptr->state |= QNetworkConfiguration::Active;
- ptr->mutex.unlock();
-
- locker.unlock();
- emit configurationChanged(ptr);
- locker.relock();
- } else {
- ptr->mutex.unlock();
- }
- }
- }
-}
-
-QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QString &settingsPath,
- const QNmSettingsMap &map)
-{
- QMutexLocker locker(&mutex);
- QNetworkConfigurationPrivate *cpPriv = new QNetworkConfigurationPrivate;
- cpPriv->name = map.value("connection").value("id").toString();
- cpPriv->isValid = true;
- cpPriv->id = settingsPath;
- cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
-
- cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
-
- cpPriv->state = QNetworkConfiguration::Defined;
- const QString connectionType = map.value("connection").value("type").toString();
-
- if (connectionType == QLatin1String("802-3-ethernet")) {
- cpPriv->bearerType = QNetworkConfiguration::BearerEthernet;
-
- const auto devicePaths = managerInterface->getDevices();
- for (const QDBusObjectPath &devicePath : devicePaths) {
- QNetworkManagerInterfaceDevice device(devicePath.path(),this);
- if (device.deviceType() == DEVICE_TYPE_ETHERNET) {
- QNetworkManagerInterfaceDeviceWired *wiredDevice = wiredDevices.value(device.path());
- if (wiredDevice && wiredDevice->carrier()) {
- cpPriv->state |= QNetworkConfiguration::Discovered;
- break;
- }
- }
- }
- } else if (connectionType == QLatin1String("802-11-wireless")) {
- cpPriv->bearerType = QNetworkConfiguration::BearerWLAN;
-
- const QString connectionSsid = map.value("802-11-wireless").value("ssid").toString();
- for (int i = 0; i < accessPoints.count(); ++i) {
- if (connectionSsid == accessPoints.at(i)->ssid()
- && map.value("802-11-wireless").value("seen-bssids").toStringList().contains(accessPoints.at(i)->hwAddress())) {
- cpPriv->state |= QNetworkConfiguration::Discovered;
- if (!configuredAccessPoints.contains(accessPoints.at(i)->path())) {
- configuredAccessPoints.insert(accessPoints.at(i)->path(),settingsPath);
-
- const QString accessPointId = accessPoints.at(i)->path();
- QNetworkConfigurationPrivatePointer ptr =
- accessPointConfigurations.take(accessPointId);
-
- if (ptr) {
- locker.unlock();
- emit configurationRemoved(ptr);
- locker.relock();
- }
- }
- break;
- }
- }
- } else if (connectionType == QLatin1String("gsm")) {
-
- const QString connectionPath = map.value("connection").value("id").toString();
- cpPriv->name = contextName(connectionPath);
- cpPriv->bearerType = currentBearerType(connectionPath);
-
- if (ofonoManager && ofonoManager->isValid()) {
- const QString contextPart = connectionPath.section('/', -1);
- for (auto i = ofonoContextManagers.cbegin(), end = ofonoContextManagers.cend(); i != end; ++i) {
- const QString path = i.key() + QLatin1Char('/') +contextPart;
- if (isActiveContext(path)) {
- cpPriv->state |= QNetworkConfiguration::Active;
- break;
- }
- }
- }
- }
-
- return cpPriv;
-}
-
-bool QNetworkManagerEngine::isActiveContext(const QString &contextPath) const
-{
- if (ofonoManager && ofonoManager->isValid()) {
- const QString contextPart = contextPath.section('/', -1);
- for (QOfonoDataConnectionManagerInterface *iface : ofonoContextManagers) {
- const PathPropertiesList list = iface->contextsWithProperties();
- for (int i = 0; i < list.size(); ++i) {
- if (list.at(i).path.path().contains(contextPart)) {
- return list.at(i).properties.value(QStringLiteral("Active")).toBool();
-
- }
- }
- }
- }
- return false;
-}
-
-QNetworkManagerSettingsConnection *QNetworkManagerEngine::connectionFromId(const QString &id) const
-{
- for (int i = 0; i < connections.count(); ++i) {
- QNetworkManagerSettingsConnection *connection = connections.at(i);
- if (id == connection->path())
- return connection;
- }
-
- return 0;
-}
-
-QNetworkSession::State QNetworkManagerEngine::sessionStateForId(const QString &id)
-{
- QMutexLocker locker(&mutex);
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- if (!ptr)
- return QNetworkSession::Invalid;
-
- if (!ptr->isValid)
- return QNetworkSession::Invalid;
-
- for (QNetworkManagerConnectionActive *activeConnection : qAsConst(activeConnectionsList)) {
- const QString identifier = activeConnection->connection().path();
-
- if (id == identifier) {
- switch (activeConnection->state()) {
- case 0:
- return QNetworkSession::Disconnected;
- case 1:
- return QNetworkSession::Connecting;
- case 2:
- return QNetworkSession::Connected;
- }
- }
- }
-
- if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered)
- return QNetworkSession::Disconnected;
- else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined)
- return QNetworkSession::NotAvailable;
- else if ((ptr->state & QNetworkConfiguration::Undefined) == QNetworkConfiguration::Undefined)
- return QNetworkSession::NotAvailable;
-
- return QNetworkSession::Invalid;
-}
-
-quint64 QNetworkManagerEngine::bytesWritten(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
- if (ptr && (ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- const QString networkInterface = connectionInterfaces.value(id);
- if (!networkInterface.isEmpty()) {
- const QString devFile = QLatin1String("/sys/class/net/") +
- networkInterface +
- QLatin1String("/statistics/tx_bytes");
-
- quint64 result = Q_UINT64_C(0);
-
- QFile tx(devFile);
- if (tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QTextStream in(&tx);
- in >> result;
- tx.close();
- }
-
- return result;
- }
- }
-
- return Q_UINT64_C(0);
-}
-
-quint64 QNetworkManagerEngine::bytesReceived(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
- if (ptr && (ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- const QString networkInterface = connectionInterfaces.value(id);
- if (!networkInterface.isEmpty()) {
- const QString devFile = QLatin1String("/sys/class/net/") +
- networkInterface +
- QLatin1String("/statistics/rx_bytes");
-
- quint64 result = Q_UINT64_C(0);
-
- QFile tx(devFile);
- if (tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QTextStream in(&tx);
- in >> result;
- tx.close();
- }
-
- return result;
- }
- }
-
- return Q_UINT64_C(0);
-}
-
-quint64 QNetworkManagerEngine::startTime(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- QNetworkManagerSettingsConnection *connection = connectionFromId(id);
- if (connection)
- return connection->getTimestamp();
- else
- return Q_UINT64_C(0);
-}
-
-QNetworkConfigurationManager::Capabilities QNetworkManagerEngine::capabilities() const
-{
- return QNetworkConfigurationManager::ForcedRoaming |
- QNetworkConfigurationManager::DataStatistics |
- QNetworkConfigurationManager::CanStartAndStopInterfaces;
-}
-
-QNetworkSessionPrivate *QNetworkManagerEngine::createSessionBackend()
-{
- return new QNetworkSessionPrivateImpl;
-}
-
-QNetworkConfigurationPrivatePointer QNetworkManagerEngine::defaultConfiguration()
-{
- for (QNetworkManagerConnectionActive *activeConnection : qAsConst(activeConnectionsList)) {
- if ((activeConnection->defaultRoute() || activeConnection->default6Route())) {
- return accessPointConfigurations.value(activeConnection->connection().path());
- }
- }
-
- return QNetworkConfigurationPrivatePointer();
-}
-
-QNetworkConfiguration::BearerType QNetworkManagerEngine::currentBearerType(const QString &id) const
-{
- QString contextPart = id.section('/', -1);
- for (auto i = ofonoContextManagers.begin(), end = ofonoContextManagers.end(); i != end; ++i) {
- QString contextPath = i.key() + QLatin1Char('/') +contextPart;
-
- if (i.value()->contexts().contains(contextPath)) {
-
- QString bearer = i.value()->bearer();
-
- if (bearer == QLatin1String("gsm")) {
- return QNetworkConfiguration::Bearer2G;
- } else if (bearer == QLatin1String("edge")) {
- return QNetworkConfiguration::Bearer2G;
- } else if (bearer == QLatin1String("umts")) {
- return QNetworkConfiguration::BearerWCDMA;
- } else if (bearer == QLatin1String("hspa")
- || bearer == QLatin1String("hsdpa")
- || bearer == QLatin1String("hsupa")) {
- return QNetworkConfiguration::BearerHSPA;
- } else if (bearer == QLatin1String("lte")) {
- return QNetworkConfiguration::BearerLTE;
- }
- }
- }
-
- return QNetworkConfiguration::BearerUnknown;
-}
-
-QString QNetworkManagerEngine::contextName(const QString &path) const
-{
- QString contextPart = path.section('/', -1);
- for (QOfonoDataConnectionManagerInterface *iface : ofonoContextManagers) {
- const PathPropertiesList list = iface->contextsWithProperties();
- for (int i = 0; i < list.size(); ++i) {
- if (list.at(i).path.path().contains(contextPart)) {
- return list.at(i).properties.value(QStringLiteral("Name")).toString();
- }
- }
- }
- return path;
-}
-
-void QNetworkManagerEngine::nmRegistered(const QString &)
-{
- if (ofonoManager) {
- delete ofonoManager;
- ofonoManager = NULL;
- }
- managerInterface = new QNetworkManagerInterface(this);
- systemSettings = new QNetworkManagerSettings(NM_DBUS_SERVICE, this);
-
- connect(managerInterface, SIGNAL(activationFinished(QDBusPendingCallWatcher*)),
- this, SLOT(activationFinished(QDBusPendingCallWatcher*)));
- connect(managerInterface, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
- this, SLOT(interfacePropertiesChanged(QMap<QString,QVariant>)));
- managerInterface->setConnections();
-
- connect(systemSettings, SIGNAL(newConnection(QDBusObjectPath)),
- this, SLOT(newConnection(QDBusObjectPath)));
- systemSettings->setConnections();
- nmAvailable = true;
-
- setupConfigurations();
-}
-
-void QNetworkManagerEngine::nmUnRegistered(const QString &)
-{
- if (systemSettings) {
- delete systemSettings;
- systemSettings = NULL;
- }
- if (managerInterface) {
- delete managerInterface;
- managerInterface = NULL;
- }
-}
-
-void QNetworkManagerEngine::ofonoRegistered(const QString &)
-{
- if (ofonoManager) {
- delete ofonoManager;
- ofonoManager = NULL;
- }
- ofonoManager = new QOfonoManagerInterface(this);
- if (ofonoManager && ofonoManager->isValid()) {
- const auto modems = ofonoManager->getModems();
- for (const QString &modem : modems) {
- QOfonoDataConnectionManagerInterface *ofonoContextManager
- = new QOfonoDataConnectionManagerInterface(modem,this);
- ofonoContextManagers.insert(modem, ofonoContextManager);
- }
- }
-}
-
-void QNetworkManagerEngine::ofonoUnRegistered(const QString &)
-{
- ofonoContextManagers.clear();
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
deleted file mode 100644
index a95c68abdf..0000000000
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNETWORKMANAGERENGINE_P_H
-#define QNETWORKMANAGERENGINE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "../qbearerengine_impl.h"
-
-#include "qnetworkmanagerservice.h"
-
-#include "../linux_common/qofonoservice_linux_p.h"
-
-#include <QMap>
-#include <QVariant>
-
-#ifndef QT_NO_DBUS
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkManagerEngine : public QBearerEngineImpl
-{
- Q_OBJECT
-
-public:
- QNetworkManagerEngine(QObject *parent = nullptr);
- ~QNetworkManagerEngine();
-
- bool networkManagerAvailable() const;
-
- QString getInterfaceFromId(const QString &id) override;
- bool hasIdentifier(const QString &id) override;
-
- void connectToId(const QString &id) override;
- void disconnectFromId(const QString &id) override;
-
- Q_INVOKABLE void initialize();
- Q_INVOKABLE void requestUpdate();
-
- QNetworkSession::State sessionStateForId(const QString &id) override;
-
- quint64 bytesWritten(const QString &id) override;
- quint64 bytesReceived(const QString &id) override;
- quint64 startTime(const QString &id) override;
-
- QNetworkConfigurationManager::Capabilities capabilities() const override;
-
- QNetworkSessionPrivate *createSessionBackend() override;
-
- QNetworkConfigurationPrivatePointer defaultConfiguration() override;
-
-private Q_SLOTS:
- void interfacePropertiesChanged(const QMap<QString, QVariant> &properties);
- void activeConnectionPropertiesChanged(const QMap<QString, QVariant> &properties);
-
- void newConnection(const QDBusObjectPath &path, QNetworkManagerSettings *settings = nullptr);
- void removeConnection(const QString &path);
- void updateConnection();
- void activationFinished(QDBusPendingCallWatcher *watcher);
- void deviceConnectionsChanged(const QStringList &activeConnectionsList);
-
- void wiredCarrierChanged(bool);
-
- void nmRegistered(const QString &serviceName = QString());
- void nmUnRegistered(const QString &serviceName = QString());
-
- void ofonoRegistered(const QString &serviceName = QString());
- void ofonoUnRegistered(const QString &serviceName = QString());
-
-private:
- QNetworkConfigurationPrivate *parseConnection(const QString &settingsPath,
- const QNmSettingsMap &map);
- QNetworkManagerSettingsConnection *connectionFromId(const QString &id) const;
-
- QNetworkManagerInterface *managerInterface;
- QNetworkManagerSettings *systemSettings;
- QHash<QString, QNetworkManagerInterfaceDeviceWired *> wiredDevices;
- QHash<QString, QNetworkManagerInterfaceDeviceWireless *> wirelessDevices;
-
- QHash<QString, QNetworkManagerConnectionActive *> activeConnectionsList;
- QList<QNetworkManagerSettingsConnection *> connections;
- QList<QNetworkManagerInterfaceAccessPoint *> accessPoints;
- QHash<QString, QNetworkManagerInterfaceDevice *> interfaceDevices;
-
- QMap<QString,QString> configuredAccessPoints; //ap, settings path
- QHash<QString,QString> connectionInterfaces; // ac, interface
-
- QOfonoManagerInterface *ofonoManager;
- QHash <QString, QOfonoDataConnectionManagerInterface *> ofonoContextManagers;
- QNetworkConfiguration::BearerType currentBearerType(const QString &id) const;
- QString contextName(const QString &path) const;
-
- bool isConnectionActive(const QString &settingsPath) const;
- QDBusServiceWatcher *ofonoWatcher;
- QDBusServiceWatcher *nmWatcher;
-
- bool isActiveContext(const QString &contextPath) const;
- bool nmAvailable;
- void setupConfigurations();
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DBUS
-
-#endif
-
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
deleted file mode 100644
index 2d6cba1791..0000000000
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
+++ /dev/null
@@ -1,1019 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QObject>
-#include <QList>
-#include <QtDBus/QtDBus>
-#include <QtDBus/QDBusConnection>
-#include <QtDBus/QDBusError>
-#include <QtDBus/QDBusInterface>
-#include <QtDBus/QDBusMessage>
-#include <QtDBus/QDBusReply>
-#include <QtDBus/QDBusPendingCallWatcher>
-#include <QtDBus/QDBusObjectPath>
-#include <QtDBus/QDBusPendingCall>
-
-#include "qnetworkmanagerservice.h"
-
-#ifndef QT_NO_DBUS
-
-#define DBUS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
-
-QT_BEGIN_NAMESPACE
-
-
-QNetworkManagerInterface::QNetworkManagerInterface(QObject *parent)
- : QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
- QLatin1String(NM_DBUS_PATH),
- NM_DBUS_INTERFACE,
- QDBusConnection::systemBus(),parent)
-{
- if (!isValid()) {
- return;
- }
-
- PropertiesDBusInterface managerPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
- QLatin1String(NM_DBUS_PATH),
- DBUS_PROPERTIES_INTERFACE,
- QDBusConnection::systemBus());
- QDBusPendingReply<QVariantMap> propsReply
- = managerPropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE));
-
- if (!propsReply.isError()) {
- propertyMap = propsReply.value();
- } else {
- qWarning() << "propsReply" << propsReply.error().message();
- }
-
- QDBusPendingReply<QList <QDBusObjectPath> > nmReply
- = call(QLatin1String("GetDevices"));
- nmReply.waitForFinished();
- if (!nmReply.isError()) {
- devicesPathList = nmReply.value();
- } else {
- qWarning() << "nmReply" << nmReply.error().message();
- }
-
- QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- QLatin1String(NM_DBUS_PATH),
- QLatin1String(NM_DBUS_INTERFACE),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
-}
-
-QNetworkManagerInterface::~QNetworkManagerInterface()
-{
- QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
- QLatin1String(NM_DBUS_PATH),
- QLatin1String(NM_DBUS_INTERFACE),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
- QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
- QLatin1String(NM_DBUS_PATH),
- QLatin1String(NM_DBUS_INTERFACE),
- QLatin1String("DeviceAdded"),
- this,SIGNAL(deviceAdded(QDBusObjectPath)));
- QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
- QLatin1String(NM_DBUS_PATH),
- QLatin1String(NM_DBUS_INTERFACE),
- QLatin1String("DeviceRemoved"),
- this,SIGNAL(deviceRemoved(QDBusObjectPath)));
-}
-
-bool QNetworkManagerInterface::setConnections()
-{
- if (!isValid())
- return false;
-
- QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- QLatin1String(NM_DBUS_PATH),
- QLatin1String(NM_DBUS_INTERFACE),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
-
- bool allOk = false;
- if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- QLatin1String(NM_DBUS_PATH),
- QLatin1String(NM_DBUS_INTERFACE),
- QLatin1String("DeviceAdded"),
- this,SIGNAL(deviceAdded(QDBusObjectPath)))) {
- allOk = true;
- }
- if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- QLatin1String(NM_DBUS_PATH),
- QLatin1String(NM_DBUS_INTERFACE),
- QLatin1String("DeviceRemoved"),
- this,SIGNAL(deviceRemoved(QDBusObjectPath)))) {
- allOk = true;
- }
-
- return allOk;
-}
-
-QList <QDBusObjectPath> QNetworkManagerInterface::getDevices()
-{
- if (devicesPathList.isEmpty()) {
- //qWarning("using blocking call!");
- QDBusReply<QList<QDBusObjectPath> > reply = call(QLatin1String("GetDevices"));
- devicesPathList = reply.value();
- }
- return devicesPathList;
-}
-
-void QNetworkManagerInterface::activateConnection(QDBusObjectPath connectionPath,
- QDBusObjectPath devicePath,
- QDBusObjectPath specificObject)
-{
- QDBusPendingCall pendingCall = asyncCall(QLatin1String("ActivateConnection"),
- QVariant::fromValue(connectionPath),
- QVariant::fromValue(devicePath),
- QVariant::fromValue(specificObject));
-
- QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pendingCall);
- connect(callWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SIGNAL(activationFinished(QDBusPendingCallWatcher*)));
-}
-
-void QNetworkManagerInterface::deactivateConnection(QDBusObjectPath connectionPath)
-{
- asyncCall(QLatin1String("DeactivateConnection"), QVariant::fromValue(connectionPath));
-}
-
-bool QNetworkManagerInterface::wirelessEnabled() const
-{
- if (propertyMap.contains("WirelessEnabled"))
- return propertyMap.value("WirelessEnabled").toBool();
- return false;
-}
-
-bool QNetworkManagerInterface::wirelessHardwareEnabled() const
-{
- if (propertyMap.contains("WirelessHardwareEnabled"))
- return propertyMap.value("WirelessHardwareEnabled").toBool();
- return false;
-}
-
-QList <QDBusObjectPath> QNetworkManagerInterface::activeConnections() const
-{
- if (propertyMap.contains("ActiveConnections")) {
-
- const QDBusArgument &dbusArgs = qvariant_cast<QDBusArgument>(propertyMap.value("ActiveConnections"));
- QDBusObjectPath path;
- QList <QDBusObjectPath> list;
-
- dbusArgs.beginArray();
- while (!dbusArgs.atEnd()) {
- dbusArgs >> path;
- list.append(path);
- }
- dbusArgs.endArray();
-
- return list;
- }
-
- QList <QDBusObjectPath> list;
- list << QDBusObjectPath();
- return list;
-}
-
-QNetworkManagerInterface::NMState QNetworkManagerInterface::state()
-{
- if (propertyMap.contains("State"))
- return static_cast<QNetworkManagerInterface::NMState>(propertyMap.value("State").toUInt());
- return QNetworkManagerInterface::NM_STATE_UNKNOWN;
-}
-
-QString QNetworkManagerInterface::version() const
-{
- if (propertyMap.contains("Version"))
- return propertyMap.value("Version").toString();
- return QString();
-}
-
-void QNetworkManagerInterface::propertiesSwap(QMap<QString,QVariant> map)
-{
- for (auto i = map.cbegin(), end = map.cend(); i != end; ++i) {
- propertyMap.insert(i.key(),i.value());
-
- if (i.key() == QLatin1String("State")) {
- quint32 state = i.value().toUInt();
- if (state == NM_DEVICE_STATE_ACTIVATED
- || state == NM_DEVICE_STATE_DISCONNECTED
- || state == NM_DEVICE_STATE_UNAVAILABLE
- || state == NM_DEVICE_STATE_FAILED) {
- Q_EMIT propertiesChanged(map);
- Q_EMIT stateChanged(state);
- }
- } else if (i.key() == QLatin1String("ActiveConnections")) {
- Q_EMIT propertiesChanged(map);
- }
- }
-}
-
-QNetworkManagerInterfaceAccessPoint::QNetworkManagerInterfaceAccessPoint(const QString &dbusPathName, QObject *parent)
- : QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
- dbusPathName,
- NM_DBUS_INTERFACE_ACCESS_POINT,
- QDBusConnection::systemBus(),parent)
-{
-}
-
-QNetworkManagerInterfaceAccessPoint::~QNetworkManagerInterfaceAccessPoint()
-{
-}
-
-quint32 QNetworkManagerInterfaceAccessPoint::flags() const
-{
- if (propertyMap.contains("Flags"))
- return propertyMap.value("Flags").toUInt();
- return 0;
-}
-
-quint32 QNetworkManagerInterfaceAccessPoint::wpaFlags() const
-{
- if (propertyMap.contains("WpaFlags"))
- return propertyMap.value("WpaFlags").toUInt();
- return 0;
-}
-
-quint32 QNetworkManagerInterfaceAccessPoint::rsnFlags() const
-{
- if (propertyMap.contains("RsnFlags"))
- return propertyMap.value("RsnFlags").toUInt();
- return 0;
-}
-
-QString QNetworkManagerInterfaceAccessPoint::ssid() const
-{
- if (propertyMap.contains("Ssid"))
- return propertyMap.value("Ssid").toString();
- return QString();
-}
-
-quint32 QNetworkManagerInterfaceAccessPoint::frequency() const
-{
- if (propertyMap.contains("Frequency"))
- return propertyMap.value("Frequency").toUInt();
- return 0;
-}
-
-QString QNetworkManagerInterfaceAccessPoint::hwAddress() const
-{
- if (propertyMap.contains("HwAddress"))
- return propertyMap.value("HwAddress").toString();
- return QString();
-}
-
-quint32 QNetworkManagerInterfaceAccessPoint::mode() const
-{
- if (propertyMap.contains("Mode"))
- return propertyMap.value("Mode").toUInt();
- return 0;
-}
-
-quint32 QNetworkManagerInterfaceAccessPoint::maxBitrate() const
-{
- if (propertyMap.contains("MaxBitrate"))
- return propertyMap.value("MaxBitrate").toUInt();
- return 0;
-}
-
-quint32 QNetworkManagerInterfaceAccessPoint::strength() const
-{
- if (propertyMap.contains("Strength"))
- return propertyMap.value("Strength").toUInt();
- return 0;
-}
-
-void QNetworkManagerInterfaceAccessPoint::propertiesSwap(QMap<QString,QVariant> map)
-{
- for (auto i = map.cbegin(), end = map.cend(); i != end; ++i)
- propertyMap.insert(i.key(),i.value());
-}
-
-QNetworkManagerInterfaceDevice::QNetworkManagerInterfaceDevice(const QString &deviceObjectPath, QObject *parent)
- : QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
- deviceObjectPath,
- NM_DBUS_INTERFACE_DEVICE,
- QDBusConnection::systemBus(),parent)
-{
-
- if (!isValid()) {
- return;
- }
- PropertiesDBusInterface devicePropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
- deviceObjectPath,
- DBUS_PROPERTIES_INTERFACE,
- QDBusConnection::systemBus(),parent);
-
- QDBusPendingReply<QVariantMap> propsReply
- = devicePropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE_DEVICE));
-
- if (!propsReply.isError()) {
- propertyMap = propsReply.value();
- }
-
- QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- deviceObjectPath,
- QLatin1String(NM_DBUS_INTERFACE_DEVICE),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
-}
-
-QNetworkManagerInterfaceDevice::~QNetworkManagerInterfaceDevice()
-{
- QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
- path(),
- QLatin1String(NM_DBUS_INTERFACE_DEVICE),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
-}
-
-QString QNetworkManagerInterfaceDevice::udi() const
-{
- if (propertyMap.contains("Udi"))
- return propertyMap.value("Udi").toString();
- return QString();
-}
-
-QString QNetworkManagerInterfaceDevice::networkInterface() const
-{
- if (propertyMap.contains("Interface"))
- return propertyMap.value("Interface").toString();
- return QString();
-}
-
-quint32 QNetworkManagerInterfaceDevice::ip4Address() const
-{
- if (propertyMap.contains("Ip4Address"))
- return propertyMap.value("Ip4Address").toUInt();
- return 0;
-}
-
-quint32 QNetworkManagerInterfaceDevice::state() const
-{
- if (propertyMap.contains("State"))
- return propertyMap.value("State").toUInt();
- return 0;
-}
-
-quint32 QNetworkManagerInterfaceDevice::deviceType() const
-{
- if (propertyMap.contains("DeviceType"))
- return propertyMap.value("DeviceType").toUInt();
- return 0;
-}
-
-QDBusObjectPath QNetworkManagerInterfaceDevice::ip4config() const
-{
- if (propertyMap.contains("Ip4Config"))
- return qvariant_cast<QDBusObjectPath>(propertyMap.value("Ip4Config"));
- return QDBusObjectPath();
-}
-
-void QNetworkManagerInterfaceDevice::propertiesSwap(QMap<QString,QVariant> map)
-{
- for (auto i = map.cbegin(), end = map.cend(); i != end; ++i) {
- if (i.key() == QLatin1String("AvailableConnections")) { //Device
- const QDBusArgument &dbusArgs = qvariant_cast<QDBusArgument>(i.value());
- QDBusObjectPath path;
- QStringList paths;
- dbusArgs.beginArray();
- while (!dbusArgs.atEnd()) {
- dbusArgs >> path;
- paths << path.path();
- }
- dbusArgs.endArray();
- Q_EMIT connectionsChanged(paths);
- }
- propertyMap.insert(i.key(),i.value());
- }
- Q_EMIT propertiesChanged(map);
-}
-
-QNetworkManagerInterfaceDeviceWired::QNetworkManagerInterfaceDeviceWired(const QString &ifaceDevicePath, QObject *parent)
- : QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
- ifaceDevicePath,
- NM_DBUS_INTERFACE_DEVICE_WIRED,
- QDBusConnection::systemBus(), parent)
-{
- if (!isValid()) {
- return;
- }
- PropertiesDBusInterface deviceWiredPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
- ifaceDevicePath,
- DBUS_PROPERTIES_INTERFACE,
- QDBusConnection::systemBus(),parent);
-
- QDBusPendingReply<QVariantMap> propsReply
- = deviceWiredPropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED));
-
- if (!propsReply.isError()) {
- propertyMap = propsReply.value();
- }
-
- QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- ifaceDevicePath,
- QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
-}
-
-QNetworkManagerInterfaceDeviceWired::~QNetworkManagerInterfaceDeviceWired()
-{
- QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
- path(),
- QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
-}
-
-QString QNetworkManagerInterfaceDeviceWired::hwAddress() const
-{
- if (propertyMap.contains("HwAddress"))
- return propertyMap.value("HwAddress").toString();
- return QString();
-}
-
-quint32 QNetworkManagerInterfaceDeviceWired::speed() const
-{
- if (propertyMap.contains("Speed"))
- return propertyMap.value("Speed").toUInt();
- return 0;
-}
-
-bool QNetworkManagerInterfaceDeviceWired::carrier() const
-{
- if (propertyMap.contains("Carrier"))
- return propertyMap.value("Carrier").toBool();
- return false;
-}
-
-QStringList QNetworkManagerInterfaceDeviceWired::availableConnections()
-{
- QStringList list;
- if (propertyMap.contains("AvailableConnections")) {
- const QDBusArgument &dbusArgs = qvariant_cast<QDBusArgument>(propertyMap.value("Carrier"));
- QDBusObjectPath path;
- dbusArgs.beginArray();
- while (!dbusArgs.atEnd()) {
- dbusArgs >> path;
- list << path.path();
- }
- dbusArgs.endArray();
- }
-
- return list;
-}
-
-void QNetworkManagerInterfaceDeviceWired::propertiesSwap(QMap<QString,QVariant> map)
-{
- for (auto i = map.cbegin(), end = map.cend(); i != end; ++i) {
- propertyMap.insert(i.key(),i.value());
- if (i.key() == QLatin1String("Carrier"))
- Q_EMIT carrierChanged(i.value().toBool());
- }
- Q_EMIT propertiesChanged(map);
-}
-
-QNetworkManagerInterfaceDeviceWireless::QNetworkManagerInterfaceDeviceWireless(const QString &ifaceDevicePath, QObject *parent)
- : QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
- ifaceDevicePath,
- NM_DBUS_INTERFACE_DEVICE_WIRELESS,
- QDBusConnection::systemBus(), parent)
-{
- if (!isValid()) {
- return;
- }
-
- interfacePath = ifaceDevicePath;
- QDBusPendingReply<QList <QDBusObjectPath> > nmReply
- = call(QLatin1String("GetAccessPoints"));
-
- if (!nmReply.isError()) {
- accessPointsList = nmReply.value();
- }
-
- PropertiesDBusInterface deviceWirelessPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
- interfacePath,
- DBUS_PROPERTIES_INTERFACE,
- QDBusConnection::systemBus(),parent);
-
- QDBusPendingReply<QVariantMap> propsReply
- = deviceWirelessPropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS));
-
- if (!propsReply.isError()) {
- propertyMap = propsReply.value();
- }
-
- QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- interfacePath,
- QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
-}
-
-QNetworkManagerInterfaceDeviceWireless::~QNetworkManagerInterfaceDeviceWireless()
-{
- QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
- path(),
- QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
-}
-
-bool QNetworkManagerInterfaceDeviceWireless::setConnections()
-{
- return true;
-}
-
-QList <QDBusObjectPath> QNetworkManagerInterfaceDeviceWireless::getAccessPoints()
-{
- if (accessPointsList.isEmpty()) {
- //qWarning("Using blocking call!");
- QDBusReply<QList<QDBusObjectPath> > reply
- = call(QLatin1String("GetAccessPoints"));
- accessPointsList = reply.value();
- }
- return accessPointsList;
-}
-
-QString QNetworkManagerInterfaceDeviceWireless::hwAddress() const
-{
- if (propertyMap.contains("HwAddress"))
- return propertyMap.value("HwAddress").toString();
- return QString();
-}
-
-quint32 QNetworkManagerInterfaceDeviceWireless::mode() const
-{
- if (propertyMap.contains("Mode"))
- return propertyMap.value("Mode").toUInt();
- return 0;
-}
-
-quint32 QNetworkManagerInterfaceDeviceWireless::bitrate() const
-{
- if (propertyMap.contains("Bitrate"))
- return propertyMap.value("Bitrate").toUInt();
- return 0;
-}
-
-QDBusObjectPath QNetworkManagerInterfaceDeviceWireless::activeAccessPoint() const
-{
- if (propertyMap.contains("ActiveAccessPoint"))
- return qvariant_cast<QDBusObjectPath>(propertyMap.value("ActiveAccessPoint"));
- return QDBusObjectPath();
-}
-
-quint32 QNetworkManagerInterfaceDeviceWireless::wirelessCapabilities() const
-{
- if (propertyMap.contains("WirelelessCapabilities"))
- return propertyMap.value("WirelelessCapabilities").toUInt();
- return 0;
-}
-
-void QNetworkManagerInterfaceDeviceWireless::requestScan()
-{
- asyncCall(QLatin1String("RequestScan"));
-}
-
-void QNetworkManagerInterfaceDeviceWireless::propertiesSwap(QMap<QString,QVariant> map)
-{
- for (auto i = map.cbegin(), end = map.cend(); i != end; ++i) {
- propertyMap.insert(i.key(),i.value());
- if (i.key() == QLatin1String("ActiveAccessPoint")) //DeviceWireless
- Q_EMIT propertiesChanged(map);
- }
-}
-
-QNetworkManagerInterfaceDeviceModem::QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath, QObject *parent)
- : QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
- ifaceDevicePath,
- NM_DBUS_INTERFACE_DEVICE_MODEM,
- QDBusConnection::systemBus(), parent)
-{
- if (!isValid()) {
- return;
- }
- PropertiesDBusInterface deviceModemPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
- ifaceDevicePath,
- QLatin1String("org.freedesktop.DBus.Properties"),
- QDBusConnection::systemBus(),parent);
-
- QDBusPendingReply<QVariantMap> propsReply
- = deviceModemPropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM));
-
- if (!propsReply.isError()) {
- propertyMap = propsReply.value();
- }
-
- QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- ifaceDevicePath,
- QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
-}
-
-QNetworkManagerInterfaceDeviceModem::~QNetworkManagerInterfaceDeviceModem()
-{
- QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
- path(),
- QLatin1String(NM_DBUS_PATH_SETTINGS),
- QLatin1String(NM_DBUS_IFACE_SETTINGS),
- QLatin1String("NewConnection"),
- this, SIGNAL(newConnection(QDBusObjectPath)));
-}
-
-QNetworkManagerInterfaceDeviceModem::ModemCapabilities QNetworkManagerInterfaceDeviceModem::modemCapabilities() const
-{
- if (propertyMap.contains("ModemCapabilities"))
- return static_cast<QNetworkManagerInterfaceDeviceModem::ModemCapabilities>(propertyMap.value("ModemCapabilities").toUInt());
- return QNetworkManagerInterfaceDeviceModem::None;
-}
-
-QNetworkManagerInterfaceDeviceModem::ModemCapabilities QNetworkManagerInterfaceDeviceModem::currentCapabilities() const
-{
- if (propertyMap.contains("CurrentCapabilities"))
- return static_cast<QNetworkManagerInterfaceDeviceModem::ModemCapabilities>(propertyMap.value("CurrentCapabilities").toUInt());
- return QNetworkManagerInterfaceDeviceModem::None;
-}
-
-void QNetworkManagerInterfaceDeviceModem::propertiesSwap(QMap<QString,QVariant> map)
-{
- for (auto i = map.cbegin(), end = map.cend(); i != end; ++i)
- propertyMap.insert(i.key(),i.value());
- Q_EMIT propertiesChanged(map);
-}
-
-
-QNetworkManagerSettings::QNetworkManagerSettings(const QString &settingsService, QObject *parent)
- : QDBusAbstractInterface(settingsService,
- NM_DBUS_PATH_SETTINGS,
- NM_DBUS_IFACE_SETTINGS,
- QDBusConnection::systemBus(), parent)
-{
- if (!isValid()) {
- return;
- }
- interfacePath = settingsService;
- QDBusPendingReply<QList <QDBusObjectPath> > nmReply
- = call(QLatin1String("ListConnections"));
-
- if (!nmReply.isError()) {
- connectionsList = nmReply.value();
- }
-}
-
-QNetworkManagerSettings::~QNetworkManagerSettings()
-{
-}
-
-bool QNetworkManagerSettings::setConnections()
-{
- bool allOk = true;
- if (!QDBusConnection::systemBus().connect(interfacePath,
- QLatin1String(NM_DBUS_PATH_SETTINGS),
- QLatin1String(NM_DBUS_IFACE_SETTINGS),
- QLatin1String("NewConnection"),
- this, SIGNAL(newConnection(QDBusObjectPath)))) {
- allOk = false;
- qWarning("NewConnection could not be connected");
- }
-
- return allOk;
-}
-
-QList <QDBusObjectPath> QNetworkManagerSettings::listConnections()
-{
- if (connectionsList.isEmpty()) {
- //qWarning("Using blocking call!");
- QDBusReply<QList<QDBusObjectPath> > reply
- = call(QLatin1String("ListConnections"));
- connectionsList = reply.value();
- }
- return connectionsList;
-}
-
-
-QString QNetworkManagerSettings::getConnectionByUuid(const QString &uuid)
-{
- QDBusReply<QDBusObjectPath > reply = call(QDBus::Block, QLatin1String("GetConnectionByUuid"), uuid);
- return reply.value().path();
-}
-
-QNetworkManagerSettingsConnection::QNetworkManagerSettingsConnection(const QString &settingsService, const QString &connectionObjectPath, QObject *parent)
- : QDBusAbstractInterface(settingsService,
- connectionObjectPath,
- NM_DBUS_IFACE_SETTINGS_CONNECTION,
- QDBusConnection::systemBus(), parent)
-{
- qDBusRegisterMetaType<QNmSettingsMap>();
- if (!isValid()) {
- return;
- }
- interfacepath = connectionObjectPath;
- QDBusPendingReply<QNmSettingsMap> nmReply
- = call(QLatin1String("GetSettings"));
- if (!nmReply.isError()) {
- settingsMap = nmReply.value();
- }
-}
-
-QNetworkManagerSettingsConnection::~QNetworkManagerSettingsConnection()
-{
- QDBusConnection::systemBus().disconnect(service(),
- path(),
- QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
- QLatin1String("Updated"),
- this, SIGNAL(updated()));
- QDBusConnection::systemBus().disconnect(service(),
- path(),
- QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
- QLatin1String("Removed"),
- this, SIGNAL(slotSettingsRemoved()));
-}
-
-bool QNetworkManagerSettingsConnection::setConnections()
-{
- if (!isValid())
- return false;
-
- QDBusConnection dbusConnection = QDBusConnection::systemBus();
- bool allOk = true;
- if (!dbusConnection.connect(service(),
- interfacepath,
- QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
- QLatin1String("Updated"),
- this, SIGNAL(updated()))) {
- allOk = false;
- }
-
- if (!dbusConnection.connect(service(),
- interfacepath,
- QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
- QLatin1String("Removed"),
- this, SIGNAL(slotSettingsRemoved()))) {
- allOk = false;
- }
- return allOk;
-}
-
-void QNetworkManagerSettingsConnection::slotSettingsRemoved()
-{
- Q_EMIT removed(interfacepath);
-}
-
-QNmSettingsMap QNetworkManagerSettingsConnection::getSettings()
-{
- if (settingsMap.isEmpty()) {
- //qWarning("Using blocking call!");
- QDBusReply<QNmSettingsMap> reply = call(QLatin1String("GetSettings"));
- settingsMap = reply.value();
- }
- return settingsMap;
-}
-
-NMDeviceType QNetworkManagerSettingsConnection::getType()
-{
- const QString devType =
- settingsMap.value(QLatin1String("connection")).value(QLatin1String("type")).toString();
-
- if (devType == QLatin1String("802-3-ethernet"))
- return DEVICE_TYPE_ETHERNET;
- else if (devType == QLatin1String("802-11-wireless"))
- return DEVICE_TYPE_WIFI;
- else if (devType == QLatin1String("gsm"))
- return DEVICE_TYPE_MODEM;
- else
- return DEVICE_TYPE_UNKNOWN;
-}
-
-bool QNetworkManagerSettingsConnection::isAutoConnect()
-{
- const QVariant autoConnect =
- settingsMap.value(QLatin1String("connection")).value(QLatin1String("autoconnect"));
-
- // NetworkManager default is to auto connect
- if (!autoConnect.isValid())
- return true;
-
- return autoConnect.toBool();
-}
-
-quint64 QNetworkManagerSettingsConnection::getTimestamp()
-{
- return settingsMap.value(QLatin1String("connection"))
- .value(QLatin1String("timestamp")).toUInt();
-}
-
-QString QNetworkManagerSettingsConnection::getId()
-{
- return settingsMap.value(QLatin1String("connection")).value(QLatin1String("id")).toString();
-}
-
-QString QNetworkManagerSettingsConnection::getUuid()
-{
- const QString id = settingsMap.value(QLatin1String("connection"))
- .value(QLatin1String("uuid")).toString();
-
- // is no uuid, return the connection path
- return id.isEmpty() ? path() : id;
-}
-
-QString QNetworkManagerSettingsConnection::getSsid()
-{
- return settingsMap.value(QLatin1String("802-11-wireless"))
- .value(QLatin1String("ssid")).toString();
-}
-
-QString QNetworkManagerSettingsConnection::getMacAddress()
-{
- NMDeviceType type = getType();
-
- if (type == DEVICE_TYPE_ETHERNET) {
- return settingsMap.value(QLatin1String("802-3-ethernet"))
- .value(QLatin1String("mac-address")).toString();
- } else if (type == DEVICE_TYPE_WIFI) {
- return settingsMap.value(QLatin1String("802-11-wireless"))
- .value(QLatin1String("mac-address")).toString();
- } else {
- return QString();
- }
-}
-
-QStringList QNetworkManagerSettingsConnection::getSeenBssids()
-{
- if (getType() == DEVICE_TYPE_WIFI) {
- return settingsMap.value(QLatin1String("802-11-wireless"))
- .value(QLatin1String("seen-bssids")).toStringList();
- } else {
- return QStringList();
- }
-}
-
-QNetworkManagerConnectionActive::QNetworkManagerConnectionActive(const QString &activeConnectionObjectPath, QObject *parent)
- : QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
- activeConnectionObjectPath,
- NM_DBUS_INTERFACE_ACTIVE_CONNECTION,
- QDBusConnection::systemBus(), parent)
-{
- if (!isValid()) {
- return;
- }
- PropertiesDBusInterface connectionActivePropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
- activeConnectionObjectPath,
- QLatin1String("org.freedesktop.DBus.Properties"),
- QDBusConnection::systemBus());
-
-
- QDBusPendingReply<QVariantMap> propsReply
- = connectionActivePropertiesInterface.call(QDBus::Block, QLatin1String("GetAll"), QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION));
-
- if (!propsReply.isError()) {
- propertyMap = propsReply.value();
- } else {
- qWarning() << propsReply.error().message();
- }
-
- QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
- activeConnectionObjectPath,
- QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
-}
-
-QNetworkManagerConnectionActive::~QNetworkManagerConnectionActive()
-{
- QDBusConnection::systemBus().disconnect(QLatin1String(NM_DBUS_SERVICE),
- path(),
- QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
- QLatin1String("PropertiesChanged"),
- this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
-}
-
-QDBusObjectPath QNetworkManagerConnectionActive::connection() const
-{
- if (propertyMap.contains("Connection"))
- return qvariant_cast<QDBusObjectPath>(propertyMap.value("Connection"));
- return QDBusObjectPath();
-}
-
-QDBusObjectPath QNetworkManagerConnectionActive::specificObject() const
-{
- if (propertyMap.contains("SpecificObject"))
- return qvariant_cast<QDBusObjectPath>(propertyMap.value("SpecificObject"));
- return QDBusObjectPath();
-}
-
-QStringList QNetworkManagerConnectionActive::devices() const
-{
- QStringList list;
- if (propertyMap.contains("Devices")) {
- const QDBusArgument &dbusArgs = qvariant_cast<QDBusArgument>(propertyMap.value("Devices"));
- QDBusObjectPath path;
-
- dbusArgs.beginArray();
- while (!dbusArgs.atEnd()) {
- dbusArgs >> path;
- list.append(path.path());
- }
- dbusArgs.endArray();
- }
- return list;
-}
-
-quint32 QNetworkManagerConnectionActive::state() const
-{
- if (propertyMap.contains("State"))
- return propertyMap.value("State").toUInt();
- return 0;
-}
-
-bool QNetworkManagerConnectionActive::defaultRoute() const
-{
- if (propertyMap.contains("Default"))
- return propertyMap.value("Default").toBool();
- return false;
-}
-
-bool QNetworkManagerConnectionActive::default6Route() const
-{
- if (propertyMap.contains("Default6"))
- return propertyMap.value("Default6").toBool();
- return false;
-}
-
-void QNetworkManagerConnectionActive::propertiesSwap(QMap<QString,QVariant> map)
-{
- for (auto i = map.cbegin(), end = map.cend(); i != end; ++i) {
- propertyMap.insert(i.key(),i.value());
- if (i.key() == QLatin1String("State")) {
- quint32 state = i.value().toUInt();
- if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED
- || state == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) {
- Q_EMIT propertiesChanged(map);
- }
- }
- }
-}
-
-QNetworkManagerIp4Config::QNetworkManagerIp4Config( const QString &deviceObjectPath, QObject *parent)
- : QDBusAbstractInterface(QLatin1String(NM_DBUS_SERVICE),
- deviceObjectPath,
- NM_DBUS_INTERFACE_IP4_CONFIG,
- QDBusConnection::systemBus(), parent)
-{
- if (!isValid()) {
- return;
- }
-}
-
-QNetworkManagerIp4Config::~QNetworkManagerIp4Config()
-{
-}
-
-QStringList QNetworkManagerIp4Config::domains() const
-{
- return property("Domains").toStringList();
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h
deleted file mode 100644
index bff7a71097..0000000000
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h
+++ /dev/null
@@ -1,500 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNETWORKMANAGERSERVICE_H
-#define QNETWORKMANAGERSERVICE_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtDBus/QtDBus>
-#include <QtDBus/QDBusConnection>
-#include <QtDBus/QDBusError>
-#include <QtDBus/QDBusInterface>
-#include <QtDBus/QDBusMessage>
-#include <QtDBus/QDBusReply>
-
-#include <QtDBus/QDBusPendingCallWatcher>
-#include <QtDBus/QDBusObjectPath>
-#include <QtDBus/QDBusContext>
-#include <QtDBus/QDBusAbstractInterface>
-#include <QMap>
-
-#ifndef QT_NO_DBUS
-
-#ifndef NETWORK_MANAGER_H
-typedef enum NMDeviceType
-{
- DEVICE_TYPE_UNKNOWN = 0,
- DEVICE_TYPE_ETHERNET,
- DEVICE_TYPE_WIFI,
- DEVICE_TYPE_MODEM = 8
-} NMDeviceType;
-
-typedef enum
-{
- NM_DEVICE_STATE_UNKNOWN = 0,
- NM_DEVICE_STATE_UNMANAGED = 10,
- NM_DEVICE_STATE_UNAVAILABLE = 20,
- NM_DEVICE_STATE_DISCONNECTED = 30,
- NM_DEVICE_STATE_PREPARE = 40,
- NM_DEVICE_STATE_CONFIG = 50,
- NM_DEVICE_STATE_NEED_AUTH = 60,
- NM_DEVICE_STATE_IP_CONFIG = 70,
- NM_DEVICE_STATE_ACTIVATED = 100,
- NM_DEVICE_STATE_DEACTIVATING = 110,
- NM_DEVICE_STATE_FAILED = 120
-} NMDeviceState;
-
-typedef enum
-{
- NM_ACTIVE_CONNECTION_STATE_UNKNOWN = 0,
- NM_ACTIVE_CONNECTION_STATE_ACTIVATING,
- NM_ACTIVE_CONNECTION_STATE_ACTIVATED,
- NM_ACTIVE_CONNECTION_STATE_DEACTIVATED = 4
-} NMActiveConnectionState;
-
-#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
-
-#define NM_DBUS_PATH "/org/freedesktop/NetworkManager"
-#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager"
-#define NM_DBUS_INTERFACE_DEVICE NM_DBUS_INTERFACE ".Device"
-#define NM_DBUS_INTERFACE_DEVICE_WIRED NM_DBUS_INTERFACE_DEVICE ".Wired"
-#define NM_DBUS_INTERFACE_DEVICE_WIRELESS NM_DBUS_INTERFACE_DEVICE ".Wireless"
-#define NM_DBUS_INTERFACE_DEVICE_MODEM NM_DBUS_INTERFACE_DEVICE ".Modem"
-#define NM_DBUS_PATH_ACCESS_POINT NM_DBUS_PATH "/AccessPoint"
-#define NM_DBUS_INTERFACE_ACCESS_POINT NM_DBUS_INTERFACE ".AccessPoint"
-
-#define NM_DBUS_PATH_SETTINGS "/org/freedesktop/NetworkManager/Settings"
-
-#define NM_DBUS_IFACE_SETTINGS_CONNECTION "org.freedesktop.NetworkManager.Settings.Connection"
-#define NM_DBUS_IFACE_SETTINGS "org.freedesktop.NetworkManager.Settings"
-#define NM_DBUS_INTERFACE_ACTIVE_CONNECTION NM_DBUS_INTERFACE ".Connection.Active"
-#define NM_DBUS_INTERFACE_IP4_CONFIG NM_DBUS_INTERFACE ".IP4Config"
-
-#define NM_DBUS_SERVICE_USER_SETTINGS "org.freedesktop.NetworkManagerUserSettings"
-#define NM_DBUS_SERVICE_SYSTEM_SETTINGS "org.freedesktop.NetworkManagerSystemSettings"
-
-#define NM_802_11_AP_FLAGS_NONE 0x00000000
-#define NM_802_11_AP_FLAGS_PRIVACY 0x00000001
-#endif
-
-QT_BEGIN_NAMESPACE
-
-typedef QMap< QString, QMap<QString,QVariant> > QNmSettingsMap;
-typedef QList<quint32> ServerThing;
-
-QT_END_NAMESPACE
-
-Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QNmSettingsMap))
-Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(ServerThing))
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkManagerInterface : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
- typedef enum
- {
- NM_STATE_UNKNOWN = 0,
- NM_STATE_ASLEEP = 10,
- NM_STATE_DISCONNECTED = 20,
- NM_STATE_DISCONNECTING = 30,
- NM_STATE_CONNECTING = 40,
- NM_STATE_CONNECTED_LOCAL = 50,
- NM_STATE_CONNECTED_SITE = 60,
- NM_STATE_CONNECTED_GLOBAL = 70
- } NMState;
-
- QNetworkManagerInterface(QObject *parent = nullptr);
- ~QNetworkManagerInterface();
-
- QList <QDBusObjectPath> getDevices();
- void activateConnection(QDBusObjectPath connection,QDBusObjectPath device, QDBusObjectPath specificObject);
- void deactivateConnection(QDBusObjectPath connectionPath);
-
- QDBusObjectPath path() const;
-
- bool wirelessEnabled() const;
- bool wirelessHardwareEnabled() const;
- QList <QDBusObjectPath> activeConnections() const;
- NMState state();
- QString version() const;
- bool setConnections();
-
-Q_SIGNALS:
- void deviceAdded(QDBusObjectPath);
- void deviceRemoved(QDBusObjectPath);
- void propertiesChanged(QMap<QString,QVariant>);
- void stateChanged(quint32);
- void activationFinished(QDBusPendingCallWatcher*);
- void propertiesReady();
- void devicesListReady();
-
-private Q_SLOTS:
- void propertiesSwap(QMap<QString,QVariant>);
-
-private:
- QVariantMap propertyMap;
- QList<QDBusObjectPath> devicesPathList;
-
-};
-
-class QNetworkManagerInterfaceAccessPoint : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
-
- enum DeviceState {
- Unknown = 0,
- Unmanaged,
- Unavailable,
- Disconnected,
- Prepare,
- Config,
- NeedAuthentication,
- IpConfig,
- Activated,
- Failed
- };
-
- enum ApFlag {
- ApNone = 0x0,
- Privacy = 0x1
- };
-
- Q_DECLARE_FLAGS(ApFlags, ApFlag)
-
- enum ApSecurityFlag {
- ApSecurityNone = 0x0,
- PairWep40 = 0x1,
- PairWep104 = 0x2,
- PairTkip = 0x4,
- PairCcmp = 0x8,
- GroupWep40 = 0x10,
- GroupWep104 = 0x20,
- GroupTkip = 0x40,
- GroupCcmp = 0x80,
- KeyPsk = 0x100,
- Key8021x = 0x200
- };
-
- Q_DECLARE_FLAGS(ApSecurityFlags, ApSecurityFlag)
-
- explicit QNetworkManagerInterfaceAccessPoint(const QString &dbusPathName, QObject *parent = nullptr);
- ~QNetworkManagerInterfaceAccessPoint();
-
- quint32 flags() const;
- quint32 wpaFlags() const;
- quint32 rsnFlags() const;
- QString ssid() const;
- quint32 frequency() const;
- QString hwAddress() const;
- quint32 mode() const;
- quint32 maxBitrate() const;
- quint32 strength() const;
- // bool setConnections();
-
-Q_SIGNALS:
- void propertiesChanged(QMap<QString,QVariant>);
- void propertiesReady();
-
-private Q_SLOTS:
- void propertiesSwap(QMap<QString,QVariant>);
-
-private:
- QVariantMap propertyMap;
-};
-
-class QNetworkManagerInterfaceDevice : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
-
- explicit QNetworkManagerInterfaceDevice(const QString &deviceObjectPath, QObject *parent = nullptr);
- ~QNetworkManagerInterfaceDevice();
-
- QString udi() const;
- QString networkInterface() const;
- quint32 ip4Address() const;
- quint32 state() const;
- quint32 deviceType() const;
-
- QDBusObjectPath ip4config() const;
-
-Q_SIGNALS:
- void stateChanged(const QString &, quint32);
- void propertiesChanged(QMap<QString,QVariant>);
- void connectionsChanged(QStringList);
- void propertiesReady();
-private Q_SLOTS:
- void propertiesSwap(QMap<QString,QVariant>);
-private:
- QVariantMap propertyMap;
-};
-
-class QNetworkManagerInterfaceDeviceWired : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
-
- explicit QNetworkManagerInterfaceDeviceWired(const QString &ifaceDevicePath,
- QObject *parent = nullptr);
- ~QNetworkManagerInterfaceDeviceWired();
-
- QString hwAddress() const;
- quint32 speed() const;
- bool carrier() const;
- QStringList availableConnections();
-
-Q_SIGNALS:
- void propertiesChanged(QMap<QString,QVariant>);
- void propertiesReady();
- void carrierChanged(bool);
-
-private Q_SLOTS:
- void propertiesSwap(QMap<QString,QVariant>);
-
-private:
- QVariantMap propertyMap;
-};
-
-class QNetworkManagerInterfaceDeviceWireless : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
-
- enum DeviceCapability {
- None = 0x0,
- Wep40 = 0x1,
- Wep104 = 0x2,
- Tkip = 0x4,
- Ccmp = 0x8,
- Wpa = 0x10,
- Rsn = 0x20
- };
-
- explicit QNetworkManagerInterfaceDeviceWireless(const QString &ifaceDevicePath,
- QObject *parent = nullptr);
- ~QNetworkManagerInterfaceDeviceWireless();
-
- QList <QDBusObjectPath> getAccessPoints();
-
- QString hwAddress() const;
- quint32 mode() const;
- quint32 bitrate() const;
- QDBusObjectPath activeAccessPoint() const;
- quint32 wirelessCapabilities() const;
- bool setConnections();
-
- void requestScan();
-Q_SIGNALS:
- void propertiesChanged(QMap<QString,QVariant>);
- void propertiesReady();
-
-private Q_SLOTS:
- void propertiesSwap(QMap<QString,QVariant>);
-
-private:
- QVariantMap propertyMap;
- QList <QDBusObjectPath> accessPointsList;
- QString interfacePath;
-};
-
-class QNetworkManagerInterfaceDeviceModem : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
-
- enum ModemCapability {
- None = 0x0,
- Pots = 0x1,
- Cmda_Edvo = 0x2,
- Gsm_Umts = 0x4,
- Lte = 0x08
- };
- Q_DECLARE_FLAGS(ModemCapabilities, ModemCapability)
-
- explicit QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath,
- QObject *parent = nullptr);
- ~QNetworkManagerInterfaceDeviceModem();
-
- ModemCapabilities modemCapabilities() const;
- ModemCapabilities currentCapabilities() const;
-
-Q_SIGNALS:
- void propertiesChanged(QMap<QString,QVariant>);
- void propertiesReady();
-
-private Q_SLOTS:
- void propertiesSwap(QMap<QString,QVariant>);
-
-private:
- QVariantMap propertyMap;
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QNetworkManagerInterfaceDeviceModem::ModemCapabilities)
-
-class QNetworkManagerSettings : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
-
- explicit QNetworkManagerSettings(const QString &settingsService, QObject *parent = nullptr);
- ~QNetworkManagerSettings();
-
- QList <QDBusObjectPath> listConnections();
- QString getConnectionByUuid(const QString &uuid);
- bool setConnections();
-
-Q_SIGNALS:
- void newConnection(QDBusObjectPath);
- void connectionsListReady();
-private:
- QList <QDBusObjectPath> connectionsList;
- QString interfacePath;
-};
-
-class QNetworkManagerSettingsConnection : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
-
- QNetworkManagerSettingsConnection(const QString &settingsService, const QString &connectionObjectPath, QObject *parent = nullptr);
- ~QNetworkManagerSettingsConnection();
-
- QNmSettingsMap getSettings();
- bool setConnections();
- NMDeviceType getType();
- bool isAutoConnect();
- quint64 getTimestamp();
- QString getId();
- QString getUuid();
- QString getSsid();
- QString getMacAddress();
- QStringList getSeenBssids();
-
-Q_SIGNALS:
- void updated();
- void removed(const QString &path);
- void settingsReady();
-
-private Q_SLOTS:
- void slotSettingsRemoved();
-private:
- QNmSettingsMap settingsMap;
- QString interfacepath;
-};
-
-class QNetworkManagerConnectionActive : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
-
- enum ActiveConnectionState {
- Unknown = 0,
- Activating = 1,
- Activated = 2
- };
-
- explicit QNetworkManagerConnectionActive(const QString &dbusPathName, QObject *parent = nullptr);
- ~ QNetworkManagerConnectionActive();
-
- QDBusObjectPath connection() const;
- QDBusObjectPath specificObject() const;
- QStringList devices() const;
- quint32 state() const;
- bool defaultRoute() const;
- bool default6Route() const;
-
-
-Q_SIGNALS:
- void propertiesChanged(QMap<QString,QVariant>);
- void propertiesReady();
-
-private Q_SLOTS:
- void propertiesSwap(QMap<QString,QVariant>);
-
-private:
- QVariantMap propertyMap;
-};
-
-class QNetworkManagerIp4Config : public QDBusAbstractInterface
-{
- Q_OBJECT
-
-public:
- explicit QNetworkManagerIp4Config(const QString &dbusPathName, QObject *parent = nullptr);
- ~QNetworkManagerIp4Config();
-
- QStringList domains() const;
-};
-
-class PropertiesDBusInterface : public QDBusAbstractInterface
-{
-public:
- PropertiesDBusInterface(const QString &service, const QString &path,
- const QString &interface, const QDBusConnection &connection,
- QObject *parent = nullptr)
- : QDBusAbstractInterface(service, path, interface.toLatin1().data(), connection, parent)
- {}
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_DBUS
-#endif //QNETWORKMANAGERSERVICE_H
diff --git a/src/plugins/bearer/nla/main.cpp b/src/plugins/bearer/nla/main.cpp
deleted file mode 100644
index 8e45c071e8..0000000000
--- a/src/plugins/bearer/nla/main.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qnlaengine.h"
-
-#include <QtNetwork/private/qbearerplugin_p.h>
-
-#include <QtCore/qdebug.h>
-
-QT_BEGIN_NAMESPACE
-
-class QNlaEnginePlugin : public QBearerEnginePlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QBearerEngineFactoryInterface" FILE "nla.json")
-
-public:
- QNlaEnginePlugin();
- ~QNlaEnginePlugin();
-
- QBearerEngine *create(const QString &key) const;
-};
-
-QNlaEnginePlugin::QNlaEnginePlugin()
-{
-}
-
-QNlaEnginePlugin::~QNlaEnginePlugin()
-{
-}
-
-QBearerEngine *QNlaEnginePlugin::create(const QString &key) const
-{
- if (key == QLatin1String("nla"))
- return new QNlaEngine;
- else
- return 0;
-}
-
-QT_END_NAMESPACE
-
-#include "main.moc"
diff --git a/src/plugins/bearer/nla/nla.json b/src/plugins/bearer/nla/nla.json
deleted file mode 100644
index 2554d2c5c4..0000000000
--- a/src/plugins/bearer/nla/nla.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "nla" ]
-}
diff --git a/src/plugins/bearer/nla/nla.pro b/src/plugins/bearer/nla/nla.pro
deleted file mode 100644
index 76f3279d25..0000000000
--- a/src/plugins/bearer/nla/nla.pro
+++ /dev/null
@@ -1,20 +0,0 @@
-TARGET = qnlabearer
-
-QT = core core-private network network-private
-
-QMAKE_USE_PRIVATE += ws2_32
-
-HEADERS += qnlaengine.h \
- ../platformdefs_win.h \
- ../qnetworksession_impl.h \
- ../qbearerengine_impl.h
-
-SOURCES += main.cpp \
- qnlaengine.cpp \
- ../qnetworksession_impl.cpp
-
-OTHER_FILES += nla.json
-
-PLUGIN_TYPE = bearer
-PLUGIN_CLASS_NAME = QNlaEnginePlugin
-load(qt_plugin)
diff --git a/src/plugins/bearer/nla/qnlaengine.cpp b/src/plugins/bearer/nla/qnlaengine.cpp
deleted file mode 100644
index e1e60389f1..0000000000
--- a/src/plugins/bearer/nla/qnlaengine.cpp
+++ /dev/null
@@ -1,639 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qnlaengine.h"
-#include "../qnetworksession_impl.h"
-
-#include <QtNetwork/private/qnetworkconfiguration_p.h>
-
-#include <QtCore/qthread.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qstringlist.h>
-
-#include <QtCore/qdebug.h>
-
-#include "../platformdefs_win.h"
-
-QT_BEGIN_NAMESPACE
-
-QWindowsSockInit2::QWindowsSockInit2()
-: version(0)
-{
- //### should we try for 2.2 on all platforms ??
- WSAData wsadata;
-
- // IPv6 requires Winsock v2.0 or better.
- if (WSAStartup(MAKEWORD(2,0), &wsadata) != 0) {
- qWarning("QBearerManagementAPI: WinSock v2.0 initialization failed.");
- } else {
- version = 0x20;
- }
-}
-
-QWindowsSockInit2::~QWindowsSockInit2()
-{
- WSACleanup();
-}
-
-#ifdef BEARER_MANAGEMENT_DEBUG
-static void printBlob(NLA_BLOB *blob)
-{
- qDebug() << "==== BEGIN NLA_BLOB ====" << Qt::endl
-
- << "type:" << blob->header.type << Qt::endl
- << "size:" << blob->header.dwSize << Qt::endl
- << "next offset:" << blob->header.nextOffset;
-
- switch (blob->header.type) {
- case NLA_RAW_DATA:
- qDebug() << "Raw Data" << Qt::endl
- << '\t' << blob->data.rawData;
- break;
- case NLA_INTERFACE:
- qDebug() << "Interface" << Qt::endl
- << "\ttype:" << blob->data.interfaceData.dwType << Qt::endl
- << "\tspeed:" << blob->data.interfaceData.dwSpeed << Qt::endl
- << "\tadapter:" << blob->data.interfaceData.adapterName;
- break;
- case NLA_802_1X_LOCATION:
- qDebug() << "802.1x Location" << Qt::endl
- << '\t' << blob->data.locationData.information;
- break;
- case NLA_CONNECTIVITY:
- qDebug() << "Connectivity" << Qt::endl
- << "\ttype:" << blob->data.connectivity.type << Qt::endl
- << "\tinternet:" << blob->data.connectivity.internet;
- break;
- case NLA_ICS:
- qDebug() << "ICS" << Qt::endl
- << "\tspeed:" << blob->data.ICS.remote.speed << Qt::endl
- << "\ttype:" << blob->data.ICS.remote.type << Qt::endl
- << "\tstate:" << blob->data.ICS.remote.state << Qt::endl
- << "\tmachine name:" << blob->data.ICS.remote.machineName << Qt::endl
- << "\tshared adapter name:" << blob->data.ICS.remote.sharedAdapterName;
- break;
- default:
- qDebug("UNKNOWN BLOB TYPE");
- }
-
- qDebug("===== END NLA_BLOB =====");
-}
-#endif
-
-static QNetworkConfiguration::BearerType qGetInterfaceType(const QString &interface)
-{
- unsigned long oid;
- DWORD bytesWritten;
-
- NDIS_MEDIUM medium;
- NDIS_PHYSICAL_MEDIUM physicalMedium;
-
- HANDLE handle = CreateFile((TCHAR *)QString::fromLatin1("\\\\.\\%1").arg(interface).utf16(), 0,
- FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
- if (handle == INVALID_HANDLE_VALUE)
- return QNetworkConfiguration::BearerUnknown;
-
- oid = OID_GEN_MEDIA_SUPPORTED;
- bytesWritten = 0;
- bool result = DeviceIoControl(handle, IOCTL_NDIS_QUERY_GLOBAL_STATS, &oid, sizeof(oid),
- &medium, sizeof(medium), &bytesWritten, 0);
- if (!result) {
- CloseHandle(handle);
- return QNetworkConfiguration::BearerUnknown;
- }
-
- oid = OID_GEN_PHYSICAL_MEDIUM;
- bytesWritten = 0;
- result = DeviceIoControl(handle, IOCTL_NDIS_QUERY_GLOBAL_STATS, &oid, sizeof(oid),
- &physicalMedium, sizeof(physicalMedium), &bytesWritten, 0);
- if (!result) {
- CloseHandle(handle);
-
- if (medium == NdisMedium802_3)
- return QNetworkConfiguration::BearerEthernet;
- else
- return QNetworkConfiguration::BearerUnknown;
- }
-
- CloseHandle(handle);
-
- if (medium == NdisMedium802_3) {
- switch (physicalMedium) {
- case NdisPhysicalMediumWirelessLan:
- return QNetworkConfiguration::BearerWLAN;
- case NdisPhysicalMediumBluetooth:
- return QNetworkConfiguration::BearerBluetooth;
- case NdisPhysicalMediumWiMax:
- return QNetworkConfiguration::BearerWiMAX;
- default:
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "Physical Medium" << physicalMedium;
-#endif
- return QNetworkConfiguration::BearerEthernet;
- }
- }
-
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << medium << physicalMedium;
-#endif
-
- return QNetworkConfiguration::BearerUnknown;
-}
-
-class QNlaThread : public QThread
-{
- Q_OBJECT
-
-public:
- QNlaThread(QNlaEngine *parent = 0);
- ~QNlaThread();
-
- QList<QNetworkConfigurationPrivate *> getConfigurations();
-
- void forceUpdate();
-
-protected:
- virtual void run();
-
-private:
- void updateConfigurations(QList<QNetworkConfigurationPrivate *> &configs);
- DWORD parseBlob(NLA_BLOB *blob, QNetworkConfigurationPrivate *cpPriv) const;
- QNetworkConfigurationPrivate *parseQuerySet(const WSAQUERYSET *querySet) const;
- void fetchConfigurations();
-
-signals:
- void networksChanged();
-
-private:
- QMutex mutex;
- HANDLE handle;
- bool done;
- QList<QNetworkConfigurationPrivate *> fetchedConfigurations;
-};
-
-QNlaThread::QNlaThread(QNlaEngine *parent)
-: QThread(parent), handle(0), done(false)
-{
-}
-
-QNlaThread::~QNlaThread()
-{
- mutex.lock();
-
- done = true;
-
- if (handle) {
- /* cancel completion event */
- if (WSALookupServiceEnd(handle) == SOCKET_ERROR) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("WSALookupServiceEnd error %d", WSAGetLastError());
-#endif
- }
- }
- mutex.unlock();
-
- wait();
-}
-
-QList<QNetworkConfigurationPrivate *> QNlaThread::getConfigurations()
-{
- QMutexLocker locker(&mutex);
-
- QList<QNetworkConfigurationPrivate *> foundConfigurations = fetchedConfigurations;
- fetchedConfigurations.clear();
-
- return foundConfigurations;
-}
-
-void QNlaThread::forceUpdate()
-{
- mutex.lock();
-
- if (handle) {
- /* cancel completion event */
- if (WSALookupServiceEnd(handle) == SOCKET_ERROR) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("WSALookupServiceEnd error %d", WSAGetLastError());
-#endif
- }
- handle = 0;
- }
- mutex.unlock();
-}
-
-void QNlaThread::run()
-{
- WSAEVENT changeEvent = WSACreateEvent();
- if (changeEvent == WSA_INVALID_EVENT)
- return;
-
- while (true) {
- fetchConfigurations();
-
- WSAQUERYSET qsRestrictions;
-
- memset(&qsRestrictions, 0, sizeof(qsRestrictions));
- qsRestrictions.dwSize = sizeof(qsRestrictions);
- qsRestrictions.dwNameSpace = NS_NLA;
-
- mutex.lock();
- if (done) {
- mutex.unlock();
- break;
- }
- int result = WSALookupServiceBegin(&qsRestrictions, LUP_RETURN_ALL, &handle);
- mutex.unlock();
-
- if (result == SOCKET_ERROR)
- break;
-
- WSACOMPLETION completion;
- WSAOVERLAPPED overlapped;
-
- memset(&overlapped, 0, sizeof(overlapped));
- overlapped.hEvent = changeEvent;
-
- memset(&completion, 0, sizeof(completion));
- completion.Type = NSP_NOTIFY_EVENT;
- completion.Parameters.Event.lpOverlapped = &overlapped;
-
- DWORD bytesReturned = 0;
- result = WSANSPIoctl(handle, SIO_NSP_NOTIFY_CHANGE, 0, 0, 0, 0,
- &bytesReturned, &completion);
- if (result == SOCKET_ERROR) {
- if (WSAGetLastError() != WSA_IO_PENDING)
- break;
- }
-
- // Not interested in unrelated IO completion events
- // although we also don't want to block them
- while (WaitForSingleObjectEx(changeEvent, WSA_INFINITE, true) != WAIT_IO_COMPLETION &&
- handle)
- {
- }
-
- mutex.lock();
- if (handle) {
- result = WSALookupServiceEnd(handle);
- if (result == SOCKET_ERROR) {
- mutex.unlock();
- break;
- }
- handle = 0;
- }
- mutex.unlock();
- }
-
- WSACloseEvent(changeEvent);
-}
-
-void QNlaThread::updateConfigurations(QList<QNetworkConfigurationPrivate *> &configs)
-{
- mutex.lock();
-
- while (!fetchedConfigurations.isEmpty())
- delete fetchedConfigurations.takeFirst();
-
- fetchedConfigurations = configs;
-
- mutex.unlock();
-
- emit networksChanged();
-}
-
-DWORD QNlaThread::parseBlob(NLA_BLOB *blob, QNetworkConfigurationPrivate *cpPriv) const
-{
-#ifdef BEARER_MANAGEMENT_DEBUG
- printBlob(blob);
-#endif
-
- switch (blob->header.type) {
- case NLA_RAW_DATA:
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: unhandled header type NLA_RAW_DATA", __FUNCTION__);
-#endif
- break;
- case NLA_INTERFACE:
- cpPriv->state = QNetworkConfiguration::Active;
- if (QNlaEngine *engine = qobject_cast<QNlaEngine *>(parent())) {
- engine->configurationInterface[cpPriv->id.toUInt()] =
- QString::fromLatin1(blob->data.interfaceData.adapterName);
- }
- break;
- case NLA_802_1X_LOCATION:
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: unhandled header type NLA_802_1X_LOCATION", __FUNCTION__);
-#endif
- break;
- case NLA_CONNECTIVITY:
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: unhandled header type NLA_CONNECTIVITY", __FUNCTION__);
-#endif
- break;
- case NLA_ICS:
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: unhandled header type NLA_ICS", __FUNCTION__);
-#endif
- break;
- default:
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("%s: unhandled header type %d", __FUNCTION__, blob->header.type);
-#endif
- ;
- }
-
- return blob->header.nextOffset;
-}
-
-QNetworkConfigurationPrivate *QNlaThread::parseQuerySet(const WSAQUERYSET *querySet) const
-{
- QNetworkConfigurationPrivate *cpPriv = new QNetworkConfigurationPrivate;
-
- cpPriv->name = QString::fromWCharArray(querySet->lpszServiceInstanceName);
- cpPriv->isValid = true;
- cpPriv->id = QString::number(qHash(QLatin1String("NLA:") + cpPriv->name));
- cpPriv->state = QNetworkConfiguration::Defined;
- cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
-
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "size:" << querySet->dwSize;
- qDebug() << "service instance name:" << QString::fromUtf16(querySet->lpszServiceInstanceName);
- qDebug() << "service class id:" << querySet->lpServiceClassId;
- qDebug() << "version:" << querySet->lpVersion;
- qDebug() << "comment:" << QString::fromUtf16(querySet->lpszComment);
- qDebug() << "namespace:" << querySet->dwNameSpace;
- qDebug() << "namespace provider id:" << querySet->lpNSProviderId;
- qDebug() << "context:" << QString::fromUtf16(querySet->lpszContext);
- qDebug() << "number of protocols:" << querySet->dwNumberOfProtocols;
- qDebug() << "protocols:" << querySet->lpafpProtocols;
- qDebug() << "query string:" << QString::fromUtf16(querySet->lpszQueryString);
- qDebug() << "number of cs addresses:" << querySet->dwNumberOfCsAddrs;
- qDebug() << "cs addresses:" << querySet->lpcsaBuffer;
- qDebug() << "output flags:" << querySet->dwOutputFlags;
-#endif
-
- if (querySet->lpBlob) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "blob size:" << querySet->lpBlob->cbSize;
- qDebug() << "blob data:" << querySet->lpBlob->pBlobData;
-#endif
-
- DWORD offset = 0;
- do {
- NLA_BLOB *blob = reinterpret_cast<NLA_BLOB *>(querySet->lpBlob->pBlobData + offset);
- DWORD nextOffset = parseBlob(blob, cpPriv);
- if (nextOffset == offset)
- break;
- else
- offset = nextOffset;
- } while (offset != 0 && offset < querySet->lpBlob->cbSize);
- }
-
- if (QNlaEngine *engine = qobject_cast<QNlaEngine *>(parent())) {
- const QString interface = engine->getInterfaceFromId(cpPriv->id);
- cpPriv->bearerType = qGetInterfaceType(interface);
- }
-
- return cpPriv;
-}
-
-void QNlaThread::fetchConfigurations()
-{
- QList<QNetworkConfigurationPrivate *> foundConfigurations;
-
- WSAQUERYSET qsRestrictions;
- HANDLE hLookup = 0;
-
- memset(&qsRestrictions, 0, sizeof(qsRestrictions));
- qsRestrictions.dwSize = sizeof(qsRestrictions);
- qsRestrictions.dwNameSpace = NS_NLA;
-
- int result = WSALookupServiceBegin(&qsRestrictions, LUP_RETURN_ALL | LUP_DEEP, &hLookup);
- if (result == SOCKET_ERROR) {
- mutex.lock();
- fetchedConfigurations.clear();
- mutex.unlock();
- }
-
- char buffer[0x10000];
- while (result == 0) {
- DWORD bufferLength = sizeof(buffer);
- result = WSALookupServiceNext(hLookup, LUP_RETURN_ALL,
- &bufferLength, reinterpret_cast<WSAQUERYSET *>(buffer));
-
- if (result == SOCKET_ERROR)
- break;
-
- QNetworkConfigurationPrivate *cpPriv =
- parseQuerySet(reinterpret_cast<WSAQUERYSET *>(buffer));
-
- foundConfigurations.append(cpPriv);
- }
-
- if (hLookup) {
- result = WSALookupServiceEnd(hLookup);
- if (result == SOCKET_ERROR) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("WSALookupServiceEnd error %d", WSAGetLastError());
-#endif
- }
- }
-
- updateConfigurations(foundConfigurations);
-}
-
-QNlaEngine::QNlaEngine(QObject *parent)
-: QBearerEngineImpl(parent), nlaThread(0)
-{
- nlaThread = new QNlaThread(this);
- connect(nlaThread, SIGNAL(networksChanged()),
- this, SLOT(networksChanged()));
- nlaThread->start();
-
- qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
-}
-
-QNlaEngine::~QNlaEngine()
-{
- delete nlaThread;
-}
-
-void QNlaEngine::networksChanged()
-{
- QMutexLocker locker(&mutex);
-
- QStringList previous = accessPointConfigurations.keys();
-
- QList<QNetworkConfigurationPrivate *> foundConfigurations = nlaThread->getConfigurations();
- while (!foundConfigurations.isEmpty()) {
- QNetworkConfigurationPrivate *cpPriv = foundConfigurations.takeFirst();
-
- previous.removeAll(cpPriv->id);
-
- if (accessPointConfigurations.contains(cpPriv->id)) {
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(cpPriv->id);
-
- bool changed = false;
-
- ptr->mutex.lock();
-
- if (ptr->isValid != cpPriv->isValid) {
- ptr->isValid = cpPriv->isValid;
- changed = true;
- }
-
- if (ptr->name != cpPriv->name) {
- ptr->name = cpPriv->name;
- changed = true;
- }
-
- if (ptr->state != cpPriv->state) {
- ptr->state = cpPriv->state;
- changed = true;
- }
-
- ptr->mutex.unlock();
-
- if (changed) {
- locker.unlock();
- emit configurationChanged(ptr);
- locker.relock();
- }
-
- delete cpPriv;
- } else {
- QNetworkConfigurationPrivatePointer ptr(cpPriv);
-
- accessPointConfigurations.insert(ptr->id, ptr);
-
- locker.unlock();
- emit configurationAdded(ptr);
- locker.relock();
- }
- }
-
- while (!previous.isEmpty()) {
- QNetworkConfigurationPrivatePointer ptr =
- accessPointConfigurations.take(previous.takeFirst());
-
- locker.unlock();
- emit configurationRemoved(ptr);
- locker.relock();
- }
-
- locker.unlock();
- emit updateCompleted();
-}
-
-QString QNlaEngine::getInterfaceFromId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- return configurationInterface.value(id.toUInt());
-}
-
-bool QNlaEngine::hasIdentifier(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- return configurationInterface.contains(id.toUInt());
-}
-
-void QNlaEngine::connectToId(const QString &id)
-{
- emit connectionError(id, OperationNotSupported);
-}
-
-void QNlaEngine::disconnectFromId(const QString &id)
-{
- emit connectionError(id, OperationNotSupported);
-}
-
-void QNlaEngine::requestUpdate()
-{
- QMutexLocker locker(&mutex);
-
- nlaThread->forceUpdate();
-}
-
-QNetworkSession::State QNlaEngine::sessionStateForId(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- if (!ptr)
- return QNetworkSession::Invalid;
-
- if (!ptr->isValid) {
- return QNetworkSession::Invalid;
- } else if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- return QNetworkSession::Connected;
- } else if ((ptr->state & QNetworkConfiguration::Discovered) ==
- QNetworkConfiguration::Discovered) {
- return QNetworkSession::Disconnected;
- } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
- return QNetworkSession::NotAvailable;
- } else if ((ptr->state & QNetworkConfiguration::Undefined) ==
- QNetworkConfiguration::Undefined) {
- return QNetworkSession::NotAvailable;
- }
-
- return QNetworkSession::Invalid;
-}
-
-QNetworkConfigurationManager::Capabilities QNlaEngine::capabilities() const
-{
- return QNetworkConfigurationManager::ForcedRoaming;
-}
-
-QNetworkSessionPrivate *QNlaEngine::createSessionBackend()
-{
- return new QNetworkSessionPrivateImpl;
-}
-
-QNetworkConfigurationPrivatePointer QNlaEngine::defaultConfiguration()
-{
- return QNetworkConfigurationPrivatePointer();
-}
-
-#include "qnlaengine.moc"
-QT_END_NAMESPACE
-
diff --git a/src/plugins/bearer/nla/qnlaengine.h b/src/plugins/bearer/nla/qnlaengine.h
deleted file mode 100644
index ab014ff776..0000000000
--- a/src/plugins/bearer/nla/qnlaengine.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNLAENGINE_P_H
-#define QNLAENGINE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "../qbearerengine_impl.h"
-
-#include <QtNetwork/private/qnativesocketengine_p.h>
-
-#include <QMap>
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkConfigurationPrivate;
-class QNlaThread;
-
-class QWindowsSockInit2
-{
-public:
- QWindowsSockInit2();
- ~QWindowsSockInit2();
- int version;
-};
-
-class QNlaEngine : public QBearerEngineImpl
-{
- Q_OBJECT
-
- friend class QNlaThread;
-
-public:
- QNlaEngine(QObject *parent = 0);
- ~QNlaEngine();
-
- QString getInterfaceFromId(const QString &id);
- bool hasIdentifier(const QString &id);
-
- void connectToId(const QString &id);
- void disconnectFromId(const QString &id);
-
- Q_INVOKABLE void requestUpdate();
-
- QNetworkSession::State sessionStateForId(const QString &id);
-
- QNetworkConfigurationManager::Capabilities capabilities() const;
-
- QNetworkSessionPrivate *createSessionBackend();
-
- QNetworkConfigurationPrivatePointer defaultConfiguration();
-
-private Q_SLOTS:
- void networksChanged();
-
-private:
- QWindowsSockInit2 winSock;
- QNlaThread *nlaThread;
- QMap<uint, QString> configurationInterface;
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/plugins/bearer/platformdefs_win.h b/src/plugins/bearer/platformdefs_win.h
deleted file mode 100644
index 0477dc45c3..0000000000
--- a/src/plugins/bearer/platformdefs_win.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QPLATFORMDEFS_WIN_H
-#define QPLATFORMDEFS_WIN_H
-
-// Since we need to include winsock2.h, we need to define WIN32_LEAN_AND_MEAN
-// somewhere above so windows.h won't include winsock.h.
-#include <winsock2.h>
-#include <mswsock.h>
-#undef interface
-#include <wincrypt.h>
-#include <winioctl.h>
-
-QT_BEGIN_NAMESPACE
-
-#ifndef NS_NLA
-
-#define NS_NLA 15
-
-#ifndef NLA_NAMESPACE_GUID
-enum NLA_BLOB_DATA_TYPE {
- NLA_RAW_DATA = 0,
- NLA_INTERFACE = 1,
- NLA_802_1X_LOCATION = 2,
- NLA_CONNECTIVITY = 3,
- NLA_ICS = 4
-};
-
-enum NLA_CONNECTIVITY_TYPE {
- NLA_NETWORK_AD_HOC = 0,
- NLA_NETWORK_MANAGED = 1,
- NLA_NETWORK_UNMANAGED = 2,
- NLA_NETWORK_UNKNOWN = 3
-};
-
-enum NLA_INTERNET {
- NLA_INTERNET_UNKNOWN = 0,
- NLA_INTERNET_NO = 1,
- NLA_INTERNET_YES = 2
-};
-
-struct NLA_BLOB {
- struct {
- NLA_BLOB_DATA_TYPE type;
- DWORD dwSize;
- DWORD nextOffset;
- } header;
-
- union {
- // NLA_RAW_DATA
- CHAR rawData[1];
-
- // NLA_INTERFACE
- struct {
- DWORD dwType;
- DWORD dwSpeed;
- CHAR adapterName[1];
- } interfaceData;
-
- // NLA_802_1X_LOCATION
- struct {
- CHAR information[1];
- } locationData;
-
- // NLA_CONNECTIVITY
- struct {
- NLA_CONNECTIVITY_TYPE type;
- NLA_INTERNET internet;
- } connectivity;
-
- // NLA_ICS
- struct {
- struct {
- DWORD speed;
- DWORD type;
- DWORD state;
- WCHAR machineName[256];
- WCHAR sharedAdapterName[256];
- } remote;
- } ICS;
- } data;
-};
-#endif // NLA_NAMESPACE_GUID
-
-#endif
-
-enum NDIS_MEDIUM {
- NdisMedium802_3 = 0,
-};
-
-enum NDIS_PHYSICAL_MEDIUM {
- NdisPhysicalMediumWirelessLan = 1,
- NdisPhysicalMediumBluetooth = 10,
- NdisPhysicalMediumWiMax = 12,
-};
-
-#define OID_GEN_MEDIA_SUPPORTED 0x00010103
-#define OID_GEN_PHYSICAL_MEDIUM 0x00010202
-
-#define IOCTL_NDIS_QUERY_GLOBAL_STATS \
- CTL_CODE(FILE_DEVICE_PHYSICAL_NETCARD, 0, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
-
-QT_END_NAMESPACE
-
-#endif // QPLATFORMDEFS_WIN_H
diff --git a/src/plugins/bearer/qbearerengine_impl.h b/src/plugins/bearer/qbearerengine_impl.h
deleted file mode 100644
index 5c003aaaf6..0000000000
--- a/src/plugins/bearer/qbearerengine_impl.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBEARERENGINE_IMPL_H
-#define QBEARERENGINE_IMPL_H
-
-#include <QtNetwork/private/qbearerengine_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QBearerEngineImpl : public QBearerEngine
-{
- Q_OBJECT
-
-public:
- enum ConnectionError {
- InterfaceLookupError = 0,
- ConnectError,
- OperationNotSupported,
- DisconnectionError,
- };
-
- QBearerEngineImpl(QObject *parent = nullptr) : QBearerEngine(parent) {}
- ~QBearerEngineImpl() {}
-
- virtual void connectToId(const QString &id) = 0;
- virtual void disconnectFromId(const QString &id) = 0;
-
- virtual QString getInterfaceFromId(const QString &id) = 0;
-
- virtual QNetworkSession::State sessionStateForId(const QString &id) = 0;
-
- virtual quint64 bytesWritten(const QString &) { return Q_UINT64_C(0); }
- virtual quint64 bytesReceived(const QString &) { return Q_UINT64_C(0); }
- virtual quint64 startTime(const QString &) { return Q_UINT64_C(0); }
-
-Q_SIGNALS:
- void connectionError(const QString &id, QBearerEngineImpl::ConnectionError error);
-};
-
-QT_END_NAMESPACE
-
-Q_DECLARE_METATYPE(QBearerEngineImpl::ConnectionError)
-
-#endif // QBEARERENGINE_IMPL_H
diff --git a/src/plugins/bearer/qnetworksession_impl.cpp b/src/plugins/bearer/qnetworksession_impl.cpp
deleted file mode 100644
index 8eba9ccc42..0000000000
--- a/src/plugins/bearer/qnetworksession_impl.cpp
+++ /dev/null
@@ -1,435 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-// see comment in ../platformdefs_win.h.
-#define WIN32_LEAN_AND_MEAN 1
-
-#include "qnetworksession_impl.h"
-#include "qbearerengine_impl.h"
-
-#include <QtNetwork/qnetworksession.h>
-#include <QtNetwork/private/qnetworkconfigmanager_p.h>
-
-#include <QtCore/qdatetime.h>
-#include <QtCore/qdebug.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qstringlist.h>
-
-QT_BEGIN_NAMESPACE
-
-static QBearerEngineImpl *getEngineFromId(const QString &id)
-{
- QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
- if (priv) {
- const auto engines = priv->engines();
- for (QBearerEngine *engine : engines) {
- QBearerEngineImpl *engineImpl = qobject_cast<QBearerEngineImpl *>(engine);
- if (engineImpl && engineImpl->hasIdentifier(id))
- return engineImpl;
- }
- }
-
- return nullptr;
-}
-
-class QNetworkSessionManagerPrivate : public QObject
-{
- Q_OBJECT
-
-public:
- QNetworkSessionManagerPrivate(QObject *parent = nullptr) : QObject(parent) {}
- ~QNetworkSessionManagerPrivate() {}
-
- inline void forceSessionClose(const QNetworkConfiguration &config)
- { emit forcedSessionClose(config); }
-
-Q_SIGNALS:
- void forcedSessionClose(const QNetworkConfiguration &config);
-};
-
-Q_GLOBAL_STATIC(QNetworkSessionManagerPrivate, sessionManager);
-
-void QNetworkSessionPrivateImpl::syncStateWithInterface()
-{
- connect(sessionManager(), SIGNAL(forcedSessionClose(QNetworkConfiguration)),
- this, SLOT(forcedSessionClose(QNetworkConfiguration)));
-
- opened = false;
- isOpen = false;
- state = QNetworkSession::Invalid;
- lastError = QNetworkSession::UnknownSessionError;
-
- qRegisterMetaType<QBearerEngineImpl::ConnectionError>();
-
- switch (publicConfig.type()) {
- case QNetworkConfiguration::InternetAccessPoint:
- activeConfig = publicConfig;
- engine = getEngineFromId(activeConfig.identifier());
- if (engine) {
- qRegisterMetaType<QNetworkConfigurationPrivatePointer>();
- connect(engine, SIGNAL(configurationChanged(QNetworkConfigurationPrivatePointer)),
- this, SLOT(configurationChanged(QNetworkConfigurationPrivatePointer)),
- Qt::QueuedConnection);
- connect(engine, SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)),
- this, SLOT(connectionError(QString,QBearerEngineImpl::ConnectionError)),
- Qt::QueuedConnection);
- }
- break;
- case QNetworkConfiguration::ServiceNetwork:
- serviceConfig = publicConfig;
- // Defer setting engine and signals until open().
- Q_FALLTHROUGH();
- case QNetworkConfiguration::UserChoice:
- // Defer setting serviceConfig and activeConfig until open().
- Q_FALLTHROUGH();
- default:
- engine = nullptr;
- }
-
- networkConfigurationsChanged();
-}
-
-void QNetworkSessionPrivateImpl::open()
-{
- if (serviceConfig.isValid()) {
- lastError = QNetworkSession::OperationNotSupportedError;
- emit QNetworkSessionPrivate::error(lastError);
- } else if (!isOpen) {
- if ((activeConfig.state() & QNetworkConfiguration::Discovered) != QNetworkConfiguration::Discovered) {
- lastError = QNetworkSession::InvalidConfigurationError;
- state = QNetworkSession::Invalid;
- emit stateChanged(state);
- emit QNetworkSessionPrivate::error(lastError);
- return;
- }
- opened = true;
-
- if ((activeConfig.state() & QNetworkConfiguration::Active) != QNetworkConfiguration::Active &&
- (activeConfig.state() & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered) {
- state = QNetworkSession::Connecting;
- emit stateChanged(state);
-
- engine->connectToId(activeConfig.identifier());
- }
-
- isOpen = (activeConfig.state() & QNetworkConfiguration::Active) == QNetworkConfiguration::Active;
- if (isOpen)
- emit quitPendingWaitsForOpened();
- }
-}
-
-void QNetworkSessionPrivateImpl::close()
-{
- if (serviceConfig.isValid()) {
- lastError = QNetworkSession::OperationNotSupportedError;
- emit QNetworkSessionPrivate::error(lastError);
- } else if (isOpen) {
- opened = false;
- isOpen = false;
- emit closed();
- }
-}
-
-void QNetworkSessionPrivateImpl::stop()
-{
- if (serviceConfig.isValid()) {
- lastError = QNetworkSession::OperationNotSupportedError;
- emit QNetworkSessionPrivate::error(lastError);
- } else {
- if ((activeConfig.state() & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- state = QNetworkSession::Closing;
- emit stateChanged(state);
-
- engine->disconnectFromId(activeConfig.identifier());
-
- sessionManager()->forceSessionClose(activeConfig);
- }
-
- opened = false;
- isOpen = false;
- emit closed();
- }
-}
-
-void QNetworkSessionPrivateImpl::migrate()
-{
-}
-
-void QNetworkSessionPrivateImpl::accept()
-{
-}
-
-void QNetworkSessionPrivateImpl::ignore()
-{
-}
-
-void QNetworkSessionPrivateImpl::reject()
-{
-}
-
-#ifndef QT_NO_NETWORKINTERFACE
-QNetworkInterface QNetworkSessionPrivateImpl::currentInterface() const
-{
- if (!engine || state != QNetworkSession::Connected || !publicConfig.isValid())
- return QNetworkInterface();
-
- QString iface = engine->getInterfaceFromId(activeConfig.identifier());
- if (iface.isEmpty())
- return QNetworkInterface();
- return QNetworkInterface::interfaceFromName(iface);
-}
-#endif
-
-QVariant QNetworkSessionPrivateImpl::sessionProperty(const QString &key) const
-{
- if (key == QLatin1String("AutoCloseSessionTimeout")) {
- if (engine && engine->requiresPolling() &&
- !(engine->capabilities() & QNetworkConfigurationManager::CanStartAndStopInterfaces)) {
- return sessionTimeout >= 0 ? sessionTimeout * 10000 : -1;
- }
- }
-
- return QVariant();
-}
-
-void QNetworkSessionPrivateImpl::setSessionProperty(const QString &key, const QVariant &value)
-{
- if (key == QLatin1String("AutoCloseSessionTimeout")) {
- if (engine && engine->requiresPolling() &&
- !(engine->capabilities() & QNetworkConfigurationManager::CanStartAndStopInterfaces)) {
- int timeout = value.toInt();
- if (timeout >= 0) {
- connect(engine, SIGNAL(updateCompleted()),
- this, SLOT(decrementTimeout()), Qt::UniqueConnection);
- sessionTimeout = timeout / 10000; // convert to poll intervals
- } else {
- disconnect(engine, SIGNAL(updateCompleted()), this, SLOT(decrementTimeout()));
- sessionTimeout = -1;
- }
- }
- }
-}
-
-QString QNetworkSessionPrivateImpl::errorString() const
-{
- switch (lastError) {
- case QNetworkSession::UnknownSessionError:
- return tr("Unknown session error.");
- case QNetworkSession::SessionAbortedError:
- return tr("The session was aborted by the user or system.");
- case QNetworkSession::OperationNotSupportedError:
- return tr("The requested operation is not supported by the system.");
- case QNetworkSession::InvalidConfigurationError:
- return tr("The specified configuration cannot be used.");
- case QNetworkSession::RoamingError:
- return tr("Roaming was aborted or is not possible.");
- default:
- break;
- }
-
- return QString();
-}
-
-QNetworkSession::SessionError QNetworkSessionPrivateImpl::error() const
-{
- return lastError;
-}
-
-quint64 QNetworkSessionPrivateImpl::bytesWritten() const
-{
- if (engine && state == QNetworkSession::Connected)
- return engine->bytesWritten(activeConfig.identifier());
- return Q_UINT64_C(0);
-}
-
-quint64 QNetworkSessionPrivateImpl::bytesReceived() const
-{
- if (engine && state == QNetworkSession::Connected)
- return engine->bytesReceived(activeConfig.identifier());
- return Q_UINT64_C(0);
-}
-
-quint64 QNetworkSessionPrivateImpl::activeTime() const
-{
- if (state == QNetworkSession::Connected && startTime != Q_UINT64_C(0))
- return QDateTime::currentSecsSinceEpoch() - startTime;
- return Q_UINT64_C(0);
-}
-
-QNetworkSession::UsagePolicies QNetworkSessionPrivateImpl::usagePolicies() const
-{
- return currentPolicies;
-}
-
-void QNetworkSessionPrivateImpl::setUsagePolicies(QNetworkSession::UsagePolicies newPolicies)
-{
- if (newPolicies != currentPolicies) {
- currentPolicies = newPolicies;
- emit usagePoliciesChanged(currentPolicies);
- }
-}
-
-void QNetworkSessionPrivateImpl::updateStateFromServiceNetwork()
-{
- QNetworkSession::State oldState = state;
-
- const auto configs = serviceConfig.children();
- for (const QNetworkConfiguration &config : configs) {
- if ((config.state() & QNetworkConfiguration::Active) != QNetworkConfiguration::Active)
- continue;
-
- if (activeConfig != config) {
- if (engine) {
- disconnect(engine, SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)),
- this, SLOT(connectionError(QString,QBearerEngineImpl::ConnectionError)));
- }
-
- activeConfig = config;
- engine = getEngineFromId(activeConfig.identifier());
-
- if (engine) {
- connect(engine, SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)),
- this, SLOT(connectionError(QString,QBearerEngineImpl::ConnectionError)),
- Qt::QueuedConnection);
- }
- emit newConfigurationActivated();
- }
-
- state = QNetworkSession::Connected;
- if (state != oldState)
- emit stateChanged(state);
-
- return;
- }
-
- if (serviceConfig.children().isEmpty())
- state = QNetworkSession::NotAvailable;
- else
- state = QNetworkSession::Disconnected;
-
- if (state != oldState)
- emit stateChanged(state);
-}
-
-void QNetworkSessionPrivateImpl::updateStateFromActiveConfig()
-{
- if (!engine)
- return;
-
- QNetworkSession::State oldState = state;
- state = engine->sessionStateForId(activeConfig.identifier());
-
- bool oldActive = isOpen;
- isOpen = (state == QNetworkSession::Connected) ? opened : false;
-
- if (!oldActive && isOpen)
- emit quitPendingWaitsForOpened();
- if (oldActive && !isOpen)
- emit closed();
-
- if (oldState != state)
- emit stateChanged(state);
-}
-
-void QNetworkSessionPrivateImpl::networkConfigurationsChanged()
-{
- if (serviceConfig.isValid())
- updateStateFromServiceNetwork();
- else
- updateStateFromActiveConfig();
-
- if (engine)
- startTime = engine->startTime(activeConfig.identifier());
-}
-
-void QNetworkSessionPrivateImpl::configurationChanged(QNetworkConfigurationPrivatePointer config)
-{
- if (serviceConfig.isValid() &&
- (config->id == serviceConfig.identifier() || config->id == activeConfig.identifier())) {
- updateStateFromServiceNetwork();
- } else if (config->id == activeConfig.identifier()) {
- updateStateFromActiveConfig();
- }
-}
-
-void QNetworkSessionPrivateImpl::forcedSessionClose(const QNetworkConfiguration &config)
-{
- if (activeConfig == config) {
- opened = false;
- isOpen = false;
-
- emit closed();
-
- lastError = QNetworkSession::SessionAbortedError;
- emit QNetworkSessionPrivate::error(lastError);
- }
-}
-
-void QNetworkSessionPrivateImpl::connectionError(const QString &id, QBearerEngineImpl::ConnectionError error)
-{
- if (activeConfig.identifier() == id) {
- networkConfigurationsChanged();
- switch (error) {
- case QBearerEngineImpl::OperationNotSupported:
- lastError = QNetworkSession::OperationNotSupportedError;
- opened = false;
- break;
- case QBearerEngineImpl::InterfaceLookupError:
- case QBearerEngineImpl::ConnectError:
- case QBearerEngineImpl::DisconnectionError:
- default:
- lastError = QNetworkSession::UnknownSessionError;
- }
-
- emit QNetworkSessionPrivate::error(lastError);
- }
-}
-
-void QNetworkSessionPrivateImpl::decrementTimeout()
-{
- if (--sessionTimeout <= 0) {
- disconnect(engine, SIGNAL(updateCompleted()), this, SLOT(decrementTimeout()));
- sessionTimeout = -1;
- close();
- }
-}
-
-QT_END_NAMESPACE
-
-#include "qnetworksession_impl.moc"
diff --git a/src/plugins/bearer/qnetworksession_impl.h b/src/plugins/bearer/qnetworksession_impl.h
deleted file mode 100644
index 0f8e014900..0000000000
--- a/src/plugins/bearer/qnetworksession_impl.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNETWORKSESSION_IMPL_H
-#define QNETWORKSESSION_IMPL_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qbearerengine_impl.h"
-
-#include <QtNetwork/private/qnetworkconfigmanager_p.h>
-#include <QtNetwork/private/qnetworksession_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QBearerEngineImpl;
-
-class QNetworkSessionPrivateImpl : public QNetworkSessionPrivate
-{
- Q_OBJECT
-
-public:
- QNetworkSessionPrivateImpl()
- : engine(nullptr), startTime(0), lastError(QNetworkSession::UnknownSessionError), sessionTimeout(-1), currentPolicies(QNetworkSession::NoPolicy), opened(false)
- {}
- ~QNetworkSessionPrivateImpl()
- {}
-
- //called by QNetworkSession constructor and ensures
- //that the state is immediately updated (w/o actually opening
- //a session). Also this function should take care of
- //notification hooks to discover future state changes.
- void syncStateWithInterface() override;
-
-#ifndef QT_NO_NETWORKINTERFACE
- QNetworkInterface currentInterface() const override;
-#endif
- QVariant sessionProperty(const QString& key) const override;
- void setSessionProperty(const QString& key, const QVariant& value) override;
-
- void open() override;
- void close() override;
- void stop() override;
- void migrate() override;
- void accept() override;
- void ignore() override;
- void reject() override;
-
- QString errorString() const override; //must return translated string
- QNetworkSession::SessionError error() const override;
-
- quint64 bytesWritten() const override;
- quint64 bytesReceived() const override;
- quint64 activeTime() const override;
-
- QNetworkSession::UsagePolicies usagePolicies() const override;
- void setUsagePolicies(QNetworkSession::UsagePolicies) override;
-
-private Q_SLOTS:
- void networkConfigurationsChanged();
- void configurationChanged(QNetworkConfigurationPrivatePointer config);
- void forcedSessionClose(const QNetworkConfiguration &config);
- void connectionError(const QString &id, QBearerEngineImpl::ConnectionError error);
- void decrementTimeout();
-
-private:
- void updateStateFromServiceNetwork();
- void updateStateFromActiveConfig();
-
-private:
- QBearerEngineImpl *engine;
-
- quint64 startTime;
-
- QNetworkSession::SessionError lastError;
-
- int sessionTimeout;
- QNetworkSession::UsagePolicies currentPolicies;
-
- bool opened;
-};
-
-QT_END_NAMESPACE
-
-#endif // QNETWORKSESSION_IMPL_H
diff --git a/src/plugins/generic/.prev_CMakeLists.txt b/src/plugins/generic/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..b3851ffbd1
--- /dev/null
+++ b/src/plugins/generic/.prev_CMakeLists.txt
@@ -0,0 +1,23 @@
+# Generated from generic.pro.
+
+if(QT_FEATURE_evdev)
+ add_subdirectory(evdevmouse)
+ add_subdirectory(evdevtouch)
+ add_subdirectory(evdevkeyboard)
+endif()
+if(QT_FEATURE_evdev AND QT_FEATURE_tabletevent)
+ add_subdirectory(evdevtablet)
+endif()
+if(QT_FEATURE_tslib)
+ add_subdirectory(tslib)
+endif()
+if(QT_FEATURE_tuiotouch)
+ add_subdirectory(tuiotouch)
+endif()
+if(QT_FEATURE_libinput)
+ add_subdirectory(libinput)
+endif()
+if(FREEBSD)
+ add_subdirectory(bsdkeyboard)
+ add_subdirectory(bsdmouse)
+endif()
diff --git a/src/plugins/generic/CMakeLists.txt b/src/plugins/generic/CMakeLists.txt
new file mode 100644
index 0000000000..f5890d0961
--- /dev/null
+++ b/src/plugins/generic/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Generated from generic.pro.
+
+if(QT_FEATURE_evdev)
+ add_subdirectory(evdevmouse)
+ add_subdirectory(evdevtouch)
+ add_subdirectory(evdevkeyboard)
+endif()
+if(QT_FEATURE_evdev AND QT_FEATURE_tabletevent)
+ add_subdirectory(evdevtablet)
+endif()
+if(QT_FEATURE_tslib)
+ add_subdirectory(tslib)
+endif()
+if(QT_FEATURE_tuiotouch)
+ add_subdirectory(tuiotouch)
+endif()
+if(QT_FEATURE_libinput)
+ add_subdirectory(libinput)
+endif()
+if(FREEBSD)
+ # add_subdirectory(bsdkeyboard) # special case TODO
+ # add_subdirectory(bsdmouse) # special case TODO
+endif()
diff --git a/src/plugins/generic/evdevkeyboard/CMakeLists.txt b/src/plugins/generic/evdevkeyboard/CMakeLists.txt
new file mode 100644
index 0000000000..86f5c36124
--- /dev/null
+++ b/src/plugins/generic/evdevkeyboard/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Generated from evdevkeyboard.pro.
+
+#####################################################################
+## QEvdevKeyboardPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QEvdevKeyboardPlugin
+ OUTPUT_NAME qevdevkeyboardplugin
+ TYPE generic
+ SOURCES
+ main.cpp
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::InputSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:evdevkeyboard.pro:<TRUE>:
+# OTHER_FILES = "evdevkeyboard.json"
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/generic/evdevmouse/CMakeLists.txt b/src/plugins/generic/evdevmouse/CMakeLists.txt
new file mode 100644
index 0000000000..2ed6c1b6d4
--- /dev/null
+++ b/src/plugins/generic/evdevmouse/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Generated from evdevmouse.pro.
+
+#####################################################################
+## QEvdevMousePlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QEvdevMousePlugin
+ OUTPUT_NAME qevdevmouseplugin
+ TYPE generic
+ SOURCES
+ main.cpp
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::InputSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:evdevmouse.pro:<TRUE>:
+# OTHER_FILES = "evdevmouse.json"
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/generic/evdevtablet/CMakeLists.txt b/src/plugins/generic/evdevtablet/CMakeLists.txt
new file mode 100644
index 0000000000..93dd10a0e1
--- /dev/null
+++ b/src/plugins/generic/evdevtablet/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Generated from evdevtablet.pro.
+
+#####################################################################
+## QEvdevTabletPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QEvdevTabletPlugin
+ OUTPUT_NAME qevdevtabletplugin
+ TYPE generic
+ SOURCES
+ main.cpp
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::InputSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:evdevtablet.pro:<TRUE>:
+# OTHER_FILES = "evdevtablet.json"
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/generic/evdevtouch/CMakeLists.txt b/src/plugins/generic/evdevtouch/CMakeLists.txt
new file mode 100644
index 0000000000..e4a4d40c2a
--- /dev/null
+++ b/src/plugins/generic/evdevtouch/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Generated from evdevtouch.pro.
+
+#####################################################################
+## QEvdevTouchScreenPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QEvdevTouchScreenPlugin
+ OUTPUT_NAME qevdevtouchplugin
+ TYPE generic
+ SOURCES
+ main.cpp
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::InputSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:evdevtouch.pro:<TRUE>:
+# OTHER_FILES = "evdevtouch.json"
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/generic/libinput/CMakeLists.txt b/src/plugins/generic/libinput/CMakeLists.txt
new file mode 100644
index 0000000000..b772623307
--- /dev/null
+++ b/src/plugins/generic/libinput/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Generated from libinput.pro.
+
+#####################################################################
+## QLibInputPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QLibInputPlugin
+ OUTPUT_NAME qlibinputplugin
+ TYPE generic
+ SOURCES
+ main.cpp
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::InputSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:libinput.pro:<TRUE>:
+# OTHER_FILES = "libinput.json"
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/generic/tslib/.prev_CMakeLists.txt b/src/plugins/generic/tslib/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..3e82a077c3
--- /dev/null
+++ b/src/plugins/generic/tslib/.prev_CMakeLists.txt
@@ -0,0 +1,23 @@
+# Generated from tslib.pro.
+
+#####################################################################
+## QTsLibPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QTsLibPlugin
+ OUTPUT_NAME qtslibplugin
+ TYPE generic
+ SOURCES
+ main.cpp
+ PUBLIC_LIBRARIES
+ PkgConfig::Tslib
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::InputSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:tslib.pro:<TRUE>:
+# OTHER_FILES = "tslib.json"
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/generic/tslib/CMakeLists.txt b/src/plugins/generic/tslib/CMakeLists.txt
new file mode 100644
index 0000000000..964e322a55
--- /dev/null
+++ b/src/plugins/generic/tslib/CMakeLists.txt
@@ -0,0 +1,25 @@
+# Generated from tslib.pro.
+
+qt_find_package(Tslib) # special case
+
+#####################################################################
+## QTsLibPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QTsLibPlugin
+ OUTPUT_NAME qtslibplugin
+ TYPE generic
+ SOURCES
+ main.cpp
+ PUBLIC_LIBRARIES
+ PkgConfig::Tslib
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::InputSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:tslib.pro:<TRUE>:
+# OTHER_FILES = "tslib.json"
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/generic/tuiotouch/CMakeLists.txt b/src/plugins/generic/tuiotouch/CMakeLists.txt
new file mode 100644
index 0000000000..82db49d4c3
--- /dev/null
+++ b/src/plugins/generic/tuiotouch/CMakeLists.txt
@@ -0,0 +1,29 @@
+# Generated from tuiotouch.pro.
+
+#####################################################################
+## QTuioTouchPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QTuioTouchPlugin
+ OUTPUT_NAME qtuiotouchplugin
+ TYPE generic
+ SOURCES
+ main.cpp
+ qoscbundle.cpp qoscbundle_p.h
+ qoscmessage.cpp qoscmessage_p.h
+ qtuiocursor_p.h
+ qtuiohandler.cpp qtuiohandler_p.h
+ qtuiotoken_p.h
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::Network
+)
+
+#### Keys ignored in scope 1:.:.:tuiotouch.pro:<TRUE>:
+# OTHER_FILES = "tuiotouch.json"
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/imageformats/CMakeLists.txt b/src/plugins/imageformats/CMakeLists.txt
new file mode 100644
index 0000000000..00fefbdc0d
--- /dev/null
+++ b/src/plugins/imageformats/CMakeLists.txt
@@ -0,0 +1,11 @@
+# Generated from imageformats.pro.
+
+if(QT_FEATURE_ico)
+ add_subdirectory(ico)
+endif()
+if(QT_FEATURE_jpeg)
+ add_subdirectory(jpeg)
+endif()
+if(QT_FEATURE_gif)
+ add_subdirectory(gif)
+endif()
diff --git a/src/plugins/imageformats/gif/.prev_CMakeLists.txt b/src/plugins/imageformats/gif/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..b4923b81b1
--- /dev/null
+++ b/src/plugins/imageformats/gif/.prev_CMakeLists.txt
@@ -0,0 +1,19 @@
+# Generated from gif.pro.
+
+#####################################################################
+## QGifPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QGifPlugin
+ OUTPUT_NAME qgif
+ TYPE imageformats
+ SOURCES
+ main.cpp main.h
+ qgifhandler.cpp qgifhandler_p.h
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::Gui
+)
+
+#### Keys ignored in scope 1:.:.:gif.pro:<TRUE>:
+# OTHER_FILES = "gif.json"
diff --git a/src/plugins/imageformats/gif/CMakeLists.txt b/src/plugins/imageformats/gif/CMakeLists.txt
new file mode 100644
index 0000000000..c6780e32e9
--- /dev/null
+++ b/src/plugins/imageformats/gif/CMakeLists.txt
@@ -0,0 +1,20 @@
+# Generated from gif.pro.
+
+#####################################################################
+## QGifPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QGifPlugin
+ OUTPUT_NAME qgif
+ TYPE imageformats
+ SOURCES
+ main.cpp main.h
+ qgifhandler.cpp qgifhandler_p.h
+ LIBRARIES # special case
+ Qt::GuiPrivate # special case
+ PUBLIC_LIBRARIES # special case
+ Qt::Gui # special case
+)
+
+#### Keys ignored in scope 1:.:.:gif.pro:<TRUE>:
+# OTHER_FILES = "gif.json"
diff --git a/src/plugins/imageformats/gif/qgifhandler.cpp b/src/plugins/imageformats/gif/qgifhandler.cpp
index 61981b305f..d45ebfb314 100644
--- a/src/plugins/imageformats/gif/qgifhandler.cpp
+++ b/src/plugins/imageformats/gif/qgifhandler.cpp
@@ -246,7 +246,7 @@ int QGIFFormat::decode(QImage *image, const uchar *buffer, int length,
}
image->detach();
- int bpl = image->bytesPerLine();
+ qsizetype bpl = image->bytesPerLine();
unsigned char *bits = image->bits();
#define LM(l, m) (((m)<<8)|l)
@@ -422,7 +422,7 @@ int QGIFFormat::decode(QImage *image, const uchar *buffer, int length,
}
memset(backingstore.bits(), 0, backingstore.sizeInBytes());
}
- const int dest_bpl = backingstore.bytesPerLine();
+ const qsizetype dest_bpl = backingstore.bytesPerLine();
unsigned char *dest_data = backingstore.bits();
for (int ln=0; ln<h; ln++) {
memcpy(FAST_SCAN_LINE(dest_data, dest_bpl, ln),
diff --git a/src/plugins/imageformats/ico/.prev_CMakeLists.txt b/src/plugins/imageformats/ico/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..6151d6fd07
--- /dev/null
+++ b/src/plugins/imageformats/ico/.prev_CMakeLists.txt
@@ -0,0 +1,21 @@
+# Generated from ico.pro.
+
+#####################################################################
+## QICOPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QICOPlugin
+ OUTPUT_NAME qico
+ TYPE imageformats
+ SOURCES
+ main.cpp main.h
+ qicohandler.cpp qicohandler.h
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::Gui
+)
+
+#### Keys ignored in scope 1:.:.:ico.pro:<TRUE>:
+# OTHER_FILES = "ico.json"
diff --git a/src/plugins/imageformats/ico/CMakeLists.txt b/src/plugins/imageformats/ico/CMakeLists.txt
new file mode 100644
index 0000000000..1174848d5e
--- /dev/null
+++ b/src/plugins/imageformats/ico/CMakeLists.txt
@@ -0,0 +1,20 @@
+# Generated from ico.pro.
+
+#####################################################################
+## QICOPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QICOPlugin
+ OUTPUT_NAME qico
+ TYPE imageformats
+ SOURCES
+ main.cpp main.h
+ qicohandler.cpp qicohandler.h
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+)
+
+#### Keys ignored in scope 1:.:.:ico.pro:<TRUE>:
+# OTHER_FILES = "ico.json"
diff --git a/src/plugins/imageformats/ico/qicohandler.cpp b/src/plugins/imageformats/ico/qicohandler.cpp
index 88ff1f8391..4c8ff7d489 100644
--- a/src/plugins/imageformats/ico/qicohandler.cpp
+++ b/src/plugins/imageformats/ico/qicohandler.cpp
@@ -356,7 +356,7 @@ void ICOReader::read1BitBMP(QImage & image)
if (iod) {
int h = image.height();
- int bpl = image.bytesPerLine();
+ qsizetype bpl = image.bytesPerLine();
while (--h >= 0) {
if (iod->read((char*)image.scanLine(h),bpl) != bpl) {
@@ -405,7 +405,7 @@ void ICOReader::read8BitBMP(QImage & image)
if (iod) {
int h = icoAttrib.h;
- int bpl = image.bytesPerLine();
+ qsizetype bpl = image.bytesPerLine();
while (--h >= 0) {
if (iod->read((char *)image.scanLine(h), bpl) != bpl) {
@@ -425,7 +425,7 @@ void ICOReader::read16_24_32BMP(QImage & image)
QRgb *p;
QRgb *end;
uchar *buf = new uchar[image.bytesPerLine()];
- int bpl = ((icoAttrib.w*icoAttrib.nbits+31)/32)*4;
+ qsizetype bpl = ((qsizetype(icoAttrib.w)*icoAttrib.nbits+31)/32)*4;
uchar *b;
while (--h >= 0) {
diff --git a/src/plugins/imageformats/jpeg/.prev_CMakeLists.txt b/src/plugins/imageformats/jpeg/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..a02c8f05ed
--- /dev/null
+++ b/src/plugins/imageformats/jpeg/.prev_CMakeLists.txt
@@ -0,0 +1,94 @@
+# Generated from jpeg.pro.
+
+#####################################################################
+## QJpegPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QJpegPlugin
+ OUTPUT_NAME qjpeg
+ TYPE imageformats
+ SOURCES
+ main.cpp main.h
+ qjpeghandler.cpp qjpeghandler_p.h
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:jpeg.pro:<TRUE>:
+# OTHER_FILES = "jpeg.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QJpegPlugin CONDITION QT_FEATURE_system_jpeg
+ PUBLIC_LIBRARIES
+ JPEG::JPEG
+)
+
+qt_extend_target(QJpegPlugin CONDITION NOT QT_FEATURE_system_jpeg
+ SOURCES
+ ../../../3rdparty/libjpeg/src/jaricom.c
+ ../../../3rdparty/libjpeg/src/jcapimin.c
+ ../../../3rdparty/libjpeg/src/jcapistd.c
+ ../../../3rdparty/libjpeg/src/jcarith.c
+ ../../../3rdparty/libjpeg/src/jccoefct.c
+ ../../../3rdparty/libjpeg/src/jccolor.c
+ ../../../3rdparty/libjpeg/src/jcdctmgr.c
+ ../../../3rdparty/libjpeg/src/jchuff.c
+ ../../../3rdparty/libjpeg/src/jcinit.c
+ ../../../3rdparty/libjpeg/src/jcmainct.c
+ ../../../3rdparty/libjpeg/src/jcmarker.c
+ ../../../3rdparty/libjpeg/src/jcmaster.c
+ ../../../3rdparty/libjpeg/src/jcomapi.c
+ ../../../3rdparty/libjpeg/src/jcparam.c
+ ../../../3rdparty/libjpeg/src/jcphuff.c
+ ../../../3rdparty/libjpeg/src/jcprepct.c
+ ../../../3rdparty/libjpeg/src/jcsample.c
+ ../../../3rdparty/libjpeg/src/jctrans.c
+ ../../../3rdparty/libjpeg/src/jdapimin.c
+ ../../../3rdparty/libjpeg/src/jdapistd.c
+ ../../../3rdparty/libjpeg/src/jdarith.c
+ ../../../3rdparty/libjpeg/src/jdatadst.c
+ ../../../3rdparty/libjpeg/src/jdatasrc.c
+ ../../../3rdparty/libjpeg/src/jdcoefct.c
+ ../../../3rdparty/libjpeg/src/jdcolor.c
+ ../../../3rdparty/libjpeg/src/jddctmgr.c
+ ../../../3rdparty/libjpeg/src/jdhuff.c
+ ../../../3rdparty/libjpeg/src/jdinput.c
+ ../../../3rdparty/libjpeg/src/jdmainct.c
+ ../../../3rdparty/libjpeg/src/jdmarker.c
+ ../../../3rdparty/libjpeg/src/jdmaster.c
+ ../../../3rdparty/libjpeg/src/jdmerge.c
+ ../../../3rdparty/libjpeg/src/jdphuff.c
+ ../../../3rdparty/libjpeg/src/jdpostct.c
+ ../../../3rdparty/libjpeg/src/jdsample.c
+ ../../../3rdparty/libjpeg/src/jdtrans.c
+ ../../../3rdparty/libjpeg/src/jerror.c
+ ../../../3rdparty/libjpeg/src/jfdctflt.c
+ ../../../3rdparty/libjpeg/src/jfdctfst.c
+ ../../../3rdparty/libjpeg/src/jfdctint.c
+ ../../../3rdparty/libjpeg/src/jidctflt.c
+ ../../../3rdparty/libjpeg/src/jidctfst.c
+ ../../../3rdparty/libjpeg/src/jidctint.c
+ ../../../3rdparty/libjpeg/src/jidctred.c
+ ../../../3rdparty/libjpeg/src/jmemmgr.c
+ ../../../3rdparty/libjpeg/src/jmemnobs.c
+ ../../../3rdparty/libjpeg/src/jquant1.c
+ ../../../3rdparty/libjpeg/src/jquant2.c
+ ../../../3rdparty/libjpeg/src/jsimd_none.c
+ ../../../3rdparty/libjpeg/src/jutils.c
+ INCLUDE_DIRECTORIES
+ ../../../3rdparty/libjpeg
+ ../../../3rdparty/libjpeg/src
+)
+
+qt_extend_target(QJpegPlugin CONDITION WINRT AND NOT QT_FEATURE_system_jpeg
+ DEFINES
+ NO_GETENV
+)
+
+#### Keys ignored in scope 6:.:../../../3rdparty:../../../3rdparty/libjpeg.pri:GCC:
+# QMAKE_CFLAGS_WARN_ON = "-Wno-unused-parameter" "-Wno-main"
diff --git a/src/plugins/imageformats/jpeg/CMakeLists.txt b/src/plugins/imageformats/jpeg/CMakeLists.txt
new file mode 100644
index 0000000000..13d28c7b8b
--- /dev/null
+++ b/src/plugins/imageformats/jpeg/CMakeLists.txt
@@ -0,0 +1,96 @@
+# Generated from jpeg.pro.
+
+qt_find_package(JPEG) # special case
+
+#####################################################################
+## QJpegPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QJpegPlugin
+ OUTPUT_NAME qjpeg
+ TYPE imageformats
+ SOURCES
+ main.cpp main.h
+ qjpeghandler.cpp qjpeghandler_p.h
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:jpeg.pro:<TRUE>:
+# OTHER_FILES = "jpeg.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QJpegPlugin CONDITION QT_FEATURE_system_jpeg
+ PUBLIC_LIBRARIES
+ JPEG::JPEG
+)
+
+qt_extend_target(QJpegPlugin CONDITION NOT QT_FEATURE_system_jpeg
+ SOURCES
+ ../../../3rdparty/libjpeg/src/jaricom.c
+ ../../../3rdparty/libjpeg/src/jcapimin.c
+ ../../../3rdparty/libjpeg/src/jcapistd.c
+ ../../../3rdparty/libjpeg/src/jcarith.c
+ ../../../3rdparty/libjpeg/src/jccoefct.c
+ ../../../3rdparty/libjpeg/src/jccolor.c
+ ../../../3rdparty/libjpeg/src/jcdctmgr.c
+ ../../../3rdparty/libjpeg/src/jchuff.c
+ ../../../3rdparty/libjpeg/src/jcinit.c
+ ../../../3rdparty/libjpeg/src/jcmainct.c
+ ../../../3rdparty/libjpeg/src/jcmarker.c
+ ../../../3rdparty/libjpeg/src/jcmaster.c
+ ../../../3rdparty/libjpeg/src/jcomapi.c
+ ../../../3rdparty/libjpeg/src/jcparam.c
+ ../../../3rdparty/libjpeg/src/jcphuff.c
+ ../../../3rdparty/libjpeg/src/jcprepct.c
+ ../../../3rdparty/libjpeg/src/jcsample.c
+ ../../../3rdparty/libjpeg/src/jctrans.c
+ ../../../3rdparty/libjpeg/src/jdapimin.c
+ ../../../3rdparty/libjpeg/src/jdapistd.c
+ ../../../3rdparty/libjpeg/src/jdarith.c
+ ../../../3rdparty/libjpeg/src/jdatadst.c
+ ../../../3rdparty/libjpeg/src/jdatasrc.c
+ ../../../3rdparty/libjpeg/src/jdcoefct.c
+ ../../../3rdparty/libjpeg/src/jdcolor.c
+ ../../../3rdparty/libjpeg/src/jddctmgr.c
+ ../../../3rdparty/libjpeg/src/jdhuff.c
+ ../../../3rdparty/libjpeg/src/jdinput.c
+ ../../../3rdparty/libjpeg/src/jdmainct.c
+ ../../../3rdparty/libjpeg/src/jdmarker.c
+ ../../../3rdparty/libjpeg/src/jdmaster.c
+ ../../../3rdparty/libjpeg/src/jdmerge.c
+ ../../../3rdparty/libjpeg/src/jdphuff.c
+ ../../../3rdparty/libjpeg/src/jdpostct.c
+ ../../../3rdparty/libjpeg/src/jdsample.c
+ ../../../3rdparty/libjpeg/src/jdtrans.c
+ ../../../3rdparty/libjpeg/src/jerror.c
+ ../../../3rdparty/libjpeg/src/jfdctflt.c
+ ../../../3rdparty/libjpeg/src/jfdctfst.c
+ ../../../3rdparty/libjpeg/src/jfdctint.c
+ ../../../3rdparty/libjpeg/src/jidctflt.c
+ ../../../3rdparty/libjpeg/src/jidctfst.c
+ ../../../3rdparty/libjpeg/src/jidctint.c
+ ../../../3rdparty/libjpeg/src/jidctred.c
+ ../../../3rdparty/libjpeg/src/jmemmgr.c
+ ../../../3rdparty/libjpeg/src/jmemnobs.c
+ ../../../3rdparty/libjpeg/src/jquant1.c
+ ../../../3rdparty/libjpeg/src/jquant2.c
+ ../../../3rdparty/libjpeg/src/jsimd_none.c
+ ../../../3rdparty/libjpeg/src/jutils.c
+ INCLUDE_DIRECTORIES
+ ../../../3rdparty/libjpeg
+ ../../../3rdparty/libjpeg/src
+)
+
+qt_extend_target(QJpegPlugin CONDITION WINRT AND NOT QT_FEATURE_system_jpeg
+ DEFINES
+ NO_GETENV
+)
+
+#### Keys ignored in scope 6:.:../../../3rdparty:../../../3rdparty/libjpeg.pri:GCC:
+# QMAKE_CFLAGS_WARN_ON = "-Wno-unused-parameter" "-Wno-main"
diff --git a/src/plugins/platforminputcontexts/CMakeLists.txt b/src/plugins/platforminputcontexts/CMakeLists.txt
new file mode 100644
index 0000000000..b5150df4f3
--- /dev/null
+++ b/src/plugins/platforminputcontexts/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Generated from platforminputcontexts.pro.
+
+if(QT_FEATURE_xkbcommon)
+ add_subdirectory(compose)
+endif()
+if(QT_FEATURE_xkbcommon AND TARGET Qt::DBus AND UNIX AND NOT MACOS)
+ add_subdirectory(ibus)
+endif()
diff --git a/src/plugins/platforminputcontexts/compose/.prev_CMakeLists.txt b/src/plugins/platforminputcontexts/compose/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..ff09314303
--- /dev/null
+++ b/src/plugins/platforminputcontexts/compose/.prev_CMakeLists.txt
@@ -0,0 +1,24 @@
+# Generated from compose.pro.
+
+#####################################################################
+## QComposePlatformInputContextPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QComposePlatformInputContextPlugin
+ OUTPUT_NAME composeplatforminputcontextplugin
+ TYPE platforminputcontexts
+ SOURCES
+ qcomposeplatforminputcontext.cpp qcomposeplatforminputcontext.h
+ qcomposeplatforminputcontextmain.cpp
+ LIBRARIES
+ XKB::XKB
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:compose.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/compose.json"
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforminputcontexts/compose/CMakeLists.txt b/src/plugins/platforminputcontexts/compose/CMakeLists.txt
new file mode 100644
index 0000000000..fe4e3b8b80
--- /dev/null
+++ b/src/plugins/platforminputcontexts/compose/CMakeLists.txt
@@ -0,0 +1,26 @@
+# Generated from compose.pro.
+
+#####################################################################
+## QComposePlatformInputContextPlugin Plugin:
+#####################################################################
+
+qt_find_package(XKB) # special case
+pkg_get_variable(PKG_X11_PREFIX x11 prefix) # special case
+qt_add_plugin(QComposePlatformInputContextPlugin
+ OUTPUT_NAME composeplatforminputcontextplugin
+ TYPE platforminputcontexts
+ SOURCES
+ qcomposeplatforminputcontext.cpp qcomposeplatforminputcontext.h
+ qcomposeplatforminputcontextmain.cpp
+ LIBRARIES
+ XKB::XKB
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:compose.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/compose.json"
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforminputcontexts/ibus/CMakeLists.txt b/src/plugins/platforminputcontexts/ibus/CMakeLists.txt
new file mode 100644
index 0000000000..1017407342
--- /dev/null
+++ b/src/plugins/platforminputcontexts/ibus/CMakeLists.txt
@@ -0,0 +1,27 @@
+# Generated from ibus.pro.
+
+#####################################################################
+## QIbusPlatformInputContextPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QIbusPlatformInputContextPlugin
+ OUTPUT_NAME ibusplatforminputcontextplugin
+ TYPE platforminputcontexts
+ SOURCES
+ main.cpp
+ qibusinputcontextproxy.cpp qibusinputcontextproxy.h
+ qibusplatforminputcontext.cpp qibusplatforminputcontext.h
+ qibusproxy.cpp qibusproxy.h
+ qibusproxyportal.cpp qibusproxyportal.h
+ qibustypes.cpp qibustypes.h
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::DBus
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::XkbCommonSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:ibus.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/ibus.json"
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/.prev_CMakeLists.txt b/src/plugins/platforms/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..6727afcb89
--- /dev/null
+++ b/src/plugins/platforms/.prev_CMakeLists.txt
@@ -0,0 +1,57 @@
+# Generated from platforms.pro.
+
+if(ANDROID AND NOT ANDROID_EMBEDDED)
+ add_subdirectory(android)
+endif()
+if(NOT ANDROID AND NOT WASM)
+ add_subdirectory(minimal)
+endif()
+if(QT_FEATURE_freetype AND NOT ANDROID AND NOT WASM)
+ add_subdirectory(offscreen)
+endif()
+if(QT_FEATURE_xcb)
+ add_subdirectory(xcb)
+endif()
+if(UIKIT AND NOT WATCHOS)
+ add_subdirectory(ios)
+endif()
+if(MACOS)
+ add_subdirectory(cocoa)
+endif()
+if(QT_FEATURE_direct3d9 AND WIN32 AND NOT WINRT)
+ add_subdirectory(windows)
+endif()
+if(QT_FEATURE_direct3d11 AND WINRT)
+ add_subdirectory(winrt)
+endif()
+if(QT_FEATURE_direct2d1_1 AND QT_FEATURE_direct3d11_1 AND QT_FEATURE_directwrite1)
+ add_subdirectory(direct2d)
+endif()
+if(QNX)
+ add_subdirectory(qnx)
+endif()
+if(QT_FEATURE_eglfs)
+ add_subdirectory(eglfs)
+ add_subdirectory(minimalegl)
+endif()
+if(QT_FEATURE_directfb)
+ add_subdirectory(directfb)
+endif()
+if(QT_FEATURE_linuxfb)
+ add_subdirectory(linuxfb)
+endif()
+if(QT_FEATURE_vnc AND TARGET Qt::Network)
+ add_subdirectory(vnc)
+endif()
+if(FREEBSD)
+ add_subdirectory(bsdfb)
+endif()
+if(HAIKU)
+ add_subdirectory(haiku)
+endif()
+if(WASM)
+ add_subdirectory(wasm)
+endif()
+if(QT_FEATURE_integrityfb)
+ add_subdirectory(integrity)
+endif()
diff --git a/src/plugins/platforms/CMakeLists.txt b/src/plugins/platforms/CMakeLists.txt
new file mode 100644
index 0000000000..c01dc5b28a
--- /dev/null
+++ b/src/plugins/platforms/CMakeLists.txt
@@ -0,0 +1,57 @@
+# Generated from platforms.pro.
+
+if(ANDROID AND NOT ANDROID_EMBEDDED)
+ add_subdirectory(android)
+endif()
+if(NOT ANDROID AND NOT WASM)
+ add_subdirectory(minimal)
+endif()
+if(QT_FEATURE_freetype AND NOT ANDROID AND NOT WASM)
+ add_subdirectory(offscreen)
+endif()
+if(QT_FEATURE_xcb)
+ add_subdirectory(xcb)
+endif()
+if(UIKIT AND NOT WATCHOS)
+ add_subdirectory(ios)
+endif()
+if(MACOS)
+ add_subdirectory(cocoa)
+endif()
+if(WIN32 AND NOT WINRT) # special case TODO fix direct3d9 test
+ add_subdirectory(windows)
+endif()
+if(QT_FEATURE_direct3d11 AND WINRT)
+ # add_subdirectory(winrt) # special case TODO
+endif()
+if(QT_FEATURE_direct2d1_1 AND QT_FEATURE_direct3d11_1 AND QT_FEATURE_directwrite1)
+ # add_subdirectory(direct2d) # special case TODO
+endif()
+if(QNX)
+ # add_subdirectory(qnx) # special case TODO
+endif()
+if(QT_FEATURE_eglfs)
+ add_subdirectory(eglfs)
+ add_subdirectory(minimalegl)
+endif()
+if(QT_FEATURE_directfb)
+ add_subdirectory(directfb)
+endif()
+if(QT_FEATURE_linuxfb)
+ add_subdirectory(linuxfb)
+endif()
+if(QT_FEATURE_vnc AND TARGET Qt::Network)
+ add_subdirectory(vnc)
+endif()
+if(FREEBSD)
+ # add_subdirectory(bsdfb) # special case TODO
+endif()
+if(HAIKU)
+ # add_subdirectory(haiku) # special case TODO
+endif()
+if(WASM)
+ # add_subdirectory(wasm) # special case TODO
+endif()
+if(QT_FEATURE_integrityfb)
+ # add_subdirectory(integrity) # special case TODO
+endif()
diff --git a/src/plugins/platforms/android/.prev_CMakeLists.txt b/src/plugins/platforms/android/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..7b21613fb9
--- /dev/null
+++ b/src/plugins/platforms/android/.prev_CMakeLists.txt
@@ -0,0 +1,85 @@
+# Generated from android.pro.
+
+#####################################################################
+## QAndroidIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QAndroidIntegrationPlugin
+ OUTPUT_NAME qtforandroid
+ TYPE platforms
+ SOURCES
+ androidcontentfileengine.cpp androidcontentfileengine.h
+ androiddeadlockprotector.cpp androiddeadlockprotector.h
+ androidjniaccessibility.cpp androidjniaccessibility.h
+ androidjniclipboard.cpp androidjniclipboard.h
+ androidjniinput.cpp androidjniinput.h
+ androidjnimain.cpp androidjnimain.h
+ androidjnimenu.cpp androidjnimenu.h
+ androidsurfaceclient.h
+ main.cpp
+ qandroidassetsfileenginehandler.cpp qandroidassetsfileenginehandler.h
+ qandroideventdispatcher.cpp qandroideventdispatcher.h
+ qandroidinputcontext.cpp qandroidinputcontext.h
+ qandroidplatformaccessibility.cpp qandroidplatformaccessibility.h
+ qandroidplatformbackingstore.cpp qandroidplatformbackingstore.h
+ qandroidplatformclipboard.cpp qandroidplatformclipboard.h
+ qandroidplatformdialoghelpers.cpp qandroidplatformdialoghelpers.h
+ qandroidplatformfiledialoghelper.cpp qandroidplatformfiledialoghelper.h
+ qandroidplatformfontdatabase.cpp qandroidplatformfontdatabase.h
+ qandroidplatformforeignwindow.cpp qandroidplatformforeignwindow.h
+ qandroidplatformintegration.cpp qandroidplatformintegration.h
+ qandroidplatformmenu.cpp qandroidplatformmenu.h
+ qandroidplatformmenubar.cpp qandroidplatformmenubar.h
+ qandroidplatformmenuitem.cpp qandroidplatformmenuitem.h
+ qandroidplatformoffscreensurface.cpp qandroidplatformoffscreensurface.h
+ qandroidplatformopenglcontext.cpp qandroidplatformopenglcontext.h
+ qandroidplatformopenglwindow.cpp qandroidplatformopenglwindow.h
+ qandroidplatformscreen.cpp qandroidplatformscreen.h
+ qandroidplatformservices.cpp qandroidplatformservices.h
+ qandroidplatformtheme.cpp qandroidplatformtheme.h
+ qandroidplatformwindow.cpp qandroidplatformwindow.h
+ qandroidsystemlocale.cpp qandroidsystemlocale.h
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${QT_SOURCE_TREE}/src/3rdparty/android
+ PUBLIC_LIBRARIES
+ Qt::AccessibilitySupportPrivate
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EglSupportPrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ android
+ jnigraphics
+)
+
+#### Keys ignored in scope 1:.:.:android.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/android.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QAndroidIntegrationPlugin CONDITION QT_FEATURE_vulkan
+ SOURCES
+ qandroidplatformvulkaninstance.cpp qandroidplatformvulkaninstance.h
+ qandroidplatformvulkanwindow.cpp qandroidplatformvulkanwindow.h
+ PUBLIC_LIBRARIES
+ Qt::VulkanSupportPrivate
+)
+
+qt_extend_target(QAndroidIntegrationPlugin CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+qt_extend_target(QAndroidIntegrationPlugin CONDITION QT_FEATURE_android_style_assets
+ SOURCES
+ extract.cpp
+)
+
+qt_extend_target(QAndroidIntegrationPlugin CONDITION NOT QT_FEATURE_android_style_assets
+ SOURCES
+ extract-dummy.cpp
+)
diff --git a/src/plugins/platforms/android/CMakeLists.txt b/src/plugins/platforms/android/CMakeLists.txt
new file mode 100644
index 0000000000..4d1f83053b
--- /dev/null
+++ b/src/plugins/platforms/android/CMakeLists.txt
@@ -0,0 +1,94 @@
+# Generated from android.pro.
+
+#####################################################################
+## QAndroidIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QAndroidIntegrationPlugin
+ OUTPUT_NAME qtforandroid
+ TYPE platforms
+ DEFAULT_IF ${QT_QPA_DEFAULT_PLATFORM} MATCHES android # special case
+ SOURCES
+ androidcontentfileengine.cpp androidcontentfileengine.h
+ androiddeadlockprotector.cpp androiddeadlockprotector.h
+ androidjniaccessibility.cpp androidjniaccessibility.h
+ androidjniclipboard.cpp androidjniclipboard.h
+ androidjniinput.cpp androidjniinput.h
+ androidjnimain.cpp androidjnimain.h
+ androidjnimenu.cpp androidjnimenu.h
+ androidsurfaceclient.h
+ main.cpp
+ qandroidassetsfileenginehandler.cpp qandroidassetsfileenginehandler.h
+ qandroideventdispatcher.cpp qandroideventdispatcher.h
+ qandroidinputcontext.cpp qandroidinputcontext.h
+ qandroidplatformaccessibility.cpp qandroidplatformaccessibility.h
+ qandroidplatformbackingstore.cpp qandroidplatformbackingstore.h
+ qandroidplatformclipboard.cpp qandroidplatformclipboard.h
+ qandroidplatformdialoghelpers.cpp qandroidplatformdialoghelpers.h
+ qandroidplatformfiledialoghelper.cpp qandroidplatformfiledialoghelper.h
+ qandroidplatformfontdatabase.cpp qandroidplatformfontdatabase.h
+ qandroidplatformforeignwindow.cpp qandroidplatformforeignwindow.h
+ qandroidplatformintegration.cpp qandroidplatformintegration.h
+ qandroidplatformmenu.cpp qandroidplatformmenu.h
+ qandroidplatformmenubar.cpp qandroidplatformmenubar.h
+ qandroidplatformmenuitem.cpp qandroidplatformmenuitem.h
+ qandroidplatformoffscreensurface.cpp qandroidplatformoffscreensurface.h
+ qandroidplatformopenglcontext.cpp qandroidplatformopenglcontext.h
+ qandroidplatformopenglwindow.cpp qandroidplatformopenglwindow.h
+ qandroidplatformscreen.cpp qandroidplatformscreen.h
+ qandroidplatformservices.cpp qandroidplatformservices.h
+ qandroidplatformtheme.cpp qandroidplatformtheme.h
+ qandroidplatformwindow.cpp qandroidplatformwindow.h
+ qandroidsystemlocale.cpp qandroidsystemlocale.h
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${QT_SOURCE_TREE}/src/3rdparty/android
+ PUBLIC_LIBRARIES
+ Qt::AccessibilitySupportPrivate
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EglSupportPrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ android
+ jnigraphics
+# special case begin
+ INSTALL_DIRECTORY
+ plugins/platforms
+ OUTPUT_DIRECTORY
+ plugins/platforms
+ ARCHIVE_INSTALL_DIRECTORY
+ plugins/platforms
+# special case end
+)
+
+#### Keys ignored in scope 1:.:.:android.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/android.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QAndroidIntegrationPlugin CONDITION QT_FEATURE_vulkan
+ SOURCES
+ qandroidplatformvulkaninstance.cpp qandroidplatformvulkaninstance.h
+ qandroidplatformvulkanwindow.cpp qandroidplatformvulkanwindow.h
+ PUBLIC_LIBRARIES
+ Qt::VulkanSupportPrivate
+)
+
+qt_extend_target(QAndroidIntegrationPlugin CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+qt_extend_target(QAndroidIntegrationPlugin CONDITION QT_FEATURE_android_style_assets
+ SOURCES
+ extract.cpp
+)
+
+qt_extend_target(QAndroidIntegrationPlugin CONDITION NOT QT_FEATURE_android_style_assets
+ SOURCES
+ extract-dummy.cpp
+)
diff --git a/src/plugins/platforms/android/android.pro b/src/plugins/platforms/android/android.pro
index 730247cd7f..8ea78f7cba 100644
--- a/src/plugins/platforms/android/android.pro
+++ b/src/plugins/platforms/android/android.pro
@@ -9,6 +9,8 @@ QT += \
qtConfig(vulkan): QT += vulkan_support-private
+qtHaveModule(platformcompositor_support-private): QT += platformcompositor_support-private
+
OTHER_FILES += $$PWD/android.json
INCLUDEPATH += \
@@ -16,7 +18,6 @@ INCLUDEPATH += \
$$QT_SOURCE_TREE/src/3rdparty/android
SOURCES += $$PWD/main.cpp \
- $$PWD/androidplatformplugin.cpp \
$$PWD/androidcontentfileengine.cpp \
$$PWD/androiddeadlockprotector.cpp \
$$PWD/androidjnimain.cpp \
diff --git a/src/plugins/platforms/android/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp
index 56885f2e23..13ac40d797 100644
--- a/src/plugins/platforms/android/androidjniinput.cpp
+++ b/src/plugins/platforms/android/androidjniinput.cpp
@@ -45,6 +45,7 @@
#include "qandroidplatformintegration.h"
#include <qpa/qwindowsysteminterface.h>
+#include <QTouchDevice>
#include <QTouchEvent>
#include <QPointer>
@@ -247,8 +248,8 @@ namespace QtAndroidInput
break;
}
- const int dw = desktopWidthPixels();
- const int dh = desktopHeightPixels();
+ const int dw = availableWidthPixels();
+ const int dh = availableHeightPixels();
QWindowSystemInterface::TouchPoint touchPoint;
touchPoint.id = id;
touchPoint.pressure = pressure;
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index 1c7800358f..3f41ead818 100644
--- a/src/plugins/platforms/android/androidjnimain.cpp
+++ b/src/plugins/platforms/android/androidjnimain.cpp
@@ -111,8 +111,8 @@ static int m_surfaceId = 1;
static QAndroidPlatformIntegration *m_androidPlatformIntegration = nullptr;
-static int m_desktopWidthPixels = 0;
-static int m_desktopHeightPixels = 0;
+static int m_availableWidthPixels = 0;
+static int m_availableHeightPixels = 0;
static double m_scaledDensity = 0;
static double m_density = 1.0;
@@ -155,14 +155,14 @@ namespace QtAndroid
: 0;
}
- int desktopWidthPixels()
+ int availableWidthPixels()
{
- return m_desktopWidthPixels;
+ return m_availableWidthPixels;
}
- int desktopHeightPixels()
+ int availableHeightPixels()
{
- return m_desktopHeightPixels;
+ return m_availableHeightPixels;
}
double scaledDensity()
@@ -200,22 +200,9 @@ namespace QtAndroid
return m_serviceObject;
}
- void showStatusBar()
+ void setSystemUiVisibility(SystemUiVisibility uiVisibility)
{
- if (m_statusBarShowing)
- return;
-
- QJNIObjectPrivate::callStaticMethod<void>(m_applicationClass, "setFullScreen", "(Z)V", false);
- m_statusBarShowing = true;
- }
-
- void hideStatusBar()
- {
- if (!m_statusBarShowing)
- return;
-
- QJNIObjectPrivate::callStaticMethod<void>(m_applicationClass, "setFullScreen", "(Z)V", true);
- m_statusBarShowing = false;
+ QJNIObjectPrivate::callStaticMethod<void>(m_applicationClass, "setSystemUiVisibility", "(I)V", jint(uiVisibility));
}
jobject createBitmap(QImage img, JNIEnv *env)
@@ -620,35 +607,33 @@ static void setSurface(JNIEnv *env, jobject /*thiz*/, jint id, jobject jSurface,
}
static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/,
- jint widthPixels, jint heightPixels,
- jint desktopWidthPixels, jint desktopHeightPixels,
+ jint screenWidthPixels, jint screenHeightPixels,
+ jint availableLeftPixels, jint availableTopPixels,
+ jint availableWidthPixels, jint availableHeightPixels,
jdouble xdpi, jdouble ydpi,
jdouble scaledDensity, jdouble density)
{
- // Android does not give us the correct screen size for immersive mode, but
- // the surface does have the right size
-
- widthPixels = qMax(widthPixels, desktopWidthPixels);
- heightPixels = qMax(heightPixels, desktopHeightPixels);
-
- m_desktopWidthPixels = desktopWidthPixels;
- m_desktopHeightPixels = desktopHeightPixels;
+ m_availableWidthPixels = availableWidthPixels;
+ m_availableHeightPixels = availableHeightPixels;
m_scaledDensity = scaledDensity;
m_density = density;
QMutexLocker lock(&m_platformMutex);
if (!m_androidPlatformIntegration) {
- QAndroidPlatformIntegration::setDefaultDisplayMetrics(desktopWidthPixels,
- desktopHeightPixels,
- qRound(double(widthPixels) / xdpi * 25.4),
- qRound(double(heightPixels) / ydpi * 25.4),
- widthPixels,
- heightPixels);
+ QAndroidPlatformIntegration::setDefaultDisplayMetrics(availableLeftPixels,
+ availableTopPixels,
+ availableWidthPixels,
+ availableHeightPixels,
+ qRound(double(screenWidthPixels) / xdpi * 25.4),
+ qRound(double(screenHeightPixels) / ydpi * 25.4),
+ screenWidthPixels,
+ screenHeightPixels);
} else {
- m_androidPlatformIntegration->setDisplayMetrics(qRound(double(widthPixels) / xdpi * 25.4),
- qRound(double(heightPixels) / ydpi * 25.4));
- m_androidPlatformIntegration->setScreenSize(widthPixels, heightPixels);
- m_androidPlatformIntegration->setDesktopSize(desktopWidthPixels, desktopHeightPixels);
+ m_androidPlatformIntegration->setPhysicalSize(qRound(double(screenWidthPixels) / xdpi * 25.4),
+ qRound(double(screenHeightPixels) / ydpi * 25.4));
+ m_androidPlatformIntegration->setScreenSize(screenWidthPixels, screenHeightPixels);
+ m_androidPlatformIntegration->setAvailableGeometry(QRect(availableLeftPixels, availableTopPixels,
+ availableWidthPixels, availableHeightPixels));
}
}
@@ -774,7 +759,7 @@ static JNINativeMethod methods[] = {
{"quitQtCoreApplication", "()V", (void *)quitQtCoreApplication},
{"terminateQt", "()V", (void *)terminateQt},
{"waitForServiceSetup", "()V", (void *)waitForServiceSetup},
- {"setDisplayMetrics", "(IIIIDDDD)V", (void *)setDisplayMetrics},
+ {"setDisplayMetrics", "(IIIIIIDDDD)V", (void *)setDisplayMetrics},
{"setSurface", "(ILjava/lang/Object;II)V", (void *)setSurface},
{"updateWindow", "()V", (void *)updateWindow},
{"updateApplicationState", "(I)V", (void *)updateApplicationState},
diff --git a/src/plugins/platforms/android/androidjnimain.h b/src/plugins/platforms/android/androidjnimain.h
index 17ae30a1be..63be5910f9 100644
--- a/src/plugins/platforms/android/androidjnimain.h
+++ b/src/plugins/platforms/android/androidjnimain.h
@@ -77,8 +77,8 @@ namespace QtAndroid
void bringChildToBack(int surfaceId);
QWindow *topLevelWindowAt(const QPoint &globalPos);
- int desktopWidthPixels();
- int desktopHeightPixels();
+ int availableWidthPixels();
+ int availableHeightPixels();
double scaledDensity();
double pixelDensity();
JavaVM *javaVM();
@@ -88,8 +88,13 @@ namespace QtAndroid
jobject activity();
jobject service();
- void showStatusBar();
- void hideStatusBar();
+ // Keep synchronized with flags in ActivityDelegate.java
+ enum SystemUiVisibility {
+ SYSTEM_UI_VISIBILITY_NORMAL = 0,
+ SYSTEM_UI_VISIBILITY_FULLSCREEN = 1,
+ SYSTEM_UI_VISIBILITY_TRANSLUCENT = 2
+ };
+ void setSystemUiVisibility(SystemUiVisibility uiVisibility);
jobject createBitmap(QImage img, JNIEnv *env = 0);
jobject createBitmap(int width, int height, QImage::Format format, JNIEnv *env);
diff --git a/src/plugins/platforms/android/androidplatformplugin.cpp b/src/plugins/platforms/android/androidplatformplugin.cpp
deleted file mode 100644
index 297e167f47..0000000000
--- a/src/plugins/platforms/android/androidplatformplugin.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qpa/qplatformintegrationplugin.h>
-#include "qandroidplatformintegration.h"
-
-QT_BEGIN_NAMESPACE
-
-class QAndroidPlatformIntegrationPlugin: public QPlatformIntegrationPlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID QPlatformIntegrationFactoryInterface_iid FILE "android.json")
-public:
- QPlatformIntegration *create(const QString &key, const QStringList &paramList) override;
-};
-
-
-QPlatformIntegration *QAndroidPlatformIntegrationPlugin::create(const QString &key, const QStringList &paramList)
-{
- Q_UNUSED(paramList);
- if (!key.compare(QLatin1String("android"), Qt::CaseInsensitive))
- return new QAndroidPlatformIntegration(paramList);
- return 0;
-}
-
-QT_END_NAMESPACE
-#include "androidplatformplugin.moc"
-
diff --git a/src/plugins/platforms/android/main.cpp b/src/plugins/platforms/android/main.cpp
index c304fc8d69..4841d0425c 100644
--- a/src/plugins/platforms/android/main.cpp
+++ b/src/plugins/platforms/android/main.cpp
@@ -61,3 +61,4 @@ QPlatformIntegration *QAndroidIntegrationPlugin::create(const QString& system, c
}
QT_END_NAMESPACE
+#include "main.moc"
diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp
index c81cc66166..837b1974a6 100644
--- a/src/plugins/platforms/android/qandroidplatformintegration.cpp
+++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp
@@ -43,8 +43,12 @@
#include <QtGui/private/qguiapplication_p.h>
#include <QGuiApplication>
#include <QOpenGLContext>
-#include <QThread>
+#if QT_CONFIG(opengl)
+#include <QtPlatformCompositorSupport/qpa/qplatformbackingstoreopenglsupport.h>
+#endif
#include <QOffscreenSurface>
+#include <QThread>
+#include <QTouchDevice>
#include <QtEglSupport/private/qeglpbuffer_p.h>
#include <qpa/qwindowsysteminterface.h>
@@ -78,12 +82,9 @@
QT_BEGIN_NAMESPACE
-int QAndroidPlatformIntegration::m_defaultGeometryWidth = 320;
-int QAndroidPlatformIntegration::m_defaultGeometryHeight = 455;
-int QAndroidPlatformIntegration::m_defaultScreenWidth = 320;
-int QAndroidPlatformIntegration::m_defaultScreenHeight = 455;
-int QAndroidPlatformIntegration::m_defaultPhysicalSizeWidth = 50;
-int QAndroidPlatformIntegration::m_defaultPhysicalSizeHeight = 71;
+QSize QAndroidPlatformIntegration::m_defaultScreenSize = QSize(320, 455);
+QRect QAndroidPlatformIntegration::m_defaultAvailableGeometry = QRect(0, 0, 320, 455);
+QSize QAndroidPlatformIntegration::m_defaultPhysicalSize = QSize(50, 71);
Qt::ScreenOrientation QAndroidPlatformIntegration::m_orientation = Qt::PrimaryOrientation;
Qt::ScreenOrientation QAndroidPlatformIntegration::m_nativeOrientation = Qt::PrimaryOrientation;
@@ -176,9 +177,9 @@ QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList &para
m_primaryScreen = new QAndroidPlatformScreen();
QWindowSystemInterface::handleScreenAdded(m_primaryScreen);
- m_primaryScreen->setPhysicalSize(QSize(m_defaultPhysicalSizeWidth, m_defaultPhysicalSizeHeight));
- m_primaryScreen->setSize(QSize(m_defaultScreenWidth, m_defaultScreenHeight));
- m_primaryScreen->setAvailableGeometry(QRect(0, 0, m_defaultGeometryWidth, m_defaultGeometryHeight));
+ m_primaryScreen->setPhysicalSize(m_defaultPhysicalSize);
+ m_primaryScreen->setSize(m_defaultScreenSize);
+ m_primaryScreen->setAvailableGeometry(m_defaultAvailableGeometry);
m_mainThread = QThread::currentThread();
@@ -277,6 +278,7 @@ bool QAndroidPlatformIntegration::hasCapability(Capability cap) const
case ThreadedOpenGL: return !needsBasicRenderloopWorkaround() && QtAndroid::activity();
case RasterGLSurface: return QtAndroid::activity();
case TopStackedNativeChildWindows: return false;
+ case MaximizeUsingFullscreenGeometry: return true;
default:
return QPlatformIntegration::hasCapability(cap);
}
@@ -286,7 +288,12 @@ QPlatformBackingStore *QAndroidPlatformIntegration::createPlatformBackingStore(Q
{
if (!QtAndroid::activity())
return nullptr;
- return new QAndroidPlatformBackingStore(window);
+
+ auto *backingStore = new QAndroidPlatformBackingStore(window);
+#if QT_CONFIG(opengl)
+ backingStore->setOpenGLSupport(new QPlatformBackingStoreOpenGLSupport(backingStore));
+#endif // QT_CONFIG(opengl)
+ return backingStore;
}
QPlatformOpenGLContext *QAndroidPlatformIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const
@@ -426,20 +433,19 @@ QPlatformTheme *QAndroidPlatformIntegration::createPlatformTheme(const QString &
return 0;
}
-void QAndroidPlatformIntegration::setDefaultDisplayMetrics(int gw, int gh, int sw, int sh, int screenWidth, int screenHeight)
-{
- m_defaultGeometryWidth = gw;
- m_defaultGeometryHeight = gh;
- m_defaultPhysicalSizeWidth = sw;
- m_defaultPhysicalSizeHeight = sh;
- m_defaultScreenWidth = screenWidth;
- m_defaultScreenHeight = screenHeight;
-}
-
-void QAndroidPlatformIntegration::setDefaultDesktopSize(int gw, int gh)
+void QAndroidPlatformIntegration::setDefaultDisplayMetrics(int availableLeft,
+ int availableTop,
+ int availableWidth,
+ int availableHeight,
+ int physicalWidth,
+ int physicalHeight,
+ int screenWidth,
+ int screenHeight)
{
- m_defaultGeometryWidth = gw;
- m_defaultGeometryHeight = gh;
+ m_defaultAvailableGeometry = QRect(availableLeft, availableTop,
+ availableWidth, availableHeight);
+ m_defaultPhysicalSize = QSize(physicalWidth, physicalHeight);
+ m_defaultScreenSize = QSize(screenWidth, screenHeight);
}
void QAndroidPlatformIntegration::setScreenOrientation(Qt::ScreenOrientation currentOrientation,
@@ -451,10 +457,9 @@ void QAndroidPlatformIntegration::setScreenOrientation(Qt::ScreenOrientation cur
void QAndroidPlatformIntegration::flushPendingUpdates()
{
- m_primaryScreen->setPhysicalSize(QSize(m_defaultPhysicalSizeWidth,
- m_defaultPhysicalSizeHeight));
- m_primaryScreen->setSize(QSize(m_defaultScreenWidth, m_defaultScreenHeight));
- m_primaryScreen->setAvailableGeometry(QRect(0, 0, m_defaultGeometryWidth, m_defaultGeometryHeight));
+ m_primaryScreen->setPhysicalSize(m_defaultPhysicalSize);
+ m_primaryScreen->setSize(m_defaultScreenSize);
+ m_primaryScreen->setAvailableGeometry(m_defaultAvailableGeometry);
}
#ifndef QT_NO_ACCESSIBILITY
@@ -464,13 +469,13 @@ QPlatformAccessibility *QAndroidPlatformIntegration::accessibility() const
}
#endif
-void QAndroidPlatformIntegration::setDesktopSize(int width, int height)
+void QAndroidPlatformIntegration::setAvailableGeometry(const QRect &availableGeometry)
{
if (m_primaryScreen)
- QMetaObject::invokeMethod(m_primaryScreen, "setAvailableGeometry", Qt::AutoConnection, Q_ARG(QRect, QRect(0,0,width, height)));
+ QMetaObject::invokeMethod(m_primaryScreen, "setAvailableGeometry", Qt::AutoConnection, Q_ARG(QRect, availableGeometry));
}
-void QAndroidPlatformIntegration::setDisplayMetrics(int width, int height)
+void QAndroidPlatformIntegration::setPhysicalSize(int width, int height)
{
if (m_primaryScreen)
QMetaObject::invokeMethod(m_primaryScreen, "setPhysicalSize", Qt::AutoConnection, Q_ARG(QSize, QSize(width, height)));
diff --git a/src/plugins/platforms/android/qandroidplatformintegration.h b/src/plugins/platforms/android/qandroidplatformintegration.h
index ecbde4f951..67d9d37e5b 100644
--- a/src/plugins/platforms/android/qandroidplatformintegration.h
+++ b/src/plugins/platforms/android/qandroidplatformintegration.h
@@ -93,8 +93,8 @@ public:
QAndroidPlatformScreen *screen() { return m_primaryScreen; }
QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const override;
- virtual void setDesktopSize(int width, int height);
- virtual void setDisplayMetrics(int width, int height);
+ void setAvailableGeometry(const QRect &availableGeometry);
+ void setPhysicalSize(int width, int height);
void setScreenSize(int width, int height);
bool isVirtualDesktop() { return true; }
@@ -118,16 +118,17 @@ public:
QStringList themeNames() const override;
QPlatformTheme *createPlatformTheme(const QString &name) const override;
- static void setDefaultDisplayMetrics(int gw, int gh, int sw, int sh, int width, int height);
- static void setDefaultDesktopSize(int gw, int gh);
+ static void setDefaultDisplayMetrics(int availableLeft,
+ int availableTop,
+ int availableWidth,
+ int availableHeight,
+ int physicalWidth,
+ int physicalHeight,
+ int screenWidth,
+ int screenHeight);
static void setScreenOrientation(Qt::ScreenOrientation currentOrientation,
Qt::ScreenOrientation nativeOrientation);
- static QSize defaultDesktopSize()
- {
- return QSize(m_defaultGeometryWidth, m_defaultGeometryHeight);
- }
-
QTouchDevice *touchDevice() const { return m_touchDevice; }
void setTouchDevice(QTouchDevice *touchDevice) { m_touchDevice = touchDevice; }
@@ -145,12 +146,9 @@ private:
QThread *m_mainThread;
- static int m_defaultGeometryWidth;
- static int m_defaultGeometryHeight;
- static int m_defaultPhysicalSizeWidth;
- static int m_defaultPhysicalSizeHeight;
- static int m_defaultScreenWidth;
- static int m_defaultScreenHeight;
+ static QRect m_defaultAvailableGeometry;
+ static QSize m_defaultPhysicalSize;
+ static QSize m_defaultScreenSize;
static Qt::ScreenOrientation m_orientation;
static Qt::ScreenOrientation m_nativeOrientation;
diff --git a/src/plugins/platforms/android/qandroidplatformscreen.cpp b/src/plugins/platforms/android/qandroidplatformscreen.cpp
index 80757c2135..5f8486a7a2 100644
--- a/src/plugins/platforms/android/qandroidplatformscreen.cpp
+++ b/src/plugins/platforms/android/qandroidplatformscreen.cpp
@@ -90,8 +90,8 @@ private:
QAndroidPlatformScreen::QAndroidPlatformScreen()
: QObject(), QPlatformScreen()
{
- m_availableGeometry = QRect(0, 0, QAndroidPlatformIntegration::m_defaultGeometryWidth, QAndroidPlatformIntegration::m_defaultGeometryHeight);
- m_size = QSize(QAndroidPlatformIntegration::m_defaultScreenWidth, QAndroidPlatformIntegration::m_defaultScreenHeight);
+ m_availableGeometry = QAndroidPlatformIntegration::m_defaultAvailableGeometry;
+ m_size = QAndroidPlatformIntegration::m_defaultScreenSize;
// Raster only apps should set QT_ANDROID_RASTER_IMAGE_DEPTH to 16
// is way much faster than 32
if (qEnvironmentVariableIntValue("QT_ANDROID_RASTER_IMAGE_DEPTH") == 16) {
@@ -101,8 +101,7 @@ QAndroidPlatformScreen::QAndroidPlatformScreen()
m_format = QImage::Format_ARGB32_Premultiplied;
m_depth = 32;
}
- m_physicalSize.setHeight(QAndroidPlatformIntegration::m_defaultPhysicalSizeHeight);
- m_physicalSize.setWidth(QAndroidPlatformIntegration::m_defaultPhysicalSizeWidth);
+ m_physicalSize = QAndroidPlatformIntegration::m_defaultPhysicalSize;
connect(qGuiApp, &QGuiApplication::applicationStateChanged, this, &QAndroidPlatformScreen::applicationStateChanged);
}
@@ -294,7 +293,7 @@ void QAndroidPlatformScreen::topWindowChanged(QWindow *w)
if (w != 0) {
QAndroidPlatformWindow *platformWindow = static_cast<QAndroidPlatformWindow *>(w->handle());
if (platformWindow != 0)
- platformWindow->updateStatusBarVisibility();
+ platformWindow->updateSystemUiVisibility();
}
}
@@ -334,7 +333,7 @@ void QAndroidPlatformScreen::doRedraw()
}
QMutexLocker lock(&m_surfaceMutex);
if (m_id == -1 && m_rasterSurfaces) {
- m_id = QtAndroid::createSurface(this, m_availableGeometry, true, m_depth);
+ m_id = QtAndroid::createSurface(this, geometry(), true, m_depth);
AndroidDeadlockProtector protector;
if (!protector.acquire())
return;
diff --git a/src/plugins/platforms/android/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp
index 4f691ce112..a88cb9b823 100644
--- a/src/plugins/platforms/android/qandroidplatformwindow.cpp
+++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp
@@ -67,25 +67,39 @@ void QAndroidPlatformWindow::lower()
void QAndroidPlatformWindow::raise()
{
- updateStatusBarVisibility();
+ updateSystemUiVisibility();
platformScreen()->raise(this);
}
+QMargins QAndroidPlatformWindow::safeAreaMargins() const
+{
+ if ((m_windowState & Qt::WindowMaximized) && (window()->flags() & Qt::MaximizeUsingFullscreenGeometryHint)) {
+ QRect availableGeometry = platformScreen()->availableGeometry();
+ return QMargins(availableGeometry.left(), availableGeometry.top(),
+ availableGeometry.right(), availableGeometry.bottom());
+ } else {
+ return QPlatformWindow::safeAreaMargins();
+ }
+}
+
void QAndroidPlatformWindow::setGeometry(const QRect &rect)
{
+ QPlatformWindow::setGeometry(rect);
QWindowSystemInterface::handleGeometryChange(window(), rect);
}
void QAndroidPlatformWindow::setVisible(bool visible)
{
if (visible)
- updateStatusBarVisibility();
+ updateSystemUiVisibility();
if (visible) {
- if (m_windowState & Qt::WindowFullScreen)
+ if ((m_windowState & Qt::WindowFullScreen)
+ || ((m_windowState & Qt::WindowMaximized) && (window()->flags() & Qt::MaximizeUsingFullscreenGeometryHint))) {
setGeometry(platformScreen()->geometry());
- else if (m_windowState & Qt::WindowMaximized)
+ } else if (m_windowState & Qt::WindowMaximized) {
setGeometry(platformScreen()->availableGeometry());
+ }
}
if (visible)
@@ -107,7 +121,7 @@ void QAndroidPlatformWindow::setWindowState(Qt::WindowStates state)
m_windowState = state;
if (window()->isVisible())
- updateStatusBarVisibility();
+ updateSystemUiVisibility();
}
void QAndroidPlatformWindow::setWindowFlags(Qt::WindowFlags flags)
@@ -143,15 +157,17 @@ void QAndroidPlatformWindow::requestActivateWindow()
platformScreen()->topWindowChanged(window());
}
-void QAndroidPlatformWindow::updateStatusBarVisibility()
+void QAndroidPlatformWindow::updateSystemUiVisibility()
{
Qt::WindowFlags flags = window()->flags();
bool isNonRegularWindow = flags & (Qt::Popup | Qt::Dialog | Qt::Sheet) & ~Qt::Window;
if (!isNonRegularWindow) {
if (m_windowState & Qt::WindowFullScreen)
- QtAndroid::hideStatusBar();
+ QtAndroid::setSystemUiVisibility(QtAndroid::SYSTEM_UI_VISIBILITY_FULLSCREEN);
+ else if (flags & Qt::MaximizeUsingFullscreenGeometryHint)
+ QtAndroid::setSystemUiVisibility(QtAndroid::SYSTEM_UI_VISIBILITY_TRANSLUCENT);
else
- QtAndroid::showStatusBar();
+ QtAndroid::setSystemUiVisibility(QtAndroid::SYSTEM_UI_VISIBILITY_NORMAL);
}
}
diff --git a/src/plugins/platforms/android/qandroidplatformwindow.h b/src/plugins/platforms/android/qandroidplatformwindow.h
index d8eb6b7b7f..f83ad7bea3 100644
--- a/src/plugins/platforms/android/qandroidplatformwindow.h
+++ b/src/plugins/platforms/android/qandroidplatformwindow.h
@@ -70,9 +70,11 @@ public:
QAndroidPlatformScreen *platformScreen() const;
+ QMargins safeAreaMargins() const override;
+
void propagateSizeHints() override;
void requestActivateWindow() override;
- void updateStatusBarVisibility();
+ void updateSystemUiVisibility();
inline bool isRaster() const {
if (isForeignWindow())
return false;
diff --git a/src/plugins/platforms/cocoa/.prev_CMakeLists.txt b/src/plugins/platforms/cocoa/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..4963891fc0
--- /dev/null
+++ b/src/plugins/platforms/cocoa/.prev_CMakeLists.txt
@@ -0,0 +1,151 @@
+# Generated from cocoa.pro.
+
+#####################################################################
+## QCocoaIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QCocoaIntegrationPlugin
+ OUTPUT_NAME qcocoa
+ TYPE platforms
+ SOURCES
+ main.mm
+ qcocoaapplication.h qcocoaapplication.mm
+ qcocoaapplicationdelegate.h qcocoaapplicationdelegate.mm
+ qcocoabackingstore.h qcocoabackingstore.mm
+ qcocoaclipboard.h qcocoaclipboard.mm
+ qcocoacursor.h qcocoacursor.mm
+ qcocoadrag.h qcocoadrag.mm
+ qcocoaeventdispatcher.h qcocoaeventdispatcher.mm
+ qcocoahelpers.h qcocoahelpers.mm
+ qcocoainputcontext.h qcocoainputcontext.mm
+ qcocoaintegration.h qcocoaintegration.mm
+ qcocoaintrospection.h qcocoaintrospection.mm
+ qcocoakeymapper.h qcocoakeymapper.mm
+ qcocoamenu.h qcocoamenu.mm
+ qcocoamenubar.h qcocoamenubar.mm
+ qcocoamenuitem.h qcocoamenuitem.mm
+ qcocoamenuloader.h qcocoamenuloader.mm
+ qcocoamimetypes.h qcocoamimetypes.mm
+ qcocoanativeinterface.h qcocoanativeinterface.mm
+ qcocoansmenu.h qcocoansmenu.mm
+ qcocoascreen.h qcocoascreen.mm
+ qcocoaservices.h qcocoaservices.mm
+ qcocoasystemtrayicon.h qcocoasystemtrayicon.mm
+ qcocoatheme.h qcocoatheme.mm
+ qcocoawindow.h qcocoawindow.mm
+ qcocoawindowmanager.h qcocoawindowmanager.mm
+ qiosurfacegraphicsbuffer.h qiosurfacegraphicsbuffer.mm
+ qmacclipboard.h qmacclipboard.mm
+ qmultitouch_mac.mm qmultitouch_mac_p.h
+ qnsview.h qnsview.mm
+ qnswindow.h qnswindow.mm
+ qnswindowdelegate.h qnswindowdelegate.mm
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ ${FWAppKit}
+ ${FWCarbon}
+ ${FWCoreServices}
+ ${FWCoreVideo}
+ ${FWIOKit}
+ ${FWIOSurface}
+ ${FWMetal}
+ ${FWQuartzCore}
+ Cups::Cups
+ Qt::ClipboardSupportPrivate
+ Qt::Core
+ Qt::CorePrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::GraphicsSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::ThemeSupportPrivate
+)
+
+# Resources:
+set(qcocoaresources_resource_files
+ "images/sizeallcursor.png"
+ "images/spincursor.png"
+ "images/waitcursor.png"
+)
+
+qt_add_resource(QCocoaIntegrationPlugin "qcocoaresources"
+ PREFIX
+ "/qt-project.org/mac/cursors"
+ FILES
+ ${qcocoaresources_resource_files}
+)
+
+
+#### Keys ignored in scope 1:.:.:cocoa.pro:<TRUE>:
+# OTHER_FILES = "cocoa.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_opengl
+ SOURCES
+ qcocoaglcontext.h qcocoaglcontext.mm
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_vulkan
+ SOURCES
+ qcocoavulkaninstance.h qcocoavulkaninstance.mm
+ PUBLIC_LIBRARIES
+ Qt::VulkanSupportPrivate
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_accessibility
+ SOURCES
+ qcocoaaccessibility.h qcocoaaccessibility.mm
+ qcocoaaccessibilityelement.h qcocoaaccessibilityelement.mm
+ PUBLIC_LIBRARIES
+ Qt::AccessibilitySupportPrivate
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_sessionmanager
+ SOURCES
+ qcocoasessionmanager.cpp qcocoasessionmanager.h
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION TARGET Qt::Widgets
+ SOURCES
+ qpaintengine_mac.mm qpaintengine_mac_p.h
+ PUBLIC_LIBRARIES
+ Qt::WidgetsPrivate
+)
+
+#### Keys ignored in scope 8:.:.:cocoa.pro:TARGET Qt::Widgets:
+# QT_FOR_CONFIG = "widgets"
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION TARGET Qt::PrintSupport AND TARGET Qt::Widgets
+ SOURCES
+ qcocoaprintdevice.h qcocoaprintdevice.mm
+ qcocoaprintersupport.h qcocoaprintersupport.mm
+ qprintengine_mac.mm qprintengine_mac_p.h
+ PUBLIC_LIBRARIES
+ Qt::PrintSupportPrivate
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_colordialog AND TARGET Qt::Widgets
+ SOURCES
+ qcocoacolordialoghelper.h qcocoacolordialoghelper.mm
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_filedialog AND TARGET Qt::Widgets
+ SOURCES
+ qcocoafiledialoghelper.h qcocoafiledialoghelper.mm
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_fontdialog AND TARGET Qt::Widgets
+ SOURCES
+ qcocoafontdialoghelper.h qcocoafontdialoghelper.mm
+)
+
+#### Keys ignored in scope 13:.:.:cocoa.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/cocoa/CMakeLists.txt b/src/plugins/platforms/cocoa/CMakeLists.txt
new file mode 100644
index 0000000000..4ed23c4367
--- /dev/null
+++ b/src/plugins/platforms/cocoa/CMakeLists.txt
@@ -0,0 +1,155 @@
+# Generated from cocoa.pro.
+
+# special case:
+qt_find_package(Cups PROVIDED_TARGETS Cups::Cups)
+
+#####################################################################
+## QCocoaIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QCocoaIntegrationPlugin
+ OUTPUT_NAME qcocoa
+ DEFAULT_IF ${QT_QPA_DEFAULT_PLATFORM} MATCHES cocoa # special case
+ TYPE platforms
+ SOURCES
+ main.mm
+ qcocoaapplication.h qcocoaapplication.mm
+ qcocoaapplicationdelegate.h qcocoaapplicationdelegate.mm
+ qcocoabackingstore.h qcocoabackingstore.mm
+ qcocoaclipboard.h qcocoaclipboard.mm
+ qcocoacursor.h qcocoacursor.mm
+ qcocoadrag.h qcocoadrag.mm
+ qcocoaeventdispatcher.h qcocoaeventdispatcher.mm
+ qcocoahelpers.h qcocoahelpers.mm
+ qcocoainputcontext.h qcocoainputcontext.mm
+ qcocoaintegration.h qcocoaintegration.mm
+ qcocoaintrospection.h qcocoaintrospection.mm
+ qcocoakeymapper.h qcocoakeymapper.mm
+ qcocoamenu.h qcocoamenu.mm
+ qcocoamenubar.h qcocoamenubar.mm
+ qcocoamenuitem.h qcocoamenuitem.mm
+ qcocoamenuloader.h qcocoamenuloader.mm
+ qcocoamimetypes.h qcocoamimetypes.mm
+ qcocoanativeinterface.h qcocoanativeinterface.mm
+ qcocoansmenu.h qcocoansmenu.mm
+ qcocoascreen.h qcocoascreen.mm
+ qcocoaservices.h qcocoaservices.mm
+ qcocoasystemtrayicon.h qcocoasystemtrayicon.mm
+ qcocoatheme.h qcocoatheme.mm
+ qcocoawindow.h qcocoawindow.mm
+ qcocoawindowmanager.h qcocoawindowmanager.mm
+ qiosurfacegraphicsbuffer.h qiosurfacegraphicsbuffer.mm
+ qmacclipboard.h qmacclipboard.mm
+ qmultitouch_mac.mm qmultitouch_mac_p.h
+ qnsview.h qnsview.mm
+ qnswindow.h qnswindow.mm
+ qnswindowdelegate.h qnswindowdelegate.mm
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ ${FWAppKit}
+ ${FWCarbon}
+ ${FWCoreServices}
+ ${FWCoreVideo}
+ ${FWIOKit}
+ ${FWIOSurface}
+ ${FWMetal}
+ ${FWQuartzCore}
+ Cups::Cups
+ Qt::ClipboardSupportPrivate
+ Qt::Core
+ Qt::CorePrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::GraphicsSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::ThemeSupportPrivate
+)
+
+# Resources:
+set(qcocoaresources_resource_files
+ "images/sizeallcursor.png"
+ "images/spincursor.png"
+ "images/waitcursor.png"
+)
+
+qt_add_resource(QCocoaIntegrationPlugin "qcocoaresources"
+ PREFIX
+ "/qt-project.org/mac/cursors"
+ FILES
+ ${qcocoaresources_resource_files}
+)
+
+
+#### Keys ignored in scope 1:.:.:cocoa.pro:<TRUE>:
+# OTHER_FILES = "cocoa.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_opengl
+ SOURCES
+ qcocoaglcontext.h qcocoaglcontext.mm
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_vulkan
+ SOURCES
+ qcocoavulkaninstance.h qcocoavulkaninstance.mm
+ PUBLIC_LIBRARIES
+ Qt::VulkanSupportPrivate
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_accessibility
+ SOURCES
+ qcocoaaccessibility.h qcocoaaccessibility.mm
+ qcocoaaccessibilityelement.h qcocoaaccessibilityelement.mm
+ PUBLIC_LIBRARIES
+ Qt::AccessibilitySupportPrivate
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_sessionmanager
+ SOURCES
+ qcocoasessionmanager.cpp qcocoasessionmanager.h
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION TARGET Qt::Widgets
+ SOURCES
+ qpaintengine_mac.mm qpaintengine_mac_p.h
+ PUBLIC_LIBRARIES
+ Qt::WidgetsPrivate
+)
+
+#### Keys ignored in scope 8:.:.:cocoa.pro:TARGET Qt::Widgets:
+# QT_FOR_CONFIG = "widgets"
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION TARGET Qt::PrintSupport AND TARGET Qt::Widgets
+ SOURCES
+ qcocoaprintdevice.h qcocoaprintdevice.mm
+ qcocoaprintersupport.h qcocoaprintersupport.mm
+ qprintengine_mac.mm qprintengine_mac_p.h
+ PUBLIC_LIBRARIES
+ Qt::PrintSupportPrivate
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_colordialog AND TARGET Qt::Widgets
+ SOURCES
+ qcocoacolordialoghelper.h qcocoacolordialoghelper.mm
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_filedialog AND TARGET Qt::Widgets
+ SOURCES
+ qcocoafiledialoghelper.h qcocoafiledialoghelper.mm
+)
+
+qt_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_fontdialog AND TARGET Qt::Widgets
+ SOURCES
+ qcocoafontdialoghelper.h qcocoafontdialoghelper.mm
+)
+
+#### Keys ignored in scope 13:.:.:cocoa.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/cocoa/cocoa.pro b/src/plugins/platforms/cocoa/cocoa.pro
index 6b93b1acf0..1d1089a634 100644
--- a/src/plugins/platforms/cocoa/cocoa.pro
+++ b/src/plugins/platforms/cocoa/cocoa.pro
@@ -101,6 +101,8 @@ QT += \
qtConfig(vulkan): QT += vulkan_support-private
+qtHaveModule(platformcompositor_support-private): QT += platformcompositor_support-private
+
CONFIG += no_app_extension_api_only
qtHaveModule(widgets) {
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
index 3b9df8da3a..c734be09b6 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.mm
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
@@ -190,7 +190,7 @@ void QNSWindowBackingStore::flush(QWindow *window, const QRegion &region, const
// its parent/ancestor, and the parent/ancestor being the one locked by AppKit.
// In this case we also need to lock and unlock focus manually.
const bool shouldHandleViewLockManually = [NSView focusView] != view;
- if (shouldHandleViewLockManually && ![view lockFocusIfCanDraw]) {
+ if (shouldHandleViewLockManually && !QT_IGNORE_DEPRECATIONS([view lockFocusIfCanDraw])) {
qWarning() << "failed to lock focus of" << view;
return;
}
@@ -264,14 +264,13 @@ void QNSWindowBackingStore::flush(QWindow *window, const QRegion &region, const
// -------------------------------------------------------------------------
if (shouldHandleViewLockManually)
- [view unlockFocus];
+ QT_IGNORE_DEPRECATIONS([view unlockFocus]);
if (drawingOutsideOfDisplayCycle) {
redrawRoundedBottomCorners([view convertRect:region.boundingRect().toCGRect() toView:nil]);
- [view.window flushWindow];
+ QT_IGNORE_DEPRECATIONS([view.window flushWindow]);
}
-
// Done flushing to NSWindow backingstore
QCocoaWindow *topLevelCocoaWindow = static_cast<QCocoaWindow *>(topLevelWindow->handle());
diff --git a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
index c9fa035d87..ff08a306c4 100644
--- a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
@@ -44,6 +44,7 @@
#include "qcocoacolordialoghelper.h"
#include "qcocoahelpers.h"
#include "qcocoaeventdispatcher.h"
+#include "private/qcoregraphics_p.h"
#import <AppKit/AppKit.h>
@@ -181,33 +182,7 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSColorPanelDelegate);
- (void)updateQtColor
{
NSColor *color = [mColorPanel color];
- NSString *colorSpaceName = [color colorSpaceName];
- if (colorSpaceName == NSDeviceCMYKColorSpace) {
- CGFloat cyan = 0, magenta = 0, yellow = 0, black = 0, alpha = 0;
- [color getCyan:&cyan magenta:&magenta yellow:&yellow black:&black alpha:&alpha];
- mQtColor.setCmykF(cyan, magenta, yellow, black, alpha);
- } else if (colorSpaceName == NSCalibratedRGBColorSpace || colorSpaceName == NSDeviceRGBColorSpace) {
- CGFloat red = 0, green = 0, blue = 0, alpha = 0;
- [color getRed:&red green:&green blue:&blue alpha:&alpha];
- mQtColor.setRgbF(red, green, blue, alpha);
- } else if (colorSpaceName == NSNamedColorSpace) {
- NSColor *tmpColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
- CGFloat red = 0, green = 0, blue = 0, alpha = 0;
- [tmpColor getRed:&red green:&green blue:&blue alpha:&alpha];
- mQtColor.setRgbF(red, green, blue, alpha);
- } else {
- NSColorSpace *colorSpace = [color colorSpace];
- if ([colorSpace colorSpaceModel] == NSCMYKColorSpaceModel && [color numberOfComponents] == 5){
- CGFloat components[5];
- [color getComponents:components];
- mQtColor.setCmykF(components[0], components[1], components[2], components[3], components[4]);
- } else {
- NSColor *tmpColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
- CGFloat red = 0, green = 0, blue = 0, alpha = 0;
- [tmpColor getRed:&red green:&green blue:&blue alpha:&alpha];
- mQtColor.setRgbF(red, green, blue, alpha);
- }
- }
+ mQtColor = qt_mac_toQColor(color);
if (mHelper)
emit mHelper->currentColorChanged(mQtColor);
}
diff --git a/src/plugins/platforms/cocoa/qcocoadrag.mm b/src/plugins/platforms/cocoa/qcocoadrag.mm
index b4a16ab912..3525fddfd1 100644
--- a/src/plugins/platforms/cocoa/qcocoadrag.mm
+++ b/src/plugins/platforms/cocoa/qcocoadrag.mm
@@ -40,9 +40,6 @@
#include "qcocoadrag.h"
#include "qmacclipboard.h"
#include "qcocoahelpers.h"
-#ifndef QT_NO_WIDGETS
-#include <QtWidgets/qwidget.h>
-#endif
#include <QtGui/private/qcoregraphics_p.h>
QT_BEGIN_NAMESPACE
@@ -189,19 +186,17 @@ QPixmap QCocoaDrag::dragPixmap(QDrag *drag, QPoint &hotSpot) const
const int height = fm.height();
if (width > 0 && height > 0) {
qreal dpr = 1.0;
- if (const QWindow *sourceWindow = qobject_cast<QWindow *>(drag->source())) {
- dpr = sourceWindow->devicePixelRatio();
- }
-#ifndef QT_NO_WIDGETS
- else if (const QWidget *sourceWidget = qobject_cast<QWidget *>(drag->source())) {
- if (const QWindow *sourceWindow = sourceWidget->window()->windowHandle())
- dpr = sourceWindow->devicePixelRatio();
- }
-#endif
- else {
- if (const QWindow *focusWindow = qApp->focusWindow())
- dpr = focusWindow->devicePixelRatio();
+ QWindow *window = qobject_cast<QWindow *>(drag->source());
+ if (!window && drag->source()->metaObject()->indexOfMethod("_q_closestWindowHandle()") != -1) {
+ QMetaObject::invokeMethod(drag->source(), "_q_closestWindowHandle",
+ Q_RETURN_ARG(QWindow *, window));
}
+ if (!window)
+ window = qApp->focusWindow();
+
+ if (window)
+ dpr = window->devicePixelRatio();
+
pm = QPixmap(width * dpr, height * dpr);
pm.setDevicePixelRatio(dpr);
QPainter p(&pm);
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
index ccb6e20071..9ca3892cbb 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
@@ -145,17 +145,17 @@ void QCocoaGLContext::initialize()
// --------------------- Set NSOpenGLContext properties ---------------------
const GLint interval = m_format.swapInterval() >= 0 ? m_format.swapInterval() : 1;
- [m_context setValues:&interval forParameter:NSOpenGLCPSwapInterval];
+ [m_context setValues:&interval forParameter:NSOpenGLContextParameterSwapInterval];
if (m_format.alphaBufferSize() > 0) {
int zeroOpacity = 0;
- [m_context setValues:&zeroOpacity forParameter:NSOpenGLCPSurfaceOpacity];
+ [m_context setValues:&zeroOpacity forParameter:NSOpenGLContextParameterSurfaceOpacity];
}
// OpenGL surfaces can be ordered either above(default) or below the NSWindow
// FIXME: Promote to QSurfaceFormat option or property
const GLint order = qt_mac_resolveOption(1, "QT_MAC_OPENGL_SURFACE_ORDER");
- [m_context setValues:&order forParameter:NSOpenGLCPSurfaceOrder];
+ [m_context setValues:&order forParameter:NSOpenGLContextParameterSurfaceOrder];
updateSurfaceFormat();
@@ -342,7 +342,7 @@ void QCocoaGLContext::updateSurfaceFormat()
return value;
};
- m_format.setSwapInterval(glContextParameter(NSOpenGLCPSwapInterval));
+ m_format.setSwapInterval(glContextParameter(NSOpenGLContextParameterSwapInterval));
if (oldContext)
[oldContext makeCurrentContext];
@@ -390,7 +390,7 @@ bool QCocoaGLContext::setDrawable(QPlatformSurface *surface)
// Clear the current drawable and reset the active window, so that GL
// commands that don't target a specific FBO will not end up stomping
// on the previously set drawable.
- qCDebug(lcQpaOpenGLContext) << "Clearing current drawable" << m_context.view << "for" << m_context;
+ qCDebug(lcQpaOpenGLContext) << "Clearing current drawable" << QT_IGNORE_DEPRECATIONS(m_context.view) << "for" << m_context;
[m_context clearDrawable];
return true;
}
@@ -399,7 +399,7 @@ bool QCocoaGLContext::setDrawable(QPlatformSurface *surface)
auto *cocoaWindow = static_cast<QCocoaWindow *>(surface);
QNSView *view = qnsview_cast(cocoaWindow->view());
- if (view == m_context.view)
+ if (view == QT_IGNORE_DEPRECATIONS(m_context.view))
return true;
prepareDrawable(cocoaWindow);
@@ -412,7 +412,7 @@ bool QCocoaGLContext::setDrawable(QPlatformSurface *surface)
auto updateCallback = [this, view]() {
Q_ASSERT(QThread::currentThread() == qApp->thread());
- if (m_context.view != view)
+ if (QT_IGNORE_DEPRECATIONS(m_context.view) != view)
return;
m_needsUpdate = true;
};
@@ -423,7 +423,7 @@ bool QCocoaGLContext::setDrawable(QPlatformSurface *surface)
m_updateObservers.append(QMacNotificationObserver(view, NSViewFrameDidChangeNotification, updateCallback));
m_updateObservers.append(QMacNotificationObserver(view.window, NSWindowDidChangeScreenNotification, updateCallback));
} else {
- m_updateObservers.append(QMacNotificationObserver(view, NSViewGlobalFrameDidChangeNotification, updateCallback));
+ m_updateObservers.append(QMacNotificationObserver(view, QT_IGNORE_DEPRECATIONS(NSViewGlobalFrameDidChangeNotification), updateCallback));
}
m_updateObservers.append(QMacNotificationObserver([NSApplication sharedApplication],
@@ -435,14 +435,14 @@ bool QCocoaGLContext::setDrawable(QPlatformSurface *surface)
// have the same effect as an update.
// Now we are ready to associate the view with the context
- m_context.view = view;
- if (m_context.view != view) {
+ QT_IGNORE_DEPRECATIONS(m_context.view) = view;
+ if (QT_IGNORE_DEPRECATIONS(m_context.view) != view) {
qCInfo(lcQpaOpenGLContext) << "Failed to set" << view << "as drawable for" << m_context;
m_updateObservers.clear();
return false;
}
- qCInfo(lcQpaOpenGLContext) << "Set drawable for" << m_context << "to" << m_context.view;
+ qCInfo(lcQpaOpenGLContext) << "Set drawable for" << m_context << "to" << QT_IGNORE_DEPRECATIONS(m_context.view);
return true;
}
@@ -467,7 +467,7 @@ void QCocoaGLContext::prepareDrawable(QCocoaWindow *platformWindow)
}
}
- view.wantsBestResolutionOpenGLSurface = prefersBestResolutionOpenGLSurface;
+ QT_IGNORE_DEPRECATIONS(view.wantsBestResolutionOpenGLSurface) = prefersBestResolutionOpenGLSurface;
}
// NSOpenGLContext is not re-entrant. Even when using separate contexts per thread,
@@ -483,7 +483,7 @@ void QCocoaGLContext::update()
QMacAutoReleasePool pool;
QMutexLocker locker(&s_reentrancyMutex);
- qCInfo(lcQpaOpenGLContext) << "Updating" << m_context << "for" << m_context.view;
+ qCInfo(lcQpaOpenGLContext) << "Updating" << m_context << "for" << QT_IGNORE_DEPRECATIONS(m_context.view);
[m_context update];
}
@@ -501,7 +501,7 @@ void QCocoaGLContext::swapBuffers(QPlatformSurface *surface)
return;
}
- if (m_context.view.layer) {
+ if (QT_IGNORE_DEPRECATIONS(m_context.view).layer) {
// Flushing an NSOpenGLContext will hit the screen immediately, ignoring
// any Core Animation transactions in place. This may result in major
// visual artifacts if the flush happens out of sync with the size
diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.h b/src/plugins/platforms/cocoa/qcocoahelpers.h
index 71e72dca4f..d0e105987a 100644
--- a/src/plugins/platforms/cocoa/qcocoahelpers.h
+++ b/src/plugins/platforms/cocoa/qcocoahelpers.h
@@ -73,6 +73,14 @@ Q_DECLARE_LOGGING_CATEGORY(lcQpaDrawing)
Q_DECLARE_LOGGING_CATEGORY(lcQpaMouse)
Q_DECLARE_LOGGING_CATEGORY(lcQpaScreen)
+#ifndef QT_IGNORE_DEPRECATIONS
+#define QT_IGNORE_DEPRECATIONS(statement) \
+ QT_WARNING_PUSH \
+ QT_WARNING_DISABLE_DEPRECATED \
+ statement \
+ QT_WARNING_POP
+#endif
+
class QPixmap;
class QString;
diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.mm b/src/plugins/platforms/cocoa/qcocoahelpers.mm
index c9eafa81d0..dab67268e3 100644
--- a/src/plugins/platforms/cocoa/qcocoahelpers.mm
+++ b/src/plugins/platforms/cocoa/qcocoahelpers.mm
@@ -514,8 +514,8 @@ QT_END_NAMESPACE
- (NSButton *)createButtonWithTitle:(const char *)title
{
NSButton *button = [[NSButton alloc] initWithFrame:NSZeroRect];
- button.buttonType = NSMomentaryLightButton;
- button.bezelStyle = NSRoundedBezelStyle;
+ button.buttonType = NSButtonTypeMomentaryLight;
+ button.bezelStyle = NSBezelStyleRounded;
const QString &cleanTitle = QPlatformTheme::removeMnemonics(QCoreApplication::translate("QDialogButtonBox", title));
// FIXME: Not obvious, from Cocoa's documentation, that QString::toNSString() makes a deep copy
button.title = (NSString *)cleanTitle.toCFString();
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h
index 0c14e07551..30838ba254 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.h
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.h
@@ -128,6 +128,8 @@ public:
void beep() const override;
+ void closePopups(QWindow *forWindow = nullptr);
+
private Q_SLOTS:
void focusWindowChanged(QWindow *);
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm
index 245db429c5..f273fa9d75 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.mm
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm
@@ -68,6 +68,10 @@
#include <QtFontDatabaseSupport/private/qfontengine_coretext_p.h>
+#if QT_CONFIG(opengl)
+#include <QtPlatformCompositorSupport/qpa/qplatformbackingstoreopenglsupport.h>
+#endif
+
#ifdef QT_WIDGETS_LIB
#include <QtWidgets/qtwidgetsglobal.h>
#if QT_CONFIG(filedialog)
@@ -324,10 +328,16 @@ QPlatformBackingStore *QCocoaIntegration::createPlatformBackingStore(QWindow *wi
return nullptr;
}
+ QPlatformBackingStore *backingStore = nullptr;
if (platformWindow->view().layer)
- return new QCALayerBackingStore(window);
+ backingStore = new QCALayerBackingStore(window);
else
- return new QNSWindowBackingStore(window);
+ backingStore = new QNSWindowBackingStore(window);
+
+#if QT_CONFIG(opengl)
+ backingStore->setOpenGLSupport(new QPlatformBackingStoreOpenGLSupport(backingStore));
+#endif
+ return backingStore;
}
QAbstractEventDispatcher *QCocoaIntegration::createEventDispatcher() const
@@ -480,6 +490,19 @@ void QCocoaIntegration::beep() const
NSBeep();
}
+void QCocoaIntegration::closePopups(QWindow *forWindow)
+{
+ for (auto it = m_popupWindowStack.begin(); it != m_popupWindowStack.end();) {
+ auto *popup = *it;
+ if (!forWindow || popup->window()->transientParent() == forWindow) {
+ it = m_popupWindowStack.erase(it);
+ QWindowSystemInterface::handleCloseEvent<QWindowSystemInterface::SynchronousDelivery>(popup->window());
+ } else {
+ ++it;
+ }
+ }
+}
+
void QCocoaIntegration::focusWindowChanged(QWindow *focusWindow)
{
// Don't revert icon just because we lost focus
diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
index 3b37e7c9c1..c117ce6a84 100644
--- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
@@ -52,7 +52,6 @@
#include <QtCore/qregularexpression.h>
#include <QtCore/QDebug>
-#include <QtCore/QRegExp>
QT_BEGIN_NAMESPACE
@@ -398,7 +397,7 @@ NSMenuItem *QCocoaMenuItem::sync()
m_native.image = [NSImage imageFromQIcon:m_icon withSize:m_iconSize];
- m_native.state = m_checked ? NSOnState : NSOffState;
+ m_native.state = m_checked ? NSControlStateValueOn : NSControlStateValueOff;
return m_native;
}
diff --git a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
index 704498acb1..8c96b2376f 100644
--- a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
+++ b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
@@ -281,7 +281,7 @@ void QCocoaSystemTrayIcon::statusItemClicked()
emit activated(activationReason);
if (NSMenu *menu = m_menu ? m_menu->nsMenu() : nil)
- [m_statusItem popUpStatusItemMenu:menu];
+ QT_IGNORE_DEPRECATIONS([m_statusItem popUpStatusItemMenu:menu]);
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index 291a27b15e..4688598da7 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -150,6 +150,7 @@ public:
Q_NOTIFICATION_HANDLER(NSWindowDidEndLiveResizeNotification) void windowDidEndLiveResize();
Q_NOTIFICATION_HANDLER(NSWindowDidBecomeKeyNotification) void windowDidBecomeKey();
Q_NOTIFICATION_HANDLER(NSWindowDidResignKeyNotification) void windowDidResignKey();
+ Q_NOTIFICATION_HANDLER(NSWindowWillMiniaturizeNotification) void windowWillMiniaturize();
Q_NOTIFICATION_HANDLER(NSWindowDidMiniaturizeNotification) void windowDidMiniaturize();
Q_NOTIFICATION_HANDLER(NSWindowDidDeminiaturizeNotification) void windowDidDeminiaturize();
Q_NOTIFICATION_HANDLER(NSWindowWillEnterFullScreenNotification) void windowWillEnterFullScreen();
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 79dfe58a4e..f387c0d093 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -71,14 +71,6 @@ enum {
defaultWindowHeight = 160
};
-static void qt_closePopups()
-{
- while (QCocoaWindow *popup = QCocoaIntegration::instance()->popPopupWindow()) {
- QWindowSystemInterface::handleCloseEvent(popup->window());
- QWindowSystemInterface::flushWindowSystemEvents();
- }
-}
-
Q_LOGGING_CATEGORY(lcCocoaNotifications, "qt.qpa.cocoa.notifications");
static void qRegisterNotificationCallbacks()
@@ -819,6 +811,11 @@ void QCocoaWindow::windowDidExitFullScreen()
}
}
+void QCocoaWindow::windowWillMiniaturize()
+{
+ QCocoaIntegration::instance()->closePopups(window());
+}
+
void QCocoaWindow::windowDidMiniaturize()
{
if (!isContentView())
@@ -1153,7 +1150,7 @@ void QCocoaWindow::viewDidChangeGlobalFrame()
void QCocoaWindow::windowWillMove()
{
// Close any open popups on window move
- qt_closePopups();
+ QCocoaIntegration::instance()->closePopups();
}
void QCocoaWindow::windowDidMove()
@@ -1284,7 +1281,7 @@ void QCocoaWindow::windowWillClose()
{
// Close any open popups on window closing.
if (window() && !windowIsPopupType(window()->type()))
- qt_closePopups();
+ QCocoaIntegration::instance()->closePopups();
}
// ----------------------- NSWindowDelegate callbacks -----------------------
diff --git a/src/plugins/platforms/cocoa/qmacclipboard.mm b/src/plugins/platforms/cocoa/qmacclipboard.mm
index 99b378be68..3202c6926e 100644
--- a/src/plugins/platforms/cocoa/qmacclipboard.mm
+++ b/src/plugins/platforms/cocoa/qmacclipboard.mm
@@ -594,7 +594,7 @@ QString qt_mac_get_pasteboardString(PasteboardRef paste)
pb = [NSPasteboard generalPasteboard];
}
if (pb) {
- NSString *text = [pb stringForType:NSStringPboardType];
+ NSString *text = [pb stringForType:NSPasteboardTypeString];
if (text)
return QString::fromNSString(text);
}
diff --git a/src/plugins/platforms/cocoa/qmultitouch_mac_p.h b/src/plugins/platforms/cocoa/qmultitouch_mac_p.h
index 044bcd1882..dff289f746 100644
--- a/src/plugins/platforms/cocoa/qmultitouch_mac_p.h
+++ b/src/plugins/platforms/cocoa/qmultitouch_mac_p.h
@@ -58,6 +58,7 @@
#include <qpa/qwindowsysteminterface.h>
#include <qhash.h>
#include <QtCore>
+#include <QtGui/qtouchdevice.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qnsview_dragging.mm b/src/plugins/platforms/cocoa/qnsview_dragging.mm
index 463e3c5579..2e88b6a08f 100644
--- a/src/plugins/platforms/cocoa/qnsview_dragging.mm
+++ b/src/plugins/platforms/cocoa/qnsview_dragging.mm
@@ -47,15 +47,14 @@
NSString * const mimeTypeGeneric = @"com.trolltech.qt.MimeTypeName";
NSMutableArray<NSString *> *supportedTypes = [NSMutableArray<NSString *> arrayWithArray:@[
- NSColorPboardType,
- NSFilenamesPboardType, NSStringPboardType,
- NSFilenamesPboardType, NSPostScriptPboardType, NSTIFFPboardType,
- NSRTFPboardType, NSTabularTextPboardType, NSFontPboardType,
- NSRulerPboardType, NSFileContentsPboardType, NSColorPboardType,
- NSRTFDPboardType, NSHTMLPboardType,
- NSURLPboardType, NSPDFPboardType, NSVCardPboardType,
- NSFilesPromisePboardType, NSInkTextPboardType,
- NSMultipleTextSelectionPboardType, mimeTypeGeneric]];
+ NSPasteboardTypeColor, NSPasteboardTypeString,
+ NSPasteboardTypeFileURL, @"com.adobe.encapsulated-postscript", NSPasteboardTypeTIFF,
+ NSPasteboardTypeRTF, NSPasteboardTypeTabularText, NSPasteboardTypeFont,
+ NSPasteboardTypeRuler, NSFileContentsPboardType,
+ NSPasteboardTypeRTFD , NSPasteboardTypeHTML,
+ NSPasteboardTypeURL, NSPasteboardTypePDF, (NSString *)kUTTypeVCard,
+ (NSString *)kPasteboardTypeFileURLPromise, (NSString *)kUTTypeInkText,
+ NSPasteboardTypeMultipleTextSelection, mimeTypeGeneric]];
// Add custom types supported by the application
for (const QString &customType : qt_mac_enabledDraggedTypes())
diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.mm b/src/plugins/platforms/cocoa/qnswindowdelegate.mm
index 9502a315d8..3ad9085dea 100644
--- a/src/plugins/platforms/cocoa/qnswindowdelegate.mm
+++ b/src/plugins/platforms/cocoa/qnswindowdelegate.mm
@@ -47,7 +47,13 @@
#include <qpa/qplatformscreen.h>
#include <qpa/qwindowsysteminterface.h>
-static QRegExp whitespaceRegex = QRegExp(QStringLiteral("\\s*"));
+static inline bool isWhiteSpace(const QString &s)
+{
+ for (int i = 0; i < s.size(); ++i)
+ if (!s.at(i).isSpace())
+ return false;
+ return true;
+}
static QCocoaWindow *toPlatformWindow(NSWindow *window)
{
@@ -113,7 +119,7 @@ static QCocoaWindow *toPlatformWindow(NSWindow *window)
// Only pop up document path if the filename is non-empty. We allow whitespace, to
// allow faking a window icon by setting the file path to a single space character.
- return !whitespaceRegex.exactMatch(platformWindow->window()->filePath());
+ return !isWhiteSpace(platformWindow->window()->filePath());
}
- (BOOL)window:(NSWindow *)window shouldDragDocumentWithEvent:(NSEvent *)event from:(NSPoint)dragImageLocation withPasteboard:(NSPasteboard *)pasteboard
@@ -127,6 +133,6 @@ static QCocoaWindow *toPlatformWindow(NSWindow *window)
// Only allow drag if the filename is non-empty. We allow whitespace, to
// allow faking a window icon by setting the file path to a single space.
- return !whitespaceRegex.exactMatch(platformWindow->window()->filePath());
+ return !isWhiteSpace(platformWindow->window()->filePath());
}
@end
diff --git a/src/plugins/platforms/cocoa/qpaintengine_mac.mm b/src/plugins/platforms/cocoa/qpaintengine_mac.mm
index 5ced962cb1..b50c39c9b0 100644
--- a/src/plugins/platforms/cocoa/qpaintengine_mac.mm
+++ b/src/plugins/platforms/cocoa/qpaintengine_mac.mm
@@ -93,7 +93,7 @@ CGImageRef qt_mac_create_imagemask(const QPixmap &pixmap, const QRectF &sr)
image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
const int sx = qRound(sr.x()), sy = qRound(sr.y()), sw = qRound(sr.width()), sh = qRound(sr.height());
- const int sbpr = image.bytesPerLine();
+ const qsizetype sbpr = image.bytesPerLine();
const uint nbytes = sw * sh;
// alpha is always 255 for bitmaps, ignore it in this case.
const quint32 mask = pixmap.depth() == 1 ? 0x00ffffff : 0xffffffff;
diff --git a/src/plugins/platforms/directfb/.prev_CMakeLists.txt b/src/plugins/platforms/directfb/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..33beaa3da4
--- /dev/null
+++ b/src/plugins/platforms/directfb/.prev_CMakeLists.txt
@@ -0,0 +1,61 @@
+# Generated from directfb.pro.
+
+#####################################################################
+## QDirectFbIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QDirectFbIntegrationPlugin
+ OUTPUT_NAME qdirectfb
+ TYPE platforms
+ SOURCES
+ main.cpp
+ qdirectfbbackingstore.cpp qdirectfbbackingstore.h
+ qdirectfbblitter.cpp qdirectfbblitter.h
+ qdirectfbconvenience.cpp qdirectfbconvenience.h
+ qdirectfbcursor.cpp qdirectfbcursor.h
+ qdirectfbeglhooks.h
+ qdirectfbinput.cpp qdirectfbinput.h
+ qdirectfbintegration.cpp qdirectfbintegration.h
+ qdirectfbscreen.cpp qdirectfbscreen.h
+ qdirectfbwindow.cpp qdirectfbwindow.h
+ PUBLIC_LIBRARIES
+ PkgConfig::DirectFB
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::ServiceSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:directfb.pro:<TRUE>:
+# OTHER_FILES = "directfb.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QDirectFbIntegrationPlugin CONDITION QT_CONFIG___contains___directfb_egl
+ SOURCES
+ qdirectfb_egl.cpp qdirectfb_egl.h
+ DEFINES
+ DIRECTFB_GL_EGL
+ PUBLIC_LIBRARIES
+ Qt::EglSupportPrivate
+)
+
+qt_extend_target(QDirectFbIntegrationPlugin CONDITION NOT DIRECTFB_PLATFORM_HOOKS_SOURCES_ISEMPTY
+ DEFINES
+ DIRECTFB_PLATFORM_HOOKS
+)
+
+#### Keys ignored in scope 3:.:.:directfb.pro:NOT DIRECTFB_PLATFORM_HOOKS_SOURCES_ISEMPTY:
+# QMAKE_LIBDIR = "$$DIRECTFB_PLATFORM_HOOKS_LIBDIR"
+
+qt_extend_target(QDirectFbIntegrationPlugin CONDITION DIRECTFB_PLATFORM_HOOKS_SOURCES_ISEMPTY
+ SOURCES
+ qdirectfbeglhooks_stub.cpp
+)
+
+#### Keys ignored in scope 5:.:.:directfb.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/directfb/CMakeLists.txt b/src/plugins/platforms/directfb/CMakeLists.txt
new file mode 100644
index 0000000000..c723ca75f4
--- /dev/null
+++ b/src/plugins/platforms/directfb/CMakeLists.txt
@@ -0,0 +1,65 @@
+# Generated from directfb.pro.
+
+# begin special case:
+qt_find_package(DirectFB)
+# end special case:
+
+#####################################################################
+## QDirectFbIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QDirectFbIntegrationPlugin
+ OUTPUT_NAME qdirectfb
+ TYPE platforms
+ SOURCES
+ main.cpp
+ qdirectfbbackingstore.cpp qdirectfbbackingstore.h
+ qdirectfbblitter.cpp qdirectfbblitter.h
+ qdirectfbconvenience.cpp qdirectfbconvenience.h
+ qdirectfbcursor.cpp qdirectfbcursor.h
+ qdirectfbeglhooks.h
+ qdirectfbinput.cpp qdirectfbinput.h
+ qdirectfbintegration.cpp qdirectfbintegration.h
+ qdirectfbscreen.cpp qdirectfbscreen.h
+ qdirectfbwindow.cpp qdirectfbwindow.h
+ PUBLIC_LIBRARIES
+ PkgConfig::DirectFB
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::ServiceSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:directfb.pro:<TRUE>:
+# OTHER_FILES = "directfb.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QDirectFbIntegrationPlugin CONDITION QT_CONFIG___contains___directfb_egl
+ SOURCES
+ qdirectfb_egl.cpp qdirectfb_egl.h
+ DEFINES
+ DIRECTFB_GL_EGL
+ PUBLIC_LIBRARIES
+ Qt::EglSupportPrivate
+)
+
+qt_extend_target(QDirectFbIntegrationPlugin CONDITION NOT DIRECTFB_PLATFORM_HOOKS_SOURCES_ISEMPTY
+ DEFINES
+ DIRECTFB_PLATFORM_HOOKS
+)
+
+#### Keys ignored in scope 3:.:.:directfb.pro:NOT DIRECTFB_PLATFORM_HOOKS_SOURCES_ISEMPTY:
+# QMAKE_LIBDIR = "$$DIRECTFB_PLATFORM_HOOKS_LIBDIR"
+
+qt_extend_target(QDirectFbIntegrationPlugin CONDITION DIRECTFB_PLATFORM_HOOKS_SOURCES_ISEMPTY
+ SOURCES
+ qdirectfbeglhooks_stub.cpp
+)
+
+#### Keys ignored in scope 5:.:.:directfb.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/eglfs/.prev_CMakeLists.txt b/src/plugins/platforms/eglfs/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..896b8cd3e8
--- /dev/null
+++ b/src/plugins/platforms/eglfs/.prev_CMakeLists.txt
@@ -0,0 +1,115 @@
+# Generated from eglfs.pro.
+
+#####################################################################
+## EglFSDeviceIntegration Module:
+#####################################################################
+
+qt_add_module(EglFSDeviceIntegration
+ INTERNAL_MODULE
+ SOURCES
+ api/qeglfsdeviceintegration.cpp api/qeglfsdeviceintegration_p.h
+ api/qeglfsglobal_p.h
+ api/qeglfshooks.cpp api/qeglfshooks_p.h
+ api/qeglfsintegration.cpp api/qeglfsintegration_p.h
+ api/qeglfsoffscreenwindow.cpp api/qeglfsoffscreenwindow_p.h
+ api/qeglfsscreen.cpp api/qeglfsscreen_p.h
+ api/qeglfswindow.cpp api/qeglfswindow_p.h
+ DEFINES
+ QT_BUILD_EGL_DEVICE_LIB
+ QT_EGL_NO_X11
+ INCLUDE_DIRECTORIES
+ api
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::DeviceDiscoverySupportPrivate
+ Qt::EglSupportPrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FbSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::GuiPrivate
+ Qt::ServiceSupportPrivate
+ Qt::ThemeSupportPrivate
+)
+
+#### Keys ignored in scope 2:.:.:eglfsdeviceintegration.pro:<TRUE>:
+# MODULE = "eglfsdeviceintegration"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(EglFSDeviceIntegration CONDITION TARGET Qt::InputSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::InputSupportPrivate
+)
+
+qt_extend_target(EglFSDeviceIntegration CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+qt_extend_target(EglFSDeviceIntegration CONDITION QT_FEATURE_vulkan
+ SOURCES
+ api/vulkan/qeglfsvulkaninstance.cpp api/vulkan/qeglfsvulkaninstance_p.h
+ api/vulkan/qeglfsvulkanwindow.cpp api/vulkan/qeglfsvulkanwindow_p.h
+ PUBLIC_LIBRARIES
+ Qt::VulkanSupportPrivate
+)
+
+qt_extend_target(EglFSDeviceIntegration CONDITION NOT EGLFS_PLATFORM_HOOKS_SOURCES_ISEMPTY
+ DEFINES
+ EGLFS_PLATFORM_HOOKS
+)
+
+qt_extend_target(EglFSDeviceIntegration CONDITION NOT EGLFS_DEVICE_INTEGRATION_ISEMPTY
+ DEFINES
+ EGLFS_PREFERRED_PLUGIN=
+)
+
+if(QT_FEATURE_cursor)
+ # Resources:
+ set(cursor_resource_files
+ "cursor-atlas.png"
+ "cursor.json"
+ )
+
+ qt_add_resource(EglFSDeviceIntegration "cursor"
+ PREFIX
+ "/"
+ FILES
+ ${cursor_resource_files}
+ )
+endif()
+
+qt_extend_target(EglFSDeviceIntegration CONDITION QT_FEATURE_opengl
+ SOURCES
+ api/qeglfscontext.cpp api/qeglfscontext_p.h
+ api/qeglfscursor.cpp api/qeglfscursor_p.h
+ PUBLIC_LIBRARIES
+ Qt::OpenGLPrivate
+)
+#####################################################################
+## QEglFSIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QEglFSIntegrationPlugin
+ OUTPUT_NAME qeglfs
+ TYPE platforms
+ SOURCES
+ qeglfsmain.cpp
+ DEFINES
+ QT_EGL_NO_X11
+ INCLUDE_DIRECTORIES
+ api
+ PUBLIC_LIBRARIES
+ Qt::EglFSDeviceIntegrationPrivate
+)
+
+#### Keys ignored in scope 13:.:.:eglfs-plugin.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/eglfs.json"
+
+## Scopes:
+#####################################################################
+
+#### Keys ignored in scope 14:.:.:eglfs-plugin.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
+add_subdirectory(deviceintegration)
diff --git a/src/plugins/platforms/eglfs/CMakeLists.txt b/src/plugins/platforms/eglfs/CMakeLists.txt
new file mode 100644
index 0000000000..0078c1f0d7
--- /dev/null
+++ b/src/plugins/platforms/eglfs/CMakeLists.txt
@@ -0,0 +1,114 @@
+# Generated from eglfs.pro.
+qt_find_package(EGL) # special case
+
+#####################################################################
+## EglFSDeviceIntegration Module:
+#####################################################################
+
+qt_add_module(EglFSDeviceIntegration
+ INTERNAL_MODULE
+ SOURCES
+ api/qeglfsdeviceintegration.cpp api/qeglfsdeviceintegration_p.h
+ api/qeglfsglobal_p.h
+ api/qeglfshooks.cpp api/qeglfshooks_p.h
+ api/qeglfsintegration.cpp api/qeglfsintegration_p.h
+ api/qeglfsoffscreenwindow.cpp api/qeglfsoffscreenwindow_p.h
+ api/qeglfsscreen.cpp api/qeglfsscreen_p.h
+ api/qeglfswindow.cpp api/qeglfswindow_p.h
+ DEFINES
+ QT_BUILD_EGL_DEVICE_LIB
+ QT_EGL_NO_X11
+ INCLUDE_DIRECTORIES
+ api
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::DeviceDiscoverySupportPrivate
+ Qt::EglSupportPrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FbSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::GuiPrivate
+ Qt::ServiceSupportPrivate
+ Qt::ThemeSupportPrivate
+ EGL::EGL # special case
+)
+
+#### Keys ignored in scope 2:.:.:eglfsdeviceintegration.pro:<TRUE>:
+# MODULE = "eglfsdeviceintegration"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(EglFSDeviceIntegration CONDITION TARGET Qt::InputSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::InputSupportPrivate
+)
+
+qt_extend_target(EglFSDeviceIntegration CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+qt_extend_target(EglFSDeviceIntegration CONDITION QT_FEATURE_vulkan
+ SOURCES
+ api/vulkan/qeglfsvulkaninstance.cpp api/vulkan/qeglfsvulkaninstance_p.h
+ api/vulkan/qeglfsvulkanwindow.cpp api/vulkan/qeglfsvulkanwindow_p.h
+ PUBLIC_LIBRARIES
+ Qt::VulkanSupportPrivate
+)
+
+# special case:
+# extend_target(EglFSDeviceIntegration CONDITION NOT EGLFS_PLATFORM_HOOKS_SOURCES_ISEMPTY ...
+# extend_target(EglFSDeviceIntegration CONDITION NOT EGLFS_DEVICE_INTEGRATION_ISEMPTY ...
+
+if(QT_FEATURE_cursor) # special case
+ # Resources:
+ set(cursor_resource_files
+ "cursor-atlas.png"
+ "cursor.json"
+ )
+
+ qt_add_resource(EglFSDeviceIntegration "cursor"
+ PREFIX
+ "/"
+ FILES
+ ${cursor_resource_files}
+ )
+endif()
+
+qt_extend_target(EglFSDeviceIntegration CONDITION QT_FEATURE_opengl
+ SOURCES
+ api/qeglfscontext.cpp api/qeglfscontext_p.h
+ api/qeglfscursor.cpp api/qeglfscursor_p.h
+ PUBLIC_LIBRARIES
+ Qt::OpenGLPrivate
+)
+#####################################################################
+## QEglFSIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QEglFSIntegrationPlugin
+ OUTPUT_NAME qeglfs
+ TYPE platforms
+ DEFAULT_IF ${QT_QPA_DEFAULT_PLATFORM} MATCHES eglfs # special case
+ SOURCES
+ qeglfsmain.cpp
+ DEFINES
+ QT_EGL_NO_X11
+ INCLUDE_DIRECTORIES
+ api
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate # special case
+ Qt::EglFSDeviceIntegrationPrivate
+ EGL::EGL # special case
+)
+
+#### Keys ignored in scope 13:.:.:eglfs-plugin.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/eglfs.json"
+
+## Scopes:
+#####################################################################
+
+#### Keys ignored in scope 14:.:.:eglfs-plugin.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
+add_subdirectory(deviceintegration)
diff --git a/src/plugins/platforms/eglfs/api/api.pri b/src/plugins/platforms/eglfs/api/api.pri
index 68965b58d8..bcb72c9ea7 100644
--- a/src/plugins/platforms/eglfs/api/api.pri
+++ b/src/plugins/platforms/eglfs/api/api.pri
@@ -15,6 +15,7 @@ HEADERS += $$PWD/qeglfswindow_p.h \
$$PWD/qeglfsglobal_p.h
qtConfig(opengl) {
+ QT += opengl-private
SOURCES += \
$$PWD/qeglfscursor.cpp \
$$PWD/qeglfscontext.cpp
diff --git a/src/plugins/platforms/eglfs/api/qeglfscursor.cpp b/src/plugins/platforms/eglfs/api/qeglfscursor.cpp
index 98e05195ee..b8bd7e038b 100644
--- a/src/plugins/platforms/eglfs/api/qeglfscursor.cpp
+++ b/src/plugins/platforms/eglfs/api/qeglfscursor.cpp
@@ -50,7 +50,7 @@
#include <QtCore/QJsonObject>
#include <QtGui/private/qguiapplication_p.h>
-#include <QtGui/private/qopenglvertexarrayobject_p.h>
+#include <QtOpenGL/private/qopenglvertexarrayobject_p.h>
#ifndef GL_VERTEX_ARRAY_BINDING
#define GL_VERTEX_ARRAY_BINDING 0x85B5
diff --git a/src/plugins/platforms/eglfs/api/qeglfscursor_p.h b/src/plugins/platforms/eglfs/api/qeglfscursor_p.h
index 8768f9dd8c..7a6044aca0 100644
--- a/src/plugins/platforms/eglfs/api/qeglfscursor_p.h
+++ b/src/plugins/platforms/eglfs/api/qeglfscursor_p.h
@@ -54,9 +54,9 @@
#include "qeglfsglobal_p.h"
#include <qpa/qplatformcursor.h>
#include <qpa/qplatformscreen.h>
+#include <QtOpenGL/QOpenGLShaderProgram>
#include <QtGui/QMatrix4x4>
#include <QtGui/QOpenGLFunctions>
-#include <QtGui/QOpenGLShaderProgram>
#include <QtGui/private/qinputdevicemanager_p.h>
#include <QtCore/qvector.h>
diff --git a/src/plugins/platforms/eglfs/deviceintegration/.prev_CMakeLists.txt b/src/plugins/platforms/eglfs/deviceintegration/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..d08bf6bc20
--- /dev/null
+++ b/src/plugins/platforms/eglfs/deviceintegration/.prev_CMakeLists.txt
@@ -0,0 +1,38 @@
+# Generated from deviceintegration.pro.
+
+if(QT_FEATURE_eglfs_x11)
+ add_subdirectory(eglfs_x11)
+endif()
+if(QT_FEATURE_eglfs_egldevice OR QT_FEATURE_eglfs_gbm)
+ add_subdirectory(eglfs_kms_support)
+endif()
+if(QT_FEATURE_eglfs_gbm)
+ add_subdirectory(eglfs_kms)
+endif()
+if(QT_FEATURE_eglfs_egldevice)
+ add_subdirectory(eglfs_kms_egldevice)
+endif()
+if(QT_FEATURE_eglfs_vsp2)
+ add_subdirectory(eglfs_kms_vsp2)
+endif()
+if(QT_FEATURE_eglfs_brcm)
+ add_subdirectory(eglfs_brcm)
+endif()
+if(QT_FEATURE_eglfs_mali)
+ add_subdirectory(eglfs_mali)
+endif()
+if(QT_FEATURE_eglfs_viv)
+ add_subdirectory(eglfs_viv)
+endif()
+if(QT_FEATURE_eglfs_rcar)
+ add_subdirectory(eglfs_rcar)
+endif()
+if(QT_FEATURE_eglfs_viv_wl)
+ add_subdirectory(eglfs_viv_wl)
+endif()
+if(QT_FEATURE_eglfs_openwfd)
+ add_subdirectory(eglfs_openwfd)
+endif()
+if(QT_FEATURE_opengl)
+ add_subdirectory(eglfs_emu)
+endif()
diff --git a/src/plugins/platforms/eglfs/deviceintegration/CMakeLists.txt b/src/plugins/platforms/eglfs/deviceintegration/CMakeLists.txt
new file mode 100644
index 0000000000..7ddcb8993f
--- /dev/null
+++ b/src/plugins/platforms/eglfs/deviceintegration/CMakeLists.txt
@@ -0,0 +1,38 @@
+# Generated from deviceintegration.pro.
+
+if(QT_FEATURE_eglfs_x11)
+ add_subdirectory(eglfs_x11)
+endif()
+if(QT_FEATURE_eglfs_egldevice OR QT_FEATURE_eglfs_gbm)
+ add_subdirectory(eglfs_kms_support)
+endif()
+if(QT_FEATURE_eglfs_gbm)
+ add_subdirectory(eglfs_kms)
+endif()
+if(QT_FEATURE_eglfs_egldevice)
+ add_subdirectory(eglfs_kms_egldevice)
+endif()
+if(QT_FEATURE_eglfs_vsp2)
+ # add_subdirectory(eglfs_kms_vsp2) # special case TODO
+endif()
+if(QT_FEATURE_eglfs_brcm)
+ # add_subdirectory(eglfs_brcm) # special case TODO
+endif()
+if(QT_FEATURE_eglfs_mali)
+ # add_subdirectory(eglfs_mali) # special case TODO
+endif()
+if(QT_FEATURE_eglfs_viv)
+ # add_subdirectory(eglfs_viv) # special case TODO
+endif()
+if(QT_FEATURE_eglfs_rcar)
+ # add_subdirectory(eglfs_rcar) # special case TODO
+endif()
+if(QT_FEATURE_eglfs_viv_wl)
+ # add_subdirectory(eglfs_viv_wl) # special case TODO
+endif()
+if(QT_FEATURE_eglfs_openwfd)
+ # add_subdirectory(eglfs_openwfd) # special case TODO
+endif()
+if(QT_FEATURE_opengl)
+ add_subdirectory(eglfs_emu)
+endif()
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_emu/CMakeLists.txt b/src/plugins/platforms/eglfs/deviceintegration/eglfs_emu/CMakeLists.txt
new file mode 100644
index 0000000000..a62b8bbb2b
--- /dev/null
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_emu/CMakeLists.txt
@@ -0,0 +1,28 @@
+# Generated from eglfs_emu.pro.
+
+#####################################################################
+## QEglFSEmulatorIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QEglFSEmulatorIntegrationPlugin
+ OUTPUT_NAME qeglfs-emu-integration
+ TYPE egldeviceintegrations
+ SOURCES
+ qeglfsemulatorintegration.cpp qeglfsemulatorintegration.h
+ qeglfsemulatorscreen.cpp qeglfsemulatorscreen.h
+ qeglfsemumain.cpp
+ DEFINES
+ QT_EGL_NO_X11
+ INCLUDE_DIRECTORIES
+ ../../api
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EglFSDeviceIntegrationPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:eglfs_emu.pro:<TRUE>:
+# DISTFILES = "eglfs_emu.json"
+# OTHER_FILES = "$$PWD/eglfs_emu.json"
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/CMakeLists.txt b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/CMakeLists.txt
new file mode 100644
index 0000000000..55a1d71c07
--- /dev/null
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/CMakeLists.txt
@@ -0,0 +1,36 @@
+# Generated from eglfs_kms.pro.
+
+#####################################################################
+## QEglFSKmsGbmIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QEglFSKmsGbmIntegrationPlugin
+ OUTPUT_NAME qeglfs-kms-integration
+ TYPE egldeviceintegrations
+ SOURCES
+ qeglfskmsgbmcursor.cpp qeglfskmsgbmcursor.h
+ qeglfskmsgbmdevice.cpp qeglfskmsgbmdevice.h
+ qeglfskmsgbmintegration.cpp qeglfskmsgbmintegration.h
+ qeglfskmsgbmmain.cpp
+ qeglfskmsgbmscreen.cpp qeglfskmsgbmscreen.h
+ qeglfskmsgbmwindow.cpp qeglfskmsgbmwindow.h
+ DEFINES
+ QT_EGL_NO_X11
+ INCLUDE_DIRECTORIES
+ ../../api
+ ../eglfs_kms_support
+ PUBLIC_LIBRARIES
+ Libdrm::Libdrm
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EdidSupportPrivate
+ Qt::EglFSDeviceIntegrationPrivate
+ Qt::EglFsKmsSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::KmsSupportPrivate
+ gbm::gbm
+)
+
+#### Keys ignored in scope 1:.:.:eglfs_kms.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/eglfs_kms.json"
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor.cpp
index dc98cdce4b..f715645be3 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor.cpp
@@ -43,6 +43,7 @@
#include "qeglfskmsgbmscreen.h"
#include "qeglfskmsgbmdevice.h"
+#include <QtCore/QFile>
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonObject>
#include <QtCore/QJsonArray>
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/CMakeLists.txt b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/CMakeLists.txt
new file mode 100644
index 0000000000..a0b405c90c
--- /dev/null
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/CMakeLists.txt
@@ -0,0 +1,33 @@
+# Generated from eglfs_kms_egldevice.pro.
+
+#####################################################################
+## QEglFSKmsEglDeviceIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QEglFSKmsEglDeviceIntegrationPlugin
+ OUTPUT_NAME qeglfs-kms-egldevice-integration
+ TYPE egldeviceintegrations
+ SOURCES
+ qeglfskmsegldevice.cpp qeglfskmsegldevice.h
+ qeglfskmsegldeviceintegration.cpp qeglfskmsegldeviceintegration.h
+ qeglfskmsegldevicemain.cpp
+ qeglfskmsegldevicescreen.cpp qeglfskmsegldevicescreen.h
+ DEFINES
+ QT_EGL_NO_X11
+ INCLUDE_DIRECTORIES
+ ../../api
+ ../eglfs_kms_support
+ PUBLIC_LIBRARIES
+ Libdrm::Libdrm
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EdidSupportPrivate
+ Qt::EglFSDeviceIntegrationPrivate
+ Qt::EglFsKmsSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::KmsSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:eglfs_kms_egldevice.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/eglfs_kms_egldevice.json"
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/CMakeLists.txt b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/CMakeLists.txt
new file mode 100644
index 0000000000..abaad3930d
--- /dev/null
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/CMakeLists.txt
@@ -0,0 +1,29 @@
+# Generated from eglfs_kms_support.pro.
+
+#####################################################################
+## EglFsKmsSupport Module:
+#####################################################################
+
+qt_add_module(EglFsKmsSupport
+ INTERNAL_MODULE
+ NO_MODULE_HEADERS
+ SOURCES
+ qeglfskmsdevice.cpp qeglfskmsdevice.h
+ qeglfskmseventreader.cpp qeglfskmseventreader.h
+ qeglfskmshelpers.h
+ qeglfskmsintegration.cpp qeglfskmsintegration.h
+ qeglfskmsscreen.cpp qeglfskmsscreen.h
+ DEFINES
+ QT_EGL_NO_X11
+ INCLUDE_DIRECTORIES
+ ../../api
+ PUBLIC_LIBRARIES
+ Libdrm::Libdrm
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EdidSupportPrivate
+ Qt::EglFSDeviceIntegrationPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::KmsSupportPrivate
+)
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/CMakeLists.txt b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/CMakeLists.txt
new file mode 100644
index 0000000000..fee448db8a
--- /dev/null
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/CMakeLists.txt
@@ -0,0 +1,29 @@
+# Generated from eglfs_x11.pro.
+
+#####################################################################
+## QEglFSX11IntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QEglFSX11IntegrationPlugin
+ OUTPUT_NAME qeglfs-x11-integration
+ TYPE egldeviceintegrations
+ SOURCES
+ qeglfsx11integration.cpp qeglfsx11integration.h
+ qeglfsx11main.cpp
+ DEFINES
+ QT_EGL_NO_X11
+ INCLUDE_DIRECTORIES
+ ../../api
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EglFSDeviceIntegrationPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ X11::X11
+ X11::XCB
+ XCB::XCB
+)
+
+#### Keys ignored in scope 1:.:.:eglfs_x11.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/eglfs_x11.json"
diff --git a/src/plugins/platforms/ios/.prev_CMakeLists.txt b/src/plugins/platforms/ios/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..8916e1772b
--- /dev/null
+++ b/src/plugins/platforms/ios/.prev_CMakeLists.txt
@@ -0,0 +1,66 @@
+# Generated from ios.pro.
+
+#####################################################################
+## QIOSIntegrationPlugin Plugin:
+#####################################################################
+
+add_qt_plugin(QIOSIntegrationPlugin
+ OUTPUT_NAME qios
+ TYPE platforms
+ SOURCES
+ plugin.mm
+ qiosapplicationdelegate.h qiosapplicationdelegate.mm
+ qiosapplicationstate.h qiosapplicationstate.mm
+ qiosbackingstore.h qiosbackingstore.mm
+ qioscontext.h qioscontext.mm
+ qioseventdispatcher.h qioseventdispatcher.mm
+ qiosglobal.h qiosglobal.mm
+ qiosinputcontext.h qiosinputcontext.mm
+ qiosintegration.h qiosintegration.mm
+ qiosplatformaccessibility.h qiosplatformaccessibility.mm
+ qiosscreen.h qiosscreen.mm
+ qiosservices.h qiosservices.mm
+ qiostextresponder.h qiostextresponder.mm
+ qiostheme.h qiostheme.mm
+ qiosviewcontroller.h qiosviewcontroller.mm
+ qioswindow.h qioswindow.mm
+ quiaccessibilityelement.h quiaccessibilityelement.mm
+ quiview.h quiview.mm
+ PUBLIC_LIBRARIES
+ ${FWAudioToolbox}
+ ${FWFoundation}
+ ${FWQuartzCore}
+ ${FWUIKit}
+ Qt::ClipboardSupportPrivate
+ Qt::CorePrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::GraphicsSupportPrivate
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 2:.:.:kernel.pro:<TRUE>:
+# OTHER_FILES = "quiview_textinput.mm" "quiview_accessibility.mm"
+
+## Scopes:
+#####################################################################
+
+extend_target(QIOSIntegrationPlugin CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+extend_target(QIOSIntegrationPlugin CONDITION NOT TVOS
+ SOURCES
+ qiosclipboard.h qiosclipboard.mm
+ qiosdocumentpickercontroller.h qiosdocumentpickercontroller.mm
+ qiosfiledialog.h qiosfiledialog.mm
+ qiosmenu.h qiosmenu.mm
+ qiosmessagedialog.h qiosmessagedialog.mm
+ qiostextinputoverlay.h qiostextinputoverlay.mm
+ PUBLIC_LIBRARIES
+ ${FWAssetsLibrary}
+)
+
+#### Keys ignored in scope 6:.:.:kernel.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
+add_subdirectory(optional)
diff --git a/src/plugins/platforms/ios/CMakeLists.txt b/src/plugins/platforms/ios/CMakeLists.txt
new file mode 100644
index 0000000000..24a93677a2
--- /dev/null
+++ b/src/plugins/platforms/ios/CMakeLists.txt
@@ -0,0 +1,67 @@
+# Generated from kernel.pro.
+
+#####################################################################
+## QIOSIntegrationPlugin Plugin:
+#####################################################################
+
+add_qt_plugin(QIOSIntegrationPlugin
+ OUTPUT_NAME qios
+ TYPE platforms
+ SOURCES
+ plugin.mm
+ qiosapplicationdelegate.h qiosapplicationdelegate.mm
+ qiosapplicationstate.h qiosapplicationstate.mm
+ qiosbackingstore.h qiosbackingstore.mm
+ qioscontext.h qioscontext.mm
+ qioseventdispatcher.h qioseventdispatcher.mm
+ qiosglobal.h qiosglobal.mm
+ qiosinputcontext.h qiosinputcontext.mm
+ qiosintegration.h qiosintegration.mm
+ qiosplatformaccessibility.h qiosplatformaccessibility.mm
+ qiosscreen.h qiosscreen.mm
+ qiosservices.h qiosservices.mm
+ qiostextresponder.h qiostextresponder.mm
+ qiostheme.h qiostheme.mm
+ qiosviewcontroller.h qiosviewcontroller.mm
+ qioswindow.h qioswindow.mm
+ quiaccessibilityelement.h quiaccessibilityelement.mm
+ quiview.h quiview.mm
+ PUBLIC_LIBRARIES
+ ${FWAudioToolbox}
+ ${FWFoundation}
+ ${FWQuartzCore}
+ ${FWUIKit}
+ Qt::ClipboardSupportPrivate
+ Qt::Core
+ Qt::CorePrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::GraphicsSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:kernel.pro:<TRUE>:
+# OTHER_FILES = "quiview_textinput.mm" "quiview_accessibility.mm"
+
+## Scopes:
+#####################################################################
+
+extend_target(QIOSIntegrationPlugin CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+extend_target(QIOSIntegrationPlugin CONDITION NOT TVOS
+ SOURCES
+ qiosclipboard.h qiosclipboard.mm
+ qiosdocumentpickercontroller.h qiosdocumentpickercontroller.mm
+ qiosfiledialog.h qiosfiledialog.mm
+ qiosmenu.h qiosmenu.mm
+ qiosmessagedialog.h qiosmessagedialog.mm
+ qiostextinputoverlay.h qiostextinputoverlay.mm
+ PUBLIC_LIBRARIES
+ ${FWAssetsLibrary}
+)
+
+#### Keys ignored in scope 5:.:.:kernel.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/ios/kernel.pro b/src/plugins/platforms/ios/kernel.pro
index 54069bee06..c483076856 100644
--- a/src/plugins/platforms/ios/kernel.pro
+++ b/src/plugins/platforms/ios/kernel.pro
@@ -9,6 +9,8 @@ QT += \
core-private gui-private \
clipboard_support-private fontdatabase_support-private graphics_support-private
+qtHaveModule(platformcompositor_support-private): QT += platformcompositor_support-private
+
LIBS += -framework Foundation -framework UIKit -framework QuartzCore -framework AudioToolbox
OBJECTIVE_SOURCES = \
diff --git a/src/plugins/platforms/ios/optional/CMakeLists.txt b/src/plugins/platforms/ios/optional/CMakeLists.txt
new file mode 100644
index 0000000000..6f5d754d4a
--- /dev/null
+++ b/src/plugins/platforms/ios/optional/CMakeLists.txt
@@ -0,0 +1,5 @@
+# Generated from optional.pro.
+
+if(IOS)
+ add_subdirectory(nsphotolibrarysupport)
+endif()
diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/CMakeLists.txt b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/CMakeLists.txt
new file mode 100644
index 0000000000..0fbb0fdbd8
--- /dev/null
+++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/CMakeLists.txt
@@ -0,0 +1,29 @@
+# Generated from nsphotolibrarysupport.pro.
+
+#####################################################################
+## QIosOptionalPlugin_NSPhotoLibrary Plugin:
+#####################################################################
+
+add_qt_plugin(QIosOptionalPlugin_NSPhotoLibrary
+ OUTPUT_NAME qiosnsphotolibrarysupport
+ TYPE platforms/darwin
+ SOURCES
+ plugin.mm
+ qiosfileengineassetslibrary.h qiosfileengineassetslibrary.mm
+ qiosfileenginefactory.h
+ qiosimagepickercontroller.h qiosimagepickercontroller.mm
+ PUBLIC_LIBRARIES
+ ${FWAssetsLibrary}
+ ${FWFoundation}
+ ${FWUIKit}
+ Qt::Core
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:nsphotolibrarysupport.pro:<TRUE>:
+# OTHER_FILES = "plugin.json"
+# PLUGIN_EXTENDS = "-"
+
+## Scopes:
+#####################################################################
diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm
index 9eca0eaad3..e7a548743e 100644
--- a/src/plugins/platforms/ios/qiosintegration.mm
+++ b/src/plugins/platforms/ios/qiosintegration.mm
@@ -53,6 +53,7 @@
#include "qiosservices.h"
#include "qiosoptionalplugininterface.h"
+#include <QtGui/qtouchdevice.h>
#include <QtGui/private/qguiapplication_p.h>
#include <qoffscreensurface.h>
@@ -65,6 +66,10 @@
#import <AudioToolbox/AudioServices.h>
+#if QT_CONFIG(opengl)
+#include <QtPlatformCompositorSupport/qpa/qplatformbackingstoreopenglsupport.h>
+#endif
+
#include <QtDebug>
QT_BEGIN_NAMESPACE
@@ -186,7 +191,11 @@ QPlatformWindow *QIOSIntegration::createPlatformWindow(QWindow *window) const
// Used when the QWindow's surface type is set by the client to QSurface::RasterSurface
QPlatformBackingStore *QIOSIntegration::createPlatformBackingStore(QWindow *window) const
{
- return new QIOSBackingStore(window);
+ auto *backingStore = new QIOSBackingStore(window);
+#if QT_CONFIG(opengl)
+ backingStore->setOpenGLSupport(new QPlatformBackingStoreOpenGLSupport(backingStore));
+#endif
+ return backingStore;
}
// Used when the QWindow's surface type is set by the client to QSurface::OpenGLSurface
diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm
index 9aba658479..b0e60d76fc 100644
--- a/src/plugins/platforms/ios/qiosscreen.mm
+++ b/src/plugins/platforms/ios/qiosscreen.mm
@@ -48,6 +48,7 @@
#include <QtCore/private/qcore_mac_p.h>
+#include <QtGui/qtouchdevice.h>
#include <QtGui/private/qwindow_p.h>
#include <private/qcoregraphics_p.h>
#include <qpa/qwindowsysteminterface.h>
diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm
index 59eae07388..6254b43dc1 100644
--- a/src/plugins/platforms/ios/quiview.mm
+++ b/src/plugins/platforms/ios/quiview.mm
@@ -49,6 +49,7 @@
#include "qiosmenu.h"
#endif
+#include <QtGui/qtouchdevice.h>
#include <QtGui/private/qguiapplication_p.h>
#include <QtGui/private/qwindow_p.h>
#include <qpa/qwindowsysteminterface_p.h>
diff --git a/src/plugins/platforms/linuxfb/.prev_CMakeLists.txt b/src/plugins/platforms/linuxfb/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..bcec98e1de
--- /dev/null
+++ b/src/plugins/platforms/linuxfb/.prev_CMakeLists.txt
@@ -0,0 +1,46 @@
+# Generated from linuxfb.pro.
+
+#####################################################################
+## QLinuxFbIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QLinuxFbIntegrationPlugin
+ OUTPUT_NAME qlinuxfb
+ TYPE platforms
+ SOURCES
+ main.cpp
+ qlinuxfbintegration.cpp qlinuxfbintegration.h
+ qlinuxfbscreen.cpp qlinuxfbscreen.h
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FbSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::ServiceSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:linuxfb.pro:<TRUE>:
+# OTHER_FILES = "linuxfb.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QLinuxFbIntegrationPlugin CONDITION TARGET Qt::InputSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::InputSupportPrivate
+)
+
+qt_extend_target(QLinuxFbIntegrationPlugin CONDITION TARGET Qt::KmsSupportPrivate
+ SOURCES
+ qlinuxfbdrmscreen.cpp qlinuxfbdrmscreen.h
+ PUBLIC_LIBRARIES
+ Qt::KmsSupportPrivate
+)
+
+#### Keys ignored in scope 4:.:.:linuxfb.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/linuxfb/CMakeLists.txt b/src/plugins/platforms/linuxfb/CMakeLists.txt
new file mode 100644
index 0000000000..8747894100
--- /dev/null
+++ b/src/plugins/platforms/linuxfb/CMakeLists.txt
@@ -0,0 +1,47 @@
+# Generated from linuxfb.pro.
+
+#####################################################################
+## QLinuxFbIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QLinuxFbIntegrationPlugin
+ OUTPUT_NAME qlinuxfb
+ TYPE platforms
+ DEFAULT_IF ${QT_QPA_DEFAULT_PLATFORM} MATCHES linuxfb # special case
+ SOURCES
+ main.cpp
+ qlinuxfbintegration.cpp qlinuxfbintegration.h
+ qlinuxfbscreen.cpp qlinuxfbscreen.h
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FbSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::ServiceSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:linuxfb.pro:<TRUE>:
+# OTHER_FILES = "linuxfb.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QLinuxFbIntegrationPlugin CONDITION TARGET Qt::InputSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::InputSupportPrivate
+)
+
+qt_extend_target(QLinuxFbIntegrationPlugin CONDITION TARGET Qt::KmsSupportPrivate
+ SOURCES
+ qlinuxfbdrmscreen.cpp qlinuxfbdrmscreen.h
+ PUBLIC_LIBRARIES
+ Qt::KmsSupportPrivate
+)
+
+#### Keys ignored in scope 4:.:.:linuxfb.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/minimal/.prev_CMakeLists.txt b/src/plugins/platforms/minimal/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..764c684932
--- /dev/null
+++ b/src/plugins/platforms/minimal/.prev_CMakeLists.txt
@@ -0,0 +1,37 @@
+# Generated from minimal.pro.
+
+#####################################################################
+## QMinimalIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QMinimalIntegrationPlugin
+ OUTPUT_NAME qminimal
+ TYPE platforms
+ SOURCES
+ main.cpp
+ qminimalbackingstore.cpp qminimalbackingstore.h
+ qminimalintegration.cpp qminimalintegration.h
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:minimal.pro:<TRUE>:
+# OTHER_FILES = "minimal.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QMinimalIntegrationPlugin CONDITION QT_FEATURE_freetype
+ LIBRARIES
+ WrapFreetype::WrapFreetype
+)
+
+#### Keys ignored in scope 3:.:.:minimal.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/minimal/CMakeLists.txt b/src/plugins/platforms/minimal/CMakeLists.txt
new file mode 100644
index 0000000000..623cf5f83a
--- /dev/null
+++ b/src/plugins/platforms/minimal/CMakeLists.txt
@@ -0,0 +1,40 @@
+# Generated from minimal.pro.
+
+#####################################################################
+## QMinimalIntegrationPlugin Plugin:
+#####################################################################
+
+qt_find_package(WrapFreetype PROVIDED_TARGETS WrapFreetype::WrapFreetype) # special case
+
+qt_add_plugin(QMinimalIntegrationPlugin
+ OUTPUT_NAME qminimal
+ TYPE platforms
+ DEFAULT_IF ${QT_QPA_DEFAULT_PLATFORM} MATCHES minimal # special case
+ SOURCES
+ main.cpp
+ qminimalbackingstore.cpp qminimalbackingstore.h
+ qminimalintegration.cpp qminimalintegration.h
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:minimal.pro:<TRUE>:
+# OTHER_FILES = "minimal.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QMinimalIntegrationPlugin CONDITION QT_FEATURE_freetype
+ LIBRARIES
+ WrapFreetype::WrapFreetype
+)
+
+#### Keys ignored in scope 3:.:.:minimal.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/minimalegl/.prev_CMakeLists.txt b/src/plugins/platforms/minimalegl/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..7a08af79a9
--- /dev/null
+++ b/src/plugins/platforms/minimalegl/.prev_CMakeLists.txt
@@ -0,0 +1,41 @@
+# Generated from minimalegl.pro.
+
+#####################################################################
+## QMinimalEglIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QMinimalEglIntegrationPlugin
+ OUTPUT_NAME qminimalegl
+ TYPE platforms
+ SOURCES
+ main.cpp
+ qminimaleglintegration.cpp qminimaleglintegration.h
+ qminimaleglscreen.cpp qminimaleglscreen.h
+ qminimaleglwindow.cpp qminimaleglwindow.h
+ DEFINES
+ QT_EGL_NO_X11
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EglSupportPrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:minimalegl.pro:<TRUE>:
+# OTHER_FILES = "minimalegl.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QMinimalEglIntegrationPlugin CONDITION QT_FEATURE_opengl
+ SOURCES
+ qminimaleglbackingstore.cpp qminimaleglbackingstore.h
+ PUBLIC_LIBRARIES
+ Qt::OpenGL
+)
+
+#### Keys ignored in scope 3:.:.:minimalegl.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/minimalegl/CMakeLists.txt b/src/plugins/platforms/minimalegl/CMakeLists.txt
new file mode 100644
index 0000000000..4c8856e35d
--- /dev/null
+++ b/src/plugins/platforms/minimalegl/CMakeLists.txt
@@ -0,0 +1,42 @@
+# Generated from minimalegl.pro.
+
+#####################################################################
+## QMinimalEglIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QMinimalEglIntegrationPlugin
+ OUTPUT_NAME qminimalegl
+ TYPE platforms
+ DEFAULT_IF ${QT_QPA_DEFAULT_PLATFORM} MATCHES minimalegl # special case
+ SOURCES
+ main.cpp
+ qminimaleglintegration.cpp qminimaleglintegration.h
+ qminimaleglscreen.cpp qminimaleglscreen.h
+ qminimaleglwindow.cpp qminimaleglwindow.h
+ DEFINES
+ QT_EGL_NO_X11
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EglSupportPrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:minimalegl.pro:<TRUE>:
+# OTHER_FILES = "minimalegl.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QMinimalEglIntegrationPlugin CONDITION QT_FEATURE_opengl
+ SOURCES
+ qminimaleglbackingstore.cpp qminimaleglbackingstore.h
+ PUBLIC_LIBRARIES
+ Qt::OpenGL
+)
+
+#### Keys ignored in scope 3:.:.:minimalegl.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/minimalegl/minimalegl.pro b/src/plugins/platforms/minimalegl/minimalegl.pro
index b7dde9069f..3f6ae4e248 100644
--- a/src/plugins/platforms/minimalegl/minimalegl.pro
+++ b/src/plugins/platforms/minimalegl/minimalegl.pro
@@ -21,6 +21,7 @@ HEADERS = qminimaleglintegration.h \
qminimaleglscreen.h
qtConfig(opengl) {
+ QT += opengl
SOURCES += qminimaleglbackingstore.cpp
HEADERS += qminimaleglbackingstore.h
}
diff --git a/src/plugins/platforms/minimalegl/qminimaleglbackingstore.cpp b/src/plugins/platforms/minimalegl/qminimaleglbackingstore.cpp
index dc8dd74312..2319762f31 100644
--- a/src/plugins/platforms/minimalegl/qminimaleglbackingstore.cpp
+++ b/src/plugins/platforms/minimalegl/qminimaleglbackingstore.cpp
@@ -40,7 +40,7 @@
#include "qminimaleglbackingstore.h"
#include <QtGui/QOpenGLContext>
-#include <QtGui/QOpenGLPaintDevice>
+#include <QtOpenGL/QOpenGLPaintDevice>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/offscreen/.prev_CMakeLists.txt b/src/plugins/platforms/offscreen/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..62d36ec449
--- /dev/null
+++ b/src/plugins/platforms/offscreen/.prev_CMakeLists.txt
@@ -0,0 +1,40 @@
+# Generated from offscreen.pro.
+
+#####################################################################
+## QOffscreenIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QOffscreenIntegrationPlugin
+ OUTPUT_NAME qoffscreen
+ TYPE platforms
+ SOURCES
+ main.cpp
+ qoffscreencommon.cpp qoffscreencommon.h
+ qoffscreenintegration.cpp qoffscreenintegration.h
+ qoffscreenwindow.cpp qoffscreenwindow.h
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:offscreen.pro:<TRUE>:
+# OTHER_FILES = "offscreen.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QOffscreenIntegrationPlugin CONDITION QT_FEATURE_opengl AND QT_FEATURE_xlib AND NOT QT_FEATURE_opengles2
+ SOURCES
+ qoffscreenintegration_x11.cpp qoffscreenintegration_x11.h
+ PUBLIC_LIBRARIES
+ Qt::GlxSupportPrivate
+)
+
+#### Keys ignored in scope 3:.:.:offscreen.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/offscreen/CMakeLists.txt b/src/plugins/platforms/offscreen/CMakeLists.txt
new file mode 100644
index 0000000000..63474c3760
--- /dev/null
+++ b/src/plugins/platforms/offscreen/CMakeLists.txt
@@ -0,0 +1,41 @@
+# Generated from offscreen.pro.
+
+#####################################################################
+## QOffscreenIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QOffscreenIntegrationPlugin
+ OUTPUT_NAME qoffscreen
+ TYPE platforms
+ DEFAULT_IF ${QT_QPA_DEFAULT_PLATFORM} MATCHES offscreen # special case
+ SOURCES
+ main.cpp
+ qoffscreencommon.cpp qoffscreencommon.h
+ qoffscreenintegration.cpp qoffscreenintegration.h
+ qoffscreenwindow.cpp qoffscreenwindow.h
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+)
+
+#### Keys ignored in scope 1:.:.:offscreen.pro:<TRUE>:
+# OTHER_FILES = "offscreen.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QOffscreenIntegrationPlugin CONDITION QT_FEATURE_opengl AND QT_FEATURE_xlib AND NOT QT_FEATURE_opengles2
+ SOURCES
+ qoffscreenintegration_x11.cpp qoffscreenintegration_x11.h
+ PUBLIC_LIBRARIES
+ Qt::GlxSupportPrivate
+)
+
+#### Keys ignored in scope 3:.:.:offscreen.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/vnc/.prev_CMakeLists.txt b/src/plugins/platforms/vnc/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..a26cc0be2b
--- /dev/null
+++ b/src/plugins/platforms/vnc/.prev_CMakeLists.txt
@@ -0,0 +1,43 @@
+# Generated from vnc.pro.
+
+#####################################################################
+## QVncIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QVncIntegrationPlugin
+ OUTPUT_NAME qvnc
+ TYPE platforms
+ SOURCES
+ main.cpp
+ qvnc.cpp qvnc_p.h
+ qvncclient.cpp qvncclient.h
+ qvncintegration.cpp qvncintegration.h
+ qvncscreen.cpp qvncscreen.h
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FbSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::Network
+ Qt::ServiceSupportPrivate
+ Qt::ThemeSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:vnc.pro:<TRUE>:
+# OTHER_FILES = "vnc.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QVncIntegrationPlugin CONDITION TARGET Qt::InputSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::InputSupportPrivate
+)
+
+#### Keys ignored in scope 3:.:.:vnc.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/vnc/CMakeLists.txt b/src/plugins/platforms/vnc/CMakeLists.txt
new file mode 100644
index 0000000000..cb84355d81
--- /dev/null
+++ b/src/plugins/platforms/vnc/CMakeLists.txt
@@ -0,0 +1,44 @@
+# Generated from vnc.pro.
+
+#####################################################################
+## QVncIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QVncIntegrationPlugin
+ OUTPUT_NAME qvnc
+ TYPE platforms
+ DEFAULT_IF ${QT_QPA_DEFAULT_PLATFORM} MATCHES vnc # special case
+ SOURCES
+ main.cpp
+ qvnc.cpp qvnc_p.h
+ qvncclient.cpp qvncclient.h
+ qvncintegration.cpp qvncintegration.h
+ qvncscreen.cpp qvncscreen.h
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FbSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::Network
+ Qt::ServiceSupportPrivate
+ Qt::ThemeSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:vnc.pro:<TRUE>:
+# OTHER_FILES = "vnc.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QVncIntegrationPlugin CONDITION TARGET Qt::InputSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::InputSupportPrivate
+)
+
+#### Keys ignored in scope 3:.:.:vnc.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platforms/vnc/qvnc.cpp b/src/plugins/platforms/vnc/qvnc.cpp
index 8390fa19cd..aea8d26983 100644
--- a/src/plugins/platforms/vnc/qvnc.cpp
+++ b/src/plugins/platforms/vnc/qvnc.cpp
@@ -502,7 +502,7 @@ void QRfbRawEncoder::write()
const quint32 encoding = htonl(0); // raw encoding
socket->write((char *)&encoding, sizeof(encoding));
- int linestep = screenImage.bytesPerLine();
+ qsizetype linestep = screenImage.bytesPerLine();
const uchar *screendata = screenImage.scanLine(rect.y)
+ rect.x * screenImage.depth() / 8;
diff --git a/src/plugins/platforms/wasm/qwasmbackingstore.cpp b/src/plugins/platforms/wasm/qwasmbackingstore.cpp
index 6ac685083d..cef15543d4 100644
--- a/src/plugins/platforms/wasm/qwasmbackingstore.cpp
+++ b/src/plugins/platforms/wasm/qwasmbackingstore.cpp
@@ -31,7 +31,7 @@
#include "qwasmwindow.h"
#include "qwasmcompositor.h"
-#include <QtGui/qopengltexture.h>
+#include <QtOpenGL/qopengltexture.h>
#include <QtGui/qmatrix4x4.h>
#include <QtGui/qpainter.h>
#include <private/qguiapplication_p.h>
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp
index 0ece812972..2eb04a501b 100644
--- a/src/plugins/platforms/wasm/qwasmcompositor.cpp
+++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp
@@ -31,12 +31,11 @@
#include "qwasmwindow.h"
#include "qwasmstylepixmaps_p.h"
-#include <QtGui/qopengltexture.h>
+#include <QtOpenGL/qopengltexture.h>
#include <QtGui/private/qwindow_p.h>
#include <QtGui/qopenglcontext.h>
#include <QtGui/qopenglfunctions.h>
-#include <QtGui/qopengltextureblitter.h>
#include <QtGui/qoffscreensurface.h>
#include <QtGui/qpainter.h>
#include <private/qpixmapcache_p.h>
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.h b/src/plugins/platforms/wasm/qwasmcompositor.h
index 422f990175..a07c747a98 100644
--- a/src/plugins/platforms/wasm/qwasmcompositor.h
+++ b/src/plugins/platforms/wasm/qwasmcompositor.h
@@ -33,8 +33,7 @@
#include <QtGui/qregion.h>
#include <qpa/qplatformwindow.h>
-#include <QtGui/qopengltextureblitter.h>
-#include <QtGui/qopengltexture.h>
+#include <QtOpenGL/qopengltextureblitter.h>
#include <QtGui/qpalette.h>
#include <QtGui/qpainter.h>
@@ -43,7 +42,7 @@ QT_BEGIN_NAMESPACE
class QWasmWindow;
class QWasmScreen;
class QOpenGLContext;
-class QOpenGLTextureBlitter;
+class QOpenGLTexture;
class QWasmCompositedWindow
{
diff --git a/src/plugins/platforms/wasm/qwasmfontdatabase.cpp b/src/plugins/platforms/wasm/qwasmfontdatabase.cpp
index 53e875ead6..7623444588 100644
--- a/src/plugins/platforms/wasm/qwasmfontdatabase.cpp
+++ b/src/plugins/platforms/wasm/qwasmfontdatabase.cpp
@@ -74,12 +74,6 @@ QStringList QWasmFontDatabase::fallbacksForFamily(const QString &family, QFont::
return fallbacks;
}
-QStringList QWasmFontDatabase::addApplicationFont(const QByteArray &fontData,
- const QString &fileName)
-{
- return QFreeTypeFontDatabase::addApplicationFont(fontData, fileName);
-}
-
void QWasmFontDatabase::releaseHandle(void *handle)
{
QFreeTypeFontDatabase::releaseHandle(handle);
diff --git a/src/plugins/platforms/wasm/qwasmfontdatabase.h b/src/plugins/platforms/wasm/qwasmfontdatabase.h
index cbd187a022..ce22ad14d7 100644
--- a/src/plugins/platforms/wasm/qwasmfontdatabase.h
+++ b/src/plugins/platforms/wasm/qwasmfontdatabase.h
@@ -42,7 +42,6 @@ public:
QStringList fallbacksForFamily(const QString &family, QFont::Style style,
QFont::StyleHint styleHint,
QChar::Script script) const override;
- QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName) override;
void releaseHandle(void *handle) override;
QFont defaultFont() const override;
};
diff --git a/src/plugins/platforms/wasm/qwasmintegration.cpp b/src/plugins/platforms/wasm/qwasmintegration.cpp
index 4b42b5788f..37cc6185c5 100644
--- a/src/plugins/platforms/wasm/qwasmintegration.cpp
+++ b/src/plugins/platforms/wasm/qwasmintegration.cpp
@@ -41,6 +41,7 @@
#include "qwasmwindow.h"
#ifndef QT_NO_OPENGL
# include "qwasmbackingstore.h"
+# include <QtPlatformCompositorSupport/qpa/qplatformbackingstoreopenglsupport.h>
#endif
#include "qwasmfontdatabase.h"
#if defined(Q_OS_UNIX)
@@ -180,6 +181,7 @@ QPlatformBackingStore *QWasmIntegration::createPlatformBackingStore(QWindow *win
#ifndef QT_NO_OPENGL
QWasmCompositor *compositor = QWasmScreen::get(window->screen())->compositor();
QWasmBackingStore *backingStore = new QWasmBackingStore(compositor, window);
+ backingStore->setOpenGLSupport(new QPlatformBackingStoreOpenGLSupport(backingStore));
m_backingStores.insert(window, backingStore);
return backingStore;
#else
diff --git a/src/plugins/platforms/wasm/wasm.pro b/src/plugins/platforms/wasm/wasm.pro
index a12ae06833..1aee4a3e58 100644
--- a/src/plugins/platforms/wasm/wasm.pro
+++ b/src/plugins/platforms/wasm/wasm.pro
@@ -4,6 +4,8 @@ QT += \
core-private gui-private \
eventdispatcher_support-private fontdatabase_support-private egl_support-private
+qtHaveModule(platformcompositor_support-private): QT += platformcompositor_support-private
+
# Avoid X11 header collision, use generic EGL native types
DEFINES += QT_EGL_NO_X11
@@ -52,6 +54,7 @@ wasmfonts.base = ../../../3rdparty/wasm
RESOURCES += wasmfonts
qtConfig(opengl) {
+ QT += opengl
SOURCES += qwasmbackingstore.cpp
HEADERS += qwasmbackingstore.h
}
diff --git a/src/plugins/platforms/windows/.prev_CMakeLists.txt b/src/plugins/platforms/windows/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..92b2ccb217
--- /dev/null
+++ b/src/plugins/platforms/windows/.prev_CMakeLists.txt
@@ -0,0 +1,246 @@
+# Generated from windows.pro.
+
+#####################################################################
+## QWindowsIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QWindowsIntegrationPlugin
+ OUTPUT_NAME qwindows
+ TYPE platforms
+ SOURCES
+ main.cpp
+ qtwindowsglobal.h
+ qwin10helpers.cpp qwin10helpers.h
+ qwindowsbackingstore.cpp qwindowsbackingstore.h
+ qwindowscombase.h
+ qwindowscontext.cpp qwindowscontext.h
+ qwindowscursor.cpp qwindowscursor.h
+ qwindowsdialoghelpers.cpp qwindowsdialoghelpers.h
+ qwindowsdropdataobject.cpp qwindowsdropdataobject.h
+ qwindowsgdiintegration.cpp qwindowsgdiintegration.h
+ qwindowsgdinativeinterface.cpp qwindowsgdinativeinterface.h
+ qwindowsinputcontext.cpp qwindowsinputcontext.h
+ qwindowsintegration.cpp qwindowsintegration.h
+ qwindowsinternalmimedata.cpp qwindowsinternalmimedata.h
+ qwindowskeymapper.cpp qwindowskeymapper.h
+ qwindowsmenu.cpp qwindowsmenu.h
+ qwindowsmime.cpp qwindowsmime.h
+ qwindowsmousehandler.cpp qwindowsmousehandler.h
+ qwindowsnativeinterface.cpp qwindowsnativeinterface.h
+ qwindowsole.cpp qwindowsole.h
+ qwindowsopengltester.cpp qwindowsopengltester.h
+ qwindowspointerhandler.cpp qwindowspointerhandler.h
+ qwindowsscreen.cpp qwindowsscreen.h
+ qwindowsservices.cpp qwindowsservices.h
+ qwindowstheme.cpp qwindowstheme.h
+ qwindowsthreadpoolrunner.h
+ qwindowswindow.cpp qwindowswindow.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ LIBRARIES
+ advapi32
+ d3d9
+ gdi32
+ ole32
+ shell32
+ user32
+ winmm
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::ThemeSupportPrivate
+ dwmapi
+ imm32
+ oleaut32
+ shlwapi
+ winspool
+ wtsapi32
+)
+
+# Resources:
+set_source_files_properties("openglblacklists/default.json"
+ PROPERTIES QT_RESOURCE_ALIAS "default.json"
+)
+set(openglblacklists_resource_files
+ "openglblacklists/default.json"
+)
+
+qt_add_resource(QWindowsIntegrationPlugin "openglblacklists"
+ PREFIX
+ "/qt-project.org/windows/openglblacklists"
+ FILES
+ ${openglblacklists_resource_files}
+)
+
+
+#### Keys ignored in scope 1:.:.:windows.pro:<TRUE>:
+# OTHER_FILES = "windows.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_accessibility
+ SOURCES
+ uiautomation/qwindowsuiaaccessibility.cpp uiautomation/qwindowsuiaaccessibility.h
+ uiautomation/qwindowsuiabaseprovider.cpp uiautomation/qwindowsuiabaseprovider.h
+ uiautomation/qwindowsuiaexpandcollapseprovider.cpp uiautomation/qwindowsuiaexpandcollapseprovider.h
+ uiautomation/qwindowsuiagriditemprovider.cpp uiautomation/qwindowsuiagriditemprovider.h
+ uiautomation/qwindowsuiagridprovider.cpp uiautomation/qwindowsuiagridprovider.h
+ uiautomation/qwindowsuiainvokeprovider.cpp uiautomation/qwindowsuiainvokeprovider.h
+ uiautomation/qwindowsuiamainprovider.cpp uiautomation/qwindowsuiamainprovider.h
+ uiautomation/qwindowsuiaprovidercache.cpp uiautomation/qwindowsuiaprovidercache.h
+ uiautomation/qwindowsuiarangevalueprovider.cpp uiautomation/qwindowsuiarangevalueprovider.h
+ uiautomation/qwindowsuiaselectionitemprovider.cpp uiautomation/qwindowsuiaselectionitemprovider.h
+ uiautomation/qwindowsuiaselectionprovider.cpp uiautomation/qwindowsuiaselectionprovider.h
+ uiautomation/qwindowsuiatableitemprovider.cpp uiautomation/qwindowsuiatableitemprovider.h
+ uiautomation/qwindowsuiatableprovider.cpp uiautomation/qwindowsuiatableprovider.h
+ uiautomation/qwindowsuiatextprovider.cpp uiautomation/qwindowsuiatextprovider.h
+ uiautomation/qwindowsuiatextrangeprovider.cpp uiautomation/qwindowsuiatextrangeprovider.h
+ uiautomation/qwindowsuiatoggleprovider.cpp uiautomation/qwindowsuiatoggleprovider.h
+ uiautomation/qwindowsuiautils.cpp uiautomation/qwindowsuiautils.h
+ uiautomation/qwindowsuiavalueprovider.cpp uiautomation/qwindowsuiavalueprovider.h
+ uiautomation/qwindowsuiawindowprovider.cpp uiautomation/qwindowsuiawindowprovider.h
+ PUBLIC_LIBRARIES
+ Qt::AccessibilitySupportPrivate
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_vulkan
+ SOURCES
+ qwindowsvulkaninstance.cpp qwindowsvulkaninstance.h
+ PUBLIC_LIBRARIES
+ Qt::VulkanSupportPrivate
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_directwrite3
+ DEFINES
+ QT_USE_DIRECTWRITE2
+ QT_USE_DIRECTWRITE3
+)
+
+#### Keys ignored in scope 6:.:.:windows.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_opengl AND NOT QT_FEATURE_dynamicgl AND NOT QT_FEATURE_opengles2
+ PUBLIC_LIBRARIES
+ opengl32
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION mingw
+ PUBLIC_LIBRARIES
+ uuid
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_opengl
+ SOURCES
+ qwindowsopenglcontext.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_opengles2
+ SOURCES
+ qwindowseglcontext.cpp qwindowseglcontext.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_opengl AND NOT QT_FEATURE_opengles2
+ SOURCES
+ qwindowsglcontext.cpp qwindowsglcontext.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_dynamicgl
+ SOURCES
+ qwindowseglcontext.cpp qwindowseglcontext.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_systemtrayicon
+ SOURCES
+ qwindowssystemtrayicon.cpp qwindowssystemtrayicon.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_clipboard
+ SOURCES
+ qwindowsclipboard.cpp qwindowsclipboard.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_clipboard AND QT_FEATURE_draganddrop
+ SOURCES
+ qwindowsdrag.cpp qwindowsdrag.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_tabletevent
+ SOURCES
+ qwindowstabletsupport.cpp qwindowstabletsupport.h
+ INCLUDE_DIRECTORIES
+ ${QT_SOURCE_TREE}/src/3rdparty/wintab
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_sessionmanager
+ SOURCES
+ qwindowssessionmanager.cpp qwindowssessionmanager.h
+)
+
+if(QT_FEATURE_imageformat_png)
+ # Resources:
+ set(cursors_resource_files
+ "images/closedhandcursor_32.png"
+ "images/closedhandcursor_48.png"
+ "images/closedhandcursor_64.png"
+ "images/dragcopycursor_32.png"
+ "images/dragcopycursor_48.png"
+ "images/dragcopycursor_64.png"
+ "images/draglinkcursor_32.png"
+ "images/draglinkcursor_48.png"
+ "images/draglinkcursor_64.png"
+ "images/dragmovecursor_32.png"
+ "images/dragmovecursor_48.png"
+ "images/dragmovecursor_64.png"
+ "images/openhandcursor_32.png"
+ "images/openhandcursor_48.png"
+ "images/openhandcursor_64.png"
+ "images/splithcursor_32.png"
+ "images/splithcursor_48.png"
+ "images/splithcursor_64.png"
+ "images/splitvcursor_32.png"
+ "images/splitvcursor_48.png"
+ "images/splitvcursor_64.png"
+ )
+
+ qt_add_resource(QWindowsIntegrationPlugin "cursors"
+ PREFIX
+ "/qt-project.org/windows/cursors"
+ FILES
+ ${cursors_resource_files}
+ )
+endif()
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_accessibility AND TARGET Qt::WindowsUIAutomationSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::WindowsUIAutomationSupportPrivate
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_accessibility AND mingw
+ PUBLIC_LIBRARIES
+ uuid
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_combined_angle_lib
+ DEFINES
+ LIBEGL_NAME=
+ LIBGLESV2_NAME=
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION NOT QT_FEATURE_combined_angle_lib
+ DEFINES
+ LIBEGL_NAME=
+ LIBGLESV2_NAME=
+)
diff --git a/src/plugins/platforms/windows/CMakeLists.txt b/src/plugins/platforms/windows/CMakeLists.txt
new file mode 100644
index 0000000000..4cb9608378
--- /dev/null
+++ b/src/plugins/platforms/windows/CMakeLists.txt
@@ -0,0 +1,240 @@
+# Generated from windows.pro.
+
+#####################################################################
+## QWindowsIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QWindowsIntegrationPlugin
+ OUTPUT_NAME qwindows
+ TYPE platforms
+ DEFAULT_IF ${QT_QPA_DEFAULT_PLATFORM} MATCHES windows # special case
+ SOURCES
+ main.cpp
+ qtwindowsglobal.h
+ qwin10helpers.cpp qwin10helpers.h
+ qwindowsbackingstore.cpp qwindowsbackingstore.h
+ qwindowscombase.h
+ qwindowscontext.cpp qwindowscontext.h
+ qwindowscursor.cpp qwindowscursor.h
+ qwindowsdialoghelpers.cpp qwindowsdialoghelpers.h
+ qwindowsdropdataobject.cpp qwindowsdropdataobject.h
+ qwindowsgdiintegration.cpp qwindowsgdiintegration.h
+ qwindowsgdinativeinterface.cpp qwindowsgdinativeinterface.h
+ qwindowsinputcontext.cpp qwindowsinputcontext.h
+ qwindowsintegration.cpp qwindowsintegration.h
+ qwindowsinternalmimedata.cpp qwindowsinternalmimedata.h
+ qwindowskeymapper.cpp qwindowskeymapper.h
+ qwindowsmenu.cpp qwindowsmenu.h
+ qwindowsmime.cpp qwindowsmime.h
+ qwindowsmousehandler.cpp qwindowsmousehandler.h
+ qwindowsnativeinterface.cpp qwindowsnativeinterface.h
+ qwindowsole.cpp qwindowsole.h
+ qwindowsopengltester.cpp qwindowsopengltester.h
+ qwindowspointerhandler.cpp qwindowspointerhandler.h
+ qwindowsscreen.cpp qwindowsscreen.h
+ qwindowsservices.cpp qwindowsservices.h
+ qwindowstheme.cpp qwindowstheme.h
+ qwindowsthreadpoolrunner.h
+ qwindowswindow.cpp qwindowswindow.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ LIBRARIES
+ advapi32
+ d3d9
+ gdi32
+ ole32
+ shell32
+ user32
+ winmm
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EventDispatcherSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::ThemeSupportPrivate
+ dwmapi
+ imm32
+ oleaut32
+ shlwapi
+ winspool
+ wtsapi32
+)
+
+# Resources:
+set_source_files_properties("openglblacklists/default.json"
+ PROPERTIES QT_RESOURCE_ALIAS "default.json"
+)
+set(openglblacklists_resource_files
+ "openglblacklists/default.json"
+)
+
+qt_add_resource(QWindowsIntegrationPlugin "openglblacklists"
+ PREFIX
+ "/qt-project.org/windows/openglblacklists"
+ FILES
+ ${openglblacklists_resource_files}
+)
+
+
+#### Keys ignored in scope 1:.:.:windows.pro:<TRUE>:
+# OTHER_FILES = "windows.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_accessibility
+ SOURCES
+ uiautomation/qwindowsuiaaccessibility.cpp uiautomation/qwindowsuiaaccessibility.h
+ uiautomation/qwindowsuiabaseprovider.cpp uiautomation/qwindowsuiabaseprovider.h
+ uiautomation/qwindowsuiaexpandcollapseprovider.cpp uiautomation/qwindowsuiaexpandcollapseprovider.h
+ uiautomation/qwindowsuiagriditemprovider.cpp uiautomation/qwindowsuiagriditemprovider.h
+ uiautomation/qwindowsuiagridprovider.cpp uiautomation/qwindowsuiagridprovider.h
+ uiautomation/qwindowsuiainvokeprovider.cpp uiautomation/qwindowsuiainvokeprovider.h
+ uiautomation/qwindowsuiamainprovider.cpp uiautomation/qwindowsuiamainprovider.h
+ uiautomation/qwindowsuiaprovidercache.cpp uiautomation/qwindowsuiaprovidercache.h
+ uiautomation/qwindowsuiarangevalueprovider.cpp uiautomation/qwindowsuiarangevalueprovider.h
+ uiautomation/qwindowsuiaselectionitemprovider.cpp uiautomation/qwindowsuiaselectionitemprovider.h
+ uiautomation/qwindowsuiaselectionprovider.cpp uiautomation/qwindowsuiaselectionprovider.h
+ uiautomation/qwindowsuiatableitemprovider.cpp uiautomation/qwindowsuiatableitemprovider.h
+ uiautomation/qwindowsuiatableprovider.cpp uiautomation/qwindowsuiatableprovider.h
+ uiautomation/qwindowsuiatextprovider.cpp uiautomation/qwindowsuiatextprovider.h
+ uiautomation/qwindowsuiatextrangeprovider.cpp uiautomation/qwindowsuiatextrangeprovider.h
+ uiautomation/qwindowsuiatoggleprovider.cpp uiautomation/qwindowsuiatoggleprovider.h
+ uiautomation/qwindowsuiautils.cpp uiautomation/qwindowsuiautils.h
+ uiautomation/qwindowsuiavalueprovider.cpp uiautomation/qwindowsuiavalueprovider.h
+ uiautomation/qwindowsuiawindowprovider.cpp uiautomation/qwindowsuiawindowprovider.h
+ PUBLIC_LIBRARIES
+ Qt::AccessibilitySupportPrivate
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_vulkan
+ SOURCES
+ qwindowsvulkaninstance.cpp qwindowsvulkaninstance.h
+ PUBLIC_LIBRARIES
+ Qt::VulkanSupportPrivate
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_directwrite3
+ DEFINES
+ QT_USE_DIRECTWRITE2
+ QT_USE_DIRECTWRITE3
+)
+
+#### Keys ignored in scope 6:.:.:windows.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_opengl AND NOT QT_FEATURE_dynamicgl AND NOT QT_FEATURE_opengles2
+ PUBLIC_LIBRARIES
+ opengl32
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION mingw
+ PUBLIC_LIBRARIES
+ uuid
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_opengl
+ SOURCES
+ qwindowsopenglcontext.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_opengles2
+ SOURCES
+ qwindowseglcontext.cpp qwindowseglcontext.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_opengl AND NOT QT_FEATURE_opengles2
+ SOURCES
+ qwindowsglcontext.cpp qwindowsglcontext.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_dynamicgl
+ SOURCES
+ qwindowseglcontext.cpp qwindowseglcontext.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_systemtrayicon
+ SOURCES
+ qwindowssystemtrayicon.cpp qwindowssystemtrayicon.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_clipboard
+ SOURCES
+ qwindowsclipboard.cpp qwindowsclipboard.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_clipboard AND QT_FEATURE_draganddrop
+ SOURCES
+ qwindowsdrag.cpp qwindowsdrag.h
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_tabletevent
+ SOURCES
+ qwindowstabletsupport.cpp qwindowstabletsupport.h
+ INCLUDE_DIRECTORIES
+ ${QT_SOURCE_TREE}/src/3rdparty/wintab
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_sessionmanager
+ SOURCES
+ qwindowssessionmanager.cpp qwindowssessionmanager.h
+)
+
+if(QT_FEATURE_imageformat_png)
+ # Resources:
+ set(cursors_resource_files
+ "images/closedhandcursor_32.png"
+ "images/closedhandcursor_48.png"
+ "images/closedhandcursor_64.png"
+ "images/dragcopycursor_32.png"
+ "images/dragcopycursor_48.png"
+ "images/dragcopycursor_64.png"
+ "images/draglinkcursor_32.png"
+ "images/draglinkcursor_48.png"
+ "images/draglinkcursor_64.png"
+ "images/dragmovecursor_32.png"
+ "images/dragmovecursor_48.png"
+ "images/dragmovecursor_64.png"
+ "images/openhandcursor_32.png"
+ "images/openhandcursor_48.png"
+ "images/openhandcursor_64.png"
+ "images/splithcursor_32.png"
+ "images/splithcursor_48.png"
+ "images/splithcursor_64.png"
+ "images/splitvcursor_32.png"
+ "images/splitvcursor_48.png"
+ "images/splitvcursor_64.png"
+ )
+
+ qt_add_resource(QWindowsIntegrationPlugin "cursors"
+ PREFIX
+ "/qt-project.org/windows/cursors"
+ FILES
+ ${cursors_resource_files}
+ )
+endif()
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_accessibility AND TARGET Qt::WindowsUIAutomationSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::WindowsUIAutomationSupportPrivate
+)
+
+qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_accessibility AND mingw
+ PUBLIC_LIBRARIES
+ uuid
+)
+
+# special case:
+# qt_extend_target(QWindowsIntegrationPlugin CONDITION QT_FEATURE_combined_angle_lib ...
+# qt_extend_target(QWindowsIntegrationPlugin CONDITION NOT QT_FEATURE_combined_angle_lib ...
+
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index 0d357b1605..20a9e2da94 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -70,6 +70,7 @@
#include <qpa/qplatformnativeinterface.h>
#include <QtGui/qguiapplication.h>
#include <QtGui/qopenglcontext.h>
+#include <QtGui/qtouchdevice.h>
#include <QtCore/qset.h>
#include <QtCore/qhash.h>
@@ -379,6 +380,16 @@ bool QWindowsContext::initTablet(unsigned integrationOptions)
#endif
}
+bool QWindowsContext::disposeTablet()
+{
+#if QT_CONFIG(tabletevent)
+ d->m_tabletSupport.reset();
+ return true;
+#else
+ return false;
+#endif
+}
+
bool QWindowsContext::initPointer(unsigned integrationOptions)
{
if (integrationOptions & QWindowsIntegration::DontUseWMPointer)
@@ -999,7 +1010,7 @@ QByteArray QWindowsContext::comErrorString(HRESULT hr)
}
_com_error error(hr);
result += QByteArrayLiteral(" (");
- result += errorMessageFromComError(error);
+ result += errorMessageFromComError(error).toUtf8();
result += ')';
return result;
}
diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h
index c89b8b91f4..67d23b3c0c 100644
--- a/src/plugins/platforms/windows/qwindowscontext.h
+++ b/src/plugins/platforms/windows/qwindowscontext.h
@@ -175,6 +175,7 @@ public:
bool initTouch(unsigned integrationOptions); // For calls from QWindowsIntegration::QWindowsIntegration() only.
bool initTablet(unsigned integrationOptions);
bool initPointer(unsigned integrationOptions);
+ bool disposeTablet();
bool initPowerNotificationHandler();
diff --git a/src/plugins/platforms/windows/qwindowscursor.h b/src/plugins/platforms/windows/qwindowscursor.h
index cf3635bd6b..fc2a111aac 100644
--- a/src/plugins/platforms/windows/qwindowscursor.h
+++ b/src/plugins/platforms/windows/qwindowscursor.h
@@ -61,9 +61,9 @@ inline bool operator==(const QWindowsPixmapCursorCacheKey &k1, const QWindowsPix
return k1.bitmapCacheKey == k2.bitmapCacheKey && k1.maskCacheKey == k2.maskCacheKey;
}
-inline uint qHash(const QWindowsPixmapCursorCacheKey &k, uint seed) noexcept
+inline size_t qHash(const QWindowsPixmapCursorCacheKey &k, size_t seed) noexcept
{
- return (uint(k.bitmapCacheKey) + uint(k.maskCacheKey)) ^ seed;
+ return (size_t(k.bitmapCacheKey) + size_t(k.maskCacheKey)) ^ seed;
}
class CursorHandle
diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
index 37115d5c6e..dbd7d557db 100644
--- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
+++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
@@ -55,7 +55,9 @@
#include <QtGui/qcolor.h>
#include <QtCore/qdebug.h>
-#include <QtCore/qregularexpression.h>
+#if QT_CONFIG(regularexpression)
+# include <QtCore/qregularexpression.h>
+#endif
#include <QtCore/qtimer.h>
#include <QtCore/qdir.h>
#include <QtCore/qscopedpointer.h>
@@ -1026,9 +1028,12 @@ static QList<FilterSpec> filterSpecs(const QStringList &filters,
result.reserve(filters.size());
*totalStringLength = 0;
+#if QT_CONFIG(regularexpression)
const QRegularExpression filterSeparatorRE(QStringLiteral("[;\\s]+"));
const QString separator = QStringLiteral(";");
Q_ASSERT(filterSeparatorRE.isValid());
+#endif
+
// Split filter specification as 'Texts (*.txt[;] *.doc)', '*.txt[;] *.doc'
// into description and filters specification as '*.txt;*.doc'
for (const QString &filterString : filters) {
@@ -1041,7 +1046,11 @@ static QList<FilterSpec> filterSpecs(const QStringList &filters,
filterString.mid(openingParenPos + 1, closingParenPos - openingParenPos - 1).trimmed();
if (filterSpec.filter.isEmpty())
filterSpec.filter += u'*';
+#if QT_CONFIG(regularexpression)
filterSpec.filter.replace(filterSeparatorRE, separator);
+#else
+ filterSpec.filter.replace(QLatin1Char(' '), QLatin1Char(';'));
+#endif
filterSpec.description = filterString;
if (hideFilterDetails && openingParenPos != -1) { // Do not show pattern in description
filterSpec.description.truncate(openingParenPos);
diff --git a/src/plugins/platforms/windows/qwindowseglcontext.cpp b/src/plugins/platforms/windows/qwindowseglcontext.cpp
index 4ae087dfaa..d0b3568dad 100644
--- a/src/plugins/platforms/windows/qwindowseglcontext.cpp
+++ b/src/plugins/platforms/windows/qwindowseglcontext.cpp
@@ -44,7 +44,7 @@
#include <QtCore/qdebug.h>
#include <QtGui/qopenglcontext.h>
-#if defined(QT_OPENGL_ES_2_ANGLE) || defined(QT_OPENGL_DYNAMIC)
+#if QT_CONFIG(angle) || defined(QT_OPENGL_DYNAMIC)
# include <EGL/eglext.h>
#endif
diff --git a/src/plugins/platforms/windows/qwindowsgdiintegration.cpp b/src/plugins/platforms/windows/qwindowsgdiintegration.cpp
index c88f669eb5..7e9595321a 100644
--- a/src/plugins/platforms/windows/qwindowsgdiintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsgdiintegration.cpp
@@ -45,6 +45,10 @@
#include <QtCore/qdebug.h>
#include <QtGui/private/qpixmap_raster_p.h>
+#if QT_CONFIG(opengl)
+#include <QtPlatformCompositorSupport/qpa/qplatformbackingstoreopenglsupport.h>
+#endif
+
QT_BEGIN_NAMESPACE
class QWindowsGdiIntegrationPrivate
@@ -73,7 +77,11 @@ QPlatformPixmap *QWindowsGdiIntegration::createPlatformPixmap(QPlatformPixmap::P
QPlatformBackingStore *QWindowsGdiIntegration::createPlatformBackingStore(QWindow *window) const
{
- return new QWindowsBackingStore(window);
+ auto *backingStore = new QWindowsBackingStore(window);
+#ifndef QT_NO_OPENGL
+ backingStore->setOpenGLSupport(new QPlatformBackingStoreOpenGLSupport(backingStore));
+#endif
+ return backingStore;
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/windows/qwindowsglcontext.cpp b/src/plugins/platforms/windows/qwindowsglcontext.cpp
index 6fa5a8a2b3..b2ac2e3476 100644
--- a/src/plugins/platforms/windows/qwindowsglcontext.cpp
+++ b/src/plugins/platforms/windows/qwindowsglcontext.cpp
@@ -329,7 +329,7 @@ static inline bool
static void describeFormats(HDC hdc)
{
const int pfiMax = QOpenGLStaticContext::opengl32.describePixelFormat(hdc, 0, 0, nullptr);
- for (int i = 0; i < pfiMax; i++) {
+ for (int i = 1; i <= pfiMax; i++) {
PIXELFORMATDESCRIPTOR pfd;
initPixelFormatDescriptor(&pfd);
QOpenGLStaticContext::opengl32.describePixelFormat(hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index f4bf58ee31..9add72d266 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -48,6 +48,9 @@
#include "qwindowsscreen.h"
#include "qwindowstheme.h"
#include "qwindowsservices.h"
+#ifdef QT_USE_DIRECTWRITE3
+#include <QtFontDatabaseSupport/private/qwindowsdirectwritefontdatabase_p.h>
+#endif
#ifndef QT_NO_FREETYPE
# include <QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h>
#endif
@@ -81,10 +84,10 @@
#include <limits.h>
-#if defined(QT_OPENGL_ES_2) || defined(QT_OPENGL_DYNAMIC)
+#if QT_CONFIG(opengles2) || defined(QT_OPENGL_DYNAMIC)
# include "qwindowseglcontext.h"
#endif
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
+#if !defined(QT_NO_OPENGL) && !QT_CONFIG(opengles2)
# include "qwindowsglcontext.h"
#endif
@@ -137,6 +140,7 @@ struct QWindowsIntegrationPrivate
~QWindowsIntegrationPrivate();
unsigned m_options = 0;
+ int m_tabletAbsoluteRange = -1;
QWindowsContext m_context;
QPlatformFontDatabase *m_fontDatabase = nullptr;
#if QT_CONFIG(clipboard)
@@ -186,7 +190,9 @@ static inline unsigned parseOptions(const QStringList &paramList,
unsigned options = 0;
for (const QString &param : paramList) {
if (param.startsWith(u"fontengine=")) {
- if (param.endsWith(u"freetype")) {
+ if (param.endsWith(u"directwrite")) {
+ options |= QWindowsIntegration::FontDatabaseDirectWrite;
+ } else if (param.endsWith(u"freetype")) {
options |= QWindowsIntegration::FontDatabaseFreeType;
} else if (param.endsWith(u"native")) {
options |= QWindowsIntegration::FontDatabaseNative;
@@ -234,19 +240,18 @@ QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList &paramL
initOpenGlBlacklistResources();
static bool dpiAwarenessSet = false;
- int tabletAbsoluteRange = -1;
// Default to per-monitor awareness to avoid being scaled when monitors with different DPI
// are connected to Windows 8.1
QtWindows::ProcessDpiAwareness dpiAwareness = QtWindows::ProcessPerMonitorDpiAware;
- m_options = parseOptions(paramList, &tabletAbsoluteRange, &dpiAwareness);
+ m_options = parseOptions(paramList, &m_tabletAbsoluteRange, &dpiAwareness);
QWindowsFontDatabase::setFontOptions(m_options);
if (m_context.initPointer(m_options)) {
QCoreApplication::setAttribute(Qt::AA_CompressHighFrequencyEvents);
} else {
m_context.initTablet(m_options);
- if (tabletAbsoluteRange >= 0)
- m_context.setTabletAbsoluteRange(tabletAbsoluteRange);
+ if (m_tabletAbsoluteRange >= 0)
+ m_context.setTabletAbsoluteRange(m_tabletAbsoluteRange);
}
if (!dpiAwarenessSet) { // Set only once in case of repeated instantiations of QGuiApplication.
@@ -450,7 +455,7 @@ QWindowsStaticOpenGLContext *QWindowsStaticOpenGLContext::doCreate()
return eglCtx;
}
return QOpenGLStaticContext::create(true);
-#elif defined(QT_OPENGL_ES_2)
+#elif QT_CONFIG(opengles2)
QWindowsOpenGLTester::Renderers glesRenderers = QWindowsOpenGLTester::requestedGlesRenderer();
if (glesRenderers == QWindowsOpenGLTester::InvalidRenderer)
glesRenderers = QWindowsOpenGLTester::supportedRenderers(QWindowsOpenGLTester::AngleRendererD3d11);
@@ -478,7 +483,7 @@ QPlatformOpenGLContext *QWindowsIntegration::createPlatformOpenGLContext(QOpenGL
QOpenGLContext::OpenGLModuleType QWindowsIntegration::openGLModuleType()
{
-#if defined(QT_OPENGL_ES_2)
+#if QT_CONFIG(opengles2)
return QOpenGLContext::LibGLES;
#elif !defined(QT_OPENGL_DYNAMIC)
return QOpenGLContext::LibGL;
@@ -505,14 +510,17 @@ QWindowsStaticOpenGLContext *QWindowsIntegration::staticOpenGLContext()
QPlatformFontDatabase *QWindowsIntegration::fontDatabase() const
{
if (!d->m_fontDatabase) {
-#ifdef QT_NO_FREETYPE
- d->m_fontDatabase = new QWindowsFontDatabase();
-#else // QT_NO_FREETYPE
+#ifdef QT_USE_DIRECTWRITE3
+ if (d->m_options & QWindowsIntegration::FontDatabaseDirectWrite)
+ d->m_fontDatabase = new QWindowsDirectWriteFontDatabase;
+ else
+#endif
+#ifndef QT_NO_FREETYPE
if (d->m_options & QWindowsIntegration::FontDatabaseFreeType)
d->m_fontDatabase = new QWindowsFontDatabaseFT;
else
- d->m_fontDatabase = new QWindowsFontDatabase;
#endif // QT_NO_FREETYPE
+ d->m_fontDatabase = new QWindowsFontDatabase();
}
return d->m_fontDatabase;
}
@@ -634,6 +642,28 @@ void QWindowsIntegration::beep() const
MessageBeep(MB_OK); // For QApplication
}
+bool QWindowsIntegration::setWinTabEnabled(bool enabled)
+{
+ bool ret = false;
+ if (QWindowsIntegration *p = QWindowsIntegration::instance()) {
+ if (enabled) {
+ if (p->d->m_context.tabletSupport()) {
+ ret = true;
+ } else {
+ ret = p->d->m_context.initTablet(p->d->m_options);
+ if (ret && p->d->m_tabletAbsoluteRange >= 0)
+ p->d->m_context.setTabletAbsoluteRange(p->d->m_tabletAbsoluteRange);
+ }
+ } else {
+ if (p->d->m_context.tabletSupport())
+ ret = p->d->m_context.disposeTablet();
+ else
+ ret = true;
+ }
+ }
+ return ret;
+}
+
#if QT_CONFIG(vulkan)
QPlatformVulkanInstance *QWindowsIntegration::createPlatformVulkanInstance(QVulkanInstance *instance) const
{
diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h
index 1f16d13769..64cbda7c58 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.h
+++ b/src/plugins/platforms/windows/qwindowsintegration.h
@@ -72,7 +72,8 @@ public:
DetectAltGrModifier = 0x800,
RtlEnabled = 0x1000,
DarkModeWindowFrames = 0x2000,
- DarkModeStyle = 0x4000
+ DarkModeStyle = 0x4000,
+ FontDatabaseDirectWrite = 0x8000
};
explicit QWindowsIntegration(const QStringList &paramList);
@@ -110,6 +111,8 @@ public:
static QWindowsIntegration *instance() { return m_instance; }
+ static bool setWinTabEnabled(bool enabled);
+
unsigned options() const;
void beep() const override;
diff --git a/src/plugins/platforms/windows/qwindowsmime.cpp b/src/plugins/platforms/windows/qwindowsmime.cpp
index 6733ab9fed..f8cc5e76ff 100644
--- a/src/plugins/platforms/windows/qwindowsmime.cpp
+++ b/src/plugins/platforms/windows/qwindowsmime.cpp
@@ -149,7 +149,10 @@ static bool qt_write_dibv5(QDataStream &s, QImage image)
return false;
//depth will be always 32
- int bpl_bmp = image.width()*4;
+ qsizetype bpl_bmp = qsizetype(image.width()) * 4;
+ qsizetype size = bpl_bmp * image.height();
+ if (qsizetype(DWORD(size)) != size)
+ return false;
BMP_BITMAPV5HEADER bi;
ZeroMemory(&bi, sizeof(bi));
@@ -261,11 +264,11 @@ static bool qt_read_dibv5(QDataStream &s, QImage &image)
const int blue_shift = calc_shift(blue_mask);
const int alpha_shift = alpha_mask ? calc_shift(alpha_mask) : 0u;
- const int bpl = image.bytesPerLine();
+ const qsizetype bpl = image.bytesPerLine();
uchar *data = image.bits();
auto *buf24 = new uchar[bpl];
- const int bpl24 = ((w * nbits + 31) / 32) * 4;
+ const qsizetype bpl24 = ((qsizetype(w) * nbits + 31) / 32) * 4;
while (--h >= 0) {
QRgb *p = reinterpret_cast<QRgb *>(data + h * bpl);
diff --git a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp
index 1195f15a59..a36da4c780 100644
--- a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp
+++ b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp
@@ -300,6 +300,8 @@ QFunctionPointer QWindowsNativeInterface::platformFunction(const QByteArray &fun
return QFunctionPointer(QWindowsNativeInterface::setWindowActivationBehavior);
if (function == QWindowsWindowFunctions::isTabletModeIdentifier())
return QFunctionPointer(QWindowsNativeInterface::isTabletMode);
+ if (function == QWindowsWindowFunctions::setWinTabEnabledIdentifier())
+ return QFunctionPointer(QWindowsIntegration::setWinTabEnabled);
return nullptr;
}
diff --git a/src/plugins/platforms/windows/qwindowsopengltester.cpp b/src/plugins/platforms/windows/qwindowsopengltester.cpp
index 72092a4481..d7d186e804 100644
--- a/src/plugins/platforms/windows/qwindowsopengltester.cpp
+++ b/src/plugins/platforms/windows/qwindowsopengltester.cpp
@@ -322,16 +322,17 @@ QWindowsOpenGLTester::Renderers QWindowsOpenGLTester::detectSupportedRenderers(c
result |= QWindowsOpenGLTester::DesktopGl;
}
- const char bugListFileVar[] = "QT_OPENGL_BUGLIST";
- QString buglistFileName = QStringLiteral(":/qt-project.org/windows/openglblacklists/default.json");
-
- if (qEnvironmentVariableIsSet(bugListFileVar)) {
- const QString fileName = resolveBugListFile(QFile::decodeName(qgetenv(bugListFileVar)));
- if (!fileName.isEmpty())
- buglistFileName = fileName;
+ QSet<QString> features; // empty by default -> nothing gets disabled
+ if (!qEnvironmentVariableIsSet("QT_NO_OPENGL_BUGLIST")) {
+ const char bugListFileVar[] = "QT_OPENGL_BUGLIST";
+ QString buglistFileName = QStringLiteral(":/qt-project.org/windows/openglblacklists/default.json");
+ if (qEnvironmentVariableIsSet(bugListFileVar)) {
+ const QString fileName = resolveBugListFile(QFile::decodeName(qgetenv(bugListFileVar)));
+ if (!fileName.isEmpty())
+ buglistFileName = fileName;
+ }
+ features = QOpenGLConfig::gpuFeatures(qgpu, buglistFileName);
}
-
- QSet<QString> features = QOpenGLConfig::gpuFeatures(qgpu, buglistFileName);
qCDebug(lcQpaGl) << "GPU features:" << features;
if (features.contains(QStringLiteral("disable_desktopgl"))) { // Qt-specific
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index 6b53e3d4c4..6c6544aeab 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -269,7 +269,7 @@ QDebug operator<<(QDebug d, const GUID &guid)
static void formatBriefRectangle(QDebug &d, const QRect &r)
{
- d << r.width() << 'x' << r.height() << forcesign << r.x() << r.y() << noforcesign;
+ d << r.width() << 'x' << r.height() << Qt::forcesign << r.x() << r.y() << Qt::noforcesign;
}
static void formatBriefMargins(QDebug &d, const QMargins &m)
@@ -927,7 +927,7 @@ QMargins QWindowsGeometryHint::frameOnPrimaryScreen(DWORD style, DWORD exStyle)
const QMargins result(qAbs(rect.left), qAbs(rect.top),
qAbs(rect.right), qAbs(rect.bottom));
qCDebug(lcQpaWindows).nospace() << __FUNCTION__ << " style="
- << showbase << hex << style << " exStyle=" << exStyle << dec << noshowbase
+ << Qt::showbase << Qt::hex << style << " exStyle=" << exStyle << Qt::dec << Qt::noshowbase
<< ' ' << rect << ' ' << result;
return result;
}
diff --git a/src/plugins/platforms/windows/windows.pro b/src/plugins/platforms/windows/windows.pro
index 50a3bb41a9..b14969cc3a 100644
--- a/src/plugins/platforms/windows/windows.pro
+++ b/src/plugins/platforms/windows/windows.pro
@@ -5,9 +5,13 @@ QT += \
eventdispatcher_support-private \
fontdatabase_support-private theme_support-private
+qtHaveModule(platformcompositor_support-private): QT += platformcompositor_support-private
+
qtConfig(accessibility): QT += accessibility_support-private
qtConfig(vulkan): QT += vulkan_support-private
+qtConfig(directwrite3): DEFINES *= QT_USE_DIRECTWRITE2 QT_USE_DIRECTWRITE3
+
LIBS += -ldwmapi
QMAKE_USE_PRIVATE += gdi32
diff --git a/src/plugins/platforms/winrt/qwinrtintegration.cpp b/src/plugins/platforms/winrt/qwinrtintegration.cpp
index 27d3746933..f7d44c6f28 100644
--- a/src/plugins/platforms/winrt/qwinrtintegration.cpp
+++ b/src/plugins/platforms/winrt/qwinrtintegration.cpp
@@ -53,6 +53,9 @@
#if QT_CONFIG(accessibility)
# include "uiautomation/qwinrtuiaaccessibility.h"
#endif
+#if QT_CONFIG(opengl)
+#include <QtPlatformCompositorSupport/qpa/qplatformbackingstoreopenglsupport.h>
+#endif
#include <QtGui/QOffscreenSurface>
#include <QtGui/QOpenGLContext>
@@ -92,7 +95,7 @@ typedef IEventHandler<SuspendingEventArgs *> SuspendHandler;
QT_BEGIN_NAMESPACE
typedef HRESULT (__stdcall ICoreApplication::*CoreApplicationCallbackRemover)(EventRegistrationToken);
-uint qHash(CoreApplicationCallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
+size_t qHash(CoreApplicationCallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
class QWinRTIntegrationPrivate
{
@@ -205,7 +208,11 @@ QPlatformWindow *QWinRTIntegration::createPlatformWindow(QWindow *window) const
QPlatformBackingStore *QWinRTIntegration::createPlatformBackingStore(QWindow *window) const
{
- return new QWinRTBackingStore(window);
+ auto *backingStore = new QWinRTBackingStore(window);
+#if QT_CONFIG(opengl)
+ backingStore->setOpenGLSupport(new QPlatformBackingStoreOpenGLSupport(backingStore));
+#endif
+ return backingStore;
}
QPlatformOpenGLContext *QWinRTIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const
diff --git a/src/plugins/platforms/winrt/qwinrtscreen.cpp b/src/plugins/platforms/winrt/qwinrtscreen.cpp
index 86ab7651c6..5db1459213 100644
--- a/src/plugins/platforms/winrt/qwinrtscreen.cpp
+++ b/src/plugins/platforms/winrt/qwinrtscreen.cpp
@@ -471,13 +471,13 @@ static inline Qt::Key qKeyFromCode(quint32 code, int mods)
}
typedef HRESULT (__stdcall ICoreWindow::*CoreWindowCallbackRemover)(EventRegistrationToken);
-uint qHash(CoreWindowCallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
+size_t qHash(CoreWindowCallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
typedef HRESULT (__stdcall IDisplayInformation::*DisplayCallbackRemover)(EventRegistrationToken);
-uint qHash(DisplayCallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
+size_t qHash(DisplayCallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
typedef HRESULT (__stdcall ICorePointerRedirector::*RedirectorCallbackRemover)(EventRegistrationToken);
-uint qHash(RedirectorCallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
+size_t qHash(RedirectorCallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
typedef HRESULT (__stdcall IApplicationView2::*ApplicationView2CallbackRemover)(EventRegistrationToken);
-uint qHash(ApplicationView2CallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
+size_t qHash(ApplicationView2CallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
class QWinRTScreenPrivate
{
diff --git a/src/plugins/platforms/winrt/winrt.pro b/src/plugins/platforms/winrt/winrt.pro
index 43dc8f074c..7ac49f73c4 100644
--- a/src/plugins/platforms/winrt/winrt.pro
+++ b/src/plugins/platforms/winrt/winrt.pro
@@ -6,6 +6,8 @@ QT += \
core-private gui-private \
fontdatabase_support-private egl_support-private
+qtHaveModule(platformcompositor_support-private): QT += platformcompositor_support-private
+
DEFINES *= QT_NO_CAST_FROM_ASCII __WRL_NO_DEFAULT_LIB__
QMAKE_USE_PRIVATE += d3d11 ws2_32
diff --git a/src/plugins/platforms/xcb/.prev_CMakeLists.txt b/src/plugins/platforms/xcb/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..85290fae84
--- /dev/null
+++ b/src/plugins/platforms/xcb/.prev_CMakeLists.txt
@@ -0,0 +1,167 @@
+# Generated from xcb.pro.
+
+#####################################################################
+## XcbQpa Module:
+#####################################################################
+
+qt_add_module(XcbQpa
+ INTERNAL_MODULE
+ NO_MODULE_HEADERS
+ SOURCES
+ gl_integrations/qxcbglintegration.cpp gl_integrations/qxcbglintegration.h
+ gl_integrations/qxcbglintegrationfactory.cpp gl_integrations/qxcbglintegrationfactory.h
+ gl_integrations/qxcbglintegrationplugin.h
+ gl_integrations/qxcbnativeinterfacehandler.cpp gl_integrations/qxcbnativeinterfacehandler.h
+ qxcbatom.cpp qxcbatom.h
+ qxcbbackingstore.cpp qxcbbackingstore.h
+ qxcbclipboard.cpp qxcbclipboard.h
+ qxcbconnection.cpp qxcbconnection.h
+ qxcbconnection_basic.cpp qxcbconnection_basic.h
+ qxcbconnection_screens.cpp
+ qxcbconnection_xi2.cpp
+ qxcbcursor.cpp qxcbcursor.h
+ qxcbeventdispatcher.cpp qxcbeventdispatcher.h
+ qxcbeventqueue.cpp qxcbeventqueue.h
+ qxcbimage.cpp qxcbimage.h
+ qxcbintegration.cpp qxcbintegration.h
+ qxcbkeyboard.cpp qxcbkeyboard.h
+ qxcbmime.cpp qxcbmime.h
+ qxcbnativeinterface.cpp qxcbnativeinterface.h
+ qxcbobject.h
+ qxcbscreen.cpp qxcbscreen.h
+ qxcbsystemtraytracker.cpp qxcbsystemtraytracker.h
+ qxcbwindow.cpp qxcbwindow.h
+ qxcbwmsupport.cpp qxcbwmsupport.h
+ qxcbxsettings.cpp qxcbxsettings.h
+ DEFINES
+ QT_BUILD_XCB_PLUGIN
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ gl_integrations
+ PUBLIC_LIBRARIES
+ PkgConfig::XKB_COMMON_X11
+ Qt::CorePrivate
+ Qt::EdidSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::GuiPrivate
+ Qt::ServiceSupportPrivate
+ Qt::ThemeSupportPrivate
+ Qt::XkbCommonSupportPrivate
+ XCB::ICCCM
+ XCB::IMAGE
+ XCB::KEYSYMS
+ XCB::RANDR
+ XCB::RENDER
+ XCB::RENDERUTIL
+ XCB::SHAPE
+ XCB::SHM
+ XCB::SYNC
+ XCB::XCB
+ XCB::XFIXES
+ XCB::XINERAMA
+ XCB::XINPUT
+ XCB::XKB
+ XKB::XKB
+)
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(XcbQpa CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+qt_extend_target(XcbQpa CONDITION TARGET Qt::LinuxAccessibilitySupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::LinuxAccessibilitySupportPrivate
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_vulkan
+ SOURCES
+ qxcbvulkaninstance.cpp qxcbvulkaninstance.h
+ qxcbvulkanwindow.cpp qxcbvulkanwindow.h
+ PUBLIC_LIBRARIES
+ Qt::VulkanSupportPrivate
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_glib
+ LIBRARIES
+ GLIB2::GLIB2
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_draganddrop
+ SOURCES
+ qxcbdrag.cpp qxcbdrag.h
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_xcb_xlib
+ PUBLIC_LIBRARIES
+ X11::XCB
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_xcb_sm
+ SOURCES
+ qxcbsessionmanager.cpp qxcbsessionmanager.h
+ PUBLIC_LIBRARIES
+ ${X11_SM_LIB} ${X11_ICE_LIB}
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_dlopen
+ PUBLIC_LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
+
+qt_extend_target(XcbQpa CONDITION CLANG AND NOT ICC
+ COMPILE_OPTIONS
+ -ftemplate-depth=1024
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_xcb_native_painting
+ SOURCES
+ nativepainting/qbackingstore_x11.cpp nativepainting/qbackingstore_x11_p.h
+ nativepainting/qcolormap_x11.cpp nativepainting/qcolormap_x11_p.h
+ nativepainting/qpaintengine_x11.cpp nativepainting/qpaintengine_x11_p.h
+ nativepainting/qpixmap_x11.cpp nativepainting/qpixmap_x11_p.h
+ nativepainting/qt_x11_p.h
+ nativepainting/qtessellator.cpp nativepainting/qtessellator_p.h
+ nativepainting/qxcbnativepainting.cpp nativepainting/qxcbnativepainting.h
+ INCLUDE_DIRECTORIES
+ nativepainting
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_xcb_native_painting AND QT_FEATURE_xrender
+ PUBLIC_LIBRARIES
+ PkgConfig::XRender
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_fontconfig AND QT_FEATURE_xcb_native_painting
+ LIBRARIES
+ WrapFreetype::WrapFreetype
+)
+#####################################################################
+## QXcbIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QXcbIntegrationPlugin
+ OUTPUT_NAME qxcb
+ TYPE platforms
+ SOURCES
+ qxcbmain.cpp
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ Qt::XcbQpaPrivate
+)
+
+#### Keys ignored in scope 20:.:.:xcb-plugin.pro:<TRUE>:
+# OTHER_FILES = "xcb.json" "README"
+
+## Scopes:
+#####################################################################
+
+#### Keys ignored in scope 22:.:.:xcb-plugin.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
+add_subdirectory(gl_integrations)
diff --git a/src/plugins/platforms/xcb/CMakeLists.txt b/src/plugins/platforms/xcb/CMakeLists.txt
new file mode 100644
index 0000000000..a7cb58ba29
--- /dev/null
+++ b/src/plugins/platforms/xcb/CMakeLists.txt
@@ -0,0 +1,193 @@
+# Generated from xcb.pro.
+
+#####################################################################
+## XcbQpa Module:
+#####################################################################
+
+qt_add_module(XcbQpa
+ INTERNAL_MODULE
+ NO_MODULE_HEADERS
+ SOURCES
+ gl_integrations/qxcbglintegration.cpp gl_integrations/qxcbglintegration.h
+ gl_integrations/qxcbglintegrationfactory.cpp gl_integrations/qxcbglintegrationfactory.h
+ gl_integrations/qxcbglintegrationplugin.h
+ gl_integrations/qxcbnativeinterfacehandler.cpp gl_integrations/qxcbnativeinterfacehandler.h
+ qxcbatom.cpp qxcbatom.h
+ qxcbbackingstore.cpp qxcbbackingstore.h
+ qxcbclipboard.cpp qxcbclipboard.h
+ qxcbconnection.cpp qxcbconnection.h
+ qxcbconnection_basic.cpp qxcbconnection_basic.h
+ qxcbconnection_screens.cpp
+ qxcbconnection_xi2.cpp
+ qxcbcursor.cpp qxcbcursor.h
+ qxcbeventdispatcher.cpp qxcbeventdispatcher.h
+ qxcbeventqueue.cpp qxcbeventqueue.h
+ qxcbimage.cpp qxcbimage.h
+ qxcbintegration.cpp qxcbintegration.h
+ qxcbkeyboard.cpp qxcbkeyboard.h
+ qxcbmime.cpp qxcbmime.h
+ qxcbnativeinterface.cpp qxcbnativeinterface.h
+ qxcbobject.h
+ qxcbscreen.cpp qxcbscreen.h
+ qxcbsystemtraytracker.cpp qxcbsystemtraytracker.h
+ qxcbwindow.cpp qxcbwindow.h
+ qxcbwmsupport.cpp qxcbwmsupport.h
+ qxcbxsettings.cpp qxcbxsettings.h
+ DEFINES
+ QT_BUILD_XCB_PLUGIN
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ gl_integrations
+ PUBLIC_LIBRARIES
+ PkgConfig::XKB_COMMON_X11
+ Qt::CorePrivate
+ Qt::EdidSupportPrivate
+ Qt::FontDatabaseSupportPrivate
+ Qt::GuiPrivate
+ Qt::ServiceSupportPrivate
+ Qt::ThemeSupportPrivate
+ Qt::XkbCommonSupportPrivate
+ XCB::ICCCM
+ XCB::IMAGE
+ XCB::KEYSYMS
+ XCB::RANDR
+ XCB::RENDER
+ XCB::RENDERUTIL
+ XCB::SHAPE
+ XCB::SHM
+ XCB::SYNC
+ XCB::XCB
+ XCB::XFIXES
+ XCB::XINERAMA
+ $<$<TARGET_EXISTS:XCB::XINPUT>:XCB::XINPUT> # special case
+ XCB::XKB
+ XKB::XKB
+)
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(XcbQpa CONDITION TARGET Qt::PlatformCompositorSupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::PlatformCompositorSupportPrivate
+)
+
+qt_extend_target(XcbQpa CONDITION TARGET Qt::LinuxAccessibilitySupportPrivate
+ PUBLIC_LIBRARIES
+ Qt::LinuxAccessibilitySupportPrivate
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_vulkan
+ SOURCES
+ qxcbvulkaninstance.cpp qxcbvulkaninstance.h
+ qxcbvulkanwindow.cpp qxcbvulkanwindow.h
+ PUBLIC_LIBRARIES
+ Qt::VulkanSupportPrivate
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_glib
+ LIBRARIES
+ GLIB2::GLIB2
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_draganddrop
+ SOURCES
+ qxcbdrag.cpp qxcbdrag.h
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_xcb_xlib
+ PUBLIC_LIBRARIES
+ X11::XCB
+ # special case begin
+ # 'QMAKE_USE += xcb_xlib' in qmake implies also += xlib (aka X11)
+ # due to "use": "xcb xlib" in src/gui/configure.json.
+ # That's not yet handled by the conversion scripts unfortunately.
+ X11::X11
+ # special case end
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_xcb_sm
+ SOURCES
+ qxcbsessionmanager.cpp qxcbsessionmanager.h
+ PUBLIC_LIBRARIES
+ ${X11_SM_LIB} ${X11_ICE_LIB}
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_dlopen
+ PUBLIC_LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
+
+qt_extend_target(XcbQpa CONDITION CLANG AND NOT ICC
+ COMPILE_OPTIONS
+ -ftemplate-depth=1024
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_xcb_native_painting
+ SOURCES
+ nativepainting/qbackingstore_x11.cpp nativepainting/qbackingstore_x11_p.h
+ nativepainting/qcolormap_x11.cpp nativepainting/qcolormap_x11_p.h
+ nativepainting/qpaintengine_x11.cpp nativepainting/qpaintengine_x11_p.h
+ nativepainting/qpixmap_x11.cpp nativepainting/qpixmap_x11_p.h
+ nativepainting/qt_x11_p.h
+ nativepainting/qtessellator.cpp nativepainting/qtessellator_p.h
+ nativepainting/qxcbnativepainting.cpp nativepainting/qxcbnativepainting.h
+ INCLUDE_DIRECTORIES
+ nativepainting
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_xcb_native_painting AND QT_FEATURE_xrender
+ PUBLIC_LIBRARIES
+ PkgConfig::XRender
+)
+
+qt_extend_target(XcbQpa CONDITION QT_FEATURE_fontconfig AND QT_FEATURE_xcb_native_painting
+ LIBRARIES
+ WrapFreetype::WrapFreetype
+)
+
+# special case begin
+if (NOT QT_FEATURE_system_xcb_input)
+ set(xinput_source "${PROJECT_SOURCE_DIR}/src/3rdparty/xcb/libxcb/xinput.c")
+ set_source_files_properties(
+ "${xinput_source}"
+ PROPERTIES COMPILE_OPTIONS "-w"
+ )
+ target_sources(XcbQpa PRIVATE "${xinput_source}")
+ target_include_directories(XcbQpa PRIVATE
+ "${PROJECT_SOURCE_DIR}/src/3rdparty/xcb/include"
+ )
+endif()
+# special case end
+
+#####################################################################
+## QXcbIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QXcbIntegrationPlugin
+ OUTPUT_NAME qxcb
+ TYPE platforms
+ DEFAULT_IF ${QT_QPA_DEFAULT_PLATFORM} MATCHES xcb # special case
+ SOURCES
+ qxcbmain.cpp
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ Qt::XcbQpaPrivate
+)
+
+#### Keys ignored in scope 20:.:.:xcb-plugin.pro:<TRUE>:
+# OTHER_FILES = "xcb.json" "README"
+
+## Scopes:
+#####################################################################
+
+#### Keys ignored in scope 22:.:.:xcb-plugin.pro:NOT TARGET___equals____ss_QT_DEFAULT_QPA_PLUGIN:
+# PLUGIN_EXTENDS = "-"
+add_subdirectory(gl_integrations)
+if(OFF)
+ add_subdirectory(xcb-static) # special case TODO: xcb-static sub folder
+endif()
+
diff --git a/src/plugins/platforms/xcb/gl_integrations/CMakeLists.txt b/src/plugins/platforms/xcb/gl_integrations/CMakeLists.txt
new file mode 100644
index 0000000000..210a924550
--- /dev/null
+++ b/src/plugins/platforms/xcb/gl_integrations/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Generated from gl_integrations.pro.
+
+if(QT_FEATURE_xcb_egl_plugin)
+ add_subdirectory(xcb_egl)
+endif()
+if(QT_FEATURE_xcb_glx_plugin)
+ add_subdirectory(xcb_glx)
+endif()
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/CMakeLists.txt b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/CMakeLists.txt
new file mode 100644
index 0000000000..a78d01ec87
--- /dev/null
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/CMakeLists.txt
@@ -0,0 +1,28 @@
+# Generated from xcb_egl.pro.
+
+#####################################################################
+## QXcbEglIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QXcbEglIntegrationPlugin
+ OUTPUT_NAME qxcb-egl-integration
+ TYPE xcbglintegrations
+ SOURCES
+ qxcbeglcontext.h
+ qxcbeglintegration.cpp qxcbeglintegration.h
+ qxcbeglmain.cpp
+ qxcbeglnativeinterfacehandler.cpp qxcbeglnativeinterfacehandler.h
+ qxcbeglwindow.cpp qxcbeglwindow.h
+ DEFINES
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ ..
+ ../..
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::EglSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::XcbQpaPrivate
+)
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/CMakeLists.txt b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/CMakeLists.txt
new file mode 100644
index 0000000000..b3361dbd99
--- /dev/null
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/CMakeLists.txt
@@ -0,0 +1,41 @@
+# Generated from xcb_glx.pro.
+
+#####################################################################
+## QXcbGlxIntegrationPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QXcbGlxIntegrationPlugin
+ OUTPUT_NAME qxcb-glx-integration
+ TYPE xcbglintegrations
+ SOURCES
+ qglxintegration.cpp qglxintegration.h
+ qxcbglxintegration.cpp qxcbglxintegration.h
+ qxcbglxmain.cpp
+ qxcbglxnativeinterfacehandler.cpp qxcbglxnativeinterfacehandler.h
+ qxcbglxwindow.cpp qxcbglxwindow.h
+ DEFINES
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ ..
+ ../..
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::GlxSupportPrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::XcbQpaPrivate
+)
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QXcbGlxIntegrationPlugin CONDITION QT_FEATURE_xcb_glx
+ PUBLIC_LIBRARIES
+ XCB::GLX
+)
+
+qt_extend_target(QXcbGlxIntegrationPlugin CONDITION QT_FEATURE_dlopen AND NOT static
+ PUBLIC_LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
index 75189a9c80..0fd421e925 100644
--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
@@ -241,7 +241,7 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat
void QGLXContext::init(QXcbScreen *screen, QPlatformOpenGLContext *share)
{
if (m_format.renderableType() == QSurfaceFormat::DefaultRenderableType)
-#if defined(QT_OPENGL_ES_2)
+#if QT_CONFIG(opengles2)
m_format.setRenderableType(QSurfaceFormat::OpenGLES);
#else
m_format.setRenderableType(QSurfaceFormat::OpenGL);
diff --git a/src/plugins/platforms/xcb/nativepainting/qpaintengine_x11.cpp b/src/plugins/platforms/xcb/nativepainting/qpaintengine_x11.cpp
index aa91d9266b..77d0caf649 100644
--- a/src/plugins/platforms/xcb/nativepainting/qpaintengine_x11.cpp
+++ b/src/plugins/platforms/xcb/nativepainting/qpaintengine_x11.cpp
@@ -2018,7 +2018,7 @@ Q_GUI_EXPORT void qt_x11_drawImage(const QRect &rect, const QPoint &pos, const Q
|| (image_byte_order == LSBFirst && bgr_layout))
{
im = image.copy(rect);
- const int iw = im.bytesPerLine() / 4;
+ const qsizetype iw = im.bytesPerLine() / 4;
uint *data = (uint *)im.bits();
for (int i=0; i < h; i++) {
uint *p = data;
diff --git a/src/plugins/platforms/xcb/nativepainting/qpixmap_x11.cpp b/src/plugins/platforms/xcb/nativepainting/qpixmap_x11.cpp
index f86bedbdcd..467e93e64f 100644
--- a/src/plugins/platforms/xcb/nativepainting/qpixmap_x11.cpp
+++ b/src/plugins/platforms/xcb/nativepainting/qpixmap_x11.cpp
@@ -1747,7 +1747,7 @@ XID QX11PlatformPixmap::createBitmapFromImage(const QImage &image)
int w = img.width();
int h = img.height();
int bpl = (w + 7) / 8;
- int ibpl = img.bytesPerLine();
+ qsizetype ibpl = img.bytesPerLine();
if (bpl != ibpl) {
tmp_bits = new uchar[bpl*h];
bits = (char *)tmp_bits;
@@ -2017,7 +2017,7 @@ QImage QX11PlatformPixmap::toImage(const QXImageWrapper &xiWrapper, const QRect
}
} else if (xi->bits_per_pixel == d) { // compatible depth
char *xidata = xi->data; // copy each scanline
- int bpl = qMin(int(image.bytesPerLine()),xi->bytes_per_line);
+ qsizetype bpl = qMin(image.bytesPerLine(),xi->bytes_per_line);
for (int y=0; y<xi->height; y++) {
memcpy(image.scanLine(y), xidata, bpl);
xidata += xi->bytes_per_line;
@@ -2038,10 +2038,10 @@ QImage QX11PlatformPixmap::toImage(const QXImageWrapper &xiWrapper, const QRect
uchar *end;
uchar use[256]; // pixel-in-use table
uchar pix[256]; // pixel translation table
- int ncols, bpl;
+ int ncols;
memset(use, 0, 256);
memset(pix, 0, 256);
- bpl = image.bytesPerLine();
+ qsizetype bpl = image.bytesPerLine();
if (x11_mask) { // which pixels are used?
for (int i = 0; i < xi->height; i++) {
diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.cpp b/src/plugins/platforms/xcb/qxcbbackingstore.cpp
index 8f55bc2e96..7330c3c9a3 100644
--- a/src/plugins/platforms/xcb/qxcbbackingstore.cpp
+++ b/src/plugins/platforms/xcb/qxcbbackingstore.cpp
@@ -537,7 +537,7 @@ void QXcbBackingStoreImage::ensureGC(xcb_drawable_t dst)
static inline void copy_unswapped(char *dst, int dstBytesPerLine, const QImage &img, const QRect &rect)
{
const uchar *srcData = img.constBits();
- const int srcBytesPerLine = img.bytesPerLine();
+ const qsizetype srcBytesPerLine = img.bytesPerLine();
const int leftOffset = rect.left() * img.depth() >> 3;
const int bottom = rect.bottom() + 1;
@@ -553,7 +553,7 @@ template <class Pixel>
static inline void copy_swapped(char *dst, const int dstStride, const QImage &img, const QRect &rect)
{
const uchar *srcData = img.constBits();
- const int srcBytesPerLine = img.bytesPerLine();
+ const qsizetype srcBytesPerLine = img.bytesPerLine();
const int left = rect.left();
const int width = rect.width();
diff --git a/src/plugins/platforms/xcb/qxcbcursor.h b/src/plugins/platforms/xcb/qxcbcursor.h
index 0b238823f0..83c2db086a 100644
--- a/src/plugins/platforms/xcb/qxcbcursor.h
+++ b/src/plugins/platforms/xcb/qxcbcursor.h
@@ -65,9 +65,9 @@ inline bool operator==(const QXcbCursorCacheKey &k1, const QXcbCursorCacheKey &k
return k1.shape == k2.shape && k1.bitmapCacheKey == k2.bitmapCacheKey && k1.maskCacheKey == k2.maskCacheKey;
}
-inline uint qHash(const QXcbCursorCacheKey &k, uint seed) noexcept
+inline size_t qHash(const QXcbCursorCacheKey &k, size_t seed) noexcept
{
- return (uint(k.shape) + uint(k.bitmapCacheKey) + uint(k.maskCacheKey)) ^ seed;
+ return (size_t(k.shape) + size_t(k.bitmapCacheKey) + size_t(k.maskCacheKey)) ^ seed;
}
#endif // !QT_NO_CURSOR
diff --git a/src/plugins/platforms/xcb/qxcbeventqueue.cpp b/src/plugins/platforms/xcb/qxcbeventqueue.cpp
index 759ee3cc95..f0cb5edd2a 100644
--- a/src/plugins/platforms/xcb/qxcbeventqueue.cpp
+++ b/src/plugins/platforms/xcb/qxcbeventqueue.cpp
@@ -62,8 +62,8 @@ static bool dispatcherOwnerDestructing = false;
when accessing the tail node. It does not dequeue the last node and does not
access (read or write) the tail node's 'next' member. This lets the reader
add more items at the same time as the main thread is dequeuing nodes from
- the head. A custom linked list implementation is used, because QLinkedList
- does not have any thread-safety guarantees and the custom list is more
+ the head. A custom linked list implementation is used, because std::list
+ does not have any thread-safety guarantees. The custom list is
lightweight - no reference counting, back links, etc.
Memory management:
diff --git a/src/plugins/platforms/xcb/qxcbeventqueue.h b/src/plugins/platforms/xcb/qxcbeventqueue.h
index 11d0b8e963..e7327b3fd6 100644
--- a/src/plugins/platforms/xcb/qxcbeventqueue.h
+++ b/src/plugins/platforms/xcb/qxcbeventqueue.h
@@ -49,6 +49,7 @@
#include <xcb/xcb.h>
#include <atomic>
+#include <limits>
QT_BEGIN_NAMESPACE
@@ -106,7 +107,7 @@ public:
bool peekEventQueue(PeekerCallback peeker, void *peekerData = nullptr,
PeekOptions option = PeekDefault, qint32 peekerId = -1);
- void waitForNewEvents(unsigned long time = ULONG_MAX);
+ void waitForNewEvents(unsigned long time = std::numeric_limits<unsigned long>::max());
private:
QXcbEventNode *qXcbEventNodeFactory(xcb_generic_event_t *event);
diff --git a/src/plugins/platforms/xcb/qxcbimage.cpp b/src/plugins/platforms/xcb/qxcbimage.cpp
index b0e610dd51..5b5c37fac4 100644
--- a/src/plugins/platforms/xcb/qxcbimage.cpp
+++ b/src/plugins/platforms/xcb/qxcbimage.cpp
@@ -212,7 +212,7 @@ xcb_pixmap_t qt_xcb_XPixmapFromBitmap(QXcbScreen *screen, const QImage &image)
}
const int width = bitmap.width();
const int height = bitmap.height();
- const int bytesPerLine = bitmap.bytesPerLine();
+ const qsizetype bytesPerLine = bitmap.bytesPerLine();
int destLineSize = width / 8;
if (width % 8)
++destLineSize;
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index 3fd989e1f9..cea0511822 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -61,6 +61,9 @@
#include <QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h>
#include <QtServiceSupport/private/qgenericunixservices_p.h>
+#if QT_CONFIG(opengl)
+#include <QtPlatformCompositorSupport/qpa/qplatformbackingstoreopenglsupport.h>
+#endif
#include <stdio.h>
@@ -288,16 +291,23 @@ QPlatformOpenGLContext *QXcbIntegration::createPlatformOpenGLContext(QOpenGLCont
QPlatformBackingStore *QXcbIntegration::createPlatformBackingStore(QWindow *window) const
{
- const bool isTrayIconWindow = QXcbWindow::isTrayIconWindow(window);
- if (isTrayIconWindow)
- return new QXcbSystemTrayBackingStore(window);
+ QPlatformBackingStore *backingStore = nullptr;
+ const bool isTrayIconWindow = QXcbWindow::isTrayIconWindow(window);
+ if (isTrayIconWindow) {
+ backingStore = new QXcbSystemTrayBackingStore(window);
#if QT_CONFIG(xcb_native_painting)
- if (nativePaintingEnabled())
- return new QXcbNativeBackingStore(window);
+ } else if (nativePaintingEnabled()) {
+ backingStore = new QXcbNativeBackingStore(window);
#endif
-
- return new QXcbBackingStore(window);
+ } else {
+ backingStore = new QXcbBackingStore(window);
+ }
+ Q_ASSERT(backingStore);
+#ifndef QT_NO_OPENGL
+ backingStore->setOpenGLSupport(new QPlatformBackingStoreOpenGLSupport(backingStore));
+#endif
+ return backingStore;
}
QPlatformOffscreenSurface *QXcbIntegration::createPlatformOffscreenSurface(QOffscreenSurface *surface) const
diff --git a/src/plugins/platforms/xcb/xcb_qpa_lib.pro b/src/plugins/platforms/xcb/xcb_qpa_lib.pro
index a5d05faa9c..1f651e7697 100644
--- a/src/plugins/platforms/xcb/xcb_qpa_lib.pro
+++ b/src/plugins/platforms/xcb/xcb_qpa_lib.pro
@@ -9,6 +9,9 @@ QT += \
edid_support-private \
xkbcommon_support-private
+qtHaveModule(platformcompositor_support-private): \
+ QT += platformcompositor_support-private
+
qtHaveModule(linuxaccessibility_support-private): \
QT += linuxaccessibility_support-private
diff --git a/src/plugins/platformthemes/CMakeLists.txt b/src/plugins/platformthemes/CMakeLists.txt
new file mode 100644
index 0000000000..6aa17c234c
--- /dev/null
+++ b/src/plugins/platformthemes/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Generated from platformthemes.pro.
+
+if(QT_FEATURE_dbus AND QT_FEATURE_mimetype AND QT_FEATURE_regularexpression)
+ add_subdirectory(xdgdesktopportal)
+endif()
+if(QT_FEATURE_gtk3 AND TARGET Qt::Widgets)
+ add_subdirectory(gtk3)
+endif()
diff --git a/src/plugins/platformthemes/gtk3/.prev_CMakeLists.txt b/src/plugins/platformthemes/gtk3/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..0784de2ca8
--- /dev/null
+++ b/src/plugins/platformthemes/gtk3/.prev_CMakeLists.txt
@@ -0,0 +1,27 @@
+# Generated from gtk3.pro.
+
+#####################################################################
+## QGtk3ThemePlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QGtk3ThemePlugin
+ OUTPUT_NAME qgtk3
+ TYPE platformthemes
+ SOURCES
+ main.cpp
+ qgtk3dialoghelpers.cpp qgtk3dialoghelpers.h
+ qgtk3menu.cpp qgtk3menu.h
+ qgtk3theme.cpp qgtk3theme.h
+ DEFINES
+ GDK_VERSION_MIN_REQUIRED=GDK_VERSION_3_6
+ PUBLIC_LIBRARIES
+ PkgConfig::GTK3
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::ThemeSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:gtk3.pro:<TRUE>:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platformthemes/gtk3/CMakeLists.txt b/src/plugins/platformthemes/gtk3/CMakeLists.txt
new file mode 100644
index 0000000000..4e56e4a6b3
--- /dev/null
+++ b/src/plugins/platformthemes/gtk3/CMakeLists.txt
@@ -0,0 +1,32 @@
+# Generated from gtk3.pro.
+
+qt_find_package(GTK3) # special case
+qt_find_package(X11) # special case
+
+#####################################################################
+## QGtk3ThemePlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QGtk3ThemePlugin
+ OUTPUT_NAME qgtk3
+ TYPE platformthemes
+ SOURCES
+ main.cpp
+ qgtk3dialoghelpers.cpp qgtk3dialoghelpers.h
+ qgtk3menu.cpp qgtk3menu.h
+ qgtk3theme.cpp qgtk3theme.h
+ DEFINES
+ GDK_VERSION_MIN_REQUIRED=GDK_VERSION_3_6
+ LIBRARIES # special case
+ X11::X11 # special case
+ PUBLIC_LIBRARIES
+ PkgConfig::GTK3
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::ThemeSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:gtk3.pro:<TRUE>:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/platformthemes/xdgdesktopportal/CMakeLists.txt b/src/plugins/platformthemes/xdgdesktopportal/CMakeLists.txt
new file mode 100644
index 0000000000..a9062f695f
--- /dev/null
+++ b/src/plugins/platformthemes/xdgdesktopportal/CMakeLists.txt
@@ -0,0 +1,24 @@
+# Generated from xdgdesktopportal.pro.
+
+#####################################################################
+## QXdgDesktopPortalThemePlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QXdgDesktopPortalThemePlugin
+ OUTPUT_NAME qxdgdesktopportal
+ TYPE platformthemes
+ SOURCES
+ main.cpp
+ qxdgdesktopportalfiledialog.cpp qxdgdesktopportalfiledialog_p.h
+ qxdgdesktopportaltheme.cpp qxdgdesktopportaltheme.h
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::DBus
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::ThemeSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:xdgdesktopportal.pro:<TRUE>:
+# PLUGIN_EXTENDS = "-"
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index cd4d301194..df738c419f 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -2,7 +2,6 @@ TEMPLATE = subdirs
QT_FOR_CONFIG += network
qtHaveModule(sql): SUBDIRS += sqldrivers
-qtHaveModule(network):qtConfig(bearermanagement): SUBDIRS += bearer
qtHaveModule(gui) {
SUBDIRS *= platforms platforminputcontexts platformthemes
qtConfig(imageformatplugin): SUBDIRS *= imageformats
diff --git a/src/plugins/printsupport/.prev_CMakeLists.txt b/src/plugins/printsupport/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..a1f39cb843
--- /dev/null
+++ b/src/plugins/printsupport/.prev_CMakeLists.txt
@@ -0,0 +1,11 @@
+# Generated from printsupport.pro.
+
+if(MACOS)
+ add_subdirectory(cocoa)
+endif()
+if(WIN32)
+ add_subdirectory(windows)
+endif()
+if(QT_FEATURE_cups AND UNIX AND NOT APPLE)
+ add_subdirectory(cups)
+endif()
diff --git a/src/plugins/printsupport/CMakeLists.txt b/src/plugins/printsupport/CMakeLists.txt
new file mode 100644
index 0000000000..1e7013bc1c
--- /dev/null
+++ b/src/plugins/printsupport/CMakeLists.txt
@@ -0,0 +1,11 @@
+# Generated from printsupport.pro.
+
+if(MACOS)
+ add_subdirectory(cocoa)
+endif()
+if(WIN32)
+ # add_subdirectory(windows) # special case TODO
+endif()
+if(QT_FEATURE_cups AND UNIX AND NOT APPLE)
+ add_subdirectory(cups)
+endif()
diff --git a/src/plugins/printsupport/cocoa/CMakeLists.txt b/src/plugins/printsupport/cocoa/CMakeLists.txt
new file mode 100644
index 0000000000..72660dc173
--- /dev/null
+++ b/src/plugins/printsupport/cocoa/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Generated from cocoa.pro.
+
+#####################################################################
+## QCocoaPrinterSupportPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QCocoaPrinterSupportPlugin
+ OUTPUT_NAME cocoaprintersupport
+ TYPE printsupport
+ SOURCES
+ main.cpp
+ PUBLIC_LIBRARIES
+ ${FWAppKit}
+ Qt::Core
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::PrintSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:cocoa.pro:<TRUE>:
+# MODULE = "cocoaprintersupport"
+# OTHER_FILES = "cocoa.json"
diff --git a/src/plugins/printsupport/cups/.prev_CMakeLists.txt b/src/plugins/printsupport/cups/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..c65ffb89c7
--- /dev/null
+++ b/src/plugins/printsupport/cups/.prev_CMakeLists.txt
@@ -0,0 +1,30 @@
+# Generated from cups.pro.
+
+#####################################################################
+## QCupsPrinterSupportPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QCupsPrinterSupportPlugin
+ OUTPUT_NAME cupsprintersupport
+ TYPE printsupport
+ SOURCES
+ main.cpp
+ qcupsprintengine.cpp qcupsprintengine_p.h
+ qcupsprintersupport.cpp qcupsprintersupport_p.h
+ qppdprintdevice.cpp qppdprintdevice.h
+ INCLUDE_DIRECTORIES
+ ../../../printsupport/kernel
+ LIBRARIES
+ Cups::Cups
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::PrintSupport
+ Qt::PrintSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:cups.pro:<TRUE>:
+# MODULE = "cupsprintersupport"
+# OTHER_FILES = "cups.json"
diff --git a/src/plugins/printsupport/cups/CMakeLists.txt b/src/plugins/printsupport/cups/CMakeLists.txt
new file mode 100644
index 0000000000..5c920443ea
--- /dev/null
+++ b/src/plugins/printsupport/cups/CMakeLists.txt
@@ -0,0 +1,32 @@
+# Generated from cups.pro.
+
+qt_find_package(Cups PROVIDED_TARGETS Cups::Cups) # special case
+
+#####################################################################
+## QCupsPrinterSupportPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QCupsPrinterSupportPlugin
+ OUTPUT_NAME cupsprintersupport
+ TYPE printsupport
+ SOURCES
+ main.cpp
+ qcupsprintengine.cpp qcupsprintengine_p.h
+ qcupsprintersupport.cpp qcupsprintersupport_p.h
+ qppdprintdevice.cpp qppdprintdevice.h
+ INCLUDE_DIRECTORIES
+ ../../../printsupport/kernel
+ LIBRARIES
+ Cups::Cups
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::PrintSupport
+ Qt::PrintSupportPrivate
+)
+
+#### Keys ignored in scope 1:.:.:cups.pro:<TRUE>:
+# MODULE = "cupsprintersupport"
+# OTHER_FILES = "cups.json"
diff --git a/src/plugins/sqldrivers/.prev_CMakeLists.txt b/src/plugins/sqldrivers/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..8752cf701f
--- /dev/null
+++ b/src/plugins/sqldrivers/.prev_CMakeLists.txt
@@ -0,0 +1,15 @@
+# Generated from sqldrivers.pro.
+
+cmake_minimum_required(VERSION 3.15.0)
+
+project(ldrivers_FIXME
+ VERSION 6.0.0
+ DESCRIPTION "Qt ldrivers_FIXME Libraries"
+ HOMEPAGE_URL "https://qt.io/"
+ LANGUAGES CXX C
+)
+
+find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core SET_ME_TO_SOMETHING_USEFUL)
+find_package(Qt6 ${PROJECT_VERSION} CONFIG OPTIONAL_COMPONENTS SET_ME_TO_SOMETHING_USEFUL)
+
+qt_build_repo()
diff --git a/src/plugins/sqldrivers/CMakeLists.txt b/src/plugins/sqldrivers/CMakeLists.txt
new file mode 100644
index 0000000000..d45f5712a8
--- /dev/null
+++ b/src/plugins/sqldrivers/CMakeLists.txt
@@ -0,0 +1,55 @@
+# Generated from sqldrivers.pro.
+
+# special case begin
+# Currently handled completely manually.
+
+# TODO sqldrivers_standalone {
+# _QMAKE_CACHE_ = $$shadowed($$SQLDRV_SRC_TREE)/.qmake.conf
+# load(qt_configure)
+# }
+
+qt_feature_module_begin(
+ NO_MODULE
+ PUBLIC_FILE "qtsqldrivers-config.h"
+ PRIVATE_FILE "qtsqldrivers-config_p.h"
+)
+include(configure.cmake)
+qt_feature_module_end(NO_MODULE)
+
+
+if(QT_FEATURE_sql_psql)
+ add_subdirectory(psql)
+endif()
+
+if(QT_FEATURE_sql_mysql)
+ add_subdirectory(mysql)
+endif()
+
+if(QT_FEATURE_sql_odbc)
+ add_subdirectory(odbc)
+endif()
+
+if(QT_FEATURE_sql_tds)
+# TODO add_subdirectory(tds)
+endif()
+
+if(QT_FEATURE_sql_oci)
+ add_subdirectory(oci)
+endif()
+
+if(QT_FEATURE_sql_db2)
+ add_subdirectory(db2)
+endif()
+
+if(QT_FEATURE_sql_sqlite)
+ add_subdirectory(sqlite)
+endif()
+
+if(QT_FEATURE_sql_sqlite2)
+# TODO add_subdirectory(sqlite2)
+endif()
+
+if(QT_FEATURE_sql_ibase)
+# TODO add_subdirectory(ibase)
+endif()
+# special case end
diff --git a/src/plugins/sqldrivers/README b/src/plugins/sqldrivers/README
index 26418c5e36..7da95fe53c 100644
--- a/src/plugins/sqldrivers/README
+++ b/src/plugins/sqldrivers/README
@@ -1,4 +1,4 @@
-Please note that the DB2, MySQL, Oracle and TDS client drivers are not
+Please note that the DB2, MySQL and Oracle client drivers are not
distributed with the Qt Open Source Editions.
This is because the client libraries are distributed under a license which
diff --git a/src/plugins/sqldrivers/configure.cmake b/src/plugins/sqldrivers/configure.cmake
new file mode 100644
index 0000000000..3733afc859
--- /dev/null
+++ b/src/plugins/sqldrivers/configure.cmake
@@ -0,0 +1,74 @@
+
+
+#### Inputs
+
+# input sqlite
+set(INPUT_sqlite "undefined" CACHE STRING "")
+set_property(CACHE INPUT_sqlite PROPERTY STRINGS undefined qt system)
+
+
+
+#### Libraries
+
+qt_find_package(DB2 PROVIDED_TARGETS DB2::DB2)
+qt_find_package(MySQL PROVIDED_TARGETS MySQL::MySQL)
+qt_find_package(PostgreSQL PROVIDED_TARGETS PostgreSQL::PostgreSQL)
+qt_find_package(Oracle PROVIDED_TARGETS Oracle::OCI)
+qt_find_package(ODBC PROVIDED_TARGETS ODBC::ODBC)
+qt_find_package(SQLite3 PROVIDED_TARGETS SQLite::SQLite3)
+
+
+#### Tests
+
+
+
+#### Features
+
+qt_feature("sql-db2" PRIVATE
+ LABEL "DB2 (IBM)"
+ CONDITION DB2_FOUND
+)
+qt_feature("sql-ibase" PRIVATE
+ LABEL "InterBase"
+ CONDITION libs.ibase OR FIXME
+)
+qt_feature("sql-mysql" PRIVATE
+ LABEL "MySql"
+ CONDITION MySQL_FOUND
+)
+qt_feature("sql-oci" PRIVATE
+ LABEL "OCI (Oracle)"
+ CONDITION Oracle_FOUND
+)
+qt_feature("sql-odbc" PRIVATE
+ LABEL "ODBC"
+ CONDITION QT_FEATURE_datestring AND ODBC_FOUND
+)
+qt_feature("sql-psql" PRIVATE
+ LABEL "PostgreSQL"
+ CONDITION PostgreSQL_FOUND
+)
+qt_feature("sql-sqlite" PRIVATE
+ LABEL "SQLite"
+ CONDITION QT_FEATURE_datestring
+)
+qt_feature("system-sqlite" PRIVATE
+ LABEL " Using system provided SQLite"
+ AUTODETECT OFF
+ CONDITION QT_FEATURE_sql_sqlite AND SQLite3_FOUND
+)
+qt_configure_add_summary_section(NAME "Qt Sql Drivers")
+qt_configure_add_summary_entry(ARGS "sql-db2")
+qt_configure_add_summary_entry(ARGS "sql-ibase")
+qt_configure_add_summary_entry(ARGS "sql-mysql")
+qt_configure_add_summary_entry(ARGS "sql-oci")
+qt_configure_add_summary_entry(ARGS "sql-odbc")
+qt_configure_add_summary_entry(ARGS "sql-psql")
+qt_configure_add_summary_entry(ARGS "sql-sqlite")
+qt_configure_add_summary_entry(ARGS "system-sqlite")
+qt_configure_end_summary_section() # end of "Qt Sql Drivers" section
+qt_configure_add_report_entry(
+ TYPE WARNING
+ MESSAGE "Qt does not support compiling the Oracle database driver with MinGW, due to lack of such support from Oracle. Consider disabling the Oracle driver, as the current build will most likely fail."
+ CONDITION WIN32 AND NOT MSVC AND QT_FEATURE_sql_oci
+)
diff --git a/src/plugins/sqldrivers/configure.json b/src/plugins/sqldrivers/configure.json
index 28ccbeadcd..f738e58a00 100644
--- a/src/plugins/sqldrivers/configure.json
+++ b/src/plugins/sqldrivers/configure.json
@@ -7,9 +7,7 @@
"commandline": {
"assignments": {
- "MYSQL_PATH": "mysql.prefix",
- "SYBASE": "tds.prefix",
- "SYBASE_LIBS": "tds.libs"
+ "MYSQL_PATH": "mysql.prefix"
},
"options": {
"mysql_config": "string",
@@ -22,17 +20,13 @@
"sql-odbc": "boolean",
"sql-psql": "boolean",
"sql-sqlite": "boolean",
- "sql-sqlite2": "boolean",
- "sql-tds": "boolean",
"plugin-sql-db2": { "type": "void", "name": "sql-db2" },
"plugin-sql-ibase": { "type": "void", "name": "sql-ibase" },
"plugin-sql-mysql": { "type": "void", "name": "sql-mysql" },
"plugin-sql-oci": { "type": "void", "name": "sql-oci" },
"plugin-sql-odbc": { "type": "void", "name": "sql-odbc" },
"plugin-sql-psql": { "type": "void", "name": "sql-psql" },
- "plugin-sql-sqlite": { "type": "void", "name": "sql-sqlite" },
- "plugin-sql-sqlite2": { "type": "void", "name": "sql-sqlite2" },
- "plugin-sql-tds": { "type": "void", "name": "sql-tds" }
+ "plugin-sql-sqlite": { "type": "void", "name": "sql-sqlite" }
}
},
@@ -94,15 +88,6 @@
{ "type": "psqlEnv", "libs": "-lpq", "condition": "!config.win32" }
]
},
- "tds": {
- "label": "TDS (Sybase)",
- "test": {},
- "headers": [ "sybfront.h", "sybdb.h" ],
- "sources": [
- { "type": "sybaseEnv", "libs": "-lNTWDBLIB", "condition": "config.win32" },
- { "type": "sybaseEnv", "libs": "-lsybdb", "condition": "!config.win32" }
- ]
- },
"oci": {
"label": "OCI (Oracle)",
"test": {},
@@ -132,14 +117,6 @@
{ "libs": "-lodbc", "condition": "!config.win32 && !config.darwin" }
]
},
- "sqlite2": {
- "label": "SQLite (version 2)",
- "test": {},
- "headers": "sqlite.h",
- "sources": [
- "-lsqlite"
- ]
- },
"sqlite3": {
"label": "SQLite (version 3)",
"export": "sqlite",
@@ -191,11 +168,6 @@
"condition": "libs.psql",
"output": [ "privateFeature" ]
},
- "sql-sqlite2": {
- "label": "SQLite2",
- "condition": "libs.sqlite2",
- "output": [ "privateFeature" ]
- },
"sql-sqlite": {
"label": "SQLite",
"condition": "features.datestring",
@@ -206,11 +178,6 @@
"autoDetect": false,
"condition": "features.sql-sqlite && libs.sqlite3",
"output": [ "privateFeature" ]
- },
- "sql-tds": {
- "label": "TDS (Sybase)",
- "condition": "features.datestring && libs.tds",
- "output": [ "privateFeature" ]
}
},
@@ -218,9 +185,7 @@
{
"type": "warning",
"condition": "config.win32 && !config.msvc && features.sql-oci",
- "message": "Qt does not support compiling the Oracle database driver with
-MinGW, due to lack of such support from Oracle. Consider disabling the
-Oracle driver, as the current build will most likely fail."
+ "message": "Qt does not support compiling the Oracle database driver with MinGW, due to lack of such support from Oracle. Consider disabling the Oracle driver, as the current build will most likely fail."
}
],
@@ -229,7 +194,7 @@ Oracle driver, as the current build will most likely fail."
"section": "Qt Sql Drivers",
"entries": [
"sql-db2", "sql-ibase", "sql-mysql", "sql-oci", "sql-odbc", "sql-psql",
- "sql-sqlite2", "sql-sqlite", "system-sqlite", "sql-tds"
+ "sql-sqlite", "system-sqlite"
]
}
]
diff --git a/src/plugins/sqldrivers/db2/CMakeLists.txt b/src/plugins/sqldrivers/db2/CMakeLists.txt
new file mode 100644
index 0000000000..637461e168
--- /dev/null
+++ b/src/plugins/sqldrivers/db2/CMakeLists.txt
@@ -0,0 +1,32 @@
+# Generated from db2.pro.
+
+#####################################################################
+## QDB2DriverPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QDB2DriverPlugin
+ OUTPUT_NAME qsqldb2
+ TYPE sqldrivers
+ SOURCES
+ main.cpp
+ qsql_db2.cpp qsql_db2_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ PUBLIC_LIBRARIES
+ DB2::DB2
+ Qt::Core
+ Qt::CorePrivate
+ Qt::SqlPrivate
+)
+
+#### Keys ignored in scope 1:.:.:db2.pro:<TRUE>:
+# OTHER_FILES = "db2.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QDB2DriverPlugin CONDITION (TEST_architecture_arch STREQUAL "x86_64")
+ DEFINES
+ ODBC64
+)
diff --git a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp
index 0fa21f504c..fb364c21f5 100644
--- a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp
+++ b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp
@@ -1913,15 +1913,8 @@ void QIBaseDriver::qHandleEventNotification(void *updatedResultBuffer)
isc_event_counts(counts, eBuffer->bufferLength, eBuffer->eventBuffer, eBuffer->resultBuffer);
if (counts[0]) {
- if (eBuffer->subscriptionState == QIBaseEventBuffer::Subscribed) {
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- emit notification(i.key());
-QT_WARNING_POP
-#endif
+ if (eBuffer->subscriptionState == QIBaseEventBuffer::Subscribed)
emit notification(i.key(), QSqlDriver::UnknownSource, QVariant());
- }
else if (eBuffer->subscriptionState == QIBaseEventBuffer::Starting)
eBuffer->subscriptionState = QIBaseEventBuffer::Subscribed;
diff --git a/src/plugins/sqldrivers/mysql/CMakeLists.txt b/src/plugins/sqldrivers/mysql/CMakeLists.txt
new file mode 100644
index 0000000000..c99f322dfb
--- /dev/null
+++ b/src/plugins/sqldrivers/mysql/CMakeLists.txt
@@ -0,0 +1,24 @@
+# Generated from mysql.pro.
+
+#####################################################################
+## QMYSQLDriverPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QMYSQLDriverPlugin
+ OUTPUT_NAME qsqlmysql
+ TYPE sqldrivers
+ SOURCES
+ main.cpp
+ qsql_mysql.cpp qsql_mysql_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ PUBLIC_LIBRARIES
+ MySQL::MySQL
+ Qt::Core
+ Qt::CorePrivate
+ Qt::SqlPrivate
+)
+
+#### Keys ignored in scope 1:.:.:mysql.pro:<TRUE>:
+# OTHER_FILES = "mysql.json"
diff --git a/src/plugins/sqldrivers/mysql/main.cpp b/src/plugins/sqldrivers/mysql/main.cpp
index 4c6753097f..f7d56dd1c9 100644
--- a/src/plugins/sqldrivers/mysql/main.cpp
+++ b/src/plugins/sqldrivers/mysql/main.cpp
@@ -62,7 +62,6 @@ QMYSQLDriverPlugin::QMYSQLDriverPlugin()
QSqlDriver* QMYSQLDriverPlugin::create(const QString &name)
{
if (name == QLatin1String("QMYSQL") ||
- name == QLatin1String("QMYSQL3") ||
name == QLatin1String("QMARIADB")) {
QMYSQLDriver* driver = new QMYSQLDriver();
return driver;
diff --git a/src/plugins/sqldrivers/mysql/mysql.json b/src/plugins/sqldrivers/mysql/mysql.json
index 89f5e65fb9..8fd3d727b1 100644
--- a/src/plugins/sqldrivers/mysql/mysql.json
+++ b/src/plugins/sqldrivers/mysql/mysql.json
@@ -1,3 +1,3 @@
{
- "Keys": [ "QMYSQL3", "QMYSQL", "QMARIADB" ]
+ "Keys": [ "QMYSQL", "QMARIADB" ]
}
diff --git a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
index a641935dc5..78e94ba070 100644
--- a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
+++ b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
@@ -323,7 +323,7 @@ static QSqlError qMakeStmtError(const QString& err, QSqlError::ErrorType type,
MYSQL_STMT* stmt)
{
const char *cerr = mysql_stmt_error(stmt);
- return QSqlError(QLatin1String("QMYSQL3: ") + err,
+ return QSqlError(QLatin1String("QMYSQL: ") + err,
QString::fromLatin1(cerr),
type, QString::number(mysql_stmt_errno(stmt)));
}
diff --git a/src/plugins/sqldrivers/oci/CMakeLists.txt b/src/plugins/sqldrivers/oci/CMakeLists.txt
new file mode 100644
index 0000000000..713c9fc871
--- /dev/null
+++ b/src/plugins/sqldrivers/oci/CMakeLists.txt
@@ -0,0 +1,32 @@
+# Generated from oci.pro.
+
+#####################################################################
+## QOCIDriverPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QOCIDriverPlugin
+ OUTPUT_NAME qsqloci
+ TYPE sqldrivers
+ SOURCES
+ main.cpp
+ qsql_oci.cpp qsql_oci_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ PUBLIC_LIBRARIES
+ Oracle::OCI
+ Qt::Core
+ Qt::CorePrivate
+ Qt::SqlPrivate
+)
+
+#### Keys ignored in scope 1:.:.:oci.pro:<TRUE>:
+# OTHER_FILES = "oci.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QOCIDriverPlugin CONDITION APPLE
+ LINK_OPTIONS
+ "-Wl,-flat_namespace,-U,_environ"
+)
diff --git a/src/plugins/sqldrivers/oci/main.cpp b/src/plugins/sqldrivers/oci/main.cpp
index e576928d31..db273bfb04 100644
--- a/src/plugins/sqldrivers/oci/main.cpp
+++ b/src/plugins/sqldrivers/oci/main.cpp
@@ -61,7 +61,7 @@ QOCIDriverPlugin::QOCIDriverPlugin()
QSqlDriver* QOCIDriverPlugin::create(const QString &name)
{
- if (name == QLatin1String("QOCI") || name == QLatin1String("QOCI8")) {
+ if (name == QLatin1String("QOCI")) {
QOCIDriver* driver = new QOCIDriver();
return driver;
}
diff --git a/src/plugins/sqldrivers/oci/oci.json b/src/plugins/sqldrivers/oci/oci.json
index cbed8fc1ac..c2bb8c81f6 100644
--- a/src/plugins/sqldrivers/oci/oci.json
+++ b/src/plugins/sqldrivers/oci/oci.json
@@ -1,3 +1,3 @@
{
- "Keys": [ "QOCI8", "QOCI" ]
+ "Keys": [ "QOCI" ]
}
diff --git a/src/plugins/sqldrivers/oci/qsql_oci.cpp b/src/plugins/sqldrivers/oci/qsql_oci.cpp
index 8da9837a59..66ee890734 100644
--- a/src/plugins/sqldrivers/oci/qsql_oci.cpp
+++ b/src/plugins/sqldrivers/oci/qsql_oci.cpp
@@ -43,7 +43,9 @@
#include <qvariant.h>
#include <qdatetime.h>
#include <qmetatype.h>
-#include <qregexp.h>
+#if QT_CONFIG(regularexpression)
+#include <qregularexpression.h>
+#endif
#include <qshareddata.h>
#include <qsqlerror.h>
#include <qsqlfield.h>
@@ -2335,9 +2337,11 @@ bool QOCIDriver::open(const QString & db,
} else {
QString versionStr;
versionStr = QString(reinterpret_cast<const QChar *>(vertxt));
- QRegExp vers(QLatin1String("([0-9]+)\\.[0-9\\.]+[0-9]"));
- if (vers.indexIn(versionStr) >= 0)
- d->serverVersion = vers.cap(1).toInt();
+#if QT_CONFIG(regularexpression)
+ auto match = QRegularExpression(QLatin1String("([0-9]+)\\.[0-9\\.]+[0-9]")).match(versionStr);
+ if (match.hasMatch())
+ d->serverVersion = vers.captured(1).toInt();
+#endif
if (d->serverVersion == 0)
d->serverVersion = -1;
}
diff --git a/src/plugins/sqldrivers/odbc/.prev_CMakeLists.txt b/src/plugins/sqldrivers/odbc/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..692d1fc294
--- /dev/null
+++ b/src/plugins/sqldrivers/odbc/.prev_CMakeLists.txt
@@ -0,0 +1,32 @@
+# Generated from odbc.pro.
+
+#####################################################################
+## QODBCDriverPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QODBCDriverPlugin
+ OUTPUT_NAME qsqlodbc
+ TYPE sqldrivers
+ SOURCES
+ main.cpp
+ qsql_odbc.cpp qsql_odbc_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ PUBLIC_LIBRARIES
+ ODBC::ODBC
+ Qt::Core
+ Qt::CorePrivate
+ Qt::SqlPrivate
+)
+
+#### Keys ignored in scope 1:.:.:odbc.pro:<TRUE>:
+# OTHER_FILES = "odbc.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QODBCDriverPlugin CONDITION UNIX
+ DEFINES
+ UNICODE
+)
diff --git a/src/plugins/sqldrivers/odbc/CMakeLists.txt b/src/plugins/sqldrivers/odbc/CMakeLists.txt
new file mode 100644
index 0000000000..5c163181c5
--- /dev/null
+++ b/src/plugins/sqldrivers/odbc/CMakeLists.txt
@@ -0,0 +1,33 @@
+# Generated from odbc.pro.
+
+#####################################################################
+## QODBCDriverPlugin Plugin:
+#####################################################################
+
+qt_find_package(ODBC) # special case
+qt_add_plugin(QODBCDriverPlugin
+ OUTPUT_NAME qsqlodbc
+ TYPE sqldrivers
+ SOURCES
+ main.cpp
+ qsql_odbc.cpp qsql_odbc_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ PUBLIC_LIBRARIES
+ ODBC::ODBC
+ Qt::Core
+ Qt::CorePrivate
+ Qt::SqlPrivate
+)
+
+#### Keys ignored in scope 1:.:.:odbc.pro:<TRUE>:
+# OTHER_FILES = "odbc.json"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QODBCDriverPlugin CONDITION UNIX
+ DEFINES
+ UNICODE
+)
diff --git a/src/plugins/sqldrivers/odbc/main.cpp b/src/plugins/sqldrivers/odbc/main.cpp
index ac63941a82..e712514a88 100644
--- a/src/plugins/sqldrivers/odbc/main.cpp
+++ b/src/plugins/sqldrivers/odbc/main.cpp
@@ -61,7 +61,7 @@ QODBCDriverPlugin::QODBCDriverPlugin()
QSqlDriver* QODBCDriverPlugin::create(const QString &name)
{
- if (name == QLatin1String("QODBC") || name == QLatin1String("QODBC3")) {
+ if (name == QLatin1String("QODBC")) {
QODBCDriver* driver = new QODBCDriver();
return driver;
}
diff --git a/src/plugins/sqldrivers/odbc/odbc.json b/src/plugins/sqldrivers/odbc/odbc.json
index 41640776fb..c3f6117f42 100644
--- a/src/plugins/sqldrivers/odbc/odbc.json
+++ b/src/plugins/sqldrivers/odbc/odbc.json
@@ -1,3 +1,3 @@
{
- "Keys": [ "QODBC3", "QODBC" ]
+ "Keys": [ "QODBC" ]
}
diff --git a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
index 88f1c74028..8df61ddaa5 100644
--- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
+++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
@@ -68,7 +68,7 @@ static const SQLSMALLINT TABLENAMESIZE = 128;
//Map Qt parameter types to ODBC types
static const SQLSMALLINT qParamType[4] = { SQL_PARAM_INPUT, SQL_PARAM_INPUT, SQL_PARAM_OUTPUT, SQL_PARAM_INPUT_OUTPUT };
-inline static QString fromSQLTCHAR(const QVarLengthArray<SQLTCHAR>& input, int size=-1)
+inline static QString fromSQLTCHAR(const QVarLengthArray<SQLTCHAR>& input, qsizetype size=-1)
{
QString result;
@@ -328,7 +328,7 @@ static QSqlError qMakeError(const QString& err, QSqlError::ErrorType type, const
{
int nativeCode = -1;
QString message = qODBCWarn(p, &nativeCode);
- return QSqlError(QLatin1String("QODBC3: ") + err, message, type,
+ return QSqlError(QLatin1String("QODBC: ") + err, message, type,
nativeCode != -1 ? QString::number(nativeCode) : QString());
}
@@ -337,7 +337,7 @@ static QSqlError qMakeError(const QString& err, QSqlError::ErrorType type,
{
int nativeCode = -1;
QString message = qODBCWarn(p, &nativeCode);
- return QSqlError(QLatin1String("QODBC3: ") + err, message, type,
+ return QSqlError(QLatin1String("QODBC: ") + err, message, type,
nativeCode != -1 ? QString::number(nativeCode) : QString());
}
@@ -491,7 +491,7 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni
// more data can be fetched, the length indicator does NOT
// contain the number of bytes returned - it contains the
// total number of bytes that CAN be fetched
- int rSize = (r == SQL_SUCCESS_WITH_INFO) ? colSize : lengthIndicator;
+ qsizetype rSize = (r == SQL_SUCCESS_WITH_INFO) ? colSize : lengthIndicator;
// Remove any trailing \0 as some drivers misguidedly append one
int realsize = qMin(rSize, buf.size());
if (realsize > 0 && buf[realsize - 1] == 0)
@@ -1586,7 +1586,7 @@ bool QODBCResult::exec()
if (bindValueType(i) & QSql::Out) {
const QVarLengthArray<SQLTCHAR> a(toSQLTCHAR(str));
- ba = QByteArray((const char *)a.constData(), a.size() * sizeof(SQLTCHAR));
+ ba = QByteArray((const char *)a.constData(), int(a.size() * sizeof(SQLTCHAR)));
r = SQLBindParameter(d->hStmt,
i + 1,
qParamType[bindValueType(i) & QSql::InOut],
@@ -2643,3 +2643,5 @@ bool QODBCDriver::isIdentifierEscaped(const QString &identifier, IdentifierType)
}
QT_END_NAMESPACE
+
+#include "moc_qsql_odbc_p.cpp"
diff --git a/src/plugins/sqldrivers/psql/.prev_CMakeLists.txt b/src/plugins/sqldrivers/psql/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..f3cec6d302
--- /dev/null
+++ b/src/plugins/sqldrivers/psql/.prev_CMakeLists.txt
@@ -0,0 +1,24 @@
+# Generated from psql.pro.
+
+#####################################################################
+## QPSQLDriverPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QPSQLDriverPlugin
+ OUTPUT_NAME qsqlpsql
+ TYPE sqldrivers
+ SOURCES
+ main.cpp
+ qsql_psql.cpp qsql_psql_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ PUBLIC_LIBRARIES
+ PostgreSQL::PostgreSQL
+ Qt::Core
+ Qt::CorePrivate
+ Qt::SqlPrivate
+)
+
+#### Keys ignored in scope 1:.:.:psql.pro:<TRUE>:
+# OTHER_FILES = "psql.json"
diff --git a/src/plugins/sqldrivers/psql/CMakeLists.txt b/src/plugins/sqldrivers/psql/CMakeLists.txt
new file mode 100644
index 0000000000..03a2dc69c3
--- /dev/null
+++ b/src/plugins/sqldrivers/psql/CMakeLists.txt
@@ -0,0 +1,29 @@
+# Generated from psql.pro.
+
+# FIXME cmake FindPostgreSQL is more exhaustive than the check we have for libpq-fe.h
+# it also checks for catalog/pg_type.h which is a more internal include, we should
+# add a way to tell cmake FindPostgreSQL to optionally only look for the libpq-fe.h one
+qt_find_package(PostgreSQL) # special case
+
+#####################################################################
+## QPSQLDriverPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QPSQLDriverPlugin
+ OUTPUT_NAME qsqlpsql
+ TYPE sqldrivers
+ SOURCES
+ main.cpp
+ qsql_psql.cpp qsql_psql_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ PUBLIC_LIBRARIES
+ PostgreSQL::PostgreSQL
+ Qt::Core
+ Qt::CorePrivate
+ Qt::SqlPrivate
+)
+
+#### Keys ignored in scope 1:.:.:psql.pro:<TRUE>:
+# OTHER_FILES = "psql.json"
diff --git a/src/plugins/sqldrivers/psql/main.cpp b/src/plugins/sqldrivers/psql/main.cpp
index a0862a238a..c31e6f64b7 100644
--- a/src/plugins/sqldrivers/psql/main.cpp
+++ b/src/plugins/sqldrivers/psql/main.cpp
@@ -61,7 +61,7 @@ QPSQLDriverPlugin::QPSQLDriverPlugin()
QSqlDriver* QPSQLDriverPlugin::create(const QString &name)
{
- if (name == QLatin1String("QPSQL") || name == QLatin1String("QPSQL7"))
+ if (name == QLatin1String("QPSQL"))
return new QPSQLDriver;
return nullptr;
}
diff --git a/src/plugins/sqldrivers/psql/psql.json b/src/plugins/sqldrivers/psql/psql.json
index 1579b99160..07092a33e7 100644
--- a/src/plugins/sqldrivers/psql/psql.json
+++ b/src/plugins/sqldrivers/psql/psql.json
@@ -1,3 +1,3 @@
{
- "Keys": [ "QPSQL7", "QPSQL" ]
+ "Keys": [ "QPSQL" ]
}
diff --git a/src/plugins/sqldrivers/psql/qsql_psql.cpp b/src/plugins/sqldrivers/psql/qsql_psql.cpp
index c5895f281d..6a1df3a94a 100644
--- a/src/plugins/sqldrivers/psql/qsql_psql.cpp
+++ b/src/plugins/sqldrivers/psql/qsql_psql.cpp
@@ -1668,12 +1668,6 @@ void QPSQLDriver::_q_handleNotification()
if (notify->extra)
payload = d->isUtf8 ? QString::fromUtf8(notify->extra) : QString::fromLatin1(notify->extra);
#endif
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- emit notification(name);
-QT_WARNING_POP
-#endif
QSqlDriver::NotificationSource source = (notify->be_pid == PQbackendPID(d->connection)) ? QSqlDriver::SelfSource : QSqlDriver::OtherSource;
emit notification(name, source, payload);
}
diff --git a/src/plugins/sqldrivers/sqldrivers.pro b/src/plugins/sqldrivers/sqldrivers.pro
index 8a9ae46f82..f1db8f65a2 100644
--- a/src/plugins/sqldrivers/sqldrivers.pro
+++ b/src/plugins/sqldrivers/sqldrivers.pro
@@ -8,9 +8,7 @@ sqldrivers_standalone {
qtConfig(sql-psql) : SUBDIRS += psql
qtConfig(sql-mysql) : SUBDIRS += mysql
qtConfig(sql-odbc) : SUBDIRS += odbc
-qtConfig(sql-tds) : SUBDIRS += tds
qtConfig(sql-oci) : SUBDIRS += oci
qtConfig(sql-db2) : SUBDIRS += db2
qtConfig(sql-sqlite) : SUBDIRS += sqlite
-qtConfig(sql-sqlite2) : SUBDIRS += sqlite2
qtConfig(sql-ibase) : SUBDIRS += ibase
diff --git a/src/plugins/sqldrivers/sqlite/.prev_CMakeLists.txt b/src/plugins/sqldrivers/sqlite/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..3f3c1fabbf
--- /dev/null
+++ b/src/plugins/sqldrivers/sqlite/.prev_CMakeLists.txt
@@ -0,0 +1,93 @@
+# Generated from sqlite.pro.
+
+#####################################################################
+## QSQLiteDriverPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QSQLiteDriverPlugin
+ OUTPUT_NAME qsqlite
+ TYPE sqldrivers
+ SOURCES
+ qsql_sqlite.cpp qsql_sqlite_p.h
+ smain.cpp
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::SqlPrivate
+)
+
+#### Keys ignored in scope 1:.:.:sqlite.pro:<TRUE>:
+# OTHER_FILES = "sqlite.json"
+# QT_FOR_CONFIG = "sqldrivers-private"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION QT_FEATURE_system_sqlite
+ PUBLIC_LIBRARIES
+ SQLite::SQLite3
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION NOT QT_FEATURE_system_sqlite
+ SOURCES
+ ../../../3rdparty/sqlite/sqlite3.c
+ DEFINES
+ SQLITE_ENABLE_COLUMN_METADATA
+ SQLITE_ENABLE_FTS3
+ SQLITE_ENABLE_FTS3_PARENTHESIS
+ SQLITE_ENABLE_FTS5
+ SQLITE_ENABLE_JSON1
+ SQLITE_ENABLE_RTREE
+ SQLITE_OMIT_COMPLETE
+ INCLUDE_DIRECTORIES
+ ../../../3rdparty/sqlite
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION CMAKE_BUILD_TYPE STREQUAL Release AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ NDEBUG
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION NOT QT_FEATURE_largefile AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ SQLITE_DISABLE_LFS
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION QT_FEATURE_posix_fallocate AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ HAVE_POSIX_FALLOCATE=1
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION WINRT AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ SQLITE_OS_WINRT
+)
+
+#### Keys ignored in scope 8:.:../../../3rdparty:../../../3rdparty/sqlite.pri:WINRT:
+# QMAKE_CFLAGS = "-Gy"
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION QNX AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ _QNX_SOURCE
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION UNIX AND NOT QT_FEATURE_system_sqlite AND NOT WINRT AND NOT winphone
+ DEFINES
+ HAVE_USLEEP=1
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION QT_FEATURE_dlopen AND NOT QT_FEATURE_system_sqlite
+ PUBLIC_LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION NOT QT_FEATURE_dlopen AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ SQLITE_OMIT_LOAD_EXTENSION
+)
+
+#### Keys ignored in scope 13:.:../../../3rdparty:../../../3rdparty/sqlite.pri:INTEGRITY:
+# QMAKE_CFLAGS = "-include" "qplatformdefs.h"
diff --git a/src/plugins/sqldrivers/sqlite/CMakeLists.txt b/src/plugins/sqldrivers/sqlite/CMakeLists.txt
new file mode 100644
index 0000000000..e2e711bd78
--- /dev/null
+++ b/src/plugins/sqldrivers/sqlite/CMakeLists.txt
@@ -0,0 +1,103 @@
+# Generated from sqlite.pro.
+
+#####################################################################
+## QSQLiteDriverPlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QSQLiteDriverPlugin
+ OUTPUT_NAME qsqlite
+ TYPE sqldrivers
+ SOURCES
+ qsql_sqlite.cpp qsql_sqlite_p.h
+ smain.cpp
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::CorePrivate
+ Qt::SqlPrivate
+)
+
+#### Keys ignored in scope 1:.:.:sqlite.pro:<TRUE>:
+# OTHER_FILES = "sqlite.json"
+# QT_FOR_CONFIG = "sqldrivers-private"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION QT_FEATURE_system_sqlite
+ PUBLIC_LIBRARIES
+ SQLite::SQLite3
+)
+
+# special case begin
+if (NOT QT_FEATURE_system_sqlite)
+ qt_find_package(Threads REQUIRED PROVIDED_TARGETS Threads::Threads)
+ # On newer compilers compiling sqlite.c produces warnings
+ qt_disable_warnings(QSQLiteDriverPlugin)
+endif()
+# special case end
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION NOT QT_FEATURE_system_sqlite
+ SOURCES
+ ../../../3rdparty/sqlite/sqlite3.c
+ DEFINES
+ SQLITE_ENABLE_COLUMN_METADATA
+ SQLITE_ENABLE_FTS3
+ SQLITE_ENABLE_FTS3_PARENTHESIS
+ SQLITE_ENABLE_FTS5
+ SQLITE_ENABLE_JSON1
+ SQLITE_ENABLE_RTREE
+ SQLITE_OMIT_COMPLETE
+ INCLUDE_DIRECTORIES
+ ../../../3rdparty/sqlite
+ PUBLIC_LIBRARIES # special case
+ Threads::Threads # special case
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION CMAKE_BUILD_TYPE STREQUAL Release AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ NDEBUG
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION NOT QT_FEATURE_largefile AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ SQLITE_DISABLE_LFS
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION QT_FEATURE_posix_fallocate AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ HAVE_POSIX_FALLOCATE=1
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION WINRT AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ SQLITE_OS_WINRT
+)
+
+#### Keys ignored in scope 8:.:../../../3rdparty:../../../3rdparty/sqlite.pri:WINRT:
+# QMAKE_CFLAGS = "-Gy"
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION QNX AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ _QNX_SOURCE
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION UNIX AND NOT QT_FEATURE_system_sqlite AND NOT WINRT AND NOT winphone
+ DEFINES
+ HAVE_USLEEP=1
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION QT_FEATURE_dlopen AND NOT QT_FEATURE_system_sqlite
+ PUBLIC_LIBRARIES
+ ${CMAKE_DL_LIBS}
+)
+
+qt_extend_target(QSQLiteDriverPlugin CONDITION NOT QT_FEATURE_dlopen AND NOT QT_FEATURE_system_sqlite
+ DEFINES
+ SQLITE_OMIT_LOAD_EXTENSION
+)
+
+#### Keys ignored in scope 13:.:../../../3rdparty:../../../3rdparty/sqlite.pri:INTEGRITY:
+# QMAKE_CFLAGS = "-include" "qplatformdefs.h"
diff --git a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp
index 5eb9e7d2f8..27e7d02472 100644
--- a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp
+++ b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp
@@ -1034,15 +1034,8 @@ QStringList QSQLiteDriver::subscribedToNotifications() const
void QSQLiteDriver::handleNotification(const QString &tableName, qint64 rowid)
{
Q_D(const QSQLiteDriver);
- if (d->notificationid.contains(tableName)) {
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- emit notification(tableName);
-QT_WARNING_POP
-#endif
+ if (d->notificationid.contains(tableName))
emit notification(tableName, QSqlDriver::UnknownSource, QVariant(rowid));
- }
}
QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/sqlite2/README b/src/plugins/sqldrivers/sqlite2/README
deleted file mode 100644
index 899361a6f5..0000000000
--- a/src/plugins/sqldrivers/sqlite2/README
+++ /dev/null
@@ -1,6 +0,0 @@
-You will need the SQLite development headers and libraries installed
-before compiling this plugin.
-
-See the Qt SQL documentation for more information on compiling Qt SQL
-driver plugins (sql-driver.html).
-
diff --git a/src/plugins/sqldrivers/sqlite2/qsql_sqlite2.cpp b/src/plugins/sqldrivers/sqlite2/qsql_sqlite2.cpp
deleted file mode 100644
index b7bcd044ab..0000000000
--- a/src/plugins/sqldrivers/sqlite2/qsql_sqlite2.cpp
+++ /dev/null
@@ -1,615 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtSql module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsql_sqlite2_p.h"
-
-#include <qcoreapplication.h>
-#include <qvariant.h>
-#include <qdatetime.h>
-#include <qfile.h>
-#include <qsqlerror.h>
-#include <qsqlfield.h>
-#include <qsqlindex.h>
-#include <qsqlquery.h>
-#include <QtSql/private/qsqlcachedresult_p.h>
-#include <QtSql/private/qsqldriver_p.h>
-#include <qstringlist.h>
-#include <qvector.h>
-
-#if !defined Q_OS_WIN
-# include <unistd.h>
-#endif
-#include <sqlite.h>
-
-typedef struct sqlite_vm sqlite_vm;
-
-Q_DECLARE_OPAQUE_POINTER(sqlite_vm*)
-Q_DECLARE_METATYPE(sqlite_vm*)
-
-Q_DECLARE_OPAQUE_POINTER(sqlite*)
-Q_DECLARE_METATYPE(sqlite*)
-
-QT_BEGIN_NAMESPACE
-
-static QVariant::Type nameToType(const QString& typeName)
-{
- QString tName = typeName.toUpper();
- if (tName.startsWith(QLatin1String("INT")))
- return QVariant::Int;
- if (tName.startsWith(QLatin1String("FLOAT")) || tName.startsWith(QLatin1String("NUMERIC")))
- return QVariant::Double;
- if (tName.startsWith(QLatin1String("BOOL")))
- return QVariant::Bool;
- // SQLite is typeless - consider everything else as string
- return QVariant::String;
-}
-
-class QSQLite2DriverPrivate : public QSqlDriverPrivate
-{
- Q_DECLARE_PUBLIC(QSQLite2Driver)
-
-public:
- QSQLite2DriverPrivate();
- sqlite *access;
- bool utf8;
-};
-
-QSQLite2DriverPrivate::QSQLite2DriverPrivate() : QSqlDriverPrivate(), access(0)
-{
- utf8 = (qstrcmp(sqlite_encoding, "UTF-8") == 0);
- dbmsType = QSqlDriver::SQLite;
-}
-
-class QSQLite2ResultPrivate;
-
-class QSQLite2Result : public QSqlCachedResult
-{
- Q_DECLARE_PRIVATE(QSQLite2Result)
- friend class QSQLite2Driver;
-
-public:
- explicit QSQLite2Result(const QSQLite2Driver* db);
- ~QSQLite2Result();
- QVariant handle() const override;
-
-protected:
- bool gotoNext(QSqlCachedResult::ValueCache &row, int idx) override;
- bool reset(const QString &query) override;
- int size() override;
- int numRowsAffected() override;
- QSqlRecord record() const override;
- void detachFromResultSet() override;
- void virtual_hook(int id, void *data) override;
-};
-
-class QSQLite2ResultPrivate: public QSqlCachedResultPrivate
-{
- Q_DECLARE_PUBLIC(QSQLite2Result)
-
-public:
- Q_DECLARE_SQLDRIVER_PRIVATE(QSQLite2Driver);
- QSQLite2ResultPrivate(QSQLite2Result *q, const QSQLite2Driver *drv);
- void cleanup();
- bool fetchNext(QSqlCachedResult::ValueCache &values, int idx, bool initialFetch);
- bool isSelect();
- // initializes the recordInfo and the cache
- void init(const char **cnames, int numCols);
- void finalize();
-
- // and we have too keep our own struct for the data (sqlite works via
- // callback.
- const char *currentTail;
- sqlite_vm *currentMachine;
-
- bool skippedStatus; // the status of the fetchNext() that's skipped
- bool skipRow; // skip the next fetchNext()?
- QSqlRecord rInf;
- QVector<QVariant> firstRow;
-};
-
-QSQLite2ResultPrivate::QSQLite2ResultPrivate(QSQLite2Result *q, const QSQLite2Driver *drv)
- : QSqlCachedResultPrivate(q, drv),
- currentTail(0),
- currentMachine(0),
- skippedStatus(false),
- skipRow(false)
-{
-}
-
-void QSQLite2ResultPrivate::cleanup()
-{
- Q_Q(QSQLite2Result);
- finalize();
- rInf.clear();
- currentTail = 0;
- currentMachine = 0;
- skippedStatus = false;
- skipRow = false;
- q->setAt(QSql::BeforeFirstRow);
- q->setActive(false);
- q->cleanup();
-}
-
-void QSQLite2ResultPrivate::finalize()
-{
- Q_Q(QSQLite2Result);
- if (!currentMachine)
- return;
-
- char* err = 0;
- int res = sqlite_finalize(currentMachine, &err);
- if (err) {
- q->setLastError(QSqlError(QCoreApplication::translate("QSQLite2Result",
- "Unable to fetch results"), QString::fromLatin1(err),
- QSqlError::StatementError,
- res != -1 ? QString::number(res) : QString()));
- sqlite_freemem(err);
- }
- currentMachine = 0;
-}
-
-// called on first fetch
-void QSQLite2ResultPrivate::init(const char **cnames, int numCols)
-{
- Q_Q(QSQLite2Result);
- if (!cnames)
- return;
-
- rInf.clear();
- if (numCols <= 0)
- return;
- q->init(numCols);
-
- for (int i = 0; i < numCols; ++i) {
- const char* lastDot = strrchr(cnames[i], '.');
- const char* fieldName = lastDot ? lastDot + 1 : cnames[i];
-
- //remove quotations around the field name if any
- QString fieldStr = QString::fromLatin1(fieldName);
- QLatin1Char quote('\"');
- if ( fieldStr.length() > 2 && fieldStr.startsWith(quote) && fieldStr.endsWith(quote)) {
- fieldStr = fieldStr.mid(1);
- fieldStr.chop(1);
- }
- rInf.append(QSqlField(fieldStr,
- nameToType(QString::fromLatin1(cnames[i+numCols]))));
- }
-}
-
-bool QSQLite2ResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int idx, bool initialFetch)
-{
- Q_Q(QSQLite2Result);
- // may be caching.
- const char **fvals;
- const char **cnames;
- int colNum;
- int res;
- int i;
-
- if (skipRow) {
- // already fetched
- Q_ASSERT(!initialFetch);
- skipRow = false;
- for(int i=0;i<firstRow.count(); i++)
- values[i] = firstRow[i];
- return skippedStatus;
- }
- skipRow = initialFetch;
-
- if (!currentMachine)
- return false;
-
- // keep trying while busy, wish I could implement this better.
- while ((res = sqlite_step(currentMachine, &colNum, &fvals, &cnames)) == SQLITE_BUSY) {
- // sleep instead requesting result again immidiately.
-#if defined Q_OS_WIN
- Sleep(1000);
-#else
- sleep(1);
-#endif
- }
-
- if(initialFetch) {
- firstRow.clear();
- firstRow.resize(colNum);
- }
-
- switch(res) {
- case SQLITE_ROW:
- // check to see if should fill out columns
- if (rInf.isEmpty())
- // must be first call.
- init(cnames, colNum);
- if (!fvals)
- return false;
- if (idx < 0 && !initialFetch)
- return true;
- for (i = 0; i < colNum; ++i)
- values[i + idx] = drv_d_func()->utf8 ? QString::fromUtf8(fvals[i]) : QString::fromLatin1(fvals[i]);
- return true;
- case SQLITE_DONE:
- if (rInf.isEmpty())
- // must be first call.
- init(cnames, colNum);
- q->setAt(QSql::AfterLastRow);
- return false;
- case SQLITE_ERROR:
- case SQLITE_MISUSE:
- default:
- // something wrong, don't get col info, but still return false
- finalize(); // finalize to get the error message.
- q->setAt(QSql::AfterLastRow);
- return false;
- }
- return false;
-}
-
-QSQLite2Result::QSQLite2Result(const QSQLite2Driver* db)
- : QSqlCachedResult(*new QSQLite2ResultPrivate(this, db))
-{
-}
-
-QSQLite2Result::~QSQLite2Result()
-{
- Q_D(QSQLite2Result);
- d->cleanup();
-}
-
-void QSQLite2Result::virtual_hook(int id, void *data)
-{
- QSqlCachedResult::virtual_hook(id, data);
-}
-
-/*
- Execute \a query.
-*/
-bool QSQLite2Result::reset (const QString& query)
-{
- Q_D(QSQLite2Result);
- // this is where we build a query.
- if (!driver())
- return false;
- if (!driver()-> isOpen() || driver()->isOpenError())
- return false;
-
- d->cleanup();
-
- // Um, ok. callback based so.... pass private static function for this.
- setSelect(false);
- char *err = 0;
- int res = sqlite_compile(d->drv_d_func()->access,
- d->drv_d_func()->utf8 ? query.toUtf8().constData()
- : query.toLatin1().constData(),
- &(d->currentTail),
- &(d->currentMachine),
- &err);
- if (res != SQLITE_OK || err) {
- setLastError(QSqlError(QCoreApplication::translate("QSQLite2Result",
- "Unable to execute statement"), QString::fromLatin1(err),
- QSqlError::StatementError, res));
- sqlite_freemem(err);
- }
- //if (*d->currentTail != '\000' then there is more sql to eval
- if (!d->currentMachine) {
- setActive(false);
- return false;
- }
- // we have to fetch one row to find out about
- // the structure of the result set
- d->skippedStatus = d->fetchNext(d->firstRow, 0, true);
- if (lastError().isValid()) {
- setSelect(false);
- setActive(false);
- return false;
- }
- setSelect(!d->rInf.isEmpty());
- setActive(true);
- return true;
-}
-
-bool QSQLite2Result::gotoNext(QSqlCachedResult::ValueCache& row, int idx)
-{
- Q_D(QSQLite2Result);
- return d->fetchNext(row, idx, false);
-}
-
-int QSQLite2Result::size()
-{
- return -1;
-}
-
-int QSQLite2Result::numRowsAffected()
-{
- Q_D(QSQLite2Result);
- return sqlite_changes(d->drv_d_func()->access);
-}
-
-QSqlRecord QSQLite2Result::record() const
-{
- Q_D(const QSQLite2Result);
- if (!isActive() || !isSelect())
- return QSqlRecord();
- return d->rInf;
-}
-
-void QSQLite2Result::detachFromResultSet()
-{
- Q_D(QSQLite2Result);
- d->finalize();
-}
-
-QVariant QSQLite2Result::handle() const
-{
- Q_D(const QSQLite2Result);
- return QVariant::fromValue(d->currentMachine);
-}
-
-/////////////////////////////////////////////////////////
-
-QSQLite2Driver::QSQLite2Driver(QObject *parent)
- : QSqlDriver(*new QSQLite2DriverPrivate, parent)
-{
-}
-
-QSQLite2Driver::QSQLite2Driver(sqlite *connection, QObject *parent)
- : QSqlDriver(*new QSQLite2DriverPrivate, parent)
-{
- Q_D(QSQLite2Driver);
- d->access = connection;
- setOpen(true);
- setOpenError(false);
-}
-
-
-QSQLite2Driver::~QSQLite2Driver()
-{
-}
-
-bool QSQLite2Driver::hasFeature(DriverFeature f) const
-{
- Q_D(const QSQLite2Driver);
- switch (f) {
- case Transactions:
- case SimpleLocking:
- return true;
- case Unicode:
- return d->utf8;
- default:
- return false;
- }
-}
-
-/*
- SQLite dbs have no user name, passwords, hosts or ports.
- just file names.
-*/
-bool QSQLite2Driver::open(const QString & db, const QString &, const QString &, const QString &, int, const QString &)
-{
- Q_D(QSQLite2Driver);
- if (isOpen())
- close();
-
- if (db.isEmpty())
- return false;
-
- char* err = 0;
- d->access = sqlite_open(QFile::encodeName(db), 0, &err);
- if (err) {
- setLastError(QSqlError(tr("Error opening database"), QString::fromLatin1(err),
- QSqlError::ConnectionError));
- sqlite_freemem(err);
- err = 0;
- }
-
- if (d->access) {
- setOpen(true);
- setOpenError(false);
- return true;
- }
- setOpenError(true);
- return false;
-}
-
-void QSQLite2Driver::close()
-{
- Q_D(QSQLite2Driver);
- if (isOpen()) {
- sqlite_close(d->access);
- d->access = 0;
- setOpen(false);
- setOpenError(false);
- }
-}
-
-QSqlResult *QSQLite2Driver::createResult() const
-{
- return new QSQLite2Result(this);
-}
-
-bool QSQLite2Driver::beginTransaction()
-{
- Q_D(QSQLite2Driver);
- if (!isOpen() || isOpenError())
- return false;
-
- char* err;
- int res = sqlite_exec(d->access, "BEGIN", 0, this, &err);
-
- if (res == SQLITE_OK)
- return true;
-
- setLastError(QSqlError(tr("Unable to begin transaction"),
- QString::fromLatin1(err), QSqlError::TransactionError, res));
- sqlite_freemem(err);
- return false;
-}
-
-bool QSQLite2Driver::commitTransaction()
-{
- Q_D(QSQLite2Driver);
- if (!isOpen() || isOpenError())
- return false;
-
- char* err;
- int res = sqlite_exec(d->access, "COMMIT", 0, this, &err);
-
- if (res == SQLITE_OK)
- return true;
-
- setLastError(QSqlError(tr("Unable to commit transaction"),
- QString::fromLatin1(err), QSqlError::TransactionError, res));
- sqlite_freemem(err);
- return false;
-}
-
-bool QSQLite2Driver::rollbackTransaction()
-{
- Q_D(QSQLite2Driver);
- if (!isOpen() || isOpenError())
- return false;
-
- char* err;
- int res = sqlite_exec(d->access, "ROLLBACK", 0, this, &err);
-
- if (res == SQLITE_OK)
- return true;
-
- setLastError(QSqlError(tr("Unable to rollback transaction"),
- QString::fromLatin1(err), QSqlError::TransactionError, res));
- sqlite_freemem(err);
- return false;
-}
-
-QStringList QSQLite2Driver::tables(QSql::TableType type) const
-{
- QStringList res;
- if (!isOpen())
- return res;
-
- QSqlQuery q(createResult());
- q.setForwardOnly(true);
- if ((type & QSql::Tables) && (type & QSql::Views))
- q.exec(QLatin1String("SELECT name FROM sqlite_master WHERE type='table' OR type='view'"));
- else if (type & QSql::Tables)
- q.exec(QLatin1String("SELECT name FROM sqlite_master WHERE type='table'"));
- else if (type & QSql::Views)
- q.exec(QLatin1String("SELECT name FROM sqlite_master WHERE type='view'"));
-
- if (q.isActive()) {
- while(q.next())
- res.append(q.value(0).toString());
- }
-
- if (type & QSql::SystemTables) {
- // there are no internal tables beside this one:
- res.append(QLatin1String("sqlite_master"));
- }
-
- return res;
-}
-
-QSqlIndex QSQLite2Driver::primaryIndex(const QString &tblname) const
-{
- QSqlRecord rec(record(tblname)); // expensive :(
-
- if (!isOpen())
- return QSqlIndex();
-
- QSqlQuery q(createResult());
- q.setForwardOnly(true);
- QString table = tblname;
- if (isIdentifierEscaped(table, QSqlDriver::TableName))
- table = stripDelimiters(table, QSqlDriver::TableName);
- // finrst find a UNIQUE INDEX
- q.exec(QLatin1String("PRAGMA index_list('") + table + QLatin1String("');"));
- QString indexname;
- while(q.next()) {
- if (q.value(2).toInt()==1) {
- indexname = q.value(1).toString();
- break;
- }
- }
- if (indexname.isEmpty())
- return QSqlIndex();
-
- q.exec(QLatin1String("PRAGMA index_info('") + indexname + QLatin1String("');"));
-
- QSqlIndex index(table, indexname);
- while(q.next()) {
- QString name = q.value(2).toString();
- QVariant::Type type = QVariant::Invalid;
- if (rec.contains(name))
- type = rec.field(name).type();
- index.append(QSqlField(name, type, tblname));
- }
- return index;
-}
-
-QSqlRecord QSQLite2Driver::record(const QString &tbl) const
-{
- if (!isOpen())
- return QSqlRecord();
- QString table = tbl;
- if (isIdentifierEscaped(tbl, QSqlDriver::TableName))
- table = stripDelimiters(table, QSqlDriver::TableName);
-
- QSqlQuery q(createResult());
- q.setForwardOnly(true);
- q.exec(QLatin1String("SELECT * FROM ") + tbl + QLatin1String(" LIMIT 1"));
- return q.record();
-}
-
-QVariant QSQLite2Driver::handle() const
-{
- Q_D(const QSQLite2Driver);
- return QVariant::fromValue(d->access);
-}
-
-QString QSQLite2Driver::escapeIdentifier(const QString &identifier, IdentifierType /*type*/) const
-{
- QString res = identifier;
- if(!identifier.isEmpty() && !identifier.startsWith(QLatin1Char('"')) && !identifier.endsWith(QLatin1Char('"')) ) {
- res.replace(QLatin1Char('"'), QLatin1String("\"\""));
- res.prepend(QLatin1Char('"')).append(QLatin1Char('"'));
- res.replace(QLatin1Char('.'), QLatin1String("\".\""));
- }
- return res;
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/sqlite2/qsql_sqlite2_p.h b/src/plugins/sqldrivers/sqlite2/qsql_sqlite2_p.h
deleted file mode 100644
index 57db0a4d47..0000000000
--- a/src/plugins/sqldrivers/sqlite2/qsql_sqlite2_p.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtSql module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSQL_SQLITE2_H
-#define QSQL_SQLITE2_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtSql/qsqldriver.h>
-
-#if defined (Q_OS_WIN32)
-# include <QtCore/qt_windows.h>
-#endif
-
-struct sqlite;
-
-#ifdef QT_PLUGIN
-#define Q_EXPORT_SQLDRIVER_SQLITE2
-#else
-#define Q_EXPORT_SQLDRIVER_SQLITE2 Q_SQL_EXPORT
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QSqlResult;
-class QSQLite2DriverPrivate;
-
-class Q_EXPORT_SQLDRIVER_SQLITE2 QSQLite2Driver : public QSqlDriver
-{
- friend class QSQLite2ResultPrivate;
- Q_DECLARE_PRIVATE(QSQLite2Driver)
- Q_OBJECT
-public:
- explicit QSQLite2Driver(QObject *parent = nullptr);
- explicit QSQLite2Driver(sqlite *connection, QObject *parent = nullptr);
- ~QSQLite2Driver();
- bool hasFeature(DriverFeature f) const override;
- bool open(const QString &db,
- const QString &user,
- const QString &password,
- const QString &host,
- int port,
- const QString &connOpts) override;
- bool open(const QString &db,
- const QString &user,
- const QString &password,
- const QString &host,
- int port) { return open(db, user, password, host, port, QString()); }
- void close() override;
- QSqlResult *createResult() const override;
- bool beginTransaction() override;
- bool commitTransaction() override;
- bool rollbackTransaction() override;
- QStringList tables(QSql::TableType) const override;
-
- QSqlRecord record(const QString &tablename) const override;
- QSqlIndex primaryIndex(const QString &table) const override;
- QVariant handle() const override;
- QString escapeIdentifier(const QString &identifier, IdentifierType) const override;
-};
-
-QT_END_NAMESPACE
-
-#endif // QSQL_SQLITE2_H
diff --git a/src/plugins/sqldrivers/sqlite2/smain.cpp b/src/plugins/sqldrivers/sqlite2/smain.cpp
deleted file mode 100644
index 7d971d6e5a..0000000000
--- a/src/plugins/sqldrivers/sqlite2/smain.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qsqldriverplugin.h>
-#include <qstringlist.h>
-#include "qsql_sqlite2_p.h"
-
-QT_BEGIN_NAMESPACE
-
-// ### Qt6: remove, obsolete since 5.14
-class QSQLite2DriverPlugin : public QSqlDriverPlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QSqlDriverFactoryInterface" FILE "sqlite2.json")
-
-public:
- QSQLite2DriverPlugin();
-
- QSqlDriver* create(const QString &);
-};
-
-QSQLite2DriverPlugin::QSQLite2DriverPlugin()
- : QSqlDriverPlugin()
-{
-}
-
-QSqlDriver* QSQLite2DriverPlugin::create(const QString &name)
-{
- if (name == QLatin1String("QSQLITE2")) {
- QSQLite2Driver* driver = new QSQLite2Driver();
- return driver;
- }
- return 0;
-}
-
-QT_END_NAMESPACE
-
-#include "smain.moc"
diff --git a/src/plugins/sqldrivers/sqlite2/sqlite2.json b/src/plugins/sqldrivers/sqlite2/sqlite2.json
deleted file mode 100644
index 47bdae4d60..0000000000
--- a/src/plugins/sqldrivers/sqlite2/sqlite2.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "QSQLITE2" ]
-}
diff --git a/src/plugins/sqldrivers/sqlite2/sqlite2.pro b/src/plugins/sqldrivers/sqlite2/sqlite2.pro
deleted file mode 100644
index 721facb5b8..0000000000
--- a/src/plugins/sqldrivers/sqlite2/sqlite2.pro
+++ /dev/null
@@ -1,11 +0,0 @@
-TARGET = qsqlite2
-
-HEADERS += $$PWD/qsql_sqlite2_p.h
-SOURCES += $$PWD/qsql_sqlite2.cpp $$PWD/smain.cpp
-
-QMAKE_USE += sqlite2
-
-OTHER_FILES += sqlite2.json
-
-PLUGIN_CLASS_NAME = QSQLite2DriverPlugin
-include(../qsqldriverbase.pri)
diff --git a/src/plugins/sqldrivers/tds/README b/src/plugins/sqldrivers/tds/README
deleted file mode 100644
index 3d27ed46d2..0000000000
--- a/src/plugins/sqldrivers/tds/README
+++ /dev/null
@@ -1,6 +0,0 @@
-You will need the dblib development headers and libraries installed before
-compiling this plugin.
-
-See the Qt SQL documentation for more information on compiling Qt SQL
-driver plugins (sql-driver.html).
-
diff --git a/src/plugins/sqldrivers/tds/main.cpp b/src/plugins/sqldrivers/tds/main.cpp
deleted file mode 100644
index 18efb22ea4..0000000000
--- a/src/plugins/sqldrivers/tds/main.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#define Q_UUIDIMPL
-#include <qsqldriverplugin.h>
-#include <qstringlist.h>
-#ifdef Q_OS_WIN32 // We assume that MS SQL Server is used. Set Q_USE_SYBASE to force Sybase.
-// Conflicting declarations of LPCBYTE in sqlfront.h and winscard.h
-#define _WINSCARD_H_
-#include <windows.h>
-#endif
-#include "qsql_tds_p.h"
-
-QT_BEGIN_NAMESPACE
-
-
-// ### Qt6: remove, obsolete since 4.7
-class QTDSDriverPlugin : public QSqlDriverPlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QSqlDriverFactoryInterface" FILE "tds.json")
-
-public:
- QTDSDriverPlugin();
-
- QSqlDriver* create(const QString &);
-};
-
-QTDSDriverPlugin::QTDSDriverPlugin()
- : QSqlDriverPlugin()
-{
-}
-
-QSqlDriver* QTDSDriverPlugin::create(const QString &name)
-{
- if (name == QLatin1String("QTDS") || name == QLatin1String("QTDS7")) {
- QTDSDriver* driver = new QTDSDriver();
- return driver;
- }
- return 0;
-}
-
-QT_END_NAMESPACE
-
-#include "main.moc"
diff --git a/src/plugins/sqldrivers/tds/qsql_tds.cpp b/src/plugins/sqldrivers/tds/qsql_tds.cpp
deleted file mode 100644
index 9c8d242028..0000000000
--- a/src/plugins/sqldrivers/tds/qsql_tds.cpp
+++ /dev/null
@@ -1,881 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtSql module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsql_tds_p.h"
-
-#include <qglobal.h>
-#ifdef Q_OS_WIN32 // We assume that MS SQL Server is used. Set Q_USE_SYBASE to force Sybase.
-// Conflicting declarations of LPCBYTE in sqlfront.h and winscard.h
-#define _WINSCARD_H_
-#include <windows.h>
-#else
-#define Q_USE_SYBASE
-#endif
-
-#include <qvariant.h>
-#include <qdatetime.h>
-#include <qhash.h>
-#include <qregexp.h>
-#include <qsqlerror.h>
-#include <qsqlfield.h>
-#include <qsqlindex.h>
-#include <qsqlquery.h>
-#include <QtSql/private/qsqlcachedresult_p.h>
-#include <QtSql/private/qsqldriver_p.h>
-#include <qstringlist.h>
-#include <qvector.h>
-
-#include <stdlib.h>
-
-Q_DECLARE_OPAQUE_POINTER(LOGINREC*)
-Q_DECLARE_OPAQUE_POINTER(DBPROCESS*)
-
-QT_BEGIN_NAMESPACE
-
-#ifdef DBNTWIN32
-#define QMSGHANDLE DBMSGHANDLE_PROC
-#define QERRHANDLE DBERRHANDLE_PROC
-#define QTDSCHAR SQLCHAR
-#define QTDSDATETIME4 SQLDATETIM4
-#define QTDSDATETIME SQLDATETIME
-#define QTDSDATETIME_N SQLDATETIMN
-#define QTDSDECIMAL SQLDECIMAL
-#define QTDSFLT4 SQLFLT4
-#define QTDSFLT8 SQLFLT8
-#define QTDSFLT8_N SQLFLTN
-#define QTDSINT1 SQLINT1
-#define QTDSINT2 SQLINT2
-#define QTDSINT4 SQLINT4
-#define QTDSINT4_N SQLINTN
-#define QTDSMONEY4 SQLMONEY4
-#define QTDSMONEY SQLMONEY
-#define QTDSMONEY_N SQLMONEYN
-#define QTDSNUMERIC SQLNUMERIC
-#define QTDSTEXT SQLTEXT
-#define QTDSVARCHAR SQLVARCHAR
-#define QTDSBIT SQLBIT
-#define QTDSBINARY SQLBINARY
-#define QTDSVARBINARY SQLVARBINARY
-#define QTDSIMAGE SQLIMAGE
-#else
-#define QMSGHANDLE MHANDLEFUNC
-#define QERRHANDLE EHANDLEFUNC
-#define QTDSCHAR SYBCHAR
-#define QTDSDATETIME4 SYBDATETIME4
-#define QTDSDATETIME SYBDATETIME
-#define QTDSDATETIME_N SYBDATETIMN
-#define QTDSDECIMAL SYBDECIMAL
-#define QTDSFLT8 SYBFLT8
-#define QTDSFLT8_N SYBFLTN
-#define QTDSFLT4 SYBREAL
-#define QTDSINT1 SYBINT1
-#define QTDSINT2 SYBINT2
-#define QTDSINT4 SYBINT4
-#define QTDSINT4_N SYBINTN
-#define QTDSMONEY4 SYBMONEY4
-#define QTDSMONEY SYBMONEY
-#define QTDSMONEY_N SYBMONEYN
-#define QTDSNUMERIC SYBNUMERIC
-#define QTDSTEXT SYBTEXT
-#define QTDSVARCHAR SYBVARCHAR
-#define QTDSBIT SYBBIT
-#define QTDSBINARY SYBBINARY
-#define QTDSVARBINARY SYBVARBINARY
-#define QTDSIMAGE SYBIMAGE
-// magic numbers not defined anywhere in Sybase headers
-#define QTDSDECIMAL_2 55
-#define QTDSNUMERIC_2 63
-#endif //DBNTWIN32
-
-#define TDS_CURSOR_SIZE 50
-
-// workaround for FreeTDS
-#ifndef CS_PUBLIC
-#define CS_PUBLIC
-#endif
-
-QSqlError qMakeError(const QString& err, QSqlError::ErrorType type, int errNo = -1)
-{
- return QSqlError(QLatin1String("QTDS: ") + err, QString(), type,
- errNo != -1 ? QString::number(errNo) : QString());
-}
-
-class QTDSDriverPrivate : public QSqlDriverPrivate
-{
- Q_DECLARE_PUBLIC(QTDSDriver)
-
-public:
- QTDSDriverPrivate() : QSqlDriverPrivate(), login(0), initialized(false) { dbmsType = QSqlDriver::Sybase; }
- LOGINREC* login; // login information
- QString hostName;
- QString db;
- bool initialized;
-};
-
-struct QTDSColumnData
-{
- void *data;
- DBINT nullbind;
-};
-Q_DECLARE_TYPEINFO(QTDSColumnData, Q_MOVABLE_TYPE);
-
-class QTDSResultPrivate;
-
-class QTDSResult : public QSqlCachedResult
-{
- Q_DECLARE_PRIVATE(QTDSResult)
-
-public:
- explicit QTDSResult(const QTDSDriver* db);
- ~QTDSResult();
- QVariant handle() const override;
-
-protected:
- void cleanup();
- bool reset(const QString &query) override;
- int size() override;
- int numRowsAffected() override;
- bool gotoNext(QSqlCachedResult::ValueCache &values, int index) override;
- QSqlRecord record() const override;
-};
-
-class QTDSResultPrivate: public QSqlCachedResultPrivate
-{
- Q_DECLARE_PUBLIC(QTDSResult)
-
-public:
- Q_DECLARE_SQLDRIVER_PRIVATE(QTDSDriver)
- QTDSResultPrivate(QTDSResult *q, const QTDSDriver *drv)
- : QSqlCachedResultPrivate(q, drv),
- login(0),
- dbproc(0) {}
- LOGINREC* login; // login information
- DBPROCESS* dbproc; // connection from app to server
- QSqlError lastError;
- void addErrorMsg(QString& errMsg) { errorMsgs.append(errMsg); }
- QString getErrorMsgs() { return errorMsgs.join(QLatin1String("\n")); }
- void clearErrorMsgs() { errorMsgs.clear(); }
- QVector<QTDSColumnData> buffer;
- QSqlRecord rec;
-
-private:
- QStringList errorMsgs;
-};
-
-typedef QHash<DBPROCESS *, QTDSResultPrivate *> QTDSErrorHash;
-Q_GLOBAL_STATIC(QTDSErrorHash, errs)
-
-extern "C" {
-static int CS_PUBLIC qTdsMsgHandler (DBPROCESS* dbproc,
- DBINT msgno,
- int msgstate,
- int severity,
- char* msgtext,
- char* srvname,
- char* /*procname*/,
- int line)
-{
- QTDSResultPrivate* p = errs()->value(dbproc);
-
- if (!p) {
-// ### umm... temporary disabled since this throws a lot of warnings...
-// qWarning("QTDSDriver warning (%d): [%s] from server [%s]", msgstate, msgtext, srvname);
- return INT_CANCEL;
- }
-
- if (severity > 0) {
- QString errMsg = QString::fromLatin1("%1 (Msg %2, Level %3, State %4, Server %5, Line %6)")
- .arg(QString::fromLatin1(msgtext))
- .arg(msgno)
- .arg(severity)
- .arg(msgstate)
- .arg(QString::fromLatin1(srvname))
- .arg(line);
- p->addErrorMsg(errMsg);
- if (severity > 10) {
- // Severe messages are really errors in the sense of lastError
- errMsg = p->getErrorMsgs();
- p->lastError = qMakeError(errMsg, QSqlError::UnknownError, msgno);
- p->clearErrorMsgs();
- }
- }
-
- return INT_CANCEL;
-}
-
-static int CS_PUBLIC qTdsErrHandler(DBPROCESS* dbproc,
- int /*severity*/,
- int dberr,
- int /*oserr*/,
- char* dberrstr,
- char* oserrstr)
-{
- QTDSResultPrivate* p = errs()->value(dbproc);
- if (!p) {
- qWarning("QTDSDriver error (%d): [%s] [%s]", dberr, dberrstr, oserrstr);
- return INT_CANCEL;
- }
- /*
- * If the process is dead or NULL and
- * we are not in the middle of logging in...
- */
- if((dbproc == NULL || DBDEAD(dbproc))) {
- qWarning("QTDSDriver error (%d): [%s] [%s]", dberr, dberrstr, oserrstr);
- return INT_CANCEL;
- }
-
- const QString errMsg = QLatin1String(dberrstr) + QLatin1Char(' ')
- + QLatin1String(oserrstr) + QLatin1Char('\n')
- + p->getErrorMsgs();
- p->lastError = qMakeError(errMsg, QSqlError::UnknownError, dberr);
- p->clearErrorMsgs();
-
- return INT_CANCEL ;
-}
-
-} //extern "C"
-
-
-QVariant::Type qDecodeTDSType(int type)
-{
- QVariant::Type t = QVariant::Invalid;
- switch (type) {
- case QTDSCHAR:
- case QTDSTEXT:
- case QTDSVARCHAR:
- t = QVariant::String;
- break;
- case QTDSINT1:
- case QTDSINT2:
- case QTDSINT4:
- case QTDSINT4_N:
- case QTDSBIT:
- t = QVariant::Int;
- break;
- case QTDSFLT4:
- case QTDSFLT8:
- case QTDSFLT8_N:
- case QTDSMONEY4:
- case QTDSMONEY:
- case QTDSDECIMAL:
- case QTDSNUMERIC:
-#ifdef QTDSNUMERIC_2
- case QTDSNUMERIC_2:
-#endif
-#ifdef QTDSDECIMAL_2
- case QTDSDECIMAL_2:
-#endif
- case QTDSMONEY_N:
- t = QVariant::Double;
- break;
- case QTDSDATETIME4:
- case QTDSDATETIME:
- case QTDSDATETIME_N:
- t = QVariant::DateTime;
- break;
- case QTDSBINARY:
- case QTDSVARBINARY:
- case QTDSIMAGE:
- t = QVariant::ByteArray;
- break;
- default:
- t = QVariant::Invalid;
- break;
- }
- return t;
-}
-
-QVariant::Type qFieldType(QTDSResultPrivate* d, int i)
-{
- QVariant::Type type = qDecodeTDSType(dbcoltype(d->dbproc, i+1));
- return type;
-}
-
-
-QTDSResult::QTDSResult(const QTDSDriver* db)
- : QSqlCachedResult(*new QTDSResultPrivate(this, db))
-{
- Q_D(QTDSResult);
- d->login = d->drv_d_func()->login;
-
- d->dbproc = dbopen(d->login, const_cast<char*>(d->drv_d_func()->hostName.toLatin1().constData()));
- if (!d->dbproc)
- return;
- if (dbuse(d->dbproc, const_cast<char*>(d->drv_d_func()->db.toLatin1().constData())) == FAIL)
- return;
-
- // insert d in error handler dict
- errs()->insert(d->dbproc, d);
- dbcmd(d->dbproc, "set quoted_identifier on");
- dbsqlexec(d->dbproc);
-}
-
-QTDSResult::~QTDSResult()
-{
- Q_D(QTDSResult);
- cleanup();
- if (d->dbproc)
- dbclose(d->dbproc);
- errs()->remove(d->dbproc);
-}
-
-void QTDSResult::cleanup()
-{
- Q_D(QTDSResult);
- d->clearErrorMsgs();
- d->rec.clear();
- for (int i = 0; i < d->buffer.size(); ++i)
- free(d->buffer.at(i).data);
- d->buffer.clear();
- // "can" stands for "cancel"... very clever.
- dbcanquery(d->dbproc);
- dbfreebuf(d->dbproc);
-
- QSqlCachedResult::cleanup();
-}
-
-QVariant QTDSResult::handle() const
-{
- Q_D(const QTDSResult);
- return QVariant(qRegisterMetaType<DBPROCESS *>("DBPROCESS*"), &d->dbproc);
-}
-
-static inline bool qIsNull(const QTDSColumnData &p)
-{
- return p.nullbind == -1;
-}
-
-bool QTDSResult::gotoNext(QSqlCachedResult::ValueCache &values, int index)
-{
- Q_D(QTDSResult);
- STATUS stat = dbnextrow(d->dbproc);
- if (stat == NO_MORE_ROWS) {
- setAt(QSql::AfterLastRow);
- return false;
- }
- if ((stat == FAIL) || (stat == BUF_FULL)) {
- setLastError(d->lastError);
- return false;
- }
-
- if (index < 0)
- return true;
-
- for (int i = 0; i < d->rec.count(); ++i) {
- int idx = index + i;
- switch (d->rec.field(i).type()) {
- case QVariant::DateTime:
- if (qIsNull(d->buffer.at(i))) {
- values[idx] = QVariant(QVariant::DateTime);
- } else {
- DBDATETIME *bdt = (DBDATETIME*) d->buffer.at(i).data;
- QDate date = QDate::fromString(QLatin1String("1900-01-01"), Qt::ISODate);
- QTime time = QTime::fromString(QLatin1String("00:00:00"), Qt::ISODate);
- values[idx] = QDateTime(date.addDays(bdt->dtdays), time.addMSecs(int(bdt->dttime / 0.3)));
- }
- break;
- case QVariant::Int:
- if (qIsNull(d->buffer.at(i)))
- values[idx] = QVariant(QVariant::Int);
- else
- values[idx] = *((int*)d->buffer.at(i).data);
- break;
- case QVariant::Double:
- case QVariant::String:
- if (qIsNull(d->buffer.at(i)))
- values[idx] = QVariant(QVariant::String);
- else
- values[idx] = QString::fromLocal8Bit((const char*)d->buffer.at(i).data).trimmed();
- break;
- case QVariant::ByteArray: {
- if (qIsNull(d->buffer.at(i)))
- values[idx] = QVariant(QVariant::ByteArray);
- else
- values[idx] = QByteArray((const char*)d->buffer.at(i).data);
- break;
- }
- default:
- // should never happen, and we already fired
- // a warning while binding.
- values[idx] = QVariant();
- break;
- }
- }
-
- return true;
-}
-
-bool QTDSResult::reset (const QString& query)
-{
- Q_D(QTDSResult);
- cleanup();
- if (!driver() || !driver()-> isOpen() || driver()->isOpenError())
- return false;
- setActive(false);
- setAt(QSql::BeforeFirstRow);
- if (dbcmd(d->dbproc, const_cast<char*>(query.toLocal8Bit().constData())) == FAIL) {
- setLastError(d->lastError);
- return false;
- }
-
- if (dbsqlexec(d->dbproc) == FAIL) {
- setLastError(d->lastError);
- dbfreebuf(d->dbproc);
- return false;
- }
- if (dbresults(d->dbproc) != SUCCEED) {
- setLastError(d->lastError);
- dbfreebuf(d->dbproc);
- return false;
- }
-
- setSelect((DBCMDROW(d->dbproc) == SUCCEED)); // decide whether or not we are dealing with a SELECT query
- int numCols = dbnumcols(d->dbproc);
- if (numCols > 0) {
- d->buffer.resize(numCols);
- init(numCols);
- }
- for (int i = 0; i < numCols; ++i) {
- int dbType = dbcoltype(d->dbproc, i+1);
- QVariant::Type vType = qDecodeTDSType(dbType);
- QSqlField f(QString::fromLatin1(dbcolname(d->dbproc, i+1)), vType);
- f.setSqlType(dbType);
- f.setLength(dbcollen(d->dbproc, i+1));
- d->rec.append(f);
-
- RETCODE ret = -1;
- void* p = 0;
- switch (vType) {
- case QVariant::Int:
- p = malloc(4);
- ret = dbbind(d->dbproc, i+1, INTBIND, (DBINT) 4, (unsigned char *)p);
- break;
- case QVariant::Double:
- // use string binding to prevent loss of precision
- p = malloc(50);
- ret = dbbind(d->dbproc, i+1, STRINGBIND, 50, (unsigned char *)p);
- break;
- case QVariant::String:
- p = malloc(dbcollen(d->dbproc, i+1) + 1);
- ret = dbbind(d->dbproc, i+1, STRINGBIND, DBINT(dbcollen(d->dbproc, i+1) + 1), (unsigned char *)p);
- break;
- case QVariant::DateTime:
- p = malloc(8);
- ret = dbbind(d->dbproc, i+1, DATETIMEBIND, (DBINT) 8, (unsigned char *)p);
- break;
- case QVariant::ByteArray:
- p = malloc(dbcollen(d->dbproc, i+1) + 1);
- ret = dbbind(d->dbproc, i+1, BINARYBIND, DBINT(dbcollen(d->dbproc, i+1) + 1), (unsigned char *)p);
- break;
- default: //don't bind the field since we do not support it
- qWarning("QTDSResult::reset: Unsupported type for field \"%s\"", dbcolname(d->dbproc, i+1));
- break;
- }
- if (ret == SUCCEED) {
- d->buffer[i].data = p;
- ret = dbnullbind(d->dbproc, i+1, &d->buffer[i].nullbind);
- } else {
- d->buffer[i].data = 0;
- d->buffer[i].nullbind = 0;
- free(p);
- }
- if ((ret != SUCCEED) && (ret != -1)) {
- setLastError(d->lastError);
- return false;
- }
- }
-
- setActive(true);
- return true;
-}
-
-int QTDSResult::size()
-{
- return -1;
-}
-
-int QTDSResult::numRowsAffected()
-{
- Q_D(const QTDSResult);
-#ifdef DBNTWIN32
- if (dbiscount(d->dbproc)) {
- return DBCOUNT(d->dbproc);
- }
- return -1;
-#else
- return DBCOUNT(d->dbproc);
-#endif
-}
-
-QSqlRecord QTDSResult::record() const
-{
- Q_D(const QTDSResult);
- return d->rec;
-}
-
-///////////////////////////////////////////////////////////////////
-
-QTDSDriver::QTDSDriver(QObject* parent)
- : QSqlDriver(*new QTDSDriverPrivate, parent)
-{
- init();
-}
-
-QTDSDriver::QTDSDriver(LOGINREC* rec, const QString& host, const QString &db, QObject* parent)
- : QSqlDriver(*new QTDSDriverPrivate, parent)
-{
- Q_D(QTDSDriver);
- init();
- d->login = rec;
- d->hostName = host;
- d->db = db;
- if (rec) {
- setOpen(true);
- setOpenError(false);
- }
-}
-
-QVariant QTDSDriver::handle() const
-{
- Q_D(const QTDSDriver);
- return QVariant(qRegisterMetaType<LOGINREC *>("LOGINREC*"), &d->login);
-}
-
-void QTDSDriver::init()
-{
- Q_D(QTDSDriver);
- d->initialized = (dbinit() == SUCCEED);
- // the following two code-lines will fail compilation on some FreeTDS versions
- // just comment them out if you have FreeTDS (you won't get any errors and warnings then)
- dberrhandle((QERRHANDLE)qTdsErrHandler);
- dbmsghandle((QMSGHANDLE)qTdsMsgHandler);
-}
-
-QTDSDriver::~QTDSDriver()
-{
- dberrhandle(0);
- dbmsghandle(0);
- // dbexit also calls dbclose if necessary
- dbexit();
-}
-
-bool QTDSDriver::hasFeature(DriverFeature f) const
-{
- switch (f) {
- case Transactions:
- case QuerySize:
- case Unicode:
- case SimpleLocking:
- case EventNotifications:
- case MultipleResultSets:
- return false;
- case BLOB:
- return true;
- default:
- return false;
- }
-}
-
-bool QTDSDriver::open(const QString & db,
- const QString & user,
- const QString & password,
- const QString & host,
- int /*port*/,
- const QString& /*connOpts*/)
-{
- Q_D(QTDSDriver);
- if (isOpen())
- close();
- if (!d->initialized) {
- setOpenError(true);
- return false;
- }
- d->login = dblogin();
- if (!d->login) {
- setOpenError(true);
- return false;
- }
- DBSETLPWD(d->login, const_cast<char*>(password.toLocal8Bit().constData()));
- DBSETLUSER(d->login, const_cast<char*>(user.toLocal8Bit().constData()));
-
- // Now, try to open and use the database. If this fails, return false.
- DBPROCESS* dbproc;
-
- dbproc = dbopen(d->login, const_cast<char*>(host.toLatin1().constData()));
- if (!dbproc) {
- setLastError(qMakeError(tr("Unable to open connection"), QSqlError::ConnectionError, -1));
- setOpenError(true);
- return false;
- }
- if (dbuse(dbproc, const_cast<char*>(db.toLatin1().constData())) == FAIL) {
- setLastError(qMakeError(tr("Unable to use database"), QSqlError::ConnectionError, -1));
- setOpenError(true);
- return false;
- }
- dbclose( dbproc );
-
- setOpen(true);
- setOpenError(false);
- d->hostName = host;
- d->db = db;
- return true;
-}
-
-void QTDSDriver::close()
-{
- Q_D(QTDSDriver);
- if (isOpen()) {
-#ifdef Q_USE_SYBASE
- dbloginfree(d->login);
-#else
- dbfreelogin(d->login);
-#endif
- d->login = 0;
- setOpen(false);
- setOpenError(false);
- }
-}
-
-QSqlResult *QTDSDriver::createResult() const
-{
- return new QTDSResult(this);
-}
-
-bool QTDSDriver::beginTransaction()
-{
- return false;
-/*
- if (!isOpen()) {
- qWarning("QTDSDriver::beginTransaction: Database not open");
- return false;
- }
- if (dbcmd(d->dbproc, "BEGIN TRANSACTION") == FAIL) {
- setLastError(d->lastError);
- dbfreebuf(d->dbproc);
- return false;
- }
- if (dbsqlexec(d->dbproc) == FAIL) {
- setLastError(d->lastError);
- dbfreebuf(d->dbproc);
- return false;
- }
- while(dbresults(d->dbproc) == NO_MORE_RESULTS) {}
- dbfreebuf(d->dbproc);
- inTransaction = true;
- return true;
-*/
-}
-
-bool QTDSDriver::commitTransaction()
-{
- return false;
-/*
- if (!isOpen()) {
- qWarning("QTDSDriver::commitTransaction: Database not open");
- return false;
- }
- if (dbcmd(d->dbproc, "COMMIT TRANSACTION") == FAIL) {
- setLastError(d->lastError);
- dbfreebuf(d->dbproc);
- return false;
- }
- if (dbsqlexec(d->dbproc) == FAIL) {
- setLastError(d->lastError);
- dbfreebuf(d->dbproc);
- return false;
- }
- while(dbresults(d->dbproc) == NO_MORE_RESULTS) {}
- dbfreebuf(d->dbproc);
- inTransaction = false;
- return true;
-*/
-}
-
-bool QTDSDriver::rollbackTransaction()
-{
- return false;
-/*
- if (!isOpen()) {
- qWarning("QTDSDriver::rollbackTransaction: Database not open");
- return false;
- }
- if (dbcmd(d->dbproc, "ROLLBACK TRANSACTION") == FAIL) {
- setLastError(d->lastError);
- dbfreebuf(d->dbproc);
- return false;
- }
- if (dbsqlexec(d->dbproc) == FAIL) {
- setLastError(d->lastError);
- dbfreebuf(d->dbproc);
- return false;
- }
- while(dbresults(d->dbproc) == NO_MORE_RESULTS) {}
- dbfreebuf(d->dbproc);
- inTransaction = false;
- return true;
-*/
-}
-
-QSqlRecord QTDSDriver::record(const QString& tablename) const
-{
- QSqlRecord info;
- if (!isOpen())
- return info;
- QSqlQuery t(createResult());
- t.setForwardOnly(true);
-
- QString table = tablename;
- if (isIdentifierEscaped(table, QSqlDriver::TableName))
- table = stripDelimiters(table, QSqlDriver::TableName);
-
- QString stmt (QLatin1String("select name, type, length, prec from syscolumns "
- "where id = (select id from sysobjects where name = '%1')"));
- t.exec(stmt.arg(table));
- while (t.next()) {
- QSqlField f(t.value(0).toString().simplified(), qDecodeTDSType(t.value(1).toInt()), tablename);
- f.setLength(t.value(2).toInt());
- f.setPrecision(t.value(3).toInt());
- f.setSqlType(t.value(1).toInt());
- info.append(f);
- }
- return info;
-}
-
-QStringList QTDSDriver::tables(QSql::TableType type) const
-{
- QStringList list;
-
- if (!isOpen())
- return list;
-
- QStringList typeFilter;
-
- if (type & QSql::Tables)
- typeFilter += QLatin1String("type='U'");
- if (type & QSql::SystemTables)
- typeFilter += QLatin1String("type='S'");
- if (type & QSql::Views)
- typeFilter += QLatin1String("type='V'");
-
- if (typeFilter.isEmpty())
- return list;
-
- QSqlQuery t(createResult());
- t.setForwardOnly(true);
- t.exec(QLatin1String("select name from sysobjects where ") + typeFilter.join(QLatin1String(" or ")));
- while (t.next())
- list.append(t.value(0).toString().simplified());
-
- return list;
-}
-
-QString QTDSDriver::formatValue(const QSqlField &field,
- bool trim) const
-{
- QString r;
- if (field.isNull())
- r = QLatin1String("NULL");
- else if (field.type() == QVariant::DateTime) {
- if (field.value().toDateTime().isValid()){
- r = field.value().toDateTime().toString(u"yyyyMMdd hh:mm:ss");
- r.prepend(QLatin1String("'"));
- r.append(QLatin1String("'"));
- } else
- r = QLatin1String("NULL");
- } else if (field.type() == QVariant::ByteArray) {
- QByteArray ba = field.value().toByteArray();
- QString res;
- static const char hexchars[] = "0123456789abcdef";
- for (int i = 0; i < ba.size(); ++i) {
- uchar s = (uchar) ba[i];
- res += QLatin1Char(hexchars[s >> 4]);
- res += QLatin1Char(hexchars[s & 0x0f]);
- }
- r = QLatin1String("0x") + res;
- } else {
- r = QSqlDriver::formatValue(field, trim);
- }
- return r;
-}
-
-QSqlIndex QTDSDriver::primaryIndex(const QString& tablename) const
-{
- QSqlRecord rec = record(tablename);
-
- QString table = tablename;
- if (isIdentifierEscaped(table, QSqlDriver::TableName))
- table = stripDelimiters(table, QSqlDriver::TableName);
-
- QSqlIndex idx(table);
- if ((!isOpen()) || (table.isEmpty()))
- return QSqlIndex();
-
- QSqlQuery t(createResult());
- t.setForwardOnly(true);
- t.exec(QString::fromLatin1("sp_helpindex '%1'").arg(table));
- if (t.next()) {
- QStringList fNames = t.value(2).toString().simplified().split(QLatin1Char(','));
- QRegExp regx(QLatin1String("\\s*(\\S+)(?:\\s+(DESC|desc))?\\s*"));
- for(QStringList::Iterator it = fNames.begin(); it != fNames.end(); ++it) {
- regx.indexIn(*it);
- QSqlField f(regx.cap(1), rec.field(regx.cap(1)).type(), tablename);
- if (regx.cap(2).toLower() == QLatin1String("desc")) {
- idx.append(f, true);
- } else {
- idx.append(f, false);
- }
- }
- idx.setName(t.value(0).toString().simplified());
- }
- return idx;
-}
-
-QString QTDSDriver::escapeIdentifier(const QString &identifier, IdentifierType type) const
-{
- Q_UNUSED(type)
- QString res = identifier;
- if(!identifier.isEmpty() && !identifier.startsWith(QLatin1Char('"')) && !identifier.endsWith(QLatin1Char('"')) ) {
- res.replace(QLatin1Char('"'), QLatin1String("\"\""));
- res.prepend(QLatin1Char('"')).append(QLatin1Char('"'));
- res.replace(QLatin1Char('.'), QLatin1String("\".\""));
- }
- return res;
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/tds/qsql_tds_p.h b/src/plugins/sqldrivers/tds/qsql_tds_p.h
deleted file mode 100644
index b72fababbb..0000000000
--- a/src/plugins/sqldrivers/tds/qsql_tds_p.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtSql module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSQL_TDS_H
-#define QSQL_TDS_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtSql/qsqldriver.h>
-
-#ifdef Q_OS_WIN32
-#define WIN32_LEAN_AND_MEAN
-#ifndef Q_USE_SYBASE
-#define DBNTWIN32 // indicates 32bit windows dblib
-#endif
-#include <winsock2.h>
-#include <QtCore/qt_windows.h>
-#include <sqlfront.h>
-#include <sqldb.h>
-#define CS_PUBLIC
-#else
-#include <sybfront.h>
-#include <sybdb.h>
-#endif //Q_OS_WIN32
-
-#ifdef QT_PLUGIN
-#define Q_EXPORT_SQLDRIVER_TDS
-#else
-#define Q_EXPORT_SQLDRIVER_TDS Q_SQL_EXPORT
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QSqlResult;
-class QTDSDriverPrivate;
-
-class Q_EXPORT_SQLDRIVER_TDS QTDSDriver : public QSqlDriver
-{
- Q_DECLARE_PRIVATE(QTDSDriver)
- Q_OBJECT
- friend class QTDSResultPrivate;
-public:
- explicit QTDSDriver(QObject* parent = nullptr);
- QTDSDriver(LOGINREC* rec, const QString& host, const QString &db, QObject* parent = nullptr);
- ~QTDSDriver();
- bool hasFeature(DriverFeature f) const override;
- bool open(const QString &db,
- const QString &user,
- const QString &password,
- const QString &host,
- int port,
- const QString &connOpts) override;
- void close() override;
- QStringList tables(QSql::TableType) const override;
- QSqlResult *createResult() const override;
- QSqlRecord record(const QString &tablename) const override;
- QSqlIndex primaryIndex(const QString &tablename) const override;
-
- QString formatValue(const QSqlField &field,
- bool trimStrings) const override;
- QVariant handle() const override;
-
- QString escapeIdentifier(const QString &identifier, IdentifierType type) const override;
-
-protected:
- bool beginTransaction() override;
- bool commitTransaction() override;
- bool rollbackTransaction() override;
-private:
- void init();
-};
-
-QT_END_NAMESPACE
-
-#endif // QSQL_TDS_H
diff --git a/src/plugins/sqldrivers/tds/tds.json b/src/plugins/sqldrivers/tds/tds.json
deleted file mode 100644
index 35955db9fa..0000000000
--- a/src/plugins/sqldrivers/tds/tds.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "QTDS7", "QTDS" ]
-}
diff --git a/src/plugins/sqldrivers/tds/tds.pro b/src/plugins/sqldrivers/tds/tds.pro
deleted file mode 100644
index 67bc0f5c48..0000000000
--- a/src/plugins/sqldrivers/tds/tds.pro
+++ /dev/null
@@ -1,11 +0,0 @@
-TARGET = qsqltds
-
-HEADERS += $$PWD/qsql_tds_p.h
-SOURCES += $$PWD/qsql_tds.cpp $$PWD/main.cpp
-
-QMAKE_USE += tds
-
-OTHER_FILES += tds.json
-
-PLUGIN_CLASS_NAME = QTDSDriverPlugin
-include(../qsqldriverbase.pri)
diff --git a/src/plugins/styles/.prev_CMakeLists.txt b/src/plugins/styles/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..73329915f6
--- /dev/null
+++ b/src/plugins/styles/.prev_CMakeLists.txt
@@ -0,0 +1,11 @@
+# Generated from styles.pro.
+
+if(QT_FEATURE_style_android)
+ add_subdirectory(android)
+endif()
+if(QT_FEATURE_style_mac)
+ add_subdirectory(mac)
+endif()
+if(QT_FEATURE_style_windowsvista)
+ add_subdirectory(windowsvista)
+endif()
diff --git a/src/plugins/styles/CMakeLists.txt b/src/plugins/styles/CMakeLists.txt
new file mode 100644
index 0000000000..d24e3daff8
--- /dev/null
+++ b/src/plugins/styles/CMakeLists.txt
@@ -0,0 +1,11 @@
+# Generated from styles.pro.
+
+if(QT_FEATURE_style_android)
+ # add_subdirectory(android) # special case TODO
+endif()
+if(QT_FEATURE_style_mac)
+ add_subdirectory(mac)
+endif()
+if(QT_FEATURE_style_windowsvista)
+ add_subdirectory(windowsvista)
+endif()
diff --git a/src/plugins/styles/android/qandroidstyle.cpp b/src/plugins/styles/android/qandroidstyle.cpp
index 086df92322..1d0838daec 100644
--- a/src/plugins/styles/android/qandroidstyle.cpp
+++ b/src/plugins/styles/android/qandroidstyle.cpp
@@ -248,7 +248,7 @@ QAndroidStyle::ItemType QAndroidStyle::qtControl(QStyle::PrimitiveElement primit
case QStyle::PE_FrameLineEdit:
return QC_EditText;
- case QStyle::PE_IndicatorViewItemCheck:
+ case QStyle::PE_IndicatorItemViewItemCheck:
case QStyle::PE_IndicatorCheckBox:
return QC_Checkbox;
diff --git a/src/plugins/styles/mac/CMakeLists.txt b/src/plugins/styles/mac/CMakeLists.txt
new file mode 100644
index 0000000000..140d4e4c93
--- /dev/null
+++ b/src/plugins/styles/mac/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Generated from mac.pro.
+
+#####################################################################
+## QMacStylePlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QMacStylePlugin
+ OUTPUT_NAME qmacstyle
+ TYPE styles
+ SOURCES
+ main.mm
+ qmacstyle_mac.mm qmacstyle_mac_p.h
+ qmacstyle_mac_p_p.h
+ LIBRARIES
+ ${FWAppKit}
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::Gui
+ Qt::WidgetsPrivate
+)
+
+#### Keys ignored in scope 1:.:.:mac.pro:<TRUE>:
+# DISTFILES = "macstyle.json"
diff --git a/src/plugins/styles/mac/qmacstyle_mac.mm b/src/plugins/styles/mac/qmacstyle_mac.mm
index 8e4aaa19c7..c08e5b0cf1 100644
--- a/src/plugins/styles/mac/qmacstyle_mac.mm
+++ b/src/plugins/styles/mac/qmacstyle_mac.mm
@@ -855,7 +855,8 @@ static inline int qt_mac_aqua_get_metric(QAquaMetric m)
return qt_mac_aqua_metrics[m];
}
-static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg, QSize szHint,
+static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QStyleOption *opt,
+ const QWidget *widg, QSize szHint,
QStyleHelper::WidgetSizePolicy sz)
{
QSize ret(-1, -1);
@@ -919,12 +920,9 @@ static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg
switch (ct) {
#if QT_CONFIG(pushbutton)
case QStyle::CT_PushButton: {
- const QPushButton *psh = qobject_cast<const QPushButton *>(widg);
- // If this comparison is false, then the widget was not a push button.
- // This is bad and there's very little we can do since we were requested to find a
- // sensible size for a widget that pretends to be a QPushButton but is not.
- if(psh) {
- QString buttonText = qt_mac_removeMnemonics(psh->text());
+ const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt);
+ if (btn) {
+ QString buttonText = qt_mac_removeMnemonics(btn->text);
if (buttonText.contains(QLatin1Char('\n')))
ret = QSize(-1, -1);
else if (sz == QStyleHelper::SizeLarge)
@@ -934,11 +932,11 @@ static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg
else if (sz == QStyleHelper::SizeMini)
ret = QSize(-1, qt_mac_aqua_get_metric(MiniPushButtonHeight));
- if (!psh->icon().isNull()){
+ if (!btn->icon.isNull()){
// If the button got an icon, and the icon is larger than the
// button, we can't decide on a default size
ret.setWidth(-1);
- if (ret.height() < psh->iconSize().height())
+ if (ret.height() < btn->iconSize.height())
ret.setHeight(-1);
}
else if (buttonText == QLatin1String("OK") || buttonText == QLatin1String("Cancel")){
@@ -952,18 +950,7 @@ static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg
// or accept button (i.e., rightmost) and cancel button have the same width.
ret.setWidth(69);
}
- } else {
- // The only sensible thing to do is to return whatever the style suggests...
- if (sz == QStyleHelper::SizeLarge)
- ret = QSize(-1, qt_mac_aqua_get_metric(PushButtonHeight));
- else if (sz == QStyleHelper::SizeSmall)
- ret = QSize(-1, qt_mac_aqua_get_metric(SmallPushButtonHeight));
- else if (sz == QStyleHelper::SizeMini)
- ret = QSize(-1, qt_mac_aqua_get_metric(MiniPushButtonHeight));
- else
- // Since there's no default size we return the large size...
- ret = QSize(-1, qt_mac_aqua_get_metric(PushButtonHeight));
- }
+ }
#endif
#if 0 //Not sure we are applying the rules correctly for RadioButtons/CheckBoxes --Sam
} else if (ct == QStyle::CT_RadioButton) {
@@ -1019,19 +1006,19 @@ static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg
int width = 0, height = 0;
if (szHint == QSize(-1, -1)) { //just 'guess'..
#if QT_CONFIG(toolbutton)
- const QToolButton *bt = qobject_cast<const QToolButton *>(widg);
+ const QStyleOptionToolButton *bt = qstyleoption_cast<const QStyleOptionToolButton *>(opt);
// If this conversion fails then the widget was not what it claimed to be.
if(bt) {
- if (!bt->icon().isNull()) {
- QSize iconSize = bt->iconSize();
- QSize pmSize = bt->icon().actualSize(QSize(32, 32), QIcon::Normal);
+ if (!bt->icon.isNull()) {
+ QSize iconSize = bt->iconSize;
+ QSize pmSize = bt->icon.actualSize(QSize(32, 32), QIcon::Normal);
width = qMax(width, qMax(iconSize.width(), pmSize.width()));
height = qMax(height, qMax(iconSize.height(), pmSize.height()));
}
- if (!bt->text().isNull() && bt->toolButtonStyle() != Qt::ToolButtonIconOnly) {
- int text_width = bt->fontMetrics().horizontalAdvance(bt->text()),
- text_height = bt->fontMetrics().height();
- if (bt->toolButtonStyle() == Qt::ToolButtonTextUnderIcon) {
+ if (!bt->text.isNull() && bt->toolButtonStyle != Qt::ToolButtonIconOnly) {
+ int text_width = bt->fontMetrics.horizontalAdvance(bt->text),
+ text_height = bt->fontMetrics.height();
+ if (bt->toolButtonStyle == Qt::ToolButtonTextUnderIcon) {
width = qMax(width, text_width);
height += text_height;
} else {
@@ -1057,37 +1044,37 @@ static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg
break;
case QStyle::CT_Slider: {
int w = -1;
- const QSlider *sld = qobject_cast<const QSlider *>(widg);
+ const QStyleOptionSlider *sld = qstyleoption_cast<const QStyleOptionSlider *>(opt);
// If this conversion fails then the widget was not what it claimed to be.
if(sld) {
if (sz == QStyleHelper::SizeLarge) {
- if (sld->orientation() == Qt::Horizontal) {
+ if (sld->orientation == Qt::Horizontal) {
w = qt_mac_aqua_get_metric(HSliderHeight);
- if (sld->tickPosition() != QSlider::NoTicks)
+ if (sld->tickPosition != QSlider::NoTicks)
w += qt_mac_aqua_get_metric(HSliderTickHeight);
} else {
w = qt_mac_aqua_get_metric(VSliderWidth);
- if (sld->tickPosition() != QSlider::NoTicks)
+ if (sld->tickPosition != QSlider::NoTicks)
w += qt_mac_aqua_get_metric(VSliderTickWidth);
}
} else if (sz == QStyleHelper::SizeSmall) {
- if (sld->orientation() == Qt::Horizontal) {
+ if (sld->orientation == Qt::Horizontal) {
w = qt_mac_aqua_get_metric(SmallHSliderHeight);
- if (sld->tickPosition() != QSlider::NoTicks)
+ if (sld->tickPosition != QSlider::NoTicks)
w += qt_mac_aqua_get_metric(SmallHSliderTickHeight);
} else {
w = qt_mac_aqua_get_metric(SmallVSliderWidth);
- if (sld->tickPosition() != QSlider::NoTicks)
+ if (sld->tickPosition != QSlider::NoTicks)
w += qt_mac_aqua_get_metric(SmallVSliderTickWidth);
}
} else if (sz == QStyleHelper::SizeMini) {
- if (sld->orientation() == Qt::Horizontal) {
+ if (sld->orientation == Qt::Horizontal) {
w = qt_mac_aqua_get_metric(MiniHSliderHeight);
- if (sld->tickPosition() != QSlider::NoTicks)
+ if (sld->tickPosition != QSlider::NoTicks)
w += qt_mac_aqua_get_metric(MiniHSliderTickHeight);
} else {
w = qt_mac_aqua_get_metric(MiniVSliderWidth);
- if (sld->tickPosition() != QSlider::NoTicks)
+ if (sld->tickPosition != QSlider::NoTicks)
w += qt_mac_aqua_get_metric(MiniVSliderTickWidth);
}
}
@@ -1099,7 +1086,7 @@ static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg
w = qt_mac_aqua_get_metric(HSliderHeight);
w += qt_mac_aqua_get_metric(HSliderTickHeight);
}
- if (sld->orientation() == Qt::Horizontal)
+ if (sld->orientation == Qt::Horizontal)
ret.setHeight(w);
else
ret.setWidth(w);
@@ -1497,9 +1484,9 @@ QStyleHelper::WidgetSizePolicy QMacStylePrivate::aquaSizeConstrain(const QStyleO
return QStyleHelper::SizeDefault;
}
- QSize large = qt_aqua_get_known_size(ct, widg, szHint, QStyleHelper::SizeLarge),
- small = qt_aqua_get_known_size(ct, widg, szHint, QStyleHelper::SizeSmall),
- mini = qt_aqua_get_known_size(ct, widg, szHint, QStyleHelper::SizeMini);
+ QSize large = qt_aqua_get_known_size(ct, option, widg, szHint, QStyleHelper::SizeLarge),
+ small = qt_aqua_get_known_size(ct, option, widg, szHint, QStyleHelper::SizeSmall),
+ mini = qt_aqua_get_known_size(ct, option, widg, szHint, QStyleHelper::SizeMini);
bool guess_size = false;
QStyleHelper::WidgetSizePolicy ret = QStyleHelper::SizeDefault;
QStyleHelper::WidgetSizePolicy wsp = QStyleHelper::widgetSizePolicy(widg);
@@ -1549,7 +1536,7 @@ QStyleHelper::WidgetSizePolicy QMacStylePrivate::aquaSizeConstrain(const QStyleO
#endif
}
-uint qHash(const QMacStylePrivate::CocoaControl &cw, uint seed = 0)
+size_t qHash(const QMacStylePrivate::CocoaControl &cw, size_t seed = 0)
{
return ((cw.type << 2) | cw.size) ^ seed;
}
@@ -1654,24 +1641,24 @@ bool QMacStylePrivate::CocoaControl::getCocoaButtonTypeAndBezelStyle(NSButtonTyp
{
switch (type) {
case Button_CheckBox:
- *buttonType = NSSwitchButton;
- *bezelStyle = NSRegularSquareBezelStyle;
+ *buttonType = NSButtonTypeSwitch;
+ *bezelStyle = NSBezelStyleRegularSquare;
break;
case Button_Disclosure:
- *buttonType = NSOnOffButton;
- *bezelStyle = NSDisclosureBezelStyle;
+ *buttonType = NSButtonTypeOnOff;
+ *bezelStyle = NSBezelStyleDisclosure;
break;
case Button_RadioButton:
- *buttonType = NSRadioButton;
- *bezelStyle = NSRegularSquareBezelStyle;
+ *buttonType = NSButtonTypeRadio;
+ *bezelStyle = NSBezelStyleRegularSquare;
break;
case Button_SquareButton:
- *buttonType = NSPushOnPushOffButton;
- *bezelStyle = NSShadowlessSquareBezelStyle;
+ *buttonType = NSButtonTypePushOnPushOff;
+ *bezelStyle = NSBezelStyleShadowlessSquare;
break;
case Button_PushButton:
- *buttonType = NSPushOnPushOffButton;
- *bezelStyle = NSRoundedBezelStyle;
+ *buttonType = NSButtonTypePushOnPushOff;
+ *bezelStyle = NSBezelStyleRounded;
break;
default:
return false;
@@ -1990,8 +1977,8 @@ NSCell *QMacStylePrivate::cocoaCell(CocoaControl widget) const
break;
case Button_Disclosure: {
NSButtonCell *bc = [[NSButtonCell alloc] init];
- bc.buttonType = NSOnOffButton;
- bc.bezelStyle = NSDisclosureBezelStyle;
+ bc.buttonType = NSButtonTypeOnOff;
+ bc.bezelStyle = NSBezelStyleDisclosure;
cell = bc;
break;
}
@@ -2490,7 +2477,7 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW
aSize = QStyleHelper::SizeSmall;
else
aSize = QStyleHelper::SizeLarge;
- const QSize size = qt_aqua_get_known_size(CT_SizeGrip, widget, QSize(), aSize);
+ const QSize size = qt_aqua_get_known_size(CT_SizeGrip, opt, widget, QSize(), aSize);
ret = size.width();
break; }
case PM_MdiSubWindowFrameWidth:
@@ -2515,7 +2502,7 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW
ret = 4;
break;
case PM_SplitterWidth:
- ret = qMax(7, QApplication::globalStrut().width());
+ ret = 7;
break;
case PM_LayoutLeftMargin:
case PM_LayoutTopMargin:
@@ -2688,7 +2675,7 @@ int QMacStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget *w
case SH_BlinkCursorWhenTextSelected:
ret = false;
break;
- case SH_ScrollBar_StopMouseOverSlider:
+ case SH_Slider_StopMouseOverSlider:
ret = true;
break;
case SH_ListViewExpand_SelectMouseType:
@@ -2767,12 +2754,12 @@ int QMacStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget *w
}
const QRgb *sptr = (QRgb*)img.bits(), *srow;
- const int sbpl = img.bytesPerLine();
+ const qsizetype sbpl = img.bytesPerLine();
const int w = sbpl/4, h = img.height();
QImage img_mask(img.width(), img.height(), QImage::Format_ARGB32);
QRgb *dptr = (QRgb*)img_mask.bits(), *drow;
- const int dbpl = img_mask.bytesPerLine();
+ const qsizetype dbpl = img_mask.bytesPerLine();
for (int y = 0; y < h; ++y) {
srow = sptr+((y*sbpl)/4);
@@ -3263,7 +3250,7 @@ void QMacStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPai
CGContextRestoreGState(cg);
break; }
- case PE_IndicatorViewItemCheck:
+ case PE_IndicatorItemViewItemCheck:
case PE_IndicatorRadioButton:
case PE_IndicatorCheckBox: {
const bool isEnabled = opt->state & State_Enabled;
@@ -3274,8 +3261,8 @@ void QMacStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPai
const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
auto *tb = static_cast<NSButton *>(d->cocoaControl(cw));
tb.enabled = isEnabled;
- tb.state = (opt->state & State_NoChange) ? NSMixedState :
- (opt->state & State_On) ? NSOnState : NSOffState;
+ tb.state = (opt->state & State_NoChange) ? NSControlStateValueMixed :
+ (opt->state & State_On) ? NSControlStateValueOn : NSControlStateValueOff;
[tb highlight:isPressed];
const auto vOffset = [=] {
// As measured
@@ -3297,7 +3284,7 @@ void QMacStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPai
break;
const auto cw = QMacStylePrivate::CocoaControl(QMacStylePrivate::Button_Disclosure, QStyleHelper::SizeLarge);
NSButtonCell *triangleCell = static_cast<NSButtonCell *>(d->cocoaCell(cw));
- [triangleCell setState:(opt->state & State_Open) ? NSOnState : NSOffState];
+ [triangleCell setState:(opt->state & State_Open) ? NSControlStateValueOn : NSControlStateValueOff];
bool viewHasFocus = (w && w->hasFocus()) || (opt->state & State_HasFocus);
[triangleCell setBackgroundStyle:((opt->state & State_Selected) && viewHasFocus) ? NSBackgroundStyleDark : NSBackgroundStyleLight];
@@ -3716,7 +3703,7 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
pb.enabled = isEnabled;
[pb highlight:isPressed];
- pb.state = isHighlighted && !isPressed ? NSOnState : NSOffState;
+ pb.state = isHighlighted && !isPressed ? NSControlStateValueOn : NSControlStateValueOff;
d->drawNSViewInRect(pb, frameRect, p, ^(CGContextRef, const CGRect &r) {
[pb.cell drawBezelWithFrame:r inView:pb.superview];
});
@@ -3941,7 +3928,7 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
pb.enabled = isEnabled;
[pb highlight:isPressed];
// Set off state when inactive. See needsInactiveHack for when it's selected
- pb.state = (isActive && isSelected && !isPressed) ? NSOnState : NSOffState;
+ pb.state = (isActive && isSelected && !isPressed) ? NSControlStateValueOn : NSControlStateValueOff;
const auto drawBezelBlock = ^(CGContextRef ctx, const CGRect &r) {
CGContextClipToRect(ctx, opt->rect.toCGRect());
@@ -5706,12 +5693,12 @@ void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex
const auto cs = d->effectiveAquaSizeConstrain(opt, widget);
const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
auto *pb = static_cast<NSButton *>(d->cocoaControl(cw));
- pb.bezelStyle = NSShadowlessSquareBezelStyle; // TODO Use NSTexturedRoundedBezelStyle in the future.
+ pb.bezelStyle = NSBezelStyleShadowlessSquare; // TODO Use NSTexturedRoundedBezelStyle in the future.
pb.frame = opt->rect.toCGRect();
- pb.buttonType = NSPushOnPushOffButton;
+ pb.buttonType = NSButtonTypePushOnPushOff;
pb.enabled = isEnabled;
[pb highlight:isPressed];
- pb.state = isHighlighted && !isPressed ? NSOnState : NSOffState;
+ pb.state = isHighlighted && !isPressed ? NSControlStateValueOn : NSControlStateValueOff;
const auto buttonRect = proxy()->subControlRect(cc, tb, SC_ToolButton, widget);
d->drawNSViewInRect(pb, buttonRect, p, ^(CGContextRef, const CGRect &rect) {
[pb.cell drawBezelWithFrame:rect inView:pb];
diff --git a/src/plugins/styles/windowsvista/CMakeLists.txt b/src/plugins/styles/windowsvista/CMakeLists.txt
new file mode 100644
index 0000000000..008fa624fe
--- /dev/null
+++ b/src/plugins/styles/windowsvista/CMakeLists.txt
@@ -0,0 +1,27 @@
+# Generated from windowsvista.pro.
+
+#####################################################################
+## QWindowsVistaStylePlugin Plugin:
+#####################################################################
+
+qt_add_plugin(QWindowsVistaStylePlugin
+ OUTPUT_NAME qwindowsvistastyle
+ TYPE styles
+ SOURCES
+ main.cpp
+ qwindowsvistastyle.cpp qwindowsvistastyle_p.h
+ qwindowsvistastyle_p_p.h
+ qwindowsxpstyle.cpp qwindowsxpstyle_p.h
+ qwindowsxpstyle_p_p.h
+ LIBRARIES
+ gdi32
+ user32
+ uxtheme
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::Gui
+ Qt::WidgetsPrivate
+)
+
+#### Keys ignored in scope 1:.:.:windowsvista.pro:<TRUE>:
+# DISTFILES = "windowsvistastyle.json"
diff --git a/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp b/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp
index e43746e79f..67198e701c 100644
--- a/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp
+++ b/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp
@@ -97,10 +97,6 @@ static const int windowsItemVMargin = 0; // menu item ver text margin
static const int windowsArrowHMargin = 6; // arrow horizontal margin
static const int windowsRightBorder = 12; // right border on windows
-// External function calls
-extern Q_WIDGETS_EXPORT HDC qt_win_display_dc();
-extern QRegion qt_region_from_HRGN(HRGN rgn);
-
// Theme names matching the QWindowsXPStylePrivate::Theme enumeration.
static const wchar_t *themeNames[QWindowsXPStylePrivate::NThemes] =
{
@@ -3259,8 +3255,7 @@ int QWindowsXPStyle::pixelMetric(PixelMetric pm, const QStyleOption *option, con
break;
case PM_SplitterWidth:
- res = qMax(int(QStyleHelper::dpiScaled(5., option)),
- QApplication::globalStrut().width());
+ res = QStyleHelper::dpiScaled(5., option);
break;
case PM_MdiSubWindowMinimizedWidth:
diff --git a/src/plugins/styles/windowsvista/qwindowsxpstyle_p_p.h b/src/plugins/styles/windowsvista/qwindowsxpstyle_p_p.h
index 06b37a6e5c..bfba950523 100644
--- a/src/plugins/styles/windowsvista/qwindowsxpstyle_p_p.h
+++ b/src/plugins/styles/windowsvista/qwindowsxpstyle_p_p.h
@@ -153,7 +153,7 @@ struct ThemeMapKey {
};
-inline uint qHash(const ThemeMapKey &key)
+inline size_t qHash(const ThemeMapKey &key)
{ return key.theme ^ key.partId ^ key.stateId; }
inline bool operator==(const ThemeMapKey &k1, const ThemeMapKey &k2)
diff --git a/src/printsupport/CMakeLists.txt b/src/printsupport/CMakeLists.txt
new file mode 100644
index 0000000000..9c73d78267
--- /dev/null
+++ b/src/printsupport/CMakeLists.txt
@@ -0,0 +1,180 @@
+# Generated from printsupport.pro.
+
+#####################################################################
+## PrintSupport Module:
+#####################################################################
+
+qt_add_module(PrintSupport
+ PLUGIN_TYPES printsupport
+ SOURCES
+ kernel/qpaintengine_alpha.cpp kernel/qpaintengine_alpha_p.h
+ kernel/qplatformprintdevice.cpp kernel/qplatformprintdevice.h
+ kernel/qplatformprintersupport.cpp kernel/qplatformprintersupport.h
+ kernel/qplatformprintplugin.cpp kernel/qplatformprintplugin.h
+ kernel/qprint_p.h
+ kernel/qprintdevice.cpp kernel/qprintdevice_p.h
+ kernel/qprintengine.h
+ kernel/qprintengine_pdf.cpp
+ kernel/qprinter.cpp kernel/qprinter.h kernel/qprinter_p.h
+ kernel/qprinterinfo.cpp kernel/qprinterinfo.h kernel/qprinterinfo_p.h
+ kernel/qtprintsupportglobal.h kernel/qtprintsupportglobal_p.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ INCLUDE_DIRECTORIES
+ dialogs
+ widgets
+ LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ Qt::WidgetsPrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::Gui
+ Qt::Widgets
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ Qt::WidgetsPrivate
+)
+
+#### Keys ignored in scope 1:.:.:printsupport.pro:<TRUE>:
+# QMAKE_LIBS = "$$QMAKE_LIBS_PRINTSUPPORT"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(PrintSupport CONDITION QT_FEATURE_printpreviewwidget
+ SOURCES
+ kernel/qpaintengine_preview.cpp kernel/qpaintengine_preview_p.h
+ widgets/qprintpreviewwidget.cpp widgets/qprintpreviewwidget.h
+)
+
+qt_extend_target(PrintSupport CONDITION WIN32
+ SOURCES
+ kernel/qprintengine_win.cpp kernel/qprintengine_win_p.h
+)
+
+qt_extend_target(PrintSupport CONDITION WIN32 AND NOT WINRT
+ LIBRARIES
+ comdlg32
+ gdi32
+ user32
+ winspool
+)
+
+qt_extend_target(PrintSupport CONDITION QT_FEATURE_cups AND UNIX AND NOT APPLE
+ SOURCES
+ kernel/qcups.cpp kernel/qcups_p.h
+)
+
+qt_extend_target(PrintSupport CONDITION QT_FEATURE_cupsjobwidget AND UNIX AND NOT APPLE
+ SOURCES
+ widgets/qcupsjobwidget.cpp widgets/qcupsjobwidget.ui widgets/qcupsjobwidget_p.h
+ ENABLE_AUTOGEN_TOOLS
+ uic
+)
+
+qt_extend_target(PrintSupport CONDITION QT_FEATURE_printdialog
+ SOURCES
+ dialogs/qabstractprintdialog.cpp dialogs/qabstractprintdialog.h dialogs/qabstractprintdialog_p.h
+ dialogs/qpagesetupdialog.cpp dialogs/qpagesetupdialog.h dialogs/qpagesetupdialog_p.h
+ dialogs/qpagesetupwidget.ui
+ dialogs/qprintdialog.h
+ ENABLE_AUTOGEN_TOOLS
+ uic
+)
+
+if(QT_FEATURE_printdialog)
+ # Resources:
+ set(qprintdialog_resource_files
+ "images/fit-page-24.png"
+ "images/fit-page-32.png"
+ "images/fit-width-24.png"
+ "images/fit-width-32.png"
+ "images/go-first-24.png"
+ "images/go-first-32.png"
+ "images/go-last-24.png"
+ "images/go-last-32.png"
+ "images/go-next-24.png"
+ "images/go-next-32.png"
+ "images/go-previous-24.png"
+ "images/go-previous-32.png"
+ "images/layout-landscape-24.png"
+ "images/layout-landscape-32.png"
+ "images/layout-portrait-24.png"
+ "images/layout-portrait-32.png"
+ "images/page-setup-24.png"
+ "images/page-setup-32.png"
+ "images/print-24.png"
+ "images/print-32.png"
+ "images/view-page-multi-24.png"
+ "images/view-page-multi-32.png"
+ "images/view-page-one-24.png"
+ "images/view-page-one-32.png"
+ "images/view-page-sided-24.png"
+ "images/view-page-sided-32.png"
+ "images/zoom-in-24.png"
+ "images/zoom-in-32.png"
+ "images/zoom-out-24.png"
+ "images/zoom-out-32.png"
+ )
+
+ qt_add_resource(PrintSupport "qprintdialog"
+ PREFIX
+ "/qt-project.org/dialogs/qprintpreviewdialog"
+ BASE
+ "dialogs"
+ FILES
+ ${qprintdialog_resource_files}
+ )
+ set(qprintdialog1_resource_files
+ "images/status-color.png"
+ "images/status-gray-scale.png"
+ )
+
+ qt_add_resource(PrintSupport "qprintdialog1"
+ PREFIX
+ "/qt-project.org/dialogs/qprintdialog"
+ BASE
+ "dialogs"
+ FILES
+ ${qprintdialog1_resource_files}
+ )
+endif()
+
+qt_extend_target(PrintSupport CONDITION MACOS AND QT_FEATURE_printdialog
+ SOURCES
+ dialogs/qpagesetupdialog_mac.mm
+ dialogs/qprintdialog_mac.mm
+ LIBRARIES
+ ${FWAppKit}
+)
+
+qt_extend_target(PrintSupport CONDITION QT_FEATURE_printdialog AND WIN32
+ SOURCES
+ dialogs/qpagesetupdialog_win.cpp
+ dialogs/qprintdialog_win.cpp
+)
+
+qt_extend_target(PrintSupport CONDITION QT_FEATURE_printdialog AND UNIX AND NOT APPLE
+ SOURCES
+ dialogs/qpagesetupdialog_unix.cpp dialogs/qpagesetupdialog_unix_p.h
+ dialogs/qprintdialog_unix.cpp
+ dialogs/qprintpropertieswidget.ui
+ dialogs/qprintsettingsoutput.ui
+ dialogs/qprintwidget.ui
+ INCLUDE_DIRECTORIES
+ ${QT_SOURCE_TREE}/src/plugins/printsupport/cups
+ ENABLE_AUTOGEN_TOOLS
+ uic
+)
+
+qt_extend_target(PrintSupport CONDITION QT_FEATURE_printpreviewdialog
+ SOURCES
+ dialogs/qprintpreviewdialog.cpp dialogs/qprintpreviewdialog.h
+)
+qt_add_docs(PrintSupport
+ doc/qtprintsupport.qdocconf
+)
+
diff --git a/src/printsupport/configure.cmake b/src/printsupport/configure.cmake
new file mode 100644
index 0000000000..d9f63140af
--- /dev/null
+++ b/src/printsupport/configure.cmake
@@ -0,0 +1,61 @@
+
+
+#### Inputs
+
+
+
+#### Libraries
+
+qt_find_package(Cups PROVIDED_TARGETS Cups::Cups)
+
+
+#### Tests
+
+
+
+#### Features
+
+qt_feature("cups" PUBLIC PRIVATE
+ SECTION "Painting"
+ LABEL "CUPS"
+ PURPOSE "Provides support for the Common Unix Printing System."
+ CONDITION Cups_FOUND AND QT_FEATURE_printer AND QT_FEATURE_datestring
+)
+qt_feature_definition("cups" "QT_NO_CUPS" NEGATE VALUE "1")
+qt_feature("cupsjobwidget" PUBLIC PRIVATE
+ SECTION "Widgets"
+ LABEL "CUPS job control widget"
+ CONDITION ( QT_FEATURE_buttongroup ) AND ( QT_FEATURE_calendarwidget ) AND ( QT_FEATURE_checkbox ) AND ( QT_FEATURE_combobox ) AND ( QT_FEATURE_cups ) AND ( QT_FEATURE_datetimeedit ) AND ( QT_FEATURE_groupbox ) AND ( QT_FEATURE_tablewidget )
+)
+qt_feature_definition("cupsjobwidget" "QT_NO_CUPSJOBWIDGET" NEGATE VALUE "1")
+qt_feature("printer" PUBLIC
+ SECTION "Painting"
+ LABEL "QPrinter"
+ PURPOSE "Provides a printer backend of QPainter."
+ CONDITION NOT UIKIT AND NOT WINRT AND QT_FEATURE_picture AND QT_FEATURE_temporaryfile AND QT_FEATURE_pdf
+)
+qt_feature_definition("printer" "QT_NO_PRINTER" NEGATE VALUE "1")
+qt_feature("printpreviewwidget" PUBLIC
+ SECTION "Widgets"
+ LABEL "QPrintPreviewWidget"
+ PURPOSE "Provides a widget for previewing page layouts for printer output."
+ CONDITION QT_FEATURE_graphicsview AND QT_FEATURE_printer AND QT_FEATURE_mainwindow
+)
+qt_feature_definition("printpreviewwidget" "QT_NO_PRINTPREVIEWWIDGET" NEGATE VALUE "1")
+qt_feature("printdialog" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QPrintDialog"
+ PURPOSE "Provides a dialog widget for specifying printer configuration."
+ CONDITION ( QT_FEATURE_buttongroup ) AND ( QT_FEATURE_checkbox ) AND ( QT_FEATURE_combobox ) AND ( QT_FEATURE_dialog ) AND ( QT_FEATURE_datetimeedit ) AND ( QT_FEATURE_dialogbuttonbox ) AND ( QT_FEATURE_printer ) AND ( QT_FEATURE_radiobutton ) AND ( QT_FEATURE_spinbox ) AND ( QT_FEATURE_tabwidget ) AND ( QT_FEATURE_treeview )
+)
+qt_feature_definition("printdialog" "QT_NO_PRINTDIALOG" NEGATE VALUE "1")
+qt_feature("printpreviewdialog" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QPrintPreviewDialog"
+ PURPOSE "Provides a dialog for previewing and configuring page layouts for printer output."
+ CONDITION QT_FEATURE_printpreviewwidget AND QT_FEATURE_printdialog AND QT_FEATURE_toolbar AND QT_FEATURE_formlayout
+)
+qt_feature_definition("printpreviewdialog" "QT_NO_PRINTPREVIEWDIALOG" NEGATE VALUE "1")
+qt_configure_add_summary_section(NAME "Qt PrintSupport")
+qt_configure_add_summary_entry(ARGS "cups")
+qt_configure_end_summary_section() # end of "Qt PrintSupport" section
diff --git a/src/printsupport/dialogs/qpagesetupdialog_unix.cpp b/src/printsupport/dialogs/qpagesetupdialog_unix.cpp
index 78e5b8d1ef..2b7c0ce6ec 100644
--- a/src/printsupport/dialogs/qpagesetupdialog_unix.cpp
+++ b/src/printsupport/dialogs/qpagesetupdialog_unix.cpp
@@ -274,21 +274,21 @@ QPageSetupWidget::QPageSetupWidget(QWidget *parent)
initUnits();
initPagesPerSheet();
- connect(m_ui.unitCombo, QOverload<int>::of(&QComboBox::activated), this, &QPageSetupWidget::unitChanged);
+ connect(m_ui.unitCombo, &QComboBox::activated, this, &QPageSetupWidget::unitChanged);
- connect(m_ui.pageSizeCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &QPageSetupWidget::pageSizeChanged);
- connect(m_ui.pageWidth, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &QPageSetupWidget::pageSizeChanged);
- connect(m_ui.pageHeight, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &QPageSetupWidget::pageSizeChanged);
+ connect(m_ui.pageSizeCombo, &QComboBox::currentIndexChanged, this, &QPageSetupWidget::pageSizeChanged);
+ connect(m_ui.pageWidth, &QDoubleSpinBox::valueChanged, this, &QPageSetupWidget::pageSizeChanged);
+ connect(m_ui.pageHeight, &QDoubleSpinBox::valueChanged, this, &QPageSetupWidget::pageSizeChanged);
- connect(m_ui.leftMargin, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &QPageSetupWidget::leftMarginChanged);
- connect(m_ui.topMargin, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &QPageSetupWidget::topMarginChanged);
- connect(m_ui.rightMargin, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &QPageSetupWidget::rightMarginChanged);
- connect(m_ui.bottomMargin, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &QPageSetupWidget::bottomMarginChanged);
+ connect(m_ui.leftMargin, &QDoubleSpinBox::valueChanged, this, &QPageSetupWidget::leftMarginChanged);
+ connect(m_ui.topMargin, &QDoubleSpinBox::valueChanged, this, &QPageSetupWidget::topMarginChanged);
+ connect(m_ui.rightMargin, &QDoubleSpinBox::valueChanged, this, &QPageSetupWidget::rightMarginChanged);
+ connect(m_ui.bottomMargin, &QDoubleSpinBox::valueChanged, this, &QPageSetupWidget::bottomMarginChanged);
connect(m_ui.portrait, &QRadioButton::clicked, this, &QPageSetupWidget::pageOrientationChanged);
connect(m_ui.landscape, &QRadioButton::clicked, this, &QPageSetupWidget::pageOrientationChanged);
- connect(m_ui.pagesPerSheetCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &QPageSetupWidget::pagesPerSheetChanged);
+ connect(m_ui.pagesPerSheetCombo, &QComboBox::currentIndexChanged, this, &QPageSetupWidget::pagesPerSheetChanged);
}
// Init the Units combo box
diff --git a/src/printsupport/dialogs/qprintdialog_unix.cpp b/src/printsupport/dialogs/qprintdialog_unix.cpp
index bf77666c41..cc6694d471 100644
--- a/src/printsupport/dialogs/qprintdialog_unix.cpp
+++ b/src/printsupport/dialogs/qprintdialog_unix.cpp
@@ -59,6 +59,7 @@
#include <QtWidgets/qstyleditemdelegate.h>
#include <QtWidgets/qformlayout.h>
#include <QtPrintSupport/qprinter.h>
+#include <QtGui/qrangecollection.h>
#include <qpa/qplatformprintplugin.h>
#include <qpa/qplatformprintersupport.h>
@@ -67,6 +68,10 @@
#include <QtWidgets/qdialogbuttonbox.h>
+#if QT_CONFIG(regularexpression)
+#include <qregularexpression.h>
+#endif
+
#if QT_CONFIG(completer)
#include <private/qcompleter_p.h>
#endif
@@ -487,7 +492,7 @@ bool QPrintPropertiesDialog::createAdvancedOptionsWidget()
if (choicesCb->count() > 1) {
- connect(choicesCb, QOverload<int>::of(&QComboBox::currentIndexChanged), this, setPpdOptionFromCombo);
+ connect(choicesCb, &QComboBox::currentIndexChanged, this, setPpdOptionFromCombo);
// We need an extra label at the end to show the conflict warning
QWidget *choicesCbWithLabel = new QWidget();
@@ -741,85 +746,6 @@ void QPrintDialogPrivate::selectPrinter(const QPrinter::OutputFormat outputForma
}
#if QT_CONFIG(cups)
-static std::vector<std::pair<int, int>> pageRangesFromString(const QString &pagesString) noexcept
-{
- std::vector<std::pair<int, int>> result;
- const QStringList items = pagesString.split(',');
- for (const QString &item : items) {
- if (item.isEmpty())
- return {};
-
- if (item.contains(QLatin1Char('-'))) {
- const QStringList rangeItems = item.split('-');
- if (rangeItems.count() != 2)
- return {};
-
- bool ok;
- const int number1 = rangeItems[0].toInt(&ok);
- if (!ok)
- return {};
-
- const int number2 = rangeItems[1].toInt(&ok);
- if (!ok)
- return {};
-
- if (number1 < 1 || number2 < 1 || number2 < number1)
- return {};
-
- result.push_back(std::make_pair(number1, number2));
-
- } else {
- bool ok;
- const int number = item.toInt(&ok);
- if (!ok)
- return {};
-
- if (number < 1)
- return {};
-
- result.push_back(std::make_pair(number, number));
- }
- }
-
- // check no range intersects with the next
- std::sort(result.begin(), result.end(),
- [](const std::pair<int, int> &it1, const std::pair<int, int> &it2) { return it1.first < it2.first; });
- int previousSecond = -1;
- for (auto pair : result) {
- if (pair.first <= previousSecond)
- return {};
-
- previousSecond = pair.second;
- }
-
- return result;
-}
-
-static QString stringFromPageRanges(const std::vector<std::pair<int, int>> &pageRanges) noexcept
-{
- QString result;
-
- for (auto pair : pageRanges) {
- if (!result.isEmpty())
- result += QLatin1Char(',');
-
- if (pair.first == pair.second)
- result += QString::number(pair.first);
- else
- result += QStringLiteral("%1-%2").arg(pair.first).arg(pair.second);
- }
-
- return result;
-}
-
-static bool isValidPagesString(const QString &pagesString) noexcept
-{
- if (pagesString.isEmpty())
- return false;
-
- auto pagesRanges = pageRangesFromString(pagesString);
- return !pagesRanges.empty();
-}
void QPrintDialogPrivate::updatePpdDuplexOption(QRadioButton *radio)
{
@@ -890,13 +816,11 @@ void QPrintDialogPrivate::setupPrinter()
#if QT_CONFIG(cups)
if (options.pagesRadioButton->isChecked()) {
- auto pageRanges = pageRangesFromString(options.pagesLineEdit->text());
-
- p->setPrintRange(QPrinter::AllPages);
- p->setFromTo(0, 0);
+ p->setPrintRange(QPrinter::PageRange);
+ p->rangeCollection()->parse(options.pagesLineEdit->text());
// server-side page filtering
- QCUPSSupport::setPageRange(p, stringFromPageRanges(pageRanges));
+ QCUPSSupport::setPageRange(p, p->rangeCollection()->toString());
}
// page set
@@ -1096,7 +1020,7 @@ void QPrintDialog::accept()
{
Q_D(QPrintDialog);
#if QT_CONFIG(cups)
- if (d->options.pagesRadioButton->isChecked() && !isValidPagesString(d->options.pagesLineEdit->text())) {
+ if (d->options.pagesRadioButton->isChecked() && printer()->rangeCollection()->isEmpty()) {
QMessageBox::critical(this, tr("Invalid Pages Definition"),
tr("%1 does not follow the correct syntax. Please use ',' to separate "
"ranges and pages, '-' to define ranges and make sure ranges do "
@@ -1434,10 +1358,13 @@ QUnixPrintWidget::QUnixPrintWidget(QPrinter *printer, QWidget *parent)
if (printer->docName().isEmpty()) {
cur += QStringLiteral("print.pdf");
} else {
- const QRegExp re(QStringLiteral("(.*)\\.\\S+"));
- if (re.exactMatch(printer->docName()))
- cur += re.cap(1);
+#if QT_CONFIG(regularexpression)
+ const QRegularExpression re(QStringLiteral("(.*)\\.\\S+"));
+ auto match = re.match(printer->docName());
+ if (match.hasMatch())
+ cur += match.captured(1);
else
+#endif
cur += printer->docName();
cur += QStringLiteral(".pdf");
}
diff --git a/src/printsupport/dialogs/qprintpreviewdialog.cpp b/src/printsupport/dialogs/qprintpreviewdialog.cpp
index 39575d5f57..e9f2b5e882 100644
--- a/src/printsupport/dialogs/qprintpreviewdialog.cpp
+++ b/src/printsupport/dialogs/qprintpreviewdialog.cpp
@@ -42,7 +42,8 @@
#include <private/qprinter_p.h>
#include "qprintdialog.h"
-#include <QtWidgets/qaction.h>
+#include <QtGui/qaction.h>
+#include <QtGui/qactiongroup.h>
#include <QtWidgets/qboxlayout.h>
#include <QtWidgets/qcombobox.h>
#include <QtWidgets/qlineedit.h>
diff --git a/src/printsupport/kernel/qcups.cpp b/src/printsupport/kernel/qcups.cpp
index 0fc8cdd1b7..ab9b2889e2 100644
--- a/src/printsupport/kernel/qcups.cpp
+++ b/src/printsupport/kernel/qcups.cpp
@@ -167,7 +167,7 @@ ppd_option_t *QCUPSSupport::findPpdOption(const char *optionName, QPrintDevice *
return nullptr;
}
-void QCUPSSupport::setJobHold(QPrinter *printer, const JobHoldUntil jobHold, const QTime &holdUntilTime)
+void QCUPSSupport::setJobHold(QPrinter *printer, const JobHoldUntil jobHold, QTime holdUntilTime)
{
const QString jobHoldUntilArgument = jobHoldToString(jobHold, holdUntilTime);
if (!jobHoldUntilArgument.isEmpty()) {
diff --git a/src/printsupport/kernel/qcups_p.h b/src/printsupport/kernel/qcups_p.h
index 57ec281383..4d72230b90 100644
--- a/src/printsupport/kernel/qcups_p.h
+++ b/src/printsupport/kernel/qcups_p.h
@@ -137,7 +137,7 @@ public:
static void clearCupsOption(QPrinter *printer, const QString &option);
static void clearCupsOptions(QPrinter *printer);
- static void setJobHold(QPrinter *printer, const JobHoldUntil jobHold = NoHold, const QTime &holdUntilTime = QTime());
+ static void setJobHold(QPrinter *printer, const JobHoldUntil jobHold = NoHold, QTime holdUntilTime = QTime());
static void setJobBilling(QPrinter *printer, const QString &jobBilling = QString());
static void setJobPriority(QPrinter *printer, int priority = 50);
static void setBannerPages(QPrinter *printer, const BannerPage startBannerPage, const BannerPage endBannerPage);
@@ -159,7 +159,7 @@ public:
struct JobHoldUntilWithTime
{
- JobHoldUntilWithTime(JobHoldUntil jh = NoHold, const QTime &t = QTime())
+ JobHoldUntilWithTime(JobHoldUntil jh = NoHold, QTime t = QTime())
: jobHold(jh), time(t) {}
JobHoldUntil jobHold;
diff --git a/src/printsupport/kernel/qprinter.cpp b/src/printsupport/kernel/qprinter.cpp
index fbf5e5c2ba..25855d6da7 100644
--- a/src/printsupport/kernel/qprinter.cpp
+++ b/src/printsupport/kernel/qprinter.cpp
@@ -49,6 +49,7 @@
#include "qlist.h"
#include <qcoreapplication.h>
#include <qfileinfo.h>
+#include <QtGui/qrangecollection.h>
#include <private/qpagedpaintdevice_p.h>
@@ -1981,12 +1982,12 @@ void QPrinter::setPrinterSelectionOption(const QString &option)
\note If fromPage() and toPage() both return 0, this indicates that
\e{the whole document will be printed}.
- \sa setFromTo(), toPage()
+ \sa setFromTo(), toPage(), rangeCollection()
*/
int QPrinter::fromPage() const
{
- return d->fromPage;
+ return d->rangeCollection->firstPage();
}
/*!
@@ -2005,12 +2006,12 @@ int QPrinter::fromPage() const
The programmer is responsible for reading this setting and
printing accordingly.
- \sa setFromTo(), fromPage()
+ \sa setFromTo(), fromPage(), rangeCollection()
*/
int QPrinter::toPage() const
{
- return d->toPage;
+ return d->rangeCollection->lastPage();
}
/*!
@@ -2027,17 +2028,25 @@ int QPrinter::toPage() const
This function is mostly used to set a default value that the user can
override in the print dialog when you call setup().
- \sa fromPage(), toPage()
+ \sa fromPage(), toPage(), rangeCollection()
*/
void QPrinter::setFromTo(int from, int to)
{
- if (from > to) {
- qWarning("QPrinter::setFromTo: 'from' must be less than or equal to 'to'");
- from = to;
- }
- d->fromPage = from;
- d->toPage = to;
+ d->rangeCollection->clear();
+ d->rangeCollection->addRange(from, to);
+}
+
+/*!
+ \since 6.0
+
+ Returns the range collection associated with this device.
+
+ \sa QRangeCollection, fromPage(), toPage()
+*/
+QRangeCollection *QPrinter::rangeCollection()
+{
+ return d->rangeCollection;
}
/*!
diff --git a/src/printsupport/kernel/qprinter.h b/src/printsupport/kernel/qprinter.h
index 28dca78a63..e606ceba47 100644
--- a/src/printsupport/kernel/qprinter.h
+++ b/src/printsupport/kernel/qprinter.h
@@ -56,6 +56,7 @@ QT_BEGIN_NAMESPACE
#endif
class QPrinterPrivate;
+class QRangeCollection;
class QPaintEngine;
class QPrintEngine;
class QPrinterInfo;
@@ -249,6 +250,8 @@ public:
int fromPage() const;
int toPage() const;
+ QRangeCollection *rangeCollection();
+
void setPrintRange(PrintRange range);
PrintRange printRange() const;
diff --git a/src/printsupport/widgets/qcupsjobwidget.cpp b/src/printsupport/widgets/qcupsjobwidget.cpp
index 456ed9db19..43729d1fc6 100644
--- a/src/printsupport/widgets/qcupsjobwidget.cpp
+++ b/src/printsupport/widgets/qcupsjobwidget.cpp
@@ -125,7 +125,7 @@ void QCupsJobWidget::initJobHold()
m_ui.jobHoldComboBox->addItem(tr("Weekend (Saturday to Sunday)"), QVariant::fromValue(QCUPSSupport::Weekend));
m_ui.jobHoldComboBox->addItem(tr("Specific Time"), QVariant::fromValue(QCUPSSupport::SpecificTime));
- connect(m_ui.jobHoldComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &QCupsJobWidget::toggleJobHoldTime);
+ connect(m_ui.jobHoldComboBox, &QComboBox::currentIndexChanged, this, &QCupsJobWidget::toggleJobHoldTime);
QCUPSSupport::JobHoldUntilWithTime jobHoldWithTime;
@@ -138,7 +138,7 @@ void QCupsJobWidget::initJobHold()
toggleJobHoldTime();
}
-void QCupsJobWidget::setJobHold(QCUPSSupport::JobHoldUntil jobHold, const QTime &holdUntilTime)
+void QCupsJobWidget::setJobHold(QCUPSSupport::JobHoldUntil jobHold, QTime holdUntilTime)
{
if (jobHold == QCUPSSupport::SpecificTime && holdUntilTime.isNull()) {
jobHold = QCUPSSupport::NoHold;
diff --git a/src/printsupport/widgets/qcupsjobwidget_p.h b/src/printsupport/widgets/qcupsjobwidget_p.h
index 42da9c7580..d73f116a69 100644
--- a/src/printsupport/widgets/qcupsjobwidget_p.h
+++ b/src/printsupport/widgets/qcupsjobwidget_p.h
@@ -83,7 +83,7 @@ private Q_SLOTS:
private:
- void setJobHold(QCUPSSupport::JobHoldUntil jobHold = QCUPSSupport::NoHold, const QTime &holdUntilTime = QTime());
+ void setJobHold(QCUPSSupport::JobHoldUntil jobHold = QCUPSSupport::NoHold, QTime holdUntilTime = QTime());
QCUPSSupport::JobHoldUntil jobHold() const;
QTime jobHoldTime() const;
diff --git a/src/sql/CMakeLists.txt b/src/sql/CMakeLists.txt
new file mode 100644
index 0000000000..1bf3a3df2a
--- /dev/null
+++ b/src/sql/CMakeLists.txt
@@ -0,0 +1,57 @@
+# Generated from sql.pro.
+
+#####################################################################
+## Sql Module:
+#####################################################################
+
+qt_add_module(Sql
+ PLUGIN_TYPES sqldrivers
+ SOURCES
+ kernel/qsqlcachedresult.cpp kernel/qsqlcachedresult_p.h
+ kernel/qsqldatabase.cpp kernel/qsqldatabase.h
+ kernel/qsqldriver.cpp kernel/qsqldriver.h kernel/qsqldriver_p.h
+ kernel/qsqldriverplugin.cpp kernel/qsqldriverplugin.h
+ kernel/qsqlerror.cpp kernel/qsqlerror.h
+ kernel/qsqlfield.cpp kernel/qsqlfield.h
+ kernel/qsqlindex.cpp kernel/qsqlindex.h
+ kernel/qsqlnulldriver_p.h
+ kernel/qsqlquery.cpp kernel/qsqlquery.h
+ kernel/qsqlrecord.cpp kernel/qsqlrecord.h
+ kernel/qsqlresult.cpp kernel/qsqlresult.h kernel/qsqlresult_p.h
+ kernel/qtsqlglobal.h kernel/qtsqlglobal_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+ PRECOMPILED_HEADER
+ "../corelib/global/qt_pch.h"
+)
+
+#### Keys ignored in scope 1:.:.:sql.pro:<TRUE>:
+# SQL_P = "sql"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(Sql CONDITION MSVC AND (TEST_architecture_arch STREQUAL "i386")
+ LINK_OPTIONS
+ "/BASE:0x62000000"
+)
+
+qt_extend_target(Sql CONDITION QT_FEATURE_sqlmodel
+ SOURCES
+ models/qsqlquerymodel.cpp models/qsqlquerymodel.h models/qsqlquerymodel_p.h
+ models/qsqlrelationaldelegate.cpp models/qsqlrelationaldelegate.h
+ models/qsqlrelationaltablemodel.cpp models/qsqlrelationaltablemodel.h
+ models/qsqltablemodel.cpp models/qsqltablemodel.h models/qsqltablemodel_p.h
+)
+qt_add_docs(Sql
+ doc/qtsql.qdocconf
+)
+
diff --git a/src/sql/configure.cmake b/src/sql/configure.cmake
new file mode 100644
index 0000000000..552b6846c7
--- /dev/null
+++ b/src/sql/configure.cmake
@@ -0,0 +1,24 @@
+
+
+#### Inputs
+
+
+
+#### Libraries
+
+
+
+#### Tests
+
+
+
+#### Features
+
+qt_feature("sqlmodel" PUBLIC
+ LABEL "SQL item models"
+ PURPOSE "Provides item model classes backed by SQL databases."
+ CONDITION QT_FEATURE_itemmodel
+)
+qt_configure_add_summary_section(NAME "Qt Sql")
+qt_configure_add_summary_entry(ARGS "sqlmodel")
+qt_configure_end_summary_section() # end of "Qt Sql" section
diff --git a/src/sql/doc/snippets/code/doc_src_sql-driver.cpp b/src/sql/doc/snippets/code/doc_src_sql-driver.cpp
index 6b5a5e0335..acfd31ee3a 100644
--- a/src/sql/doc/snippets/code/doc_src_sql-driver.cpp
+++ b/src/sql/doc/snippets/code/doc_src_sql-driver.cpp
@@ -139,7 +139,7 @@ while (query1.next()) {
void setConnString()
{
//! [39]
-QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");
+QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
QString connectString = QStringLiteral(
"DRIVER=/path/to/installation/libodbcHDB.so;"
"SERVERNODE=hostname:port;"
diff --git a/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc b/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc
index b869b309b7..df4aa0fb34 100644
--- a/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc
+++ b/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc
@@ -54,7 +54,7 @@
Database options:
-sql-<driver> ........ Enable SQL <driver> plugin. Supported drivers:
- db2 ibase mysql oci odbc psql sqlite2 sqlite tds
+ db2 ibase mysql oci odbc psql sqlite
[all auto]
-sqlite .............. Select used sqlite3 [system/qt]
@@ -146,21 +146,6 @@ nmake install
//! [15]
-//! [16]
-cd $QTDIR/qtbase/src/plugins/sqldrivers
-qmake -- TDS_PREFIX=$SYBASE
-make sub-tds
-//! [16]
-
-
-//! [17]
-cd %QTDIR%\qtbase\src\plugins\sqldrivers
-qmake
-nmake sub-tds
-nmake install
-//! [17]
-
-
//! [18]
cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- DB2_PREFIX=$DB2DIR
@@ -235,7 +220,7 @@ make sub-oci
//! [35]
QSqlDatabase: QPSQL driver not loaded
-QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QMARIADB QODBC QODBC3 QPSQL QPSQL7
+QSqlDatabase: available drivers: QSQLITE QMYSQL QMARIADB QODBC QPSQL
Could not create database object
//! [35]
@@ -271,8 +256,6 @@ Checking for MySQL... yes
Checking for OCI (Oracle)... no
Checking for ODBC... yes
Checking for PostgreSQL... no
-Checking for SQLite (version 2)... no
-Checking for TDS (Sybase)... no
Done running configuration tests.
Configure summary:
@@ -284,10 +267,8 @@ Qt Sql Drivers:
OCI (Oracle) ........................... no
ODBC ................................... yes
PostgreSQL ............................. no
- SQLite2 ................................ no
SQLite ................................. yes
Using system provided SQLite ......... no
- TDS (Sybase) ........................... no
Qt is now configured for building. Just run 'mingw32-make'.
Once everything is built, you must run 'mingw32-make install'.
diff --git a/src/sql/doc/src/qsqldatatype-table.qdoc b/src/sql/doc/src/qsqldatatype-table.qdoc
index aafbed6096..1c5ab741c9 100644
--- a/src/sql/doc/src/qsqldatatype-table.qdoc
+++ b/src/sql/doc/src/qsqldatatype-table.qdoc
@@ -502,67 +502,4 @@
\li The value is a BLOB of data, stored exactly as it was input.
\li Mapped to QByteArray
\endtable
-
- \section2 Sybase Adaptive Server Data Types
-
- \table 90%
- \header
- \li Sybase Adaptive Server data type
- \li SQL type description
- \li Recommended input (C++ or Qt data type)
- \row
- \li BINARY
- \li Describes a fixed-length binary value up to 255 bytes in size.
- \li Mapped to QByteArray
- \row
- \li CHAR
- \li Character String
- \li Mapped to QString
- \row
- \li DATETIME
- \li Date and time. Range: 1753-01-01 00:00:00 through 9999-12-31 23:59:59.
- \li Mapped to QDateTime
- \row
- \li NCHAR
- \li Character String of fixed length
- \li Mapped to QString
- \row
- \li NVARACHAR
- \li Character String of variable length
- \li Mapped to QString
- \row
- \li VARCHAR
- \li Character String of fixed length
- \li Mapped to QString
- \row
- \li CLOB
- \li Character large string object
- \li Mapped to QString
- \row
- \li TIMESTAMP
- \li A unique number within a database
- \li Mapped to QString
- \row
- \li SMALLDATETIME
- \li Date and time. Range: 1900-01-01 00:00 through 2079-12-31 23:59
- \li Mapped to QDateTime
- \row
- \li UNICHAR
- \li Character String of fixed length.(Unicode)
- \li Mapped to QString
- \row
- \li UNIVARCHAR
- \li Character String of variable length.(Unicode)
- \li Mapped to QString
- \row
- \li VARBINARY
- \li Describes a variable-length binary value up to 255 bytes in size
- \li Mapped to QByteArray
- \endtable
-
- \section2 SQLite Version 2
-
- SQLite version 2 is "typeless". This means that you can store any kind of
- data you want in any column of any table, regardless of the declared
- data type of that column. We recommend that you map the data to QString.
*/
diff --git a/src/sql/doc/src/sql-driver.qdoc b/src/sql/doc/src/sql-driver.qdoc
index 9ec50c0622..2747d934b2 100644
--- a/src/sql/doc/src/sql-driver.qdoc
+++ b/src/sql/doc/src/sql-driver.qdoc
@@ -54,9 +54,7 @@
\li Open Database Connectivity (ODBC) - Microsoft SQL Server and other
ODBC-compliant databases
\row \li \l{#QPSQL}{QPSQL} \li PostgreSQL (versions 7.3 and above)
- \row \li \l{#QSQLITE2}{QSQLITE2} \li SQLite version 2 \note obsolete since Qt 5.14
\row \li \l{#QSQLITE}{QSQLITE} \li SQLite version 3
- \row \li \l{#QTDS}{QTDS} \li Sybase Adaptive Server \note obsolete since Qt 4.7
\endtable
SQLite is the in-process database system with the best test coverage
@@ -504,49 +502,6 @@
in your installation package. It must be placed in the same folder
as the application executable.
- \target QTDS
- \section2 QTDS for Sybase Adaptive Server
-
- \note TDS is no longer used by MS Sql Server, and is superseded by
- \l{QODBC}{ODBC}. QTDS is obsolete from Qt 4.7.
-
- It is not possible to set the port with QSqlDatabase::setPort() due to limitations in the
- Sybase client library. Refer to the Sybase documentation for information on how to set up
- a Sybase client configuration file to enable connections to databases on non-default ports.
-
- \section3 How to Build the QTDS Plugin on Unix and \macos
-
- Under Unix, two libraries are available which support the TDS protocol:
-
- \list
- \li FreeTDS, a free implementation of the TDS protocol
- (\l{http://www.freetds.org}).
-
- \li Sybase Open Client, available from \l{https://support.sap.com}.
- \endlist
-
- Regardless of which library you use, the shared object file
- \c{libsybdb.so} is needed. Set the \c SYBASE environment variable to
- point to the directory where you installed the client library and
- execute \c{qmake}:
-
- \snippet code/doc_src_sql-driver.qdoc 16
-
- \section3 How to Build the QDTS Plugin on Windows
-
- You can either use the DB-Library supplied by Microsoft or the Sybase
- Open Client (\l{https://support.sap.com}). Configure will try to find
- NTWDBLIB.LIB to build the plugin:
-
- \snippet code/doc_src_sql-driver.qdoc 17
-
- By default, the Microsoft library is used on Windows. If you want to
- force the use of the Sybase Open Client, you must define \c
- Q_USE_SYBASE in \c{%QTDIR%\qtbase\src\plugins\sqldrivers\tds\qsql_tds.cpp}.
-
- If you are not using a Microsoft compiler, replace \c nmake
- with \c mingw32-make in the line above.
-
\target QDB2
\section2 QDB2 for IBM DB2 (Version 7.1 and Above)
@@ -575,13 +530,6 @@
If you are not using a Microsoft compiler, replace \c nmake
with \c mingw32-make in the line above.
- \target QSQLITE2
- \section2 QSQLITE2 for SQLite Version 2
-
- The Qt SQLite 2 plugin is offered for compatibility. Whenever
- possible, use the \l{#QSQLITE}{version 3 plugin} instead. The
- build instructions for version 3 apply to version 2 as well.
-
\target QSQLITE
\section2 QSQLITE for SQLite (Version 3 and Above)
diff --git a/src/sql/kernel/qsqlcachedresult.cpp b/src/sql/kernel/qsqlcachedresult.cpp
index c335d7d8fe..1e76154f82 100644
--- a/src/sql/kernel/qsqlcachedresult.cpp
+++ b/src/sql/kernel/qsqlcachedresult.cpp
@@ -60,14 +60,6 @@ QT_BEGIN_NAMESPACE
static const uint initial_cache_size = 128;
-QSqlCachedResultPrivate::QSqlCachedResultPrivate(QSqlCachedResult *q, const QSqlDriver *drv)
- : QSqlResultPrivate(q, drv),
- rowCacheEnd(0),
- colCount(0),
- atEnd(false)
-{
-}
-
void QSqlCachedResultPrivate::cleanup()
{
cache.clear();
diff --git a/src/sql/kernel/qsqlcachedresult_p.h b/src/sql/kernel/qsqlcachedresult_p.h
index 543a902554..1bca1fd090 100644
--- a/src/sql/kernel/qsqlcachedresult_p.h
+++ b/src/sql/kernel/qsqlcachedresult_p.h
@@ -101,7 +101,8 @@ class Q_SQL_EXPORT QSqlCachedResultPrivate: public QSqlResultPrivate
Q_DECLARE_PUBLIC(QSqlCachedResult)
public:
- QSqlCachedResultPrivate(QSqlCachedResult *q, const QSqlDriver *drv);
+ using QSqlResultPrivate::QSqlResultPrivate;
+
bool canSeek(int i) const;
inline int cacheCount() const;
void init(int count, bool fo);
@@ -110,9 +111,9 @@ public:
void revertLast();
QSqlCachedResult::ValueCache cache;
- int rowCacheEnd;
- int colCount;
- bool atEnd;
+ int rowCacheEnd = 0;
+ int colCount = 0;
+ bool atEnd = false;
};
QT_END_NAMESPACE
diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp
index facf7fd28c..7d74ba8ac5 100644
--- a/src/sql/kernel/qsqldatabase.cpp
+++ b/src/sql/kernel/qsqldatabase.cpp
@@ -619,8 +619,6 @@ QStringList QSqlDatabase::connectionNames()
\row \li QODBC \li ODBC Driver (includes Microsoft SQL Server)
\row \li QPSQL \li PostgreSQL Driver
\row \li QSQLITE \li SQLite version 3 or above
- \row \li QSQLITE2 \li SQLite version 2
- \row \li QTDS \li Sybase Adaptive Server
\endtable
Additional third party drivers, including your own custom
@@ -1185,7 +1183,7 @@ QSqlRecord QSqlDatabase::record(const QString& tablename) const
\li service
\endlist
- \header \li DB2 \li OCI \li TDS
+ \header \li DB2 \li OCI
\row
\li
@@ -1200,9 +1198,6 @@ QSqlRecord QSqlDatabase::record(const QString& tablename) const
\li OCI_ATTR_PREFETCH_MEMORY
\endlist
- \li
- \e none
-
\header \li SQLite \li Interbase
\row
@@ -1325,11 +1320,6 @@ bool QSqlDatabase::isDriverAvailable(const QString& name)
\li SQLHANDLE environment, SQLHANDLE connection
\li \c qsql_db2.cpp
\row
- \li QTDS
- \li QTDSDriver
- \li LOGINREC *loginRecord, DBPROCESS *dbProcess, const QString &hostName
- \li \c qsql_tds.cpp
- \row
\li QSQLITE
\li QSQLiteDriver
\li sqlite *connection
@@ -1341,11 +1331,6 @@ bool QSqlDatabase::isDriverAvailable(const QString& name)
\li \c qsql_ibase.cpp
\endtable
- The host name (or service name) is needed when constructing the
- QTDSDriver for creating new connections for internal queries. This
- is to prevent blocking when several QSqlQuery objects are used
- simultaneously.
-
\warning Adding a database connection with the same connection
name as an existing connection, causes the existing connection to
be replaced by the new one.
diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp
index d1c9057aac..8753352617 100644
--- a/src/sql/kernel/qsqldriver.cpp
+++ b/src/sql/kernel/qsqldriver.cpp
@@ -51,11 +51,10 @@ QT_BEGIN_NAMESPACE
static QString prepareIdentifier(const QString &identifier,
QSqlDriver::IdentifierType type, const QSqlDriver *driver)
{
- Q_ASSERT( driver != nullptr );
+ Q_ASSERT(driver != nullptr);
QString ret = identifier;
- if (!driver->isIdentifierEscaped(identifier, type)) {
+ if (!driver->isIdentifierEscaped(identifier, type))
ret = driver->escapeIdentifier(identifier, type);
- }
return ret;
}
@@ -102,20 +101,6 @@ QSqlDriver::~QSqlDriver()
}
/*!
- \since 4.4
-
- \fn QSqlDriver::notification(const QString &name)
-
- This signal is emitted when the database posts an event notification
- that the driver subscribes to. \a name identifies the event notification.
-
- \sa subscribeToNotification()
-
- \obsolete use QSqlDriver::notification(const QString &name, QSqlDriver::NotificationSource source, const QVariant &payload)
- instead
-*/
-
-/*!
\since 5.0
\fn QSqlDriver::notification(const QString &name, QSqlDriver::NotificationSource source, const QVariant & payload)
diff --git a/src/sql/kernel/qsqldriver.h b/src/sql/kernel/qsqldriver.h
index ca9f7dc51e..31de63be15 100644
--- a/src/sql/kernel/qsqldriver.h
+++ b/src/sql/kernel/qsqldriver.h
@@ -100,7 +100,7 @@ public:
virtual QStringList tables(QSql::TableType tableType) const;
virtual QSqlIndex primaryIndex(const QString &tableName) const;
virtual QSqlRecord record(const QString &tableName) const;
- virtual QString formatValue(const QSqlField& field, bool trimStrings = false) const;
+ virtual QString formatValue(const QSqlField &field, bool trimStrings = false) const;
virtual QString escapeIdentifier(const QString &identifier, IdentifierType type) const;
virtual QString sqlStatement(StatementType type, const QString &tableName,
@@ -113,12 +113,12 @@ public:
virtual void close() = 0;
virtual QSqlResult *createResult() const = 0;
- virtual bool open(const QString& db,
- const QString& user = QString(),
- const QString& password = QString(),
- const QString& host = QString(),
+ virtual bool open(const QString &db,
+ const QString &user = QString(),
+ const QString &password = QString(),
+ const QString &host = QString(),
int port = -1,
- const QString& connOpts = QString()) = 0;
+ const QString &connOpts = QString()) = 0;
virtual bool subscribeToNotification(const QString &name);
virtual bool unsubscribeFromNotification(const QString &name);
virtual QStringList subscribedToNotifications() const;
@@ -135,10 +135,6 @@ public Q_SLOTS:
virtual bool cancelQuery();
Q_SIGNALS:
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_X("Use the 3-args version of notification() instead.")
- void notification(const QString &name);
-#endif
void notification(const QString &name, QSqlDriver::NotificationSource source, const QVariant &payload);
protected:
diff --git a/src/sql/kernel/qsqlerror.cpp b/src/sql/kernel/qsqlerror.cpp
index 7a1a91948c..478ca421d2 100644
--- a/src/sql/kernel/qsqlerror.cpp
+++ b/src/sql/kernel/qsqlerror.cpp
@@ -127,20 +127,6 @@ public:
\since 5.10
*/
-#if QT_DEPRECATED_SINCE(5, 3)
-QSqlError::QSqlError(const QString& driverText, const QString& databaseText, ErrorType type,
- int number)
-{
- d = new QSqlErrorPrivate;
-
- d->driverError = driverText;
- d->databaseError = databaseText;
- d->errorType = type;
- if (number != -1)
- d->errorCode = QString::number(number);
-}
-#endif
-
/*!
Constructs an error containing the driver error text \a
driverText, the database-specific error text \a databaseText, the
@@ -225,25 +211,6 @@ QString QSqlError::driverText() const
}
/*!
- \fn void QSqlError::setDriverText(const QString &driverText)
- \obsolete
-
- Sets the driver error text to the value of \a driverText.
-
- Use QSqlError(const QString &driverText, const QString &databaseText,
- ErrorType type, int number) instead
-
- \sa driverText(), setDatabaseText(), text()
-*/
-
-#if QT_DEPRECATED_SINCE(5, 1)
-void QSqlError::setDriverText(const QString& driverText)
-{
- d->driverError = driverText;
-}
-#endif
-
-/*!
Returns the text of the error as reported by the database. This
may contain database-specific descriptions; it may be empty.
@@ -256,25 +223,6 @@ QString QSqlError::databaseText() const
}
/*!
- \fn void QSqlError::setDatabaseText(const QString &databaseText)
- \obsolete
-
- Sets the database error text to the value of \a databaseText.
-
- Use QSqlError(const QString &driverText, const QString &databaseText,
- ErrorType type, int number) instead
-
- \sa databaseText(), setDriverText(), text()
-*/
-
-#if QT_DEPRECATED_SINCE(5, 1)
-void QSqlError::setDatabaseText(const QString& databaseText)
-{
- d->databaseError = databaseText;
-}
-#endif
-
-/*!
Returns the error type, or -1 if the type cannot be determined.
*/
@@ -284,68 +232,6 @@ QSqlError::ErrorType QSqlError::type() const
}
/*!
- \fn void QSqlError::setType(ErrorType type)
- \obsolete
-
- Sets the error type to the value of \a type.
-
- Use QSqlError(const QString &driverText, const QString &databaseText,
- ErrorType type, int number) instead
-
- \sa type()
-*/
-
-#if QT_DEPRECATED_SINCE(5, 1)
-void QSqlError::setType(ErrorType type)
-{
- d->errorType = type;
-}
-#endif
-
-/*!
- \fn int QSqlError::number() const
- \obsolete
-
- Returns the database-specific error number, or -1 if it cannot be
- determined.
-
- Returns 0 if the error code is not an integer.
-
- \warning Some databases use alphanumeric error codes, which makes
- number() unreliable if such a database is used.
-
- Use nativeErrorCode() instead
-
- \sa nativeErrorCode()
-*/
-
-#if QT_DEPRECATED_SINCE(5, 3)
-int QSqlError::number() const
-{
- return d->errorCode.isEmpty() ? -1 : d->errorCode.toInt();
-}
-#endif
-
-/*!
- \fn void QSqlError::setNumber(int number)
- \obsolete
-
- Sets the database-specific error number to \a number.
-
- Use QSqlError(const QString &driverText, const QString &databaseText,
- ErrorType type, int number) instead
-
- \sa number()
-*/
-
-#if QT_DEPRECATED_SINCE(5, 1)
-void QSqlError::setNumber(int number)
-{
- d->errorCode = QString::number(number);
-}
-#endif
-
-/*!
Returns the database-specific error code, or an empty string if
it cannot be determined.
*/
diff --git a/src/sql/kernel/qsqlerror.h b/src/sql/kernel/qsqlerror.h
index 7dfb6eb9ec..285ea88ee2 100644
--- a/src/sql/kernel/qsqlerror.h
+++ b/src/sql/kernel/qsqlerror.h
@@ -57,10 +57,6 @@ public:
TransactionError,
UnknownError
};
-#if QT_DEPRECATED_SINCE(5, 3)
- QT_DEPRECATED QSqlError(const QString &driverText, const QString &databaseText,
- ErrorType type, int number);
-#endif
QSqlError(const QString &driverText = QString(),
const QString &databaseText = QString(),
ErrorType type = NoError,
@@ -79,20 +75,10 @@ public:
QString driverText() const;
QString databaseText() const;
ErrorType type() const;
-#if QT_DEPRECATED_SINCE(5, 3)
- QT_DEPRECATED int number() const;
-#endif
QString nativeErrorCode() const;
QString text() const;
bool isValid() const;
-#if QT_DEPRECATED_SINCE(5, 1)
- QT_DEPRECATED void setDriverText(const QString &driverText);
- QT_DEPRECATED void setDatabaseText(const QString &databaseText);
- QT_DEPRECATED void setType(ErrorType type);
- QT_DEPRECATED void setNumber(int number);
-#endif
-
private:
// ### Qt6: Keep the pointer and remove the rest.
QString unused1;
diff --git a/src/sql/kernel/qsqlindex.cpp b/src/sql/kernel/qsqlindex.cpp
index 60b0ef6965..5781f24b5c 100644
--- a/src/sql/kernel/qsqlindex.cpp
+++ b/src/sql/kernel/qsqlindex.cpp
@@ -44,9 +44,6 @@
QT_BEGIN_NAMESPACE
-// ### Qt 6: remove the static assertion, the 'sorts' field was changed from QList to QVector in Qt 5.6
-Q_STATIC_ASSERT((sizeof(QList<bool>) == sizeof(QVector<bool>)));
-
/*!
\class QSqlIndex
\brief The QSqlIndex class provides functions to manipulate and
diff --git a/src/sql/kernel/qsqlquery.cpp b/src/sql/kernel/qsqlquery.cpp
index 32c6166c79..98e65b019c 100644
--- a/src/sql/kernel/qsqlquery.cpp
+++ b/src/sql/kernel/qsqlquery.cpp
@@ -261,7 +261,7 @@ QSqlQuery::QSqlQuery(const QSqlQuery& other)
/*!
\internal
*/
-static void qInit(QSqlQuery *q, const QString& query, QSqlDatabase db)
+static void qInit(QSqlQuery *q, const QString& query, const QSqlDatabase &db)
{
QSqlDatabase database = db;
if (!database.isValid())
@@ -281,7 +281,7 @@ static void qInit(QSqlQuery *q, const QString& query, QSqlDatabase db)
\sa QSqlDatabase
*/
-QSqlQuery::QSqlQuery(const QString& query, QSqlDatabase db)
+QSqlQuery::QSqlQuery(const QString& query, const QSqlDatabase &db)
{
d = QSqlQueryPrivate::shared_null();
qInit(this, query, db);
@@ -294,7 +294,7 @@ QSqlQuery::QSqlQuery(const QString& query, QSqlDatabase db)
\sa QSqlDatabase
*/
-QSqlQuery::QSqlQuery(QSqlDatabase db)
+QSqlQuery::QSqlQuery(const QSqlDatabase &db)
{
d = QSqlQueryPrivate::shared_null();
qInit(this, QString(), db);
diff --git a/src/sql/kernel/qsqlquery.h b/src/sql/kernel/qsqlquery.h
index cbbc25c4ec..3be04c492c 100644
--- a/src/sql/kernel/qsqlquery.h
+++ b/src/sql/kernel/qsqlquery.h
@@ -59,8 +59,8 @@ class Q_SQL_EXPORT QSqlQuery
{
public:
explicit QSqlQuery(QSqlResult *r);
- explicit QSqlQuery(const QString& query = QString(), QSqlDatabase db = QSqlDatabase());
- explicit QSqlQuery(QSqlDatabase db);
+ explicit QSqlQuery(const QString& query = QString(), const QSqlDatabase &db = QSqlDatabase());
+ explicit QSqlQuery(const QSqlDatabase &db);
QSqlQuery(const QSqlQuery& other);
QSqlQuery& operator=(const QSqlQuery& other);
~QSqlQuery();
diff --git a/src/sql/kernel/qsqlresult_p.h b/src/sql/kernel/qsqlresult_p.h
index fe13bcc33f..3b9697046d 100644
--- a/src/sql/kernel/qsqlresult_p.h
+++ b/src/sql/kernel/qsqlresult_p.h
@@ -79,9 +79,9 @@ class Q_SQL_EXPORT QSqlResultPrivate
public:
QSqlResultPrivate(QSqlResult *q, const QSqlDriver *drv)
: q_ptr(q),
- sqldriver(const_cast<QSqlDriver*>(drv))
+ sqldriver(const_cast<QSqlDriver *>(drv))
{ }
- virtual ~QSqlResultPrivate() { }
+ virtual ~QSqlResultPrivate() = default;
void clearValues()
{
@@ -104,7 +104,7 @@ public:
void clear()
{
clearValues();
- clearIndex();;
+ clearIndex();
}
virtual QString fieldSerial(int) const;
@@ -116,22 +116,23 @@ public:
QPointer<QSqlDriver> sqldriver;
QString sql;
QSqlError error;
- QSql::NumericalPrecisionPolicy precisionPolicy = QSql::LowPrecisionDouble;
- QSqlResult::BindingSyntax binds = QSqlResult::PositionalBinding;
- int idx = QSql::BeforeFirstRow;
- int bindCount = 0;
- bool active = false;
- bool isSel = false;
- bool forwardOnly = false;
QString executedQuery;
QHash<int, QSql::ParamType> types;
QVector<QVariant> values;
- typedef QHash<QString, QVector<int> > IndexMap;
+ using IndexMap = QHash<QString, QVector<int> >;
IndexMap indexes;
- typedef QVector<QHolder> QHolderVector;
+ using QHolderVector = QVector<QHolder>;
QHolderVector holders;
+
+ QSqlResult::BindingSyntax binds = QSqlResult::PositionalBinding;
+ QSql::NumericalPrecisionPolicy precisionPolicy = QSql::LowPrecisionDouble;
+ int idx = QSql::BeforeFirstRow;
+ int bindCount = 0;
+ bool active = false;
+ bool isSel = false;
+ bool forwardOnly = false;
};
QT_END_NAMESPACE
diff --git a/src/sql/models/qsqlrelationaltablemodel.cpp b/src/sql/models/qsqlrelationaltablemodel.cpp
index 20adec6a3b..4f5f00bf96 100644
--- a/src/sql/models/qsqlrelationaltablemodel.cpp
+++ b/src/sql/models/qsqlrelationaltablemodel.cpp
@@ -161,7 +161,7 @@ struct QRelation
class QRelatedTableModel : public QSqlTableModel
{
public:
- QRelatedTableModel(QRelation *rel, QObject *parent = nullptr, QSqlDatabase db = QSqlDatabase());
+ QRelatedTableModel(QRelation *rel, QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase());
bool select() override;
private:
bool firstSelect;
@@ -245,7 +245,7 @@ bool QRelation::isValid()
-QRelatedTableModel::QRelatedTableModel(QRelation *rel, QObject *parent, QSqlDatabase db) :
+QRelatedTableModel::QRelatedTableModel(QRelation *rel, QObject *parent, const QSqlDatabase &db) :
QSqlTableModel(parent, db), firstSelect(true), relation(rel)
{
}
@@ -410,7 +410,7 @@ void QSqlRelationalTableModelPrivate::clearCache()
and the database connection to \a db. If \a db is not valid, the
default database connection will be used.
*/
-QSqlRelationalTableModel::QSqlRelationalTableModel(QObject *parent, QSqlDatabase db)
+QSqlRelationalTableModel::QSqlRelationalTableModel(QObject *parent, const QSqlDatabase &db)
: QSqlTableModel(*new QSqlRelationalTableModelPrivate, parent, db)
{
}
diff --git a/src/sql/models/qsqlrelationaltablemodel.h b/src/sql/models/qsqlrelationaltablemodel.h
index 1929bd320a..2ebadaabd1 100644
--- a/src/sql/models/qsqlrelationaltablemodel.h
+++ b/src/sql/models/qsqlrelationaltablemodel.h
@@ -91,7 +91,7 @@ public:
};
explicit QSqlRelationalTableModel(QObject *parent = nullptr,
- QSqlDatabase db = QSqlDatabase());
+ const QSqlDatabase &db = QSqlDatabase());
virtual ~QSqlRelationalTableModel();
QVariant data(const QModelIndex &item, int role = Qt::DisplayRole) const override;
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp
index 4ce99e2968..12ea0f5666 100644
--- a/src/sql/models/qsqltablemodel.cpp
+++ b/src/sql/models/qsqltablemodel.cpp
@@ -291,7 +291,7 @@ bool QSqlTableModelPrivate::exec(const QString &stmt, bool prepStatement,
The default edit strategy is \l OnRowChange.
*/
-QSqlTableModel::QSqlTableModel(QObject *parent, QSqlDatabase db)
+QSqlTableModel::QSqlTableModel(QObject *parent, const QSqlDatabase &db)
: QSqlQueryModel(*new QSqlTableModelPrivate, parent)
{
Q_D(QSqlTableModel);
@@ -300,7 +300,7 @@ QSqlTableModel::QSqlTableModel(QObject *parent, QSqlDatabase db)
/*! \internal
*/
-QSqlTableModel::QSqlTableModel(QSqlTableModelPrivate &dd, QObject *parent, QSqlDatabase db)
+QSqlTableModel::QSqlTableModel(QSqlTableModelPrivate &dd, QObject *parent, const QSqlDatabase &db)
: QSqlQueryModel(dd, parent)
{
Q_D(QSqlTableModel);
diff --git a/src/sql/models/qsqltablemodel.h b/src/sql/models/qsqltablemodel.h
index eba27e60ec..1ac8bd9b04 100644
--- a/src/sql/models/qsqltablemodel.h
+++ b/src/sql/models/qsqltablemodel.h
@@ -62,7 +62,7 @@ class Q_SQL_EXPORT QSqlTableModel: public QSqlQueryModel
public:
enum EditStrategy {OnFieldChange, OnRowChange, OnManualSubmit};
- explicit QSqlTableModel(QObject *parent = nullptr, QSqlDatabase db = QSqlDatabase());
+ explicit QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase());
virtual ~QSqlTableModel();
virtual void setTable(const QString &tableName);
@@ -127,7 +127,7 @@ Q_SIGNALS:
void beforeDelete(int row);
protected:
- QSqlTableModel(QSqlTableModelPrivate &dd, QObject *parent = nullptr, QSqlDatabase db = QSqlDatabase());
+ QSqlTableModel(QSqlTableModelPrivate &dd, QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase());
virtual bool updateRowInTable(int row, const QSqlRecord &values);
virtual bool insertRowIntoTable(const QSqlRecord &values);
diff --git a/src/src.pro b/src/src.pro
index 6658cbc9e0..30034ae952 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -134,7 +134,11 @@ src_widgets.depends = src_corelib src_gui src_tools_uic src_platformheaders
src_opengl.subdir = $$PWD/opengl
src_opengl.target = sub-opengl
-src_opengl.depends = src_gui src_widgets
+src_opengl.depends = src_gui
+
+src_openglwidgets.subdir = $$PWD/openglwidgets
+src_openglwidgets.target = sub-openglwidgets
+src_openglwidgets.depends = src_opengl src_widgets
src_openglextensions.subdir = $$PWD/openglextensions
src_openglextensions.target = sub-openglextensions
@@ -224,7 +228,12 @@ qtConfig(gui) {
TOOLS += src_tools_qvkgen
}
SUBDIRS += src_gui src_platformsupport src_platformheaders
- qtConfig(opengl): SUBDIRS += src_openglextensions
+ qtConfig(opengl) {
+ SUBDIRS += src_openglextensions
+ SUBDIRS += src_opengl
+ src_plugins.depends += src_opengl
+ src_platformsupport.depends += src_opengl
+ }
src_plugins.depends += src_gui src_platformsupport src_platformheaders
src_testlib.depends += src_gui # if QtGui is enabled, QtTest requires QtGui's headers
qtConfig(widgets) {
@@ -237,8 +246,7 @@ qtConfig(gui) {
src_plugins.depends += src_printsupport
}
qtConfig(opengl) {
- SUBDIRS += src_opengl
- src_plugins.depends += src_opengl
+ SUBDIRS += src_openglwidgets
}
}
}
diff --git a/src/testlib/.prev_CMakeLists.txt b/src/testlib/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..2eef3edbef
--- /dev/null
+++ b/src/testlib/.prev_CMakeLists.txt
@@ -0,0 +1,139 @@
+# Generated from testlib.pro.
+
+#####################################################################
+## Test Module:
+#####################################################################
+
+qt_add_module(Test
+ QMAKE_MODULE_CONFIG console testlib_defines
+ EXCEPTIONS
+ SOURCES
+ qabstracttestlogger.cpp qabstracttestlogger_p.h
+ qasciikey.cpp
+ qbenchmark.cpp qbenchmark.h qbenchmark_p.h
+ qbenchmarkevent.cpp qbenchmarkevent_p.h
+ qbenchmarkmeasurement.cpp qbenchmarkmeasurement_p.h
+ qbenchmarkmetric.cpp qbenchmarkmetric.h qbenchmarkmetric_p.h
+ qbenchmarkperfevents.cpp qbenchmarkperfevents_p.h
+ qbenchmarktimemeasurers_p.h
+ qcsvbenchmarklogger.cpp qcsvbenchmarklogger_p.h
+ qjunittestlogger.cpp qjunittestlogger_p.h
+ qplaintestlogger.cpp qplaintestlogger_p.h
+ qsignaldumper.cpp qsignaldumper_p.h
+ qsignalspy.h
+ qtaptestlogger.cpp qtaptestlogger_p.h
+ qteamcitylogger.cpp qteamcitylogger_p.h
+ qtest.h
+ qtest_gui.h
+ qtest_network.h
+ qtest_widgets.h
+ qtestaccessible.h
+ qtestassert.h
+ qtestblacklist.cpp qtestblacklist_p.h
+ qtestcase.cpp qtestcase.h
+ qtestcoreelement_p.h
+ qtestcorelist_p.h
+ qtestdata.cpp qtestdata.h
+ qtestelement.cpp qtestelement_p.h
+ qtestelementattribute.cpp qtestelementattribute_p.h
+ qtestevent.h
+ qtesteventloop.h
+ qtesthelpers_p.h
+ qtestjunitstreamer.cpp qtestjunitstreamer_p.h
+ qtestkeyboard.h
+ qtestlog.cpp qtestlog_p.h
+ qtestmouse.cpp qtestmouse.h
+ qtestresult.cpp qtestresult_p.h
+ qtestspontaneevent.h
+ qtestsystem.h
+ qtesttable.cpp qtesttable_p.h
+ qtesttouch.h
+ qttestglobal.h
+ qxmltestlogger.cpp qxmltestlogger_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ QT_NO_DATASTREAM
+ QT_NO_FOREACH
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+)
+
+#### Keys ignored in scope 1:.:.:testlib.pro:<TRUE>:
+# MODULE_CONFIG = "console" "testlib_defines"
+
+## Scopes:
+#####################################################################
+
+#### Keys ignored in scope 2:.:.:testlib.pro:UNIX AND NOT embedded:
+# QMAKE_PKGCONFIG_DESCRIPTION = "Qt" "Unit" "Testing" "Library"
+
+qt_extend_target(Test CONDITION QT_FEATURE_itemmodeltester
+ SOURCES
+ qabstractitemmodeltester.cpp qabstractitemmodeltester.h
+)
+
+qt_extend_target(Test CONDITION QT_FEATURE_valgrind
+ SOURCES
+ qbenchmarkvalgrind.cpp qbenchmarkvalgrind_p.h
+)
+
+qt_extend_target(Test CONDITION embedded
+ COMPILE_OPTIONS
+ -fno-rtti
+)
+
+qt_extend_target(Test CONDITION APPLE
+ SOURCES
+ qappletestlogger.cpp qappletestlogger_p.h
+ PUBLIC_LIBRARIES
+ ${FWSecurity}
+)
+
+qt_extend_target(Test CONDITION MACOS
+ SOURCES
+ qtestutil_macos.mm qtestutil_macos_p.h
+ PUBLIC_LIBRARIES
+ ${FWAppKit}
+ ${FWApplicationServices}
+ ${FWFoundation}
+ ${FWIOKit}
+)
+
+qt_extend_target(Test CONDITION (APPLE) AND (OFF AND NOT lessThan(QMAKE_XCODE_VERSION, "6.0"))
+ SOURCES
+ qxctestlogger.mm qxctestlogger_p.h
+ DEFINES
+ HAVE_XCTEST
+ PUBLIC_LIBRARIES
+ ${FWFoundation}
+)
+
+qt_extend_target(Test CONDITION ((APPLE) AND (OFF AND NOT lessThan(QMAKE_XCODE_VERSION, "6.0"))) AND (NOT QMAKE_MAC_SDK_PLATFORM_PATH_ISEMPTY)
+ COMPILE_OPTIONS
+ -F/Developer/Library/Frameworks
+ LINK_OPTIONS
+ "-F$${platform_dev_frameworks_path}"
+ "-weak_framework"
+ "XCTest"
+)
+
+#### Keys ignored in scope 9:.:.:testlib.pro:NOT QMAKE_MAC_SDK_PLATFORM_PATH_ISEMPTY:
+# MODULE_CONFIG = "xctest"
+
+#### Keys ignored in scope 10:.:.:testlib.pro:NOT TARGET Qt::Gui:
+# HEADERSCLEAN_EXCLUDE = "qtest_gui.h" "qtestaccessible.h" "qtestkeyboard.h" "qtestmouse.h" "qtesttouch.h"
+
+#### Keys ignored in scope 11:.:.:testlib.pro:NOT TARGET Qt::Widgets:
+# HEADERSCLEAN_EXCLUDE = "qtest_widgets.h"
+
+#### Keys ignored in scope 12:.:.:testlib.pro:NOT TARGET Qt::Network:
+# HEADERSCLEAN_EXCLUDE = "qtest_network.h"
+qt_add_docs(Test
+ doc/qttestlib.qdocconf
+)
+
diff --git a/src/testlib/CMakeLists.txt b/src/testlib/CMakeLists.txt
new file mode 100644
index 0000000000..22ac94f764
--- /dev/null
+++ b/src/testlib/CMakeLists.txt
@@ -0,0 +1,135 @@
+# Generated from testlib.pro.
+
+# special case begin
+include(selfcover.cmake)
+# special case end
+
+#####################################################################
+## Test Module:
+#####################################################################
+
+qt_add_module(Test
+ CONFIG_MODULE_NAME testlib # special case
+ EXCEPTIONS
+ SOURCES
+ qabstracttestlogger.cpp qabstracttestlogger_p.h
+ qasciikey.cpp
+ qbenchmark.cpp qbenchmark.h qbenchmark_p.h
+ qbenchmarkevent.cpp qbenchmarkevent_p.h
+ qbenchmarkmeasurement.cpp qbenchmarkmeasurement_p.h
+ qbenchmarkmetric.cpp qbenchmarkmetric.h qbenchmarkmetric_p.h
+ qbenchmarkperfevents.cpp qbenchmarkperfevents_p.h
+ qbenchmarktimemeasurers_p.h
+ qcsvbenchmarklogger.cpp qcsvbenchmarklogger_p.h
+ qjunittestlogger.cpp qjunittestlogger_p.h
+ qplaintestlogger.cpp qplaintestlogger_p.h
+ qsignaldumper.cpp qsignaldumper_p.h
+ qsignalspy.h
+ qtaptestlogger.cpp qtaptestlogger_p.h
+ qteamcitylogger.cpp qteamcitylogger_p.h
+ qtest.h
+ qtest_gui.h
+ qtest_network.h
+ qtest_widgets.h
+ qtestaccessible.h
+ qtestassert.h
+ qtestblacklist.cpp qtestblacklist_p.h
+ qtestcase.cpp qtestcase.h
+ qtestcoreelement_p.h
+ qtestcorelist_p.h
+ qtestdata.cpp qtestdata.h
+ qtestelement.cpp qtestelement_p.h
+ qtestelementattribute.cpp qtestelementattribute_p.h
+ qtestevent.h
+ qtesteventloop.h
+ qtesthelpers_p.h
+ qtestjunitstreamer.cpp qtestjunitstreamer_p.h
+ qtestkeyboard.h
+ qtestlog.cpp qtestlog_p.h
+ qtestmouse.cpp qtestmouse.h
+ qtestresult.cpp qtestresult_p.h
+ qtestspontaneevent.h
+ qtestsystem.h
+ qtesttable.cpp qtesttable_p.h
+ qtesttouch.h
+ qttestglobal.h
+ qxmltestlogger.cpp qxmltestlogger_p.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ QT_NO_DATASTREAM
+ QT_NO_FOREACH
+ QT_BUILD_TESTLIB_LIB # special case
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+)
+
+#### Keys ignored in scope 1:.:.:testlib.pro:<TRUE>:
+# MODULE_CONFIG = "console" "testlib_defines"
+
+## Scopes:
+#####################################################################
+
+#### Keys ignored in scope 2:.:.:testlib.pro:UNIX AND NOT embedded:
+# QMAKE_PKGCONFIG_DESCRIPTION = "Qt" "Unit" "Testing" "Library"
+
+qt_extend_target(Test CONDITION QT_FEATURE_itemmodeltester
+ SOURCES
+ qabstractitemmodeltester.cpp qabstractitemmodeltester.h
+)
+
+qt_extend_target(Test CONDITION QT_FEATURE_valgrind
+ SOURCES
+ qbenchmarkvalgrind.cpp qbenchmarkvalgrind_p.h
+)
+
+qt_extend_target(Test CONDITION embedded
+ COMPILE_OPTIONS
+ -fno-rtti
+)
+
+qt_extend_target(Test CONDITION APPLE
+ SOURCES
+ qappletestlogger.cpp qappletestlogger_p.h
+ PUBLIC_LIBRARIES
+ ${FWSecurity}
+)
+
+qt_extend_target(Test CONDITION MACOS
+ SOURCES
+ qtestutil_macos.mm qtestutil_macos_p.h
+ PUBLIC_LIBRARIES
+ ${FWAppKit}
+ ${FWApplicationServices}
+ ${FWFoundation}
+ ${FWIOKit}
+)
+
+# special case begin
+# Do not bother with disabled stuff:
+# extend_target(Test CONDITION (MACOS) AND (OFF AND NOT lessThan(QMAKE_XCODE_VERSION, "6.0")) ...
+# extend_target(Test CONDITION ((MACOS) AND (OFF AND NOT lessThan(QMAKE_XCODE_VERSION, "6.0"))) AND (NOT QMAKE_MAC_SDK_PLATFORM_PATH_ISEMPTY) ...
+# special case end
+
+#### Keys ignored in scope 9:.:.:testlib.pro:NOT QMAKE_MAC_SDK_PLATFORM_PATH_ISEMPTY:
+# MODULE_CONFIG = "xctest"
+
+#### Keys ignored in scope 10:.:.:testlib.pro:NOT TARGET Qt::Gui:
+# HEADERSCLEAN_EXCLUDE = "qtest_gui.h" "qtestaccessible.h" "qtestkeyboard.h" "qtestmouse.h" "qtesttouch.h"
+
+#### Keys ignored in scope 11:.:.:testlib.pro:NOT TARGET Qt::Widgets:
+# HEADERSCLEAN_EXCLUDE = "qtest_widgets.h"
+
+#### Keys ignored in scope 12:.:.:testlib.pro:NOT TARGET Qt::Network:
+# HEADERSCLEAN_EXCLUDE = "qtest_network.h"
+qt_add_docs(Test
+ doc/qttestlib.qdocconf
+)
+
+# special case begin
+qt_apply_testlib_coverage_options(Test)
+# special case end
diff --git a/src/testlib/Qt5TestConfigExtras.cmake.in b/src/testlib/Qt5TestConfigExtras.cmake.in
deleted file mode 100644
index 2a575958ae..0000000000
--- a/src/testlib/Qt5TestConfigExtras.cmake.in
+++ /dev/null
@@ -1,5 +0,0 @@
-
-set_property(TARGET Qt5::Test
- APPEND PROPERTY
- INTERFACE_COMPILE_DEFINITIONS QT_TESTCASE_BUILDDIR=\\\"\${CMAKE_BINARY_DIR}\\\"
-)
diff --git a/src/testlib/configure.cmake b/src/testlib/configure.cmake
new file mode 100644
index 0000000000..d83b4f09b0
--- /dev/null
+++ b/src/testlib/configure.cmake
@@ -0,0 +1,34 @@
+
+
+#### Inputs
+
+
+
+#### Libraries
+
+
+
+#### Tests
+
+
+
+#### Features
+
+qt_feature("testlib_selfcover" PUBLIC
+ LABEL "Coverage testing of testlib itself"
+ PURPOSE "Gauges how thoroughly testlib's selftest exercises testlib's code"
+ AUTODETECT OFF
+)
+qt_feature("itemmodeltester" PUBLIC
+ LABEL "Tester for item models"
+ PURPOSE "Provides a utility to test item models."
+ CONDITION QT_FEATURE_itemmodel
+)
+qt_feature("valgrind" PUBLIC
+ LABEL "Valgrind"
+ PURPOSE "Profiling support with callgrind."
+ CONDITION ( LINUX OR APPLE ) AND QT_FEATURE_process AND QT_FEATURE_regularexpression
+)
+qt_configure_add_summary_section(NAME "Qt Testlib")
+qt_configure_add_summary_entry(ARGS "itemmodeltester")
+qt_configure_end_summary_section() # end of "Qt Testlib" section
diff --git a/src/testlib/qtest.h b/src/testlib/qtest.h
index 0298ff96e3..18175196ff 100644
--- a/src/testlib/qtest.h
+++ b/src/testlib/qtest.h
@@ -97,7 +97,7 @@ template<> inline char *toString(const QBitArray &ba)
qsizetype size = ba.size();
char *str = new char[size + 1];
for (qsizetype i = 0; i < size; ++i)
- str[i] = "01"[ba.testBit(i)];
+ str[i] = "01"[ba.testBit(int(i))];
str[size] = '\0';
return str;
}
diff --git a/src/testlib/qtestblacklist.cpp b/src/testlib/qtestblacklist.cpp
index f9ccde0280..4554d6017a 100644
--- a/src/testlib/qtestblacklist.cpp
+++ b/src/testlib/qtestblacklist.cpp
@@ -190,10 +190,20 @@ static QSet<QByteArray> activeConditions()
if (!distributionName.isEmpty()) {
if (result.find(distributionName) == result.end())
result.insert(distributionName);
+ // backwards compatibility with Qt 5
+ if (distributionName == "macos") {
+ if (result.find(distributionName) == result.end())
+ result.insert("osx");
+ }
if (!distributionRelease.isEmpty()) {
QByteArray versioned = distributionName + "-" + distributionRelease;
if (result.find(versioned) == result.end())
result.insert(versioned);
+ if (distributionName == "macos") {
+ QByteArray versioned = "osx-" + distributionRelease;
+ if (result.find(versioned) == result.end())
+ result.insert(versioned);
+ }
}
}
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index f45999c7fa..8b5df06d82 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -2162,7 +2162,8 @@ QSharedPointer<QTemporaryDir> QTest::qExtractTestData(const QString &dirName)
/*! \internal
*/
-QString QTest::qFindTestData(const QString& base, const char *file, int line, const char *builddir)
+QString QTest::qFindTestData(const QString& base, const char *file, int line, const char *builddir,
+ const char *sourcedir)
{
QString found;
@@ -2272,6 +2273,20 @@ QString QTest::qFindTestData(const QString& base, const char *file, int line, co
}
}
+ // 7. Try the supplied source directory
+ if (found.isEmpty() && sourcedir) {
+ const QString candidate = QFile::decodeName(sourcedir) % QLatin1Char('/') % base;
+ if (QFileInfo::exists(candidate)) {
+ found = candidate;
+ } else if (QTestLog::verboseLevel() >= 2) {
+ QTestLog::info(qPrintable(
+ QString::fromLatin1("testdata %1 not found in supplied source directory [%2]")
+ .arg(base, QDir::toNativeSeparators(candidate))),
+ file, line);
+ }
+ }
+
+
if (found.isEmpty()) {
QTest::qWarn(qPrintable(
QString::fromLatin1("testdata %1 could not be located!").arg(base)),
@@ -2287,9 +2302,10 @@ QString QTest::qFindTestData(const QString& base, const char *file, int line, co
/*! \internal
*/
-QString QTest::qFindTestData(const char *base, const char *file, int line, const char *builddir)
+QString QTest::qFindTestData(const char *base, const char *file, int line, const char *builddir,
+ const char *sourcedir)
{
- return qFindTestData(QFile::decodeName(base), file, line, builddir);
+ return qFindTestData(QFile::decodeName(base), file, line, builddir, sourcedir);
}
/*! \internal
diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h
index e1518708e8..0498681670 100644
--- a/src/testlib/qtestcase.h
+++ b/src/testlib/qtestcase.h
@@ -213,8 +213,13 @@ do {\
QTest::qWarn(static_cast<const char *>(msg), __FILE__, __LINE__)
#ifdef QT_TESTCASE_BUILDDIR
+
+#ifndef QT_TESTCASE_SOURCEDIR
+#define QT_TESTCASE_SOURCEDIR nullptr
+#endif
+
# define QFINDTESTDATA(basepath)\
- QTest::qFindTestData(basepath, __FILE__, __LINE__, QT_TESTCASE_BUILDDIR)
+ QTest::qFindTestData(basepath, __FILE__, __LINE__, QT_TESTCASE_BUILDDIR, QT_TESTCASE_SOURCEDIR)
#else
# define QFINDTESTDATA(basepath)\
QTest::qFindTestData(basepath, __FILE__, __LINE__)
@@ -309,8 +314,8 @@ namespace QTest
#if QT_CONFIG(temporaryfile)
Q_TESTLIB_EXPORT QSharedPointer<QTemporaryDir> qExtractTestData(const QString &dirName);
#endif
- Q_TESTLIB_EXPORT QString qFindTestData(const char* basepath, const char* file = nullptr, int line = 0, const char* builddir = nullptr);
- Q_TESTLIB_EXPORT QString qFindTestData(const QString& basepath, const char* file = nullptr, int line = 0, const char* builddir = nullptr);
+ Q_TESTLIB_EXPORT QString qFindTestData(const char* basepath, const char* file = nullptr, int line = 0, const char* builddir = nullptr, const char* sourcedir = nullptr);
+ Q_TESTLIB_EXPORT QString qFindTestData(const QString& basepath, const char* file = nullptr, int line = 0, const char* builddir = nullptr, const char *sourcedir = nullptr);
Q_TESTLIB_EXPORT void *qData(const char *tagName, int typeId);
Q_TESTLIB_EXPORT void *qGlobalData(const char *tagName, int typeId);
diff --git a/src/testlib/qtestkeyboard.h b/src/testlib/qtestkeyboard.h
index e8a7e0d5f5..1882c858c1 100644
--- a/src/testlib/qtestkeyboard.h
+++ b/src/testlib/qtestkeyboard.h
@@ -54,7 +54,9 @@
#include <QtGui/qguiapplication.h>
#include <QtGui/qwindow.h>
#include <QtGui/qevent.h>
-#include <QtGui/qkeysequence.h>
+#if QT_CONFIG(shortcut)
+# include <QtGui/qkeysequence.h>
+#endif
#ifdef QT_WIDGETS_LIB
#include <QtWidgets/qwidget.h>
diff --git a/src/testlib/qtesttouch.h b/src/testlib/qtesttouch.h
index 20a9476ee7..a38e055882 100644
--- a/src/testlib/qtesttouch.h
+++ b/src/testlib/qtesttouch.h
@@ -52,6 +52,7 @@
#include <QtCore/qmap.h>
#include <QtGui/qevent.h>
#include <QtGui/qwindow.h>
+#include <QtGui/qtouchdevice.h>
#ifdef QT_WIDGETS_LIB
#include <QtWidgets/qwidget.h>
#endif
diff --git a/src/testlib/selfcover.cmake b/src/testlib/selfcover.cmake
new file mode 100644
index 0000000000..c04ffa7b01
--- /dev/null
+++ b/src/testlib/selfcover.cmake
@@ -0,0 +1,40 @@
+#
+# Hand crafted file based on selfcover.pri
+#
+
+# Overwrite CMake compiler
+function(__qt_testlib_patch_compiler_name variable)
+ get_filename_component(name ${${variable}} NAME)
+ set(${variable} cs${name} PARENT_SCOPE)
+endfunction()
+
+if (FEATURE_testlib_selfcover)
+ __qt_testlib_patch_compiler_name(CMAKE_C_COMPILER)
+ __qt_testlib_patch_compiler_name(CMAKE_CXX_COMPILER)
+ __qt_testlib_patch_compiler_name(CMAKE_CXX_COMPILER_AR)
+ __qt_testlib_patch_compiler_name(CMAKE_CXX_COMPILER_RANLIB)
+endif()
+
+# This enables verification that testlib itself is adequately tested,
+# as a grounds for trusting that testing with it is useful.
+function(qt_apply_testlib_coverage_options target)
+ if (NOT FEATURE_testlib_selfcover)
+ return()
+ endif()
+ # Exclude all non-testlib source from coverage instrumentation:
+ set(testlib_coverage_options
+ --cs-exclude-file-abs-wildcard="${${CMAKE_PROJECT_NAME}_SOURCE_DIR}/*"
+ --cs-include-file-abs-wildcard="*/src/testlib/*"
+ --cs-mcc # enable Multiple Condition Coverage
+ --cs-mcdc # enable Multiple Condition / Decision Coverage
+ # (recommended for ISO 26262 ASIL A, B and C -- highly recommended for ASIL D)
+ # https://doc.froglogic.com/squish-coco/4.1/codecoverage.html#sec%3Amcdc
+ )
+ target_compile_options(${target} PRIVATE
+ ${testlib_coverage_options}
+ )
+
+ target_link_options(${target} PRIVATE
+ ${testlib_coverage_options}
+ )
+endfunction()
diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt
new file mode 100644
index 0000000000..425a99b552
--- /dev/null
+++ b/src/tools/CMakeLists.txt
@@ -0,0 +1,13 @@
+add_subdirectory(uic)
+if (QT_FEATURE_dbus)
+ add_subdirectory(qdbuscpp2xml)
+ add_subdirectory(qdbusxml2cpp)
+endif()
+add_subdirectory(qlalr)
+add_subdirectory(qvkgen)
+
+# Only include the following tools when performing a host build
+if(NOT CMAKE_CROSSCOMPILING)
+ add_subdirectory(androiddeployqt)
+ add_subdirectory(androidtestrunner)
+endif()
diff --git a/src/tools/androiddeployqt/.prev_CMakeLists.txt b/src/tools/androiddeployqt/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..e445201b82
--- /dev/null
+++ b/src/tools/androiddeployqt/.prev_CMakeLists.txt
@@ -0,0 +1,27 @@
+# Generated from androiddeployqt.pro.
+
+#####################################################################
+## androiddeployqt Binary:
+#####################################################################
+
+qt_add_executable(androiddeployqt
+ SOURCES
+ main.cpp
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Gui
+)
+
+#### Keys ignored in scope 1:.:.:androiddeployqt.pro:<TRUE>:
+# _OPTION = "host_build"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(androiddeployqt CONDITION windows
+ COMPILE_OPTIONS
+ -U__STRICT_ANSI__
+)
diff --git a/src/tools/androiddeployqt/CMakeLists.txt b/src/tools/androiddeployqt/CMakeLists.txt
new file mode 100644
index 0000000000..d47e10efd2
--- /dev/null
+++ b/src/tools/androiddeployqt/CMakeLists.txt
@@ -0,0 +1,27 @@
+# Generated from androiddeployqt.pro.
+
+#####################################################################
+## androiddeployqt Binary:
+#####################################################################
+
+qt_add_executable(androiddeployqt
+ SOURCES
+ main.cpp
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core # special case
+)
+
+#### Keys ignored in scope 1:.:.:androiddeployqt.pro:<TRUE>:
+# _OPTION = "host_build"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(androiddeployqt CONDITION windows
+ COMPILE_OPTIONS
+ -U__STRICT_ANSI__
+)
diff --git a/src/tools/androiddeployqt/main.cpp b/src/tools/androiddeployqt/main.cpp
index 24a7cf3719..cd36622ece 100644
--- a/src/tools/androiddeployqt/main.cpp
+++ b/src/tools/androiddeployqt/main.cpp
@@ -40,7 +40,7 @@
#include <QStandardPaths>
#include <QUuid>
#include <QDirIterator>
-#include <QRegExp>
+#include <QRegularExpression>
#include <algorithm>
@@ -128,6 +128,7 @@ struct Options
, jarSigner(false)
, installApk(false)
, uninstallApk(false)
+ , qmlImportScannerBinaryPath()
{}
enum DeploymentMechanism
@@ -169,7 +170,7 @@ struct Options
// Versioning
QString versionName;
QString versionCode;
- QByteArray minSdkVersion{"21"};
+ QByteArray minSdkVersion{"23"};
QByteArray targetSdkVersion{"28"};
// lib c++ path
@@ -233,9 +234,12 @@ struct Options
QStringList initClasses;
QStringList permissions;
QStringList features;
+
+ // Override qml import scanner path
+ QString qmlImportScannerBinaryPath;
};
-static const QHash<QByteArray, QByteArray> elfArchitecures = {
+static const QHash<QByteArray, QByteArray> elfArchitectures = {
{"aarch64", "arm64-v8a"},
{"arm", "armeabi-v7a"},
{"i386", "x86"},
@@ -292,7 +296,7 @@ static QString shellQuoteWin(const QString &arg)
// Quotes are escaped and their preceding backslashes are doubled.
// It's impossible to escape anything inside a quoted string on cmd
// level, so the outer quoting must be "suspended".
- ret.replace(QRegExp(QLatin1String("(\\\\*)\"")), QLatin1String("\"\\1\\1\\^\"\""));
+ ret.replace(QRegularExpression(QLatin1String("(\\\\*)\"")), QLatin1String("\"\\1\\1\\^\"\""));
// The argument must not end with a \ since this would be interpreted
// as escaping the quote -- rather put the \ behind the quote: e.g.
// rather use "foo"\ than "foo\"
@@ -313,17 +317,18 @@ static QString shellQuote(const QString &arg)
return shellQuoteUnix(arg);
}
-QString architecureFromName(const QString &name)
+QString architectureFromName(const QString &name)
{
- QRegExp architecture(QStringLiteral(".*_(armeabi-v7a|arm64-v8a|x86|x86_64).so"));
- if (!architecture.exactMatch(name))
+ QRegularExpression architecture(QStringLiteral("_(armeabi-v7a|arm64-v8a|x86|x86_64).so$"));
+ auto match = architecture.match(name);
+ if (!match.hasMatch())
return {};
- return architecture.capturedTexts().last();
+ return match.captured(1);
}
QString fileArchitecture(const Options &options, const QString &path)
{
- auto arch = architecureFromName(path);
+ auto arch = architectureFromName(path);
if (!arch.isEmpty())
return arch;
@@ -353,9 +358,9 @@ QString fileArchitecture(const Options &options, const QString &path)
QString library;
line = line.trimmed();
if (line.startsWith("Arch: ")) {
- auto it = elfArchitecures.find(line.mid(6));
+ auto it = elfArchitectures.find(line.mid(6));
pclose(readElfCommand);
- return it != elfArchitecures.constEnd() ? QString::fromLatin1(it.value()) : QString{};
+ return it != elfArchitectures.constEnd() ? QString::fromLatin1(it.value()) : QString{};
}
}
pclose(readElfCommand);
@@ -525,6 +530,8 @@ Options parseOptions()
options.jarSigner = true;
} else if (argument.compare(QLatin1String("--aux-mode"), Qt::CaseInsensitive) == 0) {
options.auxMode = true;
+ } else if (argument.compare(QLatin1String("--qml-importscanner-binary"), Qt::CaseInsensitive) == 0) {
+ options.qmlImportScannerBinaryPath = arguments.at(++i).trimmed();
}
}
@@ -608,6 +615,10 @@ void printHelp()
" dependencies into the build directory and update the XML templates.\n"
" The project will not be built or installed.\n"
" --apk <path/where/to/copy/the/apk>: Path where to copy the built apk.\n"
+ " --qml-importscanner-binary <path/to/qmlimportscanner>: Override the\n"
+ " default qmlimportscanner binary path. By default the\n"
+ " qmlimportscanner binary is located using the Qt directory\n"
+ " specified in the input file.\n"
" --help: Displays this information.\n\n",
qPrintable(QCoreApplication::arguments().at(0))
);
@@ -678,11 +689,16 @@ bool copyFileIfNewer(const QString &sourceFileName,
QString cleanPackageName(QString packageName)
{
- QRegExp legalChars(QLatin1String("[a-zA-Z0-9_\\.]"));
-
- for (int i = 0; i < packageName.length(); ++i) {
- if (!legalChars.exactMatch(packageName.mid(i, 1)))
- packageName[i] = QLatin1Char('_');
+ auto isLegalChar = [] (QChar c) -> bool {
+ ushort ch = c.unicode();
+ return (ch >= '0' && ch <= '9') ||
+ (ch >= 'A' && ch <= 'Z') ||
+ (ch >= 'a' && ch <= 'z') ||
+ ch == '.';
+ };
+ for (QChar &c : packageName) {
+ if (!isLegalChar(c))
+ c = QLatin1Char('_');
}
static QStringList keywords;
@@ -871,7 +887,7 @@ bool readInputFile(Options *options)
}
for (auto it = targetArchitectures.constBegin(); it != targetArchitectures.constEnd(); ++it) {
if (it.value().isUndefined()) {
- fprintf(stderr, "Invalid architecure.\n");
+ fprintf(stderr, "Invalid architecture.\n");
return false;
}
if (it.value().isNull())
@@ -941,6 +957,12 @@ bool readInputFile(Options *options)
}
{
+ const QJsonValue qmlImportScannerBinaryPath = jsonObject.value(QLatin1String("qml-importscanner-binary"));
+ if (!qmlImportScannerBinaryPath.isUndefined())
+ options->qmlImportScannerBinaryPath = qmlImportScannerBinaryPath.toString();
+ }
+
+ {
const QJsonValue applicationBinary = jsonObject.value(QLatin1String("application-binary"));
if (applicationBinary.isUndefined()) {
fprintf(stderr, "No application binary defined in json file.\n");
@@ -1423,8 +1445,8 @@ bool updateAndroidManifest(Options &options)
options.packageName = reader.attributes().value(QLatin1String("package")).toString();
} else if (reader.name() == QLatin1String("uses-sdk")) {
if (reader.attributes().hasAttribute(QLatin1String("android:minSdkVersion")))
- if (reader.attributes().value(QLatin1String("android:minSdkVersion")).toInt() < 21) {
- fprintf(stderr, "Invalid minSdkVersion version, minSdkVersion must be >= 21\n");
+ if (reader.attributes().value(QLatin1String("android:minSdkVersion")).toInt() < 23) {
+ fprintf(stderr, "Invalid minSdkVersion version, minSdkVersion must be >= 23\n");
return false;
}
} else if ((reader.name() == QLatin1String("application") ||
@@ -1642,8 +1664,8 @@ QStringList getQtLibsFromElf(const Options &options, const QString &fileName)
line = line.trimmed();
if (!readLibs) {
if (line.startsWith("Arch: ")) {
- auto it = elfArchitecures.find(line.mid(6));
- if (it == elfArchitecures.constEnd() || *it != options.currentArchitecture.toLatin1()) {
+ auto it = elfArchitectures.find(line.mid(6));
+ if (it == elfArchitectures.constEnd() || *it != options.currentArchitecture.toLatin1()) {
if (options.verbose)
fprintf(stdout, "Skipping \"%s\", architecture mismatch\n", qPrintable(fileName));
return {};
@@ -1717,10 +1739,15 @@ bool scanImports(Options *options, QSet<QString> *usedDependencies)
if (options->verbose)
fprintf(stdout, "Scanning for QML imports.\n");
- QString qmlImportScanner = options->qtInstallDirectory + QLatin1String("/bin/qmlimportscanner");
+ QString qmlImportScanner;
+ if (!options->qmlImportScannerBinaryPath.isEmpty()) {
+ qmlImportScanner = options->qmlImportScannerBinaryPath;
+ } else {
+ options->qtInstallDirectory + QLatin1String("/bin/qmlimportscanner");
#if defined(Q_OS_WIN32)
- qmlImportScanner += QLatin1String(".exe");
+ qmlImportScanner += QLatin1String(".exe");
#endif
+ }
if (!QFile::exists(qmlImportScanner)) {
fprintf(stderr, "qmlimportscanner not found: %s\n", qPrintable(qmlImportScanner));
diff --git a/src/tools/androidtestrunner/CMakeLists.txt b/src/tools/androidtestrunner/CMakeLists.txt
new file mode 100644
index 0000000000..d7ec4a66fa
--- /dev/null
+++ b/src/tools/androidtestrunner/CMakeLists.txt
@@ -0,0 +1,27 @@
+# Generated from androidtestrunner.pro.
+
+#####################################################################
+## androidtestrunner Binary:
+#####################################################################
+
+qt_add_executable(androidtestrunner
+ SOURCES
+ main.cpp
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Gui
+)
+
+#### Keys ignored in scope 1:.:.:androidtestrunner.pro:<TRUE>:
+# _OPTION = "host_build"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(androidtestrunner CONDITION windows
+ COMPILE_OPTIONS
+ -U__STRICT_ANSI__
+)
diff --git a/src/tools/androidtestrunner/main.cpp b/src/tools/androidtestrunner/main.cpp
index 5471db3afd..f826ce8eeb 100644
--- a/src/tools/androidtestrunner/main.cpp
+++ b/src/tools/androidtestrunner/main.cpp
@@ -30,7 +30,7 @@
#include <QCoreApplication>
#include <QDir>
#include <QHash>
-#include <QRegExp>
+#include <QRegularExpression>
#include <QSystemSemaphore>
#include <QXmlStreamReader>
@@ -51,6 +51,7 @@ struct Options
{
bool helpRequested = false;
bool verbose = false;
+ bool skipAddInstallRoot = false;
std::chrono::seconds timeout{300}; // 5minutes
QString androidDeployQtCommand;
QString buildPath;
@@ -176,7 +177,7 @@ static QString shellQuoteWin(const QString &arg)
// Quotes are escaped and their preceding backslashes are doubled.
// It's impossible to escape anything inside a quoted string on cmd
// level, so the outer quoting must be "suspended".
- ret.replace(QRegExp(QStringLiteral("(\\\\*)\"")), QStringLiteral("\"\\1\\1\\^\"\""));
+ ret.replace(QRegularExpression(QStringLiteral("(\\\\*)\"")), QStringLiteral("\"\\1\\1\\^\"\""));
// The argument must not end with a \ since this would be interpreted
// as escaping the quote -- rather put the \ behind the quote: e.g.
// rather use "foo"\ than "foo\"
@@ -233,6 +234,8 @@ static bool parseOptions()
g_options.helpRequested = true;
else
g_options.activity = arguments.at(++i);
+ } else if (argument.compare(QStringLiteral("--skip-install-root"), Qt::CaseInsensitive) == 0) {
+ g_options.skipAddInstallRoot = true;
} else if (argument.compare(QStringLiteral("--timeout"), Qt::CaseInsensitive) == 0) {
if (i + 1 == arguments.size())
g_options.helpRequested = true;
@@ -283,6 +286,7 @@ static void printHelp()
" If make is missing make sure the --path is set.\n"
" --apk <apk path>: If the apk is specified and if exists, we'll skip\n"
" the package building.\n"
+ " --skip-install-root: Do not append INSTALL_ROOT=... to the make command.\n"
" -- arguments that will be passed to the test application.\n"
" --verbose: Prints out information during processing.\n"
" --help: Displays this information.\n\n",
@@ -330,8 +334,8 @@ static void setOutputFile(QString file, QString format)
static bool parseTestArgs()
{
- QRegExp newLoggingFormat{QStringLiteral("(.*),(txt|csv|xunitxml|xml|lightxml|teamcity|tap)")};
- QRegExp oldFormats{QStringLiteral("-(txt|csv|xunitxml|xml|lightxml|teamcity|tap)")};
+ QRegularExpression oldFormats{QStringLiteral("^-(txt|csv|xunitxml|xml|lightxml|teamcity|tap)$")};
+ QRegularExpression newLoggingFormat{QStringLiteral("^(.*),(txt|csv|xunitxml|xml|lightxml|teamcity|tap)$")};
QString file;
QString logType;
@@ -343,16 +347,20 @@ static bool parseTestArgs()
return false; // missing file argument
const auto &filePath = g_options.testArgsList[++i];
- if (!newLoggingFormat.exactMatch(filePath)) {
+ const auto match = newLoggingFormat.match(filePath);
+ if (!match.hasMatch()) {
file = filePath;
} else {
- const auto capturedTexts = newLoggingFormat.capturedTexts();
+ const auto capturedTexts = match.capturedTexts();
setOutputFile(capturedTexts.at(1), capturedTexts.at(2));
}
- } else if (oldFormats.exactMatch(arg)) {
- logType = oldFormats.capturedTexts().at(1);
} else {
- unhandledArgs += QStringLiteral(" %1").arg(arg);
+ auto match = oldFormats.match(arg);
+ if (match.hasMatch()) {
+ logType = match.capturedTexts().at(1);
+ } else {
+ unhandledArgs += QStringLiteral(" %1").arg(arg);
+ }
}
}
if (g_options.outFiles.isEmpty() || !file.isEmpty() || !logType.isEmpty())
@@ -452,10 +460,17 @@ int main(int argc, char *argv[])
}
} else {
if (!g_options.makeCommand.isEmpty()) {
- // we need to run make INSTALL_ROOT=path install to install the application file(s) first
- if (!execCommand(QStringLiteral("%1 INSTALL_ROOT=%2 install")
- .arg(g_options.makeCommand, QDir::toNativeSeparators(g_options.buildPath)), nullptr, g_options.verbose)) {
- return 1;
+ if (!g_options.skipAddInstallRoot) {
+ // we need to run make INSTALL_ROOT=path install to install the application file(s) first
+ if (!execCommand(QStringLiteral("%1 INSTALL_ROOT=%2 install")
+ .arg(g_options.makeCommand, QDir::toNativeSeparators(g_options.buildPath)), nullptr, g_options.verbose)) {
+ return 1;
+ }
+ } else {
+ if (!execCommand(QStringLiteral("%1")
+ .arg(g_options.makeCommand), nullptr, g_options.verbose)) {
+ return 1;
+ }
}
}
diff --git a/src/tools/bootstrap/.prev_CMakeLists.txt b/src/tools/bootstrap/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..47e4877e20
--- /dev/null
+++ b/src/tools/bootstrap/.prev_CMakeLists.txt
@@ -0,0 +1,262 @@
+# Generated from bootstrap.pro.
+
+#####################################################################
+## Bootstrap Module:
+#####################################################################
+
+qt_add_module(Bootstrap
+ STATIC
+ INTERNAL_MODULE
+ NO_SYNC_QT
+ QMAKE_MODULE_CONFIG gc_binaries
+ SOURCES
+ ../../3rdparty/pcre2/src/config.h
+ ../../3rdparty/pcre2/src/pcre2.h
+ ../../3rdparty/pcre2/src/pcre2_auto_possess.c
+ ../../3rdparty/pcre2/src/pcre2_chartables.c
+ ../../3rdparty/pcre2/src/pcre2_compile.c
+ ../../3rdparty/pcre2/src/pcre2_config.c
+ ../../3rdparty/pcre2/src/pcre2_context.c
+ ../../3rdparty/pcre2/src/pcre2_dfa_match.c
+ ../../3rdparty/pcre2/src/pcre2_error.c
+ ../../3rdparty/pcre2/src/pcre2_extuni.c
+ ../../3rdparty/pcre2/src/pcre2_find_bracket.c
+ ../../3rdparty/pcre2/src/pcre2_internal.h
+ ../../3rdparty/pcre2/src/pcre2_intmodedep.h
+ ../../3rdparty/pcre2/src/pcre2_jit_compile.c
+ ../../3rdparty/pcre2/src/pcre2_maketables.c
+ ../../3rdparty/pcre2/src/pcre2_match.c
+ ../../3rdparty/pcre2/src/pcre2_match_data.c
+ ../../3rdparty/pcre2/src/pcre2_newline.c
+ ../../3rdparty/pcre2/src/pcre2_ord2utf.c
+ ../../3rdparty/pcre2/src/pcre2_pattern_info.c
+ ../../3rdparty/pcre2/src/pcre2_script_run.c
+ ../../3rdparty/pcre2/src/pcre2_serialize.c
+ ../../3rdparty/pcre2/src/pcre2_string_utils.c
+ ../../3rdparty/pcre2/src/pcre2_study.c
+ ../../3rdparty/pcre2/src/pcre2_substitute.c
+ ../../3rdparty/pcre2/src/pcre2_substring.c
+ ../../3rdparty/pcre2/src/pcre2_tables.c
+ ../../3rdparty/pcre2/src/pcre2_ucd.c
+ ../../3rdparty/pcre2/src/pcre2_ucp.h
+ ../../3rdparty/pcre2/src/pcre2_valid_utf.c
+ ../../3rdparty/pcre2/src/pcre2_xclass.c
+ ../../corelib/codecs/qlatincodec.cpp
+ ../../corelib/codecs/qtextcodec.cpp
+ ../../corelib/codecs/qutfcodec.cpp
+ ../../corelib/global/qendian.cpp
+ ../../corelib/global/qglobal.cpp
+ ../../corelib/global/qlogging.cpp
+ ../../corelib/global/qmalloc.cpp
+ ../../corelib/global/qnumeric.cpp
+ ../../corelib/global/qoperatingsystemversion.cpp
+ ../../corelib/global/qrandom.cpp
+ ../../corelib/io/qabstractfileengine.cpp
+ ../../corelib/io/qbuffer.cpp
+ ../../corelib/io/qdebug.cpp
+ ../../corelib/io/qdir.cpp
+ ../../corelib/io/qdiriterator.cpp
+ ../../corelib/io/qfile.cpp
+ ../../corelib/io/qfiledevice.cpp
+ ../../corelib/io/qfileinfo.cpp
+ ../../corelib/io/qfilesystemengine.cpp
+ ../../corelib/io/qfilesystementry.cpp
+ ../../corelib/io/qfsfileengine.cpp
+ ../../corelib/io/qfsfileengine_iterator.cpp
+ ../../corelib/io/qiodevice.cpp
+ ../../corelib/io/qipaddress.cpp
+ ../../corelib/io/qloggingcategory.cpp
+ ../../corelib/io/qloggingregistry.cpp
+ ../../corelib/io/qresource.cpp
+ ../../corelib/io/qsavefile.cpp
+ ../../corelib/io/qstandardpaths.cpp
+ ../../corelib/io/qtemporarydir.cpp
+ ../../corelib/io/qtemporaryfile.cpp
+ ../../corelib/io/qurl.cpp
+ ../../corelib/io/qurlidna.cpp
+ ../../corelib/io/qurlquery.cpp
+ ../../corelib/io/qurlrecode.cpp
+ ../../corelib/kernel/qcoreapplication.cpp
+ ../../corelib/kernel/qcoreglobaldata.cpp
+ ../../corelib/kernel/qmetatype.cpp
+ ../../corelib/kernel/qsharedmemory.cpp
+ ../../corelib/kernel/qsystemerror.cpp
+ ../../corelib/kernel/qsystemsemaphore.cpp
+ ../../corelib/kernel/qvariant.cpp
+ ../../corelib/plugin/quuid.cpp
+ ../../corelib/serialization/qcborcommon.cpp
+ ../../corelib/serialization/qcborstreamwriter.cpp
+ ../../corelib/serialization/qcborvalue.cpp
+ ../../corelib/serialization/qdatastream.cpp
+ ../../corelib/serialization/qjsonarray.cpp
+ ../../corelib/serialization/qjsoncbor.cpp
+ ../../corelib/serialization/qjsondocument.cpp
+ ../../corelib/serialization/qjsonobject.cpp
+ ../../corelib/serialization/qjsonparser.cpp
+ ../../corelib/serialization/qjsonvalue.cpp
+ ../../corelib/serialization/qjsonwriter.cpp
+ ../../corelib/serialization/qtextstream.cpp
+ ../../corelib/serialization/qxmlstream.cpp
+ ../../corelib/serialization/qxmlutils.cpp
+ ../../corelib/text/qbytearray.cpp
+ ../../corelib/text/qbytearraylist.cpp
+ ../../corelib/text/qbytearraymatcher.cpp
+ ../../corelib/text/qlocale.cpp
+ ../../corelib/text/qlocale_tools.cpp
+ ../../corelib/text/qregexp.cpp
+ ../../corelib/text/qregularexpression.cpp
+ ../../corelib/text/qstring.cpp
+ ../../corelib/text/qstring_compat.cpp
+ ../../corelib/text/qstringbuilder.cpp
+ ../../corelib/text/qstringlist.cpp
+ ../../corelib/text/qstringview.cpp
+ ../../corelib/text/qvsnprintf.cpp
+ ../../corelib/time/qcalendar.cpp
+ ../../corelib/time/qdatetime.cpp
+ ../../corelib/time/qgregoriancalendar.cpp
+ ../../corelib/time/qromancalendar.cpp
+ ../../corelib/tools/qarraydata.cpp
+ ../../corelib/tools/qbitarray.cpp
+ ../../corelib/tools/qcommandlineoption.cpp
+ ../../corelib/tools/qcommandlineparser.cpp
+ ../../corelib/tools/qcryptographichash.cpp
+ ../../corelib/tools/qhash.cpp
+ ../../corelib/tools/qline.cpp
+ ../../corelib/tools/qmap.cpp
+ ../../corelib/tools/qpoint.cpp
+ ../../corelib/tools/qrect.cpp
+ ../../corelib/tools/qringbuffer.cpp
+ ../../corelib/tools/qsize.cpp
+ ../../corelib/tools/qversionnumber.cpp
+ ../../xml/dom/qdom.cpp
+ ../../xml/sax/qxml.cpp
+ DEFINES
+ HAVE_CONFIG_H
+ PCRE2_CODE_UNIT_WIDTH=16
+ PCRE2_DISABLE_JIT
+ QT_BOOTSTRAPPED
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ QT_NO_FOREACH
+ QT_VERSION_MAJOR=
+ QT_VERSION_MINOR=
+ QT_VERSION_PATCH=
+ QT_VERSION_STR=\"\"
+ PUBLIC_DEFINES
+ PCRE2_CODE_UNIT_WIDTH=16
+ QT_BOOTSTRAPPED
+ QT_NO_CAST_TO_ASCII
+ QT_VERSION_MAJOR=
+ QT_VERSION_MINOR=
+ QT_VERSION_PATCH=
+ QT_VERSION_STR=\"\"
+ INCLUDE_DIRECTORIES
+ ..
+ ../../3rdparty/tinycbor/src
+ PUBLIC_INCLUDE_DIRECTORIES
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/pcre2/src>
+)
+
+#### Keys ignored in scope 1:.:.:bootstrap.pro:<TRUE>:
+# INSTALLS = "lib"
+# MODULE_CONFIG = "gc_binaries"
+# MODULE_INCNAME = "QtCore" "QtXml"
+# _OPTION = "host_build"
+# lib.CONFIG = "dummy_install"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(Bootstrap CONDITION UNIX
+ SOURCES
+ ../../corelib/io/qfilesystemengine_unix.cpp
+ ../../corelib/io/qfilesystemiterator_unix.cpp
+ ../../corelib/io/qfsfileengine_unix.cpp
+ ../../corelib/kernel/qcore_unix.cpp
+ ../../corelib/kernel/qsharedmemory_posix.cpp
+ ../../corelib/kernel/qsharedmemory_systemv.cpp
+ ../../corelib/kernel/qsharedmemory_unix.cpp
+ ../../corelib/kernel/qsystemsemaphore_posix.cpp
+ ../../corelib/kernel/qsystemsemaphore_systemv.cpp
+ ../../corelib/kernel/qsystemsemaphore_unix.cpp
+)
+
+qt_extend_target(Bootstrap CONDITION WIN32
+ SOURCES
+ ../../corelib/global/qoperatingsystemversion_win.cpp
+ ../../corelib/io/qfilesystemengine_win.cpp
+ ../../corelib/io/qfilesystemiterator_win.cpp
+ ../../corelib/io/qfsfileengine_win.cpp
+ ../../corelib/io/qstandardpaths_win.cpp
+ ../../corelib/kernel/qcoreapplication_win.cpp
+ ../../corelib/kernel/qsharedmemory_win.cpp
+ ../../corelib/kernel/qsystemsemaphore_win.cpp
+ ../../corelib/kernel/qwinregistry.cpp
+ ../../corelib/plugin/qsystemlibrary.cpp
+ PUBLIC_DEFINES
+ PCRE2_STATIC
+ PUBLIC_LIBRARIES
+ advapi32
+ netapi32
+ ole32
+ shell32
+ user32
+)
+
+qt_extend_target(Bootstrap CONDITION APPLE
+ SOURCES
+ ../../corelib/global/qoperatingsystemversion_darwin.mm
+ ../../corelib/kernel/qcore_foundation.mm
+ ../../corelib/kernel/qcore_mac.mm
+ ../../corelib/kernel/qcoreapplication_mac.cpp
+ PUBLIC_LIBRARIES
+ ${FWFoundation}
+)
+
+qt_extend_target(Bootstrap CONDITION MACOS
+ SOURCES
+ ../../corelib/io/qstandardpaths_mac.mm
+ LIBRARIES
+ ${FWCoreServices}
+)
+
+qt_extend_target(Bootstrap CONDITION UIKIT
+ LIBRARIES
+ ${FWUIKit}
+)
+
+qt_extend_target(Bootstrap CONDITION UNIX AND NOT MACOS
+ SOURCES
+ ../../corelib/io/qstandardpaths_unix.cpp
+)
+
+qt_extend_target(Bootstrap CONDITION CMAKE_CROSSCOMPILING OR NOT QT_FEATURE_system_zlib
+ SOURCES
+ ../../3rdparty/zlib/src/adler32.c
+ ../../3rdparty/zlib/src/compress.c
+ ../../3rdparty/zlib/src/crc32.c
+ ../../3rdparty/zlib/src/deflate.c
+ ../../3rdparty/zlib/src/gzclose.c
+ ../../3rdparty/zlib/src/gzlib.c
+ ../../3rdparty/zlib/src/gzread.c
+ ../../3rdparty/zlib/src/gzwrite.c
+ ../../3rdparty/zlib/src/infback.c
+ ../../3rdparty/zlib/src/inffast.c
+ ../../3rdparty/zlib/src/inflate.c
+ ../../3rdparty/zlib/src/inftrees.c
+ ../../3rdparty/zlib/src/trees.c
+ ../../3rdparty/zlib/src/uncompr.c
+ ../../3rdparty/zlib/src/zutil.c
+ INCLUDE_DIRECTORIES
+ ../../3rdparty/zlib/src
+)
+
+qt_extend_target(Bootstrap CONDITION QT_FEATURE_system_zlib AND NOT CMAKE_CROSSCOMPILING
+ LIBRARIES
+ ZLIB::ZLIB
+)
+
+qt_extend_target(Bootstrap CONDITION WIN32 AND mingw
+ PUBLIC_LIBRARIES
+ uuid
+)
diff --git a/src/tools/bootstrap/CMakeLists.txt b/src/tools/bootstrap/CMakeLists.txt
new file mode 100644
index 0000000000..ccac76d184
--- /dev/null
+++ b/src/tools/bootstrap/CMakeLists.txt
@@ -0,0 +1,268 @@
+# Generated from bootstrap.pro.
+
+#####################################################################
+## Bootstrap Module:
+#####################################################################
+
+# special case begin
+# The bootstrap library has a few manual tweaks compared to other
+# libraries.
+add_library(Bootstrap STATIC)
+# special case end
+qt_extend_target(Bootstrap
+ SOURCES
+ ../../3rdparty/pcre2/src/config.h
+ ../../3rdparty/pcre2/src/pcre2.h
+ ../../3rdparty/pcre2/src/pcre2_auto_possess.c
+ ../../3rdparty/pcre2/src/pcre2_chartables.c
+ ../../3rdparty/pcre2/src/pcre2_compile.c
+ ../../3rdparty/pcre2/src/pcre2_config.c
+ ../../3rdparty/pcre2/src/pcre2_context.c
+ ../../3rdparty/pcre2/src/pcre2_dfa_match.c
+ ../../3rdparty/pcre2/src/pcre2_error.c
+ ../../3rdparty/pcre2/src/pcre2_extuni.c
+ ../../3rdparty/pcre2/src/pcre2_find_bracket.c
+ ../../3rdparty/pcre2/src/pcre2_internal.h
+ ../../3rdparty/pcre2/src/pcre2_intmodedep.h
+ ../../3rdparty/pcre2/src/pcre2_jit_compile.c
+ ../../3rdparty/pcre2/src/pcre2_maketables.c
+ ../../3rdparty/pcre2/src/pcre2_match.c
+ ../../3rdparty/pcre2/src/pcre2_match_data.c
+ ../../3rdparty/pcre2/src/pcre2_newline.c
+ ../../3rdparty/pcre2/src/pcre2_ord2utf.c
+ ../../3rdparty/pcre2/src/pcre2_pattern_info.c
+ ../../3rdparty/pcre2/src/pcre2_script_run.c
+ ../../3rdparty/pcre2/src/pcre2_serialize.c
+ ../../3rdparty/pcre2/src/pcre2_string_utils.c
+ ../../3rdparty/pcre2/src/pcre2_study.c
+ ../../3rdparty/pcre2/src/pcre2_substitute.c
+ ../../3rdparty/pcre2/src/pcre2_substring.c
+ ../../3rdparty/pcre2/src/pcre2_tables.c
+ ../../3rdparty/pcre2/src/pcre2_ucd.c
+ ../../3rdparty/pcre2/src/pcre2_ucp.h
+ ../../3rdparty/pcre2/src/pcre2_valid_utf.c
+ ../../3rdparty/pcre2/src/pcre2_xclass.c
+ ../../corelib/codecs/qlatincodec.cpp
+ ../../corelib/codecs/qtextcodec.cpp
+ ../../corelib/codecs/qutfcodec.cpp
+ ../../corelib/global/qendian.cpp
+ ../../corelib/global/qglobal.cpp
+ ../../corelib/global/qlogging.cpp
+ ../../corelib/global/qmalloc.cpp
+ ../../corelib/global/qnumeric.cpp
+ ../../corelib/global/qoperatingsystemversion.cpp
+ ../../corelib/global/qrandom.cpp
+ ../../corelib/io/qabstractfileengine.cpp
+ ../../corelib/io/qbuffer.cpp
+ ../../corelib/io/qdebug.cpp
+ ../../corelib/io/qdir.cpp
+ ../../corelib/io/qdiriterator.cpp
+ ../../corelib/io/qfile.cpp
+ ../../corelib/io/qfiledevice.cpp
+ ../../corelib/io/qfileinfo.cpp
+ ../../corelib/io/qfilesystemengine.cpp
+ ../../corelib/io/qfilesystementry.cpp
+ ../../corelib/io/qfsfileengine.cpp
+ ../../corelib/io/qfsfileengine_iterator.cpp
+ ../../corelib/io/qiodevice.cpp
+ ../../corelib/io/qipaddress.cpp
+ ../../corelib/io/qloggingcategory.cpp
+ ../../corelib/io/qloggingregistry.cpp
+ ../../corelib/io/qresource.cpp
+ ../../corelib/io/qsavefile.cpp
+ ../../corelib/io/qstandardpaths.cpp
+ ../../corelib/io/qtemporarydir.cpp
+ ../../corelib/io/qtemporaryfile.cpp
+ ../../corelib/io/qurl.cpp
+ ../../corelib/io/qurlidna.cpp
+ ../../corelib/io/qurlquery.cpp
+ ../../corelib/io/qurlrecode.cpp
+ ../../corelib/kernel/qcoreapplication.cpp
+ ../../corelib/kernel/qcoreglobaldata.cpp
+ ../../corelib/kernel/qmetatype.cpp
+ ../../corelib/kernel/qsharedmemory.cpp
+ ../../corelib/kernel/qsystemerror.cpp
+ ../../corelib/kernel/qsystemsemaphore.cpp
+ ../../corelib/kernel/qvariant.cpp
+ ../../corelib/plugin/quuid.cpp
+ ../../corelib/serialization/qcborcommon.cpp
+ ../../corelib/serialization/qcborstreamwriter.cpp
+ ../../corelib/serialization/qcborvalue.cpp
+ ../../corelib/serialization/qdatastream.cpp
+ ../../corelib/serialization/qjsonarray.cpp
+ ../../corelib/serialization/qjsoncbor.cpp
+ ../../corelib/serialization/qjsondocument.cpp
+ ../../corelib/serialization/qjsonobject.cpp
+ ../../corelib/serialization/qjsonparser.cpp
+ ../../corelib/serialization/qjsonvalue.cpp
+ ../../corelib/serialization/qjsonwriter.cpp
+ ../../corelib/serialization/qtextstream.cpp
+ ../../corelib/serialization/qxmlstream.cpp
+ ../../corelib/serialization/qxmlutils.cpp
+ ../../corelib/text/qbytearray.cpp
+ ../../corelib/text/qbytearraylist.cpp
+ ../../corelib/text/qbytearraymatcher.cpp
+ ../../corelib/text/qlocale.cpp
+ ../../corelib/text/qlocale_tools.cpp
+ ../../corelib/text/qregexp.cpp
+ ../../corelib/text/qregularexpression.cpp
+ ../../corelib/text/qstring.cpp
+ ../../corelib/text/qstring_compat.cpp
+ ../../corelib/text/qstringbuilder.cpp
+ ../../corelib/text/qstringlist.cpp
+ ../../corelib/text/qstringview.cpp
+ ../../corelib/text/qvsnprintf.cpp
+ ../../corelib/time/qcalendar.cpp
+ ../../corelib/time/qdatetime.cpp
+ ../../corelib/time/qgregoriancalendar.cpp
+ ../../corelib/time/qromancalendar.cpp
+ ../../corelib/tools/qarraydata.cpp
+ ../../corelib/tools/qbitarray.cpp
+ ../../corelib/tools/qcommandlineoption.cpp
+ ../../corelib/tools/qcommandlineparser.cpp
+ ../../corelib/tools/qcryptographichash.cpp
+ ../../corelib/tools/qhash.cpp
+ ../../corelib/tools/qline.cpp
+ ../../corelib/tools/qmap.cpp
+ ../../corelib/tools/qpoint.cpp
+ ../../corelib/tools/qrect.cpp
+ ../../corelib/tools/qringbuffer.cpp
+ ../../corelib/tools/qsize.cpp
+ ../../corelib/tools/qversionnumber.cpp
+ ../../xml/dom/qdom.cpp
+ ../../xml/sax/qxml.cpp
+ DEFINES
+ HAVE_CONFIG_H
+ PCRE2_CODE_UNIT_WIDTH=16
+ PCRE2_DISABLE_JIT
+ PUBLIC_DEFINES # special case
+ QT_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} # special case
+ QT_VERSION_MINOR=${PROJECT_VERSION_MINOR} # special case
+ QT_VERSION_PATCH=${PROJECT_VERSION_PATCH} # special case
+ QT_VERSION_STR="${PROJECT_VERSION}" # special case
+ QT_USE_QSTRINGBUILDER # special case
+ QT_BOOTSTRAPPED
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_TO_ASCII
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ ..
+ ../../3rdparty/tinycbor/src
+ PUBLIC_INCLUDE_DIRECTORIES # special case
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/pcre2/src>
+ $<TARGET_PROPERTY:Core,INCLUDE_DIRECTORIES> # special case
+ $<TARGET_PROPERTY:Xml,INCLUDE_DIRECTORIES> # special case
+ PUBLIC_LIBRARIES # special case
+ Qt::Platform # special case
+)
+
+#### Keys ignored in scope 1:.:.:bootstrap.pro:<TRUE>:
+# INSTALLS = "lib"
+# MODULE_CONFIG = "gc_binaries"
+# MODULE_INCNAME = "QtCore" "QtXml"
+# _OPTION = "host_build"
+# lib.CONFIG = "dummy_install"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(Bootstrap CONDITION UNIX
+ SOURCES
+ ../../corelib/io/qfilesystemengine_unix.cpp
+ ../../corelib/io/qfilesystemiterator_unix.cpp
+ ../../corelib/io/qfsfileengine_unix.cpp
+ ../../corelib/kernel/qcore_unix.cpp
+ ../../corelib/kernel/qsharedmemory_posix.cpp
+ ../../corelib/kernel/qsharedmemory_systemv.cpp
+ ../../corelib/kernel/qsharedmemory_unix.cpp
+ ../../corelib/kernel/qsystemsemaphore_posix.cpp
+ ../../corelib/kernel/qsystemsemaphore_systemv.cpp
+ ../../corelib/kernel/qsystemsemaphore_unix.cpp
+)
+
+qt_extend_target(Bootstrap CONDITION WIN32
+ SOURCES
+ ../../corelib/global/qoperatingsystemversion_win.cpp
+ ../../corelib/io/qfilesystemengine_win.cpp
+ ../../corelib/io/qfilesystemiterator_win.cpp
+ ../../corelib/io/qfsfileengine_win.cpp
+ ../../corelib/io/qstandardpaths_win.cpp
+ ../../corelib/kernel/qcoreapplication_win.cpp
+ ../../corelib/kernel/qsharedmemory_win.cpp
+ ../../corelib/kernel/qsystemsemaphore_win.cpp
+ ../../corelib/kernel/qwinregistry.cpp
+ ../../corelib/plugin/qsystemlibrary.cpp
+ PUBLIC_DEFINES
+ PCRE2_STATIC
+ PUBLIC_LIBRARIES
+ advapi32
+ netapi32
+ ole32
+ shell32
+ user32
+)
+
+qt_extend_target(Bootstrap CONDITION APPLE
+ SOURCES
+ ../../corelib/global/qoperatingsystemversion_darwin.mm
+ ../../corelib/kernel/qcore_foundation.mm
+ ../../corelib/kernel/qcore_mac.mm
+ ../../corelib/kernel/qcoreapplication_mac.cpp
+ PUBLIC_LIBRARIES
+ ${FWFoundation}
+)
+
+qt_extend_target(Bootstrap CONDITION MACOS
+ SOURCES
+ ../../corelib/io/qstandardpaths_mac.mm
+ LIBRARIES
+ ${FWCoreServices}
+)
+
+qt_extend_target(Bootstrap CONDITION UIKIT
+ LIBRARIES
+ ${FWUIKit}
+)
+
+qt_extend_target(Bootstrap CONDITION UNIX AND NOT MACOS
+ SOURCES
+ ../../corelib/io/qstandardpaths_unix.cpp
+)
+
+qt_extend_target(Bootstrap CONDITION CMAKE_CROSSCOMPILING OR NOT QT_FEATURE_system_zlib
+ SOURCES
+ ../../3rdparty/zlib/src/adler32.c
+ ../../3rdparty/zlib/src/compress.c
+ ../../3rdparty/zlib/src/crc32.c
+ ../../3rdparty/zlib/src/deflate.c
+ ../../3rdparty/zlib/src/gzclose.c
+ ../../3rdparty/zlib/src/gzlib.c
+ ../../3rdparty/zlib/src/gzread.c
+ ../../3rdparty/zlib/src/gzwrite.c
+ ../../3rdparty/zlib/src/infback.c
+ ../../3rdparty/zlib/src/inffast.c
+ ../../3rdparty/zlib/src/inflate.c
+ ../../3rdparty/zlib/src/inftrees.c
+ ../../3rdparty/zlib/src/trees.c
+ ../../3rdparty/zlib/src/uncompr.c
+ ../../3rdparty/zlib/src/zutil.c
+ INCLUDE_DIRECTORIES
+ ../../3rdparty/zlib/src
+)
+
+qt_extend_target(Bootstrap CONDITION QT_FEATURE_system_zlib AND NOT CMAKE_CROSSCOMPILING
+ LIBRARIES
+ ZLIB::ZLIB
+)
+
+qt_extend_target(Bootstrap CONDITION WIN32 AND mingw
+ PUBLIC_LIBRARIES
+ uuid
+)
+
+# special case begin
+qt_internal_add_link_flags_gc_sections(Bootstrap PUBLIC)
+set_target_properties(Bootstrap PROPERTIES AUTOMOC OFF AUTOUIC OFF AUTORCC OFF)
+qt_internal_add_target_aliases(Bootstrap)
+qt_enable_msvc_cplusplus_define(Bootstrap PUBLIC)
+# special case end
diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro
index c212ccbb6f..eb267fc7bb 100644
--- a/src/tools/bootstrap/bootstrap.pro
+++ b/src/tools/bootstrap/bootstrap.pro
@@ -14,6 +14,9 @@ MODULE_DEFINES = \
QT_NO_CAST_TO_ASCII
MODULE_CONFIG = gc_binaries
+DEFINES += PCRE2_DISABLE_JIT
+include(../../3rdparty/pcre2/pcre2.pri)
+
DEFINES += \
$$MODULE_DEFINES \
QT_NO_FOREACH \
@@ -21,7 +24,8 @@ DEFINES += \
INCLUDEPATH += \
$$PWD/.. \
- $$PWD/../../3rdparty/tinycbor/src
+ $$PWD/../../3rdparty/tinycbor/src \
+ $$PWD/../../3rdparty/pcre2/src
SOURCES += \
../../corelib/codecs/qlatincodec.cpp \
@@ -87,6 +91,7 @@ SOURCES += \
../../corelib/text/qlocale.cpp \
../../corelib/text/qlocale_tools.cpp \
../../corelib/text/qregexp.cpp \
+ ../../corelib/text/qregularexpression.cpp \
../../corelib/text/qstring.cpp \
../../corelib/text/qstringbuilder.cpp \
../../corelib/text/qstring_compat.cpp \
@@ -103,7 +108,6 @@ SOURCES += \
../../corelib/tools/qcommandlineoption.cpp \
../../corelib/tools/qcryptographichash.cpp \
../../corelib/tools/qhash.cpp \
- ../../corelib/tools/qlist.cpp \
../../corelib/tools/qmap.cpp \
../../corelib/tools/qringbuffer.cpp \
../../corelib/tools/qpoint.cpp \
diff --git a/src/tools/cmake_automoc_parser/CMakeLists.txt b/src/tools/cmake_automoc_parser/CMakeLists.txt
new file mode 100644
index 0000000000..73303215bb
--- /dev/null
+++ b/src/tools/cmake_automoc_parser/CMakeLists.txt
@@ -0,0 +1,18 @@
+#####################################################################
+## moc Tool:
+#####################################################################
+
+qt_add_tool(cmake_automoc_parser
+ BOOTSTRAP
+ TOOLS_TARGET Core # special case
+ SOURCES
+ main.cpp
+ DEFINES
+ QT_MOC
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_FROM_BYTEARRAY
+ QT_NO_COMPRESS
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
diff --git a/src/tools/cmake_automoc_parser/main.cpp b/src/tools/cmake_automoc_parser/main.cpp
new file mode 100644
index 0000000000..60eb4b2977
--- /dev/null
+++ b/src/tools/cmake_automoc_parser/main.cpp
@@ -0,0 +1,399 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/qglobal.h>
+
+#include <cstdio>
+#include <cstdlib>
+
+#include <qfile.h>
+#include <qjsonarray.h>
+#include <qjsondocument.h>
+#include <qjsonobject.h>
+#include <qdir.h>
+#include <qstring.h>
+#include <qhash.h>
+#include <qvector.h>
+#include <qstack.h>
+#include <qdebug.h>
+#include <qset.h>
+#include <qmap.h>
+#include <qcoreapplication.h>
+#include <qcommandlineoption.h>
+#include <qcommandlineparser.h>
+
+QT_BEGIN_NAMESPACE
+
+using AutoGenHeaderMap = QMap<QString, QString>;
+using AutoGenSourcesList = QVector<QString>;
+
+static bool readAutogenInfoJson(AutoGenHeaderMap &headers, AutoGenSourcesList &sources,
+ QStringList &headerExts, const QString &autoGenInfoJsonPath)
+{
+ QFile file(autoGenInfoJsonPath);
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ fprintf(stderr, "Could not open: %s\n", qPrintable(autoGenInfoJsonPath));
+ return false;
+ }
+
+ const QByteArray contents = file.readAll();
+ file.close();
+
+ QJsonParseError error;
+ QJsonDocument doc = QJsonDocument::fromJson(contents, &error);
+
+ if (error.error != QJsonParseError::NoError) {
+ fprintf(stderr, "Failed to parse json file: %s\n", qPrintable(autoGenInfoJsonPath));
+ return false;
+ }
+
+ QJsonObject rootObject = doc.object();
+ QJsonValue headersValue = rootObject.value(QLatin1String("HEADERS"));
+ QJsonValue sourcesValue = rootObject.value(QLatin1String("SOURCES"));
+ QJsonValue headerExtValue = rootObject.value(QLatin1String("HEADER_EXTENSIONS"));
+
+ if (!headersValue.isArray() || !sourcesValue.isArray() || !headerExtValue.isArray()) {
+ fprintf(stderr,
+ "%s layout does not match the expected layout. This most likely means that file "
+ "format changed or this file is not a product of CMake's AutoGen process.\n",
+ qPrintable(autoGenInfoJsonPath));
+ return false;
+ }
+
+ QJsonArray headersArray = headersValue.toArray();
+ QJsonArray sourcesArray = sourcesValue.toArray();
+ QJsonArray headerExtArray = headerExtValue.toArray();
+
+ for (const auto &value : headersArray) {
+ QJsonArray entry_array = value.toArray();
+ if (entry_array.size() > 2) {
+ // Array[0] : header path
+ // Array[2] : Location of the generated moc file for this header
+ // if no source file includes it
+ headers.insert(entry_array[0].toString(), entry_array[2].toString());
+ }
+ }
+
+ sources.reserve(sourcesArray.size());
+ for (const auto &value : sourcesArray) {
+ QJsonArray entry_array = value.toArray();
+ if (entry_array.size() > 1) {
+ sources.push_back(entry_array[0].toString());
+ }
+ }
+
+ headerExts.reserve(headerExtArray.size());
+ for (const auto &value : headerExtArray) {
+ headerExts.push_back(value.toString());
+ }
+
+ return true;
+}
+
+struct ParseCacheEntry
+{
+ QStringList mocFiles;
+ QStringList mocIncludes;
+};
+
+using ParseCacheMap = QMap<QString, ParseCacheEntry>;
+
+static bool readParseCache(ParseCacheMap &entries, const QString &parseCacheFilePath)
+{
+
+ QFile file(parseCacheFilePath);
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ fprintf(stderr, "Could not open: %s\n", qPrintable(parseCacheFilePath));
+ return false;
+ }
+
+ QString source;
+ QStringList mocEntries;
+ QStringList mocIncludes;
+
+ // File format
+ // ....
+ // header/source path N
+ // mmc:Q_OBJECT| mcc:Q_GADGET # This file has been mocked
+ // miu:moc_....cpp # Path of the moc.cpp file generated for the above file
+ // relative to TARGET_BINARY_DIR/TARGET_autgen/include directory. Not
+ // present for headers.
+ // mid: ....moc # Path of .moc file generated for the above file relative
+ // to TARGET_BINARY_DIR/TARGET_autogen/include directory.
+ // uic: UI related info, ignored
+ // mdp: Moc dependencies, ignored
+ // udp: UI dependencies, ignored
+ // header/source path N + 1
+ // ....
+
+ QTextStream textStream(&file);
+ const QString mmcKey = QString(QLatin1String(" mmc:"));
+ const QString miuKey = QString(QLatin1String(" miu:"));
+ const QString uicKey = QString(QLatin1String(" uic:"));
+ const QString midKey = QString(QLatin1String(" mid:"));
+ const QString mdpKey = QString(QLatin1String(" mdp:"));
+ const QString udpKey = QString(QLatin1String(" udp:"));
+ QString line;
+ bool mmc_key_found = false;
+ while (textStream.readLineInto(&line)) {
+ if (!line.startsWith(QLatin1Char(' '))) {
+ if (!mocEntries.isEmpty() || mmc_key_found || !mocIncludes.isEmpty()) {
+ entries.insert(source,
+ ParseCacheEntry { std::move(mocEntries), std::move(mocIncludes) });
+ source.clear();
+ mmc_key_found = false;
+ }
+ source = line;
+ } else if (line.startsWith(mmcKey)) {
+ mmc_key_found = true;
+ } else if (line.startsWith(miuKey)) {
+ mocIncludes.push_back(line.right(line.size() - miuKey.size()));
+ } else if (line.startsWith(midKey)) {
+ mocEntries.push_back(line.right(line.size() - midKey.size()));
+ } else if (line.startsWith(uicKey) || line.startsWith(mdpKey) || line.startsWith(udpKey)) {
+ // nothing to do ignore
+ continue;
+ } else {
+ fprintf(stderr, "Unhandled line entry \"%s\" in %s\n", qPrintable(line),
+ qPrintable(parseCacheFilePath));
+ return false;
+ }
+ }
+
+ // Check if last entry has any data left to processed
+ if (!mocEntries.isEmpty() || !mocIncludes.isEmpty() || mmc_key_found) {
+ entries.insert(source, ParseCacheEntry { std::move(mocEntries), std::move(mocIncludes) });
+ }
+
+ file.close();
+ return true;
+}
+
+static bool readJsonFiles(QVector<QString> &entries, const QString &filePath)
+{
+
+ QFile file(filePath);
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ fprintf(stderr, "Could not open: %s\n", qPrintable(filePath));
+ return false;
+ }
+
+ QTextStream textStream(&file);
+ QString line;
+ while (textStream.readLineInto(&line)) {
+ entries.push_back(line);
+ }
+ file.close();
+ return true;
+}
+
+static bool writeJsonFiles(const QVector<QString> &fileList, const QString &fileListFilePath)
+{
+ QFile file(fileListFilePath);
+ if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+ fprintf(stderr, "Could not open: %s\n", qPrintable(fileListFilePath));
+ return false;
+ }
+
+ QTextStream textStream(&file);
+ for (const auto &file : fileList) {
+ textStream << file << Qt::endl;
+ }
+
+ file.close();
+ return true;
+}
+
+int main(int argc, char **argv)
+{
+
+ QCoreApplication app(argc, argv);
+ QCommandLineParser parser;
+ parser.setApplicationDescription(QStringLiteral("Qt CMake Autogen parser tool"));
+
+ parser.addHelpOption();
+ parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
+
+ QCommandLineOption outputFileOption(QStringLiteral("output-file-path"));
+ outputFileOption.setDescription(
+ QStringLiteral("Output file where the meta type file list will be written."));
+ outputFileOption.setValueName(QStringLiteral("output file"));
+ parser.addOption(outputFileOption);
+
+ QCommandLineOption cmakeAutogenCacheFileOption(QStringLiteral("cmake-autogen-cache-file"));
+ cmakeAutogenCacheFileOption.setDescription(
+ QStringLiteral("Location of the CMake AutoGen ParseCache.txt file."));
+ cmakeAutogenCacheFileOption.setValueName(QStringLiteral("CMake AutoGen ParseCache.txt file"));
+ parser.addOption(cmakeAutogenCacheFileOption);
+
+ QCommandLineOption cmakeAutogenInfoFileOption(QStringLiteral("cmake-autogen-info-file"));
+ cmakeAutogenInfoFileOption.setDescription(
+ QStringLiteral("Location of the CMake AutoGen AutogenInfo.json file."));
+ cmakeAutogenInfoFileOption.setValueName(QStringLiteral("CMake AutoGen AutogenInfo.json file"));
+ parser.addOption(cmakeAutogenInfoFileOption);
+
+ QCommandLineOption cmakeAutogenIncludeDirOption(
+ QStringLiteral("cmake-autogen-include-dir-path"));
+ cmakeAutogenIncludeDirOption.setDescription(
+ QStringLiteral("Location of the CMake AutoGen include directory."));
+ cmakeAutogenIncludeDirOption.setValueName(QStringLiteral("CMake AutoGen include directory"));
+ parser.addOption(cmakeAutogenIncludeDirOption);
+
+ QCommandLineOption isMultiConfigOption(
+ QStringLiteral("cmake-multi-config"));
+ isMultiConfigOption.setDescription(
+ QStringLiteral("Set this option when using CMake with a multi-config generator"));
+ parser.addOption(isMultiConfigOption);
+
+ QStringList arguments = QCoreApplication::arguments();
+ parser.process(arguments);
+
+ if (!parser.isSet(outputFileOption) || !parser.isSet(cmakeAutogenInfoFileOption)
+ || !parser.isSet(cmakeAutogenCacheFileOption)
+ || !parser.isSet(cmakeAutogenIncludeDirOption)) {
+ parser.showHelp(1);
+ return EXIT_FAILURE;
+ }
+
+ // Read source files from AutogenInfo.json
+ AutoGenHeaderMap autoGenHeaders;
+ AutoGenSourcesList autoGenSources;
+ QStringList headerExtList;
+ if (!readAutogenInfoJson(autoGenHeaders, autoGenSources, headerExtList,
+ parser.value(cmakeAutogenInfoFileOption))) {
+ return EXIT_FAILURE;
+ }
+
+ ParseCacheMap parseCacheEntries;
+ if (!readParseCache(parseCacheEntries, parser.value(cmakeAutogenCacheFileOption))) {
+ return EXIT_FAILURE;
+ }
+
+ const QString cmakeIncludeDir = parser.value(cmakeAutogenIncludeDirOption);
+
+ // Algorithm description
+ // 1) For each source from the AutoGenSources list check if there is a parse
+ // cache entry.
+ // 1a) If an entry was wound there exists an moc_...cpp file somewhere.
+ // Remove the header file from the AutoGenHeader files
+ // 1b) For every matched source entry, check the moc includes as it is
+ // possible for a source file to include moc files from other headers.
+ // Remove the header from AutoGenHeaders
+ // 2) For every remaining header in AutoGenHeaders, check if there is an
+ // entry for it in the parse cache. Use the value for the location of the
+ // moc.json file
+
+ QVector<QString> jsonFileList;
+ QDir dir(cmakeIncludeDir);
+ jsonFileList.reserve(autoGenSources.size());
+
+ // 1) Process sources
+ for (const auto &source : autoGenSources) {
+ auto it = parseCacheEntries.find(source);
+ if (it == parseCacheEntries.end()) {
+ continue;
+ }
+
+ const QFileInfo fileInfo(source);
+ const QString base = fileInfo.path() + fileInfo.completeBaseName();
+ // 1a) erase header
+ for (const auto &ext : headerExtList) {
+ const QString headerPath = base + QLatin1Char('.') + ext;
+ auto it = autoGenHeaders.find(headerPath);
+ if (it != autoGenHeaders.end()) {
+ autoGenHeaders.erase(it);
+ break;
+ }
+ }
+ // Add extra moc files
+ for (const auto &mocFile : it.value().mocFiles) {
+ jsonFileList.push_back(dir.filePath(mocFile) + QLatin1String(".json"));
+ }
+ // Add main moc files
+ for (const auto &mocFile : it.value().mocIncludes) {
+ jsonFileList.push_back(dir.filePath(mocFile) + QLatin1String(".json"));
+ // 1b) Locate this header and delete it
+ constexpr int mocKeyLen = 4; // length of "moc_"
+ const QString headerBaseName =
+ QFileInfo(mocFile.right(mocFile.size() - mocKeyLen)).completeBaseName();
+ bool breakFree = false;
+ for (auto &ext : headerExtList) {
+ const QString headerSuffix = headerBaseName + QLatin1Char('.') + ext;
+ for (auto it = autoGenHeaders.begin(); it != autoGenHeaders.end(); ++it) {
+ if (it.key().endsWith(headerSuffix)
+ && QFileInfo(it.key()).completeBaseName() == headerBaseName) {
+ autoGenHeaders.erase(it);
+ breakFree = true;
+ break;
+ }
+ }
+ if (breakFree) {
+ break;
+ }
+ }
+ }
+ }
+
+ // 2) Process headers
+ const bool isMultiConfig = parser.isSet(isMultiConfigOption);
+ for (auto mapIt = autoGenHeaders.begin(); mapIt != autoGenHeaders.end(); ++mapIt) {
+ auto it = parseCacheEntries.find(mapIt.key());
+ if (it == parseCacheEntries.end()) {
+ continue;
+ }
+ const QString pathPrefix = !isMultiConfig
+ ? QStringLiteral("../")
+ : QString();
+ const QString jsonPath =
+ dir.filePath(pathPrefix + mapIt.value() + QLatin1String(".json"));
+ jsonFileList.push_back(jsonPath);
+ }
+
+ // Sort for consistent checks across runs
+ jsonFileList.sort();
+
+ // Read Previous file list (if any)
+ const QString fileListFilePath = parser.value(outputFileOption);
+ QVector<QString> previousList;
+ QFile prev_file(fileListFilePath);
+
+ // Only try to open file if it exists to avoid error messages
+ if (prev_file.exists()) {
+ (void)readJsonFiles(previousList, fileListFilePath);
+ }
+
+ if (previousList != jsonFileList || !QFile(fileListFilePath).exists()) {
+ if (!writeJsonFiles(jsonFileList, fileListFilePath)) {
+ return EXIT_FAILURE;
+ }
+ }
+
+ return EXIT_SUCCESS;
+}
+
+QT_END_NAMESPACE
diff --git a/src/tools/moc/.prev_CMakeLists.txt b/src/tools/moc/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..ffadd2e2be
--- /dev/null
+++ b/src/tools/moc/.prev_CMakeLists.txt
@@ -0,0 +1,35 @@
+# Generated from moc.pro.
+
+#####################################################################
+## moc Tool:
+#####################################################################
+
+qt_add_tool(moc
+ BOOTSTRAP
+ SOURCES
+ cbordevice.h
+ collectjson.cpp collectjson.h
+ generator.cpp generator.h
+ main.cpp
+ moc.cpp moc.h
+ outputrevision.h
+ parser.cpp parser.h
+ preprocessor.cpp preprocessor.h
+ qdatetime_p.h
+ symbols.h
+ token.cpp token.h
+ utils.h
+ DEFINES
+ QT_MOC
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_FROM_BYTEARRAY
+ QT_NO_COMPRESS
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ../../3rdparty/tinycbor/src
+)
+
+#### Keys ignored in scope 1:.:.:moc.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt Meta Object Compiler"
+# _OPTION = "host_build"
diff --git a/src/tools/moc/CMakeLists.txt b/src/tools/moc/CMakeLists.txt
new file mode 100644
index 0000000000..c9786674f1
--- /dev/null
+++ b/src/tools/moc/CMakeLists.txt
@@ -0,0 +1,36 @@
+# Generated from moc.pro.
+
+#####################################################################
+## moc Tool:
+#####################################################################
+
+qt_add_tool(moc
+ BOOTSTRAP
+ TOOLS_TARGET Core # special case
+ SOURCES
+ cbordevice.h
+ collectjson.cpp collectjson.h
+ generator.cpp generator.h
+ main.cpp
+ moc.cpp moc.h
+ outputrevision.h
+ parser.cpp parser.h
+ preprocessor.cpp preprocessor.h
+ # qdatetime_p.h special case remove
+ symbols.h
+ token.cpp token.h
+ utils.h
+ DEFINES
+ QT_MOC
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_CAST_FROM_BYTEARRAY
+ QT_NO_COMPRESS
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ../../3rdparty/tinycbor/src
+)
+
+#### Keys ignored in scope 1:.:.:moc.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt Meta Object Compiler"
+# _OPTION = "host_build"
diff --git a/src/tools/moc/collectjson.cpp b/src/tools/moc/collectjson.cpp
index 4029bca5e9..fe499151cb 100644
--- a/src/tools/moc/collectjson.cpp
+++ b/src/tools/moc/collectjson.cpp
@@ -83,7 +83,9 @@ int collectJson(const QStringList &jsonFiles, const QString &outputFile)
}
}
- for (const QString &jsonFile: jsonFiles) {
+ QStringList jsonFilesSorted = jsonFiles;
+ jsonFilesSorted.sort();
+ for (const QString &jsonFile : qAsConst(jsonFilesSorted)) {
QFile f(jsonFile);
if (!f.open(QIODevice::ReadOnly)) {
fprintf(stderr, "Error opening %s for reading\n", qPrintable(jsonFile));
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index 7264b5bf66..c0e1dca748 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -194,7 +194,6 @@ static bool qualifiedNameEquals(const QByteArray &qualifiedName, const QByteArra
void Generator::generateCode()
{
- bool isQt = (cdef->classname == "Qt");
bool isQObject = (cdef->classname == "QObject");
bool isConstructible = !cdef->constructorList.isEmpty();
@@ -237,7 +236,7 @@ void Generator::generateCode()
//
const int constCharArraySizeLimit = 65535;
fprintf(out, "struct qt_meta_stringdata_%s_t {\n", qualifiedClassNameIdentifier.constData());
- fprintf(out, " QByteArrayData data[%d];\n", strings.size());
+ fprintf(out, " const uint offsetsAndSize[%d];\n", strings.size()*2);
{
int stringDataLength = 0;
int stringDataCounter = 0;
@@ -260,11 +259,8 @@ void Generator::generateCode()
// stringdata.stringdata member, and 2) the stringdata.data index of the
// QByteArrayData being defined. This calculation relies on the
// QByteArrayData::data() implementation returning simply "this + offset".
- fprintf(out, "#define QT_MOC_LITERAL(idx, ofs, len) \\\n"
- " Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \\\n"
- " qptrdiff(offsetof(qt_meta_stringdata_%s_t, stringdata0) + ofs \\\n"
- " - idx * sizeof(QByteArrayData)) \\\n"
- " )\n",
+ fprintf(out, "#define QT_MOC_LITERAL(ofs, len) \\\n"
+ " uint(offsetof(qt_meta_stringdata_%s_t, stringdata0) + ofs), len \n",
qualifiedClassNameIdentifier.constData());
fprintf(out, "static const qt_meta_stringdata_%s_t qt_meta_stringdata_%s = {\n",
@@ -274,7 +270,7 @@ void Generator::generateCode()
int idx = 0;
for (int i = 0; i < strings.size(); ++i) {
const QByteArray &str = strings.at(i);
- fprintf(out, "QT_MOC_LITERAL(%d, %d, %d)", i, idx, str.length());
+ fprintf(out, "QT_MOC_LITERAL(%d, %d)", idx, str.length());
if (i != strings.size() - 1)
fputc(',', out);
const QByteArray comment = str.length() > 32 ? str.left(29) + "..." : str;
@@ -452,7 +448,7 @@ void Generator::generateCode()
//
// Generate internal qt_static_metacall() function
//
- const bool hasStaticMetaCall = !isQt &&
+ const bool hasStaticMetaCall =
(cdef->hasQObject || !cdef->methodList.isEmpty()
|| !cdef->propertyList.isEmpty() || !cdef->constructorList.isEmpty());
if (hasStaticMetaCall)
@@ -480,7 +476,7 @@ void Generator::generateCode()
QByteArray unqualifiedScope = p.type.left(s);
// The scope may be a namespace for example, so it's only safe to include scopes that are known QObjects (QTBUG-2151)
- QHash<QByteArray, QByteArray>::ConstIterator scopeIt;
+ QMultiHash<QByteArray, QByteArray>::ConstIterator scopeIt;
QByteArray thisScope = cdef->qualified;
do {
@@ -534,10 +530,7 @@ void Generator::generateCode()
//
// Finally create and initialize the static meta object
//
- if (isQt)
- fprintf(out, "QT_INIT_METAOBJECT const QMetaObject QObject::staticQtMetaObject = { {\n");
- else
- fprintf(out, "QT_INIT_METAOBJECT const QMetaObject %s::staticMetaObject = { {\n", cdef->qualified.constData());
+ fprintf(out, "QT_INIT_METAOBJECT const QMetaObject %s::staticMetaObject = { {\n", cdef->qualified.constData());
if (isQObject)
fprintf(out, " nullptr,\n");
@@ -547,7 +540,7 @@ void Generator::generateCode()
fprintf(out, " QtPrivate::MetaObjectForType<%s>::value(),\n", purestSuperClass.constData());
else
fprintf(out, " nullptr,\n");
- fprintf(out, " qt_meta_stringdata_%s.data,\n"
+ fprintf(out, " qt_meta_stringdata_%s.offsetsAndSize,\n"
" qt_meta_data_%s,\n", qualifiedClassNameIdentifier.constData(),
qualifiedClassNameIdentifier.constData());
if (hasStaticMetaCall)
@@ -559,10 +552,19 @@ void Generator::generateCode()
fprintf(out, " nullptr,\n");
else
fprintf(out, " qt_meta_extradata_%s,\n", qualifiedClassNameIdentifier.constData());
- fprintf(out, " nullptr\n} };\n\n");
- if(isQt)
- return;
+ if (cdef->propertyList.isEmpty()) {
+ fprintf(out, " nullptr,\n");
+ } else {
+ fprintf(out, "qt_metaTypeArray<\n");
+ for (int i = 0; i < cdef->propertyList.count(); ++i) {
+ const PropertyDef &p = cdef->propertyList.at(i);
+ fprintf(out, "%s%s", i == 0 ? "" : ", ", p.type.data());
+ }
+ fprintf(out, ">,\n");
+ }
+
+ fprintf(out, " nullptr\n} };\n\n");
if (!cdef->hasQObject)
return;
@@ -867,6 +869,9 @@ void Generator::generateProperties()
if (p.required)
flags |= Required;
+ if (p.isQProperty)
+ flags |= IsQProperty;
+
fprintf(out, " %4d, ", stridx(p.name));
generateTypeInfo(p.type);
fprintf(out, ", 0x%.8x,\n", flags);
@@ -1015,7 +1020,9 @@ void Generator::generateMetacall()
fprintf(out, "else ");
fprintf(out,
"if (_c == QMetaObject::ReadProperty || _c == QMetaObject::WriteProperty\n"
- " || _c == QMetaObject::ResetProperty || _c == QMetaObject::RegisterPropertyMetaType) {\n"
+ " || _c == QMetaObject::ResetProperty || _c == QMetaObject::RegisterPropertyMetaType\n"
+ " || _c == QMetaObject::RegisterQPropertyObserver\n"
+ " || _c == QMetaObject::SetQPropertyBinding) {\n"
" qt_static_metacall(this, _c, _id, _a);\n"
" _id -= %d;\n }", cdef->propertyList.count());
@@ -1221,18 +1228,22 @@ void Generator::generateStaticMetacall()
fprintf(out, "%s(", f.name.constData());
int offset = 1;
- int argsCount = f.arguments.count();
- for (int j = 0; j < argsCount; ++j) {
- const ArgumentDef &a = f.arguments.at(j);
- if (j)
- fprintf(out, ",");
- fprintf(out, "(*reinterpret_cast< %s>(_a[%d]))",a.typeNameForCast.constData(), offset++);
- isUsed_a = true;
- }
- if (f.isPrivateSignal) {
- if (argsCount > 0)
- fprintf(out, ", ");
- fprintf(out, "%s", "QPrivateSignal()");
+ if (f.isRawSlot) {
+ fprintf(out, "QMethodRawArguments{ _a }");
+ } else {
+ int argsCount = f.arguments.count();
+ for (int j = 0; j < argsCount; ++j) {
+ const ArgumentDef &a = f.arguments.at(j);
+ if (j)
+ fprintf(out, ",");
+ fprintf(out, "(*reinterpret_cast< %s>(_a[%d]))",a.typeNameForCast.constData(), offset++);
+ isUsed_a = true;
+ }
+ if (f.isPrivateSignal) {
+ if (argsCount > 0)
+ fprintf(out, ", ");
+ fprintf(out, "%s", "QPrivateSignal()");
+ }
}
fprintf(out, ");");
if (f.normalizedType != "void") {
@@ -1348,6 +1359,7 @@ void Generator::generateStaticMetacall()
bool needTempVarForGet = false;
bool needSet = false;
bool needReset = false;
+ bool haveQProperties = false;
for (int i = 0; i < cdef->propertyList.size(); ++i) {
const PropertyDef &p = cdef->propertyList.at(i);
needGet |= !p.read.isEmpty() || !p.member.isEmpty();
@@ -1357,13 +1369,15 @@ void Generator::generateStaticMetacall()
needSet |= !p.write.isEmpty() || (!p.member.isEmpty() && !p.constant);
needReset |= !p.reset.isEmpty();
+ haveQProperties |= p.isQProperty;
}
fprintf(out, "\n#ifndef QT_NO_PROPERTIES\n ");
if (needElse)
fprintf(out, "else ");
fprintf(out, "if (_c == QMetaObject::ReadProperty) {\n");
- if (needGet) {
+
+ auto setupMemberAccess = [this]() {
if (cdef->hasQObject) {
#ifndef QT_NO_DEBUG
fprintf(out, " Q_ASSERT(staticMetaObject.cast(_o));\n");
@@ -1373,6 +1387,10 @@ void Generator::generateStaticMetacall()
fprintf(out, " auto *_t = reinterpret_cast<%s *>(_o);\n", cdef->classname.constData());
}
fprintf(out, " Q_UNUSED(_t)\n");
+ };
+
+ if (needGet) {
+ setupMemberAccess();
if (needTempVarForGet)
fprintf(out, " void *_v = _a[0];\n");
fprintf(out, " switch (_id) {\n");
@@ -1410,15 +1428,7 @@ void Generator::generateStaticMetacall()
fprintf(out, "if (_c == QMetaObject::WriteProperty) {\n");
if (needSet) {
- if (cdef->hasQObject) {
-#ifndef QT_NO_DEBUG
- fprintf(out, " Q_ASSERT(staticMetaObject.cast(_o));\n");
-#endif
- fprintf(out, " auto *_t = static_cast<%s *>(_o);\n", cdef->classname.constData());
- } else {
- fprintf(out, " auto *_t = reinterpret_cast<%s *>(_o);\n", cdef->classname.constData());
- }
- fprintf(out, " Q_UNUSED(_t)\n");
+ setupMemberAccess();
fprintf(out, " void *_v = _a[0];\n");
fprintf(out, " switch (_id) {\n");
for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) {
@@ -1466,15 +1476,7 @@ void Generator::generateStaticMetacall()
fprintf(out, " else ");
fprintf(out, "if (_c == QMetaObject::ResetProperty) {\n");
if (needReset) {
- if (cdef->hasQObject) {
-#ifndef QT_NO_DEBUG
- fprintf(out, " Q_ASSERT(staticMetaObject.cast(_o));\n");
-#endif
- fprintf(out, " %s *_t = static_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData());
- } else {
- fprintf(out, " %s *_t = reinterpret_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData());
- }
- fprintf(out, " Q_UNUSED(_t)\n");
+ setupMemberAccess();
fprintf(out, " switch (_id) {\n");
for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) {
const PropertyDef &p = cdef->propertyList.at(propindex);
@@ -1491,6 +1493,42 @@ void Generator::generateStaticMetacall()
fprintf(out, " }\n");
}
fprintf(out, " }");
+
+ fprintf(out, " else ");
+ fprintf(out, "if (_c == QMetaObject::RegisterQPropertyObserver) {\n");
+ if (haveQProperties) {
+ setupMemberAccess();
+ fprintf(out, " QPropertyObserver *observer = reinterpret_cast<QPropertyObserver *>(_a[0]);\n");
+ fprintf(out, " switch (_id) {\n");
+ for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) {
+ const PropertyDef &p = cdef->propertyList.at(propindex);
+ if (!p.isQProperty)
+ continue;
+ fprintf(out, " case %d: observer->setSource(_t->%s); break;\n",
+ propindex, p.name.constData());
+ }
+ fprintf(out, " default: break;\n");
+ fprintf(out, " }\n");
+ }
+ fprintf(out, " }");
+
+ fprintf(out, " else ");
+ fprintf(out, "if (_c == QMetaObject::SetQPropertyBinding) {\n");
+ if (haveQProperties) {
+ setupMemberAccess();
+ fprintf(out, " switch (_id) {\n");
+ for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) {
+ const PropertyDef &p = cdef->propertyList.at(propindex);
+ if (!p.isQProperty)
+ continue;
+ fprintf(out, " case %d: _t->%s.setBinding(*reinterpret_cast<QPropertyBinding<%s> *>(_a[0])); break;\n",
+ propindex, p.name.constData(), p.type.constData());
+ }
+ fprintf(out, " default: break;\n");
+ fprintf(out, " }\n");
+ }
+ fprintf(out, " }");
+
fprintf(out, "\n#endif // QT_NO_PROPERTIES");
needElse = true;
}
diff --git a/src/tools/moc/keywords.cpp b/src/tools/moc/keywords.cpp
index 7da8d94efc..cc7d747f5b 100644
--- a/src/tools/moc/keywords.cpp
+++ b/src/tools/moc/keywords.cpp
@@ -30,12 +30,12 @@
// DO NOT EDIT.
static const short keyword_trans[][128] = {
- {0,0,0,0,0,0,0,0,0,568,565,0,0,0,0,0,
+ {0,0,0,0,0,0,0,0,0,579,576,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 568,252,566,569,8,38,239,567,25,26,236,234,30,235,27,237,
+ 579,252,577,580,8,38,239,578,25,26,236,234,30,235,27,237,
22,22,22,22,22,22,22,22,22,22,34,41,23,39,24,43,
0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,21,8,8,8,8,8,8,8,8,8,31,571,32,238,8,
+ 8,21,8,8,8,8,8,8,8,8,8,31,582,32,238,8,
0,1,2,3,4,5,6,7,8,9,8,8,10,11,12,13,
14,8,15,16,17,18,19,20,8,8,8,36,245,37,248,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -177,7 +177,7 @@ static const short keyword_trans[][128] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,42,0,0,0,28,0,
- 574,574,574,574,574,574,574,574,574,574,0,0,0,0,0,0,
+ 585,585,585,585,585,585,585,585,585,585,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -336,7 +336,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,573,0,0,0,0,572,
+ 0,0,0,0,0,0,0,0,0,0,584,0,0,0,0,583,
0,0,0,0,0,0,0,0,0,0,0,0,0,258,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -378,7 +378,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,475,424,408,416,380,0,484,0,0,0,0,364,358,
+ 0,0,0,475,424,408,416,380,0,484,0,0,0,565,364,358,
386,0,557,472,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@@ -1021,11 +1021,22 @@ static const struct
{CHARACTER, 0, 79, 563, CHARACTER},
{CHARACTER, 0, 78, 564, CHARACTER},
{Q_REVISION_TOKEN, 0, 0, 0, CHARACTER},
+ {CHARACTER, 0, 79, 566, CHARACTER},
+ {CHARACTER, 0, 67, 567, CHARACTER},
+ {CHARACTER, 0, 95, 568, CHARACTER},
+ {CHARACTER, 0, 73, 569, CHARACTER},
+ {CHARACTER, 0, 78, 570, CHARACTER},
+ {CHARACTER, 0, 67, 571, CHARACTER},
+ {CHARACTER, 0, 76, 572, CHARACTER},
+ {CHARACTER, 0, 85, 573, CHARACTER},
+ {CHARACTER, 0, 68, 574, CHARACTER},
+ {CHARACTER, 0, 69, 575, CHARACTER},
+ {Q_MOC_INCLUDE_TOKEN, 0, 0, 0, CHARACTER},
{NEWLINE, 0, 0, 0, NOTOKEN},
{QUOTE, 0, 0, 0, NOTOKEN},
{SINGLEQUOTE, 0, 0, 0, NOTOKEN},
{WHITESPACE, 0, 0, 0, NOTOKEN},
- {HASH, 0, 35, 570, HASH},
+ {HASH, 0, 35, 581, HASH},
{PP_HASHHASH, 0, 0, 0, NOTOKEN},
{BACKSLASH, 0, 0, 0, NOTOKEN},
{CPP_COMMENT, 0, 0, 0, NOTOKEN},
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index 9dbc22dc2c..edef9d3f04 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -43,30 +43,9 @@
QT_BEGIN_NAMESPACE
// only moc needs this function
-static QByteArray normalizeType(const QByteArray &ba, bool fixScope = false)
+static QByteArray normalizeType(const QByteArray &ba)
{
- const char *s = ba.constData();
- int len = ba.size();
- char stackbuf[64];
- char *buf = (len >= 64 ? new char[len + 1] : stackbuf);
- char *d = buf;
- char last = 0;
- while(*s && is_space(*s))
- s++;
- while (*s) {
- while (*s && !is_space(*s))
- last = *d++ = *s++;
- while (*s && is_space(*s))
- s++;
- if (*s && ((is_ident_char(*s) && is_ident_char(last))
- || ((*s == ':') && (last == '<')))) {
- last = *d++ = ' ';
- }
- }
- *d = '\0';
- QByteArray result = normalizeTypeInternal(buf, d, fixScope);
- if (buf != stackbuf)
- delete [] buf;
+ QByteArray result = normalizeTypeInternal(ba.constBegin(), ba.constEnd());
return result;
}
@@ -328,6 +307,11 @@ void Moc::parseFunctionArguments(FunctionDef *def)
def->arguments.removeLast();
def->isPrivateSignal = true;
}
+ if (def->arguments.size() == 1
+ && def->arguments.constLast().normalizedType == "QMethodRawArguments") {
+ def->arguments.removeLast();
+ def->isRawSlot = true;
+ }
}
bool Moc::testFunctionAttribute(FunctionDef *def)
@@ -371,17 +355,42 @@ bool Moc::skipCxxAttributes()
return false;
}
-bool Moc::testFunctionRevision(FunctionDef *def)
+QTypeRevision Moc::parseRevision()
{
- if (test(Q_REVISION_TOKEN)) {
- next(LPAREN);
- QByteArray revision = lexemUntil(RPAREN);
- revision.remove(0, 1);
- revision.chop(1);
+ next(LPAREN);
+ QByteArray revisionString = lexemUntil(RPAREN);
+ revisionString.remove(0, 1);
+ revisionString.chop(1);
+ const QList<QByteArray> majorMinor = revisionString.split(',');
+ switch (majorMinor.length()) {
+ case 1: {
bool ok = false;
- def->revision = revision.toInt(&ok);
- if (!ok || def->revision < 0)
+ const int revision = revisionString.toInt(&ok);
+ if (!ok || !QTypeRevision::isValidSegment(revision))
error("Invalid revision");
+ return QTypeRevision::fromMinorVersion(revision);
+ }
+ case 2: { // major.minor
+ bool ok = false;
+ const int major = majorMinor[0].toInt(&ok);
+ if (!ok || !QTypeRevision::isValidSegment(major))
+ error("Invalid major version");
+ const int minor = majorMinor[1].toInt(&ok);
+ if (!ok || !QTypeRevision::isValidSegment(minor))
+ error("Invalid minor version");
+ return QTypeRevision::fromVersion(major, minor);
+ }
+ default:
+ error("Invalid revision");
+ return QTypeRevision();
+ }
+}
+
+bool Moc::testFunctionRevision(FunctionDef *def)
+{
+
+ if (test(Q_REVISION_TOKEN)) {
+ def->revision = parseRevision().toEncodedVersion<int>();
return true;
}
@@ -555,6 +564,32 @@ bool Moc::parseMaybeFunction(const ClassDef *cdef, FunctionDef *def)
return true;
}
+
+// Try to parse QProperty<MyType> propertName; members
+bool Moc::parseMaybeQProperty(ClassDef *def)
+{
+ if (!test(IDENTIFIER))
+ return false;
+
+ if (lexem() != "QProperty")
+ return false;
+
+ if (!test(LANGLE))
+ return false;
+
+ until(RANGLE);
+
+ next();
+ const auto propName = lexem();
+
+ if (!test(SEMIC))
+ return false;
+
+ def->qPropertyMembers.insert(propName);
+
+ return true;
+}
+
void Moc::parse()
{
QVector<NamespaceDef> namespaceList;
@@ -648,6 +683,11 @@ void Moc::parse()
case Q_CLASSINFO_TOKEN:
parseClassInfo(&def);
break;
+ case Q_MOC_INCLUDE_TOKEN:
+ // skip it, the namespace is parsed twice
+ next(LPAREN);
+ lexemUntil(RPAREN);
+ break;
case ENUM: {
EnumDef enumDef;
if (parseEnum(&enumDef))
@@ -691,6 +731,9 @@ void Moc::parse()
case Q_DECLARE_METATYPE_TOKEN:
parseDeclareMetatype();
break;
+ case Q_MOC_INCLUDE_TOKEN:
+ parseMocInclude();
+ break;
case USING:
if (test(NAMESPACE)) {
while (test(SCOPE) || test(IDENTIFIER))
@@ -823,6 +866,9 @@ void Moc::parse()
case Q_CLASSINFO_TOKEN:
parseClassInfo(&def);
break;
+ case Q_MOC_INCLUDE_TOKEN:
+ parseMocInclude();
+ break;
case Q_INTERFACES_TOKEN:
parseInterfaces(&def);
break;
@@ -889,7 +935,9 @@ void Moc::parse()
}
}
} else {
- index = rewind;
+ index = rewind - 1;
+ if (!parseMaybeQProperty(&def))
+ index = rewind;
}
}
}
@@ -1084,17 +1132,9 @@ void Moc::generate(FILE *out, FILE *jsonOutput)
void Moc::parseSlots(ClassDef *def, FunctionDef::Access access)
{
- int defaultRevision = -1;
- if (test(Q_REVISION_TOKEN)) {
- next(LPAREN);
- QByteArray revision = lexemUntil(RPAREN);
- revision.remove(0, 1);
- revision.chop(1);
- bool ok = false;
- defaultRevision = revision.toInt(&ok);
- if (!ok || defaultRevision < 0)
- error("Invalid revision");
- }
+ QTypeRevision defaultRevision;
+ if (test(Q_REVISION_TOKEN))
+ defaultRevision = parseRevision();
next(COLON);
while (inClass(def) && hasNext()) {
@@ -1123,8 +1163,8 @@ void Moc::parseSlots(ClassDef *def, FunctionDef::Access access)
continue;
if (funcDef.revision > 0) {
++def->revisionedMethods;
- } else if (defaultRevision != -1) {
- funcDef.revision = defaultRevision;
+ } else if (defaultRevision.isValid()) {
+ funcDef.revision = defaultRevision.toEncodedVersion<int>();
++def->revisionedMethods;
}
def->slotList += funcDef;
@@ -1138,17 +1178,9 @@ void Moc::parseSlots(ClassDef *def, FunctionDef::Access access)
void Moc::parseSignals(ClassDef *def)
{
- int defaultRevision = -1;
- if (test(Q_REVISION_TOKEN)) {
- next(LPAREN);
- QByteArray revision = lexemUntil(RPAREN);
- revision.remove(0, 1);
- revision.chop(1);
- bool ok = false;
- defaultRevision = revision.toInt(&ok);
- if (!ok || defaultRevision < 0)
- error("Invalid revision");
- }
+ QTypeRevision defaultRevision;
+ if (test(Q_REVISION_TOKEN))
+ defaultRevision = parseRevision();
next(COLON);
while (inClass(def) && hasNext()) {
@@ -1179,8 +1211,8 @@ void Moc::parseSignals(ClassDef *def)
error("Not a signal declaration");
if (funcDef.revision > 0) {
++def->revisionedMethods;
- } else if (defaultRevision != -1) {
- funcDef.revision = defaultRevision;
+ } else if (defaultRevision.isValid()) {
+ funcDef.revision = defaultRevision.toEncodedVersion<int>();
++def->revisionedMethods;
}
def->signalList += funcDef;
@@ -1194,11 +1226,14 @@ void Moc::parseSignals(ClassDef *def)
void Moc::createPropertyDef(PropertyDef &propDef)
{
+ propDef.location = index;
+
QByteArray type = parseType().name;
if (type.isEmpty())
error();
propDef.designable = propDef.scriptable = propDef.stored = "true";
propDef.user = "false";
+
/*
The Q_PROPERTY construct cannot contain any commas, since
commas separate macro arguments. We therefore expect users
@@ -1230,6 +1265,7 @@ void Moc::createPropertyDef(PropertyDef &propDef)
next();
propDef.name = lexem();
+
while (test(IDENTIFIER)) {
const QByteArray l = lexem();
if (l[0] == 'C' && l == "CONSTANT") {
@@ -1241,6 +1277,10 @@ void Moc::createPropertyDef(PropertyDef &propDef)
} else if (l[0] == 'R' && l == "REQUIRED") {
propDef.required = true;
continue;
+ } else if (l[0] == 'R' && l == "REVISION" && test(LPAREN)) {
+ prev();
+ propDef.revision = parseRevision().toEncodedVersion<int>();
+ continue;
}
QByteArray v, v2;
@@ -1273,9 +1313,10 @@ void Moc::createPropertyDef(PropertyDef &propDef)
propDef.reset = v + v2;
else if (l == "REVISION") {
bool ok = false;
- propDef.revision = v.toInt(&ok);
- if (!ok || propDef.revision < 0)
+ const int minor = v.toInt(&ok);
+ if (!ok || !QTypeRevision::isValidSegment(minor))
error(1);
+ propDef.revision = QTypeRevision::fromMinorVersion(minor).toEncodedVersion<int>();
} else
error(2);
break;
@@ -1314,11 +1355,6 @@ void Moc::createPropertyDef(PropertyDef &propDef)
error(2);
}
}
- if (propDef.read.isNull() && propDef.member.isNull()) {
- const QByteArray msg = "Property declaration " + propDef.name
- + " has no READ accessor function or associated MEMBER variable. The property will be invalid.";
- warning(msg.constData());
- }
if (propDef.constant && !propDef.write.isNull()) {
const QByteArray msg = "Property declaration " + propDef.name
+ " is both WRITEable and CONSTANT. CONSTANT will be ignored.";
@@ -1486,6 +1522,8 @@ void Moc::parseClassInfo(BaseDef *def)
next(COMMA);
if (test(STRING_LITERAL)) {
infoDef.value = symbol().unquotedLexem();
+ } else if (test(Q_REVISION_TOKEN)) {
+ infoDef.value = QByteArray::number(parseRevision().toEncodedVersion<quint16>());
} else {
// support Q_CLASSINFO("help", QT_TR_NOOP("blah"))
next(IDENTIFIER);
@@ -1563,6 +1601,16 @@ void Moc::parseDeclareMetatype()
metaTypes.append(typeName);
}
+void Moc::parseMocInclude()
+{
+ next(LPAREN);
+ QByteArray include = lexemUntil(RPAREN);
+ // remove parentheses
+ include.remove(0, 1);
+ include.chop(1);
+ includeFiles.append(include);
+}
+
void Moc::parseSlotInPrivate(ClassDef *def, FunctionDef::Access access)
{
next(LPAREN);
@@ -1751,14 +1799,34 @@ void Moc::checkProperties(ClassDef *cdef)
QSet<QByteArray> definedProperties;
for (int i = 0; i < cdef->propertyList.count(); ++i) {
PropertyDef &p = cdef->propertyList[i];
- if (p.read.isEmpty() && p.member.isEmpty())
- continue;
if (definedProperties.contains(p.name)) {
QByteArray msg = "The property '" + p.name + "' is defined multiple times in class " + cdef->classname + ".";
warning(msg.constData());
}
definedProperties.insert(p.name);
+ if (p.read.isEmpty() && p.member.isEmpty()) {
+ if (!cdef->qPropertyMembers.contains(p.name)) {
+ const int rewind = index;
+ if (p.location >= 0)
+ index = p.location;
+ QByteArray msg = "Property declaration " + p.name + " has neither an associated QProperty<> member"
+ ", nor a READ accessor function nor an associated MEMBER variable. The property will be invalid.";
+ warning(msg.constData());
+ index = rewind;
+ if (p.write.isEmpty()) {
+ cdef->propertyList.removeAt(i);
+ --i;
+ }
+ continue;
+ }
+ p.read = p.name + ".value";
+ p.write = p.name + ".setValue";
+ p.isQProperty = true;
+ p.designable = p.scriptable = p.stored = "true";
+ p.user = "false";
+ }
+
for (int j = 0; j < cdef->publicList.count(); ++j) {
const FunctionDef &f = cdef->publicList.at(j);
if (f.name != p.read)
@@ -1971,6 +2039,7 @@ QJsonObject PropertyDef::toJson() const
prop[QLatin1String("constant")] = constant;
prop[QLatin1String("final")] = final;
prop[QLatin1String("required")] = required;
+ prop[QLatin1String("isQProperty")] = isQProperty;
if (revision > 0)
prop[QLatin1String("revision")] = revision;
diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h
index a3e20a061e..210b6c7c2a 100644
--- a/src/tools/moc/moc.h
+++ b/src/tools/moc/moc.h
@@ -36,6 +36,7 @@
#include <qjsondocument.h>
#include <qjsonarray.h>
#include <qjsonobject.h>
+#include <qversionnumber.h>
#include <stdio.h>
#include <ctype.h>
@@ -115,6 +116,7 @@ struct FunctionDef
bool isConstructor = false;
bool isDestructor = false;
bool isAbstract = false;
+ bool isRawSlot = false;
QJsonObject toJson() const;
static void accessToJson(QJsonObject *obj, Access acs);
@@ -138,6 +140,9 @@ struct PropertyDef
bool constant = false;
bool final = false;
bool required = false;
+ bool isQProperty = false;
+
+ int location = -1; // token index, used for error reporting
QJsonObject toJson() const;
};
@@ -186,6 +191,7 @@ struct ClassDef : BaseDef {
QVector<FunctionDef> signalList, slotList, methodList, publicList;
QVector<QByteArray> nonClassSignalList;
QVector<PropertyDef> propertyList;
+ QSet<QByteArray> qPropertyMembers;
int notifyableProperties = 0;
int revisionedMethods = 0;
int revisionedProperties = 0;
@@ -245,6 +251,7 @@ public:
bool parseFunction(FunctionDef *def, bool inMacro = false);
bool parseMaybeFunction(const ClassDef *cdef, FunctionDef *def);
+ bool parseMaybeQProperty(ClassDef *def);
void parseSlots(ClassDef *def, FunctionDef::Access access);
void parseSignals(ClassDef *def);
@@ -257,6 +264,7 @@ public:
void parseInterfaces(ClassDef *def);
void parseDeclareInterface();
void parseDeclareMetatype();
+ void parseMocInclude();
void parseSlotInPrivate(ClassDef *def, FunctionDef::Access access);
void parsePrivateProperty(ClassDef *def);
@@ -270,6 +278,7 @@ public:
bool testFunctionAttribute(FunctionDef *def);
bool testFunctionAttribute(Token tok, FunctionDef *def);
bool testFunctionRevision(FunctionDef *def);
+ QTypeRevision parseRevision();
bool skipCxxAttributes();
diff --git a/src/tools/moc/symbols.h b/src/tools/moc/symbols.h
index af5e90e300..4bcb640760 100644
--- a/src/tools/moc/symbols.h
+++ b/src/tools/moc/symbols.h
@@ -59,7 +59,7 @@ struct SubArray
}
};
-inline uint qHash(const SubArray &key)
+inline size_t qHash(const SubArray &key)
{
return qHash(QLatin1String(key.array.constData() + key.from, key.len));
}
diff --git a/src/tools/moc/token.h b/src/tools/moc/token.h
index 0cc163f9e4..c11ec6a38c 100644
--- a/src/tools/moc/token.h
+++ b/src/tools/moc/token.h
@@ -179,6 +179,7 @@ QT_BEGIN_NAMESPACE
F(Q_SCRIPTABLE_TOKEN) \
F(Q_PRIVATE_PROPERTY_TOKEN) \
F(Q_REVISION_TOKEN) \
+ F(Q_MOC_INCLUDE_TOKEN) \
F(SPECIAL_TREATMENT_MARK) \
F(MOC_INCLUDE_BEGIN) \
F(MOC_INCLUDE_END) \
diff --git a/src/tools/moc/util/generate_keywords.cpp b/src/tools/moc/util/generate_keywords.cpp
index 9248e9e2e7..c2cfe37fab 100644
--- a/src/tools/moc/util/generate_keywords.cpp
+++ b/src/tools/moc/util/generate_keywords.cpp
@@ -243,6 +243,7 @@ static const Keyword keywords[] = {
{ "Q_SCRIPTABLE", "Q_SCRIPTABLE_TOKEN" },
{ "Q_PRIVATE_PROPERTY", "Q_PRIVATE_PROPERTY_TOKEN" },
{ "Q_REVISION", "Q_REVISION_TOKEN" },
+ { "Q_MOC_INCLUDE", "Q_MOC_INCLUDE_TOKEN" },
{ "\n", "NEWLINE" },
{ "\"", "QUOTE" },
{ "\'", "SINGLEQUOTE" },
diff --git a/src/tools/qdbuscpp2xml/.prev_CMakeLists.txt b/src/tools/qdbuscpp2xml/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..58a8ea2b08
--- /dev/null
+++ b/src/tools/qdbuscpp2xml/.prev_CMakeLists.txt
@@ -0,0 +1,45 @@
+# Generated from qdbuscpp2xml.pro.
+
+#####################################################################
+## qdbuscpp2xml Tool:
+#####################################################################
+
+qt_add_tool(qdbuscpp2xml
+ SOURCES
+ ../moc/cbordevice.h
+ ../moc/collectjson.cpp ../moc/collectjson.h
+ ../moc/generator.cpp ../moc/generator.h
+ ../moc/moc.cpp ../moc/moc.h
+ ../moc/outputrevision.h
+ ../moc/parser.cpp ../moc/parser.h
+ ../moc/preprocessor.cpp ../moc/preprocessor.h
+ ../moc/symbols.h
+ ../moc/token.cpp ../moc/token.h
+ ../moc/utils.h
+ qdbuscpp2xml.cpp
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ ../moc
+ ../moc/../../3rdparty/tinycbor/src
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+)
+
+#### Keys ignored in scope 1:.:.:qdbuscpp2xml.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt D-Bus C++ to XML Compiler"
+# _OPTION = "host_build"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(qdbuscpp2xml CONDITION force_bootstrap
+ PUBLIC_LIBRARIES
+ bootstrap_dbusPrivate
+)
+
+qt_extend_target(qdbuscpp2xml CONDITION NOT force_bootstrap
+ PUBLIC_LIBRARIES
+ Qt::DBusPrivate
+)
diff --git a/src/tools/qdbuscpp2xml/CMakeLists.txt b/src/tools/qdbuscpp2xml/CMakeLists.txt
new file mode 100644
index 0000000000..46582793a1
--- /dev/null
+++ b/src/tools/qdbuscpp2xml/CMakeLists.txt
@@ -0,0 +1,48 @@
+# Generated from qdbuscpp2xml.pro.
+
+#####################################################################
+## qdbuscpp2xml Tool:
+#####################################################################
+
+qt_add_tool(qdbuscpp2xml
+ TOOLS_TARGET DBus # special case
+ SOURCES
+ ../moc/cbordevice.h
+ ../moc/collectjson.cpp ../moc/collectjson.h
+ ../moc/generator.cpp ../moc/generator.h
+ ../moc/moc.cpp ../moc/moc.h
+ ../moc/outputrevision.h
+ ../moc/parser.cpp ../moc/parser.h
+ ../moc/preprocessor.cpp ../moc/preprocessor.h
+ ../moc/symbols.h
+ ../moc/token.cpp ../moc/token.h
+ ../moc/utils.h
+ qdbuscpp2xml.cpp
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ ../moc
+ ../moc/../../3rdparty/tinycbor/src
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::DBusPrivate
+ # COMPILE_OPTIONS # special case
+ # "$$QT_HOST_CFLAGS_DBUS"
+ # QMAKE_TARGET_DESCRIPTION = "Qt D-Bus C++ to XML Compiler"
+ # _LOADED = "qt_tool"
+ # _OPTION = "host_build"
+)
+
+#### Keys ignored in scope 1:.:.:qdbuscpp2xml.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt D-Bus C++ to XML Compiler"
+# _OPTION = "host_build"
+
+## Scopes:
+#####################################################################
+
+# special case begin
+# extend_target(qdbuscpp2xml CONDITION force_bootstrap [...])
+# extend_target(qdbuscpp2xml CONDITION NOT force_bootstrap [...])
+# special case end
+
diff --git a/src/tools/qdbusxml2cpp/.prev_CMakeLists.txt b/src/tools/qdbusxml2cpp/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..ce9438b207
--- /dev/null
+++ b/src/tools/qdbusxml2cpp/.prev_CMakeLists.txt
@@ -0,0 +1,32 @@
+# Generated from qdbusxml2cpp.pro.
+
+#####################################################################
+## qdbusxml2cpp Tool:
+#####################################################################
+
+qt_add_tool(qdbusxml2cpp
+ SOURCES
+ qdbusxml2cpp.cpp
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+)
+
+#### Keys ignored in scope 1:.:.:qdbusxml2cpp.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt D-Bus XML to C++ Compiler"
+# _OPTION = "host_build"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(qdbusxml2cpp CONDITION NOT force_bootstrap
+ PUBLIC_LIBRARIES
+ Qt::DBusPrivate
+)
+
+qt_extend_target(qdbusxml2cpp CONDITION force_bootstrap
+ PUBLIC_LIBRARIES
+ bootstrap_dbusPrivate
+)
diff --git a/src/tools/qdbusxml2cpp/CMakeLists.txt b/src/tools/qdbusxml2cpp/CMakeLists.txt
new file mode 100644
index 0000000000..63700f0b6b
--- /dev/null
+++ b/src/tools/qdbusxml2cpp/CMakeLists.txt
@@ -0,0 +1,35 @@
+# Generated from qdbusxml2cpp.pro.
+
+#####################################################################
+## qdbusxml2cpp Tool:
+#####################################################################
+
+qt_add_tool(qdbusxml2cpp
+ TOOLS_TARGET DBus # special case
+ SOURCES
+ qdbusxml2cpp.cpp
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::DBusPrivate
+ # COMPILE_OPTIONS # special case
+ # "$$QT_HOST_CFLAGS_DBUS"
+ # QMAKE_TARGET_DESCRIPTION = "Qt D-Bus XML to C++ Compiler"
+ # _LOADED = "qt_tool"
+ # _OPTION = "host_build"
+)
+
+#### Keys ignored in scope 1:.:.:qdbusxml2cpp.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt D-Bus XML to C++ Compiler"
+# _OPTION = "host_build"
+
+## Scopes:
+#####################################################################
+
+# special case begin
+# extend_target(qdbusxml2cpp CONDITION NOT force_bootstrap [...])
+# extend_target(qdbusxml2cpp CONDITION NOT QT_FEATURE_commandlineparser AND NOT force_bootstrap [...])
+# extend_target(qdbusxml2cpp CONDITION force_bootstrap [...])
+# special case end
diff --git a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp
index 9825596f3d..0493265164 100644
--- a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp
+++ b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp
@@ -72,9 +72,8 @@ static const char includeList[] =
static const char forwardDeclarations[] =
"QT_BEGIN_NAMESPACE\n"
+ "#include <QtCore/qcontainerfwd.h>\n"
"class QByteArray;\n"
- "template<class T> class QList;\n"
- "template<class Key, class Value> class QMap;\n"
"class QString;\n"
"class QStringList;\n"
"class QVariant;\n"
diff --git a/src/tools/qlalr/.prev_CMakeLists.txt b/src/tools/qlalr/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..9ff8a54ce4
--- /dev/null
+++ b/src/tools/qlalr/.prev_CMakeLists.txt
@@ -0,0 +1,26 @@
+# Generated from qlalr.pro.
+
+#####################################################################
+## qlalr Tool:
+#####################################################################
+
+qt_add_tool(qlalr
+ SOURCES
+ compress.cpp compress.h
+ cppgenerator.cpp cppgenerator.h
+ dotgraph.cpp dotgraph.h
+ grammar.cpp grammar_p.h
+ lalr.cpp lalr.h
+ main.cpp
+ parsetable.cpp parsetable.h
+ recognizer.cpp recognizer.h
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Gui
+)
+
+#### Keys ignored in scope 1:.:.:qlalr.pro:<TRUE>:
+# OTHER_FILES = "lalr.g"
+# QMAKE_TARGET_DESCRIPTION = "Qt Look Ahead LR Parser Generator"
+# _OPTION = "host_build"
diff --git a/src/tools/qlalr/CMakeLists.txt b/src/tools/qlalr/CMakeLists.txt
new file mode 100644
index 0000000000..437c8d918f
--- /dev/null
+++ b/src/tools/qlalr/CMakeLists.txt
@@ -0,0 +1,27 @@
+# Generated from qlalr.pro.
+
+#####################################################################
+## qlalr Tool:
+#####################################################################
+
+qt_add_tool(qlalr
+ TOOLS_TARGET Core # special case
+ SOURCES
+ compress.cpp compress.h
+ cppgenerator.cpp cppgenerator.h
+ dotgraph.cpp dotgraph.h
+ grammar.cpp grammar_p.h
+ lalr.cpp lalr.h
+ main.cpp
+ parsetable.cpp parsetable.h
+ recognizer.cpp recognizer.h
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core # special case
+)
+
+#### Keys ignored in scope 1:.:.:qlalr.pro:<TRUE>:
+# OTHER_FILES = "lalr.g"
+# QMAKE_TARGET_DESCRIPTION = "Qt Look Ahead LR Parser Generator"
+# _OPTION = "host_build"
diff --git a/src/tools/qlalr/lalr.h b/src/tools/qlalr/lalr.h
index 473ea89769..16c957624f 100644
--- a/src/tools/qlalr/lalr.h
+++ b/src/tools/qlalr/lalr.h
@@ -32,7 +32,6 @@
#include <QtCore/qset.h>
#include <QtCore/qstack.h>
#include <QtCore/qmap.h>
-#include <QtCore/qlinkedlist.h>
#include <QtCore/qstring.h>
#include <QtCore/qtextstream.h>
#include <QtCore/qpair.h>
diff --git a/src/tools/qvkgen/.prev_CMakeLists.txt b/src/tools/qvkgen/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..994b97a9f1
--- /dev/null
+++ b/src/tools/qvkgen/.prev_CMakeLists.txt
@@ -0,0 +1,16 @@
+# Generated from qvkgen.pro.
+
+#####################################################################
+## qvkgen Tool:
+#####################################################################
+
+qt_add_tool(qvkgen
+ SOURCES
+ qvkgen.cpp
+ PUBLIC_LIBRARIES
+ Qt::Gui
+)
+
+#### Keys ignored in scope 1:.:.:qvkgen.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt Vulkan Header Generator"
+# _OPTION = "host_build"
diff --git a/src/tools/qvkgen/CMakeLists.txt b/src/tools/qvkgen/CMakeLists.txt
new file mode 100644
index 0000000000..0f72a8b633
--- /dev/null
+++ b/src/tools/qvkgen/CMakeLists.txt
@@ -0,0 +1,17 @@
+# Generated from qvkgen.pro.
+
+#####################################################################
+## qvkgen Tool:
+#####################################################################
+
+qt_add_tool(qvkgen
+ TOOLS_TARGET Gui # special case
+ SOURCES
+ qvkgen.cpp
+ PUBLIC_LIBRARIES
+ Qt::Core # special case
+)
+
+#### Keys ignored in scope 1:.:.:qvkgen.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt Vulkan Header Generator"
+# _OPTION = "host_build"
diff --git a/src/tools/rcc/.prev_CMakeLists.txt b/src/tools/rcc/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..307f08bfa7
--- /dev/null
+++ b/src/tools/rcc/.prev_CMakeLists.txt
@@ -0,0 +1,37 @@
+# Generated from rcc.pro.
+
+#####################################################################
+## rcc Tool:
+#####################################################################
+
+qt_add_tool(rcc
+ BOOTSTRAP
+ SOURCES
+ main.cpp
+ rcc.cpp rcc.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ QT_RCC
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+#### Keys ignored in scope 1:.:.:rcc.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt Resource Compiler"
+# _OPTION = "host_build"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(rcc CONDITION QT_FEATURE_zstd AND NOT CMAKE_CROSSCOMPILING
+ DEFINES
+ QT_FEATURE_zstd=1
+ LIBRARIES
+ ZSTD::ZSTD
+)
+
+qt_extend_target(rcc CONDITION CMAKE_CROSSCOMPILING OR NOT QT_FEATURE_zstd
+ DEFINES
+ QT_FEATURE_zstd=-1
+)
diff --git a/src/tools/rcc/CMakeLists.txt b/src/tools/rcc/CMakeLists.txt
new file mode 100644
index 0000000000..e7f45314c3
--- /dev/null
+++ b/src/tools/rcc/CMakeLists.txt
@@ -0,0 +1,38 @@
+# Generated from rcc.pro.
+
+#####################################################################
+## rcc Tool:
+#####################################################################
+
+qt_add_tool(rcc
+ BOOTSTRAP
+ TOOLS_TARGET Core # special case
+ SOURCES
+ main.cpp
+ rcc.cpp rcc.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ QT_RCC
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+#### Keys ignored in scope 1:.:.:rcc.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt Resource Compiler"
+# _OPTION = "host_build"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(rcc CONDITION QT_FEATURE_zstd AND NOT CMAKE_CROSSCOMPILING
+ DEFINES
+ QT_FEATURE_zstd=1
+ LIBRARIES
+ ZSTD::ZSTD
+)
+
+qt_extend_target(rcc CONDITION CMAKE_CROSSCOMPILING OR NOT QT_FEATURE_zstd
+ DEFINES
+ QT_FEATURE_zstd=-1
+)
diff --git a/src/tools/rcc/main.cpp b/src/tools/rcc/main.cpp
index d8e243daea..0f84593552 100644
--- a/src/tools/rcc/main.cpp
+++ b/src/tools/rcc/main.cpp
@@ -180,6 +180,9 @@ int runRcc(int argc, char *argv[])
QCommandLineOption nocompressOption(QStringLiteral("no-compress"), QStringLiteral("Disable all compression. Same as --compress-algo=none."));
parser.addOption(nocompressOption);
+ QCommandLineOption noZstdOption(QStringLiteral("no-zstd"), QStringLiteral("Disable usage of zstd compression."));
+ parser.addOption(noZstdOption);
+
QCommandLineOption thresholdOption(QStringLiteral("threshold"), QStringLiteral("Threshold to consider compressing files."), QStringLiteral("level"));
parser.addOption(thresholdOption);
@@ -252,6 +255,8 @@ int runRcc(int argc, char *argv[])
errorMsg = QLatin1String("Zstandard compression requires format version 3 or higher");
if (parser.isSet(nocompressOption))
library.setCompressionAlgorithm(RCCResourceLibrary::CompressionAlgorithm::None);
+ if (parser.isSet(noZstdOption))
+ library.setNoZstd(true);
if (parser.isSet(compressOption) && errorMsg.isEmpty()) {
int level = library.parseCompressionLevel(library.compressionAlgorithm(), parser.value(compressOption), &errorMsg);
library.setCompressLevel(level);
@@ -352,8 +357,7 @@ int runRcc(int argc, char *argv[])
// Make sure QIODevice does not do LF->CRLF,
// otherwise we'll end up in CRCRLF instead of
// CRLF.
- if (list)
- mode &= ~QIODevice::Text;
+ mode &= ~QIODevice::Text;
#endif // Q_OS_WIN
// using this overload close() only flushes.
out.open(stdout, mode);
diff --git a/src/tools/rcc/rcc.cpp b/src/tools/rcc/rcc.cpp
index 7188c81300..8b1ebad14c 100644
--- a/src/tools/rcc/rcc.cpp
+++ b/src/tools/rcc/rcc.cpp
@@ -37,7 +37,6 @@
#include <qfile.h>
#include <qiodevice.h>
#include <qlocale.h>
-#include <qregexp.h>
#include <qstack.h>
#include <qxmlstream.h>
@@ -113,7 +112,8 @@ public:
uint flags = NoFlags,
RCCResourceLibrary::CompressionAlgorithm compressAlgo = CONSTANT_COMPRESSALGO_DEFAULT,
int compressLevel = CONSTANT_COMPRESSLEVEL_DEFAULT,
- int compressThreshold = CONSTANT_COMPRESSTHRESHOLD_DEFAULT);
+ int compressThreshold = CONSTANT_COMPRESSTHRESHOLD_DEFAULT,
+ bool noZstd = false);
~RCCFileInfo();
QString resourceName() const;
@@ -137,11 +137,13 @@ public:
qint64 m_nameOffset;
qint64 m_dataOffset;
qint64 m_childOffset;
+ bool m_noZstd;
};
RCCFileInfo::RCCFileInfo(const QString &name, const QFileInfo &fileInfo,
QLocale::Language language, QLocale::Country country, uint flags,
- RCCResourceLibrary::CompressionAlgorithm compressAlgo, int compressLevel, int compressThreshold)
+ RCCResourceLibrary::CompressionAlgorithm compressAlgo, int compressLevel, int compressThreshold,
+ bool noZstd)
{
m_name = name;
m_fileInfo = fileInfo;
@@ -155,6 +157,7 @@ RCCFileInfo::RCCFileInfo(const QString &name, const QFileInfo &fileInfo,
m_compressAlgo = compressAlgo;
m_compressLevel = compressLevel;
m_compressThreshold = compressThreshold;
+ m_noZstd = noZstd;
}
RCCFileInfo::~RCCFileInfo()
@@ -267,11 +270,11 @@ qint64 RCCFileInfo::writeDataBlob(RCCResourceLibrary &lib, qint64 offset,
// Check if compression is useful for this file
if (data.size() != 0) {
#if QT_CONFIG(zstd)
- if (m_compressAlgo == RCCResourceLibrary::CompressionAlgorithm::Best) {
+ if (m_compressAlgo == RCCResourceLibrary::CompressionAlgorithm::Best && !m_noZstd) {
m_compressAlgo = RCCResourceLibrary::CompressionAlgorithm::Zstd;
m_compressLevel = 19; // not ZSTD_maxCLevel(), as 20+ are experimental
}
- if (m_compressAlgo == RCCResourceLibrary::CompressionAlgorithm::Zstd) {
+ if (m_compressAlgo == RCCResourceLibrary::CompressionAlgorithm::Zstd && !m_noZstd) {
if (lib.m_zstdCCtx == nullptr)
lib.m_zstdCCtx = ZSTD_createCCtx();
qsizetype size = data.size();
@@ -471,7 +474,8 @@ RCCResourceLibrary::RCCResourceLibrary(quint8 formatVersion)
m_useNameSpace(CONSTANT_USENAMESPACE),
m_errorDevice(0),
m_outDevice(0),
- m_formatVersion(formatVersion)
+ m_formatVersion(formatVersion),
+ m_noZstd(false)
{
m_out.reserve(30 * 1000 * 1000);
#if QT_CONFIG(zstd)
@@ -651,7 +655,8 @@ bool RCCResourceLibrary::interpretResourceFile(QIODevice *inputDevice,
child.isDir() ? RCCFileInfo::Directory : RCCFileInfo::NoFlags,
compressAlgo,
compressLevel,
- compressThreshold)
+ compressThreshold,
+ m_noZstd)
);
if (!arc)
m_failedResources.push_back(child.fileName());
@@ -667,7 +672,8 @@ bool RCCResourceLibrary::interpretResourceFile(QIODevice *inputDevice,
RCCFileInfo::NoFlags,
compressAlgo,
compressLevel,
- compressThreshold)
+ compressThreshold,
+ m_noZstd)
);
if (!arc)
m_failedResources.push_back(absFileName);
@@ -744,10 +750,9 @@ bool RCCResourceLibrary::addFile(const QString &alias, const RCCFileInfo &file)
const QString filename = nodes.at(nodes.size()-1);
RCCFileInfo *s = new RCCFileInfo(file);
s->m_parent = parent;
- typedef QHash<QString, RCCFileInfo*>::const_iterator ChildConstIterator;
- const ChildConstIterator cbegin = parent->m_children.constFind(filename);
- const ChildConstIterator cend = parent->m_children.constEnd();
- for (ChildConstIterator it = cbegin; it != cend; ++it) {
+ auto cbegin = parent->m_children.constFind(filename);
+ auto cend = parent->m_children.constEnd();
+ for (auto it = cbegin; it != cend; ++it) {
if (it.key() == filename && it.value()->m_language == s->m_language &&
it.value()->m_country == s->m_country) {
for (const QString &name : qAsConst(m_fileNames)) {
@@ -823,7 +828,7 @@ QStringList RCCResourceLibrary::dataFiles() const
pending.push(m_root);
while (!pending.isEmpty()) {
RCCFileInfo *file = pending.pop();
- for (QHash<QString, RCCFileInfo*>::iterator it = file->m_children.begin();
+ for (auto it = file->m_children.begin();
it != file->m_children.end(); ++it) {
RCCFileInfo *child = it.value();
if (child->m_flags & RCCFileInfo::Directory)
@@ -838,10 +843,9 @@ QStringList RCCResourceLibrary::dataFiles() const
// Determine map of resource identifier (':/newPrefix/images/p1.png') to file via recursion
static void resourceDataFileMapRecursion(const RCCFileInfo *m_root, const QString &path, RCCResourceLibrary::ResourceDataFileMap &m)
{
- typedef QHash<QString, RCCFileInfo*>::const_iterator ChildConstIterator;
const QChar slash = QLatin1Char('/');
- const ChildConstIterator cend = m_root->m_children.constEnd();
- for (ChildConstIterator it = m_root->m_children.constBegin(); it != cend; ++it) {
+ const auto cend = m_root->m_children.constEnd();
+ for (auto it = m_root->m_children.constBegin(); it != cend; ++it) {
const RCCFileInfo *child = it.value();
const QString childName = path + slash + child->m_name;
if (child->m_flags & RCCFileInfo::Directory) {
@@ -1149,8 +1153,7 @@ bool RCCResourceLibrary::writeDataBlobs()
QString errorMessage;
while (!pending.isEmpty()) {
RCCFileInfo *file = pending.pop();
- for (QHash<QString, RCCFileInfo*>::iterator it = file->m_children.begin();
- it != file->m_children.end(); ++it) {
+ for (auto it = file->m_children.cbegin(); it != file->m_children.cend(); ++it) {
RCCFileInfo *child = it.value();
if (child->m_flags & RCCFileInfo::Directory)
pending.push(child);
@@ -1214,8 +1217,7 @@ bool RCCResourceLibrary::writeDataNames()
qint64 offset = 0;
while (!pending.isEmpty()) {
RCCFileInfo *file = pending.pop();
- for (QHash<QString, RCCFileInfo*>::iterator it = file->m_children.begin();
- it != file->m_children.end(); ++it) {
+ for (auto it = file->m_children.cbegin(); it != file->m_children.cend(); ++it) {
RCCFileInfo *child = it.value();
if (child->m_flags & RCCFileInfo::Directory)
pending.push(child);
@@ -1359,7 +1361,17 @@ bool RCCResourceLibrary::writeInitializer()
QString initNameStr = m_initName;
if (!initNameStr.isEmpty()) {
initNameStr.prepend(QLatin1Char('_'));
- initNameStr.replace(QRegExp(QLatin1String("[^a-zA-Z0-9_]")), QLatin1String("_"));
+ auto isAsciiLetterOrNumber = [] (QChar c) -> bool {
+ ushort ch = c.unicode();
+ return (ch >= '0' && ch <= '9') ||
+ (ch >= 'A' && ch <= 'Z') ||
+ (ch >= 'a' && ch <= 'z') ||
+ ch == '_';
+ };
+ for (QChar &c : initNameStr) {
+ if (!isAsciiLetterOrNumber(c))
+ c = QLatin1Char('_');
+ }
}
QByteArray initName = initNameStr.toLatin1();
diff --git a/src/tools/rcc/rcc.h b/src/tools/rcc/rcc.h
index 190c37a1f6..ac5ea15bb1 100644
--- a/src/tools/rcc/rcc.h
+++ b/src/tools/rcc/rcc.h
@@ -109,6 +109,9 @@ public:
int formatVersion() const { return m_formatVersion; }
+ void setNoZstd(bool v) { m_noZstd = v; }
+ bool noZstd() const { return m_noZstd; }
+
private:
struct Strings {
Strings();
@@ -170,6 +173,7 @@ private:
QIODevice *m_outDevice;
QByteArray m_out;
quint8 m_formatVersion;
+ bool m_noZstd;
};
QT_END_NAMESPACE
diff --git a/src/tools/tracegen/.prev_CMakeLists.txt b/src/tools/tracegen/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..87bcf362d6
--- /dev/null
+++ b/src/tools/tracegen/.prev_CMakeLists.txt
@@ -0,0 +1,20 @@
+# Generated from tracegen.pro.
+
+#####################################################################
+## tracegen Tool:
+#####################################################################
+
+qt_add_tool(tracegen
+ BOOTSTRAP
+ SOURCES
+ etw.cpp etw.h
+ helpers.cpp helpers.h
+ lttng.cpp lttng.h
+ panic.cpp panic.h
+ provider.cpp provider.h
+ qtheaders.cpp qtheaders.h
+ tracegen.cpp
+)
+
+#### Keys ignored in scope 1:.:.:tracegen.pro:<TRUE>:
+# _OPTION = "host_build"
diff --git a/src/tools/tracegen/CMakeLists.txt b/src/tools/tracegen/CMakeLists.txt
new file mode 100644
index 0000000000..0f12f823c4
--- /dev/null
+++ b/src/tools/tracegen/CMakeLists.txt
@@ -0,0 +1,21 @@
+# Generated from tracegen.pro.
+
+#####################################################################
+## tracegen Tool:
+#####################################################################
+
+qt_add_tool(tracegen
+ BOOTSTRAP
+ TOOLS_TARGET Core # special case
+ SOURCES
+ etw.cpp etw.h
+ helpers.cpp helpers.h
+ lttng.cpp lttng.h
+ panic.cpp panic.h
+ provider.cpp provider.h
+ qtheaders.cpp qtheaders.h
+ tracegen.cpp
+)
+
+#### Keys ignored in scope 1:.:.:tracegen.pro:<TRUE>:
+# _OPTION = "host_build"
diff --git a/src/tools/tracegen/provider.cpp b/src/tools/tracegen/provider.cpp
index 7dfa6a86d6..7984fa12a7 100644
--- a/src/tools/tracegen/provider.cpp
+++ b/src/tools/tracegen/provider.cpp
@@ -43,7 +43,7 @@
#include <qfile.h>
#include <qfileinfo.h>
#include <qtextstream.h>
-#include <qregexp.h>
+#include <qregularexpression.h>
#include <qstring.h>
#ifdef TRACEGEN_DEBUG
@@ -87,12 +87,13 @@ static inline int arrayLength(const QString &rawType)
/* matches the length of an ordinary array type
* Ex: foo[10] yields '10'
*/
- static const QRegExp rx(QStringLiteral(".*\\[([0-9]+)\\].*"));
+ static const QRegularExpression rx(QStringLiteral("\\[([0-9]+)\\]"));
- if (!rx.exactMatch(rawType.trimmed()))
+ auto match = rx.match(rawType);
+ if (!match.hasMatch())
return 0;
- return rx.cap(1).toInt();
+ return match.captured(1).toInt();
}
static inline QString sequenceLength(const QString &rawType)
@@ -102,12 +103,13 @@ static inline QString sequenceLength(const QString &rawType)
* Ex: in qcoreapplication_foo(const char[len], some_string, unsigned int, * len)
* it will match the 'len' part of 'const char[len]')
*/
- static const QRegExp rx(QStringLiteral(".*\\[([A-Za-z_][A-Za-z_0-9]*)\\].*"));
+ static const QRegularExpression rx(QStringLiteral("\\[([A-Za-z_][A-Za-z_0-9]*)\\]"));
- if (!rx.exactMatch(rawType.trimmed()))
+ auto match = rx.match(rawType);
+ if (!match.hasMatch())
return QString();
- return rx.cap(1);
+ return match.captured(1);
}
static QString decayArrayToPointer(QString type)
@@ -115,15 +117,14 @@ static QString decayArrayToPointer(QString type)
/* decays an array to a pointer, i.e., if 'type' holds int[10],
* this function returns 'int *'
*/
- static QRegExp rx(QStringLiteral("\\[(.+)\\]"));
+ static QRegularExpression rx(QStringLiteral("\\[([^\\]]+)\\]"));
- rx.setMinimal(true);
return type.replace(rx, QStringLiteral("*"));
}
static QString removeBraces(QString type)
{
- static const QRegExp rx(QStringLiteral("\\[.*\\]"));
+ static const QRegularExpression rx(QStringLiteral("\\[.*\\]"));
return type.remove(rx);
}
@@ -187,11 +188,11 @@ static Tracepoint::Field::BackendType backendType(QString rawType)
if (!sequenceLength(rawType).isNull())
return Tracepoint::Field::Sequence;
- static const QRegExp constMatch(QStringLiteral("\\bconst\\b"));
+ static const QRegularExpression constMatch(QStringLiteral("\\bconst\\b"));
rawType.remove(constMatch);
rawType.remove(QLatin1Char('&'));
- static const QRegExp ptrMatch(QStringLiteral("\\s*\\*\\s*"));
+ static const QRegularExpression ptrMatch(QStringLiteral("\\s*\\*\\s*"));
rawType.replace(ptrMatch, QStringLiteral("_ptr"));
rawType = rawType.trimmed();
rawType.replace(QStringLiteral(" "), QStringLiteral("_"));
@@ -218,19 +219,19 @@ static Tracepoint parseTracepoint(const QString &name, const QStringList &args,
auto end = args.constEnd();
int argc = 0;
- static const QRegExp rx(QStringLiteral("(.*)\\b([A-Za-z_][A-Za-z0-9_]*)$"));
+ static const QRegularExpression rx(QStringLiteral("^(.*)\\b([A-Za-z_][A-Za-z0-9_]*)$"));
while (i != end) {
- rx.exactMatch(*i);
+ auto match = rx.match(*i);
- const QString type = rx.cap(1).trimmed();
+ const QString type = match.captured(1).trimmed();
if (type.isNull()) {
panic("Missing parameter type for argument %d of %s (%s:%d)",
argc, qPrintable(name), qPrintable(fileName), lineNumber);
}
- const QString name = rx.cap(2).trimmed();
+ const QString name = match.captured(2).trimmed();
if (name.isNull()) {
panic("Missing parameter name for argument %d of %s (%s:%d)",
@@ -270,7 +271,7 @@ Provider parseProvider(const QString &filename)
QTextStream s(&f);
- static const QRegExp tracedef(QStringLiteral("([A-Za-z][A-Za-z0-9_]*)\\((.*)\\)"));
+ static const QRegularExpression tracedef(QStringLiteral("^([A-Za-z][A-Za-z0-9_]*)\\((.*)\\)$"));
Provider provider;
provider.name = QFileInfo(filename).baseName();
@@ -293,9 +294,10 @@ Provider parseProvider(const QString &filename)
if (line.isEmpty() || line.startsWith(QLatin1Char('#')))
continue;
- if (tracedef.exactMatch(line)) {
- const QString name = tracedef.cap(1);
- const QString argsString = tracedef.cap(2);
+ auto match = tracedef.match(line);
+ if (match.hasMatch()) {
+ const QString name = match.captured(1);
+ const QString argsString = match.captured(2);
const QStringList args = argsString.split(QLatin1Char(','), Qt::SkipEmptyParts);
provider.tracepoints << parseTracepoint(name, args, filename, lineNumber);
diff --git a/src/tools/uic/.prev_CMakeLists.txt b/src/tools/uic/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..4cd28d7070
--- /dev/null
+++ b/src/tools/uic/.prev_CMakeLists.txt
@@ -0,0 +1,44 @@
+# Generated from uic.pro.
+
+#####################################################################
+## uic Tool:
+#####################################################################
+
+qt_add_tool(uic
+ SOURCES
+ cpp/cppwritedeclaration.cpp cpp/cppwritedeclaration.h
+ cpp/cppwriteincludes.cpp cpp/cppwriteincludes.h
+ cpp/cppwriteinitialization.cpp cpp/cppwriteinitialization.h
+ customwidgetsinfo.cpp customwidgetsinfo.h
+ databaseinfo.cpp databaseinfo.h
+ driver.cpp driver.h
+ main.cpp
+ option.h
+ python/pythonwritedeclaration.cpp python/pythonwritedeclaration.h
+ python/pythonwriteimports.cpp python/pythonwriteimports.h
+ shared/language.cpp shared/language.h
+ treewalker.cpp treewalker.h
+ ui4.cpp ui4.h
+ uic.cpp uic.h
+ utils.h
+ validator.cpp validator.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ QT_UIC
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${PROJECT_BINARY_DIR}/src/tools/uic
+ cpp
+ python
+ shared
+ PUBLIC_LIBRARIES
+ Qt::Gui
+)
+
+#### Keys ignored in scope 1:.:.:uic.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt User Interface Compiler"
+# _OPTION = "host_build"
+
+## Scopes:
+#####################################################################
diff --git a/src/tools/uic/CMakeLists.txt b/src/tools/uic/CMakeLists.txt
new file mode 100644
index 0000000000..21fd232349
--- /dev/null
+++ b/src/tools/uic/CMakeLists.txt
@@ -0,0 +1,45 @@
+# Generated from uic.pro.
+
+#####################################################################
+## uic Tool:
+#####################################################################
+
+qt_add_tool(uic
+ TOOLS_TARGET Widgets # special case
+ SOURCES
+ cpp/cppwritedeclaration.cpp cpp/cppwritedeclaration.h
+ cpp/cppwriteincludes.cpp cpp/cppwriteincludes.h
+ cpp/cppwriteinitialization.cpp cpp/cppwriteinitialization.h
+ customwidgetsinfo.cpp customwidgetsinfo.h
+ databaseinfo.cpp databaseinfo.h
+ driver.cpp driver.h
+ main.cpp
+ option.h
+ python/pythonwritedeclaration.cpp python/pythonwritedeclaration.h
+ python/pythonwriteimports.cpp python/pythonwriteimports.h
+ shared/language.cpp shared/language.h
+ treewalker.cpp treewalker.h
+ ui4.cpp ui4.h
+ uic.cpp uic.h
+ utils.h
+ validator.cpp validator.h
+ DEFINES
+ QT_NO_CAST_FROM_ASCII
+ QT_NO_FOREACH
+ QT_UIC
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ # ${PROJECT_BINARY_DIR}/src/tools/uic # special case remove
+ cpp
+ python
+ shared
+ #PUBLIC_LIBRARIES # special case remove
+ #Qt::Gui # special case remove
+)
+
+#### Keys ignored in scope 1:.:.:uic.pro:<TRUE>:
+# QMAKE_TARGET_DESCRIPTION = "Qt User Interface Compiler"
+# _OPTION = "host_build"
+
+## Scopes:
+#####################################################################
diff --git a/src/tools/uic/cpp/cppwriteincludes.cpp b/src/tools/uic/cpp/cppwriteincludes.cpp
index 71e02ae9c9..f2e69553c6 100644
--- a/src/tools/uic/cpp/cppwriteincludes.cpp
+++ b/src/tools/uic/cpp/cppwriteincludes.cpp
@@ -255,7 +255,7 @@ void WriteIncludes::acceptCustomWidget(DomCustomWidget *node)
void WriteIncludes::acceptActionGroup(DomActionGroup *node)
{
- add(QLatin1String("QAction"));
+ add(QLatin1String("QActionGroup"));
TreeWalker::acceptActionGroup(node);
}
diff --git a/src/tools/uic/cpp/cppwriteinitialization.h b/src/tools/uic/cpp/cppwriteinitialization.h
index ab996a2800..0a6ddbb3c8 100644
--- a/src/tools/uic/cpp/cppwriteinitialization.h
+++ b/src/tools/uic/cpp/cppwriteinitialization.h
@@ -85,7 +85,7 @@ namespace CPP {
struct WriteInitialization : public TreeWalker
{
- using DomPropertyList = QList<DomProperty*>;
+ using DomPropertyList = QVector<DomProperty*>;
using DomPropertyMap = QHash<QString, DomProperty*>;
WriteInitialization(Uic *uic);
diff --git a/src/tools/uic/main.cpp b/src/tools/uic/main.cpp
index d6c63de869..6f342fb398 100644
--- a/src/tools/uic/main.cpp
+++ b/src/tools/uic/main.cpp
@@ -80,10 +80,6 @@ int runUic(int argc, char *argv[])
noImplicitIncludesOption.setDescription(QStringLiteral("Disable generation of #include-directives."));
parser.addOption(noImplicitIncludesOption);
- QCommandLineOption noStringLiteralOption(QStringList() << QStringLiteral("s") << QStringLiteral("no-stringliteral"));
- noStringLiteralOption.setDescription(QStringLiteral("Deprecated. The use of this option won't take any effect."));
- parser.addOption(noStringLiteralOption);
-
QCommandLineOption postfixOption(QStringLiteral("postfix"));
postfixOption.setDescription(QStringLiteral("Postfix to add to all generated classnames."));
postfixOption.setValueName(QStringLiteral("postfix"));
@@ -134,9 +130,6 @@ int runUic(int argc, char *argv[])
}
language::setLanguage(language);
- if (parser.isSet(noStringLiteralOption))
- fprintf(stderr, "The -s, --no-stringliteral option is deprecated and it won't take any effect.\n");
-
QString inputFile;
if (!parser.positionalArguments().isEmpty())
inputFile = parser.positionalArguments().at(0);
diff --git a/src/tools/uic/qclass_lib_map.h b/src/tools/uic/qclass_lib_map.h
index 8cebe65a00..03b3ffa5dd 100644
--- a/src/tools/uic/qclass_lib_map.h
+++ b/src/tools/uic/qclass_lib_map.h
@@ -194,13 +194,6 @@ QT_CLASS_LIB(QHashIterator, QtCore, qhash.h)
QT_CLASS_LIB(QMutableHashIterator, QtCore, qhash.h)
QT_CLASS_LIB(QLine, QtCore, qline.h)
QT_CLASS_LIB(QLineF, QtCore, qline.h)
-QT_CLASS_LIB(QLinkedListData, QtCore, qlinkedlist.h)
-QT_CLASS_LIB(QLinkedListNode, QtCore, qlinkedlist.h)
-QT_CLASS_LIB(QLinkedList, QtCore, qlinkedlist.h)
-QT_CLASS_LIB(QLinkedListIterator, QtCore, qlinkedlist.h)
-QT_CLASS_LIB(QMutableLinkedListIterator, QtCore, qlinkedlist.h)
-QT_CLASS_LIB(QLinkedListIterator, QtCore, qlinkedlist.h)
-QT_CLASS_LIB(QMutableLinkedListIterator, QtCore, qlinkedlist.h)
QT_CLASS_LIB(QListData, QtCore, qlist.h)
QT_CLASS_LIB(QList, QtCore, qlist.h)
QT_CLASS_LIB(QListIterator, QtCore, qlist.h)
@@ -319,21 +312,6 @@ QT_CLASS_LIB(QMacGLCompatTypes, QtOpenGL, qgl.h)
QT_CLASS_LIB(QMacCompatGLint, QtOpenGL, qgl.h)
QT_CLASS_LIB(QMacCompatGLuint, QtOpenGL, qgl.h)
QT_CLASS_LIB(QMacCompatGLenum, QtOpenGL, qgl.h)
-QT_CLASS_LIB(QGLFormat, QtOpenGL, qgl.h)
-QT_CLASS_LIB(QGLContext, QtOpenGL, qgl.h)
-QT_CLASS_LIB(QGLWidget, QtOpenGL, qgl.h)
-QT_CLASS_LIB(QOpenGLWidget,QtWidgets,qopenglwidget.h)
-QT_CLASS_LIB(QGLBuffer, QtOpenGL, qglbuffer.h)
-QT_CLASS_LIB(QGLColormap, QtOpenGL, qglcolormap.h)
-QT_CLASS_LIB(QGLFramebufferObject, QtOpenGL, qglframebufferobject.h)
-QT_CLASS_LIB(QGLFramebufferObjectFormat, QtOpenGL, qglframebufferobject.h)
-QT_CLASS_LIB(QGLFunctions, QtOpenGL, qglfunctions.h)
-QT_CLASS_LIB(QGLFunctionsPrivate, QtOpenGL, qglfunctions.h)
-QT_CLASS_LIB(QGLPixelBuffer, QtOpenGL, qglpixelbuffer.h)
-QT_CLASS_LIB(QGLScreenSurfaceFunctions, QtOpenGL, qglscreen_qws.h)
-QT_CLASS_LIB(QGLScreen, QtOpenGL, qglscreen_qws.h)
-QT_CLASS_LIB(QGLShader, QtOpenGL, qglshaderprogram.h)
-QT_CLASS_LIB(QGLShaderProgram, QtOpenGL, qglshaderprogram.h)
QT_CLASS_LIB(QDomImplementation, QtXml, qdom.h)
QT_CLASS_LIB(QDomNode, QtXml, qdom.h)
QT_CLASS_LIB(QDomNodeList, QtXml, qdom.h)
@@ -385,9 +363,6 @@ QT_CLASS_LIB(QNetworkCookieJar, QtNetwork, qnetworkcookiejar.h)
QT_CLASS_LIB(QNetworkDiskCache, QtNetwork, qnetworkdiskcache.h)
QT_CLASS_LIB(QNetworkReply, QtNetwork, qnetworkreply.h)
QT_CLASS_LIB(QNetworkRequest, QtNetwork, qnetworkrequest.h)
-QT_CLASS_LIB(QNetworkConfigurationManager, QtNetwork, qnetworkconfigmanager.h)
-QT_CLASS_LIB(QNetworkConfiguration, QtNetwork, qnetworkconfiguration.h)
-QT_CLASS_LIB(QNetworkSession, QtNetwork, qnetworksession.h)
QT_CLASS_LIB(QAuthenticator, QtNetwork, qauthenticator.h)
QT_CLASS_LIB(QIPv6Address, QtNetwork, qhostaddress.h)
QT_CLASS_LIB(Q_IPV6ADDR, QtNetwork, qhostaddress.h)
@@ -582,6 +557,7 @@ QT_CLASS_LIB(QFontDialog, QtWidgets, qfontdialog.h)
QT_CLASS_LIB(QInputDialog, QtWidgets, qinputdialog.h)
QT_CLASS_LIB(QMessageBox, QtWidgets, qmessagebox.h)
QT_CLASS_LIB(QPageSetupDialog, QtWidgets, qpagesetupdialog.h)
+QT_CLASS_LIB(QOpenGLWidget, QtOpenGLWidgets, qopenglwidget.h)
QT_CLASS_LIB(QPrintDialog, QtPrintSupport, qprintdialog.h)
QT_CLASS_LIB(QPrintPreviewDialog, QtPrintSupport, qprintpreviewdialog.h)
QT_CLASS_LIB(QProgressDialog, QtWidgets, qprogressdialog.h)
@@ -635,7 +611,6 @@ QT_CLASS_LIB(QIconEngineFactoryInterface, QtGui, qiconengineplugin.h)
QT_CLASS_LIB(QIconEnginePlugin, QtGui, qiconengineplugin.h)
QT_CLASS_LIB(QIconEngineFactoryInterfaceV2, QtGui, qiconengineplugin.h)
QT_CLASS_LIB(QIconEnginePluginV2, QtGui, qiconengineplugin.h)
-QT_CLASS_LIB(QImageTextKeyLang, QtGui, qimage.h)
QT_CLASS_LIB(QImage, QtGui, qimage.h)
QT_CLASS_LIB(QImageIOHandler, QtGui, qimageiohandler.h)
QT_CLASS_LIB(QImageIOHandlerFactoryInterface, QtGui, qimageiohandler.h)
@@ -644,9 +619,6 @@ QT_CLASS_LIB(QImageReader, QtGui, qimagereader.h)
QT_CLASS_LIB(QImageWriter, QtGui, qimagewriter.h)
QT_CLASS_LIB(QMovie, QtGui, qmovie.h)
QT_CLASS_LIB(QPicture, QtGui, qpicture.h)
-QT_CLASS_LIB(QPictureIO, QtGui, qpicture.h)
-QT_CLASS_LIB(QPictureFormatInterface, QtGui, qpictureformatplugin.h)
-QT_CLASS_LIB(QPictureFormatPlugin, QtGui, qpictureformatplugin.h)
QT_CLASS_LIB(QPixmap, QtGui, qpixmap.h)
QT_CLASS_LIB(QPixmapCache, QtGui, qpixmapcache.h)
QT_CLASS_LIB(QAbstractItemDelegate, QtWidgets, qabstractitemdelegate.h)
@@ -681,8 +653,8 @@ QT_CLASS_LIB(QTreeView, QtWidgets, qtreeview.h)
QT_CLASS_LIB(QTreeWidgetItem, QtWidgets, qtreewidget.h)
QT_CLASS_LIB(QTreeWidget, QtWidgets, qtreewidget.h)
QT_CLASS_LIB(QTreeWidgetItemIterator, QtWidgets, qtreewidgetitemiterator.h)
-QT_CLASS_LIB(QAction, QtWidgets, qaction.h)
-QT_CLASS_LIB(QActionGroup, QtWidgets, qactiongroup.h)
+QT_CLASS_LIB(QAction, QtGui, qaction.h)
+QT_CLASS_LIB(QActionGroup, QtGui, qactiongroup.h)
QT_CLASS_LIB(QApplication, QtWidgets, qapplication.h)
QT_CLASS_LIB(QBoxLayout, QtWidgets, qboxlayout.h)
QT_CLASS_LIB(QHBoxLayout, QtWidgets, qboxlayout.h)
@@ -752,7 +724,7 @@ QT_CLASS_LIB(QWidgetItemV2, QtWidgets, qlayoutitem.h)
QT_CLASS_LIB(QPalette, QtGui, qpalette.h)
QT_CLASS_LIB(QColorGroup, QtWidgets, qpalette.h)
QT_CLASS_LIB(QSessionManager, QtGui, qsessionmanager.h)
-QT_CLASS_LIB(QShortcut, QtWidgets, qshortcut.h)
+QT_CLASS_LIB(QShortcut, QtGui, qshortcut.h)
QT_CLASS_LIB(QSizePolicy, QtWidgets, qsizepolicy.h)
QT_CLASS_LIB(QStackedLayout, QtWidgets, qstackedlayout.h)
QT_CLASS_LIB(QToolTip, QtWidgets, qtooltip.h)
@@ -903,9 +875,9 @@ QT_CLASS_LIB(QDesktopServices, QtWidgets, qdesktopservices.h)
QT_CLASS_LIB(QScroller, QtWidgets, qscroller.h)
QT_CLASS_LIB(QScrollerProperties, QtWidgets, qscrollerproperties.h)
QT_CLASS_LIB(QSystemTrayIcon, QtGui, qsystemtrayicon.h)
-QT_CLASS_LIB(QUndoGroup, QtWidgets, qundogroup.h)
-QT_CLASS_LIB(QUndoCommand, QtWidgets, qundostack.h)
-QT_CLASS_LIB(QUndoStack, QtWidgets, qundostack.h)
+QT_CLASS_LIB(QUndoGroup, QtGui, qundogroup.h)
+QT_CLASS_LIB(QUndoCommand, QtGui, qundostack.h)
+QT_CLASS_LIB(QUndoStack, QtGui, qundostack.h)
QT_CLASS_LIB(QUndoView, QtWidgets, qundoview.h)
QT_CLASS_LIB(QAbstractButton, QtWidgets, qabstractbutton.h)
QT_CLASS_LIB(QAbstractScrollArea, QtWidgets, qabstractscrollarea.h)
@@ -966,7 +938,7 @@ QT_CLASS_LIB(QToolButton, QtWidgets, qtoolbutton.h)
QT_CLASS_LIB(QValidator, QtGui, qvalidator.h)
QT_CLASS_LIB(QIntValidator, QtGui, qvalidator.h)
QT_CLASS_LIB(QDoubleValidator, QtGui, qvalidator.h)
-QT_CLASS_LIB(QRegExpValidator, QtGui, qvalidator.h)
+QT_CLASS_LIB(QRegularExpressionValidator, QtGui, qvalidator.h)
QT_CLASS_LIB(QScriptEngineDebugger, QtScriptTools, qscriptenginedebugger.h)
QT_CLASS_LIB(QDesignerComponents, QtDesigner, qdesigner_components.h)
QT_CLASS_LIB(QExtensionFactory, QtDesigner, default_extensionfactory.h)
diff --git a/src/tools/uic/ui4.cpp b/src/tools/uic/ui4.cpp
index f52a8bd7d4..ed00e2c3fd 100644
--- a/src/tools/uic/ui4.cpp
+++ b/src/tools/uic/ui4.cpp
@@ -862,13 +862,13 @@ void DomActionGroup::setElementActionGroup(const QVector<DomActionGroup *> &a)
m_actionGroup = a;
}
-void DomActionGroup::setElementProperty(const QList<DomProperty *> &a)
+void DomActionGroup::setElementProperty(const QVector<DomProperty *> &a)
{
m_children |= Property;
m_property = a;
}
-void DomActionGroup::setElementAttribute(const QList<DomProperty *> &a)
+void DomActionGroup::setElementAttribute(const QVector<DomProperty *> &a)
{
m_children |= Attribute;
m_attribute = a;
@@ -944,13 +944,13 @@ void DomAction::write(QXmlStreamWriter &writer, const QString &tagName) const
writer.writeEndElement();
}
-void DomAction::setElementProperty(const QList<DomProperty *> &a)
+void DomAction::setElementProperty(const QVector<DomProperty *> &a)
{
m_children |= Property;
m_property = a;
}
-void DomAction::setElementAttribute(const QList<DomProperty *> &a)
+void DomAction::setElementAttribute(const QVector<DomProperty *> &a)
{
m_children |= Attribute;
m_attribute = a;
@@ -1058,13 +1058,13 @@ void DomButtonGroup::write(QXmlStreamWriter &writer, const QString &tagName) con
writer.writeEndElement();
}
-void DomButtonGroup::setElementProperty(const QList<DomProperty *> &a)
+void DomButtonGroup::setElementProperty(const QVector<DomProperty *> &a)
{
m_children |= Property;
m_property = a;
}
-void DomButtonGroup::setElementAttribute(const QList<DomProperty *> &a)
+void DomButtonGroup::setElementAttribute(const QVector<DomProperty *> &a)
{
m_children |= Attribute;
m_attribute = a;
@@ -1717,13 +1717,13 @@ void DomLayout::write(QXmlStreamWriter &writer, const QString &tagName) const
writer.writeEndElement();
}
-void DomLayout::setElementProperty(const QList<DomProperty *> &a)
+void DomLayout::setElementProperty(const QVector<DomProperty *> &a)
{
m_children |= Property;
m_property = a;
}
-void DomLayout::setElementAttribute(const QList<DomProperty *> &a)
+void DomLayout::setElementAttribute(const QVector<DomProperty *> &a)
{
m_children |= Attribute;
m_attribute = a;
@@ -1938,7 +1938,7 @@ void DomRow::write(QXmlStreamWriter &writer, const QString &tagName) const
writer.writeEndElement();
}
-void DomRow::setElementProperty(const QList<DomProperty *> &a)
+void DomRow::setElementProperty(const QVector<DomProperty *> &a)
{
m_children |= Property;
m_property = a;
@@ -1983,7 +1983,7 @@ void DomColumn::write(QXmlStreamWriter &writer, const QString &tagName) const
writer.writeEndElement();
}
-void DomColumn::setElementProperty(const QList<DomProperty *> &a)
+void DomColumn::setElementProperty(const QVector<DomProperty *> &a)
{
m_children |= Property;
m_property = a;
@@ -2059,7 +2059,7 @@ void DomItem::write(QXmlStreamWriter &writer, const QString &tagName) const
writer.writeEndElement();
}
-void DomItem::setElementProperty(const QList<DomProperty *> &a)
+void DomItem::setElementProperty(const QVector<DomProperty *> &a)
{
m_children |= Property;
m_property = a;
@@ -2268,13 +2268,13 @@ void DomWidget::setElementClass(const QStringList &a)
m_class = a;
}
-void DomWidget::setElementProperty(const QList<DomProperty *> &a)
+void DomWidget::setElementProperty(const QVector<DomProperty *> &a)
{
m_children |= Property;
m_property = a;
}
-void DomWidget::setElementAttribute(const QList<DomProperty *> &a)
+void DomWidget::setElementAttribute(const QVector<DomProperty *> &a)
{
m_children |= Attribute;
m_attribute = a;
@@ -2386,7 +2386,7 @@ void DomSpacer::write(QXmlStreamWriter &writer, const QString &tagName) const
writer.writeEndElement();
}
-void DomSpacer::setElementProperty(const QList<DomProperty *> &a)
+void DomSpacer::setElementProperty(const QVector<DomProperty *> &a)
{
m_children |= Property;
m_property = a;
@@ -5984,7 +5984,7 @@ void DomDesignerData::write(QXmlStreamWriter &writer, const QString &tagName) co
writer.writeEndElement();
}
-void DomDesignerData::setElementProperty(const QList<DomProperty *> &a)
+void DomDesignerData::setElementProperty(const QVector<DomProperty *> &a)
{
m_children |= Property;
m_property = a;
diff --git a/src/tools/uic/ui4.h b/src/tools/uic/ui4.h
index 94cdb40b6f..90b17f7027 100644
--- a/src/tools/uic/ui4.h
+++ b/src/tools/uic/ui4.h
@@ -472,11 +472,11 @@ public:
inline QVector<DomActionGroup *> elementActionGroup() const { return m_actionGroup; }
void setElementActionGroup(const QVector<DomActionGroup *> &a);
- inline QList<DomProperty*> elementProperty() const { return m_property; }
- void setElementProperty(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementProperty() const { return m_property; }
+ void setElementProperty(const QVector<DomProperty *> &a);
- inline QList<DomProperty*> elementAttribute() const { return m_attribute; }
- void setElementAttribute(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementAttribute() const { return m_attribute; }
+ void setElementAttribute(const QVector<DomProperty *> &a);
private:
// attribute data
@@ -487,8 +487,8 @@ private:
uint m_children = 0;
QVector<DomAction *> m_action;
QVector<DomActionGroup *> m_actionGroup;
- QList<DomProperty*> m_property;
- QList<DomProperty*> m_attribute;
+ QVector<DomProperty *> m_property;
+ QVector<DomProperty *> m_attribute;
enum Child {
Action = 1,
@@ -519,11 +519,11 @@ public:
inline void clearAttributeMenu() { m_has_attr_menu = false; }
// child element accessors
- inline QList<DomProperty*> elementProperty() const { return m_property; }
- void setElementProperty(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementProperty() const { return m_property; }
+ void setElementProperty(const QVector<DomProperty *> &a);
- inline QList<DomProperty*> elementAttribute() const { return m_attribute; }
- void setElementAttribute(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementAttribute() const { return m_attribute; }
+ void setElementAttribute(const QVector<DomProperty *> &a);
private:
// attribute data
@@ -535,8 +535,8 @@ private:
// child element data
uint m_children = 0;
- QList<DomProperty*> m_property;
- QList<DomProperty*> m_attribute;
+ QVector<DomProperty *> m_property;
+ QVector<DomProperty *> m_attribute;
enum Child {
Property = 1,
@@ -581,11 +581,11 @@ public:
inline void clearAttributeName() { m_has_attr_name = false; }
// child element accessors
- inline QList<DomProperty*> elementProperty() const { return m_property; }
- void setElementProperty(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementProperty() const { return m_property; }
+ void setElementProperty(const QVector<DomProperty *> &a);
- inline QList<DomProperty*> elementAttribute() const { return m_attribute; }
- void setElementAttribute(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementAttribute() const { return m_attribute; }
+ void setElementAttribute(const QVector<DomProperty *> &a);
private:
// attribute data
@@ -594,8 +594,8 @@ private:
// child element data
uint m_children = 0;
- QList<DomProperty*> m_property;
- QList<DomProperty*> m_attribute;
+ QVector<DomProperty *> m_property;
+ QVector<DomProperty *> m_attribute;
enum Child {
Property = 1,
@@ -891,11 +891,11 @@ public:
inline void clearAttributeColumnMinimumWidth() { m_has_attr_columnMinimumWidth = false; }
// child element accessors
- inline QList<DomProperty*> elementProperty() const { return m_property; }
- void setElementProperty(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementProperty() const { return m_property; }
+ void setElementProperty(const QVector<DomProperty *> &a);
- inline QList<DomProperty*> elementAttribute() const { return m_attribute; }
- void setElementAttribute(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementAttribute() const { return m_attribute; }
+ void setElementAttribute(const QVector<DomProperty *> &a);
inline QVector<DomLayoutItem *> elementItem() const { return m_item; }
void setElementItem(const QVector<DomLayoutItem *> &a);
@@ -925,8 +925,8 @@ private:
// child element data
uint m_children = 0;
- QList<DomProperty*> m_property;
- QList<DomProperty*> m_attribute;
+ QVector<DomProperty *> m_property;
+ QVector<DomProperty *> m_attribute;
QVector<DomLayoutItem *> m_item;
enum Child {
@@ -1023,14 +1023,14 @@ public:
void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
// child element accessors
- inline QList<DomProperty*> elementProperty() const { return m_property; }
- void setElementProperty(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementProperty() const { return m_property; }
+ void setElementProperty(const QVector<DomProperty *> &a);
private:
// child element data
uint m_children = 0;
- QList<DomProperty*> m_property;
+ QVector<DomProperty *> m_property;
enum Child {
Property = 1
@@ -1047,14 +1047,14 @@ public:
void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
// child element accessors
- inline QList<DomProperty*> elementProperty() const { return m_property; }
- void setElementProperty(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementProperty() const { return m_property; }
+ void setElementProperty(const QVector<DomProperty *> &a);
private:
// child element data
uint m_children = 0;
- QList<DomProperty*> m_property;
+ QVector<DomProperty *> m_property;
enum Child {
Property = 1
@@ -1082,8 +1082,8 @@ public:
inline void clearAttributeColumn() { m_has_attr_column = false; }
// child element accessors
- inline QList<DomProperty*> elementProperty() const { return m_property; }
- void setElementProperty(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementProperty() const { return m_property; }
+ void setElementProperty(const QVector<DomProperty *> &a);
inline QVector<DomItem *> elementItem() const { return m_item; }
void setElementItem(const QVector<DomItem *> &a);
@@ -1098,7 +1098,7 @@ private:
// child element data
uint m_children = 0;
- QList<DomProperty*> m_property;
+ QVector<DomProperty *> m_property;
QVector<DomItem *> m_item;
enum Child {
@@ -1136,11 +1136,11 @@ public:
inline QStringList elementClass() const { return m_class; }
void setElementClass(const QStringList &a);
- inline QList<DomProperty*> elementProperty() const { return m_property; }
- void setElementProperty(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementProperty() const { return m_property; }
+ void setElementProperty(const QVector<DomProperty *> &a);
- inline QList<DomProperty*> elementAttribute() const { return m_attribute; }
- void setElementAttribute(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementAttribute() const { return m_attribute; }
+ void setElementAttribute(const QVector<DomProperty *> &a);
inline QVector<DomRow *> elementRow() const { return m_row; }
void setElementRow(const QVector<DomRow *> &a);
@@ -1183,8 +1183,8 @@ private:
// child element data
uint m_children = 0;
QStringList m_class;
- QList<DomProperty*> m_property;
- QList<DomProperty*> m_attribute;
+ QVector<DomProperty *> m_property;
+ QVector<DomProperty *> m_attribute;
QVector<DomRow *> m_row;
QVector<DomColumn *> m_column;
QVector<DomItem *> m_item;
@@ -1227,8 +1227,8 @@ public:
inline void clearAttributeName() { m_has_attr_name = false; }
// child element accessors
- inline QList<DomProperty*> elementProperty() const { return m_property; }
- void setElementProperty(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementProperty() const { return m_property; }
+ void setElementProperty(const QVector<DomProperty *> &a);
private:
// attribute data
@@ -1237,7 +1237,7 @@ private:
// child element data
uint m_children = 0;
- QList<DomProperty*> m_property;
+ QVector<DomProperty *> m_property;
enum Child {
Property = 1
@@ -2805,14 +2805,14 @@ public:
void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
// child element accessors
- inline QList<DomProperty*> elementProperty() const { return m_property; }
- void setElementProperty(const QList<DomProperty *> &a);
+ inline QVector<DomProperty *> elementProperty() const { return m_property; }
+ void setElementProperty(const QVector<DomProperty *> &a);
private:
// child element data
uint m_children = 0;
- QList<DomProperty*> m_property;
+ QVector<DomProperty *> m_property;
enum Child {
Property = 1
diff --git a/src/tools/uic/utils.h b/src/tools/uic/utils.h
index 34c4ab23d4..bd543c7bb7 100644
--- a/src/tools/uic/utils.h
+++ b/src/tools/uic/utils.h
@@ -42,7 +42,7 @@ inline bool toBool(const QString &str)
inline QString toString(const DomString *str)
{ return str ? str->text() : QString(); }
-inline QHash<QString, DomProperty *> propertyMap(const QList<DomProperty *> &properties)
+inline QHash<QString, DomProperty *> propertyMap(const QVector<DomProperty *> &properties)
{
QHash<QString, DomProperty *> map;
for (DomProperty *p : properties)
diff --git a/src/widgets/.prev_CMakeLists.txt b/src/widgets/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..daa9084827
--- /dev/null
+++ b/src/widgets/.prev_CMakeLists.txt
@@ -0,0 +1,830 @@
+# Generated from widgets.pro.
+
+#####################################################################
+## Widgets Module:
+#####################################################################
+
+qt_add_module(Widgets
+ GENERATE_METATYPES
+ QMAKE_MODULE_CONFIG uic
+ PLUGIN_TYPES styles
+ SOURCES
+ itemviews/qfileiconprovider.cpp itemviews/qfileiconprovider.h itemviews/qfileiconprovider_p.h
+ kernel/qapplication.cpp kernel/qapplication.h kernel/qapplication_p.h
+ kernel/qboxlayout.cpp kernel/qboxlayout.h
+ kernel/qdesktopwidget.cpp kernel/qdesktopwidget.h kernel/qdesktopwidget_p.h
+ kernel/qgesture.cpp kernel/qgesture.h kernel/qgesture_p.h
+ kernel/qgesturemanager.cpp kernel/qgesturemanager_p.h
+ kernel/qgesturerecognizer.cpp kernel/qgesturerecognizer.h
+ kernel/qgridlayout.cpp kernel/qgridlayout.h
+ kernel/qlayout.cpp kernel/qlayout.h kernel/qlayout_p.h
+ kernel/qlayoutengine.cpp kernel/qlayoutengine_p.h
+ kernel/qlayoutitem.cpp kernel/qlayoutitem.h
+ kernel/qsizepolicy.cpp kernel/qsizepolicy.h
+ kernel/qstackedlayout.cpp kernel/qstackedlayout.h
+ kernel/qstandardgestures.cpp kernel/qstandardgestures_p.h
+ kernel/qtestsupport_widgets.cpp kernel/qtestsupport_widgets.h
+ kernel/qtwidgetsglobal.h kernel/qtwidgetsglobal_p.h
+ kernel/qwidget.cpp kernel/qwidget.h kernel/qwidget_p.h
+ kernel/qwidgetrepaintmanager.cpp kernel/qwidgetrepaintmanager_p.h
+ kernel/qwidgetsvariant.cpp
+ kernel/qwidgetwindow.cpp kernel/qwidgetwindow_p.h
+ kernel/qwindowcontainer.cpp kernel/qwindowcontainer_p.h
+ styles/qcommonstyle.cpp styles/qcommonstyle.h styles/qcommonstyle_p.h
+ styles/qcommonstylepixmaps_p.h
+ styles/qdrawutil.cpp styles/qdrawutil.h
+ styles/qpixmapstyle.cpp styles/qpixmapstyle_p.h
+ styles/qpixmapstyle_p_p.h
+ styles/qproxystyle.cpp styles/qproxystyle.h styles/qproxystyle_p.h
+ styles/qstyle.cpp styles/qstyle.h
+ styles/qstylefactory.cpp styles/qstylefactory.h
+ styles/qstylehelper.cpp styles/qstylehelper_p.h
+ styles/qstyleoption.cpp styles/qstyleoption.h
+ styles/qstylepainter.cpp styles/qstylepainter.h
+ styles/qstyleplugin.cpp styles/qstyleplugin.h
+ styles/qstylesheetstyle.cpp styles/qstylesheetstyle_p.h
+ styles/qstylesheetstyle_default.cpp
+ util/qcolormap.cpp util/qcolormap.h
+ util/qsystemtrayicon.cpp util/qsystemtrayicon.h util/qsystemtrayicon_p.h
+ widgets/qabstractscrollarea.cpp widgets/qabstractscrollarea.h widgets/qabstractscrollarea_p.h
+ widgets/qfocusframe.cpp widgets/qfocusframe.h
+ widgets/qframe.cpp widgets/qframe.h widgets/qframe_p.h
+ widgets/qwidgetanimator.cpp widgets/qwidgetanimator_p.h
+ DEFINES
+ QT_NO_USING_NAMESPACE
+ INCLUDE_DIRECTORIES
+ dialogs
+ LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::Gui
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "kernel/qt_widgets_pch.h"
+)
+
+# Resources:
+set(qstyle_resource_files
+ "images/cdr-128.png"
+ "images/cdr-16.png"
+ "images/cdr-32.png"
+ "images/cleartext-16.png"
+ "images/cleartext-32.png"
+ "images/closedock-10.png"
+ "images/closedock-16.png"
+ "images/closedock-20.png"
+ "images/closedock-32.png"
+ "images/closedock-48.png"
+ "images/closedock-64.png"
+ "images/computer-16.png"
+ "images/computer-32.png"
+ "images/desktop-16.png"
+ "images/desktop-32.png"
+ "images/dirclosed-128.png"
+ "images/dirclosed-16.png"
+ "images/dirclosed-32.png"
+ "images/dirlink-128.png"
+ "images/dirlink-16.png"
+ "images/dirlink-32.png"
+ "images/diropen-128.png"
+ "images/diropen-16.png"
+ "images/diropen-32.png"
+ "images/down-128.png"
+ "images/down-16.png"
+ "images/down-32.png"
+ "images/dvd-128.png"
+ "images/dvd-16.png"
+ "images/dvd-32.png"
+ "images/file-128.png"
+ "images/file-16.png"
+ "images/file-32.png"
+ "images/filecontents-128.png"
+ "images/filecontents-16.png"
+ "images/filecontents-32.png"
+ "images/fileinfo-128.png"
+ "images/fileinfo-16.png"
+ "images/fileinfo-32.png"
+ "images/filelink-128.png"
+ "images/filelink-16.png"
+ "images/filelink-32.png"
+ "images/floppy-128.png"
+ "images/floppy-16.png"
+ "images/floppy-32.png"
+ "images/fontbitmap-16.png"
+ "images/fonttruetype-16.png"
+ "images/fusion_groupbox.png"
+ "images/harddrive-128.png"
+ "images/harddrive-16.png"
+ "images/harddrive-32.png"
+ "images/left-128.png"
+ "images/left-16.png"
+ "images/left-32.png"
+ "images/media-pause-16.png"
+ "images/media-pause-32.png"
+ "images/media-play-16.png"
+ "images/media-play-32.png"
+ "images/media-seek-backward-16.png"
+ "images/media-seek-backward-32.png"
+ "images/media-seek-forward-16.png"
+ "images/media-seek-forward-32.png"
+ "images/media-skip-backward-16.png"
+ "images/media-skip-backward-32.png"
+ "images/media-skip-forward-16.png"
+ "images/media-skip-forward-32.png"
+ "images/media-stop-16.png"
+ "images/media-stop-32.png"
+ "images/media-volume-16.png"
+ "images/media-volume-muted-16.png"
+ "images/networkdrive-128.png"
+ "images/networkdrive-16.png"
+ "images/networkdrive-32.png"
+ "images/newdirectory-128.png"
+ "images/newdirectory-16.png"
+ "images/newdirectory-32.png"
+ "images/normalizedockup-10.png"
+ "images/normalizedockup-16.png"
+ "images/normalizedockup-20.png"
+ "images/normalizedockup-32.png"
+ "images/normalizedockup-48.png"
+ "images/normalizedockup-64.png"
+ "images/parentdir-128.png"
+ "images/parentdir-16.png"
+ "images/parentdir-32.png"
+ "images/refresh-24.png"
+ "images/refresh-32.png"
+ "images/right-128.png"
+ "images/right-16.png"
+ "images/right-32.png"
+ "images/standardbutton-apply-128.png"
+ "images/standardbutton-apply-16.png"
+ "images/standardbutton-apply-32.png"
+ "images/standardbutton-cancel-128.png"
+ "images/standardbutton-cancel-16.png"
+ "images/standardbutton-cancel-32.png"
+ "images/standardbutton-clear-128.png"
+ "images/standardbutton-clear-16.png"
+ "images/standardbutton-clear-32.png"
+ "images/standardbutton-close-128.png"
+ "images/standardbutton-close-16.png"
+ "images/standardbutton-close-32.png"
+ "images/standardbutton-closetab-16.png"
+ "images/standardbutton-closetab-down-16.png"
+ "images/standardbutton-closetab-hover-16.png"
+ "images/standardbutton-delete-128.png"
+ "images/standardbutton-delete-16.png"
+ "images/standardbutton-delete-32.png"
+ "images/standardbutton-help-128.png"
+ "images/standardbutton-help-16.png"
+ "images/standardbutton-help-32.png"
+ "images/standardbutton-no-128.png"
+ "images/standardbutton-no-16.png"
+ "images/standardbutton-no-32.png"
+ "images/standardbutton-ok-128.png"
+ "images/standardbutton-ok-16.png"
+ "images/standardbutton-ok-32.png"
+ "images/standardbutton-open-128.png"
+ "images/standardbutton-open-16.png"
+ "images/standardbutton-open-32.png"
+ "images/standardbutton-save-128.png"
+ "images/standardbutton-save-16.png"
+ "images/standardbutton-save-32.png"
+ "images/standardbutton-yes-128.png"
+ "images/standardbutton-yes-16.png"
+ "images/standardbutton-yes-32.png"
+ "images/stop-24.png"
+ "images/stop-32.png"
+ "images/titlebar-contexthelp-16.png"
+ "images/titlebar-contexthelp-32.png"
+ "images/titlebar-contexthelp-48.png"
+ "images/titlebar-max-16.png"
+ "images/titlebar-max-32.png"
+ "images/titlebar-max-48.png"
+ "images/titlebar-min-16.png"
+ "images/titlebar-min-32.png"
+ "images/titlebar-min-48.png"
+ "images/titlebar-shade-16.png"
+ "images/titlebar-shade-32.png"
+ "images/titlebar-shade-48.png"
+ "images/titlebar-unshade-16.png"
+ "images/titlebar-unshade-32.png"
+ "images/titlebar-unshade-48.png"
+ "images/toolbar-ext-h-16.png"
+ "images/toolbar-ext-h-32.png"
+ "images/toolbar-ext-h-8.png"
+ "images/toolbar-ext-h-rtl-16.png"
+ "images/toolbar-ext-h-rtl-32.png"
+ "images/toolbar-ext-h-rtl-8.png"
+ "images/toolbar-ext-v-10.png"
+ "images/toolbar-ext-v-20.png"
+ "images/toolbar-ext-v-5.png"
+ "images/trash-128.png"
+ "images/trash-16.png"
+ "images/trash-32.png"
+ "images/up-128.png"
+ "images/up-16.png"
+ "images/up-32.png"
+ "images/viewdetailed-128.png"
+ "images/viewdetailed-16.png"
+ "images/viewdetailed-32.png"
+ "images/viewlist-128.png"
+ "images/viewlist-16.png"
+ "images/viewlist-32.png"
+)
+
+qt_add_resource(Widgets "qstyle"
+ PREFIX
+ "/qt-project.org/styles/commonstyle"
+ BASE
+ "styles"
+ FILES
+ ${qstyle_resource_files}
+)
+set_source_files_properties("styles/images/closedock-down-macstyle-16.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/closedock-down-16.png"
+)
+set_source_files_properties("styles/images/closedock-macstyle-16.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/closedock-16.png"
+)
+set_source_files_properties("styles/images/dockdock-down-macstyle-16.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/dockdock-down-16.png"
+)
+set_source_files_properties("styles/images/dockdock-macstyle-16.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/dockdock-16.png"
+)
+set_source_files_properties("styles/images/toolbar-ext-macstyle.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/toolbar-ext.png"
+)
+set_source_files_properties("styles/images/toolbar-ext-macstyle@2x.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/toolbar-ext@2x.png"
+)
+set(qstyle1_resource_files
+ "images/closedock-down-macstyle-16.png"
+ "images/closedock-macstyle-16.png"
+ "images/dockdock-down-macstyle-16.png"
+ "images/dockdock-macstyle-16.png"
+ "images/toolbar-ext-macstyle.png"
+ "images/toolbar-ext-macstyle@2x.png"
+)
+
+qt_add_resource(Widgets "qstyle1"
+ PREFIX
+ "/qt-project.org/styles/macstyle"
+ BASE
+ "styles"
+ FILES
+ ${qstyle1_resource_files}
+)
+
+if(QT_FEATURE_reduce_relocations AND UNIX AND GCC)
+ target_link_options(Widgets PRIVATE
+ "LINKER:--dynamic-list=${CMAKE_CURRENT_LIST_DIR}/QtWidgets.dynlist")
+endif()
+
+#### Keys ignored in scope 1:.:.:widgets.pro:<TRUE>:
+# MODULE_CONFIG = "uic"
+# QMAKE_LIBS = "$$QMAKE_LIBS_GUI"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(Widgets CONDITION MSVC AND (TEST_architecture_arch STREQUAL "i386")
+ LINK_OPTIONS
+ "/BASE:0x65000000"
+)
+
+qt_extend_target(Widgets CONDITION MACOS
+ SOURCES
+ kernel/qmacgesturerecognizer.cpp kernel/qmacgesturerecognizer_p.h
+ widgets/qmaccocoaviewcontainer_mac.h widgets/qmaccocoaviewcontainer_mac.mm
+ widgets/qmacnativewidget_mac.h widgets/qmacnativewidget_mac.mm
+ LIBRARIES
+ ${FWAppKit}
+ z
+)
+
+qt_extend_target(Widgets CONDITION WIN32 AND NOT WINRT
+ LIBRARIES
+ dwmapi
+ shell32
+ uxtheme
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_graphicseffect
+ SOURCES
+ effects/qgraphicseffect.cpp effects/qgraphicseffect.h effects/qgraphicseffect_p.h
+ effects/qpixmapfilter.cpp effects/qpixmapfilter_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_action
+ SOURCES
+ kernel/qaction_widgets.cpp kernel/qaction_widgets_p.h
+ kernel/qwidgetaction.cpp kernel/qwidgetaction.h kernel/qwidgetaction_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_formlayout
+ SOURCES
+ kernel/qformlayout.cpp kernel/qformlayout.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_shortcut
+ SOURCES
+ kernel/qshortcut_widgets.cpp
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_tooltip
+ SOURCES
+ kernel/qtooltip.cpp kernel/qtooltip.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_whatsthis
+ SOURCES
+ kernel/qwhatsthis.cpp kernel/qwhatsthis.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_animation
+ SOURCES
+ styles/qstyleanimation.cpp styles/qstyleanimation_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_style_windows
+ SOURCES
+ styles/qwindowsstyle.cpp styles/qwindowsstyle_p.h
+ styles/qwindowsstyle_p_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_style_fusion
+ SOURCES
+ styles/qfusionstyle.cpp styles/qfusionstyle_p.h
+ styles/qfusionstyle_p_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_abstractbutton
+ SOURCES
+ widgets/qabstractbutton.cpp widgets/qabstractbutton.h widgets/qabstractbutton_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_abstractslider
+ SOURCES
+ widgets/qabstractslider.cpp widgets/qabstractslider.h widgets/qabstractslider_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_buttongroup
+ SOURCES
+ widgets/qbuttongroup.cpp widgets/qbuttongroup.h widgets/qbuttongroup_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_calendarwidget
+ SOURCES
+ widgets/qcalendarwidget.cpp widgets/qcalendarwidget.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_checkbox
+ SOURCES
+ widgets/qcheckbox.cpp widgets/qcheckbox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_combobox
+ SOURCES
+ widgets/qcombobox.cpp widgets/qcombobox.h widgets/qcombobox_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_commandlinkbutton
+ SOURCES
+ widgets/qcommandlinkbutton.cpp widgets/qcommandlinkbutton.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_datetimeedit
+ SOURCES
+ widgets/qdatetimeedit.cpp widgets/qdatetimeedit.h widgets/qdatetimeedit_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_dial
+ SOURCES
+ widgets/qdial.cpp widgets/qdial.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_dockwidget
+ SOURCES
+ widgets/qdockarealayout.cpp widgets/qdockarealayout_p.h
+ widgets/qdockwidget.cpp widgets/qdockwidget.h widgets/qdockwidget_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_effects
+ SOURCES
+ widgets/qeffects.cpp widgets/qeffects_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_fontcombobox
+ SOURCES
+ widgets/qfontcombobox.cpp widgets/qfontcombobox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_groupbox
+ SOURCES
+ widgets/qgroupbox.cpp widgets/qgroupbox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_keysequenceedit
+ SOURCES
+ widgets/qkeysequenceedit.cpp widgets/qkeysequenceedit.h widgets/qkeysequenceedit_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_label
+ SOURCES
+ widgets/qlabel.cpp widgets/qlabel.h widgets/qlabel_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_lcdnumber
+ SOURCES
+ widgets/qlcdnumber.cpp widgets/qlcdnumber.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_lineedit
+ SOURCES
+ widgets/qlineedit.cpp widgets/qlineedit.h widgets/qlineedit_p.cpp widgets/qlineedit_p.h
+ widgets/qwidgetlinecontrol.cpp widgets/qwidgetlinecontrol_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_mainwindow
+ SOURCES
+ widgets/qmainwindow.cpp widgets/qmainwindow.h
+ widgets/qmainwindowlayout.cpp widgets/qmainwindowlayout_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_mdiarea
+ SOURCES
+ widgets/qmdiarea.cpp widgets/qmdiarea.h widgets/qmdiarea_p.h
+ widgets/qmdisubwindow.cpp widgets/qmdisubwindow.h widgets/qmdisubwindow_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_menu
+ SOURCES
+ widgets/qmenu.cpp widgets/qmenu.h widgets/qmenu_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_menubar
+ SOURCES
+ widgets/qmenubar.cpp widgets/qmenubar.h widgets/qmenubar_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_progressbar
+ SOURCES
+ widgets/qprogressbar.cpp widgets/qprogressbar.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_pushbutton
+ SOURCES
+ widgets/qpushbutton.cpp widgets/qpushbutton.h widgets/qpushbutton_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_radiobutton
+ SOURCES
+ widgets/qradiobutton.cpp widgets/qradiobutton.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_resizehandler
+ SOURCES
+ widgets/qwidgetresizehandler.cpp widgets/qwidgetresizehandler_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_dialogbuttonbox
+ SOURCES
+ widgets/qdialogbuttonbox.cpp widgets/qdialogbuttonbox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_rubberband
+ SOURCES
+ widgets/qrubberband.cpp widgets/qrubberband.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_scrollarea
+ SOURCES
+ widgets/qscrollarea.cpp widgets/qscrollarea.h widgets/qscrollarea_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_scrollbar
+ SOURCES
+ widgets/qscrollbar.cpp widgets/qscrollbar.h widgets/qscrollbar_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_sizegrip
+ SOURCES
+ widgets/qsizegrip.cpp widgets/qsizegrip.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_slider
+ SOURCES
+ widgets/qslider.cpp widgets/qslider.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_spinbox
+ SOURCES
+ widgets/qabstractspinbox.cpp widgets/qabstractspinbox.h widgets/qabstractspinbox_p.h
+ widgets/qspinbox.cpp widgets/qspinbox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_splashscreen
+ SOURCES
+ widgets/qsplashscreen.cpp widgets/qsplashscreen.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_splitter
+ SOURCES
+ widgets/qsplitter.cpp widgets/qsplitter.h widgets/qsplitter_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_stackedwidget
+ SOURCES
+ widgets/qstackedwidget.cpp widgets/qstackedwidget.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_statusbar
+ SOURCES
+ widgets/qstatusbar.cpp widgets/qstatusbar.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_tabbar
+ SOURCES
+ widgets/qtabbar.cpp widgets/qtabbar.h widgets/qtabbar_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_textedit
+ SOURCES
+ widgets/qplaintextedit.cpp widgets/qplaintextedit.h widgets/qplaintextedit_p.h
+ widgets/qtextedit.cpp widgets/qtextedit.h widgets/qtextedit_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_textbrowser
+ SOURCES
+ widgets/qtextbrowser.cpp widgets/qtextbrowser.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_tabwidget
+ SOURCES
+ widgets/qtabwidget.cpp widgets/qtabwidget.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_toolbar
+ SOURCES
+ widgets/qtoolbar.cpp widgets/qtoolbar.h widgets/qtoolbar_p.h
+ widgets/qtoolbararealayout.cpp widgets/qtoolbararealayout_p.h
+ widgets/qtoolbarlayout.cpp widgets/qtoolbarlayout_p.h
+ widgets/qtoolbarseparator.cpp widgets/qtoolbarseparator_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_toolbox
+ SOURCES
+ widgets/qtoolbox.cpp widgets/qtoolbox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_toolbutton
+ SOURCES
+ widgets/qtoolbarextension.cpp widgets/qtoolbarextension_p.h
+ widgets/qtoolbutton.cpp widgets/qtoolbutton.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_widgettextcontrol
+ SOURCES
+ widgets/qwidgettextcontrol.cpp widgets/qwidgettextcontrol_p.h
+ widgets/qwidgettextcontrol_p_p.h
+)
+
+qt_extend_target(Widgets CONDITION MACOS AND (QT_FEATURE_menu OR QT_FEATURE_menubar)
+ SOURCES
+ widgets/qmenu_mac.mm
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_colordialog
+ SOURCES
+ dialogs/qcolordialog.cpp dialogs/qcolordialog.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_dialog
+ SOURCES
+ dialogs/qdialog.cpp dialogs/qdialog.h dialogs/qdialog_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_errormessage
+ SOURCES
+ dialogs/qerrormessage.cpp dialogs/qerrormessage.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_filedialog
+ SOURCES
+ dialogs/qfiledialog.cpp dialogs/qfiledialog.h dialogs/qfiledialog.ui dialogs/qfiledialog_p.h
+ dialogs/qsidebar.cpp dialogs/qsidebar_p.h
+ ENABLE_AUTOGEN_TOOLS
+ uic
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_filesystemmodel
+ SOURCES
+ dialogs/qfileinfogatherer.cpp dialogs/qfileinfogatherer_p.h
+ dialogs/qfilesystemmodel.cpp dialogs/qfilesystemmodel.h dialogs/qfilesystemmodel_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_fontdialog
+ SOURCES
+ dialogs/qfontdialog.cpp dialogs/qfontdialog.h dialogs/qfontdialog_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_fscompleter
+ SOURCES
+ dialogs/qfscompleter_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_inputdialog
+ SOURCES
+ dialogs/qinputdialog.cpp dialogs/qinputdialog.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_messagebox
+ SOURCES
+ dialogs/qmessagebox.cpp dialogs/qmessagebox.h
+)
+
+if(QT_FEATURE_messagebox)
+ # Resources:
+ set(qmessagebox_resource_files
+ "images/qtlogo-64.png"
+ )
+
+ qt_add_resource(Widgets "qmessagebox"
+ PREFIX
+ "/qt-project.org/qmessagebox"
+ BASE
+ "dialogs"
+ FILES
+ ${qmessagebox_resource_files}
+ )
+endif()
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_progressdialog
+ SOURCES
+ dialogs/qprogressdialog.cpp dialogs/qprogressdialog.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_wizard
+ SOURCES
+ dialogs/qwizard.cpp dialogs/qwizard.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_wizard AND WIN32
+ SOURCES
+ dialogs/qwizard_win.cpp dialogs/qwizard_win_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_accessibility
+ SOURCES
+ accessible/complexwidgets.cpp accessible/complexwidgets_p.h
+ accessible/qaccessiblemenu.cpp accessible/qaccessiblemenu_p.h
+ accessible/qaccessiblewidget.cpp accessible/qaccessiblewidget.h
+ accessible/qaccessiblewidgetfactory.cpp accessible/qaccessiblewidgetfactory_p.h
+ accessible/qaccessiblewidgets.cpp accessible/qaccessiblewidgets_p.h
+ accessible/rangecontrols.cpp accessible/rangecontrols_p.h
+ accessible/simplewidgets.cpp accessible/simplewidgets_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_accessibility AND QT_FEATURE_itemviews
+ SOURCES
+ accessible/itemviews.cpp accessible/itemviews_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_itemviews
+ SOURCES
+ itemviews/qabstractitemdelegate.cpp itemviews/qabstractitemdelegate.h itemviews/qabstractitemdelegate_p.h
+ itemviews/qabstractitemview.cpp itemviews/qabstractitemview.h itemviews/qabstractitemview_p.h
+ itemviews/qbsptree.cpp itemviews/qbsptree_p.h
+ itemviews/qheaderview.cpp itemviews/qheaderview.h itemviews/qheaderview_p.h
+ itemviews/qitemdelegate.cpp itemviews/qitemdelegate.h
+ itemviews/qitemeditorfactory.cpp itemviews/qitemeditorfactory.h itemviews/qitemeditorfactory_p.h
+ itemviews/qstyleditemdelegate.cpp itemviews/qstyleditemdelegate.h
+ itemviews/qwidgetitemdata_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_columnview
+ SOURCES
+ itemviews/qcolumnview.cpp itemviews/qcolumnview.h itemviews/qcolumnview_p.h
+ itemviews/qcolumnviewgrip.cpp itemviews/qcolumnviewgrip_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_datawidgetmapper
+ SOURCES
+ itemviews/qdatawidgetmapper.cpp itemviews/qdatawidgetmapper.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_dirmodel
+ SOURCES
+ itemviews/qdirmodel.cpp itemviews/qdirmodel.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_listview
+ SOURCES
+ itemviews/qlistview.cpp itemviews/qlistview.h itemviews/qlistview_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_listwidget
+ SOURCES
+ itemviews/qlistwidget.cpp itemviews/qlistwidget.h itemviews/qlistwidget_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_tableview
+ SOURCES
+ itemviews/qtableview.cpp itemviews/qtableview.h itemviews/qtableview_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_tablewidget
+ SOURCES
+ itemviews/qtablewidget.cpp itemviews/qtablewidget.h itemviews/qtablewidget_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_treeview
+ SOURCES
+ itemviews/qtreeview.cpp itemviews/qtreeview.h itemviews/qtreeview_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_treewidget
+ SOURCES
+ itemviews/qtreewidget.cpp itemviews/qtreewidget.h itemviews/qtreewidget_p.h
+ itemviews/qtreewidgetitemiterator.cpp itemviews/qtreewidgetitemiterator.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_graphicsview
+ SOURCES
+ graphicsview/qgraph_p.h
+ graphicsview/qgraphicsanchorlayout.cpp graphicsview/qgraphicsanchorlayout.h graphicsview/qgraphicsanchorlayout_p.cpp graphicsview/qgraphicsanchorlayout_p.h
+ graphicsview/qgraphicsgridlayout.cpp graphicsview/qgraphicsgridlayout.h
+ graphicsview/qgraphicsgridlayoutengine.cpp graphicsview/qgraphicsgridlayoutengine_p.h
+ graphicsview/qgraphicsitem.cpp graphicsview/qgraphicsitem.h graphicsview/qgraphicsitem_p.h
+ graphicsview/qgraphicslayout.cpp graphicsview/qgraphicslayout.h graphicsview/qgraphicslayout_p.cpp graphicsview/qgraphicslayout_p.h
+ graphicsview/qgraphicslayoutitem.cpp graphicsview/qgraphicslayoutitem.h graphicsview/qgraphicslayoutitem_p.h
+ graphicsview/qgraphicslayoutstyleinfo.cpp graphicsview/qgraphicslayoutstyleinfo_p.h
+ graphicsview/qgraphicslinearlayout.cpp graphicsview/qgraphicslinearlayout.h
+ graphicsview/qgraphicsproxywidget.cpp graphicsview/qgraphicsproxywidget.h graphicsview/qgraphicsproxywidget_p.h
+ graphicsview/qgraphicsscene.cpp graphicsview/qgraphicsscene.h graphicsview/qgraphicsscene_p.h
+ graphicsview/qgraphicsscene_bsp.cpp graphicsview/qgraphicsscene_bsp_p.h
+ graphicsview/qgraphicsscenebsptreeindex.cpp graphicsview/qgraphicsscenebsptreeindex_p.h
+ graphicsview/qgraphicssceneevent.cpp graphicsview/qgraphicssceneevent.h
+ graphicsview/qgraphicssceneindex.cpp graphicsview/qgraphicssceneindex_p.h
+ graphicsview/qgraphicsscenelinearindex.cpp graphicsview/qgraphicsscenelinearindex_p.h
+ graphicsview/qgraphicstransform.cpp graphicsview/qgraphicstransform.h graphicsview/qgraphicstransform_p.h
+ graphicsview/qgraphicsview.cpp graphicsview/qgraphicsview.h graphicsview/qgraphicsview_p.h
+ graphicsview/qgraphicswidget.cpp graphicsview/qgraphicswidget.h graphicsview/qgraphicswidget_p.cpp graphicsview/qgraphicswidget_p.h
+ graphicsview/qsimplex_p.cpp graphicsview/qsimplex_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_easingcurve AND QT_FEATURE_graphicsview
+ SOURCES
+ graphicsview/qgraphicsitemanimation.cpp graphicsview/qgraphicsitemanimation.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_completer
+ SOURCES
+ util/qcompleter.cpp util/qcompleter.h util/qcompleter_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_scroller
+ SOURCES
+ util/qflickgesture.cpp util/qflickgesture_p.h
+ util/qscroller.cpp util/qscroller.h util/qscroller_p.h
+ util/qscrollerproperties.cpp util/qscrollerproperties.h util/qscrollerproperties_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_undoview
+ SOURCES
+ util/qundoview.cpp util/qundoview.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_xcb
+ SOURCES
+ util/qsystemtrayicon_x11.cpp
+)
+
+qt_extend_target(Widgets CONDITION NOT QT_FEATURE_xcb
+ SOURCES
+ util/qsystemtrayicon_qpa.cpp
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_statemachine
+ SOURCES
+ statemachine/qguistatemachine.cpp
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_qeventtransition
+ SOURCES
+ statemachine/qbasickeyeventtransition.cpp statemachine/qbasickeyeventtransition_p.h
+ statemachine/qbasicmouseeventtransition.cpp statemachine/qbasicmouseeventtransition_p.h
+ statemachine/qkeyeventtransition.cpp statemachine/qkeyeventtransition.h
+ statemachine/qmouseeventtransition.cpp statemachine/qmouseeventtransition.h
+)
+
+
+qt_create_tracepoints(Widgets qtwidgets.tracepoints)
+qt_add_docs(Widgets
+ doc/qtwidgets.qdocconf
+)
+
diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt
new file mode 100644
index 0000000000..8b2f599a60
--- /dev/null
+++ b/src/widgets/CMakeLists.txt
@@ -0,0 +1,832 @@
+# Generated from widgets.pro.
+
+#####################################################################
+## Widgets Module:
+#####################################################################
+
+qt_add_module(Widgets
+ GENERATE_METATYPES
+ QMAKE_MODULE_CONFIG uic
+ PLUGIN_TYPES styles
+ SOURCES
+ itemviews/qfileiconprovider.cpp itemviews/qfileiconprovider.h itemviews/qfileiconprovider_p.h
+ kernel/qapplication.cpp kernel/qapplication.h kernel/qapplication_p.h
+ kernel/qboxlayout.cpp kernel/qboxlayout.h
+ kernel/qdesktopwidget.cpp kernel/qdesktopwidget.h kernel/qdesktopwidget_p.h
+ kernel/qgesture.cpp kernel/qgesture.h kernel/qgesture_p.h
+ kernel/qgesturemanager.cpp kernel/qgesturemanager_p.h
+ kernel/qgesturerecognizer.cpp kernel/qgesturerecognizer.h
+ kernel/qgridlayout.cpp kernel/qgridlayout.h
+ kernel/qlayout.cpp kernel/qlayout.h kernel/qlayout_p.h
+ kernel/qlayoutengine.cpp kernel/qlayoutengine_p.h
+ kernel/qlayoutitem.cpp kernel/qlayoutitem.h
+ kernel/qsizepolicy.cpp kernel/qsizepolicy.h
+ kernel/qstackedlayout.cpp kernel/qstackedlayout.h
+ kernel/qstandardgestures.cpp kernel/qstandardgestures_p.h
+ kernel/qtestsupport_widgets.cpp kernel/qtestsupport_widgets.h
+ kernel/qtwidgetsglobal.h kernel/qtwidgetsglobal_p.h
+ kernel/qwidget.cpp kernel/qwidget.h kernel/qwidget_p.h
+ kernel/qwidgetrepaintmanager.cpp kernel/qwidgetrepaintmanager_p.h
+ kernel/qwidgetsvariant.cpp
+ kernel/qwidgetwindow.cpp kernel/qwidgetwindow_p.h
+ kernel/qwindowcontainer.cpp kernel/qwindowcontainer_p.h
+ styles/qcommonstyle.cpp styles/qcommonstyle.h styles/qcommonstyle_p.h
+ styles/qcommonstylepixmaps_p.h
+ styles/qdrawutil.cpp styles/qdrawutil.h
+ styles/qpixmapstyle.cpp styles/qpixmapstyle_p.h
+ styles/qpixmapstyle_p_p.h
+ styles/qproxystyle.cpp styles/qproxystyle.h styles/qproxystyle_p.h
+ styles/qstyle.cpp styles/qstyle.h
+ styles/qstylefactory.cpp styles/qstylefactory.h
+ styles/qstylehelper.cpp styles/qstylehelper_p.h
+ styles/qstyleoption.cpp styles/qstyleoption.h
+ styles/qstylepainter.cpp styles/qstylepainter.h
+ styles/qstyleplugin.cpp styles/qstyleplugin.h
+ styles/qstylesheetstyle.cpp styles/qstylesheetstyle_p.h
+ styles/qstylesheetstyle_default.cpp
+ util/qcolormap.cpp util/qcolormap.h
+ util/qsystemtrayicon.cpp util/qsystemtrayicon.h util/qsystemtrayicon_p.h
+ widgets/qabstractscrollarea.cpp widgets/qabstractscrollarea.h widgets/qabstractscrollarea_p.h
+ widgets/qfocusframe.cpp widgets/qfocusframe.h
+ widgets/qframe.cpp widgets/qframe.h widgets/qframe_p.h
+ widgets/qwidgetanimator.cpp widgets/qwidgetanimator_p.h
+ DEFINES
+ QT_NO_USING_NAMESPACE
+ INCLUDE_DIRECTORIES
+ dialogs
+ LIBRARIES
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::Gui
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+ Qt::GuiPrivate
+ PRECOMPILED_HEADER
+ "kernel/qt_widgets_pch.h"
+)
+
+add_dependencies(Widgets ${QT_CMAKE_EXPORT_NAMESPACE}::uic) # special case
+
+# Resources:
+set(qstyle_resource_files
+ "images/cdr-128.png"
+ "images/cdr-16.png"
+ "images/cdr-32.png"
+ "images/cleartext-16.png"
+ "images/cleartext-32.png"
+ "images/closedock-10.png"
+ "images/closedock-16.png"
+ "images/closedock-20.png"
+ "images/closedock-32.png"
+ "images/closedock-48.png"
+ "images/closedock-64.png"
+ "images/computer-16.png"
+ "images/computer-32.png"
+ "images/desktop-16.png"
+ "images/desktop-32.png"
+ "images/dirclosed-128.png"
+ "images/dirclosed-16.png"
+ "images/dirclosed-32.png"
+ "images/dirlink-128.png"
+ "images/dirlink-16.png"
+ "images/dirlink-32.png"
+ "images/diropen-128.png"
+ "images/diropen-16.png"
+ "images/diropen-32.png"
+ "images/down-128.png"
+ "images/down-16.png"
+ "images/down-32.png"
+ "images/dvd-128.png"
+ "images/dvd-16.png"
+ "images/dvd-32.png"
+ "images/file-128.png"
+ "images/file-16.png"
+ "images/file-32.png"
+ "images/filecontents-128.png"
+ "images/filecontents-16.png"
+ "images/filecontents-32.png"
+ "images/fileinfo-128.png"
+ "images/fileinfo-16.png"
+ "images/fileinfo-32.png"
+ "images/filelink-128.png"
+ "images/filelink-16.png"
+ "images/filelink-32.png"
+ "images/floppy-128.png"
+ "images/floppy-16.png"
+ "images/floppy-32.png"
+ "images/fontbitmap-16.png"
+ "images/fonttruetype-16.png"
+ "images/fusion_groupbox.png"
+ "images/harddrive-128.png"
+ "images/harddrive-16.png"
+ "images/harddrive-32.png"
+ "images/left-128.png"
+ "images/left-16.png"
+ "images/left-32.png"
+ "images/media-pause-16.png"
+ "images/media-pause-32.png"
+ "images/media-play-16.png"
+ "images/media-play-32.png"
+ "images/media-seek-backward-16.png"
+ "images/media-seek-backward-32.png"
+ "images/media-seek-forward-16.png"
+ "images/media-seek-forward-32.png"
+ "images/media-skip-backward-16.png"
+ "images/media-skip-backward-32.png"
+ "images/media-skip-forward-16.png"
+ "images/media-skip-forward-32.png"
+ "images/media-stop-16.png"
+ "images/media-stop-32.png"
+ "images/media-volume-16.png"
+ "images/media-volume-muted-16.png"
+ "images/networkdrive-128.png"
+ "images/networkdrive-16.png"
+ "images/networkdrive-32.png"
+ "images/newdirectory-128.png"
+ "images/newdirectory-16.png"
+ "images/newdirectory-32.png"
+ "images/normalizedockup-10.png"
+ "images/normalizedockup-16.png"
+ "images/normalizedockup-20.png"
+ "images/normalizedockup-32.png"
+ "images/normalizedockup-48.png"
+ "images/normalizedockup-64.png"
+ "images/parentdir-128.png"
+ "images/parentdir-16.png"
+ "images/parentdir-32.png"
+ "images/refresh-24.png"
+ "images/refresh-32.png"
+ "images/right-128.png"
+ "images/right-16.png"
+ "images/right-32.png"
+ "images/standardbutton-apply-128.png"
+ "images/standardbutton-apply-16.png"
+ "images/standardbutton-apply-32.png"
+ "images/standardbutton-cancel-128.png"
+ "images/standardbutton-cancel-16.png"
+ "images/standardbutton-cancel-32.png"
+ "images/standardbutton-clear-128.png"
+ "images/standardbutton-clear-16.png"
+ "images/standardbutton-clear-32.png"
+ "images/standardbutton-close-128.png"
+ "images/standardbutton-close-16.png"
+ "images/standardbutton-close-32.png"
+ "images/standardbutton-closetab-16.png"
+ "images/standardbutton-closetab-down-16.png"
+ "images/standardbutton-closetab-hover-16.png"
+ "images/standardbutton-delete-128.png"
+ "images/standardbutton-delete-16.png"
+ "images/standardbutton-delete-32.png"
+ "images/standardbutton-help-128.png"
+ "images/standardbutton-help-16.png"
+ "images/standardbutton-help-32.png"
+ "images/standardbutton-no-128.png"
+ "images/standardbutton-no-16.png"
+ "images/standardbutton-no-32.png"
+ "images/standardbutton-ok-128.png"
+ "images/standardbutton-ok-16.png"
+ "images/standardbutton-ok-32.png"
+ "images/standardbutton-open-128.png"
+ "images/standardbutton-open-16.png"
+ "images/standardbutton-open-32.png"
+ "images/standardbutton-save-128.png"
+ "images/standardbutton-save-16.png"
+ "images/standardbutton-save-32.png"
+ "images/standardbutton-yes-128.png"
+ "images/standardbutton-yes-16.png"
+ "images/standardbutton-yes-32.png"
+ "images/stop-24.png"
+ "images/stop-32.png"
+ "images/titlebar-contexthelp-16.png"
+ "images/titlebar-contexthelp-32.png"
+ "images/titlebar-contexthelp-48.png"
+ "images/titlebar-max-16.png"
+ "images/titlebar-max-32.png"
+ "images/titlebar-max-48.png"
+ "images/titlebar-min-16.png"
+ "images/titlebar-min-32.png"
+ "images/titlebar-min-48.png"
+ "images/titlebar-shade-16.png"
+ "images/titlebar-shade-32.png"
+ "images/titlebar-shade-48.png"
+ "images/titlebar-unshade-16.png"
+ "images/titlebar-unshade-32.png"
+ "images/titlebar-unshade-48.png"
+ "images/toolbar-ext-h-16.png"
+ "images/toolbar-ext-h-32.png"
+ "images/toolbar-ext-h-8.png"
+ "images/toolbar-ext-h-rtl-16.png"
+ "images/toolbar-ext-h-rtl-32.png"
+ "images/toolbar-ext-h-rtl-8.png"
+ "images/toolbar-ext-v-10.png"
+ "images/toolbar-ext-v-20.png"
+ "images/toolbar-ext-v-5.png"
+ "images/trash-128.png"
+ "images/trash-16.png"
+ "images/trash-32.png"
+ "images/up-128.png"
+ "images/up-16.png"
+ "images/up-32.png"
+ "images/viewdetailed-128.png"
+ "images/viewdetailed-16.png"
+ "images/viewdetailed-32.png"
+ "images/viewlist-128.png"
+ "images/viewlist-16.png"
+ "images/viewlist-32.png"
+)
+
+qt_add_resource(Widgets "qstyle"
+ PREFIX
+ "/qt-project.org/styles/commonstyle"
+ BASE
+ "styles"
+ FILES
+ ${qstyle_resource_files}
+)
+set_source_files_properties("styles/images/closedock-down-macstyle-16.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/closedock-down-16.png"
+)
+set_source_files_properties("styles/images/closedock-macstyle-16.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/closedock-16.png"
+)
+set_source_files_properties("styles/images/dockdock-down-macstyle-16.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/dockdock-down-16.png"
+)
+set_source_files_properties("styles/images/dockdock-macstyle-16.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/dockdock-16.png"
+)
+set_source_files_properties("styles/images/toolbar-ext-macstyle.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/toolbar-ext.png"
+)
+set_source_files_properties("styles/images/toolbar-ext-macstyle@2x.png"
+ PROPERTIES QT_RESOURCE_ALIAS "images/toolbar-ext@2x.png"
+)
+set(qstyle1_resource_files
+ "images/closedock-down-macstyle-16.png"
+ "images/closedock-macstyle-16.png"
+ "images/dockdock-down-macstyle-16.png"
+ "images/dockdock-macstyle-16.png"
+ "images/toolbar-ext-macstyle.png"
+ "images/toolbar-ext-macstyle@2x.png"
+)
+
+qt_add_resource(Widgets "qstyle1"
+ PREFIX
+ "/qt-project.org/styles/macstyle"
+ BASE
+ "styles"
+ FILES
+ ${qstyle1_resource_files}
+)
+
+if(QT_FEATURE_reduce_relocations AND UNIX AND GCC)
+ target_link_options(Widgets PRIVATE
+ "LINKER:--dynamic-list=${CMAKE_CURRENT_LIST_DIR}/QtWidgets.dynlist")
+endif()
+
+#### Keys ignored in scope 1:.:.:widgets.pro:<TRUE>:
+# MODULE_CONFIG = "uic"
+# QMAKE_LIBS = "$$QMAKE_LIBS_GUI"
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(Widgets CONDITION MSVC AND (TEST_architecture_arch STREQUAL "i386")
+ LINK_OPTIONS
+ "/BASE:0x65000000"
+)
+
+qt_extend_target(Widgets CONDITION MACOS
+ SOURCES
+ kernel/qmacgesturerecognizer.cpp kernel/qmacgesturerecognizer_p.h
+ widgets/qmaccocoaviewcontainer_mac.h widgets/qmaccocoaviewcontainer_mac.mm
+ widgets/qmacnativewidget_mac.h widgets/qmacnativewidget_mac.mm
+ LIBRARIES
+ ${FWAppKit}
+ z
+)
+
+qt_extend_target(Widgets CONDITION WIN32 AND NOT WINRT
+ LIBRARIES
+ dwmapi
+ shell32
+ uxtheme
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_graphicseffect
+ SOURCES
+ effects/qgraphicseffect.cpp effects/qgraphicseffect.h effects/qgraphicseffect_p.h
+ effects/qpixmapfilter.cpp effects/qpixmapfilter_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_action
+ SOURCES
+ kernel/qaction_widgets.cpp kernel/qaction_widgets_p.h
+ kernel/qwidgetaction.cpp kernel/qwidgetaction.h kernel/qwidgetaction_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_formlayout
+ SOURCES
+ kernel/qformlayout.cpp kernel/qformlayout.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_shortcut
+ SOURCES
+ kernel/qshortcut_widgets.cpp
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_tooltip
+ SOURCES
+ kernel/qtooltip.cpp kernel/qtooltip.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_whatsthis
+ SOURCES
+ kernel/qwhatsthis.cpp kernel/qwhatsthis.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_animation
+ SOURCES
+ styles/qstyleanimation.cpp styles/qstyleanimation_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_style_windows
+ SOURCES
+ styles/qwindowsstyle.cpp styles/qwindowsstyle_p.h
+ styles/qwindowsstyle_p_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_style_fusion
+ SOURCES
+ styles/qfusionstyle.cpp styles/qfusionstyle_p.h
+ styles/qfusionstyle_p_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_abstractbutton
+ SOURCES
+ widgets/qabstractbutton.cpp widgets/qabstractbutton.h widgets/qabstractbutton_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_abstractslider
+ SOURCES
+ widgets/qabstractslider.cpp widgets/qabstractslider.h widgets/qabstractslider_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_buttongroup
+ SOURCES
+ widgets/qbuttongroup.cpp widgets/qbuttongroup.h widgets/qbuttongroup_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_calendarwidget
+ SOURCES
+ widgets/qcalendarwidget.cpp widgets/qcalendarwidget.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_checkbox
+ SOURCES
+ widgets/qcheckbox.cpp widgets/qcheckbox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_combobox
+ SOURCES
+ widgets/qcombobox.cpp widgets/qcombobox.h widgets/qcombobox_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_commandlinkbutton
+ SOURCES
+ widgets/qcommandlinkbutton.cpp widgets/qcommandlinkbutton.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_datetimeedit
+ SOURCES
+ widgets/qdatetimeedit.cpp widgets/qdatetimeedit.h widgets/qdatetimeedit_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_dial
+ SOURCES
+ widgets/qdial.cpp widgets/qdial.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_dockwidget
+ SOURCES
+ widgets/qdockarealayout.cpp widgets/qdockarealayout_p.h
+ widgets/qdockwidget.cpp widgets/qdockwidget.h widgets/qdockwidget_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_effects
+ SOURCES
+ widgets/qeffects.cpp widgets/qeffects_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_fontcombobox
+ SOURCES
+ widgets/qfontcombobox.cpp widgets/qfontcombobox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_groupbox
+ SOURCES
+ widgets/qgroupbox.cpp widgets/qgroupbox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_keysequenceedit
+ SOURCES
+ widgets/qkeysequenceedit.cpp widgets/qkeysequenceedit.h widgets/qkeysequenceedit_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_label
+ SOURCES
+ widgets/qlabel.cpp widgets/qlabel.h widgets/qlabel_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_lcdnumber
+ SOURCES
+ widgets/qlcdnumber.cpp widgets/qlcdnumber.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_lineedit
+ SOURCES
+ widgets/qlineedit.cpp widgets/qlineedit.h widgets/qlineedit_p.cpp widgets/qlineedit_p.h
+ widgets/qwidgetlinecontrol.cpp widgets/qwidgetlinecontrol_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_mainwindow
+ SOURCES
+ widgets/qmainwindow.cpp widgets/qmainwindow.h
+ widgets/qmainwindowlayout.cpp widgets/qmainwindowlayout_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_mdiarea
+ SOURCES
+ widgets/qmdiarea.cpp widgets/qmdiarea.h widgets/qmdiarea_p.h
+ widgets/qmdisubwindow.cpp widgets/qmdisubwindow.h widgets/qmdisubwindow_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_menu
+ SOURCES
+ widgets/qmenu.cpp widgets/qmenu.h widgets/qmenu_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_menubar
+ SOURCES
+ widgets/qmenubar.cpp widgets/qmenubar.h widgets/qmenubar_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_progressbar
+ SOURCES
+ widgets/qprogressbar.cpp widgets/qprogressbar.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_pushbutton
+ SOURCES
+ widgets/qpushbutton.cpp widgets/qpushbutton.h widgets/qpushbutton_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_radiobutton
+ SOURCES
+ widgets/qradiobutton.cpp widgets/qradiobutton.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_resizehandler
+ SOURCES
+ widgets/qwidgetresizehandler.cpp widgets/qwidgetresizehandler_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_dialogbuttonbox
+ SOURCES
+ widgets/qdialogbuttonbox.cpp widgets/qdialogbuttonbox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_rubberband
+ SOURCES
+ widgets/qrubberband.cpp widgets/qrubberband.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_scrollarea
+ SOURCES
+ widgets/qscrollarea.cpp widgets/qscrollarea.h widgets/qscrollarea_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_scrollbar
+ SOURCES
+ widgets/qscrollbar.cpp widgets/qscrollbar.h widgets/qscrollbar_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_sizegrip
+ SOURCES
+ widgets/qsizegrip.cpp widgets/qsizegrip.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_slider
+ SOURCES
+ widgets/qslider.cpp widgets/qslider.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_spinbox
+ SOURCES
+ widgets/qabstractspinbox.cpp widgets/qabstractspinbox.h widgets/qabstractspinbox_p.h
+ widgets/qspinbox.cpp widgets/qspinbox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_splashscreen
+ SOURCES
+ widgets/qsplashscreen.cpp widgets/qsplashscreen.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_splitter
+ SOURCES
+ widgets/qsplitter.cpp widgets/qsplitter.h widgets/qsplitter_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_stackedwidget
+ SOURCES
+ widgets/qstackedwidget.cpp widgets/qstackedwidget.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_statusbar
+ SOURCES
+ widgets/qstatusbar.cpp widgets/qstatusbar.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_tabbar
+ SOURCES
+ widgets/qtabbar.cpp widgets/qtabbar.h widgets/qtabbar_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_textedit
+ SOURCES
+ widgets/qplaintextedit.cpp widgets/qplaintextedit.h widgets/qplaintextedit_p.h
+ widgets/qtextedit.cpp widgets/qtextedit.h widgets/qtextedit_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_textbrowser
+ SOURCES
+ widgets/qtextbrowser.cpp widgets/qtextbrowser.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_tabwidget
+ SOURCES
+ widgets/qtabwidget.cpp widgets/qtabwidget.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_toolbar
+ SOURCES
+ widgets/qtoolbar.cpp widgets/qtoolbar.h widgets/qtoolbar_p.h
+ widgets/qtoolbararealayout.cpp widgets/qtoolbararealayout_p.h
+ widgets/qtoolbarlayout.cpp widgets/qtoolbarlayout_p.h
+ widgets/qtoolbarseparator.cpp widgets/qtoolbarseparator_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_toolbox
+ SOURCES
+ widgets/qtoolbox.cpp widgets/qtoolbox.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_toolbutton
+ SOURCES
+ widgets/qtoolbarextension.cpp widgets/qtoolbarextension_p.h
+ widgets/qtoolbutton.cpp widgets/qtoolbutton.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_widgettextcontrol
+ SOURCES
+ widgets/qwidgettextcontrol.cpp widgets/qwidgettextcontrol_p.h
+ widgets/qwidgettextcontrol_p_p.h
+)
+
+qt_extend_target(Widgets CONDITION MACOS AND (QT_FEATURE_menu OR QT_FEATURE_menubar)
+ SOURCES
+ widgets/qmenu_mac.mm
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_colordialog
+ SOURCES
+ dialogs/qcolordialog.cpp dialogs/qcolordialog.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_dialog
+ SOURCES
+ dialogs/qdialog.cpp dialogs/qdialog.h dialogs/qdialog_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_errormessage
+ SOURCES
+ dialogs/qerrormessage.cpp dialogs/qerrormessage.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_filedialog
+ SOURCES
+ dialogs/qfiledialog.cpp dialogs/qfiledialog.h dialogs/qfiledialog.ui dialogs/qfiledialog_p.h
+ dialogs/qsidebar.cpp dialogs/qsidebar_p.h
+ ENABLE_AUTOGEN_TOOLS
+ uic
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_filesystemmodel
+ SOURCES
+ dialogs/qfileinfogatherer.cpp dialogs/qfileinfogatherer_p.h
+ dialogs/qfilesystemmodel.cpp dialogs/qfilesystemmodel.h dialogs/qfilesystemmodel_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_fontdialog
+ SOURCES
+ dialogs/qfontdialog.cpp dialogs/qfontdialog.h dialogs/qfontdialog_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_fscompleter
+ SOURCES
+ dialogs/qfscompleter_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_inputdialog
+ SOURCES
+ dialogs/qinputdialog.cpp dialogs/qinputdialog.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_messagebox
+ SOURCES
+ dialogs/qmessagebox.cpp dialogs/qmessagebox.h
+)
+
+if(QT_FEATURE_messagebox)
+ # Resources:
+ set(qmessagebox_resource_files
+ "images/qtlogo-64.png"
+ )
+
+ qt_add_resource(Widgets "qmessagebox"
+ PREFIX
+ "/qt-project.org/qmessagebox"
+ BASE
+ "dialogs"
+ FILES
+ ${qmessagebox_resource_files}
+ )
+endif()
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_progressdialog
+ SOURCES
+ dialogs/qprogressdialog.cpp dialogs/qprogressdialog.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_wizard
+ SOURCES
+ dialogs/qwizard.cpp dialogs/qwizard.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_wizard AND WIN32
+ SOURCES
+ dialogs/qwizard_win.cpp dialogs/qwizard_win_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_accessibility
+ SOURCES
+ accessible/complexwidgets.cpp accessible/complexwidgets_p.h
+ accessible/qaccessiblemenu.cpp accessible/qaccessiblemenu_p.h
+ accessible/qaccessiblewidget.cpp accessible/qaccessiblewidget.h
+ accessible/qaccessiblewidgetfactory.cpp accessible/qaccessiblewidgetfactory_p.h
+ accessible/qaccessiblewidgets.cpp accessible/qaccessiblewidgets_p.h
+ accessible/rangecontrols.cpp accessible/rangecontrols_p.h
+ accessible/simplewidgets.cpp accessible/simplewidgets_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_accessibility AND QT_FEATURE_itemviews
+ SOURCES
+ accessible/itemviews.cpp accessible/itemviews_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_itemviews
+ SOURCES
+ itemviews/qabstractitemdelegate.cpp itemviews/qabstractitemdelegate.h itemviews/qabstractitemdelegate_p.h
+ itemviews/qabstractitemview.cpp itemviews/qabstractitemview.h itemviews/qabstractitemview_p.h
+ itemviews/qbsptree.cpp itemviews/qbsptree_p.h
+ itemviews/qheaderview.cpp itemviews/qheaderview.h itemviews/qheaderview_p.h
+ itemviews/qitemdelegate.cpp itemviews/qitemdelegate.h
+ itemviews/qitemeditorfactory.cpp itemviews/qitemeditorfactory.h itemviews/qitemeditorfactory_p.h
+ itemviews/qstyleditemdelegate.cpp itemviews/qstyleditemdelegate.h
+ itemviews/qwidgetitemdata_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_columnview
+ SOURCES
+ itemviews/qcolumnview.cpp itemviews/qcolumnview.h itemviews/qcolumnview_p.h
+ itemviews/qcolumnviewgrip.cpp itemviews/qcolumnviewgrip_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_datawidgetmapper
+ SOURCES
+ itemviews/qdatawidgetmapper.cpp itemviews/qdatawidgetmapper.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_dirmodel
+ SOURCES
+ itemviews/qdirmodel.cpp itemviews/qdirmodel.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_listview
+ SOURCES
+ itemviews/qlistview.cpp itemviews/qlistview.h itemviews/qlistview_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_listwidget
+ SOURCES
+ itemviews/qlistwidget.cpp itemviews/qlistwidget.h itemviews/qlistwidget_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_tableview
+ SOURCES
+ itemviews/qtableview.cpp itemviews/qtableview.h itemviews/qtableview_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_tablewidget
+ SOURCES
+ itemviews/qtablewidget.cpp itemviews/qtablewidget.h itemviews/qtablewidget_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_treeview
+ SOURCES
+ itemviews/qtreeview.cpp itemviews/qtreeview.h itemviews/qtreeview_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_treewidget
+ SOURCES
+ itemviews/qtreewidget.cpp itemviews/qtreewidget.h itemviews/qtreewidget_p.h
+ itemviews/qtreewidgetitemiterator.cpp itemviews/qtreewidgetitemiterator.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_graphicsview
+ SOURCES
+ graphicsview/qgraph_p.h
+ graphicsview/qgraphicsanchorlayout.cpp graphicsview/qgraphicsanchorlayout.h graphicsview/qgraphicsanchorlayout_p.cpp graphicsview/qgraphicsanchorlayout_p.h
+ graphicsview/qgraphicsgridlayout.cpp graphicsview/qgraphicsgridlayout.h
+ graphicsview/qgraphicsgridlayoutengine.cpp graphicsview/qgraphicsgridlayoutengine_p.h
+ graphicsview/qgraphicsitem.cpp graphicsview/qgraphicsitem.h graphicsview/qgraphicsitem_p.h
+ graphicsview/qgraphicslayout.cpp graphicsview/qgraphicslayout.h graphicsview/qgraphicslayout_p.cpp graphicsview/qgraphicslayout_p.h
+ graphicsview/qgraphicslayoutitem.cpp graphicsview/qgraphicslayoutitem.h graphicsview/qgraphicslayoutitem_p.h
+ graphicsview/qgraphicslayoutstyleinfo.cpp graphicsview/qgraphicslayoutstyleinfo_p.h
+ graphicsview/qgraphicslinearlayout.cpp graphicsview/qgraphicslinearlayout.h
+ graphicsview/qgraphicsproxywidget.cpp graphicsview/qgraphicsproxywidget.h graphicsview/qgraphicsproxywidget_p.h
+ graphicsview/qgraphicsscene.cpp graphicsview/qgraphicsscene.h graphicsview/qgraphicsscene_p.h
+ graphicsview/qgraphicsscene_bsp.cpp graphicsview/qgraphicsscene_bsp_p.h
+ graphicsview/qgraphicsscenebsptreeindex.cpp graphicsview/qgraphicsscenebsptreeindex_p.h
+ graphicsview/qgraphicssceneevent.cpp graphicsview/qgraphicssceneevent.h
+ graphicsview/qgraphicssceneindex.cpp graphicsview/qgraphicssceneindex_p.h
+ graphicsview/qgraphicsscenelinearindex.cpp graphicsview/qgraphicsscenelinearindex_p.h
+ graphicsview/qgraphicstransform.cpp graphicsview/qgraphicstransform.h graphicsview/qgraphicstransform_p.h
+ graphicsview/qgraphicsview.cpp graphicsview/qgraphicsview.h graphicsview/qgraphicsview_p.h
+ graphicsview/qgraphicswidget.cpp graphicsview/qgraphicswidget.h graphicsview/qgraphicswidget_p.cpp graphicsview/qgraphicswidget_p.h
+ graphicsview/qsimplex_p.cpp graphicsview/qsimplex_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_easingcurve AND QT_FEATURE_graphicsview
+ SOURCES
+ graphicsview/qgraphicsitemanimation.cpp graphicsview/qgraphicsitemanimation.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_completer
+ SOURCES
+ util/qcompleter.cpp util/qcompleter.h util/qcompleter_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_scroller
+ SOURCES
+ util/qflickgesture.cpp util/qflickgesture_p.h
+ util/qscroller.cpp util/qscroller.h util/qscroller_p.h
+ util/qscrollerproperties.cpp util/qscrollerproperties.h util/qscrollerproperties_p.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_undoview
+ SOURCES
+ util/qundoview.cpp util/qundoview.h
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_xcb
+ SOURCES
+ util/qsystemtrayicon_x11.cpp
+)
+
+qt_extend_target(Widgets CONDITION NOT QT_FEATURE_xcb
+ SOURCES
+ util/qsystemtrayicon_qpa.cpp
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_statemachine
+ SOURCES
+ statemachine/qguistatemachine.cpp
+)
+
+qt_extend_target(Widgets CONDITION QT_FEATURE_qeventtransition
+ SOURCES
+ statemachine/qbasickeyeventtransition.cpp statemachine/qbasickeyeventtransition_p.h
+ statemachine/qbasicmouseeventtransition.cpp statemachine/qbasicmouseeventtransition_p.h
+ statemachine/qkeyeventtransition.cpp statemachine/qkeyeventtransition.h
+ statemachine/qmouseeventtransition.cpp statemachine/qmouseeventtransition.h
+)
+
+
+qt_create_tracepoints(Widgets qtwidgets.tracepoints)
+qt_add_docs(Widgets
+ doc/qtwidgets.qdocconf
+)
+
diff --git a/src/widgets/Qt5WidgetsMacros.cmake b/src/widgets/Qt5WidgetsMacros.cmake
deleted file mode 100644
index 35d2a2dc54..0000000000
--- a/src/widgets/Qt5WidgetsMacros.cmake
+++ /dev/null
@@ -1,80 +0,0 @@
-#=============================================================================
-# Copyright 2005-2011 Kitware, Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# * Neither the name of Kitware, Inc. nor the names of its
-# contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#=============================================================================
-
-######################################
-#
-# Macros for building Qt files
-#
-######################################
-
-include(CMakeParseArguments)
-
-
-# qt5_wrap_ui(outfiles inputfile ... )
-
-function(qt5_wrap_ui outfiles )
- set(options)
- set(oneValueArgs)
- set(multiValueArgs OPTIONS)
-
- cmake_parse_arguments(_WRAP_UI "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
-
- set(ui_files ${_WRAP_UI_UNPARSED_ARGUMENTS})
- set(ui_options ${_WRAP_UI_OPTIONS})
-
- foreach(it ${ui_files})
- get_filename_component(outfile ${it} NAME_WE)
- get_filename_component(infile ${it} ABSOLUTE)
- set(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h)
- add_custom_command(OUTPUT ${outfile}
- COMMAND ${Qt5Widgets_UIC_EXECUTABLE}
- ARGS ${ui_options} -o ${outfile} ${infile}
- MAIN_DEPENDENCY ${infile} VERBATIM)
- set_source_files_properties(${infile} PROPERTIES SKIP_AUTOUIC ON)
- set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOMOC ON)
- set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOUIC ON)
- list(APPEND ${outfiles} ${outfile})
- endforeach()
- set(${outfiles} ${${outfiles}} PARENT_SCOPE)
-endfunction()
-
-# This will override the CMake upstream command, because that one is for Qt 3.
-if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
- function(qt_wrap_ui outfiles)
- if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
- qt5_wrap_ui("${outfiles}" ${ARGN})
- elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
- qt6_wrap_ui("${outfiles}" ${ARGN})
- endif()
- set("${outfiles}" "${${outfiles}}" PARENT_SCOPE)
- endfunction()
-endif()
diff --git a/src/widgets/Qt6WidgetsMacros.cmake b/src/widgets/Qt6WidgetsMacros.cmake
new file mode 100644
index 0000000000..aa8133ba47
--- /dev/null
+++ b/src/widgets/Qt6WidgetsMacros.cmake
@@ -0,0 +1,81 @@
+#=============================================================================
+# Copyright 2005-2011 Kitware, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# * Neither the name of Kitware, Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#=============================================================================
+
+######################################
+#
+# Macros for building Qt files
+#
+######################################
+
+include(CMakeParseArguments)
+
+
+# qt6_wrap_ui(outfiles inputfile ... )
+
+function(qt6_wrap_ui outfiles )
+ set(options)
+ set(oneValueArgs)
+ set(multiValueArgs OPTIONS)
+
+ cmake_parse_arguments(_WRAP_UI "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+ set(ui_files ${_WRAP_UI_UNPARSED_ARGUMENTS})
+ set(ui_options ${_WRAP_UI_OPTIONS})
+
+ foreach(it ${ui_files})
+ get_filename_component(outfile ${it} NAME_WE)
+ get_filename_component(infile ${it} ABSOLUTE)
+ set(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h)
+ add_custom_command(OUTPUT ${outfile}
+ DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::uic
+ COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::uic
+ ARGS ${ui_options} -o ${outfile} ${infile}
+ MAIN_DEPENDENCY ${infile} VERBATIM)
+ set_source_files_properties(${infile} PROPERTIES SKIP_AUTOUIC ON)
+ set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOMOC ON)
+ set_source_files_properties(${outfile} PROPERTIES SKIP_AUTOUIC ON)
+ list(APPEND ${outfiles} ${outfile})
+ endforeach()
+ set(${outfiles} ${${outfiles}} PARENT_SCOPE)
+endfunction()
+
+# This will override the CMake upstream command, because that one is for Qt 3.
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_wrap_ui outfiles)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_wrap_ui("${outfiles}" ${ARGN})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_wrap_ui("${outfiles}" ${ARGN})
+ endif()
+ set("${outfiles}" "${${outfiles}}" PARENT_SCOPE)
+ endfunction()
+endif()
diff --git a/src/widgets/accessible/complexwidgets.cpp b/src/widgets/accessible/complexwidgets.cpp
index ce2ceac938..42074b63fb 100644
--- a/src/widgets/accessible/complexwidgets.cpp
+++ b/src/widgets/accessible/complexwidgets.cpp
@@ -57,7 +57,9 @@
#endif
#include <qstyle.h>
#include <qstyleoption.h>
+#if QT_CONFIG(tooltip)
#include <qtooltip.h>
+#endif
#if QT_CONFIG(whatsthis)
#include <qwhatsthis.h>
#endif
diff --git a/src/widgets/accessible/qaccessiblemenu.cpp b/src/widgets/accessible/qaccessiblemenu.cpp
index 99a9444ff1..de5196efb9 100644
--- a/src/widgets/accessible/qaccessiblemenu.cpp
+++ b/src/widgets/accessible/qaccessiblemenu.cpp
@@ -45,7 +45,7 @@
#if QT_CONFIG(menubar)
#include <qmenubar.h>
#endif
-#include <QtWidgets/QAction>
+#include <QtGui/QAction>
#include <qstyle.h>
#include <private/qwidget_p.h>
@@ -118,16 +118,19 @@ QAccessibleInterface *QAccessibleMenu::child(int index) const
QAccessibleInterface *QAccessibleMenu::parent() const
{
if (QAction *menuAction = menu()->menuAction()) {
- const QList<QWidget*> parentCandidates =
- QList<QWidget*>() << menu()->parentWidget() << menuAction->associatedWidgets();
- for (QWidget *w : parentCandidates) {
- if (qobject_cast<QMenu*>(w)
+ QVector<QObject*> parentCandidates;
+ const QVector<QObject*> associatedObjects = menuAction->associatedObjects();
+ parentCandidates.reserve(associatedObjects.size() + 1);
+ parentCandidates << menu()->parentWidget() << associatedObjects;
+ for (QObject *object : qAsConst(parentCandidates)) {
+ if (qobject_cast<QMenu*>(object)
#if QT_CONFIG(menubar)
- || qobject_cast<QMenuBar*>(w)
+ || qobject_cast<QMenuBar*>(object)
#endif
) {
- if (w->actions().indexOf(menuAction) != -1)
- return getOrCreateMenu(w, menuAction);
+ QWidget *widget = static_cast<QWidget*>(object);
+ if (widget->actions().indexOf(menuAction) != -1)
+ return getOrCreateMenu(widget, menuAction);
}
}
}
diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp
index 68ad855c7c..26341f805d 100644
--- a/src/widgets/accessible/qaccessiblewidget.cpp
+++ b/src/widgets/accessible/qaccessiblewidget.cpp
@@ -41,7 +41,6 @@
#ifndef QT_NO_ACCESSIBILITY
-#include "qaction.h"
#include "qapplication.h"
#if QT_CONFIG(groupbox)
#include "qgroupbox.h"
@@ -49,7 +48,9 @@
#if QT_CONFIG(label)
#include "qlabel.h"
#endif
+#if QT_CONFIG(tooltip)
#include "qtooltip.h"
+#endif
#if QT_CONFIG(whatsthis)
#include "qwhatsthis.h"
#endif
@@ -426,7 +427,7 @@ QString QAccessibleWidget::text(QAccessible::Text t) const
break;
case QAccessible::Description:
str = widget()->accessibleDescription();
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
if (str.isEmpty())
str = widget()->toolTip();
#endif
diff --git a/src/widgets/accessible/rangecontrols.cpp b/src/widgets/accessible/rangecontrols.cpp
index b5b8608418..6c12b553b4 100644
--- a/src/widgets/accessible/rangecontrols.cpp
+++ b/src/widgets/accessible/rangecontrols.cpp
@@ -254,7 +254,6 @@ QAccessibleSpinBox::QAccessibleSpinBox(QWidget *w)
{
Q_ASSERT(spinBox());
addControllingSignal(QLatin1String("valueChanged(int)"));
- addControllingSignal(QLatin1String("valueChanged(QString)"));
}
/*!
@@ -272,7 +271,6 @@ QAccessibleDoubleSpinBox::QAccessibleDoubleSpinBox(QWidget *widget)
{
Q_ASSERT(qobject_cast<QDoubleSpinBox *>(widget));
addControllingSignal(QLatin1String("valueChanged(double)"));
- addControllingSignal(QLatin1String("valueChanged(QString)"));
}
/*!
diff --git a/src/widgets/accessible/simplewidgets.cpp b/src/widgets/accessible/simplewidgets.cpp
index 107fd729fe..5b09143189 100644
--- a/src/widgets/accessible/simplewidgets.cpp
+++ b/src/widgets/accessible/simplewidgets.cpp
@@ -545,7 +545,7 @@ void *QAccessibleDisplay::interface_cast(QAccessible::InterfaceType t)
/*! \internal */
QString QAccessibleDisplay::imageDescription() const
{
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
return widget()->toolTip();
#else
return QString();
diff --git a/src/widgets/configure.cmake b/src/widgets/configure.cmake
new file mode 100644
index 0000000000..7c8f712889
--- /dev/null
+++ b/src/widgets/configure.cmake
@@ -0,0 +1,551 @@
+
+
+#### Inputs
+
+
+
+#### Libraries
+
+qt_find_package(GTK3 PROVIDED_TARGETS PkgConfig::GTK3)
+
+
+#### Tests
+
+
+
+#### Features
+
+qt_feature("gtk3" PRIVATE
+ LABEL "GTK+"
+ AUTODETECT NOT APPLE
+ CONDITION QT_FEATURE_glib AND GTK3_FOUND
+)
+qt_feature("style-fusion" PRIVATE
+ LABEL "Fusion"
+)
+qt_feature("style-mac" PRIVATE
+ LABEL "macOS"
+ CONDITION MACOS AND QT_FEATURE_animation
+)
+qt_feature("style-windows" PRIVATE
+ LABEL "Windows"
+)
+qt_feature("style-windowsvista" PRIVATE
+ LABEL "WindowsVista"
+ CONDITION QT_FEATURE_style_windows AND QT_FEATURE_animation AND WIN32 AND NOT WINRT
+)
+qt_feature("style-android" PRIVATE
+ LABEL "Android"
+ AUTODETECT ANDROID
+)
+qt_feature("style-stylesheet" PUBLIC
+ SECTION "Styles"
+ LABEL "QStyleSheetStyle"
+ PURPOSE "Provides a widget style which is configurable via CSS."
+ CONDITION QT_FEATURE_style_windows AND QT_FEATURE_properties AND QT_FEATURE_cssparser
+)
+qt_feature_definition("style-stylesheet" "QT_NO_STYLE_STYLESHEET" NEGATE VALUE "1")
+qt_feature("effects" PRIVATE
+ SECTION "Kernel"
+ LABEL "Effects"
+ PURPOSE "Provides special widget effects (e.g. fading and scrolling)."
+)
+qt_feature("filesystemmodel" PUBLIC
+ SECTION "File I/O"
+ LABEL "QFileSystemModel"
+ PURPOSE "Provides a data model for the local filesystem."
+ CONDITION QT_FEATURE_itemmodel
+)
+qt_feature_definition("filesystemmodel" "QT_NO_FILESYSTEMMODEL" NEGATE VALUE "1")
+qt_feature("itemviews" PUBLIC
+ SECTION "ItemViews"
+ LABEL "The Model/View Framework"
+ PURPOSE "Provides the model/view architecture managing the relationship between data and the way it is presented to the user."
+ CONDITION QT_FEATURE_itemmodel AND QT_FEATURE_scrollarea
+)
+qt_feature_definition("itemviews" "QT_NO_ITEMVIEWS" NEGATE VALUE "1")
+qt_feature("treewidget" PUBLIC
+ SECTION "Widgets"
+ LABEL "QTreeWidget"
+ PURPOSE "Provides views using tree models."
+ CONDITION QT_FEATURE_treeview
+)
+qt_feature_definition("treewidget" "QT_NO_TREEWIDGET" NEGATE VALUE "1")
+qt_feature("listwidget" PUBLIC
+ SECTION "Widgets"
+ LABEL "QListWidget"
+ PURPOSE "Provides item-based list widgets."
+ CONDITION QT_FEATURE_listview
+)
+qt_feature_definition("listwidget" "QT_NO_LISTWIDGET" NEGATE VALUE "1")
+qt_feature("tablewidget" PUBLIC
+ SECTION "Widgets"
+ LABEL "QTableWidget"
+ PURPOSE "Provides item-based table views."
+ CONDITION QT_FEATURE_tableview
+)
+qt_feature_definition("tablewidget" "QT_NO_TABLEWIDGET" NEGATE VALUE "1")
+qt_feature("abstractbutton" PUBLIC
+ SECTION "Widgets"
+ LABEL "QAbstractButton"
+ PURPOSE "Abstract base class of button widgets, providing functionality common to buttons."
+)
+qt_feature("commandlinkbutton" PUBLIC
+ SECTION "Widgets"
+ LABEL "QCommandLinkButton"
+ PURPOSE "Provides a Vista style command link button."
+ CONDITION QT_FEATURE_pushbutton
+)
+qt_feature("datetimeedit" PUBLIC
+ SECTION "Widgets"
+ LABEL "QDateTimeEdit"
+ PURPOSE "Supports editing dates and times."
+ CONDITION QT_FEATURE_calendarwidget AND QT_FEATURE_datestring AND QT_FEATURE_textdate AND QT_FEATURE_datetimeparser
+)
+qt_feature_definition("datetimeedit" "QT_NO_DATETIMEEDIT" NEGATE VALUE "1")
+qt_feature("stackedwidget" PUBLIC
+ SECTION "Widgets"
+ LABEL "QStackedWidget"
+ PURPOSE "Provides stacked widgets."
+)
+qt_feature_definition("stackedwidget" "QT_NO_STACKEDWIDGET" NEGATE VALUE "1")
+qt_feature("textbrowser" PUBLIC
+ SECTION "Widgets"
+ LABEL "QTextBrowser"
+ PURPOSE "Supports HTML document browsing."
+ CONDITION QT_FEATURE_textedit
+)
+qt_feature_definition("textbrowser" "QT_NO_TEXTBROWSER" NEGATE VALUE "1")
+qt_feature("splashscreen" PUBLIC
+ SECTION "Widgets"
+ LABEL "QSplashScreen"
+ PURPOSE "Supports splash screens that can be shown during application startup."
+)
+qt_feature_definition("splashscreen" "QT_NO_SPLASHSCREEN" NEGATE VALUE "1")
+qt_feature("splitter" PUBLIC
+ SECTION "Widgets"
+ LABEL "QSplitter"
+ PURPOSE "Provides user controlled splitter widgets."
+)
+qt_feature_definition("splitter" "QT_NO_SPLITTER" NEGATE VALUE "1")
+qt_feature("widgettextcontrol" PRIVATE
+ SECTION "Widgets"
+ LABEL "QWidgetTextControl"
+ PURPOSE "Provides text control functionality to other widgets."
+)
+qt_feature("label" PUBLIC
+ SECTION "Widgets"
+ LABEL "QLabel"
+ PURPOSE "Provides a text or image display."
+ CONDITION QT_FEATURE_widgettextcontrol
+)
+qt_feature("formlayout" PUBLIC
+ SECTION "Widgets"
+ LABEL "QFormLayout"
+ PURPOSE "Manages forms of input widgets and their associated labels."
+ CONDITION QT_FEATURE_label
+)
+qt_feature("lcdnumber" PUBLIC
+ SECTION "Widgets"
+ LABEL "QLCDNumber"
+ PURPOSE "Provides LCD-like digits."
+)
+qt_feature_definition("lcdnumber" "QT_NO_LCDNUMBER" NEGATE VALUE "1")
+qt_feature("menu" PUBLIC
+ SECTION "Widgets"
+ LABEL "QMenu"
+ PURPOSE "Provides popup-menus."
+ CONDITION QT_FEATURE_action AND QT_FEATURE_pushbutton
+)
+qt_feature_definition("menu" "QT_NO_MENU" NEGATE VALUE "1")
+qt_feature("lineedit" PUBLIC
+ SECTION "Widgets"
+ LABEL "QLineEdit"
+ PURPOSE "Provides single-line edits."
+ CONDITION QT_FEATURE_widgettextcontrol
+)
+qt_feature_definition("lineedit" "QT_NO_LINEEDIT" NEGATE VALUE "1")
+qt_feature("radiobutton" PUBLIC
+ SECTION "Widgets"
+ LABEL "QRadioButton"
+ PURPOSE "Provides a radio button with a text label."
+ CONDITION QT_FEATURE_abstractbutton
+)
+qt_feature("spinbox" PUBLIC
+ SECTION "Widgets"
+ LABEL "QSpinBox"
+ PURPOSE "Provides spin boxes handling integers and discrete sets of values."
+ CONDITION QT_FEATURE_lineedit AND QT_FEATURE_validator
+)
+qt_feature_definition("spinbox" "QT_NO_SPINBOX" NEGATE VALUE "1")
+qt_feature("tabbar" PUBLIC
+ SECTION "Widgets"
+ LABEL "QTabBar"
+ PURPOSE "Provides tab bars, e.g., for use in tabbed dialogs."
+ CONDITION QT_FEATURE_toolbutton
+)
+qt_feature_definition("tabbar" "QT_NO_TABBAR" NEGATE VALUE "1")
+qt_feature("tabwidget" PUBLIC
+ SECTION "Widgets"
+ LABEL "QTabWidget"
+ PURPOSE "Supports stacking tabbed widgets."
+ CONDITION QT_FEATURE_tabbar AND QT_FEATURE_stackedwidget
+)
+qt_feature_definition("tabwidget" "QT_NO_TABWIDGET" NEGATE VALUE "1")
+qt_feature("combobox" PUBLIC
+ SECTION "Widgets"
+ LABEL "QComboBox"
+ PURPOSE "Provides drop-down boxes presenting a list of options to the user."
+ CONDITION QT_FEATURE_lineedit AND QT_FEATURE_standarditemmodel AND QT_FEATURE_listview
+)
+qt_feature_definition("combobox" "QT_NO_COMBOBOX" NEGATE VALUE "1")
+qt_feature("fontcombobox" PUBLIC
+ SECTION "Widgets"
+ LABEL "QFontComboBox"
+ PURPOSE "Provides a combobox that lets the user select a font family."
+ CONDITION QT_FEATURE_combobox AND QT_FEATURE_stringlistmodel
+)
+qt_feature_definition("fontcombobox" "QT_NO_FONTCOMBOBOX" NEGATE VALUE "1")
+qt_feature("checkbox" PUBLIC
+ SECTION "Widgets"
+ LABEL "QCheckBox("
+ PURPOSE "Provides a checkbox with a text label."
+ CONDITION QT_FEATURE_abstractbutton
+)
+qt_feature("pushbutton" PUBLIC
+ SECTION "Widgets"
+ LABEL "QPushButton"
+ PURPOSE "Provides a command button."
+ CONDITION QT_FEATURE_abstractbutton AND QT_FEATURE_action
+)
+qt_feature("toolbutton" PUBLIC
+ SECTION "Widgets"
+ LABEL "QToolButton"
+ PURPOSE "Provides quick-access buttons to commands and options."
+ CONDITION QT_FEATURE_abstractbutton AND QT_FEATURE_action
+)
+qt_feature_definition("toolbutton" "QT_NO_TOOLBUTTON" NEGATE VALUE "1")
+qt_feature("toolbar" PUBLIC
+ SECTION "Widgets"
+ LABEL "QToolBar"
+ PURPOSE "Provides movable panels containing a set of controls."
+ CONDITION QT_FEATURE_mainwindow
+)
+qt_feature_definition("toolbar" "QT_NO_TOOLBAR" NEGATE VALUE "1")
+qt_feature("toolbox" PUBLIC
+ SECTION "Widgets"
+ LABEL "QToolBox"
+ PURPOSE "Provides columns of tabbed widget items."
+ CONDITION QT_FEATURE_toolbutton AND QT_FEATURE_scrollarea
+)
+qt_feature_definition("toolbox" "QT_NO_TOOLBOX" NEGATE VALUE "1")
+qt_feature("groupbox" PUBLIC
+ SECTION "Widgets"
+ LABEL "QGroupBox"
+ PURPOSE "Provides widget grouping boxes with frames."
+)
+qt_feature_definition("groupbox" "QT_NO_GROUPBOX" NEGATE VALUE "1")
+qt_feature("buttongroup" PUBLIC
+ SECTION "Widgets"
+ LABEL "QButtonGroup"
+ PURPOSE "Supports organizing groups of button widgets."
+ CONDITION QT_FEATURE_abstractbutton AND QT_FEATURE_groupbox
+)
+qt_feature_definition("buttongroup" "QT_NO_BUTTONGROUP" NEGATE VALUE "1")
+qt_feature("mainwindow" PUBLIC
+ SECTION "Widgets"
+ LABEL "QMainWindow"
+ PURPOSE "Provides main application windows."
+ CONDITION QT_FEATURE_menu AND QT_FEATURE_resizehandler AND QT_FEATURE_toolbutton
+)
+qt_feature_definition("mainwindow" "QT_NO_MAINWINDOW" NEGATE VALUE "1")
+qt_feature("dockwidget" PUBLIC
+ SECTION "Widgets"
+ LABEL "QDockwidget"
+ PURPOSE "Supports docking widgets inside a QMainWindow or floated as a top-level window on the desktop."
+ CONDITION QT_FEATURE_mainwindow
+)
+qt_feature_definition("dockwidget" "QT_NO_DOCKWIDGET" NEGATE VALUE "1")
+qt_feature("mdiarea" PUBLIC
+ SECTION "Widgets"
+ LABEL "QMdiArea"
+ PURPOSE "Provides an area in which MDI windows are displayed."
+ CONDITION QT_FEATURE_scrollarea
+)
+qt_feature_definition("mdiarea" "QT_NO_MDIAREA" NEGATE VALUE "1")
+qt_feature("resizehandler" PUBLIC
+ SECTION "Widgets"
+ LABEL "QWidgetResizeHandler"
+ PURPOSE "Provides an internal resize handler for dock widgets."
+)
+qt_feature_definition("resizehandler" "QT_NO_RESIZEHANDLER" NEGATE VALUE "1")
+qt_feature("statusbar" PUBLIC
+ SECTION "Widgets"
+ LABEL "QStatusBar"
+ PURPOSE "Supports presentation of status information."
+)
+qt_feature_definition("statusbar" "QT_NO_STATUSBAR" NEGATE VALUE "1")
+qt_feature("menubar" PUBLIC
+ SECTION "Widgets"
+ LABEL "QMenuBar"
+ PURPOSE "Provides pull-down menu items."
+ CONDITION QT_FEATURE_menu AND QT_FEATURE_toolbutton
+)
+qt_feature_definition("menubar" "QT_NO_MENUBAR" NEGATE VALUE "1")
+qt_feature("contextmenu" PUBLIC
+ SECTION "Widgets"
+ LABEL "Context menus"
+ PURPOSE "Adds pop-up menus on right mouse click to numerous widgets."
+ CONDITION QT_FEATURE_menu
+)
+qt_feature_definition("contextmenu" "QT_NO_CONTEXTMENU" NEGATE VALUE "1")
+qt_feature("progressbar" PUBLIC
+ SECTION "Widgets"
+ LABEL "QProgressBar"
+ PURPOSE "Supports presentation of operation progress."
+)
+qt_feature_definition("progressbar" "QT_NO_PROGRESSBAR" NEGATE VALUE "1")
+qt_feature("abstractslider" PUBLIC
+ SECTION "Widgets"
+ LABEL "QAbstractSlider"
+ PURPOSE "Common super class for widgets like QScrollBar, QSlider and QDial."
+)
+qt_feature("slider" PUBLIC
+ SECTION "Widgets"
+ LABEL "QSlider"
+ PURPOSE "Provides sliders controlling a bounded value."
+ CONDITION QT_FEATURE_abstractslider
+)
+qt_feature_definition("slider" "QT_NO_SLIDER" NEGATE VALUE "1")
+qt_feature("scrollbar" PUBLIC
+ SECTION "Widgets"
+ LABEL "QScrollBar"
+ PURPOSE "Provides scrollbars allowing the user access parts of a document that is larger than the widget used to display it."
+ CONDITION QT_FEATURE_slider
+)
+qt_feature_definition("scrollbar" "QT_NO_SCROLLBAR" NEGATE VALUE "1")
+qt_feature("dial" PUBLIC
+ SECTION "Widgets"
+ LABEL "QDial"
+ PURPOSE "Provides a rounded range control, e.g., like a speedometer."
+ CONDITION QT_FEATURE_slider
+)
+qt_feature_definition("dial" "QT_NO_DIAL" NEGATE VALUE "1")
+qt_feature("scrollarea" PUBLIC
+ SECTION "Widgets"
+ LABEL "QScrollArea"
+ PURPOSE "Supports scrolling views onto widgets."
+ CONDITION QT_FEATURE_scrollbar
+)
+qt_feature_definition("scrollarea" "QT_NO_SCROLLAREA" NEGATE VALUE "1")
+qt_feature("scroller" PUBLIC
+ SECTION "Widgets"
+ LABEL "QScroller"
+ PURPOSE "Enables kinetic scrolling for any scrolling widget or graphics item."
+ CONDITION QT_FEATURE_easingcurve
+)
+qt_feature("graphicsview" PUBLIC
+ SECTION "Widgets"
+ LABEL "QGraphicsView"
+ PURPOSE "Provides a canvas/sprite framework."
+ CONDITION QT_FEATURE_scrollarea AND QT_FEATURE_widgettextcontrol
+)
+qt_feature_definition("graphicsview" "QT_NO_GRAPHICSVIEW" NEGATE VALUE "1")
+qt_feature("graphicseffect" PUBLIC
+ SECTION "Widgets"
+ LABEL "QGraphicsEffect"
+ PURPOSE "Provides various graphics effects."
+ CONDITION QT_FEATURE_graphicsview
+)
+qt_feature_definition("graphicseffect" "QT_NO_GRAPHICSEFFECT" NEGATE VALUE "1")
+qt_feature("textedit" PUBLIC
+ SECTION "Widgets"
+ LABEL "QTextEdit"
+ PURPOSE "Supports rich text editing."
+ CONDITION QT_FEATURE_scrollarea AND QT_FEATURE_properties AND QT_FEATURE_widgettextcontrol
+)
+qt_feature_definition("textedit" "QT_NO_TEXTEDIT" NEGATE VALUE "1")
+qt_feature("syntaxhighlighter" PUBLIC
+ SECTION "Widgets"
+ LABEL "QSyntaxHighlighter"
+ PURPOSE "Supports custom syntax highlighting."
+ CONDITION QT_FEATURE_textedit
+)
+qt_feature_definition("syntaxhighlighter" "QT_NO_SYNTAXHIGHLIGHTER" NEGATE VALUE "1")
+qt_feature("rubberband" PUBLIC
+ SECTION "Widgets"
+ LABEL "QRubberBand"
+ PURPOSE "Supports using rubberbands to indicate selections and boundaries."
+)
+qt_feature_definition("rubberband" "QT_NO_RUBBERBAND" NEGATE VALUE "1")
+qt_feature("tooltip" PUBLIC
+ SECTION "Widgets"
+ LABEL "QToolTip"
+ PURPOSE "Supports presentation of tooltips."
+ CONDITION QT_FEATURE_label
+)
+qt_feature_definition("tooltip" "QT_NO_TOOLTIP" NEGATE VALUE "1")
+qt_feature("statustip" PUBLIC
+ SECTION "Widgets"
+ LABEL "Status Tip"
+ PURPOSE "Supports status tip functionality and events."
+)
+qt_feature_definition("statustip" "QT_NO_STATUSTIP" NEGATE VALUE "1")
+qt_feature("sizegrip" PUBLIC
+ SECTION "Widgets"
+ LABEL "QSizeGrip"
+ PURPOSE "Provides corner-grips for resizing top-level windows."
+)
+qt_feature_definition("sizegrip" "QT_NO_SIZEGRIP" NEGATE VALUE "1")
+qt_feature("calendarwidget" PUBLIC
+ SECTION "Widgets"
+ LABEL "QCalendarWidget"
+ PURPOSE "Provides a monthly based calendar widget allowing the user to select a date."
+ CONDITION ( QT_FEATURE_label ) AND ( QT_FEATURE_menu ) AND ( QT_FEATURE_pushbutton ) AND ( QT_FEATURE_spinbox ) AND ( QT_FEATURE_tableview ) AND ( QT_FEATURE_textdate ) AND ( QT_FEATURE_toolbutton )
+)
+qt_feature_definition("calendarwidget" "QT_NO_CALENDARWIDGET" NEGATE VALUE "1")
+qt_feature("keysequenceedit" PUBLIC
+ SECTION "Widgets"
+ LABEL "QKeySequenceEdit"
+ PURPOSE "Provides a widget for editing QKeySequences."
+ CONDITION QT_FEATURE_lineedit AND QT_FEATURE_shortcut
+)
+qt_feature_definition("keysequenceedit" "QT_NO_KEYSEQUENCEEDIT" NEGATE VALUE "1")
+qt_feature("dialog" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QDialog"
+ PURPOSE "Base class of dialog windows."
+)
+qt_feature("dialogbuttonbox" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QDialogButtonBox"
+ PURPOSE "Presents buttons in a layout that is appropriate for the current widget style."
+ CONDITION QT_FEATURE_dialog AND QT_FEATURE_pushbutton
+)
+qt_feature("messagebox" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QMessageBox"
+ PURPOSE "Provides message boxes displaying informative messages and simple questions."
+ CONDITION ( QT_FEATURE_checkbox ) AND ( QT_FEATURE_dialog ) AND ( QT_FEATURE_dialogbuttonbox ) AND ( QT_FEATURE_label ) AND ( QT_FEATURE_pushbutton )
+)
+qt_feature_definition("messagebox" "QT_NO_MESSAGEBOX" NEGATE VALUE "1")
+qt_feature("colordialog" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QColorDialog"
+ PURPOSE "Provides a dialog widget for specifying colors."
+ CONDITION ( QT_FEATURE_dialog ) AND ( QT_FEATURE_dialogbuttonbox ) AND ( QT_FEATURE_label ) AND ( QT_FEATURE_pushbutton ) AND ( QT_FEATURE_spinbox )
+)
+qt_feature_definition("colordialog" "QT_NO_COLORDIALOG" NEGATE VALUE "1")
+qt_feature("filedialog" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QFileDialog"
+ PURPOSE "Provides a dialog widget for selecting files or directories."
+ CONDITION ( QT_FEATURE_buttongroup ) AND ( QT_FEATURE_combobox ) AND ( QT_FEATURE_dialog ) AND ( QT_FEATURE_dialogbuttonbox ) AND ( QT_FEATURE_dirmodel ) AND ( QT_FEATURE_label ) AND ( QT_FEATURE_proxymodel ) AND ( QT_FEATURE_splitter ) AND ( QT_FEATURE_stackedwidget ) AND ( QT_FEATURE_treeview ) AND ( QT_FEATURE_toolbutton )
+)
+qt_feature_definition("filedialog" "QT_NO_FILEDIALOG" NEGATE VALUE "1")
+qt_feature("fontdialog" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QFontDialog"
+ PURPOSE "Provides a dialog widget for selecting fonts."
+ CONDITION ( QT_FEATURE_checkbox ) AND ( QT_FEATURE_combobox ) AND ( QT_FEATURE_dialog ) AND ( QT_FEATURE_dialogbuttonbox ) AND ( QT_FEATURE_groupbox ) AND ( QT_FEATURE_label ) AND ( QT_FEATURE_pushbutton ) AND ( QT_FEATURE_stringlistmodel ) AND ( QT_FEATURE_validator )
+)
+qt_feature_definition("fontdialog" "QT_NO_FONTDIALOG" NEGATE VALUE "1")
+qt_feature("progressdialog" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QProgressDialog"
+ PURPOSE "Provides feedback on the progress of a slow operation."
+ CONDITION ( QT_FEATURE_dialog ) AND ( QT_FEATURE_label ) AND ( QT_FEATURE_pushbutton ) AND ( QT_FEATURE_progressbar )
+)
+qt_feature_definition("progressdialog" "QT_NO_PROGRESSDIALOG" NEGATE VALUE "1")
+qt_feature("inputdialog" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QInputDialog"
+ PURPOSE "Provides a simple convenience dialog to get a single value from the user."
+ CONDITION ( QT_FEATURE_combobox ) AND ( QT_FEATURE_dialog ) AND ( QT_FEATURE_dialogbuttonbox ) AND ( QT_FEATURE_label ) AND ( QT_FEATURE_pushbutton ) AND ( QT_FEATURE_spinbox ) AND ( QT_FEATURE_stackedwidget ) AND ( QT_FEATURE_textedit )
+)
+qt_feature_definition("inputdialog" "QT_NO_INPUTDIALOG" NEGATE VALUE "1")
+qt_feature("errormessage" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QErrorMessage"
+ PURPOSE "Provides an error message display dialog."
+ CONDITION ( QT_FEATURE_checkbox ) AND ( QT_FEATURE_dialog ) AND ( QT_FEATURE_textedit ) AND ( QT_FEATURE_label ) AND ( QT_FEATURE_pushbutton ) AND ( QT_FEATURE_textedit )
+)
+qt_feature_definition("errormessage" "QT_NO_ERRORMESSAGE" NEGATE VALUE "1")
+qt_feature("wizard" PUBLIC
+ SECTION "Dialogs"
+ LABEL "QWizard"
+ PURPOSE "Provides a framework for multi-page click-through dialogs."
+ CONDITION ( QT_FEATURE_dialog ) AND ( QT_FEATURE_pushbutton ) AND ( QT_FEATURE_properties ) AND ( QT_FEATURE_label )
+)
+qt_feature_definition("wizard" "QT_NO_WIZARD" NEGATE VALUE "1")
+qt_feature("dirmodel" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QDirModel"
+ PURPOSE "Provides a data model for the local filesystem."
+ CONDITION QT_FEATURE_itemviews AND QT_FEATURE_filesystemmodel
+)
+qt_feature_definition("dirmodel" "QT_NO_DIRMODEL" NEGATE VALUE "1")
+qt_feature("listview" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QListView"
+ PURPOSE "Provides a list or icon view onto a model."
+ CONDITION QT_FEATURE_itemviews
+)
+qt_feature_definition("listview" "QT_NO_LISTVIEW" NEGATE VALUE "1")
+qt_feature("tableview" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QTableView"
+ PURPOSE "Provides a default model/view implementation of a table view."
+ CONDITION QT_FEATURE_itemviews
+)
+qt_feature_definition("tableview" "QT_NO_TABLEVIEW" NEGATE VALUE "1")
+qt_feature("treeview" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QTreeView"
+ PURPOSE "Provides a default model/view implementation of a tree view."
+ CONDITION QT_FEATURE_itemviews
+)
+qt_feature_definition("treeview" "QT_NO_TREEVIEW" NEGATE VALUE "1")
+qt_feature("datawidgetmapper" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QDataWidgetMapper"
+ PURPOSE "Provides mapping between a section of a data model to widgets."
+ CONDITION QT_FEATURE_itemviews AND QT_FEATURE_properties
+)
+qt_feature_definition("datawidgetmapper" "QT_NO_DATAWIDGETMAPPER" NEGATE VALUE "1")
+qt_feature("columnview" PUBLIC
+ SECTION "ItemViews"
+ LABEL "QColumnView"
+ PURPOSE "Provides a model/view implementation of a column view."
+ CONDITION QT_FEATURE_listview
+)
+qt_feature_definition("columnview" "QT_NO_COLUMNVIEW" NEGATE VALUE "1")
+qt_feature("completer" PUBLIC
+ SECTION "Utilities"
+ LABEL "QCompleter"
+ PURPOSE "Provides completions based on an item model."
+ CONDITION QT_FEATURE_proxymodel AND QT_FEATURE_itemviews
+)
+qt_feature_definition("completer" "QT_NO_COMPLETER" NEGATE VALUE "1")
+qt_feature("fscompleter" PUBLIC
+ SECTION "Utilities"
+ LABEL "QFSCompleter"
+ PURPOSE "Provides file name completion in QFileDialog."
+ CONDITION QT_FEATURE_filesystemmodel AND QT_FEATURE_completer
+)
+qt_feature_definition("fscompleter" "QT_NO_FSCOMPLETER" NEGATE VALUE "1")
+qt_feature("undoview" PUBLIC
+ SECTION "Utilities"
+ LABEL "QUndoView"
+ PURPOSE "Provides a widget which shows the contents of an undo stack."
+ CONDITION QT_FEATURE_undostack AND QT_FEATURE_listview
+)
+qt_feature_definition("undoview" "QT_NO_UNDOVIEW" NEGATE VALUE "1")
+qt_configure_add_summary_section(NAME "Qt Widgets")
+qt_configure_add_summary_entry(ARGS "gtk3")
+qt_configure_add_summary_entry(
+ TYPE "featureList"
+ ARGS "style-fusion style-mac style-windows style-windowsvista style-android"
+ MESSAGE "Styles"
+)
+qt_configure_end_summary_section() # end of "Qt Widgets" section
diff --git a/src/widgets/configure.json b/src/widgets/configure.json
index 0a68f082a2..6634ca0059 100644
--- a/src/widgets/configure.json
+++ b/src/widgets/configure.json
@@ -26,14 +26,6 @@
}
},
- "tests": {
- "uxtheme": {
- "label": "uxtheme.h",
- "type": "files",
- "files": [ "uxtheme.h" ]
- }
- },
-
"features": {
"gtk3": {
"label": "GTK+",
@@ -56,7 +48,7 @@
},
"style-windowsvista": {
"label": "WindowsVista",
- "condition": "features.style-windows && features.animation && config.win32 && !config.winrt && tests.uxtheme",
+ "condition": "features.style-windows && features.animation && config.win32 && !config.winrt",
"output": [ "privateFeature", "styles" ]
},
"style-android": {
@@ -641,26 +633,6 @@
"condition": "features.filesystemmodel && features.completer",
"output": [ "publicFeature", "feature" ]
},
- "undocommand": {
- "label": "QUndoCommand",
- "purpose": "Applies (redo or) undo of a single change in a document.",
- "section": "Utilities",
- "output": [ "publicFeature", "feature" ]
- },
- "undostack": {
- "label": "QUndoStack",
- "purpose": "Provides the ability to (redo or) undo a list of changes in a document.",
- "section": "Utilities",
- "condition": "features.undocommand",
- "output": [ "publicFeature", "feature" ]
- },
- "undogroup": {
- "label": "QUndoGroup",
- "purpose": "Provides the ability to cluster QUndoCommands.",
- "section": "Utilities",
- "condition": "features.undostack",
- "output": [ "publicFeature", "feature" ]
- },
"undoview": {
"label": "QUndoView",
"purpose": "Provides a widget which shows the contents of an undo stack.",
diff --git a/src/widgets/dialogs/qcolordialog.cpp b/src/widgets/dialogs/qcolordialog.cpp
index 4247731275..2d1bfa65d3 100644
--- a/src/widgets/dialogs/qcolordialog.cpp
+++ b/src/widgets/dialogs/qcolordialog.cpp
@@ -59,8 +59,6 @@
#include "qpushbutton.h"
#if QT_CONFIG(regularexpression)
#include <qregularexpression.h>
-#else
-#include <qregexp.h>
#endif
#if QT_CONFIG(settings)
#include "qsettings.h"
@@ -1314,10 +1312,6 @@ QColorShower::QColorShower(QColorDialog *parent)
QRegularExpression regExp(QStringLiteral("#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})"));
QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this);
htEd->setValidator(validator);
-#elif !defined(QT_NO_REGEXP)
- QRegExp regExp(QStringLiteral("#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})"));
- QRegExpValidator *validator = new QRegExpValidator(regExp, this);
- htEd->setValidator(validator);
#else
htEd->setReadOnly(true);
#endif
@@ -2173,34 +2167,6 @@ QColor QColorDialog::getColor(const QColor &initial, QWidget *parent, const QStr
return dlg.selectedColor();
}
-#if QT_DEPRECATED_SINCE(5, 12)
-/*!
- \obsolete
-
- Pops up a modal color dialog to allow the user to choose a color
- and an alpha channel (transparency) value. The color+alpha is
- initially set to \a initial. The dialog is a child of \a parent.
-
- If \a ok is non-null, \e {*ok} is set to true if the user clicked
- \uicontrol{OK}, and to false if the user clicked Cancel.
-
- If the user clicks Cancel, the \a initial value is returned.
-
- Use QColorDialog::getColor() instead, passing the
- QColorDialog::ShowAlphaChannel option.
-*/
-
-QRgb QColorDialog::getRgba(QRgb initial, bool *ok, QWidget *parent)
-{
- const QColor color = getColor(QColor::fromRgba(initial), parent, QString(),
- ShowAlphaChannel);
- QRgb result = color.isValid() ? color.rgba() : initial;
- if (ok)
- *ok = color.isValid();
- return result;
-}
-#endif
-
/*!
Destroys the color dialog.
*/
diff --git a/src/widgets/dialogs/qcolordialog.h b/src/widgets/dialogs/qcolordialog.h
index cdbe0e7fb4..271c25f2dc 100644
--- a/src/widgets/dialogs/qcolordialog.h
+++ b/src/widgets/dialogs/qcolordialog.h
@@ -92,10 +92,6 @@ public:
const QString &title = QString(),
ColorDialogOptions options = ColorDialogOptions());
-#if QT_DEPRECATED_SINCE(5, 12)
- QT_DEPRECATED_X("Use getColor()") static QRgb getRgba(QRgb rgba = 0xffffffff, bool *ok = nullptr, QWidget *parent = nullptr);
-#endif
-
static int customCount();
static QColor customColor(int index);
static void setCustomColor(int index, QColor color);
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp
index 906022a185..d5daedef3e 100644
--- a/src/widgets/dialogs/qdialog.cpp
+++ b/src/widgets/dialogs/qdialog.cpp
@@ -785,12 +785,6 @@ void QDialog::setVisible(bool visible)
return;
QWidget::setVisible(visible);
-#if QT_DEPRECATED_SINCE(5, 13)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- showExtension(d->doShowExtension);
-QT_WARNING_POP
-#endif
QWidget *fw = window()->focusWidget();
if (!fw)
fw = this;
@@ -957,153 +951,6 @@ void QDialog::adjustPosition(QWidget* w)
move(p);
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \obsolete
-
- If \a orientation is Qt::Horizontal, the extension will be displayed
- to the right of the dialog's main area. If \a orientation is
- Qt::Vertical, the extension will be displayed below the dialog's main
- area.
-
- Instead of using this functionality, we recommend that you simply call
- show() or hide() on the part of the dialog that you want to use as an
- extension. See the \l{Extension Example} for details.
-
- \sa setExtension()
-*/
-void QDialog::setOrientation(Qt::Orientation orientation)
-{
- Q_D(QDialog);
- d->orientation = orientation;
-}
-
-/*!
- \obsolete
-
- Returns the dialog's extension orientation.
-
- Instead of using this functionality, we recommend that you simply call
- show() or hide() on the part of the dialog that you want to use as an
- extension. See the \l{Extension Example} for details.
-
- \sa extension()
-*/
-Qt::Orientation QDialog::orientation() const
-{
- Q_D(const QDialog);
- return d->orientation;
-}
-
-/*!
- \obsolete
-
- Sets the widget, \a extension, to be the dialog's extension,
- deleting any previous extension. The dialog takes ownership of the
- extension. Note that if \nullptr is passed, any existing extension will be
- deleted. This function must only be called while the dialog is hidden.
-
- Instead of using this functionality, we recommend that you simply call
- show() or hide() on the part of the dialog that you want to use as an
- extension. See the \l{Extension Example} for details.
-
- \sa showExtension(), setOrientation()
-*/
-void QDialog::setExtension(QWidget* extension)
-{
- Q_D(QDialog);
- delete d->extension;
- d->extension = extension;
-
- if (!extension)
- return;
-
- if (extension->parentWidget() != this)
- extension->setParent(this);
- extension->hide();
-}
-
-/*!
- \obsolete
-
- Returns the dialog's extension or \nullptr if no extension has been
- defined.
-
- Instead of using this functionality, we recommend that you simply call
- show() or hide() on the part of the dialog that you want to use as an
- extension. See the \l{Extension Example} for details.
-
- \sa showExtension(), setOrientation()
-*/
-QWidget* QDialog::extension() const
-{
- Q_D(const QDialog);
- return d->extension;
-}
-
-
-/*!
- \obsolete
-
- If \a showIt is true, the dialog's extension is shown; otherwise the
- extension is hidden.
-
- Instead of using this functionality, we recommend that you simply call
- show() or hide() on the part of the dialog that you want to use as an
- extension. See the \l{Extension Example} for details.
-
- \sa show(), setExtension(), setOrientation()
-*/
-void QDialog::showExtension(bool showIt)
-{
- Q_D(QDialog);
- d->doShowExtension = showIt;
- if (!d->extension)
- return;
- if (!testAttribute(Qt::WA_WState_Visible))
- return;
- if (d->extension->isVisible() == showIt)
- return;
-
- if (showIt) {
- d->size = size();
- d->min = minimumSize();
- d->max = maximumSize();
- if (layout())
- layout()->setEnabled(false);
- QSize s(d->extension->sizeHint()
- .expandedTo(d->extension->minimumSize())
- .boundedTo(d->extension->maximumSize()));
- if (d->orientation == Qt::Horizontal) {
- int h = qMax(height(), s.height());
- d->extension->setGeometry(width(), 0, s.width(), h);
- setFixedSize(width() + s.width(), h);
- } else {
- int w = qMax(width(), s.width());
- d->extension->setGeometry(0, height(), w, s.height());
- setFixedSize(w, height() + s.height());
- }
- d->extension->show();
-#if QT_CONFIG(sizegrip)
- const bool sizeGripEnabled = isSizeGripEnabled();
- setSizeGripEnabled(false);
- d->sizeGripEnabled = sizeGripEnabled;
-#endif
- } else {
- d->extension->hide();
- // workaround for CDE window manager that won't shrink with (-1,-1)
- setMinimumSize(d->min.expandedTo(QSize(1, 1)));
- setMaximumSize(d->max);
- resize(d->size);
- if (layout())
- layout()->setEnabled(true);
-#if QT_CONFIG(sizegrip)
- setSizeGripEnabled(d->sizeGripEnabled);
-#endif
- }
-}
-#endif
-
/*! \reimp */
QSize QDialog::sizeHint() const
{
diff --git a/src/widgets/dialogs/qdialog.h b/src/widgets/dialogs/qdialog.h
index ce2194a1de..8c50642a64 100644
--- a/src/widgets/dialogs/qdialog.h
+++ b/src/widgets/dialogs/qdialog.h
@@ -69,13 +69,6 @@ public:
void setVisible(bool visible) override;
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use show/hide on the affected widget instead") void setOrientation(Qt::Orientation orientation);
- QT_DEPRECATED_X("Use show/hide on the affected widget instead") Qt::Orientation orientation() const;
- QT_DEPRECATED_X("Use show/hide on the affected widget instead") void setExtension(QWidget* extension);
- QT_DEPRECATED_X("Use show/hide on the affected widget instead") QWidget* extension() const;
-#endif
-
QSize sizeHint() const override;
QSize minimumSizeHint() const override;
@@ -97,10 +90,6 @@ public Q_SLOTS:
virtual void accept();
virtual void reject();
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use show/hide on the affected widget instead") void showExtension(bool);
-#endif
-
protected:
QDialog(QDialogPrivate &, QWidget *parent, Qt::WindowFlags f = Qt::WindowFlags());
diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp
index bace311924..5b4d861b8d 100644
--- a/src/widgets/dialogs/qfiledialog.cpp
+++ b/src/widgets/dialogs/qfiledialog.cpp
@@ -48,8 +48,11 @@
#include <private/qguiapplication_p.h>
#include <qfontmetrics.h>
#include <qaction.h>
+#include <qactiongroup.h>
#include <qheaderview.h>
-#include <qshortcut.h>
+#if QT_CONFIG(shortcut)
+# include <qshortcut.h>
+#endif
#include <qgridlayout.h>
#if QT_CONFIG(menu)
#include <qmenu.h>
@@ -65,6 +68,9 @@
#if QT_CONFIG(mimetype)
#include <qmimedatabase.h>
#endif
+#if QT_CONFIG(regularexpression)
+#include <qregularexpression.h>
+#endif
#include <qapplication.h>
#include <qstylepainter.h>
#include "ui_qfiledialog.h"
@@ -344,7 +350,9 @@ Q_GLOBAL_STATIC(QUrl, lastVisitedDir)
QT_BEGIN_INCLUDE_NAMESPACE
#include <QMetaEnum>
-#include <qshortcut.h>
+#if QT_CONFIG(shortcut)
+# include <qshortcut.h>
+#endif
QT_END_INCLUDE_NAMESPACE
/*!
@@ -1378,48 +1386,27 @@ void QFileDialog::setNameFilter(const QString &filter)
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \property QFileDialog::nameFilterDetailsVisible
- \obsolete
- \brief This property holds whether the filter details is shown or not.
- \since 4.4
-
- When this property is \c true (the default), the filter details are shown
- in the combo box. When the property is set to false, these are hidden.
-
- Use setOption(HideNameFilterDetails, !\e enabled) or
- !testOption(HideNameFilterDetails).
-*/
-void QFileDialog::setNameFilterDetailsVisible(bool enabled)
-{
- setOption(HideNameFilterDetails, !enabled);
-}
-
-bool QFileDialog::isNameFilterDetailsVisible() const
-{
- return !testOption(HideNameFilterDetails);
-}
-#endif
-
-
/*
Strip the filters by removing the details, e.g. (*.*).
*/
QStringList qt_strip_filters(const QStringList &filters)
{
+#if QT_CONFIG(regularexpression)
QStringList strippedFilters;
- QRegExp r(QString::fromLatin1(QPlatformFileDialogHelper::filterRegExp));
+ QRegularExpression r(QString::fromLatin1(QPlatformFileDialogHelper::filterRegExp));
const int numFilters = filters.count();
strippedFilters.reserve(numFilters);
for (int i = 0; i < numFilters; ++i) {
QString filterName;
- int index = r.indexIn(filters[i]);
- if (index >= 0)
- filterName = r.cap(1);
+ auto match = r.match(filters[i]);
+ if (match.hasMatch())
+ filterName = match.captured(1);
strippedFilters.append(filterName.simplified());
}
return strippedFilters;
+#else
+ return filters;
+#endif
}
@@ -1886,68 +1873,6 @@ QFileDialog::AcceptMode QFileDialog::acceptMode() const
return static_cast<AcceptMode>(d->options->acceptMode());
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \property QFileDialog::readOnly
- \obsolete
- \brief Whether the filedialog is read-only
-
- If this property is set to false, the file dialog will allow renaming,
- and deleting of files and directories and creating directories.
-
- Use setOption(ReadOnly, \e enabled) or testOption(ReadOnly) instead.
-*/
-void QFileDialog::setReadOnly(bool enabled)
-{
- setOption(ReadOnly, enabled);
-}
-
-bool QFileDialog::isReadOnly() const
-{
- return testOption(ReadOnly);
-}
-
-/*!
- \property QFileDialog::resolveSymlinks
- \obsolete
- \brief whether the filedialog should resolve shortcuts
-
- If this property is set to true, the file dialog will resolve
- shortcuts or symbolic links.
-
- Use setOption(DontResolveSymlinks, !\a enabled) or
- !testOption(DontResolveSymlinks).
-*/
-void QFileDialog::setResolveSymlinks(bool enabled)
-{
- setOption(DontResolveSymlinks, !enabled);
-}
-
-bool QFileDialog::resolveSymlinks() const
-{
- return !testOption(DontResolveSymlinks);
-}
-
-/*!
- \property QFileDialog::confirmOverwrite
- \obsolete
- \brief whether the filedialog should ask before accepting a selected file,
- when the accept mode is AcceptSave
-
- Use setOption(DontConfirmOverwrite, !\e enabled) or
- !testOption(DontConfirmOverwrite) instead.
-*/
-void QFileDialog::setConfirmOverwrite(bool enabled)
-{
- setOption(DontConfirmOverwrite, !enabled);
-}
-
-bool QFileDialog::confirmOverwrite() const
-{
- return !testOption(DontConfirmOverwrite);
-}
-#endif
-
/*!
\property QFileDialog::defaultSuffix
\brief suffix added to the filename if no other suffix was specified
@@ -2015,6 +1940,9 @@ QStringList QFileDialog::history() const
Sets the item delegate used to render items in the views in the
file dialog to the given \a delegate.
+ Any existing delegate will be removed, but not deleted. QFileDialog
+ does not take ownership of \a delegate.
+
\warning You should not share the same instance of a delegate between views.
Doing so can cause incorrect or unintuitive editing behavior since each
view connected to a given delegate may receive the \l{QAbstractItemDelegate::}{closeEditor()}
@@ -3123,7 +3051,7 @@ void QFileDialogPrivate::createWidgets()
QObject::connect(qFileDialogUi->buttonBox, SIGNAL(rejected()), q, SLOT(reject()));
qFileDialogUi->lookInCombo->setFileDialogPrivate(this);
- QObject::connect(qFileDialogUi->lookInCombo, SIGNAL(activated(QString)), q, SLOT(_q_goToDirectory(QString)));
+ QObject::connect(qFileDialogUi->lookInCombo, SIGNAL(textActivated(QString)), q, SLOT(_q_goToDirectory(QString)));
qFileDialogUi->lookInCombo->setInsertPolicy(QComboBox::NoInsert);
qFileDialogUi->lookInCombo->setDuplicatesEnabled(false);
@@ -3153,7 +3081,7 @@ void QFileDialogPrivate::createWidgets()
qFileDialogUi->fileTypeCombo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
QObject::connect(qFileDialogUi->fileTypeCombo, SIGNAL(activated(int)),
q, SLOT(_q_useNameFilter(int)));
- QObject::connect(qFileDialogUi->fileTypeCombo, SIGNAL(activated(QString)),
+ QObject::connect(qFileDialogUi->fileTypeCombo, SIGNAL(textActivated(QString)),
q, SIGNAL(filterSelected(QString)));
qFileDialogUi->listView->setFileDialogPrivate(this);
@@ -4337,7 +4265,7 @@ QStringList QFSCompleter::splitPath(const QString &path) const
return QStringList(completionPrefix());
QString pathCopy = QDir::toNativeSeparators(path);
- QString sep = QDir::separator();
+ QChar sep = QDir::separator();
#if defined(Q_OS_WIN)
if (pathCopy == QLatin1String("\\") || pathCopy == QLatin1String("\\\\"))
return QStringList(pathCopy);
@@ -4361,24 +4289,22 @@ QStringList QFSCompleter::splitPath(const QString &path) const
}
#endif
- QRegExp re(QLatin1Char('[') + QRegExp::escape(sep) + QLatin1Char(']'));
-
#if defined(Q_OS_WIN)
- QStringList parts = pathCopy.split(re, Qt::SkipEmptyParts);
+ QStringList parts = pathCopy.split(sep, Qt::SkipEmptyParts);
if (!doubleSlash.isEmpty() && !parts.isEmpty())
parts[0].prepend(doubleSlash);
if (pathCopy.endsWith(sep))
parts.append(QString());
#else
- QStringList parts = pathCopy.split(re);
- if (pathCopy[0] == sep[0]) // read the "/" at the beginning as the split removed it
- parts[0] = sep[0];
+ QStringList parts = pathCopy.split(sep);
+ if (pathCopy[0] == sep) // read the "/" at the beginning as the split removed it
+ parts[0] = sep;
#endif
#if defined(Q_OS_WIN)
bool startsFromRoot = !parts.isEmpty() && parts[0].endsWith(QLatin1Char(':'));
#else
- bool startsFromRoot = pathCopy[0] == sep[0];
+ bool startsFromRoot = pathCopy[0] == sep;
#endif
if (parts.count() == 1 || (parts.count() > 1 && !startsFromRoot)) {
const QFileSystemModel *dirModel;
diff --git a/src/widgets/dialogs/qfiledialog.h b/src/widgets/dialogs/qfiledialog.h
index 790f52f2e7..3703e7be26 100644
--- a/src/widgets/dialogs/qfiledialog.h
+++ b/src/widgets/dialogs/qfiledialog.h
@@ -67,13 +67,6 @@ class Q_WIDGETS_EXPORT QFileDialog : public QDialog
Q_PROPERTY(FileMode fileMode READ fileMode WRITE setFileMode)
Q_PROPERTY(AcceptMode acceptMode READ acceptMode WRITE setAcceptMode)
Q_PROPERTY(QString defaultSuffix READ defaultSuffix WRITE setDefaultSuffix)
-#if QT_DEPRECATED_SINCE(5, 13)
- Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly DESIGNABLE false)
- Q_PROPERTY(bool confirmOverwrite READ confirmOverwrite WRITE setConfirmOverwrite DESIGNABLE false)
- Q_PROPERTY(bool resolveSymlinks READ resolveSymlinks WRITE setResolveSymlinks DESIGNABLE false)
- Q_PROPERTY(bool nameFilterDetailsVisible READ isNameFilterDetailsVisible
- WRITE setNameFilterDetailsVisible DESIGNABLE false)
-#endif
Q_PROPERTY(Options options READ options WRITE setOptions)
Q_PROPERTY(QStringList supportedSchemes READ supportedSchemes WRITE setSupportedSchemes)
@@ -92,13 +85,10 @@ public:
ShowDirsOnly = 0x00000001,
DontResolveSymlinks = 0x00000002,
DontConfirmOverwrite = 0x00000004,
-#if QT_DEPRECATED_SINCE(5, 14)
- DontUseSheet Q_DECL_ENUMERATOR_DEPRECATED = 0x00000008,
-#endif
- DontUseNativeDialog = 0x00000010,
- ReadOnly = 0x00000020,
- HideNameFilterDetails = 0x00000040,
- DontUseCustomDirectoryIcons = 0x00000080
+ DontUseNativeDialog = 0x00000008,
+ ReadOnly = 0x00000010,
+ HideNameFilterDetails = 0x00000020,
+ DontUseCustomDirectoryIcons = 0x00000040
};
Q_ENUM(Option)
Q_DECLARE_FLAGS(Options, Option)
@@ -124,13 +114,6 @@ public:
void selectUrl(const QUrl &url);
QList<QUrl> selectedUrls() const;
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use setOption(HideNameFilterDetails, !enabled) instead")
- void setNameFilterDetailsVisible(bool enabled);
- QT_DEPRECATED_X("Use !testOption(HideNameFilterDetails) instead")
- bool isNameFilterDetailsVisible() const;
-#endif
-
void setNameFilter(const QString &filter);
void setNameFilters(const QStringList &filters);
QStringList nameFilters() const;
@@ -156,29 +139,12 @@ public:
void setAcceptMode(AcceptMode mode);
AcceptMode acceptMode() const;
-#if QT_DEPRECATED_SINCE(5, 13)
- void setReadOnly(bool enabled);
- bool isReadOnly() const;
-
- QT_DEPRECATED_X("Use setOption(DontResolveSymlinks, !enabled) instead")
- void setResolveSymlinks(bool enabled);
- QT_DEPRECATED_X("Use !testOption(DontResolveSymlinks) instead")
- bool resolveSymlinks() const;
-#endif
-
void setSidebarUrls(const QList<QUrl> &urls);
QList<QUrl> sidebarUrls() const;
QByteArray saveState() const;
bool restoreState(const QByteArray &state);
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use setOption(DontConfirmOverwrite, !enabled) instead")
- void setConfirmOverwrite(bool enabled);
- QT_DEPRECATED_X("Use !testOption(DontConfirmOverwrite) instead")
- bool confirmOverwrite() const;
-#endif
-
void setDefaultSuffix(const QString &suffix);
QString defaultSuffix() const;
diff --git a/src/widgets/dialogs/qfilesystemmodel.cpp b/src/widgets/dialogs/qfilesystemmodel.cpp
index 4644f0f04e..6afdfa6eb9 100644
--- a/src/widgets/dialogs/qfilesystemmodel.cpp
+++ b/src/widgets/dialogs/qfilesystemmodel.cpp
@@ -1709,6 +1709,8 @@ void QFileSystemModel::setNameFilters(const QStringList &filters)
d->nameFilters = filters;
d->forceSort = true;
d->delayedSort();
+#else
+ Q_UNUSED(filters)
#endif
}
@@ -2158,6 +2160,8 @@ bool QFileSystemModelPrivate::passNameFilters(const QFileSystemNode *node) const
}
return false;
}
+#else
+ Q_UNUSED(node)
#endif
return true;
}
diff --git a/src/widgets/dialogs/qfilesystemmodel_p.h b/src/widgets/dialogs/qfilesystemmodel_p.h
index ad98b9ef44..ccfa40c5f7 100644
--- a/src/widgets/dialogs/qfilesystemmodel_p.h
+++ b/src/widgets/dialogs/qfilesystemmodel_p.h
@@ -84,7 +84,7 @@ public:
Q_DECLARE_TYPEINFO(QFileSystemModelNodePathKey, Q_MOVABLE_TYPE);
-inline uint qHash(const QFileSystemModelNodePathKey &key) { return qHash(key.toCaseFolded()); }
+inline size_t qHash(const QFileSystemModelNodePathKey &key) { return qHash(key.toCaseFolded()); }
#else // Q_OS_WIN
typedef QString QFileSystemModelNodePathKey;
#endif
diff --git a/src/widgets/dialogs/qinputdialog.cpp b/src/widgets/dialogs/qinputdialog.cpp
index 415214d6ea..7569367768 100644
--- a/src/widgets/dialogs/qinputdialog.cpp
+++ b/src/widgets/dialogs/qinputdialog.cpp
@@ -300,7 +300,7 @@ void QInputDialogPrivate::ensureComboBox()
comboBox->hide();
QObject::connect(comboBox, SIGNAL(editTextChanged(QString)),
q, SLOT(_q_textChanged(QString)));
- QObject::connect(comboBox, SIGNAL(currentIndexChanged(QString)),
+ QObject::connect(comboBox, SIGNAL(currentTextChanged(QString)),
q, SLOT(_q_textChanged(QString)));
}
}
@@ -1322,42 +1322,6 @@ int QInputDialog::getInt(QWidget *parent, const QString &title, const QString &l
}
/*!
- \fn int QInputDialog::getInteger(QWidget *parent, const QString &title, const QString &label, int value, int min, int max, int step, bool *ok, Qt::WindowFlags flags)
- \deprecated use getInt()
-
- Static convenience function to get an integer input from the user.
-
- \a title is the text which is displayed in the title bar of the dialog.
- \a label is the text which is shown to the user (it should say what should
- be entered).
- \a value is the default integer which the spinbox will be set to.
- \a min and \a max are the minimum and maximum values the user may choose.
- \a step is the amount by which the values change as the user presses the
- arrow buttons to increment or decrement the value.
-
- If \a ok is nonnull *\a ok will be set to true if the user pressed \uicontrol OK
- and to false if the user pressed \uicontrol Cancel. The dialog's parent is
- \a parent. The dialog will be modal and uses the widget \a flags.
-
- On success, this function returns the integer which has been entered by the
- user; on failure, it returns the initial \a value.
-
- Use this static function like this:
-
- \snippet dialogs/standarddialogs/dialog.cpp 0
-
- \sa getText(), getDouble(), getItem(), getMultiLineText()
-*/
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && !defined(Q_QDOC)
-double QInputDialog::getDouble(QWidget *parent, const QString &title, const QString &label,
- double value, double min, double max, int decimals, bool *ok,
- Qt::WindowFlags flags)
-{
- return QInputDialog::getDouble(parent, title, label, value, min, max, decimals, ok, flags, 1.0);
-}
-#endif
-/*!
Static convenience function to get a floating point number from the user.
\a title is the text which is displayed in the title bar of the dialog.
diff --git a/src/widgets/dialogs/qinputdialog.h b/src/widgets/dialogs/qinputdialog.h
index a8696cb562..d3c95ccd23 100644
--- a/src/widgets/dialogs/qinputdialog.h
+++ b/src/widgets/dialogs/qinputdialog.h
@@ -56,7 +56,6 @@ class Q_WIDGETS_EXPORT QInputDialog : public QDialog
{
Q_OBJECT
Q_DECLARE_PRIVATE(QInputDialog)
-// Q_ENUMS(InputMode InputDialogOption)
QDOC_PROPERTY(InputMode inputMode READ inputMode WRITE setInputMode)
QDOC_PROPERTY(QString labelText READ labelText WRITE setLabelText)
QDOC_PROPERTY(InputDialogOptions options READ options WRITE setOptions)
@@ -177,35 +176,15 @@ public:
int minValue = -2147483647, int maxValue = 2147483647,
int step = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
-#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) || defined(Q_QDOC)
static double getDouble(QWidget *parent, const QString &title, const QString &label, double value = 0,
double minValue = -2147483647, double maxValue = 2147483647,
int decimals = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(),
double step = 1);
-#else
- static double getDouble(QWidget *parent, const QString &title, const QString &label,
- double value = 0, double minValue = -2147483647,
- double maxValue = 2147483647, int decimals = 1, bool *ok = nullptr,
- Qt::WindowFlags flags = Qt::WindowFlags());
- static double getDouble(QWidget *parent, const QString &title, const QString &label,
- double value, double minValue, double maxValue, int decimals, bool *ok,
- Qt::WindowFlags flags, double step);
-#endif
-
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED static inline int getInteger(QWidget *parent, const QString &title, const QString &label, int value = 0,
- int minValue = -2147483647, int maxValue = 2147483647,
- int step = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())
- {
- return getInt(parent, title, label, value, minValue, maxValue, step, ok, flags);
- }
-#endif
void setDoubleStep(double step);
double doubleStep() const;
Q_SIGNALS:
- // ### emit signals!
void textValueChanged(const QString &text);
void textValueSelected(const QString &text);
void intValueChanged(int value);
diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp
index 4e7a4a65e3..513a5c5658 100644
--- a/src/widgets/dialogs/qmessagebox.cpp
+++ b/src/widgets/dialogs/qmessagebox.cpp
@@ -182,12 +182,10 @@ public:
const QFontMetrics fm = fontMetrics();
opt.text = label(ShowLabel);
QSize sz = fm.size(Qt::TextShowMnemonic, opt.text);
- QSize ret = style()->sizeFromContents(QStyle::CT_PushButton, &opt, sz, this).
- expandedTo(QApplication::globalStrut());
+ QSize ret = style()->sizeFromContents(QStyle::CT_PushButton, &opt, sz, this);
opt.text = label(HideLabel);
sz = fm.size(Qt::TextShowMnemonic, opt.text);
- ret = ret.expandedTo(style()->sizeFromContents(QStyle::CT_PushButton, &opt, sz, this).
- expandedTo(QApplication::globalStrut()));
+ ret = ret.expandedTo(style()->sizeFromContents(QStyle::CT_PushButton, &opt, sz, this));
return ret;
}
};
@@ -333,7 +331,7 @@ void QMessageBoxPrivate::setupLayout()
}
#ifdef Q_OS_MAC
grid->addWidget(buttonBox, grid->rowCount(), hasIcon ? 2 : 1, 1, 1);
- grid->setMargin(0);
+ grid->setContentsMargins(0, 0, 0, 0);
grid->setVerticalSpacing(8);
grid->setHorizontalSpacing(0);
q->setContentsMargins(24, 15, 24, 20);
diff --git a/src/widgets/dialogs/qprogressdialog.cpp b/src/widgets/dialogs/qprogressdialog.cpp
index 40548e22a5..aaa4430c39 100644
--- a/src/widgets/dialogs/qprogressdialog.cpp
+++ b/src/widgets/dialogs/qprogressdialog.cpp
@@ -39,7 +39,9 @@
#include "qprogressdialog.h"
-#include "qshortcut.h"
+#if QT_CONFIG(shortcut)
+# include "qshortcut.h"
+#endif
#include "qpainter.h"
#include "qdrawutil.h"
#include "qlabel.h"
diff --git a/src/widgets/dialogs/qwizard.cpp b/src/widgets/dialogs/qwizard.cpp
index 17ea634efb..4b35c9d8ba 100644
--- a/src/widgets/dialogs/qwizard.cpp
+++ b/src/widgets/dialogs/qwizard.cpp
@@ -2391,16 +2391,6 @@ QList<int> QWizard::visitedIds() const
}
/*!
- \obsolete Use visitedIds() instead
-*/
-#if QT_DEPRECATED_SINCE(5, 15)
-QList<int> QWizard::visitedPages() const
-{
- return visitedIds();
-}
-#endif
-
-/*!
Returns the list of page IDs.
\since 4.5
*/
diff --git a/src/widgets/dialogs/qwizard.h b/src/widgets/dialogs/qwizard.h
index 13b584035c..6acf1c5566 100644
--- a/src/widgets/dialogs/qwizard.h
+++ b/src/widgets/dialogs/qwizard.h
@@ -128,9 +128,6 @@ public:
void removePage(int id);
QWizardPage *page(int id) const;
bool hasVisitedPage(int id) const;
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_VERSION_X_5_15("Use visitedIds() instead") QList<int> visitedPages() const;
-#endif
QList<int> visitedIds() const;
QList<int> pageIds() const;
void setStartId(int id);
diff --git a/src/widgets/doc/snippets/javastyle.cpp b/src/widgets/doc/snippets/javastyle.cpp
index ca6866376b..1d18b45c37 100644
--- a/src/widgets/doc/snippets/javastyle.cpp
+++ b/src/widgets/doc/snippets/javastyle.cpp
@@ -2130,7 +2130,7 @@ void JavaStyle::drawPrimitive(PrimitiveElement element,
painter->restore();
break;
}
- case PE_IndicatorViewItemCheck: {
+ case PE_IndicatorItemViewItemCheck: {
break;
}
case PE_FrameWindow: {
diff --git a/src/widgets/doc/snippets/qstackedlayout/main.cpp b/src/widgets/doc/snippets/qstackedlayout/main.cpp
index 9c61939dee..181eed87db 100644
--- a/src/widgets/doc/snippets/qstackedlayout/main.cpp
+++ b/src/widgets/doc/snippets/qstackedlayout/main.cpp
@@ -74,7 +74,7 @@ Widget::Widget(QWidget *parent)
pageComboBox->addItem(tr("Page 1"));
pageComboBox->addItem(tr("Page 2"));
pageComboBox->addItem(tr("Page 3"));
- connect(pageComboBox, QOverload<int>::of(&QComboBox::activated),
+ connect(pageComboBox, &QComboBox::activated,
stackedLayout, &QStackedLayout::setCurrentIndex);
//! [1]
diff --git a/src/widgets/doc/snippets/qstackedwidget/main.cpp b/src/widgets/doc/snippets/qstackedwidget/main.cpp
index 077c281830..c68a992332 100644
--- a/src/widgets/doc/snippets/qstackedwidget/main.cpp
+++ b/src/widgets/doc/snippets/qstackedwidget/main.cpp
@@ -74,7 +74,7 @@ Widget::Widget(QWidget *parent)
pageComboBox->addItem(tr("Page 1"));
pageComboBox->addItem(tr("Page 2"));
pageComboBox->addItem(tr("Page 3"));
- connect(pageComboBox, QOverload<int>::of(&QComboBox::activated),
+ connect(pageComboBox, &QComboBox::activated,
stackedWidget, &QStackedWidget::setCurrentIndex);
//! [1] //! [2]
diff --git a/src/widgets/doc/src/graphicsview.qdoc b/src/widgets/doc/src/graphicsview.qdoc
index 94c824c2ed..0489203e40 100644
--- a/src/widgets/doc/src/graphicsview.qdoc
+++ b/src/widgets/doc/src/graphicsview.qdoc
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
diff --git a/src/widgets/doc/src/widgets-and-layouts/styles.qdoc b/src/widgets/doc/src/widgets-and-layouts/styles.qdoc
index 645da5bca2..faaf4e5479 100644
--- a/src/widgets/doc/src/widgets-and-layouts/styles.qdoc
+++ b/src/widgets/doc/src/widgets-and-layouts/styles.qdoc
@@ -1837,7 +1837,7 @@
item views keep the dimensions on individual sections. Also
note that the delegates may use the style to paint decorations
and frames around items. QItemDelegate, for instance, draws
- \c PE_FrameFocusRect and \c PE_IndicatorViewItemCheck.
+ \c PE_FrameFocusRect and \c PE_IndicatorItemViewItemCheck.
\image javastyle/header.png
diff --git a/src/widgets/effects/qpixmapfilter.cpp b/src/widgets/effects/qpixmapfilter.cpp
index 1f899c2660..705871719f 100644
--- a/src/widgets/effects/qpixmapfilter.cpp
+++ b/src/widgets/effects/qpixmapfilter.cpp
@@ -784,11 +784,11 @@ Q_WIDGETS_EXPORT QImage qt_halfScaled(const QImage &source)
dest.setDevicePixelRatio(source.devicePixelRatioF());
const uchar *src = reinterpret_cast<const uchar*>(const_cast<const QImage &>(srcImage).bits());
- int sx = srcImage.bytesPerLine();
- int sx2 = sx << 1;
+ qsizetype sx = srcImage.bytesPerLine();
+ qsizetype sx2 = sx << 1;
uchar *dst = reinterpret_cast<uchar*>(dest.bits());
- int dx = dest.bytesPerLine();
+ qsizetype dx = dest.bytesPerLine();
int ww = dest.width();
int hh = dest.height();
@@ -806,11 +806,11 @@ Q_WIDGETS_EXPORT QImage qt_halfScaled(const QImage &source)
dest.setDevicePixelRatio(source.devicePixelRatioF());
const uchar *src = reinterpret_cast<const uchar*>(const_cast<const QImage &>(srcImage).bits());
- int sx = srcImage.bytesPerLine();
- int sx2 = sx << 1;
+ qsizetype sx = srcImage.bytesPerLine();
+ qsizetype sx2 = sx << 1;
uchar *dst = reinterpret_cast<uchar*>(dest.bits());
- int dx = dest.bytesPerLine();
+ qsizetype dx = dest.bytesPerLine();
int ww = dest.width();
int hh = dest.height();
@@ -843,11 +843,11 @@ Q_WIDGETS_EXPORT QImage qt_halfScaled(const QImage &source)
dest.setDevicePixelRatio(source.devicePixelRatioF());
const quint32 *src = reinterpret_cast<const quint32*>(const_cast<const QImage &>(srcImage).bits());
- int sx = srcImage.bytesPerLine() >> 2;
- int sx2 = sx << 1;
+ qsizetype sx = srcImage.bytesPerLine() >> 2;
+ qsizetype sx2 = sx << 1;
quint32 *dst = reinterpret_cast<quint32*>(dest.bits());
- int dx = dest.bytesPerLine() >> 2;
+ qsizetype dx = dest.bytesPerLine() >> 2;
int ww = dest.width();
int hh = dest.height();
diff --git a/src/widgets/effects/qpixmapfilter_p.h b/src/widgets/effects/qpixmapfilter_p.h
index c56acb8a24..2a6e7f5db0 100644
--- a/src/widgets/effects/qpixmapfilter_p.h
+++ b/src/widgets/effects/qpixmapfilter_p.h
@@ -109,7 +109,6 @@ public:
void draw(QPainter *painter, const QPointF &dest, const QPixmap &src, const QRectF &srcRect = QRectF()) const override;
private:
- friend class QGLPixmapConvolutionFilter;
friend class QVGPixmapConvolutionFilter;
const qreal *convolutionKernel() const;
int rows() const;
@@ -135,9 +134,6 @@ public:
QRectF boundingRectFor(const QRectF &rect) const override;
void draw(QPainter *painter, const QPointF &dest, const QPixmap &src, const QRectF &srcRect = QRectF()) const override;
-
-private:
- friend class QGLPixmapBlurFilter;
};
class QPixmapColorizeFilterPrivate;
diff --git a/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp b/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp
index af0ee3d38c..999561a497 100644
--- a/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp
+++ b/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp
@@ -41,7 +41,6 @@
#include <QtWidgets/qwidget.h>
#include <QtWidgets/qapplication.h>
-#include <QtCore/qlinkedlist.h>
#include <QtCore/qstack.h>
#ifdef QT_DEBUG
@@ -2634,7 +2633,7 @@ void QGraphicsAnchorLayoutPrivate::setItemsGeometries(const QRectF &geom)
top += geom.top();
right = geom.right() - right;
- foreach (QGraphicsLayoutItem *item, items) {
+ for (QGraphicsLayoutItem *item : qAsConst(items)) {
QRectF newGeom;
QSizeF itemPreferredSize = item->effectiveSizeHint(Qt::PreferredSize);
if (m_floatItems[Horizontal].contains(item)) {
diff --git a/src/widgets/graphicsview/qgraphicsgridlayoutengine.cpp b/src/widgets/graphicsview/qgraphicsgridlayoutengine.cpp
index 5797d9e539..3dd1b1652a 100644
--- a/src/widgets/graphicsview/qgraphicsgridlayoutengine.cpp
+++ b/src/widgets/graphicsview/qgraphicsgridlayoutengine.cpp
@@ -42,29 +42,9 @@
#include "qgraphicslayoutitem_p.h"
#include "qgraphicslayout_p.h"
#include "qgraphicswidget.h"
-#include <private/qgraphicswidget_p.h>
QT_BEGIN_NAMESPACE
-bool QGraphicsGridLayoutEngineItem::isHidden() const
-{
- if (QGraphicsItem *item = q_layoutItem->graphicsItem())
- return QGraphicsItemPrivate::get(item)->explicitlyHidden;
- return false;
-}
-
-/*!
- \internal
-
- If this returns true, the layout will arrange just as if the item was never added to the layout.
- (Note that this shouldn't lead to a "double spacing" where the item was hidden)
- ### Qt6: Move to QGraphicsLayoutItem and make virtual
-*/
-bool QGraphicsGridLayoutEngineItem::isIgnored() const
-{
- return isHidden() && !q_layoutItem->sizePolicy().retainSizeWhenHidden();
-}
-
/*
returns \c true if the size policy returns \c true for either hasHeightForWidth()
or hasWidthForHeight()
@@ -83,6 +63,16 @@ Qt::Orientation QGraphicsGridLayoutEngineItem::dynamicConstraintOrientation() co
return Qt::Horizontal;
}
+/*!
+ \internal
+
+ If this returns true, the layout will arrange just as if the item was never added to the layout.
+ (Note that this shouldn't lead to a "double spacing" where the item was hidden)
+*/
+bool QGraphicsGridLayoutEngineItem::isEmpty() const
+{
+ return q_layoutItem->isEmpty();
+}
void QGraphicsGridLayoutEngine::setAlignment(QGraphicsLayoutItem *graphicsLayoutItem, Qt::Alignment alignment)
{
diff --git a/src/widgets/graphicsview/qgraphicsgridlayoutengine_p.h b/src/widgets/graphicsview/qgraphicsgridlayoutengine_p.h
index 2f2c547977..a3e42c7b77 100644
--- a/src/widgets/graphicsview/qgraphicsgridlayoutengine_p.h
+++ b/src/widgets/graphicsview/qgraphicsgridlayoutengine_p.h
@@ -89,10 +89,6 @@ public:
return q_layoutItem->effectiveSizeHint(which, constraint);
}
- bool isHidden() const;
-
- virtual bool isIgnored() const override;
-
virtual void setGeometry(const QRectF &rect) override
{
q_layoutItem->setGeometry(rect);
@@ -101,6 +97,8 @@ public:
virtual bool hasDynamicConstraint() const override;
virtual Qt::Orientation dynamicConstraintOrientation() const override;
+ virtual bool isEmpty() const override;
+
QGraphicsLayoutItem *layoutItem() const { return q_layoutItem; }
protected:
diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp
index 38cab60fc2..42f997b104 100644
--- a/src/widgets/graphicsview/qgraphicsitem.cpp
+++ b/src/widgets/graphicsview/qgraphicsitem.cpp
@@ -530,9 +530,6 @@
setEnabled() in itemChange() as this notification is delivered. The return
value is ignored.
- \value ItemMatrixChange The item's affine transformation matrix is
- changing. This value is obsolete; you can use ItemTransformChange instead.
-
\value ItemPositionChange The item's position changes. This notification
is sent if the ItemSendsGeometryChanges flag is enabled, and when the
item's local position changes, relative to its parent (i.e., as a result
@@ -1078,7 +1075,7 @@ void QGraphicsItemPrivate::setIsMemberOfGroup(bool enabled)
Q_Q(QGraphicsItem);
isMemberOfGroup = enabled;
if (!qgraphicsitem_cast<QGraphicsItemGroup *>(q)) {
- foreach (QGraphicsItem *child, children)
+ for (QGraphicsItem *child : qAsConst(children))
child->d_func()->setIsMemberOfGroup(enabled);
}
}
@@ -1506,7 +1503,7 @@ void QGraphicsItemPrivate::initStyleOption(QStyleOptionGraphicsItem *option, con
return;
// Initialize QStyleOptionGraphicsItem specific values (matrix, exposedRect).
- option->matrix = worldTransform.toAffine(); //### discards perspective
+ option->matrix = worldTransform; //### discards perspective
if (!allItems) {
// Determine the item's exposed area
@@ -1580,13 +1577,8 @@ QGraphicsItem::~QGraphicsItem()
p->wasDeleted = true;
if (p->declarativeData) {
p->wasDeleted = true; // needed, so that destroying the declarative data does the right thing
- if (static_cast<QAbstractDeclarativeDataImpl*>(p->declarativeData)->ownedByQml1) {
- if (QAbstractDeclarativeData::destroyed_qml1)
- QAbstractDeclarativeData::destroyed_qml1(p->declarativeData, o);
- } else {
- if (QAbstractDeclarativeData::destroyed)
- QAbstractDeclarativeData::destroyed(p->declarativeData, o);
- }
+ if (QAbstractDeclarativeData::destroyed)
+ QAbstractDeclarativeData::destroyed(p->declarativeData, o);
p->declarativeData = nullptr;
p->wasDeleted = false;
}
@@ -1599,9 +1591,8 @@ QGraphicsItem::~QGraphicsItem()
if (d_ptr->isObject && !d_ptr->gestureContext.isEmpty()) {
QGraphicsObject *o = static_cast<QGraphicsObject *>(this);
if (QGestureManager *manager = QGestureManager::instance(QGestureManager::DontForceCreation)) {
- const auto types = d_ptr->gestureContext.keys(); // FIXME: iterate over the map directly?
- for (Qt::GestureType type : types)
- manager->cleanupCachedGestures(o, type);
+ for (auto it = d_ptr->gestureContext.constBegin(); it != d_ptr->gestureContext.constEnd(); ++it)
+ manager->cleanupCachedGestures(o, it.key());
}
}
#endif
@@ -1859,15 +1850,6 @@ void QGraphicsItem::setParentItem(QGraphicsItem *newParent)
}
/*!
- \fn QList<QGraphicsItem *> QGraphicsItem::children() const
- \obsolete
-
- Use childItems() instead.
-
- \sa setParentItem()
-*/
-
-/*!
\since 4.4
Returns a list of this item's children.
@@ -2257,7 +2239,7 @@ bool QGraphicsItem::isBlockedByModalPanel(QGraphicsItem **blockingPanel) const
return false;
}
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
/*!
Returns the item's tool tip, or an empty QString if no tool tip has been
set.
@@ -2281,7 +2263,7 @@ void QGraphicsItem::setToolTip(const QString &toolTip)
d_ptr->setExtra(QGraphicsItemPrivate::ExtraToolTip, toolTipVariant.toString());
itemChange(ItemToolTipHasChanged, toolTipVariant);
}
-#endif // QT_NO_TOOLTIP
+#endif // QT_CONFIG(tooltip)
#ifndef QT_NO_CURSOR
/*!
@@ -2519,7 +2501,7 @@ void QGraphicsItemPrivate::setVisibleHelper(bool newVisible, bool explicitly,
const bool updateChildren = update && !((flags & QGraphicsItem::ItemClipsChildrenToShape
|| flags & QGraphicsItem::ItemContainsChildrenInShape)
&& !(flags & QGraphicsItem::ItemHasNoContents));
- foreach (QGraphicsItem *child, children) {
+ for (QGraphicsItem *child : qAsConst(children)) {
if (!newVisible || !child->d_ptr->explicitlyHidden)
child->d_ptr->setVisibleHelper(newVisible, false, updateChildren, hiddenByPanel);
}
@@ -2709,7 +2691,7 @@ void QGraphicsItemPrivate::setEnabledHelper(bool newEnabled, bool explicitly, bo
if (update)
q_ptr->update();
- foreach (QGraphicsItem *child, children) {
+ for (QGraphicsItem *child : qAsConst(children)) {
if (!newEnabled || !child->d_ptr->explicitlyDisabled)
child->d_ptr->setEnabledHelper(newEnabled, /* explicitly = */ false);
}
@@ -3179,12 +3161,6 @@ bool QGraphicsItem::acceptHoverEvents() const
return d_ptr->acceptsHover;
}
-/*!
- \fn bool QGraphicsItem::acceptsHoverEvents() const
- \obsolete
-
- Call acceptHoverEvents() instead.
-*/
/*!
\since 4.4
@@ -3228,13 +3204,6 @@ void QGraphicsItem::setAcceptHoverEvents(bool enabled)
}
}
-/*!
- \fn void QGraphicsItem::setAcceptsHoverEvents(bool enabled)
- \obsolete
-
- Use setAcceptHoverEvents(\a enabled) instead.
-*/
-
/*! \since 4.6
Returns \c true if an item accepts \l{QTouchEvent}{touch events};
@@ -3989,7 +3958,7 @@ void QGraphicsItem::ensureVisible(const QRectF &rect, int xmargin, int ymargin)
sceneRect = sceneTransform().mapRect(rect);
else
sceneRect = sceneBoundingRect();
- foreach (QGraphicsView *view, d_ptr->scene->d_func()->views)
+ for (QGraphicsView *view : qAsConst(d_ptr->scene->d_func()->views))
view->ensureVisible(sceneRect, xmargin, ymargin);
}
}
@@ -4002,24 +3971,6 @@ void QGraphicsItem::ensureVisible(const QRectF &rect, int xmargin, int ymargin)
ensureVisible(QRectF(\a x, \a y, \a w, \a h), \a xmargin, \a ymargin).
*/
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \obsolete
-
- Returns the item's affine transformation matrix. This is a subset or the
- item's full transformation matrix, and might not represent the item's full
- transformation.
-
- Use transform() instead.
-
- \sa setTransform(), sceneTransform()
-*/
-QMatrix QGraphicsItem::matrix() const
-{
- return transform().toAffine();
-}
-#endif
-
/*!
\since 4.3
@@ -4328,22 +4279,6 @@ void QGraphicsItem::setTransformOriginPoint(const QPointF &origin)
\sa setTransformOriginPoint(), {Transformations}
*/
-
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \obsolete
-
- Use sceneTransform() instead.
-
- \sa transform(), setTransform(), scenePos(), {The Graphics View Coordinate System}
-*/
-QMatrix QGraphicsItem::sceneMatrix() const
-{
- d_ptr->ensureSceneTransform();
- return d_ptr->sceneTransform.toAffine();
-}
-#endif
-
/*!
\since 4.3
@@ -4554,50 +4489,6 @@ QTransform QGraphicsItem::itemTransform(const QGraphicsItem *other, bool *ok) co
return x;
}
-#if QT_DEPRECATED_SINCE(5, 13)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-/*!
- \obsolete
-
- Sets the item's affine transformation matrix. This is a subset or the
- item's full transformation matrix, and might not represent the item's full
- transformation.
-
- Use setTransform() instead.
-
- \sa transform(), {The Graphics View Coordinate System}
-*/
-void QGraphicsItem::setMatrix(const QMatrix &matrix, bool combine)
-{
- if (!d_ptr->transformData)
- d_ptr->transformData = new QGraphicsItemPrivate::TransformData;
-
- QTransform newTransform(combine ? QTransform(matrix) * d_ptr->transformData->transform : QTransform(matrix));
- if (d_ptr->transformData->transform == newTransform)
- return;
-
- // Update and set the new transformation.
- if (!(d_ptr->flags & ItemSendsGeometryChanges)) {
- d_ptr->setTransformHelper(newTransform);
- return;
- }
-
- // Notify the item that the transformation matrix is changing.
- const QVariant newMatrixVariant = QVariant::fromValue<QMatrix>(newTransform.toAffine());
- newTransform = QTransform(qvariant_cast<QMatrix>(itemChange(ItemMatrixChange, newMatrixVariant)));
- if (d_ptr->transformData->transform == newTransform)
- return;
-
- // Update and set the new transformation.
- d_ptr->setTransformHelper(newTransform);
-
- // Send post-notification.
- itemChange(ItemTransformHasChanged, QVariant::fromValue<QTransform>(newTransform));
-}
-QT_WARNING_POP
-#endif
-
/*!
\since 4.3
@@ -4651,18 +4542,6 @@ void QGraphicsItem::setTransform(const QTransform &matrix, bool combine)
d_ptr->sendScenePosChange();
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \obsolete
-
- Use resetTransform() instead.
-*/
-void QGraphicsItem::resetMatrix()
-{
- resetTransform();
-}
-#endif
-
/*!
\since 4.3
@@ -4678,81 +4557,6 @@ void QGraphicsItem::resetTransform()
}
/*!
- \fn void QGraphicsItem::rotate(qreal angle)
- \obsolete
-
- Use
-
- \snippet code/src_gui_graphicsview_qgraphicsitem.cpp 20
-
- instead.
-
- Rotates the current item transformation \a angle degrees clockwise around
- its origin. To translate around an arbitrary point (x, y), you need to
- combine translation and rotation with setTransform().
-
- Example:
-
- \snippet code/src_gui_graphicsview_qgraphicsitem.cpp 6
-
- \sa setTransform(), transform(), scale(), shear(), translate()
-*/
-
-/*!
- \fn void QGraphicsItem::scale(qreal sx, qreal sy)
- \obsolete
-
- Use
-
- \snippet code/src_gui_graphicsview_qgraphicsitem.cpp 21
-
- instead.
-
- Scales the current item transformation by (\a sx, \a sy) around its
- origin. To scale from an arbitrary point (x, y), you need to combine
- translation and scaling with setTransform().
-
- Example:
-
- \snippet code/src_gui_graphicsview_qgraphicsitem.cpp 7
-
- \sa setTransform(), transform()
-*/
-
-/*!
- \fn void QGraphicsItem::shear(qreal sh, qreal sv)
- \obsolete
-
- Use
-
- \snippet code/src_gui_graphicsview_qgraphicsitem.cpp 22
-
- instead.
-
- Shears the current item transformation by (\a sh, \a sv).
-
- \sa setTransform(), transform()
-*/
-
-/*!
- \fn void QGraphicsItem::translate(qreal dx, qreal dy)
- \obsolete
-
- Use setPos() or setTransformOriginPoint() instead. For identical
- behavior, use
-
- \snippet code/src_gui_graphicsview_qgraphicsitem.cpp 23
-
- Translates the current item transformation by (\a dx, \a dy).
-
- If all you want is to move an item, you should call moveBy() or
- setPos() instead; this function changes the item's translation,
- which is conceptually separate from its position.
-
- \sa setTransform(), transform()
-*/
-
-/*!
This virtual function is called twice for all items by the
QGraphicsScene::advance() slot. In the first phase, all items are called
with \a phase == 0, indicating that items on the scene are about to
@@ -4863,7 +4667,7 @@ inline void QGraphicsItemPrivate::sendScenePosChange()
if (flags & QGraphicsItem::ItemSendsScenePositionChanges)
q->itemChange(QGraphicsItem::ItemScenePositionHasChanged, q->scenePos());
if (scenePosDescendants) {
- foreach (QGraphicsItem *item, scene->d_func()->scenePosItems) {
+ for (QGraphicsItem *item : qAsConst(scene->d_func()->scenePosItems)) {
if (q->isAncestorOf(item))
item->itemChange(QGraphicsItem::ItemScenePositionHasChanged, item->scenePos());
}
@@ -7428,7 +7232,7 @@ void QGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
// temporarily removing this item from the selection list.
if (d_ptr->selected) {
scene->d_func()->selectedItems.remove(this);
- foreach (QGraphicsItem *item, scene->d_func()->selectedItems) {
+ for (QGraphicsItem *item : qAsConst(scene->d_func()->selectedItems)) {
if (item->isSelected()) {
selectionChanged = true;
break;
@@ -11452,8 +11256,7 @@ static void formatGraphicsItemHelper(QDebug debug, const QGraphicsItem *item)
debug << ", flags=" << item->flags();
}
-// FIXME: Qt 6: Make this QDebug operator<<(QDebug debug, const QGraphicsItem *item)
-QDebug operator<<(QDebug debug, QGraphicsItem *item)
+QDebug operator<<(QDebug debug, const QGraphicsItem *item)
{
QDebugStateSaver saver(debug);
debug.nospace();
@@ -11463,7 +11266,7 @@ QDebug operator<<(QDebug debug, QGraphicsItem *item)
return debug;
}
- if (QGraphicsObject *o = item->toGraphicsObject())
+ if (const QGraphicsObject *o = item->toGraphicsObject())
debug << o->metaObject()->className();
else
debug << "QGraphicsItem";
@@ -11484,8 +11287,7 @@ QDebug operator<<(QDebug debug, QGraphicsItem *item)
return debug;
}
-// FIXME: Qt 6: Make this QDebug operator<<(QDebug debug, const QGraphicsObject *item)
-QDebug operator<<(QDebug debug, QGraphicsObject *item)
+QDebug operator<<(QDebug debug, const QGraphicsObject *item)
{
QDebugStateSaver saver(debug);
debug.nospace();
@@ -11531,14 +11333,6 @@ QDebug operator<<(QDebug debug, QGraphicsItem::GraphicsItemChange change)
case QGraphicsItem::ItemFlagsHaveChanged:
str = "ItemFlagsHaveChanged";
break;
-#if QT_DEPRECATED_SINCE(5, 14)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- case QGraphicsItem::ItemMatrixChange:
- str = "ItemMatrixChange";
- break;
-QT_WARNING_POP
-#endif
case QGraphicsItem::ItemParentChange:
str = "ItemParentChange";
break;
diff --git a/src/widgets/graphicsview/qgraphicsitem.h b/src/widgets/graphicsview/qgraphicsitem.h
index d66a4917e5..dda61fbe65 100644
--- a/src/widgets/graphicsview/qgraphicsitem.h
+++ b/src/widgets/graphicsview/qgraphicsitem.h
@@ -71,7 +71,6 @@ class QGraphicsTransform;
class QGraphicsWidget;
class QInputMethodEvent;
class QKeyEvent;
-class QMatrix;
class QMenu;
class QPainter;
class QPen;
@@ -110,9 +109,6 @@ public:
enum GraphicsItemChange {
ItemPositionChange,
-#if QT_DEPRECATED_SINCE(5, 14)
- ItemMatrixChange Q_DECL_ENUMERATOR_DEPRECATED_X("Use ItemTransformChange instead"),
-#endif
ItemVisibleChange = 2,
ItemEnabledChange,
ItemSelectedChange,
@@ -173,9 +169,6 @@ public:
QGraphicsWidget *window() const;
QGraphicsItem *panel() const;
void setParentItem(QGraphicsItem *parent);
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED inline QList<QGraphicsItem *> children() const { return childItems(); }
-#endif
QList<QGraphicsItem *> childItems() const;
bool isWidget() const;
bool isWindow() const;
@@ -198,7 +191,7 @@ public:
void setPanelModality(PanelModality panelModality);
bool isBlockedByModalPanel(QGraphicsItem **blockingPanel = nullptr) const;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
QString toolTip() const;
void setToolTip(const QString &toolTip);
#endif
@@ -237,10 +230,6 @@ public:
Qt::MouseButtons acceptedMouseButtons() const;
void setAcceptedMouseButtons(Qt::MouseButtons buttons);
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED inline bool acceptsHoverEvents() const { return acceptHoverEvents(); }
- QT_DEPRECATED inline void setAcceptsHoverEvents(bool enabled) { setAcceptHoverEvents(enabled); }
-#endif
bool acceptHoverEvents() const;
void setAcceptHoverEvents(bool enabled);
bool acceptTouchEvents() const;
@@ -285,28 +274,12 @@ public:
inline void ensureVisible(qreal x, qreal y, qreal w, qreal h, int xmargin = 50, int ymargin = 50);
// Local transformation
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use transform() instead")
- QMatrix matrix() const;
- QT_DEPRECATED_X("Use sceneTransform() instead")
- QMatrix sceneMatrix() const;
- QT_DEPRECATED_X("Use setTransform() instead")
- void setMatrix(const QMatrix &matrix, bool combine = false);
- QT_DEPRECATED_X("Use resetTransform() instead")
- void resetMatrix();
-#endif
QTransform transform() const;
QTransform sceneTransform() const;
QTransform deviceTransform(const QTransform &viewportTransform) const;
QTransform itemTransform(const QGraphicsItem *other, bool *ok = nullptr) const;
void setTransform(const QTransform &matrix, bool combine = false);
void resetTransform();
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED inline void rotate(qreal angle) { setTransform(QTransform().rotate(angle), true); }
- QT_DEPRECATED inline void scale(qreal sx, qreal sy) { setTransform(QTransform::fromScale(sx, sy), true); }
- QT_DEPRECATED inline void shear(qreal sh, qreal sv) { setTransform(QTransform().shear(sh, sv), true); }
- QT_DEPRECATED inline void translate(qreal dx, qreal dy) { setTransform(QTransform::fromTranslate(dx, dy), true); }
-#endif
void setRotation(qreal angle);
qreal rotation() const;
@@ -1046,8 +1019,8 @@ template <class T> inline T qgraphicsitem_cast(const QGraphicsItem *item)
}
#ifndef QT_NO_DEBUG_STREAM
-Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, QGraphicsItem *item);
-Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, QGraphicsObject *item);
+Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, const QGraphicsItem *item);
+Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, const QGraphicsObject *item);
Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, QGraphicsItem::GraphicsItemChange change);
Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, QGraphicsItem::GraphicsItemFlag flag);
Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, QGraphicsItem::GraphicsItemFlags flags);
diff --git a/src/widgets/graphicsview/qgraphicsitemanimation.cpp b/src/widgets/graphicsview/qgraphicsitemanimation.cpp
index 1c5dbf265c..981a4634bb 100644
--- a/src/widgets/graphicsview/qgraphicsitemanimation.cpp
+++ b/src/widgets/graphicsview/qgraphicsitemanimation.cpp
@@ -87,7 +87,6 @@
#include <QtCore/qpoint.h>
#include <QtCore/qpointer.h>
#include <QtCore/qpair.h>
-#include <QtGui/qmatrix.h>
#include <algorithm>
@@ -294,19 +293,6 @@ QList<QPair<qreal, QPointF> > QGraphicsItemAnimation::posList() const
return list;
}
-#if QT_DEPRECATED_SINCE(5, 14)
-/*!
- Returns the matrix used to transform the item at the specified \a step value.
-
- \obsolete Use transformAt() instead
-*/
-QMatrix QGraphicsItemAnimation::matrixAt(qreal step) const
-{
- check_step_valid(step, "matrixAt");
- return transformAt(step).toAffine();
-}
-#endif
-
/*!
Returns the transform used for the item at the specified \a step value.
@@ -564,23 +550,6 @@ void QGraphicsItemAnimation::setStep(qreal step)
afterAnimationStep(step);
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- Resets the item to its starting position and transformation.
-
- \obsolete
-
- You can call setStep(0) instead.
-*/
-void QGraphicsItemAnimation::reset()
-{
- if (!d->item)
- return;
- d->startPos = d->item->pos();
- d->startTransform = d->item->transform();
-}
-#endif
-
/*!
\fn void QGraphicsItemAnimation::beforeAnimationStep(qreal step)
diff --git a/src/widgets/graphicsview/qgraphicsitemanimation.h b/src/widgets/graphicsview/qgraphicsitemanimation.h
index 3051fb2e2b..2bd9206574 100644
--- a/src/widgets/graphicsview/qgraphicsitemanimation.h
+++ b/src/widgets/graphicsview/qgraphicsitemanimation.h
@@ -48,7 +48,6 @@ QT_REQUIRE_CONFIG(graphicsview);
QT_BEGIN_NAMESPACE
class QGraphicsItem;
-class QMatrix;
class QPointF;
class QTimeLine;
class QTransform;
@@ -72,10 +71,6 @@ public:
QList<QPair<qreal, QPointF> > posList() const;
void setPosAt(qreal step, const QPointF &pos);
-#if QT_DEPRECATED_SINCE(5, 14)
- QT_DEPRECATED_X("Use transformAt() instead")
- QMatrix matrixAt(qreal step) const;
-#endif
QTransform transformAt(qreal step) const;
qreal rotationAt(qreal step) const;
@@ -101,10 +96,6 @@ public:
public Q_SLOTS:
void setStep(qreal x);
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use setStep(0) instead")
- void reset();
-#endif
protected:
virtual void beforeAnimationStep(qreal step);
diff --git a/src/widgets/graphicsview/qgraphicslayoutitem.cpp b/src/widgets/graphicsview/qgraphicslayoutitem.cpp
index 8694dcb36b..2c484321e4 100644
--- a/src/widgets/graphicsview/qgraphicslayoutitem.cpp
+++ b/src/widgets/graphicsview/qgraphicslayoutitem.cpp
@@ -45,6 +45,7 @@
#include "qgraphicslayoutitem_p.h"
#include "qwidget.h"
#include "qgraphicswidget.h"
+#include "qgraphicsitem_p.h"
#include <QtDebug>
@@ -826,6 +827,22 @@ void QGraphicsLayoutItem::updateGeometry()
}
/*!
+ * returns \c true if this item is empty, i.e whether it has no content and
+ * should not occupy any space.
+ *
+ * The default implementation returns true if the item has been hidden unless
+ * its size policy has retainSizeWhenHidden set to \c true
+ */
+bool QGraphicsLayoutItem::isEmpty() const
+{
+ bool isHidden = false;
+ if (QGraphicsItem *item = graphicsItem())
+ isHidden = QGraphicsItemPrivate::get(item)->explicitlyHidden;
+
+ return isHidden && !sizePolicy().retainSizeWhenHidden();
+}
+
+/*!
Returns the parent of this QGraphicsLayoutItem, or \nullptr if there is
no parent, or if the parent does not inherit from QGraphicsLayoutItem
(QGraphicsLayoutItem is often used through multiple inheritance with
diff --git a/src/widgets/graphicsview/qgraphicslayoutitem.h b/src/widgets/graphicsview/qgraphicslayoutitem.h
index 86a0a87361..04905c7654 100644
--- a/src/widgets/graphicsview/qgraphicslayoutitem.h
+++ b/src/widgets/graphicsview/qgraphicslayoutitem.h
@@ -94,6 +94,7 @@ public:
virtual void updateGeometry();
+ virtual bool isEmpty() const;
QGraphicsLayoutItem *parentLayoutItem() const;
void setParentLayoutItem(QGraphicsLayoutItem *parent);
diff --git a/src/widgets/graphicsview/qgraphicsproxywidget.cpp b/src/widgets/graphicsview/qgraphicsproxywidget.cpp
index 45720802d3..42211c7ccf 100644
--- a/src/widgets/graphicsview/qgraphicsproxywidget.cpp
+++ b/src/widgets/graphicsview/qgraphicsproxywidget.cpp
@@ -495,7 +495,7 @@ void QGraphicsProxyWidgetPrivate::embedSubWindow(QWidget *subWin)
*/
void QGraphicsProxyWidgetPrivate::unembedSubWindow(QWidget *subWin)
{
- foreach (QGraphicsItem *child, children) {
+ for (QGraphicsItem *child : qAsConst(children)) {
if (child->isWidget()) {
if (QGraphicsProxyWidget *proxy = qobject_cast<QGraphicsProxyWidget *>(static_cast<QGraphicsWidget *>(child))) {
if (proxy->widget() == subWin) {
@@ -890,7 +890,7 @@ bool QGraphicsProxyWidget::event(QEvent *event)
}
break;
}
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
case QEvent::GraphicsSceneHelp: {
// Propagate the help event (for tooltip) to the widget under mouse
if (d->lastWidgetUnderMouse) {
@@ -981,7 +981,7 @@ bool QGraphicsProxyWidget::eventFilter(QObject *object, QEvent *event)
d->styleChangeMode = QGraphicsProxyWidgetPrivate::NoMode;
}
break;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
case QEvent::ToolTipChange:
// Propagate tooltip change to the proxy.
if (!d->tooltipChangeMode) {
diff --git a/src/widgets/graphicsview/qgraphicsscene.cpp b/src/widgets/graphicsview/qgraphicsscene.cpp
index f2ff658d3b..d5ab1afd92 100644
--- a/src/widgets/graphicsview/qgraphicsscene.cpp
+++ b/src/widgets/graphicsview/qgraphicsscene.cpp
@@ -238,7 +238,9 @@
#include <QtGui/qpolygon.h>
#include <QtGui/qtouchdevice.h>
#include <QtWidgets/qstyleoption.h>
+#if QT_CONFIG(tooltip)
#include <QtWidgets/qtooltip.h>
+#endif
#include <QtGui/qtransform.h>
#include <QtGui/qinputmethod.h>
#include <private/qapplication_p.h>
@@ -363,12 +365,11 @@ void QGraphicsScenePrivate::_q_emitUpdated()
// needs to happen in order to keep compatibility with the behavior from
// Qt 4.4 and backward.
if (isSignalConnected(changedSignalIndex)) {
- for (int i = 0; i < views.size(); ++i) {
- QGraphicsView *view = views.at(i);
+ for (auto view : qAsConst(views)) {
if (!view->d_func()->connectedToScene) {
view->d_func()->connectedToScene = true;
q->connect(q, SIGNAL(changed(QList<QRectF>)),
- views.at(i), SLOT(updateScene(QList<QRectF>)));
+ view, SLOT(updateScene(QList<QRectF>)));
}
}
} else {
@@ -376,11 +377,11 @@ void QGraphicsScenePrivate::_q_emitUpdated()
updateAll = false;
return;
}
- for (int i = 0; i < views.size(); ++i)
- views.at(i)->d_func()->processPendingUpdates();
+ for (auto view : qAsConst(views))
+ view->d_func()->processPendingUpdates();
// It's important that we update all views before we dispatch, hence two for-loops.
- for (int i = 0; i < views.size(); ++i)
- views.at(i)->d_func()->dispatchPendingUpdateRequests();
+ for (auto view : qAsConst(views))
+ view->d_func()->dispatchPendingUpdateRequests();
return;
}
@@ -482,8 +483,8 @@ void QGraphicsScenePrivate::_q_processDirtyItems()
Q_ASSERT(calledEmitUpdated);
// No need for further processing (except resetting the dirty states).
// The growingItemsBoundingRect is updated in _q_emitUpdated.
- for (int i = 0; i < topLevelItems.size(); ++i)
- resetDirtyItem(topLevelItems.at(i), /*recursive=*/true);
+ for (auto topLevelItem : qAsConst(topLevelItems))
+ resetDirtyItem(topLevelItem, /*recursive=*/true);
return;
}
@@ -491,8 +492,8 @@ void QGraphicsScenePrivate::_q_processDirtyItems()
const QRectF oldGrowingItemsBoundingRect = growingItemsBoundingRect;
// Process items recursively.
- for (int i = 0; i < topLevelItems.size(); ++i)
- processDirtyItemsRecursive(topLevelItems.at(i));
+ for (auto topLevelItem : qAsConst(topLevelItems))
+ processDirtyItemsRecursive(topLevelItem);
dirtyGrowingItemsBoundingRect = false;
if (!hasSceneRect && oldGrowingItemsBoundingRect != growingItemsBoundingRect)
@@ -501,8 +502,8 @@ void QGraphicsScenePrivate::_q_processDirtyItems()
if (wasPendingSceneUpdate)
return;
- for (int i = 0; i < views.size(); ++i)
- views.at(i)->d_func()->processPendingUpdates();
+ for (auto view : qAsConst(views))
+ view->d_func()->processPendingUpdates();
if (calledEmitUpdated) {
// We did a compatibility QGraphicsScene::update in processDirtyItemsRecursive
@@ -512,8 +513,8 @@ void QGraphicsScenePrivate::_q_processDirtyItems()
}
// Immediately dispatch all pending update requests on the views.
- for (int i = 0; i < views.size(); ++i)
- views.at(i)->d_func()->dispatchPendingUpdateRequests();
+ for (auto view : qAsConst(views))
+ view->d_func()->dispatchPendingUpdateRequests();
}
/*!
@@ -555,7 +556,7 @@ void QGraphicsScenePrivate::unregisterScenePosItem(QGraphicsItem *item)
*/
void QGraphicsScenePrivate::_q_updateScenePosDescendants()
{
- foreach (QGraphicsItem *item, scenePosItems) {
+ for (QGraphicsItem *item : qAsConst(scenePosItems)) {
QGraphicsItem *p = item->d_ptr->parent;
while (p) {
p->d_ptr->scenePosDescendants = 1;
@@ -608,8 +609,8 @@ void QGraphicsScenePrivate::removeItemHelper(QGraphicsItem *item)
//attributes (e.g. sceneTransform).
if (!item->d_ptr->inDestructor) {
// Remove all children recursively
- for (int i = 0; i < item->d_ptr->children.size(); ++i)
- q->removeItem(item->d_ptr->children.at(i));
+ for (auto child : qAsConst(item->d_ptr->children))
+ q->removeItem(child);
}
if (!item->d_ptr->inDestructor && !item->parentItem() && item->isWidget()) {
@@ -717,8 +718,7 @@ void QGraphicsScenePrivate::removeItemHelper(QGraphicsItem *item)
emit q->selectionChanged();
#ifndef QT_NO_GESTURES
- QHash<QGesture *, QGraphicsObject *>::iterator it;
- for (it = gestureTargets.begin(); it != gestureTargets.end();) {
+ for (auto it = gestureTargets.begin(); it != gestureTargets.end();) {
if (it.value() == item)
it = gestureTargets.erase(it);
else
@@ -731,8 +731,9 @@ void QGraphicsScenePrivate::removeItemHelper(QGraphicsItem *item)
cachedAlreadyDeliveredGestures.remove(dummy);
}
- foreach (Qt::GestureType gesture, item->d_ptr->gestureContext.keys())
- ungrabGesture(item, gesture);
+ for (auto it = item->d_ptr->gestureContext.constBegin();
+ it != item->d_ptr->gestureContext.constEnd(); ++it)
+ ungrabGesture(item, it.key());
#endif // QT_NO_GESTURES
}
@@ -1114,7 +1115,7 @@ void QGraphicsScenePrivate::clearKeyboardGrabber()
void QGraphicsScenePrivate::enableMouseTrackingOnViews()
{
- foreach (QGraphicsView *view, views)
+ for (QGraphicsView *view : qAsConst(views))
view->viewport()->setMouseTracking(true);
}
@@ -1377,7 +1378,7 @@ void QGraphicsScenePrivate::mousePressEventHandler(QGraphicsSceneMouseEvent *mou
// Set focus on the topmost enabled item that can take focus.
bool setFocus = false;
- foreach (QGraphicsItem *item, cachedItemsUnderMouse) {
+ for (QGraphicsItem *item : qAsConst(cachedItemsUnderMouse)) {
if (item->isBlockedByModalPanel()
|| (item->d_ptr->flags & QGraphicsItem::ItemStopsFocusHandling)) {
// Make sure we don't clear focus.
@@ -1400,8 +1401,8 @@ void QGraphicsScenePrivate::mousePressEventHandler(QGraphicsSceneMouseEvent *mou
// Check for scene modality.
bool sceneModality = false;
- for (int i = 0; i < modalPanels.size(); ++i) {
- if (modalPanels.at(i)->panelModality() == QGraphicsItem::SceneModal) {
+ for (auto modalPanel : qAsConst(modalPanels)) {
+ if (modalPanel->panelModality() == QGraphicsItem::SceneModal) {
sceneModality = true;
break;
}
@@ -1419,7 +1420,7 @@ void QGraphicsScenePrivate::mousePressEventHandler(QGraphicsSceneMouseEvent *mou
// candidates one at a time, until the event is accepted. It's accepted by
// default, so the receiver has to explicitly ignore it for it to pass
// through.
- foreach (QGraphicsItem *item, cachedItemsUnderMouse) {
+ for (QGraphicsItem *item : qAsConst(cachedItemsUnderMouse)) {
if (!(item->acceptedMouseButtons() & mouseEvent->button())) {
// Skip items that don't accept the event's mouse button.
continue;
@@ -1693,8 +1694,10 @@ QGraphicsScene::~QGraphicsScene()
clear();
// Remove this scene from all associated views.
- for (int j = 0; j < d->views.size(); ++j)
- d->views.at(j)->setScene(nullptr);
+ // Note: d->views is modified by QGraphicsView::setScene, so must make a copy
+ const auto views = d->views;
+ for (auto view : qAsConst(views))
+ view->setScene(nullptr);
}
/*!
@@ -1812,7 +1815,7 @@ void QGraphicsScene::render(QPainter *painter, const QRectF &target, const QRect
// in reverse order).
QList<QGraphicsItem *> itemList = items(sourceRect, Qt::IntersectsItemBoundingRect);
QGraphicsItem **itemArray = new QGraphicsItem *[itemList.size()];
- int numItems = itemList.size();
+ const int numItems = itemList.size();
for (int i = 0; i < numItems; ++i)
itemArray[numItems - i - 1] = itemList.at(i);
itemList.clear();
@@ -1937,29 +1940,6 @@ void QGraphicsScene::setBspTreeDepth(int depth)
bspTree->setBspTreeDepth(depth);
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \property QGraphicsScene::sortCacheEnabled
- \brief whether sort caching is enabled
- \since 4.5
- \obsolete
-
- Since Qt 4.6, this property has no effect.
-*/
-bool QGraphicsScene::isSortCacheEnabled() const
-{
- Q_D(const QGraphicsScene);
- return d->sortCacheEnabled;
-}
-void QGraphicsScene::setSortCacheEnabled(bool enabled)
-{
- Q_D(QGraphicsScene);
- if (d->sortCacheEnabled == enabled)
- return;
- d->sortCacheEnabled = enabled;
-}
-#endif
-
/*!
Calculates and returns the bounding rect of all items on the scene. This
function works by iterating over all items, and because of this, it can
@@ -1990,18 +1970,6 @@ QList<QGraphicsItem *> QGraphicsScene::items(Qt::SortOrder order) const
}
/*!
- \fn QList<QGraphicsItem *> QGraphicsScene::items(qreal x, qreal y, qreal w, qreal h, Qt::ItemSelectionMode mode) const
- \obsolete
- \since 4.3
-
- This convenience function is equivalent to calling items(QRectF(\a x, \a y, \a w, \a h), \a mode).
-
- This function is deprecated and returns incorrect results if the scene
- contains items that ignore transformations. Use the overload that takes
- a QTransform instead.
-*/
-
-/*!
\fn QList<QGraphicsItem *> QGraphicsScene::items(qreal x, qreal y, qreal w, qreal h, Qt::ItemSelectionMode mode, Qt::SortOrder order, const QTransform &deviceTransform) const
\overload
\since 4.6
@@ -2150,23 +2118,6 @@ QList<QGraphicsItem *> QGraphicsScene::collidingItems(const QGraphicsItem *item,
}
/*!
- \fn QGraphicsItem *QGraphicsScene::itemAt(const QPointF &position) const
- \overload
- \obsolete
-
- Returns the topmost visible item at the specified \a position, or
- \nullptr if there are no items at this position.
-
- This function is deprecated and returns incorrect results if the scene
- contains items that ignore transformations. Use the overload that takes
- a QTransform instead.
-
- Note: See items() for a definition of which items are considered visible by this function.
-
- \sa items(), collidingItems(), {QGraphicsItem#Sorting}{Sorting}
-*/
-
-/*!
\since 4.6
Returns the topmost visible item at the specified \a position, or \nullptr
@@ -2204,24 +2155,6 @@ QGraphicsItem *QGraphicsScene::itemAt(const QPointF &position, const QTransform
*/
/*!
- \fn QGraphicsScene::itemAt(qreal x, qreal y) const
- \overload
- \obsolete
-
- Returns the topmost visible item at the position specified by (\a x, \a
- y), or \nullptr if there are no items at this position.
-
- This convenience function is equivalent to calling \c
- {itemAt(QPointF(x, y))}.
-
- This function is deprecated and returns incorrect results if the scene
- contains items that ignore transformations. Use the overload that takes
- a QTransform instead.
-
- Note: See items() for a definition of which items are considered visible by this function.
-*/
-
-/*!
Returns a list of all currently selected items. The items are
returned in no particular order.
@@ -2234,7 +2167,7 @@ QList<QGraphicsItem *> QGraphicsScene::selectedItems() const
// Optimization: Lazily removes items that are not selected.
QGraphicsScene *that = const_cast<QGraphicsScene *>(this);
QSet<QGraphicsItem *> actuallySelectedSet;
- foreach (QGraphicsItem *item, that->d_func()->selectedItems) {
+ for (QGraphicsItem *item : qAsConst(that->d_func()->selectedItems)) {
if (item->isSelected())
actuallySelectedSet << item;
}
@@ -2274,25 +2207,7 @@ QPainterPath QGraphicsScene::selectionArea() const
*/
void QGraphicsScene::setSelectionArea(const QPainterPath &path, const QTransform &deviceTransform)
{
- setSelectionArea(path, Qt::IntersectsItemShape, deviceTransform);
-}
-
-/*!
- \overload
- \since 4.6
-
- Sets the selection area to \a path using \a mode to determine if items are
- included in the selection area.
-
- \a deviceTransform is the transformation that applies to the view, and needs to
- be provided if the scene contains items that ignore transformations.
-
- \sa clearSelection(), selectionArea()
-*/
-void QGraphicsScene::setSelectionArea(const QPainterPath &path, Qt::ItemSelectionMode mode,
- const QTransform &deviceTransform)
-{
- setSelectionArea(path, Qt::ReplaceSelection, mode, deviceTransform);
+ setSelectionArea(path, Qt::ReplaceSelection, Qt::IntersectsItemShape, deviceTransform);
}
/*!
@@ -2342,7 +2257,7 @@ void QGraphicsScene::setSelectionArea(const QPainterPath &path,
switch (selectionOperation) {
case Qt::ReplaceSelection:
// Deselect all items outside path.
- foreach (QGraphicsItem *item, unselectItems) {
+ for (QGraphicsItem *item : qAsConst(unselectItems)) {
item->setSelected(false);
changed = true;
}
@@ -2371,7 +2286,7 @@ void QGraphicsScene::clearSelection()
++d->selectionChanging;
bool changed = !d->selectedItems.isEmpty();
- foreach (QGraphicsItem *item, d->selectedItems)
+ for (QGraphicsItem *item : qAsConst(d->selectedItems))
item->setSelected(false);
d->selectedItems.clear();
@@ -2596,9 +2511,9 @@ void QGraphicsScene::addItem(QGraphicsItem *item)
}
#ifndef QT_NO_GESTURES
- const auto gestures = item->d_ptr->gestureContext.keys(); // FIXME: iterate over hash directly?
- for (Qt::GestureType gesture : gestures)
- d->grabGesture(item, gesture);
+ for (auto it = item->d_ptr->gestureContext.constBegin();
+ it != item->d_ptr->gestureContext.constEnd(); ++it)
+ d->grabGesture(item, it.key());
#endif
// Update selection lists
@@ -2629,8 +2544,8 @@ void QGraphicsScene::addItem(QGraphicsItem *item)
// Add all children recursively
item->d_ptr->ensureSortedChildren();
- for (int i = 0; i < item->d_ptr->children.size(); ++i)
- addItem(item->d_ptr->children.at(i));
+ for (auto child : qAsConst(item->d_ptr->children))
+ addItem(child);
// Resolve font and palette.
item->d_ptr->resolveFont(d->font.resolve());
@@ -3132,7 +3047,7 @@ void QGraphicsScene::setBackgroundBrush(const QBrush &brush)
{
Q_D(QGraphicsScene);
d->backgroundBrush = brush;
- foreach (QGraphicsView *view, d->views) {
+ for (QGraphicsView *view : qAsConst(d->views)) {
view->resetCachedContent();
view->viewport()->update();
}
@@ -3221,14 +3136,13 @@ void QGraphicsScene::update(const QRectF &rect)
d->updatedRects.clear();
if (directUpdates) {
// Update all views.
- for (int i = 0; i < d->views.size(); ++i)
- d->views.at(i)->d_func()->fullUpdatePending = true;
+ for (auto view : qAsConst(d->views))
+ view->d_func()->fullUpdatePending = true;
}
} else {
if (directUpdates) {
// Update all views.
- for (int i = 0; i < d->views.size(); ++i) {
- QGraphicsView *view = d->views.at(i);
+ for (auto view : qAsConst(d->views)) {
if (view->isTransformed())
view->d_func()->updateRectF(view->viewportTransform().mapRect(rect));
else
@@ -3817,25 +3731,24 @@ void QGraphicsScene::focusOutEvent(QFocusEvent *focusEvent)
*/
void QGraphicsScene::helpEvent(QGraphicsSceneHelpEvent *helpEvent)
{
-#ifdef QT_NO_TOOLTIP
+#if !QT_CONFIG(tooltip)
Q_UNUSED(helpEvent);
#else
// Find the first item that does tooltips
Q_D(QGraphicsScene);
- QList<QGraphicsItem *> itemsAtPos = d->itemsAtPosition(helpEvent->screenPos(),
- helpEvent->scenePos(),
- helpEvent->widget());
+ const QList<QGraphicsItem *> itemsAtPos = d->itemsAtPosition(helpEvent->screenPos(),
+ helpEvent->scenePos(),
+ helpEvent->widget());
QGraphicsItem *toolTipItem = nullptr;
- for (int i = 0; i < itemsAtPos.size(); ++i) {
- QGraphicsItem *tmp = itemsAtPos.at(i);
- if (tmp->d_func()->isProxyWidget()) {
+ for (auto item : itemsAtPos) {
+ if (item->d_func()->isProxyWidget()) {
// if the item is a proxy widget, the event is forwarded to it
- sendEvent(tmp, helpEvent);
+ sendEvent(item, helpEvent);
if (helpEvent->isAccepted())
return;
}
- if (!tmp->toolTip().isEmpty()) {
- toolTipItem = tmp;
+ if (!item->toolTip().isEmpty()) {
+ toolTipItem = item;
break;
}
}
@@ -3884,8 +3797,7 @@ bool QGraphicsScenePrivate::dispatchHoverEvent(QGraphicsSceneHoverEvent *hoverEv
}
QGraphicsItem *item = nullptr;
- for (int i = 0; i < cachedItemsUnderMouse.size(); ++i) {
- QGraphicsItem *tmp = cachedItemsUnderMouse.at(i);
+ for (auto tmp : qAsConst(cachedItemsUnderMouse)) {
if (itemAcceptsHoverEvents_helper(tmp)) {
item = tmp;
break;
@@ -3950,7 +3862,7 @@ bool QGraphicsScenePrivate::dispatchHoverEvent(QGraphicsSceneHoverEvent *hoverEv
*/
void QGraphicsScenePrivate::leaveScene(QWidget *viewport)
{
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
QToolTip::hideText();
#endif
QGraphicsView *view = qobject_cast<QGraphicsView *>(viewport->parent());
@@ -4503,10 +4415,9 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte
QRegion pixmapExposed;
QRectF exposedRect;
if (!itemCache->allExposed) {
- for (int i = 0; i < itemCache->exposed.size(); ++i) {
- QRectF r = itemCache->exposed.at(i);
- exposedRect |= r;
- pixmapExposed += itemToPixmap.mapRect(r).toAlignedRect();
+ for (const auto rect : qAsConst(itemCache->exposed)) {
+ exposedRect |= rect;
+ pixmapExposed += itemToPixmap.mapRect(rect).toAlignedRect();
}
} else {
exposedRect = brect;
@@ -4664,9 +4575,8 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte
// Map the item's logical expose to pixmap coordinates.
QRegion pixmapExposed = scrollExposure;
if (!itemCache->allExposed) {
- const QVector<QRectF> &exposed = itemCache->exposed;
- for (int i = 0; i < exposed.size(); ++i)
- pixmapExposed += itemToPixmap.mapRect(exposed.at(i)).toRect().adjusted(-1, -1, 1, 1);
+ for (const auto rect : qAsConst(itemCache->exposed))
+ pixmapExposed += itemToPixmap.mapRect(rect).toRect().adjusted(-1, -1, 1, 1);
}
// Calculate the style option's exposedRect.
@@ -4674,11 +4584,10 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte
if (itemCache->allExposed) {
br = item->boundingRect();
} else {
- const QVector<QRectF> &exposed = itemCache->exposed;
- for (int i = 0; i < exposed.size(); ++i)
- br |= exposed.at(i);
+ for (const auto rect : qAsConst(itemCache->exposed))
+ br |= rect;
QTransform pixmapToItem = itemToPixmap.inverted();
- for (const QRect &r : scrollExposure)
+ for (const QRect &r : qAsConst(scrollExposure))
br |= pixmapToItem.mapRect(r);
}
styleOptionTmp = *option;
@@ -4731,8 +4640,8 @@ void QGraphicsScenePrivate::drawItems(QPainter *painter, const QTransform *const
exposedSceneRect = viewTransform->inverted().mapRect(exposedSceneRect);
}
const QList<QGraphicsItem *> tli = index->estimateTopLevelItems(exposedSceneRect, Qt::AscendingOrder);
- for (int i = 0; i < tli.size(); ++i)
- drawSubtreeRecursive(tli.at(i), painter, viewTransform, exposedRegion, widget);
+ for (const auto subTree : tli)
+ drawSubtreeRecursive(subTree, painter, viewTransform, exposedRegion, widget);
}
void QGraphicsScenePrivate::drawSubtreeRecursive(QGraphicsItem *item, QPainter *painter,
@@ -4901,9 +4810,11 @@ void QGraphicsScenePrivate::draw(QGraphicsItem *item, QPainter *painter, const Q
qreal opacity, const QTransform *effectTransform,
bool wasDirtyParentSceneTransform, bool drawItem)
{
+ const auto children = item->d_ptr->children;
+
const bool itemIsFullyTransparent = QGraphicsItemPrivate::isOpacityNull(opacity);
const bool itemClipsChildrenToShape = (item->d_ptr->flags & QGraphicsItem::ItemClipsChildrenToShape);
- const bool itemHasChildren = !item->d_ptr->children.isEmpty();
+ const bool itemHasChildren = !children.isEmpty();
bool setChildClip = itemClipsChildrenToShape;
bool itemHasChildrenStackedBehind = false;
@@ -4915,7 +4826,7 @@ void QGraphicsScenePrivate::draw(QGraphicsItem *item, QPainter *painter, const Q
item->d_ptr->ensureSortedChildren();
// Items with the 'ItemStacksBehindParent' flag are put in front of the list
// so all we have to do is to check the first item.
- itemHasChildrenStackedBehind = (item->d_ptr->children.at(0)->d_ptr->flags
+ itemHasChildrenStackedBehind = (children.at(0)->d_ptr->flags
& QGraphicsItem::ItemStacksBehindParent);
if (itemHasChildrenStackedBehind) {
@@ -4925,8 +4836,8 @@ void QGraphicsScenePrivate::draw(QGraphicsItem *item, QPainter *painter, const Q
}
// Draw children behind
- for (i = 0; i < item->d_ptr->children.size(); ++i) {
- QGraphicsItem *child = item->d_ptr->children.at(i);
+ for (i = 0; i < children.size(); ++i) {
+ QGraphicsItem *child = children.at(i);
if (wasDirtyParentSceneTransform)
child->d_ptr->dirtySceneTransform = 1;
if (!(child->d_ptr->flags & QGraphicsItem::ItemStacksBehindParent))
@@ -5004,8 +4915,8 @@ void QGraphicsScenePrivate::draw(QGraphicsItem *item, QPainter *painter, const Q
if (setChildClip)
setClip(painter, item);
- for (; i < item->d_ptr->children.size(); ++i) {
- QGraphicsItem *child = item->d_ptr->children.at(i);
+ for (; i < children.size(); ++i) {
+ QGraphicsItem *child = children.at(i);
if (wasDirtyParentSceneTransform)
child->d_ptr->dirtySceneTransform = 1;
if (itemIsFullyTransparent && !(child->d_ptr->flags & QGraphicsItem::ItemIgnoresParentOpacity))
@@ -5083,8 +4994,8 @@ void QGraphicsScenePrivate::markDirty(QGraphicsItem *item, const QRectF &rect, b
return;
}
- for (int i = 0; i < views.size(); ++i) {
- QGraphicsViewPrivate *viewPrivate = views.at(i)->d_func();
+ for (auto view : qAsConst(views)) {
+ QGraphicsViewPrivate *viewPrivate = view->d_func();
QRect rect = item->d_ptr->paintedViewBoundingRects.value(viewPrivate->viewport);
rect.translate(viewPrivate->dirtyScrollOffset);
viewPrivate->updateRect(rect);
@@ -5239,8 +5150,7 @@ void QGraphicsScenePrivate::processDirtyItemsRecursive(QGraphicsItem *item, bool
QRectF dirtyRect;
bool uninitializedDirtyRect = true;
- for (int j = 0; j < views.size(); ++j) {
- QGraphicsView *view = views.at(j);
+ for (auto view : qAsConst(views)) {
QGraphicsViewPrivate *viewPrivate = view->d_func();
QRect &paintedViewBoundingRect = item->d_ptr->paintedViewBoundingRects[viewPrivate->viewport];
if (viewPrivate->fullUpdatePending
@@ -5298,8 +5208,8 @@ void QGraphicsScenePrivate::processDirtyItemsRecursive(QGraphicsItem *item, bool
const bool bypassUpdateClip = !itemHasContents && wasDirtyParentViewBoundingRects;
if (itemClipsChildrenToShape && !bypassUpdateClip) {
// Make sure child updates are clipped to the item's bounding rect.
- for (int i = 0; i < views.size(); ++i)
- views.at(i)->d_func()->setUpdateClip(item);
+ for (auto view : qAsConst(views))
+ view->d_func()->setUpdateClip(item);
}
if (!dirtyAncestorContainsChildren) {
dirtyAncestorContainsChildren = item->d_ptr->fullUpdatePending
@@ -5308,8 +5218,7 @@ void QGraphicsScenePrivate::processDirtyItemsRecursive(QGraphicsItem *item, bool
const bool allChildrenDirty = item->d_ptr->allChildrenDirty;
const bool parentIgnoresVisible = item->d_ptr->ignoreVisible;
const bool parentIgnoresOpacity = item->d_ptr->ignoreOpacity;
- for (int i = 0; i < item->d_ptr->children.size(); ++i) {
- QGraphicsItem *child = item->d_ptr->children.at(i);
+ for (auto child : qAsConst(item->d_ptr->children)) {
if (wasDirtyParentSceneTransform)
child->d_ptr->dirtySceneTransform = 1;
if (wasDirtyParentViewBoundingRects)
@@ -5329,8 +5238,8 @@ void QGraphicsScenePrivate::processDirtyItemsRecursive(QGraphicsItem *item, bool
if (itemClipsChildrenToShape) {
// Reset updateClip.
- for (int i = 0; i < views.size(); ++i)
- views.at(i)->d_func()->setUpdateClip(nullptr);
+ for (auto view : qAsConst(views))
+ view->d_func()->setUpdateClip(nullptr);
}
} else if (wasDirtyParentSceneTransform) {
item->d_ptr->invalidateChildrenSceneTransform();
@@ -5410,8 +5319,8 @@ void QGraphicsScene::drawItems(QPainter *painter,
d->rectAdjust = oldRectAdjust;
// Reset discovery bits.
- for (int i = 0; i < topLevelItems.size(); ++i)
- topLevelItems.at(i)->d_ptr->itemDiscovered = 0;
+ for (auto topLevelItem : qAsConst(topLevelItems))
+ topLevelItem->d_ptr->itemDiscovered = 0;
painter->setWorldTransform(viewTransform);
painter->setOpacity(opacity);
@@ -5903,9 +5812,9 @@ void QGraphicsScenePrivate::addView(QGraphicsView *view)
{
views << view;
#ifndef QT_NO_GESTURES
- const auto gestures = grabbedGestures.keys();
- for (Qt::GestureType gesture : gestures)
- view->viewport()->grabGesture(gesture);
+ for (auto it = grabbedGestures.constBegin();
+ it != grabbedGestures.constEnd(); ++it)
+ view->viewport()->grabGesture(it.key());
#endif
}
@@ -5930,7 +5839,7 @@ int QGraphicsScenePrivate::findClosestTouchPointId(const QPointF &scenePos)
{
int closestTouchPointId = -1;
qreal closestDistance = qreal(0.);
- foreach (const QTouchEvent::TouchPoint &touchPoint, sceneCurrentTouchPoints) {
+ for (const QTouchEvent::TouchPoint &touchPoint : qAsConst(sceneCurrentTouchPoints)) {
qreal distance = QLineF(scenePos, touchPoint.scenePos()).length();
if (closestTouchPointId == -1|| distance < closestDistance) {
closestTouchPointId = touchPoint.id();
@@ -5945,9 +5854,8 @@ void QGraphicsScenePrivate::touchEventHandler(QTouchEvent *sceneTouchEvent)
typedef QPair<Qt::TouchPointStates, QList<QTouchEvent::TouchPoint> > StatesAndTouchPoints;
QHash<QGraphicsItem *, StatesAndTouchPoints> itemsNeedingEvents;
- for (int i = 0; i < sceneTouchEvent->touchPoints().count(); ++i) {
- const QTouchEvent::TouchPoint &touchPoint = sceneTouchEvent->touchPoints().at(i);
-
+ const auto touchPoints = sceneTouchEvent->touchPoints();
+ for (const auto &touchPoint : touchPoints) {
// update state
QGraphicsItem *item = nullptr;
if (touchPoint.state() == Qt::TouchPointPressed) {
@@ -6045,12 +5953,11 @@ void QGraphicsScenePrivate::touchEventHandler(QTouchEvent *sceneTouchEvent)
// if the TouchBegin handler recurses, we assume that means the event
// has been implicitly accepted and continue to send touch events
item->d_ptr->acceptedTouchBeginEvent = true;
- bool res = sendTouchBeginEvent(item, &touchEvent)
- && touchEvent.isAccepted();
+ bool res = sendTouchBeginEvent(item, &touchEvent) && touchEvent.isAccepted();
if (!res) {
// forget about these touch points, we didn't handle them
- for (int i = 0; i < touchEvent.touchPoints().count(); ++i) {
- const QTouchEvent::TouchPoint &touchPoint = touchEvent.touchPoints().at(i);
+ const auto unhandledTouchPoints = touchEvent.touchPoints();
+ for (const auto &touchPoint : unhandledTouchPoints) {
itemForTouchPointId.remove(touchPoint.id());
sceneCurrentTouchPoints.remove(touchPoint.id());
}
@@ -6085,7 +5992,7 @@ bool QGraphicsScenePrivate::sendTouchBeginEvent(QGraphicsItem *origin, QTouchEve
// Set focus on the topmost enabled item that can take focus.
bool setFocus = false;
- foreach (QGraphicsItem *item, cachedItemsUnderMouse) {
+ for (QGraphicsItem *item : qAsConst(cachedItemsUnderMouse)) {
if (item->isEnabled() && ((item->flags() & QGraphicsItem::ItemIsFocusable) && item->d_ptr->mouseSetsFocus)) {
if (!item->isWidget() || ((QGraphicsWidget *)item)->focusPolicy() & Qt::ClickFocus) {
setFocus = true;
@@ -6112,7 +6019,7 @@ bool QGraphicsScenePrivate::sendTouchBeginEvent(QGraphicsItem *origin, QTouchEve
bool res = false;
bool eventAccepted = touchEvent->isAccepted();
- foreach (QGraphicsItem *item, cachedItemsUnderMouse) {
+ for (QGraphicsItem *item : qAsConst(cachedItemsUnderMouse)) {
// first, try to deliver the touch event
updateTouchPointsForItem(item, touchEvent);
bool acceptTouchEvents = item->acceptTouchEvents();
@@ -6128,10 +6035,9 @@ bool QGraphicsScenePrivate::sendTouchBeginEvent(QGraphicsItem *origin, QTouchEve
touchEvent->spont = false;
if (res && eventAccepted) {
// the first item to accept the TouchBegin gets an implicit grab.
- for (int i = 0; i < touchEvent->touchPoints().count(); ++i) {
- const QTouchEvent::TouchPoint &touchPoint = touchEvent->touchPoints().at(i);
+ const auto touchPoints = touchEvent->touchPoints();
+ for (const auto &touchPoint : touchPoints)
itemForTouchPointId[touchPoint.id()] = item; // can be zero
- }
break;
}
if (item && item->isPanel())
@@ -6144,14 +6050,14 @@ bool QGraphicsScenePrivate::sendTouchBeginEvent(QGraphicsItem *origin, QTouchEve
void QGraphicsScenePrivate::enableTouchEventsOnViews()
{
- foreach (QGraphicsView *view, views)
+ for (QGraphicsView *view : qAsConst(views))
view->viewport()->setAttribute(Qt::WA_AcceptTouchEvents, true);
}
void QGraphicsScenePrivate::updateInputMethodSensitivityInViews()
{
- for (int i = 0; i < views.size(); ++i)
- views.at(i)->d_func()->updateInputMethodSensitivity();
+ for (auto view : qAsConst(views))
+ view->d_func()->updateInputMethodSensitivity();
}
void QGraphicsScenePrivate::enterModal(QGraphicsItem *panel, QGraphicsItem::PanelModality previousModality)
@@ -6167,11 +6073,12 @@ void QGraphicsScenePrivate::enterModal(QGraphicsItem *panel, QGraphicsItem::Pane
}
QSet<QGraphicsItem *> blockedPanels;
- QList<QGraphicsItem *> items = q->items(); // ### store panels separately
- for (int i = 0; i < items.count(); ++i) {
- QGraphicsItem *item = items.at(i);
- if (item->isPanel() && item->isBlockedByModalPanel())
- blockedPanels.insert(item);
+ {
+ const auto items_ = q->items();
+ for (const auto &item : items_) {
+ if (item->isPanel() && item->isBlockedByModalPanel())
+ blockedPanels.insert(item);
+ }
}
// blockedPanels contains all currently blocked panels
@@ -6199,8 +6106,8 @@ void QGraphicsScenePrivate::enterModal(QGraphicsItem *panel, QGraphicsItem::Pane
QEvent windowBlockedEvent(QEvent::WindowBlocked);
QEvent windowUnblockedEvent(QEvent::WindowUnblocked);
- for (int i = 0; i < items.count(); ++i) {
- QGraphicsItem *item = items.at(i);
+ const auto items_ = q->items();
+ for (const auto &item : items_) {
if (item->isPanel()) {
if (!blockedPanels.contains(item) && item->isBlockedByModalPanel()) {
// send QEvent::WindowBlocked to newly blocked panels
@@ -6220,20 +6127,23 @@ void QGraphicsScenePrivate::leaveModal(QGraphicsItem *panel)
Q_ASSERT(panel && panel->isPanel());
QSet<QGraphicsItem *> blockedPanels;
- QList<QGraphicsItem *> items = q->items(); // ### same as above
- for (int i = 0; i < items.count(); ++i) {
- QGraphicsItem *item = items.at(i);
- if (item->isPanel() && item->isBlockedByModalPanel())
- blockedPanels.insert(item);
+ {
+ const auto items_ = q->items();
+ for (const auto &item : items_) {
+ if (item->isPanel() && item->isBlockedByModalPanel())
+ blockedPanels.insert(item);
+ }
}
modalPanels.removeAll(panel);
- QEvent e(QEvent::WindowUnblocked);
- for (int i = 0; i < items.count(); ++i) {
- QGraphicsItem *item = items.at(i);
- if (item->isPanel() && blockedPanels.contains(item) && !item->isBlockedByModalPanel())
- sendEvent(item, &e);
+ {
+ QEvent e(QEvent::WindowUnblocked);
+ const auto items_ = q->items();
+ for (const auto &item : items_) {
+ if (item->isPanel() && blockedPanels.contains(item) && !item->isBlockedByModalPanel())
+ sendEvent(item, &e);
+ }
}
// send GraphicsSceneHoverEnter events to newly unblocked items
@@ -6255,7 +6165,7 @@ void QGraphicsScenePrivate::gestureTargetsAtHotSpots(const QSet<QGesture *> &ges
if (!gesture->hasHotSpot())
continue;
const Qt::GestureType gestureType = gesture->gestureType();
- QList<QGraphicsItem *> items = itemsAtPosition(QPoint(), gesture->d_func()->sceneHotSpot, nullptr);
+ const QList<QGraphicsItem *> items = itemsAtPosition(QPoint(), gesture->d_func()->sceneHotSpot, nullptr);
for (int j = 0; j < items.size(); ++j) {
QGraphicsItem *item = items.at(j);
@@ -6427,9 +6337,9 @@ void QGraphicsScenePrivate::gestureEventHandler(QGestureEvent *event)
std::sort(cachedTargetItems.begin(), cachedTargetItems.end(), qt_closestItemFirst);
for (int i = 0; i < cachedTargetItems.size(); ++i) {
QPointer<QGraphicsObject> receiver = cachedTargetItems.at(i);
- QSet<QGesture *> gestures =
- undeliveredGestures & cachedItemGestures.value(receiver.data());
- gestures -= cachedAlreadyDeliveredGestures.value(receiver.data());
+ const QSet<QGesture *> gestures = (undeliveredGestures
+ & cachedItemGestures.value(receiver.data()))
+ - cachedAlreadyDeliveredGestures.value(receiver.data());
if (gestures.isEmpty())
continue;
@@ -6444,7 +6354,7 @@ void QGraphicsScenePrivate::gestureEventHandler(QGestureEvent *event)
ev.setWidget(event->widget());
sendEvent(receiver.data(), &ev);
QSet<QGesture *> ignoredGestures;
- for (QGesture *g : qAsConst(gestures)) {
+ for (QGesture *g : gestures) {
if (!ev.isAccepted() && !ev.isAccepted(g)) {
// if the gesture was ignored by its target, we will update the
// targetItems list with a possible target items (items that
@@ -6512,7 +6422,7 @@ void QGraphicsScenePrivate::gestureEventHandler(QGestureEvent *event)
}
}
- foreach (QGesture *g, startedGestures) {
+ for (QGesture *g : qAsConst(startedGestures)) {
if (g->gestureCancelPolicy() == QGesture::CancelAllInContext) {
DEBUG() << "lets try to cancel some";
// find gestures in context in Qt::GestureStarted or Qt::GestureUpdated state and cancel them
@@ -6594,17 +6504,17 @@ void QGraphicsScenePrivate::cancelGesturesForChildren(QGesture *original)
if (!g->hasHotSpot())
continue;
- QList<QGraphicsItem *> items = itemsAtPosition(QPoint(), g->d_func()->sceneHotSpot, nullptr);
- for (int j = 0; j < items.size(); ++j) {
- QGraphicsObject *item = items.at(j)->toGraphicsObject();
- if (!item)
+ const QList<QGraphicsItem *> items = itemsAtPosition(QPoint(), g->d_func()->sceneHotSpot, nullptr);
+ for (const auto &item : items) {
+ QGraphicsObject *object = item->toGraphicsObject();
+ if (!object)
continue;
- QGraphicsItemPrivate *d = item->QGraphicsItem::d_func();
+ QGraphicsItemPrivate *d = object->QGraphicsItem::d_func();
if (d->gestureContext.contains(g->gestureType())) {
QList<QGesture *> list;
list << g;
QGestureEvent ev(list);
- sendEvent(item, &ev);
+ sendEvent(object, &ev);
if (ev.isAccepted() || ev.isAccepted(g))
break; // successfully delivered
}
@@ -6625,7 +6535,7 @@ void QGraphicsScenePrivate::grabGesture(QGraphicsItem *, Qt::GestureType gesture
{
(void)QGestureManager::instance(); // create a gesture manager
if (!grabbedGestures[gesture]++) {
- foreach (QGraphicsView *view, views)
+ for (QGraphicsView *view : qAsConst(views))
view->viewport()->grabGesture(gesture);
}
}
@@ -6637,7 +6547,7 @@ void QGraphicsScenePrivate::ungrabGesture(QGraphicsItem *item, Qt::GestureType g
QGraphicsObject *obj = static_cast<QGraphicsObject *>(item);
QGestureManager::instance()->cleanupCachedGestures(obj, gesture);
if (!--grabbedGestures[gesture]) {
- foreach (QGraphicsView *view, views)
+ for (QGraphicsView *view : qAsConst(views))
view->viewport()->ungrabGesture(gesture);
}
}
diff --git a/src/widgets/graphicsview/qgraphicsscene.h b/src/widgets/graphicsview/qgraphicsscene.h
index 3ba9bddc32..a4cf5b4063 100644
--- a/src/widgets/graphicsview/qgraphicsscene.h
+++ b/src/widgets/graphicsview/qgraphicsscene.h
@@ -53,7 +53,6 @@ QT_REQUIRE_CONFIG(graphicsview);
QT_BEGIN_NAMESPACE
-template<typename T> class QList;
class QFocusEvent;
class QFont;
class QFontMetrics;
@@ -102,9 +101,6 @@ class Q_WIDGETS_EXPORT QGraphicsScene : public QObject
Q_PROPERTY(int bspTreeDepth READ bspTreeDepth WRITE setBspTreeDepth)
Q_PROPERTY(QPalette palette READ palette WRITE setPalette)
Q_PROPERTY(QFont font READ font WRITE setFont)
-#if QT_DEPRECATED_SINCE(5, 13)
- Q_PROPERTY(bool sortCacheEnabled READ isSortCacheEnabled WRITE setSortCacheEnabled)
-#endif
Q_PROPERTY(bool stickyFocus READ stickyFocus WRITE setStickyFocus)
Q_PROPERTY(qreal minimumRenderSize READ minimumRenderSize WRITE setMinimumRenderSize)
Q_PROPERTY(bool focusOnTouch READ focusOnTouch WRITE setFocusOnTouch)
@@ -142,11 +138,6 @@ public:
ItemIndexMethod itemIndexMethod() const;
void setItemIndexMethod(ItemIndexMethod method);
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED bool isSortCacheEnabled() const;
- QT_DEPRECATED void setSortCacheEnabled(bool enabled);
-#endif
-
int bspTreeDepth() const;
void setBspTreeDepth(int depth);
@@ -158,37 +149,19 @@ public:
QList<QGraphicsItem *> items(const QRectF &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const;
QList<QGraphicsItem *> items(const QPolygonF &polygon, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const;
QList<QGraphicsItem *> items(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const;
-
- QList<QGraphicsItem *> collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const;
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED inline QGraphicsItem *itemAt(const QPointF &position) const {
- QList<QGraphicsItem *> itemsAtPoint = items(position);
- return itemsAtPoint.isEmpty() ? nullptr : itemsAtPoint.first();
- }
-#endif
- QGraphicsItem *itemAt(const QPointF &pos, const QTransform &deviceTransform) const;
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED inline QList<QGraphicsItem *> items(qreal x, qreal y, qreal w, qreal h, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
- { return items(QRectF(x, y, w, h), mode); }
-#endif
inline QList<QGraphicsItem *> items(qreal x, qreal y, qreal w, qreal h, Qt::ItemSelectionMode mode, Qt::SortOrder order,
const QTransform &deviceTransform = QTransform()) const
{ return items(QRectF(x, y, w, h), mode, order, deviceTransform); }
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED inline QGraphicsItem *itemAt(qreal x, qreal y) const {
- QList<QGraphicsItem *> itemsAtPoint = items(QPointF(x, y));
- return itemsAtPoint.isEmpty() ? nullptr : itemsAtPoint.first();
- }
-#endif
+
+ QList<QGraphicsItem *> collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const;
+ QGraphicsItem *itemAt(const QPointF &pos, const QTransform &deviceTransform) const;
inline QGraphicsItem *itemAt(qreal x, qreal y, const QTransform &deviceTransform) const
{ return itemAt(QPointF(x, y), deviceTransform); }
QList<QGraphicsItem *> selectedItems() const;
QPainterPath selectionArea() const;
void setSelectionArea(const QPainterPath &path, const QTransform &deviceTransform);
- void setSelectionArea(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, const QTransform &deviceTransform = QTransform());
- void setSelectionArea(const QPainterPath &path, Qt::ItemSelectionOperation selectionOperation, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, const QTransform &deviceTransform = QTransform());
- // ### Qt6 merge the last 2 functions and add a default: Qt::ItemSelectionOperation selectionOperation = Qt::ReplaceSelection
+ void setSelectionArea(const QPainterPath &path, Qt::ItemSelectionOperation selectionOperation = Qt::ReplaceSelection, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, const QTransform &deviceTransform = QTransform());
QGraphicsItemGroup *createItemGroup(const QList<QGraphicsItem *> &items);
void destroyItemGroup(QGraphicsItemGroup *group);
diff --git a/src/widgets/graphicsview/qgraphicssceneevent.h b/src/widgets/graphicsview/qgraphicssceneevent.h
index 9d940be2c0..4a47b642fe 100644
--- a/src/widgets/graphicsview/qgraphicssceneevent.h
+++ b/src/widgets/graphicsview/qgraphicssceneevent.h
@@ -47,9 +47,6 @@
#include <QtCore/qrect.h>
#include <QtGui/qpolygon.h>
#include <QtCore/qset.h>
-#if QT_DEPRECATED_SINCE(5, 5)
-#include <QtCore/qhash.h>
-#endif
QT_REQUIRE_CONFIG(graphicsview);
diff --git a/src/widgets/graphicsview/qgraphicssceneindex_p.h b/src/widgets/graphicsview/qgraphicssceneindex_p.h
index b494c52671..e13c2a3cd3 100644
--- a/src/widgets/graphicsview/qgraphicssceneindex_p.h
+++ b/src/widgets/graphicsview/qgraphicssceneindex_p.h
@@ -67,7 +67,6 @@ QT_BEGIN_NAMESPACE
class QGraphicsSceneIndexPrivate;
class QPointF;
class QRectF;
-template<typename T> class QList;
typedef bool (*QGraphicsSceneIndexIntersector)(const QGraphicsItem *item, const QRectF &exposeRect, Qt::ItemSelectionMode mode,
const QTransform &deviceTransform, const void *data);
diff --git a/src/widgets/graphicsview/qgraphicsview.cpp b/src/widgets/graphicsview/qgraphicsview.cpp
index 90bddf6e84..ca14e03a72 100644
--- a/src/widgets/graphicsview/qgraphicsview.cpp
+++ b/src/widgets/graphicsview/qgraphicsview.cpp
@@ -198,8 +198,6 @@ static const int QGRAPHICSVIEW_PREALLOC_STYLE_OPTIONS = 503; // largest prime <
Note that setting a flag usually imposes a side effect, and this effect
can vary between paint devices and platforms.
- \value DontClipPainter This value is obsolete and has no effect.
-
\value DontSavePainterState When rendering, QGraphicsView protects the
painter state (see QPainter::save()) when rendering the background or
foreground, and when rendering each item. This allows you to leave the
@@ -292,7 +290,6 @@ static const int QGRAPHICSVIEW_PREALLOC_STYLE_OPTIONS = 503; // largest prime <
#include <QtGui/qevent.h>
#include <QtWidgets/qlayout.h>
#include <QtGui/qtransform.h>
-#include <QtGui/qmatrix.h>
#include <QtGui/qpainter.h>
#include <QtGui/qpainterpath.h>
#include <QtWidgets/qscrollbar.h>
@@ -616,6 +613,26 @@ void QGraphicsViewPrivate::updateScroll()
/*!
\internal
+
+ * don't start scrolling when a drag mode has been set
+ * don't start scrolling on a movable item
+*/
+bool QGraphicsViewPrivate::canStartScrollingAt(const QPoint &startPos) const
+{
+ Q_Q(const QGraphicsView);
+ if (q->dragMode() != QGraphicsView::NoDrag)
+ return false;
+
+ const QGraphicsItem *childItem = q->itemAt(startPos);
+
+ if (childItem && (childItem->flags() & QGraphicsItem::ItemIsMovable))
+ return false;
+
+ return QAbstractScrollAreaPrivate::canStartScrollingAt(startPos);
+}
+
+/*!
+ \internal
*/
void QGraphicsViewPrivate::replayLastMouseEvent()
{
@@ -694,7 +711,7 @@ void QGraphicsViewPrivate::mouseMoveEventHandler(QMouseEvent *event)
mouseEvent.widget());
}
// Find the topmost item under the mouse with a cursor.
- foreach (QGraphicsItem *item, scene->d_func()->cachedItemsUnderMouse) {
+ for (QGraphicsItem *item : qAsConst(scene->d_func()->cachedItemsUnderMouse)) {
if (item->isEnabled() && item->hasCursor()) {
_q_setViewportCursor(item->cursor());
return;
@@ -1825,75 +1842,6 @@ void QGraphicsView::setSceneRect(const QRectF &rect)
d->recalculateContentSize();
}
-#if QT_DEPRECATED_SINCE(5, 15)
-
-/*!
- \obsolete
-
- Use transform() instead.
-
- Returns the current transformation matrix for the view. If no current
- transformation is set, the identity matrix is returned.
-
- \sa setMatrix(), transform(), rotate(), scale(), shear(), translate()
-*/
-QMatrix QGraphicsView::matrix() const
-{
- Q_D(const QGraphicsView);
- return d->matrix.toAffine();
-}
-
-/*!
- \obsolete
-
- Use setTransform() instead.
-
- Sets the view's current transformation matrix to \a matrix.
-
- If \a combine is true, then \a matrix is combined with the current matrix;
- otherwise, \a matrix \e replaces the current matrix. \a combine is false
- by default.
-
- The transformation matrix tranforms the scene into view coordinates. Using
- the default transformation, provided by the identity matrix, one pixel in
- the view represents one unit in the scene (e.g., a 10x10 rectangular item
- is drawn using 10x10 pixels in the view). If a 2x2 scaling matrix is
- applied, the scene will be drawn in 1:2 (e.g., a 10x10 rectangular item is
- then drawn using 20x20 pixels in the view).
-
- Example:
-
- \snippet code/src_gui_graphicsview_qgraphicsview.cpp 3
-
- To simplify interation with items using a transformed view, QGraphicsView
- provides mapTo... and mapFrom... functions that can translate between
- scene and view coordinates. For example, you can call mapToScene() to map
- a view coordinate to a floating point scene coordinate, or mapFromScene()
- to map from floating point scene coordinates to view coordinates.
-
- \sa matrix(), setTransform(), rotate(), scale(), shear(), translate()
-*/
-void QGraphicsView::setMatrix(const QMatrix &matrix, bool combine)
-{
- setTransform(QTransform(matrix), combine);
-}
-
-/*!
- \obsolete
-
- Use resetTransform() instead.
-
- Resets the view transformation matrix to the identity matrix.
-
- \sa resetTransform()
-*/
-void QGraphicsView::resetMatrix()
-{
- resetTransform();
-}
-
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
/*!
Rotates the current view transformation \a angle degrees clockwise.
@@ -2807,7 +2755,7 @@ void QGraphicsView::setupViewport(QWidget *widget)
return;
}
- const bool isGLWidget = widget->inherits("QGLWidget") || widget->inherits("QOpenGLWidget");
+ const bool isGLWidget = widget->inherits("QOpenGLWidget");
d->accelerateScrolling = !(isGLWidget);
@@ -2940,7 +2888,7 @@ bool QGraphicsView::viewportEvent(QEvent *event)
QCoreApplication::sendEvent(d->scene, event);
break;
}
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
case QEvent::ToolTip: {
QHelpEvent *toolTip = static_cast<QHelpEvent *>(event);
QGraphicsSceneHelpEvent helpEvent(QEvent::GraphicsSceneHelp);
diff --git a/src/widgets/graphicsview/qgraphicsview.h b/src/widgets/graphicsview/qgraphicsview.h
index e98ec52d8f..e69a5e7104 100644
--- a/src/widgets/graphicsview/qgraphicsview.h
+++ b/src/widgets/graphicsview/qgraphicsview.h
@@ -107,12 +107,9 @@ public:
Q_ENUM(ViewportUpdateMode)
enum OptimizationFlag {
-#if QT_DEPRECATED_SINCE(5, 14)
- DontClipPainter Q_DECL_ENUMERATOR_DEPRECATED_X("This flag is unused") = 0x1, // obsolete
-#endif
- DontSavePainterState = 0x2,
- DontAdjustForAntialiasing = 0x4,
- IndirectPainting = 0x8
+ DontSavePainterState = 0x1,
+ DontAdjustForAntialiasing = 0x2,
+ IndirectPainting = 0x4
};
Q_DECLARE_FLAGS(OptimizationFlags, OptimizationFlag)
@@ -165,11 +162,6 @@ public:
void setSceneRect(const QRectF &rect);
inline void setSceneRect(qreal x, qreal y, qreal w, qreal h);
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_X("Use transform()") QMatrix matrix() const;
- QT_DEPRECATED_X("Use setTransform()") void setMatrix(const QMatrix &matrix, bool combine = false);
- QT_DEPRECATED_X("Use resetTransform()") void resetMatrix();
-#endif // QT_DEPRECATED_SINCE(5, 15)
QTransform transform() const;
QTransform viewportTransform() const;
bool isTransformed() const;
diff --git a/src/widgets/graphicsview/qgraphicsview_p.h b/src/widgets/graphicsview/qgraphicsview_p.h
index e877e6e887..b58505b057 100644
--- a/src/widgets/graphicsview/qgraphicsview_p.h
+++ b/src/widgets/graphicsview/qgraphicsview_p.h
@@ -117,6 +117,7 @@ public:
QTransform matrix;
qint64 scrollX, scrollY;
void updateScroll();
+ bool canStartScrollingAt(const QPoint &startPos) const override;
qreal leftIndent;
qreal topIndent;
diff --git a/src/widgets/graphicsview/qgraphicswidget.cpp b/src/widgets/graphicsview/qgraphicswidget.cpp
index 472d61d437..713763ad0f 100644
--- a/src/widgets/graphicsview/qgraphicswidget.cpp
+++ b/src/widgets/graphicsview/qgraphicswidget.cpp
@@ -232,9 +232,9 @@ QGraphicsWidget::~QGraphicsWidget()
Q_D(QGraphicsWidget);
#ifndef QT_NO_ACTION
// Remove all actions from this widget
- for (int i = 0; i < d->actions.size(); ++i) {
- QActionPrivate *apriv = d->actions.at(i)->d_func();
- apriv->graphicsWidgets.removeAll(this);
+ for (auto action : qAsConst(d->actions)) {
+ QActionPrivate *apriv = action->d_func();
+ apriv->associatedObjects.removeAll(this);
}
d->actions.clear();
#endif
@@ -2049,7 +2049,7 @@ void QGraphicsWidget::insertAction(QAction *before, QAction *action)
if (index == -1) {
QActionPrivate *apriv = action->d_func();
- apriv->graphicsWidgets.append(this);
+ apriv->associatedObjects.append(this);
}
QActionEvent e(QEvent::ActionAdded, action, before);
@@ -2092,7 +2092,7 @@ void QGraphicsWidget::removeAction(QAction *action)
Q_D(QGraphicsWidget);
QActionPrivate *apriv = action->d_func();
- apriv->graphicsWidgets.removeAll(this);
+ apriv->associatedObjects.removeAll(this);
if (d->actions.removeAll(action)) {
QActionEvent e(QEvent::ActionRemoved, action);
diff --git a/src/widgets/graphicsview/qgraphicswidget.h b/src/widgets/graphicsview/qgraphicswidget.h
index 8223b921c9..03852d0897 100644
--- a/src/widgets/graphicsview/qgraphicswidget.h
+++ b/src/widgets/graphicsview/qgraphicswidget.h
@@ -42,6 +42,9 @@
#include <QtWidgets/qtwidgetsglobal.h>
#include <QtGui/qfont.h>
+#if QT_CONFIG(action)
+# include <QtGui/qaction.h>
+#endif
#include <QtWidgets/qgraphicslayoutitem.h>
#include <QtWidgets/qgraphicsitem.h>
#include <QtGui/qpalette.h>
diff --git a/src/widgets/itemviews/qabstractitemdelegate.cpp b/src/widgets/itemviews/qabstractitemdelegate.cpp
index c5b22b5667..52d7d54595 100644
--- a/src/widgets/itemviews/qabstractitemdelegate.cpp
+++ b/src/widgets/itemviews/qabstractitemdelegate.cpp
@@ -45,7 +45,9 @@
#if QT_CONFIG(whatsthis)
#include <qwhatsthis.h>
#endif
+#if QT_CONFIG(tooltip)
#include <qtooltip.h>
+#endif
#include <qevent.h>
#include <qstring.h>
#include <qdebug.h>
@@ -345,28 +347,6 @@ bool QAbstractItemDelegate::editorEvent(QEvent *,
return false;
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \obsolete
-
- Use QFontMetrics::elidedText() instead.
-
- \oldcode
- QFontMetrics fm = ...
- QString str = QAbstractItemDelegate::elidedText(fm, width, mode, text);
- \newcode
- QFontMetrics fm = ...
- QString str = fm.elidedText(text, mode, width);
- \endcode
-*/
-
-QString QAbstractItemDelegate::elidedText(const QFontMetrics &fontMetrics, int width,
- Qt::TextElideMode mode, const QString &text)
-{
- return fontMetrics.elidedText(text, mode, width);
-}
-#endif
-
/*!
\since 4.3
Whenever a help event occurs, this function is called with the \a event
@@ -391,7 +371,7 @@ bool QAbstractItemDelegate::helpEvent(QHelpEvent *event,
return false;
Q_D(QAbstractItemDelegate);
switch (event->type()) {
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
case QEvent::ToolTip: {
QHelpEvent *he = static_cast<QHelpEvent*>(event);
const int precision = inherits("QItemDelegate") ? 10 : 6; // keep in sync with DBL_DIG in qitemdelegate.cpp
diff --git a/src/widgets/itemviews/qabstractitemdelegate.h b/src/widgets/itemviews/qabstractitemdelegate.h
index 5696e55691..13c764933a 100644
--- a/src/widgets/itemviews/qabstractitemdelegate.h
+++ b/src/widgets/itemviews/qabstractitemdelegate.h
@@ -103,12 +103,6 @@ public:
const QStyleOptionViewItem &option,
const QModelIndex &index);
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use QFontMetrics::elidedText() instead")
- static QString elidedText(const QFontMetrics &fontMetrics, int width,
- Qt::TextElideMode mode, const QString &text);
-#endif
-
virtual bool helpEvent(QHelpEvent *event,
QAbstractItemView *view,
const QStyleOptionViewItem &option,
diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp
index 3b2aebff15..2b44bac2f3 100644
--- a/src/widgets/itemviews/qabstractitemview.cpp
+++ b/src/widgets/itemviews/qabstractitemview.cpp
@@ -49,7 +49,9 @@
#endif
#include <qevent.h>
#include <qscrollbar.h>
+#if QT_CONFIG(tooltip)
#include <qtooltip.h>
+#endif
#include <qdatetime.h>
#if QT_CONFIG(lineedit)
#include <qlineedit.h>
@@ -2924,65 +2926,7 @@ void QAbstractItemView::editorDestroyed(QObject *editor)
setState(NoState);
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \obsolete
- Sets the horizontal scroll bar's steps per item to \a steps.
-
- This is the number of steps used by the horizontal scroll bar to
- represent the width of an item.
-
- Note that if the view has a horizontal header, the item steps
- will be ignored and the header section size will be used instead.
-
- \sa horizontalStepsPerItem(), setVerticalStepsPerItem()
-*/
-void QAbstractItemView::setHorizontalStepsPerItem(int steps)
-{
- Q_UNUSED(steps)
- // do nothing
-}
-
-/*!
- \obsolete
- Returns the horizontal scroll bar's steps per item.
-
- \sa setHorizontalStepsPerItem(), verticalStepsPerItem()
-*/
-int QAbstractItemView::horizontalStepsPerItem() const
-{
- return 1;
-}
-
-/*!
- \obsolete
- Sets the vertical scroll bar's steps per item to \a steps.
-
- This is the number of steps used by the vertical scroll bar to
- represent the height of an item.
-
- Note that if the view has a vertical header, the item steps
- will be ignored and the header section size will be used instead.
-
- \sa verticalStepsPerItem(), setHorizontalStepsPerItem()
-*/
-void QAbstractItemView::setVerticalStepsPerItem(int steps)
-{
- Q_UNUSED(steps)
- // do nothing
-}
-
-/*!
- \obsolete
- Returns the vertical scroll bar's steps per item.
- \sa setVerticalStepsPerItem(), horizontalStepsPerItem()
-*/
-int QAbstractItemView::verticalStepsPerItem() const
-{
- return 1;
-}
-#endif
/*!
Moves to and selects the item best matching the string \a search.
@@ -3341,8 +3285,19 @@ void QAbstractItemView::dataChanged(const QModelIndex &topLeft, const QModelInde
}
} else {
d->updateEditorData(topLeft, bottomRight);
- if (isVisible() && !d->delayedPendingLayout)
- d->viewport->update();
+ if (isVisible() && !d->delayedPendingLayout) {
+ if (!topLeft.isValid() ||
+ topLeft.parent() != bottomRight.parent() ||
+ topLeft.row() > bottomRight.row() ||
+ topLeft.column() > bottomRight.column()) {
+ // invalid parameter - call update() to redraw all
+ d->viewport->update();
+ } else {
+ const QRect updateRect = d->intersectedRect(d->viewport->rect(), topLeft, bottomRight);
+ if (!updateRect.isEmpty())
+ d->viewport->update(updateRect);
+ }
+ }
}
#ifndef QT_NO_ACCESSIBILITY
@@ -3626,6 +3581,19 @@ void QAbstractItemViewPrivate::_q_columnsMoved(const QModelIndex &, int, int, co
_q_layoutChanged();
}
+QRect QAbstractItemViewPrivate::intersectedRect(const QRect rect, const QModelIndex &topLeft, const QModelIndex &bottomRight) const
+{
+ Q_Q(const QAbstractItemView);
+
+ const auto parentIdx = topLeft.parent();
+ QRect updateRect;
+ for (int r = topLeft.row(); r <= bottomRight.row(); ++r) {
+ for (int c = topLeft.column(); c <= bottomRight.column(); ++c)
+ updateRect |= q->visualRect(model->index(r, c, parentIdx));
+ }
+ return rect.intersected(updateRect);
+}
+
/*!
This slot is called when the selection is changed. The previous
selection (which may be empty), is specified by \a deselected, and the
diff --git a/src/widgets/itemviews/qabstractitemview.h b/src/widgets/itemviews/qabstractitemview.h
index be8fa07c94..23226e0af8 100644
--- a/src/widgets/itemviews/qabstractitemview.h
+++ b/src/widgets/itemviews/qabstractitemview.h
@@ -272,13 +272,6 @@ Q_SIGNALS:
protected:
QAbstractItemView(QAbstractItemViewPrivate &, QWidget *parent = nullptr);
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED void setHorizontalStepsPerItem(int steps);
- QT_DEPRECATED int horizontalStepsPerItem() const;
- QT_DEPRECATED void setVerticalStepsPerItem(int steps);
- QT_DEPRECATED int verticalStepsPerItem() const;
-#endif
-
enum CursorAction { MoveUp, MoveDown, MoveLeft, MoveRight,
MoveHome, MoveEnd, MovePageUp, MovePageDown,
MoveNext, MovePrevious };
diff --git a/src/widgets/itemviews/qabstractitemview_p.h b/src/widgets/itemviews/qabstractitemview_p.h
index fe1c00248f..4b29b68b66 100644
--- a/src/widgets/itemviews/qabstractitemview_p.h
+++ b/src/widgets/itemviews/qabstractitemview_p.h
@@ -108,6 +108,7 @@ public:
virtual void _q_layoutChanged();
virtual void _q_rowsMoved(const QModelIndex &source, int sourceStart, int sourceEnd, const QModelIndex &destination, int destinationStart);
virtual void _q_columnsMoved(const QModelIndex &source, int sourceStart, int sourceEnd, const QModelIndex &destination, int destinationStart);
+ virtual QRect intersectedRect(const QRect rect, const QModelIndex &topLeft, const QModelIndex &bottomRight) const;
void _q_headerDataChanged() { doDelayedItemsLayout(); }
void _q_scrollerStateChanged();
diff --git a/src/widgets/itemviews/qdatawidgetmapper.cpp b/src/widgets/itemviews/qdatawidgetmapper.cpp
index 24039c42f6..74100c077e 100644
--- a/src/widgets/itemviews/qdatawidgetmapper.cpp
+++ b/src/widgets/itemviews/qdatawidgetmapper.cpp
@@ -383,6 +383,9 @@ QAbstractItemModel *QDataWidgetMapper::model() const
data from the model into the widget and from the widget to the model,
using QAbstractItemDelegate::setEditorData() and QAbstractItemDelegate::setModelData().
+ Any existing delegate will be removed, but not deleted. QDataWidgetMapper
+ does not take ownership of \a delegate.
+
The delegate also decides when to apply data and when to change the editor,
using QAbstractItemDelegate::commitData() and QAbstractItemDelegate::closeEditor().
diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp
index 84e2fd72a9..fce0834628 100644
--- a/src/widgets/itemviews/qheaderview.cpp
+++ b/src/widgets/itemviews/qheaderview.cpp
@@ -45,7 +45,9 @@
#include <qevent.h>
#include <qpainter.h>
#include <qscrollbar.h>
+#if QT_CONFIG(tooltip)
#include <qtooltip.h>
+#endif
#if QT_CONFIG(whatsthis)
#include <qwhatsthis.h>
#endif
@@ -1570,8 +1572,7 @@ void QHeaderView::resetDefaultSectionSize()
\brief the minimum size of the header sections.
The minimum section size is the smallest section size allowed. If the
- minimum section size is set to -1, QHeaderView will use the maximum of
- the \l{QApplication::globalStrut()}{global strut} or the
+ minimum section size is set to -1, QHeaderView will use the
\l{fontMetrics()}{font metrics} size.
This property is honored by all \l{ResizeMode}{resize modes}.
@@ -1582,11 +1583,10 @@ int QHeaderView::minimumSectionSize() const
{
Q_D(const QHeaderView);
if (d->minimumSectionSize == -1) {
- QSize strut = QApplication::globalStrut();
int margin = 2 * style()->pixelMetric(QStyle::PM_HeaderMargin, nullptr, this);
if (d->orientation == Qt::Horizontal)
- return qMax(strut.width(), (fontMetrics().maxWidth() + margin));
- return qMax(strut.height(), (fontMetrics().height() + margin));
+ return fontMetrics().maxWidth() + margin;
+ return fontMetrics().height() + margin;
}
return d->minimumSectionSize;
}
@@ -2758,7 +2758,7 @@ bool QHeaderView::viewportEvent(QEvent *e)
{
Q_D(QHeaderView);
switch (e->type()) {
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
case QEvent::ToolTip: {
QHelpEvent *he = static_cast<QHelpEvent*>(e);
int logical = logicalIndexAt(he->pos());
diff --git a/src/widgets/itemviews/qheaderview.h b/src/widgets/itemviews/qheaderview.h
index 7e950add1f..a376662763 100644
--- a/src/widgets/itemviews/qheaderview.h
+++ b/src/widgets/itemviews/qheaderview.h
@@ -115,19 +115,11 @@ public:
void setSectionsMovable(bool movable);
bool sectionsMovable() const;
-#if QT_DEPRECATED_SINCE(5, 0)
- inline QT_DEPRECATED void setMovable(bool movable) { setSectionsMovable(movable); }
- inline QT_DEPRECATED bool isMovable() const { return sectionsMovable(); }
-#endif
void setFirstSectionMovable(bool movable);
bool isFirstSectionMovable() const;
void setSectionsClickable(bool clickable);
bool sectionsClickable() const;
-#if QT_DEPRECATED_SINCE(5, 0)
- inline QT_DEPRECATED void setClickable(bool clickable) { setSectionsClickable(clickable); }
- inline QT_DEPRECATED bool isClickable() const { return sectionsClickable(); }
-#endif
void setHighlightSections(bool highlight);
bool highlightSections() const;
@@ -139,15 +131,6 @@ public:
void setResizeContentsPrecision(int precision);
int resizeContentsPrecision() const;
-#if QT_DEPRECATED_SINCE(5, 0)
- inline QT_DEPRECATED void setResizeMode(ResizeMode mode)
- { setSectionResizeMode(mode); }
- inline QT_DEPRECATED void setResizeMode(int logicalindex, ResizeMode mode)
- { setSectionResizeMode(logicalindex, mode); }
- inline QT_DEPRECATED ResizeMode resizeMode(int logicalindex) const
- { return sectionResizeMode(logicalindex); }
-#endif
-
int stretchSectionCount() const;
void setSortIndicatorShown(bool show);
diff --git a/src/widgets/itemviews/qitemdelegate.cpp b/src/widgets/itemviews/qitemdelegate.cpp
index 40ad48c655..407610336c 100644
--- a/src/widgets/itemviews/qitemdelegate.cpp
+++ b/src/widgets/itemviews/qitemdelegate.cpp
@@ -1001,20 +1001,6 @@ static QString qPixmapSerial(quint64 i, bool enabled)
return QString((const QChar *)ptr, int(&arr[sizeof(arr) / sizeof(ushort)] - ptr));
}
-#if QT_DEPRECATED_SINCE(5, 13)
-QPixmap *QItemDelegate::selected(const QPixmap &pixmap, const QPalette &palette, bool enabled) const
-{
- const QString key = qPixmapSerial(pixmap.cacheKey(), enabled);
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- QPixmap *pm = QPixmapCache::find(key);
- if (pm)
- return pm;
- selectedPixmap(pixmap, palette, enabled);
- return QPixmapCache::find(key);
-QT_WARNING_POP
-}
-#endif
/*!
\internal
diff --git a/src/widgets/itemviews/qitemdelegate.h b/src/widgets/itemviews/qitemdelegate.h
index e504615fb2..bbc088eebc 100644
--- a/src/widgets/itemviews/qitemdelegate.h
+++ b/src/widgets/itemviews/qitemdelegate.h
@@ -114,10 +114,6 @@ protected:
QPixmap decoration(const QStyleOptionViewItem &option, const QVariant &variant) const;
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X("Use selectedPixmap() instead")
- QPixmap *selected(const QPixmap &pixmap, const QPalette &palette, bool enabled) const;
-#endif
static QPixmap selectedPixmap(const QPixmap &pixmap, const QPalette &palette, bool enabled);
QRect doCheck(const QStyleOptionViewItem &option, const QRect &bounding,
diff --git a/src/widgets/itemviews/qitemeditorfactory.cpp b/src/widgets/itemviews/qitemeditorfactory.cpp
index fe9b482122..b29fd373bc 100644
--- a/src/widgets/itemviews/qitemeditorfactory.cpp
+++ b/src/widgets/itemviews/qitemeditorfactory.cpp
@@ -577,8 +577,7 @@ void QExpandingLineEdit::updateMinimumWidth()
QStyleOptionFrame opt;
initStyleOption(&opt);
- int minWidth = style()->sizeFromContents(QStyle::CT_LineEdit, &opt, QSize(width, 0).
- expandedTo(QApplication::globalStrut()), this).width();
+ int minWidth = style()->sizeFromContents(QStyle::CT_LineEdit, &opt, QSize(width, 0), this).width();
setMinimumWidth(minWidth);
}
diff --git a/src/widgets/itemviews/qlistwidget.cpp b/src/widgets/itemviews/qlistwidget.cpp
index c9379f9a8a..7e360f9be8 100644
--- a/src/widgets/itemviews/qlistwidget.cpp
+++ b/src/widgets/itemviews/qlistwidget.cpp
@@ -112,7 +112,7 @@ void QListModel::insert(int row, QListWidgetItem *item)
QList<QListWidgetItem*>::iterator it;
it = sortedInsertionIterator(items.begin(), items.end(),
item->view->sortOrder(), item);
- row = qMax(it - items.begin(), 0);
+ row = qMax<qsizetype>(it - items.begin(), 0);
} else {
if (row < 0)
row = 0;
@@ -227,7 +227,6 @@ bool QListModel::setData(const QModelIndex &index, const QVariant &value, int ro
return true;
}
-#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
bool QListModel::clearItemData(const QModelIndex &index)
{
if (!checkIndex(index, CheckIndexOption::IndexIsValid))
@@ -241,7 +240,6 @@ bool QListModel::clearItemData(const QModelIndex &index)
emit dataChanged(index, index, QVector<int>{});
return true;
}
-#endif
QMap<int, QVariant> QListModel::itemData(const QModelIndex &index) const
{
@@ -398,7 +396,7 @@ void QListModel::ensureSorted(int column, Qt::SortOrder order, int start, int en
--tmpitepos;
lit = tmp.begin() + tmpitepos;
lit = sortedInsertionIterator(lit, tmp.end(), order, item);
- int newRow = qMax(lit - tmp.begin(), 0);
+ int newRow = qMax<qsizetype>(lit - tmp.begin(), 0);
lit = tmp.insert(lit, item);
if (newRow != oldRow) {
changed = true;
@@ -937,15 +935,6 @@ QDataStream &operator>>(QDataStream &in, QListWidgetItem &item)
\sa Qt::AlignmentFlag
*/
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \fn QColor QListWidgetItem::backgroundColor() const
- \obsolete
-
- This function is deprecated. Use background() instead.
-*/
-#endif
-
/*!
\fn QBrush QListWidgetItem::background() const
\since 4.2
@@ -955,17 +944,6 @@ QDataStream &operator>>(QDataStream &in, QListWidgetItem &item)
\sa setBackground(), foreground()
*/
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \fn QColor QListWidgetItem::textColor() const
- \obsolete
-
- Returns the color used to display the list item's text.
-
- This function is deprecated. Use foreground() instead.
-*/
-#endif
-
/*!
\fn QBrush QListWidgetItem::foreground() const
\since 4.2
@@ -1116,13 +1094,6 @@ void QListWidgetItem::setFlags(Qt::ItemFlags aflags)
*/
/*!
- \fn void QListWidgetItem::setBackgroundColor(const QColor &color)
- \obsolete
-
- This function is deprecated. Use setBackground() instead.
-*/
-
-/*!
\fn void QListWidgetItem::setBackground(const QBrush &brush)
\since 4.2
@@ -1133,15 +1104,6 @@ void QListWidgetItem::setFlags(Qt::ItemFlags aflags)
\sa background(), setForeground()
*/
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \fn void QListWidgetItem::setTextColor(const QColor &color)
- \obsolete
-
- This function is deprecated. Use setForeground() instead.
-*/
-#endif
-
/*!
\fn void QListWidgetItem::setForeground(const QBrush &brush)
\since 4.2
@@ -1791,34 +1753,6 @@ void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)
QAbstractItemView::setIndexWidget(index, widget);
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- Returns \c true if \a item is selected; otherwise returns \c false.
-
- \obsolete
-
- This function is deprecated. Use QListWidgetItem::isSelected() instead.
-*/
-bool QListWidget::isItemSelected(const QListWidgetItem *item) const
-{
- return ((item && item->listWidget() == this) ? item->isSelected() : false);
-}
-
-/*!
- Selects or deselects the given \a item depending on whether \a select is
- true of false.
-
- \obsolete
-
- This function is deprecated. Use QListWidgetItem::setSelected() instead.
-*/
-void QListWidget::setItemSelected(const QListWidgetItem *item, bool select)
-{
- if (item && item->listWidget() == this)
- const_cast<QListWidgetItem*>(item)->setSelected(select);
-}
-#endif
-
/*!
Returns a list of all selected items in the list widget.
*/
@@ -1853,32 +1787,6 @@ QList<QListWidgetItem*> QListWidget::findItems(const QString &text, Qt::MatchFla
return items;
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- Returns \c true if the \a item is explicitly hidden; otherwise returns \c false.
-
- \obsolete
-
- This function is deprecated. Use QListWidgetItem::isHidden() instead.
-*/
-bool QListWidget::isItemHidden(const QListWidgetItem *item) const
-{
- return isRowHidden(row(item));
-}
-
-/*!
- If \a hide is true, the \a item will be hidden; otherwise it will be shown.
-
- \obsolete
-
- This function is deprecated. Use QListWidgetItem::setHidden() instead.
-*/
-void QListWidget::setItemHidden(const QListWidgetItem *item, bool hide)
-{
- setRowHidden(row(item), hide);
-}
-#endif
-
/*!
Scrolls the view if necessary to ensure that the \a item is visible.
@@ -1923,11 +1831,7 @@ QStringList QListWidget::mimeTypes() const
If the list of items is empty, \nullptr is returned instead of a
serialized empty list.
*/
-#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
QMimeData *QListWidget::mimeData(const QList<QListWidgetItem *> &items) const
-#else
-QMimeData *QListWidget::mimeData(const QList<QListWidgetItem*> items) const
-#endif
{
Q_D(const QListWidget);
@@ -2050,18 +1954,6 @@ QModelIndex QListWidget::indexFromItem(const QListWidgetItem *item) const
return d->listModel()->index(item);
}
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-/*!
- \internal
- \obsolete
- \overload
-*/
-QModelIndex QListWidget::indexFromItem(QListWidgetItem *item) const
-{
- return indexFromItem(const_cast<const QListWidgetItem *>(item));
-}
-#endif
-
/*!
Returns a pointer to the QListWidgetItem associated with the given \a index.
*/
diff --git a/src/widgets/itemviews/qlistwidget.h b/src/widgets/itemviews/qlistwidget.h
index 1319d658ab..b2435cf36e 100644
--- a/src/widgets/itemviews/qlistwidget.h
+++ b/src/widgets/itemviews/qlistwidget.h
@@ -93,7 +93,7 @@ public:
{ return data(Qt::StatusTipRole).toString(); }
inline void setStatusTip(const QString &statusTip);
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
inline QString toolTip() const
{ return data(Qt::ToolTipRole).toString(); }
inline void setToolTip(const QString &toolTip);
@@ -114,30 +114,11 @@ public:
inline void setTextAlignment(int alignment)
{ setData(Qt::TextAlignmentRole, alignment); }
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QListWidgetItem::background() instead")
- inline QColor backgroundColor() const
- { return qvariant_cast<QColor>(data(Qt::BackgroundRole)); }
-#endif
- // no QT_DEPRECATED_SINCE because it is a virtual function
- QT_DEPRECATED_X ("Use QListWidgetItem::setBackground() instead")
- virtual void setBackgroundColor(const QColor &color)
- { setData(Qt::BackgroundRole, color); }
-
inline QBrush background() const
{ return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); }
inline void setBackground(const QBrush &brush)
{ setData(Qt::BackgroundRole, brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QListWidgetItem::foreground() instead")
- inline QColor textColor() const
- { return qvariant_cast<QColor>(data(Qt::ForegroundRole)); }
- QT_DEPRECATED_X ("Use QListWidgetItem::setForeground() instead")
- inline void setTextColor(const QColor &color)
- { setData(Qt::ForegroundRole, color); }
-#endif
-
inline QBrush foreground() const
{ return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); }
inline void setForeground(const QBrush &brush)
@@ -184,7 +165,7 @@ inline void QListWidgetItem::setIcon(const QIcon &aicon)
inline void QListWidgetItem::setStatusTip(const QString &astatusTip)
{ setData(Qt::StatusTipRole, astatusTip); }
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
inline void QListWidgetItem::setToolTip(const QString &atoolTip)
{ setData(Qt::ToolTipRole, atoolTip); }
#endif
@@ -256,24 +237,15 @@ public:
void setItemWidget(QListWidgetItem *item, QWidget *widget);
inline void removeItemWidget(QListWidgetItem *item);
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QListWidgetItem::isSelected() instead")
- bool isItemSelected(const QListWidgetItem *item) const;
- QT_DEPRECATED_X ("Use QListWidgetItem::setSelected() instead")
- void setItemSelected(const QListWidgetItem *item, bool select);
-#endif
QList<QListWidgetItem*> selectedItems() const;
QList<QListWidgetItem*> findItems(const QString &text, Qt::MatchFlags flags) const;
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QListWidgetItem::isHidden() instead")
- bool isItemHidden(const QListWidgetItem *item) const;
- QT_DEPRECATED_X ("Use QListWidgetItem::setHidden() instead")
- void setItemHidden(const QListWidgetItem *item, bool hide);
-#endif
-#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ QList<QListWidgetItem*> items(const QMimeData *data) const;
+
+ QModelIndex indexFromItem(const QListWidgetItem *item) const;
+ QListWidgetItem *itemFromIndex(const QModelIndex &index) const;
+
protected:
-#endif
#if QT_CONFIG(draganddrop)
void dropEvent(QDropEvent *event) override;
#endif
@@ -299,29 +271,12 @@ Q_SIGNALS:
protected:
bool event(QEvent *e) override;
virtual QStringList mimeTypes() const;
-#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
virtual QMimeData *mimeData(const QList<QListWidgetItem *> &items) const;
-#else
- virtual QMimeData *mimeData(const QList<QListWidgetItem*> items) const;
-#endif
#if QT_CONFIG(draganddrop)
virtual bool dropMimeData(int index, const QMimeData *data, Qt::DropAction action);
virtual Qt::DropActions supportedDropActions() const;
#endif
-#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
-public:
-#else
-protected:
-#endif
- QList<QListWidgetItem*> items(const QMimeData *data) const;
-
- QModelIndex indexFromItem(const QListWidgetItem *item) const;
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- QModelIndex indexFromItem(QListWidgetItem *item) const; // ### Qt 6: remove
-#endif
- QListWidgetItem *itemFromIndex(const QModelIndex &index) const;
-
private:
void setModel(QAbstractItemModel *model) override;
Qt::SortOrder sortOrder() const;
diff --git a/src/widgets/itemviews/qtableview.cpp b/src/widgets/itemviews/qtableview.cpp
index a8da6530a4..b27103674e 100644
--- a/src/widgets/itemviews/qtableview.cpp
+++ b/src/widgets/itemviews/qtableview.cpp
@@ -669,6 +669,52 @@ void QTableViewPrivate::trimHiddenSelections(QItemSelectionRange *range) const
*range = QItemSelectionRange(topLeft, bottomRight);
}
+QRect QTableViewPrivate::intersectedRect(const QRect rect, const QModelIndex &topLeft, const QModelIndex &bottomRight) const
+{
+ Q_Q(const QTableView);
+
+ using minMaxPair = std::pair<int, int>;
+ const auto calcMinMax = [q](QHeaderView *hdr, int startIdx, int endIdx, minMaxPair bounds) -> minMaxPair
+ {
+ minMaxPair ret(std::numeric_limits<int>::max(), std::numeric_limits<int>::min());
+ if (hdr->sectionsMoved()) {
+ for (int i = startIdx; i <= endIdx; ++i) {
+ const int start = hdr->sectionViewportPosition(i);
+ const int end = start + hdr->sectionSize(i);
+ ret.first = std::min(start, ret.first);
+ ret.second = std::max(end, ret.second);
+ if (ret.first <= bounds.first && ret.second >= bounds.second)
+ break;
+ }
+ } else {
+ if (q->isRightToLeft() && q->horizontalHeader() == hdr)
+ std::swap(startIdx, endIdx);
+ ret.first = hdr->sectionViewportPosition(startIdx);
+ ret.second = hdr->sectionViewportPosition(endIdx) +
+ hdr->sectionSize(endIdx);
+ }
+ return ret;
+ };
+
+ const auto yVals = calcMinMax(verticalHeader, topLeft.row(), bottomRight.row(),
+ minMaxPair(rect.top(), rect.bottom()));
+ if (yVals.first == yVals.second) // all affected rows are hidden
+ return QRect();
+
+ // short circuit: check if no row is inside rect
+ const QRect colRect(QPoint(rect.left(), yVals.first),
+ QPoint(rect.right(), yVals.second));
+ const QRect intersected = rect.intersected(colRect);
+ if (intersected.isNull())
+ return QRect();
+
+ const auto xVals = calcMinMax(horizontalHeader, topLeft.column(), bottomRight.column(),
+ minMaxPair(rect.left(), rect.right()));
+ const QRect updateRect(QPoint(xVals.first, yVals.first),
+ QPoint(xVals.second, yVals.second));
+ return rect.intersected(updateRect);
+}
+
/*!
\internal
Sets the span for the cell at (\a row, \a column).
@@ -3173,22 +3219,6 @@ void QTableView::resizeColumnsToContents()
d->horizontalHeader->resizeSections(QHeaderView::ResizeToContents);
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \obsolete
- \overload
-
- This function is deprecated. Use
- sortByColumn(int column, Qt::SortOrder order) instead.
- Sorts the model by the values in the given \a column.
-*/
-void QTableView::sortByColumn(int column)
-{
- Q_D(QTableView);
- sortByColumn(column, d->horizontalHeader->sortIndicatorOrder());
-}
-#endif
-
/*!
\since 4.2
diff --git a/src/widgets/itemviews/qtableview.h b/src/widgets/itemviews/qtableview.h
index 3275c09f88..c71402014d 100644
--- a/src/widgets/itemviews/qtableview.h
+++ b/src/widgets/itemviews/qtableview.h
@@ -130,10 +130,6 @@ public Q_SLOTS:
void resizeRowsToContents();
void resizeColumnToContents(int column);
void resizeColumnsToContents();
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QTableView::sortByColumn(int column, Qt::SortOrder order) instead")
- void sortByColumn(int column);
-#endif
void sortByColumn(int column, Qt::SortOrder order);
void setShowGrid(bool show);
diff --git a/src/widgets/itemviews/qtableview_p.h b/src/widgets/itemviews/qtableview_p.h
index 8f174351d2..e17773c4bd 100644
--- a/src/widgets/itemviews/qtableview_p.h
+++ b/src/widgets/itemviews/qtableview_p.h
@@ -149,6 +149,7 @@ public:
}
void init();
void trimHiddenSelections(QItemSelectionRange *range) const;
+ QRect intersectedRect(const QRect rect, const QModelIndex &topLeft, const QModelIndex &bottomRight) const override;
inline bool isHidden(int row, int col) const {
return verticalHeader->isSectionHidden(row)
diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp
index 7b1f1a1caf..6b8505493f 100644
--- a/src/widgets/itemviews/qtablewidget.cpp
+++ b/src/widgets/itemviews/qtablewidget.cpp
@@ -1249,22 +1249,6 @@ void QTableWidgetItem::setFlags(Qt::ItemFlags aflags)
\sa font(), setText(), setForeground()
*/
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \fn QColor QTableWidgetItem::backgroundColor() const
- \obsolete
-
- This function is deprecated. Use background() instead.
-*/
-
-/*!
- \fn void QTableWidgetItem::setBackgroundColor(const QColor &color)
- \obsolete
-
- This function is deprecated. Use setBackground() instead.
-*/
-#endif
-
/*!
\fn QBrush QTableWidgetItem::background() const
\since 4.2
@@ -1285,22 +1269,6 @@ void QTableWidgetItem::setFlags(Qt::ItemFlags aflags)
\sa setForeground()
*/
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \fn QColor QTableWidgetItem::textColor() const
- \obsolete
-
- This function is deprecated. Use foreground() instead.
-*/
-
-/*!
- \fn void QTableWidgetItem::setTextColor(const QColor &color)
- \obsolete
-
- This function is deprecated. Use setForeground() instead.
-*/
-#endif
-
/*!
\fn QBrush QTableWidgetItem::foreground() const
\since 4.2
@@ -2358,34 +2326,6 @@ void QTableWidget::setCellWidget(int row, int column, QWidget *widget)
QAbstractItemView::setIndexWidget(index, widget);
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- Returns \c true if the \a item is selected, otherwise returns \c false.
-
- \obsolete
-
- This function is deprecated. Use \l{QTableWidgetItem::isSelected()} instead.
-*/
-
-bool QTableWidget::isItemSelected(const QTableWidgetItem *item) const
-{
- return ((item && item->tableWidget() == this) ? item->isSelected() : false);
-}
-
-/*!
- Selects or deselects \a item depending on \a select.
-
- \obsolete
-
- This function is deprecated. Use \l{QTableWidgetItem::setSelected()} instead.
-*/
-void QTableWidget::setItemSelected(const QTableWidgetItem *item, bool select)
-{
- if (item && item->tableWidget() == this)
- const_cast<QTableWidgetItem*>(item)->setSelected(select);
-}
-#endif
-
/*!
Selects or deselects the \a range depending on \a select.
*/
diff --git a/src/widgets/itemviews/qtablewidget.h b/src/widgets/itemviews/qtablewidget.h
index 70e2046400..825311ea74 100644
--- a/src/widgets/itemviews/qtablewidget.h
+++ b/src/widgets/itemviews/qtablewidget.h
@@ -113,7 +113,7 @@ public:
{ return data(Qt::StatusTipRole).toString(); }
inline void setStatusTip(const QString &statusTip);
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
inline QString toolTip() const
{ return data(Qt::ToolTipRole).toString(); }
inline void setToolTip(const QString &toolTip);
@@ -134,29 +134,11 @@ public:
inline void setTextAlignment(int alignment)
{ setData(Qt::TextAlignmentRole, alignment); }
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QTableWidgetItem::background() instead")
- inline QColor backgroundColor() const
- { return qvariant_cast<QColor>(data(Qt::BackgroundRole)); }
- QT_DEPRECATED_X ("Use QTableWidgetItem::setBackground() instead")
- inline void setBackgroundColor(const QColor &color)
- { setData(Qt::BackgroundRole, color); }
-#endif
-
inline QBrush background() const
{ return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); }
inline void setBackground(const QBrush &brush)
{ setData(Qt::BackgroundRole, brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QTableWidgetItem::foreground() instead")
- inline QColor textColor() const
- { return qvariant_cast<QColor>(data(Qt::ForegroundRole)); }
- QT_DEPRECATED_X ("Use QTableWidgetItem::setForeground() instead")
- inline void setTextColor(const QColor &color)
- { setData(Qt::ForegroundRole, color); }
-#endif
-
inline QBrush foreground() const
{ return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); }
inline void setForeground(const QBrush &brush)
@@ -205,7 +187,7 @@ inline void QTableWidgetItem::setIcon(const QIcon &aicon)
inline void QTableWidgetItem::setStatusTip(const QString &astatusTip)
{ setData(Qt::StatusTipRole, astatusTip); }
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
inline void QTableWidgetItem::setToolTip(const QString &atoolTip)
{ setData(Qt::ToolTipRole, atoolTip); }
#endif
@@ -282,12 +264,6 @@ public:
void setCellWidget(int row, int column, QWidget *widget);
inline void removeCellWidget(int row, int column);
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QTableWidgetItem::isSelected() instead")
- bool isItemSelected(const QTableWidgetItem *item) const;
- QT_DEPRECATED_X ("Use QTableWidgetItem::setSelected() instead")
- void setItemSelected(const QTableWidgetItem *item, bool select);
-#endif
void setRangeSelected(const QTableWidgetSelectionRange &range, bool select);
QList<QTableWidgetSelectionRange> selectedRanges() const;
diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp
index 4639b9e444..aaac56afb1 100644
--- a/src/widgets/itemviews/qtreeview.cpp
+++ b/src/widgets/itemviews/qtreeview.cpp
@@ -1396,6 +1396,24 @@ void QTreeViewPrivate::_q_modelDestroyed()
QAbstractItemViewPrivate::_q_modelDestroyed();
}
+QRect QTreeViewPrivate::intersectedRect(const QRect rect, const QModelIndex &topLeft, const QModelIndex &bottomRight) const
+{
+ Q_Q(const QTreeView);
+
+ const auto parentIdx = topLeft.parent();
+ executePostedLayout();
+ QRect updateRect;
+ for (int r = topLeft.row(); r <= bottomRight.row(); ++r) {
+ if (isRowHidden(model->index(r, 0, parentIdx)))
+ continue;
+ for (int c = topLeft.column(); c <= bottomRight.column(); ++c) {
+ const QModelIndex idx(model->index(r, c, parentIdx));
+ updateRect |= q->visualRect(idx);
+ }
+ }
+ return rect.intersected(updateRect);
+}
+
/*!
\reimp
@@ -2576,22 +2594,6 @@ void QTreeView::resizeColumnToContents(int column)
d->header->resizeSection(column, qMax(contents, header));
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \obsolete
- \overload
-
- This function is deprecated. Use
- sortByColumn(int column, Qt::SortOrder order) instead.
- Sorts the model by the values in the given \a column.
-*/
-void QTreeView::sortByColumn(int column)
-{
- Q_D(QTreeView);
- sortByColumn(column, d->header->sortIndicatorOrder());
-}
-#endif
-
/*!
\since 4.2
diff --git a/src/widgets/itemviews/qtreeview.h b/src/widgets/itemviews/qtreeview.h
index bb00f1df07..bc29accedd 100644
--- a/src/widgets/itemviews/qtreeview.h
+++ b/src/widgets/itemviews/qtreeview.h
@@ -157,10 +157,6 @@ public Q_SLOTS:
void expand(const QModelIndex &index);
void collapse(const QModelIndex &index);
void resizeColumnToContents(int column);
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QTreeView::sortByColumn(int column, Qt::SortOrder order) instead")
- void sortByColumn(int column);
-#endif
void sortByColumn(int column, Qt::SortOrder order);
void expandAll();
void expandRecursively(const QModelIndex &index, int depth = -1);
diff --git a/src/widgets/itemviews/qtreeview_p.h b/src/widgets/itemviews/qtreeview_p.h
index 836d8f0c2d..1206850b71 100644
--- a/src/widgets/itemviews/qtreeview_p.h
+++ b/src/widgets/itemviews/qtreeview_p.h
@@ -135,6 +135,7 @@ public:
void _q_modelAboutToBeReset();
void _q_sortIndicatorChanged(int column, Qt::SortOrder order);
void _q_modelDestroyed() override;
+ QRect intersectedRect(const QRect rect, const QModelIndex &topLeft, const QModelIndex &bottomRight) const override;
void layout(int item, bool recusiveExpanding = false, bool afterIsUninitialized = false);
diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp
index 0d4c391e1c..25b3f3a778 100644
--- a/src/widgets/itemviews/qtreewidget.cpp
+++ b/src/widgets/itemviews/qtreewidget.cpp
@@ -648,7 +648,7 @@ void QTreeModel::ensureSorted(int column, Qt::SortOrder order,
lit = lst.begin() + tmpitepos;
lit = sortedInsertionIterator(lit, lst.end(), order, item);
- int newRow = qMax(lit - lst.begin(), 0);
+ int newRow = qMax<qsizetype>(lit - lst.begin(), 0);
if ((newRow < oldRow) && !(*item < *lst.at(oldRow - 1)) && !(*lst.at(oldRow - 1) < *item ))
newRow = oldRow;
@@ -1256,22 +1256,6 @@ bool QTreeWidgetItem::isFirstColumnSpanned() const
\sa font(), setText(), setForeground()
*/
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \fn QColor QTreeWidgetItem::backgroundColor(int column) const
- \obsolete
-
- This function is deprecated. Use background() instead.
-*/
-
-/*!
- \fn void QTreeWidgetItem::setBackgroundColor(int column, const QColor &color)
- \obsolete
-
- This function is deprecated. Use setBackground() instead.
-*/
-#endif
-
/*!
\fn QBrush QTreeWidgetItem::background(int column) const
\since 4.2
@@ -1296,21 +1280,6 @@ bool QTreeWidgetItem::isFirstColumnSpanned() const
\sa setForeground()
*/
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \fn QColor QTreeWidgetItem::textColor(int column) const
- \obsolete
-
- This function is deprecated. Use foreground() instead.
-*/
-
-/*!
- \fn void QTreeWidgetItem::setTextColor(int column, const QColor &color)
- \obsolete
-
- This function is deprecated. Use setForeground() instead.
-*/
-#endif
/*!
\fn QBrush QTreeWidgetItem::foreground(int column) const
@@ -3134,38 +3103,6 @@ void QTreeWidget::setItemWidget(QTreeWidgetItem *item, int column, QWidget *widg
QAbstractItemView::setIndexWidget(d->index(item, column), widget);
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- Returns \c true if the \a item is selected; otherwise returns \c false.
-
- \sa itemSelectionChanged()
-
- \obsolete
-
- This function is deprecated. Use \l{QTreeWidgetItem::isSelected()} instead.
-*/
-bool QTreeWidget::isItemSelected(const QTreeWidgetItem *item) const
-{
- return ((item && item->treeWidget() == this) ? item->isSelected() : false);
-}
-
-/*!
- If \a select is true, the given \a item is selected; otherwise it is
- deselected.
-
- \sa itemSelectionChanged()
-
- \obsolete
-
- This function is deprecated. Use \l{QTreeWidgetItem::setSelected()} instead.
-*/
-void QTreeWidget::setItemSelected(const QTreeWidgetItem *item, bool select)
-{
- if (item && item->treeWidget() == this)
- const_cast<QTreeWidgetItem*>(item)->setSelected(select);
-}
-#endif
-
/*!
Returns a list of all selected non-hidden items.
@@ -3204,99 +3141,6 @@ QList<QTreeWidgetItem*> QTreeWidget::findItems(const QString &text, Qt::MatchFla
return items;
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- Returns \c true if the \a item is explicitly hidden, otherwise returns \c false.
-
- \obsolete
-
- This function is deprecated. Use \l{QTreeWidgetItem::isHidden()} instead.
-*/
-bool QTreeWidget::isItemHidden(const QTreeWidgetItem *item) const
-{
- return ((item && item->treeWidget() == this) ? item->isHidden() : false);
-}
-
-/*!
- Hides the given \a item if \a hide is true; otherwise shows the item.
-
- \sa itemChanged()
-
- \obsolete
-
- This function is deprecated. Use \l{QTreeWidgetItem::setHidden()} instead.
-*/
-void QTreeWidget::setItemHidden(const QTreeWidgetItem *item, bool hide)
-{
- if (item && item->treeWidget() == this)
- const_cast<QTreeWidgetItem*>(item)->setHidden(hide);
-}
-
-/*!
- Returns \c true if the given \a item is open; otherwise returns \c false.
-
- \sa itemExpanded()
-
- \obsolete
-
- This function is deprecated. Use \l{QTreeWidgetItem::isExpanded()} instead.
-*/
-bool QTreeWidget::isItemExpanded(const QTreeWidgetItem *item) const
-{
- return ((item && item->treeWidget() == this) ? item->isExpanded() : false);
-}
-
-/*!
- Sets the item referred to by \a item to either closed or opened,
- depending on the value of \a expand.
-
- \sa expandItem(), collapseItem(), itemExpanded()
-
- \obsolete
-
- This function is deprecated. Use \l{QTreeWidgetItem::setExpanded()} instead.
-*/
-void QTreeWidget::setItemExpanded(const QTreeWidgetItem *item, bool expand)
-{
- if (item && item->treeWidget() == this)
- const_cast<QTreeWidgetItem*>(item)->setExpanded(expand);
-}
-
-/*!
- \since 4.3
-
- Returns \c true if the given \a item is set to show only one section over all columns;
- otherwise returns \c false.
-
- \sa setFirstItemColumnSpanned()
-
- \obsolete
-
- This function is deprecated. Use \l{QTreeWidgetItem::isFirstColumnSpanned()} instead.
-*/
-bool QTreeWidget::isFirstItemColumnSpanned(const QTreeWidgetItem *item) const
-{
- return ((item && item->treeWidget() == this) ? item->isFirstColumnSpanned() : false);
-}
-
-/*!
- \since 4.3
-
- Sets the given \a item to only show one section for all columns if \a span is true;
- otherwise the item will show one section per column.
-
- \sa isFirstItemColumnSpanned()
-
- \obsolete
-
- This function is deprecated. Use \l{QTreeWidgetItem::setFirstColumnSpanned()} instead.
-*/
-void QTreeWidget::setFirstItemColumnSpanned(const QTreeWidgetItem *item, bool span)
-{
- if (item && item->treeWidget() == this)
- const_cast<QTreeWidgetItem*>(item)->setFirstColumnSpanned(span);
-}
-#endif
/*!
\since 4.3
diff --git a/src/widgets/itemviews/qtreewidget.h b/src/widgets/itemviews/qtreewidget.h
index b9543fb954..03291ae2db 100644
--- a/src/widgets/itemviews/qtreewidget.h
+++ b/src/widgets/itemviews/qtreewidget.h
@@ -113,7 +113,7 @@ public:
{ return data(column, Qt::StatusTipRole).toString(); }
inline void setStatusTip(int column, const QString &statusTip);
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
inline QString toolTip(int column) const
{ return data(column, Qt::ToolTipRole).toString(); }
inline void setToolTip(int column, const QString &toolTip);
@@ -134,29 +134,11 @@ public:
inline void setTextAlignment(int column, int alignment)
{ setData(column, Qt::TextAlignmentRole, alignment); }
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QTreeWidgetItem::background() instead")
- inline QColor backgroundColor(int column) const
- { return qvariant_cast<QColor>(data(column, Qt::BackgroundRole)); }
- QT_DEPRECATED_X ("Use QTreeWidgetItem::setBackground() instead")
- inline void setBackgroundColor(int column, const QColor &color)
- { setData(column, Qt::BackgroundRole, color); }
-#endif
-
inline QBrush background(int column) const
{ return qvariant_cast<QBrush>(data(column, Qt::BackgroundRole)); }
inline void setBackground(int column, const QBrush &brush)
{ setData(column, Qt::BackgroundRole, brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QTreeWidgetItem::foreground() instead")
- inline QColor textColor(int column) const
- { return qvariant_cast<QColor>(data(column, Qt::ForegroundRole)); }
- QT_DEPRECATED_X ("Use QTreeWidgetItem::setForeground() instead")
- inline void setTextColor(int column, const QColor &color)
- { setData(column, Qt::ForegroundRole, color); }
-#endif
-
inline QBrush foreground(int column) const
{ return qvariant_cast<QBrush>(data(column, Qt::ForegroundRole)); }
inline void setForeground(int column, const QBrush &brush)
@@ -238,7 +220,7 @@ inline void QTreeWidgetItem::setStatusTip(int column, const QString &astatusTip)
{ setData(column, Qt::StatusTipRole, astatusTip); }
#endif
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
inline void QTreeWidgetItem::setToolTip(int column, const QString &atoolTip)
{ setData(column, Qt::ToolTipRole, atoolTip); }
#endif
@@ -315,33 +297,10 @@ public:
void setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget);
inline void removeItemWidget(QTreeWidgetItem *item, int column);
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QTreeWidgetItem::isSelected() instead")
- bool isItemSelected(const QTreeWidgetItem *item) const;
- QT_DEPRECATED_X ("Use QTreeWidgetItem::setSelected() instead")
- void setItemSelected(const QTreeWidgetItem *item, bool select);
-#endif
QList<QTreeWidgetItem*> selectedItems() const;
QList<QTreeWidgetItem*> findItems(const QString &text, Qt::MatchFlags flags,
int column = 0) const;
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use QTreeWidgetItem::isHidden() instead")
- bool isItemHidden(const QTreeWidgetItem *item) const;
- QT_DEPRECATED_X ("Use QTreeWidgetItem::setHidden() instead")
- void setItemHidden(const QTreeWidgetItem *item, bool hide);
-
- QT_DEPRECATED_X ("Use QTreeWidgetItem::isExpanded() instead")
- bool isItemExpanded(const QTreeWidgetItem *item) const;
- QT_DEPRECATED_X ("Use QTreeWidgetItem::setExpanded() instead")
- void setItemExpanded(const QTreeWidgetItem *item, bool expand);
-
- QT_DEPRECATED_X ("Use QTreeWidgetItem::isFirstColumnSpanned() instead")
- bool isFirstItemColumnSpanned(const QTreeWidgetItem *item) const;
- QT_DEPRECATED_X ("Use QTreeWidgetItem::setFirstColumnSpanned() instead")
- void setFirstItemColumnSpanned(const QTreeWidgetItem *item, bool span);
-#endif
-
QTreeWidgetItem *itemAbove(const QTreeWidgetItem *item) const;
QTreeWidgetItem *itemBelow(const QTreeWidgetItem *item) const;
diff --git a/src/widgets/kernel/kernel.pri b/src/widgets/kernel/kernel.pri
index 693af7eb80..b9dfdef5ee 100644
--- a/src/widgets/kernel/kernel.pri
+++ b/src/widgets/kernel/kernel.pri
@@ -7,9 +7,6 @@ KERNEL_P= kernel
HEADERS += \
kernel/qtwidgetsglobal.h \
kernel/qtwidgetsglobal_p.h \
- kernel/qaction.h \
- kernel/qaction_p.h \
- kernel/qactiongroup.h \
kernel/qapplication.h \
kernel/qapplication_p.h \
kernel/qwidgetrepaintmanager_p.h \
@@ -20,13 +17,10 @@ HEADERS += \
kernel/qlayout_p.h \
kernel/qlayoutengine_p.h \
kernel/qlayoutitem.h \
- kernel/qshortcut.h \
- kernel/qsizepolicy.h \
+ kernel/qsizepolicy.h \
kernel/qstackedlayout.h \
kernel/qwidget.h \
kernel/qwidget_p.h \
- kernel/qwidgetaction.h \
- kernel/qwidgetaction_p.h \
kernel/qgesture.h \
kernel/qgesture_p.h \
kernel/qstandardgestures_p.h \
@@ -38,8 +32,6 @@ HEADERS += \
kernel/qtestsupport_widgets.h
SOURCES += \
- kernel/qaction.cpp \
- kernel/qactiongroup.cpp \
kernel/qapplication.cpp \
kernel/qwidgetrepaintmanager.cpp \
kernel/qboxlayout.cpp \
@@ -47,11 +39,9 @@ SOURCES += \
kernel/qlayout.cpp \
kernel/qlayoutengine.cpp \
kernel/qlayoutitem.cpp \
- kernel/qshortcut.cpp \
kernel/qsizepolicy.cpp \
kernel/qstackedlayout.cpp \
kernel/qwidget.cpp \
- kernel/qwidgetaction.cpp \
kernel/qgesture.cpp \
kernel/qstandardgestures.cpp \
kernel/qgesturerecognizer.cpp \
@@ -67,9 +57,12 @@ macx: {
SOURCES += kernel/qmacgesturerecognizer.cpp
}
-qtConfig(opengl) {
- HEADERS += kernel/qopenglwidget.h
- SOURCES += kernel/qopenglwidget.cpp
+qtConfig(action) {
+ HEADERS += kernel/qaction_widgets_p.h \
+ kernel/qwidgetaction.h \
+ kernel/qwidgetaction_p.h
+ SOURCES += kernel/qaction_widgets.cpp \
+ kernel/qwidgetaction.cpp
}
qtConfig(formlayout) {
@@ -77,6 +70,10 @@ qtConfig(formlayout) {
SOURCES += kernel/qformlayout.cpp
}
+qtConfig(shortcut) {
+ SOURCES += kernel/qshortcut_widgets.cpp
+}
+
qtConfig(tooltip) {
HEADERS += kernel/qtooltip.h
SOURCES += kernel/qtooltip.cpp
diff --git a/src/widgets/kernel/qaction.cpp b/src/widgets/kernel/qaction.cpp
deleted file mode 100644
index 64b0d69f6d..0000000000
--- a/src/widgets/kernel/qaction.cpp
+++ /dev/null
@@ -1,1367 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qaction.h"
-#include "qactiongroup.h"
-
-#ifndef QT_NO_ACTION
-#include "qaction_p.h"
-#include "qapplication.h"
-#include "qevent.h"
-#include "qlist.h"
-#include "qstylehints.h"
-#include <private/qshortcutmap_p.h>
-#include <private/qguiapplication_p.h>
-#if QT_CONFIG(menu)
-#include <private/qmenu_p.h>
-#endif
-#include <private/qdebug_p.h>
-
-#define QAPP_CHECK(functionName) \
- if (Q_UNLIKELY(!QCoreApplication::instance())) { \
- qWarning("QAction: Initialize Q(Gui)Application before calling '" functionName "'."); \
- return; \
- }
-
-QT_BEGIN_NAMESPACE
-
-/*
- internal: guesses a descriptive text from a text suited for a menu entry
- */
-static QString qt_strippedText(QString s)
-{
- s.remove(QLatin1String("..."));
- for (int i = 0; i < s.size(); ++i) {
- if (s.at(i) == QLatin1Char('&'))
- s.remove(i, 1);
- }
- return s.trimmed();
-}
-
-
-QActionPrivate::QActionPrivate() :
-#if QT_CONFIG(shortcut)
- autorepeat(1),
-#endif
- enabled(1), forceDisabled(0), visible(1), forceInvisible(0), checkable(0),
- checked(0), separator(0), fontSet(false),
- iconVisibleInMenu(-1), shortcutVisibleInContextMenu(-1)
-{
-}
-
-QActionPrivate::~QActionPrivate() = default;
-
-bool QActionPrivate::showStatusText(QWidget *widget, const QString &str)
-{
-#if !QT_CONFIG(statustip)
- Q_UNUSED(widget);
- Q_UNUSED(str);
-#else
- if(QObject *object = widget ? widget : parent) {
- QStatusTipEvent tip(str);
- QCoreApplication::sendEvent(object, &tip);
- return true;
- }
-#endif
- return false;
-}
-
-void QActionPrivate::sendDataChanged()
-{
- Q_Q(QAction);
- QActionEvent e(QEvent::ActionChanged, q);
- for (int i = 0; i < widgets.size(); ++i) {
- QWidget *w = widgets.at(i);
- QCoreApplication::sendEvent(w, &e);
- }
-#if QT_CONFIG(graphicsview)
- for (int i = 0; i < graphicsWidgets.size(); ++i) {
- QGraphicsWidget *w = graphicsWidgets.at(i);
- QCoreApplication::sendEvent(w, &e);
- }
-#endif
- QCoreApplication::sendEvent(q, &e);
-
- emit q->changed();
-}
-
-#if QT_CONFIG(shortcut)
-void QActionPrivate::redoGrab(QShortcutMap &map)
-{
- Q_Q(QAction);
- if (shortcutId)
- map.removeShortcut(shortcutId, q);
- if (shortcut.isEmpty())
- return;
- shortcutId = map.addShortcut(q, shortcut, shortcutContext, qWidgetShortcutContextMatcher);
- if (!enabled)
- map.setShortcutEnabled(false, shortcutId, q);
- if (!autorepeat)
- map.setShortcutAutoRepeat(false, shortcutId, q);
-}
-
-void QActionPrivate::redoGrabAlternate(QShortcutMap &map)
-{
- Q_Q(QAction);
- for(int i = 0; i < alternateShortcutIds.count(); ++i) {
- if (const int id = alternateShortcutIds.at(i))
- map.removeShortcut(id, q);
- }
- alternateShortcutIds.clear();
- if (alternateShortcuts.isEmpty())
- return;
- for(int i = 0; i < alternateShortcuts.count(); ++i) {
- const QKeySequence& alternate = alternateShortcuts.at(i);
- if (!alternate.isEmpty())
- alternateShortcutIds.append(map.addShortcut(q, alternate, shortcutContext, qWidgetShortcutContextMatcher));
- else
- alternateShortcutIds.append(0);
- }
- if (!enabled) {
- for(int i = 0; i < alternateShortcutIds.count(); ++i) {
- const int id = alternateShortcutIds.at(i);
- map.setShortcutEnabled(false, id, q);
- }
- }
- if (!autorepeat) {
- for(int i = 0; i < alternateShortcutIds.count(); ++i) {
- const int id = alternateShortcutIds.at(i);
- map.setShortcutAutoRepeat(false, id, q);
- }
- }
-}
-
-void QActionPrivate::setShortcutEnabled(bool enable, QShortcutMap &map)
-{
- Q_Q(QAction);
- if (shortcutId)
- map.setShortcutEnabled(enable, shortcutId, q);
- for(int i = 0; i < alternateShortcutIds.count(); ++i) {
- if (const int id = alternateShortcutIds.at(i))
- map.setShortcutEnabled(enable, id, q);
- }
-}
-#endif // QT_NO_SHORTCUT
-
-
-/*!
- \class QAction
- \brief The QAction class provides an abstract user interface
- action that can be inserted into widgets.
-
- \ingroup mainwindow-classes
- \inmodule QtWidgets
-
- \omit
- * parent and widget are different
- * parent does not define context
- \endomit
-
- In applications many common commands can be invoked via menus,
- toolbar buttons, and keyboard shortcuts. Since the user expects
- each command to be performed in the same way, regardless of the
- user interface used, it is useful to represent each command as
- an \e action.
-
- Actions can be added to menus and toolbars, and will
- automatically keep them in sync. For example, in a word processor,
- if the user presses a Bold toolbar button, the Bold menu item
- will automatically be checked.
-
- Actions can be created as independent objects, but they may
- also be created during the construction of menus; the QMenu class
- contains convenience functions for creating actions suitable for
- use as menu items.
-
- A QAction may contain an icon, menu text, a shortcut, status text,
- "What's This?" text, and a tooltip. Most of these can be set in
- the constructor. They can also be set independently with
- setIcon(), setText(), setIconText(), setShortcut(),
- setStatusTip(), setWhatsThis(), and setToolTip(). For menu items,
- it is possible to set an individual font with setFont().
-
- Actions are added to widgets using QWidget::addAction() or
- QGraphicsWidget::addAction(). Note that an action must be added to a
- widget before it can be used; this is also true when the shortcut should
- be global (i.e., Qt::ApplicationShortcut as Qt::ShortcutContext).
-
- Once a QAction has been created it should be added to the relevant
- menu and toolbar, then connected to the slot which will perform
- the action. For example:
-
- \snippet mainwindows/application/mainwindow.cpp 19
-
- We recommend that actions are created as children of the window
- they are used in. In most cases actions will be children of
- the application's main window.
-
- \sa QMenu, QToolBar, {Application Example}
-*/
-
-/*!
- \fn void QAction::trigger()
-
- This is a convenience slot that calls activate(Trigger).
-*/
-
-/*!
- \fn void QAction::hover()
-
- This is a convenience slot that calls activate(Hover).
-*/
-
-/*!
- \enum QAction::MenuRole
-
- This enum describes how an action should be moved into the application menu on \macos.
-
- \value NoRole This action should not be put into the application menu
- \value TextHeuristicRole This action should be put in the application menu based on the action's text
- as described in the QMenuBar documentation.
- \value ApplicationSpecificRole This action should be put in the application menu with an application specific role
- \value AboutQtRole This action handles the "About Qt" menu item.
- \value AboutRole This action should be placed where the "About" menu item is in the application menu. The text of
- the menu item will be set to "About <application name>". The application name is fetched from the
- \c{Info.plist} file in the application's bundle (See \l{Qt for macOS - Deployment}).
- \value PreferencesRole This action should be placed where the "Preferences..." menu item is in the application menu.
- \value QuitRole This action should be placed where the Quit menu item is in the application menu.
-
- Setting this value only has effect on items that are in the immediate menus
- of the menubar, not the submenus of those menus. For example, if you have
- File menu in your menubar and the File menu has a submenu, setting the
- MenuRole for the actions in that submenu have no effect. They will never be moved.
-*/
-
-/*!
- Constructs an action with \a parent. If \a parent is an action
- group the action will be automatically inserted into the group.
-
- \note The \a parent argument is optional since Qt 5.7.
-*/
-QAction::QAction(QObject* parent)
- : QAction(*new QActionPrivate, parent)
-{
-}
-
-
-/*!
- Constructs an action with some \a text and \a parent. If \a
- parent is an action group the action will be automatically
- inserted into the group.
-
- The action uses a stripped version of \a text (e.g. "\&Menu
- Option..." becomes "Menu Option") as descriptive text for
- tool buttons. You can override this by setting a specific
- description with setText(). The same text will be used for
- tooltips unless you specify a different text using
- setToolTip().
-
-*/
-QAction::QAction(const QString &text, QObject* parent)
- : QAction(parent)
-{
- Q_D(QAction);
- d->text = text;
-}
-
-/*!
- Constructs an action with an \a icon and some \a text and \a
- parent. If \a parent is an action group the action will be
- automatically inserted into the group.
-
- The action uses a stripped version of \a text (e.g. "\&Menu
- Option..." becomes "Menu Option") as descriptive text for
- tool buttons. You can override this by setting a specific
- description with setText(). The same text will be used for
- tooltips unless you specify a different text using
- setToolTip().
-*/
-QAction::QAction(const QIcon &icon, const QString &text, QObject* parent)
- : QAction(text, parent)
-{
- Q_D(QAction);
- d->icon = icon;
-}
-
-/*!
- \internal
-*/
-QAction::QAction(QActionPrivate &dd, QObject *parent)
- : QObject(dd, parent)
-{
- Q_D(QAction);
- d->group = qobject_cast<QActionGroup *>(parent);
- if (d->group)
- d->group->addAction(this);
-}
-
-/*!
- Returns the parent widget.
-*/
-QWidget *QAction::parentWidget() const
-{
- QObject *ret = parent();
- while (ret && !ret->isWidgetType())
- ret = ret->parent();
- return static_cast<QWidget*>(ret);
-}
-
-/*!
- \since 4.2
- Returns a list of widgets this action has been added to.
-
- \sa QWidget::addAction(), associatedGraphicsWidgets()
-*/
-QList<QWidget *> QAction::associatedWidgets() const
-{
- Q_D(const QAction);
- return d->widgets;
-}
-
-#if QT_CONFIG(graphicsview)
-/*!
- \since 4.5
- Returns a list of widgets this action has been added to.
-
- \sa QWidget::addAction(), associatedWidgets()
-*/
-QList<QGraphicsWidget *> QAction::associatedGraphicsWidgets() const
-{
- Q_D(const QAction);
- return d->graphicsWidgets;
-}
-#endif
-
-#if QT_CONFIG(shortcut)
-/*!
- \property QAction::shortcut
- \brief the action's primary shortcut key
-
- Valid keycodes for this property can be found in \l Qt::Key and
- \l Qt::Modifier. There is no default shortcut key.
-*/
-void QAction::setShortcut(const QKeySequence &shortcut)
-{
- QAPP_CHECK("setShortcut");
-
- Q_D(QAction);
- if (d->shortcut == shortcut)
- return;
-
- d->shortcut = shortcut;
- d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
- d->sendDataChanged();
-}
-
-/*!
- \since 4.2
-
- Sets \a shortcuts as the list of shortcuts that trigger the
- action. The first element of the list is the primary shortcut.
-
- \sa shortcut
-*/
-void QAction::setShortcuts(const QList<QKeySequence> &shortcuts)
-{
- Q_D(QAction);
-
- QList <QKeySequence> listCopy = shortcuts;
-
- QKeySequence primary;
- if (!listCopy.isEmpty())
- primary = listCopy.takeFirst();
-
- if (d->shortcut == primary && d->alternateShortcuts == listCopy)
- return;
-
- QAPP_CHECK("setShortcuts");
-
- d->shortcut = primary;
- d->alternateShortcuts = listCopy;
- d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
- d->redoGrabAlternate(QGuiApplicationPrivate::instance()->shortcutMap);
- d->sendDataChanged();
-}
-
-/*!
- \since 4.2
-
- Sets a platform dependent list of shortcuts based on the \a key.
- The result of calling this function will depend on the currently running platform.
- Note that more than one shortcut can assigned by this action.
- If only the primary shortcut is required, use setShortcut instead.
-
- \sa QKeySequence::keyBindings()
-*/
-void QAction::setShortcuts(QKeySequence::StandardKey key)
-{
- QList <QKeySequence> list = QKeySequence::keyBindings(key);
- setShortcuts(list);
-}
-
-/*!
- Returns the primary shortcut.
-
- \sa setShortcuts()
-*/
-QKeySequence QAction::shortcut() const
-{
- Q_D(const QAction);
- return d->shortcut;
-}
-
-/*!
- \since 4.2
-
- Returns the list of shortcuts, with the primary shortcut as
- the first element of the list.
-
- \sa setShortcuts()
-*/
-QList<QKeySequence> QAction::shortcuts() const
-{
- Q_D(const QAction);
- QList <QKeySequence> shortcuts;
- if (!d->shortcut.isEmpty())
- shortcuts << d->shortcut;
- if (!d->alternateShortcuts.isEmpty())
- shortcuts << d->alternateShortcuts;
- return shortcuts;
-}
-
-/*!
- \property QAction::shortcutContext
- \brief the context for the action's shortcut
-
- Valid values for this property can be found in \l Qt::ShortcutContext.
- The default value is Qt::WindowShortcut.
-*/
-void QAction::setShortcutContext(Qt::ShortcutContext context)
-{
- Q_D(QAction);
- if (d->shortcutContext == context)
- return;
- QAPP_CHECK("setShortcutContext");
- d->shortcutContext = context;
- d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
- d->redoGrabAlternate(QGuiApplicationPrivate::instance()->shortcutMap);
- d->sendDataChanged();
-}
-
-Qt::ShortcutContext QAction::shortcutContext() const
-{
- Q_D(const QAction);
- return d->shortcutContext;
-}
-
-/*!
- \property QAction::autoRepeat
- \brief whether the action can auto repeat
- \since 4.2
-
- If true, the action will auto repeat when the keyboard shortcut
- combination is held down, provided that keyboard auto repeat is
- enabled on the system.
- The default value is true.
-*/
-void QAction::setAutoRepeat(bool on)
-{
- Q_D(QAction);
- if (d->autorepeat == on)
- return;
- QAPP_CHECK("setAutoRepeat");
- d->autorepeat = on;
- d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
- d->redoGrabAlternate(QGuiApplicationPrivate::instance()->shortcutMap);
- d->sendDataChanged();
-}
-
-bool QAction::autoRepeat() const
-{
- Q_D(const QAction);
- return d->autorepeat;
-}
-#endif // QT_NO_SHORTCUT
-
-/*!
- \property QAction::font
- \brief the action's font
-
- The font property is used to render the text set on the
- QAction. The font will can be considered a hint as it will not be
- consulted in all cases based upon application and style.
-
- By default, this property contains the application's default font.
-
- \sa QAction::setText(), QStyle
-*/
-void QAction::setFont(const QFont &font)
-{
- Q_D(QAction);
- if (d->font == font)
- return;
-
- d->fontSet = true;
- d->font = font;
- d->sendDataChanged();
-}
-
-QFont QAction::font() const
-{
- Q_D(const QAction);
- return d->font;
-}
-
-
-/*!
- Destroys the object and frees allocated resources.
-*/
-QAction::~QAction()
-{
- Q_D(QAction);
- for (int i = d->widgets.size()-1; i >= 0; --i) {
- QWidget *w = d->widgets.at(i);
- w->removeAction(this);
- }
-#if QT_CONFIG(graphicsview)
- for (int i = d->graphicsWidgets.size()-1; i >= 0; --i) {
- QGraphicsWidget *w = d->graphicsWidgets.at(i);
- w->removeAction(this);
- }
-#endif
- if (d->group)
- d->group->removeAction(this);
-#if QT_CONFIG(shortcut)
- if (d->shortcutId && qApp) {
- QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(d->shortcutId, this);
- for(int i = 0; i < d->alternateShortcutIds.count(); ++i) {
- const int id = d->alternateShortcutIds.at(i);
- QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(id, this);
- }
- }
-#endif
-}
-
-/*!
- Sets this action group to \a group. The action will be automatically
- added to the group's list of actions.
-
- Actions within the group will be mutually exclusive.
-
- \sa QActionGroup, QAction::actionGroup()
-*/
-void QAction::setActionGroup(QActionGroup *group)
-{
- Q_D(QAction);
- if(group == d->group)
- return;
-
- if(d->group)
- d->group->removeAction(this);
- d->group = group;
- if(group)
- group->addAction(this);
- d->sendDataChanged();
-}
-
-/*!
- Returns the action group for this action. If no action group manages
- this action then 0 will be returned.
-
- \sa QActionGroup, QAction::setActionGroup()
-*/
-QActionGroup *QAction::actionGroup() const
-{
- Q_D(const QAction);
- return d->group;
-}
-
-
-/*!
- \property QAction::icon
- \brief the action's icon
-
- In toolbars, the icon is used as the tool button icon; in menus,
- it is displayed to the left of the menu text. There is no default
- icon.
-
- If a null icon (QIcon::isNull()) is passed into this function,
- the icon of the action is cleared.
-*/
-void QAction::setIcon(const QIcon &icon)
-{
- Q_D(QAction);
- d->icon = icon;
- d->sendDataChanged();
-}
-
-QIcon QAction::icon() const
-{
- Q_D(const QAction);
- return d->icon;
-}
-
-#if QT_CONFIG(menu)
-/*!
- Returns the menu contained by this action. Actions that contain
- menus can be used to create menu items with submenus, or inserted
- into toolbars to create buttons with popup menus.
-
- \sa QMenu::addAction()
-*/
-QMenu *QAction::menu() const
-{
- Q_D(const QAction);
- return d->menu;
-}
-
-/*!
- Sets the menu contained by this action to the specified \a menu.
-*/
-void QAction::setMenu(QMenu *menu)
-{
- Q_D(QAction);
- if (d->menu)
- d->menu->d_func()->setOverrideMenuAction(nullptr); //we reset the default action of any previous menu
- d->menu = menu;
- if (menu)
- menu->d_func()->setOverrideMenuAction(this);
- d->sendDataChanged();
-}
-#endif // QT_CONFIG(menu)
-
-/*!
- If \a b is true then this action will be considered a separator.
-
- How a separator is represented depends on the widget it is inserted
- into. Under most circumstances the text, submenu, and icon will be
- ignored for separator actions.
-
- \sa QAction::isSeparator()
-*/
-void QAction::setSeparator(bool b)
-{
- Q_D(QAction);
- if (d->separator == b)
- return;
-
- d->separator = b;
- d->sendDataChanged();
-}
-
-/*!
- Returns \c true if this action is a separator action; otherwise it
- returns \c false.
-
- \sa QAction::setSeparator()
-*/
-bool QAction::isSeparator() const
-{
- Q_D(const QAction);
- return d->separator;
-}
-
-/*!
- \property QAction::text
- \brief the action's descriptive text
-
- If the action is added to a menu, the menu option will consist of
- the icon (if there is one), the text, and the shortcut (if there
- is one). If the text is not explicitly set in the constructor, or
- by using setText(), the action's description icon text will be
- used as text. There is no default text.
-
- \sa iconText
-*/
-void QAction::setText(const QString &text)
-{
- Q_D(QAction);
- if (d->text == text)
- return;
-
- d->text = text;
- d->sendDataChanged();
-}
-
-QString QAction::text() const
-{
- Q_D(const QAction);
- QString s = d->text;
- if(s.isEmpty()) {
- s = d->iconText;
- s.replace(QLatin1Char('&'), QLatin1String("&&"));
- }
- return s;
-}
-
-
-
-
-
-/*!
- \property QAction::iconText
- \brief the action's descriptive icon text
-
- If QToolBar::toolButtonStyle is set to a value that permits text to
- be displayed, the text defined held in this property appears as a
- label in the relevant tool button.
-
- It also serves as the default text in menus and tooltips if the action
- has not been defined with setText() or setToolTip(), and will
- also be used in toolbar buttons if no icon has been defined using setIcon().
-
- If the icon text is not explicitly set, the action's normal text will be
- used for the icon text.
-
- By default, this property contains an empty string.
-
- \sa setToolTip(), setStatusTip()
-*/
-void QAction::setIconText(const QString &text)
-{
- Q_D(QAction);
- if (d->iconText == text)
- return;
-
- d->iconText = text;
- d->sendDataChanged();
-}
-
-QString QAction::iconText() const
-{
- Q_D(const QAction);
- if (d->iconText.isEmpty())
- return qt_strippedText(d->text);
- return d->iconText;
-}
-
-/*!
- \property QAction::toolTip
- \brief the action's tooltip
-
- This text is used for the tooltip. If no tooltip is specified,
- the action's text is used.
-
- By default, this property contains the action's text.
-
- \sa setStatusTip(), setShortcut()
-*/
-void QAction::setToolTip(const QString &tooltip)
-{
- Q_D(QAction);
- if (d->tooltip == tooltip)
- return;
-
- d->tooltip = tooltip;
- d->sendDataChanged();
-}
-
-QString QAction::toolTip() const
-{
- Q_D(const QAction);
- if (d->tooltip.isEmpty()) {
- if (!d->text.isEmpty())
- return qt_strippedText(d->text);
- return qt_strippedText(d->iconText);
- }
- return d->tooltip;
-}
-
-/*!
- \property QAction::statusTip
- \brief the action's status tip
-
- The status tip is displayed on all status bars provided by the
- action's top-level parent widget.
-
- By default, this property contains an empty string.
-
- \sa setToolTip(), showStatusText()
-*/
-void QAction::setStatusTip(const QString &statustip)
-{
- Q_D(QAction);
- if (d->statustip == statustip)
- return;
-
- d->statustip = statustip;
- d->sendDataChanged();
-}
-
-QString QAction::statusTip() const
-{
- Q_D(const QAction);
- return d->statustip;
-}
-
-/*!
- \property QAction::whatsThis
- \brief the action's "What's This?" help text
-
- The "What's This?" text is used to provide a brief description of
- the action. The text may contain rich text. There is no default
- "What's This?" text.
-
- \sa QWhatsThis
-*/
-void QAction::setWhatsThis(const QString &whatsthis)
-{
- Q_D(QAction);
- if (d->whatsthis == whatsthis)
- return;
-
- d->whatsthis = whatsthis;
- d->sendDataChanged();
-}
-
-QString QAction::whatsThis() const
-{
- Q_D(const QAction);
- return d->whatsthis;
-}
-
-/*!
- \enum QAction::Priority
- \since 4.6
-
- This enum defines priorities for actions in user interface.
-
- \value LowPriority The action should not be prioritized in
- the user interface.
-
- \value NormalPriority
-
- \value HighPriority The action should be prioritized in
- the user interface.
-
- \sa priority
-*/
-
-
-/*!
- \property QAction::priority
- \since 4.6
-
- \brief the actions's priority in the user interface.
-
- This property can be set to indicate how the action should be prioritized
- in the user interface.
-
- For instance, when toolbars have the Qt::ToolButtonTextBesideIcon
- mode set, then actions with LowPriority will not show the text
- labels.
-*/
-void QAction::setPriority(Priority priority)
-{
- Q_D(QAction);
- if (d->priority == priority)
- return;
-
- d->priority = priority;
- d->sendDataChanged();
-}
-
-QAction::Priority QAction::priority() const
-{
- Q_D(const QAction);
- return d->priority;
-}
-
-/*!
- \property QAction::checkable
- \brief whether the action is a checkable action
-
- A checkable action is one which has an on/off state. For example,
- in a word processor, a Bold toolbar button may be either on or
- off. An action which is not a toggle action is a command action;
- a command action is simply executed, e.g. file save.
- By default, this property is \c false.
-
- In some situations, the state of one toggle action should depend
- on the state of others. For example, "Left Align", "Center" and
- "Right Align" toggle actions are mutually exclusive. To achieve
- exclusive toggling, add the relevant toggle actions to a
- QActionGroup with the QActionGroup::exclusive property set to
- true.
-
- \sa QAction::setChecked()
-*/
-void QAction::setCheckable(bool b)
-{
- Q_D(QAction);
- if (d->checkable == b)
- return;
-
- d->checkable = b;
- d->checked = false;
- d->sendDataChanged();
-}
-
-bool QAction::isCheckable() const
-{
- Q_D(const QAction);
- return d->checkable;
-}
-
-/*!
- \fn void QAction::toggle()
-
- This is a convenience function for the \l checked property.
- Connect to it to change the checked state to its opposite state.
-*/
-void QAction::toggle()
-{
- Q_D(QAction);
- setChecked(!d->checked);
-}
-
-/*!
- \property QAction::checked
- \brief whether the action is checked.
-
- Only checkable actions can be checked. By default, this is false
- (the action is unchecked).
-
- \note The notifier signal for this property is toggled(). As toggling
- a QAction changes its state, it will also emit a changed() signal.
-
- \sa checkable, toggled()
-*/
-void QAction::setChecked(bool b)
-{
- Q_D(QAction);
- if (!d->checkable || d->checked == b)
- return;
-
- QPointer<QAction> guard(this);
- d->checked = b;
- d->sendDataChanged();
- if (guard)
- emit toggled(b);
-}
-
-bool QAction::isChecked() const
-{
- Q_D(const QAction);
- return d->checked;
-}
-
-/*!
- \fn void QAction::setDisabled(bool b)
-
- This is a convenience function for the \l enabled property, that
- is useful for signals--slots connections. If \a b is true the
- action is disabled; otherwise it is enabled.
-*/
-
-/*!
- \property QAction::enabled
- \brief whether the action is enabled
-
- Disabled actions cannot be chosen by the user. They do not
- disappear from menus or toolbars, but they are displayed in a way
- which indicates that they are unavailable. For example, they might
- be displayed using only shades of gray.
-
- \uicontrol{What's This?} help on disabled actions is still available, provided
- that the QAction::whatsThis property is set.
-
- An action will be disabled when all widgets to which it is added
- (with QWidget::addAction()) are disabled or not visible. When an
- action is disabled, it is not possible to trigger it through its
- shortcut.
-
- By default, this property is \c true (actions are enabled).
-
- \sa text
-*/
-void QAction::setEnabled(bool b)
-{
- Q_D(QAction);
- if (b == d->enabled && b != d->forceDisabled)
- return;
- d->forceDisabled = !b;
- if (b && (!d->visible || (d->group && !d->group->isEnabled())))
- return;
- QAPP_CHECK("setEnabled");
- d->enabled = b;
-#if QT_CONFIG(shortcut)
- d->setShortcutEnabled(b, QGuiApplicationPrivate::instance()->shortcutMap);
-#endif
- d->sendDataChanged();
-}
-
-bool QAction::isEnabled() const
-{
- Q_D(const QAction);
- return d->enabled;
-}
-
-/*!
- \property QAction::visible
- \brief whether the action can be seen (e.g. in menus and toolbars)
-
- If \e visible is true the action can be seen (e.g. in menus and
- toolbars) and chosen by the user; if \e visible is false the
- action cannot be seen or chosen by the user.
-
- Actions which are not visible are \e not grayed out; they do not
- appear at all.
-
- By default, this property is \c true (actions are visible).
-*/
-void QAction::setVisible(bool b)
-{
- Q_D(QAction);
- if (b == d->visible && b != d->forceInvisible)
- return;
- QAPP_CHECK("setVisible");
- d->forceInvisible = !b;
- d->visible = b;
- d->enabled = b && !d->forceDisabled && (!d->group || d->group->isEnabled()) ;
-#if QT_CONFIG(shortcut)
- d->setShortcutEnabled(d->enabled, QGuiApplicationPrivate::instance()->shortcutMap);
-#endif
- d->sendDataChanged();
-}
-
-
-bool QAction::isVisible() const
-{
- Q_D(const QAction);
- return d->visible;
-}
-
-/*!
- \reimp
-*/
-bool
-QAction::event(QEvent *e)
-{
-#if QT_CONFIG(shortcut)
- if (e->type() == QEvent::Shortcut) {
- QShortcutEvent *se = static_cast<QShortcutEvent *>(e);
- Q_ASSERT_X(se->key() == d_func()->shortcut || d_func()->alternateShortcuts.contains(se->key()),
- "QAction::event",
- "Received shortcut event from incorrect shortcut");
- if (se->isAmbiguous())
- qWarning("QAction::event: Ambiguous shortcut overload: %s", se->key().toString(QKeySequence::NativeText).toLatin1().constData());
- else
- activate(Trigger);
- return true;
- }
-#endif
- return QObject::event(e);
-}
-
-/*!
- Returns the user data as set in QAction::setData.
-
- \sa setData()
-*/
-QVariant
-QAction::data() const
-{
- Q_D(const QAction);
- return d->userData;
-}
-
-/*!
- \fn void QAction::setData(const QVariant &userData)
-
- Sets the action's internal data to the given \a userData.
-
- \sa data()
-*/
-void
-QAction::setData(const QVariant &data)
-{
- Q_D(QAction);
- if (d->userData == data)
- return;
- d->userData = data;
- d->sendDataChanged();
-}
-
-
-/*!
- Updates the relevant status bar for the \a widget specified by sending a
- QStatusTipEvent to its parent widget. Returns \c true if an event was sent;
- otherwise returns \c false.
-
- If a null widget is specified, the event is sent to the action's parent.
-
- \sa statusTip
-*/
-bool
-QAction::showStatusText(QWidget *widget)
-{
- return d_func()->showStatusText(widget, statusTip());
-}
-
-/*!
- Sends the relevant signals for ActionEvent \a event.
-
- Action based widgets use this API to cause the QAction
- to emit signals as well as emitting their own.
-*/
-void QAction::activate(ActionEvent event)
-{
- Q_D(QAction);
- if(event == Trigger) {
- QPointer<QObject> guard = this;
- if(d->checkable) {
- // the checked action of an exclusive group may not be unchecked
- if (d->checked && (d->group
- && d->group->exclusionPolicy() == QActionGroup::ExclusionPolicy::Exclusive
- && d->group->checkedAction() == this)) {
- if (!guard.isNull())
- emit triggered(true);
- return;
- }
- setChecked(!d->checked);
- }
- if (!guard.isNull())
- emit triggered(d->checked);
- } else if(event == Hover) {
- emit hovered();
- }
-}
-
-/*!
- \fn void QAction::triggered(bool checked)
-
- This signal is emitted when an action is activated by the user;
- for example, when the user clicks a menu option, toolbar button,
- or presses an action's shortcut key combination, or when trigger()
- was called. Notably, it is \e not emitted when setChecked() or
- toggle() is called.
-
- If the action is checkable, \a checked is true if the action is
- checked, or false if the action is unchecked.
-
- \sa QAction::activate(), QAction::toggled(), checked
-*/
-
-/*!
- \fn void QAction::toggled(bool checked)
-
- This signal is emitted whenever a checkable action changes its
- isChecked() status. This can be the result of a user interaction,
- or because setChecked() was called. As setChecked() changes the
- QAction, it emits changed() in addition to toggled().
-
- \a checked is true if the action is checked, or false if the
- action is unchecked.
-
- \sa QAction::activate(), QAction::triggered(), checked
-*/
-
-/*!
- \fn void QAction::hovered()
-
- This signal is emitted when an action is highlighted by the user;
- for example, when the user pauses with the cursor over a menu option,
- toolbar button, or presses an action's shortcut key combination.
-
- \sa QAction::activate()
-*/
-
-/*!
- \fn void QAction::changed()
-
- This signal is emitted when an action has changed. If you
- are only interested in actions in a given widget, you can
- watch for QWidget::actionEvent() sent with an
- QEvent::ActionChanged.
-
- \sa QWidget::actionEvent()
-*/
-
-/*!
- \enum QAction::ActionEvent
-
- This enum type is used when calling QAction::activate()
-
- \value Trigger this will cause the QAction::triggered() signal to be emitted.
-
- \value Hover this will cause the QAction::hovered() signal to be emitted.
-*/
-
-/*!
- \property QAction::menuRole
- \brief the action's menu role
- \since 4.2
-
- This indicates what role the action serves in the application menu on
- \macos. By default all actions have the TextHeuristicRole, which means that
- the action is added based on its text (see QMenuBar for more information).
-
- The menu role can only be changed before the actions are put into the menu
- bar in \macos (usually just before the first application window is
- shown).
-*/
-void QAction::setMenuRole(MenuRole menuRole)
-{
- Q_D(QAction);
- if (d->menuRole == menuRole)
- return;
-
- d->menuRole = menuRole;
- d->sendDataChanged();
-}
-
-QAction::MenuRole QAction::menuRole() const
-{
- Q_D(const QAction);
- return d->menuRole;
-}
-
-/*!
- \property QAction::iconVisibleInMenu
- \brief Whether or not an action should show an icon in a menu
- \since 4.4
-
- In some applications, it may make sense to have actions with icons in the
- toolbar, but not in menus. If true, the icon (if valid) is shown in the menu, when it
- is false, it is not shown.
-
- The default is to follow whether the Qt::AA_DontShowIconsInMenus attribute
- is set for the application. Explicitly settings this property overrides
- the presence (or abscence) of the attribute.
-
- For example:
- \snippet code/src_gui_kernel_qaction.cpp 0
-
- \sa QAction::icon, QCoreApplication::setAttribute()
-*/
-void QAction::setIconVisibleInMenu(bool visible)
-{
- Q_D(QAction);
- if (d->iconVisibleInMenu == -1 || visible != bool(d->iconVisibleInMenu)) {
- int oldValue = d->iconVisibleInMenu;
- d->iconVisibleInMenu = visible;
- // Only send data changed if we really need to.
- if (oldValue != -1
- || visible == !QCoreApplication::testAttribute(Qt::AA_DontShowIconsInMenus)) {
- d->sendDataChanged();
- }
- }
-}
-
-bool QAction::isIconVisibleInMenu() const
-{
- Q_D(const QAction);
- if (d->iconVisibleInMenu == -1) {
- return !QCoreApplication::testAttribute(Qt::AA_DontShowIconsInMenus);
- }
- return d->iconVisibleInMenu;
-}
-
-/*!
- \property QAction::shortcutVisibleInContextMenu
- \brief Whether or not an action should show a shortcut in a context menu
- \since 5.10
-
- In some applications, it may make sense to have actions with shortcuts in
- context menus. If true, the shortcut (if valid) is shown when the action is
- shown via a context menu, when it is false, it is not shown.
-
- The default is to follow whether the Qt::AA_DontShowShortcutsInContextMenus attribute
- is set for the application, falling back to the widget style hint.
- Explicitly setting this property overrides the presence (or abscence) of the attribute.
-
- \sa QAction::shortcut, QCoreApplication::setAttribute()
-*/
-void QAction::setShortcutVisibleInContextMenu(bool visible)
-{
- Q_D(QAction);
- if (d->shortcutVisibleInContextMenu == -1 || visible != bool(d->shortcutVisibleInContextMenu)) {
- int oldValue = d->shortcutVisibleInContextMenu;
- d->shortcutVisibleInContextMenu = visible;
- // Only send data changed if we really need to.
- if (oldValue != -1
- || visible == !QCoreApplication::testAttribute(Qt::AA_DontShowShortcutsInContextMenus)) {
- d->sendDataChanged();
- }
- }
-}
-
-bool QAction::isShortcutVisibleInContextMenu() const
-{
- Q_D(const QAction);
- if (d->shortcutVisibleInContextMenu == -1) {
- return !QCoreApplication::testAttribute(Qt::AA_DontShowShortcutsInContextMenus)
- && QGuiApplication::styleHints()->showShortcutsInContextMenus();
- }
- return d->shortcutVisibleInContextMenu;
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_WIDGETS_EXPORT QDebug operator<<(QDebug d, const QAction *action)
-{
- QDebugStateSaver saver(d);
- d.nospace();
- d << "QAction(" << static_cast<const void *>(action);
- if (action) {
- d << " text=" << action->text();
- if (!action->toolTip().isEmpty())
- d << " toolTip=" << action->toolTip();
- if (action->isCheckable())
- d << " checked=" << action->isChecked();
-#if QT_CONFIG(shortcut)
- if (!action->shortcut().isEmpty())
- d << " shortcut=" << action->shortcut();
-#endif
- d << " menuRole=";
- QtDebugUtils::formatQEnum(d, action->menuRole());
- d << " visible=" << action->isVisible();
- } else {
- d << '0';
- }
- d << ')';
- return d;
-}
-#endif // QT_NO_DEBUG_STREAM
-
-QT_END_NAMESPACE
-
-#include "moc_qaction.cpp"
-
-#endif // QT_NO_ACTION
diff --git a/src/widgets/kernel/qaction.h b/src/widgets/kernel/qaction.h
deleted file mode 100644
index 258a1ea0a0..0000000000
--- a/src/widgets/kernel/qaction.h
+++ /dev/null
@@ -1,228 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QACTION_H
-#define QACTION_H
-
-#include <QtWidgets/qtwidgetsglobal.h>
-#include <QtGui/qkeysequence.h>
-#include <QtCore/qstring.h>
-#include <QtWidgets/qwidget.h>
-#include <QtCore/qvariant.h>
-#include <QtGui/qicon.h>
-
-QT_BEGIN_NAMESPACE
-
-
-#ifndef QT_NO_ACTION
-
-class QMenu;
-class QActionGroup;
-class QActionPrivate;
-class QGraphicsWidget;
-
-class Q_WIDGETS_EXPORT QAction : public QObject
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QAction)
-
- Q_PROPERTY(bool checkable READ isCheckable WRITE setCheckable NOTIFY changed)
- Q_PROPERTY(bool checked READ isChecked WRITE setChecked NOTIFY toggled)
- Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY changed)
- Q_PROPERTY(QIcon icon READ icon WRITE setIcon NOTIFY changed)
- Q_PROPERTY(QString text READ text WRITE setText NOTIFY changed)
- Q_PROPERTY(QString iconText READ iconText WRITE setIconText NOTIFY changed)
- Q_PROPERTY(QString toolTip READ toolTip WRITE setToolTip NOTIFY changed)
- Q_PROPERTY(QString statusTip READ statusTip WRITE setStatusTip NOTIFY changed)
- Q_PROPERTY(QString whatsThis READ whatsThis WRITE setWhatsThis NOTIFY changed)
- Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY changed)
-#if QT_CONFIG(shortcut)
- Q_PROPERTY(QKeySequence shortcut READ shortcut WRITE setShortcut NOTIFY changed)
- Q_PROPERTY(Qt::ShortcutContext shortcutContext READ shortcutContext WRITE setShortcutContext NOTIFY changed)
- Q_PROPERTY(bool autoRepeat READ autoRepeat WRITE setAutoRepeat NOTIFY changed)
-#endif
- Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY changed)
- Q_PROPERTY(MenuRole menuRole READ menuRole WRITE setMenuRole NOTIFY changed)
- Q_PROPERTY(bool iconVisibleInMenu READ isIconVisibleInMenu WRITE setIconVisibleInMenu NOTIFY changed)
- Q_PROPERTY(bool shortcutVisibleInContextMenu READ isShortcutVisibleInContextMenu WRITE setShortcutVisibleInContextMenu NOTIFY changed)
- Q_PROPERTY(Priority priority READ priority WRITE setPriority)
-
-public:
- // note this is copied into qplatformmenu.h, which must stay in sync
- enum MenuRole { NoRole = 0, TextHeuristicRole, ApplicationSpecificRole, AboutQtRole,
- AboutRole, PreferencesRole, QuitRole };
- Q_ENUM(MenuRole)
- enum Priority { LowPriority = 0,
- NormalPriority = 128,
- HighPriority = 256};
- Q_ENUM(Priority)
- explicit QAction(QObject *parent = nullptr);
- explicit QAction(const QString &text, QObject *parent = nullptr);
- explicit QAction(const QIcon &icon, const QString &text, QObject *parent = nullptr);
-
- ~QAction();
-
- void setActionGroup(QActionGroup *group);
- QActionGroup *actionGroup() const;
- void setIcon(const QIcon &icon);
- QIcon icon() const;
-
- void setText(const QString &text);
- QString text() const;
-
- void setIconText(const QString &text);
- QString iconText() const;
-
- void setToolTip(const QString &tip);
- QString toolTip() const;
-
- void setStatusTip(const QString &statusTip);
- QString statusTip() const;
-
- void setWhatsThis(const QString &what);
- QString whatsThis() const;
-
- void setPriority(Priority priority);
- Priority priority() const;
-
-#if QT_CONFIG(menu)
- QMenu *menu() const;
- void setMenu(QMenu *menu);
-#endif
-
- void setSeparator(bool b);
- bool isSeparator() const;
-
-#if QT_CONFIG(shortcut)
- void setShortcut(const QKeySequence &shortcut);
- QKeySequence shortcut() const;
-
- void setShortcuts(const QList<QKeySequence> &shortcuts);
- void setShortcuts(QKeySequence::StandardKey);
- QList<QKeySequence> shortcuts() const;
-
- void setShortcutContext(Qt::ShortcutContext context);
- Qt::ShortcutContext shortcutContext() const;
-
- void setAutoRepeat(bool);
- bool autoRepeat() const;
-#endif
-
- void setFont(const QFont &font);
- QFont font() const;
-
- void setCheckable(bool);
- bool isCheckable() const;
-
- QVariant data() const;
- void setData(const QVariant &var);
-
- bool isChecked() const;
-
- bool isEnabled() const;
-
- bool isVisible() const;
-
- enum ActionEvent { Trigger, Hover };
- void activate(ActionEvent event);
- bool showStatusText(QWidget *widget = nullptr);
-
- void setMenuRole(MenuRole menuRole);
- MenuRole menuRole() const;
-
- void setIconVisibleInMenu(bool visible);
- bool isIconVisibleInMenu() const;
-
- void setShortcutVisibleInContextMenu(bool show);
- bool isShortcutVisibleInContextMenu() const;
-
- QWidget *parentWidget() const;
-
- QList<QWidget *> associatedWidgets() const;
-#if QT_CONFIG(graphicsview)
- QList<QGraphicsWidget *> associatedGraphicsWidgets() const; // ### suboptimal
-#endif
-
-protected:
- bool event(QEvent *) override;
- QAction(QActionPrivate &dd, QObject *parent);
-
-public Q_SLOTS:
- void trigger() { activate(Trigger); }
- void hover() { activate(Hover); }
- void setChecked(bool);
- void toggle();
- void setEnabled(bool);
- inline void setDisabled(bool b) { setEnabled(!b); }
- void setVisible(bool);
-
-Q_SIGNALS:
- void changed();
- void triggered(bool checked = false);
- void hovered();
- void toggled(bool);
-
-private:
- Q_DISABLE_COPY(QAction)
-
- friend class QGraphicsWidget;
- friend class QWidget;
- friend class QActionGroup;
- friend class QMenu;
- friend class QMenuPrivate;
- friend class QMenuBar;
- friend class QToolButton;
-#ifdef Q_OS_MAC
- friend void qt_mac_clear_status_text(QAction *action);
-#endif
-};
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_WIDGETS_EXPORT QDebug operator<<(QDebug, const QAction *);
-#endif
-
-QT_BEGIN_INCLUDE_NAMESPACE
-#include <QtWidgets/qactiongroup.h>
-QT_END_INCLUDE_NAMESPACE
-
-#endif // QT_NO_ACTION
-
-QT_END_NAMESPACE
-
-#endif // QACTION_H
diff --git a/src/widgets/kernel/qaction_p.h b/src/widgets/kernel/qaction_p.h
deleted file mode 100644
index 6b6ca8076f..0000000000
--- a/src/widgets/kernel/qaction_p.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QACTION_P_H
-#define QACTION_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of other Qt classes. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtWidgets/private/qtwidgetsglobal_p.h>
-#include "QtWidgets/qaction.h"
-#if QT_CONFIG(menu)
-#include "QtWidgets/qmenu.h"
-#endif
-#if QT_CONFIG(graphicsview)
-#include "private/qgraphicswidget_p.h"
-#endif
-#include "private/qobject_p.h"
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_ACTION
-
-
-class QShortcutMap;
-
-class Q_WIDGETS_EXPORT QActionPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QAction)
-public:
- QActionPrivate();
- ~QActionPrivate();
-
- static QActionPrivate *get(QAction *q)
- {
- return q->d_func();
- }
-
- bool showStatusText(QWidget *w, const QString &str);
-
- QPointer<QActionGroup> group;
- QString text;
- QString iconText;
- QIcon icon;
- QString tooltip;
- QString statustip;
- QString whatsthis;
-#if QT_CONFIG(shortcut)
- QKeySequence shortcut;
- QList<QKeySequence> alternateShortcuts;
-#endif
- QVariant userData;
-#if QT_CONFIG(shortcut)
- int shortcutId = 0;
- QVector<int> alternateShortcutIds;
- Qt::ShortcutContext shortcutContext = Qt::WindowShortcut;
- uint autorepeat : 1;
-#endif
- QFont font;
- QPointer<QMenu> menu;
- uint enabled : 1, forceDisabled : 1;
- uint visible : 1, forceInvisible : 1;
- uint checkable : 1;
- uint checked : 1;
- uint separator : 1;
- uint fontSet : 1;
-
- int iconVisibleInMenu : 2; // Only has values -1, 0, and 1
- int shortcutVisibleInContextMenu : 2; // Only has values -1, 0, and 1
-
- QAction::MenuRole menuRole = QAction::TextHeuristicRole;
- QAction::Priority priority = QAction::NormalPriority;
-
- QWidgetList widgets;
-#if QT_CONFIG(graphicsview)
- QList<QGraphicsWidget *> graphicsWidgets;
-#endif
-#if QT_CONFIG(shortcut)
- void redoGrab(QShortcutMap &map);
- void redoGrabAlternate(QShortcutMap &map);
- void setShortcutEnabled(bool enable, QShortcutMap &map);
-#endif // QT_NO_SHORTCUT
-
- void sendDataChanged();
-};
-
-#endif // QT_NO_ACTION
-
-QT_END_NAMESPACE
-
-#endif // QACTION_P_H
diff --git a/src/widgets/kernel/qaction_widgets.cpp b/src/widgets/kernel/qaction_widgets.cpp
new file mode 100644
index 0000000000..ff609a66a1
--- /dev/null
+++ b/src/widgets/kernel/qaction_widgets.cpp
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaction.h"
+
+#include <private/qapplication_p.h>
+#include "qaction_widgets_p.h"
+#if QT_CONFIG(menu)
+#include <private/qmenu_p.h>
+#endif
+#if QT_CONFIG(graphicsview)
+#include "qgraphicswidget.h"
+#endif
+
+
+QT_BEGIN_NAMESPACE
+
+QActionPrivate *QApplicationPrivate::createActionPrivate() const
+{
+ return new QtWidgetsActionPrivate;
+}
+
+QtWidgetsActionPrivate::~QtWidgetsActionPrivate() = default;
+
+// we can't do this in the destructor, as it would only be called by ~QObject
+void QtWidgetsActionPrivate::destroy()
+{
+ Q_Q(QAction);
+ const auto objects = associatedObjects;
+ for (int i = objects.size()-1; i >= 0; --i) {
+ QObject *object = objects.at(i);
+ if (QWidget *widget = qobject_cast<QWidget*>(object))
+ widget->removeAction(q);
+#if QT_CONFIG(graphicsview)
+ else if (QGraphicsWidget *graphicsWidget = qobject_cast<QGraphicsWidget*>(object))
+ graphicsWidget->removeAction(q);
+#endif
+ }
+}
+
+QShortcutMap::ContextMatcher QtWidgetsActionPrivate::contextMatcher() const
+{
+ return qWidgetShortcutContextMatcher;
+}
+
+#if QT_CONFIG(menu)
+QObject *QtWidgetsActionPrivate::menu() const
+{
+ return m_menu;
+}
+
+void QtWidgetsActionPrivate::setMenu(QObject *menu)
+{
+ Q_Q(QAction);
+ QMenu *theMenu = qobject_cast<QMenu*>(menu);
+ Q_ASSERT_X(!menu || theMenu, "QAction::setMenu",
+ "QAction::setMenu expects a QMenu* in widget applications");
+ if (m_menu)
+ m_menu->d_func()->setOverrideMenuAction(nullptr); //we reset the default action of any previous menu
+ m_menu = theMenu;
+ if (m_menu)
+ m_menu->d_func()->setOverrideMenuAction(q);
+ sendDataChanged();
+}
+#endif // QT_CONFIG(menu)
+
+QT_END_NAMESPACE
diff --git a/src/widgets/kernel/qaction_widgets_p.h b/src/widgets/kernel/qaction_widgets_p.h
new file mode 100644
index 0000000000..02387c7371
--- /dev/null
+++ b/src/widgets/kernel/qaction_widgets_p.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QACTION_WIDGETS_P_H
+#define QACTION_WIDGETS_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/private/qaction_p.h>
+#include <QtWidgets/qmenu.h>
+
+QT_REQUIRE_CONFIG(action);
+
+QT_BEGIN_NAMESPACE
+
+class QShortcutMap;
+
+class Q_WIDGETS_EXPORT QtWidgetsActionPrivate : public QActionPrivate
+{
+ Q_DECLARE_PUBLIC(QAction)
+public:
+ QtWidgetsActionPrivate() = default;
+ ~QtWidgetsActionPrivate();
+
+ void destroy() override;
+
+#if QT_CONFIG(shortcut)
+ QShortcutMap::ContextMatcher contextMatcher() const override;
+#endif
+
+ QPointer<QMenu> m_menu;
+
+ QObject *menu() const override;
+ void setMenu(QObject *menu) override;
+};
+
+QT_END_NAMESPACE
+
+#endif // QACTION_WIDGETS_P_H
diff --git a/src/widgets/kernel/qactiongroup.cpp b/src/widgets/kernel/qactiongroup.cpp
deleted file mode 100644
index d51fb778c4..0000000000
--- a/src/widgets/kernel/qactiongroup.cpp
+++ /dev/null
@@ -1,445 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qactiongroup.h"
-
-#ifndef QT_NO_ACTION
-
-#include "qaction_p.h"
-#include "qevent.h"
-#include "qlist.h"
-
-QT_BEGIN_NAMESPACE
-
-class QActionGroupPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QActionGroup)
-public:
- QActionGroupPrivate() : enabled(1),
- visible(1),
- exclusionPolicy(QActionGroup::ExclusionPolicy::Exclusive)
- {
- }
- QList<QAction *> actions;
- QPointer<QAction> current;
- uint enabled : 1;
- uint visible : 1;
- QActionGroup::ExclusionPolicy exclusionPolicy;
-
-private:
- void _q_actionTriggered(); //private slot
- void _q_actionChanged(); //private slot
- void _q_actionHovered(); //private slot
-};
-
-void QActionGroupPrivate::_q_actionChanged()
-{
- Q_Q(QActionGroup);
- QAction *action = qobject_cast<QAction*>(q->sender());
- Q_ASSERT_X(action != nullptr, "QActionGroup::_q_actionChanged", "internal error");
- if (exclusionPolicy != QActionGroup::ExclusionPolicy::None) {
- if (action->isChecked()) {
- if (action != current) {
- if(current)
- current->setChecked(false);
- current = action;
- }
- } else if (action == current) {
- current = nullptr;
- }
- }
-}
-
-void QActionGroupPrivate::_q_actionTriggered()
-{
- Q_Q(QActionGroup);
- QAction *action = qobject_cast<QAction*>(q->sender());
- Q_ASSERT_X(action != nullptr, "QActionGroup::_q_actionTriggered", "internal error");
- emit q->triggered(action);
-}
-
-void QActionGroupPrivate::_q_actionHovered()
-{
- Q_Q(QActionGroup);
- QAction *action = qobject_cast<QAction*>(q->sender());
- Q_ASSERT_X(action != nullptr, "QActionGroup::_q_actionHovered", "internal error");
- emit q->hovered(action);
-}
-
-/*!
- \class QActionGroup
- \brief The QActionGroup class groups actions together.
-
- \ingroup mainwindow-classes
- \inmodule QtWidgets
-
- In some situations it is useful to group QAction objects together.
- For example, if you have a \uicontrol{Left Align} action, a \uicontrol{Right
- Align} action, a \uicontrol{Justify} action, and a \uicontrol{Center} action,
- only one of these actions should be active at any one time. One
- simple way of achieving this is to group the actions together in
- an action group.
-
- Here's a example (from the \l{mainwindows/menus}{Menus} example):
-
- \snippet mainwindows/menus/mainwindow.cpp 6
-
- Here we create a new action group. Since the action group is
- exclusive by default, only one of the actions in the group is
- checked at any one time.
-
- \image qactiongroup-align.png Alignment options in a QMenu
-
- A QActionGroup emits an triggered() signal when one of its
- actions is chosen. Each action in an action group emits its
- triggered() signal as usual.
-
- As stated above, an action group is exclusive by default; it
- ensures that at most only one checkable action is active at any one time.
- If you want to group checkable actions without making them
- exclusive, you can turn off exclusiveness by calling
- setExclusive(false).
-
- By default the active action of an exclusive group cannot be unchecked.
- In some cases it may be useful to allow unchecking all the actions,
- you can allow this by calling
- setExclusionPolicy(QActionGroup::ExclusionPolicy::ExclusiveOptional).
-
- Actions can be added to an action group using addAction(), but it
- is usually more convenient to specify a group when creating
- actions; this ensures that actions are automatically created with
- a parent. Actions can be visually separated from each other by
- adding a separator action to the group; create an action and use
- QAction's \l {QAction::}{setSeparator()} function to make it
- considered a separator. Action groups are added to widgets with
- the QWidget::addActions() function.
-
- \sa QAction
-*/
-
-/*!
- \enum QActionGroup::ExclusionPolicy
-
- This enum specifies the different policies that can be used to
- control how the group performs exclusive checking on checkable actions.
-
- \value None
- The actions in the group can be checked independently of each other.
-
- \value Exclusive
- Exactly one action can be checked at any one time.
- This is the default policy.
-
- \value ExclusiveOptional
- At most one action can be checked at any one time. The actions
- can also be all unchecked.
-
- \sa exclusionPolicy
- \since 5.14
-*/
-
-/*!
- Constructs an action group for the \a parent object.
-
- The action group is exclusive by default. Call setExclusive(false)
- to make the action group non-exclusive. To make the group exclusive
- but allow unchecking the active action call instead
- setExclusionPolicy(QActionGroup::ExclusionPolicy::ExclusiveOptional)
-*/
-QActionGroup::QActionGroup(QObject* parent) : QObject(*new QActionGroupPrivate, parent)
-{
-}
-
-/*!
- Destroys the action group.
-*/
-QActionGroup::~QActionGroup()
-{
-}
-
-/*!
- \fn QAction *QActionGroup::addAction(QAction *action)
-
- Adds the \a action to this group, and returns it.
-
- Normally an action is added to a group by creating it with the
- group as its parent, so this function is not usually used.
-
- \sa QAction::setActionGroup()
-*/
-QAction *QActionGroup::addAction(QAction* a)
-{
- Q_D(QActionGroup);
- if(!d->actions.contains(a)) {
- d->actions.append(a);
- QObject::connect(a, SIGNAL(triggered()), this, SLOT(_q_actionTriggered()));
- QObject::connect(a, SIGNAL(changed()), this, SLOT(_q_actionChanged()));
- QObject::connect(a, SIGNAL(hovered()), this, SLOT(_q_actionHovered()));
- }
- if(!a->d_func()->forceDisabled) {
- a->setEnabled(d->enabled);
- a->d_func()->forceDisabled = false;
- }
- if(!a->d_func()->forceInvisible) {
- a->setVisible(d->visible);
- a->d_func()->forceInvisible = false;
- }
- if(a->isChecked())
- d->current = a;
- QActionGroup *oldGroup = a->d_func()->group;
- if(oldGroup != this) {
- if (oldGroup)
- oldGroup->removeAction(a);
- a->d_func()->group = this;
- a->d_func()->sendDataChanged();
- }
- return a;
-}
-
-/*!
- Creates and returns an action with \a text. The newly created
- action is a child of this action group.
-
- Normally an action is added to a group by creating it with the
- group as parent, so this function is not usually used.
-
- \sa QAction::setActionGroup()
-*/
-QAction *QActionGroup::addAction(const QString &text)
-{
- return new QAction(text, this);
-}
-
-/*!
- Creates and returns an action with \a text and an \a icon. The
- newly created action is a child of this action group.
-
- Normally an action is added to a group by creating it with the
- group as its parent, so this function is not usually used.
-
- \sa QAction::setActionGroup()
-*/
-QAction *QActionGroup::addAction(const QIcon &icon, const QString &text)
-{
- return new QAction(icon, text, this);
-}
-
-/*!
- Removes the \a action from this group. The action will have no
- parent as a result.
-
- \sa QAction::setActionGroup()
-*/
-void QActionGroup::removeAction(QAction *action)
-{
- Q_D(QActionGroup);
- if (d->actions.removeAll(action)) {
- if (action == d->current)
- d->current = nullptr;
- QObject::disconnect(action, SIGNAL(triggered()), this, SLOT(_q_actionTriggered()));
- QObject::disconnect(action, SIGNAL(changed()), this, SLOT(_q_actionChanged()));
- QObject::disconnect(action, SIGNAL(hovered()), this, SLOT(_q_actionHovered()));
- action->d_func()->group = nullptr;
- }
-}
-
-/*!
- Returns the list of this groups's actions. This may be empty.
-*/
-QList<QAction*> QActionGroup::actions() const
-{
- Q_D(const QActionGroup);
- return d->actions;
-}
-
-/*!
- \brief Enable or disable the group exclusion checking
-
- This is a convenience method that calls
- setExclusionPolicy(ExclusionPolicy::Exclusive) when \a b is true,
- else setExclusionPolicy(QActionGroup::ExclusionPolicy::None).
-
- \sa QActionGroup::exclusionPolicy
-*/
-void QActionGroup::setExclusive(bool b)
-{
- setExclusionPolicy(b ? QActionGroup::ExclusionPolicy::Exclusive
- : QActionGroup::ExclusionPolicy::None);
-}
-
-/*!
- \brief Returns true if the group is exclusive
-
- The group is exclusive if the ExclusionPolicy is either Exclusive
- or ExclusionOptional.
-
-*/
-bool QActionGroup::isExclusive() const
-{
- return exclusionPolicy() != QActionGroup::ExclusionPolicy::None;
-}
-
-/*!
- \property QActionGroup::exclusionPolicy
- \brief This property holds the group exclusive checking policy
-
- If exclusionPolicy is set to Exclusive, only one checkable
- action in the action group can ever be active at any time. If the user
- chooses another checkable action in the group, the one they chose becomes
- active and the one that was active becomes inactive. If exclusionPolicy is
- set to ExclusionOptional the group is exclusive but the active checkable
- action in the group can be unchecked leaving the group with no actions
- checked.
-
- \sa QAction::checkable
- \since 5.14
-*/
-void QActionGroup::setExclusionPolicy(QActionGroup::ExclusionPolicy policy)
-{
- Q_D(QActionGroup);
- d->exclusionPolicy = policy;
-}
-
-QActionGroup::ExclusionPolicy QActionGroup::exclusionPolicy() const
-{
- Q_D(const QActionGroup);
- return d->exclusionPolicy;
-}
-
-/*!
- \fn void QActionGroup::setDisabled(bool b)
-
- This is a convenience function for the \l enabled property, that
- is useful for signals--slots connections. If \a b is true the
- action group is disabled; otherwise it is enabled.
-*/
-
-/*!
- \property QActionGroup::enabled
- \brief whether the action group is enabled
-
- Each action in the group will be enabled or disabled unless it
- has been explicitly disabled.
-
- \sa QAction::setEnabled()
-*/
-void QActionGroup::setEnabled(bool b)
-{
- Q_D(QActionGroup);
- d->enabled = b;
- for (auto action : qAsConst(d->actions)) {
- if (!action->d_func()->forceDisabled) {
- action->setEnabled(b);
- action->d_func()->forceDisabled = false;
- }
- }
-}
-
-bool QActionGroup::isEnabled() const
-{
- Q_D(const QActionGroup);
- return d->enabled;
-}
-
-/*!
- Returns the currently checked action in the group, or \nullptr if
- none are checked.
-*/
-QAction *QActionGroup::checkedAction() const
-{
- Q_D(const QActionGroup);
- return d->current;
-}
-
-/*!
- \property QActionGroup::visible
- \brief whether the action group is visible
-
- Each action in the action group will match the visible state of
- this group unless it has been explicitly hidden.
-
- \sa QAction::setEnabled()
-*/
-void QActionGroup::setVisible(bool b)
-{
- Q_D(QActionGroup);
- d->visible = b;
- for (auto action : qAsConst(d->actions)) {
- if (!action->d_func()->forceInvisible) {
- action->setVisible(b);
- action->d_func()->forceInvisible = false;
- }
- }
-}
-
-bool QActionGroup::isVisible() const
-{
- Q_D(const QActionGroup);
- return d->visible;
-}
-
-/*!
- \fn void QActionGroup::triggered(QAction *action)
-
- This signal is emitted when the given \a action in the action
- group is activated by the user; for example, when the user clicks
- a menu option, toolbar button, or presses an action's shortcut key
- combination.
-
- Connect to this signal for command actions.
-
- \sa QAction::activate()
-*/
-
-/*!
- \fn void QActionGroup::hovered(QAction *action)
-
- This signal is emitted when the given \a action in the action
- group is highlighted by the user; for example, when the user
- pauses with the cursor over a menu option, toolbar button, or
- presses an action's shortcut key combination.
-
- \sa QAction::activate()
-*/
-
-QT_END_NAMESPACE
-
-#include "moc_qactiongroup.cpp"
-
-#endif // QT_NO_ACTION
diff --git a/src/widgets/kernel/qactiongroup.h b/src/widgets/kernel/qactiongroup.h
deleted file mode 100644
index 90f488bedb..0000000000
--- a/src/widgets/kernel/qactiongroup.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QACTIONGROUP_H
-#define QACTIONGROUP_H
-
-#include <QtWidgets/qtwidgetsglobal.h>
-#include <QtWidgets/qaction.h>
-
-QT_BEGIN_NAMESPACE
-
-
-#ifndef QT_NO_ACTION
-
-class QActionGroupPrivate;
-
-class Q_WIDGETS_EXPORT QActionGroup : public QObject
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QActionGroup)
-
- Q_PROPERTY(QActionGroup::ExclusionPolicy exclusionPolicy READ exclusionPolicy WRITE setExclusionPolicy)
- Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
- Q_PROPERTY(bool visible READ isVisible WRITE setVisible)
-
-public:
- enum class ExclusionPolicy {
- None,
- Exclusive,
- ExclusiveOptional
- };
- Q_ENUM(ExclusionPolicy)
-
- explicit QActionGroup(QObject* parent);
- ~QActionGroup();
-
- QAction *addAction(QAction* a);
- QAction *addAction(const QString &text);
- QAction *addAction(const QIcon &icon, const QString &text);
- void removeAction(QAction *a);
- QList<QAction*> actions() const;
-
- QAction *checkedAction() const;
- bool isExclusive() const;
- bool isEnabled() const;
- bool isVisible() const;
- ExclusionPolicy exclusionPolicy() const;
-
-
-public Q_SLOTS:
- void setEnabled(bool);
- inline void setDisabled(bool b) { setEnabled(!b); }
- void setVisible(bool);
- void setExclusive(bool);
- void setExclusionPolicy(ExclusionPolicy policy);
-
-Q_SIGNALS:
- void triggered(QAction *);
- void hovered(QAction *);
-
-private:
- Q_DISABLE_COPY(QActionGroup)
- Q_PRIVATE_SLOT(d_func(), void _q_actionTriggered())
- Q_PRIVATE_SLOT(d_func(), void _q_actionChanged())
- Q_PRIVATE_SLOT(d_func(), void _q_actionHovered())
-};
-
-#endif // QT_NO_ACTION
-
-QT_END_NAMESPACE
-
-#endif // QACTIONGROUP_H
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp
index 4ea70096e8..27af52e199 100644
--- a/src/widgets/kernel/qapplication.cpp
+++ b/src/widgets/kernel/qapplication.cpp
@@ -58,7 +58,9 @@
#include "qstyle.h"
#include "qstyleoption.h"
#include "qstylefactory.h"
+#if QT_CONFIG(tooltip)
#include "qtooltip.h"
+#endif
#include "qtranslator.h"
#include "qvariant.h"
#include "qwidget.h"
@@ -90,6 +92,7 @@
#include <private/qthread_p.h>
#include <private/qfont_p.h>
+#include <private/qaction_p.h>
#include <stdlib.h>
@@ -101,10 +104,6 @@
#include "private/qgesturemanager_p.h"
#include <qpa/qplatformfontdatabase.h>
-#ifdef Q_OS_WIN
-#include <QtCore/qt_windows.h> // for qt_win_display_dc()
-#endif
-
#include "qdatetime.h"
#include <qpa/qplatformwindow.h>
@@ -308,22 +307,6 @@ void QApplicationPrivate::createEventDispatcher()
\sa QCoreApplication, QAbstractEventDispatcher, QEventLoop, QSettings
*/
-#if QT_DEPRECATED_SINCE(5, 8)
-// ### fixme: Qt 6: Remove ColorSpec and accessors.
-/*!
- \enum QApplication::ColorSpec
- \obsolete
-
- \value NormalColor the default color allocation policy
- \value CustomColor the same as NormalColor for X11; allocates colors
- to a palette on demand under Windows
- \value ManyColor the right choice for applications that use thousands of
- colors
-
- See setColorSpec() for full details.
-*/
-#endif
-
/*!
\fn QWidget *QApplication::topLevelAt(const QPoint &point)
@@ -369,7 +352,6 @@ QPointer<QWidget> QApplicationPrivate::wheel_widget;
#endif
bool qt_in_tab_key_event = false;
int qt_antialiasing_threshold = -1;
-QSize QApplicationPrivate::app_strut = QSize(0,0); // no default application strut
int QApplicationPrivate::enabledAnimations = QPlatformTheme::GeneralUiEffect;
bool QApplicationPrivate::widgetCount = false;
#ifdef QT_KEYPAD_NAVIGATION
@@ -535,7 +517,7 @@ void QApplicationPrivate::init()
void qt_init_tooltip_palette()
{
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
if (const QPalette *toolTipPalette = QGuiApplicationPrivate::platformTheme()->palette(QPlatformTheme::ToolTipPalette))
QToolTip::setPalette(*toolTipPalette);
#endif
@@ -760,7 +742,6 @@ QApplication::~QApplication()
QApplicationPrivate::obey_desktop_settings = true;
- QApplicationPrivate::app_strut = QSize(0, 0);
QApplicationPrivate::enabledAnimations = QPlatformTheme::GeneralUiEffect;
QApplicationPrivate::widgetCount = false;
@@ -770,35 +751,12 @@ QApplication::~QApplication()
#endif
}
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
-// #fixme: Remove.
-static HDC displayDC = 0; // display device context
-
-Q_WIDGETS_EXPORT HDC qt_win_display_dc() // get display DC
-{
- Q_ASSERT(qApp && qApp->thread() == QThread::currentThread());
- if (!displayDC)
- displayDC = GetDC(0);
- return displayDC;
-}
-#endif
-#endif
-
void qt_cleanup()
{
QPixmapCache::clear();
QColormap::cleanup();
QApplicationPrivate::active_window = nullptr; //### this should not be necessary
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
- if (displayDC) {
- ReleaseDC(0, displayDC);
- displayDC = 0;
- }
-#endif
-#endif
}
/*!
@@ -1143,109 +1101,6 @@ QStyle* QApplication::setStyle(const QString& style)
return s;
}
-#if QT_DEPRECATED_SINCE(5, 8)
-/*!
- Returns the color specification.
- \obsolete
-
- \sa QApplication::setColorSpec()
-*/
-
-int QApplication::colorSpec()
-{
- return QApplication::NormalColor;
-}
-
-/*!
- Sets the color specification for the application to \a spec.
- \obsolete
-
- This call has no effect.
-
- The color specification controls how the application allocates colors when
- run on a display with a limited amount of colors, e.g. 8 bit / 256 color
- displays.
-
- The color specification must be set before you create the QApplication
- object.
-
- The options are:
- \list
- \li QApplication::NormalColor. This is the default color allocation
- strategy. Use this option if your application uses buttons, menus,
- texts and pixmaps with few colors. With this option, the
- application uses system global colors. This works fine for most
- applications under X11, but on the Windows platform, it may cause
- dithering of non-standard colors.
- \li QApplication::CustomColor. Use this option if your application
- needs a small number of custom colors. On X11, this option is the
- same as NormalColor. On Windows, Qt creates a Windows palette, and
- allocates colors to it on demand.
- \li QApplication::ManyColor. Use this option if your application is
- very color hungry, e.g., it requires thousands of colors. \br
- Under X11 the effect is:
- \list
- \li For 256-color displays which have at best a 256 color true
- color visual, the default visual is used, and colors are
- allocated from a color cube. The color cube is the 6x6x6
- (216 color) "Web palette" (the red, green, and blue
- components always have one of the following values: 0x00,
- 0x33, 0x66, 0x99, 0xCC, or 0xFF), but the number of colors
- can be changed by the \e -ncols option. The user can force
- the application to use the true color visual with the
- \l{QApplication::QApplication()}{-visual} option.
- \li For 256-color displays which have a true color visual with
- more than 256 colors, use that visual. Silicon Graphics X
- servers this feature, for example. They provide an 8 bit
- visual by default but can deliver true color when asked.
- \endlist
- On Windows, Qt creates a Windows palette, and fills it with a color
- cube.
- \endlist
-
- Be aware that the CustomColor and ManyColor choices may lead to colormap
- flashing: The foreground application gets (most) of the available colors,
- while the background windows will look less attractive.
-
- Example:
-
- \snippet code/src_gui_kernel_qapplication.cpp 2
-
- \sa colorSpec()
-*/
-
-void QApplication::setColorSpec(int spec)
-{
- Q_UNUSED(spec)
-}
-#endif
-
-/*!
- \property QApplication::globalStrut
- \brief the minimum size that any GUI element that the user can interact
- with should have
- \deprecated
-
- For example, no button should be resized to be smaller than the global
- strut size. The strut size should be considered when reimplementing GUI
- controls that may be used on touch-screens or similar I/O devices.
-
- Example:
-
- \snippet code/src_gui_kernel_qapplication.cpp 3
-
- By default, this property contains a QSize object with zero width and height.
-*/
-QSize QApplication::globalStrut()
-{
- return QApplicationPrivate::app_strut;
-}
-
-void QApplication::setGlobalStrut(const QSize& strut)
-{
- QApplicationPrivate::app_strut = strut;
-}
-
// Widget specific palettes
QApplicationPrivate::PaletteHash QApplicationPrivate::widgetPalettes;
@@ -1571,24 +1426,6 @@ QString QApplicationPrivate::desktopStyleKey()
return QString();
}
-#if QT_VERSION < 0x060000 // remove these forwarders in Qt 6
-/*!
- \property QApplication::windowIcon
- \brief the default window icon
-
- \sa QWidget::setWindowIcon(), {Setting the Application Icon}
-*/
-QIcon QApplication::windowIcon()
-{
- return QGuiApplication::windowIcon();
-}
-
-void QApplication::setWindowIcon(const QIcon &icon)
-{
- QGuiApplication::setWindowIcon(icon);
-}
-#endif
-
void QApplicationPrivate::notifyWindowIconChanged()
{
QEvent ev(QEvent::ApplicationWindowIconChange);
@@ -1696,7 +1533,7 @@ void QApplicationPrivate::setFocusWidget(QWidget *focus, Qt::FocusReason reason)
//send events
if (prev) {
#ifdef QT_KEYPAD_NAVIGATION
- if (QApplication::keypadNavigationEnabled()) {
+ if (QApplicationPrivate::keyboardNavigationEnabled()) {
if (prev->hasEditFocus() && reason != Qt::PopupFocusReason)
prev->setEditFocus(false);
}
@@ -3322,7 +3159,7 @@ QT_WARNING_POP
break;
#endif // QT_CONFIG(tabletevent)
-#if !defined(QT_NO_TOOLTIP) || QT_CONFIG(whatsthis)
+#if QT_CONFIG(tooltip) || QT_CONFIG(whatsthis)
case QEvent::ToolTip:
case QEvent::WhatsThis:
case QEvent::QueryWhatsThis:
@@ -3821,51 +3658,6 @@ Qt::NavigationMode QApplication::navigationMode()
{
return QApplicationPrivate::navigationMode;
}
-
-# if QT_DEPRECATED_SINCE(5, 13)
-/*!
- Sets whether Qt should use focus navigation suitable for use with a
- minimal keypad.
-
- This feature is available in Qt for Embedded Linux, and Windows CE only.
-
- \note On Windows CE this feature is disabled by default for touch device
- mkspecs. To enable keypad navigation, build Qt with
- QT_KEYPAD_NAVIGATION defined.
-
- \deprecated
-
- \sa setNavigationMode()
-*/
-void QApplication::setKeypadNavigationEnabled(bool enable)
-{
- if (enable) {
- QApplication::setNavigationMode(Qt::NavigationModeKeypadTabOrder);
- } else {
- QApplication::setNavigationMode(Qt::NavigationModeNone);
- }
-}
-
-/*!
- Returns \c true if Qt is set to use keypad navigation; otherwise returns
- false. The default value is false.
-
- This feature is available in Qt for Embedded Linux, and Windows CE only.
-
- \note On Windows CE this feature is disabled by default for touch device
- mkspecs. To enable keypad navigation, build Qt with
- QT_KEYPAD_NAVIGATION defined.
-
- \deprecated
-
- \sa navigationMode()
-*/
-bool QApplication::keypadNavigationEnabled()
-{
- return QApplicationPrivate::navigationMode == Qt::NavigationModeKeypadTabOrder ||
- QApplicationPrivate::navigationMode == Qt::NavigationModeKeypadDirectional;
-}
-# endif
#endif
/*!
diff --git a/src/widgets/kernel/qapplication.h b/src/widgets/kernel/qapplication.h
index 6de72899f1..974c789e08 100644
--- a/src/widgets/kernel/qapplication.h
+++ b/src/widgets/kernel/qapplication.h
@@ -58,7 +58,6 @@ class QDesktopWidget;
class QStyle;
class QEventLoop;
class QIcon;
-template <typename T> class QList;
class QLocale;
class QPlatformNativeInterface;
@@ -72,16 +71,12 @@ class QApplicationPrivate;
class Q_WIDGETS_EXPORT QApplication : public QGuiApplication
{
Q_OBJECT
- Q_PROPERTY(QIcon windowIcon READ windowIcon WRITE setWindowIcon)
Q_PROPERTY(int cursorFlashTime READ cursorFlashTime WRITE setCursorFlashTime)
Q_PROPERTY(int doubleClickInterval READ doubleClickInterval WRITE setDoubleClickInterval)
Q_PROPERTY(int keyboardInputInterval READ keyboardInputInterval WRITE setKeyboardInputInterval)
#if QT_CONFIG(wheelevent)
Q_PROPERTY(int wheelScrollLines READ wheelScrollLines WRITE setWheelScrollLines)
#endif
-#if QT_DEPRECATED_SINCE(5, 15)
- Q_PROPERTY(QSize globalStrut READ globalStrut WRITE setGlobalStrut)
-#endif
Q_PROPERTY(int startDragTime READ startDragTime WRITE setStartDragTime)
Q_PROPERTY(int startDragDistance READ startDragDistance WRITE setStartDragDistance)
#ifndef QT_NO_STYLE_STYLESHEET
@@ -100,14 +95,6 @@ public:
static QStyle *style();
static void setStyle(QStyle*);
static QStyle *setStyle(const QString&);
- enum ColorSpec { NormalColor=0, CustomColor=1, ManyColor=2 };
-#if QT_DEPRECATED_SINCE(5, 8)
- QT_DEPRECATED static int colorSpec();
- QT_DEPRECATED static void setColorSpec(int);
-#endif // QT_DEPRECATED_SINCE(5, 8)
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED static inline void setGraphicsSystem(const QString &) {}
-#endif
using QGuiApplication::palette;
static QPalette palette(const QWidget *);
@@ -119,11 +106,6 @@ public:
static void setFont(const QFont &, const char* className = nullptr);
static QFontMetrics fontMetrics();
-#if QT_VERSION < 0x060000 // remove these forwarders in Qt 6
- static void setWindowIcon(const QIcon &icon);
- static QIcon windowIcon();
-#endif
-
static QWidgetList allWidgets();
static QWidgetList topLevelWidgets();
@@ -141,9 +123,6 @@ public:
static QWidget *topLevelAt(const QPoint &p);
static inline QWidget *topLevelAt(int x, int y) { return topLevelAt(QPoint(x, y)); }
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED static inline void syncX() {}
-#endif
static void beep();
static void alert(QWidget *widget, int duration = 0);
@@ -160,10 +139,6 @@ public:
static void setWheelScrollLines(int);
static int wheelScrollLines();
#endif
-#if QT_DEPRECATED_SINCE(5, 15)
- static void setGlobalStrut(const QSize &);
- static QSize globalStrut();
-#endif
static void setStartDragTime(int ms);
static int startDragTime();
@@ -173,23 +148,10 @@ public:
static bool isEffectEnabled(Qt::UIEffect);
static void setEffectEnabled(Qt::UIEffect, bool enable = true);
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED static QLocale keyboardInputLocale()
- { return qApp ? QGuiApplication::inputMethod()->locale() : QLocale::c(); }
- QT_DEPRECATED static Qt::LayoutDirection keyboardInputDirection()
- { return qApp ? QGuiApplication::inputMethod()->inputDirection() : Qt::LeftToRight; }
-#endif
-
static int exec();
bool notify(QObject *, QEvent *) override;
#ifdef QT_KEYPAD_NAVIGATION
-# if QT_DEPRECATED_SINCE(5, 13)
- static QT_DEPRECATED_X ("Use QApplication::setNavigationMode() instead")
- void setKeypadNavigationEnabled(bool);
- static QT_DEPRECATED_X ("Use QApplication::navigationMode() instead")
- bool keypadNavigationEnabled();
-# endif
static void setNavigationMode(Qt::NavigationMode mode);
static Qt::NavigationMode navigationMode();
#endif
diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h
index ab6d85aeb9..e1e391b13d 100644
--- a/src/widgets/kernel/qapplication_p.h
+++ b/src/widgets/kernel/qapplication_p.h
@@ -117,6 +117,13 @@ public:
void notifyWindowIconChanged() override;
+#ifndef QT_NO_ACTION
+ QActionPrivate *createActionPrivate() const override;
+#endif
+#ifndef QT_NO_SHORTCUT
+ QShortcutPrivate *createShortcutPrivate() const override;
+#endif
+
//modality
bool isWindowBlocked(QWindow *window, QWindow **blockingWindow = nullptr) const override;
static bool isBlockedByModal(QWidget *widget);
diff --git a/src/widgets/kernel/qlayout.cpp b/src/widgets/kernel/qlayout.cpp
index d4ff9083f1..901e136f61 100644
--- a/src/widgets/kernel/qlayout.cpp
+++ b/src/widgets/kernel/qlayout.cpp
@@ -282,40 +282,6 @@ bool QLayout::setAlignment(QLayout *l, Qt::Alignment alignment)
return false;
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \property QLayout::margin
- \brief the width of the outside border of the layout
- \obsolete
-
- Use setContentsMargins() and getContentsMargins() instead.
-
- \sa contentsRect(), spacing
-*/
-
-/*!
- \obsolete
-*/
-int QLayout::margin() const
-{
- int left, top, right, bottom;
- getContentsMargins(&left, &top, &right, &bottom);
- if (left == top && top == right && right == bottom) {
- return left;
- } else {
- return -1;
- }
-}
-
-/*!
- \obsolete
-*/
-void QLayout::setMargin(int margin)
-{
- setContentsMargins(margin, margin, margin, margin);
-}
-
-#endif
/*!
\property QLayout::spacing
\brief the spacing between widgets inside the layout
diff --git a/src/widgets/kernel/qlayout.h b/src/widgets/kernel/qlayout.h
index 35a04a35b2..1c06f1e3eb 100644
--- a/src/widgets/kernel/qlayout.h
+++ b/src/widgets/kernel/qlayout.h
@@ -63,9 +63,6 @@ class Q_WIDGETS_EXPORT QLayout : public QObject, public QLayoutItem
Q_OBJECT
Q_DECLARE_PRIVATE(QLayout)
-#if QT_DEPRECATED_SINCE(5, 13)
- Q_PROPERTY(int margin READ margin WRITE setMargin)
-#endif
Q_PROPERTY(int spacing READ spacing WRITE setSpacing)
Q_PROPERTY(SizeConstraint sizeConstraint READ sizeConstraint WRITE setSizeConstraint)
public:
@@ -83,11 +80,6 @@ public:
QLayout();
~QLayout();
-#if QT_DEPRECATED_SINCE(5, 13)
- int margin() const;
- void setMargin(int);
-#endif
-
int spacing() const;
void setSpacing(int);
diff --git a/src/widgets/kernel/qopenglwidget.cpp b/src/widgets/kernel/qopenglwidget.cpp
deleted file mode 100644
index 9b4955320b..0000000000
--- a/src/widgets/kernel/qopenglwidget.cpp
+++ /dev/null
@@ -1,1471 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qopenglwidget.h"
-#include <QtGui/QOpenGLContext>
-#include <QtGui/QOpenGLFramebufferObject>
-#include <QtGui/QOffscreenSurface>
-#include <QtGui/QOpenGLFunctions>
-#include <QtGui/QWindow>
-#include <QtGui/QGuiApplication>
-#include <QtGui/QScreen>
-#include <QtGui/QOpenGLPaintDevice>
-#include <QtGui/qpa/qplatformwindow.h>
-#include <QtGui/qpa/qplatformintegration.h>
-#include <QtGui/private/qguiapplication_p.h>
-#include <QtGui/private/qopenglextensions_p.h>
-#include <QtGui/private/qfont_p.h>
-#include <QtGui/private/qopenglpaintdevice_p.h>
-#include <QtGui/private/qopenglcontext_p.h>
-#include <QtWidgets/private/qwidget_p.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QOpenGLWidget
- \inmodule QtWidgets
- \since 5.4
-
- \brief The QOpenGLWidget class is a widget for rendering OpenGL graphics.
-
- QOpenGLWidget provides functionality for displaying OpenGL graphics
- integrated into a Qt application. It is very simple to use: Make
- your class inherit from it and use the subclass like any other
- QWidget, except that you have the choice between using QPainter and
- standard OpenGL rendering commands.
-
- QOpenGLWidget provides three convenient virtual functions that you
- can reimplement in your subclass to perform the typical OpenGL
- tasks:
-
- \list
- \li paintGL() - Renders the OpenGL scene. Gets called whenever the widget
- needs to be updated.
- \li resizeGL() - Sets up the OpenGL viewport, projection, etc. Gets
- called whenever the widget has been resized (and also when it
- is shown for the first time because all newly created widgets get a
- resize event automatically).
- \li initializeGL() - Sets up the OpenGL resources and state. Gets called
- once before the first time resizeGL() or paintGL() is called.
- \endlist
-
- If you need to trigger a repaint from places other than paintGL() (a
- typical example is when using \l{QTimer}{timers} to animate scenes),
- you should call the widget's update() function to schedule an update.
-
- Your widget's OpenGL rendering context is made current when
- paintGL(), resizeGL(), or initializeGL() is called. If you need to
- call the standard OpenGL API functions from other places (e.g. in
- your widget's constructor or in your own paint functions), you
- must call makeCurrent() first.
-
- All rendering happens into an OpenGL framebuffer
- object. makeCurrent() ensure that it is bound in the context. Keep
- this in mind when creating and binding additional framebuffer
- objects in the rendering code in paintGL(). Never re-bind the
- framebuffer with ID 0. Instead, call defaultFramebufferObject() to
- get the ID that should be bound.
-
- QOpenGLWidget allows using different OpenGL versions and profiles
- when the platform supports it. Just set the requested format via
- setFormat(). Keep in mind however that having multiple QOpenGLWidget
- instances in the same window requires that they all use the same
- format, or at least formats that do not make the contexts
- non-sharable. To overcome this issue, prefer using
- QSurfaceFormat::setDefaultFormat() instead of setFormat().
-
- \note Calling QSurfaceFormat::setDefaultFormat() before constructing
- the QApplication instance is mandatory on some platforms (for example,
- \macos) when an OpenGL core profile context is requested. This is to
- ensure that resource sharing between contexts stays functional as all
- internal contexts are created using the correct version and profile.
-
- \section1 Painting Techniques
-
- As described above, subclass QOpenGLWidget to render pure 3D content in the
- following way:
-
- \list
-
- \li Reimplement the initializeGL() and resizeGL() functions to
- set up the OpenGL state and provide a perspective transformation.
-
- \li Reimplement paintGL() to paint the 3D scene, calling only
- OpenGL functions.
-
- \endlist
-
- It is also possible to draw 2D graphics onto a QOpenGLWidget subclass using QPainter:
-
- \list
-
- \li In paintGL(), instead of issuing OpenGL commands, construct a QPainter
- object for use on the widget.
-
- \li Draw primitives using QPainter's member functions.
-
- \li Direct OpenGL commands can still be issued. However, you must make sure
- these are enclosed by a call to the painter's beginNativePainting() and
- endNativePainting().
-
- \endlist
-
- When performing drawing using QPainter only, it is also possible to perform
- the painting like it is done for ordinary widgets: by reimplementing paintEvent().
-
- \list
-
- \li Reimplement the paintEvent() function.
-
- \li Construct a QPainter object targeting the widget. Either pass the widget to the
- constructor or the QPainter::begin() function.
-
- \li Draw primitives using QPainter's member functions.
-
- \li Painting finishes then the QPainter instance is destroyed. Alternatively,
- call QPainter::end() explicitly.
-
- \endlist
-
- \section1 OpenGL Function Calls, Headers and QOpenGLFunctions
-
- When making OpenGL function calls, it is strongly recommended to avoid calling
- the functions directly. Instead, prefer using QOpenGLFunctions (when making
- portable applications) or the versioned variants (for example,
- QOpenGLFunctions_3_2_Core and similar, when targeting modern, desktop-only
- OpenGL). This way the application will work correctly in all Qt build
- configurations, including the ones that perform dynamic OpenGL implementation
- loading which means applications are not directly linking to an GL
- implementation and thus direct function calls are not feasible.
-
- In paintGL() the current context is always accessible by caling
- QOpenGLContext::currentContext(). From this context an already initialized,
- ready-to-be-used QOpenGLFunctions instance is retrievable by calling
- QOpenGLContext::functions(). An alternative to prefixing every GL call is to
- inherit from QOpenGLFunctions and call
- QOpenGLFunctions::initializeOpenGLFunctions() in initializeGL().
-
- As for the OpenGL headers, note that in most cases there will be no need to
- directly include any headers like GL.h. The OpenGL-related Qt headers will
- include qopengl.h which will in turn include an appropriate header for the
- system. This might be an OpenGL ES 3.x or 2.0 header, the highest version that
- is available, or a system-provided gl.h. In addition, a copy of the extension
- headers (called glext.h on some systems) is provided as part of Qt both for
- OpenGL and OpenGL ES. These will get included automatically on platforms where
- feasible. This means that constants and function pointer typedefs from ARB,
- EXT, OES extensions are automatically available.
-
- \section1 Code Examples
-
- To get started, the simplest QOpenGLWidget subclass could like like the following:
-
- \snippet code/doc_gui_widgets_qopenglwidget.cpp 0
-
- Alternatively, the prefixing of each and every OpenGL call can be avoided by deriving
- from QOpenGLFunctions instead:
-
- \snippet code/doc_gui_widgets_qopenglwidget.cpp 1
-
- To get a context compatible with a given OpenGL version or profile, or to
- request depth and stencil buffers, call setFormat():
-
- \snippet code/doc_gui_widgets_qopenglwidget.cpp 2
-
- With OpenGL 3.0+ contexts, when portability is not important, the versioned
- QOpenGLFunctions variants give easy access to all the modern OpenGL functions
- available in a given version:
-
- \snippet code/doc_gui_widgets_qopenglwidget.cpp 3
-
- As described above, it is simpler and more robust to set the requested format
- globally so that it applies to all windows and contexts during the lifetime of
- the application. Below is an example of this:
-
- \snippet code/doc_gui_widgets_qopenglwidget.cpp 6
-
- \section1 Relation to QGLWidget
-
- The legacy QtOpenGL module (classes prefixed with QGL) provides a widget
- called QGLWidget. QOpenGLWidget is intended to be a modern replacement for
- it. Therefore, especially in new applications, the general recommendation is
- to use QOpenGLWidget.
-
- While the API is very similar, there is an important difference between the
- two: QOpenGLWidget always renders offscreen, using framebuffer
- objects. QGLWidget on the other hand uses a native window and surface. The
- latter causes issues when using it in complex user interfaces since, depending
- on the platform, such native child widgets may have various limitations,
- regarding stacking orders for example. QOpenGLWidget avoids this by not
- creating a separate native window.
-
- Due to being backed by a framebuffer object, the behavior of QOpenGLWidget is
- very similar to QOpenGLWindow with the update behavior set to \c
- PartialUpdateBlit or \c PartialUpdateBlend. This means that the contents are
- preserved between paintGL() calls so that incremental rendering is
- possible. With QGLWidget (and naturally QOpenGLWindow with the default update
- behavior) this is usually not the case because swapping the buffers leaves the
- back buffer with undefined contents.
-
- \note Most applications do not need incremental rendering because they will
- render everything in the view on every paint call. In this case it is
- important to call glClear() as early as possible in paintGL(). This helps
- mobile GPUs that use a tile-based architecture to recognize that the tile
- buffer does not need to be reloaded with the framebuffer's previous
- contents. Omitting the clear call can lead to significant performance drops on
- such systems.
-
- \note Avoid calling winId() on a QOpenGLWidget. This function triggers the creation of
- a native window, resulting in reduced performance and possibly rendering glitches.
-
- \section1 Differences to QGLWidget
-
- Besides the main conceptual difference of being backed by a framebuffer object, there
- are a number of smaller, internal differences between QOpenGLWidget and the older
- QGLWidget:
-
- \list
-
- \li OpenGL state when invoking paintGL(). QOpenGLWidget sets up the viewport via
- glViewport(). It does not perform any clearing.
-
- \li Clearing when starting to paint via QPainter. Unlike regular widgets, QGLWidget
- defaulted to a value of \c true for
- \l{QWidget::autoFillBackground()}{autoFillBackground}. It then performed clearing to the
- palette's background color every time QPainter::begin() was used. QOpenGLWidget does not
- follow this: \l{QWidget::autoFillBackground()}{autoFillBackground} defaults to false,
- like for any other widget. The only exception is when being used as a viewport for other
- widgets like QGraphicsView. In such a case autoFillBackground will be automatically set
- to true to ensure compatibility with QGLWidget-based viewports.
-
- \endlist
-
- \section1 Multisampling
-
- To enable multisampling, set the number of requested samples on the
- QSurfaceFormat that is passed to setFormat(). On systems that do not support
- it the request may get ignored.
-
- Multisampling support requires support for multisampled renderbuffers and
- framebuffer blits. On OpenGL ES 2.0 implementations it is likely that these
- will not be present. This means that multisampling will not be available. With
- modern OpenGL versions and OpenGL ES 3.0 and up this is usually not a problem
- anymore.
-
- \section1 Threading
-
- Performing offscreen rendering on worker threads, for example to generate
- textures that are then used in the GUI/main thread in paintGL(), are supported
- by exposing the widget's QOpenGLContext so that additional contexts sharing
- with it can be created on each thread.
-
- Drawing directly to the QOpenGLWidget's framebuffer outside the GUI/main
- thread is possible by reimplementing paintEvent() to do nothing. The context's
- thread affinity has to be changed via QObject::moveToThread(). After that,
- makeCurrent() and doneCurrent() are usable on the worker thread. Be careful to
- move the context back to the GUI/main thread afterwards.
-
- Unlike QGLWidget, triggering a buffer swap just for the QOpenGLWidget is not
- possible since there is no real, onscreen native surface for it. Instead, it
- is up to the widget stack to manage composition and buffer swaps on the gui
- thread. When a thread is done updating the framebuffer, call update() \b{on
- the GUI/main thread} to schedule composition.
-
- Extra care has to be taken to avoid using the framebuffer when the GUI/main
- thread is performing compositing. The signals aboutToCompose() and
- frameSwapped() will be emitted when the composition is starting and
- ending. They are emitted on the GUI/main thread. This means that by using a
- direct connection aboutToCompose() can block the GUI/main thread until the
- worker thread has finished its rendering. After that, the worker thread must
- perform no further rendering until the frameSwapped() signal is emitted. If
- this is not acceptable, the worker thread has to implement a double buffering
- mechanism. This involves drawing using an alternative render target, that is
- fully controlled by the thread, e.g. an additional framebuffer object, and
- blitting to the QOpenGLWidget's framebuffer at a suitable time.
-
- \section1 Context Sharing
-
- When multiple QOpenGLWidgets are added as children to the same top-level
- widget, their contexts will share with each other. This does not apply for
- QOpenGLWidget instances that belong to different windows.
-
- This means that all QOpenGLWidgets in the same window can access each other's
- sharable resources, like textures, and there is no need for an extra "global
- share" context, as was the case with QGLWidget.
-
- To set up sharing between QOpenGLWidget instances belonging to different
- windows, set the Qt::AA_ShareOpenGLContexts application attribute before
- instantiating QApplication. This will trigger sharing between all
- QOpenGLWidget instances without any further steps.
-
- Creating extra QOpenGLContext instances that share resources like textures
- with the QOpenGLWidget's context is also possible. Simply pass the pointer
- returned from context() to QOpenGLContext::setShareContext() before calling
- QOpenGLContext::create(). The resulting context can also be used on a
- different thread, allowing threaded generation of textures and asynchronous
- texture uploads.
-
- Note that QOpenGLWidget expects a standard conformant implementation of
- resource sharing when it comes to the underlying graphics drivers. For
- example, some drivers, in particular for mobile and embedded hardware, have
- issues with setting up sharing between an existing context and others that are
- created later. Some other drivers may behave in unexpected ways when trying to
- utilize shared resources between different threads.
-
- \section1 Resource Initialization and Cleanup
-
- The QOpenGLWidget's associated OpenGL context is guaranteed to be current
- whenever initializeGL() and paintGL() are invoked. Do not attempt to create
- OpenGL resources before initializeGL() is called. For example, attempting to
- compile shaders, initialize vertex buffer objects or upload texture data will
- fail when done in a subclass's constructor. These operations must be deferred
- to initializeGL(). Some of Qt's OpenGL helper classes, like QOpenGLBuffer or
- QOpenGLVertexArrayObject, have a matching deferred behavior: they can be
- instantiated without a context, but all initialization is deferred until a
- create(), or similar, call. This means that they can be used as normal
- (non-pointer) member variables in a QOpenGLWidget subclass, but the create()
- or similar function can only be called from initializeGL(). Be aware however
- that not all classes are designed like this. When in doubt, make the member
- variable a pointer and create and destroy the instance dynamically in
- initializeGL() and the destructor, respectively.
-
- Releasing the resources also needs the context to be current. Therefore
- destructors that perform such cleanup are expected to call makeCurrent()
- before moving on to destroy any OpenGL resources or wrappers. Avoid deferred
- deletion via \l{QObject::deleteLater()}{deleteLater()} or the parenting
- mechanism of QObject. There is no guarantee the correct context will be
- current at the time the instance in question is really destroyed.
-
- A typical subclass will therefore often look like the following when it comes
- to resource initialization and destruction:
-
- \snippet code/doc_gui_widgets_qopenglwidget.cpp 4
-
- This is naturally not the only possible solution. One alternative is to use
- the \l{QOpenGLContext::aboutToBeDestroyed()}{aboutToBeDestroyed()} signal of
- QOpenGLContext. By connecting a slot, using direct connection, to this signal,
- it is possible to perform cleanup whenever the underlying native context
- handle, or the entire QOpenGLContext instance, is going to be released. The
- following snippet is in principle equivalent to the previous one:
-
- \snippet code/doc_gui_widgets_qopenglwidget.cpp 5
-
- \note For widgets that change their associated top-level window multiple times
- during their lifetime, a combined approach is essential. Whenever the widget
- or a parent of it gets reparented so that the top-level window becomes
- different, the widget's associated context is destroyed and a new one is
- created. This is then followed by a call to initializeGL() where all OpenGL
- resources must get reinitialized. Due to this the only option to perform
- proper cleanup is to connect to the context's aboutToBeDestroyed()
- signal. Note that the context in question may not be the current one when the
- signal gets emitted. Therefore it is good practice to call makeCurrent() in
- the connected slot. Additionally, the same cleanup steps must be performed
- from the derived class' destructor, since the slot connected to the signal
- will not get invoked when the widget is being destroyed.
-
- \note When Qt::AA_ShareOpenGLContexts is set, the widget's context never
- changes, not even when reparenting because the widget's associated texture is
- guaranteed to be accessible also from the new top-level's context.
-
- Proper cleanup is especially important due to context sharing. Even though
- each QOpenGLWidget's associated context is destroyed together with the
- QOpenGLWidget, the sharable resources in that context, like textures, will
- stay valid until the top-level window, in which the QOpenGLWidget lived, is
- destroyed. Additionally, settings like Qt::AA_ShareOpenGLContexts and some Qt
- modules may trigger an even wider scope for sharing contexts, potentially
- leading to keeping the resources in question alive for the entire lifetime of
- the application. Therefore the safest and most robust is always to perform
- explicit cleanup for all resources and resource wrappers used in the
- QOpenGLWidget.
-
- \section1 Limitations
-
- Putting other widgets underneath and making the QOpenGLWidget transparent will
- not lead to the expected results: The widgets underneath will not be
- visible. This is because in practice the QOpenGLWidget is drawn before all
- other regular, non-OpenGL widgets, and so see-through type of solutions are
- not feasible. Other type of layouts, like having widgets on top of the
- QOpenGLWidget, will function as expected.
-
- When absolutely necessary, this limitation can be overcome by setting the
- Qt::WA_AlwaysStackOnTop attribute on the QOpenGLWidget. Be aware however that
- this breaks stacking order, for example it will not be possible to have other
- widgets on top of the QOpenGLWidget, so it should only be used in situations
- where a semi-transparent QOpenGLWidget with other widgets visible underneath
- is required.
-
- Note that this does not apply when there are no other widgets underneath and
- the intention is to have a semi-transparent window. In that case the
- traditional approach of setting Qt::WA_TranslucentBackground
- on the top-level window is sufficient. Note that if the transparent areas are
- only desired in the QOpenGLWidget, then Qt::WA_NoSystemBackground will need
- to be turned back to \c false after enabling Qt::WA_TranslucentBackground.
- Additionally, requesting an alpha channel for the QOpenGLWidget's context via
- setFormat() may be necessary too, depending on the system.
-
- QOpenGLWidget supports multiple update behaviors, just like QOpenGLWindow. In
- preserved mode the rendered content from the previous paintGL() call is
- available in the next one, allowing incremental rendering. In non-preserved
- mode the content is lost and paintGL() implementations are expected to redraw
- everything in the view.
-
- Before Qt 5.5 the default behavior of QOpenGLWidget was to preserve the
- rendered contents between paintGL() calls. Since Qt 5.5 the default behavior
- is non-preserved because this provides better performance and the majority of
- applications have no need for the previous content. This also resembles the
- semantics of an OpenGL-based QWindow and matches the default behavior of
- QOpenGLWindow in that the color and ancillary buffers are invalidated for
- each frame. To restore the preserved behavior, call setUpdateBehavior() with
- \c PartialUpdate.
-
- \section1 Alternatives
-
- Adding a QOpenGLWidget into a window turns on OpenGL-based
- compositing for the entire window. In some special cases this may
- not be ideal, and the old QGLWidget-style behavior with a separate,
- native child window is desired. Desktop applications that understand
- the limitations of this approach (for example when it comes to
- overlaps, transparency, scroll views and MDI areas), can use
- QOpenGLWindow with QWidget::createWindowContainer(). This is a
- modern alternative to QGLWidget and is faster than QOpenGLWidget due
- to the lack of the additional composition step. It is strongly
- recommended to limit the usage of this approach to cases where there
- is no other choice. Note that this option is not suitable for most
- embedded and mobile platforms, and it is known to have issues on
- certain desktop platforms (e.g. \macos) too. The stable,
- cross-platform solution is always QOpenGLWidget.
-
- \e{OpenGL is a trademark of Silicon Graphics, Inc. in the United States and other
- countries.}
-
- \sa QOpenGLFunctions, QOpenGLWindow, Qt::AA_ShareOpenGLContexts, UpdateBehavior
-*/
-
-/*!
- \fn void QOpenGLWidget::aboutToCompose()
-
- This signal is emitted when the widget's top-level window is about to begin
- composing the textures of its QOpenGLWidget children and the other widgets.
-*/
-
-/*!
- \fn void QOpenGLWidget::frameSwapped()
-
- This signal is emitted after the widget's top-level window has finished
- composition and returned from its potentially blocking
- QOpenGLContext::swapBuffers() call.
-*/
-
-/*!
- \fn void QOpenGLWidget::aboutToResize()
-
- This signal is emitted when the widget's size is changed and therefore the
- framebuffer object is going to be recreated.
-*/
-
-/*!
- \fn void QOpenGLWidget::resized()
-
- This signal is emitted right after the framebuffer object has been recreated
- due to resizing the widget.
-*/
-
-/*!
- \enum QOpenGLWidget::UpdateBehavior
- \since 5.5
-
- This enum describes the update semantics of QOpenGLWidget.
-
- \value NoPartialUpdate QOpenGLWidget will discard the
- contents of the color buffer and the ancillary buffers after the
- QOpenGLWidget is rendered to screen. This is the same behavior that can be
- expected by calling QOpenGLContext::swapBuffers with a default opengl
- enabled QWindow as the argument. NoPartialUpdate can have some performance
- benefits on certain hardware architectures common in the mobile and
- embedded space when a framebuffer object is used as the rendering target.
- The framebuffer object is invalidated between frames with
- glDiscardFramebufferEXT if supported or a glClear. Please see the
- documentation of EXT_discard_framebuffer for more information:
- https://www.khronos.org/registry/gles/extensions/EXT/EXT_discard_framebuffer.txt
-
- \value PartialUpdate The framebuffer objects color buffer and ancillary
- buffers are not invalidated between frames.
-
- \sa updateBehavior(), setUpdateBehavior()
-*/
-
-class QOpenGLWidgetPaintDevicePrivate : public QOpenGLPaintDevicePrivate
-{
-public:
- QOpenGLWidgetPaintDevicePrivate(QOpenGLWidget *widget)
- : QOpenGLPaintDevicePrivate(QSize()),
- w(widget) { }
-
- void beginPaint() override;
- void endPaint() override;
-
- QOpenGLWidget *w;
-};
-
-class QOpenGLWidgetPaintDevice : public QOpenGLPaintDevice
-{
-public:
- QOpenGLWidgetPaintDevice(QOpenGLWidget *widget)
- : QOpenGLPaintDevice(*new QOpenGLWidgetPaintDevicePrivate(widget)) { }
- void ensureActiveTarget() override;
-};
-
-class QOpenGLWidgetPrivate : public QWidgetPrivate
-{
- Q_DECLARE_PUBLIC(QOpenGLWidget)
-public:
- QOpenGLWidgetPrivate()
- : context(nullptr),
- fbo(nullptr),
- resolvedFbo(nullptr),
- surface(nullptr),
- initialized(false),
- fakeHidden(false),
- inBackingStorePaint(false),
- hasBeenComposed(false),
- flushPending(false),
- paintDevice(nullptr),
- updateBehavior(QOpenGLWidget::NoPartialUpdate),
- requestedSamples(0),
- inPaintGL(false),
- textureFormat(0)
- {
- requestedFormat = QSurfaceFormat::defaultFormat();
- }
-
- void reset();
- void recreateFbo();
-
- GLuint textureId() const override;
- QPlatformTextureList::Flags textureListFlags() override;
-
- void initialize();
- void invokeUserPaint();
- void render();
-
- void invalidateFbo();
-
- QImage grabFramebuffer() override;
- void beginBackingStorePainting() override { inBackingStorePaint = true; }
- void endBackingStorePainting() override { inBackingStorePaint = false; }
- void beginCompose() override;
- void endCompose() override;
- void initializeViewportFramebuffer() override;
- void resizeViewportFramebuffer() override;
- void resolveSamples() override;
-
- QOpenGLContext *context;
- QOpenGLFramebufferObject *fbo;
- QOpenGLFramebufferObject *resolvedFbo;
- QOffscreenSurface *surface;
- bool initialized;
- bool fakeHidden;
- bool inBackingStorePaint;
- bool hasBeenComposed;
- bool flushPending;
- QOpenGLPaintDevice *paintDevice;
- QSurfaceFormat requestedFormat;
- QOpenGLWidget::UpdateBehavior updateBehavior;
- int requestedSamples;
- bool inPaintGL;
- GLenum textureFormat;
-};
-
-void QOpenGLWidgetPaintDevicePrivate::beginPaint()
-{
- // NB! autoFillBackground is and must be false by default. Otherwise we would clear on
- // every QPainter begin() which is not desirable. This is only for legacy use cases,
- // like using QOpenGLWidget as the viewport of a graphics view, that expect clearing
- // with the palette's background color.
- if (w->autoFillBackground()) {
- QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
- if (w->format().hasAlpha()) {
- f->glClearColor(0, 0, 0, 0);
- } else {
- QColor c = w->palette().brush(w->backgroundRole()).color();
- float alpha = c.alphaF();
- f->glClearColor(c.redF() * alpha, c.greenF() * alpha, c.blueF() * alpha, alpha);
- }
- f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- }
-}
-
-void QOpenGLWidgetPaintDevicePrivate::endPaint()
-{
- QOpenGLWidgetPrivate *wd = static_cast<QOpenGLWidgetPrivate *>(QWidgetPrivate::get(w));
- if (!wd->initialized)
- return;
-
- if (!wd->inPaintGL)
- QOpenGLContextPrivate::get(wd->context)->defaultFboRedirect = 0;
-}
-
-void QOpenGLWidgetPaintDevice::ensureActiveTarget()
-{
- QOpenGLWidgetPaintDevicePrivate *d = static_cast<QOpenGLWidgetPaintDevicePrivate *>(d_ptr.data());
- QOpenGLWidgetPrivate *wd = static_cast<QOpenGLWidgetPrivate *>(QWidgetPrivate::get(d->w));
- if (!wd->initialized)
- return;
-
- if (QOpenGLContext::currentContext() != wd->context)
- d->w->makeCurrent();
- else
- wd->fbo->bind();
-
- if (!wd->inPaintGL)
- QOpenGLContextPrivate::get(wd->context)->defaultFboRedirect = wd->fbo->handle();
-
- // When used as a viewport, drawing is done via opening a QPainter on the widget
- // without going through paintEvent(). We will have to make sure a glFlush() is done
- // before the texture is accessed also in this case.
- wd->flushPending = true;
-}
-
-GLuint QOpenGLWidgetPrivate::textureId() const
-{
- return resolvedFbo ? resolvedFbo->texture() : (fbo ? fbo->texture() : 0);
-}
-
-#ifndef GL_SRGB
-#define GL_SRGB 0x8C40
-#endif
-#ifndef GL_SRGB8
-#define GL_SRGB8 0x8C41
-#endif
-#ifndef GL_SRGB_ALPHA
-#define GL_SRGB_ALPHA 0x8C42
-#endif
-#ifndef GL_SRGB8_ALPHA8
-#define GL_SRGB8_ALPHA8 0x8C43
-#endif
-
-QPlatformTextureList::Flags QOpenGLWidgetPrivate::textureListFlags()
-{
- QPlatformTextureList::Flags flags = QWidgetPrivate::textureListFlags();
- switch (textureFormat) {
- case GL_SRGB:
- case GL_SRGB8:
- case GL_SRGB_ALPHA:
- case GL_SRGB8_ALPHA8:
- flags |= QPlatformTextureList::TextureIsSrgb;
- break;
- default:
- break;
- }
- return flags;
-}
-
-void QOpenGLWidgetPrivate::reset()
-{
- Q_Q(QOpenGLWidget);
-
- // Destroy the OpenGL resources first. These need the context to be current.
- if (initialized)
- q->makeCurrent();
-
- delete paintDevice;
- paintDevice = nullptr;
- delete fbo;
- fbo = nullptr;
- delete resolvedFbo;
- resolvedFbo = nullptr;
-
- if (initialized)
- q->doneCurrent();
-
- // Delete the context first, then the surface. Slots connected to
- // the context's aboutToBeDestroyed() may still call makeCurrent()
- // to perform some cleanup.
- delete context;
- context = nullptr;
- delete surface;
- surface = nullptr;
- initialized = fakeHidden = inBackingStorePaint = false;
-}
-
-void QOpenGLWidgetPrivate::recreateFbo()
-{
- Q_Q(QOpenGLWidget);
-
- emit q->aboutToResize();
-
- context->makeCurrent(surface);
-
- delete fbo;
- fbo = nullptr;
- delete resolvedFbo;
- resolvedFbo = nullptr;
-
- int samples = requestedSamples;
- QOpenGLExtensions *extfuncs = static_cast<QOpenGLExtensions *>(context->functions());
- if (!extfuncs->hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample))
- samples = 0;
-
- QOpenGLFramebufferObjectFormat format;
- format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
- format.setSamples(samples);
- if (textureFormat)
- format.setInternalTextureFormat(textureFormat);
-
- const QSize deviceSize = q->size() * q->devicePixelRatioF();
- fbo = new QOpenGLFramebufferObject(deviceSize, format);
- if (samples > 0)
- resolvedFbo = new QOpenGLFramebufferObject(deviceSize);
-
- textureFormat = fbo->format().internalTextureFormat();
-
- fbo->bind();
- context->functions()->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- flushPending = true; // Make sure the FBO is initialized before use
-
- paintDevice->setSize(deviceSize);
- paintDevice->setDevicePixelRatio(q->devicePixelRatioF());
-
- emit q->resized();
-}
-
-void QOpenGLWidgetPrivate::beginCompose()
-{
- Q_Q(QOpenGLWidget);
- if (flushPending) {
- flushPending = false;
- q->makeCurrent();
- static_cast<QOpenGLExtensions *>(context->functions())->flushShared();
- }
- hasBeenComposed = true;
- emit q->aboutToCompose();
-}
-
-void QOpenGLWidgetPrivate::endCompose()
-{
- Q_Q(QOpenGLWidget);
- emit q->frameSwapped();
-}
-
-void QOpenGLWidgetPrivate::initialize()
-{
- Q_Q(QOpenGLWidget);
- if (initialized)
- return;
-
- // If no global shared context get our toplevel's context with which we
- // will share in order to make the texture usable by the underlying window's backingstore.
- QWidget *tlw = q->window();
- QOpenGLContext *shareContext = qt_gl_global_share_context();
- if (!shareContext)
- shareContext = get(tlw)->shareContext();
- // If shareContext is null, showing content on-screen will not work.
- // However, offscreen rendering and grabFramebuffer() will stay fully functional.
-
- // Do not include the sample count. Requesting a multisampled context is not necessary
- // since we render into an FBO, never to an actual surface. What's more, attempting to
- // create a pbuffer with a multisampled config crashes certain implementations. Just
- // avoid the entire hassle, the result is the same.
- requestedSamples = requestedFormat.samples();
- requestedFormat.setSamples(0);
-
- QScopedPointer<QOpenGLContext> ctx(new QOpenGLContext);
- ctx->setFormat(requestedFormat);
- if (shareContext) {
- ctx->setShareContext(shareContext);
- ctx->setScreen(shareContext->screen());
- }
- if (Q_UNLIKELY(!ctx->create())) {
- qWarning("QOpenGLWidget: Failed to create context");
- return;
- }
-
- // Propagate settings that make sense only for the tlw. Note that this only
- // makes sense for properties that get picked up even after the native
- // window is created.
- if (tlw->windowHandle()) {
- QSurfaceFormat tlwFormat = tlw->windowHandle()->format();
- if (requestedFormat.swapInterval() != tlwFormat.swapInterval()) {
- // Most platforms will pick up the changed swap interval on the next
- // makeCurrent or swapBuffers.
- tlwFormat.setSwapInterval(requestedFormat.swapInterval());
- tlw->windowHandle()->setFormat(tlwFormat);
- }
- if (requestedFormat.swapBehavior() != tlwFormat.swapBehavior()) {
- tlwFormat.setSwapBehavior(requestedFormat.swapBehavior());
- tlw->windowHandle()->setFormat(tlwFormat);
- }
- }
-
- // The top-level window's surface is not good enough since it causes way too
- // much trouble with regards to the QSurfaceFormat for example. So just like
- // in QQuickWidget, use a dedicated QOffscreenSurface.
- surface = new QOffscreenSurface;
- surface->setFormat(ctx->format());
- surface->setScreen(ctx->screen());
- surface->create();
-
- if (Q_UNLIKELY(!ctx->makeCurrent(surface))) {
- qWarning("QOpenGLWidget: Failed to make context current");
- return;
- }
-
- paintDevice = new QOpenGLWidgetPaintDevice(q);
- paintDevice->setSize(q->size() * q->devicePixelRatioF());
- paintDevice->setDevicePixelRatio(q->devicePixelRatioF());
-
- context = ctx.take();
- initialized = true;
-
- q->initializeGL();
-}
-
-void QOpenGLWidgetPrivate::resolveSamples()
-{
- Q_Q(QOpenGLWidget);
- if (resolvedFbo) {
- q->makeCurrent();
- QRect rect(QPoint(0, 0), fbo->size());
- QOpenGLFramebufferObject::blitFramebuffer(resolvedFbo, rect, fbo, rect);
- flushPending = true;
- }
-}
-
-void QOpenGLWidgetPrivate::invokeUserPaint()
-{
- Q_Q(QOpenGLWidget);
-
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- Q_ASSERT(ctx && fbo);
-
- QOpenGLFunctions *f = ctx->functions();
- QOpenGLContextPrivate::get(ctx)->defaultFboRedirect = fbo->handle();
-
- f->glViewport(0, 0, q->width() * q->devicePixelRatioF(), q->height() * q->devicePixelRatioF());
- inPaintGL = true;
- q->paintGL();
- inPaintGL = false;
- flushPending = true;
-
- QOpenGLContextPrivate::get(ctx)->defaultFboRedirect = 0;
-}
-
-void QOpenGLWidgetPrivate::render()
-{
- Q_Q(QOpenGLWidget);
-
- if (fakeHidden || !initialized)
- return;
-
- q->makeCurrent();
-
- if (updateBehavior == QOpenGLWidget::NoPartialUpdate && hasBeenComposed) {
- invalidateFbo();
- hasBeenComposed = false;
- }
-
- invokeUserPaint();
-}
-
-void QOpenGLWidgetPrivate::invalidateFbo()
-{
- QOpenGLExtensions *f = static_cast<QOpenGLExtensions *>(QOpenGLContext::currentContext()->functions());
- if (f->hasOpenGLExtension(QOpenGLExtensions::DiscardFramebuffer)) {
- const int gl_color_attachment0 = 0x8CE0; // GL_COLOR_ATTACHMENT0
- const int gl_depth_attachment = 0x8D00; // GL_DEPTH_ATTACHMENT
- const int gl_stencil_attachment = 0x8D20; // GL_STENCIL_ATTACHMENT
-#ifdef Q_OS_WASM
- // webgl does not allow separate depth and stencil attachments
- // QTBUG-69913
- const int gl_depth_stencil_attachment = 0x821A; // GL_DEPTH_STENCIL_ATTACHMENT
-
- const GLenum attachments[] = {
- gl_color_attachment0, gl_depth_attachment, gl_stencil_attachment, gl_depth_stencil_attachment
- };
-#else
- const GLenum attachments[] = {
- gl_color_attachment0, gl_depth_attachment, gl_stencil_attachment
- };
-#endif
- f->glDiscardFramebufferEXT(GL_FRAMEBUFFER, sizeof attachments / sizeof *attachments, attachments);
- } else {
- f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- }
-}
-
-extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha);
-
-QImage QOpenGLWidgetPrivate::grabFramebuffer()
-{
- Q_Q(QOpenGLWidget);
-
- initialize();
- if (!initialized)
- return QImage();
-
- if (!fbo) // could be completely offscreen, without ever getting a resize event
- recreateFbo();
-
- if (!inPaintGL)
- render();
-
- if (resolvedFbo) {
- resolveSamples();
- resolvedFbo->bind();
- } else {
- q->makeCurrent();
- }
-
- const bool hasAlpha = q->format().hasAlpha();
- QImage res = qt_gl_read_framebuffer(q->size() * q->devicePixelRatioF(), hasAlpha, hasAlpha);
- res.setDevicePixelRatio(q->devicePixelRatioF());
-
- // While we give no guarantees of what is going to be left bound, prefer the
- // multisample fbo instead of the resolved one. Clients may continue to
- // render straight after calling this function.
- if (resolvedFbo)
- q->makeCurrent();
-
- return res;
-}
-
-void QOpenGLWidgetPrivate::initializeViewportFramebuffer()
-{
- Q_Q(QOpenGLWidget);
- // Legacy behavior for compatibility with QGLWidget when used as a graphics view
- // viewport: enable clearing on each painter begin.
- q->setAutoFillBackground(true);
-}
-
-void QOpenGLWidgetPrivate::resizeViewportFramebuffer()
-{
- Q_Q(QOpenGLWidget);
- if (!initialized)
- return;
-
- if (!fbo || q->size() * q->devicePixelRatioF() != fbo->size()) {
- recreateFbo();
- q->update();
- }
-}
-
-/*!
- Constructs a widget which is a child of \a parent, with widget flags set to \a f.
- */
-QOpenGLWidget::QOpenGLWidget(QWidget *parent, Qt::WindowFlags f)
- : QWidget(*(new QOpenGLWidgetPrivate), parent, f)
-{
- Q_D(QOpenGLWidget);
- if (Q_UNLIKELY(!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::RasterGLSurface)))
- qWarning("QOpenGLWidget is not supported on this platform.");
- else
- d->setRenderToTexture();
-}
-
-/*!
- Destroys the QOpenGLWidget instance, freeing its resources.
-
- The QOpenGLWidget's context is made current in the destructor, allowing for
- safe destruction of any child object that may need to release OpenGL
- resources belonging to the context provided by this widget.
-
- \warning if you have objects wrapping OpenGL resources (such as
- QOpenGLBuffer, QOpenGLShaderProgram, etc.) as members of a OpenGLWidget
- subclass, you may need to add a call to makeCurrent() in that subclass'
- destructor as well. Due to the rules of C++ object destruction, those objects
- will be destroyed \e{before} calling this function (but after that the
- destructor of the subclass has run), therefore making the OpenGL context
- current in this function happens too late for their safe disposal.
-
- \sa makeCurrent
-*/
-QOpenGLWidget::~QOpenGLWidget()
-{
- Q_D(QOpenGLWidget);
- d->reset();
-}
-
-/*!
- Sets this widget's update behavior to \a updateBehavior.
- \since 5.5
-*/
-void QOpenGLWidget::setUpdateBehavior(UpdateBehavior updateBehavior)
-{
- Q_D(QOpenGLWidget);
- d->updateBehavior = updateBehavior;
-}
-
-/*!
- \return the update behavior of the widget.
- \since 5.5
-*/
-QOpenGLWidget::UpdateBehavior QOpenGLWidget::updateBehavior() const
-{
- Q_D(const QOpenGLWidget);
- return d->updateBehavior;
-}
-
-/*!
- Sets the requested surface \a format.
-
- When the format is not explicitly set via this function, the format returned by
- QSurfaceFormat::defaultFormat() will be used. This means that when having multiple
- OpenGL widgets, individual calls to this function can be replaced by one single call to
- QSurfaceFormat::setDefaultFormat() before creating the first widget.
-
- \note Requesting an alpha buffer via this function will not lead to the
- desired results when the intention is to make other widgets beneath visible.
- Instead, use Qt::WA_AlwaysStackOnTop to enable semi-transparent QOpenGLWidget
- instances with other widgets visible underneath. Keep in mind however that
- this breaks the stacking order, so it will no longer be possible to have
- other widgets on top of the QOpenGLWidget.
-
- \sa format(), Qt::WA_AlwaysStackOnTop, QSurfaceFormat::setDefaultFormat()
- */
-void QOpenGLWidget::setFormat(const QSurfaceFormat &format)
-{
- Q_D(QOpenGLWidget);
- if (Q_UNLIKELY(d->initialized)) {
- qWarning("QOpenGLWidget: Already initialized, setting the format has no effect");
- return;
- }
-
- d->requestedFormat = format;
-}
-
-/*!
- Returns the context and surface format used by this widget and its toplevel
- window.
-
- After the widget and its toplevel have both been created, resized and shown,
- this function will return the actual format of the context. This may differ
- from the requested format if the request could not be fulfilled by the
- platform. It is also possible to get larger color buffer sizes than
- requested.
-
- When the widget's window and the related OpenGL resources are not yet
- initialized, the return value is the format that has been set via
- setFormat().
-
- \sa setFormat(), context()
- */
-QSurfaceFormat QOpenGLWidget::format() const
-{
- Q_D(const QOpenGLWidget);
- return d->initialized ? d->context->format() : d->requestedFormat;
-}
-
-/*!
- Sets a custom internal texture format of \a texFormat.
-
- When working with sRGB framebuffers, it will be necessary to specify a
- format like \c{GL_SRGB8_ALPHA8}. This can be achieved by calling this
- function.
-
- \note This function has no effect if called after the widget has already
- been shown and thus it performed initialization.
-
- \note This function will typically have to be used in combination with a
- QSurfaceFormat::setDefaultFormat() call that sets the color space to
- QSurfaceFormat::sRGBColorSpace.
-
- \since 5.10
- */
-void QOpenGLWidget::setTextureFormat(GLenum texFormat)
-{
- Q_D(QOpenGLWidget);
- if (Q_UNLIKELY(d->initialized)) {
- qWarning("QOpenGLWidget: Already initialized, setting the internal texture format has no effect");
- return;
- }
-
- d->textureFormat = texFormat;
-}
-
-/*!
- \return the active internal texture format if the widget has already
- initialized, the requested format if one was set but the widget has not yet
- been made visible, or \nullptr if setTextureFormat() was not called and the
- widget has not yet been made visible.
-
- \since 5.10
- */
-GLenum QOpenGLWidget::textureFormat() const
-{
- Q_D(const QOpenGLWidget);
- return d->textureFormat;
-}
-
-/*!
- \return \e true if the widget and OpenGL resources, like the context, have
- been successfully initialized. Note that the return value is always false
- until the widget is shown.
-*/
-bool QOpenGLWidget::isValid() const
-{
- Q_D(const QOpenGLWidget);
- return d->initialized && d->context->isValid();
-}
-
-/*!
- Prepares for rendering OpenGL content for this widget by making the
- corresponding context current and binding the framebuffer object in that
- context.
-
- It is not necessary to call this function in most cases, because it
- is called automatically before invoking paintGL().
-
- \sa context(), paintGL(), doneCurrent()
- */
-void QOpenGLWidget::makeCurrent()
-{
- Q_D(QOpenGLWidget);
- if (!d->initialized)
- return;
-
- d->context->makeCurrent(d->surface);
-
- if (d->fbo) // there may not be one if we are in reset()
- d->fbo->bind();
-}
-
-/*!
- Releases the context.
-
- It is not necessary to call this function in most cases, since the
- widget will make sure the context is bound and released properly
- when invoking paintGL().
- */
-void QOpenGLWidget::doneCurrent()
-{
- Q_D(QOpenGLWidget);
- if (!d->initialized)
- return;
-
- d->context->doneCurrent();
-}
-
-/*!
- \return The QOpenGLContext used by this widget or \c 0 if not yet initialized.
-
- \note The context and the framebuffer object used by the widget changes when
- reparenting the widget via setParent().
-
- \sa QOpenGLContext::setShareContext(), defaultFramebufferObject()
- */
-QOpenGLContext *QOpenGLWidget::context() const
-{
- Q_D(const QOpenGLWidget);
- return d->context;
-}
-
-/*!
- \return The framebuffer object handle or \c 0 if not yet initialized.
-
- \note The framebuffer object belongs to the context returned by context()
- and may not be accessible from other contexts.
-
- \note The context and the framebuffer object used by the widget changes when
- reparenting the widget via setParent(). In addition, the framebuffer object
- changes on each resize.
-
- \sa context()
- */
-GLuint QOpenGLWidget::defaultFramebufferObject() const
-{
- Q_D(const QOpenGLWidget);
- return d->fbo ? d->fbo->handle() : 0;
-}
-
-/*!
- This virtual function is called once before the first call to
- paintGL() or resizeGL(). Reimplement it in a subclass.
-
- This function should set up any required OpenGL resources and state.
-
- There is no need to call makeCurrent() because this has already been
- done when this function is called. Note however that the framebuffer
- is not yet available at this stage, so avoid issuing draw calls from
- here. Defer such calls to paintGL() instead.
-
- \sa paintGL(), resizeGL()
-*/
-void QOpenGLWidget::initializeGL()
-{
-}
-
-/*!
- This virtual function is called whenever the widget has been
- resized. Reimplement it in a subclass. The new size is passed in
- \a w and \a h.
-
- There is no need to call makeCurrent() because this has already been
- done when this function is called. Additionally, the framebuffer is
- also bound.
-
- \sa initializeGL(), paintGL()
-*/
-void QOpenGLWidget::resizeGL(int w, int h)
-{
- Q_UNUSED(w);
- Q_UNUSED(h);
-}
-
-/*!
- This virtual function is called whenever the widget needs to be
- painted. Reimplement it in a subclass.
-
- There is no need to call makeCurrent() because this has already
- been done when this function is called.
-
- Before invoking this function, the context and the framebuffer are
- bound, and the viewport is set up by a call to glViewport(). No
- other state is set and no clearing or drawing is performed by the
- framework.
-
- \sa initializeGL(), resizeGL()
-*/
-void QOpenGLWidget::paintGL()
-{
-}
-
-/*!
- Handles resize events that are passed in the \a e event parameter.
- Calls the virtual function resizeGL().
-
- \note Avoid overriding this function in derived classes. If that is not
- feasible, make sure that QOpenGLWidget's implementation is invoked
- too. Otherwise the underlying framebuffer object and related resources will
- not get resized properly and will lead to incorrect rendering.
-*/
-void QOpenGLWidget::resizeEvent(QResizeEvent *e)
-{
- Q_D(QOpenGLWidget);
-
- if (e->size().isEmpty()) {
- d->fakeHidden = true;
- return;
- }
- d->fakeHidden = false;
-
- d->initialize();
- if (!d->initialized)
- return;
-
- d->recreateFbo();
- resizeGL(width(), height());
- d->sendPaintEvent(QRect(QPoint(0, 0), size()));
-}
-
-/*!
- Handles paint events.
-
- Calling QWidget::update() will lead to sending a paint event \a e,
- and thus invoking this function. (NB this is asynchronous and will
- happen at some point after returning from update()). This function
- will then, after some preparation, call the virtual paintGL() to
- update the contents of the QOpenGLWidget's framebuffer. The widget's
- top-level window will then composite the framebuffer's texture with
- the rest of the window.
-*/
-void QOpenGLWidget::paintEvent(QPaintEvent *e)
-{
- Q_UNUSED(e);
- Q_D(QOpenGLWidget);
- if (!d->initialized)
- return;
-
- if (updatesEnabled())
- d->render();
-}
-
-/*!
- Renders and returns a 32-bit RGB image of the framebuffer.
-
- \note This is a potentially expensive operation because it relies on glReadPixels()
- to read back the pixels. This may be slow and can stall the GPU pipeline.
-*/
-QImage QOpenGLWidget::grabFramebuffer()
-{
- Q_D(QOpenGLWidget);
- return d->grabFramebuffer();
-}
-
-/*!
- \internal
-*/
-int QOpenGLWidget::metric(QPaintDevice::PaintDeviceMetric metric) const
-{
- Q_D(const QOpenGLWidget);
- if (d->inBackingStorePaint)
- return QWidget::metric(metric);
-
- auto window = d->windowHandle(QWidgetPrivate::WindowHandleMode::TopLevel);
- QScreen *screen = window ? window->screen() : QGuiApplication::primaryScreen();
-
- const float dpmx = qt_defaultDpiX() * 100. / 2.54;
- const float dpmy = qt_defaultDpiY() * 100. / 2.54;
-
- switch (metric) {
- case PdmWidth:
- return width();
- case PdmHeight:
- return height();
- case PdmDepth:
- return 32;
- case PdmWidthMM:
- if (screen)
- return width() * screen->physicalSize().width() / screen->geometry().width();
- else
- return width() * 1000 / dpmx;
- case PdmHeightMM:
- if (screen)
- return height() * screen->physicalSize().height() / screen->geometry().height();
- else
- return height() * 1000 / dpmy;
- case PdmNumColors:
- return 0;
- case PdmDpiX:
- if (screen)
- return qRound(screen->logicalDotsPerInchX());
- else
- return qRound(dpmx * 0.0254);
- case PdmDpiY:
- if (screen)
- return qRound(screen->logicalDotsPerInchY());
- else
- return qRound(dpmy * 0.0254);
- case PdmPhysicalDpiX:
- if (screen)
- return qRound(screen->physicalDotsPerInchX());
- else
- return qRound(dpmx * 0.0254);
- case PdmPhysicalDpiY:
- if (screen)
- return qRound(screen->physicalDotsPerInchY());
- else
- return qRound(dpmy * 0.0254);
- case PdmDevicePixelRatio:
- if (window)
- return int(window->devicePixelRatio());
- else
- return 1.0;
- case PdmDevicePixelRatioScaled:
- if (window)
- return int(window->devicePixelRatio() * devicePixelRatioFScale());
- else
- return int(devicePixelRatioFScale());
- default:
- qWarning("QOpenGLWidget::metric(): unknown metric %d", metric);
- return 0;
- }
-}
-
-/*!
- \internal
-*/
-QPaintDevice *QOpenGLWidget::redirected(QPoint *p) const
-{
- Q_D(const QOpenGLWidget);
- if (d->inBackingStorePaint)
- return QWidget::redirected(p);
-
- return d->paintDevice;
-}
-
-/*!
- \internal
-*/
-QPaintEngine *QOpenGLWidget::paintEngine() const
-{
- Q_D(const QOpenGLWidget);
- // QWidget needs to "punch a hole" into the backingstore. This needs the
- // normal paint engine and device, not the GL one. So in this mode, behave
- // like a normal widget.
- if (d->inBackingStorePaint)
- return QWidget::paintEngine();
-
- if (!d->initialized)
- return nullptr;
-
- return d->paintDevice->paintEngine();
-}
-
-/*!
- \internal
-*/
-bool QOpenGLWidget::event(QEvent *e)
-{
- Q_D(QOpenGLWidget);
- switch (e->type()) {
- case QEvent::WindowChangeInternal:
- if (QCoreApplication::testAttribute(Qt::AA_ShareOpenGLContexts))
- break;
- if (d->initialized)
- d->reset();
- if (isHidden())
- break;
- Q_FALLTHROUGH();
- case QEvent::Show: // reparenting may not lead to a resize so reinitalize on Show too
- if (d->initialized && window()->windowHandle()
- && d->context->shareContext() != QWidgetPrivate::get(window())->shareContext())
- {
- // Special case: did grabFramebuffer() for a hidden widget that then became visible.
- // Recreate all resources since the context now needs to share with the TLW's.
- if (!QCoreApplication::testAttribute(Qt::AA_ShareOpenGLContexts))
- d->reset();
- }
- if (!d->initialized && !size().isEmpty() && window()->windowHandle()) {
- d->initialize();
- if (d->initialized)
- d->recreateFbo();
- }
- break;
- case QEvent::ScreenChangeInternal:
- if (d->initialized && d->paintDevice->devicePixelRatioF() != devicePixelRatioF())
- d->recreateFbo();
- break;
- default:
- break;
- }
- return QWidget::event(e);
-}
-
-QT_END_NAMESPACE
-
-#include "moc_qopenglwidget.cpp"
diff --git a/src/widgets/kernel/qopenglwidget.h b/src/widgets/kernel/qopenglwidget.h
deleted file mode 100644
index 9eb4a9ba5a..0000000000
--- a/src/widgets/kernel/qopenglwidget.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QOPENGLWIDGET_H
-#define QOPENGLWIDGET_H
-
-#include <QtWidgets/qtwidgetsglobal.h>
-
-#ifndef QT_NO_OPENGL
-
-#include <QtWidgets/QWidget>
-#include <QtGui/QSurfaceFormat>
-#include <QtGui/qopengl.h>
-
-QT_BEGIN_NAMESPACE
-
-class QOpenGLWidgetPrivate;
-
-class Q_WIDGETS_EXPORT QOpenGLWidget : public QWidget
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QOpenGLWidget)
-
-public:
- enum UpdateBehavior {
- NoPartialUpdate,
- PartialUpdate
- };
-
- explicit QOpenGLWidget(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
- ~QOpenGLWidget();
-
- void setUpdateBehavior(UpdateBehavior updateBehavior);
- UpdateBehavior updateBehavior() const;
-
- void setFormat(const QSurfaceFormat &format);
- QSurfaceFormat format() const;
-
- GLenum textureFormat() const;
- void setTextureFormat(GLenum texFormat);
-
- bool isValid() const;
-
- void makeCurrent();
- void doneCurrent();
-
- QOpenGLContext *context() const;
- GLuint defaultFramebufferObject() const;
-
- QImage grabFramebuffer();
-
-Q_SIGNALS:
- void aboutToCompose();
- void frameSwapped();
- void aboutToResize();
- void resized();
-
-protected:
- virtual void initializeGL();
- virtual void resizeGL(int w, int h);
- virtual void paintGL();
-
- void paintEvent(QPaintEvent *e) override;
- void resizeEvent(QResizeEvent *e) override;
- bool event(QEvent *e) override;
-
- int metric(QPaintDevice::PaintDeviceMetric metric) const override;
- QPaintDevice *redirected(QPoint *p) const override;
- QPaintEngine *paintEngine() const override;
-
-private:
- Q_DISABLE_COPY(QOpenGLWidget)
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_OPENGL
-
-#endif // QOPENGLWIDGET_H
diff --git a/src/widgets/kernel/qshortcut.cpp b/src/widgets/kernel/qshortcut.cpp
deleted file mode 100644
index 039699a004..0000000000
--- a/src/widgets/kernel/qshortcut.cpp
+++ /dev/null
@@ -1,753 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qshortcut.h"
-#include "private/qwidget_p.h"
-
-#ifndef QT_NO_SHORTCUT
-#include <qevent.h>
-#if QT_CONFIG(whatsthis)
-#include <qwhatsthis.h>
-#endif
-#if QT_CONFIG(menu)
-#include <qmenu.h>
-#endif
-#if QT_CONFIG(menubar)
-#include <qmenubar.h>
-#endif
-#include <qapplication.h>
-#include <private/qapplication_p.h>
-#include <private/qshortcutmap_p.h>
-#include <private/qaction_p.h>
-#include <private/qwidgetwindow_p.h>
-#include <qpa/qplatformmenu.h>
-
-QT_BEGIN_NAMESPACE
-
-#define QAPP_CHECK(functionName) \
- if (Q_UNLIKELY(!qApp)) { \
- qWarning("QShortcut: Initialize QApplication before calling '" functionName "'."); \
- return; \
- }
-
-
-static bool correctWidgetContext(Qt::ShortcutContext context, QWidget *w, QWidget *active_window);
-#if QT_CONFIG(graphicsview)
-static bool correctGraphicsWidgetContext(Qt::ShortcutContext context, QGraphicsWidget *w, QWidget *active_window);
-#endif
-#ifndef QT_NO_ACTION
-static bool correctActionContext(Qt::ShortcutContext context, QAction *a, QWidget *active_window);
-#endif
-
-
-/*! \internal
- Returns \c true if the widget \a w is a logical sub window of the current
- top-level widget.
-*/
-bool qWidgetShortcutContextMatcher(QObject *object, Qt::ShortcutContext context)
-{
- Q_ASSERT_X(object, "QShortcutMap", "Shortcut has no owner. Illegal map state!");
-
- QWidget *active_window = QApplication::activeWindow();
-
- // popups do not become the active window,
- // so we fake it here to get the correct context
- // for the shortcut system.
- if (QApplication::activePopupWidget())
- active_window = QApplication::activePopupWidget();
-
- if (!active_window) {
- QWindow *qwindow = QGuiApplication::focusWindow();
- if (qwindow && qwindow->isActive()) {
- while (qwindow) {
- if (auto widgetWindow = qobject_cast<QWidgetWindow *>(qwindow)) {
- active_window = widgetWindow->widget();
- break;
- }
- qwindow = qwindow->parent();
- }
- }
- }
-
- if (!active_window)
- return false;
-
-#ifndef QT_NO_ACTION
- if (auto a = qobject_cast<QAction *>(object))
- return correctActionContext(context, a, active_window);
-#endif
-
-#if QT_CONFIG(graphicsview)
- if (auto gw = qobject_cast<QGraphicsWidget *>(object))
- return correctGraphicsWidgetContext(context, gw, active_window);
-#endif
-
- auto w = qobject_cast<QWidget *>(object);
- if (!w) {
- if (auto s = qobject_cast<QShortcut *>(object))
- w = s->parentWidget();
- }
-
- if (!w) {
- auto qwindow = qobject_cast<QWindow *>(object);
- while (qwindow) {
- if (auto widget_window = qobject_cast<QWidgetWindow *>(qwindow)) {
- w = widget_window->widget();
- break;
- }
- qwindow = qwindow->parent();
- }
- }
-
- if (!w)
- return false;
-
- return correctWidgetContext(context, w, active_window);
-}
-
-static bool correctWidgetContext(Qt::ShortcutContext context, QWidget *w, QWidget *active_window)
-{
- bool visible = w->isVisible();
-#if QT_CONFIG(menubar)
- if (auto menuBar = qobject_cast<QMenuBar *>(w)) {
- if (auto *pmb = menuBar->platformMenuBar()) {
- if (menuBar->parentWidget()) {
- visible = true;
- } else {
- if (auto *ww = qobject_cast<QWidgetWindow *>(pmb->parentWindow()))
- w = ww->widget(); // Good enough since we only care about the window
- else
- return false; // This is not a QWidget window. We won't deliver
- }
- }
- }
-#endif
-
- if (!visible || !w->isEnabled())
- return false;
-
- if (context == Qt::ApplicationShortcut)
- return QApplicationPrivate::tryModalHelper(w, nullptr); // true, unless w is shadowed by a modal dialog
-
- if (context == Qt::WidgetShortcut)
- return w == QApplication::focusWidget();
-
- if (context == Qt::WidgetWithChildrenShortcut) {
- const QWidget *tw = QApplication::focusWidget();
- while (tw && tw != w && (tw->windowType() == Qt::Widget || tw->windowType() == Qt::Popup || tw->windowType() == Qt::SubWindow))
- tw = tw->parentWidget();
- return tw == w;
- }
-
- // Below is Qt::WindowShortcut context
- QWidget *tlw = w->window();
-#if QT_CONFIG(graphicsview)
- if (auto topData = static_cast<QWidgetPrivate *>(QObjectPrivate::get(tlw))->extra.get()) {
- if (topData->proxyWidget) {
- bool res = correctGraphicsWidgetContext(context, topData->proxyWidget, active_window);
- return res;
- }
- }
-#endif
-
- if (active_window && active_window != tlw) {
- /* if a floating tool window is active, keep shortcuts on the parent working.
- * and if a popup window is active (f.ex a completer), keep shortcuts on the
- * focus proxy working */
- if (active_window->windowType() == Qt::Tool && active_window->parentWidget()) {
- active_window = active_window->parentWidget()->window();
- } else if (active_window->windowType() == Qt::Popup && active_window->focusProxy()) {
- active_window = active_window->focusProxy()->window();
- }
- }
-
- if (active_window != tlw) {
-#if QT_CONFIG(menubar)
- // If the tlw is a QMenuBar then we allow it to proceed as this indicates that
- // the QMenuBar is a parentless one and is therefore used for multiple top level
- // windows in the application. This is common on macOS platforms for example.
- if (!qobject_cast<QMenuBar *>(tlw))
-#endif
- return false;
- }
-
- /* if we live in a MDI subwindow, ignore the event if we are
- not the active document window */
- const QWidget* sw = w;
- while (sw && !(sw->windowType() == Qt::SubWindow) && !sw->isWindow())
- sw = sw->parentWidget();
- if (sw && (sw->windowType() == Qt::SubWindow)) {
- QWidget *focus_widget = QApplication::focusWidget();
- while (focus_widget && focus_widget != sw)
- focus_widget = focus_widget->parentWidget();
- return sw == focus_widget;
- }
-
-#if defined(DEBUG_QSHORTCUTMAP)
- qDebug().nospace() << "..true [Pass-through]";
-#endif
- return QApplicationPrivate::tryModalHelper(w, nullptr);
-}
-
-#if QT_CONFIG(graphicsview)
-static bool correctGraphicsWidgetContext(Qt::ShortcutContext context, QGraphicsWidget *w, QWidget *active_window)
-{
- bool visible = w->isVisible();
-#if defined(Q_OS_DARWIN) && QT_CONFIG(menubar)
- if (!QCoreApplication::testAttribute(Qt::AA_DontUseNativeMenuBar) && qobject_cast<QMenuBar *>(w))
- visible = true;
-#endif
-
- if (!visible || !w->isEnabled() || !w->scene())
- return false;
-
- if (context == Qt::ApplicationShortcut) {
- // Applicationwide shortcuts are always reachable unless their owner
- // is shadowed by modality. In QGV there's no modality concept, but we
- // must still check if all views are shadowed.
- const auto &views = w->scene()->views();
- for (auto view : views) {
- if (QApplicationPrivate::tryModalHelper(view, nullptr))
- return true;
- }
- return false;
- }
-
- if (context == Qt::WidgetShortcut)
- return static_cast<QGraphicsItem *>(w) == w->scene()->focusItem();
-
- if (context == Qt::WidgetWithChildrenShortcut) {
- const QGraphicsItem *ti = w->scene()->focusItem();
- if (ti && ti->isWidget()) {
- const auto *tw = static_cast<const QGraphicsWidget *>(ti);
- while (tw && tw != w && (tw->windowType() == Qt::Widget || tw->windowType() == Qt::Popup))
- tw = tw->parentWidget();
- return tw == w;
- }
- return false;
- }
-
- // Below is Qt::WindowShortcut context
-
- // Find the active view (if any).
- const auto &views = w->scene()->views();
- QGraphicsView *activeView = nullptr;
- for (auto view : views) {
- if (view->window() == active_window) {
- activeView = view;
- break;
- }
- }
- if (!activeView)
- return false;
-
- // The shortcut is reachable if owned by a windowless widget, or if the
- // widget's window is the same as the focus item's window.
- QGraphicsWidget *a = w->scene()->activeWindow();
- return !w->window() || a == w->window();
-}
-#endif
-
-#ifndef QT_NO_ACTION
-static bool correctActionContext(Qt::ShortcutContext context, QAction *a, QWidget *active_window)
-{
- const QWidgetList &widgets = static_cast<QActionPrivate *>(QObjectPrivate::get(a))->widgets;
-#if defined(DEBUG_QSHORTCUTMAP)
- if (widgets.isEmpty())
- qDebug() << a << "not connected to any widgets; won't trigger";
-#endif
- for (auto w : widgets) {
-#if QT_CONFIG(menu)
- if (auto menu = qobject_cast<QMenu *>(w)) {
-#ifdef Q_OS_DARWIN
- // On Mac, menu item shortcuts are processed before reaching any window.
- // That means that if a menu action shortcut has not been already processed
- // (and reaches this point), then the menu item itself has been disabled.
- // This occurs at the QPA level on Mac, where we disable all the Cocoa menus
- // when showing a modal window. (Notice that only the QPA menu is disabled,
- // not the QMenu.) Since we can also reach this code by climbing the menu
- // hierarchy (see below), or when the shortcut is not a key-equivalent, we
- // need to check whether the QPA menu is actually disabled.
- // When there is no QPA menu, there will be no QCocoaMenuDelegate checking
- // for the actual shortcuts. We can then fallback to our own logic.
- QPlatformMenu *pm = menu->platformMenu();
- if (pm && !pm->isEnabled())
- continue;
-#endif
- QAction *a = menu->menuAction();
- if (correctActionContext(context, a, active_window))
- return true;
- } else
-#endif
- if (correctWidgetContext(context, w, active_window))
- return true;
- }
-
-#if QT_CONFIG(graphicsview)
- const auto &graphicsWidgets = static_cast<QActionPrivate *>(QObjectPrivate::get(a))->graphicsWidgets;
-#if defined(DEBUG_QSHORTCUTMAP)
- if (graphicsWidgets.isEmpty())
- qDebug() << a << "not connected to any widgets; won't trigger";
-#endif
- for (auto graphicsWidget : graphicsWidgets) {
- if (correctGraphicsWidgetContext(context, graphicsWidget, active_window))
- return true;
- }
-#endif
- return false;
-}
-#endif // QT_NO_ACTION
-
-
-/*!
- \class QShortcut
- \brief The QShortcut class is used to create keyboard shortcuts.
-
- \ingroup events
- \inmodule QtWidgets
-
- The QShortcut class provides a way of connecting keyboard
- shortcuts to Qt's \l{signals and slots} mechanism, so that
- objects can be informed when a shortcut is executed. The shortcut
- can be set up to contain all the key presses necessary to
- describe a keyboard shortcut, including the states of modifier
- keys such as \uicontrol Shift, \uicontrol Ctrl, and \uicontrol Alt.
-
- \target mnemonic
-
- On certain widgets, using '&' in front of a character will
- automatically create a mnemonic (a shortcut) for that character,
- e.g. "E&xit" will create the shortcut \uicontrol Alt+X (use '&&' to
- display an actual ampersand). The widget might consume and perform
- an action on a given shortcut. On X11 the ampersand will not be
- shown and the character will be underlined. On Windows, shortcuts
- are normally not displayed until the user presses the \uicontrol Alt
- key, but this is a setting the user can change. On Mac, shortcuts
- are disabled by default. Call \l qt_set_sequence_auto_mnemonic() to
- enable them. However, because mnemonic shortcuts do not fit in
- with Aqua's guidelines, Qt will not show the shortcut character
- underlined.
-
- For applications that use menus, it may be more convenient to
- use the convenience functions provided in the QMenu class to
- assign keyboard shortcuts to menu items as they are created.
- Alternatively, shortcuts may be associated with other types of
- actions in the QAction class.
-
- The simplest way to create a shortcut for a particular widget is
- to construct the shortcut with a key sequence. For example:
-
- \snippet code/src_gui_kernel_qshortcut.cpp 0
-
- When the user types the \l{QKeySequence}{key sequence}
- for a given shortcut, the shortcut's activated() signal is
- emitted. (In the case of ambiguity, the activatedAmbiguously()
- signal is emitted.) A shortcut is "listened for" by Qt's event
- loop when the shortcut's parent widget is receiving events.
-
- A shortcut's key sequence can be set with setKey() and retrieved
- with key(). A shortcut can be enabled or disabled with
- setEnabled(), and can have "What's This?" help text set with
- setWhatsThis().
-
- \sa QShortcutEvent, QKeySequence, QAction
-*/
-
-/*!
- \fn QWidget *QShortcut::parentWidget() const
-
- Returns the shortcut's parent widget.
-*/
-
-/*!
- \fn void QShortcut::activated()
-
- This signal is emitted when the user types the shortcut's key
- sequence.
-
- \sa activatedAmbiguously()
-*/
-
-/*!
- \fn void QShortcut::activatedAmbiguously()
-
- When a key sequence is being typed at the keyboard, it is said to
- be ambiguous as long as it matches the start of more than one
- shortcut.
-
- When a shortcut's key sequence is completed,
- activatedAmbiguously() is emitted if the key sequence is still
- ambiguous (i.e., it is the start of one or more other shortcuts).
- The activated() signal is not emitted in this case.
-
- \sa activated()
-*/
-
-/*!
- \fn template<typename Functor>
- QShortcut(const QKeySequence &key, QWidget *parent,
- Functor functor,
- Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
- \since 5.15
- \overload
-
- This is a QShortcut convenience constructor which connects the shortcut's
- \l{QShortcut::activated()}{activated()} signal to the \a functor.
-*/
-/*!
- \fn template<typename Functor>
- QShortcut(const QKeySequence &key, QWidget *parent,
- const QObject *context, Functor functor,
- Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
- \since 5.15
- \overload
-
- This is a QShortcut convenience constructor which connects the shortcut's
- \l{QShortcut::activated()}{activated()} signal to the \a functor.
-
- The \a functor can be a pointer to a member function of the \a context object.
-
- If the \a context object is destroyed, the \a functor will not be called.
-*/
-/*!
- \fn template<typename Functor, typename FunctorAmbiguous>
- QShortcut(const QKeySequence &key, QWidget *parent,
- const QObject *context1, Functor functor,
- FunctorAmbiguous functorAmbiguous,
- Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
- \since 5.15
- \overload
-
- This is a QShortcut convenience constructor which connects the shortcut's
- \l{QShortcut::activated()}{activated()} signal to the \a functor and
- \l{QShortcut::activatedAmbiguously()}{activatedAmbiguously()}
- signal to the \a FunctorAmbiguous.
-
- The \a functor and \a FunctorAmbiguous can be a pointer to a member
- function of the \a context object.
-
- If the \a context object is destroyed, the \a functor and
- \a FunctorAmbiguous will not be called.
-*/
-/*!
- \fn template<typename Functor, typename FunctorAmbiguous>
- QShortcut(const QKeySequence &key, QWidget *parent,
- const QObject *context1, Functor functor,
- const QObject *context2, FunctorAmbiguous functorAmbiguous,
- Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
- \since 5.15
- \overload
-
- This is a QShortcut convenience constructor which connects the shortcut's
- \l{QShortcut::activated()}{activated()} signal to the \a functor and
- \l{QShortcut::activatedAmbiguously()}{activatedAmbiguously()}
- signal to the \a FunctorAmbiguous.
-
- The \a functor can be a pointer to a member function of the
- \a context1 object.
- The \a FunctorAmbiguous can be a pointer to a member function of the
- \a context2 object.
-
- If the \a context1 object is destroyed, the \a functor will not be called.
- If the \a context2 object is destroyed, the \a FunctorAmbiguous
- will not be called.
-*/
-
-/*
- \internal
- Private data accessed through d-pointer.
-*/
-class QShortcutPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QShortcut)
-public:
- QShortcutPrivate() = default;
- QKeySequence sc_sequence;
- Qt::ShortcutContext sc_context = Qt::WindowShortcut;
- bool sc_enabled = true;
- bool sc_autorepeat = true;
- int sc_id = 0;
- QString sc_whatsthis;
- void redoGrab(QShortcutMap &map);
-};
-
-void QShortcutPrivate::redoGrab(QShortcutMap &map)
-{
- Q_Q(QShortcut);
- if (Q_UNLIKELY(!parent)) {
- qWarning("QShortcut: No widget parent defined");
- return;
- }
-
- if (sc_id)
- map.removeShortcut(sc_id, q);
- if (sc_sequence.isEmpty())
- return;
- sc_id = map.addShortcut(q, sc_sequence, sc_context, qWidgetShortcutContextMatcher);
- if (!sc_enabled)
- map.setShortcutEnabled(false, sc_id, q);
- if (!sc_autorepeat)
- map.setShortcutAutoRepeat(false, sc_id, q);
-}
-
-/*!
- Constructs a QShortcut object for the \a parent widget. Since no
- shortcut key sequence is specified, the shortcut will not emit any
- signals.
-
- \sa setKey()
-*/
-QShortcut::QShortcut(QWidget *parent)
- : QObject(*new QShortcutPrivate, parent)
-{
- Q_ASSERT(parent != nullptr);
-}
-
-/*!
- Constructs a QShortcut object for the \a parent widget. The shortcut
- operates on its parent, listening for \l{QShortcutEvent}s that
- match the \a key sequence. Depending on the ambiguity of the
- event, the shortcut will call the \a member function, or the \a
- ambiguousMember function, if the key press was in the shortcut's
- \a shortcutContext.
-*/
-QShortcut::QShortcut(const QKeySequence &key, QWidget *parent,
- const char *member, const char *ambiguousMember,
- Qt::ShortcutContext shortcutContext)
- : QShortcut(parent)
-{
- QAPP_CHECK("QShortcut");
-
- Q_D(QShortcut);
- d->sc_context = shortcutContext;
- d->sc_sequence = key;
- d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
- if (member)
- connect(this, SIGNAL(activated()), parent, member);
- if (ambiguousMember)
- connect(this, SIGNAL(activatedAmbiguously()), parent, ambiguousMember);
-}
-
-/*!
- Destroys the shortcut.
-*/
-QShortcut::~QShortcut()
-{
- Q_D(QShortcut);
- if (qApp)
- QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(d->sc_id, this);
-}
-
-/*!
- \property QShortcut::key
- \brief the shortcut's key sequence
-
- This is a key sequence with an optional combination of Shift, Ctrl,
- and Alt. The key sequence may be supplied in a number of ways:
-
- \snippet code/src_gui_kernel_qshortcut.cpp 1
-
- By default, this property contains an empty key sequence.
-*/
-void QShortcut::setKey(const QKeySequence &key)
-{
- Q_D(QShortcut);
- if (d->sc_sequence == key)
- return;
- QAPP_CHECK("setKey");
- d->sc_sequence = key;
- d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
-}
-
-QKeySequence QShortcut::key() const
-{
- Q_D(const QShortcut);
- return d->sc_sequence;
-}
-
-/*!
- \property QShortcut::enabled
- \brief whether the shortcut is enabled
-
- An enabled shortcut emits the activated() or activatedAmbiguously()
- signal when a QShortcutEvent occurs that matches the shortcut's
- key() sequence.
-
- If the application is in \c WhatsThis mode the shortcut will not emit
- the signals, but will show the "What's This?" text instead.
-
- By default, this property is \c true.
-
- \sa whatsThis
-*/
-void QShortcut::setEnabled(bool enable)
-{
- Q_D(QShortcut);
- if (d->sc_enabled == enable)
- return;
- QAPP_CHECK("setEnabled");
- d->sc_enabled = enable;
- QGuiApplicationPrivate::instance()->shortcutMap.setShortcutEnabled(enable, d->sc_id, this);
-}
-
-bool QShortcut::isEnabled() const
-{
- Q_D(const QShortcut);
- return d->sc_enabled;
-}
-
-/*!
- \property QShortcut::context
- \brief the context in which the shortcut is valid
-
- A shortcut's context decides in which circumstances a shortcut is
- allowed to be triggered. The normal context is Qt::WindowShortcut,
- which allows the shortcut to trigger if the parent (the widget
- containing the shortcut) is a subwidget of the active top-level
- window.
-
- By default, this property is set to Qt::WindowShortcut.
-*/
-void QShortcut::setContext(Qt::ShortcutContext context)
-{
- Q_D(QShortcut);
- if(d->sc_context == context)
- return;
- QAPP_CHECK("setContext");
- d->sc_context = context;
- d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
-}
-
-Qt::ShortcutContext QShortcut::context() const
-{
- Q_D(const QShortcut);
- return d->sc_context;
-}
-
-/*!
- \property QShortcut::whatsThis
- \brief the shortcut's "What's This?" help text
-
- The text will be shown when the application is in "What's
- This?" mode and the user types the shortcut key() sequence.
-
- To set "What's This?" help on a menu item (with or without a
- shortcut key), set the help on the item's action.
-
- By default, this property contains an empty string.
-
- \sa QWhatsThis::inWhatsThisMode(), QAction::setWhatsThis()
-*/
-void QShortcut::setWhatsThis(const QString &text)
-{
- Q_D(QShortcut);
- d->sc_whatsthis = text;
-}
-
-QString QShortcut::whatsThis() const
-{
- Q_D(const QShortcut);
- return d->sc_whatsthis;
-}
-
-/*!
- \property QShortcut::autoRepeat
- \brief whether the shortcut can auto repeat
- \since 4.2
-
- If true, the shortcut will auto repeat when the keyboard shortcut
- combination is held down, provided that keyboard auto repeat is
- enabled on the system.
- The default value is true.
-*/
-void QShortcut::setAutoRepeat(bool on)
-{
- Q_D(QShortcut);
- if (d->sc_autorepeat == on)
- return;
- QAPP_CHECK("setAutoRepeat");
- d->sc_autorepeat = on;
- QGuiApplicationPrivate::instance()->shortcutMap.setShortcutAutoRepeat(on, d->sc_id, this);
-}
-
-bool QShortcut::autoRepeat() const
-{
- Q_D(const QShortcut);
- return d->sc_autorepeat;
-}
-
-/*!
- Returns the shortcut's ID.
-
- \sa QShortcutEvent::shortcutId()
-*/
-int QShortcut::id() const
-{
- Q_D(const QShortcut);
- return d->sc_id;
-}
-
-/*!
- \internal
-*/
-bool QShortcut::event(QEvent *e)
-{
- Q_D(QShortcut);
- if (d->sc_enabled && e->type() == QEvent::Shortcut) {
- auto se = static_cast<QShortcutEvent *>(e);
- if (se->shortcutId() == d->sc_id && se->key() == d->sc_sequence){
-#if QT_CONFIG(whatsthis)
- if (QWhatsThis::inWhatsThisMode()) {
- QWhatsThis::showText(QCursor::pos(), d->sc_whatsthis);
- } else
-#endif
- if (se->isAmbiguous())
- emit activatedAmbiguously();
- else
- emit activated();
- return true;
- }
- }
- return QObject::event(e);
-}
-#endif // QT_NO_SHORTCUT
-
-QT_END_NAMESPACE
-
-#include "moc_qshortcut.cpp"
diff --git a/src/widgets/kernel/qshortcut.h b/src/widgets/kernel/qshortcut.h
deleted file mode 100644
index 384f1967c9..0000000000
--- a/src/widgets/kernel/qshortcut.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSHORTCUT_H
-#define QSHORTCUT_H
-
-#include <QtWidgets/qtwidgetsglobal.h>
-#include <QtWidgets/qwidget.h>
-#include <QtGui/qkeysequence.h>
-
-QT_BEGIN_NAMESPACE
-
-
-#ifndef QT_NO_SHORTCUT
-
-class QShortcutPrivate;
-class Q_WIDGETS_EXPORT QShortcut : public QObject
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QShortcut)
- Q_PROPERTY(QKeySequence key READ key WRITE setKey)
- Q_PROPERTY(QString whatsThis READ whatsThis WRITE setWhatsThis)
- Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
- Q_PROPERTY(bool autoRepeat READ autoRepeat WRITE setAutoRepeat)
- Q_PROPERTY(Qt::ShortcutContext context READ context WRITE setContext)
-public:
- explicit QShortcut(QWidget *parent);
- QShortcut(const QKeySequence &key, QWidget *parent,
- const char *member = nullptr, const char *ambiguousMember = nullptr,
- Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
-#ifdef Q_CLANG_QDOC
- template<typename Functor>
- QShortcut(const QKeySequence &key, QWidget *parent,
- Functor functor,
- Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
- template<typename Functor>
- QShortcut(const QKeySequence &key, QWidget *parent,
- const QObject *context, Functor functor,
- Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
- template<typename Functor, typename FunctorAmbiguous>
- QShortcut(const QKeySequence &key, QWidget *parent,
- const QObject *context1, Functor functor,
- FunctorAmbiguous functorAmbiguous,
- Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
- template<typename Functor, typename FunctorAmbiguous>
- QShortcut(const QKeySequence &key, QWidget *parent,
- const QObject *context1, Functor functor,
- const QObject *context2, FunctorAmbiguous functorAmbiguous,
- Qt::ShortcutContext shortcutContext = Qt::WindowShortcut);
-#else
- template<typename Func1>
- QShortcut(const QKeySequence &key, QWidget *parent,
- Func1 slot1,
- Qt::ShortcutContext context = Qt::WindowShortcut)
- : QShortcut(key, parent, static_cast<const char*>(nullptr), static_cast<const char*>(nullptr), context)
- {
- connect(this, &QShortcut::activated, std::move(slot1));
- }
- template<class Obj1, typename Func1>
- QShortcut(const QKeySequence &key, QWidget *parent,
- const Obj1 *object1, Func1 slot1,
- Qt::ShortcutContext context = Qt::WindowShortcut,
- typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<Obj1*>::Value>::type* = 0)
- : QShortcut(key, parent, static_cast<const char*>(nullptr), static_cast<const char*>(nullptr), context)
- {
- connect(this, &QShortcut::activated, object1, std::move(slot1));
- }
- template<class Obj1, typename Func1, typename Func2>
- QShortcut(const QKeySequence &key, QWidget *parent,
- const Obj1 *object1, Func1 slot1, Func2 slot2,
- Qt::ShortcutContext context = Qt::WindowShortcut,
- typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<Obj1*>::Value>::type* = 0)
- : QShortcut(key, parent, static_cast<const char*>(nullptr), static_cast<const char*>(nullptr), context)
- {
- connect(this, &QShortcut::activated, object1, std::move(slot1));
- connect(this, &QShortcut::activatedAmbiguously, object1, std::move(slot2));
- }
- template<class Obj1, typename Func1, class Obj2, typename Func2>
- QShortcut(const QKeySequence &key, QWidget *parent,
- const Obj1 *object1, Func1 slot1,
- const Obj2 *object2, Func2 slot2,
- Qt::ShortcutContext context = Qt::WindowShortcut,
- typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<Obj1*>::Value>::type* = 0,
- typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<Obj2*>::Value>::type* = 0)
- : QShortcut(key, parent, static_cast<const char*>(nullptr), static_cast<const char*>(nullptr), context)
- {
- connect(this, &QShortcut::activated, object1, std::move(slot1));
- connect(this, &QShortcut::activatedAmbiguously, object2, std::move(slot2));
- }
-#endif
- ~QShortcut();
-
- void setKey(const QKeySequence& key);
- QKeySequence key() const;
-
- void setEnabled(bool enable);
- bool isEnabled() const;
-
- void setContext(Qt::ShortcutContext context);
- Qt::ShortcutContext context() const;
-
- void setWhatsThis(const QString &text);
- QString whatsThis() const;
-
- void setAutoRepeat(bool on);
- bool autoRepeat() const;
-
- int id() const;
-
- inline QWidget *parentWidget() const
- { return static_cast<QWidget *>(QObject::parent()); }
-
-Q_SIGNALS:
- void activated();
- void activatedAmbiguously();
-
-protected:
- bool event(QEvent *e) override;
-};
-
-#endif // QT_NO_SHORTCUT
-
-QT_END_NAMESPACE
-
-#endif // QSHORTCUT_H
diff --git a/src/widgets/kernel/qshortcut_widgets.cpp b/src/widgets/kernel/qshortcut_widgets.cpp
new file mode 100644
index 0000000000..9e64376fce
--- /dev/null
+++ b/src/widgets/kernel/qshortcut_widgets.cpp
@@ -0,0 +1,358 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qshortcut.h"
+#include "private/qshortcut_p.h"
+
+#include "private/qwidget_p.h"
+
+#include <qevent.h>
+#if QT_CONFIG(whatsthis)
+#include <qwhatsthis.h>
+#endif
+#if QT_CONFIG(menu)
+#include <qmenu.h>
+#endif
+#if QT_CONFIG(menubar)
+#include <qmenubar.h>
+#endif
+#include <qapplication.h>
+#include <private/qapplication_p.h>
+#include <private/qshortcutmap_p.h>
+#if QT_CONFIG(action)
+# include <private/qaction_p.h>
+#endif
+#include <private/qwidgetwindow_p.h>
+#include <qpa/qplatformmenu.h>
+
+QT_BEGIN_NAMESPACE
+
+static bool correctWidgetContext(Qt::ShortcutContext context, QWidget *w, QWidget *active_window);
+#if QT_CONFIG(graphicsview)
+static bool correctGraphicsWidgetContext(Qt::ShortcutContext context, QGraphicsWidget *w, QWidget *active_window);
+#endif
+#if QT_CONFIG(action)
+static bool correctActionContext(Qt::ShortcutContext context, QAction *a, QWidget *active_window);
+#endif
+
+
+/*! \internal
+ Returns \c true if the widget \a w is a logical sub window of the current
+ top-level widget.
+*/
+bool qWidgetShortcutContextMatcher(QObject *object, Qt::ShortcutContext context)
+{
+ Q_ASSERT_X(object, "QShortcutMap", "Shortcut has no owner. Illegal map state!");
+
+ QWidget *active_window = QApplication::activeWindow();
+
+ // popups do not become the active window,
+ // so we fake it here to get the correct context
+ // for the shortcut system.
+ if (QApplication::activePopupWidget())
+ active_window = QApplication::activePopupWidget();
+
+ if (!active_window) {
+ QWindow *qwindow = QGuiApplication::focusWindow();
+ if (qwindow && qwindow->isActive()) {
+ while (qwindow) {
+ if (auto widgetWindow = qobject_cast<QWidgetWindow *>(qwindow)) {
+ active_window = widgetWindow->widget();
+ break;
+ }
+ qwindow = qwindow->parent();
+ }
+ }
+ }
+
+ if (!active_window)
+ return false;
+
+#if QT_CONFIG(action)
+ if (auto a = qobject_cast<QAction *>(object))
+ return correctActionContext(context, a, active_window);
+#endif
+
+#if QT_CONFIG(graphicsview)
+ if (auto gw = qobject_cast<QGraphicsWidget *>(object))
+ return correctGraphicsWidgetContext(context, gw, active_window);
+#endif
+
+ auto w = qobject_cast<QWidget *>(object);
+ if (!w) {
+ if (auto s = qobject_cast<QShortcut *>(object))
+ w = s->parentWidget();
+ }
+
+ if (!w) {
+ auto qwindow = qobject_cast<QWindow *>(object);
+ while (qwindow) {
+ if (auto widget_window = qobject_cast<QWidgetWindow *>(qwindow)) {
+ w = widget_window->widget();
+ break;
+ }
+ qwindow = qwindow->parent();
+ }
+ }
+
+ if (!w)
+ return false;
+
+ return correctWidgetContext(context, w, active_window);
+}
+
+static bool correctWidgetContext(Qt::ShortcutContext context, QWidget *w, QWidget *active_window)
+{
+ bool visible = w->isVisible();
+#if QT_CONFIG(menubar)
+ if (auto menuBar = qobject_cast<QMenuBar *>(w)) {
+ if (auto *pmb = menuBar->platformMenuBar()) {
+ if (menuBar->parentWidget()) {
+ visible = true;
+ } else {
+ if (auto *ww = qobject_cast<QWidgetWindow *>(pmb->parentWindow()))
+ w = ww->widget(); // Good enough since we only care about the window
+ else
+ return false; // This is not a QWidget window. We won't deliver
+ }
+ }
+ }
+#endif
+
+ if (!visible || !w->isEnabled())
+ return false;
+
+ if (context == Qt::ApplicationShortcut)
+ return QApplicationPrivate::tryModalHelper(w, nullptr); // true, unless w is shadowed by a modal dialog
+
+ if (context == Qt::WidgetShortcut)
+ return w == QApplication::focusWidget();
+
+ if (context == Qt::WidgetWithChildrenShortcut) {
+ const QWidget *tw = QApplication::focusWidget();
+ while (tw && tw != w && (tw->windowType() == Qt::Widget || tw->windowType() == Qt::Popup || tw->windowType() == Qt::SubWindow))
+ tw = tw->parentWidget();
+ return tw == w;
+ }
+
+ // Below is Qt::WindowShortcut context
+ QWidget *tlw = w->window();
+#if QT_CONFIG(graphicsview)
+ if (auto topData = static_cast<QWidgetPrivate *>(QObjectPrivate::get(tlw))->extra.get()) {
+ if (topData->proxyWidget) {
+ bool res = correctGraphicsWidgetContext(context, topData->proxyWidget, active_window);
+ return res;
+ }
+ }
+#endif
+
+ if (active_window && active_window != tlw) {
+ /* if a floating tool window is active, keep shortcuts on the parent working.
+ * and if a popup window is active (f.ex a completer), keep shortcuts on the
+ * focus proxy working */
+ if (active_window->windowType() == Qt::Tool && active_window->parentWidget()) {
+ active_window = active_window->parentWidget()->window();
+ } else if (active_window->windowType() == Qt::Popup && active_window->focusProxy()) {
+ active_window = active_window->focusProxy()->window();
+ }
+ }
+
+ if (active_window != tlw) {
+#if QT_CONFIG(menubar)
+ // If the tlw is a QMenuBar then we allow it to proceed as this indicates that
+ // the QMenuBar is a parentless one and is therefore used for multiple top level
+ // windows in the application. This is common on macOS platforms for example.
+ if (!qobject_cast<QMenuBar *>(tlw))
+#endif
+ return false;
+ }
+
+ /* if we live in a MDI subwindow, ignore the event if we are
+ not the active document window */
+ const QWidget* sw = w;
+ while (sw && !(sw->windowType() == Qt::SubWindow) && !sw->isWindow())
+ sw = sw->parentWidget();
+ if (sw && (sw->windowType() == Qt::SubWindow)) {
+ QWidget *focus_widget = QApplication::focusWidget();
+ while (focus_widget && focus_widget != sw)
+ focus_widget = focus_widget->parentWidget();
+ return sw == focus_widget;
+ }
+
+#if defined(DEBUG_QSHORTCUTMAP)
+ qDebug().nospace() << "..true [Pass-through]";
+#endif
+ return QApplicationPrivate::tryModalHelper(w, nullptr);
+}
+
+#if QT_CONFIG(graphicsview)
+static bool correctGraphicsWidgetContext(Qt::ShortcutContext context, QGraphicsWidget *w, QWidget *active_window)
+{
+ bool visible = w->isVisible();
+#if defined(Q_OS_DARWIN) && QT_CONFIG(menubar)
+ if (!QCoreApplication::testAttribute(Qt::AA_DontUseNativeMenuBar) && qobject_cast<QMenuBar *>(w))
+ visible = true;
+#endif
+
+ if (!visible || !w->isEnabled() || !w->scene())
+ return false;
+
+ if (context == Qt::ApplicationShortcut) {
+ // Applicationwide shortcuts are always reachable unless their owner
+ // is shadowed by modality. In QGV there's no modality concept, but we
+ // must still check if all views are shadowed.
+ const auto &views = w->scene()->views();
+ for (auto view : views) {
+ if (QApplicationPrivate::tryModalHelper(view, nullptr))
+ return true;
+ }
+ return false;
+ }
+
+ if (context == Qt::WidgetShortcut)
+ return static_cast<QGraphicsItem *>(w) == w->scene()->focusItem();
+
+ if (context == Qt::WidgetWithChildrenShortcut) {
+ const QGraphicsItem *ti = w->scene()->focusItem();
+ if (ti && ti->isWidget()) {
+ const auto *tw = static_cast<const QGraphicsWidget *>(ti);
+ while (tw && tw != w && (tw->windowType() == Qt::Widget || tw->windowType() == Qt::Popup))
+ tw = tw->parentWidget();
+ return tw == w;
+ }
+ return false;
+ }
+
+ // Below is Qt::WindowShortcut context
+
+ // Find the active view (if any).
+ const auto &views = w->scene()->views();
+ QGraphicsView *activeView = nullptr;
+ for (auto view : views) {
+ if (view->window() == active_window) {
+ activeView = view;
+ break;
+ }
+ }
+ if (!activeView)
+ return false;
+
+ // The shortcut is reachable if owned by a windowless widget, or if the
+ // widget's window is the same as the focus item's window.
+ QGraphicsWidget *a = w->scene()->activeWindow();
+ return !w->window() || a == w->window();
+}
+#endif
+
+#if QT_CONFIG(action)
+static bool correctActionContext(Qt::ShortcutContext context, QAction *a, QWidget *active_window)
+{
+ const QObjectList associatedObjects = a->associatedObjects();
+#if defined(DEBUG_QSHORTCUTMAP)
+ if (associatedObjects.isEmpty())
+ qDebug() << a << "not connected to any widgets; won't trigger";
+#endif
+ for (auto object : associatedObjects) {
+#if QT_CONFIG(menu)
+ if (auto menu = qobject_cast<QMenu *>(object)) {
+#ifdef Q_OS_DARWIN
+ // On Mac, menu item shortcuts are processed before reaching any window.
+ // That means that if a menu action shortcut has not been already processed
+ // (and reaches this point), then the menu item itself has been disabled.
+ // This occurs at the QPA level on Mac, where we disable all the Cocoa menus
+ // when showing a modal window. (Notice that only the QPA menu is disabled,
+ // not the QMenu.) Since we can also reach this code by climbing the menu
+ // hierarchy (see below), or when the shortcut is not a key-equivalent, we
+ // need to check whether the QPA menu is actually disabled.
+ // When there is no QPA menu, there will be no QCocoaMenuDelegate checking
+ // for the actual shortcuts. We can then fallback to our own logic.
+ QPlatformMenu *pm = menu->platformMenu();
+ if (pm && !pm->isEnabled())
+ continue;
+#endif
+ QAction *a = menu->menuAction();
+ if (correctActionContext(context, a, active_window))
+ return true;
+ } else
+#endif
+ if (auto widget = qobject_cast<QWidget*>(object)) {
+ if (correctWidgetContext(context, widget, active_window))
+ return true;
+ }
+#if QT_CONFIG(graphicsview)
+ else if (auto graphicsWidget = qobject_cast<QGraphicsWidget*>(object)) {
+ if (correctGraphicsWidgetContext(context, graphicsWidget, active_window))
+ return true;
+ }
+#endif
+ }
+
+ return false;
+}
+#endif // QT_CONFIG(action)
+
+class QtWidgetsShortcutPrivate : public QShortcutPrivate
+{
+ Q_DECLARE_PUBLIC(QShortcut)
+public:
+ QtWidgetsShortcutPrivate() = default;
+
+ QShortcutMap::ContextMatcher contextMatcher() const override
+ { return qWidgetShortcutContextMatcher; }
+
+ bool handleWhatsThis() override;
+};
+
+bool QtWidgetsShortcutPrivate::handleWhatsThis()
+{
+#if QT_CONFIG(whatsthis)
+ if (QWhatsThis::inWhatsThisMode()) {
+ QWhatsThis::showText(QCursor::pos(), sc_whatsthis);
+ return true;
+ }
+#endif
+ return false;
+}
+
+QShortcutPrivate *QApplicationPrivate::createShortcutPrivate() const
+{
+ return new QtWidgetsShortcutPrivate;
+}
+
+QT_END_NAMESPACE
diff --git a/src/widgets/kernel/qsizepolicy.cpp b/src/widgets/kernel/qsizepolicy.cpp
index c4372a9fbc..bf3eb34d23 100644
--- a/src/widgets/kernel/qsizepolicy.cpp
+++ b/src/widgets/kernel/qsizepolicy.cpp
@@ -317,7 +317,7 @@ void QSizePolicy::setControlType(ControlType type) noexcept
*/
/*!
- \fn uint qHash(QSizePolicy key, uint seed = 0)
+ \fn size_t qHash(QSizePolicy key, size_t seed = 0)
\since 5.6
\relates QSizePolicy
diff --git a/src/widgets/kernel/qsizepolicy.h b/src/widgets/kernel/qsizepolicy.h
index f26923eeb0..f4d0b2faa9 100644
--- a/src/widgets/kernel/qsizepolicy.h
+++ b/src/widgets/kernel/qsizepolicy.h
@@ -65,7 +65,7 @@ QT_BEGIN_NAMESPACE
class QVariant;
class QSizePolicy;
-Q_DECL_CONST_FUNCTION inline uint qHash(QSizePolicy key, uint seed = 0) noexcept;
+Q_DECL_CONST_FUNCTION inline size_t qHash(QSizePolicy key, size_t seed = 0) noexcept;
class Q_WIDGETS_EXPORT QSizePolicy
{
@@ -146,7 +146,7 @@ public:
QT_SIZEPOLICY_CONSTEXPR bool operator==(const QSizePolicy& s) const noexcept { return data == s.data; }
QT_SIZEPOLICY_CONSTEXPR bool operator!=(const QSizePolicy& s) const noexcept { return data != s.data; }
- friend Q_DECL_CONST_FUNCTION uint qHash(QSizePolicy key, uint seed) noexcept { return qHash(key.data, seed); }
+ friend Q_DECL_CONST_FUNCTION size_t qHash(QSizePolicy key, size_t seed) noexcept { return qHash(key.data, seed); }
operator QVariant() const;
diff --git a/src/widgets/kernel/qt_widgets_pch.h b/src/widgets/kernel/qt_widgets_pch.h
index b70941950b..3551f19e80 100644
--- a/src/widgets/kernel/qt_widgets_pch.h
+++ b/src/widgets/kernel/qt_widgets_pch.h
@@ -53,7 +53,9 @@
#include <qabstractbutton.h>
#include <qabstractscrollarea.h>
#include <qabstractslider.h>
-#include <qaction.h>
+#if QT_CONFIG(action)
+# include <qaction.h>
+#endif
#include <qcommonstyle.h>
#include <qlayout.h>
#include <qstyle.h>
diff --git a/src/widgets/kernel/qtestsupport_widgets.cpp b/src/widgets/kernel/qtestsupport_widgets.cpp
index 0056bebdc6..068917101e 100644
--- a/src/widgets/kernel/qtestsupport_widgets.cpp
+++ b/src/widgets/kernel/qtestsupport_widgets.cpp
@@ -87,26 +87,4 @@ Q_WIDGETS_EXPORT Q_REQUIRED_RESULT bool QTest::qWaitForWindowExposed(QWidget *wi
return false;
}
-/*! \fn bool QTest::qWaitForWindowShown(QWidget *widget, int timeout)
- \since 5.0
- \deprecated
-
- Use qWaitForWindowExposed() instead.
-
- Waits for \a timeout milliseconds or until the \a widget's window is exposed.
- Returns \c true if \c widget's window is exposed within \a timeout milliseconds, otherwise returns \c false.
-
- This function does the same as qWaitForWindowExposed().
-
- Example:
-
- \code
- QWidget widget;
- widget.show();
- QTest::qWaitForWindowShown(&widget);
- \endcode
-
- \sa qWaitForWindowActive(), qWaitForWindowExposed()
-*/
-
QT_END_NAMESPACE
diff --git a/src/widgets/kernel/qtestsupport_widgets.h b/src/widgets/kernel/qtestsupport_widgets.h
index 2b37a9e858..98b297b405 100644
--- a/src/widgets/kernel/qtestsupport_widgets.h
+++ b/src/widgets/kernel/qtestsupport_widgets.h
@@ -49,11 +49,6 @@ class QWidget;
namespace QTest {
Q_WIDGETS_EXPORT Q_REQUIRED_RESULT bool qWaitForWindowActive(QWidget *widget, int timeout = 5000);
Q_WIDGETS_EXPORT Q_REQUIRED_RESULT bool qWaitForWindowExposed(QWidget *widget, int timeout = 5000);
-
-#if QT_DEPRECATED_SINCE(5, 0)
-QT_DEPRECATED Q_REQUIRED_RESULT inline static bool qWaitForWindowShown(QWidget *widget, int timeout = 5000)
-{ return QTest::qWaitForWindowExposed(widget, timeout); }
-#endif
}
QT_END_NAMESPACE
diff --git a/src/widgets/kernel/qtooltip.cpp b/src/widgets/kernel/qtooltip.cpp
index 661568dcad..eda3be0ba3 100644
--- a/src/widgets/kernel/qtooltip.cpp
+++ b/src/widgets/kernel/qtooltip.cpp
@@ -57,7 +57,6 @@
#include <qpa/qplatformcursor.h>
#include <private/qstylesheetstyle_p.h>
-#ifndef QT_NO_TOOLTIP
#include <qlabel.h>
#include <QtWidgets/private/qlabel_p.h>
#include <QtGui/private/qhighdpiscaling_p.h>
@@ -628,4 +627,3 @@ void QToolTip::setFont(const QFont &font)
QT_END_NAMESPACE
#include "qtooltip.moc"
-#endif // QT_NO_TOOLTIP
diff --git a/src/widgets/kernel/qtooltip.h b/src/widgets/kernel/qtooltip.h
index 1b263a6629..9f786bdee1 100644
--- a/src/widgets/kernel/qtooltip.h
+++ b/src/widgets/kernel/qtooltip.h
@@ -43,11 +43,9 @@
#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qwidget.h>
+QT_REQUIRE_CONFIG(tooltip);
QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_TOOLTIP
-
class Q_WIDGETS_EXPORT QToolTip
{
QToolTip() = delete;
@@ -67,8 +65,6 @@ public:
static void setFont(const QFont &);
};
-#endif // QT_NO_TOOLTIP
-
QT_END_NAMESPACE
#endif // QTOOLTIP_H
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index fe57ac3a7e..8afacb9dab 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -64,7 +64,9 @@
#include <qpa/qplatformwindow.h>
#include "private/qwidgetwindow_p.h"
#include "qpainter.h"
+#if QT_CONFIG(tooltip)
#include "qtooltip.h"
+#endif
#if QT_CONFIG(whatsthis)
#include "qwhatsthis.h"
#endif
@@ -88,7 +90,9 @@
#include "qwidget_p.h"
#include <QtGui/private/qwindow_p.h>
-#include "qaction_p.h"
+#if QT_CONFIG(action)
+# include "QtGui/private/qaction_p.h"
+#endif
#include "qlayout_p.h"
#if QT_CONFIG(graphicsview)
#include "QtWidgets/qgraphicsproxywidget.h"
@@ -145,7 +149,7 @@ QWidgetPrivate::QWidgetPrivate(int version)
#if !defined(QT_NO_IM)
, imHints(Qt::ImhNone)
#endif
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
, toolTipDuration(-1)
#endif
, directFontResolveMask(0)
@@ -192,7 +196,15 @@ QWidgetPrivate::QWidgetPrivate(int version)
return;
}
- checkForIncompatibleLibraryVersion(version);
+#ifdef QT_BUILD_INTERNAL
+ // Don't check the version parameter in internal builds.
+ // This allows incompatible versions to be loaded, possibly for testing.
+ Q_UNUSED(version);
+#else
+ if (Q_UNLIKELY(version != QObjectPrivateVersion))
+ qFatal("Cannot mix incompatible Qt library (version 0x%x) with this library (version 0x%x)",
+ version, QObjectPrivateVersion);
+#endif
isWidget = true;
memset(high_attributes, 0, sizeof(high_attributes));
@@ -957,18 +969,11 @@ void QWidgetPrivate::adjustFlags(Qt::WindowFlags &flags, QWidget *w)
flags |= Qt::WindowSystemMenuHint;
flags |= Qt::WindowTitleHint;
}
- if (customize)
- ; // don't modify window flags if the user explicitly set them.
- else if (type == Qt::Dialog || type == Qt::Sheet) {
- flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint;
- // ### fixme: Qt 6: Never set Qt::WindowContextHelpButtonHint flag automatically
- if (!QApplicationPrivate::testAttribute(Qt::AA_DisableWindowContextHelpButton))
- flags |= Qt::WindowContextHelpButtonHint;
- } else if (type == Qt::Tool)
+ if (!customize) { // don't modify window flags if the user explicitly set them.
flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint;
- else
- flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint |
- Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint | Qt::WindowFullscreenButtonHint;
+ if (type != Qt::Dialog && type != Qt::Sheet && type != Qt::Tool)
+ flags |= Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowFullscreenButtonHint;
+ }
if (w->testAttribute(Qt::WA_TransparentForMouseEvents))
flags |= Qt::WindowTransparentForInput;
}
@@ -1102,6 +1107,17 @@ QWindow *QWidgetPrivate::windowHandle(WindowHandleMode mode) const
return nullptr;
}
+/*!
+ \internal
+
+ Used by clients outside of widgets to get a handle to the
+ closest QWindow without having to link to widgets.
+*/
+QWindow *QWidgetPrivate::_q_closestWindowHandle() const
+{
+ return windowHandle(QWidgetPrivate::WindowHandleMode::Closest);
+}
+
QScreen *QWidgetPrivate::associatedScreen() const
{
if (auto window = windowHandle(WindowHandleMode::Closest))
@@ -1419,9 +1435,9 @@ QWidget::~QWidget()
#ifndef QT_NO_ACTION
// remove all actions from this widget
- for (int i = 0; i < d->actions.size(); ++i) {
- QActionPrivate *apriv = d->actions.at(i)->d_func();
- apriv->widgets.removeAll(this);
+ for (auto action : qAsConst(d->actions)) {
+ QActionPrivate *apriv = action->d_func();
+ apriv->associatedObjects.removeAll(this);
}
d->actions.clear();
#endif
@@ -1506,13 +1522,8 @@ QWidget::~QWidget()
if (d->declarativeData) {
d->wasDeleted = true; // needed, so that destroying the declarative data does the right thing
- if (static_cast<QAbstractDeclarativeDataImpl*>(d->declarativeData)->ownedByQml1) {
- if (QAbstractDeclarativeData::destroyed_qml1)
- QAbstractDeclarativeData::destroyed_qml1(d->declarativeData, this);
- } else {
- if (QAbstractDeclarativeData::destroyed)
- QAbstractDeclarativeData::destroyed(d->declarativeData, this);
- }
+ if (QAbstractDeclarativeData::destroyed)
+ QAbstractDeclarativeData::destroyed(d->declarativeData, this);
d->declarativeData = nullptr; // don't activate again in ~QObject
d->wasDeleted = false;
}
@@ -3127,7 +3138,7 @@ void QWidget::insertAction(QAction *before, QAction *action)
d->actions.insert(pos, action);
QActionPrivate *apriv = action->d_func();
- apriv->widgets.append(this);
+ apriv->associatedObjects.append(this);
QActionEvent e(QEvent::ActionAdded, action, before);
QCoreApplication::sendEvent(this, &e);
@@ -3164,7 +3175,7 @@ void QWidget::removeAction(QAction *action)
Q_D(QWidget);
QActionPrivate *apriv = action->d_func();
- apriv->widgets.removeAll(this);
+ apriv->associatedObjects.removeAll(this);
if (d->actions.removeAll(action)) {
QActionEvent e(QEvent::ActionRemoved, action);
@@ -3185,13 +3196,6 @@ QList<QAction*> QWidget::actions() const
#endif // QT_NO_ACTION
/*!
- \fn bool QWidget::isEnabledToTLW() const
- \obsolete
-
- This function is deprecated. It is equivalent to isEnabled()
-*/
-
-/*!
\property QWidget::enabled
\brief whether the widget is enabled
@@ -4373,7 +4377,7 @@ void QWidget::setPalette(const QPalette &palette)
widget's palette are implicitly imposed on this widget by the user). Note
that this font does not take into account the palette set on \a w itself.
*/
-QPalette QWidgetPrivate::naturalWidgetPalette(uint inheritedMask) const
+QPalette QWidgetPrivate::naturalWidgetPalette(QPalette::ResolveMask inheritedMask) const
{
Q_Q(const QWidget);
@@ -4910,9 +4914,6 @@ void qt_qpa_set_cursor(QWidget *w, bool force)
\note To obtain the contents of a QOpenGLWidget, use QOpenGLWidget::grabFramebuffer()
instead.
-
- \note To obtain the contents of a QGLWidget (deprecated), use
- QGLWidget::grabFrameBuffer() or QGLWidget::renderPixmap() instead.
*/
void QWidget::render(QPaintDevice *target, const QPoint &targetOffset,
const QRegion &sourceRegion, RenderFlags renderFlags)
@@ -7414,29 +7415,6 @@ void QWidgetPrivate::updateContentsRect()
QCoreApplication::sendEvent(q, &e);
}
-#if QT_DEPRECATED_SINCE(5, 14)
-/*!
- \obsolete
- Use contentsMargins().
-
- Returns the widget's contents margins for \a left, \a top, \a
- right, and \a bottom.
-
- \sa setContentsMargins(), contentsRect()
- */
-void QWidget::getContentsMargins(int *left, int *top, int *right, int *bottom) const
-{
- QMargins m = contentsMargins();
- if (left)
- *left = m.left();
- if (top)
- *top = m.top();
- if (right)
- *right = m.right();
- if (bottom)
- *bottom = m.bottom();
-}
-#endif
// FIXME: Move to qmargins.h for next minor Qt release
QMargins operator|(const QMargins &m1, const QMargins &m2)
@@ -8996,7 +8974,7 @@ bool QWidget::event(QEvent *event)
}
}
break;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
case QEvent::ToolTip:
if (!d->toolTip.isEmpty())
QToolTip::showText(static_cast<QHelpEvent*>(event)->globalPos(), d->toolTip, this, QRect(), d->toolTipDuration);
@@ -10471,7 +10449,7 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f)
// (f & Qt::MSWindowsOwnDC) clause (which is set on QGLWidgets on all
// platforms).
if (newParent
-#if defined(QT_OPENGL_ES)
+#if QT_CONFIG(opengles2)
|| (f & Qt::MSWindowsOwnDC)
#endif
) {
@@ -11261,7 +11239,7 @@ void QWidgetPrivate::setWindowModified_helper()
}
}
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
/*!
\property QWidget::toolTip
@@ -11318,7 +11296,7 @@ int QWidget::toolTipDuration() const
return d->toolTipDuration;
}
-#endif // QT_NO_TOOLTIP
+#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(statustip)
diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h
index 415a738eb4..d13e273292 100644
--- a/src/widgets/kernel/qwidget.h
+++ b/src/widgets/kernel/qwidget.h
@@ -53,7 +53,9 @@
#include <QtGui/qregion.h>
#include <QtGui/qbrush.h>
#include <QtGui/qcursor.h>
-#include <QtGui/qkeysequence.h>
+#if QT_CONFIG(shortcut)
+# include <QtGui/qkeysequence.h>
+#endif
#ifdef QT_INCLUDE_COMPAT
#include <QtGui/qevent.h>
@@ -180,7 +182,7 @@ class Q_WIDGETS_EXPORT QWidget : public QObject, public QPaintDevice
Q_PROPERTY(QString windowIconText READ windowIconText WRITE setWindowIconText NOTIFY windowIconTextChanged) // deprecated
Q_PROPERTY(double windowOpacity READ windowOpacity WRITE setWindowOpacity)
Q_PROPERTY(bool windowModified READ isWindowModified WRITE setWindowModified)
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
Q_PROPERTY(QString toolTip READ toolTip WRITE setToolTip)
Q_PROPERTY(int toolTipDuration READ toolTipDuration WRITE setToolTipDuration)
#endif
@@ -236,10 +238,6 @@ public:
bool isEnabled() const;
bool isEnabledTo(const QWidget *) const;
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_DEPRECATED_X ("Use isEnabled() instead")
- bool isEnabledToTLW() const;
-#endif
public Q_SLOTS:
void setEnabled(bool);
@@ -384,7 +382,7 @@ public:
qreal windowOpacity() const;
bool isWindowModified() const;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
void setToolTip(const QString &);
QString toolTip() const;
void setToolTipDuration(int msec);
@@ -525,10 +523,6 @@ public:
void setContentsMargins(int left, int top, int right, int bottom);
void setContentsMargins(const QMargins &margins);
-#if QT_DEPRECATED_SINCE(5, 14)
- QT_DEPRECATED_X("use contentsMargins()")
- void getContentsMargins(int *left, int *top, int *right, int *bottom) const;
-#endif
QMargins contentsMargins() const;
QRect contentsRect() const;
@@ -713,9 +707,6 @@ private:
friend class QLayout;
friend class QWidgetItem;
friend class QWidgetItemV2;
- friend class QGLContext;
- friend class QGLWidget;
- friend class QGLWindowSurface;
friend class QX11PaintEngine;
friend class QWin32PaintEngine;
friend class QShortcutPrivate;
@@ -743,6 +734,7 @@ private:
private:
Q_DISABLE_COPY(QWidget)
Q_PRIVATE_SLOT(d_func(), void _q_showIfNotHidden())
+ Q_PRIVATE_SLOT(d_func(), QWindow *_q_closestWindowHandle())
QWidgetData *data;
};
@@ -782,11 +774,6 @@ inline bool QWidget::isEnabled() const
inline bool QWidget::isModal() const
{ return data->window_modality != Qt::NonModal; }
-#if QT_DEPRECATED_SINCE(5, 13)
-inline bool QWidget::isEnabledToTLW() const
-{ return isEnabled(); }
-#endif
-
inline int QWidget::minimumWidth() const
{ return minimumSize().width(); }
diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h
index 6aadfe13f7..3e52a6ad2f 100644
--- a/src/widgets/kernel/qwidget_p.h
+++ b/src/widgets/kernel/qwidget_p.h
@@ -269,6 +269,7 @@ public:
TopLevel
};
QWindow *windowHandle(WindowHandleMode mode = WindowHandleMode::Direct) const;
+ QWindow *_q_closestWindowHandle() const; // Private slot in QWidget
QScreen *associatedScreen() const;
@@ -298,7 +299,7 @@ public:
void setPalette_helper(const QPalette &);
void resolvePalette();
- QPalette naturalWidgetPalette(uint inheritedMask) const;
+ QPalette naturalWidgetPalette(QPalette::ResolveMask inheritedMask) const;
void setMask_sys(const QRegion &);
@@ -653,7 +654,7 @@ public:
// Implicit pointers (shared_null/shared_empty).
QRegion opaqueChildren;
QRegion dirty;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
QString toolTip;
int toolTipDuration;
#endif
@@ -672,7 +673,7 @@ public:
uint directFontResolveMask;
uint inheritedFontResolveMask;
decltype(std::declval<QPalette>().resolve()) directPaletteResolveMask;
- uint inheritedPaletteResolveMask;
+ QPalette::ResolveMask inheritedPaletteResolveMask;
short leftmargin;
short topmargin;
short rightmargin;
diff --git a/src/widgets/kernel/qwidgetaction.cpp b/src/widgets/kernel/qwidgetaction.cpp
index 9649e51b92..88e71fd800 100644
--- a/src/widgets/kernel/qwidgetaction.cpp
+++ b/src/widgets/kernel/qwidgetaction.cpp
@@ -38,9 +38,9 @@
****************************************************************************/
#include "qwidgetaction.h"
+#include "qwidget.h"
#include "qdebug.h"
-#ifndef QT_NO_ACTION
#include "qwidgetaction_p.h"
QT_BEGIN_NAMESPACE
@@ -282,5 +282,3 @@ QList<QWidget *> QWidgetAction::createdWidgets() const
QT_END_NAMESPACE
#include "moc_qwidgetaction.cpp"
-
-#endif // QT_NO_ACTION
diff --git a/src/widgets/kernel/qwidgetaction.h b/src/widgets/kernel/qwidgetaction.h
index 4769332a23..e3bfc62ca7 100644
--- a/src/widgets/kernel/qwidgetaction.h
+++ b/src/widgets/kernel/qwidgetaction.h
@@ -41,12 +41,11 @@
#define QWIDGETACTION_H
#include <QtWidgets/qtwidgetsglobal.h>
-#include <QtWidgets/qaction.h>
-
-QT_BEGIN_NAMESPACE
+#include <QtGui/qaction.h>
+QT_REQUIRE_CONFIG(action);
-#ifndef QT_NO_ACTION
+QT_BEGIN_NAMESPACE
class QWidgetActionPrivate;
@@ -78,8 +77,6 @@ private:
friend class QToolBar;
};
-#endif // QT_NO_ACTION
-
QT_END_NAMESPACE
#endif // QWIDGETACTION_H
diff --git a/src/widgets/kernel/qwidgetaction_p.h b/src/widgets/kernel/qwidgetaction_p.h
index 1fbcf236a1..4b118c45c5 100644
--- a/src/widgets/kernel/qwidgetaction_p.h
+++ b/src/widgets/kernel/qwidgetaction_p.h
@@ -52,11 +52,13 @@
//
#include <QtWidgets/private/qtwidgetsglobal_p.h>
-#include "private/qaction_p.h"
+#include "private/qaction_widgets_p.h"
+
+QT_REQUIRE_CONFIG(action);
QT_BEGIN_NAMESPACE
-class QWidgetActionPrivate : public QActionPrivate
+class QWidgetActionPrivate : public QtWidgetsActionPrivate
{
Q_DECLARE_PUBLIC(QWidgetAction)
public:
diff --git a/src/widgets/kernel/qwidgetsvariant.cpp b/src/widgets/kernel/qwidgetsvariant.cpp
index edb166e8d5..45a3bb3f7a 100644
--- a/src/widgets/kernel/qwidgetsvariant.cpp
+++ b/src/widgets/kernel/qwidgetsvariant.cpp
@@ -48,36 +48,6 @@
QT_BEGIN_NAMESPACE
namespace {
-static void construct(QVariant::Private *x, const void *copy)
-{
- switch (x->type) {
- case QMetaType::QSizePolicy:
- v_construct<QSizePolicy>(x, copy);
- break;
- default:
- qWarning("Trying to construct an instance of an invalid type, type id: %i", x->type);
- x->type = QMetaType::UnknownType;
- return;
- }
- x->is_null = !copy;
-}
-
-static void clear(QVariant::Private *d)
-{
- switch (d->type) {
- case QMetaType::QSizePolicy:
- v_clear<QSizePolicy>(d);
- break;
- default:
- Q_ASSERT(false);
- return;
- }
-
- d->type = QMetaType::UnknownType;
- d->is_null = true;
- d->is_shared = false;
-}
-
static bool isNull(const QVariant::Private *)
{
@@ -86,8 +56,8 @@ static bool isNull(const QVariant::Private *)
static bool compare(const QVariant::Private *a, const QVariant::Private *b)
{
- Q_ASSERT(a->type == b->type);
- switch(a->type) {
+ Q_ASSERT(a->type() == b->type());
+ switch (a->type().id()) {
case QMetaType::QSizePolicy:
return *v_cast<QSizePolicy>(a) == *v_cast<QSizePolicy>(b);
default:
@@ -110,19 +80,17 @@ static bool convert(const QVariant::Private *d, int type, void *result, bool *ok
static void streamDebug(QDebug dbg, const QVariant &v)
{
QVariant::Private *d = const_cast<QVariant::Private *>(&v.data_ptr());
- switch (d->type) {
+ switch (d->type().id()) {
case QMetaType::QSizePolicy:
dbg.nospace() << *v_cast<QSizePolicy>(d);
break;
default:
- dbg.nospace() << "QMetaType::Type(" << d->type << ')';
+ dbg.nospace() << "QMetaType::Type(" << d->type().id() << ')';
}
}
#endif
static const QVariant::Handler widgets_handler = {
- construct,
- clear,
isNull,
#ifndef QT_NO_DATASTREAM
nullptr,
@@ -138,23 +106,42 @@ static const QVariant::Handler widgets_handler = {
#endif
};
-#define QT_IMPL_METATYPEINTERFACE_WIDGETS_TYPES(MetaTypeName, MetaTypeId, RealName) \
- QT_METATYPE_INTERFACE_INIT(RealName),
+static const struct : QMetaTypeModuleHelper
+{
+ QtPrivate::QMetaTypeInterface *interfaceForType(int type) const override {
+ switch (type) {
+ QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_METATYPE_CONVERT_ID_TO_TYPE)
+ default: return nullptr;
+ }
+ }
+#ifndef QT_NO_DATASTREAM
+ bool save(QDataStream &stream, int type, const void *data) const override {
+ switch (type) {
+ QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_METATYPE_DATASTREAM_SAVE)
+ default: return false;
+ }
+ }
+ bool load(QDataStream &stream, int type, void *data) const override {
+ switch (type) {
+ QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_METATYPE_DATASTREAM_LOAD)
+ default: return false;
+ }
+ }
+#endif
+
+} qVariantWidgetsHelper;
-static const QMetaTypeInterface qVariantWidgetsHelper[] = {
- QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_IMPL_METATYPEINTERFACE_WIDGETS_TYPES)
-};
#undef QT_IMPL_METATYPEINTERFACE_WIDGETS_TYPES
} // namespace
-extern Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeWidgetsHelper;
+extern Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeWidgetsHelper;
void qRegisterWidgetsVariant()
{
qRegisterMetaType<QWidget*>();
- qMetaTypeWidgetsHelper = qVariantWidgetsHelper;
+ qMetaTypeWidgetsHelper = &qVariantWidgetsHelper;
QVariantPrivate::registerHandler(QModulesPrivate::Widgets, &widgets_handler);
}
Q_CONSTRUCTOR_FUNCTION(qRegisterWidgetsVariant)
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp
index 45ac6712b4..413ec2ca2c 100644
--- a/src/widgets/styles/qcommonstyle.cpp
+++ b/src/widgets/styles/qcommonstyle.cpp
@@ -2938,7 +2938,7 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt,
case SE_TabBarScrollLeftButton: {
const bool vertical = opt->rect.width() < opt->rect.height();
const Qt::LayoutDirection ld = widget->layoutDirection();
- const int buttonWidth = qMax(proxy()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, nullptr, widget), QApplication::globalStrut().width());
+ const int buttonWidth = proxy()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, nullptr, widget);
const int buttonOverlap = proxy()->pixelMetric(QStyle::PM_TabBar_ScrollButtonOverlap, nullptr, widget);
r = vertical ? QRect(0, opt->rect.height() - (buttonWidth * 2) + buttonOverlap, opt->rect.width(), buttonWidth)
@@ -2947,7 +2947,7 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt,
case SE_TabBarScrollRightButton: {
const bool vertical = opt->rect.width() < opt->rect.height();
const Qt::LayoutDirection ld = widget->layoutDirection();
- const int buttonWidth = qMax(proxy()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, nullptr, widget), QApplication::globalStrut().width());
+ const int buttonWidth = proxy()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, nullptr, widget);
r = vertical ? QRect(0, opt->rect.height() - buttonWidth, opt->rect.width(), buttonWidth)
: QStyle::visualRect(ld, opt->rect, QRect(opt->rect.width() - buttonWidth, 0, buttonWidth, opt->rect.height()));
@@ -4192,7 +4192,6 @@ QRect QCommonStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex
bs.setHeight(qMax(8, spinbox->rect.height()/2 - fw));
// 1.6 -approximate golden mean
bs.setWidth(qMax(16, qMin(bs.height() * 8 / 5, spinbox->rect.width() / 4)));
- bs = bs.expandedTo(QApplication::globalStrut());
int y = fw + spinbox->rect.y();
int x, lx, rx;
x = spinbox->rect.x() + spinbox->rect.width() - fw - bs.width();
@@ -4589,14 +4588,10 @@ int QCommonStyle::pixelMetric(PixelMetric m, const QStyleOption *opt, const QWid
#if QT_CONFIG(scrollbar)
case PM_ScrollBarExtent:
- if (const QStyleOptionSlider *sb = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- int s = sb->orientation == Qt::Horizontal ?
- QApplication::globalStrut().height()
- : QApplication::globalStrut().width();
- ret = qMax(16, s);
- } else {
+ if (qstyleoption_cast<const QStyleOptionSlider *>(opt))
+ ret = 16;
+ else
ret = int(QStyleHelper::dpiScaled(16, opt));
- }
break;
#endif
case PM_MaximumDragDistance:
@@ -4781,21 +4776,11 @@ int QCommonStyle::pixelMetric(PixelMetric m, const QStyleOption *opt, const QWid
} else if (widget) {
isWindow = widget->isWindow();
}
- ret = proxy()->pixelMetric(isWindow ? PM_DefaultTopLevelMargin : PM_DefaultChildMargin, opt);
+ ret = int(QStyleHelper::dpiScaled(isWindow ? 11 : 9, opt));
}
break;
case PM_LayoutHorizontalSpacing:
case PM_LayoutVerticalSpacing:
- ret = proxy()->pixelMetric(PM_DefaultLayoutSpacing, opt);
- break;
-
- case PM_DefaultTopLevelMargin:
- ret = int(QStyleHelper::dpiScaled(11, opt));
- break;
- case PM_DefaultChildMargin:
- ret = int(QStyleHelper::dpiScaled(9, opt));
- break;
- case PM_DefaultLayoutSpacing:
ret = int(QStyleHelper::dpiScaled(6, opt));
break;
@@ -5366,7 +5351,7 @@ int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget
case SH_Menu_SupportsSections:
ret = false;
break;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
case SH_ToolTip_WakeUpDelay:
ret = 700;
break;
diff --git a/src/widgets/styles/qfusionstyle.cpp b/src/widgets/styles/qfusionstyle.cpp
index f489ca9c03..b9abedd626 100644
--- a/src/widgets/styles/qfusionstyle.cpp
+++ b/src/widgets/styles/qfusionstyle.cpp
@@ -3192,7 +3192,7 @@ QSize QFusionStyle::sizeFromContents(ContentsType type, const QStyleOption *opti
break;
case CT_MenuItem:
if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
- int w = newSize.width();
+ int w = size.width(); // Don't rely of QCommonStyle's width calculation here
int maxpmw = menuItem->maxIconWidth;
int tabSpacing = 20;
if (menuItem->text.contains(QLatin1Char('\t')))
diff --git a/src/widgets/styles/qstyle.cpp b/src/widgets/styles/qstyle.cpp
index 1066bb48c9..1e698028fd 100644
--- a/src/widgets/styles/qstyle.cpp
+++ b/src/widgets/styles/qstyle.cpp
@@ -638,7 +638,6 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
indicator or button bevel.
\omitvalue PE_IndicatorViewItemCheck
- \value PE_FrameStatusBar Obsolete. Use PE_FrameStatusBarItem instead.
\value PE_PanelButtonCommand Button used to initiate an action, for
example, a QPushButton.
@@ -1040,8 +1039,6 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
\value SE_ProgressBarLabel Area for the text label.
\value SE_ProgressBarLayoutItem Area that counts for the parent layout.
- \omitvalue SE_ViewItemCheckIndicator
-
\value SE_FrameContents Area for a frame's contents.
\value SE_ShapedFrameContents Area for a frame's contents using the shape in QStyleOptionFrame; see QFrame
\value SE_FrameLayoutItem Area that counts for the parent layout.
@@ -1075,8 +1072,6 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
\value SE_TreeViewDisclosureItem Area for the actual disclosure item in a tree branch.
- \omitvalue SE_DialogButtonBoxLayoutItem
-
\value SE_GroupBoxLayoutItem Area that counts for the parent layout.
\value SE_CustomBase Base value for custom sub-elements.
@@ -1360,9 +1355,7 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
\value PM_SpinBoxFrameWidth Frame width of a spin box, defaults to PM_DefaultFrameWidth.
\value PM_ComboBoxFrameWidth Frame width of a combo box, defaults to PM_DefaultFrameWidth.
- \value PM_MDIFrameWidth Obsolete. Use PM_MdiSubWindowFrameWidth instead.
\value PM_MdiSubWindowFrameWidth Frame width of an MDI window.
- \value PM_MDIMinimizedWidth Obsolete. Use PM_MdiSubWindowMinimizedWidth instead.
\value PM_MdiSubWindowMinimizedWidth Width of a minimized MDI window.
\value PM_LayoutLeftMargin Default \l{QLayout::setContentsMargins()}{left margin} for a
@@ -1504,21 +1497,6 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
\value PM_CustomBase Base value for custom pixel metrics. Custom
values must be greater than this value.
- The following values are obsolete:
-
- \value PM_DefaultTopLevelMargin Use PM_LayoutLeftMargin,
- PM_LayoutTopMargin,
- PM_LayoutRightMargin, and
- PM_LayoutBottomMargin instead.
- \value PM_DefaultChildMargin Use PM_LayoutLeftMargin,
- PM_LayoutTopMargin,
- PM_LayoutRightMargin, and
- PM_LayoutBottomMargin instead.
- \value PM_DefaultLayoutSpacing Use PM_LayoutHorizontalSpacing
- and PM_LayoutVerticalSpacing
- instead.
-
-
\sa pixelMetric()
*/
@@ -1808,9 +1786,6 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
\value SH_TitleBar_NoBorder The title bar has no border.
- \value SH_ScrollBar_StopMouseOverSlider Obsolete. Use
- SH_Slider_StopMouseOverSlider instead.
-
\value SH_Slider_StopMouseOverSlider Stops auto-repeat when
the slider reaches the mouse position.
diff --git a/src/widgets/styles/qstyle.h b/src/widgets/styles/qstyle.h
index 5be1b4b290..ffbff494f5 100644
--- a/src/widgets/styles/qstyle.h
+++ b/src/widgets/styles/qstyle.h
@@ -142,9 +142,6 @@ public:
PE_FrameLineEdit,
PE_FrameMenu,
PE_FrameStatusBarItem,
-#if QT_DEPRECATED_SINCE(5, 13) // ### Qt 6: remove
- PE_FrameStatusBar Q_DECL_ENUMERATOR_DEPRECATED = PE_FrameStatusBarItem,
-#endif
PE_FrameTabWidget,
PE_FrameWindow,
PE_FrameButtonBevel,
@@ -165,9 +162,6 @@ public:
PE_IndicatorBranch,
PE_IndicatorButtonDropDown,
PE_IndicatorItemViewItemCheck,
-#if QT_DEPRECATED_SINCE(5, 13) // ### Qt 6: remove
- PE_IndicatorViewItemCheck Q_DECL_ENUMERATOR_DEPRECATED = PE_IndicatorItemViewItemCheck,
-#endif
PE_IndicatorCheckBox,
PE_IndicatorDockWidgetResizeHandle,
PE_IndicatorHeaderArrow,
@@ -313,9 +307,6 @@ public:
SE_TabWidgetRightCorner,
SE_ItemViewItemCheckIndicator,
-#if QT_DEPRECATED_SINCE(5, 13) // ### Qt 6: remove
- SE_ViewItemCheckIndicator Q_DECL_ENUMERATOR_DEPRECATED = SE_ItemViewItemCheckIndicator,
-#endif
SE_TabBarTearIndicator,
SE_TabBarTearIndicatorLeft = SE_TabBarTearIndicator,
@@ -332,10 +323,7 @@ public:
SE_CheckBoxLayoutItem,
SE_ComboBoxLayoutItem,
SE_DateTimeEditLayoutItem,
-#if QT_DEPRECATED_SINCE(5, 15) // ### Qt 6: remove
- SE_DialogButtonBoxLayoutItem Q_DECL_ENUMERATOR_DEPRECATED,
-#endif
- SE_LabelLayoutItem = SE_DateTimeEditLayoutItem + 2,
+ SE_LabelLayoutItem,
SE_ProgressBarLayoutItem,
SE_PushButtonLayoutItem,
SE_RadioButtonLayoutItem,
@@ -516,10 +504,6 @@ public:
PM_MdiSubWindowFrameWidth,
PM_MdiSubWindowMinimizedWidth,
-#if QT_DEPRECATED_SINCE(5, 13) // ### Qt 6: remove
- PM_MDIFrameWidth Q_DECL_ENUMERATOR_DEPRECATED = PM_MdiSubWindowFrameWidth,
- PM_MDIMinimizedWidth Q_DECL_ENUMERATOR_DEPRECATED = PM_MdiSubWindowMinimizedWidth,
-#endif
PM_HeaderMargin,
PM_HeaderMarkSize,
@@ -537,13 +521,7 @@ public:
PM_SpinBoxSliderHeight,
-#if QT_DEPRECATED_SINCE(5, 15) // ### Qt 6: remove
- PM_DefaultTopLevelMargin Q_DECL_ENUMERATOR_DEPRECATED,
- PM_DefaultChildMargin Q_DECL_ENUMERATOR_DEPRECATED,
- PM_DefaultLayoutSpacing Q_DECL_ENUMERATOR_DEPRECATED,
-#endif
-
- PM_ToolBarIconSize = PM_SpinBoxSliderHeight + 4,
+ PM_ToolBarIconSize,
PM_ListViewIconSize,
PM_IconViewIconSize,
PM_SmallIconSize,
@@ -662,9 +640,6 @@ public:
SH_ComboBox_Popup,
SH_TitleBar_NoBorder,
SH_Slider_StopMouseOverSlider,
-#if QT_DEPRECATED_SINCE(5, 13) // ### Qt 6: remove
- SH_ScrollBar_StopMouseOverSlider Q_DECL_ENUMERATOR_DEPRECATED = SH_Slider_StopMouseOverSlider,
-#endif
SH_BlinkCursorWhenTextSelected,
SH_RichText_FullWidthSelection,
SH_Menu_Scrollable,
diff --git a/src/widgets/styles/qstyleanimation.cpp b/src/widgets/styles/qstyleanimation.cpp
index b9202eae69..ce3b6ce34a 100644
--- a/src/widgets/styles/qstyleanimation.cpp
+++ b/src/widgets/styles/qstyleanimation.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -87,7 +87,7 @@ QTime QStyleAnimation::startTime() const
return _startTime;
}
-void QStyleAnimation::setStartTime(const QTime &time)
+void QStyleAnimation::setStartTime(QTime time)
{
_startTime = time;
}
@@ -266,7 +266,7 @@ static QImage blendedImage(const QImage &start, const QImage &end, float alpha)
const int ia = 256 - a;
const int sw = start.width();
const int sh = start.height();
- const int bpl = start.bytesPerLine();
+ const qsizetype bpl = start.bytesPerLine();
switch (start.depth()) {
case 32:
{
diff --git a/src/widgets/styles/qstyleanimation_p.h b/src/widgets/styles/qstyleanimation_p.h
index d28fc6ebab..0971289756 100644
--- a/src/widgets/styles/qstyleanimation_p.h
+++ b/src/widgets/styles/qstyleanimation_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -77,7 +77,7 @@ public:
void setDelay(int delay);
QTime startTime() const;
- void setStartTime(const QTime &time);
+ void setStartTime(QTime time);
enum FrameRate {
DefaultFps,
diff --git a/src/widgets/styles/qstyleoption.cpp b/src/widgets/styles/qstyleoption.cpp
index 95232dd97b..3d05392a8f 100644
--- a/src/widgets/styles/qstyleoption.cpp
+++ b/src/widgets/styles/qstyleoption.cpp
@@ -3763,7 +3763,7 @@ qreal QStyleOptionGraphicsItem::levelOfDetailFromTransform(const QTransform &wor
\brief the complete transformation matrix for the item
\obsolete
- The QMatrix provided through this member does include information about
+ The QTransform provided through this member does include information about
any perspective transformations applied to the view or item. To get the
correct transformation matrix, use QPainter::transform() on the painter
passed into the QGraphicsItem::paint() implementation.
@@ -3774,7 +3774,7 @@ qreal QStyleOptionGraphicsItem::levelOfDetailFromTransform(const QTransform &wor
item drawing.
To find the dimensions of an item in screen coordinates (i.e., pixels),
- you can use the mapping functions of QMatrix, such as QMatrix::map().
+ you can use the mapping functions of QTransform, such as QTransform::map().
This member is only initialized for items that have the
QGraphicsItem::ItemUsesExtendedStyleOption flag set.
diff --git a/src/widgets/styles/qstyleoption.h b/src/widgets/styles/qstyleoption.h
index a8ce3b465e..a93f0c7ca6 100644
--- a/src/widgets/styles/qstyleoption.h
+++ b/src/widgets/styles/qstyleoption.h
@@ -47,7 +47,7 @@
#include <QtWidgets/qabstractspinbox.h>
#endif
#include <QtGui/qicon.h>
-#include <QtGui/qmatrix.h>
+#include <QtGui/qtransform.h>
#if QT_CONFIG(slider)
#include <QtWidgets/qslider.h>
#endif
@@ -693,7 +693,7 @@ public:
enum StyleOptionVersion { Version = 1 };
QRectF exposedRect;
- QMatrix matrix;
+ QTransform matrix;
qreal levelOfDetail;
QStyleOptionGraphicsItem();
diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp
index b07abe4f51..a180fbf4fd 100644
--- a/src/widgets/styles/qstylesheetstyle.cpp
+++ b/src/widgets/styles/qstylesheetstyle.cpp
@@ -65,7 +65,9 @@
#include "private/qmath_p.h"
#include <qabstractscrollarea.h>
#include "private/qabstractscrollarea_p.h"
+#if QT_CONFIG(tooltip)
#include <qtooltip.h>
+#endif
#include <qshareddata.h>
#if QT_CONFIG(toolbutton)
#include <qtoolbutton.h>
@@ -987,7 +989,7 @@ QRenderRule::QRenderRule(const QVector<Declaration> &declarations, const QObject
int adj = -255;
hasFont = v.extractFont(&font, &adj);
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
if (object && qstrcmp(object->metaObject()->className(), "QTipLabel") == 0)
palette = QToolTip::palette();
#endif
@@ -1508,7 +1510,7 @@ public:
if (isNullNode(node))
return QStringList();
const QMetaObject *metaObject = OBJECT_PTR(node)->metaObject();
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
if (qstrcmp(metaObject->className(), "QTipLabel") == 0)
return QStringList(QLatin1String("QToolTip"));
#endif
@@ -1560,7 +1562,7 @@ public:
if (isNullNode(node))
return false;
const QMetaObject *metaObject = OBJECT_PTR(node)->metaObject();
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
if (qstrcmp(metaObject->className(), "QTipLabel") == 0)
return nodeName == QLatin1String("QToolTip");
#endif
@@ -1818,7 +1820,7 @@ QRenderRule QStyleSheetStyle::renderRule(const QObject *obj, int element, quint6
cacheIt = cache.constFind(state & stateMask);
if (cacheIt != cache.constEnd()) {
- const QRenderRule &newRule = cacheIt.value();
+ QRenderRule newRule = cacheIt.value();
cache[state] = newRule;
return newRule;
}
diff --git a/src/widgets/styles/qstylesheetstyle_p.h b/src/widgets/styles/qstylesheetstyle_p.h
index c5266558af..3c3503b964 100644
--- a/src/widgets/styles/qstylesheetstyle_p.h
+++ b/src/widgets/styles/qstylesheetstyle_p.h
@@ -194,7 +194,7 @@ public:
template <typename T>
struct Tampered {
T oldWidgetValue;
- uint resolveMask;
+ decltype(std::declval<T>().resolve()) resolveMask;
// only call this function on an rvalue *this (it mangles oldWidgetValue)
T reverted(T current)
@@ -214,7 +214,7 @@ public:
};
template <typename T>
class QTypeInfo<QStyleSheetStyleCaches::Tampered<T>>
- : QTypeInfoMerger<QStyleSheetStyleCaches::Tampered<T>, T> {};
+ : public QTypeInfoMerger<QStyleSheetStyleCaches::Tampered<T>, T> {};
// Returns a QStyleSheet from the given style.
diff --git a/src/widgets/styles/qwindowsstyle.cpp b/src/widgets/styles/qwindowsstyle.cpp
index e275e3a714..6c7ea3740e 100644
--- a/src/widgets/styles/qwindowsstyle.cpp
+++ b/src/widgets/styles/qwindowsstyle.cpp
@@ -481,7 +481,7 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, const QW
break;
case PM_SplitterWidth:
- ret = qMax(int(QStyleHelper::dpiScaled(4, opt)), QApplication::globalStrut().width());
+ ret = QStyleHelper::dpiScaled(4, opt);
break;
default:
diff --git a/src/widgets/util/qcompleter.cpp b/src/widgets/util/qcompleter.cpp
index 72fa557790..c02649f20c 100644
--- a/src/widgets/util/qcompleter.cpp
+++ b/src/widgets/util/qcompleter.cpp
@@ -757,7 +757,7 @@ int QUnsortedModelEngine::buildIndices(const QString& str, const QModelIndex& pa
case Qt::MatchExactly:
case Qt::MatchFixedString:
case Qt::MatchCaseSensitive:
- case Qt::MatchRegExp:
+ case Qt::MatchRegularExpression:
case Qt::MatchWildcard:
case Qt::MatchWrap:
case Qt::MatchRecursive:
diff --git a/src/widgets/util/qsystemtrayicon.cpp b/src/widgets/util/qsystemtrayicon.cpp
index ee52139913..e4ee5770f1 100644
--- a/src/widgets/util/qsystemtrayicon.cpp
+++ b/src/widgets/util/qsystemtrayicon.cpp
@@ -736,6 +736,7 @@ void QSystemTrayIconPrivate::addPlatformMenu(QMenu *menu) const
// be higher than 3 levels.
const auto actions = menu->actions();
for (QAction *action : actions) {
+ QVector<QWidget*> associatedWidgets = action->associatedWidgets();
if (action->menu())
addPlatformMenu(action->menu());
}
diff --git a/src/widgets/util/qsystemtrayicon_x11.cpp b/src/widgets/util/qsystemtrayicon_x11.cpp
index 86c11f98ed..da8752be08 100644
--- a/src/widgets/util/qsystemtrayicon_x11.cpp
+++ b/src/widgets/util/qsystemtrayicon_x11.cpp
@@ -308,7 +308,7 @@ void QSystemTrayIconPrivate::updateToolTip_sys()
}
if (!sys)
return;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
sys->setToolTip(toolTip);
#endif
}
diff --git a/src/widgets/util/qundogroup.cpp b/src/widgets/util/qundogroup.cpp
deleted file mode 100644
index ae439743bc..0000000000
--- a/src/widgets/util/qundogroup.cpp
+++ /dev/null
@@ -1,502 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qundogroup.h"
-#include "qundostack.h"
-#include "qundostack_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QUndoGroupPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QUndoGroup)
-public:
- QUndoGroupPrivate() : active(nullptr) {}
-
- QUndoStack *active;
- QList<QUndoStack*> stack_list;
-};
-
-/*!
- \class QUndoGroup
- \brief The QUndoGroup class is a group of QUndoStack objects.
- \since 4.2
- \inmodule QtWidgets
-
- For an overview of the Qt's undo framework, see the
- \l{qundo.html}{overview}.
-
- An application often has multiple undo stacks, one for each opened document. At the
- same time, an application usually has one undo action and one redo action, which
- triggers undo or redo in the active document.
-
- QUndoGroup is a group of QUndoStack objects, one of which may be active. It has
- an undo() and redo() slot, which calls QUndoStack::undo() and QUndoStack::redo()
- for the active stack. It also has the functions createUndoAction() and createRedoAction().
- The actions returned by these functions behave in the same way as those returned by
- QUndoStack::createUndoAction() and QUndoStack::createRedoAction() of the active
- stack.
-
- Stacks are added to a group with addStack() and removed with removeStack(). A stack
- is implicitly added to a group when it is created with the group as its parent
- QObject.
-
- It is the programmer's responsibility to specify which stack is active by
- calling QUndoStack::setActive(), usually when the associated document window receives focus.
- The active stack may also be set with setActiveStack(), and is returned by activeStack().
-
- When a stack is added to a group using addStack(), the group does not take ownership
- of the stack. This means the stack has to be deleted separately from the group. When
- a stack is deleted, it is automatically removed from a group. A stack may belong to
- only one group. Adding it to another group will cause it to be removed from the previous
- group.
-
- A QUndoGroup is also useful in conjunction with QUndoView. If a QUndoView is
- set to watch a group using QUndoView::setGroup(), it will update itself to display
- the active stack.
-*/
-
-/*!
- Creates an empty QUndoGroup object with parent \a parent.
-
- \sa addStack()
-*/
-
-QUndoGroup::QUndoGroup(QObject *parent)
- : QObject(*new QUndoGroupPrivate(), parent)
-{
-}
-
-/*!
- Destroys the QUndoGroup.
-*/
-QUndoGroup::~QUndoGroup()
-{
- // Ensure all QUndoStacks no longer refer to this group.
- Q_D(QUndoGroup);
- QList<QUndoStack *>::iterator it = d->stack_list.begin();
- QList<QUndoStack *>::iterator end = d->stack_list.end();
- while (it != end) {
- (*it)->d_func()->group = nullptr;
- ++it;
- }
-}
-
-/*!
- Adds \a stack to this group. The group does not take ownership of the stack. Another
- way of adding a stack to a group is by specifying the group as the stack's parent
- QObject in QUndoStack::QUndoStack(). In this case, the stack is deleted when the
- group is deleted, in the usual manner of QObjects.
-
- \sa removeStack(), stacks(), QUndoStack::QUndoStack()
-*/
-
-void QUndoGroup::addStack(QUndoStack *stack)
-{
- Q_D(QUndoGroup);
-
- if (d->stack_list.contains(stack))
- return;
- d->stack_list.append(stack);
-
- if (QUndoGroup *other = stack->d_func()->group)
- other->removeStack(stack);
- stack->d_func()->group = this;
-}
-
-/*!
- Removes \a stack from this group. If the stack was the active stack in the group,
- the active stack becomes 0.
-
- \sa addStack(), stacks(), QUndoStack::~QUndoStack()
-*/
-
-void QUndoGroup::removeStack(QUndoStack *stack)
-{
- Q_D(QUndoGroup);
-
- if (d->stack_list.removeAll(stack) == 0)
- return;
- if (stack == d->active)
- setActiveStack(nullptr);
- stack->d_func()->group = nullptr;
-}
-
-/*!
- Returns a list of stacks in this group.
-
- \sa addStack(), removeStack()
-*/
-
-QList<QUndoStack*> QUndoGroup::stacks() const
-{
- Q_D(const QUndoGroup);
- return d->stack_list;
-}
-
-/*!
- Sets the active stack of this group to \a stack.
-
- If the stack is not a member of this group, this function does nothing.
-
- Synonymous with calling QUndoStack::setActive() on \a stack.
-
- The actions returned by createUndoAction() and createRedoAction() will now behave
- in the same way as those returned by \a stack's QUndoStack::createUndoAction()
- and QUndoStack::createRedoAction().
-
- \sa QUndoStack::setActive(), activeStack()
-*/
-
-void QUndoGroup::setActiveStack(QUndoStack *stack)
-{
- Q_D(QUndoGroup);
- if (d->active == stack)
- return;
-
- if (d->active != nullptr) {
- disconnect(d->active, SIGNAL(canUndoChanged(bool)),
- this, SIGNAL(canUndoChanged(bool)));
- disconnect(d->active, SIGNAL(undoTextChanged(QString)),
- this, SIGNAL(undoTextChanged(QString)));
- disconnect(d->active, SIGNAL(canRedoChanged(bool)),
- this, SIGNAL(canRedoChanged(bool)));
- disconnect(d->active, SIGNAL(redoTextChanged(QString)),
- this, SIGNAL(redoTextChanged(QString)));
- disconnect(d->active, SIGNAL(indexChanged(int)),
- this, SIGNAL(indexChanged(int)));
- disconnect(d->active, SIGNAL(cleanChanged(bool)),
- this, SIGNAL(cleanChanged(bool)));
- }
-
- d->active = stack;
-
- if (d->active == nullptr) {
- emit canUndoChanged(false);
- emit undoTextChanged(QString());
- emit canRedoChanged(false);
- emit redoTextChanged(QString());
- emit cleanChanged(true);
- emit indexChanged(0);
- } else {
- connect(d->active, SIGNAL(canUndoChanged(bool)),
- this, SIGNAL(canUndoChanged(bool)));
- connect(d->active, SIGNAL(undoTextChanged(QString)),
- this, SIGNAL(undoTextChanged(QString)));
- connect(d->active, SIGNAL(canRedoChanged(bool)),
- this, SIGNAL(canRedoChanged(bool)));
- connect(d->active, SIGNAL(redoTextChanged(QString)),
- this, SIGNAL(redoTextChanged(QString)));
- connect(d->active, SIGNAL(indexChanged(int)),
- this, SIGNAL(indexChanged(int)));
- connect(d->active, SIGNAL(cleanChanged(bool)),
- this, SIGNAL(cleanChanged(bool)));
- emit canUndoChanged(d->active->canUndo());
- emit undoTextChanged(d->active->undoText());
- emit canRedoChanged(d->active->canRedo());
- emit redoTextChanged(d->active->redoText());
- emit cleanChanged(d->active->isClean());
- emit indexChanged(d->active->index());
- }
-
- emit activeStackChanged(d->active);
-}
-
-/*!
- Returns the active stack of this group.
-
- If none of the stacks are active, or if the group is empty, this function
- returns \nullptr.
-
- \sa setActiveStack(), QUndoStack::setActive()
-*/
-
-QUndoStack *QUndoGroup::activeStack() const
-{
- Q_D(const QUndoGroup);
- return d->active;
-}
-
-/*!
- Calls QUndoStack::undo() on the active stack.
-
- If none of the stacks are active, or if the group is empty, this function
- does nothing.
-
- \sa redo(), canUndo(), setActiveStack()
-*/
-
-void QUndoGroup::undo()
-{
- Q_D(QUndoGroup);
- if (d->active != nullptr)
- d->active->undo();
-}
-
-/*!
- Calls QUndoStack::redo() on the active stack.
-
- If none of the stacks are active, or if the group is empty, this function
- does nothing.
-
- \sa undo(), canRedo(), setActiveStack()
-*/
-
-
-void QUndoGroup::redo()
-{
- Q_D(QUndoGroup);
- if (d->active != nullptr)
- d->active->redo();
-}
-
-/*!
- Returns the value of the active stack's QUndoStack::canUndo().
-
- If none of the stacks are active, or if the group is empty, this function
- returns \c false.
-
- \sa canRedo(), setActiveStack()
-*/
-
-bool QUndoGroup::canUndo() const
-{
- Q_D(const QUndoGroup);
- return d->active != nullptr && d->active->canUndo();
-}
-
-/*!
- Returns the value of the active stack's QUndoStack::canRedo().
-
- If none of the stacks are active, or if the group is empty, this function
- returns \c false.
-
- \sa canUndo(), setActiveStack()
-*/
-
-bool QUndoGroup::canRedo() const
-{
- Q_D(const QUndoGroup);
- return d->active != nullptr && d->active->canRedo();
-}
-
-/*!
- Returns the value of the active stack's QUndoStack::undoText().
-
- If none of the stacks are active, or if the group is empty, this function
- returns an empty string.
-
- \sa redoText(), setActiveStack()
-*/
-
-QString QUndoGroup::undoText() const
-{
- Q_D(const QUndoGroup);
- return d->active == nullptr ? QString() : d->active->undoText();
-}
-
-/*!
- Returns the value of the active stack's QUndoStack::redoText().
-
- If none of the stacks are active, or if the group is empty, this function
- returns an empty string.
-
- \sa undoText(), setActiveStack()
-*/
-
-QString QUndoGroup::redoText() const
-{
- Q_D(const QUndoGroup);
- return d->active == nullptr ? QString() : d->active->redoText();
-}
-
-/*!
- Returns the value of the active stack's QUndoStack::isClean().
-
- If none of the stacks are active, or if the group is empty, this function
- returns \c true.
-
- \sa setActiveStack()
-*/
-
-bool QUndoGroup::isClean() const
-{
- Q_D(const QUndoGroup);
- return d->active == nullptr || d->active->isClean();
-}
-
-#ifndef QT_NO_ACTION
-
-/*!
- Creates an undo QAction object with parent \a parent.
-
- Triggering this action will cause a call to QUndoStack::undo() on the active stack.
- The text of this action will always be the text of the command which will be undone
- in the next call to undo(), prefixed by \a prefix. If there is no command available
- for undo, if the group is empty or if none of the stacks are active, this action will
- be disabled.
-
- If \a prefix is empty, the default template "Undo %1" is used instead of prefix.
- Before Qt 4.8, the prefix "Undo" was used by default.
-
- \sa createRedoAction(), canUndo(), QUndoCommand::text()
-*/
-
-QAction *QUndoGroup::createUndoAction(QObject *parent, const QString &prefix) const
-{
- QUndoAction *result = new QUndoAction(prefix, parent);
- if (prefix.isEmpty())
- result->setTextFormat(tr("Undo %1"), tr("Undo", "Default text for undo action"));
-
- result->setEnabled(canUndo());
- result->setPrefixedText(undoText());
- connect(this, SIGNAL(canUndoChanged(bool)),
- result, SLOT(setEnabled(bool)));
- connect(this, SIGNAL(undoTextChanged(QString)),
- result, SLOT(setPrefixedText(QString)));
- connect(result, SIGNAL(triggered()), this, SLOT(undo()));
- return result;
-}
-
-/*!
- Creates an redo QAction object with parent \a parent.
-
- Triggering this action will cause a call to QUndoStack::redo() on the active stack.
- The text of this action will always be the text of the command which will be redone
- in the next call to redo(), prefixed by \a prefix. If there is no command available
- for redo, if the group is empty or if none of the stacks are active, this action will
- be disabled.
-
- If \a prefix is empty, the default template "Redo %1" is used instead of prefix.
- Before Qt 4.8, the prefix "Redo" was used by default.
-
- \sa createUndoAction(), canRedo(), QUndoCommand::text()
-*/
-
-QAction *QUndoGroup::createRedoAction(QObject *parent, const QString &prefix) const
-{
- QUndoAction *result = new QUndoAction(prefix, parent);
- if (prefix.isEmpty())
- result->setTextFormat(tr("Redo %1"), tr("Redo", "Default text for redo action"));
-
- result->setEnabled(canRedo());
- result->setPrefixedText(redoText());
- connect(this, SIGNAL(canRedoChanged(bool)),
- result, SLOT(setEnabled(bool)));
- connect(this, SIGNAL(redoTextChanged(QString)),
- result, SLOT(setPrefixedText(QString)));
- connect(result, SIGNAL(triggered()), this, SLOT(redo()));
- return result;
-}
-
-#endif // QT_NO_ACTION
-
-/*! \fn void QUndoGroup::activeStackChanged(QUndoStack *stack)
-
- This signal is emitted whenever the active stack of the group changes. This can happen
- when setActiveStack() or QUndoStack::setActive() is called, or when the active stack
- is removed form the group. \a stack is the new active stack. If no stack is active,
- \a stack is 0.
-
- \sa setActiveStack(), QUndoStack::setActive()
-*/
-
-/*! \fn void QUndoGroup::indexChanged(int idx)
-
- This signal is emitted whenever the active stack emits QUndoStack::indexChanged()
- or the active stack changes.
-
- \a idx is the new current index, or 0 if the active stack is 0.
-
- \sa QUndoStack::indexChanged(), setActiveStack()
-*/
-
-/*! \fn void QUndoGroup::cleanChanged(bool clean)
-
- This signal is emitted whenever the active stack emits QUndoStack::cleanChanged()
- or the active stack changes.
-
- \a clean is the new state, or true if the active stack is 0.
-
- \sa QUndoStack::cleanChanged(), setActiveStack()
-*/
-
-/*! \fn void QUndoGroup::canUndoChanged(bool canUndo)
-
- This signal is emitted whenever the active stack emits QUndoStack::canUndoChanged()
- or the active stack changes.
-
- \a canUndo is the new state, or false if the active stack is 0.
-
- \sa QUndoStack::canUndoChanged(), setActiveStack()
-*/
-
-/*! \fn void QUndoGroup::canRedoChanged(bool canRedo)
-
- This signal is emitted whenever the active stack emits QUndoStack::canRedoChanged()
- or the active stack changes.
-
- \a canRedo is the new state, or false if the active stack is 0.
-
- \sa QUndoStack::canRedoChanged(), setActiveStack()
-*/
-
-/*! \fn void QUndoGroup::undoTextChanged(const QString &undoText)
-
- This signal is emitted whenever the active stack emits QUndoStack::undoTextChanged()
- or the active stack changes.
-
- \a undoText is the new state, or an empty string if the active stack is 0.
-
- \sa QUndoStack::undoTextChanged(), setActiveStack()
-*/
-
-/*! \fn void QUndoGroup::redoTextChanged(const QString &redoText)
-
- This signal is emitted whenever the active stack emits QUndoStack::redoTextChanged()
- or the active stack changes.
-
- \a redoText is the new state, or an empty string if the active stack is 0.
-
- \sa QUndoStack::redoTextChanged(), setActiveStack()
-*/
-
-QT_END_NAMESPACE
-
-#include "moc_qundogroup.cpp"
diff --git a/src/widgets/util/qundogroup.h b/src/widgets/util/qundogroup.h
deleted file mode 100644
index 1845f7e057..0000000000
--- a/src/widgets/util/qundogroup.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QUNDOGROUP_H
-#define QUNDOGROUP_H
-
-#include <QtWidgets/qtwidgetsglobal.h>
-#include <QtCore/qobject.h>
-#include <QtCore/qstring.h>
-
-QT_REQUIRE_CONFIG(undogroup);
-
-QT_BEGIN_NAMESPACE
-
-class QUndoGroupPrivate;
-class QUndoStack;
-class QAction;
-
-class Q_WIDGETS_EXPORT QUndoGroup : public QObject
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QUndoGroup)
-
-public:
- explicit QUndoGroup(QObject *parent = nullptr);
- ~QUndoGroup();
-
- void addStack(QUndoStack *stack);
- void removeStack(QUndoStack *stack);
- QList<QUndoStack*> stacks() const;
- QUndoStack *activeStack() const;
-
-#ifndef QT_NO_ACTION
- QAction *createUndoAction(QObject *parent,
- const QString &prefix = QString()) const;
- QAction *createRedoAction(QObject *parent,
- const QString &prefix = QString()) const;
-#endif // QT_NO_ACTION
- bool canUndo() const;
- bool canRedo() const;
- QString undoText() const;
- QString redoText() const;
- bool isClean() const;
-
-public Q_SLOTS:
- void undo();
- void redo();
- void setActiveStack(QUndoStack *stack);
-
-Q_SIGNALS:
- void activeStackChanged(QUndoStack *stack);
- void indexChanged(int idx);
- void cleanChanged(bool clean);
- void canUndoChanged(bool canUndo);
- void canRedoChanged(bool canRedo);
- void undoTextChanged(const QString &undoText);
- void redoTextChanged(const QString &redoText);
-
-private:
- Q_DISABLE_COPY(QUndoGroup)
-};
-
-QT_END_NAMESPACE
-
-#endif // QUNDOGROUP_H
diff --git a/src/widgets/util/qundostack.cpp b/src/widgets/util/qundostack.cpp
deleted file mode 100644
index f188b8298a..0000000000
--- a/src/widgets/util/qundostack.cpp
+++ /dev/null
@@ -1,1388 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qdebug.h>
-#include "qundostack.h"
-#if QT_CONFIG(undogroup)
-#include "qundogroup.h"
-#endif
-#include "qundostack_p.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QUndoCommand
- \brief The QUndoCommand class is the base class of all commands stored on a QUndoStack.
- \since 4.2
-
- \inmodule QtWidgets
-
- For an overview of Qt's Undo Framework, see the
- \l{Overview of Qt's Undo Framework}{overview document}.
-
- A QUndoCommand represents a single editing action on a document; for example,
- inserting or deleting a block of text in a text editor. QUndoCommand can apply
- a change to the document with redo() and undo the change with undo(). The
- implementations for these functions must be provided in a derived class.
-
- \snippet code/src_gui_util_qundostack.cpp 0
-
- A QUndoCommand has an associated text(). This is a short string
- describing what the command does. It is used to update the text
- properties of the stack's undo and redo actions; see
- QUndoStack::createUndoAction() and QUndoStack::createRedoAction().
-
- QUndoCommand objects are owned by the stack they were pushed on.
- QUndoStack deletes a command if it has been undone and a new command is pushed. For example:
-
-\snippet code/src_gui_util_qundostack.cpp 1
-
- In effect, when a command is pushed, it becomes the top-most command
- on the stack.
-
- To support command compression, QUndoCommand has an id() and the virtual function
- mergeWith(). These functions are used by QUndoStack::push().
-
- To support command macros, a QUndoCommand object can have any number of child
- commands. Undoing or redoing the parent command will cause the child
- commands to be undone or redone. A command can be assigned
- to a parent explicitly in the constructor. In this case, the command
- will be owned by the parent.
-
- The parent in this case is usually an empty command, in that it doesn't
- provide its own implementation of undo() and redo(). Instead, it uses
- the base implementations of these functions, which simply call undo() or
- redo() on all its children. The parent should, however, have a meaningful
- text().
-
- \snippet code/src_gui_util_qundostack.cpp 2
-
- Another way to create macros is to use the convenience functions
- QUndoStack::beginMacro() and QUndoStack::endMacro().
-
- \sa QUndoStack
-*/
-
-/*!
- Constructs a QUndoCommand object with the given \a parent and \a text.
-
- If \a parent is not \nullptr, this command is appended to parent's
- child list. The parent command then owns this command and will delete
- it in its destructor.
-
- \sa ~QUndoCommand()
-*/
-
-QUndoCommand::QUndoCommand(const QString &text, QUndoCommand *parent)
- : QUndoCommand(parent)
-{
- setText(text);
-}
-
-/*!
- Constructs a QUndoCommand object with parent \a parent.
-
- If \a parent is not \nullptr, this command is appended to parent's
- child list. The parent command then owns this command and will delete
- it in its destructor.
-
- \sa ~QUndoCommand()
-*/
-
-QUndoCommand::QUndoCommand(QUndoCommand *parent)
-{
- d = new QUndoCommandPrivate;
- if (parent != nullptr)
- parent->d->child_list.append(this);
-}
-
-/*!
- Destroys the QUndoCommand object and all child commands.
-
- \sa QUndoCommand()
-*/
-
-QUndoCommand::~QUndoCommand()
-{
- qDeleteAll(d->child_list);
- delete d;
-}
-
-/*!
- \since 5.9
-
- Returns whether the command is obsolete.
-
- The boolean is used for the automatic removal of commands that are not necessary in the
- stack anymore. The isObsolete function is checked in the functions QUndoStack::push(),
- QUndoStack::undo(), QUndoStack::redo(), and QUndoStack::setIndex().
-
- \sa setObsolete(), mergeWith(), QUndoStack::push(), QUndoStack::undo(), QUndoStack::redo()
-*/
-
-bool QUndoCommand::isObsolete() const
-{
- return d->obsolete;
-}
-
-/*!
- \since 5.9
-
- Sets whether the command is obsolete to \a obsolete.
-
- \sa isObsolete(), mergeWith(), QUndoStack::push(), QUndoStack::undo(), QUndoStack::redo()
-*/
-
-void QUndoCommand::setObsolete(bool obsolete)
-{
- d->obsolete = obsolete;
-}
-
-/*!
- Returns the ID of this command.
-
- A command ID is used in command compression. It must be an integer unique to
- this command's class, or -1 if the command doesn't support compression.
-
- If the command supports compression this function must be overridden in the
- derived class to return the correct ID. The base implementation returns -1.
-
- QUndoStack::push() will only try to merge two commands if they have the
- same ID, and the ID is not -1.
-
- \sa mergeWith(), QUndoStack::push()
-*/
-
-int QUndoCommand::id() const
-{
- return -1;
-}
-
-/*!
- Attempts to merge this command with \a command. Returns \c true on
- success; otherwise returns \c false.
-
- If this function returns \c true, calling this command's redo() must have the same
- effect as redoing both this command and \a command.
- Similarly, calling this command's undo() must have the same effect as undoing
- \a command and this command.
-
- QUndoStack will only try to merge two commands if they have the same id, and
- the id is not -1.
-
- The default implementation returns \c false.
-
- \snippet code/src_gui_util_qundostack.cpp 3
-
- \sa id(), QUndoStack::push()
-*/
-
-bool QUndoCommand::mergeWith(const QUndoCommand *command)
-{
- Q_UNUSED(command);
- return false;
-}
-
-/*!
- Applies a change to the document. This function must be implemented in
- the derived class. Calling QUndoStack::push(),
- QUndoStack::undo() or QUndoStack::redo() from this function leads to
- undefined beahavior.
-
- The default implementation calls redo() on all child commands.
-
- \sa undo()
-*/
-
-void QUndoCommand::redo()
-{
- for (int i = 0; i < d->child_list.size(); ++i)
- d->child_list.at(i)->redo();
-}
-
-/*!
- Reverts a change to the document. After undo() is called, the state of
- the document should be the same as before redo() was called. This function must
- be implemented in the derived class. Calling QUndoStack::push(),
- QUndoStack::undo() or QUndoStack::redo() from this function leads to
- undefined beahavior.
-
- The default implementation calls undo() on all child commands in reverse order.
-
- \sa redo()
-*/
-
-void QUndoCommand::undo()
-{
- for (int i = d->child_list.size() - 1; i >= 0; --i)
- d->child_list.at(i)->undo();
-}
-
-/*!
- Returns a short text string describing what this command does; for example,
- "insert text".
-
- The text is used for names of items in QUndoView.
-
- \sa actionText(), setText(), QUndoStack::createUndoAction(), QUndoStack::createRedoAction()
-*/
-
-QString QUndoCommand::text() const
-{
- return d->text;
-}
-
-/*!
- \since 4.8
-
- Returns a short text string describing what this command does; for example,
- "insert text".
-
- The text is used when the text properties of the stack's undo and redo
- actions are updated.
-
- \sa text(), setText(), QUndoStack::createUndoAction(), QUndoStack::createRedoAction()
-*/
-
-QString QUndoCommand::actionText() const
-{
- return d->actionText;
-}
-
-/*!
- Sets the command's text to be the \a text specified.
-
- The specified text should be a short user-readable string describing what this
- command does.
-
- If you need to have two different strings for text() and actionText(), separate
- them with "\\n" and pass into this function. Even if you do not use this feature
- for English strings during development, you can still let translators use two
- different strings in order to match specific languages' needs.
- The described feature and the function actionText() are available since Qt 4.8.
-
- \sa text(), actionText(), QUndoStack::createUndoAction(), QUndoStack::createRedoAction()
-*/
-
-void QUndoCommand::setText(const QString &text)
-{
- int cdpos = text.indexOf(QLatin1Char('\n'));
- if (cdpos > 0) {
- d->text = text.left(cdpos);
- d->actionText = text.mid(cdpos + 1);
- } else {
- d->text = text;
- d->actionText = text;
- }
-}
-
-/*!
- \since 4.4
-
- Returns the number of child commands in this command.
-
- \sa child()
-*/
-
-int QUndoCommand::childCount() const
-{
- return d->child_list.count();
-}
-
-/*!
- \since 4.4
-
- Returns the child command at \a index.
-
- \sa childCount(), QUndoStack::command()
-*/
-
-const QUndoCommand *QUndoCommand::child(int index) const
-{
- if (index < 0 || index >= d->child_list.count())
- return nullptr;
- return d->child_list.at(index);
-}
-
-#if QT_CONFIG(undostack)
-
-/*!
- \class QUndoStack
- \brief The QUndoStack class is a stack of QUndoCommand objects.
- \since 4.2
-
- \inmodule QtWidgets
-
- For an overview of Qt's Undo Framework, see the
- \l{Overview of Qt's Undo Framework}{overview document}.
-
- An undo stack maintains a stack of commands that have been applied to a
- document.
-
- New commands are pushed on the stack using push(). Commands can be
- undone and redone using undo() and redo(), or by triggering the
- actions returned by createUndoAction() and createRedoAction().
-
- QUndoStack keeps track of the \a current command. This is the command
- which will be executed by the next call to redo(). The index of this
- command is returned by index(). The state of the edited object can be
- rolled forward or back using setIndex(). If the top-most command on the
- stack has already been redone, index() is equal to count().
-
- QUndoStack provides support for undo and redo actions, command
- compression, command macros, and supports the concept of a
- \e{clean state}.
-
- \section1 Undo and Redo Actions
-
- QUndoStack provides convenient undo and redo QAction objects, which
- can be inserted into a menu or a toolbar. When commands are undone or
- redone, QUndoStack updates the text properties of these actions
- to reflect what change they will trigger. The actions are also disabled
- when no command is available for undo or redo. These actions
- are returned by QUndoStack::createUndoAction() and QUndoStack::createRedoAction().
-
- \section1 Command Compression and Macros
-
- Command compression is useful when several commands can be compressed
- into a single command that can be undone and redone in a single operation.
- For example, when a user types a character in a text editor, a new command
- is created. This command inserts the character into the document at the
- cursor position. However, it is more convenient for the user to be able
- to undo or redo typing of whole words, sentences, or paragraphs.
- Command compression allows these single-character commands to be merged
- into a single command which inserts or deletes sections of text.
- For more information, see QUndoCommand::mergeWith() and push().
-
- A command macro is a sequence of commands, all of which are undone and
- redone in one go. Command macros are created by giving a command a list
- of child commands.
- Undoing or redoing the parent command will cause the child commands to
- be undone or redone. Command macros may be created explicitly
- by specifying a parent in the QUndoCommand constructor, or by using the
- convenience functions beginMacro() and endMacro().
-
- Although command compression and macros appear to have the same effect to the
- user, they often have different uses in an application. Commands that
- perform small changes to a document may be usefully compressed if there is
- no need to individually record them, and if only larger changes are relevant
- to the user.
- However, for commands that need to be recorded individually, or those that
- cannot be compressed, it is useful to use macros to provide a more convenient
- user experience while maintaining a record of each command.
-
- \section1 Clean State
-
- QUndoStack supports the concept of a clean state. When the
- document is saved to disk, the stack can be marked as clean using
- setClean(). Whenever the stack returns to this state through undoing and
- redoing commands, it emits the signal cleanChanged(). This signal
- is also emitted when the stack leaves the clean state. This signal is
- usually used to enable and disable the save actions in the application,
- and to update the document's title to reflect that it contains unsaved
- changes.
-
- \section1 Obsolete Commands
-
- QUndoStack is able to delete commands from the stack if the command is no
- longer needed. One example may be to delete a command when two commands are
- merged together in such a way that the merged command has no function. This
- can be seen with move commands where the user moves their mouse to one part
- of the screen and then moves it to the original position. The merged command
- results in a mouse movement of 0. This command can be deleted since it serves
- no purpose. Another example is with networking commands that fail due to connection
- issues. In this case, the command is to be removed from the stack because the redo()
- and undo() functions have no function since there was connection issues.
-
- A command can be marked obsolete with the QUndoCommand::setObsolete() function.
- The QUndoCommand::isObsolete() flag is checked in QUndoStack::push(),
- QUndoStack::undo(), QUndoStack::redo(), and QUndoStack::setIndex() after calling
- QUndoCommand::undo(), QUndoCommand::redo() and QUndoCommand:mergeWith() where
- applicable.
-
- If a command is set obsolete and the clean index is greater than or equal to the
- current command index, then the clean index will be reset when the command is
- deleted from the stack.
-
- \sa QUndoCommand, QUndoView
-*/
-
-#ifndef QT_NO_ACTION
-
-QUndoAction::QUndoAction(const QString &prefix, QObject *parent)
- : QAction(parent)
-{
- m_prefix = prefix;
-}
-
-void QUndoAction::setPrefixedText(const QString &text)
-{
- if (m_defaultText.isEmpty()) {
- QString s = m_prefix;
- if (!m_prefix.isEmpty() && !text.isEmpty())
- s.append(QLatin1Char(' '));
- s.append(text);
- setText(s);
- } else {
- if (text.isEmpty())
- setText(m_defaultText);
- else
- setText(m_prefix.arg(text));
- }
-}
-
-void QUndoAction::setTextFormat(const QString &textFormat, const QString &defaultText)
-{
- m_prefix = textFormat;
- m_defaultText = defaultText;
-}
-
-#endif // QT_NO_ACTION
-
-/*! \internal
- Sets the current index to \a idx, emitting appropriate signals. If \a clean is true,
- makes \a idx the clean index as well.
-*/
-
-void QUndoStackPrivate::setIndex(int idx, bool clean)
-{
- Q_Q(QUndoStack);
-
- bool was_clean = index == clean_index;
-
- if (idx != index) {
- index = idx;
- emit q->indexChanged(index);
- emit q->canUndoChanged(q->canUndo());
- emit q->undoTextChanged(q->undoText());
- emit q->canRedoChanged(q->canRedo());
- emit q->redoTextChanged(q->redoText());
- }
-
- if (clean)
- clean_index = index;
-
- bool is_clean = index == clean_index;
- if (is_clean != was_clean)
- emit q->cleanChanged(is_clean);
-}
-
-/*! \internal
- If the number of commands on the stack exceedes the undo limit, deletes commands from
- the bottom of the stack.
-
- Returns \c true if commands were deleted.
-*/
-
-bool QUndoStackPrivate::checkUndoLimit()
-{
- if (undo_limit <= 0 || !macro_stack.isEmpty() || undo_limit >= command_list.count())
- return false;
-
- int del_count = command_list.count() - undo_limit;
-
- for (int i = 0; i < del_count; ++i)
- delete command_list.takeFirst();
-
- index -= del_count;
- if (clean_index != -1) {
- if (clean_index < del_count)
- clean_index = -1; // we've deleted the clean command
- else
- clean_index -= del_count;
- }
-
- return true;
-}
-
-/*!
- Constructs an empty undo stack with the parent \a parent. The
- stack will initially be in the clean state. If \a parent is a
- QUndoGroup object, the stack is automatically added to the group.
-
- \sa push()
-*/
-
-QUndoStack::QUndoStack(QObject *parent)
- : QObject(*(new QUndoStackPrivate), parent)
-{
-#if QT_CONFIG(undogroup)
- if (QUndoGroup *group = qobject_cast<QUndoGroup*>(parent))
- group->addStack(this);
-#endif
-}
-
-/*!
- Destroys the undo stack, deleting any commands that are on it. If the
- stack is in a QUndoGroup, the stack is automatically removed from the group.
-
- \sa QUndoStack()
-*/
-
-QUndoStack::~QUndoStack()
-{
-#if QT_CONFIG(undogroup)
- Q_D(QUndoStack);
- if (d->group != nullptr)
- d->group->removeStack(this);
-#endif
- clear();
-}
-
-/*!
- Clears the command stack by deleting all commands on it, and returns the stack
- to the clean state.
-
- Commands are not undone or redone; the state of the edited object remains
- unchanged.
-
- This function is usually used when the contents of the document are
- abandoned.
-
- \sa QUndoStack()
-*/
-
-void QUndoStack::clear()
-{
- Q_D(QUndoStack);
-
- if (d->command_list.isEmpty())
- return;
-
- bool was_clean = isClean();
-
- d->macro_stack.clear();
- qDeleteAll(d->command_list);
- d->command_list.clear();
-
- d->index = 0;
- d->clean_index = 0;
-
- emit indexChanged(0);
- emit canUndoChanged(false);
- emit undoTextChanged(QString());
- emit canRedoChanged(false);
- emit redoTextChanged(QString());
-
- if (!was_clean)
- emit cleanChanged(true);
-}
-
-/*!
- Pushes \a cmd on the stack or merges it with the most recently executed command.
- In either case, executes \a cmd by calling its redo() function.
-
- If \a cmd's id is not -1, and if the id is the same as that of the
- most recently executed command, QUndoStack will attempt to merge the two
- commands by calling QUndoCommand::mergeWith() on the most recently executed
- command. If QUndoCommand::mergeWith() returns \c true, \a cmd is deleted.
-
- After calling QUndoCommand::redo() and, if applicable, QUndoCommand::mergeWith(),
- QUndoCommand::isObsolete() will be called for \a cmd or the merged command.
- If QUndoCommand::isObsolete() returns \c true, then \a cmd or the merged command
- will be deleted from the stack.
-
- In all other cases \a cmd is simply pushed on the stack.
-
- If commands were undone before \a cmd was pushed, the current command and
- all commands above it are deleted. Hence \a cmd always ends up being the
- top-most on the stack.
-
- Once a command is pushed, the stack takes ownership of it. There
- are no getters to return the command, since modifying it after it has
- been executed will almost always lead to corruption of the document's
- state.
-
- \sa QUndoCommand::id(), QUndoCommand::mergeWith()
-*/
-
-void QUndoStack::push(QUndoCommand *cmd)
-{
- Q_D(QUndoStack);
- if (!cmd->isObsolete())
- cmd->redo();
-
- bool macro = !d->macro_stack.isEmpty();
-
- QUndoCommand *cur = nullptr;
- if (macro) {
- QUndoCommand *macro_cmd = d->macro_stack.constLast();
- if (!macro_cmd->d->child_list.isEmpty())
- cur = macro_cmd->d->child_list.constLast();
- } else {
- if (d->index > 0)
- cur = d->command_list.at(d->index - 1);
- while (d->index < d->command_list.size())
- delete d->command_list.takeLast();
- if (d->clean_index > d->index)
- d->clean_index = -1; // we've deleted the clean state
- }
-
- bool try_merge = cur != nullptr
- && cur->id() != -1
- && cur->id() == cmd->id()
- && (macro || d->index != d->clean_index);
-
- if (try_merge && cur->mergeWith(cmd)) {
- delete cmd;
-
- if (macro) {
- if (cur->isObsolete())
- delete d->macro_stack.constLast()->d->child_list.takeLast();
- } else {
- if (cur->isObsolete()) {
- delete d->command_list.takeLast();
-
- d->setIndex(d->index - 1, false);
- } else {
- emit indexChanged(d->index);
- emit canUndoChanged(canUndo());
- emit undoTextChanged(undoText());
- emit canRedoChanged(canRedo());
- emit redoTextChanged(redoText());
- }
- }
- } else if (cmd->isObsolete()) {
- delete cmd; // command should be deleted and NOT added to the stack
- } else {
- if (macro) {
- d->macro_stack.constLast()->d->child_list.append(cmd);
- } else {
- d->command_list.append(cmd);
- d->checkUndoLimit();
- d->setIndex(d->index + 1, false);
- }
- }
-}
-
-/*!
- Marks the stack as clean and emits cleanChanged() if the stack was
- not already clean.
-
- This is typically called when a document is saved, for example.
-
- Whenever the stack returns to this state through the use of undo/redo
- commands, it emits the signal cleanChanged(). This signal is also
- emitted when the stack leaves the clean state.
-
- \sa isClean(), resetClean(), cleanIndex()
-*/
-
-void QUndoStack::setClean()
-{
- Q_D(QUndoStack);
- if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
- qWarning("QUndoStack::setClean(): cannot set clean in the middle of a macro");
- return;
- }
-
- d->setIndex(d->index, true);
-}
-
-/*!
- \since 5.8
-
- Leaves the clean state and emits cleanChanged() if the stack was clean.
- This method resets the clean index to -1.
-
- This is typically called in the following cases, when a document has been:
- \list
- \li created basing on some template and has not been saved,
- so no filename has been associated with the document yet.
- \li restored from a backup file.
- \li changed outside of the editor and the user did not reload it.
- \endlist
-
- \sa isClean(), setClean(), cleanIndex()
-*/
-
-void QUndoStack::resetClean()
-{
- Q_D(QUndoStack);
- const bool was_clean = isClean();
- d->clean_index = -1;
- if (was_clean)
- emit cleanChanged(false);
-}
-
-/*!
- \since 5.12
- \property QUndoStack::clean
- \brief the clean status of this stack.
-
- This property indicates whether or not the stack is clean. For example, a
- stack is clean when a document has been saved.
-
- \sa isClean(), setClean(), resetClean(), cleanIndex()
-*/
-
-/*!
- If the stack is in the clean state, returns \c true; otherwise returns \c false.
-
- \sa setClean(), cleanIndex()
-*/
-
-bool QUndoStack::isClean() const
-{
- Q_D(const QUndoStack);
- if (!d->macro_stack.isEmpty())
- return false;
- return d->clean_index == d->index;
-}
-
-/*!
- Returns the clean index. This is the index at which setClean() was called.
-
- A stack may not have a clean index. This happens if a document is saved,
- some commands are undone, then a new command is pushed. Since
- push() deletes all the undone commands before pushing the new command, the stack
- can't return to the clean state again. In this case, this function returns -1.
- The -1 may also be returned after an explicit call to resetClean().
-
- \sa isClean(), setClean()
-*/
-
-int QUndoStack::cleanIndex() const
-{
- Q_D(const QUndoStack);
- return d->clean_index;
-}
-
-/*!
- Undoes the command below the current command by calling QUndoCommand::undo().
- Decrements the current command index.
-
- If the stack is empty, or if the bottom command on the stack has already been
- undone, this function does nothing.
-
- After the command is undone, if QUndoCommand::isObsolete() returns \c true,
- then the command will be deleted from the stack. Additionally, if the clean
- index is greater than or equal to the current command index, then the clean
- index is reset.
-
- \sa redo(), index()
-*/
-
-void QUndoStack::undo()
-{
- Q_D(QUndoStack);
- if (d->index == 0)
- return;
-
- if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
- qWarning("QUndoStack::undo(): cannot undo in the middle of a macro");
- return;
- }
-
- int idx = d->index - 1;
- QUndoCommand *cmd = d->command_list.at(idx);
-
- if (!cmd->isObsolete())
- cmd->undo();
-
- if (cmd->isObsolete()) { // A separate check is done b/c the undo command may set obsolete flag
- delete d->command_list.takeAt(idx);
-
- if (d->clean_index > idx)
- resetClean();
- }
-
- d->setIndex(idx, false);
-}
-
-/*!
- Redoes the current command by calling QUndoCommand::redo(). Increments the current
- command index.
-
- If the stack is empty, or if the top command on the stack has already been
- redone, this function does nothing.
-
- If QUndoCommand::isObsolete() returns true for the current command, then
- the command will be deleted from the stack. Additionally, if the clean
- index is greater than or equal to the current command index, then the clean
- index is reset.
-
- \sa undo(), index()
-*/
-
-void QUndoStack::redo()
-{
- Q_D(QUndoStack);
- if (d->index == d->command_list.size())
- return;
-
- if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
- qWarning("QUndoStack::redo(): cannot redo in the middle of a macro");
- return;
- }
-
- int idx = d->index;
- QUndoCommand *cmd = d->command_list.at(idx);
-
- if (!cmd->isObsolete())
- cmd->redo(); // A separate check is done b/c the undo command may set obsolete flag
-
- if (cmd->isObsolete()) {
- delete d->command_list.takeAt(idx);
-
- if (d->clean_index > idx)
- resetClean();
- } else {
- d->setIndex(d->index + 1, false);
- }
-}
-
-/*!
- Returns the number of commands on the stack. Macro commands are counted as
- one command.
-
- \sa index(), setIndex(), command()
-*/
-
-int QUndoStack::count() const
-{
- Q_D(const QUndoStack);
- return d->command_list.size();
-}
-
-/*!
- Returns the index of the current command. This is the command that will be
- executed on the next call to redo(). It is not always the top-most command
- on the stack, since a number of commands may have been undone.
-
- \sa undo(), redo(), count()
-*/
-
-int QUndoStack::index() const
-{
- Q_D(const QUndoStack);
- return d->index;
-}
-
-/*!
- Repeatedly calls undo() or redo() until the current command index reaches
- \a idx. This function can be used to roll the state of the document forwards
- of backwards. indexChanged() is emitted only once.
-
- \sa index(), count(), undo(), redo()
-*/
-
-void QUndoStack::setIndex(int idx)
-{
- Q_D(QUndoStack);
- if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
- qWarning("QUndoStack::setIndex(): cannot set index in the middle of a macro");
- return;
- }
-
- if (idx < 0)
- idx = 0;
- else if (idx > d->command_list.size())
- idx = d->command_list.size();
-
- int i = d->index;
- while (i < idx) {
- QUndoCommand *cmd = d->command_list.at(i);
-
- if (!cmd->isObsolete())
- cmd->redo(); // A separate check is done b/c the undo command may set obsolete flag
-
- if (cmd->isObsolete()) {
- delete d->command_list.takeAt(i);
-
- if (d->clean_index > i)
- resetClean();
-
- idx--; // Subtract from idx because we removed a command
- } else {
- i++;
- }
- }
-
- while (i > idx) {
- QUndoCommand *cmd = d->command_list.at(--i);
-
- cmd->undo();
- if (cmd->isObsolete()) {
- delete d->command_list.takeAt(i);
-
- if (d->clean_index > i)
- resetClean();
- }
- }
-
- d->setIndex(idx, false);
-}
-
-/*!
- \since 5.12
- \property QUndoStack::canUndo
- \brief whether this stack can undo.
-
- This property indicates whether or not there is a command that can be
- undone.
-
- \sa canUndo(), index(), canRedo()
-*/
-
-/*!
- Returns \c true if there is a command available for undo; otherwise returns \c false.
-
- This function returns \c false if the stack is empty, or if the bottom command
- on the stack has already been undone.
-
- Synonymous with index() == 0.
-
- \sa index(), canRedo()
-*/
-
-bool QUndoStack::canUndo() const
-{
- Q_D(const QUndoStack);
- if (!d->macro_stack.isEmpty())
- return false;
- return d->index > 0;
-}
-
-/*!
- \since 5.12
- \property QUndoStack::canRedo
- \brief whether this stack can redo.
-
- This property indicates whether or not there is a command that can be
- redone.
-
- \sa canRedo(), index(), canUndo()
-*/
-
-/*!
- Returns \c true if there is a command available for redo; otherwise returns \c false.
-
- This function returns \c false if the stack is empty or if the top command
- on the stack has already been redone.
-
- Synonymous with index() == count().
-
- \sa index(), canUndo()
-*/
-
-bool QUndoStack::canRedo() const
-{
- Q_D(const QUndoStack);
- if (!d->macro_stack.isEmpty())
- return false;
- return d->index < d->command_list.size();
-}
-
-/*!
- \since 5.12
- \property QUndoStack::undoText
- \brief the undo text of the next command that is undone.
-
- This property holds the text of the command which will be undone in the
- next call to undo().
-
- \sa undoText(), QUndoCommand::actionText(), redoText()
-*/
-
-/*!
- Returns the text of the command which will be undone in the next call to undo().
-
- \sa QUndoCommand::actionText(), redoText()
-*/
-
-QString QUndoStack::undoText() const
-{
- Q_D(const QUndoStack);
- if (!d->macro_stack.isEmpty())
- return QString();
- if (d->index > 0)
- return d->command_list.at(d->index - 1)->actionText();
- return QString();
-}
-
-/*!
- \since 5.12
- \property QUndoStack::redoText
- \brief the redo text of the next command that is redone.
-
- This property holds the text of the command which will be redone in the
- next call to redo().
-
- \sa redoText(), QUndoCommand::actionText(), undoText()
-*/
-
-/*!
- Returns the text of the command which will be redone in the next call to redo().
-
- \sa QUndoCommand::actionText(), undoText()
-*/
-
-QString QUndoStack::redoText() const
-{
- Q_D(const QUndoStack);
- if (!d->macro_stack.isEmpty())
- return QString();
- if (d->index < d->command_list.size())
- return d->command_list.at(d->index)->actionText();
- return QString();
-}
-
-#ifndef QT_NO_ACTION
-
-/*!
- Creates an undo QAction object with the given \a parent.
-
- Triggering this action will cause a call to undo(). The text of this action
- is the text of the command which will be undone in the next call to undo(),
- prefixed by the specified \a prefix. If there is no command available for undo,
- this action will be disabled.
-
- If \a prefix is empty, the default template "Undo %1" is used instead of prefix.
- Before Qt 4.8, the prefix "Undo" was used by default.
-
- \sa createRedoAction(), canUndo(), QUndoCommand::text()
-*/
-
-QAction *QUndoStack::createUndoAction(QObject *parent, const QString &prefix) const
-{
- QUndoAction *result = new QUndoAction(prefix, parent);
- if (prefix.isEmpty())
- result->setTextFormat(tr("Undo %1"), tr("Undo", "Default text for undo action"));
-
- result->setEnabled(canUndo());
- result->setPrefixedText(undoText());
- connect(this, SIGNAL(canUndoChanged(bool)),
- result, SLOT(setEnabled(bool)));
- connect(this, SIGNAL(undoTextChanged(QString)),
- result, SLOT(setPrefixedText(QString)));
- connect(result, SIGNAL(triggered()), this, SLOT(undo()));
- return result;
-}
-
-/*!
- Creates an redo QAction object with the given \a parent.
-
- Triggering this action will cause a call to redo(). The text of this action
- is the text of the command which will be redone in the next call to redo(),
- prefixed by the specified \a prefix. If there is no command available for redo,
- this action will be disabled.
-
- If \a prefix is empty, the default template "Redo %1" is used instead of prefix.
- Before Qt 4.8, the prefix "Redo" was used by default.
-
- \sa createUndoAction(), canRedo(), QUndoCommand::text()
-*/
-
-QAction *QUndoStack::createRedoAction(QObject *parent, const QString &prefix) const
-{
- QUndoAction *result = new QUndoAction(prefix, parent);
- if (prefix.isEmpty())
- result->setTextFormat(tr("Redo %1"), tr("Redo", "Default text for redo action"));
-
- result->setEnabled(canRedo());
- result->setPrefixedText(redoText());
- connect(this, SIGNAL(canRedoChanged(bool)),
- result, SLOT(setEnabled(bool)));
- connect(this, SIGNAL(redoTextChanged(QString)),
- result, SLOT(setPrefixedText(QString)));
- connect(result, SIGNAL(triggered()), this, SLOT(redo()));
- return result;
-}
-
-#endif // QT_NO_ACTION
-
-/*!
- Begins composition of a macro command with the given \a text description.
-
- An empty command described by the specified \a text is pushed on the stack.
- Any subsequent commands pushed on the stack will be appended to the empty
- command's children until endMacro() is called.
-
- Calls to beginMacro() and endMacro() may be nested, but every call to
- beginMacro() must have a matching call to endMacro().
-
- While a macro is being composed, the stack is disabled. This means that:
- \list
- \li indexChanged() and cleanChanged() are not emitted,
- \li canUndo() and canRedo() return false,
- \li calling undo() or redo() has no effect,
- \li the undo/redo actions are disabled.
- \endlist
-
- The stack becomes enabled and appropriate signals are emitted when endMacro()
- is called for the outermost macro.
-
- \snippet code/src_gui_util_qundostack.cpp 4
-
- This code is equivalent to:
-
- \snippet code/src_gui_util_qundostack.cpp 5
-
- \sa endMacro()
-*/
-
-void QUndoStack::beginMacro(const QString &text)
-{
- Q_D(QUndoStack);
- QUndoCommand *cmd = new QUndoCommand();
- cmd->setText(text);
-
- if (d->macro_stack.isEmpty()) {
- while (d->index < d->command_list.size())
- delete d->command_list.takeLast();
- if (d->clean_index > d->index)
- d->clean_index = -1; // we've deleted the clean state
- d->command_list.append(cmd);
- } else {
- d->macro_stack.constLast()->d->child_list.append(cmd);
- }
- d->macro_stack.append(cmd);
-
- if (d->macro_stack.count() == 1) {
- emit canUndoChanged(false);
- emit undoTextChanged(QString());
- emit canRedoChanged(false);
- emit redoTextChanged(QString());
- }
-}
-
-/*!
- Ends composition of a macro command.
-
- If this is the outermost macro in a set nested macros, this function emits
- indexChanged() once for the entire macro command.
-
- \sa beginMacro()
-*/
-
-void QUndoStack::endMacro()
-{
- Q_D(QUndoStack);
- if (Q_UNLIKELY(d->macro_stack.isEmpty())) {
- qWarning("QUndoStack::endMacro(): no matching beginMacro()");
- return;
- }
-
- d->macro_stack.removeLast();
-
- if (d->macro_stack.isEmpty()) {
- d->checkUndoLimit();
- d->setIndex(d->index + 1, false);
- }
-}
-
-/*!
- \since 4.4
-
- Returns a const pointer to the command at \a index.
-
- This function returns a const pointer, because modifying a command,
- once it has been pushed onto the stack and executed, almost always
- causes corruption of the state of the document, if the command is
- later undone or redone.
-
- \sa QUndoCommand::child()
-*/
-const QUndoCommand *QUndoStack::command(int index) const
-{
- Q_D(const QUndoStack);
-
- if (index < 0 || index >= d->command_list.count())
- return nullptr;
- return d->command_list.at(index);
-}
-
-/*!
- Returns the text of the command at index \a idx.
-
- \sa beginMacro()
-*/
-
-QString QUndoStack::text(int idx) const
-{
- Q_D(const QUndoStack);
-
- if (idx < 0 || idx >= d->command_list.size())
- return QString();
- return d->command_list.at(idx)->text();
-}
-
-/*!
- \property QUndoStack::undoLimit
- \brief the maximum number of commands on this stack.
- \since 4.3
-
- When the number of commands on a stack exceedes the stack's undoLimit, commands are
- deleted from the bottom of the stack. Macro commands (commands with child commands)
- are treated as one command. The default value is 0, which means that there is no
- limit.
-
- This property may only be set when the undo stack is empty, since setting it on a
- non-empty stack might delete the command at the current index. Calling setUndoLimit()
- on a non-empty stack prints a warning and does nothing.
-*/
-
-void QUndoStack::setUndoLimit(int limit)
-{
- Q_D(QUndoStack);
-
- if (Q_UNLIKELY(!d->command_list.isEmpty())) {
- qWarning("QUndoStack::setUndoLimit(): an undo limit can only be set when the stack is empty");
- return;
- }
-
- if (limit == d->undo_limit)
- return;
- d->undo_limit = limit;
- d->checkUndoLimit();
-}
-
-int QUndoStack::undoLimit() const
-{
- Q_D(const QUndoStack);
-
- return d->undo_limit;
-}
-
-/*!
- \property QUndoStack::active
- \brief the active status of this stack.
-
- An application often has multiple undo stacks, one for each opened document. The active
- stack is the one associated with the currently active document. If the stack belongs
- to a QUndoGroup, calls to QUndoGroup::undo() or QUndoGroup::redo() will be forwarded
- to this stack when it is active. If the QUndoGroup is watched by a QUndoView, the view
- will display the contents of this stack when it is active. If the stack does not belong to
- a QUndoGroup, making it active has no effect.
-
- It is the programmer's responsibility to specify which stack is active by
- calling setActive(), usually when the associated document window receives focus.
-
- \sa QUndoGroup
-*/
-
-void QUndoStack::setActive(bool active)
-{
-#if !QT_CONFIG(undogroup)
- Q_UNUSED(active);
-#else
- Q_D(QUndoStack);
-
- if (d->group != nullptr) {
- if (active)
- d->group->setActiveStack(this);
- else if (d->group->activeStack() == this)
- d->group->setActiveStack(nullptr);
- }
-#endif
-}
-
-bool QUndoStack::isActive() const
-{
-#if !QT_CONFIG(undogroup)
- return true;
-#else
- Q_D(const QUndoStack);
- return d->group == nullptr || d->group->activeStack() == this;
-#endif
-}
-
-/*!
- \fn void QUndoStack::indexChanged(int idx)
-
- This signal is emitted whenever a command modifies the state of the document.
- This happens when a command is undone or redone. When a macro
- command is undone or redone, or setIndex() is called, this signal
- is emitted only once.
-
- \a idx specifies the index of the current command, ie. the command which will be
- executed on the next call to redo().
-
- \sa index(), setIndex()
-*/
-
-/*!
- \fn void QUndoStack::cleanChanged(bool clean)
-
- This signal is emitted whenever the stack enters or leaves the clean state.
- If \a clean is true, the stack is in a clean state; otherwise this signal
- indicates that it has left the clean state.
-
- \sa isClean(), setClean()
-*/
-
-/*!
- \fn void QUndoStack::undoTextChanged(const QString &undoText)
-
- This signal is emitted whenever the value of undoText() changes. It is
- used to update the text property of the undo action returned by createUndoAction().
- \a undoText specifies the new text.
-*/
-
-/*!
- \fn void QUndoStack::canUndoChanged(bool canUndo)
-
- This signal is emitted whenever the value of canUndo() changes. It is
- used to enable or disable the undo action returned by createUndoAction().
- \a canUndo specifies the new value.
-*/
-
-/*!
- \fn void QUndoStack::redoTextChanged(const QString &redoText)
-
- This signal is emitted whenever the value of redoText() changes. It is
- used to update the text property of the redo action returned by createRedoAction().
- \a redoText specifies the new text.
-*/
-
-/*!
- \fn void QUndoStack::canRedoChanged(bool canRedo)
-
- This signal is emitted whenever the value of canRedo() changes. It is
- used to enable or disable the redo action returned by createRedoAction().
- \a canRedo specifies the new value.
-*/
-
-QT_END_NAMESPACE
-
-#include "moc_qundostack.cpp"
-#include "moc_qundostack_p.cpp"
-
-#endif // QT_CONFIG(undostack)
diff --git a/src/widgets/util/qundostack.h b/src/widgets/util/qundostack.h
deleted file mode 100644
index b5716b2e9b..0000000000
--- a/src/widgets/util/qundostack.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QUNDOSTACK_H
-#define QUNDOSTACK_H
-
-#include <QtWidgets/qtwidgetsglobal.h>
-#include <QtCore/qobject.h>
-#include <QtCore/qstring.h>
-
-QT_REQUIRE_CONFIG(undocommand);
-
-QT_BEGIN_NAMESPACE
-
-class QAction;
-class QUndoCommandPrivate;
-class QUndoStackPrivate;
-
-class Q_WIDGETS_EXPORT QUndoCommand
-{
- QUndoCommandPrivate *d;
-
-public:
- explicit QUndoCommand(QUndoCommand *parent = nullptr);
- explicit QUndoCommand(const QString &text, QUndoCommand *parent = nullptr);
- virtual ~QUndoCommand();
-
- virtual void undo();
- virtual void redo();
-
- QString text() const;
- QString actionText() const;
- void setText(const QString &text);
-
- bool isObsolete() const;
- void setObsolete(bool obsolete);
-
- virtual int id() const;
- virtual bool mergeWith(const QUndoCommand *other);
-
- int childCount() const;
- const QUndoCommand *child(int index) const;
-
-private:
- Q_DISABLE_COPY(QUndoCommand)
- friend class QUndoStack;
-};
-
-#if QT_CONFIG(undostack)
-
-class Q_WIDGETS_EXPORT QUndoStack : public QObject
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QUndoStack)
- Q_PROPERTY(bool active READ isActive WRITE setActive)
- Q_PROPERTY(int undoLimit READ undoLimit WRITE setUndoLimit)
- Q_PROPERTY(bool canUndo READ canUndo NOTIFY canUndoChanged)
- Q_PROPERTY(bool canRedo READ canRedo NOTIFY canRedoChanged)
- Q_PROPERTY(QString undoText READ undoText NOTIFY undoTextChanged)
- Q_PROPERTY(QString redoText READ redoText NOTIFY redoTextChanged)
- Q_PROPERTY(bool clean READ isClean NOTIFY cleanChanged)
-
-public:
- explicit QUndoStack(QObject *parent = nullptr);
- ~QUndoStack();
- void clear();
-
- void push(QUndoCommand *cmd);
-
- bool canUndo() const;
- bool canRedo() const;
- QString undoText() const;
- QString redoText() const;
-
- int count() const;
- int index() const;
- QString text(int idx) const;
-
-#ifndef QT_NO_ACTION
- QAction *createUndoAction(QObject *parent,
- const QString &prefix = QString()) const;
- QAction *createRedoAction(QObject *parent,
- const QString &prefix = QString()) const;
-#endif // QT_NO_ACTION
-
- bool isActive() const;
- bool isClean() const;
- int cleanIndex() const;
-
- void beginMacro(const QString &text);
- void endMacro();
-
- void setUndoLimit(int limit);
- int undoLimit() const;
-
- const QUndoCommand *command(int index) const;
-
-public Q_SLOTS:
- void setClean();
- void resetClean();
- void setIndex(int idx);
- void undo();
- void redo();
- void setActive(bool active = true);
-
-Q_SIGNALS:
- void indexChanged(int idx);
- void cleanChanged(bool clean);
- void canUndoChanged(bool canUndo);
- void canRedoChanged(bool canRedo);
- void undoTextChanged(const QString &undoText);
- void redoTextChanged(const QString &redoText);
-
-private:
- Q_DISABLE_COPY(QUndoStack)
- friend class QUndoGroup;
-};
-
-#endif // QT_CONFIG(undostack)
-
-QT_END_NAMESPACE
-
-#endif // QUNDOSTACK_H
diff --git a/src/widgets/util/qundostack_p.h b/src/widgets/util/qundostack_p.h
deleted file mode 100644
index 05c9e0d27e..0000000000
--- a/src/widgets/util/qundostack_p.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QUNDOSTACK_P_H
-#define QUNDOSTACK_P_H
-
-#include <QtWidgets/private/qtwidgetsglobal_p.h>
-#include <private/qobject_p.h>
-#include <QtCore/qlist.h>
-#include <QtCore/qstring.h>
-#include <QtWidgets/qaction.h>
-
-#include "qundostack.h"
-
-QT_BEGIN_NAMESPACE
-class QUndoCommand;
-class QUndoGroup;
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of qapplication_*.cpp, qwidget*.cpp and qfiledialog.cpp. This header
-// file may change from version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-class QUndoCommandPrivate
-{
-public:
- QUndoCommandPrivate() : id(-1), obsolete(false) {}
- QList<QUndoCommand*> child_list;
- QString text;
- QString actionText;
- int id;
- bool obsolete;
-};
-
-#if QT_CONFIG(undostack)
-
-class QUndoStackPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QUndoStack)
-public:
- QUndoStackPrivate() : index(0), clean_index(0), group(nullptr), undo_limit(0) {}
-
- QList<QUndoCommand*> command_list;
- QList<QUndoCommand*> macro_stack;
- int index;
- int clean_index;
- QUndoGroup *group;
- int undo_limit;
-
- void setIndex(int idx, bool clean);
- bool checkUndoLimit();
-};
-
-#ifndef QT_NO_ACTION
-class QUndoAction : public QAction
-{
- Q_OBJECT
-public:
- explicit QUndoAction(const QString &prefix, QObject *parent = nullptr);
- void setTextFormat(const QString &textFormat, const QString &defaultText);
-public Q_SLOTS:
- void setPrefixedText(const QString &text);
-private:
- QString m_prefix;
- QString m_defaultText;
-};
-#endif // QT_NO_ACTION
-
-QT_END_NAMESPACE
-#endif // QT_CONFIG(undostack)
-#endif // QUNDOSTACK_P_H
diff --git a/src/widgets/util/qundoview.cpp b/src/widgets/util/qundoview.cpp
index a39276a2b8..a823c005c1 100644
--- a/src/widgets/util/qundoview.cpp
+++ b/src/widgets/util/qundoview.cpp
@@ -37,12 +37,12 @@
**
****************************************************************************/
-#include "qundostack.h"
#include "qundoview.h"
#if QT_CONFIG(undogroup)
-#include "qundogroup.h"
+#include <QtGui/qundogroup.h>
#endif
+#include <QtGui/qundostack.h>
#include <QtCore/qabstractitemmodel.h>
#include <QtCore/qpointer.h>
#include <QtGui/qicon.h>
diff --git a/src/widgets/util/util.pri b/src/widgets/util/util.pri
index 363291528e..2819ac565a 100644
--- a/src/widgets/util/util.pri
+++ b/src/widgets/util/util.pri
@@ -31,19 +31,6 @@ qtConfig(scroller) {
util/qflickgesture.cpp \
}
-qtConfig(undocommand) {
- HEADERS += \
- util/qundostack.h \
- util/qundostack_p.h
-
- SOURCES += util/qundostack.cpp
-}
-
-qtConfig(undogroup) {
- HEADERS += util/qundogroup.h
- SOURCES += util/qundogroup.cpp
-}
-
qtConfig(undoview) {
HEADERS += util/qundoview.h
SOURCES += util/qundoview.cpp
diff --git a/src/widgets/widgets/qabstractbutton.cpp b/src/widgets/widgets/qabstractbutton.cpp
index a128b23950..c8121f6021 100644
--- a/src/widgets/widgets/qabstractbutton.cpp
+++ b/src/widgets/widgets/qabstractbutton.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -52,7 +52,6 @@
#include "qpainter.h"
#include "qapplication.h"
#include "qstyle.h"
-#include "qaction.h"
#ifndef QT_NO_ACCESSIBILITY
#include "qaccessible.h"
#endif
@@ -415,15 +414,7 @@ void QAbstractButtonPrivate::emitClicked()
emit q->clicked(checked);
#if QT_CONFIG(buttongroup)
if (guard && group) {
- const int id = group->id(q);
- emit group->idClicked(id);
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- if (guard && group)
- emit group->buttonClicked(id);
-QT_WARNING_POP
-#endif
+ emit group->idClicked(group->id(q));
if (guard && group)
emit group->buttonClicked(q);
}
@@ -437,15 +428,7 @@ void QAbstractButtonPrivate::emitPressed()
emit q->pressed();
#if QT_CONFIG(buttongroup)
if (guard && group) {
- const int id = group->id(q);
- emit group->idPressed(id);
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- if (guard && group)
- emit group->buttonPressed(id);
-QT_WARNING_POP
-#endif
+ emit group->idPressed(group->id(q));
if (guard && group)
emit group->buttonPressed(q);
}
@@ -459,15 +442,7 @@ void QAbstractButtonPrivate::emitReleased()
emit q->released();
#if QT_CONFIG(buttongroup)
if (guard && group) {
- const int id = group->id(q);
- emit group->idReleased(id);
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- if (guard && group)
- emit group->buttonReleased(id);
-QT_WARNING_POP
-#endif
+ emit group->idReleased(group->id(q));
if (guard && group)
emit group->buttonReleased(q);
}
@@ -481,15 +456,7 @@ void QAbstractButtonPrivate::emitToggled(bool checked)
emit q->toggled(checked);
#if QT_CONFIG(buttongroup)
if (guard && group) {
- const int id = group->id(q);
- emit group->idToggled(id, checked);
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- if (guard && group)
- emit group->buttonToggled(id, checked);
-QT_WARNING_POP
-#endif
+ emit group->idToggled(group->id(q), checked);
if (guard && group)
emit group->buttonToggled(q, checked);
}
diff --git a/src/widgets/widgets/qabstractbutton.h b/src/widgets/widgets/qabstractbutton.h
index 50c94654f3..d44da2f4f3 100644
--- a/src/widgets/widgets/qabstractbutton.h
+++ b/src/widgets/widgets/qabstractbutton.h
@@ -42,7 +42,9 @@
#include <QtWidgets/qtwidgetsglobal.h>
#include <QtGui/qicon.h>
-#include <QtGui/qkeysequence.h>
+#if QT_CONFIG(shortcut)
+# include <QtGui/qkeysequence.h>
+#endif
#include <QtWidgets/qwidget.h>
QT_REQUIRE_CONFIG(abstractbutton);
diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp
index 6bc88f129d..d69bd04141 100644
--- a/src/widgets/widgets/qabstractscrollarea.cpp
+++ b/src/widgets/widgets/qabstractscrollarea.cpp
@@ -1361,28 +1361,13 @@ void QAbstractScrollArea::scrollContentsBy(int, int)
viewport()->update();
}
-bool QAbstractScrollAreaPrivate::canStartScrollingAt( const QPoint &startPos )
+bool QAbstractScrollAreaPrivate::canStartScrollingAt(const QPoint &startPos) const
{
- Q_Q(QAbstractScrollArea);
-
-#if QT_CONFIG(graphicsview)
- // don't start scrolling when a drag mode has been set.
- // don't start scrolling on a movable item.
- if (QGraphicsView *view = qobject_cast<QGraphicsView *>(q)) {
- if (view->dragMode() != QGraphicsView::NoDrag)
- return false;
-
- QGraphicsItem *childItem = view->itemAt(startPos);
-
- if (childItem && (childItem->flags() & QGraphicsItem::ItemIsMovable))
- return false;
- }
-#endif
+ Q_Q(const QAbstractScrollArea);
// don't start scrolling on a QAbstractSlider
- if (qobject_cast<QAbstractSlider *>(q->viewport()->childAt(startPos))) {
+ if (qobject_cast<QAbstractSlider *>(q->viewport()->childAt(startPos)))
return false;
- }
return true;
}
diff --git a/src/widgets/widgets/qabstractscrollarea_p.h b/src/widgets/widgets/qabstractscrollarea_p.h
index 6d78b9db6d..5cba21c97c 100644
--- a/src/widgets/widgets/qabstractscrollarea_p.h
+++ b/src/widgets/widgets/qabstractscrollarea_p.h
@@ -94,9 +94,8 @@ public:
void init();
void layoutChildren();
void layoutChildren_helper(bool *needHorizontalScrollbar, bool *needVerticalScrollbar);
- // ### Fix for 4.4, talk to Bjoern E or Girish.
virtual void scrollBarPolicyChanged(Qt::Orientation, Qt::ScrollBarPolicy) {}
- bool canStartScrollingAt( const QPoint &startPos );
+ virtual bool canStartScrollingAt( const QPoint &startPos ) const;
void flashScrollBars();
void setScrollBarTransient(QScrollBar *scrollBar, bool transient);
diff --git a/src/widgets/widgets/qabstractspinbox.cpp b/src/widgets/widgets/qabstractspinbox.cpp
index 04176ab5e2..8f9e06eeb8 100644
--- a/src/widgets/widgets/qabstractspinbox.cpp
+++ b/src/widgets/widgets/qabstractspinbox.cpp
@@ -924,8 +924,7 @@ QSize QAbstractSpinBox::sizeHint() const
QStyleOptionSpinBox opt;
initStyleOption(&opt);
QSize hint(w, h);
- d->cachedSizeHint = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this)
- .expandedTo(QApplication::globalStrut());
+ d->cachedSizeHint = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this);
}
return d->cachedSizeHint;
}
@@ -966,8 +965,7 @@ QSize QAbstractSpinBox::minimumSizeHint() const
initStyleOption(&opt);
QSize hint(w, h);
- d->cachedMinimumSizeHint = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this)
- .expandedTo(QApplication::globalStrut());
+ d->cachedMinimumSizeHint = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this);
}
return d->cachedMinimumSizeHint;
}
diff --git a/src/widgets/widgets/qbuttongroup.cpp b/src/widgets/widgets/qbuttongroup.cpp
index 5b407fc0f0..8ed343177d 100644
--- a/src/widgets/widgets/qbuttongroup.cpp
+++ b/src/widgets/widgets/qbuttongroup.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -163,16 +163,6 @@ void QButtonGroup::setExclusive(bool exclusive)
*/
/*!
- \fn void QButtonGroup::buttonClicked(int id)
- \obsolete
-
- This signal is emitted when a button with the given \a id is
- clicked.
-
- \sa checkedButton(), QAbstractButton::clicked()
-*/
-
-/*!
\fn void QButtonGroup::idClicked(int id)
\since 5.15
@@ -192,17 +182,6 @@ void QButtonGroup::setExclusive(bool exclusive)
*/
/*!
- \fn void QButtonGroup::buttonPressed(int id)
- \since 4.2
- \obsolete
-
- This signal is emitted when a button with the given \a id is
- pressed down.
-
- \sa QAbstractButton::pressed()
-*/
-
-/*!
\fn void QButtonGroup::idPressed(int id)
\since 5.15
@@ -222,17 +201,6 @@ void QButtonGroup::setExclusive(bool exclusive)
*/
/*!
- \fn void QButtonGroup::buttonReleased(int id)
- \since 4.2
- \obsolete
-
- This signal is emitted when a button with the given \a id is
- released.
-
- \sa QAbstractButton::released()
-*/
-
-/*!
\fn void QButtonGroup::idReleased(int id)
\since 5.15
@@ -253,17 +221,6 @@ void QButtonGroup::setExclusive(bool exclusive)
*/
/*!
- \fn void QButtonGroup::buttonToggled(int id, bool checked)
- \since 5.2
- \obsolete
-
- This signal is emitted when a button with the given \a id is toggled.
- \a checked is true if the button is checked, or false if the button is unchecked.
-
- \sa QAbstractButton::toggled()
-*/
-
-/*!
\fn void QButtonGroup::idToggled(int id, bool checked)
\since 5.15
diff --git a/src/widgets/widgets/qbuttongroup.h b/src/widgets/widgets/qbuttongroup.h
index b2e507f31c..9154c34e33 100644
--- a/src/widgets/widgets/qbuttongroup.h
+++ b/src/widgets/widgets/qbuttongroup.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -85,16 +85,6 @@ Q_SIGNALS:
void idPressed(int);
void idReleased(int);
void idToggled(int, bool);
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_VERSION_X_5_15("Use QButtonGroup::idClicked(int) instead")
- void buttonClicked(int);
- QT_DEPRECATED_VERSION_X_5_15("Use QButtonGroup::idPressed(int) instead")
- void buttonPressed(int);
- QT_DEPRECATED_VERSION_X_5_15("Use QButtonGroup::idReleased(int) instead")
- void buttonReleased(int);
- QT_DEPRECATED_VERSION_X_5_15("Use QButtonGroup::idToggled(int, bool) instead")
- void buttonToggled(int, bool);
-#endif
private:
Q_DISABLE_COPY(QButtonGroup)
diff --git a/src/widgets/widgets/qcalendarwidget.cpp b/src/widgets/widgets/qcalendarwidget.cpp
index 570ec72377..e7dddef766 100644
--- a/src/widgets/widgets/qcalendarwidget.cpp
+++ b/src/widgets/widgets/qcalendarwidget.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -2311,7 +2311,7 @@ QSize QCalendarWidget::minimumSizeHint() const
Paints the cell specified by the given \a date, using the given \a painter and \a rect.
*/
-void QCalendarWidget::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const
+void QCalendarWidget::paintCell(QPainter *painter, QRect rect, QDate date) const
{
Q_D(const QCalendarWidget);
d->m_delegate->paintCell(painter, rect, date);
@@ -2334,7 +2334,7 @@ QDate QCalendarWidget::selectedDate() const
return d->m_model->m_date;
}
-void QCalendarWidget::setSelectedDate(const QDate &date)
+void QCalendarWidget::setSelectedDate(QDate date)
{
Q_D(QCalendarWidget);
if (d->m_model->m_date == date && date == d->getCurrentDate())
@@ -2543,7 +2543,7 @@ QDate QCalendarWidget::minimumDate() const
return d->m_model->m_minimumDate;
}
-void QCalendarWidget::setMinimumDate(const QDate &date)
+void QCalendarWidget::setMinimumDate(QDate date)
{
Q_D(QCalendarWidget);
if (!date.isValid() || d->m_model->m_minimumDate == date)
@@ -2594,7 +2594,7 @@ QDate QCalendarWidget::maximumDate() const
return d->m_model->m_maximumDate;
}
-void QCalendarWidget::setMaximumDate(const QDate &date)
+void QCalendarWidget::setMaximumDate(QDate date)
{
Q_D(QCalendarWidget);
if (!date.isValid() || d->m_model->m_maximumDate == date)
@@ -2632,7 +2632,7 @@ void QCalendarWidget::setMaximumDate(const QDate &date)
\sa setMinimumDate(), setMaximumDate()
*/
-void QCalendarWidget::setDateRange(const QDate &min, const QDate &max)
+void QCalendarWidget::setDateRange(QDate min, QDate max)
{
Q_D(QCalendarWidget);
if (d->m_model->m_minimumDate == min && d->m_model->m_maximumDate == max)
@@ -2900,7 +2900,7 @@ QMap<QDate, QTextCharFormat> QCalendarWidget::dateTextFormat() const
Returns a QTextCharFormat for \a date. The char format can be be
empty if the date is not renderd specially.
*/
-QTextCharFormat QCalendarWidget::dateTextFormat(const QDate &date) const
+QTextCharFormat QCalendarWidget::dateTextFormat(QDate date) const
{
Q_D(const QCalendarWidget);
return d->m_model->m_dateFormats.value(date);
@@ -2911,7 +2911,7 @@ QTextCharFormat QCalendarWidget::dateTextFormat(const QDate &date) const
If \a date is null, all date formats are cleared.
*/
-void QCalendarWidget::setDateTextFormat(const QDate &date, const QTextCharFormat &format)
+void QCalendarWidget::setDateTextFormat(QDate date, const QTextCharFormat &format)
{
Q_D(QCalendarWidget);
if (date.isNull())
@@ -2989,7 +2989,7 @@ void QCalendarWidget::setDateEditAcceptDelay(int delay)
\sa updateCells(), yearShown(), monthShown()
*/
-void QCalendarWidget::updateCell(const QDate &date)
+void QCalendarWidget::updateCell(QDate date)
{
if (Q_UNLIKELY(!date.isValid())) {
qWarning("QCalendarWidget::updateCell: Invalid date");
@@ -3048,7 +3048,7 @@ void QCalendarWidget::updateCells()
*/
/*!
- \fn void QCalendarWidget::activated(const QDate &date)
+ \fn void QCalendarWidget::activated(QDate date)
This signal is emitted whenever the user presses the Return or
Enter key or double-clicks a \a date in the calendar
@@ -3056,7 +3056,7 @@ void QCalendarWidget::updateCells()
*/
/*!
- \fn void QCalendarWidget::clicked(const QDate &date)
+ \fn void QCalendarWidget::clicked(QDate date)
This signal is emitted when a mouse button is clicked. The date
the mouse was clicked on is specified by \a date. The signal is
diff --git a/src/widgets/widgets/qcalendarwidget.h b/src/widgets/widgets/qcalendarwidget.h
index 08825a0ff3..70cf574a81 100644
--- a/src/widgets/widgets/qcalendarwidget.h
+++ b/src/widgets/widgets/qcalendarwidget.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -101,10 +101,10 @@ public:
int monthShown() const;
QDate minimumDate() const;
- void setMinimumDate(const QDate &date);
+ void setMinimumDate(QDate date);
QDate maximumDate() const;
- void setMaximumDate(const QDate &date);
+ void setMaximumDate(QDate date);
Qt::DayOfWeek firstDayOfWeek() const;
void setFirstDayOfWeek(Qt::DayOfWeek dayOfWeek);
@@ -131,8 +131,8 @@ public:
void setWeekdayTextFormat(Qt::DayOfWeek dayOfWeek, const QTextCharFormat &format);
QMap<QDate, QTextCharFormat> dateTextFormat() const;
- QTextCharFormat dateTextFormat(const QDate &date) const;
- void setDateTextFormat(const QDate &date, const QTextCharFormat &format);
+ QTextCharFormat dateTextFormat(QDate date) const;
+ void setDateTextFormat(QDate date, const QTextCharFormat &format);
bool isDateEditEnabled() const;
void setDateEditEnabled(bool enable);
@@ -147,13 +147,13 @@ protected:
void resizeEvent(QResizeEvent * event) override;
void keyPressEvent(QKeyEvent * event) override;
- virtual void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const;
- void updateCell(const QDate &date);
+ virtual void paintCell(QPainter *painter, QRect rect, QDate date) const;
+ void updateCell(QDate date);
void updateCells();
public Q_SLOTS:
- void setSelectedDate(const QDate &date);
- void setDateRange(const QDate &min, const QDate &max);
+ void setSelectedDate(QDate date);
+ void setDateRange(QDate min, QDate max);
void setCurrentPage(int year, int month);
void setGridVisible(bool show);
void setNavigationBarVisible(bool visible);
@@ -166,17 +166,17 @@ public Q_SLOTS:
Q_SIGNALS:
void selectionChanged();
- void clicked(const QDate &date);
- void activated(const QDate &date);
+ void clicked(QDate date);
+ void activated(QDate date);
void currentPageChanged(int year, int month);
private:
Q_DECLARE_PRIVATE(QCalendarWidget)
Q_DISABLE_COPY(QCalendarWidget)
- Q_PRIVATE_SLOT(d_func(), void _q_slotShowDate(const QDate &date))
- Q_PRIVATE_SLOT(d_func(), void _q_slotChangeDate(const QDate &date))
- Q_PRIVATE_SLOT(d_func(), void _q_slotChangeDate(const QDate &date, bool changeMonth))
+ Q_PRIVATE_SLOT(d_func(), void _q_slotShowDate(QDate date))
+ Q_PRIVATE_SLOT(d_func(), void _q_slotChangeDate(QDate date))
+ Q_PRIVATE_SLOT(d_func(), void _q_slotChangeDate(QDate date, bool changeMonth))
Q_PRIVATE_SLOT(d_func(), void _q_editingFinished())
Q_PRIVATE_SLOT(d_func(), void _q_prevMonthClicked())
Q_PRIVATE_SLOT(d_func(), void _q_nextMonthClicked())
diff --git a/src/widgets/widgets/qcheckbox.cpp b/src/widgets/widgets/qcheckbox.cpp
index 81bfd3af35..b06ae82249 100644
--- a/src/widgets/widgets/qcheckbox.cpp
+++ b/src/widgets/widgets/qcheckbox.cpp
@@ -292,8 +292,7 @@ QSize QCheckBox::sizeHint() const
text()).size();
if (!opt.icon.isNull())
sz = QSize(sz.width() + opt.iconSize.width() + 4, qMax(sz.height(), opt.iconSize.height()));
- d->sizeHint = (style()->sizeFromContents(QStyle::CT_CheckBox, &opt, sz, this)
- .expandedTo(QApplication::globalStrut()));
+ d->sizeHint = style()->sizeFromContents(QStyle::CT_CheckBox, &opt, sz, this);
return d->sizeHint;
}
diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp
index 607709d218..fd82384c03 100644
--- a/src/widgets/widgets/qcombobox.cpp
+++ b/src/widgets/widgets/qcombobox.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -450,7 +450,7 @@ QSize QComboBoxPrivate::recomputeSizeHint(QSize &sh) const
q->initStyleOption(&opt);
sh = q->style()->sizeFromContents(QStyle::CT_ComboBox, &opt, sh, q);
}
- return sh.expandedTo(QApplication::globalStrut());
+ return sh;
}
void QComboBoxPrivate::adjustComboBoxSize()
@@ -917,21 +917,9 @@ QStyleOptionComboBox QComboBoxPrivateContainer::comboStyleOption() const
when the choice is not changed. If you need to know when the
choice actually changes, use signal currentIndexChanged() or
currentTextChanged().
-
*/
/*!
- \fn void QComboBox::activated(const QString &text)
-
- This signal is sent when the user chooses an item in the combobox.
- The item's \a text is passed. Note that this signal is sent even
- when the choice is not changed. If you need to know when the
- choice actually changes, use signal currentIndexChanged() or
- currentTextChanged().
-
- \obsolete Use QComboBox::textActivated() instead
-*/
-/*!
\fn void QComboBox::textActivated(const QString &text)
\since 5.14
@@ -950,14 +938,6 @@ QStyleOptionComboBox QComboBoxPrivateContainer::comboStyleOption() const
*/
/*!
- \fn void QComboBox::highlighted(const QString &text)
-
- This signal is sent when an item in the combobox popup list is
- highlighted by the user. The item's \a text is passed.
-
- \obsolete Use textHighlighted() instead
-*/
-/*!
\fn void QComboBox::textHighlighted(const QString &text)
\since 5.14
@@ -976,18 +956,6 @@ QStyleOptionComboBox QComboBoxPrivateContainer::comboStyleOption() const
*/
/*!
- \fn void QComboBox::currentIndexChanged(const QString &text)
- \since 4.1
-
- This signal is sent whenever the currentIndex in the combobox
- changes either through user interaction or programmatically. The
- item's \a text is passed.
-
- \obsolete Use currentIndexChanged(int) and get the text from
- the itemText(int) method.
-*/
-
-/*!
\fn void QComboBox::currentTextChanged(const QString &text)
\since 5.0
@@ -1441,12 +1409,6 @@ void QComboBoxPrivate::emitActivated(const QModelIndex &index)
QString text(itemText(index));
emit q->activated(index.row());
emit q->textActivated(text);
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- emit q->activated(text);
-QT_WARNING_POP
-#endif
}
void QComboBoxPrivate::_q_emitHighlighted(const QModelIndex &index)
@@ -1457,12 +1419,6 @@ void QComboBoxPrivate::_q_emitHighlighted(const QModelIndex &index)
QString text(itemText(index));
emit q->highlighted(index.row());
emit q->textHighlighted(text);
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- emit q->highlighted(text);
-QT_WARNING_POP
-#endif
}
void QComboBoxPrivate::_q_emitCurrentIndexChanged(const QModelIndex &index)
@@ -1470,12 +1426,6 @@ void QComboBoxPrivate::_q_emitCurrentIndexChanged(const QModelIndex &index)
Q_Q(QComboBox);
const QString text = itemText(index);
emit q->currentIndexChanged(index.row());
-#if QT_DEPRECATED_SINCE(5, 13)
- QT_WARNING_PUSH
- QT_WARNING_DISABLE_DEPRECATED
- emit q->currentIndexChanged(text);
- QT_WARNING_POP
-#endif
// signal lineEdit.textChanged already connected to signal currentTextChanged, so don't emit double here
if (!lineEdit)
emit q->currentTextChanged(text);
@@ -2131,6 +2081,9 @@ QAbstractItemDelegate *QComboBox::itemDelegate() const
Sets the item \a delegate for the popup list view.
The combobox takes ownership of the delegate.
+ Any existing delegate will be removed, but not deleted. QComboBox
+ does not take ownership of \a delegate.
+
\warning You should not share the same instance of a delegate between comboboxes,
widget mappers or views. Doing so can cause incorrect or unintuitive editing behavior
since each view connected to a given delegate may receive the
@@ -2145,7 +2098,6 @@ void QComboBox::setItemDelegate(QAbstractItemDelegate *delegate)
qWarning("QComboBox::setItemDelegate: cannot set a 0 delegate");
return;
}
- delete view()->itemDelegate();
view()->setItemDelegate(delegate);
}
diff --git a/src/widgets/widgets/qcombobox.h b/src/widgets/widgets/qcombobox.h
index 4d7ca4b635..1411d64143 100644
--- a/src/widgets/widgets/qcombobox.h
+++ b/src/widgets/widgets/qcombobox.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -173,7 +173,7 @@ public:
void setItemDelegate(QAbstractItemDelegate *delegate);
QAbstractItemModel *model() const;
- void setModel(QAbstractItemModel *model);
+ virtual void setModel(QAbstractItemModel *model);
QModelIndex rootModelIndex() const;
void setRootModelIndex(const QModelIndex &index);
@@ -234,18 +234,7 @@ Q_SIGNALS:
void highlighted(int index);
void textHighlighted(const QString &);
void currentIndexChanged(int index);
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_VERSION_X_5_15(
- "Use currentIndexChanged(int) instead, and get the text using itemText(index)")
- void currentIndexChanged(const QString &);
-#endif
void currentTextChanged(const QString &);
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_VERSION_X(5, 15, "Use textActivated() instead")
- void activated(const QString &);
- QT_DEPRECATED_VERSION_X(5, 15, "Use textHighlighted() instead")
- void highlighted(const QString &);
-#endif
protected:
void focusInEvent(QFocusEvent *e) override;
diff --git a/src/widgets/widgets/qdatetimeedit.cpp b/src/widgets/widgets/qdatetimeedit.cpp
index d145985c1d..f1db87f414 100644
--- a/src/widgets/widgets/qdatetimeedit.cpp
+++ b/src/widgets/widgets/qdatetimeedit.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -53,6 +53,9 @@
#include <qlayout.h>
#include <qset.h>
#include <qstyle.h>
+#if QT_CONFIG(timezone)
+#include <QTimeZone>
+#endif
#include <algorithm>
@@ -130,14 +133,14 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn void QDateTimeEdit::timeChanged(const QTime &time)
+ \fn void QDateTimeEdit::timeChanged(QTime time)
This signal is emitted whenever the time is changed. The new time
is passed in \a time.
*/
/*!
- \fn void QDateTimeEdit::dateChanged(const QDate &date)
+ \fn void QDateTimeEdit::dateChanged(QDate date)
This signal is emitted whenever the date is changed. The new date
is passed in \a date.
@@ -168,13 +171,13 @@ QDateTimeEdit::QDateTimeEdit(const QDateTime &datetime, QWidget *parent)
}
/*!
- \fn QDateTimeEdit::QDateTimeEdit(const QDate &date, QWidget *parent)
+ \fn QDateTimeEdit::QDateTimeEdit(QDate date, QWidget *parent)
Constructs an empty date time editor with a \a parent.
The value is set to \a date.
*/
-QDateTimeEdit::QDateTimeEdit(const QDate &date, QWidget *parent)
+QDateTimeEdit::QDateTimeEdit(QDate date, QWidget *parent)
: QAbstractSpinBox(*new QDateTimeEditPrivate, parent)
{
Q_D(QDateTimeEdit);
@@ -182,13 +185,13 @@ QDateTimeEdit::QDateTimeEdit(const QDate &date, QWidget *parent)
}
/*!
- \fn QDateTimeEdit::QDateTimeEdit(const QTime &time, QWidget *parent)
+ \fn QDateTimeEdit::QDateTimeEdit(QTime time, QWidget *parent)
Constructs an empty date time editor with a \a parent.
The value is set to \a time.
*/
-QDateTimeEdit::QDateTimeEdit(const QTime &time, QWidget *parent)
+QDateTimeEdit::QDateTimeEdit(QTime time, QWidget *parent)
: QAbstractSpinBox(*new QDateTimeEditPrivate, parent)
{
Q_D(QDateTimeEdit);
@@ -226,8 +229,8 @@ QDateTimeEdit::~QDateTimeEdit()
\property QDateTimeEdit::dateTime
\brief The QDateTime that is set in the QDateTimeEdit.
- When setting this property the timespec of the QDateTimeEdit remains the same
- and the timespec of the new QDateTime is ignored.
+ When setting this property, the new QDateTime is converted to the timespec of
+ the QDateTimeEdit, which thus remains unchanged.
By default, this property is set to the start of 2000 CE. It can only be set
to a valid QDateTime value. If any operation causes this property to have an
@@ -251,11 +254,14 @@ void QDateTimeEdit::setDateTime(const QDateTime &datetime)
{
Q_D(QDateTimeEdit);
if (datetime.isValid()) {
+ QDateTime when = d->convertTimeSpec(datetime);
+ Q_ASSERT(when.timeSpec() == d->spec);
+
d->clearCache();
- const QDate date = datetime.date();
+ const QDate date = when.date();
if (!(d->sections & DateSections_Mask))
setDateRange(date, date);
- d->setValue(QDateTime(date, datetime.time(), d->spec), EmitIfChanged);
+ d->setValue(when, EmitIfChanged);
}
}
@@ -277,7 +283,7 @@ QDate QDateTimeEdit::date() const
return d->value.toDate();
}
-void QDateTimeEdit::setDate(const QDate &date)
+void QDateTimeEdit::setDate(QDate date)
{
Q_D(QDateTimeEdit);
if (date.isValid()) {
@@ -314,7 +320,7 @@ QTime QDateTimeEdit::time() const
return d->value.toTime();
}
-void QDateTimeEdit::setTime(const QTime &time)
+void QDateTimeEdit::setTime(QTime time)
{
Q_D(QDateTimeEdit);
if (time.isValid()) {
@@ -477,7 +483,7 @@ QDate QDateTimeEdit::minimumDate() const
return d->minimum.toDate();
}
-void QDateTimeEdit::setMinimumDate(const QDate &min)
+void QDateTimeEdit::setMinimumDate(QDate min)
{
Q_D(QDateTimeEdit);
if (min.isValid() && min >= QDATETIMEEDIT_DATE_MIN) {
@@ -517,7 +523,7 @@ QDate QDateTimeEdit::maximumDate() const
return d->maximum.toDate();
}
-void QDateTimeEdit::setMaximumDate(const QDate &max)
+void QDateTimeEdit::setMaximumDate(QDate max)
{
Q_D(QDateTimeEdit);
if (max.isValid())
@@ -554,7 +560,7 @@ QTime QDateTimeEdit::minimumTime() const
return d->minimum.toTime();
}
-void QDateTimeEdit::setMinimumTime(const QTime &min)
+void QDateTimeEdit::setMinimumTime(QTime min)
{
Q_D(QDateTimeEdit);
if (min.isValid()) {
@@ -592,7 +598,7 @@ QTime QDateTimeEdit::maximumTime() const
return d->maximum.toTime();
}
-void QDateTimeEdit::setMaximumTime(const QTime &max)
+void QDateTimeEdit::setMaximumTime(QTime max)
{
Q_D(QDateTimeEdit);
if (max.isValid()) {
@@ -628,7 +634,7 @@ void QDateTimeEdit::clearMaximumTime()
\sa minimumDate, maximumDate, setDateTimeRange(), QDate::isValid()
*/
-void QDateTimeEdit::setDateRange(const QDate &min, const QDate &max)
+void QDateTimeEdit::setDateRange(QDate min, QDate max)
{
Q_D(QDateTimeEdit);
if (min.isValid() && max.isValid()) {
@@ -662,7 +668,7 @@ void QDateTimeEdit::setDateRange(const QDate &min, const QDate &max)
\sa minimumTime, maximumTime, setDateTimeRange(), QTime::isValid()
*/
-void QDateTimeEdit::setTimeRange(const QTime &min, const QTime &max)
+void QDateTimeEdit::setTimeRange(QTime min, QTime max)
{
Q_D(QDateTimeEdit);
if (min.isValid() && max.isValid()) {
@@ -1045,8 +1051,7 @@ QSize QDateTimeEdit::sizeHint() const
{
QStyleOptionSpinBox opt;
initStyleOption(&opt);
- d->cachedSizeHint = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this)
- .expandedTo(QApplication::globalStrut());
+ d->cachedSizeHint = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this);
}
d->cachedMinimumSizeHint = d->cachedSizeHint;
@@ -1590,7 +1595,7 @@ QTimeEdit::QTimeEdit(QWidget *parent)
to \a time.
*/
-QTimeEdit::QTimeEdit(const QTime &time, QWidget *parent)
+QTimeEdit::QTimeEdit(QTime time, QWidget *parent)
: QDateTimeEdit(time, QMetaType::QTime, parent)
{
connect(this, &QTimeEdit::timeChanged, this, &QTimeEdit::userTimeChanged);
@@ -1610,7 +1615,7 @@ QTimeEdit::~QTimeEdit()
*/
/*!
- \fn void QTimeEdit::userTimeChanged(const QTime &time)
+ \fn void QTimeEdit::userTimeChanged(QTime time)
This signal only exists to fully implement the time Q_PROPERTY on the class.
Normally timeChanged should be used instead.
@@ -1660,7 +1665,7 @@ QDateEdit::QDateEdit(QWidget *parent)
to \a date.
*/
-QDateEdit::QDateEdit(const QDate &date, QWidget *parent)
+QDateEdit::QDateEdit(QDate date, QWidget *parent)
: QDateTimeEdit(date, QMetaType::QDate, parent)
{
connect(this, &QDateEdit::dateChanged, this, &QDateEdit::userDateChanged);
@@ -1680,7 +1685,7 @@ QDateEdit::~QDateEdit()
*/
/*!
- \fn void QDateEdit::userDateChanged(const QDate &date)
+ \fn void QDateEdit::userDateChanged(QDate date)
This signal only exists to fully implement the date Q_PROPERTY on the class.
Normally dateChanged should be used instead.
@@ -1722,6 +1727,25 @@ QDateTimeEditPrivate::QDateTimeEditPrivate()
#endif
}
+QDateTime QDateTimeEditPrivate::convertTimeSpec(const QDateTime &datetime)
+{
+ Q_ASSERT(value.toDateTime().timeSpec() == spec);
+ switch (spec) {
+ case Qt::UTC:
+ return datetime.toUTC();
+ case Qt::LocalTime:
+ return datetime.toLocalTime();
+ case Qt::OffsetFromUTC:
+ return datetime.toOffsetFromUtc(value.toDateTime().offsetFromUtc());
+#if QT_CONFIG(timezone)
+ case Qt::TimeZone:
+ return datetime.toTimeZone(value.toDateTime().timeZone());
+#endif
+ }
+ Q_UNREACHABLE();
+}
+
+// FIXME: architecturaly incompatible with OffsetFromUTC or TimeZone as spec (QTBUG-80417).
void QDateTimeEditPrivate::updateTimeSpec()
{
minimum = minimum.toDateTime().toTimeSpec(spec);
@@ -2364,33 +2388,6 @@ void QDateTimeEdit::paintEvent(QPaintEvent *event)
style()->drawComplexControl(QStyle::CC_ComboBox, &optCombo, &p, this);
}
-/*
- Returns the string for AM and PM markers.
-
- If a translation for "AM" and "PM" is installed, then use that.
- Otherwise, use the default implementation, which uses the locale.
-*/
-QString QDateTimeEditPrivate::getAmPmText(AmPm ap, Case cs) const
-{
- QString original;
- QString translated;
- if (ap == AmText) {
- original = QLatin1String(cs == UpperCase ? "AM" : "am");
- translated = (cs == UpperCase ? QDateTimeParser::tr("AM") : QDateTimeParser::tr("am"));
- } else {
- original = QLatin1String(cs == UpperCase ? "PM" : "pm");
- translated = (cs == UpperCase ? QDateTimeParser::tr("PM") : QDateTimeParser::tr("pm"));
- }
-
- // This logic fails if a translation exists but doesn't change the string,
- // which we can accept as a corner-case for which a locale-derived answer
- // will be acceptable.
- if (original != translated)
- return translated;
-
- return QDateTimeParser::getAmPmText(ap, cs);
-}
-
int QDateTimeEditPrivate::absoluteIndex(QDateTimeEdit::Section s, int index) const
{
for (int i=0; i<sectionNodes.size(); ++i) {
diff --git a/src/widgets/widgets/qdatetimeedit.h b/src/widgets/widgets/qdatetimeedit.h
index 8905ad4a9c..aafdee1ea8 100644
--- a/src/widgets/widgets/qdatetimeedit.h
+++ b/src/widgets/widgets/qdatetimeedit.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -95,8 +95,8 @@ public:
explicit QDateTimeEdit(QWidget *parent = nullptr);
explicit QDateTimeEdit(const QDateTime &dt, QWidget *parent = nullptr);
- explicit QDateTimeEdit(const QDate &d, QWidget *parent = nullptr);
- explicit QDateTimeEdit(const QTime &t, QWidget *parent = nullptr);
+ explicit QDateTimeEdit(QDate d, QWidget *parent = nullptr);
+ explicit QDateTimeEdit(QTime t, QWidget *parent = nullptr);
~QDateTimeEdit();
QDateTime dateTime() const;
@@ -117,24 +117,24 @@ public:
void setDateTimeRange(const QDateTime &min, const QDateTime &max);
QDate minimumDate() const;
- void setMinimumDate(const QDate &min);
+ void setMinimumDate(QDate min);
void clearMinimumDate();
QDate maximumDate() const;
- void setMaximumDate(const QDate &max);
+ void setMaximumDate(QDate max);
void clearMaximumDate();
- void setDateRange(const QDate &min, const QDate &max);
+ void setDateRange(QDate min, QDate max);
QTime minimumTime() const;
- void setMinimumTime(const QTime &min);
+ void setMinimumTime(QTime min);
void clearMinimumTime();
QTime maximumTime() const;
- void setMaximumTime(const QTime &max);
+ void setMaximumTime(QTime max);
void clearMaximumTime();
- void setTimeRange(const QTime &min, const QTime &max);
+ void setTimeRange(QTime min, QTime max);
Sections displayedSections() const;
Section currentSection() const;
@@ -170,13 +170,13 @@ public:
bool event(QEvent *event) override;
Q_SIGNALS:
void dateTimeChanged(const QDateTime &dateTime);
- void timeChanged(const QTime &time);
- void dateChanged(const QDate &date);
+ void timeChanged(QTime time);
+ void dateChanged(QDate date);
public Q_SLOTS:
void setDateTime(const QDateTime &dateTime);
- void setDate(const QDate &date);
- void setTime(const QTime &time);
+ void setDate(QDate date);
+ void setTime(QTime time);
protected:
void keyPressEvent(QKeyEvent *event) override;
@@ -212,11 +212,11 @@ class Q_WIDGETS_EXPORT QTimeEdit : public QDateTimeEdit
Q_PROPERTY(QTime time READ time WRITE setTime NOTIFY userTimeChanged USER true)
public:
explicit QTimeEdit(QWidget *parent = nullptr);
- explicit QTimeEdit(const QTime &time, QWidget *parent = nullptr);
+ explicit QTimeEdit(QTime time, QWidget *parent = nullptr);
~QTimeEdit();
Q_SIGNALS:
- void userTimeChanged(const QTime &time);
+ void userTimeChanged(QTime time);
};
class Q_WIDGETS_EXPORT QDateEdit : public QDateTimeEdit
@@ -225,11 +225,11 @@ class Q_WIDGETS_EXPORT QDateEdit : public QDateTimeEdit
Q_PROPERTY(QDate date READ date WRITE setDate NOTIFY userDateChanged USER true)
public:
explicit QDateEdit(QWidget *parent = nullptr);
- explicit QDateEdit(const QDate &date, QWidget *parent = nullptr);
+ explicit QDateEdit(QDate date, QWidget *parent = nullptr);
~QDateEdit();
Q_SIGNALS:
- void userDateChanged(const QDate &date);
+ void userDateChanged(QDate date);
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimeEdit::Sections)
diff --git a/src/widgets/widgets/qdatetimeedit_p.h b/src/widgets/widgets/qdatetimeedit_p.h
index 323246a87b..ac9bd4401a 100644
--- a/src/widgets/widgets/qdatetimeedit_p.h
+++ b/src/widgets/widgets/qdatetimeedit_p.h
@@ -107,7 +107,6 @@ public:
return QDateTimeParser::getMaximum();
}
QLocale locale() const override { return q_func()->locale(); }
- QString getAmPmText(AmPm ap, Case cs) const override;
int cursorPosition() const override { return edit ? edit->cursorPosition() : -1; }
int absoluteIndex(QDateTimeEdit::Section s, int index) const;
@@ -120,6 +119,7 @@ public:
void updateCache(const QVariant &val, const QString &str) const;
+ QDateTime convertTimeSpec(const QDateTime &datetime);
void updateTimeSpec();
QString valueToText(const QVariant &var) const { return textFromValue(var); }
diff --git a/src/widgets/widgets/qdial.cpp b/src/widgets/widgets/qdial.cpp
index 25d57970bf..7dd469faae 100644
--- a/src/widgets/widgets/qdial.cpp
+++ b/src/widgets/widgets/qdial.cpp
@@ -464,7 +464,7 @@ QSize QDial::minimumSizeHint() const
QSize QDial::sizeHint() const
{
- return QSize(100, 100).expandedTo(QApplication::globalStrut());
+ return QSize(100, 100);
}
/*!
diff --git a/src/widgets/widgets/qdialogbuttonbox.cpp b/src/widgets/widgets/qdialogbuttonbox.cpp
index 28c4f59d0d..560eeab433 100644
--- a/src/widgets/widgets/qdialogbuttonbox.cpp
+++ b/src/widgets/widgets/qdialogbuttonbox.cpp
@@ -47,7 +47,7 @@
#include <private/qguiapplication_p.h>
#include <QtGui/qpa/qplatformdialoghelper.h>
#include <QtGui/qpa/qplatformtheme.h>
-#include <QtWidgets/qaction.h>
+#include <QtGui/qaction.h>
#include "qdialogbuttonbox.h"
diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp
index 87f4519dd6..693692d6c7 100644
--- a/src/widgets/widgets/qdockarealayout.cpp
+++ b/src/widgets/widgets/qdockarealayout.cpp
@@ -2109,7 +2109,7 @@ bool QDockAreaLayoutInfo::updateTabBar() const
quintptr id = tabId(item);
if (tab_idx == tabBar->count()) {
tabBar->insertTab(tab_idx, title);
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
tabBar->setTabToolTip(tab_idx, title);
#endif
tabBar->setTabData(tab_idx, id);
@@ -2119,7 +2119,7 @@ bool QDockAreaLayoutInfo::updateTabBar() const
tabBar->removeTab(tab_idx);
else {
tabBar->insertTab(tab_idx, title);
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
tabBar->setTabToolTip(tab_idx, title);
#endif
tabBar->setTabData(tab_idx, id);
@@ -2128,7 +2128,7 @@ bool QDockAreaLayoutInfo::updateTabBar() const
if (title != tabBar->tabText(tab_idx)) {
tabBar->setTabText(tab_idx, title);
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
tabBar->setTabToolTip(tab_idx, title);
#endif
}
diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp
index 1d358c493e..102f370488 100644
--- a/src/widgets/widgets/qdockwidget.cpp
+++ b/src/widgets/widgets/qdockwidget.cpp
@@ -887,12 +887,10 @@ void QDockWidgetPrivate::endDrag(bool abort)
void QDockWidgetPrivate::setResizerActive(bool active)
{
Q_Q(QDockWidget);
- if (active && !resizer) {
+ if (active && !resizer)
resizer = new QWidgetResizeHandler(q);
- resizer->setMovingEnabled(false);
- }
if (resizer)
- resizer->setActive(QWidgetResizeHandler::Resize, active);
+ resizer->setEnabled(active);
}
bool QDockWidgetPrivate::isAnimating() const
@@ -1242,11 +1240,6 @@ void QDockWidgetPrivate::setWindowState(bool floating, bool unplug, const QRect
bar on its left side. This can be used to
increase the amount of vertical space in
a QMainWindow.
- \value AllDockWidgetFeatures (Deprecated) The dock widget can be closed, moved,
- and floated. Since new features might be added in future
- releases, the look and behavior of dock widgets might
- change if you use this flag. Please specify individual
- flags instead.
\value NoDockWidgetFeatures The dock widget cannot be closed, moved,
or floated.
diff --git a/src/widgets/widgets/qdockwidget.h b/src/widgets/widgets/qdockwidget.h
index 36dff4d420..d553407fb5 100644
--- a/src/widgets/widgets/qdockwidget.h
+++ b/src/widgets/widgets/qdockwidget.h
@@ -78,10 +78,6 @@ public:
DockWidgetVerticalTitleBar = 0x08,
DockWidgetFeatureMask = 0x0f,
-#if QT_DEPRECATED_SINCE(5, 15)
- AllDockWidgetFeatures Q_DECL_ENUMERATOR_DEPRECATED =
- DockWidgetClosable|DockWidgetMovable|DockWidgetFloatable, // ### Qt 6: remove
-#endif
NoDockWidgetFeatures = 0x00,
Reserved = 0xff
diff --git a/src/widgets/widgets/qeffects.cpp b/src/widgets/widgets/qeffects.cpp
index 074352b736..1f2d3517e8 100644
--- a/src/widgets/widgets/qeffects.cpp
+++ b/src/widgets/widgets/qeffects.cpp
@@ -311,7 +311,7 @@ void QAlphaWidget::alphaBlend()
const int sw = frontImage.width();
const int sh = frontImage.height();
- const int bpl = frontImage.bytesPerLine();
+ const qsizetype bpl = frontImage.bytesPerLine();
switch(frontImage.depth()) {
case 32:
{
diff --git a/src/widgets/widgets/qfontcombobox.cpp b/src/widgets/widgets/qfontcombobox.cpp
index 4a99b0f962..cb665de889 100644
--- a/src/widgets/widgets/qfontcombobox.cpp
+++ b/src/widgets/widgets/qfontcombobox.cpp
@@ -427,7 +427,7 @@ QFontComboBox::QFontComboBox(QWidget *parent)
lview->setUniformItemSizes(true);
setWritingSystem(QFontDatabase::Any);
- connect(this, SIGNAL(currentIndexChanged(QString)),
+ connect(this, SIGNAL(currentTextChanged(QString)),
this, SLOT(_q_currentChanged(QString)));
connect(qApp, SIGNAL(fontDatabaseChanged()),
diff --git a/src/widgets/widgets/qlabel.cpp b/src/widgets/widgets/qlabel.cpp
index 992e0cee97..152c250f69 100644
--- a/src/widgets/widgets/qlabel.cpp
+++ b/src/widgets/widgets/qlabel.cpp
@@ -47,7 +47,6 @@
#include "qstyle.h"
#include "qstyleoption.h"
#include <limits.h>
-#include "qaction.h"
#include "qclipboard.h"
#include <qdebug.h>
#include <qurl.h>
@@ -188,53 +187,31 @@ QLabelPrivate::~QLabelPrivate()
*/
#ifndef QT_NO_PICTURE
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \deprecated
-
- New code should use the other overload which returns QPicture by-value.
-
- This function returns the label's picture or \c nullptr if the label doesn't have a
- picture.
-*/
-
-const QPicture *QLabel::picture() const
-{
- Q_D(const QLabel);
- return d->picture;
-}
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
/*!
+ \fn QPicture QLabel::picture(Qt::ReturnByValueConstant) const
+ \obsolete Use the overload without argument instead.
\since 5.15
+
Returns the label's picture.
Previously, Qt provided a version of \c picture() which returned the picture
- by-pointer. That version is now deprecated. To maintain compatibility
- with old code, you can explicitly differentiate between the by-pointer
- function and the by-value function:
-
- \code
- const QPicture *picPtr = label->picture();
- QPicture picVal = label->picture(Qt::ReturnByValue);
- \endcode
+ by-pointer. That version is now removed. This overload allowed to
+ explicitly differentiate between the by-pointer function and the by-value.
+*/
- If you disable the deprecated version using the QT_DISABLE_DEPRECATED_BEFORE
- macro, then you can omit \c Qt::ReturnByValue as shown below:
+/*!
+ \since 6.0
- \code
- QPicture picVal = label->picture();
- \endcode
+ Returns the label's picture.
*/
-
-QPicture QLabel::picture(Qt::ReturnByValueConstant) const
+QPicture QLabel::picture() const
{
Q_D(const QLabel);
if (d->picture)
return *(d->picture);
return QPicture();
}
-#endif
+#endif // QT_NO_PICTURE
/*!
@@ -390,26 +367,6 @@ void QLabel::clear()
\property QLabel::pixmap
\brief the label's pixmap.
- Previously, Qt provided a version of \c pixmap() which returned the pixmap
- by-pointer. That version is now deprecated. To maintain compatibility
- with old code, you can explicitly differentiate between the by-pointer
- function and the by-value function:
-
- \code
- const QPixmap *pixmapPtr = label->pixmap();
- QPixmap pixmapVal = label->pixmap(Qt::ReturnByValue);
- \endcode
-
- If you disable the deprecated version using the QT_DISABLE_DEPRECATED_BEFORE
- macro, then you can omit \c Qt::ReturnByValue as shown below:
-
- \code
- QPixmap pixmapVal = label->pixmap();
- \endcode
-
- If no pixmap has been set, the deprecated getter function will return
- \c nullptr.
-
Setting the pixmap clears any previous content. The buddy
shortcut, if any, is disabled.
*/
@@ -427,29 +384,30 @@ void QLabel::setPixmap(const QPixmap &pixmap)
d->updateLabel();
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \deprecated
-
- New code should use the other overload which returns QPixmap by-value.
-*/
-const QPixmap *QLabel::pixmap() const
+QPixmap QLabel::pixmap() const
{
Q_D(const QLabel);
- return d->pixmap;
+ if (d->pixmap)
+ return *(d->pixmap);
+ return QPixmap();
}
-#endif // QT_DEPRECATED_SINCE(5, 15)
/*!
+ \fn QPixmap QLabel::pixmap(Qt::ReturnByValueConstant) const
+
+ \obsolete Use the overload without argument instead.
\since 5.15
+
+ Returns the label's pixmap.
+
+ Previously, Qt provided a version of \c pixmap() which returned the pixmap
+ by-pointer. That version has now been removed. This overload allowed to
+ explicitly differentiate between the by-pointer function and the by-value.
+
+ \code
+ QPixmap pixmapVal = label->pixmap(Qt::ReturnByValue);
+ \endcode
*/
-QPixmap QLabel::pixmap(Qt::ReturnByValueConstant) const
-{
- Q_D(const QLabel);
- if (d->pixmap)
- return *(d->pixmap);
- return QPixmap();
-}
#ifndef QT_NO_PICTURE
/*!
diff --git a/src/widgets/widgets/qlabel.h b/src/widgets/widgets/qlabel.h
index c9552efd8a..8cc86b421e 100644
--- a/src/widgets/widgets/qlabel.h
+++ b/src/widgets/widgets/qlabel.h
@@ -42,6 +42,7 @@
#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qframe.h>
+#include <QtGui/qpicture.h>
QT_REQUIRE_CONFIG(label);
@@ -73,24 +74,16 @@ public:
QString text() const;
-#if QT_DEPRECATED_SINCE(5,15)
- QT_DEPRECATED_VERSION_X(5, 15, "Use the other overload which returns QPixmap by-value")
- const QPixmap *pixmap() const; // ### Qt 7: Remove function
-
- QPixmap pixmap(Qt::ReturnByValueConstant) const;
-#else
- QPixmap pixmap(Qt::ReturnByValueConstant = Qt::ReturnByValue) const; // ### Qt 7: Remove arg
-#endif // QT_DEPRECATED_SINCE(5,15)
+#if QT_DEPRECATED_SINCE(6,6)
+ QPixmap pixmap(Qt::ReturnByValueConstant) const { return pixmap(); }
+#endif
+ QPixmap pixmap() const;
#ifndef QT_NO_PICTURE
-# if QT_DEPRECATED_SINCE(5,15)
- QT_DEPRECATED_VERSION_X(5, 15, "Use the other overload which returns QPicture by-value")
- const QPicture *picture() const; // ### Qt 7: Remove function
-
- QPicture picture(Qt::ReturnByValueConstant) const;
-# else
- QPicture picture(Qt::ReturnByValueConstant = Qt::ReturnByValue) const; // ### Qt 7: Remove arg
-# endif // QT_DEPRECATED_SINCE(5,15)
+#if QT_DEPRECATED_SINCE(6,6)
+ QPicture picture(Qt::ReturnByValueConstant) const { return picture(); }
+#endif
+ QPicture picture() const;
#endif
#if QT_CONFIG(movie)
QMovie *movie() const;
diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp
index 401a62aff3..5ec79ce6ea 100644
--- a/src/widgets/widgets/qlineedit.cpp
+++ b/src/widgets/widgets/qlineedit.cpp
@@ -40,7 +40,9 @@
#include "qlineedit.h"
#include "qlineedit_p.h"
-#include "qaction.h"
+#if QT_CONFIG(action)
+# include "qaction.h"
+#endif
#include "qapplication.h"
#include "qclipboard.h"
#if QT_CONFIG(draganddrop)
@@ -78,7 +80,7 @@
#endif
#include "private/qstylesheetstyle_p.h"
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
#include "private/qapplication_p.h"
#include "private/qshortcutmap_p.h"
#include "qkeysequence.h"
@@ -615,7 +617,7 @@ const QValidator * QLineEdit::validator() const
The initial setting is to have no input validator (i.e. any input
is accepted up to maxLength()).
- \sa validator(), hasAcceptableInput(), QIntValidator, QDoubleValidator, QRegExpValidator
+ \sa validator(), hasAcceptableInput(), QIntValidator, QDoubleValidator, QRegularExpressionValidator
*/
void QLineEdit::setValidator(const QValidator *v)
@@ -701,8 +703,7 @@ QSize QLineEdit::sizeHint() const
+ d->leftmargin + d->rightmargin; // "some"
QStyleOptionFrame opt;
initStyleOption(&opt);
- return (style()->sizeFromContents(QStyle::CT_LineEdit, &opt, QSize(w, h).
- expandedTo(QApplication::globalStrut()), this));
+ return style()->sizeFromContents(QStyle::CT_LineEdit, &opt, QSize(w, h), this);
}
@@ -726,8 +727,7 @@ QSize QLineEdit::minimumSizeHint() const
+ d->leftmargin + d->rightmargin;
QStyleOptionFrame opt;
initStyleOption(&opt);
- return (style()->sizeFromContents(QStyle::CT_LineEdit, &opt, QSize(w, h).
- expandedTo(QApplication::globalStrut()), this));
+ return style()->sizeFromContents(QStyle::CT_LineEdit, &opt, QSize(w, h), this);
}
@@ -1158,30 +1158,6 @@ void QLineEdit::setTextMargins(const QMargins &margins)
update();
}
-#if QT_DEPRECATED_SINCE(5, 14)
-/*!
- \obsolete
- Use textMargins()
-
- Returns the widget's text margins for \a left, \a top, \a right, and \a bottom.
- \since 4.5
-
- \sa setTextMargins()
-*/
-void QLineEdit::getTextMargins(int *left, int *top, int *right, int *bottom) const
-{
- QMargins m = textMargins();
- if (left)
- *left = m.left();
- if (top)
- *top = m.top();
- if (right)
- *right = m.right();
- if (bottom)
- *bottom = m.bottom();
-}
-#endif
-
/*!
\since 4.6
Returns the widget's text margins.
diff --git a/src/widgets/widgets/qlineedit.h b/src/widgets/widgets/qlineedit.h
index 1cf1f24449..41efab9229 100644
--- a/src/widgets/widgets/qlineedit.h
+++ b/src/widgets/widgets/qlineedit.h
@@ -172,10 +172,6 @@ public:
void setTextMargins(int left, int top, int right, int bottom);
void setTextMargins(const QMargins &margins);
-#if QT_DEPRECATED_SINCE(5, 14)
- QT_DEPRECATED_X("use textMargins()")
- void getTextMargins(int *left, int *top, int *right, int *bottom) const;
-#endif
QMargins textMargins() const;
#if QT_CONFIG(action)
diff --git a/src/widgets/widgets/qlineedit_p.cpp b/src/widgets/widgets/qlineedit_p.cpp
index feb34ef403..b61b46df25 100644
--- a/src/widgets/widgets/qlineedit_p.cpp
+++ b/src/widgets/widgets/qlineedit_p.cpp
@@ -47,7 +47,9 @@
#if QT_CONFIG(draganddrop)
#include "qdrag.h"
#endif
-#include "qwidgetaction.h"
+#if QT_CONFIG(action)
+# include "qwidgetaction.h"
+#endif
#include "qclipboard.h"
#ifndef QT_NO_ACCESSIBILITY
#include "qaccessible.h"
@@ -370,7 +372,7 @@ void QLineEditIconButton::actionEvent(QActionEvent *e)
{
switch (e->type()) {
case QEvent::ActionChanged: {
- const QAction *action = e->action();
+ const auto *action = e->action();
if (isVisibleTo(parentWidget()) != action->isVisible()) {
setVisible(action->isVisible());
if (QLineEditPrivate *lep = lineEditPrivate())
@@ -545,6 +547,7 @@ void QLineEditPrivate::positionSideWidgets()
}
}
+#if QT_CONFIG(action)
QLineEditPrivate::SideWidgetLocation QLineEditPrivate::findSideWidget(const QAction *a) const
{
int i = 0;
@@ -574,12 +577,10 @@ QWidget *QLineEditPrivate::addAction(QAction *newAction, QAction *before, QLineE
QWidget *w = nullptr;
// Store flags about QWidgetAction here since removeAction() may be called from ~QAction,
// in which a qobject_cast<> no longer works.
-#if QT_CONFIG(action)
if (QWidgetAction *widgetAction = qobject_cast<QWidgetAction *>(newAction)) {
if ((w = widgetAction->requestWidget(q)))
flags |= SideWidgetCreatedByWidgetAction;
}
-#endif
if (!w) {
#if QT_CONFIG(toolbutton)
QLineEditIconButton *toolButton = new QLineEditIconButton(q);
@@ -636,7 +637,6 @@ QWidget *QLineEditPrivate::addAction(QAction *newAction, QAction *before, QLineE
void QLineEditPrivate::removeAction(QAction *action)
{
-#if QT_CONFIG(action)
Q_Q(QLineEdit);
const auto location = findSideWidget(action);
if (!location.isValid())
@@ -652,10 +652,8 @@ void QLineEditPrivate::removeAction(QAction *action)
if (!hasSideWidgets()) // Last widget, remove connection
QObject::disconnect(q, SIGNAL(textChanged(QString)), q, SLOT(_q_textChanged(QString)));
q->update();
-#else
- Q_UNUSED(action);
-#endif // QT_CONFIG(action)
}
+#endif // QT_CONFIG(action)
static int effectiveTextMargin(int defaultMargin, const QLineEditPrivate::SideWidgetEntryList &widgets,
const QLineEditPrivate::SideWidgetParameters &parameters)
diff --git a/src/widgets/widgets/qlineedit_p.h b/src/widgets/widgets/qlineedit_p.h
index 5ae402b992..049f7a3bdf 100644
--- a/src/widgets/widgets/qlineedit_p.h
+++ b/src/widgets/widgets/qlineedit_p.h
@@ -238,8 +238,10 @@ public:
QString placeholderText;
+#if QT_CONFIG(action)
QWidget *addAction(QAction *newAction, QAction *before, QLineEdit::ActionPosition, int flags = 0);
void removeAction(QAction *action);
+#endif
SideWidgetParameters sideWidgetParameters() const;
QIcon clearButtonIcon() const;
void setClearButtonEnabled(bool enabled);
@@ -261,7 +263,9 @@ private:
};
friend class QTypeInfo<SideWidgetLocation>;
+#if QT_CONFIG(action)
SideWidgetLocation findSideWidget(const QAction *a) const;
+#endif
SideWidgetEntryList leadingSideWidgets;
SideWidgetEntryList trailingSideWidgets;
diff --git a/src/widgets/widgets/qmainwindow.cpp b/src/widgets/widgets/qmainwindow.cpp
index 6b50f5e8ab..e3016371ba 100644
--- a/src/widgets/widgets/qmainwindow.cpp
+++ b/src/widgets/widgets/qmainwindow.cpp
@@ -1349,7 +1349,7 @@ bool QMainWindow::event(QEvent *event)
Note that the Qt 5 implementation has several limitations compared to Qt 4:
\list
- \li Use in windows with OpenGL content is not supported. This includes QGLWidget and QOpenGLWidget.
+ \li Use in windows with OpenGL content is not supported. This includes QOpenGLWidget.
\li Using dockable or movable toolbars may result in painting errors and is not recommended
\endlist
diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp
index 30562d8270..83697278b8 100644
--- a/src/widgets/widgets/qmainwindowlayout.cpp
+++ b/src/widgets/widgets/qmainwindowlayout.cpp
@@ -200,7 +200,6 @@ public:
QDockWidgetGroupLayout(QDockWidgetGroupWindow* parent) : QLayout(parent) {
setSizeConstraint(QLayout::SetMinAndMaxSize);
resizer = new QWidgetResizeHandler(parent);
- resizer->setMovingEnabled(false);
}
~QDockWidgetGroupLayout() {
layoutState.deleteAllLayoutItems();
@@ -259,7 +258,7 @@ public:
li->apply(false);
if (savedState.rect.isValid())
savedState.rect = li->rect;
- resizer->setActive(QWidgetResizeHandler::Resize, !nativeWindowDeco());
+ resizer->setEnabled(!nativeWindowDeco());
}
QDockAreaLayoutInfo *dockAreaLayoutInfo() { return &layoutState; }
diff --git a/src/widgets/widgets/qmdiarea.cpp b/src/widgets/widgets/qmdiarea.cpp
index da6eb47372..713c5f3d75 100644
--- a/src/widgets/widgets/qmdiarea.cpp
+++ b/src/widgets/widgets/qmdiarea.cpp
@@ -1751,7 +1751,7 @@ QSize QMdiArea::sizeHint() const
continue;
size = size.expandedTo(child->sizeHint());
}
- return size.expandedTo(QApplication::globalStrut());
+ return size;
}
/*!
@@ -1770,7 +1770,7 @@ QSize QMdiArea::minimumSizeHint() const
size = size.expandedTo(child->minimumSizeHint());
}
}
- return size.expandedTo(QApplication::globalStrut());
+ return size;
}
/*!
diff --git a/src/widgets/widgets/qmdisubwindow.cpp b/src/widgets/widgets/qmdisubwindow.cpp
index 84568c35db..ddc11cd470 100644
--- a/src/widgets/widgets/qmdisubwindow.cpp
+++ b/src/widgets/widgets/qmdisubwindow.cpp
@@ -154,7 +154,9 @@
#if QT_CONFIG(whatsthis)
#include <QWhatsThis>
#endif
+#if QT_CONFIG(tooltip)
#include <QToolTip>
+#endif
#if QT_CONFIG(mainwindow)
#include <QMainWindow>
#endif
@@ -162,7 +164,9 @@
#include <QDebug>
#include <QMdiArea>
#include <QScopedValueRollback>
-#include <QAction>
+#if QT_CONFIG(action)
+# include <qaction.h>
+#endif
#if QT_CONFIG(menu)
#include <QMenu>
#endif
@@ -288,7 +292,7 @@ static inline bool isHoverControl(QStyle::SubControl control)
return control != QStyle::SC_None && control != QStyle::SC_TitleBarLabel;
}
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
static void showToolTip(QHelpEvent *helpEvent, QWidget *widget, const QStyleOptionComplex &opt,
QStyle::ComplexControl complexControl, QStyle::SubControl subControl)
{
@@ -353,7 +357,7 @@ static void showToolTip(QHelpEvent *helpEvent, QWidget *widget, const QStyleOpti
const QRect rect = widget->style()->subControlRect(complexControl, &opt, subControl, widget);
QToolTip::showText(helpEvent->globalPos(), toolTip, widget, rect);
}
-#endif // QT_NO_TOOLTIP
+#endif // QT_CONFIG(tooltip)
namespace QMdi {
/*
@@ -414,7 +418,7 @@ bool ControlLabel::event(QEvent *event)
updateWindowIcon();
setFixedSize(label.size());
}
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
else if (event->type() == QEvent::ToolTip) {
QStyleOptionTitleBar options;
options.initFrom(this);
@@ -671,14 +675,14 @@ void ControllerWidget::leaveEvent(QEvent * /*event*/)
*/
bool ControllerWidget::event(QEvent *event)
{
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
if (event->type() == QEvent::ToolTip) {
QStyleOptionComplex opt;
initStyleOption(&opt);
QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
showToolTip(helpEvent, this, opt, QStyle::CC_MdiControls, getSubControl(helpEvent->pos()));
}
-#endif // QT_NO_TOOLTIP
+#endif // QT_CONFIG(tooltip)
return QWidget::event(event);
}
@@ -895,7 +899,7 @@ QMdiSubWindowPrivate::QMdiSubWindowPrivate()
*/
void QMdiSubWindowPrivate::_q_updateStaysOnTopHint()
{
-#ifndef QT_NO_ACTION
+#if QT_CONFIG(action)
Q_Q(QMdiSubWindow);
if (QAction *senderAction = qobject_cast<QAction *>(q->sender())) {
if (senderAction->isChecked()) {
@@ -906,7 +910,7 @@ void QMdiSubWindowPrivate::_q_updateStaysOnTopHint()
q->lower();
}
}
-#endif // QT_NO_ACTION
+#endif // QT_CONFIG(action)
}
/*!
@@ -2872,7 +2876,7 @@ bool QMdiSubWindow::event(QEvent *event)
case QEvent::FontChange:
d->font = font();
break;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
case QEvent::ToolTip:
showToolTip(static_cast<QHelpEvent *>(event), this, d->titleBarOptions(),
QStyle::CC_TitleBar, d->hoveredSubControl);
@@ -3514,7 +3518,7 @@ QSize QMdiSubWindow::minimumSizeHint() const
minHeight = qMax(minHeight, decorationHeight + sizeGripHeight);
#endif
- return QSize(minWidth, minHeight).expandedTo(QApplication::globalStrut());
+ return QSize(minWidth, minHeight);
}
QT_END_NAMESPACE
diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp
index 865e3b2fb6..64cd87df38 100644
--- a/src/widgets/widgets/qmenu.cpp
+++ b/src/widgets/widgets/qmenu.cpp
@@ -41,6 +41,7 @@
#include <QtWidgets/private/qtwidgetsglobal_p.h>
+#include "qactiongroup.h"
#include "qdebug.h"
#include "qstyle.h"
#include "qevent.h"
@@ -72,7 +73,9 @@
#include "qtoolbutton.h"
#endif
#include "qpushbutton.h"
+#if QT_CONFIG(tooltip)
#include "qtooltip.h"
+#endif
#include <qwindow.h>
#include <private/qpushbutton_p.h>
#include <private/qaction_p.h>
@@ -157,10 +160,11 @@ public:
Q_D(QTornOffMenu);
if(menu != d->causedMenu)
return;
+ auto action = static_cast<QAction *>(act->action());
if (act->type() == QEvent::ActionAdded) {
- insertAction(act->before(), act->action());
+ insertAction(static_cast<QAction *>(act->before()), action);
} else if (act->type() == QEvent::ActionRemoved)
- removeAction(act->action());
+ removeAction(action);
}
void actionEvent(QActionEvent *e) override
{
@@ -197,7 +201,8 @@ void QMenuPrivate::init()
#endif
q->setAttribute(Qt::WA_X11NetWmWindowTypePopupMenu);
defaultMenuAction = menuAction = new QAction(q);
- menuAction->d_func()->menu = q;
+ menuAction->setMenu(q); // this calls setOverrideMenuAction
+ setOverrideMenuAction(nullptr);
QObject::connect(menuAction, &QAction::changed, [this] {
if (!tornPopup.isNull())
tornPopup->updateWindowTitle();
@@ -304,7 +309,7 @@ QPlatformMenuItem * QMenuPrivate::insertActionInPlatformMenu(const QAction *acti
int QMenuPrivate::scrollerHeight() const
{
Q_Q(const QMenu);
- return qMax(QApplication::globalStrut().height(), q->style()->pixelMetric(QStyle::PM_MenuScrollerHeight, nullptr, q));
+ return q->style()->pixelMetric(QStyle::PM_MenuScrollerHeight, nullptr, q);
}
// Windows and KDE allow menus to cover the taskbar, while GNOME and macOS
@@ -403,7 +408,9 @@ void QMenuPrivate::updateActionRects(const QRect &screen) const
//calculate size
QFontMetrics qfm = q->fontMetrics();
bool previousWasSeparator = true; // this is true to allow removing the leading separators
+#if QT_CONFIG(shortcut)
const bool contextMenu = isContextMenu();
+#endif
for(int i = 0; i <= lastVisibleAction; i++) {
QAction *action = actions.at(i);
const bool isSection = action->isSeparator() && (!action->text().isEmpty() || !action->icon().isNull());
@@ -434,12 +441,12 @@ void QMenuPrivate::updateActionRects(const QRect &screen) const
if (t != -1) {
tabWidth = qMax(int(tabWidth), qfm.horizontalAdvance(s.mid(t+1)));
s = s.left(t);
- #ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
} else if (action->isShortcutVisibleInContextMenu() || !contextMenu) {
QKeySequence seq = action->shortcut();
if (!seq.isEmpty())
tabWidth = qMax(int(tabWidth), qfm.horizontalAdvance(seq.toString(QKeySequence::NativeText)));
- #endif
+#endif
}
sz.setWidth(fm.boundingRect(QRect(), Qt::TextSingleLine | Qt::TextShowMnemonic, s).width());
sz.setHeight(qMax(fm.height(), qfm.height()));
@@ -471,7 +478,7 @@ void QMenuPrivate::updateActionRects(const QRect &screen) const
max_column_width += tabWidth; //finally add in the tab width
if (!tornoff || (tornoff && scroll)) { // exclude non-scrollable tear-off menu since the tear-off menu has a fixed size
- const int sfcMargin = style->sizeFromContents(QStyle::CT_Menu, &opt, QApplication::globalStrut(), q).width() - QApplication::globalStrut().width();
+ const int sfcMargin = style->sizeFromContents(QStyle::CT_Menu, &opt, QSize(0, 0), q).width();
const int min_column_width = q->minimumWidth() - (sfcMargin + leftmargin + rightmargin + 2 * (fw + hmargin));
max_column_width = qMax(min_column_width, max_column_width);
}
@@ -1770,12 +1777,14 @@ QAction *QMenu::addAction(const QIcon &icon, const QString &text)
\sa QWidget::addAction()
*/
-QAction *QMenu::addAction(const QString &text, const QObject *receiver, const char* member, const QKeySequence &shortcut)
+QAction *QMenu::addAction(const QString &text, const QObject *receiver, const char* member
+#if QT_CONFIG(shortcut)
+ , const QKeySequence &shortcut
+#endif
+ )
{
QAction *action = new QAction(text, this);
-#ifdef QT_NO_SHORTCUT
- Q_UNUSED(shortcut);
-#else
+#if QT_CONFIG(shortcut)
action->setShortcut(shortcut);
#endif
QObject::connect(action, SIGNAL(triggered(bool)), receiver, member);
@@ -1863,12 +1872,14 @@ QAction *QMenu::addAction(const QString &text, const QObject *receiver, const ch
\sa QWidget::addAction()
*/
QAction *QMenu::addAction(const QIcon &icon, const QString &text, const QObject *receiver,
- const char* member, const QKeySequence &shortcut)
+ const char* member
+#if QT_CONFIG(shortcut)
+ , const QKeySequence &shortcut
+#endif
+ )
{
QAction *action = new QAction(icon, text, this);
-#ifdef QT_NO_SHORTCUT
- Q_UNUSED(shortcut);
-#else
+#if QT_CONFIG(shortcut)
action->setShortcut(shortcut);
#endif
QObject::connect(action, SIGNAL(triggered(bool)), receiver, member);
@@ -2237,7 +2248,7 @@ void QMenu::clear()
for(int i = 0; i < acts.size(); i++) {
removeAction(acts[i]);
- if (acts[i]->parent() == this && acts[i]->d_func()->widgets.isEmpty())
+ if (acts[i]->parent() == this && acts[i]->d_func()->associatedObjects.isEmpty())
delete acts[i];
}
}
@@ -2299,8 +2310,7 @@ QSize QMenu::sizeHint() const
s.rwidth() += style()->pixelMetric(QStyle::PM_MenuHMargin, &opt, this) + fw + d->rightmargin;
s.rheight() += style()->pixelMetric(QStyle::PM_MenuVMargin, &opt, this) + fw + d->bottommargin;
- return style()->sizeFromContents(QStyle::CT_Menu, &opt,
- s.expandedTo(QApplication::globalStrut()), this);
+ return style()->sizeFromContents(QStyle::CT_Menu, &opt, s, this);
}
/*!
@@ -3021,7 +3031,7 @@ QMenu::event(QEvent *e)
if (d->currentAction)
d->popupAction(d->currentAction, 0, false);
break;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
case QEvent::ToolTip:
if (d->toolTipsVisible) {
const QHelpEvent *ev = static_cast<const QHelpEvent*>(e);
@@ -3033,7 +3043,7 @@ QMenu::event(QEvent *e)
}
}
break;
-#endif // QT_NO_TOOLTIP
+#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(whatsthis)
case QEvent::QueryWhatsThis:
e->setAccepted(d->whatsThis.size());
@@ -3560,15 +3570,16 @@ void QMenu::actionEvent(QActionEvent *e)
wa->releaseWidget(widget);
}
}
- d->widgetItems.remove(e->action());
+ d->widgetItems.remove(static_cast<QAction *>(e->action()));
}
if (!d->platformMenu.isNull()) {
+ auto action = static_cast<QAction *>(e->action());
if (e->type() == QEvent::ActionAdded) {
QPlatformMenuItem *beforeItem = e->before()
? d->platformMenu->menuItemForTag(reinterpret_cast<quintptr>(e->before()))
: nullptr;
- d->insertActionInPlatformMenu(e->action(), beforeItem);
+ d->insertActionInPlatformMenu(action, beforeItem);
} else if (e->type() == QEvent::ActionRemoved) {
QPlatformMenuItem *menuItem = d->platformMenu->menuItemForTag(reinterpret_cast<quintptr>(e->action()));
d->platformMenu->removeMenuItem(menuItem);
@@ -3576,7 +3587,7 @@ void QMenu::actionEvent(QActionEvent *e)
} else if (e->type() == QEvent::ActionChanged) {
QPlatformMenuItem *menuItem = d->platformMenu->menuItemForTag(reinterpret_cast<quintptr>(e->action()));
if (menuItem) {
- d->copyActionToPlatformItem(e->action(), menuItem);
+ d->copyActionToPlatformItem(action, menuItem);
d->platformMenu->syncMenuItem(menuItem);
}
}
diff --git a/src/widgets/widgets/qmenu.h b/src/widgets/widgets/qmenu.h
index eec9708d43..a163e94c81 100644
--- a/src/widgets/widgets/qmenu.h
+++ b/src/widgets/widgets/qmenu.h
@@ -44,7 +44,7 @@
#include <QtWidgets/qwidget.h>
#include <QtCore/qstring.h>
#include <QtGui/qicon.h>
-#include <QtWidgets/qaction.h>
+#include <QtGui/qaction.h>
#if defined(Q_OS_MACOS) || defined(Q_CLANG_QDOC)
Q_FORWARD_DECLARE_OBJC_CLASS(NSMenu);
@@ -78,8 +78,17 @@ public:
using QWidget::addAction;
QAction *addAction(const QString &text);
QAction *addAction(const QIcon &icon, const QString &text);
- QAction *addAction(const QString &text, const QObject *receiver, const char* member, const QKeySequence &shortcut = 0);
- QAction *addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char* member, const QKeySequence &shortcut = 0);
+
+ QAction *addAction(const QString &text, const QObject *receiver, const char* member
+#if QT_CONFIG(shortcut)
+ , const QKeySequence &shortcut = {}
+#endif
+ );
+ QAction *addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char* member
+#if QT_CONFIG(shortcut)
+ , const QKeySequence &shortcut = {}
+#endif
+ );
#ifdef Q_CLANG_QDOC
template<typename Functor>
@@ -95,12 +104,14 @@ public:
template<class Obj, typename Func1>
inline typename std::enable_if<!std::is_same<const char*, Func1>::value
&& QtPrivate::IsPointerToTypeDerivedFromQObject<Obj*>::Value, QAction *>::type
- addAction(const QString &text, const Obj *object, Func1 slot, const QKeySequence &shortcut = 0)
+ addAction(const QString &text, const Obj *object, Func1 slot
+#if QT_CONFIG(shortcut)
+ , const QKeySequence &shortcut = {}
+#endif
+ )
{
QAction *result = addAction(text);
-#ifdef QT_NO_SHORTCUT
- Q_UNUSED(shortcut)
-#else
+#if QT_CONFIG(shortcut)
result->setShortcut(shortcut);
#endif
connect(result, &QAction::triggered, object, std::move(slot));
@@ -108,12 +119,14 @@ public:
}
// addAction(QString): Connect to a functor or function pointer (without context)
template <typename Func1>
- inline QAction *addAction(const QString &text, Func1 slot, const QKeySequence &shortcut = 0)
+ inline QAction *addAction(const QString &text, Func1 slot
+#if QT_CONFIG(shortcut)
+ , const QKeySequence &shortcut = {}
+#endif
+ )
{
QAction *result = addAction(text);
-#ifdef QT_NO_SHORTCUT
- Q_UNUSED(shortcut)
-#else
+#if QT_CONFIG(shortcut)
result->setShortcut(shortcut);
#endif
connect(result, &QAction::triggered, std::move(slot));
@@ -123,12 +136,15 @@ public:
template<class Obj, typename Func1>
inline typename std::enable_if<!std::is_same<const char*, Func1>::value
&& QtPrivate::IsPointerToTypeDerivedFromQObject<Obj*>::Value, QAction *>::type
- addAction(const QIcon &actionIcon, const QString &text, const Obj *object, Func1 slot, const QKeySequence &shortcut = 0)
+ addAction(const QIcon &actionIcon, const QString &text, const Obj *object, Func1 slot
+#if QT_CONFIG(shortcut)
+ , const QKeySequence &shortcut = {}
+#endif
+ )
+
{
QAction *result = addAction(actionIcon, text);
-#ifdef QT_NO_SHORTCUT
- Q_UNUSED(shortcut)
-#else
+#if QT_CONFIG(shortcut)
result->setShortcut(shortcut);
#endif
connect(result, &QAction::triggered, object, std::move(slot));
@@ -136,12 +152,14 @@ public:
}
// addAction(QIcon, QString): Connect to a functor or function pointer (without context)
template <typename Func1>
- inline QAction *addAction(const QIcon &actionIcon, const QString &text, Func1 slot, const QKeySequence &shortcut = 0)
+ inline QAction *addAction(const QIcon &actionIcon, const QString &text, Func1 slot
+#if QT_CONFIG(shortcut)
+ , const QKeySequence &shortcut = {}
+#endif
+ )
{
QAction *result = addAction(actionIcon, text);
-#ifdef QT_NO_SHORTCUT
- Q_UNUSED(shortcut)
-#else
+#if QT_CONFIG(shortcut)
result->setShortcut(shortcut);
#endif
connect(result, &QAction::triggered, std::move(slot));
@@ -264,17 +282,12 @@ private:
friend class QMenuBarPrivate;
friend class QTornOffMenu;
friend class QComboBox;
- friend class QAction;
+ friend class QtWidgetsActionPrivate;
friend class QToolButtonPrivate;
friend void qt_mac_emit_menuSignals(QMenu *menu, bool show);
friend void qt_mac_menu_emit_hovered(QMenu *menu, QAction *action);
};
-#ifdef Q_OS_MACOS
-// ### Qt 4 compatibility; remove in Qt 6
-inline QT_DEPRECATED void qt_mac_set_dock_menu(QMenu *menu) { menu->setAsDockMenu(); }
-#endif
-
QT_END_NAMESPACE
#endif // QMENU_H
diff --git a/src/widgets/widgets/qmenubar.cpp b/src/widgets/widgets/qmenubar.cpp
index 8724fa1a19..9122273d0d 100644
--- a/src/widgets/widgets/qmenubar.cpp
+++ b/src/widgets/widgets/qmenubar.cpp
@@ -1289,21 +1289,22 @@ void QMenuBar::actionEvent(QActionEvent *e)
if (!nativeMenuBar)
return;
+ auto action = static_cast<QAction *>(e->action());
if (e->type() == QEvent::ActionAdded) {
- QPlatformMenu *menu = d->getPlatformMenu(e->action());
+ QPlatformMenu *menu = d->getPlatformMenu(action);
if (menu) {
- d->copyActionToPlatformMenu(e->action(), menu);
+ d->copyActionToPlatformMenu(action, menu);
- QPlatformMenu *beforeMenu = d->findInsertionPlatformMenu(e->action());
+ QPlatformMenu *beforeMenu = d->findInsertionPlatformMenu(action);
d->platformMenuBar->insertMenu(menu, beforeMenu);
}
} else if (e->type() == QEvent::ActionRemoved) {
- QPlatformMenu *menu = d->getPlatformMenu(e->action());
+ QPlatformMenu *menu = d->getPlatformMenu(action);
if (menu)
d->platformMenuBar->removeMenu(menu);
} else if (e->type() == QEvent::ActionChanged) {
QPlatformMenu *cur = d->platformMenuBar->menuForTag(reinterpret_cast<quintptr>(e->action()));
- QPlatformMenu *menu = d->getPlatformMenu(e->action());
+ QPlatformMenu *menu = d->getPlatformMenu(action);
// the menu associated with the action can change, need to
// remove and/or insert the new platform menu
@@ -1311,13 +1312,13 @@ void QMenuBar::actionEvent(QActionEvent *e)
if (cur)
d->platformMenuBar->removeMenu(cur);
if (menu) {
- d->copyActionToPlatformMenu(e->action(), menu);
+ d->copyActionToPlatformMenu(action, menu);
- QPlatformMenu *beforeMenu = d->findInsertionPlatformMenu(e->action());
+ QPlatformMenu *beforeMenu = d->findInsertionPlatformMenu(action);
d->platformMenuBar->insertMenu(menu, beforeMenu);
}
} else if (menu) {
- d->copyActionToPlatformMenu(e->action(), menu);
+ d->copyActionToPlatformMenu(action, menu);
d->platformMenuBar->syncMenu(menu);
}
}
@@ -1653,9 +1654,7 @@ QSize QMenuBar::minimumSizeHint() const
opt.menuItemType = QStyleOptionMenuItem::Normal;
opt.checkType = QStyleOptionMenuItem::NotCheckable;
opt.palette = palette();
- return (style()->sizeFromContents(QStyle::CT_MenuBar, &opt,
- ret.expandedTo(QApplication::globalStrut()),
- this));
+ return style()->sizeFromContents(QStyle::CT_MenuBar, &opt, ret, this);
}
return ret;
}
@@ -1706,9 +1705,7 @@ QSize QMenuBar::sizeHint() const
opt.menuItemType = QStyleOptionMenuItem::Normal;
opt.checkType = QStyleOptionMenuItem::NotCheckable;
opt.palette = palette();
- return (style()->sizeFromContents(QStyle::CT_MenuBar, &opt,
- ret.expandedTo(QApplication::globalStrut()),
- this));
+ return style()->sizeFromContents(QStyle::CT_MenuBar, &opt, ret, this);
}
return ret;
}
diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp
index 87e8af1382..c33b99432a 100644
--- a/src/widgets/widgets/qplaintextedit.cpp
+++ b/src/widgets/widgets/qplaintextedit.cpp
@@ -1430,7 +1430,7 @@ QString QPlainTextEdit::anchorAt(const QPoint &pos) const
if (cursorPos < 0)
return QString();
- QTextDocumentPrivate *pieceTable = document()->docHandle();
+ QTextDocumentPrivate *pieceTable = QTextDocumentPrivate::get(document());
QTextDocumentPrivate::FragmentIterator it = pieceTable->find(cursorPos);
QTextCharFormat fmt = pieceTable->formatCollection()->charFormat(it->format);
return fmt.anchorHref();
@@ -2491,26 +2491,6 @@ void QPlainTextEdit::setOverwriteMode(bool overwrite)
d->control->setOverwriteMode(overwrite);
}
-#if QT_DEPRECATED_SINCE(5, 10)
-/*!
- \property QPlainTextEdit::tabStopWidth
- \brief the tab stop width in pixels
- \deprecated in Qt 5.10. Use tabStopDistance instead.
-
- By default, this property contains a value of 80.
-*/
-
-int QPlainTextEdit::tabStopWidth() const
-{
- return qRound(tabStopDistance());
-}
-
-void QPlainTextEdit::setTabStopWidth(int width)
-{
- setTabStopDistance(width);
-}
-#endif
-
/*!
\property QPlainTextEdit::tabStopDistance
\brief the tab stop distance in pixels
@@ -2922,27 +2902,6 @@ bool QPlainTextEdit::find(const QString &exp, QTextDocument::FindFlags options)
}
/*!
- \fn bool QPlainTextEdit::find(const QRegExp &exp, QTextDocument::FindFlags options)
-
- \since 5.3
- \overload
-
- Finds the next occurrence, matching the regular expression, \a exp, using the given
- \a options. The QTextDocument::FindCaseSensitively option is ignored for this overload,
- use QRegExp::caseSensitivity instead.
-
- Returns \c true if a match was found and changes the cursor to select the match;
- otherwise returns \c false.
-*/
-#ifndef QT_NO_REGEXP
-bool QPlainTextEdit::find(const QRegExp &exp, QTextDocument::FindFlags options)
-{
- Q_D(QPlainTextEdit);
- return d->control->find(exp, options);
-}
-#endif
-
-/*!
\fn bool QPlainTextEdit::find(const QRegularExpression &exp, QTextDocument::FindFlags options)
\since 5.13
diff --git a/src/widgets/widgets/qplaintextedit.h b/src/widgets/widgets/qplaintextedit.h
index a5945d649a..f2213c9ca7 100644
--- a/src/widgets/widgets/qplaintextedit.h
+++ b/src/widgets/widgets/qplaintextedit.h
@@ -74,9 +74,6 @@ class Q_WIDGETS_EXPORT QPlainTextEdit : public QAbstractScrollArea
Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)
Q_PROPERTY(QString plainText READ toPlainText WRITE setPlainText NOTIFY textChanged USER true)
Q_PROPERTY(bool overwriteMode READ overwriteMode WRITE setOverwriteMode)
-#if QT_DEPRECATED_SINCE(5, 10)
- Q_PROPERTY(int tabStopWidth READ tabStopWidth WRITE setTabStopWidth)
-#endif
Q_PROPERTY(qreal tabStopDistance READ tabStopDistance WRITE setTabStopDistance)
Q_PROPERTY(int cursorWidth READ cursorWidth WRITE setCursorWidth)
Q_PROPERTY(Qt::TextInteractionFlags textInteractionFlags READ textInteractionFlags WRITE setTextInteractionFlags)
@@ -147,9 +144,6 @@ public:
bool centerOnScroll() const;
bool find(const QString &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags());
-#ifndef QT_NO_REGEXP
- bool find(const QRegExp &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags());
-#endif
#if QT_CONFIG(regularexpression)
bool find(const QRegularExpression &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags());
#endif
@@ -174,11 +168,6 @@ public:
bool overwriteMode() const;
void setOverwriteMode(bool overwrite);
-#if QT_DEPRECATED_SINCE(5, 10)
- QT_DEPRECATED int tabStopWidth() const;
- QT_DEPRECATED void setTabStopWidth(int width);
-#endif
-
qreal tabStopDistance() const;
void setTabStopDistance(qreal distance);
diff --git a/src/widgets/widgets/qpushbutton.cpp b/src/widgets/widgets/qpushbutton.cpp
index 3d075bf92f..bb2848aa43 100644
--- a/src/widgets/widgets/qpushbutton.cpp
+++ b/src/widgets/widgets/qpushbutton.cpp
@@ -427,8 +427,7 @@ QSize QPushButton::sizeHint() const
if (menu())
w += style()->pixelMetric(QStyle::PM_MenuButtonIndicator, &opt, this);
#endif
- d->sizeHint = (style()->sizeFromContents(QStyle::CT_PushButton, &opt, QSize(w, h), this).
- expandedTo(QApplication::globalStrut()));
+ d->sizeHint = style()->sizeFromContents(QStyle::CT_PushButton, &opt, QSize(w, h), this);
return d->sizeHint;
}
diff --git a/src/widgets/widgets/qradiobutton.cpp b/src/widgets/widgets/qradiobutton.cpp
index fd8922ed28..103f3ac441 100644
--- a/src/widgets/widgets/qradiobutton.cpp
+++ b/src/widgets/widgets/qradiobutton.cpp
@@ -195,8 +195,7 @@ QSize QRadioButton::sizeHint() const
false, text()).size();
if (!opt.icon.isNull())
sz = QSize(sz.width() + opt.iconSize.width() + 4, qMax(sz.height(), opt.iconSize.height()));
- d->sizeHint = (style()->sizeFromContents(QStyle::CT_RadioButton, &opt, sz, this).
- expandedTo(QApplication::globalStrut()));
+ d->sizeHint = style()->sizeFromContents(QStyle::CT_RadioButton, &opt, sz, this);
return d->sizeHint;
}
diff --git a/src/widgets/widgets/qscrollbar.cpp b/src/widgets/widgets/qscrollbar.cpp
index 2ce1d50c86..188ee7c25c 100644
--- a/src/widgets/widgets/qscrollbar.cpp
+++ b/src/widgets/widgets/qscrollbar.cpp
@@ -448,8 +448,7 @@ QSize QScrollBar::sizeHint() const
else
size = QSize(scrollBarExtent, scrollBarExtent * 2 + scrollBarSliderMin);
- return style()->sizeFromContents(QStyle::CT_ScrollBar, &opt, size, this)
- .expandedTo(QApplication::globalStrut());
+ return style()->sizeFromContents(QStyle::CT_ScrollBar, &opt, size, this);
}
/*!\reimp */
diff --git a/src/widgets/widgets/qsizegrip.cpp b/src/widgets/widgets/qsizegrip.cpp
index 95a4beeb57..68fd3ddce1 100644
--- a/src/widgets/widgets/qsizegrip.cpp
+++ b/src/widgets/widgets/qsizegrip.cpp
@@ -230,8 +230,7 @@ QSize QSizeGrip::sizeHint() const
{
QStyleOption opt(0);
opt.init(this);
- return (style()->sizeFromContents(QStyle::CT_SizeGrip, &opt, QSize(13, 13), this).
- expandedTo(QApplication::globalStrut()));
+ return style()->sizeFromContents(QStyle::CT_SizeGrip, &opt, QSize(13, 13), this);
}
/*!
diff --git a/src/widgets/widgets/qslider.cpp b/src/widgets/widgets/qslider.cpp
index 161e4ba27a..7008da32b5 100644
--- a/src/widgets/widgets/qslider.cpp
+++ b/src/widgets/widgets/qslider.cpp
@@ -472,7 +472,7 @@ QSize QSlider::sizeHint() const
w = SliderLength;
h = thick;
}
- return style()->sizeFromContents(QStyle::CT_Slider, &opt, QSize(w, h), this).expandedTo(QApplication::globalStrut());
+ return style()->sizeFromContents(QStyle::CT_Slider, &opt, QSize(w, h), this);
}
/*!
diff --git a/src/widgets/widgets/qspinbox.cpp b/src/widgets/widgets/qspinbox.cpp
index cbd600ec6c..6ac2e1cec2 100644
--- a/src/widgets/widgets/qspinbox.cpp
+++ b/src/widgets/widgets/qspinbox.cpp
@@ -191,17 +191,6 @@ public:
The new text is passed in \a text with prefix() and suffix().
*/
-#if QT_DEPRECATED_SINCE(5, 14)
-/*!
- \fn void QSpinBox::valueChanged(const QString &text)
-
- \overload
- \obsolete Use textChanged(QString) instead
-
- The new value is passed in \a text with prefix() and suffix().
-*/
-#endif
-
/*!
Constructs a spin box with 0 as minimum value and 99 as maximum value, a
step value of 1. The value is initially set to 0. It is parented to \a
@@ -663,17 +652,6 @@ void QSpinBox::fixup(QString &input) const
The new text is passed in \a text with prefix() and suffix().
*/
-#if QT_DEPRECATED_SINCE(5, 14)
-/*!
- \fn void QDoubleSpinBox::valueChanged(const QString &text);
-
- \overload
- \obsolete Use textChanged(QString) instead
-
- The new value is passed in \a text with prefix() and suffix().
-*/
-#endif
-
/*!
Constructs a spin box with 0.0 as minimum value and 99.99 as maximum value,
a step value of 1.0 and a precision of 2 decimal places. The value is
@@ -1095,12 +1073,6 @@ void QSpinBoxPrivate::emitSignals(EmitPolicy ep, const QVariant &old)
if (ep != NeverEmit) {
pendingEmit = false;
if (ep == AlwaysEmit || value != old) {
-#if QT_DEPRECATED_SINCE(5, 14)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- emit q->valueChanged(edit->displayText());
-QT_WARNING_POP
-#endif
emit q->textChanged(edit->displayText());
emit q->valueChanged(value.toInt());
}
@@ -1252,12 +1224,6 @@ void QDoubleSpinBoxPrivate::emitSignals(EmitPolicy ep, const QVariant &old)
if (ep != NeverEmit) {
pendingEmit = false;
if (ep == AlwaysEmit || value != old) {
-#if QT_DEPRECATED_SINCE(5, 14)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- emit q->valueChanged(edit->displayText());
-QT_WARNING_POP
-#endif
emit q->textChanged(edit->displayText());
emit q->valueChanged(value.toDouble());
}
diff --git a/src/widgets/widgets/qspinbox.h b/src/widgets/widgets/qspinbox.h
index 762dd4a46a..be5357b028 100644
--- a/src/widgets/widgets/qspinbox.h
+++ b/src/widgets/widgets/qspinbox.h
@@ -107,10 +107,6 @@ public Q_SLOTS:
Q_SIGNALS:
void valueChanged(int);
void textChanged(const QString &);
-#if QT_DEPRECATED_SINCE(5, 14)
- QT_DEPRECATED_X("Use textChanged(QString) instead")
- void valueChanged(const QString &);
-#endif
private:
Q_DISABLE_COPY(QSpinBox)
@@ -173,10 +169,6 @@ public Q_SLOTS:
Q_SIGNALS:
void valueChanged(double);
void textChanged(const QString &);
-#if QT_DEPRECATED_SINCE(5, 14)
- QT_DEPRECATED_X("Use textChanged(QString) instead")
- void valueChanged(const QString &);
-#endif
private:
Q_DISABLE_COPY(QDoubleSpinBox)
diff --git a/src/widgets/widgets/qsplashscreen.cpp b/src/widgets/widgets/qsplashscreen.cpp
index 328df6a8f2..3cb275b56a 100644
--- a/src/widgets/widgets/qsplashscreen.cpp
+++ b/src/widgets/widgets/qsplashscreen.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -157,25 +157,6 @@ QSplashScreen::QSplashScreen(QScreen *screen, const QPixmap &pixmap, Qt::WindowF
d_func()->setPixmap(pixmap, screen);
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \overload
- \obsolete Use the constructor taking a \c {QScreen *} instead
-
- This function allows you to specify a parent for your splashscreen. The
- typical use for this constructor is if you have a multiple screens and
- prefer to have the splash screen on a different screen than your primary
- one. In that case pass the proper desktop() as the \a parent.
-*/
-QSplashScreen::QSplashScreen(QWidget *parent, const QPixmap &pixmap, Qt::WindowFlags f)
- : QWidget(*new QSplashScreenPrivate, parent, Qt::SplashScreen | Qt::FramelessWindowHint | f)
-{
- // Does an implicit repaint. Explicitly pass parent as QObject::parent()
- // is still 0 here due to QWidget's special handling.
- d_func()->setPixmap(pixmap, QSplashScreenPrivate::screenFor(parent));
-}
-#endif
-
/*!
Destructor.
*/
diff --git a/src/widgets/widgets/qsplashscreen.h b/src/widgets/widgets/qsplashscreen.h
index 1877493fcf..de51494f85 100644
--- a/src/widgets/widgets/qsplashscreen.h
+++ b/src/widgets/widgets/qsplashscreen.h
@@ -56,10 +56,6 @@ class Q_WIDGETS_EXPORT QSplashScreen : public QWidget
public:
explicit QSplashScreen(const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags());
QSplashScreen(QScreen *screen, const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags());
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_VERSION_X_5_15("Use the constructor taking a QScreen *")
- QSplashScreen(QWidget *parent, const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags());
-#endif
virtual ~QSplashScreen();
void setPixmap(const QPixmap &pixmap);
diff --git a/src/widgets/widgets/qsplitter.cpp b/src/widgets/widgets/qsplitter.cpp
index 090aa5cc8b..b8540176e7 100644
--- a/src/widgets/widgets/qsplitter.cpp
+++ b/src/widgets/widgets/qsplitter.cpp
@@ -230,8 +230,7 @@ QSize QSplitterHandle::sizeHint() const
QStyleOption opt(0);
opt.init(d->s);
opt.state = QStyle::State_None;
- return parentWidget()->style()->sizeFromContents(QStyle::CT_Splitter, &opt, QSize(hw, hw), d->s)
- .expandedTo(QApplication::globalStrut());
+ return parentWidget()->style()->sizeFromContents(QStyle::CT_Splitter, &opt, QSize(hw, hw), d->s);
}
/*!
@@ -1781,40 +1780,6 @@ void QSplitter::setStretchFactor(int index, int stretch)
widget->setSizePolicy(sp);
}
-
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- \relates QSplitter
- \obsolete
-
- Use \a ts << \a{splitter}.saveState() instead.
-*/
-
-QTextStream& operator<<(QTextStream& ts, const QSplitter& splitter)
-{
- ts << splitter.saveState() << Qt::endl;
- return ts;
-}
-
-/*!
- \relates QSplitter
- \obsolete
-
- Use \a ts >> \a{splitter}.restoreState() instead.
-*/
-
-QTextStream& operator>>(QTextStream& ts, QSplitter& splitter)
-{
- QString line = ts.readLine();
- line = line.simplified();
- line.replace(QLatin1Char(' '), QString());
- line = std::move(line).toUpper();
-
- splitter.restoreState(std::move(line).toLatin1());
- return ts;
-}
-#endif
-
QT_END_NAMESPACE
#include "moc_qsplitter.cpp"
diff --git a/src/widgets/widgets/qsplitter.h b/src/widgets/widgets/qsplitter.h
index ec980d9ee3..b7a097ca92 100644
--- a/src/widgets/widgets/qsplitter.h
+++ b/src/widgets/widgets/qsplitter.h
@@ -50,7 +50,6 @@ QT_BEGIN_NAMESPACE
class QSplitterPrivate;
class QTextStream;
-template <typename T> class QList;
class QSplitterHandle;
@@ -129,12 +128,6 @@ private:
friend class QSplitterHandle;
};
-#if QT_DEPRECATED_SINCE(5, 13)
-QT_DEPRECATED_X("Use QSplitter::saveState() instead")
-Q_WIDGETS_EXPORT QTextStream& operator<<(QTextStream&, const QSplitter&);
-QT_DEPRECATED_X("Use QSplitter::restoreState() instead")
-Q_WIDGETS_EXPORT QTextStream& operator>>(QTextStream&, QSplitter&);
-#endif
class QSplitterHandlePrivate;
class Q_WIDGETS_EXPORT QSplitterHandle : public QWidget
diff --git a/src/widgets/widgets/qtabbar.cpp b/src/widgets/widgets/qtabbar.cpp
index 53be917945..670cdeb345 100644
--- a/src/widgets/widgets/qtabbar.cpp
+++ b/src/widgets/widgets/qtabbar.cpp
@@ -52,7 +52,9 @@
#if QT_CONFIG(tabwidget)
#include "qtabwidget.h"
#endif
+#if QT_CONFIG(tooltip)
#include "qtooltip.h"
+#endif
#if QT_CONFIG(whatsthis)
#include "qwhatsthis.h"
#endif
@@ -1280,7 +1282,7 @@ void QTabBar::setTabIcon(int index, const QIcon & icon)
}
}
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
/*!
Sets the tool tip of the tab at position \a index to \a tip.
*/
@@ -1302,7 +1304,7 @@ QString QTabBar::tabToolTip(int index) const
return tab->toolTip;
return QString();
}
-#endif // QT_NO_TOOLTIP
+#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(whatsthis)
/*!
@@ -1502,8 +1504,7 @@ QSize QTabBar::sizeHint() const
if (d->tabList.at(i).visible)
r = r.united(d->tabList.at(i).maxRect);
}
- QSize sz = QApplication::globalStrut();
- return r.size().expandedTo(sz);
+ return r.size();
}
/*!\reimp
@@ -1519,7 +1520,7 @@ QSize QTabBar::minimumSizeHint() const
if (d->tabList.at(i).visible)
r = r.united(d->tabList.at(i).minRect);
}
- return r.size().expandedTo(QApplication::globalStrut());
+ return r.size();
}
if (verticalTabs(d->shape))
return QSize(sizeHint().width(), d->rightB->sizeHint().height() * 2 + 75);
@@ -1679,8 +1680,9 @@ void QTabBar::hideEvent(QHideEvent *)
bool QTabBar::event(QEvent *event)
{
Q_D(QTabBar);
- if (event->type() == QEvent::HoverMove
- || event->type() == QEvent::HoverEnter) {
+ switch (event->type()) {
+ case QEvent::HoverMove:
+ case QEvent::HoverEnter: {
QHoverEvent *he = static_cast<QHoverEvent *>(event);
if (!d->hoverRect.contains(he->pos())) {
QRect oldHoverRect = d->hoverRect;
@@ -1703,28 +1705,32 @@ bool QTabBar::event(QEvent *event)
update(d->hoverRect);
}
return true;
- } else if (event->type() == QEvent::HoverLeave) {
+ }
+ case QEvent::HoverLeave: {
QRect oldHoverRect = d->hoverRect;
d->hoverIndex = -1;
d->hoverRect = QRect();
update(oldHoverRect);
return true;
-#ifndef QT_NO_TOOLTIP
- } else if (event->type() == QEvent::ToolTip) {
+ }
+#if QT_CONFIG(tooltip)
+ case QEvent::ToolTip:
if (const QTabBarPrivate::Tab *tab = d->at(tabAt(static_cast<QHelpEvent*>(event)->pos()))) {
if (!tab->toolTip.isEmpty()) {
QToolTip::showText(static_cast<QHelpEvent*>(event)->globalPos(), tab->toolTip, this);
return true;
}
}
-#endif // QT_NO_TOOLTIP
+ break;
+#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(whatsthis)
- } else if (event->type() == QEvent::QueryWhatsThis) {
+ case QEvent::QEvent::QueryWhatsThis: {
const QTabBarPrivate::Tab *tab = d->at(d->indexAtPos(static_cast<QHelpEvent*>(event)->pos()));
if (!tab || tab->whatsThis.isEmpty())
event->ignore();
return true;
- } else if (event->type() == QEvent::WhatsThis) {
+ }
+ case QEvent::WhatsThis:
if (const QTabBarPrivate::Tab *tab = d->at(d->indexAtPos(static_cast<QHelpEvent*>(event)->pos()))) {
if (!tab->whatsThis.isEmpty()) {
QWhatsThis::showText(static_cast<QHelpEvent*>(event)->globalPos(),
@@ -1732,9 +1738,11 @@ bool QTabBar::event(QEvent *event)
return true;
}
}
+ break;
#endif // QT_CONFIG(whatsthis)
#ifndef QT_NO_SHORTCUT
- } else if (event->type() == QEvent::Shortcut) {
+
+ case QEvent::Shortcut: {
QShortcutEvent *se = static_cast<QShortcutEvent *>(event);
for (int i = 0; i < d->tabList.count(); ++i) {
const QTabBarPrivate::Tab *tab = &d->tabList.at(i);
@@ -1743,22 +1751,19 @@ bool QTabBar::event(QEvent *event)
return true;
}
}
+ }
+ break;
#endif
- } else if (event->type() == QEvent::MouseButtonDblClick) { // ### fixme Qt 6: move to mouseDoubleClickEvent(), here for BC reasons.
- const QPoint pos = static_cast<const QMouseEvent *>(event)->pos();
- const bool isEventInCornerButtons = (!d->leftB->isHidden() && d->leftB->geometry().contains(pos))
- || (!d->rightB->isHidden() && d->rightB->geometry().contains(pos));
- if (!isEventInCornerButtons)
- emit tabBarDoubleClicked(tabAt(pos));
- } else if (event->type() == QEvent::Move) {
+ case QEvent::Move:
d->updateMacBorderMetrics();
- return QWidget::event(event);
-
+ break;
#if QT_CONFIG(draganddrop)
- } else if (event->type() == QEvent::DragEnter) {
+
+ case QEvent::DragEnter:
if (d->changeCurrentOnDrag)
event->accept();
- } else if (event->type() == QEvent::DragMove) {
+ break;
+ case QEvent::DragMove:
if (d->changeCurrentOnDrag) {
const int tabIndex = tabAt(static_cast<QDragMoveEvent *>(event)->pos());
if (isTabEnabled(tabIndex) && d->switchTabCurrentIndex != tabIndex) {
@@ -1769,11 +1774,17 @@ bool QTabBar::event(QEvent *event)
}
event->ignore();
}
- } else if (event->type() == QEvent::DragLeave || event->type() == QEvent::Drop) {
+ break;
+ case QEvent::DragLeave:
+ case QEvent::Drop:
d->killSwitchTabTimer();
event->ignore();
+ break;
#endif
+ default:
+ break;
}
+
return QWidget::event(event);
}
@@ -2307,6 +2318,20 @@ void QTabBar::mouseReleaseEvent(QMouseEvent *event)
/*!\reimp
*/
+void QTabBar::mouseDoubleClickEvent(QMouseEvent *event)
+{
+ Q_D(QTabBar);
+ const QPoint pos = event->pos();
+ const bool isEventInCornerButtons = (!d->leftB->isHidden() && d->leftB->geometry().contains(pos))
+ || (!d->rightB->isHidden() && d->rightB->geometry().contains(pos));
+ if (!isEventInCornerButtons)
+ emit tabBarDoubleClicked(tabAt(pos));
+
+ mousePressEvent(event);
+}
+
+/*!\reimp
+ */
void QTabBar::keyPressEvent(QKeyEvent *event)
{
Q_D(QTabBar);
@@ -2762,7 +2787,7 @@ CloseButton::CloseButton(QWidget *parent)
#ifndef QT_NO_CURSOR
setCursor(Qt::ArrowCursor);
#endif
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
setToolTip(tr("Close Tab"));
#endif
resize(sizeHint());
diff --git a/src/widgets/widgets/qtabbar.h b/src/widgets/widgets/qtabbar.h
index f3cd914277..cf98834853 100644
--- a/src/widgets/widgets/qtabbar.h
+++ b/src/widgets/widgets/qtabbar.h
@@ -120,7 +120,7 @@ public:
Qt::TextElideMode elideMode() const;
void setElideMode(Qt::TextElideMode mode);
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
void setTabToolTip(int index, const QString &tip);
QString tabToolTip(int index) const;
#endif
@@ -202,9 +202,10 @@ protected:
void showEvent(QShowEvent *) override;
void hideEvent(QHideEvent *) override;
void paintEvent(QPaintEvent *) override;
- void mousePressEvent (QMouseEvent *) override;
- void mouseMoveEvent (QMouseEvent *) override;
- void mouseReleaseEvent (QMouseEvent *) override;
+ void mousePressEvent(QMouseEvent *) override;
+ void mouseMoveEvent(QMouseEvent *) override;
+ void mouseReleaseEvent(QMouseEvent *) override;
+ void mouseDoubleClickEvent(QMouseEvent *) override;
#if QT_CONFIG(wheelevent)
void wheelEvent(QWheelEvent *event) override;
#endif
diff --git a/src/widgets/widgets/qtabbar_p.h b/src/widgets/widgets/qtabbar_p.h
index ac4cbd32a8..63a80d687c 100644
--- a/src/widgets/widgets/qtabbar_p.h
+++ b/src/widgets/widgets/qtabbar_p.h
@@ -117,7 +117,7 @@ public:
bool visible;
int shortcutId;
QString text;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
QString toolTip;
#endif
#if QT_CONFIG(whatsthis)
diff --git a/src/widgets/widgets/qtabwidget.cpp b/src/widgets/widgets/qtabwidget.cpp
index a19dacda52..115a557e52 100644
--- a/src/widgets/widgets/qtabwidget.cpp
+++ b/src/widgets/widgets/qtabwidget.cpp
@@ -904,8 +904,7 @@ QSize QTabWidget::sizeHint() const
QSize sz = basicSize(d->pos == North || d->pos == South, lc, rc, s, t);
- return style()->sizeFromContents(QStyle::CT_TabWidget, &opt, sz, this)
- .expandedTo(QApplication::globalStrut());
+ return style()->sizeFromContents(QStyle::CT_TabWidget, &opt, sz, this);
}
@@ -938,8 +937,7 @@ QSize QTabWidget::minimumSizeHint() const
initStyleOption(&opt);
opt.palette = palette();
opt.state = QStyle::State_None;
- return style()->sizeFromContents(QStyle::CT_TabWidget, &opt, sz, this)
- .expandedTo(QApplication::globalStrut());
+ return style()->sizeFromContents(QStyle::CT_TabWidget, &opt, sz, this);
}
/*!
@@ -953,8 +951,7 @@ int QTabWidget::heightForWidth(int width) const
opt.state = QStyle::State_None;
QSize zero(0,0);
- const QSize padding = style()->sizeFromContents(QStyle::CT_TabWidget, &opt, zero, this)
- .expandedTo(QApplication::globalStrut());
+ const QSize padding = style()->sizeFromContents(QStyle::CT_TabWidget, &opt, zero, this);
QSize lc(0, 0), rc(0, 0);
if (d->leftCornerWidget)
@@ -984,7 +981,7 @@ int QTabWidget::heightForWidth(int width) const
QSize s(stackWidth, stackHeight);
QSize contentSize = basicSize(tabIsHorizontal, lc, rc, s, t);
- return (contentSize + padding).expandedTo(QApplication::globalStrut()).height();
+ return (contentSize + padding).height();
}
@@ -1212,7 +1209,7 @@ int QTabWidget::count() const
return d->tabs->count();
}
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
/*!
Sets the tab tool tip for the page at position \a index to \a tip.
@@ -1235,7 +1232,7 @@ QString QTabWidget::tabToolTip(int index) const
Q_D(const QTabWidget);
return d->tabs->tabToolTip(index);
}
-#endif // QT_NO_TOOLTIP
+#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(whatsthis)
/*!
diff --git a/src/widgets/widgets/qtabwidget.h b/src/widgets/widgets/qtabwidget.h
index ceec3f8dd8..b61a02bdc6 100644
--- a/src/widgets/widgets/qtabwidget.h
+++ b/src/widgets/widgets/qtabwidget.h
@@ -91,7 +91,7 @@ public:
QIcon tabIcon(int index) const;
void setTabIcon(int index, const QIcon & icon);
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
void setTabToolTip(int index, const QString & tip);
QString tabToolTip(int index) const;
#endif
diff --git a/src/widgets/widgets/qtextbrowser.cpp b/src/widgets/widgets/qtextbrowser.cpp
index 78fde94fad..dac7a9a608 100644
--- a/src/widgets/widgets/qtextbrowser.cpp
+++ b/src/widgets/widgets/qtextbrowser.cpp
@@ -156,11 +156,6 @@ public:
{
Q_Q(QTextBrowser);
emit q->highlighted(url);
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- emit q->highlighted(url.toString());
-#endif
}
};
Q_DECLARE_TYPEINFO(QTextBrowserPrivate::HistoryEntry, Q_MOVABLE_TYPE);
@@ -927,16 +922,6 @@ void QTextBrowser::doSetSource(const QUrl &url, QTextDocument::ResourceType type
anchor is passed in \a link.
*/
-/*! \fn void QTextBrowser::highlighted(const QString &link)
- \overload
- \obsolete
-
- Convenience signal that allows connecting to a slot
- that takes just a QString, like for example QStatusBar's
- message().
-*/
-
-
/*!
\fn void QTextBrowser::anchorClicked(const QUrl &link)
diff --git a/src/widgets/widgets/qtextbrowser.h b/src/widgets/widgets/qtextbrowser.h
index 4b3ec491ee..7f02999b02 100644
--- a/src/widgets/widgets/qtextbrowser.h
+++ b/src/widgets/widgets/qtextbrowser.h
@@ -107,10 +107,6 @@ Q_SIGNALS:
void historyChanged();
void sourceChanged(const QUrl &);
void highlighted(const QUrl &);
-#if QT_DEPRECATED_SINCE(5, 15)
- QT_DEPRECATED_VERSION_X_5_15("Use QTextBrowser::highlighted(QUrl) instead")
- void highlighted(const QString &);
-#endif
void anchorClicked(const QUrl &);
protected:
diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp
index 8ddda78f7d..9a02721e61 100644
--- a/src/widgets/widgets/qtextedit.cpp
+++ b/src/widgets/widgets/qtextedit.cpp
@@ -2053,27 +2053,6 @@ void QTextEdit::setOverwriteMode(bool overwrite)
d->control->setOverwriteMode(overwrite);
}
-#if QT_DEPRECATED_SINCE(5, 10)
-/*!
- \property QTextEdit::tabStopWidth
- \brief the tab stop width in pixels
- \since 4.1
- \deprecated in Qt 5.10. Use tabStopDistance instead.
-
- By default, this property contains a value of 80 pixels.
-*/
-
-int QTextEdit::tabStopWidth() const
-{
- return qRound(tabStopDistance());
-}
-
-void QTextEdit::setTabStopWidth(int width)
-{
- setTabStopDistance(width);
-}
-#endif
-
/*!
\property QTextEdit::tabStopDistance
\brief the tab stop distance in pixels
@@ -2610,27 +2589,6 @@ bool QTextEdit::find(const QString &exp, QTextDocument::FindFlags options)
}
/*!
- \fn bool QTextEdit::find(const QRegExp &exp, QTextDocument::FindFlags options)
-
- \since 5.3
- \overload
-
- Finds the next occurrence, matching the regular expression, \a exp, using the given
- \a options. The QTextDocument::FindCaseSensitively option is ignored for this overload,
- use QRegExp::caseSensitivity instead.
-
- Returns \c true if a match was found and changes the cursor to select the match;
- otherwise returns \c false.
-*/
-#ifndef QT_NO_REGEXP
-bool QTextEdit::find(const QRegExp &exp, QTextDocument::FindFlags options)
-{
- Q_D(QTextEdit);
- return d->control->find(exp, options);
-}
-#endif
-
-/*!
\fn bool QTextEdit::find(const QRegularExpression &exp, QTextDocument::FindFlags options)
\since 5.13
diff --git a/src/widgets/widgets/qtextedit.h b/src/widgets/widgets/qtextedit.h
index 5c8a3c7793..91b7d05d9f 100644
--- a/src/widgets/widgets/qtextedit.h
+++ b/src/widgets/widgets/qtextedit.h
@@ -79,9 +79,6 @@ class Q_WIDGETS_EXPORT QTextEdit : public QAbstractScrollArea
#endif
Q_PROPERTY(QString plainText READ toPlainText WRITE setPlainText DESIGNABLE false)
Q_PROPERTY(bool overwriteMode READ overwriteMode WRITE setOverwriteMode)
-#if QT_DEPRECATED_SINCE(5, 10)
- Q_PROPERTY(int tabStopWidth READ tabStopWidth WRITE setTabStopWidth)
-#endif
Q_PROPERTY(qreal tabStopDistance READ tabStopDistance WRITE setTabStopDistance)
Q_PROPERTY(bool acceptRichText READ acceptRichText WRITE setAcceptRichText)
Q_PROPERTY(int cursorWidth READ cursorWidth WRITE setCursorWidth)
@@ -166,9 +163,6 @@ public:
void setWordWrapMode(QTextOption::WrapMode policy);
bool find(const QString &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags());
-#ifndef QT_NO_REGEXP
- bool find(const QRegExp &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags());
-#endif
#if QT_CONFIG(regularexpression)
bool find(const QRegularExpression &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags());
#endif
@@ -198,11 +192,6 @@ public:
bool overwriteMode() const;
void setOverwriteMode(bool overwrite);
-#if QT_DEPRECATED_SINCE(5, 10)
- QT_DEPRECATED int tabStopWidth() const;
- QT_DEPRECATED void setTabStopWidth(int width);
-#endif
-
qreal tabStopDistance() const;
void setTabStopDistance(qreal distance);
diff --git a/src/widgets/widgets/qtoolbar.cpp b/src/widgets/widgets/qtoolbar.cpp
index 0912cd55d3..9c63f98a73 100644
--- a/src/widgets/widgets/qtoolbar.cpp
+++ b/src/widgets/widgets/qtoolbar.cpp
@@ -961,7 +961,7 @@ QAction *QToolBar::actionAt(const QPoint &p) const
void QToolBar::actionEvent(QActionEvent *event)
{
Q_D(QToolBar);
- QAction *action = event->action();
+ auto action = static_cast<QAction *>(event->action());
QWidgetAction *widgetAction = qobject_cast<QWidgetAction *>(action);
switch (event->type()) {
@@ -1073,11 +1073,12 @@ static bool waitForPopup(QToolBar *tb, QWidget *popup)
if (menu == nullptr)
return false;
- QAction *action = menu->menuAction();
- QList<QWidget*> widgets = action->associatedWidgets();
- for (int i = 0; i < widgets.count(); ++i) {
- if (waitForPopup(tb, widgets.at(i)))
- return true;
+ const QAction *action = menu->menuAction();
+ for (auto object : action->associatedObjects()) {
+ if (QWidget *widget = qobject_cast<QWidget*>(object)) {
+ if (waitForPopup(tb, widget))
+ return true;
+ }
}
return false;
diff --git a/src/widgets/widgets/qtoolbar.h b/src/widgets/widgets/qtoolbar.h
index 6aaf59cafd..220b30abbe 100644
--- a/src/widgets/widgets/qtoolbar.h
+++ b/src/widgets/widgets/qtoolbar.h
@@ -41,7 +41,7 @@
#define QDYNAMICTOOLBAR_H
#include <QtWidgets/qtwidgetsglobal.h>
-#include <QtWidgets/qaction.h>
+#include <QtGui/qaction.h>
#include <QtWidgets/qwidget.h>
QT_REQUIRE_CONFIG(toolbar);
diff --git a/src/widgets/widgets/qtoolbar_p.h b/src/widgets/widgets/qtoolbar_p.h
index 79e693acbf..07f1af3fe0 100644
--- a/src/widgets/widgets/qtoolbar_p.h
+++ b/src/widgets/widgets/qtoolbar_p.h
@@ -53,7 +53,7 @@
#include <QtWidgets/private/qtwidgetsglobal_p.h>
#include "qtoolbar.h"
-#include "QtWidgets/qaction.h"
+#include "QtGui/qaction.h"
#include "private/qwidget_p.h"
#include <QtCore/qbasictimer.h>
diff --git a/src/widgets/widgets/qtoolbarlayout.cpp b/src/widgets/widgets/qtoolbarlayout.cpp
index 4ffa17ecd7..e1c0df31d1 100644
--- a/src/widgets/widgets/qtoolbarlayout.cpp
+++ b/src/widgets/widgets/qtoolbarlayout.cpp
@@ -207,7 +207,7 @@ void QToolBarLayout::insertAction(int index, QAction *action)
}
}
-int QToolBarLayout::indexOf(QAction *action) const
+int QToolBarLayout::indexOf(const QAction *action) const
{
for (int i = 0; i < items.count(); ++i) {
if (items.at(i)->action == action)
diff --git a/src/widgets/widgets/qtoolbarlayout_p.h b/src/widgets/widgets/qtoolbarlayout_p.h
index b5dc121b93..13763840e2 100644
--- a/src/widgets/widgets/qtoolbarlayout_p.h
+++ b/src/widgets/widgets/qtoolbarlayout_p.h
@@ -96,7 +96,7 @@ public:
QSize sizeHint() const override;
void insertAction(int index, QAction *action);
- int indexOf(QAction *action) const;
+ int indexOf(const QAction *action) const;
using QLayout::indexOf; // bring back the hidden members
bool layoutActions(const QSize &size);
diff --git a/src/widgets/widgets/qtoolbox.cpp b/src/widgets/widgets/qtoolbox.cpp
index 4767394842..57d26bb6ee 100644
--- a/src/widgets/widgets/qtoolbox.cpp
+++ b/src/widgets/widgets/qtoolbox.cpp
@@ -47,7 +47,9 @@
#include <qscrollarea.h>
#include <qstyle.h>
#include <qstyleoption.h>
+#if QT_CONFIG(tooltip)
#include <qtooltip.h>
+#endif
#include <qabstractbutton.h>
#include <private/qmemory_p.h>
@@ -96,7 +98,7 @@ public:
inline void setText(const QString &text) { button->setText(text); }
inline void setIcon(const QIcon &is) { button->setIcon(is); }
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
inline void setToolTip(const QString &tip) { button->setToolTip(tip); }
inline QString toolTip() const { return button->toolTip(); }
#endif
@@ -189,8 +191,7 @@ QSize QToolBoxButton::sizeHint() const
}
QSize textSize = fontMetrics().size(Qt::TextShowMnemonic, text()) + QSize(0, 8);
- QSize total(iconSize.width() + textSize.width(), qMax(iconSize.height(), textSize.height()));
- return total.expandedTo(QApplication::globalStrut());
+ return QSize(iconSize.width() + textSize.width(), qMax(iconSize.height(), textSize.height()));
}
QSize QToolBoxButton::minimumSizeHint() const
@@ -639,7 +640,7 @@ void QToolBox::setItemIcon(int index, const QIcon &icon)
c->setIcon(icon);
}
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
/*!
Sets the tooltip of the item at position \a index to \a toolTip.
*/
@@ -651,7 +652,7 @@ void QToolBox::setItemToolTip(int index, const QString &toolTip)
if (c)
c->setToolTip(toolTip);
}
-#endif // QT_NO_TOOLTIP
+#endif // QT_CONFIG(tooltip)
/*!
Returns \c true if the item at position \a index is enabled; otherwise returns \c false.
@@ -688,7 +689,7 @@ QIcon QToolBox::itemIcon(int index) const
return (c ? c->icon() : QIcon());
}
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
/*!
Returns the tooltip of the item at position \a index, or an
empty string if \a index is out of range.
@@ -700,7 +701,7 @@ QString QToolBox::itemToolTip(int index) const
const QToolBoxPrivate::Page *c = d->page(index);
return (c ? c->toolTip() : QString());
}
-#endif // QT_NO_TOOLTIP
+#endif // QT_CONFIG(tooltip)
/*! \reimp */
void QToolBox::showEvent(QShowEvent *e)
diff --git a/src/widgets/widgets/qtoolbox.h b/src/widgets/widgets/qtoolbox.h
index 2796631b94..d12d4dcfec 100644
--- a/src/widgets/widgets/qtoolbox.h
+++ b/src/widgets/widgets/qtoolbox.h
@@ -76,7 +76,7 @@ public:
void setItemIcon(int index, const QIcon &icon);
QIcon itemIcon(int index) const;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
void setItemToolTip(int index, const QString &toolTip);
QString itemToolTip(int index) const;
#endif
diff --git a/src/widgets/widgets/qtoolbutton.cpp b/src/widgets/widgets/qtoolbutton.cpp
index 314c6ab40c..e8cb502650 100644
--- a/src/widgets/widgets/qtoolbutton.cpp
+++ b/src/widgets/widgets/qtoolbutton.cpp
@@ -49,7 +49,9 @@
#include <qpointer.h>
#include <qstyle.h>
#include <qstyleoption.h>
+#if QT_CONFIG(tooltip)
#include <qtooltip.h>
+#endif
#if QT_CONFIG(mainwindow)
#include <qmainwindow.h>
#endif
@@ -369,8 +371,7 @@ QSize QToolButton::sizeHint() const
if (d->popupMode == MenuButtonPopup)
w += style()->pixelMetric(QStyle::PM_MenuButtonIndicator, &opt, this);
- d->sizeHint = style()->sizeFromContents(QStyle::CT_ToolButton, &opt, QSize(w, h), this).
- expandedTo(QApplication::globalStrut());
+ d->sizeHint = style()->sizeFromContents(QStyle::CT_ToolButton, &opt, QSize(w, h), this);
return d->sizeHint;
}
@@ -466,7 +467,7 @@ void QToolButton::paintEvent(QPaintEvent *)
void QToolButton::actionEvent(QActionEvent *event)
{
Q_D(QToolButton);
- QAction *action = event->action();
+ auto action = static_cast<QAction *>(event->action());
switch (event->type()) {
case QEvent::ActionChanged:
if (action == d->defaultAction)
@@ -945,7 +946,7 @@ void QToolButton::setDefaultAction(QAction *action)
buttonText.replace(QLatin1String("&"), QLatin1String("&&"));
setText(buttonText);
setIcon(action->icon());
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
setToolTip(action->toolTip());
#endif
#if QT_CONFIG(statustip)
diff --git a/src/widgets/widgets/qwidgetlinecontrol_p.h b/src/widgets/widgets/qwidgetlinecontrol_p.h
index a8fffd23dc..357b541362 100644
--- a/src/widgets/widgets/qwidgetlinecontrol_p.h
+++ b/src/widgets/widgets/qwidgetlinecontrol_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
@@ -354,11 +354,8 @@ public:
void setPasswordMaskDelay(int delay) { m_passwordMaskDelay = delay; }
Qt::LayoutDirection layoutDirection() const {
- if (m_layoutDirection == Qt::LayoutDirectionAuto) {
- if (m_text.isEmpty())
- return QGuiApplication::inputMethod()->inputDirection();
+ if (m_layoutDirection == Qt::LayoutDirectionAuto && !m_text.isEmpty())
return m_text.isRightToLeft() ? Qt::RightToLeft : Qt::LeftToRight;
- }
return m_layoutDirection;
}
void setLayoutDirection(Qt::LayoutDirection direction)
diff --git a/src/widgets/widgets/qwidgetresizehandler.cpp b/src/widgets/widgets/qwidgetresizehandler.cpp
index 9dbba12aba..43aa4c7988 100644
--- a/src/widgets/widgets/qwidgetresizehandler.cpp
+++ b/src/widgets/widgets/qwidgetresizehandler.cpp
@@ -58,46 +58,37 @@ QT_BEGIN_NAMESPACE
static bool resizeHorizontalDirectionFixed = false;
static bool resizeVerticalDirectionFixed = false;
-// ### fixme: Qt 6: No longer export QWidgetResizeHandler and remove "Move"
-// functionality. Currently, only the resize functionality is used by QDockWidget.
-// Historically, the class was used in Qt 3's QWorkspace (predecessor to QMdiArea).
-
QWidgetResizeHandler::QWidgetResizeHandler(QWidget *parent, QWidget *cw)
: QObject(parent), widget(parent), childWidget(cw ? cw : parent),
- fw(0), extrahei(0), buttonDown(false), moveResizeMode(false), sizeprotect(true), movingEnabled(true)
+ fw(0), extrahei(0), buttonDown(false), active(false)
{
mode = Nowhere;
widget->setMouseTracking(true);
QFrame *frame = qobject_cast<QFrame*>(widget);
range = frame ? frame->frameWidth() : RANGE;
range = qMax(RANGE, range);
- activeForMove = activeForResize = true;
+ enabled = true;
widget->installEventFilter(this);
}
-void QWidgetResizeHandler::setActive(Action ac, bool b)
+void QWidgetResizeHandler::setEnabled(bool b)
{
- if (ac & Move)
- activeForMove = b;
- if (ac & Resize)
- activeForResize = b;
+ if (b == enabled)
+ return;
- if (!isActive())
+ enabled = b;
+ if (!enabled)
setMouseCursor(Nowhere);
}
-bool QWidgetResizeHandler::isActive(Action ac) const
+bool QWidgetResizeHandler::isEnabled() const
{
- bool b = false;
- if (ac & Move) b = activeForMove;
- if (ac & Resize) b |= activeForResize;
-
- return b;
+ return enabled;
}
bool QWidgetResizeHandler::eventFilter(QObject *o, QEvent *ee)
{
- if (!isActive()
+ if (!isEnabled()
|| (ee->type() != QEvent::MouseButtonPress
&& ee->type() != QEvent::MouseButtonRelease
&& ee->type() != QEvent::MouseMove
@@ -126,35 +117,24 @@ bool QWidgetResizeHandler::eventFilter(QObject *o, QEvent *ee)
if (e->button() == Qt::LeftButton) {
buttonDown = false;
emit activate();
- bool me = movingEnabled;
- movingEnabled = (me && o == widget);
mouseMoveEvent(e);
- movingEnabled = me;
buttonDown = true;
moveOffset = widget->mapFromGlobal(e->globalPos());
invertedMoveOffset = widget->rect().bottomRight() - moveOffset;
- if (mode == Center) {
- if (movingEnabled)
- return true;
- } else {
+ if (mode != Center)
return true;
- }
}
} break;
case QEvent::MouseButtonRelease:
if (w->isMaximized())
break;
if (static_cast<QMouseEvent *>(ee)->button() == Qt::LeftButton) {
- moveResizeMode = false;
+ active = false;
buttonDown = false;
widget->releaseMouse();
widget->releaseKeyboard();
- if (mode == Center) {
- if (movingEnabled)
- return true;
- } else {
+ if (mode != Center)
return true;
- }
}
break;
case QEvent::MouseMove: {
@@ -162,16 +142,9 @@ bool QWidgetResizeHandler::eventFilter(QObject *o, QEvent *ee)
break;
QMouseEvent *e = static_cast<QMouseEvent *>(ee);
buttonDown = buttonDown && (e->buttons() & Qt::LeftButton); // safety, state machine broken!
- bool me = movingEnabled;
- movingEnabled = (me && o == widget && (buttonDown || moveResizeMode));
mouseMoveEvent(e);
- movingEnabled = me;
- if (mode == Center) {
- if (movingEnabled)
- return true;
- } else {
+ if (mode != Center)
return true;
- }
} break;
case QEvent::KeyPress:
keyPressEvent(static_cast<QKeyEvent *>(ee));
@@ -193,7 +166,7 @@ bool QWidgetResizeHandler::eventFilter(QObject *o, QEvent *ee)
void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
{
QPoint pos = widget->mapFromGlobal(e->globalPos());
- if (!moveResizeMode && !buttonDown) {
+ if (!active && !buttonDown) {
if (pos.y() <= range && pos.x() <= range)
mode = TopLeft;
else if (pos.y() >= widget->height()-range && pos.x() >= widget->width()-range)
@@ -215,7 +188,7 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
else
mode = Nowhere;
- if (widget->isMinimized() || !isActive(Resize))
+ if (widget->isMinimized() || !isEnabled())
mode = Center;
#ifndef QT_NO_CURSOR
setMouseCursor(mode);
@@ -223,7 +196,7 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
return;
}
- if (mode == Center && !movingEnabled)
+ if (mode == Center)
return;
if (widget->testAttribute(Qt::WA_WState_ConfigPending))
@@ -237,9 +210,9 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
globalPos.rx() = 0;
if (globalPos.y() < 0)
globalPos.ry() = 0;
- if (sizeprotect && globalPos.x() > widget->parentWidget()->width())
+ if (globalPos.x() > widget->parentWidget()->width())
globalPos.rx() = widget->parentWidget()->width();
- if (sizeprotect && globalPos.y() > widget->parentWidget()->height())
+ if (globalPos.y() > widget->parentWidget()->height())
globalPos.ry() = widget->parentWidget()->height();
}
@@ -300,9 +273,6 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
case Right:
geom = QRect(widget->geometry().topLeft(), QPoint(p.x(), widget->geometry().bottom())) ;
break;
- case Center:
- geom.moveTopLeft(pp);
- break;
default:
break;
}
@@ -314,10 +284,7 @@ void QWidgetResizeHandler::mouseMoveEvent(QMouseEvent *e)
if (geom != widget->geometry() &&
(widget->isWindow() || widget->parentWidget()->rect().intersects(geom))) {
- if (mode == Center)
- widget->move(geom.topLeft());
- else
- widget->setGeometry(geom);
+ widget->setGeometry(geom);
}
}
@@ -361,7 +328,7 @@ void QWidgetResizeHandler::setMouseCursor(MousePosition m)
void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
{
- if (!isMove() && !isResize())
+ if (!isResizing())
return;
bool is_control = e->modifiers() & Qt::ControlModifier;
int delta = is_control?1:8;
@@ -378,7 +345,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
invertedMoveOffset.rx() -= delta;
}
}
- if (isResize() && !resizeHorizontalDirectionFixed) {
+ if (isResizing() && !resizeHorizontalDirectionFixed) {
resizeHorizontalDirectionFixed = true;
if (mode == BottomRight)
mode = BottomLeft;
@@ -403,7 +370,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
invertedMoveOffset.rx() -= delta;
}
}
- if (isResize() && !resizeHorizontalDirectionFixed) {
+ if (isResizing() && !resizeHorizontalDirectionFixed) {
resizeHorizontalDirectionFixed = true;
if (mode == BottomLeft)
mode = BottomRight;
@@ -428,7 +395,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
invertedMoveOffset.ry() -= delta;
}
}
- if (isResize() && !resizeVerticalDirectionFixed) {
+ if (isResizing() && !resizeVerticalDirectionFixed) {
resizeVerticalDirectionFixed = true;
if (mode == BottomLeft)
mode = TopLeft;
@@ -453,7 +420,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
invertedMoveOffset.ry() -= delta;
}
}
- if (isResize() && !resizeVerticalDirectionFixed) {
+ if (isResizing() && !resizeVerticalDirectionFixed) {
resizeVerticalDirectionFixed = true;
if (mode == TopLeft)
mode = BottomLeft;
@@ -471,7 +438,7 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
case Qt::Key_Return:
case Qt::Key_Enter:
case Qt::Key_Escape:
- moveResizeMode = false;
+ active = false;
widget->releaseMouse();
widget->releaseKeyboard();
buttonDown = false;
@@ -485,10 +452,10 @@ void QWidgetResizeHandler::keyPressEvent(QKeyEvent * e)
void QWidgetResizeHandler::doResize()
{
- if (!activeForResize)
+ if (!enabled)
return;
- moveResizeMode = true;
+ active = true;
moveOffset = widget->mapFromGlobal(QCursor::pos());
if (moveOffset.x() < widget->width()/2) {
if (moveOffset.y() < widget->height()/2)
@@ -513,23 +480,6 @@ void QWidgetResizeHandler::doResize()
resizeVerticalDirectionFixed = false;
}
-void QWidgetResizeHandler::doMove()
-{
- if (!activeForMove)
- return;
-
- mode = Center;
- moveResizeMode = true;
- moveOffset = widget->mapFromGlobal(QCursor::pos());
- invertedMoveOffset = widget->rect().bottomRight() - moveOffset;
-#ifndef QT_NO_CURSOR
- widget->grabMouse(Qt::SizeAllCursor);
-#else
- widget->grabMouse();
-#endif
- widget->grabKeyboard();
-}
-
QT_END_NAMESPACE
#include "moc_qwidgetresizehandler_p.cpp"
diff --git a/src/widgets/widgets/qwidgetresizehandler_p.h b/src/widgets/widgets/qwidgetresizehandler_p.h
index df3ac7cb8a..2390ba074a 100644
--- a/src/widgets/widgets/qwidgetresizehandler_p.h
+++ b/src/widgets/widgets/qwidgetresizehandler_p.h
@@ -62,34 +62,22 @@ QT_BEGIN_NAMESPACE
class QMouseEvent;
class QKeyEvent;
-class Q_WIDGETS_EXPORT QWidgetResizeHandler : public QObject
+class QWidgetResizeHandler : public QObject
{
Q_OBJECT
public:
- enum Action {
- Move = 0x01,
- Resize = 0x02,
- Any = Move|Resize
- };
-
explicit QWidgetResizeHandler(QWidget *parent, QWidget *cw = nullptr);
- void setActive(bool b) { setActive(Any, b); }
- void setActive(Action ac, bool b);
- bool isActive() const { return isActive(Any); }
- bool isActive(Action ac) const;
- void setMovingEnabled(bool b) { movingEnabled = b; }
- bool isMovingEnabled() const { return movingEnabled; }
+ void setEnabled(bool b);
+ bool isEnabled() const;
bool isButtonDown() const { return buttonDown; }
void setExtraHeight(int h) { extrahei = h; }
- void setSizeProtection(bool b) { sizeprotect = b; }
void setFrameWidth(int w) { fw = w; }
void doResize();
- void doMove();
Q_SIGNALS:
void activate();
@@ -117,19 +105,13 @@ private:
int fw;
int extrahei;
int range;
- uint buttonDown :1;
- uint moveResizeMode :1;
- uint activeForResize :1;
- uint sizeprotect :1;
- uint movingEnabled :1;
- uint activeForMove :1;
+ uint buttonDown :1;
+ uint active :1;
+ uint enabled :1;
void setMouseCursor(MousePosition m);
- bool isMove() const {
- return moveResizeMode && mode == Center;
- }
- bool isResize() const {
- return moveResizeMode && !isMove();
+ bool isResizing() const {
+ return active && mode != Center;
}
};
diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp
index 2e302e3d9c..e32f779bb0 100644
--- a/src/widgets/widgets/qwidgettextcontrol.cpp
+++ b/src/widgets/widgets/qwidgettextcontrol.cpp
@@ -84,7 +84,9 @@
#include <qurl.h>
#include <qdesktopservices.h>
#include <qinputmethod.h>
+#if QT_CONFIG(tooltip)
#include <qtooltip.h>
+#endif
#include <qstyleoption.h>
#if QT_CONFIG(lineedit)
#include <QtWidgets/qlineedit.h>
@@ -92,7 +94,7 @@
#include <QtGui/qaccessible.h>
#include <QtCore/qmetaobject.h>
-#ifndef QT_NO_SHORTCUT
+#if QT_CONFIG(shortcut)
#include "private/qapplication_p.h"
#include "private/qshortcutmap_p.h"
#include <qkeysequence.h>
@@ -1074,13 +1076,13 @@ void QWidgetTextControl::processEvent(QEvent *e, const QTransform &transform, QW
d->isEnabled = e->isAccepted();
break;
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
case QEvent::ToolTip: {
QHelpEvent *ev = static_cast<QHelpEvent *>(e);
d->showToolTip(ev->globalPos(), transform.map(ev->pos()), contextWidget);
break;
}
-#endif // QT_NO_TOOLTIP
+#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(draganddrop)
case QEvent::DragEnter: {
@@ -2513,7 +2515,7 @@ void QWidgetTextControl::setExtraSelections(const QList<QTextEdit::ExtraSelectio
emit updateRequest(r);
}
- for (QHash<int, int>::iterator it = hash.begin(); it != hash.end(); ++it) {
+ for (auto it = hash.cbegin(); it != hash.cend(); ++it) {
const QAbstractTextDocumentLayout::Selection &esel = d->extraSelections.at(it.value());
QRectF r = selectionRect(esel.cursor);
if (esel.format.boolProperty(QTextFormat::FullWidthSelection)) {
@@ -2948,7 +2950,7 @@ void QWidgetTextControlPrivate::activateLinkUnderCursor(QString href)
emit q_func()->linkActivated(href);
}
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
void QWidgetTextControlPrivate::showToolTip(const QPoint &globalPos, const QPointF &pos, QWidget *contextWidget)
{
const QString toolTip = q_func()->cursorForPosition(pos).charFormat().toolTip();
@@ -2956,7 +2958,7 @@ void QWidgetTextControlPrivate::showToolTip(const QPoint &globalPos, const QPoin
return;
QToolTip::showText(globalPos, toolTip, contextWidget);
}
-#endif // QT_NO_TOOLTIP
+#endif // QT_CONFIG(tooltip)
bool QWidgetTextControlPrivate::isPreediting() const
{
@@ -3146,19 +3148,6 @@ bool QWidgetTextControl::find(const QString &exp, QTextDocument::FindFlags optio
return true;
}
-#ifndef QT_NO_REGEXP
-bool QWidgetTextControl::find(const QRegExp &exp, QTextDocument::FindFlags options)
-{
- Q_D(QWidgetTextControl);
- QTextCursor search = d->doc->find(exp, d->cursor, options);
- if (search.isNull())
- return false;
-
- setTextCursor(search);
- return true;
-}
-#endif
-
#if QT_CONFIG(regularexpression)
bool QWidgetTextControl::find(const QRegularExpression &exp, QTextDocument::FindFlags options)
{
@@ -3437,7 +3426,7 @@ void QTextEditMimeData::setup() const
{
QTextEditMimeData *that = const_cast<QTextEditMimeData *>(this);
#ifndef QT_NO_TEXTHTMLPARSER
- that->setData(QLatin1String("text/html"), fragment.toHtml("utf-8").toUtf8());
+ that->setData(QLatin1String("text/html"), fragment.toHtml().toUtf8());
#endif
#ifndef QT_NO_TEXTODFWRITER
{
diff --git a/src/widgets/widgets/qwidgettextcontrol_p.h b/src/widgets/widgets/qwidgettextcontrol_p.h
index c445ecaf80..89acd1e50c 100644
--- a/src/widgets/widgets/qwidgettextcontrol_p.h
+++ b/src/widgets/widgets/qwidgettextcontrol_p.h
@@ -117,9 +117,6 @@ public:
QTextCharFormat currentCharFormat() const;
bool find(const QString &exp, QTextDocument::FindFlags options = { });
-#ifndef QT_NO_REGEXP
- bool find(const QRegExp &exp, QTextDocument::FindFlags options = { });
-#endif
#if QT_CONFIG(regularexpression)
bool find(const QRegularExpression &exp, QTextDocument::FindFlags options = { });
#endif
diff --git a/src/widgets/widgets/qwidgettextcontrol_p_p.h b/src/widgets/widgets/qwidgettextcontrol_p_p.h
index c77a31bedf..7304b15106 100644
--- a/src/widgets/widgets/qwidgettextcontrol_p_p.h
+++ b/src/widgets/widgets/qwidgettextcontrol_p_p.h
@@ -171,7 +171,7 @@ public:
void activateLinkUnderCursor(QString href = QString());
-#ifndef QT_NO_TOOLTIP
+#if QT_CONFIG(tooltip)
void showToolTip(const QPoint &globalPos, const QPointF &pos, QWidget *contextWidget);
#endif
diff --git a/src/winmain/.prev_CMakeLists.txt b/src/winmain/.prev_CMakeLists.txt
new file mode 100644
index 0000000000..a6077dd467
--- /dev/null
+++ b/src/winmain/.prev_CMakeLists.txt
@@ -0,0 +1,48 @@
+# Generated from winmain.pro.
+
+#####################################################################
+## qtLibraryTarget$$TARGET$$QT_LIBINFIX Module:
+#####################################################################
+
+add_qt_module(qtLibraryTarget$$TARGET$$QT_LIBINFIX
+ STATIC
+ DEFINES
+ QT_NO_FOREACH
+ PUBLIC_LIBRARIES
+ Qt::Core
+)
+
+#### Keys ignored in scope 1:.:.:winmain.pro:<TRUE>:
+# CONFIG = "static"
+# DESTDIR = "$$QT.core.libs"
+# TEMPLATE = "lib"
+# _LOADED = "qt_installs" "qt_targets" "qt_build_paths" "qt_common"
+
+## Scopes:
+#####################################################################
+
+#### Keys ignored in scope 3:.:.:winmain.pro:QT_FEATURE_debug_and_release:
+# CONFIG = "build_all"
+
+#### Keys ignored in scope 4:.:.:winmain.pro:MSVC:
+# QMAKE_CFLAGS_DEBUG = "--Zi" "-Z7"
+
+extend_target(qtLibraryTarget$$TARGET$$QT_LIBINFIX CONDITION mingw
+ DEFINES
+ QT_NEEDS_QMAIN
+)
+
+extend_target(qtLibraryTarget$$TARGET$$QT_LIBINFIX CONDITION WINRT
+ SOURCES
+ qtmain_winrt.cpp
+)
+
+extend_target(qtLibraryTarget$$TARGET$$QT_LIBINFIX CONDITION NOT WINRT
+ SOURCES
+ qtmain_win.cpp
+ LIBRARIES
+ shell32
+)
+
+#### Keys ignored in scope 10:.:.:winmain.pro:else:
+# CONFIG = "-qt"
diff --git a/src/winmain/CMakeLists.txt b/src/winmain/CMakeLists.txt
new file mode 100644
index 0000000000..fb48fec5a3
--- /dev/null
+++ b/src/winmain/CMakeLists.txt
@@ -0,0 +1,28 @@
+# special case begin
+# special case skip regeneration
+if (NOT WIN32)
+ return()
+endif()
+
+qt_add_module(WinMain
+ STATIC
+ NO_SYNC_QT
+ NO_MODULE_HEADERS
+ DEFINES
+ QT_NO_FOREACH
+ INCLUDE_DIRECTORIES
+ $<TARGET_PROPERTY:Qt::Core,INTERFACE_INCLUDE_DIRECTORIES>
+)
+
+qt_extend_target(WinMain CONDITION WINRT
+ SOURCES qtmain_winrt.cpp
+)
+
+qt_extend_target(WinMain CONDITION NOT WINRT
+ SOURCES qtmain_win.cpp
+)
+
+qt_extend_target(WinMain CONDITION MINGW
+ DEFINES QT_NEEDS_QMAIN
+)
+# special case end
diff --git a/src/xml/CMakeLists.txt b/src/xml/CMakeLists.txt
new file mode 100644
index 0000000000..8b79b9df45
--- /dev/null
+++ b/src/xml/CMakeLists.txt
@@ -0,0 +1,34 @@
+# Generated from xml.pro.
+
+#####################################################################
+## Xml Module:
+#####################################################################
+
+qt_add_module(Xml
+ SOURCES
+ dom/qdom.cpp dom/qdom.h dom/qdom_p.h
+ dom/qdomhelpers.cpp dom/qdomhelpers_p.h
+ qtxmlglobal.h
+ sax/qxml.cpp sax/qxml.h sax/qxml_p.h
+ DEFINES
+ QT_NO_FOREACH
+ QT_NO_USING_NAMESPACE
+ LIBRARIES
+ Qt::CorePrivate
+ PUBLIC_LIBRARIES
+ Qt::Core
+ PRIVATE_MODULE_INTERFACE
+ Qt::CorePrivate
+)
+
+## Scopes:
+#####################################################################
+
+qt_extend_target(Xml CONDITION MSVC AND (TEST_architecture_arch STREQUAL "i386")
+ LINK_OPTIONS
+ "/BASE:0x61000000"
+)
+qt_add_docs(Xml
+ doc/qtxml.qdocconf
+)
+
diff --git a/src/xml/configure.cmake b/src/xml/configure.cmake
new file mode 100644
index 0000000000..25a7de5aa2
--- /dev/null
+++ b/src/xml/configure.cmake
@@ -0,0 +1,22 @@
+
+
+#### Inputs
+
+
+
+#### Libraries
+
+
+
+#### Tests
+
+
+
+#### Features
+
+qt_feature("dom" PUBLIC
+ SECTION "File I/O"
+ LABEL "DOM"
+ PURPOSE "Supports the Document Object Model."
+)
+qt_feature_definition("dom" "QT_NO_DOM" NEGATE VALUE "1")
diff --git a/src/xml/dom/qdom.cpp b/src/xml/dom/qdom.cpp
index 29d31a20d5..022de70090 100644
--- a/src/xml/dom/qdom.cpp
+++ b/src/xml/dom/qdom.cpp
@@ -2552,7 +2552,7 @@ QDomNamedNodeMapPrivate* QDomNamedNodeMapPrivate::clone(QDomNodePrivate* p)
m->readonly = readonly;
m->appendToParent = appendToParent;
- QHash<QString, QDomNodePrivate*>::const_iterator it = map.constBegin();
+ auto it = map.constBegin();
for (; it != map.constEnd(); ++it) {
QDomNodePrivate *new_node = (*it)->cloneNode();
new_node->setParent(p);
@@ -2568,7 +2568,7 @@ void QDomNamedNodeMapPrivate::clearMap()
{
// Dereference all of our children if we took references
if (!appendToParent) {
- QHash<QString, QDomNodePrivate *>::const_iterator it = map.constBegin();
+ auto it = map.constBegin();
for (; it != map.constEnd(); ++it)
if (!(*it)->ref.deref())
delete *it;
@@ -2584,7 +2584,7 @@ QDomNodePrivate* QDomNamedNodeMapPrivate::namedItem(const QString& name) const
QDomNodePrivate* QDomNamedNodeMapPrivate::namedItemNS(const QString& nsURI, const QString& localName) const
{
- QHash<QString, QDomNodePrivate *>::const_iterator it = map.constBegin();
+ auto it = map.constBegin();
QDomNodePrivate *n;
for (; it != map.constEnd(); ++it) {
n = *it;
@@ -3100,11 +3100,11 @@ void QDomDocumentTypePrivate::save(QTextStream& s, int, int indent) const
if (entities->length()>0 || notations->length()>0) {
s << " [" << Qt::endl;
- QHash<QString, QDomNodePrivate *>::const_iterator it2 = notations->map.constBegin();
+ auto it2 = notations->map.constBegin();
for (; it2 != notations->map.constEnd(); ++it2)
(*it2)->save(s, 0, indent);
- QHash<QString, QDomNodePrivate *>::const_iterator it = entities->map.constBegin();
+ auto it = entities->map.constBegin();
for (; it != entities->map.constEnd(); ++it)
(*it)->save(s, 0, indent);
@@ -4090,7 +4090,7 @@ void QDomElementPrivate::save(QTextStream& s, int depth, int indent) const
/* Write out attributes. */
if (!m_attr->map.isEmpty()) {
QDuplicateTracker<QString> outputtedPrefixes;
- QHash<QString, QDomNodePrivate *>::const_iterator it = m_attr->map.constBegin();
+ auto it = m_attr->map.constBegin();
for (; it != m_attr->map.constEnd(); ++it) {
s << ' ';
if (it.value()->namespaceURI.isNull()) {
@@ -4478,7 +4478,7 @@ bool QDomElement::hasAttribute(const QString& name) const
\sa setAttributeNS(), attributeNodeNS(), setAttributeNodeNS(), attribute()
*/
-QString QDomElement::attributeNS(const QString nsURI, const QString& localName, const QString& defValue) const
+QString QDomElement::attributeNS(const QString& nsURI, const QString& localName, const QString& defValue) const
{
if (!impl)
return defValue;
@@ -4497,7 +4497,7 @@ QString QDomElement::attributeNS(const QString nsURI, const QString& localName,
\sa attributeNS(), setAttributeNodeNS(), setAttribute()
*/
-void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, const QString& value)
+void QDomElement::setAttributeNS(const QString& nsURI, const QString& qName, const QString& value)
{
if (!impl)
return;
@@ -4505,13 +4505,13 @@ void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, cons
}
/*!
- \fn void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, int value)
+ \fn void QDomElement::setAttributeNS(const QString& nsURI, const QString& qName, int value)
\overload
*/
/*!
- \fn void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, uint value)
+ \fn void QDomElement::setAttributeNS(const QString& nsURI, const QString& qName, uint value)
\overload
*/
@@ -4519,7 +4519,7 @@ void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, cons
/*!
\overload
*/
-void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, qlonglong value)
+void QDomElement::setAttributeNS(const QString& nsURI, const QString& qName, qlonglong value)
{
if (!impl)
return;
@@ -4531,7 +4531,7 @@ void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, qlon
/*!
\overload
*/
-void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, qulonglong value)
+void QDomElement::setAttributeNS(const QString& nsURI, const QString& qName, qulonglong value)
{
if (!impl)
return;
@@ -4543,7 +4543,7 @@ void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, qulo
/*!
\overload
*/
-void QDomElement::setAttributeNS(const QString nsURI, const QString& qName, double value)
+void QDomElement::setAttributeNS(const QString& nsURI, const QString& qName, double value)
{
if (!impl)
return;
diff --git a/src/xml/dom/qdom.h b/src/xml/dom/qdom.h
index d50c5e8394..9f34290121 100644
--- a/src/xml/dom/qdom.h
+++ b/src/xml/dom/qdom.h
@@ -508,15 +508,15 @@ public:
QDomNodeList elementsByTagName(const QString& tagname) const;
bool hasAttribute(const QString& name) const;
- QString attributeNS(const QString nsURI, const QString& localName, const QString& defValue = QString()) const;
- void setAttributeNS(const QString nsURI, const QString& qName, const QString& value);
- inline void setAttributeNS(const QString nsURI, const QString& qName, int value)
+ QString attributeNS(const QString& nsURI, const QString& localName, const QString& defValue = QString()) const;
+ void setAttributeNS(const QString& nsURI, const QString& qName, const QString& value);
+ inline void setAttributeNS(const QString& nsURI, const QString& qName, int value)
{ setAttributeNS(nsURI, qName, qlonglong(value)); }
- inline void setAttributeNS(const QString nsURI, const QString& qName, uint value)
+ inline void setAttributeNS(const QString& nsURI, const QString& qName, uint value)
{ setAttributeNS(nsURI, qName, qulonglong(value)); }
- void setAttributeNS(const QString nsURI, const QString& qName, qlonglong value);
- void setAttributeNS(const QString nsURI, const QString& qName, qulonglong value);
- void setAttributeNS(const QString nsURI, const QString& qName, double value);
+ void setAttributeNS(const QString& nsURI, const QString& qName, qlonglong value);
+ void setAttributeNS(const QString& nsURI, const QString& qName, qulonglong value);
+ void setAttributeNS(const QString& nsURI, const QString& qName, double value);
void removeAttributeNS(const QString& nsURI, const QString& localName);
QDomAttr attributeNodeNS(const QString& nsURI, const QString& localName);
QDomAttr setAttributeNodeNS(const QDomAttr& newAttr);